ZGlmZiAtLWdpdCBhLy5hc2YueWFtbCBiLy5hc2YueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzAxZWVlCi0tLSAvZGV2L251bGwKKysrIGIvLmFzZi55YW1sCkBAIC0wLDAgKzEsOCBAQAorZ2l0aHViOgorICBlbmFibGVkX21lcmdlX2J1dHRvbnM6CisgICAgc3F1YXNoOiAgZmFsc2UKKyAgICBtZXJnZTogICBmYWxzZQorICAgIHJlYmFzZTogIHRydWUKKworbm90aWZpY2F0aW9uczoKKyAgamlyYV9vcHRpb25zOiBsaW5rIHdvcmtsb2cKZGlmZiAtLWdpdCBhLy5idWlsZC9idWlsZC1naXQueG1sIGIvLmJ1aWxkL2J1aWxkLWdpdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNiNWNhNwotLS0gL2Rldi9udWxsCisrKyBiLy5idWlsZC9idWlsZC1naXQueG1sCkBAIC0wLDAgKzEsNTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IGJhc2VkaXI9Ii4iIG5hbWU9ImFwYWNoZS1jYXNzYW5kcmEtZ2l0LXRhc2tzIgorICAgICAgICAgeG1sbnM6aWY9ImFudDppZiI+CisgICAgPHRhcmdldCBuYW1lPSJnZXQtZ2l0LXNoYSI+CisgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9ImdpdCIgb3NmYW1pbHk9InVuaXgiIGRpcj0iJHtiYXNlZGlyfSIgbG9nRXJyb3I9ImZhbHNlIiBmYWlsb25lcnJvcj0iZmFsc2UiIGZhaWxpZmV4ZWN1dGlvbmZhaWxzPSJmYWxzZSIgcmVzdWx0cHJvcGVydHk9ImdpdC5pcy1hdmFpbGFibGUuZXhpdC1jb2RlIj4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9InJldi1wYXJzZSIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1pcy1pbnNpZGUtd29yay10cmVlIi8+CisgICAgICAgICAgICA8cmVkaXJlY3RvciBvdXRwdXRwcm9wZXJ0eT0iZ2l0LmlzLWF2YWlsYWJsZS5vdXRwdXQiLz4KKyAgICAgICAgPC9leGVjPgorICAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJnaXQuaXMtYXZhaWxhYmxlIiBlbHNlPSJmYWxzZSI+CisgICAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7Z2l0LmlzLWF2YWlsYWJsZS5leGl0LWNvZGV9IiBhcmcyPSIwIi8+CisgICAgICAgIDwvY29uZGl0aW9uPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJnaXQuaXMtYXZhaWxhYmxlPSR7Z2l0LmlzLWF2YWlsYWJsZX0iLz4KKworICAgICAgICA8ZXhlYyBpZjp0cnVlPSIke2dpdC5pcy1hdmFpbGFibGV9IiBleGVjdXRhYmxlPSJnaXQiIG9zZmFtaWx5PSJ1bml4IiBkaXI9IiR7YmFzZWRpcn0iIGxvZ0Vycm9yPSJ0cnVlIiBmYWlsb25lcnJvcj0iZmFsc2UiIGZhaWxpZmV4ZWN1dGlvbmZhaWxzPSJmYWxzZSI+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSJkZXNjcmliZSIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1tYXRjaD0nJyIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1hbHdheXMiLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tYWJicmV2PTAiLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tZGlydHkiLz4KKyAgICAgICAgICAgIDxyZWRpcmVjdG9yIG91dHB1dHByb3BlcnR5PSJnaXQuc2hhIi8+CisgICAgICAgIDwvZXhlYz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImdpdC5zaGEiIHZhbHVlPSJVbmtub3duIi8+CisgICAgICAgIDxlY2hvIGxldmVsPSJpbmZvIj5naXQuc2hhPSR7Z2l0LnNoYX08L2VjaG8+CisKKyAgICAgICAgPGV4ZWMgaWY6dHJ1ZT0iJHtnaXQuaXMtYXZhaWxhYmxlfSIgZXhlY3V0YWJsZT0iZ2l0IiBvc2ZhbWlseT0idW5peCIgZGlyPSIke2Jhc2VkaXJ9IiBsb2dFcnJvcj0idHJ1ZSIgZmFpbG9uZXJyb3I9ImZhbHNlIiBmYWlsaWZleGVjdXRpb25mYWlscz0iZmFsc2UiPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iZGlmZiIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1zdGF0Ii8+CisgICAgICAgICAgICA8cmVkaXJlY3RvciBvdXRwdXRwcm9wZXJ0eT0iZ2l0LmRpZmZzdGF0Ii8+CisgICAgICAgIDwvZXhlYz4KKyAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iaXMtZGlydHkiPgorICAgICAgICAgICAgPGNvbnRhaW5zIHN0cmluZz0iJHtnaXQuc2hhfSIgc3Vic3RyaW5nPSItZGlydHkiLz4KKyAgICAgICAgPC9jb25kaXRpb24+CisgICAgICAgIDxlY2hvIGxldmVsPSJ3YXJuaW5nIiBpZjp0cnVlPSIke2lzLWRpcnR5fSI+UmVwb3NpdG9yeSBzdGF0ZSBpcyBkaXJ0eTwvZWNobz4KKyAgICAgICAgPGVjaG8gbGV2ZWw9Indhcm5pbmciIGlmOnRydWU9IiR7aXMtZGlydHl9Ij4ke2dpdC5kaWZmc3RhdH08L2VjaG8+CisgICAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8uYnVpbGQvYnVpbGQtcmF0LnhtbCBiLy5idWlsZC9idWlsZC1yYXQueG1sCmluZGV4IDQ5ZDIwY2MuLmYyNjFhMjMgMTAwNjQ0Ci0tLSBhLy5idWlsZC9idWlsZC1yYXQueG1sCisrKyBiLy5idWlsZC9idWlsZC1yYXQueG1sCkBAIC01MiwxMyArNTIsMTQgQEAKICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXNmaWxlPSIke2J1aWxkLmRpcn0vLnJhdGluY2x1ZGUiPgogICAgICAgICAgICAgICAgICA8IS0tIENvbmZpZyBmaWxlcyB3aXRoIG5vdCBtdWNoIGNyZWF0aXZpdHkgLS0+CiAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqLy5hc2YueWFtbCIvPgorICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8uZ2l0aHViL3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCIvPgogICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9pZGUvKiovKiIvPgogICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9tZXRyaWNzLXJlcG9ydGVyLWNvbmZpZy1zYW1wbGUueWFtbCIvPgogICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9jYXNzYW5kcmEueWFtbCIvPgogICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9jYXNzYW5kcmEtbXVybXVyLnlhbWwiLz4KICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovY2Fzc2FuZHJhLXNlZWRzLnlhbWwiLz4KICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovaGFycnktZ2VuZXJpYy55YW1sIi8+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlIE5BTUU9IioqL2RvYy9hbnRvcmEueW1sIi8+CisgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL2RvYy9hbnRvcmEueW1sIi8+CiAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL3Rlc3QvY29uZi9jYXNzYW5kcmEueWFtbCIvPgogICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi90ZXN0L2NvbmYvY2Fzc2FuZHJhLW9sZC55YW1sIi8+CiAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL3Rlc3QvY29uZi9jYXNzYW5kcmEtY29udmVydGVycy1zcGVjaWFsLWNhc2VzLW9sZC1uYW1lcy55YW1sIi8+CkBAIC04MywxMiArODQsMTIgQEAKICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovdG9vbHMvY3Fsc3RyZXNzLWluc2FuaXR5LWV4YW1wbGUueWFtbCIvPgogICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi90b29scy9jcWxzdHJlc3MtbHd0LWV4YW1wbGUueWFtbCIvPgogICAgICAgICAgICAgICAgICA8IS0tIERvY3VtZW50YXRpb24gZmlsZXMgLS0+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlIE5BTUU9IioqL2RvYy9tb2R1bGVzLyoqLyoiLz4KLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgTkFNRT0iKiovc3JjL2phdmEvKiovKi5tZCIvPgorICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9kb2MvbW9kdWxlcy8qKi8qIi8+CisgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL3NyYy9qYXZhLyoqLyoubWQiLz4KICAgICAgICAgICAgICAgICAgPCEtLSBOT1RJQ0UgZmlsZXMgLS0+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlIE5BTUU9IioqL05PVElDRS5tZCIvPgorICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9OT1RJQ0UubWQiLz4KICAgICAgICAgICAgICAgICAgPCEtLSBMSUNFTlNFIGZpbGVzIC0tPgotICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBOQU1FPSIqKi9MSUNFTlNFLm1kIi8+CisgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL0xJQ0VOU0UubWQiLz4KICAgICAgICAgICAgIDwvZmlsZXNldD4KICAgICAgICAgPC9yYXQ6cmVwb3J0PgogICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSJncmVwIiBvdXRwdXRwcm9wZXJ0eT0icmF0LmZhaWxlZC5maWxlcyIgZmFpbGlmZXhlY3V0aW9uZmFpbHM9ImZhbHNlIj4KZGlmZiAtLWdpdCBhLy5idWlsZC9idWlsZC1yZXNvbHZlci54bWwgYi8uYnVpbGQvYnVpbGQtcmVzb2x2ZXIueG1sCmluZGV4IGMzOGEyNzIuLmU3OGJiZjAgMTAwNjQ0Ci0tLSBhLy5idWlsZC9idWlsZC1yZXNvbHZlci54bWwKKysrIGIvLmJ1aWxkL2J1aWxkLXJlc29sdmVyLnhtbApAQCAtMTI2LDYgKzEyNiwxMiBAQAogICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CiAgICAgICAgICAgICA8cGF0aCByZWZpZD0iamZsZXguY2xhc3NwYXRoIiBjbGFzc3BhdGg9InJ1bnRpbWUiLz4KICAgICAgICAgPC9yZXNvbHZlPgorICAgICAgICA8cmVzb2x2ZT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLnB1cHB5Y3Jhd2wudG9vbHMiIGFydGlmYWN0SWQ9ImNoZWNrc3R5bGUiIHZlcnNpb249IiR7Y2hlY2tzdHlsZS52ZXJzaW9ufSIgLz4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImNoZWNrc3R5bGUuY2xhc3NwYXRoIiBjbGFzc3BhdGg9InJ1bnRpbWUiLz4KKyAgICAgICAgPC9yZXNvbHZlPgogCiAgICAgICAgIDxtYWNyb2RlZiBuYW1lPSJpbnN0YWxsIj4KICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9tRmlsZSIvPgpAQCAtMTc1LDcgKzE4MSw4IEBACiAgICAgICAgIDwvcmVzb2x2ZT4KICAgICAgICAgPHJlc29sdmU+CiAgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzIHBvbVJlZj0icG9tLWRlcHMiLz4KLSAgICAgICAgICAgIDxmaWxlcyBkaXI9IiR7dGVzdC5saWJ9L2phcnMiIGxheW91dD0ie2FydGlmYWN0SWR9LXt2ZXJzaW9ufS17Y2xhc3NpZmllcn0ue2V4dGVuc2lvbn0iIHNjb3Blcz0idGVzdCwhcHJvdmlkZSwhc3lzdGVtIi8+CisgICAgICAgICAgICA8IS0tIE5lZWRlZCB0byBpbmNsdWRlIGNvbXBpbGUgaGVyZSwgc28gYW50IF9idWlsZC10ZXN0IHdvdWxkIG5vdCBmYWlsIG9uIG1pc3NpbmcgamltZnMgZGVwZW5kZW5jeSAtLT4KKyAgICAgICAgICAgIDxmaWxlcyBkaXI9IiR7dGVzdC5saWJ9L2phcnMiIGxheW91dD0ie2FydGlmYWN0SWR9LXt2ZXJzaW9ufS17Y2xhc3NpZmllcn0ue2V4dGVuc2lvbn0iIHNjb3Blcz0iY29tcGlsZSx0ZXN0LCFwcm92aWRlLCFzeXN0ZW0iLz4KICAgICAgICAgPC9yZXNvbHZlPgogCiAKQEAgLTE4OCw3ICsxOTUsNyBAQAogICAgICAgICA8L3VuemlwPgogICAgIDwvdGFyZ2V0PgogCi0gICAgPHRhcmdldCBuYW1lPSJyZXNvbHZlci1kaXN0LWxpYiIgZGVwZW5kcz0icmVzb2x2ZXItcmV0cmlldmUtYnVpbGQsd3JpdGUtcG9tcyI+CisgICAgPHRhcmdldCBuYW1lPSJyZXNvbHZlci1kaXN0LWxpYiIgZGVwZW5kcz0icmVzb2x2ZXItcmV0cmlldmUtYnVpbGQiPgogICAgICAgICA8cmVzb2x2ZXBvbSBmaWxlPSIke2J1aWxkLmRpcn0vJHtmaW5hbC5uYW1lfS5wb20iIGlkPSJhbGwtcG9tIiAvPgogCiAgICAgICAgIDxyZXNvbHZlIGZhaWxPbk1pc3NpbmdBdHRhY2htZW50cz0idHJ1ZSI+CkBAIC0xOTgsMTAgKzIwNSwxMSBAQAogICAgICAgICA8bWtkaXIgZGlyPSIke2xvY2FsLnJlcG9zaXRvcnl9L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RlcHMvc2lnYXItYmluIi8+CiAgICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGlifS9zaWdhci1iaW4iLz4KIAotICAgICAgICA8IS0tIGZpbGVzLnB5dGhvbmhvc3RlZC5vcmcgLS0+CisgICAgICAgIDwhLS0gZmlsZXMucHl0aG9uaG9zdGVkLm9yZy9wYWNrYWdlcyAtLT4KICAgICAgICAgPGdldCBzcmM9IiR7YXJ0aWZhY3QucHl0aG9uLnB5cGl9LzU5L2EwL2NmNGNkOTk3ZTE3NTBmMGMyZDkxYzZlYTVhYmVhMjE4MjUxYzQzYzM1ODFiY2MyZjExOGIwMGJhZjVjZi9mdXR1cmVzLTIuMS42LXB5Mi5weTMtbm9uZS1hbnkud2hsIiBkZXN0PSIke2xvY2FsLnJlcG9zaXRvcnl9L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RlcHMvZnV0dXJlcy0yLjEuNi1weTIucHkzLW5vbmUtYW55LnppcCIgdXNldGltZXN0YW1wPSJ0cnVlIiBxdWlldD0idHJ1ZSIgc2tpcGV4aXN0aW5nPSJ0cnVlIi8+CiAgICAgICAgIDxnZXQgc3JjPSIke2FydGlmYWN0LnB5dGhvbi5weXBpfS83My9mYi8wMGE5NzZmNzI4ZDBkMWZlY2ZlODk4MjM4Y2UyM2Y1MDJhNzIxYzBhYzBlY2ZlZGI4MGUwZDg4YzY0ZTkvc2l4LTEuMTIuMC1weTIucHkzLW5vbmUtYW55LndobCIgZGVzdD0iJHtsb2NhbC5yZXBvc2l0b3J5fS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kZXBzL3NpeC0xLjEyLjAtcHkyLnB5My1ub25lLWFueS56aXAiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgcXVpZXQ9InRydWUiIHNraXBleGlzdGluZz0idHJ1ZSIvPgogICAgICAgICA8Z2V0IHNyYz0iJHthcnRpZmFjdC5weXRob24ucHlwaX0vMzcvYjIvZWYxMTI0NTQwZWUyYzBiNDE3YmU4ZDBmNzQ2Njc5NTdlNmFhMDg0YTNmMjY2MjFhYTY3ZTJlNzdmM2ZiL3B1cmVfc2FzbC0wLjYuMi1weTItbm9uZS1hbnkud2hsIiBkZXN0PSIke2xvY2FsLnJlcG9zaXRvcnl9L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RlcHMvcHVyZV9zYXNsLTAuNi4yLXB5Mi1ub25lLWFueS56aXAiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgcXVpZXQ9InRydWUiIHNraXBleGlzdGluZz0idHJ1ZSIvPgorICAgICAgICA8Z2V0IHNyYz0iJHthcnRpZmFjdC5weXRob24ucHlwaX0vNTkvN2MvZTM5YWNhNTk2YmFkYWYxYjc4ZThmNTQ3YzgwN2IwNGRhZTYwM2E0MzNkM2U3YTdlMDRkNjdmMmVmM2U1L3djd2lkdGgtMC4yLjUtcHkyLnB5My1ub25lLWFueS53aGwiIGRlc3Q9IiR7bG9jYWwucmVwb3NpdG9yeX0vb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGVwcy93Y3dpZHRoLTAuMi41LXB5Mi5weTMtbm9uZS1hbnkuemlwIiB1c2V0aW1lc3RhbXA9InRydWUiIHF1aWV0PSJ0cnVlIiBza2lwZXhpc3Rpbmc9InRydWUiLz4KIAogICAgICAgICA8IS0tIGFwYWNoZS9jYXNzYW5kcmEvbGliIC0tPgogICAgICAgICA8Z2V0IHNyYz0iJHtsaWIuZG93bmxvYWQuYmFzZS51cmx9L2xpYi9nZW9tZXQtMC4xLjAuemlwIiBkZXN0PSIke2xvY2FsLnJlcG9zaXRvcnl9L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RlcHMvZ2VvbWV0LTAuMS4wLnppcCIgdXNldGltZXN0YW1wPSJ0cnVlIiBxdWlldD0idHJ1ZSIgc2tpcGV4aXN0aW5nPSJ0cnVlIi8+CkBAIC0yMzMsNiArMjQxLDcgQEAKICAgICAgICAgICAgIDxmaWxlIGZpbGU9IiR7bG9jYWwucmVwb3NpdG9yeX0vb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGVwcy9zaXgtMS4xMi4wLXB5Mi5weTMtbm9uZS1hbnkuemlwIi8+CiAgICAgICAgICAgICA8ZmlsZSBmaWxlPSIke2xvY2FsLnJlcG9zaXRvcnl9L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RlcHMvZ2VvbWV0LTAuMS4wLnppcCIvPgogICAgICAgICAgICAgPGZpbGUgZmlsZT0iJHtsb2NhbC5yZXBvc2l0b3J5fS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kZXBzL3B1cmVfc2FzbC0wLjYuMi1weTItbm9uZS1hbnkuemlwIi8+CisgICAgICAgICAgICA8ZmlsZSBmaWxlPSIke2xvY2FsLnJlcG9zaXRvcnl9L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RlcHMvd2N3aWR0aC0wLjIuNS1weTIucHkzLW5vbmUtYW55LnppcCIvPgogICAgICAgICA8L2NvcHk+CiAgICAgICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLmxpYn0vc2lnYXItYmluLyIgcXVpZXQ9InRydWUiPgogICAgICAgICAgICAgPGZpbGUgZmlsZT0iJHtsb2NhbC5yZXBvc2l0b3J5fS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kZXBzL3NpZ2FyLWJpbi9saWJzaWdhci1hbWQ2NC1mcmVlYnNkLTYuc28iLz4KZGlmZiAtLWdpdCBhLy5idWlsZC9jYXNzYW5kcmEtYnVpbGQtZGVwcy10ZW1wbGF0ZS54bWwgYi8uYnVpbGQvY2Fzc2FuZHJhLWJ1aWxkLWRlcHMtdGVtcGxhdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZjJmOGMKLS0tIC9kZXYvbnVsbAorKysgYi8uYnVpbGQvY2Fzc2FuZHJhLWJ1aWxkLWRlcHMtdGVtcGxhdGUueG1sCkBAIC0wLDAgKzEsMTI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIiB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxwYXJlbnQ+CisgICAgPGFydGlmYWN0SWQ+Y2Fzc2FuZHJhLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNhc3NhbmRyYTwvZ3JvdXBJZD4KKyAgICA8dmVyc2lvbj5AdmVyc2lvbkA8L3ZlcnNpb24+CisgICAgPHJlbGF0aXZlUGF0aD5AZmluYWwubmFtZUAtcGFyZW50LnBvbTwvcmVsYXRpdmVQYXRoPgorICA8L3BhcmVudD4KKyAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jYXNzYW5kcmE8L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPmNhc3NhbmRyYS1idWlsZC1kZXBzPC9hcnRpZmFjdElkPgorICA8dmVyc2lvbj5AdmVyc2lvbkA8L3ZlcnNpb24+CisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtaW88L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWlvPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5tb2NraXRvPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bW9ja2l0by1jb3JlPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5tb2NraXRvPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bW9ja2l0by1pbmxpbmU8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLm93Mi5hc208L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5hc208L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLm93Mi5hc208L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5hc20tdHJlZTwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcub3cyLmFzbTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmFzbS1jb21tb25zPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5vdzIuYXNtPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+YXNtLXV0aWw8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5qaW1mczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmppbWZzPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5xdWlja3RoZW9yaWVzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+cXVpY2t0aGVvcmllczwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcucmVmbGVjdGlvbnM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5yZWZsZWN0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmNvZGUuamF2YS1hbGxvY2F0aW9uLWluc3RydW1lbnRlcjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmphdmEtYWxsb2NhdGlvbi1pbnN0cnVtZW50ZXI8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jYXNzYW5kcmE8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5kdGVzdC1hcGk8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLm9wZW5qZGsuam1oPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+am1oLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLm9wZW5qZGsuam1oPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+am1oLWdlbmVyYXRvci1hbm5wcm9jZXNzPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm5ldC5qdS1uLmNvbXBpbGUtY29tbWFuZC1hbm5vdGF0aW9uczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbXBpbGUtY29tbWFuZC1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmFudC1qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNhc3NhbmRyYTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmhhcnJ5LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmp1bml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anVuaXQtYm9tPC9hcnRpZmFjdElkPgorICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hd2FpdGlsaXR5PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+YXdhaXRpbGl0eTwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuaGFtY3Jlc3Q8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdDwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuamFjb2NvPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+b3JnLmphY29jby5hZ2VudDwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuamFjb2NvPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+b3JnLmphY29jby5hbnQ8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFmb3JtYXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWRhdGFmb3JtYXQteWFtbDwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvLmJ1aWxkL2Nhc3NhbmRyYS1kZXBzLXRlbXBsYXRlLnhtbCBiLy5idWlsZC9jYXNzYW5kcmEtZGVwcy10ZW1wbGF0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkwN2JmZgotLS0gL2Rldi9udWxsCisrKyBiLy5idWlsZC9jYXNzYW5kcmEtZGVwcy10ZW1wbGF0ZS54bWwKQEAgLTAsMCArMSwzODAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgPHBhcmVudD4KKyAgICA8YXJ0aWZhY3RJZD5jYXNzYW5kcmEtcGFyZW50PC9hcnRpZmFjdElkPgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuY2Fzc2FuZHJhPC9ncm91cElkPgorICAgIDx2ZXJzaW9uPkB2ZXJzaW9uQDwvdmVyc2lvbj4KKyAgICA8cmVsYXRpdmVQYXRoPkBmaW5hbC5uYW1lQC1wYXJlbnQucG9tPC9yZWxhdGl2ZVBhdGg+CisgIDwvcGFyZW50PgorICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNhc3NhbmRyYTwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+Y2Fzc2FuZHJhLWFsbDwvYXJ0aWZhY3RJZD4KKyAgPHZlcnNpb24+QHZlcnNpb25APC92ZXJzaW9uPgorICA8bmFtZT5BcGFjaGUgQ2Fzc2FuZHJhPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+VGhlIEFwYWNoZSBDYXNzYW5kcmEgUHJvamVjdCBkZXZlbG9wcyBhIGhpZ2hseSBzY2FsYWJsZSBzZWNvbmQtZ2VuZXJhdGlvbiBkaXN0cmlidXRlZCBkYXRhYmFzZSwgYnJpbmdpbmcgdG9nZXRoZXIgRHluYW1vJ3MgZnVsbHkgZGlzdHJpYnV0ZWQgZGVzaWduIGFuZCBCaWd0YWJsZSdzIENvbHVtbkZhbWlseS1iYXNlZCBkYXRhIG1vZGVsLjwvZGVzY3JpcHRpb24+CisgIDx1cmw+aHR0cHM6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZzwvdXJsPgorICA8aW5jZXB0aW9uWWVhcj4yMDA5PC9pbmNlcHRpb25ZZWFyPgorICA8bGljZW5zZXM+CisgICAgPGxpY2Vuc2U+CisgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgPHVybD5odHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgIDwvbGljZW5zZT4KKyAgPC9saWNlbnNlcz4KKyAgPHNjbT4KKyAgICA8Y29ubmVjdGlvbj5zY206aHR0cHM6Ly9naXRib3guYXBhY2hlLm9yZy9yZXBvcy9hc2YvY2Fzc2FuZHJhLmdpdDwvY29ubmVjdGlvbj4KKyAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206aHR0cHM6Ly9naXRib3guYXBhY2hlLm9yZy9yZXBvcy9hc2YvY2Fzc2FuZHJhLmdpdDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KKyAgICA8dXJsPmh0dHBzOi8vZ2l0Ym94LmFwYWNoZS5vcmcvcmVwb3MvYXNmP3A9Y2Fzc2FuZHJhLmdpdDthPXRyZWU8L3VybD4KKyAgPC9zY20+CisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcueGVyaWFsLnNuYXBweTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnNuYXBweS1qYXZhPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5sejQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5sejQtamF2YTwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20ubmluZzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbXByZXNzLWx6ZjwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jbGk8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNsaTwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb21tb25zLWNvZGVjPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2RlYzwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxhbmczPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY29tbW9uczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbWF0aDM8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFudGxyPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+YW50bHI8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFudGxyPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+U1Q0PC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hbnRscjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmFudGxyLXJ1bnRpbWU8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c2xmNGotYXBpPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmxvZzRqLW92ZXItc2xmNGo8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amNsLW92ZXItc2xmNGo8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmU8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmU8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWRhdGFiaW5kPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YXR5cGU8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWRhdGF0eXBlLWpzcjMxMDwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uYm91bmRhcnk8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5oaWdoLXNjYWxlLWxpYjwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcueWFtbDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnNuYWtleWFtbDwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcubWluZHJvdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmpiY3J5cHQ8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+aW8uYWlybGlmdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmFpcmxpbmU8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+aW8uZHJvcHdpemFyZC5tZXRyaWNzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bWV0cmljcy1jb3JlPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmlvLmRyb3B3aXphcmQubWV0cmljczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm1ldHJpY3MtanZtPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmlvLmRyb3B3aXphcmQubWV0cmljczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm1ldHJpY3MtbG9nYmFjazwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uYWRkdGhpcy5tZXRyaWNzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+cmVwb3J0ZXItY29uZmlnMzwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uY2xlYXJzcHJpbmcuYW5hbHl0aWNzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c3RyZWFtPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNoLnFvcy5sb2diYWNrPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bG9nYmFjay1jb3JlPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNoLnFvcy5sb2diYWNrPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bG9nYmFjay1jbGFzc2ljPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5kYXRhc3RheC5jYXNzYW5kcmE8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jYXNzYW5kcmEtZHJpdmVyLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICA8Y2xhc3NpZmllcj5zaGFkZWQ8L2NsYXNzaWZpZXI+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+bmV0LmphdmEuZGV2LmpuYTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmpuYTwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLmpiZWxsaXM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qYW1tPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmlvLm5ldHR5PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bmV0dHktYm9tPC9hcnRpZmFjdElkPgorICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmlvLm5ldHR5PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bmV0dHktYWxsPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwhLS0gY2hyb25pY2xlIHF1ZXVlLCBhbmQgZml4ZWQgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgLS0+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5uZXQub3BlbmhmdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNocm9uaWNsZS1xdWV1ZTwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5uZXQub3BlbmhmdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNocm9uaWNsZS1jb3JlPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm5ldC5vcGVuaGZ0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y2hyb25pY2xlLWJ5dGVzPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm5ldC5vcGVuaGZ0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y2hyb25pY2xlLXdpcmU8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+bmV0Lm9wZW5oZnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jaHJvbmljbGUtdGhyZWFkczwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8IS0tIHRyYW5zaXRpdmUgdG8gY2hyb25pY2xlLWNvcmUgLS0+CisgICAgICA8Z3JvdXBJZD5uZXQub3BlbmhmdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnBvc2l4PC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDwhLS0gdHJhbnNpdGl2ZSB0byBwb3NpeCB0byBjaHJvbmljbGUtY29yZSAtLT4KKyAgICAgIDxncm91cElkPm5ldC5qYXZhLmRldi5qbmE8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qbmEtcGxhdGZvcm08L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPCEtLSB0cmFuc2l0aXZlIHRvIHBvc2l4IHRvIGNocm9uaWNsZS1jb3JlIC0tPgorICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5qbnI8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qbnItZmZpPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDwhLS0gdHJhbnNpdGl2ZSB0byBqbnItZmZpIHRvIHBvc2l4IHRvIGNocm9uaWNsZS1jb3JlIC0tPgorICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5qbnI8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qZmZpPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDwhLS0gdHJhbnNpdGl2ZSB0byBqbnItZmZpIHRvIHBvc2l4IHRvIGNocm9uaWNsZS1jb3JlIC0tPgorICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5qbnI8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qZmZpPC9hcnRpZmFjdElkPgorICAgICAgPGNsYXNzaWZpZXI+bmF0aXZlPC9jbGFzc2lmaWVyPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDwhLS0gdHJhbnNpdGl2ZSB0byBqbnItZmZpIHRvIGNocm9uaWNsZS1jb3JlIC0tPgorICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5qbnI8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qbnItY29uc3RhbnRzPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDwhLS0gdHJhbnNpdGl2ZSB0byBjaHJvbmljbGUtdGhyZWFkcyAtLT4KKyAgICAgIDxncm91cElkPm5ldC5vcGVuaGZ0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+YWZmaW5pdHk8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDwhLS0gZW5kIG9mIGNocm9uaWNsZS1xdWV1ZSAtLT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmZ1c2Vzb3VyY2U8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zaWdhcjwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlcjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVjajwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuY2FmZmluaXRhcy5vaGM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5vaGMtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuY2FmZmluaXRhcy5vaGM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5vaGMtY29yZS1qODwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLmJlbi1tYW5lcy5jYWZmZWluZTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNhZmZlaW5lPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5qY3Rvb2xzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amN0b29scy1jb3JlPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5vdzIuYXNtPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+YXNtPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5jYXJyb3RzZWFyY2g8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5ocHBjPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5ncmlka2l0Lmp2bXRvb2w8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zamstY2xpPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MC4xNDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuZ3JpZGtpdC5qdm10b29sPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c2prLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmdyaWRraXQuanZtdG9vbDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnNqay1zdGFja3RyYWNlPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5ncmlka2l0Lmp2bXRvb2w8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5teGR1bXA8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmdyaWRraXQubGFiPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anZtLWF0dGFjaC1hcGk8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmJldXN0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amNvbW1hbmRlcjwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuZ3JpZGtpdC5qdm10b29sPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c2prLWpzb248L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5sdWJlbjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnpzdGQtam5pPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5wc2phdmE8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5wc2phdmE8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+aW8ubmV0dHk8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5uZXR0eS10Y25hdGl2ZS1ib3Jpbmdzc2wtc3RhdGljPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmphdmF4LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmphdmF4LmluamVjdDwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmoyb2JqYzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmoyb2JqYy1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuaGRyaGlzdG9ncmFtPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+SGRySGlzdG9ncmFtPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmRlLmpmbGV4PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amZsZXg8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5yaG9sZGVyPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c25vd2JhbGwtc3RlbW1lcjwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlY29kZS5jb25jdXJyZW50LXRyZWVzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29uY3VycmVudC10cmVlczwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmNvZGUuZmluZGJ1Z3M8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qc3IzMDU8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+bmV0Lmp1LW4uY29tcGlsZS1jb21tYW5kLWFubm90YXRpb25zPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tcGlsZS1jb21tYW5kLWFubm90YXRpb25zPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hc3NlcnRqPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+YXNzZXJ0ai1jb3JlPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5qYm9zcy5ieXRlbWFuPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Ynl0ZW1hbi1pbnN0YWxsPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5qYm9zcy5ieXRlbWFuPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Ynl0ZW1hbjwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuamJvc3MuYnl0ZW1hbjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmJ5dGVtYW4tc3VibWl0PC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5qYm9zcy5ieXRlbWFuPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Ynl0ZW1hbi1ibXVuaXQ8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5zZWFuY2ZvbGV5PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+aXBhZGRyZXNzPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNoLm9iZXJtdWhsbmVyPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+YmlnLW1hdGg8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFncm9uYTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmFncm9uYTwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvLmJ1aWxkL3BhcmVudC1wb20tdGVtcGxhdGUueG1sIGIvLmJ1aWxkL3BhcmVudC1wb20tdGVtcGxhdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YjYzYmYKLS0tIC9kZXYvbnVsbAorKysgYi8uYnVpbGQvcGFyZW50LXBvbS10ZW1wbGF0ZS54bWwKQEAgLTAsMCArMSwxMDUyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIiB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxwYXJlbnQ+CisgICAgPGFydGlmYWN0SWQ+YXBhY2hlPC9hcnRpZmFjdElkPgorICAgIDxncm91cElkPm9yZy5hcGFjaGU8L2dyb3VwSWQ+CisgICAgPHZlcnNpb24+MjI8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNhc3NhbmRyYTwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+Y2Fzc2FuZHJhLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgPHZlcnNpb24+QHZlcnNpb25APC92ZXJzaW9uPgorICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICA8bmFtZT5BcGFjaGUgQ2Fzc2FuZHJhPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+VGhlIEFwYWNoZSBDYXNzYW5kcmEgUHJvamVjdCBkZXZlbG9wcyBhIGhpZ2hseSBzY2FsYWJsZSBzZWNvbmQtZ2VuZXJhdGlvbiBkaXN0cmlidXRlZCBkYXRhYmFzZSwgYnJpbmdpbmcgdG9nZXRoZXIgRHluYW1vJ3MgZnVsbHkgZGlzdHJpYnV0ZWQgZGVzaWduIGFuZCBCaWd0YWJsZSdzIENvbHVtbkZhbWlseS1iYXNlZCBkYXRhIG1vZGVsLjwvZGVzY3JpcHRpb24+CisgIDx1cmw+aHR0cHM6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZzwvdXJsPgorICA8aW5jZXB0aW9uWWVhcj4yMDA5PC9pbmNlcHRpb25ZZWFyPgorICA8bGljZW5zZXM+CisgICAgPGxpY2Vuc2U+CisgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgPHVybD5odHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgIDwvbGljZW5zZT4KKyAgPC9saWNlbnNlcz4KKyAgPHByb3BlcnRpZXM+CisgICAgPGJ5dGVidWRkeS52ZXJzaW9uPjEuMTIuMTM8L2J5dGVidWRkeS52ZXJzaW9uPgorICAgIDxieXRlbWFuLnZlcnNpb24+NC4wLjIwPC9ieXRlbWFuLnZlcnNpb24+CisgICAgPG9oYy52ZXJzaW9uPjAuNS4xPC9vaGMudmVyc2lvbj4KKworICAgIDwhLS0gVGhlc2UgYXJlIHJlZmVyZW5jZWQgaW4gYnVpbGQueG1sLCBzbyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgZnJvbSB0aGVyZSAtLT4KKyAgICA8YXNtLnZlcnNpb24+QGFzbS52ZXJzaW9uQDwvYXNtLnZlcnNpb24+CisgICAgPGphbW0udmVyc2lvbj5AamFtbS52ZXJzaW9uQDwvamFtbS52ZXJzaW9uPgorICAgIDxhbGxvY2F0aW9uLWluc3RydW1lbnRlci52ZXJzaW9uPkBhbGxvY2F0aW9uLWluc3RydW1lbnRlci52ZXJzaW9uQDwvYWxsb2NhdGlvbi1pbnN0cnVtZW50ZXIudmVyc2lvbj4KKyAgICA8ZWNqLnZlcnNpb24+QGVjai52ZXJzaW9uQDwvZWNqLnZlcnNpb24+CisgICAgPGphY29jby52ZXJzaW9uPkBqYWNvY28udmVyc2lvbkA8L2phY29jby52ZXJzaW9uPgorICAgIDxqZmxleC52ZXJzaW9uPkBqZmxleC52ZXJzaW9uQDwvamZsZXgudmVyc2lvbj4KKyAgPC9wcm9wZXJ0aWVzPgorICA8ZGV2ZWxvcGVycz4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmFkZWxhcGVuYTwvaWQ+CisgICAgICA8bmFtZT5BbmRyZXMgZGUgbGEgUGXDsWE8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5hbGFrc2htYW48L2lkPgorICAgICAgPG5hbWU+QXZpbmFzaCBMYWtzaG1hbjwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmFsZWtzZXk8L2lkPgorICAgICAgPG5hbWU+QWxla3NleSBZZXNjaGVua288L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5hbW9ydG9uPC9pZD4KKyAgICAgIDxuYW1lPkFhcm9uIE1vcnRvbjwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmF3ZWlzYmVyZzwvaWQ+CisgICAgICA8bmFtZT5BcmllbCBXZWlzYmVyZzwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmJkZWdnbGVzdG9uPC9pZD4KKyAgICAgIDxuYW1lPkJsYWtlIEVnZ2xlc3RvbjwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmJlbmVkaWN0PC9pZD4KKyAgICAgIDxuYW1lPkJlbmVkaWN0IEVsbGlvdHQgU21pdGg8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5iZW5qYW1pbjwvaWQ+CisgICAgICA8bmFtZT5CZW5qYW1pbiBMZXJlcjwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmJsYW1ib3Y8L2lkPgorICAgICAgPG5hbWU+QnJhbmltaXIgTGFtYm92PC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+YnJhbmRvbndpbGxpYW1zPC9pZD4KKyAgICAgIDxuYW1lPkJyYW5kb24gV2lsbGlhbXM8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5jYXJsPC9pZD4KKyAgICAgIDxuYW1lPkNhcmwgWWVrc2lnaWFuPC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+ZGJyb3NpdXM8L2lkPgorICAgICAgPG5hbWU+RGF2aWQgQnJvc2l1c2Q8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5kaWthbmc8L2lkPgorICAgICAgPG5hbWU+RGlrYW5nIEd1PC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+ZWV2YW5zPC9pZD4KKyAgICAgIDxuYW1lPkVyaWMgRXZhbnM8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5lZGltaXRyb3ZhPC9pZD4KKyAgICAgIDxuYW1lPkVrYXRlcmluYSBEaW1pdHJvdmE8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5nZHVzYmFiZWs8L2lkPgorICAgICAgPG5hbWU+R2FyeSBEdXNiYWJlazwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmdvZmZpbmV0PC9pZD4KKyAgICAgIDxuYW1lPkNocmlzIEdvZmZpbmV0PC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+aWZlc2RqZWVuPC9pZD4KKyAgICAgIDxuYW1lPkFsZXggUGV0cm92PC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+amFha2tvPC9pZD4KKyAgICAgIDxuYW1lPkxhaW5lIEphYWtrbyBPbGF2aTwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmpha2U8L2lkPgorICAgICAgPG5hbWU+VCBKYWtlIEx1Y2lhbmk8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5qYXNvbmJyb3duPC9pZD4KKyAgICAgIDxuYW1lPkphc29uIEJyb3duPC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+amJlbGxpczwvaWQ+CisgICAgICA8bmFtZT5Kb25hdGhhbiBFbGxpczwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmpmYXJyZWxsPC9pZD4KKyAgICAgIDxuYW1lPkpha2UgRmFycmVsbDwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmpqaXJzYTwvaWQ+CisgICAgICA8bmFtZT5KZWZmIEppcnNhPC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+amtuaTwvaWQ+CisgICAgICA8bmFtZT5Kb2VsIEtuaWdodG9uPC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+am1ja2VuemllPC9pZD4KKyAgICAgIDxuYW1lPkpvc2ggTWNLZW56aWU8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5qb2hhbjwvaWQ+CisgICAgICA8bmFtZT5Kb2hhbiBPc2thcnNzb248L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5qdW5yYW88L2lkPgorICAgICAgPG5hbWU+SnVuIFJhbzwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmp6aHVhbmc8L2lkPgorICAgICAgPG5hbWU+SmF5IFpodWFuZzwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmtvaGxpc2Fua2FscDwvaWQ+CisgICAgICA8bmFtZT5TYW5rYWxwIEtvaGxpPC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+bWFyY3VzZTwvaWQ+CisgICAgICA8bmFtZT5NYXJjdXMgRXJpa3Nzb248L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5tY2s8L2lkPgorICAgICAgPG5hbWU+TWljaGFlbCBTZW1iIFdldmVyPC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+bWlzaGFpbDwvaWQ+CisgICAgICA8bmFtZT5NaWtoYWlsIFN0ZXB1cmE8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5tc2h1bGVyPC9pZD4KKyAgICAgIDxuYW1lPk1pY2hhZWwgU2h1bGVyPC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+cGF1bG88L2lkPgorICAgICAgPG5hbWU+UGF1bG8gTW90dGE8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5wbWFsaWs8L2lkPgorICAgICAgPG5hbWU+UHJhc2hhbnQgTWFsaWs8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5yc3R1cHA8L2lkPgorICAgICAgPG5hbWU+Um9iZXJ0IFN0dXBwPC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+c2NvZGU8L2lkPgorICAgICAgPG5hbWU+UGV0ZXIgU2NodWxsZXI8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5iZW9iYWw8L2lkPgorICAgICAgPG5hbWU+U2FtIFR1bm5pY2xpZmZlPC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+c2xlYnJlc25lPC9pZD4KKyAgICAgIDxuYW1lPlN5bHZhaW4gTGVicmVzbmU8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5zdGVmYW5pYTwvaWQ+CisgICAgICA8bmFtZT5TdGVmYW5pYSBBbGJvcmdoZXR0aTwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPnR5bGVyaG9iYnM8L2lkPgorICAgICAgPG5hbWU+VHlsZXIgSG9iYnM8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD52aWpheTwvaWQ+CisgICAgICA8bmFtZT5WaWpheSBQYXJ0aGFzYXJhdGh5PC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+eGVkaW48L2lkPgorICAgICAgPG5hbWU+UGF2ZWwgWWFza2V2aWNoPC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+eXVraW08L2lkPgorICAgICAgPG5hbWU+WXVraSBNb3Jpc2hpdGE8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD56em5hdGU8L2lkPgorICAgICAgPG5hbWU+TmF0ZSBNY0NhbGw8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgIDwvZGV2ZWxvcGVycz4KKyAgPHNjbT4KKyAgICA8Y29ubmVjdGlvbj5zY206aHR0cHM6Ly9naXRib3guYXBhY2hlLm9yZy9yZXBvcy9hc2YvY2Fzc2FuZHJhLmdpdDwvY29ubmVjdGlvbj4KKyAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206aHR0cHM6Ly9naXRib3guYXBhY2hlLm9yZy9yZXBvcy9hc2YvY2Fzc2FuZHJhLmdpdDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KKyAgICA8dXJsPmh0dHBzOi8vZ2l0Ym94LmFwYWNoZS5vcmcvcmVwb3MvYXNmP3A9Y2Fzc2FuZHJhLmdpdDthPXRyZWU8L3VybD4KKyAgPC9zY20+CisgIDxkZXBlbmRlbmN5TWFuYWdlbWVudD4KKyAgICA8IS0tCisgICAgRGVwZW5kZW5jeSBtZXRhZGF0YSBpcyBzcGVjaWZpZWQgaGVyZSAodmVyc2lvbiwgc2NvcGUsIGV4Y2x1c2lvbnMsIGV0Yy4pLCB0aGVuIHJlZmVyZW5jZWQgaW4gY2hpbGQgUE9NcyBieSBncm91cElkIGFuZAorICAgIGFydGlmYWN0SWQuCisgICAgLS0+CisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcueGVyaWFsLnNuYXBweTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+c25hcHB5LWphdmE8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMS44LjQ8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmx6NDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bHo0LWphdmE8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuOC4wPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5uaW5nPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5jb21wcmVzcy1semY8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjAuOC40PC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5naXRodWIubHViZW48L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnpzdGQtam5pPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjUuNS0xPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3VhdmE8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmd1YXZhPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yNy4wLWpyZTwvdmVyc2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcjMwNTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuY29kZS5maW5kYnVnczwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW5pbWFsLXNuaWZmZXItYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bGlzdGVuYWJsZWZ1dHVyZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3VhdmE8L2dyb3VwSWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmZhaWx1cmVhY2Nlc3M8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVja2VyLXF1YWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY2hlY2tlcmZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXJyb3JfcHJvbmVfYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmVycm9ycHJvbmU8L2dyb3VwSWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmppbWZzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qaW1mczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4xPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5oZHJoaXN0b2dyYW08L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPkhkckhpc3RvZ3JhbTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4xLjk8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jbGk8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY2xpPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjE8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jb2RlYzwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2RlYzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS45PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbW1vbnMtaW88L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaW88L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMTEuMDwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbGFuZzM8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjMuMTE8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jb21tb25zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLW1hdGgzPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4zLjI8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFudGxyPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5hbnRscjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+My41LjI8L3ZlcnNpb24+CisgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zdHJpbmd0ZW1wbGF0ZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hbnRscjwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5hbnRscjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+U1Q0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj40LjAuODwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYW50bHI8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmFudGxyLXJ1bnRpbWU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjMuNS4yPC92ZXJzaW9uPgorICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3RyaW5ndGVtcGxhdGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYW50bHI8L2dyb3VwSWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS43LjI1PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bG9nNGotb3Zlci1zbGY0ajwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS43LjI1PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amNsLW92ZXItc2xmNGo8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuNy4yNTwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5jaC5xb3MubG9nYmFjazwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bG9nYmFjay1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjIuOTwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5jaC5xb3MubG9nYmFjazwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bG9nYmFjay1jbGFzc2ljPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjIuOTwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjEzLjI8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmU8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tZGF0YWJpbmQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMTMuMi4yPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWFubm90YXRpb25zPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjEzLjI8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGF0eXBlPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWRhdGF0eXBlLWpzcjMxMDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4xMy4yPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhZm9ybWF0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWRhdGFmb3JtYXQteWFtbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4xMy4yPC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbmFrZXlhbWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcueWFtbDwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5ib3VuZGFyeTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+aGlnaC1zY2FsZS1saWI8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMC42PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5naXRodWIuamJlbGxpczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amFtbTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+JHtqYW1tLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy55YW1sPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5zbmFrZXlhbWw8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMjY8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj40LjEyPC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLm1vY2tpdG88L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1vY2tpdG8tY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+NC43LjA8L3ZlcnNpb24+CisgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcubW9ja2l0bzwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bW9ja2l0by1pbmxpbmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjQuNy4wPC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLnF1aWNrdGhlb3JpZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnF1aWNrdGhlb3JpZXM8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjAuMjY8L3ZlcnNpb24+CisgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmNvZGUuamF2YS1hbGxvY2F0aW9uLWluc3RydW1lbnRlcjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amF2YS1hbGxvY2F0aW9uLWluc3RydW1lbnRlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+JHthbGxvY2F0aW9uLWluc3RydW1lbnRlci52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jYXNzYW5kcmE8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmhhcnJ5LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjAuMC4xPC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLnJlZmxlY3Rpb25zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5yZWZsZWN0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MC4xMC4yPC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jYXNzYW5kcmE8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmR0ZXN0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MC4wLjE1PC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+bmV0LmphdmEuZGV2LmpuYTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+am5hPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj41LjEzLjA8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8IS0tIHRyYW5zaXRpdmUgdG8gcG9zaXggdG8gY2hyb25pY2xlLWNvcmUsIGRlY2xhcmVkIGV4cGxpY2l0IHRvIHVzZSBuZXdlciB2ZXJzaW9uIC0tPgorICAgICAgICA8Z3JvdXBJZD5uZXQuamF2YS5kZXYuam5hPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qbmEtcGxhdGZvcm08L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjUuMTMuMDwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8IS0tIHRyYW5zaXRpdmUgdG8gcG9zaXggdG8gY2hyb25pY2xlLWNvcmUsIGRlY2xhcmVkIGV4cGxpY2l0IHRvIHVzZSBuZXdlciB2ZXJzaW9uIC0tPgorICAgICAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLmpucjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+am5yLWZmaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yLjEzPC92ZXJzaW9uPgorICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm93Mi5hc208L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXNtLWFuYWx5c2lzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5vdzIuYXNtPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFzbS1jb21tb25zPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5vdzIuYXNtPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFzbS10cmVlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5vdzIuYXNtPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFzbS11dGlsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8IS0tIHRyYW5zaXRpdmUgdG8gam5yLWZmaSB0byBwb3NpeCB0byBjaHJvbmljbGUtY29yZSwgZGVjbGFyZWQgZXhwbGljaXQgdG8gdXNlIG5ld2VyIHZlcnNpb24gLS0+CisgICAgICAgIDxncm91cElkPmNvbS5naXRodWIuam5yPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qZmZpPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjMuMTE8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPCEtLSB0cmFuc2l0aXZlIHRvIGpuci1mZmkgdG8gcG9zaXggdG8gY2hyb25pY2xlLWNvcmUsIGRlY2xhcmVkIGV4cGxpY2l0IHRvIHVzZSBuZXdlciB2ZXJzaW9uIC0tPgorICAgICAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLmpucjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amZmaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNsYXNzaWZpZXI+bmF0aXZlPC9jbGFzc2lmaWVyPgorICAgICAgICA8dmVyc2lvbj4xLjMuMTE8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPCEtLSB0cmFuc2l0aXZlIHRvIHBvc2l4IHRvIGNocm9uaWNsZS1jb3JlLCBkZWNsYXJlZCBleHBsaWNpdCB0byB1c2UgbmV3ZXIgdmVyc2lvbiAtLT4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5qbnI8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmpuci1jb25zdGFudHM8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjAuMTAuNDwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5qYWNvY288L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm9yZy5qYWNvY28uYWdlbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPiR7amFjb2NvLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmphY29jbzwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmphY29jby5hbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPiR7amFjb2NvLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hc208L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcub3cyLmFzbTwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5qYm9zcy5ieXRlbWFuPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5ieXRlbWFuLWluc3RhbGw8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPiR7Ynl0ZW1hbi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuamJvc3MuYnl0ZW1hbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+Ynl0ZW1hbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+JHtieXRlbWFuLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5qYm9zcy5ieXRlbWFuPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5ieXRlbWFuLXN1Ym1pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+JHtieXRlbWFuLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5qYm9zcy5ieXRlbWFuPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5ieXRlbWFuLWJtdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+JHtieXRlbWFuLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm5ldC5ieXRlYnVkZHk8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmJ5dGUtYnVkZHk8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPiR7Ynl0ZWJ1ZGR5LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm5ldC5ieXRlYnVkZHk8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmJ5dGUtYnVkZHktYWdlbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPiR7Ynl0ZWJ1ZGR5LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5vcGVuamRrLmptaDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+am1oLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMjE8L3ZlcnNpb24+CisgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcub3Blbmpkay5qbWg8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmptaC1nZW5lcmF0b3ItYW5ucHJvY2VzczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4yMTwvdmVyc2lvbj4KKyAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5hbnQtanVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMTAuMTI8L3ZlcnNpb24+CisgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNhc3NhbmRyYTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+Y2Fzc2FuZHJhLWFsbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+NC4xLWFscGhhMi1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5pby5kcm9wd2l6YXJkLm1ldHJpY3M8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1ldHJpY3MtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+My4xLjU8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+aW8uZHJvcHdpemFyZC5tZXRyaWNzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tZXRyaWNzLWp2bTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+My4xLjU8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+aW8uZHJvcHdpemFyZC5tZXRyaWNzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tZXRyaWNzLWxvZ2JhY2s8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjMuMS41PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5hZGR0aGlzLm1ldHJpY3M8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnJlcG9ydGVyLWNvbmZpZzM8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjMuMC4zPC92ZXJzaW9uPgorICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGliZXJuYXRlLXZhbGlkYXRvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5oaWJlcm5hdGU8L2dyb3VwSWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcubWluZHJvdDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amJjcnlwdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MC40PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmlvLmFpcmxpZnQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmFpcmxpbmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjAuODwvdmVyc2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcjMwNTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuY29kZS5maW5kYnVnczwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmlvLm5ldHR5PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5uZXR0eS1ib208L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjQuMS41OC5GaW5hbDwvdmVyc2lvbj4KKyAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmlvLm5ldHR5PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5uZXR0eS1hbGw8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjQuMS41OC5GaW5hbDwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5pby5uZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bmV0dHktdGNuYXRpdmUtYm9yaW5nc3NsLXN0YXRpYzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4wLjM2LkZpbmFsPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICA8IS0tIGNocm9uaWNsZS1xdWV1ZSBkZXBzIC0tPgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm5ldC5vcGVuaGZ0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5jaHJvbmljbGUtcXVldWU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjUuMjMuMzc8L3ZlcnNpb24+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD50b29sczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW48L2dyb3VwSWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgPCEtLSBwdWxscyBpbiBhZmZpbml0eS0zLjIzZWExIHdoaWNoIHB1bGxzIGluIHRoaXJkLXBhcnR5LWJvbS0zLjIyLjQtU05BUFNIT1QgLS0+CisgICAgICAgICAgICA8Z3JvdXBJZD5uZXQub3BlbmhmdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmFmZmluaXR5PC9hcnRpZmFjdElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+bmV0Lm9wZW5oZnQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmNocm9uaWNsZS1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjIzLjM2PC92ZXJzaW9uPgorICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hyb25pY2xlLWFuYWx5dGljczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPm5ldC5vcGVuaGZ0PC9ncm91cElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5qZXRicmFpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5uZXQub3BlbmhmdDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+Y2hyb25pY2xlLWJ5dGVzPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjIzLjMzPC92ZXJzaW9uPgorICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuamV0YnJhaW5zPC9ncm91cElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+bmV0Lm9wZW5oZnQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmNocm9uaWNsZS13aXJlPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjIzLjM5PC92ZXJzaW9uPgorICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tcGlsZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5uZXQub3BlbmhmdDwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICA8IS0tIHB1bGxzIGluIGFmZmluaXR5LTMuMjNlYTEgd2hpY2ggcHVsbHMgaW4gdGhpcmQtcGFydHktYm9tLTMuMjIuNC1TTkFQU0hPVCAtLT4KKyAgICAgICAgICAgIDxncm91cElkPm5ldC5vcGVuaGZ0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YWZmaW5pdHk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5uZXQub3BlbmhmdDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+Y2hyb25pY2xlLXRocmVhZHM8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjMuMjU8L3ZlcnNpb24+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgIDwhLS0gcHVsbHMgaW4gYWZmaW5pdHktMy4yM2VhMSB3aGljaCBwdWxscyBpbiB0aGlyZC1wYXJ0eS1ib20tMy4yMi40LVNOQVBTSE9UIC0tPgorICAgICAgICAgICAgPGdyb3VwSWQ+bmV0Lm9wZW5oZnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hZmZpbml0eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDwhLS0gdHJhbnNpdGl2ZSB0byBjaHJvbmljbGUtcXVldWUsIGRlY2xhcmVkIGV4cGxpY2l0IHRvIHVzZSBuZXdlciB2ZXJzaW9uIC0tPgorICAgICAgICA8Z3JvdXBJZD5uZXQub3BlbmhmdDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+YWZmaW5pdHk8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjMuMjMuMzwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8IS0tIHRyYW5zaXRpdmUgdG8gY2hyb25pY2xlLXF1ZXVlLCBkZWNsYXJlZCBleHBsaWNpdCB0byB1c2UgbmV3ZXIgdmVyc2lvbiAtLT4KKyAgICAgICAgPGdyb3VwSWQ+bmV0Lm9wZW5oZnQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnBvc2l4PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI0ZWE0PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPCEtLSBlbmQgb2YgY2hyb25pY2xlLXF1ZXVlIC0tPgorCisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5jb2RlLmZpbmRidWdzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qc3IzMDU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMC4yPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5jbGVhcnNwcmluZy5hbmFseXRpY3M8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnN0cmVhbTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi41LjI8L3ZlcnNpb24+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5mYXN0dXRpbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPml0LnVuaW1pLmRzaTwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5kYXRhc3RheC5jYXNzYW5kcmE8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmNhc3NhbmRyYS1kcml2ZXItY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+My4xMS4wPC92ZXJzaW9uPgorICAgICAgICA8Y2xhc3NpZmllcj5zaGFkZWQ8L2NsYXNzaWZpZXI+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5uZXR0eS1idWZmZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5pby5uZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bmV0dHktY29kZWM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5pby5uZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bmV0dHktaGFuZGxlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPmlvLm5ldHR5PC9ncm91cElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5uZXR0eS10cmFuc3BvcnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5pby5uZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qbnItZmZpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5qbnI8L2dyb3VwSWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmpuci1wb3NpeDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5naXRodWIuam5yPC9ncm91cElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXI8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmVjajwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+JHtlY2oudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmNhZmZpbml0YXMub2hjPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5vaGMtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+JHtvaGMudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuY2FmZmluaXRhcy5vaGM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm9oYy1jb3JlLWo4PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4ke29oYy52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5uZXQuanUtbi5jb21waWxlLWNvbW1hbmQtYW5ub3RhdGlvbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmNvbXBpbGUtY29tbWFuZC1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmZ1c2Vzb3VyY2U8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnNpZ2FyPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjYuNDwvdmVyc2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5jb20uY2Fycm90c2VhcmNoPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5ocHBjPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4wLjguMTwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5kZS5qZmxleDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amZsZXg8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPiR7amZsZXgudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5naXRodWIucmhvbGRlcjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+c25vd2JhbGwtc3RlbW1lcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4zLjAuNTgxLjE8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZWNvZGUuY29uY3VycmVudC10cmVlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+Y29uY3VycmVudC10cmVlczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi40LjA8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5iZW4tbWFuZXMuY2FmZmVpbmU8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmNhZmZlaW5lPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjkuMjwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuamN0b29sczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amN0b29scy1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4zLjEuMDwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5vdzIuYXNtPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5hc208L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPiR7YXNtLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5vdzIuYXNtPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5hc20tYW5hbHlzaXM8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPiR7YXNtLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLm93Mi5hc208L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmFzbS10cmVlPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4ke2FzbS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5vdzIuYXNtPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5hc20tY29tbW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+JHthc20udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcub3cyLmFzbTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+YXNtLXV0aWw8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPiR7YXNtLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ3JpZGtpdC5qdm10b29sPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5zamstY2xpPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4wLjE0PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5ncmlka2l0Lmp2bXRvb2w8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnNqay1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4wLjE0PC92ZXJzaW9uPgorICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2prLWhmbGFtZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5ncmlka2l0Lmp2bXRvb2w8L2dyb3VwSWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNqay1oZmxhbWU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcucGVyZmtpdC5zamsucGFyc2VyczwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2prLWpmci1zdGFuZGFsb25lPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnBlcmZraXQuc2prLnBhcnNlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNqay1ucHM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcucGVyZmtpdC5zamsucGFyc2VyczwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2prLWpmcjU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcucGVyZmtpdC5zamsucGFyc2VyczwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2prLWpmcjY8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcucGVyZmtpdC5zamsucGFyc2VyczwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5ncmlka2l0Lmp2bXRvb2w8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnNqay1zdGFja3RyYWNlPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4wLjE0PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5ncmlka2l0Lmp2bXRvb2w8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm14ZHVtcDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MC4xNDwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ3JpZGtpdC5sYWI8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmp2bS1hdHRhY2gtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjU8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdyaWRraXQuanZtdG9vbDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+c2prLWpzb248L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjAuMTQ8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLmJldXN0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qY29tbWFuZGVyPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjMwPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5wc2phdmE8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnBzamF2YTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MC4xLjE5PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmphdmF4LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguaW5qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuajJvYmpjPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qMm9iamMtYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMzwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuanVuaXQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmp1bml0LWJvbTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+NS42LjA8L3ZlcnNpb24+CisgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5hc3NlcnRqPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5hc3NlcnRqLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjMuMTUuMDwvdmVyc2lvbj4KKyAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXdhaXRpbGl0eTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+YXdhaXRpbGl0eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+NC4wLjM8L3ZlcnNpb24+CisgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5zZWFuY2ZvbGV5PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5pcGFkZHJlc3M8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjUuMy4zPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5hZ3JvbmE8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmFncm9uYTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4xNy4xPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNoLm9iZXJtdWhsbmVyPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5iaWctbWF0aDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4zLjA8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisgIDwvZGVwZW5kZW5jeU1hbmFnZW1lbnQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8uY2lyY2xlY2kvY29uZmlnLnltbCBiLy5jaXJjbGVjaS9jb25maWcueW1sCmluZGV4IGIwMDljZDEuLjc0ZTVkMjEgMTAwNjQ0Ci0tLSBhLy5jaXJjbGVjaS9jb25maWcueW1sCisrKyBiLy5jaXJjbGVjaS9jb25maWcueW1sCkBAIC05NSw4ICs5NSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTcyLDcgKzE3MCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU19GUUxUT09MfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1mcWx0b29sLXRlc3RcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgZnFsdG9vbC10ZXN0ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTH0gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9ZnFsdG9vbC10ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtMTg2LDggKzE4NCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjUyLDggKzI0OCw2IEBACiAgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL3B5bGliCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzYzLDggKzM1Nyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNTE5LDggKzUxMSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNjA2LDggKzU5Niw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF9sYXJnZV93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzI1LDggKzcxMyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzk5LDggKzc4NSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODc2LDcgKzg2MCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTg5MCw4ICs4NzQsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTEwMDEsOCArOTgzLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTA0NCw2ICsxMDI0LDk1IEBACiAgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKICAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CiAgICAgLSBDQVNTQU5EUkFfVVNFX0pESzExOiB0cnVlCisgIGo4X3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtdHJpZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXRyaWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VQR1JBREVfRFRFU1RTX0NPVU5UOiAyNQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgIGo4X2p2bV9kdGVzdHNfdm5vZGU6CiAgICAgZG9ja2VyOgogICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKQEAgLTExMjEsOCArMTE5MCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTE5OCw3ICsxMjY1LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY29tcHJlc3Npb25cbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jb21wcmVzc2lvbiAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY29tcHJlc3Npb25cbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jb21wcmVzc2lvbiAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtMTIxMiw4ICsxMjc5LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0xMzMxLDggKzEzOTYsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTE0NDIsOCArMTUwNSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTU1Miw4ICsxNjEzLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTYzMCw3ICsxNjg5LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY29tcHJlc3Npb25cbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jb21wcmVzc2lvbiAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY29tcHJlc3Npb25cbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jb21wcmVzc2lvbiAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtMTY0NCw4ICsxNzAzLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0xNzYwLDYgKzE4MTcsNyBAQAogICAgICAgICAgICAgICBpZiBbWyAkdGFyZ2V0ID09ICJ0ZXN0IiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY2RjIiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY29tcHJlc3Npb24iIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC10cmllIiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSIgfHwgXAogICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJmcWx0b29sLXRlc3QiIHx8IFwKICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAibG9uZy10ZXN0IiB8fCBcCkBAIC0xODQwLDggKzE4OTgsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTE5MjcsOCArMTk4Myw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfbGFyZ2Vfd2l0aF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTIwNjIsOCArMjExNiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjE3Myw4ICsyMjI1LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yMjgzLDggKzIzMzMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yMzcwLDggKzI0MTgsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yNDQ4LDcgKzI0OTQsNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTI0NjIsOCArMjUwOCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjU3Myw4ICsyNjE3LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X3dpdGhfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yNjgzLDggKzI3MjUsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yNzQ5LDggKzI3ODksNiBAQAogICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9weWxpYgogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTI4NjgsOCArMjkwNiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjk0Miw4ICsyOTc4LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0zMDYyLDggKzMwOTYsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTMxOTYsOCArMzIyOCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzMzMCw4ICszMzYwLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0zNDY1LDggKzM0OTMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTM1ODQsOCArMzYxMCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzcwMCw4ICszNzI0LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0zODE5LDggKzM4NDEsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTM4OTIsOCArMzkxMiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzk3MCw3ICszOTg4LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdHNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTM5ODQsOCArNDAwMiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDA3MCw4ICs0MDg2LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X2xhcmdlX3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC00MTEyLDYgKzQxMjYsMTIwIEBACiAgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCiAgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAorICBqMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBTaW11bGF0b3IgVGVzdHMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3Qtc2ltdWxhdG9yLWR0ZXN0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAzMG0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VUEdSQURFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDI1CisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gQ0FTU0FORFJBX1VTRV9KREsxMTogdHJ1ZQogICBqMTFfdXRlc3RzX3N0cmVzczoKICAgICBkb2NrZXI6CiAgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdApAQCAtNDE0Myw4ICs0MjcxLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC00MjU0LDggKzQzODAsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajhfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTQzODgsOCArNDUxMiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDQ2NSw3ICs0NTg3LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY2RjXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY2RjICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1jZGNcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jZGMgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTQ0NzksOCArNDYwMSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDYzNiw4ICs0NzU2LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC00NzE0LDcgKzQ4MzIsNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTH0gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9ZnFsdG9vbC10ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0x9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWZxbHRvb2wtdGVzdFxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBmcWx0b29sLXRlc3QgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTQ3MjgsOCArNDg0Niw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDgwNSw3ICs0OTIxLDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz10cnVlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfSlZNX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPXRydWVcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTQ4MTksOCArNDkzNSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDkzOCw4ICs1MDUyLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC01MDQ5LDggKzUxNjEsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3Rfajhfd2l0aG91dF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTUxNTksOCArNTI2OSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTUyMzcsNyArNTM0NSw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXNpbXVsYXRvci1kdGVzdFxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXNpbXVsYXRvci1kdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Qtc2ltdWxhdG9yLWR0ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Qtc2ltdWxhdG9yLWR0ZXN0ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC01MjUxLDggKzUzNTksNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTUzNjEsOCArNTQ2Nyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTU0MzksNyArNTU0Myw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtNTQ1Myw4ICs1NTU3LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC01NDk1LDYgKzU1OTcsMTI0IEBACiAgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCiAgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX3RyaWU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdC10cmllKQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnVuaXQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QtdHJpZSAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VQR1JBREVfRFRFU1RTX0NPVU5UOiAyNQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIENBU1NBTkRSQV9VU0VfSkRLMTE6IHRydWUKICAgajExX2R0ZXN0c19sYXJnZV9yZXBlYXQ6CiAgICAgZG9ja2VyOgogICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKQEAgLTU1ODcsOCArNTgwNyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNTYzMCw2ICs1ODQ4LDEyMyBAQAogICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CiAgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAogICAgIC0gQ0FTU0FORFJBX1VTRV9KREsxMTogdHJ1ZQorICBqOF91dGVzdHNfdHJpZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0LXRyaWUpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC10cmllICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VUEdSQURFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDI1CisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgajhfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgogICAgIGRvY2tlcjoKICAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CkBAIC01Njk4LDggKzYwMzMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajhfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTU3NzUsNyArNjEwOCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTU3ODksOCArNjEyMiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNTkyMyw4ICs2MjU0LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02MDMzLDggKzYzNjIsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02MTIwLDggKzY0NDcsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajhfdXBncmFkZXRlc3RzX3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02MjI4LDggKzY1NTMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02MzA2LDcgKzY2MjksNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC02MzIwLDggKzY2NDMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTY0MzAsOCArNjc1MSwxODYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VQR1JBREVfRFRFU1RTX0NPVU5UOiAyNQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIENBU1NBTkRSQV9VU0VfSkRLMTE6IHRydWUKKyAgajExX3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtdHJpZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXRyaWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VQR1JBREVfRFRFU1RTX0NPVU5UOiAyNQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIENBU1NBTkRSQV9VU0VfSkRLMTE6IHRydWUKKyAgajExX3NpbXVsYXRvcl9kdGVzdHNfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1zaW11bGF0b3ItZHRlc3RcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1zaW11bGF0b3ItZHRlc3QgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNjUwOCw3ICs3MDA3LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtNjUyMiw4ICs3MDIxLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02NjMzLDggKzcxMzAsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02NzExLDcgKzcyMDYsNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfTE9OR30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9bG9uZy10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBsb25nLXRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfTE9OR30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9bG9uZy10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBsb25nLXRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC02NzI1LDggKzcyMjAsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTY4MTEsOCArNzMwNCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF9kdGVzdHNfb2ZmaGVhcF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNjkzMCw4ICs3NDIxLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03MDQ5LDggKzc1MzgsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTcxMjcsNyArNzYxNCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9dHJ1ZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz10cnVlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC03MTQxLDggKzc2MjgsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTcyNTAsOCArNzczNSw2IEBACiAgICAgICAgIC0gLm0yCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzMzNyw4ICs3ODIwLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03NDIzLDggKzc5MDQsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3Rfajhfd2l0aF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTc0ODcsOCArNzk2Niw2IEBACiAgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL3B5bGliCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzU2NSw3ICs4MDQyLDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtNzU3OSw4ICs4MDU2LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03Njg3LDggKzgxNjIsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03ODAzLDYgKzgyNzYsNyBAQAogICAgICAgICAgICAgICBpZiBbWyAkdGFyZ2V0ID09ICJ0ZXN0IiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY2RjIiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY29tcHJlc3Npb24iIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC10cmllIiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSIgfHwgXAogICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJmcWx0b29sLXRlc3QiIHx8IFwKICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAibG9uZy10ZXN0IiB8fCBcCkBAIC03ODgzLDggKzgzNTcsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTc5NTYsOCArODQyOCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODA3NSw4ICs4NTQ1LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC04MTg1LDggKzg2NTMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajhfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTgzMTksOCArODc4NSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODQzOCw4ICs4OTAyLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC04NTQ2LDggKzkwMDgsNiBAQAogICAgICAgICAtIC5tMgogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTg2NTYsOCArOTExNiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODczMyw3ICs5MTkxLDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdHNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTg3NDcsOCArOTIwNSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODgyMSw4ICs5Mjc3LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC04ODg1LDggKzkzMzksNiBAQAogICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9weWxpYgogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTg5OTMsOCArOTQ0NSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTkwNzEsNyArOTUyMSw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNkY1xudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWNkYyAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY2RjXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY2RjICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC05MDg1LDggKzk1MzUsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTkyMTksOCArOTY2Nyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtOTI5Niw3ICs5NzQyLDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0xPTkd9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWxvbmctdGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgbG9uZy10ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0xPTkd9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWxvbmctdGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgbG9uZy10ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtOTMxMCw4ICs5NzU2LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC05NDE2LDggKzk4NjAsNiBAQAogICAgICAgICAtIGR0ZXN0X2phcnMKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC05NTY5LDYgKzEwMDExLDE4IEBACiAgICAgICAgIHJlcXVpcmVzOgogICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfY29tcHJlc3Npb24KICAgICAgICAgLSBqOF9idWlsZAorICAgIC0gc3RhcnRfajhfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqOF91dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajhfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqOF9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqOF9idWlsZAogICAgIC0gc3RhcnRfajhfdXRlc3RzX3N0cmVzczoKICAgICAgICAgdHlwZTogYXBwcm92YWwKICAgICAtIGo4X3V0ZXN0c19zdHJlc3M6CkBAIC05ODMzLDYgKzEwMjg3LDE2IEBACiAgICAgICAgIHJlcXVpcmVzOgogICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbgogICAgICAgICAtIGo4X2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGo4X3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfdHJpZQorICAgICAgICAtIGo4X2J1aWxkCisgICAgLSBqMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c190cmllCisgICAgICAgIC0gajhfYnVpbGQKICAgICAtIHN0YXJ0X3V0ZXN0c19zdHJlc3M6CiAgICAgICAgIHR5cGU6IGFwcHJvdmFsCiAgICAgLSBqOF91dGVzdHNfc3RyZXNzOgpAQCAtMTAwMTAsNiArMTA0NzQsMTIgQEAKICAgICAgICAgcmVxdWlyZXM6CiAgICAgICAgIC0gc3RhcnRfajExX2p2bV9kdGVzdHNfdm5vZGUKICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3NpbXVsYXRvcl9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9zaW11bGF0b3JfZHRlc3RzCisgICAgICAgIC0gajExX2J1aWxkCiAgICAgLSBzdGFydF9qMTFfY3Fsc2hsaWJfdGVzdHM6CiAgICAgICAgIHR5cGU6IGFwcHJvdmFsCiAgICAgLSBqMTFfY3Fsc2hsaWJfdGVzdHM6CkBAIC0xMDExMCw2ICsxMDU4MCwxMiBAQAogICAgICAgICByZXF1aXJlczoKICAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX2NvbXByZXNzaW9uCiAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfdHJpZQorICAgICAgICAtIGoxMV9idWlsZAogICAgIC0gc3RhcnRfajExX3V0ZXN0c19zdHJlc3M6CiAgICAgICAgIHR5cGU6IGFwcHJvdmFsCiAgICAgLSBqMTFfdXRlc3RzX3N0cmVzczoKQEAgLTEwMTQ0LDYgKzEwNjIwLDkgQEAKICAgICAtIGoxMV9qdm1fZHRlc3RzX3Zub2RlOgogICAgICAgICByZXF1aXJlczoKICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKICAgICAtIGoxMV9jcWxzaGxpYl90ZXN0czoKICAgICAgICAgcmVxdWlyZXM6CiAgICAgICAgIC0gajExX2J1aWxkCkBAIC0xMDIyMiw2ICsxMDcwMSwxMiBAQAogICAgICAgICByZXF1aXJlczoKICAgICAgICAgLSBzdGFydF91dGVzdHNfY29tcHJlc3Npb24KICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfdHJpZQorICAgICAgICAtIGoxMV9idWlsZAogICAgIC0gc3RhcnRfdXRlc3RzX3N0cmVzczoKICAgICAgICAgdHlwZTogYXBwcm92YWwKICAgICAtIGoxMV91dGVzdHNfc3RyZXNzOgpkaWZmIC0tZ2l0IGEvLmNpcmNsZWNpL2NvbmZpZy55bWwuRlJFRSBiLy5jaXJjbGVjaS9jb25maWcueW1sLkZSRUUKaW5kZXggYjAwOWNkMS4uNzRlNWQyMSAxMDA2NDQKLS0tIGEvLmNpcmNsZWNpL2NvbmZpZy55bWwuRlJFRQorKysgYi8uY2lyY2xlY2kvY29uZmlnLnltbC5GUkVFCkBAIC05NSw4ICs5NSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTcyLDcgKzE3MCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU19GUUxUT09MfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1mcWx0b29sLXRlc3RcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgZnFsdG9vbC10ZXN0ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTH0gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9ZnFsdG9vbC10ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtMTg2LDggKzE4NCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjUyLDggKzI0OCw2IEBACiAgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL3B5bGliCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzYzLDggKzM1Nyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNTE5LDggKzUxMSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNjA2LDggKzU5Niw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF9sYXJnZV93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzI1LDggKzcxMyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzk5LDggKzc4NSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODc2LDcgKzg2MCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTg5MCw4ICs4NzQsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTEwMDEsOCArOTgzLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTA0NCw2ICsxMDI0LDk1IEBACiAgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKICAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CiAgICAgLSBDQVNTQU5EUkFfVVNFX0pESzExOiB0cnVlCisgIGo4X3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtdHJpZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXRyaWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VQR1JBREVfRFRFU1RTX0NPVU5UOiAyNQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgIGo4X2p2bV9kdGVzdHNfdm5vZGU6CiAgICAgZG9ja2VyOgogICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKQEAgLTExMjEsOCArMTE5MCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTE5OCw3ICsxMjY1LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY29tcHJlc3Npb25cbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jb21wcmVzc2lvbiAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY29tcHJlc3Npb25cbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jb21wcmVzc2lvbiAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtMTIxMiw4ICsxMjc5LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0xMzMxLDggKzEzOTYsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTE0NDIsOCArMTUwNSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTU1Miw4ICsxNjEzLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTYzMCw3ICsxNjg5LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY29tcHJlc3Npb25cbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jb21wcmVzc2lvbiAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY29tcHJlc3Npb25cbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jb21wcmVzc2lvbiAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtMTY0NCw4ICsxNzAzLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0xNzYwLDYgKzE4MTcsNyBAQAogICAgICAgICAgICAgICBpZiBbWyAkdGFyZ2V0ID09ICJ0ZXN0IiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY2RjIiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY29tcHJlc3Npb24iIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC10cmllIiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSIgfHwgXAogICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJmcWx0b29sLXRlc3QiIHx8IFwKICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAibG9uZy10ZXN0IiB8fCBcCkBAIC0xODQwLDggKzE4OTgsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTE5MjcsOCArMTk4Myw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfbGFyZ2Vfd2l0aF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTIwNjIsOCArMjExNiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjE3Myw4ICsyMjI1LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yMjgzLDggKzIzMzMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yMzcwLDggKzI0MTgsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yNDQ4LDcgKzI0OTQsNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTI0NjIsOCArMjUwOCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjU3Myw4ICsyNjE3LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X3dpdGhfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yNjgzLDggKzI3MjUsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yNzQ5LDggKzI3ODksNiBAQAogICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9weWxpYgogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTI4NjgsOCArMjkwNiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjk0Miw4ICsyOTc4LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0zMDYyLDggKzMwOTYsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTMxOTYsOCArMzIyOCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzMzMCw4ICszMzYwLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0zNDY1LDggKzM0OTMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTM1ODQsOCArMzYxMCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzcwMCw4ICszNzI0LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0zODE5LDggKzM4NDEsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTM4OTIsOCArMzkxMiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzk3MCw3ICszOTg4LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdHNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTM5ODQsOCArNDAwMiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDA3MCw4ICs0MDg2LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X2xhcmdlX3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC00MTEyLDYgKzQxMjYsMTIwIEBACiAgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCiAgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAorICBqMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBTaW11bGF0b3IgVGVzdHMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3Qtc2ltdWxhdG9yLWR0ZXN0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAzMG0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VUEdSQURFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDI1CisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gQ0FTU0FORFJBX1VTRV9KREsxMTogdHJ1ZQogICBqMTFfdXRlc3RzX3N0cmVzczoKICAgICBkb2NrZXI6CiAgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdApAQCAtNDE0Myw4ICs0MjcxLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC00MjU0LDggKzQzODAsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajhfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTQzODgsOCArNDUxMiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDQ2NSw3ICs0NTg3LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY2RjXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY2RjICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1jZGNcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jZGMgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTQ0NzksOCArNDYwMSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDYzNiw4ICs0NzU2LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC00NzE0LDcgKzQ4MzIsNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTH0gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9ZnFsdG9vbC10ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0x9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWZxbHRvb2wtdGVzdFxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBmcWx0b29sLXRlc3QgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTQ3MjgsOCArNDg0Niw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDgwNSw3ICs0OTIxLDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz10cnVlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfSlZNX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPXRydWVcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTQ4MTksOCArNDkzNSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDkzOCw4ICs1MDUyLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC01MDQ5LDggKzUxNjEsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3Rfajhfd2l0aG91dF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTUxNTksOCArNTI2OSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTUyMzcsNyArNTM0NSw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXNpbXVsYXRvci1kdGVzdFxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXNpbXVsYXRvci1kdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Qtc2ltdWxhdG9yLWR0ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Qtc2ltdWxhdG9yLWR0ZXN0ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC01MjUxLDggKzUzNTksNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTUzNjEsOCArNTQ2Nyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTU0MzksNyArNTU0Myw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtNTQ1Myw4ICs1NTU3LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC01NDk1LDYgKzU1OTcsMTI0IEBACiAgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCiAgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX3RyaWU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdC10cmllKQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnVuaXQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QtdHJpZSAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VQR1JBREVfRFRFU1RTX0NPVU5UOiAyNQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIENBU1NBTkRSQV9VU0VfSkRLMTE6IHRydWUKICAgajExX2R0ZXN0c19sYXJnZV9yZXBlYXQ6CiAgICAgZG9ja2VyOgogICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKQEAgLTU1ODcsOCArNTgwNyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNTYzMCw2ICs1ODQ4LDEyMyBAQAogICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CiAgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAogICAgIC0gQ0FTU0FORFJBX1VTRV9KREsxMTogdHJ1ZQorICBqOF91dGVzdHNfdHJpZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0LXRyaWUpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC10cmllICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VUEdSQURFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDI1CisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgajhfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgogICAgIGRvY2tlcjoKICAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CkBAIC01Njk4LDggKzYwMzMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajhfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTU3NzUsNyArNjEwOCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTU3ODksOCArNjEyMiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNTkyMyw4ICs2MjU0LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02MDMzLDggKzYzNjIsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02MTIwLDggKzY0NDcsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajhfdXBncmFkZXRlc3RzX3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02MjI4LDggKzY1NTMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02MzA2LDcgKzY2MjksNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC02MzIwLDggKzY2NDMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTY0MzAsOCArNjc1MSwxODYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VQR1JBREVfRFRFU1RTX0NPVU5UOiAyNQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIENBU1NBTkRSQV9VU0VfSkRLMTE6IHRydWUKKyAgajExX3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtdHJpZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXRyaWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VQR1JBREVfRFRFU1RTX0NPVU5UOiAyNQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIENBU1NBTkRSQV9VU0VfSkRLMTE6IHRydWUKKyAgajExX3NpbXVsYXRvcl9kdGVzdHNfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1zaW11bGF0b3ItZHRlc3RcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1zaW11bGF0b3ItZHRlc3QgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNjUwOCw3ICs3MDA3LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtNjUyMiw4ICs3MDIxLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02NjMzLDggKzcxMzAsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02NzExLDcgKzcyMDYsNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfTE9OR30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9bG9uZy10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBsb25nLXRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfTE9OR30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9bG9uZy10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBsb25nLXRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC02NzI1LDggKzcyMjAsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTY4MTEsOCArNzMwNCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF9kdGVzdHNfb2ZmaGVhcF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNjkzMCw4ICs3NDIxLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03MDQ5LDggKzc1MzgsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTcxMjcsNyArNzYxNCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9dHJ1ZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz10cnVlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC03MTQxLDggKzc2MjgsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTcyNTAsOCArNzczNSw2IEBACiAgICAgICAgIC0gLm0yCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzMzNyw4ICs3ODIwLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03NDIzLDggKzc5MDQsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3Rfajhfd2l0aF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTc0ODcsOCArNzk2Niw2IEBACiAgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL3B5bGliCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzU2NSw3ICs4MDQyLDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtNzU3OSw4ICs4MDU2LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03Njg3LDggKzgxNjIsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03ODAzLDYgKzgyNzYsNyBAQAogICAgICAgICAgICAgICBpZiBbWyAkdGFyZ2V0ID09ICJ0ZXN0IiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY2RjIiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY29tcHJlc3Npb24iIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC10cmllIiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSIgfHwgXAogICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJmcWx0b29sLXRlc3QiIHx8IFwKICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAibG9uZy10ZXN0IiB8fCBcCkBAIC03ODgzLDggKzgzNTcsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTc5NTYsOCArODQyOCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODA3NSw4ICs4NTQ1LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC04MTg1LDggKzg2NTMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajhfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTgzMTksOCArODc4NSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODQzOCw4ICs4OTAyLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC04NTQ2LDggKzkwMDgsNiBAQAogICAgICAgICAtIC5tMgogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTg2NTYsOCArOTExNiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODczMyw3ICs5MTkxLDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdHNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTg3NDcsOCArOTIwNSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODgyMSw4ICs5Mjc3LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC04ODg1LDggKzkzMzksNiBAQAogICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9weWxpYgogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTg5OTMsOCArOTQ0NSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTkwNzEsNyArOTUyMSw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNkY1xudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWNkYyAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY2RjXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY2RjICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC05MDg1LDggKzk1MzUsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTkyMTksOCArOTY2Nyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtOTI5Niw3ICs5NzQyLDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0xPTkd9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWxvbmctdGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgbG9uZy10ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0xPTkd9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWxvbmctdGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgbG9uZy10ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtOTMxMCw4ICs5NzU2LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC05NDE2LDggKzk4NjAsNiBAQAogICAgICAgICAtIGR0ZXN0X2phcnMKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC05NTY5LDYgKzEwMDExLDE4IEBACiAgICAgICAgIHJlcXVpcmVzOgogICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfY29tcHJlc3Npb24KICAgICAgICAgLSBqOF9idWlsZAorICAgIC0gc3RhcnRfajhfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqOF91dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajhfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqOF9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqOF9idWlsZAogICAgIC0gc3RhcnRfajhfdXRlc3RzX3N0cmVzczoKICAgICAgICAgdHlwZTogYXBwcm92YWwKICAgICAtIGo4X3V0ZXN0c19zdHJlc3M6CkBAIC05ODMzLDYgKzEwMjg3LDE2IEBACiAgICAgICAgIHJlcXVpcmVzOgogICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbgogICAgICAgICAtIGo4X2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGo4X3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfdHJpZQorICAgICAgICAtIGo4X2J1aWxkCisgICAgLSBqMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c190cmllCisgICAgICAgIC0gajhfYnVpbGQKICAgICAtIHN0YXJ0X3V0ZXN0c19zdHJlc3M6CiAgICAgICAgIHR5cGU6IGFwcHJvdmFsCiAgICAgLSBqOF91dGVzdHNfc3RyZXNzOgpAQCAtMTAwMTAsNiArMTA0NzQsMTIgQEAKICAgICAgICAgcmVxdWlyZXM6CiAgICAgICAgIC0gc3RhcnRfajExX2p2bV9kdGVzdHNfdm5vZGUKICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3NpbXVsYXRvcl9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9zaW11bGF0b3JfZHRlc3RzCisgICAgICAgIC0gajExX2J1aWxkCiAgICAgLSBzdGFydF9qMTFfY3Fsc2hsaWJfdGVzdHM6CiAgICAgICAgIHR5cGU6IGFwcHJvdmFsCiAgICAgLSBqMTFfY3Fsc2hsaWJfdGVzdHM6CkBAIC0xMDExMCw2ICsxMDU4MCwxMiBAQAogICAgICAgICByZXF1aXJlczoKICAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX2NvbXByZXNzaW9uCiAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfdHJpZQorICAgICAgICAtIGoxMV9idWlsZAogICAgIC0gc3RhcnRfajExX3V0ZXN0c19zdHJlc3M6CiAgICAgICAgIHR5cGU6IGFwcHJvdmFsCiAgICAgLSBqMTFfdXRlc3RzX3N0cmVzczoKQEAgLTEwMTQ0LDYgKzEwNjIwLDkgQEAKICAgICAtIGoxMV9qdm1fZHRlc3RzX3Zub2RlOgogICAgICAgICByZXF1aXJlczoKICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKICAgICAtIGoxMV9jcWxzaGxpYl90ZXN0czoKICAgICAgICAgcmVxdWlyZXM6CiAgICAgICAgIC0gajExX2J1aWxkCkBAIC0xMDIyMiw2ICsxMDcwMSwxMiBAQAogICAgICAgICByZXF1aXJlczoKICAgICAgICAgLSBzdGFydF91dGVzdHNfY29tcHJlc3Npb24KICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfdHJpZQorICAgICAgICAtIGoxMV9idWlsZAogICAgIC0gc3RhcnRfdXRlc3RzX3N0cmVzczoKICAgICAgICAgdHlwZTogYXBwcm92YWwKICAgICAtIGoxMV91dGVzdHNfc3RyZXNzOgpkaWZmIC0tZ2l0IGEvLmNpcmNsZWNpL2NvbmZpZy55bWwuUEFJRCBiLy5jaXJjbGVjaS9jb25maWcueW1sLlBBSUQKaW5kZXggMzExOGYzNy4uZTcwMTc0ZCAxMDA2NDQKLS0tIGEvLmNpcmNsZWNpL2NvbmZpZy55bWwuUEFJRAorKysgYi8uY2lyY2xlY2kvY29uZmlnLnltbC5QQUlECkBAIC05NSw4ICs5NSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTcyLDcgKzE3MCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU19GUUxUT09MfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1mcWx0b29sLXRlc3RcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgZnFsdG9vbC10ZXN0ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTH0gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9ZnFsdG9vbC10ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtMTg2LDggKzE4NCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjUyLDggKzI0OCw2IEBACiAgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL3B5bGliCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzYzLDggKzM1Nyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNTE5LDggKzUxMSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNjA2LDggKzU5Niw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF9sYXJnZV93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzI1LDggKzcxMyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzk5LDggKzc4NSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODc2LDcgKzg2MCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTg5MCw4ICs4NzQsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTEwMDEsOCArOTgzLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTA0NCw2ICsxMDI0LDk1IEBACiAgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKICAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CiAgICAgLSBDQVNTQU5EUkFfVVNFX0pESzExOiB0cnVlCisgIGo4X3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXRyaWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC10cmllICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VQR1JBREVfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VUEdSQURFX0RURVNUU19DT1VOVDogMjUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICBqOF9qdm1fZHRlc3RzX3Zub2RlOgogICAgIGRvY2tlcjoKICAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CkBAIC0xMTIxLDggKzExOTAsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTExOTgsNyArMTI2NSw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNvbXByZXNzaW9uXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY29tcHJlc3Npb24gJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNvbXByZXNzaW9uXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY29tcHJlc3Npb24gJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTEyMTIsOCArMTI3OSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTMzMSw4ICsxMzk2LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0xNDQyLDggKzE1MDUsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3Rfajhfd2l0aG91dF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTE1NTIsOCArMTYxMyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aG91dF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTE2MzAsNyArMTY4OSw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNvbXByZXNzaW9uXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY29tcHJlc3Npb24gJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNvbXByZXNzaW9uXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY29tcHJlc3Npb24gJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTE2NDQsOCArMTcwMyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTc2MCw2ICsxODE3LDcgQEAKICAgICAgICAgICAgICAgaWYgW1sgJHRhcmdldCA9PSAidGVzdCIgfHwgXAogICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LWNkYyIgfHwgXAogICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LWNvbXByZXNzaW9uIiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtdHJpZSIgfHwgXAogICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkiIHx8IFwKICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAiZnFsdG9vbC10ZXN0IiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gImxvbmctdGVzdCIgfHwgXApAQCAtMTg0MCw4ICsxODk4LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0xOTI3LDggKzE5ODMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2xhcmdlX3dpdGhfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yMDYyLDggKzIxMTYsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTIxNzMsOCArMjIyNSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjI4Myw4ICsyMzMzLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9kdGVzdHNfb2ZmaGVhcF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjM3MCw4ICsyNDE4LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjQ0OCw3ICsyNDk0LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC0yNDYyLDggKzI1MDgsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTI1NzMsOCArMjYxNyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjY4Myw4ICsyNzI1LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjc0OSw4ICsyNzg5LDYgQEAKICAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvcHlsaWIKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yODY4LDggKzI5MDYsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTI5NDIsOCArMjk3OCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzA2Miw4ICszMDk2LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0zMTk2LDggKzMyMjgsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTMzMzAsOCArMzM2MCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzQ2NSw4ICszNDkzLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0zNTg0LDggKzM2MTAsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTM3MDAsOCArMzcyNCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzgxOSw4ICszODQxLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0zODkyLDggKzM5MTIsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTM5NzAsNyArMzk4OCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC0zOTg0LDggKzQwMDIsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTQwNzAsOCArNDA4Niw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF9sYXJnZV93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDExMiw2ICs0MTI2LDEyMCBAQAogICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAogICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKKyAgajExX3NpbXVsYXRvcl9kdGVzdHM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gU2ltdWxhdG9yIFRlc3RzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCB0ZXN0LXNpbXVsYXRvci1kdGVzdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMzBtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VQR1JBREVfRFRFU1RTX0NPVU5UOiAyNQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIENBU1NBTkRSQV9VU0VfSkRLMTE6IHRydWUKICAgajExX3V0ZXN0c19zdHJlc3M6CiAgICAgZG9ja2VyOgogICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKQEAgLTQxNDMsOCArNDI3MSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDI1NCw4ICs0MzgwLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X2R0ZXN0c19vZmZoZWFwX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC00Mzg4LDggKzQ1MTIsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTQ0NjUsNyArNDU4Nyw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNkY1xudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWNkYyAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY2RjXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY2RjICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC00NDc5LDggKzQ2MDEsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTQ2MzYsOCArNDc1Niw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDcxNCw3ICs0ODMyLDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0x9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWZxbHRvb2wtdGVzdFxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBmcWx0b29sLXRlc3QgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU19GUUxUT09MfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1mcWx0b29sLXRlc3RcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgZnFsdG9vbC10ZXN0ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC00NzI4LDggKzQ4NDYsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTQ4MDUsNyArNDkyMSw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9dHJ1ZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz10cnVlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC00ODE5LDggKzQ5MzUsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTQ5MzgsOCArNTA1Miw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNTA0OSw4ICs1MTYxLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC01MTU5LDggKzUyNjksNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC01MjM3LDcgKzUzNDUsNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1zaW11bGF0b3ItZHRlc3RcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1zaW11bGF0b3ItZHRlc3QgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXNpbXVsYXRvci1kdGVzdFxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXNpbXVsYXRvci1kdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtNTI1MSw4ICs1MzU5LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC01MzYxLDggKzU0NjcsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC01NDM5LDcgKzU1NDMsNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTU0NTMsOCArNTU1Nyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNTQ5NSw2ICs1NTk3LDEyNCBAQAogICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAogICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c190cmllOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0LXRyaWUpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC10cmllICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VUEdSQURFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDI1CisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gQ0FTU0FORFJBX1VTRV9KREsxMTogdHJ1ZQogICBqMTFfZHRlc3RzX2xhcmdlX3JlcGVhdDoKICAgICBkb2NrZXI6CiAgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdApAQCAtNTU4Nyw4ICs1ODA3LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC01NjMwLDYgKzU4NDgsMTIzIEBACiAgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKICAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CiAgICAgLSBDQVNTQU5EUkFfVVNFX0pESzExOiB0cnVlCisgIGo4X3V0ZXN0c190cmllOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0LXRyaWUpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC10cmllICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VUEdSQURFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDI1CisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgajhfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgogICAgIGRvY2tlcjoKICAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CkBAIC01Njk4LDggKzYwMzMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajhfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTU3NzUsNyArNjEwOCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTU3ODksOCArNjEyMiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNTkyMyw4ICs2MjU0LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02MDMzLDggKzYzNjIsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02MDc5LDcgKzY0MDYsNyBAQAogICBqOF91cGdyYWRlX2R0ZXN0czoKICAgICBkb2NrZXI6CiAgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAotICAgIHJlc291cmNlX2NsYXNzOiB4bGFyZ2UKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKICAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KICAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAogICAgIHBhcmFsbGVsaXNtOiAxMDAKQEAgLTYxMjAsOCArNjQ0Nyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF91cGdyYWRldGVzdHNfd2l0aG91dF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTYyMjgsOCArNjU1Myw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTYzMDYsNyArNjYyOSw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTYzMjAsOCArNjY0Myw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNjQzMCw4ICs2NzUxLDE4NiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VUEdSQURFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDI1CisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gQ0FTU0FORFJBX1VTRV9KREsxMTogdHJ1ZQorICBqMTFfdXRlc3RzX3RyaWVfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtdHJpZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXRyaWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VQR1JBREVfRFRFU1RTX0NPVU5UOiAyNQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIENBU1NBTkRSQV9VU0VfSkRLMTE6IHRydWUKKyAgajExX3NpbXVsYXRvcl9kdGVzdHNfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Qtc2ltdWxhdG9yLWR0ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Qtc2ltdWxhdG9yLWR0ZXN0ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTY1MDgsNyArNzAwNyw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTY1MjIsOCArNzAyMSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNjYzMyw4ICs3MTMwLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNjcxMSw3ICs3MjA2LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0xPTkd9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWxvbmctdGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgbG9uZy10ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0xPTkd9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWxvbmctdGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgbG9uZy10ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtNjcyNSw4ICs3MjIwLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02ODExLDggKzczMDQsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajhfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTY5MzAsOCArNzQyMSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzA0OSw4ICs3NTM4LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03MTI3LDcgKzc2MTQsNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfSlZNX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPXRydWVcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9dHJ1ZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtNzE0MSw4ICs3NjI4LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03MjUwLDggKzc3MzUsNiBAQAogICAgICAgICAtIC5tMgogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTczMzcsOCArNzgyMCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzQyMyw4ICs3OTA0LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X3dpdGhfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03NDg3LDggKzc5NjYsNiBAQAogICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9weWxpYgogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTc1NjUsNyArODA0Miw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTc1NzksOCArODA1Niw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzY4Nyw4ICs4MTYyLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzgwMyw2ICs4Mjc2LDcgQEAKICAgICAgICAgICAgICAgaWYgW1sgJHRhcmdldCA9PSAidGVzdCIgfHwgXAogICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LWNkYyIgfHwgXAogICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LWNvbXByZXNzaW9uIiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtdHJpZSIgfHwgXAogICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkiIHx8IFwKICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAiZnFsdG9vbC10ZXN0IiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gImxvbmctdGVzdCIgfHwgXApAQCAtNzg4Myw4ICs4MzU3LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03OTU2LDggKzg0MjgsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTgwNzUsOCArODU0NSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODE4NSw4ICs4NjUzLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X2R0ZXN0c19vZmZoZWFwX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC04MzE5LDggKzg3ODUsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTg0MzgsOCArODkwMiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODU0Niw4ICs5MDA4LDYgQEAKICAgICAgICAgLSAubTIKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC04NjU2LDggKzkxMTYsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3Rfajhfd2l0aF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTg3MzMsNyArOTE5MSw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC04NzQ3LDggKzkyMDUsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTg4MjEsOCArOTI3Nyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODg4NSw4ICs5MzM5LDYgQEAKICAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvcHlsaWIKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC04OTkzLDggKzk0NDUsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC05MDcxLDcgKzk1MjEsNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1jZGNcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jZGMgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNkY1xudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWNkYyAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtOTA4NSw4ICs5NTM1LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC05MjE5LDggKzk2NjcsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTkyOTYsNyArOTc0Miw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU19MT05HfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1sb25nLXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGxvbmctdGVzdHNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU19MT05HfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1sb25nLXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGxvbmctdGVzdHNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTkzMTAsOCArOTc1Niw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtOTQxNiw4ICs5ODYwLDYgQEAKICAgICAgICAgLSBkdGVzdF9qYXJzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtOTU2OSw2ICsxMDAxMSwxOCBAQAogICAgICAgICByZXF1aXJlczoKICAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX2NvbXByZXNzaW9uCiAgICAgICAgIC0gajhfYnVpbGQKKyAgICAtIHN0YXJ0X2o4X3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajhfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2o4X3V0ZXN0c190cmllCisgICAgICAgIC0gajhfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllCisgICAgICAgIC0gajhfYnVpbGQKICAgICAtIHN0YXJ0X2o4X3V0ZXN0c19zdHJlc3M6CiAgICAgICAgIHR5cGU6IGFwcHJvdmFsCiAgICAgLSBqOF91dGVzdHNfc3RyZXNzOgpAQCAtOTgzMyw2ICsxMDI4NywxNiBAQAogICAgICAgICByZXF1aXJlczoKICAgICAgICAgLSBzdGFydF91dGVzdHNfY29tcHJlc3Npb24KICAgICAgICAgLSBqOF9idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqOF91dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqOF9idWlsZAorICAgIC0gajExX3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfdHJpZQorICAgICAgICAtIGo4X2J1aWxkCiAgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzOgogICAgICAgICB0eXBlOiBhcHByb3ZhbAogICAgIC0gajhfdXRlc3RzX3N0cmVzczoKQEAgLTEwMDEwLDYgKzEwNDc0LDEyIEBACiAgICAgICAgIHJlcXVpcmVzOgogICAgICAgICAtIHN0YXJ0X2oxMV9qdm1fZHRlc3RzX3Zub2RlCiAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfc2ltdWxhdG9yX2R0ZXN0cworICAgICAgICAtIGoxMV9idWlsZAogICAgIC0gc3RhcnRfajExX2NxbHNobGliX3Rlc3RzOgogICAgICAgICB0eXBlOiBhcHByb3ZhbAogICAgIC0gajExX2NxbHNobGliX3Rlc3RzOgpAQCAtMTAxMTAsNiArMTA1ODAsMTIgQEAKICAgICAgICAgcmVxdWlyZXM6CiAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19jb21wcmVzc2lvbgogICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqMTFfYnVpbGQKICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfc3RyZXNzOgogICAgICAgICB0eXBlOiBhcHByb3ZhbAogICAgIC0gajExX3V0ZXN0c19zdHJlc3M6CkBAIC0xMDE0NCw2ICsxMDYyMCw5IEBACiAgICAgLSBqMTFfanZtX2R0ZXN0c192bm9kZToKICAgICAgICAgcmVxdWlyZXM6CiAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCiAgICAgLSBqMTFfY3Fsc2hsaWJfdGVzdHM6CiAgICAgICAgIHJlcXVpcmVzOgogICAgICAgICAtIGoxMV9idWlsZApAQCAtMTAyMjIsNiArMTA3MDEsMTIgQEAKICAgICAgICAgcmVxdWlyZXM6CiAgICAgICAgIC0gc3RhcnRfdXRlc3RzX2NvbXByZXNzaW9uCiAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqMTFfYnVpbGQKICAgICAtIHN0YXJ0X3V0ZXN0c19zdHJlc3M6CiAgICAgICAgIHR5cGU6IGFwcHJvdmFsCiAgICAgLSBqMTFfdXRlc3RzX3N0cmVzczoKZGlmZiAtLWdpdCBhLy5jaXJjbGVjaS9jb25maWdfMTFfYW5kXzE3LnltbCBiLy5jaXJjbGVjaS9jb25maWdfMTFfYW5kXzE3LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDBlNzdlCi0tLSAvZGV2L251bGwKKysrIGIvLmNpcmNsZWNpL2NvbmZpZ18xMV9hbmRfMTcueW1sCkBAIC0wLDAgKzEsOTU2MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordmVyc2lvbjogMgoram9iczoKKyAgajE3X2R0ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxN193aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBub3QgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfd2l0aG91dF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhvdXRfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRob3V0X3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBjcWxzaGxpYiBVbml0IFRlc3RzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGV4cG9ydCBjeXRob249InllcyIKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYS8KKyAgICAgICAgICAuL3B5bGliL2Nhc3NhbmRyYS1jcWxzaC10ZXN0cy5zaCAkKHB3ZCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9weWxpYgorICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN19kdGVzdHNfb2ZmaGVhcCkqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcCB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcC50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajE3X2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHQKKworICAgICAgICAgIHNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMScgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExCisgICAgICAgICAgZmkKKworICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKyAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0YAorICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajE3X2R0ZXN0c19vZmZoZWFwLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2R0ZXN0c19vZmZoZWFwCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN19kdGVzdHNfb2ZmaGVhcF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2p2bV9kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfSlZNX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPXRydWVcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c19mcWx0b29sX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0x9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWZxbHRvb2wtdGVzdFxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBmcWx0b29sLXRlc3QgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBjcWxzaGxpYiBVbml0IFRlc3RzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGV4cG9ydCBjeXRob249InllcyIKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYS8KKyAgICAgICAgICAuL3B5bGliL2Nhc3NhbmRyYS1jcWxzaC10ZXN0cy5zaCAkKHB3ZCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9weWxpYgorICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN19jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X2R0ZXN0c19vZmZoZWFwKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcCA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfZHRlc3RzX29mZmhlYXAueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfZHRlc3RzX29mZmhlYXAKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2R0ZXN0c19vZmZoZWFwX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QtY29tcHJlc3Npb24pCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC1jb21wcmVzc2lvbiAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxN193aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN193aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOCcgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN193aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIFB5dGhvbiBEVGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0RURVNUU30gJGNvdW50IHRpbWVzIgorCisgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKworICAgICAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKworICAgICAgICAgICAgICB0ZXN0c19hcmc9JChlY2hvICR7UkVQRUFURURfRFRFU1RTfSB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX07IHRoZW4KKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiB0cnVlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgICR0ZXN0c19hcmcgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2R0ZXN0c19vZmZoZWFwX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIHRydWU7IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSItLWV4ZWN1dGUtdXBncmFkZS10ZXN0cyAtLXVwZ3JhZGUtdGFyZ2V0LXZlcnNpb24tb25seSAtLXVwZ3JhZGUtdmVyc2lvbi1zZWxlY3Rpb24gYWxsIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAkdm5vZGVzX2FyZ3MgLS1jb3VudD0kY291bnQgJHN0b3Bfb25fZmFpbHVyZV9hcmcgJHVwZ3JhZGVfYXJnIC0tbG9nLWNsaS1sZXZlbD1ERUJVRyAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHQueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biByZXBlYXRlZCBQeXRob24gRFRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGlmIFsgIiR7UkVQRUFURURfRFRFU1RTfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBuYW1lIGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IiAtbGUgMCBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBpcyBsZXNzZXIgb3IgZXF1YWxzIHRoYW4gemVybywgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxzZQorCisgICAgICAgICAgICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLgorICAgICAgICAgICAgIyBTaW5jZSB3ZSBhcmUgcnVubmluZyB0aGUgc2FtZSB0ZXN0IG11bHRpcGxlIHRpbWVzIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIGBjaXJjbGVjaSB0ZXN0cyBzcGxpdGAuCisgICAgICAgICAgICBjb3VudD0kKCgke1JFUEVBVEVEX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpCisgICAgICAgICAgICBpZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlbgorICAgICAgICAgICAgICBjb3VudD0kKChjb3VudCsxKSkKKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgIGlmICgoJGNvdW50IDw9IDApKTsgdGhlbgorICAgICAgICAgICAgICBlY2hvICJObyB0ZXN0cyB0byBydW4gaW4gdGhpcyBydW5uZXIiCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgJHtSRVBFQVRFRF9EVEVTVFN9ICRjb3VudCB0aW1lcyIKKworICAgICAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisKKyAgICAgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisKKyAgICAgICAgICAgICAgdGVzdHNfYXJnPSQoZWNobyAke1JFUEVBVEVEX0RURVNUU30gfCBzZWQgLWUgInMvLC8gL2ciKQorCisgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9OyB0aGVuCisgICAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iLXgiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9IiIKKyAgICAgICAgICAgICAgaWYgdHJ1ZTsgdGhlbgorICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdXBncmFkZV9hcmc9Ii0tZXhlY3V0ZS11cGdyYWRlLXRlc3RzIC0tdXBncmFkZS10YXJnZXQtdmVyc2lvbi1vbmx5IC0tdXBncmFkZS12ZXJzaW9uLXNlbGVjdGlvbiBhbGwiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0ICR2bm9kZXNfYXJncyAtLWNvdW50PSRjb3VudCAkc3RvcF9vbl9mYWlsdXJlX2FyZyAkdXBncmFkZV9hcmcgLS1sb2ctY2xpLWxldmVsPURFQlVHIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5ICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfY3Fsc2hfZHRlc3RzX3B5MzoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfd2l0aG91dF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfd2l0aG91dF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aG91dF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhvdXRfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX3N0cmVzc19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X3VuaXRfdGVzdHM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC51bml0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nIHx8IHRydWUpCisgICAgICAgICAgaWYgWyAteiAiJHRlc3RfdGltZW91dCIgXTsgdGhlbgorICAgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JykKKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCB0ZXN0Y2xhc3NsaXN0ICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTFfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX3dpdGhvdXRfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHQKKworICAgICAgICAgIHNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMScgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExCisgICAgICAgICAgZmkKKworICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKyAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0YAorICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajExX3dpdGhvdXRfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X2R0ZXN0c19sYXJnZV92bm9kZV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIFB5dGhvbiBEVGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0xBUkdFX0RURVNUU30gJGNvdW50IHRpbWVzIgorCisgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKworICAgICAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKworICAgICAgICAgICAgICB0ZXN0c19hcmc9JChlY2hvICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX07IHRoZW4KKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiB0cnVlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19kdGVzdHNfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIFB5dGhvbiBEVGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0RURVNUU30gJGNvdW50IHRpbWVzIgorCisgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKworICAgICAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKworICAgICAgICAgICAgICB0ZXN0c19hcmc9JChlY2hvICR7UkVQRUFURURfRFRFU1RTfSB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX07IHRoZW4KKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdXBncmFkZV9hcmc9Ii0tZXhlY3V0ZS11cGdyYWRlLXRlc3RzIC0tdXBncmFkZS10YXJnZXQtdmVyc2lvbi1vbmx5IC0tdXBncmFkZS12ZXJzaW9uLXNlbGVjdGlvbiBhbGwiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0ICR2bm9kZXNfYXJncyAtLWNvdW50PSRjb3VudCAkc3RvcF9vbl9mYWlsdXJlX2FyZyAkdXBncmFkZV9hcmcgLS1sb2ctY2xpLWxldmVsPURFQlVHIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV91bml0X3Rlc3RzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdCAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMQorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN193aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRob3V0X3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aG91dF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzODoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTFfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfd2l0aG91dF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOCcgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfd2l0aG91dF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aG91dF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX3N0cmVzc19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c19jb21wcmVzc2lvbl9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNvbXByZXNzaW9uXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY29tcHJlc3Npb24gJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX3JlcGVhdGVkX2FudF90ZXN0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgSlVuaXQgdGVzdAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0FOVF9URVNUX0NMQVNTfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCB1dGVzdCBjbGFzcyBuYW1lIGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgdXRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgdXRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpCisgICAgICAgICAgICBpZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0FOVF9URVNUX1RBUkdFVH0gJHtSRVBFQVRFRF9BTlRfVEVTVF9DTEFTU30gJHtSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTfSAke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSB0aW1lcyIKKworICAgICAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHRhcmdldD0ke1JFUEVBVEVEX0FOVF9URVNUX1RBUkdFVH0KKyAgICAgICAgICAgICAgY2xhc3NfcGF0aD0ke1JFUEVBVEVEX0FOVF9URVNUX0NMQVNTfQorICAgICAgICAgICAgICBjbGFzc19uYW1lPSIke2NsYXNzX3BhdGgjIyoufSIKKworICAgICAgICAgICAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LgorICAgICAgICAgICAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LgorICAgICAgICAgICAgICBpZiBbWyAkdGFyZ2V0ID09ICJ0ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY2RjIiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY29tcHJlc3Npb24iIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC10cmllIiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJmcWx0b29sLXRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAibG9uZy10ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInN0cmVzcy10ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3Qtc2ltdWxhdG9yLWR0ZXN0IiBdXTsgdGhlbgorICAgICAgICAgICAgICAgIG5hbWU9Ii1EdGVzdC5uYW1lPSRjbGFzc19uYW1lIgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbmFtZT0iLUR0ZXN0Lm5hbWU9JGNsYXNzX3BhdGgiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwKKyAgICAgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICAgICAgbWV0aG9kcz0iIgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWV0aG9kcz0iLUR0ZXN0Lm1ldGhvZHM9JHtSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTfSIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbAorICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX0FOVF9URVNUX1ZOT0RFU307IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2JyIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIFJ1biB0aGUgdGVzdCB0YXJnZXQgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQgY29sbGVjdGluZyB0aGUgZXhpdCBjb2RlLAorICAgICAgICAgICAgICAjIHN0b3BwaW5nIHRoZSBpdGVyYXRpb24gb25seSBpZiBzdG9wX29uX2ZhaWx1cmUgaXMgc2V0LgorICAgICAgICAgICAgICBleGl0X2NvZGU9IiQ/IgorICAgICAgICAgICAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvCisKKyAgICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nIHRlc3QgaXRlcmF0aW9uICRpIG9mICRjb3VudCIKKworICAgICAgICAgICAgICAgICMgcnVuIHRoZSB0ZXN0CisgICAgICAgICAgICAgICAgc3RhdHVzPSJwYXNzZXMiCisgICAgICAgICAgICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIGFudCAkdGFyZ2V0ICRuYW1lICRtZXRob2RzICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IHRlZSBzdGRvdXQudHh0ICk7IHRoZW4KKyAgICAgICAgICAgICAgICAgIHN0YXR1cz0iZmFpbHMiCisgICAgICAgICAgICAgICAgICBleGl0X2NvZGU9MQorICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZQorICAgICAgICAgICAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L3N0ZG91dC8ke3N0YXR1c30vJHtpfQorICAgICAgICAgICAgICAgIG1rZGlyIC1wICRkZXN0CisgICAgICAgICAgICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke1JFUEVBVEVEX0FOVF9URVNUX1RBUkdFVH0tJHtSRVBFQVRFRF9BTlRfVEVTVF9DTEFTU30udHh0CisKKyAgICAgICAgICAgICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXMKKyAgICAgICAgICAgICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgICAgICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9vdXRwdXQvJHtzdGF0dXN9LyR7aX0KKyAgICAgICAgICAgICAgICBta2RpciAtcCAkZGVzdAorICAgICAgICAgICAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gIiQobHMgJHNvdXJjZSkiIF1dOyB0aGVuCisgICAgICAgICAgICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvCisgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzCisgICAgICAgICAgICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncworICAgICAgICAgICAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L2xvZ3MvJHtzdGF0dXN9LyR7aX0KKyAgICAgICAgICAgICAgICBta2RpciAtcCAkZGVzdAorICAgICAgICAgICAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gIiQobHMgJHNvdXJjZSkiIF1dOyB0aGVuCisgICAgICAgICAgICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvCisgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZQorICAgICAgICAgICAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW4KKyAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgZG9uZQorCisgICAgICAgICAgICAgIChleGl0ICR7ZXhpdF9jb2RlfSkKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV9sYXJnZV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV9sYXJnZV93aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX2xhcmdlX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJlY2hvIFwiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFwiXG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aF92bm9kZXNfZmluYWwudHh0XG5cbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuamF2YSAtdmVyc2lvblxuY2Qgfi9jYXNzYW5kcmEtZHRlc3Rcbm1rZGlyIC1wIC90bXAvZHRlc3RcblxuZWNobyBcImVudjogJChlbnYpXCJcbmVjaG8gXCIqKiBkb25lIGVudlwiXG5ta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzXG4jIHdlIG5lZWQgdGhlIFwic2V0IC1vIHBpcGVmYWlsXCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWVcbmV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dGBcbmlmIFsgISAteiBcIiRTUExJVF9URVNUU1wiIF07IHRoZW5cbiAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfbGFyZ2Vfd2l0aF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2xhcmdlX3dpdGhfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9sYXJnZV93aXRoX3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2R0ZXN0c19sYXJnZV92bm9kZV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIFB5dGhvbiBEVGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0xBUkdFX0RURVNUU30gJGNvdW50IHRpbWVzIgorCisgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKworICAgICAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKworICAgICAgICAgICAgICB0ZXN0c19hcmc9JChlY2hvICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX07IHRoZW4KKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiB0cnVlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfdHJpZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0LXRyaWUpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC10cmllICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTFfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfZHRlc3RzX29mZmhlYXApKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcFxuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV9kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOAorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV9kdGVzdHNfb2ZmaGVhcC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9kdGVzdHNfb2ZmaGVhcAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXBfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9kdGVzdHNfbGFyZ2U6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV9sYXJnZV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAiZWNobyBcImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcIlxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuXG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmphdmEgLXZlcnNpb25cbmNkIH4vY2Fzc2FuZHJhLWR0ZXN0XG5ta2RpciAtcCAvdG1wL2R0ZXN0XG5cbmVjaG8gXCJlbnY6ICQoZW52KVwiXG5lY2hvIFwiKiogZG9uZSBlbnZcIlxubWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0c1xuIyB3ZSBuZWVkIHRoZSBcInNldCAtbyBwaXBlZmFpbFwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlXG5leHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRgXG5pZiBbICEgLXogXCIkU1BMSVRfVEVTVFNcIiBdOyB0aGVuXG4gIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD1cIkRFQlVHXCIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dFxuZWxzZVxuICBlY2hvIFwiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyXCJcbiAgKGV4aXQgMSlcbmZpXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfanZtX2R0ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBkaXN0cmlidXRlZCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L2Rpc3RyaWJ1dGVkLyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L2Rpc3RyaWJ1dGVkLzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgfCBncmVwIC12IHVwZ3JhZGUgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QuZGlzdHJpYnV0ZWQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QgICAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PWRpc3RyaWJ1dGVkIC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfcmVwZWF0ZWRfYW50X3Rlc3Q6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biByZXBlYXRlZCBKVW5pdCB0ZXN0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGlmIFsgIiR7UkVQRUFURURfQU5UX1RFU1RfQ0xBU1N9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIHV0ZXN0IGNsYXNzIG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCB1dGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9IiAtbGUgMCBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCB1dGVzdCBjb3VudCBpcyBsZXNzZXIgb3IgZXF1YWxzIHRoYW4gemVybywgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxzZQorCisgICAgICAgICAgICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLgorICAgICAgICAgICAgIyBTaW5jZSB3ZSBhcmUgcnVubmluZyB0aGUgc2FtZSB0ZXN0IG11bHRpcGxlIHRpbWVzIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIGBjaXJjbGVjaSB0ZXN0cyBzcGxpdGAuCisgICAgICAgICAgICBjb3VudD0kKCgke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfQU5UX1RFU1RfVEFSR0VUfSAke1JFUEVBVEVEX0FOVF9URVNUX0NMQVNTfSAke1JFUEVBVEVEX0FOVF9URVNUX01FVEhPRFN9ICR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9IHRpbWVzIgorCisgICAgICAgICAgICAgIHNldCAteAorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdGFyZ2V0PSR7UkVQRUFURURfQU5UX1RFU1RfVEFSR0VUfQorICAgICAgICAgICAgICBjbGFzc19wYXRoPSR7UkVQRUFURURfQU5UX1RFU1RfQ0xBU1N9CisgICAgICAgICAgICAgIGNsYXNzX25hbWU9IiR7Y2xhc3NfcGF0aCMjKi59IgorCisgICAgICAgICAgICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuCisgICAgICAgICAgICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuCisgICAgICAgICAgICAgIGlmIFtbICR0YXJnZXQgPT0gInRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1jZGMiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1jb21wcmVzc2lvbiIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LXRyaWUiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gImZxbHRvb2wtdGVzdCIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJsb25nLXRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAic3RyZXNzLXRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1zaW11bGF0b3ItZHRlc3QiIF1dOyB0aGVuCisgICAgICAgICAgICAgICAgbmFtZT0iLUR0ZXN0Lm5hbWU9JGNsYXNzX25hbWUiCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBuYW1lPSItRHRlc3QubmFtZT0kY2xhc3NfcGF0aCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbAorICAgICAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0FOVF9URVNUX01FVEhPRFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgICAgICBtZXRob2RzPSIiCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtZXRob2RzPSItRHRlc3QubWV0aG9kcz0ke1JFUEVBVEVEX0FOVF9URVNUX01FVEhPRFN9IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfQU5UX1RFU1RfVk5PREVTfTsgdGhlbgorICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgUnVuIHRoZSB0ZXN0IHRhcmdldCBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZCBjb2xsZWN0aW5nIHRoZSBleGl0IGNvZGUsCisgICAgICAgICAgICAgICMgc3RvcHBpbmcgdGhlIGl0ZXJhdGlvbiBvbmx5IGlmIHN0b3Bfb25fZmFpbHVyZSBpcyBzZXQuCisgICAgICAgICAgICAgIGV4aXRfY29kZT0iJD8iCisgICAgICAgICAgICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG8KKworICAgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgdGVzdCBpdGVyYXRpb24gJGkgb2YgJGNvdW50IgorCisgICAgICAgICAgICAgICAgIyBydW4gdGhlIHRlc3QKKyAgICAgICAgICAgICAgICBzdGF0dXM9InBhc3NlcyIKKyAgICAgICAgICAgICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgYW50ICR0YXJnZXQgJG5hbWUgJG1ldGhvZHMgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgdGVlIHN0ZG91dC50eHQgKTsgdGhlbgorICAgICAgICAgICAgICAgICAgc3RhdHVzPSJmYWlscyIKKyAgICAgICAgICAgICAgICAgIGV4aXRfY29kZT0xCisgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlCisgICAgICAgICAgICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9CisgICAgICAgICAgICAgICAgbWtkaXIgLXAgJGRlc3QKKyAgICAgICAgICAgICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7UkVQRUFURURfQU5UX1RFU1RfVEFSR0VUfS0ke1JFUEVBVEVEX0FOVF9URVNUX0NMQVNTfS50eHQKKworICAgICAgICAgICAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlcworICAgICAgICAgICAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dAorICAgICAgICAgICAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L291dHB1dC8ke3N0YXR1c30vJHtpfQorICAgICAgICAgICAgICAgIG1rZGlyIC1wICRkZXN0CisgICAgICAgICAgICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiAiJChscyAkc291cmNlKSIgXV07IHRoZW4KKyAgICAgICAgICAgICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC8KKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXMKKyAgICAgICAgICAgICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzCisgICAgICAgICAgICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3QvbG9ncy8ke3N0YXR1c30vJHtpfQorICAgICAgICAgICAgICAgIG1rZGlyIC1wICRkZXN0CisgICAgICAgICAgICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiAiJChscyAkc291cmNlKSIgXV07IHRoZW4KKyAgICAgICAgICAgICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC8KKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlCisgICAgICAgICAgICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlbgorICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICBkb25lCisKKyAgICAgICAgICAgICAgKGV4aXQgJHtleGl0X2NvZGV9KQorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV93aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV93aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aG91dF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN19idWlsZDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tZGVwdGggMSAtLWJyYW5jaCAkQ0lSQ0xFX0JSQU5DSCBodHRwczovL2dpdGh1Yi5jb20vJENJUkNMRV9QUk9KRUNUX1VTRVJOQU1FLyRDSVJDTEVfUFJPSkVDVF9SRVBPTkFNRS5naXQgfi9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQnVpbGQgQ2Fzc2FuZHJhCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhCisgICAgICAgICAgIyBMb29wIHRvIHByZXZlbnQgZmFpbHVyZSBkdWUgdG8gbWF2ZW4tYW50LXRhc2tzIG5vdCBkb3dubG9hZGluZyBhIGphci4uCisgICAgICAgICAgZm9yIHggaW4gJChzZXEgMSAzKTsgZG8KKyAgICAgICAgICAgICAgJHtBTlRfSE9NRX0vYmluL2FudCBjbGVhbiByZWFsY2xlYW4gamFyCisgICAgICAgICAgICAgIFJFVFVSTj0iJD8iCisgICAgICAgICAgICAgIGlmIFsgIiR7UkVUVVJOfSIgLWVxICIwIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICBmaQorICAgICAgICAgIGRvbmUKKyAgICAgICAgICAjIEV4aXQsIGlmIHdlIGRpZG4ndCBidWlsZCBzdWNjZXNzZnVsbHkKKyAgICAgICAgICBpZiBbICIke1JFVFVSTn0iIC1uZSAiMCIgXTsgdGhlbgorICAgICAgICAgICAgICBlY2hvICJCdWlsZCBmYWlsZWQgd2l0aCBleGl0IGNvZGU6ICR7UkVUVVJOfSIKKyAgICAgICAgICAgICAgZXhpdCAke1JFVFVSTn0KKyAgICAgICAgICBmaQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBlY2xpcHNlLXdhcm5pbmdzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhCisgICAgICAgICAgYW50IGVjbGlwc2Utd2FybmluZ3MKKyAgICAtIHBlcnNpc3RfdG9fd29ya3NwYWNlOgorICAgICAgICByb290OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgICAgcGF0aHM6CisgICAgICAgIC0gY2Fzc2FuZHJhCisgICAgICAgIC0gLm0yCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c19jZGM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdC1jZGMpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC1jZGMgICAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PXVuaXQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfY2RjX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY2RjXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY2RjICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfZnFsdG9vbDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzIChmcWx0b29sLXRlc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCBmcWx0b29sLXRlc3QgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9kdGVzdHNfb2ZmaGVhcF9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIFB5dGhvbiBEVGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0RURVNUU30gJGNvdW50IHRpbWVzIgorCisgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKworICAgICAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKworICAgICAgICAgICAgICB0ZXN0c19hcmc9JChlY2hvICR7UkVQRUFURURfRFRFU1RTfSB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX07IHRoZW4KKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiB0cnVlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgJHRlc3RzX2FyZyB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfanZtX2R0ZXN0c192bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBkaXN0cmlidXRlZCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L2Rpc3RyaWJ1dGVkLyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L2Rpc3RyaWJ1dGVkLzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgfCBncmVwIC12IHVwZ3JhZGUgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QuZGlzdHJpYnV0ZWQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QgLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2JyAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PWRpc3RyaWJ1dGVkIC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX2xvbmc6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAobG9uZy10ZXN0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgbG9uZy10ZXN0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfdW5pdF90ZXN0c19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBTaW11bGF0b3IgVGVzdHMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3Qtc2ltdWxhdG9yLWR0ZXN0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAzMG0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX3N0cmVzczoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzIChzdHJlc3MtdGVzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHN0cmVzcy10ZXN0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX2NkY19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNkY1xudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWNkYyAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfZHRlc3RzX3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X3dpdGhfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBub3QgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD1cIkRFQlVHXCIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN193aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dFxuZWxzZVxuICBlY2hvIFwiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyXCJcbiAgKGV4aXQgMSlcbmZpXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfZHRlc3RzX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgICR0ZXN0c19hcmcgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0LWNvbXByZXNzaW9uKQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnVuaXQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QtY29tcHJlc3Npb24gICAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PXVuaXQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXRyaWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC10cmllICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX2R0ZXN0c19vZmZoZWFwKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcCA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfZHRlc3RzX29mZmhlYXAueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXAKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV9kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfZHRlc3RzX29mZmhlYXApKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcFxuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV9kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMQorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV9kdGVzdHNfb2ZmaGVhcC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9kdGVzdHNfb2ZmaGVhcAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXBfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfdHJpZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0LXRyaWUpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC10cmllICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfZHRlc3RzX2xhcmdlX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfY29tcHJlc3Npb25fcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1jb21wcmVzc2lvblxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWNvbXByZXNzaW9uICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV93aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV93aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfZnFsdG9vbDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzIChmcWx0b29sLXRlc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCBmcWx0b29sLXRlc3QgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X2xhcmdlX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X2xhcmdlX3dpdGhfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfbGFyZ2Vfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRoX3Zub2Rlc19maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD1cIkRFQlVHXCIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN19sYXJnZV93aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dFxuZWxzZVxuICBlY2hvIFwiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyXCJcbiAgKGV4aXQgMSlcbmZpXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfbGFyZ2Vfd2l0aF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2xhcmdlX3dpdGhfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfZHRlc3RzX29mZmhlYXA6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX2R0ZXN0c19vZmZoZWFwKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgbm90IGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcCB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcC50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJlY2hvIFwiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFwiXG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG5cbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuamF2YSAtdmVyc2lvblxuY2Qgfi9jYXNzYW5kcmEtZHRlc3Rcbm1rZGlyIC1wIC90bXAvZHRlc3RcblxuZWNobyBcImVudjogJChlbnYpXCJcbmVjaG8gXCIqKiBkb25lIGVudlwiXG5ta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzXG4jIHdlIG5lZWQgdGhlIFwic2V0IC1vIHBpcGVmYWlsXCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWVcbmV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dGBcbmlmIFsgISAteiBcIiRTUExJVF9URVNUU1wiIF07IHRoZW5cbiAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPVwiREVCVUdcIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajExX2R0ZXN0c19vZmZoZWFwLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0XG5lbHNlXG4gIGVjaG8gXCJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXJcIlxuICAoZXhpdCAxKVxuZmlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9kdGVzdHNfb2ZmaGVhcAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXBfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTFfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfd2l0aF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHQKKworICAgICAgICAgIHNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44CisgICAgICAgICAgZmkKKworICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKyAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0YAorICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfd2l0aF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX3RyaWVfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC10cmllXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtdHJpZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfc2ltdWxhdG9yX2R0ZXN0c19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXNpbXVsYXRvci1kdGVzdFxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXNpbXVsYXRvci1kdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfanZtX2R0ZXN0c19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNoX2R0ZXN0c19weTM4X29mZmhlYXA6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X2R0ZXN0c19vZmZoZWFwKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcCA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOCcgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfZHRlc3RzX29mZmhlYXAueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfZHRlc3RzX29mZmhlYXAKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2R0ZXN0c19vZmZoZWFwX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfY3Fsc2hsaWJfdGVzdHM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gY3Fsc2hsaWIgVW5pdCBUZXN0cworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYS8KKyAgICAgICAgICAuL3B5bGliL2Nhc3NhbmRyYS1jcWxzaC10ZXN0cy5zaCAkKHB3ZCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9weWxpYgorICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTFfdm5vZGU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfd2l0aF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHQKKworICAgICAgICAgIHNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMScgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExCisgICAgICAgICAgZmkKKworICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKyAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0YAorICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfd2l0aF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnVuaXQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X3dpdGhfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN193aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajE3X3dpdGhfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRoX3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN193aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExJyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN193aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9qdm1fZHRlc3RzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIGRpc3RyaWJ1dGVkIFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiB8IGdyZXAgLXYgdXBncmFkZSA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC5kaXN0cmlidXRlZC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdCAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9ZGlzdHJpYnV0ZWQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfc3RyZXNzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHN0cmVzcy10ZXN0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgc3RyZXNzLXRlc3QgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz10cnVlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9idWlsZDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tZGVwdGggMSAtLWJyYW5jaCAkQ0lSQ0xFX0JSQU5DSCBodHRwczovL2dpdGh1Yi5jb20vJENJUkNMRV9QUk9KRUNUX1VTRVJOQU1FLyRDSVJDTEVfUFJPSkVDVF9SRVBPTkFNRS5naXQgfi9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQnVpbGQgQ2Fzc2FuZHJhCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhCisgICAgICAgICAgIyBMb29wIHRvIHByZXZlbnQgZmFpbHVyZSBkdWUgdG8gbWF2ZW4tYW50LXRhc2tzIG5vdCBkb3dubG9hZGluZyBhIGphci4uCisgICAgICAgICAgZm9yIHggaW4gJChzZXEgMSAzKTsgZG8KKyAgICAgICAgICAgICAgJHtBTlRfSE9NRX0vYmluL2FudCBjbGVhbiByZWFsY2xlYW4gamFyCisgICAgICAgICAgICAgIFJFVFVSTj0iJD8iCisgICAgICAgICAgICAgIGlmIFsgIiR7UkVUVVJOfSIgLWVxICIwIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICBmaQorICAgICAgICAgIGRvbmUKKyAgICAgICAgICAjIEV4aXQsIGlmIHdlIGRpZG4ndCBidWlsZCBzdWNjZXNzZnVsbHkKKyAgICAgICAgICBpZiBbICIke1JFVFVSTn0iIC1uZSAiMCIgXTsgdGhlbgorICAgICAgICAgICAgICBlY2hvICJCdWlsZCBmYWlsZWQgd2l0aCBleGl0IGNvZGU6ICR7UkVUVVJOfSIKKyAgICAgICAgICAgICAgZXhpdCAke1JFVFVSTn0KKyAgICAgICAgICBmaQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBlY2xpcHNlLXdhcm5pbmdzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhCisgICAgICAgICAgYW50IGVjbGlwc2Utd2FybmluZ3MKKyAgICAtIHBlcnNpc3RfdG9fd29ya3NwYWNlOgorICAgICAgICByb290OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgICAgcGF0aHM6CisgICAgICAgIC0gY2Fzc2FuZHJhCisgICAgICAgIC0gLm0yCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNobGliX3Rlc3RzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGNxbHNobGliIFVuaXQgVGVzdHMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEvCisgICAgICAgICAgLi9weWxpYi9jYXNzYW5kcmEtY3Fsc2gtdGVzdHMuc2ggJChwd2QpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvcHlsaWIKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfZHRlc3RzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV93aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBub3QgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfd2l0aG91dF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X2p2bV9kdGVzdHNfdm5vZGU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgZGlzdHJpYnV0ZWQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC9kaXN0cmlidXRlZC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC9kaXN0cmlidXRlZC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiIHwgZ3JlcCAtdiB1cGdyYWRlID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LmRpc3RyaWJ1dGVkLnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nIHx8IHRydWUpCisgICAgICAgICAgaWYgWyAteiAiJHRlc3RfdGltZW91dCIgXTsgdGhlbgorICAgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JykKKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCB0ZXN0Y2xhc3NsaXN0IC1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNicgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD1kaXN0cmlidXRlZCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNoX2R0ZXN0c19weTM4OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxN193aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOAorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN193aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRob3V0X3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aG91dF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfY2RjOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QtY2RjKQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnVuaXQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QtY2RjICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX2ZxbHRvb2xfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTH0gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9ZnFsdG9vbC10ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfZHRlc3RzX2xhcmdlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxN19sYXJnZV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN19sYXJnZV93aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRob3V0X3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN19sYXJnZV93aXRob3V0X3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX3VuaXRfdGVzdHNfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdHNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X3V0ZXN0c19sb25nOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKGxvbmctdGVzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IGxvbmctdGVzdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2R0ZXN0c192bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTFfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfd2l0aF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIG5vdCBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAiZWNobyBcImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRcIlxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuXG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmphdmEgLXZlcnNpb25cbmNkIH4vY2Fzc2FuZHJhLWR0ZXN0XG5ta2RpciAtcCAvdG1wL2R0ZXN0XG5cbmVjaG8gXCJlbnY6ICQoZW52KVwiXG5lY2hvIFwiKiogZG9uZSBlbnZcIlxubWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0c1xuIyB3ZSBuZWVkIHRoZSBcInNldCAtbyBwaXBlZmFpbFwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlXG5leHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRgXG5pZiBbICEgLXogXCIkU1BMSVRfVEVTVFNcIiBdOyB0aGVuXG4gIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPVwiREVCVUdcIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajExX3dpdGhfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0XG5lbHNlXG4gIGVjaG8gXCJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXJcIlxuICAoZXhpdCAxKVxuZmlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN19qdm1fZHRlc3RzX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfZHRlc3RzX29mZmhlYXA6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfZHRlc3RzX29mZmhlYXApKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBub3QgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcCA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfZHRlc3RzX29mZmhlYXAueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2R0ZXN0c19vZmZoZWFwCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN19kdGVzdHNfb2ZmaGVhcF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2R0ZXN0c19sYXJnZV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIFB5dGhvbiBEVGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0xBUkdFX0RURVNUU30gJGNvdW50IHRpbWVzIgorCisgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKworICAgICAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKworICAgICAgICAgICAgICB0ZXN0c19hcmc9JChlY2hvICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX07IHRoZW4KKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdXBncmFkZV9hcmc9Ii0tZXhlY3V0ZS11cGdyYWRlLXRlc3RzIC0tdXBncmFkZS10YXJnZXQtdmVyc2lvbi1vbmx5IC0tdXBncmFkZS12ZXJzaW9uLXNlbGVjdGlvbiBhbGwiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0ICR2bm9kZXNfYXJncyAtLWNvdW50PSRjb3VudCAkc3RvcF9vbl9mYWlsdXJlX2FyZyAkdXBncmFkZV9hcmcgLS1sb2ctY2xpLWxldmVsPURFQlVHIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyIC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgJHRlc3RzX2FyZyB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX2xvbmdfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfTE9OR30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9bG9uZy10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBsb25nLXRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfbG9uZ19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU19MT05HfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1sb25nLXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGxvbmctdGVzdHNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKK3dvcmtmbG93czoKKyAgdmVyc2lvbjogMgorICBqYXZhMTFfc2VwYXJhdGVfdGVzdHM6CisgICAgam9iczoKKyAgICAtIHN0YXJ0X2oxMV9idWlsZDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9idWlsZDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdW5pdF90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91bml0X3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfdW5pdF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2p2bV9kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfanZtX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2p2bV9kdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9qdm1fZHRlc3RzX3Zub2RlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19qdm1fZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHNfdm5vZGUKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3NpbXVsYXRvcl9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9zaW11bGF0b3JfZHRlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaGxpYl90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaGxpYl9jeXRob25fdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNobGliX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNobGliX2N5dGhvbl90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3VuaXRfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdW5pdF90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3VuaXRfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfbG9uZzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfbG9uZzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19sb25nCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2xvbmc6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2xvbmc6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfbG9uZworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c19jZGM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2NkYzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19jZGMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfY2RjOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19jZGM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfY2RjCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19jb21wcmVzc2lvbgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfY29tcHJlc3Npb24KKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfdHJpZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19zdHJlc3MKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3RyZXNzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3RyZXNzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfZnFsdG9vbAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19mcWx0b29sOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19mcWx0b29sOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2ZxbHRvb2wKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2R0ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX3Zub2RlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX3Zub2RlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2R0ZXN0c19sYXJnZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9kdGVzdHNfbGFyZ2U6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2UKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlX3Zub2RlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19sYXJnZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2Vfdm5vZGUKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzODoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTMxMV9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTE6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4X29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgIGphdmExMV9wcmUtY29tbWl0X3Rlc3RzOgorICAgIGpvYnM6CisgICAgLSBzdGFydF9wcmUtY29tbWl0X3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2J1aWxkOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9wcmUtY29tbWl0X3Rlc3RzCisgICAgLSBqMTFfdW5pdF90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfanZtX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfanZtX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdW5pdF90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfbG9uZzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfbG9uZzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2xvbmcKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfbG9uZzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2xvbmcKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19jZGM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2NkYzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2NkYworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3V0ZXN0c19jZGM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jZGMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2NvbXByZXNzaW9uCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX3N0cmVzcworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19zdHJlc3MKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19mcWx0b29sOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19mcWx0b29sOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfZnFsdG9vbAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3V0ZXN0c19mcWx0b29sOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfZnFsdG9vbAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2R0ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2U6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfZHRlc3RzX2xhcmdlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19sYXJnZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTM4OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTE6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTFfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2NxbHNoX2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX2R0ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX2R0ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTE6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICBqYXZhMTdfc2VwYXJhdGVfdGVzdHM6CisgICAgam9iczoKKyAgICAtIHN0YXJ0X2oxN19idWlsZDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19idWlsZDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdW5pdF90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191bml0X3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdW5pdF90ZXN0cworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfanZtX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzX3Zub2RlCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaGxpYl90ZXN0cworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaGxpYl9jeXRob25fdGVzdHMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX3Zub2RlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c192bm9kZQorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZV92bm9kZQorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTE6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19sb25nOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19sb25nOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2xvbmcKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfY2RjOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19jZGM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfY2RjCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jb21wcmVzc2lvbgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3RyZXNzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3RyZXNzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfZnFsdG9vbAorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnkKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgamF2YTE3X3ByZS1jb21taXRfdGVzdHM6CisgICAgam9iczoKKyAgICAtIHN0YXJ0X3ByZS1jb21taXRfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfYnVpbGQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3ByZS1jb21taXRfdGVzdHMKKyAgICAtIGoxN191bml0X3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19qdm1fZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2UKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2UKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzODoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4X29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMV9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXAKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19sb25nOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19sb25nOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfbG9uZworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX2NkYzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfY2RjOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfY2RjCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfY29tcHJlc3Npb24KKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfdHJpZQorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfc3RyZXNzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2ZxbHRvb2wKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeQorICAgICAgICAtIGoxN19idWlsZApkaWZmIC0tZ2l0IGEvLmNpcmNsZWNpL2NvbmZpZ18xMV9hbmRfMTcueW1sLkZSRUUgYi8uY2lyY2xlY2kvY29uZmlnXzExX2FuZF8xNy55bWwuRlJFRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDBlNzdlCi0tLSAvZGV2L251bGwKKysrIGIvLmNpcmNsZWNpL2NvbmZpZ18xMV9hbmRfMTcueW1sLkZSRUUKQEAgLTAsMCArMSw5NTYxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit2ZXJzaW9uOiAyCitqb2JzOgorICBqMTdfZHRlc3RzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X3dpdGhvdXRfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIG5vdCBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAiZWNobyBcImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHRcIlxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuXG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmphdmEgLXZlcnNpb25cbmNkIH4vY2Fzc2FuZHJhLWR0ZXN0XG5ta2RpciAtcCAvdG1wL2R0ZXN0XG5cbmVjaG8gXCJlbnY6ICQoZW52KVwiXG5lY2hvIFwiKiogZG9uZSBlbnZcIlxubWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0c1xuIyB3ZSBuZWVkIHRoZSBcInNldCAtbyBwaXBlZmFpbFwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlXG5leHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHRgXG5pZiBbICEgLXogXCIkU1BMSVRfVEVTVFNcIiBdOyB0aGVuXG4gIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD1cIkRFQlVHXCIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN193aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dFxuZWxzZVxuICBlY2hvIFwiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyXCJcbiAgKGV4aXQgMSlcbmZpXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aG91dF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhvdXRfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGNxbHNobGliIFVuaXQgVGVzdHMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgZXhwb3J0IGN5dGhvbj0ieWVzIgorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhLworICAgICAgICAgIC4vcHlsaWIvY2Fzc2FuZHJhLWNxbHNoLXRlc3RzLnNoICQocHdkKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL3B5bGliCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNoX2R0ZXN0c19weTMxMV9vZmZoZWFwOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X2R0ZXN0c19vZmZoZWFwKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcCA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExJyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfZHRlc3RzX29mZmhlYXAueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfZHRlc3RzX29mZmhlYXAKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2R0ZXN0c19vZmZoZWFwX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfanZtX2R0ZXN0c192bm9kZV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9dHJ1ZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX2ZxbHRvb2xfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTH0gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9ZnFsdG9vbC10ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGNxbHNobGliIFVuaXQgVGVzdHMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgZXhwb3J0IGN5dGhvbj0ieWVzIgorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhLworICAgICAgICAgIC4vcHlsaWIvY2Fzc2FuZHJhLWNxbHNoLXRlc3RzLnNoICQocHdkKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL3B5bGliCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNoX2R0ZXN0c19weTNfb2ZmaGVhcDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfZHRlc3RzX29mZmhlYXApKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcFxuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN19kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN19kdGVzdHNfb2ZmaGVhcC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfZHRlc3RzX29mZmhlYXBfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfY29tcHJlc3Npb246CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdC1jb21wcmVzc2lvbikKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC51bml0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nIHx8IHRydWUpCisgICAgICAgICAgaWYgWyAteiAiJHRlc3RfdGltZW91dCIgXTsgdGhlbgorICAgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JykKKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCB0ZXN0Y2xhc3NsaXN0LWNvbXByZXNzaW9uICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfdm5vZGU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X3dpdGhfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN193aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOAorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajE3X3dpdGhfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRoX3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2R0ZXN0c192bm9kZV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIHRydWU7IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSItLWV4ZWN1dGUtdXBncmFkZS10ZXN0cyAtLXVwZ3JhZGUtdGFyZ2V0LXZlcnNpb24tb25seSAtLXVwZ3JhZGUtdmVyc2lvbi1zZWxlY3Rpb24gYWxsIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAkdm5vZGVzX2FyZ3MgLS1jb3VudD0kY291bnQgJHN0b3Bfb25fZmFpbHVyZV9hcmcgJHVwZ3JhZGVfYXJnIC0tbG9nLWNsaS1sZXZlbD1ERUJVRyAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHQueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAgJHRlc3RzX2FyZyB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfZHRlc3RzX29mZmhlYXBfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biByZXBlYXRlZCBQeXRob24gRFRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGlmIFsgIiR7UkVQRUFURURfRFRFU1RTfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBuYW1lIGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IiAtbGUgMCBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBpcyBsZXNzZXIgb3IgZXF1YWxzIHRoYW4gemVybywgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxzZQorCisgICAgICAgICAgICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLgorICAgICAgICAgICAgIyBTaW5jZSB3ZSBhcmUgcnVubmluZyB0aGUgc2FtZSB0ZXN0IG11bHRpcGxlIHRpbWVzIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIGBjaXJjbGVjaSB0ZXN0cyBzcGxpdGAuCisgICAgICAgICAgICBjb3VudD0kKCgke1JFUEVBVEVEX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpCisgICAgICAgICAgICBpZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlbgorICAgICAgICAgICAgICBjb3VudD0kKChjb3VudCsxKSkKKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgIGlmICgoJGNvdW50IDw9IDApKTsgdGhlbgorICAgICAgICAgICAgICBlY2hvICJObyB0ZXN0cyB0byBydW4gaW4gdGhpcyBydW5uZXIiCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgJHtSRVBFQVRFRF9EVEVTVFN9ICRjb3VudCB0aW1lcyIKKworICAgICAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisKKyAgICAgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisKKyAgICAgICAgICAgICAgdGVzdHNfYXJnPSQoZWNobyAke1JFUEVBVEVEX0RURVNUU30gfCBzZWQgLWUgInMvLC8gL2ciKQorCisgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9OyB0aGVuCisgICAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iLXgiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9IiIKKyAgICAgICAgICAgICAgaWYgdHJ1ZTsgdGhlbgorICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdXBncmFkZV9hcmc9Ii0tZXhlY3V0ZS11cGdyYWRlLXRlc3RzIC0tdXBncmFkZS10YXJnZXQtdmVyc2lvbi1vbmx5IC0tdXBncmFkZS12ZXJzaW9uLXNlbGVjdGlvbiBhbGwiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0ICR2bm9kZXNfYXJncyAtLWNvdW50PSRjb3VudCAkc3RvcF9vbl9mYWlsdXJlX2FyZyAkdXBncmFkZV9hcmcgLS1sb2ctY2xpLWxldmVsPURFQlVHIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyIC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzICR0ZXN0c19hcmcgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2R0ZXN0c192bm9kZV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIFB5dGhvbiBEVGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0RURVNUU30gJGNvdW50IHRpbWVzIgorCisgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKworICAgICAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKworICAgICAgICAgICAgICB0ZXN0c19hcmc9JChlY2hvICR7UkVQRUFURURfRFRFU1RTfSB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX07IHRoZW4KKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiB0cnVlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgICR0ZXN0c19hcmcgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC51bml0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nIHx8IHRydWUpCisgICAgICAgICAgaWYgWyAteiAiJHRlc3RfdGltZW91dCIgXTsgdGhlbgorICAgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JykKKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCB0ZXN0Y2xhc3NsaXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkgICAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PXVuaXQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN19jcWxzaF9kdGVzdHNfcHkzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxN193aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN193aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRob3V0X3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aG91dF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfc3RyZXNzX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU19TVFJFU1N9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXN0cmVzcy10ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgc3RyZXNzLXRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfdW5pdF90ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnVuaXQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QgICAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PXVuaXQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTE6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfd2l0aG91dF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExJyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfd2l0aG91dF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aG91dF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIHRydWU7IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSItLWV4ZWN1dGUtdXBncmFkZS10ZXN0cyAtLXVwZ3JhZGUtdGFyZ2V0LXZlcnNpb24tb25seSAtLXVwZ3JhZGUtdmVyc2lvbi1zZWxlY3Rpb24gYWxsIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAkdm5vZGVzX2FyZ3MgLS1jb3VudD0kY291bnQgJHN0b3Bfb25fZmFpbHVyZV9hcmcgJHVwZ3JhZGVfYXJnIC0tbG9nLWNsaS1sZXZlbD1ERUJVRyAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHQueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzICR0ZXN0c19hcmcgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2R0ZXN0c19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgICR0ZXN0c19hcmcgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX3VuaXRfdGVzdHM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC51bml0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nIHx8IHRydWUpCisgICAgICAgICAgaWYgWyAteiAiJHRlc3RfdGltZW91dCIgXTsgdGhlbgorICAgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JykKKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCB0ZXN0Y2xhc3NsaXN0ICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X3dpdGhvdXRfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajE3X3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHQKKworICAgICAgICAgIHNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMScgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExCisgICAgICAgICAgZmkKKworICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKyAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0YAorICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajE3X3dpdGhvdXRfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhvdXRfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRob3V0X3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNoX2R0ZXN0c19weTM4OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV93aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOAorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV93aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aG91dF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfc3RyZXNzX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU19TVFJFU1N9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXN0cmVzcy10ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgc3RyZXNzLXRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX2NvbXByZXNzaW9uX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY29tcHJlc3Npb25cbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jb21wcmVzc2lvbiAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfcmVwZWF0ZWRfYW50X3Rlc3Q6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biByZXBlYXRlZCBKVW5pdCB0ZXN0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGlmIFsgIiR7UkVQRUFURURfQU5UX1RFU1RfQ0xBU1N9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIHV0ZXN0IGNsYXNzIG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCB1dGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9IiAtbGUgMCBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCB1dGVzdCBjb3VudCBpcyBsZXNzZXIgb3IgZXF1YWxzIHRoYW4gemVybywgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxzZQorCisgICAgICAgICAgICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLgorICAgICAgICAgICAgIyBTaW5jZSB3ZSBhcmUgcnVubmluZyB0aGUgc2FtZSB0ZXN0IG11bHRpcGxlIHRpbWVzIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIGBjaXJjbGVjaSB0ZXN0cyBzcGxpdGAuCisgICAgICAgICAgICBjb3VudD0kKCgke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfQU5UX1RFU1RfVEFSR0VUfSAke1JFUEVBVEVEX0FOVF9URVNUX0NMQVNTfSAke1JFUEVBVEVEX0FOVF9URVNUX01FVEhPRFN9ICR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9IHRpbWVzIgorCisgICAgICAgICAgICAgIHNldCAteAorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdGFyZ2V0PSR7UkVQRUFURURfQU5UX1RFU1RfVEFSR0VUfQorICAgICAgICAgICAgICBjbGFzc19wYXRoPSR7UkVQRUFURURfQU5UX1RFU1RfQ0xBU1N9CisgICAgICAgICAgICAgIGNsYXNzX25hbWU9IiR7Y2xhc3NfcGF0aCMjKi59IgorCisgICAgICAgICAgICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuCisgICAgICAgICAgICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuCisgICAgICAgICAgICAgIGlmIFtbICR0YXJnZXQgPT0gInRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1jZGMiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1jb21wcmVzc2lvbiIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LXRyaWUiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gImZxbHRvb2wtdGVzdCIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJsb25nLXRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAic3RyZXNzLXRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1zaW11bGF0b3ItZHRlc3QiIF1dOyB0aGVuCisgICAgICAgICAgICAgICAgbmFtZT0iLUR0ZXN0Lm5hbWU9JGNsYXNzX25hbWUiCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBuYW1lPSItRHRlc3QubmFtZT0kY2xhc3NfcGF0aCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbAorICAgICAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0FOVF9URVNUX01FVEhPRFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgICAgICBtZXRob2RzPSIiCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtZXRob2RzPSItRHRlc3QubWV0aG9kcz0ke1JFUEVBVEVEX0FOVF9URVNUX01FVEhPRFN9IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfQU5UX1RFU1RfVk5PREVTfTsgdGhlbgorICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgUnVuIHRoZSB0ZXN0IHRhcmdldCBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZCBjb2xsZWN0aW5nIHRoZSBleGl0IGNvZGUsCisgICAgICAgICAgICAgICMgc3RvcHBpbmcgdGhlIGl0ZXJhdGlvbiBvbmx5IGlmIHN0b3Bfb25fZmFpbHVyZSBpcyBzZXQuCisgICAgICAgICAgICAgIGV4aXRfY29kZT0iJD8iCisgICAgICAgICAgICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG8KKworICAgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgdGVzdCBpdGVyYXRpb24gJGkgb2YgJGNvdW50IgorCisgICAgICAgICAgICAgICAgIyBydW4gdGhlIHRlc3QKKyAgICAgICAgICAgICAgICBzdGF0dXM9InBhc3NlcyIKKyAgICAgICAgICAgICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgYW50ICR0YXJnZXQgJG5hbWUgJG1ldGhvZHMgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgdGVlIHN0ZG91dC50eHQgKTsgdGhlbgorICAgICAgICAgICAgICAgICAgc3RhdHVzPSJmYWlscyIKKyAgICAgICAgICAgICAgICAgIGV4aXRfY29kZT0xCisgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlCisgICAgICAgICAgICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9CisgICAgICAgICAgICAgICAgbWtkaXIgLXAgJGRlc3QKKyAgICAgICAgICAgICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7UkVQRUFURURfQU5UX1RFU1RfVEFSR0VUfS0ke1JFUEVBVEVEX0FOVF9URVNUX0NMQVNTfS50eHQKKworICAgICAgICAgICAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlcworICAgICAgICAgICAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dAorICAgICAgICAgICAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L291dHB1dC8ke3N0YXR1c30vJHtpfQorICAgICAgICAgICAgICAgIG1rZGlyIC1wICRkZXN0CisgICAgICAgICAgICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiAiJChscyAkc291cmNlKSIgXV07IHRoZW4KKyAgICAgICAgICAgICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC8KKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXMKKyAgICAgICAgICAgICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzCisgICAgICAgICAgICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3QvbG9ncy8ke3N0YXR1c30vJHtpfQorICAgICAgICAgICAgICAgIG1rZGlyIC1wICRkZXN0CisgICAgICAgICAgICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiAiJChscyAkc291cmNlKSIgXV07IHRoZW4KKyAgICAgICAgICAgICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC8KKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlCisgICAgICAgICAgICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlbgorICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICBkb25lCisKKyAgICAgICAgICAgICAgKGV4aXQgJHtleGl0X2NvZGV9KQorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX2xhcmdlX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX2xhcmdlX3dpdGhfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfbGFyZ2Vfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aF92bm9kZXNfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlc19maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aF92bm9kZXNfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD1cIkRFQlVHXCIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV9sYXJnZV93aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dFxuZWxzZVxuICBlY2hvIFwiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyXCJcbiAgKGV4aXQgMSlcbmZpXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfbGFyZ2Vfd2l0aF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2xhcmdlX3dpdGhfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfZHRlc3RzX2xhcmdlX3Zub2RlX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIHRydWU7IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSItLWV4ZWN1dGUtdXBncmFkZS10ZXN0cyAtLXVwZ3JhZGUtdGFyZ2V0LXZlcnNpb24tb25seSAtLXVwZ3JhZGUtdmVyc2lvbi1zZWxlY3Rpb24gYWxsIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAkdm5vZGVzX2FyZ3MgLS1jb3VudD0kY291bnQgJHN0b3Bfb25fZmFpbHVyZV9hcmcgJHVwZ3JhZGVfYXJnIC0tbG9nLWNsaS1sZXZlbD1ERUJVRyAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHQueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzICR0ZXN0c19hcmcgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X3V0ZXN0c190cmllOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QtdHJpZSkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC51bml0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nIHx8IHRydWUpCisgICAgICAgICAgaWYgWyAteiAiJHRlc3RfdGltZW91dCIgXTsgdGhlbgorICAgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JykKKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCB0ZXN0Y2xhc3NsaXN0LXRyaWUgICAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PXVuaXQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF9vZmZoZWFwOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV9kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV9kdGVzdHNfb2ZmaGVhcCkqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcCB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcC50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHQKKworICAgICAgICAgIHNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44CisgICAgICAgICAgZmkKKworICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKyAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0YAorICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajExX2R0ZXN0c19vZmZoZWFwLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9kdGVzdHNfb2ZmaGVhcF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2R0ZXN0c19sYXJnZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJlY2hvIFwiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFwiXG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5cbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuamF2YSAtdmVyc2lvblxuY2Qgfi9jYXNzYW5kcmEtZHRlc3Rcbm1rZGlyIC1wIC90bXAvZHRlc3RcblxuZWNobyBcImVudjogJChlbnYpXCJcbmVjaG8gXCIqKiBkb25lIGVudlwiXG5ta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzXG4jIHdlIG5lZWQgdGhlIFwic2V0IC1vIHBpcGVmYWlsXCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWVcbmV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dGBcbmlmIFsgISAteiBcIiRTUExJVF9URVNUU1wiIF07IHRoZW5cbiAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPVwiREVCVUdcIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0XG5lbHNlXG4gIGVjaG8gXCJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXJcIlxuICAoZXhpdCAxKVxuZmlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9sYXJnZV93aXRob3V0X3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN19qdm1fZHRlc3RzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIGRpc3RyaWJ1dGVkIFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiB8IGdyZXAgLXYgdXBncmFkZSA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC5kaXN0cmlidXRlZC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdCAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9ZGlzdHJpYnV0ZWQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19yZXBlYXRlZF9hbnRfdGVzdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIEpVbml0IHRlc3QKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9BTlRfVEVTVF9DTEFTU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgdXRlc3QgY2xhc3MgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIHV0ZXN0IGNvdW50IGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIHV0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlbgorICAgICAgICAgICAgICBjb3VudD0kKChjb3VudCsxKSkKKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgIGlmICgoJGNvdW50IDw9IDApKTsgdGhlbgorICAgICAgICAgICAgICBlY2hvICJObyB0ZXN0cyB0byBydW4gaW4gdGhpcyBydW5uZXIiCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgJHtSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVR9ICR7UkVQRUFURURfQU5UX1RFU1RfQ0xBU1N9ICR7UkVQRUFURURfQU5UX1RFU1RfTUVUSE9EU30gJHtSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVH0gdGltZXMiCisKKyAgICAgICAgICAgICAgc2V0IC14CisgICAgICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB0YXJnZXQ9JHtSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVR9CisgICAgICAgICAgICAgIGNsYXNzX3BhdGg9JHtSRVBFQVRFRF9BTlRfVEVTVF9DTEFTU30KKyAgICAgICAgICAgICAgY2xhc3NfbmFtZT0iJHtjbGFzc19wYXRoIyMqLn0iCisKKyAgICAgICAgICAgICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC4KKyAgICAgICAgICAgICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC4KKyAgICAgICAgICAgICAgaWYgW1sgJHRhcmdldCA9PSAidGVzdCIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LWNkYyIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LWNvbXByZXNzaW9uIiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtdHJpZSIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAiZnFsdG9vbC10ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gImxvbmctdGVzdCIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJzdHJlc3MtdGVzdCIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LXNpbXVsYXRvci1kdGVzdCIgXV07IHRoZW4KKyAgICAgICAgICAgICAgICBuYW1lPSItRHRlc3QubmFtZT0kY2xhc3NfbmFtZSIKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG5hbWU9Ii1EdGVzdC5uYW1lPSRjbGFzc19wYXRoIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsCisgICAgICAgICAgICAgIGlmIFsgIiR7UkVQRUFURURfQU5UX1RFU1RfTUVUSE9EU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgICAgIG1ldGhvZHM9IiIKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1ldGhvZHM9Ii1EdGVzdC5tZXRob2RzPSR7UkVQRUFURURfQU5UX1RFU1RfTUVUSE9EU30iCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwKKyAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9IiIKKyAgICAgICAgICAgICAgaWYgJHtSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVN9OyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNiciCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgIyBSdW4gdGhlIHRlc3QgdGFyZ2V0IGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkIGNvbGxlY3RpbmcgdGhlIGV4aXQgY29kZSwKKyAgICAgICAgICAgICAgIyBzdG9wcGluZyB0aGUgaXRlcmF0aW9uIG9ubHkgaWYgc3RvcF9vbl9mYWlsdXJlIGlzIHNldC4KKyAgICAgICAgICAgICAgZXhpdF9jb2RlPSIkPyIKKyAgICAgICAgICAgICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkbworCisgICAgICAgICAgICAgICAgZWNobyAiUnVubmluZyB0ZXN0IGl0ZXJhdGlvbiAkaSBvZiAkY291bnQiCisKKyAgICAgICAgICAgICAgICAjIHJ1biB0aGUgdGVzdAorICAgICAgICAgICAgICAgIHN0YXR1cz0icGFzc2VzIgorICAgICAgICAgICAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBhbnQgJHRhcmdldCAkbmFtZSAkbWV0aG9kcyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCB0ZWUgc3Rkb3V0LnR4dCApOyB0aGVuCisgICAgICAgICAgICAgICAgICBzdGF0dXM9ImZhaWxzIgorICAgICAgICAgICAgICAgICAgZXhpdF9jb2RlPTEKKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGUKKyAgICAgICAgICAgICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9zdGRvdXQvJHtzdGF0dXN9LyR7aX0KKyAgICAgICAgICAgICAgICBta2RpciAtcCAkZGVzdAorICAgICAgICAgICAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHtSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVR9LSR7UkVQRUFURURfQU5UX1RFU1RfQ0xBU1N9LnR4dAorCisgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzCisgICAgICAgICAgICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgICAgICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvb3V0cHV0LyR7c3RhdHVzfS8ke2l9CisgICAgICAgICAgICAgICAgbWtkaXIgLXAgJGRlc3QKKyAgICAgICAgICAgICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uICIkKGxzICRzb3VyY2UpIiBdXTsgdGhlbgorICAgICAgICAgICAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0LworICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlcworICAgICAgICAgICAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgICAgICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9sb2dzLyR7c3RhdHVzfS8ke2l9CisgICAgICAgICAgICAgICAgbWtkaXIgLXAgJGRlc3QKKyAgICAgICAgICAgICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uICIkKGxzICRzb3VyY2UpIiBdXTsgdGhlbgorICAgICAgICAgICAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0LworICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmUKKyAgICAgICAgICAgICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuCisgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgIGRvbmUKKworICAgICAgICAgICAgICAoZXhpdCAke2V4aXRfY29kZX0pCisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNoX2R0ZXN0c19weTM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX3dpdGhvdXRfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHQKKworICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42CisgICAgICAgICAgZmkKKworICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKyAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0YAorICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajExX3dpdGhvdXRfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X2J1aWxkOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1kZXB0aCAxIC0tYnJhbmNoICRDSVJDTEVfQlJBTkNIIGh0dHBzOi8vZ2l0aHViLmNvbS8kQ0lSQ0xFX1BST0pFQ1RfVVNFUk5BTUUvJENJUkNMRV9QUk9KRUNUX1JFUE9OQU1FLmdpdCB+L2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBCdWlsZCBDYXNzYW5kcmEKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEKKyAgICAgICAgICAjIExvb3AgdG8gcHJldmVudCBmYWlsdXJlIGR1ZSB0byBtYXZlbi1hbnQtdGFza3Mgbm90IGRvd25sb2FkaW5nIGEgamFyLi4KKyAgICAgICAgICBmb3IgeCBpbiAkKHNlcSAxIDMpOyBkbworICAgICAgICAgICAgICAke0FOVF9IT01FfS9iaW4vYW50IGNsZWFuIHJlYWxjbGVhbiBqYXIKKyAgICAgICAgICAgICAgUkVUVVJOPSIkPyIKKyAgICAgICAgICAgICAgaWYgWyAiJHtSRVRVUk59IiAtZXEgIjAiIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgZG9uZQorICAgICAgICAgICMgRXhpdCwgaWYgd2UgZGlkbid0IGJ1aWxkIHN1Y2Nlc3NmdWxseQorICAgICAgICAgIGlmIFsgIiR7UkVUVVJOfSIgLW5lICIwIiBdOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIkJ1aWxkIGZhaWxlZCB3aXRoIGV4aXQgY29kZTogJHtSRVRVUk59IgorICAgICAgICAgICAgICBleGl0ICR7UkVUVVJOfQorICAgICAgICAgIGZpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGVjbGlwc2Utd2FybmluZ3MKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEKKyAgICAgICAgICBhbnQgZWNsaXBzZS13YXJuaW5ncworICAgIC0gcGVyc2lzdF90b193b3Jrc3BhY2U6CisgICAgICAgIHJvb3Q6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgICBwYXRoczoKKyAgICAgICAgLSBjYXNzYW5kcmEKKyAgICAgICAgLSAubTIKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX2NkYzoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0LWNkYykKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC51bml0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nIHx8IHRydWUpCisgICAgICAgICAgaWYgWyAteiAiJHRlc3RfdGltZW91dCIgXTsgdGhlbgorICAgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JykKKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCB0ZXN0Y2xhc3NsaXN0LWNkYyAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X3V0ZXN0c19jZGNfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1jZGNcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jZGMgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c19mcWx0b29sOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKGZxbHRvb2wtdGVzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2R0ZXN0c19vZmZoZWFwX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIHRydWU7IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSItLWV4ZWN1dGUtdXBncmFkZS10ZXN0cyAtLXVwZ3JhZGUtdGFyZ2V0LXZlcnNpb24tb25seSAtLXVwZ3JhZGUtdmVyc2lvbi1zZWxlY3Rpb24gYWxsIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAkdm5vZGVzX2FyZ3MgLS1jb3VudD0kY291bnQgJHN0b3Bfb25fZmFpbHVyZV9hcmcgJHVwZ3JhZGVfYXJnIC0tbG9nLWNsaS1sZXZlbD1ERUJVRyAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHQueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9qdm1fZHRlc3RzX3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIGRpc3RyaWJ1dGVkIFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiB8IGdyZXAgLXYgdXBncmFkZSA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC5kaXN0cmlidXRlZC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdCAtRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9ZGlzdHJpYnV0ZWQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfbG9uZzoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzIChsb25nLXRlc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCBsb25nLXRlc3QgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191bml0X3Rlc3RzX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFNpbXVsYXRvciBUZXN0cworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdC1zaW11bGF0b3ItZHRlc3QgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDMwbQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfc3RyZXNzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHN0cmVzcy10ZXN0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgc3RyZXNzLXRlc3QgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfY2RjX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY2RjXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY2RjICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN19kdGVzdHNfdm5vZGU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfd2l0aF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIG5vdCBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN193aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAiZWNobyBcImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRcIlxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuXG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmphdmEgLXZlcnNpb25cbmNkIH4vY2Fzc2FuZHJhLWR0ZXN0XG5ta2RpciAtcCAvdG1wL2R0ZXN0XG5cbmVjaG8gXCJlbnY6ICQoZW52KVwiXG5lY2hvIFwiKiogZG9uZSBlbnZcIlxubWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0c1xuIyB3ZSBuZWVkIHRoZSBcInNldCAtbyBwaXBlZmFpbFwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlXG5leHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRgXG5pZiBbICEgLXogXCIkU1BMSVRfVEVTVFNcIiBdOyB0aGVuXG4gIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPVwiREVCVUdcIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajE3X3dpdGhfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0XG5lbHNlXG4gIGVjaG8gXCJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXJcIlxuICAoZXhpdCAxKVxuZmlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9kdGVzdHNfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biByZXBlYXRlZCBQeXRob24gRFRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGlmIFsgIiR7UkVQRUFURURfRFRFU1RTfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBuYW1lIGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IiAtbGUgMCBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBpcyBsZXNzZXIgb3IgZXF1YWxzIHRoYW4gemVybywgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxzZQorCisgICAgICAgICAgICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLgorICAgICAgICAgICAgIyBTaW5jZSB3ZSBhcmUgcnVubmluZyB0aGUgc2FtZSB0ZXN0IG11bHRpcGxlIHRpbWVzIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIGBjaXJjbGVjaSB0ZXN0cyBzcGxpdGAuCisgICAgICAgICAgICBjb3VudD0kKCgke1JFUEVBVEVEX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpCisgICAgICAgICAgICBpZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlbgorICAgICAgICAgICAgICBjb3VudD0kKChjb3VudCsxKSkKKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgIGlmICgoJGNvdW50IDw9IDApKTsgdGhlbgorICAgICAgICAgICAgICBlY2hvICJObyB0ZXN0cyB0byBydW4gaW4gdGhpcyBydW5uZXIiCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgJHtSRVBFQVRFRF9EVEVTVFN9ICRjb3VudCB0aW1lcyIKKworICAgICAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisKKyAgICAgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisKKyAgICAgICAgICAgICAgdGVzdHNfYXJnPSQoZWNobyAke1JFUEVBVEVEX0RURVNUU30gfCBzZWQgLWUgInMvLC8gL2ciKQorCisgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9OyB0aGVuCisgICAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iLXgiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSItLWV4ZWN1dGUtdXBncmFkZS10ZXN0cyAtLXVwZ3JhZGUtdGFyZ2V0LXZlcnNpb24tb25seSAtLXVwZ3JhZGUtdmVyc2lvbi1zZWxlY3Rpb24gYWxsIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAkdm5vZGVzX2FyZ3MgLS1jb3VudD0kY291bnQgJHN0b3Bfb25fZmFpbHVyZV9hcmcgJHVwZ3JhZGVfYXJnIC0tbG9nLWNsaS1sZXZlbD1ERUJVRyAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHQueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAgJHRlc3RzX2FyZyB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QtY29tcHJlc3Npb24pCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC1jb21wcmVzc2lvbiAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtdHJpZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXRyaWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNoX2R0ZXN0c19weTNfb2ZmaGVhcDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTFfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfZHRlc3RzX29mZmhlYXApKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcFxuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV9kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV9kdGVzdHNfb2ZmaGVhcC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9kdGVzdHNfb2ZmaGVhcAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXBfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV9kdGVzdHNfb2ZmaGVhcCkqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcCB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcC50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHQKKworICAgICAgICAgIHNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMScgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExCisgICAgICAgICAgZmkKKworICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKyAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0YAorICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajExX2R0ZXN0c19vZmZoZWFwLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9kdGVzdHNfb2ZmaGVhcF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c190cmllOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QtdHJpZSkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC51bml0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nIHx8IHRydWUpCisgICAgICAgICAgaWYgWyAteiAiJHRlc3RfdGltZW91dCIgXTsgdGhlbgorICAgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JykKKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCB0ZXN0Y2xhc3NsaXN0LXRyaWUgICAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PXVuaXQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9kdGVzdHNfbGFyZ2VfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biByZXBlYXRlZCBQeXRob24gRFRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBuYW1lIGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9IiAtbGUgMCBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBpcyBsZXNzZXIgb3IgZXF1YWxzIHRoYW4gemVybywgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxzZQorCisgICAgICAgICAgICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLgorICAgICAgICAgICAgIyBTaW5jZSB3ZSBhcmUgcnVubmluZyB0aGUgc2FtZSB0ZXN0IG11bHRpcGxlIHRpbWVzIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIGBjaXJjbGVjaSB0ZXN0cyBzcGxpdGAuCisgICAgICAgICAgICBjb3VudD0kKCgke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpCisgICAgICAgICAgICBpZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlbgorICAgICAgICAgICAgICBjb3VudD0kKChjb3VudCsxKSkKKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgIGlmICgoJGNvdW50IDw9IDApKTsgdGhlbgorICAgICAgICAgICAgICBlY2hvICJObyB0ZXN0cyB0byBydW4gaW4gdGhpcyBydW5uZXIiCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9ICRjb3VudCB0aW1lcyIKKworICAgICAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisKKyAgICAgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisKKyAgICAgICAgICAgICAgdGVzdHNfYXJnPSQoZWNobyAke1JFUEVBVEVEX0xBUkdFX0RURVNUU30gfCBzZWQgLWUgInMvLC8gL2ciKQorCisgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9OyB0aGVuCisgICAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iLXgiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSItLWV4ZWN1dGUtdXBncmFkZS10ZXN0cyAtLXVwZ3JhZGUtdGFyZ2V0LXZlcnNpb24tb25seSAtLXVwZ3JhZGUtdmVyc2lvbi1zZWxlY3Rpb24gYWxsIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAkdm5vZGVzX2FyZ3MgLS1jb3VudD0kY291bnQgJHN0b3Bfb25fZmFpbHVyZV9hcmcgJHVwZ3JhZGVfYXJnIC0tbG9nLWNsaS1sZXZlbD1ERUJVRyAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHQueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzICR0ZXN0c19hcmcgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X3V0ZXN0c19jb21wcmVzc2lvbl9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNvbXByZXNzaW9uXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY29tcHJlc3Npb24gJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX3dpdGhfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajExX3dpdGhfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X3V0ZXN0c19mcWx0b29sOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKGZxbHRvb2wtdGVzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfbGFyZ2Vfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfbGFyZ2Vfd2l0aF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRoX3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRoX3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN19sYXJnZV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAiZWNobyBcImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRoX3Zub2Rlc19maW5hbC50eHRcIlxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuXG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmphdmEgLXZlcnNpb25cbmNkIH4vY2Fzc2FuZHJhLWR0ZXN0XG5ta2RpciAtcCAvdG1wL2R0ZXN0XG5cbmVjaG8gXCJlbnY6ICQoZW52KVwiXG5lY2hvIFwiKiogZG9uZSBlbnZcIlxubWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0c1xuIyB3ZSBuZWVkIHRoZSBcInNldCAtbyBwaXBlZmFpbFwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlXG5leHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRoX3Zub2Rlc19maW5hbC50eHRgXG5pZiBbICEgLXogXCIkU1BMSVRfVEVTVFNcIiBdOyB0aGVuXG4gIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPVwiREVCVUdcIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajE3X2xhcmdlX3dpdGhfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0XG5lbHNlXG4gIGVjaG8gXCJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXJcIlxuICAoZXhpdCAxKVxuZmlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN19sYXJnZV93aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9kdGVzdHNfb2ZmaGVhcDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTFfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfZHRlc3RzX29mZmhlYXApKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBub3QgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcCA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfZHRlc3RzX29mZmhlYXAueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9kdGVzdHNfb2ZmaGVhcF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV93aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOCcgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV93aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXRyaWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC10cmllICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9zaW11bGF0b3JfZHRlc3RzX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Qtc2ltdWxhdG9yLWR0ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Qtc2ltdWxhdG9yLWR0ZXN0ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9qdm1fZHRlc3RzX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfZHRlc3RzX29mZmhlYXApKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcFxuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN19kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOAorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN19kdGVzdHNfb2ZmaGVhcC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfZHRlc3RzX29mZmhlYXBfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19jcWxzaGxpYl90ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBjcWxzaGxpYiBVbml0IFRlc3RzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhLworICAgICAgICAgIC4vcHlsaWIvY2Fzc2FuZHJhLWNxbHNoLXRlc3RzLnNoICQocHdkKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL3B5bGliCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV93aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExJyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV93aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5ICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfY3Fsc2hfZHRlc3RzX3B5M192bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfd2l0aF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajE3X3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHQKKworICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42CisgICAgICAgICAgZmkKKworICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKyAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0YAorICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfd2l0aF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X3dpdGhfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN193aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMQorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajE3X3dpdGhfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRoX3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2p2bV9kdGVzdHM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgZGlzdHJpYnV0ZWQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC9kaXN0cmlidXRlZC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC9kaXN0cmlidXRlZC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiIHwgZ3JlcCAtdiB1cGdyYWRlID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LmRpc3RyaWJ1dGVkLnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nIHx8IHRydWUpCisgICAgICAgICAgaWYgWyAteiAiJHRlc3RfdGltZW91dCIgXTsgdGhlbgorICAgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JykKKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCB0ZXN0Y2xhc3NsaXN0ICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD1kaXN0cmlidXRlZCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X3V0ZXN0c19zdHJlc3M6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAoc3RyZXNzLXRlc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCBzdHJlc3MtdGVzdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2p2bV9kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfSlZNX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPXRydWVcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2J1aWxkOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1kZXB0aCAxIC0tYnJhbmNoICRDSVJDTEVfQlJBTkNIIGh0dHBzOi8vZ2l0aHViLmNvbS8kQ0lSQ0xFX1BST0pFQ1RfVVNFUk5BTUUvJENJUkNMRV9QUk9KRUNUX1JFUE9OQU1FLmdpdCB+L2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBCdWlsZCBDYXNzYW5kcmEKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEKKyAgICAgICAgICAjIExvb3AgdG8gcHJldmVudCBmYWlsdXJlIGR1ZSB0byBtYXZlbi1hbnQtdGFza3Mgbm90IGRvd25sb2FkaW5nIGEgamFyLi4KKyAgICAgICAgICBmb3IgeCBpbiAkKHNlcSAxIDMpOyBkbworICAgICAgICAgICAgICAke0FOVF9IT01FfS9iaW4vYW50IGNsZWFuIHJlYWxjbGVhbiBqYXIKKyAgICAgICAgICAgICAgUkVUVVJOPSIkPyIKKyAgICAgICAgICAgICAgaWYgWyAiJHtSRVRVUk59IiAtZXEgIjAiIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgZG9uZQorICAgICAgICAgICMgRXhpdCwgaWYgd2UgZGlkbid0IGJ1aWxkIHN1Y2Nlc3NmdWxseQorICAgICAgICAgIGlmIFsgIiR7UkVUVVJOfSIgLW5lICIwIiBdOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIkJ1aWxkIGZhaWxlZCB3aXRoIGV4aXQgY29kZTogJHtSRVRVUk59IgorICAgICAgICAgICAgICBleGl0ICR7UkVUVVJOfQorICAgICAgICAgIGZpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGVjbGlwc2Utd2FybmluZ3MKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEKKyAgICAgICAgICBhbnQgZWNsaXBzZS13YXJuaW5ncworICAgIC0gcGVyc2lzdF90b193b3Jrc3BhY2U6CisgICAgICAgIHJvb3Q6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgICBwYXRoczoKKyAgICAgICAgLSBjYXNzYW5kcmEKKyAgICAgICAgLSAubTIKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfY3Fsc2hsaWJfdGVzdHM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gY3Fsc2hsaWIgVW5pdCBUZXN0cworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYS8KKyAgICAgICAgICAuL3B5bGliL2Nhc3NhbmRyYS1jcWxzaC10ZXN0cy5zaCAkKHB3ZCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9weWxpYgorICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9kdGVzdHM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX3dpdGhvdXRfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIG5vdCBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAiZWNobyBcImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcIlxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuXG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmphdmEgLXZlcnNpb25cbmNkIH4vY2Fzc2FuZHJhLWR0ZXN0XG5ta2RpciAtcCAvdG1wL2R0ZXN0XG5cbmVjaG8gXCJlbnY6ICQoZW52KVwiXG5lY2hvIFwiKiogZG9uZSBlbnZcIlxubWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0c1xuIyB3ZSBuZWVkIHRoZSBcInNldCAtbyBwaXBlZmFpbFwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlXG5leHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRgXG5pZiBbICEgLXogXCIkU1BMSVRfVEVTVFNcIiBdOyB0aGVuXG4gIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD1cIkRFQlVHXCIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV93aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dFxuZWxzZVxuICBlY2hvIFwiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyXCJcbiAgKGV4aXQgMSlcbmZpXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aG91dF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfanZtX2R0ZXN0c192bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBkaXN0cmlidXRlZCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L2Rpc3RyaWJ1dGVkLyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L2Rpc3RyaWJ1dGVkLzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgfCBncmVwIC12IHVwZ3JhZGUgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QuZGlzdHJpYnV0ZWQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QgLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2JyAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PWRpc3RyaWJ1dGVkIC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzg6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X3dpdGhvdXRfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajE3X3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHQKKworICAgICAgICAgIHNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44CisgICAgICAgICAgZmkKKworICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKyAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0YAorICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajE3X3dpdGhvdXRfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhvdXRfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRob3V0X3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X3V0ZXN0c19jZGM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdC1jZGMpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC1jZGMgICAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PXVuaXQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfZnFsdG9vbF9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU19GUUxUT09MfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1mcWx0b29sLXRlc3RcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgZnFsdG9vbC10ZXN0ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19kdGVzdHNfbGFyZ2U6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN19sYXJnZV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAiZWNobyBcImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcIlxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuXG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmphdmEgLXZlcnNpb25cbmNkIH4vY2Fzc2FuZHJhLWR0ZXN0XG5ta2RpciAtcCAvdG1wL2R0ZXN0XG5cbmVjaG8gXCJlbnY6ICQoZW52KVwiXG5lY2hvIFwiKiogZG9uZSBlbnZcIlxubWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0c1xuIyB3ZSBuZWVkIHRoZSBcInNldCAtbyBwaXBlZmFpbFwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlXG5leHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRgXG5pZiBbICEgLXogXCIkU1BMSVRfVEVTVFNcIiBdOyB0aGVuXG4gIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD1cIkRFQlVHXCIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN19sYXJnZV93aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dFxuZWxzZVxuICBlY2hvIFwiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyXCJcbiAgKGV4aXQgMSlcbmZpXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfdW5pdF90ZXN0c19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX2xvbmc6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAobG9uZy10ZXN0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgbG9uZy10ZXN0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfZHRlc3RzX3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV93aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgbm90IGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJlY2hvIFwiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFwiXG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0XG5cbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuamF2YSAtdmVyc2lvblxuY2Qgfi9jYXNzYW5kcmEtZHRlc3Rcbm1rZGlyIC1wIC90bXAvZHRlc3RcblxuZWNobyBcImVudjogJChlbnYpXCJcbmVjaG8gXCIqKiBkb25lIGVudlwiXG5ta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzXG4jIHdlIG5lZWQgdGhlIFwic2V0IC1vIHBpcGVmYWlsXCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWVcbmV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dGBcbmlmIFsgISAteiBcIiRTUExJVF9URVNUU1wiIF07IHRoZW5cbiAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfd2l0aF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X2p2bV9kdGVzdHNfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfSlZNX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19kdGVzdHNfb2ZmaGVhcDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxN19kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN19kdGVzdHNfb2ZmaGVhcCkqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIG5vdCBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcFxuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN19kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAiZWNobyBcImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcIlxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuXG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmphdmEgLXZlcnNpb25cbmNkIH4vY2Fzc2FuZHJhLWR0ZXN0XG5ta2RpciAtcCAvdG1wL2R0ZXN0XG5cbmVjaG8gXCJlbnY6ICQoZW52KVwiXG5lY2hvIFwiKiogZG9uZSBlbnZcIlxubWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0c1xuIyB3ZSBuZWVkIHRoZSBcInNldCAtbyBwaXBlZmFpbFwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlXG5leHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRgXG5pZiBbICEgLXogXCIkU1BMSVRfVEVTVFNcIiBdOyB0aGVuXG4gIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD1cIkRFQlVHXCIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN19kdGVzdHNfb2ZmaGVhcC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dFxuZWxzZVxuICBlY2hvIFwiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyXCJcbiAgKGV4aXQgMSlcbmZpXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfZHRlc3RzX29mZmhlYXAKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2R0ZXN0c19vZmZoZWFwX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfZHRlc3RzX2xhcmdlX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfbG9uZ19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU19MT05HfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1sb25nLXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGxvbmctdGVzdHNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c19sb25nX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0xPTkd9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWxvbmctdGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgbG9uZy10ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAord29ya2Zsb3dzOgorICB2ZXJzaW9uOiAyCisgIGphdmExMV9zZXBhcmF0ZV90ZXN0czoKKyAgICBqb2JzOgorICAgIC0gc3RhcnRfajExX2J1aWxkOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2J1aWxkOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91bml0X3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3VuaXRfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV91bml0X3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfanZtX2R0ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9qdm1fZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfanZtX2R0ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2p2bV9kdGVzdHNfdm5vZGUKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2p2bV9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0c192bm9kZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3NpbXVsYXRvcl9kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX3NpbXVsYXRvcl9kdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNobGliX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNobGliX2N5dGhvbl90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2NxbHNobGliX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2NxbHNobGliX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hsaWJfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdW5pdF90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191bml0X3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdW5pdF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c19sb25nOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19sb25nOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX2xvbmcKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfbG9uZzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfbG9uZzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19sb25nCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX2NkYzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfY2RjOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX2NkYworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jZGM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NkYzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jZGMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX2NvbXByZXNzaW9uCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jb21wcmVzc2lvbgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c190cmllCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfc3RyZXNzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX3N0cmVzcworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zdHJlc3MKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19mcWx0b29sCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfZnFsdG9vbAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnkKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfZHRlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2R0ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2R0ZXN0c192bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfdm5vZGUKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2R0ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c192bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfdm5vZGUKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c19sYXJnZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2R0ZXN0c19sYXJnZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2Vfdm5vZGUKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZV92bm9kZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTM4OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTE6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTFfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTM4X29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzg6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgamF2YTExX3ByZS1jb21taXRfdGVzdHM6CisgICAgam9iczoKKyAgICAtIHN0YXJ0X3ByZS1jb21taXRfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfYnVpbGQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3ByZS1jb21taXRfdGVzdHMKKyAgICAtIGoxMV91bml0X3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9qdm1fZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19qdm1fZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191bml0X3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19sb25nOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19sb25nOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfbG9uZworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3V0ZXN0c19sb25nOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfbG9uZworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX2NkYzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfY2RjOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfY2RjCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX2NkYzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2NkYworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2NvbXByZXNzaW9uCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfY29tcHJlc3Npb24KKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfdHJpZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfdHJpZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfc3RyZXNzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX3N0cmVzcworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19mcWx0b29sCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19mcWx0b29sCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2R0ZXN0c19sYXJnZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9kdGVzdHNfbGFyZ2U6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2UKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2UKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5MzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5M192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzg6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzhfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfY3Fsc2hfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX2R0ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzg6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOF9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgIGphdmExN19zZXBhcmF0ZV90ZXN0czoKKyAgICBqb2JzOgorICAgIC0gc3RhcnRfajE3X2J1aWxkOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2J1aWxkOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191bml0X3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3VuaXRfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191bml0X3Rlc3RzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19qdm1fZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0cworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHNfdm5vZGUKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNobGliX3Rlc3RzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNobGliX2N5dGhvbl90ZXN0cworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX3Zub2RlCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2UKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlX3Zub2RlCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzg6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXAKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOF9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXAKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2xvbmc6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2xvbmc6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfbG9uZworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jZGM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NkYzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jZGMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NvbXByZXNzaW9uCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfdHJpZQorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zdHJlc3MKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19mcWx0b29sCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeQorICAgICAgICAtIGoxN19idWlsZAorICBqYXZhMTdfcHJlLWNvbW1pdF90ZXN0czoKKyAgICBqb2JzOgorICAgIC0gc3RhcnRfcHJlLWNvbW1pdF90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19idWlsZDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfcHJlLWNvbW1pdF90ZXN0cworICAgIC0gajE3X3VuaXRfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2p2bV9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNobGliX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19sYXJnZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTE6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX2xvbmc6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2xvbmc6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19sb25nCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfY2RjOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19jZGM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jZGMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c190cmllCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19zdHJlc3MKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19mcWx0b29sOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19mcWx0b29sOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfZnFsdG9vbAorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5CisgICAgICAgIC0gajE3X2J1aWxkCmRpZmYgLS1naXQgYS8uY2lyY2xlY2kvY29uZmlnXzExX2FuZF8xNy55bWwuUEFJRCBiLy5jaXJjbGVjaS9jb25maWdfMTFfYW5kXzE3LnltbC5QQUlECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMDk1OGIKLS0tIC9kZXYvbnVsbAorKysgYi8uY2lyY2xlY2kvY29uZmlnXzExX2FuZF8xNy55bWwuUEFJRApAQCAtMCwwICsxLDk1NjEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3ZlcnNpb246IDIKK2pvYnM6CisgIGoxN19kdGVzdHM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA1MAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfd2l0aG91dF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgbm90IGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajE3X3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJlY2hvIFwiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFwiXG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5cbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuamF2YSAtdmVyc2lvblxuY2Qgfi9jYXNzYW5kcmEtZHRlc3Rcbm1rZGlyIC1wIC90bXAvZHRlc3RcblxuZWNobyBcImVudjogJChlbnYpXCJcbmVjaG8gXCIqKiBkb25lIGVudlwiXG5ta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzXG4jIHdlIG5lZWQgdGhlIFwic2V0IC1vIHBpcGVmYWlsXCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWVcbmV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dGBcbmlmIFsgISAteiBcIiRTUExJVF9URVNUU1wiIF07IHRoZW5cbiAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPVwiREVCVUdcIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajE3X3dpdGhvdXRfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0XG5lbHNlXG4gIGVjaG8gXCJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXJcIlxuICAoZXhpdCAxKVxuZmlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRob3V0X3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aG91dF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gY3Fsc2hsaWIgVW5pdCBUZXN0cworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBleHBvcnQgY3l0aG9uPSJ5ZXMiCisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEvCisgICAgICAgICAgLi9weWxpYi9jYXNzYW5kcmEtY3Fsc2gtdGVzdHMuc2ggJChwd2QpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvcHlsaWIKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA1MAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxN19kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfZHRlc3RzX29mZmhlYXApKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcFxuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN19kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMQorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN19kdGVzdHNfb2ZmaGVhcC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfZHRlc3RzX29mZmhlYXBfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9dHJ1ZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX2ZxbHRvb2xfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0x9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWZxbHRvb2wtdGVzdFxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBmcWx0b29sLXRlc3QgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBjcWxzaGxpYiBVbml0IFRlc3RzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGV4cG9ydCBjeXRob249InllcyIKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYS8KKyAgICAgICAgICAuL3B5bGliL2Nhc3NhbmRyYS1jcWxzaC10ZXN0cy5zaCAkKHB3ZCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9weWxpYgorICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN19jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA1MAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X2R0ZXN0c19vZmZoZWFwKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcCA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfZHRlc3RzX29mZmhlYXAueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfZHRlc3RzX29mZmhlYXAKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2R0ZXN0c19vZmZoZWFwX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0LWNvbXByZXNzaW9uKQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnVuaXQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QtY29tcHJlc3Npb24gICAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PXVuaXQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDUwCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfd2l0aF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajE3X3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHQKKworICAgICAgICAgIHNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44CisgICAgICAgICAgZmkKKworICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKyAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0YAorICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfd2l0aF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biByZXBlYXRlZCBQeXRob24gRFRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGlmIFsgIiR7UkVQRUFURURfRFRFU1RTfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBuYW1lIGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IiAtbGUgMCBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBpcyBsZXNzZXIgb3IgZXF1YWxzIHRoYW4gemVybywgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxzZQorCisgICAgICAgICAgICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLgorICAgICAgICAgICAgIyBTaW5jZSB3ZSBhcmUgcnVubmluZyB0aGUgc2FtZSB0ZXN0IG11bHRpcGxlIHRpbWVzIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIGBjaXJjbGVjaSB0ZXN0cyBzcGxpdGAuCisgICAgICAgICAgICBjb3VudD0kKCgke1JFUEVBVEVEX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpCisgICAgICAgICAgICBpZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlbgorICAgICAgICAgICAgICBjb3VudD0kKChjb3VudCsxKSkKKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgIGlmICgoJGNvdW50IDw9IDApKTsgdGhlbgorICAgICAgICAgICAgICBlY2hvICJObyB0ZXN0cyB0byBydW4gaW4gdGhpcyBydW5uZXIiCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgJHtSRVBFQVRFRF9EVEVTVFN9ICRjb3VudCB0aW1lcyIKKworICAgICAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisKKyAgICAgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisKKyAgICAgICAgICAgICAgdGVzdHNfYXJnPSQoZWNobyAke1JFUEVBVEVEX0RURVNUU30gfCBzZWQgLWUgInMvLC8gL2ciKQorCisgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9OyB0aGVuCisgICAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iLXgiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9IiIKKyAgICAgICAgICAgICAgaWYgdHJ1ZTsgdGhlbgorICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdXBncmFkZV9hcmc9Ii0tZXhlY3V0ZS11cGdyYWRlLXRlc3RzIC0tdXBncmFkZS10YXJnZXQtdmVyc2lvbi1vbmx5IC0tdXBncmFkZS12ZXJzaW9uLXNlbGVjdGlvbiBhbGwiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0ICR2bm9kZXNfYXJncyAtLWNvdW50PSRjb3VudCAkc3RvcF9vbl9mYWlsdXJlX2FyZyAkdXBncmFkZV9hcmcgLS1sb2ctY2xpLWxldmVsPURFQlVHIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19kdGVzdHNfb2ZmaGVhcF9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIFB5dGhvbiBEVGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0RURVNUU30gJGNvdW50IHRpbWVzIgorCisgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKworICAgICAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKworICAgICAgICAgICAgICB0ZXN0c19hcmc9JChlY2hvICR7UkVQRUFURURfRFRFU1RTfSB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX07IHRoZW4KKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiB0cnVlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgJHRlc3RzX2FyZyB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIHRydWU7IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSItLWV4ZWN1dGUtdXBncmFkZS10ZXN0cyAtLXVwZ3JhZGUtdGFyZ2V0LXZlcnNpb24tb25seSAtLXVwZ3JhZGUtdmVyc2lvbi1zZWxlY3Rpb24gYWxsIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAkdm5vZGVzX2FyZ3MgLS1jb3VudD0kY291bnQgJHN0b3Bfb25fZmFpbHVyZV9hcmcgJHVwZ3JhZGVfYXJnIC0tbG9nLWNsaS1sZXZlbD1ERUJVRyAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHQueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAgJHRlc3RzX2FyZyB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC51bml0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nIHx8IHRydWUpCisgICAgICAgICAgaWYgWyAteiAiJHRlc3RfdGltZW91dCIgXTsgdGhlbgorICAgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JykKKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCB0ZXN0Y2xhc3NsaXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkgICAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PXVuaXQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN19jcWxzaF9kdGVzdHNfcHkzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IGxhcmdlCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNTAKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxN193aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN193aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRob3V0X3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aG91dF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfc3RyZXNzX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X3VuaXRfdGVzdHM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdCAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5X3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTE6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA1MAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfd2l0aG91dF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExJyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfd2l0aG91dF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aG91dF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIHRydWU7IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSItLWV4ZWN1dGUtdXBncmFkZS10ZXN0cyAtLXVwZ3JhZGUtdGFyZ2V0LXZlcnNpb24tb25seSAtLXVwZ3JhZGUtdmVyc2lvbi1zZWxlY3Rpb24gYWxsIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAkdm5vZGVzX2FyZ3MgLS1jb3VudD0kY291bnQgJHN0b3Bfb25fZmFpbHVyZV9hcmcgJHVwZ3JhZGVfYXJnIC0tbG9nLWNsaS1sZXZlbD1ERUJVRyAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHQueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzICR0ZXN0c19hcmcgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2R0ZXN0c19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgICR0ZXN0c19hcmcgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX3VuaXRfdGVzdHM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdCAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDUwCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMQorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN193aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRob3V0X3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aG91dF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzODoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDUwCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTFfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfd2l0aG91dF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOCcgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfd2l0aG91dF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aG91dF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX3N0cmVzc19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX1NUUkVTU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9c3RyZXNzLXRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBzdHJlc3MtdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfY29tcHJlc3Npb25fcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY29tcHJlc3Npb25cbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jb21wcmVzc2lvbiAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfcmVwZWF0ZWRfYW50X3Rlc3Q6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgSlVuaXQgdGVzdAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0FOVF9URVNUX0NMQVNTfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCB1dGVzdCBjbGFzcyBuYW1lIGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgdXRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgdXRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpCisgICAgICAgICAgICBpZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0FOVF9URVNUX1RBUkdFVH0gJHtSRVBFQVRFRF9BTlRfVEVTVF9DTEFTU30gJHtSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTfSAke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSB0aW1lcyIKKworICAgICAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHRhcmdldD0ke1JFUEVBVEVEX0FOVF9URVNUX1RBUkdFVH0KKyAgICAgICAgICAgICAgY2xhc3NfcGF0aD0ke1JFUEVBVEVEX0FOVF9URVNUX0NMQVNTfQorICAgICAgICAgICAgICBjbGFzc19uYW1lPSIke2NsYXNzX3BhdGgjIyoufSIKKworICAgICAgICAgICAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LgorICAgICAgICAgICAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LgorICAgICAgICAgICAgICBpZiBbWyAkdGFyZ2V0ID09ICJ0ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY2RjIiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY29tcHJlc3Npb24iIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC10cmllIiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJmcWx0b29sLXRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAibG9uZy10ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInN0cmVzcy10ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3Qtc2ltdWxhdG9yLWR0ZXN0IiBdXTsgdGhlbgorICAgICAgICAgICAgICAgIG5hbWU9Ii1EdGVzdC5uYW1lPSRjbGFzc19uYW1lIgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbmFtZT0iLUR0ZXN0Lm5hbWU9JGNsYXNzX3BhdGgiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwKKyAgICAgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICAgICAgbWV0aG9kcz0iIgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWV0aG9kcz0iLUR0ZXN0Lm1ldGhvZHM9JHtSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTfSIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbAorICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX0FOVF9URVNUX1ZOT0RFU307IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2JyIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIFJ1biB0aGUgdGVzdCB0YXJnZXQgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQgY29sbGVjdGluZyB0aGUgZXhpdCBjb2RlLAorICAgICAgICAgICAgICAjIHN0b3BwaW5nIHRoZSBpdGVyYXRpb24gb25seSBpZiBzdG9wX29uX2ZhaWx1cmUgaXMgc2V0LgorICAgICAgICAgICAgICBleGl0X2NvZGU9IiQ/IgorICAgICAgICAgICAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvCisKKyAgICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nIHRlc3QgaXRlcmF0aW9uICRpIG9mICRjb3VudCIKKworICAgICAgICAgICAgICAgICMgcnVuIHRoZSB0ZXN0CisgICAgICAgICAgICAgICAgc3RhdHVzPSJwYXNzZXMiCisgICAgICAgICAgICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIGFudCAkdGFyZ2V0ICRuYW1lICRtZXRob2RzICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IHRlZSBzdGRvdXQudHh0ICk7IHRoZW4KKyAgICAgICAgICAgICAgICAgIHN0YXR1cz0iZmFpbHMiCisgICAgICAgICAgICAgICAgICBleGl0X2NvZGU9MQorICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZQorICAgICAgICAgICAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L3N0ZG91dC8ke3N0YXR1c30vJHtpfQorICAgICAgICAgICAgICAgIG1rZGlyIC1wICRkZXN0CisgICAgICAgICAgICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke1JFUEVBVEVEX0FOVF9URVNUX1RBUkdFVH0tJHtSRVBFQVRFRF9BTlRfVEVTVF9DTEFTU30udHh0CisKKyAgICAgICAgICAgICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXMKKyAgICAgICAgICAgICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgICAgICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9vdXRwdXQvJHtzdGF0dXN9LyR7aX0KKyAgICAgICAgICAgICAgICBta2RpciAtcCAkZGVzdAorICAgICAgICAgICAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gIiQobHMgJHNvdXJjZSkiIF1dOyB0aGVuCisgICAgICAgICAgICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvCisgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzCisgICAgICAgICAgICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncworICAgICAgICAgICAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L2xvZ3MvJHtzdGF0dXN9LyR7aX0KKyAgICAgICAgICAgICAgICBta2RpciAtcCAkZGVzdAorICAgICAgICAgICAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gIiQobHMgJHNvdXJjZSkiIF1dOyB0aGVuCisgICAgICAgICAgICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvCisgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZQorICAgICAgICAgICAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW4KKyAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgZG9uZQorCisgICAgICAgICAgICAgIChleGl0ICR7ZXhpdF9jb2RlfSkKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IHhsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV9sYXJnZV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV9sYXJnZV93aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX2xhcmdlX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJlY2hvIFwiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFwiXG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aF92bm9kZXNfZmluYWwudHh0XG5cbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuamF2YSAtdmVyc2lvblxuY2Qgfi9jYXNzYW5kcmEtZHRlc3Rcbm1rZGlyIC1wIC90bXAvZHRlc3RcblxuZWNobyBcImVudjogJChlbnYpXCJcbmVjaG8gXCIqKiBkb25lIGVudlwiXG5ta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzXG4jIHdlIG5lZWQgdGhlIFwic2V0IC1vIHBpcGVmYWlsXCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWVcbmV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dGBcbmlmIFsgISAteiBcIiRTUExJVF9URVNUU1wiIF07IHRoZW5cbiAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfbGFyZ2Vfd2l0aF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2xhcmdlX3dpdGhfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9sYXJnZV93aXRoX3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2R0ZXN0c19sYXJnZV92bm9kZV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIFB5dGhvbiBEVGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0xBUkdFX0RURVNUU30gJGNvdW50IHRpbWVzIgorCisgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKworICAgICAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKworICAgICAgICAgICAgICB0ZXN0c19hcmc9JChlY2hvICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX07IHRoZW4KKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiB0cnVlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfdHJpZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdC10cmllKQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnVuaXQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QtdHJpZSAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNoX2R0ZXN0c19weTM4X29mZmhlYXA6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA1MAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX2R0ZXN0c19vZmZoZWFwKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcCA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOCcgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfZHRlc3RzX29mZmhlYXAueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXAKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfZHRlc3RzX2xhcmdlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IHhsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV9sYXJnZV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV9sYXJnZV93aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXNfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5X3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN19qdm1fZHRlc3RzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IGxhcmdlCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMTAKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIGRpc3RyaWJ1dGVkIFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiB8IGdyZXAgLXYgdXBncmFkZSA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC5kaXN0cmlidXRlZC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdCAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9ZGlzdHJpYnV0ZWQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19yZXBlYXRlZF9hbnRfdGVzdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biByZXBlYXRlZCBKVW5pdCB0ZXN0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGlmIFsgIiR7UkVQRUFURURfQU5UX1RFU1RfQ0xBU1N9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIHV0ZXN0IGNsYXNzIG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCB1dGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9IiAtbGUgMCBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCB1dGVzdCBjb3VudCBpcyBsZXNzZXIgb3IgZXF1YWxzIHRoYW4gemVybywgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxzZQorCisgICAgICAgICAgICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLgorICAgICAgICAgICAgIyBTaW5jZSB3ZSBhcmUgcnVubmluZyB0aGUgc2FtZSB0ZXN0IG11bHRpcGxlIHRpbWVzIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIGBjaXJjbGVjaSB0ZXN0cyBzcGxpdGAuCisgICAgICAgICAgICBjb3VudD0kKCgke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfQU5UX1RFU1RfVEFSR0VUfSAke1JFUEVBVEVEX0FOVF9URVNUX0NMQVNTfSAke1JFUEVBVEVEX0FOVF9URVNUX01FVEhPRFN9ICR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9IHRpbWVzIgorCisgICAgICAgICAgICAgIHNldCAteAorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdGFyZ2V0PSR7UkVQRUFURURfQU5UX1RFU1RfVEFSR0VUfQorICAgICAgICAgICAgICBjbGFzc19wYXRoPSR7UkVQRUFURURfQU5UX1RFU1RfQ0xBU1N9CisgICAgICAgICAgICAgIGNsYXNzX25hbWU9IiR7Y2xhc3NfcGF0aCMjKi59IgorCisgICAgICAgICAgICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuCisgICAgICAgICAgICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuCisgICAgICAgICAgICAgIGlmIFtbICR0YXJnZXQgPT0gInRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1jZGMiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1jb21wcmVzc2lvbiIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LXRyaWUiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gImZxbHRvb2wtdGVzdCIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJsb25nLXRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAic3RyZXNzLXRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1zaW11bGF0b3ItZHRlc3QiIF1dOyB0aGVuCisgICAgICAgICAgICAgICAgbmFtZT0iLUR0ZXN0Lm5hbWU9JGNsYXNzX25hbWUiCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBuYW1lPSItRHRlc3QubmFtZT0kY2xhc3NfcGF0aCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbAorICAgICAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0FOVF9URVNUX01FVEhPRFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgICAgICBtZXRob2RzPSIiCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtZXRob2RzPSItRHRlc3QubWV0aG9kcz0ke1JFUEVBVEVEX0FOVF9URVNUX01FVEhPRFN9IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfQU5UX1RFU1RfVk5PREVTfTsgdGhlbgorICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgUnVuIHRoZSB0ZXN0IHRhcmdldCBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZCBjb2xsZWN0aW5nIHRoZSBleGl0IGNvZGUsCisgICAgICAgICAgICAgICMgc3RvcHBpbmcgdGhlIGl0ZXJhdGlvbiBvbmx5IGlmIHN0b3Bfb25fZmFpbHVyZSBpcyBzZXQuCisgICAgICAgICAgICAgIGV4aXRfY29kZT0iJD8iCisgICAgICAgICAgICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG8KKworICAgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgdGVzdCBpdGVyYXRpb24gJGkgb2YgJGNvdW50IgorCisgICAgICAgICAgICAgICAgIyBydW4gdGhlIHRlc3QKKyAgICAgICAgICAgICAgICBzdGF0dXM9InBhc3NlcyIKKyAgICAgICAgICAgICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgYW50ICR0YXJnZXQgJG5hbWUgJG1ldGhvZHMgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgdGVlIHN0ZG91dC50eHQgKTsgdGhlbgorICAgICAgICAgICAgICAgICAgc3RhdHVzPSJmYWlscyIKKyAgICAgICAgICAgICAgICAgIGV4aXRfY29kZT0xCisgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlCisgICAgICAgICAgICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9CisgICAgICAgICAgICAgICAgbWtkaXIgLXAgJGRlc3QKKyAgICAgICAgICAgICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7UkVQRUFURURfQU5UX1RFU1RfVEFSR0VUfS0ke1JFUEVBVEVEX0FOVF9URVNUX0NMQVNTfS50eHQKKworICAgICAgICAgICAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlcworICAgICAgICAgICAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dAorICAgICAgICAgICAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L291dHB1dC8ke3N0YXR1c30vJHtpfQorICAgICAgICAgICAgICAgIG1rZGlyIC1wICRkZXN0CisgICAgICAgICAgICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiAiJChscyAkc291cmNlKSIgXV07IHRoZW4KKyAgICAgICAgICAgICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC8KKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXMKKyAgICAgICAgICAgICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzCisgICAgICAgICAgICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3QvbG9ncy8ke3N0YXR1c30vJHtpfQorICAgICAgICAgICAgICAgIG1rZGlyIC1wICRkZXN0CisgICAgICAgICAgICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiAiJChscyAkc291cmNlKSIgXV07IHRoZW4KKyAgICAgICAgICAgICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC8KKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlCisgICAgICAgICAgICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlbgorICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICBkb25lCisKKyAgICAgICAgICAgICAgKGV4aXQgJHtleGl0X2NvZGV9KQorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IGxhcmdlCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNTAKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV93aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV93aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aG91dF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN19idWlsZDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tZGVwdGggMSAtLWJyYW5jaCAkQ0lSQ0xFX0JSQU5DSCBodHRwczovL2dpdGh1Yi5jb20vJENJUkNMRV9QUk9KRUNUX1VTRVJOQU1FLyRDSVJDTEVfUFJPSkVDVF9SRVBPTkFNRS5naXQgfi9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQnVpbGQgQ2Fzc2FuZHJhCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhCisgICAgICAgICAgIyBMb29wIHRvIHByZXZlbnQgZmFpbHVyZSBkdWUgdG8gbWF2ZW4tYW50LXRhc2tzIG5vdCBkb3dubG9hZGluZyBhIGphci4uCisgICAgICAgICAgZm9yIHggaW4gJChzZXEgMSAzKTsgZG8KKyAgICAgICAgICAgICAgJHtBTlRfSE9NRX0vYmluL2FudCBjbGVhbiByZWFsY2xlYW4gamFyCisgICAgICAgICAgICAgIFJFVFVSTj0iJD8iCisgICAgICAgICAgICAgIGlmIFsgIiR7UkVUVVJOfSIgLWVxICIwIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICBmaQorICAgICAgICAgIGRvbmUKKyAgICAgICAgICAjIEV4aXQsIGlmIHdlIGRpZG4ndCBidWlsZCBzdWNjZXNzZnVsbHkKKyAgICAgICAgICBpZiBbICIke1JFVFVSTn0iIC1uZSAiMCIgXTsgdGhlbgorICAgICAgICAgICAgICBlY2hvICJCdWlsZCBmYWlsZWQgd2l0aCBleGl0IGNvZGU6ICR7UkVUVVJOfSIKKyAgICAgICAgICAgICAgZXhpdCAke1JFVFVSTn0KKyAgICAgICAgICBmaQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBlY2xpcHNlLXdhcm5pbmdzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhCisgICAgICAgICAgYW50IGVjbGlwc2Utd2FybmluZ3MKKyAgICAtIHBlcnNpc3RfdG9fd29ya3NwYWNlOgorICAgICAgICByb290OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgICAgcGF0aHM6CisgICAgICAgIC0gY2Fzc2FuZHJhCisgICAgICAgIC0gLm0yCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c19jZGM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QtY2RjKQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnVuaXQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QtY2RjICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX2NkY19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1jZGNcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jZGMgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c19mcWx0b29sOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKGZxbHRvb2wtdGVzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2R0ZXN0c19vZmZoZWFwX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIHRydWU7IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSItLWV4ZWN1dGUtdXBncmFkZS10ZXN0cyAtLXVwZ3JhZGUtdGFyZ2V0LXZlcnNpb24tb25seSAtLXVwZ3JhZGUtdmVyc2lvbi1zZWxlY3Rpb24gYWxsIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAkdm5vZGVzX2FyZ3MgLS1jb3VudD0kY291bnQgJHN0b3Bfb25fZmFpbHVyZV9hcmcgJHVwZ3JhZGVfYXJnIC0tbG9nLWNsaS1sZXZlbD1ERUJVRyAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHQueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9qdm1fZHRlc3RzX3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IGxhcmdlCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMTAKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIGRpc3RyaWJ1dGVkIFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiB8IGdyZXAgLXYgdXBncmFkZSA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC5kaXN0cmlidXRlZC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdCAtRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9ZGlzdHJpYnV0ZWQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfbG9uZzoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzIChsb25nLXRlc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCBsb25nLXRlc3QgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191bml0X3Rlc3RzX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBTaW11bGF0b3IgVGVzdHMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3Qtc2ltdWxhdG9yLWR0ZXN0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAzMG0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX3N0cmVzczoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzIChzdHJlc3MtdGVzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHN0cmVzcy10ZXN0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX2NkY19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1jZGNcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jZGMgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X2R0ZXN0c192bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDUwCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxN193aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN193aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgbm90IGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajE3X3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJlY2hvIFwiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFwiXG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XG5cbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuamF2YSAtdmVyc2lvblxuY2Qgfi9jYXNzYW5kcmEtZHRlc3Rcbm1rZGlyIC1wIC90bXAvZHRlc3RcblxuZWNobyBcImVudjogJChlbnYpXCJcbmVjaG8gXCIqKiBkb25lIGVudlwiXG5ta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzXG4jIHdlIG5lZWQgdGhlIFwic2V0IC1vIHBpcGVmYWlsXCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWVcbmV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dGBcbmlmIFsgISAteiBcIiRTUExJVF9URVNUU1wiIF07IHRoZW5cbiAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfd2l0aF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRoX3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2R0ZXN0c19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIFB5dGhvbiBEVGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0RURVNUU30gJGNvdW50IHRpbWVzIgorCisgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKworICAgICAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKworICAgICAgICAgICAgICB0ZXN0c19hcmc9JChlY2hvICR7UkVQRUFURURfRFRFU1RTfSB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX07IHRoZW4KKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdXBncmFkZV9hcmc9Ii0tZXhlY3V0ZS11cGdyYWRlLXRlc3RzIC0tdXBncmFkZS10YXJnZXQtdmVyc2lvbi1vbmx5IC0tdXBncmFkZS12ZXJzaW9uLXNlbGVjdGlvbiBhbGwiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0ICR2bm9kZXNfYXJncyAtLWNvdW50PSRjb3VudCAkc3RvcF9vbl9mYWlsdXJlX2FyZyAkdXBncmFkZV9hcmcgLS1sb2ctY2xpLWxldmVsPURFQlVHIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfY29tcHJlc3Npb246CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QtY29tcHJlc3Npb24pCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC1jb21wcmVzc2lvbiAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXRyaWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC10cmllICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA1MAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX2R0ZXN0c19vZmZoZWFwKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcCA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfZHRlc3RzX29mZmhlYXAueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXAKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA1MAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV9kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfZHRlc3RzX29mZmhlYXApKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcFxuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV9kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMQorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV9kdGVzdHNfb2ZmaGVhcC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9kdGVzdHNfb2ZmaGVhcAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXBfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfdHJpZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdC10cmllKQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnVuaXQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QtdHJpZSAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2R0ZXN0c19sYXJnZV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIFB5dGhvbiBEVGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0xBUkdFX0RURVNUU30gJGNvdW50IHRpbWVzIgorCisgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKworICAgICAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKworICAgICAgICAgICAgICB0ZXN0c19hcmc9JChlY2hvICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX07IHRoZW4KKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdXBncmFkZV9hcmc9Ii0tZXhlY3V0ZS11cGdyYWRlLXRlc3RzIC0tdXBncmFkZS10YXJnZXQtdmVyc2lvbi1vbmx5IC0tdXBncmFkZS12ZXJzaW9uLXNlbGVjdGlvbiBhbGwiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0ICR2bm9kZXNfYXJncyAtLWNvdW50PSRjb3VudCAkc3RvcF9vbl9mYWlsdXJlX2FyZyAkdXBncmFkZV9hcmcgLS1sb2ctY2xpLWxldmVsPURFQlVHIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyIC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgJHRlc3RzX2FyZyB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX2NvbXByZXNzaW9uX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNvbXByZXNzaW9uXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY29tcHJlc3Npb24gJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA1MAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX3dpdGhfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajExX3dpdGhfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X3V0ZXN0c19mcWx0b29sOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKGZxbHRvb2wtdGVzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiB4bGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfbGFyZ2Vfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfbGFyZ2Vfd2l0aF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRoX3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRoX3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN19sYXJnZV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAiZWNobyBcImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRoX3Zub2Rlc19maW5hbC50eHRcIlxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuXG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmphdmEgLXZlcnNpb25cbmNkIH4vY2Fzc2FuZHJhLWR0ZXN0XG5ta2RpciAtcCAvdG1wL2R0ZXN0XG5cbmVjaG8gXCJlbnY6ICQoZW52KVwiXG5lY2hvIFwiKiogZG9uZSBlbnZcIlxubWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0c1xuIyB3ZSBuZWVkIHRoZSBcInNldCAtbyBwaXBlZmFpbFwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlXG5leHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRoX3Zub2Rlc19maW5hbC50eHRgXG5pZiBbICEgLXogXCIkU1BMSVRfVEVTVFNcIiBdOyB0aGVuXG4gIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPVwiREVCVUdcIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajE3X2xhcmdlX3dpdGhfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0XG5lbHNlXG4gIGVjaG8gXCJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXJcIlxuICAoZXhpdCAxKVxuZmlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN19sYXJnZV93aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9kdGVzdHNfb2ZmaGVhcDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDUwCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTFfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfZHRlc3RzX29mZmhlYXApKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBub3QgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcCA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfZHRlc3RzX29mZmhlYXAueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9kdGVzdHNfb2ZmaGVhcF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IGxhcmdlCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNTAKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV93aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOCcgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV93aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC10cmllXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtdHJpZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfc2ltdWxhdG9yX2R0ZXN0c19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1zaW11bGF0b3ItZHRlc3RcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1zaW11bGF0b3ItZHRlc3QgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2p2bV9kdGVzdHNfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDUwCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfZHRlc3RzX29mZmhlYXApKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcFxuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN19kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOAorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN19kdGVzdHNfb2ZmaGVhcC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfZHRlc3RzX29mZmhlYXBfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19jcWxzaGxpYl90ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBjcWxzaGxpYiBVbml0IFRlc3RzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhLworICAgICAgICAgIC4vcHlsaWIvY2Fzc2FuZHJhLWNxbHNoLXRlc3RzLnNoICQocHdkKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL3B5bGliCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDUwCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV93aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExJyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV93aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnVuaXQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA1MAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X3dpdGhfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN193aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajE3X3dpdGhfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRoX3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDUwCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN193aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExJyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN193aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9qdm1fZHRlc3RzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IGxhcmdlCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMTAKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIGRpc3RyaWJ1dGVkIFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiB8IGdyZXAgLXYgdXBncmFkZSA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC5kaXN0cmlidXRlZC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdCAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9ZGlzdHJpYnV0ZWQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfc3RyZXNzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHN0cmVzcy10ZXN0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgc3RyZXNzLXRlc3QgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9dHJ1ZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfYnVpbGQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMQorICAgIHN0ZXBzOgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWRlcHRoIDEgLS1icmFuY2ggJENJUkNMRV9CUkFOQ0ggaHR0cHM6Ly9naXRodWIuY29tLyRDSVJDTEVfUFJPSkVDVF9VU0VSTkFNRS8kQ0lSQ0xFX1BST0pFQ1RfUkVQT05BTUUuZ2l0IH4vY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IEJ1aWxkIENhc3NhbmRyYQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYQorICAgICAgICAgICMgTG9vcCB0byBwcmV2ZW50IGZhaWx1cmUgZHVlIHRvIG1hdmVuLWFudC10YXNrcyBub3QgZG93bmxvYWRpbmcgYSBqYXIuLgorICAgICAgICAgIGZvciB4IGluICQoc2VxIDEgMyk7IGRvCisgICAgICAgICAgICAgICR7QU5UX0hPTUV9L2Jpbi9hbnQgY2xlYW4gcmVhbGNsZWFuIGphcgorICAgICAgICAgICAgICBSRVRVUk49IiQ/IgorICAgICAgICAgICAgICBpZiBbICIke1JFVFVSTn0iIC1lcSAiMCIgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICBkb25lCisgICAgICAgICAgIyBFeGl0LCBpZiB3ZSBkaWRuJ3QgYnVpbGQgc3VjY2Vzc2Z1bGx5CisgICAgICAgICAgaWYgWyAiJHtSRVRVUk59IiAtbmUgIjAiIF07IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiQnVpbGQgZmFpbGVkIHdpdGggZXhpdCBjb2RlOiAke1JFVFVSTn0iCisgICAgICAgICAgICAgIGV4aXQgJHtSRVRVUk59CisgICAgICAgICAgZmkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZWNsaXBzZS13YXJuaW5ncworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYQorICAgICAgICAgIGFudCBlY2xpcHNlLXdhcm5pbmdzCisgICAgLSBwZXJzaXN0X3RvX3dvcmtzcGFjZToKKyAgICAgICAgcm9vdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAgIHBhdGhzOgorICAgICAgICAtIGNhc3NhbmRyYQorICAgICAgICAtIC5tMgorICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaGxpYl90ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBjcWxzaGxpYiBVbml0IFRlc3RzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhLworICAgICAgICAgIC4vcHlsaWIvY2Fzc2FuZHJhLWNxbHNoLXRlc3RzLnNoICQocHdkKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL3B5bGliCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2R0ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDUwCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTFfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfd2l0aG91dF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgbm90IGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJlY2hvIFwiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFwiXG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5cbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuamF2YSAtdmVyc2lvblxuY2Qgfi9jYXNzYW5kcmEtZHRlc3Rcbm1rZGlyIC1wIC90bXAvZHRlc3RcblxuZWNobyBcImVudjogJChlbnYpXCJcbmVjaG8gXCIqKiBkb25lIGVudlwiXG5ta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzXG4jIHdlIG5lZWQgdGhlIFwic2V0IC1vIHBpcGVmYWlsXCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWVcbmV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dGBcbmlmIFsgISAteiBcIiRTUExJVF9URVNUU1wiIF07IHRoZW5cbiAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPVwiREVCVUdcIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajExX3dpdGhvdXRfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0XG5lbHNlXG4gIGVjaG8gXCJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXJcIlxuICAoZXhpdCAxKVxuZmlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aG91dF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN19qdm1fZHRlc3RzX3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IGxhcmdlCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMTAKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIGRpc3RyaWJ1dGVkIFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiB8IGdyZXAgLXYgdXBncmFkZSA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC5kaXN0cmlidXRlZC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdCAtRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9ZGlzdHJpYnV0ZWQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19jcWxzaF9kdGVzdHNfcHkzODoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDUwCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfd2l0aG91dF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOCcgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfd2l0aG91dF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aG91dF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhvdXRfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX2NkYzoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdC1jZGMpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC1jZGMgICAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PXVuaXQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfZnFsdG9vbF9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTH0gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9ZnFsdG9vbC10ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfZHRlc3RzX2xhcmdlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IHhsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxN19sYXJnZV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN19sYXJnZV93aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRob3V0X3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN19sYXJnZV93aXRob3V0X3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX3VuaXRfdGVzdHNfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfbG9uZzoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzIChsb25nLXRlc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCBsb25nLXRlc3QgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9kdGVzdHNfdm5vZGU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA1MAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX3dpdGhfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBub3QgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD1cIkRFQlVHXCIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV93aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dFxuZWxzZVxuICBlY2hvIFwiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyXCJcbiAgKGV4aXQgMSlcbmZpXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfanZtX2R0ZXN0c19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfSlZNX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19kdGVzdHNfb2ZmaGVhcDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDUwCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxN19kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN19kdGVzdHNfb2ZmaGVhcCkqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIG5vdCBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcFxuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN19kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAiZWNobyBcImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcIlxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuXG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmphdmEgLXZlcnNpb25cbmNkIH4vY2Fzc2FuZHJhLWR0ZXN0XG5ta2RpciAtcCAvdG1wL2R0ZXN0XG5cbmVjaG8gXCJlbnY6ICQoZW52KVwiXG5lY2hvIFwiKiogZG9uZSBlbnZcIlxubWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0c1xuIyB3ZSBuZWVkIHRoZSBcInNldCAtbyBwaXBlZmFpbFwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlXG5leHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRgXG5pZiBbICEgLXogXCIkU1BMSVRfVEVTVFNcIiBdOyB0aGVuXG4gIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD1cIkRFQlVHXCIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN19kdGVzdHNfb2ZmaGVhcC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dFxuZWxzZVxuICBlY2hvIFwiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyXCJcbiAgKGV4aXQgMSlcbmZpXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfZHRlc3RzX29mZmhlYXAKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2R0ZXN0c19vZmZoZWFwX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfZHRlc3RzX2xhcmdlX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfbG9uZ19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfTE9OR30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9bG9uZy10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBsb25nLXRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfbG9uZ19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfTE9OR30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9bG9uZy10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBsb25nLXRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Cit3b3JrZmxvd3M6CisgIHZlcnNpb246IDIKKyAgamF2YTExX3NlcGFyYXRlX3Rlc3RzOgorICAgIGpvYnM6CisgICAgLSBzdGFydF9qMTFfYnVpbGQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfYnVpbGQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3VuaXRfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdW5pdF90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX3VuaXRfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9qdm1fZHRlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2p2bV9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9qdm1fZHRlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfanZtX2R0ZXN0c192bm9kZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfanZtX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzX3Zub2RlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfc2ltdWxhdG9yX2R0ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2NxbHNobGliX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2NxbHNobGliX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hsaWJfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaGxpYl90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaGxpYl9jeXRob25fdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191bml0X3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3VuaXRfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191bml0X3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX2xvbmc6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2xvbmc6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfbG9uZworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19sb25nOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19sb25nOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2xvbmcKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfY2RjOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19jZGM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfY2RjCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NkYzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfY2RjOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NkYworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfY29tcHJlc3Npb24KKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NvbXByZXNzaW9uCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfdHJpZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfc3RyZXNzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfc3RyZXNzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfc3RyZXNzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N0cmVzcworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c19mcWx0b29sOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19mcWx0b29sOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX2ZxbHRvb2wKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19mcWx0b29sCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnkKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfZHRlc3RzX3Zub2RlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2R0ZXN0c192bm9kZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX3Zub2RlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c192bm9kZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2U6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfZHRlc3RzX2xhcmdlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2R0ZXN0c19sYXJnZV92bm9kZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2UKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlX3Zub2RlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5MzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5M192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzg6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzhfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzODoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOF9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMV9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICBqYXZhMTFfcHJlLWNvbW1pdF90ZXN0czoKKyAgICBqb2JzOgorICAgIC0gc3RhcnRfcHJlLWNvbW1pdF90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9idWlsZDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfcHJlLWNvbW1pdF90ZXN0cworICAgIC0gajExX3VuaXRfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX3NpbXVsYXRvcl9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2p2bV9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2p2bV9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNobGliX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNobGliX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3VuaXRfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX2xvbmc6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2xvbmc6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19sb25nCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX2xvbmc6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19sb25nCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfY2RjOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19jZGM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jZGMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfY2RjOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfY2RjCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfY29tcHJlc3Npb24KKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c190cmllCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c190cmllCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19zdHJlc3MKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfc3RyZXNzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2ZxbHRvb2wKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2ZxbHRvb2wKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnkKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c19sYXJnZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2R0ZXN0c19sYXJnZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2R0ZXN0c19sYXJnZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2UKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2UKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzODoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9jcWxzaF9kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTM4X29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTMxMV9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzODoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4X29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMV9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgamF2YTE3X3NlcGFyYXRlX3Rlc3RzOgorICAgIGpvYnM6CisgICAgLSBzdGFydF9qMTdfYnVpbGQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfYnVpbGQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3VuaXRfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdW5pdF90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3VuaXRfdGVzdHMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2p2bV9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0c192bm9kZQorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2NxbHNobGliX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2NxbHNobGliX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hsaWJfdGVzdHMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0cworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c192bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfdm5vZGUKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19sYXJnZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2Vfdm5vZGUKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzODoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4X29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMV9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXAKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfbG9uZzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfbG9uZzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19sb25nCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NkYzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfY2RjOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NkYworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfY29tcHJlc3Npb24KKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c190cmllCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfc3RyZXNzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N0cmVzcworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19mcWx0b29sOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19mcWx0b29sOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2ZxbHRvb2wKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5CisgICAgICAgIC0gajE3X2J1aWxkCisgIGphdmExN19wcmUtY29tbWl0X3Rlc3RzOgorICAgIGpvYnM6CisgICAgLSBzdGFydF9wcmUtY29tbWl0X3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2J1aWxkOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9wcmUtY29tbWl0X3Rlc3RzCisgICAgLSBqMTdfdW5pdF90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfanZtX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzg6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXAKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOF9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXAKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfbG9uZzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfbG9uZzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2xvbmcKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19jZGM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NkYzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2NkYworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2NvbXByZXNzaW9uCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX3N0cmVzcworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19mcWx0b29sCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnkKKyAgICAgICAgLSBqMTdfYnVpbGQKZGlmZiAtLWdpdCBhLy5jaXJjbGVjaS9jb25maWdfdGVtcGxhdGUueW1sIGIvLmNpcmNsZWNpL2NvbmZpZ190ZW1wbGF0ZS55bWwKaW5kZXggNDM2N2JkYy4uMjliNmVlMCAxMDA2NDQKLS0tIGEvLmNpcmNsZWNpL2NvbmZpZ190ZW1wbGF0ZS55bWwKKysrIGIvLmNpcmNsZWNpL2NvbmZpZ190ZW1wbGF0ZS55bWwKQEAgLTI4LDggKzI4LDYgQEAKICAgICAjIHBsZWFzZSByZW1lbWJlciB0byBtb2RpZnkgdGhlIGdlbmVyYXRlLnNoIHNjcmlwdCBhbmQgdGhlIGRvY3VtZW50YXRpb24gYWNjb3JkaW5nbHkuCiAKICAgICBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIExBTkc6IGVuX1VTLlVURi04CiAgICAgS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0xMzYsNiArMTM0LDcgQEAKICAgICAjIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdC1qdm0tZHRlc3Qtc29tZQogICAgICMgUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0LWNkYwogICAgICMgUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0LWNvbXByZXNzaW9uCisgICAgIyBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3QtdHJpZQogICAgICMgUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkKICAgICBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCiAgICAgIyBUaGUgbmFtZSBvZiBKVW5pdCBjbGFzcyB0byBiZSBydW4gbXVsdGlwbGUgdGltZXMsIGZvciBleGFtcGxlOgpAQCAtNDM0LDYgKzQzMywzMCBAQAogICAgICAgICByZXF1aXJlczoKICAgICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfY29tcHJlc3Npb25fcmVwZWF0CiAgICAgICAgICAgLSBqOF9idWlsZAorICAgIC0gc3RhcnRfajhfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqOF91dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qOF91dGVzdHNfdHJpZQorICAgICAgICAgIC0gajhfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX3RyaWUKKyAgICAgICAgICAtIGo4X2J1aWxkCisgICAgLSBzdGFydF9qOF91dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqOF91dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajhfdXRlc3RzX3RyaWVfcmVwZWF0CisgICAgICAgICAgLSBqOF9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllX3JlcGVhdAorICAgICAgICAgIC0gajhfYnVpbGQKICAgICAtIHN0YXJ0X2o4X3V0ZXN0c19zdHJlc3M6CiAgICAgICAgIHR5cGU6IGFwcHJvdmFsCiAgICAgLSBqOF91dGVzdHNfc3RyZXNzOgpAQCAtODgyLDYgKzkwNSwyNCBAQAogICAgICAgICByZXF1aXJlczoKICAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbgogICAgICAgICAgIC0gajhfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajhfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX3RyaWUKKyAgICAgICAgICAtIGo4X2J1aWxkCisgICAgLSBqMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX3RyaWUKKyAgICAgICAgICAtIGo4X2J1aWxkCisgICAgLSBqOF91dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX3RyaWUKKyAgICAgICAgICAtIGo4X2J1aWxkCisgICAgLSBqMTFfdXRlc3RzX3RyaWVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c190cmllCisgICAgICAgICAgLSBqOF9idWlsZAogICAgIC0gc3RhcnRfdXRlc3RzX3N0cmVzczoKICAgICAgICAgdHlwZTogYXBwcm92YWwKICAgICAtIGo4X3V0ZXN0c19zdHJlc3M6CkBAIC0xMTUzLDYgKzExOTQsMTggQEAKICAgICAgICAgcmVxdWlyZXM6CiAgICAgICAgICAgLSBzdGFydF9qMTFfanZtX2R0ZXN0c192bm9kZV9yZXBlYXQKICAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3NpbXVsYXRvcl9kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfc2ltdWxhdG9yX2R0ZXN0cworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfc2ltdWxhdG9yX2R0ZXN0c19yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfc2ltdWxhdG9yX2R0ZXN0c19yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3NpbXVsYXRvcl9kdGVzdHNfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKICAgICAtIHN0YXJ0X2oxMV9jcWxzaGxpYl90ZXN0czoKICAgICAgICAgdHlwZTogYXBwcm92YWwKICAgICAtIGoxMV9jcWxzaGxpYl90ZXN0czoKQEAgLTEyOTEsNiArMTM0NCwxOCBAQAogICAgICAgICByZXF1aXJlczoKICAgICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfY29tcHJlc3Npb25fcmVwZWF0CiAgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX3RyaWUKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllX3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCiAgICAgLSBzdGFydF9qMTFfdXRlc3RzX3N0cmVzczoKICAgICAgICAgdHlwZTogYXBwcm92YWwKICAgICAtIGoxMV91dGVzdHNfc3RyZXNzOgpAQCAtMTM3Myw2ICsxNDM4LDEyIEBACiAgICAgLSBqMTFfanZtX2R0ZXN0c192bm9kZV9yZXBlYXQ6CiAgICAgICAgIHJlcXVpcmVzOgogICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9zaW11bGF0b3JfZHRlc3RzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKICAgICAtIGoxMV9jcWxzaGxpYl90ZXN0czoKICAgICAgICAgcmVxdWlyZXM6CiAgICAgICAgICAgLSBqMTFfYnVpbGQKQEAgLTE0ODQsNiArMTU1NSwxNiBAQAogICAgICAgICByZXF1aXJlczoKICAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbgogICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfdHJpZQorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfdXRlc3RzX3RyaWVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c190cmllCisgICAgICAgICAgLSBqMTFfYnVpbGQKICAgICAtIHN0YXJ0X3V0ZXN0c19zdHJlc3M6CiAgICAgICAgIHR5cGU6IGFwcHJvdmFsCiAgICAgLSBqMTFfdXRlc3RzX3N0cmVzczoKQEAgLTE2MDYsNiArMTY4NywxNSBAQAogICAgICAgLSBsb2dfZW52aXJvbm1lbnQKICAgICAgIC0gcnVuX3NpbXVsYXRvcl90ZXN0cwogCisgIGoxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgIDw8OiAqajExX3NtYWxsX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjcmVhdGVfanVuaXRfY29udGFpbmVycworICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3NpbXVsYXRvcl90ZXN0cworCiAgIGo4X2p2bV9kdGVzdHM6CiAgICAgPDw6ICpqOF9zbWFsbF9wYXJfZXhlY3V0b3IKICAgICBzdGVwczoKQEAgLTE3NjYsNiArMTg1NiwyNiBAQAogICAgICAgLSBydW5fcGFyYWxsZWxfanVuaXRfdGVzdHM6CiAgICAgICAgICAgdGFyZ2V0OiB0ZXN0Y2xhc3NsaXN0LWNvbXByZXNzaW9uCiAKKyAgajhfdXRlc3RzX3RyaWU6CisgICAgPDw6ICpqOF9wYXJfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNyZWF0ZV9qdW5pdF9jb250YWluZXJzCisgICAgICAtIGxvZ19lbnZpcm9ubWVudAorICAgICAgLSBydW5fcGFyYWxsZWxfanVuaXRfdGVzdHM6CisgICAgICAgICAgdGFyZ2V0OiB0ZXN0Y2xhc3NsaXN0LXRyaWUKKworICBqMTFfdXRlc3RzX3RyaWU6CisgICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjcmVhdGVfanVuaXRfY29udGFpbmVycworICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3BhcmFsbGVsX2p1bml0X3Rlc3RzOgorICAgICAgICAgIHRhcmdldDogdGVzdGNsYXNzbGlzdC10cmllCisKICAgajhfdXRlc3RzX3N0cmVzczoKICAgICA8PDogKmo4X3NlcV9leGVjdXRvcgogICAgIHN0ZXBzOgpAQCAtMjMyOSw2ICsyNDM5LDIyIEBACiAgICAgICAtIGxvZ19lbnZpcm9ubWVudAogICAgICAgLSBydW5fdXRlc3RzX2NvbXByZXNzaW9uX3JlcGVhdAogCisgIGo4X3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICA8PDogKmo4X3JlcGVhdGVkX3V0ZXN0X2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3V0ZXN0c190cmllX3JlcGVhdAorCisgIGoxMV91dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgPDw6ICpqMTFfcmVwZWF0ZWRfdXRlc3RfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGxvZ19lbnZpcm9ubWVudAorICAgICAgLSBydW5fdXRlc3RzX3RyaWVfcmVwZWF0CisKICAgajhfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlfcmVwZWF0OgogICAgIDw8OiAqajhfcmVwZWF0ZWRfdXRlc3RfZXhlY3V0b3IKICAgICBzdGVwczoKQEAgLTI0MTcsNiArMjU0MywxNCBAQAogICAgICAgLSBsb2dfZW52aXJvbm1lbnQKICAgICAgIC0gcnVuX3NpbXVsYXRvcl9kdGVzdHNfcmVwZWF0CiAKKyAgajExX3NpbXVsYXRvcl9kdGVzdHNfcmVwZWF0OgorICAgIDw8OiAqajExX3JlcGVhdGVkX3V0ZXN0X2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3NpbXVsYXRvcl9kdGVzdHNfcmVwZWF0CisKICAgajhfanZtX3VwZ3JhZGVfZHRlc3RzX3JlcGVhdDoKICAgICA8PDogKmo4X3JlcGVhdGVkX2p2bV91cGdyYWRlX2R0ZXN0X2V4ZWN1dG9yCiAgICAgc3RlcHM6CkBAIC0zMDUzLDYgKzMxODcsMTQgQEAKICAgICAgICAgICBjb3VudDogJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9CiAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlOiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0KIAorICBydW5fdXRlc3RzX3RyaWVfcmVwZWF0OgorICAgIHN0ZXBzOgorICAgICAgLSBydW5fcmVwZWF0ZWRfdXRlc3RzOgorICAgICAgICAgIHRhcmdldDogdGVzdC10cmllCisgICAgICAgICAgdGVzdHM6ICR7UkVQRUFURURfVVRFU1RTfQorICAgICAgICAgIGNvdW50OiAke1JFUEVBVEVEX1VURVNUU19DT1VOVH0KKyAgICAgICAgICBzdG9wX29uX2ZhaWx1cmU6ICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfQorCiAgIHJ1bl91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeV9yZXBlYXQ6CiAgICAgc3RlcHM6CiAgICAgICAtIHJ1bl9yZXBlYXRlZF91dGVzdHM6CkBAIC0zMTU1LDcgKzMyOTcsNyBAQAogICAgICAgICAgICAgIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzCiAgICAgICAgICAgICB0ZXN0cz0kKGVjaG8gPDxwYXJhbWV0ZXJzLnRlc3RzPj4gfCBzZWQgLWUgInMvPG5pbD4vLyIgfCBzZWQgLWUgInMvIC8vIiB8IHRyICIsIiAiXG4iIHwgdHIgIiAiICJcbiIgfCBzb3J0IC1uIHwgdW5pcSAtdSkKICAgICAgICAgICAgIGVjaG8gIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfSIKLQorICAgICAgICAgICAgCiAgICAgICAgICAgICAjIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC4KICAgICAgICAgICAgIHZub2Rlcz08PHBhcmFtZXRlcnMudm5vZGVzPj4KICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCkBAIC0zMTcyLDYgKzMzMTQsOCBAQAogICAgICAgICAgICAgICB0ZXN0dGFnPSJjb21wcmVzc2lvbiIKICAgICAgICAgICAgIGVsaWYgW1sgJHRhcmdldCA9PSAidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5IiBdXTsgdGhlbgogICAgICAgICAgICAgICB0ZXN0dGFnPSJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5IgorICAgICAgICAgICAgZWxpZiBbWyAkdGFyZ2V0ID09ICJ0ZXN0LXRyaWUiIF1dOyB0aGVuCisgICAgICAgICAgICAgIHRlc3R0YWc9InRyaWUiCiAgICAgICAgICAgICBmaQogCiAgICAgICAgICAgICAjIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuCkBAIC0zMTkyLDYgKzMzMzYsNyBAQAogICAgICAgICAgICAgICAgIGlmIFtbICR0YXJnZXQgPT0gInRlc3QiIHx8IFwKICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LWNkYyIgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY29tcHJlc3Npb24iIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LXRyaWUiIHx8IFwKICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkiIHx8IFwKICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJmcWx0b29sLXRlc3QiIHx8IFwKICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJsb25nLXRlc3QiIHx8IFwKQEAgLTMzMTgsNiArMzQ2Myw3IEBACiAgICAgICAgICAgICAgICAgaWYgW1sgJHRhcmdldCA9PSAidGVzdCIgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY2RjIiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1jb21wcmVzc2lvbiIgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtdHJpZSIgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSIgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gImZxbHRvb2wtdGVzdCIgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gImxvbmctdGVzdCIgfHwgXApkaWZmIC0tZ2l0IGEvLmNpcmNsZWNpL2NvbmZpZ190ZW1wbGF0ZS55bWwuUEFJRC5wYXRjaCBiLy5jaXJjbGVjaS9jb25maWdfdGVtcGxhdGUueW1sLlBBSUQucGF0Y2gKaW5kZXggMDk4Y2NkMi4uZGFhYWQyZiAxMDA2NDQKLS0tIGEvLmNpcmNsZWNpL2NvbmZpZ190ZW1wbGF0ZS55bWwuUEFJRC5wYXRjaAorKysgYi8uY2lyY2xlY2kvY29uZmlnX3RlbXBsYXRlLnltbC5QQUlELnBhdGNoCkBAIC0xLDYgKzEsNiBAQAotLS0tIGNvbmZpZy0yXzEueW1sCTIwMjMtMDItMDIgMjE6MjQ6MzkuMDAwMDAwMDAwIC0wNTAwCi0rKysgY29uZmlnLTJfMS55bWwuTUlEUkVTCTIwMjMtMDItMDIgMjE6MjU6MDUuMDAwMDAwMDAwIC0wNTAwCi1AQCAtMTU3LDE0ICsxNTcsMTQgQEAKKy0tLSBjb25maWdfdGVtcGxhdGUueW1sCTIwMjMtMDMtMTAgMDk6NDc6MDUuNTUyMTY1MDM2IC0wNjAwCisrKysgY29uZmlnX3RlbXBsYXRlLnltbC5QQUlECTIwMjMtMDMtMTAgMDk6NTE6MjEuMTc0MDcxNTc2IC0wNjAwCitAQCAtMTU2LDE0ICsxNTYsMTQgQEAKICBqOF9wYXJfZXhlY3V0b3I6ICZqOF9wYXJfZXhlY3V0b3IKICAgIGV4ZWN1dG9yOgogICAgICBuYW1lOiBqYXZhOC1leGVjdXRvcgpAQCAtMTksNyArMTksNyBAQAogIAogIGo4X3NtYWxsX2V4ZWN1dG9yOiAmajhfc21hbGxfZXhlY3V0b3IKICAgIGV4ZWN1dG9yOgotQEAgLTE3MiwyOSArMTcyLDQxIEBACitAQCAtMTcxLDI5ICsxNzEsNDEgQEAKICAgICAgZXhlY19yZXNvdXJjZV9jbGFzczogbWVkaXVtCiAgICBwYXJhbGxlbGlzbTogMQogIApAQCAtMzIsNyArMzIsNyBAQAogK2o4X3ZlcnlfbGFyZ2VfcGFyX2V4ZWN1dG9yOiAmajhfdmVyeV9sYXJnZV9wYXJfZXhlY3V0b3IKICsgIGV4ZWN1dG9yOgogKyAgICBuYW1lOiBqYXZhOC1leGVjdXRvcgotKyAgICBleGVjX3Jlc291cmNlX2NsYXNzOiB4bGFyZ2UKKysgICAgZXhlY19yZXNvdXJjZV9jbGFzczogbGFyZ2UKICsgIHBhcmFsbGVsaXNtOiAxMDAKICsKICBqOF9tZWRpdW1fcGFyX2V4ZWN1dG9yOiAmajhfbWVkaXVtX3Bhcl9leGVjdXRvcgpAQCAtNjgsNyArNjgsNyBAQAogIAogIGoxMV9zbWFsbF9leGVjdXRvcjogJmoxMV9zbWFsbF9leGVjdXRvcgogICAgZXhlY3V0b3I6Ci1AQCAtMjA1LDQ0ICsyMTcsNTYgQEAKK0BAIC0yMDQsNDQgKzIxNiw1NiBAQAogIGoxMV9tZWRpdW1fcGFyX2V4ZWN1dG9yOiAmajExX21lZGl1bV9wYXJfZXhlY3V0b3IKICAgIGV4ZWN1dG9yOgogICAgICBuYW1lOiBqYXZhMTEtZXhlY3V0b3IKQEAgLTEzNCw3ICsxMzQsNyBAQAogIAogIGo4X3NlcGFyYXRlX2pvYnM6ICZqOF9zZXBhcmF0ZV9qb2JzCiAgICBqb2JzOgotQEAgLTE4MTksNyArMTg0Myw3IEBACitAQCAtMTkyOSw3ICsxOTUzLDcgQEAKICAgICAgICAgICAgdGFyZ2V0OiB0ZXN0Y2xhc3NsaXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkKICAKICAgIGo4X2R0ZXN0c192bm9kZToKQEAgLTE0Myw3ICsxNDMsNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0xODMzLDcgKzE4NTcsNyBAQAorQEAgLTE5NDMsNyArMTk2Nyw3IEBACiAgICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJwogIAogICAgajhfZHRlc3RzX29mZmhlYXA6CkBAIC0xNTIsNyArMTUyLDcgQEAKICAgICAgc3RlcHM6CiAgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgogICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCi1AQCAtMTg0Nyw3ICsxODcxLDcgQEAKK0BAIC0xOTU3LDcgKzE5ODEsNyBAQAogICAgICAgICAgICBweXRlc3RfZXh0cmFfYXJnczogJy0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCiAgCiAgICBqMTFfZHRlc3RzX3Zub2RlOgpAQCAtMTYxLDcgKzE2MSw3IEBACiAgICAgIHN0ZXBzOgogICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCi1AQCAtMTg2Miw3ICsxODg2LDcgQEAKK0BAIC0xOTcyLDcgKzE5OTYsNyBAQAogICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCiAgCiAgICBqMTFfZHRlc3RzX29mZmhlYXA6CkBAIC0xNzAsNyArMTcwLDcgQEAKICAgICAgc3RlcHM6CiAgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgogICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCi1AQCAtMTg3Nyw3ICsxOTAxLDcgQEAKK0BAIC0xOTg3LDcgKzIwMTEsNyBAQAogICAgICAgICAgICBweXRlc3RfZXh0cmFfYXJnczogJy0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCiAgCiAgICBqOF9kdGVzdHM6CkBAIC0xNzksNyArMTc5LDcgQEAKICAgICAgc3RlcHM6CiAgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgogICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCi1AQCAtMTg5MSw3ICsxOTE1LDcgQEAKK0BAIC0yMDAxLDcgKzIwMjUsNyBAQAogICAgICAgICAgICBweXRlc3RfZXh0cmFfYXJnczogJy0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCiAgCiAgICBqMTFfZHRlc3RzOgpAQCAtMTg4LDcgKzE4OCw3IEBACiAgICAgIHN0ZXBzOgogICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCi1AQCAtMTkwNiw3ICsxOTMwLDcgQEAKK0BAIC0yMDE2LDcgKzIwNDAsNyBAQAogICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJwogIAogICAgajhfdXBncmFkZV9kdGVzdHM6CkBAIC0xOTcsNyArMTk3LDcgQEAKICAgICAgc3RlcHM6CiAgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgogICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCi1AQCAtMTkyMCw3ICsxOTQ0LDcgQEAKK0BAIC0yMDMwLDcgKzIwNTQsNyBAQAogICAgICAgICAgICBweXRlc3RfZXh0cmFfYXJnczogJy0tZXhlY3V0ZS11cGdyYWRlLXRlc3RzLW9ubHkgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCcKICAKICAgIGo4X2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CkBAIC0yMDYsNyArMjA2LDcgQEAKICAgICAgc3RlcHM6CiAgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgogICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCi1AQCAtMTkzNSw3ICsxOTU5LDcgQEAKK0BAIC0yMDQ1LDcgKzIwNjksNyBAQAogICAgICAgICAgICBleHRyYV9lbnZfYXJnczogJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYnCiAgCiAgICBqOF9jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CkBAIC0yMTUsNyArMjE1LDcgQEAKICAgICAgc3RlcHM6CiAgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgogICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCi1AQCAtMTk1MCw3ICsxOTc0LDcgQEAKK0BAIC0yMDYwLDcgKzIwODQsNyBAQAogICAgICAgICAgICBleHRyYV9lbnZfYXJnczogJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYnCiAgCiAgICBqOF9jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKQEAgLTIyNCw3ICsyMjQsNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0xOTY4LDcgKzE5OTIsNyBAQAorQEAgLTIwNzgsNyArMjEwMiw3IEBACiAgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JwogIAogICAgajhfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgpAQCAtMjMzLDcgKzIzMyw3IEBACiAgICAgIHN0ZXBzOgogICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKICAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQotQEAgLTE5ODYsNyArMjAxMCw3IEBACitAQCAtMjA5Niw3ICsyMTIwLDcgQEAKICAgICAgICAgICAgcHl0aG9uX3ZlcnNpb246ICczLjExJwogIAogICAgajhfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKQEAgLTI0Miw3ICsyNDIsNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0yMDA0LDcgKzIwMjgsNyBAQAorQEAgLTIxMTQsNyArMjEzOCw3IEBACiAgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JwogIAogICAgajhfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CkBAIC0yNTEsNyArMjUxLDcgQEAKICAgICAgc3RlcHM6CiAgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgogICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCi1AQCAtMjAyMiw3ICsyMDQ2LDcgQEAKK0BAIC0yMTMyLDcgKzIxNTYsNyBAQAogICAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuMTEnCiAgCiAgICBqOF9jcWxzaF9kdGVzdHNfcHkzOgpAQCAtMjYwLDcgKzI2MCw3IEBACiAgICAgIHN0ZXBzOgogICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKICAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQotQEAgLTIwMzcsNyArMjA2MSw3IEBACitAQCAtMjE0Nyw3ICsyMTcxLDcgQEAKICAgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JwogIAogICAgajhfY3Fsc2hfZHRlc3RzX3B5Mzg6CkBAIC0yNjksNyArMjY5LDcgQEAKICAgICAgc3RlcHM6CiAgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgogICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCi1AQCAtMjA1NSw3ICsyMDc5LDcgQEAKK0BAIC0yMTY1LDcgKzIxODksNyBAQAogICAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKICAKICAgIGo4X2NxbHNoX2R0ZXN0c19weTMxMToKQEAgLTI3OCw3ICsyNzgsNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0yMDczLDcgKzIwOTcsNyBAQAorQEAgLTIxODMsNyArMjIwNyw3IEBACiAgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKICAKICAgIGoxMV9jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgpAQCAtMjg3LDcgKzI4Nyw3IEBACiAgICAgIHN0ZXBzOgogICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKICAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQotQEAgLTIwODgsNyArMjExMiw3IEBACitAQCAtMjE5OCw3ICsyMjIyLDcgQEAKICAgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JwogIAogICAgajExX2NxbHNoX2R0ZXN0c19weTNfb2ZmaGVhcDoKQEAgLTI5Niw3ICsyOTYsNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0yMTAzLDcgKzIxMjcsNyBAQAorQEAgLTIyMTMsNyArMjIzNyw3IEBACiAgICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicKICAKICAgIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKQEAgLTMwNSw3ICszMDUsNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0yMTIxLDcgKzIxNDUsNyBAQAorQEAgLTIyMzEsNyArMjI1NSw3IEBACiAgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JwogIAogICAgajExX2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKQEAgLTMxNCw3ICszMTQsNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0yMTM5LDcgKzIxNjMsNyBAQAorQEAgLTIyNDksNyArMjI3Myw3IEBACiAgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKICAKICAgIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF9vZmZoZWFwOgpAQCAtMzIzLDcgKzMyMyw3IEBACiAgICAgIHN0ZXBzOgogICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKICAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQotQEAgLTIxNTcsNyArMjE4MSw3IEBACitAQCAtMjI2Nyw3ICsyMjkxLDcgQEAKICAgICAgICAgICAgcHl0aG9uX3ZlcnNpb246ICczLjgnCiAgCiAgICBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CkBAIC0zMzIsNyArMzMyLDcgQEAKICAgICAgc3RlcHM6CiAgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgogICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCi1AQCAtMjE3NSw3ICsyMTk5LDcgQEAKK0BAIC0yMjg1LDcgKzIzMDksNyBAQAogICAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuMTEnCiAgCiAgICBqMTFfY3Fsc2hfZHRlc3RzX3B5MzoKQEAgLTM0MSw3ICszNDEsNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0yMTkwLDcgKzIyMTQsNyBAQAorQEAgLTIzMDAsNyArMjMyNCw3IEBACiAgICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicKICAKICAgIGoxMV9jcWxzaF9kdGVzdHNfcHkzODoKQEAgLTM1MCw3ICszNTAsNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0yMjA4LDcgKzIyMzIsNyBAQAorQEAgLTIzMTgsNyArMjM0Miw3IEBACiAgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JwogIAogICAgajExX2NxbHNoX2R0ZXN0c19weTMxMToKQEAgLTM1OSw3ICszNTksNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0yMjI2LDcgKzIyNTAsNyBAQAorQEAgLTIzMzYsNyArMjM2MCw3IEBACiAgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKICAKICAgIGo4X2R0ZXN0c19sYXJnZV92bm9kZToKQEAgLTM2OCw3ICszNjgsNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0yMjQwLDcgKzIyNjQsNyBAQAorQEAgLTIzNTAsNyArMjM3NCw3IEBACiAgICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJwogIAogICAgajhfZHRlc3RzX2xhcmdlOgpAQCAtMzc3LDcgKzM3Nyw3IEBACiAgICAgIHN0ZXBzOgogICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKICAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQotQEAgLTIyNTQsNyArMjI3OCw3IEBACitAQCAtMjM2NCw3ICsyMzg4LDcgQEAKICAgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJwogIAogICAgajExX2R0ZXN0c19sYXJnZV92bm9kZToKQEAgLTM4Niw3ICszODYsNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0yMjY4LDcgKzIyOTIsNyBAQAorQEAgLTIzNzgsNyArMjQwMiw3IEBACiAgICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJwogIAogICAgajExX2R0ZXN0c19sYXJnZToKZGlmZiAtLWdpdCBhLy5jaXJjbGVjaS9jb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbCBiLy5jaXJjbGVjaS9jb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWFkOTFjCi0tLSAvZGV2L251bGwKKysrIGIvLmNpcmNsZWNpL2NvbmZpZ190ZW1wbGF0ZV8xMV9hbmRfMTcueW1sCkBAIC0wLDAgKzEsMzQ1MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordmVyc2lvbjogMi4xCisKK2RlZmF1bHRfZW52X3ZhcnM6ICZkZWZhdWx0X2Vudl92YXJzCisKKyAgICAjIFRoZSB2YWx1ZXMgb2Ygc29tZSBvZiB0aGVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIG1lYW50IHRvIGJlIGZyZXF1ZW50bHkgY2hhbmdlZCBieSBkZXZlbG9wZXJzLgorICAgICMgVGhlIGdlbmVyYXRlLnNoIHNjcmlwdCBjb250YWlucyBhIGxpc3Qgb2YgYWNjZXB0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgc2hvdWxkIGNvbnRhaW4gc29tZSBvZgorICAgICMgdGhlc2UgdmFyaWFibGVzLiBBbHNvLCBzb21lIHZhcmlhYmxlcyBhcmUgbWVudGlvbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uLCBhdCBsZWFzdCBpbgorICAgICMgLmNpcmNsZWNpL3JlYWRtZS5tZCBhbmQgaW4gZG9jL3NvdXJjZS9kZXZlbG9wbWVudC90ZXN0aW5nLnJzdC4KKyAgICAjIElmIHlvdSBtb2RpZnkgdGhlc2UgdmFyaWFibGVzLCBvciBpZiB5b3UgYWRkIG5ldyB2YXJpYWJsZXMgd2hvc2UgdmFsdWVzIGFyZSBtZWFudCB0byBiZSBjaGFuZ2VkIGZyZXF1ZW50bHksCisgICAgIyBwbGVhc2UgcmVtZW1iZXIgdG8gbW9kaWZ5IHRoZSBnZW5lcmF0ZS5zaCBzY3JpcHQgYW5kIHRoZSBkb2N1bWVudGF0aW9uIGFjY29yZGluZ2x5LgorCisgICAgQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgTEFORzogZW5fVVMuVVRGLTgKKyAgICBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgI1NraXAgYWxsIHN5bmNpbmcgdG8gZGlzayB0byBhdm9pZCBwZXJmb3JtYW5jZSBpc3N1ZXMgaW4gZmxha3kgQ0kgZW52aXJvbm1lbnRzCisgICAgQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisKKyAgICAjIFdoZXRoZXIgdGhlIHJlcGVhdGVkIHRlc3QgaXRlcmF0aW9ucyBzaG91bGQgc3RvcCBvbiB0aGUgZmlyc3QgZmFpbHVyZSBieSBkZWZhdWx0LgorICAgIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKworICAgICMgQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGVzdHMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHJlcGVhdGVkIHJ1biBmb3IgcmVndWxhciB1bml0IHRlc3RzLAorICAgICMgaW4gYWRkaXRpb24gdG8gYXV0b21hdGljYWxseSBkZXRlY3RlZCBuZXcgYW5kIG1vZGlmaWVkIHRlc3RzLiBGb3IgZXhhbXBsZToKKyAgICAjIFJFUEVBVEVEX1VURVNUUzogb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5WaWV3VGVzdAorICAgICMgUkVQRUFURURfVVRFU1RTOiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlZpZXdUZXN0I3Rlc3RDb3VudGVyc1RhYmxlCisgICAgIyBSRVBFQVRFRF9VVEVTVFM6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVmlld1Rlc3Qsb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuVGltZUZjdHNUZXN0CisgICAgUkVQRUFURURfVVRFU1RTOgorICAgICMgVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IG5ldywgbW9kaWZpZWQgb3IgbWFudWFsbHkgc3BlY2lmaWVkIHVuaXQgdGVzdHMgc2hvdWxkIGJlIHJ1bi4KKyAgICBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorCisgICAgIyBDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0ZXN0cyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVwZWF0ZWQgcnVuIGZvciBmcWx0b29sIHVuaXQgdGVzdHMsCisgICAgIyBpbiBhZGRpdGlvbiB0byBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIG5ldyBhbmQgbW9kaWZpZWQgdGVzdHMuIEZvciBleGFtcGxlOgorICAgICMgUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmZxbHRvb2wuRlFMQ29tcGFyZVRlc3QKKyAgICAjIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5mcWx0b29sLkZRTENvbXBhcmVUZXN0I2VuZFRvRW5kCisgICAgIyBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogb3JnLmFwYWNoZS5jYXNzYW5kcmEuZnFsdG9vbC5GUUxDb21wYXJlVGVzdCxvcmcuYXBhY2hlLmNhc3NhbmRyYS5mcWx0b29sLkZRTFJlcGxheVRlc3QKKyAgICBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDoKKyAgICAjIFRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBuZXcsIG1vZGlmaWVkIG9yIG1hbnVhbGx5IHNwZWNpZmllZCBmcWx0b29sIHVuaXQgdGVzdHMgc2hvdWxkIGJlIHJ1bi4KKyAgICBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisKKyAgICAjIENvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRlc3RzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSByZXBlYXRlZCBydW4gZm9yIGxvbmcgdW5pdCB0ZXN0cywKKyAgICAjIGluIGFkZGl0aW9uIHRvIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgbmV3IGFuZCBtb2RpZmllZCB0ZXN0cy4gRm9yIGV4YW1wbGU6CisgICAgIyBSRVBFQVRFRF9VVEVTVFNfTE9ORzogb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZ1N0cmVzc1Rlc3QKKyAgICAjIFJFUEVBVEVEX1VURVNUU19MT05HOiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nU3RyZXNzVGVzdCN0ZXN0UmFuZG9tU2l6ZQorICAgIFJFUEVBVEVEX1VURVNUU19MT05HOgorICAgICMgVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IG5ldywgbW9kaWZpZWQgb3IgbWFudWFsbHkgc3BlY2lmaWVkIGxvbmcgdW5pdCB0ZXN0cyBzaG91bGQgYmUgcnVuLgorICAgIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKworICAgICMgQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGVzdHMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHJlcGVhdGVkIHJ1biBmb3Igc3RyZXNzIHVuaXQgdGVzdHMsCisgICAgIyBpbiBhZGRpdGlvbiB0byBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIG5ldyBhbmQgbW9kaWZpZWQgdGVzdHMuIEZvciBleGFtcGxlOgorICAgICMgUkVQRUFURURfVVRFU1RTX1NUUkVTUzogb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZXNzLmdlbmVyYXRlLkRpc3RyaWJ1dGlvbkdhdXNzaWFuVGVzdAorICAgICMgUkVQRUFURURfVVRFU1RTX1NUUkVTUzogb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZXNzLmdlbmVyYXRlLkRpc3RyaWJ1dGlvbkdhdXNzaWFuVGVzdCNzaW1wbGVHYXVzc2lhbgorICAgIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6CisgICAgIyBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgbmV3LCBtb2RpZmllZCBvciBtYW51YWxseSBzcGVjaWZpZWQgc3RyZXNzIHVuaXQgdGVzdHMgc2hvdWxkIGJlIHJ1bi4KKyAgICBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKworICAgICMgQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGVzdHMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHJlcGVhdGVkIHJ1biBmb3Igc2ltdWxhdG9yIGR0ZXN0cywKKyAgICAjIGluIGFkZGl0aW9uIHRvIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgbmV3IGFuZCBtb2RpZmllZCB0ZXN0cy4gRm9yIGV4YW1wbGU6CisgICAgIyBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zaW11bGF0b3IudGVzdC5Ucml2aWFsU2ltdWxhdGlvblRlc3QKKyAgICAjIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNpbXVsYXRvci50ZXN0LlRyaXZpYWxTaW11bGF0aW9uVGVzdCN0cml2aWFsVGVzdAorICAgIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6CisgICAgIyBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgbmV3LCBtb2RpZmllZCBvciBtYW51YWxseSBzcGVjaWZpZWQgc2ltdWxhdG9yIGR0ZXN0cyBzaG91bGQgYmUgcnVuLgorICAgIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorCisgICAgIyBDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0ZXN0cyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVwZWF0ZWQgcnVuIGZvciBKVk0gZHRlc3RzLAorICAgICMgaW4gYWRkaXRpb24gdG8gYXV0b21hdGljYWxseSBkZXRlY3RlZCBuZXcgYW5kIG1vZGlmaWVkIHRlc3RzLiBGb3IgZXhhbXBsZToKKyAgICAjIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3QuUGFnaW5nVGVzdAorICAgICMgUkVQRUFURURfSlZNX0RURVNUUzogb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5QYWdpbmdUZXN0I3Rlc3RQYWdpbmcKKyAgICBSRVBFQVRFRF9KVk1fRFRFU1RTOgorICAgICMgVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IG5ldywgbW9kaWZpZWQgb3IgbWFudWFsbHkgc3BlY2lmaWVkIEpWTSBkdGVzdHMgc2hvdWxkIGJlIHJ1bi4KKyAgICBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKworICAgICMgQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgUHl0aG9uIGR0ZXN0cyB0aGF0IHNob3VsZCBiZSByZXBlYXRlZGx5IHJ1biwgZm9yIGV4YW1wbGU6CisgICAgIyBSRVBFQVRFRF9EVEVTVFM6IGNxbHNoX3Rlc3RzL3Rlc3RfY3Fsc2gucHkKKyAgICAjIFJFUEVBVEVEX0RURVNUUzogY3Fsc2hfdGVzdHMvdGVzdF9jcWxzaC5weTo6VGVzdENxbHNoU21va2UKKyAgICAjIFJFUEVBVEVEX0RURVNUUzogY3Fsc2hfdGVzdHMvdGVzdF9jcWxzaC5weTo6VGVzdENxbHNoU21va2U6OnRlc3RfY3JlYXRlX2luZGV4CisgICAgIyBSRVBFQVRFRF9EVEVTVFM6IGNxbHNoX3Rlc3RzL3Rlc3RfY3Fsc2gucHksY29uc2lzdGVuY3lfdGVzdC5weQorICAgIFJFUEVBVEVEX0RURVNUUzoKKyAgICAjIFRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGUgbWFudWFsbHkgc3BlY2lmaWVkIFB5dGhvbiBkdGVzdHMgc2hvdWxkIGJlIHJ1bi4KKyAgICBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorCisgICAgIyBDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBQeXRob24gbGFyZ2UgZHRlc3RzIHRoYXQgc2hvdWxkIGJlIHJlcGVhdGVkbHkgcnVuLCBmb3IgZXhhbXBsZToKKyAgICAjIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogcmVwbGFjZV9hZGRyZXNzX3Rlc3QucHkKKyAgICAjIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogcmVwbGFjZV9hZGRyZXNzX3Rlc3QucHk6OlRlc3RSZXBsYWNlQWRkcmVzcworICAgICMgUkVQRUFURURfTEFSR0VfRFRFU1RTOiByZXBsYWNlX2FkZHJlc3NfdGVzdC5weTo6VGVzdFJlcGxhY2VBZGRyZXNzOjp0ZXN0X3JlcGxhY2Vfc3RvcHBlZF9ub2RlCisgICAgIyBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IHJlcGxhY2VfYWRkcmVzc190ZXN0LnB5LG1hdGVyaWFsaXplZF92aWV3c190ZXN0LnB5CisgICAgUkVQRUFURURfTEFSR0VfRFRFU1RTOgorICAgICMgVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoZSBtYW51YWxseSBzcGVjaWZpZWQgUHl0aG9uIGxhcmdlIGR0ZXN0cyBzaG91bGQgYmUgcnVuLgorICAgIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisKKyAgICAjIFRoZSBBbnQgdGVzdCB0YXJnZXQgdG8gcnVuLCBmb3IgZXhhbXBsZToKKyAgICAjIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAjIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdC1qdm0tZHRlc3Qtc29tZQorICAgICMgUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0LWNkYworICAgICMgUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0LWNvbXByZXNzaW9uCisgICAgIyBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3QtdHJpZQorICAgICMgUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkKKyAgICBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgIyBUaGUgbmFtZSBvZiBKVW5pdCBjbGFzcyB0byBiZSBydW4gbXVsdGlwbGUgdGltZXMsIGZvciBleGFtcGxlOgorICAgICMgUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVmlld1Rlc3QKKyAgICAjIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LlBhZ2luZ1Rlc3QKKyAgICBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzoKKyAgICAjIFRoZSBvcHRpb25hbCBzcGVjaWZpYyBtZXRob2RzIHdpdGhpbiBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUyB0byBiZSBydW4sIGZvciBleGFtcGxlOgorICAgICMgUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogdGVzdENvbXBvdW5kUGFydGl0aW9uS2V5CisgICAgIyBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiB0ZXN0Q29tcG91bmRQYXJ0aXRpb25LZXksdGVzdFN0YXRpY1RhYmxlCisgICAgIyBQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgQW50IHRhcmdldHMgd2lsbCBpZ25vcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50IHByb2R1Y2VkIGJ5IHRoaXMuCisgICAgUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzoKKyAgICAjIFdoZXRoZXIgdGhlIHRlc3QgaXRlcmF0aW9uIHNob3VsZCB1c2Ugdm5vZGVzIGZvciBKVk0gZHRlc3RzICgtRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnKS4KKyAgICAjIFRoaXMgd2lsbCBvbmx5IGJlIGFwcGxpZWQgYXMgYSBkZWZhdWx0IHRvIEpWTSBkdGVzdHMgdGhhdCBkb24ndCBwcm92aWRlIHRoZWlyIG93biBpbml0aWFsIHRva2VucyBvciB0b2tlbiBjb3VudCwKKyAgICAjIGluIHRoZSBzYW1lIHdheSB0aGF0IGl0J3MgZG9uZSBmb3IgKl9qdm1fZHRlc3RzX3Zub2RlIGpvYnMuIEFudCB0YXJnZXRzIG90aGVyIHRoYW4gSlZNIGR0ZXN0cyB3aWxsIGlnbm9yZSB0aGlzLgorICAgIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAjIFRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGUgcmVwZWF0ZWQgSlVuaXQgdGVzdCBzaG91bGQgYmUgcnVuLgorICAgIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKworajExX3Bhcl9leGVjdXRvcjogJmoxMV9wYXJfZXhlY3V0b3IKKyAgZXhlY3V0b3I6CisgICAgbmFtZTogamF2YTExLWV4ZWN1dG9yCisgICAgI2V4ZWNfcmVzb3VyY2VfY2xhc3M6IHhsYXJnZQorICBwYXJhbGxlbGlzbTogNAorCitqMTFfc21hbGxfcGFyX2V4ZWN1dG9yOiAmajExX3NtYWxsX3Bhcl9leGVjdXRvcgorICBleGVjdXRvcjoKKyAgICBuYW1lOiBqYXZhMTEtZXhlY3V0b3IKKyAgICAjZXhlY19yZXNvdXJjZV9jbGFzczogeGxhcmdlCisgIHBhcmFsbGVsaXNtOiAxCisKK2oxMV9zbWFsbF9leGVjdXRvcjogJmoxMV9zbWFsbF9leGVjdXRvcgorICBleGVjdXRvcjoKKyAgICBuYW1lOiBqYXZhMTEtZXhlY3V0b3IKKyAgICBleGVjX3Jlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgcGFyYWxsZWxpc206IDEKKworajExX21lZGl1bV9wYXJfZXhlY3V0b3I6ICZqMTFfbWVkaXVtX3Bhcl9leGVjdXRvcgorICBleGVjdXRvcjoKKyAgICBuYW1lOiBqYXZhMTEtZXhlY3V0b3IKKyAgICAjZXhlY19yZXNvdXJjZV9jbGFzczogeGxhcmdlCisgIHBhcmFsbGVsaXNtOiAxCisKK2oxMV9zZXFfZXhlY3V0b3I6ICZqMTFfc2VxX2V4ZWN1dG9yCisgIGV4ZWN1dG9yOgorICAgIG5hbWU6IGphdmExMS1leGVjdXRvcgorICAgICNleGVjX3Jlc291cmNlX2NsYXNzOiB4bGFyZ2UKKyAgICBleGVjX3Jlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgcGFyYWxsZWxpc206IDEgIyBzZXF1ZW50aWFsLCBzaW5nbGUgY29udGFpbmVyIHRlc3RzOiBubyBwYXJhbGxlbGlzbSBiZW5lZml0cworCitqMTdfcGFyX2V4ZWN1dG9yOiAmajE3X3Bhcl9leGVjdXRvcgorICBleGVjdXRvcjoKKyAgICBuYW1lOiBqYXZhMTctZXhlY3V0b3IKKyAgICAjZXhlY19yZXNvdXJjZV9jbGFzczogeGxhcmdlCisgIHBhcmFsbGVsaXNtOiA0CisKK2oxN19zbWFsbF9wYXJfZXhlY3V0b3I6ICZqMTdfc21hbGxfcGFyX2V4ZWN1dG9yCisgIGV4ZWN1dG9yOgorICAgIG5hbWU6IGphdmExNy1leGVjdXRvcgorICAgICNleGVjX3Jlc291cmNlX2NsYXNzOiB4bGFyZ2UKKyAgcGFyYWxsZWxpc206IDEKKworajE3X3NtYWxsX2V4ZWN1dG9yOiAmajE3X3NtYWxsX2V4ZWN1dG9yCisgIGV4ZWN1dG9yOgorICAgIG5hbWU6IGphdmExNy1leGVjdXRvcgorICAgICNleGVjX3Jlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgcGFyYWxsZWxpc206IDEKKworajE3X21lZGl1bV9wYXJfZXhlY3V0b3I6ICZqMTdfbWVkaXVtX3Bhcl9leGVjdXRvcgorICBleGVjdXRvcjoKKyAgICBuYW1lOiBqYXZhMTctZXhlY3V0b3IKKyAgICAjZXhlY19yZXNvdXJjZV9jbGFzczogeGxhcmdlCisgIHBhcmFsbGVsaXNtOiAxCisKK2oxN19zZXFfZXhlY3V0b3I6ICZqMTdfc2VxX2V4ZWN1dG9yCisgIGV4ZWN1dG9yOgorICAgIG5hbWU6IGphdmExNy1leGVjdXRvcgorICAgICNleGVjX3Jlc291cmNlX2NsYXNzOiB4bGFyZ2UKKyAgcGFyYWxsZWxpc206IDEgIyBzZXF1ZW50aWFsLCBzaW5nbGUgY29udGFpbmVyIHRlc3RzOiBubyBwYXJhbGxlbGlzbSBiZW5lZml0cworCitqMTFfcmVwZWF0ZWRfdXRlc3RfZXhlY3V0b3I6ICZqMTFfcmVwZWF0ZWRfdXRlc3RfZXhlY3V0b3IKKyAgZXhlY3V0b3I6CisgICAgbmFtZTogamF2YTExLWV4ZWN1dG9yCisgIHBhcmFsbGVsaXNtOiA0CisKK2oxMV9yZXBlYXRlZF9kdGVzdF9leGVjdXRvcjogJmoxMV9yZXBlYXRlZF9kdGVzdF9leGVjdXRvcgorICBleGVjdXRvcjoKKyAgICBuYW1lOiBqYXZhMTEtZXhlY3V0b3IKKyAgcGFyYWxsZWxpc206IDQKKworajE3X3JlcGVhdGVkX3V0ZXN0X2V4ZWN1dG9yOiAmajE3X3JlcGVhdGVkX3V0ZXN0X2V4ZWN1dG9yCisgIGV4ZWN1dG9yOgorICAgIG5hbWU6IGphdmExNy1leGVjdXRvcgorICBwYXJhbGxlbGlzbTogNAorCitqMTdfcmVwZWF0ZWRfZHRlc3RfZXhlY3V0b3I6ICZqMTdfcmVwZWF0ZWRfZHRlc3RfZXhlY3V0b3IKKyAgZXhlY3V0b3I6CisgICAgbmFtZTogamF2YTE3LWV4ZWN1dG9yCisgIHBhcmFsbGVsaXNtOiA0CisKK2oxMV9zZXBhcmF0ZV9qb2JzOiAmajExX3NlcGFyYXRlX2pvYnMKKyAgam9iczoKKyAgICAtIHN0YXJ0X2oxMV9idWlsZDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9idWlsZDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfYnVpbGQKKyAgICAjIEphdmEgMTEgdW5pdCB0ZXN0cworICAgIC0gc3RhcnRfajExX3VuaXRfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdW5pdF90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfdW5pdF90ZXN0cworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdW5pdF90ZXN0c19yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdW5pdF90ZXN0c19yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3VuaXRfdGVzdHNfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9qdm1fZHRlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2p2bV9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX2p2bV9kdGVzdHMKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfanZtX2R0ZXN0c192bm9kZQorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfanZtX2R0ZXN0c19yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfanZtX2R0ZXN0c19yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX2p2bV9kdGVzdHNfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfanZtX2R0ZXN0c192bm9kZV9yZXBlYXQKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfanZtX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0cworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzX3Zub2RlCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19qdm1fZHRlc3RzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0c19yZXBlYXQKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2p2bV9kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9zaW11bGF0b3JfZHRlc3RzCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9zaW11bGF0b3JfZHRlc3RzX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9zaW11bGF0b3JfZHRlc3RzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfc2ltdWxhdG9yX2R0ZXN0c19yZXBlYXQKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2NxbHNobGliX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2NxbHNobGliX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaGxpYl90ZXN0cworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hsaWJfdGVzdHMKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2NxbHNobGliX2N5dGhvbl90ZXN0cworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBKYXZhIDE3IHVuaXQgdGVzdHMKKyAgICAtIHN0YXJ0X2oxN191bml0X3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3VuaXRfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X3VuaXRfdGVzdHMKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3VuaXRfdGVzdHNfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3VuaXRfdGVzdHNfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN191bml0X3Rlc3RzX3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBzcGVjaWFsaXplZCB1bml0IHRlc3RzIChhbGwgcnVuIG9uIHJlcXVlc3QpCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX2xvbmc6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2xvbmc6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19sb25nCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfbG9uZzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfbG9uZzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2xvbmcKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c19sb25nX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfbG9uZ19yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19sb25nX3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2xvbmdfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19sb25nX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2xvbmdfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfY2RjOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19jZGM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19jZGMKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jZGM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NkYzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NkYworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX2NkY19yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2NkY19yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19jZGNfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfY2RjX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfY2RjX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NkY19yZXBlYXQKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19jb21wcmVzc2lvbgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NvbXByZXNzaW9uCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfY29tcHJlc3Npb25fcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19jb21wcmVzc2lvbl9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19jb21wcmVzc2lvbl9yZXBlYXQKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jb21wcmVzc2lvbl9yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NvbXByZXNzaW9uX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NvbXByZXNzaW9uX3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3RyaWUKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllX3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX3RyaWVfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3RyaWVfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfc3RyZXNzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19zdHJlc3MKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N0cmVzcworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX3N0cmVzc19yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3N0cmVzc19yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19zdHJlc3NfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3RyZXNzX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfc3RyZXNzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N0cmVzc19yZXBlYXQKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c19mcWx0b29sOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19mcWx0b29sOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfZnFsdG9vbAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19mcWx0b29sCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfZnFsdG9vbF9yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2ZxbHRvb2xfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfZnFsdG9vbF9yZXBlYXQKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19mcWx0b29sX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfZnFsdG9vbF9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19mcWx0b29sX3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnkKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5X3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5X3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5X3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAjIFB5dGhvbiBEVGVzdHMKKyAgICAtIHN0YXJ0X2oxMV9kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHMKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2R0ZXN0c192bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX2R0ZXN0c192bm9kZQorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBKYXZhIDExIG9mZi1oZWFwIGR0ZXN0cworICAgIC0gc3RhcnRfajExX2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfZHRlc3RzX29mZmhlYXBfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c19vZmZoZWFwX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX29mZmhlYXBfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAjIEphdmEgMTcgZHRlc3RzCisgICAgLSBzdGFydF9qMTdfZHRlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c192bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c192bm9kZQorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBKYXZhIDE3IG9mZi1oZWFwIGR0ZXN0cworICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXBfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19vZmZoZWFwX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXBfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAjIFB5dGhvbiBsYXJnZSBEVGVzdHMKKyAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2U6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfZHRlc3RzX2xhcmdlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2UKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2R0ZXN0c19sYXJnZV9yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfZHRlc3RzX2xhcmdlX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlX3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlX3Zub2RlCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2Vfdm5vZGVfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c19sYXJnZV92bm9kZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX2R0ZXN0c19sYXJnZV92bm9kZV9yZXBlYXQKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2VfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2VfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2Vfdm5vZGUKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZV92bm9kZV9yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlX3Zub2RlX3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBKYXZhIDExIGNxbHNoIGR0ZXN0cworICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0cworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzg6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTE6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAjIEphdmEgMTEgY3Fsc2ggb2ZmaGVhcCBkdGVzdHMgb2ZmaGVhcAorICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0c19vZmZoZWFwCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0c19vZmZoZWFwCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBKYXZhIDE3IGNxbHNoIGR0ZXN0cworICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzODoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBKYXZhIDE3IGNxbHNoIGR0ZXN0cyBvZmYtaGVhcAorICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0c19vZmZoZWFwCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOF9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0c19vZmZoZWFwCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBKYXZhIDExIHJlcGVhdGVkIHV0ZXN0CisgICAgLSBzdGFydF9qMTFfcmVwZWF0ZWRfYW50X3Rlc3Q6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfcmVwZWF0ZWRfYW50X3Rlc3Q6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3JlcGVhdGVkX2FudF90ZXN0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAjIEphdmEgMTcgcmVwZWF0ZWQgdXRlc3QKKyAgICAtIHN0YXJ0X2oxN19yZXBlYXRlZF9hbnRfdGVzdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19yZXBlYXRlZF9hbnRfdGVzdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfcmVwZWF0ZWRfYW50X3Rlc3QKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgICMgSmF2YSAxMSByZXBlYXRlZCBkdGVzdAorICAgIC0gc3RhcnRfajExX2R0ZXN0c19yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfZHRlc3RzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfdm5vZGVfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAjIEphdmEgMTcgcmVwZWF0ZWQgZHRlc3QKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19yZXBlYXQKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c192bm9kZV9yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX3Zub2RlX3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCisKK2oxMV9wcmUtY29tbWl0X2pvYnM6ICZqMTFfcHJlLWNvbW1pdF9qb2JzCisgIGpvYnM6CisgICAgLSBzdGFydF9wcmUtY29tbWl0X3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2J1aWxkOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3ByZS1jb21taXRfdGVzdHMKKyAgICAjIEphdmEgMTEgdW5pdCB0ZXN0cworICAgIC0gajExX3VuaXRfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfdW5pdF90ZXN0c19yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9zaW11bGF0b3JfZHRlc3RzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9qdm1fZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2p2bV9kdGVzdHNfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfanZtX2R0ZXN0c192bm9kZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfanZtX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19qdm1fZHRlc3RzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2p2bV9kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNobGliX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBKYXZhIDE3IHVuaXQgdGVzdHMKKyAgICAtIGoxN191bml0X3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3VuaXRfdGVzdHNfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgICMgc3BlY2lhbGl6ZWQgdW5pdCB0ZXN0cyAoYWxsIHJ1biBvbiByZXF1ZXN0KQorICAgIC0gc3RhcnRfdXRlc3RzX2xvbmc6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2xvbmc6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX2xvbmcKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3V0ZXN0c19sb25nOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c19sb25nCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV91dGVzdHNfbG9uZ19yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX2xvbmcKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3V0ZXN0c19sb25nX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfbG9uZworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfY2RjOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19jZGM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX2NkYworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX2NkYzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfY2RjCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV91dGVzdHNfY2RjX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfY2RjCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfY2RjX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfY2RjCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX2NvbXByZXNzaW9uCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX2NvbXByZXNzaW9uCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV91dGVzdHNfY29tcHJlc3Npb25fcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX2NvbXByZXNzaW9uX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfY29tcHJlc3Npb24KKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX3RyaWUKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c190cmllCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV91dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX3RyaWUKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfdHJpZQorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX3N0cmVzcworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV91dGVzdHNfc3RyZXNzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfc3RyZXNzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19mcWx0b29sOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19mcWx0b29sOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c19mcWx0b29sCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfZnFsdG9vbAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfdXRlc3RzX2ZxbHRvb2xfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c19mcWx0b29sCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfZnFsdG9vbF9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX2ZxbHRvb2wKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnkKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5X3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnkKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgICMgUHl0aG9uIERUZXN0cworICAgIC0gajExX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9kdGVzdHNfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfZHRlc3RzX29mZmhlYXBfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBKYXZhIDE3IGR0ZXN0cworICAgIC0gajE3X2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19kdGVzdHNfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfZHRlc3RzX29mZmhlYXBfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBMYXJnZSBQeXRob24gRFRlc3RzCisgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c19sYXJnZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9kdGVzdHNfbGFyZ2VfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2UKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9kdGVzdHNfbGFyZ2Vfdm5vZGVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2UKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAjIEphdmEgMTEgY3Fsc2ggZHRlc3RzCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5MzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTM4OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTFfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBKYXZhIDExIGNxbHNoIGR0ZXN0cyBvZmZoZWFwCisgICAgLSBzdGFydF9qMTFfY3Fsc2hfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTMxMV9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBKYXZhIDE3IGNxbHNoIGR0ZXN0cworICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzODoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTE6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgICMgSmF2YSAxNyBjcWxzaCBkdGVzdHMgb2ZmLWhlYXAKKyAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOF9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwCisgICAgICAgICAgLSBqMTFfYnVpbGQKKworajE3X3NlcGFyYXRlX2pvYnM6ICZqMTdfc2VwYXJhdGVfam9icworICBqb2JzOgorICAgIC0gc3RhcnRfajE3X2J1aWxkOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2J1aWxkOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19idWlsZAorICAgICMgSmF2YSAxNyB1bml0IHRlc3RzCisgICAgLSBzdGFydF9qMTdfdW5pdF90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191bml0X3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN191bml0X3Rlc3RzCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191bml0X3Rlc3RzX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191bml0X3Rlc3RzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdW5pdF90ZXN0c19yZXBlYXQKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfanZtX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0cworICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzX3Zub2RlCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19qdm1fZHRlc3RzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0c19yZXBlYXQKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2p2bV9kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdAorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2NxbHNobGliX3Rlc3RzCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaGxpYl9jeXRob25fdGVzdHMKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgICMgSmF2YSAxNyBkdGVzdHMKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHMKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c192bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c192bm9kZQorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcF9yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX29mZmhlYXBfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcF9yZXBlYXQKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2VfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2VfcmVwZWF0CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2Vfdm5vZGUKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZV92bm9kZV9yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlX3Zub2RlX3JlcGVhdAorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzODoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXAKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMV9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgIyBzcGVjaWFsaXplZCB1bml0IHRlc3RzIChhbGwgcnVuIG9uIHJlcXVlc3QpCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2xvbmc6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2xvbmc6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19sb25nCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfbG9uZ19yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2xvbmdfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfbG9uZ19yZXBlYXQKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jZGM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NkYzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NkYworICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NkY19yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NkY19yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jZGNfcmVwZWF0CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfY29tcHJlc3Npb24KKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jb21wcmVzc2lvbl9yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NvbXByZXNzaW9uX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NvbXByZXNzaW9uX3JlcGVhdAorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c190cmllCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3RyaWVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfdHJpZV9yZXBlYXQKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N0cmVzcworICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N0cmVzc19yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N0cmVzc19yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zdHJlc3NfcmVwZWF0CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2ZxbHRvb2wKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19mcWx0b29sX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfZnFsdG9vbF9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19mcWx0b29sX3JlcGVhdAorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeV9yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeV9yZXBlYXQKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgICMgSmF2YSAxNyByZXBlYXRlZCB1dGVzdAorICAgIC0gc3RhcnRfajE3X3JlcGVhdGVkX2FudF90ZXN0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3JlcGVhdGVkX2FudF90ZXN0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19yZXBlYXRlZF9hbnRfdGVzdAorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgIyBKYXZhIDE3IHJlcGVhdGVkIGR0ZXN0CisgICAgLSBzdGFydF9qMTdfZHRlc3RzX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfcmVwZWF0CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c192bm9kZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c192bm9kZV9yZXBlYXQKKyAgICAgICAgICAtIGoxN19idWlsZAorCitqMTdfcHJlLWNvbW1pdF9qb2JzOiAmajE3X3ByZS1jb21taXRfam9icworICBqb2JzOgorICAgIC0gc3RhcnRfcHJlLWNvbW1pdF90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19idWlsZDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9wcmUtY29tbWl0X3Rlc3RzCisgICAgLSBqMTdfdW5pdF90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN191bml0X3Rlc3RzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19qdm1fZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2p2bV9kdGVzdHNfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfanZtX2R0ZXN0c192bm9kZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19kdGVzdHNfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXBfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19vZmZoZWFwX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXBfcmVwZWF0CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2UKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2R0ZXN0c19sYXJnZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2UKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2R0ZXN0c19sYXJnZV92bm9kZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXAKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMV9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgIyBzcGVjaWFsaXplZCB1bml0IHRlc3RzIChhbGwgcnVuIG9uIHJlcXVlc3QpCisgICAgLSBzdGFydF91dGVzdHNfbG9uZzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfbG9uZzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfbG9uZworICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX2xvbmdfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c19sb25nCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19jZGM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NkYzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfY2RjCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfY2RjX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfY2RjCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX2NvbXByZXNzaW9uCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfY29tcHJlc3Npb25fcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbgorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfdHJpZQorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX3RyaWVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c190cmllCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfc3RyZXNzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19mcWx0b29sOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19mcWx0b29sOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c19mcWx0b29sCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfZnFsdG9vbF9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX2ZxbHRvb2wKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnkKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5X3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeQorICAgICAgICAgIC0gajE3X2J1aWxkCisKK3dvcmtmbG93czoKKyAgICB2ZXJzaW9uOiAyCisgICAgamF2YTExX3NlcGFyYXRlX3Rlc3RzOiAqajExX3NlcGFyYXRlX2pvYnMKKyAgICBqYXZhMTFfcHJlLWNvbW1pdF90ZXN0czogKmoxMV9wcmUtY29tbWl0X2pvYnMKKyAgICBqYXZhMTdfc2VwYXJhdGVfdGVzdHM6ICpqMTdfc2VwYXJhdGVfam9icworICAgIGphdmExN19wcmUtY29tbWl0X3Rlc3RzOiAqajE3X3ByZS1jb21taXRfam9icworCitleGVjdXRvcnM6CisgIGphdmExMS1leGVjdXRvcjoKKyAgICBwYXJhbWV0ZXJzOgorICAgICAgZXhlY19yZXNvdXJjZV9jbGFzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IG1lZGl1bQorICAgIGRvY2tlcjoKKyAgICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogPDwgcGFyYW1ldGVycy5leGVjX3Jlc291cmNlX2NsYXNzID4+CisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBlbnZpcm9ubWVudDoKKyAgICAgIDw8OiAqZGVmYXVsdF9lbnZfdmFycworICAgICAgSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgICBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorCisgIGphdmExNy1leGVjdXRvcjoKKyAgICBwYXJhbWV0ZXJzOgorICAgICAgZXhlY19yZXNvdXJjZV9jbGFzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IG1lZGl1bQorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IDw8IHBhcmFtZXRlcnMuZXhlY19yZXNvdXJjZV9jbGFzcyA+PgorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgZW52aXJvbm1lbnQ6CisgICAgICA8PDogKmRlZmF1bHRfZW52X3ZhcnMKKyAgICAgIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgICAgSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKworYnVpbGRfY29tbW9uOiAmYnVpbGRfY29tbW9uCisgIHBhcmFsbGVsaXNtOiAxICMgVGhpcyBqb2IgZG9lc24ndCBiZW5lZml0IGZyb20gcGFyYWxsZWxpc20KKyAgc3RlcHM6CisgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAtIGNsb25lX2Nhc3NhbmRyYQorICAgIC0gYnVpbGRfY2Fzc2FuZHJhCisgICAgLSBydW5fZWNsaXBzZV93YXJuaW5ncworICAgIC0gcGVyc2lzdF90b193b3Jrc3BhY2U6CisgICAgICAgIHJvb3Q6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgICBwYXRoczoKKyAgICAgICAgICAtIGNhc3NhbmRyYQorICAgICAgICAgIC0gLm0yCisKK2pvYnM6CisgIGoxMV9idWlsZDoKKyAgICBleGVjdXRvcjogamF2YTExLWV4ZWN1dG9yCisgICAgPDw6ICpidWlsZF9jb21tb24KKworICBqMTdfYnVpbGQ6CisgICAgZXhlY3V0b3I6IGphdmExNy1leGVjdXRvcgorICAgIDw8OiAqYnVpbGRfY29tbW9uCisKKyAgajExX2R0ZXN0X2phcnNfYnVpbGQ6CisgICAgZXhlY3V0b3I6IGphdmExMS1leGVjdXRvcgorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBidWlsZF9jYXNzYW5kcmFfZHRlc3RfamFycworICAgICAgLSBwZXJzaXN0X3RvX3dvcmtzcGFjZToKKyAgICAgICAgICByb290OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgICAgICBwYXRoczoKKyAgICAgICAgICAgIC0gZHRlc3RfamFycworCisgIGoxMV91bml0X3Rlc3RzOgorICAgIDw8OiAqajExX3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY3JlYXRlX2p1bml0X2NvbnRhaW5lcnMKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl9wYXJhbGxlbF9qdW5pdF90ZXN0cworCisgIGoxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgIDw8OiAqajExX3NtYWxsX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjcmVhdGVfanVuaXRfY29udGFpbmVycworICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3NpbXVsYXRvcl90ZXN0cworCisgIGoxMV9qdm1fZHRlc3RzOgorICAgIDw8OiAqajExX3NtYWxsX3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY3JlYXRlX2p1bml0X2NvbnRhaW5lcnM6CisgICAgICAgICAgY2xhc3NsaXN0cHJlZml4OiBkaXN0cmlidXRlZAorICAgICAgICAgIGV4dHJhX2ZpbHRlcnM6ICJ8IGdyZXAgLXYgdXBncmFkZSIKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl9wYXJhbGxlbF9qdW5pdF90ZXN0czoKKyAgICAgICAgICBjbGFzc2xpc3RwcmVmaXg6IGRpc3RyaWJ1dGVkCisgICAgICAgICAgdGFyZ2V0OiAidGVzdGNsYXNzbGlzdCIKKworICBqMTFfanZtX2R0ZXN0c192bm9kZToKKyAgICA8PDogKmoxMV9zbWFsbF9wYXJfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNyZWF0ZV9qdW5pdF9jb250YWluZXJzOgorICAgICAgICAgIGNsYXNzbGlzdHByZWZpeDogZGlzdHJpYnV0ZWQKKyAgICAgICAgICBleHRyYV9maWx0ZXJzOiAifCBncmVwIC12IHVwZ3JhZGUiCisgICAgICAtIGxvZ19lbnZpcm9ubWVudAorICAgICAgLSBydW5fcGFyYWxsZWxfanVuaXRfdGVzdHM6CisgICAgICAgICAgY2xhc3NsaXN0cHJlZml4OiBkaXN0cmlidXRlZAorICAgICAgICAgIHRhcmdldDogInRlc3RjbGFzc2xpc3QiCisgICAgICAgICAgYXJndW1lbnRzOiAiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2JyIKKworICBqMTdfanZtX2R0ZXN0czoKKyAgICA8PDogKmoxN19zbWFsbF9wYXJfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNyZWF0ZV9qdW5pdF9jb250YWluZXJzOgorICAgICAgICAgIGNsYXNzbGlzdHByZWZpeDogZGlzdHJpYnV0ZWQKKyAgICAgICAgICBleHRyYV9maWx0ZXJzOiAifCBncmVwIC12IHVwZ3JhZGUiCisgICAgICAtIGxvZ19lbnZpcm9ubWVudAorICAgICAgLSBydW5fcGFyYWxsZWxfanVuaXRfdGVzdHM6CisgICAgICAgICAgY2xhc3NsaXN0cHJlZml4OiBkaXN0cmlidXRlZAorICAgICAgICAgIHRhcmdldDogInRlc3RjbGFzc2xpc3QiCisKKyAgajE3X2p2bV9kdGVzdHNfdm5vZGU6CisgICAgPDw6ICpqMTdfc21hbGxfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjcmVhdGVfanVuaXRfY29udGFpbmVyczoKKyAgICAgICAgICBjbGFzc2xpc3RwcmVmaXg6IGRpc3RyaWJ1dGVkCisgICAgICAgICAgZXh0cmFfZmlsdGVyczogInwgZ3JlcCAtdiB1cGdyYWRlIgorICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3BhcmFsbGVsX2p1bml0X3Rlc3RzOgorICAgICAgICAgIGNsYXNzbGlzdHByZWZpeDogZGlzdHJpYnV0ZWQKKyAgICAgICAgICB0YXJnZXQ6ICJ0ZXN0Y2xhc3NsaXN0IgorICAgICAgICAgIGFyZ3VtZW50czogIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNiciCisKKyAgajE3X3VuaXRfdGVzdHM6CisgICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjcmVhdGVfanVuaXRfY29udGFpbmVycworICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3BhcmFsbGVsX2p1bml0X3Rlc3RzCisKKyAgajExX2NxbHNobGliX3Rlc3RzOgorICAgIDw8OiAqajExX3NtYWxsX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBydW5fY3Fsc2hsaWJfdGVzdHMKKworICBqMTFfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgIDw8OiAqajExX3NtYWxsX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBydW5fY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzCisKKyAgajE3X2NxbHNobGliX3Rlc3RzOgorICAgIDw8OiAqajE3X3NtYWxsX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBydW5fY3Fsc2hsaWJfdGVzdHMKKworICBqMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgIDw8OiAqajE3X3NtYWxsX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBydW5fY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzCisKKyAgajExX3V0ZXN0c19sb25nOgorICAgIDw8OiAqajExX3NlcV9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gcnVuX2p1bml0X3Rlc3RzOgorICAgICAgICAgIHRhcmdldDogbG9uZy10ZXN0CisKKyAgajE3X3V0ZXN0c19sb25nOgorICAgIDw8OiAqajE3X3NlcV9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gcnVuX2p1bml0X3Rlc3RzOgorICAgICAgICAgIHRhcmdldDogbG9uZy10ZXN0CisKKyAgajExX3V0ZXN0c19jZGM6CisgICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjcmVhdGVfanVuaXRfY29udGFpbmVycworICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3BhcmFsbGVsX2p1bml0X3Rlc3RzOgorICAgICAgICAgIHRhcmdldDogdGVzdGNsYXNzbGlzdC1jZGMKKworICBqMTdfdXRlc3RzX2NkYzoKKyAgICA8PDogKmoxN19wYXJfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNyZWF0ZV9qdW5pdF9jb250YWluZXJzCisgICAgICAtIGxvZ19lbnZpcm9ubWVudAorICAgICAgLSBydW5fcGFyYWxsZWxfanVuaXRfdGVzdHM6CisgICAgICAgICAgdGFyZ2V0OiB0ZXN0Y2xhc3NsaXN0LWNkYworCisgIGoxMV91dGVzdHNfY29tcHJlc3Npb246CisgICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjcmVhdGVfanVuaXRfY29udGFpbmVycworICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3BhcmFsbGVsX2p1bml0X3Rlc3RzOgorICAgICAgICAgIHRhcmdldDogdGVzdGNsYXNzbGlzdC1jb21wcmVzc2lvbgorCisgIGoxN191dGVzdHNfY29tcHJlc3Npb246CisgICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjcmVhdGVfanVuaXRfY29udGFpbmVycworICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3BhcmFsbGVsX2p1bml0X3Rlc3RzOgorICAgICAgICAgIHRhcmdldDogdGVzdGNsYXNzbGlzdC1jb21wcmVzc2lvbgorCisgIGoxMV91dGVzdHNfdHJpZToKKyAgICA8PDogKmoxMV9wYXJfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNyZWF0ZV9qdW5pdF9jb250YWluZXJzCisgICAgICAtIGxvZ19lbnZpcm9ubWVudAorICAgICAgLSBydW5fcGFyYWxsZWxfanVuaXRfdGVzdHM6CisgICAgICAgICAgdGFyZ2V0OiB0ZXN0Y2xhc3NsaXN0LXRyaWUKKworICBqMTdfdXRlc3RzX3RyaWU6CisgICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjcmVhdGVfanVuaXRfY29udGFpbmVycworICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3BhcmFsbGVsX2p1bml0X3Rlc3RzOgorICAgICAgICAgIHRhcmdldDogdGVzdGNsYXNzbGlzdC10cmllCisKKyAgajExX3V0ZXN0c19zdHJlc3M6CisgICAgPDw6ICpqMTFfc2VxX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBydW5fanVuaXRfdGVzdHM6CisgICAgICAgICAgdGFyZ2V0OiBzdHJlc3MtdGVzdAorCisgIGoxN191dGVzdHNfc3RyZXNzOgorICAgIDw8OiAqajE3X3NlcV9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gcnVuX2p1bml0X3Rlc3RzOgorICAgICAgICAgIHRhcmdldDogc3RyZXNzLXRlc3QKKworICBqMTFfdXRlc3RzX2ZxbHRvb2w6CisgICAgPDw6ICpqMTFfc2VxX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBydW5fanVuaXRfdGVzdHM6CisgICAgICAgICAgdGFyZ2V0OiBmcWx0b29sLXRlc3QKKworICBqMTdfdXRlc3RzX2ZxbHRvb2w6CisgICAgPDw6ICpqMTdfc2VxX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBydW5fanVuaXRfdGVzdHM6CisgICAgICAgICAgdGFyZ2V0OiBmcWx0b29sLXRlc3QKKworICBqMTFfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjcmVhdGVfanVuaXRfY29udGFpbmVycworICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3BhcmFsbGVsX2p1bml0X3Rlc3RzOgorICAgICAgICAgIHRhcmdldDogdGVzdGNsYXNzbGlzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5CisKKyAgajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgIDw8OiAqajE3X3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY3JlYXRlX2p1bml0X2NvbnRhaW5lcnMKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl9wYXJhbGxlbF9qdW5pdF90ZXN0czoKKyAgICAgICAgICB0YXJnZXQ6IHRlc3RjbGFzc2xpc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeQorCisgIGoxMV9kdGVzdHNfdm5vZGU6CisgICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudgorICAgICAgLSBjcmVhdGVfZHRlc3RfY29udGFpbmVyczoKKyAgICAgICAgICBmaWxlX3RhZzogajExX3dpdGhfdm5vZGVzCisgICAgICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOiAiLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgbm90IGNxbCciCisgICAgICAtIHJ1bl9kdGVzdHM6CisgICAgICAgICAgZmlsZV90YWc6IGoxMV93aXRoX3Zub2RlcworICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworCisgIGoxMV9kdGVzdHNfb2ZmaGVhcDoKKyAgICA8PDogKmoxMV9wYXJfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNsb25lX2R0ZXN0CisgICAgICAtIGNyZWF0ZV92ZW52CisgICAgICAtIGNyZWF0ZV9kdGVzdF9jb250YWluZXJzOgorICAgICAgICAgIGZpbGVfdGFnOiBqMTFfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgICBydW5fZHRlc3RzX2V4dHJhX2FyZ3M6ICItLXVzZS12bm9kZXMgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgbm90IGNxbCciCisgICAgICAtIHJ1bl9kdGVzdHM6CisgICAgICAgICAgZmlsZV90YWc6IGoxMV9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cycKKworICBqMTdfZHRlc3RzX3Zub2RlOgorICAgIDw8OiAqajE3X3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgLSBjbG9uZV9kdGVzdAorICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAtIGNyZWF0ZV9kdGVzdF9jb250YWluZXJzOgorICAgICAgICBmaWxlX3RhZzogajE3X3dpdGhfdm5vZGVzCisgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tdXNlLXZub2RlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIG5vdCBjcWwnIgorICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgZmlsZV90YWc6IGoxN193aXRoX3Zub2RlcworICAgICAgICBweXRlc3RfZXh0cmFfYXJnczogJy0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cycKKworICBqMTdfZHRlc3RzX29mZmhlYXA6CisgICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBub3QgY3FsJyIKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X2R0ZXN0c19vZmZoZWFwCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworCisgIGoxMV9kdGVzdHM6CisgICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudgorICAgICAgLSBjcmVhdGVfZHRlc3RfY29udGFpbmVyczoKKyAgICAgICAgICBmaWxlX3RhZzogajExX3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOiAiLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBub3QgY3FsJyIKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajExX3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworCisgIGoxN19kdGVzdHM6CisgICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAtIGNsb25lX2R0ZXN0CisgICAgLSBjcmVhdGVfdmVudgorICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgIGZpbGVfdGFnOiBqMTdfd2l0aG91dF92bm9kZXMKKyAgICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOiAiLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBub3QgY3FsJyIKKyAgICAtIHJ1bl9kdGVzdHM6CisgICAgICAgIGZpbGVfdGFnOiBqMTdfd2l0aG91dF92bm9kZXMKKyAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworCisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgIDw8OiAqajExX3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxMV93aXRoX3Zub2RlcworICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tdXNlLXZub2RlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCciCisgICAgICAtIHJ1bl9kdGVzdHM6CisgICAgICAgICAgZmlsZV90YWc6IGoxMV93aXRoX3Zub2RlcworICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicKKworICBqMTFfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgIDw8OiAqajExX3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxMV9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIgorICAgICAgLSBydW5fZHRlc3RzOgorICAgICAgICAgIGZpbGVfdGFnOiBqMTFfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgICBweXRlc3RfZXh0cmFfYXJnczogJy0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JworCisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICA8PDogKmoxMV9wYXJfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNsb25lX2R0ZXN0CisgICAgICAtIGNyZWF0ZV92ZW52OgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JworICAgICAgLSBjcmVhdGVfZHRlc3RfY29udGFpbmVyczoKKyAgICAgICAgICBmaWxlX3RhZzogajExX3dpdGhfdm5vZGVzCisgICAgICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOiAiLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyIKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajExX3dpdGhfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44JworICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JworCisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTFfdm5vZGU6CisgICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudjoKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuMTEnCisgICAgICAtIGNyZWF0ZV9kdGVzdF9jb250YWluZXJzOgorICAgICAgICAgIGZpbGVfdGFnOiBqMTFfd2l0aF92bm9kZXMKKyAgICAgICAgICBydW5fZHRlc3RzX2V4dHJhX2FyZ3M6ICItLXVzZS12bm9kZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajExX3dpdGhfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMScKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuMTEnCisKKyAgajExX2NxbHNoX2R0ZXN0c19weTM4X29mZmhlYXA6CisgICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudjoKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxMV9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JworICAgICAgLSBydW5fZHRlc3RzOgorICAgICAgICAgIGZpbGVfdGFnOiBqMTFfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgICBweXRlc3RfZXh0cmFfYXJnczogJy0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44JworICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JworCisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICA8PDogKmoxMV9wYXJfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNsb25lX2R0ZXN0CisgICAgICAtIGNyZWF0ZV92ZW52OgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxMV9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajExX2R0ZXN0c19vZmZoZWFwCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEnCisgICAgICAgICAgcHl0aG9uX3ZlcnNpb246ICczLjExJworCisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzOgorICAgIDw8OiAqajExX3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxMV93aXRob3V0X3Zub2RlcworICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyIKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajExX3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicKKworICBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzg6CisgICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudjoKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxMV93aXRob3V0X3Zub2RlcworICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyIKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajExX3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOCcKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKworICBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExOgorICAgIDw8OiAqajExX3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnY6CisgICAgICAgICAgcHl0aG9uX3ZlcnNpb246ICczLjExJworICAgICAgLSBjcmVhdGVfZHRlc3RfY29udGFpbmVyczoKKyAgICAgICAgICBmaWxlX3RhZzogajExX3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOiAiLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajExX3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEnCisgICAgICAgICAgcHl0aG9uX3ZlcnNpb246ICczLjExJworCisgIGoxN19jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgIDw8OiAqajE3X3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxN193aXRoX3Zub2RlcworICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tdXNlLXZub2RlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCciCisgICAgICAtIHJ1bl9kdGVzdHM6CisgICAgICAgICAgZmlsZV90YWc6IGoxN193aXRoX3Zub2RlcworICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicKKworICBqMTdfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgIDw8OiAqajE3X3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIgorICAgICAgLSBydW5fZHRlc3RzOgorICAgICAgICAgIGZpbGVfdGFnOiBqMTdfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgICBweXRlc3RfZXh0cmFfYXJnczogJy0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JworCisgIGoxN19jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICA8PDogKmoxN19wYXJfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNsb25lX2R0ZXN0CisgICAgICAtIGNyZWF0ZV92ZW52OgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JworICAgICAgLSBjcmVhdGVfZHRlc3RfY29udGFpbmVyczoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X3dpdGhfdm5vZGVzCisgICAgICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOiAiLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyIKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X3dpdGhfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44JworICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JworCisgIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfdm5vZGU6CisgICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudjoKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuMTEnCisgICAgICAtIGNyZWF0ZV9kdGVzdF9jb250YWluZXJzOgorICAgICAgICAgIGZpbGVfdGFnOiBqMTdfd2l0aF92bm9kZXMKKyAgICAgICAgICBydW5fZHRlc3RzX2V4dHJhX2FyZ3M6ICItLXVzZS12bm9kZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X3dpdGhfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMScKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuMTEnCisKKyAgajE3X2NxbHNoX2R0ZXN0c19weTM4X29mZmhlYXA6CisgICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudjoKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JworICAgICAgLSBydW5fZHRlc3RzOgorICAgICAgICAgIGZpbGVfdGFnOiBqMTdfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgICBweXRlc3RfZXh0cmFfYXJnczogJy0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44JworICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JworCisgIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICA8PDogKmoxN19wYXJfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNsb25lX2R0ZXN0CisgICAgICAtIGNyZWF0ZV92ZW52OgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X2R0ZXN0c19vZmZoZWFwCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEnCisgICAgICAgICAgcHl0aG9uX3ZlcnNpb246ICczLjExJworCisgIGoxN19jcWxzaF9kdGVzdHNfcHkzOgorICAgIDw8OiAqajE3X3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxN193aXRob3V0X3Zub2RlcworICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyIKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicKKworICBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzg6CisgICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudjoKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxN193aXRob3V0X3Zub2RlcworICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyIKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOCcKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKworICBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExOgorICAgIDw8OiAqajE3X3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnY6CisgICAgICAgICAgcHl0aG9uX3ZlcnNpb246ICczLjExJworICAgICAgLSBjcmVhdGVfZHRlc3RfY29udGFpbmVyczoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOiAiLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEnCisgICAgICAgICAgcHl0aG9uX3ZlcnNpb246ICczLjExJworCisgIGoxMV9kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudgorICAgICAgLSBjcmVhdGVfZHRlc3RfY29udGFpbmVyczoKKyAgICAgICAgICBmaWxlX3RhZzogajExX2xhcmdlX3dpdGhfdm5vZGVzCisgICAgICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgICAgICAtIHJ1bl9kdGVzdHM6CisgICAgICAgICAgZmlsZV90YWc6IGoxMV9sYXJnZV93aXRoX3Zub2RlcworICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworCisgIGoxMV9kdGVzdHNfbGFyZ2U6CisgICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudgorICAgICAgLSBjcmVhdGVfZHRlc3RfY29udGFpbmVyczoKKyAgICAgICAgICBmaWxlX3RhZzogajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOiAnLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cycKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworCisgIGoxN19kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudgorICAgICAgLSBjcmVhdGVfZHRlc3RfY29udGFpbmVyczoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X2xhcmdlX3dpdGhfdm5vZGVzCisgICAgICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgICAgICAtIHJ1bl9kdGVzdHM6CisgICAgICAgICAgZmlsZV90YWc6IGoxN19sYXJnZV93aXRoX3Zub2RlcworICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworCisgIGoxN19kdGVzdHNfbGFyZ2U6CisgICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudgorICAgICAgLSBjcmVhdGVfZHRlc3RfY29udGFpbmVyczoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOiAnLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cycKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworCisgIGoxMV91bml0X3Rlc3RzX3JlcGVhdDoKKyAgICA8PDogKmoxMV9yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl91bml0X3Rlc3RzX3JlcGVhdAorCisgIGoxN191bml0X3Rlc3RzX3JlcGVhdDoKKyAgICA8PDogKmoxN19yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl91bml0X3Rlc3RzX3JlcGVhdAorCisgIGoxMV91dGVzdHNfY2RjX3JlcGVhdDoKKyAgICA8PDogKmoxMV9yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl91dGVzdHNfY2RjX3JlcGVhdAorCisgIGoxN191dGVzdHNfY2RjX3JlcGVhdDoKKyAgICA8PDogKmoxN19yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl91dGVzdHNfY2RjX3JlcGVhdAorCisgIGoxMV91dGVzdHNfY29tcHJlc3Npb25fcmVwZWF0OgorICAgIDw8OiAqajExX3JlcGVhdGVkX3V0ZXN0X2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3V0ZXN0c19jb21wcmVzc2lvbl9yZXBlYXQKKworICBqMTdfdXRlc3RzX2NvbXByZXNzaW9uX3JlcGVhdDoKKyAgICA8PDogKmoxN19yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl91dGVzdHNfY29tcHJlc3Npb25fcmVwZWF0CisKKyAgajExX3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICA8PDogKmoxMV9yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl91dGVzdHNfdHJpZV9yZXBlYXQKKworICBqMTdfdXRlc3RzX3RyaWVfcmVwZWF0OgorICAgIDw8OiAqajE3X3JlcGVhdGVkX3V0ZXN0X2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3V0ZXN0c190cmllX3JlcGVhdAorCisgIGoxMV91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeV9yZXBlYXQ6CisgICAgPDw6ICpqMTFfcmVwZWF0ZWRfdXRlc3RfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGxvZ19lbnZpcm9ubWVudAorICAgICAgLSBydW5fdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlfcmVwZWF0CisKKyAgajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5X3JlcGVhdDoKKyAgICA8PDogKmoxN19yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeV9yZXBlYXQKKworICBqMTFfdXRlc3RzX2ZxbHRvb2xfcmVwZWF0OgorICAgIDw8OiAqajExX3JlcGVhdGVkX3V0ZXN0X2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3V0ZXN0c19mcWx0b29sX3JlcGVhdAorCisgIGoxN191dGVzdHNfZnFsdG9vbF9yZXBlYXQ6CisgICAgPDw6ICpqMTdfcmVwZWF0ZWRfdXRlc3RfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGxvZ19lbnZpcm9ubWVudAorICAgICAgLSBydW5fdXRlc3RzX2ZxbHRvb2xfcmVwZWF0CisKKyAgajExX3V0ZXN0c19sb25nX3JlcGVhdDoKKyAgICA8PDogKmoxMV9yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl91dGVzdHNfbG9uZ19yZXBlYXQKKworICBqMTdfdXRlc3RzX2xvbmdfcmVwZWF0OgorICAgIDw8OiAqajE3X3JlcGVhdGVkX3V0ZXN0X2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3V0ZXN0c19sb25nX3JlcGVhdAorCisgIGoxMV91dGVzdHNfc3RyZXNzX3JlcGVhdDoKKyAgICA8PDogKmoxMV9yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl91dGVzdHNfc3RyZXNzX3JlcGVhdAorCisgIGoxN191dGVzdHNfc3RyZXNzX3JlcGVhdDoKKyAgICA8PDogKmoxN19yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl91dGVzdHNfc3RyZXNzX3JlcGVhdAorCisgIGoxMV9qdm1fZHRlc3RzX3JlcGVhdDoKKyAgICA8PDogKmoxMV9yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl9qdm1fZHRlc3RzX3JlcGVhdAorCisgIGoxMV9qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICA8PDogKmoxMV9yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl9qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdAorCisgIGoxMV9zaW11bGF0b3JfZHRlc3RzX3JlcGVhdDoKKyAgICA8PDogKmoxMV9yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl9zaW11bGF0b3JfZHRlc3RzX3JlcGVhdAorCisgIGoxN19qdm1fZHRlc3RzX3JlcGVhdDoKKyAgICA8PDogKmoxN19yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl9qdm1fZHRlc3RzX3JlcGVhdAorCisgIGoxN19qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICA8PDogKmoxN19yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl9qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdAorCisgIGoxMV9yZXBlYXRlZF9hbnRfdGVzdDoKKyAgICA8PDogKmoxMV9yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl9yZXBlYXRlZF91dGVzdDoKKyAgICAgICAgICB0YXJnZXQ6ICR7UkVQRUFURURfQU5UX1RFU1RfVEFSR0VUfQorICAgICAgICAgIGNsYXNzOiAke1JFUEVBVEVEX0FOVF9URVNUX0NMQVNTfQorICAgICAgICAgIG1ldGhvZHM6ICR7UkVQRUFURURfQU5UX1RFU1RfTUVUSE9EU30KKyAgICAgICAgICB2bm9kZXM6ICR7UkVQRUFURURfQU5UX1RFU1RfVk5PREVTfQorICAgICAgICAgIGNvdW50OiAke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfQorICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZTogJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9CisKKyAgajE3X3JlcGVhdGVkX2FudF90ZXN0OgorICAgIDw8OiAqajE3X3JlcGVhdGVkX3V0ZXN0X2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3JlcGVhdGVkX3V0ZXN0OgorICAgICAgICAgIHRhcmdldDogJHtSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVR9CisgICAgICAgICAgY2xhc3M6ICR7UkVQRUFURURfQU5UX1RFU1RfQ0xBU1N9CisgICAgICAgICAgbWV0aG9kczogJHtSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTfQorICAgICAgICAgIHZub2RlczogJHtSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVN9CisgICAgICAgICAgY291bnQ6ICR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9CisgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlOiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0KKworICBqMTFfZHRlc3RzX3JlcGVhdDoKKyAgICA8PDogKmoxMV9yZXBlYXRlZF9kdGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAgIC0gcnVuX3JlcGVhdGVkX2R0ZXN0OgorICAgICAgICAgIHRlc3RzOiAke1JFUEVBVEVEX0RURVNUU30KKyAgICAgICAgICB2bm9kZXM6ICJmYWxzZSIKKyAgICAgICAgICB1cGdyYWRlOiAiZmFsc2UiCisgICAgICAgICAgY291bnQ6ICR7UkVQRUFURURfRFRFU1RTX0NPVU5UfQorICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZTogJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9CisKKyAgajExX2R0ZXN0c192bm9kZV9yZXBlYXQ6CisgICAgPDw6ICpqMTFfcmVwZWF0ZWRfZHRlc3RfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNsb25lX2R0ZXN0CisgICAgICAtIGNyZWF0ZV92ZW52CisgICAgICAtIHJ1bl9yZXBlYXRlZF9kdGVzdDoKKyAgICAgICAgICB0ZXN0czogJHtSRVBFQVRFRF9EVEVTVFN9CisgICAgICAgICAgdm5vZGVzOiAidHJ1ZSIKKyAgICAgICAgICB1cGdyYWRlOiAiZmFsc2UiCisgICAgICAgICAgY291bnQ6ICR7UkVQRUFURURfRFRFU1RTX0NPVU5UfQorICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZTogJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9CisKKyAgajExX2R0ZXN0c19vZmZoZWFwX3JlcGVhdDoKKyAgICA8PDogKmoxMV9yZXBlYXRlZF9kdGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAgIC0gcnVuX3JlcGVhdGVkX2R0ZXN0OgorICAgICAgICAgIHRlc3RzOiAke1JFUEVBVEVEX0RURVNUU30KKyAgICAgICAgICB2bm9kZXM6ICJ0cnVlIgorICAgICAgICAgIHVwZ3JhZGU6ICJmYWxzZSIKKyAgICAgICAgICBjb3VudDogJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9CisgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlOiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0KKyAgICAgICAgICBleHRyYV9kdGVzdF9hcmdzOiAiLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMiCisKKyAgajExX2R0ZXN0c19sYXJnZV9yZXBlYXQ6CisgICAgPDw6ICpqMTFfcmVwZWF0ZWRfZHRlc3RfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNsb25lX2R0ZXN0CisgICAgICAtIGNyZWF0ZV92ZW52CisgICAgICAtIHJ1bl9yZXBlYXRlZF9kdGVzdDoKKyAgICAgICAgICB0ZXN0czogJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9CisgICAgICAgICAgdm5vZGVzOiAiZmFsc2UiCisgICAgICAgICAgdXBncmFkZTogImZhbHNlIgorICAgICAgICAgIGNvdW50OiAke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0KKyAgICAgICAgICBzdG9wX29uX2ZhaWx1cmU6ICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfQorICAgICAgICAgIGV4dHJhX2R0ZXN0X2FyZ3M6ICItLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIgorCisgIGoxMV9kdGVzdHNfbGFyZ2Vfdm5vZGVfcmVwZWF0OgorICAgIDw8OiAqajExX3JlcGVhdGVkX2R0ZXN0X2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBjbG9uZV9kdGVzdAorICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAtIHJ1bl9yZXBlYXRlZF9kdGVzdDoKKyAgICAgICAgdGVzdHM6ICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfQorICAgICAgICB2bm9kZXM6ICJ0cnVlIgorICAgICAgICB1cGdyYWRlOiAiZmFsc2UiCisgICAgICAgIGNvdW50OiAke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0KKyAgICAgICAgc3RvcF9vbl9mYWlsdXJlOiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0KKyAgICAgICAgZXh0cmFfZHRlc3RfYXJnczogIi0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMiCisKKyAgajE3X2R0ZXN0c19yZXBlYXQ6CisgICAgPDw6ICpqMTdfcmVwZWF0ZWRfZHRlc3RfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGxvZ19lbnZpcm9ubWVudAorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudgorICAgICAgLSBydW5fcmVwZWF0ZWRfZHRlc3Q6CisgICAgICAgICAgdGVzdHM6ICR7UkVQRUFURURfRFRFU1RTfQorICAgICAgICAgIHZub2RlczogImZhbHNlIgorICAgICAgICAgIHVwZ3JhZGU6ICJmYWxzZSIKKyAgICAgICAgICBjb3VudDogJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9CisgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlOiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0KKworICBqMTdfZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICA8PDogKmoxN19yZXBlYXRlZF9kdGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIGNsb25lX2R0ZXN0CisgICAgICAtIGNyZWF0ZV92ZW52CisgICAgICAtIHJ1bl9yZXBlYXRlZF9kdGVzdDoKKyAgICAgICAgICB0ZXN0czogJHtSRVBFQVRFRF9EVEVTVFN9CisgICAgICAgICAgdm5vZGVzOiAidHJ1ZSIKKyAgICAgICAgICB1cGdyYWRlOiAiZmFsc2UiCisgICAgICAgICAgY291bnQ6ICR7UkVQRUFURURfRFRFU1RTX0NPVU5UfQorICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZTogJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9CisKKyAgajE3X2R0ZXN0c19vZmZoZWFwX3JlcGVhdDoKKyAgICA8PDogKmoxN19yZXBlYXRlZF9kdGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAgIC0gcnVuX3JlcGVhdGVkX2R0ZXN0OgorICAgICAgICAgIHRlc3RzOiAke1JFUEVBVEVEX0RURVNUU30KKyAgICAgICAgICB2bm9kZXM6ICJ0cnVlIgorICAgICAgICAgIHVwZ3JhZGU6ICJmYWxzZSIKKyAgICAgICAgICBjb3VudDogJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9CisgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlOiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0KKyAgICAgICAgICBleHRyYV9kdGVzdF9hcmdzOiAiLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMiCisKKyAgajE3X2R0ZXN0c19sYXJnZV9yZXBlYXQ6CisgICAgPDw6ICpqMTdfcmVwZWF0ZWRfZHRlc3RfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNsb25lX2R0ZXN0CisgICAgICAtIGNyZWF0ZV92ZW52CisgICAgICAtIHJ1bl9yZXBlYXRlZF9kdGVzdDoKKyAgICAgICAgICB0ZXN0czogJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9CisgICAgICAgICAgdm5vZGVzOiAiZmFsc2UiCisgICAgICAgICAgdXBncmFkZTogImZhbHNlIgorICAgICAgICAgIGNvdW50OiAke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0KKyAgICAgICAgICBzdG9wX29uX2ZhaWx1cmU6ICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfQorICAgICAgICAgIGV4dHJhX2R0ZXN0X2FyZ3M6ICItLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIgorCisgIGoxN19kdGVzdHNfbGFyZ2Vfdm5vZGVfcmVwZWF0OgorICAgIDw8OiAqajE3X3JlcGVhdGVkX2R0ZXN0X2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudgorICAgICAgLSBydW5fcmVwZWF0ZWRfZHRlc3Q6CisgICAgICAgICAgdGVzdHM6ICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfQorICAgICAgICAgIHZub2RlczogInRydWUiCisgICAgICAgICAgdXBncmFkZTogImZhbHNlIgorICAgICAgICAgIGNvdW50OiAke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0KKyAgICAgICAgICBzdG9wX29uX2ZhaWx1cmU6ICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfQorICAgICAgICAgIGV4dHJhX2R0ZXN0X2FyZ3M6ICItLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIgorCitjb21tYW5kczoKKyAgbG9nX2Vudmlyb25tZW50OgorICAgIHN0ZXBzOgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisKKyAgY2xvbmVfY2Fzc2FuZHJhOgorICAgIHN0ZXBzOgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1kZXB0aCAxIC0tYnJhbmNoICRDSVJDTEVfQlJBTkNIIGh0dHBzOi8vZ2l0aHViLmNvbS8kQ0lSQ0xFX1BST0pFQ1RfVVNFUk5BTUUvJENJUkNMRV9QUk9KRUNUX1JFUE9OQU1FLmdpdCB+L2Nhc3NhbmRyYQorCisgIGNsb25lX2R0ZXN0OgorICAgIHN0ZXBzOgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKworICBidWlsZF9jYXNzYW5kcmE6CisgICAgc3RlcHM6CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IEJ1aWxkIENhc3NhbmRyYQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYQorICAgICAgICAgICMgTG9vcCB0byBwcmV2ZW50IGZhaWx1cmUgZHVlIHRvIG1hdmVuLWFudC10YXNrcyBub3QgZG93bmxvYWRpbmcgYSBqYXIuLgorICAgICAgICAgIGZvciB4IGluICQoc2VxIDEgMyk7IGRvCisgICAgICAgICAgICAgICR7QU5UX0hPTUV9L2Jpbi9hbnQgY2xlYW4gcmVhbGNsZWFuIGphcgorICAgICAgICAgICAgICBSRVRVUk49IiQ/IgorICAgICAgICAgICAgICBpZiBbICIke1JFVFVSTn0iIC1lcSAiMCIgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICBkb25lCisgICAgICAgICAgIyBFeGl0LCBpZiB3ZSBkaWRuJ3QgYnVpbGQgc3VjY2Vzc2Z1bGx5CisgICAgICAgICAgaWYgWyAiJHtSRVRVUk59IiAtbmUgIjAiIF07IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiQnVpbGQgZmFpbGVkIHdpdGggZXhpdCBjb2RlOiAke1JFVFVSTn0iCisgICAgICAgICAgICAgIGV4aXQgJHtSRVRVUk59CisgICAgICAgICAgZmkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorCisgIGJ1aWxkX2Nhc3NhbmRyYV9kdGVzdF9qYXJzOgorICAgIHN0ZXBzOgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBCdWlsZCBDYXNzYW5kcmEgRFRlc3QgamFycworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYQorICAgICAgICAgIG1rZGlyIH4vZHRlc3RfamFycworICAgICAgICAgIGdpdCByZW1vdGUgYWRkIGFwYWNoZSBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS5naXQKKyAgICAgICAgICBmb3IgYnJhbmNoIGluIGNhc3NhbmRyYS0yLjIgY2Fzc2FuZHJhLTMuMCBjYXNzYW5kcmEtMy4xMSBjYXNzYW5kcmEtNC4wIGNhc3NhbmRyYS00LjEgdHJ1bms7IGRvCisgICAgICAgICAgICAjIGNoZWNrIG91dCB0aGUgY29ycmVjdCBjYXNzYW5kcmEgdmVyc2lvbjoKKyAgICAgICAgICAgIGdpdCByZW1vdGUgc2V0LWJyYW5jaGVzIC0tYWRkIGFwYWNoZSAnJGJyYW5jaCcKKyAgICAgICAgICAgIGdpdCBmZXRjaCAtLWRlcHRoIDEgYXBhY2hlICRicmFuY2gKKyAgICAgICAgICAgIGdpdCBjaGVja291dCAkYnJhbmNoCisgICAgICAgICAgICBnaXQgY2xlYW4gLWZkCisgICAgICAgICAgICAjIExvb3AgdG8gcHJldmVudCBmYWlsdXJlIGR1ZSB0byBtYXZlbi1hbnQtdGFza3Mgbm90IGRvd25sb2FkaW5nIGEgamFyLi4KKyAgICAgICAgICAgIGZvciB4IGluICQoc2VxIDEgMyk7IGRvCisgICAgICAgICAgICAgICAgJHtBTlRfSE9NRX0vYmluL2FudCByZWFsY2xlYW47ICR7QU5UX0hPTUV9L2Jpbi9hbnQgamFyIGR0ZXN0LWphcgorICAgICAgICAgICAgICAgIFJFVFVSTj0iJD8iCisgICAgICAgICAgICAgICAgaWYgWyAiJHtSRVRVUk59IiAtZXEgIjAiIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgY3AgYnVpbGQvZHRlc3QqLmphciB+L2R0ZXN0X2phcnMKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgIyBFeGl0LCBpZiB3ZSBkaWRuJ3QgYnVpbGQgc3VjY2Vzc2Z1bGx5CisgICAgICAgICAgICBpZiBbICIke1JFVFVSTn0iIC1uZSAiMCIgXTsgdGhlbgorICAgICAgICAgICAgICAgIGVjaG8gIkJ1aWxkIGZhaWxlZCB3aXRoIGV4aXQgY29kZTogJHtSRVRVUk59IgorICAgICAgICAgICAgICAgIGV4aXQgJHtSRVRVUk59CisgICAgICAgICAgICBmaQorICAgICAgICAgIGRvbmUKKyAgICAgICAgICAjIGFuZCBidWlsZCB0aGUgZHRlc3QtamFyIGZvciB0aGUgYnJhbmNoIHVuZGVyIHRlc3QKKyAgICAgICAgICAke0FOVF9IT01FfS9iaW4vYW50IHJlYWxjbGVhbgorICAgICAgICAgIGdpdCBjaGVja291dCBvcmlnaW4vJENJUkNMRV9CUkFOQ0gKKyAgICAgICAgICBnaXQgY2xlYW4gLWZkCisgICAgICAgICAgZm9yIHggaW4gJChzZXEgMSAzKTsgZG8KKyAgICAgICAgICAgICAgJHtBTlRfSE9NRX0vYmluL2FudCByZWFsY2xlYW47ICR7QU5UX0hPTUV9L2Jpbi9hbnQgamFyIGR0ZXN0LWphcgorICAgICAgICAgICAgICBSRVRVUk49IiQ/IgorICAgICAgICAgICAgICBpZiBbICIke1JFVFVSTn0iIC1lcSAiMCIgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgY3AgYnVpbGQvZHRlc3QqLmphciB+L2R0ZXN0X2phcnMKKyAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgZG9uZQorICAgICAgICAgICMgRXhpdCwgaWYgd2UgZGlkbid0IGJ1aWxkIHN1Y2Nlc3NmdWxseQorICAgICAgICAgIGlmIFsgIiR7UkVUVVJOfSIgLW5lICIwIiBdOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIkJ1aWxkIGZhaWxlZCB3aXRoIGV4aXQgY29kZTogJHtSRVRVUk59IgorICAgICAgICAgICAgICBleGl0ICR7UkVUVVJOfQorICAgICAgICAgIGZpCisgICAgICAgICAgbHMgLWwgfi9kdGVzdF9qYXJzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKworICBydW5fZWNsaXBzZV93YXJuaW5nczoKKyAgICBzdGVwczoKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGVjbGlwc2Utd2FybmluZ3MKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEKKyAgICAgICAgICBhbnQgZWNsaXBzZS13YXJuaW5ncworCisgIGNyZWF0ZV9qdW5pdF9jb250YWluZXJzOgorICAgIHBhcmFtZXRlcnM6CisgICAgICBjbGFzc2xpc3RwcmVmaXg6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiB1bml0CisgICAgICBleHRyYV9maWx0ZXJzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogIiIKKyAgICBzdGVwczoKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIDw8cGFyYW1ldGVycy5jbGFzc2xpc3RwcmVmaXg+PiBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0Lzw8cGFyYW1ldGVycy5jbGFzc2xpc3RwcmVmaXg+Pi8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC88PHBhcmFtZXRlcnMuY2xhc3NsaXN0cHJlZml4Pj4vOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiA8PHBhcmFtZXRlcnMuZXh0cmFfZmlsdGVycz4+ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisKKyAgcnVuX3NpbXVsYXRvcl90ZXN0czoKKyAgICBwYXJhbWV0ZXJzOgorICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiAzMG0KKyAgICBzdGVwczoKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFNpbXVsYXRvciBUZXN0cworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdC1zaW11bGF0b3ItZHRlc3QgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDw8cGFyYW1ldGVycy5ub19vdXRwdXRfdGltZW91dD4+CisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisKKyAgcnVuX2p1bml0X3Rlc3RzOgorICAgIHBhcmFtZXRlcnM6CisgICAgICB0YXJnZXQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiAxNW0KKyAgICBzdGVwczoKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKDw8cGFyYW1ldGVycy50YXJnZXQ+PikKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IDw8cGFyYW1ldGVycy50YXJnZXQ+PiAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogPDxwYXJhbWV0ZXJzLm5vX291dHB1dF90aW1lb3V0Pj4KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKworICBydW5fY3Fsc2hsaWJfdGVzdHM6CisgICAgcGFyYW1ldGVyczoKKyAgICAgIG5vX291dHB1dF90aW1lb3V0OgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogMTVtCisgICAgc3RlcHM6CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBjcWxzaGxpYiBVbml0IFRlc3RzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhLworICAgICAgICAgIC4vcHlsaWIvY2Fzc2FuZHJhLWNxbHNoLXRlc3RzLnNoICQocHdkKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogPDxwYXJhbWV0ZXJzLm5vX291dHB1dF90aW1lb3V0Pj4KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvcHlsaWIKKworICBydW5fY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgIHBhcmFtZXRlcnM6CisgICAgICBub19vdXRwdXRfdGltZW91dDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IDE1bQorICAgIHN0ZXBzOgorICAgICAgLSBydW46CisgICAgICAgICAgbmFtZTogUnVuIGNxbHNobGliIFVuaXQgVGVzdHMKKyAgICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgICAgZXhwb3J0IGN5dGhvbj0ieWVzIgorICAgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYS8KKyAgICAgICAgICAgIC4vcHlsaWIvY2Fzc2FuZHJhLWNxbHNoLXRlc3RzLnNoICQocHdkKQorICAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA8PHBhcmFtZXRlcnMubm9fb3V0cHV0X3RpbWVvdXQ+PgorICAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvcHlsaWIKKworICBydW5fcGFyYWxsZWxfanVuaXRfdGVzdHM6CisgICAgcGFyYW1ldGVyczoKKyAgICAgIHRhcmdldDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IHRlc3RjbGFzc2xpc3QKKyAgICAgIG5vX291dHB1dF90aW1lb3V0OgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogMTVtCisgICAgICBjbGFzc2xpc3RwcmVmaXg6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiB1bml0CisgICAgICBhcmd1bWVudHM6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiAiICIKKyAgICBzdGVwczoKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKDw8cGFyYW1ldGVycy50YXJnZXQ+PikKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC48PHBhcmFtZXRlcnMuY2xhc3NsaXN0cHJlZml4Pj4udGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IDw8cGFyYW1ldGVycy50YXJnZXQ+PiA8PHBhcmFtZXRlcnMuYXJndW1lbnRzPj4gLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD08PHBhcmFtZXRlcnMuY2xhc3NsaXN0cHJlZml4Pj4gLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDw8cGFyYW1ldGVycy5ub19vdXRwdXRfdGltZW91dD4+CisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisKKyAgY3JlYXRlX3ZlbnY6CisgICAgcGFyYW1ldGVyczoKKyAgICAgIHB5dGhvbl92ZXJzaW9uOgorICAgICAgICB0eXBlOiBlbnVtCisgICAgICAgIGRlZmF1bHQ6ICIzLjYiCisgICAgICAgIGVudW06IFsiMy42IiwgIjMuNyIsICIzLjgiLCAiMy4xMSJdCisgICAgc3RlcHM6CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnY8PHBhcmFtZXRlcnMucHl0aG9uX3ZlcnNpb24+Pi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKworICBjcmVhdGVfZHRlc3RfY29udGFpbmVyczoKKyAgICBwYXJhbWV0ZXJzOgorICAgICAgZmlsZV90YWc6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogJycKKyAgICAgIGV4dHJhX2Vudl9hcmdzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogJycKKyAgICAgIHRlc3RzX2ZpbHRlcl9wYXR0ZXJuOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogJycKKyAgICAgIHB5dGhvbl92ZXJzaW9uOgorICAgICAgICB0eXBlOiBlbnVtCisgICAgICAgIGRlZmF1bHQ6ICIzLjYiCisgICAgICAgIGVudW06IFsiMy42IiwgIjMuNyIsICIzLjgiLCAiMy4xMSJdCisgICAgc3RlcHM6CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKDw8cGFyYW1ldGVycy5maWxlX3RhZz4+KQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBjZCBjYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBzb3VyY2Ugfi9lbnY8PHBhcmFtZXRlcnMucHl0aG9uX3ZlcnNpb24+Pi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgaWYgWyAtbiAnPDxwYXJhbWV0ZXJzLmV4dHJhX2Vudl9hcmdzPj4nIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCA8PHBhcmFtZXRlcnMuZXh0cmFfZW52X2FyZ3M+PgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBlY2hvICIqKipDb2xsZWN0ZWQgRFRlc3RzICg8PHBhcmFtZXRlcnMuZmlsZV90YWc+PikqKioiCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgPDxwYXJhbWV0ZXJzLnJ1bl9kdGVzdHNfZXh0cmFfYXJncz4+IC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c188PHBhcmFtZXRlcnMuZmlsZV90YWc+Pl9yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLXogJzw8cGFyYW1ldGVycy50ZXN0c19maWx0ZXJfcGF0dGVybj4+JyBdOyB0aGVuCisgICAgICAgICAgICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c188PHBhcmFtZXRlcnMuZmlsZV90YWc+Pl9yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfPDxwYXJhbWV0ZXJzLmZpbGVfdGFnPj4KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBncmVwIC1lICc8PHBhcmFtZXRlcnMudGVzdHNfZmlsdGVyX3BhdHRlcm4+PicgL3RtcC9hbGxfZHRlc3RfdGVzdHNfPDxwYXJhbWV0ZXJzLmZpbGVfdGFnPj5fcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfPDxwYXJhbWV0ZXJzLmZpbGVfdGFnPj4gfHwgeyBlY2hvICJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuIjsgZXhpdCAwOyB9CisgICAgICAgICAgZmkKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfPDxwYXJhbWV0ZXJzLmZpbGVfdGFnPj4gPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzXzw8cGFyYW1ldGVycy5maWxlX3RhZz4+LnR4dAorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzXzw8cGFyYW1ldGVycy5maWxlX3RhZz4+LnR4dCB8IHRyICdcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c188PHBhcmFtZXRlcnMuZmlsZV90YWc+Pl9maW5hbC50eHQKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c188PHBhcmFtZXRlcnMuZmlsZV90YWc+Pl9maW5hbC50eHQKKworICBydW5fZHRlc3RzOgorICAgIHBhcmFtZXRlcnM6CisgICAgICBmaWxlX3RhZzoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBweXRlc3RfZXh0cmFfYXJnczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6ICcnCisgICAgICBleHRyYV9lbnZfYXJnczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6ICcnCisgICAgICBweXRob25fdmVyc2lvbjoKKyAgICAgICAgdHlwZTogZW51bQorICAgICAgICBkZWZhdWx0OiAiMy42IgorICAgICAgICBlbnVtOiBbIjMuNiIsICIzLjciLCAiMy44IiwgIjMuMTEiXQorICAgIHN0ZXBzOgorICAgICAgLSBydW46CisgICAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoPDxwYXJhbWV0ZXJzLmZpbGVfdGFnPj4pCisgICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzXzw8cGFyYW1ldGVycy5maWxlX3RhZz4+X2ZpbmFsLnR4dCIKKyAgICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzXzw8cGFyYW1ldGVycy5maWxlX3RhZz4+X2ZpbmFsLnR4dAorCisgICAgICAgICAgICBzb3VyY2Ugfi9lbnY8PHBhcmFtZXRlcnMucHl0aG9uX3ZlcnNpb24+Pi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgICBpZiBbIC1uICc8PHBhcmFtZXRlcnMuZXh0cmFfZW52X2FyZ3M+PicgXTsgdGhlbgorICAgICAgICAgICAgICBleHBvcnQgPDxwYXJhbWV0ZXJzLmV4dHJhX2Vudl9hcmdzPj4KKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzXzw8cGFyYW1ldGVycy5maWxlX3RhZz4+X2ZpbmFsLnR4dGAKKyAgICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgPDxwYXJhbWV0ZXJzLnB5dGVzdF9leHRyYV9hcmdzPj4gLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfPDxwYXJhbWV0ZXJzLmZpbGVfdGFnPj4ueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgICAgZmkKKyAgICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF88PHBhcmFtZXRlcnMuZmlsZV90YWc+PgorICAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF88PHBhcmFtZXRlcnMuZmlsZV90YWc+Pl9sb2dzCisKKyAgcnVuX3VuaXRfdGVzdHNfcmVwZWF0OgorICAgIHN0ZXBzOgorICAgICAgLSBydW5fcmVwZWF0ZWRfdXRlc3RzOgorICAgICAgICAgIHRhcmdldDogdGVzdHNvbWUKKyAgICAgICAgICB0ZXN0czogJHtSRVBFQVRFRF9VVEVTVFN9CisgICAgICAgICAgY291bnQ6ICR7UkVQRUFURURfVVRFU1RTX0NPVU5UfQorICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZTogJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9CisKKyAgcnVuX3V0ZXN0c19jZGNfcmVwZWF0OgorICAgIHN0ZXBzOgorICAgICAgLSBydW5fcmVwZWF0ZWRfdXRlc3RzOgorICAgICAgICAgIHRhcmdldDogdGVzdC1jZGMKKyAgICAgICAgICB0ZXN0czogJHtSRVBFQVRFRF9VVEVTVFN9CisgICAgICAgICAgY291bnQ6ICR7UkVQRUFURURfVVRFU1RTX0NPVU5UfQorICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZTogJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9CisKKyAgcnVuX3V0ZXN0c19jb21wcmVzc2lvbl9yZXBlYXQ6CisgICAgc3RlcHM6CisgICAgICAtIHJ1bl9yZXBlYXRlZF91dGVzdHM6CisgICAgICAgICAgdGFyZ2V0OiB0ZXN0LWNvbXByZXNzaW9uCisgICAgICAgICAgdGVzdHM6ICR7UkVQRUFURURfVVRFU1RTfQorICAgICAgICAgIGNvdW50OiAke1JFUEVBVEVEX1VURVNUU19DT1VOVH0KKyAgICAgICAgICBzdG9wX29uX2ZhaWx1cmU6ICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfQorCisgIHJ1bl91dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgc3RlcHM6CisgICAgICAtIHJ1bl9yZXBlYXRlZF91dGVzdHM6CisgICAgICAgICAgdGFyZ2V0OiB0ZXN0LXRyaWUKKyAgICAgICAgICB0ZXN0czogJHtSRVBFQVRFRF9VVEVTVFN9CisgICAgICAgICAgY291bnQ6ICR7UkVQRUFURURfVVRFU1RTX0NPVU5UfQorICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZTogJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9CisKKyAgcnVuX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5X3JlcGVhdDoKKyAgICBzdGVwczoKKyAgICAgIC0gcnVuX3JlcGVhdGVkX3V0ZXN0czoKKyAgICAgICAgICB0YXJnZXQ6IHRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeQorICAgICAgICAgIHRlc3RzOiAke1JFUEVBVEVEX1VURVNUU30KKyAgICAgICAgICBjb3VudDogJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9CisgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlOiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0KKworICBydW5fdXRlc3RzX2xvbmdfcmVwZWF0OgorICAgIHN0ZXBzOgorICAgICAgLSBydW5fcmVwZWF0ZWRfdXRlc3RzOgorICAgICAgICAgIHRhcmdldDogbG9uZy10ZXN0c29tZQorICAgICAgICAgIHRlc3RzOiAke1JFUEVBVEVEX1VURVNUU19MT05HfQorICAgICAgICAgIGNvdW50OiAke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfQorICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZTogJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9CisKKyAgcnVuX3V0ZXN0c19mcWx0b29sX3JlcGVhdDoKKyAgICBzdGVwczoKKyAgICAgIC0gcnVuX3JlcGVhdGVkX3V0ZXN0czoKKyAgICAgICAgICB0YXJnZXQ6IGZxbHRvb2wtdGVzdAorICAgICAgICAgIHRlc3RzOiAke1JFUEVBVEVEX1VURVNUU19GUUxUT09MfQorICAgICAgICAgIGNvdW50OiAke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfQorICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZTogJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9CisKKyAgcnVuX3V0ZXN0c19zdHJlc3NfcmVwZWF0OgorICAgIHN0ZXBzOgorICAgICAgLSBydW5fcmVwZWF0ZWRfdXRlc3RzOgorICAgICAgICAgIHRhcmdldDogc3RyZXNzLXRlc3Qtc29tZQorICAgICAgICAgIHRlc3RzOiAke1JFUEVBVEVEX1VURVNUU19TVFJFU1N9CisgICAgICAgICAgY291bnQ6ICR7UkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVH0KKyAgICAgICAgICBzdG9wX29uX2ZhaWx1cmU6ICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfQorCisgIHJ1bl9qdm1fZHRlc3RzX3JlcGVhdDoKKyAgICBzdGVwczoKKyAgICAgIC0gcnVuX3JlcGVhdGVkX3V0ZXN0czoKKyAgICAgICAgICB0YXJnZXQ6IHRlc3QtanZtLWR0ZXN0LXNvbWUKKyAgICAgICAgICB0ZXN0czogJHtSRVBFQVRFRF9KVk1fRFRFU1RTfQorICAgICAgICAgIGNvdW50OiAke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9CisgICAgICAgICAgdm5vZGVzOiBmYWxzZQorICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZTogJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9CisKKyAgcnVuX3NpbXVsYXRvcl9kdGVzdHNfcmVwZWF0OgorICAgIHN0ZXBzOgorICAgICAgLSBydW5fcmVwZWF0ZWRfdXRlc3RzOgorICAgICAgICAgIHRhcmdldDogdGVzdC1zaW11bGF0b3ItZHRlc3QKKyAgICAgICAgICB0ZXN0czogJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTfQorICAgICAgICAgIGNvdW50OiAke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlR9CisgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlOiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0KKworICBydW5fanZtX2R0ZXN0c192bm9kZV9yZXBlYXQ6CisgICAgc3RlcHM6CisgICAgICAtIHJ1bl9yZXBlYXRlZF91dGVzdHM6CisgICAgICAgICAgdGFyZ2V0OiB0ZXN0LWp2bS1kdGVzdC1zb21lCisgICAgICAgICAgdGVzdHM6ICR7UkVQRUFURURfSlZNX0RURVNUU30KKyAgICAgICAgICBjb3VudDogJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfQorICAgICAgICAgIHZub2RlczogdHJ1ZQorICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZTogJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9CisKKyAgcnVuX3JlcGVhdGVkX3V0ZXN0czoKKyAgICBwYXJhbWV0ZXJzOgorICAgICAgdGFyZ2V0OgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHRlc3RzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGNvdW50OgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZub2RlczoKKyAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgICBkZWZhdWx0OiBmYWxzZQorICAgICAgc3RvcF9vbl9mYWlsdXJlOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICBzdGVwczoKKyAgICAgIC0gcnVuOgorICAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAgIHNldCAteAorICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICAKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICBjb3VudD0kKCg8PHBhcmFtZXRlcnMuY291bnQ+PiAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKDw8cGFyYW1ldGVycy5jb3VudD4+ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgCisgICAgICAgICAgICAjIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXMKKyAgICAgICAgICAgIHRlc3RzPSQoZWNobyA8PHBhcmFtZXRlcnMudGVzdHM+PiB8IHNlZCAtZSAicy88bmlsPi8vIiB8IHNlZCAtZSAicy8gLy8iIHwgdHIgIiwiICJcbiIgfCB0ciAiICIgIlxuIiB8IHNvcnQgLW4gfCB1bmlxIC11KQorICAgICAgICAgICAgZWNobyAiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9IgorICAgICAgICAgICAgCisgICAgICAgICAgICAjIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC4KKyAgICAgICAgICAgIHZub2Rlcz08PHBhcmFtZXRlcnMudm5vZGVzPj4KKyAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICBpZiBbICIkdm5vZGVzIiA9IHRydWUgXSA7IHRoZW4KKyAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNiciCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAjIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXMKKyAgICAgICAgICAgIHRhcmdldD08PHBhcmFtZXRlcnMudGFyZ2V0Pj4KKyAgICAgICAgICAgIHRlc3R0YWc9IiIKKyAgICAgICAgICAgIGlmIFtbICR0YXJnZXQgPT0gInRlc3QtY2RjIiBdXTsgdGhlbgorICAgICAgICAgICAgICB0ZXN0dGFnPSJjZGMiCisgICAgICAgICAgICBlbGlmIFtbICR0YXJnZXQgPT0gInRlc3QtY29tcHJlc3Npb24iIF1dOyB0aGVuCisgICAgICAgICAgICAgIHRlc3R0YWc9ImNvbXByZXNzaW9uIgorICAgICAgICAgICAgZWxpZiBbWyAkdGFyZ2V0ID09ICJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkiIF1dOyB0aGVuCisgICAgICAgICAgICAgIHRlc3R0YWc9InN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnkiCisgICAgICAgICAgICBlbGlmIFtbICR0YXJnZXQgPT0gInRlc3QtdHJpZSIgXV07IHRoZW4KKyAgICAgICAgICAgICAgdGVzdHRhZz0idHJpZSIKKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC4KKyAgICAgICAgICAgIGV4aXRfY29kZT0iJD8iCisgICAgICAgICAgICBmb3IgdGVzdCBpbiAkdGVzdHM7IGRvCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lCisgICAgICAgICAgICAgICAgaWYgW1sgJHRlc3QgPX4gIiMiIF1dOyB0aGVuCisgICAgICAgICAgICAgICAgICBjbGFzcz0ke3Rlc3QlIiMiKn0KKyAgICAgICAgICAgICAgICAgIG1ldGhvZD0ke3Rlc3QjKiIjIn0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBjbGFzcz0kdGVzdAorICAgICAgICAgICAgICAgICAgbWV0aG9kPSIiCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuCisgICAgICAgICAgICAgICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC4KKyAgICAgICAgICAgICAgICBpZiBbWyAkdGFyZ2V0ID09ICJ0ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1jZGMiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LWNvbXByZXNzaW9uIiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC10cmllIiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAiZnFsdG9vbC10ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAibG9uZy10ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAic3RyZXNzLXRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LXNpbXVsYXRvci1kdGVzdCIgXV07IHRoZW4KKyAgICAgICAgICAgICAgICAgIG5hbWVfYXJnPSItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn0iCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgbmFtZV9hcmc9Ii1EdGVzdC5uYW1lPSRjbGFzcyIKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwKKyAgICAgICAgICAgICAgICBpZiBbWyAkbWV0aG9kID09ICIiIF1dOyB0aGVuCisgICAgICAgICAgICAgICAgICBtZXRob2RzX2FyZz0iIgorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIG1ldGhvZHNfYXJnPSItRHRlc3QubWV0aG9kcz0kbWV0aG9kIgorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvCisgICAgICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnQiCisKKyAgICAgICAgICAgICAgICAgICMgcnVuIHRoZSB0ZXN0CisgICAgICAgICAgICAgICAgICBzdGF0dXM9InBhc3NlcyIKKyAgICAgICAgICAgICAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICBhbnQgPDxwYXJhbWV0ZXJzLnRhcmdldD4+ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXAorICAgICAgICAgICAgICAgICAgICAgICk7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzPSJmYWlscyIKKyAgICAgICAgICAgICAgICAgICAgZXhpdF9jb2RlPTEKKyAgICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlCisgICAgICAgICAgICAgICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9CisgICAgICAgICAgICAgICAgICBta2RpciAtcCAkZGVzdAorICAgICAgICAgICAgICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dAorCisgICAgICAgICAgICAgICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXMKKyAgICAgICAgICAgICAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9CisgICAgICAgICAgICAgICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9CisgICAgICAgICAgICAgICAgICBta2RpciAtcCAkZGVzdAorICAgICAgICAgICAgICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiAiJChscyAkc291cmNlKSIgXV07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0LworICAgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXMKKyAgICAgICAgICAgICAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfQorICAgICAgICAgICAgICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX0KKyAgICAgICAgICAgICAgICAgIG1rZGlyIC1wICRkZXN0CisgICAgICAgICAgICAgICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uICIkKGxzICRzb3VyY2UpIiBdXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvCisgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmUKKyAgICAgICAgICAgICAgICAgIGlmIFtbIDw8cGFyYW1ldGVycy5zdG9wX29uX2ZhaWx1cmU+PiA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgKGV4aXQgJHtleGl0X2NvZGV9KQorICAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisKKyAgcnVuX3JlcGVhdGVkX3V0ZXN0OgorICAgIHBhcmFtZXRlcnM6CisgICAgICB0YXJnZXQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgY2xhc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbWV0aG9kczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2bm9kZXM6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgY291bnQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgc3RvcF9vbl9mYWlsdXJlOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICBzdGVwczoKKyAgICAgIC0gcnVuOgorICAgICAgICAgIG5hbWU6IFJ1biByZXBlYXRlZCBKVW5pdCB0ZXN0CisgICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAgIGlmIFsgIjw8cGFyYW1ldGVycy5jbGFzcz4+IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgdXRlc3QgY2xhc3MgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICAgIGVsaWYgWyAiPDxwYXJhbWV0ZXJzLmNvdW50Pj4iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCB1dGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICAgIGVsaWYgWyAiPDxwYXJhbWV0ZXJzLmNvdW50Pj4iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgdXRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgCisgICAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgICBjb3VudD0kKCg8PHBhcmFtZXRlcnMuY291bnQ+PiAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoPDxwYXJhbWV0ZXJzLmNvdW50Pj4gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlbgorICAgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIGlmICgoJGNvdW50IDw9IDApKTsgdGhlbgorICAgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgPDxwYXJhbWV0ZXJzLnRhcmdldD4+IDw8cGFyYW1ldGVycy5jbGFzcz4+IDw8cGFyYW1ldGVycy5tZXRob2RzPj4gPDxwYXJhbWV0ZXJzLmNvdW50Pj4gdGltZXMiCisKKyAgICAgICAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgdGFyZ2V0PTw8cGFyYW1ldGVycy50YXJnZXQ+PgorICAgICAgICAgICAgICAgIGNsYXNzX3BhdGg9PDxwYXJhbWV0ZXJzLmNsYXNzPj4KKyAgICAgICAgICAgICAgICBjbGFzc19uYW1lPSIke2NsYXNzX3BhdGgjIyoufSIKKworICAgICAgICAgICAgICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuCisgICAgICAgICAgICAgICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC4KKyAgICAgICAgICAgICAgICBpZiBbWyAkdGFyZ2V0ID09ICJ0ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1jZGMiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LWNvbXByZXNzaW9uIiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC10cmllIiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAiZnFsdG9vbC10ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAibG9uZy10ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAic3RyZXNzLXRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LXNpbXVsYXRvci1kdGVzdCIgXV07IHRoZW4KKyAgICAgICAgICAgICAgICAgIG5hbWU9Ii1EdGVzdC5uYW1lPSRjbGFzc19uYW1lIgorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIG5hbWU9Ii1EdGVzdC5uYW1lPSRjbGFzc19wYXRoIgorICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbAorICAgICAgICAgICAgICAgIGlmIFsgIjw8cGFyYW1ldGVycy5tZXRob2RzPj4iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgbWV0aG9kcz0iIgorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIG1ldGhvZHM9Ii1EdGVzdC5tZXRob2RzPTw8cGFyYW1ldGVycy5tZXRob2RzPj4iCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9IiIKKyAgICAgICAgICAgICAgICBpZiA8PHBhcmFtZXRlcnMudm5vZGVzPj47IHRoZW4KKyAgICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnIgorICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICAjIFJ1biB0aGUgdGVzdCB0YXJnZXQgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQgY29sbGVjdGluZyB0aGUgZXhpdCBjb2RlLAorICAgICAgICAgICAgICAgICMgc3RvcHBpbmcgdGhlIGl0ZXJhdGlvbiBvbmx5IGlmIHN0b3Bfb25fZmFpbHVyZSBpcyBzZXQuCisgICAgICAgICAgICAgICAgZXhpdF9jb2RlPSIkPyIKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvCisKKyAgICAgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgdGVzdCBpdGVyYXRpb24gJGkgb2YgJGNvdW50IgorCisgICAgICAgICAgICAgICAgICAjIHJ1biB0aGUgdGVzdAorICAgICAgICAgICAgICAgICAgc3RhdHVzPSJwYXNzZXMiCisgICAgICAgICAgICAgICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgYW50ICR0YXJnZXQgJG5hbWUgJG1ldGhvZHMgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgdGVlIHN0ZG91dC50eHQgKTsgdGhlbgorICAgICAgICAgICAgICAgICAgICBzdGF0dXM9ImZhaWxzIgorICAgICAgICAgICAgICAgICAgICBleGl0X2NvZGU9MQorICAgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGUKKyAgICAgICAgICAgICAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L3N0ZG91dC8ke3N0YXR1c30vJHtpfQorICAgICAgICAgICAgICAgICAgbWtkaXIgLXAgJGRlc3QKKyAgICAgICAgICAgICAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvPDxwYXJhbWV0ZXJzLnRhcmdldD4+LTw8cGFyYW1ldGVycy5jbGFzcz4+LnR4dAorCisgICAgICAgICAgICAgICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXMKKyAgICAgICAgICAgICAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dAorICAgICAgICAgICAgICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvb3V0cHV0LyR7c3RhdHVzfS8ke2l9CisgICAgICAgICAgICAgICAgICBta2RpciAtcCAkZGVzdAorICAgICAgICAgICAgICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiAiJChscyAkc291cmNlKSIgXV07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0LworICAgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXMKKyAgICAgICAgICAgICAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgICAgICAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L2xvZ3MvJHtzdGF0dXN9LyR7aX0KKyAgICAgICAgICAgICAgICAgIG1rZGlyIC1wICRkZXN0CisgICAgICAgICAgICAgICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uICIkKGxzICRzb3VyY2UpIiBdXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvCisgICAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmUKKyAgICAgICAgICAgICAgICAgIGlmIFtbIDw8cGFyYW1ldGVycy5zdG9wX29uX2ZhaWx1cmU+PiA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZG9uZQorCisgICAgICAgICAgICAgICAgKGV4aXQgJHtleGl0X2NvZGV9KQorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKyAgICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9vdXRwdXQKKyAgICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9zdGRvdXQKKyAgICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvb3V0cHV0CisgICAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3QvbG9ncworICAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisKKyAgcnVuX3JlcGVhdGVkX2R0ZXN0OgorICAgIHBhcmFtZXRlcnM6CisgICAgICB0ZXN0czoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2bm9kZXM6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdXBncmFkZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBjb3VudDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBzdG9wX29uX2ZhaWx1cmU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgZXh0cmFfZHRlc3RfYXJnczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6ICIiCisgICAgc3RlcHM6CisgICAgICAtIHJ1bjoKKyAgICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgICBpZiBbICI8PHBhcmFtZXRlcnMudGVzdHM+PiIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgICBlbGlmIFsgIjw8cGFyYW1ldGVycy5jb3VudD4+IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgICBlbGlmIFsgIjw8cGFyYW1ldGVycy5jb3VudD4+IiAtbGUgMCBdOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLgorICAgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgICAgY291bnQ9JCgoPDxwYXJhbWV0ZXJzLmNvdW50Pj4gLyBDSVJDTEVfTk9ERV9UT1RBTCkpCisgICAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKDw8cGFyYW1ldGVycy5jb3VudD4+ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgICBjb3VudD0kKChjb3VudCsxKSkKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgICBlY2hvICJObyB0ZXN0cyB0byBydW4gaW4gdGhpcyBydW5uZXIiCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nIDw8cGFyYW1ldGVycy50ZXN0cz4+ICRjb3VudCB0aW1lcyIKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdGVzdHNfYXJnPSQoZWNobyA8PHBhcmFtZXRlcnMudGVzdHM+PiB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgICAgaWYgPDxwYXJhbWV0ZXJzLnN0b3Bfb25fZmFpbHVyZT4+OyB0aGVuCisgICAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9IiIKKyAgICAgICAgICAgICAgICBpZiA8PHBhcmFtZXRlcnMudm5vZGVzPj47IHRoZW4KKyAgICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IgorICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iIgorICAgICAgICAgICAgICAgIGlmIDw8cGFyYW1ldGVycy51cGdyYWRlPj47IHRoZW4KKyAgICAgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSItLWV4ZWN1dGUtdXBncmFkZS10ZXN0cyAtLXVwZ3JhZGUtdGFyZ2V0LXZlcnNpb24tb25seSAtLXVwZ3JhZGUtdmVyc2lvbi1zZWxlY3Rpb24gYWxsIgorICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAkdm5vZGVzX2FyZ3MgLS1jb3VudD0kY291bnQgJHN0b3Bfb25fZmFpbHVyZV9hcmcgJHVwZ3JhZGVfYXJnIC0tbG9nLWNsaS1sZXZlbD1ERUJVRyAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHQueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciA8PHBhcmFtZXRlcnMuZXh0cmFfZHRlc3RfYXJncz4+ICR0ZXN0c19hcmcgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorICAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0CisgICAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKZGlmZiAtLWdpdCBhLy5jaXJjbGVjaS9jb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbC5QQUlELnBhdGNoIGIvLmNpcmNsZWNpL2NvbmZpZ190ZW1wbGF0ZV8xMV9hbmRfMTcueW1sLlBBSUQucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBjNjU2MAotLS0gL2Rldi9udWxsCisrKyBiLy5jaXJjbGVjaS9jb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbC5QQUlELnBhdGNoCkBAIC0wLDAgKzEsMzc0IEBACistLS0gY29uZmlnX3RlbXBsYXRlXzExX2FuZF8xNy55bWwJMjAyMy0wMy0xNSAyMTozNDo1Ny4wMDAwMDAwMDAgLTA0MDAKKysrKyBjb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbC5QQUlECTIwMjMtMDMtMTUgMjE6Mzc6MjUuMDAwMDAwMDAwIC0wNDAwCitAQCAtMTQwLDE0ICsxNDAsMTQgQEAKKyBqMTFfcGFyX2V4ZWN1dG9yOiAmajExX3Bhcl9leGVjdXRvcgorICAgZXhlY3V0b3I6CisgICAgIG5hbWU6IGphdmExMS1leGVjdXRvcgorLSAgICAjZXhlY19yZXNvdXJjZV9jbGFzczogeGxhcmdlCistICBwYXJhbGxlbGlzbTogNAorKyAgICBleGVjX3Jlc291cmNlX2NsYXNzOiBtZWRpdW0KKysgIHBhcmFsbGVsaXNtOiAyNQorIAorIGoxMV9zbWFsbF9wYXJfZXhlY3V0b3I6ICZqMTFfc21hbGxfcGFyX2V4ZWN1dG9yCisgICBleGVjdXRvcjoKKyAgICAgbmFtZTogamF2YTExLWV4ZWN1dG9yCistICAgICNleGVjX3Jlc291cmNlX2NsYXNzOiB4bGFyZ2UKKy0gIHBhcmFsbGVsaXNtOiAxCisrICAgIGV4ZWNfcmVzb3VyY2VfY2xhc3M6IGxhcmdlCisrICBwYXJhbGxlbGlzbTogMTAKKyAKKyBqMTFfc21hbGxfZXhlY3V0b3I6ICZqMTFfc21hbGxfZXhlY3V0b3IKKyAgIGV4ZWN1dG9yOgorQEAgLTE1NSwzMCArMTU1LDQxIEBACisgICAgIGV4ZWNfcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgcGFyYWxsZWxpc206IDEKKyAKKytqMTFfbGFyZ2VfcGFyX2V4ZWN1dG9yOiAmajExX2xhcmdlX3Bhcl9leGVjdXRvcgorKyAgZXhlY3V0b3I6CisrICAgIG5hbWU6IGphdmExMS1leGVjdXRvcgorKyAgICBleGVjX3Jlc291cmNlX2NsYXNzOiBsYXJnZQorKyAgcGFyYWxsZWxpc206IDUwCisrCisrajExX3ZlcnlfbGFyZ2VfcGFyX2V4ZWN1dG9yOiAmajExX3ZlcnlfbGFyZ2VfcGFyX2V4ZWN1dG9yCisrICBleGVjdXRvcjoKKysgICAgbmFtZTogamF2YTExLWV4ZWN1dG9yCisrICAgIGV4ZWNfcmVzb3VyY2VfY2xhc3M6IGxhcmdlCisrICBwYXJhbGxlbGlzbTogMTAwCisrCisgajExX21lZGl1bV9wYXJfZXhlY3V0b3I6ICZqMTFfbWVkaXVtX3Bhcl9leGVjdXRvcgorICAgZXhlY3V0b3I6CisgICAgIG5hbWU6IGphdmExMS1leGVjdXRvcgorLSAgICAjZXhlY19yZXNvdXJjZV9jbGFzczogeGxhcmdlCistICBwYXJhbGxlbGlzbTogMQorKyAgICBleGVjX3Jlc291cmNlX2NsYXNzOiB4bGFyZ2UKKysgIHBhcmFsbGVsaXNtOiA0CisgCisgajExX3NlcV9leGVjdXRvcjogJmoxMV9zZXFfZXhlY3V0b3IKKyAgIGV4ZWN1dG9yOgorICAgICBuYW1lOiBqYXZhMTEtZXhlY3V0b3IKKy0gICAgI2V4ZWNfcmVzb3VyY2VfY2xhc3M6IHhsYXJnZQorICAgICBleGVjX3Jlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgIHBhcmFsbGVsaXNtOiAxICMgc2VxdWVudGlhbCwgc2luZ2xlIGNvbnRhaW5lciB0ZXN0czogbm8gcGFyYWxsZWxpc20gYmVuZWZpdHMKKyAKKyBqMTdfcGFyX2V4ZWN1dG9yOiAmajE3X3Bhcl9leGVjdXRvcgorICAgZXhlY3V0b3I6CisgICAgIG5hbWU6IGphdmExNy1leGVjdXRvcgorLSAgICAjZXhlY19yZXNvdXJjZV9jbGFzczogeGxhcmdlCistICBwYXJhbGxlbGlzbTogNAorKyAgICBleGVjX3Jlc291cmNlX2NsYXNzOiBtZWRpdW0KKysgIHBhcmFsbGVsaXNtOiAyNQorIAorIGoxN19zbWFsbF9wYXJfZXhlY3V0b3I6ICZqMTdfc21hbGxfcGFyX2V4ZWN1dG9yCisgICBleGVjdXRvcjoKKyAgICAgbmFtZTogamF2YTE3LWV4ZWN1dG9yCistICAgICNleGVjX3Jlc291cmNlX2NsYXNzOiB4bGFyZ2UKKy0gIHBhcmFsbGVsaXNtOiAxCisrICAgIGV4ZWNfcmVzb3VyY2VfY2xhc3M6IGxhcmdlCisrICBwYXJhbGxlbGlzbTogMTAKKyAKKyBqMTdfc21hbGxfZXhlY3V0b3I6ICZqMTdfc21hbGxfZXhlY3V0b3IKKyAgIGV4ZWN1dG9yOgorQEAgLTE4OSwzNCArMjAwLDQ0IEBACisgajE3X21lZGl1bV9wYXJfZXhlY3V0b3I6ICZqMTdfbWVkaXVtX3Bhcl9leGVjdXRvcgorICAgZXhlY3V0b3I6CisgICAgIG5hbWU6IGphdmExNy1leGVjdXRvcgorLSAgICAjZXhlY19yZXNvdXJjZV9jbGFzczogeGxhcmdlCistICBwYXJhbGxlbGlzbTogMQorKyAgICBleGVjX3Jlc291cmNlX2NsYXNzOiB4bGFyZ2UKKysgIHBhcmFsbGVsaXNtOiA0CisrCisrajE3X2xhcmdlX3Bhcl9leGVjdXRvcjogJmoxN19sYXJnZV9wYXJfZXhlY3V0b3IKKysgIGV4ZWN1dG9yOgorKyAgICBuYW1lOiBqYXZhMTctZXhlY3V0b3IKKysgICAgZXhlY19yZXNvdXJjZV9jbGFzczogbGFyZ2UKKysgIHBhcmFsbGVsaXNtOiA1MAorIAorIGoxN19zZXFfZXhlY3V0b3I6ICZqMTdfc2VxX2V4ZWN1dG9yCisgICBleGVjdXRvcjoKKyAgICAgbmFtZTogamF2YTE3LWV4ZWN1dG9yCistICAgICNleGVjX3Jlc291cmNlX2NsYXNzOiB4bGFyZ2UKKysgICAgZXhlY19yZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICBwYXJhbGxlbGlzbTogMSAjIHNlcXVlbnRpYWwsIHNpbmdsZSBjb250YWluZXIgdGVzdHM6IG5vIHBhcmFsbGVsaXNtIGJlbmVmaXRzCisgCisgajExX3JlcGVhdGVkX3V0ZXN0X2V4ZWN1dG9yOiAmajExX3JlcGVhdGVkX3V0ZXN0X2V4ZWN1dG9yCisgICBleGVjdXRvcjoKKyAgICAgbmFtZTogamF2YTExLWV4ZWN1dG9yCistICBwYXJhbGxlbGlzbTogNAorKyAgICBleGVjX3Jlc291cmNlX2NsYXNzOiBtZWRpdW0KKysgIHBhcmFsbGVsaXNtOiAyNQorIAorIGoxMV9yZXBlYXRlZF9kdGVzdF9leGVjdXRvcjogJmoxMV9yZXBlYXRlZF9kdGVzdF9leGVjdXRvcgorICAgZXhlY3V0b3I6CisgICAgIG5hbWU6IGphdmExMS1leGVjdXRvcgorLSAgcGFyYWxsZWxpc206IDQKKysgICAgZXhlY19yZXNvdXJjZV9jbGFzczogbGFyZ2UKKysgIHBhcmFsbGVsaXNtOiAyNQorIAorIGoxN19yZXBlYXRlZF91dGVzdF9leGVjdXRvcjogJmoxN19yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgZXhlY3V0b3I6CisgICAgIG5hbWU6IGphdmExNy1leGVjdXRvcgorLSAgcGFyYWxsZWxpc206IDQKKysgICAgZXhlY19yZXNvdXJjZV9jbGFzczogbWVkaXVtCisrICBwYXJhbGxlbGlzbTogMjUKKyAKKyBqMTdfcmVwZWF0ZWRfZHRlc3RfZXhlY3V0b3I6ICZqMTdfcmVwZWF0ZWRfZHRlc3RfZXhlY3V0b3IKKyAgIGV4ZWN1dG9yOgorICAgICBuYW1lOiBqYXZhMTctZXhlY3V0b3IKKy0gIHBhcmFsbGVsaXNtOiA0CisrICAgIGV4ZWNfcmVzb3VyY2VfY2xhc3M6IGxhcmdlCisrICBwYXJhbGxlbGlzbTogMjUKKyAKKyBqMTFfc2VwYXJhdGVfam9iczogJmoxMV9zZXBhcmF0ZV9qb2JzCisgICBqb2JzOgorQEAgLTE4MDgsNyArMTgyOSw3IEBACisgICAgICAgICAgIHRhcmdldDogdGVzdGNsYXNzbGlzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5CisgCisgICBqMTFfZHRlc3RzX3Zub2RlOgorLSAgICA8PDogKmoxMV9wYXJfZXhlY3V0b3IKKysgICAgPDw6ICpqMTFfbGFyZ2VfcGFyX2V4ZWN1dG9yCisgICAgIHN0ZXBzOgorICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorQEAgLTE4MjIsNyArMTg0Myw3IEBACisgICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworIAorICAgajExX2R0ZXN0c19vZmZoZWFwOgorLSAgICA8PDogKmoxMV9wYXJfZXhlY3V0b3IKKysgICAgPDw6ICpqMTFfbGFyZ2VfcGFyX2V4ZWN1dG9yCisgICAgIHN0ZXBzOgorICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorQEAgLTE4MzYsNyArMTg1Nyw3IEBACisgICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cycKKyAKKyAgIGoxN19kdGVzdHNfdm5vZGU6CistICAgIDw8OiAqajE3X3Bhcl9leGVjdXRvcgorKyAgICA8PDogKmoxN19sYXJnZV9wYXJfZXhlY3V0b3IKKyAgICAgc3RlcHM6CisgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKK0BAIC0xODUxLDcgKzE4NzIsNyBAQAorICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgCisgICBqMTdfZHRlc3RzX29mZmhlYXA6CistICAgIDw8OiAqajE3X3Bhcl9leGVjdXRvcgorKyAgICA8PDogKmoxN19sYXJnZV9wYXJfZXhlY3V0b3IKKyAgICAgc3RlcHM6CisgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCitAQCAtMTg2Niw3ICsxODg3LDcgQEAKKyAgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworIAorICAgajExX2R0ZXN0czoKKy0gICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisrICAgIDw8OiAqajExX2xhcmdlX3Bhcl9leGVjdXRvcgorICAgICBzdGVwczoKKyAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKK0BAIC0xODgwLDcgKzE5MDEsNyBAQAorICAgICAgICAgICBweXRlc3RfZXh0cmFfYXJnczogJy0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgCisgICBqMTdfZHRlc3RzOgorLSAgICA8PDogKmoxN19wYXJfZXhlY3V0b3IKKysgICAgPDw6ICpqMTdfbGFyZ2VfcGFyX2V4ZWN1dG9yCisgICAgIHN0ZXBzOgorICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCitAQCAtMTg5NSw3ICsxOTE2LDcgQEAKKyAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cycKKyAKKyAgIGoxMV9jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorLSAgICA8PDogKmoxMV9wYXJfZXhlY3V0b3IKKysgICAgPDw6ICpqMTFfbGFyZ2VfcGFyX2V4ZWN1dG9yCisgICAgIHN0ZXBzOgorICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorQEAgLTE5MTAsNyArMTkzMSw3IEBACisgICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicKKyAKKyAgIGoxMV9jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CistICAgIDw8OiAqajExX3Bhcl9leGVjdXRvcgorKyAgICA8PDogKmoxMV9sYXJnZV9wYXJfZXhlY3V0b3IKKyAgICAgc3RlcHM6CisgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCitAQCAtMTkyNSw3ICsxOTQ2LDcgQEAKKyAgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JworIAorICAgajExX2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorLSAgICA8PDogKmoxMV9wYXJfZXhlY3V0b3IKKysgICAgPDw6ICpqMTFfbGFyZ2VfcGFyX2V4ZWN1dG9yCisgICAgIHN0ZXBzOgorICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorQEAgLTE5NDMsNyArMTk2NCw3IEBACisgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JworIAorICAgajExX2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKy0gICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisrICAgIDw8OiAqajExX2xhcmdlX3Bhcl9leGVjdXRvcgorICAgICBzdGVwczoKKyAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKK0BAIC0xOTYxLDcgKzE5ODIsNyBAQAorICAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuMTEnCisgCisgICBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKy0gICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisrICAgIDw8OiAqajExX2xhcmdlX3Bhcl9leGVjdXRvcgorICAgICBzdGVwczoKKyAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKK0BAIC0xOTc5LDcgKzIwMDAsNyBAQAorICAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKyAKKyAgIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKy0gICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisrICAgIDw8OiAqajExX2xhcmdlX3Bhcl9leGVjdXRvcgorICAgICBzdGVwczoKKyAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKK0BAIC0xOTk3LDcgKzIwMTgsNyBAQAorICAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuMTEnCisgCisgICBqMTFfY3Fsc2hfZHRlc3RzX3B5MzoKKy0gICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisrICAgIDw8OiAqajExX2xhcmdlX3Bhcl9leGVjdXRvcgorICAgICBzdGVwczoKKyAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKK0BAIC0yMDEyLDcgKzIwMzMsNyBAQAorICAgICAgICAgICBleHRyYV9lbnZfYXJnczogJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYnCisgCisgICBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzg6CistICAgIDw8OiAqajExX3Bhcl9leGVjdXRvcgorKyAgICA8PDogKmoxMV9sYXJnZV9wYXJfZXhlY3V0b3IKKyAgICAgc3RlcHM6CisgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCitAQCAtMjAzMCw3ICsyMDUxLDcgQEAKKyAgICAgICAgICAgcHl0aG9uX3ZlcnNpb246ICczLjgnCisgCisgICBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExOgorLSAgICA8PDogKmoxMV9wYXJfZXhlY3V0b3IKKysgICAgPDw6ICpqMTFfbGFyZ2VfcGFyX2V4ZWN1dG9yCisgICAgIHN0ZXBzOgorICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorQEAgLTIwNDgsNyArMjA2OSw3IEBACisgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKKyAKKyAgIGoxN19jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorLSAgICA8PDogKmoxN19wYXJfZXhlY3V0b3IKKysgICAgPDw6ICpqMTdfbGFyZ2VfcGFyX2V4ZWN1dG9yCisgICAgIHN0ZXBzOgorICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorQEAgLTIwNjMsNyArMjA4NCw3IEBACisgICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicKKyAKKyAgIGoxN19jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CistICAgIDw8OiAqajE3X3Bhcl9leGVjdXRvcgorKyAgICA8PDogKmoxN19sYXJnZV9wYXJfZXhlY3V0b3IKKyAgICAgc3RlcHM6CisgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCitAQCAtMjA3OCw3ICsyMDk5LDcgQEAKKyAgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JworIAorICAgajE3X2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorLSAgICA8PDogKmoxN19wYXJfZXhlY3V0b3IKKysgICAgPDw6ICpqMTdfbGFyZ2VfcGFyX2V4ZWN1dG9yCisgICAgIHN0ZXBzOgorICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorQEAgLTIwOTYsNyArMjExNyw3IEBACisgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JworIAorICAgajE3X2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKy0gICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisrICAgIDw8OiAqajE3X2xhcmdlX3Bhcl9leGVjdXRvcgorICAgICBzdGVwczoKKyAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKK0BAIC0yMTE0LDcgKzIxMzUsNyBAQAorICAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuMTEnCisgCisgICBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKy0gICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisrICAgIDw8OiAqajE3X2xhcmdlX3Bhcl9leGVjdXRvcgorICAgICBzdGVwczoKKyAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKK0BAIC0yMTMyLDcgKzIxNTMsNyBAQAorICAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKyAKKyAgIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKy0gICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisrICAgIDw8OiAqajE3X2xhcmdlX3Bhcl9leGVjdXRvcgorICAgICBzdGVwczoKKyAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKK0BAIC0yMTUwLDcgKzIxNzEsNyBAQAorICAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuMTEnCisgCisgICBqMTdfY3Fsc2hfZHRlc3RzX3B5MzoKKy0gICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisrICAgIDw8OiAqajE3X2xhcmdlX3Bhcl9leGVjdXRvcgorICAgICBzdGVwczoKKyAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKK0BAIC0yMTY1LDcgKzIxODYsNyBAQAorICAgICAgICAgICBleHRyYV9lbnZfYXJnczogJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYnCisgCisgICBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzg6CistICAgIDw8OiAqajE3X3Bhcl9leGVjdXRvcgorKyAgICA8PDogKmoxN19sYXJnZV9wYXJfZXhlY3V0b3IKKyAgICAgc3RlcHM6CisgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCitAQCAtMjE4Myw3ICsyMjA0LDcgQEAKKyAgICAgICAgICAgcHl0aG9uX3ZlcnNpb246ICczLjgnCisgCisgICBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExOgorLSAgICA8PDogKmoxN19wYXJfZXhlY3V0b3IKKysgICAgPDw6ICpqMTdfbGFyZ2VfcGFyX2V4ZWN1dG9yCisgICAgIHN0ZXBzOgorICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorQEAgLTIyMDEsNyArMjIyMiw3IEBACisgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKKyAKKyAgIGoxMV9kdGVzdHNfbGFyZ2Vfdm5vZGU6CistICAgIDw8OiAqajExX3Bhcl9leGVjdXRvcgorKyAgICA8PDogKmoxMV9tZWRpdW1fcGFyX2V4ZWN1dG9yCisgICAgIHN0ZXBzOgorICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorQEAgLTIyMTUsNyArMjIzNiw3IEBACisgICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworIAorICAgajExX2R0ZXN0c19sYXJnZToKKy0gICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisrICAgIDw8OiAqajExX21lZGl1bV9wYXJfZXhlY3V0b3IKKyAgICAgc3RlcHM6CisgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCitAQCAtMjIyOSw3ICsyMjUwLDcgQEAKKyAgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworIAorICAgajE3X2R0ZXN0c19sYXJnZV92bm9kZToKKy0gICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisrICAgIDw8OiAqajE3X21lZGl1bV9wYXJfZXhlY3V0b3IKKyAgICAgc3RlcHM6CisgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCitAQCAtMjI0Myw3ICsyMjY0LDcgQEAKKyAgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgCisgICBqMTdfZHRlc3RzX2xhcmdlOgorLSAgICA8PDogKmoxN19wYXJfZXhlY3V0b3IKKysgICAgPDw6ICpqMTdfbWVkaXVtX3Bhcl9leGVjdXRvcgorICAgICBzdGVwczoKKyAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKZGlmZiAtLWdpdCBhLy5jaXJjbGVjaS9nZW5lcmF0ZS5zaCBiLy5jaXJjbGVjaS9nZW5lcmF0ZS5zaAppbmRleCAyOWY2NmEyLi5lNTQwZDZmIDEwMDc1NQotLS0gYS8uY2lyY2xlY2kvZ2VuZXJhdGUuc2gKKysrIGIvLmNpcmNsZWNpL2dlbmVyYXRlLnNoCkBAIC0xOCw3ICsxOCw3IEBACiAjCiAKIEJBU0VESVI9YGRpcm5hbWUgJDBgCi1CQVNFX0JSQU5DSD1jYXNzYW5kcmEtNC4xCitCQVNFX0JSQU5DSD10cnVuawogc2V0IC1lCiAKIGRpZSAoKQpAQCAtMjU4LDYgKzI1OCw4IEBACiAgICAgZGVsZXRlX2pvYiAiJDEiICJqMTFfdXRlc3RzX2NkY19yZXBlYXQiCiAgICAgZGVsZXRlX2pvYiAiJDEiICJqOF91dGVzdHNfY29tcHJlc3Npb25fcmVwZWF0IgogICAgIGRlbGV0ZV9qb2IgIiQxIiAiajExX3V0ZXN0c19jb21wcmVzc2lvbl9yZXBlYXQiCisgICAgZGVsZXRlX2pvYiAiJDEiICJqOF91dGVzdHNfdHJpZV9yZXBlYXQiCisgICAgZGVsZXRlX2pvYiAiJDEiICJqMTFfdXRlc3RzX3RyaWVfcmVwZWF0IgogICAgIGRlbGV0ZV9qb2IgIiQxIiAiajhfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlfcmVwZWF0IgogICAgIGRlbGV0ZV9qb2IgIiQxIiAiajExX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5X3JlcGVhdCIKICAgZmkKZGlmZiAtLWdpdCBhLy5jaXJjbGVjaS9nZW5lcmF0ZV8xMV9hbmRfMTcuc2ggYi8uY2lyY2xlY2kvZ2VuZXJhdGVfMTFfYW5kXzE3LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMwOTcyM2EKLS0tIC9kZXYvbnVsbAorKysgYi8uY2lyY2xlY2kvZ2VuZXJhdGVfMTFfYW5kXzE3LnNoCkBAIC0wLDAgKzEsMzA2IEBACisjIS9iaW4vc2gKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0JBU0VESVI9YGRpcm5hbWUgJDBgCitCQVNFX0JSQU5DSD10cnVuaworc2V0IC1lCisKK2RpZSAoKQoreworICBlY2hvICJFUlJPUjogJCoiCisgIHByaW50X2hlbHAKKyAgZXhpdCAxCit9CisKK3ByaW50X2hlbHAoKQoreworICBlY2hvICJVc2FnZTogJDAgWy1mfC1wfC1hfC1lfC1pXSIKKyAgZWNobyAiICAgLWEgR2VuZXJhdGUgdGhlIGNvbmZpZ18xMV9hbmRfMTcueW1sLCBjb25maWdfMTFfYW5kXzE3LnltbC5GUkVFIGFuZCBjb25maWdfMTFfYW5kXzE3LnltbC5QQUlEIGV4cGFuZGVkIGNvbmZpZ3VyYXRpb24iCisgIGVjaG8gIiAgICAgIGZpbGVzIGZyb20gdGhlIG1haW4gY29uZmlnX3RlbXBsYXRlLnltbCByZXVzYWJsZSBjb25maWd1cmF0aW9uIGZpbGUuIgorICBlY2hvICIgICAgICBVc2UgdGhpcyBmb3IgcGVybWFuZW50IGNoYW5nZXMgaW4gY29uZmlnXzExX2FuZF8xNy55bWwgdGhhdCB3aWxsIGJlIGNvbW1pdHRlZCB0byB0aGUgbWFpbiByZXBvLiIKKyAgZWNobyAiICAgLWYgR2VuZXJhdGUgY29uZmlnLnltbCBmb3IgdGVzdHMgY29tcGF0aWJsZSB3aXRoIHRoZSBDaXJjbGVDSSBmcmVlIHRpZXIgcmVzb3VyY2VzIgorICBlY2hvICIgICAtcCBHZW5lcmF0ZSBjb25maWcueW1sIGZvciB0ZXN0cyBjb21wYXRpYmxlIHdpdGggdGhlIENpcmNsZUNJIHBhaWQgdGllciByZXNvdXJjZXMiCisgIGVjaG8gIiAgIC1lIDxrZXk9dmFsdWU+IEVudmlyb25tZW50IHZhcmlhYmxlcyB0byBiZSB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgY29uZmlnXzExX2FuZF8xNy55bWwsIGUuZy46IgorICBlY2hvICIgICAgICAgICAgICAgICAgICAgLWUgRFRFU1RfQlJBTkNIPUNBU1NBTkRSQS04MjcyIgorICBlY2hvICIgICAgICAgICAgICAgICAgICAgLWUgRFRFU1RfUkVQTz1odHRwczovL2dpdGh1Yi5jb20vYWRlbGFwZW5hL2Nhc3NhbmRyYS1kdGVzdC5naXQiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgICAtZSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU9ZmFsc2UiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgICAtZSBSRVBFQVRFRF9VVEVTVFM9b3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5WaWV3VGVzdCN0ZXN0Q291bnRlcnNUYWJsZSIKKyAgZWNobyAiICAgICAgICAgICAgICAgICAgIC1lIFJFUEVBVEVEX1VURVNUU19DT1VOVD01MDAiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgICAtZSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTD1vcmcuYXBhY2hlLmNhc3NhbmRyYS5mcWx0b29sLkZRTENvbXBhcmVUZXN0IgorICBlY2hvICIgICAgICAgICAgICAgICAgICAgLWUgUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ9NTAwIgorICBlY2hvICIgICAgICAgICAgICAgICAgICAgLWUgUkVQRUFURURfVVRFU1RTX0xPTkc9b3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZ1N0cmVzc1Rlc3QiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgICAtZSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVD0xMDAiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgICAtZSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTPW9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVzcy5nZW5lcmF0ZS5EaXN0cmlidXRpb25HYXVzc2lhblRlc3QiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgICAtZSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UPTUwMCIKKyAgZWNobyAiICAgICAgICAgICAgICAgICAgIC1lIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM9b3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLnRlc3QuVHJpdmlhbFNpbXVsYXRpb25UZXN0IgorICBlY2hvICIgICAgICAgICAgICAgICAgICAgLWUgUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVD01MDAiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgICAtZSBSRVBFQVRFRF9KVk1fRFRFU1RTPW9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3QuUGFnaW5nVGVzdCIKKyAgZWNobyAiICAgICAgICAgICAgICAgICAgIC1lIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ9NTAwIgorICBlY2hvICIgICAgICAgICAgICAgICAgICAgLWUgUkVQRUFURURfRFRFU1RTPWNkY190ZXN0LnB5IGNxbHNoX3Rlc3RzL3Rlc3RfY3Fsc2gucHk6OlRlc3RDcWxzaFNtb2tlIgorICBlY2hvICIgICAgICAgICAgICAgICAgICAgLWUgUkVQRUFURURfRFRFU1RTX0NPVU5UPTUwMCIKKyAgZWNobyAiICAgICAgICAgICAgICAgICAgIC1lIFJFUEVBVEVEX0xBUkdFX0RURVNUUz1yZXBsYWNlX2FkZHJlc3NfdGVzdC5weTo6VGVzdFJlcGxhY2VBZGRyZXNzOjp0ZXN0X3JlcGxhY2Vfc3RvcHBlZF9ub2RlIgorICBlY2hvICIgICAgICAgICAgICAgICAgICAgLWUgUkVQRUFURURfTEFSR0VfRFRFU1RTPTEwMCIKKyAgZWNobyAiICAgICAgICAgICAgICAgICAgIC1lIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVD10ZXN0c29tZSIKKyAgZWNobyAiICAgICAgICAgICAgICAgICAgIC1lIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTPW9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVmlld1Rlc3QiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgICAtZSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTPXRlc3RDb21wb3VuZFBhcnRpdGlvbktleSx0ZXN0U3RhdGljVGFibGUiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgICAtZSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM9ZmFsc2UiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgICAtZSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVD01MDAiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgIEZvciB0aGUgY29tcGxldGUgbGlzdCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIHBsZWFzZSBjaGVjayB0aGUiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgIGxpc3Qgb2YgZXhhbXBsZXMgaW4gY29uZmlnX3RlbXBsYXRlXzExX2FuZF8xNy55bWwgYW5kL29yIHRoZSBkb2N1bWVudGF0aW9uLiIKKyAgZWNobyAiICAgICAgICAgICAgICAgICAgSWYgeW91IHdhbnQgdG8gc3BlY2lmeSBtdWx0aXBsZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc2ltcGx5IGFkZCIKKyAgZWNobyAiICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgLWUgb3B0aW9ucy4gVGhlIGZsYWdzIC1mLy1wIHNob3VsZCBiZSB1c2VkIHdoZW4gdXNpbmcgLWUuIgorICBlY2hvICIgICAtaSBJZ25vcmUgdW5rbm93biBlbnZpcm9ubWVudCB2YXJpYWJsZXMiCit9CisKK2FsbD1mYWxzZQorZnJlZT1mYWxzZQorcGFpZD1mYWxzZQorZW52X3ZhcnM9IiIKK2hhc19lbnZfdmFycz1mYWxzZQorY2hlY2tfZW52X3ZhcnM9dHJ1ZQord2hpbGUgZ2V0b3B0cyAiZTphZnBpIiBvcHQ7IGRvCisgIGNhc2UgJG9wdCBpbgorICAgICAgYSApIGFsbD10cnVlCisgICAgICAgICAgOzsKKyAgICAgIGYgKSBmcmVlPXRydWUKKyAgICAgICAgICA7OworICAgICAgcCApIHBhaWQ9dHJ1ZQorICAgICAgICAgIDs7CisgICAgICBlICkgaWYgKCEgKCRoYXNfZW52X3ZhcnMpKTsgdGhlbgorICAgICAgICAgICAgZW52X3ZhcnM9IiRPUFRBUkciCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZW52X3ZhcnM9IiRlbnZfdmFyc3wkT1BUQVJHIgorICAgICAgICAgIGZpCisgICAgICAgICAgaGFzX2Vudl92YXJzPXRydWUKKyAgICAgICAgICA7OworICAgICAgaSApIGNoZWNrX2Vudl92YXJzPWZhbHNlCisgICAgICAgICAgOzsKKyAgICAgIFw/KSBkaWUgIkludmFsaWQgb3B0aW9uOiAtJE9QVEFSRyIKKyAgICAgICAgICA7OworICBlc2FjCitkb25lCitzaGlmdCAkKChPUFRJTkQtMSkpCitpZiBbICIkIyIgLW5lIDAgXTsgdGhlbgorICAgIGRpZSAiVW5leHBlY3RlZCBhcmd1bWVudHMiCitmaQorCisjIHZhbGlkYXRlIGVudmlyb25tZW50IHZhcmlhYmxlcworaWYgJGhhc19lbnZfdmFycyAmJiAkY2hlY2tfZW52X3ZhcnM7IHRoZW4KKyAgZm9yIGVudHJ5IGluICQoZWNobyAkZW52X3ZhcnMgfCB0ciAifCIgIlxuIik7IGRvCisgICAga2V5PSQoZWNobyAkZW50cnkgfCB0ciAiPSIgIlxuIiB8IGhlYWQgLW4gMSkKKyAgICBpZiBbICIka2V5IiAhPSAiRFRFU1RfUkVQTyIgXSAmJgorICAgICAgIFsgIiRrZXkiICE9ICJEVEVTVF9CUkFOQ0giIF0gJiYKKyAgICAgICBbICIka2V5IiAhPSAiUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFIiBdICYmCisgICAgICAgWyAiJGtleSIgIT0gIlJFUEVBVEVEX1VURVNUUyIgXSAmJgorICAgICAgIFsgIiRrZXkiICE9ICJSRVBFQVRFRF9VVEVTVFNfQ09VTlQiIF0gJiYKKyAgICAgICBbICIka2V5IiAhPSAiUkVQRUFURURfVVRFU1RTX0ZRTFRPT0wiIF0gJiYKKyAgICAgICBbICIka2V5IiAhPSAiUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQiIF0gJiYKKyAgICAgICBbICIka2V5IiAhPSAiUkVQRUFURURfVVRFU1RTX0xPTkciIF0gJiYKKyAgICAgICBbICIka2V5IiAhPSAiUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQiIF0gJiYKKyAgICAgICBbICIka2V5IiAhPSAiUkVQRUFURURfVVRFU1RTX1NUUkVTUyIgXSAmJgorICAgICAgIFsgIiRrZXkiICE9ICJSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UIiBdICYmCisgICAgICAgWyAiJGtleSIgIT0gIlJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFMiIF0gJiYKKyAgICAgICBbICIka2V5IiAhPSAiUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVCIgXSAmJgorICAgICAgIFsgIiRrZXkiICE9ICJSRVBFQVRFRF9KVk1fRFRFU1RTIiBdICYmCisgICAgICAgWyAiJGtleSIgIT0gIlJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQiIF0gJiYKKyAgICAgICBbICIka2V5IiAhPSAiUkVQRUFURURfRFRFU1RTIiBdICYmCisgICAgICAgWyAiJGtleSIgIT0gIlJFUEVBVEVEX0RURVNUU19DT1VOVCIgXSAmJgorICAgICAgIFsgIiRrZXkiICE9ICJSRVBFQVRFRF9MQVJHRV9EVEVTVFMiIF0gJiYKKyAgICAgICBbICIka2V5IiAhPSAiUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UIiBdICYmCisgICAgICAgWyAiJGtleSIgIT0gIlJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVCIgXSAmJgorICAgICAgIFsgIiRrZXkiICE9ICJSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUyIgXSAmJgorICAgICAgIFsgIiRrZXkiICE9ICJSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTIiBdICYmCisgICAgICAgWyAiJGtleSIgIT0gIlJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUyIgXSAmJgorICAgICAgIFsgIiRrZXkiICE9ICJSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVCIgXTsgdGhlbgorICAgICAgZGllICJVbnJlY29nbmlzZWQgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZTogJGtleSIKKyAgICBmaQorICBkb25lCitmaQorCitpZiAkZnJlZTsgdGhlbgorICAoJGFsbCB8fCAkcGFpZCkgJiYgZGllICJDYW5ub3QgdXNlIG9wdGlvbiAtZiB3aXRoIG9wdGlvbnMgLWEgb3IgLXAiCisgIGVjaG8gIkdlbmVyYXRpbmcgbmV3IGNvbmZpZy55bWwgZmlsZSBmb3IgZnJlZSB0aWVyIGZyb20gY29uZmlnX3RlbXBsYXRlXzExX2FuZF8xNy55bWwiCisgIGNpcmNsZWNpIGNvbmZpZyBwcm9jZXNzICRCQVNFRElSL2NvbmZpZ190ZW1wbGF0ZV8xMV9hbmRfMTcueW1sID4gJEJBU0VESVIvY29uZmlnXzExX2FuZF8xNy55bWwuRlJFRS50bXAKKyAgY2F0ICRCQVNFRElSL2xpY2Vuc2UueW1sICRCQVNFRElSL2NvbmZpZ18xMV9hbmRfMTcueW1sLkZSRUUudG1wID4gJEJBU0VESVIvY29uZmlnLnltbAorICBjcCAkQkFTRURJUi9jb25maWcueW1sICRCQVNFRElSL2NvbmZpZ18xMV9hbmRfMTcueW1sCisgIHJtICRCQVNFRElSL2NvbmZpZ18xMV9hbmRfMTcueW1sLkZSRUUudG1wCisKK2VsaWYgJHBhaWQ7IHRoZW4KKyAgKCRhbGwgfHwgJGZyZWUpICYmIGRpZSAiQ2Fubm90IHVzZSBvcHRpb24gLXAgd2l0aCBvcHRpb25zIC1hIG9yIC1mIgorICBlY2hvICJHZW5lcmF0aW5nIG5ldyBjb25maWcueW1sIGZpbGUgZm9yIHBhaWQgdGllciBmcm9tIGNvbmZpZ190ZW1wbGF0ZV8xMV9hbmRfMTcueW1sIgorICBwYXRjaCAtbyAkQkFTRURJUi9jb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbC5QQUlEICRCQVNFRElSL2NvbmZpZ190ZW1wbGF0ZV8xMV9hbmRfMTcueW1sICRCQVNFRElSL2NvbmZpZ190ZW1wbGF0ZV8xMV9hbmRfMTcueW1sLlBBSUQucGF0Y2gKKyAgY2lyY2xlY2kgY29uZmlnIHByb2Nlc3MgJEJBU0VESVIvY29uZmlnX3RlbXBsYXRlXzExX2FuZF8xNy55bWwuUEFJRCA+ICRCQVNFRElSL2NvbmZpZ18xMV9hbmRfMTcueW1sLlBBSUQudG1wCisgIGNhdCAkQkFTRURJUi9saWNlbnNlLnltbCAkQkFTRURJUi9jb25maWdfMTFfYW5kXzE3LnltbC5QQUlELnRtcCA+ICRCQVNFRElSL2NvbmZpZy55bWwKKyAgY3AgJEJBU0VESVIvY29uZmlnLnltbCAkQkFTRURJUi9jb25maWdfMTFfYW5kXzE3LnltbAorICBybSAkQkFTRURJUi9jb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbC5QQUlEICRCQVNFRElSL2NvbmZpZ18xMV9hbmRfMTcueW1sLlBBSUQudG1wCisKK2VsaWYgJGFsbDsgdGhlbgorICAoJGZyZWUgfHwgJHBhaWQgfHwgJGhhc19lbnZfdmFycykgJiYgZGllICJDYW5ub3QgdXNlIG9wdGlvbiAtYSB3aXRoIG9wdGlvbnMgLWYsIC1wIG9yIC1lIgorICBlY2hvICJHZW5lcmF0aW5nIG5ldyBkZWZhdWx0IGNvbmZpZ18xMV9hbmRfMTcueW1sIGZpbGUgZm9yIGZyZWUgdGllciBhbmQgRlJFRS9QQUlEIHRlbXBsYXRlcyBmcm9tIGNvbmZpZ190ZW1wbGF0ZV8xMV9hbmRfMTcueW1sLiIKKyAgZWNobyAiTWFrZSBzdXJlIHlvdSBjb21taXQgdGhlIG5ld2x5IGdlbmVyYXRlZCBjb25maWdfMTFfYW5kXzE3LnltbCwgY29uZmlnXzExX2FuZF8xNy55bWwuRlJFRSBhbmQgY29uZmlnXzExX2FuZF8xNy55bWwuUEFJRCBmaWxlcyIKKyAgZWNobyAiYWZ0ZXIgcnVubmluZyB0aGlzIGNvbW1hbmQgaWYgeW91IHdhbnQgdGhlbSB0byBwZXJzaXN0LiIKKworICAjIHNldHVwIGNvbmZpZyBmb3IgZnJlZSB0aWVyCisgIGNpcmNsZWNpIGNvbmZpZyBwcm9jZXNzICRCQVNFRElSL2NvbmZpZ190ZW1wbGF0ZV8xMV9hbmRfMTcueW1sID4gJEJBU0VESVIvY29uZmlnXzExX2FuZF8xNy55bWwuRlJFRS50bXAKKyAgY2F0ICRCQVNFRElSL2xpY2Vuc2UueW1sICRCQVNFRElSL2NvbmZpZ18xMV9hbmRfMTcueW1sLkZSRUUudG1wID4gJEJBU0VESVIvY29uZmlnXzExX2FuZF8xNy55bWwuRlJFRQorICBybSAkQkFTRURJUi9jb25maWdfMTFfYW5kXzE3LnltbC5GUkVFLnRtcAorCisgICMgc2V0dXAgY29uZmlnIGZvciBwYWlkIHRpZXIKKyAgcGF0Y2ggLW8gJEJBU0VESVIvY29uZmlnX3RlbXBsYXRlXzExX2FuZF8xNy55bWwuUEFJRCAkQkFTRURJUi9jb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbCAkQkFTRURJUi9jb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbC5QQUlELnBhdGNoCisgIGNpcmNsZWNpIGNvbmZpZyBwcm9jZXNzICRCQVNFRElSL2NvbmZpZ190ZW1wbGF0ZV8xMV9hbmRfMTcueW1sLlBBSUQgPiAkQkFTRURJUi9jb25maWdfMTFfYW5kXzE3LnltbC5QQUlELnRtcAorICBjYXQgJEJBU0VESVIvbGljZW5zZS55bWwgJEJBU0VESVIvY29uZmlnXzExX2FuZF8xNy55bWwuUEFJRC50bXAgPiAkQkFTRURJUi9jb25maWdfMTFfYW5kXzE3LnltbC5QQUlECisgIHJtICRCQVNFRElSL2NvbmZpZ190ZW1wbGF0ZV8xMV9hbmRfMTcueW1sLlBBSUQgJEJBU0VESVIvY29uZmlnXzExX2FuZF8xNy55bWwuUEFJRC50bXAKKworICAjIGNvcHkgZnJlZSB0aWVyIGludG8gY29uZmlnXzExX2FuZF8xNy55bWwgdG8gbWFrZSBzdXJlIHRoaXMgZ2V0cyB1cGRhdGVkCisgIGNwICRCQVNFRElSL2NvbmZpZ18xMV9hbmRfMTcueW1sLkZSRUUgJEJBU0VESVIvY29uZmlnXzExX2FuZF8xNy55bWwKKworZWxpZiAoISAoJGhhc19lbnZfdmFycykpOyB0aGVuCisgIHByaW50X2hlbHAKKyAgZXhpdCAwCitmaQorCisjIGFkZCBuZXcgb3IgbW9kaWZpZWQgdGVzdHMgdG8gdGhlIHNldHMgb2YgdGVzdHMgdG8gYmUgcmVwZWF0ZWQKK2lmICghICgkYWxsKSk7IHRoZW4KKyAgYWRkX2RpZmZfdGVzdHMgKCkKKyAgeworICAgIGRpcj0iJHtCQVNFRElSfS8uLi8kezJ9IgorICAgIGRpZmY9JChnaXQgLS1uby1wYWdlciBkaWZmIC0tbmFtZS1vbmx5IC0tZGlmZi1maWx0ZXI9QU1SICR7QkFTRV9CUkFOQ0h9Li4uSEVBRCAke2Rpcn0pCisgICAgdGVzdHM9JCggZWNobyAiJGRpZmYiIFwKKyAgICAgICAgICAgfCBncmVwICJUZXN0XFwuamF2YSIgXAorICAgICAgICAgICB8IHNlZCAtZSAicy9cXC5qYXZhLy8iIFwKKyAgICAgICAgICAgfCBzZWQgLWUgInMsXiR7Mn0sLCIgXAorICAgICAgICAgICB8IHRyICAnLycgJy4nIFwKKyAgICAgICAgICAgfCBncmVwICR7M30gKVwKKyAgICAgICAgICAgfHwgOiAjIGF2b2lkIGV4ZWN1dGlvbiBpbnRlcnJ1cHRpb25zIGR1ZSB0byBncmVwIHJldHVybiBjb2RlcyBhbmQgc2V0IC1lCisgICAgZm9yIHRlc3QgaW4gJHRlc3RzOyBkbworICAgICAgZWNobyAiICAkdGVzdCIKKyAgICAgIGhhc19lbnZfdmFycz10cnVlCisgICAgICBpZiBlY2hvICIkZW52X3ZhcnMiIHwgZ3JlcCAtcSAiJHsxfT0iOyB0aGVuCisgICAgICAgIGVudl92YXJzPSQoZWNobyAiJGVudl92YXJzIiB8IHNlZCAtZSAicy8kezF9PS8kezF9PSR7dGVzdH0sLyIpCisgICAgICBlbGlmIFsgLXogIiRlbnZfdmFycyIgXTsgdGhlbgorICAgICAgICBlbnZfdmFycz0iJHsxfT0ke3Rlc3R9IgorICAgICAgZWxzZQorICAgICAgICBlbnZfdmFycz0iJGVudl92YXJzfCR7MX09JHt0ZXN0fSIKKyAgICAgIGZpCisgICAgZG9uZQorICB9CisKKyAgZWNobworICBlY2hvICJEZXRlY3RpbmcgbmV3IG9yIG1vZGlmaWVkIHRlc3RzIHdpdGggZ2l0IGRpZmYgLS1kaWZmLWZpbHRlcj1BTVIgJHtCQVNFX0JSQU5DSH0uLi5IRUFEOiIKKyAgYWRkX2RpZmZfdGVzdHMgIlJFUEVBVEVEX1VURVNUUyIgInRlc3QvdW5pdC8iICJvcmcuYXBhY2hlLmNhc3NhbmRyYSIKKyAgYWRkX2RpZmZfdGVzdHMgIlJFUEVBVEVEX1VURVNUU19MT05HIiAidGVzdC9sb25nLyIgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhIgorICBhZGRfZGlmZl90ZXN0cyAiUkVQRUFURURfVVRFU1RTX1NUUkVTUyIgInRvb2xzL3N0cmVzcy90ZXN0L3VuaXQvIiAib3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZXNzIgorICBhZGRfZGlmZl90ZXN0cyAiUkVQRUFURURfVVRFU1RTX0ZRTFRPT0wiICJ0b29scy9mcWx0b29sL3Rlc3QvdW5pdC8iICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5mcWx0b29sIgorICBhZGRfZGlmZl90ZXN0cyAiUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUyIgInRlc3Qvc2ltdWxhdG9yL3Rlc3QvIiAib3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLnRlc3QiCisgIGFkZF9kaWZmX3Rlc3RzICJSRVBFQVRFRF9KVk1fRFRFU1RTIiAidGVzdC9kaXN0cmlidXRlZC8iICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0IgorZmkKKworIyByZXBsYWNlIGVudmlyb25tZW50IHZhcmlhYmxlcworaWYgJGhhc19lbnZfdmFyczsgdGhlbgorICBlY2hvCisgIGVjaG8gIlNldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzOiIKKyAgSUZTPSc9JworICBlY2hvICIkZW52X3ZhcnMiIHwgdHIgJ3wnICdcbicgfCB3aGlsZSByZWFkIGVudHJ5OyBkbworICAgIHNldCAtLSAkZW50cnkKKyAgICBrZXk9JDEKKyAgICB2YWw9JDIKKyAgICBlY2hvICIgICRrZXk6ICR2YWwiCisgICAgc2VkIC1pLmJhayAic3wtICRrZXk6Lip8LSAka2V5OiAkdmFsfCIgJEJBU0VESVIvY29uZmlnLnltbAorICAgIGNwICRCQVNFRElSL2NvbmZpZy55bWwgJEJBU0VESVIvY29uZmlnXzExX2FuZF8xNy55bWwKKyAgZG9uZQorICB1bnNldCBJRlMKK2ZpCisKKyMgRGVmaW5lIGZ1bmN0aW9uIHRvIHJlbW92ZSB1bm5lZWRlZCBqb2JzLgorIyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGZpbGUgbmFtZSwgYW5kIHRoZSBzZWNvbmQgYXJndWVtbnQgaXMgdGhlIGpvYiBuYW1lLgorZGVsZXRlX2pvYigpCit7CisgIGRlbGV0ZV95YW1sX2Jsb2NrKCkKKyAgeworICAgIHNlZCAtRWkuYmFrICIvXiAgICAtICR7Mn0vLC9eICAgIFteWzpzcGFjZTpdXSt8XiAgW15bOnNwYWNlOl1dKy97Ly8hZDt9IiAiJDEiCisgICAgc2VkIC1FaS5iYWsgIi9eICAgIC0gJHsyfS9kIiAiJDEiCisgIH0KKyAgZmlsZT0iJEJBU0VESVIvJDEiCisgIGRlbGV0ZV95YW1sX2Jsb2NrICIkZmlsZSIgIiR7Mn0iCisgIGRlbGV0ZV95YW1sX2Jsb2NrICIkZmlsZSIgInN0YXJ0XyR7Mn0iCit9CisKKyMgRGVmaW5lIGZ1bmN0aW9uIHRvIHJlbW92ZSBhbnkgdW5uZWVkZWQgcmVwZWF0ZWQgam9icy4KKyMgVGhlIGZpcnN0IGFuZCBvbmx5IGFyZ3VtZW50IGlzIHRoZSBmaWxlIG5hbWUuCitkZWxldGVfcmVwZWF0ZWRfam9icygpCit7CisgIGlmICghIChlY2hvICIkZW52X3ZhcnMiIHwgZ3JlcCAtcSAiUkVQRUFURURfVVRFU1RTPSIgKSk7IHRoZW4KKyAgICBkZWxldGVfam9iICIkMSIgImoxMV91bml0X3Rlc3RzX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxN191bml0X3Rlc3RzX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxMV91dGVzdHNfY2RjX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxN191dGVzdHNfY2RjX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxMV91dGVzdHNfY29tcHJlc3Npb25fcmVwZWF0IgorICAgIGRlbGV0ZV9qb2IgIiQxIiAiajE3X3V0ZXN0c19jb21wcmVzc2lvbl9yZXBlYXQiCisgICAgZGVsZXRlX2pvYiAiJDEiICJqMTFfdXRlc3RzX3RyaWVfcmVwZWF0IgorICAgIGRlbGV0ZV9qb2IgIiQxIiAiajE3X3V0ZXN0c190cmllX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxMV91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeV9yZXBlYXQiCisgICAgZGVsZXRlX2pvYiAiJDEiICJqMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlfcmVwZWF0IgorICBmaQorICBpZiAoISAoZWNobyAiJGVudl92YXJzIiB8IGdyZXAgLXEgIlJFUEVBVEVEX1VURVNUU19MT05HPSIpKTsgdGhlbgorICAgIGRlbGV0ZV9qb2IgIiQxIiAiajExX3V0ZXN0c19sb25nX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxN191dGVzdHNfbG9uZ19yZXBlYXQiCisgIGZpCisgIGlmICghIChlY2hvICIkZW52X3ZhcnMiIHwgZ3JlcCAtcSAiUkVQRUFURURfVVRFU1RTX1NUUkVTUz0iKSk7IHRoZW4KKyAgICBkZWxldGVfam9iICIkMSIgImoxMV91dGVzdHNfc3RyZXNzX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxN191dGVzdHNfc3RyZXNzX3JlcGVhdCIKKyAgZmkKKyAgaWYgKCEgKGVjaG8gIiRlbnZfdmFycyIgfCBncmVwIC1xICJSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTD0iKSk7IHRoZW4KKyAgICBkZWxldGVfam9iICIkMSIgImoxMV91dGVzdHNfZnFsdG9vbF9yZXBlYXQiCisgICAgZGVsZXRlX2pvYiAiJDEiICJqMTdfdXRlc3RzX2ZxbHRvb2xfcmVwZWF0IgorICBmaQorICBpZiAoISAoZWNobyAiJGVudl92YXJzIiB8IGdyZXAgLXEgIlJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM9IikpOyB0aGVuCisgICAgZGVsZXRlX2pvYiAiJDEiICJqMTFfc2ltdWxhdG9yX2R0ZXN0c19yZXBlYXQiCisgIGZpCisgIGlmICghIChlY2hvICIkZW52X3ZhcnMiIHwgZ3JlcCAtcSAiUkVQRUFURURfSlZNX0RURVNUUz0iKSk7IHRoZW4KKyAgICBkZWxldGVfam9iICIkMSIgImoxMV9qdm1fZHRlc3RzX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxMV9qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxN19qdm1fZHRlc3RzX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxN19qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdCIKKyAgZmkKKyAgaWYgKCEgKGVjaG8gIiRlbnZfdmFycyIgfCBncmVwIC1xICJSRVBFQVRFRF9EVEVTVFM9IikpOyB0aGVuCisgICAgZGVsZXRlX2pvYiAiJDEiICJqMTFfZHRlc3RzX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxMV9kdGVzdHNfdm5vZGVfcmVwZWF0IgorICAgIGRlbGV0ZV9qb2IgIiQxIiAiajExX2R0ZXN0c19vZmZoZWFwX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxN19kdGVzdHNfcmVwZWF0IgorICAgIGRlbGV0ZV9qb2IgIiQxIiAiajE3X2R0ZXN0c192bm9kZV9yZXBlYXQiCisgICAgZGVsZXRlX2pvYiAiJDEiICJqMTdfZHRlc3RzX29mZmhlYXBfcmVwZWF0IgorICBmaQorICBpZiAoISAoZWNobyAiJGVudl92YXJzIiB8IGdyZXAgLXEgIlJFUEVBVEVEX0xBUkdFX0RURVNUUz0iKSk7IHRoZW4KKyAgICBkZWxldGVfam9iICIkMSIgImoxMV9kdGVzdHNfbGFyZ2VfcmVwZWF0IgorICAgIGRlbGV0ZV9qb2IgIiQxIiAiajExX2R0ZXN0c19sYXJnZV92bm9kZV9yZXBlYXQiCisgICAgZGVsZXRlX2pvYiAiJDEiICJqMTdfZHRlc3RzX2xhcmdlX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxN19kdGVzdHNfbGFyZ2Vfdm5vZGVfcmVwZWF0IgorICBmaQorICBpZiAoISAoZWNobyAiJGVudl92YXJzIiB8IGdyZXAgLXEgIlJFUEVBVEVEX0FOVF9URVNUX0NMQVNTPSIpKTsgdGhlbgorICAgIGRlbGV0ZV9qb2IgIiQxIiAiajExX3JlcGVhdGVkX2FudF90ZXN0IgorICAgIGRlbGV0ZV9qb2IgIiQxIiAiajE3X3JlcGVhdGVkX2FudF90ZXN0IgorICBmaQorfQorCitkZWxldGVfcmVwZWF0ZWRfam9icyAiY29uZmlnLnltbCIKK2RlbGV0ZV9yZXBlYXRlZF9qb2JzICJjb25maWdfMTFfYW5kXzE3LnltbCIKK2lmICRhbGw7IHRoZW4KKyAgZGVsZXRlX3JlcGVhdGVkX2pvYnMgImNvbmZpZ18xMV9hbmRfMTcueW1sLkZSRUUiCisgIGRlbGV0ZV9yZXBlYXRlZF9qb2JzICJjb25maWdfMTFfYW5kXzE3LnltbC5QQUlEIgorZmkKZGlmZiAtLWdpdCBhLy5jaXJjbGVjaS9yZWFkbWUubWQgYi8uY2lyY2xlY2kvcmVhZG1lLm1kCmluZGV4IGQ1Mzg5ZjYuLmNkNmE3MzYgMTAwNjQ0Ci0tLSBhLy5jaXJjbGVjaS9yZWFkbWUubWQKKysrIGIvLmNpcmNsZWNpL3JlYWRtZS5tZApAQCAtMjMsMTIgKzIzLDE4IEBACiBUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBmb3IgQ2lyY2xlQ0kgY29udGlub3VzIGludGVncmF0aW9uIHBsYXRmb3JtLgogVGhlIGZpbGUgYGNvbmZpZy55bWxgIGlzIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgdGhhdCBpcyByZWFkIGJ5IENpcmNsZUNJLiBUaGlzIGZpbGUgaXMKIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBgZ2VuZXJhdGUuc2hgIHNjcmlwdCBmcm9tIHRoZSBgY29uZmlnX3RlbXBsYXRlLnltbGAgZmlsZS4KK0V4cGVyaW1lbnRhbCBKREsxNyBjb25maWd1cmF0aW9uIGlzIGFkZGVkIGZvciB0ZXN0IHB1cnBvc2VzIHRvIGVuYWJsZSBlYXNpZXIgdGVzdGluZword2hpbGUgd29ya2luZyBvbiBKREsxNyByZWxhdGVkIGlzc3Vlcy4gVGhlIGZpbGUgYGNvbmZpZ18xMV9hbmRfMTcueW1sYCBpcyB0aGUgY29uZmlndXJhdGlvbgorZmlsZSB0aGF0IHdlIGNhbiBjb3B5IG92ZXIgYGNvbmZpZy55bWxgIHRvIHRlc3QgSkRLMTErMTcgd29ya2Zsb3dzLiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseQorZ2VuZXJhdGVkIGJ5IHRoZSBgZ2VuZXJhdGVfMTFfYW5kXzE3LnNoYCBzY3JpcHQgZnJvbSB0aGUgYGNvbmZpZ190ZW1wbGF0ZV8xMV9hbmRfMTcueW1sYCBmaWxlLgogCiBUaGUgcHJvdmlkZWQgYGNvbmZpZy55bWxgIGZpbGUgdXNlcyBsb3cgcmVzb3VyY2VzIHNvIHVzZXJzIG9mIHRoZSBDaXJjbGVDSSBmcmVlIHRpZXIgY2FuCiB1c2UgaXQuIEFkZGl0aW9uYWxseSwgdGhlcmUgYXJlIHR3byB2ZXJzaW9ucyBvZiB0aGlzIGZpbGUgdXNpbmcgZGlmZmVyZW50IHJlc291cmNlcyBzbwogdXNlcnMgd2hvIGhhdmUgYWNjZXNzIHRvIHByZW1pdW0gQ2lyY2xlQ0kgcmVzb3VyY2VzIGNhbiB1c2UgbGFyZ2VyIGluc3RhbmNlcyBhbmQgbW9yZQogcGFyYWxsZWxpc20uIFRoZXNlIGZpbGVzIGFyZSBgY29uZmlnLnltbC5GUkVFYCBhbmQgYGNvbmZpZy55bWwuUEFJRGAuCiBUaGUgZGVmYXVsdCBgY29uZmlnLnltbGAgZmlsZSBpcyBqdXN0IGEgY29weSBvZiBgY29uZmlnLnltbC5GUkVFYC4KK0ZvciB0aGUgSkRLMTErMTcgd29ya2Zsb3dzIHdlIGhhdmUgZXF1aXZhbGVudCBmaWxlcyAtIGBjb25maWdfMTFfYW5kXzE3LnltbC5GUkVFYCBhbmQgCitgY29uZmlnXzExX2FuZF8xNy55bWwuUEFJRGAuCiAKICMjIFN3aXRjaGluZyB0byBoaWdoZXIgcmVzb3VyY2Ugc2V0dGluZ3MKIFRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGdlbmVyYXRlZCBmaWxlcyBmb3IgZnJlZSBhbmQgcGFpZCByZXNvdXJjZSBzZXR0aW5ncy4KQEAgLTM3LDI5ICs0Myw0MSBAQAogCiBgY3AgLmNpcmNsZWNpL2NvbmZpZy55bWwuUEFJRCAuY2lyY2xlY2kvY29uZmlnLnltbGAKIAorcmVzcGVjdGl2ZWx5IGZvciBKREsxMSsxNzoKKworYGNwIC5jaXJjbGVjaS9jb25maWdfMTFfYW5kXzE3LnltbC5QQUlEIC5jaXJjbGVjaS9jb25maWcueW1sYAorCiBBbmQgZm9yIHVzaW5nIGxvd2VyIHJlc291cmNlcyBjb21hcHRpYmxlIHdpdGggQ2lyY2xlQ0kncyBmcmVlIHRpZXI6CiAKIGBjcCAuY2lyY2xlY2kvY29uZmlnLnltbC5GUkVFIC5jaXJjbGVjaS9jb25maWcueW1sYAogCityZXNwZWN0aXZlbHkgZm9yIEpESzExKzE3OgorCitgY3AgLmNpcmNsZWNpL2NvbmZpZ18xMV9hbmRfMTcueW1sLkZSRUUgLmNpcmNsZWNpL2NvbmZpZy55bWxgCisKIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gcnVuIHRoZSBgZ2VuZXJhdGUuc2hgIHNjcmlwdCB3aXRoIHRoZSBmbGFncyBgLWZgL2AtcGAKIHRvIHJlZ2VuZXJhdGUgdGhlIGBjb25maWcueW1sYCBmaWxlIGZyb20gYGNvbmZpZ190ZW1wbGF0ZS55bWxgIHVzaW5nIGZyZWUgb3IgcGFpZCByZXNvdXJjZXMuCi1UaGlzIHNjcmlwdCB2YWxpZGF0ZXMgYW5kIGFwcGxpZXMgYW55IGNoYW5nZXMgdG8gdGhlIGBjb25maWdfdGVtcGxhdGUueW1sYCBmaWxlLCBhbmQgaXQKLXJlcXVpcmVzIHRoZSBbQ2lyY2xlQ0kgQ0xJXShodHRwczovL2NpcmNsZWNpLmNvbS9kb2NzLzIuMC9sb2NhbC1jbGkvI2luc3RhbGwpIHRvIGJlCi1pbnN0YWxsZWQuCitGb3IgSkRLMTEgYW5kIDE3IHlvdSBjYW4gcnVuIHRoZSBgZ2VuZXJhdGVfMTFfYW5kXzE3LnNoYCBzY3JpcHQgd2l0aCB0aGUgZmxhZ3MKK2AtZmAvYC1wYCB0byByZWdlbmVyYXRlIHRoZSBgY29uZmlnLnltbGAgZmlsZSBmcm9tIGBjb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbGAKK3VzaW5nIGZyZWUgb3IgcGFpZCByZXNvdXJjZXMuIFRoZSB0d28gc2NyaXB0cyB2YWxpZGF0ZSBhbmQgYXBwbHkgYW55IGNoYW5nZXMgdG8gdGhlIAorYGNvbmZpZ190ZW1wbGF0ZS55bWxgYW5kIGBjb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbGAgZmlsZXMsIGFuZCB0aGV5IHJlcXVpcmUgdGhlCitbQ2lyY2xlQ0kgQ0xJXShodHRwczovL2NpcmNsZWNpLmNvbS9kb2NzLzIuMC9sb2NhbC1jbGkvI2luc3RhbGwpIHRvIGJlIGluc3RhbGxlZC4KIAogIyMgU2V0dGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMKIEJvdGggYGNvbmZpZ190ZW1wbGF0ZS55bWxgIGFuZCBgY29uZmlnLnltbGAgZmlsZXMgY29udGFpbiBhIHNldCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMKIGRlZmluaW5nIHRoaW5ncyBsaWtlIHdoYXQgZHRlc3QgcmVwbyBhbmQgYnJhbmNoIHRvIHVzZSwgd2hhdCB0ZXN0cyBjb3VsZCBiZSByZXBlYXRlZGx5Ci1ydW4sIGV0Yy4KK3J1biwgZXRjLiBTYW1lIGFwcGxpZXMgZm9yIGBjb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbGAgYW5kIGBjb25maWdfMTFfYW5kXzE3LnltbGAuCiAKIFRoZXNlIGVudmlyb25tZW50IHZhcmlhYmxlcyBjYW4gYmUgZGlyZWN0bHkgZWRpdGVkIGluIHRoZSBgY29uZmlnLnltbGAgZmlsZSwgYWx0aG91Z2ggaWYKIHlvdSBkbyB0aGlzIHlvdSBzaG91bGQgdGFrZSBpbnRvIGFjY291bnQgdGhhdCB0aGUgZW50aXJlIHNldCBvZiBlbnYgdmFycyBpcyByZXBlYXRlZCBvbgogZXZlcnkgam9iLgogCi1BIHByb2JhYmx5IGJldHRlciBhcHByb2FjaCBpcyBlZGl0aW5nIHRoZW0gaW4gYGNvbmZpZ190ZW1wbGF0ZS55bWxgIGFuZCB0aGVuIHJlZ2VuZXJhdGUgdGhlCi1gY29uZmlnLnltbGAgZmlsZSB1c2luZyB0aGUgYGdlbmVyYXRlLnNoYCBzY3JpcHQuIFlvdSBjYW4gYWxzbyBkaXJlY3RseSBwYXNzIGVudmlyb25tZW50Ci12YXJpYWJsZSB2YWx1ZXMgdG8gdGhlIGBnZW5lcmF0ZS5zaGAgc2NyaXB0IHdpdGggdGhlIGAtZWAgZmxhZy4gRm9yIGV4YW1wbGUsIHRvIHNldCB0aGUKLWR0ZXN0IHJlcG8gYW5kIGJyYW5jaCB3aXRoIE1JRFJFUyBjb25maWcgeW91IGNhbiBydW46CitBIHByb2JhYmx5IGJldHRlciBhcHByb2FjaCBpcyBlZGl0aW5nIHRoZW0gaW4gYGNvbmZpZ190ZW1wbGF0ZS55bWxgIG9yIHJlc3BlY3RpdmVseSAKK2Bjb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbGAgYW5kIHRoZW4gcmVnZW5lcmF0ZSB0aGUgYGNvbmZpZy55bWxgIGFuZCBgY29uZmlnXzExX2FuZF8xNy55bWxgCitmaWxlcyB1c2luZyB0aGUgYGdlbmVyYXRlLnNoYCBvciByZXNwZWN0aXZlbHkgdGhlIGBnZW5lcmF0ZV8xMV9hbmRfMTcueW1sYCBzY3JpcHQuIFlvdSBjYW4gYWxzbyAKK2RpcmVjdGx5IHBhc3MgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWVzIHRvIHRoZSBgZ2VuZXJhdGUuc2hgIGFuZCBgZ2VuZXJhdGVfMTFfYW5kXzE3LnNoYCBzY3JpcHRzCit3aXRoIHRoZSBgLWVgIGZsYWcuIEZvciBleGFtcGxlLCB0byBzZXQgdGhlIGR0ZXN0IHJlcG8gYW5kIGJyYW5jaCB3aXRoIFBBSUQgY29uZmlnIAoreW91IGNhbiBydW46CiAKIGBgYAogZ2VuZXJhdGUuc2ggLXAgXApAQCAtNjksMTAgKzg3LDEwIEBACiBgYGAKIAogIyMgUnVubmluZyB0ZXN0cyBpbiBhIGxvb3AKLVJ1bm5pbmcgdGhlIGBnZW5lcmF0ZS5zaGAgc2NyaXB0IHdpdGggdXNlIGBnaXQgZGlmZmAgdG8gZmluZCB0aGUgbmV3IG9yIG1vZGlmaWVkIHRlc3RzLgotVGhlIHNjcmlwdCB3aWxsIHRoZW4gY3JlYXRlIGpvYnMgdG8gcnVuIGVhY2ggb2YgdGhlc2UgbmV3IG9yIG1vZGlmaWVkIHRlc3RzIGZvciBhIGNlcnRhaW4KLW51bWJlciBvZiB0aW1lcywgdG8gdmVyaWZ5IHRoYXQgdGhleSBhcmUgc3RhYmxlLiBZb3UgY2FuIHVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8KLXNwZWNpZnkgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIG9mIGVhY2ggdHlwZSBvZiB0ZXN0OgorUnVubmluZyB0aGUgYGdlbmVyYXRlLnNoYCBvciBgZ2VuZXJhdGVfMTFfYW5kXzE3LnNoYCBzY3JpcHQgd2lsbCB1c2UgYGdpdCBkaWZmYCB0byBmaW5kIHRoZSAKK25ldyBvciBtb2RpZmllZCB0ZXN0cy4gVGhlIHNjcmlwdHMgd2lsbCB0aGVuIGNyZWF0ZSBqb2JzIHRvIHJ1biBlYWNoIG9mIHRoZXNlIG5ldyBvciBtb2RpZmllZCAKK3Rlc3RzIGZvciBhIGNlcnRhaW4gbnVtYmVyIG9mIHRpbWVzLCB0byB2ZXJpZnkgdGhhdCB0aGV5IGFyZSBzdGFibGUuIFlvdSBjYW4gdXNlIGVudmlyb25tZW50IAordmFyaWFibGVzIHRvIHNwZWNpZnkgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIG9mIGVhY2ggdHlwZSBvZiB0ZXN0OgogYGBgCiBnZW5lcmF0ZS5zaCAtcCBcCiAgIC1lIFJFUEVBVEVEX1VURVNUU19DT1VOVD01MDAgXApAQCAtMTU3LDE2ICsxNzUsMTggQEAKIHJlZ2VuZXJhdGUgdGhlIGBjb25maWcueW1sYCwgYGNvbmZpZy55bWwuRlJFRWAgYW5kIGBjb25maWcueW1sLlBBSURgCiBmaWxlcyBieSBydW5uaW5pbmcgdGhlIGBnZW5lcmF0ZS5zaGAgc2NyaXB0IHdpdGggYC1hYCBmbGFnLiBGb3IgdXNpbmcgdGhpcyBzY3JpcHQgeW91CiBuZWVkIHRvIGluc3RhbGwgdGhlIFtDaXJjbGVDSSBDTEldKGh0dHBzOi8vY2lyY2xlY2kuY29tL2RvY3MvMi4wL2xvY2FsLWNsaS8jaW5zdGFsbCkuCitTYW1lIGFwcGxpZXMgZm9yIHRoZSBlcXVpdmFsZW50IEpESzExKzE3IGNvbmZpZyBmaWxlcyBhbmQgYGdlbmVyYXRlXzExX2FuZF8xNy5zaGAuCiAKIEFzIGZvciB0ZW1wb3JhbCBjaGFuZ2VzIGRvbmUgd2hpbGUgd29ya2luZyBpbiBhIHBhdGNoLCBzdWNoIGFzIHBvaW50aW5nIHRvIHlvdSBkdGVzdCByZXBvIG9yCiBydW5uaW5nIGEgdGVzdCByZXBlYXRlZGx5LCB5b3UgY2FuIGVpdGhlciBkaXJlY3RseSBlZGl0IGBjb25maWcueW1sYCBvciBlZGl0IGBjb25maWdfdGVtcGxhdGUueW1sYAogYW5kIHRoZW4gcmVnZW5lcmF0ZSBgY29uZmlnLnltbGAgd2l0aCB0aGUgYGdlbmVyYXRlLnNoYCBzY3JpcHQgdXNpbmcgYSBgLWZgL2AtcGAgZmxhZy4KLVdoZW4gdGhpcyBmbGFnIGlzIHVzZWQgb25seSB0aGUgYGNvbmZpZy55bWxgIHdpbGwgYmUgZ2VuZXJhdGVkLgorV2hlbiB0aGlzIGZsYWcgaXMgdXNlZCBvbmx5IHRoZSBgY29uZmlnLnltbGAgd2lsbCBiZSBnZW5lcmF0ZWQuIFNhbWUgd29ya2Zsb3cgYXBwbGllcyB0byB0aGUgcmVzcGVjdGl2ZQorSkRLMTErMTcgQ2lyY2xlQ0kgY29uZmlndXJhdGlvbiBmaWxlcy4KIAogUGxlYXNlIG5vdGUgdGhhdCBhbnkgcHJldmlvdXMgc3dhcHBpbmcgb3IgZWRpdGlvbiBvZiB0aGUgZ2VuZXJhdGVkIGZpbGVzIHdpbGwgYmUgb3ZlcnJpZGVuCi1ieSBydW5uaW5nIGBnZW5lcmF0ZS5zaGAgd2l0aCBgLWFgIGFyZ3VtZW50LCByZXR1cm5pbmcgYGNvbmZpZy55bWxgIHRvIHRoZSBkZWZhdWx0IEZSRUUuIFNvIGlmCi15b3UgcHJldmlvdXNseSBzd2FwcGVkIHlvdXIgYGNvbmZpZy55bWxgIHRvIE1JRFJFUyB5b3Ugd291bGQgbmVlZCB0byBlaXRoZXIgc3dhcCBpdAotYWdhaW4gb3IgdXNlIHRoZSBgLWZgL2AtcGAgc2NyaXB0IGZsYWdzLgorYnkgcnVubmluZyBgZ2VuZXJhdGUuc2hgL2BnZW5lcmF0ZV8xMV9hbmRfMTcuc2hgIHdpdGggYC1hYCBhcmd1bWVudCwgcmV0dXJuaW5nIGBjb25maWcueW1sYCAKK3RvIHRoZSBkZWZhdWx0IEZSRUUuIFNvIGlmIHlvdSBwcmV2aW91c2x5IHN3YXBwZWQgeW91ciBgY29uZmlnLnltbGAgdG8gUEFJRCB5b3Ugd291bGQgbmVlZCB0bworZWl0aGVyIHN3YXAgaXQgYWdhaW4gb3IgdXNlIHRoZSBgLWZgL2AtcGAgc2NyaXB0IGZsYWdzLgogCiBSZWFkIGJlbG93IGZvciBkZXRhaWxzIGhvdyB0byBnZW5lcmF0ZSB0aGUgZmlsZXMgbWFudWFsbHkgd2l0aG91dCB0aGUgYGdlbmVyYXRlLnNoYCBzY3JpcHQ6CiAKQEAgLTE4OCwzICsyMDgsNSBAQAogNy4gYWRkIHRoZSBBcGFjaGUgbGljZW5zZSBoZWFkZXIgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgUEFJRCBmaWxlOgogICAgYGNhdCBsaWNlbnNlLnltbCBjb25maWcueW1sLlBBSUQgPiBjb25maWcueW1sLlBBSUQubmV3ICYmIG12IGNvbmZpZy55bWwuUEFJRC5uZXcgY29uZmlnLnltbC5QQUlEYAogOC4gZmluYWxseSwgcmVtZW1iZXIgdG8gdXBkYXRlIHRoZSBjb25maWcueW1sCisKK1RoZSBwcm9jZXNzIGlzIGVxdWl2YWxlbnQgZm9yIGBnZW5lcmF0ZV8xMV9hbmRfMTcuc2hgIGFuZCB0aGUgcmVzcGVjdGl2ZSBKREsxMSsxNyBjb25maWd1cmF0aW9uIGZpbGVzLgpkaWZmIC0tZ2l0IGEvLmdpdGh1Yi9wdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQgYi8uZ2l0aHViL3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmNkMjE2Ci0tLSAvZGV2L251bGwKKysrIGIvLmdpdGh1Yi9wdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQKQEAgLTAsMCArMSwyNSBAQAorVGhhbmtzIGZvciBzZW5kaW5nIGEgcHVsbCByZXF1ZXN0ISBIZXJlIGFyZSBzb21lIHRpcHMgaWYgeW91J3JlIG5ldyBoZXJlOgorIAorICogRW5zdXJlIHlvdSBoYXZlIGFkZGVkIG9yIHJ1biB0aGUgW2FwcHJvcHJpYXRlIHRlc3RzXShodHRwczovL2Nhc3NhbmRyYS5hcGFjaGUub3JnL18vZGV2ZWxvcG1lbnQvdGVzdGluZy5odG1sKSBmb3IgeW91ciBQUi4KKyAqIEJlIHN1cmUgdG8ga2VlcCB0aGUgUFIgZGVzY3JpcHRpb24gdXBkYXRlZCB0byByZWZsZWN0IGFsbCBjaGFuZ2VzLgorICogV3JpdGUgeW91ciBQUiB0aXRsZSB0byBzdW1tYXJpemUgd2hhdCB0aGlzIFBSIHByb3Bvc2VzLgorICogSWYgcG9zc2libGUsIHByb3ZpZGUgYSBjb25jaXNlIGV4YW1wbGUgdG8gcmVwcm9kdWNlIHRoZSBpc3N1ZSBmb3IgYSBmYXN0ZXIgcmV2aWV3LgorICogUmVhZCBvdXIgW2NvbnRyaWJ1dG9yIGd1aWRlbGluZXNdKGh0dHBzOi8vY2Fzc2FuZHJhLmFwYWNoZS5vcmcvXy9kZXZlbG9wbWVudC9pbmRleC5odG1sKQorICogSWYgeW91J3JlIG1ha2luZyBhIGRvY3VtZW50YXRpb24gY2hhbmdlLCBzZWUgb3VyIFtndWlkZSB0byBkb2N1bWVudGF0aW9uIGNvbnRyaWJ1dGlvbl0oaHR0cHM6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZy9fL2RldmVsb3BtZW50L2RvY3VtZW50YXRpb24uaHRtbCkKKyAKK0NvbW1pdCBtZXNzYWdlcyBzaG91bGQgZm9sbG93IHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorCitgYGAKKzxPbmUgc2VudGVuY2UgZGVzY3JpcHRpb24sIHVzdWFsbHkgSmlyYSB0aXRsZSBvciBDSEFOR0VTLnR4dCBzdW1tYXJ5PgorCis8T3B0aW9uYWwgbGVuZ3RoaWVyIGRlc2NyaXB0aW9uIChjb250ZXh0IG9uIHBhdGNoKT4KKworcGF0Y2ggYnkgPEF1dGhvcnM+OyByZXZpZXdlZCBieSA8UmV2aWV3ZXJzPiBmb3IgQ0FTU0FORFJBLSMjIyMjCisKK0NvLWF1dGhvcmVkLWJ5OiBOYW1lMSA8ZW1haWwxPgorQ28tYXV0aG9yZWQtYnk6IE5hbWUyIDxlbWFpbDI+CisKK2BgYAorCitUaGUgW0Nhc3NhbmRyYSBKaXJhXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvcHJvamVjdHMvQ0FTU0FORFJBL2lzc3Vlcy8pCisKZGlmZiAtLWdpdCBhL0NIQU5HRVMudHh0IGIvQ0hBTkdFUy50eHQKaW5kZXggMjQ2YmE1OC4uOTlhNTM0MCAxMDA2NDQKLS0tIGEvQ0hBTkdFUy50eHQKKysrIGIvQ0hBTkdFUy50eHQKQEAgLTEsMTAgKzEsMTU4IEBACi00LjEuMworNS4wCisgKiBQcmludCBoZWFkZXIgYW5kIHN0YXRpc3RpY3MgZm9yIGNhc3NhbmRyYS1zdHJlc3Mgb3V0cHV0IHdpdGggYXJiaXRyYXJ5IGZyZXF1ZW5jeSAoQ0FTU0FORFJBLTEyOTcyKQorICogQ0VQLTI1OiBUcmllLWluZGV4ZWQgU1NUYWJsZSBmb3JtYXQgKENBU1NBTkRSQS0xODM5OCkKKyAqIE1ha2UgY2Fzc2FuZHJhLXN0cmVzcyBhYmxlIHRvIHJlYWQgYWxsIGNyZWRlbnRpYWxzIGZyb20gYSBmaWxlIChDQVNTQU5EUkEtMTg1NDQpCisgKiBBZGQgZ3VhcmRyYWlsIGZvciBwYXJ0aXRpb24gc2l6ZSBhbmQgZGVwcmVjYXRlIGNvbXBhY3Rpb25fbGFyZ2VfcGFydGl0aW9uX3dhcm5pbmdfdGhyZXNob2xkIChDQVNTQU5EUkEtMTg1MDApCisgKiBBZGQgSElTVE9SWSBjb21tYW5kIGZvciBDUUxTSCAoQ0FTU0FORFJBLTE1MDQ2KQorICogRml4IHNzdGFibGUgZm9ybWF0cyBjb25maWd1cmF0aW9uIChDQVNTQU5EUkEtMTg0NDEpCisgKiBBZGQgZ3VhcmRyYWlsIHRvIGJvdW5kIHRpbWVzdGFtcHMgKENBU1NBTkRSQS0xODM1MikKKyAqIEFkZCBrZXlzcGFjZV9uYW1lIGNvbHVtbiB0byBzeXN0ZW1fdmlld3MuY2xpZW50cyAoQ0FTU0FORFJBLTE4NTI1KQorICogTW92ZWQgc3lzdGVtIHByb3BlcnRpZXMgYW5kIGVudnMgdG8gQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzIGFuZCBDYXNzYW5kcmFSZWxldmFudEVudiByZXNwZWN0aXZlbHkgKENBU1NBTkRSQS0xNzc5NykKKyAqIEFkZCBzc3RhYmxlcGFydGl0aW9ucyBvZmZsaW5lIHRvb2wgdG8gZmluZCBsYXJnZSBwYXJ0aXRpb25zIGluIHNzdGFibGVzIChDQVNTQU5EUkEtODcyMCkKKyAqIFJlcGxhY2UgdXNhZ2VzIG9mIGpzb24tc2ltcGxlIGRlcGVuZGVuY3kgYnkgSmFja3NvbiAoQ0FTU0FORFJBLTE2ODU1KQorICogV2hlbiBkZWNvbW1pc3Npb25pbmcgc2hvdWxkIHNldCBTZXZlcml0eSB0byBsaW1pdCB0cmFmZmljIChDQVNTQU5EUkEtMTg0MzApCisgKiBGb3IgSmF2YTExIGFuZCBKYXZhMTcgcmVtb3ZlIC1YWDotVXNlQmlhc2VkTG9ja2luZyBhcyBpdCBpcyB0aGUgZGVmYXVsdCBhbHJlYWR5IChDQVNTQU5EUkEtMTc4NjkpCisgKiBVcGdyYWRlIGNvbW1vbnMtaW8gdG8gMi4xMS4wIChDQVNTQU5EUkEtMTczNjQpCisgKiBOb2RlIERyYWluaW5nIFNob3VsZCBBYm9ydCBBbGwgQ3VycmVudCBTU1RhYmxlcyBJbXBvcnRzIChDQVNTQU5EUkEtMTgzNzMpCisgKiBVc2Ugc25ha2UgY2FzZSBmb3IgdGhlIG5hbWVzIG9mIENRTCBuYXRpdmUgZnVuY3Rpb25zIChDQVNTQU5EUkEtMTgwMzcpCisgKiBVc2UgamRrLWRlcGVuZGVudCBjaGVja3N0eWxlIHZlcnNpb24gdG8gY2hlY2sgdGhlIHNvdXJjZSBjb2RlIChDQVNTQU5EUkEtMTgyNjIpCisgKiBQcm92aWRlIHN1bW1hcnkgb2YgZmFpbGVkIFNlc3Npb25JbmZvJ3MgaW4gU3RyZWFtUmVzdWx0RnV0dXJlIChDQVNTQU5EUkEtMTcxOTkpCisgKiBDRVAtMjA6IER5bmFtaWMgRGF0YSBNYXNraW5nIChDQVNTQU5EUkEtMTc5NDApCisgKiBBZGQgc3lzdGVtX3ZpZXdzLnNuYXBzaG90cyB2aXJ0dWFsIHRhYmxlIChDQVNTQU5EUkEtMTgxMDIpCisgKiBVcGRhdGUgT3BlbkhGVCBkZXBlbmRlbmNpZXMgKGNocm9uaWNsZS1xdWV1ZSwgY2hyb25pY2xlLWNvcmUsIGNocm9uaWNsZS1ieXRlcywgY2hyb25pY2xlLXdpcmUsIGNocm9uaWNsZS10aHJlYWRzKSAoQ0FTU0FORFJBLTE4MDQ5KQorICogUmVtb3ZlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcCBjb2RlIChDQVNTQU5EUkEtMTgzMjMpCisgKiBSZW1vdmUgZGVwcmVjYXRlZCBDUUwgZnVuY3Rpb25zIGRhdGVPZiBhbmQgdW5peFRpbWVzdGFtcE9mIChDQVNTQU5EUkEtMTgzMjgpCisgKiBSZW1vdmUgRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSAoQ0FTU0FORFJBLTE4MDQzKQorICogQWRkIHN5c3RlbV92aWV3cy5tYXhfc3N0YWJsZV9zaXplIGFuZCBzeXN0ZW1fdmlld3MubWF4X3NzdGFibGVfZHVyYXRpb24gdGFibGVzIChDQVNTQU5EUkEtMTgzMzMpCisgKiBFeHRlbmQgaW1wbGljaXQgYWxsb3ctZmlsdGVyaW5nIGZvciB2aXJ0dWFsIHRhYmxlcyB0byBjbHVzdGVyaW5nIGNvbHVtbnMgKENBU1NBTkRSQS0xODMzMSkKKyAqIFVwZ3JhZGUgbWF2ZW4tc2hhZGUtcGx1Z2luIHRvIDMuNC4xIHRvIGZpeCBzaGFkZWQgZHRlc3QgSkFSIGJ1aWxkIChDQVNTQU5EUkEtMTgxMzYpCisgKiBVcGdyYWRlIHRvIE9wY29kZXMuQVNNOSAoQ0FTU0FORFJBLTE3OTcxKQorICogQWRkIE1heFNTVGFibGVTaXplIGFuZCBNYXhTU1RhYmxlRHVyYXRpb24gbWV0cmljcyBhbmQgcHJvcGFnYXRlIHRoZW0gdG9nZXRoZXIgd2l0aCBsb2NhbCByZWFkL3dyaXRlIHJhdGlvIHRvIHRhYmxlc3RhdHMgKENBU1NBTkRSQS0xODI4MykKKyAqIEFkZCBtb3JlIGxvZ2dpbmcgYXJvdW5kIENvbXBhY3Rpb25NYW5hZ2VyIG9wZXJhdGlvbnMgKENBU1NBTkRSQS0xODI2OCkKKyAqIFJlZHVjZSBtZW1vcnkgYWxsb2NhdGlvbnMgb2YgY2FsbHMgdG8gQnl0ZUJ1ZmVyLmR1cGxpY2F0ZSgpIG1hZGUgaW4gb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LkNCVXRpbCN3cml0ZVZhbHVlIChDQVNTQU5EUkEtMTgyMTIpCisgKiBDRVAtMTc6IFNTVGFibGUgQVBJIChDQVNTQU5EUkEtMTcwNTYpCisgKiBHb3NzaXAgc3RhdGVNYXBPcmRlcmluZyBkb2VzIG5vdCBoYXZlIGNvcnJlY3Qgb3JkZXJpbmcgd2hlbiBib3RoIEVuZHBvaW50U3RhdGUgYXJlIGluIHRoZSBib290c3RyYXBwaW5nIHNldCAoQ0FTU0FORFJBLTE4MjkyKQorICogU25hcHNob3Qgb25seSBzc3RhYmxlcyBjb250YWluaW5nIG1pc21hdGNoaW5nIHJhbmdlcyBvbiBwcmV2aWV3IHJlcGFpciBtaXNtYXRjaCAoQ0FTU0FORFJBLTE3NTYxKQorICogTW9yZSBhY2N1cmF0ZSBza2lwcGluZyBvZiBzc3RhYmxlcyBpbiByZWFkIHBhdGggKENBU1NBTkRSQS0xODEzNCkKKyAqIFByZXBhcmUgZm9yIEpESzE3IGV4cGVyaW1lbnRhbCBzdXBwb3J0IChDQVNTQU5EUkEtMTgxNzksIENBU1NBTkRSQS0xODI1OCkKKyAqIFJlbW92ZSBTY3JpcHRlZCBVREZzIGludGVybmFsczsgaG9va3MgdG8gYmUgYWRkZWQgbGF0ZXIgaW4gQ0FTU0FORFJBLTE3MjgxIChDQVNTQU5EUkEtMTgyNTIpCisgKiBVcGRhdGUgSk5BIHRvIDUuMTMuMCAoQ0FTU0FORFJBLTE4MDUwKQorICogTWFrZSB2aXJ0dWFsIHRhYmxlcyBkZWNpZGUgaWYgdGhleSBpbXBsaWNpdGx5IGVuYWJsZSBBTExPVyBGSUxURVJJTkcgKENBU1NBTkRSQS0xODIzOCkKKyAqIEFkZCByb3csIHRvbWJzdG9uZSwgYW5kIHNzdGFibGUgY291bnQgdG8gbm9kZXRvb2wgcHJvZmlsZWxvYWQgKENBU1NBTkRSQS0xODAyMikKKyAqIENvb3JkaW5hdG9yIGxldmVsIG1ldHJpY3MgZm9yIHJlYWQgcmVzcG9uc2UgYW5kIG11dGF0aW9uIHJvdyBhbmQgY29sdW1uIGNvdW50cyAoQ0FTU0FORFJBLTE4MTU1KQorICogQWRkIENRTCBmdW5jdGlvbnMgZm9yIGR5bmFtaWMgZGF0YSBtYXNraW5nIChDQVNTQU5EUkEtMTc5NDEpCisgKiBQcmludCBmcmllbmRseSBlcnJvciB3aGVuIG5vZGV0b29sIGF0dGVtcHRzIHRvIGNvbm5lY3QgdG8gdW5pbml0aWFsaXplZCBzZXJ2ZXIgKENBU1NBTkRSQS0xMTUzNykKKyAqIFVzZSBHMUdDIGJ5IGRlZmF1bHQsIGFuZCB1cGRhdGUgZGVmYXVsdCBHMUdDIHNldHRpbmdzIChDQVNTQU5EUkEtMTgwMjcpCisgKiBTaW1wbGVTZWVkUHJvdmlkZXIgY2FuIHJlc29sdmUgbXVsdGlwbGUgSVAgYWRkcmVzc2VzIHBlciBETlMgcmVjb3JkIChDQVNTQU5EUkEtMTQzNjEpCisgKiBSZW1vdmUgbW9ja2luZyBpbiBJbnRlcm5hbE5vZGVQcm9iZSBzcHlpbmcgb24gU3RvcmFnZVNlcnZpY2VNQmVhbiAoQ0FTU0FORFJBLTE4MTUyKQorICogQWRkIGNvbXBhY3Rpb25fcHJvcGVydGllcyBjb2x1bW4gdG8gc3lzdGVtLmNvbXBhY3Rpb25faGlzdG9yeSB0YWJsZSBhbmQgbm9kZXRvb2wgY29tcGFjdGlvbmhpc3RvcnkgY29tbWFuZCAoQ0FTU0FORFJBLTE4MDYxKQorICogUmVtb3ZlIFByb3RvY29sVmVyc2lvbiBlbnRpcmVseSBmcm9tIHRoZSBDb2xsZWN0aW9uU2VyaWFsaXplciBlY29zeXN0ZW0gKENBU1NBTkRSQS0xODExNCkKKyAqIEZpeCBzZXJpYWxpemF0aW9uIGVycm9yIGluIG5ldyBnZXRzc3RhYmxlcyAtLXNob3ctbGV2ZWxzIG9wdGlvbiAoQ0FTU0FORFJBLTE4MTQwKQorICogVXNlIGNoZWNrZWQgY2FzdHMgd2hlbiByZWFkaW5nIHZpbnRzIGFzIGludHMgKENBU1NBTkRSQS0xODA5OSkKKyAqIEFkZCBNdXRhdGlvbiBTZXJpYWxpemF0aW9uIENhY2hpbmcgKENBU1NBTkRSQS0xNzk5OCkKKyAqIE9ubHkgcmVsb2FkIGNvbXBhY3Rpb24gc3RyYXRlZ2llcyBpZiBkaXNrIGJvdW5kYXJpZXMgY2hhbmdlIChDQVNTQU5EUkEtMTc4NzQpCisgKiBDRVAtMTA6IFNpbXVsYXRvciBKYXZhMTEgU3VwcG9ydCAoQ0FTU0FORFJBLTE3MTc4KQorICogU2V0IHRoZSBtYWpvciBjb21wYWN0aW9uIHR5cGUgY29ycmVjdGx5IGZvciBjb21wYWN0aW9uc3RhdHMgKENBU1NBTkRSQS0xODA1NSkKKyAqIFByaW50IGV4Y2VwdGlvbiBtZXNzYWdlIHdpdGhvdXQgc3RhY2t0cmFjZSB3aGVuIG5vZGV0b29sIGNvbW1hbmRzIGZhaWwgb24gcHJvYmUuZ2V0T3duZXJzaGlwV2l0aFBvcnQoKSAoQ0FTU0FORFJBLTE4MDc5KQorICogQWRkIG9wdGlvbiB0byBwcmludCBsZXZlbCBpbiBub2RldG9vbCBnZXRzc3RhYmxlcyBvdXRwdXQgKENBU1NBTkRSQS0xODAyMykKKyAqIEltcGxlbWVudCBhIGd1YXJkcmFpbCBmb3Igbm90IGhhdmluZyB6ZXJvIGRlZmF1bHRfdGltZV90b19saXZlIG9uIHRhYmxlcyB3aXRoIFRXQ1MgKENBU1NBTkRSQS0xODA0MikKKyAqIEFkZCBDUUwgc2NhbGFyIGZ1bmN0aW9ucyBmb3IgY29sbGVjdGlvbiBhZ2dyZWdhdGlvbiAoQ0FTU0FORFJBLTE4MDYwKQorICogTWFrZSBjYXNzYW5kcmEucmVwbGF5TGlzdCBwcm9wZXJ0eSBmb3IgQ29tbWl0TG9nUmVwbGF5ZXIgcG9zc2libGUgdG8gcmVhY3Qgb24ga2V5c3BhY2VzIG9ubHkgKENBU1NBTkRSQS0xODA0NCkKKyAqIEFkZCBNYXRoZW1hdGljYWwgZnVuY3Rpb25zIChDQVNTQU5EUkEtMTcyMjEpCisgKiBNYWtlIGluY3JlbWVudGFsIGJhY2t1cCBjb25maWd1cmFibGUgcGVyIHRhYmxlIChDQVNTQU5EUkEtMTU0MDIpCisgKiBDaGFuZ2Ugc2hlYmFuZ3Mgb2YgUHl0aG9uIHNjcmlwdHMgdG8gcmVzb2x2ZSBQeXRob24gMyBmcm9tIGVudiBjb21tYW5kIChDQVNTQU5EUkEtMTc4MzIpCisgKiBBZGQgcmVhc29ucyB0byBndWFyZHJhaWwgbWVzc2FnZXMgYW5kIGNvbnNpZGVyIGd1YXJkcmFpbHMgaW4gdGhlIGVycm9yIG1lc3NhZ2UgZm9yIG5lZWRlZCBBTExPVyBGSUxURVJJTkcgKENBU1NBTkRSQS0xNzk2NykKKyAqIEFkZCBzdXBwb3J0IGZvciBDUUwgZnVuY3Rpb25zIG9uIGNvbGxlY3Rpb25zLCB0dXBsZXMgYW5kIFVEVHMgKENBU1NBTkRSQS0xNzgxMSkKKyAqIEFkZCBmbGFnIHRvIGV4Y2x1ZGUgbm9kZXMgZnJvbSBsb2NhbCBEQyB3aGVuIHJ1bm5pbmcgbm9kZXRvb2wgcmVidWlsZCAoQ0FTU0FORFJBLTE3ODcwKQorICogQWRkaW5nIGVuZHBvaW50IHZlcmlmaWNhdGlvbiBvcHRpb24gdG8gY2xpZW50X2VuY3J5cHRpb25fb3B0aW9ucyAoQ0FTU0FORFJBLTE4MDM0KQorICogUmVwbGFjZSAnd2N3aWR0aC5weScgd2l0aCBweXBpIG1vZHVsZSAoQ0FTU0FORFJBLTE3Mjg3KQorICogQWRkIG5vZGV0b29sIGZvcmNlY29tcGFjdCB0byByZW1vdmUgdG9tYnN0b25lZCBvciB0dGwnZCBkYXRhIGlnbm9yaW5nIEdDIGdyYWNlIGZvciBnaXZlbiB0YWJsZSBhbmQgcGFydGl0aW9uIGtleXMgKENBU1NBTkRSQS0xNzcxMSkKKyAqIE9mZmVyIElGIChOT1QpIEVYSVNUUyBpbiBjcWxzaCBjb21wbGV0aW9uIGZvciBDUkVBVEUgVFlQRSwgRFJPUCBUWVBFLCBDUkVBVEUgUk9MRSBhbmQgRFJPUCBST0xFIChDQVNTQU5EUkEtMTY2NDApCisgKiBOb2RldG9vbCBib290c3RyYXAgcmVzdW1lIHdpbGwgbm93IHJldHVybiBhbiBlcnJvciBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzIChDQVNTQU5EUkEtMTY0OTEpCisgKiBEaXNhYmxlIHJlc3VtYWJsZSBib290c3RyYXAgYnkgZGVmYXVsdCAoQ0FTU0FORFJBLTE3Njc5KQorICogSW5jbHVkZSBHaXQgU0hBIGluIC0tdmVyYm9zZSBmbGFnIGZvciBub2RldG9vbCB2ZXJzaW9uIChDQVNTQU5EUkEtMTc3NTMpCisgKiBVcGRhdGUgQnl0ZW1hbiB0byA0LjAuMjAgYW5kIEphY29jbyB0byAwLjguOCAoQ0FTU0FORFJBLTE2NDEzKQorICogQWRkIG1lbXRhYmxlIG9wdGlvbiBhbW9uZyBwb3NzaWJsZSB0YWIgY29tcGxldGlvbnMgZm9yIGEgdGFibGUgKENBU1NBTkRSQS0xNzk4MikKKyAqIEFkZHMgYSB0cmllLWJhc2VkIG1lbXRhYmxlIGltcGxlbWVudGF0aW9uIChDQVNTQU5EUkEtMTcyNDApCisgKiBGdXJ0aGVyIGltcHJvdmVzIHByZWNpc2lvbiBvZiBtZW10YWJsZSBoZWFwIHRyYWNraW5nIChDQVNTQU5EUkEtMTcyNDApCisgKiBGaXggZm9ybWF0dGluZyBvZiBtZXRyaWNzIGRvY3VtZW50YXRpb24gKENBU1NBTkRSQS0xNzk2MSkKKyAqIEtlZXAgc3N0YWJsZSBsZXZlbCB3aGVuIHN0cmVhbWluZyBmb3IgZGVjb21taXNzaW9uIGFuZCBtb3ZlIChDQVNTQU5EUkEtMTc5NjkpCisgKiBBZGQgVW5hdmFpbGFibGVzIG1ldHJpYyBmb3IgQ0FTV3JpdGUgaW4gdGhlIGRvY3MgKENBU1NBTkRSQS0xNjM1NykKKyAqIE1ha2UgQ2Fzc2FuZHJhIGxvZ3MgYWJsZSB0byBiZSB2aWV3ZWQgaW4gdGhlIHZpcnR1YWwgdGFibGUgc3lzdGVtX3ZpZXdzLnN5c3RlbV9sb2dzIChDQVNTQU5EUkEtMTc5NDYpCisgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gR29zc2lwZXIjb3JkZXIgZHVlIHRvIGNvbmN1cnJlbnQgbXV0YXRpb25zIHRvIGVsZW1lbnRzIGJlaW5nIGFwcGxpZWQgKENBU1NBTkRSQS0xNzkwOCkKKyAqIEluY2x1ZGUgZXN0aW1hdGVkIGFjdGl2ZSBjb21wYWN0aW9uIHJlbWFpbmluZyB3cml0ZSBzaXplIHdoZW4gc3RhcnRpbmcgYSBuZXcgY29tcGFjdGlvbiAoQ0FTU0FORFJBLTE3OTMxKQorICogTWl4ZWQgbW9kZSBzdXBwb3J0IGZvciBpbnRlcm5vZGUgYXV0aGVudGljYXRpb24gZHVyaW5nIFRMUyB1cGdyYWRlcyAoQ0FTU0FORFJBLTE3OTIzKQorICogUmV2ZXJ0IE1vY2tpdG8gZG93bmdyYWRlIGZyb20gQ0FTU0FORFJBLTE3NzUwIChDQVNTQU5EUkEtMTc0OTYpCisgKiBBZGQgLS1vbGRlci10aGFuIGFuZCAtLW9sZGVyLXRoYW4tdGltZXN0YW1wIG9wdGlvbnMgZm9yIG5vZGV0b29sIGNsZWFyc25hcHNob3RzIChDQVNTQU5EUkEtMTY4NjApCisgKiBGaXggIm9wZW4gUlQgYm91bmQgYXMgaXRzIGxhc3QgaXRlbSIgZXhjZXB0aW9uIChDQVNTQU5EUkEtMTc4MTApCisgKiBGaXggbGVhayBvZiBub24tc3RhbmRhcmQgSmF2YSB0eXBlcyBpbiBKTVggTUJlYW5zIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjp0eXBlPVN0b3JhZ2VTZXJ2aWNlYAorICAgYW5kIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjp0eXBlPVJlcGFpclNlcnZpY2VgIGFzIGNsaWVudHMgdXNpbmcgSk1YIGNhbm5vdCBoYW5kbGUgdGhlbS4gTW9yZSBkZXRhaWxzIGluIE5FV1MudHh0IChDQVNTQU5EUkEtMTc2NjgpCisgKiBEZXByZWNhdGUgVGhyb3dhYmxlcy5wcm9wYWdhdGUgdXNhZ2UgKENBU1NBTkRSQS0xNDIxOCkKKyAqIEFsbG93IGRpc2FibGluZyBob3RuZXNzIHBlcnNpc3RlbmNlIGZvciBoaWdoIHNzdGFibGUgY291bnRzIChDQVNTQU5EUkEtMTc4NjgpCisgKiBQcmV2ZW50IE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gY2hhbmdpbmcgbmV2ZXJQdXJnZVRvbWJzdG9uZXMgZnJvbSB0cnVlIHRvIGZhbHNlIChDQVNTQU5EUkEtMTc4OTcpCisgKiBBZGQgbWV0cmljcyBhcm91bmQgc3RvcmFnZSB1c2FnZSBhbmQgY29tcHJlc3Npb24gKENBU1NBTkRSQS0xNzg5OCkKKyAqIFJlbW92ZSB1c2FnZSBvZiBkZXByZWNhdGVkIGphdmF4IGNlcnRpZmljYXRlIGNsYXNzZXMgKENBU1NBTkRSQS0xNzg2NykKKyAqIE1ha2Ugc3VyZSBwcmV2aWV3IHJlcGFpcnMgZG9uJ3Qgb3B0aW1pc2Ugc3RyZWFtcyB1bmxlc3MgY29uZmlndXJlZCB0byAoQ0FTU0FORFJBLTE3ODY1KQorICogT3B0aW9uYWxseSBhdm9pZCBoaW50IHRyYW5zZmVyIGR1cmluZyBkZWNvbW1pc3Npb24gKENBU1NBTkRSQS0xNzgwOCkKKyAqIE1ha2UgZGlzYWJsaW5nIGF1dG8gc25hcHNob3Qgb24gc2VsZWN0ZWQgdGFibGVzIHBvc3NpYmxlIChDQVNTQU5EUkEtMTAzODMpCisgKiBJbnRyb2R1Y2UgY29tcGFjdGlvbiBwcmlvcml0aWVzIHRvIHByZXZlbnQgdXBncmFkZSBjb21wYWN0aW9uIGluYWJpbGl0eSB0byBmaW5pc2ggKENBU1NBTkRSQS0xNzg1MSkKKyAqIFByZXZlbnQgYSB1c2VyIGZyb20gbWFudWFsbHkgcmVtb3ZpbmcgZXBoZW1lcmFsIHNuYXBzaG90cyAoQ0FTU0FORFJBLTE3NzU3KQorICogUmVtb3ZlIGRlcGVuZGVuY3kgb24gTWF2ZW4gQW50IFRhc2tzIChDQVNTQU5EUkEtMTc3NTApCisgKiBVcGRhdGUgQVNNKDkuMSB0byA5LjMpLCBNb2NraXRvKDEuMTAuMTAgdG8gMS4xMi4xMykgYW5kIEJ5dGVCdWRkeSgzLjIuNCB0byA0LjcuMCkgKENBU1NBTkRSQS0xNzgzNSkKKyAqIEFkZCB0aGUgYWJpbGl0eSBmb3Igb3BlcmF0b3JzIHRvIGxvb3NlbiB0aGUgZGVmaW5pdGlvbiBvZiAiZW1wdHkiIGZvciBlZGdlIGNhc2VzIChDQVNTQU5EUkEtMTc4NDIpCisgKiBGaXggcG90ZW50aWFsIG91dCBvZiByYW5nZSBleGNlcHRpb24gb24gY29sdW1uIGluZGV4IGRvd25zYW1wbGluZyAoQ0FTU0FORFJBLTE3ODM5KQorICogSW50cm9kdWNlIHRhcmdldCBkaXJlY3RvcnkgdG8gdnRhYmxlIG91dHB1dCBmb3Igc3N0YWJsZV90YXNrcyBhbmQgZm9yIGNvbXBhY3Rpb25zdGF0cyAoQ0FTU0FORFJBLTEzMDEwKQorICogUmVhZC9Xcml0ZS9UcnVuY2F0ZSB0aHJvdyBSZXF1ZXN0RmFpbHVyZSBpbiBhIHJhY2UgY29uZGl0aW9uIHdpdGggY2FsbGJhY2sgdGltZW91dHMsIHNob3VsZCByZXR1cm4gVGltZW91dCBpbnN0ZWFkIChDQVNTQU5EUkEtMTc4MjgpCisgKiBBZGQgYWJpbGl0eSB0byBsb2cgbG9hZCBwcm9maWxlcyBhdCBmaXhlZCBpbnRlcnZhbHMgKENBU1NBTkRSQS0xNzgyMSkKKyAqIFByb3RlY3QgYWdhaW5zdCBHb3NzaXAgYmFja2luZyB1cCBkdWUgdG8gYSBxdWFyYW50aW5lZCBlbmRwb2ludCB3aXRob3V0IHZlcnNpb24gaW5mb3JtYXRpb24gKENBU1NBTkRSQS0xNzgzMCkKKyAqIE5QRSBpbiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkF0dHJpYnV0ZXMuZ2V0VGltZVRvTGl2ZSAoQ0FTU0FORFJBLTE3ODIyKQorICogQWRkIGd1YXJkcmFpbCBmb3IgY29sdW1uIHNpemUgKENBU1NBTkRSQS0xNzE1MSkKKyAqIFdoZW4gZG9pbmcgYSBob3N0IHJlcGxhY2VtZW50LCB3ZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIG5vZGUgaXMgYSBsaXZlIG5vZGUgYmVmb3JlIGZhaWxpbmcgd2l0aCAiQ2Fubm90IHJlcGxhY2UgYSBsaXZlIG5vZGUuLi4iIChDQVNTQU5EUkEtMTc4MDUpCisgKiBBZGQgc3VwcG9ydCB0byBnZW5lcmF0ZSBhIE9uZS1TaG90IGhlYXAgZHVtcCBvbiB1bmhhbmRsZWQgZXhjZXB0aW9ucyAoQ0FTU0FORFJBLTE3Nzk1KQorICogUmF0ZS1saW1pdCBuZXcgY2xpZW50IGNvbm5lY3Rpb24gYXV0aCBzZXR1cCB0byBhdm9pZCBvdmVyd2hlbG1pbmcgYmNyeXB0IChDQVNTQU5EUkEtMTc4MTIpCisgKiBEYXRhT3V0cHV0QnVmZmVyI3NjcmF0Y2hCdWZmZXIgY2FuIHVzZSBvZmYtaGVhcCBvciBvbi1oZWFwIG1lbW9yeSBhcyBhIG1lYW5zIHRvIGNvbnRyb2wgbWVtb3J5IGFsbG9jYXRpb25zIChDQVNTQU5EUkEtMTY0NzEpCisgKiBBZGQgYWJpbGl0eSB0byByZWFkIHRoZSBUVExzIGFuZCB3cml0ZSB0aW1lcyBvZiB0aGUgZWxlbWVudHMgb2YgYSBjb2xsZWN0aW9uIGFuZC9vciBVRFQgKENBU1NBTkRSQS04ODc3KQorICogUmVtb3ZlZCBQeXRob24gPCAyLjcgc3VwcG9ydCBmcm9tIGZvcm1hdHRpbmcucHkgKENBU1NBTkRSQS0xNzY5NCkKKyAqIENsZWFudXAgcHlsaW50IGlzc3VlcyB3aXRoIHB5bGV4b3Ryb24ucHkgKENBU1NBTkRSQS0xNzc3OSkKKyAqIE5QRSBidWcgaW4gc3RyZWFtaW5nIGNoZWNraW5nIGlmIFNTVGFibGUgaXMgYmVpbmcgcmVwYWlyZWQgKENBU1NBTkRSQS0xNzgwMSkKKyAqIFVzZXJzIG9mIE5hdGl2ZUxpYnJhcnkgc2hvdWxkIGhhbmRsZSBsYWNrIG9mIEpOQSBhcHByb3ByaWF0ZWx5IHdoZW4gcnVubmluZyBpbiBjbGllbnQgbW9kZSAoQ0FTU0FORFJBLTE3Nzk0KQorICogV2FybiBvbiB1bmtub3duIGRpcmVjdG9yaWVzIGZvdW5kIGluIHN5c3RlbSBrZXlzcGFjZSBkaXJlY3RvcnkgcmF0aGVyIHRoYW4ga2lsbCBub2RlIGR1cmluZyBzdGFydHVwIGNoZWNrcyAoQ0FTU0FORFJBLTE3Nzc3KQorICogTG9nIGR1cGxpY2F0ZSByb3dzIHNoYXJpbmcgYSBwYXJ0aXRpb24ga2V5IGZvdW5kIGluIHZlcmlmeSBhbmQgc2NydWIgKENBU1NBTkRSQS0xNzc4OSkKKyAqIEFkZCBzZXBhcmF0ZSB0aHJlYWQgcG9vbCBmb3IgU2Vjb25kYXJ5IEluZGV4IGJ1aWxkaW5nIHNvIGl0IGRvZXNuJ3QgYmxvY2sgY29tcGFjdGlvbnMgKENBU1NBTkRSQS0xNzc4MSkKKyAqIEFkZGVkIEpNWCBjYWxsIHRvIGdldFNTVGFibGVDb3VudFBlclRXQ1NCdWNrZXQgZm9yIFRXQ1MgKENBU1NBTkRSQS0xNzc3NCkKKyAqIFdoZW4gZG9pbmcgYSBob3N0IHJlcGxhY2VtZW50LCAtRGNhc3NhbmRyYS5icm9hZGNhc3RfaW50ZXJ2YWxfbXMgaXMgdXNlZCB0byBrbm93IHdoZW4gdG8gY2hlY2sgdGhlIHJpbmcgYnV0IGNoZWNrcyB0aGF0IHRoZSByaW5nIHdhc24ndCBjaGFuZ2VkIGluIC1EY2Fzc2FuZHJhLnJpbmdfZGVsYXlfbXMsIGNoYW5nZXMgdG8gcmluZyBkZWxheSBzaG91bGQgbm90IGRlcGVuZCBvbiB3aGVuIHdlIHB1Ymxpc2ggbG9hZCBzdGF0cyAoQ0FTU0FORFJBLTE3Nzc2KQorICogV2hlbiBib290c3RyYXAgZmFpbHMsIENhc3NhbmRyYVJvbGVNYW5hZ2VyIG1heSBhdHRlbXB0IHRvIGRvIHJlYWQgcXVlcmllcyB0aGF0IGZhaWwgd2l0aCAiQ2Fubm90IHJlYWQgZnJvbSBhIGJvb3RzdHJhcHBpbmcgbm9kZSIsIGFuZCBpbmNyZW1lbnRzIHVuYXZhaWxhYmxlcyBjb3VudGVycyAoQ0FTU0FORFJBLTE3NzU0KQorICogQWRkIGd1YXJkcmFpbCB0byBkaXNhbGxvdyBEUk9QIEtFWVNQQUNFIGNvbW1hbmRzIChDQVNTQU5EUkEtMTc3NjcpCisgKiBSZW1vdmUgZXBoZW1lcmFsIHNuYXBzaG90IG1hcmtlciBmaWxlIGFuZCBpbnRyb2R1Y2UgYSBmbGFnIHRvIFNuYXBzaG90TWFuaWZlc3QgKENBU1NBTkRSQS0xNjkxMSkKKyAqIEFkZCBhIHZpcnR1YWwgdGFibGUgdGhhdCBleHBvc2VzIGN1cnJlbnRseSBydW5uaW5nIHF1ZXJpZXMgKENBU1NBTkRSQS0xNTI0MSkKKyAqIEFsbG93IHNzdGFibGVsb2FkZXIgdG8gc3BlY2lmeSB0YWJsZSB3aXRob3V0IHJlbHlpbmcgb24gcGF0aCAoQ0FTU0FORFJBLTE2NTg0KQorICogRml4IFRlc3RHb3NzaXBpbmdQcm9wZXJ0eUZpbGVTbml0Y2gudGVzdF9wcmVmZXJfbG9jYWxfcmVjb25uZWN0X29uX2xpc3Rlbl9hZGRyZXNzIChDQVNTQU5EUkEtMTc3MDApCisgKiBBZGQgQnl0ZUNvbXBhcmFibGUgQVBJIChDQVNTQU5EUkEtNjkzNikKKyAqIEFkZCBndWFyZHJhaWwgZm9yIG1heGltdW0gcmVwbGljYXRpb24gZmFjdG9yIChDQVNTQU5EUkEtMTc1MDApCisgKiBJbmNyZW1lbnQgQ1FMU0ggdG8gdmVyc2lvbiA2LjIuMCBmb3IgcmVsZWFzZSA0LjIgKENBU1NBTkRSQS0xNzY0NikKKyAqIEFkZGluZyBzdXBwb3J0IHRvIHBlcmZvcm0gY2VydGlmaWNhdGUgYmFzZWQgaW50ZXJub2RlIGF1dGhlbnRpY2F0aW9uIChDQVNTQU5EUkEtMTc2NjEpCisgKiBPcHRpb24gdG8gZGlzYWJsZSBDREMgd3JpdGVzIG9mIHJlcGFpcmVkIGRhdGEgKENBU1NBTkRSQS0xNzY2NikKKyAqIFdoZW4gYSBub2RlIGlzIGJvb3RzdHJhcHBpbmcgaXQgZ2V0cyB0aGUgd2hvbGUgZ29zc2lwIHN0YXRlIGJ1dCBhcHBsaWVzIGluIHJhbmRvbSBvcmRlciBjYXVzaW5nIHNvbWUgY2FzZXMgd2hlcmUgU3RvcmFnZVNlcnZpY2Ugd2lsbCBmYWlsIGNhdXNpbmcgYW4gaW5zdGFuY2UgdG8gbm90IHNob3cgdXAgaW4gVG9rZW5NZXRhZGF0YSAoQ0FTU0FORFJBLTE3Njc2KQorICogQWRkIENRTFNIIGNvbW1hbmQgU0hPVyBSRVBMSUNBUyAoQ0FTU0FORFJBLTE3NTc3KQorICogQWRkIGd1YXJkcmFpbCB0byBhbGxvdyBkaXNhYmxpbmcgb2YgU2ltcGxlU3RyYXRlZ3kgKENBU1NBTkRSQS0xNzY0NykKKyAqIENoYW5nZSBkZWZhdWx0IGRpcmVjdG9yeSBwZXJtaXNzaW9uIHRvIDc1MCBpbiBwYWNrYWdpbmcgKENBU1NBTkRSQS0xNzQ3MCkKKyAqIEFkZGluZyBzdXBwb3J0IGZvciBUTFMgY2xpZW50IGF1dGhlbnRpY2F0aW9uIGZvciBpbnRlcm5vZGUgY29tbXVuaWNhdGlvbiAoQ0FTU0FORFJBLTE3NTEzKQorICogQWRkIG5ldyBDUUwgZnVuY3Rpb24gbWF4V3JpdGV0aW1lIChDQVNTQU5EUkEtMTc0MjUpCisgKiBBZGQgZ3VhcmRyYWlsIGZvciBBTFRFUiBUQUJMRSBBREQgLyBEUk9QIC8gUkVNT1ZFIGNvbHVtbiBvcGVyYXRpb25zIChDQVNTQU5EUkEtMTc0OTUpCisgKiBSZW5hbWUgRGlzYWJsZUZsYWcgY2xhc3MgdG8gRW5hYmxlRmxhZyBvbiBndWFyZHJhaWxzIChDQVNTQU5EUkEtMTc1NDQpCiBNZXJnZWQgZnJvbSA0LjA6CisgKiBQYXJ0aWFsIGNvbXBhY3Rpb24gY2FuIHJlc3VycmVjdCBkZWxldGVkIGRhdGEgKENBU1NBTkRSQS0xODUwNykKKworCis0LjEuMworTWVyZ2VkIGZyb20gNC4wOiAKICAqIFJlbW92ZSB1bm5lY2Vzc2FyeSBzaHVmZmxpbmcgb2YgR29zc2lwRGlnZXN0cyBpbiBHb3NzaXBlciNtYWtlUmFuZG9tR29zc2lwRGlnZXN0IChDQVNTQU5EUkEtMTg1NDYpCiBNZXJnZWQgZnJvbSAzLjExOgogTWVyZ2VkIGZyb20gMy4wOgogCisKIDQuMS4yCisgKiBOUEUgd2hlbiBkZXNlcmlhbGl6aW5nIG1hbGZvcm1lZCBjb2xsZWN0aW9ucyBmcm9tIGNsaWVudCAoQ0FTU0FORFJBLTE4NTA1KQogICogQWxsb3cga2V5c3RvcmUgYW5kIHRydXN0cm9yZSBwYXNzd29yZHMgdG8gYmUgbnVsbGFibGUgKENBU1NBTkRSQS0xODEyNCkKICAqIFJldHVybiBzbmFwc2hvdHMgd2l0aCBkb3RzIGluIHRoZWlyIG5hbWUgaW4gbm9kZXRvb2wgbGlzdHNuYXBzaG90cyAoQ0FTU0FORFJBLTE4MzcxKQogICogRml4IE5QRSB3aGVuIGxvYWRpbmcgc25hcHNob3RzIGFuZCBkYXRhIGRpcmVjdG9yeSBpcyBvbmUgZGlyZWN0b3J5IGZyb20gcm9vdCAoQ0FTU0FORFJBLTE4MzU5KQpAQCAtMTcsNyArMTY1LDYgQEAKICAqIFBhcnRpYWwgY29tcGFjdGlvbiBjYW4gcmVzdXJyZWN0IGRlbGV0ZWQgZGF0YSAoQ0FTU0FORFJBLTE4NTA3KQogICogQWxsb3cgaW50ZXJuYWwgYWRkcmVzcyB0byBjaGFuZ2Ugd2l0aCByZWNvbm5lY3Rpbmcgc25pdGNoZXMgKENBU1NBTkRSQS0xNjcxOCkKICAqIEZpeCBxdW90aW5nIGluIHRvQ3FsU3RyaW5nIG1ldGhvZHMgb2YgVURUcyBhbmQgYWdncmVnYXRlcyAoQ0FTU0FORFJBLTE3OTE4KQotICogTlBFIHdoZW4gZGVzZXJpYWxpemluZyBtYWxmb3JtZWQgY29sbGVjdGlvbnMgZnJvbSBjbGllbnQgKENBU1NBTkRSQS0xODUwNSkKICAqIEltcHJvdmUgJ05vdCBlbm91Z2ggc3BhY2UgZm9yIGNvbXBhY3Rpb24nIGxvZ2dpbmcgbWVzc2FnZXMgKENBU1NBTkRSQS0xODI2MCkKICAqIEluY3JlbWVudGFsIHJlcGFpcnMgZmFpbCBvbiBtaXhlZCBJUHY0L3Y2IGFkZHJlc3NlcyBzZXJpYWxpemluZyBTeW5jUmVxdWVzdCAoQ0FTU0FORFJBLTE4NDc0KQogICogRGVhZGxvY2sgdXBkYXRpbmcgc3N0YWJsZSBtZXRhZGF0YSBpZiBkaXNrIGJvdW5kYXJpZXMgbmVlZCByZWxvYWRpbmcgKENBU1NBTkRSQS0xODQ0MykKQEAgLTMzLDYgKzE4MCw3IEBACiAgKiBEbyBub3QgcmVtb3ZlIFNTVGFibGVzIHdoZW4gY2F1c2Ugb2YgRlNSZWFkRXJyb3IgaXMgT3V0T2ZNZW1vcnlFcnJvciB3aGlsZSB1c2luZyBiZXN0X2VmZm9ydCBkaXNrIGZhaWx1cmUgcG9saWN5IChDQVNTQU5EUkEtMTgzMzYpCiAgKiBEbyBub3QgcmVtb3ZlIHRydW5jYXRlZF9hdCBlbnRyeSBpbiBzeXN0ZW0ubG9jYWwgd2hpbGUgZHJvcHBpbmcgYW4gaW5kZXggKENBU1NBTkRSQS0xODEwNSkKIAorCiA0LjAuOQogICogVXBkYXRlIHpzdGQtam5pIGxpYnJhcnkgdG8gdmVyc2lvbiAxLjUuNSAoQ0FTU0FORFJBLTE4NDI5KQogICogQmFja3BvcnQgQ0FTU0FORFJBLTE3MjA1IHRvIDQuMCBicmFuY2ggLSBSZW1vdmUgc2VsZi1yZWZlcmVuY2UgaW4gU1NUYWJsZVRpZGllciAoQ0FTU0FORFJBLTE4MzMyKQpAQCAtNTAsNiArMTk4LDcgQEAKICAqIERvIG5vdCByZW1vdmUgdHJ1bmNhdGVkX2F0IGVudHJ5IGluIHN5c3RlbS5sb2NhbCB3aGlsZSBkcm9wcGluZyBhbiBpbmRleCAoQ0FTU0FORFJBLTE4MTA1KQogICogU2F2ZSBob3N0IGlkIHRvIHN5c3RlbS5sb2NhbCBhbmQgZmx1c2ggaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnR1cCAoQ0FTU0FORFJBLTE4MTUzKQogCisKIDQuMS4xCiAgKiBEZXByZWNhdGUgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGFkb29wIGNvZGUgKENBU1NBTkRSQS0xNjk4NCkKICAqIEZpeCB0b28gZWFybHkgc2NoZW1hIHZlcnNpb24gY2hhbmdlIGluIHN5c2VtIGxvY2FsIHRhYmxlIChDQVNTQU5EUkEtMTgyOTEpCkBAIC05Myw2ICsyNDIsNyBAQAogICogQXZvaWQgYW50aWNvbXBhY3Rpb24gbWl4aW5nIGRhdGEgZnJvbSB0d28gZGlmZmVyZW50IHRpbWUgd2luZG93cyB3aXRoIFRXQ1MgKENBU1NBTkRSQS0xNzk3MCkKICAqIERvIG5vdCBzcGFtIHRoZSBsb2dzIHdpdGggTWlncmF0aW9uQ29vcmRpbmF0b3Igbm90IGJlaW5nIGFibGUgdG8gcHVsbCBzY2hlbWFzIChDQVNTQU5EUkEtMTgwOTYpCiAKKwogNC4xLjAKICAqIEZpeCBDb250ZW50aW9uU3RyYXRlZ3kgYmFja29mZiBhbmQgQ2xvY2sud2FpdFVudGlsIChDQVNTQU5EUkEtMTgwODYpCiBNZXJnZWQgZnJvbSA0LjA6CkBAIC0xMjksNiArMjc5LDcgQEAKICAqIFN1cHByZXNzIENWRS0yMDE5LTI2ODQgKENBU1NBTkRSQS0xNzk2NSkKICAqIEZpeCBhdXRvLWNvbXBsZXRpbmcgIldJVEgiIHdoZW4gY3JlYXRpbmcgYSBtYXRlcmlhbGl6ZWQgdmlldyAoQ0FTU0FORFJBLTE3ODc5KQogCisKIDQuMS1iZXRhMQogICogV2Ugc2hvdWxkIG5vdCBlbWl0IGRlcHJlY2F0aW9uIHdhcm5pbmcgb24gc3RhcnR1cCBmb3IgYGtleV9jYWNoZV9zYXZlX3BlcmlvZGAsIGByb3dfY2FjaGVfc2F2ZV9wZXJpb2RgLCBgY291bnRlcl9jYWNoZV9zYXZlX3BlcmlvZGAgKENBU1NBTkRSQS0xNzkwNCkKICAqIHVwc2VydCB3aXRoIGFkZGVyIHN1cHBvcnQgaXMgbm90IGNvbnNpc3RlbnQgd2l0aCBudW1iZXJzIGFuZCBzdHJpbmdzIGluIExXVCAoQ0FTU0FORFJBLTE3ODU3KQpAQCAtMTkxLDYgKzM0Miw3IEBACiAgKiBGaXggc2NydWJiZXIgZmFsbGluZyBpbnRvIGluZmluaXRlIGxvb3Agd2hlbiB0aGUgbGFzdCBwYXJ0aXRpb24gaXMgYnJva2VuIChDQVNTQU5EUkEtMTc4NjIpCiAgKiBGaXggcmVzZXR0aW5nIHNjaGVtYSAoQ0FTU0FORFJBLTE3ODE5KQogCisKIDQuMS1hbHBoYTEKICAqIEhhbmRsZSBjb25maWcgcGFyYW1ldGVycyB1cHBlciBib3VuZCBvbiBzdGFydHVwOyBGaXggYXV0b19zbmFwc2hvdF90dGwgYW5kIHBheG9zX3B1cmdlX2dyYWNlX3BlcmlvZCBtaW4gdW5pdCB2YWxpZGF0aW9ucyAoQ0FTU0FORFJBLTE3NTcxKQogICogRml4IGxlYWsgb2Ygbm9uLXN0YW5kYXJkIEphdmEgdHlwZXMgaW4gb3VyIEV4Y2VwdGlvbnMgYXMgY2xpZW50cyB1c2luZyBKTVggYXJlIHVuYWJsZSB0byBoYW5kbGUgdGhlbS4KQEAgLTQwOSw2ICs1NjEsNyBAQAogICogTGF6eSB0cmFuc2FjdGlvbiBsb2cgcmVwbGljYSBjcmVhdGlvbiBhbGxvd3MgaW5jb3JyZWN0IHJlcGxpY2EgY29udGVudCBkaXZlcmdlbmNlIGR1cmluZyBhbnRpY29tcGFjdGlvbiAoQ0FTU0FORFJBLTE3MjczKQogICogTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneSBkaXNrIHNwYWNlIGNoZWNrIGltcHJvdmVtZW50cyAoQ0FTU0FORFJBLTE3MjcyKQogCisKIDQuMC4zCiAgKiBEZXByZWNhdGUgb3RjX2NvYWxlc2Npbmdfc3RyYXRlZ3ksIG90Y19jb2FsZXNjaW5nX3dpbmRvd191cywgb3RjX2NvYWxlc2NpbmdfZW5vdWdoX2NvYWxlc2NlZF9tZXNzYWdlcywKICAgIG90Y19iYWNrbG9nX2V4cGlyYXRpb25faW50ZXJ2YWxfbXMgKENBU1NBTkRSQS0xNzM3NykKQEAgLTUxOSw2ICs2NzIsNyBAQAogICogRW5zdXJlIGphdmEgZXhlY3V0YWJsZSBpcyBvbiB0aGUgcGF0aCAoQ0FTU0FORFJBLTE0MzI1KQogICogQ2xlYW4gdHJhbnNhY3Rpb24gbG9nIGxlZnRvdmVycyBhdCB0aGUgYmVnaW5uaW5nIG9mIHNzdGFibGVsZXZlbHJlc2V0IGFuZCBzc3RhYmxlb2ZmbGluZXJlbGV2ZWwgKENBU1NBTkRSQS0xMjUxOSkKIAorCiA0LjAuMAogICogQXZvaWQgc2lnbmFsaW5nIERpZ2VzdFJlc29sdmVyIHVudGlsIHRoZSBtaW5pbXVtIG51bWJlciBvZiByZXNwb25zZXMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgdmlzaWJsZSAoQ0FTU0FORFJBLTE2ODA3KQogICogRml4IHByZS00LjAgRldEX0ZSTSBwYXJhbWV0ZXIgc2VyaWFsaXplciAoQ0FTU0FORFJBLTE2ODA4KQpAQCAtNTI2LDYgKzY4MCw3IEBACiAgKiBGaXggQ2Fzc2FuZHJhVmVyc2lvbjo6Y29tcGFyZVRvIChDQVNTQU5EUkEtMTY3OTQpCiAgKiBCaW5Mb2cgZG9lcyBub3QgY2xvc2UgY2hyb25pY2xlIHF1ZXVlIGxlYXZpbmcgdGhpcyB0byBHQyB0byBjbGVhbnVwIChDQVNTQU5EUkEtMTY3NzQpCiAKKwogNC4wLXJjMgogICogSW1wcm92ZWQgcGFzc3dvcmQgb2JmdXNjYXRpb24gKENBU1NBTkRSQS0xNjgwMSkKICAqIEF2b2lkIG1lbW9pemluZyB0aGUgd3JvbmcgbWluIGNsdXN0ZXIgdmVyc2lvbiBkdXJpbmcgdXBncmFkZXMgKENBU1NBTkRSQS0xNjc1OSkKQEAgLTU2MSw2ICs3MTYsNyBAQAogICogUHJldmVudCBsb3NzIG9mIGNvbW1pdCBsb2cgZGF0YSB3aGVuIG1vdmluZyBzc3RhYmxlcyBiZXR3ZWVuIG5vZGVzIChDQVNTQU5EUkEtMTY2MTkpCiAgKiBGaXggbWF0ZXJpYWxpemVkIHZpZXcgYnVpbGRlcnMgaW5zZXJ0aW5nIHRydW5jYXRlZCBkYXRhIChDQVNTQU5EUkEtMTY1NjcpCiAKKwogNC4wLXJjMQogICogQWxsb3cgZm9yIHNldHRpbmcgYnVmZmVyIG1heCBjYXBhY2l0eSB0byBpbmNyZWFzZSBpdCBkeW5hbWljYWxseSBhcyBuZWVkZWQgKENBU1NBTkRSQS0xNjUyNCkKICAqIEhhcmRlbiBpbnRlcm5vZGUgbWVzc2FnZSByZXNvdXJjZSBsaW1pdCBhY2NvdW50aW5nIGFnYWluc3Qgc2VyaWFsaXphdGlvbiBmYWlsdXJlcyAoQ0FTU0FORFJBLTE2NjE2KQpAQCAtNjQyLDYgKzc5OCw3IEBACiAgKiBGaXggY2VudG9zIHBhY2thZ2luZyBmb3IgYXJtNjQsID49NC4wIHJwbSdzIG5vdyByZXF1aXJlIHB5dGhvbjMgKENBU1NBTkRSQS0xNjQ3NykKICAqIE1ha2UgVG9rZW5NZXRhZGF0YSdzIHJpbmcgdmVyc2lvbiBpbmNyZW1lbnRzIGF0b21pYyAoQ0FTU0FORFJBLTE2Mjg2KQogCisKIDQuMC1iZXRhNAogICogRFJPUCBDT01QQUNUIFNUT1JBR0Ugc2hvdWxkIGludmFsaWRhdGUgcHJlcGFyZWQgc3RhdGVtZW50cyBzdGlsbCB1c2luZyBDb21wYWN0VGFibGVNZXRhZGF0YSAoQ0FTU0FORFJBLTE2MzYxKQogICogVXBkYXRlIGRlZmF1bHQgbnVtX3Rva2VucyB0byAxNiBhbmQgYWxsb2NhdGVfdG9rZW5zX2Zvcl9sb2NhbF9yZXBsaWNhdGlvbl9mYWN0b3IgdG8gMyAoQ0FTU0FORFJBLTEzNzAxKQpAQCAtNjg5LDYgKzg0Niw3IEBACiBNZXJnZWQgZnJvbSAyLjI6CiAgKiBGaXggdGhlIGhpc3RvZ3JhbSBtZXJnZSBvZiB0aGUgdGFibGUgbWV0cmljcyAoQ0FTU0FORFJBLTE2MjU5KQogCisKIDQuMC1iZXRhMwogICogU2VncmVnYXRlIE5ldHdvcmsgYW5kIENodW5rIENhY2hlIEJ1ZmZlclBvb2xzIGFuZCBSZWNpcmN1bGF0ZSBQYXJ0aWFsbHkgRnJlZWQgQ2h1bmtzIChDQVNTQU5EUkEtMTUyMjkpCiAgKiBGYWlsIHRydW5jYXRpb24gcmVxdWVzdHMgd2hlbiB0aGV5IGZhaWwgb24gYSByZXBsaWNhIChDQVNTQU5EUkEtMTYyMDgpCkBAIC03MzEsNiArODg5LDcgQEAKICAqIEF1dG9tYXRpY2FsbHkgZHJvcCBjb21wYWN0IHN0b3JhZ2Ugb24gdGFibGVzIGZvciB3aGljaCBpdCBpcyBzYWZlIChDQVNTQU5EUkEtMTYwNDgpCiAgKiBGaXhlZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBmb3IgQ09NUEFDVCBTVE9SQUdFIHRhYmxlcyB3aXRoIG51bGwgY2x1c3RlcmluZyAoQ0FTU0FORFJBLTE2MjQxKQogCisKIDQuMC1iZXRhMgogICogQWRkIGFkZGl0aW9uIGluY3JlbWVudGFsIHJlcGFpciB2aXNpYmlsaXR5IHRvIG5vZGV0b29sIHJlcGFpcl9hZG1pbiAoQ0FTU0FORFJBLTE0OTM5KQogICogQWx3YXlzIGFjY2VzcyBzeXN0ZW0gcHJvcGVydGllcyBhbmQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHZpYSB0aGUgbmV3IENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyBhbmQgQ2Fzc2FuZHJhUmVsZXZhbnRFbnYgY2xhc3NlcyAoQ0FTU0FORFJBLTE1ODc2KQpAQCAtNzY5LDYgKzkyOCw3IEBACiBNZXJnZWQgZnJvbSAyLjE6CiAgKiBPbmx5IGFsbG93IHN0cmluZ3MgdG8gYmUgcGFzc2VkIHRvIEpNWCBhdXRoZW50aWNhdGlvbiAoQ0FTU0FORFJBLTE2MDc3KQogCisKIDQuMC1iZXRhMQogICogUmVtb3ZlIEJhY2tQcmVzc3VyZVN0cmF0ZWd5IChDQVNTQU5EUkEtMTUzNzUpCiAgKiBJbXByb3ZlIG1lc3NhZ2luZyBvbiBpbmRleGluZyBmcm96ZW4gY29sbGVjdGlvbnMgKENBU1NBTkRSQS0xNTkwOCkKQEAgLTg1OCw2ICsxMDE4LDcgQEAKIE1lcmdlZCBmcm9tIDIuMToKICAqIEZpeCB3cml0aW5nIG9mIHNuYXBzaG90IG1hbmlmZXN0IHdoZW4gdGhlIHRhYmxlIGhhcyB0YWJsZS1iYWNrZWQgc2Vjb25kYXJ5IGluZGV4ZXMgKENBU1NBTkRSQS0xMDk2OCkKIAorCiA0LjAtYWxwaGE0CiAgKiBBZGQgY2xpZW50IHJlcXVlc3Qgc2l6ZSBzZXJ2ZXIgbWV0cmljcyAoQ0FTU0FORFJBLTE1NzA0KQogICogQWRkIGFkZGl0aW9uYWwgbG9nZ2luZyBhcm91bmQgRmlsZVV0aWxzIGFuZCBjb21wYWN0aW9uIGxlZnRvdmVyIGNsZWFudXAgKENBU1NBTkRSQS0xNTcwNSkKQEAgLTkxNCw2ICsxMDc1LDcgQEAKICAqIEZpeCBSZWQgSGF0IGluaXQgc2NyaXB0IG9uIG5ld2VyIHN5c3RlbWQgdmVyc2lvbnMgKENBU1NBTkRSQS0xNTI3MykKICAqIEFsbG93IEVYVFJBX0NMQVNTUEFUSCB0byB3b3JrIG9uIHRhci9zb3VyY2UgaW5zdGFsbGF0aW9ucyAoQ0FTU0FORFJBLTE1NTY3KQogCisKIDQuMC1hbHBoYTMKICAqIFJlc3RvcmUgbW9ub3RvbmljIHJlYWQgY29uc2lzdGVuY3kgZ3VhcmFudGVlcyBmb3IgYmxvY2tpbmcgcmVhZCByZXBhaXIgKENBU1NBTkRSQS0xNDc0MCkKICAqIFNlcGFyYXRlIGV4Y2VwdGlvbnMgZm9yIENBUyB3cml0ZSB0aW1lb3V0IGV4Y2VwdGlvbnMgY2F1c2VkIGJ5IGNvbnRlbnRpb24gYW5kIHVua293biByZXN1bHQgKENBU1NBTkRSQS0xNTM1MCkKQEAgLTk2NSw2ICsxMTI3LDcgQEAKICAqIEluLUpWTSBEVGVzdDogU3VwcG9ydCBOb2RlVG9vbCBpbiBkdGVzdCAoQ0FTU0FORFJBLTE1NDI5KQogICogQWRkZWQgZGF0YSBtb2RlbGluZyBkb2N1bWVudGF0aW9uIChDQVNTQU5EUkEtMTU0NDMpCiAKKwogNC4wLWFscGhhMgogICogRml4IFNBU0kgbm9uLWxpdGVyYWwgc3RyaW5nIGNvbXBhcmlzb25zIChyYW5nZSBvcGVyYXRvcnMpIChDQVNTQU5EUkEtMTUxNjkpCiAgKiBVcGdyYWRlIEd1YXZhIHRvIDI3LCBhbmQgdG8gamF2YS1kcml2ZXIgMy42LjAgKGZyb20gMy40LjAtU05BUFNIT1QpIChDQVNTQU5EUkEtMTQ2NTUpCkBAIC0xMzU2LDYgKzE1MTksNyBAQAogICogTXVsdGktdmVyc2lvbiBpbi1KVk0gZHRlc3RzIChDQVNTQU5EUkEtMTQ5MzcpCiAgKiBBbGxvdyBpbnN0YW5jZSBjbGFzcyBsb2FkZXJzIHRvIGJlIGdhcmJhZ2UgY29sbGVjdGVkIGZvciBpbkpWTSBkdGVzdCAoQ0FTU0FORFJBLTE1MTcwKQogCisKIDMuMTEuNgogICogRml4IGJhZCBVRFQgc3N0YWJsZSBtZXRhZGF0YSBzZXJpYWxpemF0aW9uIGhlYWRlcnMgd3JpdHRlbiBieSBDKiAzLjAgb24gdXBncmFkZSBhbmQgaW4gc3N0YWJsZXNjcnViIChDQVNTQU5EUkEtMTUwMzUpCiAgKiBGaXggbm9kZXRvb2wgY29tcGFjdGlvbnN0YXRzIHNob3dpbmcgZXh0cmEgcGVuZGluZyB0YXNrIGZvciBUV0NTIC0gcGF0Y2ggaW1wbGVtZW50ZWQgKENBU1NBTkRSQS0xNTQwOSkKQEAgLTEzODYsNiArMTU1MCw3IEBACiAgKiBJbi1KVk0gRFRlc3Q6IFN1cHBvcnQgTm9kZVRvb2wgaW4gZHRlc3QgKENBU1NBTkRSQS0xNTQyOSkKICAqIEZpeCBOYXRpdmVMaWJyYXJ5LnRyeU9wZW5EaXJlY3RvcnkgY2FsbGVycyBmb3IgV2luZG93cyAoQ0FTU0FORFJBLTE1NDI2KQogCisKIDMuMTEuNQogICogRml4IGNhc3NhbmRyYS1lbnYuc2ggdG8gdXNlICRDQVNTQU5EUkFfQ09ORiB0byBmaW5kIGNhc3NhbmRyYS1qYWFzLmNvbmZpZyAoQ0FTU0FORFJBLTE0MzA1KQogICogRml4ZWQgbm9kZXRvb2wgY2ZzdGF0cyBwcmludGluZyBpbmRleCBuYW1lIHR3aWNlIChDQVNTQU5EUkEtMTQ5MDMpCkBAIC0yNTIyLDcgKzI2ODcsNiBAQAogICogU2FuZSBkZWZhdWx0ICgyMDBNYnBzKSBmb3IgaW50ZXItREMgc3RyZWFtaW5nIHRocm91Z3B1dCAoQ0FTU0FORFJBLTg3MDgpCiAKIAotCiAzLjIKICAqIE1ha2Ugc3VyZSB0b2tlbnMgZG9uJ3QgZXhpc3QgaW4gc2V2ZXJhbCBkYXRhIGRpcmVjdG9yaWVzIChDQVNTQU5EUkEtNjY5NikKICAqIEFkZCByZXF1aXJlQXV0aG9yaXphdGlvbiBtZXRob2QgdG8gSUF1dGhvcml6ZXIgKENBU1NBTkRSQS0xMDg1MikKQEAgLTc1NTUsNyArNzcxOSw2IEBACiAgICAgLSBTaW1pbGFybHksIG1lcmdlZCBiYXRjaF9pbnNlcnRfc3VwZXIgaW50byBiYXRjaF9pbnNlcnQuCiAKIAotCiAwLjQuMCBiZXRhCiAgKiBPbi1kaXNrIGRhdGEgZm9ybWF0IGhhcyBjaGFuZ2VkIHRvIGFsbG93IGJpbGxpb25zIG9mIGtleXMvcm93cyBwZXIKICAgIG5vZGUgaW5zdGVhZCBvZiBvbmx5IG1pbGxpb25zCkBAIC03NTkyLDcgKzc3NTUsNiBAQAogICogUmVuYW1lIGNvbmZpZ3VyYXRpb24gInRhYmxlIiB0byAia2V5c3BhY2UiCiAgKiBNb3ZlZCB0byBjcmFzaC1vbmx5IGRlc2lnbjsgbm8gbW9yZSBzaHV0ZG93biAoanVzdCBraWxsIHRoZSBwcm9jZXNzKQogICogTG90cyBvZiBidWcgZml4ZXMKLQogRnVsbCBsaXN0IG9mIGlzc3VlcyByZXNvbHZlZCBpbiAwLjQgaXMgYXQgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL3NlY3VyZS9Jc3N1ZU5hdmlnYXRvci5qc3BhP3Jlc2V0PXRydWUmJnBpZD0xMjMxMDg2NSZmaXhmb3I9MTIzMTM4NjImcmVzb2x1dGlvbj0xJnNvcnRlci9maWVsZD1pc3N1ZWtleSZzb3J0ZXIvb3JkZXI9REVTQwogCiAKQEAgLTc2MjMsMyArNzc4NSw1IEBACiAgKiBDb21iaW5lZCBibG9ja2luZyBhbmQgbm9uLWJsb2NraW5nIHZlcnNpb25zIG9mIGluc2VydCBBUElzCiAgKiBBZGRlZCBGbHVzaFBlcmlvZEluTWludXRlcyBjb25maWd1cmF0aW9uIHBhcmFtZXRlciB0byBmb3JjZQogICAgZmx1c2hpbmcgb2YgaW5mcmVxdWVudGx5LXVwZGF0ZWQgQ29sdW1uRmFtaWxpZXMKKworCmRpZmYgLS1naXQgYS9ORVdTLnR4dCBiL05FV1MudHh0CmluZGV4IDA5MzBhYzAuLjIxMjllYWQgMTAwNjQ0Ci0tLSBhL05FV1MudHh0CisrKyBiL05FV1MudHh0CkBAIC01MiwyOCArNTIsMTQ3IEBACiB1c2luZyB0aGUgcHJvdmlkZWQgJ3NzdGFibGV1cGdyYWRlJyB0b29sLgogCiAKLTQuMS4xCi09PT09PQorNS4wCis9PT0KIAotRzFHQyBSZWNvbW1lbmRlZAotLS0tLS0tLS0tLS0tLS0tLQotICAgIC0gVGhlIEcxIHNldHRpbmdzIGluIGp2bTgtc2VydmVyLm9wdGlvbnMgYW5kIGp2bTExLXNlcnZlci5vcHRpb25zIGFyZSB1cGRhdGVkIGFjY29yZGluZyB0byBicm9hZCBmZWVkYmFjawotICAgICAgYW5kIHRlc3RpbmcuIFRoZSBHMSBzZXR0aW5ncyByZW1haW4gY29tbWVudGVkIG91dCBieSBkZWZhdWx0IGluIDQuMS54LiBJdCBpcyByZWNvbW1lbmRlZCB0byBzd2l0Y2gKLSAgICAgIHRvIEcxIGZvciBwZXJmb3JtYW5jZSBhbmQgZm9yIHNpbXBsZXIgR0MgdHVuaW5nLiBDTVMgaXMgYWxyZWFkeSBkZXByZWNhdGVkIGluIEpESzksIGFuZCB0aGUgbmV4dCBtYWpvcgotICAgICAgcmVsZWFzZSBvZiBDYXNzYW5kcmEgbWFrZXMgRzEgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbi4KK05ldyBmZWF0dXJlcworLS0tLS0tLS0tLS0tCisgICAgLSBBZGRlZCBuZXcgTWF0aGVtYXRpY2FsIENRTCBmdW5jdGlvbnM6IGFicywgZXhwLCBsb2csIGxvZzEwIGFuZCByb3VuZC4KKyAgICAtIEFkZGVkIGEgdHJpZS1iYXNlZCBtZW10YWJsZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaW1wcm92ZXMgbWVtb3J5IHVzZSwgZ2FyYmFnZSBjb2xsZWN0aW9uIGVmZmljaWVuY3kgYW5kIGxvb2t1cAorICAgICAgcGVyZm9ybWFuY2UuIFRoZSBuZXcgbWVtdGFibGUgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIFRyaWVNZW10YWJsZSBjbGFzcyBhbmQgY2FuIGJlIHNlbGVjdGVkIHVzaW5nIHRoZSBtZW10YWJsZQorICAgICAgQVBJLCBzZWUgc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvTWVtdGFibGVfQVBJLm1kLgorICAgIC0gQWRkZWQgYSBuZXcgdHJpZS1pbmRleGVkIFNTVGFibGUgZm9ybWF0IHdpdGggYmV0dGVyIGxvb2t1cCBlZmZpY2llbmN5IGFuZCBzaXplLiBUaGUgbmV3IGZvcm1hdCByZW1vdmVzIHRoZSBpbmRleAorICAgICAgc3VtbWFyeSBjb21wb25lbnQgYW5kIGRvZXMgbm90IHJlcXVpcmUga2V5IGNhY2hpbmcuIEFkZGl0aW9uYWxseSwgaXQgaXMgYWJsZSB0byBlZmZpY2llbnRseSBzZWFyY2ggaW4gcGFydGl0aW9ucworICAgICAgc3Bhbm5pbmcgdGhvdXNhbmRzIG9yIG1pbGxpb25zIG9mIHJvd3MuCisgICAgICBUaGUgZm9ybWF0IGlzIGFwcGxpZWQgYnkgc2V0dGluZyAiYnRpIiBhcyB0aGUgc2VsZWN0ZWQgc3N0YWJsZSBmb3JtYXQgaW4gY2Fzc2FuZHJhLnlhbWwncyBzc3RhYmxlcyBvcHRpb24uCisgICAgLSBBZGRlZCBhIG5ldyBjb25maWd1cmF0aW9uIGNkY19vbl9yZXBhaXJfZW5hYmxlZCB0byB0b2dnbGUgd2hldGhlciBDREMgbXV0YXRpb25zIGFyZSByZXBsYXllZCB0aHJvdWdoIHRoZQorICAgICAgd3JpdGUgcGF0aCBvbiBzdHJlYW1pbmcsIGUuZy4gcmVwYWlyLiBXaGVuIGVuYWJsZWQsIENEQyBkYXRhIHN0cmVhbWVkIHRvIHRoZSBkZXN0aW5hdGlvbiBub2RlIHdpbGwgYmUgd3JpdHRlbiBpbnRvCisgICAgICBjb21taXQgbG9nIGZpcnN0LiBXaGVuIGRpc2FibGVkLCB0aGUgc3RyZWFtZWQgQ0RDIGRhdGEgaXMgd3JpdHRlbiBpbnRvIFNTVGFibGVzIGp1c3QgdGhlIHNhbWUgYXMgbm9ybWFsIHN0cmVhbWluZy4KKyAgICAgIElmIHRoaXMgaXMgc2V0IHRvIGZhbHNlLCBzdHJlYW1pbmcgd2lsbCBiZSBjb25zaWRlcmFibHkgZmFzdGVyIGhvd2V2ZXIgaXQncyBwb3NzaWJsZSB0aGF0LCBpbiBleHRyZW1lIHNpdHVhdGlvbnMKKyAgICAgIChsb3NpbmcgPiBxdW9ydW0gIyBub2RlcyBpbiBhIHJlcGxpY2Egc2V0KSwgeW91IG1heSBoYXZlIGRhdGEgaW4geW91ciBTU1RhYmxlcyB0aGF0IG5ldmVyIG1ha2VzIGl0IHRvIHRoZSBDREMgbG9nLgorICAgICAgVGhlIGRlZmF1bHQgaXMgdHJ1ZS9lbmFibGVkLiBUaGUgY29uZmlndXJhdGlvbiBjYW4gYmUgYWx0ZXJlZCB2aWEgSk1YLgorICAgIC0gQWRkZWQgc3VwcG9ydCBmb3IgcmVhZGluZyB0aGUgd3JpdGUgdGltZXMgYW5kIFRUTHMgb2YgdGhlIGVsZW1lbnRzIG9mIGNvbGxlY3Rpb25zIGFuZCBVRFRzLCByZWdhcmRsZXNzIG9mIGJlaW5nCisgICAgICBmcm96ZW4gb3Igbm90LiBUaGUgQ1FMIGZ1bmN0aW9ucyB3cml0ZXRpbWUsIG1heHdyaXRldGltZSBhbmQgdHRsIGNhbiBub3cgYmUgYXBwbGllZCB0byBlbnRpcmUgY29sbGVjdGlvbnMvVURUcywKKyAgICAgIHNpbmdsZSBjb2xsZWN0aW9uL1VEVCBlbGVtZW50cyBhbmQgc2xpY2VzIG9mIGNvbGxlY3Rpb24vVURUIGVsZW1lbnRzLgorICAgIC0gQWRkZWQgYSBuZXcgQ1FMIGZ1bmN0aW9uLCBtYXh3cml0ZXRpbWUuIEl0IHNob3dzIHRoZSBsYXJnZXN0IHVuaXggdGltZXN0YW1wIHRoYXQgdGhlIGRhdGEgd2FzIHdyaXR0ZW4sIHNpbWlsYXIgdG8KKyAgICAgIGl0cyBzaWJsaW5nIENRTCBmdW5jdGlvbiwgd3JpdGV0aW1lLgorICAgIC0gTmV3IEd1YXJkcmFpbHMgYWRkZWQ6CisgICAgICAtIFdoZXRoZXIgQUxURVIgVEFCTEUgY29tbWFuZHMgYXJlIGFsbG93ZWQgdG8gbXV0YXRlIGNvbHVtbnMKKyAgICAgIC0gV2hldGhlciBTaW1wbGVTdHJhdGVneSBpcyBhbGxvd2VkIG9uIGtleXNwYWNlIGNyZWF0aW9uIG9yIGFsdGVyYXRpb24KKyAgICAgIC0gTWF4aW11bSByZXBsaWNhdGlvbiBmYWN0b3IKKyAgICAgIC0gV2hldGhlciBEUk9QIEtFWVNQQUNFIGNvbW1hbmRzIGFyZSBhbGxvd2VkLgorICAgICAgLSBDb2x1bW4gdmFsdWUgc2l6ZQorICAgICAgLSBQYXJ0aXRpb24gc2l6ZQorICAgIC0gSXQgaXMgcG9zc2libGUgdG8gbGlzdCBlcGhlbWVyYWwgc25hcHNob3RzIGJ5IG5vZGV0b29sIGxpc3RzbmFwaG90cyBjb21tYW5kIHdoZW4gZmxhZyAiLWUiIGlzIHNwZWNpZmllZC4KKyAgICAtIEFkZGVkIGEgbmV3IGZsYWcgdG8gYG5vZGV0b29sIHByb2ZpbGVsb2FkYCBhbmQgSk1YIGVuZHBvaW50IHRvIHNldCB1cCByZWN1cnJpbmcgcHJvZmlsZSBsb2FkIGdlbmVyYXRpb24gb24gc3BlY2lmaWVkCisgICAgICBpbnRlcnZhbHMgKHNlZSBDQVNTQU5EUkEtMTc4MjEpCisgICAgLSBBZGRlZCBhIG5ldyBwcm9wZXJ0eSwgZ29zc2lwZXIubG9vc2VfZW1wdHlfZW5hYmxlZCwgdG8gYWxsb3cgZm9yIGEgbG9vc2VyIGRlZmluaXRpb24gb2YgImVtcHR5IiB3aGVuCisgICAgICBjb25zaWRlcmluZyB0aGUgaGVhcnRiZWF0IHN0YXRlIG9mIGFub3RoZXIgbm9kZSBpbiBHb3NzaXAuIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBrbm93bGVkZ2VhYmxlCisgICAgICBvcGVyYXRvcnMgaW4gdGhlIGZvbGxvd2luZyBzY2VuYXJpb3M6CisKKyAgICAgIEN1cnJlbnRseSAiZW1wdHkiIHcvcmVnYXJkcyB0byBoZWFydGJlYXQgc3RhdGUgaW4gR29zc2lwIGlzIHZlcnkgc3BlY2lmaWMgdG8gYSBzaW5nbGUgZWRnZSBjYXNlIChpLmUuIGluCisgICAgICBpc0VtcHR5V2l0aG91dFN0YXR1cygpIG91ciB1c2FnZSBvZiBoYlN0YXRlKCkgKyBhcHBsaWNhdGlvblN0YXRlKSwgaG93ZXZlciB0aGVyZSBhcmUgb3RoZXIgZmFpbHVyZSBjYXNlcyB3aGljaAorICAgICAgYmxvY2sgaG9zdCByZXBsYWNlbWVudHMgYW5kIHJlcXVpcmUgaW50cnVzaXZlIHdvcmthcm91bmRzIGFuZCBodW1hbiBpbnRlcnZlbnRpb24gdG8gcmVjb3ZlciBmcm9tIHdoZW4geW91CisgICAgICBoYXZlIHNvbWV0aGluZyBpbiBoYlN0YXRlKCkgeW91IGRvbid0IGV4cGVjdC4gU2VlIENBU1NBTkRSQS0xNzg0MiBmb3IgZnVydGhlciBkZXRhaWxzLgorICAgIC0gQWRkZWQgbmV3IENRTCB0YWJsZSBwcm9wZXJ0eSAnYWxsb3dfYXV0b19zbmFwc2hvdCcgd2hpY2ggaXMgYnkgZGVmYXVsdCB0cnVlLiBXaGVuIHNldCB0byBmYWxzZSBhbmQgJ2F1dG9fc25hcHNob3Q6IHRydWUnCisgICAgICBpbiBjYXNzYW5kcmEueWFtbCwgdGhlcmUgd2lsbCBiZSBubyBzbmFwc2hvdCB0YWtlbiB3aGVuIGEgdGFibGUgaXMgdHJ1bmNhdGVkIG9yIGRyb3BwZWQuIFdoZW4gYXV0b19zbmFwc2hvdCBpbgorICAgICAgY2FzYW5kcmEueWFtbCBpcyBzZXQgdG8gZmFsc2UsIHRoZSBuZXdseSBhZGRlZCB0YWJsZSBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGFueSBlZmZlY3QuCisgICAgLSBDaGFuZ2VkIGRlZmF1bHQgb24gcmVzdW1hYmxlIGJvb3RzdHJhcCB0byBiZSBkaXNhYmxlZC4gUmVzdW1hYmxlIGJvb3RzdHJhcCBoYXMgZWRnZSBjYXNlcyB3aXRoIHBvdGVudGlhbCBjb3JyZWN0bmVzcworICAgICAgdmlvbGF0aW9ucyBvciBkYXRhIGxvc3Mgc2NlbmFyaW9zIGlmIG5vZGVzIGdvIGRvd24gZHVyaW5nIGJvb3RzdHJhcCwgdG9tYnN0b25lcyBhcmUgd3JpdHRlbiwgYW5kIG9wZXJhdGlvbnMgcmFjZSB3aXRoCisgICAgICByZXBhaXIuIEFzIHN0cmVhbWluZyBpcyBjb25zaWRlcmFibHkgZmFzdGVyIGluIHRoZSA0LjArIGVyYSAoYXMgd2VsbCBhcyB3aXRoIHplcm8gY29weSBzdHJlYW1pbmcpLCB0aGUgcmlza3Mgb2YKKyAgICAgIGhhdmluZyB0aGVzZSBlZGdlIGNhc2VzIGR1cmluZyBhIGZhaWxlZCBhbmQgcmVzdW1lZCBib290c3RyYXAgYXJlIG5vIGxvbmdlciBkZWVtZWQgYWNjZXB0YWJsZS4KKyAgICAgIFRvIHJlLWVuYWJsZSB0aGlzIGZlYXR1cmUsIHVzZSB0aGUgLURjYXNzYW5kcmEucmVzZXRfYm9vdHN0cmFwX3Byb2dyZXNzPWZhbHNlIGVudmlyb25tZW50IGZsYWcuCisgICAgLSBBZGRlZCAtLW9sZGVyLXRoYW4gYW5kIC0tb2xkZXItdGhhbi10aW1lc3RhbXAgb3B0aW9ucyB0byBub2RldG9vbCBjbGVhcnNuYXBzaG90IGNvbW1hbmQuIEl0IGlzIHBvc3NpYmxlIHRvCisgICAgICBjbGVhciBzbmFwc2hvdHMgd2hpY2ggYXJlIG9sZGVyIHRoYW4gc29tZSBwZXJpb2QgZm9yIGV4YW1wbGUsICItLW9sZGVyLXRoYW4gNWgiIHRvIHJlbW92ZQorICAgICAgc25hcHNob3RzIG9sZGVyIHRoYW4gNSBob3VycyBhbmQgaXQgaXMgcG9zc2libGUgdG8gY2xlYXIgYWxsIHNuYXBzaG90cyBvbGRlciB0aGFuIHNvbWUgdGltZXN0YW1wLCBmb3IgZXhhbXBsZQorICAgICAgLS1vbGRlci10aGFuLXRpbWVzdGFtcCAyMDIyLTEyLTAzVDEwOjE1OjMwWi4KKyAgICAtIENhc3NhbmRyYSBsb2dzIGNhbiBiZSB2aWV3ZWQgaW4gdGhlIHZpcnR1YWwgdGFibGUgc3lzdGVtX3ZpZXdzLnN5c3RlbV9sb2dzLgorICAgICAgUGxlYXNlIHVuY29tbWVudCB0aGUgcmVzcGVjdGl2ZSBhcHBlbmRlciBpbiBsb2diYWNrLnhtbCBmaWxlIHRvIG1ha2UgbG9ncyBmbG93IGludG8gdGhpcyB0YWJsZS4gVGhpcyBmZWF0dXJlIGlzIHR1cm5lZCBvZmYgYnkgZGVmYXVsdC4KKyAgICAtIEFkZGVkIG5ldyBDUUwgdGFibGUgcHJvcGVydHkgJ2luY3JlbWVudGFsX2JhY2t1cHMnIHdoaWNoIGlzIGJ5IGRlZmF1bHQgdHJ1ZS4gV2hlbiAnaW5jcmVtZW50YWxfYmFja3VwcycgcHJvcGVydHkgaW4gY2Fzc2FuZHJhLnlhbWwKKyAgICAgIGlzIHNldCB0byB0cnVlIGFuZCB0YWJsZSBwcm9wZXJ0eSBpcyBzZXQgdG8gZmFsc2UsIGluY3JlbWVudGFsIGJhY2t1cHMgZm9yIHRoYXQgc3BlY2lmaWMgdGFibGUgd2lsbCBub3QgYmUgZG9uZS4KKyAgICAgIFdoZW4gJ2luY3JlbWVudGFsX2JhY2t1cHMnIGluIGNhc2FuZHJhLnlhbWwgaXMgc2V0IHRvIGZhbHNlLCB0aGUgbmV3bHkgYWRkZWQgdGFibGUgcHJvcGVydHkgZG9lcyBub3QgaGF2ZSBhbnkgZWZmZWN0LgorICAgICAgQm90aCBwcm9wZXJ0aWVzIGhhdmUgdG8gYmUgc2V0IHRvIHRydWUgKGNhc3NhbmRyYS55YW1sIGFuZCB0YWJsZSBwcm9wZXJ0eSkgaW4gb3JkZXIgdG8gbWFrZSBpbmNyZW1lbnRhbCBiYWNrdXBzLgorICAgIC0gQWRkZWQgbmV3IENRTCBuYXRpdmUgc2NhbGFyIGZ1bmN0aW9ucyBmb3IgY29sbGVjdGlvbnMuIFRoZSBuZXcgZnVuY3Rpb25zIGFyZSBtb3N0bHkgYW5hbG9nb3VzIHRvIHRoZSBleGlzdGluZworICAgICAgYWdncmVnYXRpb24gZnVuY3Rpb25zLCBidXQgdGhleSBvcGVyYXRlIG9uIHRoZSBlbGVtZW50cyBvZiBjb2xsZWN0aW9uIGNvbHVtbnMuIFRoZSBuZXcgZnVuY3Rpb25zIGFyZSBgbWFwX2tleXNgLAorICAgICAgYG1hcF92YWx1ZXNgLCBgY29sbGVjdGlvbl9jb3VudGAsIGBjb2xsZWN0aW9uX21pbmAsIGBjb2xsZWN0aW9uX21heGAsIGBjb2xsZWN0aW9uX3N1bWAgYW5kIGBjb2xsZWN0aW9uX2F2Z2AuCisgICAgLSBBZGRlZCBjb21wYWN0aW9uX3Byb3BlcnRpZXMgY29sdW1uIHRvIHN5c3RlbS5jb21wYWN0aW9uX2hpc3RvcnkgdGFibGUgYW5kIG5vZGV0b29sIGNvbXBhY3Rpb25oaXN0b3J5IGNvbW1hbmQKKyAgICAtIFNpbXBsZVNlZWRQcm92aWRlciBjYW4gcmVzb2x2ZSBtdWx0aXBsZSBJUCBhZGRyZXNzZXMgcGVyIEROUyByZWNvcmQuIFNpbXBsZVNlZWRQcm92aWRlciByZWFjdHMgb24KKyAgICAgIHRoZSBwYXJhbWF0ZXIgY2FsbGVkIGByZXNvbHZlX211bHRpcGxlX2lwX2FkZHJlc3Nlc19wZXJfZG5zX3JlY29yZGAgd2hpY2ggdmFsdWUgaXMgbWVhbnQgdG8gYmUgYm9vbGVhbiBhbmQgYnkKKyAgICAgIGRlZmF1bHQgaXQgaXMgc2V0IHRvIGZhbHNlLiBXaGVuIHNldCB0byB0cnVlLCBTaW1wbGVTZWVkUHJvdmlkZXIgd2lsbCByZXNvbHZlIGFsbCBJUCBhZGRyZXNzZXMgcGVyIEROUyByZWNvcmQsCisgICAgICBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCBuYW1lIHNlcnZpY2Ugb24gdGhlIHN5c3RlbS4KKyAgICAtIEFkZGVkIG5ldyBuYXRpdmUgQ1FMIGZ1bmN0aW9ucyBmb3IgZGF0YSBtYXNraW5nLCBhbGxvd2luZyB0byByZXBsYWNlIG9yIG9ic2N1cmUgc2Vuc2l0aXZlIGRhdGEuIFRoZSBmdW5jdGlvbnMgYXJlOgorICAgICAgLSBgbWFza19udWxsYCByZXBsYWNlcyB0aGUgY29sdW1uIHZhbHVlIGJ5IG51bGwuCisgICAgICAtIGBtYXNrX2RlZmF1bHRgIHJlcGxhY2VzIHRoZSBkYXRhIGJ5IGEgZml4ZWQgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgc2FtZSB0eXBlLgorICAgICAgLSBgbWFza19yZXBsYWNlYCByZXBsYWNlcyB0aGUgZGF0YSBieSBhIGN1c3RvbSB2YWx1ZS4KKyAgICAgIC0gYG1hc2tfaW5uZXJgIHJlcGxhY2VzIGV2ZXJ5IGNoYXJhY3RlciBidXQgdGhlIGZpcnN0IGFuZCBsYXN0IG9uZXMgYnkgYSBmaXhlZCBjaGFyYWN0ZXIuCisgICAgICAtIGBtYXNrX291dGVyYCByZXBsYWNlcyB0aGUgZmlyc3QgYW5kIGxhc3QgY2hhcmFjdGVycyBieSBhIGZpeGVkIGNoYXJhY3Rlci4KKyAgICAgIC0gYG1hc2tfaGFzaGAgcmVwbGFjZXMgdGhlIGRhdGEgYnkgaXRzIGhhc2gsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobS4KKyAgICAtIE9uIHZpcnR1YWwgdGFibGVzLCBpdCBpcyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgYEFMTE9XIEZJTFRFUklOR2AgZm9yIHNlbGVjdCBzdGF0ZW1lbnRzIHdoaWNoIHdvdWxkCisgICAgICBub3JtYWxseSByZXF1aXJlIGl0LCBleGNlcHQgYHN5c3RlbV92aWV3cy5zeXN0ZW1fbG9nc2AuCisgICAgLSBNb3JlIGFjY3VyYXRlIHNraXBwaW5nIG9mIHNzdGFibGVzIGluIHJlYWQgcGF0aCBkdWUgdG8gYmV0dGVyIGhhbmRsaW5nIG9mIG1pbi9tYXggY2x1c3RlcmluZyBhbmQgbG93ZXIgYm91bmQ7CisgICAgICBTU1RhYmxlIGZvcm1hdCBoYXMgYmVlbiBidW1wZWQgdG8gJ25jJyBiZWNhdXNlIHRoZXJlIGFyZSBuZXcgZmllbGRzIGluIHN0YXRzIG1ldGFkYXRhXAorICAgIC0gQWRkZWQgTWF4U1NUYWJsZVNpemUgYW5kIE1heFNTVGFibGVEdXJhdGlvbiBtZXRyaWNzIHRvIFRhYmxlTWV0cmljcy4gVGhlIGZvcm1lciByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBiaWdnZXN0IAorICAgICAgU1NUYWJsZSBvZiBhIHRhYmxlIG9yIDAgd2hlbiB0aGVyZSBpcyBub3QgYW55IFNTVGFibGUuIFRoZSBsYXR0ZXIgcmV0dXJucyB0aGUgbWF4aW11bSBkdXJhdGlvbiwgY29tcHV0ZWQgYXMgCisgICAgICBgbWF4VGltZXN0YW1wIC0gbWluVGltZXN0YW1wYCwgZWZmZWN0aXZlbHkgbm9uLXplcm8gZm9yIFNTVGFibGVzIHByb2R1Y2VkIGJ5IFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kuCisgICAgLSBBZGRlZCBsb2NhbCByZWFkL3dyaXRlIHJhdGlvIHRvIHRhYmxlc3RhdHMuCisgICAgLSBBZGRlZCBzeXN0ZW1fdmlld3MubWF4X3NzdGFibGVfc2l6ZSBhbmQgc3lzdGVtX3ZpZXdzLm1heF9zc3RhYmxlX2R1cmF0aW9uIHRhYmxlcy4KKyAgICAtIEFkZGVkIHZpcnR1YWwgdGFibGUgc3lzdGVtX3ZpZXdzLnNuYXBzaG90cyB0byBzZWUgYWxsIHNuYXBzaG90cyBmcm9tIENRTCBzaGVsbC4KKyAgICAtIEFkZGVkIHN1cHBvcnQgZm9yIGF0dGFjaGluZyBDUUwgZHluYW1pYyBkYXRhIG1hc2tpbmcgZnVuY3Rpb25zIHRvIHRhYmxlIGNvbHVtbnMgb24gdGhlIHNjaGVtYS4gVGhlc2UgbWFza2luZworICAgICAgZnVuY3Rpb25zIGNhbiBiZSBhdHRhY2hlZCB0byBvciBkZXR0YWNoZWQgZnJvbSBjb2x1bW5zIHdpdGggQ1JFQVRFL0FMVEVSIFRBQkxFIHN0YXRlbWVudHMuIFRoZSBmdW5jdGlvbnMgb2JzY3VyZQorICAgICAgdGhlIG1hc2tlZCBkYXRhIGR1cmluZyBxdWVyaWVzLCBidXQgdGhleSBkb24ndCBjaGFuZ2UgdGhlIHN0b3JlZCBkYXRhLgorICAgIC0gQWRkZWQgbmV3IFVOTUFTSyBwZXJtaXNzaW9uLiBJdCBhbGxvd3MgdG8gc2VlIHRoZSBjbGVhciBkYXRhIG9mIGNvbHVtbnMgd2l0aCBhbiBhdHRhY2hlZCBtYXNrLiBTdXBlcnVzZXJzIGhhdmUgaXQKKyAgICAgIGJ5IGRlZmF1bHQsIHdoZXJlYXMgcmVndWxhciB1c2VycyBkb24ndCBoYXZlIGl0IGJ5IGRlZmF1bHQuCisgICAgLSBBZGRlZCBuZXcgU0VMRUNUX01BU0tFRCBwZXJtaXNzaW9uLiBJdCBhbGxvd3MgdG8gcnVuIFNFTEVDVCBxdWVyaWVzIHNlbGVjdGluZyB0aGUgY2xlYXIgdmFsdWVzIG9mIG1hc2tlZCBjb2x1bW5zLgorICAgICAgU3VwZXJ1c2VycyBoYXZlIGl0IGJ5IGRlZmF1bHQsIHdoZXJlYXMgcmVndWxhciB1c2VycyBkb24ndCBoYXZlIGl0IGJ5IGRlZmF1bHQuCisgICAgLSBBZGRlZCBzdXBwb3J0IGZvciB1c2luZyBVREZzIGFzIG1hc2tpbmcgZnVuY3Rpb25zIGF0dGFjaGVkIHRvIHRhYmxlIGNvbHVtbnMgb24gdGhlIHNjaGVtYS4KKyAgICAtIEFkZGVkIGBzc3RhYmxlcGFydGl0aW9uc2Agb2ZmbGluZSB0b29sIHRvIGZpbmQgbGFyZ2UgcGFydGl0aW9ucyBpbiBzc3RhYmxlcy4KKyAgICAtIGBjYXNzYW5kcmEtc3RyZXNzYCBoYXMgYSBuZXcgb3B0aW9uIGNhbGxlZCAnLWpteCcgd2hpY2ggZW5hYmxlcyBhIHVzZXIgdG8gcGFzcyB1c2VybmFtZSBhbmQgcGFzc3dvcmQgdG8gSk1YIChDQVNTQU5EUkEtMTg1NDQpCisgICAgLSBJdCBpcyBwb3NzaWJsZSB0byByZWFkIGFsbCBjcmVkZW50aWFscyBmb3IgYGNhc3NhbmRyYS1zdHJlc3NgIGZyb20gYSBmaWxlIHZpYSBvcHRpb24gYC1jcmVkZW50aWFscy1maWxlYCAoQ0FTU0FORFJBLTE4NTQ0KQogCiBVcGdyYWRpbmcKIC0tLS0tLS0tLQorICAgIC0gRXBoZW1lcmFsIG1hcmtlciBmaWxlcyBmb3Igc25hcHNob3RzIGRvbmUgYnkgcmVwYWlycyBhcmUgbm90IGNyZWF0ZWQgYW55bW9yZSwKKyAgICAgIHRoZXJlIGlzIGEgZGVkaWNhdGVkIGZsYWcgaW4gc25hcHNob3QgbWFuaWZlc3QgaW5zdGVhZC4gT24gdXBncmFkZSBvZiBhIG5vZGUgdG8gdGhpcyB2ZXJzaW9uLCBvbiBub2RlJ3Mgc3RhcnQsIGluIGNhc2UgdGhlcmUKKyAgICAgIGFyZSBzdWNoIGVwaGVtZXJhbCBzbmFwc2hvdHMgb24gZGlzaywgdGhleSB3aWxsIGJlIGRlbGV0ZWQgKHNhbWUgYmVoYXZpb3VyIGFzIGJlZm9yZSkgYW5kIGFueSBuZXcgZXBoZW1lcmFsIHNuYXBzaG90cworICAgICAgd2lsbCBzdG9wIHRvIGNyZWF0ZSBlcGhlbWVyYWwgbWFya2VyIGZpbGVzIGFzIGZsYWcgaW4gYSBzbmFwc2hvdCBtYW5pZmVzdCB3YXMgaW50cm9kdWNlZCBpbnN0ZWFkLgorICAgIC0gVGhlcmUgd2VyZSBuZXcgdGFibGUgcHJvcGVydGllcyBpbnRyb2R1Y2VkIGNhbGxlZCAnYWxsb3dfYXV0b19zbmFwc2hvdCcgYW5kICdpbmNyZW1lbnRhbF9iYWNrdXBzJyAoc2VlIHNlY3Rpb24gJ05ldyBmZWF0dXJlcycpLiBIZW5jZSwgdXBncmFkZWQKKyAgICAgIG5vZGUgd2lsbCBiZSBvbiBhIG5ldyBzY2hlbWEgdmVyc2lvbi4gUGxlYXNlIGRvIGEgcm9sbGluZyB1cGdyYWRlIG9mIG5vZGVzIG9mIGEgY2x1c3RlciB0byBjb252ZXJnZSB0byBvbmUgc2NoZW1hIHZlcnNpb24uCiAgICAgLSBBbGwgcHJldmlvdXMgdmVyc2lvbnMgb2YgNC54IGNvbnRhaW5lZCBhIG1pc3Rha2Ugb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBvbGQgQ1FMIG5hdGl2ZSBwcm90b2NvbCB2My4gVGhhdAogICAgICBtaXN0YWtlIHByb2R1Y2VkIGlzc3VlcyB3aGVuIHBhZ2luZyBvdmVyIHRhYmxlcyB3aXRoIGNvbXBhY3Qgc3RvcmFnZSBhbmQgYSBzaW5nbGUgY2x1c3RlcmluZyBjb2x1bW4gZHVyaW5nIHJvbGxpbmcKICAgICAgdXBncmFkZXMgaW52b2x2aW5nIDMueCBhbmQgNC54IG5vZGVzLiBUaGUgZml4IGZvciB0aGF0IGlzc3VlIG1ha2VzIGl0IGNhbiBub3cgYXBwZWFyIGR1cmluZyByb2xsaW5nIHVwZ3JhZGVzIGZyb20KICAgICAgNC4xLjAgb3IgNC4wLjAtNC4wLjcuIElmIHRoYXQgaXMgeW91ciBjYXNlLCBwbGVhc2UgdXNlIHByb3RvY29sIHY0IG9yIGhpZ2hlciBpbiB5b3VyIGRyaXZlci4gU2VlIENBU1NBTkRSQS0xNzUwNwogICAgICBmb3IgZnVydGhlciBkZXRhaWxzLgorICAgLSBBZGRlZCBBUEkgZm9yIGFsdGVybmF0aXZlIHNzdGFibGUgaW1wbGVtZW50YXRpb25zLiBGb3IgZGV0YWlscywgc2VlIHNyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZV9BUEkubWQKKyAgIC0gRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSB3YXMgcmVtb3ZlZC4gUGxlYXNlIGNoYW5nZSB0aGUgY29tcGFjdGlvbiBzdHJhdGVneSBmb3IgdGhlIHRhYmxlcyB1c2luZyB0aGlzIHN0cmF0ZWd5CisgICAgIHRvIFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kgYmVmb3JlIHVwZ3JhZGluZyB0byB0aGlzIHZlcnNpb24uCisgICAtIFRoZSBkZXByZWNhdGVkIGZ1bmN0aW9ucyBgZGF0ZU9mYCBhbmQgYHVuaXhUaW1lc3RhbXBPZmAgaGF2ZSBiZWVuIHJlbW92ZWQuIFRoZXkgd2VyZSBkZXByZWNhdGVkIGFuZCByZXBsYWNlZCBieQorICAgICBgdG9UaW1lc3RhbXBgIGFuZCBgdG9Vbml4VGltZXN0YW1wYCBpbiBDYXNzYW5kcmEgMi4yLgorICAgLSBIYWRvb3AgaW50ZWdyYXRpb24gaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSAoQ0FTU0FORFJBLTE4MzIzKS4gSWYgeW91IHdhbnQgdG8gcHJvY2VzcyBDYXNzYW5kcmEgZGF0YSBieSBiaWcgZGF0YSBmcmFtZXdvcmtzLCAKKyAgICAgcGxlYXNlIHVwZ3JhZGUgeW91ciBpbmZyYXN0cnVjdHVyZSB0byB1c2UgQ2Fzc2FuZHJhIFNwYXJrIGNvbm5lY3Rvci4KKyAgIC0gS2V5c3RvcmUvdHJ1c3RzdG9yZSBwYXNzd29yZCBjb25maWd1cmF0aW9ucyBhcmUgbnVsbGFibGUgbm93IGFuZCB0aGUgY29kZSBkZWZhdWx0cyBvZiB0aG9zZSBwYXNzd29yZHMgdG8gJ2Nhc3NhbmRyYScgYXJlCisgICAgIHJlbW92ZWQuIEFueSBkZXBsb3ltZW50cyB0aGF0IGRlcGVuZCB1cG9uIHRoZSBjb2RlIGRlZmF1bHQgdG8gdGhpcyBwYXNzd29yZCB2YWx1ZSB3aXRob3V0IGV4cGxpY2l0bHkgc3BlY2lmeWluZworICAgICBpdCBpbiBjYXNzYW5kcmEueWFtbCB3aWxsIGZhaWwgb24gdXBncmFkZS4gUGxlYXNlIHNwZWNpZnkgeW91ciBrZXlzdG9yZV9wYXNzd29yZCBhbmQgdHJ1c3RzdG9yZV9wYXNzd29yZCBlbGVtZW50cyBpbiBjYXNzYW5kcmEueWFtbCB3aXRoIGFwcHJvcHJpYXRlCisgICAgIHZhbHVlcyB0byBwcmV2ZW50IHRoaXMgZmFpbHVyZS4KIAogRGVwcmVjYXRpb24KIC0tLS0tLS0tLS0tCi0gICAgLSBIYWRvb3AgaW50ZWdyYXRpb24gaW4gcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oYWRvb3AgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGFjdGl2ZWx5IG1haW50YWluZWQuCi0gICAgICBUaGlzIGNvZGUgaXMgc2NoZWR1bGVkIHRvIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBDYXNzYW5kcmEuCisgICAgLSBJbiB0aGUgSk1YIE1CZWFuIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjp0eXBlPVJlcGFpclNlcnZpY2VgIChDQVNTQU5EUkEtMTc2NjgpOgorICAgICAgICAtIGRlcHJlY2F0ZSB0aGUgZ2V0dGVyL3NldHRlciBtZXRob2RzIGBnZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1lYmlieXRlc2AgYW5kIGBzZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1lYmlieXRlc2AKKyAgICAgICAgICBpbiBmYXZvciBvZiBgZ2V0UmVwYWlyU2Vzc2lvblNwYWNlSW5NaUJgIGFuZCBgc2V0UmVwYWlyU2Vzc2lvblNwYWNlSW5NaUJgIHJlc3BlY3RpdmVseQorICAgIC0gSW4gdGhlIEpNWCBNQmVhbiBgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGI6dHlwZT1TdG9yYWdlU2VydmljZWAgKENBU1NBTkRSQS0xNzY2OCk6CisgICAgICAgIC0gZGVwcmVjYXRlIHRoZSBnZXR0ZXIvc2V0dGVyIG1ldGhvZHMgYGdldFJlcGFpclNlc3Npb25NYXhUcmVlRGVwdGhgIGFuZCBgc2V0UmVwYWlyU2Vzc2lvbk1heFRyZWVEZXB0aGAKKyAgICAgICAgICBpbiBmYXZvciBvZiBgZ2V0UmVwYWlyU2Vzc2lvbk1heGltdW1UcmVlRGVwdGhgIGFuZCBgc2V0UmVwYWlyU2Vzc2lvbk1heGltdW1UcmVlRGVwdGhgCisgICAgICAgIC0gZGVwcmVjYXRlIHRoZSBzZXR0ZXIgbWV0aG9kIGBzZXRDb2x1bW5JbmRleFNpemVgIGluIGZhdm9yIG9mIGBzZXRDb2x1bW5JbmRleFNpemVJbktpQmAKKyAgICAgICAgLSBkZXByZWNhdGUgdGhlIGdldHRlci9zZXR0ZXIgbWV0aG9kcyBgZ2V0Q29sdW1uSW5kZXhDYWNoZVNpemVgIGFuZCBgc2V0Q29sdW1uSW5kZXhDYWNoZVNpemVgIGluIGZhdm9yIG9mCisgICAgICAgICAgYGdldENvbHVtbkluZGV4Q2FjaGVTaXplSW5LaUJgIGFuZCBgc2V0Q29sdW1uSW5kZXhDYWNoZVNpemVJbktpQmAgcmVzcGVjdGl2ZWx5CisgICAgICAgIC0gZGVwcmVjYXRlIHRoZSBnZXR0ZXIvc2V0dGVyIG1ldGhvZHMgYGdldEJhdGNoU2l6ZVdhcm5UaHJlc2hvbGRgIGFuZCBgc2V0QmF0Y2hTaXplV2FyblRocmVzaG9sZGAgaW4gZmF2b3Igb2YKKyAgICAgICAgICBgZ2V0QmF0Y2hTaXplV2FyblRocmVzaG9sZEluS2lCYCBhbmQgYHNldEJhdGNoU2l6ZVdhcm5UaHJlc2hvbGRJbktpQmAgcmVzcGVjdGl2ZWx5CisgICAgLSBBbGwgbmF0aXZlIENRTCBmdW5jdGlvbnMgbmFtZXMgdGhhdCBkb24ndCB1c2UgdGhlIHNuYWtlIGNhc2UgbmFtZXMgYXJlIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGVxdWl2YWxlbnQgbmFtZXMKKyAgICAgIHVzaW5nIHNuYWtlIGNhc2luZy4gVGh1cywgYHRvdGltZXN0YW1wYCBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBgdG9fdGltZXN0YW1wYCwgYGludGFzYmxvYmAgaW4gZmF2b3VyCisgICAgICBvZiBgaW50X2FzX2Jsb2JgLCBgY2FzdEFzSW50YCBpbiBmYXZvdXIgb2YgYGNhc3RfYXNfaW50YCwgZXRjLgorICAgIC0gVGhlIGNvbmZpZyBwcm9wZXJ0eSBgY29tcGFjdGlvbl9sYXJnZV9wYXJ0aXRpb25fd2FybmluZ190aHJlc2hvbGRgIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIHRoZSBuZXcKKyAgICAgIGd1YXJkcmFpbCBmb3IgcGFydGl0aW9uIHNpemUuIFRoYXQgZ3VhcmRyYWlsIGlzIGJhc2VkIG9uIHRoZSBwcm9wZXJ0aWVzIGBwYXJ0aXRpb25fc2l6ZV93YXJuX3RocmVzaG9sZGAgYW5kCisgICAgICBgcGFydGl0aW9uX3NpemVfZmFpbF90aHJlc2hvbGRgLiBUaGUgd2FybiB0aHJlc2hvbGQgaGFzIGEgdmVyeSBzaW1pbGFyIGJlaGF2aW91ciB0byB0aGUgb2xkIGNvbmZpZyBwcm9wZXJ0eS4KIAogNC4xCiA9PT0KQEAgLTQxNiw3ICs1MzUsNyBAQAogICAgIC0gTmF0aXZlIHByb3RvY29sIHY1IGlzIHByb21vdGVkIGZyb20gYmV0YSBpbiB0aGlzIHJlbGVhc2UuIFRoZSB3aXJlIGZvcm1hdCBoYXMgY2hhbmdlZAogICAgICAgc2lnbmlmaWNhbnRseSBhbmQgdXNlcnMgc2hvdWxkIHRha2UgY2FyZSB0byBlbnN1cmUgY2xpZW50IGRyaXZlcnMgYXJlIHVwZ3JhZGVkIHRvIGEgdmVyc2lvbgogICAgICAgd2l0aCBzdXBwb3J0IGZvciB0aGUgZmluYWwgdjUgZm9ybWF0LCBpZiBjdXJyZW50bHkgY29ubmVjdGluZyBvdmVyIHY1LWJldGEuIChDQVNTQU5EUkEtMTUyOTksIENBU1NBTkRSQS0xNDk3MykKLSAgICAtIENhc3NhbmRyYSByZW1vdmVkIHN1cHBvcnQgZm9yIHRoZSBPbGROZXR3b3JrVG9wb2xvZ3lTdHJhdGVneS4gQmVmb3JlIHVwZ3JhZGluZyB5b3Ugd2lsbCBuZWVkIHRvIGNoYW5nZSB0aGUgCisgICAgLSBDYXNzYW5kcmEgcmVtb3ZlZCBzdXBwb3J0IGZvciB0aGUgT2xkTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3kuIEJlZm9yZSB1cGdyYWRpbmcgeW91IHdpbGwgbmVlZCB0byBjaGFuZ2UgdGhlCiAgICAgICByZXBsaWNhdGlvbiBzdHJhdGVneSBmb3IgdGhlIGtleXNwYWNlcyB1c2luZyB0aGlzIHN0cmF0ZWd5IHRvIHRoZSBOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneS4gKENBU1NBTkRSQS0xMzk5MCkKICAgICAtIFNzdGFibGVzIGZvciB0YWJsZXMgdXNpbmcgd2l0aCBhIGZyb3plbiBVRFQgd3JpdHRlbiBieSBDKiAzLjAgYXBwZWFyIGFzIGNvcnJ1cHRlZC4KIApAQCAtNTU5LDcgKzY3OCw3IEBACiAgICAgICB0aGUgbm9kZSB3aWxsIG5vdCBzdGFydC4gU2VlIENBU1NBTkRSQS0xNDQ3NyBmb3IgZGV0YWlscy4KICAgICAtIENBU1NBTkRSQS0xMzcwMSBUbyBnaXZlIGEgYmV0dGVyIG91dCBvZiB0aGUgYm94IGV4cGVyaWVuY2UsIHRoZSBkZWZhdWx0ICdudW1fdG9rZW5zJwogICAgICAgdmFsdWUgaGFzIGJlZW4gY2hhbmdlZCBmcm9tIDI1NiB0byAxNiBmb3IgcmVhc29ucyBkZXNjcmliZWQgaW4KLSAgICAgIGh0dHBzOi8vY2Fzc2FuZHJhLmFwYWNoZS5vcmcvZG9jL2xhdGVzdC9nZXR0aW5nX3N0YXJ0ZWQvcHJvZHVjdGlvbi5odG1sI3Rva2VucworICAgICAgaHR0cHM6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZy9kb2MvbGF0ZXN0L2dldHRpbmctc3RhcnRlZC9wcm9kdWN0aW9uLmh0bWwjdG9rZW5zCiAgICAgICAnYWxsb2NhdGVfdG9rZW5zX2Zvcl9sb2NhbF9yZXBsaWNhdGlvbl9mYWN0b3InIGlzIGFsc28gdW5jb21tZW50ZWQgYW5kIHNldCB0byAzLgogICAgICAgUGxlYXNlIG5vdGUgd2hlbiB1cGdyYWRpbmcgdGhhdCBpZiB0aGUgJ251bV90b2tlbnMnIHZhbHVlIGlzIGRpZmZlcmVudCB0aGFuIHdoYXQgeW91IGhhdmUKICAgICAgIGNvbmZpZ3VyZWQsIHRoZSB1cGdyYWRlZCBub2RlIHdpbGwgcmVmdXNlIHRvIHN0YXJ0LiBBbHNvIG5vdGUgdGhhdCBpZiBhIG5ldyBub2RlIGpvaW5pbmcKQEAgLTYxNCw3ICs3MzMsNyBAQAogICAgICAgcmVhc29uLCBhIG9wdC1pbiBzeXN0ZW0gcHJvcGVydHkgaGFzIGJlZW4gYWRkZWQgdG8gZGlzYWJsZSB0aGUgZml4OgogICAgICAgICAtRGNhc3NhbmRyYS51bnNhZmUuZGlzYWJsZS1zZXJpYWwtcmVhZHMtbGluZWFyaXphYmlsaXR5PXRydWUKICAgICAgIFVzZSB0aGlzIGZsYWcgYXQgeW91ciBvd24gcmlzayBhcyBpdCByZXZlcnQgU0VSSUFMIHJlYWRzIHRvIHRoZSBpbmNvcnJlY3QgYmVoYXZpb3Igb2YKLSAgICAgIHByZXZpb3VzIHZlcnNpb25zLiBTZWUgQ0FTU0FORFJBLTEyMTI2IGZvciBkZXRhaWxzLiAKKyAgICAgIHByZXZpb3VzIHZlcnNpb25zLiBTZWUgQ0FTU0FORFJBLTEyMTI2IGZvciBkZXRhaWxzLgogICAgIC0gU0FTSSdzIGBtYXhfY29tcGFjdGlvbl9mbHVzaF9tZW1vcnlfaW5fbWJgIHNldHRpbmcgd2FzIHByZXZpb3VzbHkgZ2V0dGluZyBpbnRlcnByZXRlZCBpbiBieXRlcy4gRnJvbSAzLjExLjgKICAgICAgIGl0IGlzIGNvcnJlY3RseSBpbnRlcnByZXRlZCBpbiBtZWdhYnl0ZXMsIGJ1dCBwcmlvciB0byAzLjExLjEwIHByZXZpb3VzIGNvbmZpZ3VyYXRpb25zIG9mIHRoaXMgc2V0dGluZyB3aWxsCiAgICAgICBsZWFkIHRvIG5vZGVzIE9PTSBkdXJpbmcgY29tcGFjdGlvbi4gRnJvbSAzLjExLjEwIHByZXZpb3VzIGNvbmZpZ3VyYXRpb25zIHdpbGwgYmUgZGV0ZWN0ZWQgYXMgaW5jb3JyZWN0LApAQCAtNzExLDcgKzgzMCw3IEBACiAgICAgICBTdGFydGluZyB2ZXJzaW9uIDUuMCwgQ09NUEFDVCBTVE9SQUdFIHdpbGwgbm8gbG9uZ2VyIGJlIHN1cHBvcnRlZC4KICAgICAgICdBTFRFUiAuLi4gRFJPUCBDT01QQUNUIFNUT1JBR0UnIHN0YXRlbWVudCBtYWtlcyBDb21wYWN0IFRhYmxlcyBDUUwtY29tcGF0aWJsZSwKICAgICAgIGV4cG9zaW5nIGludGVybmFsIHN0cnVjdHVyZSBvZiBUaHJpZnQvQ29tcGFjdCBUYWJsZXMuIFlvdSBjYW4gZmluZCBtb3JlIGRldGFpbHMKLSAgICAgIG9uIGV4cG9zZWQgaW50ZXJuYWwgc3RydWN0dXJlIHVuZGVyOiAKKyAgICAgIG9uIGV4cG9zZWQgaW50ZXJuYWwgc3RydWN0dXJlIHVuZGVyOgogICAgICAgaHR0cDovL2Nhc3NhbmRyYS5hcGFjaGUub3JnL2RvYy9sYXRlc3QvY3FsL2FwcGVuZGljZXMuaHRtbCNhcHBlbmRpeC1jLWRyb3BwaW5nLWNvbXBhY3Qtc3RvcmFnZQogCiAgICAgICBGb3IgdW5pbnRlcnJ1cHRlZCBjbHVzdGVyIHVwZ3JhZGVzLCBkcml2ZXJzIG5vdyBzdXBwb3J0ICdOT19DT01QQUNUJyBzdGFydHVwIG9wdGlvbi4KZGlmZiAtLWdpdCBhL1JFQURNRS5hc2MgYi9SRUFETUUuYXNjCmluZGV4IGY0ODRhYTIuLjE2ZDVlMDkgMTAwNjQ0Ci0tLSBhL1JFQURNRS5hc2MKKysrIGIvUkVBRE1FLmFzYwpAQCAtOSw2ICs5LDggQEAKIAogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vY2Fzc2FuZHJhLmFwYWNoZS5vcmcvW3RoZSBBcGFjaGUgQ2Fzc2FuZHJhIHdlYiBzaXRlXS4KIAorSXNzdWVzIHNob3VsZCBiZSByZXBvcnRlZCBvbiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvcHJvamVjdHMvQ0FTU0FORFJBL2lzc3Vlcy9bVGhlIENhc3NhbmRyYSBKaXJhXS4KKwogUmVxdWlyZW1lbnRzCiAtLS0tLS0tLS0tLS0KIC4gSmF2YSA+PSAxLjggKE9wZW5KREsgYW5kIE9yYWNsZSBKVk1TIGhhdmUgYmVlbiB0ZXN0ZWQpCkBAIC0xOCw3ICsyMCw3IEBACiAtLS0tLS0tLS0tLS0tLS0KIAogVGhpcyBzaG9ydCBndWlkZSB3aWxsIHdhbGsgeW91IHRocm91Z2ggZ2V0dGluZyBhIGJhc2ljIG9uZSBub2RlIGNsdXN0ZXIgdXAKLWFuZCBydW5uaW5nLCBhbmQgZGVtb25zdHJhdGUgc29tZSBzaW1wbGUgcmVhZHMgYW5kIHdyaXRlcy4gRm9yIGEgbW9yZS1jb21wbGV0ZSBndWlkZSwgcGxlYXNlIHNlZSB0aGUgQXBhY2hlIENhc3NhbmRyYSB3ZWJzaXRlJ3MgaHR0cDovL2Nhc3NhbmRyYS5hcGFjaGUub3JnL2RvYy9sYXRlc3QvZ2V0dGluZ19zdGFydGVkL1tHZXR0aW5nIFN0YXJ0ZWQgR3VpZGVdLgorYW5kIHJ1bm5pbmcsIGFuZCBkZW1vbnN0cmF0ZSBzb21lIHNpbXBsZSByZWFkcyBhbmQgd3JpdGVzLiBGb3IgYSBtb3JlLWNvbXBsZXRlIGd1aWRlLCBwbGVhc2Ugc2VlIHRoZSBBcGFjaGUgQ2Fzc2FuZHJhIHdlYnNpdGUncyBodHRwOi8vY2Fzc2FuZHJhLmFwYWNoZS5vcmcvZG9jL2xhdGVzdC9nZXR0aW5nLXN0YXJ0ZWQvW0dldHRpbmcgU3RhcnRlZCBHdWlkZV0uCiAKIEZpcnN0LCB3ZSdsbCB1bnBhY2sgb3VyIGFyY2hpdmU6CiAKQEAgLTM5LDcgKzQxLDcgQEAKIAogLS0tLQogQ29ubmVjdGVkIHRvIFRlc3QgQ2x1c3RlciBhdCBsb2NhbGhvc3Q6OTE2MC4KLVtjcWxzaCA2LjAuMCB8IENhc3NhbmRyYSA0LjEgfCBDUUwgc3BlYyAzLjQuNiB8IE5hdGl2ZSBwcm90b2NvbCB2NV0KK1tjcWxzaCA2LjIuMCB8IENhc3NhbmRyYSA1LjAtU05BUFNIT1QgfCBDUUwgc3BlYyAzLjQuNyB8IE5hdGl2ZSBwcm90b2NvbCB2NV0KIFVzZSBIRUxQIGZvciBoZWxwLgogY3Fsc2g+CiAtLS0tCkBAIC03Niw4ICs3OCwxMCBAQAogCiBXb25kZXJpbmcgd2hlcmUgdG8gZ28gZnJvbSBoZXJlPwogCi0gICogSm9pbiB1cyBpbiAjY2Fzc2FuZHJhIG9uIHRoZSBodHRwczovL3MuYXBhY2hlLm9yZy9zbGFjay1pbnZpdGVbQVNGIFNsYWNrXSBhbmQgYXNrIHF1ZXN0aW9ucworICAqIEpvaW4gdXMgaW4gI2Nhc3NhbmRyYSBvbiB0aGUgaHR0cHM6Ly9zLmFwYWNoZS5vcmcvc2xhY2staW52aXRlW0FTRiBTbGFja10gYW5kIGFzayBxdWVzdGlvbnMuCiAgICogU3Vic2NyaWJlIHRvIHRoZSBVc2VycyBtYWlsaW5nIGxpc3QgYnkgc2VuZGluZyBhIG1haWwgdG8KLSAgICB1c2VyLXN1YnNjcmliZUBjYXNzYW5kcmEuYXBhY2hlLm9yZworICAgIHVzZXItc3Vic2NyaWJlQGNhc3NhbmRyYS5hcGFjaGUub3JnLgorICAqIFN1YnNjcmliZSB0byB0aGUgRGV2ZWxvcGVyIG1haWxpbmcgbGlzdCBieSBzZW5kaW5nIGEgbWFpbCB0bworICAgIGRldi1zdWJzY3JpYmVAY2Fzc2FuZHJhLmFwYWNoZS5vcmcuCiAgICogVmlzaXQgdGhlIGh0dHA6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZy9jb21tdW5pdHkvW2NvbW11bml0eSBzZWN0aW9uXSBvZiB0aGUgQ2Fzc2FuZHJhIHdlYnNpdGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gZ2V0dGluZyBpbnZvbHZlZC4KICAgKiBWaXNpdCB0aGUgaHR0cDovL2Nhc3NhbmRyYS5hcGFjaGUub3JnL2RvYy9sYXRlc3QvZGV2ZWxvcG1lbnQvaW5kZXguaHRtbFtkZXZlbG9wbWVudCBzZWN0aW9uXSBvZiB0aGUgQ2Fzc2FuZHJhIHdlYnNpdGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRyaWJ1dGUuCmRpZmYgLS1naXQgYS9URVNUSU5HLm1kIGIvVEVTVElORy5tZAppbmRleCAwZjI1NzQzLi5iOWM1YzdhIDEwMDY0NAotLS0gYS9URVNUSU5HLm1kCisrKyBiL1RFU1RJTkcubWQKQEAgLTM2NCwxNCArMzY0LDE0IEBACiAKIAogKipFeGFtcGxlLCBhbHRlcm5hdGl2ZSoqCi1gYGBqYXZheXkKK2BgYGphdmEKIGNsYXNzIFNvbWVWZXJiSGFuZGxlciBpbXBsZW1lbnRzIElWZXJiSGFuZGxlcjxTb21lTWVzc2FnZT4KIHsgCiAJQFZpc2libGVGb3JUZXN0aW5nCiAJcHJvdGVjdGVkIGJvb2xlYW4gaXNBbGl2ZShJbmV0QWRkcmVzcyBhZGRyKSB7IHJldHVybiBGYWlsdXJlRGV0ZWN0b3IuaW5zdGFuY2UuaXNBbGl2ZShtc2cucGF5bG9hZC5vdGhlck5vZGUpOyB9CiAKIAlAVmlzaWJsZUZvclRlc3RpbmcKLQlwcm90ZWN0ZWQgdm9pZCBzdHJlYW1Tb21ldGhpbmQoSW5ldEFkZHJlc3MgdG8pIHsgbmV3IFN0cmVhbVBsYW4odG8pLnJlcXVlc3RSYW5nZXMoc29tZVJhbmdlcykuZXhlY3V0ZSgpOyB9CisJcHJvdGVjdGVkIHZvaWQgc3RyZWFtU29tZXRoaW5nKEluZXRBZGRyZXNzIHRvKSB7IG5ldyBTdHJlYW1QbGFuKHRvKS5yZXF1ZXN0UmFuZ2VzKHNvbWVSYW5nZXMpLmV4ZWN1dGUoKTsgfQogCiAJQFZpc2libGVGb3JUZXN0aW5nCiAJcHJvdGVjdGVkIHZvaWQgY29tcGFjdFNvbWV0aGluZyhDb2x1bW5GYW1pbHlTdG9yZSBjZnMgKSB7IENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLnN1Ym1pdEJhY2tncm91bmQoKTsgfQpAQCAtNDA0LDcgKzQwNCw3IEBACiAJCXByb3RlY3RlZCBib29sZWFuIGlzQWxpdmUoSW5ldEFkZHJlc3MgYWRkcikgeyByZXR1cm4gYWxpdmU7IH0KIAkJCiAJCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBzdHJlYW1Tb21ldGhpbmQoSW5ldEFkZHJlc3MgdG8pIHsgc3RyZWFtQ2FsbGVkID0gdHJ1ZTsgfQorCQlwcm90ZWN0ZWQgdm9pZCBzdHJlYW1Tb21ldGhpbmcoSW5ldEFkZHJlc3MgdG8pIHsgc3RyZWFtQ2FsbGVkID0gdHJ1ZTsgfQogCiAJCUBPdmVycmlkZQogCQlwcm90ZWN0ZWQgdm9pZCBjb21wYWN0U29tZXRoaW5nKENvbHVtbkZhbWlseVN0b3JlIGNmcyApIHsgY29tcGFjdENhbGxlZCA9IHRydWU7IH0KZGlmZiAtLWdpdCBhL2Jpbi9jYXNzYW5kcmEuaW4uc2ggYi9iaW4vY2Fzc2FuZHJhLmluLnNoCmluZGV4IGRjYmQxMmQuLmRmYmI5NTkgMTAwNjQ0Ci0tLSBhL2Jpbi9jYXNzYW5kcmEuaW4uc2gKKysrIGIvYmluL2Nhc3NhbmRyYS5pbi5zaApAQCAtMTE0LDggKzExNCw5IEBACiBqYXZhX3Zlcl9vdXRwdXQ9YCIke0pBVkE6LWphdmF9IiAtdmVyc2lvbiAyPiYxYAoganZtdmVyPWBlY2hvICIkamF2YV92ZXJfb3V0cHV0IiB8IGdyZXAgJ1tvcGVuamRrfGphdmFdIHZlcnNpb24nIHwgYXdrIC1GJyInICdOUj09MSB7cHJpbnQgJDJ9JyB8IGN1dCAtZFwtIC1mMWAKIEpWTV9WRVJTSU9OPSR7anZtdmVyJV8qfQorc2hvcnQ9JChlY2hvICIke2p2bXZlcn0iIHwgY3V0IC1jMS0yKQogCi1KQVZBX1ZFUlNJT049MTEKK0pBVkFfVkVSU0lPTj0xNwogaWYgWyAiJEpWTV9WRVJTSU9OIiA9ICIxLjguMCIgXSAgOyB0aGVuCiAgICAgSlZNX1BBVENIX1ZFUlNJT049JHtqdm12ZXIjKl99CiAgICAgaWYgWyAiJEpWTV9WRVJTSU9OIiBcPCAiMS44IiBdIHx8IFsgIiRKVk1fVkVSU0lPTiIgXD4gIjEuOC4yIiBdIDsgdGhlbgpAQCAtMTMwLDYgKzEzMSwxMSBAQAogZWxpZiBbICIkSlZNX1ZFUlNJT04iIFw8ICIxMSIgXSA7IHRoZW4KICAgICBlY2hvICJDYXNzYW5kcmEgNC4wIHJlcXVpcmVzIGVpdGhlciBKYXZhIDggKHVwZGF0ZSAxNTEgb3IgbmV3ZXIpIG9yIEphdmEgMTEgKG9yIG5ld2VyKS4iCiAgICAgZXhpdCAxOworZWxpZiBbICIkc2hvcnQiID0gIjExIiBdICA7IHRoZW4KKyAgICAgSkFWQV9WRVJTSU9OPTExCitlbGlmIFsgIiRKVk1fVkVSU0lPTiIgXDwgIjE3IiBdIDsgdGhlbgorICAgIGVjaG8gIkNhc3NhbmRyYSA1LjAgcmVxdWlyZXMgSmF2YSAxMSBvciBKYXZhIDE3LiIKKyAgICBleGl0IDE7CiBmaQogCiBqdm09YGVjaG8gIiRqYXZhX3Zlcl9vdXRwdXQiIHwgZ3JlcCAtQSAxICdbb3Blbmpka3xqYXZhXSB2ZXJzaW9uJyB8IGF3ayAnTlI9PTIge3ByaW50ICQxfSdgCkBAIC0xNTMsNyArMTU5LDkgQEAKIAogIyBSZWFkIHVzZXItZGVmaW5lZCBKVk0gb3B0aW9ucyBmcm9tIGp2bS1zZXJ2ZXIub3B0aW9ucyBmaWxlCiBKVk1fT1BUU19GSUxFPSRDQVNTQU5EUkFfQ09ORi9qdm0ke2p2bW9wdGlvbnNfdmFyaWFudDotLWNsaWVudHN9Lm9wdGlvbnMKLWlmIFsgJEpBVkFfVkVSU0lPTiAtZ2UgMTEgXSA7IHRoZW4KK2lmIFsgJEpBVkFfVkVSU0lPTiAtZ2UgMTcgXSA7IHRoZW4KKyAgICBKVk1fREVQX09QVFNfRklMRT0kQ0FTU0FORFJBX0NPTkYvanZtMTcke2p2bW9wdGlvbnNfdmFyaWFudDotLWNsaWVudHN9Lm9wdGlvbnMKK2VsaWYgWyAkSkFWQV9WRVJTSU9OIC1nZSAxMSBdIDsgdGhlbgogICAgIEpWTV9ERVBfT1BUU19GSUxFPSRDQVNTQU5EUkFfQ09ORi9qdm0xMSR7anZtb3B0aW9uc192YXJpYW50Oi0tY2xpZW50c30ub3B0aW9ucwogZWxzZQogICAgIEpWTV9ERVBfT1BUU19GSUxFPSRDQVNTQU5EUkFfQ09ORi9qdm04JHtqdm1vcHRpb25zX3ZhcmlhbnQ6LS1jbGllbnRzfS5vcHRpb25zCmRpZmYgLS1naXQgYS9iaW4vY3Fsc2gucHkgYi9iaW4vY3Fsc2gucHkKaW5kZXggNmMxZTdiZC4uMGIwZWUzOSAxMDA3NTUKLS0tIGEvYmluL2NxbHNoLnB5CisrKyBiL2Jpbi9jcWxzaC5weQpAQCAtMSw0ICsxLDQgQEAKLSMhL3Vzci9iaW4vcHl0aG9uMworIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwogCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0xNiwyNiArMTYsMTAgQEAKICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotaW1wb3J0IGNtZAotaW1wb3J0IGNvZGVjcwotaW1wb3J0IGNvbmZpZ3BhcnNlcgotaW1wb3J0IGNzdgotaW1wb3J0IGVycm5vCi1pbXBvcnQgZ2V0cGFzcwotaW1wb3J0IG9wdHBhcnNlCiBpbXBvcnQgb3MKIGltcG9ydCBwbGF0Zm9ybQotaW1wb3J0IHJlCi1pbXBvcnQgc3RhdAotaW1wb3J0IHN1YnByb2Nlc3MKIGltcG9ydCBzeXMKLWltcG9ydCB0cmFjZWJhY2sKLWltcG9ydCB3YXJuaW5ncwotaW1wb3J0IHdlYmJyb3dzZXIKLWZyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKIGZyb20gZ2xvYiBpbXBvcnQgZ2xvYgotZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KLWZyb20gdXVpZCBpbXBvcnQgVVVJRAogCiBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDYpOgogICAgIHN5cy5leGl0KCJcbmNxbHNoIHJlcXVpcmVzIFB5dGhvbiAzLjYrXG4iKQpAQCAtNDQsNTAgKzI4LDkgQEAKIGlmIHBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbigpLnN0YXJ0c3dpdGgoJ0p5dGhvbicpOgogICAgIHN5cy5leGl0KCJcbkNRTCBTaGVsbCBkb2VzIG5vdCBydW4gb24gSnl0aG9uXG4iKQogCi1VVEY4ID0gJ3V0Zi04JwotCi1kZXNjcmlwdGlvbiA9ICJDUUwgU2hlbGwgZm9yIEFwYWNoZSBDYXNzYW5kcmEiCi12ZXJzaW9uID0gIjYuMS4wIgotCi1yZWFkbGluZSA9IE5vbmUKLXRyeToKLSAgICAjIGNoZWNrIGlmIHR0eSBmaXJzdCwgY2F1c2UgcmVhZGxpbmUgZG9lc24ndCBjaGVjaywgYW5kIG9ubHkgY2FyZXMKLSAgICAjIGFib3V0ICRURVJNLiB3ZSBkb24ndCB3YW50IHRoZSBmdW5reSBlc2NhcGUgY29kZSBzdHVmZiB0byBiZQotICAgICMgb3V0cHV0IGlmIG5vdCBhIHR0eS4KLSAgICBpZiBzeXMuc3RkaW4uaXNhdHR5KCk6Ci0gICAgICAgIGltcG9ydCByZWFkbGluZQotZXhjZXB0IEltcG9ydEVycm9yOgotICAgIHBhc3MKLQogQ1FMX0xJQl9QUkVGSVggPSAnY2Fzc2FuZHJhLWRyaXZlci1pbnRlcm5hbC1vbmx5LScKIAogQ0FTU0FORFJBX1BBVEggPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgoX19maWxlX18pKSwgJy4uJykKLUNBU1NBTkRSQV9DUUxfSFRNTF9GQUxMQkFDSyA9ICdodHRwczovL2Nhc3NhbmRyYS5hcGFjaGUub3JnL2RvYy9sYXRlc3QvY3FsL2luZGV4Lmh0bWwnCi0KLSMgZGVmYXVsdCBsb2NhdGlvbiBvZiBsb2NhbCBDUUwuaHRtbAotaWYgb3MucGF0aC5leGlzdHMoQ0FTU0FORFJBX1BBVEggKyAnL2RvYy9jcWwzL0NRTC5odG1sJyk6Ci0gICAgIyBkZWZhdWx0IGxvY2F0aW9uIG9mIGxvY2FsIENRTC5odG1sCi0gICAgQ0FTU0FORFJBX0NRTF9IVE1MID0gJ2ZpbGU6Ly8nICsgQ0FTU0FORFJBX1BBVEggKyAnL2RvYy9jcWwzL0NRTC5odG1sJwotZWxpZiBvcy5wYXRoLmV4aXN0cygnL3Vzci9zaGFyZS9kb2MvY2Fzc2FuZHJhL0NRTC5odG1sJyk6Ci0gICAgIyBmYWxsYmFjayB0byBwYWNrYWdlIGZpbGUKLSAgICBDQVNTQU5EUkFfQ1FMX0hUTUwgPSAnZmlsZTovLy91c3Ivc2hhcmUvZG9jL2Nhc3NhbmRyYS9DUUwuaHRtbCcKLWVsc2U6Ci0gICAgIyBmYWxsYmFjayB0byBvbmxpbmUgdmVyc2lvbgotICAgIENBU1NBTkRSQV9DUUxfSFRNTCA9IENBU1NBTkRSQV9DUUxfSFRNTF9GQUxMQkFDSwotCi0jIE9uIExpbnV4LCB0aGUgUHl0aG9uIHdlYmJyb3dzZXIgbW9kdWxlIHVzZXMgdGhlICd4ZGctb3BlbicgZXhlY3V0YWJsZQotIyB0byBvcGVuIGEgZmlsZS9VUkwuIEJ1dCB0aGF0IG9ubHkgd29ya3MsIGlmIHRoZSBjdXJyZW50IHNlc3Npb24gaGFzIGJlZW4KLSMgb3BlbmVkIGZyb20gX3dpdGhpbl8gYSBkZXNrdG9wIGVudmlyb25tZW50LiBJLmUuICd4ZGctb3Blbicgd2lsbCBmYWlsLAotIyBpZiB0aGUgc2Vzc2lvbidzIGJlZW4gb3BlbmVkIHZpYSBzc2ggdG8gYSByZW1vdGUgYm94LgotIwotdHJ5OgotICAgIHdlYmJyb3dzZXIucmVnaXN0ZXJfc3RhbmRhcmRfYnJvd3NlcnMoKSAgIyByZWdpc3RyYXRpb24gaXMgb3RoZXJ3aXNlIGxhenkgaW4gUHl0aG9uMwotZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgIHBhc3MKLWlmIHdlYmJyb3dzZXIuX3RyeW9yZGVyIGFuZCB3ZWJicm93c2VyLl90cnlvcmRlclswXSA9PSAneGRnLW9wZW4nIGFuZCBvcy5lbnZpcm9uLmdldCgnWERHX0RBVEFfRElSUycsICcnKSA9PSAnJzoKLSAgICAjIG9ubHkgb24gTGludXggKHNvbWUgT1Mgd2l0aCB4ZGctb3BlbikKLSAgICB3ZWJicm93c2VyLl90cnlvcmRlci5yZW1vdmUoJ3hkZy1vcGVuJykKLSAgICB3ZWJicm93c2VyLl90cnlvcmRlci5hcHBlbmQoJ3hkZy1vcGVuJykKIAogIyB1c2UgYnVuZGxlZCBsaWIgZm9yIHB5dGhvbi1jcWwgaWYgYXZhaWxhYmxlLiBpZiB0aGVyZQogIyBpcyBhIC4uL2xpYiBkaXIsIHVzZSBidW5kbGVkIGxpYnMgdGhlcmUgcHJlZmVyZW50aWFsbHkuCkBAIC0xMTMsMTQgKzU2LDEzIEBACiAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguam9pbihjcWxfemlwLCAnY2Fzc2FuZHJhLWRyaXZlci0nICsgdmVyKSkKIAogIyB0aGUgZHJpdmVyIG5lZWRzIGRlcGVuZGVuY2llcwotdGhpcmRfcGFydGllcyA9ICgnc2l4LScsICdwdXJlX3Nhc2wtJykKK3RoaXJkX3BhcnRpZXMgPSAoJ3NpeC0nLCAncHVyZV9zYXNsLScsICd3Y3dpZHRoLScpCiAKIGZvciBsaWIgaW4gdGhpcmRfcGFydGllczoKICAgICBsaWJfemlwID0gZmluZF96aXAobGliKQogICAgIGlmIGxpYl96aXA6CiAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBsaWJfemlwKQogCi13YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgciIuKmJsaXN0LioiKQogdHJ5OgogICAgIGltcG9ydCBjYXNzYW5kcmEKIGV4Y2VwdCBJbXBvcnRFcnJvciBhcyBlOgpAQCAtMTMwLDE0ICs3Miw2IEBACiAgICAgICAgICAgICAgJ01vZHVsZSBsb2FkIHBhdGg6ICVyXG5cbicKICAgICAgICAgICAgICAnRXJyb3I6ICVzXG4nICUgKHN5cy5leGVjdXRhYmxlLCBzeXMucGF0aCwgZSkpCiAKLWZyb20gY2Fzc2FuZHJhLmF1dGggaW1wb3J0IFBsYWluVGV4dEF1dGhQcm92aWRlcgotZnJvbSBjYXNzYW5kcmEuY2x1c3RlciBpbXBvcnQgQ2x1c3RlcgotZnJvbSBjYXNzYW5kcmEuY3FsdHlwZXMgaW1wb3J0IGNxbF90eXBlbmFtZQotZnJvbSBjYXNzYW5kcmEubWFyc2hhbCBpbXBvcnQgaW50NjRfdW5wYWNrCi1mcm9tIGNhc3NhbmRyYS5tZXRhZGF0YSBpbXBvcnQgKENvbHVtbk1ldGFkYXRhLCBLZXlzcGFjZU1ldGFkYXRhLCBUYWJsZU1ldGFkYXRhKQotZnJvbSBjYXNzYW5kcmEucG9saWNpZXMgaW1wb3J0IFdoaXRlTGlzdFJvdW5kUm9iaW5Qb2xpY3kKLWZyb20gY2Fzc2FuZHJhLnF1ZXJ5IGltcG9ydCBTaW1wbGVTdGF0ZW1lbnQsIG9yZGVyZWRfZGljdF9mYWN0b3J5LCBUcmFjZVVuYXZhaWxhYmxlCi1mcm9tIGNhc3NhbmRyYS51dGlsIGltcG9ydCBkYXRldGltZV9mcm9tX3RpbWVzdGFtcAogCiAjIGNxbHNoIHNob3VsZCBydW4gY29ycmVjdGx5IHdoZW4gcnVuIG91dCBvZiBhIENhc3NhbmRyYSBzb3VyY2UgdHJlZSwKICMgb3V0IG9mIGFuIHVucGFja2VkIENhc3NhbmRyYSB0YXJiYWxsLCBhbmQgYWZ0ZXIgYSBwcm9wZXIgcGFja2FnZSBpbnN0YWxsLgpAQCAtMTQ1LDIyNDUgKzc5LDEwIEBACiBpZiBvcy5wYXRoLmlzZGlyKGNxbHNobGliZGlyKToKICAgICBzeXMucGF0aC5pbnNlcnQoMCwgY3Fsc2hsaWJkaXIpCiAKLWZyb20gY3Fsc2hsaWIgaW1wb3J0IGNxbDNoYW5kbGluZywgcHlsZXhvdHJvbiwgc3NsaGFuZGxpbmcsIGNxbHNoaGFuZGxpbmcsIGF1dGhwcm92aWRlcmhhbmRsaW5nCi1mcm9tIGNxbHNobGliLmNvcHl1dGlsIGltcG9ydCBFeHBvcnRUYXNrLCBJbXBvcnRUYXNrCi1mcm9tIGNxbHNobGliLmRpc3BsYXlpbmcgaW1wb3J0IChBTlNJX1JFU0VULCBCTFVFLCBDT0xVTU5fTkFNRV9DT0xPUlMsIENZQU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUQsIFdISVRFLCBGb3JtYXR0ZWRWYWx1ZSwgY29sb3JtZSkKLWZyb20gY3Fsc2hsaWIuZm9ybWF0dGluZyBpbXBvcnQgKERFRkFVTFRfREFURV9GT1JNQVQsIERFRkFVTFRfTkFOT1RJTUVfRk9STUFULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9USU1FU1RBTVBfRk9STUFULCBDcWxUeXBlLCBEYXRlVGltZUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9ieV90eXBlKQotZnJvbSBjcWxzaGxpYi50cmFjaW5nIGltcG9ydCBwcmludF90cmFjZSwgcHJpbnRfdHJhY2Vfc2Vzc2lvbgotZnJvbSBjcWxzaGxpYi51dGlsIGltcG9ydCBnZXRfZmlsZV9lbmNvZGluZ19ib21zaXplCi1mcm9tIGNxbHNobGliLnV0aWwgaW1wb3J0IGlzX2ZpbGVfc2VjdXJlCi0KLQotREVGQVVMVF9IT1NUID0gJzEyNy4wLjAuMScKLURFRkFVTFRfUE9SVCA9IDkwNDIKLURFRkFVTFRfU1NMID0gRmFsc2UKLURFRkFVTFRfQ09OTkVDVF9USU1FT1VUX1NFQ09ORFMgPSA1Ci1ERUZBVUxUX1JFUVVFU1RfVElNRU9VVF9TRUNPTkRTID0gMTAKLQotREVGQVVMVF9GTE9BVF9QUkVDSVNJT04gPSA1Ci1ERUZBVUxUX0RPVUJMRV9QUkVDSVNJT04gPSA1Ci1ERUZBVUxUX01BWF9UUkFDRV9XQUlUID0gMTAKLQotaWYgcmVhZGxpbmUgaXMgbm90IE5vbmUgYW5kIHJlYWRsaW5lLl9fZG9jX18gaXMgbm90IE5vbmUgYW5kICdsaWJlZGl0JyBpbiByZWFkbGluZS5fX2RvY19fOgotICAgIERFRkFVTFRfQ09NUExFVEVLRVkgPSAnXHQnCi1lbHNlOgotICAgIERFRkFVTFRfQ09NUExFVEVLRVkgPSAndGFiJwotCi1jcWxkb2NzID0gTm9uZQotY3FscnVsZXNldCA9IE5vbmUKLQotZXBpbG9nID0gIiIiQ29ubmVjdHMgdG8gJShERUZBVUxUX0hPU1QpczolKERFRkFVTFRfUE9SVClkIGJ5IGRlZmF1bHQuIFRoZXNlCi1kZWZhdWx0cyBjYW4gYmUgY2hhbmdlZCBieSBzZXR0aW5nICRDUUxTSF9IT1NUIGFuZC9vciAkQ1FMU0hfUE9SVC4gV2hlbiBhCi1ob3N0IChhbmQgb3B0aW9uYWwgcG9ydCBudW1iZXIpIGFyZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGV5IHRha2UKLXByZWNlZGVuY2Ugb3ZlciBhbnkgZGVmYXVsdHMuIiIiICUgZ2xvYmFscygpCi0KLXBhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcihkZXNjcmlwdGlvbj1kZXNjcmlwdGlvbiwgZXBpbG9nPWVwaWxvZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZT0iVXNhZ2U6ICVwcm9nIFtvcHRpb25zXSBbaG9zdCBbcG9ydF1dIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPSdjcWxzaCAnICsgdmVyc2lvbikKLXBhcnNlci5hZGRfb3B0aW9uKCItQyIsICItLWNvbG9yIiwgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0nY29sb3InLAotICAgICAgICAgICAgICAgICAgaGVscD0nQWx3YXlzIHVzZSBjb2xvciBvdXRwdXQnKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tbm8tY29sb3IiLCBhY3Rpb249J3N0b3JlX2ZhbHNlJywgZGVzdD0nY29sb3InLAotICAgICAgICAgICAgICAgICAgaGVscD0nTmV2ZXIgdXNlIGNvbG9yIG91dHB1dCcpCi1wYXJzZXIuYWRkX29wdGlvbigiLS1icm93c2VyIiwgZGVzdD0nYnJvd3NlcicsIGhlbHA9IiIiVGhlIGJyb3dzZXIgdG8gdXNlIHRvIGRpc3BsYXkgQ1FMIGhlbHAsIHdoZXJlIEJST1dTRVIgY2FuIGJlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gb25lIG9mIHRoZSBzdXBwb3J0ZWQgYnJvd3NlcnMgaW4gaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy9saWJyYXJ5L3dlYmJyb3dzZXIuaHRtbC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGJyb3dzZXIgcGF0aCBmb2xsb3dlZCBieSAlcywgZXhhbXBsZTogL3Vzci9iaW4vZ29vZ2xlLWNocm9tZS1zdGFibGUgJXMiIiIpCi1wYXJzZXIuYWRkX29wdGlvbignLS1zc2wnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSdVc2UgU1NMJywgZGVmYXVsdD1GYWxzZSkKLXBhcnNlci5hZGRfb3B0aW9uKCItdSIsICItLXVzZXJuYW1lIiwgaGVscD0iQXV0aGVudGljYXRlIGFzIHVzZXIuIikKLXBhcnNlci5hZGRfb3B0aW9uKCItcCIsICItLXBhc3N3b3JkIiwgaGVscD0iQXV0aGVudGljYXRlIHVzaW5nIHBhc3N3b3JkLiIpCi1wYXJzZXIuYWRkX29wdGlvbignLWsnLCAnLS1rZXlzcGFjZScsIGhlbHA9J0F1dGhlbnRpY2F0ZSB0byB0aGUgZ2l2ZW4ga2V5c3BhY2UuJykKLXBhcnNlci5hZGRfb3B0aW9uKCItZiIsICItLWZpbGUiLCBoZWxwPSJFeGVjdXRlIGNvbW1hbmRzIGZyb20gRklMRSwgdGhlbiBleGl0IikKLXBhcnNlci5hZGRfb3B0aW9uKCctLWRlYnVnJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgIGhlbHA9J1Nob3cgYWRkaXRpb25hbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24nKQotcGFyc2VyLmFkZF9vcHRpb24oJy0tY292ZXJhZ2UnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgaGVscD0nQ29sbGVjdCBjb3ZlcmFnZSBkYXRhJykKLXBhcnNlci5hZGRfb3B0aW9uKCItLWVuY29kaW5nIiwgaGVscD0iU3BlY2lmeSBhIG5vbi1kZWZhdWx0IGVuY29kaW5nIGZvciBvdXRwdXQuIgotICAgICAgICAgICAgICAgICAgKyAiIChEZWZhdWx0OiAlcykiICUgKFVURjgsKSkKLXBhcnNlci5hZGRfb3B0aW9uKCItLWNxbHNocmMiLCBoZWxwPSJTcGVjaWZ5IGFuIGFsdGVybmF0aXZlIGNxbHNocmMgZmlsZSBsb2NhdGlvbi4iKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tY3JlZGVudGlhbHMiLCBoZWxwPSJTcGVjaWZ5IGFuIGFsdGVybmF0aXZlIGNyZWRlbnRpYWxzIGZpbGUgbG9jYXRpb24uIikKLXBhcnNlci5hZGRfb3B0aW9uKCctLWNxbHZlcnNpb24nLCBkZWZhdWx0PU5vbmUsCi0gICAgICAgICAgICAgICAgICBoZWxwPSdTcGVjaWZ5IGEgcGFydGljdWxhciBDUUwgdmVyc2lvbiwgJwotICAgICAgICAgICAgICAgICAgICAgICAnYnkgZGVmYXVsdCB0aGUgaGlnaGVzdCB2ZXJzaW9uIHN1cHBvcnRlZCBieSB0aGUgc2VydmVyIHdpbGwgYmUgdXNlZC4nCi0gICAgICAgICAgICAgICAgICAgICAgICcgRXhhbXBsZXM6ICIzLjAuMyIsICIzLjEuMCInKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tcHJvdG9jb2wtdmVyc2lvbiIsIHR5cGU9ImludCIsIGRlZmF1bHQ9Tm9uZSwKLSAgICAgICAgICAgICAgICAgIGhlbHA9J1NwZWNpZnkgYSBzcGVjaWZpYyBwcm90Y29sIHZlcnNpb24gb3RoZXJ3aXNlIHRoZSBjbGllbnQgd2lsbCBkZWZhdWx0IGFuZCBkb3duZ3JhZGUgYXMgbmVjZXNzYXJ5JykKLQotcGFyc2VyLmFkZF9vcHRpb24oIi1lIiwgIi0tZXhlY3V0ZSIsIGhlbHA9J0V4ZWN1dGUgdGhlIHN0YXRlbWVudCBhbmQgcXVpdC4nKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tY29ubmVjdC10aW1lb3V0IiwgZGVmYXVsdD1ERUZBVUxUX0NPTk5FQ1RfVElNRU9VVF9TRUNPTkRTLCBkZXN0PSdjb25uZWN0X3RpbWVvdXQnLAotICAgICAgICAgICAgICAgICAgaGVscD0nU3BlY2lmeSB0aGUgY29ubmVjdGlvbiB0aW1lb3V0IGluIHNlY29uZHMgKGRlZmF1bHQ6ICVkZWZhdWx0IHNlY29uZHMpLicpCi1wYXJzZXIuYWRkX29wdGlvbigiLS1yZXF1ZXN0LXRpbWVvdXQiLCBkZWZhdWx0PURFRkFVTFRfUkVRVUVTVF9USU1FT1VUX1NFQ09ORFMsIGRlc3Q9J3JlcXVlc3RfdGltZW91dCcsCi0gICAgICAgICAgICAgICAgICBoZWxwPSdTcGVjaWZ5IHRoZSBkZWZhdWx0IHJlcXVlc3QgdGltZW91dCBpbiBzZWNvbmRzIChkZWZhdWx0OiAlZGVmYXVsdCBzZWNvbmRzKS4nKQotcGFyc2VyLmFkZF9vcHRpb24oIi10IiwgIi0tdHR5IiwgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0ndHR5JywKLSAgICAgICAgICAgICAgICAgIGhlbHA9J0ZvcmNlIHR0eSBtb2RlIChjb21tYW5kIHByb21wdCkuJykKLXBhcnNlci5hZGRfb3B0aW9uKCctdicsIGFjdGlvbj0idmVyc2lvbiIsIGhlbHA9J1ByaW50IHRoZSBjdXJyZW50IHZlcnNpb24gb2YgY3Fsc2guJykKLQotIyBUaGlzIGlzIGEgaGlkZGVuIG9wdGlvbiB0byBzdXBwcmVzcyB0aGUgd2FybmluZyB3aGVuIHRoZSAtcC8tLXBhc3N3b3JkIGNvbW1hbmQgbGluZSBvcHRpb24gaXMgdXNlZC4KLSMgUG93ZXIgdXNlcnMgbWF5IHVzZSB0aGlzIG9wdGlvbiBpZiB0aGV5IGtub3cgbm8gb3RoZXIgcGVvcGxlIGhhcyBhY2Nlc3MgdG8gdGhlIHN5c3RlbSB3aGVyZSBjcWxzaCBpcyBydW4gb3IgZG9uJ3QgY2FyZSBhYm91dCBzZWN1cml0eS4KLSMgVXNlIG9mIHRoaXMgb3B0aW9uIGluIHNjcmlwdGluZyBpcyBkaXNjb3VyYWdlZC4gUGxlYXNlIHVzZSBhICh0ZW1wb3JhcnkpIGNyZWRlbnRpYWxzIGZpbGUgd2hlcmUgcG9zc2libGUuCi0jIFRoZSBDYXNzYW5kcmEgZGlzdHJpYnV0ZWQgdGVzdHMgKGR0ZXN0cykgYWxzbyB1c2UgdGhpcyBvcHRpb24gaW4gc29tZSB0ZXN0cyB3aGVuIGEgd2VsbC1rbm93biBwYXNzd29yZCBpcyBzdXBwbGllZCB2aWEgdGhlIGNvbW1hbmQgbGluZS4KLXBhcnNlci5hZGRfb3B0aW9uKCItLWluc2VjdXJlLXBhc3N3b3JkLXdpdGhvdXQtd2FybmluZyIsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlc3Q9J2luc2VjdXJlX3Bhc3N3b3JkX3dpdGhvdXRfd2FybmluZycsCi0gICAgICAgICAgICAgICAgICBoZWxwPW9wdHBhcnNlLlNVUFBSRVNTX0hFTFApCi0KLW9wdF92YWx1ZXMgPSBvcHRwYXJzZS5WYWx1ZXMoKQotKG9wdGlvbnMsIGFyZ3VtZW50cykgPSBwYXJzZXIucGFyc2VfYXJncyhzeXMuYXJndlsxOl0sIHZhbHVlcz1vcHRfdmFsdWVzKQotCi0jIEJFR0lOIGhpc3RvcnkvY29uZmlnIGRlZmluaXRpb24KLQotCi1kZWYgbWtkaXJwKHBhdGgpOgotICAgICIiIkNyZWF0ZXMgYWxsIHBhcmVudCBkaXJlY3RvcmllcyB1cCB0byBwYXRoIHBhcmFtZXRlciBvciBmYWlscyB3aGVuIHBhdGggZXhpc3RzLCBidXQgaXQgaXMgbm90IGEgZGlyZWN0b3J5LiIiIgotCi0gICAgdHJ5OgotICAgICAgICBvcy5tYWtlZGlycyhwYXRoKQotICAgIGV4Y2VwdCBPU0Vycm9yOgotICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihwYXRoKToKLSAgICAgICAgICAgIHJhaXNlCi0KLQotZGVmIHJlc29sdmVfY3FsX2hpc3RvcnlfZmlsZSgpOgotICAgIGRlZmF1bHRfY3FsX2hpc3RvcnkgPSBvcy5wYXRoLmV4cGFuZHVzZXIob3MucGF0aC5qb2luKCd+JywgJy5jYXNzYW5kcmEnLCAnY3Fsc2hfaGlzdG9yeScpKQotICAgIGlmICdDUUxfSElTVE9SWScgaW4gb3MuZW52aXJvbjoKLSAgICAgICAgcmV0dXJuIG9zLmVudmlyb25bJ0NRTF9ISVNUT1JZJ10KLSAgICBlbHNlOgotICAgICAgICByZXR1cm4gZGVmYXVsdF9jcWxfaGlzdG9yeQotCi0KLUhJU1RPUlkgPSByZXNvbHZlX2NxbF9oaXN0b3J5X2ZpbGUoKQotSElTVE9SWV9ESVIgPSBvcy5wYXRoLmRpcm5hbWUoSElTVE9SWSkKLQotdHJ5OgotICAgIG1rZGlycChISVNUT1JZX0RJUikKLWV4Y2VwdCBPU0Vycm9yOgotICAgIHByaW50KCdcbldhcm5pbmc6IENhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IGF0IGAlc2AuIENvbW1hbmQgaGlzdG9yeSB3aWxsIG5vdCBiZSBzYXZlZC4gUGxlYXNlIGNoZWNrIHdoYXQgd2FzIHRoZSBlbnZpcm9ubWVudCBwcm9wZXJ0eSBDUUxfSElTVE9SWSBzZXQgdG8uXG4nICUgSElTVE9SWV9ESVIpCi0KLURFRkFVTFRfQ1FMU0hSQyA9IG9zLnBhdGguZXhwYW5kdXNlcihvcy5wYXRoLmpvaW4oJ34nLCAnLmNhc3NhbmRyYScsICdjcWxzaHJjJykpCi0KLWlmIGhhc2F0dHIob3B0aW9ucywgJ2NxbHNocmMnKToKLSAgICBDT05GSUdfRklMRSA9IG9zLnBhdGguZXhwYW5kdXNlcihvcHRpb25zLmNxbHNocmMpCi0gICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKENPTkZJR19GSUxFKToKLSAgICAgICAgcHJpbnQoJ1xuV2FybmluZzogU3BlY2lmaWVkIGNxbHNocmMgbG9jYXRpb24gYCVzYCBkb2VzIG5vdCBleGlzdC4gIFVzaW5nIGAlc2AgaW5zdGVhZC5cbicgJSAoQ09ORklHX0ZJTEUsIERFRkFVTFRfQ1FMU0hSQykpCi0gICAgICAgIENPTkZJR19GSUxFID0gREVGQVVMVF9DUUxTSFJDCi1lbHNlOgotICAgIENPTkZJR19GSUxFID0gREVGQVVMVF9DUUxTSFJDCi0KLUNRTF9ESVIgPSBvcy5wYXRoLmRpcm5hbWUoQ09ORklHX0ZJTEUpCi0KLUNRTF9FUlJPUlMgPSAoCi0gICAgY2Fzc2FuZHJhLkFscmVhZHlFeGlzdHMsIGNhc3NhbmRyYS5BdXRoZW50aWNhdGlvbkZhaWxlZCwgY2Fzc2FuZHJhLkNvb3JkaW5hdGlvbkZhaWx1cmUsCi0gICAgY2Fzc2FuZHJhLkludmFsaWRSZXF1ZXN0LCBjYXNzYW5kcmEuVGltZW91dCwgY2Fzc2FuZHJhLlVuYXV0aG9yaXplZCwgY2Fzc2FuZHJhLk9wZXJhdGlvblRpbWVkT3V0LAotICAgIGNhc3NhbmRyYS5jbHVzdGVyLk5vSG9zdEF2YWlsYWJsZSwKLSAgICBjYXNzYW5kcmEuY29ubmVjdGlvbi5Db25uZWN0aW9uQnVzeSwgY2Fzc2FuZHJhLmNvbm5lY3Rpb24uUHJvdG9jb2xFcnJvciwgY2Fzc2FuZHJhLmNvbm5lY3Rpb24uQ29ubmVjdGlvbkV4Y2VwdGlvbiwKLSAgICBjYXNzYW5kcmEucHJvdG9jb2wuRXJyb3JNZXNzYWdlLCBjYXNzYW5kcmEucHJvdG9jb2wuSW50ZXJuYWxFcnJvciwgY2Fzc2FuZHJhLnF1ZXJ5LlRyYWNlVW5hdmFpbGFibGUKLSkKLQotZGVidWdfY29tcGxldGlvbiA9IGJvb2wob3MuZW52aXJvbi5nZXQoJ0NRTFNIX0RFQlVHX0NPTVBMRVRJT04nLCAnJykgPT0gJ1lFUycpCi0KLQotY2xhc3MgTm9LZXlzcGFjZUVycm9yKEV4Y2VwdGlvbik6Ci0gICAgcGFzcwotCi0KLWNsYXNzIEtleXNwYWNlTm90Rm91bmQoRXhjZXB0aW9uKToKLSAgICBwYXNzCi0KLQotY2xhc3MgQ29sdW1uRmFtaWx5Tm90Rm91bmQoRXhjZXB0aW9uKToKLSAgICBwYXNzCi0KLQotY2xhc3MgSW5kZXhOb3RGb3VuZChFeGNlcHRpb24pOgotICAgIHBhc3MKLQotCi1jbGFzcyBNYXRlcmlhbGl6ZWRWaWV3Tm90Rm91bmQoRXhjZXB0aW9uKToKLSAgICBwYXNzCi0KLQotY2xhc3MgT2JqZWN0Tm90Rm91bmQoRXhjZXB0aW9uKToKLSAgICBwYXNzCi0KLQotY2xhc3MgVmVyc2lvbk5vdFN1cHBvcnRlZChFeGNlcHRpb24pOgotICAgIHBhc3MKLQotCi1jbGFzcyBVc2VyVHlwZU5vdEZvdW5kKEV4Y2VwdGlvbik6Ci0gICAgcGFzcwotCi0KLWNsYXNzIEZ1bmN0aW9uTm90Rm91bmQoRXhjZXB0aW9uKToKLSAgICBwYXNzCi0KLQotY2xhc3MgQWdncmVnYXRlTm90Rm91bmQoRXhjZXB0aW9uKToKLSAgICBwYXNzCi0KLQotY2xhc3MgRGVjb2RlRXJyb3IoRXhjZXB0aW9uKToKLSAgICB2ZXJiID0gJ2RlY29kZScKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0aGVieXRlcywgZXJyLCBjb2xuYW1lPU5vbmUpOgotICAgICAgICBzZWxmLnRoZWJ5dGVzID0gdGhlYnl0ZXMKLSAgICAgICAgc2VsZi5lcnIgPSBlcnIKLSAgICAgICAgc2VsZi5jb2xuYW1lID0gY29sbmFtZQotCi0gICAgZGVmIF9fc3RyX18oc2VsZik6Ci0gICAgICAgIHJldHVybiBzdHIoc2VsZi50aGVieXRlcykKLQotICAgIGRlZiBtZXNzYWdlKHNlbGYpOgotICAgICAgICB3aGF0ID0gJ3ZhbHVlICVyJyAlIChzZWxmLnRoZWJ5dGVzLCkKLSAgICAgICAgaWYgc2VsZi5jb2xuYW1lIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgd2hhdCA9ICd2YWx1ZSAlciAoZm9yIGNvbHVtbiAlciknICUgKHNlbGYudGhlYnl0ZXMsIHNlbGYuY29sbmFtZSkKLSAgICAgICAgcmV0dXJuICdGYWlsZWQgdG8gJXMgJXMgOiAlcycgXAotICAgICAgICAgICAgICAgJSAoc2VsZi52ZXJiLCB3aGF0LCBzZWxmLmVycikKLQotICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuICc8JXMgJXM+JyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5tZXNzYWdlKCkpCi0KLQotZGVmIG1heWJlX2Vuc3VyZV90ZXh0KHZhbCk6Ci0gICAgcmV0dXJuIHN0cih2YWwpIGlmIHZhbCBlbHNlIHZhbAotCi0KLWNsYXNzIEZvcm1hdEVycm9yKERlY29kZUVycm9yKToKLSAgICB2ZXJiID0gJ2Zvcm1hdCcKLQotCi1kZWYgZnVsbF9jcWxfdmVyc2lvbih2ZXIpOgotICAgIHdoaWxlIHZlci5jb3VudCgnLicpIDwgMjoKLSAgICAgICAgdmVyICs9ICcuMCcKLSAgICB2ZXJfcGFydHMgPSB2ZXIuc3BsaXQoJy0nLCAxKSArIFsnJ10KLSAgICB2ZXJ0dXBsZSA9IHR1cGxlKGxpc3QobWFwKGludCwgdmVyX3BhcnRzWzBdLnNwbGl0KCcuJykpKSArIFt2ZXJfcGFydHNbMV1dKQotICAgIHJldHVybiB2ZXIsIHZlcnR1cGxlCi0KLQotZGVmIGZvcm1hdF92YWx1ZSh2YWwsIGNxbHR5cGUsIGVuY29kaW5nLCBhZGRjb2xvcj1GYWxzZSwgZGF0ZV90aW1lX2Zvcm1hdD1Ob25lLAotICAgICAgICAgICAgICAgICBmbG9hdF9wcmVjaXNpb249Tm9uZSwgY29sb3JtYXA9Tm9uZSwgbnVsbHZhbD1Ob25lKToKLSAgICBpZiBpc2luc3RhbmNlKHZhbCwgRGVjb2RlRXJyb3IpOgotICAgICAgICBpZiBhZGRjb2xvcjoKLSAgICAgICAgICAgIHJldHVybiBjb2xvcm1lKHJlcHIodmFsLnRoZWJ5dGVzKSwgY29sb3JtYXAsICdlcnJvcicpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gRm9ybWF0dGVkVmFsdWUocmVwcih2YWwudGhlYnl0ZXMpKQotICAgIHJldHVybiBmb3JtYXRfYnlfdHlwZSh2YWwsIGNxbHR5cGU9Y3FsdHlwZSwgZW5jb2Rpbmc9ZW5jb2RpbmcsIGNvbG9ybWFwPWNvbG9ybWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRjb2xvcj1hZGRjb2xvciwgbnVsbHZhbD1udWxsdmFsLCBkYXRlX3RpbWVfZm9ybWF0PWRhdGVfdGltZV9mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0X3ByZWNpc2lvbj1mbG9hdF9wcmVjaXNpb24pCi0KLQotZGVmIHNob3dfd2FybmluZ193aXRob3V0X3F1b3RpbmdfbGluZShtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgZmlsZT1Ob25lLCBsaW5lPU5vbmUpOgotICAgIGlmIGZpbGUgaXMgTm9uZToKLSAgICAgICAgZmlsZSA9IHN5cy5zdGRlcnIKLSAgICB0cnk6Ci0gICAgICAgIGZpbGUud3JpdGUod2FybmluZ3MuZm9ybWF0d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgbGluZT0nJykpCi0gICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgIHBhc3MKLQotCi13YXJuaW5ncy5zaG93d2FybmluZyA9IHNob3dfd2FybmluZ193aXRob3V0X3F1b3RpbmdfbGluZQotd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2Fsd2F5cycsIGNhdGVnb3J5PWNxbDNoYW5kbGluZy5VbmV4cGVjdGVkVGFibGVTdHJ1Y3R1cmUpCi0KLQotZGVmIGluc2VydF9kcml2ZXJfaG9va3MoKToKLQotICAgIGNsYXNzIERhdGVPdmVyRmxvd1dhcm5pbmcoUnVudGltZVdhcm5pbmcpOgotICAgICAgICBwYXNzCi0KLSAgICAjIE5hdGl2ZSBkYXRldGltZSB0eXBlcyBibG93IHVwIG91dHNpZGUgb2YgZGF0ZXRpbWUuW01JTnxNQVhdX1lFQVIuIFdlIHdpbGwgZmFsbCBiYWNrIHRvIGFuIGludCB0aW1lc3RhbXAKLSAgICBkZWYgZGVzZXJpYWxpemVfZGF0ZV9mYWxsYmFja19pbnQoYnl0cywgcHJvdG9jb2xfdmVyc2lvbik6Ci0gICAgICAgIHRpbWVzdGFtcF9tcyA9IGludDY0X3VucGFjayhieXRzKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZXR1cm4gZGF0ZXRpbWVfZnJvbV90aW1lc3RhbXAodGltZXN0YW1wX21zIC8gMTAwMC4wKQotICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKLSAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oRGF0ZU92ZXJGbG93V2FybmluZygiU29tZSB0aW1lc3RhbXBzIGFyZSBsYXJnZXIgdGhhbiBQeXRob24gZGF0ZXRpbWUgY2FuIHJlcHJlc2VudC4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaW1lc3RhbXBzIGFyZSBkaXNwbGF5ZWQgaW4gbWlsbGlzZWNvbmRzIGZyb20gZXBvY2guIikpCi0gICAgICAgICAgICByZXR1cm4gdGltZXN0YW1wX21zCi0KLSAgICBjYXNzYW5kcmEuY3FsdHlwZXMuRGF0ZVR5cGUuZGVzZXJpYWxpemUgPSBzdGF0aWNtZXRob2QoZGVzZXJpYWxpemVfZGF0ZV9mYWxsYmFja19pbnQpCi0KLSAgICBpZiBoYXNhdHRyKGNhc3NhbmRyYSwgJ2Rlc2VyaWFsaXplcnMnKToKLSAgICAgICAgZGVsIGNhc3NhbmRyYS5kZXNlcmlhbGl6ZXJzLkRlc0RhdGVUeXBlCi0KLSAgICAjIFJldHVybiBjYXNzYW5kcmEuY3FsdHlwZXMuRU1QVFkgaW5zdGVhZCBvZiBOb25lIGZvciBlbXB0eSB2YWx1ZXMKLSAgICBjYXNzYW5kcmEuY3FsdHlwZXMuQ2Fzc2FuZHJhVHlwZS5zdXBwb3J0X2VtcHR5X3ZhbHVlcyA9IFRydWUKLQotCi1jbGFzcyBTaGVsbChjbWQuQ21kKToKLSAgICBjdXN0b21fcHJvbXB0ID0gb3MuZ2V0ZW52KCdDUUxTSF9QUk9NUFQnLCAnJykKLSAgICBpZiBjdXN0b21fcHJvbXB0ICE9ICcnOgotICAgICAgICBjdXN0b21fcHJvbXB0ICs9ICJcbiIKLSAgICBkZWZhdWx0X3Byb21wdCA9IGN1c3RvbV9wcm9tcHQgKyAiY3Fsc2g+ICIKLSAgICBjb250aW51ZV9wcm9tcHQgPSAiICAgLi4uICIKLSAgICBrZXlzcGFjZV9wcm9tcHQgPSBjdXN0b21fcHJvbXB0ICsgImNxbHNoOnt9PiAiCi0gICAga2V5c3BhY2VfY29udGludWVfcHJvbXB0ID0gInt9ICAgIC4uLiAiCi0gICAgc2hvd19saW5lX251bXMgPSBGYWxzZQotICAgIGRlYnVnID0gRmFsc2UKLSAgICBjb3ZlcmFnZSA9IEZhbHNlCi0gICAgY292ZXJhZ2VyY19wYXRoID0gTm9uZQotICAgIHN0b3AgPSBGYWxzZQotICAgIGxhc3RfaGlzdCA9IE5vbmUKLSAgICBzaHVudGVkX3F1ZXJ5X291dCA9IE5vbmUKLSAgICB1c2VfcGFnaW5nID0gVHJ1ZQotCi0gICAgZGVmYXVsdF9wYWdlX3NpemUgPSAxMDAKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0bmFtZSwgcG9ydCwgY29sb3I9RmFsc2UsCi0gICAgICAgICAgICAgICAgIHVzZXJuYW1lPU5vbmUsIGVuY29kaW5nPU5vbmUsIHN0ZGluPU5vbmUsIHR0eT1UcnVlLAotICAgICAgICAgICAgICAgICBjb21wbGV0ZWtleT1ERUZBVUxUX0NPTVBMRVRFS0VZLCBicm93c2VyPU5vbmUsIHVzZV9jb25uPU5vbmUsCi0gICAgICAgICAgICAgICAgIGNxbHZlcj1Ob25lLCBrZXlzcGFjZT1Ob25lLAotICAgICAgICAgICAgICAgICB0cmFjaW5nX2VuYWJsZWQ9RmFsc2UsIGV4cGFuZF9lbmFibGVkPUZhbHNlLAotICAgICAgICAgICAgICAgICBkaXNwbGF5X25hbm90aW1lX2Zvcm1hdD1ERUZBVUxUX05BTk9USU1FX0ZPUk1BVCwKLSAgICAgICAgICAgICAgICAgZGlzcGxheV90aW1lc3RhbXBfZm9ybWF0PURFRkFVTFRfVElNRVNUQU1QX0ZPUk1BVCwKLSAgICAgICAgICAgICAgICAgZGlzcGxheV9kYXRlX2Zvcm1hdD1ERUZBVUxUX0RBVEVfRk9STUFULAotICAgICAgICAgICAgICAgICBkaXNwbGF5X2Zsb2F0X3ByZWNpc2lvbj1ERUZBVUxUX0ZMT0FUX1BSRUNJU0lPTiwKLSAgICAgICAgICAgICAgICAgZGlzcGxheV9kb3VibGVfcHJlY2lzaW9uPURFRkFVTFRfRE9VQkxFX1BSRUNJU0lPTiwKLSAgICAgICAgICAgICAgICAgZGlzcGxheV90aW1lem9uZT1Ob25lLAotICAgICAgICAgICAgICAgICBtYXhfdHJhY2Vfd2FpdD1ERUZBVUxUX01BWF9UUkFDRV9XQUlULAotICAgICAgICAgICAgICAgICBzc2w9RmFsc2UsCi0gICAgICAgICAgICAgICAgIHNpbmdsZV9zdGF0ZW1lbnQ9Tm9uZSwKLSAgICAgICAgICAgICAgICAgcmVxdWVzdF90aW1lb3V0PURFRkFVTFRfUkVRVUVTVF9USU1FT1VUX1NFQ09ORFMsCi0gICAgICAgICAgICAgICAgIHByb3RvY29sX3ZlcnNpb249Tm9uZSwKLSAgICAgICAgICAgICAgICAgY29ubmVjdF90aW1lb3V0PURFRkFVTFRfQ09OTkVDVF9USU1FT1VUX1NFQ09ORFMsCi0gICAgICAgICAgICAgICAgIGlzX3N1YnNoZWxsPUZhbHNlLAotICAgICAgICAgICAgICAgICBhdXRoX3Byb3ZpZGVyPU5vbmUpOgotICAgICAgICBjbWQuQ21kLl9faW5pdF9fKHNlbGYsIGNvbXBsZXRla2V5PWNvbXBsZXRla2V5KQotICAgICAgICBzZWxmLmhvc3RuYW1lID0gaG9zdG5hbWUKLSAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAotICAgICAgICBzZWxmLmF1dGhfcHJvdmlkZXIgPSBhdXRoX3Byb3ZpZGVyCi0gICAgICAgIHNlbGYudXNlcm5hbWUgPSB1c2VybmFtZQotCi0gICAgICAgIGlmIGlzaW5zdGFuY2UoYXV0aF9wcm92aWRlciwgUGxhaW5UZXh0QXV0aFByb3ZpZGVyKToKLSAgICAgICAgICAgIHNlbGYudXNlcm5hbWUgPSBhdXRoX3Byb3ZpZGVyLnVzZXJuYW1lCi0gICAgICAgICAgICBpZiBub3QgYXV0aF9wcm92aWRlci5wYXNzd29yZDoKLSAgICAgICAgICAgICAgICAjIGlmIG5vIHBhc3N3b3JkIGlzIHByb3ZpZGVkLCB3ZSBuZWVkIHRvIHF1ZXJ5IHRoZSB1c2VyIHRvIGdldCBvbmUuCi0gICAgICAgICAgICAgICAgcGFzc3dvcmQgPSBnZXRwYXNzLmdldHBhc3MoKQotICAgICAgICAgICAgICAgIHNlbGYuYXV0aF9wcm92aWRlciA9IFBsYWluVGV4dEF1dGhQcm92aWRlcih1c2VybmFtZT1hdXRoX3Byb3ZpZGVyLnVzZXJuYW1lLCBwYXNzd29yZD1wYXNzd29yZCkKLQotICAgICAgICBzZWxmLmtleXNwYWNlID0ga2V5c3BhY2UKLSAgICAgICAgc2VsZi5zc2wgPSBzc2wKLSAgICAgICAgc2VsZi50cmFjaW5nX2VuYWJsZWQgPSB0cmFjaW5nX2VuYWJsZWQKLSAgICAgICAgc2VsZi5wYWdlX3NpemUgPSBzZWxmLmRlZmF1bHRfcGFnZV9zaXplCi0gICAgICAgIHNlbGYuZXhwYW5kX2VuYWJsZWQgPSBleHBhbmRfZW5hYmxlZAotICAgICAgICBpZiB1c2VfY29ubjoKLSAgICAgICAgICAgIHNlbGYuY29ubiA9IHVzZV9jb25uCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBrd2FyZ3MgPSB7fQotICAgICAgICAgICAgaWYgcHJvdG9jb2xfdmVyc2lvbiBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICBrd2FyZ3NbJ3Byb3RvY29sX3ZlcnNpb24nXSA9IHByb3RvY29sX3ZlcnNpb24KLSAgICAgICAgICAgIHNlbGYuY29ubiA9IENsdXN0ZXIoY29udGFjdF9wb2ludHM9KHNlbGYuaG9zdG5hbWUsKSwgcG9ydD1zZWxmLnBvcnQsIGNxbF92ZXJzaW9uPWNxbHZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9wcm92aWRlcj1zZWxmLmF1dGhfcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF9vcHRpb25zPXNzbGhhbmRsaW5nLnNzbF9zZXR0aW5ncyhob3N0bmFtZSwgQ09ORklHX0ZJTEUpIGlmIHNzbCBlbHNlIE5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfYmFsYW5jaW5nX3BvbGljeT1XaGl0ZUxpc3RSb3VuZFJvYmluUG9saWN5KFtzZWxmLmhvc3RuYW1lXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xfY29ubmVjdGlvbl90aW1lb3V0PWNvbm5lY3RfdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdF90aW1lb3V0PWNvbm5lY3RfdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiprd2FyZ3MpCi0gICAgICAgIHNlbGYub3duc19jb25uZWN0aW9uID0gbm90IHVzZV9jb25uCi0KLSAgICAgICAgaWYga2V5c3BhY2U6Ci0gICAgICAgICAgICBzZWxmLnNlc3Npb24gPSBzZWxmLmNvbm4uY29ubmVjdChrZXlzcGFjZSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuc2Vzc2lvbiA9IHNlbGYuY29ubi5jb25uZWN0KCkKLQotICAgICAgICBpZiBicm93c2VyID09ICIiOgotICAgICAgICAgICAgYnJvd3NlciA9IE5vbmUKLSAgICAgICAgc2VsZi5icm93c2VyID0gYnJvd3NlcgotICAgICAgICBzZWxmLmNvbG9yID0gY29sb3IKLQotICAgICAgICBzZWxmLmRpc3BsYXlfbmFub3RpbWVfZm9ybWF0ID0gZGlzcGxheV9uYW5vdGltZV9mb3JtYXQKLSAgICAgICAgc2VsZi5kaXNwbGF5X3RpbWVzdGFtcF9mb3JtYXQgPSBkaXNwbGF5X3RpbWVzdGFtcF9mb3JtYXQKLSAgICAgICAgc2VsZi5kaXNwbGF5X2RhdGVfZm9ybWF0ID0gZGlzcGxheV9kYXRlX2Zvcm1hdAotCi0gICAgICAgIHNlbGYuZGlzcGxheV9mbG9hdF9wcmVjaXNpb24gPSBkaXNwbGF5X2Zsb2F0X3ByZWNpc2lvbgotICAgICAgICBzZWxmLmRpc3BsYXlfZG91YmxlX3ByZWNpc2lvbiA9IGRpc3BsYXlfZG91YmxlX3ByZWNpc2lvbgotCi0gICAgICAgIHNlbGYuZGlzcGxheV90aW1lem9uZSA9IGRpc3BsYXlfdGltZXpvbmUKLQotICAgICAgICBzZWxmLnNlc3Npb24uZGVmYXVsdF90aW1lb3V0ID0gcmVxdWVzdF90aW1lb3V0Ci0gICAgICAgIHNlbGYuc2Vzc2lvbi5yb3dfZmFjdG9yeSA9IG9yZGVyZWRfZGljdF9mYWN0b3J5Ci0gICAgICAgIHNlbGYuc2Vzc2lvbi5kZWZhdWx0X2NvbnNpc3RlbmN5X2xldmVsID0gY2Fzc2FuZHJhLkNvbnNpc3RlbmN5TGV2ZWwuT05FCi0gICAgICAgIHNlbGYuZ2V0X2Nvbm5lY3Rpb25fdmVyc2lvbnMoKQotICAgICAgICBzZWxmLnNldF9leHBhbmRlZF9jcWxfdmVyc2lvbihzZWxmLmNvbm5lY3Rpb25fdmVyc2lvbnNbJ2NxbCddKQotCi0gICAgICAgIHNlbGYuY3VycmVudF9rZXlzcGFjZSA9IGtleXNwYWNlCi0KLSAgICAgICAgc2VsZi5tYXhfdHJhY2Vfd2FpdCA9IG1heF90cmFjZV93YWl0Ci0gICAgICAgIHNlbGYuc2Vzc2lvbi5tYXhfdHJhY2Vfd2FpdCA9IG1heF90cmFjZV93YWl0Ci0KLSAgICAgICAgc2VsZi50dHkgPSB0dHkKLSAgICAgICAgc2VsZi5lbmNvZGluZyA9IGVuY29kaW5nCi0KLSAgICAgICAgc2VsZi5vdXRwdXRfY29kZWMgPSBjb2RlY3MubG9va3VwKGVuY29kaW5nKQotCi0gICAgICAgIHNlbGYuc3RhdGVtZW50ID0gU3RyaW5nSU8oKQotICAgICAgICBzZWxmLmxpbmVubyA9IDEKLSAgICAgICAgc2VsZi5pbl9jb21tZW50ID0gRmFsc2UKLQotICAgICAgICBzZWxmLnByb21wdCA9ICcnCi0gICAgICAgIGlmIHN0ZGluIGlzIE5vbmU6Ci0gICAgICAgICAgICBzdGRpbiA9IHN5cy5zdGRpbgotCi0gICAgICAgIGlmIHR0eToKLSAgICAgICAgICAgIHNlbGYucmVzZXRfcHJvbXB0KCkKLSAgICAgICAgICAgIHNlbGYucmVwb3J0X2Nvbm5lY3Rpb24oKQotICAgICAgICAgICAgcHJpbnQoJ1VzZSBIRUxQIGZvciBoZWxwLicpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLnNob3dfbGluZV9udW1zID0gVHJ1ZQotICAgICAgICBzZWxmLnN0ZGluID0gc3RkaW4KLSAgICAgICAgc2VsZi5xdWVyeV9vdXQgPSBzeXMuc3Rkb3V0Ci0gICAgICAgIHNlbGYuY29uc2lzdGVuY3lfbGV2ZWwgPSBjYXNzYW5kcmEuQ29uc2lzdGVuY3lMZXZlbC5PTkUKLSAgICAgICAgc2VsZi5zZXJpYWxfY29uc2lzdGVuY3lfbGV2ZWwgPSBjYXNzYW5kcmEuQ29uc2lzdGVuY3lMZXZlbC5TRVJJQUwKLQotICAgICAgICBzZWxmLmVtcHR5X2xpbmVzID0gMAotICAgICAgICBzZWxmLnN0YXRlbWVudF9lcnJvciA9IEZhbHNlCi0gICAgICAgIHNlbGYuc2luZ2xlX3N0YXRlbWVudCA9IHNpbmdsZV9zdGF0ZW1lbnQKLSAgICAgICAgc2VsZi5pc19zdWJzaGVsbCA9IGlzX3N1YnNoZWxsCi0KLSAgICBAcHJvcGVydHkKLSAgICBkZWYgYmF0Y2hfbW9kZShzZWxmKToKLSAgICAgICAgcmV0dXJuIG5vdCBzZWxmLnR0eQotCi0gICAgZGVmIHNldF9leHBhbmRlZF9jcWxfdmVyc2lvbihzZWxmLCB2ZXIpOgotICAgICAgICB2ZXIsIHZlcnR1cGxlID0gZnVsbF9jcWxfdmVyc2lvbih2ZXIpCi0gICAgICAgIHNlbGYuY3FsX3ZlcnNpb24gPSB2ZXIKLSAgICAgICAgc2VsZi5jcWxfdmVyX3R1cGxlID0gdmVydHVwbGUKLQotICAgIGRlZiBjcWx2ZXJfYXRsZWFzdChzZWxmLCBtYWpvciwgbWlub3I9MCwgcGF0Y2g9MCk6Ci0gICAgICAgIHJldHVybiBzZWxmLmNxbF92ZXJfdHVwbGVbOjNdID49IChtYWpvciwgbWlub3IsIHBhdGNoKQotCi0gICAgZGVmIG15Zm9ybWF0X3ZhbHVlKHNlbGYsIHZhbCwgY3FsdHlwZT1Ob25lLCAqKmt3YXJncyk6Ci0gICAgICAgIGlmIGlzaW5zdGFuY2UodmFsLCBEZWNvZGVFcnJvcik6Ci0gICAgICAgICAgICBzZWxmLmRlY29kaW5nX2Vycm9ycy5hcHBlbmQodmFsKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBkdGZvcm1hdHMgPSBEYXRlVGltZUZvcm1hdCh0aW1lc3RhbXBfZm9ybWF0PXNlbGYuZGlzcGxheV90aW1lc3RhbXBfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZV9mb3JtYXQ9c2VsZi5kaXNwbGF5X2RhdGVfZm9ybWF0LCBuYW5vdGltZV9mb3JtYXQ9c2VsZi5kaXNwbGF5X25hbm90aW1lX2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWV6b25lPXNlbGYuZGlzcGxheV90aW1lem9uZSkKLSAgICAgICAgICAgIHByZWNpc2lvbiA9IHNlbGYuZGlzcGxheV9kb3VibGVfcHJlY2lzaW9uIGlmIGNxbHR5cGUgaXMgbm90IE5vbmUgYW5kIGNxbHR5cGUudHlwZV9uYW1lID09ICdkb3VibGUnIFwKLSAgICAgICAgICAgICAgICBlbHNlIHNlbGYuZGlzcGxheV9mbG9hdF9wcmVjaXNpb24KLSAgICAgICAgICAgIHJldHVybiBmb3JtYXRfdmFsdWUodmFsLCBjcWx0eXBlPWNxbHR5cGUsIGVuY29kaW5nPXNlbGYub3V0cHV0X2NvZGVjLm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGNvbG9yPXNlbGYuY29sb3IsIGRhdGVfdGltZV9mb3JtYXQ9ZHRmb3JtYXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdF9wcmVjaXNpb249cHJlY2lzaW9uLCAqKmt3YXJncykKLSAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgotICAgICAgICAgICAgZXJyID0gRm9ybWF0RXJyb3IodmFsLCBlKQotICAgICAgICAgICAgc2VsZi5kZWNvZGluZ19lcnJvcnMuYXBwZW5kKGVycikKLSAgICAgICAgICAgIHJldHVybiBmb3JtYXRfdmFsdWUoZXJyLCBjcWx0eXBlPWNxbHR5cGUsIGVuY29kaW5nPXNlbGYub3V0cHV0X2NvZGVjLm5hbWUsIGFkZGNvbG9yPXNlbGYuY29sb3IpCi0KLSAgICBkZWYgbXlmb3JtYXRfY29sbmFtZShzZWxmLCBuYW1lLCB0YWJsZV9tZXRhPU5vbmUpOgotICAgICAgICBjb2x1bW5fY29sb3JzID0gQ09MVU1OX05BTUVfQ09MT1JTLmNvcHkoKQotICAgICAgICAjIGNoZWNrIGNvbHVtbiByb2xlIGFuZCBjb2xvciBhcHByb3ByaWF0ZWx5Ci0gICAgICAgIGlmIHRhYmxlX21ldGE6Ci0gICAgICAgICAgICBpZiBuYW1lIGluIFtjb2wubmFtZSBmb3IgY29sIGluIHRhYmxlX21ldGEucGFydGl0aW9uX2tleV06Ci0gICAgICAgICAgICAgICAgY29sdW1uX2NvbG9ycy5kZWZhdWx0X2ZhY3RvcnkgPSBsYW1iZGE6IFJFRAotICAgICAgICAgICAgZWxpZiBuYW1lIGluIFtjb2wubmFtZSBmb3IgY29sIGluIHRhYmxlX21ldGEuY2x1c3RlcmluZ19rZXldOgotICAgICAgICAgICAgICAgIGNvbHVtbl9jb2xvcnMuZGVmYXVsdF9mYWN0b3J5ID0gbGFtYmRhOiBDWUFOCi0gICAgICAgICAgICBlbGlmIG5hbWUgaW4gdGFibGVfbWV0YS5jb2x1bW5zIGFuZCB0YWJsZV9tZXRhLmNvbHVtbnNbbmFtZV0uaXNfc3RhdGljOgotICAgICAgICAgICAgICAgIGNvbHVtbl9jb2xvcnMuZGVmYXVsdF9mYWN0b3J5ID0gbGFtYmRhOiBXSElURQotICAgICAgICByZXR1cm4gc2VsZi5teWZvcm1hdF92YWx1ZShuYW1lLCBjb2xvcm1hcD1jb2x1bW5fY29sb3JzKQotCi0gICAgZGVmIHJlcG9ydF9jb25uZWN0aW9uKHNlbGYpOgotICAgICAgICBzZWxmLnNob3dfaG9zdCgpCi0gICAgICAgIHNlbGYuc2hvd192ZXJzaW9uKCkKLQotICAgIGRlZiBzaG93X2hvc3Qoc2VsZik6Ci0gICAgICAgIHByaW50KCJDb25uZWN0ZWQgdG8gezB9IGF0IHsxfTp7Mn0iCi0gICAgICAgICAgICAgIC5mb3JtYXQoc2VsZi5hcHBseWNvbG9yKHNlbGYuZ2V0X2NsdXN0ZXJfbmFtZSgpLCBCTFVFKSwKLSAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhvc3RuYW1lLAotICAgICAgICAgICAgICAgICAgICAgIHNlbGYucG9ydCkpCi0KLSAgICBkZWYgc2hvd192ZXJzaW9uKHNlbGYpOgotICAgICAgICB2ZXJzID0gc2VsZi5jb25uZWN0aW9uX3ZlcnNpb25zLmNvcHkoKQotICAgICAgICB2ZXJzWydzaHZlciddID0gdmVyc2lvbgotICAgICAgICAjIHN5c3RlbS5WZXJzaW9uc1snY3FsJ10gYXBwYXJlbnRseSBkb2VzIG5vdCByZWZsZWN0IGNoYW5nZXMgd2l0aAotICAgICAgICAjIHNldF9jcWxfdmVyc2lvbi4KLSAgICAgICAgdmVyc1snY3FsJ10gPSBzZWxmLmNxbF92ZXJzaW9uCi0gICAgICAgIHByaW50KCJbY3Fsc2ggJShzaHZlcilzIHwgQ2Fzc2FuZHJhICUoYnVpbGQpcyB8IENRTCBzcGVjICUoY3FsKXMgfCBOYXRpdmUgcHJvdG9jb2wgdiUocHJvdG9jb2wpc10iICUgdmVycykKLQotICAgIGRlZiBzaG93X3Nlc3Npb24oc2VsZiwgc2Vzc2lvbmlkLCBwYXJ0aWFsX3Nlc3Npb249RmFsc2UpOgotICAgICAgICBwcmludF90cmFjZV9zZXNzaW9uKHNlbGYsIHNlbGYuc2Vzc2lvbiwgc2Vzc2lvbmlkLCBwYXJ0aWFsX3Nlc3Npb24pCi0KLSAgICBkZWYgZ2V0X2Nvbm5lY3Rpb25fdmVyc2lvbnMoc2VsZik6Ci0gICAgICAgIHJlc3VsdCwgPSBzZWxmLnNlc3Npb24uZXhlY3V0ZSgic2VsZWN0ICogZnJvbSBzeXN0ZW0ubG9jYWwgd2hlcmUga2V5ID0gJ2xvY2FsJyIpCi0gICAgICAgIHZlcnMgPSB7Ci0gICAgICAgICAgICAnYnVpbGQnOiByZXN1bHRbJ3JlbGVhc2VfdmVyc2lvbiddLAotICAgICAgICAgICAgJ3Byb3RvY29sJzogc2VsZi5jb25uLnByb3RvY29sX3ZlcnNpb24sCi0gICAgICAgICAgICAnY3FsJzogcmVzdWx0WydjcWxfdmVyc2lvbiddLAotICAgICAgICB9Ci0gICAgICAgIHNlbGYuY29ubmVjdGlvbl92ZXJzaW9ucyA9IHZlcnMKLQotICAgIGRlZiBnZXRfa2V5c3BhY2VfbmFtZXMoc2VsZik6Ci0gICAgICAgIHJldHVybiBsaXN0KHNlbGYuY29ubi5tZXRhZGF0YS5rZXlzcGFjZXMpCi0KLSAgICBkZWYgZ2V0X2NvbHVtbmZhbWlseV9uYW1lcyhzZWxmLCBrc25hbWU9Tm9uZSk6Ci0gICAgICAgIGlmIGtzbmFtZSBpcyBOb25lOgotICAgICAgICAgICAga3NuYW1lID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCi0KLSAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5nZXRfa2V5c3BhY2VfbWV0YShrc25hbWUpLnRhYmxlcykKLQotICAgIGRlZiBnZXRfbWF0ZXJpYWxpemVkX3ZpZXdfbmFtZXMoc2VsZiwga3NuYW1lPU5vbmUpOgotICAgICAgICBpZiBrc25hbWUgaXMgTm9uZToKLSAgICAgICAgICAgIGtzbmFtZSA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQotCi0gICAgICAgIHJldHVybiBsaXN0KHNlbGYuZ2V0X2tleXNwYWNlX21ldGEoa3NuYW1lKS52aWV3cykKLQotICAgIGRlZiBnZXRfaW5kZXhfbmFtZXMoc2VsZiwga3NuYW1lPU5vbmUpOgotICAgICAgICBpZiBrc25hbWUgaXMgTm9uZToKLSAgICAgICAgICAgIGtzbmFtZSA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQotCi0gICAgICAgIHJldHVybiBsaXN0KHNlbGYuZ2V0X2tleXNwYWNlX21ldGEoa3NuYW1lKS5pbmRleGVzKQotCi0gICAgZGVmIGdldF9jb2x1bW5fbmFtZXMoc2VsZiwga3NuYW1lLCBjZm5hbWUpOgotICAgICAgICBpZiBrc25hbWUgaXMgTm9uZToKLSAgICAgICAgICAgIGtzbmFtZSA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQotICAgICAgICBsYXlvdXQgPSBzZWxmLmdldF90YWJsZV9tZXRhKGtzbmFtZSwgY2ZuYW1lKQotICAgICAgICByZXR1cm4gbGlzdChsYXlvdXQuY29sdW1ucykKLQotICAgIGRlZiBnZXRfdXNlcnR5cGVfbmFtZXMoc2VsZiwga3NuYW1lPU5vbmUpOgotICAgICAgICBpZiBrc25hbWUgaXMgTm9uZToKLSAgICAgICAgICAgIGtzbmFtZSA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQotCi0gICAgICAgIHJldHVybiBsaXN0KHNlbGYuZ2V0X2tleXNwYWNlX21ldGEoa3NuYW1lKS51c2VyX3R5cGVzKQotCi0gICAgZGVmIGdldF91c2VydHlwZV9sYXlvdXQoc2VsZiwga3NuYW1lLCB0eXBlbmFtZSk6Ci0gICAgICAgIGlmIGtzbmFtZSBpcyBOb25lOgotICAgICAgICAgICAga3NuYW1lID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCi0KLSAgICAgICAga3NfbWV0YSA9IHNlbGYuZ2V0X2tleXNwYWNlX21ldGEoa3NuYW1lKQotCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHVzZXJfdHlwZSA9IGtzX21ldGEudXNlcl90eXBlc1t0eXBlbmFtZV0KLSAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgcmFpc2UgVXNlclR5cGVOb3RGb3VuZCgiVXNlciB0eXBlIHshcn0gbm90IGZvdW5kIi5mb3JtYXQodHlwZW5hbWUpKQotCi0gICAgICAgIHJldHVybiBsaXN0KHppcCh1c2VyX3R5cGUuZmllbGRfbmFtZXMsIHVzZXJfdHlwZS5maWVsZF90eXBlcykpCi0KLSAgICBkZWYgZ2V0X3VzZXJmdW5jdGlvbl9uYW1lcyhzZWxmLCBrc25hbWU9Tm9uZSk6Ci0gICAgICAgIGlmIGtzbmFtZSBpcyBOb25lOgotICAgICAgICAgICAga3NuYW1lID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCi0KLSAgICAgICAgcmV0dXJuIFtmLm5hbWUgZm9yIGYgaW4gbGlzdChzZWxmLmdldF9rZXlzcGFjZV9tZXRhKGtzbmFtZSkuZnVuY3Rpb25zLnZhbHVlcygpKV0KLQotICAgIGRlZiBnZXRfdXNlcmFnZ3JlZ2F0ZV9uYW1lcyhzZWxmLCBrc25hbWU9Tm9uZSk6Ci0gICAgICAgIGlmIGtzbmFtZSBpcyBOb25lOgotICAgICAgICAgICAga3NuYW1lID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCi0KLSAgICAgICAgcmV0dXJuIFtmLm5hbWUgZm9yIGYgaW4gbGlzdChzZWxmLmdldF9rZXlzcGFjZV9tZXRhKGtzbmFtZSkuYWdncmVnYXRlcy52YWx1ZXMoKSldCi0KLSAgICBkZWYgZ2V0X2NsdXN0ZXJfbmFtZShzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuY29ubi5tZXRhZGF0YS5jbHVzdGVyX25hbWUKLQotICAgIGRlZiBnZXRfcGFydGl0aW9uZXIoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLmNvbm4ubWV0YWRhdGEucGFydGl0aW9uZXIKLQotICAgIGRlZiBnZXRfa2V5c3BhY2VfbWV0YShzZWxmLCBrc25hbWUpOgotICAgICAgICBpZiBrc25hbWUgaW4gc2VsZi5jb25uLm1ldGFkYXRhLmtleXNwYWNlczoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbm4ubWV0YWRhdGEua2V5c3BhY2VzW2tzbmFtZV0KLQotICAgICAgICByYWlzZSBLZXlzcGFjZU5vdEZvdW5kKCdLZXlzcGFjZSAlciBub3QgZm91bmQuJyAlIGtzbmFtZSkKLQotICAgIGRlZiBnZXRfa2V5c3BhY2VzKHNlbGYpOgotICAgICAgICByZXR1cm4gbGlzdChzZWxmLmNvbm4ubWV0YWRhdGEua2V5c3BhY2VzLnZhbHVlcygpKQotCi0gICAgZGVmIGdldF9yaW5nKHNlbGYsIGtzKToKLSAgICAgICAgc2VsZi5jb25uLm1ldGFkYXRhLnRva2VuX21hcC5yZWJ1aWxkX2tleXNwYWNlKGtzLCBidWlsZF9pZl9hYnNlbnQ9VHJ1ZSkKLSAgICAgICAgcmV0dXJuIHNlbGYuY29ubi5tZXRhZGF0YS50b2tlbl9tYXAudG9rZW5zX3RvX2hvc3RzX2J5X2tzW2tzXQotCi0gICAgZGVmIGdldF90YWJsZV9tZXRhKHNlbGYsIGtzbmFtZSwgdGFibGVuYW1lKToKLSAgICAgICAgaWYga3NuYW1lIGlzIE5vbmU6Ci0gICAgICAgICAgICBrc25hbWUgPSBzZWxmLmN1cnJlbnRfa2V5c3BhY2UKLSAgICAgICAga3NtZXRhID0gc2VsZi5nZXRfa2V5c3BhY2VfbWV0YShrc25hbWUpCi0gICAgICAgIGlmIHRhYmxlbmFtZSBub3QgaW4ga3NtZXRhLnRhYmxlczoKLSAgICAgICAgICAgIGlmIGtzbmFtZSA9PSAnc3lzdGVtX2F1dGgnIGFuZCB0YWJsZW5hbWUgaW4gWydyb2xlcycsICdyb2xlX3Blcm1pc3Npb25zJ106Ci0gICAgICAgICAgICAgICAgc2VsZi5nZXRfZmFrZV9hdXRoX3RhYmxlX21ldGEoa3NuYW1lLCB0YWJsZW5hbWUpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHJhaXNlIENvbHVtbkZhbWlseU5vdEZvdW5kKCJDb2x1bW4gZmFtaWx5IHt9IG5vdCBmb3VuZCIuZm9ybWF0KHRhYmxlbmFtZSkpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4ga3NtZXRhLnRhYmxlc1t0YWJsZW5hbWVdCi0KLSAgICBkZWYgZ2V0X2Zha2VfYXV0aF90YWJsZV9tZXRhKHNlbGYsIGtzbmFtZSwgdGFibGVuYW1lKToKLSAgICAgICAgIyBtYXkgYmUgdXNpbmcgZXh0ZXJuYWwgYXV0aCBpbXBsZW1lbnRhdGlvbiBzbyBpbnRlcm5hbCB0YWJsZXMKLSAgICAgICAgIyBhcmVuJ3QgYWN0dWFsbHkgZGVmaW5lZCBpbiBzY2hlbWEuIEluIHRoaXMgY2FzZSwgd2UnbGwgZmFrZQotICAgICAgICAjIHRoZW0gdXAKLSAgICAgICAgaWYgdGFibGVuYW1lID09ICdyb2xlcyc6Ci0gICAgICAgICAgICBrc19tZXRhID0gS2V5c3BhY2VNZXRhZGF0YShrc25hbWUsIFRydWUsIE5vbmUsIE5vbmUpCi0gICAgICAgICAgICB0YWJsZV9tZXRhID0gVGFibGVNZXRhZGF0YShrc19tZXRhLCAncm9sZXMnKQotICAgICAgICAgICAgdGFibGVfbWV0YS5jb2x1bW5zWydyb2xlJ10gPSBDb2x1bW5NZXRhZGF0YSh0YWJsZV9tZXRhLCAncm9sZScsIGNhc3NhbmRyYS5jcWx0eXBlcy5VVEY4VHlwZSkKLSAgICAgICAgICAgIHRhYmxlX21ldGEuY29sdW1uc1snaXNfc3VwZXJ1c2VyJ10gPSBDb2x1bW5NZXRhZGF0YSh0YWJsZV9tZXRhLCAnaXNfc3VwZXJ1c2VyJywgY2Fzc2FuZHJhLmNxbHR5cGVzLkJvb2xlYW5UeXBlKQotICAgICAgICAgICAgdGFibGVfbWV0YS5jb2x1bW5zWydjYW5fbG9naW4nXSA9IENvbHVtbk1ldGFkYXRhKHRhYmxlX21ldGEsICdjYW5fbG9naW4nLCBjYXNzYW5kcmEuY3FsdHlwZXMuQm9vbGVhblR5cGUpCi0gICAgICAgIGVsaWYgdGFibGVuYW1lID09ICdyb2xlX3Blcm1pc3Npb25zJzoKLSAgICAgICAgICAgIGtzX21ldGEgPSBLZXlzcGFjZU1ldGFkYXRhKGtzbmFtZSwgVHJ1ZSwgTm9uZSwgTm9uZSkKLSAgICAgICAgICAgIHRhYmxlX21ldGEgPSBUYWJsZU1ldGFkYXRhKGtzX21ldGEsICdyb2xlX3Blcm1pc3Npb25zJykKLSAgICAgICAgICAgIHRhYmxlX21ldGEuY29sdW1uc1sncm9sZSddID0gQ29sdW1uTWV0YWRhdGEodGFibGVfbWV0YSwgJ3JvbGUnLCBjYXNzYW5kcmEuY3FsdHlwZXMuVVRGOFR5cGUpCi0gICAgICAgICAgICB0YWJsZV9tZXRhLmNvbHVtbnNbJ3Jlc291cmNlJ10gPSBDb2x1bW5NZXRhZGF0YSh0YWJsZV9tZXRhLCAncmVzb3VyY2UnLCBjYXNzYW5kcmEuY3FsdHlwZXMuVVRGOFR5cGUpCi0gICAgICAgICAgICB0YWJsZV9tZXRhLmNvbHVtbnNbJ3Blcm1pc3Npb24nXSA9IENvbHVtbk1ldGFkYXRhKHRhYmxlX21ldGEsICdwZXJtaXNzaW9uJywgY2Fzc2FuZHJhLmNxbHR5cGVzLlVURjhUeXBlKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgQ29sdW1uRmFtaWx5Tm90Rm91bmQoIkNvbHVtbiBmYW1pbHkge30gbm90IGZvdW5kIi5mb3JtYXQodGFibGVuYW1lKSkKLQotICAgIGRlZiBnZXRfaW5kZXhfbWV0YShzZWxmLCBrc25hbWUsIGlkeG5hbWUpOgotICAgICAgICBpZiBrc25hbWUgaXMgTm9uZToKLSAgICAgICAgICAgIGtzbmFtZSA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQotICAgICAgICBrc21ldGEgPSBzZWxmLmdldF9rZXlzcGFjZV9tZXRhKGtzbmFtZSkKLQotICAgICAgICBpZiBpZHhuYW1lIG5vdCBpbiBrc21ldGEuaW5kZXhlczoKLSAgICAgICAgICAgIHJhaXNlIEluZGV4Tm90Rm91bmQoIkluZGV4IHt9IG5vdCBmb3VuZCIuZm9ybWF0KGlkeG5hbWUpKQotCi0gICAgICAgIHJldHVybiBrc21ldGEuaW5kZXhlc1tpZHhuYW1lXQotCi0gICAgZGVmIGdldF92aWV3X21ldGEoc2VsZiwga3NuYW1lLCB2aWV3bmFtZSk6Ci0gICAgICAgIGlmIGtzbmFtZSBpcyBOb25lOgotICAgICAgICAgICAga3NuYW1lID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCi0gICAgICAgIGtzbWV0YSA9IHNlbGYuZ2V0X2tleXNwYWNlX21ldGEoa3NuYW1lKQotCi0gICAgICAgIGlmIHZpZXduYW1lIG5vdCBpbiBrc21ldGEudmlld3M6Ci0gICAgICAgICAgICByYWlzZSBNYXRlcmlhbGl6ZWRWaWV3Tm90Rm91bmQoIk1hdGVyaWFsaXplZCB2aWV3ICd7fScgbm90IGZvdW5kIi5mb3JtYXQodmlld25hbWUpKQotICAgICAgICByZXR1cm4ga3NtZXRhLnZpZXdzW3ZpZXduYW1lXQotCi0gICAgZGVmIGdldF9vYmplY3RfbWV0YShzZWxmLCBrcywgbmFtZSk6Ci0gICAgICAgIGlmIG5hbWUgaXMgTm9uZToKLSAgICAgICAgICAgIGlmIGtzIGFuZCBrcyBpbiBzZWxmLmNvbm4ubWV0YWRhdGEua2V5c3BhY2VzOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbm4ubWV0YWRhdGEua2V5c3BhY2VzW2tzXQotICAgICAgICAgICAgZWxpZiBzZWxmLmN1cnJlbnRfa2V5c3BhY2UgaXMgTm9uZToKLSAgICAgICAgICAgICAgICByYWlzZSBPYmplY3ROb3RGb3VuZCgiJ3t9JyBub3QgZm91bmQgaW4ga2V5c3BhY2VzIi5mb3JtYXQoa3MpKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBuYW1lID0ga3MKLSAgICAgICAgICAgICAgICBrcyA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQotCi0gICAgICAgIGlmIGtzIGlzIE5vbmU6Ci0gICAgICAgICAgICBrcyA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQotCi0gICAgICAgIGtzbWV0YSA9IHNlbGYuZ2V0X2tleXNwYWNlX21ldGEoa3MpCi0KLSAgICAgICAgaWYgbmFtZSBpbiBrc21ldGEudGFibGVzOgotICAgICAgICAgICAgcmV0dXJuIGtzbWV0YS50YWJsZXNbbmFtZV0KLSAgICAgICAgZWxpZiBuYW1lIGluIGtzbWV0YS5pbmRleGVzOgotICAgICAgICAgICAgcmV0dXJuIGtzbWV0YS5pbmRleGVzW25hbWVdCi0gICAgICAgIGVsaWYgbmFtZSBpbiBrc21ldGEudmlld3M6Ci0gICAgICAgICAgICByZXR1cm4ga3NtZXRhLnZpZXdzW25hbWVdCi0KLSAgICAgICAgcmFpc2UgT2JqZWN0Tm90Rm91bmQoIid7fScgbm90IGZvdW5kIGluIGtleXNwYWNlICd7fSciLmZvcm1hdChuYW1lLCBrcykpCi0KLSAgICBkZWYgZ2V0X3RyaWdnZXJfbmFtZXMoc2VsZiwga3NuYW1lPU5vbmUpOgotICAgICAgICBpZiBrc25hbWUgaXMgTm9uZToKLSAgICAgICAgICAgIGtzbmFtZSA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQotCi0gICAgICAgIHJldHVybiBbdHJpZ2dlci5uYW1lCi0gICAgICAgICAgICAgICAgZm9yIHRhYmxlIGluIGxpc3Qoc2VsZi5nZXRfa2V5c3BhY2VfbWV0YShrc25hbWUpLnRhYmxlcy52YWx1ZXMoKSkKLSAgICAgICAgICAgICAgICBmb3IgdHJpZ2dlciBpbiBsaXN0KHRhYmxlLnRyaWdnZXJzLnZhbHVlcygpKV0KLQotICAgIGRlZiByZXNldF9zdGF0ZW1lbnQoc2VsZik6Ci0gICAgICAgIHNlbGYucmVzZXRfcHJvbXB0KCkKLSAgICAgICAgc2VsZi5zdGF0ZW1lbnQudHJ1bmNhdGUoMCkKLSAgICAgICAgc2VsZi5zdGF0ZW1lbnQuc2VlaygwKQotICAgICAgICBzZWxmLmVtcHR5X2xpbmVzID0gMAotCi0gICAgZGVmIHJlc2V0X3Byb21wdChzZWxmKToKLSAgICAgICAgaWYgc2VsZi5jdXJyZW50X2tleXNwYWNlIGlzIE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnNldF9wcm9tcHQoc2VsZi5kZWZhdWx0X3Byb21wdCwgVHJ1ZSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuc2V0X3Byb21wdChzZWxmLmtleXNwYWNlX3Byb21wdC5mb3JtYXQoc2VsZi5jdXJyZW50X2tleXNwYWNlKSwgVHJ1ZSkKLQotICAgIGRlZiBzZXRfY29udGludWVfcHJvbXB0KHNlbGYpOgotICAgICAgICBpZiBzZWxmLmVtcHR5X2xpbmVzID49IDM6Ci0gICAgICAgICAgICBzZWxmLnNldF9wcm9tcHQoIlN0YXRlbWVudHMgYXJlIHRlcm1pbmF0ZWQgd2l0aCBhICc7Jy4gIFlvdSBjYW4gcHJlc3MgQ1RSTC1DIHRvIGNhbmNlbCBhbiBpbmNvbXBsZXRlIHN0YXRlbWVudC4iKQotICAgICAgICAgICAgc2VsZi5lbXB0eV9saW5lcyA9IDAKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBzZWxmLmN1cnJlbnRfa2V5c3BhY2UgaXMgTm9uZToKLSAgICAgICAgICAgIHNlbGYuc2V0X3Byb21wdChzZWxmLmNvbnRpbnVlX3Byb21wdCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNwYWNlcyA9ICcgJyAqIGxlbihzdHIoc2VsZi5jdXJyZW50X2tleXNwYWNlKSkKLSAgICAgICAgICAgIHNlbGYuc2V0X3Byb21wdChzZWxmLmtleXNwYWNlX2NvbnRpbnVlX3Byb21wdC5mb3JtYXQoc3BhY2VzKSkKLSAgICAgICAgc2VsZi5lbXB0eV9saW5lcyA9IHNlbGYuZW1wdHlfbGluZXMgKyAxIGlmIG5vdCBzZWxmLmxhc3RjbWQgZWxzZSAwCi0KLSAgICBAY29udGV4dG1hbmFnZXIKLSAgICBkZWYgcHJlcGFyZV9sb29wKHNlbGYpOgotICAgICAgICByZWFkbGluZSA9IE5vbmUKLSAgICAgICAgaWYgc2VsZi50dHkgYW5kIHNlbGYuY29tcGxldGVrZXk6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgaW1wb3J0IHJlYWRsaW5lCi0gICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBvbGRfY29tcGxldGVyID0gcmVhZGxpbmUuZ2V0X2NvbXBsZXRlcigpCi0gICAgICAgICAgICAgICAgcmVhZGxpbmUuc2V0X2NvbXBsZXRlcihzZWxmLmNvbXBsZXRlKQotICAgICAgICAgICAgICAgIGlmIHJlYWRsaW5lLl9fZG9jX18gaXMgbm90IE5vbmUgYW5kICdsaWJlZGl0JyBpbiByZWFkbGluZS5fX2RvY19fOgotICAgICAgICAgICAgICAgICAgICByZWFkbGluZS5wYXJzZV9hbmRfYmluZCgiYmluZCAtZSIpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRsaW5lLnBhcnNlX2FuZF9iaW5kKCJiaW5kICciICsgc2VsZi5jb21wbGV0ZWtleSArICInIHJsX2NvbXBsZXRlIikKLSAgICAgICAgICAgICAgICAgICAgcmVhZGxpbmUucGFyc2VfYW5kX2JpbmQoImJpbmQgXlIgZW0taW5jLXNlYXJjaC1wcmV2IikKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICByZWFkbGluZS5wYXJzZV9hbmRfYmluZChzZWxmLmNvbXBsZXRla2V5ICsgIjogY29tcGxldGUiKQotICAgICAgICAjIHN0YXJ0IGNvdmVyYWdlIGNvbGxlY3Rpb24gaWYgcmVxdWVzdGVkLCB1bmxlc3MgaW4gc3Vic2hlbGwKLSAgICAgICAgaWYgc2VsZi5jb3ZlcmFnZSBhbmQgbm90IHNlbGYuaXNfc3Vic2hlbGw6Ci0gICAgICAgICAgICAjIGNoZWNrIGZvciBjb3ZlcmFnZXJjIGZpbGUsIHdyaXRlIGl0IGlmIG1pc3NpbmcKLSAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKENRTF9ESVIpOgotICAgICAgICAgICAgICAgIHNlbGYuY292ZXJhZ2VyY19wYXRoID0gb3MucGF0aC5qb2luKENRTF9ESVIsICcuY292ZXJhZ2VyYycpCi0gICAgICAgICAgICAgICAgY292ZGF0YV9wYXRoID0gb3MucGF0aC5qb2luKENRTF9ESVIsICcuY292ZXJhZ2UnKQotICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShzZWxmLmNvdmVyYWdlcmNfcGF0aCk6Ci0gICAgICAgICAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLmNvdmVyYWdlcmNfcGF0aCwgJ3cnKSBhcyBmOgotICAgICAgICAgICAgICAgICAgICAgICAgZi53cml0ZWxpbmVzKFsiW3J1bl1cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25jdXJyZW5jeSA9IG11bHRpcHJvY2Vzc2luZ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFfZmlsZSA9IHt9XG4iLmZvcm1hdChjb3ZkYXRhX3BhdGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYWxsZWwgPSB0cnVlXG4iXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICAjIHN0YXJ0IGNvdmVyYWdlCi0gICAgICAgICAgICAgICAgaW1wb3J0IGNvdmVyYWdlCi0gICAgICAgICAgICAgICAgc2VsZi5jb3YgPSBjb3ZlcmFnZS5Db3ZlcmFnZShjb25maWdfZmlsZT1zZWxmLmNvdmVyYWdlcmNfcGF0aCkKLSAgICAgICAgICAgICAgICBzZWxmLmNvdi5zdGFydCgpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHlpZWxkCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBpZiByZWFkbGluZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICByZWFkbGluZS5zZXRfY29tcGxldGVyKG9sZF9jb21wbGV0ZXIpCi0gICAgICAgICAgICBpZiBzZWxmLmNvdmVyYWdlIGFuZCBub3Qgc2VsZi5pc19zdWJzaGVsbDoKLSAgICAgICAgICAgICAgICBzZWxmLnN0b3BfY292ZXJhZ2UoKQotCi0gICAgZGVmIGdldF9pbnB1dF9saW5lKHNlbGYsIHByb21wdD0nJyk6Ci0gICAgICAgIGlmIHNlbGYudHR5OgotICAgICAgICAgICAgc2VsZi5sYXN0Y21kID0gaW5wdXQoc3RyKHByb21wdCkpCi0gICAgICAgICAgICBsaW5lID0gc2VsZi5sYXN0Y21kICsgJ1xuJwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5sYXN0Y21kID0gc2VsZi5zdGRpbi5yZWFkbGluZSgpCi0gICAgICAgICAgICBsaW5lID0gc2VsZi5sYXN0Y21kCi0gICAgICAgICAgICBpZiBub3QgbGVuKGxpbmUpOgotICAgICAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yCi0gICAgICAgIHNlbGYubGluZW5vICs9IDEKLSAgICAgICAgcmV0dXJuIGxpbmUKLQotICAgIGRlZiB1c2Vfc3RkaW5fcmVhZGVyKHNlbGYsIHVudGlsPScnLCBwcm9tcHQ9JycpOgotICAgICAgICB1bnRpbCArPSAnXG4nCi0gICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgbmV3bGluZSA9IHNlbGYuZ2V0X2lucHV0X2xpbmUocHJvbXB0PXByb21wdCkKLSAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKLSAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIGlmIG5ld2xpbmUgPT0gdW50aWw6Ci0gICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICB5aWVsZCBuZXdsaW5lCi0KLSAgICBkZWYgY21kbG9vcChzZWxmLCBpbnRybz1Ob25lKToKLSAgICAgICAgIiIiCi0gICAgICAgIEFkYXB0ZWQgZnJvbSBjbWQuQ21kJ3MgdmVyc2lvbiwgYmVjYXVzZSB0aGVyZSBpcyBsaXRlcmFsbHkgbm8gd2F5IHdpdGgKLSAgICAgICAgY21kLkNtZC5jbWRsb29wKCkgdG8gdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuICJFT0YiIHNob3dpbmcgdXAgaW4KLSAgICAgICAgaW5wdXQgYW5kIGFuIGFjdHVhbCBFT0YuCi0gICAgICAgICIiIgotICAgICAgICB3aXRoIHNlbGYucHJlcGFyZV9sb29wKCk6Ci0gICAgICAgICAgICB3aGlsZSBub3Qgc2VsZi5zdG9wOgotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5zaW5nbGVfc3RhdGVtZW50OgotICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuc2luZ2xlX3N0YXRlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdG9wID0gVHJ1ZQotICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuZ2V0X2lucHV0X2xpbmUoc2VsZi5wcm9tcHQpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGVtZW50LndyaXRlKGxpbmUpCi0gICAgICAgICAgICAgICAgICAgIGlmIHNlbGYub25lY21kKHNlbGYuc3RhdGVtZW50LmdldHZhbHVlKCkpOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXNldF9zdGF0ZW1lbnQoKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZW9mKCkKLSAgICAgICAgICAgICAgICBleGNlcHQgQ1FMX0VSUk9SUyBhcyBjcWxlcnI6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoY3FsZXJyLm1lc3NhZ2UpCi0gICAgICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc2V0X3N0YXRlbWVudCgpCi0gICAgICAgICAgICAgICAgICAgIHByaW50KCcnKQotCi0gICAgZGVmIHN0cmlwX2NvbW1lbnRfYmxvY2tzKHNlbGYsIHN0YXRlbWVudHRleHQpOgotICAgICAgICBjb21tZW50X2Jsb2NrX2luX2xpdGVyYWxfc3RyaW5nID0gcmUuc2VhcmNoKCdbIl0uKlsvXVsqXS4qWypdWy9dLipbIl0nLCBzdGF0ZW1lbnR0ZXh0KQotICAgICAgICBpZiBub3QgY29tbWVudF9ibG9ja19pbl9saXRlcmFsX3N0cmluZzoKLSAgICAgICAgICAgIHJlc3VsdCA9IHJlLnN1YignWy9dWypdLipbKl1bL10nLCAiIiwgc3RhdGVtZW50dGV4dCkKLSAgICAgICAgICAgIGlmICcqLycgaW4gcmVzdWx0IGFuZCAnLyonIG5vdCBpbiByZXN1bHQgYW5kIG5vdCBzZWxmLmluX2NvbW1lbnQ6Ci0gICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoIkVuY291bnRlcmVkIGNvbW1lbnQgYmxvY2sgdGVybWluYXRvciB3aXRob3V0IGJlaW5nIGluIGNvbW1lbnQgYmxvY2siKQotICAgICAgICAgICAgaWYgJy8qJyBpbiByZXN1bHQ6Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmUuc3ViKCdbL11bKl0uKicsICIiLCByZXN1bHQpCi0gICAgICAgICAgICAgICAgc2VsZi5pbl9jb21tZW50ID0gVHJ1ZQotICAgICAgICAgICAgaWYgJyovJyBpbiByZXN1bHQ6Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmUuc3ViKCcuKlsqXVsvXScsICIiLCByZXN1bHQpCi0gICAgICAgICAgICAgICAgc2VsZi5pbl9jb21tZW50ID0gRmFsc2UKLSAgICAgICAgICAgIGlmIHNlbGYuaW5fY29tbWVudCBhbmQgbm90IHJlLmZpbmRhbGwoJ1svXVsqXXxbKl1bL10nLCBzdGF0ZW1lbnR0ZXh0KToKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAnJwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAotICAgICAgICByZXR1cm4gc3RhdGVtZW50dGV4dAotCi0gICAgZGVmIG9uZWNtZChzZWxmLCBzdGF0ZW1lbnR0ZXh0KToKLSAgICAgICAgIiIiCi0gICAgICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RhdGVtZW50IGlzIGNvbXBsZXRlIGFuZCB3YXMgaGFuZGxlZCAobWVhbmluZyBpdAotICAgICAgICBjYW4gYmUgcmVzZXQpLgotICAgICAgICAiIiIKLSAgICAgICAgc3RhdGVtZW50dGV4dCA9IHNlbGYuc3RyaXBfY29tbWVudF9ibG9ja3Moc3RhdGVtZW50dGV4dCkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc3RhdGVtZW50cywgZW5kdG9rZW5fZXNjYXBlZCA9IGNxbHJ1bGVzZXQuY3FsX3NwbGl0X3N0YXRlbWVudHMoc3RhdGVtZW50dGV4dCkKLSAgICAgICAgZXhjZXB0IHB5bGV4b3Ryb24uTGV4aW5nRXJyb3IgYXMgZToKLSAgICAgICAgICAgIGlmIHNlbGYuc2hvd19saW5lX251bXM6Ci0gICAgICAgICAgICAgICAgc2VsZi5wcmludGVycignSW52YWxpZCBzeW50YXggYXQgbGluZSB7MH0sIGNoYXIgezF9JwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvcm1hdChlLmxpbmVudW0sIGUuY2hhcm51bSkpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoJ0ludmFsaWQgc3ludGF4IGF0IGNoYXIgezB9Jy5mb3JtYXQoZS5jaGFybnVtKSkKLSAgICAgICAgICAgIHN0YXRlbWVudGxpbmUgPSBzdGF0ZW1lbnR0ZXh0LnNwbGl0KCdcbicpW2UubGluZW51bSAtIDFdCi0gICAgICAgICAgICBzZWxmLnByaW50ZXJyKCcgIHswfScuZm9ybWF0KHN0YXRlbWVudGxpbmUpKQotICAgICAgICAgICAgc2VsZi5wcmludGVycignIHswfV4nLmZvcm1hdCgnICcgKiBlLmNoYXJudW0pKQotICAgICAgICAgICAgcmV0dXJuIFRydWUKLQotICAgICAgICB3aGlsZSBzdGF0ZW1lbnRzIGFuZCBub3Qgc3RhdGVtZW50c1stMV06Ci0gICAgICAgICAgICBzdGF0ZW1lbnRzID0gc3RhdGVtZW50c1s6LTFdCi0gICAgICAgIGlmIG5vdCBzdGF0ZW1lbnRzOgotICAgICAgICAgICAgcmV0dXJuIFRydWUKLSAgICAgICAgaWYgZW5kdG9rZW5fZXNjYXBlZCBvciBzdGF0ZW1lbnRzWy0xXVstMV1bMF0gIT0gJ2VuZHRva2VuJzoKLSAgICAgICAgICAgIHNlbGYuc2V0X2NvbnRpbnVlX3Byb21wdCgpCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgZm9yIHN0IGluIHN0YXRlbWVudHM6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfc3RhdGVtZW50KHN0LCBzdGF0ZW1lbnR0ZXh0KQotICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgotICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWc6Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoZSkKLSAgICAgICAgcmV0dXJuIFRydWUKLQotICAgIGRlZiBoYW5kbGVfZW9mKHNlbGYpOgotICAgICAgICBpZiBzZWxmLnR0eToKLSAgICAgICAgICAgIHByaW50KCcnKQotICAgICAgICBzdGF0ZW1lbnQgPSBzZWxmLnN0YXRlbWVudC5nZXR2YWx1ZSgpCi0gICAgICAgIGlmIHN0YXRlbWVudC5zdHJpcCgpOgotICAgICAgICAgICAgaWYgbm90IHNlbGYub25lY21kKHN0YXRlbWVudCk6Ci0gICAgICAgICAgICAgICAgc2VsZi5wcmludGVycignSW5jb21wbGV0ZSBzdGF0ZW1lbnQgYXQgZW5kIG9mIGZpbGUnKQotICAgICAgICBzZWxmLmRvX2V4aXQoKQotCi0gICAgZGVmIGhhbmRsZV9zdGF0ZW1lbnQoc2VsZiwgdG9rZW5zLCBzcmNzdHIpOgotICAgICAgICAjIENvbmNhdCBtdWx0aS1saW5lIHN0YXRlbWVudHMgYW5kIGluc2VydCBpbnRvIGhpc3RvcnkKLSAgICAgICAgaWYgcmVhZGxpbmUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBubF9jb3VudCA9IHNyY3N0ci5jb3VudCgiXG4iKQotCi0gICAgICAgICAgICBuZXdfaGlzdCA9IHNyY3N0ci5yZXBsYWNlKCJcbiIsICIgIikucnN0cmlwKCkKLQotICAgICAgICAgICAgaWYgbmxfY291bnQgPiAxIGFuZCBzZWxmLmxhc3RfaGlzdCAhPSBuZXdfaGlzdDoKLSAgICAgICAgICAgICAgICByZWFkbGluZS5hZGRfaGlzdG9yeShuZXdfaGlzdCkKLQotICAgICAgICAgICAgc2VsZi5sYXN0X2hpc3QgPSBuZXdfaGlzdAotICAgICAgICBjbWR3b3JkID0gdG9rZW5zWzBdWzFdCi0gICAgICAgIGlmIGNtZHdvcmQgPT0gJz8nOgotICAgICAgICAgICAgY21kd29yZCA9ICdoZWxwJwotICAgICAgICBjdXN0b21faGFuZGxlciA9IGdldGF0dHIoc2VsZiwgJ2RvXycgKyBjbWR3b3JkLmxvd2VyKCksIE5vbmUpCi0gICAgICAgIGlmIGN1c3RvbV9oYW5kbGVyOgotICAgICAgICAgICAgcGFyc2VkID0gY3FscnVsZXNldC5jcWxfd2hvbGVfcGFyc2VfdG9rZW5zKHRva2Vucywgc3Jjc3RyPXNyY3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydHN5bWJvbD0nY3Fsc2hDb21tYW5kJykKLSAgICAgICAgICAgIGlmIHBhcnNlZCBhbmQgbm90IHBhcnNlZC5yZW1haW5kZXI6Ci0gICAgICAgICAgICAgICAgIyBzdWNjZXNzZnVsIGNvbXBsZXRlIHBhcnNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbV9oYW5kbGVyKHBhcnNlZCkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaGFuZGxlX3BhcnNlX2Vycm9yKGNtZHdvcmQsIHRva2VucywgcGFyc2VkLCBzcmNzdHIpCi0gICAgICAgIHJldHVybiBzZWxmLnBlcmZvcm1fc3RhdGVtZW50KGNxbHJ1bGVzZXQuY3FsX2V4dHJhY3Rfb3JpZyh0b2tlbnMsIHNyY3N0cikpCi0KLSAgICBkZWYgaGFuZGxlX3BhcnNlX2Vycm9yKHNlbGYsIGNtZHdvcmQsIHRva2VucywgcGFyc2VkLCBzcmNzdHIpOgotICAgICAgICBpZiBjbWR3b3JkLmxvd2VyKCkgaW4gKCdzZWxlY3QnLCAnaW5zZXJ0JywgJ3VwZGF0ZScsICdkZWxldGUnLCAndHJ1bmNhdGUnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjcmVhdGUnLCAnZHJvcCcsICdhbHRlcicsICdncmFudCcsICdyZXZva2UnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYXRjaCcsICdsaXN0Jyk6Ci0gICAgICAgICAgICAjIGhleSwgbWF5YmUgdGhleSBrbm93IGFib3V0IHNvbWUgbmV3IHN5bnRheCB3ZSBkb24ndC4gdHlwZQotICAgICAgICAgICAgIyBhc3N1bXB0aW9ucyB3b24ndCB3b3JrLCBidXQgbWF5YmUgdGhlIHF1ZXJ5IHdpbGwuCi0gICAgICAgICAgICByZXR1cm4gc2VsZi5wZXJmb3JtX3N0YXRlbWVudChjcWxydWxlc2V0LmNxbF9leHRyYWN0X29yaWcodG9rZW5zLCBzcmNzdHIpKQotICAgICAgICBpZiBwYXJzZWQ6Ci0gICAgICAgICAgICBzZWxmLnByaW50ZXJyKCdJbXByb3BlciAlcyBjb21tYW5kIChwcm9ibGVtIGF0ICVyKS4nICUgKGNtZHdvcmQsIHBhcnNlZC5yZW1haW5kZXJbMF0pKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5wcmludGVycignSW1wcm9wZXIgJXMgY29tbWFuZC4nICUgY21kd29yZCkKLQotICAgIGRlZiBkb191c2Uoc2VsZiwgcGFyc2VkKToKLSAgICAgICAga3NuYW1lID0gcGFyc2VkLmdldF9iaW5kaW5nKCdrc25hbWUnKQotICAgICAgICBzdWNjZXNzLCBfID0gc2VsZi5wZXJmb3JtX3NpbXBsZV9zdGF0ZW1lbnQoU2ltcGxlU3RhdGVtZW50KHBhcnNlZC5leHRyYWN0X29yaWcoKSkpCi0gICAgICAgIGlmIHN1Y2Nlc3M6Ci0gICAgICAgICAgICBpZiBrc25hbWVbMF0gPT0gJyInIGFuZCBrc25hbWVbLTFdID09ICciJzoKLSAgICAgICAgICAgICAgICBzZWxmLmN1cnJlbnRfa2V5c3BhY2UgPSBzZWxmLmNxbF91bnByb3RlY3RfbmFtZShrc25hbWUpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudF9rZXlzcGFjZSA9IGtzbmFtZS5sb3dlcigpCi0KLSAgICBkZWYgZG9fc2VsZWN0KHNlbGYsIHBhcnNlZCk6Ci0gICAgICAgIHRyYWNpbmdfd2FzX2VuYWJsZWQgPSBzZWxmLnRyYWNpbmdfZW5hYmxlZAotICAgICAgICBrc25hbWUgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ2tzbmFtZScpCi0gICAgICAgIHN0b3BfdHJhY2luZyA9IGtzbmFtZSA9PSAnc3lzdGVtX3RyYWNlcycgb3IgKGtzbmFtZSBpcyBOb25lIGFuZCBzZWxmLmN1cnJlbnRfa2V5c3BhY2UgPT0gJ3N5c3RlbV90cmFjZXMnKQotICAgICAgICBzZWxmLnRyYWNpbmdfZW5hYmxlZCA9IHNlbGYudHJhY2luZ19lbmFibGVkIGFuZCBub3Qgc3RvcF90cmFjaW5nCi0gICAgICAgIHN0YXRlbWVudCA9IHBhcnNlZC5leHRyYWN0X29yaWcoKQotICAgICAgICBzZWxmLnBlcmZvcm1fc3RhdGVtZW50KHN0YXRlbWVudCkKLSAgICAgICAgc2VsZi50cmFjaW5nX2VuYWJsZWQgPSB0cmFjaW5nX3dhc19lbmFibGVkCi0KLSAgICBkZWYgcGVyZm9ybV9zdGF0ZW1lbnQoc2VsZiwgc3RhdGVtZW50KToKLQotICAgICAgICBzdG10ID0gU2ltcGxlU3RhdGVtZW50KHN0YXRlbWVudCwgY29uc2lzdGVuY3lfbGV2ZWw9c2VsZi5jb25zaXN0ZW5jeV9sZXZlbCwgc2VyaWFsX2NvbnNpc3RlbmN5X2xldmVsPXNlbGYuc2VyaWFsX2NvbnNpc3RlbmN5X2xldmVsLCBmZXRjaF9zaXplPXNlbGYucGFnZV9zaXplIGlmIHNlbGYudXNlX3BhZ2luZyBlbHNlIE5vbmUpCi0gICAgICAgIHN1Y2Nlc3MsIGZ1dHVyZSA9IHNlbGYucGVyZm9ybV9zaW1wbGVfc3RhdGVtZW50KHN0bXQpCi0KLSAgICAgICAgaWYgZnV0dXJlOgotICAgICAgICAgICAgaWYgZnV0dXJlLndhcm5pbmdzOgotICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfd2FybmluZ3MoZnV0dXJlLndhcm5pbmdzKQotCi0gICAgICAgICAgICBpZiBzZWxmLnRyYWNpbmdfZW5hYmxlZDoKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIGZvciB0cmFjZSBpbiBmdXR1cmUuZ2V0X2FsbF9xdWVyeV90cmFjZXMobWF4X3dhaXRfcGVyPXNlbGYubWF4X3RyYWNlX3dhaXQsIHF1ZXJ5X2NsPXNlbGYuY29uc2lzdGVuY3lfbGV2ZWwpOgotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdHJhY2Uoc2VsZiwgdHJhY2UpCi0gICAgICAgICAgICAgICAgZXhjZXB0IFRyYWNlVW5hdmFpbGFibGU6Ci0gICAgICAgICAgICAgICAgICAgIG1zZyA9ICJTdGF0ZW1lbnQgdHJhY2UgZGlkIG5vdCBjb21wbGV0ZSB3aXRoaW4gJWQgc2Vjb25kczsgdHJhY2UgZGF0YSBtYXkgYmUgaW5jb21wbGV0ZS4iICUgKHNlbGYuc2Vzc2lvbi5tYXhfdHJhY2Vfd2FpdCwpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQobXNnLCBjb2xvcj1SRUQpCi0gICAgICAgICAgICAgICAgICAgIGZvciB0cmFjZV9pZCBpbiBmdXR1cmUuZ2V0X3F1ZXJ5X3RyYWNlX2lkcygpOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93X3Nlc3Npb24odHJhY2VfaWQsIHBhcnRpYWxfc2Vzc2lvbj1UcnVlKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXJyOgotICAgICAgICAgICAgICAgICAgICBzZWxmLnByaW50ZXJyKCJVbmFibGUgdG8gZmV0Y2ggcXVlcnkgdHJhY2U6ICVzIiAlIChzdHIoZXJyKSwpKQotCi0gICAgICAgIHJldHVybiBzdWNjZXNzCi0KLSAgICBkZWYgcGFyc2VfZm9yX3NlbGVjdF9tZXRhKHNlbGYsIHF1ZXJ5X3N0cmluZyk6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHBhcnNlZCA9IGNxbHJ1bGVzZXQuY3FsX3BhcnNlKHF1ZXJ5X3N0cmluZylbMV0KLSAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICBrcyA9IHNlbGYuY3FsX3VucHJvdGVjdF9uYW1lKHBhcnNlZC5nZXRfYmluZGluZygna3NuYW1lJywgTm9uZSkpCi0gICAgICAgIG5hbWUgPSBzZWxmLmNxbF91bnByb3RlY3RfbmFtZShwYXJzZWQuZ2V0X2JpbmRpbmcoJ2NmbmFtZScsIE5vbmUpKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5nZXRfdGFibGVfbWV0YShrcywgbmFtZSkKLSAgICAgICAgZXhjZXB0IENvbHVtbkZhbWlseU5vdEZvdW5kOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmdldF92aWV3X21ldGEoa3MsIG5hbWUpCi0gICAgICAgICAgICBleGNlcHQgTWF0ZXJpYWxpemVkVmlld05vdEZvdW5kOgotICAgICAgICAgICAgICAgIHJhaXNlIE9iamVjdE5vdEZvdW5kKCIne30nIG5vdCBmb3VuZCBpbiBrZXlzcGFjZSAne30nIi5mb3JtYXQobmFtZSwga3MpKQotCi0gICAgZGVmIHBhcnNlX2Zvcl91cGRhdGVfbWV0YShzZWxmLCBxdWVyeV9zdHJpbmcpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBwYXJzZWQgPSBjcWxydWxlc2V0LmNxbF9wYXJzZShxdWVyeV9zdHJpbmcpWzFdCi0gICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAga3MgPSBzZWxmLmNxbF91bnByb3RlY3RfbmFtZShwYXJzZWQuZ2V0X2JpbmRpbmcoJ2tzbmFtZScsIE5vbmUpKQotICAgICAgICBjZiA9IHNlbGYuY3FsX3VucHJvdGVjdF9uYW1lKHBhcnNlZC5nZXRfYmluZGluZygnY2ZuYW1lJykpCi0gICAgICAgIHJldHVybiBzZWxmLmdldF90YWJsZV9tZXRhKGtzLCBjZikKLQotICAgIGRlZiBwZXJmb3JtX3NpbXBsZV9zdGF0ZW1lbnQoc2VsZiwgc3RhdGVtZW50KToKLSAgICAgICAgaWYgbm90IHN0YXRlbWVudDoKLSAgICAgICAgICAgIHJldHVybiBGYWxzZSwgTm9uZQotCi0gICAgICAgIGZ1dHVyZSA9IHNlbGYuc2Vzc2lvbi5leGVjdXRlX2FzeW5jKHN0YXRlbWVudCwgdHJhY2U9c2VsZi50cmFjaW5nX2VuYWJsZWQpCi0gICAgICAgIHJlc3VsdCA9IE5vbmUKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmVzdWx0ID0gZnV0dXJlLnJlc3VsdCgpCi0gICAgICAgIGV4Y2VwdCBDUUxfRVJST1JTIGFzIGVycjoKLSAgICAgICAgICAgIGVycl9tc2cgPSBlcnIubWVzc2FnZSBpZiBoYXNhdHRyKGVyciwgJ21lc3NhZ2UnKSBlbHNlIHN0cihlcnIpCi0gICAgICAgICAgICBzZWxmLnByaW50ZXJyKHN0cihlcnIuX19jbGFzc19fLl9fbmFtZV9fKSArICI6ICIgKyBlcnJfbXNnKQotICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgotICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjawotICAgICAgICAgICAgc2VsZi5wcmludGVycih0cmFjZWJhY2suZm9ybWF0X2V4YygpKQotCi0gICAgICAgICMgRXZlbiBpZiBzdGF0ZW1lbnQgZmFpbGVkIHdlIHRyeSB0byByZWZyZXNoIHNjaGVtYSBpZiBub3QgYWdyZWVkIChzZWUgQ0FTU0FORFJBLTk2ODkpCi0gICAgICAgIGlmIG5vdCBmdXR1cmUuaXNfc2NoZW1hX2FncmVlZDoKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzZWxmLmNvbm4ucmVmcmVzaF9zY2hlbWFfbWV0YWRhdGEoNSkgICMgd2lsbCB0aHJvdyBleGNlcHRpb24gaWYgdGhlcmUgaXMgYSBzY2hlbWEgbWlzbWF0Y2gKLSAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246Ci0gICAgICAgICAgICAgICAgc2VsZi5wcmludGVycigiV2FybmluZzogc2NoZW1hIHZlcnNpb24gbWlzbWF0Y2ggZGV0ZWN0ZWQ7IGNoZWNrIHRoZSBzY2hlbWEgdmVyc2lvbnMgb2YgeW91ciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9kZXMgaW4gc3lzdGVtLmxvY2FsIGFuZCBzeXN0ZW0ucGVlcnMuIikKLSAgICAgICAgICAgICAgICBzZWxmLmNvbm4ucmVmcmVzaF9zY2hlbWFfbWV0YWRhdGEoLTEpCi0KLSAgICAgICAgaWYgcmVzdWx0IGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UsIE5vbmUKLQotICAgICAgICBpZiBzdGF0ZW1lbnQucXVlcnlfc3RyaW5nWzo2XS5sb3dlcigpID09ICdzZWxlY3QnOgotICAgICAgICAgICAgc2VsZi5wcmludF9yZXN1bHQocmVzdWx0LCBzZWxmLnBhcnNlX2Zvcl9zZWxlY3RfbWV0YShzdGF0ZW1lbnQucXVlcnlfc3RyaW5nKSkKLSAgICAgICAgZWxpZiBzdGF0ZW1lbnQucXVlcnlfc3RyaW5nLmxvd2VyKCkuc3RhcnRzd2l0aCgibGlzdCB1c2VycyIpIG9yIHN0YXRlbWVudC5xdWVyeV9zdHJpbmcubG93ZXIoKS5zdGFydHN3aXRoKCJsaXN0IHJvbGVzIik6Ci0gICAgICAgICAgICBzZWxmLnByaW50X3Jlc3VsdChyZXN1bHQsIHNlbGYuZ2V0X3RhYmxlX21ldGEoJ3N5c3RlbV9hdXRoJywgJ3JvbGVzJykpCi0gICAgICAgIGVsaWYgc3RhdGVtZW50LnF1ZXJ5X3N0cmluZy5sb3dlcigpLnN0YXJ0c3dpdGgoImxpc3QiKToKLSAgICAgICAgICAgIHNlbGYucHJpbnRfcmVzdWx0KHJlc3VsdCwgc2VsZi5nZXRfdGFibGVfbWV0YSgnc3lzdGVtX2F1dGgnLCAncm9sZV9wZXJtaXNzaW9ucycpKQotICAgICAgICBlbGlmIHJlc3VsdDoKLSAgICAgICAgICAgICMgQ0FTIElOU0VSVC9VUERBVEUKLSAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoIiIpCi0gICAgICAgICAgICBzZWxmLnByaW50X3N0YXRpY19yZXN1bHQocmVzdWx0LCBzZWxmLnBhcnNlX2Zvcl91cGRhdGVfbWV0YShzdGF0ZW1lbnQucXVlcnlfc3RyaW5nKSwgd2l0aF9oZWFkZXI9VHJ1ZSwgdHR5PXNlbGYudHR5KQotICAgICAgICBzZWxmLmZsdXNoX291dHB1dCgpCi0gICAgICAgIHJldHVybiBUcnVlLCBmdXR1cmUKLQotICAgIGRlZiBwcmludF9yZXN1bHQoc2VsZiwgcmVzdWx0LCB0YWJsZV9tZXRhKToKLSAgICAgICAgc2VsZi5kZWNvZGluZ19lcnJvcnMgPSBbXQotCi0gICAgICAgIHNlbGYud3JpdGVyZXN1bHQoIiIpCi0KLSAgICAgICAgZGVmIHByaW50X2FsbChyZXN1bHQsIHRhYmxlX21ldGEsIHR0eSk6Ci0gICAgICAgICAgICAjIFJldHVybiB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdG90YWwKLSAgICAgICAgICAgIG51bV9yb3dzID0gMAotICAgICAgICAgICAgaXNfZmlyc3QgPSBUcnVlCi0gICAgICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgICAgICMgQWx3YXlzIHByaW50IGZvciB0aGUgZmlyc3QgcGFnZSBldmVuIGl0IGlzIGVtcHR5Ci0gICAgICAgICAgICAgICAgaWYgcmVzdWx0LmN1cnJlbnRfcm93cyBvciBpc19maXJzdDoKLSAgICAgICAgICAgICAgICAgICAgd2l0aF9oZWFkZXIgPSBpc19maXJzdCBvciB0dHkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmludF9zdGF0aWNfcmVzdWx0KHJlc3VsdCwgdGFibGVfbWV0YSwgd2l0aF9oZWFkZXIsIHR0eSwgbnVtX3Jvd3MpCi0gICAgICAgICAgICAgICAgICAgIG51bV9yb3dzICs9IGxlbihyZXN1bHQuY3VycmVudF9yb3dzKQotICAgICAgICAgICAgICAgIGlmIHJlc3VsdC5oYXNfbW9yZV9wYWdlczoKLSAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5zaHVudGVkX3F1ZXJ5X291dCBpcyBOb25lIGFuZCB0dHk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAjIE9ubHkgcGF1c2Ugd2hlbiBub3QgY2FwdHVyaW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoIi0tLU1PUkUtLS0iKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQuZmV0Y2hfbmV4dF9wYWdlKCkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBpZiBub3QgdHR5OgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZXJlc3VsdCgiIikKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICBpc19maXJzdCA9IEZhbHNlCi0gICAgICAgICAgICByZXR1cm4gbnVtX3Jvd3MKLQotICAgICAgICBudW1fcm93cyA9IHByaW50X2FsbChyZXN1bHQsIHRhYmxlX21ldGEsIHNlbGYudHR5KQotICAgICAgICBzZWxmLndyaXRlcmVzdWx0KCIoJWQgcm93cykiICUgbnVtX3Jvd3MpCi0KLSAgICAgICAgaWYgc2VsZi5kZWNvZGluZ19lcnJvcnM6Ci0gICAgICAgICAgICBmb3IgZXJyIGluIHNlbGYuZGVjb2RpbmdfZXJyb3JzWzoyXToKLSAgICAgICAgICAgICAgICBzZWxmLndyaXRlcmVzdWx0KGVyci5tZXNzYWdlKCksIGNvbG9yPVJFRCkKLSAgICAgICAgICAgIGlmIGxlbihzZWxmLmRlY29kaW5nX2Vycm9ycykgPiAyOgotICAgICAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoJyVkIG1vcmUgZGVjb2RpbmcgZXJyb3JzIHN1cHByZXNzZWQuJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAobGVuKHNlbGYuZGVjb2RpbmdfZXJyb3JzKSAtIDIpLCBjb2xvcj1SRUQpCi0KLSAgICBkZWYgcHJpbnRfc3RhdGljX3Jlc3VsdChzZWxmLCByZXN1bHQsIHRhYmxlX21ldGEsIHdpdGhfaGVhZGVyLCB0dHksIHJvd19jb3VudF9vZmZzZXQ9MCk6Ci0gICAgICAgIGlmIG5vdCByZXN1bHQuY29sdW1uX25hbWVzIGFuZCBub3QgdGFibGVfbWV0YToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgICAgIGNvbHVtbl9uYW1lcyA9IHJlc3VsdC5jb2x1bW5fbmFtZXMgb3IgbGlzdCh0YWJsZV9tZXRhLmNvbHVtbnMua2V5cygpKQotICAgICAgICBmb3JtYXR0ZWRfbmFtZXMgPSBbc2VsZi5teWZvcm1hdF9jb2xuYW1lKG5hbWUsIHRhYmxlX21ldGEpIGZvciBuYW1lIGluIGNvbHVtbl9uYW1lc10KLSAgICAgICAgaWYgbm90IHJlc3VsdC5jdXJyZW50X3Jvd3M6Ci0gICAgICAgICAgICAjIHByaW50IGhlYWRlciBvbmx5Ci0gICAgICAgICAgICBzZWxmLnByaW50X2Zvcm1hdHRlZF9yZXN1bHQoZm9ybWF0dGVkX25hbWVzLCBOb25lLCB3aXRoX2hlYWRlcj1UcnVlLCB0dHk9dHR5KQotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgY3FsX3R5cGVzID0gW10KLSAgICAgICAgaWYgcmVzdWx0LmNvbHVtbl90eXBlczoKLSAgICAgICAgICAgIGtzX25hbWUgPSB0YWJsZV9tZXRhLmtleXNwYWNlX25hbWUgaWYgdGFibGVfbWV0YSBlbHNlIHNlbGYuY3VycmVudF9rZXlzcGFjZQotICAgICAgICAgICAga3NfbWV0YSA9IHNlbGYuY29ubi5tZXRhZGF0YS5rZXlzcGFjZXMuZ2V0KGtzX25hbWUsIE5vbmUpCi0gICAgICAgICAgICBjcWxfdHlwZXMgPSBbQ3FsVHlwZShjcWxfdHlwZW5hbWUodCksIGtzX21ldGEpIGZvciB0IGluIHJlc3VsdC5jb2x1bW5fdHlwZXNdCi0KLSAgICAgICAgZm9ybWF0dGVkX3ZhbHVlcyA9IFtsaXN0KG1hcChzZWxmLm15Zm9ybWF0X3ZhbHVlLCBbcm93W2NdIGZvciBjIGluIGNvbHVtbl9uYW1lc10sIGNxbF90eXBlcykpIGZvciByb3cgaW4gcmVzdWx0LmN1cnJlbnRfcm93c10KLQotICAgICAgICBpZiBzZWxmLmV4cGFuZF9lbmFibGVkOgotICAgICAgICAgICAgc2VsZi5wcmludF9mb3JtYXR0ZWRfcmVzdWx0X3ZlcnRpY2FsbHkoZm9ybWF0dGVkX25hbWVzLCBmb3JtYXR0ZWRfdmFsdWVzLCByb3dfY291bnRfb2Zmc2V0KQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5wcmludF9mb3JtYXR0ZWRfcmVzdWx0KGZvcm1hdHRlZF9uYW1lcywgZm9ybWF0dGVkX3ZhbHVlcywgd2l0aF9oZWFkZXIsIHR0eSkKLQotICAgIGRlZiBwcmludF9mb3JtYXR0ZWRfcmVzdWx0KHNlbGYsIGZvcm1hdHRlZF9uYW1lcywgZm9ybWF0dGVkX3ZhbHVlcywgd2l0aF9oZWFkZXIsIHR0eSk6Ci0gICAgICAgICMgZGV0ZXJtaW5lIGNvbHVtbiB3aWR0aHMKLSAgICAgICAgd2lkdGhzID0gW24uZGlzcGxheXdpZHRoIGZvciBuIGluIGZvcm1hdHRlZF9uYW1lc10KLSAgICAgICAgaWYgZm9ybWF0dGVkX3ZhbHVlcyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGZvciBmbXRyb3cgaW4gZm9ybWF0dGVkX3ZhbHVlczoKLSAgICAgICAgICAgICAgICBmb3IgbnVtLCBjb2wgaW4gZW51bWVyYXRlKGZtdHJvdyk6Ci0gICAgICAgICAgICAgICAgICAgIHdpZHRoc1tudW1dID0gbWF4KHdpZHRoc1tudW1dLCBjb2wuZGlzcGxheXdpZHRoKQotCi0gICAgICAgICMgcHJpbnQgaGVhZGVyCi0gICAgICAgIGlmIHdpdGhfaGVhZGVyOgotICAgICAgICAgICAgaGVhZGVyID0gJyB8ICcuam9pbihoZHIubGp1c3QodywgY29sb3I9c2VsZi5jb2xvcikgZm9yIChoZHIsIHcpIGluIHppcChmb3JtYXR0ZWRfbmFtZXMsIHdpZHRocykpCi0gICAgICAgICAgICBzZWxmLndyaXRlcmVzdWx0KCcgJyArIGhlYWRlci5yc3RyaXAoKSkKLSAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoJy0lcy0nICUgJy0rLScuam9pbignLScgKiB3IGZvciB3IGluIHdpZHRocykpCi0KLSAgICAgICAgIyBzdG9wIGlmIHRoZXJlIGFyZSBubyByb3dzCi0gICAgICAgIGlmIGZvcm1hdHRlZF92YWx1ZXMgaXMgTm9uZToKLSAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoIiIpCi0gICAgICAgICAgICByZXR1cm4KLQotICAgICAgICAjIHByaW50IHJvdyBkYXRhCi0gICAgICAgIGZvciByb3cgaW4gZm9ybWF0dGVkX3ZhbHVlczoKLSAgICAgICAgICAgIGxpbmUgPSAnIHwgJy5qb2luKGNvbC5yanVzdCh3LCBjb2xvcj1zZWxmLmNvbG9yKSBmb3IgKGNvbCwgdykgaW4gemlwKHJvdywgd2lkdGhzKSkKLSAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoJyAnICsgbGluZSkKLQotICAgICAgICBpZiB0dHk6Ci0gICAgICAgICAgICBzZWxmLndyaXRlcmVzdWx0KCIiKQotCi0gICAgZGVmIHByaW50X2Zvcm1hdHRlZF9yZXN1bHRfdmVydGljYWxseShzZWxmLCBmb3JtYXR0ZWRfbmFtZXMsIGZvcm1hdHRlZF92YWx1ZXMsIHJvd19jb3VudF9vZmZzZXQpOgotICAgICAgICBtYXhfY29sX3dpZHRoID0gbWF4KFtuLmRpc3BsYXl3aWR0aCBmb3IgbiBpbiBmb3JtYXR0ZWRfbmFtZXNdKQotICAgICAgICBtYXhfdmFsX3dpZHRoID0gbWF4KFtuLmRpc3BsYXl3aWR0aCBmb3Igcm93IGluIGZvcm1hdHRlZF92YWx1ZXMgZm9yIG4gaW4gcm93XSkKLQotICAgICAgICAjIGZvciBlYWNoIHJvdyByZXR1cm5lZCwgbGlzdCBhbGwgdGhlIGNvbHVtbi12YWx1ZSBwYWlycwotICAgICAgICBmb3IgaSwgcm93IGluIGVudW1lcmF0ZShmb3JtYXR0ZWRfdmFsdWVzKToKLSAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoIkAgUm93ICVkIiAlIChyb3dfY291bnRfb2Zmc2V0ICsgaSArIDEpKQotICAgICAgICAgICAgc2VsZi53cml0ZXJlc3VsdCgnLSVzLScgJSAnLSstJy5qb2luKFsnLScgKiBtYXhfY29sX3dpZHRoLCAnLScgKiBtYXhfdmFsX3dpZHRoXSkpCi0gICAgICAgICAgICBmb3IgZmllbGRfaWQsIGZpZWxkIGluIGVudW1lcmF0ZShyb3cpOgotICAgICAgICAgICAgICAgIGNvbHVtbiA9IGZvcm1hdHRlZF9uYW1lc1tmaWVsZF9pZF0ubGp1c3QobWF4X2NvbF93aWR0aCwgY29sb3I9c2VsZi5jb2xvcikKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IGZpZWxkLmxqdXN0KGZpZWxkLmRpc3BsYXl3aWR0aCwgY29sb3I9c2VsZi5jb2xvcikKLSAgICAgICAgICAgICAgICBzZWxmLndyaXRlcmVzdWx0KCcgJyArICIgfCAiLmpvaW4oW2NvbHVtbiwgdmFsdWVdKSkKLSAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoJycpCi0KLSAgICBkZWYgcHJpbnRfd2FybmluZ3Moc2VsZiwgd2FybmluZ3MpOgotICAgICAgICBpZiB3YXJuaW5ncyBpcyBOb25lIG9yIGxlbih3YXJuaW5ncykgPT0gMDoKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgICAgIHNlbGYud3JpdGVyZXN1bHQoJycpCi0gICAgICAgIHNlbGYud3JpdGVyZXN1bHQoJ1dhcm5pbmdzIDonKQotICAgICAgICBmb3Igd2FybmluZyBpbiB3YXJuaW5nczoKLSAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQod2FybmluZykKLSAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoJycpCi0KLSAgICBkZWYgZW1wdHlsaW5lKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgcGFyc2VsaW5lKHNlbGYsIGxpbmUpOgotICAgICAgICAjIHRoaXMgc2hvdWxkbid0IGJlIG5lZWRlZAotICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgICBkZWYgY29tcGxldGUoc2VsZiwgdGV4dCwgc3RhdGUpOgotICAgICAgICBpZiByZWFkbGluZSBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGlmIHN0YXRlID09IDA6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc2VsZi5jb21wbGV0aW9uX21hdGNoZXMgPSBzZWxmLmZpbmRfY29tcGxldGlvbnModGV4dCkKLSAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246Ci0gICAgICAgICAgICAgICAgaWYgZGVidWdfY29tcGxldGlvbjoKLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjawotICAgICAgICAgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICByYWlzZQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5jb21wbGV0aW9uX21hdGNoZXNbc3RhdGVdCi0gICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgIGRlZiBmaW5kX2NvbXBsZXRpb25zKHNlbGYsIHRleHQpOgotICAgICAgICBjdXJsaW5lID0gcmVhZGxpbmUuZ2V0X2xpbmVfYnVmZmVyKCkKLSAgICAgICAgcHJldmxpbmVzID0gc2VsZi5zdGF0ZW1lbnQuZ2V0dmFsdWUoKQotICAgICAgICB3aG9sZXN0bXQgPSBwcmV2bGluZXMgKyBjdXJsaW5lCi0gICAgICAgIGJlZ2lkeCA9IHJlYWRsaW5lLmdldF9iZWdpZHgoKSArIGxlbihwcmV2bGluZXMpCi0gICAgICAgIHN0dWZmX3RvX2NvbXBsZXRlID0gd2hvbGVzdG10WzpiZWdpZHhdCi0gICAgICAgIHJldHVybiBjcWxydWxlc2V0LmNxbF9jb21wbGV0ZShzdHVmZl90b19jb21wbGV0ZSwgdGV4dCwgY2Fzc2FuZHJhX2Nvbm49c2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnPWRlYnVnX2NvbXBsZXRpb24sIHN0YXJ0c3ltYm9sPSdjcWxzaENvbW1hbmQnKQotCi0gICAgZGVmIHNldF9wcm9tcHQoc2VsZiwgcHJvbXB0LCBwcmVwZW5kX3VzZXI9RmFsc2UpOgotICAgICAgICBpZiBwcmVwZW5kX3VzZXIgYW5kIHNlbGYudXNlcm5hbWU6Ci0gICAgICAgICAgICBzZWxmLnByb21wdCA9ICJ7MH1AezF9Ii5mb3JtYXQoc2VsZi51c2VybmFtZSwgcHJvbXB0KQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYucHJvbXB0ID0gcHJvbXB0Ci0KLSAgICBkZWYgY3FsX3VucHJvdGVjdF9uYW1lKHNlbGYsIG5hbWVzdHIpOgotICAgICAgICBpZiBuYW1lc3RyIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgcmV0dXJuIGNxbHJ1bGVzZXQuZGVxdW90ZV9uYW1lKG5hbWVzdHIpCi0KLSAgICBkZWYgY3FsX3VucHJvdGVjdF92YWx1ZShzZWxmLCB2YWxzdHIpOgotICAgICAgICBpZiB2YWxzdHIgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gY3FscnVsZXNldC5kZXF1b3RlX3ZhbHVlKHZhbHN0cikKLQotICAgIGRlZiBfY29sdW1uaXplX3VuaWNvZGUoc2VsZiwgbmFtZV9saXN0KToKLSAgICAgICAgIiIiCi0gICAgICAgIFVzZWQgd2hlbiBjb2x1bW5pemluZyBpZGVudGlmaWVycyB0aGF0IG1heSBjb250YWluIHVuaWNvZGUKLSAgICAgICAgIiIiCi0gICAgICAgIG5hbWVzID0gW24gZm9yIG4gaW4gbmFtZV9saXN0XQotICAgICAgICBjbWQuQ21kLmNvbHVtbml6ZShzZWxmLCBuYW1lcykKLSAgICAgICAgcHJpbnQoJycpCi0KLSAgICBkZWYgZG9fZGVzY3JpYmUoc2VsZiwgcGFyc2VkKToKLQotICAgICAgICAiIiIKLSAgICAgICAgREVTQ1JJQkUgW2NxbHNoIG9ubHldCi0KLSAgICAgICAgKERFU0MgbWF5IGJlIHVzZWQgYXMgYSBzaG9ydGhhbmQuKQotCi0gICAgICAgICAgT3V0cHV0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29ubmVjdGVkIENhc3NhbmRyYSBjbHVzdGVyLCBvciBhYm91dAotICAgICAgICAgIHRoZSBkYXRhIG9iamVjdHMgc3RvcmVkIGluIHRoZSBjbHVzdGVyLiBVc2UgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgd2F5czoKLQotICAgICAgICBERVNDUklCRSBLRVlTUEFDRVMKLQotICAgICAgICAgIE91dHB1dCB0aGUgbmFtZXMgb2YgYWxsIGtleXNwYWNlcy4KLQotICAgICAgICBERVNDUklCRSBLRVlTUEFDRSBbPGtleXNwYWNlbmFtZT5dCi0KLSAgICAgICAgICBPdXRwdXQgQ1FMIGNvbW1hbmRzIHRoYXQgY291bGQgYmUgdXNlZCB0byByZWNyZWF0ZSB0aGUgZ2l2ZW4ga2V5c3BhY2UsCi0gICAgICAgICAgYW5kIHRoZSBvYmplY3RzIGluIGl0IChzdWNoIGFzIHRhYmxlcywgdHlwZXMsIGZ1bmN0aW9ucywgZXRjLikuCi0gICAgICAgICAgSW4gc29tZSBjYXNlcywgYXMgdGhlIENRTCBpbnRlcmZhY2UgbWF0dXJlcywgdGhlcmUgd2lsbCBiZSBzb21lIG1ldGFkYXRhCi0gICAgICAgICAgYWJvdXQgYSBrZXlzcGFjZSB0aGF0IGlzIG5vdCByZXByZXNlbnRhYmxlIHdpdGggQ1FMLiBUaGF0IG1ldGFkYXRhIHdpbGwgbm90IGJlIHNob3duLgotICAgICAgICAgIFRoZSAnPGtleXNwYWNlbmFtZT4nIGFyZ3VtZW50IG1heSBiZSBvbWl0dGVkLCBpbiB3aGljaCBjYXNlIHRoZSBjdXJyZW50Ci0gICAgICAgICAga2V5c3BhY2Ugd2lsbCBiZSBkZXNjcmliZWQuCi0KLSAgICAgICAgREVTQ1JJQkUgVEFCTEVTCi0KLSAgICAgICAgICBPdXRwdXQgdGhlIG5hbWVzIG9mIGFsbCB0YWJsZXMgaW4gdGhlIGN1cnJlbnQga2V5c3BhY2UsIG9yIGluIGFsbAotICAgICAgICAgIGtleXNwYWNlcyBpZiB0aGVyZSBpcyBubyBjdXJyZW50IGtleXNwYWNlLgotCi0gICAgICAgIERFU0NSSUJFIFRBQkxFIFs8a2V5c3BhY2U+Ll08dGFibGVuYW1lPgotCi0gICAgICAgICAgT3V0cHV0IENRTCBjb21tYW5kcyB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gcmVjcmVhdGUgdGhlIGdpdmVuIHRhYmxlLgotICAgICAgICAgIEluIHNvbWUgY2FzZXMsIGFzIGFib3ZlLCB0aGVyZSBtYXkgYmUgdGFibGUgbWV0YWRhdGEgd2hpY2ggaXMgbm90Ci0gICAgICAgICAgcmVwcmVzZW50YWJsZSBhbmQgd2hpY2ggd2lsbCBub3QgYmUgc2hvd24uCi0KLSAgICAgICAgREVTQ1JJQkUgSU5ERVggPGluZGV4bmFtZT4KLQotICAgICAgICAgIE91dHB1dCB0aGUgQ1FMIGNvbW1hbmQgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIHJlY3JlYXRlIHRoZSBnaXZlbiBpbmRleC4KLSAgICAgICAgICBJbiBzb21lIGNhc2VzLCB0aGVyZSBtYXkgYmUgaW5kZXggbWV0YWRhdGEgd2hpY2ggaXMgbm90IHJlcHJlc2VudGFibGUKLSAgICAgICAgICBhbmQgd2hpY2ggd2lsbCBub3QgYmUgc2hvd24uCi0KLSAgICAgICAgREVTQ1JJQkUgTUFURVJJQUxJWkVEIFZJRVcgPHZpZXduYW1lPgotCi0gICAgICAgICAgT3V0cHV0IHRoZSBDUUwgY29tbWFuZCB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gcmVjcmVhdGUgdGhlIGdpdmVuIG1hdGVyaWFsaXplZCB2aWV3LgotICAgICAgICAgIEluIHNvbWUgY2FzZXMsIHRoZXJlIG1heSBiZSBtYXRlcmlhbGl6ZWQgdmlldyBtZXRhZGF0YSB3aGljaCBpcyBub3QgcmVwcmVzZW50YWJsZQotICAgICAgICAgIGFuZCB3aGljaCB3aWxsIG5vdCBiZSBzaG93bi4KLQotICAgICAgICBERVNDUklCRSBDTFVTVEVSCi0KLSAgICAgICAgICBPdXRwdXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbm5lY3RlZCBDYXNzYW5kcmEgY2x1c3Rlciwgc3VjaCBhcyB0aGUKLSAgICAgICAgICBjbHVzdGVyIG5hbWUsIGFuZCB0aGUgcGFydGl0aW9uZXIgYW5kIHNuaXRjaCBpbiB1c2UuIFdoZW4geW91IGFyZQotICAgICAgICAgIGNvbm5lY3RlZCB0byBhIG5vbi1zeXN0ZW0ga2V5c3BhY2UsIGFsc28gc2hvd3MgZW5kcG9pbnQtcmFuZ2UKLSAgICAgICAgICBvd25lcnNoaXAgaW5mb3JtYXRpb24gZm9yIHRoZSBDYXNzYW5kcmEgcmluZy4KLQotICAgICAgICBERVNDUklCRSBbRlVMTF0gU0NIRU1BCi0KLSAgICAgICAgICBPdXRwdXQgQ1FMIGNvbW1hbmRzIHRoYXQgY291bGQgYmUgdXNlZCB0byByZWNyZWF0ZSB0aGUgZW50aXJlIChub24tc3lzdGVtKSBzY2hlbWEuCi0gICAgICAgICAgV29ya3MgYXMgdGhvdWdoICJERVNDUklCRSBLRVlTUEFDRSBrIiB3YXMgaW52b2tlZCBmb3IgZWFjaCBub24tc3lzdGVtIGtleXNwYWNlCi0gICAgICAgICAgay4gVXNlIERFU0NSSUJFIEZVTEwgU0NIRU1BIHRvIGluY2x1ZGUgdGhlIHN5c3RlbSBrZXlzcGFjZXMuCi0KLSAgICAgICAgREVTQ1JJQkUgVFlQRVMKLQotICAgICAgICAgIE91dHB1dCB0aGUgbmFtZXMgb2YgYWxsIHVzZXItZGVmaW5lZC10eXBlcyBpbiB0aGUgY3VycmVudCBrZXlzcGFjZSwgb3IgaW4gYWxsCi0gICAgICAgICAga2V5c3BhY2VzIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQga2V5c3BhY2UuCi0KLSAgICAgICAgREVTQ1JJQkUgVFlQRSBbPGtleXNwYWNlPi5dPHR5cGU+Ci0KLSAgICAgICAgICBPdXRwdXQgdGhlIENRTCBjb21tYW5kIHRoYXQgY291bGQgYmUgdXNlZCB0byByZWNyZWF0ZSB0aGUgZ2l2ZW4gdXNlci1kZWZpbmVkLXR5cGUuCi0KLSAgICAgICAgREVTQ1JJQkUgRlVOQ1RJT05TCi0KLSAgICAgICAgICBPdXRwdXQgdGhlIG5hbWVzIG9mIGFsbCB1c2VyLWRlZmluZWQtZnVuY3Rpb25zIGluIHRoZSBjdXJyZW50IGtleXNwYWNlLCBvciBpbiBhbGwKLSAgICAgICAgICBrZXlzcGFjZXMgaWYgdGhlcmUgaXMgbm8gY3VycmVudCBrZXlzcGFjZS4KLQotICAgICAgICBERVNDUklCRSBGVU5DVElPTiBbPGtleXNwYWNlPi5dPGZ1bmN0aW9uPgotCi0gICAgICAgICAgT3V0cHV0IHRoZSBDUUwgY29tbWFuZCB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gcmVjcmVhdGUgdGhlIGdpdmVuIHVzZXItZGVmaW5lZC1mdW5jdGlvbi4KLQotICAgICAgICBERVNDUklCRSBBR0dSRUdBVEVTCi0KLSAgICAgICAgICBPdXRwdXQgdGhlIG5hbWVzIG9mIGFsbCB1c2VyLWRlZmluZWQtYWdncmVnYXRlcyBpbiB0aGUgY3VycmVudCBrZXlzcGFjZSwgb3IgaW4gYWxsCi0gICAgICAgICAga2V5c3BhY2VzIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQga2V5c3BhY2UuCi0KLSAgICAgICAgREVTQ1JJQkUgQUdHUkVHQVRFIFs8a2V5c3BhY2U+Ll08YWdncmVnYXRlPgotCi0gICAgICAgICAgT3V0cHV0IHRoZSBDUUwgY29tbWFuZCB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gcmVjcmVhdGUgdGhlIGdpdmVuIHVzZXItZGVmaW5lZC1hZ2dyZWdhdGUuCi0KLSAgICAgICAgREVTQ1JJQkUgPG9iam5hbWU+Ci0KLSAgICAgICAgICBPdXRwdXQgQ1FMIGNvbW1hbmRzIHRoYXQgY291bGQgYmUgdXNlZCB0byByZWNyZWF0ZSB0aGUgZW50aXJlIG9iamVjdCBzY2hlbWEsCi0gICAgICAgICAgd2hlcmUgb2JqZWN0IGNhbiBiZSBlaXRoZXIgYSBrZXlzcGFjZSBvciBhIHRhYmxlIG9yIGFuIGluZGV4IG9yIGEgbWF0ZXJpYWxpemVkCi0gICAgICAgICAgdmlldyAoaW4gdGhpcyBvcmRlcikuCi0gICAgICAgICIiIgotICAgICAgICBzdG10ID0gU2ltcGxlU3RhdGVtZW50KHBhcnNlZC5leHRyYWN0X29yaWcoKSwgY29uc2lzdGVuY3lfbGV2ZWw9Y2Fzc2FuZHJhLkNvbnNpc3RlbmN5TGV2ZWwuTE9DQUxfT05FLCBmZXRjaF9zaXplPXNlbGYucGFnZV9zaXplIGlmIHNlbGYudXNlX3BhZ2luZyBlbHNlIE5vbmUpCi0gICAgICAgIGZ1dHVyZSA9IHNlbGYuc2Vzc2lvbi5leGVjdXRlX2FzeW5jKHN0bXQpCi0KLSAgICAgICAgaWYgc2VsZi5jb25uZWN0aW9uX3ZlcnNpb25zWydidWlsZCddWzBdIDwgJzQnOgotICAgICAgICAgICAgcHJpbnQoJ1xuV0FSTjogREVTQ1JJQkV8REVTQyB3YXMgbW92ZWQgdG8gc2VydmVyIHNpZGUgaW4gQ2Fzc2FuZHJhIDQuMC4gQXMgYSBjb25zZXF1ZW5jZSBERVNSSUJFfERFU0MgJwotICAgICAgICAgICAgICAgICAgJ3dpbGwgbm90IHdvcmsgaW4gY3Fsc2ggJXIgY29ubmVjdGVkIHRvIENhc3NhbmRyYSAlciwgdGhlIHZlcnNpb24gdGhhdCB5b3UgYXJlIGNvbm5lY3RlZCB0by4gJwotICAgICAgICAgICAgICAgICAgJ0RFU0NSSUJFIGRvZXMgbm90IGV4aXN0IHNlcnZlciBzaWRlIHByaW9yIENhc3NhbmRyYSA0LjAuJwotICAgICAgICAgICAgICAgICAgJSAodmVyc2lvbiwgc2VsZi5jb25uZWN0aW9uX3ZlcnNpb25zWydidWlsZCddKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBmdXR1cmUucmVzdWx0KCkKLQotICAgICAgICAgICAgICAgIHdoYXQgPSBwYXJzZWQubWF0Y2hlZFsxXVsxXS5sb3dlcigpCi0KLSAgICAgICAgICAgICAgICBpZiB3aGF0IGluICgnY29sdW1uZmFtaWxpZXMnLCAndGFibGVzJywgJ3R5cGVzJywgJ2Z1bmN0aW9ucycsICdhZ2dyZWdhdGVzJyk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzY3JpYmVfbGlzdChyZXN1bHQpCi0gICAgICAgICAgICAgICAgZWxpZiB3aGF0ID09ICdrZXlzcGFjZXMnOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmRlc2NyaWJlX2tleXNwYWNlcyhyZXN1bHQpCi0gICAgICAgICAgICAgICAgZWxpZiB3aGF0ID09ICdjbHVzdGVyJzoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5kZXNjcmliZV9jbHVzdGVyKHJlc3VsdCkKLSAgICAgICAgICAgICAgICBlbGlmIHdoYXQ6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzY3JpYmVfZWxlbWVudChyZXN1bHQpCi0KLSAgICAgICAgICAgIGV4Y2VwdCBDUUxfRVJST1JTIGFzIGVycjoKLSAgICAgICAgICAgICAgICBlcnJfbXNnID0gZXJyLm1lc3NhZ2UgaWYgaGFzYXR0cihlcnIsICdtZXNzYWdlJykgZWxzZSBzdHIoZXJyKQotICAgICAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoZXJyX21zZy5wYXJ0aXRpb24oIm1lc3NhZ2U9IilbMl0uc3RyaXAoJyInKSkKLSAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246Ci0gICAgICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjawotICAgICAgICAgICAgICAgIHNlbGYucHJpbnRlcnIodHJhY2ViYWNrLmZvcm1hdF9leGMoKSkKLQotICAgICAgICAgICAgaWYgZnV0dXJlOgotICAgICAgICAgICAgICAgIGlmIGZ1dHVyZS53YXJuaW5nczoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmludF93YXJuaW5ncyhmdXR1cmUud2FybmluZ3MpCi0KLSAgICBkb19kZXNjID0gZG9fZGVzY3JpYmUKLQotICAgIGRlZiBkZXNjcmliZV9rZXlzcGFjZXMoc2VsZiwgcm93cyk6Ci0gICAgICAgICIiIgotICAgICAgICBQcmludCB0aGUgb3V0cHV0IGZvciBhIERFU0NSSUJFIEtFWVNQQUNFUyBxdWVyeQotICAgICAgICAiIiIKLSAgICAgICAgbmFtZXMgPSBbclsnbmFtZSddIGZvciByIGluIHJvd3NdCi0KLSAgICAgICAgcHJpbnQoJycpCi0gICAgICAgIGNtZC5DbWQuY29sdW1uaXplKHNlbGYsIG5hbWVzKQotICAgICAgICBwcmludCgnJykKLQotICAgIGRlZiBkZXNjcmliZV9saXN0KHNlbGYsIHJvd3MpOgotICAgICAgICAiIiIKLSAgICAgICAgUHJpbnQgdGhlIG91dHB1dCBmb3IgYWxsIHRoZSBERVNDUklCRSBxdWVyaWVzIGZvciBlbGVtZW50IG5hbWVzIChlLmcgREVTQ1JJQkUgVEFCTEVTLCBERVNDUklCRSBGVU5DVElPTlMgLi4uKQotICAgICAgICAiIiIKLSAgICAgICAga2V5c3BhY2UgPSBOb25lCi0gICAgICAgIG5hbWVzID0gbGlzdCgpCi0gICAgICAgIGZvciByb3cgaW4gcm93czoKLSAgICAgICAgICAgIGlmIHJvd1sna2V5c3BhY2VfbmFtZSddICE9IGtleXNwYWNlOgotICAgICAgICAgICAgICAgIGlmIGtleXNwYWNlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgICAgICBzZWxmLnByaW50X2tleXNwYWNlX2VsZW1lbnRfbmFtZXMoa2V5c3BhY2UsIG5hbWVzKQotCi0gICAgICAgICAgICAgICAga2V5c3BhY2UgPSByb3dbJ2tleXNwYWNlX25hbWUnXQotICAgICAgICAgICAgICAgIG5hbWVzID0gbGlzdCgpCi0KLSAgICAgICAgICAgIG5hbWVzLmFwcGVuZChzdHIocm93WyduYW1lJ10pKQotCi0gICAgICAgIGlmIGtleXNwYWNlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5wcmludF9rZXlzcGFjZV9lbGVtZW50X25hbWVzKGtleXNwYWNlLCBuYW1lcykKLSAgICAgICAgICAgIHByaW50KCcnKQotCi0gICAgZGVmIHByaW50X2tleXNwYWNlX2VsZW1lbnRfbmFtZXMoc2VsZiwga2V5c3BhY2UsIG5hbWVzKToKLSAgICAgICAgcHJpbnQoJycpCi0gICAgICAgIGlmIHNlbGYuY3VycmVudF9rZXlzcGFjZSBpcyBOb25lOgotICAgICAgICAgICAgcHJpbnQoJ0tleXNwYWNlICVzJyAlIChrZXlzcGFjZSkpCi0gICAgICAgICAgICBwcmludCgnLS0tLS0tLS0tJXMnICUgKCctJyAqIGxlbihrZXlzcGFjZSkpKQotICAgICAgICBjbWQuQ21kLmNvbHVtbml6ZShzZWxmLCBuYW1lcykKLQotICAgIGRlZiBkZXNjcmliZV9lbGVtZW50KHNlbGYsIHJvd3MpOgotICAgICAgICAiIiIKLSAgICAgICAgUHJpbnQgdGhlIG91dHB1dCBmb3IgYWxsIHRoZSBERVNDUklCRSBxdWVyaWVzIHdoZXJlIGFuIGVsZW1lbnQgbmFtZSBhcyBiZWVuIHNwZWNpZmllZCAoZS5nIERFU0NSSUJFIFRBQkxFLCBERVNDUklCRSBJTkRFWCAuLi4pCi0gICAgICAgICIiIgotICAgICAgICBmb3Igcm93IGluIHJvd3M6Ci0gICAgICAgICAgICBwcmludCgnJykKLSAgICAgICAgICAgIHNlbGYucXVlcnlfb3V0LndyaXRlKHJvd1snY3JlYXRlX3N0YXRlbWVudCddKQotICAgICAgICAgICAgcHJpbnQoJycpCi0KLSAgICBkZWYgZGVzY3JpYmVfY2x1c3RlcihzZWxmLCByb3dzKToKLSAgICAgICAgIiIiCi0gICAgICAgIFByaW50IHRoZSBvdXRwdXQgZm9yIGEgREVTQ1JJQkUgQ0xVU1RFUiBxdWVyeS4KLQotICAgICAgICBJZiBhIHNwZWNpZmllZCBrZXlzcGFjZSB3YXMgaW4gdXNlIHRoZSByZXR1cm5lZCBSZXN1bHRTZXQgd2lsbCBjb250YWlucyBhICdyYW5nZV9vd25lcnNoaXAnIGNvbHVtbiwKLSAgICAgICAgb3RoZXJ3aXNlIG5vdC4KLSAgICAgICAgIiIiCi0gICAgICAgIGZvciByb3cgaW4gcm93czoKLSAgICAgICAgICAgIHByaW50KCdcbkNsdXN0ZXI6ICVzJyAlIHJvd1snY2x1c3RlciddKQotICAgICAgICAgICAgcHJpbnQoJ1BhcnRpdGlvbmVyOiAlcycgJSByb3dbJ3BhcnRpdGlvbmVyJ10pCi0gICAgICAgICAgICBwcmludCgnU25pdGNoOiAlc1xuJyAlIHJvd1snc25pdGNoJ10pCi0gICAgICAgICAgICBpZiAncmFuZ2Vfb3duZXJzaGlwJyBpbiByb3c6Ci0gICAgICAgICAgICAgICAgcHJpbnQoIlJhbmdlIG93bmVyc2hpcDoiKQotICAgICAgICAgICAgICAgIGZvciBlbnRyeSBpbiBsaXN0KHJvd1sncmFuZ2Vfb3duZXJzaGlwJ10uaXRlbXMoKSk6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50KCcgJTM5cyAgWyVzXScgJSAoZW50cnlbMF0sICcsICcuam9pbihbaG9zdCBmb3IgaG9zdCBpbiBlbnRyeVsxXV0pKSkKLSAgICAgICAgICAgICAgICBwcmludCgnJykKLQotICAgIGRlZiBkb19jb3B5KHNlbGYsIHBhcnNlZCk6Ci0gICAgICAgIHIiIiIKLSAgICAgICAgQ09QWSBbY3Fsc2ggb25seV0KLQotICAgICAgICAgIENPUFkgeCBGUk9NOiBJbXBvcnRzIENTViBkYXRhIGludG8gYSBDYXNzYW5kcmEgdGFibGUKLSAgICAgICAgICBDT1BZIHggVE86IEV4cG9ydHMgZGF0YSBmcm9tIGEgQ2Fzc2FuZHJhIHRhYmxlIGluIENTViBmb3JtYXQuCi0KLSAgICAgICAgQ09QWSA8dGFibGVfbmFtZT4gWyAoIGNvbHVtbiBbLCAuLi5dICkgXQotICAgICAgICAgICAgIEZST00gKCAnPGZpbGVfcGF0dGVybl8xLCBmaWxlX3BhdHRlcm5fMiwgLi4uIGZpbGVfcGF0dGVybl9uPicgfCBTVERJTiApCi0gICAgICAgICAgICAgWyBXSVRIIDxvcHRpb24+PSd2YWx1ZScgW0FORCAuLi5dIF07Ci0KLSAgICAgICAgRmlsZSBwYXR0ZXJucyBhcmUgZWl0aGVyIGZpbGUgbmFtZXMgb3IgdmFsaWQgcHl0aG9uIGdsb2IgZXhwcmVzc2lvbnMsIGUuZy4gKi5jc3Ygb3IgZm9sZGVyLyouY3N2LgotCi0gICAgICAgIENPUFkgPHRhYmxlX25hbWU+IFsgKCBjb2x1bW4gWywgLi4uXSApIF0KLSAgICAgICAgICAgICBUTyAoICc8ZmlsZW5hbWU+JyB8IFNURE9VVCApCi0gICAgICAgICAgICAgWyBXSVRIIDxvcHRpb24+PSd2YWx1ZScgW0FORCAuLi5dIF07Ci0KLSAgICAgICAgQXZhaWxhYmxlIGNvbW1vbiBDT1BZIG9wdGlvbnMgYW5kIGRlZmF1bHRzOgotCi0gICAgICAgICAgREVMSU1JVEVSPScsJyAgICAgICAgICAgLSBjaGFyYWN0ZXIgdGhhdCBhcHBlYXJzIGJldHdlZW4gcmVjb3JkcwotICAgICAgICAgIFFVT1RFPSciJyAgICAgICAgICAgICAgIC0gcXVvdGluZyBjaGFyYWN0ZXIgdG8gYmUgdXNlZCB0byBxdW90ZSBmaWVsZHMKLSAgICAgICAgICBFU0NBUEU9J1wnICAgICAgICAgICAgICAtIGNoYXJhY3RlciB0byBhcHBlYXIgYmVmb3JlIHRoZSBRVU9URSBjaGFyIHdoZW4gcXVvdGVkCi0gICAgICAgICAgSEVBREVSPWZhbHNlICAgICAgICAgICAgLSB3aGV0aGVyIHRvIGlnbm9yZSB0aGUgZmlyc3QgbGluZQotICAgICAgICAgIE5VTEw9JycgICAgICAgICAgICAgICAgIC0gc3RyaW5nIHRoYXQgcmVwcmVzZW50cyBhIG51bGwgdmFsdWUKLSAgICAgICAgICBEQVRFVElNRUZPUk1BVD0gICAgICAgICAtIHRpbWVzdGFtcCBzdHJmdGltZSBmb3JtYXQKLSAgICAgICAgICAgICclWS0lbS0lZCAlSDolTTolUyV6JyAgIGRlZmF1bHRzIHRvIHRpbWVfZm9ybWF0IHZhbHVlIGluIGNxbHNocmMKLSAgICAgICAgICBNQVhBVFRFTVBUUz01ICAgICAgICAgICAtIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cyBwZXIgYmF0Y2ggb3IgcmFuZ2UKLSAgICAgICAgICBSRVBPUlRGUkVRVUVOQ1k9MC4yNSAgICAtIHRoZSBmcmVxdWVuY3kgd2l0aCB3aGljaCB3ZSBkaXNwbGF5IHN0YXR1cyB1cGRhdGVzIGluIHNlY29uZHMKLSAgICAgICAgICBERUNJTUFMU0VQPScuJyAgICAgICAgICAtIHRoZSBzZXBhcmF0b3IgZm9yIGRlY2ltYWwgdmFsdWVzCi0gICAgICAgICAgVEhPVVNBTkRTU0VQPScnICAgICAgICAgLSB0aGUgc2VwYXJhdG9yIGZvciB0aG91c2FuZHMgZGlnaXQgZ3JvdXBzCi0gICAgICAgICAgQk9PTFNUWUxFPSdUcnVlLEZhbHNlJyAgLSB0aGUgcmVwcmVzZW50YXRpb24gZm9yIGJvb2xlYW5zLCBjYXNlIGluc2Vuc2l0aXZlLCBzcGVjaWZ5IHRydWUgZm9sbG93ZWQgYnkgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZSB5ZXMsbm8gb3IgMSwwCi0gICAgICAgICAgTlVNUFJPQ0VTU0VTPW4gICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHdvcmtlciBwcm9jZXNzZXMsIGJ5IGRlZmF1bHQgdGhlIG51bWJlciBvZiBjb3JlcyBtaW51cyBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHBlZCBhdCAxNgotICAgICAgICAgIENPTkZJR0ZJTEU9JycgICAgICAgICAgIC0gYSBjb25maWd1cmF0aW9uIGZpbGUgd2l0aCB0aGUgc2FtZSBmb3JtYXQgYXMgLmNxbHNocmMgKHNlZSB0aGUgUHl0aG9uIENvbmZpZ1BhcnNlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbikgd2hlcmUgeW91IGNhbiBzcGVjaWZ5IFdJVEggb3B0aW9ucyB1bmRlciB0aGUgZm9sbG93aW5nIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uczogW2NvcHldLCBbY29weS10b10sIFtjb3B5LWZyb21dLCBbY29weTprcy50YWJsZV0sIFtjb3B5LXRvOmtzLnRhYmxlXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb3B5LWZyb206a3MudGFibGVdLCB3aGVyZSA8a3M+IGlzIHlvdXIga2V5c3BhY2UgbmFtZSBhbmQgPHRhYmxlPiBpcyB5b3VyIHRhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLiBPcHRpb25zIGFyZSByZWFkIGZyb20gdGhlc2Ugc2VjdGlvbnMsIGluIHRoZSBvcmRlciBzcGVjaWZpZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlLCBhbmQgY29tbWFuZCBsaW5lIG9wdGlvbnMgYWx3YXlzIG92ZXJyaWRlIG9wdGlvbnMgaW4gY29uZmlndXJhdGlvbiBmaWxlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGVuZGluZyBvbiB0aGUgQ09QWSBkaXJlY3Rpb24sIG9ubHkgdGhlIHJlbGV2YW50IGNvcHktZnJvbSBvciBjb3B5LXRvIHNlY3Rpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgdXNlZC4gSWYgbm8gY29uZmlnZmlsZSBpcyBzcGVjaWZpZWQgdGhlbiAuY3Fsc2hyYyBpcyBzZWFyY2hlZCBpbnN0ZWFkLgotICAgICAgICAgIFJBVEVGSUxFPScnICAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgZmlsZSB3aGVyZSB0byBwcmludCB0aGUgb3V0cHV0IHN0YXRpc3RpY3MKLQotICAgICAgICBBdmFpbGFibGUgQ09QWSBGUk9NIG9wdGlvbnMgYW5kIGRlZmF1bHRzOgotCi0gICAgICAgICAgQ0hVTktTSVpFPTUwMDAgICAgICAgICAgLSB0aGUgc2l6ZSBvZiBjaHVua3MgcGFzc2VkIHRvIHdvcmtlciBwcm9jZXNzZXMKLSAgICAgICAgICBJTkdFU1RSQVRFPTEwMDAwMCAgICAgICAtIGFuIGFwcHJveGltYXRlIGluZ2VzdCByYXRlIGluIHJvd3MgcGVyIHNlY29uZAotICAgICAgICAgIE1JTkJBVENIU0laRT0xMCAgICAgICAgIC0gdGhlIG1pbmltdW0gc2l6ZSBvZiBhbiBpbXBvcnQgYmF0Y2gKLSAgICAgICAgICBNQVhCQVRDSFNJWkU9MjAgICAgICAgICAtIHRoZSBtYXhpbXVtIHNpemUgb2YgYW4gaW1wb3J0IGJhdGNoCi0gICAgICAgICAgTUFYUk9XUz0tMSAgICAgICAgICAgICAgLSB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cywgLTEgbWVhbnMgbm8gbWF4aW11bQotICAgICAgICAgIFNLSVBST1dTPTAgICAgICAgICAgICAgIC0gdGhlIG51bWJlciBvZiByb3dzIHRvIHNraXAKLSAgICAgICAgICBTS0lQQ09MUz0nJyAgICAgICAgICAgICAtIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgY29sdW1uIG5hbWVzIHRvIHNraXAKLSAgICAgICAgICBNQVhQQVJTRUVSUk9SUz0tMSAgICAgICAtIHRoZSBtYXhpbXVtIGdsb2JhbCBudW1iZXIgb2YgcGFyc2luZyBlcnJvcnMsIC0xIG1lYW5zIG5vIG1heGltdW0KLSAgICAgICAgICBNQVhJTlNFUlRFUlJPUlM9MTAwMCAgICAtIHRoZSBtYXhpbXVtIGdsb2JhbCBudW1iZXIgb2YgaW5zZXJ0IGVycm9ycywgLTEgbWVhbnMgbm8gbWF4aW11bQotICAgICAgICAgIEVSUkZJTEU9JycgICAgICAgICAgICAgIC0gYSBmaWxlIHdoZXJlIHRvIHN0b3JlIGFsbCByb3dzIHRoYXQgY291bGQgbm90IGJlIGltcG9ydGVkLCBieSBkZWZhdWx0IHRoaXMgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydF9rc190YWJsZS5lcnIgd2hlcmUgPGtzPiBpcyB5b3VyIGtleXNwYWNlIGFuZCA8dGFibGU+IGlzIHlvdXIgdGFibGUgbmFtZS4KLSAgICAgICAgICBQUkVQQVJFRFNUQVRFTUVOVFM9VHJ1ZSAtIHdoZXRoZXIgdG8gdXNlIHByZXBhcmVkIHN0YXRlbWVudHMgd2hlbiBpbXBvcnRpbmcsIGJ5IGRlZmF1bHQgVHJ1ZS4gU2V0IHRoaXMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlIGlmIHlvdSBkb24ndCBtaW5kIHNoaWZ0aW5nIGRhdGEgcGFyc2luZyB0byB0aGUgY2x1c3Rlci4gVGhlIGNsdXN0ZXIgd2lsbCBhbHNvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlIHRvIGNvbXBpbGUgZXZlcnkgYmF0Y2ggc3RhdGVtZW50LiBGb3IgbGFyZ2UgYW5kIG92ZXJzaXplZCBjbHVzdGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyB3aWxsIHJlc3VsdCBpbiBhIGZhc3RlciBpbXBvcnQgYnV0IGZvciBzbWFsbGVyIGNsdXN0ZXJzIGl0IG1heSBnZW5lcmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dHMuCi0gICAgICAgICAgVFRMPTM2MDAgICAgICAgICAgICAgICAgLSB0aGUgdGltZSB0byBsaXZlIGluIHNlY29uZHMsIGJ5IGRlZmF1bHQgZGF0YSB3aWxsIG5vdCBleHBpcmUKLQotICAgICAgICBBdmFpbGFibGUgQ09QWSBUTyBvcHRpb25zIGFuZCBkZWZhdWx0czoKLQotICAgICAgICAgIEVOQ09ESU5HPSd1dGY4JyAgICAgICAgICAtIGVuY29kaW5nIGZvciBDU1Ygb3V0cHV0Ci0gICAgICAgICAgUEFHRVNJWkU9JzEwMDAnICAgICAgICAgIC0gdGhlIHBhZ2Ugc2l6ZSBmb3IgZmV0Y2hpbmcgcmVzdWx0cwotICAgICAgICAgIFBBR0VUSU1FT1VUPTEwICAgICAgICAgICAtIHRoZSBwYWdlIHRpbWVvdXQgaW4gc2Vjb25kcyBmb3IgZmV0Y2hpbmcgcmVzdWx0cwotICAgICAgICAgIEJFR0lOVE9LRU49JycgICAgICAgICAgICAtIHRoZSBtaW5pbXVtIHRva2VuIHN0cmluZyB0byBjb25zaWRlciB3aGVuIGV4cG9ydGluZyBkYXRhCi0gICAgICAgICAgRU5EVE9LRU49JycgICAgICAgICAgICAgIC0gdGhlIG1heGltdW0gdG9rZW4gc3RyaW5nIHRvIGNvbnNpZGVyIHdoZW4gZXhwb3J0aW5nIGRhdGEKLSAgICAgICAgICBNQVhSRVFVRVNUUz02ICAgICAgICAgICAgLSB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdHMgZWFjaCB3b3JrZXIgcHJvY2VzcyBjYW4gd29yayBvbiBpbiBwYXJhbGxlbAotICAgICAgICAgIE1BWE9VVFBVVFNJWkU9Jy0xJyAgICAgICAtIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG91dHB1dCBmaWxlIG1lYXN1cmVkIGluIG51bWJlciBvZiBsaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXlvbmQgdGhpcyBtYXhpbXVtIHRoZSBvdXRwdXQgZmlsZSB3aWxsIGJlIHNwbGl0IGludG8gc2VnbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgbWVhbnMgdW5saW1pdGVkLgotICAgICAgICAgIEZMT0FUUFJFQ0lTSU9OPTUgICAgICAgICAtIHRoZSBudW1iZXIgb2YgZGlnaXRzIGRpc3BsYXllZCBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCBmb3IgY3FsIGZsb2F0IHZhbHVlcwotICAgICAgICAgIERPVUJMRVBSRUNJU0lPTj0xMiAgICAgICAtIHRoZSBudW1iZXIgb2YgZGlnaXRzIGRpc3BsYXllZCBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCBmb3IgY3FsIGRvdWJsZSB2YWx1ZXMKLQotICAgICAgICBXaGVuIGVudGVyaW5nIENTViBkYXRhIG9uIFNURElOLCB5b3UgY2FuIHVzZSB0aGUgc2VxdWVuY2UgIlwuIgotICAgICAgICBvbiBhIGxpbmUgYnkgaXRzZWxmIHRvIGVuZCB0aGUgZGF0YSBpbnB1dC4KLSAgICAgICAgIiIiCi0KLSAgICAgICAga3MgPSBzZWxmLmNxbF91bnByb3RlY3RfbmFtZShwYXJzZWQuZ2V0X2JpbmRpbmcoJ2tzbmFtZScsIE5vbmUpKQotICAgICAgICBpZiBrcyBpcyBOb25lOgotICAgICAgICAgICAga3MgPSBzZWxmLmN1cnJlbnRfa2V5c3BhY2UKLSAgICAgICAgICAgIGlmIGtzIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgcmFpc2UgTm9LZXlzcGFjZUVycm9yKCJOb3QgaW4gYW55IGtleXNwYWNlLiIpCi0gICAgICAgIHRhYmxlID0gc2VsZi5jcWxfdW5wcm90ZWN0X25hbWUocGFyc2VkLmdldF9iaW5kaW5nKCdjZm5hbWUnKSkKLSAgICAgICAgY29sdW1ucyA9IHBhcnNlZC5nZXRfYmluZGluZygnY29sbmFtZXMnLCBOb25lKQotICAgICAgICBpZiBjb2x1bW5zIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgY29sdW1ucyA9IGxpc3QobWFwKHNlbGYuY3FsX3VucHJvdGVjdF9uYW1lLCBjb2x1bW5zKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgZGVmYXVsdCB0byBhbGwga25vd24gY29sdW1ucwotICAgICAgICAgICAgY29sdW1ucyA9IHNlbGYuZ2V0X2NvbHVtbl9uYW1lcyhrcywgdGFibGUpCi0KLSAgICAgICAgZm5hbWUgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ2ZuYW1lJywgTm9uZSkKLSAgICAgICAgaWYgZm5hbWUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBmbmFtZSA9IHNlbGYuY3FsX3VucHJvdGVjdF92YWx1ZShmbmFtZSkKLQotICAgICAgICBjb3B5b3B0bmFtZXMgPSBsaXN0KG1hcChzdHIubG93ZXIsIHBhcnNlZC5nZXRfYmluZGluZygnb3B0bmFtZXMnLCAoKSkpKQotICAgICAgICBjb3B5b3B0dmFscyA9IGxpc3QobWFwKHNlbGYuY3FsX3VucHJvdGVjdF92YWx1ZSwgcGFyc2VkLmdldF9iaW5kaW5nKCdvcHR2YWxzJywgKCkpKSkKLSAgICAgICAgb3B0cyA9IGRpY3QobGlzdCh6aXAoY29weW9wdG5hbWVzLCBjb3B5b3B0dmFscykpKQotCi0gICAgICAgIGRpcmVjdGlvbiA9IHBhcnNlZC5nZXRfYmluZGluZygnZGlyJykudXBwZXIoKQotICAgICAgICBpZiBkaXJlY3Rpb24gPT0gJ0ZST00nOgotICAgICAgICAgICAgdGFzayA9IEltcG9ydFRhc2soc2VsZiwga3MsIHRhYmxlLCBjb2x1bW5zLCBmbmFtZSwgb3B0cywgc2VsZi5jb25uLnByb3RvY29sX3ZlcnNpb24sIENPTkZJR19GSUxFKQotICAgICAgICBlbGlmIGRpcmVjdGlvbiA9PSAnVE8nOgotICAgICAgICAgICAgdGFzayA9IEV4cG9ydFRhc2soc2VsZiwga3MsIHRhYmxlLCBjb2x1bW5zLCBmbmFtZSwgb3B0cywgc2VsZi5jb25uLnByb3RvY29sX3ZlcnNpb24sIENPTkZJR19GSUxFKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoIlVua25vd24gZGlyZWN0aW9uICVzIiAlIGRpcmVjdGlvbikKLQotICAgICAgICB0YXNrLnJ1bigpCi0KLSAgICBkZWYgZG9fc2hvdyhzZWxmLCBwYXJzZWQpOgotICAgICAgICAiIiIKLSAgICAgICAgU0hPVyBbY3Fsc2ggb25seV0KLQotICAgICAgICAgIERpc3BsYXlzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IGNxbHNoIHNlc3Npb24uIENhbiBiZSBjYWxsZWQgaW4KLSAgICAgICAgICB0aGUgZm9sbG93aW5nIHdheXM6Ci0KLSAgICAgICAgU0hPVyBWRVJTSU9OCi0KLSAgICAgICAgICBTaG93cyB0aGUgdmVyc2lvbiBhbmQgYnVpbGQgb2YgdGhlIGNvbm5lY3RlZCBDYXNzYW5kcmEgaW5zdGFuY2UsIGFzCi0gICAgICAgICAgd2VsbCBhcyB0aGUgdmVyc2lvbiBvZiB0aGUgQ1FMIHNwZWMgdGhhdCB0aGUgY29ubmVjdGVkIENhc3NhbmRyYQotICAgICAgICAgIGluc3RhbmNlIHVuZGVyc3RhbmRzLgotCi0gICAgICAgIFNIT1cgSE9TVAotCi0gICAgICAgICAgU2hvd3Mgd2hlcmUgY3Fsc2ggaXMgY3VycmVudGx5IGNvbm5lY3RlZC4KLQotICAgICAgICBTSE9XIFNFU1NJT04gPHNlc3Npb25pZD4KLQotICAgICAgICAgIFByZXR0eS1wcmludHMgdGhlIHJlcXVlc3RlZCB0cmFjaW5nIHNlc3Npb24uCi0gICAgICAgICIiIgotICAgICAgICBzaG93d2hhdCA9IHBhcnNlZC5nZXRfYmluZGluZygnd2hhdCcpLmxvd2VyKCkKLSAgICAgICAgaWYgc2hvd3doYXQgPT0gJ3ZlcnNpb24nOgotICAgICAgICAgICAgc2VsZi5nZXRfY29ubmVjdGlvbl92ZXJzaW9ucygpCi0gICAgICAgICAgICBzZWxmLnNob3dfdmVyc2lvbigpCi0gICAgICAgIGVsaWYgc2hvd3doYXQgPT0gJ2hvc3QnOgotICAgICAgICAgICAgc2VsZi5zaG93X2hvc3QoKQotICAgICAgICBlbGlmIHNob3d3aGF0LnN0YXJ0c3dpdGgoJ3Nlc3Npb24nKToKLSAgICAgICAgICAgIHNlc3Npb25faWQgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ3Nlc3Npb25pZCcpLmxvd2VyKCkKLSAgICAgICAgICAgIHNlbGYuc2hvd19zZXNzaW9uKFVVSUQoc2Vzc2lvbl9pZCkpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLnByaW50ZXJyKCdXYWl0LCBob3cgZG8gSSBzaG93ICVyPycgJSAoc2hvd3doYXQsKSkKLQotICAgIGRlZiBkb19zb3VyY2Uoc2VsZiwgcGFyc2VkKToKLSAgICAgICAgIiIiCi0gICAgICAgIFNPVVJDRSBbY3Fsc2ggb25seV0KLQotICAgICAgICBFeGVjdXRlcyBhIGZpbGUgY29udGFpbmluZyBDUUwgc3RhdGVtZW50cy4gR2l2ZXMgdGhlIG91dHB1dCBmb3IgZWFjaAotICAgICAgICBzdGF0ZW1lbnQgaW4gdHVybiwgaWYgYW55LCBvciBhbnkgZXJyb3JzIHRoYXQgb2NjdXIgYWxvbmcgdGhlIHdheS4KLQotICAgICAgICBFcnJvcnMgZG8gTk9UIGFib3J0IGV4ZWN1dGlvbiBvZiB0aGUgQ1FMIHNvdXJjZSBmaWxlLgotCi0gICAgICAgIFVzYWdlOgotCi0gICAgICAgICAgU09VUkNFICc8ZmlsZT4nOwotCi0gICAgICAgIFRoYXQgaXMsIHRoZSBwYXRoIHRvIHRoZSBmaWxlIHRvIGJlIGV4ZWN1dGVkIG11c3QgYmUgZ2l2ZW4gaW5zaWRlIGEKLSAgICAgICAgc3RyaW5nIGxpdGVyYWwuIFRoZSBwYXRoIGlzIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcKLSAgICAgICAgZGlyZWN0b3J5LiBUaGUgdGlsZGUgc2hvcnRoYW5kIG5vdGF0aW9uICgnfi9teWRpcicpIGlzIHN1cHBvcnRlZCBmb3IKLSAgICAgICAgcmVmZXJyaW5nIHRvICRIT01FLgotCi0gICAgICAgIFNlZSBhbHNvIHRoZSAtLWZpbGUgb3B0aW9uIHRvIGNxbHNoLgotICAgICAgICAiIiIKLSAgICAgICAgZm5hbWUgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ2ZuYW1lJykKLSAgICAgICAgZm5hbWUgPSBvcy5wYXRoLmV4cGFuZHVzZXIoc2VsZi5jcWxfdW5wcm90ZWN0X3ZhbHVlKGZuYW1lKSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZW5jb2RpbmcsIGJvbV9zaXplID0gZ2V0X2ZpbGVfZW5jb2RpbmdfYm9tc2l6ZShmbmFtZSkKLSAgICAgICAgICAgIGYgPSBjb2RlY3Mub3BlbihmbmFtZSwgJ3InLCBlbmNvZGluZykKLSAgICAgICAgICAgIGYuc2Vlayhib21fc2l6ZSkKLSAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKLSAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoJ0NvdWxkIG5vdCBvcGVuICVyOiAlcycgJSAoZm5hbWUsIGUpKQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHN1YnNoZWxsID0gU2hlbGwoc2VsZi5ob3N0bmFtZSwgc2VsZi5wb3J0LCBjb2xvcj1zZWxmLmNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lPXNlbGYudXNlcm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc9c2VsZi5lbmNvZGluZywgc3RkaW49ZiwgdHR5PUZhbHNlLCB1c2VfY29ubj1zZWxmLmNvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY3FsdmVyPXNlbGYuY3FsX3ZlcnNpb24sIGtleXNwYWNlPXNlbGYuY3VycmVudF9rZXlzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjaW5nX2VuYWJsZWQ9c2VsZi50cmFjaW5nX2VuYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9uYW5vdGltZV9mb3JtYXQ9c2VsZi5kaXNwbGF5X25hbm90aW1lX2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X3RpbWVzdGFtcF9mb3JtYXQ9c2VsZi5kaXNwbGF5X3RpbWVzdGFtcF9mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9kYXRlX2Zvcm1hdD1zZWxmLmRpc3BsYXlfZGF0ZV9mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9mbG9hdF9wcmVjaXNpb249c2VsZi5kaXNwbGF5X2Zsb2F0X3ByZWNpc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2RvdWJsZV9wcmVjaXNpb249c2VsZi5kaXNwbGF5X2RvdWJsZV9wcmVjaXNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV90aW1lem9uZT1zZWxmLmRpc3BsYXlfdGltZXpvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RyYWNlX3dhaXQ9c2VsZi5tYXhfdHJhY2Vfd2FpdCwgc3NsPXNlbGYuc3NsLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfdGltZW91dD1zZWxmLnNlc3Npb24uZGVmYXVsdF90aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfdGltZW91dD1zZWxmLmNvbm4uY29ubmVjdF90aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3N1YnNoZWxsPVRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9wcm92aWRlcj1zZWxmLmF1dGhfcHJvdmlkZXIpCi0gICAgICAgICMgZHVwbGljYXRlIGNvdmVyYWdlIHJlbGF0ZWQgc2V0dGluZ3MgaW4gc3Vic2hlbGwKLSAgICAgICAgaWYgc2VsZi5jb3ZlcmFnZToKLSAgICAgICAgICAgIHN1YnNoZWxsLmNvdmVyYWdlID0gVHJ1ZQotICAgICAgICAgICAgc3Vic2hlbGwuY292ZXJhZ2VyY19wYXRoID0gc2VsZi5jb3ZlcmFnZXJjX3BhdGgKLSAgICAgICAgc3Vic2hlbGwuY21kbG9vcCgpCi0gICAgICAgIGYuY2xvc2UoKQotCi0gICAgZGVmIGRvX2NhcHR1cmUoc2VsZiwgcGFyc2VkKToKLSAgICAgICAgIiIiCi0gICAgICAgIENBUFRVUkUgW2NxbHNoIG9ubHldCi0KLSAgICAgICAgQmVnaW5zIGNhcHR1cmluZyBjb21tYW5kIG91dHB1dCBhbmQgYXBwZW5kaW5nIGl0IHRvIGEgc3BlY2lmaWVkIGZpbGUuCi0gICAgICAgIE91dHB1dCB3aWxsIG5vdCBiZSBzaG93biBhdCB0aGUgY29uc29sZSB3aGlsZSBpdCBpcyBjYXB0dXJlZC4KLQotICAgICAgICBVc2FnZToKLQotICAgICAgICAgIENBUFRVUkUgJzxmaWxlPic7Ci0gICAgICAgICAgQ0FQVFVSRSBPRkY7Ci0gICAgICAgICAgQ0FQVFVSRTsKLQotICAgICAgICBUaGF0IGlzLCB0aGUgcGF0aCB0byB0aGUgZmlsZSB0byBiZSBhcHBlbmRlZCB0byBtdXN0IGJlIGdpdmVuIGluc2lkZSBhCi0gICAgICAgIHN0cmluZyBsaXRlcmFsLiBUaGUgcGF0aCBpcyBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nCi0gICAgICAgIGRpcmVjdG9yeS4gVGhlIHRpbGRlIHNob3J0aGFuZCBub3RhdGlvbiAoJ34vbXlkaXInKSBpcyBzdXBwb3J0ZWQgZm9yCi0gICAgICAgIHJlZmVycmluZyB0byAkSE9NRS4KLQotICAgICAgICBPbmx5IHF1ZXJ5IHJlc3VsdCBvdXRwdXQgaXMgY2FwdHVyZWQuIEVycm9ycyBhbmQgb3V0cHV0IGZyb20gY3Fsc2gtb25seQotICAgICAgICBjb21tYW5kcyB3aWxsIHN0aWxsIGJlIHNob3duIGluIHRoZSBjcWxzaCBzZXNzaW9uLgotCi0gICAgICAgIFRvIHN0b3AgY2FwdHVyaW5nIG91dHB1dCBhbmQgc2hvdyBpdCBpbiB0aGUgY3Fsc2ggc2Vzc2lvbiBhZ2FpbiwgdXNlCi0gICAgICAgIENBUFRVUkUgT0ZGLgotCi0gICAgICAgIFRvIGluc3BlY3QgdGhlIGN1cnJlbnQgY2FwdHVyZSBjb25maWd1cmF0aW9uLCB1c2UgQ0FQVFVSRSB3aXRoIG5vCi0gICAgICAgIGFyZ3VtZW50cy4KLSAgICAgICAgIiIiCi0gICAgICAgIGZuYW1lID0gcGFyc2VkLmdldF9iaW5kaW5nKCdmbmFtZScpCi0gICAgICAgIGlmIGZuYW1lIGlzIE5vbmU6Ci0gICAgICAgICAgICBpZiBzZWxmLnNodW50ZWRfcXVlcnlfb3V0IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHByaW50KCJDdXJyZW50bHkgY2FwdHVyaW5nIHF1ZXJ5IG91dHB1dCB0byAlci4iICUgKHNlbGYucXVlcnlfb3V0Lm5hbWUsKSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcHJpbnQoIkN1cnJlbnRseSBub3QgY2FwdHVyaW5nIHF1ZXJ5IG91dHB1dC4iKQotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgaWYgZm5hbWUudXBwZXIoKSA9PSAnT0ZGJzoKLSAgICAgICAgICAgIGlmIHNlbGYuc2h1bnRlZF9xdWVyeV9vdXQgaXMgTm9uZToKLSAgICAgICAgICAgICAgICBzZWxmLnByaW50ZXJyKCdOb3QgY3VycmVudGx5IGNhcHR1cmluZyBvdXRwdXQuJykKLSAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIHNlbGYucXVlcnlfb3V0LmNsb3NlKCkKLSAgICAgICAgICAgIHNlbGYucXVlcnlfb3V0ID0gc2VsZi5zaHVudGVkX3F1ZXJ5X291dAotICAgICAgICAgICAgc2VsZi5jb2xvciA9IHNlbGYuc2h1bnRlZF9jb2xvcgotICAgICAgICAgICAgc2VsZi5zaHVudGVkX3F1ZXJ5X291dCA9IE5vbmUKLSAgICAgICAgICAgIGRlbCBzZWxmLnNodW50ZWRfY29sb3IKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgICAgIGlmIHNlbGYuc2h1bnRlZF9xdWVyeV9vdXQgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnByaW50ZXJyKCdBbHJlYWR5IGNhcHR1cmluZyBvdXRwdXQgdG8gJXMuIFVzZSBDQVBUVVJFIE9GRicKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJyB0byBkaXNhYmxlLicgJSAoc2VsZi5xdWVyeV9vdXQubmFtZSwpKQotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgZm5hbWUgPSBvcy5wYXRoLmV4cGFuZHVzZXIoc2VsZi5jcWxfdW5wcm90ZWN0X3ZhbHVlKGZuYW1lKSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZiA9IG9wZW4oZm5hbWUsICdhJykKLSAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKLSAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoJ0NvdWxkIG5vdCBvcGVuICVyIGZvciBhcHBlbmQ6ICVzJyAlIChmbmFtZSwgZSkpCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5zaHVudGVkX3F1ZXJ5X291dCA9IHNlbGYucXVlcnlfb3V0Ci0gICAgICAgIHNlbGYuc2h1bnRlZF9jb2xvciA9IHNlbGYuY29sb3IKLSAgICAgICAgc2VsZi5xdWVyeV9vdXQgPSBmCi0gICAgICAgIHNlbGYuY29sb3IgPSBGYWxzZQotICAgICAgICBwcmludCgnTm93IGNhcHR1cmluZyBxdWVyeSBvdXRwdXQgdG8gJXIuJyAlIChmbmFtZSwpKQotCi0gICAgZGVmIGRvX3RyYWNpbmcoc2VsZiwgcGFyc2VkKToKLSAgICAgICAgIiIiCi0gICAgICAgIFRSQUNJTkcgW2NxbHNoXQotCi0gICAgICAgICAgRW5hYmxlcyBvciBkaXNhYmxlcyByZXF1ZXN0IHRyYWNpbmcuCi0KLSAgICAgICAgVFJBQ0lORyBPTgotCi0gICAgICAgICAgRW5hYmxlcyB0cmFjaW5nIGZvciBhbGwgZnVydGhlciByZXF1ZXN0cy4KLQotICAgICAgICBUUkFDSU5HIE9GRgotCi0gICAgICAgICAgRGlzYWJsZXMgdHJhY2luZy4KLQotICAgICAgICBUUkFDSU5HCi0KLSAgICAgICAgICBUUkFDSU5HIHdpdGggbm8gYXJndW1lbnRzIHNob3dzIHRoZSBjdXJyZW50IHRyYWNpbmcgc3RhdHVzLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi50cmFjaW5nX2VuYWJsZWQgPSBTd2l0Y2hDb21tYW5kKCJUUkFDSU5HIiwgIlRyYWNpbmciKS5leGVjdXRlKHNlbGYudHJhY2luZ19lbmFibGVkLCBwYXJzZWQsIHNlbGYucHJpbnRlcnIpCi0KLSAgICBkZWYgZG9fZXhwYW5kKHNlbGYsIHBhcnNlZCk6Ci0gICAgICAgICIiIgotICAgICAgICBFWFBBTkQgW2NxbHNoXQotCi0gICAgICAgICAgRW5hYmxlcyBvciBkaXNhYmxlcyBleHBhbmRlZCAodmVydGljYWwpIG91dHB1dC4KLQotICAgICAgICBFWFBBTkQgT04KLQotICAgICAgICAgIEVuYWJsZXMgZXhwYW5kZWQgKHZlcnRpY2FsKSBvdXRwdXQuCi0KLSAgICAgICAgRVhQQU5EIE9GRgotCi0gICAgICAgICAgRGlzYWJsZXMgZXhwYW5kZWQgKHZlcnRpY2FsKSBvdXRwdXQuCi0KLSAgICAgICAgRVhQQU5ECi0KLSAgICAgICAgICBFWFBBTkQgd2l0aCBubyBhcmd1bWVudHMgc2hvd3MgdGhlIGN1cnJlbnQgdmFsdWUgb2YgZXhwYW5kIHNldHRpbmcuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLmV4cGFuZF9lbmFibGVkID0gU3dpdGNoQ29tbWFuZCgiRVhQQU5EIiwgIkV4cGFuZGVkIG91dHB1dCIpLmV4ZWN1dGUoc2VsZi5leHBhbmRfZW5hYmxlZCwgcGFyc2VkLCBzZWxmLnByaW50ZXJyKQotCi0gICAgZGVmIGRvX2NvbnNpc3RlbmN5KHNlbGYsIHBhcnNlZCk6Ci0gICAgICAgICIiIgotICAgICAgICBDT05TSVNURU5DWSBbY3Fsc2ggb25seV0KLQotICAgICAgICAgICBPdmVycmlkZXMgZGVmYXVsdCBjb25zaXN0ZW5jeSBsZXZlbCAoZGVmYXVsdCBsZXZlbCBpcyBPTkUpLgotCi0gICAgICAgIENPTlNJU1RFTkNZIDxsZXZlbD4KLQotICAgICAgICAgICBTZXRzIGNvbnNpc3RlbmN5IGxldmVsIGZvciBmdXR1cmUgcmVxdWVzdHMuCi0KLSAgICAgICAgICAgVmFsaWQgY29uc2lzdGVuY3kgbGV2ZWxzOgotCi0gICAgICAgICAgIEFOWSwgT05FLCBUV08sIFRIUkVFLCBRVU9SVU0sIEFMTCwgTE9DQUxfT05FLCBMT0NBTF9RVU9SVU0sIEVBQ0hfUVVPUlVNLCBTRVJJQUwgYW5kIExPQ0FMX1NFUklBTC4KLQotICAgICAgICAgICBTRVJJQUwgYW5kIExPQ0FMX1NFUklBTCBtYXkgYmUgdXNlZCBvbmx5IGZvciBTRUxFQ1RzOyB3aWxsIGJlIHJlamVjdGVkIHdpdGggdXBkYXRlcy4KLQotICAgICAgICBDT05TSVNURU5DWQotCi0gICAgICAgICAgIENPTlNJU1RFTkNZIHdpdGggbm8gYXJndW1lbnRzIHNob3dzIHRoZSBjdXJyZW50IGNvbnNpc3RlbmN5IGxldmVsLgotICAgICAgICAiIiIKLSAgICAgICAgbGV2ZWwgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ2xldmVsJykKLSAgICAgICAgaWYgbGV2ZWwgaXMgTm9uZToKLSAgICAgICAgICAgIHByaW50KCdDdXJyZW50IGNvbnNpc3RlbmN5IGxldmVsIGlzICVzLicgJSAoY2Fzc2FuZHJhLkNvbnNpc3RlbmN5TGV2ZWwudmFsdWVfdG9fbmFtZVtzZWxmLmNvbnNpc3RlbmN5X2xldmVsXSkpCi0gICAgICAgICAgICByZXR1cm4KLQotICAgICAgICBzZWxmLmNvbnNpc3RlbmN5X2xldmVsID0gY2Fzc2FuZHJhLkNvbnNpc3RlbmN5TGV2ZWwubmFtZV90b192YWx1ZVtsZXZlbC51cHBlcigpXQotICAgICAgICBwcmludCgnQ29uc2lzdGVuY3kgbGV2ZWwgc2V0IHRvICVzLicgJSAobGV2ZWwudXBwZXIoKSwpKQotCi0gICAgZGVmIGRvX3NlcmlhbChzZWxmLCBwYXJzZWQpOgotICAgICAgICAiIiIKLSAgICAgICAgU0VSSUFMIENPTlNJU1RFTkNZIFtjcWxzaCBvbmx5XQotCi0gICAgICAgICAgIE92ZXJyaWRlcyBzZXJpYWwgY29uc2lzdGVuY3kgbGV2ZWwgKGRlZmF1bHQgbGV2ZWwgaXMgU0VSSUFMKS4KLQotICAgICAgICBTRVJJQUwgQ09OU0lTVEVOQ1kgPGxldmVsPgotCi0gICAgICAgICAgIFNldHMgY29uc2lzdGVuY3kgbGV2ZWwgZm9yIGZ1dHVyZSBjb25kaXRpb25hbCB1cGRhdGVzLgotCi0gICAgICAgICAgIFZhbGlkIGNvbnNpc3RlbmN5IGxldmVsczoKLQotICAgICAgICAgICBTRVJJQUwsIExPQ0FMX1NFUklBTC4KLQotICAgICAgICBTRVJJQUwgQ09OU0lTVEVOQ1kKLQotICAgICAgICAgICBTRVJJQUwgQ09OU0lTVEVOQ1kgd2l0aCBubyBhcmd1bWVudHMgc2hvd3MgdGhlIGN1cnJlbnQgY29uc2lzdGVuY3kgbGV2ZWwuCi0gICAgICAgICIiIgotICAgICAgICBsZXZlbCA9IHBhcnNlZC5nZXRfYmluZGluZygnbGV2ZWwnKQotICAgICAgICBpZiBsZXZlbCBpcyBOb25lOgotICAgICAgICAgICAgcHJpbnQoJ0N1cnJlbnQgc2VyaWFsIGNvbnNpc3RlbmN5IGxldmVsIGlzICVzLicgJSAoY2Fzc2FuZHJhLkNvbnNpc3RlbmN5TGV2ZWwudmFsdWVfdG9fbmFtZVtzZWxmLnNlcmlhbF9jb25zaXN0ZW5jeV9sZXZlbF0pKQotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgc2VsZi5zZXJpYWxfY29uc2lzdGVuY3lfbGV2ZWwgPSBjYXNzYW5kcmEuQ29uc2lzdGVuY3lMZXZlbC5uYW1lX3RvX3ZhbHVlW2xldmVsLnVwcGVyKCldCi0gICAgICAgIHByaW50KCdTZXJpYWwgY29uc2lzdGVuY3kgbGV2ZWwgc2V0IHRvICVzLicgJSAobGV2ZWwudXBwZXIoKSwpKQotCi0gICAgZGVmIGRvX2xvZ2luKHNlbGYsIHBhcnNlZCk6Ci0gICAgICAgICIiIgotICAgICAgICBMT0dJTiBbY3Fsc2ggb25seV0KLQotICAgICAgICAgICBDaGFuZ2VzIGxvZ2luIGluZm9ybWF0aW9uIHdpdGhvdXQgcmVxdWlyaW5nIHJlc3RhcnQuCi0KLSAgICAgICAgTE9HSU4gPHVzZXJuYW1lPiAoPHBhc3N3b3JkPikKLQotICAgICAgICAgICBMb2dpbiB1c2luZyB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lLiBJZiBwYXNzd29yZCBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgdXNlZAotICAgICAgICAgICBvdGhlcndpc2UsIHlvdSB3aWxsIGJlIHByb21wdGVkIHRvIGVudGVyLgotICAgICAgICAiIiIKLSAgICAgICAgdXNlcm5hbWUgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ3VzZXJuYW1lJykKLSAgICAgICAgcGFzc3dvcmQgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ3Bhc3N3b3JkJykKLSAgICAgICAgaWYgcGFzc3dvcmQgaXMgTm9uZToKLSAgICAgICAgICAgIHBhc3N3b3JkID0gZ2V0cGFzcy5nZXRwYXNzKCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHBhc3N3b3JkID0gcGFzc3dvcmRbMTotMV0KLQotICAgICAgICBhdXRoX3Byb3ZpZGVyID0gUGxhaW5UZXh0QXV0aFByb3ZpZGVyKHVzZXJuYW1lPXVzZXJuYW1lLCBwYXNzd29yZD1wYXNzd29yZCkKLQotICAgICAgICBjb25uID0gQ2x1c3Rlcihjb250YWN0X3BvaW50cz0oc2VsZi5ob3N0bmFtZSwpLCBwb3J0PXNlbGYucG9ydCwgY3FsX3ZlcnNpb249c2VsZi5jb25uLmNxbF92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbF92ZXJzaW9uPXNlbGYuY29ubi5wcm90b2NvbF92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICBhdXRoX3Byb3ZpZGVyPWF1dGhfcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIHNzbF9vcHRpb25zPXNlbGYuY29ubi5zc2xfb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9iYWxhbmNpbmdfcG9saWN5PVdoaXRlTGlzdFJvdW5kUm9iaW5Qb2xpY3koW3NlbGYuaG9zdG5hbWVdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbF9jb25uZWN0aW9uX3RpbWVvdXQ9c2VsZi5jb25uLmNvbm5lY3RfdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdF90aW1lb3V0PXNlbGYuY29ubi5jb25uZWN0X3RpbWVvdXQpCi0KLSAgICAgICAgaWYgc2VsZi5jdXJyZW50X2tleXNwYWNlOgotICAgICAgICAgICAgc2Vzc2lvbiA9IGNvbm4uY29ubmVjdChzZWxmLmN1cnJlbnRfa2V5c3BhY2UpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZXNzaW9uID0gY29ubi5jb25uZWN0KCkKLQotICAgICAgICAjIENvcHkgc2Vzc2lvbiBwcm9wZXJ0aWVzCi0gICAgICAgIHNlc3Npb24uZGVmYXVsdF90aW1lb3V0ID0gc2VsZi5zZXNzaW9uLmRlZmF1bHRfdGltZW91dAotICAgICAgICBzZXNzaW9uLnJvd19mYWN0b3J5ID0gc2VsZi5zZXNzaW9uLnJvd19mYWN0b3J5Ci0gICAgICAgIHNlc3Npb24uZGVmYXVsdF9jb25zaXN0ZW5jeV9sZXZlbCA9IHNlbGYuc2Vzc2lvbi5kZWZhdWx0X2NvbnNpc3RlbmN5X2xldmVsCi0gICAgICAgIHNlc3Npb24ubWF4X3RyYWNlX3dhaXQgPSBzZWxmLnNlc3Npb24ubWF4X3RyYWNlX3dhaXQKLQotICAgICAgICAjIFVwZGF0ZSBhZnRlciB3ZSd2ZSBjb25uZWN0ZWQgaW4gY2FzZSB3ZSBmYWlsIHRvIGF1dGhlbnRpY2F0ZQotICAgICAgICBzZWxmLmNvbm4gPSBjb25uCi0gICAgICAgIHNlbGYuYXV0aF9wcm92aWRlciA9IGF1dGhfcHJvdmlkZXIKLSAgICAgICAgc2VsZi51c2VybmFtZSA9IHVzZXJuYW1lCi0gICAgICAgIHNlbGYuc2Vzc2lvbiA9IHNlc3Npb24KLQotICAgIGRlZiBkb19leGl0KHNlbGYsIHBhcnNlZD1Ob25lKToKLSAgICAgICAgIiIiCi0gICAgICAgIEVYSVQvUVVJVCBbY3Fsc2ggb25seV0KLQotICAgICAgICBFeGl0cyBjcWxzaC4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuc3RvcCA9IFRydWUKLSAgICAgICAgaWYgc2VsZi5vd25zX2Nvbm5lY3Rpb246Ci0gICAgICAgICAgICBzZWxmLmNvbm4uc2h1dGRvd24oKQotICAgIGRvX3F1aXQgPSBkb19leGl0Ci0KLSAgICBkZWYgZG9fY2xlYXIoc2VsZiwgcGFyc2VkKToKLSAgICAgICAgIiIiCi0gICAgICAgIENMRUFSL0NMUyBbY3Fsc2ggb25seV0KLQotICAgICAgICBDbGVhcnMgdGhlIGNvbnNvbGUuCi0gICAgICAgICIiIgotICAgICAgICBzdWJwcm9jZXNzLmNhbGwoJ2NsZWFyJywgc2hlbGw9VHJ1ZSkKLSAgICBkb19jbHMgPSBkb19jbGVhcgotCi0gICAgZGVmIGRvX2RlYnVnKHNlbGYsIHBhcnNlZCk6Ci0gICAgICAgIGltcG9ydCBwZGIKLSAgICAgICAgcGRiLnNldF90cmFjZSgpCi0KLSAgICBkZWYgZ2V0X2hlbHBfdG9waWNzKHNlbGYpOgotICAgICAgICB0b3BpY3MgPSBbdFszOl0gZm9yIHQgaW4gZGlyKHNlbGYpIGlmIHQuc3RhcnRzd2l0aCgnZG9fJykgYW5kIGdldGF0dHIoc2VsZiwgdCwgTm9uZSkuX19kb2NfX10KLSAgICAgICAgZm9yIGhpZGVfZnJvbV9oZWxwIGluICgncXVpdCcsKToKLSAgICAgICAgICAgIHRvcGljcy5yZW1vdmUoaGlkZV9mcm9tX2hlbHApCi0gICAgICAgIHJldHVybiB0b3BpY3MKLQotICAgIGRlZiBjb2x1bW5pemUoc2VsZiwgc2xpc3QsICphLCAqKmt3KToKLSAgICAgICAgcmV0dXJuIGNtZC5DbWQuY29sdW1uaXplKHNlbGYsIHNvcnRlZChbdS51cHBlcigpIGZvciB1IGluIHNsaXN0XSksICphLCAqKmt3KQotCi0gICAgZGVmIGRvX2hlbHAoc2VsZiwgcGFyc2VkKToKLSAgICAgICAgIiIiCi0gICAgICAgIEhFTFAgW2NxbHNoIG9ubHldCi0KLSAgICAgICAgR2l2ZXMgaW5mb3JtYXRpb24gYWJvdXQgY3Fsc2ggY29tbWFuZHMuIFRvIHNlZSBhdmFpbGFibGUgdG9waWNzLAotICAgICAgICBlbnRlciAiSEVMUCIgd2l0aG91dCBhbnkgYXJndW1lbnRzLiBUbyBzZWUgaGVscCBvbiBhIHRvcGljLAotICAgICAgICB1c2UgIkhFTFAgPHRvcGljPiIuCi0gICAgICAgICIiIgotICAgICAgICB0b3BpY3MgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ3RvcGljJywgKCkpCi0gICAgICAgIGlmIG5vdCB0b3BpY3M6Ci0gICAgICAgICAgICBzaGVsbF90b3BpY3MgPSBbdC51cHBlcigpIGZvciB0IGluIHNlbGYuZ2V0X2hlbHBfdG9waWNzKCldCi0gICAgICAgICAgICBzZWxmLnByaW50X3RvcGljcygiXG5Eb2N1bWVudGVkIHNoZWxsIGNvbW1hbmRzOiIsIHNoZWxsX3RvcGljcywgMTUsIDgwKQotICAgICAgICAgICAgY3FsX3RvcGljcyA9IFt0LnVwcGVyKCkgZm9yIHQgaW4gY3FsZG9jcy5nZXRfaGVscF90b3BpY3MoKV0KLSAgICAgICAgICAgIHNlbGYucHJpbnRfdG9waWNzKCJDUUwgaGVscCB0b3BpY3M6IiwgY3FsX3RvcGljcywgMTUsIDgwKQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGZvciB0IGluIHRvcGljczoKLSAgICAgICAgICAgIGlmIHQubG93ZXIoKSBpbiBzZWxmLmdldF9oZWxwX3RvcGljcygpOgotICAgICAgICAgICAgICAgIGRvYyA9IGdldGF0dHIoc2VsZiwgJ2RvXycgKyB0Lmxvd2VyKCkpLl9fZG9jX18KLSAgICAgICAgICAgICAgICBzZWxmLnN0ZG91dC53cml0ZShkb2MgKyAiXG4iKQotICAgICAgICAgICAgZWxpZiB0Lmxvd2VyKCkgaW4gY3FsZG9jcy5nZXRfaGVscF90b3BpY3MoKToKLSAgICAgICAgICAgICAgICB1cmxwYXJ0ID0gY3FsZG9jcy5nZXRfaGVscF90b3BpYyh0KQotICAgICAgICAgICAgICAgIGlmIHVybHBhcnQgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgIHVybCA9ICIlcyMlcyIgJSAoQ0FTU0FORFJBX0NRTF9IVE1MLCB1cmxwYXJ0KQotICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmJyb3dzZXIgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGVuZWQgPSB3ZWJicm93c2VyLmdldChzZWxmLmJyb3dzZXIpLm9wZW5fbmV3X3RhYih1cmwpCi0gICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGVuZWQgPSB3ZWJicm93c2VyLm9wZW5fbmV3X3RhYih1cmwpCi0gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcGVuZWQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnByaW50ZXJyKCIqKiogTm8gYnJvd3NlciB0byBkaXNwbGF5IENRTCBoZWxwLiBVUkwgZm9yIGhlbHAgdG9waWMgJXMgOiAlcyIgJSAodCwgdXJsKSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5wcmludGVycigiKioqIE5vIGhlbHAgb24gJXMiICUgKHQsKSkKLQotICAgIGRlZiBkb191bmljb2RlKHNlbGYsIHBhcnNlZCk6Ci0gICAgICAgICIiIgotICAgICAgICBUZXh0dWFsIGlucHV0L291dHB1dAotCi0gICAgICAgIFdoZW4gY29udHJvbCBjaGFyYWN0ZXJzLCBvciBvdGhlciBjaGFyYWN0ZXJzIHdoaWNoIGNhbid0IGJlIGVuY29kZWQKLSAgICAgICAgaW4geW91ciBjdXJyZW50IGxvY2FsZSwgYXJlIGZvdW5kIGluIHZhbHVlcyBvZiAndGV4dCcgb3IgJ2FzY2lpJwotICAgICAgICB0eXBlcywgaXQgd2lsbCBiZSBzaG93biBhcyBhIGJhY2tzbGFzaCBlc2NhcGUuIElmIGNvbG9yIGlzIGVuYWJsZWQsCi0gICAgICAgIGFueSBzdWNoIGJhY2tzbGFzaCBlc2NhcGVzIHdpbGwgYmUgc2hvd24gaW4gYSBkaWZmZXJlbnQgY29sb3IgZnJvbQotICAgICAgICB0aGUgc3Vycm91bmRpbmcgdGV4dC4KLQotICAgICAgICBVbmljb2RlIGNvZGUgcG9pbnRzIGluIHlvdXIgZGF0YSB3aWxsIGJlIG91dHB1dCBpbnRhY3QsIGlmIHRoZQotICAgICAgICBlbmNvZGluZyBmb3IgeW91ciBsb2NhbGUgaXMgY2FwYWJsZSBvZiBkZWNvZGluZyB0aGVtLiBJZiB5b3UgcHJlZmVyCi0gICAgICAgIHRoYXQgbm9uLWFzY2lpIGNoYXJhY3RlcnMgYmUgc2hvd24gd2l0aCBQeXRob24tc3R5bGUgIlxcdUFCQ0QiCi0gICAgICAgIGVzY2FwZSBzZXF1ZW5jZXMsIGludm9rZSBjcWxzaCB3aXRoIGFuIEFTQ0lJIGxvY2FsZSAoZm9yIGV4YW1wbGUsCi0gICAgICAgIGJ5IHNldHRpbmcgdGhlICRMQU5HIGVudmlyb25tZW50IHZhcmlhYmxlIHRvICJDIikuCi0gICAgICAgICIiIgotCi0gICAgZGVmIGRvX3BhZ2luZyhzZWxmLCBwYXJzZWQpOgotICAgICAgICAiIiIKLSAgICAgICAgUEFHSU5HIFtjcWxzaF0KLQotICAgICAgICAgIEVuYWJsZXMgb3IgZGlzYWJsZXMgcXVlcnkgcGFnaW5nLgotCi0gICAgICAgIFBBR0lORyBPTgotCi0gICAgICAgICAgRW5hYmxlcyBxdWVyeSBwYWdpbmcgZm9yIGFsbCBmdXJ0aGVyIHF1ZXJpZXMuCi0KLSAgICAgICAgUEFHSU5HIE9GRgotCi0gICAgICAgICAgRGlzYWJsZXMgcGFnaW5nLgotCi0gICAgICAgIFBBR0lORwotCi0gICAgICAgICAgUEFHSU5HIHdpdGggbm8gYXJndW1lbnRzIHNob3dzIHRoZSBjdXJyZW50IHF1ZXJ5IHBhZ2luZyBzdGF0dXMuCi0gICAgICAgICIiIgotICAgICAgICAoc2VsZi51c2VfcGFnaW5nLCByZXF1ZXN0ZWRfcGFnZV9zaXplKSA9IFN3aXRjaENvbW1hbmRXaXRoVmFsdWUoCi0gICAgICAgICAgICAiUEFHSU5HIiwgIlF1ZXJ5IHBhZ2luZyIsIHZhbHVlX3R5cGU9aW50KS5leGVjdXRlKHNlbGYudXNlX3BhZ2luZywgcGFyc2VkLCBzZWxmLnByaW50ZXJyKQotICAgICAgICBpZiBzZWxmLnVzZV9wYWdpbmcgYW5kIHJlcXVlc3RlZF9wYWdlX3NpemUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnBhZ2Vfc2l6ZSA9IHJlcXVlc3RlZF9wYWdlX3NpemUKLSAgICAgICAgaWYgc2VsZi51c2VfcGFnaW5nOgotICAgICAgICAgICAgcHJpbnQoKCJQYWdlIHNpemU6IHt9Ii5mb3JtYXQoc2VsZi5wYWdlX3NpemUpKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYucGFnZV9zaXplID0gc2VsZi5kZWZhdWx0X3BhZ2Vfc2l6ZQotCi0gICAgZGVmIGFwcGx5Y29sb3Ioc2VsZiwgdGV4dCwgY29sb3I9Tm9uZSk6Ci0gICAgICAgIGlmIG5vdCBjb2xvciBvciBub3Qgc2VsZi5jb2xvcjoKLSAgICAgICAgICAgIHJldHVybiB0ZXh0Ci0gICAgICAgIHJldHVybiBjb2xvciArIHRleHQgKyBBTlNJX1JFU0VUCi0KLSAgICBkZWYgd3JpdGVyZXN1bHQoc2VsZiwgdGV4dCwgY29sb3I9Tm9uZSwgbmV3bGluZT1UcnVlLCBvdXQ9Tm9uZSk6Ci0gICAgICAgIGlmIG91dCBpcyBOb25lOgotICAgICAgICAgICAgb3V0ID0gc2VsZi5xdWVyeV9vdXQKLQotICAgICAgICAjIGNvbnZlcnQgRXhjZXB0aW9ucywgZXRjIHRvIHRleHQKLSAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodGV4dCwgc3RyKToKLSAgICAgICAgICAgIHRleHQgPSBzdHIodGV4dCkKLQotICAgICAgICB0b193cml0ZSA9IHNlbGYuYXBwbHljb2xvcih0ZXh0LCBjb2xvcikgKyAoJ1xuJyBpZiBuZXdsaW5lIGVsc2UgJycpCi0gICAgICAgIG91dC53cml0ZSh0b193cml0ZSkKLQotICAgIGRlZiBmbHVzaF9vdXRwdXQoc2VsZik6Ci0gICAgICAgIHNlbGYucXVlcnlfb3V0LmZsdXNoKCkKLQotICAgIGRlZiBwcmludGVycihzZWxmLCB0ZXh0LCBjb2xvcj1SRUQsIG5ld2xpbmU9VHJ1ZSwgc2hvd251bT1Ob25lKToKLSAgICAgICAgc2VsZi5zdGF0ZW1lbnRfZXJyb3IgPSBUcnVlCi0gICAgICAgIGlmIHNob3dudW0gaXMgTm9uZToKLSAgICAgICAgICAgIHNob3dudW0gPSBzZWxmLnNob3dfbGluZV9udW1zCi0gICAgICAgIGlmIHNob3dudW06Ci0gICAgICAgICAgICB0ZXh0ID0gJyVzOiVkOiVzJyAlIChzZWxmLnN0ZGluLm5hbWUsIHNlbGYubGluZW5vLCB0ZXh0KQotICAgICAgICBzZWxmLndyaXRlcmVzdWx0KHRleHQsIGNvbG9yLCBuZXdsaW5lPW5ld2xpbmUsIG91dD1zeXMuc3RkZXJyKQotCi0gICAgZGVmIHN0b3BfY292ZXJhZ2Uoc2VsZik6Ci0gICAgICAgIGlmIHNlbGYuY292ZXJhZ2UgYW5kIHNlbGYuY292IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5jb3Yuc3RvcCgpCi0gICAgICAgICAgICBzZWxmLmNvdi5zYXZlKCkKLSAgICAgICAgICAgIHNlbGYuY292ID0gTm9uZQotCi0KLWNsYXNzIFN3aXRjaENvbW1hbmQob2JqZWN0KToKLSAgICBjb21tYW5kID0gTm9uZQotICAgIGRlc2NyaXB0aW9uID0gTm9uZQotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbW1hbmQsIGRlc2MpOgotICAgICAgICBzZWxmLmNvbW1hbmQgPSBjb21tYW5kCi0gICAgICAgIHNlbGYuZGVzY3JpcHRpb24gPSBkZXNjCi0KLSAgICBkZWYgZXhlY3V0ZShzZWxmLCBzdGF0ZSwgcGFyc2VkLCBwcmludGVycik6Ci0gICAgICAgIHN3aXRjaCA9IHBhcnNlZC5nZXRfYmluZGluZygnc3dpdGNoJykKLSAgICAgICAgaWYgc3dpdGNoIGlzIE5vbmU6Ci0gICAgICAgICAgICBpZiBzdGF0ZToKLSAgICAgICAgICAgICAgICBwcmludCgiJXMgaXMgY3VycmVudGx5IGVuYWJsZWQuIFVzZSAlcyBPRkYgdG8gZGlzYWJsZSIKLSAgICAgICAgICAgICAgICAgICAgICAlIChzZWxmLmRlc2NyaXB0aW9uLCBzZWxmLmNvbW1hbmQpKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwcmludCgiJXMgaXMgY3VycmVudGx5IGRpc2FibGVkLiBVc2UgJXMgT04gdG8gZW5hYmxlLiIKLSAgICAgICAgICAgICAgICAgICAgICAlIChzZWxmLmRlc2NyaXB0aW9uLCBzZWxmLmNvbW1hbmQpKQotICAgICAgICAgICAgcmV0dXJuIHN0YXRlCi0KLSAgICAgICAgaWYgc3dpdGNoLnVwcGVyKCkgPT0gJ09OJzoKLSAgICAgICAgICAgIGlmIHN0YXRlOgotICAgICAgICAgICAgICAgIHByaW50ZXJyKCclcyBpcyBhbHJlYWR5IGVuYWJsZWQuIFVzZSAlcyBPRkYgdG8gZGlzYWJsZS4nCi0gICAgICAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi5kZXNjcmlwdGlvbiwgc2VsZi5jb21tYW5kKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGUKLSAgICAgICAgICAgIHByaW50KCdOb3cgJXMgaXMgZW5hYmxlZCcgJSAoc2VsZi5kZXNjcmlwdGlvbiwpKQotICAgICAgICAgICAgcmV0dXJuIFRydWUKLQotICAgICAgICBpZiBzd2l0Y2gudXBwZXIoKSA9PSAnT0ZGJzoKLSAgICAgICAgICAgIGlmIG5vdCBzdGF0ZToKLSAgICAgICAgICAgICAgICBwcmludGVycignJXMgaXMgbm90IGVuYWJsZWQuJyAlIChzZWxmLmRlc2NyaXB0aW9uLCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlCi0gICAgICAgICAgICBwcmludCgnRGlzYWJsZWQgJXMuJyAlIChzZWxmLmRlc2NyaXB0aW9uLCkpCi0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLQotCi1jbGFzcyBTd2l0Y2hDb21tYW5kV2l0aFZhbHVlKFN3aXRjaENvbW1hbmQpOgotICAgICIiIlRoZSBzYW1lIGFzIFN3aXRjaENvbW1hbmQgZXhjZXB0IGl0IGFsc28gYWNjZXB0cyBhIHZhbHVlIGluIHBsYWNlIG9mIE9OLgotCi0gICAgVGhpcyByZXR1cm5zIGEgdHVwbGUgb2YgdGhlIGZvcm06IChTV0lUQ0hfVkFMVUUsIFBBU1NFRF9WQUxVRSkKLSAgICBlZzogUEFHSU5HIDUwIHJldHVybnMgKFRydWUsIDUwKQotICAgICAgICBQQUdJTkcgT0ZGIHJldHVybnMgKEZhbHNlLCBOb25lKQotICAgICAgICBQQUdJTkcgT04gcmV0dXJucyAoVHJ1ZSwgTm9uZSkKLQotICAgIFRoZSB2YWx1ZV90eXBlIG11c3QgbWF0Y2ggZm9yIHRoZSBQQVNTRURfVkFMVUUsIG90aGVyd2lzZSBpdCB3aWxsIHJldHVybiBOb25lLgotICAgICIiIgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb21tYW5kLCBkZXNjLCB2YWx1ZV90eXBlPWludCk6Ci0gICAgICAgIFN3aXRjaENvbW1hbmQuX19pbml0X18oc2VsZiwgY29tbWFuZCwgZGVzYykKLSAgICAgICAgc2VsZi52YWx1ZV90eXBlID0gdmFsdWVfdHlwZQotCi0gICAgZGVmIGV4ZWN1dGUoc2VsZiwgc3RhdGUsIHBhcnNlZCwgcHJpbnRlcnIpOgotICAgICAgICBiaW5hcnlfc3dpdGNoX3ZhbHVlID0gU3dpdGNoQ29tbWFuZC5leGVjdXRlKHNlbGYsIHN0YXRlLCBwYXJzZWQsIHByaW50ZXJyKQotICAgICAgICBzd2l0Y2ggPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ3N3aXRjaCcpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHZhbHVlID0gc2VsZi52YWx1ZV90eXBlKHN3aXRjaCkKLSAgICAgICAgICAgIGJpbmFyeV9zd2l0Y2hfdmFsdWUgPSBUcnVlCi0gICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgVHlwZUVycm9yKToKLSAgICAgICAgICAgIHZhbHVlID0gTm9uZQotICAgICAgICByZXR1cm4gYmluYXJ5X3N3aXRjaF92YWx1ZSwgdmFsdWUKLQotCi1kZWYgb3B0aW9uX3dpdGhfZGVmYXVsdChjcGFyc2VyX2dldHRlciwgc2VjdGlvbiwgb3B0aW9uLCBkZWZhdWx0PU5vbmUpOgotICAgIHRyeToKLSAgICAgICAgcmV0dXJuIGNwYXJzZXJfZ2V0dGVyKHNlY3Rpb24sIG9wdGlvbikKLSAgICBleGNlcHQgY29uZmlncGFyc2VyLkVycm9yOgotICAgICAgICByZXR1cm4gZGVmYXVsdAotCi0KLWRlZiByYXdfb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLCBzZWN0aW9uLCBvcHRpb24sIGRlZmF1bHQ9Tm9uZSk6Ci0gICAgIiIiCi0gICAgU2FtZSAoYWxtb3N0KSBhcyBvcHRpb25fd2l0aF9kZWZhdWx0KCkgYnV0IHdvbid0IGRvIGFueSBzdHJpbmcgaW50ZXJwb2xhdGlvbi4KLSAgICBVc2VmdWwgZm9yIGNvbmZpZyB2YWx1ZXMgdGhhdCBpbmNsdWRlICclJyBzeW1ib2wsIGUuZy4gdGltZSBmb3JtYXQgc3RyaW5nLgotICAgICIiIgotICAgIHRyeToKLSAgICAgICAgcmV0dXJuIGNvbmZpZ3MuZ2V0KHNlY3Rpb24sIG9wdGlvbiwgcmF3PVRydWUpCi0gICAgZXhjZXB0IGNvbmZpZ3BhcnNlci5FcnJvcjoKLSAgICAgICAgcmV0dXJuIGRlZmF1bHQKLQotCi1kZWYgc2hvdWxkX3VzZV9jb2xvcigpOgotICAgIGlmIG5vdCBzeXMuc3Rkb3V0LmlzYXR0eSgpOgotICAgICAgICByZXR1cm4gRmFsc2UKLSAgICBpZiBvcy5lbnZpcm9uLmdldCgnVEVSTScsICcnKSBpbiAoJ2R1bWInLCAnJyk6Ci0gICAgICAgIHJldHVybiBGYWxzZQotICAgIHRyeToKLSAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oWyd0cHV0JywgJ2NvbG9ycyddLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQotICAgICAgICBzdGRvdXQsIF8gPSBwLmNvbW11bmljYXRlKCkKLSAgICAgICAgaWYgaW50KHN0ZG91dC5zdHJpcCgpKSA8IDg6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICBleGNlcHQgKE9TRXJyb3IsIEltcG9ydEVycm9yLCBWYWx1ZUVycm9yKToKLSAgICAgICAgIyBvaCB3ZWxsLCB3ZSB0cmllZC4gYXQgbGVhc3Qgd2Uga25vdyB0aGVyZSdzIGEgJFRFUk0gYW5kIGl0J3MKLSAgICAgICAgIyBub3QgImR1bWIiLgotICAgICAgICBwYXNzCi0gICAgcmV0dXJuIFRydWUKLQotCi1kZWYgcmVhZF9vcHRpb25zKGNtZGxpbmVhcmdzLCBlbnZpcm9ubWVudCk6Ci0gICAgY29uZmlncyA9IGNvbmZpZ3BhcnNlci5Db25maWdQYXJzZXIoKQotICAgIGNvbmZpZ3MucmVhZChDT05GSUdfRklMRSkKLQotICAgIHJhd2NvbmZpZ3MgPSBjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyKCkKLSAgICByYXdjb25maWdzLnJlYWQoQ09ORklHX0ZJTEUpCi0KLSAgICB1c2VybmFtZV9mcm9tX2NxbHNocmMgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0LCAnYXV0aGVudGljYXRpb24nLCAndXNlcm5hbWUnKQotICAgIHBhc3N3b3JkX2Zyb21fY3Fsc2hyYyA9IG9wdGlvbl93aXRoX2RlZmF1bHQocmF3Y29uZmlncy5nZXQsICdhdXRoZW50aWNhdGlvbicsICdwYXNzd29yZCcpCi0gICAgaWYgdXNlcm5hbWVfZnJvbV9jcWxzaHJjIG9yIHBhc3N3b3JkX2Zyb21fY3Fsc2hyYzoKLSAgICAgICAgaWYgcGFzc3dvcmRfZnJvbV9jcWxzaHJjIGFuZCBub3QgaXNfZmlsZV9zZWN1cmUob3MucGF0aC5leHBhbmR1c2VyKENPTkZJR19GSUxFKSk6Ci0gICAgICAgICAgICBwcmludCgiXG5XYXJuaW5nOiBQYXNzd29yZCBpcyBmb3VuZCBpbiBhbiBpbnNlY3VyZSBjcWxzaHJjIGZpbGUuIFRoZSBmaWxlIGlzIG93bmVkIG9yIHJlYWRhYmxlIGJ5IG90aGVyIHVzZXJzIG9uIHRoZSBzeXN0ZW0uIiwKLSAgICAgICAgICAgICAgICAgIGVuZD0nJywgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICBwcmludCgiXG5Ob3RpY2U6IENyZWRlbnRpYWxzIGluIHRoZSBjcWxzaHJjIGZpbGUgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSBpZ25vcmVkIGluIHRoZSBmdXR1cmUuIgotICAgICAgICAgICAgICAiXG5QbGVhc2UgdXNlIGEgY3JlZGVudGlhbHMgZmlsZSB0byBzcGVjaWZ5IHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQuXG4iLCBmaWxlPXN5cy5zdGRlcnIpCi0KLSAgICBvcHR2YWx1ZXMgPSBvcHRwYXJzZS5WYWx1ZXMoKQotCi0gICAgb3B0dmFsdWVzLnVzZXJuYW1lID0gTm9uZQotICAgIG9wdHZhbHVlcy5wYXNzd29yZCA9IE5vbmUKLSAgICBvcHR2YWx1ZXMuY3JlZGVudGlhbHMgPSBvcy5wYXRoLmV4cGFuZHVzZXIob3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldCwgJ2F1dGhlbnRpY2F0aW9uJywgJ2NyZWRlbnRpYWxzJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oQ1FMX0RJUiwgJ2NyZWRlbnRpYWxzJykpKQotICAgIG9wdHZhbHVlcy5rZXlzcGFjZSA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXQsICdhdXRoZW50aWNhdGlvbicsICdrZXlzcGFjZScpCi0gICAgb3B0dmFsdWVzLmJyb3dzZXIgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0LCAndWknLCAnYnJvd3NlcicsIE5vbmUpCi0gICAgb3B0dmFsdWVzLmNvbXBsZXRla2V5ID0gb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldCwgJ3VpJywgJ2NvbXBsZXRla2V5JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQ09NUExFVEVLRVkpCi0gICAgb3B0dmFsdWVzLmNvbG9yID0gb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldGJvb2xlYW4sICd1aScsICdjb2xvcicpCi0gICAgb3B0dmFsdWVzLnRpbWVfZm9ybWF0ID0gcmF3X29wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncywgJ3VpJywgJ3RpbWVfZm9ybWF0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1RJTUVTVEFNUF9GT1JNQVQpCi0gICAgb3B0dmFsdWVzLm5hbm90aW1lX2Zvcm1hdCA9IHJhd19vcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MsICd1aScsICduYW5vdGltZV9mb3JtYXQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX05BTk9USU1FX0ZPUk1BVCkKLSAgICBvcHR2YWx1ZXMuZGF0ZV9mb3JtYXQgPSByYXdfb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLCAndWknLCAnZGF0ZV9mb3JtYXQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfREFURV9GT1JNQVQpCi0gICAgb3B0dmFsdWVzLmZsb2F0X3ByZWNpc2lvbiA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXRpbnQsICd1aScsICdmbG9hdF9wcmVjaXNpb24nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRkxPQVRfUFJFQ0lTSU9OKQotICAgIG9wdHZhbHVlcy5kb3VibGVfcHJlY2lzaW9uID0gb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldGludCwgJ3VpJywgJ2RvdWJsZV9wcmVjaXNpb24nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0RPVUJMRV9QUkVDSVNJT04pCi0gICAgb3B0dmFsdWVzLmZpZWxkX3NpemVfbGltaXQgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0aW50LCAnY3N2JywgJ2ZpZWxkX3NpemVfbGltaXQnLCBjc3YuZmllbGRfc2l6ZV9saW1pdCgpKQotICAgIG9wdHZhbHVlcy5tYXhfdHJhY2Vfd2FpdCA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXRmbG9hdCwgJ3RyYWNpbmcnLCAnbWF4X3RyYWNlX3dhaXQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9NQVhfVFJBQ0VfV0FJVCkKLSAgICBvcHR2YWx1ZXMudGltZXpvbmUgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0LCAndWknLCAndGltZXpvbmUnLCBOb25lKQotCi0gICAgb3B0dmFsdWVzLmRlYnVnID0gRmFsc2UKLQotICAgIG9wdHZhbHVlcy5jb3ZlcmFnZSA9IEZhbHNlCi0gICAgaWYgJ0NRTFNIX0NPVkVSQUdFJyBpbiBlbnZpcm9ubWVudC5rZXlzKCk6Ci0gICAgICAgIG9wdHZhbHVlcy5jb3ZlcmFnZSA9IFRydWUKLQotICAgIG9wdHZhbHVlcy5maWxlID0gTm9uZQotICAgIG9wdHZhbHVlcy5zc2wgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0Ym9vbGVhbiwgJ2Nvbm5lY3Rpb24nLCAnc3NsJywgREVGQVVMVF9TU0wpCi0gICAgb3B0dmFsdWVzLmVuY29kaW5nID0gb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldCwgJ3VpJywgJ2VuY29kaW5nJywgVVRGOCkKLQotICAgIG9wdHZhbHVlcy50dHkgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0Ym9vbGVhbiwgJ3VpJywgJ3R0eScsIHN5cy5zdGRpbi5pc2F0dHkoKSkKLSAgICBvcHR2YWx1ZXMucHJvdG9jb2xfdmVyc2lvbiA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXRpbnQsICdwcm90b2NvbCcsICd2ZXJzaW9uJywgTm9uZSkKLSAgICBvcHR2YWx1ZXMuY3FsdmVyc2lvbiA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXQsICdjcWwnLCAndmVyc2lvbicsIE5vbmUpCi0gICAgb3B0dmFsdWVzLmNvbm5lY3RfdGltZW91dCA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXRpbnQsICdjb25uZWN0aW9uJywgJ3RpbWVvdXQnLCBERUZBVUxUX0NPTk5FQ1RfVElNRU9VVF9TRUNPTkRTKQotICAgIG9wdHZhbHVlcy5yZXF1ZXN0X3RpbWVvdXQgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0aW50LCAnY29ubmVjdGlvbicsICdyZXF1ZXN0X3RpbWVvdXQnLCBERUZBVUxUX1JFUVVFU1RfVElNRU9VVF9TRUNPTkRTKQotICAgIG9wdHZhbHVlcy5leGVjdXRlID0gTm9uZQotICAgIG9wdHZhbHVlcy5pbnNlY3VyZV9wYXNzd29yZF93aXRob3V0X3dhcm5pbmcgPSBGYWxzZQotCi0gICAgKG9wdGlvbnMsIGFyZ3VtZW50cykgPSBwYXJzZXIucGFyc2VfYXJncyhjbWRsaW5lYXJncywgdmFsdWVzPW9wdHZhbHVlcykKLQotICAgICMgQ3JlZGVudGlhbHMgZnJvbSBjcWxzaHJjIHdpbGwgYmUgZXhwYW5kZWQsCi0gICAgIyBjcmVkZW50aWFscyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYXJlIGFsc28gZXhwYW5kZWQgaWYgdGhlcmUgaXMgYSBzcGFjZS4uLgotICAgICMgd2UgbmVlZCB0aGUgZm9sbG93aW5nIHNvIHRoYXQgdGhlc2UgdHdvIHNjZW5hcmlvcyB3aWxsIHdvcmsKLSAgICAjICAgY3Fsc2ggLS1jcmVkZW50aWFscz1+Ly5jYXNzYW5kcmEvY3JlZHMKLSAgICAjICAgY3Fsc2ggLS1jcmVkZW50aWFscyB+Ly5jYXNzYW5kcmEvY3JlZHMKLSAgICBvcHRpb25zLmNyZWRlbnRpYWxzID0gb3MucGF0aC5leHBhbmR1c2VyKG9wdGlvbnMuY3JlZGVudGlhbHMpCi0KLSAgICBpZiBub3QgaXNfZmlsZV9zZWN1cmUob3B0aW9ucy5jcmVkZW50aWFscyk6Ci0gICAgICAgIHByaW50KCJcbldhcm5pbmc6IENyZWRlbnRpYWxzIGZpbGUgJ3swfScgZXhpc3RzIGJ1dCBpcyBub3QgdXNlZCwgYmVjYXVzZToiCi0gICAgICAgICAgICAgICJcbiAgYS4gdGhlIGZpbGUgb3duZXIgaXMgbm90IHRoZSBjdXJyZW50IHVzZXI7IG9yIgotICAgICAgICAgICAgICAiXG4gIGIuIHRoZSBmaWxlIGlzIHJlYWRhYmxlIGJ5IGdyb3VwIG9yIG90aGVyLiIKLSAgICAgICAgICAgICAgIlxuUGxlYXNlIGVuc3VyZSB0aGUgZmlsZSBpcyBvd25lZCBieSB0aGUgY3VycmVudCB1c2VyIGFuZCBpcyBub3QgcmVhZGFibGUgYnkgZ3JvdXAgb3Igb3RoZXIuIgotICAgICAgICAgICAgICAiXG5PbiBhIExpbnV4IG9yIFVOSVgtbGlrZSBzeXN0ZW0sIHlvdSBvZnRlbiBjYW4gZG8gdGhpcyBieSB1c2luZyB0aGUgYGNob3duYCBhbmQgYGNobW9kYCBjb21tYW5kczoiCi0gICAgICAgICAgICAgICJcbiAgY2hvd24gWU9VUl9VU0VSTkFNRSBjcmVkZW50aWFscyIKLSAgICAgICAgICAgICAgIlxuICBjaG1vZCA2MDAgY3JlZGVudGlhbHNcbiIuZm9ybWF0KG9wdGlvbnMuY3JlZGVudGlhbHMpLAotICAgICAgICAgICAgICBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgIG9wdGlvbnMuY3JlZGVudGlhbHMgPSAnJyAgIyBDb25maWdQYXJzZXIucmVhZCgpIHdpbGwgaWdub3JlIHVucmVhZGFibGUgZmlsZXMKLQotICAgIGlmIG5vdCBvcHRpb25zLnVzZXJuYW1lOgotICAgICAgICBjcmVkZW50aWFscyA9IGNvbmZpZ3BhcnNlci5Db25maWdQYXJzZXIoKQotICAgICAgICBjcmVkZW50aWFscy5yZWFkKG9wdGlvbnMuY3JlZGVudGlhbHMpCi0KLSAgICAgICAgIyB1c2UgdGhlIHVzZXJuYW1lIGZyb20gY3JlZGVudGlhbHMgZmlsZSBidXQgZmFsbGJhY2sgdG8gY3Fsc2hyYyBpZiB1c2VybmFtZSBpcyBhYnNlbnQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMKLSAgICAgICAgb3B0aW9ucy51c2VybmFtZSA9IHVzZXJuYW1lX2Zyb21fY3Fsc2hyYwotCi0gICAgaWYgbm90IG9wdGlvbnMucGFzc3dvcmQ6Ci0gICAgICAgIHJhd2NyZWRlbnRpYWxzID0gY29uZmlncGFyc2VyLlJhd0NvbmZpZ1BhcnNlcigpCi0gICAgICAgIHJhd2NyZWRlbnRpYWxzLnJlYWQob3B0aW9ucy5jcmVkZW50aWFscykKLQotICAgICAgICAjIGhhbmRsaW5nIHBhc3N3b3JkIGluIHRoZSBzYW1lIHdheSBhcyB1c2VybmFtZSwgcHJpb3JpdHkgY2xpID4gY3JlZGVudGlhbHMgPiBjcWxzaHJjCi0gICAgICAgIG9wdGlvbnMucGFzc3dvcmQgPSBvcHRpb25fd2l0aF9kZWZhdWx0KHJhd2NyZWRlbnRpYWxzLmdldCwgJ3BsYWluX3RleHRfYXV0aCcsICdwYXNzd29yZCcsIHBhc3N3b3JkX2Zyb21fY3Fsc2hyYykKLSAgICAgICAgb3B0aW9ucy5wYXNzd29yZCA9IHBhc3N3b3JkX2Zyb21fY3Fsc2hyYwotICAgIGVsaWYgbm90IG9wdGlvbnMuaW5zZWN1cmVfcGFzc3dvcmRfd2l0aG91dF93YXJuaW5nOgotICAgICAgICBwcmludCgiXG5XYXJuaW5nOiBVc2luZyBhIHBhc3N3b3JkIG9uIHRoZSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlIGNhbiBiZSBpbnNlY3VyZS4iCi0gICAgICAgICAgICAgICJcblJlY29tbWVuZGF0aW9uOiB1c2UgdGhlIGNyZWRlbnRpYWxzIGZpbGUgdG8gc2VjdXJlbHkgcHJvdmlkZSB0aGUgcGFzc3dvcmQuXG4iLCBmaWxlPXN5cy5zdGRlcnIpCi0KLSAgICAjIE1ha2Ugc3VyZSBzb21lIHVzZXIgdmFsdWVzIHJlYWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGFyZSBpbiB1bmljb2RlCi0gICAgb3B0aW9ucy5leGVjdXRlID0gbWF5YmVfZW5zdXJlX3RleHQob3B0aW9ucy5leGVjdXRlKQotICAgIG9wdGlvbnMudXNlcm5hbWUgPSBtYXliZV9lbnN1cmVfdGV4dChvcHRpb25zLnVzZXJuYW1lKQotICAgIG9wdGlvbnMucGFzc3dvcmQgPSBtYXliZV9lbnN1cmVfdGV4dChvcHRpb25zLnBhc3N3b3JkKQotICAgIG9wdGlvbnMua2V5c3BhY2UgPSBtYXliZV9lbnN1cmVfdGV4dChvcHRpb25zLmtleXNwYWNlKQotCi0gICAgaG9zdG5hbWUgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0LCAnY29ubmVjdGlvbicsICdob3N0bmFtZScsIERFRkFVTFRfSE9TVCkKLSAgICBwb3J0ID0gb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldCwgJ2Nvbm5lY3Rpb24nLCAncG9ydCcsIERFRkFVTFRfUE9SVCkKLQotICAgIHRyeToKLSAgICAgICAgb3B0aW9ucy5jb25uZWN0X3RpbWVvdXQgPSBpbnQob3B0aW9ucy5jb25uZWN0X3RpbWVvdXQpCi0gICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgIHBhcnNlci5lcnJvcignIiVzIiBpcyBub3QgYSB2YWxpZCBjb25uZWN0IHRpbWVvdXQuJyAlIChvcHRpb25zLmNvbm5lY3RfdGltZW91dCwpKQotICAgICAgICBvcHRpb25zLmNvbm5lY3RfdGltZW91dCA9IERFRkFVTFRfQ09OTkVDVF9USU1FT1VUX1NFQ09ORFMKLQotICAgIHRyeToKLSAgICAgICAgb3B0aW9ucy5yZXF1ZXN0X3RpbWVvdXQgPSBpbnQob3B0aW9ucy5yZXF1ZXN0X3RpbWVvdXQpCi0gICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgIHBhcnNlci5lcnJvcignIiVzIiBpcyBub3QgYSB2YWxpZCByZXF1ZXN0IHRpbWVvdXQuJyAlIChvcHRpb25zLnJlcXVlc3RfdGltZW91dCwpKQotICAgICAgICBvcHRpb25zLnJlcXVlc3RfdGltZW91dCA9IERFRkFVTFRfUkVRVUVTVF9USU1FT1VUX1NFQ09ORFMKLQotICAgIGhvc3RuYW1lID0gZW52aXJvbm1lbnQuZ2V0KCdDUUxTSF9IT1NUJywgaG9zdG5hbWUpCi0gICAgcG9ydCA9IGVudmlyb25tZW50LmdldCgnQ1FMU0hfUE9SVCcsIHBvcnQpCi0KLSAgICBpZiBsZW4oYXJndW1lbnRzKSA+IDA6Ci0gICAgICAgIGhvc3RuYW1lID0gYXJndW1lbnRzWzBdCi0gICAgaWYgbGVuKGFyZ3VtZW50cykgPiAxOgotICAgICAgICBwb3J0ID0gYXJndW1lbnRzWzFdCi0KLSAgICBpZiBvcHRpb25zLmZpbGUgb3Igb3B0aW9ucy5leGVjdXRlOgotICAgICAgICBvcHRpb25zLnR0eSA9IEZhbHNlCi0KLSAgICBpZiBvcHRpb25zLmV4ZWN1dGUgYW5kIG5vdCBvcHRpb25zLmV4ZWN1dGUuZW5kc3dpdGgoJzsnKToKLSAgICAgICAgb3B0aW9ucy5leGVjdXRlICs9ICc7JwotCi0gICAgaWYgb3B0dmFsdWVzLmNvbG9yIGluIChUcnVlLCBGYWxzZSk6Ci0gICAgICAgIG9wdGlvbnMuY29sb3IgPSBvcHR2YWx1ZXMuY29sb3IKLSAgICBlbHNlOgotICAgICAgICBpZiBvcHRpb25zLmZpbGUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBvcHRpb25zLmNvbG9yID0gRmFsc2UKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIG9wdGlvbnMuY29sb3IgPSBzaG91bGRfdXNlX2NvbG9yKCkKLQotICAgIGlmIG9wdGlvbnMuY3FsdmVyc2lvbiBpcyBub3QgTm9uZToKLSAgICAgICAgb3B0aW9ucy5jcWx2ZXJzaW9uLCBjcWx2ZXJ0dXAgPSBmdWxsX2NxbF92ZXJzaW9uKG9wdGlvbnMuY3FsdmVyc2lvbikKLSAgICAgICAgaWYgY3FsdmVydHVwWzBdIDwgMzoKLSAgICAgICAgICAgIHBhcnNlci5lcnJvcignJXIgaXMgbm90IGEgc3VwcG9ydGVkIENRTCB2ZXJzaW9uLicgJSBvcHRpb25zLmNxbHZlcnNpb24pCi0gICAgb3B0aW9ucy5jcWxtb2R1bGUgPSBjcWwzaGFuZGxpbmcKLQotICAgIHRyeToKLSAgICAgICAgcG9ydCA9IGludChwb3J0KQotICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICBwYXJzZXIuZXJyb3IoJyVyIGlzIG5vdCBhIHZhbGlkIHBvcnQgbnVtYmVyLicgJSBwb3J0KQotICAgIHJldHVybiBvcHRpb25zLCBob3N0bmFtZSwgcG9ydAotCi0KLWRlZiBzZXR1cF9jcWxydWxlc2V0KGNxbG1vZHVsZSk6Ci0gICAgZ2xvYmFsIGNxbHJ1bGVzZXQKLSAgICBjcWxydWxlc2V0ID0gY3FsbW9kdWxlLkNxbFJ1bGVTZXQKLSAgICBjcWxydWxlc2V0LmFwcGVuZF9ydWxlcyhjcWxzaGhhbmRsaW5nLmNxbHNoX2V4dHJhX3N5bnRheF9ydWxlcykKLSAgICBmb3IgcnVsZW5hbWUsIHRlcm1uYW1lLCBmdW5jIGluIGNxbHNoaGFuZGxpbmcuY3Fsc2hfc3ludGF4X2NvbXBsZXRlcnM6Ci0gICAgICAgIGNxbHJ1bGVzZXQuY29tcGxldGVyX2ZvcihydWxlbmFtZSwgdGVybW5hbWUpKGZ1bmMpCi0gICAgY3FscnVsZXNldC5jb21tYW5kc19lbmRfd2l0aF9uZXdsaW5lLnVwZGF0ZShjcWxzaGhhbmRsaW5nLm15X2NvbW1hbmRzX2VuZGluZ193aXRoX25ld2xpbmUpCi0KLQotZGVmIHNldHVwX2NxbGRvY3MoY3FsbW9kdWxlKToKLSAgICBnbG9iYWwgY3FsZG9jcwotICAgIGNxbGRvY3MgPSBjcWxtb2R1bGUuY3FsZG9jcwotCi0KLWRlZiBpbml0X2hpc3RvcnkoKToKLSAgICBpZiByZWFkbGluZSBpcyBub3QgTm9uZToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmVhZGxpbmUucmVhZF9oaXN0b3J5X2ZpbGUoSElTVE9SWSkKLSAgICAgICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGRlbGltcyA9IHJlYWRsaW5lLmdldF9jb21wbGV0ZXJfZGVsaW1zKCkKLSAgICAgICAgZGVsaW1zLnJlcGxhY2UoIiciLCAiIikKLSAgICAgICAgZGVsaW1zICs9ICcuJwotICAgICAgICByZWFkbGluZS5zZXRfY29tcGxldGVyX2RlbGltcyhkZWxpbXMpCi0KLQotZGVmIHNhdmVfaGlzdG9yeSgpOgotICAgIGlmIHJlYWRsaW5lIGlzIG5vdCBOb25lOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZWFkbGluZS53cml0ZV9oaXN0b3J5X2ZpbGUoSElTVE9SWSkKLSAgICAgICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0KLQotZGVmIG1haW4ob3B0aW9ucywgaG9zdG5hbWUsIHBvcnQpOgotICAgIHNldHVwX2NxbHJ1bGVzZXQob3B0aW9ucy5jcWxtb2R1bGUpCi0gICAgc2V0dXBfY3FsZG9jcyhvcHRpb25zLmNxbG1vZHVsZSkKLSAgICBpbml0X2hpc3RvcnkoKQotICAgIGNzdi5maWVsZF9zaXplX2xpbWl0KG9wdGlvbnMuZmllbGRfc2l6ZV9saW1pdCkKLQotICAgIGlmIG9wdGlvbnMuZmlsZSBpcyBOb25lOgotICAgICAgICBzdGRpbiA9IE5vbmUKLSAgICBlbHNlOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBlbmNvZGluZywgYm9tX3NpemUgPSBnZXRfZmlsZV9lbmNvZGluZ19ib21zaXplKG9wdGlvbnMuZmlsZSkKLSAgICAgICAgICAgIHN0ZGluID0gY29kZWNzLm9wZW4ob3B0aW9ucy5maWxlLCAncicsIGVuY29kaW5nKQotICAgICAgICAgICAgc3RkaW4uc2Vlayhib21fc2l6ZSkKLSAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKLSAgICAgICAgICAgIHN5cy5leGl0KCJDYW4ndCBvcGVuICVyOiAlcyIgJSAob3B0aW9ucy5maWxlLCBlKSkKLQotICAgIGlmIG9wdGlvbnMuZGVidWc6Ci0gICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIlVzaW5nIENRTCBkcml2ZXI6ICVzXG4iICUgKGNhc3NhbmRyYSwpKQotICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJVc2luZyBjb25uZWN0IHRpbWVvdXQ6ICVzIHNlY29uZHNcbiIgJSAob3B0aW9ucy5jb25uZWN0X3RpbWVvdXQsKSkKLSAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiVXNpbmcgJyVzJyBlbmNvZGluZ1xuIiAlIChvcHRpb25zLmVuY29kaW5nLCkpCi0gICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIlVzaW5nIHNzbDogJXNcbiIgJSAob3B0aW9ucy5zc2wsKSkKLQotICAgICMgY3JlYXRlIHRpbWV6b25lIGJhc2VkIG9uIHNldHRpbmdzLCBlbnZpcm9ubWVudCBvciBhdXRvLWRldGVjdGlvbgotICAgIHRpbWV6b25lID0gTm9uZQotICAgIGlmIG9wdGlvbnMudGltZXpvbmUgb3IgJ1RaJyBpbiBvcy5lbnZpcm9uOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpbXBvcnQgcHl0egotICAgICAgICAgICAgaWYgb3B0aW9ucy50aW1lem9uZToKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHRpbWV6b25lID0gcHl0ei50aW1lem9uZShvcHRpb25zLnRpbWV6b25lKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246Ci0gICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIldhcm5pbmc6IGNvdWxkIG5vdCByZWNvZ25pemUgdGltZXpvbmUgJyVzJyBzcGVjaWZpZWQgaW4gY3Fsc2hyY1xuXG4iICUgKG9wdGlvbnMudGltZXpvbmUpKQotICAgICAgICAgICAgaWYgJ1RaJyBpbiBvcy5lbnZpcm9uOgotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgdGltZXpvbmUgPSBweXR6LnRpbWV6b25lKG9zLmVudmlyb25bJ1RaJ10pCi0gICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKLSAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiV2FybmluZzogY291bGQgbm90IHJlY29nbml6ZSB0aW1lem9uZSAnJXMnIGZyb20gZW52aXJvbm1lbnQgdmFsdWUgVFpcblxuIiAlIChvcy5lbnZpcm9uWydUWiddKSkKLSAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiV2FybmluZzogVGltZXpvbmUgZGVmaW5lZCBhbmQgJ3B5dHonIG1vZHVsZSBmb3IgdGltZXpvbmUgY29udmVyc2lvbiBub3QgaW5zdGFsbGVkLiBUaW1lc3RhbXBzIHdpbGwgYmUgZGlzcGxheWVkIGluIFVUQyB0aW1lem9uZS5cblxuIikKLQotICAgICMgdHJ5IGF1dG8tZGV0ZWN0IHRpbWV6b25lIGlmIHR6bG9jYWwgaXMgaW5zdGFsbGVkCi0gICAgaWYgbm90IHRpbWV6b25lOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmcm9tIHR6bG9jYWwgaW1wb3J0IGdldF9sb2NhbHpvbmUKLSAgICAgICAgICAgIHRpbWV6b25lID0gZ2V0X2xvY2Fsem9uZSgpCi0gICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgICMgd2Ugc2lsZW50bHkgaWdub3JlIGFuZCBmYWxsYmFjayB0byBVVEMgdW5sZXNzIGEgY3VzdG9tIHRpbWVzdGFtcCBmb3JtYXQgKHdoaWNoIGxpa2VseQotICAgICAgICAgICAgIyBkb2VzIGNvbnRhaW4gYSBUWiBwYXJ0KSB3YXMgc3BlY2lmaWVkCi0gICAgICAgICAgICBpZiBvcHRpb25zLnRpbWVfZm9ybWF0ICE9IERFRkFVTFRfVElNRVNUQU1QX0ZPUk1BVDoKLSAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJXYXJuaW5nOiBjdXN0b20gdGltZXN0YW1wIGZvcm1hdCBzcGVjaWZpZWQgaW4gY3Fsc2hyYywgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYnV0IGxvY2FsIHRpbWV6b25lIGNvdWxkIG5vdCBiZSBkZXRlY3RlZC5cbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIkVpdGhlciBpbnN0YWxsIFB5dGhvbiAndHpsb2NhbCcgbW9kdWxlIGZvciBhdXRvLWRldGVjdGlvbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJvciBzcGVjaWZ5IGNsaWVudCB0aW1lem9uZSBpbiB5b3VyIGNxbHNocmMuXG5cbiIpCi0KLSAgICB0cnk6Ci0gICAgICAgIHNoZWxsID0gU2hlbGwoaG9zdG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1vcHRpb25zLmNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lPW9wdGlvbnMudXNlcm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3RkaW4sCi0gICAgICAgICAgICAgICAgICAgICAgdHR5PW9wdGlvbnMudHR5LAotICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRla2V5PW9wdGlvbnMuY29tcGxldGVrZXksCi0gICAgICAgICAgICAgICAgICAgICAgYnJvd3Nlcj1vcHRpb25zLmJyb3dzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xfdmVyc2lvbj1vcHRpb25zLnByb3RvY29sX3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgY3FsdmVyPW9wdGlvbnMuY3FsdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICBrZXlzcGFjZT1vcHRpb25zLmtleXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfdGltZXN0YW1wX2Zvcm1hdD1vcHRpb25zLnRpbWVfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfbmFub3RpbWVfZm9ybWF0PW9wdGlvbnMubmFub3RpbWVfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfZGF0ZV9mb3JtYXQ9b3B0aW9ucy5kYXRlX2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2Zsb2F0X3ByZWNpc2lvbj1vcHRpb25zLmZsb2F0X3ByZWNpc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2RvdWJsZV9wcmVjaXNpb249b3B0aW9ucy5kb3VibGVfcHJlY2lzaW9uLAotICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfdGltZXpvbmU9dGltZXpvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgbWF4X3RyYWNlX3dhaXQ9b3B0aW9ucy5tYXhfdHJhY2Vfd2FpdCwKLSAgICAgICAgICAgICAgICAgICAgICBzc2w9b3B0aW9ucy5zc2wsCi0gICAgICAgICAgICAgICAgICAgICAgc2luZ2xlX3N0YXRlbWVudD1vcHRpb25zLmV4ZWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF90aW1lb3V0PW9wdGlvbnMucmVxdWVzdF90aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfdGltZW91dD1vcHRpb25zLmNvbm5lY3RfdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZz1vcHRpb25zLmVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgIGF1dGhfcHJvdmlkZXI9YXV0aHByb3ZpZGVyaGFuZGxpbmcubG9hZF9hdXRoX3Byb3ZpZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfZmlsZT1DT05GSUdfRklMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlZF9maWxlPW9wdGlvbnMuY3JlZGVudGlhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lPW9wdGlvbnMudXNlcm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkPW9wdGlvbnMucGFzc3dvcmQpKQotICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgc3lzLmV4aXQoJ0Nvbm5lY3Rpb24gYWJvcnRlZC4nKQotICAgIGV4Y2VwdCBDUUxfRVJST1JTIGFzIGU6Ci0gICAgICAgIHN5cy5leGl0KCdDb25uZWN0aW9uIGVycm9yOiAlcycgJSAoZSwpKQotICAgIGV4Y2VwdCBWZXJzaW9uTm90U3VwcG9ydGVkIGFzIGU6Ci0gICAgICAgIHN5cy5leGl0KCdVbnN1cHBvcnRlZCBDUUwgdmVyc2lvbjogJXMnICUgKGUsKSkKLSAgICBpZiBvcHRpb25zLmRlYnVnOgotICAgICAgICBzaGVsbC5kZWJ1ZyA9IFRydWUKLSAgICBpZiBvcHRpb25zLmNvdmVyYWdlOgotICAgICAgICBzaGVsbC5jb3ZlcmFnZSA9IFRydWUKLSAgICAgICAgaW1wb3J0IHNpZ25hbAotCi0gICAgICAgIGRlZiBoYW5kbGVfc2lnaHVwKCk6Ci0gICAgICAgICAgICBzaGVsbC5zdG9wX2NvdmVyYWdlKCkKLSAgICAgICAgICAgIHNoZWxsLmRvX2V4aXQoKQotCi0gICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0hVUCwgaGFuZGxlX3NpZ2h1cCkKLQotICAgIHNoZWxsLmNtZGxvb3AoKQotICAgIHNhdmVfaGlzdG9yeSgpCi0KLSAgICBpZiBzaGVsbC5iYXRjaF9tb2RlIGFuZCBzaGVsbC5zdGF0ZW1lbnRfZXJyb3I6Ci0gICAgICAgIHN5cy5leGl0KDIpCi0KK2Zyb20gY3Fsc2hsaWIuY3Fsc2htYWluIGltcG9ydCBtYWluCiAKICMgYWx3YXlzIGNhbGwgdGhpcyByZWdhcmRsZXNzIG9mIG1vZHVsZSBuYW1lOiB3aGVuIGEgc3ViLXByb2Nlc3MgaXMgc3Bhd25lZAogIyBvbiBXaW5kb3dzIHRoZW4gdGhlIG1vZHVsZSBuYW1lIGlzIG5vdCBfX21haW5fXywgc2VlIENBU1NBTkRSQS05MzA0IChXaW5kb3dzIHN1cHBvcnQgd2FzIGRyb3BwZWQgaW4gQ0FTU0FORFJBLTE2OTU2KQotaW5zZXJ0X2RyaXZlcl9ob29rcygpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgbWFpbigqcmVhZF9vcHRpb25zKHN5cy5hcmd2WzE6XSwgb3MuZW52aXJvbikpCi0KLSMgdmltOiBzZXQgZnQ9cHl0aG9uIGV0IHRzPTQgc3c9NCA6CisgICAgbWFpbihzeXMuYXJndlsxOl0sIENBU1NBTkRSQV9QQVRIKQpkaWZmIC0tZ2l0IGEvYnVpbGQueG1sIGIvYnVpbGQueG1sCmluZGV4IGRhMjE1NjkuLjNlMGE4ZTkgMTAwNjQ0Ci0tLSBhL2J1aWxkLnhtbAorKysgYi9idWlsZC54bWwKQEAgLTE1LDcgKzE1LDYgQEAKICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxwcm9qZWN0IGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImphciIgbmFtZT0iYXBhY2hlLWNhc3NhbmRyYSIKLSAgICAgICAgIHhtbG5zOmFydGlmYWN0PSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiCiAgICAgICAgICB4bWxuczppZj0iYW50OmlmIgogICAgICAgICAgeG1sbnM6dW5sZXNzPSJhbnQ6dW5sZXNzIj4KIApAQCAtMzMsMTEgKzMyLDIwIEBACiAgICAgPHByb3BlcnR5IG5hbWU9ImRlYnVnbGV2ZWwiIHZhbHVlPSJzb3VyY2UsbGluZXMsdmFycyIvPgogCiAgICAgPCEtLSBkZWZhdWx0IHZlcnNpb24gYW5kIFNDTSBpbmZvcm1hdGlvbiAtLT4KLSAgICA8cHJvcGVydHkgbmFtZT0iYmFzZS52ZXJzaW9uIiB2YWx1ZT0iNC4xLjMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYmFzZS52ZXJzaW9uIiB2YWx1ZT0iNS4wIi8+CiAgICAgPHByb3BlcnR5IG5hbWU9InNjbS5jb25uZWN0aW9uIiB2YWx1ZT0ic2NtOmh0dHBzOi8vZ2l0Ym94LmFwYWNoZS5vcmcvcmVwb3MvYXNmL2Nhc3NhbmRyYS5naXQiLz4KICAgICA8cHJvcGVydHkgbmFtZT0ic2NtLmRldmVsb3BlckNvbm5lY3Rpb24iIHZhbHVlPSJzY206aHR0cHM6Ly9naXRib3guYXBhY2hlLm9yZy9yZXBvcy9hc2YvY2Fzc2FuZHJhLmdpdCIvPgogICAgIDxwcm9wZXJ0eSBuYW1lPSJzY20udXJsIiB2YWx1ZT0iaHR0cHM6Ly9naXRib3guYXBhY2hlLm9yZy9yZXBvcy9hc2Y/cD1jYXNzYW5kcmEuZ2l0O2E9dHJlZSIvPgogCisgICAgPCEtLSBKREtzIHN1cHBvcnRlZC4KKyAgICAgICAgQWxsIHJlbGVhc2VzIGFyZSBidWlsdCB3aXRoIHRoZSBkZWZhdWx0IEpESy4KKyAgICAgICAgQnVpbGRzIHdpdGggbm9uLWRlZmF1bHQgSkRLcyBhcmUgY29uc2lkZXJlZCBleHBlcmltZW50YWwgYW5kIGZvciBkZXZlbG9wbWVudCBhbmQgdGVzdGluZyBwdXJwb3Nlcy4KKyAgICAgICAgV2hlbiBidWlsZGluZywgamF2YWMncyBzb3VyY2UgYW5kIHRhcmdldCBmbGFncyBhcmUgc2V0IHRvIHRoZSBqZGsgdXNlZCwgc28gbG93ZXIgSkRLcyBhcmUgbm90IHN1cHBvcnRlZCBhdCBydW50aW1lLgorICAgICAgICBUaGUgdXNlIG9mIGJvdGggQ0FTU0FORFJBX1VTRV9KREsxMSBhbmQgdXNlLWpkazExIGlzIGRlcHJlY2F0ZWQuCisgICAgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEuZGVmYXVsdCIgdmFsdWU9IjEuOCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS5zdXBwb3J0ZWQiIHZhbHVlPSIxLjgsMTEsMTciIC8+CisKICAgICA8IS0tIGRpcmVjdG9yeSBkZXRhaWxzIC0tPgogICAgIDxwcm9wZXJ0eSBuYW1lPSJiYXNlZGlyIiB2YWx1ZT0iLiIvPgogICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5zcmMiIHZhbHVlPSIke2Jhc2VkaXJ9L3NyYyIvPgpAQCAtOTQsMTEgKzEwMiw2IEBACiAKICAgICA8cHJvcGVydHkgbmFtZT0ibG9jYWwucmVwb3NpdG9yeSIgdmFsdWU9IiR7dXNlci5ob21lfS8ubTIvcmVwb3NpdG9yeSIgLz4KIAotICAgIDwhLS0gZGV0YWlscyBvZiB3aGF0IHZlcnNpb24gb2YgTWF2ZW4gQU5UIFRhc2tzIHRvIGZldGNoIC0tPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXZlbi1hbnQtdGFza3MudmVyc2lvbiIgdmFsdWU9IjIuMS4zIiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXZlbi1hbnQtdGFza3MubG9jYWwiIHZhbHVlPSIke2xvY2FsLnJlcG9zaXRvcnl9L29yZy9hcGFjaGUvbWF2ZW4vbWF2ZW4tYW50LXRhc2tzIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Im1hdmVuLWFudC10YXNrcy51cmwiCi0gICAgICAgICAgICAgIHZhbHVlPSJodHRwczovL3JlcG8ubWF2ZW4uYXBhY2hlLm9yZy9tYXZlbjIvb3JnL2FwYWNoZS9tYXZlbi9tYXZlbi1hbnQtdGFza3MiIC8+CiAgICAgPCEtLSBkZXRhaWxzIG9mIGhvdyBhbmQgd2hpY2ggTWF2ZW4gcmVwb3NpdG9yeSB3ZSBwdWJsaXNoIHRvIC0tPgogICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXZlbi52ZXJzaW9uIiB2YWx1ZT0iMy4wLjMiIC8+CiAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibWF2ZW4tcmVwb3NpdG9yeS11cmwiIHZhbHVlPSJodHRwczovL3JlcG9zaXRvcnkuYXBhY2hlLm9yZy9zZXJ2aWNlL2xvY2FsL3N0YWdpbmcvZGVwbG95L21hdmVuMiI+CkBAIC0xMzAsMzcgKzEzMywyMCBAQAogICAgIDxwcm9wZXJ0eSBuYW1lPSJjYXNzYW5kcmEudGVzdC5tZXNzYWdpbmdTZXJ2aWNlLm5vbkdyYWNlZnVsU2h1dGRvd24iIHZhbHVlPSJ0cnVlIi8+CiAKICAgICA8IS0tIGh0dHBzOi8vd3d3LmVjbGVtbWEub3JnL2phY29jby8gLS0+CisgICAgPHByb3BlcnR5IG5hbWU9ImphY29jby52ZXJzaW9uIiB2YWx1ZT0iMC44LjgiLz4KICAgICA8cHJvcGVydHkgbmFtZT0iamFjb2NvLmV4cG9ydC5kaXIiIHZhbHVlPSIke2J1aWxkLmRpcn0vamFjb2NvLyIgLz4KICAgICA8cHJvcGVydHkgbmFtZT0iamFjb2NvLnBhcnRpYWxzLmRpciIgdmFsdWU9IiR7amFjb2NvLmV4cG9ydC5kaXJ9L3BhcnRpYWxzIiAvPgogICAgIDxwcm9wZXJ0eSBuYW1lPSJqYWNvY28ucGFydGlhbGV4ZWNmaWxlIiB2YWx1ZT0iJHtqYWNvY28ucGFydGlhbHMuZGlyfS9wYXJ0aWFsLmV4ZWMiIC8+CiAgICAgPHByb3BlcnR5IG5hbWU9ImphY29jby5maW5hbGV4ZWNmaWxlIiB2YWx1ZT0iJHtqYWNvY28uZXhwb3J0LmRpcn0vamFjb2NvLmV4ZWMiIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImphY29jby52ZXJzaW9uIiB2YWx1ZT0iMC44LjYiLz4KIAotICAgIDxwcm9wZXJ0eSBuYW1lPSJieXRlbWFuLnZlcnNpb24iIHZhbHVlPSI0LjAuNiIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqZmxleC52ZXJzaW9uIiB2YWx1ZT0iMS44LjIiLz4KICAgICA8cHJvcGVydHkgbmFtZT0iamFtbS52ZXJzaW9uIiB2YWx1ZT0iMC4zLjIiLz4KICAgICA8cHJvcGVydHkgbmFtZT0iZWNqLnZlcnNpb24iIHZhbHVlPSI0LjYuMSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJvaGMudmVyc2lvbiIgdmFsdWU9IjAuNS4xIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImFzbS52ZXJzaW9uIiB2YWx1ZT0iOS4xIi8+CisgICAgPCEtLSBXaGVuIHVwZGF0aW5nIEFTTSwgcGxlYXNlLCBkbyBjb25zaWRlciB3aGV0aGVyIHlvdSBtaWdodCBuZWVkIHRvIHVwZGF0ZSBhbHNvIEZCVXRpbGl0aWVzI0FTTV9CWVRFQ09ERV9WRVJTSU9OCisgICAgICBhbmQgdGhlIHNpbXVsYXRvciBJbnRlcmNlcHRDbGFzc2VzI0JZVEVDT0RFX1ZFUlNJT04sIGluIHBhcnRpY3VsYXIgaWYgd2UgYXJlIGxvb2tpbmcgdG8gcHJvdmlkZSBDYXNzYW5kcmEgc3VwcG9ydAorICAgICAgZm9yIG5ld2VyIEpES3MgKENBU1NBTkRSQS0xNzg3MykuIC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhc20udmVyc2lvbiIgdmFsdWU9IjkuNCIvPgogICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxvY2F0aW9uLWluc3RydW1lbnRlci52ZXJzaW9uIiB2YWx1ZT0iMy4xLjAiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnl0ZWJ1ZGR5LnZlcnNpb24iIHZhbHVlPSIxLjEwLjEwIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpmbGV4LnZlcnNpb24iIHZhbHVlPSIxLjguMiIvPgotCi0gICAgPCEtLSBodHRwczovL212bnJlcG9zaXRvcnkuY29tL2FydGlmYWN0L25ldC5vcGVuaGZ0L2Nocm9uaWNsZS1ib20vMS4xNi4yMyAtLT4KLSAgICA8cHJvcGVydHkgbmFtZT0iY2hyb25pY2xlLXF1ZXVlLnZlcnNpb24iIHZhbHVlPSI1LjIwLjEyMyIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iY2hyb25pY2xlLWNvcmUudmVyc2lvbiIgdmFsdWU9IjIuMjAuMTI2IiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjaHJvbmljbGUtYnl0ZXMudmVyc2lvbiIgdmFsdWU9IjIuMjAuMTExIiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjaHJvbmljbGUtd2lyZS52ZXJzaW9uIiB2YWx1ZT0iMi4yMC4xMTciIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNocm9uaWNsZS10aHJlYWRzLnZlcnNpb24iIHZhbHVlPSIyLjIwLjExMSIgLz4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJkdGVzdC1hcGkudmVyc2lvbiIgdmFsdWU9IjAuMC4xNSIgLz4KLQotICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im1hdmVuLWFudC10YXNrcy5qYXIuZXhpc3RzIj4KLSAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtidWlsZC5kaXJ9L21hdmVuLWFudC10YXNrcy0ke21hdmVuLWFudC10YXNrcy52ZXJzaW9ufS5qYXIiIC8+Ci0gICAgPC9jb25kaXRpb24+Ci0KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJtYXZlbi1hbnQtdGFza3MuamFyLmxvY2FsIj4KLSAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHttYXZlbi1hbnQtdGFza3MubG9jYWx9LyR7bWF2ZW4tYW50LXRhc2tzLnZlcnNpb259L21hdmVuLWFudC10YXNrcy0ke21hdmVuLWFudC10YXNrcy52ZXJzaW9ufS5qYXIiIC8+Ci0gICAgPC9jb25kaXRpb24+CiAKICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJpcy5zb3VyY2UuYXJ0aWZhY3QiPgogICAgICAgPGF2YWlsYWJsZSBmaWxlPSIke2J1aWxkLnNyYy5qYXZhfSIgdHlwZT0iZGlyIiAvPgpAQCAtMTg3LDIwICsxNzMsMjMgQEAKICAgICA8L21hY3JvZGVmPgogICAgIDxzZXQta2VlcGJyaWVmLXByb3BlcnR5IHRlc3QtbmFtZT0iJHt0ZXN0Lm5hbWV9IiAvPgogCi0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iamF2YS52ZXJzaW9uLjgiPgotICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7YW50LmphdmEudmVyc2lvbn0iIGFyZzI9IjEuOCIvPgorICAgIDxmYWlsIG1lc3NhZ2U9IlVuc3VwcG9ydGVkIEpESyB2ZXJzaW9uIHVzZWQ6ICR7YW50LmphdmEudmVyc2lvbn0iPgorICAgICAgICA8Y29uZGl0aW9uPjxub3Q+PGNvbnRhaW5zIHN0cmluZz0iJHtqYXZhLnN1cHBvcnRlZH0iIHN1YnN0cmluZz0iJHthbnQuamF2YS52ZXJzaW9ufSIvPjwvbm90PjwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJpcy5qYXZhLmRlZmF1bHQiPjxlcXVhbHMgYXJnMT0iJHthbnQuamF2YS52ZXJzaW9ufSIgYXJnMj0iJHtqYXZhLmRlZmF1bHR9Ii8+PC9jb25kaXRpb24+CisgICAgPGVjaG8gdW5sZXNzOnRydWU9IiR7aXMuamF2YS5kZWZhdWx0fSIgbWVzc2FnZT0iTm9uIGRlZmF1bHQgSkRLIHZlcnNpb24gdXNlZDogJHthbnQuamF2YS52ZXJzaW9ufSIvPgorCisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iYXJjaF94ODYiPgorICAgICAgPGVxdWFscyBhcmcxPSIke29zLmFyY2h9IiBhcmcyPSJ4ODYiIC8+CiAgICAgPC9jb25kaXRpb24+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iamF2YS52ZXJzaW9uLjExIj4KLSAgICAgICAgPG5vdD48aXNzZXQgcHJvcGVydHk9ImphdmEudmVyc2lvbi44Ii8+PC9ub3Q+CisgICAgPCEtLSBPbiBub24tWDg2IEpESyA4IChzdWNoIGFzIE0xIE1hYykgdGhlIHNtYWxsZXN0IGFsbG93ZWQgWHNzIGlzIDM4NGs7IHNvIG5lZWQgYSBsYXJnZXIgdmFsdWUKKyAgICB3aGVuIG9uIHRoZXNlIHBsYXRmb3Jtcy4gLS0+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ianZtX3hzcyIgdmFsdWU9Ii1Yc3MyNTZrIiBlbHNlPSItWHNzMzg0ayI+CisgICAgICA8aXNzZXQgcHJvcGVydHk9ImFyY2hfeDg2IiAvPgogICAgIDwvY29uZGl0aW9uPgotICAgIDxmYWlsPjxjb25kaXRpb24+PG5vdD48b3I+Ci0gICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iamF2YS52ZXJzaW9uLjgiLz4KLSAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJqYXZhLnZlcnNpb24uMTEiLz4KLSAgICA8L29yPjwvbm90PjwvY29uZGl0aW9uPjwvZmFpbD4KIAogICAgIDxyZXNvdXJjZXMgaWQ9Il9qdm0xMV9hcmdfaXRlbXMiPgogICAgICAgICA8c3RyaW5nPi1EamRrLmF0dGFjaC5hbGxvd0F0dGFjaFNlbGY9dHJ1ZTwvc3RyaW5nPgotCiAgICAgICAgIDxzdHJpbmc+LVhYOitVc2VDb25jTWFya1N3ZWVwR0M8L3N0cmluZz4KICAgICAgICAgPHN0cmluZz4tWFg6K0NNU1BhcmFsbGVsUmVtYXJrRW5hYmxlZDwvc3RyaW5nPgogICAgICAgICA8c3RyaW5nPi1YWDpTdXJ2aXZvclJhdGlvPTg8L3N0cmluZz4KQEAgLTIxMSw2ICsyMDAsNyBAQAogICAgICAgICA8c3RyaW5nPi1YWDorQ01TUGFyYWxsZWxJbml0aWFsTWFya0VuYWJsZWQ8L3N0cmluZz4KICAgICAgICAgPHN0cmluZz4tWFg6K0NNU0VkZW5DaHVua3NSZWNvcmRBbHdheXM8L3N0cmluZz4KIAorCiAgICAgICAgIDxzdHJpbmc+LS1hZGQtZXhwb3J0cyBqYXZhLmJhc2UvamRrLmludGVybmFsLm1pc2M9QUxMLVVOTkFNRUQ8L3N0cmluZz4KICAgICAgICAgPHN0cmluZz4tLWFkZC1leHBvcnRzIGphdmEuYmFzZS9qZGsuaW50ZXJuYWwucmVmPUFMTC1VTk5BTUVEPC9zdHJpbmc+CiAgICAgICAgIDxzdHJpbmc+LS1hZGQtZXhwb3J0cyBqYXZhLmJhc2Uvc3VuLm5pby5jaD1BTEwtVU5OQU1FRDwvc3RyaW5nPgpAQCAtMjI5LDEzICsyMTksNTggQEAKICAgICAgICAgPHN0cmluZz4tLWFkZC1vcGVucyBqYXZhLmJhc2UvamRrLmludGVybmFsLm1vZHVsZT1BTEwtVU5OQU1FRDwvc3RyaW5nPgogICAgICAgICA8c3RyaW5nPi0tYWRkLW9wZW5zIGphdmEuYmFzZS9qZGsuaW50ZXJuYWwudXRpbC5qYXI9QUxMLVVOTkFNRUQ8L3N0cmluZz4KICAgICAgICAgPHN0cmluZz4tLWFkZC1vcGVucyBqZGsubWFuYWdlbWVudC9jb20uc3VuLm1hbmFnZW1lbnQuaW50ZXJuYWw9QUxMLVVOTkFNRUQ8L3N0cmluZz4KLQogICAgIDwvcmVzb3VyY2VzPgogICAgIDxwYXRoY29udmVydCBwcm9wZXJ0eT0iX2p2bV9hcmdzX2NvbmNhdCIgcmVmaWQ9Il9qdm0xMV9hcmdfaXRlbXMiIHBhdGhzZXA9IiAiLz4KICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqYXZhMTEtanZtYXJncyIgdmFsdWU9IiR7X2p2bV9hcmdzX2NvbmNhdH0iIGVsc2U9IiI+Ci0gICAgICAgIDxub3Q+Ci0gICAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7YW50LmphdmEudmVyc2lvbn0iIGFyZzI9IjEuOCIvPgotICAgICAgICA8L25vdD4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2FudC5qYXZhLnZlcnNpb259IiBhcmcyPSIxMSIvPgorICAgIDwvY29uZGl0aW9uPgorCisgICAgPHJlc291cmNlcyBpZD0iX2p2bTE3X2FyZ19pdGVtcyI+CisgICAgICAgIDxzdHJpbmc+LURqZGsuYXR0YWNoLmFsbG93QXR0YWNoU2VsZj10cnVlPC9zdHJpbmc+CisgICAgICAgIDxzdHJpbmc+LVhYOitVc2VHMUdDPC9zdHJpbmc+CisgICAgICAgIDxzdHJpbmc+LVhYOitQYXJhbGxlbFJlZlByb2NFbmFibGVkPC9zdHJpbmc+CisgICAgICAgIDxzdHJpbmc+LVhYOk1heFRlbnVyaW5nVGhyZXNob2xkPTE8L3N0cmluZz4KKyAgICAgICAgPHN0cmluZz4tWFg6RzFIZWFwUmVnaW9uU2l6ZT0xNm08L3N0cmluZz4KKworICAgICAgICA8c3RyaW5nPi0tYWRkLWV4cG9ydHMgamF2YS5iYXNlL2pkay5pbnRlcm5hbC5taXNjPUFMTC1VTk5BTUVEPC9zdHJpbmc+CisgICAgICAgIDxzdHJpbmc+LS1hZGQtZXhwb3J0cyBqYXZhLmJhc2UvamRrLmludGVybmFsLnJlZj1BTEwtVU5OQU1FRDwvc3RyaW5nPgorICAgICAgICA8c3RyaW5nPi0tYWRkLWV4cG9ydHMgamF2YS5iYXNlL3N1bi5uaW8uY2g9QUxMLVVOTkFNRUQ8L3N0cmluZz4KKyAgICAgICAgPHN0cmluZz4tLWFkZC1leHBvcnRzIGphdmEubWFuYWdlbWVudC5ybWkvY29tLnN1bi5qbXgucmVtb3RlLmludGVybmFsLnJtaT1BTEwtVU5OQU1FRDwvc3RyaW5nPgorICAgICAgICA8c3RyaW5nPi0tYWRkLWV4cG9ydHMgamF2YS5ybWkvc3VuLnJtaS5yZWdpc3RyeT1BTEwtVU5OQU1FRDwvc3RyaW5nPgorICAgICAgICA8c3RyaW5nPi0tYWRkLWV4cG9ydHMgamF2YS5ybWkvc3VuLnJtaS5zZXJ2ZXI9QUxMLVVOTkFNRUQ8L3N0cmluZz4KKyAgICAgICAgPHN0cmluZz4tLWFkZC1leHBvcnRzIGphdmEucm1pL3N1bi5ybWkudHJhbnNwb3J0LnRjcD1BTEwtVU5OQU1FRDwvc3RyaW5nPgorICAgICAgICA8c3RyaW5nPi0tYWRkLWV4cG9ydHMgamF2YS5zcWwvamF2YS5zcWw9QUxMLVVOTkFNRUQ8L3N0cmluZz4KKyAgICAgICAgPHN0cmluZz4tLWFkZC1leHBvcnRzIGphdmEuYmFzZS9qYXZhLmxhbmcucmVmPUFMTC1VTk5BTUVEPC9zdHJpbmc+CisgICAgICAgIDxzdHJpbmc+LS1hZGQtZXhwb3J0cyBqZGsudW5zdXBwb3J0ZWQvc3VuLm1pc2M9QUxMLVVOTkFNRUQ8L3N0cmluZz4KKyAgICAgICAgPHN0cmluZz4tLWFkZC1leHBvcnRzIGpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLmZpbGU9QUxMLVVOTkFNRUQ8L3N0cmluZz4KKworICAgICAgICA8c3RyaW5nPi0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLmxhbmcubW9kdWxlPUFMTC1VTk5BTUVEPC9zdHJpbmc+CisgICAgICAgIDxzdHJpbmc+LS1hZGQtb3BlbnMgamF2YS5iYXNlL2phdmEubmV0PUFMTC1VTk5BTUVEPC9zdHJpbmc+CisgICAgICAgIDxzdHJpbmc+LS1hZGQtb3BlbnMgamF2YS5iYXNlL2pkay5pbnRlcm5hbC5sb2FkZXI9QUxMLVVOTkFNRUQ8L3N0cmluZz4KKyAgICAgICAgPHN0cmluZz4tLWFkZC1vcGVucyBqYXZhLmJhc2UvamRrLmludGVybmFsLnJlZj1BTEwtVU5OQU1FRDwvc3RyaW5nPgorICAgICAgICA8c3RyaW5nPi0tYWRkLW9wZW5zIGphdmEuYmFzZS9qZGsuaW50ZXJuYWwucmVmbGVjdD1BTEwtVU5OQU1FRDwvc3RyaW5nPgorICAgICAgICA8c3RyaW5nPi0tYWRkLW9wZW5zIGphdmEuYmFzZS9qZGsuaW50ZXJuYWwubWF0aD1BTEwtVU5OQU1FRDwvc3RyaW5nPgorICAgICAgICA8c3RyaW5nPi0tYWRkLW9wZW5zIGphdmEuYmFzZS9qZGsuaW50ZXJuYWwubW9kdWxlPUFMTC1VTk5BTUVEPC9zdHJpbmc+CisgICAgICAgIDxzdHJpbmc+LS1hZGQtb3BlbnMgamF2YS5iYXNlL2pkay5pbnRlcm5hbC51dGlsLmphcj1BTEwtVU5OQU1FRDwvc3RyaW5nPgorICAgICAgICA8c3RyaW5nPi0tYWRkLW9wZW5zIGpkay5tYW5hZ2VtZW50L2NvbS5zdW4ubWFuYWdlbWVudC5pbnRlcm5hbD1BTEwtVU5OQU1FRDwvc3RyaW5nPgorICAgICAgICA8c3RyaW5nPi0tYWRkLW9wZW5zIGpkay5tYW5hZ2VtZW50L2NvbS5zdW4ubWFuYWdlbWVudC5pbnRlcm5hbD1BTEwtVU5OQU1FRDwvc3RyaW5nPgorCisgICAgICAgIDxzdHJpbmc+LS1hZGQtb3BlbnMgamF2YS5iYXNlL3N1bi5uaW8uY2g9QUxMLVVOTkFNRUQ8L3N0cmluZz4KKyAgICAgICAgPHN0cmluZz4tLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS5pbz1BTEwtVU5OQU1FRDwvc3RyaW5nPgorICAgICAgICA8c3RyaW5nPi0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLm5pbz1BTEwtVU5OQU1FRDwvc3RyaW5nPgorICAgICAgICA8c3RyaW5nPi0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLnV0aWwuY29uY3VycmVudD1BTEwtVU5OQU1FRDwvc3RyaW5nPgorICAgICAgICA8c3RyaW5nPi0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLnV0aWw9QUxMLVVOTkFNRUQ8L3N0cmluZz4KKyAgICAgICAgPHN0cmluZz4tLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljPUFMTC1VTk5BTUVEPC9zdHJpbmc+CisgICAgICAgIDxzdHJpbmc+LS1hZGQtb3BlbnMgamF2YS5iYXNlL2phdmEubGFuZz1BTEwtVU5OQU1FRDwvc3RyaW5nPgorICAgICAgICA8c3RyaW5nPi0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLm1hdGg9QUxMLVVOTkFNRUQ8L3N0cmluZz4KKyAgICAgICAgPHN0cmluZz4tLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS5sYW5nLnJlZmxlY3Q9QUxMLVVOTkFNRUQ8L3N0cmluZz4KKyAgICAgICAgPHN0cmluZz4tLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS5uZXQ9QUxMLVVOTkFNRUQ8L3N0cmluZz4KKworICAgICAgICA8c3RyaW5nPi0tYWRkLW9wZW5zIGphdmEucm1pL3N1bi5ybWkudHJhbnNwb3J0LnRjcD1BTEwtVU5OQU1FRDwvc3RyaW5nPgorICAgIDwvcmVzb3VyY2VzPgorICAgIDxwYXRoY29udmVydCBwcm9wZXJ0eT0iX2p2bV9hcmdzX2NvbmNhdDIiIHJlZmlkPSJfanZtMTdfYXJnX2l0ZW1zIiBwYXRoc2VwPSIgIi8+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iamF2YTE3LWp2bWFyZ3MiIHZhbHVlPSIke19qdm1fYXJnc19jb25jYXQyfSIgZWxzZT0iIj4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2FudC5qYXZhLnZlcnNpb259IiBhcmcyPSIxNyIvPgogICAgIDwvY29uZGl0aW9uPgogCiAgICAgPCEtLQpAQCAtMjUwLDYgKzI4NSw3IEBACiAgICAgICBJbiBqYXZhIDExIHdlIGFsc28gbmVlZCB0byBzZXQgYSBzeXN0ZW0gcHJvcGVydHkgdG8gZW5hYmxlIG5ldHR5IHRvIHVzZSBVbnNhZmUgZGlyZWN0IGJ5dGUKICAgICAgIGJ1ZmZlciBjb25zdHJ1Y3Rpb24gKHNlZSBDQVNTQU5EUkEtMTY0OTMpCiAgICAgLS0+CisgICAgPCEtLSBMZWF2aW5nICBfanZtOF90ZXN0X2FyZ19pdGVtcyBmb3Igbm93IGFzIHdlIGFyZSBub3QgZHJvcHBpbmcgSmF2YSA4IHlldCBidXQgaXQgd2lsbCBiZSB1c2VsZXNzIGFmdGVyIENBU1NBTkRSQS0xODI1OC0tPgogICAgIDxyZXNvdXJjZXMgaWQ9Il9qdm04X3Rlc3RfYXJnX2l0ZW1zIj4KICAgICAgIDwhLS0gVE9ETyBzZWUgQ0FTU0FORFJBLTE2MjEyIC0gd2Ugc2VlbSB0byBPT00gbm9uIHN0b3Agbm93IGFmdGVyIENBU1NBTkRSQS0xNjIxMiwgc28gdG8gaGF2ZSBjbGVhbiBDSSB3aGlsZSB0aGlzIGdldHMgbG9va2VkIGludG8sIGRpc2FibGluZyBsaW1pdGluZyBtZXRhc3BhY2UKICAgICAgICAgPHN0cmluZz4tWFg6TWF4TWV0YXNwYWNlRXhwYW5zaW9uPTY0TTwvc3RyaW5nPgpAQCAtMjYzLDM5ICsyOTksMzYgQEAKICAgICAgICAgPHN0cmluZz4tRGlvLm5ldHR5LnRyeVJlZmxlY3Rpb25TZXRBY2Nlc3NpYmxlPXRydWU8L3N0cmluZz4KICAgICA8L3Jlc291cmNlcz4KICAgICA8cGF0aGNvbnZlcnQgcHJvcGVydHk9Il9qdm0xMV90ZXN0X2FyZ19pdGVtc19jb25jYXQiIHJlZmlkPSJfanZtMTFfdGVzdF9hcmdfaXRlbXMiIHBhdGhzZXA9IiAiLz4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJfc3RkLXRlc3QtanZtYXJncyIgdmFsdWU9IiR7X2p2bTExX3Rlc3RfYXJnX2l0ZW1zX2NvbmNhdH0iIGVsc2U9IiR7X2p2bThfdGVzdF9hcmdfaXRlbXNfY29uY2F0fSI+Ci0gICAgICAgIDxub3Q+Ci0gICAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7YW50LmphdmEudmVyc2lvbn0iIGFyZzI9IjEuOCIvPgotICAgICAgICA8L25vdD4KKyAgICA8cmVzb3VyY2VzIGlkPSJfanZtMTdfdGVzdF9hcmdfaXRlbXMiPgorICAgICAgICA8c3RyaW5nPi1EaW8ubmV0dHkudHJ5UmVmbGVjdGlvblNldEFjY2Vzc2libGU9dHJ1ZTwvc3RyaW5nPgorICAgIDwvcmVzb3VyY2VzPgorICAgIDxwYXRoY29udmVydCBwcm9wZXJ0eT0iX2p2bTE3X3Rlc3RfYXJnX2l0ZW1zX2NvbmNhdCIgcmVmaWQ9Il9qdm0xN190ZXN0X2FyZ19pdGVtcyIgcGF0aHNlcD0iICIvPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9Il9zdGQtdGVzdC1qdm1hcmdzMTEiIHZhbHVlPSIke19qdm0xMV90ZXN0X2FyZ19pdGVtc19jb25jYXR9IiBlbHNlPSIgIj4KKyAgICAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHthbnQuamF2YS52ZXJzaW9ufSIgYXJnMj0iMTEiLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJfc3RkLXRlc3QtanZtYXJnczE3IiB2YWx1ZT0iJHtfanZtMTdfdGVzdF9hcmdfaXRlbXNfY29uY2F0fSIgZWxzZT0iICI+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHthbnQuamF2YS52ZXJzaW9ufSIgYXJnMj0iMTciLz4KICAgICA8L2NvbmRpdGlvbj4KIAogICAgIDwhLS0gbmVlZGVkIHRvIGNvbXBpbGUgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSk1YU2VydmVyVXRpbHMgLS0+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iamRrMTEtamF2YWMtZXhwb3J0cyIgdmFsdWU9Ii0tYWRkLWV4cG9ydHMgamF2YS5ybWkvc3VuLnJtaS5yZWdpc3RyeT1BTEwtVU5OQU1FRCAtLWFkZC1leHBvcnRzIGphdmEucm1pL3N1bi5ybWkudHJhbnNwb3J0LnRjcD1BTEwtVU5OQU1FRCIgZWxzZT0iIj4KKyAgICA8IS0tIG5lZWRlZCB0byBjb21waWxlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmltcGwuSW5zdGFuY2UtLT4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqZGsxMXBsdXMtamF2YWMtZXhwb3J0cyIgdmFsdWU9Ii0tYWRkLWV4cG9ydHMgamF2YS5ybWkvc3VuLnJtaS5yZWdpc3RyeT1BTEwtVU5OQU1FRCAtLWFkZC1leHBvcnRzIGphdmEucm1pL3N1bi5ybWkudHJhbnNwb3J0LnRjcD1BTEwtVU5OQU1FRCIgZWxzZT0iIj4KICAgICAgICAgPG5vdD4KICAgICAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHthbnQuamF2YS52ZXJzaW9ufSIgYXJnMj0iMS44Ii8+CiAgICAgICAgIDwvbm90PgogICAgIDwvY29uZGl0aW9uPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImpkazExLWphdmFkb2MtZXhwb3J0cyIgdmFsdWU9IiR7amRrMTEtamF2YWMtZXhwb3J0c30gLS1mcmFtZXMiIGVsc2U9IiI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iamRrMTFwbHVzLWphdmFkb2MtZXhwb3J0cyIgdmFsdWU9IiR7amRrMTFwbHVzLWphdmFjLWV4cG9ydHN9IC0tZnJhbWVzIiBlbHNlPSIiPgogICAgICAgICA8bm90PgogICAgICAgICAgICAgPGVxdWFscyBhcmcxPSIke2FudC5qYXZhLnZlcnNpb259IiBhcmcyPSIxLjgiLz4KICAgICAgICAgPC9ub3Q+CiAgICAgPC9jb25kaXRpb24+Ci0KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJidWlsZC5qYXZhLjExIj4KLSAgICAgICAgPGlzdHJ1ZSB2YWx1ZT0iJHt1c2UuamRrMTF9Ii8+Ci0gICAgPC9jb25kaXRpb24+Ci0KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJzb3VyY2UudmVyc2lvbiIgdmFsdWU9IjgiIGVsc2U9IjExIj4KLSAgICAgICAgPGVxdWFscyBhcmcxPSIke2phdmEudmVyc2lvbi44fSIgYXJnMj0idHJ1ZSIvPgotICAgIDwvY29uZGl0aW9uPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9InRhcmdldC52ZXJzaW9uIiB2YWx1ZT0iOCIgZWxzZT0iMTEiPgotICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7amF2YS52ZXJzaW9uLjh9IiBhcmcyPSJ0cnVlIi8+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iY2hlY2tzdHlsZS52ZXJzaW9uIiB2YWx1ZT0iOC40NS4xIiBlbHNlPSIxMC44LjEiPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7YW50LmphdmEudmVyc2lvbn0iIGFyZzI9IjEuOCIvPgogICAgIDwvY29uZGl0aW9uPgogCiAgICAgPCEtLQogICAgICAgICAgQWRkIGFsbCB0aGUgZGVwZW5kZW5jaWVzLgogICAgIC0tPgotICAgIDxwYXRoIGlkPSJtYXZlbi1hbnQtdGFza3MuY2xhc3NwYXRoIiBwYXRoPSIke2J1aWxkLmRpcn0vbWF2ZW4tYW50LXRhc2tzLSR7bWF2ZW4tYW50LXRhc2tzLnZlcnNpb259LmphciIgLz4KICAgICA8cGF0aCBpZD0iY2Fzc2FuZHJhLmNsYXNzcGF0aCI+CiAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC5jbGFzc2VzLm1haW59IiAvPgogICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZGlyLmxpYn0iPgpAQCAtMzIxLDcgKzM1NCw3IEBACiAgICAgICAgIHdpbmRvd3RpdGxlPSIke2FudC5wcm9qZWN0Lm5hbWV9IEFQSSIgY2xhc3NwYXRocmVmPSJjYXNzYW5kcmEuY2xhc3NwYXRoIgogICAgICAgICBib3R0b209IkNvcHlyaWdodCAmYW1wO2NvcHk7IDIwMDktIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIKICAgICAgICAgdXNlZXh0ZXJuYWxmaWxlPSJ5ZXMiIGVuY29kaW5nPSJVVEYtOCIgZmFpbG9uZXJyb3I9ImZhbHNlIgotICAgICAgICBtYXhtZW1vcnk9IjI1Nm0iIGFkZGl0aW9uYWxwYXJhbT0iJHtqZGsxMS1qYXZhZG9jLWV4cG9ydHN9Ij4KKyAgICAgICAgbWF4bWVtb3J5PSIyNTZtIiBhZGRpdGlvbmFscGFyYW09IiR7amRrMTFwbHVzLWphdmFkb2MtZXhwb3J0c30iPgogICAgICAgICA8ZmlsZXNldHMvPgogICAgICAgPC9qYXZhZG9jPgogICAgICAgPGZhaWwgbWVzc2FnZT0iamF2YWRvYyBmYWlsZWQiPgpAQCAtMzM0LDU3ICszNjcsMTAgQEAKICAgICA8L3NlcXVlbnRpYWw+CiAgIDwvbWFjcm9kZWY+CiAKLSAgICA8dGFyZ2V0IG5hbWU9InZhbGlkYXRlLWJ1aWxkLWNvbmYiPgotICAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ1c2UtamRrMTEiPgotICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iYnVpbGQuamF2YS4xMSIvPgotICAgICAgICAgICAgICAgIDxpc3RydWUgdmFsdWU9IiR7ZW52LkNBU1NBTkRSQV9VU0VfSkRLMTF9Ii8+Ci0gICAgICAgICAgICA8L29yPgotICAgICAgICA8L2NvbmRpdGlvbj4KLSAgICAgICAgPGZhaWwgbWVzc2FnZT0iSW5jb25zaXN0ZW50IEpESzExIG9wdGlvbnMgc2V0Ij4KLSAgICAgICAgICAgIDxjb25kaXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhbmQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aXN0cnVlIHZhbHVlPSIke2Vudi5DQVNTQU5EUkFfVVNFX0pESzExfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJ1c2UuamRrMTEiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxub3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlzdHJ1ZSB2YWx1ZT0iJHt1c2UuamRrMTF9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L25vdD4KLSAgICAgICAgICAgICAgICAgICAgPC9hbmQ+Ci0gICAgICAgICAgICA8L2NvbmRpdGlvbj4KLSAgICAgICAgICAgICAgICA8L2ZhaWw+Ci0gICAgICAgIDxmYWlsIG1lc3NhZ2U9IkluY29uc2lzdGVudCBKREsxMSBvcHRpb25zIHNldCI+Ci0gICAgICAgICAgICA8Y29uZGl0aW9uPgotICAgICAgICAgICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJlbnYuQ0FTU0FORFJBX1VTRV9KREsxMSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPG5vdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aXN0cnVlIHZhbHVlPSIke2Vudi5DQVNTQU5EUkFfVVNFX0pESzExfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9ub3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aXN0cnVlIHZhbHVlPSIke3VzZS5qZGsxMX0iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9hbmQ+Ci0gICAgICAgICAgICA8L2NvbmRpdGlvbj4KLSAgICAgICAgPC9mYWlsPgotICAgICAgICA8ZmFpbCBtZXNzYWdlPSItRHVzZS5qZGsxMT10cnVlIG9yICRDQVNTQU5EUkFfVVNFX0pESzExPXRydWUgY2Fubm90IGJlIHNldCB3aGVuIGJ1aWxkaW5nIGZyb20gamF2YSA4Ij4KLSAgICAgICAgICAgIDxjb25kaXRpb24+Ci0gICAgICAgICAgICAgICAgPG5vdD48b3I+Ci0gICAgICAgICAgICAgICAgICAgIDxub3Q+PGlzc2V0IHByb3BlcnR5PSJqYXZhLnZlcnNpb24uOCIvPjwvbm90PgotICAgICAgICAgICAgICAgICAgICA8bm90Pjxpc3NldCBwcm9wZXJ0eT0idXNlLWpkazExIi8+PC9ub3Q+Ci0gICAgICAgICAgICAgICAgPC9vcj48L25vdD4KLSAgICAgICAgICAgIDwvY29uZGl0aW9uPgotICAgICAgICA8L2ZhaWw+Ci0gICAgICAgIDxmYWlsIG1lc3NhZ2U9Ii1EdXNlLmpkazExPXRydWUgb3IgJENBU1NBTkRSQV9VU0VfSkRLMTE9dHJ1ZSBtdXN0IGJlIHNldCB3aGVuIGJ1aWxkaW5nIGZyb20gamF2YSAxMSI+Ci0gICAgICAgICAgICA8Y29uZGl0aW9uPgotICAgICAgICAgICAgICAgIDxub3Q+PG9yPgotICAgICAgICAgICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9ImphdmEudmVyc2lvbi44Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0idXNlLWpkazExIi8+Ci0gICAgICAgICAgICAgICAgPC9vcj48L25vdD4KLSAgICAgICAgICAgIDwvY29uZGl0aW9uPgotICAgICAgICA8L2ZhaWw+Ci0gICAgPC90YXJnZXQ+Ci0KICAgICA8IS0tCiAgICAgICAgIFNldHVwIHRoZSBvdXRwdXQgZGlyZWN0b3JpZXMuCiAgICAgLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJ2YWxpZGF0ZS1idWlsZC1jb25mIj4KKyAgICA8dGFyZ2V0IG5hbWU9ImluaXQiID4KICAgICAgICAgPGZhaWwgdW5sZXNzPSJpcy5zb3VyY2UuYXJ0aWZhY3QiCiAgICAgICAgICAgICBtZXNzYWdlPSJOb3QgYSBzb3VyY2UgYXJ0aWZhY3QsIHN0b3BwaW5nIGhlcmUuIiAvPgogICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmNsYXNzZXMubWFpbn0iLz4KQEAgLTM5Niw2ICszODIsMTMgQEAKICAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXIubGlifSIvPgogICAgICAgICA8bWtkaXIgZGlyPSIke2phY29jby5leHBvcnQuZGlyfSIvPgogICAgICAgICA8bWtkaXIgZGlyPSIke2phY29jby5wYXJ0aWFscy5kaXJ9Ii8+CisKKyAgICAgICAgPCEtLSBTZXQgdXAgamRrIHNwZWNpZmljIHByb3BlcnRpZXMgLS0+CisgICAgICAgIDxqYXZhYyBpbmNsdWRlcz0iKiovSmRrUHJvcGVydGllcy5qYXZhIiBzcmNkaXI9InRlc3QvYW50dGFza3MiIGRlc3RkaXI9IiR7dGVzdC5jbGFzc2VzfSIgaW5jbHVkZWFudHJ1bnRpbWU9InRydWUiIHNvdXJjZT0iJHtqYXZhLmRlZmF1bHR9IiB0YXJnZXQ9IiR7amF2YS5kZWZhdWx0fSI+CisgICAgICAgICAgPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQ6LW9wdGlvbnMiLz4KKyAgICAgICAgPC9qYXZhYz4KKyAgICAgICAgPHRhc2tkZWYgbmFtZT0iSmRrUHJvcGVydGllcyIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNhc3NhbmRyYS5hbnR0YXNrcy5KZGtQcm9wZXJ0aWVzIiBjbGFzc3BhdGg9IiR7dGVzdC5jbGFzc2VzfSIvPgorICAgICAgICA8SmRrUHJvcGVydGllcy8+CiAgICAgPC90YXJnZXQ+CiAKICAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0iUmVtb3ZlIGFsbCBsb2NhbGx5IGNyZWF0ZWQgYXJ0aWZhY3RzIj4KQEAgLTQ3NCw0MzYgKzQ2NywxMyBAQAogICAgICAgICA8amZsZXggZmlsZT0iJHtidWlsZC5zcmMuamF2YX0vb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9hbmFseXplci9TdGFuZGFyZFRva2VuaXplckltcGwuamZsZXgiIGRlc3RkaXI9IiR7YnVpbGQuc3JjLmdlbi1qYXZhfS8iIC8+CiAgICAgPC90YXJnZXQ+CiAKLSAgICA8IS0tCi0gICAgICAgRmV0Y2ggTWF2ZW4gQW50IFRhc2tzIGFuZCBDYXNzYW5kcmEncyBkZXBlbmRlbmNpZXMKLSAgICAgICBUaGVzZSB0YXJnZXRzIGFyZSBpbnRlbnRpb25hbGx5IGZyZWUgb2YgZGVwZW5kZW5jaWVzIHNvIHRoYXQgdGhleQotICAgICAgIGNhbiBiZSBydW4gc3RhbmQtYWxvbmUgZnJvbSBhIGJpbmFyeSByZWxlYXNlIGFydGlmYWN0LgotICAgIC0tPgotICAgIDx0YXJnZXQgbmFtZT0ibWF2ZW4tYW50LXRhc2tzLWxvY2FscmVwbyIgdW5sZXNzPSJtYXZlbi1hbnQtdGFza3MuamFyLmV4aXN0cyIgaWY9Im1hdmVuLWFudC10YXNrcy5qYXIubG9jYWwiCi0gICAgICAgICAgICBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0iRmV0Y2ggTWF2ZW4gQU5UIFRhc2tzIGZyb20gTWF2ZW4gTG9jYWwgUmVwb3NpdG9yeSI+Ci0gICAgICA8Y29weSBmaWxlPSIke21hdmVuLWFudC10YXNrcy5sb2NhbH0vJHttYXZlbi1hbnQtdGFza3MudmVyc2lvbn0vbWF2ZW4tYW50LXRhc2tzLSR7bWF2ZW4tYW50LXRhc2tzLnZlcnNpb259LmphciIKLSAgICAgICAgICAgdG9maWxlPSIke2J1aWxkLmRpcn0vbWF2ZW4tYW50LXRhc2tzLSR7bWF2ZW4tYW50LXRhc2tzLnZlcnNpb259LmphciIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im1hdmVuLWFudC10YXNrcy5qYXIuZXhpc3RzIiB2YWx1ZT0idHJ1ZSIvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJtYXZlbi1hbnQtdGFza3MtZG93bmxvYWQiIGRlcGVuZHM9ImluaXQsbWF2ZW4tYW50LXRhc2tzLWxvY2FscmVwbyIgdW5sZXNzPSJtYXZlbi1hbnQtdGFza3MuamFyLmV4aXN0cyIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJGZXRjaCBNYXZlbiBBTlQgVGFza3MgZnJvbSBNYXZlbiBDZW50cmFsIFJlcG9zaXRyb3kiPgotICAgICAgPGVjaG8+RG93bmxvYWRpbmcgTWF2ZW4gQU5UIFRhc2tzLi4uPC9lY2hvPgotICAgICAgPGdldCBzcmM9IiR7bWF2ZW4tYW50LXRhc2tzLnVybH0vJHttYXZlbi1hbnQtdGFza3MudmVyc2lvbn0vbWF2ZW4tYW50LXRhc2tzLSR7bWF2ZW4tYW50LXRhc2tzLnZlcnNpb259LmphciIKLSAgICAgICAgICAgZGVzdD0iJHtidWlsZC5kaXJ9L21hdmVuLWFudC10YXNrcy0ke21hdmVuLWFudC10YXNrcy52ZXJzaW9ufS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgLz4KLSAgICAgIDxjb3B5IGZpbGU9IiR7YnVpbGQuZGlyfS9tYXZlbi1hbnQtdGFza3MtJHttYXZlbi1hbnQtdGFza3MudmVyc2lvbn0uamFyIgotICAgICAgICAgICAgdG9maWxlPSIke21hdmVuLWFudC10YXNrcy5sb2NhbH0vJHttYXZlbi1hbnQtdGFza3MudmVyc2lvbn0vbWF2ZW4tYW50LXRhc2tzLSR7bWF2ZW4tYW50LXRhc2tzLnZlcnNpb259LmphciIvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJtYXZlbi1hbnQtdGFza3MtaW5pdCIgZGVwZW5kcz0ibWF2ZW4tYW50LXRhc2tzLWRvd25sb2FkLHJlc29sdmVyLWluaXQiIHVubGVzcz0ibWF2ZW4tYW50LXRhc2tzLmluaXRpYWxpemVkIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkluaXRpYWxpemUgTWF2ZW4gQU5UIFRhc2tzIj4KLSAgICAgIDx0eXBlZGVmIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBjbGFzc3BhdGhyZWY9Im1hdmVuLWFudC10YXNrcy5jbGFzc3BhdGgiIC8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ibWF2ZW4tYW50LXRhc2tzLmluaXRpYWxpemVkIiB2YWx1ZT0idHJ1ZSIvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSB0aGlzIHRhc2sgZGVmaW5lcyB0aGUgZGVwZW5kZW5jaWVzIHRoYXQgd2lsbCBiZSBmZXRjaGVkIGJ5IE1hdmVuIEFOVCBUYXNrcwotICAgICAgICAgdGhlIGRlcGVuZGVuY2llcyBhcmUgcmUtdXNlZCBmb3IgcHVibGlzaGluZyBhcnRpZmFjdHMgdG8gTWF2ZW4gQ2VudHJhbAotICAgICAgICAgaW4gb3JkZXIgdG8ga2VlcCBldmVyeXRoaW5nIGNvbnNpc3RlbnQgLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJtYXZlbi1kZWNsYXJlLWRlcGVuZGVuY2llcyIgZGVwZW5kcz0ibWF2ZW4tYW50LXRhc2tzLWluaXQiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iRGVmaW5lIGRlcGVuZGVuY2llcyBhbmQgZGVwZW5kZW5jeSB2ZXJzaW9ucyI+Ci0gICAgICA8IS0tIFRoZSBwYXJlbnQgcG9tIGRlZmluZXMgdGhlIHZlcnNpb25zIG9mIGFsbCBkZXBlbmRlbmNpZXMgLS0+Ci0gICAgICA8YXJ0aWZhY3Q6cG9tIGlkPSJwYXJlbnQtcG9tIgotICAgICAgICAgICAgICAgICAgICBncm91cElkPSJvcmcuYXBhY2hlLmNhc3NhbmRyYSIKLSAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RJZD0iY2Fzc2FuZHJhLXBhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgcGFja2FnaW5nPSJwb20iCi0gICAgICAgICAgICAgICAgICAgIHZlcnNpb249IiR7dmVyc2lvbn0iCi0gICAgICAgICAgICAgICAgICAgIHVybD0iaHR0cHM6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZyIKLSAgICAgICAgICAgICAgICAgICAgbmFtZT0iQXBhY2hlIENhc3NhbmRyYSIKLSAgICAgICAgICAgICAgICAgICAgaW5jZXB0aW9uWWVhcj0iMjAwOSIKLSAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBBcGFjaGUgQ2Fzc2FuZHJhIFByb2plY3QgZGV2ZWxvcHMgYSBoaWdobHkgc2NhbGFibGUgc2Vjb25kLWdlbmVyYXRpb24gZGlzdHJpYnV0ZWQgZGF0YWJhc2UsIGJyaW5naW5nIHRvZ2V0aGVyIER5bmFtbydzIGZ1bGx5IGRpc3RyaWJ1dGVkIGRlc2lnbiBhbmQgQmlndGFibGUncyBDb2x1bW5GYW1pbHktYmFzZWQgZGF0YSBtb2RlbC4iPgotCi0gICAgICAgIDwhLS0gSW5oZXJpdCBmcm9tIHRoZSBBU0YgdGVtcGxhdGUgcG9tIGZpbGUsIHJlZiBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wb20vYXNmLyAtLT4KLSAgICAgICAgPHBhcmVudCBncm91cElkPSJvcmcuYXBhY2hlIiBhcnRpZmFjdElkPSJhcGFjaGUiIHZlcnNpb249IjIyIi8+Ci0gICAgICAgIDxsaWNlbnNlIG5hbWU9IlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjAiIHVybD0iaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQiLz4KLSAgICAgICAgPHNjbSBjb25uZWN0aW9uPSIke3NjbS5jb25uZWN0aW9ufSIgZGV2ZWxvcGVyQ29ubmVjdGlvbj0iJHtzY20uZGV2ZWxvcGVyQ29ubmVjdGlvbn0iIHVybD0iJHtzY20udXJsfSIvPgotICAgICAgICA8ZGVwZW5kZW5jeU1hbmFnZW1lbnQ+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLnhlcmlhbC5zbmFwcHkiIGFydGlmYWN0SWQ9InNuYXBweS1qYXZhIiB2ZXJzaW9uPSIxLjEuOC40Ii8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmx6NCIgYXJ0aWZhY3RJZD0ibHo0LWphdmEiIHZlcnNpb249IjEuOC4wIi8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLm5pbmciIGFydGlmYWN0SWQ9ImNvbXByZXNzLWx6ZiIgdmVyc2lvbj0iMC44LjQiIHNjb3BlPSJwcm92aWRlZCIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5naXRodWIubHViZW4iIGFydGlmYWN0SWQ9InpzdGQtam5pIiB2ZXJzaW9uPSIxLjUuNS0xIi8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdvb2dsZS5ndWF2YSIgYXJ0aWZhY3RJZD0iZ3VhdmEiIHZlcnNpb249IjI3LjAtanJlIj4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0iY29tLmdvb2dsZS5jb2RlLmZpbmRidWdzIiBhcnRpZmFjdElkPSJqc3IzMDUiIC8+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im9yZy5jb2RlaGF1cy5tb2pvIiBhcnRpZmFjdElkPSJhbmltYWwtc25pZmZlci1hbm5vdGF0aW9ucyIgLz4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0iY29tLmdvb2dsZS5ndWF2YSIgYXJ0aWZhY3RJZD0ibGlzdGVuYWJsZWZ1dHVyZSIgLz4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0iY29tLmdvb2dsZS5ndWF2YSIgYXJ0aWZhY3RJZD0iZmFpbHVyZWFjY2VzcyIgLz4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0ib3JnLmNoZWNrZXJmcmFtZXdvcmsiIGFydGlmYWN0SWQ9ImNoZWNrZXItcXVhbCIgLz4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0iY29tLmdvb2dsZS5lcnJvcnByb25lIiBhcnRpZmFjdElkPSJlcnJvcl9wcm9uZV9hbm5vdGF0aW9ucyIgLz4KLSAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdvb2dsZS5qaW1mcyIgYXJ0aWZhY3RJZD0iamltZnMiIHZlcnNpb249IjEuMSIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5oZHJoaXN0b2dyYW0iIGFydGlmYWN0SWQ9Ikhkckhpc3RvZ3JhbSIgdmVyc2lvbj0iMi4xLjkiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb21tb25zLWNsaSIgYXJ0aWZhY3RJZD0iY29tbW9ucy1jbGkiIHZlcnNpb249IjEuMSIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbW1vbnMtY29kZWMiIGFydGlmYWN0SWQ9ImNvbW1vbnMtY29kZWMiIHZlcnNpb249IjEuOSIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbW1vbnMtaW8iIGFydGlmYWN0SWQ9ImNvbW1vbnMtaW8iIHZlcnNpb249IjIuNiIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5hcGFjaGUuY29tbW9ucyIgYXJ0aWZhY3RJZD0iY29tbW9ucy1sYW5nMyIgdmVyc2lvbj0iMy4xMSIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5hcGFjaGUuY29tbW9ucyIgYXJ0aWZhY3RJZD0iY29tbW9ucy1tYXRoMyIgdmVyc2lvbj0iMy4yIi8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFudGxyIiBhcnRpZmFjdElkPSJhbnRsciIgdmVyc2lvbj0iMy41LjIiIHNjb3BlPSJwcm92aWRlZCI+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im9yZy5hbnRsciIgYXJ0aWZhY3RJZD0ic3RyaW5ndGVtcGxhdGUiLz4KLSAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFudGxyIiBhcnRpZmFjdElkPSJTVDQiIHZlcnNpb249IjQuMC44Ii8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFudGxyIiBhcnRpZmFjdElkPSJhbnRsci1ydW50aW1lIiB2ZXJzaW9uPSIzLjUuMiI+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im9yZy5hbnRsciIgYXJ0aWZhY3RJZD0ic3RyaW5ndGVtcGxhdGUiLz4KLSAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLnNsZjRqIiBhcnRpZmFjdElkPSJzbGY0ai1hcGkiIHZlcnNpb249IjEuNy4yNSIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5zbGY0aiIgYXJ0aWZhY3RJZD0ibG9nNGotb3Zlci1zbGY0aiIgdmVyc2lvbj0iMS43LjI1Ii8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLnNsZjRqIiBhcnRpZmFjdElkPSJqY2wtb3Zlci1zbGY0aiIgdmVyc2lvbj0iMS43LjI1IiAvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNoLnFvcy5sb2diYWNrIiBhcnRpZmFjdElkPSJsb2diYWNrLWNvcmUiIHZlcnNpb249IjEuMi45Ii8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY2gucW9zLmxvZ2JhY2siIGFydGlmYWN0SWQ9ImxvZ2JhY2stY2xhc3NpYyIgdmVyc2lvbj0iMS4yLjkiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZmFzdGVyeG1sLmphY2tzb24uY29yZSIgYXJ0aWZhY3RJZD0iamFja3Nvbi1jb3JlIiB2ZXJzaW9uPSIyLjEzLjIiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZmFzdGVyeG1sLmphY2tzb24uY29yZSIgYXJ0aWZhY3RJZD0iamFja3Nvbi1kYXRhYmluZCIgdmVyc2lvbj0iMi4xMy4yLjIiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZmFzdGVyeG1sLmphY2tzb24uY29yZSIgYXJ0aWZhY3RJZD0iamFja3Nvbi1hbm5vdGF0aW9ucyIgdmVyc2lvbj0iMi4xMy4yIi8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGF0eXBlIiBhcnRpZmFjdElkPSJqYWNrc29uLWRhdGF0eXBlLWpzcjMxMCIgdmVyc2lvbj0iMi4xMy4yIi8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFmb3JtYXQiIGFydGlmYWN0SWQ9ImphY2tzb24tZGF0YWZvcm1hdC15YW1sIiB2ZXJzaW9uPSIyLjEzLjIiICBzY29wZT0idGVzdCI+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im9yZy55YW1sIiBhcnRpZmFjdElkPSJzbmFrZXlhbWwiLz4KLSAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdvb2dsZWNvZGUuanNvbi1zaW1wbGUiIGFydGlmYWN0SWQ9Impzb24tc2ltcGxlIiB2ZXJzaW9uPSIxLjEiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uYm91bmRhcnkiIGFydGlmYWN0SWQ9ImhpZ2gtc2NhbGUtbGliIiB2ZXJzaW9uPSIxLjAuNiIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5naXRodWIuamJlbGxpcyIgYXJ0aWZhY3RJZD0iamFtbSIgdmVyc2lvbj0iJHtqYW1tLnZlcnNpb259Ii8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLnlhbWwiIGFydGlmYWN0SWQ9InNuYWtleWFtbCIgdmVyc2lvbj0iMS4yNiIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Imp1bml0IiBhcnRpZmFjdElkPSJqdW5pdCIgdmVyc2lvbj0iNC4xMiIgc2NvcGU9InRlc3QiPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJvcmcuaGFtY3Jlc3QiIGFydGlmYWN0SWQ9ImhhbWNyZXN0LWNvcmUiLz4KLSAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLm1vY2tpdG8iIGFydGlmYWN0SWQ9Im1vY2tpdG8tY29yZSIgdmVyc2lvbj0iMy4yLjQiIHNjb3BlPSJ0ZXN0Ii8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLnF1aWNrdGhlb3JpZXMiIGFydGlmYWN0SWQ9InF1aWNrdGhlb3JpZXMiIHZlcnNpb249IjAuMjYiIHNjb3BlPSJ0ZXN0Ii8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdvb2dsZS5jb2RlLmphdmEtYWxsb2NhdGlvbi1pbnN0cnVtZW50ZXIiIGFydGlmYWN0SWQ9ImphdmEtYWxsb2NhdGlvbi1pbnN0cnVtZW50ZXIiIHZlcnNpb249IiR7YWxsb2NhdGlvbi1pbnN0cnVtZW50ZXIudmVyc2lvbn0iIHNjb3BlPSJ0ZXN0Ij4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0iY29tLmdvb2dsZS5ndWF2YSIgYXJ0aWZhY3RJZD0iZ3VhdmEiLz4KLSAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFwYWNoZS5jYXNzYW5kcmEiIGFydGlmYWN0SWQ9ImhhcnJ5LWNvcmUiIHZlcnNpb249IjAuMC4xIiBzY29wZT0idGVzdCIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5yZWZsZWN0aW9ucyIgYXJ0aWZhY3RJZD0icmVmbGVjdGlvbnMiIHZlcnNpb249IjAuMTAuMiIgc2NvcGU9InRlc3QiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYXBhY2hlLmNhc3NhbmRyYSIgYXJ0aWZhY3RJZD0iZHRlc3QtYXBpIiB2ZXJzaW9uPSIke2R0ZXN0LWFwaS52ZXJzaW9ufSIgc2NvcGU9InRlc3QiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20ucHVwcHljcmF3bC50b29scyIgYXJ0aWZhY3RJZD0iY2hlY2tzdHlsZSIgdmVyc2lvbj0iOC40MCIgc2NvcGU9InRlc3QiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYXBhY2hlLmhhZG9vcCIgYXJ0aWZhY3RJZD0iaGFkb29wLWNvcmUiIHZlcnNpb249IjEuMC4zIiBzY29wZT0icHJvdmlkZWQiPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJvcmcubW9ydGJheS5qZXR0eSIgYXJ0aWZhY3RJZD0ic2VydmxldC1hcGkiLz4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0iY29tbW9ucy1sb2dnaW5nIiBhcnRpZmFjdElkPSJjb21tb25zLWxvZ2dpbmciLz4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0iY29tbW9ucy1sYW5nIiBhcnRpZmFjdElkPSJjb21tb25zLWxhbmciLz4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0ib3JnLmVjbGlwc2UuamR0IiBhcnRpZmFjdElkPSJjb3JlIi8+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9ImFudCIgYXJ0aWZhY3RJZD0iYW50Ii8+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Imp1bml0IiBhcnRpZmFjdElkPSJqdW5pdCIvPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJvcmcuY29kZWhhdXMuamFja3NvbiIgYXJ0aWZhY3RJZD0iamFja3Nvbi1tYXBwZXItYXNsIi8+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im9yZy5zbGY0aiIgYXJ0aWZhY3RJZD0ic2xmNGotYXBpIi8+Ci0gICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5hcGFjaGUuaGFkb29wIiBhcnRpZmFjdElkPSJoYWRvb3AtbWluaWNsdXN0ZXIiIHZlcnNpb249IjEuMC4zIiBzY29wZT0icHJvdmlkZWQiPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJhc20iIGFydGlmYWN0SWQ9ImFzbSIvPiA8IS0tIHRoaXMgaXMgdGhlIG91dGRhdGVkIHZlcnNpb24gMy4xIC0tPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJvcmcuY29kZWhhdXMuamFja3NvbiIgYXJ0aWZhY3RJZD0iamFja3Nvbi1tYXBwZXItYXNsIi8+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im9yZy5zbGY0aiIgYXJ0aWZhY3RJZD0ic2xmNGotYXBpIi8+Ci0gICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im5ldC5qYXZhLmRldi5qbmEiIGFydGlmYWN0SWQ9ImpuYSIgdmVyc2lvbj0iNS45LjAiLz4KLQotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5qYWNvY28iIGFydGlmYWN0SWQ9Im9yZy5qYWNvY28uYWdlbnQiIHZlcnNpb249IiR7amFjb2NvLnZlcnNpb259IiBzY29wZT0idGVzdCIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5qYWNvY28iIGFydGlmYWN0SWQ9Im9yZy5qYWNvY28uYW50IiB2ZXJzaW9uPSIke2phY29jby52ZXJzaW9ufSIgc2NvcGU9InRlc3QiPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJvcmcub3cyLmFzbSIgYXJ0aWZhY3RJZD0iYXNtIi8+Ci0gICAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmpib3NzLmJ5dGVtYW4iIGFydGlmYWN0SWQ9ImJ5dGVtYW4taW5zdGFsbCIgdmVyc2lvbj0iJHtieXRlbWFuLnZlcnNpb259IiBzY29wZT0icHJvdmlkZWQiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuamJvc3MuYnl0ZW1hbiIgYXJ0aWZhY3RJZD0iYnl0ZW1hbiIgdmVyc2lvbj0iJHtieXRlbWFuLnZlcnNpb259IiBzY29wZT0icHJvdmlkZWQiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuamJvc3MuYnl0ZW1hbiIgYXJ0aWZhY3RJZD0iYnl0ZW1hbi1zdWJtaXQiIHZlcnNpb249IiR7Ynl0ZW1hbi52ZXJzaW9ufSIgc2NvcGU9InByb3ZpZGVkIi8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmpib3NzLmJ5dGVtYW4iIGFydGlmYWN0SWQ9ImJ5dGVtYW4tYm11bml0IiB2ZXJzaW9uPSIke2J5dGVtYW4udmVyc2lvbn0iIHNjb3BlPSJwcm92aWRlZCIvPgotCi0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ibmV0LmJ5dGVidWRkeSIgYXJ0aWZhY3RJZD0iYnl0ZS1idWRkeSIgdmVyc2lvbj0iJHtieXRlYnVkZHkudmVyc2lvbn0iIC8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ibmV0LmJ5dGVidWRkeSIgYXJ0aWZhY3RJZD0iYnl0ZS1idWRkeS1hZ2VudCIgdmVyc2lvbj0iJHtieXRlYnVkZHkudmVyc2lvbn0iIC8+Ci0KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcub3Blbmpkay5qbWgiIGFydGlmYWN0SWQ9ImptaC1jb3JlIiB2ZXJzaW9uPSIxLjIxIiBzY29wZT0idGVzdCIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5vcGVuamRrLmptaCIgYXJ0aWZhY3RJZD0iam1oLWdlbmVyYXRvci1hbm5wcm9jZXNzIiB2ZXJzaW9uPSIxLjIxIiBzY29wZT0idGVzdCIvPgotCi0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFwYWNoZS5hbnQiIGFydGlmYWN0SWQ9ImFudC1qdW5pdCIgdmVyc2lvbj0iMS4xMC4xMiIgc2NvcGU9InRlc3QiLz4KLQotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5hcGFjaGUuY2Fzc2FuZHJhIiBhcnRpZmFjdElkPSJjYXNzYW5kcmEtYWxsIiB2ZXJzaW9uPSIke3ZlcnNpb259IiAvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImlvLmRyb3B3aXphcmQubWV0cmljcyIgYXJ0aWZhY3RJZD0ibWV0cmljcy1jb3JlIiB2ZXJzaW9uPSIzLjEuNSIgLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJpby5kcm9wd2l6YXJkLm1ldHJpY3MiIGFydGlmYWN0SWQ9Im1ldHJpY3MtanZtIiB2ZXJzaW9uPSIzLjEuNSIgLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJpby5kcm9wd2l6YXJkLm1ldHJpY3MiIGFydGlmYWN0SWQ9Im1ldHJpY3MtbG9nYmFjayIgdmVyc2lvbj0iMy4xLjUiIC8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmFkZHRoaXMubWV0cmljcyIgYXJ0aWZhY3RJZD0icmVwb3J0ZXItY29uZmlnMyIgdmVyc2lvbj0iMy4wLjMiPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJvcmcuaGliZXJuYXRlIiBhcnRpZmFjdElkPSJoaWJlcm5hdGUtdmFsaWRhdG9yIiAvPgotICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLm1pbmRyb3QiIGFydGlmYWN0SWQ9ImpiY3J5cHQiIHZlcnNpb249IjAuNCIgLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJpby5haXJsaWZ0IiBhcnRpZmFjdElkPSJhaXJsaW5lIiB2ZXJzaW9uPSIwLjgiPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJjb20uZ29vZ2xlLmNvZGUuZmluZGJ1Z3MiIGFydGlmYWN0SWQ9ImpzcjMwNSIgLz4KLSAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImlvLm5ldHR5IiBhcnRpZmFjdElkPSJuZXR0eS1ib20iIHZlcnNpb249IjQuMS41OC5GaW5hbCIgdHlwZT0icG9tIiBzY29wZT0icHJvdmlkZWQiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJpby5uZXR0eSIgYXJ0aWZhY3RJZD0ibmV0dHktYWxsIiB2ZXJzaW9uPSI0LjEuNTguRmluYWwiIC8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iaW8ubmV0dHkiIGFydGlmYWN0SWQ9Im5ldHR5LXRjbmF0aXZlLWJvcmluZ3NzbC1zdGF0aWMiIHZlcnNpb249IjIuMC4zNi5GaW5hbCIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im5ldC5vcGVuaGZ0IiBhcnRpZmFjdElkPSJjaHJvbmljbGUtcXVldWUiIHZlcnNpb249IiR7Y2hyb25pY2xlLXF1ZXVlLnZlcnNpb259Ij4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0iY29tLnN1biIgYXJ0aWZhY3RJZD0idG9vbHMiIC8+Ci0gICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im5ldC5vcGVuaGZ0IiBhcnRpZmFjdElkPSJjaHJvbmljbGUtY29yZSIgdmVyc2lvbj0iJHtjaHJvbmljbGUtY29yZS52ZXJzaW9ufSI+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im5ldC5vcGVuaGZ0IiBhcnRpZmFjdElkPSJjaHJvbmljbGUtYW5hbHl0aWNzIiAvPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJvcmcuamV0YnJhaW5zIiBhcnRpZmFjdElkPSJhbm5vdGF0aW9ucyIgLz4KLSAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ibmV0Lm9wZW5oZnQiIGFydGlmYWN0SWQ9ImNocm9uaWNsZS1ieXRlcyIgdmVyc2lvbj0iJHtjaHJvbmljbGUtYnl0ZXMudmVyc2lvbn0iPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJvcmcuamV0YnJhaW5zIiBhcnRpZmFjdElkPSJhbm5vdGF0aW9ucyIgLz4KLSAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ibmV0Lm9wZW5oZnQiIGFydGlmYWN0SWQ9ImNocm9uaWNsZS13aXJlIiB2ZXJzaW9uPSIke2Nocm9uaWNsZS13aXJlLnZlcnNpb259Ij4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0ibmV0Lm9wZW5oZnQiIGFydGlmYWN0SWQ9ImNvbXBpbGVyIiAvPgotICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJuZXQub3BlbmhmdCIgYXJ0aWZhY3RJZD0iY2hyb25pY2xlLXRocmVhZHMiIHZlcnNpb249IiR7Y2hyb25pY2xlLXRocmVhZHMudmVyc2lvbn0iPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJuZXQub3BlbmhmdCIgYXJ0aWZhY3RJZD0iYWZmaW5pdHkiIC8+Ci0gICAgICAgICAgICA8IS0tIEV4Y2x1ZGUgSk5BIGhlcmUsIGFzIHdlIHdhbnQgdG8gYXZvaWQgYnJlYWtpbmcgY29uc3VtZXJzIG9mIHRoZSBjYXNzYW5kcmEtYWxsIGphciAtLT4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0ibmV0LmphdmEuZGV2LmpuYSIgYXJ0aWZhY3RJZD0iam5hIiAvPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJuZXQuamF2YS5kZXYuam5hIiBhcnRpZmFjdElkPSJqbmEtcGxhdGZvcm0iIC8+Ci0gICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5nb29nbGUuY29kZS5maW5kYnVncyIgYXJ0aWZhY3RJZD0ianNyMzA1IiB2ZXJzaW9uPSIyLjAuMiIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5jbGVhcnNwcmluZy5hbmFseXRpY3MiIGFydGlmYWN0SWQ9InN0cmVhbSIgdmVyc2lvbj0iMi41LjIiPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJpdC51bmltaS5kc2kiIGFydGlmYWN0SWQ9ImZhc3R1dGlsIiAvPgotICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZGF0YXN0YXguY2Fzc2FuZHJhIiBhcnRpZmFjdElkPSJjYXNzYW5kcmEtZHJpdmVyLWNvcmUiIHZlcnNpb249IjMuMTEuMCIgY2xhc3NpZmllcj0ic2hhZGVkIj4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0iaW8ubmV0dHkiIGFydGlmYWN0SWQ9Im5ldHR5LWJ1ZmZlciIvPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJpby5uZXR0eSIgYXJ0aWZhY3RJZD0ibmV0dHktY29kZWMiLz4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0iaW8ubmV0dHkiIGFydGlmYWN0SWQ9Im5ldHR5LWhhbmRsZXIiLz4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0iaW8ubmV0dHkiIGFydGlmYWN0SWQ9Im5ldHR5LXRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJvcmcuc2xmNGoiIGFydGlmYWN0SWQ9InNsZjRqLWFwaSIvPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJjb20uZ2l0aHViLmpuciIgYXJ0aWZhY3RJZD0iam5yLWZmaSIvPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJjb20uZ2l0aHViLmpuciIgYXJ0aWZhY3RJZD0iam5yLXBvc2l4Ii8+Ci0gICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyIiBhcnRpZmFjdElkPSJlY2oiIHZlcnNpb249IiR7ZWNqLnZlcnNpb259IiAvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5jYWZmaW5pdGFzLm9oYyIgYXJ0aWZhY3RJZD0ib2hjLWNvcmUiIHZlcnNpb249IiR7b2hjLnZlcnNpb259Ij4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0ib3JnLnNsZjRqIiBhcnRpZmFjdElkPSJzbGY0ai1hcGkiLz4KLSAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmNhZmZpbml0YXMub2hjIiBhcnRpZmFjdElkPSJvaGMtY29yZS1qOCIgdmVyc2lvbj0iJHtvaGMudmVyc2lvbn0iIC8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ibmV0Lmp1LW4uY29tcGlsZS1jb21tYW5kLWFubm90YXRpb25zIiBhcnRpZmFjdElkPSJjb21waWxlLWNvbW1hbmQtYW5ub3RhdGlvbnMiIHZlcnNpb249IjEuMi4wIiBzY29wZT0icHJvdmlkZWQiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuZnVzZXNvdXJjZSIgYXJ0aWZhY3RJZD0ic2lnYXIiIHZlcnNpb249IjEuNi40Ij4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0ibG9nNGoiIGFydGlmYWN0SWQ9ImxvZzRqIi8+Ci0gICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5jYXJyb3RzZWFyY2giIGFydGlmYWN0SWQ9ImhwcGMiIHZlcnNpb249IjAuOC4xIiAvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImRlLmpmbGV4IiBhcnRpZmFjdElkPSJqZmxleCIgdmVyc2lvbj0iJHtqZmxleC52ZXJzaW9ufSI+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im9yZy5hcGFjaGUuYW50IiBhcnRpZmFjdElkPSJhbnQiLz4KLSAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdpdGh1Yi5yaG9sZGVyIiBhcnRpZmFjdElkPSJzbm93YmFsbC1zdGVtbWVyIiB2ZXJzaW9uPSIxLjMuMC41ODEuMSIgLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ29vZ2xlY29kZS5jb25jdXJyZW50LXRyZWVzIiBhcnRpZmFjdElkPSJjb25jdXJyZW50LXRyZWVzIiB2ZXJzaW9uPSIyLjQuMCIgLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ2l0aHViLmJlbi1tYW5lcy5jYWZmZWluZSIgYXJ0aWZhY3RJZD0iY2FmZmVpbmUiIHZlcnNpb249IjIuOS4yIiAvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5qY3Rvb2xzIiBhcnRpZmFjdElkPSJqY3Rvb2xzLWNvcmUiIHZlcnNpb249IjMuMS4wIi8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLm93Mi5hc20iIGFydGlmYWN0SWQ9ImFzbSIgdmVyc2lvbj0iJHthc20udmVyc2lvbn0iLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcub3cyLmFzbSIgYXJ0aWZhY3RJZD0iYXNtLXRyZWUiIHZlcnNpb249IiR7YXNtLnZlcnNpb259IiBzY29wZT0idGVzdCIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5vdzIuYXNtIiBhcnRpZmFjdElkPSJhc20tY29tbW9ucyIgdmVyc2lvbj0iJHthc20udmVyc2lvbn0iIHNjb3BlPSJ0ZXN0Ii8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLm93Mi5hc20iIGFydGlmYWN0SWQ9ImFzbS11dGlsIiB2ZXJzaW9uPSIke2FzbS52ZXJzaW9ufSIgc2NvcGU9InRlc3QiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuZ3JpZGtpdC5qdm10b29sIiBhcnRpZmFjdElkPSJzamstY2xpIiB2ZXJzaW9uPSIwLjE0Ii8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmdyaWRraXQuanZtdG9vbCIgYXJ0aWZhY3RJZD0ic2prLWNvcmUiIHZlcnNpb249IjAuMTQiPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJvcmcuZ3JpZGtpdC5qdm10b29sIiBhcnRpZmFjdElkPSJzamstaGZsYW1lIi8+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im9yZy5wZXJma2l0LnNqay5wYXJzZXJzIiBhcnRpZmFjdElkPSJzamstaGZsYW1lIi8+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im9yZy5wZXJma2l0LnNqay5wYXJzZXJzIiBhcnRpZmFjdElkPSJzamstamZyLXN0YW5kYWxvbmUiLz4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0ib3JnLnBlcmZraXQuc2prLnBhcnNlcnMiIGFydGlmYWN0SWQ9InNqay1ucHMiLz4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0ib3JnLnBlcmZraXQuc2prLnBhcnNlcnMiIGFydGlmYWN0SWQ9InNqay1qZnI1Ii8+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im9yZy5wZXJma2l0LnNqay5wYXJzZXJzIiBhcnRpZmFjdElkPSJzamstamZyNiIvPgotICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuZ3JpZGtpdC5qdm10b29sIiBhcnRpZmFjdElkPSJzamstc3RhY2t0cmFjZSIgdmVyc2lvbj0iMC4xNCIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5ncmlka2l0Lmp2bXRvb2wiIGFydGlmYWN0SWQ9Im14ZHVtcCIgdmVyc2lvbj0iMC4xNCIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5ncmlka2l0LmxhYiIgYXJ0aWZhY3RJZD0ianZtLWF0dGFjaC1hcGkiIHZlcnNpb249IjEuNSIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5ncmlka2l0Lmp2bXRvb2wiIGFydGlmYWN0SWQ9InNqay1qc29uIiB2ZXJzaW9uPSIwLjE0Ii8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmJldXN0IiBhcnRpZmFjdElkPSJqY29tbWFuZGVyIiB2ZXJzaW9uPSIxLjMwIi8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLnBzamF2YSIgYXJ0aWZhY3RJZD0icHNqYXZhIiB2ZXJzaW9uPSIwLjEuMTkiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJqYXZheC5pbmplY3QiIGFydGlmYWN0SWQ9ImphdmF4LmluamVjdCIgdmVyc2lvbj0iMSIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5nb29nbGUuajJvYmpjIiBhcnRpZmFjdElkPSJqMm9iamMtYW5ub3RhdGlvbnMiIHZlcnNpb249IjEuMyIvPgotICAgICAgICAgIDwhLS0gYWRkaW5nIHRoaXMgZGVwZW5kZW5jeSBpcyBuZWNlc3NhcnkgZm9yIGFzc2VydGouIFdoZW4gdXBkYXRpbmcgYXNzZXJ0aiwgbmVlZCB0byBhbHNvIHVwZGF0ZSB0aGUgdmVyc2lvbiBvZgotICAgICAgICAgICAgIHRoaXMgdGhhdCB0aGUgbmV3IGFzc2VydGoncyBgYXNzZXJ0ai1wYXJlbnQtcG9tYCBkZXBlbmRzIG9uLiAtLT4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuanVuaXQiIGFydGlmYWN0SWQ9Imp1bml0LWJvbSIgdmVyc2lvbj0iNS42LjAiIHR5cGU9InBvbSIgc2NvcGU9InRlc3QiLz4KLSAgICAgICAgICA8IS0tIHdoZW4gdXBkYXRpbmcgYXNzZXJ0aiwgbWFrZSBzdXJlIHRvIGFsc28gdXBkYXRlIHRoZSBjb3JyZXNwb25kaW5nIGp1bml0LWJvbSBkZXBlbmRlbmN5IC0tPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5hc3NlcnRqIiBhcnRpZmFjdElkPSJhc3NlcnRqLWNvcmUiIHZlcnNpb249IjMuMTUuMCIgc2NvcGU9InByb3ZpZGVkIi8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmF3YWl0aWxpdHkiIGFydGlmYWN0SWQ9ImF3YWl0aWxpdHkiIHZlcnNpb249IjQuMC4zIiAgc2NvcGU9InRlc3QiPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJvcmcuaGFtY3Jlc3QiIGFydGlmYWN0SWQ9ImhhbWNyZXN0Ii8+Ci0gICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5oYW1jcmVzdCIgYXJ0aWZhY3RJZD0iaGFtY3Jlc3QiIHZlcnNpb249IjIuMiIgc2NvcGU9InRlc3QiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ2l0aHViLnNlYW5jZm9sZXkiIGFydGlmYWN0SWQ9ImlwYWRkcmVzcyIgdmVyc2lvbj0iNS4zLjMiIC8+Ci0gICAgICAgIDwvZGVwZW5kZW5jeU1hbmFnZW1lbnQ+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9ImFkZWxhcGVuYSIgbmFtZT0iQW5kcmVzIGRlIGxhIFBlw7FhIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9ImFsYWtzaG1hbiIgbmFtZT0iQXZpbmFzaCBMYWtzaG1hbiIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJhbGVrc2V5IiBuYW1lPSJBbGVrc2V5IFllc2NoZW5rbyIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJhbW9ydG9uIiBuYW1lPSJBYXJvbiBNb3J0b24iLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0iYXdlaXNiZXJnIiBuYW1lPSJBcmllbCBXZWlzYmVyZyIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJiZGVnZ2xlc3RvbiIgbmFtZT0iQmxha2UgRWdnbGVzdG9uIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9ImJlbmVkaWN0IiBuYW1lPSJCZW5lZGljdCBFbGxpb3R0IFNtaXRoIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9ImJlbmphbWluIiBuYW1lPSJCZW5qYW1pbiBMZXJlciIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJibGFtYm92IiBuYW1lPSJCcmFuaW1pciBMYW1ib3YiLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0iYnJhbmRvbndpbGxpYW1zIiBuYW1lPSJCcmFuZG9uIFdpbGxpYW1zIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9ImNhcmwiIG5hbWU9IkNhcmwgWWVrc2lnaWFuIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9ImRicm9zaXVzIiBuYW1lPSJEYXZpZCBCcm9zaXVzZCIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJkaWthbmciIG5hbWU9IkRpa2FuZyBHdSIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJlZXZhbnMiIG5hbWU9IkVyaWMgRXZhbnMiLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0iZWRpbWl0cm92YSIgbmFtZT0iRWthdGVyaW5hIERpbWl0cm92YSIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJnZHVzYmFiZWsiIG5hbWU9IkdhcnkgRHVzYmFiZWsiLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0iZ29mZmluZXQiIG5hbWU9IkNocmlzIEdvZmZpbmV0Ii8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9ImlmZXNkamVlbiIgbmFtZT0iQWxleCBQZXRyb3YiLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0iamFha2tvIiBuYW1lPSJMYWluZSBKYWFra28gT2xhdmkiLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0iamFrZSIgbmFtZT0iVCBKYWtlIEx1Y2lhbmkiLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0iamFzb25icm93biIgbmFtZT0iSmFzb24gQnJvd24iLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0iamJlbGxpcyIgbmFtZT0iSm9uYXRoYW4gRWxsaXMiLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0iamZhcnJlbGwiIG5hbWU9Ikpha2UgRmFycmVsbCIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJqamlyc2EiIG5hbWU9IkplZmYgSmlyc2EiLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0iamtuaSIgbmFtZT0iSm9lbCBLbmlnaHRvbiIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJqbWNrZW56aWUiIG5hbWU9Ikpvc2ggTWNLZW56aWUiLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0iam9oYW4iIG5hbWU9IkpvaGFuIE9za2Fyc3NvbiIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJqdW5yYW8iIG5hbWU9Ikp1biBSYW8iLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0ianpodWFuZyIgbmFtZT0iSmF5IFpodWFuZyIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJrb2hsaXNhbmthbHAiIG5hbWU9IlNhbmthbHAgS29obGkiLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0ibWFyY3VzZSIgbmFtZT0iTWFyY3VzIEVyaWtzc29uIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9Im1jayIgbmFtZT0iTWljaGFlbCBTZW1iIFdldmVyIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9Im1pc2hhaWwiIG5hbWU9Ik1pa2hhaWwgU3RlcHVyYSIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJtc2h1bGVyIiBuYW1lPSJNaWNoYWVsIFNodWxlciIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJwYXVsbyIgbmFtZT0iUGF1bG8gTW90dGEiLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0icG1hbGlrIiBuYW1lPSJQcmFzaGFudCBNYWxpayIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJyc3R1cHAiIG5hbWU9IlJvYmVydCBTdHVwcCIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJzY29kZSIgbmFtZT0iUGV0ZXIgU2NodWxsZXIiLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0iYmVvYmFsIiBuYW1lPSJTYW0gVHVubmljbGlmZmUiLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0ic2xlYnJlc25lIiBuYW1lPSJTeWx2YWluIExlYnJlc25lIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9InN0ZWZhbmlhIiBuYW1lPSJTdGVmYW5pYSBBbGJvcmdoZXR0aSIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJ0eWxlcmhvYmJzIiBuYW1lPSJUeWxlciBIb2JicyIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJ2aWpheSIgbmFtZT0iVmlqYXkgUGFydGhhc2FyYXRoeSIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJ4ZWRpbiIgbmFtZT0iUGF2ZWwgWWFza2V2aWNoIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9Inl1a2ltIiBuYW1lPSJZdWtpIE1vcmlzaGl0YSIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJ6em5hdGUiIG5hbWU9Ik5hdGUgTWNDYWxsIi8+Ci0gICAgICA8L2FydGlmYWN0OnBvbT4KLQotICAgICAgPCEtLSBlYWNoIGRlcGVuZGVuY3kgc2V0IHRoZW4gZGVmaW5lcyB0aGUgc3Vic2V0IG9mIHRoZSBkZXBlbmRlbmNpZXMgZm9yIHRoYXQgZGVwZW5kZW5jeSBzZXQgLS0+Ci0gICAgICA8YXJ0aWZhY3Q6cG9tIGlkPSJidWlsZC1kZXBzLXBvbSIKLSAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RJZD0iY2Fzc2FuZHJhLWJ1aWxkLWRlcHMiPgotICAgICAgICA8cGFyZW50IGdyb3VwSWQ9Im9yZy5hcGFjaGUuY2Fzc2FuZHJhIgotICAgICAgICAgICAgICAgIGFydGlmYWN0SWQ9ImNhc3NhbmRyYS1wYXJlbnQiCi0gICAgICAgICAgICAgICAgdmVyc2lvbj0iJHt2ZXJzaW9ufSIKLSAgICAgICAgICAgICAgICByZWxhdGl2ZVBhdGg9IiR7ZmluYWwubmFtZX0tcGFyZW50LnBvbSIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJqdW5pdCIgYXJ0aWZhY3RJZD0ianVuaXQiIHNjb3BlPSJ0ZXN0Ii8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbW1vbnMtaW8iIGFydGlmYWN0SWQ9ImNvbW1vbnMtaW8iIHNjb3BlPSJ0ZXN0Ii8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5tb2NraXRvIiBhcnRpZmFjdElkPSJtb2NraXRvLWNvcmUiIHNjb3BlPSJ0ZXN0Ii8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5vdzIuYXNtIiBhcnRpZmFjdElkPSJhc20iIHZlcnNpb249IiR7YXNtLnZlcnNpb259Ii8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5vdzIuYXNtIiBhcnRpZmFjdElkPSJhc20tdHJlZSIgdmVyc2lvbj0iJHthc20udmVyc2lvbn0iIHNjb3BlPSJ0ZXN0Ii8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5vdzIuYXNtIiBhcnRpZmFjdElkPSJhc20tY29tbW9ucyIgdmVyc2lvbj0iJHthc20udmVyc2lvbn0iIHNjb3BlPSJ0ZXN0Ii8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5vdzIuYXNtIiBhcnRpZmFjdElkPSJhc20tdXRpbCIgdmVyc2lvbj0iJHthc20udmVyc2lvbn0iIHNjb3BlPSJ0ZXN0Ii8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5nb29nbGUuamltZnMiIGFydGlmYWN0SWQ9ImppbWZzIiB2ZXJzaW9uPSIxLjEiIHNjb3BlPSJ0ZXN0Ii8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5wdXBweWNyYXdsLnRvb2xzIiBhcnRpZmFjdElkPSJjaGVja3N0eWxlIiBzY29wZT0idGVzdCIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcucXVpY2t0aGVvcmllcyIgYXJ0aWZhY3RJZD0icXVpY2t0aGVvcmllcyIgc2NvcGU9InRlc3QiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLnJlZmxlY3Rpb25zIiBhcnRpZmFjdElkPSJyZWZsZWN0aW9ucyIgc2NvcGU9InRlc3QiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdvb2dsZS5jb2RlLmphdmEtYWxsb2NhdGlvbi1pbnN0cnVtZW50ZXIiIGFydGlmYWN0SWQ9ImphdmEtYWxsb2NhdGlvbi1pbnN0cnVtZW50ZXIiIHZlcnNpb249IiR7YWxsb2NhdGlvbi1pbnN0cnVtZW50ZXIudmVyc2lvbn0iIHNjb3BlPSJ0ZXN0Ii8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5hcGFjaGUuY2Fzc2FuZHJhIiBhcnRpZmFjdElkPSJkdGVzdC1hcGkiIHNjb3BlPSJ0ZXN0Ii8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5vcGVuamRrLmptaCIgYXJ0aWZhY3RJZD0iam1oLWNvcmUiIHNjb3BlPSJ0ZXN0Ii8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5vcGVuamRrLmptaCIgYXJ0aWZhY3RJZD0iam1oLWdlbmVyYXRvci1hbm5wcm9jZXNzIiBzY29wZT0idGVzdCIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJuZXQuanUtbi5jb21waWxlLWNvbW1hbmQtYW5ub3RhdGlvbnMiIGFydGlmYWN0SWQ9ImNvbXBpbGUtY29tbWFuZC1hbm5vdGF0aW9ucyIgc2NvcGU9InRlc3QiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFwYWNoZS5hbnQiIGFydGlmYWN0SWQ9ImFudC1qdW5pdCIgc2NvcGU9InRlc3QiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFwYWNoZS5jYXNzYW5kcmEiIGFydGlmYWN0SWQ9ImhhcnJ5LWNvcmUiLz4KLSAgICAgICAgPCEtLSBhZGRpbmcgdGhpcyBkZXBlbmRlbmN5IGlzIG5lY2Vzc2FyeSBmb3IgYXNzZXJ0ai4gV2hlbiB1cGRhdGluZyBhc3NlcnRqLCBuZWVkIHRvIGFsc28gdXBkYXRlIHRoZSB2ZXJzaW9uIG9mCi0gICAgICAgICAgICAgdGhpcyB0aGF0IHRoZSBuZXcgYXNzZXJ0aidzIGBhc3NlcnRqLXBhcmVudC1wb21gIGRlcGVuZHMgb24uIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuanVuaXQiIGFydGlmYWN0SWQ9Imp1bml0LWJvbSIgdHlwZT0icG9tIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5hd2FpdGlsaXR5IiBhcnRpZmFjdElkPSJhd2FpdGlsaXR5Ii8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5oYW1jcmVzdCIgYXJ0aWZhY3RJZD0iaGFtY3Jlc3QiLz4KLSAgICAgICAgPCEtLSBjb3ZlcmFnZSBkZWJzIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuamFjb2NvIiBhcnRpZmFjdElkPSJvcmcuamFjb2NvLmFnZW50Ii8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5qYWNvY28iIGFydGlmYWN0SWQ9Im9yZy5qYWNvY28uYW50Ii8+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFmb3JtYXQiIGFydGlmYWN0SWQ9ImphY2tzb24tZGF0YWZvcm1hdC15YW1sIi8+Ci0gICAgICA8L2FydGlmYWN0OnBvbT4KLQotICAgICAgPCEtLSBub3cgdGhlIHBvbSdzIGZvciBhcnRpZmFjdHMgYmVpbmcgZGVwbG95ZWQgdG8gTWF2ZW4gQ2VudHJhbCAtLT4KLSAgICAgIDxhcnRpZmFjdDpwb20gaWQ9ImFsbC1wb20iCi0gICAgICAgICAgICAgICAgICAgIGFydGlmYWN0SWQ9ImNhc3NhbmRyYS1hbGwiCi0gICAgICAgICAgICAgICAgICAgIHVybD0iaHR0cHM6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZyIKLSAgICAgICAgICAgICAgICAgICAgbmFtZT0iQXBhY2hlIENhc3NhbmRyYSI+Ci0gICAgICAgIDxwYXJlbnQgZ3JvdXBJZD0ib3JnLmFwYWNoZS5jYXNzYW5kcmEiCi0gICAgICAgICAgICAgICAgYXJ0aWZhY3RJZD0iY2Fzc2FuZHJhLXBhcmVudCIKLSAgICAgICAgICAgICAgICB2ZXJzaW9uPSIke3ZlcnNpb259IgotICAgICAgICAgICAgICAgIHJlbGF0aXZlUGF0aD0iJHtmaW5hbC5uYW1lfS1wYXJlbnQucG9tIi8+Ci0gICAgICAgIDxzY20gY29ubmVjdGlvbj0iJHtzY20uY29ubmVjdGlvbn0iIGRldmVsb3BlckNvbm5lY3Rpb249IiR7c2NtLmRldmVsb3BlckNvbm5lY3Rpb259IiB1cmw9IiR7c2NtLnVybH0iLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLnhlcmlhbC5zbmFwcHkiIGFydGlmYWN0SWQ9InNuYXBweS1qYXZhIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5sejQiIGFydGlmYWN0SWQ9Imx6NC1qYXZhIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5uaW5nIiBhcnRpZmFjdElkPSJjb21wcmVzcy1semYiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdvb2dsZS5ndWF2YSIgYXJ0aWZhY3RJZD0iZ3VhdmEiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tbW9ucy1jbGkiIGFydGlmYWN0SWQ9ImNvbW1vbnMtY2xpIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbW1vbnMtY29kZWMiIGFydGlmYWN0SWQ9ImNvbW1vbnMtY29kZWMiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFwYWNoZS5jb21tb25zIiBhcnRpZmFjdElkPSJjb21tb25zLWxhbmczIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5hcGFjaGUuY29tbW9ucyIgYXJ0aWZhY3RJZD0iY29tbW9ucy1tYXRoMyIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYW50bHIiIGFydGlmYWN0SWQ9ImFudGxyIiBzY29wZT0icHJvdmlkZWQiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFudGxyIiBhcnRpZmFjdElkPSJTVDQiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFudGxyIiBhcnRpZmFjdElkPSJhbnRsci1ydW50aW1lIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5zbGY0aiIgYXJ0aWZhY3RJZD0ic2xmNGotYXBpIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5zbGY0aiIgYXJ0aWZhY3RJZD0ibG9nNGotb3Zlci1zbGY0aiIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuc2xmNGoiIGFydGlmYWN0SWQ9ImpjbC1vdmVyLXNsZjRqIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlIiBhcnRpZmFjdElkPSJqYWNrc29uLWNvcmUiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmUiIGFydGlmYWN0SWQ9ImphY2tzb24tZGF0YWJpbmQiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmUiIGFydGlmYWN0SWQ9ImphY2tzb24tYW5ub3RhdGlvbnMiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGF0eXBlIiBhcnRpZmFjdElkPSJqYWNrc29uLWRhdGF0eXBlLWpzcjMxMCIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ29vZ2xlY29kZS5qc29uLXNpbXBsZSIgYXJ0aWZhY3RJZD0ianNvbi1zaW1wbGUiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmJvdW5kYXJ5IiBhcnRpZmFjdElkPSJoaWdoLXNjYWxlLWxpYiIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcueWFtbCIgYXJ0aWZhY3RJZD0ic25ha2V5YW1sIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5taW5kcm90IiBhcnRpZmFjdElkPSJqYmNyeXB0Ii8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImlvLmFpcmxpZnQiIGFydGlmYWN0SWQ9ImFpcmxpbmUiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iaW8uZHJvcHdpemFyZC5tZXRyaWNzIiBhcnRpZmFjdElkPSJtZXRyaWNzLWNvcmUiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iaW8uZHJvcHdpemFyZC5tZXRyaWNzIiBhcnRpZmFjdElkPSJtZXRyaWNzLWp2bSIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJpby5kcm9wd2l6YXJkLm1ldHJpY3MiIGFydGlmYWN0SWQ9Im1ldHJpY3MtbG9nYmFjayIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uYWRkdGhpcy5tZXRyaWNzIiBhcnRpZmFjdElkPSJyZXBvcnRlci1jb25maWczIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5jbGVhcnNwcmluZy5hbmFseXRpY3MiIGFydGlmYWN0SWQ9InN0cmVhbSIvPgotCi0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNoLnFvcy5sb2diYWNrIiBhcnRpZmFjdElkPSJsb2diYWNrLWNvcmUiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY2gucW9zLmxvZ2JhY2siIGFydGlmYWN0SWQ9ImxvZ2JhY2stY2xhc3NpYyIvPgotCi0gICAgICAgIDwhLS0gZG9uJ3QgbmVlZCBoYWRvb3AgY2xhc3NlcyB0byBydW4sIGJ1dCBpZiB5b3UgdXNlIHRoZSBoYWRvb3Agc3R1ZmYgLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5hcGFjaGUuaGFkb29wIiBhcnRpZmFjdElkPSJoYWRvb3AtY29yZSIgb3B0aW9uYWw9InRydWUiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFwYWNoZS5oYWRvb3AiIGFydGlmYWN0SWQ9ImhhZG9vcC1taW5pY2x1c3RlciIgb3B0aW9uYWw9InRydWUiLz4KLQotICAgICAgICA8IS0tIGRvbid0IG5lZWQgdGhlIEphdmEgRHJpdmVyIHRvIHJ1biwgYnV0IGlmIHlvdSB1c2UgdGhlIGhhZG9vcCBzdHVmZiBvciBVREZzIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZGF0YXN0YXguY2Fzc2FuZHJhIiBhcnRpZmFjdElkPSJjYXNzYW5kcmEtZHJpdmVyLWNvcmUiIGNsYXNzaWZpZXI9InNoYWRlZCIgb3B0aW9uYWw9InRydWUiLz4KLSAgICAgICAgICA8IS0tIGRvbid0IG5lZWQgam5hIHRvIHJ1biwgYnV0IG5pY2UgdG8gaGF2ZSAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ibmV0LmphdmEuZGV2LmpuYSIgYXJ0aWZhY3RJZD0iam5hIi8+Ci0KLSAgICAgICAgPCEtLSBkb24ndCBuZWVkIGphbW0gdW5sZXNzIHJ1bm5pbmcgYSBzZXJ2ZXIgaW4gd2hpY2ggY2FzZSBpdCBuZWVkcyB0byBiZSBhIC1qYXZhZ2VudCB0byBiZSB1c2VkIGFueXdheSAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdpdGh1Yi5qYmVsbGlzIiBhcnRpZmFjdElkPSJqYW1tIi8+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iaW8ubmV0dHkiIGFydGlmYWN0SWQ9Im5ldHR5LWJvbSIgIHR5cGU9InBvbSIgIC8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImlvLm5ldHR5IiBhcnRpZmFjdElkPSJuZXR0eS1hbGwiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ibmV0Lm9wZW5oZnQiIGFydGlmYWN0SWQ9ImNocm9uaWNsZS1xdWV1ZSIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJuZXQub3BlbmhmdCIgYXJ0aWZhY3RJZD0iY2hyb25pY2xlLWNvcmUiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ibmV0Lm9wZW5oZnQiIGFydGlmYWN0SWQ9ImNocm9uaWNsZS1ieXRlcyIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJuZXQub3BlbmhmdCIgYXJ0aWZhY3RJZD0iY2hyb25pY2xlLXdpcmUiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ibmV0Lm9wZW5oZnQiIGFydGlmYWN0SWQ9ImNocm9uaWNsZS10aHJlYWRzIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5mdXNlc291cmNlIiBhcnRpZmFjdElkPSJzaWdhciIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlciIgYXJ0aWZhY3RJZD0iZWNqIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5jYWZmaW5pdGFzLm9oYyIgYXJ0aWZhY3RJZD0ib2hjLWNvcmUiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmNhZmZpbml0YXMub2hjIiBhcnRpZmFjdElkPSJvaGMtY29yZS1qOCIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ2l0aHViLmJlbi1tYW5lcy5jYWZmZWluZSIgYXJ0aWZhY3RJZD0iY2FmZmVpbmUiIC8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5qY3Rvb2xzIiBhcnRpZmFjdElkPSJqY3Rvb2xzLWNvcmUiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLm93Mi5hc20iIGFydGlmYWN0SWQ9ImFzbSIgLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmNhcnJvdHNlYXJjaCIgYXJ0aWZhY3RJZD0iaHBwYyIgLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmdyaWRraXQuanZtdG9vbCIgYXJ0aWZhY3RJZD0ic2prLWNsaSIgLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmdyaWRraXQuanZtdG9vbCIgYXJ0aWZhY3RJZD0ic2prLWNvcmUiIC8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5ncmlka2l0Lmp2bXRvb2wiIGFydGlmYWN0SWQ9InNqay1zdGFja3RyYWNlIiAvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuZ3JpZGtpdC5qdm10b29sIiBhcnRpZmFjdElkPSJteGR1bXAiIC8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5ncmlka2l0LmxhYiIgYXJ0aWZhY3RJZD0ianZtLWF0dGFjaC1hcGkiIC8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5iZXVzdCIgYXJ0aWZhY3RJZD0iamNvbW1hbmRlciIgLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmdyaWRraXQuanZtdG9vbCIgYXJ0aWZhY3RJZD0ic2prLWpzb24iLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdpdGh1Yi5sdWJlbiIgYXJ0aWZhY3RJZD0ienN0ZC1qbmkiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLnBzamF2YSIgYXJ0aWZhY3RJZD0icHNqYXZhIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImlvLm5ldHR5IiBhcnRpZmFjdElkPSJuZXR0eS10Y25hdGl2ZS1ib3Jpbmdzc2wtc3RhdGljIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImphdmF4LmluamVjdCIgYXJ0aWZhY3RJZD0iamF2YXguaW5qZWN0Ii8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5nb29nbGUuajJvYmpjIiBhcnRpZmFjdElkPSJqMm9iamMtYW5ub3RhdGlvbnMiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmhkcmhpc3RvZ3JhbSIgYXJ0aWZhY3RJZD0iSGRySGlzdG9ncmFtIi8+Ci0KLSAgICAgICAgPCEtLSBzYXNpIGRlcHMgLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImRlLmpmbGV4IiBhcnRpZmFjdElkPSJqZmxleCIgLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdpdGh1Yi5yaG9sZGVyIiBhcnRpZmFjdElkPSJzbm93YmFsbC1zdGVtbWVyIiAvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ29vZ2xlY29kZS5jb25jdXJyZW50LXRyZWVzIiBhcnRpZmFjdElkPSJjb25jdXJyZW50LXRyZWVzIiAvPgotCi0gICAgICAgIDwhLS0gY29tcGlsZSB0b29scyAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdvb2dsZS5jb2RlLmZpbmRidWdzIiBhcnRpZmFjdElkPSJqc3IzMDUiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ibmV0Lmp1LW4uY29tcGlsZS1jb21tYW5kLWFubm90YXRpb25zIiBhcnRpZmFjdElkPSJjb21waWxlLWNvbW1hbmQtYW5ub3RhdGlvbnMiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFzc2VydGoiIGFydGlmYWN0SWQ9ImFzc2VydGotY29yZSIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuamJvc3MuYnl0ZW1hbiIgYXJ0aWZhY3RJZD0iYnl0ZW1hbi1pbnN0YWxsIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5qYm9zcy5ieXRlbWFuIiBhcnRpZmFjdElkPSJieXRlbWFuIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5qYm9zcy5ieXRlbWFuIiBhcnRpZmFjdElkPSJieXRlbWFuLXN1Ym1pdCIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuamJvc3MuYnl0ZW1hbiIgYXJ0aWZhY3RJZD0iYnl0ZW1hbi1ibXVuaXQiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdpdGh1Yi5zZWFuY2ZvbGV5IiBhcnRpZmFjdElkPSJpcGFkZHJlc3MiIC8+Ci0gICAgICA8L2FydGlmYWN0OnBvbT4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gZGVwcmVjYXRlZDogbGVnYWN5IGNvbXBhdGliaWxpdHkgZm9yIGJ1aWxkIHNjcmlwdHMgaW4gb3RoZXIgcmVwb3NpdG9yaWVzIC0tPgotICAgIDx0YXJnZXQgbmFtZT0ibWF2ZW4tYW50LXRhc2tzLXJldHJpZXZlLWJ1aWxkIiBkZXBlbmRzPSJyZXNvbHZlci1yZXRyaWV2ZS1idWlsZCIvPgotCi0gICAgPHRhcmdldCBuYW1lPSJlY2hvLWJhc2UtdmVyc2lvbiI+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9IiR7YmFzZS52ZXJzaW9ufSIgLz4KLSAgICA8L3RhcmdldD4KLQogICAgIDwhLS0gY3JlYXRlIHByb3BlcnRpZXMgZmlsZSB3aXRoIEMgdmVyc2lvbiAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImNyZWF0ZVZlcnNpb25Qcm9wRmlsZSI+CisgICAgPHRhcmdldCBuYW1lPSJjcmVhdGVWZXJzaW9uUHJvcEZpbGUiIGRlcGVuZHM9ImdldC1naXQtc2hhIj4KICAgICAgIDx0YXNrZGVmIG5hbWU9InByb3BlcnR5ZmlsZSIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5Qcm9wZXJ0eUZpbGUiLz4KICAgICAgIDxta2RpciBkaXI9IiR7dmVyc2lvbi5wcm9wZXJ0aWVzLmRpcn0iLz4KICAgICAgIDxwcm9wZXJ0eWZpbGUgZmlsZT0iJHt2ZXJzaW9uLnByb3BlcnRpZXMuZGlyfS92ZXJzaW9uLnByb3BlcnRpZXMiPgogICAgICAgICA8ZW50cnkga2V5PSJDYXNzYW5kcmFWZXJzaW9uIiB2YWx1ZT0iJHt2ZXJzaW9ufSIvPgorICAgICAgICA8ZW50cnkga2V5PSJHaXRTSEEiIHZhbHVlPSIke2dpdC5zaGF9Ii8+CiAgICAgICA8L3Byb3BlcnR5ZmlsZT4KICAgICA8L3RhcmdldD4KIApAQCAtOTE5LDYgKzQ4OSw3IEBACiAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1qYXZhYWdlbnQ6JHtidWlsZC5saWJ9L2phbW0tJHtqYW1tLnZlcnNpb259LmphciIgLz4KICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+CiAgICAgICAgIDxqdm1hcmcgbGluZT0iJHtqYXZhMTEtanZtYXJnc30iLz4KKyAgICAgICAgPGp2bWFyZyBsaW5lPSIke2phdmExNy1qdm1hcmdzfSIvPgogICAgICAgPC9qYXZhPgogICAgIDwvdGFyZ2V0PgogCkBAIC05MzEsMjIgKzUwMiwyMiBAQAogCiAgICAgPHRhcmdldCBuYW1lPSJfYnVpbGRfamF2YSI+CiAgICAgICAgIDwhLS0gTm90ZTogd2UgY2Fubm90IHVzZSBqYXZhYydzICdyZWxlYXNlJyBvcHRpb24sIGFzIHRoYXQgZG9lcyBub3QgYWxsb3cgYWNjZXNzaW5nIHN1bi5taXNjLlVuc2FmZSBub3IKLSAgICAgICAgTmFzaG9ybidzIENsYXNzRmlsdGVyIGNsYXNzIGFzIGFueSBqYXZhYyBtb2R1bGVzIG9wdGlvbiBpcyBpbnZhbGlkIGZvciByZWxhc2UgOC4gLS0+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9IkNvbXBpbGluZyBmb3IgSmF2YSAke3RhcmdldC52ZXJzaW9ufS4uLiIvPgorICAgICAgICBOYXNob3JuJ3MgQ2xhc3NGaWx0ZXIgY2xhc3MgYXMgYW55IGphdmFjIG1vZHVsZXMgb3B0aW9uIGlzIGludmFsaWQgZm9yIHJlbGVhc2UgOC4gLS0+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9IkNvbXBpbGluZyBmb3IgSmF2YSAke2FudC5qYXZhLnZlcnNpb259Li4uIi8+CiAgICAgICAgIDxqYXZhYwogICAgICAgICAgICAgICAgZGVidWc9InRydWUiIGRlYnVnbGV2ZWw9IiR7ZGVidWdsZXZlbH0iIGVuY29kaW5nPSJ1dGYtOCIKLSAgICAgICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlcy5tYWlufSIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzb3VyY2U9IiR7c291cmNlLnZlcnNpb259IiB0YXJnZXQ9IiR7dGFyZ2V0LnZlcnNpb259Ij4KKyAgICAgICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlcy5tYWlufSIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzb3VyY2U9IiR7YW50LmphdmEudmVyc2lvbn0iIHRhcmdldD0iJHthbnQuamF2YS52ZXJzaW9ufSI+CiAgICAgICAgICAgICA8c3JjIHBhdGg9IiR7YnVpbGQuc3JjLmphdmF9Ii8+CiAgICAgICAgICAgICA8c3JjIHBhdGg9IiR7YnVpbGQuc3JjLmdlbi1qYXZhfSIvPgogICAgICAgICAgICAgPGNvbXBpbGVyYXJnIHZhbHVlPSItWERpZ25vcmUuc3ltYm9sLmZpbGUiLz4KLSAgICAgICAgICAgIDxjb21waWxlcmFyZyBsaW5lPSIke2pkazExLWphdmFjLWV4cG9ydHN9Ii8+CisgICAgICAgICAgICA8Y29tcGlsZXJhcmcgbGluZT0iJHtqZGsxMXBsdXMtamF2YWMtZXhwb3J0c30iLz4KICAgICAgICAgICAgIDxjbGFzc3BhdGg+CiAgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImNhc3NhbmRyYS5jbGFzc3BhdGgiLz4KICAgICAgICAgICAgIDwvY2xhc3NwYXRoPgogICAgICAgICA8L2phdmFjPgogICAgIDwvdGFyZ2V0PgogCi0gICAgPHRhcmdldCBkZXBlbmRzPSJpbml0LGdlbi1jcWwzLWdyYW1tYXIsZ2VuZXJhdGUtY3FsLWh0bWwsZ2VuZXJhdGUtamZsZXgtamF2YSxyYXQtY2hlY2siCisgICAgPHRhcmdldCBkZXBlbmRzPSJpbml0LGdlbi1jcWwzLWdyYW1tYXIsZ2VuZXJhdGUtY3FsLWh0bWwsZ2VuZXJhdGUtamZsZXgtamF2YSxyYXQtY2hlY2ssZ2V0LWdpdC1zaGEiCiAgICAgICAgICAgICBuYW1lPSJidWlsZC1wcm9qZWN0Ij4KICAgICAgICAgPGVjaG8gbWVzc2FnZT0iJHthbnQucHJvamVjdC5uYW1lfTogJHthbnQuZmlsZX0iLz4KICAgICAgICAgPCEtLSBPcmRlciBtYXR0ZXJzISAtLT4KQEAgLTk2Nyw3ICs1MzgsNyBAQAogCiAgICAgPHRhcmdldCBuYW1lPSJzdHJlc3MtYnVpbGQtdGVzdCIgZGVwZW5kcz0ic3RyZXNzLWJ1aWxkIiBkZXNjcmlwdGlvbj0iQ29tcGlsZSBzdHJlc3MgdGVzdHMiPgogICAgICAgICA8amF2YWMgZGVidWc9InRydWUiIGRlYnVnbGV2ZWw9IiR7ZGVidWdsZXZlbH0iIGRlc3RkaXI9IiR7c3RyZXNzLnRlc3QuY2xhc3Nlc30iCi0gICAgICAgICAgICAgICBzb3VyY2U9IiR7c291cmNlLnZlcnNpb259IiB0YXJnZXQ9IiR7dGFyZ2V0LnZlcnNpb259IgorICAgICAgICAgICAgICAgc291cmNlPSIke2FudC5qYXZhLnZlcnNpb259IiB0YXJnZXQ9IiR7YW50LmphdmEudmVyc2lvbn0iCiAgICAgICAgICAgICAgICBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIGVuY29kaW5nPSJ1dGYtOCI+CiAgICAgICAgICAgICA8Y2xhc3NwYXRoPgogICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJjYXNzYW5kcmEuY2xhc3NwYXRoLnRlc3QiLz4KQEAgLTk4NCw3ICs1NTUsNyBAQAogICAgIDx0YXJnZXQgbmFtZT0iX3N0cmVzc19idWlsZCI+CiAgICAgCTxta2RpciBkaXI9IiR7c3RyZXNzLmJ1aWxkLmNsYXNzZXN9IiAvPgogICAgICAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgZGVidWc9InRydWUiIGRlYnVnbGV2ZWw9IiR7ZGVidWdsZXZlbH0iCi0gICAgICAgICAgICAgICBzb3VyY2U9IiR7c291cmNlLnZlcnNpb259IiB0YXJnZXQ9IiR7dGFyZ2V0LnZlcnNpb259IgorICAgICAgICAgICAgICAgc291cmNlPSIke2FudC5qYXZhLnZlcnNpb259IiB0YXJnZXQ9IiR7YW50LmphdmEudmVyc2lvbn0iCiAgICAgICAgICAgICAgICBlbmNvZGluZz0idXRmLTgiIGRlc3RkaXI9IiR7c3RyZXNzLmJ1aWxkLmNsYXNzZXN9IiBpbmNsdWRlYW50cnVudGltZT0idHJ1ZSI+CiAgICAgICAgICAgICA8c3JjIHBhdGg9IiR7c3RyZXNzLmJ1aWxkLnNyY30iIC8+CiAgICAgICAgICAgICA8Y2xhc3NwYXRoPgpAQCAtMTAyNSw3ICs1OTYsNyBAQAogCiAgICAgPHRhcmdldCBuYW1lPSJmcWx0b29sLWJ1aWxkLXRlc3QiIGRlcGVuZHM9ImZxbHRvb2wtYnVpbGQiIGRlc2NyaXB0aW9uPSJDb21waWxlIGZxbHRvb2wgdGVzdHMiPgogICAgICAgICA8amF2YWMgZGVidWc9InRydWUiIGRlYnVnbGV2ZWw9IiR7ZGVidWdsZXZlbH0iIGRlc3RkaXI9IiR7ZnFsdG9vbC50ZXN0LmNsYXNzZXN9IgotICAgICAgICAgICAgICAgc291cmNlPSIke3NvdXJjZS52ZXJzaW9ufSIgdGFyZ2V0PSIke3RhcmdldC52ZXJzaW9ufSIKKyAgICAgICAgICAgICAgIHNvdXJjZT0iJHthbnQuamF2YS52ZXJzaW9ufSIgdGFyZ2V0PSIke2FudC5qYXZhLnZlcnNpb259IgogICAgICAgICAgICAgICAgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBlbmNvZGluZz0idXRmLTgiPgogICAgICAgICAgICAgPGNsYXNzcGF0aD4KICAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iY2Fzc2FuZHJhLmNsYXNzcGF0aC50ZXN0Ii8+CkBAIC0xMDQyLDcgKzYxMyw3IEBACiAgICAgPHRhcmdldCBuYW1lPSJfZnFsdG9vbF9idWlsZCI+CiAgICAgCTxta2RpciBkaXI9IiR7ZnFsdG9vbC5idWlsZC5jbGFzc2VzfSIgLz4KICAgICAgICAgPGphdmFjIGNvbXBpbGVyPSJtb2Rlcm4iIGRlYnVnPSJ0cnVlIiBkZWJ1Z2xldmVsPSIke2RlYnVnbGV2ZWx9IgotICAgICAgICAgICAgICAgc291cmNlPSIke3NvdXJjZS52ZXJzaW9ufSIgdGFyZ2V0PSIke3RhcmdldC52ZXJzaW9ufSIKKyAgICAgICAgICAgICAgIHNvdXJjZT0iJHthbnQuamF2YS52ZXJzaW9ufSIgdGFyZ2V0PSIke2FudC5qYXZhLnZlcnNpb259IgogICAgICAgICAgICAgICAgZW5jb2Rpbmc9InV0Zi04IiBkZXN0ZGlyPSIke2ZxbHRvb2wuYnVpbGQuY2xhc3Nlc30iIGluY2x1ZGVhbnRydW50aW1lPSJ0cnVlIj4KICAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtmcWx0b29sLmJ1aWxkLnNyY30iIC8+CiAgICAgICAgICAgICA8Y2xhc3NwYXRoPgpAQCAtMTA1MSw3ICs2MjIsNyBAQAogICAgICAgICA8L2phdmFjPgogICAgIDwvdGFyZ2V0PgogCi0gICAgPHRhcmdldCBuYW1lPSJmcWx0b29sLXRlc3QiIGRlcGVuZHM9ImZxbHRvb2wtYnVpbGQtdGVzdCwgbWF5YmUtYnVpbGQtdGVzdCIgZGVzY3JpcHRpb249IlJ1bnMgZnFsdG9vbCB0ZXN0cyI+CisgICAgPHRhcmdldCBuYW1lPSJmcWx0b29sLXRlc3QiIGRlcGVuZHM9ImZxbHRvb2wtYnVpbGQtdGVzdCwgYnVpbGQtdGVzdCIgZGVzY3JpcHRpb249IlJ1bnMgZnFsdG9vbCB0ZXN0cyI+CiAgICAgICAgIDx0ZXN0bWFjcm8gaW5wdXRkaXI9IiR7ZnFsdG9vbC50ZXN0LnNyY30iCiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9IiR7dGVzdC50aW1lb3V0fSI+CiAgICAgICAgIDwvdGVzdG1hY3JvPgpAQCAtMTA3OSw3ICs2NTAsNyBAQAogICAgIDx0YXJnZXQgbmFtZT0iX3NpbXVsYXRvci1hc21fYnVpbGQiPgogICAgIAk8bWtkaXIgZGlyPSIke3NpbXVsYXRvci1hc20uYnVpbGQuY2xhc3Nlc30iIC8+CiAgICAgICAgIDxqYXZhYyBjb21waWxlcj0ibW9kZXJuIiBkZWJ1Zz0idHJ1ZSIgZGVidWdsZXZlbD0iJHtkZWJ1Z2xldmVsfSIKLSAgICAgICAgICAgICAgIHNvdXJjZT0iJHtzb3VyY2UudmVyc2lvbn0iIHRhcmdldD0iJHt0YXJnZXQudmVyc2lvbn0iCisgICAgICAgICAgICAgICBzb3VyY2U9IiR7YW50LmphdmEudmVyc2lvbn0iIHRhcmdldD0iJHthbnQuamF2YS52ZXJzaW9ufSIKICAgICAgICAgICAgICAgIGVuY29kaW5nPSJ1dGYtOCIgZGVzdGRpcj0iJHtzaW11bGF0b3ItYXNtLmJ1aWxkLmNsYXNzZXN9IiBpbmNsdWRlYW50cnVudGltZT0idHJ1ZSI+CiAgICAgICAgICAgICA8c3JjIHBhdGg9IiR7c2ltdWxhdG9yLWFzbS5idWlsZC5zcmN9IiAvPgogICAgICAgICAgICAgPGNsYXNzcGF0aD4KQEAgLTEwOTYsNyArNjY3LDcgQEAKICAgICA8dGFyZ2V0IG5hbWU9Il9zaW11bGF0b3ItYm9vdHN0cmFwX2J1aWxkIj4KICAgICAJPG1rZGlyIGRpcj0iJHtzaW11bGF0b3ItYm9vdHN0cmFwLmJ1aWxkLmNsYXNzZXN9IiAvPgogICAgICAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgZGVidWc9InRydWUiIGRlYnVnbGV2ZWw9IiR7ZGVidWdsZXZlbH0iCi0gICAgICAgICAgICAgICBzb3VyY2U9IiR7c291cmNlLnZlcnNpb259IiB0YXJnZXQ9IiR7dGFyZ2V0LnZlcnNpb259IgorICAgICAgICAgICAgICAgc291cmNlPSIke2FudC5qYXZhLnZlcnNpb259IiB0YXJnZXQ9IiR7YW50LmphdmEudmVyc2lvbn0iCiAgICAgICAgICAgICAgICBlbmNvZGluZz0idXRmLTgiIGRlc3RkaXI9IiR7c2ltdWxhdG9yLWJvb3RzdHJhcC5idWlsZC5jbGFzc2VzfSIgaW5jbHVkZWFudHJ1bnRpbWU9InRydWUiPgogICAgICAgICAgICAgPHNyYyBwYXRoPSIke3NpbXVsYXRvci1ib290c3RyYXAuYnVpbGQuc3JjfSIgLz4KICAgICAgICAgICAgIDxjbGFzc3BhdGg+CkBAIC0xMTExLDE1ICs2ODIsMjggQEAKICAgICAgICAgPC9qYXZhYz4KICAgICA8L3RhcmdldD4KIAotCTx0YXJnZXQgbmFtZT0iX3dyaXRlLXBvbXMiIGRlcGVuZHM9Im1hdmVuLWRlY2xhcmUtZGVwZW5kZW5jaWVzIj4KLQkgICAgPGFydGlmYWN0OndyaXRlcG9tIHBvbVJlZklkPSJwYXJlbnQtcG9tIiBmaWxlPSIke2J1aWxkLmRpcn0vJHtmaW5hbC5uYW1lfS1wYXJlbnQucG9tIi8+Ci0JICAgIDxhcnRpZmFjdDp3cml0ZXBvbSBwb21SZWZJZD0iYWxsLXBvbSIgZmlsZT0iJHtidWlsZC5kaXJ9LyR7ZmluYWwubmFtZX0ucG9tIi8+Ci0JICAgIDxhcnRpZmFjdDp3cml0ZXBvbSBwb21SZWZJZD0iYnVpbGQtZGVwcy1wb20iIGZpbGU9IiR7YnVpbGQuZGlyfS90bXAtJHtmaW5hbC5uYW1lfS1kZXBzLnBvbSIvPgotCTwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0id3JpdGUtcG9tcyIgdW5sZXNzPSJ3aXRob3V0Lm1hdmVuIj4KKyAgICAgICAgPGZpbHRlcnNldCBpZD0icG9tLXRlbXBsYXRlIj4KKyAgICAgICAgICAgIDxmaWx0ZXIgdG9rZW49InZlcnNpb24iIHZhbHVlPSIke3ZlcnNpb259Ii8+CisgICAgICAgICAgICA8ZmlsdGVyIHRva2VuPSJmaW5hbC5uYW1lIiB2YWx1ZT0iJHtmaW5hbC5uYW1lfSIvPgorICAgICAgICAgICAgPGZpbHRlciB0b2tlbj0iamFtbS52ZXJzaW9uIiB2YWx1ZT0iJHtqYW1tLnZlcnNpb259Ii8+CisgICAgICAgICAgICA8ZmlsdGVyIHRva2VuPSJhbGxvY2F0aW9uLWluc3RydW1lbnRlci52ZXJzaW9uIiB2YWx1ZT0iJHthbGxvY2F0aW9uLWluc3RydW1lbnRlci52ZXJzaW9ufSIvPgorICAgICAgICAgICAgPGZpbHRlciB0b2tlbj0iZWNqLnZlcnNpb24iIHZhbHVlPSIke2Vjai52ZXJzaW9ufSIvPgorICAgICAgICAgICAgPGZpbHRlciB0b2tlbj0iYXNtLnZlcnNpb24iIHZhbHVlPSIke2FzbS52ZXJzaW9ufSIvPgorICAgICAgICAgICAgPGZpbHRlciB0b2tlbj0iamFjb2NvLnZlcnNpb24iIHZhbHVlPSIke2phY29jby52ZXJzaW9ufSIvPgorICAgICAgICAgICAgPGZpbHRlciB0b2tlbj0iamZsZXgudmVyc2lvbiIgdmFsdWU9IiR7amZsZXgudmVyc2lvbn0iLz4KKyAgICAgICAgPC9maWx0ZXJzZXQ+CiAKLQk8dGFyZ2V0IG5hbWU9IndyaXRlLXBvbXMiIHVubGVzcz0id2l0aG91dC5tYXZlbiI+Ci0JICAgIDxhbnRjYWxsIHRhcmdldD0iX3dyaXRlLXBvbXMiIC8+Ci0JPC90YXJnZXQ+CisgICAgICAgIDxjb3B5IGZpbGU9Ii5idWlsZC9jYXNzYW5kcmEtZGVwcy10ZW1wbGF0ZS54bWwiIHRvZmlsZT0iJHtidWlsZC5kaXJ9LyR7ZmluYWwubmFtZX0ucG9tIj4KKyAgICAgICAgICAgIDxmaWx0ZXJzZXQgcmVmaWQ9InBvbS10ZW1wbGF0ZSIvPgorICAgICAgICA8L2NvcHk+CisgICAgICAgIDxjb3B5IGZpbGU9Ii5idWlsZC9wYXJlbnQtcG9tLXRlbXBsYXRlLnhtbCIgdG9maWxlPSIke2J1aWxkLmRpcn0vJHtmaW5hbC5uYW1lfS1wYXJlbnQucG9tIj4KKyAgICAgICAgICAgIDxmaWx0ZXJzZXQgcmVmaWQ9InBvbS10ZW1wbGF0ZSIvPgorICAgICAgICA8L2NvcHk+CisgICAgICAgIDxjb3B5IGZpbGU9Ii5idWlsZC9jYXNzYW5kcmEtYnVpbGQtZGVwcy10ZW1wbGF0ZS54bWwiIHRvZmlsZT0iJHtidWlsZC5kaXJ9L3RtcC0ke2ZpbmFsLm5hbWV9LWRlcHMucG9tIj4KKyAgICAgICAgICAgIDxmaWx0ZXJzZXQgcmVmaWQ9InBvbS10ZW1wbGF0ZSIvPgorICAgICAgICA8L2NvcHk+CisgICAgPC90YXJnZXQ+CiAKICAgICA8IS0tCiAgICAgICAgIFRoZSBqYXIgdGFyZ2V0IG1ha2VzIGNhc3NhbmRyYS5qYXIgb3V0cHV0LgpAQCAtMTE0Myw2ICs3MjcsNyBAQAogICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tVGl0bGUiIHZhbHVlPSJDYXNzYW5kcmEiLz4KICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkltcGxlbWVudGF0aW9uLVZlcnNpb24iIHZhbHVlPSIke3ZlcnNpb259Ii8+CiAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJbXBsZW1lbnRhdGlvbi1WZW5kb3IiIHZhbHVlPSJBcGFjaGUiLz4KKyAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkltcGxlbWVudGF0aW9uLUdpdC1TSEEiIHZhbHVlPSIke2dpdC5zaGF9Ii8+CiAgICAgICAgIDwhLS0gPC9zZWN0aW9uPiAtLT4KICAgICAgICAgPC9tYW5pZmVzdD4KICAgICAgIDwvamFyPgpAQCAtMTQyNiw2ICsxMDExLDcgQEAKICAgPHRhcmdldCBuYW1lPSJidWlsZC10ZXN0IiBkZXBlbmRzPSJfbWFpbi1qYXIsc3RyZXNzLWJ1aWxkLXRlc3QsZnFsdG9vbC1idWlsZCxyZXNvbHZlci1kaXN0LWxpYixzaW11bGF0b3ItamFycyxjaGVja3N0eWxlLXRlc3QiCiAgICAgICAgICAgZGVzY3JpcHRpb249IkNvbXBpbGUgdGVzdCBjbGFzc2VzIj4KICAgICA8YW50Y2FsbCB0YXJnZXQ9Il9idWlsZC10ZXN0Ii8+CisgICAgPGNoZWNrdGVzdG5hbWVzaGVscGVyLz4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJfYnVpbGQtdGVzdCI+CkBAIC0xNDM1LDE1ICsxMDIxLDE0IEBACiAgICAgIGRlYnVnbGV2ZWw9IiR7ZGVidWdsZXZlbH0iCiAgICAgIGRlc3RkaXI9IiR7dGVzdC5jbGFzc2VzfSIKICAgICAgaW5jbHVkZWFudHJ1bnRpbWU9InRydWUiCi0gICAgIHNvdXJjZT0iJHtzb3VyY2UudmVyc2lvbn0iCi0gICAgIHRhcmdldD0iJHt0YXJnZXQudmVyc2lvbn0iCisgICAgIHNvdXJjZT0iJHthbnQuamF2YS52ZXJzaW9ufSIKKyAgICAgdGFyZ2V0PSIke2FudC5qYXZhLnZlcnNpb259IgogICAgICBlbmNvZGluZz0idXRmLTgiPgogICAgICA8Y2xhc3NwYXRoPgogICAgICAgICA8cGF0aCByZWZpZD0iY2Fzc2FuZHJhLmNsYXNzcGF0aC50ZXN0Ii8+CiAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtmcWx0b29sLmJ1aWxkLmNsYXNzZXN9Ii8+CiAgICAgIDwvY2xhc3NwYXRoPgogICAgICA8Y29tcGlsZXJhcmcgdmFsdWU9Ii1YRGlnbm9yZS5zeW1ib2wuZmlsZSIvPgotICAgICA8Y29tcGlsZXJhcmcgbGluZT0iJHtqZGsxMS1qYXZhYy1leHBvcnRzfSIvPgogICAgICA8c3JjIHBhdGg9IiR7dGVzdC5hbnR0YXNrcy5zcmN9Ii8+CiAgICAgIDxzcmMgcGF0aD0iJHt0ZXN0LnVuaXQuc3JjfSIvPgogICAgICA8c3JjIHBhdGg9IiR7dGVzdC5sb25nLnNyY30iLz4KQEAgLTE0NTUsMTAgKzEwNDAsOSBAQAogICAgICA8c3JjIHBhdGg9IiR7dGVzdC5zaW11bGF0b3ItYXNtLnNyY30iLz4KICAgICAgPHNyYyBwYXRoPSIke3Rlc3Quc2ltdWxhdG9yLWJvb3RzdHJhcC5zcmN9Ii8+CiAgICAgIDxzcmMgcGF0aD0iJHt0ZXN0LnNpbXVsYXRvci10ZXN0LnNyY30iLz4KKyAgICAgPGNvbXBpbGVyYXJnIGxpbmU9IiR7amRrMTFwbHVzLWphdmFjLWV4cG9ydHN9Ii8+CiAgICAgPC9qYXZhYz4KIAotICAgIDxjaGVja3Rlc3RuYW1lc2hlbHBlci8+Ci0KICAgICA8IS0tIE5vbi1qYXZhIHJlc291cmNlcyBuZWVkZWQgYnkgdGhlIHRlc3Qgc3VpdGUgLS0+CiAgICAgPGNvcHkgdG9kaXI9IiR7dGVzdC5jbGFzc2VzfSI+CiAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdC5yZXNvdXJjZXN9Ii8+CkBAIC0xNTQwLDcgKzExMjQsNyBAQAogICAgICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURqYXZhLmlvLnRtcGRpcj0ke3RtcC5kaXJ9Ii8+CiAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EY2Fzc2FuZHJhLmRlYnVncmVmY291bnQ9dHJ1ZSIvPgotICAgICAgICA8anZtYXJnIHZhbHVlPSItWHNzMjU2ayIvPgorICAgICAgICA8anZtYXJnIHZhbHVlPSIke2p2bV94c3N9Ii8+CiAgICAgICAgIDwhLS0gV2hlbiB3ZSBkbyBjbGFzc2xvYWRlciBtYW5pcHVsYXRpb24gU29mdFJlZmVyZW5jZXMgY2FuIGNhdXNlIG1lbW9yeSBsZWFrcwogICAgICAgICAgICAgIHRoYXQgY2FuIE9PTSBvdXIgdGVzdCBydW5zLiBUaGUgbmV4dCB0d28gc2V0dGluZ3MgaW5mb3JtcyBvdXIgR0MKICAgICAgICAgICAgICBhbGdvcml0aG0gdG8gbGltaXQgdGhlIG1ldGFzcGFjZSBzaXplIGFuZCBjbGVhbiB1cCBTb2Z0UmVmZXJlbmNlcwpAQCAtMTU0OCw2ICsxMTMyLDcgQEAKICAgICAgICAgLS0+CiAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1YWDpTb2Z0UmVmTFJVUG9saWN5TVNQZXJNQj0wIiAvPgogICAgICAgICA8anZtYXJnIHZhbHVlPSItWFg6QWN0aXZlUHJvY2Vzc29yQ291bnQ9JHtjYXNzYW5kcmEudGVzdC5wcm9jZXNzb3JDb3VudH0iIC8+CisgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1YWDpIZWFwRHVtcFBhdGg9YnVpbGQvdGVzdCIgLz4KICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURjYXNzYW5kcmEudGVzdC5kcml2ZXIuY29ubmVjdGlvbl90aW1lb3V0X21zPSR7dGVzdC5kcml2ZXIuY29ubmVjdGlvbl90aW1lb3V0X21zfSIvPgogICAgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS50ZXN0LmRyaXZlci5yZWFkX3RpbWVvdXRfbXM9JHt0ZXN0LmRyaXZlci5yZWFkX3RpbWVvdXRfbXN9Ii8+CiAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EY2Fzc2FuZHJhLm1lbXRhYmxlX3Jvd19vdmVyaGVhZF9jb21wdXRhdGlvbl9zdGVwPTEwMCIvPgpAQCAtMTU1NSw3ICsxMTQwLDcgQEAKICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURjYXNzYW5kcmEudGVzdC5zc3RhYmxlZm9ybWF0ZGV2ZWxvcG1lbnQ9dHJ1ZSIvPgogICAgICAgICA8IS0tIFRoZSBmaXJzdCB0aW1lIFNlY3VyZVJhbmRvbSBpbml0aWFsaXplcyBjYW4gYmUgc2xvdyBpZiBpdCBibG9ja3Mgb24gL2Rldi9yYW5kb20gLS0+CiAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EamF2YS5zZWN1cml0eS5lZ2Q9ZmlsZTovZGV2L3VyYW5kb20iIC8+Ci0gICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EY2Fzc2FuZHJhLnRlc3R0YWc9QHt0ZXN0dGFnfSIvPgorICAgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS50ZXN0dGFnPUB7dGVzdHRhZ30uamRrJHthbnQuamF2YS52ZXJzaW9ufSIvPgogICAgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS5rZWVwQnJpZWZCcmllZj0ke2Nhc3NhbmRyYS5rZWVwQnJpZWZCcmllZn0iIC8+CiAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EY2Fzc2FuZHJhLnN0cmljdC5ydW50aW1lLmNoZWNrcz10cnVlIiAvPgogICAgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS5yZWFkcy50aHJlc2hvbGRzLmNvb3JkaW5hdG9yLmRlZmVuc2l2ZV9jaGVja3NfZW5hYmxlZD10cnVlIiAvPiA8IS0tIGVuYWJsZSBkZWZlbnNpdmUgY2hlY2tzIC0tPgpAQCAtMTU2Myw5ICsxMTQ4LDExIEBACiAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EY2Fzc2FuZHJhLnRlc3QubWVzc2FnaW5nU2VydmljZS5ub25HcmFjZWZ1bFNodXRkb3duPSR7Y2Fzc2FuZHJhLnRlc3QubWVzc2FnaW5nU2VydmljZS5ub25HcmFjZWZ1bFNodXRkb3dufSIvPgogICAgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS51c2Vfbml4X3JlY3Vyc2l2ZV9kZWxldGU9JHtjYXNzYW5kcmEudXNlX25peF9yZWN1cnNpdmVfZGVsZXRlfSIvPgogICAgICAgICA8anZtYXJnIGxpbmU9IiR7amF2YTExLWp2bWFyZ3N9Ii8+CisgICAgICAgIDxqdm1hcmcgbGluZT0iJHtqYXZhMTctanZtYXJnc30iLz4KICAgICAgICAgPCEtLSBkaXNhYmxlIHNocmlua3MgaW4gcXVpY2t0aGVvcmllcyBDQVNTQU5EUkEtMTU1NTQgLS0+CiAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EUVRfU0hSSU5LUz0wIi8+Ci0gICAgICAgIDxqdm1hcmcgbGluZT0iJHtfc3RkLXRlc3QtanZtYXJnc30iIC8+CisgICAgICAgIDxqdm1hcmcgbGluZT0iJHtfc3RkLXRlc3QtanZtYXJnczExfSIgLz4KKyAgICAgICAgPGp2bWFyZyBsaW5lPSIke19zdGQtdGVzdC1qdm1hcmdzMTd9IiAvPgogICAgICAgICA8anZtYXJnIGxpbmU9IiR7dGVzdC5qdm0uYXJnc30iIC8+CiAgICAgICAgIDxvcHRqdm1hcmdzLz4KICAgICAgICAgPCEtLSBVbmNvbW1lbnQgdG8gZGVidWcgdW5pdHRlc3QsIGF0dGFjaCBkZWJ1Z2dlciB0byBwb3J0IDE0MTYgLS0+CkBAIC0xNjcyLDcgKzEyNTksMjcgQEAKICAgICA8L3NlcXVlbnRpYWw+CiAgIDwvbWFjcm9kZWY+CiAKLSAgPG1hY3JvZGVmIG5hbWU9InRlc3RsaXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkiPgorICAgIDxtYWNyb2RlZiBuYW1lPSJ0ZXN0bGlzdC10cmllIj4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0ZXN0LmZpbGUubGlzdCIgLz4KKyAgICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idHJpZV95YW1sIiB2YWx1ZT0iJHtidWlsZC50ZXN0LmRpcn0vY2Fzc2FuZHJhLnRyaWUueWFtbCIvPgorICAgICAgICAgICAgPGNvbmNhdCBkZXN0ZmlsZT0iJHt0cmllX3lhbWx9Ij4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBmaWxlPSIke3Rlc3QuY29uZn0vY2Fzc2FuZHJhLnlhbWwiLz4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBmaWxlPSIke3Rlc3QuY29uZn0vdHJpZV9tZW10YWJsZS55YW1sIi8+CisgICAgICAgICAgICA8L2NvbmNhdD4KKyAgICAgICAgICAgIDx0ZXN0bWFjcm9oZWxwZXIgaW5wdXRkaXI9IiR7dGVzdC51bml0LnNyY30iIGZpbGVsaXN0PSJAe3Rlc3QuZmlsZS5saXN0fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZT0iKiovKi5qYXZhIiB0aW1lb3V0PSIke3Rlc3QudGltZW91dH0iIHRlc3R0YWc9InRyaWUiPgorICAgICAgICAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EbGVnYWN5LXNzdGFibGUtcm9vdD0ke3Rlc3QuZGF0YX0vbGVnYWN5LXNzdGFibGVzIi8+CisgICAgICAgICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURpbnZhbGlkLWxlZ2FjeS1zc3RhYmxlLXJvb3Q9JHt0ZXN0LmRhdGF9L2ludmFsaWQtbGVnYWN5LXNzdGFibGVzIi8+CisgICAgICAgICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURjYXNzYW5kcmEucmluZ19kZWxheV9tcz0xMDAwIi8+CisgICAgICAgICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURjYXNzYW5kcmEudG9sZXJhdGVfc3N0YWJsZV9zaXplPXRydWUiLz4KKyAgICAgICAgICAgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS5jb25maWc9ZmlsZTovLy8ke3RyaWVfeWFtbH0iLz4KKyAgICAgICAgICAgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS5za2lwX3N5bmM9dHJ1ZSIgLz4KKyAgICAgICAgICAgIDwvdGVzdG1hY3JvaGVscGVyPgorICAgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKworICAgIDxtYWNyb2RlZiBuYW1lPSJ0ZXN0bGlzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5Ij4KICAgICA8YXR0cmlidXRlIG5hbWU9InRlc3QuZmlsZS5saXN0IiAvPgogICAgIDxzZXF1ZW50aWFsPgogICAgICAgPHByb3BlcnR5IG5hbWU9InN5c3RlbV9rZXlzcGFjZXNfZGlyZWN0b3J5X3lhbWwiIHZhbHVlPSIke2J1aWxkLnRlc3QuZGlyfS9jYXNzYW5kcmEuc3lzdGVtLnlhbWwiLz4KQEAgLTE3MDksOSArMTMxNiwyNyBAQAogICAgIGFudCB0ZXN0c29tZSAtRHRlc3QubmFtZT1vcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlU2VydmVyVGVzdCAtRHRlc3QubWV0aG9kcz10ZXN0UmVndWxhck1vZGUsdGVzdEdldEFsbFJhbmdlc0VtcHR5CiAgIC0tPgogICA8dGFyZ2V0IG5hbWU9InRlc3Rzb21lIiBkZXBlbmRzPSJtYXliZS1idWlsZC10ZXN0IiBkZXNjcmlwdGlvbj0iRXhlY3V0ZSBzcGVjaWZpYyB1bml0IHRlc3RzIiA+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0id2l0aG91dE1ldGhvZHMiPgorICAgICAgPGFuZD4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke3Rlc3QubWV0aG9kc30iIGFyZzI9IiIvPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxjb250YWlucyBzdHJpbmc9IiR7dGVzdC5uYW1lfSIgc3Vic3RyaW5nPSIqIi8+CisgICAgICAgIDwvbm90PgorICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0id2l0aE1ldGhvZHMiPgorICAgICAgPGFuZD4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHt0ZXN0Lm1ldGhvZHN9IiBhcmcyPSIiLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGNvbnRhaW5zIHN0cmluZz0iJHt0ZXN0Lm5hbWV9IiBzdWJzdHJpbmc9IioiLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2FuZD4KKyAgICA8L2NvbmRpdGlvbj4KICAgICA8dGVzdG1hY3JvIGlucHV0ZGlyPSIke3Rlc3QudW5pdC5zcmN9IiB0aW1lb3V0PSIke3Rlc3QudGltZW91dH0iPgotICAgICAgPHRlc3QgdW5sZXNzOmJsYW5rPSIke3Rlc3QubWV0aG9kc30iIG5hbWU9IiR7dGVzdC5uYW1lfSIgbWV0aG9kcz0iJHt0ZXN0Lm1ldGhvZHN9IiBvdXRmaWxlPSJidWlsZC90ZXN0L291dHB1dC9URVNULSR7dGVzdC5uYW1lfS0ke3Rlc3QubWV0aG9kc30iLz4KLSAgICAgIDx0ZXN0IGlmOmJsYW5rPSIke3Rlc3QubWV0aG9kc30iIG5hbWU9IiR7dGVzdC5uYW1lfSIgb3V0ZmlsZT0iYnVpbGQvdGVzdC9vdXRwdXQvVEVTVC0ke3Rlc3QubmFtZX0iLz4KKyAgICAgIDx0ZXN0IGlmPSJ3aXRoTWV0aG9kcyIgbmFtZT0iJHt0ZXN0Lm5hbWV9IiBtZXRob2RzPSIke3Rlc3QubWV0aG9kc30iIG91dGZpbGU9ImJ1aWxkL3Rlc3Qvb3V0cHV0L1RFU1QtJHt0ZXN0Lm5hbWV9LSR7dGVzdC5tZXRob2RzfSIvPgorICAgICAgPHRlc3QgaWY9IndpdGhvdXRNZXRob2RzIiBuYW1lPSIke3Rlc3QubmFtZX0iIG91dGZpbGU9ImJ1aWxkL3Rlc3Qvb3V0cHV0L1RFU1QtJHt0ZXN0Lm5hbWV9Ii8+CiAgICAgICA8anZtYXJnIHZhbHVlPSItRGxlZ2FjeS1zc3RhYmxlLXJvb3Q9JHt0ZXN0LmRhdGF9L2xlZ2FjeS1zc3RhYmxlcyIvPgogICAgICAgPGp2bWFyZyB2YWx1ZT0iLURpbnZhbGlkLWxlZ2FjeS1zc3RhYmxlLXJvb3Q9JHt0ZXN0LmRhdGF9L2ludmFsaWQtbGVnYWN5LXNzdGFibGVzIi8+CiAgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS5yaW5nX2RlbGF5X21zPTEwMDAiLz4KQEAgLTE3NjIsNiArMTM4NywxNCBAQAogICAgIDx0ZXN0aGVscGVyIHRlc3RkZWxlZ2F0ZT0idGVzdGxpc3QtY2RjIiAvPgogICA8L3RhcmdldD4KIAorICA8dGFyZ2V0IG5hbWU9InRlc3QtdHJpZSIgZGVwZW5kcz0ibWF5YmUtYnVpbGQtdGVzdCIgZGVzY3JpcHRpb249IkV4ZWN1dGUgdW5pdCB0ZXN0cyB3aXRoIHRyaWUgbWVtdGFibGVzIj4KKyAgICA8cGF0aCBpZD0iYWxsLXRlc3QtY2xhc3Nlcy1wYXRoIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LnVuaXQuc3JjfSIgaW5jbHVkZXM9IioqLyR7dGVzdC5uYW1lfS5qYXZhIiAvPgorICAgIDwvcGF0aD4KKyAgICA8cHJvcGVydHkgbmFtZT0iYWxsLXRlc3QtY2xhc3NlcyIgcmVmaWQ9ImFsbC10ZXN0LWNsYXNzZXMtcGF0aCIvPgorICAgIDx0ZXN0aGVscGVyIHRlc3RkZWxlZ2F0ZT0idGVzdGxpc3QtdHJpZSIgLz4KKyAgPC90YXJnZXQ+CisKICAgPHRhcmdldCBuYW1lPSJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkiIGRlcGVuZHM9Im1heWJlLWJ1aWxkLXRlc3QiIGRlc2NyaXB0aW9uPSJFeGVjdXRlIHVuaXQgdGVzdHMgd2l0aCBhIHN5c3RlbSBrZXlzcGFjZXMgZGlyZWN0b3J5IGNvbmZpZ3VyZWQiPgogICAgIDxwYXRoIGlkPSJhbGwtdGVzdC1jbGFzc2VzLXBhdGgiPgogICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3QudW5pdC5zcmN9IiBpbmNsdWRlcz0iKiovJHt0ZXN0Lm5hbWV9LmphdmEiIC8+CkBAIC0xODI4LDcgKzE0NjEsNyBAQAogICAgICAgICA8anZtYXJnIHZhbHVlPSItRGphdmEuYXd0LmhlYWRsZXNzPXRydWUiLz4KICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLWphdmFhZ2VudDoke2J1aWxkLmxpYn0vamFtbS0ke2phbW0udmVyc2lvbn0uamFyIiAvPgogICAgICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KLSAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLVhzczI1NmsiLz4KKyAgICAgICAgPGp2bWFyZyB2YWx1ZT0iJHtqdm1feHNzfSIvPgogICAgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS5tZW10YWJsZV9yb3dfb3ZlcmhlYWRfY29tcHV0YXRpb25fc3RlcD0xMDAiLz4KICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURjYXNzYW5kcmEudGVzdC51c2VfcHJlcGFyZWQ9JHtjYXNzYW5kcmEudGVzdC51c2VfcHJlcGFyZWR9Ii8+CiAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EY2Fzc2FuZHJhLnNraXBfc3luYz10cnVlIiAvPgpAQCAtMTg3NCw3ICsxNTA3LDcgQEAKICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURqYXZhLmF3dC5oZWFkbGVzcz10cnVlIi8+CiAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1qYXZhYWdlbnQ6JHtidWlsZC5saWJ9L2phbW0tJHtqYW1tLnZlcnNpb259LmphciIgLz4KICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+Ci0gICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1Yc3MyNTZrIi8+CisgICAgICAgIDxqdm1hcmcgdmFsdWU9IiR7anZtX3hzc30iLz4KICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURjYXNzYW5kcmEudGVzdC51c2VfcHJlcGFyZWQ9JHtjYXNzYW5kcmEudGVzdC51c2VfcHJlcGFyZWR9Ii8+CiAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EY2Fzc2FuZHJhLm1lbXRhYmxlX3Jvd19vdmVyaGVhZF9jb21wdXRhdGlvbl9zdGVwPTEwMCIvPgogICAgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS5za2lwX3N5bmM9dHJ1ZSIgLz4KQEAgLTIwMDksNiArMTY0MiwxMyBAQAogICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbC10ZXN0LWNsYXNzZXMiIHJlZmlkPSJhbGwtdGVzdC1jbGFzc2VzLXBhdGgiLz4KICAgICAgIDx0ZXN0aGVscGVyIHRlc3RkZWxlZ2F0ZT0idGVzdGxpc3QtY29tcHJlc3Npb24iLz4KICAgPC90YXJnZXQ+CisgIDx0YXJnZXQgbmFtZT0idGVzdGNsYXNzbGlzdC10cmllIiBkZXBlbmRzPSJtYXliZS1idWlsZC10ZXN0IiBkZXNjcmlwdGlvbj0iUnVuIHRlc3RzIGdpdmVuIGluIGZpbGUgLUR0ZXN0LmNsYXNzbGlzdGZpbGUgKG9uZS1jbGFzcy1wZXItbGluZSwgZS5nLiBvcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Tb21lVGVzdC5qYXZhKSI+CisgICAgPHBhdGggaWQ9ImFsbC10ZXN0LWNsYXNzZXMtcGF0aCI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LmRpcn0vJHt0ZXN0LmNsYXNzbGlzdHByZWZpeH0iIGluY2x1ZGVzZmlsZT0iJHt0ZXN0LmNsYXNzbGlzdGZpbGV9Ii8+CisgICAgPC9wYXRoPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGwtdGVzdC1jbGFzc2VzIiByZWZpZD0iYWxsLXRlc3QtY2xhc3Nlcy1wYXRoIi8+CisgICAgPHRlc3RoZWxwZXIgdGVzdGRlbGVnYXRlPSJ0ZXN0bGlzdC10cmllIi8+CisgIDwvdGFyZ2V0PgogICA8dGFyZ2V0IG5hbWU9InRlc3RjbGFzc2xpc3QtY2RjIiBkZXBlbmRzPSJtYXliZS1idWlsZC10ZXN0IiBkZXNjcmlwdGlvbj0iUnVuIHRlc3RzIGdpdmVuIGluIGZpbGUgLUR0ZXN0LmNsYXNzbGlzdGZpbGUgKG9uZS1jbGFzcy1wZXItbGluZSwgZS5nLiBvcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Tb21lVGVzdC5qYXZhKSI+CiAgICAgICA8cGF0aCBpZD0iYWxsLXRlc3QtY2xhc3Nlcy1wYXRoIj4KICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdC5kaXJ9LyR7dGVzdC5jbGFzc2xpc3RwcmVmaXh9IiBpbmNsdWRlc2ZpbGU9IiR7dGVzdC5jbGFzc2xpc3RmaWxlfSIvPgpAQCAtMjA1OCw2ICsxNjk4LDcgQEAKICAgICA8L3Rlc3RtYWNybz4KICAgPC90YXJnZXQ+CiAKKyAgPHByb3BlcnR5IG5hbWU9InNpbXVsYXRvci5hc20ucHJpbnQiIHZhbHVlPSJub25lIi8+IDwhLS0gU3VwcG9ydHM6IE5PTkUsIENMQVNTX1NVTU1BUlksIENMQVNTX0RFVEFJTCwgTUVUSE9EX1NVTU1BUlksIE1FVEhPRF9ERVRBSUwsIEFTTTsgc2VlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNpbXVsYXRvci5hc20uTWV0aG9kTG9nZ2VyLkxldmVsIC0tPgogICA8dGFyZ2V0IG5hbWU9InRlc3Qtc2ltdWxhdG9yLWR0ZXN0IiBkZXBlbmRzPSJtYXliZS1idWlsZC10ZXN0IiBkZXNjcmlwdGlvbj0iRXhlY3V0ZSBzaW11bGF0b3IgZHRlc3RzIj4KICAgICA8dGVzdG1hY3JvIGlucHV0ZGlyPSIke3Rlc3Quc2ltdWxhdG9yLXRlc3Quc3JjfSIgdGltZW91dD0iJHt0ZXN0LnNpbXVsYXRpb24udGltZW91dH0iIGZvcmttb2RlPSJwZXJUZXN0IiBzaG93b3V0cHV0PSJ0cnVlIiBmaWx0ZXI9IioqL3Rlc3QvJHt0ZXN0Lm5hbWV9LmphdmEiPgogICAgICAgPGp2bWFyZyB2YWx1ZT0iLURsb2diYWNrLmNvbmZpZ3VyYXRpb25GaWxlPXRlc3QvY29uZi9sb2diYWNrLXNpbXVsYXRvci54bWwiLz4KQEAgLTIwNjYsNiArMTcwNyw3IEBACiAgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS5za2lwX3N5bmM9dHJ1ZSIgLz4KICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EY2Fzc2FuZHJhLmRlYnVncmVmY291bnQ9ZmFsc2UiLz4KICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EY2Fzc2FuZHJhLnRlc3Quc2ltdWxhdG9yLmRldGVybWluaXNtY2hlY2s9c3RyaWN0Ii8+CisgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS50ZXN0LnNpbXVsYXRvci5wcmludF9hc209JHtzaW11bGF0b3IuYXNtLnByaW50fSIgLz4KICAgICAgIDwhLS0gU3VwcG9ydCBTaW11bGF0b3IgVGVzdHMgLS0+CiAgICAgICA8anZtYXJnIGxpbmU9Ii1qYXZhYWdlbnQ6JHt0ZXN0LmxpYn0vamFycy9zaW11bGF0b3ItYXNtLmphciIvPgogICAgICAgPGp2bWFyZyBsaW5lPSItWGJvb3RjbGFzc3BhdGgvYToke3Rlc3QubGlifS9qYXJzL3NpbXVsYXRvci1ib290c3RyYXAuamFyIi8+CkBAIC0yMTU3LDcgKzE3OTksNyBAQAogICAgICAgPC9qYXZhPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9Il9tYXliZV91cGRhdGVfaWRlYV90b19qYXZhMTEiIGlmPSJqYXZhLnZlcnNpb24uMTEiPgorICA8dGFyZ2V0IG5hbWU9Il9tYXliZV91cGRhdGVfaWRlYV90b19qYXZhMTEiIGRlcGVuZHM9ImluaXQiIGlmPSJqYXZhLnZlcnNpb24uMTEiPgogICAgIDxyZXBsYWNlIGZpbGU9IiR7ZWNsaXBzZS5wcm9qZWN0Lm5hbWV9LmltbCIgdG9rZW49IkpES18xXzgiIHZhbHVlPSJKREtfMTEiLz4KICAgICA8cmVwbGFjZSBmaWxlPSIuaWRlYS9taXNjLnhtbCIgdG9rZW49IkpES18xXzgiIHZhbHVlPSJKREtfMTEiLz4KICAgICA8cmVwbGFjZSBmaWxlPSIuaWRlYS9taXNjLnhtbCIgdG9rZW49IjEuOCIgdmFsdWU9IjExIi8+CkBAIC0yMTY5LDEzICsxODExLDMyIEBACiAgICAgICA8ZWNobyBmaWxlPSIuaWRlYS9jb21waWxlci54bWwiPjwhW0NEQVRBWzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+CiA8cHJvamVjdCB2ZXJzaW9uPSI0Ij4KICAgPGNvbXBvbmVudCBuYW1lPSJKYXZhY1NldHRpbmdzIj4KKyAgICA8b3B0aW9uIG5hbWU9IkFERElUSU9OQUxfT1BUSU9OU19TVFJJTkciIHZhbHVlPSItLWFkZC1leHBvcnRzIGphdmEucm1pL3N1bi5ybWkucmVnaXN0cnk9QUxMLVVOTkFNRUQiIC8+CisgIDwvY29tcG9uZW50PgorPC9wcm9qZWN0Pl1dPjwvZWNobz4KKyAgICAgIDxlY2hvPiJJREUgY29uZmlndXJhdGlvbiB1cGRhdGVkIGZvciB1c2Ugd2l0aCBKREsxMSI8L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iX21heWJlX3VwZGF0ZV9pZGVhX3RvX2phdmExNyIgZGVwZW5kcz0iaW5pdCIgaWY9ImphdmEudmVyc2lvbi4xNyI+CisgICAgICAgIDxyZXBsYWNlIGZpbGU9IiR7ZWNsaXBzZS5wcm9qZWN0Lm5hbWV9LmltbCIgdG9rZW49IkpES18xXzgiIHZhbHVlPSJKREtfMTciLz4KKyAgICAgICAgPHJlcGxhY2UgZmlsZT0iLmlkZWEvbWlzYy54bWwiIHRva2VuPSJKREtfMV84IiB2YWx1ZT0iSkRLXzE3Ii8+CisgICAgICAgIDxyZXBsYWNlIGZpbGU9Ii5pZGVhL21pc2MueG1sIiB0b2tlbj0iMS44IiB2YWx1ZT0iMTciLz4KKyAgICAgICAgPHJlcGxhY2VyZWdleHAgZmlsZT0iLmlkZWEvd29ya3NwYWNlLnhtbCIKKyAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2g9Im5hbWU9JnF1b3Q7Vk1fUEFSQU1FVEVSUyZxdW90OyB2YWx1ZT0mcXVvdDsoLiopIgorICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlPSJuYW1lPSZxdW90O1ZNX1BBUkFNRVRFUlMmcXVvdDsgdmFsdWU9JnF1b3Q7XDEgJHtqYXZhMTctanZtYXJnc30iCisgICAgICAgICAgICAgICAgICAgICAgIGJ5bGluZT0idHJ1ZSIvPgorCisgICAgICAgIDxlY2hvIGZpbGU9Ii5pZGVhL2NvbXBpbGVyLnhtbCI+PCFbQ0RBVEFbPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0IHZlcnNpb249IjQiPgorICA8Y29tcG9uZW50IG5hbWU9IkphdmFjU2V0dGluZ3MiPgogICAgIDxvcHRpb24gbmFtZT0iQURESVRJT05BTF9PUFRJT05TX1NUUklORyIgdmFsdWU9Ii0tYWRkLWV4cG9ydHMgamF2YS5ybWkvc3VuLnJtaS5yZWdpc3RyeT1BTEwtVU5OQU1FRCAtLWFkZC1leHBvcnRzIGphdmEucm1pL3N1bi5ybWkudHJhbnNwb3J0LnRjcD1BTEwtVU5OQU1FRCIgLz4KICAgPC9jb21wb25lbnQ+CiA8L3Byb2plY3Q+XV0+PC9lY2hvPgotICA8L3RhcmdldD4KKyAgICAgICAgPGVjaG8+IklERSBjb25maWd1cmF0aW9uIHVwZGF0ZWQgZm9yIHVzZSB3aXRoIEpESzE3IjwvZWNobz4KKyAgICA8L3RhcmdldD4KIAogICA8IS0tIEdlbmVyYXRlIElERUEgcHJvamVjdCBkZXNjcmlwdGlvbiBmaWxlcyAtLT4KLSAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS1pZGVhLWZpbGVzIiBkZXBlbmRzPSJpbml0LG1hdmVuLWFudC10YXNrcy1pbml0LHJlc29sdmVyLWRpc3QtbGliLGdlbi1jcWwzLWdyYW1tYXIsZ2VuZXJhdGUtamZsZXgtamF2YSxjcmVhdGVWZXJzaW9uUHJvcEZpbGUiIGRlc2NyaXB0aW9uPSJHZW5lcmF0ZSBJREVBIGZpbGVzIj4KKyAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS1pZGVhLWZpbGVzIiBkZXBlbmRzPSJpbml0LHJlc29sdmVyLWRpc3QtbGliLGdlbi1jcWwzLWdyYW1tYXIsZ2VuZXJhdGUtamZsZXgtamF2YSxjcmVhdGVWZXJzaW9uUHJvcEZpbGUiIGRlc2NyaXB0aW9uPSJHZW5lcmF0ZSBJREVBIGZpbGVzIj4KICAgICA8bWtkaXIgZGlyPSIuaWRlYSIvPgogICAgIDxta2RpciBkaXI9Ii5pZGVhL2xpYnJhcmllcyIvPgogICAgIDxjb3B5IHRvZGlyPSIuaWRlYSIgb3ZlcndyaXRlPSJ0cnVlIj4KQEAgLTIxOTQsNiArMTg1NSw3IEBACiAgIDwvY29tcG9uZW50PgogPC9wcm9qZWN0Pl1dPjwvZWNobz4KICAgICAgIDxhbnRjYWxsIHRhcmdldD0iX21heWJlX3VwZGF0ZV9pZGVhX3RvX2phdmExMSIvPgorICAgICAgPGFudGNhbGwgdGFyZ2V0PSJfbWF5YmVfdXBkYXRlX2lkZWFfdG9famF2YTE3Ii8+CiAgIDwvdGFyZ2V0PgogCiAgIDwhLS0gR2VuZXJhdGUgRWNsaXBzZSBwcm9qZWN0IGRlc2NyaXB0aW9uIGZpbGVzIC0tPgpAQCAtMjI5NCw5ICsxOTU2LDkgQEAKIAkgICAgZmFpbG9uZXJyb3I9InRydWUiCiAgICAgICAgICAgICBtYXhtZW1vcnk9IjUxMm0iPgogICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLXNvdXJjZSIvPgotCSAgICA8YXJnIHZhbHVlPSIke3NvdXJjZS52ZXJzaW9ufSIgLz4KKwkgICAgPGFyZyB2YWx1ZT0iJHtqYXZhLmRlZmF1bHR9IiAvPgogCSAgICA8YXJnIHZhbHVlPSItdGFyZ2V0Ii8+Ci0JICAgIDxhcmcgdmFsdWU9IiR7dGFyZ2V0LnZlcnNpb259IiAvPgorCSAgICA8YXJnIHZhbHVlPSIke2FudC5qYXZhLnZlcnNpb259IiAvPgogCSAgICA8YXJnIHZhbHVlPSItZCIgLz4KICAgICAgICAgICAgIDxhcmcgdmFsdWU9Im5vbmUiIC8+CiAJICAgIDxhcmcgdmFsdWU9Ii1wcm9jOm5vbmUiIC8+CkBAIC0yMzEwLDE3ICsxOTcyLDE1IEBACiAgICAgICAgIDwvamF2YT4KICAgPC90YXJnZXQ+CiAKLSAgPHRhcmdldCBuYW1lPSJpbml0LWNoZWNrc3R5bGUiIGRlcGVuZHM9Im1hdmVuLWFudC10YXNrcy1yZXRyaWV2ZS1idWlsZCxidWlsZC1wcm9qZWN0IiB1bmxlc3M9Im5vLWNoZWNrc3R5bGUiPgotICAgICAgPHBhdGggaWQ9ImNoZWNrc3R5bGUubGliLnBhdGgiPgotICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LmxpYn0vamFycyIgaW5jbHVkZXM9IiouamFyIi8+Ci0gICAgICA8L3BhdGg+CisgIDx0YXJnZXQgbmFtZT0iaW5pdC1jaGVja3N0eWxlIiBkZXBlbmRzPSJyZXNvbHZlci1yZXRyaWV2ZS1idWlsZCxidWlsZC1wcm9qZWN0IiB1bmxlc3M9Im5vLWNoZWNrc3R5bGUiPgorICAgICAgPGVjaG8gbWVzc2FnZT0iY2hlY2tzdHlsZS52ZXJzaW9uPSR7Y2hlY2tzdHlsZS52ZXJzaW9ufSIvPgogICAgICAgPCEtLSBTZXZudHUgY3VzdG9tIGNoZWNrcyBhcmUgcmV0cmlldmVkIGJ5IEl2eSBpbnRvIGxpYiBmb2xkZXIKICAgICAgICAgIGFuZCB3aWxsIGJlIGFjY2Vzc2libGUgdG8gY2hlY2tzdHlsZS0tPgogICAgICAgPHRhc2tkZWYgcmVzb3VyY2U9ImNvbS9wdXBweWNyYXdsL3Rvb2xzL2NoZWNrc3R5bGUvYW50L2NoZWNrc3R5bGUtYW50LXRhc2sucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iY2hlY2tzdHlsZS5saWIucGF0aCIvPgorICAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJjaGVja3N0eWxlLmNsYXNzcGF0aCIvPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9ImNoZWNrc3R5bGUiIGRlcGVuZHM9ImluaXQtY2hlY2tzdHlsZSxtYXZlbi1hbnQtdGFza3MtcmV0cmlldmUtYnVpbGQsYnVpbGQtcHJvamVjdCIgZGVzY3JpcHRpb249IlJ1biBjdXN0b20gY2hlY2tzdHlsZSBjb2RlIGFuYWx5c2lzIiBpZj0iamF2YS52ZXJzaW9uLjgiIHVubGVzcz0ibm8tY2hlY2tzdHlsZSI+CisgIDx0YXJnZXQgbmFtZT0iY2hlY2tzdHlsZSIgZGVwZW5kcz0iaW5pdC1jaGVja3N0eWxlLGJ1aWxkLXByb2plY3QiIGRlc2NyaXB0aW9uPSJSdW4gY3VzdG9tIGNoZWNrc3R5bGUgY29kZSBhbmFseXNpcyIgdW5sZXNzPSJuby1jaGVja3N0eWxlIj4KICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjaGVja3N0eWxlLmxvZy5kaXIiIHZhbHVlPSIke2J1aWxkLmRpcn0vY2hlY2tzdHlsZSIgLz4KICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjaGVja3N0eWxlLnJlcG9ydC5maWxlIiB2YWx1ZT0iJHtjaGVja3N0eWxlLmxvZy5kaXJ9L2NoZWNrc3R5bGVfcmVwb3J0LnhtbCIvPgogICAgICAgPG1rZGlyICBkaXI9IiR7Y2hlY2tzdHlsZS5sb2cuZGlyfSIgLz4KQEAgLTIzMzYsNyArMTk5Niw3IEBACiAgICAgICA8L2NoZWNrc3R5bGU+CiAgIDwvdGFyZ2V0PgogCi0gIDx0YXJnZXQgbmFtZT0iY2hlY2tzdHlsZS10ZXN0IiBkZXBlbmRzPSJpbml0LWNoZWNrc3R5bGUsbWF2ZW4tYW50LXRhc2tzLXJldHJpZXZlLWJ1aWxkLGJ1aWxkLXByb2plY3QiIGRlc2NyaXB0aW9uPSJSdW4gY3VzdG9tIGNoZWNrc3R5bGUgY29kZSBhbmFseXNpcyBvbiB0ZXN0cyIgaWY9ImphdmEudmVyc2lvbi44IiB1bmxlc3M9Im5vLWNoZWNrc3R5bGUiPgorICA8dGFyZ2V0IG5hbWU9ImNoZWNrc3R5bGUtdGVzdCIgZGVwZW5kcz0iaW5pdC1jaGVja3N0eWxlLHJlc29sdmVyLXJldHJpZXZlLWJ1aWxkLGJ1aWxkLXByb2plY3QiIGRlc2NyaXB0aW9uPSJSdW4gY3VzdG9tIGNoZWNrc3R5bGUgY29kZSBhbmFseXNpcyBvbiB0ZXN0cyIgdW5sZXNzPSJuby1jaGVja3N0eWxlIj4KICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjaGVja3N0eWxlLmxvZy5kaXIiIHZhbHVlPSIke2J1aWxkLmRpcn0vY2hlY2tzdHlsZSIgLz4KICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjaGVja3N0eWxlX3Rlc3QucmVwb3J0LmZpbGUiIHZhbHVlPSIke2NoZWNrc3R5bGUubG9nLmRpcn0vY2hlY2tzdHlsZV9yZXBvcnRfdGVzdC54bWwiLz4KICAgICAgIDxta2RpciAgZGlyPSIke2NoZWNrc3R5bGUubG9nLmRpcn0iIC8+CkBAIC0yMzU0LDcgKzIwMTQsNyBAQAogCiAgIDwhLS0gSW5zdGFsbHMgYXJ0aWZhY3RzIHRvIGxvY2FsIE1hdmVuIHJlcG9zaXRvcnkgLS0+CiAgIDx0YXJnZXQgbmFtZT0ibXZuLWluc3RhbGwiCi0gICAgICAgICAgZGVwZW5kcz0ibWF2ZW4tZGVjbGFyZS1kZXBlbmRlbmNpZXMsamFyLHNvdXJjZXMtamFyLGphdmFkb2MtamFyIgorICAgICAgICAgIGRlcGVuZHM9Imphcixzb3VyY2VzLWphcixqYXZhZG9jLWphciIKICAgICAgICAgICBkZXNjcmlwdGlvbj0iSW5zdGFsbHMgdGhlIGFydGlmYWN0cyBpbiB0aGUgTWF2ZW4gTG9jYWwgUmVwb3NpdG9yeSI+CiAKICAgICA8IS0tIHRoZSBwYXJlbnQgLS0+CkBAIC0yNDAyLDQgKzIwNjIsNSBAQAogICA8aW1wb3J0IGZpbGU9IiR7YmFzZWRpcn0vLmJ1aWxkL2J1aWxkLXJlc29sdmVyLnhtbCIvPgogICA8aW1wb3J0IGZpbGU9IiR7YmFzZWRpcn0vLmJ1aWxkL2J1aWxkLXJhdC54bWwiLz4KICAgPGltcG9ydCBmaWxlPSIke2Jhc2VkaXJ9Ly5idWlsZC9idWlsZC1vd2FzcC54bWwiLz4KKyAgPGltcG9ydCBmaWxlPSIke2Jhc2VkaXJ9Ly5idWlsZC9idWlsZC1naXQueG1sIi8+CiA8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jaGVja3N0eWxlLnhtbCBiL2NoZWNrc3R5bGUueG1sCmluZGV4IDA1M2NjNzMuLmZjNzdmZGQgMTAwNjQ0Ci0tLSBhL2NoZWNrc3R5bGUueG1sCisrKyBiL2NoZWNrc3R5bGUueG1sCkBAIC05Niw3ICs5Niw3IEBACiAgICAgICA8cHJvcGVydHkgbmFtZT0iaWxsZWdhbENsYXNzZXMiIHZhbHVlPSJqYXZhLmlvLkZpbGUsamF2YS5pby5GaWxlSW5wdXRTdHJlYW0samF2YS5pby5GaWxlT3V0cHV0U3RyZWFtLGphdmEuaW8uRmlsZVJlYWRlcixqYXZhLmlvLkZpbGVXcml0ZXIsamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlLGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZSxqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaCxqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMsamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZSxqYXZhLnV0aWwuY29uY3VycmVudC5TeW5jaHJvbm91c1F1ZXVlLGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZSxjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRnV0dXJlcyxqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0YWJsZUZ1dHVyZSxpby5uZXR0eS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlLGlvLm5ldHR5LnV0aWwuY29uY3VycmVudC5Qcm9taXNlLGlvLm5ldHR5LnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZSxjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuTGlzdGVuYWJsZUZ1dHVyZVRhc2ssY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50Lkxpc3RlbmFibGVGdXR1cmUsY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLGphdmEubmlvLmZpbGUuUGF0aHMiLz4KICAgICA8L21vZHVsZT4KICAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxJbnN0YW50aWF0aW9uIj4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzIiB2YWx1ZT0iamF2YS5pby5GaWxlLGphdmEubGFuZy5UaHJlYWQsamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlVGFzayxqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmUsamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2gsamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yLGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcixqYXZhLnV0aWwuY29uY3VycmVudC5Gb3JrSm9pblBvb2wsamF2YS5sYW5nLk91dE9mTWVtb3J5RXJyb3IiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzIiB2YWx1ZT0iY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLk9iamVjdE1hcHBlcixqYXZhLmlvLkZpbGUsamF2YS5sYW5nLlRocmVhZCxqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmVUYXNrLGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZSxqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaCxqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IsamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLGphdmEudXRpbC5jb25jdXJyZW50LkZvcmtKb2luUG9vbCxqYXZhLmxhbmcuT3V0T2ZNZW1vcnlFcnJvciIvPgogICAgIDwvbW9kdWxlPgogCiAgICAgPG1vZHVsZSBuYW1lPSJSZWdleHBTaW5nbGVsaW5lSmF2YSI+CkBAIC0xMDYsNiArMTA2LDY3IEBACiAgICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgdmFsdWU9IkF2b2lkIFBhdGgjdG9GaWxlKCksIGFzIHNvbWUgaW1wbGVtZW50YXRpb25zIG1heSBub3Qgc3VwcG9ydCBpdC4iIC8+CiAgICAgPC9tb2R1bGU+CiAKKyAgICA8bW9kdWxlIG5hbWU9IlJlZ2V4cFNpbmdsZWxpbmVKYXZhIj4KKyAgICAgIDwhLS0gYmxvY2sgSW50ZWdlcigpIC0tPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImlkIiB2YWx1ZT0iYmxvY2tJbnRlZ2VySW5zdGFudGlhdGlvbiIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9Im5ldyBJbnRlZ2VyXCgiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVDb21tZW50cyIgdmFsdWU9InRydWUiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iQXZvaWQgSW50ZWdlcigpIGFuZCB1c2UgSW50ZWdlci52YWx1ZU9mKCkiIC8+CisgICAgPC9tb2R1bGU+CisgICAgPG1vZHVsZSBuYW1lPSJSZWdleHBTaW5nbGVsaW5lSmF2YSI+CisgICAgICA8IS0tIGJsb2NrIExvbmcoKSAtLT4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZCIgdmFsdWU9ImJsb2NrTG9uZ0luc3RhbnRpYXRpb24iLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJuZXcgTG9uZ1woIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlQ29tbWVudHMiIHZhbHVlPSJ0cnVlIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgdmFsdWU9IkF2b2lkIExvbmcoKSBhbmQgdXNlIExvbmcudmFsdWVPZigpIiAvPgorICAgIDwvbW9kdWxlPgorICAgIDxtb2R1bGUgbmFtZT0iUmVnZXhwU2luZ2xlbGluZUphdmEiPgorICAgICAgPCEtLSBibG9jayBGbG9hdCgpIC0tPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImlkIiB2YWx1ZT0iYmxvY2tGbG9hdEluc3RhbnRpYXRpb24iLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJuZXcgRmxvYXRcKCIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9Imlnbm9yZUNvbW1lbnRzIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJBdm9pZCBGbG9hdCgpIGFuZCB1c2UgRmxvYXQudmFsdWVPZigpIiAvPgorICAgIDwvbW9kdWxlPgorICAgIDxtb2R1bGUgbmFtZT0iUmVnZXhwU2luZ2xlbGluZUphdmEiPgorICAgICAgPCEtLSBibG9jayBCeXRlKCkgLS0+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaWQiIHZhbHVlPSJibG9ja0J5dGVJbnN0YW50aWF0aW9uIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0ibmV3IEJ5dGVcKCIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9Imlnbm9yZUNvbW1lbnRzIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJBdm9pZCBCeXRlKCkgYW5kIHVzZSBCeXRlLnZhbHVlT2YoKSIgLz4KKyAgICA8L21vZHVsZT4KKyAgICA8bW9kdWxlIG5hbWU9IlJlZ2V4cFNpbmdsZWxpbmVKYXZhIj4KKyAgICAgIDwhLS0gYmxvY2sgRG91YmxlKCkgLS0+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaWQiIHZhbHVlPSJibG9ja0RvdWJsZUluc3RhbnRpYXRpb24iLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJuZXcgRG91YmxlXCgiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVDb21tZW50cyIgdmFsdWU9InRydWUiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iQXZvaWQgRG91YmxlKCkgYW5kIHVzZSBEb3VibGUudmFsdWVPZigpIiAvPgorICAgIDwvbW9kdWxlPgorICAgIDxtb2R1bGUgbmFtZT0iUmVnZXhwU2luZ2xlbGluZUphdmEiPgorICAgICAgPCEtLSBibG9jayBTaG9ydCgpIC0tPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImlkIiB2YWx1ZT0iYmxvY2tTaG9ydEluc3RhbnRpYXRpb24iLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJuZXcgU2hvcnRcKCIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9Imlnbm9yZUNvbW1lbnRzIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJBdm9pZCBTaG9ydCgpIGFuZCB1c2UgU2hvcnQudmFsdWVPZigpIiAvPgorICAgIDwvbW9kdWxlPgorCisgICAgPG1vZHVsZSBuYW1lPSJTdXBwcmVzc2lvbkNvbW1lbnRGaWx0ZXIiPgorICAgICAgPHByb3BlcnR5IG5hbWU9Im9mZkNvbW1lbnRGb3JtYXQiIHZhbHVlPSJjaGVja3N0eWxlOiBzdXBwcmVzcyBiZWxvdyAnKFtcd1x8XSspJyIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImlkRm9ybWF0IiB2YWx1ZT0iJDEiLz4KKyAgICA8L21vZHVsZT4KKworICAgIDxtb2R1bGUgbmFtZT0iU3VwcHJlc3NXaXRoTmVhcmJ5Q29tbWVudEZpbHRlciI+CisgICAgICA8cHJvcGVydHkgbmFtZT0iY29tbWVudEZvcm1hdCIgdmFsdWU9ImNoZWNrc3R5bGU6IHN1cHByZXNzIG5lYXJieSAnKFtcd1x8XSspJyIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImlkRm9ybWF0IiB2YWx1ZT0iJDEiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmZsdWVuY2VGb3JtYXQiIHZhbHVlPSIwIi8+CisgICAgPC9tb2R1bGU+CisKKyAgICA8bW9kdWxlIG5hbWU9IlJlZ2V4cFNpbmdsZWxpbmVKYXZhIj4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZCIgdmFsdWU9ImJsb2NrU3lzdGVtUHJvcGVydHlVc2FnZSIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9IihTeXN0ZW1cLmdldGVudil8KFN5c3RlbVwuKGdldFByb3BlcnR5fHNldFByb3BlcnR5KSl8KEludGVnZXJcLmdldEludGVnZXIpfChMb25nXC5nZXRMb25nKXwoQm9vbGVhblwuZ2V0Qm9vbGVhbikiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVDb21tZW50cyIgdmFsdWU9InRydWUiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iVXNlIHRoZSBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMgb3IgQ2Fzc2FuZHJhUmVsZXZhbnRFbnYgaW5zdGVhZC4iIC8+CisgICAgPC9tb2R1bGU+CisKICAgICA8bW9kdWxlIG5hbWU9IlJlZHVuZGFudEltcG9ydCIvPgogICAgIDxtb2R1bGUgbmFtZT0iVW51c2VkSW1wb3J0cyIvPgogICA8L21vZHVsZT4KZGlmZiAtLWdpdCBhL2NoZWNrc3R5bGVfdGVzdC54bWwgYi9jaGVja3N0eWxlX3Rlc3QueG1sCmluZGV4IGQyMzc4MjcuLjcyMGJjODEgMTAwNjQ0Ci0tLSBhL2NoZWNrc3R5bGVfdGVzdC54bWwKKysrIGIvY2hlY2tzdHlsZV90ZXN0LnhtbApAQCAtNTQsNyArNTQsNzUgQEAKICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbGxlZ2FsQ2xhc3NlcyIgdmFsdWU9IiIvPgogICAgIDwvbW9kdWxlPgogICAgIDxtb2R1bGUgbmFtZT0iSWxsZWdhbEluc3RhbnRpYXRpb24iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMiIHZhbHVlPSIiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzIiB2YWx1ZT0iY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLk9iamVjdE1hcHBlciIvPgorICAgIDwvbW9kdWxlPgorCisgICAgPG1vZHVsZSBuYW1lPSJSZWdleHBTaW5nbGVsaW5lSmF2YSI+CisgICAgICA8IS0tIGJsb2NrIEludGVnZXIoKSAtLT4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZCIgdmFsdWU9ImJsb2NrSW50ZWdlckluc3RhbnRpYXRpb24iLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJuZXcgSW50ZWdlclwoIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlQ29tbWVudHMiIHZhbHVlPSJ0cnVlIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgdmFsdWU9IkF2b2lkIEludGVnZXIoKSBhbmQgdXNlIEludGVnZXIudmFsdWVPZigpIiAvPgorICAgIDwvbW9kdWxlPgorICAgIDxtb2R1bGUgbmFtZT0iUmVnZXhwU2luZ2xlbGluZUphdmEiPgorICAgICAgPCEtLSBibG9jayBMb25nKCkgLS0+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaWQiIHZhbHVlPSJibG9ja0xvbmdJbnN0YW50aWF0aW9uIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0ibmV3IExvbmdcKCIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9Imlnbm9yZUNvbW1lbnRzIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJBdm9pZCBMb25nKCkgYW5kIHVzZSBMb25nLnZhbHVlT2YoKSIgLz4KKyAgICA8L21vZHVsZT4KKyAgICA8bW9kdWxlIG5hbWU9IlJlZ2V4cFNpbmdsZWxpbmVKYXZhIj4KKyAgICAgIDwhLS0gYmxvY2sgRmxvYXQoKSAtLT4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZCIgdmFsdWU9ImJsb2NrRmxvYXRJbnN0YW50aWF0aW9uIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0ibmV3IEZsb2F0XCgiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVDb21tZW50cyIgdmFsdWU9InRydWUiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iQXZvaWQgRmxvYXQoKSBhbmQgdXNlIEZsb2F0LnZhbHVlT2YoKSIgLz4KKyAgICA8L21vZHVsZT4KKyAgICA8bW9kdWxlIG5hbWU9IlJlZ2V4cFNpbmdsZWxpbmVKYXZhIj4KKyAgICAgIDwhLS0gYmxvY2sgQnl0ZSgpIC0tPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImlkIiB2YWx1ZT0iYmxvY2tCeXRlSW5zdGFudGlhdGlvbiIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9Im5ldyBCeXRlXCgiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVDb21tZW50cyIgdmFsdWU9InRydWUiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iQXZvaWQgQnl0ZSgpIGFuZCB1c2UgQnl0ZS52YWx1ZU9mKCkiIC8+CisgICAgPC9tb2R1bGU+CisgICAgPG1vZHVsZSBuYW1lPSJSZWdleHBTaW5nbGVsaW5lSmF2YSI+CisgICAgICA8IS0tIGJsb2NrIERvdWJsZSgpIC0tPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImlkIiB2YWx1ZT0iYmxvY2tEb3VibGVJbnN0YW50aWF0aW9uIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0ibmV3IERvdWJsZVwoIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlQ29tbWVudHMiIHZhbHVlPSJ0cnVlIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgdmFsdWU9IkF2b2lkIERvdWJsZSgpIGFuZCB1c2UgRG91YmxlLnZhbHVlT2YoKSIgLz4KKyAgICA8L21vZHVsZT4KKyAgICA8bW9kdWxlIG5hbWU9IlJlZ2V4cFNpbmdsZWxpbmVKYXZhIj4KKyAgICAgIDwhLS0gYmxvY2sgU2hvcnQoKSAtLT4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZCIgdmFsdWU9ImJsb2NrU2hvcnRJbnN0YW50aWF0aW9uIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0ibmV3IFNob3J0XCgiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVDb21tZW50cyIgdmFsdWU9InRydWUiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iQXZvaWQgU2hvcnQoKSBhbmQgdXNlIFNob3J0LnZhbHVlT2YoKSIgLz4KKyAgICA8L21vZHVsZT4KKworICAgIDxtb2R1bGUgbmFtZT0iU3VwcHJlc3Npb25Db21tZW50RmlsdGVyIj4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvZmZDb21tZW50Rm9ybWF0IiB2YWx1ZT0iY2hlY2tzdHlsZTogc3VwcHJlc3MgYmVsb3cgJyhbXHdcfF0rKSciLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZEZvcm1hdCIgdmFsdWU9IiQxIi8+CisgICAgPC9tb2R1bGU+CisKKyAgICA8bW9kdWxlIG5hbWU9IlN1cHByZXNzV2l0aE5lYXJieUNvbW1lbnRGaWx0ZXIiPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImNvbW1lbnRGb3JtYXQiIHZhbHVlPSJjaGVja3N0eWxlOiBzdXBwcmVzcyBuZWFyYnkgJyhbXHdcfF0rKSciLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZEZvcm1hdCIgdmFsdWU9IiQxIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaW5mbHVlbmNlRm9ybWF0IiB2YWx1ZT0iMCIvPgorICAgIDwvbW9kdWxlPgorCisgICAgPG1vZHVsZSBuYW1lPSJSZWdleHBTaW5nbGVsaW5lSmF2YSI+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaWQiIHZhbHVlPSJibG9ja1N5c3RlbVByb3BlcnR5VXNhZ2UiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSIoU3lzdGVtXC5nZXRlbnYpfChTeXN0ZW1cLihnZXRQcm9wZXJ0eXxzZXRQcm9wZXJ0eSkpfChJbnRlZ2VyXC5nZXRJbnRlZ2VyKXwoTG9uZ1wuZ2V0TG9uZyl8KEJvb2xlYW5cLmdldEJvb2xlYW4pIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlQ29tbWVudHMiIHZhbHVlPSJ0cnVlIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgdmFsdWU9IlVzZSB0aGUgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzIG9yIENhc3NhbmRyYVJlbGV2YW50RW52IGluc3RlYWQuIiAvPgorICAgIDwvbW9kdWxlPgorCisgICAgPG1vZHVsZSBuYW1lPSJSZWdleHBTaW5nbGVsaW5lSmF2YSI+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaWQiIHZhbHVlPSJjbGVhclZhbHVlU3lzdGVtUHJvcGVydHlVc2FnZSIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9IlwuY2xlYXJWYWx1ZVwoIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlQ29tbWVudHMiIHZhbHVlPSJ0cnVlIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgdmFsdWU9IlBsZWFzZSB1c2UgV2l0aFByb3BlcnRpZXMgaW4gdHJ5LXdpdGgtcmVzb3VyY2VzIGluc3RlYWQuIFNlZSBDQVNTQU5EUkEtMTg0NTMuIiAvPgogICAgIDwvbW9kdWxlPgogCiAgICAgPG1vZHVsZSBuYW1lPSJSZWR1bmRhbnRJbXBvcnQiLz4KZGlmZiAtLWdpdCBhL2NvbmYvY2Fzc2FuZHJhLWVudi5zaCBiL2NvbmYvY2Fzc2FuZHJhLWVudi5zaAppbmRleCAyZTNjOGM5Li4yNWJhNTA1IDEwMDY0NAotLS0gYS9jb25mL2Nhc3NhbmRyYS1lbnYuc2gKKysrIGIvY29uZi9jYXNzYW5kcmEtZW52LnNoCkBAIC05Miw3ICs5Miw3IEBACiBmaQogCiAjR0MgbG9nIHBhdGggaGFzIHRvIGJlIGRlZmluZWQgaGVyZSBiZWNhdXNlIGl0IG5lZWRzIHRvIGFjY2VzcyBDQVNTQU5EUkFfSE9NRQotaWYgWyAkSkFWQV9WRVJTSU9OIC1nZSAxMSBdIDsgdGhlbgoraWYgWyAkSkFWQV9WRVJTSU9OIC1nZSAxMSBdIHx8IFsgJEpBVkFfVkVSU0lPTiAtZ2UgMTcgXSA7IHRoZW4KICAgICAjIFNlZSBkZXNjcmlwdGlvbiBvZiBodHRwczovL2J1Z3Mub3Blbmpkay5qYXZhLm5ldC9icm93c2UvSkRLLTgwNDYxNDggZm9yIGRldGFpbHMgYWJvdXQgdGhlIHN5bnRheAogICAgICMgVGhlIGZvbGxvd2luZyBpcyB0aGUgZXF1aXZhbGVudCB0byAtWFg6K1ByaW50R0NEZXRhaWxzIC1YWDorVXNlR0NMb2dGaWxlUm90YXRpb24gLVhYOk51bWJlck9mR0NMb2dGaWxlcz0xMCAtWFg6R0NMb2dGaWxlU2l6ZT0xME0KICAgICBlY2hvICIkSlZNX09QVFMiIHwgZ3JlcCAtcWUgIi1bWF1sb2c6Z2MiCmRpZmYgLS1naXQgYS9jb25mL2Nhc3NhbmRyYS55YW1sIGIvY29uZi9jYXNzYW5kcmEueWFtbAppbmRleCA0YjI3MTFjLi5jYTg2NWIxIDEwMDY0NAotLS0gYS9jb25mL2Nhc3NhbmRyYS55YW1sCisrKyBiL2NvbmYvY2Fzc2FuZHJhLnlhbWwKQEAgLTIxLDcgKzIxLDcgQEAKICMgU3BlY2lmeWluZyBpbml0aWFsX3Rva2VuIHdpbGwgb3ZlcnJpZGUgdGhpcyBzZXR0aW5nIG9uIHRoZSBub2RlJ3MgaW5pdGlhbCBzdGFydCwKICMgb24gc3Vic2VxdWVudCBzdGFydHMsIHRoaXMgc2V0dGluZyB3aWxsIGFwcGx5IGV2ZW4gaWYgaW5pdGlhbCB0b2tlbiBpcyBzZXQuCiAjCi0jIFNlZSBodHRwczovL2Nhc3NhbmRyYS5hcGFjaGUub3JnL2RvYy9sYXRlc3QvZ2V0dGluZ19zdGFydGVkL3Byb2R1Y3Rpb24uaHRtbCN0b2tlbnMgZm9yCisjIFNlZSBodHRwczovL2Nhc3NhbmRyYS5hcGFjaGUub3JnL2RvYy9sYXRlc3QvZ2V0dGluZy1zdGFydGVkL3Byb2R1Y3Rpb24uaHRtbCN0b2tlbnMgZm9yCiAjIGJlc3QgcHJhY3RpY2UgaW5mb3JtYXRpb24gYWJvdXQgbnVtX3Rva2Vucy4KICMKIG51bV90b2tlbnM6IDE2CkBAIC00NCw4ICs0NCw4IEBACiBhbGxvY2F0ZV90b2tlbnNfZm9yX2xvY2FsX3JlcGxpY2F0aW9uX2ZhY3RvcjogMwogCiAjIGluaXRpYWxfdG9rZW4gYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRva2VucyBtYW51YWxseS4gIFdoaWxlIHlvdSBjYW4gdXNlIGl0IHdpdGgKLSMgdm5vZGVzIChudW1fdG9rZW5zID4gMSwgYWJvdmUpIC0tIGluIHdoaWNoIGNhc2UgeW91IHNob3VsZCBwcm92aWRlIGEgCi0jIGNvbW1hLXNlcGFyYXRlZCBsaXN0IC0tIGl0J3MgcHJpbWFyaWx5IHVzZWQgd2hlbiBhZGRpbmcgbm9kZXMgdG8gbGVnYWN5IGNsdXN0ZXJzIAorIyB2bm9kZXMgKG51bV90b2tlbnMgPiAxLCBhYm92ZSkgLS0gaW4gd2hpY2ggY2FzZSB5b3Ugc2hvdWxkIHByb3ZpZGUgYQorIyBjb21tYS1zZXBhcmF0ZWQgbGlzdCAtLSBpdCdzIHByaW1hcmlseSB1c2VkIHdoZW4gYWRkaW5nIG5vZGVzIHRvIGxlZ2FjeSBjbHVzdGVycwogIyB0aGF0IGRvIG5vdCBoYXZlIHZub2RlcyBlbmFibGVkLgogIyBpbml0aWFsX3Rva2VuOgogCkBAIC05OSw2ICs5OSwxMSBAQAogIyBEaXNhYmxlIHRoZSBvcHRpb24gaW4gb3JkZXIgdG8gcHJlc2VydmUgdGhvc2UgaGludHMgb24gdGhlIGRpc2suCiBhdXRvX2hpbnRzX2NsZWFudXBfZW5hYmxlZDogZmFsc2UKIAorIyBFbmFibGUvZGlzYWJsZSB0cmFuc2ZlcmluZyBoaW50cyB0byBhIHBlZXIgZHVyaW5nIGRlY29tbWlzc2lvbi4gRXZlbiB3aGVuIGVuYWJsZWQsIHRoaXMgZG9lcyBub3QgZ3VhcmFudGVlCisjIGNvbnNpc3RlbmN5IGZvciBsb2dnZWQgYmF0Y2hlcywgYW5kIGl0IG1heSBkZWxheSBkZWNvbW1pc3Npb24gd2hlbiBjb3VwbGVkIHdpdGggYSBzdHJpY3QgaGludGVkX2hhbmRvZmZfdGhyb3R0bGUuIAorIyBEZWZhdWx0OiB0cnVlCisjIHRyYW5zZmVyX2hpbnRzX29uX2RlY29tbWlzc2lvbjogdHJ1ZQorCiAjIENvbXByZXNzaW9uIHRvIGFwcGx5IHRvIHRoZSBoaW50IGZpbGVzLiBJZiBvbWl0dGVkLCBoaW50cyBmaWxlcwogIyB3aWxsIGJlIHdyaXR0ZW4gdW5jb21wcmVzc2VkLiBMWjQsIFNuYXBweSwgYW5kIERlZmxhdGUgY29tcHJlc3NvcnMKICMgYXJlIHN1cHBvcnRlZC4KQEAgLTEwNyw2ICsxMTIsMTYgQEAKICMgICAgIHBhcmFtZXRlcnM6CiAjICAgICAgICAgLQogCisjIERpcmVjdG9yeSB3aGVyZSBDYXNzYW5kcmEgc2hvdWxkIHN0b3JlIHJlc3VsdHMgb2YgYSBPbmUtU2hvdCB0cm91Ymxlc2hvb3RpbmcgaGVhcGR1bXAgZm9yIHVuY2F1Z2h0IGV4Y2VwdGlvbnMuCisjIE5vdGU6IHRoaXMgdmFsdWUgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIC1YWDpIZWFwRHVtcFBhdGggSlZNIGVudiBwYXJhbSB3aXRoIGEgcmVsYXRpdmUgbG9jYWwgcGF0aCBmb3IgdGVzdGluZyBpZgorIyBzbyBkZXNpcmVkLgorIyBJZiBub3Qgc2V0LCB0aGUgZGVmYXVsdCBkaXJlY3RvcnkgaXMgJENBU1NBTkRSQV9IT01FL2hlYXBkdW1wCisjIGhlYXBfZHVtcF9wYXRoOiAvdmFyL2xpYi9jYXNzYW5kcmEvaGVhcGR1bXAKKworIyBFbmFibGUgLyBkaXNhYmxlIGF1dG9tYXRpYyBkdW1wIG9mIGhlYXAgb24gZmlyc3QgdW5jYXVnaHQgZXhjZXB0aW9uCisjIElmIG5vdCBzZXQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlCisjIGR1bXBfaGVhcF9vbl91bmNhdWdodF9leGNlcHRpb246IHRydWUKKwogIyBFbmFibGUgLyBkaXNhYmxlIHBlcnNpc3RlbnQgaGludCB3aW5kb3dzLgogIwogIyBJZiBzZXQgdG8gZmFsc2UsIGEgaGludCB3aWxsIGJlIHN0b3JlZCBvbmx5IGluIGNhc2UgYSByZXNwZWN0aXZlIG5vZGUKQEAgLTI3NSw3ICsyOTAsNyBAQAogcGFydGl0aW9uZXI6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5NdXJtdXIzUGFydGl0aW9uZXIKIAogIyBEaXJlY3RvcmllcyB3aGVyZSBDYXNzYW5kcmEgc2hvdWxkIHN0b3JlIGRhdGEgb24gZGlzay4gSWYgbXVsdGlwbGUKLSMgZGlyZWN0b3JpZXMgYXJlIHNwZWNpZmllZCwgQ2Fzc2FuZHJhIHdpbGwgc3ByZWFkIGRhdGEgZXZlbmx5IGFjcm9zcyAKKyMgZGlyZWN0b3JpZXMgYXJlIHNwZWNpZmllZCwgQ2Fzc2FuZHJhIHdpbGwgc3ByZWFkIGRhdGEgZXZlbmx5IGFjcm9zcwogIyB0aGVtIGJ5IHBhcnRpdGlvbmluZyB0aGUgdG9rZW4gcmFuZ2VzLgogIyBJZiBub3Qgc2V0LCB0aGUgZGVmYXVsdCBkaXJlY3RvcnkgaXMgJENBU1NBTkRSQV9IT01FL2RhdGEvZGF0YS4KICMgZGF0YV9maWxlX2RpcmVjdG9yaWVzOgpAQCAtMjk4LDYgKzMxMywxOCBAQAogIyBjb250YWluaW5nIGEgQ0RDLWVuYWJsZWQgdGFibGUgaWYgYXQgc3BhY2UgbGltaXQgaW4gY2RjX3Jhd19kaXJlY3RvcnkpLgogY2RjX2VuYWJsZWQ6IGZhbHNlCiAKKyMgU3BlY2lmeSB3aGV0aGVyIHdyaXRlcyB0byB0aGUgQ0RDLWVuYWJsZWQgdGFibGVzIHNob3VsZCBiZSBibG9ja2VkIHdoZW4gQ0RDIGRhdGEgb24gZGlzayBoYXMgcmVhY2hlZCB0byB0aGUgbGltaXQuCisjIFdoZW4gc2V0dGluZyB0byBmYWxzZSwgdGhlIHdyaXRlcyB3aWxsIG5vdCBiZSBibG9ja2VkIGFuZCB0aGUgb2xkZXN0IENEQyBkYXRhIG9uIGRpc2sgd2lsbCBiZSBkZWxldGVkIHRvCisjIGVuc3VyZSB0aGUgc2l6ZSBjb25zdHJhaW50LiBUaGUgZGVmYXVsdCBpcyB0cnVlLgorIyBjZGNfYmxvY2tfd3JpdGVzOiB0cnVlCisKKyMgU3BlY2lmeSB3aGV0aGVyIENEQyBtdXRhdGlvbnMgYXJlIHJlcGxheWVkIHRocm91Z2ggdGhlIHdyaXRlIHBhdGggb24gc3RyZWFtaW5nLCBlLmcuIHJlcGFpci4KKyMgV2hlbiBlbmFibGVkLCBDREMgZGF0YSBzdHJlYW1lZCB0byB0aGUgZGVzdGluYXRpb24gbm9kZSB3aWxsIGJlIHdyaXR0ZW4gaW50byBjb21taXQgbG9nIGZpcnN0LiBXaGVuIHNldHRpbmcgdG8gZmFsc2UsCisjIHRoZSBzdHJlYW1lZCBDREMgZGF0YSBpcyB3cml0dGVuIGludG8gU1NUYWJsZXMganVzdCB0aGUgc2FtZSBhcyBub3JtYWwgc3RyZWFtaW5nLiBUaGUgZGVmYXVsdCBpcyB0cnVlLgorIyBJZiB0aGlzIGlzIHNldCB0byBmYWxzZSwgc3RyZWFtaW5nIHdpbGwgYmUgY29uc2lkZXJhYmx5IGZhc3RlciBob3dldmVyIGl0J3MgcG9zc2libGUgdGhhdCwgaW4gZXh0cmVtZSBzaXR1YXRpb25zCisjIChsb3NpbmcgPiBxdW9ydW0gIyBub2RlcyBpbiBhIHJlcGxpY2Egc2V0KSwgeW91IG1heSBoYXZlIGRhdGEgaW4geW91ciBTU1RhYmxlcyB0aGF0IG5ldmVyIG1ha2VzIGl0IHRvIHRoZSBDREMgbG9nLgorIyBjZGNfb25fcmVwYWlyX2VuYWJsZWQ6IHRydWUKKwogIyBDb21taXRMb2dTZWdtZW50cyBhcmUgbW92ZWQgdG8gdGhpcyBkaXJlY3Rvcnkgb24gZmx1c2ggaWYgY2RjX2VuYWJsZWQ6IHRydWUgYW5kIHRoZQogIyBzZWdtZW50IGNvbnRhaW5zIG11dGF0aW9ucyBmb3IgYSBDREMtZW5hYmxlZCB0YWJsZS4gVGhpcyBzaG91bGQgYmUgcGxhY2VkIG9uIGEKICMgc2VwYXJhdGUgc3BpbmRsZSB0aGFuIHRoZSBkYXRhIGRpcmVjdG9yaWVzLiBJZiBub3Qgc2V0LCB0aGUgZGVmYXVsdCBkaXJlY3RvcnkgaXMKQEAgLTM3Niw2ICs0MDMsOCBAQAogIyBOT1RFOiBpZiB5b3UgcmVkdWNlIHRoZSBzaXplLCB5b3UgbWF5IG5vdCBnZXQgeW91IGhvdHRlc3Qga2V5cyBsb2FkZWQgb24gc3RhcnR1cC4KICMKICMgRGVmYXVsdCB2YWx1ZSBpcyBlbXB0eSB0byBtYWtlIGl0ICJhdXRvIiAobWluKDUlIG9mIEhlYXAgKGluIE1pQiksIDEwME1pQikpLiBTZXQgdG8gMCB0byBkaXNhYmxlIGtleSBjYWNoZS4KKyMKKyMgVGhpcyBpcyBvbmx5IHJlbGV2YW50IHRvIFNTVGFibGUgZm9ybWF0cyB0aGF0IHVzZSBrZXkgY2FjaGUsIGUuZy4gQklHLgogIyBNaW4gdW5pdDogTWlCCiBrZXlfY2FjaGVfc2l6ZToKIApAQCAtMzg3LDEyICs0MTYsMTQgQEAKICMgdGVybXMgb2YgSS9PIGZvciB0aGUga2V5IGNhY2hlLiBSb3cgY2FjaGUgc2F2aW5nIGlzIG11Y2ggbW9yZSBleHBlbnNpdmUgYW5kCiAjIGhhcyBsaW1pdGVkIHVzZS4KICMKKyMgVGhpcyBpcyBvbmx5IHJlbGV2YW50IHRvIFNTVGFibGUgZm9ybWF0cyB0aGF0IHVzZSBrZXkgY2FjaGUsIGUuZy4gQklHLgogIyBEZWZhdWx0IGlzIDE0NDAwIG9yIDQgaG91cnMuCiAjIE1pbiB1bml0OiBzCiBrZXlfY2FjaGVfc2F2ZV9wZXJpb2Q6IDRoCiAKICMgTnVtYmVyIG9mIGtleXMgZnJvbSB0aGUga2V5IGNhY2hlIHRvIHNhdmUKICMgRGlzYWJsZWQgYnkgZGVmYXVsdCwgbWVhbmluZyBhbGwga2V5cyBhcmUgZ29pbmcgdG8gYmUgc2F2ZWQKKyMgVGhpcyBpcyBvbmx5IHJlbGV2YW50IHRvIFNTVGFibGUgZm9ybWF0cyB0aGF0IHVzZSBrZXkgY2FjaGUsIGUuZy4gQklHLgogIyBrZXlfY2FjaGVfa2V5c190b19zYXZlOiAxMDAKIAogIyBSb3cgY2FjaGUgaW1wbGVtZW50YXRpb24gY2xhc3MgbmFtZS4gQXZhaWxhYmxlIGltcGxlbWVudGF0aW9uczoKQEAgLTQwMSw3ICs0MzIsNyBAQAogIyAgIEZ1bGx5IG9mZi1oZWFwIHJvdyBjYWNoZSBpbXBsZW1lbnRhdGlvbiAoZGVmYXVsdCkuCiAjCiAjIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLlNlcmlhbGl6aW5nQ2FjaGVQcm92aWRlcgotIyAgIFRoaXMgaXMgdGhlIHJvdyBjYWNoZSBpbXBsZW1lbnRhdGlvbiBhdmFpbGFiaWxlCisjICAgVGhpcyBpcyB0aGUgcm93IGNhY2hlIGltcGxlbWVudGF0aW9uIGF2YWlsYWJsZQogIyAgIGluIHByZXZpb3VzIHJlbGVhc2VzIG9mIENhc3NhbmRyYS4KICMgcm93X2NhY2hlX2NsYXNzX25hbWU6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLk9IQ1Byb3ZpZGVyCiAKQEAgLTQ2OSw4ICs1MDAsOCBAQAogIyBNaW4gdW5pdDogcwogIyBjYWNoZV9sb2FkX3RpbWVvdXQ6IDMwcwogCi0jIGNvbW1pdGxvZ19zeW5jIG1heSBiZSBlaXRoZXIgInBlcmlvZGljIiwgImdyb3VwIiwgb3IgImJhdGNoLiIgCi0jIAorIyBjb21taXRsb2dfc3luYyBtYXkgYmUgZWl0aGVyICJwZXJpb2RpYyIsICJncm91cCIsIG9yICJiYXRjaC4iCisjCiAjIFdoZW4gaW4gYmF0Y2ggbW9kZSwgQ2Fzc2FuZHJhIHdvbid0IGFjayB3cml0ZXMgdW50aWwgdGhlIGNvbW1pdCBsb2cKICMgaGFzIGJlZW4gZmx1c2hlZCB0byBkaXNrLiAgRWFjaCBpbmNvbWluZyB3cml0ZSB3aWxsIHRyaWdnZXIgdGhlIGZsdXNoIHRhc2suCiAjIGNvbW1pdGxvZ19zeW5jX2JhdGNoX3dpbmRvd19pbl9tcyBpcyBhIGRlcHJlY2F0ZWQgdmFsdWUuIFByZXZpb3VzbHkgaXQgaGFkCkBAIC01NTEsNiArNTgyLDkgQEAKICAgICAgICMgc2VlZHMgaXMgYWN0dWFsbHkgYSBjb21tYS1kZWxpbWl0ZWQgbGlzdCBvZiBhZGRyZXNzZXMuCiAgICAgICAjIEV4OiAiPGlwMT4sPGlwMj4sPGlwMz4iCiAgICAgICAtIHNlZWRzOiAiMTI3LjAuMC4xOjcwMDAiCisgICAgICAjIElmIHNldCB0byAidHJ1ZSIsIFNpbXBsZVNlZWRQcm92aWRlciB3aWxsIHJldHVybiBhbGwgSVAgYWRkcmVzc2VzIGZvciBhIEROUyBuYW1lLAorICAgICAgIyBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCBuYW1lIHNlcnZpY2Ugb24gdGhlIHN5c3RlbS4gRGVmYXVsdHMgdG8gImZhbHNlIi4KKyAgICAgICMgIHJlc29sdmVfbXVsdGlwbGVfaXBfYWRkcmVzc2VzX3Blcl9kbnNfcmVjb3JkOiAiZmFsc2UiCiAKICMgRm9yIHdvcmtsb2FkcyB3aXRoIG1vcmUgZGF0YSB0aGFuIGNhbiBmaXQgaW4gbWVtb3J5LCBDYXNzYW5kcmEncwogIyBib3R0bGVuZWNrIHdpbGwgYmUgcmVhZHMgdGhhdCBuZWVkIHRvIGZldGNoIGRhdGEgZnJvbQpAQCAtODk2LDkgKzkzMCwxMSBAQAogIyBpbnRlcm5vZGVfc29ja2V0X3JlY2VpdmVfYnVmZmVyX3NpemU6CiAKICMgU2V0IHRvIHRydWUgdG8gaGF2ZSBDYXNzYW5kcmEgY3JlYXRlIGEgaGFyZCBsaW5rIHRvIGVhY2ggc3N0YWJsZQotIyBmbHVzaGVkIG9yIHN0cmVhbWVkIGxvY2FsbHkgaW4gYSBiYWNrdXBzLyBzdWJkaXJlY3Rvcnkgb2YgdGhlCi0jIGtleXNwYWNlIGRhdGEuICBSZW1vdmluZyB0aGVzZSBsaW5rcyBpcyB0aGUgb3BlcmF0b3IncwotIyByZXNwb25zaWJpbGl0eS4KKyMgZmx1c2hlZCBvciBzdHJlYW1lZCBsb2NhbGx5IGluIGEgYmFja3Vwcy8gc3ViZGlyZWN0b3J5IG9mIGFsbCB0aGUKKyMga2V5c3BhY2UgZGF0YSBpbiB0aGlzIG5vZGUuICBSZW1vdmluZyB0aGVzZSBsaW5rcyBpcyB0aGUgb3BlcmF0b3IncworIyByZXNwb25zaWJpbGl0eS4gVGhlIG9wZXJhdG9yIGNhbiBhbHNvIHR1cm4gb2ZmIGluY3JlbWVudGFsIGJhY2t1cHMgCisjIGZvciBzcGVjaWZpZWQgdGFibGUgYnkgc2V0dGluZyB0YWJsZSBwYXJhbWV0ZXIgaW5jcmVtZW50YWxfYmFja3VwcyB0byAKKyMgZmFsc2UsIHdoaWNoIGlzIHNldCB0byB0cnVlIGJ5IGRlZmF1bHQuIFNlZSBDQVNTQU5EUkEtMTU0MDIKIGluY3JlbWVudGFsX2JhY2t1cHM6IGZhbHNlCiAKICMgV2hldGhlciBvciBub3QgdG8gdGFrZSBhIHNuYXBzaG90IGJlZm9yZSBlYWNoIGNvbXBhY3Rpb24uICBCZQpAQCAtOTA4LDcgKzk0NCw3IEBACiBzbmFwc2hvdF9iZWZvcmVfY29tcGFjdGlvbjogZmFsc2UKIAogIyBXaGV0aGVyIG9yIG5vdCBhIHNuYXBzaG90IGlzIHRha2VuIG9mIHRoZSBkYXRhIGJlZm9yZSBrZXlzcGFjZSB0cnVuY2F0aW9uCi0jIG9yIGRyb3BwaW5nIG9mIGNvbHVtbiBmYW1pbGllcy4gVGhlIFNUUk9OR0xZIGFkdmlzZWQgZGVmYXVsdCBvZiB0cnVlIAorIyBvciBkcm9wcGluZyBvZiBjb2x1bW4gZmFtaWxpZXMuIFRoZSBTVFJPTkdMWSBhZHZpc2VkIGRlZmF1bHQgb2YgdHJ1ZQogIyBzaG91bGQgYmUgdXNlZCB0byBwcm92aWRlIGRhdGEgc2FmZXR5LiBJZiB5b3Ugc2V0IHRoaXMgZmxhZyB0byBmYWxzZSwgeW91IHdpbGwKICMgbG9zZSBkYXRhIG9uIHRydW5jYXRpb24gb3IgZHJvcC4KIGF1dG9fc25hcHNob3Q6IHRydWUKQEAgLTkyOCwxOCArOTY0LDMxIEBACiAjIHRha2luZyBhbmQgY2xlYXJpbmcgc25hcHNob3RzCiBzbmFwc2hvdF9saW5rc19wZXJfc2Vjb25kOiAwCiAKKyMgVGhlIHNzdGFibGUgZm9ybWF0cyBjb25maWd1cmF0aW9uLiBTU1RhYmxlIGZvcm1hdHMgaW1wbGVtZW50YXRpb25zIGFyZQorIyBsb2FkZWQgdXNpbmcgdGhlIHNlcnZpY2UgbG9hZGVyIG1lY2hhbmlzbS4gSW4gdGhpcyBzZWN0aW9uLCBvbmUgY2FuIHNlbGVjdAorIyB0aGUgZm9ybWF0IGZvciBjcmVhdGVkIHNzdGFibGVzIGFuZCBwYXNzIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3IgdGhlIGZvcm1hdHMKKyMgYXZhaWxhYmxlIG9uIHRoZSBjbGFzc3BhdGguCisjIFRoZSBkZWZhdWx0IGZvcm1hdCBpcyAiYmlnIiwgdGhlIGxlZ2FjeSBTU1RhYmxlIGZvcm1hdCBpbiB1c2Ugc2luY2UgQ2Fzc2FuZHJhIDMuMC4KKyMgQ2Fzc2FuZHJhIHZlcnNpb25zIDUuMCBhbmQgbGF0ZXIgYWxzbyBzdXBwb3J0IHRoZSB0cmllLWluZGV4ZWQgImJ0aSIgZm9ybWF0LAorIyB3aGljaCBvZmZlcnMgYmV0dGVyIHBlcmZvcm1hbmNlLgorI3NzdGFibGU6CisjICBzZWxlY3RlZF9mb3JtYXQ6IGJpZworCiAjIEdyYW51bGFyaXR5IG9mIHRoZSBjb2xsYXRpb24gaW5kZXggb2Ygcm93cyB3aXRoaW4gYSBwYXJ0aXRpb24uCi0jIEluY3JlYXNlIGlmIHlvdXIgcm93cyBhcmUgbGFyZ2UsIG9yIGlmIHlvdSBoYXZlIGEgdmVyeSBsYXJnZQotIyBudW1iZXIgb2Ygcm93cyBwZXIgcGFydGl0aW9uLiAgVGhlIGNvbXBldGluZyBnb2FscyBhcmUgdGhlc2U6CisjIEFwcGxpZXMgdG8gYm90aCBCSUcgYW5kIEJUSSBTU1RhYmxlIGZvcm1hdHMuIEluIGJvdGggZm9ybWF0cywKKyMgYSBzbWFsbGVyIGdyYW51bGFyaXR5IHJlc3VsdHMgaW4gZmFzdGVyIGxvb2t1cCBvZiByb3dzIHdpdGhpbgorIyBhIHBhcnRpdGlvbiwgYnV0IGEgYmlnZ2VyIGluZGV4IGZpbGUgc2l6ZS4KKyMgVXNpbmcgc21hbGxlciBncmFudWxhcml0aWVzIHdpdGggdGhlIEJJRyBmb3JtYXQgaXMgbm90IHJlY29tbWVuZGVkCisjIGJlY2F1c2UgYmlnZ2VyIGNvbGxhdGlvbiBpbmRleGVzIGNhbm5vdCBiZSBjYWNoZWQgZWZmaWNpZW50bHkKKyMgb3IgYXQgYWxsIGlmIHRoZXkgYmVjb21lIHN1ZmZpY2llbnRseSBsYXJnZS4gRnVydGhlciwgaWYKKyMgbGFyZ2Ugcm93cywgb3IgYSB2ZXJ5IGxhcmdlIG51bWJlciBvZiByb3dzIHBlciBwYXJ0aXRpb24gYXJlCisjIHByZXNlbnQsIGl0IGlzIHJlY29tbWVuZGVkIHRvIGluY3JlYXNlIHRoZSBpbmRleCBncmFudWxhcml0eQorIyBvciBzd2l0Y2ggdG8gdGhlIEJUSSBTU1RhYmxlIGZvcm1hdC4KICMKLSMgLSBhIHNtYWxsZXIgZ3JhbnVsYXJpdHkgbWVhbnMgbW9yZSBpbmRleCBlbnRyaWVzIGFyZSBnZW5lcmF0ZWQKLSMgICBhbmQgbG9va2luZyB1cCByb3dzIHdpdGhpbmcgdGhlIHBhcnRpdGlvbiBieSBjb2xsYXRpb24gY29sdW1uCi0jICAgaXMgZmFzdGVyCi0jIC0gYnV0LCBDYXNzYW5kcmEgd2lsbCBrZWVwIHRoZSBjb2xsYXRpb24gaW5kZXggaW4gbWVtb3J5IGZvciBob3QKLSMgICByb3dzIChhcyBwYXJ0IG9mIHRoZSBrZXkgY2FjaGUpLCBzbyBhIGxhcmdlciBncmFudWxhcml0eSBtZWFucwotIyAgIHlvdSBjYW4gY2FjaGUgbW9yZSBob3Qgcm93cworIyBMZWF2ZSB1bmRlZmluZWQgdG8gdXNlIGEgZGVmYXVsdCBzdWl0YWJsZSBmb3IgdGhlIFNTVGFibGUgZm9ybWF0CisjIGluIHVzZSAoNjQgS2lCIGZvciBCSUcsIDE2S2lCIGZvciBCVEkpLgogIyBNaW4gdW5pdDogS2lCCi1jb2x1bW5faW5kZXhfc2l6ZTogNjRLaUIKKyMgY29sdW1uX2luZGV4X3NpemU6IDRLaUIKIAogIyBQZXIgc3N0YWJsZSBpbmRleGVkIGtleSBjYWNoZSBlbnRyaWVzICh0aGUgY29sbGF0aW9uIGluZGV4IGluIG1lbW9yeQogIyBtZW50aW9uZWQgYWJvdmUpIGV4Y2VlZGluZyB0aGlzIHNpemUgd2lsbCBub3QgYmUgaGVsZCBvbiBoZWFwLgpAQCAtOTQ4LDYgKzk5Nyw4IEBACiAjCiAjIE5vdGUgdGhhdCB0aGlzIHNpemUgcmVmZXJzIHRvIHRoZSBzaXplIG9mIHRoZQogIyBzZXJpYWxpemVkIGluZGV4IGluZm9ybWF0aW9uIGFuZCBub3QgdGhlIHNpemUgb2YgdGhlIHBhcnRpdGlvbi4KKyMKKyMgVGhpcyBpcyBvbmx5IHJlbGV2YW50IHRvIFNTVGFibGUgZm9ybWF0cyB0aGF0IHVzZSBrZXkgY2FjaGUsIGUuZy4gQklHLgogIyBNaW4gdW5pdDogS2lCCiBjb2x1bW5faW5kZXhfY2FjaGVfc2l6ZTogMktpQgogCkBAIC05NjIsNyArMTAxMyw3IEBACiAjCiAjIGNvbmN1cnJlbnRfY29tcGFjdG9ycyBkZWZhdWx0cyB0byB0aGUgc21hbGxlciBvZiAobnVtYmVyIG9mIGRpc2tzLAogIyBudW1iZXIgb2YgY29yZXMpLCB3aXRoIGEgbWluaW11bSBvZiAyIGFuZCBhIG1heGltdW0gb2YgOC4KLSMgCisjCiAjIElmIHlvdXIgZGF0YSBkaXJlY3RvcmllcyBhcmUgYmFja2VkIGJ5IFNTRCwgeW91IHNob3VsZCBpbmNyZWFzZSB0aGlzCiAjIHRvIHRoZSBudW1iZXIgb2YgY29yZXMuCiAjIGNvbmN1cnJlbnRfY29tcGFjdG9yczogMQpAQCAtOTkwLDcgKzEwNDEsNyBAQAogCiAjIFdoZW4gY29tcGFjdGluZywgdGhlIHJlcGxhY2VtZW50IHNzdGFibGUocykgY2FuIGJlIG9wZW5lZCBiZWZvcmUgdGhleQogIyBhcmUgY29tcGxldGVseSB3cml0dGVuLCBhbmQgdXNlZCBpbiBwbGFjZSBvZiB0aGUgcHJpb3Igc3N0YWJsZXMgZm9yCi0jIGFueSByYW5nZSB0aGF0IGhhcyBiZWVuIHdyaXR0ZW4uIFRoaXMgaGVscHMgdG8gc21vb3RobHkgdHJhbnNmZXIgcmVhZHMgCisjIGFueSByYW5nZSB0aGF0IGhhcyBiZWVuIHdyaXR0ZW4uIFRoaXMgaGVscHMgdG8gc21vb3RobHkgdHJhbnNmZXIgcmVhZHMKICMgYmV0d2VlbiB0aGUgc3N0YWJsZXMsIHJlZHVjaW5nIHBhZ2UgY2FjaGUgY2h1cm4gYW5kIGtlZXBpbmcgaG90IHJvd3MgaG90CiAjIFNldCBzc3RhYmxlX3ByZWVtcHRpdmVfb3Blbl9pbnRlcnZhbCB0byBudWxsIGZvciBkaXNhYmxlZCB3aGljaCBpcyBlcXVpdmFsZW50IHRvCiAjIHNzdGFibGVfcHJlZW1wdGl2ZV9vcGVuX2ludGVydmFsX2luX21iIGJlaW5nIG5lZ2F0aXZlCkBAIC0xMTM4LDEwICsxMTg5LDEwIEBACiAjIEVuYWJsZSBvcGVyYXRpb24gdGltZW91dCBpbmZvcm1hdGlvbiBleGNoYW5nZSBiZXR3ZWVuIG5vZGVzIHRvIGFjY3VyYXRlbHkKICMgbWVhc3VyZSByZXF1ZXN0IHRpbWVvdXRzLiAgSWYgZGlzYWJsZWQsIHJlcGxpY2FzIHdpbGwgYXNzdW1lIHRoYXQgcmVxdWVzdHMKICMgd2VyZSBmb3J3YXJkZWQgdG8gdGhlbSBpbnN0YW50bHkgYnkgdGhlIGNvb3JkaW5hdG9yLCB3aGljaCBtZWFucyB0aGF0Ci0jIHVuZGVyIG92ZXJsb2FkIGNvbmRpdGlvbnMgd2Ugd2lsbCB3YXN0ZSB0aGF0IG11Y2ggZXh0cmEgdGltZSBwcm9jZXNzaW5nIAorIyB1bmRlciBvdmVybG9hZCBjb25kaXRpb25zIHdlIHdpbGwgd2FzdGUgdGhhdCBtdWNoIGV4dHJhIHRpbWUgcHJvY2Vzc2luZwogIyBhbHJlYWR5LXRpbWVkLW91dCByZXF1ZXN0cy4KICMKLSMgV2FybmluZzogSXQgaXMgZ2VuZXJhbGx5IGFzc3VtZWQgdGhhdCB1c2VycyBoYXZlIHNldHVwIE5UUCBvbiB0aGVpciBjbHVzdGVycywgYW5kIHRoYXQgY2xvY2tzIGFyZSBtb2Rlc3RseSBpbiBzeW5jLCAKKyMgV2FybmluZzogSXQgaXMgZ2VuZXJhbGx5IGFzc3VtZWQgdGhhdCB1c2VycyBoYXZlIHNldHVwIE5UUCBvbiB0aGVpciBjbHVzdGVycywgYW5kIHRoYXQgY2xvY2tzIGFyZSBtb2Rlc3RseSBpbiBzeW5jLAogIyBzaW5jZSB0aGlzIGlzIGEgcmVxdWlyZW1lbnQgZm9yIGdlbmVyYWwgY29ycmVjdG5lc3Mgb2YgbGFzdCB3cml0ZSB3aW5zLgogIyBpbnRlcm5vZGVfdGltZW91dDogdHJ1ZQogCkBAIC0xMzI5LDE3ICsxMzgwLDIzIEBACiAgIGxlZ2FjeV9zc2xfc3RvcmFnZV9wb3J0X2VuYWJsZWQ6IGZhbHNlCiAgICMgU2V0IHRvIGEgdmFsaWQga2V5c3RvcmUgaWYgaW50ZXJub2RlX2VuY3J5cHRpb24gaXMgZGMsIHJhY2sgb3IgYWxsCiAgIGtleXN0b3JlOiBjb25mLy5rZXlzdG9yZQotICBrZXlzdG9yZV9wYXNzd29yZDogY2Fzc2FuZHJhCisgICNrZXlzdG9yZV9wYXNzd29yZDogY2Fzc2FuZHJhCiAgICMgQ29uZmlndXJlIHRoZSB3YXkgQ2Fzc2FuZHJhIGNyZWF0ZXMgU1NMIGNvbnRleHRzLgogICAjIFRvIHVzZSBQRU0tYmFzZWQga2V5IG1hdGVyaWFsLCBzZWUgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VjdXJpdHkuUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeQogICAjIHNzbF9jb250ZXh0X2ZhY3Rvcnk6CiAgICMgICAgICMgTXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZWN1cml0eS5JU3NsQ29udGV4dEZhY3RvcnkKICAgIyAgICAgY2xhc3NfbmFtZTogb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VjdXJpdHkuRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5CisgICMgRHVyaW5nIGludGVybm9kZSBtVExTIGF1dGhlbnRpY2F0aW9uLCBpbmJvdW5kIGNvbm5lY3Rpb25zIChhY3RpbmcgYXMgc2VydmVycykgdXNlIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZAorICAjIGNvbnRhaW5pbmcgc2VydmVyIGNlcnRpZmljYXRlIHRvIGNyZWF0ZSBTU0xDb250ZXh0IGFuZAorICAjIG91dGJvdW5kIGNvbm5lY3Rpb25zIChhY3RpbmcgYXMgY2xpZW50cykgdXNlIG91dGJvdW5kX2tleXN0b3JlICYgb3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQgd2l0aCBjbGllbnQgY2VydGlmaWNhdGVzCisgICMgdG8gY3JlYXRlIFNTTENvbnRleHQuIEJ5IGRlZmF1bHQsIG91dGJvdW5kX2tleXN0b3JlIGlzIHRoZSBzYW1lIGFzIGtleXN0b3JlIGluZGljYXRpbmcgbVRMUyBpcyBub3QgZW5hYmxlZC4KKyMgIG91dGJvdW5kX2tleXN0b3JlOiBjb25mLy5rZXlzdG9yZQorIyAgb3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQ6IGNhc3NhbmRyYQogICAjIFZlcmlmeSBwZWVyIHNlcnZlciBjZXJ0aWZpY2F0ZXMKICAgcmVxdWlyZV9jbGllbnRfYXV0aDogZmFsc2UKICAgIyBTZXQgdG8gYSB2YWxpZCB0cnVzdG9yZSBpZiByZXF1aXJlX2NsaWVudF9hdXRoIGlzIHRydWUKICAgdHJ1c3RzdG9yZTogY29uZi8udHJ1c3RzdG9yZQotICB0cnVzdHN0b3JlX3Bhc3N3b3JkOiBjYXNzYW5kcmEKKyAgI3RydXN0c3RvcmVfcGFzc3dvcmQ6IGNhc3NhbmRyYQogICAjIFZlcmlmeSB0aGF0IHRoZSBob3N0IG5hbWUgaW4gdGhlIGNlcnRpZmljYXRlIG1hdGNoZXMgdGhlIGNvbm5lY3RlZCBob3N0CiAgIHJlcXVpcmVfZW5kcG9pbnRfdmVyaWZpY2F0aW9uOiBmYWxzZQogICAjIE1vcmUgYWR2YW5jZWQgZGVmYXVsdHM6CkBAIC0xMzczLDcgKzE0MzAsNyBAQAogICAjIG9wdGlvbmFsOiB0cnVlCiAgICMgU2V0IGtleXN0b3JlIGFuZCBrZXlzdG9yZV9wYXNzd29yZCB0byB2YWxpZCBrZXlzdG9yZXMgaWYgZW5hYmxlZCBpcyB0cnVlCiAgIGtleXN0b3JlOiBjb25mLy5rZXlzdG9yZQotICBrZXlzdG9yZV9wYXNzd29yZDogY2Fzc2FuZHJhCisgICNrZXlzdG9yZV9wYXNzd29yZDogY2Fzc2FuZHJhCiAgICMgQ29uZmlndXJlIHRoZSB3YXkgQ2Fzc2FuZHJhIGNyZWF0ZXMgU1NMIGNvbnRleHRzLgogICAjIFRvIHVzZSBQRU0tYmFzZWQga2V5IG1hdGVyaWFsLCBzZWUgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VjdXJpdHkuUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeQogICAjIHNzbF9jb250ZXh0X2ZhY3Rvcnk6CkBAIC0xMzgxLDYgKzE0MzgsNyBAQAogICAjICAgICBjbGFzc19uYW1lOiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZWN1cml0eS5EZWZhdWx0U3NsQ29udGV4dEZhY3RvcnkKICAgIyBWZXJpZnkgY2xpZW50IGNlcnRpZmljYXRlcwogICByZXF1aXJlX2NsaWVudF9hdXRoOiBmYWxzZQorICAjIHJlcXVpcmVfZW5kcG9pbnRfdmVyaWZpY2F0aW9uOiBmYWxzZQogICAjIFNldCB0cnVzdG9yZSBhbmQgdHJ1c3RzdG9yZV9wYXNzd29yZCBpZiByZXF1aXJlX2NsaWVudF9hdXRoIGlzIHRydWUKICAgIyB0cnVzdHN0b3JlOiBjb25mLy50cnVzdHN0b3JlCiAgICMgdHJ1c3RzdG9yZV9wYXNzd29yZDogY2Fzc2FuZHJhCkBAIC0xNDI2LDEyICsxNDg0LDYgQEAKICMgQXMgb2YgQ2Fzc2FuZHJhIDMuMCB0aGVyZSBpcyBhIHNhbmRib3ggaW4gcGxhY2UgdGhhdCBzaG91bGQgcHJldmVudCBleGVjdXRpb24gb2YgZXZpbCBjb2RlLgogdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkOiBmYWxzZQogCi0jIEVuYWJsZXMgc2NyaXB0ZWQgVURGcyAoSmF2YVNjcmlwdCBVREZzKS4KLSMgSmF2YSBVREZzIGFyZSBhbHdheXMgZW5hYmxlZCwgaWYgdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkIGlzIHRydWUuCi0jIEVuYWJsZSB0aGlzIG9wdGlvbiB0byBiZSBhYmxlIHRvIHVzZSBVREZzIHdpdGggImxhbmd1YWdlIGphdmFzY3JpcHQiIG9yIGFueSBjdXN0b20gSlNSLTIyMyBwcm92aWRlci4KLSMgVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCwgaWYgdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkIGlzIGZhbHNlLgotc2NyaXB0ZWRfdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkOiBmYWxzZQotCiAjIEVuYWJsZXMgZW5jcnlwdGluZyBkYXRhIGF0LXJlc3QgKG9uIGRpc2spLiBEaWZmZXJlbnQga2V5IHByb3ZpZGVycyBjYW4gYmUgcGx1Z2dlZCBpbiwgYnV0IHRoZSBkZWZhdWx0IHJlYWRzIGZyb20KICMgYSBKQ0Utc3R5bGUga2V5c3RvcmUuIEEgc2luZ2xlIGtleXN0b3JlIGNhbiBob2xkIG11bHRpcGxlIGtleXMsIGJ1dCB0aGUgb25lIHJlZmVyZW5jZWQgYnkKICMgdGhlICJrZXlfYWxpYXMiIGlzIHRoZSBvbmx5IGtleSB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgZW5jcnlwdCBvcGVydGFpb25zOyBwcmV2aW91c2x5IHVzZWQga2V5cwpAQCAtMTUwOCw3ICsxNTYwLDggQEAKICMgTG9nIFdBUk4gb24gYW55IGJhdGNoZXMgbm90IG9mIHR5cGUgTE9HR0VEIHRoYW4gc3BhbiBhY3Jvc3MgbW9yZSBwYXJ0aXRpb25zIHRoYW4gdGhpcyBsaW1pdAogdW5sb2dnZWRfYmF0Y2hfYWNyb3NzX3BhcnRpdGlvbnNfd2Fybl90aHJlc2hvbGQ6IDEwCiAKLSMgTG9nIGEgd2FybmluZyB3aGVuIGNvbXBhY3RpbmcgcGFydGl0aW9ucyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlCisjIExvZyBhIHdhcm5pbmcgd2hlbiBjb21wYWN0aW5nIHBhcnRpdGlvbnMgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZS4KKyMgQXMgb2YgQ2Fzc2FuZHJhIDUuMCwgdGhpcyBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBwYXJ0aXRpb25fc2l6ZV93YXJuX3RocmVzaG9sZC4KIGNvbXBhY3Rpb25fbGFyZ2VfcGFydGl0aW9uX3dhcm5pbmdfdGhyZXNob2xkOiAxMDBNaUIKIAogIyBMb2cgYSB3YXJuaW5nIHdoZW4gd3JpdGluZyBtb3JlIHRvbWJzdG9uZXMgdGhhbiB0aGlzIHZhbHVlIHRvIGEgcGFydGl0aW9uCkBAIC0xNTU3LDcgKzE2MTAsNyBAQAogIyBtYXhfY29uY3VycmVudF9hdXRvbWF0aWNfc3N0YWJsZV91cGdyYWRlczogMQogCiAjIEF1ZGl0IGxvZ2dpbmcgLSBMb2dzIGV2ZXJ5IGluY29taW5nIENRTCBjb21tYW5kIHJlcXVlc3QsIGF1dGhlbnRpY2F0aW9uIHRvIGEgbm9kZS4gU2VlIHRoZSBkb2NzCi0jIG9uIGF1ZGl0X2xvZ2dpbmcgZm9yIGZ1bGwgZGV0YWlscyBhYm91dCB0aGUgdmFyaW91cyBjb25maWd1cmF0aW9uIG9wdGlvbnMuCisjIG9uIGF1ZGl0X2xvZ2dpbmcgZm9yIGZ1bGwgZGV0YWlscyBhYm91dCB0aGUgdmFyaW91cyBjb25maWd1cmF0aW9uIG9wdGlvbnMgYW5kIHByb2R1Y3Rpb24gdGlwcy4KIGF1ZGl0X2xvZ2dpbmdfb3B0aW9uczoKICAgZW5hYmxlZDogZmFsc2UKICAgbG9nZ2VyOgpAQCAtMTU3MywxMSArMTYyNiwxMyBAQAogICAjIGJsb2NrOiB0cnVlCiAgICMgbWF4X3F1ZXVlX3dlaWdodDogMjY4NDM1NDU2ICMgMjU2IE1pQgogICAjIG1heF9sb2dfc2l6ZTogMTcxNzk4NjkxODQgIyAxNiBHaUIKLSAgIyMgYXJjaGl2ZSBjb21tYW5kIGlzICIvcGF0aC90by9zY3JpcHQuc2ggJXBhdGgiIHdoZXJlICVwYXRoIGlzIHJlcGxhY2VkIHdpdGggdGhlIGZpbGUgYmVpbmcgcm9sbGVkOgorICAjCisgICMjIElmIGFyY2hpdmVfY29tbWFuZCBpcyBlbXB0eSBvciB1bnNldCwgQ2Fzc2FuZHJhIHVzZXMgYSBidWlsdC1pbiBEZWxldGluZ0FyY2hpdmVyIHRoYXQgZGVsZXRlcyB0aGUgb2xkZXN0IGZpbGVzIGlmIGBgbWF4X2xvZ19zaXplYGAgaXMgcmVhY2hlZC4KKyAgIyMgSWYgYXJjaGl2ZV9jb21tYW5kIGlzIHNldCwgQ2Fzc2FuZHJhIGRvZXMgbm90IHVzZSBEZWxldGluZ0FyY2hpdmVyLCBzbyBpdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHNjcmlwdCB0byBtYWtlIGFueSByZXF1aXJlZCBjbGVhbnVwLgorICAjIyBFeGFtcGxlOiAiL3BhdGgvdG8vc2NyaXB0LnNoICVwYXRoIiB3aGVyZSAlcGF0aCBpcyByZXBsYWNlZCB3aXRoIHRoZSBmaWxlIGJlaW5nIHJvbGxlZC4KICAgIyBhcmNoaXZlX2NvbW1hbmQ6CiAgICMgbWF4X2FyY2hpdmVfcmV0cmllczogMTAKIAotCiAjIGRlZmF1bHQgb3B0aW9ucyBmb3IgZnVsbCBxdWVyeSBsb2dnaW5nIC0gdGhlc2UgY2FuIGJlIG92ZXJyaWRkZW4gZnJvbSBjb21tYW5kIGxpbmUgd2hlbiBleGVjdXRpbmcKICMgbm9kZXRvb2wgZW5hYmxlZnVsbHF1ZXJ5bG9nCiAjIGZ1bGxfcXVlcnlfbG9nZ2luZ19vcHRpb25zOgpAQCAtMTYzNyw2ICsxNjkyLDE0IEBACiAjIHdhcm1pbmcgb2YgYXV0aCBjYWNoZXMgcHJpb3IgdG8gbm9kZSBjb21wbGV0aW5nIHN0YXJ0dXAuIFNlZSBDQVNTQU5EUkEtMTY5NTgKICMgYXV0aF9jYWNoZV93YXJtaW5nX2VuYWJsZWQ6IGZhbHNlCiAKKyMgSWYgZW5hYmxlZCwgZHluYW1pYyBkYXRhIG1hc2tpbmcgYWxsb3dzIHRvIGF0dGFjaCBDUUwgbWFza2luZyBmdW5jdGlvbnMgdG8gdGhlIGNvbHVtbnMgb2YgYSB0YWJsZS4KKyMgVXNlcnMgd2l0aG91dCB0aGUgVU5NQVNLIHBlcm1pc3Npb24gd2lsbCBzZWUgYW4gb2JzY3VyZWQgdmVyc2lvbiBvZiB0aGUgdmFsdWVzIG9mIHRoZSBjb2x1bW5zIHdpdGggYW4gYXR0YWNoZWQgbWFzay4KKyMgSWYgZHluYW1pYyBkYXRhIG1hc2tpbmcgaXMgZGlzYWJsZWQgaXQgd29uJ3QgYmUgYWxsb3dlZCB0byBjcmVhdGUgbmV3IGNvbHVtbiBtYXNrcywgYWx0aG91Z2ggaXQgd2lsbCBzdGlsbCBiZSBwb3NzaWJsZQorIyB0byBkcm9wIGFueSBwcmV2aW91c2x5IGV4aXN0aW5nIG1hc2tzLiBBbHNvLCBhbnkgZXhpc3RpbmcgbWFzayB3aWxsIGJlIGlnbm9yZWQgYXQgcXVlcnkgdGltZSwgc28gYWxsIHVzZXJzIHdpbGwgc2VlCisjIHRoZSBjbGVhciB2YWx1ZXMgb2YgdGhlIG1hc2tlZCBjb2x1bW5zLgorIyBEZWZhdWx0cyB0byBmYWxzZSB0byBkaXNhYmxlIGR5bmFtaWMgZGF0YSBtYXNraW5nLgorIyBkeW5hbWljX2RhdGFfbWFza2luZ19lbmFibGVkOiBmYWxzZQorCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIEVYUEVSSU1FTlRBTCBGRUFUVVJFUyAjCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0xNjkxLDU4ICsxNzU0LDExMiBAQAogIyBUaGUgdHdvIHRocmVzaG9sZHMgZGVmYXVsdCB0byAtMSB0byBkaXNhYmxlLgogIyBrZXlzcGFjZXNfd2Fybl90aHJlc2hvbGQ6IC0xCiAjIGtleXNwYWNlc19mYWlsX3RocmVzaG9sZDogLTEKKyMKICMgR3VhcmRyYWlsIHRvIHdhcm4gb3IgZmFpbCB3aGVuIGNyZWF0aW5nIG1vcmUgdXNlciB0YWJsZXMgdGhhbiB0aHJlc2hvbGQuCiAjIFRoZSB0d28gdGhyZXNob2xkcyBkZWZhdWx0IHRvIC0xIHRvIGRpc2FibGUuCiAjIHRhYmxlc193YXJuX3RocmVzaG9sZDogLTEKICMgdGFibGVzX2ZhaWxfdGhyZXNob2xkOiAtMQorIwogIyBHdWFyZHJhaWwgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIGFiaWxpdHkgdG8gY3JlYXRlIHVuY29tcHJlc3NlZCB0YWJsZXMKICMgdW5jb21wcmVzc2VkX3RhYmxlc19lbmFibGVkOiB0cnVlCisjCiAjIEd1YXJkcmFpbCB0byB3YXJuIG9yIGZhaWwgd2hlbiBjcmVhdGluZy9hbHRlcmluZyBhIHRhYmxlIHdpdGggbW9yZSBjb2x1bW5zIHBlciB0YWJsZSB0aGFuIHRocmVzaG9sZC4KICMgVGhlIHR3byB0aHJlc2hvbGRzIGRlZmF1bHQgdG8gLTEgdG8gZGlzYWJsZS4KICMgY29sdW1uc19wZXJfdGFibGVfd2Fybl90aHJlc2hvbGQ6IC0xCiAjIGNvbHVtbnNfcGVyX3RhYmxlX2ZhaWxfdGhyZXNob2xkOiAtMQorIwogIyBHdWFyZHJhaWwgdG8gd2FybiBvciBmYWlsIHdoZW4gY3JlYXRpbmcgbW9yZSBzZWNvbmRhcnkgaW5kZXhlcyBwZXIgdGFibGUgdGhhbiB0aHJlc2hvbGQuCiAjIFRoZSB0d28gdGhyZXNob2xkcyBkZWZhdWx0IHRvIC0xIHRvIGRpc2FibGUuCiAjIHNlY29uZGFyeV9pbmRleGVzX3Blcl90YWJsZV93YXJuX3RocmVzaG9sZDogLTEKICMgc2Vjb25kYXJ5X2luZGV4ZXNfcGVyX3RhYmxlX2ZhaWxfdGhyZXNob2xkOiAtMQorIwogIyBHdWFyZHJhaWwgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHNlY29uZGFyeSBpbmRleGVzCiAjIHNlY29uZGFyeV9pbmRleGVzX2VuYWJsZWQ6IHRydWUKKyMKICMgR3VhcmRyYWlsIHRvIHdhcm4gb3IgZmFpbCB3aGVuIGNyZWF0aW5nIG1vcmUgbWF0ZXJpYWxpemVkIHZpZXdzIHBlciB0YWJsZSB0aGFuIHRocmVzaG9sZC4KICMgVGhlIHR3byB0aHJlc2hvbGRzIGRlZmF1bHQgdG8gLTEgdG8gZGlzYWJsZS4KICMgbWF0ZXJpYWxpemVkX3ZpZXdzX3Blcl90YWJsZV93YXJuX3RocmVzaG9sZDogLTEKICMgbWF0ZXJpYWxpemVkX3ZpZXdzX3Blcl90YWJsZV9mYWlsX3RocmVzaG9sZDogLTEKKyMKICMgR3VhcmRyYWlsIHRvIHdhcm4gYWJvdXQsIGlnbm9yZSBvciByZWplY3QgcHJvcGVydGllcyB3aGVuIGNyZWF0aW5nIHRhYmxlcy4gQnkgZGVmYXVsdCBhbGwgcHJvcGVydGllcyBhcmUgYWxsb3dlZC4KICMgdGFibGVfcHJvcGVydGllc193YXJuZWQ6IFtdCiAjIHRhYmxlX3Byb3BlcnRpZXNfaWdub3JlZDogW10KICMgdGFibGVfcHJvcGVydGllc19kaXNhbGxvd2VkOiBbXQorIwogIyBHdWFyZHJhaWwgdG8gYWxsb3cvZGlzYWxsb3cgdXNlci1wcm92aWRlZCB0aW1lc3RhbXBzLiBEZWZhdWx0cyB0byB0cnVlLgogIyB1c2VyX3RpbWVzdGFtcHNfZW5hYmxlZDogdHJ1ZQorIworIyBHdWFyZHJhaWwgdG8gYm91bmQgdXNlci1wcm92aWRlZCB0aW1lc3RhbXBzIHdpdGhpbiBhIGdpdmVuIHJhbmdlLiBEZWZhdWx0IGlzIGluZmluaXRlIChkZW5vdGVkIGJ5IG51bGwpLgorIyBBY2NlcHRlZCB2YWx1ZXMgYXJlIGR1cmF0aW9ucyBvZiB0aGUgZm9ybSAxMmgsIDI0aCwgZXRjLgorIyBtYXhpbXVtX3RpbWVzdGFtcF93YXJuX3RocmVzaG9sZDoKKyMgbWF4aW11bV90aW1lc3RhbXBfZmFpbF90aHJlc2hvbGQ6CisjIG1pbmltdW1fdGltZXN0YW1wX3dhcm5fdGhyZXNob2xkOgorIyBtaW5pbXVtX3RpbWVzdGFtcF9mYWlsX3RocmVzaG9sZDoKKyMKICMgR3VhcmRyYWlsIHRvIGFsbG93L2Rpc2FsbG93IEdST1VQIEJZIGZ1bmN0aW9uYWxpdHkuCiAjIGdyb3VwX2J5X2VuYWJsZWQ6IHRydWUKKyMKICMgR3VhcmRyYWlsIHRvIGFsbG93L2Rpc2FsbG93IFRSVU5DQVRFIGFuZCBEUk9QIFRBQkxFIHN0YXRlbWVudHMKICMgZHJvcF90cnVuY2F0ZV90YWJsZV9lbmFibGVkOiB0cnVlCisjCisjIEd1YXJkcmFpbCB0byBhbGxvdy9kaXNhbGxvdyBEUk9QIEtFWVNQQUNFIHN0YXRlbWVudHMKKyMgZHJvcF9rZXlzcGFjZV9lbmFibGVkOiB0cnVlCisjCiAjIEd1YXJkcmFpbCB0byB3YXJuIG9yIGZhaWwgd2hlbiB1c2luZyBhIHBhZ2Ugc2l6ZSBncmVhdGVyIHRoYW4gdGhyZXNob2xkLgogIyBUaGUgdHdvIHRocmVzaG9sZHMgZGVmYXVsdCB0byAtMSB0byBkaXNhYmxlLgogIyBwYWdlX3NpemVfd2Fybl90aHJlc2hvbGQ6IC0xCiAjIHBhZ2Vfc2l6ZV9mYWlsX3RocmVzaG9sZDogLTEKKyMKICMgR3VhcmRyYWlsIHRvIGFsbG93L2Rpc2FsbG93IGxpc3Qgb3BlcmF0aW9ucyB0aGF0IHJlcXVpcmUgcmVhZCBiZWZvcmUgd3JpdGUsIGkuZS4gc2V0dGluZyBsaXN0IGVsZW1lbnQgYnkgaW5kZXggYW5kCiAjIHJlbW92aW5nIGxpc3QgZWxlbWVudHMgYnkgZWl0aGVyIGluZGV4IG9yIHZhbHVlLiBEZWZhdWx0cyB0byB0cnVlLgogIyByZWFkX2JlZm9yZV93cml0ZV9saXN0X29wZXJhdGlvbnNfZW5hYmxlZDogdHJ1ZQorIwogIyBHdWFyZHJhaWwgdG8gd2FybiBvciBmYWlsIHdoZW4gcXVlcnlpbmcgd2l0aCBhbiBJTiByZXN0cmljdGlvbiBzZWxlY3RpbmcgbW9yZSBwYXJ0aXRpb24ga2V5cyB0aGFuIHRocmVzaG9sZC4KICMgVGhlIHR3byB0aHJlc2hvbGRzIGRlZmF1bHQgdG8gLTEgdG8gZGlzYWJsZS4KICMgcGFydGl0aW9uX2tleXNfaW5fc2VsZWN0X3dhcm5fdGhyZXNob2xkOiAtMQogIyBwYXJ0aXRpb25fa2V5c19pbl9zZWxlY3RfZmFpbF90aHJlc2hvbGQ6IC0xCisjCiAjIEd1YXJkcmFpbCB0byB3YXJuIG9yIGZhaWwgd2hlbiBhbiBJTiBxdWVyeSBjcmVhdGVzIGEgY2FydGVzaWFuIHByb2R1Y3Qgd2l0aCBhIHNpemUgZXhjZWVkaW5nIHRocmVzaG9sZCwKICMgZWcuICJhIGluICgxLDIsLi4uMTApIGFuZCBiIGluICgxLDIuLi4xMCkiIHJlc3VsdHMgaW4gY2FydGVzaWFuIHByb2R1Y3Qgb2YgMTAwLgogIyBUaGUgdHdvIHRocmVzaG9sZHMgZGVmYXVsdCB0byAtMSB0byBkaXNhYmxlLgogIyBpbl9zZWxlY3RfY2FydGVzaWFuX3Byb2R1Y3Rfd2Fybl90aHJlc2hvbGQ6IC0xCiAjIGluX3NlbGVjdF9jYXJ0ZXNpYW5fcHJvZHVjdF9mYWlsX3RocmVzaG9sZDogLTEKKyMKICMgR3VhcmRyYWlsIHRvIHdhcm4gYWJvdXQgb3IgcmVqZWN0IHJlYWQgY29uc2lzdGVuY3kgbGV2ZWxzLiBCeSBkZWZhdWx0LCBhbGwgY29uc2lzdGVuY3kgbGV2ZWxzIGFyZSBhbGxvd2VkLgogIyByZWFkX2NvbnNpc3RlbmN5X2xldmVsc193YXJuZWQ6IFtdCiAjIHJlYWRfY29uc2lzdGVuY3lfbGV2ZWxzX2Rpc2FsbG93ZWQ6IFtdCisjCiAjIEd1YXJkcmFpbCB0byB3YXJuIGFib3V0IG9yIHJlamVjdCB3cml0ZSBjb25zaXN0ZW5jeSBsZXZlbHMuIEJ5IGRlZmF1bHQsIGFsbCBjb25zaXN0ZW5jeSBsZXZlbHMgYXJlIGFsbG93ZWQuCiAjIHdyaXRlX2NvbnNpc3RlbmN5X2xldmVsc193YXJuZWQ6IFtdCiAjIHdyaXRlX2NvbnNpc3RlbmN5X2xldmVsc19kaXNhbGxvd2VkOiBbXQorIworIyBHdWFyZHJhaWwgdG8gd2FybiBvciBmYWlsIHdoZW4gd3JpdGluZyBwYXJ0aXRpb25zIGxhcmdlciB0aGFuIHRocmVzaG9sZCwgZXhwcmVzc2VkIGFzIDEwME1pQiwgMUdpQiwgZXRjLgorIyBUaGUgZ3VhcmRyYWlsIGlzIG9ubHkgY2hlY2tlZCB3aGVuIHdyaXRpbmcgc3N0YWJsZXMgKGZsdXNoIGFuZCBjb21wYWN0aW9uKSwgYW5kIGV4Y2VlZGluZyB0aGUgZmFpbCB0aHJlc2hvbGQgb24gdGhhdAorIyBtb21lbnQgd2lsbCBvbmx5IGxvZyBhbiBlcnJvciBtZXNzYWdlLCB3aXRob3V0IGludGVycnVwdGluZyB0aGUgb3BlcmF0aW9uLgorIyBUaGlzIG9wZXJhdGVzIG9uIGEgcGVyLXNzdGFibGUgYmFzaXMsIHNvIGl0IHdvbid0IGRldGVjdCBhIGxhcmdlIHBhcnRpdGlvbiBpZiBpdCBpcyBzcHJlYWQgYWNyb3NzIG11bHRpcGxlIHNzdGFibGVzLgorIyBUaGUgd2FybmluZyB0aHJlc2hvbGQgcmVwbGFjZXMgdGhlIGRlcHJlY2F0ZWQgY29uZmlnIHByb3BlcnR5IGNvbXBhY3Rpb25fbGFyZ2VfcGFydGl0aW9uX3dhcm5pbmdfdGhyZXNob2xkLgorIyBUaGUgdHdvIHRocmVzaG9sZHMgZGVmYXVsdCB0byBudWxsIHRvIGRpc2FibGUuCisjIHBhcnRpdGlvbl9zaXplX3dhcm5fdGhyZXNob2xkOgorIyBwYXJ0aXRpb25fc2l6ZV9mYWlsX3RocmVzaG9sZDoKKyMKKyMgR3VhcmRyYWlsIHRvIHdhcm4gb3IgZmFpbCB3aGVuIHdyaXRpbmcgY29sdW1uIHZhbHVlcyBsYXJnZXIgdGhhbiB0aHJlc2hvbGQuCisjIFRoaXMgZ3VhcmRyYWlsIGlzIG9ubHkgYXBwbGllZCB0byB0aGUgdmFsdWVzIG9mIHJlZ3VsYXIgY29sdW1ucyBiZWNhdXNlIGJvdGggdGhlIHNlcmlhbGl6ZWQgcGFydGl0aW9ucyBrZXlzIGFuZCB0aGUKKyMgdmFsdWVzIG9mIHRoZSBjb21wb25lbnRzIG9mIHRoZSBjbHVzdGVyaW5nIGtleSBhbHJlYWR5IGhhdmUgYSBmaXhlZCwgcmVsYXRpdmVseSBzbWFsbCBzaXplIGxpbWl0IG9mIDY1NTM1IGJ5dGVzLCB3aGljaAorIyBpcyBwcm9iYWJseSBsZXNzZXIgdGhhbiB0aGUgdGhyZXNob2xkcyBkZWZpbmVkIGhlcmUuCisjIERlbGV0aW5nIGluZGl2aWR1YWwgZWxlbWVudHMgb2Ygbm9uLWZyb3plbiBzZXRzIGFuZCBtYXBzIGludm9sdmVzIGNyZWF0aW5nIHRvbWJzdG9uZXMgdGhhdCBjb250YWluIHRoZSB2YWx1ZSBvZiB0aGUKKyMgZGVsZXRlZCBlbGVtZW50LCBpbmRlcGVuZGVudGx5IG9uIHdoZXRoZXIgdGhlIGVsZW1lbnQgZXhpc3RlZCBvciBub3QuIFRoYXQgdG9tYnN0b25lIHZhbHVlIGlzIGFsc28gZ3VhcmRlZCBieSB0aGlzCisjIGd1YXJkcmFpbCwgdG8gcHJldmVudCB0aGUgaW5zZXJ0aW9uIG9mIHRvbWJzdG9uZXMgb3ZlciB0aGUgdGhyZXNob2xkLiBUaGUgZG93bnNpZGUgaXMgdGhhdCBlbmFibGluZyBvciByYWlzaW5nIHRoaXMKKyMgdGhyZXNob2xkIGNhbiBwcmV2ZW50IHVzZXJzIGZyb20gZGVsZXRpbmcgc2V0L21hcCBlbGVtZW50cyB0aGF0IHdlcmUgd3JpdHRlbiB3aGVuIHRoZSBndWFyZHJhaWwgd2FzIGRpc2FibGVkIG9yIHdpdGggYQorIyBsb3dlciB2YWx1ZS4gRGVsZXRpbmcgdGhlIGVudGlyZSBjb2x1bW4sIHJvdyBvciBwYXJ0aXRpb24gaXMgYWx3YXlzIGFsbG93ZWQsIHNpbmNlIHRoZSB0b21ic3RvbmVzIGNyZWF0ZWQgZm9yIHRob3NlCisjIG9wZXJhdGlvbnMgZG9uJ3QgY29udGFpbiB0aGUgQ1FMIGNvbHVtbiB2YWx1ZXMuCisjIFRoaXMgZ3VhcmRyYWlsIGlzIGRpZmZlcmVudCB0byBtYXhfdmFsdWVfc2l6ZS4gbWF4X3ZhbHVlX3NpemUgaXMgY2hlY2tlZCB3aGVuIGRlc2VyaWFsaXppbmcgYW55IHZhbHVlIHRvIGRldGVjdAorIyBzc3RhYmxlIGNvcnJ1cHRpb24sIHdoZXJlYXMgdGhpcyBndWFyZHJhaWwgaXMgY2hlY2tlZCBvbiB0aGUgQ1FMIGxheWVyIGF0IHdyaXRlIHRpbWUgdG8gcmVqZWN0IHJlZ3VsYXIgdXNlciBxdWVyaWVzCisjIGluc2VydGluZyB0b28gbGFyZ2UgY29sdW1ucy4KKyMgVGhlIHR3byB0aHJlc2hvbGRzIGRlZmF1bHQgdG8gbnVsbCB0byBkaXNhYmxlLgorIyBNaW4gdW5pdDogQgorIyBjb2x1bW5fdmFsdWVfc2l6ZV93YXJuX3RocmVzaG9sZDoKKyMgY29sdW1uX3ZhbHVlX3NpemVfZmFpbF90aHJlc2hvbGQ6CisjCiAjIEd1YXJkcmFpbCB0byB3YXJuIG9yIGZhaWwgd2hlbiBlbmNvdW50ZXJpbmcgbGFyZ2VyIHNpemUgb2YgY29sbGVjdGlvbiBkYXRhIHRoYW4gdGhyZXNob2xkLgogIyBBdCBxdWVyeSB0aW1lIHRoaXMgZ3VhcmRyYWlsIGlzIGFwcGxpZWQgb25seSB0byB0aGUgY29sbGVjdGlvbiBmcmFnbWVudCB0aGF0IGlzIGJlaW5nIHdyaXRlbiwgZXZlbiB0aG91Z2ggaW4gdGhlIGNhc2UKICMgb2Ygbm9uLWZyb3plbiBjb2xsZWN0aW9ucyB0aGVyZSBjb3VsZCBiZSB1bmFjY291bnRlZCBwYXJ0cyBvZiB0aGUgY29sbGVjdGlvbiBvbiB0aGUgc3N0YWJsZXMuIFRoaXMgaXMgZG9uZSB0aGlzIHdheSB0bwpAQCAtMTc1Myw2ICsxODcwLDcgQEAKICMgY29sbGVjdGlvbl9zaXplX3dhcm5fdGhyZXNob2xkOgogIyBNaW4gdW5pdDogQgogIyBjb2xsZWN0aW9uX3NpemVfZmFpbF90aHJlc2hvbGQ6CisjCiAjIEd1YXJkcmFpbCB0byB3YXJuIG9yIGZhaWwgd2hlbiBlbmNvdW50ZXJpbmcgbW9yZSBlbGVtZW50cyBpbiBjb2xsZWN0aW9uIHRoYW4gdGhyZXNob2xkLgogIyBBdCBxdWVyeSB0aW1lIHRoaXMgZ3VhcmRyYWlsIGlzIGFwcGxpZWQgb25seSB0byB0aGUgY29sbGVjdGlvbiBmcmFnbWVudCB0aGF0IGlzIGJlaW5nIHdyaXRlbiwgZXZlbiB0aG91Z2ggaW4gdGhlIGNhc2UKICMgb2Ygbm9uLWZyb3plbiBjb2xsZWN0aW9ucyB0aGVyZSBjb3VsZCBiZSB1bmFjY291bnRlZCBwYXJ0cyBvZiB0aGUgY29sbGVjdGlvbiBvbiB0aGUgc3N0YWJsZXMuIFRoaXMgaXMgZG9uZSB0aGlzIHdheSB0bwpAQCAtMTc2MSwxMiArMTg3OSwyMiBAQAogIyBUaGUgdHdvIHRocmVzaG9sZHMgZGVmYXVsdCB0byAtMSB0byBkaXNhYmxlLgogIyBpdGVtc19wZXJfY29sbGVjdGlvbl93YXJuX3RocmVzaG9sZDogLTEKICMgaXRlbXNfcGVyX2NvbGxlY3Rpb25fZmFpbF90aHJlc2hvbGQ6IC0xCisjCiAjIEd1YXJkcmFpbCB0byBhbGxvdy9kaXNhbGxvdyBxdWVyeWluZyB3aXRoIEFMTE9XIEZJTFRFUklORy4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyMgQUxMT1cgRklMVEVSSU5HIGNhbiBwb3RlbnRpYWxseSB2aXNpdCBhbGwgdGhlIGRhdGEgaW4gdGhlIHRhYmxlIGFuZCBoYXZlIHVucHJlZGljdGFibGUgcGVyZm9ybWFuY2UuCiAjIGFsbG93X2ZpbHRlcmluZ19lbmFibGVkOiB0cnVlCisjCisjIEd1YXJkcmFpbCB0byBhbGxvdy9kaXNhbGxvdyBzZXR0aW5nIFNpbXBsZVN0cmF0ZWd5IHZpYSBrZXlzcGFjZSBjcmVhdGlvbiBvciBhbHRlcmF0aW9uLiBEZWZhdWx0cyB0byB0cnVlLgorIyBzaW1wbGVzdHJhdGVneV9lbmFibGVkOiB0cnVlCisjCiAjIEd1YXJkcmFpbCB0byB3YXJuIG9yIGZhaWwgd2hlbiBjcmVhdGluZyBhIHVzZXItZGVmaW5lZC10eXBlIHdpdGggbW9yZSBmaWVsZHMgaW4gdGhhbiB0aHJlc2hvbGQuCiAjIERlZmF1bHQgLTEgdG8gZGlzYWJsZS4KICMgZmllbGRzX3Blcl91ZHRfd2Fybl90aHJlc2hvbGQ6IC0xCiAjIGZpZWxkc19wZXJfdWR0X2ZhaWxfdGhyZXNob2xkOiAtMQorIworIyBHdWFyZHJhaWwgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdXNlcnMgYXJlIGFsbG93ZWQgdG8gdXNlIEFMVEVSIFRBQkxFIGNvbW1hbmRzIHRvIG1ha2UgY29sdW1uIGNoYW5nZXMgdG8gdGFibGVzCisjIGFsdGVyX3RhYmxlX2VuYWJsZWQ6IHRydWUKKyMKICMgR3VhcmRyYWlsIHRvIHdhcm4gb3IgZmFpbCB3aGVuIGxvY2FsIGRhdGEgZGlzayB1c2FnZSBwZXJjZW50YWdlIGV4Y2VlZHMgdGhyZXNob2xkLiBWYWxpZCB2YWx1ZXMgYXJlIGluIFsxLCAxMDBdLgogIyBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgdGhlIGRpc2tzIHN0b3JpbmcgZGF0YSBkaXJlY3Rvcmllcywgc28gaXQgd29uJ3QgY291bnQgYW55IHNlcGFyYXRlIGRpc2tzIHVzZWQgZm9yIHN0b3JpbmcKICMgdGhlIGNvbW1pdGxvZywgaGludHMgbm9yIHNhdmVkIGNhY2hlcy4gVGhlIGRpc2sgdXNhZ2UgaXMgdGhlIHJhdGlvIGJldHdlZW4gdGhlIGFtb3VudCBvZiBzcGFjZSB1c2VkIGJ5IHRoZSBkYXRhCkBAIC0xNzc4LDcgKzE5MDYsOCBAQAogIyBUaGUgdHdvIHRocmVzaG9sZHMgZGVmYXVsdCB0byAtMSB0byBkaXNhYmxlLgogIyBkYXRhX2Rpc2tfdXNhZ2VfcGVyY2VudGFnZV93YXJuX3RocmVzaG9sZDogLTEKICMgZGF0YV9kaXNrX3VzYWdlX3BlcmNlbnRhZ2VfZmFpbF90aHJlc2hvbGQ6IC0xCi0jIEFsbG93cyBkZWZpbmluZyB0aGUgbWF4IGRpc2sgc2l6ZSBvZiB0aGUgZGF0YSBkaXJlY3RvcmllcyB3aGVuIGNhbGN1bGF0aW5nIHRocmVzaG9sZHMgZm9yCisjCisjIEd1YXJkcmFpbCB0aGF0IGFsbG93cyB1c2VycyB0byBkZWZpbmUgdGhlIG1heCBkaXNrIHNpemUgb2YgdGhlIGRhdGEgZGlyZWN0b3JpZXMgd2hlbiBjYWxjdWxhdGluZyB0aHJlc2hvbGRzIGZvcgogIyBkaXNrX3VzYWdlX3BlcmNlbnRhZ2Vfd2Fybl90aHJlc2hvbGQgYW5kIGRpc2tfdXNhZ2VfcGVyY2VudGFnZV9mYWlsX3RocmVzaG9sZCwgc28gaWYgdGhpcyBpcyBncmVhdGVyIHRoYW4gemVybyB0aGV5CiAjIGJlY29tZSBwZXJjZW50YWdlcyBvZiBhIGZpeGVkIHNpemUgb24gZGlzayBpbnN0ZWFkIG9mIHBlcmNlbnRhZ2VzIG9mIHRoZSBwaHlzaWNhbGx5IGF2YWlsYWJsZSBkaXNrIHNpemUuIFRoaXMgc2hvdWxkCiAjIGJlIHVzZWZ1bCB3aGVuIHdlIGhhdmUgYSBsYXJnZSBkaXNrIGFuZCB3ZSBvbmx5IHdhbnQgdG8gdXNlIGEgcGFydCBvZiBpdCBmb3IgQ2Fzc2FuZHJhJ3MgZGF0YSBkaXJlY3Rvcmllcy4KQEAgLTE3ODYsMTEgKzE5MTUsMzAgQEAKICMgRGVmYXVsdHMgdG8gbnVsbCB0byBkaXNhYmxlIGFuZCB1c2UgdGhlIHBoeXNpY2FsbHkgYXZhaWxhYmxlIGRpc2sgc2l6ZSBvZiBkYXRhIGRpcmVjdG9yaWVzIGR1cmluZyBjYWxjdWxhdGlvbnMuCiAjIE1pbiB1bml0OiBCCiAjIGRhdGFfZGlza191c2FnZV9tYXhfZGlza19zaXplOgorIwogIyBHdWFyZHJhaWwgdG8gd2FybiBvciBmYWlsIHdoZW4gdGhlIG1pbmltdW0gcmVwbGljYXRpb24gZmFjdG9yIGlzIGxlc3NlciB0aGFuIHRocmVzaG9sZC4KICMgVGhpcyB3b3VsZCBhbHNvIGFwcGx5IHRvIHN5c3RlbSBrZXlzcGFjZXMuCiAjIFN1Z2dlc3RlZCB2YWx1ZSBmb3IgdXNlIGluIHByb2R1Y3Rpb246IDIgb3IgaGlnaGVyCiAjIG1pbmltdW1fcmVwbGljYXRpb25fZmFjdG9yX3dhcm5fdGhyZXNob2xkOiAtMQogIyBtaW5pbXVtX3JlcGxpY2F0aW9uX2ZhY3Rvcl9mYWlsX3RocmVzaG9sZDogLTEKKyMKKyMgR3VhcmRyYWlsIHRvIHdhcm4gb3IgZmFpbCB3aGVuIHRoZSBtYXhpbXVtIHJlcGxpY2F0aW9uIGZhY3RvciBpcyBncmVhdGVyIHRoYW4gdGhyZXNob2xkLgorIyBUaGlzIHdvdWxkIGFsc28gYXBwbHkgdG8gc3lzdGVtIGtleXNwYWNlcy4KKyMgbWF4aW11bV9yZXBsaWNhdGlvbl9mYWN0b3Jfd2Fybl90aHJlc2hvbGQ6IC0xCisjIG1heGltdW1fcmVwbGljYXRpb25fZmFjdG9yX2ZhaWxfdGhyZXNob2xkOiAtMQorCisjIEd1YXJkcmFpbCB0byBlbmFibGUgYSBDUkVBVEUgb3IgQUxURVIgVEFCTEUgc3RhdGVtZW50IHdoZW4gZGVmYXVsdF90aW1lX3RvX2xpdmUgaXMgc2V0IHRvIDAKKyMgYW5kIHRoZSB0YWJsZSBpcyB1c2luZyBUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5IGNvbXBhY3Rpb24gb3IgYSBzdWJjbGFzcyBvZiBpdC4KKyMgSXQgaXMgc3VzcGljaW91cyB0byB1c2UgZGVmYXVsdF90aW1lX3RvX2xpdmUgc2V0IHRvIDAgd2l0aCBzdWNoIGNvbXBhY3Rpb24gc3RyYXRlZ3kuCisjIFBsZWFzZSBrZWVwIGluIG1pbmQgdGhhdCBkYXRhIHdpbGwgbm90IHN0YXJ0IHRvIGF1dG9tYXRpY2FsbHkgZXhwaXJlIGFmdGVyIHRoZXkgYXJlIG9sZGVyIHRoYW4KKyMgYSByZXNwZWN0aXZlIGNvbXBhY3Rpb24gd2luZG93IHVuaXQgb2YgYSBjZXJ0YWluIHNpemUuIFBsZWFzZSBzZXQgVFRMIGZvciB5b3VyIElOU0VSVCBvciBVUERBVEUKKyMgc3RhdGVtZW50cyBpZiB5b3UgZXhwZWN0IGRhdGEgdG8gYmUgZXhwaXJlZCBhcyB0YWJsZSBzZXR0aW5ncyB3aWxsIG5vdCBkbyBpdC4KKyMgRGVmYXVsdHMgdG8gdHJ1ZS4gSWYgc2V0IHRvIGZhbHNlLCBzdWNoIHN0YXRlbWVudHMgZmFpbCBhbmQgemVyb190dGxfb25fdHdjc193YXJuZWQgZmxhZyBpcyBpcnJlbGV2YW50LgorI3plcm9fdHRsX29uX3R3Y3NfZW5hYmxlZDogdHJ1ZQorIyBHdWFyZHJhaWwgdG8gd2FybiBhIHVzZXIgdXBvbiBleGVjdXRpbmcgQ1JFQVRFIG9yIEFMVEVSIFRBQkxFIHN0YXRlbWVudCB3aGVuIGRlZmF1bHRfdGltZV90b19saXZlIGlzIHNldCB0byAwCisjIGFuZCB0aGUgdGFibGUgaXMgdXNpbmcgVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneSBjb21wYWN0aW9uIG9yIGEgc3ViY2xhc3Mgb2YgaXQuIERlZmF1bHRzIHRvIHRydWUuCisjIGlmIHplcm9fdHRsX29uX3R3Y3NfZW5hYmxlZCBpcyBzZXQgdG8gZmFsc2UsIHRoaXMgcHJvcGVydHkgaXMgaXJyZWxldmFudCBhcyBzdWNoIHN0YXRlbWVudHMgd2lsbCBmYWlsLgorI3plcm9fdHRsX29uX3R3Y3Nfd2FybmVkOiB0cnVlCiAKICMgU3RhcnR1cCBDaGVja3MgYXJlIGV4ZWN1dGVkIGFzIHBhcnQgb2YgQ2Fzc2FuZHJhIHN0YXJ0dXAgcHJvY2Vzcywgbm90IGFsbCBvZiB0aGVtCiAjIGFyZSBjb25maWd1cmFibGUgKHNvIHlvdSBjYW4gZGlzYWJsZSB0aGVtKSBidXQgdGhlc2Ugd2hpY2ggYXJlIGVudW1lcmF0ZWQgYmVsbG93LgpkaWZmIC0tZ2l0IGEvY29uZi9jcWxzaHJjLnNhbXBsZSBiL2NvbmYvY3Fsc2hyYy5zYW1wbGUKaW5kZXggNDg3OGI1OC4uNTYwMTFmNCAxMDA2NDQKLS0tIGEvY29uZi9jcWxzaHJjLnNhbXBsZQorKysgYi9jb25mL2NxbHNocmMuc2FtcGxlCkBAIC0xNSw3ICsxNSw3IEBACiA7IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKIDsgdW5kZXIgdGhlIExpY2Vuc2UuCiA7Ci07IFNhbXBsZSB+Ly5jcWxzaHJjIGZpbGUuCis7IFNhbXBsZSB+Ly5jYXNzYW5kcmEvY3Fsc2hyYyBmaWxlLgogCiBbYXV0aGVudGljYXRpb25dCiA7OyBJZiBDYXNzYW5kcmEgaGFzIGF1dGggZW5hYmxlZCwgZmlsbCBvdXQgdGhlc2Ugb3B0aW9ucwpAQCAtMjMsNyArMjMsNiBAQAogOyBjcmVkZW50aWFscyA9IH4vLmNhc3NhbmRyYS9jcmVkZW50aWFscwogOyBrZXlzcGFjZSA9IGtzMQogCi0KIFthdXRoX3Byb3ZpZGVyXQogOzsgeW91IGNhbiBzcGVjaWZ5IGFueSBhdXRoIHByb3ZpZGVyIGZvdW5kIGluIHlvdXIgcHl0aG9uIGVudmlyb25tZW50CiA7OyBtb2R1bGUgYW5kIGNsYXNzIHdpbGwgYmUgdXNlZCB0byBkeW5hbWljYWxseSBsb2FkIHRoZSBjbGFzcwpAQCAtMzMsNiArMzIsMTAgQEAKIDsgY2xhc3NuYW1lID0gUGxhaW5UZXh0QXV0aFByb3ZpZGVyCiA7IHVzZXJuYW1lID0gdXNlcjEKIAorW3Byb3RvY29sXQorOzsgU3BlY2lmeSBhIHNwZWNpZmljIHByb3Rjb2wgdmVyc2lvbiBvdGhlcndpc2UgdGhlIGNsaWVudCB3aWxsIGRlZmF1bHQgYW5kIGRvd25ncmFkZSBhcyBuZWNlc3NhcnkKKzsgdmVyc2lvbiA9IE5vbmUKKwogW3VpXQogOzsgV2hldGhlciBvciBub3QgdG8gZGlzcGxheSBxdWVyeSByZXN1bHRzIHdpdGggY29sb3JzCiA7IGNvbG9yID0gb24KQEAgLTE1Myw5ICsxNTYsOCBAQAogOyBib29sc3R5bGUgPSBUcnVlLEZhbHNlCiAKIDs7IFRoZSBudW1iZXIgb2YgY2hpbGQgd29ya2VyIHByb2Nlc3NlcyB0byBjcmVhdGUgZm9yCi07OyBDT1BZIHRhc2tzLiAgRGVmYXVsdHMgdG8gYSBtYXggb2YgNCBmb3IgQ09QWSBGUk9NIGFuZCAxNgotOzsgZm9yIENPUFkgVE8uICBIb3dldmVyLCBhdCBtb3N0IChudW1fY29yZXMgLSAxKSBwcm9jZXNzZXMKLTs7IHdpbGwgYmUgY3JlYXRlZC4KKzs7IENPUFkgdGFza3MuICBEZWZhdWx0cyB0byAxNiBmb3IgYENPUFlgIHRhc2tzLgorOzsgSG93ZXZlciwgYXQgbW9zdCAobnVtX2NvcmVzIC0gMSkgcHJvY2Vzc2VzIHdpbGwgYmUgY3JlYXRlZC4KIDsgbnVtcHJvY2Vzc2VzID0KIAogOzsgVGhlIG1heGltdW0gbnVtYmVyIG9mIGZhaWxlZCBhdHRlbXB0cyB0byBmZXRjaCBhIHJhbmdlIG9mIGRhdGEgKHdoZW4gdXNpbmcKZGlmZiAtLWdpdCBhL2NvbmYvanZtLXNlcnZlci5vcHRpb25zIGIvY29uZi9qdm0tc2VydmVyLm9wdGlvbnMKaW5kZXggNDY5NjdmNC4uYTYzOWVlNSAxMDA2NDQKLS0tIGEvY29uZi9qdm0tc2VydmVyLm9wdGlvbnMKKysrIGIvY29uZi9qdm0tc2VydmVyLm9wdGlvbnMKQEAgLTEwOCw5ICsxMDgsNiBAQAogIyB0cmFuc3BhcmVudCBodWdlcGFnZSBhbGxvY2F0aW9uIG1vcmUgZWZmZWN0aXZlLgogLVhYOitBbHdheXNQcmVUb3VjaAogCi0jIERpc2FibGUgYmlhc2VkIGxvY2tpbmcgYXMgaXQgZG9lcyBub3QgYmVuZWZpdCBDYXNzYW5kcmEuCi0tWFg6LVVzZUJpYXNlZExvY2tpbmcKLQogIyBFbmFibGUgdGhyZWFkLWxvY2FsIGFsbG9jYXRpb24gYmxvY2tzIGFuZCBhbGxvdyB0aGUgSlZNIHRvIGF1dG9tYXRpY2FsbHkKICMgcmVzaXplIHRoZW0gYXQgcnVudGltZS4KIC1YWDorVXNlVExBQgpkaWZmIC0tZ2l0IGEvY29uZi9qdm0xMS1zZXJ2ZXIub3B0aW9ucyBiL2NvbmYvanZtMTEtc2VydmVyLm9wdGlvbnMKaW5kZXggMWZjMzUwMy4uNWZkMWYyNiAxMDA2NDQKLS0tIGEvY29uZi9qdm0xMS1zZXJ2ZXIub3B0aW9ucworKysgYi9jb25mL2p2bTExLXNlcnZlci5vcHRpb25zCkBAIC00LDYgKzQsMTUgQEAKICMgU2VlIGp2bS1zZXJ2ZXIub3B0aW9ucy4gVGhpcyBmaWxlIGlzIHNwZWNpZmljIGZvciBKYXZhIDExIGFuZCBuZXdlci4gICAgIwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEdFTkVSQUwgSlZNIFNFVFRJTkdTICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIERpc2FibGUgYmlhc2VkIGxvY2tpbmcgYXMgaXQgZG9lcyBub3QgYmVuZWZpdCBDYXNzYW5kcmEuCistWFg6LVVzZUJpYXNlZExvY2tpbmcKKworCiAjIyMjIyMjIyMjIyMjIyMjIwogIyAgR0MgU0VUVElOR1MgICMKICMjIyMjIyMjIyMjIyMjIyMjCkBAIC0xMSw0MSArMjAsNDEgQEAKIAogCiAjIyMgQ01TIFNldHRpbmdzCi0tWFg6K1VzZUNvbmNNYXJrU3dlZXBHQwotLVhYOitDTVNQYXJhbGxlbFJlbWFya0VuYWJsZWQKLS1YWDpTdXJ2aXZvclJhdGlvPTgKLS1YWDpNYXhUZW51cmluZ1RocmVzaG9sZD0xCi0tWFg6Q01TSW5pdGlhdGluZ09jY3VwYW5jeUZyYWN0aW9uPTc1Ci0tWFg6K1VzZUNNU0luaXRpYXRpbmdPY2N1cGFuY3lPbmx5Ci0tWFg6Q01TV2FpdER1cmF0aW9uPTEwMDAwCi0tWFg6K0NNU1BhcmFsbGVsSW5pdGlhbE1hcmtFbmFibGVkCi0tWFg6K0NNU0VkZW5DaHVua3NSZWNvcmRBbHdheXMKKyMjLVhYOitVc2VDb25jTWFya1N3ZWVwR0MKKyMjLVhYOitDTVNQYXJhbGxlbFJlbWFya0VuYWJsZWQKKyMjLVhYOlN1cnZpdm9yUmF0aW89OAorIyMtWFg6TWF4VGVudXJpbmdUaHJlc2hvbGQ9MQorIyMtWFg6Q01TSW5pdGlhdGluZ09jY3VwYW5jeUZyYWN0aW9uPTc1CisjIy1YWDorVXNlQ01TSW5pdGlhdGluZ09jY3VwYW5jeU9ubHkKKyMjLVhYOkNNU1dhaXREdXJhdGlvbj0xMDAwMAorIyMtWFg6K0NNU1BhcmFsbGVsSW5pdGlhbE1hcmtFbmFibGVkCisjIy1YWDorQ01TRWRlbkNodW5rc1JlY29yZEFsd2F5cwogIyMgc29tZSBKVk1zIHdpbGwgZmlsbCB1cCB0aGVpciBoZWFwIHdoZW4gYWNjZXNzZWQgdmlhIEpNWCwgc2VlIENBU1NBTkRSQS02NTQxCi0tWFg6K0NNU0NsYXNzVW5sb2FkaW5nRW5hYmxlZAorIyMtWFg6K0NNU0NsYXNzVW5sb2FkaW5nRW5hYmxlZAogCiAKIAogIyMjIEcxIFNldHRpbmdzCiAjIyBVc2UgdGhlIEhvdHNwb3QgZ2FyYmFnZS1maXJzdCBjb2xsZWN0b3IuCi0jLVhYOitVc2VHMUdDCi0jLVhYOitQYXJhbGxlbFJlZlByb2NFbmFibGVkCi0jLVhYOk1heFRlbnVyaW5nVGhyZXNob2xkPTEKLSMtWFg6RzFIZWFwUmVnaW9uU2l6ZT0xNm0KKy1YWDorVXNlRzFHQworLVhYOitQYXJhbGxlbFJlZlByb2NFbmFibGVkCistWFg6TWF4VGVudXJpbmdUaHJlc2hvbGQ9MQorLVhYOkcxSGVhcFJlZ2lvblNpemU9MTZtCiAKICMKICMjIEhhdmUgdGhlIEpWTSBkbyBsZXNzIHJlbWVtYmVyZWQgc2V0IHdvcmsgZHVyaW5nIFNUVywgaW5zdGVhZAogIyMgcHJlZmVycmluZyBjb25jdXJyZW50IEdDLiBSZWR1Y2VzIHA5OS45IGxhdGVuY3kuCi0jLVhYOkcxUlNldFVwZGF0aW5nUGF1c2VUaW1lUGVyY2VudD01CistWFg6RzFSU2V0VXBkYXRpbmdQYXVzZVRpbWVQZXJjZW50PTUKICMKICMjIE1haW4gRzFHQyB0dW5hYmxlOiBsb3dlcmluZyB0aGUgcGF1c2UgdGFyZ2V0IHdpbGwgbG93ZXIgdGhyb3VnaHB1dCBhbmQgdmlzZSB2ZXJzYS4KICMjIDIwMG1zIGlzIHRoZSBKVk0gZGVmYXVsdCBhbmQgbG93ZXN0IHZpYWJsZSBzZXR0aW5nCiAjIyAxMDAwbXMgaW5jcmVhc2VzIHRocm91Z2hwdXQuIEtlZXAgaXQgc21hbGxlciB0aGFuIHRoZSB0aW1lb3V0cyBpbiBjYXNzYW5kcmEueWFtbC4KLSMtWFg6TWF4R0NQYXVzZU1pbGxpcz0zMDAKKy1YWDpNYXhHQ1BhdXNlTWlsbGlzPTMwMAogCiAjIyBPcHRpb25hbCBHMSBTZXR0aW5ncwogIyBTYXZlIENQVSB0aW1lIG9uIGxhcmdlICg+PSAxNkdCKSBoZWFwcyBieSBkZWxheWluZyByZWdpb24gc2Nhbm5pbmcKICMgdW50aWwgdGhlIGhlYXAgaXMgNzAlIGZ1bGwuIFRoZSBkZWZhdWx0IGluIEhvdHNwb3QgOHU0MCBpcyA0MCUuCi0jLVhYOkluaXRpYXRpbmdIZWFwT2NjdXBhbmN5UGVyY2VudD03MAorLVhYOkluaXRpYXRpbmdIZWFwT2NjdXBhbmN5UGVyY2VudD03MAogCiAjIEZvciBzeXN0ZW1zIHdpdGggPiA4IGNvcmVzLCB0aGUgZGVmYXVsdCBQYXJhbGxlbEdDVGhyZWFkcyBpcyA1LzggdGhlIG51bWJlciBvZiBsb2dpY2FsIGNvcmVzLgogIyBPdGhlcndpc2UgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBjb3JlcyB3aGVuIDggb3IgbGVzcy4KQEAgLTYxLDYgKzcwLDcgQEAKIC1EamRrLmF0dGFjaC5hbGxvd0F0dGFjaFNlbGY9dHJ1ZQogLS1hZGQtZXhwb3J0cyBqYXZhLmJhc2UvamRrLmludGVybmFsLm1pc2M9QUxMLVVOTkFNRUQKIC0tYWRkLWV4cG9ydHMgamF2YS5iYXNlL2pkay5pbnRlcm5hbC5yZWY9QUxMLVVOTkFNRUQKKy0tYWRkLWV4cG9ydHMgamF2YS5iYXNlL2pkay5pbnRlcm5hbC51dGlsPUFMTC1VTk5BTUVECiAtLWFkZC1leHBvcnRzIGphdmEuYmFzZS9zdW4ubmlvLmNoPUFMTC1VTk5BTUVECiAtLWFkZC1leHBvcnRzIGphdmEubWFuYWdlbWVudC5ybWkvY29tLnN1bi5qbXgucmVtb3RlLmludGVybmFsLnJtaT1BTEwtVU5OQU1FRAogLS1hZGQtZXhwb3J0cyBqYXZhLnJtaS9zdW4ucm1pLnJlZ2lzdHJ5PUFMTC1VTk5BTUVECmRpZmYgLS1naXQgYS9jb25mL2p2bTE3LWNsaWVudHMub3B0aW9ucyBiL2NvbmYvanZtMTctY2xpZW50cy5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMDZmZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb25mL2p2bTE3LWNsaWVudHMub3B0aW9ucwpAQCAtMCwwICsxLDY5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgICAgICAgICAgICAgICAgICAgICAgICAganZtMTctY2xpZW50cy5vcHRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIFNlZSBqdm0tY2xpZW50cy5vcHRpb25zLiBUaGlzIGZpbGUgaXMgc3BlY2lmaWMgZm9yIEphdmEgMTcgYW5kIG5ld2VyLiAgICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyMjIyMjIyMjIyMjIyMjIyMjCisjICBKUE1TIFNFVFRJTkdTICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy1EamRrLmF0dGFjaC5hbGxvd0F0dGFjaFNlbGY9dHJ1ZQorLS1hZGQtZXhwb3J0cyBqYXZhLmJhc2UvamRrLmludGVybmFsLm1pc2M9QUxMLVVOTkFNRUQKKy0tYWRkLWV4cG9ydHMgamF2YS5iYXNlL2pkay5pbnRlcm5hbC5yZWY9QUxMLVVOTkFNRUQKKy0tYWRkLWV4cG9ydHMgamF2YS5iYXNlL3N1bi5uaW8uY2g9QUxMLVVOTkFNRUQKKy0tYWRkLWV4cG9ydHMgamF2YS5tYW5hZ2VtZW50LnJtaS9jb20uc3VuLmpteC5yZW1vdGUuaW50ZXJuYWwucm1pPUFMTC1VTk5BTUVECistLWFkZC1leHBvcnRzIGphdmEucm1pL3N1bi5ybWkucmVnaXN0cnk9QUxMLVVOTkFNRUQKKy0tYWRkLWV4cG9ydHMgamF2YS5ybWkvc3VuLnJtaS5zZXJ2ZXI9QUxMLVVOTkFNRUQKKy0tYWRkLWV4cG9ydHMgamF2YS5zcWwvamF2YS5zcWw9QUxMLVVOTkFNRUQKKy0tYWRkLWV4cG9ydHMgamRrLnVuc3VwcG9ydGVkL3N1bi5taXNjPUFMTC1VTk5BTUVECistLWFkZC1leHBvcnRzIGpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLmZpbGU9QUxMLVVOTkFNRUQKKy0tYWRkLWV4cG9ydHMgamRrLmF0dGFjaC9zdW4udG9vbHMuYXR0YWNoPUFMTC1VTk5BTUVECisKKworLS1hZGQtb3BlbnMgamF2YS5iYXNlL2phdmEubGFuZy5tb2R1bGU9QUxMLVVOTkFNRUQKKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qZGsuaW50ZXJuYWwubG9hZGVyPUFMTC1VTk5BTUVECistLWFkZC1vcGVucyBqYXZhLmJhc2UvamRrLmludGVybmFsLnJlZj1BTEwtVU5OQU1FRAorLS1hZGQtb3BlbnMgamF2YS5iYXNlL2pkay5pbnRlcm5hbC5yZWZsZWN0PUFMTC1VTk5BTUVECistLWFkZC1vcGVucyBqYXZhLmJhc2UvamRrLmludGVybmFsLm1hdGg9QUxMLVVOTkFNRUQKKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qZGsuaW50ZXJuYWwubW9kdWxlPUFMTC1VTk5BTUVECistLWFkZC1vcGVucyBqYXZhLmJhc2UvamRrLmludGVybmFsLnV0aWwuamFyPUFMTC1VTk5BTUVECistLWFkZC1vcGVucyBqZGsubWFuYWdlbWVudC9jb20uc3VuLm1hbmFnZW1lbnQuaW50ZXJuYWw9QUxMLVVOTkFNRUQKKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9zdW4ubmlvLmNoPUFMTC1VTk5BTUVECisjIHRvIGJlIGFkZHJlc3NlZCBpbiBDQVNTQU5EUkEtMTc4NTAKKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9zdW4ubmlvLmNoPUFMTC1VTk5BTUVECistLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS5pbz1BTEwtVU5OQU1FRAorLS1hZGQtb3BlbnMgamF2YS5iYXNlL2phdmEubmlvPUFMTC1VTk5BTUVECisjIHRvIGJlIGFkZHJlc3NlZCBkdXJpbmcgamFtbSBtYWludGVuYW5jZQorLS1hZGQtb3BlbnMgamF2YS5iYXNlL2phdmEudXRpbC5jb25jdXJyZW50PUFMTC1VTk5BTUVECistLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS51dGlsPUFMTC1VTk5BTUVECistLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljPUFMTC1VTk5BTUVECisjIGphbW0gYW5kIHRoZSBpbi1qdm0gdGVzdHMuLi4KKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLmxhbmc9QUxMLVVOTkFNRUQKKyMgamFtbQorLS1hZGQtb3BlbnMgamF2YS5iYXNlL2phdmEubWF0aD1BTEwtVU5OQU1FRAorLS1hZGQtb3BlbnMgamRrLmNvbXBpbGVyL2NvbS5zdW4udG9vbHMuamF2YWM9QUxMLVVOTkFNRUQKKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLmxhbmc9QUxMLVVOTkFNRUQKKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLmxhbmcucmVmbGVjdD1BTEwtVU5OQU1FRAorI2phbW0gcG9zdCBDQVNTQU5EUkEtMTcxOTkKKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLm5ldD1BTEwtVU5OQU1FRAorCisjIFRoZSBuZXdsaW5lIGluIHRoZSBlbmQgb2YgZmlsZSBpcyBpbnRlbnRpb25hbApkaWZmIC0tZ2l0IGEvY29uZi9qdm0xNy1zZXJ2ZXIub3B0aW9ucyBiL2NvbmYvanZtMTctc2VydmVyLm9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhNzBhMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbmYvanZtMTctc2VydmVyLm9wdGlvbnMKQEAgLTAsMCArMSwxMzQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgICAgICAgICAgICAgICAgICAgICAgICBqdm0xNy1zZXJ2ZXIub3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgU2VlIGp2bS1zZXJ2ZXIub3B0aW9ucy4gVGhpcyBmaWxlIGlzIHNwZWNpZmljIGZvciBKYXZhIDE3IGFuZCBuZXdlci4gICAgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIyMjIyMjIyMjIyMjIyMjCisjICBHQyBTRVRUSU5HUyAgIworIyMjIyMjIyMjIyMjIyMjIyMKKworCisKKyMjIyBHMSBTZXR0aW5ncworIyMgVXNlIHRoZSBIb3RzcG90IGdhcmJhZ2UtZmlyc3QgY29sbGVjdG9yLgorLVhYOitVc2VHMUdDCistWFg6K1BhcmFsbGVsUmVmUHJvY0VuYWJsZWQKKy1YWDpNYXhUZW51cmluZ1RocmVzaG9sZD0xCistWFg6RzFIZWFwUmVnaW9uU2l6ZT0xNm0KKworIworIyMgSGF2ZSB0aGUgSlZNIGRvIGxlc3MgcmVtZW1iZXJlZCBzZXQgd29yayBkdXJpbmcgU1RXLCBpbnN0ZWFkCisjIyBwcmVmZXJyaW5nIGNvbmN1cnJlbnQgR0MuIFJlZHVjZXMgcDk5LjkgbGF0ZW5jeS4KKy1YWDpHMVJTZXRVcGRhdGluZ1BhdXNlVGltZVBlcmNlbnQ9NQorIworIyMgTWFpbiBHMUdDIHR1bmFibGU6IGxvd2VyaW5nIHRoZSBwYXVzZSB0YXJnZXQgd2lsbCBsb3dlciB0aHJvdWdocHV0IGFuZCB2aXNlIHZlcnNhLgorIyMgMjAwbXMgaXMgdGhlIEpWTSBkZWZhdWx0IGFuZCBsb3dlc3QgdmlhYmxlIHNldHRpbmcKKyMjIDEwMDBtcyBpbmNyZWFzZXMgdGhyb3VnaHB1dC4gS2VlcCBpdCBzbWFsbGVyIHRoYW4gdGhlIHRpbWVvdXRzIGluIGNhc3NhbmRyYS55YW1sLgorLVhYOk1heEdDUGF1c2VNaWxsaXM9MzAwCisKKyMjIE9wdGlvbmFsIEcxIFNldHRpbmdzCisjIFNhdmUgQ1BVIHRpbWUgb24gbGFyZ2UgKD49IDE2R0IpIGhlYXBzIGJ5IGRlbGF5aW5nIHJlZ2lvbiBzY2FubmluZworIyB1bnRpbCB0aGUgaGVhcCBpcyA3MCUgZnVsbC4gVGhlIGRlZmF1bHQgaW4gSG90c3BvdCA4dTQwIGlzIDQwJS4KKy1YWDpJbml0aWF0aW5nSGVhcE9jY3VwYW5jeVBlcmNlbnQ9NzAKKworIyBGb3Igc3lzdGVtcyB3aXRoID4gOCBjb3JlcywgdGhlIGRlZmF1bHQgUGFyYWxsZWxHQ1RocmVhZHMgaXMgNS84IHRoZSBudW1iZXIgb2YgbG9naWNhbCBjb3Jlcy4KKyMgT3RoZXJ3aXNlIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgY29yZXMgd2hlbiA4IG9yIGxlc3MuCisjIE1hY2hpbmVzIHdpdGggPiAxMCBjb3JlcyBzaG91bGQgdHJ5IHNldHRpbmcgdGhlc2UgdG8gPD0gZnVsbCBjb3Jlcy4KKyMtWFg6UGFyYWxsZWxHQ1RocmVhZHM9MTYKKyMgQnkgZGVmYXVsdCwgQ29uY0dDVGhyZWFkcyBpcyAxLzQgb2YgUGFyYWxsZWxHQ1RocmVhZHMuCisjIFNldHRpbmcgYm90aCB0byB0aGUgc2FtZSB2YWx1ZSBjYW4gcmVkdWNlIFNUVyBkdXJhdGlvbnMuCisjLVhYOkNvbmNHQ1RocmVhZHM9MTYKKworCisjIyMgSlBNUworCistRGpkay5hdHRhY2guYWxsb3dBdHRhY2hTZWxmPXRydWUKKy0tYWRkLWV4cG9ydHMgamF2YS5iYXNlL2pkay5pbnRlcm5hbC5taXNjPUFMTC1VTk5BTUVECistLWFkZC1leHBvcnRzIGphdmEuYmFzZS9qZGsuaW50ZXJuYWwucmVmPUFMTC1VTk5BTUVECisjIGh0dHBzOi8vY2hyb25pY2xlLnNvZnR3YXJlL2Nocm9uaWNsZS1zdXBwb3J0LWphdmEtMTcvCistLWFkZC1leHBvcnRzIGphdmEuYmFzZS9zdW4ubmlvLmNoPUFMTC1VTk5BTUVECistLWFkZC1leHBvcnRzIGphdmEubWFuYWdlbWVudC5ybWkvY29tLnN1bi5qbXgucmVtb3RlLmludGVybmFsLnJtaT1BTEwtVU5OQU1FRAorLS1hZGQtZXhwb3J0cyBqYXZhLnJtaS9zdW4ucm1pLnJlZ2lzdHJ5PUFMTC1VTk5BTUVECistLWFkZC1leHBvcnRzIGphdmEucm1pL3N1bi5ybWkuc2VydmVyPUFMTC1VTk5BTUVECistLWFkZC1leHBvcnRzIGphdmEuc3FsL2phdmEuc3FsPUFMTC1VTk5BTUVECisKKyNjaHJvbmljbGUsIEF1ZGl0TG9nIGh0dHBzOi8vY2hyb25pY2xlLnNvZnR3YXJlL2Nocm9uaWNsZS1zdXBwb3J0LWphdmEtMTcvCistLWFkZC1leHBvcnRzIGphdmEuYmFzZS9qYXZhLmxhbmcucmVmPUFMTC1VTk5BTUVECistLWFkZC1leHBvcnRzIGphdmEuYmFzZS9qZGsuaW50ZXJuYWwudXRpbD1BTEwtVU5OQU1FRAorLS1hZGQtZXhwb3J0cyBqZGsudW5zdXBwb3J0ZWQvc3VuLm1pc2M9QUxMLVVOTkFNRUQKKy0tYWRkLWV4cG9ydHMgamRrLmNvbXBpbGVyL2NvbS5zdW4udG9vbHMuamF2YWMuZmlsZT1BTEwtVU5OQU1FRAorCistLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS5sYW5nLm1vZHVsZT1BTEwtVU5OQU1FRAorLS1hZGQtb3BlbnMgamF2YS5iYXNlL2pkay5pbnRlcm5hbC5sb2FkZXI9QUxMLVVOTkFNRUQKKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qZGsuaW50ZXJuYWwucmVmPUFMTC1VTk5BTUVECistLWFkZC1vcGVucyBqYXZhLmJhc2UvamRrLmludGVybmFsLnJlZmxlY3Q9QUxMLVVOTkFNRUQKKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qZGsuaW50ZXJuYWwubWF0aD1BTEwtVU5OQU1FRAorLS1hZGQtb3BlbnMgamF2YS5iYXNlL2pkay5pbnRlcm5hbC5tb2R1bGU9QUxMLVVOTkFNRUQKKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qZGsuaW50ZXJuYWwudXRpbC5qYXI9QUxMLVVOTkFNRUQKKy0tYWRkLW9wZW5zIGpkay5tYW5hZ2VtZW50L2NvbS5zdW4ubWFuYWdlbWVudC5pbnRlcm5hbD1BTEwtVU5OQU1FRAorCisjdG8gYmUgYWRkcmVzc2VkIGluIENBU1NBTkRSQS0xNzg1MAorLS1hZGQtb3BlbnMgamF2YS5iYXNlL3N1bi5uaW8uY2g9QUxMLVVOTkFNRUQKKyMgaHR0cHM6Ly9jaHJvbmljbGUuc29mdHdhcmUvY2hyb25pY2xlLXN1cHBvcnQtamF2YS0xNy8KKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLmlvPUFMTC1VTk5BTUVECistLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS5uaW89QUxMLVVOTkFNRUQKKyN0byBiZSBhZGRyZXNzZWQgZHVyaW5nIGphbW0gbWFpbnRlbmFuY2UKKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLnV0aWwuY29uY3VycmVudD1BTEwtVU5OQU1FRAorLS1hZGQtb3BlbnMgamF2YS5iYXNlL2phdmEudXRpbD1BTEwtVU5OQU1FRAorLS1hZGQtb3BlbnMgamF2YS5iYXNlL2phdmEudXRpbC5jb25jdXJyZW50LmF0b21pYz1BTEwtVU5OQU1FRAorIyBodHRwczovL2Nocm9uaWNsZS5zb2Z0d2FyZS9jaHJvbmljbGUtc3VwcG9ydC1qYXZhLTE3LyBleHBsYWlucyBhbHNvIC0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLnV0aWw9QUxMLVVOTkFNRUQsIGZ1cnRoZXIgdG8gamFtbQorIyBtYW55IGNxbHNoIHRlc3RzIGZhaWwgaWYgd2UgZG8gbm90IG9wZW4gdGhlIGJlbG93IG9uZSAtIGphbW0gYW5kIGF0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5WZXJiLmdldE1vZGlmaWVyc0ZpZWxkKFZlcmIuamF2YTozODgpCisjIGluLWp2bSB0ZXN0cworLS1hZGQtb3BlbnMgamF2YS5iYXNlL2phdmEubGFuZz1BTEwtVU5OQU1FRAorI2phbW0KKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLm1hdGg9QUxMLVVOTkFNRUQKKyNpbi1qdm0gdGVzdHM/IHBsdXMgIyBodHRwczovL2Nocm9uaWNsZS5zb2Z0d2FyZS9jaHJvbmljbGUtc3VwcG9ydC1qYXZhLTE3LworLS1hZGQtb3BlbnMgamF2YS5iYXNlL2phdmEubGFuZy5yZWZsZWN0PUFMTC1VTk5BTUVECisjamFtbSBwb3N0IENBU1NBTkRSQS0xNzE5OQorLS1hZGQtb3BlbnMgamF2YS5iYXNlL2phdmEubmV0PUFMTC1VTk5BTUVECisKKyMjIyBHQyBsb2dnaW5nIG9wdGlvbnMgLS0gdW5jb21tZW50IHRvIGVuYWJsZQorCisjIEphdmEgMTEgKGFuZCBuZXdlcikgR0MgbG9nZ2luZyBvcHRpb25zOgorIyBTZWUgZGVzY3JpcHRpb24gb2YgaHR0cHM6Ly9idWdzLm9wZW5qZGsuamF2YS5uZXQvYnJvd3NlL0pESy04MDQ2MTQ4IGZvciBkZXRhaWxzIGFib3V0IHRoZSBzeW50YXgKKyMgVGhlIGZvbGxvd2luZyBpcyB0aGUgZXF1aXZhbGVudCB0byAtWFg6K1ByaW50R0NEZXRhaWxzIC1YWDorVXNlR0NMb2dGaWxlUm90YXRpb24gLVhYOk51bWJlck9mR0NMb2dGaWxlcz0xMCAtWFg6R0NMb2dGaWxlU2l6ZT0xME0KKyMtWGxvZzpnYz1pbmZvLGhlYXAqPXRyYWNlLGFnZSo9ZGVidWcsc2FmZXBvaW50PWluZm8scHJvbW90aW9uKj10cmFjZTpmaWxlPS92YXIvbG9nL2Nhc3NhbmRyYS9nYy5sb2c6dGltZSx1cHRpbWUscGlkLHRpZCxsZXZlbDpmaWxlY291bnQ9MTAsZmlsZXNpemU9MTA0ODU3NjAKKworIyBOb3RlcyBmb3IgSmF2YSA4IG1pZ3JhdGlvbjoKKyMKKyMgLVhYOitQcmludEdDRGV0YWlscyAgICAgICAgICAgICAgICAgICBtYXBzIHRvIC1YbG9nOmdjKjouLi4gLSBpLmUuIGFkZCBhICcqJyBhZnRlciAiZ2MiCisjIC1YWDorUHJpbnRHQ0RhdGVTdGFtcHMgICAgICAgICAgICAgICAgbWFwcyB0byBkZWNvcmF0b3IgJ3RpbWUnCisjCisjIC1YWDorUHJpbnRIZWFwQXRHQyAgICAgICAgICAgICAgICAgICAgbWFwcyB0byAnaGVhcCcgd2l0aCBsZXZlbCAndHJhY2UnCisjIC1YWDorUHJpbnRUZW51cmluZ0Rpc3RyaWJ1dGlvbiAgICAgICAgbWFwcyB0byAnYWdlJyB3aXRoIGxldmVsICdkZWJ1ZycKKyMgLVhYOitQcmludEdDQXBwbGljYXRpb25TdG9wcGVkVGltZSAgICBtYXBzIHRvICdzYWZlcG9pbnQnIHdpdGggbGV2ZWwgJ2luZm8nCisjIC1YWDorUHJpbnRQcm9tb3Rpb25GYWlsdXJlICAgICAgICAgICAgbWFwcyB0byAncHJvbW90aW9uJyB3aXRoIGxldmVsICd0cmFjZScKKyMgLVhYOlByaW50RkxTU3RhdGlzdGljcz0xICAgICAgICAgICAgICBtYXBzIHRvICdmcmVlbGlzdCcgd2l0aCBsZXZlbCAndHJhY2UnCisKKyMjIyBOZXR0eSBPcHRpb25zCisKKyMgT24gSmF2YSA+PSA5IE5ldHR5IHJlcXVpcmVzIHRoZSBpby5uZXR0eS50cnlSZWZsZWN0aW9uU2V0QWNjZXNzaWJsZSBzeXN0ZW0gcHJvcGVydHkgdG8gYmUgc2V0IHRvIHRydWUgdG8gZW5hYmxlCisjIGNyZWF0aW9uIG9mIGRpcmVjdCBidWZmZXJzIHVzaW5nIFVuc2FmZS4gV2l0aG91dCBpdCwgdGhpcyBmYWxscyBiYWNrIHRvIEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3Qgd2hpY2ggaGFzCisjIGluZmVyaW9yIHBlcmZvcm1hbmNlIGFuZCByaXNrcyBleGNlZWRpbmcgTWF4RGlyZWN0TWVtb3J5CistRGlvLm5ldHR5LnRyeVJlZmxlY3Rpb25TZXRBY2Nlc3NpYmxlPXRydWUKKworIyBUaGUgbmV3bGluZSBpbiB0aGUgZW5kIG9mIGZpbGUgaXMgaW50ZW50aW9uYWwKZGlmZiAtLWdpdCBhL2NvbmYvanZtOC1zZXJ2ZXIub3B0aW9ucyBiL2NvbmYvanZtOC1zZXJ2ZXIub3B0aW9ucwppbmRleCBiYTgwMGRiLi4xNDM2YTdlIDEwMDY0NAotLS0gYS9jb25mL2p2bTgtc2VydmVyLm9wdGlvbnMKKysrIGIvY29uZi9qdm04LXNlcnZlci5vcHRpb25zCkBAIC0xMyw0NSArMTMsNDggQEAKICMgc2VlIGh0dHA6Ly90ZWNoLnN0b2xzdmlrLmNvbS8yMDEwLzAxL2xpbnV4LWphdmEtdGhyZWFkLXByaW9yaXRpZXMtd29ya2Fyb3VuZC5odG1sCiAtWFg6VGhyZWFkUHJpb3JpdHlQb2xpY3k9NDIKIAorIyBEaXNhYmxlIGJpYXNlZCBsb2NraW5nIGFzIGl0IGRvZXMgbm90IGJlbmVmaXQgQ2Fzc2FuZHJhLgorLVhYOi1Vc2VCaWFzZWRMb2NraW5nCisKICMjIyMjIyMjIyMjIyMjIyMjCiAjICBHQyBTRVRUSU5HUyAgIwogIyMjIyMjIyMjIyMjIyMjIyMKIAogIyMjIENNUyBTZXR0aW5ncwotLVhYOitVc2VQYXJOZXdHQwotLVhYOitVc2VDb25jTWFya1N3ZWVwR0MKLS1YWDorQ01TUGFyYWxsZWxSZW1hcmtFbmFibGVkCi0tWFg6U3Vydml2b3JSYXRpbz04Ci0tWFg6TWF4VGVudXJpbmdUaHJlc2hvbGQ9MQotLVhYOkNNU0luaXRpYXRpbmdPY2N1cGFuY3lGcmFjdGlvbj03NQotLVhYOitVc2VDTVNJbml0aWF0aW5nT2NjdXBhbmN5T25seQotLVhYOkNNU1dhaXREdXJhdGlvbj0xMDAwMAotLVhYOitDTVNQYXJhbGxlbEluaXRpYWxNYXJrRW5hYmxlZAotLVhYOitDTVNFZGVuQ2h1bmtzUmVjb3JkQWx3YXlzCisjIy1YWDorVXNlUGFyTmV3R0MKKyMjLVhYOitVc2VDb25jTWFya1N3ZWVwR0MKKyMjLVhYOitDTVNQYXJhbGxlbFJlbWFya0VuYWJsZWQKKyMjLVhYOlN1cnZpdm9yUmF0aW89OAorIyMtWFg6TWF4VGVudXJpbmdUaHJlc2hvbGQ9MQorIyMtWFg6Q01TSW5pdGlhdGluZ09jY3VwYW5jeUZyYWN0aW9uPTc1CisjIy1YWDorVXNlQ01TSW5pdGlhdGluZ09jY3VwYW5jeU9ubHkKKyMjLVhYOkNNU1dhaXREdXJhdGlvbj0xMDAwMAorIyMtWFg6K0NNU1BhcmFsbGVsSW5pdGlhbE1hcmtFbmFibGVkCisjIy1YWDorQ01TRWRlbkNodW5rc1JlY29yZEFsd2F5cwogIyMgc29tZSBKVk1zIHdpbGwgZmlsbCB1cCB0aGVpciBoZWFwIHdoZW4gYWNjZXNzZWQgdmlhIEpNWCwgc2VlIENBU1NBTkRSQS02NTQxCi0tWFg6K0NNU0NsYXNzVW5sb2FkaW5nRW5hYmxlZAorIyMtWFg6K0NNU0NsYXNzVW5sb2FkaW5nRW5hYmxlZAogCiAjIyMgRzEgU2V0dGluZ3MKICMjIFVzZSB0aGUgSG90c3BvdCBnYXJiYWdlLWZpcnN0IGNvbGxlY3Rvci4KLSMtWFg6K1VzZUcxR0MKLSMtWFg6K1BhcmFsbGVsUmVmUHJvY0VuYWJsZWQKLSMtWFg6TWF4VGVudXJpbmdUaHJlc2hvbGQ9MQotIy1YWDpHMUhlYXBSZWdpb25TaXplPTE2bQorLVhYOitVc2VHMUdDCistWFg6K1BhcmFsbGVsUmVmUHJvY0VuYWJsZWQKKy1YWDpNYXhUZW51cmluZ1RocmVzaG9sZD0xCistWFg6RzFIZWFwUmVnaW9uU2l6ZT0xNm0KIAotIworCiAjIyBIYXZlIHRoZSBKVk0gZG8gbGVzcyByZW1lbWJlcmVkIHNldCB3b3JrIGR1cmluZyBTVFcsIGluc3RlYWQKICMjIHByZWZlcnJpbmcgY29uY3VycmVudCBHQy4gUmVkdWNlcyBwOTkuOSBsYXRlbmN5LgotIy1YWDpHMVJTZXRVcGRhdGluZ1BhdXNlVGltZVBlcmNlbnQ9NQotIworLVhYOkcxUlNldFVwZGF0aW5nUGF1c2VUaW1lUGVyY2VudD01CisKICMjIE1haW4gRzFHQyB0dW5hYmxlOiBsb3dlcmluZyB0aGUgcGF1c2UgdGFyZ2V0IHdpbGwgbG93ZXIgdGhyb3VnaHB1dCBhbmQgdmlzZSB2ZXJzYS4KICMjIDIwMG1zIGlzIHRoZSBKVk0gZGVmYXVsdCBhbmQgbG93ZXN0IHZpYWJsZSBzZXR0aW5nCiAjIyAxMDAwbXMgaW5jcmVhc2VzIHRocm91Z2hwdXQuIEtlZXAgaXQgc21hbGxlciB0aGFuIHRoZSB0aW1lb3V0cyBpbiBjYXNzYW5kcmEueWFtbC4KLSMtWFg6TWF4R0NQYXVzZU1pbGxpcz0zMDAKKy1YWDpNYXhHQ1BhdXNlTWlsbGlzPTMwMAogCiAjIyBPcHRpb25hbCBHMSBTZXR0aW5ncwogIyBTYXZlIENQVSB0aW1lIG9uIGxhcmdlICg+PSAxNkdCKSBoZWFwcyBieSBkZWxheWluZyByZWdpb24gc2Nhbm5pbmcKICMgdW50aWwgdGhlIGhlYXAgaXMgNzAlIGZ1bGwuIFRoZSBkZWZhdWx0IGluIEhvdHNwb3QgOHU0MCBpcyA0MCUuCi0jLVhYOkluaXRpYXRpbmdIZWFwT2NjdXBhbmN5UGVyY2VudD03MAorLVhYOkluaXRpYXRpbmdIZWFwT2NjdXBhbmN5UGVyY2VudD03MAogCiAjIEZvciBzeXN0ZW1zIHdpdGggPiA4IGNvcmVzLCB0aGUgZGVmYXVsdCBQYXJhbGxlbEdDVGhyZWFkcyBpcyA1LzggdGhlIG51bWJlciBvZiBsb2dpY2FsIGNvcmVzLgogIyBPdGhlcndpc2UgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBjb3JlcyB3aGVuIDggb3IgbGVzcy4KZGlmZiAtLWdpdCBhL2NvbmYvbG9nYmFjay54bWwgYi9jb25mL2xvZ2JhY2sueG1sCmluZGV4IGU5OGZlYTQuLjEwMmNmMDYgMTAwNjQ0Ci0tLSBhL2NvbmYvbG9nYmFjay54bWwKKysrIGIvY29uZi9sb2diYWNrLnhtbApAQCAtMTExLDYgKzExMSwxNCBAQAogICA8YXBwZW5kZXIgbmFtZT0iTG9nYmFja01ldHJpY3MiIGNsYXNzPSJjb20uY29kYWhhbGUubWV0cmljcy5sb2diYWNrLkluc3RydW1lbnRlZEFwcGVuZGVyIiAvPgogICAgLS0+CiAKKyAgPCEtLSBVbmNvbW1lbnQgYmVsb3cgY29uZmlndXJhdGlvbiBhbmQgY29ycmVzcG9uZGluZyBhcHBlbmRlci1yZWYgdG8gYWN0aXZhdGUKKyAgbG9nZ2luZyBpbnRvIHN5c3RlbV92aWV3cy5zeXN0ZW1fbG9ncyB2aXJ0dWFsIHRhYmxlLiAtLT4KKyAgPCEtLSA8YXBwZW5kZXIgbmFtZT0iQ1FMTE9HIiBjbGFzcz0ib3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubG9nZ2luZy5WaXJ0dWFsVGFibGVBcHBlbmRlciI+CisgICAgPGZpbHRlciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5maWx0ZXIuVGhyZXNob2xkRmlsdGVyIj4KKyAgICAgIDxsZXZlbD5XQVJOPC9sZXZlbD4KKyAgICA8L2ZpbHRlcj4KKyAgPC9hcHBlbmRlcj4gLS0+CisKICAgPHJvb3QgbGV2ZWw9IklORk8iPgogICAgIDxhcHBlbmRlci1yZWYgcmVmPSJTWVNURU1MT0ciIC8+CiAgICAgPGFwcGVuZGVyLXJlZiByZWY9IlNURE9VVCIgLz4KQEAgLTExOCw2ICsxMjYsOSBAQAogICAgIDwhLS0KICAgICA8YXBwZW5kZXItcmVmIHJlZj0iTG9nYmFja01ldHJpY3MiIC8+CiAgICAgLS0+CisgICAgPCEtLQorICAgIDxhcHBlbmRlci1yZWYgcmVmPSJDUUxMT0ciLz4KKyAgICAtLT4KICAgPC9yb290PgogCiAgIDxsb2dnZXIgbmFtZT0ib3JnLmFwYWNoZS5jYXNzYW5kcmEiIGxldmVsPSJERUJVRyIvPgpkaWZmIC0tZ2l0IGEvZGViaWFuL2Nhc3NhbmRyYS5pbnN0YWxsIGIvZGViaWFuL2Nhc3NhbmRyYS5pbnN0YWxsCmluZGV4IGY1NGQxYWQuLmRjZWQ1YTIgMTAwNjQ0Ci0tLSBhL2RlYmlhbi9jYXNzYW5kcmEuaW5zdGFsbAorKysgYi9kZWJpYW4vY2Fzc2FuZHJhLmluc3RhbGwKQEAgLTI1LDYgKzI1LDcgQEAKIHRvb2xzL2Jpbi9hdWRpdGxvZ3ZpZXdlciB1c3IvYmluCiB0b29scy9iaW4vam14dG9vbCB1c3IvYmluCiB0b29scy9iaW4vaGFzaF9wYXNzd29yZCB1c3IvYmluCit0b29scy9iaW4vc3N0YWJsZXBhcnRpdGlvbnMgdXNyL2JpbgogbGliLyouamFyIHVzci9zaGFyZS9jYXNzYW5kcmEvbGliCiBsaWIvKi56aXAgdXNyL3NoYXJlL2Nhc3NhbmRyYS9saWIKIGxpYi9zaWdhci1iaW4vKiB1c3Ivc2hhcmUvY2Fzc2FuZHJhL2xpYi9zaWdhci1iaW4KZGlmZiAtLWdpdCBhL2RlYmlhbi9jYXNzYW5kcmEucG9zdGluc3QgYi9kZWJpYW4vY2Fzc2FuZHJhLnBvc3RpbnN0CmluZGV4IDc1MmZmMWYuLjk1ODgyZTMgMTAwNjQ0Ci0tLSBhL2RlYmlhbi9jYXNzYW5kcmEucG9zdGluc3QKKysrIGIvZGViaWFuL2Nhc3NhbmRyYS5wb3N0aW5zdApAQCAtMzcsNiArMzcsOCBAQAogICAgICAgICBpZiBbIC16ICIkMiIgXTsgdGhlbgogICAgICAgICAgICAgY2hvd24gLVIgY2Fzc2FuZHJhOiAvdmFyL2xpYi9jYXNzYW5kcmEKICAgICAgICAgICAgIGNob3duIC1SIGNhc3NhbmRyYTogL3Zhci9sb2cvY2Fzc2FuZHJhCisgICAgICAgICAgICBjaG1vZCA3NTAgL3Zhci9saWIvY2Fzc2FuZHJhLworICAgICAgICAgICAgY2htb2QgNzUwIC92YXIvbG9nL2Nhc3NhbmRyYS8KICAgICAgICAgZmkKICAgICAgICAgaWYgISBzeXNjdGwgLXAgL2V0Yy9zeXNjdGwuZC9jYXNzYW5kcmEuY29uZjsgdGhlbgogICAgICAgICAgICAgZWNobyA+JjIKZGlmZiAtLWdpdCBhL2RlYmlhbi9jaGFuZ2Vsb2cgYi9kZWJpYW4vY2hhbmdlbG9nCmluZGV4IDFiYjFkMGQuLmNkYjFhZjkgMTAwNjQ0Ci0tLSBhL2RlYmlhbi9jaGFuZ2Vsb2cKKysrIGIvZGViaWFuL2NoYW5nZWxvZwpAQCAtMSw0NCArMSw4IEBACi1jYXNzYW5kcmEgKDQuMS4zKSBVTlJFTEVBU0VEOyB1cmdlbmN5PW1lZGl1bQorY2Fzc2FuZHJhICg1LjApIFVOUkVMRUFTRUQ7IHVyZ2VuY3k9bWVkaXVtCiAKICAgKiBOZXcgcmVsZWFzZQogCi0gLS0gTWljayBTZW1iIFdldmVyIDxtY2tAYXBhY2hlLm9yZz4gIFRodSwgMjUgTWF5IDIwMjMgMTY6MTE6MjggKzAyMDAKLQotY2Fzc2FuZHJhICg0LjEuMikgdW5zdGFibGU7IHVyZ2VuY3k9bWVkaXVtCi0KLSAgKiBOZXcgcmVsZWFzZQotCi0gLS0gTWljayBTZW1iIFdldmVyIDxtY2tAYXBhY2hlLm9yZz4gIFRodSwgMjUgTWF5IDIwMjMgMTY6MTE6MjggKzAyMDAKLQotY2Fzc2FuZHJhICg0LjEuMSkgdW5zdGFibGU7IHVyZ2VuY3k9bWVkaXVtCi0KLSAgKiBOZXcgcmVsZWFzZQotCi0gLS0gU3RlZmFuIE1pa2xvc292aWMgPHNtaWtsb3NvdmljQGFwYWNoZS5vcmc+ICBXZWQsIDE1IE1hciAyMDIzIDA5OjA4OjQwICswMTAwCi0KLWNhc3NhbmRyYSAoNC4xLjApIHVuc3RhYmxlOyB1cmdlbmN5PW1lZGl1bQotCi0gICogTmV3IHJlbGVhc2UKLQotIC0tIE1pY2sgU2VtYiBXZXZlciA8bWNrQGFwYWNoZS5vcmc+ICBXZWQsIDA3IERlYyAyMDIyIDIxOjUzOjMzICswMTAwCi0KLWNhc3NhbmRyYSAoNC4xfnJjMSkgdW5zdGFibGU7IHVyZ2VuY3k9bWVkaXVtCi0KLSAgKiBOZXcgcmVsZWFzZQotCi0gLS0gTWljayBTZW1iIFdldmVyIDxtY2tAYXBhY2hlLm9yZz4gIFRodSwgMTcgTm92IDIwMjIgMTE6MzM6MjUgKzAxMDAKLQotY2Fzc2FuZHJhICg0LjF+YmV0YTEpIHVuc3RhYmxlOyB1cmdlbmN5PW1lZGl1bQotCi0gICogTmV3IHJlbGVhc2UKLQotIC0tIE1pY2sgU2VtYiBXZXZlciA8bWNrQGFwYWNoZS5vcmc+ICBUdWUsIDI3IFNlcCAyMDIyIDAwOjA4OjA3ICswMjAwCi0KLWNhc3NhbmRyYSAoNC4xfmFscGhhMSkgdW5zdGFibGU7IHVyZ2VuY3k9bWVkaXVtCi0KLSAgKiBOZXcgcmVsZWFzZQotCi0gLS0gTWljayBTZW1iIFdldmVyIDxtY2tAYXBhY2hlLm9yZz4gIEZyaSwgMjAgTWF5IDIwMjIgMjI6MDI6NTAgKzAyMDAKKyAtLSBNaWNrIFNlbWIgV2V2ZXIgPG1ja0BhcGFjaGUub3JnPiAgV2VkLCAyMSBBcHIgMjAyMSAxOToyNDoyOCArMDIwMAogCiBjYXNzYW5kcmEgKDQuMH5yYzEpIHVuc3RhYmxlOyB1cmdlbmN5PW1lZGl1bQogCmRpZmYgLS1naXQgYS9kb2MvYW50b3JhLnltbCBiL2RvYy9hbnRvcmEueW1sCmluZGV4IDA4ZWQ1ZTIuLjQwMWNiZDQgMTAwNjQ0Ci0tLSBhL2RvYy9hbnRvcmEueW1sCisrKyBiL2RvYy9hbnRvcmEueW1sCkBAIC0xLDYgKzEsNyBAQAogbmFtZTogQ2Fzc2FuZHJhCi12ZXJzaW9uOiAnNC4xJwotZGlzcGxheV92ZXJzaW9uOiAnNC4xJwordmVyc2lvbjogJ3RydW5rJworZGlzcGxheV92ZXJzaW9uOiAndHJ1bmsnCitwcmVyZWxlYXNlOiB0cnVlCiBhc2NpaWRvYzoKICAgYXR0cmlidXRlczoKICAgICBjYXNzX3VybDogJ2h0dHA6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZy8nCmRpZmYgLS1naXQgYS9kb2MvY3FsMy9DUUwudGV4dGlsZSBiL2RvYy9jcWwzL0NRTC50ZXh0aWxlCmluZGV4IGQyYTRiNzIuLmMxY2U4NWYgMTAwNjQ0Ci0tLSBhL2RvYy9jcWwzL0NRTC50ZXh0aWxlCisrKyBiL2RvYy9jcWwzL0NRTC50ZXh0aWxlCkBAIC0xOCw3ICsxOCw3IEBACiAjCiAtLT4KIAotaDEuIENhc3NhbmRyYSBRdWVyeSBMYW5ndWFnZSAoQ1FMKSB2My40LjYKK2gxLiBDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UgKENRTCkgdjMuNC43CiAKIAogCkBAIC0yNTIsOSArMjUyLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICcoJyA8Y29sdW1uLWRlZmluaXRpb24+ICggJywnIDxjb2x1bW4tZGVmaW5pdGlvbj4gKSogJyknCiAgICAgICAgICAgICAgICAgICAgICAgICAgICggV0lUSCA8b3B0aW9uPiAoIEFORCA8b3B0aW9uPikqICk/CiAKLTxjb2x1bW4tZGVmaW5pdGlvbj4gOjo9IDxpZGVudGlmaWVyPiA8dHlwZT4gKCBTVEFUSUMgKT8gKCBQUklNQVJZIEtFWSApPworPGNvbHVtbi1kZWZpbml0aW9uPiA6Oj0gPGlkZW50aWZpZXI+IDx0eXBlPiAoIFNUQVRJQyApPyAoIDxjb2x1bW5fbWFzaz4gKT8gKCBQUklNQVJZIEtFWSApPwogICAgICAgICAgICAgICAgICAgICAgIHwgUFJJTUFSWSBLRVkgJygnIDxwYXJ0aXRpb24ta2V5PiAoICcsJyA8aWRlbnRpZmllcj4gKSogJyknCiAKKzxjb2x1bW4tbWFzaz4gOjo9IE1BU0tFRCBXSVRIICggREVGQVVMVCB8IDxmdW5jdGlvbj4gJygnICggPHRlcm0+ICgnLCcgPHRlcm0+KSogKT8gICcpJyApCisKIDxwYXJ0aXRpb24ta2V5PiA6Oj0gPGlkZW50aWZpZXI+CiAgICAgICAgICAgICAgICAgICB8ICcoJyA8aWRlbnRpZmllcj4gKCcsJyA8aWRlbnRpZmllcj4gKSogJyknCiAKQEAgLTM2Miw3ICszNjQsNyBAQAogCiBoNCgjY29tcGFjdGlvbk9wdGlvbnMpLiBDb21wYWN0aW9uIG9wdGlvbnMKIAotVGhlIEBjb21wYWN0aW9uQCBwcm9wZXJ0eSBtdXN0IGF0IGxlYXN0IGRlZmluZSB0aGUgQCdjbGFzcydAIHN1Yi1vcHRpb24sIHRoYXQgZGVmaW5lcyB0aGUgY29tcGFjdGlvbiBzdHJhdGVneSBjbGFzcyB0byB1c2UuIFRoZSBkZWZhdWx0IHN1cHBvcnRlZCBjbGFzcyBhcmUgQCdTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5J0AsIEAnTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneSdALCBAJ0RhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3knQCBhbmQgQCdUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5J0AuIEN1c3RvbSBzdHJhdGVneSBjYW4gYmUgcHJvdmlkZWQgYnkgc3BlY2lmeWluZyB0aGUgZnVsbCBjbGFzcyBuYW1lIGFzIGEgInN0cmluZyBjb25zdGFudCI6I2NvbnN0YW50cy4gVGhlIHJlc3Qgb2YgdGhlIHN1Yi1vcHRpb25zIGRlcGVuZHMgb24gdGhlIGNob3NlbiBjbGFzcy4gVGhlIHN1Yi1vcHRpb25zIHN1cHBvcnRlZCBieSB0aGUgZGVmYXVsdCBjbGFzc2VzIGFyZToKK1RoZSBAY29tcGFjdGlvbkAgcHJvcGVydHkgbXVzdCBhdCBsZWFzdCBkZWZpbmUgdGhlIEAnY2xhc3MnQCBzdWItb3B0aW9uLCB0aGF0IGRlZmluZXMgdGhlIGNvbXBhY3Rpb24gc3RyYXRlZ3kgY2xhc3MgdG8gdXNlLiBUaGUgZGVmYXVsdCBzdXBwb3J0ZWQgY2xhc3MgYXJlIEAnU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSdALCBAJ0xldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3knQCBhbmQgQCdUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5J0AuIEN1c3RvbSBzdHJhdGVneSBjYW4gYmUgcHJvdmlkZWQgYnkgc3BlY2lmeWluZyB0aGUgZnVsbCBjbGFzcyBuYW1lIGFzIGEgInN0cmluZyBjb25zdGFudCI6I2NvbnN0YW50cy4gVGhlIHJlc3Qgb2YgdGhlIHN1Yi1vcHRpb25zIGRlcGVuZHMgb24gdGhlIGNob3NlbiBjbGFzcy4gVGhlIHN1Yi1vcHRpb25zIHN1cHBvcnRlZCBieSB0aGUgZGVmYXVsdCBjbGFzc2VzIGFyZToKIAogfF8uIG9wdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Xy4gc3VwcG9ydGVkIGNvbXBhY3Rpb24gc3RyYXRlZ3kgfF8uIGRlZmF1bHQgICAgfF8uIGRlc2NyaXB0aW9uIHwKIHwgQGVuYWJsZWRAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBfYWxsXyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJ1ZSAgICAgICAgIHwgQSBib29sZWFuIGRlbm90aW5nIHdoZXRoZXIgY29tcGFjdGlvbiBzaG91bGQgYmUgZW5hYmxlZCBvciBub3QufApAQCAtMzc1LDkgKzM3Nyw2IEBACiB8IEBidWNrZXRfbG93QCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSAgICB8IDAuNSAgICAgICAgICB8IFNpemUgdGllcmVkIGNvbnNpZGVyIHNzdGFibGVzIHRvIGJlIHdpdGhpbiB0aGUgc2FtZSBidWNrZXQgaWYgdGhlaXIgc2l6ZSBpcyB3aXRoaW4gW2F2ZXJhZ2Vfc2l6ZSAqIEBidWNrZXRfbG93QCwgYXZlcmFnZV9zaXplICogQGJ1Y2tldF9oaWdoQCBdIChpLmUgdGhlIGRlZmF1bHQgZ3JvdXBzIHNzdGFibGUgd2hvc2Ugc2l6ZXMgZGl2ZXJnZXMgYnkgYXQgbW9zdCA1MCUpfAogfCBAYnVja2V0X2hpZ2hAICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kgICAgfCAxLjUgICAgICAgICAgfCBTaXplIHRpZXJlZCBjb25zaWRlciBzc3RhYmxlcyB0byBiZSB3aXRoaW4gdGhlIHNhbWUgYnVja2V0IGlmIHRoZWlyIHNpemUgaXMgd2l0aGluIFthdmVyYWdlX3NpemUgKiBAYnVja2V0X2xvd0AsIGF2ZXJhZ2Vfc2l6ZSAqIEBidWNrZXRfaGlnaEAgXSAoaS5lIHRoZSBkZWZhdWx0IGdyb3VwcyBzc3RhYmxlIHdob3NlIHNpemVzIGRpdmVyZ2VzIGJ5IGF0IG1vc3QgNTAlKS58CiB8IEBzc3RhYmxlX3NpemVfaW5fbWJAICAgICAgICAgICAgICAgICAgIHwgTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneSAgICAgICB8IDVNQiAgICAgICAgICB8IFRoZSB0YXJnZXQgc2l6ZSAoaW4gTUIpIGZvciBzc3RhYmxlcyBpbiB0aGUgbGV2ZWxlZCBzdHJhdGVneS4gTm90ZSB0aGF0IHdoaWxlIHNzdGFibGUgc2l6ZXMgc2hvdWxkIHN0YXkgbGVzcyBvciBlcXVhbCB0byBAc3N0YWJsZV9zaXplX2luX21iQCwgaXQgaXMgcG9zc2libGUgdG8gZXhjZXB0aW9uYWxseSBoYXZlIGEgbGFyZ2VyIHNzdGFibGUgYXMgZHVyaW5nIGNvbXBhY3Rpb24sIGRhdGEgZm9yIGEgZ2l2ZW4gcGFydGl0aW9uIGtleSBhcmUgbmV2ZXIgc3BsaXQgaW50byAyIHNzdGFibGVzfAotfCBAdGltZXN0YW1wX3Jlc29sdXRpb25AICAgICAgICAgICAgICAgICB8IERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kgICAgfCBNSUNST1NFQ09ORFMgfCBUaGUgdGltZXN0YW1wIHJlc29sdXRpb24gdXNlZCB3aGVuIGluc2VydGluZyBkYXRhLCBjb3VsZCBiZSBNSUxMSVNFQ09ORFMsIE1JQ1JPU0VDT05EUyBldGMgKHNob3VsZCBiZSB1bmRlcnN0YW5kYWJsZSBieSBKYXZhIFRpbWVVbml0KSAtIGRvbid0IGNoYW5nZSB0aGlzIHVubGVzcyB5b3UgZG8gbXV0YXRpb25zIHdpdGggVVNJTkcgVElNRVNUQU1QIDxub25fbWljcm9zZWNvbmRfdGltZXN0YW1wcz4gKG9yIGVxdWl2YWxlbnQgZGlyZWN0bHkgaW4gdGhlIGNsaWVudCl8Ci18IEBiYXNlX3RpbWVfc2Vjb25kc0AgICAgICAgICAgICAgICAgICAgIHwgRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSAgICB8IDYwICAgICAgICAgICB8IFRoZSBiYXNlIHNpemUgb2YgdGhlIHRpbWUgd2luZG93cy4gfAotfCBAbWF4X3NzdGFibGVfYWdlX2RheXNAICAgICAgICAgICAgICAgICB8IERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kgICAgfCAzNjUgICAgICAgICAgfCBTU1RhYmxlcyBvbmx5IGNvbnRhaW5pbmcgZGF0YSB0aGF0IGlzIG9sZGVyIHRoYW4gdGhpcyB3aWxsIG5ldmVyIGJlIGNvbXBhY3RlZC4gfAogfCBAdGltZXN0YW1wX3Jlc29sdXRpb25AICAgICAgICAgICAgICAgICB8IFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kgICAgfCBNSUNST1NFQ09ORFMgfCBUaGUgdGltZXN0YW1wIHJlc29sdXRpb24gdXNlZCB3aGVuIGluc2VydGluZyBkYXRhLCBjb3VsZCBiZSBNSUxMSVNFQ09ORFMsIE1JQ1JPU0VDT05EUyBldGMgKHNob3VsZCBiZSB1bmRlcnN0YW5kYWJsZSBieSBKYXZhIFRpbWVVbml0KSAtIGRvbid0IGNoYW5nZSB0aGlzIHVubGVzcyB5b3UgZG8gbXV0YXRpb25zIHdpdGggVVNJTkcgVElNRVNUQU1QIDxub25fbWljcm9zZWNvbmRfdGltZXN0YW1wcz4gKG9yIGVxdWl2YWxlbnQgZGlyZWN0bHkgaW4gdGhlIGNsaWVudCl8CiB8IEBjb21wYWN0aW9uX3dpbmRvd191bml0QCAgICAgICAgICAgICAgIHwgVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneSAgICB8IERBWVMgICAgICAgICB8IFRoZSBKYXZhIFRpbWVVbml0IHVzZWQgZm9yIHRoZSB3aW5kb3cgc2l6ZSwgc2V0IGluIGNvbmp1bmN0aW9uIHdpdGggQGNvbXBhY3Rpb25fd2luZG93X3NpemVALiBNdXN0IGJlIG9uZSBvZiBEQVlTLCBIT1VSUywgTUlOVVRFUyB8CiB8IEBjb21wYWN0aW9uX3dpbmRvd19zaXplQCAgICAgICAgICAgICAgIHwgVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneSAgICB8IDEgICAgICAgICAgICB8IFRoZSBudW1iZXIgb2YgQGNvbXBhY3Rpb25fd2luZG93X3VuaXRAIHVuaXRzIHRoYXQgbWFrZSB1cCBhIHRpbWUgd2luZG93LiB8CkBAIC00MTMsMTEgKzQxMiwxNSBAQAogYmMoc3ludGF4KS4uIAogPGFsdGVyLXRhYmxlLXN0bXQ+IDo6PSBBTFRFUiAoVEFCTEUgfCBDT0xVTU5GQU1JTFkpIChJRiBOT1QgRVhJU1RTKT8gPHRhYmxlbmFtZT4gPGluc3RydWN0aW9uPgogCi08aW5zdHJ1Y3Rpb24+IDo6PSBBREQgKElGIE5PVCBFWElTVFMpPyAoIDxpZGVudGlmaWVyPiA8dHlwZT4gKCAsIDxpZGVudGlmaWVyPiA8dHlwZT4gKSogKQorPGluc3RydWN0aW9uPiA6Oj0gQUREIChJRiBOT1QgRVhJU1RTKT8gKCA8aWRlbnRpZmllcj4gPHR5cGU+ICggPGNvbHVtbi1tYXNrPiApPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAsIDxpZGVudGlmaWVyPiA8dHlwZT4gKCA8Y29sdW1uLW1hc2s+ICk/ICkqICkKICAgICAgICAgICAgICAgICB8IERST1AgIChJRiBFWElTVFMpPyAoIDxpZGVudGlmaWVyPiAoICwgPGlkZW50aWZpZXI+ICkqICkKKyAgICAgICAgICAgICAgICB8IEFMVEVSIDxpZGVudGlmaWVyPiAoIDxjb2x1bW4tbWFzaz4gfCBEUk9QIE1BU0tFRCApCiAgICAgICAgICAgICAgICAgfCBSRU5BTUUgKElGIEVYSVNUUyk/IDxpZGVudGlmaWVyPiB0byA8aWRlbnRpZmllcj4gKEFORCA8aWRlbnRpZmllcj4gdG8gPGlkZW50aWZpZXI+KSoKICAgICAgICAgICAgICAgICB8IERST1AgQ09NUEFDVCBTVE9SQUdFCiAgICAgICAgICAgICAgICAgfCBXSVRIICA8b3B0aW9uPiAoIEFORCA8b3B0aW9uPiApKgorCis8Y29sdW1uLW1hc2s+IDo6PSBNQVNLRUQgV0lUSCAoIERFRkFVTFQgfCA8ZnVuY3Rpb24+ICcoJyAoIDx0ZXJtPiAoJywnIDx0ZXJtPikqICk/ICAnKScgKQogcC4gCiBfX1NhbXBsZTpfXwogCkBAIC00MzcsNiArNDQwLDcgQEAKIFRoZSBAPHRhYmxlbmFtZT5AIGlzIHRoZSB0YWJsZSBuYW1lIG9wdGlvbmFsbHkgcHJlY2VkZWQgYnkgdGhlIGtleXNwYWNlIG5hbWUuICBUaGUgQDxpbnN0cnVjdGlvbj5AIGRlZmluZXMgdGhlIGFsdGVyYXRpb24gdG8gcGVyZm9ybToKICogQEFEREA6IEFkZHMgYSBuZXcgY29sdW1uIHRvIHRoZSB0YWJsZS4gVGhlIEA8aWRlbnRpZmllcj5AIGZvciB0aGUgbmV3IGNvbHVtbiBtdXN0IG5vdCBjb25mbGljdCB3aXRoIGFuIGV4aXN0aW5nIGNvbHVtbi4gTW9yZW92ZXIsIGNvbHVtbnMgY2Fubm90IGJlIGFkZGVkIHRvIHRhYmxlcyBkZWZpbmVkIHdpdGggdGhlIEBDT01QQUNUIFNUT1JBR0VAIG9wdGlvbi4gSWYgdGhlIG5ldyBjb2x1bW4gYWxyZWFkeSBleGlzdHMsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBASUYgTk9UIEVYSVNUU0AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KICogQERST1BAOiBSZW1vdmVzIGEgY29sdW1uIGZyb20gdGhlIHRhYmxlLiBEcm9wcGVkIGNvbHVtbnMgd2lsbCBpbW1lZGlhdGVseSBiZWNvbWUgdW5hdmFpbGFibGUgaW4gdGhlIHF1ZXJpZXMgYW5kIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIGNvbXBhY3RlZCBzc3RhYmxlcyBpbiB0aGUgZnV0dXJlLiBJZiBhIGNvbHVtbiBpcyByZWFkZGVkLCBxdWVyaWVzIHdvbid0IHJldHVybiB2YWx1ZXMgd3JpdHRlbiBiZWZvcmUgdGhlIGNvbHVtbiB3YXMgbGFzdCBkcm9wcGVkLiBJdCBpcyBhc3N1bWVkIHRoYXQgdGltZXN0YW1wcyByZXByZXNlbnQgYWN0dWFsIHRpbWUsIHNvIGlmIHRoaXMgaXMgbm90IHlvdXIgY2FzZSwgeW91IHNob3VsZCBOT1QgcmVhZGQgcHJldmlvdXNseSBkcm9wcGVkIGNvbHVtbnMuIENvbHVtbnMgY2FuJ3QgYmUgZHJvcHBlZCBmcm9tIHRhYmxlcyBkZWZpbmVkIHdpdGggdGhlIEBDT01QQUNUIFNUT1JBR0VAIG9wdGlvbi4gSWYgdGhlIGRyb3BwZWQgY29sdW1uIGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBASUYgRVhJU1RTQCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgorKiBAQUxURVJAOiBBbHRlcnMgYW4gZXhpc3RpbmcgY29sdW1uLiBJdCBjYW4gYmUgdXNlZCB0byBzZXQgaXRzIGRhdGEgbWFzaywgb3IgdG8gc2V0IGl0IGFzIHVubWFza2VkLiBUaGUgZGF0YSBtYXNrIGlzIGFueSBmdW5jdGlvbiBtZWFudCB0byBvYnNjdXJlIHRoZSByZWFsIHZhbHVlcyBvZiB0aGUgY29sdW1uLgogKiBAUkVOQU1FQCBhIHByaW1hcnkga2V5IGNvbHVtbiBvZiBhIHRhYmxlLiBOb24gcHJpbWFyeSBrZXkgY29sdW1ucyBjYW5ub3QgYmUgcmVuYW1lZC4gRnVydGhlcm1vcmUsIHJlbmFtaW5nIGEgY29sdW1uIHRvIGFub3RoZXIgbmFtZSB3aGljaCBhbHJlYWR5IGV4aXN0cyBpc24ndCBhbGxvd2VkLiBJdCdzIGltcG9ydGFudCB0byBrZWVwIGluIG1pbmQgdGhhdCByZW5hbWVkIGNvbHVtbnMgc2hvdWxkbid0IGhhdmUgZGVwZW5kZW50IHNlY29uZGFyeSBpbmRleGVzLiBJZiB0aGUgcmVuYW1lZCBjb2x1bW4gZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIEBJRiBFWElTVFNAIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCiAqIEBEUk9QIENPTVBBQ1QgU1RPUkFHRUA6IFJlbW92ZXMgVGhyaWZ0IGNvbXBhdGliaWxpdHkgbW9kZSBmcm9tIHRoZSB0YWJsZS4KICogQFdJVEhAOiBBbGxvd3MgdG8gdXBkYXRlIHRoZSBvcHRpb25zIG9mIHRoZSB0YWJsZS4gVGhlICJzdXBwb3J0ZWQgQDxvcHRpb24+QCI6I2NyZWF0ZVRhYmxlT3B0aW9ucyAoYW5kIHN5bnRheCkgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUgQENSRUFURSBUQUJMRUAgc3RhdGVtZW50IGV4Y2VwdCB0aGF0IEBDT01QQUNUIFNUT1JBR0VAIGlzIG5vdCBzdXBwb3J0ZWQuIE5vdGUgdGhhdCBzZXR0aW5nIGFueSBAY29tcGFjdGlvbkAgc3ViLW9wdGlvbnMgaGFzIHRoZSBlZmZlY3Qgb2YgZXJhc2luZyBhbGwgcHJldmlvdXMgQGNvbXBhY3Rpb25AIG9wdGlvbnMsIHNvIHlvdSAgbmVlZCB0byByZS1zcGVjaWZ5IGFsbCB0aGUgc3ViLW9wdGlvbnMgaWYgeW91IHdhbnQgdG8ga2VlcCB0aGVtLiBUaGUgc2FtZSBub3RlIGFwcGxpZXMgdG8gdGhlIHNldCBvZiBAY29tcHJlc3Npb25AIHN1Yi1vcHRpb25zLgpAQCAtMTA4Niw5ICsxMDkwLDEwIEBACiAKIDxzZWxlY3Rvcj4gOjo9IDxpZGVudGlmaWVyPgogICAgICAgICAgICAgIHwgPHRlcm0+Ci0gICAgICAgICAgICAgfCBXUklURVRJTUUgJygnIDxpZGVudGlmaWVyPiAnKScKKyAgICAgICAgICAgICB8IFdSSVRFVElNRSAnKCcgPHNlbGVjdG9yPiAnKScKKyAgICAgICAgICAgICB8IE1BWFdSSVRFVElNRSAnKCcgPHNlbGVjdG9yPiAnKScKICAgICAgICAgICAgICB8IENPVU5UICcoJyAnKicgJyknCi0gICAgICAgICAgICAgfCBUVEwgJygnIDxpZGVudGlmaWVyPiAnKScKKyAgICAgICAgICAgICB8IFRUTCAnKCcgPHNlbGVjdG9yPiAnKScKICAgICAgICAgICAgICB8IENBU1QgJygnIDxzZWxlY3Rvcj4gQVMgPHR5cGU+ICcpJwogICAgICAgICAgICAgIHwgPGZ1bmN0aW9uPiAnKCcgKDxzZWxlY3Rvcj4gKCcsJyA8c2VsZWN0b3I+KSopPyAnKScKICAgICAgICAgICAgICB8IDxzZWxlY3Rvcj4gJy4nIDxpZGVudGlmaWVyPgpAQCAtMTEzNSw3ICsxMTQwLDcgQEAKIAogVGhlIEA8c2VsZWN0LWNsYXVzZT5AIGRldGVybWluZXMgd2hpY2ggY29sdW1ucyBuZWVkcyB0byBiZSBxdWVyaWVkIGFuZCByZXR1cm5lZCBpbiB0aGUgcmVzdWx0LXNldC4gSXQgY29uc2lzdHMgb2YgZWl0aGVyIHRoZSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiA8c2VsZWN0b3I+IG9yIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgKEAqQCkgdG8gc2VsZWN0IGFsbCB0aGUgY29sdW1ucyBkZWZpbmVkIGZvciB0aGUgdGFibGUuIFBsZWFzZSBub3RlIHRoYXQgZm9yIHdpbGRjYXJkIEBTRUxFQ1RAIHF1ZXJpZXMgdGhlIG9yZGVyIG9mIGNvbHVtbnMgcmV0dXJuZWQgaXMgbm90IHNwZWNpZmllZCBhbmQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgc3RhYmxlIGJldHdlZW4gQ2Fzc2FuZHJhIHZlcnNpb25zLgogCi1BIEA8c2VsZWN0b3I+QCBpcyBlaXRoZXIgYSBjb2x1bW4gbmFtZSB0byByZXRyaWV2ZSBvciBhIEA8ZnVuY3Rpb24+QCBvZiBvbmUgb3IgbW9yZSBAPHRlcm0+QHMuIFRoZSBmdW5jdGlvbiBhbGxvd2VkIGFyZSB0aGUgc2FtZSBhcyBmb3IgQDx0ZXJtPkAgYW5kIGFyZSBkZXNjcmliZWQgaW4gdGhlICJmdW5jdGlvbiBzZWN0aW9uIjojZnVuY3Rpb25zLiBJbiBhZGRpdGlvbiB0byB0aGVzZSBnZW5lcmljIGZ1bmN0aW9ucywgdGhlIEBXUklURVRJTUVAIChyZXNwLiBAVFRMQCkgZnVuY3Rpb24gYWxsb3dzIHRvIHNlbGVjdCB0aGUgdGltZXN0YW1wIG9mIHdoZW4gdGhlIGNvbHVtbiB3YXMgaW5zZXJ0ZWQgKHJlc3AuIHRoZSB0aW1lIHRvIGxpdmUgKGluIHNlY29uZHMpIGZvciB0aGUgY29sdW1uIChvciBudWxsIGlmIHRoZSBjb2x1bW4gaGFzIG5vIGV4cGlyYXRpb24gc2V0KSkgYW5kIHRoZSAiQENBU1RAIjojY2FzdEZ1biBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IG9uZSBkYXRhIHR5cGUgdG8gYW5vdGhlci4KK0EgQDxzZWxlY3Rvcj5AIGlzIGVpdGhlciBhIGNvbHVtbiBuYW1lIHRvIHJldHJpZXZlIG9yIGEgQDxmdW5jdGlvbj5AIG9mIG9uZSBvciBtb3JlIEA8dGVybT5Acy4gVGhlIGZ1bmN0aW9uIGFsbG93ZWQgYXJlIHRoZSBzYW1lIGFzIGZvciBAPHRlcm0+QCBhbmQgYXJlIGRlc2NyaWJlZCBpbiB0aGUgImZ1bmN0aW9uIHNlY3Rpb24iOiNmdW5jdGlvbnMuIEluIGFkZGl0aW9uIHRvIHRoZXNlIGdlbmVyaWMgZnVuY3Rpb25zLCB0aGUgQFdSSVRFVElNRUAgYW5kIEBNQVhXUklURVRJTUVAIChyZXNwLiBAVFRMQCkgZnVuY3Rpb24gYWxsb3dzIHRvIHNlbGVjdCB0aGUgdGltZXN0YW1wIG9mIHdoZW4gdGhlIGNvbHVtbiB3YXMgaW5zZXJ0ZWQgKHJlc3AuIHRoZSB0aW1lIHRvIGxpdmUgKGluIHNlY29uZHMpIGZvciB0aGUgY29sdW1uIChvciBudWxsIGlmIHRoZSBjb2x1bW4gaGFzIG5vIGV4cGlyYXRpb24gc2V0KSkgYW5kIHRoZSAiQENBU1RAIjojY2FzdEZ1biBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IG9uZSBkYXRhIHR5cGUgdG8gYW5vdGhlci4KIAogQWRkaXRpb25hbGx5LCBpbmRpdmlkdWFsIHZhbHVlcyBvZiBtYXBzIGFuZCBzZXRzIGNhbiBiZSBzZWxlY3RlZCB1c2luZyBAWyA8dGVybT4gXUAuIEZvciBtYXBzLCB0aGlzIHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBrZXksIGlmIHN1Y2ggZW50cnkgZXhpc3RzLiBGb3Igc2V0cywgdGhpcyB3aWxsIHJldHVybiB0aGUga2V5IHRoYXQgaXMgc2VsZWN0ZWQgaWYgaXQgZXhpc3RzIGFuZCBpcyB0aHVzIG1haW5seSBhIHdheSB0byBjaGVjayBlbGVtZW50IGV4aXN0ZW5jZS4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzZWxlY3QgYSBzbGljZSBvZiBhIHNldCBvciBtYXAgd2l0aCBAWyA8dGVybT4gLi4uIDx0ZXJtPiBAXSwgd2hlcmUgYm90aCBib3VuZCBjYW4gYmUgb21pdHRlZC4KIApAQCAtMTUyMCw2ICsxNTI1LDggQEAKICogQEFVVEhPUklaRUAKICogQERFU0NSSUJFQAogKiBARVhFQ1VURUAKKyogQFVOTUFTS0AKKyogQFNFTEVDVF9NQVNLRURACiAKIE5vdCBhbGwgcGVybWlzc2lvbnMgYXJlIGFwcGxpY2FibGUgdG8gZXZlcnkgdHlwZSBvZiByZXNvdXJjZS4gRm9yIGluc3RhbmNlLCBARVhFQ1VURUAgaXMgb25seSByZWxldmFudCBpbiB0aGUgY29udGV4dCBvZiBmdW5jdGlvbnMgb3IgbWJlYW5zOyBncmFudGluZyBARVhFQ1VURUAgb24gYSByZXNvdXJjZSByZXByZXNlbnRpbmcgYSB0YWJsZSBpcyBub25zZW5zaWNhbC4gQXR0ZW1wdGluZyB0byBAR1JBTlRAIGEgcGVybWlzc2lvbiBvbiByZXNvdXJjZSB0byB3aGljaCBpdCBjYW5ub3QgYmUgYXBwbGllZCByZXN1bHRzIGluIGFuIGVycm9yIHJlc3BvbnNlLiBUaGUgZm9sbG93aW5nIGlsbHVzdHJhdGVzIHdoaWNoIHBlcm1pc3Npb25zIGNhbiBiZSBncmFudGVkIG9uIHdoaWNoIHR5cGVzIG9mIHJlc291cmNlLCBhbmQgd2hpY2ggc3RhdGVtZW50cyBhcmUgZW5hYmxlZCBieSB0aGF0IHBlcm1pc3Npb24uCiAKQEAgLTE1NzksNiArMTU4NiwxMiBAQAogfCBARVhFQ1VURUAgICAgfCBAQUxMIE1CRUFOU0AgICAgICAgICAgICAgICAgIHxFeGVjdXRlIG9wZXJhdGlvbnMgb24gYW55IG1iZWFufAogfCBARVhFQ1VURUAgICAgfCBATUJFQU5TQCAgICAgICAgICAgICAgICAgICAgIHxFeGVjdXRlIG9wZXJhdGlvbnMgb24gYW55IG1iZWFuIG1hdGNoaW5nIGEgd2lsZGNhcmQgcGF0dGVybnwKIHwgQEVYRUNVVEVAICAgIHwgQE1CRUFOQCAgICAgICAgICAgICAgICAgICAgICB8RXhlY3V0ZSBvcGVyYXRpb25zIG9uIG5hbWVkIG1iZWFufAorfCBAVU5NQVNLQCAgICAgfCBAQUxMIEtFWVNQQUNFU0AgICAgICAgICAgICAgIHxTZWUgdGhlIGNsZWFyIGNvbnRlbnRzIG9mIG1hc2tlZCBjb2x1bW5zIG9uIGFueSB0YWJsZXwKK3wgQFVOTUFTS0AgICAgIHwgQEtFWVNQQUNFQCAgICAgICAgICAgICAgICAgICB8U2VlIHRoZSBjbGVhciBjb250ZW50cyBvZiBtYXNrZWQgY29sdW1ucyBvbiBhbnkgdGFibGUgaW4ga2V5c3BhY2V8Cit8IEBVTk1BU0tAICAgICB8IEBUQUJMRUAgICAgICAgICAgICAgICAgICAgICAgfFNlZSB0aGUgY2xlYXIgY29udGVudHMgb2YgbWFza2VkIGNvbHVtbnMgb24gdGhlIHNwZWNpZmllZCB0YWJsZXwKK3wgQFNFTEVDVF9NQVNLRURAIHwgQEFMTCBLRVlTUEFDRVNAICAgICAgICAgICB8U2VsZWN0IHJlc3RyaWN0aW5nIG1hc2tlZCBjb2x1bW5zIG9uIGFueSB0YWJsZXwKK3wgQFNFTEVDVF9NQVNLRURAIHwgQEtFWVNQQUNFQCAgICAgICAgICAgICAgICB8U2VsZWN0IHJlc3RyaWN0aW5nIG1hc2tlZCBjb2x1bW5zIG9uIGFueSB0YWJsZSBpbiBrZXlzcGFjZXwKK3wgQFNFTEVDVF9NQVNLRURAIHwgQFRBQkxFQCAgICAgICAgICAgICAgICAgICB8U2VsZWN0IHJlc3RyaWN0aW5nIG1hc2tlZCBjb2x1bW5zIG9uIHRoZSBzcGVjaWZpZWQgdGFibGV8CiAKIAogaDMoI2dyYW50UGVybWlzc2lvbnNTdG10KS4gR1JBTlQgUEVSTUlTU0lPTgpAQCAtMTU4OCw3ICsxNjAxLDcgQEAKIGJjKHN5bnRheCkuLiAKIDxncmFudC1wZXJtaXNzaW9uLXN0bXQ+IDo6PSBHUkFOVCAoIEFMTCAoIFBFUk1JU1NJT05TICk/IHwgPHBlcm1pc3Npb24+ICggUEVSTUlTU0lPTiApPyAoLCBQRVJNSVNTSU9OKSogKSBPTiA8cmVzb3VyY2U+IFRPIDxpZGVudGlmaWVyPgogCi08cGVybWlzc2lvbj4gOjo9IENSRUFURSB8IEFMVEVSIHwgRFJPUCB8IFNFTEVDVCB8IE1PRElGWSB8IEFVVEhPUklaRSB8IERFU1JJQkUgfCBFWEVDVVRFCis8cGVybWlzc2lvbj4gOjo9IENSRUFURSB8IEFMVEVSIHwgRFJPUCB8IFNFTEVDVCB8IE1PRElGWSB8IEFVVEhPUklaRSB8IERFU1JJQkUgfCBFWEVDVVRFIHwgVU5NQVNLIHwgU0VMRUNUX01BU0tFRAogCiA8cmVzb3VyY2U+IDo6PSBBTEwgS0VZU1BBQ0VTCiAgICAgICAgICAgICAgfCBLRVlTUEFDRSA8aWRlbnRpZmllcj4KQEAgLTE2NDUsNyArMTY1OCw3IEBACiBiYyhzeW50YXgpLi4gCiA8cmV2b2tlLXBlcm1pc3Npb24tc3RtdD4gOjo9IFJFVk9LRSAoIEFMTCAoIFBFUk1JU1NJT05TICk/IHwgPHBlcm1pc3Npb24+ICggUEVSTUlTU0lPTiApPyAoLCBQRVJNSVNTSU9OKSogKSBPTiA8cmVzb3VyY2U+IEZST00gPGlkZW50aWZpZXI+CiAKLTxwZXJtaXNzaW9uPiA6Oj0gQ1JFQVRFIHwgQUxURVIgfCBEUk9QIHwgU0VMRUNUIHwgTU9ESUZZIHwgQVVUSE9SSVpFIHwgREVTUklCRSB8IEVYRUNVVEUKKzxwZXJtaXNzaW9uPiA6Oj0gQ1JFQVRFIHwgQUxURVIgfCBEUk9QIHwgU0VMRUNUIHwgTU9ESUZZIHwgQVVUSE9SSVpFIHwgREVTUklCRSB8IEVYRUNVVEUgfCBVTk1BU0sgfCBTRUxFQ1RfTUFTS0VECiAKIDxyZXNvdXJjZT4gOjo9IEFMTCBLRVlTUEFDRVMKICAgICAgICAgICAgICB8IEtFWVNQQUNFIDxpZGVudGlmaWVyPgpAQCAtMjEwNSwyMSArMjExOCwyMSBAQAogCiAKIHdpbGwgbmV2ZXIgcmV0dXJuIGFueSByZXN1bHQgYnkgZGVzaWduLCBzaW5jZSB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgQG5vdygpQCBpcyBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZS4KLUBjdXJyZW50VGltZVVVSURAIGlzIGFuIGFsaWFzIG9mIEBub3dALgorQGN1cnJlbnRfdGltZXV1aWRAIGlzIGFuIGFsaWFzIG9mIEBub3dALgogCiAKLWg0LiBAbWluVGltZXV1aWRAIGFuZCBAbWF4VGltZXV1aWRACitoNC4gQG1pbl90aW1ldXVpZEAgYW5kIEBtYXhfdGltZXV1aWRACiAKLVRoZSBAbWluVGltZXV1aWRAIChyZXNwLiBAbWF4VGltZXV1aWRAKSBmdW5jdGlvbiB0YWtlcyBhIEB0aW1lc3RhbXBAIHZhbHVlIEB0QCAod2hpY2ggY2FuIGJlICJlaXRoZXIgYSB0aW1lc3RhbXAgb3IgYSBkYXRlIHN0cmluZyI6I3VzaW5ndGltZXN0YW1wcyApIGFuZCByZXR1cm4gYSBfZmFrZV8gQHRpbWV1dWlkQCBjb3JyZXNwb25kaW5nIHRvIHRoZSBfc21hbGxlc3RfIChyZXNwLiBfYmlnZ2VzdF8pIHBvc3NpYmxlIEB0aW1ldXVpZEAgaGF2aW5nIGZvciB0aW1lc3RhbXAgQHRALiBTbyBmb3IgaW5zdGFuY2U6CitUaGUgQG1pbl90aW1ldXVpZEAgKHJlc3AuIEBtYXhfdGltZXV1aWRAKSBmdW5jdGlvbiB0YWtlcyBhIEB0aW1lc3RhbXBAIHZhbHVlIEB0QCAod2hpY2ggY2FuIGJlICJlaXRoZXIgYSB0aW1lc3RhbXAgb3IgYSBkYXRlIHN0cmluZyI6I3VzaW5ndGltZXN0YW1wcyApIGFuZCByZXR1cm4gYSBfZmFrZV8gQHRpbWV1dWlkQCBjb3JyZXNwb25kaW5nIHRvIHRoZSBfc21hbGxlc3RfIChyZXNwLiBfYmlnZ2VzdF8pIHBvc3NpYmxlIEB0aW1ldXVpZEAgaGF2aW5nIGZvciB0aW1lc3RhbXAgQHRALiBTbyBmb3IgaW5zdGFuY2U6CiAKIAotYmMoc2FtcGxlKS4gCi1TRUxFQ1QgKiBGUk9NIG15VGFibGUgV0hFUkUgdCA+IG1heFRpbWV1dWlkKCcyMDEzLTAxLTAxIDAwOjA1KzAwMDAnKSBBTkQgdCA8IG1pblRpbWV1dWlkKCcyMDEzLTAyLTAyIDEwOjAwKzAwMDAnKQorYmMoc2FtcGxlKS4KK1NFTEVDVCAqIEZST00gbXlUYWJsZSBXSEVSRSB0ID4gbWF4X3RpbWV1dWlkKCcyMDEzLTAxLTAxIDAwOjA1KzAwMDAnKSBBTkQgdCA8IG1pbl90aW1ldXVpZCgnMjAxMy0wMi0wMiAxMDowMCswMDAwJykKIAogCi13aWxsIHNlbGVjdCBhbGwgcm93cyB3aGVyZSB0aGUgQHRpbWV1dWlkQCBjb2x1bW4gQHRAIGlzIHN0cmljdGx5IG9sZGVyIHRoYW4gJzIwMTMtMDEtMDEgMDA6MDUrMDAwMCcgYnV0IHN0cmljdGx5IHlvdW5nZXIgdGhhbiAnMjAxMy0wMi0wMiAxMDowMCswMDAwJy4gIFBsZWFzZSBub3RlIHRoYXQgQHQgPj0gbWF4VGltZXV1aWQoJzIwMTMtMDEtMDEgMDA6MDUrMDAwMCcpQCB3b3VsZCBzdGlsbCBfbm90XyBzZWxlY3QgYSBAdGltZXV1aWRAIGdlbmVyYXRlZCBleGFjdGx5IGF0ICcyMDEzLTAxLTAxIDAwOjA1KzAwMDAnIGFuZCBpcyBlc3NlbnRpYWxseSBlcXVpdmFsZW50IHRvIEB0ID4gbWF4VGltZXV1aWQoJzIwMTMtMDEtMDEgMDA6MDUrMDAwMCcpQC4KK3dpbGwgc2VsZWN0IGFsbCByb3dzIHdoZXJlIHRoZSBAdGltZXV1aWRAIGNvbHVtbiBAdEAgaXMgc3RyaWN0bHkgb2xkZXIgdGhhbiAnMjAxMy0wMS0wMSAwMDowNSswMDAwJyBidXQgc3RyaWN0bHkgeW91bmdlciB0aGFuICcyMDEzLTAyLTAyIDEwOjAwKzAwMDAnLiAgUGxlYXNlIG5vdGUgdGhhdCBAdCA+PSBtYXhfdGltZXV1aWQoJzIwMTMtMDEtMDEgMDA6MDUrMDAwMCcpQCB3b3VsZCBzdGlsbCBfbm90XyBzZWxlY3QgYSBAdGltZXV1aWRAIGdlbmVyYXRlZCBleGFjdGx5IGF0ICcyMDEzLTAxLTAxIDAwOjA1KzAwMDAnIGFuZCBpcyBlc3NlbnRpYWxseSBlcXVpdmFsZW50IHRvIEB0ID4gbWF4VGltZXV1aWQoJzIwMTMtMDEtMDEgMDA6MDUrMDAwMCcpQC4KIAotX1dhcm5pbmdfOiBXZSBjYWxsZWQgdGhlIHZhbHVlcyBnZW5lcmF0ZWQgYnkgQG1pblRpbWV1dWlkQCBhbmQgQG1heFRpbWV1dWlkQCBfZmFrZV8gVVVJRCBiZWNhdXNlIHRoZXkgZG8gbm8gcmVzcGVjdCB0aGUgVGltZS1CYXNlZCBVVUlEIGdlbmVyYXRpb24gcHJvY2VzcyBzcGVjaWZpZWQgYnkgdGhlICJSRkMgNDEyMiI6aHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDEyMi50eHQuIEluIHBhcnRpY3VsYXIsIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGVzZSAyIG1ldGhvZHMgd2lsbCBub3QgYmUgdW5pcXVlLiBUaGlzIG1lYW5zIHlvdSBzaG91bGQgb25seSB1c2UgdGhvc2UgbWV0aG9kcyBmb3IgcXVlcnlpbmcgKGFzIGluIHRoZSBleGFtcGxlIGFib3ZlKS4gSW5zZXJ0aW5nIHRoZSByZXN1bHQgb2YgdGhvc2UgbWV0aG9kcyBpcyBhbG1vc3QgY2VydGFpbmx5IF9hIGJhZCBpZGVhXy4KK19XYXJuaW5nXzogV2UgY2FsbGVkIHRoZSB2YWx1ZXMgZ2VuZXJhdGVkIGJ5IEBtaW5fdGltZXV1aWRAIGFuZCBAbWF4X3RpbWV1dWlkQCBfZmFrZV8gVVVJRCBiZWNhdXNlIHRoZXkgZG8gbm8gcmVzcGVjdCB0aGUgVGltZS1CYXNlZCBVVUlEIGdlbmVyYXRpb24gcHJvY2VzcyBzcGVjaWZpZWQgYnkgdGhlICJSRkMgNDEyMiI6aHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDEyMi50eHQuIEluIHBhcnRpY3VsYXIsIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGVzZSAyIG1ldGhvZHMgd2lsbCBub3QgYmUgdW5pcXVlLiBUaGlzIG1lYW5zIHlvdSBzaG91bGQgb25seSB1c2UgdGhvc2UgbWV0aG9kcyBmb3IgcXVlcnlpbmcgKGFzIGluIHRoZSBleGFtcGxlIGFib3ZlKS4gSW5zZXJ0aW5nIHRoZSByZXN1bHQgb2YgdGhvc2UgbWV0aG9kcyBpcyBhbG1vc3QgY2VydGFpbmx5IF9hIGJhZCBpZGVhXy4KIAogCiBoMygjZGF0ZXRpbWVGdW4pLiBEYXRldGltZSBmdW5jdGlvbnMKQEAgLTIxMjksMzAgKzIxNDIsMjggQEAKIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZSBkYXRlL3RpbWUgYXQgdGhlIHRpbWUgd2hlcmUgdGhlIGZ1bmN0aW9uIGlzIGludm9rZWQ6CiAKIHxfLiBmdW5jdGlvbiBuYW1lICAgICAgICAgfF8uICAgIG91dHB1dCB0eXBlICAgICAgIHwKLXwgQGN1cnJlbnRUaW1lc3RhbXBAICAgICAgfCAgQHRpbWVzdGFtcEAgICAgICAgICAgIHwKLXwgQGN1cnJlbnREYXRlQCAgICAgICAgICAgfCAgQGRhdGVAICAgICAgICAgICAgICAgIHwKLXwgQGN1cnJlbnRUaW1lQCAgICAgICAgICAgfCAgQHRpbWVAICAgICAgICAgICAgICAgIHwKLXwgQGN1cnJlbnRUaW1lVVVJREAgICAgICAgfCAgQHRpbWVVVUlEQCAgICAgICAgICAgIHwKK3wgQGN1cnJlbnRfdGltZXN0YW1wQCAgICAgfCAgQHRpbWVzdGFtcEAgICAgICAgICAgIHwKK3wgQGN1cnJlbnRfZGF0ZUAgICAgICAgICAgfCAgQGRhdGVAICAgICAgICAgICAgICAgIHwKK3wgQGN1cnJlbnRfdGltZUAgICAgICAgICAgfCAgQHRpbWVAICAgICAgICAgICAgICAgIHwKK3wgQGN1cnJlbnRfdGltZXV1aWRAICAgICAgfCAgQHRpbWVVVUlEQCAgICAgICAgICAgIHwKIAogRm9yIGV4YW1wbGUgdGhlIGxhc3QgMiBkYXlzIG9mIGRhdGEgY2FuIGJlIHJldHJpZXZlZCB1c2luZzoKIAotYmMoc2FtcGxlKS4gCi1TRUxFQ1QgKiBGUk9NIG15VGFibGUgV0hFUkUgZGF0ZSA+PSBjdXJyZW50RGF0ZSgpIC0gMmQKK2JjKHNhbXBsZSkuCitTRUxFQ1QgKiBGUk9NIG15VGFibGUgV0hFUkUgZGF0ZSA+PSBjdXJyZW50X2RhdGUoKSAtIDJkCiAKIGg0KCN0aW1lRnVuKS4gVGltZSBjb252ZXJzaW9uIGZ1bmN0aW9ucwogCiBBIG51bWJlciBvZiBmdW5jdGlvbnMgYXJlIHByb3ZpZGVkIHRvICJjb252ZXJ0IiBhIEB0aW1ldXVpZEAsIGEgQHRpbWVzdGFtcEAgb3IgYSBAZGF0ZUAgaW50byBhbm90aGVyIEBuYXRpdmVAIHR5cGUuCiAKIHxfLiBmdW5jdGlvbiBuYW1lICAgIHxfLiBpbnB1dCB0eXBlICAgfF8uIGRlc2NyaXB0aW9ufAotfEB0b0RhdGVAICAgICAgICAgICAgfEB0aW1ldXVpZEAgICAgICB8Q29udmVydHMgdGhlIEB0aW1ldXVpZEAgYXJndW1lbnQgaW50byBhIEBkYXRlQCB0eXBlfAotfEB0b0RhdGVAICAgICAgICAgICAgfEB0aW1lc3RhbXBAICAgICB8Q29udmVydHMgdGhlIEB0aW1lc3RhbXBAIGFyZ3VtZW50IGludG8gYSBAZGF0ZUAgdHlwZXwKLXxAdG9UaW1lc3RhbXBAICAgICAgIHxAdGltZXV1aWRAICAgICAgfENvbnZlcnRzIHRoZSBAdGltZXV1aWRAIGFyZ3VtZW50IGludG8gYSBAdGltZXN0YW1wQCB0eXBlfAotfEB0b1RpbWVzdGFtcEAgICAgICAgfEBkYXRlQCAgICAgICAgICB8Q29udmVydHMgdGhlIEBkYXRlQCBhcmd1bWVudCBpbnRvIGEgQHRpbWVzdGFtcEAgdHlwZXwKLXxAdG9Vbml4VGltZXN0YW1wQCAgIHxAdGltZXV1aWRAICAgICAgfENvbnZlcnRzIHRoZSBAdGltZXV1aWRAIGFyZ3VtZW50IGludG8gYSBAYmlnSW50QCByYXcgdmFsdWV8Ci18QHRvVW5peFRpbWVzdGFtcEAgICB8QHRpbWVzdGFtcEAgICAgIHxDb252ZXJ0cyB0aGUgQHRpbWVzdGFtcEAgYXJndW1lbnQgaW50byBhIEBiaWdJbnRAIHJhdyB2YWx1ZXwKLXxAdG9Vbml4VGltZXN0YW1wQCAgIHxAZGF0ZUAgICAgICAgICAgfENvbnZlcnRzIHRoZSBAZGF0ZUAgYXJndW1lbnQgaW50byBhIEBiaWdJbnRAIHJhdyB2YWx1ZXwKLXxAZGF0ZU9mQCAgICAgICAgICAgIHxAdGltZXV1aWRAICAgICAgfFNpbWlsYXIgdG8gQHRvVGltZXN0YW1wKHRpbWV1dWlkKUAgKERFUFJFQ0FURUQpfAotfEB1bml4VGltZXN0YW1wT2ZAICAgfEB0aW1ldXVpZEAgICAgICB8U2ltaWxhciB0byBAdG9Vbml4VGltZXN0YW1wKHRpbWV1dWlkKUAgKERFUFJFQ0FURUQpfAorfEB0b19kYXRlQCAgICAgICAgICAgfEB0aW1ldXVpZEAgICAgICB8Q29udmVydHMgdGhlIEB0aW1ldXVpZEAgYXJndW1lbnQgaW50byBhIEBkYXRlQCB0eXBlfAorfEB0b19kYXRlQCAgICAgICAgICAgfEB0aW1lc3RhbXBAICAgICB8Q29udmVydHMgdGhlIEB0aW1lc3RhbXBAIGFyZ3VtZW50IGludG8gYSBAZGF0ZUAgdHlwZXwKK3xAdG9fdGltZXN0YW1wQCAgICAgIHxAdGltZXV1aWRAICAgICAgfENvbnZlcnRzIHRoZSBAdGltZXV1aWRAIGFyZ3VtZW50IGludG8gYSBAdGltZXN0YW1wQCB0eXBlfAorfEB0b190aW1lc3RhbXBAICAgICAgfEBkYXRlQCAgICAgICAgICB8Q29udmVydHMgdGhlIEBkYXRlQCBhcmd1bWVudCBpbnRvIGEgQHRpbWVzdGFtcEAgdHlwZXwKK3xAdG9fdW5peF90aW1lc3RhbXBAIHxAdGltZXV1aWRAICAgICAgfENvbnZlcnRzIHRoZSBAdGltZXV1aWRAIGFyZ3VtZW50IGludG8gYSBAYmlnSW50QCByYXcgdmFsdWV8Cit8QHRvX3VuaXhfdGltZXN0YW1wQCB8QHRpbWVzdGFtcEAgICAgIHxDb252ZXJ0cyB0aGUgQHRpbWVzdGFtcEAgYXJndW1lbnQgaW50byBhIEBiaWdJbnRAIHJhdyB2YWx1ZXwKK3xAdG9fdW5peF90aW1lc3RhbXBAIHxAZGF0ZUAgICAgICAgICAgfENvbnZlcnRzIHRoZSBAZGF0ZUAgYXJndW1lbnQgaW50byBhIEBiaWdJbnRAIHJhdyB2YWx1ZXwKIAogaDQoI2Zsb29yRnVuKS4gRmxvb3IgZnVuY3Rpb24KIApAQCAtMjE2NiwxMiArMjE3NywxMiBAQAogCiBoMygjYmxvYkZ1bikuIEJsb2IgY29udmVyc2lvbiBmdW5jdGlvbnMKIAotQSBudW1iZXIgb2YgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCB0byAiY29udmVydCIgdGhlIG5hdGl2ZSB0eXBlcyBpbnRvIGJpbmFyeSBkYXRhIChAYmxvYkApLiBGb3IgZXZlcnkgQDxuYXRpdmUtdHlwZT5AIEB0eXBlQCBzdXBwb3J0ZWQgYnkgQ1FMMyAoYSBub3RhYmxlIGV4Y2VwdGlvbnMgaXMgQGJsb2JALCBmb3Igb2J2aW91cyByZWFzb25zKSwgdGhlIGZ1bmN0aW9uIEB0eXBlQXNCbG9iQCB0YWtlcyBhIGFyZ3VtZW50IG9mIHR5cGUgQHR5cGVAIGFuZCByZXR1cm4gaXQgYXMgYSBAYmxvYkAuICBDb252ZXJzZWx5LCB0aGUgZnVuY3Rpb24gQGJsb2JBc1R5cGVAIHRha2VzIGEgNjQtYml0IEBibG9iQCBhcmd1bWVudCBhbmQgY29udmVydCBpdCB0byBhIEBiaWdpbnRAIHZhbHVlLiAgQW5kIHNvIGZvciBpbnN0YW5jZSwgQGJpZ2ludEFzQmxvYigzKUAgaXMgQDB4MDAwMDAwMDAwMDAwMDAwM0AgYW5kIEBibG9iQXNCaWdpbnQoMHgwMDAwMDAwMDAwMDAwMDAzKUAgaXMgQDNALgorQSBudW1iZXIgb2YgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCB0byAiY29udmVydCIgdGhlIG5hdGl2ZSB0eXBlcyBpbnRvIGJpbmFyeSBkYXRhIChAYmxvYkApLiBGb3IgZXZlcnkgQDxuYXRpdmUtdHlwZT5AIEB0eXBlQCBzdXBwb3J0ZWQgYnkgQ1FMMyAoYSBub3RhYmxlIGV4Y2VwdGlvbnMgaXMgQGJsb2JALCBmb3Igb2J2aW91cyByZWFzb25zKSwgdGhlIGZ1bmN0aW9uIEB0eXBlX2FzX2Jsb2JAIHRha2VzIGEgYXJndW1lbnQgb2YgdHlwZSBAdHlwZUAgYW5kIHJldHVybiBpdCBhcyBhIEBibG9iQC4gIENvbnZlcnNlbHksIHRoZSBmdW5jdGlvbiBAYmxvYl9hc190eXBlQCB0YWtlcyBhIDY0LWJpdCBAYmxvYkAgYXJndW1lbnQgYW5kIGNvbnZlcnQgaXQgdG8gYSBAYmlnaW50QCB2YWx1ZS4gIEFuZCBzbyBmb3IgaW5zdGFuY2UsIEBiaWdpbnRfYXNfYmxvYigzKUAgaXMgQDB4MDAwMDAwMDAwMDAwMDAwM0AgYW5kIEBibG9iX2FzX2JpZ2ludCgweDAwMDAwMDAwMDAwMDAwMDMpQCBpcyBAM0AuCiAKIGgyKCNhZ2dyZWdhdGVzKS4gQWdncmVnYXRlcwogCiBBZ2dyZWdhdGUgZnVuY3Rpb25zIHdvcmsgb24gYSBzZXQgb2Ygcm93cy4gVGhleSByZWNlaXZlIHZhbHVlcyBmb3IgZWFjaCByb3cgYW5kIHJldHVybnMgb25lIHZhbHVlIGZvciB0aGUgd2hvbGUgc2V0LgotSWYgQG5vcm1hbEAgY29sdW1ucywgQHNjYWxhciBmdW5jdGlvbnNALCBAVURUQCBmaWVsZHMsIEB3cml0ZXRpbWVAIG9yIEB0dGxAIGFyZSBzZWxlY3RlZCB0b2dldGhlciB3aXRoIGFnZ3JlZ2F0ZSBmdW5jdGlvbnMsIHRoZSB2YWx1ZXMgcmV0dXJuZWQgZm9yIHRoZW0gd2lsbCBiZSB0aGUgb25lcyBvZiB0aGUgZmlyc3Qgcm93IG1hdGNoaW5nIHRoZSBxdWVyeS4KK0lmIEBub3JtYWxAIGNvbHVtbnMsIEBzY2FsYXIgZnVuY3Rpb25zQCwgQFVEVEAgZmllbGRzLCBAd3JpdGV0aW1lQCwgQG1heHdyaXRldGltZUAgb3IgQHR0bEAgYXJlIHNlbGVjdGVkIHRvZ2V0aGVyIHdpdGggYWdncmVnYXRlIGZ1bmN0aW9ucywgdGhlIHZhbHVlcyByZXR1cm5lZCBmb3IgdGhlbSB3aWxsIGJlIHRoZSBvbmVzIG9mIHRoZSBmaXJzdCByb3cgbWF0Y2hpbmcgdGhlIHF1ZXJ5LgogCiBDUUwzIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBidWlsdC1pbiBhZ2dyZWdhdGVzIChzbyBjYWxsZWQgJ25hdGl2ZSBhZ2dyZWdhdGVzJykgYW5kICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlcyI6I3VkYXMuIENRTDMgaW5jbHVkZXMgc2V2ZXJhbCBuYXRpdmUgYWdncmVnYXRlcywgZGVzY3JpYmVkIGJlbG93OgogCkBAIC0yMzc1LDcgKzIzODYsNyBAQAogCiBXaGVyZSBwb3NzaWJsZSwgQ2Fzc2FuZHJhIHdpbGwgcmVwcmVzZW50IGFuZCBhY2NlcHQgZGF0YSB0eXBlcyBpbiB0aGVpciBuYXRpdmUgQEpTT05AIHJlcHJlc2VudGF0aW9uLiAgQ2Fzc2FuZHJhIHdpbGwgYWxzbyBhY2NlcHQgc3RyaW5nIHJlcHJlc2VudGF0aW9ucyBtYXRjaGluZyB0aGUgQ1FMIGxpdGVyYWwgZm9ybWF0IGZvciBhbGwgc2luZ2xlLWZpZWxkIHR5cGVzLiAgRm9yIGV4YW1wbGUsIGZsb2F0cywgaW50cywgVVVJRHMsIGFuZCBkYXRlcyBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgQ1FMIGxpdGVyYWwgc3RyaW5ncy4gIEhvd2V2ZXIsIGNvbXBvdW5kIHR5cGVzLCBzdWNoIGFzIGNvbGxlY3Rpb25zLCB0dXBsZXMsIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMgbXVzdCBiZSByZXByZXNlbnRlZCBieSBuYXRpdmUgQEpTT05AIGNvbGxlY3Rpb25zIChtYXBzIGFuZCBsaXN0cykgb3IgYSBKU09OLWVuY29kZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb2xsZWN0aW9uLgogCi1UaGUgZm9sbG93aW5nIHRhYmxlIGRlc2NyaWJlcyB0aGUgZW5jb2RpbmdzIHRoYXQgQ2Fzc2FuZHJhIHdpbGwgYWNjZXB0IGluIEBJTlNFUlQgSlNPTkAgdmFsdWVzIChhbmQgQGZyb21Kc29uKClAIGFyZ3VtZW50cykgYXMgd2VsbCBhcyB0aGUgZm9ybWF0IENhc3NhbmRyYSB3aWxsIHVzZSB3aGVuIHJldHVybmluZyBkYXRhIGZvciBAU0VMRUNUIEpTT05AIHN0YXRlbWVudHMgKGFuZCBAZnJvbUpzb24oKUApOgorVGhlIGZvbGxvd2luZyB0YWJsZSBkZXNjcmliZXMgdGhlIGVuY29kaW5ncyB0aGF0IENhc3NhbmRyYSB3aWxsIGFjY2VwdCBpbiBASU5TRVJUIEpTT05AIHZhbHVlcyAoYW5kIEBmcm9tX2pzb24oKUAgYXJndW1lbnRzKSBhcyB3ZWxsIGFzIHRoZSBmb3JtYXQgQ2Fzc2FuZHJhIHdpbGwgdXNlIHdoZW4gcmV0dXJuaW5nIGRhdGEgZm9yIEBTRUxFQ1QgSlNPTkAgc3RhdGVtZW50cyAoYW5kIEBmcm9tX2pzb24oKUApOgogCiB8Xy4gdHlwZSAgICB8Xy4gZm9ybWF0cyBhY2NlcHRlZCAgIHxfLiByZXR1cm4gZm9ybWF0IHxfLiBub3Rlc3wKIHxAYXNjaWlAICAgIHxzdHJpbmcgICAgICAgICAgICAgICAgfHN0cmluZyAgICAgICAgICAgfFVzZXMgSlNPTidzIEBcdUAgY2hhcmFjdGVyIGVzY2FwZXwKQEAgLTI0MDMsMTMgKzI0MTQsMTMgQEAKIHxAdmFyY2hhckAgIHxzdHJpbmcgICAgICAgICAgICAgICAgfHN0cmluZyAgICAgICAgICAgfFVzZXMgSlNPTidzIEBcdUAgY2hhcmFjdGVyIGVzY2FwZXwKIHxAdmFyaW50QCAgIHxpbnRlZ2VyLCBzdHJpbmcgICAgICAgfGludGVnZXIgICAgICAgICAgfFZhcmlhYmxlIGxlbmd0aDsgbWF5IG92ZXJmbG93IDMyIG9yIDY0IGJpdCBpbnRlZ2VycyBpbiBjbGllbnQtc2lkZSBkZWNvZGVyfAogCi1oMygjZnJvbUpzb24pLiBUaGUgZnJvbUpzb24oKSBGdW5jdGlvbgoraDMoI2Zyb21fanNvbikuIFRoZSBmcm9tX2pzb24oKSBGdW5jdGlvbgogCi1UaGUgQGZyb21Kc29uKClAIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHNpbWlsYXJseSB0byBASU5TRVJUIEpTT05ALCBidXQgZm9yIGEgc2luZ2xlIGNvbHVtbiB2YWx1ZS4gIEl0IG1heSBvbmx5IGJlIHVzZWQgaW4gdGhlIEBWQUxVRVNAIGNsYXVzZSBvZiBhbiBASU5TRVJUQCBzdGF0ZW1lbnQgb3IgYXMgb25lIG9mIHRoZSBjb2x1bW4gdmFsdWVzIGluIGFuIEBVUERBVEVALCBAREVMRVRFQCwgb3IgQFNFTEVDVEAgc3RhdGVtZW50LiAgRm9yIGV4YW1wbGUsIGl0IGNhbm5vdCBiZSB1c2VkIGluIHRoZSBzZWxlY3Rpb24gY2xhdXNlIG9mIGEgQFNFTEVDVEAgc3RhdGVtZW50LgorVGhlIEBmcm9tX2pzb24oKUAgZnVuY3Rpb24gbWF5IGJlIHVzZWQgc2ltaWxhcmx5IHRvIEBJTlNFUlQgSlNPTkAsIGJ1dCBmb3IgYSBzaW5nbGUgY29sdW1uIHZhbHVlLiAgSXQgbWF5IG9ubHkgYmUgdXNlZCBpbiB0aGUgQFZBTFVFU0AgY2xhdXNlIG9mIGFuIEBJTlNFUlRAIHN0YXRlbWVudCBvciBhcyBvbmUgb2YgdGhlIGNvbHVtbiB2YWx1ZXMgaW4gYW4gQFVQREFURUAsIEBERUxFVEVALCBvciBAU0VMRUNUQCBzdGF0ZW1lbnQuICBGb3IgZXhhbXBsZSwgaXQgY2Fubm90IGJlIHVzZWQgaW4gdGhlIHNlbGVjdGlvbiBjbGF1c2Ugb2YgYSBAU0VMRUNUQCBzdGF0ZW1lbnQuCiAKLWgzKCN0b0pzb24pLiBUaGUgdG9Kc29uKCkgRnVuY3Rpb24KK2gzKCN0b19qc29uKS4gVGhlIHRvX2pzb24oKSBGdW5jdGlvbgogCi1UaGUgQHRvSnNvbigpQCBmdW5jdGlvbiBtYXkgYmUgdXNlZCBzaW1pbGFybHkgdG8gQFNFTEVDVCBKU09OQCwgYnV0IGZvciBhIHNpbmdsZSBjb2x1bW4gdmFsdWUuICBJdCBtYXkgb25seSBiZSB1c2VkIGluIHRoZSBzZWxlY3Rpb24gY2xhdXNlIG9mIGEgQFNFTEVDVEAgc3RhdGVtZW50LgorVGhlIEB0b19qc29uKClAIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHNpbWlsYXJseSB0byBAU0VMRUNUIEpTT05ALCBidXQgZm9yIGEgc2luZ2xlIGNvbHVtbiB2YWx1ZS4gIEl0IG1heSBvbmx5IGJlIHVzZWQgaW4gdGhlIHNlbGVjdGlvbiBjbGF1c2Ugb2YgYSBAU0VMRUNUQCBzdGF0ZW1lbnQuCiAKIGgyKCNhcHBlbmRpeEEpLiBBcHBlbmRpeCBBOiBDUUwgS2V5d29yZHMKIApAQCAtMjQ4OCw2ICsyNDk5LDcgQEAKIHwgQExJU1RAICAgICAgICAgfCBubyAgfAogfCBATE9HSU5AICAgICAgICB8IG5vICB8CiB8IEBNQVBAICAgICAgICAgIHwgbm8gIHwKK3wgQE1BU0tFREAgICAgICAgfCBubyAgfAogfCBATUFURVJJQUxJWkVEQCB8IHllcyB8CiB8IEBNQkVBTkAgICAgICAgIHwgeWVzIHwKIHwgQE1CRUFOU0AgICAgICAgfCB5ZXMgfApAQCAtMjUxNyw2ICsyNTI5LDcgQEAKIHwgQFJPTEVTQCAgICAgICAgfCBubyAgfAogfCBAU0NIRU1BQCAgICAgICB8IHllcyB8CiB8IEBTRUxFQ1RAICAgICAgIHwgeWVzIHwKK3wgQFNFTEVDVF9NQVNLRURAfCBubyAgfAogfCBAU0VUQCAgICAgICAgICB8IHllcyB8CiB8IEBTRlVOQ0AgICAgICAgIHwgbm8gIHwKIHwgQFNNQUxMSU5UQCAgICAgfCBubyAgfApAQCAtMjUzOCw2ICsyNTUxLDcgQEAKIHwgQFRVUExFQCAgICAgICAgfCBubyAgfAogfCBAVFlQRUAgICAgICAgICB8IG5vICB8CiB8IEBVTkxPR0dFREAgICAgIHwgeWVzIHwKK3wgQFVOTUFTS0AgICAgICAgfCBubyAgfAogfCBAVU5TRVRAICAgICAgICB8IHllcyB8CiB8IEBVUERBVEVAICAgICAgIHwgeWVzIHwKIHwgQFVTRUAgICAgICAgICAgfCB5ZXMgfApAQCAtMjU1Miw2ICsyNTY2LDcgQEAKIHwgQFdIRVJFQCAgICAgICAgfCB5ZXMgfAogfCBAV0lUSEAgICAgICAgICB8IHllcyB8CiB8IEBXUklURVRJTUVAICAgIHwgbm8gIHwKK3wgQE1BWFdSSVRFVElNRUAgfCBubyAgfAogCiBoMigjYXBwZW5kaXhCKS4gQXBwZW5kaXggQjogQ1FMIFJlc2VydmVkIFR5cGVzCiAKQEAgLTI1NzAsNiArMjU4NSwxMSBAQAogCiBUaGUgZm9sbG93aW5nIGRlc2NyaWJlcyB0aGUgY2hhbmdlcyBpbiBlYWNoIHZlcnNpb24gb2YgQ1FMLgogCitoMy4gMy40LjcKKworKiBSZW1vdmUgZGVwcmVjYXRlZCBmdW5jdGlvbnMgQGRhdGVPZkAgYW5kIEB1bml4VGltZXN0YW1wT2ZALCByZXBsYWNlZCBieSBAdG9fdGltZXN0YW1wQCBhbmQgQHRvX3VuaXh0aW1lc3RhbXBAIChzZWUgIkNBU1NBTkRSQS0xODMyOCI6aHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMTgzMjgpLgorKiBBZG9wdCBzbmFrZV9jYXNlIGZ1bmN0aW9uIG5hbWVzLCBkZXByZWNhdGluZyBhbGwgcHJldmlvdXMgY2FtZWxDYXNlIG9yIGFsbHRvZ2V0aGVyd2l0aG91dHNwYWNlcyBmdW5jdGlvbiBuYW1lcyAoc2VlICJDQVNTQU5EUkEtMTgwMzciOmh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTE4MDM3KS4KKwogaDMuIDMuNC42CiAKICogQWRkIHN1cHBvcnQgZm9yIEBJRiBFWElTVFNAIGFuZCBASUYgTk9UIEVYSVNUU0AgaW4gQEFMVEVSQCBzdGF0ZW1lbnRzIChzZWUgIkNBU1NBTkRSQS0xNjkxNiI6aHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMTY5MTYpLgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvUk9PVC9wYWdlcy9pbmRleC5hZG9jIGIvZG9jL21vZHVsZXMvUk9PVC9wYWdlcy9pbmRleC5hZG9jCmluZGV4IDRjN2EzZmQuLmRkNmE4NGEgMTAwNjQ0Ci0tLSBhL2RvYy9tb2R1bGVzL1JPT1QvcGFnZXMvaW5kZXguYWRvYworKysgYi9kb2MvbW9kdWxlcy9ST09UL3BhZ2VzL2luZGV4LmFkb2MKQEAgLTE1LDI3ICsxNSwyNyBAQAogW2NvbHM9ImEsYSJdCiB8PT09CiAKLXwgeHJlZjpjYXNzYW5kcmE6Z2V0dGluZ19zdGFydGVkL2luZGV4LmFkb2NbR2V0dGluZyBzdGFydGVkXSB8IE5ld2JpZSBzdGFydGluZyBwb2ludAorfCB4cmVmOmNhc3NhbmRyYTpnZXR0aW5nLXN0YXJ0ZWQvaW5kZXguYWRvY1tHZXR0aW5nIHN0YXJ0ZWRdIHwgTmV3YmllIHN0YXJ0aW5nIHBvaW50CiAKLXwgeHJlZjpjYXNzYW5kcmE6bmV3L2luZGV4LmFkb2NbV2hhdCdzIG5ldyBpbiA0LjFdIHwgV2hhdCdzIG5ldyBpbiBDYXNzYW5kcmEgNC4xCit8IHhyZWY6Y2Fzc2FuZHJhOm5ldy9pbmRleC5hZG9jW1doYXQncyBuZXcgaW4gNS4wXSB8IFdoYXQncyBuZXcgaW4gQ2Fzc2FuZHJhIDUuMAogCiB8IHhyZWY6Y2Fzc2FuZHJhOmFyY2hpdGVjdHVyZS9pbmRleC5hZG9jW0FyY2hpdGVjdHVyZV0gfCBDYXNzYW5kcmEncyBiaWcgcGljdHVyZQogCi18IHhyZWY6Y2Fzc2FuZHJhOmRhdGFfbW9kZWxpbmcvaW5kZXguYWRvY1tEYXRhIG1vZGVsaW5nXSB8IEhpbnQ6IGl0J3Mgbm90IHJlbGF0aW9uYWwKK3wgeHJlZjpjYXNzYW5kcmE6ZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2luZGV4LmFkb2NbRGF0YSBtb2RlbGluZ10gfCBIaW50OiBpdCdzIG5vdCByZWxhdGlvbmFsCiAKLXwgeHJlZjpjYXNzYW5kcmE6Y3FsL2luZGV4LmFkb2NbQ2Fzc2FuZHJhIFF1ZXJ5IExhbmd1YWdlIChDUUwpXSB8IENRTCByZWZlcmVuY2UgZG9jdW1lbnRhdGlvbgorfCB4cmVmOmNhc3NhbmRyYTpkZXZlbG9waW5nL2NxbC9pbmRleC5hZG9jW0Nhc3NhbmRyYSBRdWVyeSBMYW5ndWFnZSAoQ1FMKV0gfCBDUUwgcmVmZXJlbmNlIGRvY3VtZW50YXRpb24KIAotfCB4cmVmOmNhc3NhbmRyYTpjb25maWd1cmF0aW9uL2luZGV4LmFkb2NbQ29uZmlndXJhdGlvbl0gfCBDYXNzYW5kcmEncyBoYW5kbGVzIGFuZCBrbm9icworfCB4cmVmOmNhc3NhbmRyYTpnZXR0aW5nLXN0YXJ0ZWQvY29uZmlndXJhdGlvbi9pbmRleC5hZG9jW0NvbmZpZ3VyYXRpb25dIHwgQ2Fzc2FuZHJhJ3MgaGFuZGxlcyBhbmQga25vYnMKIAotfCB4cmVmOmNhc3NhbmRyYTpvcGVyYXRpbmcvaW5kZXguYWRvY1tPcGVyYXRpb25dIHwgVGhlIG9wZXJhdG9yJ3MgY29ybmVyCit8IHhyZWY6Y2Fzc2FuZHJhOm1hbmFnaW5nL29wZXJhdGluZy9pbmRleC5hZG9jW09wZXJhdGlvbl0gfCBUaGUgb3BlcmF0b3IncyBjb3JuZXIKIAotfCB4cmVmOmNhc3NhbmRyYTp0b29scy9pbmRleC5hZG9jW1Rvb2xzXSB8IGNxbHNoLCBub2RldG9vbCwgYW5kIG90aGVycworfCB4cmVmOmNhc3NhbmRyYTptYW5hZ2luZy90b29scy9pbmRleC5hZG9jW1Rvb2xzXSB8IGNxbHNoLCBub2RldG9vbCwgYW5kIG90aGVycwogCiB8IHhyZWY6Y2Fzc2FuZHJhOnRyb3VibGVzaG9vdGluZy9pbmRleC5hZG9jW1Ryb3VibGVzaG9vdGluZ10gfCBXaGF0IHRvIGxvb2sgZm9yIHdoZW4geW91IGhhdmUgYSBwcm9ibGVtCiAKLXwgeHJlZjpjYXNzYW5kcmE6ZmFxL2luZGV4LmFkb2NbRkFRXSB8IEZyZXF1ZW50bHkgYXNrZWQgcXVlc3Rpb25zCit8IHhyZWY6Y2Fzc2FuZHJhOm92ZXJ2aWV3L2ZhcS9pbmRleC5hZG9jW0ZBUV0gfCBGcmVxdWVudGx5IGFza2VkIHF1ZXN0aW9ucwogCi18IHhyZWY6Y2Fzc2FuZHJhOnBsdWdpbnMvaW5kZXguYWRvY1tQbHVnLWluc10gfCBUaGlyZC1wYXJ0eSBwbHVnLWlucworfCB4cmVmOmNhc3NhbmRyYTppbnRlZ3JhdGluZy9wbHVnaW5zL2luZGV4LmFkb2NbUGx1Zy1pbnNdIHwgVGhpcmQtcGFydHkgcGx1Zy1pbnMKIAogfCB4cmVmOm1hc3RlckBfOlJPT1Q6bmF0aXZlX3Byb3RvY29sLmFkb2NbTmF0aXZlIFByb3RvY29sc10gfCBOYXRpdmUgQ2Fzc2FuZHJhIHByb3RvY29sIHNwZWNpZmljYXRpb25zCiAKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9CQVNIL2dldF9kZWJfcGFja2FnZS5zaCBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9CQVNIL2dldF9kZWJfcGFja2FnZS5zaAppbmRleCA2OTY0OGU4Li44YzFiMDdiIDEwMDY0NAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQkFTSC9nZXRfZGViX3BhY2thZ2Uuc2gKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0JBU0gvZ2V0X2RlYl9wYWNrYWdlLnNoCkBAIC0xLDIgKzEsMiBAQAotJCBlY2hvICJkZWIgaHR0cHM6Ly9kZWJpYW4uY2Fzc2FuZHJhLmFwYWNoZS5vcmcgNDF4IG1haW4iIHwgc3VkbyB0ZWUgLWEgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvY2Fzc2FuZHJhLnNvdXJjZXMubGlzdAotZGViIGh0dHBzOi8vZGViaWFuLmNhc3NhbmRyYS5hcGFjaGUub3JnIDQxeCBtYWluCiskIGVjaG8gImRlYiBodHRwczovL2RlYmlhbi5jYXNzYW5kcmEuYXBhY2hlLm9yZyA0MnggbWFpbiIgfCBzdWRvIHRlZSAtYSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9jYXNzYW5kcmEuc291cmNlcy5saXN0CitkZWIgaHR0cHM6Ly9kZWJpYW4uY2Fzc2FuZHJhLmFwYWNoZS5vcmcgNDJ4IG1haW4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9CTkYvYWx0ZXJfdGFibGUuYm5mIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0JORi9hbHRlcl90YWJsZS5ibmYKaW5kZXggNzI4YTc4YS4uNjMzYThiOCAxMDA2NDQKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0JORi9hbHRlcl90YWJsZS5ibmYKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0JORi9hbHRlcl90YWJsZS5ibmYKQEAgLTEsNSArMSw4IEBACiBhbHRlcl90YWJsZV9zdGF0ZW1lbnQ6Oj0gQUxURVIgVEFCTEUgWyBJRiBFWElTVFMgXSB0YWJsZV9uYW1lIGFsdGVyX3RhYmxlX2luc3RydWN0aW9uCi1hbHRlcl90YWJsZV9pbnN0cnVjdGlvbjo6PSBBREQgWyBJRiBOT1QgRVhJU1RTIF0gY29sdW1uX25hbWUgY3FsX3R5cGUgKCAnLCcgY29sdW1uX25hbWUgY3FsX3R5cGUgKSoKLQl8IERST1AgWyBJRiBFWElTVFMgXSBjb2x1bW5fbmFtZSAoIGNvbHVtbl9uYW1lICkqCithbHRlcl90YWJsZV9pbnN0cnVjdGlvbjo6PSBBREQgWyBJRiBOT1QgRVhJU1RTIF0gY29sdW1uX2RlZmluaXRpb24gKCAnLCcgY29sdW1uX2RlZmluaXRpb24pKgorCXwgRFJPUCBbIElGIEVYSVNUUyBdIGNvbHVtbl9uYW1lICggJywnIGNvbHVtbl9uYW1lICkqCiAJfCBSRU5BTUUgWyBJRiBFWElTVFMgXSBjb2x1bW5fbmFtZSB0byBjb2x1bW5fbmFtZSAoQU5EIGNvbHVtbl9uYW1lIHRvIGNvbHVtbl9uYW1lKSoKKwl8IEFMVEVSIFsgSUYgRVhJU1RTIF0gY29sdW1uX25hbWUgKCBjb2x1bW5fbWFzayB8IERST1AgTUFTS0VEICkKIAl8IFdJVEggb3B0aW9ucworY29sdW1uX2RlZmluaXRpb246Oj0gY29sdW1uX25hbWUgY3FsX3R5cGUgWyBjb2x1bW5fbWFza10KK2NvbHVtbl9tYXNrOjo9IE1BU0tFRCBXSVRIICggREVGQVVMVCB8IGZ1bmN0aW9uX25hbWUgJygnIHRlcm0gKCAnLCcgdGVybSApKiAnKScgKQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0JORi9jcmVhdGVfdGFibGUuYm5mIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0JORi9jcmVhdGVfdGFibGUuYm5mCmluZGV4IDg0MDU3M2MuLmU0MTczYzggMTAwNjQ0Ci0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9CTkYvY3JlYXRlX3RhYmxlLmJuZgorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQk5GL2NyZWF0ZV90YWJsZS5ibmYKQEAgLTIsMTEgKzIsMTIgQEAKIAljb2x1bW5fZGVmaW5pdGlvbiAgKCAnLCcgY29sdW1uX2RlZmluaXRpb24gKSogIAogCVsgJywnIFBSSU1BUlkgS0VZICcoJyBwcmltYXJ5X2tleSAnKScgXSAKIAkgJyknIFsgV0lUSCB0YWJsZV9vcHRpb25zIF0gCi1jb2x1bW5fZGVmaW5pdGlvbjo6PSBjb2x1bW5fbmFtZSBjcWxfdHlwZSBbIFNUQVRJQyBdIFsgUFJJTUFSWSBLRVldIAorY29sdW1uX2RlZmluaXRpb246Oj0gY29sdW1uX25hbWUgY3FsX3R5cGUgWyBTVEFUSUMgXSBbIGNvbHVtbl9tYXNrIF0gWyBQUklNQVJZIEtFWV0KK2NvbHVtbl9tYXNrOjo9IE1BU0tFRCBXSVRIICggREVGQVVMVCB8IGZ1bmN0aW9uX25hbWUgJygnIHRlcm0gKCAnLCcgdGVybSApKiAnKScgKQogcHJpbWFyeV9rZXk6Oj0gcGFydGl0aW9uX2tleSBbICcsJyBjbHVzdGVyaW5nX2NvbHVtbnMgXSAKIHBhcnRpdGlvbl9rZXk6Oj0gY29sdW1uX25hbWUgIHwgJygnIGNvbHVtbl9uYW1lICggJywnIGNvbHVtbl9uYW1lICkqICcpJyAKIGNsdXN0ZXJpbmdfY29sdW1uczo6PSBjb2x1bW5fbmFtZSAoICcsJyBjb2x1bW5fbmFtZSApKiAKLXRhYmxlX29wdGlvbnM6PTogQ09NUEFDVCBTVE9SQUdFIFsgQU5EIHRhYmxlX29wdGlvbnMgXSAgCit0YWJsZV9vcHRpb25zOjo9IENPTVBBQ1QgU1RPUkFHRSBbIEFORCB0YWJsZV9vcHRpb25zIF0KIAl8IENMVVNURVJJTkcgT1JERVIgQlkgJygnIGNsdXN0ZXJpbmdfb3JkZXIgJyknIAogCVsgQU5EIHRhYmxlX29wdGlvbnMgXSAgfCBvcHRpb25zCiBjbHVzdGVyaW5nX29yZGVyOjo9IGNvbHVtbl9uYW1lIChBU0MgfCBERVNDKSAoICcsJyBjb2x1bW5fbmFtZSAoQVNDIHwgREVTQykgKSoKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9CTkYvZ3JhbnRfcGVybWlzc2lvbl9zdGF0ZW1lbnQuYm5mIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0JORi9ncmFudF9wZXJtaXNzaW9uX3N0YXRlbWVudC5ibmYKaW5kZXggNDBmMWRmMy4uNDNhN2VkYSAxMDA2NDQKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0JORi9ncmFudF9wZXJtaXNzaW9uX3N0YXRlbWVudC5ibmYKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0JORi9ncmFudF9wZXJtaXNzaW9uX3N0YXRlbWVudC5ibmYKQEAgLTEsNiArMSw2IEBACiBncmFudF9wZXJtaXNzaW9uX3N0YXRlbWVudCA6Oj0gR1JBTlQgcGVybWlzc2lvbnMgT04gcmVzb3VyY2UgVE8gcm9sZV9uYW1lCiBwZXJtaXNzaW9ucyA6Oj0gQUxMIFsgUEVSTUlTU0lPTlMgXSB8IHBlcm1pc3Npb24gWyBQRVJNSVNTSU9OIF0KLXBlcm1pc3Npb24gOjo9IENSRUFURSB8IEFMVEVSIHwgRFJPUCB8IFNFTEVDVCB8IE1PRElGWSB8IEFVVEhPUklaRSB8IERFU0NSSUJFIHwgRVhFQ1VURQorcGVybWlzc2lvbiA6Oj0gQ1JFQVRFIHwgQUxURVIgfCBEUk9QIHwgU0VMRUNUIHwgTU9ESUZZIHwgQVVUSE9SSVpFIHwgREVTQ1JJQkUgfCBFWEVDVVRFIHwgVU5NQVNLIHwgU0VMRUNUX01BU0tFRAogcmVzb3VyY2UgOjo9ICAgIEFMTCBLRVlTUEFDRVMKICAgICAgICAgICAgICAgICB8IEtFWVNQQUNFIGtleXNwYWNlX25hbWUKICAgICAgICAgICAgICAgICB8IFsgVEFCTEUgXSB0YWJsZV9uYW1lCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2FzLmNxbCBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvYXMuY3FsCmluZGV4IGE4YjlmMDMuLjcyNzA1MjYgMTAwNjQ0Ci0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvYXMuY3FsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvYXMuY3FsCkBAIC0xLDEyICsxLDEyIEBACiAvLyBXaXRob3V0IGFsaWFzCi1TRUxFQ1QgaW50QXNCbG9iKDQpIEZST00gdDsKK1NFTEVDVCBpbnRfYXNfYmxvYig0KSBGUk9NIHQ7CiAKLS8vICBpbnRBc0Jsb2IoNCkKLS8vIC0tLS0tLS0tLS0tLS0tCisvLyAgaW50X2FzX2Jsb2IoNCkKKy8vIC0tLS0tLS0tLS0tLS0tLS0KIC8vICAweDAwMDAwMDA0CiAKIC8vIFdpdGggYWxpYXMKLVNFTEVDVCBpbnRBc0Jsb2IoNCkgQVMgZm91ciBGUk9NIHQ7CitTRUxFQ1QgaW50X2FzX2Jsb2IoNCkgQVMgZm91ciBGUk9NIHQ7CiAKIC8vICBmb3VyCiAvLyAtLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvYXZnX3dpdGhfY2FzdC5jcWwgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2F2Z193aXRoX2Nhc3QuY3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ODM5YjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2F2Z193aXRoX2Nhc3QuY3FsCkBAIC0wLDAgKzEgQEAKK1NFTEVDVCBBVkcgKENBU1QgKHBsYXllcnMgQVMgRkxPQVQpKSBGUk9NIHBsYXlzOwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9jdXJyZW50X2RhdGUuY3FsIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9jdXJyZW50X2RhdGUuY3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MmZiODAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2N1cnJlbnRfZGF0ZS5jcWwKQEAgLTAsMCArMSBAQAorU0VMRUNUICogRlJPTSBteVRhYmxlIFdIRVJFIGRhdGUgPj0gY3VycmVudF9kYXRlKCkgLSAyZDsKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvY3VycmVudGRhdGUuY3FsIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9jdXJyZW50ZGF0ZS5jcWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZWQxYjIuLjAwMDAwMDAKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9jdXJyZW50ZGF0ZS5jcWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1TRUxFQ1QgKiBGUk9NIG15VGFibGUgV0hFUkUgZGF0ZSA+PSBjdXJyZW50RGF0ZSgpIC0gMmQ7CmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9hbHRlcl9tYXNrLmNxbCBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvZGRtX2FsdGVyX21hc2suY3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMTAzMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9hbHRlcl9tYXNrLmNxbApAQCAtMCwwICsxIEBACitBTFRFUiBUQUJMRSBwYXRpZW50cyBBTFRFUiBuYW1lIE1BU0tFRCBXSVRIIG1hc2tfZGVmYXVsdCgpOwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1fY3JlYXRlX3RhYmxlLmNxbCBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvZGRtX2NyZWF0ZV90YWJsZS5jcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjViYTU2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvZGRtX2NyZWF0ZV90YWJsZS5jcWwKQEAgLTAsMCArMSw1IEBACitDUkVBVEUgVEFCTEUgcGF0aWVudHMgKAorICAgaWQgdGltZXV1aWQgUFJJTUFSWSBLRVksCisgICBuYW1lIHRleHQgTUFTS0VEIFdJVEggbWFza19pbm5lcigxLCBudWxsKSwKKyAgIGJpcnRoIGRhdGUgTUFTS0VEIFdJVEggbWFza19kZWZhdWx0KCkKKyk7CmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9jcmVhdGVfdGFibGVfd2l0aF91ZGYuY3FsIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1fY3JlYXRlX3RhYmxlX3dpdGhfdWRmLmNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2RiNDhjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1fY3JlYXRlX3RhYmxlX3dpdGhfdWRmLmNxbApAQCAtMCwwICsxLDExIEBACitDUkVBVEUgRlVOQ1RJT04gcmVkYWN0KGlucHV0IHRleHQpCisgICBDQUxMRUQgT04gTlVMTCBJTlBVVAorICAgUkVUVVJOUyB0ZXh0CisgICBMQU5HVUFHRSBqYXZhCisgICBBUyAncmV0dXJuICJyZWRhY3RlZCI7CisKK0NSRUFURSBUQUJMRSBwYXRpZW50cyAoCisgICBpZCB0aW1ldXVpZCBQUklNQVJZIEtFWSwKKyAgIG5hbWUgdGV4dCBNQVNLRUQgV0lUSCByZWRhY3QoKSwKKyAgIGJpcnRoIGRhdGUKKyk7CmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9jcmVhdGVfdXNlcnMuY3FsIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1fY3JlYXRlX3VzZXJzLmNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTY2YTFhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1fY3JlYXRlX3VzZXJzLmNxbApAQCAtMCwwICsxLDYgQEAKK0NSRUFURSBVU0VSIHByaXZpbGVnZWQgV0lUSCBQQVNTV09SRCAneHl6JzsKK0dSQU5UIFNFTEVDVCBPTiBUQUJMRSBwYXRpZW50cyBUTyBwcml2aWxlZ2VkOworR1JBTlQgVU5NQVNLIE9OIFRBQkxFIHBhdGllbnRzIFRPIHByaXZpbGVnZWQ7CisKK0NSRUFURSBVU0VSIHVucHJpdmlsZWdlZCBXSVRIIFBBU1NXT1JEICd4eXonOworR1JBTlQgU0VMRUNUIE9OIFRBQkxFIHBhdGllbnRzIFRPIHVucHJpdmlsZWdlZDsKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvZGRtX2Ryb3BfbWFzay5jcWwgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9kcm9wX21hc2suY3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZTAzMmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9kcm9wX21hc2suY3FsCkBAIC0wLDAgKzEgQEAKK0FMVEVSIFRBQkxFIHBhdGllbnRzIEFMVEVSIG5hbWUgRFJPUCBNQVNLRUQ7CmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9pbnNlcnRfZGF0YS5jcWwgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9pbnNlcnRfZGF0YS5jcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllOTE2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvZGRtX2luc2VydF9kYXRhLmNxbApAQCAtMCwwICsxLDIgQEAKK0lOU0VSVCBJTlRPIHBhdGllbnRzKGlkLCBuYW1lLCBiaXJ0aCkgVkFMVUVTIChub3coKSwgJ2FsaWNlJywgJzE5ODQtMDEtMDInKTsKK0lOU0VSVCBJTlRPIHBhdGllbnRzKGlkLCBuYW1lLCBiaXJ0aCkgVkFMVUVTIChub3coKSwgJ2JvYicsICcxOTgyLTAyLTAzJyk7CmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9yZXZva2VfdW5tYXNrLmNxbCBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvZGRtX3Jldm9rZV91bm1hc2suY3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZTJiOTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9yZXZva2VfdW5tYXNrLmNxbApAQCAtMCwwICsxIEBACitSRVZPS0UgVU5NQVNLIE9OIFRBQkxFIHBhdGllbnRzIEZST00gcHJpdmlsZWdlZDsKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvZGRtX3NlbGVjdF93aXRoX21hc2tlZF9jb2x1bW5zLmNxbCBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvZGRtX3NlbGVjdF93aXRoX21hc2tlZF9jb2x1bW5zLmNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWNkMDY2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1fc2VsZWN0X3dpdGhfbWFza2VkX2NvbHVtbnMuY3FsCkBAIC0wLDAgKzEsNiBAQAorU0VMRUNUIG5hbWUsIGJpcnRoIEZST00gcGF0aWVudHM7CisKKy8vICBuYW1lICB8IGJpcnRoCisvLyAtLS0tLS0tKy0tLS0tLS0tLS0tLQorLy8gIGEqKioqIHwgMTk3MC0wMS0wMQorLy8gICAgYioqIHwgMTk3MC0wMS0wMQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1fc2VsZWN0X3dpdGhfc2VsZWN0X21hc2tlZC5jcWwgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9zZWxlY3Rfd2l0aF9zZWxlY3RfbWFza2VkLmNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDkzODU1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1fc2VsZWN0X3dpdGhfc2VsZWN0X21hc2tlZC5jcWwKQEAgLTAsMCArMSw4IEBACitDUkVBVEUgVVNFUiB0cnVzdGVkX3VzZXIgV0lUSCBQQVNTV09SRCAneHl6JzsKK0dSQU5UIFNFTEVDVCwgU0VMRUNUX01BU0tFRCBPTiBUQUJMRSBwYXRpZW50cyBUTyB0cnVzdGVkX3VzZXI7CitMT0dJTiB0cnVzdGVkX3VzZXIKK1NFTEVDVCBuYW1lLCBiaXJ0aCBGUk9NIHBhdGllbnRzIFdIRVJFIG5hbWUgPSAnQWxpY2UnIEFMTE9XIEZJTFRFUklORzsKKworLy8gIG5hbWUgIHwgYmlydGgKKy8vIC0tLS0tLS0rLS0tLS0tLS0tLS0tCisvLyAgYSoqKiogfCAxOTcwLTAxLTAxCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9zZWxlY3Rfd2l0aF91bm1hc2tfcGVybWlzc2lvbi5jcWwgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9zZWxlY3Rfd2l0aF91bm1hc2tfcGVybWlzc2lvbi5jcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwNzJjNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvZGRtX3NlbGVjdF93aXRoX3VubWFza19wZXJtaXNzaW9uLmNxbApAQCAtMCwwICsxLDcgQEAKK0xPR0lOIHByaXZpbGVnZWQKK1NFTEVDVCBuYW1lLCBiaXJ0aCBGUk9NIHBhdGllbnRzOworCisvLyAgbmFtZSAgfCBiaXJ0aAorLy8gLS0tLS0tLSstLS0tLS0tLS0tLS0KKy8vICBhbGljZSB8IDE5ODQtMDEtMDIKKy8vICAgIGJvYiB8IDE5ODItMDItMDMKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvZGRtX3NlbGVjdF93aXRob3V0X3NlbGVjdF9tYXNrZWQuY3FsIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1fc2VsZWN0X3dpdGhvdXRfc2VsZWN0X21hc2tlZC5jcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxNWNmOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvZGRtX3NlbGVjdF93aXRob3V0X3NlbGVjdF9tYXNrZWQuY3FsCkBAIC0wLDAgKzEsNiBAQAorQ1JFQVRFIFVTRVIgdW50cnVzdGVkX3VzZXIgV0lUSCBQQVNTV09SRCAneHl6JzsKK0dSQU5UIFNFTEVDVCBPTiBUQUJMRSBwYXRpZW50cyBUTyB1bnRydXN0ZWRfdXNlcjsKK0xPR0lOIHVudHJ1c3RlZF91c2VyCitTRUxFQ1QgbmFtZSwgYmlydGggRlJPTSBwYXRpZW50cyBXSEVSRSBuYW1lID0gJ0FsaWNlJyBBTExPVyBGSUxURVJJTkc7CisKKy8vIFVuYXV0aG9yaXplZDogRXJyb3IgZnJvbSBzZXJ2ZXI6IGNvZGU9MjEwMCBbVW5hdXRob3JpemVkXSBtZXNzYWdlPSJVc2VyIHVudHJ1c3RlZF91c2VyIGhhcyBubyBVTk1BU0sgbm9yIFNFTEVDVF9VTk1BU0sgcGVybWlzc2lvbiBvbiB0YWJsZSBrLnBhdGllbnRzIgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1fc2VsZWN0X3dpdGhvdXRfdW5tYXNrX3Blcm1pc3Npb24uY3FsIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1fc2VsZWN0X3dpdGhvdXRfdW5tYXNrX3Blcm1pc3Npb24uY3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiODBiODMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9zZWxlY3Rfd2l0aG91dF91bm1hc2tfcGVybWlzc2lvbi5jcWwKQEAgLTAsMCArMSw3IEBACitMT0dJTiB1bnByaXZpbGVnZWQKK1NFTEVDVCBuYW1lLCBiaXJ0aCBGUk9NIHBhdGllbnRzOworCisvLyAgbmFtZSAgfCBiaXJ0aAorLy8gLS0tLS0tLSstLS0tLS0tLS0tLS0KKy8vICBhKioqKiB8IDE5NzAtMDEtMDEKKy8vICAgIGIqKiB8IDE5NzAtMDEtMDEKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvc2VsZWN0X3dpdGhfbWFza19mdW5jdGlvbnMuY3FsIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9zZWxlY3Rfd2l0aF9tYXNrX2Z1bmN0aW9ucy5jcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc5MjNmYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvc2VsZWN0X3dpdGhfbWFza19mdW5jdGlvbnMuY3FsCkBAIC0wLDAgKzEsMTUgQEAKK0NSRUFURSBUQUJMRSBwYXRpZW50cyAoCisgICBpZCB0aW1ldXVpZCBQUklNQVJZIEtFWSwKKyAgIG5hbWUgdGV4dCwKKyAgIGJpcnRoIGRhdGUKKyk7CisKK0lOU0VSVCBJTlRPIHBhdGllbnRzKGlkLCBuYW1lLCBiaXJ0aCkgVkFMVUVTIChub3coKSwgJ2FsaWNlJywgJzE5ODItMDEtMDInKTsKK0lOU0VSVCBJTlRPIHBhdGllbnRzKGlkLCBuYW1lLCBiaXJ0aCkgVkFMVUVTIChub3coKSwgJ2JvYicsICcxOTgyLTAxLTAyJyk7CisKK1NFTEVDVCBtYXNrX2lubmVyKG5hbWUsIDEsIG51bGwpLCBtYXNrX2RlZmF1bHQoYmlydGgpIEZST00gcGF0aWVudHM7CisKKy8vICAgc3lzdGVtLm1hc2tfaW5uZXIobmFtZSwgMSwgTlVMTCkgfCBzeXN0ZW0ubWFza19kZWZhdWx0KGJpcnRoKQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIqKiB8ICAgICAgICAgICAgICAgICAxOTcwLTAxLTAxCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEqKioqIHwgICAgICAgICAgICAgICAgIDE5NzAtMDEtMDEKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvc3VtX3dpdGhfY2FzdC5jcWwgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML3N1bV93aXRoX2Nhc3QuY3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNjFkZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML3N1bV93aXRoX2Nhc3QuY3FsCkBAIC0wLDAgKzEgQEAKK1NFTEVDVCBTVU0gKENBU1QgKHBsYXllcnMgQVMgVkFSSU5UKSkgRlJPTSBwbGF5czsKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvdGltZXV1aWRfbWluX21heC5jcWwgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML3RpbWV1dWlkX21pbl9tYXguY3FsCmluZGV4IDgxMzUzZjUuLjVhMWZjNTEgMTAwNjQ0Ci0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvdGltZXV1aWRfbWluX21heC5jcWwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC90aW1ldXVpZF9taW5fbWF4LmNxbApAQCAtMSwzICsxLDMgQEAKIFNFTEVDVCAqIEZST00gbXlUYWJsZQotIFdIRVJFIHQgPiBtYXhUaW1ldXVpZCgnMjAxMy0wMS0wMSAwMDowNSswMDAwJykKLSAgIEFORCB0IDwgbWluVGltZXV1aWQoJzIwMTMtMDItMDIgMTA6MDArMDAwMCcpOworIFdIRVJFIHQgPiBtYXhfdGltZXV1aWQoJzIwMTMtMDEtMDEgMDA6MDUrMDAwMCcpCisgICBBTkQgdCA8IG1pbl90aW1ldXVpZCgnMjAxMy0wMi0wMiAxMDowMCswMDAwJyk7CmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvUkVTVUxUUy9hZGRfeXVtX3JlcG8ucmVzdWx0IGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL1JFU1VMVFMvYWRkX3l1bV9yZXBvLnJlc3VsdAppbmRleCA2ZmU3MDRhLi40YjE4OGUxIDEwMDY0NAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvUkVTVUxUUy9hZGRfeXVtX3JlcG8ucmVzdWx0CisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9SRVNVTFRTL2FkZF95dW1fcmVwby5yZXN1bHQKQEAgLTEsNiArMSw2IEBACiBbY2Fzc2FuZHJhXQogbmFtZT1BcGFjaGUgQ2Fzc2FuZHJhCi1iYXNldXJsPWh0dHBzOi8vcmVkaGF0LmNhc3NhbmRyYS5hcGFjaGUub3JnLzQxeC8KK2Jhc2V1cmw9aHR0cHM6Ly9yZWRoYXQuY2Fzc2FuZHJhLmFwYWNoZS5vcmcvNDJ4LwogZ3BnY2hlY2s9MQogcmVwb19ncGdjaGVjaz0xCiBncGdrZXk9aHR0cHM6Ly9kb3dubG9hZHMuYXBhY2hlLm9yZy9jYXNzYW5kcmEvS0VZUwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL25hdi5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL25hdi5hZG9jCmluZGV4IDQ4NDlhYmIuLjJiNjNiY2YgMTAwNjQ0Ci0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9uYXYuYWRvYworKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvbmF2LmFkb2MKQEAgLTEsODYgKzEsODYgQEAKICogQ2Fzc2FuZHJhCi0qKiB4cmVmOmdldHRpbmdfc3RhcnRlZC9pbmRleC5hZG9jW0dldHRpbmcgU3RhcnRlZF0JCi0qKiogeHJlZjpnZXR0aW5nX3N0YXJ0ZWQvaW5zdGFsbGluZy5hZG9jW0luc3RhbGxpbmcgQ2Fzc2FuZHJhXQotKioqIHhyZWY6Z2V0dGluZ19zdGFydGVkL2NvbmZpZ3VyaW5nLmFkb2NbQ29uZmlndXJpbmcgQ2Fzc2FuZHJhXQotKioqIHhyZWY6Z2V0dGluZ19zdGFydGVkL3F1ZXJ5aW5nLmFkb2NbSW5zZXJ0aW5nIGFuZCBxdWVyeWluZ10KLSoqKiB4cmVmOmdldHRpbmdfc3RhcnRlZC9kcml2ZXJzLmFkb2NbQ2xpZW50IGRyaXZlcnNdCi0qKiogeHJlZjpnZXR0aW5nX3N0YXJ0ZWQvamF2YTExLmFkb2NbU3VwcG9ydCBmb3IgSmF2YSAxMV0KLSoqKiB4cmVmOmdldHRpbmdfc3RhcnRlZC9wcm9kdWN0aW9uLmFkb2NbUHJvZHVjdGlvbiByZWNvbW1lbmRhdGlvbnNdCisqKiB4cmVmOmdldHRpbmctc3RhcnRlZC9pbmRleC5hZG9jW0dldHRpbmcgU3RhcnRlZF0JCisqKiogeHJlZjppbnN0YWxsaW5nL2luc3RhbGxpbmcuYWRvY1tJbnN0YWxsaW5nIENhc3NhbmRyYV0KKyoqKiB4cmVmOmdldHRpbmctc3RhcnRlZC9jb25maWd1cmluZy5hZG9jW0NvbmZpZ3VyaW5nIENhc3NhbmRyYV0KKyoqKiB4cmVmOmdldHRpbmctc3RhcnRlZC9xdWVyeWluZy5hZG9jW0luc2VydGluZyBhbmQgcXVlcnlpbmddCisqKiogeHJlZjpnZXR0aW5nLXN0YXJ0ZWQvZHJpdmVycy5hZG9jW0NsaWVudCBkcml2ZXJzXQorKioqIHhyZWY6Z2V0dGluZy1zdGFydGVkL2phdmExMS5hZG9jW1N1cHBvcnQgZm9yIEphdmEgMTFdCisqKiogeHJlZjpnZXR0aW5nLXN0YXJ0ZWQvcHJvZHVjdGlvbi5hZG9jW1Byb2R1Y3Rpb24gcmVjb21tZW5kYXRpb25zXQogCiAqKiB4cmVmOm5ldy9pbmRleC5hZG9jW1doYXQncyBuZXddCiAKICoqIHhyZWY6YXJjaGl0ZWN0dXJlL2luZGV4LmFkb2NbQXJjaGl0ZWN0dXJlXQogKioqIHhyZWY6YXJjaGl0ZWN0dXJlL292ZXJ2aWV3LmFkb2NbT3ZlcnZpZXddCiAqKiogeHJlZjphcmNoaXRlY3R1cmUvZHluYW1vLmFkb2NbRHluYW1vXQkJCi0qKiogeHJlZjphcmNoaXRlY3R1cmUvc3RvcmFnZV9lbmdpbmUuYWRvY1tTdG9yYWdlIGVuZ2luZV0KKyoqKiB4cmVmOmFyY2hpdGVjdHVyZS9zdG9yYWdlLWVuZ2luZS5hZG9jW1N0b3JhZ2UgZW5naW5lXQogKioqIHhyZWY6YXJjaGl0ZWN0dXJlL2d1YXJhbnRlZXMuYWRvY1tHdWFyYW50ZWVzXQogKioqIHhyZWY6YXJjaGl0ZWN0dXJlL21lc3NhZ2luZy5hZG9jW0ltcHJvdmVkIGludGVybm9kZSBtZXNzYWdpbmddCiAqKiogeHJlZjphcmNoaXRlY3R1cmUvc3RyZWFtaW5nLmFkb2NbSW1wcm92ZWQgc3RyZWFtaW5nXQogCi0qKiB4cmVmOmRhdGFfbW9kZWxpbmcvaW5kZXguYWRvY1tEYXRhIG1vZGVsaW5nXQotKioqIHhyZWY6ZGF0YV9tb2RlbGluZy9pbnRyby5hZG9jW0ludHJvZHVjdGlvbl0KLSoqKiB4cmVmOmRhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19jb25jZXB0dWFsLmFkb2NbQ29uY2VwdHVhbCBkYXRhIG1vZGVsaW5nXQotKioqIHhyZWY6ZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX3JkYm1zLmFkb2NbUkRCTVMgZGVzaWduXQotKioqIHhyZWY6ZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX3F1ZXJpZXMuYWRvY1tEZWZpbmluZyBhcHBsaWNhdGlvbiBxdWVyaWVzXQotKioqIHhyZWY6ZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX2xvZ2ljYWwuYWRvY1tMb2dpY2FsIGRhdGEgbW9kZWxpbmddCi0qKiogeHJlZjpkYXRhX21vZGVsaW5nL2RhdGFfbW9kZWxpbmdfcGh5c2ljYWwuYWRvY1tQaHlzaWNhbCBkYXRhIG1vZGVsaW5nXQotKioqIHhyZWY6ZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX3JlZmluaW5nLmFkb2NbRXZhbHVhdGluZyBhbmQgcmVmaW5pbmcgZGF0YSBtb2RlbHNdCi0qKiogeHJlZjpkYXRhX21vZGVsaW5nL2RhdGFfbW9kZWxpbmdfc2NoZW1hLmFkb2NbRGVmaW5pbmcgZGF0YWJhc2Ugc2NoZW1hXQotKioqIHhyZWY6ZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX3Rvb2xzLmFkb2NbQ2Fzc2FuZHJhIGRhdGEgbW9kZWxpbmcgdG9vbHNdCisqKiB4cmVmOmRldmVsb3Bpbmc6ZGF0YS1tb2RlbGluZy9pbmRleC5hZG9jW0RhdGEgbW9kZWxpbmddCisqKiogeHJlZjpkZXZlbG9waW5nOmRhdGEtbW9kZWxpbmcvaW50cm8uYWRvY1tJbnRyb2R1Y3Rpb25dCisqKiogeHJlZjpkZXZlbG9waW5nOmRhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19jb25jZXB0dWFsLmFkb2NbQ29uY2VwdHVhbCBkYXRhIG1vZGVsaW5nXQorKioqIHhyZWY6ZGV2ZWxvcGluZzpkYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfcmRibXMuYWRvY1tSREJNUyBkZXNpZ25dCisqKiogeHJlZjpkZXZlbG9waW5nOmRhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19xdWVyaWVzLmFkb2NbRGVmaW5pbmcgYXBwbGljYXRpb24gcXVlcmllc10KKyoqKiB4cmVmOmRldmVsb3Bpbmc6ZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX2xvZ2ljYWwuYWRvY1tMb2dpY2FsIGRhdGEgbW9kZWxpbmddCisqKiogeHJlZjpkZXZlbG9waW5nOmRhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19waHlzaWNhbC5hZG9jW1BoeXNpY2FsIGRhdGEgbW9kZWxpbmddCisqKiogeHJlZjpkZXZlbG9waW5nOmRhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19yZWZpbmluZy5hZG9jW0V2YWx1YXRpbmcgYW5kIHJlZmluaW5nIGRhdGEgbW9kZWxzXQorKioqIHhyZWY6ZGV2ZWxvcGluZzpkYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfc2NoZW1hLmFkb2NbRGVmaW5pbmcgZGF0YWJhc2Ugc2NoZW1hXQorKioqIHhyZWY6ZGV2ZWxvcGluZzpkYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfdG9vbHMuYWRvY1tDYXNzYW5kcmEgZGF0YSBtb2RlbGluZyB0b29sc10KIAotKiogeHJlZjpjcWwvaW5kZXguYWRvY1tDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UgKENRTCldCi0qKiogeHJlZjpjcWwvZGVmaW5pdGlvbnMuYWRvY1tEZWZpbml0aW9uc10KLSoqKiB4cmVmOmNxbC90eXBlcy5hZG9jW0RhdGEgdHlwZXNdCi0qKiogeHJlZjpjcWwvZGRsLmFkb2NbRGF0YSBkZWZpbml0aW9uIChEREwpXQotKioqIHhyZWY6Y3FsL2RtbC5hZG9jW0RhdGEgbWFuaXB1bGF0aW9uIChETUwpXQotKioqIHhyZWY6Y3FsL29wZXJhdG9ycy5hZG9jW09wZXJhdG9yc10KLSoqKiB4cmVmOmNxbC9pbmRleGVzLmFkb2NbU2Vjb25kYXJ5IGluZGV4ZXNdCi0qKiogeHJlZjpjcWwvbXZzLmFkb2NbTWF0ZXJpYWxpemVkIHZpZXdzXQotKioqIHhyZWY6Y3FsL2Z1bmN0aW9ucy5hZG9jW0Z1bmN0aW9uc10KLSoqKiB4cmVmOmNxbC9qc29uLmFkb2NbSlNPTl0KLSoqKiB4cmVmOmNxbC9zZWN1cml0eS5hZG9jW1NlY3VyaXR5XQotKioqIHhyZWY6Y3FsL3RyaWdnZXJzLmFkb2NbVHJpZ2dlcnNdCi0qKiogeHJlZjpjcWwvYXBwZW5kaWNlcy5hZG9jW0FwcGVuZGljZXNdCi0qKiogeHJlZjpjcWwvY2hhbmdlcy5hZG9jW0NoYW5nZXNdCi0qKiogeHJlZjpjcWwvU0FTSS5hZG9jW1NBU0ldCi0qKiogeHJlZjpjcWwvY3FsX3NpbmdsZWZpbGUuYWRvY1tTaW5nbGUgZmlsZSBvZiBDUUwgaW5mb3JtYXRpb25dCisqKiB4cmVmOmRldmVsb3Bpbmc6Y3FsL2luZGV4LmFkb2NbQ2Fzc2FuZHJhIFF1ZXJ5IExhbmd1YWdlIChDUUwpXQorKioqIHhyZWY6ZGV2ZWxvcGluZzpjcWwvZGVmaW5pdGlvbnMuYWRvY1tEZWZpbml0aW9uc10KKyoqKiB4cmVmOmRldmVsb3Bpbmc6Y3FsL3R5cGVzLmFkb2NbRGF0YSB0eXBlc10KKyoqKiB4cmVmOmRldmVsb3Bpbmc6Y3FsL2RkbC5hZG9jW0RhdGEgZGVmaW5pdGlvbiAoRERMKV0KKyoqKiB4cmVmOmRldmVsb3Bpbmc6Y3FsL2RtbC5hZG9jW0RhdGEgbWFuaXB1bGF0aW9uIChETUwpXQorKioqIHhyZWY6ZGV2ZWxvcGluZzpjcWwvb3BlcmF0b3JzLmFkb2NbT3BlcmF0b3JzXQorKioqIHhyZWY6ZGV2ZWxvcGluZzpjcWwvaW5kZXhlcy5hZG9jW1NlY29uZGFyeSBpbmRleGVzXQorKioqIHhyZWY6ZGV2ZWxvcGluZzpjcWwvbXZzLmFkb2NbTWF0ZXJpYWxpemVkIHZpZXdzXQorKioqIHhyZWY6ZGV2ZWxvcGluZzpjcWwvZnVuY3Rpb25zLmFkb2NbRnVuY3Rpb25zXQorKioqIHhyZWY6ZGV2ZWxvcGluZzpjcWwvanNvbi5hZG9jW0pTT05dCisqKiogeHJlZjpkZXZlbG9waW5nOmNxbC9zZWN1cml0eS5hZG9jW1NlY3VyaXR5XQorKioqIHhyZWY6ZGV2ZWxvcGluZzpjcWwvdHJpZ2dlcnMuYWRvY1tUcmlnZ2Vyc10KKyoqKiB4cmVmOmRldmVsb3Bpbmc6Y3FsL2FwcGVuZGljZXMuYWRvY1tBcHBlbmRpY2VzXQorKioqIHhyZWY6ZGV2ZWxvcGluZzpjcWwvY2hhbmdlcy5hZG9jW0NoYW5nZXNdCisqKiogeHJlZjpkZXZlbG9waW5nOmNxbC9TQVNJLmFkb2NbU0FTSV0KKyoqKiB4cmVmOmRldmVsb3Bpbmc6Y3FsL2NxbF9zaW5nbGVmaWxlLmFkb2NbU2luZ2xlIGZpbGUgb2YgQ1FMIGluZm9ybWF0aW9uXQogCi0qKiB4cmVmOmNvbmZpZ3VyYXRpb24vaW5kZXguYWRvY1tDb25maWd1cmF0aW9uXQotKioqIHhyZWY6Y29uZmlndXJhdGlvbi9jYXNzX3lhbWxfZmlsZS5hZG9jW2Nhc3NhbmRyYS55YW1sXQotKioqIHhyZWY6Y29uZmlndXJhdGlvbi9jYXNzX3JhY2tkY19maWxlLmFkb2NbY2Fzc2FuZHJhLXJhY2tkYy5wcm9wZXJ0aWVzXQotKioqIHhyZWY6Y29uZmlndXJhdGlvbi9jYXNzX2Vudl9zaF9maWxlLmFkb2NbY2Fzc2FuZHJhLWVudi5zaF0KLSoqKiB4cmVmOmNvbmZpZ3VyYXRpb24vY2Fzc190b3BvX2ZpbGUuYWRvY1tjYXNzYW5kcmEtdG9wb2xvZ2llcy5wcm9wZXJ0aWVzXQotKioqIHhyZWY6Y29uZmlndXJhdGlvbi9jYXNzX2NsX2FyY2hpdmVfZmlsZS5hZG9jW2NvbW1pdGxvZy1hcmNoaXZpbmcucHJvcGVydGllc10KLSoqKiB4cmVmOmNvbmZpZ3VyYXRpb24vY2Fzc19sb2diYWNrX3htbF9maWxlLmFkb2NbbG9nYmFjay54bWxdCi0qKiogeHJlZjpjb25maWd1cmF0aW9uL2Nhc3NfanZtX29wdGlvbnNfZmlsZS5hZG9jW2p2bS0qIGZpbGVzXQotKioqIHhyZWY6Y29uZmlndXJhdGlvbi9jb25maWd1cmF0aW9uLmFkb2NbTGliZXJhdGluZyBjYXNzYW5kcmEueWFtbCBQYXJhbWV0ZXJzJyBOYW1lcyBmcm9tIFRoZWlyIFVuaXRzXQorKiogeHJlZjptYW5hZ2luZzpjb25maWd1cmF0aW9uL2luZGV4LmFkb2NbQ29uZmlndXJhdGlvbl0KKyoqKiB4cmVmOm1hbmFnaW5nOmNvbmZpZ3VyYXRpb24vY2Fzc195YW1sX2ZpbGUuYWRvY1tjYXNzYW5kcmEueWFtbF0KKyoqKiB4cmVmOm1hbmFnaW5nOmNvbmZpZ3VyYXRpb24vY2Fzc19yYWNrZGNfZmlsZS5hZG9jW2Nhc3NhbmRyYS1yYWNrZGMucHJvcGVydGllc10KKyoqKiB4cmVmOm1hbmFnaW5nOmNvbmZpZ3VyYXRpb24vY2Fzc19lbnZfc2hfZmlsZS5hZG9jW2Nhc3NhbmRyYS1lbnYuc2hdCisqKiogeHJlZjptYW5hZ2luZzpjb25maWd1cmF0aW9uL2Nhc3NfdG9wb19maWxlLmFkb2NbY2Fzc2FuZHJhLXRvcG9sb2dpZXMucHJvcGVydGllc10KKyoqKiB4cmVmOm1hbmFnaW5nOmNvbmZpZ3VyYXRpb24vY2Fzc19jbF9hcmNoaXZlX2ZpbGUuYWRvY1tjb21taXRsb2ctYXJjaGl2aW5nLnByb3BlcnRpZXNdCisqKiogeHJlZjptYW5hZ2luZzpjb25maWd1cmF0aW9uL2Nhc3NfbG9nYmFja194bWxfZmlsZS5hZG9jW2xvZ2JhY2sueG1sXQorKioqIHhyZWY6bWFuYWdpbmc6Y29uZmlndXJhdGlvbi9jYXNzX2p2bV9vcHRpb25zX2ZpbGUuYWRvY1tqdm0tKiBmaWxlc10KKyoqKiB4cmVmOm1hbmFnaW5nOmNvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi5hZG9jW0xpYmVyYXRpbmcgY2Fzc2FuZHJhLnlhbWwgUGFyYW1ldGVycycgTmFtZXMgZnJvbSBUaGVpciBVbml0c10KIAotKiogeHJlZjpvcGVyYXRpbmcvaW5kZXguYWRvY1tPcGVyYXRpbmddCi0qKiogeHJlZjpvcGVyYXRpbmcvc25pdGNoLmFkb2NbU25pdGNoZXNdCi0qKiogeHJlZjpvcGVyYXRpbmcvdG9wb19jaGFuZ2VzLmFkb2NbVG9wb2xvZ3kgY2hhbmdlc10KLSoqKiB4cmVmOm9wZXJhdGluZy9yZXBhaXIuYWRvY1tSZXBhaXJdCi0qKiogeHJlZjpvcGVyYXRpbmcvcmVhZF9yZXBhaXIuYWRvY1tSZWFkIHJlcGFpcl0KLSoqKiB4cmVmOm9wZXJhdGluZy9oaW50cy5hZG9jW0hpbnRzXQotKioqIHhyZWY6b3BlcmF0aW5nL2Jsb29tX2ZpbHRlcnMuYWRvY1tCbG9vbSBmaWx0ZXJzXQotKioqIHhyZWY6b3BlcmF0aW5nL2NvbXByZXNzaW9uLmFkb2NbQ29tcHJlc3Npb25dCi0qKiogeHJlZjpvcGVyYXRpbmcvY2RjLmFkb2NbQ2hhbmdlIERhdGEgQ2FwdHVyZSAoQ0RDKV0KLSoqKiB4cmVmOm9wZXJhdGluZy9iYWNrdXBzLmFkb2NbQmFja3Vwc10KLSoqKiB4cmVmOm9wZXJhdGluZy9idWxrX2xvYWRpbmcuYWRvY1tCdWxrIGxvYWRpbmddCi0qKiogeHJlZjpvcGVyYXRpbmcvbWV0cmljcy5hZG9jW01ldHJpY3NdCi0qKiogeHJlZjpvcGVyYXRpbmcvc2VjdXJpdHkuYWRvY1tTZWN1cml0eV0KLSoqKiB4cmVmOm9wZXJhdGluZy9oYXJkd2FyZS5hZG9jW0hhcmR3YXJlXQotKioqIHhyZWY6b3BlcmF0aW5nL2NvbXBhY3Rpb24vaW5kZXguYWRvY1tDb21wYWN0aW9uXQotKioqIHhyZWY6b3BlcmF0aW5nL3ZpcnR1YWx0YWJsZXMuYWRvY1tWaXJ0dWFsIHRhYmxlc10KLSoqKiB4cmVmOm9wZXJhdGluZy9hdWRpdGxvZ2dpbmcuYWRvY1tBdWRpdCBsb2dnaW5nXQotKioqIHhyZWY6b3BlcmF0aW5nL2F1ZGl0X2xvZ2dpbmcuYWRvY1tBdWRpdCBsb2dnaW5nIDJdCi0qKiogeHJlZjpvcGVyYXRpbmcvZnFsbG9nZ2luZy5hZG9jW0Z1bGwgcXVlcnkgbG9nZ2luZ10KLSoqKiB4cmVmOm9wZXJhdGluZy90cmFuc2llbnRyZXBsaWNhdGlvbi5hZG9jW1RyYW5zaWVudCByZXBsaWNhdGlvbl0KKyoqIHhyZWY6bWFuYWdpbmc6b3BlcmF0aW5nL2luZGV4LmFkb2NbT3BlcmF0aW5nXQorKioqIHhyZWY6bWFuYWdpbmc6b3BlcmF0aW5nL3NuaXRjaC5hZG9jW1NuaXRjaGVzXQorKioqIHhyZWY6bWFuYWdpbmc6b3BlcmF0aW5nL3RvcG9fY2hhbmdlcy5hZG9jW1RvcG9sb2d5IGNoYW5nZXNdCisqKiogeHJlZjptYW5hZ2luZzpvcGVyYXRpbmcvcmVwYWlyLmFkb2NbUmVwYWlyXQorKioqIHhyZWY6bWFuYWdpbmc6b3BlcmF0aW5nL3JlYWRfcmVwYWlyLmFkb2NbUmVhZCByZXBhaXJdCisqKiogeHJlZjptYW5hZ2luZzpvcGVyYXRpbmcvaGludHMuYWRvY1tIaW50c10KKyoqKiB4cmVmOm1hbmFnaW5nOm9wZXJhdGluZy9ibG9vbV9maWx0ZXJzLmFkb2NbQmxvb20gZmlsdGVyc10KKyoqKiB4cmVmOm1hbmFnaW5nOm9wZXJhdGluZy9jb21wcmVzc2lvbi5hZG9jW0NvbXByZXNzaW9uXQorKioqIHhyZWY6bWFuYWdpbmc6b3BlcmF0aW5nL2NkYy5hZG9jW0NoYW5nZSBEYXRhIENhcHR1cmUgKENEQyldCisqKiogeHJlZjptYW5hZ2luZzpvcGVyYXRpbmcvYmFja3Vwcy5hZG9jW0JhY2t1cHNdCisqKiogeHJlZjptYW5hZ2luZzpvcGVyYXRpbmcvYnVsa19sb2FkaW5nLmFkb2NbQnVsayBsb2FkaW5nXQorKioqIHhyZWY6bWFuYWdpbmc6b3BlcmF0aW5nL21ldHJpY3MuYWRvY1tNZXRyaWNzXQorKioqIHhyZWY6bWFuYWdpbmc6b3BlcmF0aW5nL3NlY3VyaXR5LmFkb2NbU2VjdXJpdHldCisqKiogeHJlZjptYW5hZ2luZzpvcGVyYXRpbmcvaGFyZHdhcmUuYWRvY1tIYXJkd2FyZV0KKyoqKiB4cmVmOm1hbmFnaW5nOm9wZXJhdGluZy9jb21wYWN0aW9uL2luZGV4LmFkb2NbQ29tcGFjdGlvbl0KKyoqKiB4cmVmOm1hbmFnaW5nOm9wZXJhdGluZy92aXJ0dWFsdGFibGVzLmFkb2NbVmlydHVhbCB0YWJsZXNdCisqKiogeHJlZjptYW5hZ2luZzpvcGVyYXRpbmcvYXVkaXRsb2dnaW5nLmFkb2NbQXVkaXQgbG9nZ2luZ10KKyoqKiB4cmVmOm1hbmFnaW5nOm9wZXJhdGluZy9hdWRpdF9sb2dnaW5nLmFkb2NbQXVkaXQgbG9nZ2luZyAyXQorKioqIHhyZWY6bWFuYWdpbmc6b3BlcmF0aW5nL2ZxbGxvZ2dpbmcuYWRvY1tGdWxsIHF1ZXJ5IGxvZ2dpbmddCisqKiogeHJlZjptYW5hZ2luZzpvcGVyYXRpbmcvdHJhbnNpZW50cmVwbGljYXRpb24uYWRvY1tUcmFuc2llbnQgcmVwbGljYXRpb25dCiAKLSoqIHhyZWY6dG9vbHMvaW5kZXguYWRvY1tUb29sc10KLSoqKiB4cmVmOnRvb2xzL2NxbHNoLmFkb2NbY3Fsc2g6IHRoZSBDUUwgc2hlbGxdCi0qKiogeHJlZjp0b29scy9ub2RldG9vbC9ub2RldG9vbC5hZG9jW25vZGV0b29sXQotKioqIHhyZWY6dG9vbHMvc3N0YWJsZS9pbmRleC5hZG9jW1NTVGFibGUgdG9vbHNdCi0qKiogeHJlZjp0b29scy9jYXNzYW5kcmFfc3RyZXNzLmFkb2NbY2Fzc2FuZHJhLXN0cmVzc10KKyoqIHhyZWY6bWFuYWdpbmc6dG9vbHMvaW5kZXguYWRvY1tUb29sc10KKyoqKiB4cmVmOm1hbmFnaW5nOnRvb2xzL2NxbHNoLmFkb2NbY3Fsc2g6IHRoZSBDUUwgc2hlbGxdCisqKiogeHJlZjptYW5hZ2luZzp0b29scy9ub2RldG9vbC9ub2RldG9vbC5hZG9jW25vZGV0b29sXQorKioqIHhyZWY6bWFuYWdpbmc6dG9vbHMvc3N0YWJsZS9pbmRleC5hZG9jW1NTVGFibGUgdG9vbHNdCisqKiogeHJlZjptYW5hZ2luZzp0b29scy9jYXNzYW5kcmFfc3RyZXNzLmFkb2NbY2Fzc2FuZHJhLXN0cmVzc10KIAogKiogeHJlZjp0cm91Ymxlc2hvb3RpbmcvaW5kZXguYWRvY1tUcm91Ymxlc2hvb3RpbmddCiAqKiogeHJlZjp0cm91Ymxlc2hvb3RpbmcvZmluZGluZ19ub2Rlcy5hZG9jW0ZpbmRpbmcgbWlzYmVoYXZpbmcgbm9kZXNdCkBAIC0xMDEsNyArMTAxLDcgQEAKICoqKiB4cmVmOm1hc3RlckBfOlJPT1Q6ZGV2ZWxvcG1lbnQvZGVwZW5kZW5jaWVzLmFkb2NbRGVwZW5kZW5jeSBtYW5hZ2VtZW50XQogKioqIHhyZWY6bWFzdGVyQF86Uk9PVDpkZXZlbG9wbWVudC9yZWxlYXNlX3Byb2Nlc3MuYWRvY1tSZWxlYXNlIHByb2Nlc3NdCiAKLSoqIHhyZWY6ZmFxL2luZGV4LmFkb2NbRkFRXQorKiogeHJlZjpvdmVydmlldzpmYXEvaW5kZXguYWRvY1tGQVFdCiAKLSoqIHhyZWY6cGx1Z2lucy9pbmRleC5hZG9jW1BsdWctaW5zXQorKiogeHJlZjppbnRlZ3JhdGluZzpwbHVnaW5zL2luZGV4LmFkb2NbUGx1Zy1pbnNdCiAKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9hcmNoaXRlY3R1cmUvZHluYW1vLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvYXJjaGl0ZWN0dXJlL2R5bmFtby5hZG9jCmluZGV4IGU5MDM5MGEuLmFhMWNmNWEgMTAwNjQ0Ci0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9hcmNoaXRlY3R1cmUvZHluYW1vLmFkb2MKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2FyY2hpdGVjdHVyZS9keW5hbW8uYWRvYwpAQCAtMSw3ICsxLDcgQEAKID0gRHluYW1vCiAKIEFwYWNoZSBDYXNzYW5kcmEgcmVsaWVzIG9uIGEgbnVtYmVyIG9mIHRlY2huaXF1ZXMgZnJvbSBBbWF6b24ncwotaHR0cDovL2NvdXJzZXMuY3NlLnRhbXUuZWR1L2NhdmVybGVlL2NzY2U0MzgvcmVhZGluZ3MvZHluYW1vLXBhcGVyLnBkZltEeW5hbW9dCitodHRwczovL3d3dy5jcy5jb3JuZWxsLmVkdS9jb3Vyc2VzL2NzNTQxNC8yMDE3ZmEvcGFwZXJzL2R5bmFtby5wZGZbRHluYW1vXQogZGlzdHJpYnV0ZWQgc3RvcmFnZSBrZXktdmFsdWUgc3lzdGVtLiBFYWNoIG5vZGUgaW4gdGhlIER5bmFtbyBzeXN0ZW0gaGFzCiB0aHJlZSBtYWluIGNvbXBvbmVudHM6CiAKQEAgLTIyLDEwICsyMiwxMCBAQAogCiBDYXNzYW5kcmEgd2FzIGRlc2lnbmVkIHRoaXMgd2F5IHRvIG1lZXQgbGFyZ2Utc2NhbGUgKFBpQispCiBidXNpbmVzcy1jcml0aWNhbCBzdG9yYWdlIHJlcXVpcmVtZW50cy4gSW4gcGFydGljdWxhciwgYXMgYXBwbGljYXRpb25zCi1kZW1hbmRlZCBmdWxsIGdsb2JhbCByZXBsaWNhdGlvbiBvZiBwZXRhYnl0ZSBzY2FsZSBkYXRhc2V0cyBhbG9uZyB3aXRoCitkZW1hbmRlZCBmdWxsIGdsb2JhbCByZXBsaWNhdGlvbiBvZiBwZXRhYnl0ZS1zY2FsZSBkYXRhc2V0cyBhbG9uZyB3aXRoCiBhbHdheXMgYXZhaWxhYmxlIGxvdy1sYXRlbmN5IHJlYWRzIGFuZCB3cml0ZXMsIGl0IGJlY2FtZSBpbXBlcmF0aXZlIHRvCiBkZXNpZ24gYSBuZXcga2luZCBvZiBkYXRhYmFzZSBtb2RlbCBhcyB0aGUgcmVsYXRpb25hbCBkYXRhYmFzZSBzeXN0ZW1zCi1vZiB0aGUgdGltZSBzdHJ1Z2dsZWQgdG8gbWVldCB0aGUgbmV3IHJlcXVpcmVtZW50cyBvZiBnbG9iYWwgc2NhbGUKK29mIHRoZSB0aW1lIHN0cnVnZ2xlZCB0byBtZWV0IHRoZSBuZXcgcmVxdWlyZW1lbnRzIG9mIGdsb2JhbC1zY2FsZQogYXBwbGljYXRpb25zLgogCiA9PSBEYXRhc2V0IFBhcnRpdGlvbmluZzogQ29uc2lzdGVudCBIYXNoaW5nCkBAIC0zOCwxMSArMzgsMTEgQEAKIG11dGF0aW9ucyB0byBldmVyeSBrZXkgdGhhdCBpdCBvd25zLCBldmVyeSBrZXkgbXVzdCBiZSB2ZXJzaW9uZWQuIFVubGlrZQogaW4gdGhlIG9yaWdpbmFsIER5bmFtbyBwYXBlciB3aGVyZSBkZXRlcm1pbmlzdGljIHZlcnNpb25zIGFuZCB2ZWN0b3IKIGNsb2NrcyB3ZXJlIHVzZWQgdG8gcmVjb25jaWxlIGNvbmN1cnJlbnQgdXBkYXRlcyB0byBhIGtleSwgQ2Fzc2FuZHJhCi11c2VzIGEgc2ltcGxlciBsYXN0IHdyaXRlIHdpbnMgbW9kZWwgd2hlcmUgZXZlcnkgbXV0YXRpb24gaXMgdGltZXN0YW1wZWQKK3VzZXMgYSBzaW1wbGVyIGxhc3Qtd3JpdGUtd2lucyBtb2RlbCB3aGVyZSBldmVyeSBtdXRhdGlvbiBpcyB0aW1lc3RhbXBlZAogKGluY2x1ZGluZyBkZWxldGVzKSBhbmQgdGhlbiB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgZGF0YSBpcyB0aGUgIndpbm5pbmciCiB2YWx1ZS4gRm9ybWFsbHkgc3BlYWtpbmcsIENhc3NhbmRyYSB1c2VzIGEgTGFzdC1Xcml0ZS1XaW5zIEVsZW1lbnQtU2V0CiBjb25mbGljdC1mcmVlIHJlcGxpY2F0ZWQgZGF0YSB0eXBlIGZvciBlYWNoIENRTCByb3csIG9yIAotaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29uZmxpY3QtZnJlZV9yZXBsaWNhdGVkX2RhdGFfdHlwZSBMV1ctRWxlbWVudC1TZXRfKExhc3QtV3JpdGUtV2lucy1FbGVtZW50LVNldClbTFdXLUVsZW1lbnQtU2V0CitodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db25mbGljdC1mcmVlX3JlcGxpY2F0ZWRfZGF0YV90eXBlI0xXVy1FbGVtZW50LVNldF8oTGFzdC1Xcml0ZS1XaW5zLUVsZW1lbnQtU2V0KVtMV1ctRWxlbWVudC1TZXQKIENSRFRdLCB0byByZXNvbHZlIGNvbmZsaWN0aW5nIG11dGF0aW9ucyBvbiByZXBsaWNhIHNldHMuCiAKID09PSBDb25zaXN0ZW50IEhhc2hpbmcgdXNpbmcgYSBUb2tlbiBSaW5nCkBAIC03NiwxNCArNzYsMTQgQEAKIAogaW1hZ2U6OnJpbmcuc3ZnW2ltYWdlXQogCi1Zb3UgY2FuIHNlZSB0aGF0IGluIGEgRHluYW1vIGxpa2Ugc3lzdGVtLCByYW5nZXMgb2Yga2V5cywgYWxzbyBrbm93biBhcworWW91IGNhbiBzZWUgdGhhdCBpbiBhIER5bmFtby1saWtlIHN5c3RlbSwgcmFuZ2VzIG9mIGtleXMsIGFsc28ga25vd24gYXMKICp0b2tlbiByYW5nZXMqLCBtYXAgdG8gdGhlIHNhbWUgcGh5c2ljYWwgc2V0IG9mIG5vZGVzLiBJbiB0aGlzIGV4YW1wbGUsCiBhbGwga2V5cyB0aGF0IGZhbGwgaW4gdGhlIHRva2VuIHJhbmdlIGV4Y2x1ZGluZyB0b2tlbiAxIGFuZCBpbmNsdWRpbmcKIHRva2VuIDIgKGdyYW5nZSh0MSwgdDJdKSBhcmUgc3RvcmVkIG9uIG5vZGVzIDIsIDMgYW5kIDQuCiAKID09PSBNdWx0aXBsZSBUb2tlbnMgcGVyIFBoeXNpY2FsIE5vZGUgKHZub2RlcykKIAotU2ltcGxlIHNpbmdsZSB0b2tlbiBjb25zaXN0ZW50IGhhc2hpbmcgd29ya3Mgd2VsbCBpZiB5b3UgaGF2ZSBtYW55CitTaW1wbGUgc2luZ2xlLXRva2VuIGNvbnNpc3RlbnQgaGFzaGluZyB3b3JrcyB3ZWxsIGlmIHlvdSBoYXZlIG1hbnkKIHBoeXNpY2FsIG5vZGVzIHRvIHNwcmVhZCBkYXRhIG92ZXIsIGJ1dCB3aXRoIGV2ZW5seSBzcGFjZWQgdG9rZW5zIGFuZCBhCiBzbWFsbCBudW1iZXIgb2YgcGh5c2ljYWwgbm9kZXMsIGluY3JlbWVudGFsIHNjYWxpbmcgKGFkZGluZyBqdXN0IGEgZmV3CiBub2RlcyBvZiBjYXBhY2l0eSkgaXMgZGlmZmljdWx0IGJlY2F1c2UgdGhlcmUgYXJlIG5vIHRva2VuIHNlbGVjdGlvbnMKQEAgLTEwNCw4ICsxMDQsNyBAQAogCiBDYXNzYW5kcmEgaW50cm9kdWNlcyBzb21lIG5vbWVuY2xhdHVyZSB0byBoYW5kbGUgdGhlc2UgY29uY2VwdHM6CiAKLSogKlRva2VuKjogQSBzaW5nbGUgcG9zaXRpb24gb24gdGhlIGR5bmFtbyBzdHlsZSBoYXNoCi1yaW5nLgorKiAqVG9rZW4qOiBBIHNpbmdsZSBwb3NpdGlvbiBvbiB0aGUgRHluYW1vLXN0eWxlIGhhc2ggcmluZy4KICogKkVuZHBvaW50KjogQSBzaW5nbGUgcGh5c2ljYWwgSVAgYW5kIHBvcnQgb24gdGhlIG5ldHdvcmsuCiAqICpIb3N0IElEKjogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBzaW5nbGUgInBoeXNpY2FsIiBub2RlLCB1c3VhbGx5CiBwcmVzZW50IGF0IG9uZSBnRW5kcG9pbnQgYW5kIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUKQEAgLTEzMSw3ICsxMzAsNyBAQAogLiBXaGVuIGEgbm9kZSBpcyBkZWNvbW1pc3Npb25lZCwgaXQgbG9zZXMgZGF0YSByb3VnaGx5IGVxdWFsbHkgdG8gb3RoZXIKIG1lbWJlcnMgb2YgdGhlIHJpbmcsIGFnYWluIGtlZXBpbmcgZXF1YWwgZGlzdHJpYnV0aW9uIG9mIGRhdGEgYWNyb3NzIHRoZQogY2x1c3Rlci4KLS4gSWYgYSBub2RlIGJlY29tZXMgdW5hdmFpbGFibGUsIHF1ZXJ5IGxvYWQgKGVzcGVjaWFsbHkgdG9rZW4gYXdhcmUKKy4gSWYgYSBub2RlIGJlY29tZXMgdW5hdmFpbGFibGUsIHF1ZXJ5IGxvYWQgKGVzcGVjaWFsbHkgdG9rZW4tYXdhcmUKIHF1ZXJ5IGxvYWQpLCBpcyBldmVubHkgZGlzdHJpYnV0ZWQgYWNyb3NzIG1hbnkgb3RoZXIgbm9kZXMuCiAKIE11bHRpcGxlIHRva2VucywgaG93ZXZlciwgY2FuIGFsc28gaGF2ZSBkaXNhZHZhbnRhZ2VzOgpAQCAtMTUyLDcgKzE1MSw3IEBACiBhdmFpbGFibGUgd2FzIHBpY2tpbmcgcmFuZG9tIHRva2Vucywgd2hpY2ggbWVhbnQgdGhhdCB0byBrZWVwIGJhbGFuY2UKIHRoZSBkZWZhdWx0IG51bWJlciBvZiB0b2tlbnMgcGVyIG5vZGUgaGFkIHRvIGJlIHF1aXRlIGhpZ2gsIGF0IGAyNTZgLgogVGhpcyBoYWQgdGhlIGVmZmVjdCBvZiBjb3VwbGluZyBtYW55IHBoeXNpY2FsIGVuZHBvaW50cyB0b2dldGhlciwKLWluY3JlYXNpbmcgdGhlIHJpc2sgb2YgdW5hdmFpbGFiaWxpdHkuIFRoYXQgaXMgd2h5IGluIGAzLnggK2AgdGhlIG5ldworaW5jcmVhc2luZyB0aGUgcmlzayBvZiB1bmF2YWlsYWJpbGl0eS4gVGhhdCBpcyB3aHkgaW4gYDMueCArYCBhIG5ldwogZGV0ZXJtaW5pc3RpYyB0b2tlbiBhbGxvY2F0b3Igd2FzIGFkZGVkIHdoaWNoIGludGVsbGlnZW50bHkgcGlja3MgdG9rZW5zCiBzdWNoIHRoYXQgdGhlIHJpbmcgaXMgb3B0aW1hbGx5IGJhbGFuY2VkIHdoaWxlIHJlcXVpcmluZyBhIG11Y2ggbG93ZXIKIG51bWJlciBvZiB0b2tlbnMgcGVyIHBoeXNpY2FsIG5vZGUuCkBAIC0yNTYsNyArMjU1LDcgQEAKIFRyYW5zaWVudCByZXBsaWNhdGlvbiBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSB0aGF0IGlzIG5vdCByZWFkeQogZm9yIHByb2R1Y3Rpb24gdXNlLiBUaGUgZXhwZWN0ZWQgYXVkaWVuY2UgaXMgZXhwZXJpZW5jZWQgdXNlcnMgb2YKIENhc3NhbmRyYSBjYXBhYmxlIG9mIGZ1bGx5IHZhbGlkYXRpbmcgYSBkZXBsb3ltZW50IG9mIHRoZWlyIHBhcnRpY3VsYXIKLWFwcGxpY2F0aW9uLiBUaGF0IG1lYW5zIGJlaW5nIGFibGUgY2hlY2sgdGhhdCBvcGVyYXRpb25zIGxpa2UgcmVhZHMsCithcHBsaWNhdGlvbi4gVGhhdCBtZWFucyB5b3UgaGF2ZSB0aGUgZXhwZXJpZW5jZSB0byBjaGVjayB0aGF0IG9wZXJhdGlvbnMgbGlrZSByZWFkcywKIHdyaXRlcywgZGVjb21taXNzaW9uLCByZW1vdmUsIHJlYnVpbGQsIHJlcGFpciwgYW5kIHJlcGxhY2UgYWxsIHdvcmsgd2l0aAogeW91ciBxdWVyaWVzLCBkYXRhLCBjb25maWd1cmF0aW9uLCBvcGVyYXRpb25hbCBwcmFjdGljZXMsIGFuZAogYXZhaWxhYmlsaXR5IHJlcXVpcmVtZW50cy4KQEAgLTI2OSwxOCArMjY4LDE4IEBACiBDYXNzYW5kcmEgdXNlcyBtdXRhdGlvbiB0aW1lc3RhbXAgdmVyc2lvbmluZyB0byBndWFyYW50ZWUgZXZlbnR1YWwKIGNvbnNpc3RlbmN5IG9mIGRhdGEuIFNwZWNpZmljYWxseSBhbGwgbXV0YXRpb25zIHRoYXQgZW50ZXIgdGhlIHN5c3RlbSBkbwogc28gd2l0aCBhIHRpbWVzdGFtcCBwcm92aWRlZCBlaXRoZXIgZnJvbSBhIGNsaWVudCBjbG9jayBvciwgYWJzZW50IGEKLWNsaWVudCBwcm92aWRlZCB0aW1lc3RhbXAsIGZyb20gdGhlIGNvb3JkaW5hdG9yIG5vZGUncyBjbG9jay4gVXBkYXRlcworY2xpZW50LXByb3ZpZGVkIHRpbWVzdGFtcCwgZnJvbSB0aGUgY29vcmRpbmF0b3Igbm9kZSdzIGNsb2NrLiBVcGRhdGVzCiByZXNvbHZlIGFjY29yZGluZyB0byB0aGUgY29uZmxpY3QgcmVzb2x1dGlvbiBydWxlIG9mIGxhc3Qgd3JpdGUgd2lucy4KIENhc3NhbmRyYSdzIGNvcnJlY3RuZXNzIGRvZXMgZGVwZW5kIG9uIHRoZXNlIGNsb2Nrcywgc28gbWFrZSBzdXJlIGEKIHByb3BlciB0aW1lIHN5bmNocm9uaXphdGlvbiBwcm9jZXNzIGlzIHJ1bm5pbmcgc3VjaCBhcyBOVFAuCiAKIENhc3NhbmRyYSBhcHBsaWVzIHNlcGFyYXRlIG11dGF0aW9uIHRpbWVzdGFtcHMgdG8gZXZlcnkgY29sdW1uIG9mIGV2ZXJ5CiByb3cgd2l0aGluIGEgQ1FMIHBhcnRpdGlvbi4gUm93cyBhcmUgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgYnkgcHJpbWFyeQota2V5LCBhbmQgZWFjaCBjb2x1bW4gaW4gYSByb3cgcmVzb2x2ZSBjb25jdXJyZW50IG11dGF0aW9ucyBhY2NvcmRpbmcgdG8KK2tleSwgYW5kIGVhY2ggY29sdW1uIGluIGEgcm93IHJlc29sdmVzIGNvbmN1cnJlbnQgbXV0YXRpb25zIGFjY29yZGluZyB0bwogbGFzdC13cml0ZS13aW5zIGNvbmZsaWN0IHJlc29sdXRpb24uIFRoaXMgbWVhbnMgdGhhdCB1cGRhdGVzIHRvCiBkaWZmZXJlbnQgcHJpbWFyeSBrZXlzIHdpdGhpbiBhIHBhcnRpdGlvbiBjYW4gYWN0dWFsbHkgcmVzb2x2ZSB3aXRob3V0CiBjb25mbGljdCEgRnVydGhlcm1vcmUgdGhlIENRTCBjb2xsZWN0aW9uIHR5cGVzIHN1Y2ggYXMgbWFwcyBhbmQgc2V0cyB1c2UKLXRoaXMgc2FtZSBjb25mbGljdCBmcmVlIG1lY2hhbmlzbSwgbWVhbmluZyB0aGF0IGNvbmN1cnJlbnQgdXBkYXRlcyB0bwordGhpcyBzYW1lIGNvbmZsaWN0LWZyZWUgbWVjaGFuaXNtLCBtZWFuaW5nIHRoYXQgY29uY3VycmVudCB1cGRhdGVzIHRvCiBtYXBzIGFuZCBzZXRzIGFyZSBndWFyYW50ZWVkIHRvIHJlc29sdmUgYXMgd2VsbC4KIAogPT09PSBSZXBsaWNhIFN5bmNocm9uaXphdGlvbgpAQCAtMjkzLDcgKzI5Miw3IEBACiAKIFRoZXNlIHRlY2huaXF1ZXMgYXJlIG9ubHkgYmVzdC1lZmZvcnQsIGhvd2V2ZXIsIGFuZCB0byBndWFyYW50ZWUKIGV2ZW50dWFsIGNvbnNpc3RlbmN5IENhc3NhbmRyYSBpbXBsZW1lbnRzIGBhbnRpLWVudHJvcHkKLXJlcGFpciA8cmVwYWlyPmAgd2hlcmUgcmVwbGljYXMgY2FsY3VsYXRlIGhpZXJhcmNoaWNhbCBoYXNoLXRyZWVzIG92ZXIKK3JlcGFpciA8cmVwYWlyPmAgd2hlcmUgcmVwbGljYXMgY2FsY3VsYXRlIGhpZXJhcmNoaWNhbCBoYXNoIHRyZWVzIG92ZXIKIHRoZWlyIGRhdGFzZXRzIGNhbGxlZCBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NZXJrbGVfdHJlZVtNZXJrbGUKIHRyZWVzXSB0aGF0IGNhbiB0aGVuIGJlIGNvbXBhcmVkIGFjcm9zcyByZXBsaWNhcyB0byBpZGVudGlmeSBtaXNtYXRjaGVkCiBkYXRhLiBMaWtlIHRoZSBvcmlnaW5hbCBEeW5hbW8gcGFwZXIgQ2Fzc2FuZHJhIHN1cHBvcnRzIGZ1bGwgcmVwYWlycwpAQCAtMzQwLDcgKzMzOSw3IEBACiAgIEEgbWFqb3JpdHkgb2YgdGhlIHJlcGxpY2FzIGluIGVhY2ggZGF0YWNlbnRlciBtdXN0IHJlc3BvbmQuCiBgTE9DQUxfT05FYDo6CiAgIE9ubHkgYSBzaW5nbGUgcmVwbGljYSBtdXN0IHJlc3BvbmQuIEluIGEgbXVsdGktZGF0YWNlbnRlciBjbHVzdGVyLAotICB0aGlzIGFsc28gZ2F1cmFudGVlcyB0aGF0IHJlYWQgcmVxdWVzdHMgYXJlIG5vdCBzZW50IHRvIHJlcGxpY2FzIGluIGEKKyAgdGhpcyBhbHNvIGd1YXJhbnRlZXMgdGhhdCByZWFkIHJlcXVlc3RzIGFyZSBub3Qgc2VudCB0byByZXBsaWNhcyBpbiBhCiAgIHJlbW90ZSBkYXRhY2VudGVyLgogYEFOWWA6OgogICBBIHNpbmdsZSByZXBsaWNhIG1heSByZXNwb25kLCBvciB0aGUgY29vcmRpbmF0b3IgbWF5IHN0b3JlIGEgaGludC4gSWYKQEAgLTQwMCw3ICszOTksNyBAQAogbm90IG9ubHkgYWJvdXQgdGhlbXNlbHZlcyBidXQgYWxzbyBhYm91dCBvdGhlciBub2RlcyB0aGV5IGtub3cgYWJvdXQuCiBUaGlzIGluZm9ybWF0aW9uIGlzIHZlcnNpb25lZCB3aXRoIGEgdmVjdG9yIGNsb2NrIG9mCiBgKGdlbmVyYXRpb24sIHZlcnNpb24pYCB0dXBsZXMsIHdoZXJlIHRoZSBnZW5lcmF0aW9uIGlzIGEgbW9ub3RvbmljCi10aW1lc3RhbXAgYW5kIHZlcnNpb24gaXMgYSBsb2dpY2FsIGNsb2NrIHRoZSBpbmNyZW1lbnRzIHJvdWdobHkgZXZlcnkKK3RpbWVzdGFtcCBhbmQgdmVyc2lvbiBpcyBhIGxvZ2ljYWwgY2xvY2sgdGhhdCBpbmNyZW1lbnRzIHJvdWdobHkgZXZlcnkKIHNlY29uZC4gVGhlc2UgbG9naWNhbCBjbG9ja3MgYWxsb3cgQ2Fzc2FuZHJhIGdvc3NpcCB0byBpZ25vcmUgb2xkCiB2ZXJzaW9ucyBvZiBjbHVzdGVyIHN0YXRlIGp1c3QgYnkgaW5zcGVjdGluZyB0aGUgbG9naWNhbCBjbG9ja3MKIHByZXNlbnRlZCB3aXRoIGdvc3NpcCBtZXNzYWdlcy4KQEAgLTQxNywxMCArNDE2LDEwIEBACiBvbmUgZXhpc3RzKQogLiBHb3NzaXBzIHdpdGggYSBzZWVkIG5vZGUgaWYgdGhhdCBkaWRuJ3QgaGFwcGVuIGluIHN0ZXAgMi4KIAotV2hlbiBhbiBvcGVyYXRvciBmaXJzdCBib290c3RyYXBzIGEgQ2Fzc2FuZHJhIGNsdXN0ZXIgdGhleSBkZXNpZ25hdGUKLWNlcnRhaW4gbm9kZXMgYXMgc2VlZCBub2Rlcy4gQW55IG5vZGUgY2FuIGJlIGEgc2VlZCBub2RlIGFuZCB0aGUgb25seQotZGlmZmVyZW5jZSBiZXR3ZWVuIHNlZWQgYW5kIG5vbi1zZWVkIG5vZGVzIGlzIHNlZWQgbm9kZXMgYXJlIGFsbG93ZWQgdG8KLWJvb3RzdHJhcCBpbnRvIHRoZSByaW5nIHdpdGhvdXQgc2VlaW5nIGFueSBvdGhlciBzZWVkIG5vZGVzLgorV2hlbiBhbiBvcGVyYXRvciBmaXJzdCBib290c3RyYXBzIGEgQ2Fzc2FuZHJhIGNsdXN0ZXIsIHRoZXkgZGVzaWduYXRlCitjZXJ0YWluIG5vZGVzIGFzIHNlZWQgbm9kZXMuIEFueSBub2RlIGNhbiBiZSBhIHNlZWQgbm9kZSwgYW5kIHRoZSBvbmx5CitkaWZmZXJlbmNlIGJldHdlZW4gc2VlZCBhbmQgbm9uLXNlZWQgbm9kZXMgaXMgdGhhdCBzZWVkIG5vZGVzIGFyZSBhbGxvd2VkCit0byBib290c3RyYXAgaW50byB0aGUgcmluZyB3aXRob3V0IHNlZWluZyBhbnkgb3RoZXIgc2VlZCBub2Rlcy4KIEZ1cnRoZXJtb3JlLCBvbmNlIGEgY2x1c3RlciBpcyBib290c3RyYXBwZWQsIHNlZWQgbm9kZXMgYmVjb21lCiBob3RzcG90cyBmb3IgZ29zc2lwIGR1ZSB0byBzdGVwIDQgYWJvdmUuCiAKQEAgLTQzNSw3ICs0MzQsNyBAQAogTm9kZXMgZG8gbm90IGhhdmUgdG8gYWdyZWUgb24gdGhlIHNlZWQgbm9kZXMsIGFuZCBpbmRlZWQgb25jZSBhIGNsdXN0ZXIKIGlzIGJvb3RzdHJhcHBlZCwgbmV3bHkgbGF1bmNoZWQgbm9kZXMgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGFueQogZXhpc3Rpbmcgbm9kZXMgYXMgc2VlZHMuIFRoZSBvbmx5IGFkdmFudGFnZSB0byBwaWNraW5nIHRoZSBzYW1lIG5vZGVzCi1hcyBzZWVkcyBpcyBpdCBpbmNyZWFzZXMgdGhlaXIgdXNlZnVsbG5lc3MgYXMgZ29zc2lwIGhvdHNwb3RzLgorYXMgc2VlZHMgaXMgdGhhdCBpdCBpbmNyZWFzZXMgdGhlaXIgdXNlZnVsbmVzcyBhcyBnb3NzaXAgaG90c3BvdHMuCiA9PT09CiAKIEN1cnJlbnRseSwgZ29zc2lwIGFsc28gcHJvcGFnYXRlcyB0b2tlbiBtZXRhZGF0YSBhbmQgc2NoZW1hCkBAIC00ODgsNyArNDg3LDcgQEAKIHN0b3JhZ2UuIEluIGNvbnRyYXN0LCBzY2FsaW5nLXVwIGltcGxpZXMgYWRkaW5nIG1vcmUgY2FwYWNpdHkgdG8gdGhlCiBleGlzdGluZyBkYXRhYmFzZSBub2Rlcy4gQ2Fzc2FuZHJhIGlzIGFsc28gY2FwYWJsZSBvZiBzY2FsZS11cCwgYW5kIGluCiBjZXJ0YWluIGVudmlyb25tZW50cyBpdCBtYXkgYmUgcHJlZmVyYWJsZSBkZXBlbmRpbmcgb24gdGhlIGRlcGxveW1lbnQuCi1DYXNzYW5kcmEgZ2l2ZXMgb3BlcmF0b3JzIHRoZSBmbGV4aWJpbGl0eSB0byBjaG9zZSBlaXRoZXIgc2NhbGUtb3V0IG9yCitDYXNzYW5kcmEgZ2l2ZXMgb3BlcmF0b3JzIHRoZSBmbGV4aWJpbGl0eSB0byBjaG9vc2UgZWl0aGVyIHNjYWxlLW91dCBvcgogc2NhbGUtdXAuCiAKIE9uZSBrZXkgYXNwZWN0IG9mIER5bmFtbyB0aGF0IENhc3NhbmRyYSBmb2xsb3dzIGlzIHRvIGF0dGVtcHQgdG8gcnVuIG9uCkBAIC01MDcsNyArNTA2LDcgQEAKIG11bHRpLXBhcnRpdGlvbiB0cmFuc2FjdGlvbnMgc3Bhbm5pbmcgbXVsdGlwbGUgbm9kZXMgYXJlIG5vdG9yaW91c2x5CiBkaWZmaWN1bHQgdG8gaW1wbGVtZW50IGFuZCB0eXBpY2FsbHkgdmVyeSBsYXRlbnQuCiAKLUluc3RlYWQsIENhc3NhbmRhIGNob29zZXMgdG8gb2ZmZXIgZmFzdCwgY29uc2lzdGVudCwgbGF0ZW5jeSBhdCBhbnkKK0luc3RlYWQsIENhc3NhbmRyYSBjaG9vc2VzIHRvIG9mZmVyIGZhc3QsIGNvbnNpc3RlbnQsIGxhdGVuY3kgYXQgYW55CiBzY2FsZSBmb3Igc2luZ2xlIHBhcnRpdGlvbiBvcGVyYXRpb25zLCBhbGxvd2luZyByZXRyaWV2YWwgb2YgZW50aXJlCiBwYXJ0aXRpb25zIG9yIG9ubHkgc3Vic2V0cyBvZiBwYXJ0aXRpb25zIGJhc2VkIG9uIHByaW1hcnkga2V5IGZpbHRlcnMuCiBGdXJ0aGVybW9yZSwgQ2Fzc2FuZHJhIGRvZXMgc3VwcG9ydCBzaW5nbGUgcGFydGl0aW9uIGNvbXBhcmUgYW5kIHN3YXAKQEAgLTUxNiw3ICs1MTUsNyBAQAogPT09IFNpbXBsZSBJbnRlcmZhY2UgZm9yIFN0b3JpbmcgUmVjb3JkcwogCiBDYXNzYW5kcmEsIGluIGEgc2xpZ2h0IGRlcGFydHVyZSBmcm9tIER5bmFtbywgY2hvb3NlcyBhIHN0b3JhZ2UKLWludGVyZmFjZSB0aGF0IGlzIG1vcmUgc29waGlzdGljYXRlZCB0aGVuICJzaW1wbGUga2V5IHZhbHVlIiBzdG9yZXMgYnV0CitpbnRlcmZhY2UgdGhhdCBpcyBtb3JlIHNvcGhpc3RpY2F0ZWQgdGhhbiAic2ltcGxlIGtleS12YWx1ZSIgc3RvcmVzIGJ1dAogc2lnbmlmaWNhbnRseSBsZXNzIGNvbXBsZXggdGhhbiBTUUwgcmVsYXRpb25hbCBkYXRhIG1vZGVscy4gQ2Fzc2FuZHJhCiBwcmVzZW50cyBhIHdpZGUtY29sdW1uIHN0b3JlIGludGVyZmFjZSwgd2hlcmUgcGFydGl0aW9ucyBvZiBkYXRhIGNvbnRhaW4KIG11bHRpcGxlIHJvd3MsIGVhY2ggb2Ygd2hpY2ggY29udGFpbnMgYSBmbGV4aWJsZSBzZXQgb2YgaW5kaXZpZHVhbGx5CmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvYXJjaGl0ZWN0dXJlL2d1YXJhbnRlZXMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9hcmNoaXRlY3R1cmUvZ3VhcmFudGVlcy5hZG9jCmluZGV4IDMzMTNhMTEuLmE1ZjA5YjkgMTAwNjQ0Ci0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9hcmNoaXRlY3R1cmUvZ3VhcmFudGVlcy5hZG9jCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9hcmNoaXRlY3R1cmUvZ3VhcmFudGVlcy5hZG9jCkBAIC0xLDE3ICsxLDE3IEBACiA9IEd1YXJhbnRlZXMKIAogQXBhY2hlIENhc3NhbmRyYSBpcyBhIGhpZ2hseSBzY2FsYWJsZSBhbmQgcmVsaWFibGUgZGF0YWJhc2UuIENhc3NhbmRyYQotaXMgdXNlZCBpbiB3ZWIgYmFzZWQgYXBwbGljYXRpb25zIHRoYXQgc2VydmUgbGFyZ2UgbnVtYmVyIG9mIGNsaWVudHMgYW5kCitpcyB1c2VkIGluIHdlYi1iYXNlZCBhcHBsaWNhdGlvbnMgdGhhdCBzZXJ2ZSBsYXJnZSBudW1iZXIgb2YgY2xpZW50cyBhbmQKIHRoZSBxdWFudGl0eSBvZiBkYXRhIHByb2Nlc3NlZCBpcyB3ZWItc2NhbGUgKFBldGFieXRlKSBsYXJnZS4gQ2Fzc2FuZHJhCiBtYWtlcyBzb21lIGd1YXJhbnRlZXMgYWJvdXQgaXRzIHNjYWxhYmlsaXR5LCBhdmFpbGFiaWxpdHkgYW5kCiByZWxpYWJpbGl0eS4gVG8gZnVsbHkgdW5kZXJzdGFuZCB0aGUgaW5oZXJlbnQgbGltaXRhdGlvbnMgb2YgYSBzdG9yYWdlCiBzeXN0ZW0gaW4gYW4gZW52aXJvbm1lbnQgaW4gd2hpY2ggYSBjZXJ0YWluIGxldmVsIG9mIG5ldHdvcmsgcGFydGl0aW9uCiBmYWlsdXJlIGlzIHRvIGJlIGV4cGVjdGVkIGFuZCB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBkZXNpZ25pbmcgdGhlCi1zeXN0ZW0gaXQgaXMgaW1wb3J0YW50IHRvIGZpcnN0IGJyaWVmbHkgaW50cm9kdWNlIHRoZSBDQVAgdGhlb3JlbS4KK3N5c3RlbSwgaXQgaXMgaW1wb3J0YW50IHRvIGZpcnN0IGJyaWVmbHkgaW50cm9kdWNlIHRoZSBDQVAgdGhlb3JlbS4KIAogPT0gV2hhdCBpcyBDQVA/CiAKLUFjY29yZGluZyB0byB0aGUgQ0FQIHRoZW9yZW0gaXQgaXMgbm90IHBvc3NpYmxlIGZvciBhIGRpc3RyaWJ1dGVkIGRhdGEKK0FjY29yZGluZyB0byB0aGUgQ0FQIHRoZW9yZW0sIGl0IGlzIG5vdCBwb3NzaWJsZSBmb3IgYSBkaXN0cmlidXRlZCBkYXRhCiBzdG9yZSB0byBwcm92aWRlIG1vcmUgdGhhbiB0d28gb2YgdGhlIGZvbGxvd2luZyBndWFyYW50ZWVzCiBzaW11bHRhbmVvdXNseS4KIApAQCAtMjQsNyArMjQsNyBAQAogc3RvcmFnZSBzeXN0ZW0gdG8gZmFpbHVyZSBvZiBhIG5ldHdvcmsgcGFydGl0aW9uLiBFdmVuIGlmIHNvbWUgb2YgdGhlCiBtZXNzYWdlcyBhcmUgZHJvcHBlZCBvciBkZWxheWVkIHRoZSBzeXN0ZW0gY29udGludWVzIHRvIG9wZXJhdGUuCiAKLUNBUCB0aGVvcmVtIGltcGxpZXMgdGhhdCB3aGVuIHVzaW5nIGEgbmV0d29yayBwYXJ0aXRpb24sIHdpdGggdGhlCitUaGUgQ0FQIHRoZW9yZW0gaW1wbGllcyB0aGF0IHdoZW4gdXNpbmcgYSBuZXR3b3JrIHBhcnRpdGlvbiwgd2l0aCB0aGUKIGluaGVyZW50IHJpc2sgb2YgcGFydGl0aW9uIGZhaWx1cmUsIG9uZSBoYXMgdG8gY2hvb3NlIGJldHdlZW4KIGNvbnNpc3RlbmN5IGFuZCBhdmFpbGFiaWxpdHkgYW5kIGJvdGggY2Fubm90IGJlIGd1YXJhbnRlZWQgYXQgdGhlIHNhbWUKIHRpbWUuIENBUCB0aGVvcmVtIGlzIGlsbHVzdHJhdGVkIGluIEZpZ3VyZSAxLgpAQCAtMzMsNyArMzMsNyBAQAogCiBGaWd1cmUgMS4gQ0FQIFRoZW9yZW0KIAotSGlnaCBhdmFpbGFiaWxpdHkgaXMgYSBwcmlvcml0eSBpbiB3ZWIgYmFzZWQgYXBwbGljYXRpb25zIGFuZCB0byB0aGlzCitIaWdoIGF2YWlsYWJpbGl0eSBpcyBhIHByaW9yaXR5IGluIHdlYi1iYXNlZCBhcHBsaWNhdGlvbnMgYW5kIHRvIHRoaXMKIG9iamVjdGl2ZSBDYXNzYW5kcmEgY2hvb3NlcyBBdmFpbGFiaWxpdHkgYW5kIFBhcnRpdGlvbiBUb2xlcmFuY2UgZnJvbQogdGhlIENBUCBndWFyYW50ZWVzLCBjb21wcm9taXNpbmcgb24gZGF0YSBDb25zaXN0ZW5jeSB0byBzb21lIGV4dGVudC4KIApAQCAtNDcsMTkgKzQ3LDE5IEBACiAqIEJhdGNoZWQgd3JpdGVzIGFjcm9zcyBtdWx0aXBsZSB0YWJsZXMgYXJlIGd1YXJhbnRlZWQgdG8gc3VjY2VlZAogY29tcGxldGVseSBvciBub3QgYXQgYWxsCiAqIFNlY29uZGFyeSBpbmRleGVzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGVpciBsb2NhbAotcmVwbGljYXMgZGF0YQorcmVwbGljYXMnIGRhdGEKIAogPT0gSGlnaCBTY2FsYWJpbGl0eQogCiBDYXNzYW5kcmEgaXMgYSBoaWdobHkgc2NhbGFibGUgc3RvcmFnZSBzeXN0ZW0gaW4gd2hpY2ggbm9kZXMgbWF5IGJlCi1hZGRlZC9yZW1vdmVkIGFzIG5lZWRlZC4gVXNpbmcgZ29zc2lwLWJhc2VkIHByb3RvY29sIGEgdW5pZmllZCBhbmQKK2FkZGVkL3JlbW92ZWQgYXMgbmVlZGVkLiBVc2luZyBnb3NzaXAtYmFzZWQgcHJvdG9jb2wsIGEgdW5pZmllZCBhbmQKIGNvbnNpc3RlbnQgbWVtYmVyc2hpcCBsaXN0IGlzIGtlcHQgYXQgZWFjaCBub2RlLgogCiA9PSBIaWdoIEF2YWlsYWJpbGl0eQogCiBDYXNzYW5kcmEgZ3VhcmFudGVlcyBoaWdoIGF2YWlsYWJpbGl0eSBvZiBkYXRhIGJ5IGltcGxlbWVudGluZyBhCi1mYXVsdC10b2xlcmFudCBzdG9yYWdlIHN5c3RlbS4gRmFpbHVyZSBkZXRlY3Rpb24gaW4gYSBub2RlIGlzIGRldGVjdGVkCi11c2luZyBhIGdvc3NpcC1iYXNlZCBwcm90b2NvbC4KK2ZhdWx0LXRvbGVyYW50IHN0b3JhZ2Ugc3lzdGVtLiBGYWlsdXJlIG9mIGEgbm9kZSBpcyBkZXRlY3RlZCB1c2luZworYSBnb3NzaXAtYmFzZWQgcHJvdG9jb2wuCiAKID09IER1cmFiaWxpdHkKIApAQCAtNjcsMjYgKzY3LDI2IEBACiBtdWx0aXBsZSBjb3BpZXMgb2YgYSBkYXRhIHN0b3JlZCBvbiBkaWZmZXJlbnQgbm9kZXMgaW4gYSBjbHVzdGVyLiBJbiBhCiBtdWx0aS1kYXRhY2VudGVyIGVudmlyb25tZW50IHRoZSByZXBsaWNhcyBtYXkgYmUgc3RvcmVkIG9uIGRpZmZlcmVudAogZGF0YWNlbnRlcnMuIElmIG9uZSByZXBsaWNhIGlzIGxvc3QgZHVlIHRvIHVucmVjb3ZlcmFibGUgbm9kZS9kYXRhY2VudGVyCi1mYWlsdXJlIHRoZSBkYXRhIGlzIG5vdCBjb21wbGV0ZWx5IGxvc3QgYXMgcmVwbGljYXMgYXJlIHN0aWxsIGF2YWlsYWJsZS4KK2ZhaWx1cmUsIHRoZSBkYXRhIGlzIG5vdCBjb21wbGV0ZWx5IGxvc3QsIGFzIHJlcGxpY2FzIGFyZSBzdGlsbCBhdmFpbGFibGUuCiAKID09IEV2ZW50dWFsIENvbnNpc3RlbmN5CiAKIE1lZXRpbmcgdGhlIHJlcXVpcmVtZW50cyBvZiBwZXJmb3JtYW5jZSwgcmVsaWFiaWxpdHksIHNjYWxhYmlsaXR5IGFuZAotaGlnaCBhdmFpbGFiaWxpdHkgaW4gcHJvZHVjdGlvbiBDYXNzYW5kcmEgaXMgYW4gZXZlbnR1YWxseSBjb25zaXN0ZW50Ci1zdG9yYWdlIHN5c3RlbS4gRXZlbnR1YWxseSBjb25zaXN0ZW50IGltcGxpZXMgdGhhdCBhbGwgdXBkYXRlcyByZWFjaCBhbGwKK2hpZ2ggYXZhaWxhYmlsaXR5IGluIHByb2R1Y3Rpb24sIENhc3NhbmRyYSBpcyBhbiBldmVudHVhbGx5IGNvbnNpc3RlbnQKK3N0b3JhZ2Ugc3lzdGVtLiBFdmVudHVhbGx5IGNvbnNpc3RlbmN5IGltcGxpZXMgdGhhdCBhbGwgdXBkYXRlcyByZWFjaCBhbGwKIHJlcGxpY2FzIGV2ZW50dWFsbHkuIERpdmVyZ2VudCB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBkYXRhIG1heSBleGlzdAotdGVtcG9yYXJpbHkgYnV0IHRoZXkgYXJlIGV2ZW50dWFsbHkgcmVjb25jaWxlZCB0byBhIGNvbnNpc3RlbnQgc3RhdGUuCi1FdmVudHVhbCBjb25zaXN0ZW5jeSBpcyBhIHRyYWRlb2ZmIHRvIGFjaGlldmUgaGlnaCBhdmFpbGFiaWxpdHkgYW5kIGl0Cit0ZW1wb3JhcmlseSwgYnV0IHRoZXkgYXJlIGV2ZW50dWFsbHkgcmVjb25jaWxlZCB0byBhIGNvbnNpc3RlbnQgc3RhdGUuCitFdmVudHVhbCBjb25zaXN0ZW5jeSBpcyBhIHRyYWRlb2ZmIHRvIGFjaGlldmUgaGlnaCBhdmFpbGFiaWxpdHksIGFuZCBpdAogaW52b2x2ZXMgc29tZSByZWFkIGFuZCB3cml0ZSBsYXRlbmNpZXMuCiAKID09IExpZ2h0d2VpZ2h0IHRyYW5zYWN0aW9ucyB3aXRoIGxpbmVhcml6YWJsZSBjb25zaXN0ZW5jeQogCi1EYXRhIG11c3QgYmUgcmVhZCBhbmQgd3JpdHRlbiBpbiBhIHNlcXVlbnRpYWwgb3JkZXIuIFBheG9zIGNvbnNlbnN1cwotcHJvdG9jb2wgaXMgdXNlZCB0byBpbXBsZW1lbnQgbGlnaHR3ZWlnaHQgdHJhbnNhY3Rpb25zLiBQYXhvcyBwcm90b2NvbAorRGF0YSBtdXN0IGJlIHJlYWQgYW5kIHdyaXR0ZW4gaW4gYSBzZXF1ZW50aWFsIG9yZGVyLiBUaGUgUGF4b3MgY29uc2Vuc3VzCitwcm90b2NvbCBpcyB1c2VkIHRvIGltcGxlbWVudCBsaWdodHdlaWdodCB0cmFuc2FjdGlvbnMuIFRoZSBQYXhvcyBwcm90b2NvbAogaW1wbGVtZW50cyBsaWdodHdlaWdodCB0cmFuc2FjdGlvbnMgdGhhdCBhcmUgYWJsZSB0byBoYW5kbGUgY29uY3VycmVudAogb3BlcmF0aW9ucyB1c2luZyBsaW5lYXJpemFibGUgY29uc2lzdGVuY3kuIExpbmVhcml6YWJsZSBjb25zaXN0ZW5jeSBpcwotc2VxdWVudGlhbCBjb25zaXN0ZW5jeSB3aXRoIHJlYWwtdGltZSBjb25zdHJhaW50cyBhbmQgaXQgZW5zdXJlcwotdHJhbnNhY3Rpb24gaXNvbGF0aW9uIHdpdGggY29tcGFyZSBhbmQgc2V0IChDQVMpIHRyYW5zYWN0aW9uLiBXaXRoIENBUworc2VxdWVudGlhbCBjb25zaXN0ZW5jeSB3aXRoIHJlYWwtdGltZSBjb25zdHJhaW50cywgYW5kIGl0IGVuc3VyZXMKK3RyYW5zYWN0aW9uIGlzb2xhdGlvbiB3aXRoIGNvbXBhcmUtYW5kLXNldCAoQ0FTKSB0cmFuc2FjdGlvbnMuIFdpdGggQ0FTCiByZXBsaWNhIGRhdGEgaXMgY29tcGFyZWQgYW5kIGRhdGEgdGhhdCBpcyBmb3VuZCB0byBiZSBvdXQgb2YgZGF0ZSBpcyBzZXQKIHRvIHRoZSBtb3N0IGNvbnNpc3RlbnQgdmFsdWUuIFJlYWRzIHdpdGggbGluZWFyaXphYmxlIGNvbnNpc3RlbmN5IGFsbG93CiByZWFkaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBkYXRhLCB3aGljaCBtYXkgcG9zc2libHkgYmUKQEAgLTk3LDEyICs5NywxMiBAQAogVGhlIGd1YXJhbnRlZSBmb3IgYmF0Y2hlZCB3cml0ZXMgYWNyb3NzIG11bHRpcGxlIHRhYmxlcyBpcyB0aGF0IHRoZXkKIHdpbGwgZXZlbnR1YWxseSBzdWNjZWVkLCBvciBub25lIHdpbGwuIEJhdGNoIGRhdGEgaXMgZmlyc3Qgd3JpdHRlbiB0bwogYmF0Y2hsb2cgc3lzdGVtIGRhdGEsIGFuZCB3aGVuIHRoZSBiYXRjaCBkYXRhIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseQotc3RvcmVkIGluIHRoZSBjbHVzdGVyIHRoZSBiYXRjaGxvZyBkYXRhIGlzIHJlbW92ZWQuIFRoZSBiYXRjaCBpcwotcmVwbGljYXRlZCB0byBhbm90aGVyIG5vZGUgdG8gZW5zdXJlIHRoZSBmdWxsIGJhdGNoIGNvbXBsZXRlcyBpbiB0aGUKLWV2ZW50IHRoZSBjb29yZGluYXRvciBub2RlIGZhaWxzLgorc3RvcmVkIGluIHRoZSBjbHVzdGVyLCB0aGUgYmF0Y2hsb2cgZGF0YSBpcyByZW1vdmVkLiBUaGUgYmF0Y2ggaXMKK3JlcGxpY2F0ZWQgdG8gYW5vdGhlciBub2RlIHRvIGVuc3VyZSB0aGF0IHRoZSBmdWxsIGJhdGNoIGNvbXBsZXRlcyBpbgordGhlIGV2ZW50IGlmIGNvb3JkaW5hdG9yIG5vZGUgZmFpbHMuCiAKID09IFNlY29uZGFyeSBJbmRleGVzCiAKLUEgc2Vjb25kYXJ5IGluZGV4IGlzIGFuIGluZGV4IG9uIGEgY29sdW1uIGFuZCBpcyB1c2VkIHRvIHF1ZXJ5IGEgdGFibGUKLXRoYXQgaXMgbm9ybWFsbHkgbm90IHF1ZXJ5YWJsZS4gU2Vjb25kYXJ5IGluZGV4ZXMgd2hlbiBidWlsdCBhcmUKK0Egc2Vjb25kYXJ5IGluZGV4IGlzIGFuIGluZGV4IG9uIGEgY29sdW1uLCBhbmQgaXQncyB1c2VkIHRvIHF1ZXJ5IGEgdGFibGUKK3RoYXQgaXMgbm9ybWFsbHkgbm90IHF1ZXJ5YWJsZS4gU2Vjb25kYXJ5IGluZGV4ZXMsIHdoZW4gYnVpbHQsIGFyZQogZ3VhcmFudGVlZCB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlaXIgbG9jYWwgcmVwbGljYXMuCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvYXJjaGl0ZWN0dXJlL2luZGV4LmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvYXJjaGl0ZWN0dXJlL2luZGV4LmFkb2MKaW5kZXggYzRiZWYwNS4uOWU2NzRkOSAxMDA2NDQKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2FyY2hpdGVjdHVyZS9pbmRleC5hZG9jCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9hcmNoaXRlY3R1cmUvaW5kZXguYWRvYwpAQCAtNCw2ICs0LDYgQEAKIAogKiB4cmVmOmFyY2hpdGVjdHVyZS9vdmVydmlldy5hZG9jW092ZXJ2aWV3XQogKiB4cmVmOmFyY2hpdGVjdHVyZS9keW5hbW8uYWRvY1tEeW5hbW9dCi0qIHhyZWY6YXJjaGl0ZWN0dXJlL3N0b3JhZ2VfZW5naW5lLmFkb2NbU3RvcmFnZSBFbmdpbmVdCisqIHhyZWY6YXJjaGl0ZWN0dXJlL3N0b3JhZ2UtZW5naW5lLmFkb2NbU3RvcmFnZSBFbmdpbmVdCiAqIHhyZWY6YXJjaGl0ZWN0dXJlL2d1YXJhbnRlZXMuYWRvY1tHdWFyYW50ZWVzXQogKiB4cmVmOmFyY2hpdGVjdHVyZS9zbml0Y2guYWRvY1tTbml0Y2hlc10KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9hcmNoaXRlY3R1cmUvb3ZlcnZpZXcuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9hcmNoaXRlY3R1cmUvb3ZlcnZpZXcuYWRvYwppbmRleCA1OGRiNmIxLi4yYzg2Y2U0IDEwMDY0NAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvYXJjaGl0ZWN0dXJlL292ZXJ2aWV3LmFkb2MKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2FyY2hpdGVjdHVyZS9vdmVydmlldy5hZG9jCkBAIC0xLDcgKzEsNyBAQAogPSBPdmVydmlldwogOmV4cGVyOiBleHBlcmltZW50YWwKIAotQXBhY2hlIENhc3NhbmRyYSBpcyBhbiBvcGVuIHNvdXJjZSwgZGlzdHJpYnV0ZWQsIE5vU1FMIGRhdGFiYXNlLiBJdAorQXBhY2hlIENhc3NhbmRyYSBpcyBhbiBvcGVuLXNvdXJjZSwgZGlzdHJpYnV0ZWQsIE5vU1FMIGRhdGFiYXNlLiBJdAogcHJlc2VudHMgYSBwYXJ0aXRpb25lZCB3aWRlIGNvbHVtbiBzdG9yYWdlIG1vZGVsIHdpdGggZXZlbnR1YWxseQogY29uc2lzdGVudCBzZW1hbnRpY3MuCiAKQEAgLTEwLDcgKzEwLDcgQEAKIHVzaW5nIGEgc3RhZ2VkIGV2ZW50LWRyaXZlbiBhcmNoaXRlY3R1cmUKIChodHRwOi8vd3d3LnNvc3Aub3JnLzIwMDEvcGFwZXJzL3dlbHNoLnBkZltTRURBXSkgdG8gaW1wbGVtZW50IGEKIGNvbWJpbmF0aW9uIG9mIEFtYXpvbuKAmXMKLWh0dHA6Ly9jb3Vyc2VzLmNzZS50YW11LmVkdS9jYXZlcmxlZS9jc2NlNDM4L3JlYWRpbmdzL2R5bmFtby1wYXBlci5wZGZbRHluYW1vXQoraHR0cHM6Ly93d3cuY3MuY29ybmVsbC5lZHUvY291cnNlcy9jczU0MTQvMjAxN2ZhL3BhcGVycy9keW5hbW8ucGRmW0R5bmFtb10KIGRpc3RyaWJ1dGVkIHN0b3JhZ2UgYW5kIHJlcGxpY2F0aW9uIHRlY2huaXF1ZXMgYW5kIEdvb2dsZSdzCiBodHRwczovL3N0YXRpYy5nb29nbGV1c2VyY29udGVudC5jb20vbWVkaWEvcmVzZWFyY2guZ29vZ2xlLmNvbS9lbi8vYXJjaGl2ZS9iaWd0YWJsZS1vc2RpMDYucGRmW0JpZ3RhYmxlXQogZGF0YSBhbmQgc3RvcmFnZSBlbmdpbmUgbW9kZWwuIER5bmFtbyBhbmQgQmlndGFibGUgd2VyZSBib3RoIGRldmVsb3BlZApAQCAtMjMsNyArMjMsNyBAQAogcmVwbGljYXRpb24gYW5kIGFsd2F5cyBhdmFpbGFibGUgbG93LWxhdGVuY3kgcmVhZHMgYW5kIHdyaXRlcywgaXQgYmVjYW1lCiBpbXBlcmF0aXZlIHRvIGRlc2lnbiBhIG5ldyBraW5kIG9mIGRhdGFiYXNlIG1vZGVsIGFzIHRoZSByZWxhdGlvbmFsCiBkYXRhYmFzZSBzeXN0ZW1zIG9mIHRoZSB0aW1lIHN0cnVnZ2xlZCB0byBtZWV0IHRoZSBuZXcgcmVxdWlyZW1lbnRzIG9mCi1nbG9iYWwgc2NhbGUgYXBwbGljYXRpb25zLgorZ2xvYmFsLXNjYWxlIGFwcGxpY2F0aW9ucy4KIAogU3lzdGVtcyBsaWtlIENhc3NhbmRyYSBhcmUgZGVzaWduZWQgZm9yIHRoZXNlIGNoYWxsZW5nZXMgYW5kIHNlZWsgdGhlCiBmb2xsb3dpbmcgZGVzaWduIG9iamVjdGl2ZXM6CkBAIC01OSwxOSArNTksMTkgQEAKIENRTCBzdXBwb3J0cyBudW1lcm91cyBhZHZhbmNlZCBmZWF0dXJlcyBvdmVyIGEgcGFydGl0aW9uZWQgZGF0YXNldCBzdWNoCiBhczoKIAotKiBTaW5nbGUgcGFydGl0aW9uIGxpZ2h0d2VpZ2h0IHRyYW5zYWN0aW9ucyB3aXRoIGF0b21pYyBjb21wYXJlIGFuZCBzZXQKLXNlbWFudGljcy4KKyogU2luZ2xlLXBhcnRpdGlvbiBsaWdodHdlaWdodCB0cmFuc2FjdGlvbnMgd2l0aCBhdG9taWMgY29tcGFyZSBhbmQgc2V0CitzZW1hbnRpY3MKICogVXNlci1kZWZpbmVkIHR5cGVzLCBmdW5jdGlvbnMgYW5kIGFnZ3JlZ2F0ZXMKLSogQ29sbGVjdGlvbiB0eXBlcyBpbmNsdWRpbmcgc2V0cywgbWFwcywgYW5kIGxpc3RzLgorKiBDb2xsZWN0aW9uIHR5cGVzIGluY2x1ZGluZyBzZXRzLCBtYXBzLCBhbmQgbGlzdHMKICogTG9jYWwgc2Vjb25kYXJ5IGluZGljZXMKICogKEV4cGVyaW1lbnRhbCkgbWF0ZXJpYWxpemVkIHZpZXdzCiAKIENhc3NhbmRyYSBleHBsaWNpdGx5IGNob29zZXMgbm90IHRvIGltcGxlbWVudCBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZQotY3Jvc3MgcGFydGl0aW9uIGNvb3JkaW5hdGlvbiBhcyB0aGV5IGFyZSB0eXBpY2FsbHkgc2xvdyBhbmQgaGFyZCB0bworY3Jvc3MtcGFydGl0aW9uIGNvb3JkaW5hdGlvbiBhcyB0aGV5IGFyZSB0eXBpY2FsbHkgc2xvdyBhbmQgaGFyZCB0bwogcHJvdmlkZSBoaWdobHkgYXZhaWxhYmxlIGdsb2JhbCBzZW1hbnRpY3MuIEZvciBleGFtcGxlIENhc3NhbmRyYSBkb2VzCiBub3Qgc3VwcG9ydDoKIAotKiBDcm9zcyBwYXJ0aXRpb24gdHJhbnNhY3Rpb25zCisqIENyb3NzLXBhcnRpdGlvbiB0cmFuc2FjdGlvbnMKICogRGlzdHJpYnV0ZWQgam9pbnMKICogRm9yZWlnbiBrZXlzIG9yIHJlZmVyZW50aWFsIGludGVncml0eS4KIApkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2FyY2hpdGVjdHVyZS9zbml0Y2guYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9hcmNoaXRlY3R1cmUvc25pdGNoLmFkb2MKaW5kZXggM2FlMDY2ZC4uY2Q1OWY5OCAxMDA2NDQKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2FyY2hpdGVjdHVyZS9zbml0Y2guYWRvYworKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvYXJjaGl0ZWN0dXJlL3NuaXRjaC5hZG9jCkBAIC0xMiw3ICsxMiw3IEBACiAKID09IER5bmFtaWMgc25pdGNoaW5nCiAKLVRoZSBkeW5hbWljIHNuaXRjaCBtb25pdG9yIHJlYWQgbGF0ZW5jaWVzIHRvIGF2b2lkIHJlYWRpbmcgZnJvbSBob3N0cworVGhlIGR5bmFtaWMgc25pdGNoIG1vbml0b3JzIHJlYWQgbGF0ZW5jaWVzIHRvIGF2b2lkIHJlYWRpbmcgZnJvbSBob3N0cwogdGhhdCBoYXZlIHNsb3dlZCBkb3duLiBUaGUgZHluYW1pYyBzbml0Y2ggaXMgY29uZmlndXJlZCB3aXRoIHRoZQogZm9sbG93aW5nIHByb3BlcnRpZXMgb24gYGNhc3NhbmRyYS55YW1sYDoKIApkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2FyY2hpdGVjdHVyZS9zdG9yYWdlLWVuZ2luZS5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2FyY2hpdGVjdHVyZS9zdG9yYWdlLWVuZ2luZS5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMTU4YzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvYXJjaGl0ZWN0dXJlL3N0b3JhZ2UtZW5naW5lLmFkb2MKQEAgLTAsMCArMSwyMjggQEAKKz0gU3RvcmFnZSBFbmdpbmUKKworW1tjb21taXQtbG9nXV0KKz09IENvbW1pdExvZworCitDb21taXRsb2dzIGFyZSBhbiBhcHBlbmQtb25seSBsb2cgb2YgYWxsIG11dGF0aW9ucyBsb2NhbCB0byBhIENhc3NhbmRyYQorbm9kZS4gQW55IGRhdGEgd3JpdHRlbiB0byBDYXNzYW5kcmEgd2lsbCBmaXJzdCBiZSB3cml0dGVuIHRvIGEgY29tbWl0Citsb2cgYmVmb3JlIGJlaW5nIHdyaXR0ZW4gdG8gYSBtZW10YWJsZS4gVGhpcyBwcm92aWRlcyBkdXJhYmlsaXR5IGluIHRoZQorY2FzZSBvZiB1bmV4cGVjdGVkIHNodXRkb3duLiBPbiBzdGFydHVwLCBhbnkgbXV0YXRpb25zIGluIHRoZSBjb21taXQgbG9nCit3aWxsIGJlIGFwcGxpZWQgdG8gbWVtdGFibGVzLgorCitBbGwgbXV0YXRpb25zIGFyZSB3cml0ZS1vcHRpbWl6ZWQgYnkgc3RvcmluZyBpbiBjb21taXRsb2cgc2VnbWVudHMsIHJlZHVjaW5nCit0aGUgbnVtYmVyIG9mIHNlZWtzIG5lZWRlZCB0byB3cml0ZSB0byBkaXNrLiBDb21taXRsb2cgc2VnbWVudHMgYXJlCitsaW1pdGVkIGJ5IHRoZSBgY29tbWl0bG9nX3NlZ21lbnRfc2l6ZWAgb3B0aW9uLiBPbmNlIHRoZSBzaXplIGlzCityZWFjaGVkLCBhIG5ldyBjb21taXRsb2cgc2VnbWVudCBpcyBjcmVhdGVkLiBDb21taXRsb2cgc2VnbWVudHMgY2FuIGJlCithcmNoaXZlZCwgZGVsZXRlZCwgb3IgcmVjeWNsZWQgb25jZSBhbGwgdGhlIGRhdGEgaGFzIGJlZW4gZmx1c2hlZCB0bworU1NUYWJsZXMuIENvbW1pdGxvZyBzZWdtZW50cyBhcmUgdHJ1bmNhdGVkIHdoZW4gQ2Fzc2FuZHJhIGhhcyB3cml0dGVuCitkYXRhIG9sZGVyIHRoYW4gYSBjZXJ0YWluIHBvaW50IHRvIHRoZSBTU1RhYmxlcy4gUnVubmluZyAibm9kZXRvb2wKK2RyYWluIiBiZWZvcmUgc3RvcHBpbmcgQ2Fzc2FuZHJhIHdpbGwgd3JpdGUgZXZlcnl0aGluZyBpbiB0aGUgbWVtdGFibGVzCit0byBTU1RhYmxlcyBhbmQgcmVtb3ZlIHRoZSBuZWVkIHRvIHN5bmMgd2l0aCB0aGUgY29tbWl0bG9ncyBvbiBzdGFydHVwLgorCisqIGBjb21taXRsb2dfc2VnbWVudF9zaXplYDogVGhlIGRlZmF1bHQgc2l6ZSBpcyAzMk1pQiwgd2hpY2ggaXMKK2FsbW9zdCBhbHdheXMgZmluZSwgYnV0IGlmIHlvdSBhcmUgYXJjaGl2aW5nIGNvbW1pdGxvZyBzZWdtZW50cyAoc2VlCitjb21taXRsb2dfYXJjaGl2aW5nLnByb3BlcnRpZXMpLCB0aGVuIHlvdSBwcm9iYWJseSB3YW50IGEgZmluZXIKK2dyYW51bGFyaXR5IG9mIGFyY2hpdmluZzsgOCBvciAxNiBNaUIgaXMgcmVhc29uYWJsZS4KK2Bjb21taXRsb2dfc2VnbWVudF9zaXplYCBhbHNvIGRldGVybWluZXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YKK2BtYXhfbXV0YXRpb25fc2l6ZWAgaW4gYGNhc3NhbmRyYS55YW1sYC4gQnkgZGVmYXVsdCwKK2BtYXhfbXV0YXRpb25fc2l6ZWAgaXMgYSBoYWxmIHRoZSBzaXplIG9mIGBjb21taXRsb2dfc2VnbWVudF9zaXplYC4KKworW05PVEVdCisuTm90ZQorPT09PQorSWYgYG1heF9tdXRhdGlvbl9zaXplYCBpcyBzZXQgZXhwbGljaXRseSB0aGVuCitgY29tbWl0bG9nX3NlZ21lbnRfc2l6ZWAgbXVzdCBiZSBzZXQgdG8gYXQgbGVhc3QgdHdpY2UgdGhlIHNpemUgb2YKK2BtYXhfbXV0YXRpb25fc2l6ZWAuCis9PT09CisKKyogYGNvbW1pdGxvZ19zeW5jYDogbWF5IGJlIGVpdGhlciBfcGVyaW9kaWNfIG9yIF9iYXRjaF8uCisqKiBgYmF0Y2hgOiBJbiBiYXRjaCBtb2RlLCBDYXNzYW5kcmEgd29u4oCZdCBhY2sgd3JpdGVzIHVudGlsIHRoZSBjb21taXQKK2xvZyBoYXMgYmVlbiBmc3luY2VkIHRvIGRpc2suIEl0IHdpbGwgd2FpdAorImNvbW1pdGxvZ19zeW5jX2JhdGNoX3dpbmRvd19pbl9tcyIgbWlsbGlzZWNvbmRzIGJldHdlZW4gZnN5bmNzLiBUaGlzCit3aW5kb3cgc2hvdWxkIGJlIGtlcHQgc2hvcnQgYmVjYXVzZSB0aGUgd3JpdGVyIHRocmVhZHMgd2lsbCBiZSB1bmFibGUgdG8KK2RvIGV4dHJhIHdvcmsgd2hpbGUgd2FpdGluZy4gWW91IG1heSBuZWVkIHRvIGluY3JlYXNlIGNvbmN1cnJlbnRfd3JpdGVzCitmb3IgdGhlIHNhbWUgcmVhc29uLgorKworLSBgY29tbWl0bG9nX3N5bmNfYmF0Y2hfd2luZG93X2luX21zYDogVGltZSB0byB3YWl0IGJldHdlZW4gImJhdGNoIgorZnN5bmNzIF9EZWZhdWx0IFZhbHVlOl8gMgorKiogYHBlcmlvZGljYDogSW4gcGVyaW9kaWMgbW9kZSwgd3JpdGVzIGFyZSBpbW1lZGlhdGVseSBhY2snZWQsIGFuZCB0aGUKK0NvbW1pdExvZyBpcyBzaW1wbHkgc3luY2VkIGV2ZXJ5ICJjb21taXRsb2dfc3luY19wZXJpb2QiCittaWxsaXNlY29uZHMuCisrCistIGBjb21taXRsb2dfc3luY19wZXJpb2RgOiBUaW1lIHRvIHdhaXQgYmV0d2VlbiAicGVyaW9kaWMiIGZzeW5jcworX0RlZmF1bHQgVmFsdWU6XyAxMDAwMG1zCisKK19EZWZhdWx0IFZhbHVlOl8gYmF0Y2gKKworW05PVEVdCisuTm90ZQorPT09PQorSW4gdGhlIGV2ZW50IG9mIGFuIHVuZXhwZWN0ZWQgc2h1dGRvd24sIENhc3NhbmRyYSBjYW4gbG9zZSB1cAordG8gdGhlIHN5bmMgcGVyaW9kIG9yIG1vcmUgaWYgdGhlIHN5bmMgaXMgZGVsYXllZC4gSWYgdXNpbmcgImJhdGNoIgorbW9kZSwgaXQgaXMgcmVjb21tZW5kZWQgdG8gc3RvcmUgY29tbWl0bG9ncyBpbiBhIHNlcGFyYXRlLCBkZWRpY2F0ZWQKK2RldmljZS4KKz09PT0KKworKiBgY29tbWl0bG9nX2RpcmVjdG9yeWA6IFRoaXMgb3B0aW9uIGlzIGNvbW1lbnRlZCBvdXQgYnkgZGVmYXVsdC4gV2hlbgorcnVubmluZyBvbiBtYWduZXRpYyBIREQsIHRoaXMgc2hvdWxkIGJlIGEgc2VwYXJhdGUgc3BpbmRsZSB0aGFuIHRoZSBkYXRhCitkaXJlY3Rvcmllcy4gSWYgbm90IHNldCwgdGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzCitgJENBU1NBTkRSQV9IT01FL2RhdGEvY29tbWl0bG9nYC4KKworX0RlZmF1bHQgVmFsdWU6XyBgL3Zhci9saWIvY2Fzc2FuZHJhL2NvbW1pdGxvZ2AKKworKiBgY29tbWl0bG9nX2NvbXByZXNzaW9uYDogQ29tcHJlc3Npb24gdG8gYXBwbHkgdG8gdGhlIGNvbW1pdGxvZy4gSWYKK29taXR0ZWQsIHRoZSBjb21taXQgbG9nIHdpbGwgYmUgd3JpdHRlbiB1bmNvbXByZXNzZWQuIExaNCwgU25hcHB5LAorRGVmbGF0ZSBhbmQgWnN0ZCBjb21wcmVzc29ycyBhcmUgc3VwcG9ydGVkLgorCitfRGVmYXVsdCBWYWx1ZTpfIChjb21wbGV4IG9wdGlvbik6CisKK1tzb3VyY2UsIHlhbWxdCistLS0tCisjICAgLSBjbGFzc19uYW1lOiBMWjRDb21wcmVzc29yCisjICAgICBwYXJhbWV0ZXJzOgorLS0tLQorCisqIGBjb21taXRsb2dfdG90YWxfc3BhY2VgOiBUb3RhbCBzcGFjZSB0byB1c2UgZm9yIGNvbW1pdCBsb2dzIG9uCitkaXNrLgorCitJZiBzcGFjZSBnZXRzIGFib3ZlIHRoaXMgdmFsdWUsIENhc3NhbmRyYSB3aWxsIGZsdXNoIGV2ZXJ5IGRpcnR5IENGIGluCit0aGUgb2xkZXN0IHNlZ21lbnQgYW5kIHJlbW92ZSBpdC4gU28gYSBzbWFsbCB0b3RhbCBjb21taXRsb2cgc3BhY2Ugd2lsbAordGVuZCB0byBjYXVzZSBtb3JlIGZsdXNoIGFjdGl2aXR5IG9uIGxlc3MtYWN0aXZlIGNvbHVtbmZhbWlsaWVzLgorCitUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgc21hbGxlc3QgYmV0d2VlbiA4MTkyIGFuZCAxLzQgb2YgdGhlIHRvdGFsCitzcGFjZSBvZiB0aGUgY29tbWl0bG9nIHZvbHVtZS4KKworX0RlZmF1bHQgVmFsdWU6XyA4MTkyTWlCCisKKz09IE1lbXRhYmxlcworCitNZW10YWJsZXMgYXJlIGluLW1lbW9yeSBzdHJ1Y3R1cmVzIHdoZXJlIENhc3NhbmRyYSBidWZmZXJzIHdyaXRlcy4gSW4KK2dlbmVyYWwsIHRoZXJlIGlzIG9uZSBhY3RpdmUgbWVtdGFibGUgcGVyIHRhYmxlLiBFdmVudHVhbGx5LCBtZW10YWJsZXMKK2FyZSBmbHVzaGVkIG9udG8gZGlzayBhbmQgYmVjb21lIGltbXV0YWJsZSBsaW5rOiNzc3RhYmxlc1tTU1RhYmxlc10uCitUaGlzIGNhbiBiZSB0cmlnZ2VyZWQgaW4gc2V2ZXJhbCB3YXlzOgorCisqIFRoZSBtZW1vcnkgdXNhZ2Ugb2YgdGhlIG1lbXRhYmxlcyBleGNlZWRzIHRoZSBjb25maWd1cmVkIHRocmVzaG9sZAorKHNlZSBgbWVtdGFibGVfY2xlYW51cF90aHJlc2hvbGRgKQorKiBUaGUgYGNvbW1pdC1sb2dgIGFwcHJvYWNoZXMgaXRzIG1heGltdW0gc2l6ZSwgYW5kIGZvcmNlcyBtZW10YWJsZQorZmx1c2hlcyBpbiBvcmRlciB0byBhbGxvdyBjb21taXRsb2cgc2VnbWVudHMgdG8gYmUgZnJlZWQKKworTWVtdGFibGVzIG1heSBiZSBzdG9yZWQgZW50aXJlbHkgb24taGVhcCBvciBwYXJ0aWFsbHkgb2ZmLWhlYXAsCitkZXBlbmRpbmcgb24gYG1lbXRhYmxlX2FsbG9jYXRpb25fdHlwZWAuCisKKz09IFNTVGFibGVzCisKK1NTVGFibGVzIGFyZSB0aGUgaW1tdXRhYmxlIGRhdGEgZmlsZXMgdGhhdCBDYXNzYW5kcmEgdXNlcyBmb3IgcGVyc2lzdGluZworZGF0YSBvbiBkaXNrLgorCitBcyBTU1RhYmxlcyBhcmUgZmx1c2hlZCB0byBkaXNrIGZyb20gYG1lbXRhYmxlc2Agb3IgYXJlIHN0cmVhbWVkIGZyb20KK290aGVyIG5vZGVzLCBDYXNzYW5kcmEgdHJpZ2dlcnMgY29tcGFjdGlvbnMgd2hpY2ggY29tYmluZSBtdWx0aXBsZQorU1NUYWJsZXMgaW50byBvbmUuIE9uY2UgdGhlIG5ldyBTU1RhYmxlIGhhcyBiZWVuIHdyaXR0ZW4sIHRoZSBvbGQKK1NTVGFibGVzIGNhbiBiZSByZW1vdmVkLgorCitFYWNoIFNTVGFibGUgaXMgY29tcHJpc2VkIG9mIG11bHRpcGxlIGNvbXBvbmVudHMgc3RvcmVkIGluIHNlcGFyYXRlCitmaWxlczoKKworYERhdGEuZGJgOjoKKyAgVGhlIGFjdHVhbCBkYXRhLCBpLmUuIHRoZSBjb250ZW50cyBvZiByb3dzLgorYEluZGV4LmRiYDo6CisgIEFuIGluZGV4IGZyb20gcGFydGl0aW9uIGtleXMgdG8gcG9zaXRpb25zIGluIHRoZSBgRGF0YS5kYmAgZmlsZS4gRm9yCisgIHdpZGUgcGFydGl0aW9ucywgdGhpcyBtYXkgYWxzbyBpbmNsdWRlIGFuIGluZGV4IHRvIHJvd3Mgd2l0aGluIGEKKyAgcGFydGl0aW9uLgorYFN1bW1hcnkuZGJgOjoKKyAgQSBzYW1wbGluZyBvZiAoYnkgZGVmYXVsdCkgZXZlcnkgMTI4dGggZW50cnkgaW4gdGhlIGBJbmRleC5kYmAgZmlsZS4KK2BGaWx0ZXIuZGJgOjoKKyAgQSBCbG9vbSBGaWx0ZXIgb2YgdGhlIHBhcnRpdGlvbiBrZXlzIGluIHRoZSBTU1RhYmxlLgorYENvbXByZXNzaW9uSW5mby5kYmA6OgorICBNZXRhZGF0YSBhYm91dCB0aGUgb2Zmc2V0cyBhbmQgbGVuZ3RocyBvZiBjb21wcmVzc2lvbiBjaHVua3MgaW4gdGhlCisgIGBEYXRhLmRiYCBmaWxlLgorYFN0YXRpc3RpY3MuZGJgOjoKKyAgU3RvcmVzIG1ldGFkYXRhIGFib3V0IHRoZSBTU1RhYmxlLCBpbmNsdWRpbmcgaW5mb3JtYXRpb24gYWJvdXQKKyAgdGltZXN0YW1wcywgdG9tYnN0b25lcywgY2x1c3RlcmluZyBrZXlzLCBjb21wYWN0aW9uLCByZXBhaXIsCisgIGNvbXByZXNzaW9uLCBUVExzLCBhbmQgbW9yZS4KK2BEaWdlc3QuY3JjMzJgOjoKKyAgQSBDUkMtMzIgZGlnZXN0IG9mIHRoZSBgRGF0YS5kYmAgZmlsZS4KK2BUT0MudHh0YDo6CisgIEEgcGxhaW4gdGV4dCBsaXN0IG9mIHRoZSBjb21wb25lbnQgZmlsZXMgZm9yIHRoZSBTU1RhYmxlLgorCitXaXRoaW4gdGhlIGBEYXRhLmRiYCBmaWxlLCByb3dzIGFyZSBvcmdhbml6ZWQgYnkgcGFydGl0aW9uLiBUaGVzZQorcGFydGl0aW9ucyBhcmUgc29ydGVkIGluIHRva2VuIG9yZGVyIChpLmUuIGJ5IGEgaGFzaCBvZiB0aGUgcGFydGl0aW9uCitrZXkgd2hlbiB0aGUgZGVmYXVsdCBwYXJ0aXRpb25lciwgYE11cm11cjNQYXJ0aXRpb25gLCBpcyB1c2VkKS4gV2l0aGluIGEKK3BhcnRpdGlvbiwgcm93cyBhcmUgc3RvcmVkIGluIHRoZSBvcmRlciBvZiB0aGVpciBjbHVzdGVyaW5nIGtleXMuCisKK1NTVGFibGVzIGNhbiBiZSBvcHRpb25hbGx5IGNvbXByZXNzZWQgdXNpbmcgYmxvY2stYmFzZWQgY29tcHJlc3Npb24uCisKKz09IFNTVGFibGUgVmVyc2lvbnMKKworVGhpcyBzZWN0aW9uIHdhcyBjcmVhdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcKK2h0dHBzOi8vZ2lzdC5naXRodWIuY29tL3NoeWFtc2FsaW1rdW1hci80OWE2MWU1YmM2ZjQwM2QyMGM1NVtnaXN0XSB3aGljaAordXRpbGl6ZWQgdGhpcyBvcmlnaW5hbAoraHR0cDovL3d3dy5iYWpiLm5ldC8yMDEzLzAzL2Nhc3NhbmRyYS1zc3RhYmxlLWZvcm1hdC12ZXJzaW9uLW51bWJlcnMvW3NvdXJjZV0uCisKK1RoZSB2ZXJzaW9uIG51bWJlcnMsIHRvIGRhdGUgYXJlOgorCis9PT0gVmVyc2lvbiAwCisKKyogYiAoMC43LjApOiBhZGRlZCB2ZXJzaW9uIHRvIHNzdGFibGUgZmlsZW5hbWVzCisqIGMgKDAuNy4wKTogYmxvb20gZmlsdGVyIGNvbXBvbmVudCBjb21wdXRlcyBoYXNoZXMgb3ZlciByYXcga2V5IGJ5dGVzCitpbnN0ZWFkIG9mIHN0cmluZ3MKKyogZCAoMC43LjApOiByb3cgc2l6ZSBpbiBkYXRhIGNvbXBvbmVudCBiZWNvbWVzIGEgbG9uZyBpbnN0ZWFkIG9mIGludAorKiBlICgwLjcuMCk6IHN0b3JlcyB1bmRlY29yYXRlZCBrZXlzIGluIGRhdGEgYW5kIGluZGV4IGNvbXBvbmVudHMKKyogZiAoMC43LjApOiBzd2l0Y2hlZCBibG9vbSBmaWx0ZXIgaW1wbGVtZW50YXRpb25zIGluIGRhdGEgY29tcG9uZW50CisqIGcgKDAuOCk6IHRyYWNrcyBmbHVzaGVkLWF0IGNvbnRleHQgaW4gbWV0YWRhdGEgY29tcG9uZW50CisKKz09PSBWZXJzaW9uIDEKKworKiBoICgxLjApOiB0cmFja3MgbWF4IGNsaWVudCB0aW1lc3RhbXAgaW4gbWV0YWRhdGEgY29tcG9uZW50CisqIGhiICgxLjAuMyk6IHJlY29yZHMgY29tcHJlc3Npb24gcmF0aW9uIGluIG1ldGFkYXRhIGNvbXBvbmVudAorKiBoYyAoMS4wLjQpOiByZWNvcmRzIHBhcnRpdGlvbmVyIGluIG1ldGFkYXRhIGNvbXBvbmVudAorKiBoZCAoMS4wLjEwKTogaW5jbHVkZXMgcm93IHRvbWJzdG9uZXMgaW4gbWF4dGltZXN0YW1wCisqIGhlICgxLjEuMyk6IGluY2x1ZGVzIGFuY2VzdG9ycyBnZW5lcmF0aW9uIGluIG1ldGFkYXRhIGNvbXBvbmVudAorKiBoZiAoMS4xLjYpOiBtYXJrZXIgdGhhdCByZXBsYXkgcG9zaXRpb24gY29ycmVzcG9uZHMgdG8gMS4xLjUrCittaWxsaXMtYmFzZWQgaWQgKHNlZSBDQVNTQU5EUkEtNDc4MikKKyogaWEgKDEuMi4wKToKKyoqIGNvbHVtbiBpbmRleGVzIGFyZSBwcm9tb3RlZCB0byB0aGUgaW5kZXggZmlsZQorKiogcmVjb3JkcyBlc3RpbWF0ZWQgaGlzdG9ncmFtIG9mIGRlbGV0aW9uIHRpbWVzIGluIHRvbWJzdG9uZXMKKyoqIGJsb29tIGZpbHRlciAoa2V5cyBhbmQgY29sdW1ucykgdXBncmFkZWQgdG8gTXVybXVyMworKiBpYiAoMS4yLjEpOiB0cmFja3MgbWluIGNsaWVudCB0aW1lc3RhbXAgaW4gbWV0YWRhdGEgY29tcG9uZW50CisqIGljICgxLjIuNSk6IG9taXRzIHBlci1yb3cgYmxvb20gZmlsdGVyIG9mIGNvbHVtbiBuYW1lcworCis9PT0gVmVyc2lvbiAyCisKKyogamEgKDIuMC4wKToKKyoqIHN1cGVyIGNvbHVtbnMgYXJlIHNlcmlhbGl6ZWQgYXMgY29tcG9zaXRlcyAobm90ZSB0aGF0IHRoZXJlIGlzIG5vCityZWFsIGZvcm1hdCBjaGFuZ2UsIHRoaXMgaXMgbW9zdGx5IGEgbWFya2VyIHRvIGtub3cgaWYgd2Ugc2hvdWxkIGV4cGVjdAorc3VwZXIgY29sdW1ucyBvciBub3QuIFdlIGRvIG5lZWQgYSBtYWpvciB2ZXJzaW9uIGJ1bXAgaG93ZXZlciwgYmVjYXVzZQord2Ugc2hvdWxkIG5vdCBhbGxvdyBzdHJlYW1pbmcgb2Ygc3VwZXIgY29sdW1ucyBpbnRvIHRoaXMgbmV3IGZvcm1hdCkKKyoqIHRyYWNrcyBtYXggbG9jYWwgZGVsZXRpb250aW1lIGluIHNzdGFibGUgbWV0YWRhdGEKKyoqIHJlY29yZHMgYmxvb21fZmlsdGVyX2ZwX2NoYW5jZSBpbiBtZXRhZGF0YSBjb21wb25lbnQKKyoqIHJlbW92ZSBkYXRhIHNpemUgYW5kIGNvbHVtbiBjb3VudCBmcm9tIGRhdGEgZmlsZSAoQ0FTU0FORFJBLTQxODApCisqKiB0cmFja3MgbWF4L21pbiBjb2x1bW4gdmFsdWVzIChhY2NvcmRpbmcgdG8gY29tcGFyYXRvcikKKyogamIgKDIuMC4xKToKKyoqIHN3aXRjaCBmcm9tIGNyYzMyIHRvIGFkbGVyMzIgZm9yIGNvbXByZXNzaW9uIGNoZWNrc3VtcworKiogY2hlY2tzdW0gdGhlIGNvbXByZXNzZWQgZGF0YQorKiBrYSAoMi4xLjApOgorKiogbmV3IFN0YXRpc3RpY3MuZGIgZmlsZSBmb3JtYXQKKyoqIGluZGV4IHN1bW1hcmllcyBjYW4gYmUgZG93bnNhbXBsZWQgYW5kIHRoZSBzYW1wbGluZyBsZXZlbCBpcworcGVyc2lzdGVkCisqKiBzd2l0Y2ggdW5jb21wcmVzc2VkIGNoZWNrc3VtcyB0byBhZGxlcjMyCisqKiB0cmFja3MgcHJlc2VuY2Ugb2YgbGVnYWN5IChsb2NhbCBhbmQgcmVtb3RlKSBjb3VudGVyIHNoYXJkcworKiBsYSAoMi4yLjApOiBuZXcgZmlsZSBuYW1lIGZvcm1hdAorKiBsYiAoMi4yLjcpOiBjb21taXQgbG9nIGxvd2VyIGJvdW5kIGluY2x1ZGVkCisKKz09PSBWZXJzaW9uIDMKKworKiBtYSAoMy4wLjApOgorKiogc3dhcCBiZiBoYXNoIG9yZGVyCisqKiBzdG9yZSByb3dzIG5hdGl2ZWx5CisqIG1iICgzLjAuNywgMy43KTogY29tbWl0IGxvZyBsb3dlciBib3VuZCBpbmNsdWRlZAorKiBtYyAoMy4wLjgsIDMuOSk6IGNvbW1pdCBsb2cgaW50ZXJ2YWxzIGluY2x1ZGVkCisKKz09PSBFeGFtcGxlIENvZGUKKworVGhlIGZvbGxvd2luZyBleGFtcGxlIGlzIHVzZWZ1bCBmb3IgZmluZGluZyBhbGwgc3N0YWJsZXMgdGhhdCBkbyBub3QKK21hdGNoIHRoZSAiaWIiIFNTVGFibGUgdmVyc2lvbgorCitbc291cmNlLGJhc2hdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvZmluZF9zc3RhYmxlcy5zaFtdCistLS0tCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvYXJjaGl0ZWN0dXJlL3N0b3JhZ2VfZW5naW5lLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvYXJjaGl0ZWN0dXJlL3N0b3JhZ2VfZW5naW5lLmFkb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMGMzN2EuLjAwMDAwMDAKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2FyY2hpdGVjdHVyZS9zdG9yYWdlX2VuZ2luZS5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLT0gU3RvcmFnZSBFbmdpbmUKLQotW1tjb21taXQtbG9nXV0KLT09IENvbW1pdExvZwotCi1Db21taXRsb2dzIGFyZSBhbiBhcHBlbmQgb25seSBsb2cgb2YgYWxsIG11dGF0aW9ucyBsb2NhbCB0byBhIENhc3NhbmRyYQotbm9kZS4gQW55IGRhdGEgd3JpdHRlbiB0byBDYXNzYW5kcmEgd2lsbCBmaXJzdCBiZSB3cml0dGVuIHRvIGEgY29tbWl0Ci1sb2cgYmVmb3JlIGJlaW5nIHdyaXR0ZW4gdG8gYSBtZW10YWJsZS4gVGhpcyBwcm92aWRlcyBkdXJhYmlsaXR5IGluIHRoZQotY2FzZSBvZiB1bmV4cGVjdGVkIHNodXRkb3duLiBPbiBzdGFydHVwLCBhbnkgbXV0YXRpb25zIGluIHRoZSBjb21taXQgbG9nCi13aWxsIGJlIGFwcGxpZWQgdG8gbWVtdGFibGVzLgotCi1BbGwgbXV0YXRpb25zIHdyaXRlIG9wdGltaXplZCBieSBzdG9yaW5nIGluIGNvbW1pdGxvZyBzZWdtZW50cywgcmVkdWNpbmcKLXRoZSBudW1iZXIgb2Ygc2Vla3MgbmVlZGVkIHRvIHdyaXRlIHRvIGRpc2suIENvbW1pdGxvZyBTZWdtZW50cyBhcmUKLWxpbWl0ZWQgYnkgdGhlIGBjb21taXRsb2dfc2VnbWVudF9zaXplYCBvcHRpb24sIG9uY2UgdGhlIHNpemUgaXMKLXJlYWNoZWQsIGEgbmV3IGNvbW1pdGxvZyBzZWdtZW50IGlzIGNyZWF0ZWQuIENvbW1pdGxvZyBzZWdtZW50cyBjYW4gYmUKLWFyY2hpdmVkLCBkZWxldGVkLCBvciByZWN5Y2xlZCBvbmNlIGFsbCBpdHMgZGF0YSBoYXMgYmVlbiBmbHVzaGVkIHRvCi1TU1RhYmxlcy4gQ29tbWl0bG9nIHNlZ21lbnRzIGFyZSB0cnVuY2F0ZWQgd2hlbiBDYXNzYW5kcmEgaGFzIHdyaXR0ZW4KLWRhdGEgb2xkZXIgdGhhbiBhIGNlcnRhaW4gcG9pbnQgdG8gdGhlIFNTVGFibGVzLiBSdW5uaW5nICJub2RldG9vbAotZHJhaW4iIGJlZm9yZSBzdG9wcGluZyBDYXNzYW5kcmEgd2lsbCB3cml0ZSBldmVyeXRoaW5nIGluIHRoZSBtZW10YWJsZXMKLXRvIFNTVGFibGVzIGFuZCByZW1vdmUgdGhlIG5lZWQgdG8gc3luYyB3aXRoIHRoZSBjb21taXRsb2dzIG9uIHN0YXJ0dXAuCi0KLSogYGNvbW1pdGxvZ19zZWdtZW50X3NpemVgOiBUaGUgZGVmYXVsdCBzaXplIGlzIDMyTWlCLCB3aGljaCBpcwotYWxtb3N0IGFsd2F5cyBmaW5lLCBidXQgaWYgeW91IGFyZSBhcmNoaXZpbmcgY29tbWl0bG9nIHNlZ21lbnRzIChzZWUKLWNvbW1pdGxvZ19hcmNoaXZpbmcucHJvcGVydGllcyksIHRoZW4geW91IHByb2JhYmx5IHdhbnQgYSBmaW5lcgotZ3JhbnVsYXJpdHkgb2YgYXJjaGl2aW5nOyA4IG9yIDE2IE1pQiBpcyByZWFzb25hYmxlLiBgY29tbWl0bG9nX3NlZ21lbnRfc2l6ZWAKLWFsc28gZGV0ZXJtaW5lcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBgbWF4X211dGF0aW9uX3NpemVgIGluIGNhc3NhbmRyYS55YW1sLgotQnkgZGVmYXVsdCwgbWF4X211dGF0aW9uX3NpemUgaXMgaGFsZiB0aGUgc2l6ZSBvZiBgY29tbWl0bG9nX3NlZ21lbnRfc2l6ZWAuCi0KLSoqTk9URTogSWYgYG1heF9tdXRhdGlvbl9zaXplYCBpcyBzZXQgZXhwbGljaXRseSB0aGVuCi1gY29tbWl0bG9nX3NlZ21lbnRfc2l6ZWAgbXVzdCBiZSBzZXQgdG8gYXQgbGVhc3QgdHdpY2UgdGhlIHNpemUgb2YKLWBtYXhfbXV0YXRpb25fc2l6ZWAqKi4KLQotQ29tbWl0bG9ncyBhcmUgYW4gYXBwZW5kIG9ubHkgbG9nIG9mIGFsbCBtdXRhdGlvbnMgbG9jYWwgdG8gYSBDYXNzYW5kcmEKLW5vZGUuIEFueSBkYXRhIHdyaXR0ZW4gdG8gQ2Fzc2FuZHJhIHdpbGwgZmlyc3QgYmUgd3JpdHRlbiB0byBhIGNvbW1pdAotbG9nIGJlZm9yZSBiZWluZyB3cml0dGVuIHRvIGEgbWVtdGFibGUuIFRoaXMgcHJvdmlkZXMgZHVyYWJpbGl0eSBpbiB0aGUKLWNhc2Ugb2YgdW5leHBlY3RlZCBzaHV0ZG93bi4gT24gc3RhcnR1cCwgYW55IG11dGF0aW9ucyBpbiB0aGUgY29tbWl0IGxvZwotd2lsbCBiZSBhcHBsaWVkLgotCi0qIGBjb21taXRsb2dfc3luY2A6IG1heSBiZSBlaXRoZXIgX3BlcmlvZGljXyBvciBfYmF0Y2hfLgotKiogYGJhdGNoYDogSW4gYmF0Y2ggbW9kZSwgQ2Fzc2FuZHJhIHdvbuKAmXQgYWNrIHdyaXRlcyB1bnRpbCB0aGUgY29tbWl0Ci1sb2cgaGFzIGJlZW4gZnN5bmNlZCB0byBkaXNrLiBJdCB3aWxsIHdhaXQKLSJjb21taXRsb2dfc3luY19iYXRjaF93aW5kb3dfaW5fbXMiIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGZzeW5jcy4gVGhpcwotd2luZG93IHNob3VsZCBiZSBrZXB0IHNob3J0IGJlY2F1c2UgdGhlIHdyaXRlciB0aHJlYWRzIHdpbGwgYmUgdW5hYmxlIHRvCi1kbyBleHRyYSB3b3JrIHdoaWxlIHdhaXRpbmcuIFlvdSBtYXkgbmVlZCB0byBpbmNyZWFzZSBjb25jdXJyZW50X3dyaXRlcwotZm9yIHRoZSBzYW1lIHJlYXNvbi4KLSsKLS0gYGNvbW1pdGxvZ19zeW5jX2JhdGNoX3dpbmRvd19pbl9tc2A6IFRpbWUgdG8gd2FpdCBiZXR3ZWVuICJiYXRjaCIKLWZzeW5jcyBfRGVmYXVsdCBWYWx1ZTpfIDIKLSoqIGBwZXJpb2RpY2A6IEluIHBlcmlvZGljIG1vZGUsIHdyaXRlcyBhcmUgaW1tZWRpYXRlbHkgYWNrJ2VkLCBhbmQgdGhlCi1Db21taXRMb2cgaXMgc2ltcGx5IHN5bmNlZCBldmVyeSAiY29tbWl0bG9nX3N5bmNfcGVyaW9kIgotbWlsbGlzZWNvbmRzLgotKwotLSBgY29tbWl0bG9nX3N5bmNfcGVyaW9kYDogVGltZSB0byB3YWl0IGJldHdlZW4gInBlcmlvZGljIiBmc3luY3MKLV9EZWZhdWx0IFZhbHVlOl8gMTAwMDBtcwotCi1fRGVmYXVsdCBWYWx1ZTpfIGJhdGNoCi0KLSoqIE5PVEU6IEluIHRoZSBldmVudCBvZiBhbiB1bmV4cGVjdGVkIHNodXRkb3duLCBDYXNzYW5kcmEgY2FuIGxvc2UgdXAKLXRvIHRoZSBzeW5jIHBlcmlvZCBvciBtb3JlIGlmIHRoZSBzeW5jIGlzIGRlbGF5ZWQuIElmIHVzaW5nICJiYXRjaCIKLW1vZGUsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHN0b3JlIGNvbW1pdGxvZ3MgaW4gYSBzZXBhcmF0ZSwgZGVkaWNhdGVkCi1kZXZpY2UuKgotCi0qIGBjb21taXRsb2dfZGlyZWN0b3J5YDogVGhpcyBvcHRpb24gaXMgY29tbWVudGVkIG91dCBieSBkZWZhdWx0IFdoZW4KLXJ1bm5pbmcgb24gbWFnbmV0aWMgSERELCB0aGlzIHNob3VsZCBiZSBhIHNlcGFyYXRlIHNwaW5kbGUgdGhhbiB0aGUgZGF0YQotZGlyZWN0b3JpZXMuIElmIG5vdCBzZXQsIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpcwotJENBU1NBTkRSQV9IT01FL2RhdGEvY29tbWl0bG9nLgotCi1fRGVmYXVsdCBWYWx1ZTpfIC92YXIvbGliL2Nhc3NhbmRyYS9jb21taXRsb2cKLQotKiBgY29tbWl0bG9nX2NvbXByZXNzaW9uYDogQ29tcHJlc3Npb24gdG8gYXBwbHkgdG8gdGhlIGNvbW1pdGxvZy4gSWYKLW9taXR0ZWQsIHRoZSBjb21taXQgbG9nIHdpbGwgYmUgd3JpdHRlbiB1bmNvbXByZXNzZWQuIExaNCwgU25hcHB5LAotRGVmbGF0ZSBhbmQgWnN0ZCBjb21wcmVzc29ycyBhcmUgc3VwcG9ydGVkLgotCi0oRGVmYXVsdCBWYWx1ZTogKGNvbXBsZXggb3B0aW9uKToKLQotW3NvdXJjZSwgeWFtbF0KLS0tLS0KLSMgICAtIGNsYXNzX25hbWU6IExaNENvbXByZXNzb3IKLSMgICAgIHBhcmFtZXRlcnM6Ci0tLS0tCi0KLSogYGNvbW1pdGxvZ190b3RhbF9zcGFjZWA6IFRvdGFsIHNwYWNlIHRvIHVzZSBmb3IgY29tbWl0IGxvZ3Mgb24KLWRpc2suCi0KLUlmIHNwYWNlIGdldHMgYWJvdmUgdGhpcyB2YWx1ZSwgQ2Fzc2FuZHJhIHdpbGwgZmx1c2ggZXZlcnkgZGlydHkgQ0YgaW4KLXRoZSBvbGRlc3Qgc2VnbWVudCBhbmQgcmVtb3ZlIGl0LiBTbyBhIHNtYWxsIHRvdGFsIGNvbW1pdGxvZyBzcGFjZSB3aWxsCi10ZW5kIHRvIGNhdXNlIG1vcmUgZmx1c2ggYWN0aXZpdHkgb24gbGVzcy1hY3RpdmUgY29sdW1uZmFtaWxpZXMuCi0KLVRoZSBkZWZhdWx0IHZhbHVlIGlzIHRoZSBzbWFsbGVyIG9mIDgxOTIsIGFuZCAxLzQgb2YgdGhlIHRvdGFsIHNwYWNlIG9mCi10aGUgY29tbWl0bG9nIHZvbHVtZS4KLQotX0RlZmF1bHQgVmFsdWU6XyA4MTkyTWlCCi0KLT09IE1lbXRhYmxlcwotCi1NZW10YWJsZXMgYXJlIGluLW1lbW9yeSBzdHJ1Y3R1cmVzIHdoZXJlIENhc3NhbmRyYSBidWZmZXJzIHdyaXRlcy4gSW4KLWdlbmVyYWwsIHRoZXJlIGlzIG9uZSBhY3RpdmUgbWVtdGFibGUgcGVyIHRhYmxlLiBFdmVudHVhbGx5LCBtZW10YWJsZXMKLWFyZSBmbHVzaGVkIG9udG8gZGlzayBhbmQgYmVjb21lIGltbXV0YWJsZSBsaW5rOiNzc3RhYmxlc1tTU1RhYmxlc10uCi1UaGlzIGNhbiBiZSB0cmlnZ2VyZWQgaW4gc2V2ZXJhbCB3YXlzOgotCi0qIFRoZSBtZW1vcnkgdXNhZ2Ugb2YgdGhlIG1lbXRhYmxlcyBleGNlZWRzIHRoZSBjb25maWd1cmVkIHRocmVzaG9sZAotKHNlZSBgbWVtdGFibGVfY2xlYW51cF90aHJlc2hvbGRgKQotKiBUaGUgYGNvbW1pdC1sb2dgIGFwcHJvYWNoZXMgaXRzIG1heGltdW0gc2l6ZSwgYW5kIGZvcmNlcyBtZW10YWJsZQotZmx1c2hlcyBpbiBvcmRlciB0byBhbGxvdyBjb21taXRsb2cgc2VnbWVudHMgdG8gYmUgZnJlZWQKLQotTWVtdGFibGVzIG1heSBiZSBzdG9yZWQgZW50aXJlbHkgb24taGVhcCBvciBwYXJ0aWFsbHkgb2ZmLWhlYXAsCi1kZXBlbmRpbmcgb24gYG1lbXRhYmxlX2FsbG9jYXRpb25fdHlwZWAuCi0KLT09IFNTVGFibGVzCi0KLVNTVGFibGVzIGFyZSB0aGUgaW1tdXRhYmxlIGRhdGEgZmlsZXMgdGhhdCBDYXNzYW5kcmEgdXNlcyBmb3IgcGVyc2lzdGluZwotZGF0YSBvbiBkaXNrLgotCi1BcyBTU1RhYmxlcyBhcmUgZmx1c2hlZCB0byBkaXNrIGZyb20gYG1lbXRhYmxlc2Agb3IgYXJlIHN0cmVhbWVkIGZyb20KLW90aGVyIG5vZGVzLCBDYXNzYW5kcmEgdHJpZ2dlcnMgY29tcGFjdGlvbnMgd2hpY2ggY29tYmluZSBtdWx0aXBsZQotU1NUYWJsZXMgaW50byBvbmUuIE9uY2UgdGhlIG5ldyBTU1RhYmxlIGhhcyBiZWVuIHdyaXR0ZW4sIHRoZSBvbGQKLVNTVGFibGVzIGNhbiBiZSByZW1vdmVkLgotCi1FYWNoIFNTVGFibGUgaXMgY29tcHJpc2VkIG9mIG11bHRpcGxlIGNvbXBvbmVudHMgc3RvcmVkIGluIHNlcGFyYXRlCi1maWxlczoKLQotYERhdGEuZGJgOjoKLSAgVGhlIGFjdHVhbCBkYXRhLCBpLmUuIHRoZSBjb250ZW50cyBvZiByb3dzLgotYEluZGV4LmRiYDo6Ci0gIEFuIGluZGV4IGZyb20gcGFydGl0aW9uIGtleXMgdG8gcG9zaXRpb25zIGluIHRoZSBgRGF0YS5kYmAgZmlsZS4gRm9yCi0gIHdpZGUgcGFydGl0aW9ucywgdGhpcyBtYXkgYWxzbyBpbmNsdWRlIGFuIGluZGV4IHRvIHJvd3Mgd2l0aGluIGEKLSAgcGFydGl0aW9uLgotYFN1bW1hcnkuZGJgOjoKLSAgQSBzYW1wbGluZyBvZiAoYnkgZGVmYXVsdCkgZXZlcnkgMTI4dGggZW50cnkgaW4gdGhlIGBJbmRleC5kYmAgZmlsZS4KLWBGaWx0ZXIuZGJgOjoKLSAgQSBCbG9vbSBGaWx0ZXIgb2YgdGhlIHBhcnRpdGlvbiBrZXlzIGluIHRoZSBTU1RhYmxlLgotYENvbXByZXNzaW9uSW5mby5kYmA6OgotICBNZXRhZGF0YSBhYm91dCB0aGUgb2Zmc2V0cyBhbmQgbGVuZ3RocyBvZiBjb21wcmVzc2lvbiBjaHVua3MgaW4gdGhlCi0gIGBEYXRhLmRiYCBmaWxlLgotYFN0YXRpc3RpY3MuZGJgOjoKLSAgU3RvcmVzIG1ldGFkYXRhIGFib3V0IHRoZSBTU1RhYmxlLCBpbmNsdWRpbmcgaW5mb3JtYXRpb24gYWJvdXQKLSAgdGltZXN0YW1wcywgdG9tYnN0b25lcywgY2x1c3RlcmluZyBrZXlzLCBjb21wYWN0aW9uLCByZXBhaXIsCi0gIGNvbXByZXNzaW9uLCBUVExzLCBhbmQgbW9yZS4KLWBEaWdlc3QuY3JjMzJgOjoKLSAgQSBDUkMtMzIgZGlnZXN0IG9mIHRoZSBgRGF0YS5kYmAgZmlsZS4KLWBUT0MudHh0YDo6Ci0gIEEgcGxhaW4gdGV4dCBsaXN0IG9mIHRoZSBjb21wb25lbnQgZmlsZXMgZm9yIHRoZSBTU1RhYmxlLgotCi1XaXRoaW4gdGhlIGBEYXRhLmRiYCBmaWxlLCByb3dzIGFyZSBvcmdhbml6ZWQgYnkgcGFydGl0aW9uLiBUaGVzZQotcGFydGl0aW9ucyBhcmUgc29ydGVkIGluIHRva2VuIG9yZGVyIChpLmUuIGJ5IGEgaGFzaCBvZiB0aGUgcGFydGl0aW9uCi1rZXkgd2hlbiB0aGUgZGVmYXVsdCBwYXJ0aXRpb25lciwgYE11cm11cjNQYXJ0aXRpb25gLCBpcyB1c2VkKS4gV2l0aGluIGEKLXBhcnRpdGlvbiwgcm93cyBhcmUgc3RvcmVkIGluIHRoZSBvcmRlciBvZiB0aGVpciBjbHVzdGVyaW5nIGtleXMuCi0KLVNTVGFibGVzIGNhbiBiZSBvcHRpb25hbGx5IGNvbXByZXNzZWQgdXNpbmcgYmxvY2stYmFzZWQgY29tcHJlc3Npb24uCi0KLT09IFNTVGFibGUgVmVyc2lvbnMKLQotVGhpcyBzZWN0aW9uIHdhcyBjcmVhdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcKLWh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3NoeWFtc2FsaW1rdW1hci80OWE2MWU1YmM2ZjQwM2QyMGM1NVtnaXN0XSB3aGljaAotdXRpbGl6ZWQgdGhpcyBvcmlnaW5hbAotaHR0cDovL3d3dy5iYWpiLm5ldC8yMDEzLzAzL2Nhc3NhbmRyYS1zc3RhYmxlLWZvcm1hdC12ZXJzaW9uLW51bWJlcnMvW3NvdXJjZV0uCi0KLVRoZSB2ZXJzaW9uIG51bWJlcnMsIHRvIGRhdGUgYXJlOgotCi09PT0gVmVyc2lvbiAwCi0KLSogYiAoMC43LjApOiBhZGRlZCB2ZXJzaW9uIHRvIHNzdGFibGUgZmlsZW5hbWVzCi0qIGMgKDAuNy4wKTogYmxvb20gZmlsdGVyIGNvbXBvbmVudCBjb21wdXRlcyBoYXNoZXMgb3ZlciByYXcga2V5IGJ5dGVzCi1pbnN0ZWFkIG9mIHN0cmluZ3MKLSogZCAoMC43LjApOiByb3cgc2l6ZSBpbiBkYXRhIGNvbXBvbmVudCBiZWNvbWVzIGEgbG9uZyBpbnN0ZWFkIG9mIGludAotKiBlICgwLjcuMCk6IHN0b3JlcyB1bmRlY29yYXRlZCBrZXlzIGluIGRhdGEgYW5kIGluZGV4IGNvbXBvbmVudHMKLSogZiAoMC43LjApOiBzd2l0Y2hlZCBibG9vbSBmaWx0ZXIgaW1wbGVtZW50YXRpb25zIGluIGRhdGEgY29tcG9uZW50Ci0qIGcgKDAuOCk6IHRyYWNrcyBmbHVzaGVkLWF0IGNvbnRleHQgaW4gbWV0YWRhdGEgY29tcG9uZW50Ci0KLT09PSBWZXJzaW9uIDEKLQotKiBoICgxLjApOiB0cmFja3MgbWF4IGNsaWVudCB0aW1lc3RhbXAgaW4gbWV0YWRhdGEgY29tcG9uZW50Ci0qIGhiICgxLjAuMyk6IHJlY29yZHMgY29tcHJlc3Npb24gcmF0aW9uIGluIG1ldGFkYXRhIGNvbXBvbmVudAotKiBoYyAoMS4wLjQpOiByZWNvcmRzIHBhcnRpdGlvbmVyIGluIG1ldGFkYXRhIGNvbXBvbmVudAotKiBoZCAoMS4wLjEwKTogaW5jbHVkZXMgcm93IHRvbWJzdG9uZXMgaW4gbWF4dGltZXN0YW1wCi0qIGhlICgxLjEuMyk6IGluY2x1ZGVzIGFuY2VzdG9ycyBnZW5lcmF0aW9uIGluIG1ldGFkYXRhIGNvbXBvbmVudAotKiBoZiAoMS4xLjYpOiBtYXJrZXIgdGhhdCByZXBsYXkgcG9zaXRpb24gY29ycmVzcG9uZHMgdG8gMS4xLjUrCi1taWxsaXMtYmFzZWQgaWQgKHNlZSBDQVNTQU5EUkEtNDc4MikKLSogaWEgKDEuMi4wKToKLSoqIGNvbHVtbiBpbmRleGVzIGFyZSBwcm9tb3RlZCB0byB0aGUgaW5kZXggZmlsZQotKiogcmVjb3JkcyBlc3RpbWF0ZWQgaGlzdG9ncmFtIG9mIGRlbGV0aW9uIHRpbWVzIGluIHRvbWJzdG9uZXMKLSoqIGJsb29tIGZpbHRlciAoa2V5cyBhbmQgY29sdW1ucykgdXBncmFkZWQgdG8gTXVybXVyMwotKiBpYiAoMS4yLjEpOiB0cmFja3MgbWluIGNsaWVudCB0aW1lc3RhbXAgaW4gbWV0YWRhdGEgY29tcG9uZW50Ci0qIGljICgxLjIuNSk6IG9taXRzIHBlci1yb3cgYmxvb20gZmlsdGVyIG9mIGNvbHVtbiBuYW1lcwotCi09PT0gVmVyc2lvbiAyCi0KLSogamEgKDIuMC4wKToKLSoqIHN1cGVyIGNvbHVtbnMgYXJlIHNlcmlhbGl6ZWQgYXMgY29tcG9zaXRlcyAobm90ZSB0aGF0IHRoZXJlIGlzIG5vCi1yZWFsIGZvcm1hdCBjaGFuZ2UsIHRoaXMgaXMgbW9zdGx5IGEgbWFya2VyIHRvIGtub3cgaWYgd2Ugc2hvdWxkIGV4cGVjdAotc3VwZXIgY29sdW1ucyBvciBub3QuIFdlIGRvIG5lZWQgYSBtYWpvciB2ZXJzaW9uIGJ1bXAgaG93ZXZlciwgYmVjYXVzZQotd2Ugc2hvdWxkIG5vdCBhbGxvdyBzdHJlYW1pbmcgb2Ygc3VwZXIgY29sdW1ucyBpbnRvIHRoaXMgbmV3IGZvcm1hdCkKLSoqIHRyYWNrcyBtYXggbG9jYWwgZGVsZXRpb250aW1lIGluIHNzdGFibGUgbWV0YWRhdGEKLSoqIHJlY29yZHMgYmxvb21fZmlsdGVyX2ZwX2NoYW5jZSBpbiBtZXRhZGF0YSBjb21wb25lbnQKLSoqIHJlbW92ZSBkYXRhIHNpemUgYW5kIGNvbHVtbiBjb3VudCBmcm9tIGRhdGEgZmlsZSAoQ0FTU0FORFJBLTQxODApCi0qKiB0cmFja3MgbWF4L21pbiBjb2x1bW4gdmFsdWVzIChhY2NvcmRpbmcgdG8gY29tcGFyYXRvcikKLSogamIgKDIuMC4xKToKLSoqIHN3aXRjaCBmcm9tIGNyYzMyIHRvIGFkbGVyMzIgZm9yIGNvbXByZXNzaW9uIGNoZWNrc3VtcwotKiogY2hlY2tzdW0gdGhlIGNvbXByZXNzZWQgZGF0YQotKiBrYSAoMi4xLjApOgotKiogbmV3IFN0YXRpc3RpY3MuZGIgZmlsZSBmb3JtYXQKLSoqIGluZGV4IHN1bW1hcmllcyBjYW4gYmUgZG93bnNhbXBsZWQgYW5kIHRoZSBzYW1wbGluZyBsZXZlbCBpcwotcGVyc2lzdGVkCi0qKiBzd2l0Y2ggdW5jb21wcmVzc2VkIGNoZWNrc3VtcyB0byBhZGxlcjMyCi0qKiB0cmFja3MgcHJlc2Vuc2Ugb2YgbGVnYWN5IChsb2NhbCBhbmQgcmVtb3RlKSBjb3VudGVyIHNoYXJkcwotKiBsYSAoMi4yLjApOiBuZXcgZmlsZSBuYW1lIGZvcm1hdAotKiBsYiAoMi4yLjcpOiBjb21taXQgbG9nIGxvd2VyIGJvdW5kIGluY2x1ZGVkCi0KLT09PSBWZXJzaW9uIDMKLQotKiBtYSAoMy4wLjApOgotKiogc3dhcCBiZiBoYXNoIG9yZGVyCi0qKiBzdG9yZSByb3dzIG5hdGl2ZWx5Ci0qIG1iICgzLjAuNywgMy43KTogY29tbWl0IGxvZyBsb3dlciBib3VuZCBpbmNsdWRlZAotKiBtYyAoMy4wLjgsIDMuOSk6IGNvbW1pdCBsb2cgaW50ZXJ2YWxzIGluY2x1ZGVkCi0KLT09PSBFeGFtcGxlIENvZGUKLQotVGhlIGZvbGxvd2luZyBleGFtcGxlIGlzIHVzZWZ1bCBmb3IgZmluZGluZyBhbGwgc3N0YWJsZXMgdGhhdCBkbyBub3QKLW1hdGNoIHRoZSAiaWIiIFNTVGFibGUgdmVyc2lvbgotCi1bc291cmNlLGJhc2hdCi0tLS0tCi1pbmNsdWRlOmV4YW1wbGUkZmluZF9zc3RhYmxlcy5zaFtdCi0tLS0tCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY29uZmlndXJhdGlvbi9jYXNzX2xvZ2JhY2tfeG1sX2ZpbGUuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jb25maWd1cmF0aW9uL2Nhc3NfbG9nYmFja194bWxfZmlsZS5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjczNjIyLi4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jb25maWd1cmF0aW9uL2Nhc3NfbG9nYmFja194bWxfZmlsZS5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLT0gbG9nYmFjay54bWwgZmlsZQotCi1UaGUgYGxvZ2JhY2sueG1sYCBjb25maWd1cmF0aW9uIGZpbGUgY2FuIG9wdGlvbmFsbHkgc2V0IGxvZ2dpbmcgbGV2ZWxzCi1mb3IgdGhlIGxvZ3Mgd3JpdHRlbiB0byBgc3lzdGVtLmxvZ2AgYW5kIGBkZWJ1Zy5sb2dgLiBUaGUgbG9nZ2luZyBsZXZlbHMKLWNhbiBhbHNvIGJlIHNldCB1c2luZyBgbm9kZXRvb2wgc2V0bG9nZ2luZ2xldmVsc2AuCi0KLT09IE9wdGlvbnMKLQotPT09IGBhcHBlbmRlciBuYW1lPSI8YXBwZW5kZXJfY2hvaWNlPiIuLi48L2FwcGVuZGVyPmAgCi0KLVNwZWNpZnkgbG9nIHR5cGUgYW5kIHNldHRpbmdzLiBQb3NzaWJsZSBhcHBlbmRlciBuYW1lcyBhcmU6IGBTWVNURU1MT0dgLAotYERFQlVHTE9HYCwgYEFTWU5DREVCVUdMT0dgLCBhbmQgYFNURE9VVGAuIGBTWVNURU1MT0dgIGVuc3VyZXMgdGhhdCBXQVJOCi1hbmQgRVJST1IgbWVzc2FnZSBhcmUgd3JpdHRlbiBzeW5jaHJvbm91c2x5IHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4KLWBERUJVR0xPR2AgYW5kIGBBU1lOQ0RFQlVHTE9HYCBlbnN1cmUgdGhhdCBERUJVRyBtZXNzYWdlcyBhcmUgd3JpdHRlbgotZWl0aGVyIHN5bmNocm9ub3VzbHkgb3IgYXN5bmNocm9ub3VzbHksIHJlc3BlY3RpdmVseSwgdG8gdGhlIHNwZWNpZmllZAotZmlsZS4gYFNURE9VVGAgd3JpdGVzIGFsbCBtZXNzYWdlcyB0byB0aGUgY29uc29sZSBpbiBhIGh1bWFuLXJlYWRhYmxlCi1mb3JtYXQuCi0KLSpFeGFtcGxlOiogPGFwcGVuZGVyIG5hbWU9IlNZU1RFTUxPRyIKLWNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLnJvbGxpbmcuUm9sbGluZ0ZpbGVBcHBlbmRlciI+Ci0KLT09PSBgPGZpbGU+IDxmaWxlbmFtZT4gPC9maWxlPmAgCi0KLVNwZWNpZnkgdGhlIGZpbGVuYW1lIGZvciBhIGxvZy4KLQotKkV4YW1wbGU6KiA8ZmlsZT4kXHtjYXNzYW5kcmEubG9nZGlyfS9zeXN0ZW0ubG9nPC9maWxlPgotCi09PT0gYDxsZXZlbD4gPGxvZ19sZXZlbD4gPC9sZXZlbD5gCi0KLVNwZWNpZnkgdGhlIGxldmVsIGZvciBhIGxvZy4gUGFydCBvZiB0aGUgZmlsdGVyLiBMZXZlbHMgYXJlOiBgQUxMYCwKLWBUUkFDRWAsIGBERUJVR2AsIGBJTkZPYCwgYFdBUk5gLCBgRVJST1JgLCBgT0ZGYC4gYFRSQUNFYCBjcmVhdGVzIHRoZQotbW9zdCB2ZXJib3NlIGxvZywgYEVSUk9SYCB0aGUgbGVhc3QuCi0KLVtOT1RFXQotLk5vdGUKLT09PT0KLU5vdGU6IEluY3JlYXNpbmcgbG9nZ2luZyBsZXZlbHMgY2FuIGdlbmVyYXRlIGhlYXZ5IGxvZ2dpbmcgb3V0cHV0IG9uCi1hIG1vZGVyYXRlbHkgdHJhZmZpY2tlZCBjbHVzdGVyLiBZb3UgY2FuIHVzZSB0aGUKLWBub2RldG9vbCBnZXRsb2dnaW5nbGV2ZWxzYCBjb21tYW5kIHRvIHNlZSB0aGUgY3VycmVudCBsb2dnaW5nCi1jb25maWd1cmF0aW9uLgotPT09PQotCi0qRGVmYXVsdDoqIElORk8KLQotKkV4YW1wbGU6KiA8bGV2ZWw+SU5GTzwvbGV2ZWw+Ci0KLT09PSBgPHJvbGxpbmdQb2xpY3kgY2xhc3M9Ijxyb2xsaW5nX3BvbGljeV9jaG9pY2U+IiA8ZmlsZU5hbWVQYXR0ZXJuPjxwYXR0ZXJuX2luZm8+PC9maWxlTmFtZVBhdHRlcm4+IC4uLiA8L3JvbGxpbmdQb2xpY3k+YAotCi1TcGVjaWZ5IHRoZSBwb2xpY3kgZm9yIHJvbGxpbmcgbG9ncyBvdmVyIHRvIGFuIGFyY2hpdmUuCi0KLSpFeGFtcGxlOiogPHJvbGxpbmdQb2xpY3kKLWNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLnJvbGxpbmcuU2l6ZUFuZFRpbWVCYXNlZFJvbGxpbmdQb2xpY3kiPgotCi09PT0gYDxmaWxlTmFtZVBhdHRlcm4+IDxwYXR0ZXJuX2luZm8+IDwvZmlsZU5hbWVQYXR0ZXJuPmAKLQotU3BlY2lmeSB0aGUgcGF0dGVybiBpbmZvcm1hdGlvbiBmb3Igcm9sbGluZyBvdmVyIHRoZSBsb2cgdG8gYXJjaGl2ZS4KLVBhcnQgb2YgdGhlIHJvbGxpbmcgcG9saWN5LgotCi0qRXhhbXBsZToqCi08ZmlsZU5hbWVQYXR0ZXJuPiRce2Nhc3NhbmRyYS5sb2dkaXJ9L3N5c3RlbS5sb2cuJWRce3l5eXktTU0tZGR9LiVpLnppcDwvZmlsZU5hbWVQYXR0ZXJuPgotCi09PT0gYDxtYXhGaWxlU2l6ZT4gPHNpemU+IDwvbWF4RmlsZVNpemU+YAotCi1TcGVjaWZ5IHRoZSBtYXhpbXVtIGZpbGUgc2l6ZSB0byB0cmlnZ2VyIHJvbGxpbmcgYSBsb2cuIFBhcnQgb2YgdGhlCi1yb2xsaW5nIHBvbGljeS4KLQotKkV4YW1wbGU6KiA8bWF4RmlsZVNpemU+NTBNQjwvbWF4RmlsZVNpemU+Ci0KLT09PSBgPG1heEhpc3Rvcnk+IDxudW1iZXJfb2ZfZGF5cz4gPC9tYXhIaXN0b3J5PmAKLQotU3BlY2lmeSB0aGUgbWF4aW11bSBoaXN0b3J5IGluIGRheXMgdG8gdHJpZ2dlciByb2xsaW5nIGEgbG9nLiBQYXJ0IG9mCi10aGUgcm9sbGluZyBwb2xpY3kuCi0KLSpFeGFtcGxlOiogPG1heEhpc3Rvcnk+NzwvbWF4SGlzdG9yeT4KLQotPT09IGA8ZW5jb2Rlcj4gPHBhdHRlcm4+Li4uPC9wYXR0ZXJuPiA8L2VuY29kZXI+YAotCi1TcGVjaWZ5IHRoZSBmb3JtYXQgb2YgdGhlIG1lc3NhZ2UuIFBhcnQgb2YgdGhlIHJvbGxpbmcgcG9saWN5LgotCi0qRXhhbXBsZToqIDxtYXhIaXN0b3J5Pjc8L21heEhpc3Rvcnk+ICpFeGFtcGxlOiogPGVuY29kZXI+Ci08cGF0dGVybj4lLTVsZXZlbCBbJXRocmVhZF0gJWRhdGVce0lTTzg2MDF9ICVGOiVMIC0gJW1zZyVuPC9wYXR0ZXJuPgotPC9lbmNvZGVyPgotCi09PT0gQ29udGVudHMgb2YgZGVmYXVsdCBgbG9nYmFjay54bWxgCi0KLVtzb3VyY2UsWE1MXQotLS0tLQotPGNvbmZpZ3VyYXRpb24gc2Nhbj0idHJ1ZSIgc2NhblBlcmlvZD0iNjAgc2Vjb25kcyI+Ci0gIDxqbXhDb25maWd1cmF0b3IgLz4KLQotICA8IS0tIE5vIHNodXRkb3duIGhvb2s7IHdlIHJ1biBpdCBvdXJzZWx2ZXMgaW4gU3RvcmFnZVNlcnZpY2UgYWZ0ZXIgc2h1dGRvd24gLS0+Ci0KLSAgPCEtLSBTWVNURU1MT0cgcm9sbGluZyBmaWxlIGFwcGVuZGVyIHRvIHN5c3RlbS5sb2cgKElORk8gbGV2ZWwpIC0tPgotCi0gIDxhcHBlbmRlciBuYW1lPSJTWVNURU1MT0ciIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLnJvbGxpbmcuUm9sbGluZ0ZpbGVBcHBlbmRlciI+Ci0gICAgPGZpbHRlciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5maWx0ZXIuVGhyZXNob2xkRmlsdGVyIj4KLSAgPGxldmVsPklORk88L2xldmVsPgotICAgIDwvZmlsdGVyPgotICAgIDxmaWxlPiR7Y2Fzc2FuZHJhLmxvZ2Rpcn0vc3lzdGVtLmxvZzwvZmlsZT4KLSAgICA8cm9sbGluZ1BvbGljeSBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLlNpemVBbmRUaW1lQmFzZWRSb2xsaW5nUG9saWN5Ij4KLSAgICAgIDwhLS0gcm9sbG92ZXIgZGFpbHkgLS0+Ci0gICAgICA8ZmlsZU5hbWVQYXR0ZXJuPiR7Y2Fzc2FuZHJhLmxvZ2Rpcn0vc3lzdGVtLmxvZy4lZHt5eXl5LU1NLWRkfS4laS56aXA8L2ZpbGVOYW1lUGF0dGVybj4KLSAgICAgIDwhLS0gZWFjaCBmaWxlIHNob3VsZCBiZSBhdCBtb3N0IDUwTUIsIGtlZXAgNyBkYXlzIHdvcnRoIG9mIGhpc3RvcnksIGJ1dCBhdCBtb3N0IDVHQiAtLT4KLSAgICAgIDxtYXhGaWxlU2l6ZT41ME1CPC9tYXhGaWxlU2l6ZT4KLSAgICAgIDxtYXhIaXN0b3J5Pjc8L21heEhpc3Rvcnk+Ci0gICAgICA8dG90YWxTaXplQ2FwPjVHQjwvdG90YWxTaXplQ2FwPgotICAgIDwvcm9sbGluZ1BvbGljeT4KLSAgICA8ZW5jb2Rlcj4KLSAgICAgIDxwYXR0ZXJuPiUtNWxldmVsIFsldGhyZWFkXSAlZGF0ZXtJU084NjAxfSAlRjolTCAtICVtc2clbjwvcGF0dGVybj4KLSAgICA8L2VuY29kZXI+Ci0gIDwvYXBwZW5kZXI+Ci0KLSAgPCEtLSBERUJVR0xPRyByb2xsaW5nIGZpbGUgYXBwZW5kZXIgdG8gZGVidWcubG9nIChhbGwgbGV2ZWxzKSAtLT4KLQotICA8YXBwZW5kZXIgbmFtZT0iREVCVUdMT0ciIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLnJvbGxpbmcuUm9sbGluZ0ZpbGVBcHBlbmRlciI+Ci0gICAgPGZpbGU+JHtjYXNzYW5kcmEubG9nZGlyfS9kZWJ1Zy5sb2c8L2ZpbGU+Ci0gICAgPHJvbGxpbmdQb2xpY3kgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5TaXplQW5kVGltZUJhc2VkUm9sbGluZ1BvbGljeSI+Ci0gICAgICA8IS0tIHJvbGxvdmVyIGRhaWx5IC0tPgotICAgICAgPGZpbGVOYW1lUGF0dGVybj4ke2Nhc3NhbmRyYS5sb2dkaXJ9L2RlYnVnLmxvZy4lZHt5eXl5LU1NLWRkfS4laS56aXA8L2ZpbGVOYW1lUGF0dGVybj4KLSAgICAgIDwhLS0gZWFjaCBmaWxlIHNob3VsZCBiZSBhdCBtb3N0IDUwTUIsIGtlZXAgNyBkYXlzIHdvcnRoIG9mIGhpc3RvcnksIGJ1dCBhdCBtb3N0IDVHQiAtLT4KLSAgICAgIDxtYXhGaWxlU2l6ZT41ME1CPC9tYXhGaWxlU2l6ZT4KLSAgICAgIDxtYXhIaXN0b3J5Pjc8L21heEhpc3Rvcnk+Ci0gICAgICA8dG90YWxTaXplQ2FwPjVHQjwvdG90YWxTaXplQ2FwPgotICAgIDwvcm9sbGluZ1BvbGljeT4KLSAgICA8ZW5jb2Rlcj4KLSAgICAgIDxwYXR0ZXJuPiUtNWxldmVsIFsldGhyZWFkXSAlZGF0ZXtJU084NjAxfSAlRjolTCAtICVtc2clbjwvcGF0dGVybj4KLSAgICA8L2VuY29kZXI+Ci0gIDwvYXBwZW5kZXI+Ci0KLSAgPCEtLSBBU1lOQ0xPRyBhc3N5bmNocm9ub3VzIGFwcGVuZGVyIHRvIGRlYnVnLmxvZyAoYWxsIGxldmVscykgLS0+Ci0KLSAgPGFwcGVuZGVyIG5hbWU9IkFTWU5DREVCVUdMT0ciIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLkFzeW5jQXBwZW5kZXIiPgotICAgIDxxdWV1ZVNpemU+MTAyNDwvcXVldWVTaXplPgotICAgIDxkaXNjYXJkaW5nVGhyZXNob2xkPjA8L2Rpc2NhcmRpbmdUaHJlc2hvbGQ+Ci0gICAgPGluY2x1ZGVDYWxsZXJEYXRhPnRydWU8L2luY2x1ZGVDYWxsZXJEYXRhPgotICAgIDxhcHBlbmRlci1yZWYgcmVmPSJERUJVR0xPRyIgLz4KLSAgPC9hcHBlbmRlcj4KLQotICA8IS0tIFNURE9VVCBjb25zb2xlIGFwcGVuZGVyIHRvIHN0ZG91dCAoSU5GTyBsZXZlbCkgLS0+Ci0KLSAgPGFwcGVuZGVyIG5hbWU9IlNURE9VVCIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUuQ29uc29sZUFwcGVuZGVyIj4KLSAgICA8ZmlsdGVyIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLmZpbHRlci5UaHJlc2hvbGRGaWx0ZXIiPgotICAgICAgPGxldmVsPklORk88L2xldmVsPgotICAgIDwvZmlsdGVyPgotICAgIDxlbmNvZGVyPgotICAgICAgPHBhdHRlcm4+JS01bGV2ZWwgWyV0aHJlYWRdICVkYXRle0lTTzg2MDF9ICVGOiVMIC0gJW1zZyVuPC9wYXR0ZXJuPgotICAgIDwvZW5jb2Rlcj4KLSAgPC9hcHBlbmRlcj4KLQotICA8IS0tIFVuY29tbWVudCBiZWxsb3cgYW5kIGNvcnJlc3BvbmRpbmcgYXBwZW5kZXItcmVmIHRvIGFjdGl2YXRlIGxvZ2JhY2sgbWV0cmljcwotICA8YXBwZW5kZXIgbmFtZT0iTG9nYmFja01ldHJpY3MiIGNsYXNzPSJjb20uY29kYWhhbGUubWV0cmljcy5sb2diYWNrLkluc3RydW1lbnRlZEFwcGVuZGVyIiAvPgotICAgLS0+Ci0KLSAgPHJvb3QgbGV2ZWw9IklORk8iPgotICAgIDxhcHBlbmRlci1yZWYgcmVmPSJTWVNURU1MT0ciIC8+Ci0gICAgPGFwcGVuZGVyLXJlZiByZWY9IlNURE9VVCIgLz4KLSAgICA8YXBwZW5kZXItcmVmIHJlZj0iQVNZTkNERUJVR0xPRyIgLz4gPCEtLSBDb21tZW50IHRoaXMgbGluZSB0byBkaXNhYmxlIGRlYnVnLmxvZyAtLT4KLSAgICA8IS0tCi0gICAgPGFwcGVuZGVyLXJlZiByZWY9IkxvZ2JhY2tNZXRyaWNzIiAvPgotICAgIC0tPgotICA8L3Jvb3Q+Ci0KLSAgPGxvZ2dlciBuYW1lPSJvcmcuYXBhY2hlLmNhc3NhbmRyYSIgbGV2ZWw9IkRFQlVHIi8+Ci0gIDxsb2dnZXIgbmFtZT0iY29tLnRoaW5rYXVyZWxpdXMudGhyaWZ0IiBsZXZlbD0iRVJST1IiLz4KLTwvY29uZmlndXJhdGlvbj4KLS0tLS0KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvYXBwZW5kaWNlcy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9hcHBlbmRpY2VzLmFkb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMTcyNjYuLjAwMDAwMDAKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9hcHBlbmRpY2VzLmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotPSBBcHBlbmRpY2VzCi0KLVtbYXBwZW5kaXgtQV1dCi09PSBBcHBlbmRpeCBBOiBDUUwgS2V5d29yZHMKLQotQ1FMIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBfcmVzZXJ2ZWRfIGFuZCBfbm9uLXJlc2VydmVkXyBrZXl3b3Jkcy4KLVJlc2VydmVkIGtleXdvcmRzIGNhbm5vdCBiZSB1c2VkIGFzIGlkZW50aWZpZXIsIHRoZXkgYXJlIHRydWx5IHJlc2VydmVkCi1mb3IgdGhlIGxhbmd1YWdlIChidXQgb25lIGNhbiBlbmNsb3NlIGEgcmVzZXJ2ZWQga2V5d29yZCBieQotZG91YmxlLXF1b3RlcyB0byB1c2UgaXQgYXMgYW4gaWRlbnRpZmllcikuIE5vbi1yZXNlcnZlZCBrZXl3b3JkcyBob3dldmVyCi1vbmx5IGhhdmUgYSBzcGVjaWZpYyBtZWFuaW5nIGluIGNlcnRhaW4gY29udGV4dCBidXQgY2FuIHVzZWQgYXMKLWlkZW50aWZpZXIgb3RoZXJ3aXNlLiBUaGUgb25seSBfcmFpc29uIGTigJnDqnRyZV8gb2YgdGhlc2Ugbm9uLXJlc2VydmVkCi1rZXl3b3JkcyBpcyBjb252ZW5pZW5jZTogc29tZSBrZXl3b3JkIGFyZSBub24tcmVzZXJ2ZWQgd2hlbiBpdCB3YXMKLWFsd2F5cyBlYXN5IGZvciB0aGUgcGFyc2VyIHRvIGRlY2lkZSB3aGV0aGVyIHRoZXkgd2VyZSB1c2VkIGFzIGtleXdvcmRzCi1vciBub3QuCi0KLVt3aWR0aD0iNDglIixjb2xzPSI2MCUsNDAlIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxLZXl3b3JkIHxSZXNlcnZlZD8KLXxgQUREYCB8eWVzCi18YEFHR1JFR0FURWAgfG5vCi18YEFMTGAgfG5vCi18YEFMTE9XYCB8eWVzCi18YEFMVEVSYCB8eWVzCi18YEFORGAgfHllcwotfGBBUFBMWWAgfHllcwotfGBBU2AgfG5vCi18YEFTQ2AgfHllcwotfGBBU0NJSWAgfG5vCi18YEFVVEhPUklaRWAgfHllcwotfGBCQVRDSGAgfHllcwotfGBCRUdJTmAgfHllcwotfGBCSUdJTlRgIHxubwotfGBCTE9CYCB8bm8KLXxgQk9PTEVBTmAgfG5vCi18YEJZYCB8eWVzCi18YENBTExFRGAgfG5vCi18YENMVVNURVJJTkdgIHxubwotfGBDT0xVTU5GQU1JTFlgIHx5ZXMKLXxgQ09NUEFDVGAgfG5vCi18YENPTlRBSU5TYCB8bm8KLXxgQ09VTlRgIHxubwotfGBDT1VOVEVSYCB8bm8KLXxgQ1JFQVRFYCB8eWVzCi18YENVU1RPTWAgfG5vCi18YERBVEVgIHxubwotfGBERUNJTUFMYCB8bm8KLXxgREVMRVRFYCB8eWVzCi18YERFU0NgIHx5ZXMKLXxgREVTQ1JJQkVgIHx5ZXMKLXxgRElTVElOQ1RgIHxubwotfGBET1VCTEVgIHxubwotfGBEUk9QYCB8eWVzCi18YEVOVFJJRVNgIHx5ZXMKLXxgRVhFQ1VURWAgfHllcwotfGBFWElTVFNgIHxubwotfGBGSUxURVJJTkdgIHxubwotfGBGSU5BTEZVTkNgIHxubwotfGBGTE9BVGAgfG5vCi18YEZST01gIHx5ZXMKLXxgRlJPWkVOYCB8bm8KLXxgRlVMTGAgfHllcwotfGBGVU5DVElPTmAgfG5vCi18YEZVTkNUSU9OU2AgfG5vCi18YEdSQU5UYCB8eWVzCi18YElGYCB8eWVzCi18YElOYCB8eWVzCi18YElOREVYYCB8eWVzCi18YElORVRgIHxubwotfGBJTkZJTklUWWAgfHllcwotfGBJTklUQ09ORGAgfG5vCi18YElOUFVUYCB8bm8KLXxgSU5TRVJUYCB8eWVzCi18YElOVGAgfG5vCi18YElOVE9gIHx5ZXMKLXxgSlNPTmAgfG5vCi18YEtFWWAgfG5vCi18YEtFWVNgIHxubwotfGBLRVlTUEFDRWAgfHllcwotfGBLRVlTUEFDRVNgIHxubwotfGBMQU5HVUFHRWAgfG5vCi18YExJTUlUYCB8eWVzCi18YExJU1RgIHxubwotfGBMT0dJTmAgfG5vCi18YE1BUGAgfG5vCi18YE1PRElGWWAgfHllcwotfGBOQU5gIHx5ZXMKLXxgTk9MT0dJTmAgfG5vCi18YE5PUkVDVVJTSVZFYCB8eWVzCi18YE5PU1VQRVJVU0VSYCB8bm8KLXxgTk9UYCB8eWVzCi18YE5VTExgIHx5ZXMKLXxgT0ZgIHx5ZXMKLXxgT05gIHx5ZXMKLXxgT1BUSU9OU2AgfG5vCi18YE9SYCB8eWVzCi18YE9SREVSYCB8eWVzCi18YFBBU1NXT1JEYCB8bm8KLXxgUEVSTUlTU0lPTmAgfG5vCi18YFBFUk1JU1NJT05TYCB8bm8KLXxgUFJJTUFSWWAgfHllcwotfGBSRU5BTUVgIHx5ZXMKLXxgUkVQTEFDRWAgfHllcwotfGBSRVRVUk5TYCB8bm8KLXxgUkVWT0tFYCB8eWVzCi18YFJPTEVgIHxubwotfGBST0xFU2AgfG5vCi18YFNDSEVNQWAgfHllcwotfGBTRUxFQ1RgIHx5ZXMKLXxgU0VUYCB8eWVzCi18YFNGVU5DYCB8bm8KLXxgU01BTExJTlRgIHxubwotfGBTVEFUSUNgIHxubwotfGBTVE9SQUdFYCB8bm8KLXxgU1RZUEVgIHxubwotfGBTVVBFUlVTRVJgIHxubwotfGBUQUJMRWAgfHllcwotfGBURVhUYCB8bm8KLXxgVElNRWAgfG5vCi18YFRJTUVTVEFNUGAgfG5vCi18YFRJTUVVVUlEYCB8bm8KLXxgVElOWUlOVGAgfG5vCi18YFRPYCB8eWVzCi18YFRPS0VOYCB8eWVzCi18YFRSSUdHRVJgIHxubwotfGBUUlVOQ0FURWAgfHllcwotfGBUVExgIHxubwotfGBUVVBMRWAgfG5vCi18YFRZUEVgIHxubwotfGBVTkxPR0dFRGAgfHllcwotfGBVUERBVEVgIHx5ZXMKLXxgVVNFYCB8eWVzCi18YFVTRVJgIHxubwotfGBVU0VSU2AgfG5vCi18YFVTSU5HYCB8eWVzCi18YFVVSURgIHxubwotfGBWQUxVRVNgIHxubwotfGBWQVJDSEFSYCB8bm8KLXxgVkFSSU5UYCB8bm8KLXxgV0hFUkVgIHx5ZXMKLXxgV0lUSGAgfHllcwotfGBXUklURVRJTUVgIHxubwotfD09PQotCi09PSBBcHBlbmRpeCBCOiBDUUwgUmVzZXJ2ZWQgVHlwZXMKLQotVGhlIGZvbGxvd2luZyB0eXBlIG5hbWVzIGFyZSBub3QgY3VycmVudGx5IHVzZWQgYnkgQ1FMLCBidXQgYXJlIHJlc2VydmVkCi1mb3IgcG90ZW50aWFsIGZ1dHVyZSB1c2UuIFVzZXItZGVmaW5lZCB0eXBlcyBtYXkgbm90IHVzZSByZXNlcnZlZCB0eXBlCi1uYW1lcyBhcyB0aGVpciBuYW1lLgotCi1bd2lkdGg9IjI1JSIsY29scz0iMTAwJSIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18dHlwZQotfGBiaXRzdHJpbmdgCi18YGJ5dGVgCi18YGNvbXBsZXhgCi18YGVudW1gCi18YGludGVydmFsYAotfGBtYWNhZGRyYAotfD09PQotCi09PSBBcHBlbmRpeCBDOiBEcm9wcGluZyBDb21wYWN0IFN0b3JhZ2UKLQotU3RhcnRpbmcgdmVyc2lvbiA0LjAsIFRocmlmdCBhbmQgQ09NUEFDVCBTVE9SQUdFIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuCi0KLWBBTFRFUiAuLi4gRFJPUCBDT01QQUNUIFNUT1JBR0VgIHN0YXRlbWVudCBtYWtlcyBDb21wYWN0IFRhYmxlcwotQ1FMLWNvbXBhdGlibGUsIGV4cG9zaW5nIGludGVybmFsIHN0cnVjdHVyZSBvZiBUaHJpZnQvQ29tcGFjdCBUYWJsZXM6Ci0KLSogQ1FMLWNyZWF0ZWQgQ29tcGFjdCBUYWJsZXMgdGhhdCBoYXZlIG5vIGNsdXN0ZXJpbmcgY29sdW1ucywgd2lsbAotZXhwb3NlIGFuIGFkZGl0aW9uYWwgY2x1c3RlcmluZyBjb2x1bW4gYGNvbHVtbjFgIHdpdGggYFVURjhUeXBlYC4KLSogQ1FMLWNyZWF0ZWQgQ29tcGFjdCBUYWJsZXMgdGhhdCBoYWQgbm8gcmVndWxhciBjb2x1bW5zLCB3aWxsIGV4cG9zZSBhCi1yZWd1bGFyIGNvbHVtbiBgdmFsdWVgIHdpdGggYEJ5dGVzVHlwZWAuCi0qIEZvciBDUUwtQ3JlYXRlZCBDb21wYWN0IFRhYmxlcywgYWxsIGNvbHVtbnMgb3JpZ2luYWxseSBkZWZpbmVkIGFzCi1gcmVndWxhcmAgd2lsbCBiZSBjb21lIGBzdGF0aWNgCi0qIENRTC1jcmVhdGVkIENvbXBhY3QgVGFibGVzIHRoYXQgaGF2ZSBjbHVzdGVyaW5nIGJ1dCBoYXZlIG5vIHJlZ3VsYXIKLWNvbHVtbnMgd2lsbCBoYXZlIGFuIGVtcHR5IHZhbHVlIGNvbHVtbiAob2YgYEVtcHR5VHlwZWApCi0qIFN1cGVyQ29sdW1uIFRhYmxlcyAoY2FuIG9ubHkgYmUgY3JlYXRlZCB0aHJvdWdoIFRocmlmdCkgd2lsbCBleHBvc2UgYQotY29tcGFjdCB2YWx1ZSBtYXAgd2l0aCBhbiBlbXB0eSBuYW1lLgotKiBUaHJpZnQtY3JlYXRlZCBDb21wYWN0IFRhYmxlcyB3aWxsIGhhdmUgdHlwZXMgY29ycmVzcG9uZGluZyB0byB0aGVpcgotVGhyaWZ0IGRlZmluaXRpb24uCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL2NoYW5nZXMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvY2hhbmdlcy5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjk5YTM5Li4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvY2hhbmdlcy5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLT0gQ2hhbmdlcwotCi1UaGUgZm9sbG93aW5nIGRlc2NyaWJlcyB0aGUgY2hhbmdlcyBpbiBlYWNoIHZlcnNpb24gb2YgQ1FMLgotCi09PSAzLjQuNgotCi0qIEFkZCBzdXBwb3J0IGZvciBJRiBFWElTVFMgYW5kIElGIE5PVCBFWElTVFMgaW4gQUxURVIgc3RhdGVtZW50cyAgKGAxNjkxNmApCi0qIEFsbG93IEdSQU5UL1JFVk9LRSBtdWx0aXBsZSBwZXJtaXNzaW9ucyBpbiBhIHNpbmdsZSBzdGF0ZW1lbnQgKGAxNzAzMGApCi0qIFByZSBoYXNoZWQgcGFzc3dvcmRzIGluIENRTCAoYDE3MzM0YCkKLSogQWRkIHN1cHBvcnQgZm9yIHR5cGUgY2FzdGluZyBpbiBXSEVSRSBjbGF1c2UgY29tcG9uZW50cyBhbmQgaW4gdGhlIHZhbHVlcyBvZiBJTlNFUlQvVVBEQVRFIHN0YXRlbWVudHMgKGAxNDMzN2ApCi0qIEFkZCBzdXBwb3J0IGZvciBDT05UQUlOUyBhbmQgQ09OVEFJTlMgS0VZIGluIGNvbmRpdGlvbmFsIFVQREFURSBhbmQgREVMRVRFIHN0YXRlbWVudCAoYDEwNTM3YCkKLSogQWxsb3cgdG8gZ3JhbnQgcGVybWlzc2lvbiBmb3IgYWxsIHRhYmxlcyBpbiBhIGtleXNwYWNlIChgMTcwMjdgKQotKiBBbGxvdyB0byBhZ2dyZWdhdGUgYnkgdGltZSBpbnRlcnZhbHMgKGAxMTg3MWApCi0KLT09IDMuNC41Ci0KLSogQWRkcyBzdXBwb3J0IGZvciBhcml0aG1ldGljIG9wZXJhdG9ycyAoYDExOTM1YCkKLSogQWRkcyBzdXBwb3J0IGZvciBgK2AgYW5kIGAtYCBvcGVyYXRpb25zIG9uIGRhdGVzIChgMTE5MzZgKQotKiBBZGRzIGBjdXJyZW50VGltZXN0YW1wYCwgYGN1cnJlbnREYXRlYCwgYGN1cnJlbnRUaW1lYCBhbmQKLWBjdXJyZW50VGltZVVVSURgIGZ1bmN0aW9ucyAoYDEzMTMyYCkKLQotPT0gMy40LjQKLQotKiBgQUxURVIgVEFCTEVgIGBBTFRFUmAgaGFzIGJlZW4gcmVtb3ZlZDsgYSBjb2x1bW4ncyB0eXBlIG1heSBub3QgYmUKLWNoYW5nZWQgYWZ0ZXIgY3JlYXRpb24gKGAxMjQ0M2ApLgotKiBgQUxURVIgVFlQRWAgYEFMVEVSYCBoYXMgYmVlbiByZW1vdmVkOyBhIGZpZWxkJ3MgdHlwZSBtYXkgbm90IGJlCi1jaGFuZ2VkIGFmdGVyIGNyZWF0aW9uIChgMTI0NDNgKS4KLQotPT0gMy40LjMKLQotKiBBZGRzIGEgbmV3IGBkdXJhdGlvbmAgYGRhdGEgdHlwZXMgPGRhdGEtdHlwZXM+YCAoYDExODczYCkuCi0qIFN1cHBvcnQgZm9yIGBHUk9VUCBCWWAgKGAxMDcwN2ApLgotKiBBZGRzIGEgYERFRkFVTFQgVU5TRVRgIG9wdGlvbiBmb3IgYElOU0VSVCBKU09OYCB0byBpZ25vcmUgb21pdHRlZAotY29sdW1ucyAoYDExNDI0YCkuCi0qIEFsbG93cyBgbnVsbGAgYXMgYSBsZWdhbCB2YWx1ZSBmb3IgVFRMIG9uIGluc2VydCBhbmQgdXBkYXRlLiBJdCB3aWxsCi1iZSB0cmVhdGVkIGFzIGVxdWl2YWxlbnQgdG8gaW5zZXJ0aW5nIGEgMCAoYDEyMjE2YCkuCi0KLT09IDMuNC4yCi0KLSogSWYgYSB0YWJsZSBoYXMgYSBub24gemVybyBgZGVmYXVsdF90aW1lX3RvX2xpdmVgLCB0aGVuIGV4cGxpY2l0bHkKLXNwZWNpZnlpbmcgYSBUVEwgb2YgMCBpbiBhbiBgSU5TRVJUYCBvciBgVVBEQVRFYCBzdGF0ZW1lbnQgd2lsbCByZXN1bHQKLWluIHRoZSBuZXcgd3JpdGVzIG5vdCBoYXZpbmcgYW55IGV4cGlyYXRpb24gKHRoYXQgaXMsIGFuIGV4cGxpY2l0IFRUTCBvZgotMCBjYW5jZWxzIHRoZSBgZGVmYXVsdF90aW1lX3RvX2xpdmVgKS4gVGhpcyB3YXNuJ3QgdGhlIGNhc2UgYmVmb3JlIGFuZAotdGhlIGBkZWZhdWx0X3RpbWVfdG9fbGl2ZWAgd2FzIGFwcGxpZWQgZXZlbiB0aG91Z2ggYSBUVEwgaGFkIGJlZW4KLWV4cGxpY2l0bHkgc2V0LgotKiBgQUxURVIgVEFCTEVgIGBBRERgIGFuZCBgRFJPUGAgbm93IGFsbG93IG11bHRpcGxlIGNvbHVtbnMgdG8gYmUKLWFkZGVkL3JlbW92ZWQuCi0qIE5ldyBgUEVSIFBBUlRJVElPTiBMSU1JVGAgb3B0aW9uIGZvciBgU0VMRUNUYCBzdGF0ZW1lbnRzIChzZWUKLWh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTcwMTcpW0NBU1NBTkRSQS03MDE3XS4KLSogYFVzZXItZGVmaW5lZCBmdW5jdGlvbnMgPGNxbC1mdW5jdGlvbnM+YCBjYW4gbm93IGluc3RhbnRpYXRlCi1gVURUVmFsdWVgIGFuZCBgVHVwbGVWYWx1ZWAgaW5zdGFuY2VzIHZpYSB0aGUgbmV3IGBVREZDb250ZXh0YCBpbnRlcmZhY2UKLShzZWUKLWh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTEwODE4KVtDQVNTQU5EUkEtMTA4MThdLgotKiBgVXNlci1kZWZpbmVkIHR5cGVzIDx1ZHRzPmAgbWF5IG5vdyBiZSBzdG9yZWQgaW4gYSBub24tZnJvemVuIGZvcm0sCi1hbGxvd2luZyBpbmRpdmlkdWFsIGZpZWxkcyB0byBiZSB1cGRhdGVkIGFuZCBkZWxldGVkIGluIGBVUERBVEVgCi1zdGF0ZW1lbnRzIGFuZCBgREVMRVRFYCBzdGF0ZW1lbnRzLCByZXNwZWN0aXZlbHkuCi0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtNzQyMylbQ0FTU0FORFJBLTc0MjNdKS4KLQotPT0gMy40LjEKLQotKiBBZGRzIGBDQVNUYCBmdW5jdGlvbnMuCi0KLT09IDMuNC4wCi0KLSogU3VwcG9ydCBmb3IgYG1hdGVyaWFsaXplZCB2aWV3cyA8bWF0ZXJpYWxpemVkLXZpZXdzPmAuCi0qIGBERUxFVEVgIHN1cHBvcnQgZm9yIGluZXF1YWxpdHkgZXhwcmVzc2lvbnMgYW5kIGBJTmAgcmVzdHJpY3Rpb25zIG9uCi1hbnkgcHJpbWFyeSBrZXkgY29sdW1ucy4KLSogYFVQREFURWAgc3VwcG9ydCBmb3IgYElOYCByZXN0cmljdGlvbnMgb24gYW55IHByaW1hcnkga2V5IGNvbHVtbnMuCi0KLT09IDMuMy4xCi0KLSogVGhlIHN5bnRheCBgVFJVTkNBVEUgVEFCTEUgWGAgaXMgbm93IGFjY2VwdGVkIGFzIGFuIGFsaWFzIGZvcgotYFRSVU5DQVRFIFhgLgotCi09PSAzLjMuMAotCi0qIGBVc2VyLWRlZmluZWQgZnVuY3Rpb25zIGFuZCBhZ2dyZWdhdGVzIDxjcWwtZnVuY3Rpb25zPmAgYXJlIG5vdwotc3VwcG9ydGVkLgotKiBBbGxvd3MgZG91YmxlLWRvbGxhciBlbmNsb3NlZCBzdHJpbmdzIGxpdGVyYWxzIGFzIGFuIGFsdGVybmF0aXZlIHRvCi1zaW5nbGUtcXVvdGUgZW5jbG9zZWQgc3RyaW5ncy4KLSogSW50cm9kdWNlcyBSb2xlcyB0byBzdXBlcnNlZGUgdXNlciBiYXNlZCBhdXRoZW50aWNhdGlvbiBhbmQgYWNjZXNzCi1jb250cm9sCi0qIE5ldyBgZGF0ZWAsIGB0aW1lYCwgYHRpbnlpbnRgIGFuZCBgc21hbGxpbnRgIGBkYXRhIHR5cGVzIDxkYXRhLXR5cGVzPmAKLWhhdmUgYmVlbiBhZGRlZC4KLSogYEpTT04gc3VwcG9ydCA8Y3FsLWpzb24+YCBoYXMgYmVlbiBhZGRlZAotKiBBZGRzIG5ldyB0aW1lIGNvbnZlcnNpb24gZnVuY3Rpb25zIGFuZCBkZXByZWNhdGUgYGRhdGVPZmAgYW5kCi1gdW5peFRpbWVzdGFtcE9mYC4KLQotPT0gMy4yLjAKLQotKiBgVXNlci1kZWZpbmVkIHR5cGVzIDx1ZHRzPmAgc3VwcG9ydGVkLgotKiBgQ1JFQVRFIElOREVYYCBub3cgc3VwcG9ydHMgaW5kZXhpbmcgY29sbGVjdGlvbiBjb2x1bW5zLCBpbmNsdWRpbmcKLWluZGV4aW5nIHRoZSBrZXlzIG9mIG1hcCBjb2xsZWN0aW9ucyB0aHJvdWdoIHRoZSBga2V5cygpYCBmdW5jdGlvbgotKiBJbmRleGVzIG9uIGNvbGxlY3Rpb25zIG1heSBiZSBxdWVyaWVkIHVzaW5nIHRoZSBuZXcgYENPTlRBSU5TYCBhbmQKLWBDT05UQUlOUyBLRVlgIG9wZXJhdG9ycwotKiBgVHVwbGUgdHlwZXMgPHR1cGxlcz5gIHdlcmUgYWRkZWQgdG8gaG9sZCBmaXhlZC1sZW5ndGggc2V0cyBvZiB0eXBlZAotcG9zaXRpb25hbCBmaWVsZHMuCi0qIGBEUk9QIElOREVYYCBub3cgc3VwcG9ydHMgb3B0aW9uYWxseSBzcGVjaWZ5aW5nIGEga2V5c3BhY2UuCi0KLT09IDMuMS43Ci0KLSogYFNFTEVDVGAgc3RhdGVtZW50cyBub3cgc3VwcG9ydCBzZWxlY3RpbmcgbXVsdGlwbGUgcm93cyBpbiBhIHNpbmdsZQotcGFydGl0aW9uIHVzaW5nIGFuIGBJTmAgY2xhdXNlIG9uIGNvbWJpbmF0aW9ucyBvZiBjbHVzdGVyaW5nIGNvbHVtbnMuCi0qIGBJRiBOT1QgRVhJU1RTYCBhbmQgYElGIEVYSVNUU2Agc3ludGF4IGlzIG5vdyBzdXBwb3J0ZWQgYnkKLWBDUkVBVEUgVVNFUmAgYW5kIGBEUk9QIFVTRVJgIHN0YXRlbWVudHMsIHJlc3BlY3RpdmVseS4KLQotPT0gMy4xLjYKLQotKiBBIG5ldyBgdXVpZCgpYCBtZXRob2QgaGFzIGJlZW4gYWRkZWQuCi0qIFN1cHBvcnQgZm9yIGBERUxFVEUgLi4uIElGIEVYSVNUU2Agc3ludGF4LgotCi09PSAzLjEuNQotCi0qIEl0IGlzIG5vdyBwb3NzaWJsZSB0byBncm91cCBjbHVzdGVyaW5nIGNvbHVtbnMgaW4gYSByZWxhdGlvbiwgc2VlCi1gV0hFUkUgPHdoZXJlLWNsYXVzZT5gIGNsYXVzZXMuCi0qIEFkZGVkIHN1cHBvcnQgZm9yIGBzdGF0aWMgY29sdW1ucyA8c3RhdGljLWNvbHVtbnM+YC4KLQotPT0gMy4xLjQKLQotKiBgQ1JFQVRFIElOREVYYCBub3cgYWxsb3dzIHNwZWNpZnlpbmcgb3B0aW9ucyB3aGVuIGNyZWF0aW5nIENVU1RPTQotaW5kZXhlcy4KLQotPT0gMy4xLjMKLQotKiBNaWxsaXNlY29uZCBwcmVjaXNpb24gZm9ybWF0cyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlCi1gdGltZXN0YW1wIDx0aW1lc3RhbXBzPmAgcGFyc2VyLgotCi09PSAzLjEuMgotCi0qIGBOYU5gIGFuZCBgSW5maW5pdHlgIGhhcyBiZWVuIGFkZGVkIGFzIHZhbGlkIGZsb2F0IGNvbnN0YW50cy4gVGhleSBhcmUKLW5vdyByZXNlcnZlZCBrZXl3b3Jkcy4gSW4gdGhlIHVubGlrZWx5IGNhc2UgeW91IHdlIHVzaW5nIHRoZW0gYXMgYQotY29sdW1uIGlkZW50aWZpZXIgKG9yIGtleXNwYWNlL3RhYmxlIG9uZSksIHlvdSB3aWxsIG5vdyBuZWVkIHRvIGRvdWJsZQotcXVvdGUgdGhlbS4KLQotPT0gMy4xLjEKLQotKiBgU0VMRUNUYCBzdGF0ZW1lbnQgbm93IGFsbG93cyBsaXN0aW5nIHRoZSBwYXJ0aXRpb24ga2V5cyAodXNpbmcgdGhlCi1gRElTVElOQ1RgIG1vZGlmaWVyKS4gU2VlCi1odHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS00NTM2W0NBU1NBTkRSQS00NTM2XS4KLSogVGhlIHN5bnRheCBgYyBJTiA/YCBpcyBub3cgc3VwcG9ydGVkIGluIGBXSEVSRWAgY2xhdXNlcy4gSW4gdGhhdCBjYXNlLAotdGhlIHZhbHVlIGV4cGVjdGVkIGZvciB0aGUgYmluZCB2YXJpYWJsZSB3aWxsIGJlIGEgbGlzdCBvZiB3aGF0ZXZlciB0eXBlCi1gY2AgaXMuCi0qIEl0IGlzIG5vdyBwb3NzaWJsZSB0byB1c2UgbmFtZWQgYmluZCB2YXJpYWJsZXMgKHVzaW5nIGA6bmFtZWAgaW5zdGVhZAotb2YgYD9gKS4KLQotPT0gMy4xLjAKLQotKiBgQUxURVIgVEFCTEVgIGBEUk9QYCBvcHRpb24gYWRkZWQuCi0qIGBTRUxFQ1RgIHN0YXRlbWVudCBub3cgc3VwcG9ydHMgYWxpYXNlcyBpbiBzZWxlY3QgY2xhdXNlLiBBbGlhc2VzIGluCi1XSEVSRSBhbmQgT1JERVIgQlkgY2xhdXNlcyBhcmUgbm90IHN1cHBvcnRlZC4KLSogYENSRUFURWAgc3RhdGVtZW50cyBmb3IgYEtFWVNQQUNFYCwgYFRBQkxFYCBhbmQgYElOREVYYCBub3cgc3VwcG9ydHMKLWFuIGBJRiBOT1QgRVhJU1RTYCBjb25kaXRpb24uIFNpbWlsYXJseSwgYERST1BgIHN0YXRlbWVudHMgc3VwcG9ydCBhCi1gSUYgRVhJU1RTYCBjb25kaXRpb24uCi0qIGBJTlNFUlRgIHN0YXRlbWVudHMgb3B0aW9uYWxseSBzdXBwb3J0cyBhIGBJRiBOT1QgRVhJU1RTYCBjb25kaXRpb24KLWFuZCBgVVBEQVRFYCBzdXBwb3J0cyBgSUZgIGNvbmRpdGlvbnMuCi0KLT09IDMuMC41Ci0KLSogYFNFTEVDVGAsIGBVUERBVEVgLCBhbmQgYERFTEVURWAgc3RhdGVtZW50cyBub3cgYWxsb3cgZW1wdHkgYElOYAotcmVsYXRpb25zIChzZWUKLWh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTU2MjYpW0NBU1NBTkRSQS01NjI2XS4KLQotPT0gMy4wLjQKLQotKiBVcGRhdGVkIHRoZSBzeW50YXggZm9yIGN1c3RvbSBgc2Vjb25kYXJ5IGluZGV4ZXMgPHNlY29uZGFyeS1pbmRleGVzPmAuCi0qIE5vbi1lcXVhbCBjb25kaXRpb24gb24gdGhlIHBhcnRpdGlvbiBrZXkgYXJlIG5vdyBuZXZlciBzdXBwb3J0ZWQsIGV2ZW4KLWZvciBvcmRlcmluZyBwYXJ0aXRpb25lciBhcyB0aGlzIHdhcyBub3QgY29ycmVjdCAodGhlIG9yZGVyIHdhcyAqbm90KgotdGhlIG9uZSBvZiB0aGUgdHlwZSBvZiB0aGUgcGFydGl0aW9uIGtleSkuIEluc3RlYWQsIHRoZSBgdG9rZW5gIG1ldGhvZAotc2hvdWxkIGFsd2F5cyBiZSB1c2VkIGZvciByYW5nZSBxdWVyaWVzIG9uIHRoZSBwYXJ0aXRpb24ga2V5IChzZWUKLWBXSEVSRSBjbGF1c2VzIDx3aGVyZS1jbGF1c2U+YCkuCi0KLT09IDMuMC4zCi0KLSogU3VwcG9ydCBmb3IgY3VzdG9tIGBzZWNvbmRhcnkgaW5kZXhlcyA8c2Vjb25kYXJ5LWluZGV4ZXM+YCBoYXMgYmVlbgotYWRkZWQuCi0KLT09IDMuMC4yCi0KLSogVHlwZSB2YWxpZGF0aW9uIGZvciB0aGUgYGNvbnN0YW50cyA8Y29uc3RhbnRzPmAgaGFzIGJlZW4gZml4ZWQuIEZvcgotaW5zdGFuY2UsIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VkIHRvIGFsbG93IGAnMidgIGFzIGEgdmFsaWQgdmFsdWUgZm9yIGFuCi1gaW50YCBjb2x1bW4gKGludGVycHJldGluZyBpdCBoYXMgdGhlIGVxdWl2YWxlbnQgb2YgYDJgKSwgb3IgYDQyYCBhcyBhCi12YWxpZCBgYmxvYmAgdmFsdWUgKGluIHdoaWNoIGNhc2UgYDQyYCB3YXMgaW50ZXJwcmV0ZWQgYXMgYW4gaGV4YWRlY2ltYWwKLXJlcHJlc2VudGF0aW9uIG9mIHRoZSBibG9iKS4gVGhpcyBpcyBubyBsb25nZXIgdGhlIGNhc2UsIHR5cGUgdmFsaWRhdGlvbgotb2YgY29uc3RhbnRzIGlzIG5vdyBtb3JlIHN0cmljdC4gU2VlIHRoZSBgZGF0YSB0eXBlcyA8ZGF0YS10eXBlcz5gCi1zZWN0aW9uIGZvciBkZXRhaWxzIG9uIHdoaWNoIGNvbnN0YW50IGlzIGFsbG93ZWQgZm9yIHdoaWNoIHR5cGUuCi0qIFRoZSB0eXBlIHZhbGlkYXRpb24gZml4ZWQgb2YgdGhlIHByZXZpb3VzIHBvaW50IGhhcyBsZWFkIHRvIHRoZQotaW50cm9kdWN0aW9uIG9mIGJsb2JzIGNvbnN0YW50cyB0byBhbGxvdyB0aGUgaW5wdXQgb2YgYmxvYnMuIERvIG5vdGUKLXRoYXQgd2hpbGUgdGhlIGlucHV0IG9mIGJsb2JzIGFzIHN0cmluZ3MgY29uc3RhbnQgaXMgc3RpbGwgc3VwcG9ydGVkIGJ5Ci10aGlzIHZlcnNpb24gKHRvIGFsbG93IHNtb290aGVyIHRyYW5zaXRpb24gdG8gYmxvYiBjb25zdGFudCksIGl0IGlzIG5vdwotZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGJ5IGEgZnV0dXJlIHZlcnNpb24uIElmIHlvdSB3ZXJlIHVzaW5nCi1zdHJpbmdzIGFzIGJsb2JzLCB5b3Ugc2hvdWxkIHRodXMgdXBkYXRlIHlvdXIgY2xpZW50IGNvZGUgQVNBUCB0byBzd2l0Y2gKLWJsb2IgY29uc3RhbnRzLgotKiBBIG51bWJlciBvZiBmdW5jdGlvbnMgdG8gY29udmVydCBuYXRpdmUgdHlwZXMgdG8gYmxvYnMgaGF2ZSBhbHNvIGJlZW4KLWludHJvZHVjZWQuIEZ1cnRoZXJtb3JlIHRoZSB0b2tlbiBmdW5jdGlvbiBpcyBub3cgYWxzbyBhbGxvd2VkIGluIHNlbGVjdAotY2xhdXNlcy4gU2VlIHRoZSBgc2VjdGlvbiBvbiBmdW5jdGlvbnMgPGNxbC1mdW5jdGlvbnM+YCBmb3IgZGV0YWlscy4KLQotPT0gMy4wLjEKLQotKiBEYXRlIHN0cmluZ3MgKGFuZCB0aW1lc3RhbXBzKSBhcmUgbm8gbG9uZ2VyIGFjY2VwdGVkIGFzIHZhbGlkCi1gdGltZXV1aWRgIHZhbHVlcy4gRG9pbmcgc28gd2FzIGEgYnVnIGluIHRoZSBzZW5zZSB0aGF0IGRhdGUgc3RyaW5nIGFyZQotbm90IHZhbGlkIGB0aW1ldXVpZGAsIGFuZCBpdCB3YXMgdGh1cyByZXN1bHRpbmcgaW4KLWh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTQ5MzZbY29uZnVzaW5nCi1iZWhhdmlvcnNdLiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5ldyBtZXRob2RzIGhhdmUgYmVlbiBhZGRlZCB0byBoZWxwCi13b3JraW5nIHdpdGggYHRpbWV1dWlkYDogYG5vd2AsIGBtaW5UaW1ldXVpZGAsIGBtYXhUaW1ldXVpZGAgLCBgZGF0ZU9mYAotYW5kIGB1bml4VGltZXN0YW1wT2ZgLgotKiBGbG9hdCBjb25zdGFudHMgbm93IHN1cHBvcnQgdGhlIGV4cG9uZW50IG5vdGF0aW9uLiBJbiBvdGhlciB3b3JkcywKLWA0LjJFMTBgIGlzIG5vdyBhIHZhbGlkIGZsb2F0aW5nIHBvaW50IHZhbHVlLgotCi09PSBWZXJzaW9uaW5nCi0KLVZlcnNpb25pbmcgb2YgdGhlIENRTCBsYW5ndWFnZSBhZGhlcmVzIHRvIHRoZSBodHRwOi8vc2VtdmVyLm9yZ1tTZW1hbnRpYwotVmVyc2lvbmluZ10gZ3VpZGVsaW5lcy4gVmVyc2lvbnMgdGFrZSB0aGUgZm9ybSBYLlkuWiB3aGVyZSBYLCBZLCBhbmQgWgotYXJlIGludGVnZXIgdmFsdWVzIHJlcHJlc2VudGluZyBtYWpvciwgbWlub3IsIGFuZCBwYXRjaCBsZXZlbAotcmVzcGVjdGl2ZWx5LiBUaGVyZSBpcyBubyBjb3JyZWxhdGlvbiBiZXR3ZWVuIENhc3NhbmRyYSByZWxlYXNlIHZlcnNpb25zCi1hbmQgdGhlIENRTCBsYW5ndWFnZSB2ZXJzaW9uLgotCi1bY29scz0iLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18dmVyc2lvbiB8ZGVzY3JpcHRpb24KLXwgTWFqb3IgfCBUaGUgbWFqb3IgdmVyc2lvbiBfbXVzdF8gYmUgYnVtcGVkIHdoZW4gYmFja3dhcmQgaW5jb21wYXRpYmxlIGNoYW5nZXMKLWFyZSBpbnRyb2R1Y2VkLiBUaGlzIHNob3VsZCByYXJlbHkgb2NjdXIuCi18IE1pbm9yIHwgTWlub3IgdmVyc2lvbiBpbmNyZW1lbnRzIG9jY3VyIHdoZW4gbmV3LCBidXQgYmFja3dhcmQgY29tcGF0aWJsZSwKLWZ1bmN0aW9uYWxpdHkgaXMgaW50cm9kdWNlZC4KLXwgUGF0Y2ggfCBUaGUgcGF0Y2ggdmVyc2lvbiBpcyBpbmNyZW1lbnRlZCB3aGVuIGJ1Z3MgYXJlIGZpeGVkLgotfD09PQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9jcWxfc2luZ2xlZmlsZS5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9jcWxfc2luZ2xlZmlsZS5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTllMTJiLi4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvY3FsX3NpbmdsZWZpbGUuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDM5MjEgKzAsMCBAQAotPT0gQ2Fzc2FuZHJhIFF1ZXJ5IExhbmd1YWdlIChDUUwpIHYzLjQuMwotCi1ce3RvYzptYXhMZXZlbD0zfQotCi09PT0gQ1FMIFN5bnRheAotCi09PT09IFByZWFtYmxlCi0KLVRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UgKENRTCkgdmVyc2lvbiAzLgotQ1FMIHYzIGlzIG5vdCBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGggQ1FMIHYyIGFuZCBkaWZmZXJzIGZyb20gaXQgaW4KLW51bWVyb3VzIHdheXMuIE5vdGUgdGhhdCB0aGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgbGFzdCB2ZXJzaW9uIG9mIHRoZQotbGFuZ3VhZ2VzLiBIb3dldmVyLCB0aGUgbGluazojY2hhbmdlc1tjaGFuZ2VzXSBzZWN0aW9uIHByb3ZpZGVzIHRoZSBkaWZmCi1iZXR3ZWVuIHRoZSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgQ1FMIHYzLgotCi1DUUwgdjMgb2ZmZXJzIGEgbW9kZWwgdmVyeSBjbG9zZSB0byBTUUwgaW4gdGhlIHNlbnNlIHRoYXQgZGF0YSBpcyBwdXQgaW4KLV90YWJsZXNfIGNvbnRhaW5pbmcgX3Jvd3NfIG9mIF9jb2x1bW5zXy4gRm9yIHRoYXQgcmVhc29uLCB3aGVuIHVzZWQgaW4KLXRoaXMgZG9jdW1lbnQsIHRoZXNlIHRlcm1zICh0YWJsZXMsIHJvd3MgYW5kIGNvbHVtbnMpIGhhdmUgdGhlIHNhbWUKLWRlZmluaXRpb24gdGhhbiB0aGV5IGhhdmUgaW4gU1FMLiBCdXQgcGxlYXNlIG5vdGUgdGhhdCBhcyBzdWNoLCB0aGV5IGRvCi0qbm90KiByZWZlciB0byB0aGUgY29uY2VwdCBvZiByb3dzIGFuZCBjb2x1bW5zIGZvdW5kIGluIHRoZSBpbnRlcm5hbAotaW1wbGVtZW50YXRpb24gb2YgQ2Fzc2FuZHJhIGFuZCBpbiB0aGUgdGhyaWZ0IGFuZCBDUUwgdjIgQVBJLgotCi09PT09IENvbnZlbnRpb25zCi0KLVRvIGFpZCBpbiBzcGVjaWZ5aW5nIHRoZSBDUUwgc3ludGF4LCB3ZSB3aWxsIHVzZSB0aGUgZm9sbG93aW5nCi1jb252ZW50aW9ucyBpbiB0aGlzIGRvY3VtZW50OgotCi0qIExhbmd1YWdlIHJ1bGVzIHdpbGwgYmUgZ2l2ZW4gaW4gYQotaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CYWNrdXMlRTIlODAlOTNOYXVyX0Zvcm1bQk5GXSAtbGlrZQotbm90YXRpb246Ci0KLWJjKHN5bnRheCkuIDo6PSBURVJNSU5BTAotCi0qIE5vbnRlcm1pbmFsIHN5bWJvbHMgd2lsbCBoYXZlIGA8YW5nbGUgYnJhY2tldHM+YC4KLSogQXMgYWRkaXRpb25hbCBzaG9ydGN1dCBub3RhdGlvbnMgdG8gQk5GLCB3ZeKAmWxsIHVzZSB0cmFkaXRpb25hbCByZWd1bGFyCi1leHByZXNzaW9u4oCZcyBzeW1ib2xzIChgP2AsIGArYCBhbmQgYCpgKSB0byBzaWduaWZ5IHRoYXQgYSBnaXZlbiBzeW1ib2wKLWlzIG9wdGlvbmFsIGFuZC9vciBjYW4gYmUgcmVwZWF0ZWQuIFdl4oCZbGwgYWxzbyBhbGxvdyBwYXJlbnRoZXNlcyB0bwotZ3JvdXAgc3ltYm9scyBhbmQgdGhlIGBbPGNoYXJhY3RlcnM+XWAgbm90YXRpb24gdG8gcmVwcmVzZW50IGFueSBvbmUgb2YKLWA8Y2hhcmFjdGVycz5gLgotKiBUaGUgZ3JhbW1hciBpcyBwcm92aWRlZCBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3NlcyBhbmQgbGVhdmUgc29tZQotbWlub3IgZGV0YWlscyBvdXQuIEZvciBpbnN0YW5jZSwgdGhlIGxhc3QgY29sdW1uIGRlZmluaXRpb24gaW4gYQotYENSRUFURSBUQUJMRWAgc3RhdGVtZW50IGlzIG9wdGlvbmFsIGJ1dCBzdXBwb3J0ZWQgaWYgcHJlc2VudCBldmVuCi10aG91Z2ggdGhlIHByb3ZpZGVkIGdyYW1tYXIgaW4gdGhpcyBkb2N1bWVudCBzdWdnZXN0IGl0IGlzIG5vdAotc3VwcG9ydGVkLgotKiBTYW1wbGUgY29kZSB3aWxsIGJlIHByb3ZpZGVkIGluIGEgY29kZSBibG9jazoKLQotYmMoc2FtcGxlKS4gU0VMRUNUIHNhbXBsZV91c2FnZSBGUk9NIGNxbDsKLQotKiBSZWZlcmVuY2VzIHRvIGtleXdvcmRzIG9yIHBpZWNlcyBvZiBDUUwgY29kZSBpbiBydW5uaW5nIHRleHQgd2lsbCBiZQotc2hvd24gaW4gYSBgZml4ZWQtd2lkdGggZm9udGAuCi0KLVtbaWRlbnRpZmllcnNdXQotPT09PSBJZGVudGlmaWVycyBhbmQga2V5d29yZHMKLQotVGhlIENRTCBsYW5ndWFnZSB1c2VzIF9pZGVudGlmaWVyc18gKG9yIF9uYW1lc18pIHRvIGlkZW50aWZ5IHRhYmxlcywKLWNvbHVtbnMgYW5kIG90aGVyIG9iamVjdHMuIEFuIGlkZW50aWZpZXIgaXMgYSB0b2tlbiBtYXRjaGluZyB0aGUgcmVndWxhcgotZXhwcmVzc2lvbiBgW2EtekEtWl1gYFthLXpBLVowLTlfXWBgKmAuCi0KLUEgbnVtYmVyIG9mIHN1Y2ggaWRlbnRpZmllcnMsIGxpa2UgYFNFTEVDVGAgb3IgYFdJVEhgLCBhcmUgX2tleXdvcmRzXy4KLVRoZXkgaGF2ZSBhIGZpeGVkIG1lYW5pbmcgZm9yIHRoZSBsYW5ndWFnZSBhbmQgbW9zdCBhcmUgcmVzZXJ2ZWQuIFRoZQotbGlzdCBvZiB0aG9zZSBrZXl3b3JkcyBjYW4gYmUgZm91bmQgaW4gbGluazojYXBwZW5kaXhBW0FwcGVuZGl4IEFdLgotCi1JZGVudGlmaWVycyBhbmQgKHVucXVvdGVkKSBrZXl3b3JkcyBhcmUgY2FzZSBpbnNlbnNpdGl2ZS4gVGh1cyBgU0VMRUNUYAotaXMgdGhlIHNhbWUgdGhhbiBgc2VsZWN0YCBvciBgc0VsRWNUYCwgYW5kIGBteUlkYCBpcyB0aGUgc2FtZSB0aGFuCi1gbXlpZGAgb3IgYE1ZSURgIGZvciBpbnN0YW5jZS4gQSBjb252ZW50aW9uIG9mdGVuIHVzZWQgKGluIHBhcnRpY3VsYXIgYnkKLXRoZSBzYW1wbGVzIG9mIHRoaXMgZG9jdW1lbnRhdGlvbikgaXMgdG8gdXNlIHVwcGVyIGNhc2UgZm9yIGtleXdvcmRzIGFuZAotbG93ZXIgY2FzZSBmb3Igb3RoZXIgaWRlbnRpZmllcnMuCi0KLVRoZXJlIGlzIGEgc2Vjb25kIGtpbmQgb2YgaWRlbnRpZmllcnMgY2FsbGVkIF9xdW90ZWQgaWRlbnRpZmllcnNfCi1kZWZpbmVkIGJ5IGVuY2xvc2luZyBhbiBhcmJpdHJhcnkgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBpbgotZG91YmxlLXF1b3RlcyhgImApLiBRdW90ZWQgaWRlbnRpZmllcnMgYXJlIG5ldmVyIGtleXdvcmRzLiBUaHVzCi1gInNlbGVjdCJgIGlzIG5vdCBhIHJlc2VydmVkIGtleXdvcmQgYW5kIGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIGEKLWNvbHVtbiwgd2hpbGUgYHNlbGVjdGAgd291bGQgcmFpc2UgYSBwYXJzZSBlcnJvci4gQWxzbywgY29udHJhcmlseSB0bwotdW5xdW90ZWQgaWRlbnRpZmllcnMgYW5kIGtleXdvcmRzLCBxdW90ZWQgaWRlbnRpZmllcnMgYXJlIGNhc2Ugc2Vuc2l0aXZlCi0oYCJNeSBRdW90ZWQgSWQiYCBpcyBfZGlmZmVyZW50XyBmcm9tIGAibXkgcXVvdGVkIGlkImApLiBBIGZ1bGx5Ci1sb3dlcmNhc2UgcXVvdGVkIGlkZW50aWZpZXIgdGhhdCBtYXRjaGVzIGBbYS16QS1aXWBgW2EtekEtWjAtOV9dYGAqYCBpcwotZXF1aXZhbGVudCB0byB0aGUgdW5xdW90ZWQgaWRlbnRpZmllciBvYnRhaW5lZCBieSByZW1vdmluZyB0aGUKLWRvdWJsZS1xdW90ZSAoc28gYCJteWlkImAgaXMgZXF1aXZhbGVudCB0byBgbXlpZGAgYW5kIHRvIGBteUlkYCBidXQKLWRpZmZlcmVudCBmcm9tIGAibXlJZCJgKS4gSW5zaWRlIGEgcXVvdGVkIGlkZW50aWZpZXIsIHRoZSBkb3VibGUtcXVvdGUKLWNoYXJhY3RlciBjYW4gYmUgcmVwZWF0ZWQgdG8gZXNjYXBlIGl0LCBzbyBgImZvbyAiIiBiYXIiYCBpcyBhIHZhbGlkCi1pZGVudGlmaWVyLgotCi0qV2FybmluZyo6IF9xdW90ZWQgaWRlbnRpZmllcnNfIGFsbG93cyB0byBkZWNsYXJlIGNvbHVtbnMgd2l0aCBhcmJpdHJhcnkKLW5hbWVzLCBhbmQgdGhvc2UgY2FuIHNvbWV0aW1lIGNsYXNoIHdpdGggc3BlY2lmaWMgbmFtZXMgdXNlZCBieSB0aGUKLXNlcnZlci4gRm9yIGluc3RhbmNlLCB3aGVuIHVzaW5nIGNvbmRpdGlvbmFsIHVwZGF0ZSwgdGhlIHNlcnZlciB3aWxsCi1yZXNwb25kIHdpdGggYSByZXN1bHQtc2V0IGNvbnRhaW5pbmcgYSBzcGVjaWFsIHJlc3VsdCBuYW1lZAotYCJbYXBwbGllZF0iYC4gSWYgeW914oCZdmUgZGVjbGFyZWQgYSBjb2x1bW4gd2l0aCBzdWNoIGEgbmFtZSwgdGhpcyBjb3VsZAotcG90ZW50aWFsbHkgY29uZnVzZSBzb21lIHRvb2xzIGFuZCBzaG91bGQgYmUgYXZvaWRlZC4gSW4gZ2VuZXJhbCwKLXVucXVvdGVkIGlkZW50aWZpZXJzIHNob3VsZCBiZSBwcmVmZXJyZWQgYnV0IGlmIHlvdSB1c2UgcXVvdGVkCi1pZGVudGlmaWVycywgaXQgaXMgc3Ryb25nbHkgYWR2aXNlZCB0byBhdm9pZCBhbnkgbmFtZSBlbmNsb3NlZCBieQotc3F1YXJlZCBicmFja2V0cyAobGlrZSBgIlthcHBsaWVkXSJgKSBhbmQgYW55IG5hbWUgdGhhdCBsb29rcyBsaWtlIGEKLWZ1bmN0aW9uIGNhbGwgKGxpa2UgYCJmKHgpImApLgotCi09PT09IENvbnN0YW50cwotCi1DUUwgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGtpbmQgb2YgX2NvbnN0YW50c186IHN0cmluZ3MsIGludGVnZXJzLAotZmxvYXRzLCBib29sZWFucywgdXVpZHMgYW5kIGJsb2JzOgotCi0qIEEgc3RyaW5nIGNvbnN0YW50IGlzIGFuIGFyYml0cmFyeSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGNoYXJhY3RlcnMKLWVuY2xvc2VkIGJ5IHNpbmdsZS1xdW90ZShgJ2ApLiBPbmUgY2FuIGluY2x1ZGUgYSBzaW5nbGUtcXVvdGUgaW4gYQotc3RyaW5nIGJ5IHJlcGVhdGluZyBpdCwgZS5nLiBgJ0l0JydzIHJhaW5pbmcgdG9kYXknYC4gVGhvc2UgYXJlIG5vdCB0bwotYmUgY29uZnVzZWQgd2l0aCBxdW90ZWQgaWRlbnRpZmllcnMgdGhhdCB1c2UgZG91YmxlLXF1b3Rlcy4KLSogQW4gaW50ZWdlciBjb25zdGFudCBpcyBkZWZpbmVkIGJ5IGAnLSc/WzAtOV0rYC4KLSogQSBmbG9hdCBjb25zdGFudCBpcyBkZWZpbmVkIGJ5Ci1gJy0nP1swLTldKygnLidbMC05XSopPyhbZUVdWystXT9bMC05K10pP2AuIE9uIHRvcCBvZiB0aGF0LCBgTmFOYCBhbmQKLWBJbmZpbml0eWAgYXJlIGFsc28gZmxvYXQgY29uc3RhbnRzLgotKiBBIGJvb2xlYW4gY29uc3RhbnQgaXMgZWl0aGVyIGB0cnVlYCBvciBgZmFsc2VgIHVwIHRvCi1jYXNlLWluc2Vuc2l0aXZpdHkgKGkuZS4gYFRydWVgIGlzIGEgdmFsaWQgYm9vbGVhbiBjb25zdGFudCkuCi0qIEEgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vbml2ZXJzYWxseV91bmlxdWVfaWRlbnRpZmllcltVVUlEXQotY29uc3RhbnQgaXMgZGVmaW5lZCBieSBgaGV4ezh9LWhleHs0fS1oZXh7NH0taGV4ezR9LWhleHsxMn1gIHdoZXJlIGBoZXhgCi1pcyBhbiBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIsIGUuZy4gYFswLTlhLWZBLUZdYCBhbmQgYHs0fWAgaXMgdGhlIG51bWJlcgotb2Ygc3VjaCBjaGFyYWN0ZXJzLgotKiBBIGJsb2IgY29uc3RhbnQgaXMgYW4gaGV4YWRlY2ltYWwgbnVtYmVyIGRlZmluZWQgYnkgYDBbeFhdKGhleCkrYAotd2hlcmUgYGhleGAgaXMgYW4gaGV4YWRlY2ltYWwgY2hhcmFjdGVyLCBlLmcuIGBbMC05YS1mQS1GXWAuCi0KLUZvciBob3cgdGhlc2UgY29uc3RhbnRzIGFyZSB0eXBlZCwgc2VlIHRoZSBsaW5rOiN0eXBlc1tkYXRhIHR5cGVzCi1zZWN0aW9uXS4KLQotPT09PSBDb21tZW50cwotCi1BIGNvbW1lbnQgaW4gQ1FMIGlzIGEgbGluZSBiZWdpbm5pbmcgYnkgZWl0aGVyIGRvdWJsZSBkYXNoZXMgKGAtLWApIG9yCi1kb3VibGUgc2xhc2ggKGAvL2ApLgotCi1NdWx0aS1saW5lIGNvbW1lbnRzIGFyZSBhbHNvIHN1cHBvcnRlZCB0aHJvdWdoIGVuY2xvc3VyZSB3aXRoaW4gYC8qYCBhbmQKLWAqL2AgKGJ1dCBuZXN0aW5nIGlzIG5vdCBzdXBwb3J0ZWQpLgotCi1iYyhzYW1wbGUpLiArCi3igJQgVGhpcyBpcyBhIGNvbW1lbnQgKwotLy8gVGhpcyBpcyBhIGNvbW1lbnQgdG9vICsKLS8qIFRoaXMgaXMgKwotYSBtdWx0aS1saW5lIGNvbW1lbnQgKi8KLQotPT09PSBTdGF0ZW1lbnRzCi0KLUNRTCBjb25zaXN0cyBvZiBzdGF0ZW1lbnRzLiBBcyBpbiBTUUwsIHRoZXNlIHN0YXRlbWVudHMgY2FuIGJlIGRpdmlkZWQKLWluIDMgY2F0ZWdvcmllczoKLQotKiBEYXRhIGRlZmluaXRpb24gc3RhdGVtZW50cywgdGhhdCBhbGxvdyB0byBzZXQgYW5kIGNoYW5nZSB0aGUgd2F5IGRhdGEKLWlzIHN0b3JlZC4KLSogRGF0YSBtYW5pcHVsYXRpb24gc3RhdGVtZW50cywgdGhhdCBhbGxvdyB0byBjaGFuZ2UgZGF0YQotKiBRdWVyaWVzLCB0byBsb29rIHVwIGRhdGEKLQotQWxsIHN0YXRlbWVudHMgZW5kIHdpdGggYSBzZW1pY29sb24gKGA7YCkgYnV0IHRoYXQgc2VtaWNvbG9uIGNhbiBiZQotb21pdHRlZCB3aGVuIGRlYWxpbmcgd2l0aCBhIHNpbmdsZSBzdGF0ZW1lbnQuIFRoZSBzdXBwb3J0ZWQgc3RhdGVtZW50cwotYXJlIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLiBXaGVuIGRlc2NyaWJpbmcgdGhlIGdyYW1tYXIgb2YKLXNhaWQgc3RhdGVtZW50cywgd2Ugd2lsbCByZXVzZSB0aGUgbm9uLXRlcm1pbmFsIHN5bWJvbHMgZGVmaW5lZCBiZWxvdzoKLQotYmMoc3ludGF4KS4uICsKLTo6PSBhbnkgcXVvdGVkIG9yIHVucXVvdGVkIGlkZW50aWZpZXIsIGV4Y2x1ZGluZyByZXNlcnZlZCBrZXl3b3JkcyArCi06Oj0gKCBgLicpPwotCi06Oj0gYSBzdHJpbmcgY29uc3RhbnQgKwotOjo9IGFuIGludGVnZXIgY29uc3RhbnQgKwotOjo9IGEgZmxvYXQgY29uc3RhbnQgKwotOjo9IHwgICsKLTo6PSBhIHV1aWQgY29uc3RhbnQgKwotOjo9IGEgYm9vbGVhbiBjb25zdGFudCArCi06Oj0gYSBibG9iIGNvbnN0YW50Ci0KLTo6PSAgKwotfCAgKwotfCAgKwotfCAgKwotfCAgKwotOjo9IGA/JyArCi18IGA6JyAgKwotOjo9ICArCi18ICArCi18ICArCi18IGAoJyAoIChgLCcgKSopPyBgKScKLQotOjo9ICArCi18ICArCi18ICArCi06Oj0gYFx7JyAoIGA6JyAoIGAsJyBgOicgKSogKT8gYH0nICsKLTo6PSBgXHsnICggKCBgLCcgKSogKT8gYH0nICsKLTo6PSBgWycgKCAoIGAsJyApKiApPyBgXScKLQotOjo9Ci0KLTo6PSAoQU5EICkqICsKLTo6PSBgPScgKCB8IHwgKSArCi1wLiArCi1QbGVhc2Ugbm90ZSB0aGF0IG5vdCBldmVyeSBwb3NzaWJsZSBwcm9kdWN0aW9ucyBvZiB0aGUgZ3JhbW1hciBhYm92ZQotd2lsbCBiZSB2YWxpZCBpbiBwcmFjdGljZS4gTW9zdCBub3RhYmx5LCBgPHZhcmlhYmxlPmAgYW5kIG5lc3RlZAotYDxjb2xsZWN0aW9uLWxpdGVyYWw+YCBhcmUgY3VycmVudGx5IG5vdCBhbGxvd2VkIGluc2lkZQotYDxjb2xsZWN0aW9uLWxpdGVyYWw+YC4KLQotQSBgPHZhcmlhYmxlPmAgY2FuIGJlIGVpdGhlciBhbm9ueW1vdXMgKGEgcXVlc3Rpb24gbWFyayAoYD9gKSkgb3IgbmFtZWQKLShhbiBpZGVudGlmaWVyIHByZWNlZGVkIGJ5IGA6YCkuIEJvdGggZGVjbGFyZSBhIGJpbmQgdmFyaWFibGVzIGZvcgotbGluazojcHJlcGFyZWRTdGF0ZW1lbnRbcHJlcGFyZWQgc3RhdGVtZW50c10uIFRoZSBvbmx5IGRpZmZlcmVuY2UKLWJldHdlZW4gYW4gYW55bW91cyBhbmQgYSBuYW1lZCB2YXJpYWJsZSBpcyB0aGF0IGEgbmFtZWQgb25lIHdpbGwgYmUKLWVhc2llciB0byByZWZlciB0byAoaG93IGV4YWN0bHkgZGVwZW5kcyBvbiB0aGUgY2xpZW50IGRyaXZlciB1c2VkKS4KLQotVGhlIGA8cHJvcGVydGllcz5gIHByb2R1Y3Rpb24gaXMgdXNlIGJ5IHN0YXRlbWVudCB0aGF0IGNyZWF0ZSBhbmQgYWx0ZXIKLWtleXNwYWNlcyBhbmQgdGFibGVzLiBFYWNoIGA8cHJvcGVydHk+YCBpcyBlaXRoZXIgYSBfc2ltcGxlXyBvbmUsIGluCi13aGljaCBjYXNlIGl0IGp1c3QgaGFzIGEgdmFsdWUsIG9yIGEgX21hcF8gb25lLCBpbiB3aGljaCBjYXNlIGl04oCZcyB2YWx1ZQotaXMgYSBtYXAgZ3JvdXBpbmcgc3ViLW9wdGlvbnMuIFRoZSBmb2xsb3dpbmcgd2lsbCByZWZlciB0byBvbmUgb3IgdGhlCi1vdGhlciBhcyB0aGUgX2tpbmRfIChfc2ltcGxlXyBvciBfbWFwXykgb2YgdGhlIHByb3BlcnR5LgotCi1BIGA8dGFibGVuYW1lPmAgd2lsbCBiZSB1c2VkIHRvIGlkZW50aWZ5IGEgdGFibGUuIFRoaXMgaXMgYW4gaWRlbnRpZmllcgotcmVwcmVzZW50aW5nIHRoZSB0YWJsZSBuYW1lIHRoYXQgY2FuIGJlIHByZWNlZGVkIGJ5IGEga2V5c3BhY2UgbmFtZS4gVGhlCi1rZXlzcGFjZSBuYW1lLCBpZiBwcm92aWRlZCwgYWxsb3cgdG8gaWRlbnRpZnkgYSB0YWJsZSBpbiBhbm90aGVyCi1rZXlzcGFjZSB0aGFuIHRoZSBjdXJyZW50bHkgYWN0aXZlIG9uZSAodGhlIGN1cnJlbnRseSBhY3RpdmUga2V5c3BhY2UgaXMKLXNldCB0aHJvdWdoIHRoZSBgVVNFYCBzdGF0ZW1lbnQpLgotCi1Gb3Igc3VwcG9ydGVkIGA8ZnVuY3Rpb24+YCwgc2VlIHRoZSBzZWN0aW9uIG9uCi1saW5rOiNmdW5jdGlvbnNbZnVuY3Rpb25zXS4KLQotU3RyaW5ncyBjYW4gYmUgZWl0aGVyIGVuY2xvc2VkIHdpdGggc2luZ2xlIHF1b3RlcyBvciB0d28gZG9sbGFyCi1jaGFyYWN0ZXJzLiBUaGUgc2Vjb25kIHN5bnRheCBoYXMgYmVlbiBpbnRyb2R1Y2VkIHRvIGFsbG93IHN0cmluZ3MgdGhhdAotY29udGFpbiBzaW5nbGUgcXVvdGVzLiBUeXBpY2FsIGNhbmRpZGF0ZXMgZm9yIHN1Y2ggc3RyaW5ncyBhcmUgc291cmNlCi1jb2RlIGZyYWdtZW50cyBmb3IgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucy4KLQotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuLiArCi1gc29tZSBzdHJpbmcgdmFsdWUnCi0KLSQkZG91YmxlLWRvbGxhciBzdHJpbmcgY2FuIGNvbnRhaW4gc2luZ2xlIOKAmSBxdW90ZXMkJCArCi1wLgotCi1bW3ByZXBhcmVkU3RhdGVtZW50XV0KLT09PT0gUHJlcGFyZWQgU3RhdGVtZW50Ci0KLUNRTCBzdXBwb3J0cyBfcHJlcGFyZWQgc3RhdGVtZW50c18uIFByZXBhcmVkIHN0YXRlbWVudCBpcyBhbgotb3B0aW1pemF0aW9uIHRoYXQgYWxsb3dzIHRvIHBhcnNlIGEgcXVlcnkgb25seSBvbmNlIGJ1dCBleGVjdXRlIGl0Ci1tdWx0aXBsZSB0aW1lcyB3aXRoIGRpZmZlcmVudCBjb25jcmV0ZSB2YWx1ZXMuCi0KLUluIGEgc3RhdGVtZW50LCBlYWNoIHRpbWUgYSBjb2x1bW4gdmFsdWUgaXMgZXhwZWN0ZWQgKGluIHRoZSBkYXRhCi1tYW5pcHVsYXRpb24gYW5kIHF1ZXJ5IHN0YXRlbWVudHMpLCBhIGA8dmFyaWFibGU+YCAoc2VlIGFib3ZlKSBjYW4gYmUKLXVzZWQgaW5zdGVhZC4gQSBzdGF0ZW1lbnQgd2l0aCBiaW5kIHZhcmlhYmxlcyBtdXN0IHRoZW4gYmUgX3ByZXBhcmVkXy4KLU9uY2UgaXQgaGFzIGJlZW4gcHJlcGFyZWQsIGl0IGNhbiBleGVjdXRlZCBieSBwcm92aWRpbmcgY29uY3JldGUgdmFsdWVzCi1mb3IgdGhlIGJpbmQgdmFyaWFibGVzLiBUaGUgZXhhY3QgcHJvY2VkdXJlIHRvIHByZXBhcmUgYSBzdGF0ZW1lbnQgYW5kCi1leGVjdXRlIGEgcHJlcGFyZWQgc3RhdGVtZW50IGRlcGVuZHMgb24gdGhlIENRTCBkcml2ZXIgdXNlZCBhbmQgaXMKLWJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBkb2N1bWVudC4KLQotSW4gYWRkaXRpb24gdG8gcHJvdmlkaW5nIGNvbHVtbiB2YWx1ZXMsIGJpbmQgbWFya2VycyBtYXkgYmUgdXNlZCB0bwotcHJvdmlkZSB2YWx1ZXMgZm9yIGBMSU1JVGAsIGBUSU1FU1RBTVBgLCBhbmQgYFRUTGAgY2xhdXNlcy4gSWYgYW5vbnltb3VzCi1iaW5kIG1hcmtlcnMgYXJlIHVzZWQsIHRoZSBuYW1lcyBmb3IgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMgd2lsbCBiZQotYFtsaW1pdF1gLCBgW3RpbWVzdGFtcF1gLCBhbmQgYFt0dGxdYCwgcmVzcGVjdGl2ZWx5LgotCi1bW2RhdGFEZWZpbml0aW9uXV0KLT09PSBEYXRhIERlZmluaXRpb24KLQotW1tjcmVhdGVLZXlzcGFjZVN0bXRdXQotPT09PSBDUkVBVEUgS0VZU1BBQ0UKLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuLiArCi06Oj0gQ1JFQVRFIEtFWVNQQUNFIChJRiBOT1QgRVhJU1RTKT8gV0lUSCAgKwotcC4gKwotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuLiArCi1DUkVBVEUgS0VZU1BBQ0UgRXhjZWxzaW9yICsKLVdJVEggcmVwbGljYXRpb24gPSBce+KAmWNsYXNz4oCZOiBgU2ltcGxlU3RyYXRlZ3knLCBgcmVwbGljYXRpb25fZmFjdG9yJyA6Ci0zfTsKLQotQ1JFQVRFIEtFWVNQQUNFIEV4Y2FsaWJ1ciArCi1XSVRIIHJlcGxpY2F0aW9uID0gXHvigJljbGFzc+KAmTogYE5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgYERDMScgOiAxLAotYERDMicgOiAzfSArCi1BTkQgZHVyYWJsZV93cml0ZXMgPSBmYWxzZTsgKwotcC4gKwotVGhlIGBDUkVBVEUgS0VZU1BBQ0VgIHN0YXRlbWVudCBjcmVhdGVzIGEgbmV3IHRvcC1sZXZlbCBfa2V5c3BhY2VfLiBBCi1rZXlzcGFjZSBpcyBhIG5hbWVzcGFjZSB0aGF0IGRlZmluZXMgYSByZXBsaWNhdGlvbiBzdHJhdGVneSBhbmQgc29tZQotb3B0aW9ucyBmb3IgYSBzZXQgb2YgdGFibGVzLiBWYWxpZCBrZXlzcGFjZXMgbmFtZXMgYXJlIGlkZW50aWZpZXJzCi1jb21wb3NlZCBleGNsdXNpdmVseSBvZiBhbHBoYW51bWVyaWNhbCBjaGFyYWN0ZXJzIGFuZCB3aG9zZSBsZW5ndGggaXMKLWxlc3NlciBvciBlcXVhbCB0byAzMi4gTm90ZSB0aGF0IGFzIGlkZW50aWZpZXJzLCBrZXlzcGFjZSBuYW1lcyBhcmUgY2FzZQotaW5zZW5zaXRpdmU6IHVzZSBhIHF1b3RlZCBpZGVudGlmaWVyIGZvciBjYXNlIHNlbnNpdGl2ZSBrZXlzcGFjZSBuYW1lcy4KLQotVGhlIHN1cHBvcnRlZCBgPHByb3BlcnRpZXM+YCBmb3IgYENSRUFURSBLRVlTUEFDRWAgYXJlOgotCi1bY29scz0iLCwsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18bmFtZSB8a2luZCB8bWFuZGF0b3J5IHxkZWZhdWx0IHxkZXNjcmlwdGlvbgotfGByZXBsaWNhdGlvbmAgfF9tYXBfIHx5ZXMgfCB8VGhlIHJlcGxpY2F0aW9uIHN0cmF0ZWd5IGFuZCBvcHRpb25zIHRvCi11c2UgZm9yIHRoZSBrZXlzcGFjZS4KLQotfGBkdXJhYmxlX3dyaXRlc2AgfF9zaW1wbGVfIHxubyB8dHJ1ZSB8V2hldGhlciB0byB1c2UgdGhlIGNvbW1pdCBsb2cgZm9yCi11cGRhdGVzIG9uIHRoaXMga2V5c3BhY2UgKGRpc2FibGUgdGhpcyBvcHRpb24gYXQgeW91ciBvd24gcmlzayEpLgotfD09PQotCi1UaGUgYHJlcGxpY2F0aW9uYCBgPHByb3BlcnR5PmAgaXMgbWFuZGF0b3J5LiBJdCBtdXN0IGF0IGxlYXN0IGNvbnRhaW5zCi10aGUgYCdjbGFzcydgIHN1Yi1vcHRpb24gd2hpY2ggZGVmaW5lcyB0aGUgcmVwbGljYXRpb24gc3RyYXRlZ3kgY2xhc3MgdG8KLXVzZS4gVGhlIHJlc3Qgb2YgdGhlIHN1Yi1vcHRpb25zIGRlcGVuZHMgb24gdGhhdCByZXBsaWNhdGlvbiBzdHJhdGVneQotY2xhc3MuIEJ5IGRlZmF1bHQsIENhc3NhbmRyYSBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgYCdjbGFzcydgOgotCi0qIGAnU2ltcGxlU3RyYXRlZ3knYDogQSBzaW1wbGUgc3RyYXRlZ3kgdGhhdCBkZWZpbmVzIGEgc2ltcGxlCi1yZXBsaWNhdGlvbiBmYWN0b3IgZm9yIHRoZSB3aG9sZSBjbHVzdGVyLiBUaGUgb25seSBzdWItb3B0aW9ucyBzdXBwb3J0ZWQKLWlzIGAncmVwbGljYXRpb25fZmFjdG9yJ2AgdG8gZGVmaW5lIHRoYXQgcmVwbGljYXRpb24gZmFjdG9yIGFuZCBpcwotbWFuZGF0b3J5LgotKiBgJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5J2A6IEEgcmVwbGljYXRpb24gc3RyYXRlZ3kgdGhhdCBhbGxvd3MgdG8gc2V0Ci10aGUgcmVwbGljYXRpb24gZmFjdG9yIGluZGVwZW5kZW50bHkgZm9yIGVhY2ggZGF0YS1jZW50ZXIuIFRoZSByZXN0IG9mCi10aGUgc3ViLW9wdGlvbnMgYXJlIGtleS12YWx1ZSBwYWlycyB3aGVyZSBlYWNoIHRpbWUgdGhlIGtleSBpcyB0aGUgbmFtZQotb2YgYSBkYXRhY2VudGVyIGFuZCB0aGUgdmFsdWUgdGhlIHJlcGxpY2F0aW9uIGZhY3RvciBmb3IgdGhhdAotZGF0YS1jZW50ZXIuCi0KLUF0dGVtcHRpbmcgdG8gY3JlYXRlIGFuIGFscmVhZHkgZXhpc3Rpbmcga2V5c3BhY2Ugd2lsbCByZXR1cm4gYW4gZXJyb3IKLXVubGVzcyB0aGUgYElGIE5PVCBFWElTVFNgIG9wdGlvbiBpcyB1c2VkLiBJZiBpdCBpcyB1c2VkLCB0aGUgc3RhdGVtZW50Ci13aWxsIGJlIGEgbm8tb3AgaWYgdGhlIGtleXNwYWNlIGFscmVhZHkgZXhpc3RzLgotCi1bW3VzZVN0bXRdXQotPT09PSBVU0UKLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuIDo6PSBVU0UKLQotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuIFVTRSBteUFwcDsKLQotVGhlIGBVU0VgIHN0YXRlbWVudCB0YWtlcyBhbiBleGlzdGluZyBrZXlzcGFjZSBuYW1lIGFzIGFyZ3VtZW50IGFuZCBzZXQKLWl0IGFzIHRoZSBwZXItY29ubmVjdGlvbiBjdXJyZW50IHdvcmtpbmcga2V5c3BhY2UuIEFsbCBzdWJzZXF1ZW50Ci1rZXlzcGFjZS1zcGVjaWZpYyBhY3Rpb25zIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBjb250ZXh0IG9mIHRoZQotc2VsZWN0ZWQga2V5c3BhY2UsIHVubGVzcyBsaW5rOiNzdGF0ZW1lbnRzW290aGVyd2lzZSBzcGVjaWZpZWRdLCB1bnRpbAotYW5vdGhlciBVU0Ugc3RhdGVtZW50IGlzIGlzc3VlZCBvciB0aGUgY29ubmVjdGlvbiB0ZXJtaW5hdGVzLgotCi1bW2FsdGVyS2V5c3BhY2VTdG10XV0KLT09PT0gQUxURVIgS0VZU1BBQ0UKLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuLiArCi06Oj0gQUxURVIgS0VZU1BBQ0UgKElGIEVYSVNUUyk/IFdJVEggICsKLXAuICsKLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLi4gKwotQUxURVIgS0VZU1BBQ0UgRXhjZWxzaW9yICsKLVdJVEggcmVwbGljYXRpb24gPSBce+KAmWNsYXNz4oCZOiBgU2ltcGxlU3RyYXRlZ3knLCBgcmVwbGljYXRpb25fZmFjdG9yJyA6Ci00fTsKLQotVGhlIGBBTFRFUiBLRVlTUEFDRWAgc3RhdGVtZW50IGFsdGVycyB0aGUgcHJvcGVydGllcyBvZiBhbiBleGlzdGluZwota2V5c3BhY2UuIFRoZSBzdXBwb3J0ZWQgYDxwcm9wZXJ0aWVzPmAgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUKLWxpbms6I2NyZWF0ZUtleXNwYWNlU3RtdFtgQ1JFQVRFIEtFWVNQQUNFYF0gc3RhdGVtZW50LgotCi1bW2Ryb3BLZXlzcGFjZVN0bXRdXQotPT09PSBEUk9QIEtFWVNQQUNFCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLiA6Oj0gRFJPUCBLRVlTUEFDRSAoIElGIEVYSVNUUyApPwotCi1fU2FtcGxlOl8KLQotYmMoc2FtcGxlKS4gRFJPUCBLRVlTUEFDRSBteUFwcDsKLQotQSBgRFJPUCBLRVlTUEFDRWAgc3RhdGVtZW50IHJlc3VsdHMgaW4gdGhlIGltbWVkaWF0ZSwgaXJyZXZlcnNpYmxlCi1yZW1vdmFsIG9mIGFuIGV4aXN0aW5nIGtleXNwYWNlLCBpbmNsdWRpbmcgYWxsIGNvbHVtbiBmYW1pbGllcyBpbiBpdCwKLWFuZCBhbGwgZGF0YSBjb250YWluZWQgaW4gdGhvc2UgY29sdW1uIGZhbWlsaWVzLgotCi1JZiB0aGUga2V5c3BhY2UgZG9lcyBub3QgZXhpc3RzLCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLAotdW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCi0KLVtbY3JlYXRlVGFibGVTdG10XV0KLT09PT0gQ1JFQVRFIFRBQkxFCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLi4gKwotOjo9IENSRUFURSAoIFRBQkxFIHwgQ09MVU1ORkFNSUxZICkgKCBJRiBOT1QgRVhJU1RTICk/ICArCi1gKCcgKCBgLCcgKSogYCknICsKLSggV0lUSCAoIEFORCApKiApPwotCi06Oj0gKCBTVEFUSUMgKT8gKCBQUklNQVJZIEtFWSApPyArCi18IFBSSU1BUlkgS0VZIGAoJyAoIGAsJyApKiBgKScKLQotOjo9ICArCi18IGAoJyAoYCwnICkqIGApJwotCi06Oj0gICsKLXwgQ09NUEFDVCBTVE9SQUdFICsKLXwgQ0xVU1RFUklORyBPUkRFUiArCi1wLiArCi1fU2FtcGxlOl8KLQotYmMoc2FtcGxlKS4uICsKLUNSRUFURSBUQUJMRSBtb25rZXlTcGVjaWVzICggKwotc3BlY2llcyB0ZXh0IFBSSU1BUlkgS0VZLCArCi1jb21tb25fbmFtZSB0ZXh0LCArCi1wb3B1bGF0aW9uIHZhcmludCwgKwotYXZlcmFnZV9zaXplIGludCArCi0pIFdJVEggY29tbWVudD1gSW1wb3J0YW50IGJpb2xvZ2ljYWwgcmVjb3Jkcyc7Ci0KLUNSRUFURSBUQUJMRSB0aW1lbGluZSAoICsKLXVzZXJpZCB1dWlkLCArCi1wb3N0ZWRfbW9udGggaW50LCArCi1wb3N0ZWRfdGltZSB1dWlkLCArCi1ib2R5IHRleHQsICsKLXBvc3RlZF9ieSB0ZXh0LCArCi1QUklNQVJZIEtFWSAodXNlcmlkLCBwb3N0ZWRfbW9udGgsIHBvc3RlZF90aW1lKSArCi0pIFdJVEggY29tcGFjdGlvbiA9IFx7IGBjbGFzcycgOiBgTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneScgfTsgKwotcC4gKwotVGhlIGBDUkVBVEUgVEFCTEVgIHN0YXRlbWVudCBjcmVhdGVzIGEgbmV3IHRhYmxlLiBFYWNoIHN1Y2ggdGFibGUgaXMgYQotc2V0IG9mIF9yb3dzXyAodXN1YWxseSByZXByZXNlbnRpbmcgcmVsYXRlZCBlbnRpdGllcykgZm9yIHdoaWNoIGl0Ci1kZWZpbmVzIGEgbnVtYmVyIG9mIHByb3BlcnRpZXMuIEEgdGFibGUgaXMgZGVmaW5lZCBieSBhCi1saW5rOiNjcmVhdGVUYWJsZU5hbWVbbmFtZV0sIGl0IGRlZmluZXMgdGhlIGNvbHVtbnMgY29tcG9zaW5nIHJvd3Mgb2YKLXRoZSB0YWJsZSBhbmQgaGF2ZSBhIG51bWJlciBvZiBsaW5rOiNjcmVhdGVUYWJsZU9wdGlvbnNbb3B0aW9uc10uIE5vdGUKLXRoYXQgdGhlIGBDUkVBVEUgQ09MVU1ORkFNSUxZYCBzeW50YXggaXMgc3VwcG9ydGVkIGFzIGFuIGFsaWFzIGZvcgotYENSRUFURSBUQUJMRWAgKGZvciBoaXN0b3JpY2FsIHJlYXNvbnMpLgotCi1BdHRlbXB0aW5nIHRvIGNyZWF0ZSBhbiBhbHJlYWR5IGV4aXN0aW5nIHRhYmxlIHdpbGwgcmV0dXJuIGFuIGVycm9yCi11bmxlc3MgdGhlIGBJRiBOT1QgRVhJU1RTYCBvcHRpb24gaXMgdXNlZC4gSWYgaXQgaXMgdXNlZCwgdGhlIHN0YXRlbWVudAotd2lsbCBiZSBhIG5vLW9wIGlmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0cy4KLQotW1tjcmVhdGVUYWJsZU5hbWVdXQotPT09PT0gYDx0YWJsZW5hbWU+YAotCi1WYWxpZCB0YWJsZSBuYW1lcyBhcmUgdGhlIHNhbWUgYXMgdmFsaWQKLWxpbms6I2NyZWF0ZUtleXNwYWNlU3RtdFtrZXlzcGFjZSBuYW1lc10gKHVwIHRvIDMyIGNoYXJhY3RlcnMgbG9uZwotYWxwaGFudW1lcmljYWwgaWRlbnRpZmllcnMpLiBJZiB0aGUgdGFibGUgbmFtZSBpcyBwcm92aWRlZCBhbG9uZSwgdGhlCi10YWJsZSBpcyBjcmVhdGVkIHdpdGhpbiB0aGUgY3VycmVudCBrZXlzcGFjZSAoc2VlIGBVU0VgKSwgYnV0IGlmIGl0IGlzCi1wcmVmaXhlZCBieSBhbiBleGlzdGluZyBrZXlzcGFjZSBuYW1lIChzZWUKLWxpbms6I3N0YXRlbWVudHNbYDx0YWJsZW5hbWU+YF0gZ3JhbW1hciksIGl0IGlzIGNyZWF0ZWQgaW4gdGhlIHNwZWNpZmllZAota2V5c3BhY2UgKGJ1dCBkb2VzICpub3QqIGNoYW5nZSB0aGUgY3VycmVudCBrZXlzcGFjZSkuCi0KLVtbY3JlYXRlVGFibGVDb2x1bW5dXQotPT09PT0gYDxjb2x1bW4tZGVmaW5pdGlvbj5gCi0KLUEgYENSRUFURSBUQUJMRWAgc3RhdGVtZW50IGRlZmluZXMgdGhlIGNvbHVtbnMgdGhhdCByb3dzIG9mIHRoZSB0YWJsZQotY2FuIGhhdmUuIEEgX2NvbHVtbl8gaXMgZGVmaW5lZCBieSBpdHMgbmFtZSAoYW4gaWRlbnRpZmllcikgYW5kIGl0cyB0eXBlCi0oc2VlIHRoZSBsaW5rOiN0eXBlc1tkYXRhIHR5cGVzXSBzZWN0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gYWxsb3dlZAotdHlwZXMgYW5kIHRoZWlyIHByb3BlcnRpZXMpLgotCi1XaXRoaW4gYSB0YWJsZSwgYSByb3cgaXMgdW5pcXVlbHkgaWRlbnRpZmllZCBieSBpdHMgYFBSSU1BUlkgS0VZYCAob3IKLW1vcmUgc2ltcGx5IHRoZSBrZXkpLCBhbmQgaGVuY2UgYWxsIHRhYmxlIGRlZmluaXRpb25zICptdXN0KiBkZWZpbmUgYQotUFJJTUFSWSBLRVkgKGFuZCBvbmx5IG9uZSkuIEEgYFBSSU1BUlkgS0VZYCBpcyBjb21wb3NlZCBvZiBvbmUgb3IgbW9yZQotb2YgdGhlIGNvbHVtbnMgZGVmaW5lZCBpbiB0aGUgdGFibGUuIElmIHRoZSBgUFJJTUFSWSBLRVlgIGlzIG9ubHkgb25lCi1jb2x1bW4sIHRoaXMgY2FuIGJlIHNwZWNpZmllZCBkaXJlY3RseSBhZnRlciB0aGUgY29sdW1uIGRlZmluaXRpb24uCi1PdGhlcndpc2UsIGl0IG11c3QgYmUgc3BlY2lmaWVkIGJ5IGZvbGxvd2luZyBgUFJJTUFSWSBLRVlgIGJ5IHRoZQotY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY29sdW1uIG5hbWVzIGNvbXBvc2luZyB0aGUga2V5IHdpdGhpbgotcGFyZW50aGVzaXMuIE5vdGUgdGhhdDoKLQotYmMoc2FtcGxlKS4gKwotQ1JFQVRFIFRBQkxFIHQgKCArCi1rIGludCBQUklNQVJZIEtFWSwgKwotb3RoZXIgdGV4dCArCi0pCi0KLWlzIGVxdWl2YWxlbnQgdG8KLQotYmMoc2FtcGxlKS4gKwotQ1JFQVRFIFRBQkxFIHQgKCArCi1rIGludCwgKwotb3RoZXIgdGV4dCwgKwotUFJJTUFSWSBLRVkgKGspICsKLSkKLQotW1tjcmVhdGVUYWJsZXBhcnRpdGlvbkNsdXN0ZXJpbmddXQotPT09PT0gUGFydGl0aW9uIGtleSBhbmQgY2x1c3RlcmluZyBjb2x1bW5zCi0KLUluIENRTCwgdGhlIG9yZGVyIGluIHdoaWNoIGNvbHVtbnMgYXJlIGRlZmluZWQgZm9yIHRoZSBgUFJJTUFSWSBLRVlgCi1tYXR0ZXJzLiBUaGUgZmlyc3QgY29sdW1uIG9mIHRoZSBrZXkgaXMgY2FsbGVkIHRoZSBfcGFydGl0aW9uIGtleV8uIEl0Ci1oYXMgdGhlIHByb3BlcnR5IHRoYXQgYWxsIHRoZSByb3dzIHNoYXJpbmcgdGhlIHNhbWUgcGFydGl0aW9uIGtleSAoZXZlbgotYWNyb3NzIHRhYmxlIGluIGZhY3QpIGFyZSBzdG9yZWQgb24gdGhlIHNhbWUgcGh5c2ljYWwgbm9kZS4gQWxzbywKLWluc2VydGlvbi91cGRhdGUvZGVsZXRpb24gb24gcm93cyBzaGFyaW5nIHRoZSBzYW1lIHBhcnRpdGlvbiBrZXkgZm9yIGEKLWdpdmVuIHRhYmxlIGFyZSBwZXJmb3JtZWQgX2F0b21pY2FsbHlfIGFuZCBpbiBfaXNvbGF0aW9uXy4gTm90ZSB0aGF0IGl0Ci1pcyBwb3NzaWJsZSB0byBoYXZlIGEgY29tcG9zaXRlIHBhcnRpdGlvbiBrZXksIGkuZS4gYSBwYXJ0aXRpb24ga2V5Ci1mb3JtZWQgb2YgbXVsdGlwbGUgY29sdW1ucywgdXNpbmcgYW4gZXh0cmEgc2V0IG9mIHBhcmVudGhlc2VzIHRvIGRlZmluZQotd2hpY2ggY29sdW1ucyBmb3JtcyB0aGUgcGFydGl0aW9uIGtleS4KLQotVGhlIHJlbWFpbmluZyBjb2x1bW5zIG9mIHRoZSBgUFJJTUFSWSBLRVlgIGRlZmluaXRpb24sIGlmIGFueSwgYXJlCi1jYWxsZWQgX19jbHVzdGVyaW5nIGNvbHVtbnMuIE9uIGEgZ2l2ZW4gcGh5c2ljYWwgbm9kZSwgcm93cyBmb3IgYSBnaXZlbgotcGFydGl0aW9uIGtleSBhcmUgc3RvcmVkIGluIHRoZSBvcmRlciBpbmR1Y2VkIGJ5IHRoZSBjbHVzdGVyaW5nIGNvbHVtbnMsCi1tYWtpbmcgdGhlIHJldHJpZXZhbCBvZiByb3dzIGluIHRoYXQgY2x1c3RlcmluZyBvcmRlciBwYXJ0aWN1bGFybHkKLWVmZmljaWVudCAoc2VlIGBTRUxFQ1RgKS4KLQotW1tjcmVhdGVUYWJsZVN0YXRpY11dCi09PT09PSBgU1RBVElDYCBjb2x1bW5zCi0KLVNvbWUgY29sdW1ucyBjYW4gYmUgZGVjbGFyZWQgYXMgYFNUQVRJQ2AgaW4gYSB0YWJsZSBkZWZpbml0aW9uLiBBIGNvbHVtbgotdGhhdCBpcyBzdGF0aWMgd2lsbCBiZSBgYHNoYXJlZCcnIGJ5IGFsbCB0aGUgcm93cyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUKLXBhcnRpdGlvbiAoaGF2aW5nIHRoZSBzYW1lIHBhcnRpdGlvbiBrZXkpLiBGb3IgaW5zdGFuY2UsIGluOgotCi1iYyhzYW1wbGUpLiArCi1DUkVBVEUgVEFCTEUgdGVzdCAoICsKLXBrIGludCwgKwotdCBpbnQsICsKLXYgdGV4dCwgKwotcyB0ZXh0IHN0YXRpYywgKwotUFJJTUFSWSBLRVkgKHBrLCB0KSArCi0pOyArCi1JTlNFUlQgSU5UTyB0ZXN0KHBrLCB0LCB2LCBzKSBWQUxVRVMgKDAsIDAsIGB2YWwwJywgYHN0YXRpYzAnKTsgKwotSU5TRVJUIElOVE8gdGVzdChwaywgdCwgdiwgcykgVkFMVUVTICgwLCAxLCBgdmFsMScsIGBzdGF0aWMxJyk7ICsKLVNFTEVDVCAqIEZST00gdGVzdCBXSEVSRSBwaz0wIEFORCB0PTA7Ci0KLXRoZSBsYXN0IHF1ZXJ5IHdpbGwgcmV0dXJuIGAnc3RhdGljMSdgIGFzIHZhbHVlIGZvciBgc2AsIHNpbmNlIGBzYCBpcwotc3RhdGljIGFuZCB0aHVzIHRoZSAybmQgaW5zZXJ0aW9uIG1vZGlmaWVkIHRoaXMgYGBzaGFyZWQnJyB2YWx1ZS4gTm90ZQotaG93ZXZlciB0aGF0IHN0YXRpYyBjb2x1bW5zIGFyZSBvbmx5IHN0YXRpYyB3aXRoaW4gYSBnaXZlbiBwYXJ0aXRpb24sCi1hbmQgaWYgaW4gdGhlIGV4YW1wbGUgYWJvdmUgYm90aCByb3dzIHdoZXJlIGZyb20gZGlmZmVyZW50IHBhcnRpdGlvbnMKLShpLmUuIGlmIHRoZXkgaGFkIGRpZmZlcmVudCB2YWx1ZSBmb3IgYHBrYCksIHRoZW4gdGhlIDJuZCBpbnNlcnRpb24KLXdvdWxkIG5vdCBoYXZlIG1vZGlmaWVkIHRoZSB2YWx1ZSBvZiBgc2AgZm9yIHRoZSBmaXJzdCByb3cuCi0KLUEgZmV3IHJlc3RyaWN0aW9ucyBhcHBsaWVzIHRvIHdoZW4gc3RhdGljIGNvbHVtbnMgYXJlIGFsbG93ZWQ6Ci0KLSogdGFibGVzIHdpdGggdGhlIGBDT01QQUNUIFNUT1JBR0VgIG9wdGlvbiAoc2VlIGJlbG93KSBjYW5ub3QgaGF2ZSB0aGVtCi0qIGEgdGFibGUgd2l0aG91dCBjbHVzdGVyaW5nIGNvbHVtbnMgY2Fubm90IGhhdmUgc3RhdGljIGNvbHVtbnMgKGluIGEKLXRhYmxlIHdpdGhvdXQgY2x1c3RlcmluZyBjb2x1bW5zLCBldmVyeSBwYXJ0aXRpb24gaGFzIG9ubHkgb25lIHJvdywgYW5kCi1zbyBldmVyeSBjb2x1bW4gaXMgaW5oZXJlbnRseSBzdGF0aWMpLgotKiBvbmx5IG5vbiBgUFJJTUFSWSBLRVlgIGNvbHVtbnMgY2FuIGJlIHN0YXRpYwotCi1bW2NyZWF0ZVRhYmxlT3B0aW9uc11dCi09PT09PSBgPG9wdGlvbj5gCi0KLVRoZSBgQ1JFQVRFIFRBQkxFYCBzdGF0ZW1lbnQgc3VwcG9ydHMgYSBudW1iZXIgb2Ygb3B0aW9ucyB0aGF0IGNvbnRyb2xzCi10aGUgY29uZmlndXJhdGlvbiBvZiBhIG5ldyB0YWJsZS4gVGhlc2Ugb3B0aW9ucyBjYW4gYmUgc3BlY2lmaWVkIGFmdGVyCi10aGUgYFdJVEhgIGtleXdvcmQuCi0KLVRoZSBmaXJzdCBvZiB0aGVzZSBvcHRpb24gaXMgYENPTVBBQ1QgU1RPUkFHRWAuIFRoaXMgb3B0aW9uIGlzIG1haW5seQotdGFyZ2V0ZWQgdG93YXJkcyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvciBkZWZpbml0aW9ucyBjcmVhdGVkIGJlZm9yZQotQ1FMMyAoc2VlCi1odHRwOi8vd3d3LmRhdGFzdGF4LmNvbS9kZXYvYmxvZy90aHJpZnQtdG8tY3FsM1t3d3cuZGF0YXN0YXguY29tL2Rldi9ibG9nL3RocmlmdC10by1jcWwzXQotZm9yIG1vcmUgZGV0YWlscykuIFRoZSBvcHRpb24gYWxzbyBwcm92aWRlcyBhIHNsaWdodGx5IG1vcmUgY29tcGFjdAotbGF5b3V0IG9mIGRhdGEgb24gZGlzayBidXQgYXQgdGhlIHByaWNlIG9mIGRpbWluaXNoZWQgZmxleGliaWxpdHkgYW5kCi1leHRlbnNpYmlsaXR5IGZvciB0aGUgdGFibGUuIE1vc3Qgbm90YWJseSwgYENPTVBBQ1QgU1RPUkFHRWAgdGFibGVzCi1jYW5ub3QgaGF2ZSBjb2xsZWN0aW9ucyBub3Igc3RhdGljIGNvbHVtbnMgYW5kIGEgYENPTVBBQ1QgU1RPUkFHRWAgdGFibGUKLXdpdGggYXQgbGVhc3Qgb25lIGNsdXN0ZXJpbmcgY29sdW1uIHN1cHBvcnRzIGV4YWN0bHkgb25lIChhcyBpbiBub3QgMAotbm9yIG1vcmUgdGhhbiAxKSBjb2x1bW4gbm90IHBhcnQgb2YgdGhlIGBQUklNQVJZIEtFWWAgZGVmaW5pdGlvbiAod2hpY2gKLWltcGx5IGluIHBhcnRpY3VsYXIgdGhhdCB5b3UgY2Fubm90IGFkZCBub3IgcmVtb3ZlIGNvbHVtbnMgYWZ0ZXIKLWNyZWF0aW9uKS4gRm9yIHRob3NlIHJlYXNvbnMsIGBDT01QQUNUIFNUT1JBR0VgIGlzIG5vdCByZWNvbW1lbmRlZAotb3V0c2lkZSBvZiB0aGUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSByZWFzb24gZXZva2VkIGFib3ZlLgotCi1Bbm90aGVyIG9wdGlvbiBpcyBgQ0xVU1RFUklORyBPUkRFUmAuIEl0IGFsbG93cyB0byBkZWZpbmUgdGhlIG9yZGVyaW5nCi1vZiByb3dzIG9uIGRpc2suIEl0IHRha2VzIHRoZSBsaXN0IG9mIHRoZSBjbHVzdGVyaW5nIGNvbHVtbiBuYW1lcyB3aXRoLAotZm9yIGVhY2ggb2YgdGhlbSwgdGhlIG9uLWRpc2sgb3JkZXIgKEFzY2VuZGluZyBvciBkZXNjZW5kaW5nKS4gTm90ZSB0aGF0Ci10aGlzIG9wdGlvbiBhZmZlY3RzIGxpbms6I3NlbGVjdE9yZGVyQnlbd2hhdCBgT1JERVIgQllgIGFyZSBhbGxvd2VkCi1kdXJpbmcgYFNFTEVDVGBdLgotCi1UYWJsZSBjcmVhdGlvbiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIG90aGVyIGA8cHJvcGVydHk+YDoKLQotW2NvbHM9IiwsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18b3B0aW9uIHxraW5kIHxkZWZhdWx0IHxkZXNjcmlwdGlvbgotfGBjb21tZW50YCB8X3NpbXBsZV8gfG5vbmUgfEEgZnJlZS1mb3JtLCBodW1hbi1yZWFkYWJsZSBjb21tZW50LgotCi18YGdjX2dyYWNlX3NlY29uZHNgIHxfc2ltcGxlXyB8ODY0MDAwIHxUaW1lIHRvIHdhaXQgYmVmb3JlIGdhcmJhZ2UKLWNvbGxlY3RpbmcgdG9tYnN0b25lcyAoZGVsZXRpb24gbWFya2VycykuCi0KLXxgYmxvb21fZmlsdGVyX2ZwX2NoYW5jZWAgfF9zaW1wbGVfIHwwLjAwMDc1IHxUaGUgdGFyZ2V0IHByb2JhYmlsaXR5IG9mCi1mYWxzZSBwb3NpdGl2ZSBvZiB0aGUgc3N0YWJsZSBibG9vbSBmaWx0ZXJzLiBTYWlkIGJsb29tIGZpbHRlcnMgd2lsbCBiZQotc2l6ZWQgdG8gcHJvdmlkZSB0aGUgcHJvdmlkZWQgcHJvYmFiaWxpdHkgKHRodXMgbG93ZXJpbmcgdGhpcyB2YWx1ZQotaW1wYWN0IHRoZSBzaXplIG9mIGJsb29tIGZpbHRlcnMgaW4tbWVtb3J5IGFuZCBvbi1kaXNrKQotCi18YGRlZmF1bHRfdGltZV90b19saXZlYCB8X3NpbXBsZV8gfDAgfFRoZSBkZWZhdWx0IGV4cGlyYXRpb24gdGltZQotKGBgVFRMJycpIGluIHNlY29uZHMgZm9yIGEgdGFibGUuCi0KLXxgY29tcGFjdGlvbmAgfF9tYXBfIHxfc2VlIGJlbG93XyB8Q29tcGFjdGlvbiBvcHRpb25zLCBzZWUKLWxpbms6I2NvbXBhY3Rpb25PcHRpb25zW2JlbG93XS4KLQotfGBjb21wcmVzc2lvbmAgfF9tYXBfIHxfc2VlIGJlbG93XyB8Q29tcHJlc3Npb24gb3B0aW9ucywgc2VlCi1saW5rOiNjb21wcmVzc2lvbk9wdGlvbnNbYmVsb3ddLgotCi18YGNhY2hpbmdgIHxfbWFwXyB8X3NlZSBiZWxvd18gfENhY2hpbmcgb3B0aW9ucywgc2VlCi1saW5rOiNjYWNoaW5nT3B0aW9uc1tiZWxvd10uCi18PT09Ci0KLVtbY29tcGFjdGlvbk9wdGlvbnNdXQotPT09PT0gQ29tcGFjdGlvbiBvcHRpb25zCi0KLVRoZSBgY29tcGFjdGlvbmAgcHJvcGVydHkgbXVzdCBhdCBsZWFzdCBkZWZpbmUgdGhlIGAnY2xhc3MnYCBzdWItb3B0aW9uLAotdGhhdCBkZWZpbmVzIHRoZSBjb21wYWN0aW9uIHN0cmF0ZWd5IGNsYXNzIHRvIHVzZS4gVGhlIGRlZmF1bHQgc3VwcG9ydGVkCi1jbGFzcyBhcmUgYCdTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5J2AsCi1gJ0xldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3knYCwgYCdEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5J2AgYW5kCi1gJ1RpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3knYC4gQ3VzdG9tIHN0cmF0ZWd5IGNhbiBiZSBwcm92aWRlZCBieQotc3BlY2lmeWluZyB0aGUgZnVsbCBjbGFzcyBuYW1lIGFzIGEgbGluazojY29uc3RhbnRzW3N0cmluZyBjb25zdGFudF0uCi1UaGUgcmVzdCBvZiB0aGUgc3ViLW9wdGlvbnMgZGVwZW5kcyBvbiB0aGUgY2hvc2VuIGNsYXNzLiBUaGUgc3ViLW9wdGlvbnMKLXN1cHBvcnRlZCBieSB0aGUgZGVmYXVsdCBjbGFzc2VzIGFyZToKLQotW2NvbHM9IiwsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18b3B0aW9uIHxzdXBwb3J0ZWQgY29tcGFjdGlvbiBzdHJhdGVneSB8ZGVmYXVsdCB8ZGVzY3JpcHRpb24KLXxgZW5hYmxlZGAgfF9hbGxfIHx0cnVlIHxBIGJvb2xlYW4gZGVub3Rpbmcgd2hldGhlciBjb21wYWN0aW9uIHNob3VsZCBiZQotZW5hYmxlZCBvciBub3QuCi0KLXxgdG9tYnN0b25lX3RocmVzaG9sZGAgfF9hbGxfIHwwLjIgfEEgcmF0aW8gc3VjaCB0aGF0IGlmIGEgc3N0YWJsZSBoYXMKLW1vcmUgdGhhbiB0aGlzIHJhdGlvIG9mIGdjYWJsZSB0b21ic3RvbmVzIG92ZXIgYWxsIGNvbnRhaW5lZCBjb2x1bW5zLAotdGhlIHNzdGFibGUgd2lsbCBiZSBjb21wYWN0ZWQgKHdpdGggbm8gb3RoZXIgc3N0YWJsZXMpIGZvciB0aGUgcHVycG9zZQotb2YgcHVyZ2luZyB0aG9zZSB0b21ic3RvbmVzLgotCi18YHRvbWJzdG9uZV9jb21wYWN0aW9uX2ludGVydmFsYCB8X2FsbF8gfDEgZGF5IHxUaGUgbWluaW11bSB0aW1lIHRvIHdhaXQKLWFmdGVyIGFuIHNzdGFibGUgY3JlYXRpb24gdGltZSBiZWZvcmUgY29uc2lkZXJpbmcgaXQgZm9yIGBgdG9tYnN0b25lCi1jb21wYWN0aW9uJycsIHdoZXJlIGBgdG9tYnN0b25lIGNvbXBhY3Rpb24nJyBpcyB0aGUgY29tcGFjdGlvbiB0cmlnZ2VyZWQKLWlmIHRoZSBzc3RhYmxlIGhhcyBtb3JlIGdjYWJsZSB0b21ic3RvbmVzIHRoYW4gYHRvbWJzdG9uZV90aHJlc2hvbGRgLgotCi18YHVuY2hlY2tlZF90b21ic3RvbmVfY29tcGFjdGlvbmAgfF9hbGxfIHxmYWxzZSB8U2V0dGluZyB0aGlzIHRvIHRydWUKLWVuYWJsZXMgbW9yZSBhZ2dyZXNzaXZlIHRvbWJzdG9uZSBjb21wYWN0aW9ucyAtIHNpbmdsZSBzc3RhYmxlIHRvbWJzdG9uZQotY29tcGFjdGlvbnMgd2lsbCBydW4gd2l0aG91dCBjaGVja2luZyBob3cgbGlrZWx5IGl0IGlzIHRoYXQgdGhleSB3aWxsIGJlCi1zdWNjZXNzZnVsLgotCi18YG1pbl9zc3RhYmxlX3NpemVgIHxTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5IHw1ME1CIHxUaGUgc2l6ZSB0aWVyZWQKLXN0cmF0ZWd5IGdyb3VwcyBTU1RhYmxlcyB0byBjb21wYWN0IGluIGJ1Y2tldHMuIEEgYnVja2V0IGdyb3VwcyBTU1RhYmxlcwotdGhhdCBkaWZmZXJzIGZyb20gbGVzcyB0aGFuIDUwJSBpbiBzaXplLiBIb3dldmVyLCBmb3Igc21hbGwgc2l6ZXMsIHRoaXMKLXdvdWxkIHJlc3VsdCBpbiBhIGJ1Y2tldGluZyB0aGF0IGlzIHRvbyBmaW5lIGdyYWluZWQuIGBtaW5fc3N0YWJsZV9zaXplYAotZGVmaW5lcyBhIHNpemUgdGhyZXNob2xkIChpbiBieXRlcykgYmVsb3cgd2hpY2ggYWxsIFNTVGFibGVzIGJlbG9uZyB0bwotb25lIHVuaXF1ZSBidWNrZXQKLQotfGBtaW5fdGhyZXNob2xkYCB8U2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSB8NCB8TWluaW11bSBudW1iZXIgb2YKLVNTVGFibGVzIG5lZWRlZCB0byBzdGFydCBhIG1pbm9yIGNvbXBhY3Rpb24uCi0KLXxgbWF4X3RocmVzaG9sZGAgfFNpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kgfDMyIHxNYXhpbXVtIG51bWJlciBvZgotU1NUYWJsZXMgcHJvY2Vzc2VkIGJ5IG9uZSBtaW5vciBjb21wYWN0aW9uLgotCi18YGJ1Y2tldF9sb3dgIHxTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5IHwwLjUgfFNpemUgdGllcmVkIGNvbnNpZGVyCi1zc3RhYmxlcyB0byBiZSB3aXRoaW4gdGhlIHNhbWUgYnVja2V0IGlmIHRoZWlyIHNpemUgaXMgd2l0aGluCi1bYXZlcmFnZV9zaXplICogYGJ1Y2tldF9sb3dgLCBhdmVyYWdlX3NpemUgKiBgYnVja2V0X2hpZ2hgIF0gKGkuZSB0aGUKLWRlZmF1bHQgZ3JvdXBzIHNzdGFibGUgd2hvc2Ugc2l6ZXMgZGl2ZXJnZXMgYnkgYXQgbW9zdCA1MCUpCi0KLXxgYnVja2V0X2hpZ2hgIHxTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5IHwxLjUgfFNpemUgdGllcmVkIGNvbnNpZGVyCi1zc3RhYmxlcyB0byBiZSB3aXRoaW4gdGhlIHNhbWUgYnVja2V0IGlmIHRoZWlyIHNpemUgaXMgd2l0aGluCi1bYXZlcmFnZV9zaXplICogYGJ1Y2tldF9sb3dgLCBhdmVyYWdlX3NpemUgKiBgYnVja2V0X2hpZ2hgIF0gKGkuZSB0aGUKLWRlZmF1bHQgZ3JvdXBzIHNzdGFibGUgd2hvc2Ugc2l6ZXMgZGl2ZXJnZXMgYnkgYXQgbW9zdCA1MCUpLgotCi18YHNzdGFibGVfc2l6ZV9pbl9tYmAgfExldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3kgfDVNQiB8VGhlIHRhcmdldCBzaXplCi0oaW4gTUIpIGZvciBzc3RhYmxlcyBpbiB0aGUgbGV2ZWxlZCBzdHJhdGVneS4gTm90ZSB0aGF0IHdoaWxlIHNzdGFibGUKLXNpemVzIHNob3VsZCBzdGF5IGxlc3Mgb3IgZXF1YWwgdG8gYHNzdGFibGVfc2l6ZV9pbl9tYmAsIGl0IGlzIHBvc3NpYmxlCi10byBleGNlcHRpb25hbGx5IGhhdmUgYSBsYXJnZXIgc3N0YWJsZSBhcyBkdXJpbmcgY29tcGFjdGlvbiwgZGF0YSBmb3IgYQotZ2l2ZW4gcGFydGl0aW9uIGtleSBhcmUgbmV2ZXIgc3BsaXQgaW50byAyIHNzdGFibGVzCi0KLXxgdGltZXN0YW1wX3Jlc29sdXRpb25gIHxEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5IHxNSUNST1NFQ09ORFMgfFRoZQotdGltZXN0YW1wIHJlc29sdXRpb24gdXNlZCB3aGVuIGluc2VydGluZyBkYXRhLCBjb3VsZCBiZSBNSUxMSVNFQ09ORFMsCi1NSUNST1NFQ09ORFMgZXRjIChzaG91bGQgYmUgdW5kZXJzdGFuZGFibGUgYnkgSmF2YSBUaW1lVW5pdCkgLSBkb27igJl0Ci1jaGFuZ2UgdGhpcyB1bmxlc3MgeW91IGRvIG11dGF0aW9ucyB3aXRoIFVTSU5HIFRJTUVTVEFNUCAob3IgZXF1aXZhbGVudAotZGlyZWN0bHkgaW4gdGhlIGNsaWVudCkKLQotfGBiYXNlX3RpbWVfc2Vjb25kc2AgfERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kgfDYwIHxUaGUgYmFzZSBzaXplIG9mCi10aGUgdGltZSB3aW5kb3dzLgotCi18YG1heF9zc3RhYmxlX2FnZV9kYXlzYCB8RGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSB8MzY1IHxTU1RhYmxlcwotb25seSBjb250YWluaW5nIGRhdGEgdGhhdCBpcyBvbGRlciB0aGFuIHRoaXMgd2lsbCBuZXZlciBiZSBjb21wYWN0ZWQuCi0KLXxgdGltZXN0YW1wX3Jlc29sdXRpb25gIHxUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5IHxNSUNST1NFQ09ORFMgfFRoZQotdGltZXN0YW1wIHJlc29sdXRpb24gdXNlZCB3aGVuIGluc2VydGluZyBkYXRhLCBjb3VsZCBiZSBNSUxMSVNFQ09ORFMsCi1NSUNST1NFQ09ORFMgZXRjIChzaG91bGQgYmUgdW5kZXJzdGFuZGFibGUgYnkgSmF2YSBUaW1lVW5pdCkgLSBkb27igJl0Ci1jaGFuZ2UgdGhpcyB1bmxlc3MgeW91IGRvIG11dGF0aW9ucyB3aXRoIFVTSU5HIFRJTUVTVEFNUCAob3IgZXF1aXZhbGVudAotZGlyZWN0bHkgaW4gdGhlIGNsaWVudCkKLQotfGBjb21wYWN0aW9uX3dpbmRvd191bml0YCB8VGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneSB8REFZUyB8VGhlIEphdmEKLVRpbWVVbml0IHVzZWQgZm9yIHRoZSB3aW5kb3cgc2l6ZSwgc2V0IGluIGNvbmp1bmN0aW9uIHdpdGgKLWBjb21wYWN0aW9uX3dpbmRvd19zaXplYC4gTXVzdCBiZSBvbmUgb2YgREFZUywgSE9VUlMsIE1JTlVURVMKLQotfGBjb21wYWN0aW9uX3dpbmRvd19zaXplYCB8VGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneSB8MSB8VGhlIG51bWJlcgotb2YgYGNvbXBhY3Rpb25fd2luZG93X3VuaXRgIHVuaXRzIHRoYXQgbWFrZSB1cCBhIHRpbWUgd2luZG93LgotCi18YHVuc2FmZV9hZ2dyZXNzaXZlX3NzdGFibGVfZXhwaXJhdGlvbmAgfFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kKLXxmYWxzZSB8RXhwaXJlZCBzc3RhYmxlcyB3aWxsIGJlIGRyb3BwZWQgd2l0aG91dCBjaGVja2luZyBpdHMgZGF0YSBpcwotc2hhZG93aW5nIG90aGVyIHNzdGFibGVzLiBUaGlzIGlzIGEgcG90ZW50aWFsbHkgcmlza3kgb3B0aW9uIHRoYXQgY2FuCi1sZWFkIHRvIGRhdGEgbG9zcyBvciBkZWxldGVkIGRhdGEgcmUtYXBwZWFyaW5nLCBnb2luZyBiZXlvbmQgd2hhdAotYHVuY2hlY2tlZF90b21ic3RvbmVfY29tcGFjdGlvbmAgZG9lcyBmb3Igc2luZ2xlIHNzdGFibGUgY29tcGFjdGlvbi4gRHVlCi10byB0aGUgcmlzayB0aGUganZtIG11c3QgYWxzbyBiZSBzdGFydGVkIHdpdGgKLWAtRGNhc3NhbmRyYS51bnNhZmVfYWdncmVzc2l2ZV9zc3RhYmxlX2V4cGlyYXRpb249dHJ1ZWAuCi18PT09Ci0KLVtbY29tcHJlc3Npb25PcHRpb25zXV0KLT09PT09IENvbXByZXNzaW9uIG9wdGlvbnMKLQotRm9yIHRoZSBgY29tcHJlc3Npb25gIHByb3BlcnR5LCB0aGUgZm9sbG93aW5nIHN1Yi1vcHRpb25zIGFyZSBhdmFpbGFibGU6Ci0KLVtjb2xzPSIsLCwsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18b3B0aW9uIHxkZWZhdWx0IHxkZXNjcmlwdGlvbiB8IHwgfAotfGBjbGFzc2AgfExaNENvbXByZXNzb3IgfFRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gdG8gdXNlLiBEZWZhdWx0Ci1jb21wcmVzc29yIGFyZTogTFo0Q29tcHJlc3NvciwgU25hcHB5Q29tcHJlc3NvciBhbmQgRGVmbGF0ZUNvbXByZXNzb3IuCi1Vc2UgYCdlbmFibGVkJyA6IGZhbHNlYCB0byBkaXNhYmxlIGNvbXByZXNzaW9uLiBDdXN0b20gY29tcHJlc3NvciBjYW4gYmUKLXByb3ZpZGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZ1bGwgY2xhc3MgbmFtZSBhcyBhIGxpbms6I2NvbnN0YW50c1tzdHJpbmcKLWNvbnN0YW50XS4gfCB8IHwKLQotfGBlbmFibGVkYCB8dHJ1ZSB8QnkgZGVmYXVsdCBjb21wcmVzc2lvbiBpcyBlbmFibGVkLiBUbyBkaXNhYmxlIGl0LCBzZXQKLWBlbmFibGVkYCB0byBgZmFsc2VgIHxgY2h1bmtfbGVuZ3RoX2luX2tiYCB8NjRLQiB8T24gZGlzayBTU1RhYmxlcyBhcmUKLWNvbXByZXNzZWQgYnkgYmxvY2sgKHRvIGFsbG93IHJhbmRvbSByZWFkcykuIFRoaXMgZGVmaW5lcyB0aGUgc2l6ZSAoaW4KLUtCKSBvZiBzYWlkIGJsb2NrLiBCaWdnZXIgdmFsdWVzIG1heSBpbXByb3ZlIHRoZSBjb21wcmVzc2lvbiByYXRlLCBidXQKLWluY3JlYXNlcyB0aGUgbWluaW11bSBzaXplIG9mIGRhdGEgdG8gYmUgcmVhZCBmcm9tIGRpc2sgZm9yIGEgcmVhZAotCi18YGNyY19jaGVja19jaGFuY2VgIHwxLjAgfFdoZW4gY29tcHJlc3Npb24gaXMgZW5hYmxlZCwgZWFjaCBjb21wcmVzc2VkCi1ibG9jayBpbmNsdWRlcyBhIGNoZWNrc3VtIG9mIHRoYXQgYmxvY2sgZm9yIHRoZSBwdXJwb3NlIG9mIGRldGVjdGluZwotZGlzayBiaXRyb3QgYW5kIGF2b2lkaW5nIHRoZSBwcm9wYWdhdGlvbiBvZiBjb3JydXB0aW9uIHRvIG90aGVyIHJlcGxpY2EuCi1UaGlzIG9wdGlvbiBkZWZpbmVzIHRoZSBwcm9iYWJpbGl0eSB3aXRoIHdoaWNoIHRob3NlIGNoZWNrc3VtcyBhcmUKLWNoZWNrZWQgZHVyaW5nIHJlYWQuIEJ5IGRlZmF1bHQgdGhleSBhcmUgYWx3YXlzIGNoZWNrZWQuIFNldCB0byAwIHRvCi1kaXNhYmxlIGNoZWNrc3VtIGNoZWNraW5nIGFuZCB0byAwLjUgZm9yIGluc3RhbmNlIHRvIGNoZWNrIHRoZW0gZXZlcnkKLW90aGVyIHJlYWQgfCB8IHwKLXw9PT0KLQotW1tjYWNoaW5nT3B0aW9uc11dCi09PT09PSBDYWNoaW5nIG9wdGlvbnMKLQotRm9yIHRoZSBgY2FjaGluZ2AgcHJvcGVydHksIHRoZSBmb2xsb3dpbmcgc3ViLW9wdGlvbnMgYXJlIGF2YWlsYWJsZToKLQotW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxvcHRpb24gfGRlZmF1bHQgfGRlc2NyaXB0aW9uCi18YGtleXNgIHxBTEwgfFdoZXRoZXIgdG8gY2FjaGUga2V5cyAoYGBrZXkgY2FjaGUnJykgZm9yIHRoaXMgdGFibGUuCi1WYWxpZCB2YWx1ZXMgYXJlOiBgQUxMYCBhbmQgYE5PTkVgLgotCi18YHJvd3NfcGVyX3BhcnRpdGlvbmAgfE5PTkUgfFRoZSBhbW91bnQgb2Ygcm93cyB0byBjYWNoZSBwZXIgcGFydGl0aW9uCi0oYGByb3cgY2FjaGUnJykuIElmIGFuIGludGVnZXIgYG5gIGlzIHNwZWNpZmllZCwgdGhlIGZpcnN0IGBuYCBxdWVyaWVkCi1yb3dzIG9mIGEgcGFydGl0aW9uIHdpbGwgYmUgY2FjaGVkLiBPdGhlciBwb3NzaWJsZSBvcHRpb25zIGFyZSBgQUxMYCwgdG8KLWNhY2hlIGFsbCByb3dzIG9mIGEgcXVlcmllZCBwYXJ0aXRpb24sIG9yIGBOT05FYCB0byBkaXNhYmxlIHJvdyBjYWNoaW5nLgotfD09PQotCi09PT09PSBPdGhlciBjb25zaWRlcmF0aW9uczoKLQotKiBXaGVuIGxpbms6I2luc2VydFN0bXRbaW5zZXJ0aW5nXSAvIGxpbms6I3VwZGF0ZVN0bXRbdXBkYXRpbmddIGEgZ2l2ZW4KLXJvdywgbm90IGFsbCBjb2x1bW5zIG5lZWRzIHRvIGJlIGRlZmluZWQgKGV4Y2VwdCBmb3IgdGhvc2UgcGFydCBvZiB0aGUKLWtleSksIGFuZCBtaXNzaW5nIGNvbHVtbnMgb2NjdXB5IG5vIHNwYWNlIG9uIGRpc2suIEZ1cnRoZXJtb3JlLCBhZGRpbmcKLW5ldyBjb2x1bW5zIChzZWUgYEFMVEVSIFRBQkxFYCkgaXMgYSBjb25zdGFudCB0aW1lIG9wZXJhdGlvbi4gVGhlcmUgaXMKLXRodXMgbm8gbmVlZCB0byB0cnkgdG8gYW50aWNpcGF0ZSBmdXR1cmUgdXNhZ2UgKG9yIHRvIGNyeSB3aGVuIHlvdQotaGF2ZW7igJl0KSB3aGVuIGNyZWF0aW5nIGEgdGFibGUuCi0KLVtbYWx0ZXJUYWJsZVN0bXRdXQotPT09PSBBTFRFUiBUQUJMRQotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4uICsKLTo6PSBBTFRFUiAoVEFCTEUgfCBDT0xVTU5GQU1JTFkpIChJRiBFWElTVFMpPwotCi06Oj0gQUREIChJRiBOT1QgRVhJU1RTKT8gKwotfCBBREQgIChJRiBOT1QgRVhJU1RTKT8gKCAoICwgKSogKSArCi18IERST1AgKElGIEVYSVNUUyk/ICArCi18IERST1AgKElGIEVYSVNUUyk/ICggKCAsICkqICkgKwotfCBSRU5BTUUgKElGIEVYSVNUUyk/IFRPIChBTkQgVE8pKiArCi18IFdJVEggKCBBTkQgKSogKwotcC4gKwotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuLiArCi1BTFRFUiBUQUJMRSBhZGRhbXNGYW1pbHkKLQotQUxURVIgVEFCTEUgYWRkYW1zRmFtaWx5ICsKLUFERCBncmF2ZXNpdGUgdmFyY2hhcjsKLQotQUxURVIgVEFCTEUgYWRkYW1zRmFtaWx5ICsKLVdJVEggY29tbWVudCA9IGBBIG1vc3QgZXhjZWxsZW50IGFuZCB1c2VmdWwgY29sdW1uIGZhbWlseSc7ICsKLXAuICsKLVRoZSBgQUxURVJgIHN0YXRlbWVudCBpcyB1c2VkIHRvIG1hbmlwdWxhdGUgdGFibGUgZGVmaW5pdGlvbnMuIEl0IGFsbG93cwotZm9yIGFkZGluZyBuZXcgY29sdW1ucywgZHJvcHBpbmcgZXhpc3Rpbmcgb25lcywgb3IgdXBkYXRpbmcgdGhlIHRhYmxlCi1vcHRpb25zLiBBcyB3aXRoIHRhYmxlIGNyZWF0aW9uLCBgQUxURVIgQ09MVU1ORkFNSUxZYCBpcyBhbGxvd2VkIGFzIGFuCi1hbGlhcyBmb3IgYEFMVEVSIFRBQkxFYC4KLUlmIHRoZSB0YWJsZSBkb2VzIG5vdCBleGlzdCwgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCi0KLVRoZSBgPHRhYmxlbmFtZT5gIGlzIHRoZSB0YWJsZSBuYW1lIG9wdGlvbmFsbHkgcHJlY2VkZWQgYnkgdGhlIGtleXNwYWNlCi1uYW1lLiBUaGUgYDxpbnN0cnVjdGlvbj5gIGRlZmluZXMgdGhlIGFsdGVyYXRpb24gdG8gcGVyZm9ybToKLQotKiBgQUREYDogQWRkcyBhIG5ldyBjb2x1bW4gdG8gdGhlIHRhYmxlLiBUaGUgYDxpZGVudGlmaWVyPmAgZm9yIHRoZSBuZXcKLWNvbHVtbiBtdXN0IG5vdCBjb25mbGljdCB3aXRoIGFuIGV4aXN0aW5nIGNvbHVtbi4gTW9yZW92ZXIsIGNvbHVtbnMKLWNhbm5vdCBiZSBhZGRlZCB0byB0YWJsZXMgZGVmaW5lZCB3aXRoIHRoZSBgQ09NUEFDVCBTVE9SQUdFYCBvcHRpb24uCi1JZiB0aGUgbmV3IGNvbHVtbiBhbHJlYWR5IGV4aXN0cywgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBOT1QgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgotKiBgRFJPUGA6IFJlbW92ZXMgYSBjb2x1bW4gZnJvbSB0aGUgdGFibGUuIERyb3BwZWQgY29sdW1ucyB3aWxsCi1pbW1lZGlhdGVseSBiZWNvbWUgdW5hdmFpbGFibGUgaW4gdGhlIHF1ZXJpZXMgYW5kIHdpbGwgbm90IGJlIGluY2x1ZGVkCi1pbiBjb21wYWN0ZWQgc3N0YWJsZXMgaW4gdGhlIGZ1dHVyZS4gSWYgYSBjb2x1bW4gaXMgcmVhZGRlZCwgcXVlcmllcwotd29u4oCZdCByZXR1cm4gdmFsdWVzIHdyaXR0ZW4gYmVmb3JlIHRoZSBjb2x1bW4gd2FzIGxhc3QgZHJvcHBlZC4gSXQgaXMKLWFzc3VtZWQgdGhhdCB0aW1lc3RhbXBzIHJlcHJlc2VudCBhY3R1YWwgdGltZSwgc28gaWYgdGhpcyBpcyBub3QgeW91cgotY2FzZSwgeW91IHNob3VsZCBOT1QgcmVhZCBwcmV2aW91c2x5IGRyb3BwZWQgY29sdW1ucy4gQ29sdW1ucyBjYW7igJl0IGJlCi1kcm9wcGVkIGZyb20gdGFibGVzIGRlZmluZWQgd2l0aCB0aGUgYENPTVBBQ1QgU1RPUkFHRWAgb3B0aW9uLgotSWYgdGhlIGRyb3BwZWQgY29sdW1uIGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgotKiBgUkVOQU1FYCBhIHByaW1hcnkga2V5IGNvbHVtbiBvZiBhIHRhYmxlLiBOb24gcHJpbWFyeSBrZXkgY29sdW1ucyBjYW5ub3QgYmUgcmVuYW1lZC4KLUZ1cnRoZXJtb3JlLCByZW5hbWluZyBhIGNvbHVtbiB0byBhbm90aGVyIG5hbWUgd2hpY2ggYWxyZWFkeSBleGlzdHMgaXNuJ3QgYWxsb3dlZC4KLUl0J3MgaW1wb3J0YW50IHRvIGtlZXAgaW4gbWluZCB0aGF0IHJlbmFtZWQgY29sdW1ucyBzaG91bGRuJ3QgaGF2ZSBkZXBlbmRlbnQgc2Vjb25kYXkgaW5kZXhlcy4KLUlmIHRoZSByZW5hbWVkIGNvbHVtbiBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLCB1bmxlc3MgYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KLQotKiBgV0lUSGA6IEFsbG93cyB0byB1cGRhdGUgdGhlIG9wdGlvbnMgb2YgdGhlIHRhYmxlLiBUaGUKLWxpbms6I2NyZWF0ZVRhYmxlT3B0aW9uc1tzdXBwb3J0ZWQgYDxvcHRpb24+YF0gKGFuZCBzeW50YXgpIGFyZSB0aGUgc2FtZQotYXMgZm9yIHRoZSBgQ1JFQVRFIFRBQkxFYCBzdGF0ZW1lbnQgZXhjZXB0IHRoYXQgYENPTVBBQ1QgU1RPUkFHRWAgaXMgbm90Ci1zdXBwb3J0ZWQuIE5vdGUgdGhhdCBzZXR0aW5nIGFueSBgY29tcGFjdGlvbmAgc3ViLW9wdGlvbnMgaGFzIHRoZSBlZmZlY3QKLW9mIGVyYXNpbmcgYWxsIHByZXZpb3VzIGBjb21wYWN0aW9uYCBvcHRpb25zLCBzbyB5b3UgbmVlZCB0byByZS1zcGVjaWZ5Ci1hbGwgdGhlIHN1Yi1vcHRpb25zIGlmIHlvdSB3YW50IHRvIGtlZXAgdGhlbS4gVGhlIHNhbWUgbm90ZSBhcHBsaWVzIHRvCi10aGUgc2V0IG9mIGBjb21wcmVzc2lvbmAgc3ViLW9wdGlvbnMuCi0KLT09PT09IENRTCB0eXBlIGNvbXBhdGliaWxpdHk6Ci0KLUNRTCBkYXRhIHR5cGVzIG1heSBiZSBjb252ZXJ0ZWQgb25seSBhcyB0aGUgZm9sbG93aW5nIHRhYmxlLgotCi1bY29scz0iLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18RGF0YSB0eXBlIG1heSBiZSBhbHRlcmVkIHRvOiB8RGF0YSB0eXBlCi18dGltZXN0YW1wIHxiaWdpbnQKLQotfGFzY2lpLCBiaWdpbnQsIGJvb2xlYW4sIGRhdGUsIGRlY2ltYWwsIGRvdWJsZSwgZmxvYXQsIGluZXQsIGludCwKLXNtYWxsaW50LCB0ZXh0LCB0aW1lLCB0aW1lc3RhbXAsIHRpbWV1dWlkLCB0aW55aW50LCB1dWlkLCB2YXJjaGFyLAotdmFyaW50IHxibG9iCi0KLXxpbnQgfGRhdGUKLQotfGFzY2lpLCB2YXJjaGFyIHx0ZXh0Ci0KLXxiaWdpbnQgfHRpbWUKLQotfGJpZ2ludCB8dGltZXN0YW1wCi0KLXx0aW1ldXVpZCB8dXVpZAotCi18YXNjaWksIHRleHQgfHZhcmNoYXIKLQotfGJpZ2ludCwgaW50LCB0aW1lc3RhbXAgfHZhcmludAotfD09PQotCi1DbHVzdGVyaW5nIGNvbHVtbnMgaGF2ZSBzdHJpY3RlciByZXF1aXJlbWVudHMsIG9ubHkgdGhlIGJlbG93Ci1jb252ZXJzaW9ucyBhcmUgYWxsb3dlZC4KLQotW2NvbHM9IiwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfERhdGEgdHlwZSBtYXkgYmUgYWx0ZXJlZCB0bzogfERhdGEgdHlwZQotfGFzY2lpLCB0ZXh0LCB2YXJjaGFyIHxibG9iCi18YXNjaWksIHZhcmNoYXIgfHRleHQKLXxhc2NpaSwgdGV4dCB8dmFyY2hhcgotfD09PQotCi1bW2Ryb3BUYWJsZVN0bXRdXQotPT09PSBEUk9QIFRBQkxFCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLiA6Oj0gRFJPUCBUQUJMRSAoIElGIEVYSVNUUyApPwotCi1fU2FtcGxlOl8KLQotYmMoc2FtcGxlKS4gRFJPUCBUQUJMRSB3b3JsZFNlcmllc0F0dGVuZGVlczsKLQotVGhlIGBEUk9QIFRBQkxFYCBzdGF0ZW1lbnQgcmVzdWx0cyBpbiB0aGUgaW1tZWRpYXRlLCBpcnJldmVyc2libGUKLXJlbW92YWwgb2YgYSB0YWJsZSwgaW5jbHVkaW5nIGFsbCBkYXRhIGNvbnRhaW5lZCBpbiBpdC4gQXMgZm9yIHRhYmxlCi1jcmVhdGlvbiwgYERST1AgQ09MVU1ORkFNSUxZYCBpcyBhbGxvd2VkIGFzIGFuIGFsaWFzIGZvciBgRFJPUCBUQUJMRWAuCi0KLUlmIHRoZSB0YWJsZSBkb2VzIG5vdCBleGlzdCwgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzCi1gSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgotCi1bW3RydW5jYXRlU3RtdF1dCi09PT09IFRSVU5DQVRFCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLiA6Oj0gVFJVTkNBVEUgKCBUQUJMRSB8IENPTFVNTkZBTUlMWSApPwotCi1fU2FtcGxlOl8KLQotYmMoc2FtcGxlKS4gVFJVTkNBVEUgc3VwZXJJbXBvcnRhbnREYXRhOwotCi1UaGUgYFRSVU5DQVRFYCBzdGF0ZW1lbnQgcGVybWFuZW50bHkgcmVtb3ZlcyBhbGwgZGF0YSBmcm9tIGEgdGFibGUuCi0KLVtbY3JlYXRlSW5kZXhTdG10XV0KLT09PT0gQ1JFQVRFIElOREVYCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLi4gKwotOjo9IENSRUFURSAoIENVU1RPTSApPyBJTkRFWCAoIElGIE5PVCBFWElTVFMgKT8gKCApPyArCi1PTiBgKCcgYCknICsKLSggVVNJTkcgKCBXSVRIIE9QVElPTlMgPSApPyApPwotCi06Oj0gICsKLXwga2V5cyggKSArCi1wLiArCi1fU2FtcGxlOl8KLQotYmMoc2FtcGxlKS4gKwotQ1JFQVRFIElOREVYIHVzZXJJbmRleCBPTiBOZXJkTW92aWVzICh1c2VyKTsgKwotQ1JFQVRFIElOREVYIE9OIE11dGFudHMgKGFiaWxpdHlJZCk7ICsKLUNSRUFURSBJTkRFWCBPTiB1c2VycyAoa2V5cyhmYXZzKSk7ICsKLUNSRUFURSBDVVNUT00gSU5ERVggT04gdXNlcnMgKGVtYWlsKSBVU0lORyBgcGF0aC50by50aGUuSW5kZXhDbGFzcyc7ICsKLUNSRUFURSBDVVNUT00gSU5ERVggT04gdXNlcnMgKGVtYWlsKSBVU0lORyBgcGF0aC50by50aGUuSW5kZXhDbGFzcycgV0lUSAotT1BUSU9OUyA9IFx74oCZc3RvcmFnZeKAmTogYC9tbnQvc3NkL2luZGV4ZXMvJ307Ci0KLVRoZSBgQ1JFQVRFIElOREVYYCBzdGF0ZW1lbnQgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgKGF1dG9tYXRpYykKLXNlY29uZGFyeSBpbmRleCBmb3IgYSBnaXZlbiAoZXhpc3RpbmcpIGNvbHVtbiBpbiBhIGdpdmVuIHRhYmxlLiBBIG5hbWUKLWZvciB0aGUgaW5kZXggaXRzZWxmIGNhbiBiZSBzcGVjaWZpZWQgYmVmb3JlIHRoZSBgT05gIGtleXdvcmQsIGlmCi1kZXNpcmVkLiBJZiBkYXRhIGFscmVhZHkgZXhpc3RzIGZvciB0aGUgY29sdW1uLCBpdCB3aWxsIGJlIGluZGV4ZWQKLWFzeW5jaHJvbm91c2x5LiBBZnRlciB0aGUgaW5kZXggaXMgY3JlYXRlZCwgbmV3IGRhdGEgZm9yIHRoZSBjb2x1bW4gaXMKLWluZGV4ZWQgYXV0b21hdGljYWxseSBhdCBpbnNlcnRpb24gdGltZS4KLQotQXR0ZW1wdGluZyB0byBjcmVhdGUgYW4gYWxyZWFkeSBleGlzdGluZyBpbmRleCB3aWxsIHJldHVybiBhbiBlcnJvcgotdW5sZXNzIHRoZSBgSUYgTk9UIEVYSVNUU2Agb3B0aW9uIGlzIHVzZWQuIElmIGl0IGlzIHVzZWQsIHRoZSBzdGF0ZW1lbnQKLXdpbGwgYmUgYSBuby1vcCBpZiB0aGUgaW5kZXggYWxyZWFkeSBleGlzdHMuCi0KLVtba2V5c0luZGV4XV0KLT09PT09IEluZGV4ZXMgb24gTWFwIEtleXMKLQotV2hlbiBjcmVhdGluZyBhbiBpbmRleCBvbiBhIGxpbms6I21hcFttYXAgY29sdW1uXSwgeW91IG1heSBpbmRleCBlaXRoZXIKLXRoZSBrZXlzIG9yIHRoZSB2YWx1ZXMuIElmIHRoZSBjb2x1bW4gaWRlbnRpZmllciBpcyBwbGFjZWQgd2l0aGluIHRoZQotYGtleXMoKWAgZnVuY3Rpb24sIHRoZSBpbmRleCB3aWxsIGJlIG9uIHRoZSBtYXAga2V5cywgYWxsb3dpbmcgeW91IHRvCi11c2UgYENPTlRBSU5TIEtFWWAgaW4gYFdIRVJFYCBjbGF1c2VzLiBPdGhlcndpc2UsIHRoZSBpbmRleCB3aWxsIGJlIG9uCi10aGUgbWFwIHZhbHVlcy4KLQotW1tkcm9wSW5kZXhTdG10XV0KLT09PT0gRFJPUCBJTkRFWAotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4gOjo9IERST1AgSU5ERVggKCBJRiBFWElTVFMgKT8gKCBgLicgKT8KLQotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuLiArCi1EUk9QIElOREVYIHVzZXJJbmRleDsKLQotRFJPUCBJTkRFWCB1c2Vya2V5c3BhY2UuYWRkcmVzc19pbmRleDsgKwotcC4gKwotVGhlIGBEUk9QIElOREVYYCBzdGF0ZW1lbnQgaXMgdXNlZCB0byBkcm9wIGFuIGV4aXN0aW5nIHNlY29uZGFyeSBpbmRleC4KLVRoZSBhcmd1bWVudCBvZiB0aGUgc3RhdGVtZW50IGlzIHRoZSBpbmRleCBuYW1lLCB3aGljaCBtYXkgb3B0aW9uYWxseQotc3BlY2lmeSB0aGUga2V5c3BhY2Ugb2YgdGhlIGluZGV4LgotCi1JZiB0aGUgaW5kZXggZG9lcyBub3QgZXhpc3RzLCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLCB1bmxlc3MKLWBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCi0KLVtbY3JlYXRlTVZTdG10XV0KLT09PT0gQ1JFQVRFIE1BVEVSSUFMSVpFRCBWSUVXCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLi4gKwotOjo9IENSRUFURSBNQVRFUklBTElaRUQgVklFVyAoIElGIE5PVCBFWElTVFMgKT8gQVMgKwotU0VMRUNUICggYCgnICggYCwnICkgKiBgKScgfCBgKicgKSArCi1GUk9NICArCi0oIFdIRVJFICk/ICsKLVBSSU1BUlkgS0VZIGAoJyAoIGAsJyApKiBgKScgKwotKCBXSVRIICggQU5EICkqICk/ICsKLXAuICsKLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLi4gKwotQ1JFQVRFIE1BVEVSSUFMSVpFRCBWSUVXIG1vbmtleVNwZWNpZXNfYnlfcG9wdWxhdGlvbiBBUyArCi1TRUxFQ1QgKiArCi1GUk9NIG1vbmtleVNwZWNpZXMgKwotV0hFUkUgcG9wdWxhdGlvbiBJUyBOT1QgTlVMTCBBTkQgc3BlY2llcyBJUyBOT1QgTlVMTCArCi1QUklNQVJZIEtFWSAocG9wdWxhdGlvbiwgc3BlY2llcykgKwotV0lUSCBjb21tZW50PWBBbGxvdyBxdWVyeSBieSBwb3B1bGF0aW9uIGluc3RlYWQgb2Ygc3BlY2llcyc7ICsKLXAuICsKLVRoZSBgQ1JFQVRFIE1BVEVSSUFMSVpFRCBWSUVXYCBzdGF0ZW1lbnQgY3JlYXRlcyBhIG5ldyBtYXRlcmlhbGl6ZWQKLXZpZXcuIEVhY2ggc3VjaCB2aWV3IGlzIGEgc2V0IG9mIF9yb3dzXyB3aGljaCBjb3JyZXNwb25kcyB0byByb3dzIHdoaWNoCi1hcmUgcHJlc2VudCBpbiB0aGUgdW5kZXJseWluZywgb3IgYmFzZSwgdGFibGUgc3BlY2lmaWVkIGluIHRoZSBgU0VMRUNUYAotc3RhdGVtZW50LiBBIG1hdGVyaWFsaXplZCB2aWV3IGNhbm5vdCBiZSBkaXJlY3RseSB1cGRhdGVkLCBidXQgdXBkYXRlcwotdG8gdGhlIGJhc2UgdGFibGUgd2lsbCBjYXVzZSBjb3JyZXNwb25kaW5nIHVwZGF0ZXMgaW4gdGhlIHZpZXcuCi0KLUF0dGVtcHRpbmcgdG8gY3JlYXRlIGFuIGFscmVhZHkgZXhpc3RpbmcgbWF0ZXJpYWxpemVkIHZpZXcgd2lsbCByZXR1cm4KLWFuIGVycm9yIHVubGVzcyB0aGUgYElGIE5PVCBFWElTVFNgIG9wdGlvbiBpcyB1c2VkLiBJZiBpdCBpcyB1c2VkLCB0aGUKLXN0YXRlbWVudCB3aWxsIGJlIGEgbm8tb3AgaWYgdGhlIG1hdGVyaWFsaXplZCB2aWV3IGFscmVhZHkgZXhpc3RzLgotCi1bW2NyZWF0ZU1WV2hlcmVdXQotPT09PT0gYFdIRVJFYCBDbGF1c2UKLQotVGhlIGA8d2hlcmUtY2xhdXNlPmAgaXMgc2ltaWxhciB0byB0aGUgbGluazojc2VsZWN0V2hlcmVbd2hlcmUgY2xhdXNlIG9mCi1hIGBTRUxFQ1RgIHN0YXRlbWVudF0sIHdpdGggYSBmZXcgZGlmZmVyZW5jZXMuIEZpcnN0LCB0aGUgd2hlcmUgY2xhdXNlCi1tdXN0IGNvbnRhaW4gYW4gZXhwcmVzc2lvbiB0aGF0IGRpc2FsbG93cyBgTlVMTGAgdmFsdWVzIGluIGNvbHVtbnMgaW4KLXRoZSB2aWV34oCZcyBwcmltYXJ5IGtleS4gSWYgbm8gb3RoZXIgcmVzdHJpY3Rpb24gaXMgZGVzaXJlZCwgdGhpcyBjYW4gYmUKLWFjY29tcGxpc2hlZCB3aXRoIGFuIGBJUyBOT1QgTlVMTGAgZXhwcmVzc2lvbi4gU2Vjb25kLCBvbmx5IGNvbHVtbnMKLXdoaWNoIGFyZSBpbiB0aGUgYmFzZSB0YWJsZeKAmXMgcHJpbWFyeSBrZXkgbWF5IGJlIHJlc3RyaWN0ZWQgd2l0aAotZXhwcmVzc2lvbnMgb3RoZXIgdGhhbiBgSVMgTk9UIE5VTExgLiAoTm90ZSB0aGF0IHRoaXMgc2Vjb25kIHJlc3RyaWN0aW9uCi1tYXkgYmUgbGlmdGVkIGluIHRoZSBmdXR1cmUuKQotCi1bW2FsdGVyTVZTdG10XV0KLT09PT0gQUxURVIgTUFURVJJQUxJWkVEIFZJRVcKLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuIDo6PSBBTFRFUiBNQVRFUklBTElaRUQgVklFVyAgKwotV0lUSCAoIEFORCApKgotCi1UaGUgYEFMVEVSIE1BVEVSSUFMSVpFRCBWSUVXYCBzdGF0ZW1lbnQgYWxsb3dzIG9wdGlvbnMgdG8gYmUgdXBkYXRlOwotdGhlc2Ugb3B0aW9ucyBhcmUgdGhlIHNhbWUgYXMgYENSRUFURSBUQUJMRWDigJlzIG9wdGlvbnMuCi0KLVtbZHJvcE1WU3RtdF1dCi09PT09IERST1AgTUFURVJJQUxJWkVEIFZJRVcKLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuIDo6PSBEUk9QIE1BVEVSSUFMSVpFRCBWSUVXICggSUYgRVhJU1RTICk/Ci0KLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLiBEUk9QIE1BVEVSSUFMSVpFRCBWSUVXIG1vbmtleVNwZWNpZXNfYnlfcG9wdWxhdGlvbjsKLQotVGhlIGBEUk9QIE1BVEVSSUFMSVpFRCBWSUVXYCBzdGF0ZW1lbnQgaXMgdXNlZCB0byBkcm9wIGFuIGV4aXN0aW5nCi1tYXRlcmlhbGl6ZWQgdmlldy4KLQotSWYgdGhlIG1hdGVyaWFsaXplZCB2aWV3IGRvZXMgbm90IGV4aXN0cywgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbgotZXJyb3IsIHVubGVzcyBgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhCi1uby1vcC4KLQotW1tjcmVhdGVUeXBlU3RtdF1dCi09PT09IENSRUFURSBUWVBFCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLi4gKwotOjo9IENSRUFURSBUWVBFICggSUYgTk9UIEVYSVNUUyApPyAgKwotYCgnICggYCwnICkqIGApJwotCi06Oj0gKCBgLicgKT8KLQotOjo9Ci0KLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLi4gKwotQ1JFQVRFIFRZUEUgYWRkcmVzcyAoICsKLXN0cmVldF9uYW1lIHRleHQsICsKLXN0cmVldF9udW1iZXIgaW50LCArCi1jaXR5IHRleHQsICsKLXN0YXRlIHRleHQsICsKLXppcCBpbnQgKwotKQotCi1DUkVBVEUgVFlQRSB3b3JrX2FuZF9ob21lX2FkZHJlc3NlcyAoICsKLWhvbWVfYWRkcmVzcyBhZGRyZXNzLCArCi13b3JrX2FkZHJlc3MgYWRkcmVzcyArCi0pICsKLXAuICsKLVRoZSBgQ1JFQVRFIFRZUEVgIHN0YXRlbWVudCBjcmVhdGVzIGEgbmV3IHVzZXItZGVmaW5lZCB0eXBlLiBFYWNoIHR5cGUKLWlzIGEgc2V0IG9mIG5hbWVkLCB0eXBlZCBmaWVsZHMuIEZpZWxkIHR5cGVzIG1heSBiZSBhbnkgdmFsaWQgdHlwZSwKLWluY2x1ZGluZyBjb2xsZWN0aW9ucyBhbmQgb3RoZXIgZXhpc3RpbmcgdXNlci1kZWZpbmVkIHR5cGVzLgotCi1BdHRlbXB0aW5nIHRvIGNyZWF0ZSBhbiBhbHJlYWR5IGV4aXN0aW5nIHR5cGUgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IKLXVubGVzcyB0aGUgYElGIE5PVCBFWElTVFNgIG9wdGlvbiBpcyB1c2VkLiBJZiBpdCBpcyB1c2VkLCB0aGUgc3RhdGVtZW50Ci13aWxsIGJlIGEgbm8tb3AgaWYgdGhlIHR5cGUgYWxyZWFkeSBleGlzdHMuCi0KLVtbY3JlYXRlVHlwZU5hbWVdXQotPT09PT0gYDx0eXBlbmFtZT5gCi0KLVZhbGlkIHR5cGUgbmFtZXMgYXJlIGlkZW50aWZpZXJzLiBUaGUgbmFtZXMgb2YgZXhpc3RpbmcgQ1FMIHR5cGVzIGFuZAotbGluazojYXBwZW5kaXhCW3Jlc2VydmVkIHR5cGUgbmFtZXNdIG1heSBub3QgYmUgdXNlZC4KLQotSWYgdGhlIHR5cGUgbmFtZSBpcyBwcm92aWRlZCBhbG9uZSwgdGhlIHR5cGUgaXMgY3JlYXRlZCB3aXRoIHRoZSBjdXJyZW50Ci1rZXlzcGFjZSAoc2VlIGBVU0VgKS4gSWYgaXQgaXMgcHJlZml4ZWQgYnkgYW4gZXhpc3Rpbmcga2V5c3BhY2UgbmFtZSwKLXRoZSB0eXBlIGlzIGNyZWF0ZWQgd2l0aGluIHRoZSBzcGVjaWZpZWQga2V5c3BhY2UgaW5zdGVhZCBvZiB0aGUgY3VycmVudAota2V5c3BhY2UuCi0KLVtbYWx0ZXJUeXBlU3RtdF1dCi09PT09IEFMVEVSIFRZUEUKLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuLiArCi06Oj0gQUxURVIgVFlQRSAoSUYgRVhJU1RTKT8KLQotOjo9IEFERCAoSUYgTk9UIEVYSVNUUyk/ICArCi18IFJFTkFNRSAoSUYgRVhJU1RTKT8gVE8gKCBBTkQgVE8gKSogKwotcC4gKwotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuLiArCi1BTFRFUiBUWVBFIGFkZHJlc3MgQUREIGNvdW50cnkgdGV4dAotCi1BTFRFUiBUWVBFIGFkZHJlc3MgUkVOQU1FIHppcCBUTyB6aXBjb2RlIEFORCBzdHJlZXRfbmFtZSBUTyBzdHJlZXQgKwotcC4gKwotVGhlIGBBTFRFUiBUWVBFYCBzdGF0ZW1lbnQgaXMgdXNlZCB0byBtYW5pcHVsYXRlIHR5cGUgZGVmaW5pdGlvbnMuIEl0Ci1hbGxvd3MgZm9yIGFkZGluZyBuZXcgZmllbGRzLCByZW5hbWluZyBleGlzdGluZyBmaWVsZHMsIG9yIGNoYW5naW5nIHRoZQotdHlwZSBvZiBleGlzdGluZyBmaWVsZHMuIElmIHRoZSB0eXBlIGRvZXMgbm90IGV4aXN0LCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLCB1bmxlc3MgYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KLQotW1tkcm9wVHlwZVN0bXRdXQotPT09PSBEUk9QIFRZUEUKLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuLiArCi06Oj0gRFJPUCBUWVBFICggSUYgRVhJU1RTICk/ICArCi1wLiArCi1UaGUgYERST1AgVFlQRWAgc3RhdGVtZW50IHJlc3VsdHMgaW4gdGhlIGltbWVkaWF0ZSwgaXJyZXZlcnNpYmxlIHJlbW92YWwKLW9mIGEgdHlwZS4gQXR0ZW1wdGluZyB0byBkcm9wIGEgdHlwZSB0aGF0IGlzIHN0aWxsIGluIHVzZSBieSBhbm90aGVyCi10eXBlIG9yIGEgdGFibGUgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuCi0KLUlmIHRoZSB0eXBlIGRvZXMgbm90IGV4aXN0LCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIHVubGVzcyBgSUYgRVhJU1RTYAotaXMgdXNlZCwgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCi0KLVtbY3JlYXRlVHJpZ2dlclN0bXRdXQotPT09PSBDUkVBVEUgVFJJR0dFUgotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4uICsKLTo6PSBDUkVBVEUgVFJJR0dFUiAoIElGIE5PVCBFWElTVFMgKT8gKCApPyArCi1PTiAgKwotVVNJTkcKLQotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuICsKLUNSRUFURSBUUklHR0VSIG15VHJpZ2dlciBPTiBteVRhYmxlIFVTSU5HCi1gb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJpZ2dlcnMuSW52ZXJ0ZWRJbmRleCc7Ci0KLVRoZSBhY3R1YWwgbG9naWMgdGhhdCBtYWtlcyB1cCB0aGUgdHJpZ2dlciBjYW4gYmUgd3JpdHRlbiBpbiBhbnkgSmF2YQotKEpWTSkgbGFuZ3VhZ2UgYW5kIGV4aXN0cyBvdXRzaWRlIHRoZSBkYXRhYmFzZS4gWW91IHBsYWNlIHRoZSB0cmlnZ2VyCi1jb2RlIGluIGEgYGxpYi90cmlnZ2Vyc2Agc3ViZGlyZWN0b3J5IG9mIHRoZSBDYXNzYW5kcmEgaW5zdGFsbGF0aW9uCi1kaXJlY3RvcnksIGl0IGxvYWRzIGR1cmluZyBjbHVzdGVyIHN0YXJ0dXAsIGFuZCBleGlzdHMgb24gZXZlcnkgbm9kZQotdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSBjbHVzdGVyLiBUaGUgdHJpZ2dlciBkZWZpbmVkIG9uIGEgdGFibGUgZmlyZXMKLWJlZm9yZSBhIHJlcXVlc3RlZCBETUwgc3RhdGVtZW50IG9jY3Vycywgd2hpY2ggZW5zdXJlcyB0aGUgYXRvbWljaXR5IG9mCi10aGUgdHJhbnNhY3Rpb24uCi0KLVtbZHJvcFRyaWdnZXJTdG10XV0KLT09PT0gRFJPUCBUUklHR0VSCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLi4gKwotOjo9IERST1AgVFJJR0dFUiAoIElGIEVYSVNUUyApPyAoICk/ICsKLU9OICArCi1wLiArCi1fU2FtcGxlOl8KLQotYmMoc2FtcGxlKS4gKwotRFJPUCBUUklHR0VSIG15VHJpZ2dlciBPTiBteVRhYmxlOwotCi1gRFJPUCBUUklHR0VSYCBzdGF0ZW1lbnQgcmVtb3ZlcyB0aGUgcmVnaXN0cmF0aW9uIG9mIGEgdHJpZ2dlciBjcmVhdGVkCi11c2luZyBgQ1JFQVRFIFRSSUdHRVJgLgotCi1bW2NyZWF0ZUZ1bmN0aW9uU3RtdF1dCi09PT09IENSRUFURSBGVU5DVElPTgotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4uICsKLTo6PSBDUkVBVEUgKCBPUiBSRVBMQUNFICk/ICsKLUZVTkNUSU9OICggSUYgTk9UIEVYSVNUUyApPyArCi0oIGAuJyApPyAgKwotYCgnICggYCwnICkqIGApJyArCi0oIENBTExFRCB8IFJFVFVSTlMgTlVMTCApIE9OIE5VTEwgSU5QVVQgKwotUkVUVVJOUyAgKwotTEFOR1VBR0UgICsKLUFTCi0KLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLiArCi1DUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBzb21lZnVuY3Rpb24gKwotKCBzb21lYXJnIGludCwgYW5vdGhlcmFyZyB0ZXh0LCBjb21wbGV4YXJnIGZyb3plbiwgbGlzdGFyZyBsaXN0ICkgKwotUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgKwotUkVUVVJOUyB0ZXh0ICsKLUxBTkdVQUdFIGphdmEgKwotQVMgJCQgKwotLy8gc29tZSBKYXZhIGNvZGUgKwotJCQ7ICsKLUNSRUFURSBGVU5DVElPTiBha2V5c3BhY2UuZm5hbWUgSUYgTk9UIEVYSVNUUyArCi0oIHNvbWVBcmcgaW50ICkgKwotQ0FMTEVEIE9OIE5VTEwgSU5QVVQgKwotUkVUVVJOUyB0ZXh0ICsKLUxBTkdVQUdFIGphdmEgKwotQVMgJCQgKwotLy8gc29tZSBKYXZhIGNvZGUgKwotJCQ7Ci0KLWBDUkVBVEUgRlVOQ1RJT05gIGNyZWF0ZXMgb3IgcmVwbGFjZXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24uCi0KLVtbZnVuY3Rpb25TaWduYXR1cmVdXQotPT09PT0gRnVuY3Rpb24gU2lnbmF0dXJlCi0KLVNpZ25hdHVyZXMgYXJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggaW5kaXZpZHVhbCBmdW5jdGlvbnMuIFRoZSBzaWduYXR1cmUKLWNvbnNpc3RzIG9mOgotCi0uIFRoZSBmdWxseSBxdWFsaWZpZWQgZnVuY3Rpb24gbmFtZSAtIGkuZSBfa2V5c3BhY2VfIHBsdXMKLV9mdW5jdGlvbi1uYW1lXwotLiBUaGUgY29uY2F0ZW5hdGVkIGxpc3Qgb2YgYWxsIGFyZ3VtZW50IHR5cGVzCi0KLU5vdGUgdGhhdCBrZXlzcGFjZSBuYW1lcywgZnVuY3Rpb24gbmFtZXMgYW5kIGFyZ3VtZW50IHR5cGVzIGFyZSBzdWJqZWN0Ci10byB0aGUgZGVmYXVsdCBuYW1pbmcgY29udmVudGlvbnMgYW5kIGNhc2Utc2Vuc2l0aXZpdHkgcnVsZXMuCi0KLWBDUkVBVEUgRlVOQ1RJT05gIHdpdGggdGhlIG9wdGlvbmFsIGBPUiBSRVBMQUNFYCBrZXl3b3JkcyBlaXRoZXIgY3JlYXRlcwotYSBmdW5jdGlvbiBvciByZXBsYWNlcyBhbiBleGlzdGluZyBvbmUgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUuIEEKLWBDUkVBVEUgRlVOQ1RJT05gIHdpdGhvdXQgYE9SIFJFUExBQ0VgIGZhaWxzIGlmIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZQotc2lnbmF0dXJlIGFscmVhZHkgZXhpc3RzLgotCi1CZWhhdmlvciBvbiBpbnZvY2F0aW9uIHdpdGggYG51bGxgIHZhbHVlcyBtdXN0IGJlIGRlZmluZWQgZm9yIGVhY2gKLWZ1bmN0aW9uLiBUaGVyZSBhcmUgdHdvIG9wdGlvbnM6Ci0KLS4gYFJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUYCBkZWNsYXJlcyB0aGF0IHRoZSBmdW5jdGlvbiB3aWxsIGFsd2F5cwotcmV0dXJuIGBudWxsYCBpZiBhbnkgb2YgdGhlIGlucHV0IGFyZ3VtZW50cyBpcyBgbnVsbGAuCi0uIGBDQUxMRUQgT04gTlVMTCBJTlBVVGAgZGVjbGFyZXMgdGhhdCB0aGUgZnVuY3Rpb24gd2lsbCBhbHdheXMgYmUKLWV4ZWN1dGVkLgotCi1JZiB0aGUgb3B0aW9uYWwgYElGIE5PVCBFWElTVFNgIGtleXdvcmRzIGFyZSB1c2VkLCB0aGUgZnVuY3Rpb24gd2lsbAotb25seSBiZSBjcmVhdGVkIGlmIGFub3RoZXIgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgZG9lcyBub3QKLWV4aXN0LgotCi1gT1IgUkVQTEFDRWAgYW5kIGBJRiBOT1QgRVhJU1RgIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyLgotCi1GdW5jdGlvbnMgYmVsb25nIHRvIGEga2V5c3BhY2UuIElmIG5vIGtleXNwYWNlIGlzIHNwZWNpZmllZCBpbgotYDxmdW5jdGlvbi1uYW1lPmAsIHRoZSBjdXJyZW50IGtleXNwYWNlIGlzIHVzZWQgKGkuZS4gdGhlIGtleXNwYWNlCi1zcGVjaWZpZWQgdXNpbmcgdGhlIGxpbms6I3VzZVN0bXRbYFVTRWBdIHN0YXRlbWVudCkuIEl0IGlzIG5vdCBwb3NzaWJsZQotdG8gY3JlYXRlIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIGluIG9uZSBvZiB0aGUgc3lzdGVtIGtleXNwYWNlcy4KLQotU2VlIHRoZSBzZWN0aW9uIG9uIGxpbms6I3VkZnNbdXNlci1kZWZpbmVkIGZ1bmN0aW9uc10gZm9yIG1vcmUKLWluZm9ybWF0aW9uLgotCi1bW2Ryb3BGdW5jdGlvblN0bXRdXQotPT09PSBEUk9QIEZVTkNUSU9OCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLi4gKwotOjo9IERST1AgRlVOQ1RJT04gKCBJRiBFWElTVFMgKT8gKwotKCBgLicgKT8gICsKLSggYCgnICggYCwnICkqIGApJyApPwotCi1fU2FtcGxlOl8KLQotYmMoc2FtcGxlKS4gKwotRFJPUCBGVU5DVElPTiBteWZ1bmN0aW9uOyArCi1EUk9QIEZVTkNUSU9OIG15a2V5c3BhY2UuYWZ1bmN0aW9uOyArCi1EUk9QIEZVTkNUSU9OIGFmdW5jdGlvbiAoIGludCApOyArCi1EUk9QIEZVTkNUSU9OIGFmdW5jdGlvbiAoIHRleHQgKTsKLQotYERST1AgRlVOQ1RJT05gIHN0YXRlbWVudCByZW1vdmVzIGEgZnVuY3Rpb24gY3JlYXRlZCB1c2luZwotYENSRUFURSBGVU5DVElPTmAuICsKLVlvdSBtdXN0IHNwZWNpZnkgdGhlIGFyZ3VtZW50IHR5cGVzIChsaW5rOiNmdW5jdGlvblNpZ25hdHVyZVtzaWduYXR1cmVdCi0pIG9mIHRoZSBmdW5jdGlvbiB0byBkcm9wIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBmdW5jdGlvbnMgd2l0aCB0aGUgc2FtZQotbmFtZSBidXQgYSBkaWZmZXJlbnQgc2lnbmF0dXJlIChvdmVybG9hZGVkIGZ1bmN0aW9ucykuCi0KLWBEUk9QIEZVTkNUSU9OYCB3aXRoIHRoZSBvcHRpb25hbCBgSUYgRVhJU1RTYCBrZXl3b3JkcyBkcm9wcyBhIGZ1bmN0aW9uCi1pZiBpdCBleGlzdHMuCi0KLVtbY3JlYXRlQWdncmVnYXRlU3RtdF1dCi09PT09IENSRUFURSBBR0dSRUdBVEUKLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuLiArCi06Oj0gQ1JFQVRFICggT1IgUkVQTEFDRSApPyArCi1BR0dSRUdBVEUgKCBJRiBOT1QgRVhJU1RTICk/ICsKLSggYC4nICk/ICArCi1gKCcgKCBgLCcgKSogYCknICsKLVNGVU5DICArCi1TVFlQRSAgKwotKCBGSU5BTEZVTkMgKT8gKwotKCBJTklUQ09ORCApPyArCi1wLiArCi1fU2FtcGxlOl8KLQotYmMoc2FtcGxlKS4gKwotQ1JFQVRFIEFHR1JFR0FURSBteWFnZ3JlZ2F0ZSAoIHZhbCB0ZXh0ICkgKwotU0ZVTkMgbXlhZ2dyZWdhdGVfc3RhdGUgKwotU1RZUEUgdGV4dCArCi1GSU5BTEZVTkMgbXlhZ2dyZWdhdGVfZmluYWwgKwotSU5JVENPTkQgYGZvbyc7Ci0KLVNlZSB0aGUgc2VjdGlvbiBvbiBsaW5rOiN1ZGFzW3VzZXItZGVmaW5lZCBhZ2dyZWdhdGVzXSBmb3IgYSBjb21wbGV0ZQotZXhhbXBsZS4KLQotYENSRUFURSBBR0dSRUdBVEVgIGNyZWF0ZXMgb3IgcmVwbGFjZXMgYSB1c2VyLWRlZmluZWQgYWdncmVnYXRlLgotCi1gQ1JFQVRFIEFHR1JFR0FURWAgd2l0aCB0aGUgb3B0aW9uYWwgYE9SIFJFUExBQ0VgIGtleXdvcmRzIGVpdGhlcgotY3JlYXRlcyBhbiBhZ2dyZWdhdGUgb3IgcmVwbGFjZXMgYW4gZXhpc3Rpbmcgb25lIHdpdGggdGhlIHNhbWUKLXNpZ25hdHVyZS4gQSBgQ1JFQVRFIEFHR1JFR0FURWAgd2l0aG91dCBgT1IgUkVQTEFDRWAgZmFpbHMgaWYgYW4KLWFnZ3JlZ2F0ZSB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBhbHJlYWR5IGV4aXN0cy4KLQotYENSRUFURSBBR0dSRUdBVEVgIHdpdGggdGhlIG9wdGlvbmFsIGBJRiBOT1QgRVhJU1RTYCBrZXl3b3JkcyBlaXRoZXIKLWNyZWF0ZXMgYW4gYWdncmVnYXRlIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCi0KLWBPUiBSRVBMQUNFYCBhbmQgYElGIE5PVCBFWElTVGAgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIuCi0KLUFnZ3JlZ2F0ZXMgYmVsb25nIHRvIGEga2V5c3BhY2UuIElmIG5vIGtleXNwYWNlIGlzIHNwZWNpZmllZCBpbgotYDxhZ2dyZWdhdGUtbmFtZT5gLCB0aGUgY3VycmVudCBrZXlzcGFjZSBpcyB1c2VkIChpLmUuIHRoZSBrZXlzcGFjZQotc3BlY2lmaWVkIHVzaW5nIHRoZSBsaW5rOiN1c2VTdG10W2BVU0VgXSBzdGF0ZW1lbnQpLiBJdCBpcyBub3QgcG9zc2libGUKLXRvIGNyZWF0ZSBhIHVzZXItZGVmaW5lZCBhZ2dyZWdhdGUgaW4gb25lIG9mIHRoZSBzeXN0ZW0ga2V5c3BhY2VzLgotCi1TaWduYXR1cmVzIGZvciB1c2VyLWRlZmluZWQgYWdncmVnYXRlcyBmb2xsb3cgdGhlCi1saW5rOiNmdW5jdGlvblNpZ25hdHVyZVtzYW1lIHJ1bGVzXSBhcyBmb3IgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucy4KLQotYFNUWVBFYCBkZWZpbmVzIHRoZSB0eXBlIG9mIHRoZSBzdGF0ZSB2YWx1ZSBhbmQgbXVzdCBiZSBzcGVjaWZpZWQuCi0KLVRoZSBvcHRpb25hbCBgSU5JVENPTkRgIGRlZmluZXMgdGhlIGluaXRpYWwgc3RhdGUgdmFsdWUgZm9yIHRoZQotYWdncmVnYXRlLiBJdCBkZWZhdWx0cyB0byBgbnVsbGAuIEEgbm9uLWBudWxsYCBgSU5JVENPTkRgIG11c3QgYmUKLXNwZWNpZmllZCBmb3Igc3RhdGUgZnVuY3Rpb25zIHRoYXQgYXJlIGRlY2xhcmVkIHdpdGgKLWBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVGAuCi0KLWBTRlVOQ2AgcmVmZXJlbmNlcyBhbiBleGlzdGluZyBmdW5jdGlvbiB0byBiZSB1c2VkIGFzIHRoZSBzdGF0ZQotbW9kaWZ5aW5nIGZ1bmN0aW9uLiBUaGUgdHlwZSBvZiBmaXJzdCBhcmd1bWVudCBvZiB0aGUgc3RhdGUgZnVuY3Rpb24KLW11c3QgbWF0Y2ggYFNUWVBFYC4gVGhlIHJlbWFpbmluZyBhcmd1bWVudCB0eXBlcyBvZiB0aGUgc3RhdGUgZnVuY3Rpb24KLW11c3QgbWF0Y2ggdGhlIGFyZ3VtZW50IHR5cGVzIG9mIHRoZSBhZ2dyZWdhdGUgZnVuY3Rpb24uIFN0YXRlIGlzIG5vdAotdXBkYXRlZCBmb3Igc3RhdGUgZnVuY3Rpb25zIGRlY2xhcmVkIHdpdGggYFJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUYAotYW5kIGNhbGxlZCB3aXRoIGBudWxsYC4KLQotVGhlIG9wdGlvbmFsIGBGSU5BTEZVTkNgIGlzIGNhbGxlZCBqdXN0IGJlZm9yZSB0aGUgYWdncmVnYXRlIHJlc3VsdCBpcwotcmV0dXJuZWQuIEl0IG11c3QgdGFrZSBvbmx5IG9uZSBhcmd1bWVudCB3aXRoIHR5cGUgYFNUWVBFYC4gVGhlIHJldHVybgotdHlwZSBvZiB0aGUgYEZJTkFMRlVOQ2AgbWF5IGJlIGEgZGlmZmVyZW50IHR5cGUuIEEgZmluYWwgZnVuY3Rpb24KLWRlY2xhcmVkIHdpdGggYFJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUYCBtZWFucyB0aGF0IHRoZSBhZ2dyZWdhdGXigJlzCi1yZXR1cm4gdmFsdWUgd2lsbCBiZSBgbnVsbGAsIGlmIHRoZSBsYXN0IHN0YXRlIGlzIGBudWxsYC4KLQotSWYgbm8gYEZJTkFMRlVOQ2AgaXMgZGVmaW5lZCwgdGhlIG92ZXJhbGwgcmV0dXJuIHR5cGUgb2YgdGhlIGFnZ3JlZ2F0ZQotZnVuY3Rpb24gaXMgYFNUWVBFYC4gSWYgYSBgRklOQUxGVU5DYCBpcyBkZWZpbmVkLCBpdCBpcyB0aGUgcmV0dXJuIHR5cGUKLW9mIHRoYXQgZnVuY3Rpb24uCi0KLVNlZSB0aGUgc2VjdGlvbiBvbiBsaW5rOiN1ZGFzW3VzZXItZGVmaW5lZCBhZ2dyZWdhdGVzXSBmb3IgbW9yZQotaW5mb3JtYXRpb24uCi0KLVtbZHJvcEFnZ3JlZ2F0ZVN0bXRdXQotPT09PSBEUk9QIEFHR1JFR0FURQotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4uICsKLTo6PSBEUk9QIEFHR1JFR0FURSAoIElGIEVYSVNUUyApPyArCi0oIGAuJyApPyAgKwotKCBgKCcgKCBgLCcgKSogYCknICk/ICsKLXAuCi0KLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLiArCi1EUk9QIEFHR1JFR0FURSBteUFnZ3JlZ2F0ZTsgKwotRFJPUCBBR0dSRUdBVEUgbXlLZXlzcGFjZS5hbkFnZ3JlZ2F0ZTsgKwotRFJPUCBBR0dSRUdBVEUgc29tZUFnZ3JlZ2F0ZSAoIGludCApOyArCi1EUk9QIEFHR1JFR0FURSBzb21lQWdncmVnYXRlICggdGV4dCApOwotCi1UaGUgYERST1AgQUdHUkVHQVRFYCBzdGF0ZW1lbnQgcmVtb3ZlcyBhbiBhZ2dyZWdhdGUgY3JlYXRlZCB1c2luZwotYENSRUFURSBBR0dSRUdBVEVgLiBZb3UgbXVzdCBzcGVjaWZ5IHRoZSBhcmd1bWVudCB0eXBlcyBvZiB0aGUgYWdncmVnYXRlCi10byBkcm9wIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBhZ2dyZWdhdGVzIHdpdGggdGhlIHNhbWUgbmFtZSBidXQgYQotZGlmZmVyZW50IHNpZ25hdHVyZSAob3ZlcmxvYWRlZCBhZ2dyZWdhdGVzKS4KLQotYERST1AgQUdHUkVHQVRFYCB3aXRoIHRoZSBvcHRpb25hbCBgSUYgRVhJU1RTYCBrZXl3b3JkcyBkcm9wcyBhbgotYWdncmVnYXRlIGlmIGl0IGV4aXN0cywgYW5kIGRvZXMgbm90aGluZyBpZiBhIGZ1bmN0aW9uIHdpdGggdGhlCi1zaWduYXR1cmUgZG9lcyBub3QgZXhpc3QuCi0KLVNpZ25hdHVyZXMgZm9yIHVzZXItZGVmaW5lZCBhZ2dyZWdhdGVzIGZvbGxvdyB0aGUKLWxpbms6I2Z1bmN0aW9uU2lnbmF0dXJlW3NhbWUgcnVsZXNdIGFzIGZvciB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLgotCi1bW2RhdGFNYW5pcHVsYXRpb25dXQotPT09IERhdGEgTWFuaXB1bGF0aW9uCi0KLVtbaW5zZXJ0U3RtdF1dCi09PT09IElOU0VSVAotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4uICsKLTo6PSBJTlNFUlQgSU5UTyAgKwotKCAoIFZBTFVFUyApICsKLXwgKCBKU09OICkpICsKLSggSUYgTk9UIEVYSVNUUyApPyArCi0oIFVTSU5HICggQU5EICkqICk/Ci0KLTo6PSBgKCcgKCBgLCcgKSogYCknCi0KLTo6PSBgKCcgKCBgLCcgKSogYCknCi0KLTo6PSBUSU1FU1RBTVAgICsKLXwgVFRMICArCi1wLiArCi1fU2FtcGxlOl8KLQotYmMoc2FtcGxlKS4uICsKLUlOU0VSVCBJTlRPIE5lcmRNb3ZpZXMgKG1vdmllLCBkaXJlY3RvciwgbWFpbl9hY3RvciwgeWVhcikgKwotVkFMVUVTIChgU2VyZW5pdHknLCBgSm9zcyBXaGVkb24nLCBgTmF0aGFuIEZpbGxpb24nLCAyMDA1KSArCi1VU0lORyBUVEwgODY0MDA7Ci0KLUlOU0VSVCBJTlRPIE5lcmRNb3ZpZXMgSlNPTiBgXHtgYG1vdmllJyc6IGBgU2VyZW5pdHknJywgYGBkaXJlY3RvcicnOgotYGBKb3NzIFdoZWRvbicnLCBgYHllYXInJzogMjAwNX0nICsKLXAuICsKLVRoZSBgSU5TRVJUYCBzdGF0ZW1lbnQgd3JpdGVzIG9uZSBvciBtb3JlIGNvbHVtbnMgZm9yIGEgZ2l2ZW4gcm93IGluIGEKLXRhYmxlLiBOb3RlIHRoYXQgc2luY2UgYSByb3cgaXMgaWRlbnRpZmllZCBieSBpdHMgYFBSSU1BUlkgS0VZYCwgYXQKLWxlYXN0IHRoZSBjb2x1bW5zIGNvbXBvc2luZyBpdCBtdXN0IGJlIHNwZWNpZmllZC4gVGhlIGxpc3Qgb2YgY29sdW1ucyB0bwotaW5zZXJ0IHRvIG11c3QgYmUgc3VwcGxpZWQgd2hlbiB1c2luZyB0aGUgYFZBTFVFU2Agc3ludGF4LiBXaGVuIHVzaW5nCi10aGUgYEpTT05gIHN5bnRheCwgdGhleSBhcmUgb3B0aW9uYWwuIFNlZSB0aGUgc2VjdGlvbiBvbgotbGluazojaW5zZXJ0SnNvbltgSU5TRVJUIEpTT05gXSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Ob3RlIHRoYXQgdW5saWtlIGluIFNRTCwgYElOU0VSVGAgZG9lcyBub3QgY2hlY2sgdGhlIHByaW9yIGV4aXN0ZW5jZSBvZgotdGhlIHJvdyBieSBkZWZhdWx0OiB0aGUgcm93IGlzIGNyZWF0ZWQgaWYgbm9uZSBleGlzdGVkIGJlZm9yZSwgYW5kCi11cGRhdGVkIG90aGVyd2lzZS4gRnVydGhlcm1vcmUsIHRoZXJlIGlzIG5vIG1lYW4gdG8ga25vdyB3aGljaCBvZgotY3JlYXRpb24gb3IgdXBkYXRlIGhhcHBlbmVkLgotCi1JdCBpcyBob3dldmVyIHBvc3NpYmxlIHRvIHVzZSB0aGUgYElGIE5PVCBFWElTVFNgIGNvbmRpdGlvbiB0byBvbmx5Ci1pbnNlcnQgaWYgdGhlIHJvdyBkb2VzIG5vdCBleGlzdCBwcmlvciB0byB0aGUgaW5zZXJ0aW9uLiBCdXQgcGxlYXNlIG5vdGUKLXRoYXQgdXNpbmcgYElGIE5PVCBFWElTVFNgIHdpbGwgaW5jdXIgYSBub24gbmVnbGlnaWJsZSBwZXJmb3JtYW5jZSBjb3N0Ci0oaW50ZXJuYWxseSwgUGF4b3Mgd2lsbCBiZSB1c2VkKSBzbyB0aGlzIHNob3VsZCBiZSB1c2VkIHNwYXJpbmdseS4KLQotQWxsIHVwZGF0ZXMgZm9yIGFuIGBJTlNFUlRgIGFyZSBhcHBsaWVkIGF0b21pY2FsbHkgYW5kIGluIGlzb2xhdGlvbi4KLQotUGxlYXNlIHJlZmVyIHRvIHRoZSBsaW5rOiN1cGRhdGVPcHRpb25zW2BVUERBVEVgXSBzZWN0aW9uIGZvcgotaW5mb3JtYXRpb24gb24gdGhlIGA8b3B0aW9uPmAgYXZhaWxhYmxlIGFuZCB0byB0aGUKLWxpbms6I2NvbGxlY3Rpb25zW2NvbGxlY3Rpb25zXSBzZWN0aW9uIGZvciB1c2Ugb2YKLWA8Y29sbGVjdGlvbi1saXRlcmFsPmAuIEFsc28gbm90ZSB0aGF0IGBJTlNFUlRgIGRvZXMgbm90IHN1cHBvcnQKLWNvdW50ZXJzLCB3aGlsZSBgVVBEQVRFYCBkb2VzLgotCi1bW3VwZGF0ZVN0bXRdXQotPT09PSBVUERBVEUKLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuLiArCi06Oj0gVVBEQVRFICArCi0oIFVTSU5HICggQU5EICkqICk/ICsKLVNFVCAoIGAsJyApKiArCi1XSEVSRSAgKwotKCBJRiAoIEFORCBjb25kaXRpb24gKSogKT8KLQotOjo9IGA9JyAgKwotfCBgPScgKGArJyB8IGAtJykgKCB8IHwgKSArCi18IGA9JyBgKycgICsKLXwgYFsnIGBdJyBgPScgICsKLXwgYC4nIGA9JwotCi06Oj0gICsKLXwgQ09OVEFJTlMgKEtFWSk/ICsKLXwgSU4gICsKLXwgYFsnIGBdJyAgKwotfCBgWycgYF0nIElOICArCi18IGAuJyAgKwotfCBgLicgSU4KLQotOjo9IGA8JyB8IGA8PScgfCBgPScgfCBgIT0nIHwgYD49JyB8IGA+JyArCi06Oj0gKCB8IGAoJyAoICggYCwnICkqICk/IGApJykKLQotOjo9ICggQU5EICkqCi0KLTo6PSBgPScgICsKLXwgYCgnIChgLCcgKSogYCknIGA9JyAgKwotfCBJTiBgKCcgKCAoIGAsJyApKiApPyBgKScgKwotfCBJTiAgKwotfCBgKCcgKGAsJyApKiBgKScgSU4gYCgnICggKCBgLCcgKSogKT8gYCknICsKLXwgYCgnIChgLCcgKSogYCknIElOCi0KLTo6PSBUSU1FU1RBTVAgICsKLXwgVFRMICArCi1wLiArCi1fU2FtcGxlOl8KLQotYmMoc2FtcGxlKS4uICsKLVVQREFURSBOZXJkTW92aWVzIFVTSU5HIFRUTCA0MDAgKwotU0VUIGRpcmVjdG9yID0gYEpvc3MgV2hlZG9uJywgKwotbWFpbl9hY3RvciA9IGBOYXRoYW4gRmlsbGlvbicsICsKLXllYXIgPSAyMDA1ICsKLVdIRVJFIG1vdmllID0gYFNlcmVuaXR5JzsKLQotVVBEQVRFIFVzZXJBY3Rpb25zIFNFVCB0b3RhbCA9IHRvdGFsICsgMiBXSEVSRSB1c2VyID0KLUI3MERFMUQwLTk5MDgtNEFFMy1CRTM0LTU1NzNFNUIwOUYxNCBBTkQgYWN0aW9uID0gYGNsaWNrJzsgKwotcC4gKwotVGhlIGBVUERBVEVgIHN0YXRlbWVudCB3cml0ZXMgb25lIG9yIG1vcmUgY29sdW1ucyBmb3IgYSBnaXZlbiByb3cgaW4gYQotdGFibGUuIFRoZSBgPHdoZXJlLWNsYXVzZT5gIGlzIHVzZWQgdG8gc2VsZWN0IHRoZSByb3cgdG8gdXBkYXRlIGFuZCBtdXN0Ci1pbmNsdWRlIGFsbCBjb2x1bW5zIGNvbXBvc2luZyB0aGUgYFBSSU1BUlkgS0VZYC4gT3RoZXIgY29sdW1ucyB2YWx1ZXMKLWFyZSBzcGVjaWZpZWQgdGhyb3VnaCBgPGFzc2lnbm1lbnQ+YCBhZnRlciB0aGUgYFNFVGAga2V5d29yZC4KLQotTm90ZSB0aGF0IHVubGlrZSBpbiBTUUwsIGBVUERBVEVgIGRvZXMgbm90IGNoZWNrIHRoZSBwcmlvciBleGlzdGVuY2Ugb2YKLXRoZSByb3cgYnkgZGVmYXVsdCAoZXhjZXB0IHRocm91Z2ggdGhlIHVzZSBvZiBgPGNvbmRpdGlvbj5gLCBzZWUgYmVsb3cpOgotdGhlIHJvdyBpcyBjcmVhdGVkIGlmIG5vbmUgZXhpc3RlZCBiZWZvcmUsIGFuZCB1cGRhdGVkIG90aGVyd2lzZS4KLUZ1cnRoZXJtb3JlLCB0aGVyZSBhcmUgbm8gbWVhbnMgdG8ga25vdyB3aGV0aGVyIGEgY3JlYXRpb24gb3IgdXBkYXRlCi1vY2N1cnJlZC4KLQotSXQgaXMgaG93ZXZlciBwb3NzaWJsZSB0byB1c2UgdGhlIGNvbmRpdGlvbnMgb24gc29tZSBjb2x1bW5zIHRocm91Z2gKLWBJRmAsIGluIHdoaWNoIGNhc2UgdGhlIHJvdyB3aWxsIG5vdCBiZSB1cGRhdGVkIHVubGVzcyB0aGUgY29uZGl0aW9ucwotYXJlIG1ldC4gQnV0LCBwbGVhc2Ugbm90ZSB0aGF0IHVzaW5nIGBJRmAgY29uZGl0aW9ucyB3aWxsIGluY3VyIGEKLW5vbi1uZWdsaWdpYmxlIHBlcmZvcm1hbmNlIGNvc3QgKGludGVybmFsbHksIFBheG9zIHdpbGwgYmUgdXNlZCkgc28gdGhpcwotc2hvdWxkIGJlIHVzZWQgc3BhcmluZ2x5LgotCi1JbiBhbiBgVVBEQVRFYCBzdGF0ZW1lbnQsIGFsbCB1cGRhdGVzIHdpdGhpbiB0aGUgc2FtZSBwYXJ0aXRpb24ga2V5IGFyZQotYXBwbGllZCBhdG9taWNhbGx5IGFuZCBpbiBpc29sYXRpb24uCi0KLVRoZSBgYyA9IGMgKyAzYCBmb3JtIG9mIGA8YXNzaWdubWVudD5gIGlzIHVzZWQgdG8gaW5jcmVtZW50L2RlY3JlbWVudAotY291bnRlcnMuIFRoZSBpZGVudGlmaWVyIGFmdGVyIHRoZSBgPScgc2lnbiAqbXVzdCogYmUgdGhlIHNhbWUgdGhhbiB0aGUKLW9uZSBiZWZvcmUgdGhlIGA9JyBzaWduIChPbmx5IGluY3JlbWVudC9kZWNyZW1lbnQgaXMgc3VwcG9ydGVkIG9uCi1jb3VudGVycywgbm90IHRoZSBhc3NpZ25tZW50IG9mIGEgc3BlY2lmaWMgdmFsdWUpLgotCi1UaGUgYGlkID0gaWQgKyA8Y29sbGVjdGlvbi1saXRlcmFsPmAgYW5kIGBpZFt2YWx1ZTFdID0gdmFsdWUyYCBmb3JtcyBvZgotYDxhc3NpZ25tZW50PmAgYXJlIGZvciBjb2xsZWN0aW9ucy4gUGxlYXNlIHJlZmVyIHRvIHRoZQotbGluazojY29sbGVjdGlvbnNbcmVsZXZhbnQgc2VjdGlvbl0gZm9yIG1vcmUgZGV0YWlscy4KLQotVGhlIGBpZC5maWVsZCA9IDx0ZXJtPmAgZm9ybSBvZiBgPGFzc2lnbmVtdD5gIGlzIGZvciBzZXR0aW5nIHRoZSB2YWx1ZQotb2YgYSBzaW5nbGUgZmllbGQgb24gYSBub24tZnJvemVuIHVzZXItZGVmaW5lZCB0eXBlcy4KLQotW1t1cGRhdGVPcHRpb25zXV0KLT09PT09IGA8b3B0aW9ucz5gCi0KLVRoZSBgVVBEQVRFYCBhbmQgYElOU0VSVGAgc3RhdGVtZW50cyBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKLQotKiBgVElNRVNUQU1QYDogc2V0cyB0aGUgdGltZXN0YW1wIGZvciB0aGUgb3BlcmF0aW9uLiBJZiBub3Qgc3BlY2lmaWVkLAotdGhlIGNvb3JkaW5hdG9yIHdpbGwgdXNlIHRoZSBjdXJyZW50IHRpbWUgKGluIG1pY3Jvc2Vjb25kcykgYXQgdGhlIHN0YXJ0Ci1vZiBzdGF0ZW1lbnQgZXhlY3V0aW9uIGFzIHRoZSB0aW1lc3RhbXAuIFRoaXMgaXMgdXN1YWxseSBhIHN1aXRhYmxlCi1kZWZhdWx0LgotKiBgVFRMYDogc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFRpbWUgVG8gTGl2ZSAoaW4gc2Vjb25kcykgZm9yIHRoZQotaW5zZXJ0ZWQgdmFsdWVzLiBJZiBzZXQsIHRoZSBpbnNlcnRlZCB2YWx1ZXMgYXJlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZAotZnJvbSB0aGUgZGF0YWJhc2UgYWZ0ZXIgdGhlIHNwZWNpZmllZCB0aW1lLiBOb3RlIHRoYXQgdGhlIFRUTCBjb25jZXJucwotdGhlIGluc2VydGVkIHZhbHVlcywgbm90IHRoZSBjb2x1bW5zIHRoZW1zZWx2ZXMuIFRoaXMgbWVhbnMgdGhhdCBhbnkKLXN1YnNlcXVlbnQgdXBkYXRlIG9mIHRoZSBjb2x1bW4gd2lsbCBhbHNvIHJlc2V0IHRoZSBUVEwgKHRvIHdoYXRldmVyIFRUTAotaXMgc3BlY2lmaWVkIGluIHRoYXQgdXBkYXRlKS4gQnkgZGVmYXVsdCwgdmFsdWVzIG5ldmVyIGV4cGlyZS4gQSBUVEwgb2YKLTAgaXMgZXF1aXZhbGVudCB0byBubyBUVEwuIElmIHRoZSB0YWJsZSBoYXMgYSBkZWZhdWx0X3RpbWVfdG9fbGl2ZSwgYQotVFRMIG9mIDAgd2lsbCByZW1vdmUgdGhlIFRUTCBmb3IgdGhlIGluc2VydGVkIG9yIHVwZGF0ZWQgdmFsdWVzLgotCi1bW2RlbGV0ZVN0bXRdXQotPT09PSBERUxFVEUKLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuLiArCi06Oj0gREVMRVRFICggKCBgLCcgKSogKT8gKwotRlJPTSAgKwotKCBVU0lORyBUSU1FU1RBTVAgKT8gKwotV0hFUkUgICsKLSggSUYgKCBFWElTVFMgfCAoICggQU5EICkqKSApICk/Ci0KLTo6PSAgKwotfCBgWycgYF0nICsKLXwgYC4nCi0KLTo6PSAoIEFORCApKgotCi06Oj0gICsKLXwgYCgnIChgLCcgKSogYCknICArCi18IElOIGAoJyAoICggYCwnICkqICk/IGApJyArCi18IElOICArCi18IGAoJyAoYCwnICkqIGApJyBJTiBgKCcgKCAoIGAsJyApKiApPyBgKScgKwotfCBgKCcgKGAsJyApKiBgKScgSU4KLQotOjo9IGA9JyB8IGA8JyB8IGA+JyB8IGA8PScgfCBgPj0nICsKLTo6PSAoIHwgYCgnICggKCBgLCcgKSogKT8gYCknKQotCi06Oj0gKCB8IGAhPScpICArCi18IENPTlRBSU5TIChLRVkpPyArCi18IElOICArCi18IGBbJyBgXScgKCB8IGAhPScpICArCi18IGBbJyBgXScgSU4gICsKLXwgYC4nICggfCBgIT0nKSAgKwotfCBgLicgSU4KLQotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuLiArCi1ERUxFVEUgRlJPTSBOZXJkTW92aWVzIFVTSU5HIFRJTUVTVEFNUCAxMjQwMDAzMTM0IFdIRVJFIG1vdmllID0KLWBTZXJlbml0eSc7Ci0KLURFTEVURSBwaG9uZSBGUk9NIFVzZXJzIFdIRVJFIHVzZXJpZCBJTgotKEM3M0RFMUQzLUFGMDgtNDBGMy1CMTI0LTNGRjNFNTEwOUYyMiwKLUI3MERFMUQwLTk5MDgtNEFFMy1CRTM0LTU1NzNFNUIwOUYxNCk7ICsKLXAuICsKLVRoZSBgREVMRVRFYCBzdGF0ZW1lbnQgZGVsZXRlcyBjb2x1bW5zIGFuZCByb3dzLiBJZiBjb2x1bW4gbmFtZXMgYXJlCi1wcm92aWRlZCBkaXJlY3RseSBhZnRlciB0aGUgYERFTEVURWAga2V5d29yZCwgb25seSB0aG9zZSBjb2x1bW5zIGFyZQotZGVsZXRlZCBmcm9tIHRoZSByb3cgaW5kaWNhdGVkIGJ5IHRoZSBgPHdoZXJlLWNsYXVzZT5gLiBUaGUgYGlkW3ZhbHVlXWAKLXN5bnRheCBpbiBgPHNlbGVjdGlvbj5gIGlzIGZvciBub24tZnJvemVuIGNvbGxlY3Rpb25zIChwbGVhc2UgcmVmZXIgdG8KLXRoZSBsaW5rOiNjb2xsZWN0aW9uc1tjb2xsZWN0aW9uIHNlY3Rpb25dIGZvciBtb3JlIGRldGFpbHMpLiBUaGUKLWBpZC5maWVsZGAgc3ludGF4IGlzIGZvciB0aGUgZGVsZXRpb24gb2Ygbm9uLWZyb3plbiB1c2VyLWRlZmluZWQgdHlwZXMuCi1PdGhlcndpc2UsIHdob2xlIHJvd3MgYXJlIHJlbW92ZWQuIFRoZSBgPHdoZXJlLWNsYXVzZT5gIHNwZWNpZmllcyB3aGljaAotcm93cyBhcmUgdG8gYmUgZGVsZXRlZC4gTXVsdGlwbGUgcm93cyBtYXkgYmUgZGVsZXRlZCB3aXRoIG9uZSBzdGF0ZW1lbnQKLWJ5IHVzaW5nIGFuIGBJTmAgY2xhdXNlLiBBIHJhbmdlIG9mIHJvd3MgbWF5IGJlIGRlbGV0ZWQgdXNpbmcgYW4KLWluZXF1YWxpdHkgb3BlcmF0b3IgKHN1Y2ggYXMgYD49YCkuCi0KLWBERUxFVEVgIHN1cHBvcnRzIHRoZSBgVElNRVNUQU1QYCBvcHRpb24gd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlCi1saW5rOiN1cGRhdGVTdG10W2BVUERBVEVgXSBzdGF0ZW1lbnQuCi0KLUluIGEgYERFTEVURWAgc3RhdGVtZW50LCBhbGwgZGVsZXRpb25zIHdpdGhpbiB0aGUgc2FtZSBwYXJ0aXRpb24ga2V5IGFyZQotYXBwbGllZCBhdG9taWNhbGx5IGFuZCBpbiBpc29sYXRpb24uCi0KLUEgYERFTEVURWAgb3BlcmF0aW9uIGNhbiBiZSBjb25kaXRpb25hbCB0aHJvdWdoIHRoZSB1c2Ugb2YgYW4gYElGYAotY2xhdXNlLCBzaW1pbGFyIHRvIGBVUERBVEVgIGFuZCBgSU5TRVJUYCBzdGF0ZW1lbnRzLiBIb3dldmVyLCBhcyB3aXRoCi1gSU5TRVJUYCBhbmQgYFVQREFURWAgc3RhdGVtZW50cywgdGhpcyB3aWxsIGluY3VyIGEgbm9uLW5lZ2xpZ2libGUKLXBlcmZvcm1hbmNlIGNvc3QgKGludGVybmFsbHksIFBheG9zIHdpbGwgYmUgdXNlZCkgYW5kIHNvIHNob3VsZCBiZSB1c2VkCi1zcGFyaW5nbHkuCi0KLVtbYmF0Y2hTdG10XV0KLT09PT0gQkFUQ0gKLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuLiArCi06Oj0gQkVHSU4gKCBVTkxPR0dFRCB8IENPVU5URVIgKSBCQVRDSCArCi0oIFVTSU5HICggQU5EICkqICk/ICsKLSggYDsnICkqICsKLUFQUExZIEJBVENICi0KLTo6PSAgKwotfCAgKwotfAotCi06Oj0gVElNRVNUQU1QICArCi1wLiArCi1fU2FtcGxlOl8KLQotYmMoc2FtcGxlKS4gKwotQkVHSU4gQkFUQ0ggKwotSU5TRVJUIElOVE8gdXNlcnMgKHVzZXJpZCwgcGFzc3dvcmQsIG5hbWUpIFZBTFVFUyAoYHVzZXIyJywgYGNoQG5nZW0zYicsCi1gc2Vjb25kIHVzZXInKTsgKwotVVBEQVRFIHVzZXJzIFNFVCBwYXNzd29yZCA9IGBwczIyZGhkcycgV0hFUkUgdXNlcmlkID0gYHVzZXIzJzsgKwotSU5TRVJUIElOVE8gdXNlcnMgKHVzZXJpZCwgcGFzc3dvcmQpIFZBTFVFUyAoYHVzZXI0JywgYGNoQG5nZW0zYycpOyArCi1ERUxFVEUgbmFtZSBGUk9NIHVzZXJzIFdIRVJFIHVzZXJpZCA9IGB1c2VyMSc7ICsKLUFQUExZIEJBVENIOwotCi1UaGUgYEJBVENIYCBzdGF0ZW1lbnQgZ3JvdXAgbXVsdGlwbGUgbW9kaWZpY2F0aW9uIHN0YXRlbWVudHMKLShpbnNlcnRpb25zL3VwZGF0ZXMgYW5kIGRlbGV0aW9ucykgaW50byBhIHNpbmdsZSBzdGF0ZW1lbnQuIEl0IHNlcnZlcwotc2V2ZXJhbCBwdXJwb3NlczoKLQotLiBJdCBzYXZlcyBuZXR3b3JrIHJvdW5kLXRyaXBzIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlciAoYW5kCi1zb21ldGltZXMgYmV0d2VlbiB0aGUgc2VydmVyIGNvb3JkaW5hdG9yIGFuZCB0aGUgcmVwbGljYXMpIHdoZW4gYmF0Y2hpbmcKLW11bHRpcGxlIHVwZGF0ZXMuCi0uIEFsbCB1cGRhdGVzIGluIGEgYEJBVENIYCBiZWxvbmdpbmcgdG8gYSBnaXZlbiBwYXJ0aXRpb24ga2V5IGFyZQotcGVyZm9ybWVkIGluIGlzb2xhdGlvbi4KLS4gQnkgZGVmYXVsdCwgYWxsIG9wZXJhdGlvbnMgaW4gdGhlIGJhdGNoIGFyZSBwZXJmb3JtZWQgYXMgYExPR0dFRGAsIHRvCi1lbnN1cmUgYWxsIG11dGF0aW9ucyBldmVudHVhbGx5IGNvbXBsZXRlIChvciBub25lIHdpbGwpLiBTZWUgdGhlIG5vdGVzCi1vbiBsaW5rOiN1bmxvZ2dlZEJhdGNoW2BVTkxPR0dFRGBdIGZvciBtb3JlIGRldGFpbHMuCi0KLU5vdGUgdGhhdDoKLQotKiBgQkFUQ0hgIHN0YXRlbWVudHMgbWF5IG9ubHkgY29udGFpbiBgVVBEQVRFYCwgYElOU0VSVGAgYW5kIGBERUxFVEVgCi1zdGF0ZW1lbnRzLgotKiBCYXRjaGVzIGFyZSBfbm90XyBhIGZ1bGwgYW5hbG9ndWUgZm9yIFNRTCB0cmFuc2FjdGlvbnMuCi0qIElmIGEgdGltZXN0YW1wIGlzIG5vdCBzcGVjaWZpZWQgZm9yIGVhY2ggb3BlcmF0aW9uLCB0aGVuIGFsbAotb3BlcmF0aW9ucyB3aWxsIGJlIGFwcGxpZWQgd2l0aCB0aGUgc2FtZSB0aW1lc3RhbXAuIER1ZSB0byBDYXNzYW5kcmHigJlzCi1jb25mbGljdCByZXNvbHV0aW9uIHByb2NlZHVyZSBpbiB0aGUgY2FzZSBvZgotaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9jYXNzYW5kcmEvRkFRI2Nsb2NrdGllW3RpbWVzdGFtcCB0aWVzXSwKLW9wZXJhdGlvbnMgbWF5IGJlIGFwcGxpZWQgaW4gYW4gb3JkZXIgdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkZXIKLXRoZXkgYXJlIGxpc3RlZCBpbiB0aGUgYEJBVENIYCBzdGF0ZW1lbnQuIFRvIGZvcmNlIGEgcGFydGljdWxhcgotb3BlcmF0aW9uIG9yZGVyaW5nLCB5b3UgbXVzdCBzcGVjaWZ5IHBlci1vcGVyYXRpb24gdGltZXN0YW1wcy4KLQotW1t1bmxvZ2dlZEJhdGNoXV0KLT09PT09IGBVTkxPR0dFRGAKLQotQnkgZGVmYXVsdCwgQ2Fzc2FuZHJhIHVzZXMgYSBiYXRjaCBsb2cgdG8gZW5zdXJlIGFsbCBvcGVyYXRpb25zIGluIGEKLWJhdGNoIGV2ZW50dWFsbHkgY29tcGxldGUgb3Igbm9uZSB3aWxsIChub3RlIGhvd2V2ZXIgdGhhdCBvcGVyYXRpb25zIGFyZQotb25seSBpc29sYXRlZCB3aXRoaW4gYSBzaW5nbGUgcGFydGl0aW9uKS4KLQotVGhlcmUgaXMgYSBwZXJmb3JtYW5jZSBwZW5hbHR5IGZvciBiYXRjaCBhdG9taWNpdHkgd2hlbiBhIGJhdGNoIHNwYW5zCi1tdWx0aXBsZSBwYXJ0aXRpb25zLiBJZiB5b3UgZG8gbm90IHdhbnQgdG8gaW5jdXIgdGhpcyBwZW5hbHR5LCB5b3UgY2FuCi10ZWxsIENhc3NhbmRyYSB0byBza2lwIHRoZSBiYXRjaGxvZyB3aXRoIHRoZSBgVU5MT0dHRURgIG9wdGlvbi4gSWYgdGhlCi1gVU5MT0dHRURgIG9wdGlvbiBpcyB1c2VkLCBhIGZhaWxlZCBiYXRjaCBtaWdodCBsZWF2ZSB0aGUgcGF0Y2ggb25seQotcGFydGx5IGFwcGxpZWQuCi0KLVtbY291bnRlckJhdGNoXV0KLT09PT09IGBDT1VOVEVSYAotCi1Vc2UgdGhlIGBDT1VOVEVSYCBvcHRpb24gZm9yIGJhdGNoZWQgY291bnRlciB1cGRhdGVzLiBVbmxpa2Ugb3RoZXIKLXVwZGF0ZXMgaW4gQ2Fzc2FuZHJhLCBjb3VudGVyIHVwZGF0ZXMgYXJlIG5vdCBpZGVtcG90ZW50LgotCi1bW2JhdGNoT3B0aW9uc11dCi09PT09PSBgPG9wdGlvbj5gCi0KLWBCQVRDSGAgc3VwcG9ydHMgYm90aCB0aGUgYFRJTUVTVEFNUGAgb3B0aW9uLCB3aXRoIHNpbWlsYXIgc2VtYW50aWMgdG8KLXRoZSBvbmUgZGVzY3JpYmVkIGluIHRoZSBsaW5rOiN1cGRhdGVPcHRpb25zW2BVUERBVEVgXSBzdGF0ZW1lbnQgKHRoZQotdGltZXN0YW1wIGFwcGxpZXMgdG8gYWxsIHRoZSBzdGF0ZW1lbnQgaW5zaWRlIHRoZSBiYXRjaCkuIEhvd2V2ZXIsIGlmCi11c2VkLCBgVElNRVNUQU1QYCAqbXVzdCBub3QqIGJlIHVzZWQgaW4gdGhlIHN0YXRlbWVudHMgd2l0aGluIHRoZSBiYXRjaC4KLQotPT09IFF1ZXJpZXMKLQotW1tzZWxlY3RTdG10XV0KLT09PT0gU0VMRUNUCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLi4gKwotOjo9IFNFTEVDVCAoIEpTT04gKT8gICsKLUZST00gICsKLSggV0hFUkUgKT8gKwotKCBHUk9VUCBCWSApPyArCi0oIE9SREVSIEJZICk/ICsKLSggUEVSIFBBUlRJVElPTiBMSU1JVCApPyArCi0oIExJTUlUICk/ICsKLSggQUxMT1cgRklMVEVSSU5HICk/Ci0KLTo6PSBESVNUSU5DVD8KLQotOjo9IChBUyApPyAoIGAsJyAoQVMgKT8gKSogKwotfCBgKicKLQotOjo9ICArCi18ICArCi18IFdSSVRFVElNRSBgKCcgYCknICsKLXwgQ09VTlQgYCgnIGAqJyBgKScgKwotfCBUVEwgYCgnIGApJyArCi18IENBU1QgYCgnIEFTIGApJyArCi18IGAoJyAoIChgLCcgKSopPyBgKScgKwotfCBgLicgICsKLXwgYFsnIGBdJyArCi18IGBbJyA/IC4uID8gYF0nCi0KLTo6PSAoIEFORCApKgotCi06Oj0gICsKLXwgYCgnIChgLCcgKSogYCknICArCi18IElOIGAoJyAoICggYCwnICkqICk/IGApJyArCi18IGAoJyAoYCwnICkqIGApJyBJTiBgKCcgKCAoIGAsJyApKiApPyBgKScgKwotfCBUT0tFTiBgKCcgKCBgLCcgKSogYCknCi0KLTo6PSBgPScgfCBgPCcgfCBgPicgfCBgPD0nIHwgYD49JyB8IENPTlRBSU5TIHwgQ09OVEFJTlMgS0VZICsKLTo6PSAoYCwnICkqICsKLTo6PSAoIGAsJyApKiArCi06Oj0gKCBBU0MgfCBERVNDICk/ICsKLTo6PSBgKCcgKGAsJyApKiBgKScgKwotcC4gKwotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuLiArCi1TRUxFQ1QgbmFtZSwgb2NjdXBhdGlvbiBGUk9NIHVzZXJzIFdIRVJFIHVzZXJpZCBJTiAoMTk5LCAyMDAsIDIwNyk7Ci0KLVNFTEVDVCBKU09OIG5hbWUsIG9jY3VwYXRpb24gRlJPTSB1c2VycyBXSEVSRSB1c2VyaWQgPSAxOTk7Ci0KLVNFTEVDVCBuYW1lIEFTIHVzZXJfbmFtZSwgb2NjdXBhdGlvbiBBUyB1c2VyX29jY3VwYXRpb24gRlJPTSB1c2VyczsKLQotU0VMRUNUIHRpbWUsIHZhbHVlICsKLUZST00gZXZlbnRzICsKLVdIRVJFIGV2ZW50X3R5cGUgPSBgbXlFdmVudCcgKwotQU5EIHRpbWUgPiBgMjAxMS0wMi0wMycgKwotQU5EIHRpbWUgPD0gYDIwMTItMDEtMDEnCi0KLVNFTEVDVCBDT1VOVCAoKikgRlJPTSB1c2VyczsKLQotU0VMRUNUIENPVU5UICgqKSBBUyB1c2VyX2NvdW50IEZST00gdXNlcnM7Ci0KLVRoZSBgU0VMRUNUYCBzdGF0ZW1lbnRzIHJlYWRzIG9uZSBvciBtb3JlIGNvbHVtbnMgZm9yIG9uZSBvciBtb3JlIHJvd3MKLWluIGEgdGFibGUuIEl0IHJldHVybnMgYSByZXN1bHQtc2V0IG9mIHJvd3MsIHdoZXJlIGVhY2ggcm93IGNvbnRhaW5zIHRoZQotY29sbGVjdGlvbiBvZiBjb2x1bW5zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHF1ZXJ5LiBJZiB0aGUgYEpTT05gIGtleXdvcmQKLWlzIHVzZWQsIHRoZSByZXN1bHRzIGZvciBlYWNoIHJvdyB3aWxsIGNvbnRhaW4gb25seSBhIHNpbmdsZSBjb2x1bW4KLW5hbWVkIGBganNvbicnLiBTZWUgdGhlIHNlY3Rpb24gb24gbGluazojc2VsZWN0SnNvbltgU0VMRUNUIEpTT05gXSBmb3IKLW1vcmUgZGV0YWlscy4KLQotW1tzZWxlY3RTZWxlY3Rpb25dXQotPT09PT0gYDxzZWxlY3QtY2xhdXNlPmAKLQotVGhlIGA8c2VsZWN0LWNsYXVzZT5gIGRldGVybWluZXMgd2hpY2ggY29sdW1ucyBuZWVkcyB0byBiZSBxdWVyaWVkIGFuZAotcmV0dXJuZWQgaW4gdGhlIHJlc3VsdC1zZXQuIEl0IGNvbnNpc3RzIG9mIGVpdGhlciB0aGUgY29tbWEtc2VwYXJhdGVkCi1saXN0IG9mIG9yIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgKGAqYCkgdG8gc2VsZWN0IGFsbCB0aGUgY29sdW1ucwotZGVmaW5lZCBmb3IgdGhlIHRhYmxlLiBQbGVhc2Ugbm90ZSB0aGF0IGZvciB3aWxkY2FyZCBgU0VMRUNUYCBxdWVyaWVzCi10aGUgb3JkZXIgb2YgY29sdW1ucyByZXR1cm5lZCBpcyBub3Qgc3BlY2lmaWVkIGFuZCBpcyBub3QgZ3VhcmFudGVlZCB0bwotYmUgc3RhYmxlIGJldHdlZW4gQ2Fzc2FuZHJhIHZlcnNpb25zLgotCi1BIGA8c2VsZWN0b3I+YCBpcyBlaXRoZXIgYSBjb2x1bW4gbmFtZSB0byByZXRyaWV2ZSBvciBhIGA8ZnVuY3Rpb24+YCBvZgotb25lIG9yIG1vcmUgYDx0ZXJtPmBzLiBUaGUgZnVuY3Rpb24gYWxsb3dlZCBhcmUgdGhlIHNhbWUgYXMgZm9yIGA8dGVybT5gCi1hbmQgYXJlIGRlc2NyaWJlZCBpbiB0aGUgbGluazojZnVuY3Rpb25zW2Z1bmN0aW9uIHNlY3Rpb25dLiBJbiBhZGRpdGlvbgotdG8gdGhlc2UgZ2VuZXJpYyBmdW5jdGlvbnMsIHRoZSBgV1JJVEVUSU1FYCAocmVzcC4gYFRUTGApIGZ1bmN0aW9uCi1hbGxvd3MgdG8gc2VsZWN0IHRoZSB0aW1lc3RhbXAgb2Ygd2hlbiB0aGUgY29sdW1uIHdhcyBpbnNlcnRlZCAocmVzcC4KLXRoZSB0aW1lIHRvIGxpdmUgKGluIHNlY29uZHMpIGZvciB0aGUgY29sdW1uIChvciBudWxsIGlmIHRoZSBjb2x1bW4gaGFzCi1ubyBleHBpcmF0aW9uIHNldCkpIGFuZCB0aGUgbGluazojY2FzdEZ1bltgQ0FTVGBdIGZ1bmN0aW9uIGNhbiBiZSB1c2VkCi10byBjb252ZXJ0IG9uZSBkYXRhIHR5cGUgdG8gYW5vdGhlci4gVGhlIGBXUklURVRJTUVgIGFuZCBgVFRMYCBmdW5jdGlvbnMKLWNhbid0IGJlIHVzZWQgb24gbXVsdGktY2VsbCBjb2x1bW5zIHN1Y2ggYXMgbm9uLWZyb3plbiBjb2xsZWN0aW9ucyBvcgotbm9uLWZyb3plbiB1c2VyLWRlZmluZWQgdHlwZXMuCi0KLUFkZGl0aW9uYWxseSwgaW5kaXZpZHVhbCB2YWx1ZXMgb2YgbWFwcyBhbmQgc2V0cyBjYW4gYmUgc2VsZWN0ZWQgdXNpbmcKLWBbIDx0ZXJtPiBdYC4gRm9yIG1hcHMsIHRoaXMgd2lsbCByZXR1cm4gdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi1rZXksIGlmIHN1Y2ggZW50cnkgZXhpc3RzLiBGb3Igc2V0cywgdGhpcyB3aWxsIHJldHVybiB0aGUga2V5IHRoYXQgaXMKLXNlbGVjdGVkIGlmIGl0IGV4aXN0cyBhbmQgaXMgdGh1cyBtYWlubHkgYSB3YXkgdG8gY2hlY2sgZWxlbWVudAotZXhpc3RlbmNlLiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNlbGVjdCBhIHNsaWNlIG9mIGEgc2V0IG9yIG1hcCB3aXRoCi1gWyA8dGVybT4gLi4uIDx0ZXJtPiBgXSwgd2hlcmUgYm90aCBib3VuZCBjYW4gYmUgb21pdHRlZC4KLQotQW55IGA8c2VsZWN0b3I+YCBjYW4gYmUgYWxpYXNlZCB1c2luZyBgQVNgIGtleXdvcmQgKHNlZSBleGFtcGxlcykuCi1QbGVhc2Ugbm90ZSB0aGF0IGA8d2hlcmUtY2xhdXNlPmAgYW5kIGA8b3JkZXItYnk+YCBjbGF1c2Ugc2hvdWxkIHJlZmVyCi10byB0aGUgY29sdW1ucyBieSB0aGVpciBvcmlnaW5hbCBuYW1lcyBhbmQgbm90IGJ5IHRoZWlyIGFsaWFzZXMuCi0KLVRoZSBgQ09VTlRgIGtleXdvcmQgY2FuIGJlIHVzZWQgd2l0aCBwYXJlbnRoZXNpcyBlbmNsb3NpbmcgYCpgLiBJZiBzbywKLXRoZSBxdWVyeSB3aWxsIHJldHVybiBhIHNpbmdsZSByZXN1bHQ6IHRoZSBudW1iZXIgb2Ygcm93cyBtYXRjaGluZyB0aGUKLXF1ZXJ5LiBOb3RlIHRoYXQgYENPVU5UKDEpYCBpcyBzdXBwb3J0ZWQgYXMgYW4gYWxpYXMuCi0KLVtbc2VsZWN0V2hlcmVdXQotPT09PT0gYDx3aGVyZS1jbGF1c2U+YAotCi1UaGUgYDx3aGVyZS1jbGF1c2U+YCBzcGVjaWZpZXMgd2hpY2ggcm93cyBtdXN0IGJlIHF1ZXJpZWQuIEl0IGlzCi1jb21wb3NlZCBvZiByZWxhdGlvbnMgb24gdGhlIGNvbHVtbnMgdGhhdCBhcmUgcGFydCBvZiB0aGUgYFBSSU1BUlkgS0VZYAotYW5kL29yIGhhdmUgYSBsaW5rOiNjcmVhdGVJbmRleFN0bXRbc2Vjb25kYXJ5IGluZGV4XSBkZWZpbmVkIG9uIHRoZW0uCi0KLU5vdCBhbGwgcmVsYXRpb25zIGFyZSBhbGxvd2VkIGluIGEgcXVlcnkuIEZvciBpbnN0YW5jZSwgbm9uLWVxdWFsCi1yZWxhdGlvbnMgKHdoZXJlIGBJTmAgaXMgY29uc2lkZXJlZCBhcyBhbiBlcXVhbCByZWxhdGlvbikgb24gYSBwYXJ0aXRpb24KLWtleSBhcmUgbm90IHN1cHBvcnRlZCAoYnV0IHNlZSB0aGUgdXNlIG9mIHRoZSBgVE9LRU5gIG1ldGhvZCBiZWxvdyB0byBkbwotbm9uLWVxdWFsIHF1ZXJpZXMgb24gdGhlIHBhcnRpdGlvbiBrZXkpLiBNb3Jlb3ZlciwgZm9yIGEgZ2l2ZW4gcGFydGl0aW9uCi1rZXksIHRoZSBjbHVzdGVyaW5nIGNvbHVtbnMgaW5kdWNlIGFuIG9yZGVyaW5nIG9mIHJvd3MgYW5kIHJlbGF0aW9ucyBvbgotdGhlbSBpcyByZXN0cmljdGVkIHRvIHRoZSByZWxhdGlvbnMgdGhhdCBhbGxvdyB0byBzZWxlY3QgYSAqY29udGlndW91cyoKLShmb3IgdGhlIG9yZGVyaW5nKSBzZXQgb2Ygcm93cy4gRm9yIGluc3RhbmNlLCBnaXZlbgotCi1iYyhzYW1wbGUpLiArCi1DUkVBVEUgVEFCTEUgcG9zdHMgKCArCi11c2VyaWQgdGV4dCwgKwotYmxvZ190aXRsZSB0ZXh0LCArCi1wb3N0ZWRfYXQgdGltZXN0YW1wLCArCi1lbnRyeV90aXRsZSB0ZXh0LCArCi1jb250ZW50IHRleHQsICsKLWNhdGVnb3J5IGludCwgKwotUFJJTUFSWSBLRVkgKHVzZXJpZCwgYmxvZ190aXRsZSwgcG9zdGVkX2F0KSArCi0pCi0KLVRoZSBmb2xsb3dpbmcgcXVlcnkgaXMgYWxsb3dlZDoKLQotYmMoc2FtcGxlKS4gKwotU0VMRUNUIGVudHJ5X3RpdGxlLCBjb250ZW50IEZST00gcG9zdHMgV0hFUkUgdXNlcmlkPWBqb2huIGRvZScgQU5ECi1ibG9nX3RpdGxlPWBKb2huJ2BzIEJsb2cnIEFORCBwb3N0ZWRfYXQgPj0gYDIwMTItMDEtMDEnIEFORCBwb3N0ZWRfYXQgPAotYDIwMTItMDEtMzEnCi0KLUJ1dCB0aGUgZm9sbG93aW5nIG9uZSBpcyBub3QsIGFzIGl0IGRvZXMgbm90IHNlbGVjdCBhIGNvbnRpZ3VvdXMgc2V0IG9mCi1yb3dzIChhbmQgd2Ugc3VwcG9zZSBubyBzZWNvbmRhcnkgaW5kZXhlcyBhcmUgc2V0KToKLQotYmMoc2FtcGxlKS4gKwotLy8gTmVlZHMgYSBibG9nX3RpdGxlIHRvIGJlIHNldCB0byBzZWxlY3QgcmFuZ2VzIG9mIHBvc3RlZF9hdCArCi1TRUxFQ1QgZW50cnlfdGl0bGUsIGNvbnRlbnQgRlJPTSBwb3N0cyBXSEVSRSB1c2VyaWQ9YGpvaG4gZG9lJyBBTkQKLXBvc3RlZF9hdCA+PSBgMjAxMi0wMS0wMScgQU5EIHBvc3RlZF9hdCA8IGAyMDEyLTAxLTMxJwotCi1XaGVuIHNwZWNpZnlpbmcgcmVsYXRpb25zLCB0aGUgYFRPS0VOYCBmdW5jdGlvbiBjYW4gYmUgdXNlZCBvbiB0aGUKLWBQQVJUSVRJT04gS0VZYCBjb2x1bW4gdG8gcXVlcnkuIEluIHRoYXQgY2FzZSwgcm93cyB3aWxsIGJlIHNlbGVjdGVkCi1iYXNlZCBvbiB0aGUgdG9rZW4gb2YgdGhlaXIgYFBBUlRJVElPTl9LRVlgIHJhdGhlciB0aGFuIG9uIHRoZSB2YWx1ZS4KLU5vdGUgdGhhdCB0aGUgdG9rZW4gb2YgYSBrZXkgZGVwZW5kcyBvbiB0aGUgcGFydGl0aW9uZXIgaW4gdXNlLCBhbmQgdGhhdAotaW4gcGFydGljdWxhciB0aGUgUmFuZG9tUGFydGl0aW9uZXIgd29u4oCZdCB5aWVsZCBhIG1lYW5pbmdmdWwgb3JkZXIuIEFsc28KLW5vdGUgdGhhdCBvcmRlcmluZyBwYXJ0aXRpb25lcnMgYWx3YXlzIG9yZGVyIHRva2VuIHZhbHVlcyBieSBieXRlcyAoc28KLWV2ZW4gaWYgdGhlIHBhcnRpdGlvbiBrZXkgaXMgb2YgdHlwZSBpbnQsIGB0b2tlbigtMSkgPiB0b2tlbigwKWAgaW4KLXBhcnRpY3VsYXIpLiBFeGFtcGxlOgotCi1iYyhzYW1wbGUpLiArCi1TRUxFQ1QgKiBGUk9NIHBvc3RzIFdIRVJFIHRva2VuKHVzZXJpZCkgPiB0b2tlbihgdG9tJykgQU5EIHRva2VuKHVzZXJpZCkKLTwgdG9rZW4oYGJvYicpCi0KLU1vcmVvdmVyLCB0aGUgYElOYCByZWxhdGlvbiBpcyBvbmx5IGFsbG93ZWQgb24gdGhlIGxhc3QgY29sdW1uIG9mIHRoZQotcGFydGl0aW9uIGtleSBhbmQgb24gdGhlIGxhc3QgY29sdW1uIG9mIHRoZSBmdWxsIHByaW1hcnkga2V5LgotCi1JdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGBgZ3JvdXAnJyBgQ0xVU1RFUklORyBDT0xVTU5TYCB0b2dldGhlciBpbiBhCi1yZWxhdGlvbiB1c2luZyB0aGUgdHVwbGUgbm90YXRpb24uIEZvciBpbnN0YW5jZToKLQotYmMoc2FtcGxlKS4gKwotU0VMRUNUICogRlJPTSBwb3N0cyBXSEVSRSB1c2VyaWQ9YGpvaG4gZG9lJyBBTkQgKGJsb2dfdGl0bGUsIHBvc3RlZF9hdCkKLT4gKGBKb2huJ2BzIEJsb2cnLCBgMjAxMi0wMS0wMScpCi0KLXdpbGwgcmVxdWVzdCBhbGwgcm93cyB0aGF0IHNvcnRzIGFmdGVyIHRoZSBvbmUgaGF2aW5nIGBgSm9obuKAmXMgQmxvZycnIGFzCi1gYmxvZ190aWxlYCBhbmQgYDIwMTItMDEtMDEnIGZvciBgcG9zdGVkX2F0YCBpbiB0aGUgY2x1c3RlcmluZyBvcmRlci4gSW4KLXBhcnRpY3VsYXIsIHJvd3MgaGF2aW5nIGEgYHBvc3RfYXQgPD0gJzIwMTItMDEtMDEnYCB3aWxsIGJlIHJldHVybmVkIGFzCi1sb25nIGFzIHRoZWlyIGBibG9nX3RpdGxlID4gJ0pvaG4nJ3MgQmxvZydgLCB3aGljaCB3b3VsZG7igJl0IGJlIHRoZSBjYXNlCi1mb3I6Ci0KLWJjKHNhbXBsZSkuICsKLVNFTEVDVCAqIEZST00gcG9zdHMgV0hFUkUgdXNlcmlkPWBqb2huIGRvZScgQU5EIGJsb2dfdGl0bGUgPiBgSm9obidgcwotQmxvZycgQU5EIHBvc3RlZF9hdCA+IGAyMDEyLTAxLTAxJwotCi1UaGUgdHVwbGUgbm90YXRpb24gbWF5IGFsc28gYmUgdXNlZCBmb3IgYElOYCBjbGF1c2VzIG9uCi1gQ0xVU1RFUklORyBDT0xVTU5TYDoKLQotYmMoc2FtcGxlKS4gKwotU0VMRUNUICogRlJPTSBwb3N0cyBXSEVSRSB1c2VyaWQ9YGpvaG4gZG9lJyBBTkQgKGJsb2dfdGl0bGUsIHBvc3RlZF9hdCkKLUlOICgoYEpvaG4nYHMgQmxvZycsIGAyMDEyLTAxLTAxKSwgKOKAmUV4dHJlbWUgQ2hlc3MnLCBgMjAxNC0wNi0wMScpKQotCi1UaGUgYENPTlRBSU5TYCBvcGVyYXRvciBtYXkgb25seSBiZSB1c2VkIG9uIGNvbGxlY3Rpb24gY29sdW1ucyAobGlzdHMsCi1zZXRzLCBhbmQgbWFwcykuIEluIHRoZSBjYXNlIG9mIG1hcHMsIGBDT05UQUlOU2AgYXBwbGllcyB0byB0aGUgbWFwCi12YWx1ZXMuIFRoZSBgQ09OVEFJTlMgS0VZYCBvcGVyYXRvciBtYXkgb25seSBiZSB1c2VkIG9uIG1hcCBjb2x1bW5zIGFuZAotYXBwbGllcyB0byB0aGUgbWFwIGtleXMuCi0KLVtbc2VsZWN0T3JkZXJCeV1dCi09PT09PSBgPG9yZGVyLWJ5PmAKLQotVGhlIGBPUkRFUiBCWWAgb3B0aW9uIGFsbG93cyB0byBzZWxlY3QgdGhlIG9yZGVyIG9mIHRoZSByZXR1cm5lZAotcmVzdWx0cy4gSXQgdGFrZXMgYXMgYXJndW1lbnQgYSBsaXN0IG9mIGNvbHVtbiBuYW1lcyBhbG9uZyB3aXRoIHRoZQotb3JkZXIgZm9yIHRoZSBjb2x1bW4gKGBBU0NgIGZvciBhc2NlbmRhbnQgYW5kIGBERVNDYCBmb3IgZGVzY2VuZGFudCwKLW9taXR0aW5nIHRoZSBvcmRlciBiZWluZyBlcXVpdmFsZW50IHRvIGBBU0NgKS4gQ3VycmVudGx5IHRoZSBwb3NzaWJsZQotb3JkZXJpbmdzIGFyZSBsaW1pdGVkICh3aGljaCBkZXBlbmRzIG9uIHRoZSB0YWJsZQotbGluazojY3JlYXRlVGFibGVPcHRpb25zW2BDTFVTVEVSSU5HIE9SREVSYF0gKToKLQotKiBpZiB0aGUgdGFibGUgaGFzIGJlZW4gZGVmaW5lZCB3aXRob3V0IGFueSBzcGVjaWZpYyBgQ0xVU1RFUklORyBPUkRFUmAsCi10aGVuIHRoZW4gYWxsb3dlZCBvcmRlcmluZ3MgYXJlIHRoZSBvcmRlciBpbmR1Y2VkIGJ5IHRoZSBjbHVzdGVyaW5nCi1jb2x1bW5zIGFuZCB0aGUgcmV2ZXJzZSBvZiB0aGF0IG9uZS4KLSogb3RoZXJ3aXNlLCB0aGUgb3JkZXJpbmdzIGFsbG93ZWQgYXJlIHRoZSBvcmRlciBvZiB0aGUKLWBDTFVTVEVSSU5HIE9SREVSYCBvcHRpb24gYW5kIHRoZSByZXZlcnNlZCBvbmUuCi0KLVtbc2VsZWN0R3JvdXBCeV1dCi09PT09PSBgPGdyb3VwLWJ5PmAKLQotVGhlIGBHUk9VUCBCWWAgb3B0aW9uIGFsbG93cyB0byBjb25kZW5zZSBpbnRvIGEgc2luZ2xlIHJvdyBhbGwgc2VsZWN0ZWQKLXJvd3MgdGhhdCBzaGFyZSB0aGUgc2FtZSB2YWx1ZXMgZm9yIGEgc2V0IG9mIGNvbHVtbnMuCi0KLVVzaW5nIHRoZSBgR1JPVVAgQllgIG9wdGlvbiwgaXQgaXMgb25seSBwb3NzaWJsZSB0byBncm91cCByb3dzIGF0IHRoZQotcGFydGl0aW9uIGtleSBsZXZlbCBvciBhdCBhIGNsdXN0ZXJpbmcgY29sdW1uIGxldmVsLiBCeSBjb25zZXF1ZW5jZSwgdGhlCi1gR1JPVVAgQllgIG9wdGlvbiBvbmx5IGFjY2VwdCBhcyBhcmd1bWVudHMgcHJpbWFyeSBrZXkgY29sdW1uIG5hbWVzIGluCi10aGUgcHJpbWFyeSBrZXkgb3JkZXIuIElmIGEgcHJpbWFyeSBrZXkgY29sdW1uIGlzIHJlc3RyaWN0ZWQgYnkgYW4KLWVxdWFsaXR5IHJlc3RyaWN0aW9uIGl0IGlzIG5vdCByZXF1aXJlZCB0byBiZSBwcmVzZW50IGluIHRoZSBgR1JPVVAgQllgCi1jbGF1c2UuCi0KLUFnZ3JlZ2F0ZSBmdW5jdGlvbnMgd2lsbCBwcm9kdWNlIGEgc2VwYXJhdGUgdmFsdWUgZm9yIGVhY2ggZ3JvdXAuIElmIG5vCi1gR1JPVVAgQllgIGNsYXVzZSBpcyBzcGVjaWZpZWQsIGFnZ3JlZ2F0ZXMgZnVuY3Rpb25zIHdpbGwgcHJvZHVjZSBhCi1zaW5nbGUgdmFsdWUgZm9yIGFsbCB0aGUgcm93cy4KLQotSWYgYSBjb2x1bW4gaXMgc2VsZWN0ZWQgd2l0aG91dCBhbiBhZ2dyZWdhdGUgZnVuY3Rpb24sIGluIGEgc3RhdGVtZW50Ci13aXRoIGEgYEdST1VQIEJZYCwgdGhlIGZpcnN0IHZhbHVlIGVuY291bnRlciBpbiBlYWNoIGdyb3VwIHdpbGwgYmUKLXJldHVybmVkLgotCi1bW3NlbGVjdExpbWl0XV0KLT09PT09IGBMSU1JVGAgYW5kIGBQRVIgUEFSVElUSU9OIExJTUlUYAotCi1UaGUgYExJTUlUYCBvcHRpb24gdG8gYSBgU0VMRUNUYCBzdGF0ZW1lbnQgbGltaXRzIHRoZSBudW1iZXIgb2Ygcm93cwotcmV0dXJuZWQgYnkgYSBxdWVyeSwgd2hpbGUgdGhlIGBQRVIgUEFSVElUSU9OIExJTUlUYCBvcHRpb24gbGltaXRzIHRoZQotbnVtYmVyIG9mIHJvd3MgcmV0dXJuZWQgZm9yIGEgZ2l2ZW4gcGFydGl0aW9uIGJ5IHRoZSBxdWVyeS4gTm90ZSB0aGF0Ci1ib3RoIHR5cGUgb2YgbGltaXQgY2FuIHVzZWQgaW4gdGhlIHNhbWUgc3RhdGVtZW50LgotCi1bW3NlbGVjdEFsbG93RmlsdGVyaW5nXV0KLT09PT09IGBBTExPVyBGSUxURVJJTkdgCi0KLUJ5IGRlZmF1bHQsIENRTCBvbmx5IGFsbG93cyBzZWxlY3QgcXVlcmllcyB0aGF0IGRvbuKAmXQgaW52b2x2ZQotYGBmaWx0ZXJpbmcnJyBzZXJ2ZXIgc2lkZSwgaS5lLiBxdWVyaWVzIHdoZXJlIHdlIGtub3cgdGhhdCBhbGwgKGxpdmUpCi1yZWNvcmQgcmVhZCB3aWxsIGJlIHJldHVybmVkIChtYXliZSBwYXJ0bHkpIGluIHRoZSByZXN1bHQgc2V0LiBUaGUKLXJlYXNvbmluZyBpcyB0aGF0IHRob3NlIGBgbm9uIGZpbHRlcmluZycnIHF1ZXJpZXMgaGF2ZSBwcmVkaWN0YWJsZQotcGVyZm9ybWFuY2UgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSB3aWxsIGV4ZWN1dGUgaW4gYSB0aW1lIHRoYXQgaXMKLXByb3BvcnRpb25hbCB0byB0aGUgYW1vdW50IG9mIGRhdGEgKnJldHVybmVkKiBieSB0aGUgcXVlcnkgKHdoaWNoIGNhbiBiZQotY29udHJvbGxlZCB0aHJvdWdoIGBMSU1JVGApLgotCi1UaGUgYEFMTE9XIEZJTFRFUklOR2Agb3B0aW9uIGFsbG93cyB0byBleHBsaWNpdGx5IGFsbG93IChzb21lKSBxdWVyaWVzCi10aGF0IHJlcXVpcmUgZmlsdGVyaW5nLiBQbGVhc2Ugbm90ZSB0aGF0IGEgcXVlcnkgdXNpbmcgYEFMTE9XIEZJTFRFUklOR2AKLW1heSB0aHVzIGhhdmUgdW5wcmVkaWN0YWJsZSBwZXJmb3JtYW5jZSAoZm9yIHRoZSBkZWZpbml0aW9uIGFib3ZlKSwgaS5lLgotZXZlbiBhIHF1ZXJ5IHRoYXQgc2VsZWN0cyBhIGhhbmRmdWwgb2YgcmVjb3JkcyAqbWF5KiBleGhpYml0IHBlcmZvcm1hbmNlCi10aGF0IGRlcGVuZHMgb24gdGhlIHRvdGFsIGFtb3VudCBvZiBkYXRhIHN0b3JlZCBpbiB0aGUgY2x1c3Rlci4KLQotRm9yIGluc3RhbmNlLCBjb25zaWRlcmluZyB0aGUgZm9sbG93aW5nIHRhYmxlIGhvbGRpbmcgdXNlciBwcm9maWxlcyB3aXRoCi10aGVpciB5ZWFyIG9mIGJpcnRoICh3aXRoIGEgc2Vjb25kYXJ5IGluZGV4IG9uIGl0KSBhbmQgY291bnRyeSBvZgotcmVzaWRlbmNlOgotCi1iYyhzYW1wbGUpLi4gKwotQ1JFQVRFIFRBQkxFIHVzZXJzICggKwotdXNlcm5hbWUgdGV4dCBQUklNQVJZIEtFWSwgKwotZmlyc3RuYW1lIHRleHQsICsKLWxhc3RuYW1lIHRleHQsICsKLWJpcnRoX3llYXIgaW50LCArCi1jb3VudHJ5IHRleHQgKwotKQotCi1DUkVBVEUgSU5ERVggT04gdXNlcnMoYmlydGhfeWVhcik7ICsKLXAuCi0KLVRoZW4gdGhlIGZvbGxvd2luZyBxdWVyaWVzIGFyZSB2YWxpZDoKLQotYmMoc2FtcGxlKS4gKwotU0VMRUNUICogRlJPTSB1c2VyczsgKwotU0VMRUNUIGZpcnN0bmFtZSwgbGFzdG5hbWUgRlJPTSB1c2VycyBXSEVSRSBiaXJ0aF95ZWFyID0gMTk4MTsKLQotYmVjYXVzZSBpbiBib3RoIGNhc2UsIENhc3NhbmRyYSBndWFyYW50ZWVzIHRoYXQgdGhlc2UgcXVlcmllcwotcGVyZm9ybWFuY2Ugd2lsbCBiZSBwcm9wb3J0aW9uYWwgdG8gdGhlIGFtb3VudCBvZiBkYXRhIHJldHVybmVkLiBJbgotcGFydGljdWxhciwgaWYgbm8gdXNlcnMgYXJlIGJvcm4gaW4gMTk4MSwgdGhlbiB0aGUgc2Vjb25kIHF1ZXJ5Ci1wZXJmb3JtYW5jZSB3aWxsIG5vdCBkZXBlbmQgb2YgdGhlIG51bWJlciBvZiB1c2VyIHByb2ZpbGUgc3RvcmVkIGluIHRoZQotZGF0YWJhc2UgKG5vdCBkaXJlY3RseSBhdCBsZWFzdDogZHVlIHRvIHNlY29uZGFyeSBpbmRleCBpbXBsZW1lbnRhdGlvbgotY29uc2lkZXJhdGlvbiwgdGhpcyBxdWVyeSBtYXkgc3RpbGwgZGVwZW5kIG9uIHRoZSBudW1iZXIgb2Ygbm9kZSBpbiB0aGUKLWNsdXN0ZXIsIHdoaWNoIGluZGlyZWN0bHkgZGVwZW5kcyBvbiB0aGUgYW1vdW50IG9mIGRhdGEgc3RvcmVkLgotTmV2ZXJ0aGVsZXNzLCB0aGUgbnVtYmVyIG9mIG5vZGVzIHdpbGwgYWx3YXlzIGJlIG11bHRpcGxlIG51bWJlciBvZgotbWFnbml0dWRlIGxvd2VyIHRoYW4gdGhlIG51bWJlciBvZiB1c2VyIHByb2ZpbGUgc3RvcmVkKS4gT2YgY291cnNlLCBib3RoCi1xdWVyeSBtYXkgcmV0dXJuIHZlcnkgbGFyZ2UgcmVzdWx0IHNldCBpbiBwcmFjdGljZSwgYnV0IHRoZSBhbW91bnQgb2YKLWRhdGEgcmV0dXJuZWQgY2FuIGFsd2F5cyBiZSBjb250cm9sbGVkIGJ5IGFkZGluZyBhIGBMSU1JVGAuCi0KLUhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgcXVlcnkgd2lsbCBiZSByZWplY3RlZDoKLQotYmMoc2FtcGxlKS4gKwotU0VMRUNUIGZpcnN0bmFtZSwgbGFzdG5hbWUgRlJPTSB1c2VycyBXSEVSRSBiaXJ0aF95ZWFyID0gMTk4MSBBTkQKLWNvdW50cnkgPSBgRlInOwotCi1iZWNhdXNlIENhc3NhbmRyYSBjYW5ub3QgZ3VhcmFudGVlIHRoYXQgaXQgd29u4oCZdCBoYXZlIHRvIHNjYW4gbGFyZ2UKLWFtb3VudCBvZiBkYXRhIGV2ZW4gaWYgdGhlIHJlc3VsdCB0byB0aG9zZSBxdWVyeSBpcyBzbWFsbC4gVHlwaWNhbGx5LCBpdAotd2lsbCBzY2FuIGFsbCB0aGUgaW5kZXggZW50cmllcyBmb3IgdXNlcnMgYm9ybiBpbiAxOTgxIGV2ZW4gaWYgb25seSBhCi1oYW5kZnVsIGFyZSBhY3R1YWxseSBmcm9tIEZyYW5jZS4gSG93ZXZlciwgaWYgeW91IGBga25vdyB3aGF0IHlvdSBhcmUKLWRvaW5nJycsIHlvdSBjYW4gZm9yY2UgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIHF1ZXJ5IGJ5IHVzaW5nCi1gQUxMT1cgRklMVEVSSU5HYCBhbmQgc28gdGhlIGZvbGxvd2luZyBxdWVyeSBpcyB2YWxpZDoKLQotYmMoc2FtcGxlKS4gKwotU0VMRUNUIGZpcnN0bmFtZSwgbGFzdG5hbWUgRlJPTSB1c2VycyBXSEVSRSBiaXJ0aF95ZWFyID0gMTk4MSBBTkQKLWNvdW50cnkgPSBgRlInIEFMTE9XIEZJTFRFUklORzsKLQotW1tkYXRhYmFzZVJvbGVzXV0KLT09PSBEYXRhYmFzZSBSb2xlcwotCi1bW2NyZWF0ZVJvbGVTdG10XV0KLT09PT0gQ1JFQVRFIFJPTEUKLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuLiArCi06Oj0gQ1JFQVRFIFJPTEUgKCBJRiBOT1QgRVhJU1RTICk/ICggV0lUSCAoIEFORCApKiApPwotCi06Oj0gUEFTU1dPUkQgPSAgKwotfCBMT0dJTiA9ICArCi18IFNVUEVSVVNFUiA9ICArCi18IE9QVElPTlMgPSAgKwotcC4KLQotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuICsKLUNSRUFURSBST0xFIG5ld19yb2xlOyArCi1DUkVBVEUgUk9MRSBhbGljZSBXSVRIIFBBU1NXT1JEID0gYHBhc3N3b3JkX2EnIEFORCBMT0dJTiA9IHRydWU7ICsKLUNSRUFURSBST0xFIGJvYiBXSVRIIFBBU1NXT1JEID0gYHBhc3N3b3JkX2InIEFORCBMT0dJTiA9IHRydWUgQU5ECi1TVVBFUlVTRVIgPSB0cnVlOyArCi1DUkVBVEUgUk9MRSBjYXJsb3MgV0lUSCBPUFRJT05TID0gXHsgYGN1c3RvbV9vcHRpb24xJyA6IGBvcHRpb24xX3ZhbHVlJywKLWBjdXN0b21fb3B0aW9uMicgOiA5OSB9OwotCi1CeSBkZWZhdWx0IHJvbGVzIGRvIG5vdCBwb3NzZXNzIGBMT0dJTmAgcHJpdmlsZWdlcyBvciBgU1VQRVJVU0VSYAotc3RhdHVzLgotCi1saW5rOiNwZXJtaXNzaW9uc1tQZXJtaXNzaW9uc10gb24gZGF0YWJhc2UgcmVzb3VyY2VzIGFyZSBncmFudGVkIHRvCi1yb2xlczsgdHlwZXMgb2YgcmVzb3VyY2VzIGluY2x1ZGUga2V5c3BhY2VzLCB0YWJsZXMsIGZ1bmN0aW9ucyBhbmQgcm9sZXMKLXRoZW1zZWx2ZXMuIFJvbGVzIG1heSBiZSBncmFudGVkIHRvIG90aGVyIHJvbGVzIHRvIGNyZWF0ZSBoaWVyYXJjaGljYWwKLXBlcm1pc3Npb25zIHN0cnVjdHVyZXM7IGluIHRoZXNlIGhpZXJhcmNoaWVzLCBwZXJtaXNzaW9ucyBhbmQKLWBTVVBFUlVTRVJgIHN0YXR1cyBhcmUgaW5oZXJpdGVkLCBidXQgdGhlIGBMT0dJTmAgcHJpdmlsZWdlIGlzIG5vdC4KLQotSWYgYSByb2xlIGhhcyB0aGUgYExPR0lOYCBwcml2aWxlZ2UsIGNsaWVudHMgbWF5IGlkZW50aWZ5IGFzIHRoYXQgcm9sZQotd2hlbiBjb25uZWN0aW5nLiBGb3IgdGhlIGR1cmF0aW9uIG9mIHRoYXQgY29ubmVjdGlvbiwgdGhlIGNsaWVudCB3aWxsCi1hY3F1aXJlIGFueSByb2xlcyBhbmQgcHJpdmlsZWdlcyBncmFudGVkIHRvIHRoYXQgcm9sZS4KLQotT25seSBhIGNsaWVudCB3aXRoIHdpdGggdGhlIGBDUkVBVEVgIHBlcm1pc3Npb24gb24gdGhlIGRhdGFiYXNlIHJvbGVzCi1yZXNvdXJjZSBtYXkgaXNzdWUgYENSRUFURSBST0xFYCByZXF1ZXN0cyAoc2VlIHRoZQotbGluazojcGVybWlzc2lvbnNbcmVsZXZhbnQgc2VjdGlvbl0gYmVsb3cpLCB1bmxlc3MgdGhlIGNsaWVudCBpcyBhCi1gU1VQRVJVU0VSYC4gUm9sZSBtYW5hZ2VtZW50IGluIENhc3NhbmRyYSBpcyBwbHVnZ2FibGUgYW5kIGN1c3RvbQotaW1wbGVtZW50YXRpb25zIG1heSBzdXBwb3J0IG9ubHkgYSBzdWJzZXQgb2YgdGhlIGxpc3RlZCBvcHRpb25zLgotCi1Sb2xlIG5hbWVzIHNob3VsZCBiZSBxdW90ZWQgaWYgdGhleSBjb250YWluIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycy4KLQotW1tjcmVhdGVSb2xlUHdkXV0KLT09PT09IFNldHRpbmcgY3JlZGVudGlhbHMgZm9yIGludGVybmFsIGF1dGhlbnRpY2F0aW9uCi0KLVVzZSB0aGUgYFdJVEggUEFTU1dPUkRgIGNsYXVzZSB0byBzZXQgYSBwYXNzd29yZCBmb3IgaW50ZXJuYWwKLWF1dGhlbnRpY2F0aW9uLCBlbmNsb3NpbmcgdGhlIHBhc3N3b3JkIGluIHNpbmdsZSBxdW90YXRpb24gbWFya3MuICsKLUlmIGludGVybmFsIGF1dGhlbnRpY2F0aW9uIGhhcyBub3QgYmVlbiBzZXQgdXAgb3IgdGhlIHJvbGUgZG9lcyBub3QgaGF2ZQotYExPR0lOYCBwcml2aWxlZ2VzLCB0aGUgYFdJVEggUEFTU1dPUkRgIGNsYXVzZSBpcyBub3QgbmVjZXNzYXJ5LgotCi1bW2NyZWF0ZVJvbGVDb25kaXRpb25hbF1dCi09PT09PSBDcmVhdGluZyBhIHJvbGUgY29uZGl0aW9uYWxseQotCi1BdHRlbXB0aW5nIHRvIGNyZWF0ZSBhbiBleGlzdGluZyByb2xlIHJlc3VsdHMgaW4gYW4gaW52YWxpZCBxdWVyeQotY29uZGl0aW9uIHVubGVzcyB0aGUgYElGIE5PVCBFWElTVFNgIG9wdGlvbiBpcyB1c2VkLiBJZiB0aGUgb3B0aW9uIGlzCi11c2VkIGFuZCB0aGUgcm9sZSBleGlzdHMsIHRoZSBzdGF0ZW1lbnQgaXMgYSBuby1vcC4KLQotYmMoc2FtcGxlKS4gKwotQ1JFQVRFIFJPTEUgb3RoZXJfcm9sZTsgKwotQ1JFQVRFIFJPTEUgSUYgTk9UIEVYSVNUUyBvdGhlcl9yb2xlOwotCi1bW2FsdGVyUm9sZVN0bXRdXQotPT09PSBBTFRFUiBST0xFCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLi4gKwotOjo9IEFMVEVSIFJPTEUgKElGIEVYSVNUUyk/ICggV0lUSCAoIEFORCApKiApPwotCi06Oj0gUEFTU1dPUkQgPSAgKwotfCBMT0dJTiA9ICArCi18IFNVUEVSVVNFUiA9ICArCi18IE9QVElPTlMgPSAgKwotcC4KLQotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuICsKLUFMVEVSIFJPTEUgYm9iIFdJVEggUEFTU1dPUkQgPSBgUEFTU1dPUkRfQicgQU5EIFNVUEVSVVNFUiA9IGZhbHNlOwotCi1JZiB0aGUgcm9sZSBkb2VzIG5vdCBleGlzdCwgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCi0KLUNvbmRpdGlvbnMgb24gZXhlY3V0aW5nIGBBTFRFUiBST0xFYCBzdGF0ZW1lbnRzOgotCi0qIEEgY2xpZW50IG11c3QgaGF2ZSBgU1VQRVJVU0VSYCBzdGF0dXMgdG8gYWx0ZXIgdGhlIGBTVVBFUlVTRVJgIHN0YXR1cwotb2YgYW5vdGhlciByb2xlCi0qIEEgY2xpZW50IGNhbm5vdCBhbHRlciB0aGUgYFNVUEVSVVNFUmAgc3RhdHVzIG9mIGFueSByb2xlIGl0IGN1cnJlbnRseQotaG9sZHMKLSogQSBjbGllbnQgY2FuIG9ubHkgbW9kaWZ5IGNlcnRhaW4gcHJvcGVydGllcyBvZiB0aGUgcm9sZSB3aXRoIHdoaWNoIGl0Ci1pZGVudGlmaWVkIGF0IGxvZ2luIChlLmcuIGBQQVNTV09SRGApCi0qIFRvIG1vZGlmeSBwcm9wZXJ0aWVzIG9mIGEgcm9sZSwgdGhlIGNsaWVudCBtdXN0IGJlIGdyYW50ZWQgYEFMVEVSYAotbGluazojcGVybWlzc2lvbnNbcGVybWlzc2lvbl0gb24gdGhhdCByb2xlCi0KLVtbZHJvcFJvbGVTdG10XV0KLT09PT0gRFJPUCBST0xFCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLi4gKwotOjo9IERST1AgUk9MRSAoIElGIEVYSVNUUyApPyAgKwotcC4KLQotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuICsKLURST1AgUk9MRSBhbGljZTsgKwotRFJPUCBST0xFIElGIEVYSVNUUyBib2I7Ci0KLWBEUk9QIFJPTEVgIHJlcXVpcmVzIHRoZSBjbGllbnQgdG8gaGF2ZSBgRFJPUGAKLWxpbms6I3Blcm1pc3Npb25zW3Blcm1pc3Npb25dIG9uIHRoZSByb2xlIGluIHF1ZXN0aW9uLiBJbiBhZGRpdGlvbiwKLWNsaWVudCBtYXkgbm90IGBEUk9QYCB0aGUgcm9sZSB3aXRoIHdoaWNoIGl0IGlkZW50aWZpZWQgYXQgbG9naW4uCi1GaW5hbHksIG9ubHkgYSBjbGllbnQgd2l0aCBgU1VQRVJVU0VSYCBzdGF0dXMgbWF5IGBEUk9QYCBhbm90aGVyCi1gU1VQRVJVU0VSYCByb2xlLiArCi1BdHRlbXB0aW5nIHRvIGRyb3AgYSByb2xlIHdoaWNoIGRvZXMgbm90IGV4aXN0IHJlc3VsdHMgaW4gYW4gaW52YWxpZAotcXVlcnkgY29uZGl0aW9uIHVubGVzcyB0aGUgYElGIEVYSVNUU2Agb3B0aW9uIGlzIHVzZWQuIElmIHRoZSBvcHRpb24gaXMKLXVzZWQgYW5kIHRoZSByb2xlIGRvZXMgbm90IGV4aXN0IHRoZSBzdGF0ZW1lbnQgaXMgYSBuby1vcC4KLQotW1tncmFudFJvbGVTdG10XV0KLT09PT0gR1JBTlQgUk9MRQotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4gKwotOjo9IEdSQU5UIFRPCi0KLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLiArCi1HUkFOVCByZXBvcnRfd3JpdGVyIFRPIGFsaWNlOwotCi1UaGlzIHN0YXRlbWVudCBncmFudHMgdGhlIGByZXBvcnRfd3JpdGVyYCByb2xlIHRvIGBhbGljZWAuIEFueQotcGVybWlzc2lvbnMgZ3JhbnRlZCB0byBgcmVwb3J0X3dyaXRlcmAgYXJlIGFsc28gYWNxdWlyZWQgYnkgYGFsaWNlYC4gKwotUm9sZXMgYXJlIG1vZGVsbGVkIGFzIGEgZGlyZWN0ZWQgYWN5Y2xpYyBncmFwaCwgc28gY2lyY3VsYXIgZ3JhbnRzIGFyZQotbm90IHBlcm1pdHRlZC4gVGhlIGZvbGxvd2luZyBleGFtcGxlcyByZXN1bHQgaW4gZXJyb3IgY29uZGl0aW9uczoKLQotYmMoc2FtcGxlKS4gKwotR1JBTlQgcm9sZV9hIFRPIHJvbGVfYjsgKwotR1JBTlQgcm9sZV9iIFRPIHJvbGVfYTsKLQotYmMoc2FtcGxlKS4gKwotR1JBTlQgcm9sZV9hIFRPIHJvbGVfYjsgKwotR1JBTlQgcm9sZV9iIFRPIHJvbGVfYzsgKwotR1JBTlQgcm9sZV9jIFRPIHJvbGVfYTsKLQotW1tyZXZva2VSb2xlU3RtdF1dCi09PT09IFJFVk9LRSBST0xFCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLiArCi06Oj0gUkVWT0tFIEZST00KLQotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuICsKLVJFVk9LRSByZXBvcnRfd3JpdGVyIEZST00gYWxpY2U7Ci0KLVRoaXMgc3RhdGVtZW50IHJldm9rZXMgdGhlIGByZXBvcnRfd3JpdGVyYCByb2xlIGZyb20gYGFsaWNlYC4gQW55Ci1wZXJtaXNzaW9ucyB0aGF0IGBhbGljZWAgaGFzIGFjcXVpcmVkIHZpYSB0aGUgYHJlcG9ydF93cml0ZXJgIHJvbGUgYXJlCi1hbHNvIHJldm9rZWQuCi0KLVtbbGlzdFJvbGVzU3RtdF1dCi09PT09PSBMSVNUIFJPTEVTCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLiArCi06Oj0gTElTVCBST0xFUyAoIE9GICk/ICggTk9SRUNVUlNJVkUgKT8KLQotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuICsKLUxJU1QgUk9MRVM7Ci0KLVJldHVybiBhbGwga25vd24gcm9sZXMgaW4gdGhlIHN5c3RlbSwgdGhpcyByZXF1aXJlcyBgREVTQ1JJQkVgCi1wZXJtaXNzaW9uIG9uIHRoZSBkYXRhYmFzZSByb2xlcyByZXNvdXJjZS4KLQotYmMoc2FtcGxlKS4gKwotTElTVCBST0xFUyBPRiBgYWxpY2VgOwotCi1FbnVtZXJhdGUgYWxsIHJvbGVzIGdyYW50ZWQgdG8gYGFsaWNlYCwgaW5jbHVkaW5nIHRob3NlIHRyYW5zaXRpdmVseQotYXF1aXJlZC4KLQotYmMoc2FtcGxlKS4gKwotTElTVCBST0xFUyBPRiBgYm9iYCBOT1JFQ1VSU0lWRQotCi1MaXN0IGFsbCByb2xlcyBkaXJlY3RseSBncmFudGVkIHRvIGBib2JgLgotCi1bW2NyZWF0ZVVzZXJTdG10XV0KLT09PT0gQ1JFQVRFIFVTRVIKLQotUHJpb3IgdG8gdGhlIGludHJvZHVjdGlvbiBvZiByb2xlcyBpbiBDYXNzYW5kcmEgMi4yLCBhdXRoZW50aWNhdGlvbiBhbmQKLWF1dGhvcml6YXRpb24gd2VyZSBiYXNlZCBhcm91bmQgdGhlIGNvbmNlcHQgb2YgYSBgVVNFUmAuIEZvciBiYWNrd2FyZAotY29tcGF0aWJpbGl0eSwgdGhlIGxlZ2FjeSBzeW50YXggaGFzIGJlZW4gcHJlc2VydmVkIHdpdGggYFVTRVJgIGNlbnRyaWMKLXN0YXRtZW50cyBiZWNvbWluZyBzeW5vbnltcyBmb3IgdGhlIGBST0xFYCBiYXNlZCBlcXVpdmFsZW50cy4KLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuLiArCi06Oj0gQ1JFQVRFIFVTRVIgKCBJRiBOT1QgRVhJU1RTICk/ICggV0lUSCBQQVNTV09SRCApPyAoKT8KLQotOjo9IFNVUEVSVVNFUiArCi18IE5PU1VQRVJVU0VSICsKLXAuCi0KLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLiArCi1DUkVBVEUgVVNFUiBhbGljZSBXSVRIIFBBU1NXT1JEIGBwYXNzd29yZF9hJyBTVVBFUlVTRVI7ICsKLUNSRUFURSBVU0VSIGJvYiBXSVRIIFBBU1NXT1JEIGBwYXNzd29yZF9iJyBOT1NVUEVSVVNFUjsKLQotYENSRUFURSBVU0VSYCBpcyBlcXVpdmFsZW50IHRvIGBDUkVBVEUgUk9MRWAgd2hlcmUgdGhlIGBMT0dJTmAgb3B0aW9uIGlzCi1gdHJ1ZWAuIFNvLCB0aGUgZm9sbG93aW5nIHBhaXJzIG9mIHN0YXRlbWVudHMgYXJlIGVxdWl2YWxlbnQ6Ci0KLWJjKHNhbXBsZSkuLiArCi1DUkVBVEUgVVNFUiBhbGljZSBXSVRIIFBBU1NXT1JEIGBwYXNzd29yZF9hJyBTVVBFUlVTRVI7ICsKLUNSRUFURSBST0xFIGFsaWNlIFdJVEggUEFTU1dPUkQgPSBgcGFzc3dvcmRfYScgQU5EIExPR0lOID0gdHJ1ZSBBTkQKLVNVUEVSVVNFUiA9IHRydWU7Ci0KLUNSRUFURSBVU0VSIElGIE5PVCBFWElTVFMgYWxpY2UgV0lUSCBQQVNTV09SRCBgcGFzc3dvcmRfYScgU1VQRVJVU0VSOyArCi1DUkVBVEUgUk9MRSBJRiBOT1QgRVhJU1RTIGFsaWNlIFdJVEggUEFTU1dPUkQgPSBgcGFzc3dvcmRfYScgQU5EIExPR0lOID0KLXRydWUgQU5EIFNVUEVSVVNFUiA9IHRydWU7Ci0KLUNSRUFURSBVU0VSIGFsaWNlIFdJVEggUEFTU1dPUkQgYHBhc3N3b3JkX2EnIE5PU1VQRVJVU0VSOyArCi1DUkVBVEUgUk9MRSBhbGljZSBXSVRIIFBBU1NXT1JEID0gYHBhc3N3b3JkX2EnIEFORCBMT0dJTiA9IHRydWUgQU5ECi1TVVBFUlVTRVIgPSBmYWxzZTsKLQotQ1JFQVRFIFVTRVIgYWxpY2UgV0lUSCBQQVNTV09SRCBgcGFzc3dvcmRfYScgTk9TVVBFUlVTRVI7ICsKLUNSRUFURSBST0xFIGFsaWNlIFdJVEggUEFTU1dPUkQgPSBgcGFzc3dvcmRfYScgQU5EIExPR0lOID0gdHJ1ZTsKLQotQ1JFQVRFIFVTRVIgYWxpY2UgV0lUSCBQQVNTV09SRCBgcGFzc3dvcmRfYSc7ICsKLUNSRUFURSBST0xFIGFsaWNlIFdJVEggUEFTU1dPUkQgPSBgcGFzc3dvcmRfYScgQU5EIExPR0lOID0gdHJ1ZTsgKwotcC4KLQotW1thbHRlclVzZXJTdG10XV0KLT09PT0gQUxURVIgVVNFUgotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4uICsKLTo6PSBBTFRFUiBVU0VSIChJRiBFWElTVFMpPyAoIFdJVEggUEFTU1dPUkQgKT8gKCApPwotCi06Oj0gU1VQRVJVU0VSICsKLXwgTk9TVVBFUlVTRVIgKwotcC4KLQotYmMoc2FtcGxlKS4gKwotQUxURVIgVVNFUiBhbGljZSBXSVRIIFBBU1NXT1JEIGBQQVNTV09SRF9BJzsgKwotQUxURVIgVVNFUiBib2IgU1VQRVJVU0VSOwotCi1JZiB0aGUgdXNlciBkb2VzIG5vdCBleGlzdCwgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCi0KLVtbZHJvcFVzZXJTdG10XV0KLT09PT0gRFJPUCBVU0VSCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLi4gKwotOjo9IERST1AgVVNFUiAoIElGIEVYSVNUUyApPyAgKwotcC4KLQotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuICsKLURST1AgVVNFUiBhbGljZTsgKwotRFJPUCBVU0VSIElGIEVYSVNUUyBib2I7Ci0KLVtbbGlzdFVzZXJzU3RtdF1dCi09PT09IExJU1QgVVNFUlMKLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuICsKLTo6PSBMSVNUIFVTRVJTOwotCi1fU2FtcGxlOl8KLQotYmMoc2FtcGxlKS4gKwotTElTVCBVU0VSUzsKLQotVGhpcyBzdGF0ZW1lbnQgaXMgZXF1aXZhbGVudCB0bwotCi1iYyhzYW1wbGUpLiArCi1MSVNUIFJPTEVTOwotCi1idXQgb25seSByb2xlcyB3aXRoIHRoZSBgTE9HSU5gIHByaXZpbGVnZSBhcmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dC4KLQotW1tkYXRhQ29udHJvbF1dCi09PT0gRGF0YSBDb250cm9sCi0KLT09PT0gUGVybWlzc2lvbnMKLQotUGVybWlzc2lvbnMgb24gcmVzb3VyY2VzIGFyZSBncmFudGVkIHRvIHJvbGVzOyB0aGVyZSBhcmUgc2V2ZXJhbAotZGlmZmVyZW50IHR5cGVzIG9mIHJlc291cmNlcyBpbiBDYXNzYW5kcmEgYW5kIGVhY2ggdHlwZSBpcyBtb2RlbGxlZAotaGllcmFyY2hpY2FsbHk6Ci0KLSogVGhlIGhpZXJhcmNoeSBvZiBEYXRhIHJlc291cmNlcywgS2V5c3BhY2VzIGFuZCBUYWJsZXMgaGFzIHRoZQotc3RydWN0dXJlIGBBTEwgS0VZU1BBQ0VTYCAtPiBgS0VZU1BBQ0VgIC0+IGBUQUJMRWAKLSogRnVuY3Rpb24gcmVzb3VyY2VzIGhhdmUgdGhlIHN0cnVjdHVyZSBgQUxMIEZVTkNUSU9OU2AgLT4gYEtFWVNQQUNFYCAtPgotYEZVTkNUSU9OYAotKiBSZXNvdXJjZXMgcmVwcmVzZW50aW5nIHJvbGVzIGhhdmUgdGhlIHN0cnVjdHVyZSBgQUxMIFJPTEVTYCAtPiBgUk9MRWAKLSogUmVzb3VyY2VzIHJlcHJlc2VudGluZyBKTVggT2JqZWN0TmFtZXMsIHdoaWNoIG1hcCB0byBzZXRzIG9mCi1NQmVhbnMvTVhCZWFucywgaGF2ZSB0aGUgc3RydWN0dXJlIGBBTEwgTUJFQU5TYCAtPiBgTUJFQU5gCi0KLVBlcm1pc3Npb25zIGNhbiBiZSBncmFudGVkIGF0IGFueSBsZXZlbCBvZiB0aGVzZSBoaWVyYXJjaGllcyBhbmQgdGhleQotZmxvdyBkb3dud2FyZHMuIFNvIGdyYW50aW5nIGEgcGVybWlzc2lvbiBvbiBhIHJlc291cmNlIGhpZ2hlciB1cCB0aGUKLWNoYWluIGF1dG9tYXRpY2FsbHkgZ3JhbnRzIHRoYXQgc2FtZSBwZXJtaXNzaW9uIG9uIGFsbCByZXNvdXJjZXMgbG93ZXIKLWRvd24uIEZvciBleGFtcGxlLCBncmFudGluZyBgU0VMRUNUYCBvbiBhIGBLRVlTUEFDRWAgYXV0b21hdGljYWxseQotZ3JhbnRzIGl0IG9uIGFsbCBgVEFCTEVTYCBpbiB0aGF0IGBLRVlTUEFDRWAuIExpa2V3aXNlLCBncmFudGluZyBhCi1wZXJtaXNzaW9uIG9uIGBBTEwgRlVOQ1RJT05TYCBncmFudHMgaXQgb24gZXZlcnkgZGVmaW5lZCBmdW5jdGlvbiwKLXJlZ2FyZGxlc3Mgb2Ygd2hpY2gga2V5c3BhY2UgaXQgaXMgc2NvcGVkIGluLiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvCi1ncmFudCBwZXJtaXNzaW9ucyBvbiBhbGwgZnVuY3Rpb25zIHNjb3BlZCB0byBhIHBhcnRpY3VsYXIga2V5c3BhY2UuCi0KLU1vZGlmaWNhdGlvbnMgdG8gcGVybWlzc2lvbnMgYXJlIHZpc2libGUgdG8gZXhpc3RpbmcgY2xpZW50IHNlc3Npb25zOwotdGhhdCBpcywgY29ubmVjdGlvbnMgbmVlZCBub3QgYmUgcmUtZXN0YWJsaXNoZWQgZm9sbG93aW5nIHBlcm1pc3Npb25zCi1jaGFuZ2VzLgotCi1UaGUgZnVsbCBzZXQgb2YgYXZhaWxhYmxlIHBlcm1pc3Npb25zIGlzOgotCi0qIGBDUkVBVEVgCi0qIGBBTFRFUmAKLSogYERST1BgCi0qIGBTRUxFQ1RgCi0qIGBNT0RJRllgCi0qIGBBVVRIT1JJWkVgCi0qIGBERVNDUklCRWAKLSogYEVYRUNVVEVgCi0KLU5vdCBhbGwgcGVybWlzc2lvbnMgYXJlIGFwcGxpY2FibGUgdG8gZXZlcnkgdHlwZSBvZiByZXNvdXJjZS4gRm9yCi1pbnN0YW5jZSwgYEVYRUNVVEVgIGlzIG9ubHkgcmVsZXZhbnQgaW4gdGhlIGNvbnRleHQgb2YgZnVuY3Rpb25zIG9yCi1tYmVhbnM7IGdyYW50aW5nIGBFWEVDVVRFYCBvbiBhIHJlc291cmNlIHJlcHJlc2VudGluZyBhIHRhYmxlIGlzCi1ub25zZW5zaWNhbC4gQXR0ZW1wdGluZyB0byBgR1JBTlRgIGEgcGVybWlzc2lvbiBvbiByZXNvdXJjZSB0byB3aGljaCBpdAotY2Fubm90IGJlIGFwcGxpZWQgcmVzdWx0cyBpbiBhbiBlcnJvciByZXNwb25zZS4gVGhlIGZvbGxvd2luZwotaWxsdXN0cmF0ZXMgd2hpY2ggcGVybWlzc2lvbnMgY2FuIGJlIGdyYW50ZWQgb24gd2hpY2ggdHlwZXMgb2YgcmVzb3VyY2UsCi1hbmQgd2hpY2ggc3RhdGVtZW50cyBhcmUgZW5hYmxlZCBieSB0aGF0IHBlcm1pc3Npb24uCi0KLVtjb2xzPSIsLCwsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18cGVybWlzc2lvbiB8cmVzb3VyY2UgfG9wZXJhdGlvbnMgfCB8IHwKLXxgQ1JFQVRFYCB8YEFMTCBLRVlTUEFDRVNgIHxgQ1JFQVRFIEtFWVNQQUNFYCA8YnI+IGBDUkVBVEUgVEFCTEVgIGluIGFueQota2V5c3BhY2UgfCB8IHwKLQotfGBDUkVBVEVgIHxgS0VZU1BBQ0VgIHxgQ1JFQVRFIFRBQkxFYCBpbiBzcGVjaWZpZWQga2V5c3BhY2UgfCB8IHwKLQotfGBDUkVBVEVgIHxgQUxMIEZVTkNUSU9OU2AgfGBDUkVBVEUgRlVOQ1RJT05gIGluIGFueSBrZXlzcGFjZSA8YnI+Ci1gQ1JFQVRFIEFHR1JFR0FURWAgaW4gYW55IGtleXNwYWNlIHwgfCB8Ci0KLXxgQ1JFQVRFYCB8YEFMTCBGVU5DVElPTlMgSU4gS0VZU1BBQ0VgIHxgQ1JFQVRFIEZVTkNUSU9OYCBpbiBrZXlzcGFjZQotPGJyPiBgQ1JFQVRFIEFHR1JFR0FURWAgaW4ga2V5c3BhY2UgfCB8IHwKLQotfGBDUkVBVEVgIHxgQUxMIFJPTEVTYCB8YENSRUFURSBST0xFYCB8IHwgfAotCi18YEFMVEVSYCB8YEFMTCBLRVlTUEFDRVNgIHxgQUxURVIgS0VZU1BBQ0VgIDxicj4gYEFMVEVSIFRBQkxFYCBpbiBhbnkKLWtleXNwYWNlIHwgfCB8Ci0KLXxgQUxURVJgIHxgS0VZU1BBQ0VgIHxgQUxURVIgS0VZU1BBQ0VgIDxicj4gYEFMVEVSIFRBQkxFYCBpbiBrZXlzcGFjZSB8Ci18IHwKLQotfGBBTFRFUmAgfGBUQUJMRWAgfGBBTFRFUiBUQUJMRWAgfCB8IHwKLQotfGBBTFRFUmAgfGBBTEwgRlVOQ1RJT05TYCB8YENSRUFURSBGVU5DVElPTmAgcmVwbGFjaW5nIGFueSBleGlzdGluZyA8YnI+Ci1gQ1JFQVRFIEFHR1JFR0FURWAgcmVwbGFjaW5nIGFueSBleGlzdGluZyB8IHwgfAotCi18YEFMVEVSYCB8YEFMTCBGVU5DVElPTlMgSU4gS0VZU1BBQ0VgIHxgQ1JFQVRFIEZVTkNUSU9OYCByZXBsYWNpbmcKLWV4aXN0aW5nIGluIGtleXNwYWNlIDxicj4gYENSRUFURSBBR0dSRUdBVEVgIHJlcGxhY2luZyBhbnkgZXhpc3RpbmcgaW4KLWtleXNwYWNlIHwgfCB8Ci0KLXxgQUxURVJgIHxgRlVOQ1RJT05gIHxgQ1JFQVRFIEZVTkNUSU9OYCByZXBsYWNpbmcgZXhpc3RpbmcgPGJyPgotYENSRUFURSBBR0dSRUdBVEVgIHJlcGxhY2luZyBleGlzdGluZyB8IHwgfAotCi18YEFMVEVSYCB8YEFMTCBST0xFU2AgfGBBTFRFUiBST0xFYCBvbiBhbnkgcm9sZSB8IHwgfAotCi18YEFMVEVSYCB8YFJPTEVgIHxgQUxURVIgUk9MRWAgfCB8IHwKLQotfGBEUk9QYCB8YEFMTCBLRVlTUEFDRVNgIHxgRFJPUCBLRVlTUEFDRWAgPGJyPiBgRFJPUCBUQUJMRWAgaW4gYW55Ci1rZXlzcGFjZSB8IHwgfAotCi18YERST1BgIHxgS0VZU1BBQ0VgIHxgRFJPUCBUQUJMRWAgaW4gc3BlY2lmaWVkIGtleXNwYWNlIHwgfCB8Ci0KLXxgRFJPUGAgfGBUQUJMRWAgfGBEUk9QIFRBQkxFYCB8IHwgfAotCi18YERST1BgIHxgQUxMIEZVTkNUSU9OU2AgfGBEUk9QIEZVTkNUSU9OYCBpbiBhbnkga2V5c3BhY2UgPGJyPgotYERST1AgQUdHUkVHQVRFYCBpbiBhbnkgZXhpc3RpbmcgfCB8IHwKLQotfGBEUk9QYCB8YEFMTCBGVU5DVElPTlMgSU4gS0VZU1BBQ0VgIHxgRFJPUCBGVU5DVElPTmAgaW4ga2V5c3BhY2UgPGJyPgotYERST1AgQUdHUkVHQVRFYCBpbiBleGlzdGluZyB8IHwgfAotCi18YERST1BgIHxgRlVOQ1RJT05gIHxgRFJPUCBGVU5DVElPTmAgfCB8IHwKLQotfGBEUk9QYCB8YEFMTCBST0xFU2AgfGBEUk9QIFJPTEVgIG9uIGFueSByb2xlIHwgfCB8Ci0KLXxgRFJPUGAgfGBST0xFYCB8YERST1AgUk9MRWAgfCB8IHwKLQotfGBTRUxFQ1RgIHxgQUxMIEtFWVNQQUNFU2AgfGBTRUxFQ1RgIG9uIGFueSB0YWJsZSB8IHwgfAotCi18YFNFTEVDVGAgfGBLRVlTUEFDRWAgfGBTRUxFQ1RgIG9uIGFueSB0YWJsZSBpbiBrZXlzcGFjZSB8IHwgfAotCi18YFNFTEVDVGAgfGBUQUJMRWAgfGBTRUxFQ1RgIG9uIHNwZWNpZmllZCB0YWJsZSB8IHwgfAotCi18YFNFTEVDVGAgfGBBTEwgTUJFQU5TYCB8Q2FsbCBnZXR0ZXIgbWV0aG9kcyBvbiBhbnkgbWJlYW4gfCB8IHwKLQotfGBTRUxFQ1RgIHxgTUJFQU5TYCB8Q2FsbCBnZXR0ZXIgbWV0aG9kcyBvbiBhbnkgbWJlYW4gbWF0Y2hpbmcgYQotd2lsZGNhcmQgcGF0dGVybiB8IHwgfAotCi18YFNFTEVDVGAgfGBNQkVBTmAgfENhbGwgZ2V0dGVyIG1ldGhvZHMgb24gbmFtZWQgbWJlYW4gfCB8IHwKLQotfGBNT0RJRllgIHxgQUxMIEtFWVNQQUNFU2AgfGBJTlNFUlRgIG9uIGFueSB0YWJsZSA8YnI+IGBVUERBVEVgIG9uIGFueQotdGFibGUgPGJyPiBgREVMRVRFYCBvbiBhbnkgdGFibGUgPGJyPiBgVFJVTkNBVEVgIG9uIGFueSB0YWJsZSB8IHwgfAotCi18YE1PRElGWWAgfGBLRVlTUEFDRWAgfGBJTlNFUlRgIG9uIGFueSB0YWJsZSBpbiBrZXlzcGFjZSA8YnI+IGBVUERBVEVgCi1vbiBhbnkgdGFibGUgaW4ga2V5c3BhY2UgPGJyPiAgIGBERUxFVEVgIG9uIGFueSB0YWJsZSBpbiBrZXlzcGFjZSA8YnI+Ci1gVFJVTkNBVEVgIG9uIGFueSB0YWJsZSBpbiBrZXlzcGFjZSB8YE1PRElGWWAgfGBUQUJMRWAgfGBJTlNFUlRgIDxicj4KLWBVUERBVEVgIDxicj4gYERFTEVURWAgPGJyPiBgVFJVTkNBVEVgCi0KLXxgTU9ESUZZYCB8YEFMTCBNQkVBTlNgIHxDYWxsIHNldHRlciBtZXRob2RzIG9uIGFueSBtYmVhbiB8IHwgfAotCi18YE1PRElGWWAgfGBNQkVBTlNgIHxDYWxsIHNldHRlciBtZXRob2RzIG9uIGFueSBtYmVhbiBtYXRjaGluZyBhCi13aWxkY2FyZCBwYXR0ZXJuIHwgfCB8Ci0KLXxgTU9ESUZZYCB8YE1CRUFOYCB8Q2FsbCBzZXR0ZXIgbWV0aG9kcyBvbiBuYW1lZCBtYmVhbiB8IHwgfAotCi18YEFVVEhPUklaRWAgfGBBTEwgS0VZU1BBQ0VTYCB8YEdSQU5UIFBFUk1JU1NJT05gIG9uIGFueSB0YWJsZSA8YnI+Ci1gUkVWT0tFIFBFUk1JU1NJT05gIG9uIGFueSB0YWJsZSB8IHwgfAotCi18YEFVVEhPUklaRWAgfGBLRVlTUEFDRWAgfGBHUkFOVCBQRVJNSVNTSU9OYCBvbiB0YWJsZSBpbiBrZXlzcGFjZSA8YnI+Ci1gUkVWT0tFIFBFUk1JU1NJT05gIG9uIHRhYmxlIGluIGtleXNwYWNlIHwgfCB8Ci0KLXxgQVVUSE9SSVpFYCB8YFRBQkxFYCB8YEdSQU5UIFBFUk1JU1NJT05gIDxicj4gYFJFVk9LRSBQRVJNSVNTSU9OYCB8IHwgfAotCi18YEFVVEhPUklaRWAgfGBBTEwgRlVOQ1RJT05TYCB8YEdSQU5UIFBFUk1JU1NJT05gIG9uIGFueSBmdW5jdGlvbiA8YnI+Ci1gUkVWT0tFIFBFUk1JU1NJT05gIG9uIGFueSBmdW5jdGlvbiB8IHwgfAotCi18YEFVVEhPUklaRWAgfGBBTEwgRlVOQ1RJT05TIElOIEtFWVNQQUNFYCB8YEdSQU5UIFBFUk1JU1NJT05gIGluCi1rZXlzcGFjZSA8YnI+IGBSRVZPS0UgUEVSTUlTU0lPTmAgaW4ga2V5c3BhY2UgfCB8IHwKLQotfGBBVVRIT1JJWkVgIHxgQUxMIEZVTkNUSU9OUyBJTiBLRVlTUEFDRWAgfGBHUkFOVCBQRVJNSVNTSU9OYCBpbgota2V5c3BhY2UgPGJyPiBgUkVWT0tFIFBFUk1JU1NJT05gIGluIGtleXNwYWNlIHwgfCB8Ci0KLXxgQVVUSE9SSVpFYCB8YEZVTkNUSU9OYCB8YEdSQU5UIFBFUk1JU1NJT05gIDxicj4gYFJFVk9LRSBQRVJNSVNTSU9OYCB8Ci18IHwKLQotfGBBVVRIT1JJWkVgIHxgQUxMIE1CRUFOU2AgfGBHUkFOVCBQRVJNSVNTSU9OYCBvbiBhbnkgbWJlYW4gPGJyPgotYFJFVk9LRSBQRVJNSVNTSU9OYCBvbiBhbnkgbWJlYW4gfCB8IHwKLQotfGBBVVRIT1JJWkVgIHxgTUJFQU5TYCB8YEdSQU5UIFBFUk1JU1NJT05gIG9uIGFueSBtYmVhbiBtYXRjaGluZyBhCi13aWxkY2FyZCBwYXR0ZXJuIDxicj4gYFJFVk9LRSBQRVJNSVNTSU9OYCBvbiBhbnkgbWJlYW4gbWF0Y2hpbmcgYQotd2lsZGNhcmQgcGF0dGVybiB8IHwgfAotCi18YEFVVEhPUklaRWAgfGBNQkVBTmAgfGBHUkFOVCBQRVJNSVNTSU9OYCBvbiBuYW1lZCBtYmVhbiA8YnI+Ci1gUkVWT0tFIFBFUk1JU1NJT05gIG9uIG5hbWVkIG1iZWFuIHwgfCB8Ci0KLXxgQVVUSE9SSVpFYCB8YEFMTCBST0xFU2AgfGBHUkFOVCBST0xFYCBncmFudCBhbnkgcm9sZSA8YnI+Ci1gUkVWT0tFIFJPTEVgIHJldm9rZSBhbnkgcm9sZSB8IHwgfAotCi18YEFVVEhPUklaRWAgfGBST0xFU2AgfGBHUkFOVCBST0xFYCBncmFudCByb2xlIDxicj4gYFJFVk9LRSBST0xFYCByZXZva2UKLXJvbGUgfCB8IHwKLQotfGBERVNDUklCRWAgfGBBTEwgUk9MRVNgIHxgTElTVCBST0xFU2AgYWxsIHJvbGVzIG9yIG9ubHkgcm9sZXMgZ3JhbnRlZAotdG8gYW5vdGhlciwgc3BlY2lmaWVkIHJvbGUgfCB8IHwKLQotfGBERVNDUklCRWAgfEBBTEwgTUJFQU5TIHxSZXRyaWV2ZSBtZXRhZGF0YSBhYm91dCBhbnkgbWJlYW4gZnJvbSB0aGUKLXBsYXRmb3Jt4oCZcyBNQmVhblNlcnZlciB8IHwgfAotCi18YERFU0NSSUJFYCB8QE1CRUFOUyB8UmV0cmlldmUgbWV0YWRhdGEgYWJvdXQgYW55IG1iZWFuIG1hdGNoaW5nIGEKLXdpbGRjYXJkIHBhdHRlciBmcm9tIHRoZSBwbGF0Zm9ybeKAmXMgTUJlYW5TZXJ2ZXIgfCB8IHwKLQotfGBERVNDUklCRWAgfEBNQkVBTiB8UmV0cmlldmUgbWV0YWRhdGEgYWJvdXQgYSBuYW1lZCBtYmVhbiBmcm9tIHRoZQotcGxhdGZvcm3igJlzIE1CZWFuU2VydmVyIHwgfCB8Ci0KLXxgRVhFQ1VURWAgfGBBTEwgRlVOQ1RJT05TYCB8YFNFTEVDVGAsIGBJTlNFUlRgLCBgVVBEQVRFYCB1c2luZyBhbnkKLWZ1bmN0aW9uIDxicj4gdXNlIG9mIGFueSBmdW5jdGlvbiBpbiBgQ1JFQVRFIEFHR1JFR0FURWAgfCB8IHwKLQotfGBFWEVDVVRFYCB8YEFMTCBGVU5DVElPTlMgSU4gS0VZU1BBQ0VgIHxgU0VMRUNUYCwgYElOU0VSVGAsIGBVUERBVEVgCi11c2luZyBhbnkgZnVuY3Rpb24gaW4ga2V5c3BhY2UgPGJyPiB1c2Ugb2YgYW55IGZ1bmN0aW9uIGluIGtleXNwYWNlIGluCi1gQ1JFQVRFIEFHR1JFR0FURWAgfCB8IHwKLQotfGBFWEVDVVRFYCB8YEZVTkNUSU9OYCB8YFNFTEVDVGAsIGBJTlNFUlRgLCBgVVBEQVRFYCB1c2luZyBmdW5jdGlvbiA8YnI+Ci11c2Ugb2YgZnVuY3Rpb24gaW4gYENSRUFURSBBR0dSRUdBVEVgIHwgfCB8Ci0KLXxgRVhFQ1VURWAgfGBBTEwgTUJFQU5TYCB8RXhlY3V0ZSBvcGVyYXRpb25zIG9uIGFueSBtYmVhbiB8IHwgfAotCi18YEVYRUNVVEVgIHxgTUJFQU5TYCB8RXhlY3V0ZSBvcGVyYXRpb25zIG9uIGFueSBtYmVhbiBtYXRjaGluZyBhCi13aWxkY2FyZCBwYXR0ZXJuIHwgfCB8Ci0KLXxgRVhFQ1VURWAgfGBNQkVBTmAgfEV4ZWN1dGUgb3BlcmF0aW9ucyBvbiBuYW1lZCBtYmVhbiB8IHwgfAotfD09PQotCi1bW2dyYW50UGVybWlzc2lvbnNTdG10XV0KLT09PT0gR1JBTlQgUEVSTUlTU0lPTgotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4uICsKLTo6PSBHUkFOVCAoIEFMTCAoIFBFUk1JU1NJT05TICk/IHwgKCBQRVJNSVNTSU9OICk/ICkgT04gVE8KLQotOjo9IENSRUFURSB8IEFMVEVSIHwgRFJPUCB8IFNFTEVDVCB8IE1PRElGWSB8IEFVVEhPUklaRSB8IERFU1JJQkUgfAotRVhFQ1VURQotCi06Oj0gQUxMIEtFWVNQQUNFUyArCi18IEtFWVNQQUNFICArCi18ICggVEFCTEUgKT8gICsKLXwgQUxMIFJPTEVTICsKLXwgUk9MRSAgKwotfCBBTEwgRlVOQ1RJT05TICggSU4gS0VZU1BBQ0UgKT8gKwotfCBGVU5DVElPTiAgKwotfCBBTEwgTUJFQU5TICsKLXwgKCBNQkVBTiB8IE1CRUFOUyApICArCi1wLgotCi1fU2FtcGxlOl8KLQotYmMoc2FtcGxlKS4gKwotR1JBTlQgU0VMRUNUIE9OIEFMTCBLRVlTUEFDRVMgVE8gZGF0YV9yZWFkZXI7Ci0KLVRoaXMgZ2l2ZXMgYW55IHVzZXIgd2l0aCB0aGUgcm9sZSBgZGF0YV9yZWFkZXJgIHBlcm1pc3Npb24gdG8gZXhlY3V0ZQotYFNFTEVDVGAgc3RhdGVtZW50cyBvbiBhbnkgdGFibGUgYWNyb3NzIGFsbCBrZXlzcGFjZXMKLQotYmMoc2FtcGxlKS4gKwotR1JBTlQgTU9ESUZZIE9OIEtFWVNQQUNFIGtleXNwYWNlMSBUTyBkYXRhX3dyaXRlcjsKLQotVGhpcyBnaXZlIGFueSB1c2VyIHdpdGggdGhlIHJvbGUgYGRhdGFfd3JpdGVyYCBwZXJtaXNzaW9uIHRvIHBlcmZvcm0KLWBVUERBVEVgLCBgSU5TRVJUYCwgYFVQREFURWAsIGBERUxFVEVgIGFuZCBgVFJVTkNBVEVgIHF1ZXJpZXMgb24gYWxsCi10YWJsZXMgaW4gdGhlIGBrZXlzcGFjZTFgIGtleXNwYWNlCi0KLWJjKHNhbXBsZSkuICsKLUdSQU5UIERST1AgT04ga2V5c3BhY2UxLnRhYmxlMSBUTyBzY2hlbWFfb3duZXI7Ci0KLVRoaXMgZ2l2ZXMgYW55IHVzZXIgd2l0aCB0aGUgYHNjaGVtYV9vd25lcmAgcm9sZSBwZXJtaXNzaW9ucyB0byBgRFJPUGAKLWBrZXlzcGFjZTEudGFibGUxYC4KLQotYmMoc2FtcGxlKS4gKwotR1JBTlQgRVhFQ1VURSBPTiBGVU5DVElPTiBrZXlzcGFjZTEudXNlcl9mdW5jdGlvbiggaW50ICkgVE8KLXJlcG9ydF93cml0ZXI7Ci0KLVRoaXMgZ3JhbnRzIGFueSB1c2VyIHdpdGggdGhlIGByZXBvcnRfd3JpdGVyYCByb2xlIHBlcm1pc3Npb24gdG8gZXhlY3V0ZQotYFNFTEVDVGAsIGBJTlNFUlRgIGFuZCBgVVBEQVRFYCBxdWVyaWVzIHdoaWNoIHVzZSB0aGUgZnVuY3Rpb24KLWBrZXlzcGFjZTEudXNlcl9mdW5jdGlvbiggaW50IClgCi0KLWJjKHNhbXBsZSkuICsKLUdSQU5UIERFU0NSSUJFIE9OIEFMTCBST0xFUyBUTyByb2xlX2FkbWluOwotCi1UaGlzIGdyYW50cyBhbnkgdXNlciB3aXRoIHRoZSBgcm9sZV9hZG1pbmAgcm9sZSBwZXJtaXNzaW9uIHRvIHZpZXcgYW55Ci1hbmQgYWxsIHJvbGVzIGluIHRoZSBzeXN0ZW0gd2l0aCBhIGBMSVNUIFJPTEVTYCBzdGF0ZW1lbnQKLQotW1tncmFudEFsbF1dCi09PT09PSBHUkFOVCBBTEwKLQotV2hlbiB0aGUgYEdSQU5UIEFMTGAgZm9ybSBpcyB1c2VkLCB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHBlcm1pc3Npb25zIGlzCi1kZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gdGhlIHRhcmdldCByZXNvdXJjZS4KLQotW1thdXRvR3JhbnRQZXJtaXNzaW9uc11dCi09PT09PSBBdXRvbWF0aWMgR3JhbnRpbmcKLQotV2hlbiBhIHJlc291cmNlIGlzIGNyZWF0ZWQsIHZpYSBhIGBDUkVBVEUgS0VZU1BBQ0VgLCBgQ1JFQVRFIFRBQkxFYCwKLWBDUkVBVEUgRlVOQ1RJT05gLCBgQ1JFQVRFIEFHR1JFR0FURWAgb3IgYENSRUFURSBST0xFYCBzdGF0ZW1lbnQsIHRoZQotY3JlYXRvciAodGhlIHJvbGUgdGhlIGRhdGFiYXNlIHVzZXIgd2hvIGlzc3VlcyB0aGUgc3RhdGVtZW50IGlzCi1pZGVudGlmaWVkIGFzKSwgaXMgYXV0b21hdGljYWxseSBncmFudGVkIGFsbCBhcHBsaWNhYmxlIHBlcm1pc3Npb25zIG9uCi10aGUgbmV3IHJlc291cmNlLgotCi1bW3Jldm9rZVBlcm1pc3Npb25zU3RtdF1dCi09PT09IFJFVk9LRSBQRVJNSVNTSU9OCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLi4gKwotOjo9IFJFVk9LRSAoIEFMTCAoIFBFUk1JU1NJT05TICk/IHwgKCBQRVJNSVNTSU9OICk/ICkgT04gRlJPTQotCi06Oj0gQ1JFQVRFIHwgQUxURVIgfCBEUk9QIHwgU0VMRUNUIHwgTU9ESUZZIHwgQVVUSE9SSVpFIHwgREVTUklCRSB8Ci1FWEVDVVRFCi0KLTo6PSBBTEwgS0VZU1BBQ0VTICsKLXwgS0VZU1BBQ0UgICsKLXwgKCBUQUJMRSApPyAgKwotfCBBTEwgUk9MRVMgKwotfCBST0xFICArCi18IEFMTCBGVU5DVElPTlMgKCBJTiBLRVlTUEFDRSApPyArCi18IEZVTkNUSU9OICArCi18IEFMTCBNQkVBTlMgKwotfCAoIE1CRUFOIHwgTUJFQU5TICkgICsKLXAuCi0KLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLi4gKwotUkVWT0tFIFNFTEVDVCBPTiBBTEwgS0VZU1BBQ0VTIEZST00gZGF0YV9yZWFkZXI7ICsKLVJFVk9LRSBNT0RJRlkgT04gS0VZU1BBQ0Uga2V5c3BhY2UxIEZST00gZGF0YV93cml0ZXI7ICsKLVJFVk9LRSBEUk9QIE9OIGtleXNwYWNlMS50YWJsZTEgRlJPTSBzY2hlbWFfb3duZXI7ICsKLVJFVk9LRSBFWEVDVVRFIE9OIEZVTkNUSU9OIGtleXNwYWNlMS51c2VyX2Z1bmN0aW9uKCBpbnQgKSBGUk9NCi1yZXBvcnRfd3JpdGVyOyArCi1SRVZPS0UgREVTQ1JJQkUgT04gQUxMIFJPTEVTIEZST00gcm9sZV9hZG1pbjsgKwotcC4KLQotW1tsaXN0UGVybWlzc2lvbnNTdG10XV0KLT09PT09IExJU1QgUEVSTUlTU0lPTlMKLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuLiArCi06Oj0gTElTVCAoIEFMTCAoIFBFUk1JU1NJT05TICk/IHwgKSArCi0oIE9OICk/ICsKLSggT0YgKCBOT1JFQ1VSU0lWRSApPyApPwotCi06Oj0gQUxMIEtFWVNQQUNFUyArCi18IEtFWVNQQUNFICArCi18ICggVEFCTEUgKT8gICsKLXwgQUxMIFJPTEVTICsKLXwgUk9MRSAgKwotfCBBTEwgRlVOQ1RJT05TICggSU4gS0VZU1BBQ0UgKT8gKwotfCBGVU5DVElPTiAgKwotfCBBTEwgTUJFQU5TICsKLXwgKCBNQkVBTiB8IE1CRUFOUyApICArCi1wLgotCi1fU2FtcGxlOl8KLQotYmMoc2FtcGxlKS4gKwotTElTVCBBTEwgUEVSTUlTU0lPTlMgT0YgYWxpY2U7Ci0KLVNob3cgYWxsIHBlcm1pc3Npb25zIGdyYW50ZWQgdG8gYGFsaWNlYCwgaW5jbHVkaW5nIHRob3NlIGFjcXVpcmVkCi10cmFuc2l0aXZlbHkgZnJvbSBhbnkgb3RoZXIgcm9sZXMuCi0KLWJjKHNhbXBsZSkuICsKLUxJU1QgQUxMIFBFUk1JU1NJT05TIE9OIGtleXNwYWNlMS50YWJsZTEgT0YgYm9iOwotCi1TaG93IGFsbCBwZXJtaXNzaW9ucyBvbiBga2V5c3BhY2UxLnRhYmxlMWAgZ3JhbnRlZCB0byBgYm9iYCwgaW5jbHVkaW5nCi10aG9zZSBhY3F1aXJlZCB0cmFuc2l0aXZlbHkgZnJvbSBhbnkgb3RoZXIgcm9sZXMuIFRoaXMgYWxzbyBpbmNsdWRlcyBhbnkKLXBlcm1pc3Npb25zIGhpZ2hlciB1cCB0aGUgcmVzb3VyY2UgaGllcmFyY2h5IHdoaWNoIGNhbiBiZSBhcHBsaWVkIHRvCi1ga2V5c3BhY2UxLnRhYmxlMWAuIEZvciBleGFtcGxlLCBzaG91bGQgYGJvYmAgaGF2ZSBgQUxURVJgIHBlcm1pc3Npb24gb24KLWBrZXlzcGFjZTFgLCB0aGF0IHdvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRzIG9mIHRoaXMgcXVlcnkuIEFkZGluZwotdGhlIGBOT1JFQ1VSU0lWRWAgc3dpdGNoIHJlc3RyaWN0cyB0aGUgcmVzdWx0cyB0byBvbmx5IHRob3NlIHBlcm1pc3Npb25zCi13aGljaCB3ZXJlIGRpcmVjdGx5IGdyYW50ZWQgdG8gYGJvYmAgb3Igb25lIG9mIGBib2Jg4oCZcyByb2xlcy4KLQotYmMoc2FtcGxlKS4gKwotTElTVCBTRUxFQ1QgUEVSTUlTU0lPTlMgT0YgY2FybG9zOwotCi1TaG93IGFueSBwZXJtaXNzaW9ucyBncmFudGVkIHRvIGBjYXJsb3NgIG9yIGFueSBvZiBgY2FybG9zYOKAmXMgcm9sZXMsCi1saW1pdGVkIHRvIGBTRUxFQ1RgIHBlcm1pc3Npb25zIG9uIGFueSByZXNvdXJjZS4KLQotW1t0eXBlc11dCi09PT0gRGF0YSBUeXBlcwotCi1DUUwgc3VwcG9ydHMgYSByaWNoIHNldCBvZiBkYXRhIHR5cGVzIGZvciBjb2x1bW5zIGRlZmluZWQgaW4gYSB0YWJsZSwKLWluY2x1ZGluZyBjb2xsZWN0aW9uIHR5cGVzLiBPbiB0b3Agb2YgdGhvc2UgbmF0aXZlICsKLWFuZCBjb2xsZWN0aW9uIHR5cGVzLCB1c2VycyBjYW4gYWxzbyBwcm92aWRlIGN1c3RvbSB0eXBlcyAodGhyb3VnaCBhCi1KQVZBIGNsYXNzIGV4dGVuZGluZyBgQWJzdHJhY3RUeXBlYCBsb2FkYWJsZSBieSArCi1DYXNzYW5kcmEpLiBUaGUgc3ludGF4IG9mIHR5cGVzIGlzIHRodXM6Ci0KLWJjKHN5bnRheCkuLiArCi06Oj0gICsKLXwgICsKLXwgICsKLXwgLy8gVXNlZCBmb3IgY3VzdG9tIHR5cGVzLiBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYSBKQVZBIGNsYXNzCi0KLTo6PSBhc2NpaSArCi18IGJpZ2ludCArCi18IGJsb2IgKwotfCBib29sZWFuICsKLXwgY291bnRlciArCi18IGRhdGUgKwotfCBkZWNpbWFsICsKLXwgZG91YmxlICsKLXwgZmxvYXQgKwotfCBpbmV0ICsKLXwgaW50ICsKLXwgc21hbGxpbnQgKwotfCB0ZXh0ICsKLXwgdGltZSArCi18IHRpbWVzdGFtcCArCi18IHRpbWV1dWlkICsKLXwgdGlueWludCArCi18IHV1aWQgKwotfCB2YXJjaGFyICsKLXwgdmFyaW50Ci0KLTo6PSBsaXN0IGA8JyBgPicgKwotfCBzZXQgYDwnIGA+JyArCi18IG1hcCBgPCcgYCwnIGA+JyArCi06Oj0gdHVwbGUgYDwnIChgLCcgKSogYD4nICsKLXAuIE5vdGUgdGhhdCB0aGUgbmF0aXZlIHR5cGVzIGFyZSBrZXl3b3JkcyBhbmQgYXMgc3VjaCBhcmUKLWNhc2UtaW5zZW5zaXRpdmUuIFRoZXkgYXJlIGhvd2V2ZXIgbm90IHJlc2VydmVkIG9uZXMuCi0KLVRoZSBmb2xsb3dpbmcgdGFibGUgZ2l2ZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbnMgb24gdGhlIG5hdGl2ZSBkYXRhCi10eXBlcywgYW5kIG9uIHdoaWNoIGtpbmQgb2YgbGluazojY29uc3RhbnRzW2NvbnN0YW50c10gZWFjaCB0eXBlCi1zdXBwb3J0czoKLQotW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXx0eXBlIHxjb25zdGFudHMgc3VwcG9ydGVkIHxkZXNjcmlwdGlvbgotfGBhc2NpaWAgfHN0cmluZ3MgfEFTQ0lJIGNoYXJhY3RlciBzdHJpbmcKLQotfGBiaWdpbnRgIHxpbnRlZ2VycyB8NjQtYml0IHNpZ25lZCBsb25nCi0KLXxgYmxvYmAgfGJsb2JzIHxBcmJpdHJhcnkgYnl0ZXMgKG5vIHZhbGlkYXRpb24pCi0KLXxgYm9vbGVhbmAgfGJvb2xlYW5zIHx0cnVlIG9yIGZhbHNlCi0KLXxgY291bnRlcmAgfGludGVnZXJzIHxDb3VudGVyIGNvbHVtbiAoNjQtYml0IHNpZ25lZCB2YWx1ZSkuIFNlZQotbGluazojY291bnRlcnNbQ291bnRlcnNdIGZvciBkZXRhaWxzCi0KLXxgZGF0ZWAgfGludGVnZXJzLCBzdHJpbmdzIHxBIGRhdGUgKHdpdGggbm8gY29ycmVzcG9uZGluZyB0aW1lIHZhbHVlKS4KLVNlZSBsaW5rOiN1c2luZ2RhdGVzW1dvcmtpbmcgd2l0aCBkYXRlc10gYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLXxgZGVjaW1hbGAgfGludGVnZXJzLCBmbG9hdHMgfFZhcmlhYmxlLXByZWNpc2lvbiBkZWNpbWFsCi0KLXxgZG91YmxlYCB8aW50ZWdlcnMgfDY0LWJpdCBJRUVFLTc1NCBmbG9hdGluZyBwb2ludAotCi18YGZsb2F0YCB8aW50ZWdlcnMsIGZsb2F0cyB8MzItYml0IElFRUUtNzU0IGZsb2F0aW5nIHBvaW50Ci0KLXxgaW5ldGAgfHN0cmluZ3MgfEFuIElQIGFkZHJlc3MuIEl0IGNhbiBiZSBlaXRoZXIgNCBieXRlcyBsb25nIChJUHY0KSBvcgotMTYgYnl0ZXMgbG9uZyAoSVB2NikuIFRoZXJlIGlzIG5vIGBpbmV0YCBjb25zdGFudCwgSVAgYWRkcmVzcyBzaG91bGQgYmUKLWlucHV0ZWQgYXMgc3RyaW5ncwotCi18YGludGAgfGludGVnZXJzIHwzMi1iaXQgc2lnbmVkIGludAotCi18YHNtYWxsaW50YCB8aW50ZWdlcnMgfDE2LWJpdCBzaWduZWQgaW50Ci0KLXxgdGV4dGAgfHN0cmluZ3MgfFVURjggZW5jb2RlZCBzdHJpbmcKLQotfGB0aW1lYCB8aW50ZWdlcnMsIHN0cmluZ3MgfEEgdGltZSB3aXRoIG5hbm9zZWNvbmQgcHJlY2lzaW9uLiBTZWUKLWxpbms6I3VzaW5ndGltZVtXb3JraW5nIHdpdGggdGltZV0gYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLXxgdGltZXN0YW1wYCB8aW50ZWdlcnMsIHN0cmluZ3MgfEEgdGltZXN0YW1wLiBTdHJpbmdzIGNvbnN0YW50IGFyZSBhbGxvdwotdG8gaW5wdXQgdGltZXN0YW1wcyBhcyBkYXRlcywgc2VlIGxpbms6I3VzaW5ndGltZXN0YW1wc1tXb3JraW5nIHdpdGgKLXRpbWVzdGFtcHNdIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi18YHRpbWV1dWlkYCB8dXVpZHMgfFR5cGUgMSBVVUlELiBUaGlzIGlzIGdlbmVyYWxseSB1c2VkIGFzIGEKLWBgY29uZmxpY3QtZnJlZScnIHRpbWVzdGFtcC4gQWxzbyBzZWUgdGhlIGxpbms6I3RpbWV1dWlkRnVuW2Z1bmN0aW9ucyBvbgotVGltZXV1aWRdCi0KLXxgdGlueWludGAgfGludGVnZXJzIHw4LWJpdCBzaWduZWQgaW50Ci0KLXxgdXVpZGAgfHV1aWRzIHxUeXBlIDEgb3IgdHlwZSA0IFVVSUQKLQotfGB2YXJjaGFyYCB8c3RyaW5ncyB8VVRGOCBlbmNvZGVkIHN0cmluZwotCi18YHZhcmludGAgfGludGVnZXJzIHxBcmJpdHJhcnktcHJlY2lzaW9uIGludGVnZXIKLXw9PT0KLQotRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZSB0aGUgY29sbGVjdGlvbiB0eXBlcywgc2VlIHRoZQotbGluazojY29sbGVjdGlvbnNbV29ya2luZyB3aXRoIGNvbGxlY3Rpb25zXSBzZWN0aW9uIGJlbG93LgotCi1bW3VzaW5ndGltZXN0YW1wc11dCi09PT09IFdvcmtpbmcgd2l0aCB0aW1lc3RhbXBzCi0KLVZhbHVlcyBvZiB0aGUgYHRpbWVzdGFtcGAgdHlwZSBhcmUgZW5jb2RlZCBhcyA2NC1iaXQgc2lnbmVkIGludGVnZXJzCi1yZXByZXNlbnRpbmcgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBzdGFuZGFyZCBiYXNlIHRpbWUga25vd24KLWFzIGBgdGhlIGVwb2NoJyc6IEphbnVhcnkgMSAxOTcwIGF0IDAwOjAwOjAwIEdNVC4KLQotVGltZXN0YW1wIGNhbiBiZSBpbnB1dCBpbiBDUUwgYXMgc2ltcGxlIGxvbmcgaW50ZWdlcnMsIGdpdmluZyB0aGUgbnVtYmVyCi1vZiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoLCBhcyBkZWZpbmVkIGFib3ZlLgotCi1UaGV5IGNhbiBhbHNvIGJlIGlucHV0IGFzIHN0cmluZyBsaXRlcmFscyBpbiBhbnkgb2YgdGhlIGZvbGxvd2luZyBJU08KLTg2MDEgZm9ybWF0cywgZWFjaCByZXByZXNlbnRpbmcgdGhlIHRpbWUgYW5kIGRhdGUgTWFyIDIsIDIwMTEsIGF0Ci0wNDowNTowMCBBTSwgR01ULjoKLQotKiBgMjAxMS0wMi0wMyAwNDowNSswMDAwYAotKiBgMjAxMS0wMi0wMyAwNDowNTowMCswMDAwYAotKiBgMjAxMS0wMi0wMyAwNDowNTowMC4wMDArMDAwMGAKLSogYDIwMTEtMDItMDNUMDQ6MDUrMDAwMGAKLSogYDIwMTEtMDItMDNUMDQ6MDU6MDArMDAwMGAKLSogYDIwMTEtMDItMDNUMDQ6MDU6MDAuMDAwKzAwMDBgCi0KLVRoZSBgKzAwMDBgIGFib3ZlIGlzIGFuIFJGQyA4MjIgNC1kaWdpdCB0aW1lIHpvbmUgc3BlY2lmaWNhdGlvbjsgYCswMDAwYAotcmVmZXJzIHRvIEdNVC4gVVMgUGFjaWZpYyBTdGFuZGFyZCBUaW1lIGlzIGAtMDgwMGAuIFRoZSB0aW1lIHpvbmUgbWF5IGJlCi1vbWl0dGVkIGlmIGRlc2lyZWTigJQgdGhlIGRhdGUgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBiZWluZyBpbiB0aGUgdGltZQotem9uZSB1bmRlciB3aGljaCB0aGUgY29vcmRpbmF0aW5nIENhc3NhbmRyYSBub2RlIGlzIGNvbmZpZ3VyZWQuCi0KLSogYDIwMTEtMDItMDMgMDQ6MDVgCi0qIGAyMDExLTAyLTAzIDA0OjA1OjAwYAotKiBgMjAxMS0wMi0wMyAwNDowNTowMC4wMDBgCi0qIGAyMDExLTAyLTAzVDA0OjA1YAotKiBgMjAxMS0wMi0wM1QwNDowNTowMGAKLSogYDIwMTEtMDItMDNUMDQ6MDU6MDAuMDAwYAotCi1UaGVyZSBhcmUgY2xlYXIgZGlmZmljdWx0aWVzIGluaGVyZW50IGluIHJlbHlpbmcgb24gdGhlIHRpbWUgem9uZQotY29uZmlndXJhdGlvbiBiZWluZyBhcyBleHBlY3RlZCwgdGhvdWdoLCBzbyBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoZQotdGltZSB6b25lIGFsd2F5cyBiZSBzcGVjaWZpZWQgZm9yIHRpbWVzdGFtcHMgd2hlbiBmZWFzaWJsZS4KLQotVGhlIHRpbWUgb2YgZGF5IG1heSBhbHNvIGJlIG9taXR0ZWQsIGlmIHRoZSBkYXRlIGlzIHRoZSBvbmx5IHBpZWNlIHRoYXQKLW1hdHRlcnM6Ci0KLSogYDIwMTEtMDItMDNgCi0qIGAyMDExLTAyLTAzKzAwMDBgCi0KLUluIHRoYXQgY2FzZSwgdGhlIHRpbWUgb2YgZGF5IHdpbGwgZGVmYXVsdCB0byAwMDowMDowMCwgaW4gdGhlIHNwZWNpZmllZAotb3IgZGVmYXVsdCB0aW1lIHpvbmUuCi0KLVtbdXNpbmdkYXRlc11dCi09PT09IFdvcmtpbmcgd2l0aCBkYXRlcwotCi1WYWx1ZXMgb2YgdGhlIGBkYXRlYCB0eXBlIGFyZSBlbmNvZGVkIGFzIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VycwotcmVwcmVzZW50aW5nIGEgbnVtYmVyIG9mIGRheXMgd2l0aCBgYHRoZSBlcG9jaCcnIGF0IHRoZSBjZW50ZXIgb2YgdGhlCi1yYW5nZSAoMl4zMSkuIEVwb2NoIGlzIEphbnVhcnkgMXN0LCAxOTcwCi0KLUEgZGF0ZSBjYW4gYmUgaW5wdXQgaW4gQ1FMIGFzIGFuIHVuc2lnbmVkIGludGVnZXIgYXMgZGVmaW5lZCBhYm92ZS4KLQotVGhleSBjYW4gYWxzbyBiZSBpbnB1dCBhcyBzdHJpbmcgbGl0ZXJhbHMgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6Ci0KLSogYDIwMTQtMDEtMDFgCi0KLVtbdXNpbmd0aW1lXV0KLT09PT0gV29ya2luZyB3aXRoIHRpbWUKLQotVmFsdWVzIG9mIHRoZSBgdGltZWAgdHlwZSBhcmUgZW5jb2RlZCBhcyA2NC1iaXQgc2lnbmVkIGludGVnZXJzCi1yZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcyBzaW5jZSBtaWRuaWdodC4KLQotQSB0aW1lIGNhbiBiZSBpbnB1dCBpbiBDUUwgYXMgc2ltcGxlIGxvbmcgaW50ZWdlcnMsIGdpdmluZyB0aGUgbnVtYmVyIG9mCi1uYW5vc2Vjb25kcyBzaW5jZSBtaWRuaWdodC4KLQotVGhleSBjYW4gYWxzbyBiZSBpbnB1dCBhcyBzdHJpbmcgbGl0ZXJhbHMgaW4gYW55IG9mIHRoZSBmb2xsb3dpbmcKLWZvcm1hdHM6Ci0KLSogYDA4OjEyOjU0YAotKiBgMDg6MTI6NTQuMTIzYAotKiBgMDg6MTI6NTQuMTIzNDU2YAotKiBgMDg6MTI6NTQuMTIzNDU2Nzg5YAotCi09PT09IENvdW50ZXJzCi0KLVRoZSBgY291bnRlcmAgdHlwZSBpcyB1c2VkIHRvIGRlZmluZSBfY291bnRlciBjb2x1bW5zXy4gQSBjb3VudGVyIGNvbHVtbgotaXMgYSBjb2x1bW4gd2hvc2UgdmFsdWUgaXMgYSA2NC1iaXQgc2lnbmVkIGludGVnZXIgYW5kIG9uIHdoaWNoIDIKLW9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZDogaW5jcmVtZW50YXRpb24gYW5kIGRlY3JlbWVudGF0aW9uIChzZWUKLWxpbms6I3VwZGF0ZVN0bXRbYFVQREFURWBdIGZvciBzeW50YXgpLiBOb3RlIHRoZSB2YWx1ZSBvZiBhIGNvdW50ZXIKLWNhbm5vdCBiZSBzZXQuIEEgY291bnRlciBkb2VzbuKAmXQgZXhpc3QgdW50aWwgZmlyc3QKLWluY3JlbWVudGVkL2RlY3JlbWVudGVkLCBhbmQgdGhlIGZpcnN0IGluY3JlbWVudGF0aW9uL2RlY3JlbWVudGF0aW9uIGlzCi1tYWRlIGFzIGlmIHRoZSBwcmV2aW91cyB2YWx1ZSB3YXMgMC4gRGVsZXRpb24gb2YgY291bnRlciBjb2x1bW5zIGlzCi1zdXBwb3J0ZWQgYnV0IGhhdmUgc29tZSBsaW1pdGF0aW9ucyAoc2VlIHRoZQotaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9jYXNzYW5kcmEvQ291bnRlcnNbQ2Fzc2FuZHJhIFdpa2ldIGZvciBtb3JlCi1pbmZvcm1hdGlvbikuCi0KLVRoZSB1c2Ugb2YgdGhlIGNvdW50ZXIgdHlwZSBpcyBsaW1pdGVkIGluIHRoZSBmb2xsb3dpbmcgd2F5OgotCi0qIEl0IGNhbm5vdCBiZSB1c2VkIGZvciBjb2x1bW4gdGhhdCBpcyBwYXJ0IG9mIHRoZSBgUFJJTUFSWSBLRVlgIG9mIGEKLXRhYmxlLgotKiBBIHRhYmxlIHRoYXQgY29udGFpbnMgYSBjb3VudGVyIGNhbiBvbmx5IGNvbnRhaW4gY291bnRlcnMuIEluIG90aGVyCi13b3JkcywgZWl0aGVyIGFsbCB0aGUgY29sdW1ucyBvZiBhIHRhYmxlIG91dHNpZGUgdGhlIGBQUklNQVJZIEtFWWAgaGF2ZQotdGhlIGNvdW50ZXIgdHlwZSwgb3Igbm9uZSBvZiB0aGVtIGhhdmUgaXQuCi0KLVtbY29sbGVjdGlvbnNdXQotPT09PSBXb3JraW5nIHdpdGggY29sbGVjdGlvbnMKLQotPT09PT0gTm90ZXdvcnRoeSBjaGFyYWN0ZXJpc3RpY3MKLQotQ29sbGVjdGlvbnMgYXJlIG1lYW50IGZvciBzdG9yaW5nL2Rlbm9ybWFsaXppbmcgcmVsYXRpdmVseSBzbWFsbCBhbW91bnQKLW9mIGRhdGEuIFRoZXkgd29yayB3ZWxsIGZvciB0aGluZ3MgbGlrZSBgYHRoZSBwaG9uZSBudW1iZXJzIG9mIGEgZ2l2ZW4KLXVzZXInJywgYGBsYWJlbHMgYXBwbGllZCB0byBhbiBlbWFpbCcnLCBldGMuIEJ1dCB3aGVuIGl0ZW1zIGFyZSBleHBlY3RlZAotdG8gZ3JvdyB1bmJvdW5kZWQgKGBgYWxsIHRoZSBtZXNzYWdlcyBzZW50IGJ5IGEgZ2l2ZW4gdXNlcicnLCBgYGV2ZW50cwotcmVnaXN0ZXJlZCBieSBhIHNlbnNvcicnLCDigKYpLCB0aGVuIGNvbGxlY3Rpb25zIGFyZSBub3QgYXBwcm9wcmlhdGUKLWFueW1vcmUgYW5kIGEgc3BlY2lmaWMgdGFibGUgKHdpdGggY2x1c3RlcmluZyBjb2x1bW5zKSBzaG91bGQgYmUgdXNlZC4KLUNvbmNyZXRlbHksIGNvbGxlY3Rpb25zIGhhdmUgdGhlIGZvbGxvd2luZyBsaW1pdGF0aW9uczoKLQotKiBDb2xsZWN0aW9ucyBhcmUgYWx3YXlzIHJlYWQgaW4gdGhlaXIgZW50aXJldHkgKGFuZCByZWFkaW5nIG9uZSBpcyBub3QKLXBhZ2VkIGludGVybmFsbHkpLgotKiBDb2xsZWN0aW9ucyBjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gNjU1MzUgZWxlbWVudHMuIE1vcmUgcHJlY2lzZWx5LAotd2hpbGUgaXQgbWF5IGJlIHBvc3NpYmxlIHRvIGluc2VydCBtb3JlIHRoYW4gNjU1MzUgZWxlbWVudHMsIGl0IGlzIG5vdAotcG9zc2libGUgdG8gcmVhZCBtb3JlIHRoYW4gdGhlIDY1NTM1IGZpcnN0IGVsZW1lbnRzIChzZWUKLWh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTU0MjhbQ0FTU0FORFJBLTU0MjhdIGZvcgotZGV0YWlscykuCi0qIFdoaWxlIGluc2VydGlvbiBvcGVyYXRpb25zIG9uIHNldHMgYW5kIG1hcHMgbmV2ZXIgaW5jdXIgYQotcmVhZC1iZWZvcmUtd3JpdGUgaW50ZXJuYWxseSwgc29tZSBvcGVyYXRpb25zIG9uIGxpc3RzIGRvIChzZWUgdGhlCi1zZWN0aW9uIG9uIGxpc3RzIGJlbG93IGZvciBkZXRhaWxzKS4gSXQgaXMgdGh1cyBhZHZpc2VkIHRvIHByZWZlciBzZXRzCi1vdmVyIGxpc3RzIHdoZW4gcG9zc2libGUuCi0KLVBsZWFzZSBub3RlIHRoYXQgd2hpbGUgc29tZSBvZiB0aG9zZSBsaW1pdGF0aW9ucyBtYXkgb3IgbWF5IG5vdCBiZQotbG9vc2VuIGluIHRoZSBmdXR1cmUsIHRoZSBnZW5lcmFsIHJ1bGUgdGhhdCBjb2xsZWN0aW9ucyBhcmUgZm9yCi1kZW5vcm1hbGl6aW5nIHNtYWxsIGFtb3VudCBvZiBkYXRhIGlzIG1lYW50IHRvIHN0YXkuCi0KLVtbbWFwXV0KLT09PT09IE1hcHMKLQotQSBgbWFwYCBpcyBhIGxpbms6I3R5cGVzW3R5cGVkXSBzZXQgb2Yga2V5LXZhbHVlIHBhaXJzLCB3aGVyZSBrZXlzIGFyZQotdW5pcXVlLiBGdXJ0aGVybW9yZSwgbm90ZSB0aGF0IHRoZSBtYXAgYXJlIGludGVybmFsbHkgc29ydGVkIGJ5IHRoZWlyCi1rZXlzIGFuZCB3aWxsIHRodXMgYWx3YXlzIGJlIHJldHVybmVkIGluIHRoYXQgb3JkZXIuIFRvIGNyZWF0ZSBhIGNvbHVtbgotb2YgdHlwZSBgbWFwYCwgdXNlIHRoZSBgbWFwYCBrZXl3b3JkIHN1ZmZpeGVkIHdpdGggY29tbWEtc2VwYXJhdGVkIGtleQotYW5kIHZhbHVlIHR5cGVzLCBlbmNsb3NlZCBpbiBhbmdsZSBicmFja2V0cy4gRm9yIGV4YW1wbGU6Ci0KLWJjKHNhbXBsZSkuICsKLUNSRUFURSBUQUJMRSB1c2VycyAoICsKLWlkIHRleHQgUFJJTUFSWSBLRVksICsKLWdpdmVuIHRleHQsICsKLXN1cm5hbWUgdGV4dCwgKwotZmF2cyBtYXA8dGV4dCwgdGV4dD4gLy8gQSBtYXAgb2YgdGV4dCBrZXlzLCBhbmQgdGV4dCB2YWx1ZXMgKwotKQotCi1Xcml0aW5nIGBtYXBgIGRhdGEgaXMgYWNjb21wbGlzaGVkIHdpdGggYSBKU09OLWluc3BpcmVkIHN5bnRheC4gVG8gd3JpdGUKLWEgcmVjb3JkIHVzaW5nIGBJTlNFUlRgLCBzcGVjaWZ5IHRoZSBlbnRpcmUgbWFwIGFzIGEgSlNPTi1zdHlsZQotYXNzb2NpYXRpdmUgYXJyYXkuIF9Ob3RlOiBUaGlzIGZvcm0gd2lsbCBhbHdheXMgcmVwbGFjZSB0aGUgZW50aXJlIG1hcC5fCi0KLWJjKHNhbXBsZSkuICsKLS8vIEluc2VydGluZyAob3IgVXBkYXRpbmcpICsKLUlOU0VSVCBJTlRPIHVzZXJzIChpZCwgZ2l2ZW4sIHN1cm5hbWUsIGZhdnMpICsKLVZBTFVFUyAoYGpzbWl0aCcsIGBKb2huJywgYFNtaXRoJywgXHsgYGZydWl0JyA6IGBhcHBsZScsIGBiYW5kJyA6Ci1gQmVhdGxlcycgfSkKLQotQWRkaW5nIG9yIHVwZGF0aW5nIGtleS12YWx1ZXMgb2YgYSAocG90ZW50aWFsbHkpIGV4aXN0aW5nIG1hcCBjYW4gYmUKLWFjY29tcGxpc2hlZCBlaXRoZXIgYnkgc3Vic2NyaXB0aW5nIHRoZSBtYXAgY29sdW1uIGluIGFuIGBVUERBVEVgCi1zdGF0ZW1lbnQgb3IgYnkgYWRkaW5nIGEgbmV3IG1hcCBsaXRlcmFsOgotCi1iYyhzYW1wbGUpLiArCi0vLyBVcGRhdGluZyAob3IgaW5zZXJ0aW5nKSArCi1VUERBVEUgdXNlcnMgU0VUIGZhdnNbYGF1dGhvciddID0gYEVkIFBvZScgV0hFUkUgaWQgPSBganNtaXRoJyArCi1VUERBVEUgdXNlcnMgU0VUIGZhdnMgPSBmYXZzICsgXHsgYG1vdmllJyA6IGBDYXNzYWJsYW5jYScgfSBXSEVSRSBpZCA9Ci1ganNtaXRoJwotCi1Ob3RlIHRoYXQgVFRMcyBhcmUgYWxsb3dlZCBmb3IgYm90aCBgSU5TRVJUYCBhbmQgYFVQREFURWAsIGJ1dCBpbiBib3RoCi1jYXNlIHRoZSBUVEwgc2V0IG9ubHkgYXBwbHkgdG8gdGhlIG5ld2x5IGluc2VydGVkL3VwZGF0ZWQgX3ZhbHVlc18uIEluCi1vdGhlciB3b3JkcywKLQotYmMoc2FtcGxlKS4gKwotLy8gVXBkYXRpbmcgKG9yIGluc2VydGluZykgKwotVVBEQVRFIHVzZXJzIFVTSU5HIFRUTCAxMCBTRVQgZmF2c1tgY29sb3InXSA9IGBncmVlbicgV0hFUkUgaWQgPQotYGpzbWl0aCcKLQotd2lsbCBvbmx5IGFwcGx5IHRoZSBUVEwgdG8gdGhlIGB7ICdjb2xvcicgOiAnZ3JlZW4nIH1gIHJlY29yZCwgdGhlIHJlc3QKLW9mIHRoZSBtYXAgcmVtYWluaW5nIHVuYWZmZWN0ZWQuCi0KLURlbGV0aW5nIGEgbWFwIHJlY29yZCBpcyBkb25lIHdpdGg6Ci0KLWJjKHNhbXBsZSkuICsKLURFTEVURSBmYXZzW2BhdXRob3InXSBGUk9NIHVzZXJzIFdIRVJFIGlkID0gYGpzbWl0aCcKLQotW1tzZXRdXQotPT09PT0gU2V0cwotCi1BIGBzZXRgIGlzIGEgbGluazojdHlwZXNbdHlwZWRdIGNvbGxlY3Rpb24gb2YgdW5pcXVlIHZhbHVlcy4gU2V0cyBhcmUKLW9yZGVyZWQgYnkgdGhlaXIgdmFsdWVzLiBUbyBjcmVhdGUgYSBjb2x1bW4gb2YgdHlwZSBgc2V0YCwgdXNlIHRoZSBgc2V0YAota2V5d29yZCBzdWZmaXhlZCB3aXRoIHRoZSB2YWx1ZSB0eXBlIGVuY2xvc2VkIGluIGFuZ2xlIGJyYWNrZXRzLiBGb3IKLWV4YW1wbGU6Ci0KLWJjKHNhbXBsZSkuICsKLUNSRUFURSBUQUJMRSBpbWFnZXMgKCArCi1uYW1lIHRleHQgUFJJTUFSWSBLRVksICsKLW93bmVyIHRleHQsICsKLWRhdGUgdGltZXN0YW1wLCArCi10YWdzIHNldCArCi0pOwotCi1Xcml0aW5nIGEgYHNldGAgaXMgYWNjb21wbGlzaGVkIGJ5IGNvbW1hIHNlcGFyYXRpbmcgdGhlIHNldCB2YWx1ZXMsIGFuZAotZW5jbG9zaW5nIHRoZW0gaW4gY3VybHkgYnJhY2VzLiBfTm90ZTogQW4gYElOU0VSVGAgd2lsbCBhbHdheXMgcmVwbGFjZQotdGhlIGVudGlyZSBzZXQuXwotCi1iYyhzYW1wbGUpLiArCi1JTlNFUlQgSU5UTyBpbWFnZXMgKG5hbWUsIG93bmVyLCBkYXRlLCB0YWdzKSArCi1WQUxVRVMgKGBjYXQuanBnJywgYGpzbWl0aCcsIGBub3cnLCBceyBga2l0dGVuJywgYGNhdCcsIGBwZXQnIH0pOwotCi1BZGRpbmcgYW5kIHJlbW92aW5nIHZhbHVlcyBvZiBhIHNldCBjYW4gYmUgYWNjb21wbGlzaGVkIHdpdGggYW4gYFVQREFURWAKLWJ5IGFkZGluZy9yZW1vdmluZyBuZXcgc2V0IHZhbHVlcyB0byBhbiBleGlzdGluZyBgc2V0YCBjb2x1bW4uCi0KLWJjKHNhbXBsZSkuICsKLVVQREFURSBpbWFnZXMgU0VUIHRhZ3MgPSB0YWdzICsgXHsgYGN1dGUnLCBgY3VkZGx5JyB9IFdIRVJFIG5hbWUgPQotYGNhdC5qcGcnOyArCi1VUERBVEUgaW1hZ2VzIFNFVCB0YWdzID0gdGFncyAtIFx7IGBsYW1lJyB9IFdIRVJFIG5hbWUgPSBgY2F0LmpwZyc7Ci0KLUFzIHdpdGggbGluazojbWFwW21hcHNdLCBUVExzIGlmIHVzZWQgb25seSBhcHBseSB0byB0aGUgbmV3bHkKLWluc2VydGVkL3VwZGF0ZWQgX3ZhbHVlc18uCi0KLVtbbGlzdF1dCi09PT09PSBMaXN0cwotCi1BIGBsaXN0YCBpcyBhIGxpbms6I3R5cGVzW3R5cGVkXSBjb2xsZWN0aW9uIG9mIG5vbi11bmlxdWUgdmFsdWVzIHdoZXJlCi1lbGVtZW50cyBhcmUgb3JkZXJlZCBieSB0aGVyZSBwb3NpdGlvbiBpbiB0aGUgbGlzdC4gVG8gY3JlYXRlIGEgY29sdW1uCi1vZiB0eXBlIGBsaXN0YCwgdXNlIHRoZSBgbGlzdGAga2V5d29yZCBzdWZmaXhlZCB3aXRoIHRoZSB2YWx1ZSB0eXBlCi1lbmNsb3NlZCBpbiBhbmdsZSBicmFja2V0cy4gRm9yIGV4YW1wbGU6Ci0KLWJjKHNhbXBsZSkuICsKLUNSRUFURSBUQUJMRSBwbGF5cyAoICsKLWlkIHRleHQgUFJJTUFSWSBLRVksICsKLWdhbWUgdGV4dCwgKwotcGxheWVycyBpbnQsICsKLXNjb3JlcyBsaXN0ICsKLSkKLQotRG8gbm90ZSB0aGF0IGFzIGV4cGxhaW5lZCBiZWxvdywgbGlzdHMgaGF2ZSBzb21lIGxpbWl0YXRpb25zIGFuZAotcGVyZm9ybWFuY2UgY29uc2lkZXJhdGlvbnMgdG8gdGFrZSBpbnRvIGFjY291bnQsIGFuZCBpdCBpcyBhZHZpc2VkIHRvCi1wcmVmZXIgbGluazojc2V0W3NldHNdIG92ZXIgbGlzdHMgd2hlbiB0aGlzIGlzIHBvc3NpYmxlLgotCi1Xcml0aW5nIGBsaXN0YCBkYXRhIGlzIGFjY29tcGxpc2hlZCB3aXRoIGEgSlNPTi1zdHlsZSBzeW50YXguIFRvIHdyaXRlIGEKLXJlY29yZCB1c2luZyBgSU5TRVJUYCwgc3BlY2lmeSB0aGUgZW50aXJlIGxpc3QgYXMgYSBKU09OIGFycmF5LiBfTm90ZToKLUFuIGBJTlNFUlRgIHdpbGwgYWx3YXlzIHJlcGxhY2UgdGhlIGVudGlyZSBsaXN0Ll8KLQotYmMoc2FtcGxlKS4gKwotSU5TRVJUIElOVE8gcGxheXMgKGlkLCBnYW1lLCBwbGF5ZXJzLCBzY29yZXMpICsKLVZBTFVFUyAoYDEyMy1hZmRlJywgYHF1YWtlJywgMywgWzE3LCA0LCAyXSk7Ci0KLUFkZGluZyAoYXBwZW5kaW5nIG9yIHByZXBlbmRpbmcpIHZhbHVlcyB0byBhIGxpc3QgY2FuIGJlIGFjY29tcGxpc2hlZCBieQotYWRkaW5nIGEgbmV3IEpTT04tc3R5bGUgYXJyYXkgdG8gYW4gZXhpc3RpbmcgYGxpc3RgIGNvbHVtbi4KLQotYmMoc2FtcGxlKS4gKwotVVBEQVRFIHBsYXlzIFNFVCBwbGF5ZXJzID0gNSwgc2NvcmVzID0gc2NvcmVzICsgWyAxNCwgMjEgXSBXSEVSRSBpZCA9Ci1gMTIzLWFmZGUnOyArCi1VUERBVEUgcGxheXMgU0VUIHBsYXllcnMgPSA1LCBzY29yZXMgPSBbIDEyIF0gKyBzY29yZXMgV0hFUkUgaWQgPQotYDEyMy1hZmRlJzsKLQotSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgYXBwZW5kIGFuZCBwcmVwZW5kIGFyZSBub3QgaWRlbXBvdGVudAotb3BlcmF0aW9ucy4gVGhpcyBtZWFucyB0aGF0IGlmIGR1cmluZyBhbiBhcHBlbmQgb3IgYSBwcmVwZW5kIHRoZQotb3BlcmF0aW9uIHRpbWVvdXQsIGl0IGlzIG5vdCBhbHdheXMgc2FmZSB0byByZXRyeSB0aGUgb3BlcmF0aW9uIChhcyB0aGlzCi1jb3VsZCByZXN1bHQgaW4gdGhlIHJlY29yZCBhcHBlbmRlZCBvciBwcmVwZW5kZWQgdHdpY2UpLgotCi1MaXN0cyBhbHNvIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9uOiBzZXR0aW5nIGFuIGVsZW1lbnQgYnkgaXRzCi1wb3NpdGlvbiBpbiB0aGUgbGlzdCwgcmVtb3ZpbmcgYW4gZWxlbWVudCBieSBpdHMgcG9zaXRpb24gaW4gdGhlIGxpc3QKLWFuZCByZW1vdmUgYWxsIHRoZSBvY2N1cnJlbmNlIG9mIGEgZ2l2ZW4gdmFsdWUgaW4gdGhlIGxpc3QuIF9Ib3dldmVyLAotYW5kIGNvbnRyYXJpbHkgdG8gYWxsIHRoZSBvdGhlciBjb2xsZWN0aW9uIG9wZXJhdGlvbnMsIHRoZXNlIHRocmVlCi1vcGVyYXRpb25zIGluZHVjZSBhbiBpbnRlcm5hbCByZWFkIGJlZm9yZSB0aGUgdXBkYXRlLCBhbmQgd2lsbCB0aHVzCi10eXBpY2FsbHkgaGF2ZSBzbG93ZXIgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzXy4gVGhvc2Ugb3BlcmF0aW9ucwotaGF2ZSB0aGUgZm9sbG93aW5nIHN5bnRheDoKLQotYmMoc2FtcGxlKS4gKwotVVBEQVRFIHBsYXlzIFNFVCBzY29yZXNbMV0gPSA3IFdIRVJFIGlkID0gYDEyMy1hZmRlJzsgLy8gc2V0cyB0aGUgMm5kCi1lbGVtZW50IG9mIHNjb3JlcyB0byA3IChyYWlzZXMgYW4gZXJyb3IgaXMgc2NvcmVzIGhhcyBsZXNzIHRoYW4gMgotZWxlbWVudHMpICsKLURFTEVURSBzY29yZXNbMV0gRlJPTSBwbGF5cyBXSEVSRSBpZCA9IGAxMjMtYWZkZSc7IC8vIGRlbGV0ZXMgdGhlIDJuZAotZWxlbWVudCBvZiBzY29yZXMgKHJhaXNlcyBhbiBlcnJvciBpcyBzY29yZXMgaGFzIGxlc3MgdGhhbiAyIGVsZW1lbnRzKSArCi1VUERBVEUgcGxheXMgU0VUIHNjb3JlcyA9IHNjb3JlcyAtIFsgMTIsIDIxIF0gV0hFUkUgaWQgPSBgMTIzLWFmZGUnOyAvLwotcmVtb3ZlcyBhbGwgb2NjdXJyZW5jZXMgb2YgMTIgYW5kIDIxIGZyb20gc2NvcmVzCi0KLUFzIHdpdGggbGluazojbWFwW21hcHNdLCBUVExzIGlmIHVzZWQgb25seSBhcHBseSB0byB0aGUgbmV3bHkKLWluc2VydGVkL3VwZGF0ZWQgX3ZhbHVlc18uCi0KLT09PSBGdW5jdGlvbnMKLQotQ1FMMyBkaXN0aW5ndWlzaGVzIGJldHdlZW4gYnVpbHQtaW4gZnVuY3Rpb25zIChzbyBjYWxsZWQgYG5hdGl2ZQotZnVuY3Rpb25zJykgYW5kIGxpbms6I3VkZnNbdXNlci1kZWZpbmVkIGZ1bmN0aW9uc10uIENRTDMgaW5jbHVkZXMKLXNldmVyYWwgbmF0aXZlIGZ1bmN0aW9ucywgZGVzY3JpYmVkIGJlbG93OgotCi1bW2Nhc3RGdW5dXQotPT09PSBDYXN0Ci0KLVRoZSBgY2FzdGAgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY29udmVydHMgb25lIG5hdGl2ZSBkYXRhdHlwZSB0bwotYW5vdGhlci4KLQotVGhlIGZvbGxvd2luZyB0YWJsZSBkZXNjcmliZXMgdGhlIGNvbnZlcnNpb25zIHN1cHBvcnRlZCBieSB0aGUgYGNhc3RgCi1mdW5jdGlvbi4gQ2Fzc2FuZHJhIHdpbGwgc2lsZW50bHkgaWdub3JlIGFueSBjYXN0IGNvbnZlcnRpbmcgYSBkYXRhdHlwZQotaW50byBpdHMgb3duIGRhdGF0eXBlLgotCi1bY29scz0iLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18ZnJvbSB8dG8KLXxgYXNjaWlgIHxgdGV4dGAsIGB2YXJjaGFyYAotCi18YGJpZ2ludGAgfGB0aW55aW50YCwgYHNtYWxsaW50YCwgYGludGAsIGBmbG9hdGAsIGBkb3VibGVgLCBgZGVjaW1hbGAsCi1gdmFyaW50YCwgYHRleHRgLCBgdmFyY2hhcmAKLQotfGBib29sZWFuYCB8YHRleHRgLCBgdmFyY2hhcmAKLQotfGBjb3VudGVyYCB8YHRpbnlpbnRgLCBgc21hbGxpbnRgLCBgaW50YCwgYGJpZ2ludGAsIGBmbG9hdGAsIGBkb3VibGVgLAotYGRlY2ltYWxgLCBgdmFyaW50YCwgYHRleHRgLCBgdmFyY2hhcmAKLQotfGBkYXRlYCB8YHRpbWVzdGFtcGAKLQotfGBkZWNpbWFsYCB8YHRpbnlpbnRgLCBgc21hbGxpbnRgLCBgaW50YCwgYGJpZ2ludGAsIGBmbG9hdGAsIGBkb3VibGVgLAotYHZhcmludGAsIGB0ZXh0YCwgYHZhcmNoYXJgCi0KLXxgZG91YmxlYCB8YHRpbnlpbnRgLCBgc21hbGxpbnRgLCBgaW50YCwgYGJpZ2ludGAsIGBmbG9hdGAsIGBkZWNpbWFsYCwKLWB2YXJpbnRgLCBgdGV4dGAsIGB2YXJjaGFyYAotCi18YGZsb2F0YCB8YHRpbnlpbnRgLCBgc21hbGxpbnRgLCBgaW50YCwgYGJpZ2ludGAsIGBkb3VibGVgLCBgZGVjaW1hbGAsCi1gdmFyaW50YCwgYHRleHRgLCBgdmFyY2hhcmAKLQotfGBpbmV0YCB8YHRleHRgLCBgdmFyY2hhcmAKLQotfGBpbnRgIHxgdGlueWludGAsIGBzbWFsbGludGAsIGBiaWdpbnRgLCBgZmxvYXRgLCBgZG91YmxlYCwgYGRlY2ltYWxgLAotYHZhcmludGAsIGB0ZXh0YCwgYHZhcmNoYXJgCi0KLXxgc21hbGxpbnRgIHxgdGlueWludGAsIGBpbnRgLCBgYmlnaW50YCwgYGZsb2F0YCwgYGRvdWJsZWAsIGBkZWNpbWFsYCwKLWB2YXJpbnRgLCBgdGV4dGAsIGB2YXJjaGFyYAotCi18YHRpbWVgIHxgdGV4dGAsIGB2YXJjaGFyYAotCi18YHRpbWVzdGFtcGAgfGBkYXRlYCwgYHRleHRgLCBgdmFyY2hhcmAKLQotfGB0aW1ldXVpZGAgfGB0aW1lc3RhbXBgLCBgZGF0ZWAsIGB0ZXh0YCwgYHZhcmNoYXJgCi0KLXxgdGlueWludGAgfGB0aW55aW50YCwgYHNtYWxsaW50YCwgYGludGAsIGBiaWdpbnRgLCBgZmxvYXRgLCBgZG91YmxlYCwKLWBkZWNpbWFsYCwgYHZhcmludGAsIGB0ZXh0YCwgYHZhcmNoYXJgCi0KLXxgdXVpZGAgfGB0ZXh0YCwgYHZhcmNoYXJgCi0KLXxgdmFyaW50YCB8YHRpbnlpbnRgLCBgc21hbGxpbnRgLCBgaW50YCwgYGJpZ2ludGAsIGBmbG9hdGAsIGBkb3VibGVgLAotYGRlY2ltYWxgLCBgdGV4dGAsIGB2YXJjaGFyYAotfD09PQotCi1UaGUgY29udmVyc2lvbnMgcmVseSBzdHJpY3RseSBvbiBKYXZh4oCZcyBzZW1hbnRpY3MuIEZvciBleGFtcGxlLCB0aGUKLWRvdWJsZSB2YWx1ZSAxIHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSB0ZXh0IHZhbHVlIGAxLjAnLgotCi1iYyhzYW1wbGUpLiArCi1TRUxFQ1QgYXZnKGNhc3QoY291bnQgYXMgZG91YmxlKSkgRlJPTSBteVRhYmxlCi0KLVtbdG9rZW5GdW5dXQotPT09PSBUb2tlbgotCi1UaGUgYHRva2VuYCBmdW5jdGlvbiBhbGxvd3MgdG8gY29tcHV0ZSB0aGUgdG9rZW4gZm9yIGEgZ2l2ZW4gcGFydGl0aW9uCi1rZXkuIFRoZSBleGFjdCBzaWduYXR1cmUgb2YgdGhlIHRva2VuIGZ1bmN0aW9uIGRlcGVuZHMgb24gdGhlIHRhYmxlCi1jb25jZXJuZWQgYW5kIG9mIHRoZSBwYXJ0aXRpb25lciB1c2VkIGJ5IHRoZSBjbHVzdGVyLgotCi1UaGUgdHlwZSBvZiB0aGUgYXJndW1lbnRzIG9mIHRoZSBgdG9rZW5gIGRlcGVuZCBvbiB0aGUgdHlwZSBvZiB0aGUKLXBhcnRpdGlvbiBrZXkgY29sdW1ucy4gVGhlIHJldHVybiB0eXBlIGRlcGVuZCBvbiB0aGUgcGFydGl0aW9uZXIgaW4gdXNlOgotCi0qIEZvciBNdXJtdXIzUGFydGl0aW9uZXIsIHRoZSByZXR1cm4gdHlwZSBpcyBgYmlnaW50YC4KLSogRm9yIFJhbmRvbVBhcnRpdGlvbmVyLCB0aGUgcmV0dXJuIHR5cGUgaXMgYHZhcmludGAuCi0qIEZvciBCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLCB0aGUgcmV0dXJuIHR5cGUgaXMgYGJsb2JgLgotCi1Gb3IgaW5zdGFuY2UsIGluIGEgY2x1c3RlciB1c2luZyB0aGUgZGVmYXVsdCBNdXJtdXIzUGFydGl0aW9uZXIsIGlmIGEKLXRhYmxlIGlzIGRlZmluZWQgYnkKLQotYmMoc2FtcGxlKS4gKwotQ1JFQVRFIFRBQkxFIHVzZXJzICggKwotdXNlcmlkIHRleHQgUFJJTUFSWSBLRVksICsKLXVzZXJuYW1lIHRleHQsICsKLeKApiArCi0pCi0KLXRoZW4gdGhlIGB0b2tlbmAgZnVuY3Rpb24gd2lsbCB0YWtlIGEgc2luZ2xlIGFyZ3VtZW50IG9mIHR5cGUgYHRleHRgIChpbgotdGhhdCBjYXNlLCB0aGUgcGFydGl0aW9uIGtleSBpcyBgdXNlcmlkYCAodGhlcmUgaXMgbm8gY2x1c3RlcmluZyBjb2x1bW5zCi1zbyB0aGUgcGFydGl0aW9uIGtleSBpcyB0aGUgc2FtZSB0aGFuIHRoZSBwcmltYXJ5IGtleSkpLCBhbmQgdGhlIHJldHVybgotdHlwZSB3aWxsIGJlIGBiaWdpbnRgLgotCi1bW3V1aWRGdW5dXQotPT09PSBVdWlkCi0KLVRoZSBgdXVpZGAgZnVuY3Rpb24gdGFrZXMgbm8gcGFyYW1ldGVycyBhbmQgZ2VuZXJhdGVzIGEgcmFuZG9tIHR5cGUgNAotdXVpZCBzdWl0YWJsZSBmb3IgdXNlIGluIElOU0VSVCBvciBTRVQgc3RhdGVtZW50cy4KLQotW1t0aW1ldXVpZEZ1bl1dCi09PT09IFRpbWV1dWlkIGZ1bmN0aW9ucwotCi09PT09PSBgbm93YAotCi1UaGUgYG5vd2AgZnVuY3Rpb24gdGFrZXMgbm8gYXJndW1lbnRzIGFuZCBnZW5lcmF0ZXMsIG9uIHRoZSBjb29yZGluYXRvcgotbm9kZSwgYSBuZXcgdW5pcXVlIHRpbWV1dWlkIChhdCB0aGUgdGltZSB3aGVyZSB0aGUgc3RhdGVtZW50IHVzaW5nIGl0IGlzCi1leGVjdXRlZCkuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIGluc2VydGlvbiBidXQgaXMgbGFyZ2VseQotbm9uLXNlbnNpY2FsIGluIGBXSEVSRWAgY2xhdXNlcy4gRm9yIGluc3RhbmNlLCBhIHF1ZXJ5IG9mIHRoZSBmb3JtCi0KLWJjKHNhbXBsZSkuICsKLVNFTEVDVCAqIEZST00gbXlUYWJsZSBXSEVSRSB0ID0gbm93KCkKLQotd2lsbCBuZXZlciByZXR1cm4gYW55IHJlc3VsdCBieSBkZXNpZ24sIHNpbmNlIHRoZSB2YWx1ZSByZXR1cm5lZCBieQotYG5vdygpYCBpcyBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZS4KLQotPT09PT0gYG1pblRpbWV1dWlkYCBhbmQgYG1heFRpbWV1dWlkYAotCi1UaGUgYG1pblRpbWV1dWlkYCAocmVzcC4gYG1heFRpbWV1dWlkYCkgZnVuY3Rpb24gdGFrZXMgYSBgdGltZXN0YW1wYAotdmFsdWUgYHRgICh3aGljaCBjYW4gYmUgbGluazojdXNpbmd0aW1lc3RhbXBzW2VpdGhlciBhIHRpbWVzdGFtcCBvciBhCi1kYXRlIHN0cmluZ10gKSBhbmQgcmV0dXJuIGEgX2Zha2VfIGB0aW1ldXVpZGAgY29ycmVzcG9uZGluZyB0byB0aGUKLV9zbWFsbGVzdF8gKHJlc3AuIF9iaWdnZXN0XykgcG9zc2libGUgYHRpbWV1dWlkYCBoYXZpbmcgZm9yIHRpbWVzdGFtcAotYHRgLiBTbyBmb3IgaW5zdGFuY2U6Ci0KLWJjKHNhbXBsZSkuICsKLVNFTEVDVCAqIEZST00gbXlUYWJsZSBXSEVSRSB0ID4gbWF4VGltZXV1aWQoYDIwMTMtMDEtMDEgMDA6MDUrMDAwMCcpIEFORAotdCA8IG1pblRpbWV1dWlkKGAyMDEzLTAyLTAyIDEwOjAwKzAwMDAnKQotCi13aWxsIHNlbGVjdCBhbGwgcm93cyB3aGVyZSB0aGUgYHRpbWV1dWlkYCBjb2x1bW4gYHRgIGlzIHN0cmljdGx5IG9sZGVyCi10aGFuIGAyMDEzLTAxLTAxIDAwOjA1KzAwMDAnIGJ1dCBzdHJpY3RseSB5b3VuZ2VyIHRoYW4gYDIwMTMtMDItMDIKLTEwOjAwKzAwMDAnLiBQbGVhc2Ugbm90ZSB0aGF0Ci1gdCA+PSBtYXhUaW1ldXVpZCgnMjAxMy0wMS0wMSAwMDowNSswMDAwJylgIHdvdWxkIHN0aWxsIF9ub3RfIHNlbGVjdCBhCi1gdGltZXV1aWRgIGdlbmVyYXRlZCBleGFjdGx5IGF0IGAyMDEzLTAxLTAxIDAwOjA1KzAwMDAnIGFuZCBpcwotZXNzZW50aWFsbHkgZXF1aXZhbGVudCB0byBgdCA+IG1heFRpbWV1dWlkKCcyMDEzLTAxLTAxIDAwOjA1KzAwMDAnKWAuCi0KLV9XYXJuaW5nXzogV2UgY2FsbGVkIHRoZSB2YWx1ZXMgZ2VuZXJhdGVkIGJ5IGBtaW5UaW1ldXVpZGAgYW5kCi1gbWF4VGltZXV1aWRgIF9mYWtlXyBVVUlEIGJlY2F1c2UgdGhleSBkbyBubyByZXNwZWN0IHRoZSBUaW1lLUJhc2VkIFVVSUQKLWdlbmVyYXRpb24gcHJvY2VzcyBzcGVjaWZpZWQgYnkgdGhlCi1odHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0MTIyLnR4dFtSRkMgNDEyMl0uIEluIHBhcnRpY3VsYXIsIHRoZSB2YWx1ZQotcmV0dXJuZWQgYnkgdGhlc2UgMiBtZXRob2RzIHdpbGwgbm90IGJlIHVuaXF1ZS4gVGhpcyBtZWFucyB5b3Ugc2hvdWxkCi1vbmx5IHVzZSB0aG9zZSBtZXRob2RzIGZvciBxdWVyeWluZyAoYXMgaW4gdGhlIGV4YW1wbGUgYWJvdmUpLiBJbnNlcnRpbmcKLXRoZSByZXN1bHQgb2YgdGhvc2UgbWV0aG9kcyBpcyBhbG1vc3QgY2VydGFpbmx5IF9hIGJhZCBpZGVhXy4KLQotW1t0aW1lRnVuXV0KLT09PT0gVGltZSBjb252ZXJzaW9uIGZ1bmN0aW9ucwotCi1BIG51bWJlciBvZiBmdW5jdGlvbnMgYXJlIHByb3ZpZGVkIHRvIGBgY29udmVydCcnIGEgYHRpbWV1dWlkYCwgYQotYHRpbWVzdGFtcGAgb3IgYSBgZGF0ZWAgaW50byBhbm90aGVyIGBuYXRpdmVgIHR5cGUuCi0KLVtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18ZnVuY3Rpb24gbmFtZSB8aW5wdXQgdHlwZSB8ZGVzY3JpcHRpb24KLXxgdG9EYXRlYCB8YHRpbWV1dWlkYCB8Q29udmVydHMgdGhlIGB0aW1ldXVpZGAgYXJndW1lbnQgaW50byBhIGBkYXRlYAotdHlwZQotCi18YHRvRGF0ZWAgfGB0aW1lc3RhbXBgIHxDb252ZXJ0cyB0aGUgYHRpbWVzdGFtcGAgYXJndW1lbnQgaW50byBhIGBkYXRlYAotdHlwZQotCi18YHRvVGltZXN0YW1wYCB8YHRpbWV1dWlkYCB8Q29udmVydHMgdGhlIGB0aW1ldXVpZGAgYXJndW1lbnQgaW50byBhCi1gdGltZXN0YW1wYCB0eXBlCi0KLXxgdG9UaW1lc3RhbXBgIHxgZGF0ZWAgfENvbnZlcnRzIHRoZSBgZGF0ZWAgYXJndW1lbnQgaW50byBhIGB0aW1lc3RhbXBgCi10eXBlCi0KLXxgdG9Vbml4VGltZXN0YW1wYCB8YHRpbWV1dWlkYCB8Q29udmVydHMgdGhlIGB0aW1ldXVpZGAgYXJndW1lbnQgaW50byBhCi1gYmlnSW50YCByYXcgdmFsdWUKLQotfGB0b1VuaXhUaW1lc3RhbXBgIHxgdGltZXN0YW1wYCB8Q29udmVydHMgdGhlIGB0aW1lc3RhbXBgIGFyZ3VtZW50IGludG8KLWEgYGJpZ0ludGAgcmF3IHZhbHVlCi0KLXxgdG9Vbml4VGltZXN0YW1wYCB8YGRhdGVgIHxDb252ZXJ0cyB0aGUgYGRhdGVgIGFyZ3VtZW50IGludG8gYSBgYmlnSW50YAotcmF3IHZhbHVlCi0KLXxgZGF0ZU9mYCB8YHRpbWV1dWlkYCB8U2ltaWxhciB0byBgdG9UaW1lc3RhbXAodGltZXV1aWQpYCAoREVQUkVDQVRFRCkKLQotfGB1bml4VGltZXN0YW1wT2ZgIHxgdGltZXV1aWRgIHxTaW1pbGFyIHRvIGB0b1VuaXhUaW1lc3RhbXAodGltZXV1aWQpYAotKERFUFJFQ0FURUQpCi18PT09Ci0KLVtbYmxvYkZ1bl1dCi09PT09IEJsb2IgY29udmVyc2lvbiBmdW5jdGlvbnMKLQotQSBudW1iZXIgb2YgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCB0byBgYGNvbnZlcnQnJyB0aGUgbmF0aXZlIHR5cGVzIGludG8KLWJpbmFyeSBkYXRhIChgYmxvYmApLiBGb3IgZXZlcnkgYDxuYXRpdmUtdHlwZT5gIGB0eXBlYCBzdXBwb3J0ZWQgYnkgQ1FMMwotKGEgbm90YWJsZSBleGNlcHRpb25zIGlzIGBibG9iYCwgZm9yIG9idmlvdXMgcmVhc29ucyksIHRoZSBmdW5jdGlvbgotYHR5cGVBc0Jsb2JgIHRha2VzIGEgYXJndW1lbnQgb2YgdHlwZSBgdHlwZWAgYW5kIHJldHVybiBpdCBhcyBhIGBibG9iYC4KLUNvbnZlcnNlbHksIHRoZSBmdW5jdGlvbiBgYmxvYkFzVHlwZWAgdGFrZXMgYSA2NC1iaXQgYGJsb2JgIGFyZ3VtZW50IGFuZAotY29udmVydCBpdCB0byBhIGBiaWdpbnRgIHZhbHVlLiBBbmQgc28gZm9yIGluc3RhbmNlLCBgYmlnaW50QXNCbG9iKDMpYAotaXMgYDB4MDAwMDAwMDAwMDAwMDAwM2AgYW5kIGBibG9iQXNCaWdpbnQoMHgwMDAwMDAwMDAwMDAwMDAzKWAgaXMgYDNgLgotCi09PT0gQWdncmVnYXRlcwotCi1BZ2dyZWdhdGUgZnVuY3Rpb25zIHdvcmsgb24gYSBzZXQgb2Ygcm93cy4gVGhleSByZWNlaXZlIHZhbHVlcyBmb3IgZWFjaAotcm93IGFuZCByZXR1cm5zIG9uZSB2YWx1ZSBmb3IgdGhlIHdob2xlIHNldC4gKwotSWYgYG5vcm1hbGAgY29sdW1ucywgYHNjYWxhciBmdW5jdGlvbnNgLCBgVURUYCBmaWVsZHMsIGB3cml0ZXRpbWVgIG9yCi1gdHRsYCBhcmUgc2VsZWN0ZWQgdG9nZXRoZXIgd2l0aCBhZ2dyZWdhdGUgZnVuY3Rpb25zLCB0aGUgdmFsdWVzCi1yZXR1cm5lZCBmb3IgdGhlbSB3aWxsIGJlIHRoZSBvbmVzIG9mIHRoZSBmaXJzdCByb3cgbWF0Y2hpbmcgdGhlIHF1ZXJ5LgotCi1DUUwzIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBidWlsdC1pbiBhZ2dyZWdhdGVzIChzbyBjYWxsZWQgYG5hdGl2ZQotYWdncmVnYXRlcycpIGFuZCBsaW5rOiN1ZGFzW3VzZXItZGVmaW5lZCBhZ2dyZWdhdGVzXS4gQ1FMMyBpbmNsdWRlcwotc2V2ZXJhbCBuYXRpdmUgYWdncmVnYXRlcywgZGVzY3JpYmVkIGJlbG93OgotCi1bW2NvdW50RmN0XV0KLT09PT0gQ291bnQKLQotVGhlIGBjb3VudGAgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY291bnQgdGhlIHJvd3MgcmV0dXJuZWQgYnkgYSBxdWVyeS4KLUV4YW1wbGU6Ci0KLWJjKHNhbXBsZSkuICsKLVNFTEVDVCBDT1VOVCAoKikgRlJPTSBwbGF5czsgKwotU0VMRUNUIENPVU5UICgxKSBGUk9NIHBsYXlzOwotCi1JdCBhbHNvIGNhbiBiZSB1c2VkIHRvIGNvdW50IHRoZSBub24gbnVsbCB2YWx1ZSBvZiBhIGdpdmVuIGNvbHVtbi4KLUV4YW1wbGU6Ci0KLWJjKHNhbXBsZSkuICsKLVNFTEVDVCBDT1VOVCAoc2NvcmVzKSBGUk9NIHBsYXlzOwotCi1bW21heE1pbkZjdHNdXQotPT09PSBNYXggYW5kIE1pbgotCi1UaGUgYG1heGAgYW5kIGBtaW5gIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCB0byBjb21wdXRlIHRoZSBtYXhpbXVtIGFuZCB0aGUKLW1pbmltdW0gdmFsdWUgcmV0dXJuZWQgYnkgYSBxdWVyeSBmb3IgYSBnaXZlbiBjb2x1bW4uCi0KLWJjKHNhbXBsZSkuICsKLVNFTEVDVCBNSU4gKHBsYXllcnMpLCBNQVggKHBsYXllcnMpIEZST00gcGxheXMgV0hFUkUgZ2FtZSA9IGBxdWFrZSc7Ci0KLVtbc3VtRmN0XV0KLT09PT0gU3VtCi0KLVRoZSBgc3VtYCBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBzdW0gdXAgYWxsIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgYQotcXVlcnkgZm9yIGEgZ2l2ZW4gY29sdW1uLgotCi1iYyhzYW1wbGUpLiArCi1TRUxFQ1QgU1VNIChwbGF5ZXJzKSBGUk9NIHBsYXlzOwotCi1bW2F2Z0ZjdF1dCi09PT09IEF2ZwotCi1UaGUgYGF2Z2AgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgYXZlcmFnZSBvZiBhbGwgdGhlIHZhbHVlcwotcmV0dXJuZWQgYnkgYSBxdWVyeSBmb3IgYSBnaXZlbiBjb2x1bW4uCi0KLWJjKHNhbXBsZSkuICsKLVNFTEVDVCBBVkcgKHBsYXllcnMpIEZST00gcGxheXM7Ci0KLVtbdWRmc11dCi09PT0gVXNlci1EZWZpbmVkIEZ1bmN0aW9ucwotCi1Vc2VyLWRlZmluZWQgZnVuY3Rpb25zIGFsbG93IGV4ZWN1dGlvbiBvZiB1c2VyLXByb3ZpZGVkIGNvZGUgaW4KLUNhc3NhbmRyYS4gQnkgZGVmYXVsdCwgQ2Fzc2FuZHJhIHN1cHBvcnRzIGRlZmluaW5nIGZ1bmN0aW9ucyBpbiBfSmF2YV8KLWFuZCBfSmF2YVNjcmlwdF8uIFN1cHBvcnQgZm9yIG90aGVyIEpTUiAyMjMgY29tcGxpYW50IHNjcmlwdGluZwotbGFuZ3VhZ2VzIChzdWNoIGFzIFB5dGhvbiwgUnVieSwgYW5kIFNjYWxhKSBoYXMgYmVlbiByZW1vdmVkIGluIDMuMC4xMS4KLQotVURGcyBhcmUgcGFydCBvZiB0aGUgQ2Fzc2FuZHJhIHNjaGVtYS4gQXMgc3VjaCwgdGhleSBhcmUgYXV0b21hdGljYWxseQotcHJvcGFnYXRlZCB0byBhbGwgbm9kZXMgaW4gdGhlIGNsdXN0ZXIuCi0KLVVERnMgY2FuIGJlIF9vdmVybG9hZGVkXyAtIGkuZS4gbXVsdGlwbGUgVURGcyB3aXRoIGRpZmZlcmVudCBhcmd1bWVudAotdHlwZXMgYnV0IHRoZSBzYW1lIGZ1bmN0aW9uIG5hbWUuIEV4YW1wbGU6Ci0KLWJjKHNhbXBsZSkuICsKLUNSRUFURSBGVU5DVElPTiBzYW1wbGUgKCBhcmcgaW50ICkg4oCmOyArCi1DUkVBVEUgRlVOQ1RJT04gc2FtcGxlICggYXJnIHRleHQgKSDigKY7Ci0KLVVzZXItZGVmaW5lZCBmdW5jdGlvbnMgYXJlIHN1c2NlcHRpYmxlIHRvIGFsbCBvZiB0aGUgbm9ybWFsIHByb2JsZW1zCi13aXRoIHRoZSBjaG9zZW4gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIEFjY29yZGluZ2x5LCBpbXBsZW1lbnRhdGlvbnMKLXNob3VsZCBiZSBzYWZlIGFnYWluc3QgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbnMsIGlsbGVnYWwgYXJndW1lbnRzLCBvcgotYW55IG90aGVyIHBvdGVudGlhbCBzb3VyY2Ugb2YgZXhjZXB0aW9ucy4gQW4gZXhjZXB0aW9uIGR1cmluZyBmdW5jdGlvbgotZXhlY3V0aW9uIHdpbGwgcmVzdWx0IGluIHRoZSBlbnRpcmUgc3RhdGVtZW50IGZhaWxpbmcuCi0KLUl0IGlzIHZhbGlkIHRvIHVzZSBfY29tcGxleF8gdHlwZXMgbGlrZSBjb2xsZWN0aW9ucywgdHVwbGUgdHlwZXMgYW5kCi11c2VyLWRlZmluZWQgdHlwZXMgYXMgYXJndW1lbnQgYW5kIHJldHVybiB0eXBlcy4gVHVwbGUgdHlwZXMgYW5kCi11c2VyLWRlZmluZWQgdHlwZXMgYXJlIGhhbmRsZWQgYnkgdGhlIGNvbnZlcnNpb24gZnVuY3Rpb25zIG9mIHRoZQotRGF0YVN0YXggSmF2YSBEcml2ZXIuIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIEphdmEgRHJpdmVyCi1mb3IgZGV0YWlscyBvbiBoYW5kbGluZyB0dXBsZSB0eXBlcyBhbmQgdXNlci1kZWZpbmVkIHR5cGVzLgotCi1Bcmd1bWVudHMgZm9yIGZ1bmN0aW9ucyBjYW4gYmUgbGl0ZXJhbHMgb3IgdGVybXMuIFByZXBhcmVkIHN0YXRlbWVudAotcGxhY2Vob2xkZXJzIGNhbiBiZSB1c2VkLCB0b28uCi0KLU5vdGUgdGhhdCB5b3UgY2FuIHVzZSB0aGUgZG91YmxlLXF1b3RlZCBzdHJpbmcgc3ludGF4IHRvIGVuY2xvc2UgdGhlIFVERgotc291cmNlIGNvZGUuIEZvciBleGFtcGxlOgotCi1iYyhzYW1wbGUpLi4gKwotQ1JFQVRFIEZVTkNUSU9OIHNvbWVfZnVuY3Rpb24gKCBhcmcgaW50ICkgKwotUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgKwotUkVUVVJOUyBpbnQgKwotTEFOR1VBR0UgamF2YSArCi1BUyAkJCByZXR1cm4gYXJnOyAkJDsKLQotU0VMRUNUIHNvbWVfZnVuY3Rpb24oY29sdW1uKSBGUk9NIGF0YWJsZSDigKY7ICsKLVVQREFURSBhdGFibGUgU0VUIGNvbCA9IHNvbWVfZnVuY3Rpb24oPykg4oCmOyArCi1wLgotCi1iYyhzYW1wbGUpLiArCi1DUkVBVEUgVFlQRSBjdXN0b21fdHlwZSAodHh0IHRleHQsIGkgaW50KTsgKwotQ1JFQVRFIEZVTkNUSU9OIGZjdF91c2luZ191ZHQgKCB1ZHRhcmcgZnJvemVuICkgKwotUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgKwotUkVUVVJOUyB0ZXh0ICsKLUxBTkdVQUdFIGphdmEgKwotQVMgJCQgcmV0dXJuIHVkdGFyZy5nZXRTdHJpbmcoYGB0eHQnJyk7ICQkOwotCi1Vc2VyLWRlZmluZWQgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIGluIGxpbms6I3NlbGVjdFN0bXRbYFNFTEVDVGBdLAotbGluazojaW5zZXJ0U3RtdFtgSU5TRVJUYF0gYW5kIGxpbms6I3VwZGF0ZVN0bXRbYFVQREFURWBdIHN0YXRlbWVudHMuCi0KLVRoZSBpbXBsaWNpdGx5IGF2YWlsYWJsZSBgdWRmQ29udGV4dGAgZmllbGQgKG9yIGJpbmRpbmcgZm9yIHNjcmlwdCBVREZzKQotcHJvdmlkZXMgdGhlIG5lY2Nlc3NhcnkgZnVuY3Rpb25hbGl0eSB0byBjcmVhdGUgbmV3IFVEVCBhbmQgdHVwbGUKLXZhbHVlcy4KLQotYmMoc2FtcGxlKS4gKwotQ1JFQVRFIFRZUEUgY3VzdG9tX3R5cGUgKHR4dCB0ZXh0LCBpIGludCk7ICsKLUNSRUFURSBGVU5DVElPTiBmY3RfdXNpbmdfdWR0ICggc29tZWFyZyBpbnQgKSArCi1SRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVCArCi1SRVRVUk5TIGN1c3RvbV90eXBlICsKLUxBTkdVQUdFIGphdmEgKwotQVMgJCQgKwotVURUVmFsdWUgdWR0ID0gdWRmQ29udGV4dC5uZXdSZXR1cm5VRFRWYWx1ZSgpOyArCi11ZHQuc2V0U3RyaW5nKGBgdHh0JycsIGBgc29tZSBzdHJpbmcnJyk7ICsKLXVkdC5zZXRJbnQoYGBpJycsIDQyKTsgKwotcmV0dXJuIHVkdDsgKwotJCQ7Ci0KLVRoZSBkZWZpbml0aW9uIG9mIHRoZSBgVURGQ29udGV4dGAgaW50ZXJmYWNlIGNhbiBiZSBmb3VuZCBpbiB0aGUgQXBhY2hlCi1DYXNzYW5kcmEgc291cmNlIGNvZGUgZm9yCi1gb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuVURGQ29udGV4dGAuCi0KLWJjKHNhbXBsZSkuICsKLXB1YmxpYyBpbnRlcmZhY2UgVURGQ29udGV4dCArCi1ceyArCi1VRFRWYWx1ZSBuZXdBcmdVRFRWYWx1ZShTdHJpbmcgYXJnTmFtZSk7ICsKLVVEVFZhbHVlIG5ld0FyZ1VEVFZhbHVlKGludCBhcmdOdW0pOyArCi1VRFRWYWx1ZSBuZXdSZXR1cm5VRFRWYWx1ZSgpOyArCi1VRFRWYWx1ZSBuZXdVRFRWYWx1ZShTdHJpbmcgdWR0TmFtZSk7ICsKLVR1cGxlVmFsdWUgbmV3QXJnVHVwbGVWYWx1ZShTdHJpbmcgYXJnTmFtZSk7ICsKLVR1cGxlVmFsdWUgbmV3QXJnVHVwbGVWYWx1ZShpbnQgYXJnTnVtKTsgKwotVHVwbGVWYWx1ZSBuZXdSZXR1cm5UdXBsZVZhbHVlKCk7ICsKLVR1cGxlVmFsdWUgbmV3VHVwbGVWYWx1ZShTdHJpbmcgY3FsRGVmaW5pdGlvbik7ICsKLX0KLQotSmF2YSBVREZzIGFscmVhZHkgaGF2ZSBzb21lIGltcG9ydHMgZm9yIGNvbW1vbiBpbnRlcmZhY2VzIGFuZCBjbGFzc2VzCi1kZWZpbmVkLiBUaGVzZSBpbXBvcnRzIGFyZTogKwotUGxlYXNlIG5vdGUsIHRoYXQgdGhlc2UgY29udmVuaWVuY2UgaW1wb3J0cyBhcmUgbm90IGF2YWlsYWJsZSBmb3Igc2NyaXB0Ci1VREZzLgotCi1iYyhzYW1wbGUpLiArCi1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsgKwotaW1wb3J0IGphdmEudXRpbC5MaXN0OyArCi1pbXBvcnQgamF2YS51dGlsLk1hcDsgKwotaW1wb3J0IGphdmEudXRpbC5TZXQ7ICsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5VREZDb250ZXh0OyArCi1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlR5cGVDb2RlYzsgKwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5UdXBsZVZhbHVlOyArCi1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlVEVFZhbHVlOwotCi1TZWUgbGluazojY3JlYXRlRnVuY3Rpb25TdG10W2BDUkVBVEUgRlVOQ1RJT05gXSBhbmQKLWxpbms6I2Ryb3BGdW5jdGlvblN0bXRbYERST1AgRlVOQ1RJT05gXS4KLQotW1t1ZGFzXV0KLT09PSBVc2VyLURlZmluZWQgQWdncmVnYXRlcwotCi1Vc2VyLWRlZmluZWQgYWdncmVnYXRlcyBhbGxvdyBjcmVhdGlvbiBvZiBjdXN0b20gYWdncmVnYXRlIGZ1bmN0aW9ucwotdXNpbmcgbGluazojdWRmc1tVREZzXS4gQ29tbW9uIGV4YW1wbGVzIG9mIGFnZ3JlZ2F0ZSBmdW5jdGlvbnMgYXJlCi1fY291bnRfLCBfbWluXywgYW5kIF9tYXhfLgotCi1FYWNoIGFnZ3JlZ2F0ZSByZXF1aXJlcyBhbiBfaW5pdGlhbCBzdGF0ZV8gKGBJTklUQ09ORGAsIHdoaWNoIGRlZmF1bHRzCi10byBgbnVsbGApIG9mIHR5cGUgYFNUWVBFYC4gVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBzdGF0ZSBmdW5jdGlvbgotbXVzdCBoYXZlIHR5cGUgYFNUWVBFYC4gVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgb2YgdGhlIHN0YXRlIGZ1bmN0aW9uCi1tdXN0IG1hdGNoIHRoZSB0eXBlcyBvZiB0aGUgdXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSBhcmd1bWVudHMuIFRoZSBzdGF0ZQotZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggcm93LCBhbmQgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZQotc3RhdGUgZnVuY3Rpb24gYmVjb21lcyB0aGUgbmV3IHN0YXRlLiBBZnRlciBhbGwgcm93cyBhcmUgcHJvY2Vzc2VkLCB0aGUKLW9wdGlvbmFsIGBGSU5BTEZVTkNgIGlzIGV4ZWN1dGVkIHdpdGggbGFzdCBzdGF0ZSB2YWx1ZSBhcyBpdHMgYXJndW1lbnQuCi0KLWBTVFlQRWAgaXMgbWFuZGF0b3J5IGluIG9yZGVyIHRvIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2ggcG9zc2libHkKLW92ZXJsb2FkZWQgdmVyc2lvbnMgb2YgdGhlIHN0YXRlIGFuZC9vciBmaW5hbCBmdW5jdGlvbiAoc2luY2UgdGhlCi1vdmVybG9hZCBjYW4gYXBwZWFyIGFmdGVyIGNyZWF0aW9uIG9mIHRoZSBhZ2dyZWdhdGUpLgotCi1Vc2VyLWRlZmluZWQgYWdncmVnYXRlcyBjYW4gYmUgdXNlZCBpbiBsaW5rOiNzZWxlY3RTdG10W2BTRUxFQ1RgXQotc3RhdGVtZW50LgotCi1BIGNvbXBsZXRlIHdvcmtpbmcgZXhhbXBsZSBmb3IgdXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZXMgKGFzc3VtaW5nIHRoYXQgYQota2V5c3BhY2UgaGFzIGJlZW4gc2VsZWN0ZWQgdXNpbmcgdGhlIGxpbms6I3VzZVN0bXRbYFVTRWBdIHN0YXRlbWVudCk6Ci0KLWJjKHNhbXBsZSkuLiArCi1DUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBhdmVyYWdlU3RhdGUgKCBzdGF0ZSB0dXBsZTxpbnQsYmlnaW50PiwgdmFsCi1pbnQgKSArCi1DQUxMRUQgT04gTlVMTCBJTlBVVCArCi1SRVRVUk5TIHR1cGxlPGludCxiaWdpbnQ+ICsKLUxBTkdVQUdFIGphdmEgKwotQVMg4oCZICsKLWlmICh2YWwgIT0gbnVsbCkgXHsgKwotc3RhdGUuc2V0SW50KDAsIHN0YXRlLmdldEludCgwKSsxKTsgKwotc3RhdGUuc2V0TG9uZygxLCBzdGF0ZS5nZXRMb25nKDEpK3ZhbC5pbnRWYWx1ZSgpKTsgKwotfSArCi1yZXR1cm4gc3RhdGU7ICsKLeKAmTsKLQotQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gYXZlcmFnZUZpbmFsICggc3RhdGUgdHVwbGU8aW50LGJpZ2ludD4gKSArCi1DQUxMRUQgT04gTlVMTCBJTlBVVCArCi1SRVRVUk5TIGRvdWJsZSArCi1MQU5HVUFHRSBqYXZhICsKLUFTIOKAmSArCi1kb3VibGUgciA9IDA7ICsKLWlmIChzdGF0ZS5nZXRJbnQoMCkgPT0gMCkgcmV0dXJuIG51bGw7ICsKLXIgPSBzdGF0ZS5nZXRMb25nKDEpOyArCi1yIC89IHN0YXRlLmdldEludCgwKTsgKwotcmV0dXJuIERvdWJsZS52YWx1ZU9mwq47ICsKLeKAmTsKLQotQ1JFQVRFIE9SIFJFUExBQ0UgQUdHUkVHQVRFIGF2ZXJhZ2UgKCBpbnQgKSArCi1TRlVOQyBhdmVyYWdlU3RhdGUgKwotU1RZUEUgdHVwbGU8aW50LGJpZ2ludD4gKwotRklOQUxGVU5DIGF2ZXJhZ2VGaW5hbCArCi1JTklUQ09ORCAoMCwgMCk7Ci0KLUNSRUFURSBUQUJMRSBhdGFibGUgKCArCi1wayBpbnQgUFJJTUFSWSBLRVksICsKLXZhbCBpbnQpOyArCi1JTlNFUlQgSU5UTyBhdGFibGUgKHBrLCB2YWwpIFZBTFVFUyAoMSwxKTsgKwotSU5TRVJUIElOVE8gYXRhYmxlIChwaywgdmFsKSBWQUxVRVMgKDIsMik7ICsKLUlOU0VSVCBJTlRPIGF0YWJsZSAocGssIHZhbCkgVkFMVUVTICgzLDMpOyArCi1JTlNFUlQgSU5UTyBhdGFibGUgKHBrLCB2YWwpIFZBTFVFUyAoNCw0KTsgKwotU0VMRUNUIGF2ZXJhZ2UodmFsKSBGUk9NIGF0YWJsZTsgKwotcC4KLQotU2VlIGxpbms6I2NyZWF0ZUFnZ3JlZ2F0ZVN0bXRbYENSRUFURSBBR0dSRUdBVEVgXSBhbmQKLWxpbms6I2Ryb3BBZ2dyZWdhdGVTdG10W2BEUk9QIEFHR1JFR0FURWBdLgotCi1bW2pzb25dXQotPT09IEpTT04gU3VwcG9ydAotCi1DYXNzYW5kcmEgMi4yIGludHJvZHVjZXMgSlNPTiBzdXBwb3J0IHRvIGxpbms6I3NlbGVjdFN0bXRbYFNFTEVDVGBdIGFuZAotbGluazojaW5zZXJ0U3RtdFtgSU5TRVJUYF0gc3RhdGVtZW50cy4gVGhpcyBzdXBwb3J0IGRvZXMgbm90Ci1mdW5kYW1lbnRhbGx5IGFsdGVyIHRoZSBDUUwgQVBJIChmb3IgZXhhbXBsZSwgdGhlIHNjaGVtYSBpcyBzdGlsbAotZW5mb3JjZWQpLCBpdCBzaW1wbHkgcHJvdmlkZXMgYSBjb252ZW5pZW50IHdheSB0byB3b3JrIHdpdGggSlNPTgotZG9jdW1lbnRzLgotCi1bW3NlbGVjdEpzb25dXQotPT09PSBTRUxFQ1QgSlNPTgotCi1XaXRoIGBTRUxFQ1RgIHN0YXRlbWVudHMsIHRoZSBuZXcgYEpTT05gIGtleXdvcmQgY2FuIGJlIHVzZWQgdG8gcmV0dXJuCi1lYWNoIHJvdyBhcyBhIHNpbmdsZSBgSlNPTmAgZW5jb2RlZCBtYXAuIFRoZSByZW1haW5kZXIgb2YgdGhlIGBTRUxFQ1RgCi1zdGF0bWVudCBiZWhhdmlvciBpcyB0aGUgc2FtZS4KLQotVGhlIHJlc3VsdCBtYXAga2V5cyBhcmUgdGhlIHNhbWUgYXMgdGhlIGNvbHVtbiBuYW1lcyBpbiBhIG5vcm1hbCByZXN1bHQKLXNldC4gRm9yIGV4YW1wbGUsIGEgc3RhdGVtZW50IGxpa2UgYGBgU0VMRUNUIEpTT04gYSwgdHRsKGIpIEZST00gLi4uYCcnCi13b3VsZCByZXN1bHQgaW4gYSBtYXAgd2l0aCBrZXlzIGAiYSJgIGFuZCBgInR0bChiKSJgLiBIb3dldmVyLCB0aGlzIGlzCi1vbmUgbm90YWJsZSBleGNlcHRpb246IGZvciBzeW1tZXRyeSB3aXRoIGBJTlNFUlQgSlNPTmAgYmVoYXZpb3IsCi1jYXNlLXNlbnNpdGl2ZSBjb2x1bW4gbmFtZXMgd2l0aCB1cHBlci1jYXNlIGxldHRlcnMgd2lsbCBiZSBzdXJyb3VuZGVkCi13aXRoIGRvdWJsZSBxdW90ZXMuIEZvciBleGFtcGxlLCBgYGBTRUxFQ1QgSlNPTiBteUNvbHVtbiBGUk9NIC4uLmAnJwotd291bGQgcmVzdWx0IGluIGEgbWFwIGtleSBgIlwibXlDb2x1bW5cIiJgIChub3RlIHRoZSBlc2NhcGVkIHF1b3RlcykuCi0KLVRoZSBtYXAgdmFsdWVzIHdpbGwgYEpTT05gLWVuY29kZWQgcmVwcmVzZW50YXRpb25zIChhcyBkZXNjcmliZWQgYmVsb3cpCi1vZiB0aGUgcmVzdWx0IHNldCB2YWx1ZXMuCi0KLVtbaW5zZXJ0SnNvbl1dCi09PT09IElOU0VSVCBKU09OCi0KLVdpdGggYElOU0VSVGAgc3RhdGVtZW50cywgdGhlIG5ldyBgSlNPTmAga2V5d29yZCBjYW4gYmUgdXNlZCB0byBlbmFibGUKLWluc2VydGluZyBhIGBKU09OYCBlbmNvZGVkIG1hcCBhcyBhIHNpbmdsZSByb3cuIFRoZSBmb3JtYXQgb2YgdGhlIGBKU09OYAotbWFwIHNob3VsZCBnZW5lcmFsbHkgbWF0Y2ggdGhhdCByZXR1cm5lZCBieSBhIGBTRUxFQ1QgSlNPTmAgc3RhdGVtZW50IG9uCi10aGUgc2FtZSB0YWJsZS4gSW4gcGFydGljdWxhciwgY2FzZS1zZW5zaXRpdmUgY29sdW1uIG5hbWVzIHNob3VsZCBiZQotc3Vycm91bmRlZCB3aXRoIGRvdWJsZSBxdW90ZXMuIEZvciBleGFtcGxlLCB0byBpbnNlcnQgaW50byBhIHRhYmxlIHdpdGgKLXR3byBjb2x1bW5zIG5hbWVkIGBgbXlLZXknJyBhbmQgYGB2YWx1ZScnLCB5b3Ugd291bGQgZG8gdGhlIGZvbGxvd2luZzoKLQotYmMoc2FtcGxlKS4gKwotSU5TRVJUIElOVE8gbXl0YWJsZSBKU09OIGBce2BgXCcnbXlLZXlcYGAnJzogMCwgYGB2YWx1ZScnOiAwfScKLQotQW55IGNvbHVtbnMgd2hpY2ggYXJlIG9tbWl0dGVkIGZyb20gdGhlIGBKU09OYCBtYXAgd2lsbCBiZSBkZWZhdWx0ZWQgdG8KLWEgYE5VTExgIHZhbHVlICh3aGljaCB3aWxsIHJlc3VsdCBpbiBhIHRvbWJzdG9uZSBiZWluZyBjcmVhdGVkKS4KLQotW1tqc29uRW5jb2RpbmddXQotPT09PSBKU09OIEVuY29kaW5nIG9mIENhc3NhbmRyYSBEYXRhIFR5cGVzCi0KLVdoZXJlIHBvc3NpYmxlLCBDYXNzYW5kcmEgd2lsbCByZXByZXNlbnQgYW5kIGFjY2VwdCBkYXRhIHR5cGVzIGluIHRoZWlyCi1uYXRpdmUgYEpTT05gIHJlcHJlc2VudGF0aW9uLiBDYXNzYW5kcmEgd2lsbCBhbHNvIGFjY2VwdCBzdHJpbmcKLXJlcHJlc2VudGF0aW9ucyBtYXRjaGluZyB0aGUgQ1FMIGxpdGVyYWwgZm9ybWF0IGZvciBhbGwgc2luZ2xlLWZpZWxkCi10eXBlcy4gRm9yIGV4YW1wbGUsIGZsb2F0cywgaW50cywgVVVJRHMsIGFuZCBkYXRlcyBjYW4gYmUgcmVwcmVzZW50ZWQgYnkKLUNRTCBsaXRlcmFsIHN0cmluZ3MuIEhvd2V2ZXIsIGNvbXBvdW5kIHR5cGVzLCBzdWNoIGFzIGNvbGxlY3Rpb25zLAotdHVwbGVzLCBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIG11c3QgYmUgcmVwcmVzZW50ZWQgYnkgbmF0aXZlIGBKU09OYAotY29sbGVjdGlvbnMgKG1hcHMgYW5kIGxpc3RzKSBvciBhIEpTT04tZW5jb2RlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YKLXRoZSBjb2xsZWN0aW9uLgotCi1UaGUgZm9sbG93aW5nIHRhYmxlIGRlc2NyaWJlcyB0aGUgZW5jb2RpbmdzIHRoYXQgQ2Fzc2FuZHJhIHdpbGwgYWNjZXB0Ci1pbiBgSU5TRVJUIEpTT05gIHZhbHVlcyAoYW5kIGBmcm9tSnNvbigpYCBhcmd1bWVudHMpIGFzIHdlbGwgYXMgdGhlCi1mb3JtYXQgQ2Fzc2FuZHJhIHdpbGwgdXNlIHdoZW4gcmV0dXJuaW5nIGRhdGEgZm9yIGBTRUxFQ1QgSlNPTmAKLXN0YXRlbWVudHMgKGFuZCBgZnJvbUpzb24oKWApOgotCi1bY29scz0iLCwsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXx0eXBlIHxmb3JtYXRzIGFjY2VwdGVkIHxyZXR1cm4gZm9ybWF0IHxub3RlcwotfGBhc2NpaWAgfHN0cmluZyB8c3RyaW5nIHxVc2VzIEpTT07igJlzIGBcdWAgY2hhcmFjdGVyIGVzY2FwZQotCi18YGJpZ2ludGAgfGludGVnZXIsIHN0cmluZyB8aW50ZWdlciB8U3RyaW5nIG11c3QgYmUgdmFsaWQgNjQgYml0IGludGVnZXIKLQotfGBibG9iYCB8c3RyaW5nIHxzdHJpbmcgfFN0cmluZyBzaG91bGQgYmUgMHggZm9sbG93ZWQgYnkgYW4gZXZlbiBudW1iZXIKLW9mIGhleCBkaWdpdHMKLQotfGBib29sZWFuYCB8Ym9vbGVhbiwgc3RyaW5nIHxib29sZWFuIHxTdHJpbmcgbXVzdCBiZSBgYHRydWUnJyBvcgotYGBmYWxzZScnCi0KLXxgZGF0ZWAgfHN0cmluZyB8c3RyaW5nIHxEYXRlIGluIGZvcm1hdCBgWVlZWS1NTS1ERGAsIHRpbWV6b25lIFVUQwotCi18YGRlY2ltYWxgIHxpbnRlZ2VyLCBmbG9hdCwgc3RyaW5nIHxmbG9hdCB8TWF5IGV4Y2VlZCAzMiBvciA2NC1iaXQKLUlFRUUtNzU0IGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbiBpbiBjbGllbnQtc2lkZSBkZWNvZGVyCi0KLXxgZG91YmxlYCB8aW50ZWdlciwgZmxvYXQsIHN0cmluZyB8ZmxvYXQgfFN0cmluZyBtdXN0IGJlIHZhbGlkIGludGVnZXIKLW9yIGZsb2F0Ci0KLXxgZmxvYXRgIHxpbnRlZ2VyLCBmbG9hdCwgc3RyaW5nIHxmbG9hdCB8U3RyaW5nIG11c3QgYmUgdmFsaWQgaW50ZWdlciBvcgotZmxvYXQKLQotfGBpbmV0YCB8c3RyaW5nIHxzdHJpbmcgfElQdjQgb3IgSVB2NiBhZGRyZXNzCi0KLXxgaW50YCB8aW50ZWdlciwgc3RyaW5nIHxpbnRlZ2VyIHxTdHJpbmcgbXVzdCBiZSB2YWxpZCAzMiBiaXQgaW50ZWdlcgotCi18YGxpc3RgIHxsaXN0LCBzdHJpbmcgfGxpc3QgfFVzZXMgSlNPTuKAmXMgbmF0aXZlIGxpc3QgcmVwcmVzZW50YXRpb24KLQotfGBtYXBgIHxtYXAsIHN0cmluZyB8bWFwIHxVc2VzIEpTT07igJlzIG5hdGl2ZSBtYXAgcmVwcmVzZW50YXRpb24KLQotfGBzbWFsbGludGAgfGludGVnZXIsIHN0cmluZyB8aW50ZWdlciB8U3RyaW5nIG11c3QgYmUgdmFsaWQgMTYgYml0Ci1pbnRlZ2VyCi0KLXxgc2V0YCB8bGlzdCwgc3RyaW5nIHxsaXN0IHxVc2VzIEpTT07igJlzIG5hdGl2ZSBsaXN0IHJlcHJlc2VudGF0aW9uCi0KLXxgdGV4dGAgfHN0cmluZyB8c3RyaW5nIHxVc2VzIEpTT07igJlzIGBcdWAgY2hhcmFjdGVyIGVzY2FwZQotCi18YHRpbWVgIHxzdHJpbmcgfHN0cmluZyB8VGltZSBvZiBkYXkgaW4gZm9ybWF0IGBISC1NTS1TU1suZmZmZmZmZmZmXWAKLQotfGB0aW1lc3RhbXBgIHxpbnRlZ2VyLCBzdHJpbmcgfHN0cmluZyB8QSB0aW1lc3RhbXAuIFN0cmluZ3MgY29uc3RhbnQgYXJlCi1hbGxvdyB0byBpbnB1dCB0aW1lc3RhbXBzIGFzIGRhdGVzLCBzZWUgbGluazojdXNpbmdkYXRlc1tXb3JraW5nIHdpdGgKLWRhdGVzXSBiZWxvdyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gRGF0ZXN0YW1wcyB3aXRoIGZvcm1hdAotYFlZWVktTU0tREQgSEg6TU06U1MuU1NTYCBhcmUgcmV0dXJuZWQuCi0KLXxgdGltZXV1aWRgIHxzdHJpbmcgfHN0cmluZyB8VHlwZSAxIFVVSUQuIFNlZSBsaW5rOiNjb25zdGFudHNbQ29uc3RhbnRzXQotZm9yIHRoZSBVVUlEIGZvcm1hdAotCi18YHRpbnlpbnRgIHxpbnRlZ2VyLCBzdHJpbmcgfGludGVnZXIgfFN0cmluZyBtdXN0IGJlIHZhbGlkIDggYml0IGludGVnZXIKLQotfGB0dXBsZWAgfGxpc3QsIHN0cmluZyB8bGlzdCB8VXNlcyBKU09O4oCZcyBuYXRpdmUgbGlzdCByZXByZXNlbnRhdGlvbgotCi18YFVEVGAgfG1hcCwgc3RyaW5nIHxtYXAgfFVzZXMgSlNPTuKAmXMgbmF0aXZlIG1hcCByZXByZXNlbnRhdGlvbiB3aXRoCi1maWVsZCBuYW1lcyBhcyBrZXlzCi0KLXxgdXVpZGAgfHN0cmluZyB8c3RyaW5nIHxTZWUgbGluazojY29uc3RhbnRzW0NvbnN0YW50c10gZm9yIHRoZSBVVUlECi1mb3JtYXQKLQotfGB2YXJjaGFyYCB8c3RyaW5nIHxzdHJpbmcgfFVzZXMgSlNPTuKAmXMgYFx1YCBjaGFyYWN0ZXIgZXNjYXBlCi0KLXxgdmFyaW50YCB8aW50ZWdlciwgc3RyaW5nIHxpbnRlZ2VyIHxWYXJpYWJsZSBsZW5ndGg7IG1heSBvdmVyZmxvdyAzMiBvcgotNjQgYml0IGludGVnZXJzIGluIGNsaWVudC1zaWRlIGRlY29kZXIKLXw9PT0KLQotW1tmcm9tSnNvbl1dCi09PT09IFRoZSBmcm9tSnNvbigpIEZ1bmN0aW9uCi0KLVRoZSBgZnJvbUpzb24oKWAgZnVuY3Rpb24gbWF5IGJlIHVzZWQgc2ltaWxhcmx5IHRvIGBJTlNFUlQgSlNPTmAsIGJ1dAotZm9yIGEgc2luZ2xlIGNvbHVtbiB2YWx1ZS4gSXQgbWF5IG9ubHkgYmUgdXNlZCBpbiB0aGUgYFZBTFVFU2AgY2xhdXNlIG9mCi1hbiBgSU5TRVJUYCBzdGF0ZW1lbnQgb3IgYXMgb25lIG9mIHRoZSBjb2x1bW4gdmFsdWVzIGluIGFuIGBVUERBVEVgLAotYERFTEVURWAsIG9yIGBTRUxFQ1RgIHN0YXRlbWVudC4gRm9yIGV4YW1wbGUsIGl0IGNhbm5vdCBiZSB1c2VkIGluIHRoZQotc2VsZWN0aW9uIGNsYXVzZSBvZiBhIGBTRUxFQ1RgIHN0YXRlbWVudC4KLQotW1t0b0pzb25dXQotPT09PSBUaGUgdG9Kc29uKCkgRnVuY3Rpb24KLQotVGhlIGB0b0pzb24oKWAgZnVuY3Rpb24gbWF5IGJlIHVzZWQgc2ltaWxhcmx5IHRvIGBTRUxFQ1QgSlNPTmAsIGJ1dCBmb3IKLWEgc2luZ2xlIGNvbHVtbiB2YWx1ZS4gSXQgbWF5IG9ubHkgYmUgdXNlZCBpbiB0aGUgc2VsZWN0aW9uIGNsYXVzZSBvZiBhCi1gU0VMRUNUYCBzdGF0ZW1lbnQuCi0KLVtbYXBwZW5kaXhBXV0KLT09PSBBcHBlbmRpeCBBOiBDUUwgS2V5d29yZHMKLQotQ1FMIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBfcmVzZXJ2ZWRfIGFuZCBfbm9uLXJlc2VydmVkXyBrZXl3b3Jkcy4KLVJlc2VydmVkIGtleXdvcmRzIGNhbm5vdCBiZSB1c2VkIGFzIGlkZW50aWZpZXIsIHRoZXkgYXJlIHRydWx5IHJlc2VydmVkCi1mb3IgdGhlIGxhbmd1YWdlIChidXQgb25lIGNhbiBlbmNsb3NlIGEgcmVzZXJ2ZWQga2V5d29yZCBieQotZG91YmxlLXF1b3RlcyB0byB1c2UgaXQgYXMgYW4gaWRlbnRpZmllcikuIE5vbi1yZXNlcnZlZCBrZXl3b3JkcyBob3dldmVyCi1vbmx5IGhhdmUgYSBzcGVjaWZpYyBtZWFuaW5nIGluIGNlcnRhaW4gY29udGV4dCBidXQgY2FuIHVzZWQgYXMKLWlkZW50aWZlciBvdGhlcndpc2UuIFRoZSBvbmx5IF9yYWlzb24gZOKAmcOqdHJlXyBvZiB0aGVzZSBub24tcmVzZXJ2ZWQKLWtleXdvcmRzIGlzIGNvbnZlbmllbmNlOiBzb21lIGtleXdvcmQgYXJlIG5vbi1yZXNlcnZlZCB3aGVuIGl0IHdhcwotYWx3YXlzIGVhc3kgZm9yIHRoZSBwYXJzZXIgdG8gZGVjaWRlIHdoZXRoZXIgdGhleSB3ZXJlIHVzZWQgYXMga2V5d29yZHMKLW9yIG5vdC4KLQotW2NvbHM9IiwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfEtleXdvcmQgfFJlc2VydmVkPwotfGBBRERgIHx5ZXMKLXxgQUdHUkVHQVRFYCB8bm8KLXxgQUxMYCB8bm8KLXxgQUxMT1dgIHx5ZXMKLXxgQUxURVJgIHx5ZXMKLXxgQU5EYCB8eWVzCi18YEFQUExZYCB8eWVzCi18YEFTYCB8bm8KLXxgQVNDYCB8eWVzCi18YEFTQ0lJYCB8bm8KLXxgQVVUSE9SSVpFYCB8eWVzCi18YEJBVENIYCB8eWVzCi18YEJFR0lOYCB8eWVzCi18YEJJR0lOVGAgfG5vCi18YEJMT0JgIHxubwotfGBCT09MRUFOYCB8bm8KLXxgQllgIHx5ZXMKLXxgQ0FMTEVEYCB8bm8KLXxgQ0FTVGAgfG5vCi18YENMVVNURVJJTkdgIHxubwotfGBDT0xVTU5GQU1JTFlgIHx5ZXMKLXxgQ09NUEFDVGAgfG5vCi18YENPTlRBSU5TYCB8bm8KLXxgQ09VTlRgIHxubwotfGBDT1VOVEVSYCB8bm8KLXxgQ1JFQVRFYCB8eWVzCi18YENVU1RPTWAgfG5vCi18YERBVEVgIHxubwotfGBERUNJTUFMYCB8bm8KLXxgREVGQVVMVGAgfHllcwotfGBERUxFVEVgIHx5ZXMKLXxgREVTQ2AgfHllcwotfGBERVNDUklCRWAgfHllcwotfGBESVNUSU5DVGAgfG5vCi18YERPVUJMRWAgfG5vCi18YERST1BgIHx5ZXMKLXxgRFVSQVRJT05gIHxubwotfGBFTlRSSUVTYCB8eWVzCi18YEVYRUNVVEVgIHx5ZXMKLXxgRVhJU1RTYCB8bm8KLXxgRklMVEVSSU5HYCB8bm8KLXxgRklOQUxGVU5DYCB8bm8KLXxgRkxPQVRgIHxubwotfGBGUk9NYCB8eWVzCi18YEZST1pFTmAgfG5vCi18YEZVTExgIHx5ZXMKLXxgRlVOQ1RJT05gIHxubwotfGBGVU5DVElPTlNgIHxubwotfGBHUkFOVGAgfHllcwotfGBHUk9VUGAgfG5vCi18YElGYCB8eWVzCi18YElOYCB8eWVzCi18YElOREVYYCB8eWVzCi18YElORVRgIHxubwotfGBJTkZJTklUWWAgfHllcwotfGBJTklUQ09ORGAgfG5vCi18YElOUFVUYCB8bm8KLXxgSU5TRVJUYCB8eWVzCi18YElOVGAgfG5vCi18YElOVE9gIHx5ZXMKLXxgSVNgIHx5ZXMKLXxgSlNPTmAgfG5vCi18YEtFWWAgfG5vCi18YEtFWVNgIHxubwotfGBLRVlTUEFDRWAgfHllcwotfGBLRVlTUEFDRVNgIHxubwotfGBMQU5HVUFHRWAgfG5vCi18YExJS0VgIHxubwotfGBMSU1JVGAgfHllcwotfGBMSVNUYCB8bm8KLXxgTE9HSU5gIHxubwotfGBNQVBgIHxubwotfGBNQVRFUklBTElaRURgIHx5ZXMKLXxgTUJFQU5gIHx5ZXMKLXxgTUJFQU5TYCB8eWVzCi18YE1PRElGWWAgfHllcwotfGBOQU5gIHx5ZXMKLXxgTk9MT0dJTmAgfG5vCi18YE5PUkVDVVJTSVZFYCB8eWVzCi18YE5PU1VQRVJVU0VSYCB8bm8KLXxgTk9UYCB8eWVzCi18YE5VTExgIHx5ZXMKLXxgT0ZgIHx5ZXMKLXxgT05gIHx5ZXMKLXxgT1BUSU9OU2AgfG5vCi18YE9SYCB8eWVzCi18YE9SREVSYCB8eWVzCi18YFBBUlRJVElPTmAgfG5vCi18YFBBU1NXT1JEYCB8bm8KLXxgUEVSYCB8bm8KLXxgUEVSTUlTU0lPTmAgfG5vCi18YFBFUk1JU1NJT05TYCB8bm8KLXxgUFJJTUFSWWAgfHllcwotfGBSRU5BTUVgIHx5ZXMKLXxgUkVQTEFDRWAgfHllcwotfGBSRVRVUk5TYCB8bm8KLXxgUkVWT0tFYCB8eWVzCi18YFJPTEVgIHxubwotfGBST0xFU2AgfG5vCi18YFNDSEVNQWAgfHllcwotfGBTRUxFQ1RgIHx5ZXMKLXxgU0VUYCB8eWVzCi18YFNGVU5DYCB8bm8KLXxgU01BTExJTlRgIHxubwotfGBTVEFUSUNgIHxubwotfGBTVE9SQUdFYCB8bm8KLXxgU1RZUEVgIHxubwotfGBTVVBFUlVTRVJgIHxubwotfGBUQUJMRWAgfHllcwotfGBURVhUYCB8bm8KLXxgVElNRWAgfG5vCi18YFRJTUVTVEFNUGAgfG5vCi18YFRJTUVVVUlEYCB8bm8KLXxgVElOWUlOVGAgfG5vCi18YFRPYCB8eWVzCi18YFRPS0VOYCB8eWVzCi18YFRSSUdHRVJgIHxubwotfGBUUlVOQ0FURWAgfHllcwotfGBUVExgIHxubwotfGBUVVBMRWAgfG5vCi18YFRZUEVgIHxubwotfGBVTkxPR0dFRGAgfHllcwotfGBVTlNFVGAgfHllcwotfGBVUERBVEVgIHx5ZXMKLXxgVVNFYCB8eWVzCi18YFVTRVJgIHxubwotfGBVU0VSU2AgfG5vCi18YFVTSU5HYCB8eWVzCi18YFVVSURgIHxubwotfGBWQUxVRVNgIHxubwotfGBWQVJDSEFSYCB8bm8KLXxgVkFSSU5UYCB8bm8KLXxgVklFV2AgfHllcwotfGBXSEVSRWAgfHllcwotfGBXSVRIYCB8eWVzCi18YFdSSVRFVElNRWAgfG5vCi18PT09Ci0KLVtbYXBwZW5kaXhCXV0KLT09PSBBcHBlbmRpeCBCOiBDUUwgUmVzZXJ2ZWQgVHlwZXMKLQotVGhlIGZvbGxvd2luZyB0eXBlIG5hbWVzIGFyZSBub3QgY3VycmVudGx5IHVzZWQgYnkgQ1FMLCBidXQgYXJlIHJlc2VydmVkCi1mb3IgcG90ZW50aWFsIGZ1dHVyZSB1c2UuIFVzZXItZGVmaW5lZCB0eXBlcyBtYXkgbm90IHVzZSByZXNlcnZlZCB0eXBlCi1uYW1lcyBhcyB0aGVpciBuYW1lLgotCi1bY29scz0iIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXx0eXBlCi18YGJpdHN0cmluZ2AKLXxgYnl0ZWAKLXxgY29tcGxleGAKLXxgZGF0ZWAKLXxgZW51bWAKLXxgaW50ZXJ2YWxgCi18YG1hY2FkZHJgCi18PT09Ci0KLT09PSBDaGFuZ2VzCi0KLVRoZSBmb2xsb3dpbmcgZGVzY3JpYmVzIHRoZSBjaGFuZ2VzIGluIGVhY2ggdmVyc2lvbiBvZiBDUUwuCi0KLT09PT0gMy40LjMKLQotKiBTdXBwb3J0IGZvciBgR1JPVVAgQllgLiBTZWUgbGluazojc2VsZWN0R3JvdXBCeVtgPGdyb3VwLWJ5PmBdIChzZWUKLWh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTEwNzA3KVtDQVNTQU5EUkEtMTA3MDddLgotCi09PT09IDMuNC4yCi0KLSogU3VwcG9ydCBmb3Igc2VsZWN0aW5nIGVsZW1lbnRzIGFuZCBzbGljZXMgb2YgYSBjb2xsZWN0aW9uCi0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtNzM5NilbQ0FTU0FORFJBLTczOTZdLgotCi09PT09IDMuNC4yCi0KLSogbGluazojdXBkYXRlT3B0aW9uc1tgSU5TRVJUL1VQREFURSBvcHRpb25zYF0gZm9yIHRhYmxlcyBoYXZpbmcgYQotZGVmYXVsdF90aW1lX3RvX2xpdmUgc3BlY2lmeWluZyBhIFRUTCBvZiAwIHdpbGwgcmVtb3ZlIHRoZSBUVEwgZnJvbSB0aGUKLWluc2VydGVkIG9yIHVwZGF0ZWQgdmFsdWVzCi0qIGxpbms6I2FsdGVyVGFibGVTdG10W2BBTFRFUiBUQUJMRWBdIGBBRERgIGFuZCBgRFJPUGAgbm93IGFsbG93IG11dGlwbGUKLWNvbHVtbnMgdG8gYmUgYWRkZWQvcmVtb3ZlZAotKiBOZXcgbGluazojc2VsZWN0TGltaXRbYFBFUiBQQVJUSVRJT04gTElNSVRgXSBvcHRpb24gKHNlZQotaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtNzAxNylbQ0FTU0FORFJBLTcwMTddLgotKiBsaW5rOiN1ZGZzW1VzZXItZGVmaW5lZCBmdW5jdGlvbnNdIGNhbiBub3cgaW5zdGFudGlhdGUgYFVEVFZhbHVlYCBhbmQKLWBUdXBsZVZhbHVlYCBpbnN0YW5jZXMgdmlhIHRoZSBuZXcgYFVERkNvbnRleHRgIGludGVyZmFjZSAoc2VlCi1odHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS0xMDgxOClbQ0FTU0FORFJBLTEwODE4XS4KLSogYGBVc2VyLWRlZmluZWQgdHlwZXMnJyNjcmVhdGVUeXBlU3RtdCBtYXkgbm93IGJlIHN0b3JlZCBpbiBhCi1ub24tZnJvemVuIGZvcm0sIGFsbG93aW5nIGluZGl2aWR1YWwgZmllbGRzIHRvIGJlIHVwZGF0ZWQgYW5kIGRlbGV0ZWQgaW4KLWxpbms6I3VwZGF0ZVN0bXRbYFVQREFURWAgc3RhdGVtZW50c10gYW5kIGxpbms6I2RlbGV0ZVN0bXRbYERFTEVURWAKLXN0YXRlbWVudHNdLCByZXNwZWN0aXZlbHkuCi0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtNzQyMylbQ0FTU0FORFJBLTc0MjNdCi0KLT09PT0gMy40LjEKLQotKiBBZGRzIGBDQVNUYCBmdW5jdGlvbnMuIFNlZSBsaW5rOiNjYXN0RnVuW2BDYXN0YF0uCi0KLT09PT0gMy40LjAKLQotKiBTdXBwb3J0IGZvciBsaW5rOiNjcmVhdGVNVlN0bXRbbWF0ZXJpYWxpemVkIHZpZXdzXQotKiBsaW5rOiNkZWxldGVTdG10W2BERUxFVEVgXSBzdXBwb3J0IGZvciBpbmVxdWFsaXR5IGV4cHJlc3Npb25zIGFuZCBgSU5gCi1yZXN0cmljdGlvbnMgb24gYW55IHByaW1hcnkga2V5IGNvbHVtbnMKLSogbGluazojdXBkYXRlU3RtdFtgVVBEQVRFYF0gc3VwcG9ydCBmb3IgYElOYCByZXN0cmljdGlvbnMgb24gYW55Ci1wcmltYXJ5IGtleSBjb2x1bW5zCi0KLT09PT0gMy4zLjEKLQotKiBUaGUgc3ludGF4IGBUUlVOQ0FURSBUQUJMRSBYYCBpcyBub3cgYWNjZXB0ZWQgYXMgYW4gYWxpYXMgZm9yCi1gVFJVTkNBVEUgWGAKLQotPT09PSAzLjMuMAotCi0qIEFkZHMgbmV3IGxpbms6I2FnZ3JlZ2F0ZXNbYWdncmVnYXRlc10KLSogVXNlci1kZWZpbmVkIGZ1bmN0aW9ucyBhcmUgbm93IHN1cHBvcnRlZCB0aHJvdWdoCi1saW5rOiNjcmVhdGVGdW5jdGlvblN0bXRbYENSRUFURSBGVU5DVElPTmBdIGFuZAotbGluazojZHJvcEZ1bmN0aW9uU3RtdFtgRFJPUCBGVU5DVElPTmBdLgotKiBVc2VyLWRlZmluZWQgYWdncmVnYXRlcyBhcmUgbm93IHN1cHBvcnRlZCB0aHJvdWdoCi1saW5rOiNjcmVhdGVBZ2dyZWdhdGVTdG10W2BDUkVBVEUgQUdHUkVHQVRFYF0gYW5kCi1saW5rOiNkcm9wQWdncmVnYXRlU3RtdFtgRFJPUCBBR0dSRUdBVEVgXS4KLSogQWxsb3dzIGRvdWJsZS1kb2xsYXIgZW5jbG9zZWQgc3RyaW5ncyBsaXRlcmFscyBhcyBhbiBhbHRlcm5hdGl2ZSB0bwotc2luZ2xlLXF1b3RlIGVuY2xvc2VkIHN0cmluZ3MuCi0qIEludHJvZHVjZXMgUm9sZXMgdG8gc3VwZXJjZWRlIHVzZXIgYmFzZWQgYXV0aGVudGljYXRpb24gYW5kIGFjY2VzcwotY29udHJvbAotKiBsaW5rOiN1c2luZ2RhdGVzW2BEYXRlYF0gYW5kIGxpbms6dXNpbmd0aW1lW2BUaW1lYF0gZGF0YSB0eXBlcyBoYXZlCi1iZWVuIGFkZGVkCi0qIGxpbms6I2pzb25bYEpTT05gXSBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkCi0qIGBUaW55aW50YCBhbmQgYFNtYWxsaW50YCBkYXRhIHR5cGVzIGhhdmUgYmVlbiBhZGRlZAotKiBBZGRzIG5ldyB0aW1lIGNvbnZlcnNpb24gZnVuY3Rpb25zIGFuZCBkZXByZWNhdGUgYGRhdGVPZmAgYW5kCi1gdW5peFRpbWVzdGFtcE9mYC4gU2VlIGxpbms6I3RpbWVGdW5bYFRpbWUgY29udmVyc2lvbiBmdW5jdGlvbnNgXQotCi09PT09IDMuMi4wCi0KLSogVXNlci1kZWZpbmVkIHR5cGVzIGFyZSBub3cgc3VwcG9ydGVkIHRocm91Z2gKLWxpbms6I2NyZWF0ZVR5cGVTdG10W2BDUkVBVEUgVFlQRWBdLCBsaW5rOiNhbHRlclR5cGVTdG10W2BBTFRFUiBUWVBFYF0sCi1hbmQgbGluazojZHJvcFR5cGVTdG10W2BEUk9QIFRZUEVgXQotKiBsaW5rOiNjcmVhdGVJbmRleFN0bXRbYENSRUFURSBJTkRFWGBdIG5vdyBzdXBwb3J0cyBpbmRleGluZyBjb2xsZWN0aW9uCi1jb2x1bW5zLCBpbmNsdWRpbmcgaW5kZXhpbmcgdGhlIGtleXMgb2YgbWFwIGNvbGxlY3Rpb25zIHRocm91Z2ggdGhlCi1ga2V5cygpYCBmdW5jdGlvbgotKiBJbmRleGVzIG9uIGNvbGxlY3Rpb25zIG1heSBiZSBxdWVyaWVkIHVzaW5nIHRoZSBuZXcgYENPTlRBSU5TYCBhbmQKLWBDT05UQUlOUyBLRVlgIG9wZXJhdG9ycwotKiBUdXBsZSB0eXBlcyB3ZXJlIGFkZGVkIHRvIGhvbGQgZml4ZWQtbGVuZ3RoIHNldHMgb2YgdHlwZWQgcG9zaXRpb25hbAotZmllbGRzIChzZWUgdGhlIHNlY3Rpb24gb24gbGluazojdHlwZXNbdHlwZXNdICkKLSogbGluazojZHJvcEluZGV4U3RtdFtgRFJPUCBJTkRFWGBdIG5vdyBzdXBwb3J0cyBvcHRpb25hbGx5IHNwZWNpZnlpbmcgYQota2V5c3BhY2UKLQotPT09PSAzLjEuNwotCi0qIGBTRUxFQ1RgIHN0YXRlbWVudHMgbm93IHN1cHBvcnQgc2VsZWN0aW5nIG11bHRpcGxlIHJvd3MgaW4gYSBzaW5nbGUKLXBhcnRpdGlvbiB1c2luZyBhbiBgSU5gIGNsYXVzZSBvbiBjb21iaW5hdGlvbnMgb2YgY2x1c3RlcmluZyBjb2x1bW5zLgotU2VlIGxpbms6I3NlbGVjdFdoZXJlW1NFTEVDVCBXSEVSRV0gY2xhdXNlcy4KLSogYElGIE5PVCBFWElTVFNgIGFuZCBgSUYgRVhJU1RTYCBzeW50YXggaXMgbm93IHN1cHBvcnRlZCBieQotYENSRUFURSBVU0VSYCBhbmQgYERST1AgVVNFUmAgc3RhdG1lbmV0cywgcmVzcGVjdGl2ZWx5LgotCi09PT09IDMuMS42Ci0KLSogQSBuZXcgbGluazojdXVpZEZ1bltgdXVpZGAgbWV0aG9kXSBoYXMgYmVlbiBhZGRlZC4KLSogU3VwcG9ydCBmb3IgYERFTEVURSAuLi4gSUYgRVhJU1RTYCBzeW50YXguCi0KLT09PT0gMy4xLjUKLQotKiBJdCBpcyBub3cgcG9zc2libGUgdG8gZ3JvdXAgY2x1c3RlcmluZyBjb2x1bW5zIGluIGEgcmVsYXRpaW9uLCBzZWUKLWxpbms6I3NlbGVjdFdoZXJlW1NFTEVDVCBXSEVSRV0gY2xhdXNlcy4KLSogQWRkZWQgc3VwcG9ydCBmb3IgYFNUQVRJQ2AgY29sdW1ucywgc2VlIGxpbms6I2NyZWF0ZVRhYmxlU3RhdGljW3N0YXRpYwotaW4gQ1JFQVRFIFRBQkxFXS4KLQotPT09PSAzLjEuNAotCi0qIGBDUkVBVEUgSU5ERVhgIG5vdyBhbGxvd3Mgc3BlY2lmeWluZyBvcHRpb25zIHdoZW4gY3JlYXRpbmcgQ1VTVE9NCi1pbmRleGVzIChzZWUgbGluazojY3JlYXRlSW5kZXhTdG10W0NSRUFURSBJTkRFWCByZWZlcmVuY2VdICkuCi0KLT09PT0gMy4xLjMKLQotKiBNaWxsaXNlY29uZCBwcmVjaXNpb24gZm9ybWF0cyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIHRpbWVzdGFtcCBwYXJzZXIKLShzZWUgbGluazojdXNpbmd0aW1lc3RhbXBzW3dvcmtpbmcgd2l0aCBkYXRlc10gKS4KLQotPT09PSAzLjEuMgotCi0qIGBOYU5gIGFuZCBgSW5maW5pdHlgIGhhcyBiZWVuIGFkZGVkIGFzIHZhbGlkIGZsb2F0IGNvbnRhbnRzLiBUaGV5IGFyZQotbm93IHJlc2VydmVkIGtleXdvcmRzLiBJbiB0aGUgdW5saWtlbHkgY2FzZSB5b3Ugd2UgdXNpbmcgdGhlbSBhcyBhCi1jb2x1bW4gaWRlbnRpZmllciAob3Iga2V5c3BhY2UvdGFibGUgb25lKSwgeW91IHdpbGwgbm9ldyBuZWVkIHRvIGRvdWJsZQotcXVvdGUgdGhlbSAoc2VlIGxpbms6I2lkZW50aWZpZXJzW3F1b3RlIGlkZW50aWZpZXJzXSApLgotCi09PT09IDMuMS4xCi0KLSogYFNFTEVDVGAgc3RhdGVtZW50IG5vdyBhbGxvd3MgbGlzdGluZyB0aGUgcGFydGl0aW9uIGtleXMgKHVzaW5nIHRoZQotYERJU1RJTkNUYCBtb2RpZmllcikuIFNlZQotaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtNDUzNltDQVNTQU5EUkEtNDUzNl0uCi0qIFRoZSBzeW50YXggYGMgSU4gP2AgaXMgbm93IHN1cHBvcnRlZCBpbiBgV0hFUkVgIGNsYXVzZXMuIEluIHRoYXQgY2FzZSwKLXRoZSB2YWx1ZSBleHBlY3RlZCBmb3IgdGhlIGJpbmQgdmFyaWFibGUgd2lsbCBiZSBhIGxpc3Qgb2Ygd2hhdGV2ZXIgdHlwZQotYGNgIGlzLgotKiBJdCBpcyBub3cgcG9zc2libGUgdG8gdXNlIG5hbWVkIGJpbmQgdmFyaWFibGVzICh1c2luZyBgOm5hbWVgIGluc3RlYWQKLW9mIGA/YCkuCi0KLT09PT0gMy4xLjAKLQotKiBsaW5rOiNhbHRlclRhYmxlU3RtdFtBTFRFUiBUQUJMRV0gYERST1BgIG9wdGlvbiBoYXMgYmVlbiByZWVuYWJsZWQgZm9yCi1DUUwzIHRhYmxlcyBhbmQgaGFzIG5ldyBzZW1hbnRpY3Mgbm93OiB0aGUgc3BhY2UgZm9ybWVybHkgdXNlZCBieQotZHJvcHBlZCBjb2x1bW5zIHdpbGwgbm93IGJlIGV2ZW50dWFsbHkgcmVjbGFpbWVkIChwb3N0LWNvbXBhY3Rpb24pLiBZb3UKLXNob3VsZCBub3QgcmVhZGQgcHJldmlvdXNseSBkcm9wcGVkIGNvbHVtbnMgdW5sZXNzIHlvdSB1c2UgdGltZXN0YW1wcwotd2l0aCBtaWNyb3NlY29uZCBwcmVjaXNpb24gKHNlZQotaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMzkxOVtDQVNTQU5EUkEtMzkxOV0gZm9yCi1tb3JlIGRldGFpbHMpLgotKiBgU0VMRUNUYCBzdGF0ZW1lbnQgbm93IHN1cHBvcnRzIGFsaWFzZXMgaW4gc2VsZWN0IGNsYXVzZS4gQWxpYXNlcyBpbgotV0hFUkUgYW5kIE9SREVSIEJZIGNsYXVzZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIFNlZSB0aGUKLWxpbms6I3NlbGVjdFN0bXRbc2VjdGlvbiBvbiBzZWxlY3RdIGZvciBkZXRhaWxzLgotKiBgQ1JFQVRFYCBzdGF0ZW1lbnRzIGZvciBgS0VZU1BBQ0VgLCBgVEFCTEVgIGFuZCBgSU5ERVhgIG5vdyBzdXBwb3J0cwotYW4gYElGIE5PVCBFWElTVFNgIGNvbmRpdGlvbi4gU2ltaWxhcmx5LCBgRFJPUGAgc3RhdGVtZW50cyBzdXBwb3J0IGEKLWBJRiBFWElTVFNgIGNvbmRpdGlvbi4KLSogYElOU0VSVGAgc3RhdGVtZW50cyBvcHRpb25hbGx5IHN1cHBvcnRzIGEgYElGIE5PVCBFWElTVFNgIGNvbmRpdGlvbgotYW5kIGBVUERBVEVgIHN1cHBvcnRzIGBJRmAgY29uZGl0aW9ucy4KLQotPT09PSAzLjAuNQotCi0qIGBTRUxFQ1RgLCBgVVBEQVRFYCwgYW5kIGBERUxFVEVgIHN0YXRlbWVudHMgbm93IGFsbG93IGVtcHR5IGBJTmAKLXJlbGF0aW9ucyAoc2VlCi1odHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS01NjI2KVtDQVNTQU5EUkEtNTYyNl0uCi0KLT09PT0gMy4wLjQKLQotKiBVcGRhdGVkIHRoZSBzeW50YXggZm9yIGN1c3RvbSBsaW5rOiNjcmVhdGVJbmRleFN0bXRbc2Vjb25kYXJ5Ci1pbmRleGVzXS4KLSogTm9uLWVxdWFsIGNvbmRpdGlvbiBvbiB0aGUgcGFydGl0aW9uIGtleSBhcmUgbm93IG5ldmVyIHN1cHBvcnRlZCwgZXZlbgotZm9yIG9yZGVyaW5nIHBhcnRpdGlvbmVyIGFzIHRoaXMgd2FzIG5vdCBjb3JyZWN0ICh0aGUgb3JkZXIgd2FzICpub3QqCi10aGUgb25lIG9mIHRoZSB0eXBlIG9mIHRoZSBwYXJ0aXRpb24ga2V5KS4gSW5zdGVhZCwgdGhlIGB0b2tlbmAgbWV0aG9kCi1zaG91bGQgYWx3YXlzIGJlIHVzZWQgZm9yIHJhbmdlIHF1ZXJpZXMgb24gdGhlIHBhcnRpdGlvbiBrZXkgKHNlZQotbGluazojc2VsZWN0V2hlcmVbV0hFUkUgY2xhdXNlc10gKS4KLQotPT09PSAzLjAuMwotCi0qIFN1cHBvcnQgZm9yIGN1c3RvbSBsaW5rOiNjcmVhdGVJbmRleFN0bXRbc2Vjb25kYXJ5IGluZGV4ZXNdIGhhcyBiZWVuCi1hZGRlZC4KLQotPT09PSAzLjAuMgotCi0qIFR5cGUgdmFsaWRhdGlvbiBmb3IgdGhlIGxpbms6I2NvbnN0YW50c1tjb25zdGFudHNdIGhhcyBiZWVuIGZpeGVkLiBGb3IKLWluc3RhbmNlLCB0aGUgaW1wbGVtZW50YXRpb24gdXNlZCB0byBhbGxvdyBgJzInYCBhcyBhIHZhbGlkIHZhbHVlIGZvciBhbgotYGludGAgY29sdW1uIChpbnRlcnByZXRpbmcgaXQgaGFzIHRoZSBlcXVpdmFsZW50IG9mIGAyYCksIG9yIGA0MmAgYXMgYQotdmFsaWQgYGJsb2JgIHZhbHVlIChpbiB3aGljaCBjYXNlIGA0MmAgd2FzIGludGVycHJldGVkIGFzIGFuIGhleGFkZWNpbWFsCi1yZXByZXNlbnRhdGlvbiBvZiB0aGUgYmxvYikuIFRoaXMgaXMgbm8gbG9uZ2VyIHRoZSBjYXNlLCB0eXBlIHZhbGlkYXRpb24KLW9mIGNvbnN0YW50cyBpcyBub3cgbW9yZSBzdHJpY3QuIFNlZSB0aGUgbGluazojdHlwZXNbZGF0YSB0eXBlc10gc2VjdGlvbgotZm9yIGRldGFpbHMgb24gd2hpY2ggY29uc3RhbnQgaXMgYWxsb3dlZCBmb3Igd2hpY2ggdHlwZS4KLSogVGhlIHR5cGUgdmFsaWRhdGlvbiBmaXhlZCBvZiB0aGUgcHJldmlvdXMgcG9pbnQgaGFzIGxlYWQgdG8gdGhlCi1pbnRyb2R1Y3Rpb24gb2YgbGluazojY29uc3RhbnRzW2Jsb2JzIGNvbnN0YW50c10gdG8gYWxsb3cgaW5wdXRpbmcKLWJsb2JzLiBEbyBub3RlIHRoYXQgd2hpbGUgaW5wdXRpbmcgYmxvYnMgYXMgc3RyaW5ncyBjb25zdGFudCBpcyBzdGlsbAotc3VwcG9ydGVkIGJ5IHRoaXMgdmVyc2lvbiAodG8gYWxsb3cgc21vb3RoZXIgdHJhbnNpdGlvbiB0byBibG9iCi1jb25zdGFudCksIGl0IGlzIG5vdyBkZXByZWNhdGVkIChpbiBwYXJ0aWN1bGFyIHRoZSBsaW5rOiN0eXBlc1tkYXRhCi10eXBlc10gc2VjdGlvbiBkb2VzIG5vdCBsaXN0IHN0cmluZ3MgY29uc3RhbnRzIGFzIHZhbGlkIGJsb2JzKSBhbmQgd2lsbAotYmUgcmVtb3ZlZCBieSBhIGZ1dHVyZSB2ZXJzaW9uLiBJZiB5b3Ugd2VyZSB1c2luZyBzdHJpbmdzIGFzIGJsb2JzLCB5b3UKLXNob3VsZCB0aHVzIHVwZGF0ZSB5b3VyIGNsaWVudCBjb2RlIEFTQVAgdG8gc3dpdGNoIGJsb2IgY29uc3RhbnRzLgotKiBBIG51bWJlciBvZiBmdW5jdGlvbnMgdG8gY29udmVydCBuYXRpdmUgdHlwZXMgdG8gYmxvYnMgaGF2ZSBhbHNvIGJlZW4KLWludHJvZHVjZWQuIEZ1cnRoZXJtb3JlIHRoZSB0b2tlbiBmdW5jdGlvbiBpcyBub3cgYWxzbyBhbGxvd2VkIGluIHNlbGVjdAotY2xhdXNlcy4gU2VlIHRoZSBsaW5rOiNmdW5jdGlvbnNbc2VjdGlvbiBvbiBmdW5jdGlvbnNdIGZvciBkZXRhaWxzLgotCi09PT09IDMuMC4xCi0KLSogbGluazojdXNpbmd0aW1lc3RhbXBzW0RhdGUgc3RyaW5nc10gKGFuZCB0aW1lc3RhbXBzKSBhcmUgbm8gbG9uZ2VyCi1hY2NlcHRlZCBhcyB2YWxpZCBgdGltZXV1aWRgIHZhbHVlcy4gRG9pbmcgc28gd2FzIGEgYnVnIGluIHRoZSBzZW5zZQotdGhhdCBkYXRlIHN0cmluZyBhcmUgbm90IHZhbGlkIGB0aW1ldXVpZGAsIGFuZCBpdCB3YXMgdGh1cyByZXN1bHRpbmcgaW4KLWh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTQ5MzZbY29uZnVzaW5nCi1iZWhhdmlvcnNdLiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5ldyBtZXRob2RzIGhhdmUgYmVlbiBhZGRlZCB0byBoZWxwCi13b3JraW5nIHdpdGggYHRpbWV1dWlkYDogYG5vd2AsIGBtaW5UaW1ldXVpZGAsIGBtYXhUaW1ldXVpZGAgLCBgZGF0ZU9mYAotYW5kIGB1bml4VGltZXN0YW1wT2ZgLiBTZWUgdGhlIGxpbms6I3RpbWV1dWlkRnVuW3NlY3Rpb24gZGVkaWNhdGVkIHRvCi10aGVzZSBtZXRob2RzXSBmb3IgbW9yZSBkZXRhaWwuCi0qIGBgRmxvYXQgY29uc3RhbnRzJycjY29uc3RhbnRzIG5vdyBzdXBwb3J0IHRoZSBleHBvbmVudCBub3RhdGlvbi4gSW4KLW90aGVyIHdvcmRzLCBgNC4yRTEwYCBpcyBub3cgYSB2YWxpZCBmbG9hdGluZyBwb2ludCB2YWx1ZS4KLQotPT09IFZlcnNpb25pbmcKLQotVmVyc2lvbmluZyBvZiB0aGUgQ1FMIGxhbmd1YWdlIGFkaGVyZXMgdG8gdGhlIGh0dHA6Ly9zZW12ZXIub3JnW1NlbWFudGljCi1WZXJzaW9uaW5nXSBndWlkZWxpbmVzLiBWZXJzaW9ucyB0YWtlIHRoZSBmb3JtIFguWS5aIHdoZXJlIFgsIFksIGFuZCBaCi1hcmUgaW50ZWdlciB2YWx1ZXMgcmVwcmVzZW50aW5nIG1ham9yLCBtaW5vciwgYW5kIHBhdGNoIGxldmVsCi1yZXNwZWN0aXZlbHkuIFRoZXJlIGlzIG5vIGNvcnJlbGF0aW9uIGJldHdlZW4gQ2Fzc2FuZHJhIHJlbGVhc2UgdmVyc2lvbnMKLWFuZCB0aGUgQ1FMIGxhbmd1YWdlIHZlcnNpb24uCi0KLVtjb2xzPSIsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXx2ZXJzaW9uIHxkZXNjcmlwdGlvbgotfE1ham9yIHxUaGUgbWFqb3IgdmVyc2lvbiBfbXVzdF8gYmUgYnVtcGVkIHdoZW4gYmFja3dhcmQgaW5jb21wYXRpYmxlCi1jaGFuZ2VzIGFyZSBpbnRyb2R1Y2VkLiBUaGlzIHNob3VsZCByYXJlbHkgb2NjdXIuCi0KLXxNaW5vciB8TWlub3IgdmVyc2lvbiBpbmNyZW1lbnRzIG9jY3VyIHdoZW4gbmV3LCBidXQgYmFja3dhcmQKLWNvbXBhdGlibGUsIGZ1bmN0aW9uYWxpdHkgaXMgaW50cm9kdWNlZC4KLQotfFBhdGNoIHxUaGUgcGF0Y2ggdmVyc2lvbiBpcyBpbmNyZW1lbnRlZCB3aGVuIGJ1Z3MgYXJlIGZpeGVkLgotfD09PQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9kZGwuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvZGRsLmFkb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Y2NlNDUuLjAwMDAwMDAKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9kZGwuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDgwNyArMCwwIEBACi09IERhdGEgRGVmaW5pdGlvbgotOnRhYnM6Ci0KLUNRTCBzdG9yZXMgZGF0YSBpbiBfdGFibGVzXywgd2hvc2Ugc2NoZW1hIGRlZmluZXMgdGhlIGxheW91dCBvZiB0aGUKLWRhdGEgaW4gdGhlIHRhYmxlLiBUYWJsZXMgYXJlIGxvY2F0ZWQgaW4gX2tleXNwYWNlc18uIAotQSBrZXlzcGFjZSBkZWZpbmVzIG9wdGlvbnMgdGhhdCBhcHBseSB0byBhbGwgdGhlIGtleXNwYWNlJ3MgdGFibGVzLiAKLVRoZSB4cmVmOmNxbC9kZGwuYWRvYyNyZXBsaWNhdGlvbi1zdHJhdGVneVtyZXBsaWNhdGlvbiBzdHJhdGVneV0gaXMgYW4gaW1wb3J0YW50IGtleXNwYWNlIG9wdGlvbiwgYXMgaXMgdGhlIHJlcGxpY2F0aW9uIGZhY3Rvci4gCi1BIGdvb2QgZ2VuZXJhbCBydWxlIGlzIG9uZSBrZXlzcGFjZSBwZXIgYXBwbGljYXRpb24uCi1JdCBpcyBjb21tb24gZm9yIGEgY2x1c3RlciB0byBkZWZpbmUgb25seSBvbmUga2V5c3BhY2UgZm9yIGFuIGFjdGllIGFwcGxpY2F0aW9uLgotCi1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBzdGF0ZW1lbnRzIHVzZWQgdG8gY3JlYXRlLCBtb2RpZnksIGFuZCByZW1vdmUKLXRob3NlIGtleXNwYWNlIGFuZCB0YWJsZXMuCi0KLT09IENvbW1vbiBkZWZpbml0aW9ucwotCi1UaGUgbmFtZXMgb2YgdGhlIGtleXNwYWNlcyBhbmQgdGFibGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBmb2xsb3dpbmcKLWdyYW1tYXI6Ci0KLVtzb3VyY2UsYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYva3NfdGFibGUuYm5mW10KLS0tLS0KLQotQm90aCBrZXlzcGFjZSBhbmQgdGFibGUgbmFtZSBzaG91bGQgYmUgY29tcHJpc2VkIG9mIG9ubHkgYWxwaGFudW1lcmljCi1jaGFyYWN0ZXJzLCBjYW5ub3QgYmUgZW1wdHkgYW5kIGFyZSBsaW1pdGVkIGluIHNpemUgdG8gNDggY2hhcmFjdGVycwotKHRoYXQgbGltaXQgZXhpc3RzIG1vc3RseSB0byBhdm9pZCBmaWxlbmFtZXMgKHdoaWNoIG1heSBpbmNsdWRlIHRoZQota2V5c3BhY2UgYW5kIHRhYmxlIG5hbWUpIHRvIGdvIG92ZXIgdGhlIGxpbWl0cyBvZiBjZXJ0YWluIGZpbGUgc3lzdGVtcykuCi1CeSBkZWZhdWx0LCBrZXlzcGFjZSBhbmQgdGFibGUgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgKGBteVRhYmxlYCBpcwotZXF1aXZhbGVudCB0byBgbXl0YWJsZWApIGJ1dCBjYXNlIHNlbnNpdGl2aXR5IGNhbiBiZSBmb3JjZWQgYnkgdXNpbmcKLWRvdWJsZS1xdW90ZXMgKGAibXlUYWJsZSJgIGlzIGRpZmZlcmVudCBmcm9tIGBteXRhYmxlYCkuCi0KLUZ1cnRoZXIsIGEgdGFibGUgaXMgYWx3YXlzIHBhcnQgb2YgYSBrZXlzcGFjZSBhbmQgYSB0YWJsZSBuYW1lIGNhbiBiZQotcHJvdmlkZWQgZnVsbHktcXVhbGlmaWVkIGJ5IHRoZSBrZXlzcGFjZSBpdCBpcyBwYXJ0IG9mLiBJZiBpcyBpcyBub3QKLWZ1bGx5LXF1YWxpZmllZCwgdGhlIHRhYmxlIGlzIGFzc3VtZWQgdG8gYmUgaW4gdGhlIF9jdXJyZW50XyBrZXlzcGFjZQotKHNlZSB4cmVmOmNxbC9kZGwuYWRvYyN1c2Utc3RhdGVtZW50W1VTRV0gc3RhdGVtZW50LgotCi1GdXJ0aGVyLCB0aGUgdmFsaWQgbmFtZXMgZm9yIGNvbHVtbnMgYXJlIGRlZmluZWQgYXM6Ci0KLVtzb3VyY2UsYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvY29sdW1uLmJuZltdCi0tLS0tCi0KLVdlIGFsc28gZGVmaW5lIHRoZSBub3Rpb24gb2Ygc3RhdGVtZW50IG9wdGlvbnMgZm9yIHVzZSBpbiB0aGUgZm9sbG93aW5nCi1zZWN0aW9uOgotCi1bc291cmNlLGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL29wdGlvbnMuYm5mW10KLS0tLS0KLQotW1tjcmVhdGUta2V5c3BhY2Utc3RhdGVtZW50XV0KLT09IENSRUFURSBLRVlTUEFDRQotCi1BIGtleXNwYWNlIGlzIGNyZWF0ZWQgd2l0aCBhIGBDUkVBVEUgS0VZU1BBQ0VgIHN0YXRlbWVudDoKLQotW3NvdXJjZSxibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9jcmVhdGVfa3MuYm5mW10KLS0tLS0KLQotRm9yIGV4YW1wbGU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX2tzLmNxbFtdCi0tLS0tCi0KLUF0dGVtcHRpbmcgdG8gY3JlYXRlIGEga2V5c3BhY2UgdGhhdCBhbHJlYWR5IGV4aXN0cyB3aWxsIHJldHVybiBhbiBlcnJvcgotdW5sZXNzIHRoZSBgSUYgTk9UIEVYSVNUU2Agb3B0aW9uIGlzIHVzZWQuIElmIGl0IGlzIHVzZWQsIHRoZSBzdGF0ZW1lbnQKLXdpbGwgYmUgYSBuby1vcCBpZiB0aGUga2V5c3BhY2UgYWxyZWFkeSBleGlzdHMuCi0KLVRoZSBzdXBwb3J0ZWQgYG9wdGlvbnNgIGFyZToKLQotW2NvbHM9IiwsLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfG5hbWUgfCBraW5kIHwgbWFuZGF0b3J5IHwgZGVmYXVsdCB8IGRlc2NyaXB0aW9uCi18YHJlcGxpY2F0aW9uYCB8IF9tYXBfIHwgeWVzIHwgbi9hIHwgVGhlIHJlcGxpY2F0aW9uIHN0cmF0ZWd5IGFuZCBvcHRpb25zIHRvIHVzZSBmb3IgdGhlIGtleXNwYWNlIChzZWUKLWRldGFpbHMgYmVsb3cpLgotfGBkdXJhYmxlX3dyaXRlc2AgfCBfc2ltcGxlXyB8IG5vIHwgdHJ1ZSB8IFdoZXRoZXIgdG8gdXNlIHRoZSBjb21taXQgbG9nIGZvciB1cGRhdGVzIG9uIHRoaXMga2V5c3BhY2UgKGRpc2FibGUgdGhpcwotb3B0aW9uIGF0IHlvdXIgb3duIHJpc2shKS4KLXw9PT0KLQotVGhlIGByZXBsaWNhdGlvbmAgcHJvcGVydHkgaXMgbWFuZGF0b3J5IGFuZCBtdXN0IGNvbnRhaW4gdGhlIGAnY2xhc3MnYCBzdWItb3B0aW9uIHRoYXQgZGVmaW5lcyB0aGUgZGVzaXJlZAoteHJlZjpjcWwvZGRsLmFkb2MjcmVwbGljYXRpb24tc3RyYXRlZ3lbcmVwbGljYXRpb24gc3RyYXRlZ3ldIGNsYXNzLiAKLVRoZSByZXN0IG9mIHRoZSBzdWItb3B0aW9ucyBkZXBlbmQgb24gd2hpY2ggcmVwbGljYXRpb24gc3RyYXRlZ3kgaXMgdXNlZC4gCi1CeSBkZWZhdWx0LCBDYXNzYW5kcmEgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBgJ2NsYXNzJ2AgdmFsdWVzOgotCi1bW3JlcGxpY2F0aW9uLXN0cmF0ZWd5XV0KLT09PSBgU2ltcGxlU3RyYXRlZ3lgCi0KLUEgc2ltcGxlIHN0cmF0ZWd5IHRoYXQgZGVmaW5lcyBhIHJlcGxpY2F0aW9uIGZhY3RvciBmb3IgZGF0YSB0byBiZQotc3ByZWFkIGFjcm9zcyB0aGUgZW50aXJlIGNsdXN0ZXIuIFRoaXMgaXMgZ2VuZXJhbGx5IG5vdCBhIHdpc2UgY2hvaWNlCi1mb3IgcHJvZHVjdGlvbiwgYXMgaXQgZG9lcyBub3QgcmVzcGVjdCBkYXRhY2VudGVyIGxheW91dHMgYW5kIGNhbgotbGVhZCB0byB3aWxkbHkgdmFyeWluZyBxdWVyeSBsYXRlbmN5LiBGb3IgcHJvZHVjdGlvbiwgdXNlCi1gTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3lgLiBgU2ltcGxlU3RyYXRlZ3lgIHN1cHBvcnRzIGEgc2luZ2xlCi1tYW5kYXRvcnkgYXJndW1lbnQ6Ci0KLVtjb2xzPSIsLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfHN1Yi1vcHRpb24gfHR5cGUgfHNpbmNlIHxkZXNjcmlwdGlvbgotfGAncmVwbGljYXRpb25fZmFjdG9yJ2AgfCBpbnQgfCBhbGwgfCBUaGUgbnVtYmVyIG9mIHJlcGxpY2FzIHRvIHN0b3JlIHBlciByYW5nZQotfD09PQotCi09PT0gYE5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5YAotCi1BIHByb2R1Y3Rpb24tcmVhZHkgcmVwbGljYXRpb24gc3RyYXRlZ3kgdGhhdCBzZXRzIHRoZQotcmVwbGljYXRpb24gZmFjdG9yIGluZGVwZW5kZW50bHkgZm9yIGVhY2ggZGF0YS1jZW50ZXIuIFRoZSByZXN0IG9mIHRoZQotc3ViLW9wdGlvbnMgYXJlIGtleS12YWx1ZSBwYWlycywgd2l0aCBhIGtleSBzZXQgdG8gYSBkYXRhLWNlbnRlciBuYW1lIGFuZAotaXRzIHZhbHVlIHNldCB0byB0aGUgYXNzb2NpYXRlZCByZXBsaWNhdGlvbiBmYWN0b3IuIE9wdGlvbnM6Ci0KLVtjb2xzPSIsLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfHN1Yi1vcHRpb24gfHR5cGUgfGRlc2NyaXB0aW9uCi18YCc8ZGF0YWNlbnRlcj4nYCB8IGludCB8IFRoZSBudW1iZXIgb2YgcmVwbGljYXMgdG8gc3RvcmUgcGVyIHJhbmdlIGluIHRoZSBwcm92aWRlZCBkYXRhY2VudGVyLgotfGAncmVwbGljYXRpb25fZmFjdG9yJ2AgfCBpbnQgfCBUaGUgbnVtYmVyIG9mIHJlcGxpY2FzIHRvIHVzZSBhcyBhIGRlZmF1bHQgcGVyIGRhdGFjZW50ZXIgaWYgbm90Ci1zcGVjaWZpY2FsbHkgcHJvdmlkZWQuIE5vdGUgdGhhdCB0aGlzIGFsd2F5cyBkZWZlcnMgdG8gZXhpc3RpbmcKLWRlZmluaXRpb25zIG9yIGV4cGxpY2l0IGRhdGFjZW50ZXIgc2V0dGluZ3MuIEZvciBleGFtcGxlLCB0byBoYXZlIHRocmVlCi1yZXBsaWNhcyBwZXIgZGF0YWNlbnRlciwgc2V0IGEgdmFsdWUgb2YgMy4KLXw9PT0KLQotV2hlbiBsYXRlciBhbHRlcmluZyBrZXlzcGFjZXMgYW5kIGNoYW5naW5nIHRoZSBgcmVwbGljYXRpb25fZmFjdG9yYCwKLWF1dG8tZXhwYW5zaW9uIHdpbGwgb25seSBfYWRkXyBuZXcgZGF0YWNlbnRlcnMgZm9yIHNhZmV0eSwgaXQgd2lsbCBub3QKLWFsdGVyIGV4aXN0aW5nIGRhdGFjZW50ZXJzIG9yIHJlbW92ZSBhbnksIGV2ZW4gaWYgdGhleSBhcmUgbm8gbG9uZ2VyIGluCi10aGUgY2x1c3Rlci4gSWYgeW91IHdhbnQgdG8gcmVtb3ZlIGRhdGFjZW50ZXJzIHdoaWxlIHNldHRpbmcgdGhlIAotYHJlcGxpY2F0aW9uX2ZhY3RvcmAsIGV4cGxpY2l0bHkgemVybyBvdXQgdGhlIGRhdGFjZW50ZXIgeW91IHdhbnQgdG8KLWhhdmUgemVybyByZXBsaWNhcy4KLQotQW4gZXhhbXBsZSBvZiBhdXRvLWV4cGFuZGluZyBkYXRhY2VudGVycyB3aXRoIHR3byBkYXRhY2VudGVyczogYERDMWAgYW5kCi1gREMyYDoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9hdXRvZXhwYW5kX2tzLmNxbFtdCi0tLS0tCi13aWxsIHJlc3VsdCBpbjoKLVtzb3VyY2UscGxhaW50ZXh0XQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL2F1dG9leHBhbmRfa3MucmVzdWx0W10KLS0tLS0KLQotQW4gZXhhbXBsZSBvZiBhdXRvLWV4cGFuZGluZyBhbmQgb3ZlcnJpZGluZyBhIGRhdGFjZW50ZXI6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvYXV0b2V4cGFuZF9rc19vdmVycmlkZS5jcWxbXQotLS0tLQotd2lsbCByZXN1bHQgaW46Ci1bc291cmNlLHBsYWludGV4dF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9hdXRvZXhwYW5kX2tzX292ZXJyaWRlLnJlc3VsdFtdCi0tLS0tCi0KLUFuIGV4YW1wbGUgdGhhdCBleGNsdWRlcyBhIGRhdGFjZW50ZXIgd2hpbGUgdXNpbmcgYHJlcGxpY2F0aW9uX2ZhY3RvcmA6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvYXV0b2V4cGFuZF9leGNsdWRlX2RjLmNxbFtdCi0tLS0tCi13aWxsIHJlc3VsdCBpbjoKLVtzb3VyY2UscGxhaW50ZXh0XQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL2F1dG9leHBhbmRfZXhjbHVkZV9kYy5yZXN1bHRbXQotLS0tLQotCi1JZiB4cmVmOm5ldy90cmFuc2llbnRyZXBsaWNhdGlvbi5hZG9jW3RyYW5zaWVudCByZXBsaWNhdGlvbl0gaGFzIGJlZW4gZW5hYmxlZCwgdHJhbnNpZW50IHJlcGxpY2FzIGNhbiBiZQotY29uZmlndXJlZCBmb3IgYm90aCBgU2ltcGxlU3RyYXRlZ3lgIGFuZCBgTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3lgIGJ5Ci1kZWZpbmluZyByZXBsaWNhdGlvbiBmYWN0b3JzIGluIHRoZSBmb3JtYXQKLWAnPHRvdGFsX3JlcGxpY2FzPi88dHJhbnNpZW50X3JlcGxpY2FzPidgCi0KLUZvciBpbnN0YW5jZSwgdGhpcyBrZXlzcGFjZSB3aWxsIGhhdmUgMyByZXBsaWNhcyBpbiBEQzEsIDEgb2Ygd2hpY2ggaXMKLXRyYW5zaWVudCwgYW5kIDUgcmVwbGljYXMgaW4gREMyLCAyIG9mIHdoaWNoIGFyZSB0cmFuc2llbnQ6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX2tzX3RyYW5zX3JlcGwuY3FsW10KLS0tLS0KLQotW1t1c2Utc3RhdGVtZW50XV0KLT09IFVTRQotCi1UaGUgYFVTRWAgc3RhdGVtZW50IGNoYW5nZXMgdGhlIF9jdXJyZW50XyBrZXlzcGFjZSB0byB0aGUgc3BlY2lmaWVkIGtleXNwYWNlLiAKLUEgbnVtYmVyIG9mIG9iamVjdHMgaW4gQ1FMIGFyZSBib3VuZCB0byBhIGtleXNwYWNlICh0YWJsZXMsIHVzZXItZGVmaW5lZCB0eXBlcywgZnVuY3Rpb25zLCBldGMuKSBhbmQgdGhlCi1jdXJyZW50IGtleXNwYWNlIGlzIHRoZSBkZWZhdWx0IGtleXNwYWNlIHVzZWQgd2hlbiB0aG9zZSBvYmplY3RzIGFyZQotcmVmZXJyZWQgdG8gaW4gYSBxdWVyeSB3aXRob3V0IGEgZnVsbHktcXVhbGlmaWVkIG5hbWUgKHdpdGhvdXQgYSBwcmVmaXhlZCBrZXlzcGFjZSBuYW1lKS4gCi1BIGBVU0VgIHN0YXRlbWVudCBzcGVjaWZpZXMgdGhlIGtleXNwYWNlIHRvIHVzZSBhcyBhbiBhcmd1bWVudDoKLQotW3NvdXJjZSxibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi91c2Vfa3MuYm5mW10KLS0tLS0KLVVzaW5nIENRTDoKLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvdXNlX2tzLmNxbFtdCi0tLS0tCi0KLVtbYWx0ZXIta2V5c3BhY2Utc3RhdGVtZW50XV0KLT09IEFMVEVSIEtFWVNQQUNFCi0KLUFuIGBBTFRFUiBLRVlTUEFDRWAgc3RhdGVtZW50IG1vZGlmaWVzIHRoZSBvcHRpb25zIG9mIGEga2V5c3BhY2U6Ci0KLVtzb3VyY2UsYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvYWx0ZXJfa3MuYm5mW10KLS0tLS0KLQotRm9yIGV4YW1wbGU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvYWx0ZXJfa3MuY3FsW10KLS0tLS0KLUlmIHRoZSBrZXlzcGFjZSBkb2VzIG5vdCBleGlzdCwgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCi1UaGUgc3VwcG9ydGVkIG9wdGlvbnMgYXJlIHRoZSBzYW1lIGFzIGZvciB4cmVmOmNxbC9kZGwuYWRvYyNjcmVhdGUta2V5c3BhY2Utc3RhdGVtZW50W2NyZWF0aW5nIGEga2V5c3BhY2VdLgotCi1bW2Ryb3Ata2V5c3BhY2Utc3RhdGVtZW50XV0KLT09IERST1AgS0VZU1BBQ0UKLQotRHJvcHBpbmcgYSBrZXlzcGFjZSBpcyBkb25lIHdpdGggdGhlIGBEUk9QIEtFWVNQQUNFYCBzdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvZHJvcF9rcy5ibmZbXQotLS0tLQotCi1Gb3IgZXhhbXBsZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9kcm9wX2tzLmNxbFtdCi0tLS0tCi0KLURyb3BwaW5nIGEga2V5c3BhY2UgcmVzdWx0cyBpbiB0aGUgaW1tZWRpYXRlLCBpcnJldmVyc2libGUgcmVtb3ZhbCBvZgotdGhhdCBrZXlzcGFjZSwgaW5jbHVkaW5nIGFsbCB0aGUgdGFibGVzLCB1c2VyLWRlZmluZWQgdHlwZXMsIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMsIGFuZAotYWxsIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aG9zZSB0YWJsZXMuCi0KLUlmIHRoZSBrZXlzcGFjZSBkb2VzIG5vdCBleGlzdHMsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsCi11bmxlc3MgYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KLQotW1tjcmVhdGUtdGFibGUtc3RhdGVtZW50XV0KLT09IENSRUFURSBUQUJMRQotCi1DcmVhdGluZyBhIG5ldyB0YWJsZSB1c2VzIHRoZSBgQ1JFQVRFIFRBQkxFYCBzdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvY3JlYXRlX3RhYmxlLmJuZltdCi0tLS0tCi0KLUZvciBleGFtcGxlLCBoZXJlIGFyZSBzb21lIENRTCBzdGF0ZW1lbnRzIHRvIGNyZWF0ZSB0YWJsZXM6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX3RhYmxlLmNxbFtdCi0tLS0tCi0KLUEgQ1FMIHRhYmxlIGhhcyBhIG5hbWUgYW5kIGlzIGNvbXBvc2VkIG9mIGEgc2V0IG9mIF9yb3dzXy4gCi1DcmVhdGluZyBhIHRhYmxlIGFtb3VudHMgdG8gZGVmaW5pbmcgd2hpY2ggeHJlZjpjcWwvZGRsLmFkb2MjY29sdW1uLWRlZmluaXRpb25bY29sdW1uc10gZWFjaCByb3dzIHdpbGwgaGF2ZSwgCi13aGljaCBvZiB0aG9zZSBjb2x1bW5zIGNvbXByaXNlIHRoZSB4cmVmOmNxbC9kZGwuYWRvYyNwcmltYXJ5LWtleVtwcmltYXJ5IGtleV0sIGFzIHdlbGwgYXMgZGVmaW5lZAoteHJlZjpjcWwvZGRsLmFkb2MjY3JlYXRlLXRhYmxlLW9wdGlvbnNbb3B0aW9uc10gZm9yIHRoZSB0YWJsZS4KLQotQXR0ZW1wdGluZyB0byBjcmVhdGUgYW4gYWxyZWFkeSBleGlzdGluZyB0YWJsZSB3aWxsIHJldHVybiBhbiBlcnJvcgotdW5sZXNzIHRoZSBgSUYgTk9UIEVYSVNUU2AgZGlyZWN0aXZlIGlzIHVzZWQuIElmIGl0IGlzIHVzZWQsIHRoZQotc3RhdGVtZW50IHdpbGwgYmUgYSBuby1vcCBpZiB0aGUgdGFibGUgYWxyZWFkeSBleGlzdHMuCi0KLVtbY29sdW1uLWRlZmluaXRpb25dXQotPT09IENvbHVtbiBkZWZpbml0aW9ucwotCi1FdmVyeSByb3cgaW4gYSBDUUwgdGFibGUgd2lsbCBoYXZlIHRoZSBwcmVkZWZpbmVkIGNvbHVtbnMgZGVmaW5lZCBhdCB0YWJsZSBjcmVhdGlvbi4gCi1Db2x1bW5zIGNhbiBiZSBhZGRlZCBsYXRlciB1c2luZyBhbiB4cmVmOmNxbC9kZGwuYWRvYyNhbHRlci10YWJsZS1zdGF0ZW1lbnRbYWx0ZXIgc3RhdGVtZW50XS4KLQotQSBgY29sdW1uX2RlZmluaXRpb25gIGlzIGNvbXByaXNlZCBvZiB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIGFuZCBpdHMgeHJlZjpjcWwvZGRsLmFkb2MjZGF0YS10eXBlW3R5cGVdLCAKLXJlc3RyaWN0aW5nIHRoZSAgdmFsdWVzIHRoYXQgYXJlIGFjY2VwdGVkIGZvciB0aGF0IGNvbHVtbi4gQWRkaXRpb25hbGx5LCBhIGNvbHVtbiBkZWZpbml0aW9uIGNhbiBoYXZlIHRoZQotZm9sbG93aW5nIG1vZGlmaWVyczoKLQotKiBgU1RBVElDYDogZGVjbGFyZXMgdGhlIGNvbHVtbiBhcyBhIHhyZWY6Y3FsL2RkbC5hZG9jI3N0YXRpYy1jb2x1bW5bc3RhdGljIGNvbHVtbl0KLSogYFBSSU1BUlkgS0VZYDogZGVjbGFyZXMgdGhlIGNvbHVtbiBhcyB0aGUgc29sZSBjb21wb25lbnQgb2YgdGhlIHhyZWY6Y3FsL2RkbC5hZG9jI3ByaW1hcnkta2V5W3ByaW1hcnkga2V5XSBvZiB0aGUgdGFibGUKLQotW1tzdGF0aWMtY29sdW1uXV0KLT09PT0gU3RhdGljIGNvbHVtbnMKLQotU29tZSBjb2x1bW5zIGNhbiBiZSBkZWNsYXJlZCBhcyBgU1RBVElDYCBpbiBhIHRhYmxlIGRlZmluaXRpb24uIEEgY29sdW1uCi10aGF0IGlzIHN0YXRpYyB3aWxsIGJlIOKAnHNoYXJlZOKAnSBieSBhbGwgdGhlIHJvd3MgYmVsb25naW5nIHRvIHRoZSBzYW1lCi1wYXJ0aXRpb24gKGhhdmluZyB0aGUgc2FtZSB4cmVmOmNxbC9kZGwuYWRvYyNwYXJ0aXRpb24ta2V5W3BhcnRpdGlvbiBrZXldLiAKLQotRm9yIGV4YW1wbGU6Ci0KLVt7dGFic31dIAotPT09PSAKLUNvZGU6OiAKLSsgCi0tLSAKLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX3N0YXRpY19jb2x1bW4uY3FsW10KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2luc2VydF9zdGF0aWNfZGF0YS5jcWxbXQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvc2VsZWN0X3N0YXRpY19kYXRhLmNxbFtdCi0tLS0tCi0tLQotCi1SZXN1bHRzOjoKLSsKLS0tCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9zZWxlY3Rfc3RhdGljX2RhdGEucmVzdWx0W10KLS0tLS0KLS0tCi09PT09Ci0KLUFzIGNhbiBiZSBzZWVuLCB0aGUgYHNgIHZhbHVlIGlzIHRoZSBzYW1lIChgc3RhdGljMWApIGZvciBib3RoIG9mIHRoZQotcm93cyBpbiB0aGUgcGFydGl0aW9uICh0aGUgcGFydGl0aW9uIGtleSBiZWluZyBgcGtgLCBhbmQgYm90aAotcm93cyBhcmUgaW4gdGhlIHNhbWUgcGFydGl0aW9uKTogdGhlIHNlY29uZCBpbnNlcnRpb24gb3ZlcnJpZGVzIHRoZQotdmFsdWUgZm9yIGBzYC4KLQotVGhlIHVzZSBvZiBzdGF0aWMgY29sdW1ucyBoYXMgdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSogQSB0YWJsZSB3aXRob3V0IGNsdXN0ZXJpbmcgY29sdW1ucyBjYW5ub3QgaGF2ZSBzdGF0aWMgY29sdW1ucy4gCi1JbiBhIHRhYmxlIHdpdGhvdXQgY2x1c3RlcmluZyBjb2x1bW5zLCBldmVyeSBwYXJ0aXRpb24gaGFzIG9ubHkgb25lIHJvdywgYW5kCi1zbyBldmVyeSBjb2x1bW4gaXMgaW5oZXJlbnRseSBzdGF0aWMpCi0qIE9ubHkgbm9uLXByaW1hcnkga2V5IGNvbHVtbnMgY2FuIGJlIHN0YXRpYy4KLQotW1twcmltYXJ5LWtleV1dCi09PT0gVGhlIFByaW1hcnkga2V5Ci0KLVdpdGhpbiBhIHRhYmxlLCBhIHJvdyBpcyB1bmlxdWVseSBpZGVudGlmaWVkIGJ5IGl0cyBgUFJJTUFSWSBLRVlgLCBhbmQKLWhlbmNlIGFsbCB0YWJsZXMgKm11c3QqIGRlZmluZSBhIHNpbmdsZSBQUklNQVJZIEtFWS4gCi1BIGBQUklNQVJZIEtFWWAgaXMgY29tcG9zZWQgb2Ygb25lIG9yIG1vcmUgb2YgdGhlIGRlZmluZWQgY29sdW1ucyBpbiB0aGUgdGFibGUuIAotU3ludGFjdGljYWxseSwgdGhlIHByaW1hcnkga2V5IGlzIGRlZmluZWQgd2l0aCB0aGUgcGhyYXNlIGBQUklNQVJZIEtFWWAgCi1mb2xsb3dlZCBieSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBjb2x1bW4gbmFtZXMgd2l0aGluIHBhcmVudGhlc2lzLgotSWYgdGhlIHByaW1hcnkga2V5IGhhcyBvbmx5IG9uZSBjb2x1bW4sIHlvdSBjYW4gYWx0ZXJuYXRpdmVseSBhZGQgdGhlIGBQUklNQVJZIEtFWWAgcGhyYXNlIHRvCi10aGF0IGNvbHVtbiBpbiB0aGUgdGFibGUgZGVmaW5pdGlvbi4gCi1UaGUgb3JkZXIgb2YgdGhlIGNvbHVtbnMgaW4gdGhlIHByaW1hcnkga2V5IGRlZmluaXRpb24gZGVmaW5lcyB0aGUgcGFydGl0aW9uIGtleSBhbmQgCi1jbHVzdGVyaW5nIGNvbHVtbnMuCi0KLUEgQ1FMIHByaW1hcnkga2V5IGlzIGNvbXBvc2VkIG9mIHR3byBwYXJ0czoKLQoteHJlZjpjcWwvZGRsLmFkb2MjcGFydGl0aW9uLWtleVtwYXJ0aXRpb24ga2V5XTo6Ci0qIEl0IGlzIHRoZSBmaXJzdCBjb21wb25lbnQgb2YgdGhlIHByaW1hcnkga2V5IGRlZmluaXRpb24uIAotSXQgY2FuIGJlIGEgc2luZ2xlIGNvbHVtbiBvciwgdXNpbmcgYW4gYWRkaXRpb25hbCBzZXQgb2YgcGFyZW50aGVzaXMsIGNhbiBiZSBtdWx0aXBsZSBjb2x1bW5zLiAKLUEgdGFibGUgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBwYXJ0aXRpb24ga2V5LCB0aGUgc21hbGxlc3QgcG9zc2libGUgdGFibGUgZGVmaW5pdGlvbiBpczoKLSsKLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX3RhYmxlX3NpbmdsZV9way5jcWxbXQotLS0tLQoteHJlZjpjcWwvZGRsLmFkb2MjY2x1c3RlcmluZy1jb2x1bW5zW2NsdXN0ZXJpbmcgY29sdW1uc106OgotKiBUaGUgY29sdW1ucyBhcmUgdGhlIGNvbHVtbnMgdGhhdCBmb2xsb3cgdGhlIHBhcnRpdGlvbiBrZXkgaW4gdGhlIHByaW1hcnkga2V5IGRlZmluaXRpb24uCi1UaGUgb3JkZXIgb2YgdGhvc2UgY29sdW1ucyBkZWZpbmUgdGhlIF9jbHVzdGVyaW5nIG9yZGVyXy4KLQotU29tZSBleGFtcGxlcyBvZiBwcmltYXJ5IGtleSBkZWZpbml0aW9uIGFyZToKLQotKiBgUFJJTUFSWSBLRVkgKGEpYDogYGFgIGlzIHRoZSBzaW5nbGUgcGFydGl0aW9uIGtleSBhbmQgdGhlcmUgYXJlIG5vIGNsdXN0ZXJpbmcgY29sdW1ucwotKiBgUFJJTUFSWSBLRVkgKGEsIGIsIGMpYCA6IGBhYCBpcyB0aGUgc2luZ2xlIHBhcnRpdGlvbiBrZXkgYW5kIGBiYCBhbmQgYGNgIGFyZSB0aGUgY2x1c3RlcmluZyBjb2x1bW5zCi0qIGBQUklNQVJZIEtFWSAoKGEsIGIpLCBjKWAgOiBgYWAgYW5kIGBiYCBjb21wb3NlIHRoZSBfY29tcG9zaXRlXyBwYXJ0aXRpb24ga2V5IGFuZCBgY2AgaXMgdGhlIGNsdXN0ZXJpbmcgY29sdW1uCi0KLVtJTVBPUlRBTlRdCi09PT09Ci1UaGUgcHJpbWFyeSBrZXkgdW5pcXVlbHkgaWRlbnRpZmllcyBhIHJvdyBpbiB0aGUgdGFibGUsIGFzIGRlc2NyaWJlZCBhYm92ZS4gCi1BIGNvbnNlcXVlbmNlIG9mIHRoaXMgdW5pcXVlbmVzcyBpcyB0aGF0IGlmIGFub3RoZXIgcm93IGlzIGluc2VydGVkIHVzaW5nIHRoZSBzYW1lIHByaW1hcnkga2V5LCAKLXRoZW4gYW4gYFVQU0VSVGAgb2NjdXJzIGFuZCBhbiBleGlzdGluZyByb3cgd2l0aCB0aGUgc2FtZSBwcmltYXJ5IGtleSBpcyByZXBsYWNlZC4gCi1Db2x1bW5zIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwcmltYXJ5IGtleSBjYW5ub3QgZGVmaW5lIHVuaXF1ZW5lc3MuCi09PT09Ci0KLVtbcGFydGl0aW9uLWtleV1dCi09PT09IFBhcnRpdGlvbiBrZXkKLQotV2l0aGluIGEgdGFibGUsIENRTCBkZWZpbmVzIHRoZSBub3Rpb24gb2YgYSBfcGFydGl0aW9uXyB0aGF0IGRlZmluZXMgdGhlIGxvY2F0aW9uIG9mIGRhdGEgd2l0aGluIGEgQ2Fzc2FuZHJhIGNsdXN0ZXIuCi1BIHBhcnRpdGlvbiBpcyB0aGUgc2V0IG9mIHJvd3MgdGhhdCBzaGFyZSB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhlaXIgcGFydGl0aW9uIGtleS4gCi0KLU5vdGUgdGhhdCBpZiB0aGUgcGFydGl0aW9uIGtleSBpcyBjb21wb3NlZCBvZiBtdWx0aXBsZSBjb2x1bW5zLCB0aGVuIHJvd3MgYmVsb25nIHRvIHRoZSBzYW1lIHBhcnRpdGlvbiAKLXdoZW4gdGhleSBoYXZlIHRoZSBzYW1lIHZhbHVlcyBmb3IgYWxsIHRob3NlIHBhcnRpdGlvbiBrZXkgY29sdW1ucy4gCi1BIGhhc2ggaXMgY29tcHV0ZWQgZnJvbSB0aGUgcGFydGl0aW9uIGtleSBjb2x1bW5zIGFuZCB0aGF0IGhhc2ggdmFsdWUgZGVmaW5lcyB0aGUgcGFydGl0aW9uIGxvY2F0aW9uLgotU28sIGZvciBpbnN0YW5jZSwgZ2l2ZW4gdGhlIGZvbGxvd2luZyB0YWJsZSBkZWZpbml0aW9uIGFuZCBjb250ZW50OgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2NyZWF0ZV90YWJsZV9jb21wb3VuZF9way5jcWxbXQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvaW5zZXJ0X3RhYmxlX2NvbXBvdW5kX3BrLmNxbFtdCi1pbmNsdWRlOjpleGFtcGxlJENRTC9zZWxlY3RfdGFibGVfY29tcG91bmRfcGsuY3FsW10KLS0tLS0KLQotd2lsbCByZXN1bHQgaW4KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL3NlbGVjdF90YWJsZV9jb21wb3VuZF9way5yZXN1bHRbXQotLS0tLQotPDE+IFJvd3MgMSBhbmQgMiBhcmUgaW4gdGhlIHNhbWUgcGFydGl0aW9uLCBiZWNhdXNlIGJvdGggY29sdW1ucyBgYWAgYW5kIGBiYCBhcmUgemVyby4KLTwyPiBSb3dzIDMgYW5kIDQgYXJlIGluIHRoZSBzYW1lIHBhcnRpdGlvbiwgYnV0IGEgZGlmZmVyZW50IG9uZSwgYmVjYXVzZSBjb2x1bW4gYGFgIGlzIHplcm8gYW5kIGNvbHVtbiBgYmAgaXMgMSBpbiBib3RoIHJvd3MuCi08Mz4gUm93IDUgaXMgaW4gYSB0aGlyZCBwYXJ0aXRpb24gYnkgaXRzZWxmLCBiZWNhdXNlIGJvdGggY29sdW1ucyBgYWAgYW5kIGBiYCBhcmUgMS4KLQotTm90ZSB0aGF0IGEgdGFibGUgYWx3YXlzIGhhcyBhIHBhcnRpdGlvbiBrZXksIGFuZCB0aGF0IGlmIHRoZSB0YWJsZSBoYXMKLW5vIGBjbHVzdGVyaW5nIGNvbHVtbnNgLCB0aGVuIGV2ZXJ5IHBhcnRpdGlvbiBvZiB0aGF0IHRhYmxlIGhhcyBhIHNpbmdsZSByb3cuCi1iZWNhdXNlIHRoZSBwYXJ0aXRpb24ga2V5LCBjb21wb3VuZCBvciBvdGhlcndpc2UsIGlkZW50aWZpZXMgYSBzaW5nbGUgbG9jYXRpb24uCi0KLVRoZSBtb3N0IGltcG9ydGFudCBwcm9wZXJ0eSBvZiBwYXJ0aXRpb24gaXMgdGhhdCBhbGwgdGhlIHJvd3MgYmVsb25naW5nCi10byB0aGUgc2FtZSBwYXJ0aXRpb24gYXJlIGd1YXJhbnRlZWQgdG8gYmUgc3RvcmVkIG9uIHRoZSBzYW1lIHNldCBvZgotcmVwbGljYSBub2Rlcy4gCi1JbiBvdGhlciB3b3JkcywgdGhlIHBhcnRpdGlvbiBrZXkgb2YgYSB0YWJsZSBkZWZpbmVzIHdoaWNoIHJvd3Mgd2lsbCBiZSBsb2NhbGl6ZWQgb24gdGhlIHNhbWUgCi1ub2RlIGluIHRoZSBjbHVzdGVyLiAKLVRoZSBsb2NhbGl6YXRpb24gb2YgZGF0YSBpcyBpbXBvcnRhbnQgdG8gdGhlIGVmZmljaWVudCByZXRyaWV2YWwgb2YgZGF0YSwgcmVxdWlyaW5nIHRoZSBDYXNzYW5kcmEgY29vcmRpbmF0b3IKLXRvIGNvbnRhY3QgYXMgZmV3IG5vZGVzIGFzIHBvc3NpYmxlLgotSG93ZXZlciwgdGhlcmUgaXMgYSBmbGlwLXNpZGUgdG8gdGhpcyBndWFyYW50ZWUsIGFuZCBhbGwgcm93cyBzaGFyaW5nIGEgcGFydGl0aW9uIGtleSB3aWxsIGJlIHN0b3JlZCBvbiB0aGUgc2FtZSAKLW5vZGUsIGNyZWF0aW5nIGEgaG90c3BvdCBmb3IgYm90aCByZWFkaW5nIGFuZCB3cml0aW5nLgotV2hpbGUgc2VsZWN0aW5nIGEgcHJpbWFyeSBrZXkgdGhhdCBncm91cHMgdGFibGUgcm93cyBhc3Npc3RzIGJhdGNoIHVwZGF0ZXMgYW5kIGNhbiBlbnN1cmUgdGhhdCB0aGUgdXBkYXRlcyBhcmUgCi1fYXRvbWljXyBhbmQgZG9uZSBpbiBfaXNvbGF0aW9uXywgdGhlIHBhcnRpdGlvbnMgbXVzdCBiZSBzaXplZCAianVzdCByaWdodCwgbm90IHRvbyBiaWcgbm9yIHRvbyBzbWFsbCIuCi0KLURhdGEgbW9kZWxpbmcgdGhhdCBjb25zaWRlcnMgdGhlIHF1ZXJ5aW5nIHBhdHRlcm5zIGFuZCBhc3NpZ25zIHByaW1hcnkga2V5cyBiYXNlZCBvbiB0aGUgcXVlcmllcyB3aWxsIGhhdmUgdGhlIGxvd2VzdCAKLWxhdGVuY3kgaW4gZmV0Y2hpbmcgZGF0YS4KLQotW1tjbHVzdGVyaW5nLWNvbHVtbnNdXQotPT09PSBDbHVzdGVyaW5nIGNvbHVtbnMKLQotVGhlIGNsdXN0ZXJpbmcgY29sdW1ucyBvZiBhIHRhYmxlIGRlZmluZSB0aGUgY2x1c3RlcmluZyBvcmRlciBmb3IgdGhlIHBhcnRpdGlvbiBvZiB0aGF0IHRhYmxlLiAKLUZvciBhIGdpdmVuIGBwYXJ0aXRpb25gLCBhbGwgcm93cyBhcmUgb3JkZXJlZCBieSB0aGF0IGNsdXN0ZXJpbmcgb3JkZXIuIENsdXN0ZXJpbmcgY29sdW1ucyBhbHNvIGFkZCB1bmlxdWVuZXNzIHRvCi1hIHJvdyBpbiBhIHRhYmxlLgotCi1Gb3IgaW5zdGFuY2UsIGdpdmVuOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2NyZWF0ZV90YWJsZV9jbHVzdGVyY29sdW1uLmNxbFtdCi1pbmNsdWRlOjpleGFtcGxlJENRTC9pbnNlcnRfdGFibGVfY2x1c3RlcmNvbHVtbi5jcWxbXQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvc2VsZWN0X3RhYmxlX2NsdXN0ZXJjb2x1bW4uY3FsW10KLS0tLS0KLQotd2lsbCByZXN1bHQgaW4KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL3NlbGVjdF90YWJsZV9jbHVzdGVyY29sdW1uLnJlc3VsdFtdCi0tLS0tCi08MT4gUm93IDEgaXMgaW4gb25lIHBhcnRpdGlvbiwgYW5kIFJvd3MgMi01IGFyZSBpbiBhIGRpZmZlcmVudCBvbmUuIFRoZSBkaXNwbGF5IG9yZGVyIGlzIGFsc28gZGlmZmVyZW50LgotCi1Mb29raW5nIG1vcmUgY2xvc2VseSBhdCB0aGUgZm91ciByb3dzIGluIHRoZSBzYW1lIHBhcnRpdGlvbiwgdGhlIGBiYCBjbHVzdGVyaW5nIGNvbHVtbiBkZWZpbmVzIHRoZSBvcmRlciBpbiB3aGljaCB0aG9zZSByb3dzIAotYXJlIGRpc3BsYXllZC4gCi1XaGVyZWFzIHRoZSBwYXJ0aXRpb24ga2V5IG9mIHRoZSB0YWJsZSBncm91cHMgcm93cyBvbiB0aGUgc2FtZSBub2RlLCB0aGUgY2x1c3RlcmluZyBjb2x1bW5zIGNvbnRyb2wgCi1ob3cgdGhvc2Ugcm93cyBhcmUgc3RvcmVkIG9uIHRoZSBub2RlLiAKLQotVGhhdCBzb3J0aW5nIGFsbG93cyB0aGUgdmVyeSBlZmZpY2llbnQgcmV0cmlldmFsIG9mIGEgcmFuZ2Ugb2Ygcm93cyB3aXRoaW4gYSBwYXJ0aXRpb246Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvc2VsZWN0X3JhbmdlLmNxbFtdCi0tLS0tCi0KLXdpbGwgcmVzdWx0IGluCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9zZWxlY3RfcmFuZ2UucmVzdWx0W10KLS0tLS0KLQotW1tjcmVhdGUtdGFibGUtb3B0aW9uc11dCi09PT0gVGFibGUgb3B0aW9ucwotCi1BIENRTCB0YWJsZSBoYXMgYSBudW1iZXIgb2Ygb3B0aW9ucyB0aGF0IGNhbiBiZSBzZXQgYXQgY3JlYXRpb24gKGFuZCwKLWZvciBtb3N0IG9mIHRoZW0sIGFsdGVyZWQgbGF0ZXIpLiBUaGVzZSBvcHRpb25zIGFyZSBzcGVjaWZpZWQgYWZ0ZXIgdGhlCi1gV0lUSGAga2V5d29yZC4KLQotT25lIGltcG9ydGFudCBvcHRpb24gdGhhdCBjYW5ub3QgYmUgY2hhbmdlZCBhZnRlciBjcmVhdGlvbiwgYENMVVNURVJJTkcgT1JERVIgQllgLCBpbmZsdWVuY2VzIGhvdyBxdWVyaWVzIGNhbiBiZSBkb25lIGFnYWluc3QgdGhlIHRhYmxlLiBJdCBpcyB3b3J0aCBkaXNjdXNzaW5nIGluIG1vcmUgZGV0YWlsIGhlcmUuCi0KLVtbY2x1c3RlcmluZy1vcmRlcl1dCi09PT09IENsdXN0ZXJpbmcgb3JkZXIKLQotVGhlIGNsdXN0ZXJpbmcgb3JkZXIgb2YgYSB0YWJsZSBpcyBkZWZpbmVkIGJ5IHRoZSBjbHVzdGVyaW5nIGNvbHVtbnMuIAotQnkgZGVmYXVsdCwgdGhlIGNsdXN0ZXJpbmcgb3JkZXIgaXMgYXNjZW5kaW5nIGZvciB0aGUgY2x1c3RlcmluZyBjb2x1bW4ncyBkYXRhIHR5cGVzLiAKLUZvciBleGFtcGxlLCBpbnRlZ2VycyBvcmRlciBmcm9tIDEsIDIsIC4uLiBuLCB3aGlsZSB0ZXh0IG9yZGVycyBmcm9tIEEgdG8gWi4gCi0KLVRoZSBgQ0xVU1RFUklORyBPUkRFUiBCWWAgdGFibGUgb3B0aW9uIHVzZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUKLWNsdXN0ZXJpbmcgY29sdW1ucywgZWFjaCBzZXQgZm9yIGVpdGhlciBgQVNDYCAoZm9yIF9hc2NlbmRpbmdfIG9yZGVyKSBvciBgREVTQ2AgKGZvciBfZGVzY2VuZGluZyBvcmRlcikuCi1UaGUgZGVmYXVsdCBpcyBhc2NlbmRpbmcgZm9yIGFsbCBjbHVzdGVyaW5nIGNvbHVtbnMgaWYgdGhlIGBDTFVTVEVSSU5HIE9SREVSIEJZYCBvcHRpb24gaXMgbm90IHNldC4gCi0KLVRoaXMgb3B0aW9uIGlzIGJhc2ljYWxseSBhIGhpbnQgZm9yIHRoZSBzdG9yYWdlIGVuZ2luZSB0aGF0IGNoYW5nZXMgdGhlIG9yZGVyIGluIHdoaWNoIGl0IHN0b3JlcyB0aGUgcm93LgotQmV3YXJlIG9mIHRoZSBjb25zZXF1ZW5jZXMgb2Ygc2V0dGluZyB0aGlzIG9wdGlvbjoKLQotKiBJdCBjaGFuZ2VzIHRoZSBkZWZhdWx0IGFzY2VuZGluZyBvcmRlciBvZiByZXN1bHRzIHdoZW4gcXVlcmllZCB3aXRoIGEgYFNFTEVDVGAgc3RhdGVtZW50IHdpdGggbm8gYE9SREVSIEJZYCBjbGF1c2UuCi0KLSogSXQgbGltaXRzIGhvdyB0aGUgYE9SREVSIEJZYCBjbGF1c2UgaXMgdXNlZCBpbiBgU0VMRUNUYCBzdGF0ZW1lbnRzIG9uIHRoYXQgdGFibGUuIAotUmVzdWx0cyBjYW4gb25seSBiZSBvcmRlcmVkIHdpdGggZWl0aGVyIHRoZSBvcmlnaW5hbCBjbHVzdGVyaW5nIG9yZGVyIG9yIHRoZSByZXZlcnNlIGNsdXN0ZXJpbmcgb3JkZXIuCi1TdXBwb3NlIHlvdSBjcmVhdGUgYSB0YWJsZSB3aXRoIHR3byBjbHVzdGVyaW5nIGNvbHVtbnMgYGFgIGFuZCBgYmAsIGRlZmluZWQgYFdJVEggQ0xVU1RFUklORyBPUkRFUiBCWSAoYSBERVNDLCBiIEFTQylgLgotUXVlcmllcyBvbiB0aGUgdGFibGUgY2FuIHVzZSBgT1JERVIgQlkgKGEgREVTQywgYiBBU0MpYCBvciBgT1JERVIgQlkgKGEgQVNDLCBiIERFU0MpYC4gCi1NaXhlZCBvcmRlciwgc3VjaCBhcyBgT1JERVIgQlkgKGEgQVNDLCBiIEFTQylgIG9yIGBPUkRFUiBCWSAoYSBERVNDLCBiIERFU0MpYCB3aWxsIG5vdCByZXR1cm4gZXhwZWN0ZWQgb3JkZXIuCi0KLSogSXQgaGFzIGEgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIHF1ZXJpZXMuIFF1ZXJpZXMgaW4gcmV2ZXJzZSBjbHVzdGVyaW5nIG9yZGVyIGFyZSBzbG93ZXIgdGhhbiB0aGUgZGVmYXVsdCBhc2NlbmRpbmcgb3JkZXIuCi1JZiB5b3UgcGxhbiB0byBxdWVyeSBtb3N0bHkgaW4gZGVzY2VuZGluZyBvcmRlciwgZGVjbGFyZSB0aGUgY2x1c3RlcmluZyBvcmRlciBpbiB0aGUgdGFibGUgc2NoZW1hIHVzaW5nIGBXSVRIIENMVVNURVJJTkcgT1JERVIgQlkgKClgLiAKLVRoaXMgb3B0aW1pemF0aW9uIGlzIGNvbW1vbiBmb3IgdGltZSBzZXJpZXMsIHRvIHJldHJpZXZlIHRoZSBkYXRhIGZyb20gbmV3ZXN0IHRvIG9sZGVzdC4KLQotW1tjcmVhdGUtdGFibGUtZ2VuZXJhbC1vcHRpb25zXV0KLT09PT0gT3RoZXIgdGFibGUgb3B0aW9ucwotCi1BIHRhYmxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKLQotW3dpZHRoPSIxMDAlIixjb2xzPSIzMCUsOSUsMTElLDUwJSIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18b3B0aW9uIHwga2luZCB8IGRlZmF1bHQgfCBkZXNjcmlwdGlvbgotCi18IGBjb21tZW50YCB8IF9zaW1wbGVfIHwgbm9uZSB8IEEgZnJlZS1mb3JtLCBodW1hbi1yZWFkYWJsZSBjb21tZW50Ci18IHhyZWY6Y3FsL2RkbC5hZG9jI3NwZWNfcmV0cnlbYHNwZWN1bGF0aXZlX3JldHJ5YF0gfCBfc2ltcGxlXyB8IDk5UEVSQ0VOVElMRSB8IFNwZWN1bGF0aXZlIHJldHJ5IG9wdGlvbnMKLXwgYGNkY2AgfF9ib29sZWFuXyB8ZmFsc2UgfENyZWF0ZSBhIENoYW5nZSBEYXRhIENhcHR1cmUgKENEQykgbG9nIG9uIHRoZSB0YWJsZQotfCBgYWRkaXRpb25hbF93cml0ZV9wb2xpY3lgIHxfc2ltcGxlXyB8OTlQRVJDRU5USUxFIHwgU2FtZSBhcyBgc3BlY3VsYXRpdmVfcmV0cnlgCi18IGBnY19ncmFjZV9zZWNvbmRzYCB8X3NpbXBsZV8gfDg2NDAwMCB8VGltZSB0byB3YWl0IGJlZm9yZSBnYXJiYWdlIGNvbGxlY3RpbmcgdG9tYnN0b25lcyAoZGVsZXRpb24gbWFya2VycykKLXwgYGJsb29tX2ZpbHRlcl9mcF9jaGFuY2VgIHxfc2ltcGxlXyB8MC4wMDA3NSB8VGhlIHRhcmdldCBwcm9iYWJpbGl0eSBvZgotZmFsc2UgcG9zaXRpdmUgb2YgdGhlIHNzdGFibGUgYmxvb20gZmlsdGVycy4gU2FpZCBibG9vbSBmaWx0ZXJzIHdpbGwgYmUKLXNpemVkIHRvIHByb3ZpZGUgdGhlIHByb3ZpZGVkIHByb2JhYmlsaXR5LCB0aHVzIGxvd2VyaW5nIHRoaXMgdmFsdWUKLWltcGFjdCB0aGUgc2l6ZSBvZiBibG9vbSBmaWx0ZXJzIGluLW1lbW9yeSBhbmQgb24tZGlzay4KLXwgYGRlZmF1bHRfdGltZV90b19saXZlYCB8X3NpbXBsZV8gfDAgfERlZmF1bHQgZXhwaXJhdGlvbiB0aW1lICjigJxUVEzigJ0pIGluIHNlY29uZHMgZm9yIGEgdGFibGUKLXwgYGNvbXBhY3Rpb25gIHxfbWFwXyB8X3NlZSBiZWxvd18gfCB4cmVmOm9wZXJhdGluZy9jb21wYWN0aW9uL2luZGV4LmFkb2MjY3FsLWNvbXBhY3Rpb24tb3B0aW9uc1tDb21wYWN0aW9uIG9wdGlvbnNdCi18IGBjb21wcmVzc2lvbmAgfF9tYXBfIHxfc2VlIGJlbG93XyB8IHhyZWY6b3BlcmF0aW5nL2NvbXByZXNzaW9uL2luZGV4LmFkb2MjY3FsLWNvbXByZXNzaW9uLW9wdGlvbnNbQ29tcHJlc3Npb24gb3B0aW9uc10KLXwgYGNhY2hpbmdgIHxfbWFwXyB8X3NlZSBiZWxvd18gfENhY2hpbmcgb3B0aW9ucwotfCBgbWVtdGFibGVfZmx1c2hfcGVyaW9kX2luX21zYCB8X3NpbXBsZV8gfDAgfFRpbWUgKGluIG1zKSBiZWZvcmUgQ2Fzc2FuZHJhIGZsdXNoZXMgbWVtdGFibGVzIHRvIGRpc2sKLXwgYHJlYWRfcmVwYWlyYCB8X3NpbXBsZV8gfEJMT0NLSU5HIHxTZXRzIHJlYWQgcmVwYWlyIGJlaGF2aW9yIChzZWUgYmVsb3cpCi18PT09Ci0KLVtbc3BlY19yZXRyeV1dCi09PT09PSBTcGVjdWxhdGl2ZSByZXRyeSBvcHRpb25zCi0KLUJ5IGRlZmF1bHQsIENhc3NhbmRyYSByZWFkIGNvb3JkaW5hdG9ycyBvbmx5IHF1ZXJ5IGFzIG1hbnkgcmVwbGljYXMgYXMKLW5lY2Vzc2FyeSB0byBzYXRpc2Z5IGNvbnNpc3RlbmN5IGxldmVsczogb25lIGZvciBjb25zaXN0ZW5jeSBsZXZlbAotYE9ORWAsIGEgcXVvcnVtIGZvciBgUVVPUlVNYCwgYW5kIHNvIG9uLiBgc3BlY3VsYXRpdmVfcmV0cnlgIGRldGVybWluZXMKLXdoZW4gY29vcmRpbmF0b3JzIG1heSBxdWVyeSBhZGRpdGlvbmFsIHJlcGxpY2FzLCBhIHVzZWZ1bCBhY3Rpb24gd2hlbgotcmVwbGljYXMgYXJlIHNsb3cgb3IgdW5yZXNwb25zaXZlLiBTcGVjdWxhdGl2ZSByZXRyaWVzIHJlZHVjZSB0aGUgbGF0ZW5jeS4gCi1UaGUgc3BlY3VsYXRpdmVfcmV0cnkgb3B0aW9uIGNvbmZpZ3VyZXMgcmFwaWQgcmVhZCBwcm90ZWN0aW9uLCB3aGVyZSBhIGNvb3JkaW5hdG9yIHNlbmRzIG1vcmUKLXJlcXVlc3RzIHRoYW4gbmVlZGVkIHRvIHNhdGlzZnkgdGhlIGNvbnNpc3RlbmN5IGxldmVsLgotCi1bSU1QT1JUQU5UXQotPT09PQotRnJlcXVlbnRseSByZWFkaW5nIGZyb20gYWRkaXRpb25hbCByZXBsaWNhcyBjYW4gaHVydCBjbHVzdGVyCi1wZXJmb3JtYW5jZS4gV2hlbiBpbiBkb3VidCwga2VlcCB0aGUgZGVmYXVsdCBgOTlQRVJDRU5USUxFYC4KLT09PT0KLQotUHJlLUNhc3NhbmRyYSA0LjAgc3BlY3VsYXRpdmUgcmV0cnkgcG9saWN5IHRha2VzIGEgc2luZ2xlIHN0cmluZyBhcyBhIHBhcmFtZXRlcjoKLQotKiBgTk9ORWAKLSogYEFMV0FZU2AKLSogYDk5UEVSQ0VOVElMRWAgKFBFUkNFTlRJTEUpCi0qIGA1ME1TYCAoQ1VTVE9NKQotCi1BbiBleGFtcGxlIG9mIHNldHRpbmcgc3BlY3VsYXRpdmUgcmV0cnkgc2V0cyBhIGN1c3RvbSB2YWx1ZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9hbHRlcl90YWJsZV9zcGVjX3JldHJ5LmNxbFtdCi0tLS0tCi0KLVRoaXMgZXhhbXBsZSB1c2VzIGEgcGVyY2VudGlsZSBmb3IgdGhlIHNldHRpbmc6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvYWx0ZXJfdGFibGVfc3BlY19yZXRyeV9wZXJjZW50LmNxbFtdCi0tLS0tCi0KLUEgcGVyY2VudGlsZSBzZXR0aW5nIGNhbiBiYWNrZmlyZS4gSWYgYSBzaW5nbGUgaG9zdCBiZWNvbWVzIHVuYXZhaWxhYmxlLCBpdCBjYW4KLWZvcmNlIHVwIHRoZSBwZXJjZW50aWxlcy4gQSB2YWx1ZSBvZiBgcDk5YCB3aWxsIG5vdCBzcGVjdWxhdGUgYXMgaW50ZW5kZWQgYmVjYXVzZSB0aGUgCi12YWx1ZSBhdCB0aGUgc3BlY2lmaWVkIHBlcmNlbnRpbGUgaGFzIGluY3JlYXNlZCB0b28gbXVjaC4gSWYgdGhlIGNvbnNpc3RlbmN5IGxldmVsIGlzIHNldCB0byBgQUxMYCwgYWxsIAotcmVwbGljYXMgYXJlIHF1ZXJpZWQgcmVnYXJkbGVzcyBvZiB0aGUgc3BlY3VsYXRpdmUgcmV0cnkgc2V0dGluZy4gCi0KLUNhc3NhbmRyYSA0LjAgc3VwcG9ydHMgY2FzZS1pbnNlbnNpdGl2aXR5IGZvciBzcGVjdWxhdGl2ZSByZXRyeSB2YWx1ZXMgKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTE0MjkzW0NBU1NBTkRSQS0xNDI5M10pLiBGb3IgZXhhbXBsZSwgYXNzaWduaW5nIHRoZSB2YWx1ZSBhcyBgbm9uZWAsIGBOb25lYCwgb3IgYE5PTkVgIGhhcyB0aGUgc2FtZSBlZmZlY3QuCi0KLUFkZGl0aW9uYWxseSwgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGFkZGVkOgotCi1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfEZvcm1hdCB8RXhhbXBsZSB8RGVzY3JpcHRpb24KLXwgYFhQRVJDRU5USUxFYCB8IDkwLjVQRVJDRU5USUxFIHwgQ29vcmRpbmF0b3JzIHJlY29yZCBhdmVyYWdlIHBlci10YWJsZSByZXNwb25zZSB0aW1lcwotZm9yIGFsbCByZXBsaWNhcy4gSWYgYSByZXBsaWNhIHRha2VzIGxvbmdlciB0aGFuIGBYYCBwZXJjZW50IG9mIHRoaXMKLXRhYmxlJ3MgYXZlcmFnZSByZXNwb25zZSB0aW1lLCB0aGUgY29vcmRpbmF0b3IgcXVlcmllcyBhbiBhZGRpdGlvbmFsCi1yZXBsaWNhLiBgWGAgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMC4KLXwgYFhQYCB8IDkwLjVQIHwgU2FtZSBhcyBgWFBFUkNFTlRJTEVgCi18IGBZbXNgIHwgMjVtcyB8IElmIGEgcmVwbGljYSB0YWtlcyBtb3JlIHRoYW4gYFlgIG1pbGxpc2Vjb25kcyB0byByZXNwb25kLCB0aGUKLWNvb3JkaW5hdG9yIHF1ZXJpZXMgYW4gYWRkaXRpb25hbCByZXBsaWNhLgotfCBgTUlOKFhQRVJDRU5USUxFLFlNUylgIHwgTUlOKDk5UEVSQ0VOVElMRSwzNU1TKSB8IEEgaHlicmlkIHBvbGljeSB0aGF0IHVzZXMgZWl0aGVyIHRoZQotc3BlY2lmaWVkIHBlcmNlbnRpbGUgb3IgZml4ZWQgbWlsbGlzZWNvbmRzIGRlcGVuZGluZyBvbiB3aGljaCB2YWx1ZSBpcwotbG93ZXIgYXQgdGhlIHRpbWUgb2YgY2FsY3VsYXRpb24uIFBhcmFtZXRlcnMgYXJlIGBYUEVSQ0VOVElMRWAsIGBYUGAsIG9yCi1gWW1zYC4gVGhpcyBzZXR0aW5nIGhlbHBzIHByb3RlY3QgYWdhaW5zdCBhIHNpbmdsZSBzbG93IGluc3RhbmNlLgotCi18IGBNQVgoWFBFUkNFTlRJTEUsWU1TKWAgYEFMV0FZU2AgYE5FVkVSYCB8IE1BWCg5MC41UCwyNW1zKSB8IEEgaHlicmlkIHBvbGljeSB0aGF0IHVzZXMgZWl0aGVyIHRoZSBzcGVjaWZpZWQKLXBlcmNlbnRpbGUgb3IgZml4ZWQgbWlsbGlzZWNvbmRzIGRlcGVuZGluZyBvbiB3aGljaCB2YWx1ZSBpcyBoaWdoZXIgYXQKLXRoZSB0aW1lIG9mIGNhbGN1bGF0aW9uLiAKLXw9PT0KLQotQ2Fzc2FuZHJhIDQuMCBhZGRzIHN1cHBvcnQgZm9yIGh5YnJpZCBgTUlOKClgIGFuZCBgTUFYKClgIHNwZWN1bGF0aXZlIHJldHJ5IHBvbGljaWVzLCB3aXRoIGEgbWl4IGFuZCBtYXRjaCBvZiBlaXRoZXIgYE1JTigpLCBNQVgoKWAsIGBNSU4oKSwgTUlOKClgLCBvciBgTUFYKCksIE1BWCgpYCAoaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMTQyOTNbQ0FTU0FORFJBLTE0MjkzXSkuCi1UaGUgaHlicmlkIG1vZGUgd2lsbCBzdGlsbCBzcGVjdWxhdGUgaWYgdGhlIG5vcm1hbCBgcDk5YCBmb3IgdGhlIHRhYmxlIGlzIDwgNTBtcywgdGhlIG1pbmltdW0gdmFsdWUuCi1CdXQgaWYgdGhlIGBwOTlgIGxldmVsIGdvZXMgaGlnaGVyIHRoYW4gdGhlIG1heGltdW0gdmFsdWUsIHRoZW4gdGhhdCB2YWx1ZSBjYW4gYmUgdXNlZC4gCi1JbiBhIGh5YnJpZCB2YWx1ZSwgb25lIHZhbHVlIG11c3QgYmUgYSBmaXhlZCB0aW1lIChtcykgdmFsdWUgYW5kIHRoZSBvdGhlciBhIHBlcmNlbnRpbGUgdmFsdWUuCi0KLVRvIGlsbHVzdHJhdGUgdmFyaWF0aW9ucywgdGhlIGZvbGxvd2luZyBleGFtcGxlcyBhcmUgYWxsIHZhbGlkOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML3NwZWNfcmV0cnlfdmFsdWVzLmNxbFtdCi0tLS0tCi0KLVRoZSBgYWRkaXRpb25hbF93cml0ZV9wb2xpY3lgIHNldHRpbmcgc3BlY2lmaWVzIHRoZSB0aHJlc2hvbGQgYXQgd2hpY2ggYSBjaGVhcAotcXVvcnVtIHdyaXRlIHdpbGwgYmUgdXBncmFkZWQgdG8gaW5jbHVkZSB0cmFuc2llbnQgcmVwbGljYXMuCi0KLVtbY3FsLWNvbXBhY3Rpb24tb3B0aW9uc11dCi09PT09PSBDb21wYWN0aW9uIG9wdGlvbnMKLQotVGhlIGBjb21wYWN0aW9uYCBvcHRpb25zIG11c3QgbWluaW1hbGx5IGRlZmluZSB0aGUgYCdjbGFzcydgIHN1Yi1vcHRpb24sCi10byBzcGVjaWZ5IHRoZSBjb21wYWN0aW9uIHN0cmF0ZWd5IGNsYXNzIHRvIHVzZS4gCi1UaGUgc3VwcG9ydGVkIGNsYXNzZXMgYXJlOiAKLQotKiBgJ1NpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3knYCwgeHJlZjpvcGVyYXRpbmcvY29tcGFjdGlvbi9zdGNzLmFkb2Mjc3Rjc1tTVENTXSAoRGVmYXVsdCkKLSogYCdMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5J2AsIHhyZWY6b3BlcmF0aW5nL2NvbXBhY3Rpb24vbGNzLmFkb2MjbGNzW0xDU10KLSogYCdUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5J2AsIHhyZWY6b3BlcmF0aW5nL2NvbXBhY3Rpb24vdHdjcy5hZG9jI3R3Y3NbVFdDU10gCi0KLVRoZSBgJ0RhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3knYCBpcyBhbHNvIHN1cHBvcnRlZCBidXQgZGVwcmVjYXRlZDsKLWAnVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneSdgIHNob3VsZCBiZSB1c2VkLiAKLUlmIGEgY3VzdG9tIHN0cmF0ZWdpZXMgaXMgcmVxdWlyZWQsIHNwZWNpZnkgdGhlIGZ1bGwgY2xhc3MgbmFtZSBhcyBhIHhyZWY6Y3FsL2RlZmluaXRpb25zLmFkb2MjY29uc3RhbnRzW3N0cmluZyBjb25zdGFudF0uICAKLQotQWxsIGRlZmF1bHQgc3RyYXRlZ2llcyBzdXBwb3J0IGEgbnVtYmVyIG9mIHhyZWY6b3BlcmF0aW5nL2NvbXBhY3Rpb24vaW5kZXguYWRvYyNjb21wYWN0aW9uLW9wdGlvbnNbY29tbW9uIG9wdGlvbnNdLCBhcyB3ZWxsIGFzIG9wdGlvbnMgc3BlY2lmaWMgdG8gdGhlIHN0cmF0ZWd5IGNob3Nlbi4gU2VlIHRoZSBzZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8geW91ciBzdHJhdGVneSBmb3IgZGV0YWlsczogeHJlZjpvcGVyYXRpbmcvY29tcGFjdGlvbi9zdGNzLmFkb2Mjc3Rjc19vcHRpb25zW1NUQ1NdLCB4cmVmOm9wZXJhdGluZy9jb21wYWN0aW9uL2xjcy5hZG9jI2xjc19vcHRpb25zW0xDU10sIHhyZWY6b3BlcmF0aW5nL2NvbXBhY3Rpb24vdHdjcy5hZG9jI3R3Y3Nfb3B0aW9uc1tUV0NTXS4KLQotW1tjcWwtY29tcHJlc3Npb24tb3B0aW9uc11dCi09PT09PSBDb21wcmVzc2lvbiBvcHRpb25zCi0KLVRoZSBgY29tcHJlc3Npb25gIG9wdGlvbnMgZGVmaW5lIGlmIGFuZCBob3cgdGhlIFNTVGFibGVzIG9mIHRoZSB0YWJsZQotYXJlIGNvbXByZXNzZWQuIENvbXByZXNzaW9uIGlzIGNvbmZpZ3VyZWQgb24gYSBwZXItdGFibGUgYmFzaXMgYXMgYW4KLW9wdGlvbmFsIGFyZ3VtZW50IHRvIGBDUkVBVEUgVEFCTEVgIG9yIGBBTFRFUiBUQUJMRWAuIFRoZSBmb2xsb3dpbmcKLXN1Yi1vcHRpb25zIGFyZSBhdmFpbGFibGU6Ci0KLVtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18T3B0aW9uIHxEZWZhdWx0IHxEZXNjcmlwdGlvbgotfCBgY2xhc3NgIHwgTFo0Q29tcHJlc3NvciB8IFRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gdG8gdXNlLiBEZWZhdWx0IGNvbXByZXNzb3IgYXJlOiBMWjRDb21wcmVzc29yLAotU25hcHB5Q29tcHJlc3NvciwgRGVmbGF0ZUNvbXByZXNzb3IgYW5kIFpzdGRDb21wcmVzc29yLiAKLVVzZSBgJ2VuYWJsZWQnIDogZmFsc2VgIHRvIGRpc2FibGUgY29tcHJlc3Npb24uIAotQ3VzdG9tIGNvbXByZXNzb3IgY2FuIGJlIHByb3ZpZGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZ1bGwgY2xhc3MgbmFtZSBhcyBhIHhyZWY6Y3FsL2RlZmluaXRpb25zLmFkb2MjY29uc3RhbnRzW3N0cmluZyBjb25zdGFudF0uCi0KLXwgYGVuYWJsZWRgIHwgdHJ1ZSB8IEVuYWJsZS9kaXNhYmxlIHNzdGFibGUgY29tcHJlc3Npb24uIAotSWYgdGhlIGBlbmFibGVkYCBvcHRpb24gaXMgc2V0IHRvIGBmYWxzZWAsIG5vIG90aGVyIG9wdGlvbnMgbXVzdCBiZSBzcGVjaWZpZWQuCi0KLXwgYGNodW5rX2xlbmd0aF9pbl9rYmAgfCA2NCB8IE9uIGRpc2sgU1NUYWJsZXMgYXJlIGNvbXByZXNzZWQgYnkgYmxvY2sgKHRvIGFsbG93IHJhbmRvbSByZWFkcykuIAotVGhpcyBvcHRpb24gZGVmaW5lcyB0aGUgc2l6ZSAoaW4gS0IpIG9mIHNhaWQgYmxvY2suIFNlZSB4cmVmOmNxbC9kZGwuYWRvYyNjaHVua19ub3RlW25vdGVdIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgotCi18IGBjcmNfY2hlY2tfY2hhbmNlYCB8IDEuMCB8IERldGVybWluZXMgaG93IGxpa2VseSBDYXNzYW5kcmEgaXMgdG8gdmVyaWZ5IHRoZSBjaGVja3N1bSBvbiBlYWNoCi1jb21wcmVzc2lvbiBjaHVuayBkdXJpbmcgcmVhZHMuCi0KLXwgYGNvbXByZXNzaW9uX2xldmVsYCB8IDMgfCBDb21wcmVzc2lvbiBsZXZlbC4gT25seSBhcHBsaWNhYmxlIGZvciBgWnN0ZENvbXByZXNzb3JgLiAgCi1BY2NlcHRzIHZhbHVlcyBiZXR3ZWVuIGAtMTMxMDcyYCBhbmQgYDIyYC4KLXw9PT0KLQotW1tjaHVua19ub3RlXV0KLVtOT1RFXQotPT09PQotQmlnZ2VyIHZhbHVlcyBtYXkgaW1wcm92ZSB0aGUgY29tcHJlc3Npb24gcmF0ZSwgYnV0IHdpbGwgaW5jcmVhc2UgdGhlIG1pbmltdW0gc2l6ZSBvZiBkYXRhIHRvIGJlIHJlYWQgZnJvbQotZGlzayBmb3IgYSByZWFkLiAKLVRoZSBkZWZhdWx0IHZhbHVlIGlzIGFuIG9wdGltYWwgdmFsdWUgZm9yIGNvbXByZXNzaW5nIHRhYmxlcy4gCi1DaHVuayBsZW5ndGggbXVzdCBiZSBhIHBvd2VyIG9mIDIgd2hlbiBjb21wdXRpbmcgdGhlIGNodW5rIG51bWJlciBmcm9tIGFuIHVuY29tcHJlc3NlZCBmaWxlIG9mZnNldC4gCi1CbG9jayBzaXplIG1heSBiZSBhZGp1c3RlZCBiYXNlZCBvbiByZWFkL3dyaXRlIGFjY2VzcyBwYXR0ZXJucyBzdWNoIGFzOgotCi0qIEhvdyBtdWNoIGRhdGEgaXMgdHlwaWNhbGx5IHJlcXVlc3RlZCBhdCBvbmNlCi0qIEF2ZXJhZ2Ugc2l6ZSBvZiByb3dzIGluIHRoZSB0YWJsZQotPT09PQotCi1Gb3IgaW5zdGFuY2UsIHRvIGNyZWF0ZSBhIHRhYmxlIHdpdGggTFo0Q29tcHJlc3NvciBhbmQgYSBgY2h1bmtfbGVuZ3RoX2luX2tiYCBvZiA0IEtCOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2NodW5rX2xlbmd0aC5jcWxbXQotLS0tLQotCi1bW2NxbC1jYWNoaW5nLW9wdGlvbnNdXQotPT09PT0gQ2FjaGluZyBvcHRpb25zCi0KLUNhY2hpbmcgb3B0aW1pemVzIHRoZSB1c2Ugb2YgY2FjaGUgbWVtb3J5IG9mIGEgdGFibGUuIFRoZSBjYWNoZWQgZGF0YSBpcwotd2VpZ2hlZCBieSBzaXplIGFuZCBhY2Nlc3MgZnJlcXVlbmN5LiAKLVRoZSBgY2FjaGluZ2Agb3B0aW9ucyBjYW4gY29uZmlndXJlIGJvdGggdGhlIGBrZXkgY2FjaGVgIGFuZCB0aGUgYHJvdyBjYWNoZWAgZm9yIHRoZSB0YWJsZS4gCi1UaGUgZm9sbG93aW5nIHN1Yi1vcHRpb25zIGFyZSBhdmFpbGFibGU6Ci0KLVtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18T3B0aW9uIHxEZWZhdWx0IHxEZXNjcmlwdGlvbgotfCBga2V5c2AgfCBBTEwgfCBXaGV0aGVyIHRvIGNhY2hlIGtleXMgKGtleSBjYWNoZSkgZm9yIHRoaXMgdGFibGUuIFZhbGlkIHZhbHVlcyBhcmU6IGBBTExgIGFuZCBgTk9ORWAuCi0KLXwgYHJvd3NfcGVyX3BhcnRpdGlvbmAgfCBOT05FIHwgVGhlIGFtb3VudCBvZiByb3dzIHRvIGNhY2hlIHBlciBwYXJ0aXRpb24gKHJvdyBjYWNoZSkuIAotSWYgYW4gaW50ZWdlciBgbmAgaXMgc3BlY2lmaWVkLCB0aGUgZmlyc3QgYG5gIHF1ZXJpZWQgcm93cyBvZiBhIHBhcnRpdGlvbiB3aWxsIGJlIGNhY2hlZC4gCi1WYWxpZCB2YWx1ZXMgYXJlOiBgQUxMYCwgdG8gY2FjaGUgYWxsIHJvd3Mgb2YgYSBxdWVyaWVkIHBhcnRpdGlvbiwgb3IgYE5PTkVgIHRvIGRpc2FibGUgcm93IGNhY2hpbmcuCi18PT09Ci0KLUZvciBpbnN0YW5jZSwgdG8gY3JlYXRlIGEgdGFibGUgd2l0aCBib3RoIGEga2V5IGNhY2hlIGFuZCAxMCByb3dzIGNhY2hlZCBwZXIgcGFydGl0aW9uOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2NhY2hpbmdfb3B0aW9uLmNxbFtdCi0tLS0tCi0KLVtbcmVhZC1yZXBhaXItb3B0aW9uc11dCi09PT09PSBSZWFkIFJlcGFpciBvcHRpb25zCi0KLVRoZSBgcmVhZF9yZXBhaXJgIG9wdGlvbnMgY29uZmlndXJlIHRoZSByZWFkIHJlcGFpciBiZWhhdmlvciwgdHVuaW5nIGZvciB2YXJpb3VzIHBlcmZvcm1hbmNlIGFuZCBjb25zaXN0ZW5jeSBiZWhhdmlvcnMuIAotCi1UaGUgdmFsdWVzIGFyZToKLVtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18T3B0aW9uIHxEZWZhdWx0IHxEZXNjcmlwdGlvbgotfGBCTE9DS0lOR2AgfCB5ZXMgfCBJZiBhIHJlYWQgcmVwYWlyIGlzIHRyaWdnZXJlZCwgdGhlIHJlYWQgYmxvY2tzIHdyaXRlcyBzZW50IHRvIG90aGVyIHJlcGxpY2FzIHVudGlsIHRoZSBjb25zaXN0ZW5jeSBsZXZlbCBpcyByZWFjaGVkIGJ5IHRoZSB3cml0ZXMuCi0KLXxgTk9ORWAgfCBubyB8IElmIHNldCwgdGhlIGNvb3JkaW5hdG9yIHJlY29uY2lsZXMgYW55IGRpZmZlcmVuY2VzIGJldHdlZW4gcmVwbGljYXMsIGJ1dCBkb2Vzbid0IGF0dGVtcHQgdG8gcmVwYWlyIHRoZW0uCi18PT09Ci0KLVR3byBjb25zaXN0ZW5jeSBwcm9wZXJ0aWVzIGFyZSBhZmZlY3RlZCBieSByZWFkIHJlcGFpciBiZWhhdmlvci4KLQotKiBNb25vdG9uaWMgcXVvcnVtIHJlYWRzOiBNb25vdG9uaWMgcXVvcnVtIHJlYWRzCi1wcmV2ZW50cyByZWFkcyBmcm9tIGFwcGVhcmluZyB0byBnbyBiYWNrIGluIHRpbWUgaW4gc29tZSBjaXJjdW1zdGFuY2VzLgotV2hlbiBtb25vdG9uaWMgcXVvcnVtIHJlYWRzIGFyZSBub3QgcHJvdmlkZWQgYW5kIGEgd3JpdGUgZmFpbHMgdG8gcmVhY2gKLWEgcXVvcnVtIG9mIHJlcGxpY2FzLCB0aGUgcmVhZCB2YWx1ZXMgbWF5IGJlIHZpc2libGUgaW4gb25lIHJlYWQsIGFuZCB0aGVuIGRpc2FwcGVhcgotaW4gYSBzdWJzZXF1ZW50IHJlYWQuIGBCTE9DS0lOR2AgcHJvdmlkZXMgdGhpcyBiZWhhdmlvci4KLSogV3JpdGUgYXRvbWljaXR5OiBXcml0ZSBhdG9taWNpdHkgcHJldmVudHMgcmVhZHMKLWZyb20gcmV0dXJuaW5nIHBhcnRpYWxseS1hcHBsaWVkIHdyaXRlcy4gQ2Fzc2FuZHJhIGF0dGVtcHRzIHRvIHByb3ZpZGUKLXBhcnRpdGlvbi1sZXZlbCB3cml0ZSBhdG9taWNpdHksIGJ1dCBzaW5jZSBvbmx5IHRoZSBkYXRhIGNvdmVyZWQgYnkgYQotU0VMRUNUIHN0YXRlbWVudCBpcyByZXBhaXJlZCBieSBhIHJlYWQgcmVwYWlyLCByZWFkIHJlcGFpciBjYW4gYnJlYWsKLXdyaXRlIGF0b21pY2l0eSB3aGVuIGRhdGEgaXMgcmVhZCBhdCBhIG1vcmUgZ3JhbnVsYXIgbGV2ZWwgdGhhbiBpdCBpcwotd3JpdHRlbi4gRm9yIGV4YW1wbGUsIHJlYWQgcmVwYWlyIGNhbiBicmVhayB3cml0ZSBhdG9taWNpdHkgaWYgeW91IHdyaXRlCi1tdWx0aXBsZSByb3dzIHRvIGEgY2x1c3RlcmVkIHBhcnRpdGlvbiBpbiBhIGJhdGNoLCBidXQgdGhlbiBzZWxlY3QgYQotc2luZ2xlIHJvdyBieSBzcGVjaWZ5aW5nIHRoZSBjbHVzdGVyaW5nIGNvbHVtbiBpbiBhIFNFTEVDVCBzdGF0ZW1lbnQuCi1gTk9ORWAgcHJvdmlkZXMgdGhpcyBiZWhhdmlvci4KLQotPT09PT0gT3RoZXIgY29uc2lkZXJhdGlvbnM6Ci0KLSogQWRkaW5nIG5ldyBjb2x1bW5zIChzZWUgYEFMVEVSIFRBQkxFYCBiZWxvdykgaXMgYSBjb25zdGFudCB0aW1lCi1vcGVyYXRpb24uIFRodXMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gYW50aWNpcGF0ZSBmdXR1cmUgdXNhZ2Ugd2hpbGUgaW5pdGlhbGx5IGNyZWF0aW5nIGEgdGFibGUuCi0KLVtbYWx0ZXItdGFibGUtc3RhdGVtZW50XV0KLT09IEFMVEVSIFRBQkxFCi0KLUFsdGVyaW5nIGFuIGV4aXN0aW5nIHRhYmxlIHVzZXMgdGhlIGBBTFRFUiBUQUJMRWAgc3RhdGVtZW50OgotCi1bc291cmNlLGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2FsdGVyX3RhYmxlLmJuZltdCi0tLS0tCi1JZiB0aGUgdGFibGUgZG9lcyBub3QgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgotCi1Gb3IgZXhhbXBsZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9hbHRlcl90YWJsZV9hZGRfY29sdW1uLmNxbFtdCi1pbmNsdWRlOjpleGFtcGxlJENRTC9hbHRlcl90YWJsZV93aXRoX2NvbW1lbnQuY3FsW10KLS0tLS0KLQotVGhlIGBBTFRFUiBUQUJMRWAgc3RhdGVtZW50IGNhbjoKLQotKiBgQUREYCBhIG5ldyBjb2x1bW4gdG8gYSB0YWJsZS4gVGhlIHByaW1hcnkga2V5IG9mIGEgdGFibGUgY2Fubm90IGV2ZXIgYmUgYWx0ZXJlZC4KLUEgbmV3IGNvbHVtbiwgdGh1cywgY2Fubm90IGJlIHBhcnQgb2YgdGhlIHByaW1hcnkga2V5LiAKLUFkZGluZyBhIGNvbHVtbiBpcyBhIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uIGJhc2VkIG9uIHRoZSBhbW91bnQgb2YgZGF0YSBpbiB0aGUgdGFibGUuCi1JZiB0aGUgbmV3IGNvbHVtbiBhbHJlYWR5IGV4aXN0cywgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBOT1QgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgotKiBgRFJPUGAgYSBjb2x1bW4gZnJvbSBhIHRhYmxlLiBUaGlzIGNvbW1hbmQgZHJvcHMgYm90aCB0aGUgY29sdW1uIGFuZCBhbGwKLWl0cyBjb250ZW50LiBCZSBhd2FyZSB0aGF0LCB3aGlsZSB0aGUgY29sdW1uIGJlY29tZXMgaW1tZWRpYXRlbHkKLXVuYXZhaWxhYmxlLCBpdHMgY29udGVudCBhcmUgcmVtb3ZlZCBsYXppbHkgZHVyaW5nIGNvbXBhY3Rpb24uIEJlY2F1c2Ugb2YgdGhpcyBsYXp5IHJlbW92YWwsCi10aGUgY29tbWFuZCBpcyBhIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uIGJhc2VkIG9uIHRoZSBhbW91bnQgb2YgZGF0YSBpbiB0aGUgdGFibGUuIAotQWxzbywgaXQgaXMgaW1wb3J0YW50IHRvIGtub3cgdGhhdCBvbmNlIGEgY29sdW1uIGlzIGRyb3BwZWQsIGEgY29sdW1uIHdpdGggdGhlIHNhbWUgbmFtZSBjYW4gYmUgcmUtYWRkZWQsCi11bmxlc3MgdGhlIGRyb3BwZWQgY29sdW1uIHdhcyBhIG5vbi1mcm96ZW4gY29sdW1uIGxpa2UgYSBjb2xsZWN0aW9uLgotSWYgdGhlIGRyb3BwZWQgY29sdW1uIGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgotCi1bV0FSTklOR10KLS5XYXJuaW5nCi09PT09Ci1Ecm9wcGluZyBhIGNvbHVtbiBhc3N1bWVzIHRoYXQgdGhlIHRpbWVzdGFtcHMgdXNlZCBmb3IgdGhlIHZhbHVlIG9mIHRoaXMKLWNvbHVtbiBhcmUgInJlYWwiIHRpbWVzdGFtcCBpbiBtaWNyb3NlY29uZHMuIFVzaW5nICJyZWFsIiB0aW1lc3RhbXBzIGluCi1taWNyb3NlY29uZHMgaXMgdGhlIGRlZmF1bHQgaXMgYW5kIGlzICpzdHJvbmdseSogcmVjb21tZW5kZWQgYnV0IGFzCi1DYXNzYW5kcmEgYWxsb3dzIHRoZSBjbGllbnQgdG8gcHJvdmlkZSBhbnkgdGltZXN0YW1wIG9uIGFueSB0YWJsZSwgaXQgaXMKLXRoZW9yZXRpY2FsbHkgcG9zc2libGUgdG8gdXNlIGFub3RoZXIgY29udmVudGlvbi4gUGxlYXNlIGJlIGF3YXJlIHRoYXQKLWlmIHlvdSBkbyBzbywgZHJvcHBpbmcgYSBjb2x1bW4gd2lsbCBub3QgY29ycmVjdGx5IGV4ZWN1dGUuCi09PT09Ci0KLSogYFJFTkFNRWAgYSBwcmltYXJ5IGtleSBjb2x1bW4gb2YgYSB0YWJsZS4gTm9uIHByaW1hcnkga2V5IGNvbHVtbnMgY2Fubm90IGJlIHJlbmFtZWQuCi1GdXJ0aGVybW9yZSwgcmVuYW1pbmcgYSBjb2x1bW4gdG8gYW5vdGhlciBuYW1lIHdoaWNoIGFscmVhZHkgZXhpc3RzIGlzbid0IGFsbG93ZWQuCi1JdCdzIGltcG9ydGFudCB0byBrZWVwIGluIG1pbmQgdGhhdCByZW5hbWVkIGNvbHVtbnMgc2hvdWxkbid0IGhhdmUgZGVwZW5kZW50IHNlY29uZGF5IGluZGV4ZXMuCi1JZiB0aGUgcmVuYW1lZCBjb2x1bW4gZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCi0KLSogVXNlIGBXSVRIYCB0byBjaGFuZ2UgYSB0YWJsZSBvcHRpb24uIFRoZSB4cmVmOkNRTC9kZGwuYWRvYyNjcmVhdGUtdGFibGUtb3B0aW9uc1tzdXBwb3J0ZWQgb3B0aW9uc10KLWFyZSB0aGUgc2FtZSBhcyB0aG9zZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSB0YWJsZSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGBDTFVTVEVSSU5HIE9SREVSYC4KLUhvd2V2ZXIsIHNldHRpbmcgYW55IGBjb21wYWN0aW9uYCBzdWItb3B0aW9ucyB3aWxsIGVyYXNlICpBTEwqIHByZXZpb3VzIGBjb21wYWN0aW9uYCBvcHRpb25zLCBzbyB5b3UgbmVlZCB0byByZS1zcGVjaWZ5Ci1hbGwgdGhlIHN1Yi1vcHRpb25zIHlvdSB3aXNoIHRvIGtlZXAuIFRoZSBzYW1lIGlzIHRydWUgZm9yIGBjb21wcmVzc2lvbmAgc3ViLW9wdGlvbnMuCi0KLVtbZHJvcC10YWJsZS1zdGF0ZW1lbnRdXQotPT0gRFJPUCBUQUJMRQotCi1Ecm9wcGluZyBhIHRhYmxlIHVzZXMgdGhlIGBEUk9QIFRBQkxFYCBzdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvZHJvcF90YWJsZS5ibmZbXQotLS0tLQotCi1Ecm9wcGluZyBhIHRhYmxlIHJlc3VsdHMgaW4gdGhlIGltbWVkaWF0ZSwgaXJyZXZlcnNpYmxlIHJlbW92YWwgb2YgdGhlCi10YWJsZSwgaW5jbHVkaW5nIGFsbCBkYXRhIGl0IGNvbnRhaW5zLgotCi1JZiB0aGUgdGFibGUgZG9lcyBub3QgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcwotYElGIEVYSVNUU2AgaXMgdXNlZCwgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCi0KLVtbdHJ1bmNhdGUtc3RhdGVtZW50XV0KLT09IFRSVU5DQVRFCi0KLUEgdGFibGUgY2FuIGJlIHRydW5jYXRlZCB1c2luZyB0aGUgYFRSVU5DQVRFYCBzdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvdHJ1bmNhdGVfdGFibGUuYm5mW10KLS0tLS0KLQotYFRSVU5DQVRFIFRBQkxFIGZvb2AgaXMgdGhlIHByZWZlcnJlZCBzeW50YXggZm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgRERMCi1zdGF0ZW1lbnRzLiAKLUhvd2V2ZXIsIHRhYmxlcyBhcmUgdGhlIG9ubHkgb2JqZWN0IHRoYXQgY2FuIGJlIHRydW5jYXRlZCBjdXJyZW50bHksIGFuZCB0aGUgYFRBQkxFYCBrZXl3b3JkIGNhbiBiZSBvbWl0dGVkLgotCi1UcnVuY2F0aW5nIGEgdGFibGUgcGVybWFuZW50bHkgcmVtb3ZlcyBhbGwgZXhpc3RpbmcgZGF0YSBmcm9tIHRoZSB0YWJsZSwgYnV0IHdpdGhvdXQgcmVtb3ZpbmcgdGhlIHRhYmxlIGl0c2VsZi4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvZGVmaW5pdGlvbnMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvZGVmaW5pdGlvbnMuYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTViZTIwZi4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL2RlZmluaXRpb25zLmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotPSBEZWZpbml0aW9ucwotCi09PSBDb252ZW50aW9ucwotCi1UbyBhaWQgaW4gc3BlY2lmeWluZyB0aGUgQ1FMIHN5bnRheCwgd2Ugd2lsbCB1c2UgdGhlIGZvbGxvd2luZwotY29udmVudGlvbnMgaW4gdGhpcyBkb2N1bWVudDoKLQotKiBMYW5ndWFnZSBydWxlcyB3aWxsIGJlIGdpdmVuIGluIGFuIGluZm9ybWFsCi1odHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JhY2t1cyVFMiU4MCU5M05hdXJfRm9ybSNWYXJpYW50c1tCTkYKLXZhcmlhbnRdIG5vdGF0aW9uLiBJbiBwYXJ0aWN1bGFyLCB3ZSdsbCB1c2Ugc3F1YXJlIGJyYWtldHMgKGBbIGl0ZW0gXWApCi1mb3Igb3B0aW9uYWwgaXRlbXMsIGAqYCBhbmQgYCtgIGZvciByZXBlYXRlZCBpdGVtcyAod2hlcmUgYCtgIGltcGx5IGF0Ci1sZWFzdCBvbmUpLgotKiBUaGUgZ3JhbW1hciB3aWxsIGFsc28gdXNlIHRoZSBmb2xsb3dpbmcgY29udmVudGlvbiBmb3IgY29udmVuaWVuY2U6Ci1ub24tdGVybWluYWwgdGVybSB3aWxsIGJlIGxvd2VyY2FzZSAoYW5kIGxpbmsgdG8gdGhlaXIgZGVmaW5pdGlvbikgd2hpbGUKLXRlcm1pbmFsIGtleXdvcmRzIHdpbGwgYmUgcHJvdmlkZWQgImFsbCBjYXBzIi4gTm90ZSBob3dldmVyIHRoYXQKLWtleXdvcmRzIGFyZSBgaWRlbnRpZmllcnNgIGFuZCBhcmUgdGh1cyBjYXNlIGluc2Vuc2l0aXZlIGluIHByYWN0aWNlLiBXZQotd2lsbCBhbHNvIGRlZmluZSBzb21lIGVhcmx5IGNvbnN0cnVjdGlvbiB1c2luZyByZWdleHAsIHdoaWNoIHdlJ2xsCi1pbmRpY2F0ZSB3aXRoIGByZSg8c29tZSByZWd1bGFyIGV4cHJlc3Npb24+KWAuCi0qIFRoZSBncmFtbWFyIGlzIHByb3ZpZGVkIGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzIGFuZCBsZWF2ZSBzb21lCi1taW5vciBkZXRhaWxzIG91dC4gRm9yIGluc3RhbmNlLCB0aGUgY29tbWEgb24gdGhlIGxhc3QgY29sdW1uIGRlZmluaXRpb24KLWluIGEgYENSRUFURSBUQUJMRWAgc3RhdGVtZW50IGlzIG9wdGlvbmFsIGJ1dCBzdXBwb3J0ZWQgaWYgcHJlc2VudCBldmVuCi10aG91Z2ggdGhlIGdyYW1tYXIgaW4gdGhpcyBkb2N1bWVudCBzdWdnZXN0cyBvdGhlcndpc2UuIEFsc28sIG5vdAotZXZlcnl0aGluZyBhY2NlcHRlZCBieSB0aGUgZ3JhbW1hciBpcyBuZWNlc3NhcmlseSB2YWxpZCBDUUwuCi0qIFJlZmVyZW5jZXMgdG8ga2V5d29yZHMgb3IgcGllY2VzIG9mIENRTCBjb2RlIGluIHJ1bm5pbmcgdGV4dCB3aWxsIGJlCi1zaG93biBpbiBhIGBmaXhlZC13aWR0aCBmb250YC4KLQotW1tpZGVudGlmaWVyc11dCi09PSBJZGVudGlmaWVycyBhbmQga2V5d29yZHMKLQotVGhlIENRTCBsYW5ndWFnZSB1c2VzIF9pZGVudGlmaWVyc18gKG9yIF9uYW1lc18pIHRvIGlkZW50aWZ5IHRhYmxlcywKLWNvbHVtbnMgYW5kIG90aGVyIG9iamVjdHMuIEFuIGlkZW50aWZpZXIgaXMgYSB0b2tlbiBtYXRjaGluZyB0aGUgcmVndWxhcgotZXhwcmVzc2lvbiBgW2EtekEtWl1bYS16QS1aMC05X10qYC4KLQotQSBudW1iZXIgb2Ygc3VjaCBpZGVudGlmaWVycywgbGlrZSBgU0VMRUNUYCBvciBgV0lUSGAsIGFyZSBfa2V5d29yZHNfLgotVGhleSBoYXZlIGEgZml4ZWQgbWVhbmluZyBmb3IgdGhlIGxhbmd1YWdlIGFuZCBtb3N0IGFyZSByZXNlcnZlZC4gVGhlCi1saXN0IG9mIHRob3NlIGtleXdvcmRzIGNhbiBiZSBmb3VuZCBpbiB4cmVmOmNxbC9hcHBlbmRpY2VzLmFkb2MjYXBwZW5kaXgtQVtBcHBlbmRpeCBBXS4KLQotSWRlbnRpZmllcnMgYW5kICh1bnF1b3RlZCkga2V5d29yZHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUuIFRodXMgYFNFTEVDVGAKLWlzIHRoZSBzYW1lIHRoYW4gYHNlbGVjdGAgb3IgYHNFbEVjVGAsIGFuZCBgbXlJZGAgaXMgdGhlIHNhbWUgdGhhbgotYG15aWRgIG9yIGBNWUlEYC4gQSBjb252ZW50aW9uIG9mdGVuIHVzZWQgKGluIHBhcnRpY3VsYXIgYnkgdGhlIHNhbXBsZXMKLW9mIHRoaXMgZG9jdW1lbnRhdGlvbikgaXMgdG8gdXNlIHVwcGVyY2FzZSBmb3Iga2V5d29yZHMgYW5kIGxvd2VyY2FzZQotZm9yIG90aGVyIGlkZW50aWZpZXJzLgotCi1UaGVyZSBpcyBhIHNlY29uZCBraW5kIG9mIGlkZW50aWZpZXIgY2FsbGVkIGEgX3F1b3RlZCBpZGVudGlmaWVyXwotZGVmaW5lZCBieSBlbmNsb3NpbmcgYW4gYXJiaXRyYXJ5IHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgKG5vbi1lbXB0eSkgaW4KLWRvdWJsZS1xdW90ZXMoYCJgKS4gUXVvdGVkIGlkZW50aWZpZXJzIGFyZSBuZXZlciBrZXl3b3Jkcy4gVGh1cwotYCJzZWxlY3QiYCBpcyBub3QgYSByZXNlcnZlZCBrZXl3b3JkIGFuZCBjYW4gYmUgdXNlZCB0byByZWZlciB0byBhCi1jb2x1bW4gKG5vdGUgdGhhdCB1c2luZyB0aGlzIGlzIHBhcnRpY3VsYXJseSBpbGwtYWR2aXNlZCksIHdoaWxlIGBzZWxlY3RgCi13b3VsZCByYWlzZSBhIHBhcnNpbmcgZXJyb3IuIEFsc28sIHVubGlrZSB1bnF1b3RlZCBpZGVudGlmaWVycwotYW5kIGtleXdvcmRzLCBxdW90ZWQgaWRlbnRpZmllcnMgYXJlIGNhc2Ugc2Vuc2l0aXZlIChgIk15IFF1b3RlZCBJZCJgIGlzCi1fZGlmZmVyZW50XyBmcm9tIGAibXkgcXVvdGVkIGlkImApLiBBIGZ1bGx5IGxvd2VyY2FzZSBxdW90ZWQgaWRlbnRpZmllcgotdGhhdCBtYXRjaGVzIGBbYS16QS1aXVthLXpBLVowLTlfXSpgIGlzIGhvd2V2ZXIgX2VxdWl2YWxlbnRfIHRvIHRoZQotdW5xdW90ZWQgaWRlbnRpZmllciBvYnRhaW5lZCBieSByZW1vdmluZyB0aGUgZG91YmxlLXF1b3RlIChzbyBgIm15aWQiYAotaXMgZXF1aXZhbGVudCB0byBgbXlpZGAgYW5kIHRvIGBteUlkYCBidXQgZGlmZmVyZW50IGZyb20gYCJteUlkImApLgotSW5zaWRlIGEgcXVvdGVkIGlkZW50aWZpZXIsIHRoZSBkb3VibGUtcXVvdGUgY2hhcmFjdGVyIGNhbiBiZSByZXBlYXRlZAotdG8gZXNjYXBlIGl0LCBzbyBgImZvbyAiIiBiYXIiYCBpcyBhIHZhbGlkIGlkZW50aWZpZXIuCi0KLVtOT1RFXQotLk5vdGUKLT09PT0KLVRoZSBfcXVvdGVkIGlkZW50aWZpZXJfIGNhbiBkZWNsYXJlIGNvbHVtbnMgd2l0aCBhcmJpdHJhcnkgbmFtZXMsIGFuZAotdGhlc2UgY2FuIHNvbWV0aW1lIGNsYXNoIHdpdGggc3BlY2lmaWMgbmFtZXMgdXNlZCBieSB0aGUgc2VydmVyLiBGb3IKLWluc3RhbmNlLCB3aGVuIHVzaW5nIGNvbmRpdGlvbmFsIHVwZGF0ZSwgdGhlIHNlcnZlciB3aWxsIHJlc3BvbmQgd2l0aCBhCi1yZXN1bHQgc2V0IGNvbnRhaW5pbmcgYSBzcGVjaWFsIHJlc3VsdCBuYW1lZCBgIlthcHBsaWVkXSJgLiBJZiB5b3XigJl2ZQotZGVjbGFyZWQgYSBjb2x1bW4gd2l0aCBzdWNoIGEgbmFtZSwgdGhpcyBjb3VsZCBwb3RlbnRpYWxseSBjb25mdXNlIHNvbWUKLXRvb2xzIGFuZCBzaG91bGQgYmUgYXZvaWRlZC4gSW4gZ2VuZXJhbCwgdW5xdW90ZWQgaWRlbnRpZmllcnMgc2hvdWxkIGJlCi1wcmVmZXJyZWQgYnV0IGlmIHlvdSB1c2UgcXVvdGVkIGlkZW50aWZpZXJzLCBpdCBpcyBzdHJvbmdseSBhZHZpc2VkIHRoYXQgeW91Ci1hdm9pZCBhbnkgbmFtZSBlbmNsb3NlZCBieSBzcXVhcmVkIGJyYWNrZXRzIChsaWtlIGAiW2FwcGxpZWRdImApIGFuZCBhbnkKLW5hbWUgdGhhdCBsb29rcyBsaWtlIGEgZnVuY3Rpb24gY2FsbCAobGlrZSBgImYoeCkiYCkuCi09PT09Ci0KLU1vcmUgZm9ybWFsbHksIHdlIGhhdmU6Ci0KLVtzb3VyY2UsIGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2lkZW50aWZpZXIuYm5mW10KLS0tLS0KLQotW1tjb25zdGFudHNdXQotPT0gQ29uc3RhbnRzCi0KLUNRTCBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgX2NvbnN0YW50c186Ci0KLVtzb3VyY2UsIGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2NvbnN0YW50LmJuZltdCi0tLS0tCi0KLUluIG90aGVyIHdvcmRzOgotCi0qIEEgc3RyaW5nIGNvbnN0YW50IGlzIGFuIGFyYml0cmFyeSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGVuY2xvc2VkIGJ5Ci1zaW5nbGUtcXVvdGUoYCdgKS4gQSBzaW5nbGUtcXVvdGUgY2FuIGJlIGluY2x1ZGVkIGJ5IHJlcGVhdGluZyBpdCwgZS5nLgotYCdJdCcncyByYWluaW5nIHRvZGF5J2AuIFRob3NlIGFyZSBub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBxdW90ZWQKLWBpZGVudGlmaWVyc2AgdGhhdCB1c2UgZG91YmxlLXF1b3Rlcy4gQWx0ZXJuYXRpdmVseSwgYSBzdHJpbmcgY2FuIGJlCi1kZWZpbmVkIGJ5IGVuY2xvc2luZyB0aGUgYXJiaXRyYXJ5IHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYnkgdHdvIGRvbGxhcgotY2hhcmFjdGVycywgaW4gd2hpY2ggY2FzZSBzaW5nbGUtcXVvdGUgY2FuIGJlIHVzZWQgd2l0aG91dCBlc2NhcGluZwotKGAkJEl0J3MgcmFpbmluZyB0b2RheSQkYCkuIFRoYXQgbGF0dGVyIGZvcm0gaXMgb2Z0ZW4gdXNlZCB3aGVuIGRlZmluaW5nCi14cmVmOmNxbC9mdW5jdGlvbnMuYWRvYyN1ZGZzW3VzZXItZGVmaW5lZCBmdW5jdGlvbnNdIHRvIGF2b2lkIGhhdmluZyB0byBlc2NhcGUgc2luZ2xlLXF1b3RlCi1jaGFyYWN0ZXJzIGluIGZ1bmN0aW9uIGJvZHkgKGFzIHRoZXkgYXJlIG1vcmUgbGlrZWx5IHRvIG9jY3VyIHRoYW4KLWAkJGApLgotKiBJbnRlZ2VyLCBmbG9hdCBhbmQgYm9vbGVhbiBjb25zdGFudCBhcmUgZGVmaW5lZCBhcyBleHBlY3RlZC4gTm90ZQotaG93ZXZlciB0aGFuIGZsb2F0IGFsbG93cyB0aGUgc3BlY2lhbCBgTmFOYCBhbmQgYEluZmluaXR5YCBjb25zdGFudHMuCi0qIENRTCBzdXBwb3J0cwotaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pdmVyc2FsbHlfdW5pcXVlX2lkZW50aWZpZXJbVVVJRF0KLWNvbnN0YW50cy4KLSogQmxvYnMgY29udGVudCBhcmUgcHJvdmlkZWQgaW4gaGV4YWRlY2ltYWwgYW5kIHByZWZpeGVkIGJ5IGAweGAuCi0qIFRoZSBzcGVjaWFsIGBOVUxMYCBjb25zdGFudCBkZW5vdGVzIHRoZSBhYnNlbmNlIG9mIHZhbHVlLgotCi1Gb3IgaG93IHRoZXNlIGNvbnN0YW50cyBhcmUgdHlwZWQsIHNlZSB0aGUgeHJlZjpjcWwvdHlwZXMuYWRvY1tEYXRhIHR5cGVzXSBzZWN0aW9uLgotCi09PSBUZXJtcwotCi1DUUwgaGFzIHRoZSBub3Rpb24gb2YgYSBfdGVybV8sIHdoaWNoIGRlbm90ZXMgdGhlIGtpbmQgb2YgdmFsdWVzIHRoYXQKLUNRTCBzdXBwb3J0LiBUZXJtcyBhcmUgZGVmaW5lZCBieToKLQotW3NvdXJjZSwgYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvdGVybS5ibmZbXQotLS0tLQotCi1BIHRlcm0gaXMgdGh1cyBvbmUgb2Y6Ci0KLSogQSB4cmVmOmNxbC9kZWZpbnRpb25zLmFkb2MjY29uc3RhbnRzW2NvbnN0YW50XQotKiBBIGxpdGVyYWwgZm9yIGVpdGhlciBhIHhyZWY6Y3FsL3R5cGVzLmFkb2MjY29sbGVjdGlvbnNbY29sbGVjdGlvbl0sCi1hIHhyZWY6Y3FsL3R5cGVzLmFkb2MjdWR0c1t1c2VyLWRlZmluZWQgdHlwZV0gb3IgYSB4cmVmOmNxbC90eXBlcy5hZG9jI3R1cGxlc1t0dXBsZV0KLSogQSB4cmVmOmNxbC9mdW5jdGlvbnMuYWRvYyNjcWwtZnVuY3Rpb25zW2Z1bmN0aW9uXSBjYWxsLCBlaXRoZXIgYSB4cmVmOmNxbC9mdW5jdGlvbnMuYWRvYyNzY2FsYXItbmF0aXZlLWZ1bmN0aW9uc1tuYXRpdmUgZnVuY3Rpb25dCi1vciBhIHhyZWY6Y3FsL2Z1bmN0aW9ucy5hZG9jI3VzZXItZGVmaW5lZC1zY2FsYXItZnVuY3Rpb25zW3VzZXItZGVmaW5lZCBmdW5jdGlvbl0KLSogQW4geHJlZjpjcWwvb3BlcmF0b3JzLmFkb2MjYXJpdGhtZXRpY19vcGVyYXRvcnNbYXJpdGhtZXRpYyBvcGVyYXRpb25dIGJldHdlZW4gdGVybXMKLSogQSB0eXBlIGhpbnQKLSogQSBiaW5kIG1hcmtlciwgd2hpY2ggZGVub3RlcyBhIHZhcmlhYmxlIHRvIGJlIGJvdW5kIGF0IGV4ZWN1dGlvbiB0aW1lLgotU2VlIHRoZSBzZWN0aW9uIG9uIGBwcmVwYXJlZC1zdGF0ZW1lbnRzYCBmb3IgZGV0YWlscy4gQSBiaW5kIG1hcmtlciBjYW4KLWJlIGVpdGhlciBhbm9ueW1vdXMgKGA/YCkgb3IgbmFtZWQgKGA6c29tZV9uYW1lYCkuIFRoZSBsYXR0ZXIgZm9ybQotcHJvdmlkZXMgYSBtb3JlIGNvbnZlbmllbnQgd2F5IHRvIHJlZmVyIHRvIHRoZSB2YXJpYWJsZSBmb3IgYmluZGluZyBpdAotYW5kIHNob3VsZCBnZW5lcmFsbHkgYmUgcHJlZmVycmVkLgotCi09PSBDb21tZW50cwotCi1BIGNvbW1lbnQgaW4gQ1FMIGlzIGEgbGluZSBiZWdpbm5pbmcgYnkgZWl0aGVyIGRvdWJsZSBkYXNoZXMgKGAtLWApIG9yCi1kb3VibGUgc2xhc2ggKGAvL2ApLgotCi1NdWx0aS1saW5lIGNvbW1lbnRzIGFyZSBhbHNvIHN1cHBvcnRlZCB0aHJvdWdoIGVuY2xvc3VyZSB3aXRoaW4gYC8qYCBhbmQKLWAqL2AgKGJ1dCBuZXN0aW5nIGlzIG5vdCBzdXBwb3J0ZWQpLgotCi1bc291cmNlLGNxbF0KLS0tLS0KLS0tIFRoaXMgaXMgYSBjb21tZW50Ci0vLyBUaGlzIGlzIGEgY29tbWVudCB0b28KLS8qIFRoaXMgaXMKLSAgIGEgbXVsdGktbGluZSBjb21tZW50ICovCi0tLS0tCi0KLT09IFN0YXRlbWVudHMKLQotQ1FMIGNvbnNpc3RzIG9mIHN0YXRlbWVudHMgdGhhdCBjYW4gYmUgZGl2aWRlZCBpbiB0aGUgZm9sbG93aW5nCi1jYXRlZ29yaWVzOgotCi0qIGBkYXRhLWRlZmluaXRpb25gIHN0YXRlbWVudHMsIHRvIGRlZmluZSBhbmQgY2hhbmdlIGhvdyB0aGUgZGF0YSBpcwotc3RvcmVkIChrZXlzcGFjZXMgYW5kIHRhYmxlcykuCi0qIGBkYXRhLW1hbmlwdWxhdGlvbmAgc3RhdGVtZW50cywgZm9yIHNlbGVjdGluZywgaW5zZXJ0aW5nIGFuZCBkZWxldGluZwotZGF0YS4KLSogYHNlY29uZGFyeS1pbmRleGVzYCBzdGF0ZW1lbnRzLgotKiBgbWF0ZXJpYWxpemVkLXZpZXdzYCBzdGF0ZW1lbnRzLgotKiBgY3FsLXJvbGVzYCBzdGF0ZW1lbnRzLgotKiBgY3FsLXBlcm1pc3Npb25zYCBzdGF0ZW1lbnRzLgotKiBgVXNlci1EZWZpbmVkIEZ1bmN0aW9ucyAoVURGcylgIHN0YXRlbWVudHMuCi0qIGB1ZHRzYCBzdGF0ZW1lbnRzLgotKiBgY3FsLXRyaWdnZXJzYCBzdGF0ZW1lbnRzLgotCi1BbGwgdGhlIHN0YXRlbWVudHMgYXJlIGxpc3RlZCBiZWxvdyBhbmQgYXJlIGRlc2NyaWJlZCBpbiB0aGUgcmVzdCBvZgotdGhpcyBkb2N1bWVudGF0aW9uIChzZWUgbGlua3MgYWJvdmUpOgotCi1bc291cmNlLCBibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9jcWxfc3RhdGVtZW50LmJuZltdCi0tLS0tCi0KLT09IFByZXBhcmVkIFN0YXRlbWVudHMKLQotQ1FMIHN1cHBvcnRzIF9wcmVwYXJlZCBzdGF0ZW1lbnRzXy4gUHJlcGFyZWQgc3RhdGVtZW50cyBhcmUgYW4KLW9wdGltaXphdGlvbiB0aGF0IGFsbG93cyB0byBwYXJzZSBhIHF1ZXJ5IG9ubHkgb25jZSBidXQgZXhlY3V0ZSBpdAotbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgY29uY3JldGUgdmFsdWVzLgotCi1Bbnkgc3RhdGVtZW50IHRoYXQgdXNlcyBhdCBsZWFzdCBvbmUgYmluZCBtYXJrZXIgKHNlZSBgYmluZF9tYXJrZXJgKQotd2lsbCBuZWVkIHRvIGJlIF9wcmVwYXJlZF8uIEFmdGVyIHdoaWNoIHRoZSBzdGF0ZW1lbnQgY2FuIGJlIF9leGVjdXRlZF8KLWJ5IHByb3ZpZGVkIGNvbmNyZXRlIHZhbHVlcyBmb3IgZWFjaCBvZiBpdHMgbWFya2VyLiBUaGUgZXhhY3QgZGV0YWlscyBvZgotaG93IGEgc3RhdGVtZW50IGlzIHByZXBhcmVkIGFuZCB0aGVuIGV4ZWN1dGVkIGRlcGVuZHMgb24gdGhlIENRTCBkcml2ZXIKLXVzZWQgYW5kIHlvdSBzaG91bGQgcmVmZXIgdG8geW91ciBkcml2ZXIgZG9jdW1lbnRhdGlvbi4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvZG1sLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL2RtbC5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDUxN2FhLi4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvZG1sLmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NjEgKzAsMCBAQAotPSBEYXRhIE1hbmlwdWxhdGlvbgotCi1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBzdGF0ZW1lbnRzIHN1cHBvcnRlZCBieSBDUUwgdG8gaW5zZXJ0LAotdXBkYXRlLCBkZWxldGUgYW5kIHF1ZXJ5IGRhdGEuCi0KLVtbc2VsZWN0LXN0YXRlbWVudF1dCi09PSBTRUxFQ1QKLQotUXVlcnlpbmcgZGF0YSBmcm9tIGRhdGEgaXMgZG9uZSB1c2luZyBhIGBTRUxFQ1RgIHN0YXRlbWVudDoKLQotW3NvdXJjZSxibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9zZWxlY3Rfc3RhdGVtZW50LmJuZltdCi0tLS0tCi0KLUZvciBleGFtcGxlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML3NlbGVjdF9zdGF0ZW1lbnQuY3FsW10KLS0tLS0KLQotVGhlIGBTRUxFQ1RgIHN0YXRlbWVudHMgcmVhZHMgb25lIG9yIG1vcmUgY29sdW1ucyBmb3Igb25lIG9yIG1vcmUgcm93cwotaW4gYSB0YWJsZS4gSXQgcmV0dXJucyBhIHJlc3VsdC1zZXQgb2YgdGhlIHJvd3MgbWF0Y2hpbmcgdGhlIHJlcXVlc3QsCi13aGVyZSBlYWNoIHJvdyBjb250YWlucyB0aGUgdmFsdWVzIGZvciB0aGUgc2VsZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8KLXRoZSBxdWVyeS4gQWRkaXRpb25hbGx5LCB4cmVmOmNxbC9mdW5jdGlvbnMuYWRvYyNjcWwtZnVuY3Rpb25zW2Z1bmN0aW9uc10gaW5jbHVkaW5nCi14cmVmOmNxbC9mdW5jdGlvbnMuYWRvYyNhZ2dyZWdhdGUtZnVuY3Rpb25zW2FnZ3JlZ2F0aW9uc10gY2FuIGJlIGFwcGxpZWQgdG8gdGhlIHJlc3VsdC4KLQotQSBgU0VMRUNUYCBzdGF0ZW1lbnQgY29udGFpbnMgYXQgbGVhc3QgYSB4cmVmOmNxbC9kbWwuYWRvYyNzZWxlY3Rpb24tY2xhdXNlW3NlbGVjdGlvbiBjbGF1c2VdIGFuZCB0aGUgbmFtZSBvZiB0aGUgdGFibGUgb24gd2hpY2gKLXRoZSBzZWxlY3Rpb24gaXMgZXhlY3V0ZWQuIAotQ1FMIGRvZXMgKm5vdCogZXhlY3V0ZSBqb2lucyBvciBzdWItcXVlcmllcyBhbmQgYSBzZWxlY3Qgc3RhdGVtZW50IG9ubHkgYXBwbHkgdG8gYSBzaW5nbGUgdGFibGUuIAotQSBzZWxlY3Qgc3RhdGVtZW50IGNhbiBhbHNvIGhhdmUgYSB4cmVmOmNxbC9kbWwuYWRvYyN3aGVyZS1jbGF1c2Vbd2hlcmUgY2xhdXNlXSB0aGF0IGNhbiBmdXJ0aGVyIG5hcnJvdyB0aGUgcXVlcnkgcmVzdWx0cy4KLUFkZGl0aW9uYWwgY2xhdXNlcyBjYW4geHJlZjpjcWwvZG1sLmFkb2Mjb3JkZXJpbmctY2xhdXNlW29yZGVyXSBvciB4cmVmOmNxbC9kbWwuYWRvYyNsaW1pdC1jbGF1c2VbbGltaXRdIHRoZSByZXN1bHRzLiAKLUxhc3RseSwgeHJlZjpjcWwvZG1sLmFkb2MjYWxsb3ctZmlsdGVyaW5nW3F1ZXJpZXMgdGhhdCByZXF1aXJlIGZ1bGwgY2x1c3RlciBmaWx0ZXJpbmddIGNhbiBhcHBlbmQgYEFMTE9XIEZJTFRFUklOR2AgdG8gYW55IHF1ZXJ5LgotCi1bW3NlbGVjdGlvbi1jbGF1c2VdXQotPT09IFNlbGVjdGlvbiBjbGF1c2UKLQotVGhlIGBzZWxlY3RfY2xhdXNlYCBkZXRlcm1pbmVzIHdoaWNoIGNvbHVtbnMgd2lsbCBiZSBxdWVyaWVkIGFuZCByZXR1cm5lZCBpbiB0aGUgcmVzdWx0IHNldC4gCi1UaGlzIGNsYXVzZSBjYW4gYWxzbyBhcHBseSB0cmFuc2Zvcm1hdGlvbnMgdG8gYXBwbHkgdG8gdGhlIHJlc3VsdCBiZWZvcmUgcmV0dXJuaW5nLiAKLVRoZSBzZWxlY3Rpb24gY2xhdXNlIGNvbnNpc3RzIG9mIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygc3BlY2lmaWMgX3NlbGVjdG9yc18gb3IsIGFsdGVybmF0aXZlbHksIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgKGAqYCkgdG8gc2VsZWN0IGFsbCB0aGUgY29sdW1ucyBkZWZpbmVkIGluIHRoZSB0YWJsZS4KLQotPT09PSBTZWxlY3RvcnMKLQotQSBgc2VsZWN0b3JgIGNhbiBiZSBvbmUgb2Y6Ci0KLSogQSBjb2x1bW4gbmFtZSBvZiB0aGUgdGFibGUgc2VsZWN0ZWQsIHRvIHJldHJpZXZlIHRoZSB2YWx1ZXMgZm9yIHRoYXQKLWNvbHVtbi4KLSogQSB0ZXJtLCB3aGljaCBpcyB1c3VhbGx5IHVzZWQgbmVzdGVkIGluc2lkZSBvdGhlciBzZWxlY3RvcnMgbGlrZQotZnVuY3Rpb25zIChpZiBhIHRlcm0gaXMgc2VsZWN0ZWQgZGlyZWN0bHksIHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgY29sdW1uCi1vZiB0aGUgcmVzdWx0LXNldCB3aWxsIHNpbXBseSBoYXZlIHRoZSB2YWx1ZSBvZiB0aGlzIHRlcm0gZm9yIGV2ZXJ5IHJvdwotcmV0dXJuZWQpLgotKiBBIGNhc3RpbmcsIHdoaWNoIGFsbG93cyB0byBjb252ZXJ0IGEgbmVzdGVkIHNlbGVjdG9yIHRvIGEgKGNvbXBhdGlibGUpCi10eXBlLgotKiBBIGZ1bmN0aW9uIGNhbGwsIHdoZXJlIHRoZSBhcmd1bWVudHMgYXJlIHNlbGVjdG9yIHRoZW1zZWx2ZXMuIFNlZSB0aGUKLXNlY3Rpb24gb24geHJlZjpjcWwvZnVuY3Rpb25zLmFkb2MjY3FsLWZ1bmN0aW9uc1tmdW5jdGlvbnNdIGZvciBtb3JlIGRldGFpbHMuCi0qIFRoZSBzcGVjaWFsIGNhbGwgYENPVU5UKCopYCB0byB0aGUgeHJlZjpjcWwvZnVuY3Rpb25zLmFkb2MjY291bnQtZnVuY3Rpb25bQ09VTlQgZnVuY3Rpb25dLAotd2hpY2ggY291bnRzIGFsbCBub24tbnVsbCByZXN1bHRzLgotCi09PT09IEFsaWFzZXMKLQotRXZlcnkgX3RvcC1sZXZlbF8gc2VsZWN0b3IgY2FuIGFsc28gYmUgYWxpYXNlZCAodXNpbmcgQVMpLgotSWYgc28sIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNvbHVtbiBpbiB0aGUgcmVzdWx0IHNldCB3aWxsIGJlCi10aGF0IG9mIHRoZSBhbGlhcy4gRm9yIGluc3RhbmNlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2FzLmNxbFtdCi0tLS0tCi0KLVtOT1RFXQotPT09PQotQ3VycmVudGx5LCBhbGlhc2VzIGFyZW4ndCByZWNvZ25pemVkIGluIHRoZSBgV0hFUkVgIG9yIGBPUkRFUiBCWWAgY2xhdXNlcyBpbiB0aGUgc3RhdGVtZW50LgotWW91IG11c3QgdXNlIHRoZSBvcmlnbmFsIGNvbHVtbiBuYW1lIGluc3RlYWQuCi09PT09Ci0KLVtbd3JpdGV0aW1lLWFuZC10dGwtZnVuY3Rpb25dXQotPT09PSBgV1JJVEVUSU1FYCBhbmQgYFRUTGAgZnVuY3Rpb24KLQotU2VsZWN0aW9uIHN1cHBvcnRzIHR3byBzcGVjaWFsIGZ1bmN0aW9ucyB0aGF0IGFyZW4ndCBhbGxvd2VkIGFueXdoZXJlCi1lbHNlOiBgV1JJVEVUSU1FYCBhbmQgYFRUTGAuIAotQm90aCBmdW5jdGlvbnMgdGFrZSBvbmx5IG9uZSBhcmd1bWVudCwgYSBjb2x1bW4gbmFtZS4KLVRoZXNlIGZ1bmN0aW9ucyByZXRyaWV2ZSBtZXRhLWluZm9ybWF0aW9uIHRoYXQgaXMgc3RvcmVkIGludGVybmFsbHkgZm9yIGVhY2ggY29sdW1uOgotCi0qIGBXUklURVRJTUVgIHN0b3JlcyB0aGUgdGltZXN0YW1wIG9mIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uCi0qIGBUVExgIHN0b3JlcyB0aGUgcmVtYWluaW5nIHRpbWUgdG8gbGl2ZSAoaW4gc2Vjb25kcykgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uIGlmIGl0IGlzIHNldCB0byBleHBpcmU7IG90aGVyd2lzZSB0aGUgdmFsdWUgaXMgYG51bGxgLgotCi1UaGUgYFdSSVRFVElNRWAgYW5kIGBUVExgIGZ1bmN0aW9ucyBjYW4ndCBiZSB1c2VkIG9uIG11bHRpLWNlbGwgY29sdW1ucyBzdWNoIGFzIG5vbi1mcm96ZW4KLWNvbGxlY3Rpb25zIG9yIG5vbi1mcm96ZW4gdXNlci1kZWZpbmVkIHR5cGVzLgotCi1bW3doZXJlLWNsYXVzZV1dCi09PT0gVGhlIGBXSEVSRWAgY2xhdXNlCi0KLVRoZSBgV0hFUkVgIGNsYXVzZSBzcGVjaWZpZXMgd2hpY2ggcm93cyBhcmUgcXVlcmllZC4gSXQgc3BlY2lmaWVzCi1hIHJlbGF0aW9uc2hpcCBmb3IgYFBSSU1BUlkgS0VZYCBjb2x1bW5zIG9yIGEgY29sdW1uIHRoYXQgaGFzCi1hIHhyZWY6Y3FsL2luZGV4ZXMuYWRvYyNjcmVhdGUtaW5kZXgtc3RhdGVtZW50W3NlY29uZGFyeSBpbmRleF0gZGVmaW5lZCwgYWxvbmcgd2l0aCBhIHNldCB2YWx1ZS4KLQotTm90IGFsbCByZWxhdGlvbnNoaXBzIGFyZSBhbGxvd2VkIGluIGEgcXVlcnkuIEZvciBpbnN0YW5jZSwgb25seSBhbiBlcXVhbGl0eQotaXMgYWxsb3dlZCBvbiBhIHBhcnRpdGlvbiBrZXkuIFRoZSBgSU5gIGNsYXVzZSBpcyBjb25zaWRlcmVkIGFuIGVxdWFsaXR5IGZvciBvbmUgb3IgbW9yZSB2YWx1ZXMuCi1UaGUgYFRPS0VOYCBjbGF1c2UgY2FuIGJlIHVzZWQgdG8gcXVlcnkgZm9yIHBhcnRpdGlvbiBrZXkgbm9uLWVxdWFsaXRpZXMuCi1BIHBhcnRpdGlvbiBrZXkgbXVzdCBiZSBzcGVjaWZpZWQgYmVmb3JlIGNsdXN0ZXJpbmcgY29sdW1ucyBpbiB0aGUgYFdIRVJFYCBjbGF1c2UuIFRoZSByZWxhdGlvbnNoaXAgCi1mb3IgY2x1c3RlcmluZyBjb2x1bW5zIG11c3Qgc3BlY2lmeSBhICpjb250aWd1b3VzKiBzZXQgb2Ygcm93cyB0byBvcmRlci4KLQotRm9yIGluc3RhbmNlLCBnaXZlbjoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC90YWJsZV9mb3Jfd2hlcmUuY3FsW10KLS0tLS0KLQotVGhlIGZvbGxvd2luZyBxdWVyeSBpcyBhbGxvd2VkOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML3doZXJlLmNxbFtdCi0tLS0tCi0KLUJ1dCB0aGUgZm9sbG93aW5nIG9uZSBpcyBub3QsIGFzIGl0IGRvZXMgbm90IHNlbGVjdCBhIGNvbnRpZ3VvdXMgc2V0IG9mCi1yb3dzIChhbmQgd2Ugc3VwcG9zZSBubyBzZWNvbmRhcnkgaW5kZXhlcyBhcmUgc2V0KToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC93aGVyZV9mYWlsLmNxbFtdCi0tLS0tCi0KLVdoZW4gc3BlY2lmeWluZyByZWxhdGlvbnNoaXBzLCB0aGUgYFRPS0VOYCBmdW5jdGlvbiBjYW4gYmUgYXBwbGllZCB0byB0aGUgYFBBUlRJVElPTiBLRVlgIGNvbHVtbiB0byBxdWVyeS4gCi1Sb3dzIHdpbGwgYmUgc2VsZWN0ZWQgYmFzZWQgb24gdGhlIHRva2VuIG9mIHRoZSBgUEFSVElUSU9OX0tFWWAgcmF0aGVyIHRoYW4gb24gdGhlIHZhbHVlLgotW0lNUE9SVEFOVF0KLT09PT0KLVRoZSB0b2tlbiBvZiBhIGtleSBkZXBlbmRzIG9uIHRoZSBwYXJ0aXRpb25lciBpbiB1c2UsIGFuZCB0aGF0Ci1pbiBwYXJ0aWN1bGFyIHRoZSBgUmFuZG9tUGFydGl0aW9uZXJgIHdvbid0IHlpZWxkIGEgbWVhbmluZ2Z1bCBvcmRlci4gCi1BbHNvIG5vdGUgdGhhdCBvcmRlcmluZyBwYXJ0aXRpb25lcnMgYWx3YXlzIG9yZGVyIHRva2VuIHZhbHVlcyBieSBieXRlcyAoc28KLWV2ZW4gaWYgdGhlIHBhcnRpdGlvbiBrZXkgaXMgb2YgdHlwZSBpbnQsIGB0b2tlbigtMSkgPiB0b2tlbigwKWAgaW4KLXBhcnRpY3VsYXIpLiAKLT09PT0KLQotRm9yIGV4YW1wbGU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvdG9rZW4uY3FsW10KLS0tLS0KLQotVGhlIGBJTmAgcmVsYXRpb25zaGlwIGlzIG9ubHkgYWxsb3dlZCBvbiB0aGUgbGFzdCBjb2x1bW4gb2YgdGhlCi1wYXJ0aXRpb24ga2V5IG9yIG9uIHRoZSBsYXN0IGNvbHVtbiBvZiB0aGUgZnVsbCBwcmltYXJ5IGtleS4KLQotSXQgaXMgYWxzbyBwb3NzaWJsZSB0byDigJxncm91cOKAnSBgQ0xVU1RFUklORyBDT0xVTU5TYCB0b2dldGhlciBpbiBhCi1yZWxhdGlvbiB1c2luZyB0aGUgdHVwbGUgbm90YXRpb24uIAotCi1Gb3IgZXhhbXBsZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC93aGVyZV9ncm91cF9jbHVzdGVyX2NvbHVtbnMuY3FsW10KLS0tLS0KLQotVGhpcyBxdWVyeSB3aWxsIHJldHVybiBhbGwgcm93cyB0aGF0IHNvcnQgYWZ0ZXIgdGhlIG9uZSBoYXZpbmcg4oCcSm9obidzIEJsb2figJ0gYXMKLWBibG9nX3RpbGVgIGFuZCAnMjAxMi0wMS0wMScgZm9yIGBwb3N0ZWRfYXRgIGluIHRoZSBjbHVzdGVyaW5nIG9yZGVyLiBJbgotcGFydGljdWxhciwgcm93cyBoYXZpbmcgYSBgcG9zdF9hdCA8PSAnMjAxMi0wMS0wMSdgIHdpbGwgYmUgcmV0dXJuZWQsIGFzCi1sb25nIGFzIHRoZWlyIGBibG9nX3RpdGxlID4gJ0pvaG4nJ3MgQmxvZydgLiAKLQotVGhhdCB3b3VsZCBub3QgYmUgdGhlIGNhc2UgZm9yIHRoaXMgZXhhbXBsZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC93aGVyZV9ub19ncm91cF9jbHVzdGVyX2NvbHVtbnMuY3FsW10KLS0tLS0KLQotVGhlIHR1cGxlIG5vdGF0aW9uIG1heSBhbHNvIGJlIHVzZWQgZm9yIGBJTmAgY2xhdXNlcyBvbiBjbHVzdGVyaW5nIGNvbHVtbnM6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvd2hlcmVfaW5fdHVwbGUuY3FsW10KLS0tLS0KLQotVGhlIGBDT05UQUlOU2Agb3BlcmF0b3IgbWF5IG9ubHkgYmUgdXNlZCBmb3IgY29sbGVjdGlvbiBjb2x1bW5zIChsaXN0cywKLXNldHMsIGFuZCBtYXBzKS4gSW4gdGhlIGNhc2Ugb2YgbWFwcywgYENPTlRBSU5TYCBhcHBsaWVzIHRvIHRoZSBtYXAKLXZhbHVlcy4gVGhlIGBDT05UQUlOUyBLRVlgIG9wZXJhdG9yIG1heSBvbmx5IGJlIHVzZWQgb24gbWFwIGNvbHVtbnMgYW5kCi1hcHBsaWVzIHRvIHRoZSBtYXAga2V5cy4KLQotW1tncm91cC1ieS1jbGF1c2VdXQotPT09IEdyb3VwaW5nIHJlc3VsdHMKLQotVGhlIGBHUk9VUCBCWWAgb3B0aW9uIGNhbiBjb25kZW5zZSBhbGwgc2VsZWN0ZWQKLXJvd3MgdGhhdCBzaGFyZSB0aGUgc2FtZSB2YWx1ZXMgZm9yIGEgc2V0IG9mIGNvbHVtbnMgaW50byBhIHNpbmdsZSByb3cuCi0KLVVzaW5nIHRoZSBgR1JPVVAgQllgIG9wdGlvbiwgcm93cyBjYW4gYmUgZ3JvdXBlZCBhdCB0aGUgcGFydGl0aW9uIGtleSBvciBjbHVzdGVyaW5nIGNvbHVtbiBsZXZlbC4gCi1Db25zZXF1ZW50bHksIHRoZSBgR1JPVVAgQllgIG9wdGlvbiBvbmx5IGFjY2VwdHMgcHJpbWFyeSBrZXkgY29sdW1ucyBpbiBkZWZpbmVkIG9yZGVyIGFzIGFyZ3VtZW50cy4KLUlmIGEgcHJpbWFyeSBrZXkgY29sdW1uIGlzIHJlc3RyaWN0ZWQgYnkgYW4gZXF1YWxpdHkgcmVzdHJpY3Rpb24sIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgYEdST1VQIEJZYCBjbGF1c2UuCi0KLUFnZ3JlZ2F0ZSBmdW5jdGlvbnMgd2lsbCBwcm9kdWNlIGEgc2VwYXJhdGUgdmFsdWUgZm9yIGVhY2ggZ3JvdXAuIAotSWYgbm8gYEdST1VQIEJZYCBjbGF1c2UgaXMgc3BlY2lmaWVkLCBhZ2dyZWdhdGVzIGZ1bmN0aW9ucyB3aWxsIHByb2R1Y2UgYSBzaW5nbGUgdmFsdWUgZm9yIGFsbCB0aGUgcm93cy4KLQotSWYgYSBjb2x1bW4gaXMgc2VsZWN0ZWQgd2l0aG91dCBhbiBhZ2dyZWdhdGUgZnVuY3Rpb24sIGluIGEgc3RhdGVtZW50Ci13aXRoIGEgYEdST1VQIEJZYCwgdGhlIGZpcnN0IHZhbHVlIGVuY291bnRlciBpbiBlYWNoIGdyb3VwIHdpbGwgYmUKLXJldHVybmVkLgotCi1bW29yZGVyaW5nLWNsYXVzZV1dCi09PT0gT3JkZXJpbmcgcmVzdWx0cwotCi1UaGUgYE9SREVSIEJZYCBjbGF1c2Ugc2VsZWN0cyB0aGUgb3JkZXIgb2YgdGhlIHJldHVybmVkIHJlc3VsdHMuIAotVGhlIGFyZ3VtZW50IGlzIGEgbGlzdCBvZiBjb2x1bW4gbmFtZXMgYW5kIGVhY2ggY29sdW1uJ3Mgb3JkZXIgCi0oYEFTQ2AgZm9yIGFzY2VuZGFudCBhbmQgYERFU0NgIGZvciBkZXNjZW5kYW50LAotVGhlIHBvc3NpYmxlIG9yZGVyaW5ncyBhcmUgbGltaXRlZCBieSB0aGUgeHJlZjpjcWwvZGRsLmFkb2MjY2x1c3RlcmluZy1vcmRlcltjbHVzdGVyaW5nIG9yZGVyXSBkZWZpbmVkIG9uIHRoZSB0YWJsZToKLQotKiBpZiB0aGUgdGFibGUgaGFzIGJlZW4gZGVmaW5lZCB3aXRob3V0IGFueSBzcGVjaWZpYyBgQ0xVU1RFUklORyBPUkRFUmAsIHRoZW4gdGhlIG9yZGVyIGlzIGFzIGRlZmluZWQgYnkgdGhlIGNsdXN0ZXJpbmcgY29sdW1ucwotb3IgdGhlIHJldmVyc2UKLSogb3RoZXJ3aXNlLCB0aGUgb3JkZXIgaXMgZGVmaW5lZCBieSB0aGUgYENMVVNURVJJTkcgT1JERVJgIG9wdGlvbiBhbmQgdGhlIHJldmVyc2VkIG9uZS4KLQotW1tsaW1pdC1jbGF1c2VdXQotPT09IExpbWl0aW5nIHJlc3VsdHMKLQotVGhlIGBMSU1JVGAgb3B0aW9uIHRvIGEgYFNFTEVDVGAgc3RhdGVtZW50IGxpbWl0cyB0aGUgbnVtYmVyIG9mIHJvd3MKLXJldHVybmVkIGJ5IGEgcXVlcnkuIFRoZSBgUEVSIFBBUlRJVElPTiBMSU1JVGAgb3B0aW9uIGxpbWl0cyB0aGUKLW51bWJlciBvZiByb3dzIHJldHVybmVkIGZvciBhIGdpdmVuIHBhcnRpdGlvbiBieSB0aGUgcXVlcnkuIEJvdGggdHlwZXMgb2YgbGltaXRzIGNhbiB1c2VkIGluIHRoZSBzYW1lIHN0YXRlbWVudC4KLQotW1thbGxvdy1maWx0ZXJpbmddXQotPT09IEFsbG93aW5nIGZpbHRlcmluZwotCi1CeSBkZWZhdWx0LCBDUUwgb25seSBhbGxvd3Mgc2VsZWN0IHF1ZXJpZXMgdGhhdCBkb24ndCBpbnZvbHZlIGEgZnVsbCBzY2FuIG9mIGFsbCBwYXJ0aXRpb25zLiAKLUlmIGFsbCBwYXJ0aXRpb25zIGFyZSBzY2FubmVkLCB0aGVuIHJldHVybmluZyB0aGUgcmVzdWx0cyBtYXkgZXhwZXJpZW5jZSBhIHNpZ25pZmljYW50IGxhdGVuY3kgcHJvcG9ydGlvbmFsIHRvIHRoZSAKLWFtb3VudCBvZiBkYXRhIGluIHRoZSB0YWJsZS4gVGhlIGBBTExPVyBGSUxURVJJTkdgIG9wdGlvbiBleHBsaWNpdGx5IGV4ZWN1dGVzIGEgZnVsbCBzY2FuLiBUaHVzLCB0aGUgcGVyZm9ybWFuY2Ugb2YgCi10aGUgcXVlcnkgY2FuIGJlIHVucHJlZGljdGFibGUuCi0KLUZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIHRhYmxlIG9mIHVzZXIgcHJvZmlsZXMgd2l0aCBiaXJ0aCB5ZWFyIGFuZCBjb3VudHJ5IG9mIHJlc2lkZW5jZS4gCi1UaGUgYmlydGggeWVhciBoYXMgYSBzZWNvbmRhcnkgaW5kZXggZGVmaW5lZC4KLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9hbGxvd19maWx0ZXJpbmcuY3FsW10KLS0tLS0KLQotVGhlIGZvbGxvd2luZyBxdWVyaWVzIGFyZSB2YWxpZDoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9xdWVyeV9hbGxvd19maWx0ZXJpbmcuY3FsW10KLS0tLS0KLQotSW4gYm90aCBjYXNlcywgdGhlIHF1ZXJ5IHBlcmZvcm1hbmNlIGlzIHByb3BvcnRpb25hbCB0byB0aGUgYW1vdW50IG9mIGRhdGEgcmV0dXJuZWQuIAotVGhlIGZpcnN0IHF1ZXJ5IHJldHVybnMgYWxsIHJvd3MsIGJlY2F1c2UgYWxsIHVzZXJzIGFyZSBzZWxlY3RlZC4KLVRoZSBzZWNvbmQgcXVlcnkgcmV0dXJucyBvbmx5IHRoZSByb3dzIGRlZmluZWQgYnkgdGhlIHNlY29uZGFyeSBpbmRleCwgYSBwZXItbm9kZSBpbXBsZW1lbnRhdGlvbjsgdGhlIHJlc3VsdHMgd2lsbAotZGVwZW5kIG9uIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlIGNsdXN0ZXIsIGFuZCBpcyBpbmRpcmVjdGx5IHByb3BvcnRpb25hbCB0byB0aGUgYW1vdW50IG9mIGRhdGEgc3RvcmVkLgotVGhlIG51bWJlciBvZiBub2RlcyB3aWxsIGFsd2F5cyBiZSBtdWx0aXBsZSBudW1iZXIgb2YgbWFnbml0dWRlIGxvd2VyIHRoYW4gdGhlIG51bWJlciBvZiB1c2VyIHByb2ZpbGVzIHN0b3JlZC4gCi1Cb3RoIHF1ZXJpZXMgbWF5IHJldHVybiB2ZXJ5IGxhcmdlIHJlc3VsdCBzZXRzLCBidXQgdGhlIGFkZGl0aW9uIG9mIGEgYExJTUlUYCBjbGF1c2UgY2FuIHJlZHVjZWQgdGhlIGxhdGVuY3kuCi0KLVRoZSBmb2xsb3dpbmcgcXVlcnkgd2lsbCBiZSByZWplY3RlZDoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9xdWVyeV9mYWlsX2FsbG93X2ZpbHRlcmluZy5jcWxbXQotLS0tLQotCi1DYXNzYW5kcmEgY2Fubm90IGd1YXJhbnRlZSB0aGF0IGxhcmdlIGFtb3VudHMgb2YgZGF0YSB3b24ndCBoYXZlIHRvIHNjYW5uZWQgYW1vdW50IG9mIGRhdGEsIGV2ZW4gaWYgdGhlIHJlc3VsdCBpcyBzbWFsbC4gCi1JZiB5b3Uga25vdyB0aGF0IHRoZSBkYXRhc2V0IGlzIHNtYWxsLCBhbmQgdGhlIHBlcmZvcm1hbmNlIHdpbGwgYmUgcmVhc29uYWJsZSwgYWRkIGBBTExPVyBGSUxURVJJTkdgIHRvIGFsbG93IHRoZSBxdWVyeSB0byAKLWV4ZWN1dGU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvcXVlcnlfbm9mYWlsX2FsbG93X2ZpbHRlcmluZy5jcWxbXQotLS0tLQotCi1bW2luc2VydC1zdGF0ZW1lbnRdXQotPT0gSU5TRVJUCi0KLUluc2VydGluZyBkYXRhIGZvciBhIHJvdyBpcyBkb25lIHVzaW5nIGFuIGBJTlNFUlRgIHN0YXRlbWVudDoKLQotW3NvdXJjZSxibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9pbnNlcnRfc3RhdGVtZW50LmJuZltdCi0tLS0tCi0KLUZvciBleGFtcGxlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2luc2VydF9zdGF0ZW1lbnQuY3FsW10KLS0tLS0KLQotVGhlIGBJTlNFUlRgIHN0YXRlbWVudCB3cml0ZXMgb25lIG9yIG1vcmUgY29sdW1ucyBmb3IgYSBnaXZlbiByb3cgaW4gYQotdGFibGUuIAotU2luY2UgYSByb3cgaXMgaWRlbnRpZmllZCBieSBpdHMgYFBSSU1BUlkgS0VZYCwgYXQgbGVhc3Qgb25lIGNvbHVtbnMgbXVzdCBiZSBzcGVjaWZpZWQuIAotVGhlIGxpc3Qgb2YgY29sdW1ucyB0byBpbnNlcnQgbXVzdCBiZSBzdXBwbGllZCB3aXRoIHRoZSBgVkFMVUVTYCBzeW50YXguIAotV2hlbiB1c2luZyB0aGUgYEpTT05gIHN5bnRheCwgYFZBTFVFU2AgYXJlIG9wdGlvbmFsLiAKLVNlZSB0aGUgc2VjdGlvbiBvbiB4cmVmOmNxbC9kbWwuYWRvYyNjcWwtanNvbltKU09OIHN1cHBvcnRdIGZvciBtb3JlIGRldGFpbC4KLUFsbCB1cGRhdGVzIGZvciBhbiBgSU5TRVJUYCBhcmUgYXBwbGllZCBhdG9taWNhbGx5IGFuZCBpbiBpc29sYXRpb24uCi0KLVVubGlrZSBpbiBTUUwsIGBJTlNFUlRgIGRvZXMgbm90IGNoZWNrIHRoZSBwcmlvciBleGlzdGVuY2Ugb2YgdGhlIHJvdyBieSBkZWZhdWx0LiAKLVRoZSByb3cgaXMgY3JlYXRlZCBpZiBub25lIGV4aXN0ZWQgYmVmb3JlLCBhbmQgdXBkYXRlZCBvdGhlcndpc2UuIAotRnVydGhlcm1vcmUsIHRoZXJlIGlzIG5vIG1lYW5zIG9mIGtub3dpbmcgd2hpY2ggYWN0aW9uIG9jY3VycmVkLgotCi1UaGUgYElGIE5PVCBFWElTVFNgIGNvbmRpdGlvbiBjYW4gcmVzdHJpY3QgdGhlIGluc2VydGlvbiBpZiB0aGUgcm93IGRvZXMgbm90IGV4aXN0LiAKLUhvd2V2ZXIsIG5vdGUgdGhhdCB1c2luZyBgSUYgTk9UIEVYSVNUU2Agd2lsbCBpbmN1ciBhIG5vbi1uZWdsaWdpYmxlIHBlcmZvcm1hbmNlIGNvc3QsIGJlY2F1c2UgUGF4b3MgaXMgdXNlZCwKLXNvIHRoaXMgc2hvdWxkIGJlIHVzZWQgc3BhcmluZ2x5LgotCi1QbGVhc2UgcmVmZXIgdG8gdGhlIHhyZWY6Y3FsL2RtbC5hZG9jI3VwZGF0ZS1wYXJhbWV0ZXJzW1VQREFURV0gc2VjdGlvbiBmb3IgaW5mb3JtYXRpb25zIG9uIHRoZSBgdXBkYXRlX3BhcmFtZXRlcmAuCi1BbHNvIG5vdGUgdGhhdCBgSU5TRVJUYCBkb2VzIG5vdCBzdXBwb3J0IGNvdW50ZXJzLCB3aGlsZSBgVVBEQVRFYCBkb2VzLgotCi1bW3VwZGF0ZS1zdGF0ZW1lbnRdXQotPT0gVVBEQVRFCi0KLVVwZGF0aW5nIGEgcm93IGlzIGRvbmUgdXNpbmcgYW4gYFVQREFURWAgc3RhdGVtZW50OgotCi1bc291cmNlLCBibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi91cGRhdGVfc3RhdGVtZW50LmJuZltdCi0tLS0tCi0KLUZvciBpbnN0YW5jZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC91cGRhdGVfc3RhdGVtZW50LmNxbFtdCi0tLS0tCi0KLVRoZSBgVVBEQVRFYCBzdGF0ZW1lbnQgd3JpdGVzIG9uZSBvciBtb3JlIGNvbHVtbnMgZm9yIGEgZ2l2ZW4gcm93IGluIGEKLXRhYmxlLiAKLVRoZSBgV0hFUkVgY2xhdXNlIGlzIHVzZWQgdG8gc2VsZWN0IHRoZSByb3cgdG8gdXBkYXRlIGFuZCBtdXN0IGluY2x1ZGUgYWxsIGNvbHVtbnMgb2YgdGhlIGBQUklNQVJZIEtFWWAuIAotTm9uLXByaW1hcnkga2V5IGNvbHVtbnMgYXJlIHNldCB1c2luZyB0aGUgYFNFVGAga2V5d29yZC4KLUluIGFuIGBVUERBVEVgIHN0YXRlbWVudCwgYWxsIHVwZGF0ZXMgd2l0aGluIHRoZSBzYW1lIHBhcnRpdGlvbiBrZXkgYXJlIGFwcGxpZWQgYXRvbWljYWxseSBhbmQgaW4gaXNvbGF0aW9uLgotCi1Vbmxpa2UgaW4gU1FMLCBgVVBEQVRFYCBkb2VzIG5vdCBjaGVjayB0aGUgcHJpb3IgZXhpc3RlbmNlIG9mIHRoZSByb3cgYnkgZGVmYXVsdC4KLVRoZSByb3cgaXMgY3JlYXRlZCBpZiBub25lIGV4aXN0ZWQgYmVmb3JlLCBhbmQgdXBkYXRlZCBvdGhlcndpc2UuCi1GdXJ0aGVybW9yZSwgdGhlcmUgaXMgbm8gbWVhbnMgb2Yga25vd2luZyB3aGljaCBhY3Rpb24gb2NjdXJyZWQuCi0KLVRoZSBgSUZgIGNvbmRpdGlvbiBjYW4gYmUgdXNlZCB0byBjaG9vc2Ugd2hldGhlciB0aGUgcm93IGlzIHVwZGF0ZWQgb3Igbm90IGlmIGEgcGFydGljdWxhciBjb25kaXRpb24gaXMgbWV0LgotSG93ZXZlciwgbGlrZSB0aGUgYElGIE5PVCBFWElTVFNgIGNvbmRpdGlvbiwgYSBub24tbmVnbGlnaWJsZSBwZXJmb3JtYW5jZSBjb3N0IGNhbiBiZSBpbmN1cnJlZC4KLQotUmVnYXJkaW5nIHRoZSBgU0VUYCBhc3NpZ25tZW50OgotCi0qIGBjID0gYyArIDNgIHdpbGwgaW5jcmVtZW50L2RlY3JlbWVudCBjb3VudGVycywgdGhlIG9ubHkgb3BlcmF0aW9uIGFsbG93ZWQuIAotVGhlIGNvbHVtbiBuYW1lIGFmdGVyIHRoZSAnPScgc2lnbiAqbXVzdCogYmUgdGhlIHNhbWUgdGhhbiB0aGUgb25lIGJlZm9yZSB0aGUgJz0nIHNpZ24uCi1JbmNyZW1lbnQvZGVjcmVtZW50IGlzIG9ubHkgYWxsb3dlZCBvbiBjb3VudGVycy4gCi1TZWUgdGhlIHNlY3Rpb24gb24geHJlZjpjcWwvZG1sLmFkb2MjY291bnRlcnNbY291bnRlcnNdIGZvciBkZXRhaWxzLgotKiBgaWQgPSBpZCArIDxzb21lLWNvbGxlY3Rpb24+YCBhbmQgYGlkW3ZhbHVlMV0gPSB2YWx1ZTJgIGFyZSBmb3IgY29sbGVjdGlvbnMuIAotU2VlIHRoZSB4cmVmOmNxbC90eXBlcy5hZG9jI2NvbGxlY3Rpb25zW2NvbGxlY3Rpb25zXSBmb3IgZGV0YWlscy4gIAotKiBgaWQuZmllbGQgPSAzYCBpcyBmb3Igc2V0dGluZyB0aGUgdmFsdWUgb2YgYSBmaWVsZCBvbiBhIG5vbi1mcm96ZW4gdXNlci1kZWZpbmVkIHR5cGVzLiAKLVNlZSB0aGUgeHJlZjpjcWwvdHlwZXMuYWRvYyN1ZHRzW1VEVHNdIGZvciBkZXRhaWxzLgotCi09PT0gVXBkYXRlIHBhcmFtZXRlcnMKLQotYFVQREFURWAgYW5kIGBJTlNFUlRgIHN0YXRlbWVudHMgc3VwcG9ydCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6Ci0KLSogYFRUTGA6IHNwZWNpZmllcyBhbiBvcHRpb25hbCBUaW1lIFRvIExpdmUgKGluIHNlY29uZHMpIGZvciB0aGUKLWluc2VydGVkIHZhbHVlcy4gSWYgc2V0LCB0aGUgaW5zZXJ0ZWQgdmFsdWVzIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQKLWZyb20gdGhlIGRhdGFiYXNlIGFmdGVyIHRoZSBzcGVjaWZpZWQgdGltZS4gTm90ZSB0aGF0IHRoZSBUVEwgY29uY2VybnMKLXRoZSBpbnNlcnRlZCB2YWx1ZXMsIG5vdCB0aGUgY29sdW1ucyB0aGVtc2VsdmVzLiBUaGlzIG1lYW5zIHRoYXQgYW55Ci1zdWJzZXF1ZW50IHVwZGF0ZSBvZiB0aGUgY29sdW1uIHdpbGwgYWxzbyByZXNldCB0aGUgVFRMICh0byB3aGF0ZXZlciBUVEwKLWlzIHNwZWNpZmllZCBpbiB0aGF0IHVwZGF0ZSkuIEJ5IGRlZmF1bHQsIHZhbHVlcyBuZXZlciBleHBpcmUuIEEgVFRMIG9mCi0wIGlzIGVxdWl2YWxlbnQgdG8gbm8gVFRMLiBJZiB0aGUgdGFibGUgaGFzIGEgZGVmYXVsdF90aW1lX3RvX2xpdmUsIGEKLVRUTCBvZiAwIHdpbGwgcmVtb3ZlIHRoZSBUVEwgZm9yIHRoZSBpbnNlcnRlZCBvciB1cGRhdGVkIHZhbHVlcy4gQSBUVEwKLW9mIGBudWxsYCBpcyBlcXVpdmFsZW50IHRvIGluc2VydGluZyB3aXRoIGEgVFRMIG9mIDAuCi0KLWBVUERBVEVgLCBgSU5TRVJUYCwgYERFTEVURWAgYW5kIGBCQVRDSGAgc3RhdGVtZW50cyBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKLQotKiBgVElNRVNUQU1QYDogc2V0cyB0aGUgdGltZXN0YW1wIGZvciB0aGUgb3BlcmF0aW9uLiBJZiBub3Qgc3BlY2lmaWVkLAotdGhlIGNvb3JkaW5hdG9yIHdpbGwgdXNlIHRoZSBjdXJyZW50IHRpbWUgKGluIG1pY3Jvc2Vjb25kcykgYXQgdGhlIHN0YXJ0Ci1vZiBzdGF0ZW1lbnQgZXhlY3V0aW9uIGFzIHRoZSB0aW1lc3RhbXAuIFRoaXMgaXMgdXN1YWxseSBhIHN1aXRhYmxlCi1kZWZhdWx0LgotCi1bW2RlbGV0ZV9zdGF0ZW1lbnRdXQotPT0gREVMRVRFCi0KLURlbGV0aW5nIHJvd3Mgb3IgcGFydHMgb2Ygcm93cyB1c2VzIHRoZSBgREVMRVRFYCBzdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvZGVsZXRlX3N0YXRlbWVudC5ibmZbXQotLS0tLQotCi1Gb3IgZXhhbXBsZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9kZWxldGVfc3RhdGVtZW50LmNxbFtdCi0tLS0tCi0KLVRoZSBgREVMRVRFYCBzdGF0ZW1lbnQgZGVsZXRlcyBjb2x1bW5zIGFuZCByb3dzLiBJZiBjb2x1bW4gbmFtZXMgYXJlCi1wcm92aWRlZCBkaXJlY3RseSBhZnRlciB0aGUgYERFTEVURWAga2V5d29yZCwgb25seSB0aG9zZSBjb2x1bW5zIGFyZQotZGVsZXRlZCBmcm9tIHRoZSByb3cgaW5kaWNhdGVkIGJ5IHRoZSBgV0hFUkVgIGNsYXVzZS4gT3RoZXJ3aXNlLCB3aG9sZQotcm93cyBhcmUgcmVtb3ZlZC4KLQotVGhlIGBXSEVSRWAgY2xhdXNlIHNwZWNpZmllcyB3aGljaCByb3dzIGFyZSB0byBiZSBkZWxldGVkLiBNdWx0aXBsZSByb3dzCi1tYXkgYmUgZGVsZXRlZCB3aXRoIG9uZSBzdGF0ZW1lbnQgYnkgdXNpbmcgYW4gYElOYCBvcGVyYXRvci4gQSByYW5nZSBvZgotcm93cyBtYXkgYmUgZGVsZXRlZCB1c2luZyBhbiBpbmVxdWFsaXR5IG9wZXJhdG9yIChzdWNoIGFzIGA+PWApLgotCi1gREVMRVRFYCBzdXBwb3J0cyB0aGUgYFRJTUVTVEFNUGAgb3B0aW9uIHdpdGggdGhlIHNhbWUgc2VtYW50aWNzIGFzIGluCi14cmVmOmNxbC9kbWwuYWRvYyN1cGRhdGUtcGFyYW1ldGVyc1t1cGRhdGVzXS4KLQotSW4gYSBgREVMRVRFYCBzdGF0ZW1lbnQsIGFsbCBkZWxldGlvbnMgd2l0aGluIHRoZSBzYW1lIHBhcnRpdGlvbiBrZXkgYXJlCi1hcHBsaWVkIGF0b21pY2FsbHkgYW5kIGluIGlzb2xhdGlvbi4KLQotQSBgREVMRVRFYCBvcGVyYXRpb24gY2FuIGJlIGNvbmRpdGlvbmFsIHRocm91Z2ggdGhlIHVzZSBvZiBhbiBgSUZgCi1jbGF1c2UsIHNpbWlsYXIgdG8gYFVQREFURWAgYW5kIGBJTlNFUlRgIHN0YXRlbWVudHMuIEhvd2V2ZXIsIGFzIHdpdGgKLWBJTlNFUlRgIGFuZCBgVVBEQVRFYCBzdGF0ZW1lbnRzLCB0aGlzIHdpbGwgaW5jdXIgYSBub24tbmVnbGlnaWJsZQotcGVyZm9ybWFuY2UgY29zdCBiZWNhdXNlIFBheG9zIGlzIHVzZWQsIGFuZCBzaG91bGQgYmUgdXNlZCBzcGFyaW5nbHkuCi0KLVtbYmF0Y2hfc3RhdGVtZW50XV0KLT09IEJBVENICi0KLU11bHRpcGxlIGBJTlNFUlRgLCBgVVBEQVRFYCBhbmQgYERFTEVURWAgY2FuIGJlIGV4ZWN1dGVkIGluIGEgc2luZ2xlCi1zdGF0ZW1lbnQgYnkgZ3JvdXBpbmcgdGhlbSB0aHJvdWdoIGEgYEJBVENIYCBzdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsIGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2JhdGNoX3N0YXRlbWVudC5ibmZbXQotLS0tLQotCi1Gb3IgaW5zdGFuY2U6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvYmF0Y2hfc3RhdGVtZW50LmNxbFtdCi0tLS0tCi0KLVRoZSBgQkFUQ0hgIHN0YXRlbWVudCBncm91cCBtdWx0aXBsZSBtb2RpZmljYXRpb24gc3RhdGVtZW50cwotKGluc2VydGlvbnMvdXBkYXRlcyBhbmQgZGVsZXRpb25zKSBpbnRvIGEgc2luZ2xlIHN0YXRlbWVudC4gSXQgc2VydmVzCi1zZXZlcmFsIHB1cnBvc2VzOgotCi0qIEl0IHNhdmVzIG5ldHdvcmsgcm91bmQtdHJpcHMgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyIChhbmQKLXNvbWV0aW1lcyBiZXR3ZWVuIHRoZSBzZXJ2ZXIgY29vcmRpbmF0b3IgYW5kIHRoZSByZXBsaWNhcykgd2hlbiBiYXRjaGluZwotbXVsdGlwbGUgdXBkYXRlcy4KLSogQWxsIHVwZGF0ZXMgaW4gYSBgQkFUQ0hgIGJlbG9uZ2luZyB0byBhIGdpdmVuIHBhcnRpdGlvbiBrZXkgYXJlCi1wZXJmb3JtZWQgaW4gaXNvbGF0aW9uLgotKiBCeSBkZWZhdWx0LCBhbGwgb3BlcmF0aW9ucyBpbiB0aGUgYmF0Y2ggYXJlIHBlcmZvcm1lZCBhcyBfbG9nZ2VkXywgdG8KLWVuc3VyZSBhbGwgbXV0YXRpb25zIGV2ZW50dWFsbHkgY29tcGxldGUgKG9yIG5vbmUgd2lsbCkuIFNlZSB0aGUgbm90ZXMKLW9uIHhyZWY6Y3FsL2RtbC5hZG9jI3VubG9nZ2VkLWJhdGNoZXNbVU5MT0dHRUQgYmF0Y2hlc10gZm9yIG1vcmUgZGV0YWlscy4KLQotTm90ZSB0aGF0OgotCi0qIGBCQVRDSGAgc3RhdGVtZW50cyBtYXkgb25seSBjb250YWluIGBVUERBVEVgLCBgSU5TRVJUYCBhbmQgYERFTEVURWAKLXN0YXRlbWVudHMgKG5vdCBvdGhlciBiYXRjaGVzIGZvciBpbnN0YW5jZSkuCi0qIEJhdGNoZXMgYXJlIF9ub3RfIGEgZnVsbCBhbmFsb2d1ZSBmb3IgU1FMIHRyYW5zYWN0aW9ucy4KLSogSWYgYSB0aW1lc3RhbXAgaXMgbm90IHNwZWNpZmllZCBmb3IgZWFjaCBvcGVyYXRpb24sIHRoZW4gYWxsCi1vcGVyYXRpb25zIHdpbGwgYmUgYXBwbGllZCB3aXRoIHRoZSBzYW1lIHRpbWVzdGFtcCAoZWl0aGVyIG9uZSBnZW5lcmF0ZWQKLWF1dG9tYXRpY2FsbHksIG9yIHRoZSB0aW1lc3RhbXAgcHJvdmlkZWQgYXQgdGhlIGJhdGNoIGxldmVsKS4gRHVlIHRvCi1DYXNzYW5kcmEncyBjb25mbGljdCByZXNvbHV0aW9uIHByb2NlZHVyZSBpbiB0aGUgY2FzZSBvZgotaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9jYXNzYW5kcmEvRkFRI2Nsb2NrdGllW3RpbWVzdGFtcCB0aWVzXSwKLW9wZXJhdGlvbnMgbWF5IGJlIGFwcGxpZWQgaW4gYW4gb3JkZXIgdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkZXIKLXRoZXkgYXJlIGxpc3RlZCBpbiB0aGUgYEJBVENIYCBzdGF0ZW1lbnQuIFRvIGZvcmNlIGEgcGFydGljdWxhcgotb3BlcmF0aW9uIG9yZGVyaW5nLCB5b3UgbXVzdCBzcGVjaWZ5IHBlci1vcGVyYXRpb24gdGltZXN0YW1wcy4KLSogQSBMT0dHRUQgYmF0Y2ggdG8gYSBzaW5nbGUgcGFydGl0aW9uIHdpbGwgYmUgY29udmVydGVkIHRvIGFuIFVOTE9HR0VECi1iYXRjaCBhcyBhbiBvcHRpbWl6YXRpb24uCi0KLVtbdW5sb2dnZWQtYmF0Y2hlc11dCi09PT0gYFVOTE9HR0VEYCBiYXRjaGVzCi0KLUJ5IGRlZmF1bHQsIENhc3NhbmRyYSB1c2VzIGEgYmF0Y2ggbG9nIHRvIGVuc3VyZSBhbGwgb3BlcmF0aW9ucyBpbiBhCi1iYXRjaCBldmVudHVhbGx5IGNvbXBsZXRlIG9yIG5vbmUgd2lsbCAobm90ZSBob3dldmVyIHRoYXQgb3BlcmF0aW9ucyBhcmUKLW9ubHkgaXNvbGF0ZWQgd2l0aGluIGEgc2luZ2xlIHBhcnRpdGlvbikuCi0KLVRoZXJlIGlzIGEgcGVyZm9ybWFuY2UgcGVuYWx0eSBmb3IgYmF0Y2ggYXRvbWljaXR5IHdoZW4gYSBiYXRjaCBzcGFucwotbXVsdGlwbGUgcGFydGl0aW9ucy4gSWYgeW91IGRvIG5vdCB3YW50IHRvIGluY3VyIHRoaXMgcGVuYWx0eSwgeW91IGNhbgotdGVsbCBDYXNzYW5kcmEgdG8gc2tpcCB0aGUgYmF0Y2hsb2cgd2l0aCB0aGUgYFVOTE9HR0VEYCBvcHRpb24uIElmIHRoZQotYFVOTE9HR0VEYCBvcHRpb24gaXMgdXNlZCwgYSBmYWlsZWQgYmF0Y2ggbWlnaHQgbGVhdmUgdGhlIHBhdGNoIG9ubHkKLXBhcnRseSBhcHBsaWVkLgotCi09PT0gYENPVU5URVJgIGJhdGNoZXMKLQotVXNlIHRoZSBgQ09VTlRFUmAgb3B0aW9uIGZvciBiYXRjaGVkIGNvdW50ZXIgdXBkYXRlcy4gVW5saWtlIG90aGVyCi11cGRhdGVzIGluIENhc3NhbmRyYSwgY291bnRlciB1cGRhdGVzIGFyZSBub3QgaWRlbXBvdGVudC4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvZnVuY3Rpb25zLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL2Z1bmN0aW9ucy5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzQzOWEzLi4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvZnVuY3Rpb25zLmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MTIgKzAsMCBAQAotLy8gTmVlZCBzb21lIGludHJvIGZvciBVREYgYW5kIG5hdGl2ZSBmdW5jdGlvbnMgaW4gZ2VuZXJhbCBhbmQgcG9pbnQgdGhvc2UgdG8gaXQuICAKLS8vIFtbY3FsLWZ1bmN0aW9uc11dW1tuYXRpdmUtZnVuY3Rpb25zXV0gCi0KLT09IEZ1bmN0aW9ucwotCi1DUUwgc3VwcG9ydHMgMiBtYWluIGNhdGVnb3JpZXMgb2YgZnVuY3Rpb25zOgotCi0qIHhyZWY6Y3FsL2Z1bmN0aW9ucy5hZG9jI3NjYWxhci1mdW5jdGlvbnNbc2NhbGFyIGZ1bmN0aW9uc10gdGhhdCB0YWtlIGEgbnVtYmVyIG9mIHZhbHVlcyBhbmQgcHJvZHVjZSBhbiBvdXRwdXQKLSogeHJlZjpjcWwvZnVuY3Rpb25zLmFkb2MjYWdncmVnYXRlLWZ1bmN0aW9uc1thZ2dyZWdhdGUgZnVuY3Rpb25zXSB0aGF0IGFnZ3JlZ2F0ZSBtdWx0aXBsZSByb3dzIHJlc3VsdGluZyBmcm9tIGEgYFNFTEVDVGAgc3RhdGVtZW50Ci0KLUluIGJvdGggY2FzZXMsIENRTCBwcm92aWRlcyBhIG51bWJlciBvZiBuYXRpdmUgImhhcmQtY29kZWQiIGZ1bmN0aW9ucyBhcwotd2VsbCBhcyB0aGUgYWJpbGl0eSB0byBjcmVhdGUgbmV3IHVzZXItZGVmaW5lZCBmdW5jdGlvbnMuCi0KLVtOT1RFXQotLk5vdGUKLT09PT0KLUJ5IGRlZmF1bHQsIHRoZSB1c2Ugb2YgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGZvcgotc2VjdXJpdHkgY29uY2VybnMgKGV2ZW4gd2hlbiBlbmFibGVkLCB0aGUgZXhlY3V0aW9uIG9mIHVzZXItZGVmaW5lZAotZnVuY3Rpb25zIGlzIHNhbmRib3hlZCBhbmQgYSAicm9ndWUiIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgYWxsb3dlZCB0bwotZG8gZXZpbCwgYnV0IG5vIHNhbmRib3ggaXMgcGVyZmVjdCBzbyB1c2luZyB1c2VyLWRlZmluZWQgZnVuY3Rpb25zIGlzCi1vcHQtaW4pLiBTZWUgdGhlIGB1c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWRgIGluIGBjYXNzYW5kcmEueWFtbGAgdG8KLWVuYWJsZSB0aGVtLgotPT09PQotCi1BIGZ1bmN0aW9uIGlzIGlkZW50aWZpZXIgYnkgaXRzIG5hbWU6Ci0KLVtzb3VyY2UsIGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2Z1bmN0aW9uLmJuZltdCi0tLS0tCi0KLT09PSBTY2FsYXIgZnVuY3Rpb25zCi0KLVtbc2NhbGFyLW5hdGl2ZS1mdW5jdGlvbnNdXQotPT09PSBOYXRpdmUgZnVuY3Rpb25zCi0KLT09PT09IENhc3QKLQotVGhlIGBjYXN0YCBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjb252ZXJ0cyBvbmUgbmF0aXZlIGRhdGF0eXBlIHRvCi1hbm90aGVyLgotCi1UaGUgZm9sbG93aW5nIHRhYmxlIGRlc2NyaWJlcyB0aGUgY29udmVyc2lvbnMgc3VwcG9ydGVkIGJ5IHRoZSBgY2FzdGAKLWZ1bmN0aW9uLiBDYXNzYW5kcmEgd2lsbCBzaWxlbnRseSBpZ25vcmUgYW55IGNhc3QgY29udmVydGluZyBhIGRhdGF0eXBlCi1pbnRvIGl0cyBvd24gZGF0YXR5cGUuCi0KLVtjb2xzPSIsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxGcm9tIHxUbwotCi18IGBhc2NpaWAgfCBgdGV4dGAsIGB2YXJjaGFyYAotCi18IGBiaWdpbnRgIHwgYHRpbnlpbnRgLCBgc21hbGxpbnRgLCBgaW50YCwgYGZsb2F0YCwgYGRvdWJsZWAsIGBkZWNpbWFsYCwgYHZhcmludGAsCi1gdGV4dGAsIGB2YXJjaGFyYAotCi18IGBib29sZWFuYCB8IGB0ZXh0YCwgYHZhcmNoYXJgCi0KLXwgYGNvdW50ZXJgIHwgYHRpbnlpbnRgLCBgc21hbGxpbnRgLCBgaW50YCwgYGJpZ2ludGAsIGBmbG9hdGAsIGBkb3VibGVgLCBgZGVjaW1hbGAsCi1gdmFyaW50YCwgYHRleHRgLCBgdmFyY2hhcmAKLQotfCBgZGF0ZWAgfCBgdGltZXN0YW1wYAotCi18IGBkZWNpbWFsYCB8IGB0aW55aW50YCwgYHNtYWxsaW50YCwgYGludGAsIGBiaWdpbnRgLCBgZmxvYXRgLCBgZG91YmxlYCwgYHZhcmludGAsCi1gdGV4dGAsIGB2YXJjaGFyYAotCi18IGBkb3VibGVgIHwgYHRpbnlpbnRgLCBgc21hbGxpbnRgLCBgaW50YCwgYGJpZ2ludGAsIGBmbG9hdGAsIGBkZWNpbWFsYCwgYHZhcmludGAsCi1gdGV4dGAsIGB2YXJjaGFyYAotCi18IGBmbG9hdGAgfCBgdGlueWludGAsIGBzbWFsbGludGAsIGBpbnRgLCBgYmlnaW50YCwgYGRvdWJsZWAsIGBkZWNpbWFsYCwgYHZhcmludGAsCi1gdGV4dGAsIGB2YXJjaGFyYAotCi18IGBpbmV0YCB8IGB0ZXh0YCwgYHZhcmNoYXJgCi0KLXwgYGludGAgfCBgdGlueWludGAsIGBzbWFsbGludGAsIGBiaWdpbnRgLCBgZmxvYXRgLCBgZG91YmxlYCwgYGRlY2ltYWxgLCBgdmFyaW50YCwKLWB0ZXh0YCwgYHZhcmNoYXJgCi0KLXwgYHNtYWxsaW50YCB8IGB0aW55aW50YCwgYGludGAsIGBiaWdpbnRgLCBgZmxvYXRgLCBgZG91YmxlYCwgYGRlY2ltYWxgLCBgdmFyaW50YCwKLWB0ZXh0YCwgYHZhcmNoYXJgCi0KLXwgYHRpbWVgIHwgYHRleHRgLCBgdmFyY2hhcmAKLQotfCBgdGltZXN0YW1wYCB8IGBkYXRlYCwgYHRleHRgLCBgdmFyY2hhcmAKLQotfCBgdGltZXV1aWRgIHwgYHRpbWVzdGFtcGAsIGBkYXRlYCwgYHRleHRgLCBgdmFyY2hhcmAKLQotfCBgdGlueWludGAgfCBgdGlueWludGAsIGBzbWFsbGludGAsIGBpbnRgLCBgYmlnaW50YCwgYGZsb2F0YCwgYGRvdWJsZWAsIGBkZWNpbWFsYCwKLWB2YXJpbnRgLCBgdGV4dGAsIGB2YXJjaGFyYAotCi18IGB1dWlkYCB8IGB0ZXh0YCwgYHZhcmNoYXJgCi0KLXwgYHZhcmludGAgfCBgdGlueWludGAsIGBzbWFsbGludGAsIGBpbnRgLCBgYmlnaW50YCwgYGZsb2F0YCwgYGRvdWJsZWAsIGBkZWNpbWFsYCwKLWB0ZXh0YCwgYHZhcmNoYXJgCi18PT09Ci0KLVRoZSBjb252ZXJzaW9ucyByZWx5IHN0cmljdGx5IG9uIEphdmEncyBzZW1hbnRpY3MuIEZvciBleGFtcGxlLCB0aGUKLWRvdWJsZSB2YWx1ZSAxIHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSB0ZXh0IHZhbHVlICcxLjAnLiBGb3IgaW5zdGFuY2U6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotU0VMRUNUIGF2ZyhjYXN0KGNvdW50IGFzIGRvdWJsZSkpIEZST00gbXlUYWJsZQotLS0tLQotCi09PT09PSBUb2tlbgotCi1UaGUgYHRva2VuYCBmdW5jdGlvbiBjb21wdXRlcyB0aGUgdG9rZW4gZm9yIGEgZ2l2ZW4gcGFydGl0aW9uIGtleS4gCi1UaGUgZXhhY3Qgc2lnbmF0dXJlIG9mIHRoZSB0b2tlbiBmdW5jdGlvbiBkZXBlbmRzIG9uIHRoZSB0YWJsZSBjb25jZXJuZWQgYW5kIHRoZSBwYXJ0aXRpb25lciB1c2VkIGJ5IHRoZSBjbHVzdGVyLgotCi1UaGUgdHlwZSBvZiB0aGUgYXJndW1lbnRzIG9mIHRoZSBgdG9rZW5gIGRlcGVuZCBvbiB0aGUgcGFydGl0aW9uIGtleSBjb2x1bW4gdHlwZS4gVGhlIHJldHVybmVkIHR5cGUgZGVwZW5kcyBvbiB0aGUgZGVmaW5lZCBwYXJ0aXRpb25lcjoKLQotW2NvbHM9IiwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfFBhcnRpdGlvbmVyIHwgUmV0dXJuZWQgdHlwZQotfCBNdXJtdXIzUGFydGl0aW9uZXIgfCBgYmlnaW50YAotfCBSYW5kb21QYXJ0aXRpb25lciB8IGB2YXJpbnRgCi18IEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIgfCBgYmxvYmAKLXw9PT0KLQotRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgdGFibGU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX3RhYmxlX3NpbXBsZS5jcWxbXQotLS0tLQotCi1UaGUgdGFibGUgdXNlcyB0aGUgZGVmYXVsdCBNdXJtdXIzUGFydGl0aW9uZXIuCi1UaGUgYHRva2VuYCBmdW5jdGlvbiB1c2VzIHRoZSBzaW5nbGUgYXJndW1lbnQgYHRleHRgLCBiZWNhdXNlIHRoZSBwYXJ0aXRpb24ga2V5IGlzIGB1c2VyaWRgIG9mIHRleHQgdHlwZS4KLVRoZSByZXR1cm5lZCB0eXBlIHdpbGwgYmUgYGJpZ2ludGAuCi0KLT09PT09IFV1aWQKLQotVGhlIGB1dWlkYCBmdW5jdGlvbiB0YWtlcyBubyBwYXJhbWV0ZXJzIGFuZCBnZW5lcmF0ZXMgYSByYW5kb20gdHlwZSA0Ci11dWlkIHN1aXRhYmxlIGZvciB1c2UgaW4gYElOU0VSVGAgb3IgYFVQREFURWAgc3RhdGVtZW50cy4KLQotPT09PT0gVGltZXV1aWQgZnVuY3Rpb25zCi0KLT09PT09PSBgbm93YAotCi1UaGUgYG5vd2AgZnVuY3Rpb24gdGFrZXMgbm8gYXJndW1lbnRzIGFuZCBnZW5lcmF0ZXMsIG9uIHRoZSBjb29yZGluYXRvcgotbm9kZSwgYSBuZXcgdW5pcXVlIHRpbWV1dWlkIGF0IHRoZSB0aW1lIHRoZSBmdW5jdGlvbiBpcyBpbnZva2VkLiBOb3RlCi10aGF0IHRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgaW5zZXJ0aW9uIGJ1dCBpcyBsYXJnZWx5IG5vbi1zZW5zaWNhbCBpbgotYFdIRVJFYCBjbGF1c2VzLiAKLQotRm9yIGV4YW1wbGUsIGEgcXVlcnkgb2YgdGhlIGZvcm06Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvdGltZXV1aWRfbm93LmNxbFtdCi0tLS0tCi0KLXdpbGwgbm90IHJldHVybiBhIHJlc3VsdCwgYnkgZGVzaWduLCBzaW5jZSB0aGUgdmFsdWUgcmV0dXJuZWQgYnkKLWBub3coKWAgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUuCi0KLWBjdXJyZW50VGltZVVVSURgIGlzIGFuIGFsaWFzIG9mIGBub3dgLgotCi09PT09PT0gYG1pblRpbWV1dWlkYCBhbmQgYG1heFRpbWV1dWlkYAotCi1UaGUgYG1pblRpbWV1dWlkYCBmdW5jdGlvbiB0YWtlcyBhIGB0aW1lc3RhbXBgIHZhbHVlIGB0YCwgZWl0aGVyIGEgdGltZXN0YW1wIG9yIGEgZGF0ZSBzdHJpbmcuCi1JdCByZXR1cm5zIGEgX2Zha2VfIGB0aW1ldXVpZGAgY29ycmVzcG9uZGluZyB0byB0aGUgX3NtYWxsZXN0XyBwb3NzaWJsZSBgdGltZXV1aWRgIGZvciB0aW1lc3RhbXAgYHRgLiAKLVRoZSBgbWF4VGltZXV1aWRgIHdvcmtzIHNpbWlsYXJseSwgYnV0IHJldHVybnMgdGhlIF9sYXJnZXN0XyBwb3NzaWJsZSBgdGltZXV1aWRgLgotCi1Gb3IgZXhhbXBsZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC90aW1ldXVpZF9taW5fbWF4LmNxbFtdCi0tLS0tCi0KLXdpbGwgc2VsZWN0IGFsbCByb3dzIHdoZXJlIHRoZSBgdGltZXV1aWRgIGNvbHVtbiBgdGAgaXMgbGF0ZXIgdGhhbiBgJzIwMTMtMDEtMDEgMDA6MDUrMDAwMCdgIGFuZCBlYXJsaWVyIHRoYW4gYCcyMDEzLTAyLTAyIDEwOjAwKzAwMDAnYC4gCi1UaGUgY2xhdXNlIGB0ID49IG1heFRpbWV1dWlkKCcyMDEzLTAxLTAxIDAwOjA1KzAwMDAnKWAgd291bGQgc3RpbGwgX25vdF8gc2VsZWN0IGEgYHRpbWV1dWlkYCBnZW5lcmF0ZWQgZXhhY3RseSBhdCAnMjAxMy0wMS0wMSAwMDowNSswMDAwJywgYW5kIGlzIGVzc2VudGlhbGx5IGVxdWl2YWxlbnQgdG8gYHQgPiBtYXhUaW1ldXVpZCgnMjAxMy0wMS0wMSAwMDowNSswMDAwJylgLgotCi1bTk9URV0KLS5Ob3RlCi09PT09Ci1UaGUgdmFsdWVzIGdlbmVyYXRlZCBieSBgbWluVGltZXV1aWRgIGFuZCBgbWF4VGltZXV1aWRgIGFyZSBjYWxsZWQgX2Zha2VfIFVVSUQgYmVjYXVzZSB0aGV5IGRvIG5vIHJlc3BlY3QgdGhlIHRpbWUtYmFzZWQgVVVJRCBnZW5lcmF0aW9uIHByb2Nlc3MKLXNwZWNpZmllZCBieSB0aGUgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDEyMi50eHRbSUVURiBSRkMgNDEyMl0uIAotSW4gcGFydGljdWxhciwgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZXNlIHR3byBtZXRob2RzIHdpbGwgbm90IGJlIHVuaXF1ZS4KLVRodXMsIG9ubHkgdXNlIHRoZXNlIG1ldGhvZHMgZm9yICpxdWVyeWluZyosIG5vdCBmb3IgKmluc2VydGlvbiosIHRvIHByZXZlbnQgcG9zc2libGUgZGF0YSBvdmVyd3JpdGluZy4gCi09PT09Ci0KLT09PT09IERhdGV0aW1lIGZ1bmN0aW9ucwotCi09PT09PT0gUmV0cmlldmluZyB0aGUgY3VycmVudCBkYXRlL3RpbWUKLQotVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgdGhlIGRhdGUvdGltZSBhdCB0aGUKLXRpbWUgd2hlcmUgdGhlIGZ1bmN0aW9uIGlzIGludm9rZWQ6Ci0KLVtjb2xzPSIsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxGdW5jdGlvbiBuYW1lIHxPdXRwdXQgdHlwZQotCi18IGBjdXJyZW50VGltZXN0YW1wYCB8IGB0aW1lc3RhbXBgCi0KLXwgYGN1cnJlbnREYXRlYCB8IGBkYXRlYAotCi18IGBjdXJyZW50VGltZWAgfCBgdGltZWAKLQotfCBgY3VycmVudFRpbWVVVUlEYCB8IGB0aW1lVVVJRGAKLXw9PT0KLQotRm9yIGV4YW1wbGUgdGhlIGxhc3QgdHdvIGRheXMgb2YgZGF0YSBjYW4gYmUgcmV0cmlldmVkIHVzaW5nOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2N1cnJlbnRkYXRlLmNxbFtdCi0tLS0tCi0KLT09PT09PSBUaW1lIGNvbnZlcnNpb24gZnVuY3Rpb25zCi0KLUEgbnVtYmVyIG9mIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgdG8gY29udmVydCBhIGB0aW1ldXVpZGAsIGEgYHRpbWVzdGFtcGAgb3IgYSBgZGF0ZWAgaW50byBhbm90aGVyIGBuYXRpdmVgIHR5cGUuCi0KLVtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18RnVuY3Rpb24gbmFtZSB8SW5wdXQgdHlwZSB8RGVzY3JpcHRpb24KLQotfCBgdG9EYXRlYCB8IGB0aW1ldXVpZGAgfCBDb252ZXJ0cyB0aGUgYHRpbWV1dWlkYCBhcmd1bWVudCBpbnRvIGEgYGRhdGVgIHR5cGUKLQotfCBgdG9EYXRlYCB8IGB0aW1lc3RhbXBgIHwgQ29udmVydHMgdGhlIGB0aW1lc3RhbXBgIGFyZ3VtZW50IGludG8gYSBgZGF0ZWAgdHlwZQotCi18IGB0b1RpbWVzdGFtcGAgfCBgdGltZXV1aWRgIHwgQ29udmVydHMgdGhlIGB0aW1ldXVpZGAgYXJndW1lbnQgaW50byBhIGB0aW1lc3RhbXBgIHR5cGUKLQotfCBgdG9UaW1lc3RhbXBgIHwgYGRhdGVgIHwgQ29udmVydHMgdGhlIGBkYXRlYCBhcmd1bWVudCBpbnRvIGEgYHRpbWVzdGFtcGAgdHlwZQotCi18IGB0b1VuaXhUaW1lc3RhbXBgIHwgYHRpbWV1dWlkYCB8IENvbnZlcnRzIHRoZSBgdGltZXV1aWRgIGFyZ3VtZW50IGludG8gYSBgYmlnSW50YCByYXcgdmFsdWUKLQotfCBgdG9Vbml4VGltZXN0YW1wYCB8IGB0aW1lc3RhbXBgIHwgQ29udmVydHMgdGhlIGB0aW1lc3RhbXBgIGFyZ3VtZW50IGludG8gYSBgYmlnSW50YCByYXcgdmFsdWUKLQotfCBgdG9Vbml4VGltZXN0YW1wYCB8IGBkYXRlYCB8IENvbnZlcnRzIHRoZSBgZGF0ZWAgYXJndW1lbnQgaW50byBhIGBiaWdJbnRgIHJhdyB2YWx1ZQotCi18IGBkYXRlT2ZgIHwgYHRpbWV1dWlkYCB8IFNpbWlsYXIgdG8gYHRvVGltZXN0YW1wKHRpbWV1dWlkKWAgKERFUFJFQ0FURUQpCi0KLXwgYHVuaXhUaW1lc3RhbXBPZmAgfCBgdGltZXV1aWRgIHwgU2ltaWxhciB0byBgdG9Vbml4VGltZXN0YW1wKHRpbWV1dWlkKWAgKERFUFJFQ0FURUQpCi18PT09Ci0KLT09PT09IEJsb2IgY29udmVyc2lvbiBmdW5jdGlvbnMKLQotQSBudW1iZXIgb2YgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCB0byBjb252ZXJ0IHRoZSBuYXRpdmUgdHlwZXMgaW50bwotYmluYXJ5IGRhdGEsIG9yIGEgYGJsb2JgLiAKLUZvciBldmVyeSB4cmVmOmNxbC90eXBlcy5hZG9jI25hdGl2ZS10eXBlc1t0eXBlXSBzdXBwb3J0ZWQgYnkgQ1FMLCB0aGUgZnVuY3Rpb24gYHR5cGVBc0Jsb2JgIHRha2VzIGEgYXJndW1lbnQgb2YgdHlwZSBgdHlwZWAgYW5kIHJldHVybnMgaXQgYXMgYSBgYmxvYmAuCi1Db252ZXJzZWx5LCB0aGUgZnVuY3Rpb24gYGJsb2JBc1R5cGVgIHRha2VzIGEgNjQtYml0IGBibG9iYCBhcmd1bWVudCBhbmQgY29udmVydHMgaXQgdG8gYSBgYmlnaW50YCB2YWx1ZS4gCi1Gb3IgZXhhbXBsZSwgYGJpZ2ludEFzQmxvYigzKWAgcmV0dXJucyBgMHgwMDAwMDAwMDAwMDAwMDAzYCBhbmQgYGJsb2JBc0JpZ2ludCgweDAwMDAwMDAwMDAwMDAwMDMpYCByZXR1cm5zIGAzYC4KLQotW1t1c2VyLWRlZmluZWQtc2NhbGFyLWZ1bmN0aW9uc11dCi09PT09IFVzZXItZGVmaW5lZCBmdW5jdGlvbnMKLQotVXNlci1kZWZpbmVkIGZ1bmN0aW9ucyAoVURGcykgZXhlY3V0ZSB1c2VyLXByb3ZpZGVkIGNvZGUgaW4gQ2Fzc2FuZHJhLiAKLUJ5IGRlZmF1bHQsIENhc3NhbmRyYSBzdXBwb3J0cyBkZWZpbmluZyBmdW5jdGlvbnMgaW4gX0phdmFfIGFuZCBfSmF2YVNjcmlwdF8uCi1TdXBwb3J0IGZvciBvdGhlciBKU1IgMjIzIGNvbXBsaWFudCBzY3JpcHRpbmcgbGFuZ3VhZ2VzLCBzdWNoIGFzIFB5dGhvbiwgUnVieSwgYW5kIFNjYWxhLCBpcyBwb3NzaWJsZSBieSBhZGRpbmcgYSBKQVIgdG8gdGhlIGNsYXNzcGF0aC4KLQotVURGcyBhcmUgcGFydCBvZiB0aGUgQ2Fzc2FuZHJhIHNjaGVtYSwgYW5kIGFyZSBhdXRvbWF0aWNhbGx5IHByb3BhZ2F0ZWQgdG8gYWxsIG5vZGVzIGluIHRoZSBjbHVzdGVyLiAgCi1VREZzIGNhbiBiZSBfb3ZlcmxvYWRlZF8sIHNvIHRoYXQgbXVsdGlwbGUgVURGcyB3aXRoIGRpZmZlcmVudCBhcmd1bWVudCB0eXBlcyBjYW4gaGF2ZSB0aGUgc2FtZSBmdW5jdGlvbiBuYW1lLgotCi0KLVtOT1RFXQotLk5vdGUKLT09PT0KLV9KYXZhU2NyaXB0XyB1c2VyLWRlZmluZWQgZnVuY3Rpb25zIGhhdmUgYmVlbiBkZXByZWNhdGVkLiBUaGV5IGFyZSBwbGFubmVkIGZvciByZW1vdmFsCi1pbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLgotPT09PQotCi1Gb3IgZXhhbXBsZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9mdW5jdGlvbl9vdmVybG9hZC5jcWxbXQotLS0tLQotCi1VREZzIGFyZSBzdXNjZXB0aWJsZSB0byBhbGwgb2YgdGhlIG5vcm1hbCBwcm9ibGVtcyB3aXRoIHRoZSBjaG9zZW4gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIAotQWNjb3JkaW5nbHksIGltcGxlbWVudGF0aW9ucyBzaG91bGQgYmUgc2FmZSBhZ2FpbnN0IG51bGwgcG9pbnRlciBleGNlcHRpb25zLCBpbGxlZ2FsIGFyZ3VtZW50cywgb3IgYW55IG90aGVyIHBvdGVudGlhbCBzb3VyY2Ugb2YgZXhjZXB0aW9ucy4gCi1BbiBleGNlcHRpb24gZHVyaW5nIGZ1bmN0aW9uIGV4ZWN1dGlvbiB3aWxsIHJlc3VsdCBpbiB0aGUgZW50aXJlIHN0YXRlbWVudCBmYWlsaW5nLgotVmFsaWQgcXVlcmllcyBmb3IgVURGIHVzZSBhcmUgYFNFTEVDVGAsIGBJTlNFUlRgIGFuZCBgVVBEQVRFYCBzdGF0ZW1lbnRzLgotCi1fQ29tcGxleF8gdHlwZXMgbGlrZSBjb2xsZWN0aW9ucywgdHVwbGUgdHlwZXMgYW5kIHVzZXItZGVmaW5lZCB0eXBlcyBhcmUgdmFsaWQgYXJndW1lbnQgYW5kIHJldHVybiB0eXBlcyBpbiBVREZzLiAKLVR1cGxlIHR5cGVzIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMgdXNlIHRoZSBEYXRhU3RheCBKYXZhIERyaXZlciBjb252ZXJzaW9uIGZ1bmN0aW9ucy4KLVBsZWFzZSBzZWUgdGhlIEphdmEgRHJpdmVyIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb24gaGFuZGxpbmcgdHVwbGUgdHlwZXMgYW5kIHVzZXItZGVmaW5lZCB0eXBlcy4KLQotQXJndW1lbnRzIGZvciBmdW5jdGlvbnMgY2FuIGJlIGxpdGVyYWxzIG9yIHRlcm1zLiAKLVByZXBhcmVkIHN0YXRlbWVudCBwbGFjZWhvbGRlcnMgY2FuIGJlIHVzZWQsIHRvby4KLQotTm90ZSB0aGUgdXNlIHRoZSBkb3VibGUgZG9sbGFyLXNpZ24gc3ludGF4IHRvIGVuY2xvc2UgdGhlIFVERiBzb3VyY2UgY29kZS4gCi0KLUZvciBleGFtcGxlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2Z1bmN0aW9uX2RvbGxhcnNpZ24uY3FsW10KLS0tLS0KLQotVGhlIGltcGxpY2l0bHkgYXZhaWxhYmxlIGB1ZGZDb250ZXh0YCBmaWVsZCAob3IgYmluZGluZyBmb3Igc2NyaXB0IFVERnMpIHByb3ZpZGVzIHRoZSBuZWNlc3NhcnkgZnVuY3Rpb25hbGl0eSB0byBjcmVhdGUgbmV3IFVEVCBhbmQgdHVwbGUgdmFsdWVzOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2Z1bmN0aW9uX3VkZmNvbnRleHQuY3FsW10KLS0tLS0KLQotVGhlIGRlZmluaXRpb24gb2YgdGhlIGBVREZDb250ZXh0YCBpbnRlcmZhY2UgY2FuIGJlIGZvdW5kIGluIHRoZSBBcGFjaGUgQ2Fzc2FuZHJhIHNvdXJjZSBjb2RlIGZvciBgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuVURGQ29udGV4dGAuCi0KLVtzb3VyY2UsamF2YV0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkSkFWQS91ZGZjb250ZXh0LmphdmFbXQotLS0tLQotCi1KYXZhIFVERnMgYWxyZWFkeSBoYXZlIHNvbWUgaW1wb3J0cyBmb3IgY29tbW9uIGludGVyZmFjZXMgYW5kIGNsYXNzZXMgZGVmaW5lZC4gVGhlc2UgaW1wb3J0cyBhcmU6Ci0KLVtzb3VyY2UsamF2YV0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkSkFWQS91ZGZfaW1wb3J0cy5qYXZhW10KLS0tLS0KLQotUGxlYXNlIG5vdGUsIHRoYXQgdGhlc2UgY29udmVuaWVuY2UgaW1wb3J0cyBhcmUgbm90IGF2YWlsYWJsZSBmb3Igc2NyaXB0IFVERnMuCi0KLVtbY3JlYXRlLWZ1bmN0aW9uLXN0YXRlbWVudF1dCi09PT09IENSRUFURSBGVU5DVElPTiBzdGF0ZW1lbnQKLQotQ3JlYXRpbmcgYSBuZXcgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIHVzZXMgdGhlIGBDUkVBVEUgRlVOQ1RJT05gIHN0YXRlbWVudDoKLQotW3NvdXJjZSxibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9jcmVhdGVfZnVuY3Rpb25fc3RhdGVtZW50LmJuZltdCi0tLS0tCi0KLUZvciBleGFtcGxlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2NyZWF0ZV9mdW5jdGlvbi5jcWxbXQotLS0tLQotCi1gQ1JFQVRFIEZVTkNUSU9OYCB3aXRoIHRoZSBvcHRpb25hbCBgT1IgUkVQTEFDRWAga2V5d29yZHMgY3JlYXRlcyBlaXRoZXIgYSBmdW5jdGlvbiBvciByZXBsYWNlcyBhbiBleGlzdGluZyBvbmUgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUuIAotQSBgQ1JFQVRFIEZVTkNUSU9OYCB3aXRob3V0IGBPUiBSRVBMQUNFYCBmYWlscyBpZiBhIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGFscmVhZHkgZXhpc3RzLiAgCi1JZiB0aGUgb3B0aW9uYWwgYElGIE5PVCBFWElTVFNgIGtleXdvcmRzIGFyZSB1c2VkLCB0aGUgZnVuY3Rpb24gd2lsbCBvbmx5IGJlIGNyZWF0ZWQgb25seSBpZiBhbm90aGVyIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGRvZXMgbm90Ci1leGlzdC4KLWBPUiBSRVBMQUNFYCBhbmQgYElGIE5PVCBFWElTVFNgIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyLgotCi1CZWhhdmlvciBmb3IgYG51bGxgIGlucHV0IHZhbHVlcyBtdXN0IGJlIGRlZmluZWQgZm9yIGVhY2ggZnVuY3Rpb246Ci0KLSogYFJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUYCBkZWNsYXJlcyB0aGF0IHRoZSBmdW5jdGlvbiB3aWxsIGFsd2F5cyByZXR1cm4gYG51bGxgIGlmIGFueSBvZiB0aGUgaW5wdXQgYXJndW1lbnRzIGlzIGBudWxsYC4KLSogYENBTExFRCBPTiBOVUxMIElOUFVUYCBkZWNsYXJlcyB0aGF0IHRoZSBmdW5jdGlvbiB3aWxsIGFsd2F5cyBiZSBleGVjdXRlZC4KLQotPT09PT0gRnVuY3Rpb24gU2lnbmF0dXJlCi0KLVNpZ25hdHVyZXMgYXJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggaW5kaXZpZHVhbCBmdW5jdGlvbnMuIFRoZSBzaWduYXR1cmUgY29uc2lzdHMgb2YgYSBmdWxseS1xdWFsaWZpZWQgZnVuY3Rpb24gbmFtZSBvZiB0aGUgPGtleXNwYWNlPi48ZnVuY3Rpb25fbmFtZT4gYW5kIGEgY29uY2F0ZW5hdGVkIGxpc3Qgb2YgYWxsIHRoZSBhcmd1bWVudCB0eXBlcy4KLQotTm90ZSB0aGF0IGtleXNwYWNlIG5hbWVzLCBmdW5jdGlvbiBuYW1lcyBhbmQgYXJndW1lbnQgdHlwZXMgYXJlIHN1YmplY3QgdG8gdGhlIGRlZmF1bHQgbmFtaW5nIGNvbnZlbnRpb25zIGFuZCBjYXNlLXNlbnNpdGl2aXR5IHJ1bGVzLgotCi1GdW5jdGlvbnMgYmVsb25nIHRvIGEga2V5c3BhY2U7IGlmIG5vIGtleXNwYWNlIGlzIHNwZWNpZmllZCwgdGhlIGN1cnJlbnQga2V5c3BhY2UgaXMgdXNlZC4gCi1Vc2VyLWRlZmluZWQgZnVuY3Rpb25zIGFyZSBub3QgYWxsb3dlZCBpbiB0aGUgc3lzdGVtIGtleXNwYWNlcy4KLQotW1tkcm9wLWZ1bmN0aW9uLXN0YXRlbWVudF1dCi09PT09IERST1AgRlVOQ1RJT04gc3RhdGVtZW50Ci0KLURyb3BwaW5nIGEgZnVuY3Rpb24gdXNlcyB0aGUgYERST1AgRlVOQ1RJT05gIHN0YXRlbWVudDoKLQotW3NvdXJjZSwgYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvZHJvcF9mdW5jdGlvbl9zdGF0ZW1lbnQuYm5mW10KLS0tLS0KLQotRm9yIGV4YW1wbGU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvZHJvcF9mdW5jdGlvbi5jcWxbXQotLS0tLQotCi1Zb3UgbXVzdCBzcGVjaWZ5IHRoZSBhcmd1bWVudCB0eXBlcyBvZiB0aGUgZnVuY3Rpb24sIHRoZSBhcmd1bWVudHNfc2lnbmF0dXJlLCBpbiB0aGUgZHJvcCBjb21tYW5kIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBvdmVybG9hZGVkIGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgYnV0IGRpZmZlcmVudCBzaWduYXR1cmVzLiAgCi1gRFJPUCBGVU5DVElPTmAgd2l0aCB0aGUgb3B0aW9uYWwgYElGIEVYSVNUU2Aga2V5d29yZHMgZHJvcHMgYSBmdW5jdGlvbiBpZiBpdCBleGlzdHMsIGJ1dCBkb2VzIG5vdCB0aHJvdyBhbiBlcnJvciBpZiBpdCBkb2Vzbid0LgotCi1bW2FnZ3JlZ2F0ZS1mdW5jdGlvbnNdXQotPT09IEFnZ3JlZ2F0ZSBmdW5jdGlvbnMKLQotQWdncmVnYXRlIGZ1bmN0aW9ucyB3b3JrIG9uIGEgc2V0IG9mIHJvd3MuIAotVmFsdWVzIGZvciBlYWNoIHJvdyBhcmUgaW5wdXQsIHRvIHJldHVybiBhIHNpbmdsZSB2YWx1ZSBmb3IgdGhlIHNldCBvZiByb3dzIGFnZ3JlZ2F0ZWQuCi0KLUlmIGBub3JtYWxgIGNvbHVtbnMsIGBzY2FsYXIgZnVuY3Rpb25zYCwgYFVEVGAgZmllbGRzLCBgd3JpdGV0aW1lYCwgb3IgYHR0bGAgYXJlIHNlbGVjdGVkIHRvZ2V0aGVyIHdpdGggYWdncmVnYXRlIGZ1bmN0aW9ucywgdGhlIHZhbHVlcwotcmV0dXJuZWQgZm9yIHRoZW0gd2lsbCBiZSB0aGUgb25lcyBvZiB0aGUgZmlyc3Qgcm93IG1hdGNoaW5nIHRoZSBxdWVyeS4KLQotPT09PSBOYXRpdmUgYWdncmVnYXRlcwotCi1bW2NvdW50LWZ1bmN0aW9uXV0KLT09PT09IENvdW50Ci0KLVRoZSBgY291bnRgIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNvdW50IHRoZSByb3dzIHJldHVybmVkIGJ5IGEgcXVlcnkuCi0KLUZvciBleGFtcGxlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2NvdW50LmNxbFtdCi0tLS0tCi0KLUl0IGFsc28gY2FuIGNvdW50IHRoZSBub24tbnVsbCB2YWx1ZXMgb2YgYSBnaXZlbiBjb2x1bW46Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvY291bnRfbm9ubnVsbC5jcWxbXQotLS0tLQotCi09PT09PSBNYXggYW5kIE1pbgotCi1UaGUgYG1heGAgYW5kIGBtaW5gIGZ1bmN0aW9ucyBjb21wdXRlIHRoZSBtYXhpbXVtIGFuZCB0aGUgbWluaW11bSB2YWx1ZSByZXR1cm5lZCBieSBhIHF1ZXJ5IGZvciBhIGdpdmVuIGNvbHVtbi4gCi0KLUZvciBleGFtcGxlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML21pbl9tYXguY3FsW10KLS0tLS0KLQotPT09PT0gU3VtCi0KLVRoZSBgc3VtYCBmdW5jdGlvbiBzdW1zIHVwIGFsbCB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IGEgcXVlcnkgZm9yIGEgZ2l2ZW4gY29sdW1uLiAKLQotRm9yIGV4YW1wbGU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvc3VtLmNxbFtdCi0tLS0tCi0KLT09PT09IEF2ZwotCi1UaGUgYGF2Z2AgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGF2ZXJhZ2Ugb2YgYWxsIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgYSBxdWVyeSBmb3IgYSBnaXZlbiBjb2x1bW4uIAotCi1Gb3IgZXhhbXBsZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9hdmcuY3FsW10KLS0tLS0KLQotW1t1c2VyLWRlZmluZWQtYWdncmVnYXRlcy1mdW5jdGlvbnNdXQotPT09PSBVc2VyLURlZmluZWQgQWdncmVnYXRlcyAoVURBcykKLQotVXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZXMgYWxsb3cgdGhlIGNyZWF0aW9uIG9mIGN1c3RvbSBhZ2dyZWdhdGUgZnVuY3Rpb25zLiAKLVVzZXItZGVmaW5lZCBhZ2dyZWdhdGVzIGNhbiBiZSB1c2VkIGluIGBTRUxFQ1RgIHN0YXRlbWVudC4KLQotRWFjaCBhZ2dyZWdhdGUgcmVxdWlyZXMgYW4gX2luaXRpYWwgc3RhdGVfIG9mIHR5cGUgYFNUWVBFYCBkZWZpbmVkIHdpdGggdGhlIGBJTklUQ09ORGB2YWx1ZSAoZGVmYXVsdCB2YWx1ZTogYG51bGxgKS4gCi1UaGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlIHN0YXRlIGZ1bmN0aW9uIG11c3QgaGF2ZSB0eXBlIGBTVFlQRWAuIAotVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgb2YgdGhlIHN0YXRlIGZ1bmN0aW9uIG11c3QgbWF0Y2ggdGhlIHR5cGVzIG9mIHRoZSB1c2VyLWRlZmluZWQgYWdncmVnYXRlIGFyZ3VtZW50cy4gCi1UaGUgc3RhdGUgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggcm93LCBhbmQgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBzdGF0ZSBmdW5jdGlvbiBiZWNvbWVzIHRoZSBuZXcgc3RhdGUuIAotQWZ0ZXIgYWxsIHJvd3MgYXJlIHByb2Nlc3NlZCwgdGhlIG9wdGlvbmFsIGBGSU5BTEZVTkNgIGlzIGV4ZWN1dGVkIHdpdGggbGFzdCBzdGF0ZSB2YWx1ZSBhcyBpdHMgYXJndW1lbnQuCi0KLVRoZSBgU1RZUEVgIHZhbHVlIGlzIG1hbmRhdG9yeSBpbiBvcmRlciB0byBkaXN0aW5ndWlzaCBwb3NzaWJseSBvdmVybG9hZGVkIHZlcnNpb25zIG9mIHRoZSBzdGF0ZSBhbmQvb3IgZmluYWwgZnVuY3Rpb24sIHNpbmNlIHRoZQotb3ZlcmxvYWQgY2FuIGFwcGVhciBhZnRlciBjcmVhdGlvbiBvZiB0aGUgYWdncmVnYXRlLgotCi0KLUEgY29tcGxldGUgd29ya2luZyBleGFtcGxlIGZvciB1c2VyLWRlZmluZWQgYWdncmVnYXRlcyAoYXNzdW1pbmcgdGhhdCBhCi1rZXlzcGFjZSBoYXMgYmVlbiBzZWxlY3RlZCB1c2luZyB0aGUgYFVTRWAgc3RhdGVtZW50KToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC91ZGEuY3FsW10KLS0tLS0KLQotW1tjcmVhdGUtYWdncmVnYXRlLXN0YXRlbWVudF1dCi09PT09IENSRUFURSBBR0dSRUdBVEUgc3RhdGVtZW50Ci0KLUNyZWF0aW5nIChvciByZXBsYWNpbmcpIGEgdXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSBmdW5jdGlvbiB1c2VzIHRoZQotYENSRUFURSBBR0dSRUdBVEVgIHN0YXRlbWVudDoKLQotW3NvdXJjZSwgYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvY3JlYXRlX2FnZ3JlZ2F0ZV9zdGF0ZW1lbnQuYm5mW10KLS0tLS0KLQotU2VlIGFib3ZlIGZvciBhIGNvbXBsZXRlIGV4YW1wbGUuCi0KLVRoZSBgQ1JFQVRFIEFHR1JFR0FURWAgY29tbWFuZCB3aXRoIHRoZSBvcHRpb25hbCBgT1IgUkVQTEFDRWAga2V5d29yZHMgY3JlYXRlcyBlaXRoZXIgYW4gYWdncmVnYXRlIG9yIHJlcGxhY2VzIGFuIGV4aXN0aW5nIG9uZSB3aXRoIHRoZSBzYW1lCi1zaWduYXR1cmUuIAotQSBgQ1JFQVRFIEFHR1JFR0FURWAgd2l0aG91dCBgT1IgUkVQTEFDRWAgZmFpbHMgaWYgYW4gYWdncmVnYXRlIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGFscmVhZHkgZXhpc3RzLgotVGhlIGBDUkVBVEUgQUdHUkVHQVRFYCBjb21tYW5kIHdpdGggdGhlIG9wdGlvbmFsIGBJRiBOT1QgRVhJU1RTYCBrZXl3b3JkcyBjcmVhdGVzIGFuIGFnZ3JlZ2F0ZSBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgotVGhlIGBPUiBSRVBMQUNFYCBhbmQgYElGIE5PVCBFWElTVFNgIHBocmFzZXMgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIuCi0KLVRoZSBgU1RZUEVgIHZhbHVlIGRlZmluZXMgdGhlIHR5cGUgb2YgdGhlIHN0YXRlIHZhbHVlIGFuZCBtdXN0IGJlIHNwZWNpZmllZC4KLVRoZSBvcHRpb25hbCBgSU5JVENPTkRgIGRlZmluZXMgdGhlIGluaXRpYWwgc3RhdGUgdmFsdWUgZm9yIHRoZSBhZ2dyZWdhdGU7IHRoZSBkZWZhdWx0IHZhbHVlIGlzIGBudWxsYC4gCi1BIG5vbi1udWxsIGBJTklUQ09ORGAgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIHN0YXRlIGZ1bmN0aW9ucyB0aGF0IGFyZSBkZWNsYXJlZCB3aXRoIGBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVGAuCi0KLVRoZSBgU0ZVTkNgIHZhbHVlIHJlZmVyZW5jZXMgYW4gZXhpc3RpbmcgZnVuY3Rpb24gdG8gdXNlIGFzIHRoZSBzdGF0ZS1tb2RpZnlpbmcgZnVuY3Rpb24uIAotVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBzdGF0ZSBmdW5jdGlvbiBtdXN0IGhhdmUgdHlwZSBgU1RZUEVgLgotVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgb2YgdGhlIHN0YXRlIGZ1bmN0aW9uIG11c3QgbWF0Y2ggdGhlIHR5cGVzIG9mIHRoZSB1c2VyLWRlZmluZWQgYWdncmVnYXRlIGFyZ3VtZW50cy4KLVRoZSBzdGF0ZSBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCByb3csIGFuZCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIHN0YXRlIGZ1bmN0aW9uIGJlY29tZXMgdGhlIG5ldyBzdGF0ZS4KLVN0YXRlIGlzIG5vdCB1cGRhdGVkIGZvciBzdGF0ZSBmdW5jdGlvbnMgZGVjbGFyZWQgd2l0aCBgUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVRgIGFuZCBjYWxsZWQgd2l0aCBgbnVsbGAuCi1BZnRlciBhbGwgcm93cyBhcmUgcHJvY2Vzc2VkLCB0aGUgb3B0aW9uYWwgYEZJTkFMRlVOQ2AgaXMgZXhlY3V0ZWQgd2l0aCBsYXN0IHN0YXRlIHZhbHVlIGFzIGl0cyBhcmd1bWVudC4KLUl0IG11c3QgdGFrZSBvbmx5IG9uZSBhcmd1bWVudCB3aXRoIHR5cGUgYFNUWVBFYCwgYnV0IHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgYEZJTkFMRlVOQ2AgbWF5IGJlIGEgZGlmZmVyZW50IHR5cGUuIAotQSBmaW5hbCBmdW5jdGlvbiBkZWNsYXJlZCB3aXRoIGBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVGAgbWVhbnMgdGhhdCB0aGUgYWdncmVnYXRlJ3MgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYG51bGxgLCBpZiB0aGUgbGFzdCBzdGF0ZSBpcyBgbnVsbGAuCi0KLUlmIG5vIGBGSU5BTEZVTkNgIGlzIGRlZmluZWQsIHRoZSBvdmVyYWxsIHJldHVybiB0eXBlIG9mIHRoZSBhZ2dyZWdhdGUgZnVuY3Rpb24gaXMgYFNUWVBFYC4gCi1JZiBhIGBGSU5BTEZVTkNgIGlzIGRlZmluZWQsIGl0IGlzIHRoZSByZXR1cm4gdHlwZSBvZiB0aGF0IGZ1bmN0aW9uLgotCi1bW2Ryb3AtYWdncmVnYXRlLXN0YXRlbWVudF1dCi09PT09IERST1AgQUdHUkVHQVRFIHN0YXRlbWVudAotCi1Ecm9wcGluZyBhbiB1c2VyLWRlZmluZWQgYWdncmVnYXRlIGZ1bmN0aW9uIHVzZXMgdGhlIGBEUk9QIEFHR1JFR0FURWAKLXN0YXRlbWVudDoKLQotW3NvdXJjZSwgYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvZHJvcF9hZ2dyZWdhdGVfc3RhdGVtZW50LmJuZltdCi0tLS0tCi0KLUZvciBpbnN0YW5jZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9kcm9wX2FnZ3JlZ2F0ZS5jcWxbXQotLS0tLQotCi1UaGUgYERST1AgQUdHUkVHQVRFYCBzdGF0ZW1lbnQgcmVtb3ZlcyBhbiBhZ2dyZWdhdGUgY3JlYXRlZCB1c2luZyBgQ1JFQVRFIEFHR1JFR0FURWAuIAotWW91IG11c3Qgc3BlY2lmeSB0aGUgYXJndW1lbnQgdHlwZXMgb2YgdGhlIGFnZ3JlZ2F0ZSB0byBkcm9wIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBvdmVybG9hZGVkIGFnZ3JlZ2F0ZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGJ1dCBhCi1kaWZmZXJlbnQgc2lnbmF0dXJlLgotCi1UaGUgYERST1AgQUdHUkVHQVRFYCBjb21tYW5kIHdpdGggdGhlIG9wdGlvbmFsIGBJRiBFWElTVFNgIGtleXdvcmRzIGRyb3BzIGFuIGFnZ3JlZ2F0ZSBpZiBpdCBleGlzdHMsIGFuZCBkb2VzIG5vdGhpbmcgaWYgYSBmdW5jdGlvbiB3aXRoIHRoZQotc2lnbmF0dXJlIGRvZXMgbm90IGV4aXN0LgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9pbmRleC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9pbmRleC5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjQzYmUzLi4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvaW5kZXguYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLT0gVGhlIENhc3NhbmRyYSBRdWVyeSBMYW5ndWFnZSAoQ1FMKQotCi1UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgQ2Fzc2FuZHJhIFF1ZXJ5IExhbmd1YWdlCi0oQ1FMKSB2ZXJzaW9uIDMuCi1Ob3RlIHRoYXQgdGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGxhc3QgdmVyc2lvbiBvZiB0aGUgbGFuZ3VhZ2UuCi1Ib3dldmVyLCB0aGUgeHJlZjpjcWwvY2hhbmdlcy5hZG9jW2NoYW5nZXNdIHNlY3Rpb24gcHJvdmlkZXMgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHZlcnNpb25zIG9mIENRTCBzaW5jZSB2ZXJzaW9uIDMuMC4KLQotQ1FMIG9mZmVycyBhIG1vZGVsIHNpbWlsYXIgdG8gU1FMLgotVGhlIGRhdGEgaXMgc3RvcmVkIGluICp0YWJsZXMqIGNvbnRhaW5pbmcgKnJvd3MqIG9mICpjb2x1bW5zKi4KLUZvciB0aGF0IHJlYXNvbiwgd2hlbiB1c2VkIGluIHRoaXMgZG9jdW1lbnQsIHRoZXNlIHRlcm1zICh0YWJsZXMsIHJvd3MgYW5kIGNvbHVtbnMpIGhhdmUgdGhlIHNhbWUgZGVmaW5pdGlvbiB0aGF0IHRoZXkgaGF2ZSBpbiBTUUwuCi0KLSogeHJlZjpjcWwvZGVmaW5pdGlvbnMuYWRvY1tEZWZpbml0aW9uc10KLSogeHJlZjpjcWwvdHlwZXMuYWRvY1tEYXRhIHR5cGVzXQotKiB4cmVmOmNxbC9kZGwuYWRvY1tEYXRhIGRlZmluaXRpb24gbGFuZ3VhZ2VdCi0qIHhyZWY6Y3FsL2RtbC5hZG9jW0RhdGEgbWFuaXB1bGF0aW9uIGxhbmd1YWdlXQotKiB4cmVmOmNxbC9vcGVyYXRvcnMuYWRvY1tPcGVyYXRvcnNdCi0qIHhyZWY6Y3FsL2luZGV4ZXMuYWRvY1tTZWNvbmRhcnkgaW5kZXhlc10KLSogeHJlZjpjcWwvbXZzLmFkb2NbTWF0ZXJpYWxpemVkIHZpZXdzXQotKiB4cmVmOmNxbC9mdW5jdGlvbnMuYWRvY1tGdW5jdGlvbnNdCi0qIHhyZWY6Y3FsL2pzb24uYWRvY1tKU09OXQotKiB4cmVmOmNxbC9zZWN1cml0eS5hZG9jW0NRTCBzZWN1cml0eV0KLSogeHJlZjpjcWwvdHJpZ2dlcnMuYWRvY1tUcmlnZ2Vyc10KLSogeHJlZjpjcWwvYXBwZW5kaWNlcy5hZG9jW0FwcGVuZGljZXNdCi0qIHhyZWY6Y3FsL2NoYW5nZXMuYWRvY1tDaGFuZ2VzXQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9qc29uLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL2pzb24uYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwYWEyNi4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL2pzb24uYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi09IEpTT04gU3VwcG9ydAotCi1DYXNzYW5kcmEgMi4yIGludHJvZHVjZXMgSlNPTiBzdXBwb3J0IHRvIGBTRUxFQ1QgPHNlbGVjdC1zdGF0ZW1lbnQ+YCBhbmQKLWBJTlNFUlQgPGluc2VydC1zdGF0ZW1lbnQ+YCBzdGF0ZW1lbnRzLiAKLVRoaXMgc3VwcG9ydCBkb2VzIG5vdCBmdW5kYW1lbnRhbGx5IGFsdGVyIHRoZSBDUUwgQVBJIChmb3IgZXhhbXBsZSwgdGhlIHNjaGVtYSBpcyBzdGlsbAotZW5mb3JjZWQpLgotSXQgc2ltcGx5IHByb3ZpZGVzIGEgY29udmVuaWVudCB3YXkgdG8gd29yayB3aXRoIEpTT04gZG9jdW1lbnRzLgotCi09PSBTRUxFQ1QgSlNPTgotCi1XaXRoIGBTRUxFQ1RgIHN0YXRlbWVudHMsIHRoZSBgSlNPTmAga2V5d29yZCBpcyB1c2VkIHRvIHJldHVybiBlYWNoIHJvdyBhcyBhIHNpbmdsZSBgSlNPTmAgZW5jb2RlZCBtYXAuIAotVGhlIHJlbWFpbmRlciBvZiB0aGUgYFNFTEVDVGAgc3RhdGVtZW50IGJlaGF2aW9yIGlzIHRoZSBzYW1lLgotCi1UaGUgcmVzdWx0IG1hcCBrZXlzIG1hdGNoIHRoZSBjb2x1bW4gbmFtZXMgaW4gYSBub3JtYWwgcmVzdWx0IHNldC4gCi1Gb3IgZXhhbXBsZSwgYSBzdGF0ZW1lbnQgbGlrZSBgU0VMRUNUIEpTT04gYSwgdHRsKGIpIEZST00gLi4uYCB3b3VsZCByZXN1bHQgaW4gYSBtYXAgd2l0aCBrZXlzIGAiYSJgIGFuZCBgInR0bChiKSJgLiAKLUhvd2V2ZXIsIHRoZXJlIGlzIG9uZSBub3RhYmxlIGV4Y2VwdGlvbjogZm9yIHN5bW1ldHJ5IHdpdGggYElOU0VSVCBKU09OYCBiZWhhdmlvciwgY2FzZS1zZW5zaXRpdmUgY29sdW1uIG5hbWVzIHdpdGggdXBwZXItY2FzZSBsZXR0ZXJzIHdpbGwgYmUgc3Vycm91bmRlZCB3aXRoIGRvdWJsZSBxdW90ZXMuIAotRm9yIGV4YW1wbGUsIGBTRUxFQ1QgSlNPTiBteUNvbHVtbiBGUk9NIC4uLmAgd291bGQgcmVzdWx0IGluIGEgbWFwIGtleSBgIlwibXlDb2x1bW5cIiJgIHdpdGggZXNjYXBlZCBxdW90ZXMpLgotCi1UaGUgbWFwIHZhbHVlcyB3aWxsIEpTT04tZW5jb2RlZCByZXByZXNlbnRhdGlvbnMgKGFzIGRlc2NyaWJlZCBiZWxvdykgb2YgdGhlIHJlc3VsdCBzZXQgdmFsdWVzLgotCi09PSBJTlNFUlQgSlNPTgotCi1XaXRoIGBJTlNFUlRgIHN0YXRlbWVudHMsIHRoZSBuZXcgYEpTT05gIGtleXdvcmQgY2FuIGJlIHVzZWQgdG8gZW5hYmxlCi1pbnNlcnRpbmcgYSBgSlNPTmAgZW5jb2RlZCBtYXAgYXMgYSBzaW5nbGUgcm93LiBUaGUgZm9ybWF0IG9mIHRoZSBgSlNPTmAKLW1hcCBzaG91bGQgZ2VuZXJhbGx5IG1hdGNoIHRoYXQgcmV0dXJuZWQgYnkgYSBgU0VMRUNUIEpTT05gIHN0YXRlbWVudCBvbgotdGhlIHNhbWUgdGFibGUuIEluIHBhcnRpY3VsYXIsIGNhc2Utc2Vuc2l0aXZlIGNvbHVtbiBuYW1lcyBzaG91bGQgYmUKLXN1cnJvdW5kZWQgd2l0aCBkb3VibGUgcXVvdGVzLiBGb3IgZXhhbXBsZSwgdG8gaW5zZXJ0IGludG8gYSB0YWJsZSB3aXRoCi10d28gY29sdW1ucyBuYW1lZCAibXlLZXkiIGFuZCAidmFsdWUiLCB5b3Ugd291bGQgZG8gdGhlIGZvbGxvd2luZzoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9pbnNlcnRfanNvbi5jcWxbXQotLS0tLQotCi1CeSBkZWZhdWx0IChvciBpZiBgREVGQVVMVCBOVUxMYCBpcyBleHBsaWNpdGx5IHVzZWQpLCBhIGNvbHVtbiBvbWl0dGVkCi1mcm9tIHRoZSBgSlNPTmAgbWFwIHdpbGwgYmUgc2V0IHRvIGBOVUxMYCwgbWVhbmluZyB0aGF0IGFueSBwcmUtZXhpc3RpbmcKLXZhbHVlIGZvciB0aGF0IGNvbHVtbiB3aWxsIGJlIHJlbW92ZWQgKHJlc3VsdGluZyBpbiBhIHRvbWJzdG9uZSBiZWluZwotY3JlYXRlZCkuIEFsdGVybmF0aXZlbHksIGlmIHRoZSBgREVGQVVMVCBVTlNFVGAgZGlyZWN0aXZlIGlzIHVzZWQgYWZ0ZXIKLXRoZSB2YWx1ZSwgb21pdHRlZCBjb2x1bW4gdmFsdWVzIHdpbGwgYmUgbGVmdCB1bnNldCwgbWVhbmluZyB0aGF0Ci1wcmUtZXhpc3RpbmcgdmFsdWVzIGZvciB0aG9zZSBjb2x1bW4gd2lsbCBiZSBwcmVzZXJ2ZWQuCi0KLT09IEpTT04gRW5jb2Rpbmcgb2YgQ2Fzc2FuZHJhIERhdGEgVHlwZXMKLQotV2hlcmUgcG9zc2libGUsIENhc3NhbmRyYSB3aWxsIHJlcHJlc2VudCBhbmQgYWNjZXB0IGRhdGEgdHlwZXMgaW4gdGhlaXIKLW5hdGl2ZSBgSlNPTmAgcmVwcmVzZW50YXRpb24uIENhc3NhbmRyYSB3aWxsIGFsc28gYWNjZXB0IHN0cmluZwotcmVwcmVzZW50YXRpb25zIG1hdGNoaW5nIHRoZSBDUUwgbGl0ZXJhbCBmb3JtYXQgZm9yIGFsbCBzaW5nbGUtZmllbGQKLXR5cGVzLiBGb3IgZXhhbXBsZSwgZmxvYXRzLCBpbnRzLCBVVUlEcywgYW5kIGRhdGVzIGNhbiBiZSByZXByZXNlbnRlZCBieQotQ1FMIGxpdGVyYWwgc3RyaW5ncy4gSG93ZXZlciwgY29tcG91bmQgdHlwZXMsIHN1Y2ggYXMgY29sbGVjdGlvbnMsCi10dXBsZXMsIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMgbXVzdCBiZSByZXByZXNlbnRlZCBieSBuYXRpdmUgYEpTT05gCi1jb2xsZWN0aW9ucyAobWFwcyBhbmQgbGlzdHMpIG9yIGEgSlNPTi1lbmNvZGVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZgotdGhlIGNvbGxlY3Rpb24uCi0KLVRoZSBmb2xsb3dpbmcgdGFibGUgZGVzY3JpYmVzIHRoZSBlbmNvZGluZ3MgdGhhdCBDYXNzYW5kcmEgd2lsbCBhY2NlcHQKLWluIGBJTlNFUlQgSlNPTmAgdmFsdWVzIChhbmQgYGZyb21Kc29uKClgIGFyZ3VtZW50cykgYXMgd2VsbCBhcyB0aGUKLWZvcm1hdCBDYXNzYW5kcmEgd2lsbCB1c2Ugd2hlbiByZXR1cm5pbmcgZGF0YSBmb3IgYFNFTEVDVCBKU09OYAotc3RhdGVtZW50cyAoYW5kIGBmcm9tSnNvbigpYCk6Ci0KLVtjb2xzPSIsLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfFR5cGUgfEZvcm1hdHMgYWNjZXB0ZWQgfFJldHVybiBmb3JtYXQgfE5vdGVzCi0KLXwgYGFzY2lpYCB8IHN0cmluZyB8IHN0cmluZyB8IFVzZXMgSlNPTidzIGBcdWAgY2hhcmFjdGVyIGVzY2FwZQotCi18IGBiaWdpbnRgIHwgaW50ZWdlciwgc3RyaW5nIHwgaW50ZWdlciB8IFN0cmluZyBtdXN0IGJlIHZhbGlkIDY0IGJpdCBpbnRlZ2VyCi0KLXwgYGJsb2JgIHwgc3RyaW5nIHwgc3RyaW5nIHwgU3RyaW5nIHNob3VsZCBiZSAweCBmb2xsb3dlZCBieSBhbiBldmVuIG51bWJlciBvZiBoZXggZGlnaXRzCi0KLXwgYGJvb2xlYW5gIHwgYm9vbGVhbiwgc3RyaW5nIHwgYm9vbGVhbiB8IFN0cmluZyBtdXN0IGJlICJ0cnVlIiBvciAiZmFsc2UiCi0KLXwgYGRhdGVgIHwgc3RyaW5nIHwgc3RyaW5nIHwgRGF0ZSBpbiBmb3JtYXQgYFlZWVktTU0tRERgLCB0aW1lem9uZSBVVEMKLQotfCBgZGVjaW1hbGAgfCBpbnRlZ2VyLCBmbG9hdCwgc3RyaW5nIHwgZmxvYXQgfCBNYXkgZXhjZWVkIDMyIG9yIDY0LWJpdCBJRUVFLTc1NCBmbG9hdGluZyBwb2ludCBwcmVjaXNpb24gaW4gY2xpZW50LXNpZGUgZGVjb2RlcgotCi18IGBkb3VibGVgIHwgaW50ZWdlciwgZmxvYXQsIHN0cmluZyB8IGZsb2F0IHwgU3RyaW5nIG11c3QgYmUgdmFsaWQgaW50ZWdlciBvciBmbG9hdAotCi18IGBmbG9hdGAgfCBpbnRlZ2VyLCBmbG9hdCwgc3RyaW5nIHwgZmxvYXQgfCBTdHJpbmcgbXVzdCBiZSB2YWxpZCBpbnRlZ2VyIG9yIGZsb2F0Ci0KLXwgYGluZXRgIHwgc3RyaW5nIHwgc3RyaW5nIHwgSVB2NCBvciBJUHY2IGFkZHJlc3MKLQotfCBgaW50YCB8IGludGVnZXIsIHN0cmluZyB8IGludGVnZXIgfCBTdHJpbmcgbXVzdCBiZSB2YWxpZCAzMiBiaXQgaW50ZWdlcgotCi18IGBsaXN0YCB8IGxpc3QsIHN0cmluZyB8IGxpc3QgfCBVc2VzIEpTT04ncyBuYXRpdmUgbGlzdCByZXByZXNlbnRhdGlvbgotCi18IGBtYXBgIHwgbWFwLCBzdHJpbmcgfCBtYXAgfCBVc2VzIEpTT04ncyBuYXRpdmUgbWFwIHJlcHJlc2VudGF0aW9uCi0KLXwgYHNtYWxsaW50YCB8IGludGVnZXIsIHN0cmluZyB8IGludGVnZXIgfCBTdHJpbmcgbXVzdCBiZSB2YWxpZCAxNiBiaXQgaW50ZWdlcgotCi18IGBzZXRgIHwgbGlzdCwgc3RyaW5nIHwgbGlzdCB8IFVzZXMgSlNPTidzIG5hdGl2ZSBsaXN0IHJlcHJlc2VudGF0aW9uCi0KLXwgYHRleHRgIHwgc3RyaW5nIHwgc3RyaW5nIHwgVXNlcyBKU09OJ3MgYFx1YCBjaGFyYWN0ZXIgZXNjYXBlCi0KLXwgYHRpbWVgIHwgc3RyaW5nIHwgc3RyaW5nIHwgVGltZSBvZiBkYXkgaW4gZm9ybWF0IGBISC1NTS1TU1suZmZmZmZmZmZmXWAKLQotfCBgdGltZXN0YW1wYCB8IGludGVnZXIsIHN0cmluZyB8IHN0cmluZyB8IEEgdGltZXN0YW1wLiBTdHJpbmdzIGNvbnN0YW50IGFsbG93cyB0byBpbnB1dCBgdGltZXN0YW1wcwotYXMgZGF0ZXMgPHRpbWVzdGFtcHM+YC4gRGF0ZXN0YW1wcyB3aXRoIGZvcm1hdCBgWVlZWS1NTS1ERCBISDpNTTpTUy5TU1NgCi1hcmUgcmV0dXJuZWQuCi0KLXwgYHRpbWV1dWlkYCB8IHN0cmluZyB8IHN0cmluZyB8IFR5cGUgMSBVVUlELiBTZWUgYGNvbnN0YW50YCBmb3IgdGhlIFVVSUQgZm9ybWF0Ci0KLXwgYHRpbnlpbnRgIHwgaW50ZWdlciwgc3RyaW5nIHwgaW50ZWdlciB8IFN0cmluZyBtdXN0IGJlIHZhbGlkIDggYml0IGludGVnZXIKLQotfCBgdHVwbGVgIHwgbGlzdCwgc3RyaW5nIHwgbGlzdCB8IFVzZXMgSlNPTidzIG5hdGl2ZSBsaXN0IHJlcHJlc2VudGF0aW9uCi0KLXwgYFVEVGAgfCBtYXAsIHN0cmluZyB8IG1hcCB8IFVzZXMgSlNPTidzIG5hdGl2ZSBtYXAgcmVwcmVzZW50YXRpb24gd2l0aCBmaWVsZCBuYW1lcyBhcyBrZXlzCi0KLXwgYHV1aWRgIHwgc3RyaW5nIHwgc3RyaW5nIHwgU2VlIGBjb25zdGFudGAgZm9yIHRoZSBVVUlEIGZvcm1hdAotCi18IGB2YXJjaGFyYCB8IHN0cmluZyB8IHN0cmluZyB8IFVzZXMgSlNPTidzIGBcdWAgY2hhcmFjdGVyIGVzY2FwZQotCi18IGB2YXJpbnRgIHwgaW50ZWdlciwgc3RyaW5nIHwgaW50ZWdlciB8IFZhcmlhYmxlIGxlbmd0aDsgbWF5IG92ZXJmbG93IDMyIG9yIDY0IGJpdCBpbnRlZ2VycyBpbiBjbGllbnQtc2lkZSBkZWNvZGVyCi18PT09Ci0KLT09IFRoZSBmcm9tSnNvbigpIEZ1bmN0aW9uCi0KLVRoZSBgZnJvbUpzb24oKWAgZnVuY3Rpb24gbWF5IGJlIHVzZWQgc2ltaWxhcmx5IHRvIGBJTlNFUlQgSlNPTmAsIGJ1dAotZm9yIGEgc2luZ2xlIGNvbHVtbiB2YWx1ZS4gSXQgbWF5IG9ubHkgYmUgdXNlZCBpbiB0aGUgYFZBTFVFU2AgY2xhdXNlIG9mCi1hbiBgSU5TRVJUYCBzdGF0ZW1lbnQgb3IgYXMgb25lIG9mIHRoZSBjb2x1bW4gdmFsdWVzIGluIGFuIGBVUERBVEVgLAotYERFTEVURWAsIG9yIGBTRUxFQ1RgIHN0YXRlbWVudC4gRm9yIGV4YW1wbGUsIGl0IGNhbm5vdCBiZSB1c2VkIGluIHRoZQotc2VsZWN0aW9uIGNsYXVzZSBvZiBhIGBTRUxFQ1RgIHN0YXRlbWVudC4KLQotPT0gVGhlIHRvSnNvbigpIEZ1bmN0aW9uCi0KLVRoZSBgdG9Kc29uKClgIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHNpbWlsYXJseSB0byBgU0VMRUNUIEpTT05gLCBidXQgZm9yCi1hIHNpbmdsZSBjb2x1bW4gdmFsdWUuIEl0IG1heSBvbmx5IGJlIHVzZWQgaW4gdGhlIHNlbGVjdGlvbiBjbGF1c2Ugb2YgYQotYFNFTEVDVGAgc3RhdGVtZW50LgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9zZWN1cml0eS5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9zZWN1cml0eS5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDRkZWEwLi4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvc2VjdXJpdHkuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDYxNiArMCwwIEBACi1yb2xlX25hbWUgOjo9IGlkZW50aWZpZXIgfCBzdHJpbmc9IFNlY3VyaXR5Ci0KLVtbY3FsLXJvbGVzXV0KLT09IERhdGFiYXNlIFJvbGVzCi0KLUNRTCB1c2VzIGRhdGFiYXNlIHJvbGVzIHRvIHJlcHJlc2VudCB1c2VycyBhbmQgZ3JvdXAgb2YgdXNlcnMuCi1TeW50YWN0aWNhbGx5LCBhIHJvbGUgaXMgZGVmaW5lZCBieToKLQotW3NvdXJjZSwgYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvcm9sZV9uYW1lLmJuZltdCi0tLS0tCi0KLQotW1tjcmVhdGUtcm9sZS1zdGF0ZW1lbnRdXQotPT09IENSRUFURSBST0xFCi0KLUNyZWF0aW5nIGEgcm9sZSB1c2VzIHRoZSBgQ1JFQVRFIFJPTEVgIHN0YXRlbWVudDoKLQotW3NvdXJjZSwgYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvY3JlYXRlX3JvbGVfc3RhdGVtZW50LmJuZltdCi0tLS0tCi0KLUZvciBpbnN0YW5jZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9jcmVhdGVfcm9sZS5jcWxbXQotLS0tLQotCi1CeSBkZWZhdWx0IHJvbGVzIGRvIG5vdCBwb3NzZXNzIGBMT0dJTmAgcHJpdmlsZWdlcyBvciBgU1VQRVJVU0VSYAotc3RhdHVzLgotCi14cmVmOmNxbC9zZWN1cml0eS5hZG9jI2NxbC1wZXJtaXNzaW9uc1tQZXJtaXNzaW9uc10gb24gZGF0YWJhc2UgcmVzb3VyY2VzIGFyZSBncmFudGVkIHRvCi1yb2xlczsgdHlwZXMgb2YgcmVzb3VyY2VzIGluY2x1ZGUga2V5c3BhY2VzLCB0YWJsZXMsIGZ1bmN0aW9ucyBhbmQgcm9sZXMKLXRoZW1zZWx2ZXMuIFJvbGVzIG1heSBiZSBncmFudGVkIHRvIG90aGVyIHJvbGVzIHRvIGNyZWF0ZSBoaWVyYXJjaGljYWwKLXBlcm1pc3Npb25zIHN0cnVjdHVyZXM7IGluIHRoZXNlIGhpZXJhcmNoaWVzLCBwZXJtaXNzaW9ucyBhbmQKLWBTVVBFUlVTRVJgIHN0YXR1cyBhcmUgaW5oZXJpdGVkLCBidXQgdGhlIGBMT0dJTmAgcHJpdmlsZWdlIGlzIG5vdC4KLQotSWYgYSByb2xlIGhhcyB0aGUgYExPR0lOYCBwcml2aWxlZ2UsIGNsaWVudHMgbWF5IGlkZW50aWZ5IGFzIHRoYXQgcm9sZQotd2hlbiBjb25uZWN0aW5nLiBGb3IgdGhlIGR1cmF0aW9uIG9mIHRoYXQgY29ubmVjdGlvbiwgdGhlIGNsaWVudCB3aWxsCi1hY3F1aXJlIGFueSByb2xlcyBhbmQgcHJpdmlsZWdlcyBncmFudGVkIHRvIHRoYXQgcm9sZS4KLQotT25seSBhIGNsaWVudCB3aXRoIHdpdGggdGhlIGBDUkVBVEVgIHBlcm1pc3Npb24gb24gdGhlIGRhdGFiYXNlIHJvbGVzCi1yZXNvdXJjZSBtYXkgaXNzdWUgYENSRUFURSBST0xFYCByZXF1ZXN0cyAoc2VlIHRoZQoteHJlZjpjcWwvc2VjdXJpdHkuYWRvYyNjcWwtcGVybWlzc2lvbnNbcmVsZXZhbnQgc2VjdGlvbl0pLCB1bmxlc3MgdGhlIGNsaWVudCBpcyBhCi1gU1VQRVJVU0VSYC4gUm9sZSBtYW5hZ2VtZW50IGluIENhc3NhbmRyYSBpcyBwbHVnZ2FibGUgYW5kIGN1c3RvbQotaW1wbGVtZW50YXRpb25zIG1heSBzdXBwb3J0IG9ubHkgYSBzdWJzZXQgb2YgdGhlIGxpc3RlZCBvcHRpb25zLgotCi1Sb2xlIG5hbWVzIHNob3VsZCBiZSBxdW90ZWQgaWYgdGhleSBjb250YWluIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycy4KLQotPT09PSBTZXR0aW5nIGNyZWRlbnRpYWxzIGZvciBpbnRlcm5hbCBhdXRoZW50aWNhdGlvbgotCi1Vc2UgdGhlIGBXSVRIIFBBU1NXT1JEYCBjbGF1c2UgdG8gc2V0IGEgcGFzc3dvcmQgZm9yIGludGVybmFsCi1hdXRoZW50aWNhdGlvbiwgZW5jbG9zaW5nIHRoZSBwYXNzd29yZCBpbiBzaW5nbGUgcXVvdGF0aW9uIG1hcmtzLgotCi1JZiBpbnRlcm5hbCBhdXRoZW50aWNhdGlvbiBoYXMgbm90IGJlZW4gc2V0IHVwIG9yIHRoZSByb2xlIGRvZXMgbm90IGhhdmUKLWBMT0dJTmAgcHJpdmlsZWdlcywgdGhlIGBXSVRIIFBBU1NXT1JEYCBjbGF1c2UgaXMgbm90IG5lY2Vzc2FyeS4KLQotVVNFIGBXSVRIIEhBU0hFRCBQQVNTV09SRGAgdG8gcHJvdmlkZSB0aGUgakJjcnlwdCBoYXNoZWQgcGFzc3dvcmQgZGlyZWN0bHkuIFNlZSB0aGUgYGhhc2hfcGFzc3dvcmRgIHRvb2wuCi0KLT09PT0gUmVzdHJpY3RpbmcgY29ubmVjdGlvbnMgdG8gc3BlY2lmaWMgZGF0YWNlbnRlcnMKLQotSWYgYSBgbmV0d29ya19hdXRob3JpemVyYCBoYXMgYmVlbiBjb25maWd1cmVkLCB5b3UgY2FuIHJlc3RyaWN0IGxvZ2luCi1yb2xlcyB0byBzcGVjaWZpYyBkYXRhY2VudGVycyB3aXRoIHRoZSBgQUNDRVNTIFRPIERBVEFDRU5URVJTYCBjbGF1c2UKLWZvbGxvd2VkIGJ5IGEgc2V0IGxpdGVyYWwgb2YgZGF0YWNlbnRlcnMgdGhlIHVzZXIgY2FuIGFjY2Vzcy4gTm90Ci1zcGVjaWZpeWluZyBkYXRhY2VudGVycyBpbXBsaWNpdGx5IGdyYW50cyBhY2Nlc3MgdG8gYWxsIGRhdGFjZW50ZXJzLiBUaGUKLWNsYXVzZSBgQUNDRVNTIFRPIEFMTCBEQVRBQ0VOVEVSU2AgY2FuIGJlIHVzZWQgZm9yIGV4cGxpY2l0bmVzcywgYnV0Ci10aGVyZSdzIG5vIGZ1bmN0aW9uYWwgZGlmZmVyZW5jZS4KLQotPT09PSBDcmVhdGluZyBhIHJvbGUgY29uZGl0aW9uYWxseQotCi1BdHRlbXB0aW5nIHRvIGNyZWF0ZSBhbiBleGlzdGluZyByb2xlIHJlc3VsdHMgaW4gYW4gaW52YWxpZCBxdWVyeQotY29uZGl0aW9uIHVubGVzcyB0aGUgYElGIE5PVCBFWElTVFNgIG9wdGlvbiBpcyB1c2VkLiBJZiB0aGUgb3B0aW9uIGlzCi11c2VkIGFuZCB0aGUgcm9sZSBleGlzdHMsIHRoZSBzdGF0ZW1lbnQgaXMgYSBuby1vcDoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9jcmVhdGVfcm9sZV9pZm5vdGV4aXN0cy5jcWxbXQotLS0tLQotCi1bW2FsdGVyLXJvbGUtc3RhdGVtZW50XV0KLT09PSBBTFRFUiBST0xFCi0KLUFsdGVyaW5nIGEgcm9sZSBvcHRpb25zIHVzZXMgdGhlIGBBTFRFUiBST0xFYCBzdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsIGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2FsdGVyX3JvbGVfc3RhdGVtZW50LmJuZltdCi0tLS0tCi0KLUZvciBleGFtcGxlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2FsdGVyX3JvbGUuY3FsW10KLS0tLS0KLUlmIHRoZSByb2xlIGRvZXMgbm90IGV4aXN0LCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLCB1bmxlc3MgYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KLQotVVNFIGBXSVRIIEhBU0hFRCBQQVNTV09SRGAgdG8gcHJvdmlkZSB0aGUgakJjcnlwdCBoYXNoZWQgcGFzc3dvcmQgZGlyZWN0bHkuIFNlZSB0aGUgYGhhc2hfcGFzc3dvcmRgIHRvb2wuCi0KLT09PT0gUmVzdHJpY3RpbmcgY29ubmVjdGlvbnMgdG8gc3BlY2lmaWMgZGF0YWNlbnRlcnMKLQotSWYgYSBgbmV0d29ya19hdXRob3JpemVyYCBoYXMgYmVlbiBjb25maWd1cmVkLCB5b3UgY2FuIHJlc3RyaWN0IGxvZ2luCi1yb2xlcyB0byBzcGVjaWZpYyBkYXRhY2VudGVycyB3aXRoIHRoZSBgQUNDRVNTIFRPIERBVEFDRU5URVJTYCBjbGF1c2UKLWZvbGxvd2VkIGJ5IGEgc2V0IGxpdGVyYWwgb2YgZGF0YWNlbnRlcnMgdGhlIHVzZXIgY2FuIGFjY2Vzcy4gVG8gcmVtb3ZlCi1hbnkgZGF0YSBjZW50ZXIgcmVzdHJpY3Rpb25zLCB1c2UgdGhlIGBBQ0NFU1MgVE8gQUxMIERBVEFDRU5URVJTYAotY2xhdXNlLgotCi1Db25kaXRpb25zIG9uIGV4ZWN1dGluZyBgQUxURVIgUk9MRWAgc3RhdGVtZW50czoKLQotKiBhIGNsaWVudCBtdXN0IGhhdmUgYFNVUEVSVVNFUmAgc3RhdHVzIHRvIGFsdGVyIHRoZSBgU1VQRVJVU0VSYCBzdGF0dXMKLW9mIGFub3RoZXIgcm9sZQotKiBhIGNsaWVudCBjYW5ub3QgYWx0ZXIgdGhlIGBTVVBFUlVTRVJgIHN0YXR1cyBvZiBhbnkgcm9sZSBpdCBjdXJyZW50bHkKLWhvbGRzCi0qIGEgY2xpZW50IGNhbiBvbmx5IG1vZGlmeSBjZXJ0YWluIHByb3BlcnRpZXMgb2YgdGhlIHJvbGUgd2l0aCB3aGljaCBpdAotaWRlbnRpZmllZCBhdCBsb2dpbiAoZS5nLiBgUEFTU1dPUkRgKQotKiB0byBtb2RpZnkgcHJvcGVydGllcyBvZiBhIHJvbGUsIHRoZSBjbGllbnQgbXVzdCBiZSBncmFudGVkIGBBTFRFUmAKLWBwZXJtaXNzaW9uIDxjcWwtcGVybWlzc2lvbnM+YCBvbiB0aGF0IHJvbGUKLQotW1tkcm9wLXJvbGUtc3RhdGVtZW50XV0KLT09PSBEUk9QIFJPTEUKLQotRHJvcHBpbmcgYSByb2xlIHVzZXMgdGhlIGBEUk9QIFJPTEVgIHN0YXRlbWVudDoKLQotW3NvdXJjZSwgYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvZHJvcF9yb2xlX3N0YXRlbWVudC5ibmZbXQotLS0tLQotCi1gRFJPUCBST0xFYCByZXF1aXJlcyB0aGUgY2xpZW50IHRvIGhhdmUgYERST1BgCi1gcGVybWlzc2lvbiA8Y3FsLXBlcm1pc3Npb25zPmAgb24gdGhlIHJvbGUgaW4gcXVlc3Rpb24uIEluIGFkZGl0aW9uLAotY2xpZW50IG1heSBub3QgYERST1BgIHRoZSByb2xlIHdpdGggd2hpY2ggaXQgaWRlbnRpZmllZCBhdCBsb2dpbi4KLUZpbmFsbHksIG9ubHkgYSBjbGllbnQgd2l0aCBgU1VQRVJVU0VSYCBzdGF0dXMgbWF5IGBEUk9QYCBhbm90aGVyCi1gU1VQRVJVU0VSYCByb2xlLgotCi1BdHRlbXB0aW5nIHRvIGRyb3AgYSByb2xlIHdoaWNoIGRvZXMgbm90IGV4aXN0IHJlc3VsdHMgaW4gYW4gaW52YWxpZAotcXVlcnkgY29uZGl0aW9uIHVubGVzcyB0aGUgYElGIEVYSVNUU2Agb3B0aW9uIGlzIHVzZWQuIElmIHRoZSBvcHRpb24gaXMKLXVzZWQgYW5kIHRoZSByb2xlIGRvZXMgbm90IGV4aXN0IHRoZSBzdGF0ZW1lbnQgaXMgYSBuby1vcC4KLQotW05PVEVdCi0uTm90ZQotPT09PQotRFJPUCBST0xFIGludGVudGlvbmFsbHkgZG9lcyBub3QgdGVybWluYXRlIGFueSBvcGVuIHVzZXIgc2Vzc2lvbnMuCi1DdXJyZW50bHkgY29ubmVjdGVkIHNlc3Npb25zIHdpbGwgcmVtYWluIGNvbm5lY3RlZCBhbmQgd2lsbCByZXRhaW4gdGhlCi1hYmlsaXR5IHRvIHBlcmZvcm0gYW55IGRhdGFiYXNlIGFjdGlvbnMgd2hpY2ggZG8gbm90IHJlcXVpcmUKLXhyZWY6Y3FsL3NlY3VyaXR5LmFkb2MjYXV0aG9yaXphdGlvblthdXRob3JpemF0aW9uXS4gCi1Ib3dldmVyLCBpZiBhdXRob3JpemF0aW9uIGlzIGVuYWJsZWQsIHhyZWY6Y3FsL3NlY3VyaXR5LmFkb2MjY3FsLXBlcm1pc3Npb25zW3Blcm1pc3Npb25zXSBvZiB0aGUgZHJvcHBlZCByb2xlIGFyZSBhbHNvIHJldm9rZWQsCi1zdWJqZWN0IHRvIHRoZSB4cmVmOmNxbC9zZWN1cml0eS5hZG9jI2F1dGgtY2FjaGluZ1tjYWNoaW5nIG9wdGlvbnNdIGNvbmZpZ3VyZWQgaW4geHJlZjpjcWwvY29uZmlndXJpbmcuYWRvYyNjYXNzYW5kcmEueWFtbFtjYXNzYW5kcmEteWFtbF0gZmlsZS4gCi1TaG91bGQgYSBkcm9wcGVkIHJvbGUgYmUgc3Vic2VxdWVudGx5IHJlY3JlYXRlZCBhbmQgaGF2ZSBuZXcgeHJlZjpzZWN1cml0eS5hZG9jI2dyYW50LXBlcm1pc3Npb24tc3RhdGVtZW50W3Blcm1pc3Npb25zXSBvcgoteHJlZjpzZWN1cml0eS5hZG9jI2dyYW50LXJvbGUtc3RhdGVtZW50W3JvbGVzXWAgZ3JhbnRlZCB0byBpdCwgYW55IGNsaWVudCBzZXNzaW9ucyBzdGlsbAotY29ubmVjdGVkIHdpbGwgYWNxdWlyZSB0aGUgbmV3bHkgZ3JhbnRlZCBwZXJtaXNzaW9ucyBhbmQgcm9sZXMuCi09PT09Ci0KLVtbZ3JhbnQtcm9sZS1zdGF0ZW1lbnRdXQotPT09IEdSQU5UIFJPTEUKLQotR3JhbnRpbmcgYSByb2xlIHRvIGFub3RoZXIgdXNlcyB0aGUgYEdSQU5UIFJPTEVgIHN0YXRlbWVudDoKLQotW3NvdXJjZSwgYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvZ3JhbnRfcm9sZV9zdGF0ZW1lbnQuYm5mW10KLS0tLS0KLQotRm9yIGV4YW1wbGU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvZ3JhbnRfcm9sZS5jcWxbXQotLS0tLQotCi1UaGlzIHN0YXRlbWVudCBncmFudHMgdGhlIGByZXBvcnRfd3JpdGVyYCByb2xlIHRvIGBhbGljZWAuIEFueQotcGVybWlzc2lvbnMgZ3JhbnRlZCB0byBgcmVwb3J0X3dyaXRlcmAgYXJlIGFsc28gYWNxdWlyZWQgYnkgYGFsaWNlYC4KLQotUm9sZXMgYXJlIG1vZGVsbGVkIGFzIGEgZGlyZWN0ZWQgYWN5Y2xpYyBncmFwaCwgc28gY2lyY3VsYXIgZ3JhbnRzIGFyZQotbm90IHBlcm1pdHRlZC4gVGhlIGZvbGxvd2luZyBleGFtcGxlcyByZXN1bHQgaW4gZXJyb3IgY29uZGl0aW9uczoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9yb2xlX2Vycm9yLmNxbFtdCi0tLS0tCi0KLVtbcmV2b2tlLXJvbGUtc3RhdGVtZW50XV0KLT09PSBSRVZPS0UgUk9MRQotCi1SZXZva2luZyBhIHJvbGUgdXNlcyB0aGUgYFJFVk9LRSBST0xFYCBzdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsIGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL3Jldm9rZV9yb2xlX3N0YXRlbWVudC5ibmZbXQotLS0tLQotCi1Gb3IgZXhhbXBsZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9yZXZva2Vfcm9sZS5jcWxbXQotLS0tLQotCi1UaGlzIHN0YXRlbWVudCByZXZva2VzIHRoZSBgcmVwb3J0X3dyaXRlcmAgcm9sZSBmcm9tIGBhbGljZWAuIEFueQotcGVybWlzc2lvbnMgdGhhdCBgYWxpY2VgIGhhcyBhY3F1aXJlZCB2aWEgdGhlIGByZXBvcnRfd3JpdGVyYCByb2xlIGFyZQotYWxzbyByZXZva2VkLgotCi1bW2xpc3Qtcm9sZXMtc3RhdGVtZW50XV0KLT09PSBMSVNUIFJPTEVTCi0KLUFsbCB0aGUga25vd24gcm9sZXMgKGluIHRoZSBzeXN0ZW0gb3IgZ3JhbnRlZCB0byBzcGVjaWZpYyByb2xlKSBjYW4gYmUKLWxpc3RlZCB1c2luZyB0aGUgYExJU1QgUk9MRVNgIHN0YXRlbWVudDoKLQotW3NvdXJjZSwgYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvbGlzdF9yb2xlc19zdGF0ZW1lbnQuYm5mW10KLS0tLS0KLQotRm9yIGluc3RhbmNlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2xpc3Rfcm9sZXMuY3FsW10KLS0tLS0KLQotcmV0dXJucyBhbGwga25vd24gcm9sZXMgaW4gdGhlIHN5c3RlbSwgdGhpcyByZXF1aXJlcyBgREVTQ1JJQkVgCi1wZXJtaXNzaW9uIG9uIHRoZSBkYXRhYmFzZSByb2xlcyByZXNvdXJjZS4gCi0KLVRoaXMgZXhhbXBsZSBlbnVtZXJhdGVzIGFsbCByb2xlcyBncmFudGVkIHRvIGBhbGljZWAsIGluY2x1ZGluZyB0aG9zZSB0cmFuc2l0aXZlbHkKLWFjcXVpcmVkOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2xpc3Rfcm9sZXNfb2YuY3FsW10KLS0tLS0KLQotVGhpcyBleGFtcGxlIGxpc3RzIGFsbCByb2xlcyBkaXJlY3RseSBncmFudGVkIHRvIGBib2JgIHdpdGhvdXQgaW5jbHVkaW5nIGFueSBvZiB0aGUKLXRyYW5zaXRpdmVseSBhY3F1aXJlZCBvbmVzOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2xpc3Rfcm9sZXNfbm9ucmVjdXJzaXZlLmNxbFtdCi0tLS0tCi0KLT09IFVzZXJzCi0KLVByaW9yIHRvIHRoZSBpbnRyb2R1Y3Rpb24gb2Ygcm9sZXMgaW4gQ2Fzc2FuZHJhIDIuMiwgYXV0aGVudGljYXRpb24gYW5kCi1hdXRob3JpemF0aW9uIHdlcmUgYmFzZWQgYXJvdW5kIHRoZSBjb25jZXB0IG9mIGEgYFVTRVJgLiBGb3IgYmFja3dhcmQKLWNvbXBhdGliaWxpdHksIHRoZSBsZWdhY3kgc3ludGF4IGhhcyBiZWVuIHByZXNlcnZlZCB3aXRoIGBVU0VSYCBjZW50cmljCi1zdGF0ZW1lbnRzIGJlY29taW5nIHN5bm9ueW1zIGZvciB0aGUgYFJPTEVgIGJhc2VkIGVxdWl2YWxlbnRzLiBJbiBvdGhlcgotd29yZHMsIGNyZWF0aW5nL3VwZGF0aW5nIGEgdXNlciBpcyBqdXN0IGEgZGlmZmVyZW50IHN5bnRheCBmb3IKLWNyZWF0aW5nL3VwZGF0aW5nIGEgcm9sZS4KLQotW1tjcmVhdGUtdXNlci1zdGF0ZW1lbnRdXQotPT09IENSRUFURSBVU0VSCi0KLUNyZWF0aW5nIGEgdXNlciB1c2VzIHRoZSBgQ1JFQVRFIFVTRVJgIHN0YXRlbWVudDoKLQotW3NvdXJjZSwgYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvY3JlYXRlX3VzZXJfc3RhdGVtZW50LmJuZltdCi0tLS0tCi0KLUZvciBleGFtcGxlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2NyZWF0ZV91c2VyLmNxbFtdCi0tLS0tCi0KLVRoZSBgQ1JFQVRFIFVTRVJgIGNvbW1hbmQgaXMgZXF1aXZhbGVudCB0byBgQ1JFQVRFIFJPTEVgIHdoZXJlIHRoZSBgTE9HSU5gIG9wdGlvbiBpcyBgdHJ1ZWAuIAotU28sIHRoZSBmb2xsb3dpbmcgcGFpcnMgb2Ygc3RhdGVtZW50cyBhcmUgZXF1aXZhbGVudDoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9jcmVhdGVfdXNlcl9yb2xlLmNxbFtdCi0tLS0tCi0KLVtbYWx0ZXItdXNlci1zdGF0ZW1lbnRdXQotPT09IEFMVEVSIFVTRVIKLQotQWx0ZXJpbmcgdGhlIG9wdGlvbnMgb2YgYSB1c2VyIHVzZXMgdGhlIGBBTFRFUiBVU0VSYCBzdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsIGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2FsdGVyX3VzZXJfc3RhdGVtZW50LmJuZltdCi0tLS0tCi1JZiB0aGUgcm9sZSBkb2VzIG5vdCBleGlzdCwgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCi1Gb3IgZXhhbXBsZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9hbHRlcl91c2VyLmNxbFtdCi0tLS0tCi0KLVtbZHJvcC11c2VyLXN0YXRlbWVudF1dCi09PT0gRFJPUCBVU0VSCi0KLURyb3BwaW5nIGEgdXNlciB1c2VzIHRoZSBgRFJPUCBVU0VSYCBzdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsIGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2Ryb3BfdXNlcl9zdGF0ZW1lbnQuYm5mW10KLS0tLS0KLQotW1tsaXN0LXVzZXJzLXN0YXRlbWVudF1dCi09PT0gTElTVCBVU0VSUwotCi1FeGlzdGluZyB1c2VycyBjYW4gYmUgbGlzdGVkIHVzaW5nIHRoZSBgTElTVCBVU0VSU2Agc3RhdGVtZW50OgotCi1bc291cmNlLCBibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9saXN0X3VzZXJzX3N0YXRlbWVudC5ibmZbXQotLS0tLQotCi1Ob3RlIHRoYXQgdGhpcyBzdGF0ZW1lbnQgaXMgZXF1aXZhbGVudCB0byB4cmVmOnNlY3VyaXR5LmFkb2MjbGlzdC1yb2xlcy1zdGF0ZW1lbnRbYExJU1QgUk9MRVNdLCBidXQgb25seSByb2xlcyB3aXRoIHRoZSBgTE9HSU5gIHByaXZpbGVnZSBhcmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dC4KLQotPT0gRGF0YSBDb250cm9sCi0KLVtbY3FsLXBlcm1pc3Npb25zXV0KLT09PSBQZXJtaXNzaW9ucwotCi1QZXJtaXNzaW9ucyBvbiByZXNvdXJjZXMgYXJlIGdyYW50ZWQgdG8gcm9sZXM7IHRoZXJlIGFyZSBzZXZlcmFsCi1kaWZmZXJlbnQgdHlwZXMgb2YgcmVzb3VyY2VzIGluIENhc3NhbmRyYSBhbmQgZWFjaCB0eXBlIGlzIG1vZGVsbGVkCi1oaWVyYXJjaGljYWxseToKLQotKiBUaGUgaGllcmFyY2h5IG9mIERhdGEgcmVzb3VyY2VzLCBLZXlzcGFjZXMgYW5kIFRhYmxlcyBoYXMgdGhlCi1zdHJ1Y3R1cmUgYEFMTCBLRVlTUEFDRVNgIC0+IGBLRVlTUEFDRWAgLT4gYFRBQkxFYC4KLSogRnVuY3Rpb24gcmVzb3VyY2VzIGhhdmUgdGhlIHN0cnVjdHVyZSBgQUxMIEZVTkNUSU9OU2AgLT4gYEtFWVNQQUNFYCAtPgotYEZVTkNUSU9OYAotKiBSZXNvdXJjZXMgcmVwcmVzZW50aW5nIHJvbGVzIGhhdmUgdGhlIHN0cnVjdHVyZSBgQUxMIFJPTEVTYCAtPiBgUk9MRWAKLSogUmVzb3VyY2VzIHJlcHJlc2VudGluZyBKTVggT2JqZWN0TmFtZXMsIHdoaWNoIG1hcCB0byBzZXRzIG9mCi1NQmVhbnMvTVhCZWFucywgaGF2ZSB0aGUgc3RydWN0dXJlIGBBTEwgTUJFQU5TYCAtPiBgTUJFQU5gCi0KLVBlcm1pc3Npb25zIGNhbiBiZSBncmFudGVkIGF0IGFueSBsZXZlbCBvZiB0aGVzZSBoaWVyYXJjaGllcyBhbmQgdGhleQotZmxvdyBkb3dud2FyZHMuIFNvIGdyYW50aW5nIGEgcGVybWlzc2lvbiBvbiBhIHJlc291cmNlIGhpZ2hlciB1cCB0aGUKLWNoYWluIGF1dG9tYXRpY2FsbHkgZ3JhbnRzIHRoYXQgc2FtZSBwZXJtaXNzaW9uIG9uIGFsbCByZXNvdXJjZXMgbG93ZXIKLWRvd24uIEZvciBleGFtcGxlLCBncmFudGluZyBgU0VMRUNUYCBvbiBhIGBLRVlTUEFDRWAgYXV0b21hdGljYWxseQotZ3JhbnRzIGl0IG9uIGFsbCBgVEFCTEVTYCBpbiB0aGF0IGBLRVlTUEFDRWAuIExpa2V3aXNlLCBncmFudGluZyBhCi1wZXJtaXNzaW9uIG9uIGBBTEwgRlVOQ1RJT05TYCBncmFudHMgaXQgb24gZXZlcnkgZGVmaW5lZCBmdW5jdGlvbiwKLXJlZ2FyZGxlc3Mgb2Ygd2hpY2gga2V5c3BhY2UgaXQgaXMgc2NvcGVkIGluLiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvCi1ncmFudCBwZXJtaXNzaW9ucyBvbiBhbGwgZnVuY3Rpb25zIHNjb3BlZCB0byBhIHBhcnRpY3VsYXIga2V5c3BhY2UuCi0KLU1vZGlmaWNhdGlvbnMgdG8gcGVybWlzc2lvbnMgYXJlIHZpc2libGUgdG8gZXhpc3RpbmcgY2xpZW50IHNlc3Npb25zOwotdGhhdCBpcywgY29ubmVjdGlvbnMgbmVlZCBub3QgYmUgcmUtZXN0YWJsaXNoZWQgZm9sbG93aW5nIHBlcm1pc3Npb25zCi1jaGFuZ2VzLgotCi1UaGUgZnVsbCBzZXQgb2YgYXZhaWxhYmxlIHBlcm1pc3Npb25zIGlzOgotCi0qIGBDUkVBVEVgCi0qIGBBTFRFUmAKLSogYERST1BgCi0qIGBTRUxFQ1RgCi0qIGBNT0RJRllgCi0qIGBBVVRIT1JJWkVgCi0qIGBERVNDUklCRWAKLSogYEVYRUNVVEVgCi0KLU5vdCBhbGwgcGVybWlzc2lvbnMgYXJlIGFwcGxpY2FibGUgdG8gZXZlcnkgdHlwZSBvZiByZXNvdXJjZS4gRm9yCi1pbnN0YW5jZSwgYEVYRUNVVEVgIGlzIG9ubHkgcmVsZXZhbnQgaW4gdGhlIGNvbnRleHQgb2YgZnVuY3Rpb25zIG9yCi1tYmVhbnM7IGdyYW50aW5nIGBFWEVDVVRFYCBvbiBhIHJlc291cmNlIHJlcHJlc2VudGluZyBhIHRhYmxlIGlzCi1ub25zZW5zaWNhbC4gQXR0ZW1wdGluZyB0byBgR1JBTlRgIGEgcGVybWlzc2lvbiBvbiByZXNvdXJjZSB0byB3aGljaCBpdAotY2Fubm90IGJlIGFwcGxpZWQgcmVzdWx0cyBpbiBhbiBlcnJvciByZXNwb25zZS4gVGhlIGZvbGxvd2luZwotaWxsdXN0cmF0ZXMgd2hpY2ggcGVybWlzc2lvbnMgY2FuIGJlIGdyYW50ZWQgb24gd2hpY2ggdHlwZXMgb2YgcmVzb3VyY2UsCi1hbmQgd2hpY2ggc3RhdGVtZW50cyBhcmUgZW5hYmxlZCBieSB0aGF0IHBlcm1pc3Npb24uCi0KLVtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18UGVybWlzc2lvbiB8UmVzb3VyY2UgfE9wZXJhdGlvbnMKLQotfCBgQ1JFQVRFYCB8IGBBTEwgS0VZU1BBQ0VTYCB8IGBDUkVBVEUgS0VZU1BBQ0VgIGFuZCBgQ1JFQVRFIFRBQkxFYCBpbiBhbnkga2V5c3BhY2UKLQotfCBgQ1JFQVRFYCB8IGBLRVlTUEFDRWAgfCBgQ1JFQVRFIFRBQkxFYCBpbiBzcGVjaWZpZWQga2V5c3BhY2UKLQotfCBgQ1JFQVRFYCB8IGBBTEwgRlVOQ1RJT05TYCB8IGBDUkVBVEUgRlVOQ1RJT05gIGluIGFueSBrZXlzcGFjZSBhbmQgYENSRUFURSBBR0dSRUdBVEVgIGluIGFueSBrZXlzcGFjZQotCi18IGBDUkVBVEVgIHwgYEFMTCBGVU5DVElPTlMgSU4gS0VZU1BBQ0VgIHwgYENSRUFURSBGVU5DVElPTmAgYW5kIGBDUkVBVEUgQUdHUkVHQVRFYCBpbiBzcGVjaWZpZWQga2V5c3BhY2UKLQotfCBgQ1JFQVRFYCB8IGBBTEwgUk9MRVNgIHwgYENSRUFURSBST0xFYAotCi18IGBBTFRFUmAgfCBgQUxMIEtFWVNQQUNFU2AgfCBgQUxURVIgS0VZU1BBQ0VgIGFuZCBgQUxURVIgVEFCTEVgIGluIGFueSBrZXlzcGFjZQotCi18IGBBTFRFUmAgfCBgS0VZU1BBQ0VgIHwgYEFMVEVSIEtFWVNQQUNFYCBhbmQgYEFMVEVSIFRBQkxFYCBpbiBzcGVjaWZpZWQga2V5c3BhY2UgCi0KLXwgYEFMVEVSYCB8IGBUQUJMRWAgfCBgQUxURVIgVEFCTEVgCi0KLXwgYEFMVEVSYCB8IGBBTEwgRlVOQ1RJT05TYCB8IGBDUkVBVEUgRlVOQ1RJT05gIGFuZCBgQ1JFQVRFIEFHR1JFR0FURWA6IHJlcGxhY2luZyBhbnkgZXhpc3RpbmcKLQotfCBgQUxURVJgIHwgYEFMTCBGVU5DVElPTlMgSU4gS0VZU1BBQ0VgIHwgYENSRUFURSBGVU5DVElPTmAgYW5kIGBDUkVBVEUgQUdHUkVHQVRFYDogcmVwbGFjaW5nIGV4aXN0aW5nIGluIHNwZWNpZmllZCBrZXlzcGFjZQotCi18IGBBTFRFUmAgfCBgRlVOQ1RJT05gIHwgYENSRUFURSBGVU5DVElPTmAgYW5kIGBDUkVBVEUgQUdHUkVHQVRFYDogcmVwbGFjaW5nIGV4aXN0aW5nCi0KLXwgYEFMVEVSYCB8IGBBTEwgUk9MRVNgIHwgYEFMVEVSIFJPTEVgIG9uIGFueSByb2xlCi0KLXwgYEFMVEVSYCB8IGBST0xFYCB8IGBBTFRFUiBST0xFYAotCi18IGBEUk9QYCB8IGBBTEwgS0VZU1BBQ0VTYCB8IGBEUk9QIEtFWVNQQUNFYCBhbmQgYERST1AgVEFCTEVgIGluIGFueSBrZXlzcGFjZQotCi18IGBEUk9QYCB8IGBLRVlTUEFDRWAgfCBgRFJPUCBUQUJMRWAgaW4gc3BlY2lmaWVkIGtleXNwYWNlCi0KLXwgYERST1BgIHwgYFRBQkxFYCB8IGBEUk9QIFRBQkxFYAotCi18IGBEUk9QYCB8IGBBTEwgRlVOQ1RJT05TYCB8IGBEUk9QIEZVTkNUSU9OYCBhbmQgYERST1AgQUdHUkVHQVRFYCBpbiBhbnkga2V5c3BhY2UKLQotfCBgRFJPUGAgfCBgQUxMIEZVTkNUSU9OUyBJTiBLRVlTUEFDRWAgfCBgRFJPUCBGVU5DVElPTmAgYW5kIGBEUk9QIEFHR1JFR0FURWAgaW4gc3BlY2lmaWVkIGtleXNwYWNlCi0KLXwgYERST1BgIHwgYEZVTkNUSU9OYCB8IGBEUk9QIEZVTkNUSU9OYAotCi18IGBEUk9QYCB8IGBBTEwgUk9MRVNgIHwgYERST1AgUk9MRWAgb24gYW55IHJvbGUKLQotfCBgRFJPUGAgfCBgUk9MRWAgfCBgRFJPUCBST0xFYAotCi18IGBTRUxFQ1RgIHwgYEFMTCBLRVlTUEFDRVNgIHwgYFNFTEVDVGAgb24gYW55IHRhYmxlCi0KLXwgYFNFTEVDVGAgfCBgS0VZU1BBQ0VgIHwgYFNFTEVDVGAgb24gYW55IHRhYmxlIGluIHNwZWNpZmllZCBrZXlzcGFjZQotCi18IGBTRUxFQ1RgIHwgYFRBQkxFYCB8IGBTRUxFQ1RgIG9uIHNwZWNpZmllZCB0YWJsZQotCi18IGBTRUxFQ1RgIHwgYEFMTCBNQkVBTlNgIHwgQ2FsbCBnZXR0ZXIgbWV0aG9kcyBvbiBhbnkgbWJlYW4KLQotfCBgU0VMRUNUYCB8IGBNQkVBTlNgIHwgQ2FsbCBnZXR0ZXIgbWV0aG9kcyBvbiBhbnkgbWJlYW4gbWF0Y2hpbmcgYSB3aWxkY2FyZCBwYXR0ZXJuIAotCi18IGBTRUxFQ1RgIHwgYE1CRUFOYCB8IENhbGwgZ2V0dGVyIG1ldGhvZHMgb24gbmFtZWQgbWJlYW4KLQotfCBgTU9ESUZZYCB8IGBBTEwgS0VZU1BBQ0VTYCB8IGBJTlNFUlRgLCBgVVBEQVRFYCwgYERFTEVURWAgYW5kIGBUUlVOQ0FURWAgb24gYW55IHRhYmxlCi0KLXwgYE1PRElGWWAgfCBgS0VZU1BBQ0VgIHwgYElOU0VSVGAsIGBVUERBVEVgLCBgREVMRVRFYCBhbmQgYFRSVU5DQVRFYCBvbiBhbnkgdGFibGUgaW4gc3BlY2lmaWVkCi1rZXlzcGFjZQotCi18IGBNT0RJRllgIHwgYFRBQkxFYCB8IGBJTlNFUlRgLCBgVVBEQVRFYCwgYERFTEVURWAgYW5kIGBUUlVOQ0FURWAgb24gc3BlY2lmaWVkIHRhYmxlCi0KLXwgYE1PRElGWWAgfCBgQUxMIE1CRUFOU2AgfCBDYWxsIHNldHRlciBtZXRob2RzIG9uIGFueSBtYmVhbgotCi18IGBNT0RJRllgIHwgYE1CRUFOU2AgfCBDYWxsIHNldHRlciBtZXRob2RzIG9uIGFueSBtYmVhbiBtYXRjaGluZyBhIHdpbGRjYXJkIHBhdHRlcm4KLQotfCBgTU9ESUZZYCB8IGBNQkVBTmAgfCBDYWxsIHNldHRlciBtZXRob2RzIG9uIG5hbWVkIG1iZWFuCi0KLXwgYEFVVEhPUklaRWAgfCBgQUxMIEtFWVNQQUNFU2AgfCBgR1JBTlQgUEVSTUlTU0lPTmAgYW5kIGBSRVZPS0UgUEVSTUlTU0lPTmAgb24gYW55IHRhYmxlCi0KLXwgYEFVVEhPUklaRWAgfCBgS0VZU1BBQ0VgIHwgYEdSQU5UIFBFUk1JU1NJT05gIGFuZCBgUkVWT0tFIFBFUk1JU1NJT05gIG9uIGFueSB0YWJsZSBpbiBzcGVjaWZpZWQga2V5c3BhY2UKLQotfCBgQVVUSE9SSVpFYCB8IGBUQUJMRWAgfCBgR1JBTlQgUEVSTUlTU0lPTmAgYW5kIGBSRVZPS0UgUEVSTUlTU0lPTmAgb24gc3BlY2lmaWVkIHRhYmxlCi0KLXwgYEFVVEhPUklaRWAgfCBgQUxMIEZVTkNUSU9OU2AgfCBgR1JBTlQgUEVSTUlTU0lPTmAgYW5kIGBSRVZPS0UgUEVSTUlTU0lPTmAgb24gYW55IGZ1bmN0aW9uCi0KLXwgYEFVVEhPUklaRWAgfCBgQUxMIEZVTkNUSU9OUyBJTiBLRVlTUEFDRWAgfCBgR1JBTlQgUEVSTUlTU0lPTmAgYW5kIGBSRVZPS0UgUEVSTUlTU0lPTmAgaW4gc3BlY2lmaWVkIGtleXNwYWNlCi0KLXwgYEFVVEhPUklaRWAgfCBgRlVOQ1RJT05gIHwgYEdSQU5UIFBFUk1JU1NJT05gIGFuZCBgUkVWT0tFIFBFUk1JU1NJT05gIG9uIHNwZWNpZmllZCBmdW5jdGlvbgotCi18IGBBVVRIT1JJWkVgIHwgYEFMTCBNQkVBTlNgIHwgYEdSQU5UIFBFUk1JU1NJT05gIGFuZCBgUkVWT0tFIFBFUk1JU1NJT05gIG9uIGFueSBtYmVhbgotCi18IGBBVVRIT1JJWkVgIHwgYE1CRUFOU2AgfCBgR1JBTlQgUEVSTUlTU0lPTmAgYW5kIGBSRVZPS0UgUEVSTUlTU0lPTmAgb24gYW55IG1iZWFuIG1hdGNoaW5nIGEgd2lsZGNhcmQgcGF0dGVybgotCi18IGBBVVRIT1JJWkVgIHwgYE1CRUFOYCB8IGBHUkFOVCBQRVJNSVNTSU9OYCBhbmQgYFJFVk9LRSBQRVJNSVNTSU9OYCBvbiBuYW1lZCBtYmVhbgotCi18IGBBVVRIT1JJWkVgIHwgYEFMTCBST0xFU2AgfCBgR1JBTlQgUk9MRWAgYW5kIGBSRVZPS0UgUk9MRWAgb24gYW55IHJvbGUKLQotfCBgQVVUSE9SSVpFYCB8IGBST0xFU2AgfCBgR1JBTlQgUk9MRWAgYW5kIGBSRVZPS0UgUk9MRWAgb24gc3BlY2lmaWVkIHJvbGVzCi0KLXwgYERFU0NSSUJFYCB8IGBBTEwgUk9MRVNgIHwgYExJU1QgUk9MRVNgIG9uIGFsbCByb2xlcyBvciBvbmx5IHJvbGVzIGdyYW50ZWQgdG8gYW5vdGhlciwgc3BlY2lmaWVkIHJvbGUKLQotfCBgREVTQ1JJQkVgIHwgYEFMTCBNQkVBTlNgIHwgUmV0cmlldmUgbWV0YWRhdGEgYWJvdXQgYW55IG1iZWFuIGZyb20gdGhlIHBsYXRmb3JtJ3MgTUJlYW5TZXJ2ZXIKLQotCi18IGBERVNDUklCRWAgfCBgTUJFQU5TYCB8IFJldHJpZXZlIG1ldGFkYXRhIGFib3V0IGFueSBtYmVhbiBtYXRjaGluZyBhIHdpbGRjYXJkIHBhdHRlciBmcm9tIHRoZQotcGxhdGZvcm0ncyBNQmVhblNlcnZlcgotCi18IGBERVNDUklCRWAgfCBgTUJFQU5gIHwgUmV0cmlldmUgbWV0YWRhdGEgYWJvdXQgYSBuYW1lZCBtYmVhbiBmcm9tIHRoZSBwbGF0Zm9ybSdzIE1CZWFuU2VydmVyCi0KLXwgYEVYRUNVVEVgIHwgYEFMTCBGVU5DVElPTlNgIHwgYFNFTEVDVGAsIGBJTlNFUlRgIGFuZCBgVVBEQVRFYCB1c2luZyBhbnkgZnVuY3Rpb24sIGFuZCB1c2Ugb2YgYW55Ci1mdW5jdGlvbiBpbiBgQ1JFQVRFIEFHR1JFR0FURWAKLQotfCBgRVhFQ1VURWAgfCBgQUxMIEZVTkNUSU9OUyBJTiBLRVlTUEFDRWAgfCBgU0VMRUNUYCwgYElOU0VSVGAgYW5kIGBVUERBVEVgIHVzaW5nIGFueSBmdW5jdGlvbiBpbiBzcGVjaWZpZWQga2V5c3BhY2UKLWFuZCB1c2Ugb2YgYW55IGZ1bmN0aW9uIGluIGtleXNwYWNlIGluIGBDUkVBVEUgQUdHUkVHQVRFYAotCi18IGBFWEVDVVRFYCB8IGBGVU5DVElPTmAgfCBgU0VMRUNUYCwgYElOU0VSVGAgYW5kIGBVUERBVEVgIHVzaW5nIHNwZWNpZmllZCBmdW5jdGlvbiBhbmQgdXNlIG9mIHRoZSBmdW5jdGlvbiBpbiBgQ1JFQVRFIEFHR1JFR0FURWAKLQotfCBgRVhFQ1VURWAgfCBgQUxMIE1CRUFOU2AgfCBFeGVjdXRlIG9wZXJhdGlvbnMgb24gYW55IG1iZWFuCi0KLXwgYEVYRUNVVEVgIHwgYE1CRUFOU2AgfCBFeGVjdXRlIG9wZXJhdGlvbnMgb24gYW55IG1iZWFuIG1hdGNoaW5nIGEgd2lsZGNhcmQgcGF0dGVybgotCi18IGBFWEVDVVRFYCB8IGBNQkVBTmAgfCBFeGVjdXRlIG9wZXJhdGlvbnMgb24gbmFtZWQgbWJlYW4KLXw9PT0KLQotW1tncmFudC1wZXJtaXNzaW9uLXN0YXRlbWVudF1dCi09PT0gR1JBTlQgUEVSTUlTU0lPTgotCi1HcmFudGluZyBhIHBlcm1pc3Npb24gdXNlcyB0aGUgYEdSQU5UIFBFUk1JU1NJT05gIHN0YXRlbWVudDoKLQotW3NvdXJjZSwgYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvZ3JhbnRfcGVybWlzc2lvbl9zdGF0ZW1lbnQuYm5mW10KLS0tLS0KLQotRm9yIGV4YW1wbGU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvZ3JhbnRfcGVybS5jcWxbXQotLS0tLQotCi1UaGlzIGV4YW1wbGUgZ2l2ZXMgYW55IHVzZXIgd2l0aCB0aGUgcm9sZSBgZGF0YV9yZWFkZXJgIHBlcm1pc3Npb24gdG8gZXhlY3V0ZQotYFNFTEVDVGAgc3RhdGVtZW50cyBvbiBhbnkgdGFibGUgYWNyb3NzIGFsbCBrZXlzcGFjZXM6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvZ3JhbnRfbW9kaWZ5LmNxbFtdCi0tLS0tCi0KLVRvIGdpdmUgYW55IHVzZXIgd2l0aCB0aGUgcm9sZSBgZGF0YV93cml0ZXJgIHBlcm1pc3Npb24gdG8gcGVyZm9ybQotYFVQREFURWAsIGBJTlNFUlRgLCBgVVBEQVRFYCwgYERFTEVURWAgYW5kIGBUUlVOQ0FURWAgcXVlcmllcyBvbiBhbGwKLXRhYmxlcyBpbiB0aGUgYGtleXNwYWNlMWAga2V5c3BhY2U6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvZ3JhbnRfZHJvcC5jcWxbXQotLS0tLQotCi1UbyBnaXZlIGFueSB1c2VyIHdpdGggdGhlIGBzY2hlbWFfb3duZXJgIHJvbGUgcGVybWlzc2lvbnMgdG8gYERST1BgIGEgc3BlY2lmaWMKLWBrZXlzcGFjZTEudGFibGUxYDoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9ncmFudF9leGVjdXRlLmNxbFtdCi0tLS0tCi0KLVRoaXMgY29tbWFuZCBncmFudHMgYW55IHVzZXIgd2l0aCB0aGUgYHJlcG9ydF93cml0ZXJgIHJvbGUgcGVybWlzc2lvbiB0byBleGVjdXRlCi1gU0VMRUNUYCwgYElOU0VSVGAgYW5kIGBVUERBVEVgIHF1ZXJpZXMgd2hpY2ggdXNlIHRoZSBmdW5jdGlvbgotYGtleXNwYWNlMS51c2VyX2Z1bmN0aW9uKCBpbnQgKWA6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvZ3JhbnRfZGVzY3JpYmUuY3FsW10KLS0tLS0KLQotVGhpcyBncmFudHMgYW55IHVzZXIgd2l0aCB0aGUgYHJvbGVfYWRtaW5gIHJvbGUgcGVybWlzc2lvbiB0byB2aWV3IGFueQotYW5kIGFsbCByb2xlcyBpbiB0aGUgc3lzdGVtIHdpdGggYSBgTElTVCBST0xFU2Agc3RhdGVtZW50LgotCi09PT09IEdSQU5UIEFMTAotCi1XaGVuIHRoZSBgR1JBTlQgQUxMYCBmb3JtIGlzIHVzZWQsIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2YgcGVybWlzc2lvbnMgaXMKLWRldGVybWluZWQgYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGUgdGFyZ2V0IHJlc291cmNlLgotCi09PT09IEF1dG9tYXRpYyBHcmFudGluZwotCi1XaGVuIGEgcmVzb3VyY2UgaXMgY3JlYXRlZCwgdmlhIGEgYENSRUFURSBLRVlTUEFDRWAsIGBDUkVBVEUgVEFCTEVgLAotYENSRUFURSBGVU5DVElPTmAsIGBDUkVBVEUgQUdHUkVHQVRFYCBvciBgQ1JFQVRFIFJPTEVgIHN0YXRlbWVudCwgdGhlCi1jcmVhdG9yICh0aGUgcm9sZSB0aGUgZGF0YWJhc2UgdXNlciB3aG8gaXNzdWVzIHRoZSBzdGF0ZW1lbnQgaXMKLWlkZW50aWZpZWQgYXMpLCBpcyBhdXRvbWF0aWNhbGx5IGdyYW50ZWQgYWxsIGFwcGxpY2FibGUgcGVybWlzc2lvbnMgb24KLXRoZSBuZXcgcmVzb3VyY2UuCi0KLVtbcmV2b2tlLXBlcm1pc3Npb24tc3RhdGVtZW50XV0KLT09PSBSRVZPS0UgUEVSTUlTU0lPTgotCi1SZXZva2luZyBhIHBlcm1pc3Npb24gZnJvbSBhIHJvbGUgdXNlcyB0aGUgYFJFVk9LRSBQRVJNSVNTSU9OYAotc3RhdGVtZW50OgotCi1bc291cmNlLCBibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9yZXZva2VfcGVybWlzc2lvbl9zdGF0ZW1lbnQuYm5mW10KLS0tLS0KLQotRm9yIGV4YW1wbGU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvcmV2b2tlX3Blcm0uY3FsW10KLS0tLS0KLQotQmVjYXVzZSBvZiB0aGVpciBmdW5jdGlvbiBpbiBub3JtYWwgZHJpdmVyIG9wZXJhdGlvbnMsIGNlcnRhaW4gdGFibGVzCi1jYW5ub3QgaGF2ZSB0aGVpciBgU0VMRUNUYCBwZXJtaXNzaW9ucyByZXZva2VkLiBUaGUKLWZvbGxvd2luZyB0YWJsZXMgd2lsbCBiZSBhdmFpbGFibGUgdG8gYWxsIGF1dGhvcml6ZWQgdXNlcnMgcmVnYXJkbGVzcyBvZgotdGhlaXIgYXNzaWduZWQgcm9sZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9ub19yZXZva2UuY3FsW10KLS0tLS0KLQotW1tsaXN0LXBlcm1pc3Npb25zLXN0YXRlbWVudF1dCi09PT0gTElTVCBQRVJNSVNTSU9OUwotCi1MaXN0aW5nIGdyYW50ZWQgcGVybWlzc2lvbnMgdXNlcyB0aGUgYExJU1QgUEVSTUlTU0lPTlNgIHN0YXRlbWVudDoKLQotW3NvdXJjZSwgYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvbGlzdF9wZXJtaXNzaW9uc19zdGF0ZW1lbnQuYm5mW10KLS0tLS0KLQotRm9yIGV4YW1wbGU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvbGlzdF9wZXJtLmNxbFtdCi0tLS0tCi0KLVNob3cgYWxsIHBlcm1pc3Npb25zIGdyYW50ZWQgdG8gYGFsaWNlYCwgaW5jbHVkaW5nIHRob3NlIGFjcXVpcmVkCi10cmFuc2l0aXZlbHkgZnJvbSBhbnkgb3RoZXIgcm9sZXM6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvbGlzdF9hbGxfcGVybS5jcWxbXQotLS0tLQotCi1TaG93IGFsbCBwZXJtaXNzaW9ucyBvbiBga2V5c3BhY2UxLnRhYmxlMWAgZ3JhbnRlZCB0byBgYm9iYCwgaW5jbHVkaW5nCi10aG9zZSBhY3F1aXJlZCB0cmFuc2l0aXZlbHkgZnJvbSBhbnkgb3RoZXIgcm9sZXMuIFRoaXMgYWxzbyBpbmNsdWRlcyBhbnkKLXBlcm1pc3Npb25zIGhpZ2hlciB1cCB0aGUgcmVzb3VyY2UgaGllcmFyY2h5IHdoaWNoIGNhbiBiZSBhcHBsaWVkIHRvCi1ga2V5c3BhY2UxLnRhYmxlMWAuIEZvciBleGFtcGxlLCBzaG91bGQgYGJvYmAgaGF2ZSBgQUxURVJgIHBlcm1pc3Npb24gb24KLWBrZXlzcGFjZTFgLCB0aGF0IHdvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRzIG9mIHRoaXMgcXVlcnkuIEFkZGluZwotdGhlIGBOT1JFQ1VSU0lWRWAgc3dpdGNoIHJlc3RyaWN0cyB0aGUgcmVzdWx0cyB0byBvbmx5IHRob3NlIHBlcm1pc3Npb25zCi13aGljaCB3ZXJlIGRpcmVjdGx5IGdyYW50ZWQgdG8gYGJvYmAgb3Igb25lIG9mIGBib2JgJ3Mgcm9sZXM6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvbGlzdF9zZWxlY3RfcGVybS5jcWxbXQotLS0tLQotCi1TaG93IGFueSBwZXJtaXNzaW9ucyBncmFudGVkIHRvIGBjYXJsb3NgIG9yIGFueSBvZiBgY2FybG9zYCdzIHJvbGVzLAotbGltaXRlZCB0byBgU0VMRUNUYCBwZXJtaXNzaW9ucyBvbiBhbnkgcmVzb3VyY2UuCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL3R5cGVzLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL3R5cGVzLmFkb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3Yzc4YjUuLjAwMDAwMDAKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC90eXBlcy5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsNTM5ICswLDAgQEAKLT0gRGF0YSBUeXBlcwotCi1DUUwgaXMgYSB0eXBlZCBsYW5ndWFnZSBhbmQgc3VwcG9ydHMgYSByaWNoIHNldCBvZiBkYXRhIHR5cGVzLCBpbmNsdWRpbmcKLXhyZWY6Y3FsL3R5cGVzLmFkb2MjbmF0aXZlLXR5cGVzW25hdGl2ZSB0eXBlc10sIHhyZWY6Y3FsL3R5cGVzLmFkb2MjY29sbGVjdGlvbnNbY29sbGVjdGlvbiB0eXBlc10sCi14cmVmOmNxbC90eXBlcy5hZG9jI3VkdHNbdXNlci1kZWZpbmVkIHR5cGVzXSwgeHJlZjpjcWwvdHlwZXMuYWRvYyN0dXBsZXNbdHVwbGUgdHlwZXNdLCBhbmQgeHJlZjpjcWwvdHlwZXMuYWRvYyNjdXN0b20tdHlwZXNbY3VzdG9tCi10eXBlc106Ci0KLVtzb3VyY2UsIGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2NxbF90eXBlLmJuZltdCi0tLS0tCi0KLT09IE5hdGl2ZSB0eXBlcwotCi1UaGUgbmF0aXZlIHR5cGVzIHN1cHBvcnRlZCBieSBDUUwgYXJlOgotCi1bc291cmNlLCBibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9uYXRpdmVfdHlwZS5ibmZbXQotLS0tLQotCi1UaGUgZm9sbG93aW5nIHRhYmxlIGdpdmVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25zIG9uIHRoZSBuYXRpdmUgZGF0YQotdHlwZXMsIGFuZCBvbiB3aGljaCBraW5kIG9mIHhyZWY6Y3FsL2RlZmluaXRpb25zLmFkb2MjY29uc3RhbnRzW2NvbnN0YW50c10gZWFjaCB0eXBlIHN1cHBvcnRzOgotCi1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfCBUeXBlIHwgQ29uc3RhbnRzIHN1cHBvcnRlZCB8IERlc2NyaXB0aW9uCi0KLXwgYGFzY2lpYCB8IGBzdHJpbmdgIHwgQVNDSUkgY2hhcmFjdGVyIHN0cmluZwotfCBgYmlnaW50YCB8IGBpbnRlZ2VyYCB8IDY0LWJpdCBzaWduZWQgbG9uZwotfCBgYmxvYmAgfCBgYmxvYmAgfCBBcmJpdHJhcnkgYnl0ZXMgKG5vIHZhbGlkYXRpb24pCi18IGBib29sZWFuYCB8IGBib29sZWFuYCB8IEVpdGhlciBgdHJ1ZWAgb3IgYGZhbHNlYCAKLXwgYGNvdW50ZXJgIHwgYGludGVnZXJgIHwgQ291bnRlciBjb2x1bW4gKDY0LWJpdCBzaWduZWQgdmFsdWUpLiBTZWUgYGNvdW50ZXJzYCBmb3IgZGV0YWlscy4KLXwgYGRhdGVgIHwgYGludGVnZXJgLCBgc3RyaW5nYCB8IEEgZGF0ZSAod2l0aCBubyBjb3JyZXNwb25kaW5nIHRpbWUgdmFsdWUpLiBTZWUgYGRhdGVzYCBiZWxvdyBmb3IgZGV0YWlscy4KLXwgYGRlY2ltYWxgIHwgYGludGVnZXJgLCBgZmxvYXRgIHwgVmFyaWFibGUtcHJlY2lzaW9uIGRlY2ltYWwKLXwgYGRvdWJsZWAgfCBgaW50ZWdlcmAgYGZsb2F0YCB8IDY0LWJpdCBJRUVFLTc1NCBmbG9hdGluZyBwb2ludAotfCBgZHVyYXRpb25gIHwgYGR1cmF0aW9uYCwgfCBBIGR1cmF0aW9uIHdpdGggbmFub3NlY29uZCBwcmVjaXNpb24uIFNlZSBgZHVyYXRpb25zYCBiZWxvdyBmb3IgZGV0YWlscy4KLXwgYGZsb2F0YCB8IGBpbnRlZ2VyYCwgYGZsb2F0YCB8IDMyLWJpdCBJRUVFLTc1NCBmbG9hdGluZyBwb2ludAotfCBgaW5ldGAgfCBgc3RyaW5nYCB8IEFuIElQIGFkZHJlc3MsIGVpdGhlciBJUHY0ICg0IGJ5dGVzIGxvbmcpIG9yIElQdjYgKDE2IGJ5dGVzIGxvbmcpLiBOb3RlCi10aGF0IHRoZXJlIGlzIG5vIGBpbmV0YCBjb25zdGFudCwgSVAgYWRkcmVzcyBzaG91bGQgYmUgaW5wdXQgYXMgc3RyaW5ncy4KLXwgYGludGAgfCBgaW50ZWdlcmAgfCAzMi1iaXQgc2lnbmVkIGludAotfCBgc21hbGxpbnRgIHwgYGludGVnZXJgIHwgMTYtYml0IHNpZ25lZCBpbnQKLXwgYHRleHRgIHwgYHN0cmluZ2AgfCBVVEY4IGVuY29kZWQgc3RyaW5nCi18IGB0aW1lYCB8IGBpbnRlZ2VyYCwgYHN0cmluZ2AgfCBBIHRpbWUgKHdpdGggbm8gY29ycmVzcG9uZGluZyBkYXRlIHZhbHVlKSB3aXRoIG5hbm9zZWNvbmQgcHJlY2lzaW9uLiBTZWUKLWB0aW1lc2AgYmVsb3cgZm9yIGRldGFpbHMuCi18IGB0aW1lc3RhbXBgIHwgYGludGVnZXJgLCBgc3RyaW5nYCB8IEEgdGltZXN0YW1wIChkYXRlIGFuZCB0aW1lKSB3aXRoIG1pbGxpc2Vjb25kIHByZWNpc2lvbi4gU2VlIGB0aW1lc3RhbXBzYAotYmVsb3cgZm9yIGRldGFpbHMuCi18IGB0aW1ldXVpZGAgfCBgdXVpZGAgfCBWZXJzaW9uIDEgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pdmVyc2FsbHlfdW5pcXVlX2lkZW50aWZpZXJbVVVJRF0sCi1nZW5lcmFsbHkgdXNlZCBhcyBhIOKAnGNvbmZsaWN0LWZyZWXigJ0gdGltZXN0YW1wLiBBbHNvIHNlZSBgdGltZXV1aWQtZnVuY3Rpb25zYC4KLXwgYHRpbnlpbnRgIHwgYGludGVnZXJgIHwgOC1iaXQgc2lnbmVkIGludAotfCBgdXVpZGAgfCBgdXVpZGAgfCBBIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXZlcnNhbGx5X3VuaXF1ZV9pZGVudGlmaWVyW1VVSURdIChvZiBhbnkgdmVyc2lvbikKLXwgYHZhcmNoYXJgIHwgYHN0cmluZ2AgfCBVVEY4IGVuY29kZWQgc3RyaW5nCi18IGB2YXJpbnRgIHwgYGludGVnZXJgIHwgQXJiaXRyYXJ5LXByZWNpc2lvbiBpbnRlZ2VyCi18PT09Ci0KLT09PSBDb3VudGVycwotCi1UaGUgYGNvdW50ZXJgIHR5cGUgaXMgdXNlZCB0byBkZWZpbmUgX2NvdW50ZXIgY29sdW1uc18uIEEgY291bnRlciBjb2x1bW4KLWlzIGEgY29sdW1uIHdob3NlIHZhbHVlIGlzIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIGFuZCBvbiB3aGljaCAyCi1vcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQ6IGluY3JlbWVudGluZyBhbmQgZGVjcmVtZW50aW5nIChzZWUgdGhlCi14cmVmOmNxbC9kbWwuYWRvYyN1cGRhdGUtc3RhdGVtZW50W1VQREFURV0gc3RhdGVtZW50IGZvciBzeW50YXgpLiAKLU5vdGUgdGhhdCB0aGUgdmFsdWUgb2YgYSBjb3VudGVyIGNhbm5vdAotYmUgc2V0OiBhIGNvdW50ZXIgZG9lcyBub3QgZXhpc3QgdW50aWwgZmlyc3QgaW5jcmVtZW50ZWQvZGVjcmVtZW50ZWQsCi1hbmQgdGhhdCBmaXJzdCBpbmNyZW1lbnQvZGVjcmVtZW50IGlzIG1hZGUgYXMgaWYgdGhlIHByaW9yIHZhbHVlIHdhcyAwLgotCi1bW2NvdW50ZXItbGltaXRhdGlvbnNdXQotQ291bnRlcnMgaGF2ZSBhIG51bWJlciBvZiBpbXBvcnRhbnQgbGltaXRhdGlvbnM6Ci0KLSogVGhleSBjYW5ub3QgYmUgdXNlZCBmb3IgY29sdW1ucyBwYXJ0IG9mIHRoZSBgUFJJTUFSWSBLRVlgIG9mIGEgdGFibGUuCi0qIEEgdGFibGUgdGhhdCBjb250YWlucyBhIGNvdW50ZXIgY2FuIG9ubHkgY29udGFpbiBjb3VudGVycy4gSW4gb3RoZXIKLXdvcmRzLCBlaXRoZXIgYWxsIHRoZSBjb2x1bW5zIG9mIGEgdGFibGUgb3V0c2lkZSB0aGUgYFBSSU1BUlkgS0VZYCBoYXZlCi10aGUgYGNvdW50ZXJgIHR5cGUsIG9yIG5vbmUgb2YgdGhlbSBoYXZlIGl0LgotKiBDb3VudGVycyBkbyBub3Qgc3VwcG9ydCB4cmVmOmNxbC9kbWwuYWRvYyN3cml0ZXRpbWUtYW5kLXR0bC1mdW5jdGlvbltleHBpcmF0aW9uXS4KLSogVGhlIGRlbGV0aW9uIG9mIGNvdW50ZXJzIGlzIHN1cHBvcnRlZCwgYnV0IGlzIG9ubHkgZ3VhcmFudGVlZCB0byB3b3JrCi10aGUgZmlyc3QgdGltZSB5b3UgZGVsZXRlIGEgY291bnRlci4gSW4gb3RoZXIgd29yZHMsIHlvdSBzaG91bGQgbm90Ci1yZS11cGRhdGUgYSBjb3VudGVyIHRoYXQgeW91IGhhdmUgZGVsZXRlZCAoaWYgeW91IGRvLCBwcm9wZXIgYmVoYXZpb3IgaXMKLW5vdCBndWFyYW50ZWVkKS4KLSogQ291bnRlciB1cGRhdGVzIGFyZSwgYnkgbmF0dXJlLCBub3QKLWh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lkZW1wb3RlbmNlW2lkZW1wdG90ZW50XS4gQW4gaW1wb3J0YW50Ci1jb25zZXF1ZW5jZSBpcyB0aGF0IGlmIGEgY291bnRlciB1cGRhdGUgZmFpbHMgdW5leHBlY3RlZGx5ICh0aW1lb3V0IG9yCi1sb3NzIG9mIGNvbm5lY3Rpb24gdG8gdGhlIGNvb3JkaW5hdG9yIG5vZGUpLCB0aGUgY2xpZW50IGhhcyBubyB3YXkgdG8KLWtub3cgaWYgdGhlIHVwZGF0ZSBoYXMgYmVlbiBhcHBsaWVkIG9yIG5vdC4gSW4gcGFydGljdWxhciwgcmVwbGF5aW5nIHRoZQotdXBkYXRlIG1heSBvciBtYXkgbm90IGxlYWQgdG8gYW4gb3ZlciBjb3VudC4KLQotW1t0aW1lc3RhbXBzXV0KLT09IFdvcmtpbmcgd2l0aCB0aW1lc3RhbXBzCi0KLVZhbHVlcyBvZiB0aGUgYHRpbWVzdGFtcGAgdHlwZSBhcmUgZW5jb2RlZCBhcyA2NC1iaXQgc2lnbmVkIGludGVnZXJzCi1yZXByZXNlbnRpbmcgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBzdGFuZGFyZCBiYXNlIHRpbWUga25vd24KLWFzIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXhfdGltZVt0aGUgZXBvY2hdOiBKYW51YXJ5IDEgMTk3MCBhdAotMDA6MDA6MDAgR01ULgotCi1UaW1lc3RhbXBzIGNhbiBiZSBpbnB1dCBpbiBDUUwgZWl0aGVyIHVzaW5nIHRoZWlyIHZhbHVlIGFzIGFuIGBpbnRlZ2VyYCwKLW9yIHVzaW5nIGEgYHN0cmluZ2AgdGhhdCByZXByZXNlbnRzIGFuCi1odHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMVtJU08gODYwMV0gZGF0ZS4gRm9yIGluc3RhbmNlLCBhbGwKLW9mIHRoZSB2YWx1ZXMgYmVsb3cgYXJlIHZhbGlkIGB0aW1lc3RhbXBgIHZhbHVlcyBmb3IgTWFyIDIsIDIwMTEsIGF0Ci0wNDowNTowMCBBTSwgR01UOgotCi0qIGAxMjk5MDM4NzAwMDAwYAotKiBgJzIwMTEtMDItMDMgMDQ6MDUrMDAwMCdgCi0qIGAnMjAxMS0wMi0wMyAwNDowNTowMCswMDAwJ2AKLSogYCcyMDExLTAyLTAzIDA0OjA1OjAwLjAwMCswMDAwJ2AKLSogYCcyMDExLTAyLTAzVDA0OjA1KzAwMDAnYAotKiBgJzIwMTEtMDItMDNUMDQ6MDU6MDArMDAwMCdgCi0qIGAnMjAxMS0wMi0wM1QwNDowNTowMC4wMDArMDAwMCdgCi0KLVRoZSBgKzAwMDBgIGFib3ZlIGlzIGFuIFJGQyA4MjIgNC1kaWdpdCB0aW1lIHpvbmUgc3BlY2lmaWNhdGlvbjsgYCswMDAwYAotcmVmZXJzIHRvIEdNVC4gVVMgUGFjaWZpYyBTdGFuZGFyZCBUaW1lIGlzIGAtMDgwMGAuIFRoZSB0aW1lIHpvbmUgbWF5IGJlCi1vbWl0dGVkIGlmIGRlc2lyZWQgKGAnMjAxMS0wMi0wMyAwNDowNTowMCdgKSwgYW5kIGlmIHNvLCB0aGUgZGF0ZSB3aWxsCi1iZSBpbnRlcnByZXRlZCBhcyBiZWluZyBpbiB0aGUgdGltZSB6b25lIHVuZGVyIHdoaWNoIHRoZSBjb29yZGluYXRpbmcKLUNhc3NhbmRyYSBub2RlIGlzIGNvbmZpZ3VyZWQuIFRoZXJlIGFyZSBob3dldmVyIGRpZmZpY3VsdGllcyBpbmhlcmVudCBpbgotcmVseWluZyBvbiB0aGUgdGltZSB6b25lIGNvbmZpZ3VyYXRpb24gYmVpbmcgYXMgZXhwZWN0ZWQsIHNvIGl0IGlzCi1yZWNvbW1lbmRlZCB0aGF0IHRoZSB0aW1lIHpvbmUgYWx3YXlzIGJlIHNwZWNpZmllZCBmb3IgdGltZXN0YW1wcyB3aGVuCi1mZWFzaWJsZS4KLQotVGhlIHRpbWUgb2YgZGF5IG1heSBhbHNvIGJlIG9taXR0ZWQgKGAnMjAxMS0wMi0wMydgIG9yCi1gJzIwMTEtMDItMDMrMDAwMCdgKSwgaW4gd2hpY2ggY2FzZSB0aGUgdGltZSBvZiBkYXkgd2lsbCBkZWZhdWx0IHRvCi0wMDowMDowMCBpbiB0aGUgc3BlY2lmaWVkIG9yIGRlZmF1bHQgdGltZSB6b25lLiBIb3dldmVyLCBpZiBvbmx5IHRoZQotZGF0ZSBwYXJ0IGlzIHJlbGV2YW50LCBjb25zaWRlciB1c2luZyB0aGUgeHJlZjpjcWwvdHlwZXMuYWRvYyNkYXRlc1tkYXRlXSB0eXBlLgotCi1bW2RhdGVzXV0KLT09IERhdGUgdHlwZQotCi1WYWx1ZXMgb2YgdGhlIGBkYXRlYCB0eXBlIGFyZSBlbmNvZGVkIGFzIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VycwotcmVwcmVzZW50aW5nIGEgbnVtYmVyIG9mIGRheXMgd2l0aCDigJx0aGUgZXBvY2jigJ0gYXQgdGhlIGNlbnRlciBvZiB0aGUKLXJhbmdlICgyXjMxKS4gRXBvY2ggaXMgSmFudWFyeSAxc3QsIDE5NzAKLQotRm9yIHhyZWY6Y3FsL3R5cGVzLmFkb2MjdGltZXN0YW1wc1t0aW1lc3RhbXBzXSwgYSBkYXRlIGNhbiBiZSBpbnB1dCBlaXRoZXIgYXMgYW4KLWBpbnRlZ2VyYCBvciB1c2luZyBhIGRhdGUgYHN0cmluZ2AuIEluIHRoZSBsYXRlciBjYXNlLCB0aGUgZm9ybWF0IHNob3VsZAotYmUgYHl5eXktbW0tZGRgIChzbyBgJzIwMTEtMDItMDMnYCBmb3IgaW5zdGFuY2UpLgotCi1bW3RpbWVzXV0KLT09IFRpbWUgdHlwZQotCi1WYWx1ZXMgb2YgdGhlIGB0aW1lYCB0eXBlIGFyZSBlbmNvZGVkIGFzIDY0LWJpdCBzaWduZWQgaW50ZWdlcnMKLXJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIG5hbm9zZWNvbmRzIHNpbmNlIG1pZG5pZ2h0LgotCi1Gb3IgeHJlZjpjcWwvdHlwZXMuYWRvYyN0aW1lc3RhbXBzW3RpbWVzdGFtcHNdLCBhIHRpbWUgY2FuIGJlIGlucHV0IGVpdGhlciBhcyBhbgotYGludGVnZXJgIG9yIHVzaW5nIGEgYHN0cmluZ2AgcmVwcmVzZW50aW5nIHRoZSB0aW1lLiBJbiB0aGUgbGF0ZXIgY2FzZSwKLXRoZSBmb3JtYXQgc2hvdWxkIGJlIGBoaDptbTpzc1suZmZmZmZmZmZmXWAgKHdoZXJlIHRoZSBzdWItc2Vjb25kCi1wcmVjaXNpb24gaXMgb3B0aW9uYWwgYW5kIGlmIHByb3ZpZGVkLCBjYW4gYmUgbGVzcyB0aGFuIHRoZSBuYW5vc2Vjb25kKS4KLVNvIGZvciBpbnN0YW5jZSwgdGhlIGZvbGxvd2luZyBhcmUgdmFsaWQgaW5wdXRzIGZvciBhIHRpbWU6Ci0KLSogYCcwODoxMjo1NCdgCi0qIGAnMDg6MTI6NTQuMTIzJ2AKLSogYCcwODoxMjo1NC4xMjM0NTYnYAotKiBgJzA4OjEyOjU0LjEyMzQ1Njc4OSdgCi0KLVtbZHVyYXRpb25zXV0KLT09IER1cmF0aW9uIHR5cGUKLQotVmFsdWVzIG9mIHRoZSBgZHVyYXRpb25gIHR5cGUgYXJlIGVuY29kZWQgYXMgMyBzaWduZWQgaW50ZWdlciBvZgotdmFyaWFibGUgbGVuZ3Rocy4gVGhlIGZpcnN0IGludGVnZXIgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIG1vbnRocywgdGhlCi1zZWNvbmQgdGhlIG51bWJlciBvZiBkYXlzIGFuZCB0aGUgdGhpcmQgdGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcy4gVGhpcwotaXMgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIG51bWJlciBvZiBkYXlzIGluIGEgbW9udGggY2FuIGNoYW5nZSwgYW5kIGEKLWRheSBjYW4gaGF2ZSAyMyBvciAyNSBob3VycyBkZXBlbmRpbmcgb24gdGhlIGRheWxpZ2h0IHNhdmluZy4KLUludGVybmFsbHksIHRoZSBudW1iZXIgb2YgbW9udGhzIGFuZCBkYXlzIGFyZSBkZWNvZGVkIGFzIDMyIGJpdHMKLWludGVnZXJzIHdoZXJlYXMgdGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcyBpcyBkZWNvZGVkIGFzIGEgNjQgYml0cwotaW50ZWdlci4KLQotQSBkdXJhdGlvbiBjYW4gYmUgaW5wdXQgYXM6Ci0KLSogYChxdWFudGl0eSB1bml0KStgIGxpa2UgYDEyaDMwbWAgd2hlcmUgdGhlIHVuaXQgY2FuIGJlOgotKiogYHlgOiB5ZWFycyAoMTIgbW9udGhzKQotKiogYG1vYDogbW9udGhzICgxIG1vbnRoKQotKiogYHdgOiB3ZWVrcyAoNyBkYXlzKQotKiogYGRgOiBkYXlzICgxIGRheSkKLSoqIGBoYDogaG91cnMgKDMsNjAwLDAwMCwwMDAsMDAwIG5hbm9zZWNvbmRzKQotKiogYG1gOiBtaW51dGVzICg2MCwwMDAsMDAwLDAwMCBuYW5vc2Vjb25kcykKLSoqIGBzYDogc2Vjb25kcyAoMSwwMDAsMDAwLDAwMCBuYW5vc2Vjb25kcykKLSoqIGBtc2A6IG1pbGxpc2Vjb25kcyAoMSwwMDAsMDAwIG5hbm9zZWNvbmRzKQotKiogYHVzYCBvciBgwrVzYCA6IG1pY3Jvc2Vjb25kcyAoMTAwMCBuYW5vc2Vjb25kcykKLSoqIGBuc2A6IG5hbm9zZWNvbmRzICgxIG5hbm9zZWNvbmQpCi0qIElTTyA4NjAxIGZvcm1hdDogYFBbbl1ZW25dTVtuXURUW25dSFtuXU1bbl1TIG9yIFBbbl1XYAotKiBJU08gODYwMSBhbHRlcm5hdGl2ZSBmb3JtYXQ6IGBQW1lZWVldLVtNTV0tW0REXVRbaGhdOlttbV06W3NzXWAKLQotRm9yIGV4YW1wbGU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvaW5zZXJ0X2R1cmF0aW9uLmNxbFtdCi0tLS0tCi0KLVtbZHVyYXRpb24tbGltaXRhdGlvbl1dCi1EdXJhdGlvbiBjb2x1bW5zIGNhbm5vdCBiZSB1c2VkIGluIGEgdGFibGUncyBgUFJJTUFSWSBLRVlgLiBUaGlzCi1saW1pdGF0aW9uIGlzIGR1ZSB0byB0aGUgZmFjdCB0aGF0IGR1cmF0aW9ucyBjYW5ub3QgYmUgb3JkZXJlZC4gSXQgaXMKLWVmZmVjdGl2ZWx5IG5vdCBwb3NzaWJsZSB0byBrbm93IGlmIGAxbW9gIGlzIGdyZWF0ZXIgdGhhbiBgMjlkYCB3aXRob3V0Ci1hIGRhdGUgY29udGV4dC4KLQotQSBgMWRgIGR1cmF0aW9uIGlzIG5vdCBlcXVhbCB0byBhIGAyNGhgIG9uZSBhcyB0aGUgZHVyYXRpb24gdHlwZSBoYXMKLWJlZW4gY3JlYXRlZCB0byBiZSBhYmxlIHRvIHN1cHBvcnQgZGF5bGlnaHQgc2F2aW5nLgotCi09PSBDb2xsZWN0aW9ucwotCi1DUUwgc3VwcG9ydHMgdGhyZWUga2luZHMgb2YgY29sbGVjdGlvbnM6IGBtYXBzYCwgYHNldHNgIGFuZCBgbGlzdHNgLiBUaGUKLXR5cGVzIG9mIHRob3NlIGNvbGxlY3Rpb25zIGlzIGRlZmluZWQgYnk6Ci0KLVtzb3VyY2UsYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvY29sbGVjdGlvbl90eXBlLmJuZltdCi0tLS0tCi0KLWFuZCB0aGVpciB2YWx1ZXMgY2FuIGJlIGlucHV0ZCB1c2luZyBjb2xsZWN0aW9uIGxpdGVyYWxzOgotCi1bc291cmNlLGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2NvbGxlY3Rpb25fbGl0ZXJhbC5ibmZbXQotLS0tLQotCi1Ob3RlIGhvd2V2ZXIgdGhhdCBuZWl0aGVyIGBiaW5kX21hcmtlcmAgbm9yIGBOVUxMYCBhcmUgc3VwcG9ydGVkIGluc2lkZQotY29sbGVjdGlvbiBsaXRlcmFscy4KLQotPT09IE5vdGV3b3J0aHkgY2hhcmFjdGVyaXN0aWNzCi0KLUNvbGxlY3Rpb25zIGFyZSBtZWFudCBmb3Igc3RvcmluZy9kZW5vcm1hbGl6aW5nIHJlbGF0aXZlbHkgc21hbGwgYW1vdW50Ci1vZiBkYXRhLiBUaGV5IHdvcmsgd2VsbCBmb3IgdGhpbmdzIGxpa2Ug4oCcdGhlIHBob25lIG51bWJlcnMgb2YgYSBnaXZlbgotdXNlcuKAnSwg4oCcbGFiZWxzIGFwcGxpZWQgdG8gYW4gZW1haWzigJ0sIGV0Yy4gQnV0IHdoZW4gaXRlbXMgYXJlIGV4cGVjdGVkIHRvCi1ncm93IHVuYm91bmRlZCAo4oCcYWxsIG1lc3NhZ2VzIHNlbnQgYnkgYSB1c2Vy4oCdLCDigJxldmVudHMgcmVnaXN0ZXJlZCBieSBhCi1zZW5zb3LigJ0uLi4pLCB0aGVuIGNvbGxlY3Rpb25zIGFyZSBub3QgYXBwcm9wcmlhdGUgYW5kIGEgc3BlY2lmaWMgdGFibGUKLSh3aXRoIGNsdXN0ZXJpbmcgY29sdW1ucykgc2hvdWxkIGJlIHVzZWQuIENvbmNyZXRlbHksIChub24tZnJvemVuKQotY29sbGVjdGlvbnMgaGF2ZSB0aGUgZm9sbG93aW5nIG5vdGV3b3J0aHkgY2hhcmFjdGVyaXN0aWNzIGFuZAotbGltaXRhdGlvbnM6Ci0KLSogSW5kaXZpZHVhbCBjb2xsZWN0aW9ucyBhcmUgbm90IGluZGV4ZWQgaW50ZXJuYWxseS4gV2hpY2ggbWVhbnMgdGhhdAotZXZlbiB0byBhY2Nlc3MgYSBzaW5nbGUgZWxlbWVudCBvZiBhIGNvbGxlY3Rpb24sIHRoZSB3aGlsZSBjb2xsZWN0aW9uCi1oYXMgdG8gYmUgcmVhZCAoYW5kIHJlYWRpbmcgb25lIGlzIG5vdCBwYWdlZCBpbnRlcm5hbGx5KS4KLSogV2hpbGUgaW5zZXJ0aW9uIG9wZXJhdGlvbnMgb24gc2V0cyBhbmQgbWFwcyBuZXZlciBpbmN1ciBhCi1yZWFkLWJlZm9yZS13cml0ZSBpbnRlcm5hbGx5LCBzb21lIG9wZXJhdGlvbnMgb24gbGlzdHMgZG8uIEZ1cnRoZXIsIHNvbWUKLWxpc3RzIG9wZXJhdGlvbnMgYXJlIG5vdCBpZGVtcG90ZW50IGJ5IG5hdHVyZSAoc2VlIHRoZSBzZWN0aW9uIG9uCi14cmVmOmNxbC90eXBlcy5hZG9jI2xpc3RzW2xpc3RzXSBiZWxvdyBmb3IgZGV0YWlscyksIG1ha2luZyB0aGVpciByZXRyeSBpbiBjYXNlIG9mCi10aW1lb3V0IHByb2JsZW1hdGljLiBJdCBpcyB0aHVzIGFkdmlzZWQgdG8gcHJlZmVyIHNldHMgb3ZlciBsaXN0cyB3aGVuCi1wb3NzaWJsZS4KLQotUGxlYXNlIG5vdGUgdGhhdCB3aGlsZSBzb21lIG9mIHRob3NlIGxpbWl0YXRpb25zIG1heSBvciBtYXkgbm90IGJlCi1yZW1vdmVkL2ltcHJvdmVkIHVwb24gaW4gdGhlIGZ1dHVyZSwgaXQgaXMgYSBhbnRpLXBhdHRlcm4gdG8gdXNlIGEKLShzaW5nbGUpIGNvbGxlY3Rpb24gdG8gc3RvcmUgbGFyZ2UgYW1vdW50cyBvZiBkYXRhLgotCi09PT0gTWFwcwotCi1BIGBtYXBgIGlzIGEgKHNvcnRlZCkgc2V0IG9mIGtleS12YWx1ZSBwYWlycywgd2hlcmUga2V5cyBhcmUgdW5pcXVlIGFuZAotdGhlIG1hcCBpcyBzb3J0ZWQgYnkgaXRzIGtleXMuIFlvdSBjYW4gZGVmaW5lIGFuZCBpbnNlcnQgYSBtYXAgd2l0aDoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9tYXAuY3FsW10KLS0tLS0KLQotRnVydGhlciwgbWFwcyBzdXBwb3J0OgotCi0qIFVwZGF0aW5nIG9yIGluc2VydGluZyBvbmUgb3IgbW9yZSBlbGVtZW50czoKLSsKLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvdXBkYXRlX21hcC5jcWxbXQotLS0tLQotKiBSZW1vdmluZyBvbmUgb3IgbW9yZSBlbGVtZW50IChpZiBhbiBlbGVtZW50IGRvZXNuJ3QgZXhpc3QsIHJlbW92aW5nIGl0Ci1pcyBhIG5vLW9wIGJ1dCBubyBlcnJvciBpcyB0aHJvd24pOgotKwotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9kZWxldGVfbWFwLmNxbFtdCi0tLS0tCi0rCi1Ob3RlIHRoYXQgZm9yIHJlbW92aW5nIG11bHRpcGxlIGVsZW1lbnRzIGluIGEgYG1hcGAsIHlvdSByZW1vdmUgZnJvbSBpdAotYSBgc2V0YCBvZiBrZXlzLgotCi1MYXN0bHksIFRUTHMgYXJlIGFsbG93ZWQgZm9yIGJvdGggYElOU0VSVGAgYW5kIGBVUERBVEVgLCBidXQgaW4gYm90aAotY2FzZSB0aGUgVFRMIHNldCBvbmx5IGFwcGx5IHRvIHRoZSBuZXdseSBpbnNlcnRlZC91cGRhdGVkIGVsZW1lbnRzLiBJbgotb3RoZXIgd29yZHM6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvdXBkYXRlX3R0bF9tYXAuY3FsW10KLS0tLS0KLQotd2lsbCBvbmx5IGFwcGx5IHRoZSBUVEwgdG8gdGhlIGB7ICdjb2xvcicgOiAnZ3JlZW4nIH1gIHJlY29yZCwgdGhlIHJlc3QKLW9mIHRoZSBtYXAgcmVtYWluaW5nIHVuYWZmZWN0ZWQuCi0KLT09PSBTZXRzCi0KLUEgYHNldGAgaXMgYSAoc29ydGVkKSBjb2xsZWN0aW9uIG9mIHVuaXF1ZSB2YWx1ZXMuIFlvdSBjYW4gZGVmaW5lIGFuZAotaW5zZXJ0IGEgbWFwIHdpdGg6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvc2V0LmNxbFtdCi0tLS0tCi0KLUZ1cnRoZXIsIHNldHMgc3VwcG9ydDoKLQotKiBBZGRpbmcgb25lIG9yIG11bHRpcGxlIGVsZW1lbnRzIChhcyB0aGlzIGlzIGEgc2V0LCBpbnNlcnRpbmcgYW4KLWFscmVhZHkgZXhpc3RpbmcgZWxlbWVudCBpcyBhIG5vLW9wKToKLSsKLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvdXBkYXRlX3NldC5jcWxbXQotLS0tLQotKiBSZW1vdmluZyBvbmUgb3IgbXVsdGlwbGUgZWxlbWVudHMgKGlmIGFuIGVsZW1lbnQgZG9lc24ndCBleGlzdCwKLXJlbW92aW5nIGl0IGlzIGEgbm8tb3AgYnV0IG5vIGVycm9yIGlzIHRocm93bik6Ci0rCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2RlbGV0ZV9zZXQuY3FsW10KLS0tLS0KLQotTGFzdGx5LCBmb3IgeHJlZjpjcWwvdHlwZXMuYWRvYyNzZXRzW3NldHNdLCBUVExzIGFyZSBvbmx5IGFwcGxpZWQgdG8gbmV3bHkgaW5zZXJ0ZWQgdmFsdWVzLgotCi09PT0gTGlzdHMKLQotW05PVEVdCi0uTm90ZQotPT09PQotQXMgbWVudGlvbmVkIGFib3ZlIGFuZCBmdXJ0aGVyIGRpc2N1c3NlZCBhdCB0aGUgZW5kIG9mIHRoaXMgc2VjdGlvbiwKLWxpc3RzIGhhdmUgbGltaXRhdGlvbnMgYW5kIHNwZWNpZmljIHBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zIHRoYXQgeW91Ci1zaG91bGQgdGFrZSBpbnRvIGFjY291bnQgYmVmb3JlIHVzaW5nIHRoZW0uIEluIGdlbmVyYWwsIGlmIHlvdSBjYW4gdXNlIGEKLXhyZWY6Y3FsL3R5cGVzLmFkb2Mjc2V0c1tzZXRdIGluc3RlYWQgb2YgbGlzdCwgYWx3YXlzIHByZWZlciBhIHNldC4KLT09PT0KLQotQSBgbGlzdGAgaXMgYSAoc29ydGVkKSBjb2xsZWN0aW9uIG9mIG5vbi11bmlxdWUgdmFsdWVzIHdoZXJlCi1lbGVtZW50cyBhcmUgb3JkZXJlZCBieSB0aGVyZSBwb3NpdGlvbiBpbiB0aGUgbGlzdC4gWW91IGNhbiBkZWZpbmUgYW5kCi1pbnNlcnQgYSBsaXN0IHdpdGg6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvbGlzdC5jcWxbXQotLS0tLQotCi1GdXJ0aGVyLCBsaXN0cyBzdXBwb3J0OgotCi0qIEFwcGVuZGluZyBhbmQgcHJlcGVuZGluZyB2YWx1ZXMgdG8gYSBsaXN0OgotKwotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC91cGRhdGVfbGlzdC5jcWxbXQotLS0tLQotCi1bV0FSTklOR10KLS5XYXJuaW5nCi09PT09Ci1UaGUgYXBwZW5kIGFuZCBwcmVwZW5kIG9wZXJhdGlvbnMgYXJlIG5vdCBpZGVtcG90ZW50IGJ5IG5hdHVyZS4gU28gaW4KLXBhcnRpY3VsYXIsIGlmIG9uZSBvZiB0aGVzZSBvcGVyYXRpb24gdGltZW91dCwgdGhlbiByZXRyeWluZyB0aGUKLW9wZXJhdGlvbiBpcyBub3Qgc2FmZSBhbmQgaXQgbWF5IChvciBtYXkgbm90KSBsZWFkIHRvCi1hcHBlbmRpbmcvcHJlcGVuZGluZyB0aGUgdmFsdWUgdHdpY2UuCi09PT09Ci0KLSogU2V0dGluZyB0aGUgdmFsdWUgYXQgYSBwYXJ0aWN1bGFyIHBvc2l0aW9uIGluIGEgbGlzdCB0aGF0IGhhcyBhIHByZS1leGlzdGluZyBlbGVtZW50IGZvciB0aGF0IHBvc2l0aW9uLiBBbiBlcnJvcgotd2lsbCBiZSB0aHJvd24gaWYgdGhlIGxpc3QgZG9lcyBub3QgaGF2ZSB0aGUgcG9zaXRpb24uOgotKwotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC91cGRhdGVfcGFydGljdWxhcl9saXN0X2VsZW1lbnQuY3FsW10KLS0tLS0KLSogUmVtb3ZpbmcgYW4gZWxlbWVudCBieSBpdHMgcG9zaXRpb24gaW4gdGhlIGxpc3QgdGhhdCBoYXMgYSBwcmUtZXhpc3RpbmcgZWxlbWVudCBmb3IgdGhhdCBwb3NpdGlvbi4gQW4gZXJyb3IKLXdpbGwgYmUgdGhyb3duIGlmIHRoZSBsaXN0IGRvZXMgbm90IGhhdmUgdGhlIHBvc2l0aW9uLiBGdXJ0aGVyLCBhcyB0aGUgb3BlcmF0aW9uIHJlbW92ZXMgYW4KLWVsZW1lbnQgZnJvbSB0aGUgbGlzdCwgdGhlIGxpc3Qgc2l6ZSB3aWxsIGRlY3JlYXNlIGJ5IG9uZSBlbGVtZW50LCBzaGlmdGluZwotdGhlIHBvc2l0aW9uIG9mIGFsbCB0aGUgZm9sbG93aW5nIGVsZW1lbnRzIG9uZSBmb3J3YXJkOgotKwotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9kZWxldGVfZWxlbWVudF9saXN0LmNxbFtdCi0tLS0tCi0KLSogRGVsZXRpbmcgX2FsbF8gdGhlIG9jY3VycmVuY2VzIG9mIHBhcnRpY3VsYXIgdmFsdWVzIGluIHRoZSBsaXN0IChpZiBhCi1wYXJ0aWN1bGFyIGVsZW1lbnQgZG9lc24ndCBvY2N1ciBhdCBhbGwgaW4gdGhlIGxpc3QsIGl0IGlzIHNpbXBseQotaWdub3JlZCBhbmQgbm8gZXJyb3IgaXMgdGhyb3duKToKLSsKLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvZGVsZXRlX2FsbF9lbGVtZW50c19saXN0LmNxbFtdCi0tLS0tCi0KLVtXQVJOSU5HXQotLldhcm5pbmcKLT09PT0KLVNldHRpbmcgYW5kIHJlbW92aW5nIGFuIGVsZW1lbnQgYnkgcG9zaXRpb24gYW5kIHJlbW92aW5nIG9jY3VyZW5jZXMgb2YKLXBhcnRpY3VsYXIgdmFsdWVzIGluY3VyIGFuIGludGVybmFsIF9yZWFkLWJlZm9yZS13cml0ZV8uIFRoZXNlIG9wZXJhdGlvbnMgd2lsbAotcnVuIHNsb3dseSBhbmQgdXNlIG1vcmUgcmVzb3VyY2VzIHRoYW4gdXN1YWwgdXBkYXRlcyAod2l0aCB0aGUKLWV4Y2x1c2lvbiBvZiBjb25kaXRpb25hbCB3cml0ZSB0aGF0IGhhdmUgdGhlaXIgb3duIGNvc3QpLgotPT09PQotCi1MYXN0bHksIGZvciB4cmVmOmNxbC90eXBlcy5hZG9jI2xpc3RzW2xpc3RzXSwgVFRMcyBvbmx5IGFwcGx5IHRvIG5ld2x5IGluc2VydGVkIHZhbHVlcy4KLQotW1t1ZHRzXV0KLT09IFVzZXItRGVmaW5lZCBUeXBlcyAoVURUcykKLQotQ1FMIHN1cHBvcnQgdGhlIGRlZmluaXRpb24gb2YgdXNlci1kZWZpbmVkIHR5cGVzIChVRFRzKS4gU3VjaCBhCi10eXBlIGNhbiBiZSBjcmVhdGVkLCBtb2RpZmllZCBhbmQgcmVtb3ZlZCB1c2luZyB0aGUKLWBjcmVhdGVfdHlwZV9zdGF0ZW1lbnRgLCBgYWx0ZXJfdHlwZV9zdGF0ZW1lbnRgIGFuZAotYGRyb3BfdHlwZV9zdGF0ZW1lbnRgIGRlc2NyaWJlZCBiZWxvdy4gQnV0IG9uY2UgY3JlYXRlZCwgYSBVRFQgaXMgc2ltcGx5Ci1yZWZlcnJlZCB0byBieSBpdHMgbmFtZToKLQotW3NvdXJjZSwgYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvdWR0LmJuZltdCi0tLS0tCi0KLT09PSBDcmVhdGluZyBhIFVEVAotCi1DcmVhdGluZyBhIG5ldyB1c2VyLWRlZmluZWQgdHlwZSBpcyBkb25lIHVzaW5nIGEgYENSRUFURSBUWVBFYCBzdGF0ZW1lbnQKLWRlZmluZWQgYnk6Ci0KLVtzb3VyY2UsIGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2NyZWF0ZV90eXBlLmJuZltdCi0tLS0tCi0KLUEgVURUIGhhcyBhIG5hbWUgKHVzZWQgdG8gZGVjbGFyZWQgY29sdW1ucyBvZiB0aGF0IHR5cGUpIGFuZCBpcyBhIHNldCBvZgotbmFtZWQgYW5kIHR5cGVkIGZpZWxkcy4gRmllbGRzIG5hbWUgY2FuIGJlIGFueSB0eXBlLCBpbmNsdWRpbmcKLWNvbGxlY3Rpb25zIG9yIG90aGVyIFVEVC4gRm9yIGluc3RhbmNlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML3VkdC5jcWxbXQotLS0tLQotCi1UaGluZ3MgdG8ga2VlcCBpbiBtaW5kIGFib3V0IFVEVHM6Ci0KLSogQXR0ZW1wdGluZyB0byBjcmVhdGUgYW4gYWxyZWFkeSBleGlzdGluZyB0eXBlIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yCi11bmxlc3MgdGhlIGBJRiBOT1QgRVhJU1RTYCBvcHRpb24gaXMgdXNlZC4gSWYgaXQgaXMgdXNlZCwgdGhlIHN0YXRlbWVudAotd2lsbCBiZSBhIG5vLW9wIGlmIHRoZSB0eXBlIGFscmVhZHkgZXhpc3RzLgotKiBBIHR5cGUgaXMgaW50cmluc2ljYWxseSBib3VuZCB0byB0aGUga2V5c3BhY2UgaW4gd2hpY2ggaXQgaXMgY3JlYXRlZCwKLWFuZCBjYW4gb25seSBiZSB1c2VkIGluIHRoYXQga2V5c3BhY2UuIEF0IGNyZWF0aW9uLCBpZiB0aGUgdHlwZSBuYW1lIGlzCi1wcmVmaXhlZCBieSBhIGtleXNwYWNlIG5hbWUsIGl0IGlzIGNyZWF0ZWQgaW4gdGhhdCBrZXlzcGFjZS4gT3RoZXJ3aXNlLAotaXQgaXMgY3JlYXRlZCBpbiB0aGUgY3VycmVudCBrZXlzcGFjZS4KLSogQXMgb2YgQ2Fzc2FuZHJhICwgVURUIGhhdmUgdG8gYmUgZnJvemVuIGluIG1vc3QgY2FzZXMsIGhlbmNlIHRoZQotYGZyb3plbjxhZGRyZXNzPmAgaW4gdGhlIHRhYmxlIGRlZmluaXRpb24gYWJvdmUuIFBsZWFzZSBzZWUgdGhlIHNlY3Rpb24KLW9uIHhyZWY6Y3FsL3R5cGVzLmFkb2MjZnJvemVuW2Zyb3plbl0gZm9yIG1vcmUgZGV0YWlscy4KLQotPT09IFVEVCBsaXRlcmFscwotCi1PbmNlIGEgdXNlZC1kZWZpbmVkIHR5cGUgaGFzIGJlZW4gY3JlYXRlZCwgdmFsdWUgY2FuIGJlIGlucHV0IHVzaW5nIGEKLVVEVCBsaXRlcmFsOgotCi1bc291cmNlLGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL3VkdF9saXRlcmFsLmJuZltdCi0tLS0tCi0KLUluIG90aGVyIHdvcmRzLCBhIFVEVCBsaXRlcmFsIGlzIGxpa2UgYSB4cmVmOmNxbC90eXBlcy5hZG9jI21hcHNbbWFwXWAgbGl0ZXJhbCBidXQgaXRzCi1rZXlzIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGZpZWxkcyBvZiB0aGUgdHlwZS4gRm9yIGluc3RhbmNlLCBvbmUgY291bGQKLWluc2VydCBpbnRvIHRoZSB0YWJsZSBkZWZpbmUgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24gdXNpbmc6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvaW5zZXJ0X3VkdC5jcWxbXQotLS0tLQotCi1UbyBiZSB2YWxpZCwgYSBVRFQgbGl0ZXJhbCBjYW4gb25seSBpbmNsdWRlIGZpZWxkcyBkZWZpbmVkIGJ5IHRoZQotdHlwZSBpdCBpcyBhIGxpdGVyYWwgb2YsIGJ1dCBpdCBjYW4gb21pdCBzb21lIGZpZWxkcyAodGhlc2Ugd2lsbCBiZSBzZXQgdG8gYE5VTExgKS4KLQotPT09IEFsdGVyaW5nIGEgVURUCi0KLUFuIGV4aXN0aW5nIHVzZXItZGVmaW5lZCB0eXBlIGNhbiBiZSBtb2RpZmllZCB1c2luZyBhbiBgQUxURVIgVFlQRWAKLXN0YXRlbWVudDoKLQotW3NvdXJjZSxibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9hbHRlcl91ZHRfc3RhdGVtZW50LmJuZltdCi0tLS0tCi1JZiB0aGUgdHlwZSBkb2VzIG5vdCBleGlzdCwgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCi1Zb3UgY2FuOgotCi0qIEFkZCBhIG5ldyBmaWVsZCB0byB0aGUgdHlwZSAoYEFMVEVSIFRZUEUgYWRkcmVzcyBBREQgY291bnRyeSB0ZXh0YCkuCi1UaGF0IG5ldyBmaWVsZCB3aWxsIGJlIGBOVUxMYCBmb3IgYW55IHZhbHVlcyBvZiB0aGUgdHlwZSBjcmVhdGVkIGJlZm9yZQotdGhlIGFkZGl0aW9uLiBJZiB0aGUgbmV3IGZpZWxkIGV4aXN0cywgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBOT1QgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgotKiBSZW5hbWUgdGhlIGZpZWxkcyBvZiB0aGUgdHlwZS4gSWYgdGhlIGZpZWxkKHMpIGRvZXMgbm90IGV4aXN0LCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLCB1bmxlc3MgYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9yZW5hbWVfdWR0X2ZpZWxkLmNxbFtdCi0tLS0tCi0KLT09PSBEcm9wcGluZyBhIFVEVAotCi1Zb3UgY2FuIGRyb3AgYW4gZXhpc3RpbmcgdXNlci1kZWZpbmVkIHR5cGUgdXNpbmcgYSBgRFJPUCBUWVBFYAotc3RhdGVtZW50OgotCi1bc291cmNlLGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2Ryb3BfdWR0X3N0YXRlbWVudC5ibmZbXQotLS0tLQotCi1Ecm9wcGluZyBhIHR5cGUgcmVzdWx0cyBpbiB0aGUgaW1tZWRpYXRlLCBpcnJldmVyc2libGUgcmVtb3ZhbCBvZiB0aGF0Ci10eXBlLiBIb3dldmVyLCBhdHRlbXB0aW5nIHRvIGRyb3AgYSB0eXBlIHRoYXQgaXMgc3RpbGwgaW4gdXNlIGJ5IGFub3RoZXIKLXR5cGUsIHRhYmxlIG9yIGZ1bmN0aW9uIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLgotCi1JZiB0aGUgdHlwZSBkcm9wcGVkIGRvZXMgbm90IGV4aXN0LCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIHVubGVzcwotYElGIEVYSVNUU2AgaXMgdXNlZCwgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCi0KLT09IFR1cGxlcwotCi1DUUwgYWxzbyBzdXBwb3J0IHR1cGxlcyBhbmQgdHVwbGUgdHlwZXMgKHdoZXJlIHRoZSBlbGVtZW50cyBjYW4gYmUgb2YKLWRpZmZlcmVudCB0eXBlcykuIEZ1bmN0aW9uYWxseSwgdHVwbGVzIGNhbiBiZSB0aG91Z2ggYXMgYW5vbnltb3VzIFVEVAotd2l0aCBhbm9ueW1vdXMgZmllbGRzLiBUdXBsZSB0eXBlcyBhbmQgdHVwbGUgbGl0ZXJhbHMgYXJlIGRlZmluZWQgYnk6Ci0KLVtzb3VyY2UsYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvdHVwbGUuYm5mW10KLS0tLS0KLQotYW5kIGNhbiBiZSBjcmVhdGVkOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML3R1cGxlLmNxbFtdCi0tLS0tCi0KLVVubGlrZSBvdGhlciBjb21wb3NlZCB0eXBlcywgbGlrZSBjb2xsZWN0aW9ucyBhbmQgVURUcywgYSB0dXBsZSBpcyBhbHdheXMKLWBmcm96ZW4gPGZyb3plbj5gICh3aXRob3V0IHRoZSBuZWVkIG9mIHRoZSBgZnJvemVuYCBrZXl3b3JkKQotYW5kIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB1cGRhdGUgb25seSBzb21lIGVsZW1lbnRzIG9mIGEgdHVwbGUgKHdpdGhvdXQKLXVwZGF0aW5nIHRoZSB3aG9sZSB0dXBsZSkuIEFsc28sIGEgdHVwbGUgbGl0ZXJhbCBzaG91bGQgYWx3YXlzIGhhdmUgdGhlCi1zYW1lIG51bWJlciBvZiB2YWx1ZSB0aGFuIGRlY2xhcmVkIGluIHRoZSB0eXBlIGl0IGlzIGEgdHVwbGUgb2YgKHNvbWUgb2YKLXRob3NlIHZhbHVlcyBjYW4gYmUgbnVsbCBidXQgdGhleSBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgZGVjbGFyZWQgYXMgc28pLgotCi09PSBDdXN0b20gVHlwZXMKLQotW05PVEVdCi0uTm90ZQotPT09PQotQ3VzdG9tIHR5cGVzIGV4aXN0cyBtb3N0bHkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgcHVycG9zZXMgYW5kIHRoZWlyCi11c2FnZSBpcyBkaXNjb3VyYWdlZC4gVGhlaXIgdXNhZ2UgaXMgY29tcGxleCwgbm90IHVzZXIgZnJpZW5kbHkgYW5kIHRoZQotb3RoZXIgcHJvdmlkZWQgdHlwZXMsIHBhcnRpY3VsYXJseSB4cmVmOmNxbC90eXBlcy5hZG9jI3VkdHNbdXNlci1kZWZpbmVkIHR5cGVzXSwgc2hvdWxkCi1hbG1vc3QgYWx3YXlzIGJlIGVub3VnaC4KLT09PT0KLQotQSBjdXN0b20gdHlwZSBpcyBkZWZpbmVkIGJ5OgotCi1bc291cmNlLGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2N1c3RvbV90eXBlLmJuZltdCi0tLS0tCi0KLUEgY3VzdG9tIHR5cGUgaXMgYSBgc3RyaW5nYCB0aGF0IGNvbnRhaW5zIHRoZSBuYW1lIG9mIEphdmEgY2xhc3MgdGhhdAotZXh0ZW5kcyB0aGUgc2VydmVyIHNpZGUgYEFic3RyYWN0VHlwZWAgY2xhc3MgYW5kIHRoYXQgY2FuIGJlIGxvYWRlZCBieQotQ2Fzc2FuZHJhIChpdCBzaG91bGQgdGh1cyBiZSBpbiB0aGUgYENMQVNTUEFUSGAgb2YgZXZlcnkgbm9kZSBydW5uaW5nCi1DYXNzYW5kcmEpLiBUaGF0IGNsYXNzIHdpbGwgZGVmaW5lIHdoYXQgdmFsdWVzIGFyZSB2YWxpZCBmb3IgdGhlIHR5cGUKLWFuZCBob3cgdGhlIHRpbWUgc29ydHMgd2hlbiB1c2VkIGZvciBhIGNsdXN0ZXJpbmcgY29sdW1uLiBGb3IgYW55IG90aGVyCi1wdXJwb3NlLCBhIHZhbHVlIG9mIGEgY3VzdG9tIHR5cGUgaXMgdGhlIHNhbWUgdGhhbiB0aGF0IG9mIGEgYGJsb2JgLCBhbmQKLWNhbiBpbiBwYXJ0aWN1bGFyIGJlIGlucHV0IHVzaW5nIHRoZSBgYmxvYmAgbGl0ZXJhbCBzeW50YXguCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX2NvbmNlcHR1YWwuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2RhdGFfbW9kZWxpbmdfY29uY2VwdHVhbC5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWUxMDI3Li4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2RhdGFfbW9kZWxpbmdfY29uY2VwdHVhbC5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPSBDb25jZXB0dWFsIERhdGEgTW9kZWxpbmcKLQotRmlyc3QsIGxldOKAmXMgY3JlYXRlIGEgc2ltcGxlIGRvbWFpbiBtb2RlbCB0aGF0IGlzIGVhc3kgdG8gdW5kZXJzdGFuZCBpbgotdGhlIHJlbGF0aW9uYWwgd29ybGQsIGFuZCB0aGVuIHNlZSBob3cgeW91IG1pZ2h0IG1hcCBpdCBmcm9tIGEKLXJlbGF0aW9uYWwgdG8gYSBkaXN0cmlidXRlZCBoYXNodGFibGUgbW9kZWwgaW4gQ2Fzc2FuZHJhLgotCi1MZXQncyB1c2UgYW4gZXhhbXBsZSB0aGF0IGlzIGNvbXBsZXggZW5vdWdoIHRvIHNob3cgdGhlIHZhcmlvdXMgZGF0YQotc3RydWN0dXJlcyBhbmQgZGVzaWduIHBhdHRlcm5zLCBidXQgbm90IHNvbWV0aGluZyB0aGF0IHdpbGwgYm9nIHlvdSBkb3duCi13aXRoIGRldGFpbHMuIEFsc28sIGEgZG9tYWluIHRoYXTigJlzIGZhbWlsaWFyIHRvIGV2ZXJ5b25lIHdpbGwgYWxsb3cgeW91Ci10byBjb25jZW50cmF0ZSBvbiBob3cgdG8gd29yayB3aXRoIENhc3NhbmRyYSwgbm90IG9uIHdoYXQgdGhlCi1hcHBsaWNhdGlvbiBkb21haW4gaXMgYWxsIGFib3V0LgotCi1Gb3IgZXhhbXBsZSwgbGV0J3MgdXNlIGEgZG9tYWluIHRoYXQgaXMgZWFzaWx5IHVuZGVyc3Rvb2QgYW5kIHRoYXQKLWV2ZXJ5b25lIGNhbiByZWxhdGUgdG86IG1ha2luZyBob3RlbCByZXNlcnZhdGlvbnMuCi0KLVRoZSBjb25jZXB0dWFsIGRvbWFpbiBpbmNsdWRlcyBob3RlbHMsIGd1ZXN0cyB0aGF0IHN0YXkgaW4gdGhlIGhvdGVscywgYQotY29sbGVjdGlvbiBvZiByb29tcyBmb3IgZWFjaCBob3RlbCwgdGhlIHJhdGVzIGFuZCBhdmFpbGFiaWxpdHkgb2YgdGhvc2UKLXJvb21zLCBhbmQgYSByZWNvcmQgb2YgcmVzZXJ2YXRpb25zIGJvb2tlZCBmb3IgZ3Vlc3RzLiBIb3RlbHMgdHlwaWNhbGx5Ci1hbHNvIG1haW50YWluIGEgY29sbGVjdGlvbiBvZiDigJxwb2ludHMgb2YgaW50ZXJlc3Qs4oCdIHdoaWNoIGFyZSBwYXJrcywKLW11c2V1bXMsIHNob3BwaW5nIGdhbGxlcmllcywgbW9udW1lbnRzLCBvciBvdGhlciBwbGFjZXMgbmVhciB0aGUgaG90ZWwKLXRoYXQgZ3Vlc3RzIG1pZ2h0IHdhbnQgdG8gdmlzaXQgZHVyaW5nIHRoZWlyIHN0YXkuIEJvdGggaG90ZWxzIGFuZAotcG9pbnRzIG9mIGludGVyZXN0IG5lZWQgdG8gbWFpbnRhaW4gZ2VvbG9jYXRpb24gZGF0YSBzbyB0aGF0IHRoZXkgY2FuIGJlCi1mb3VuZCBvbiBtYXBzIGZvciBtYXNodXBzLCBhbmQgdG8gY2FsY3VsYXRlIGRpc3RhbmNlcy4KLQotVGhlIGNvbmNlcHR1YWwgZG9tYWluIGlzIGRlcGljdGVkIGJlbG93IHVzaW5nIHRoZSBlbnRpdHnigJNyZWxhdGlvbnNoaXAKLW1vZGVsIHBvcHVsYXJpemVkIGJ5IFBldGVyIENoZW4uIFRoaXMgc2ltcGxlIGRpYWdyYW0gcmVwcmVzZW50cyB0aGUKLWVudGl0aWVzIGluIHRoZSBkb21haW4gd2l0aCByZWN0YW5nbGVzLCBhbmQgYXR0cmlidXRlcyBvZiB0aG9zZSBlbnRpdGllcwotd2l0aCBvdmFscy4gQXR0cmlidXRlcyB0aGF0IHJlcHJlc2VudCB1bmlxdWUgaWRlbnRpZmllcnMgZm9yIGl0ZW1zIGFyZQotdW5kZXJsaW5lZC4gUmVsYXRpb25zaGlwcyBiZXR3ZWVuIGVudGl0aWVzIGFyZSByZXByZXNlbnRlZCBhcyBkaWFtb25kcywKLWFuZCB0aGUgY29ubmVjdG9ycyBiZXR3ZWVuIHRoZSByZWxhdGlvbnNoaXAgYW5kIGVhY2ggZW50aXR5IHNob3cgdGhlCi1tdWx0aXBsaWNpdHkgb2YgdGhlIGNvbm5lY3Rpb24uCi0KLWltYWdlOjpkYXRhX21vZGVsaW5nX2hvdGVsX2VyZC5wbmdbaW1hZ2VdCi0KLU9idmlvdXNseSwgaW4gdGhlIHJlYWwgd29ybGQsIHRoZXJlIHdvdWxkIGJlIG1hbnkgbW9yZSBjb25zaWRlcmF0aW9ucwotYW5kIG11Y2ggbW9yZSBjb21wbGV4aXR5LiBGb3IgZXhhbXBsZSwgaG90ZWwgcmF0ZXMgYXJlIG5vdG9yaW91c2x5Ci1keW5hbWljLCBhbmQgY2FsY3VsYXRpbmcgdGhlbSBpbnZvbHZlcyBhIHdpZGUgYXJyYXkgb2YgZmFjdG9ycy4gSGVyZQoteW914oCZcmUgZGVmaW5pbmcgc29tZXRoaW5nIGNvbXBsZXggZW5vdWdoIHRvIGJlIGludGVyZXN0aW5nIGFuZCB0b3VjaCBvbgotdGhlIGltcG9ydGFudCBwb2ludHMsIGJ1dCBzaW1wbGUgZW5vdWdoIHRvIG1haW50YWluIHRoZSBmb2N1cyBvbgotbGVhcm5pbmcgQ2Fzc2FuZHJhLgotCi1fTWF0ZXJpYWwgYWRhcHRlZCBmcm9tIENhc3NhbmRyYSwgVGhlIERlZmluaXRpdmUgR3VpZGUuIFB1Ymxpc2hlZCBieQotTydSZWlsbHkgTWVkaWEsIEluYy4gQ29weXJpZ2h0IMKpIDIwMjAgSmVmZiBDYXJwZW50ZXIsIEViZW4gSGV3aXR0LiBBbGwKLXJpZ2h0cyByZXNlcnZlZC4gVXNlZCB3aXRoIHBlcm1pc3Npb24uXwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19sb2dpY2FsLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX2xvZ2ljYWwuYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNiZmE3OC4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX2xvZ2ljYWwuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi09IExvZ2ljYWwgRGF0YSBNb2RlbGluZwotCi1Ob3cgdGhhdCB5b3UgaGF2ZSBkZWZpbmVkIHlvdXIgcXVlcmllcywgeW914oCZcmUgcmVhZHkgdG8gYmVnaW4gZGVzaWduaW5nCi1DYXNzYW5kcmEgdGFibGVzLiBGaXJzdCwgY3JlYXRlIGEgbG9naWNhbCBtb2RlbCBjb250YWluaW5nIGEgdGFibGUgZm9yCi1lYWNoIHF1ZXJ5LCBjYXB0dXJpbmcgZW50aXRpZXMgYW5kIHJlbGF0aW9uc2hpcHMgZnJvbSB0aGUgY29uY2VwdHVhbAotbW9kZWwuCi0KLVRvIG5hbWUgZWFjaCB0YWJsZSwgeW914oCZbGwgaWRlbnRpZnkgdGhlIHByaW1hcnkgZW50aXR5IHR5cGUgZm9yIHdoaWNoCi15b3UgYXJlIHF1ZXJ5aW5nIGFuZCB1c2UgdGhhdCB0byBzdGFydCB0aGUgZW50aXR5IG5hbWUuIElmIHlvdSBhcmUKLXF1ZXJ5aW5nIGJ5IGF0dHJpYnV0ZXMgb2Ygb3RoZXIgcmVsYXRlZCBlbnRpdGllcywgYXBwZW5kIHRob3NlIHRvIHRoZQotdGFibGUgbmFtZSwgc2VwYXJhdGVkIHdpdGggYF9ieV9gLiBGb3IgZXhhbXBsZSwgYGhvdGVsc19ieV9wb2lgLgotCi1OZXh0LCB5b3UgaWRlbnRpZnkgdGhlIHByaW1hcnkga2V5IGZvciB0aGUgdGFibGUsIGFkZGluZyBwYXJ0aXRpb24ga2V5Ci1jb2x1bW5zIGJhc2VkIG9uIHRoZSByZXF1aXJlZCBxdWVyeSBhdHRyaWJ1dGVzLCBhbmQgY2x1c3RlcmluZyBjb2x1bW5zCi1pbiBvcmRlciB0byBndWFyYW50ZWUgdW5pcXVlbmVzcyBhbmQgc3VwcG9ydCBkZXNpcmVkIHNvcnQgb3JkZXJpbmcuCi0KLVRoZSBkZXNpZ24gb2YgdGhlIHByaW1hcnkga2V5IGlzIGV4dHJlbWVseSBpbXBvcnRhbnQsIGFzIGl0IHdpbGwKLWRldGVybWluZSBob3cgbXVjaCBkYXRhIHdpbGwgYmUgc3RvcmVkIGluIGVhY2ggcGFydGl0aW9uIGFuZCBob3cgdGhhdAotZGF0YSBpcyBvcmdhbml6ZWQgb24gZGlzaywgd2hpY2ggaW4gdHVybiB3aWxsIGFmZmVjdCBob3cgcXVpY2tseQotQ2Fzc2FuZHJhIHByb2Nlc3NlcyByZWFkcy4KLQotQ29tcGxldGUgZWFjaCB0YWJsZSBieSBhZGRpbmcgYW55IGFkZGl0aW9uYWwgYXR0cmlidXRlcyBpZGVudGlmaWVkIGJ5Ci10aGUgcXVlcnkuIElmIGFueSBvZiB0aGVzZSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgYXJlIHRoZSBzYW1lIGZvciBldmVyeQotaW5zdGFuY2Ugb2YgdGhlIHBhcnRpdGlvbiBrZXksIG1hcmsgdGhlIGNvbHVtbiBhcyBzdGF0aWMuCi0KLU5vdyB0aGF0IHdhcyBhIHByZXR0eSBxdWljayBkZXNjcmlwdGlvbiBvZiBhIGZhaXJseSBpbnZvbHZlZCBwcm9jZXNzLCBzbwotaXQgd2lsbCBiZSB3b3J0aHdoaWxlIHRvIHdvcmsgdGhyb3VnaCBhIGRldGFpbGVkIGV4YW1wbGUuIEZpcnN0LCBsZXTigJlzCi1pbnRyb2R1Y2UgYSBub3RhdGlvbiB0aGF0IHlvdSBjYW4gdXNlIHRvIHJlcHJlc2VudCBsb2dpY2FsIG1vZGVscy4KLQotU2V2ZXJhbCBpbmRpdmlkdWFscyB3aXRoaW4gdGhlIENhc3NhbmRyYSBjb21tdW5pdHkgaGF2ZSBwcm9wb3NlZAotbm90YXRpb25zIGZvciBjYXB0dXJpbmcgZGF0YSBtb2RlbHMgaW4gZGlhZ3JhbW1hdGljIGZvcm0uIFRoaXMgZG9jdW1lbnQKLXVzZXMgYSBub3RhdGlvbiBwb3B1bGFyaXplZCBieSBBcnRlbSBDaGVib3RrbyB3aGljaCBwcm92aWRlcyBhIHNpbXBsZSwKLWluZm9ybWF0aXZlIHdheSB0byB2aXN1YWxpemUgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBxdWVyaWVzIGFuZAotdGFibGVzIGluIHlvdXIgZGVzaWducy4gVGhpcyBmaWd1cmUgc2hvd3MgdGhlIENoZWJvdGtvIG5vdGF0aW9uIGZvciBhCi1sb2dpY2FsIGRhdGEgbW9kZWwuCi0KLWltYWdlOjpkYXRhX21vZGVsaW5nX2NoZWJvdGtvX2xvZ2ljYWwucG5nW2ltYWdlXQotCi1FYWNoIHRhYmxlIGlzIHNob3duIHdpdGggaXRzIHRpdGxlIGFuZCBhIGxpc3Qgb2YgY29sdW1ucy4gUHJpbWFyeSBrZXkKLWNvbHVtbnMgYXJlIGlkZW50aWZpZWQgdmlhIHN5bWJvbHMgc3VjaCBhcyAqSyogZm9yIHBhcnRpdGlvbiBrZXkgY29sdW1ucwotYW5kICoqQyoq4oaRIG9yICoqQyoq4oaTIHRvIHJlcHJlc2VudCBjbHVzdGVyaW5nIGNvbHVtbnMuIExpbmVzIGFyZSBzaG93bgotZW50ZXJpbmcgdGFibGVzIG9yIGJldHdlZW4gdGFibGVzIHRvIGluZGljYXRlIHRoZSBxdWVyaWVzIHRoYXQgZWFjaAotdGFibGUgaXMgZGVzaWduZWQgdG8gc3VwcG9ydC4KLQotPT0gSG90ZWwgTG9naWNhbCBEYXRhIE1vZGVsCi0KLVRoZSBmaWd1cmUgYmVsb3cgc2hvd3MgYSBDaGVib3RrbyBsb2dpY2FsIGRhdGEgbW9kZWwgZm9yIHRoZSBxdWVyaWVzCi1pbnZvbHZpbmcgaG90ZWxzLCBwb2ludHMgb2YgaW50ZXJlc3QsIHJvb21zLCBhbmQgYW1lbml0aWVzLiBPbmUgdGhpbmcKLXlvdSdsbCBub3RpY2UgaW1tZWRpYXRlbHkgaXMgdGhhdCB0aGUgQ2Fzc2FuZHJhIGRlc2lnbiBkb2VzbuKAmXQgaW5jbHVkZQotZGVkaWNhdGVkIHRhYmxlcyBmb3Igcm9vbXMgb3IgYW1lbml0aWVzLCBhcyB5b3UgaGFkIGluIHRoZSByZWxhdGlvbmFsCi1kZXNpZ24uIFRoaXMgaXMgYmVjYXVzZSB0aGUgd29ya2Zsb3cgZGlkbuKAmXQgaWRlbnRpZnkgYW55IHF1ZXJpZXMKLXJlcXVpcmluZyB0aGlzIGRpcmVjdCBhY2Nlc3MuCi0KLWltYWdlOjpkYXRhX21vZGVsaW5nX2hvdGVsX2xvZ2ljYWwucG5nW2ltYWdlXQotCi1MZXTigJlzIGV4cGxvcmUgdGhlIGRldGFpbHMgb2YgZWFjaCBvZiB0aGVzZSB0YWJsZXMuCi0KLVRoZSBmaXJzdCBxdWVyeSBRMSBpcyB0byBmaW5kIGhvdGVscyBuZWFyIGEgcG9pbnQgb2YgaW50ZXJlc3QsIHNvIHlvdeKAmWxsCi1jYWxsIHRoaXMgdGFibGUgYGhvdGVsc19ieV9wb2lgLiBTZWFyY2hpbmcgYnkgYSBuYW1lZCBwb2ludCBvZiBpbnRlcmVzdAotaXMgYSBjbHVlIHRoYXQgdGhlIHBvaW50IG9mIGludGVyZXN0IHNob3VsZCBiZSBhIHBhcnQgb2YgdGhlIHByaW1hcnkKLWtleS4gTGV04oCZcyByZWZlcmVuY2UgdGhlIHBvaW50IG9mIGludGVyZXN0IGJ5IG5hbWUsIGJlY2F1c2UgYWNjb3JkaW5nIHRvCi10aGUgd29ya2Zsb3cgdGhhdCBpcyBob3cgdXNlcnMgd2lsbCBzdGFydCB0aGVpciBzZWFyY2guCi0KLVlvdeKAmWxsIG5vdGUgdGhhdCB5b3UgY2VydGFpbmx5IGNvdWxkIGhhdmUgbW9yZSB0aGFuIG9uZSBob3RlbCBuZWFyIGEKLWdpdmVuIHBvaW50IG9mIGludGVyZXN0LCBzbyB5b3XigJlsbCBuZWVkIGFub3RoZXIgY29tcG9uZW50IGluIHRoZSBwcmltYXJ5Ci1rZXkgaW4gb3JkZXIgdG8gbWFrZSBzdXJlIHlvdSBoYXZlIGEgdW5pcXVlIHBhcnRpdGlvbiBmb3IgZWFjaCBob3RlbC4gU28KLXlvdSBhZGQgdGhlIGhvdGVsIGtleSBhcyBhIGNsdXN0ZXJpbmcgY29sdW1uLgotCi1BbiBpbXBvcnRhbnQgY29uc2lkZXJhdGlvbiBpbiBkZXNpZ25pbmcgeW91ciB0YWJsZeKAmXMgcHJpbWFyeSBrZXkgaXMKLW1ha2luZyBzdXJlIHRoYXQgaXQgZGVmaW5lcyBhIHVuaXF1ZSBkYXRhIGVsZW1lbnQuIE90aGVyd2lzZSB5b3UgcnVuIHRoZQotcmlzayBvZiBhY2NpZGVudGFsbHkgb3ZlcndyaXRpbmcgZGF0YS4KLQotTm93IGZvciB0aGUgc2Vjb25kIHF1ZXJ5IChRMiksIHlvdeKAmWxsIG5lZWQgYSB0YWJsZSB0byBnZXQgaW5mb3JtYXRpb24KLWFib3V0IGEgc3BlY2lmaWMgaG90ZWwuIE9uZSBhcHByb2FjaCB3b3VsZCBoYXZlIGJlZW4gdG8gcHV0IGFsbCBvZiB0aGUKLWF0dHJpYnV0ZXMgb2YgYSBob3RlbCBpbiB0aGUgYGhvdGVsc19ieV9wb2lgIHRhYmxlLCBidXQgeW91IGFkZGVkIG9ubHkKLXRob3NlIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIHJlcXVpcmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiB3b3JrZmxvdy4KLQotRnJvbSB0aGUgd29ya2Zsb3cgZGlhZ3JhbSwgeW91IGtub3cgdGhhdCB0aGUgYGhvdGVsc19ieV9wb2lgIHRhYmxlIGlzCi11c2VkIHRvIGRpc3BsYXkgYSBsaXN0IG9mIGhvdGVscyB3aXRoIGJhc2ljIGluZm9ybWF0aW9uIG9uIGVhY2ggaG90ZWwsCi1hbmQgdGhlIGFwcGxpY2F0aW9uIGtub3dzIHRoZSB1bmlxdWUgaWRlbnRpZmllcnMgb2YgdGhlIGhvdGVscyByZXR1cm5lZC4KLVdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhIGhvdGVsIHRvIHZpZXcgZGV0YWlscywgeW91IGNhbiB0aGVuIHVzZSBRMiwKLXdoaWNoIGlzIHVzZWQgdG8gb2J0YWluIGRldGFpbHMgYWJvdXQgdGhlIGhvdGVsLiBCZWNhdXNlIHlvdSBhbHJlYWR5Ci1oYXZlIHRoZSBgaG90ZWxfaWRgIGZyb20gUTEsIHlvdSB1c2UgdGhhdCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgaG90ZWwKLXlvdeKAmXJlIGxvb2tpbmcgZm9yLiBUaGVyZWZvcmUgdGhlIHNlY29uZCB0YWJsZSBpcyBqdXN0IGNhbGxlZCBgaG90ZWxzYC4KLQotQW5vdGhlciBvcHRpb24gd291bGQgaGF2ZSBiZWVuIHRvIHN0b3JlIGEgc2V0IG9mIGBwb2lfbmFtZXNgIGluIHRoZQotaG90ZWxzIHRhYmxlLiBUaGlzIGlzIGFuIGVxdWFsbHkgdmFsaWQgYXBwcm9hY2guIFlvdeKAmWxsIGxlYXJuIHRocm91Z2gKLWV4cGVyaWVuY2Ugd2hpY2ggYXBwcm9hY2ggaXMgYmVzdCBmb3IgeW91ciBhcHBsaWNhdGlvbi4KLQotUTMgaXMganVzdCBhIHJldmVyc2Ugb2YgUTHigJRsb29raW5nIGZvciBwb2ludHMgb2YgaW50ZXJlc3QgbmVhciBhIGhvdGVsLAotcmF0aGVyIHRoYW4gaG90ZWxzIG5lYXIgYSBwb2ludCBvZiBpbnRlcmVzdC4gVGhpcyB0aW1lLCBob3dldmVyLCB5b3UKLW5lZWQgdG8gYWNjZXNzIHRoZSBkZXRhaWxzIG9mIGVhY2ggcG9pbnQgb2YgaW50ZXJlc3QsIGFzIHJlcHJlc2VudGVkIGJ5Ci10aGUgYHBvaXNfYnlfaG90ZWxgIHRhYmxlLiBBcyBwcmV2aW91c2x5LCB5b3UgYWRkIHRoZSBwb2ludCBvZiBpbnRlcmVzdAotbmFtZSBhcyBhIGNsdXN0ZXJpbmcga2V5IHRvIGd1YXJhbnRlZSB1bmlxdWVuZXNzLgotCi1BdCB0aGlzIHBvaW50LCBsZXTigJlzIG5vdyBjb25zaWRlciBob3cgdG8gc3VwcG9ydCBxdWVyeSBRNCB0byBoZWxwIHRoZQotdXNlciBmaW5kIGF2YWlsYWJsZSByb29tcyBhdCBhIHNlbGVjdGVkIGhvdGVsIGZvciB0aGUgbmlnaHRzIHRoZXkgYXJlCi1pbnRlcmVzdGVkIGluIHN0YXlpbmcuIE5vdGUgdGhhdCB0aGlzIHF1ZXJ5IGludm9sdmVzIGJvdGggYSBzdGFydCBkYXRlCi1hbmQgYW4gZW5kIGRhdGUuIEJlY2F1c2UgeW914oCZcmUgcXVlcnlpbmcgb3ZlciBhIHJhbmdlIGluc3RlYWQgb2YgYQotc2luZ2xlIGRhdGUsIHlvdSBrbm93IHRoYXQgeW914oCZbGwgbmVlZCB0byB1c2UgdGhlIGRhdGUgYXMgYSBjbHVzdGVyaW5nCi1rZXkuIFVzZSB0aGUgYGhvdGVsX2lkYCBhcyBhIHByaW1hcnkga2V5IHRvIGdyb3VwIHJvb20gZGF0YSBmb3IgZWFjaAotaG90ZWwgb24gYSBzaW5nbGUgcGFydGl0aW9uLCB3aGljaCBzaG91bGQgaGVscCBzZWFyY2hlcyBiZSBzdXBlciBmYXN0LgotTGV04oCZcyBjYWxsIHRoaXMgdGhlIGBhdmFpbGFibGVfcm9vbXNfYnlfaG90ZWxfZGF0ZWAgdGFibGUuCi0KLVRvIHN1cHBvcnQgc2VhcmNoaW5nIG92ZXIgYSByYW5nZSwgdXNlIGBjbHVzdGVyaW5nIGNvbHVtbnMKLTxjbHVzdGVyaW5nLWNvbHVtbnM+YCB0byBzdG9yZSBhdHRyaWJ1dGVzIHRoYXQgeW91IG5lZWQgdG8gYWNjZXNzIGluIGEKLXJhbmdlIHF1ZXJ5LiBSZW1lbWJlciB0aGF0IHRoZSBvcmRlciBvZiB0aGUgY2x1c3RlcmluZyBjb2x1bW5zIGlzCi1pbXBvcnRhbnQuCi0KLVRoZSBkZXNpZ24gb2YgdGhlIGBhdmFpbGFibGVfcm9vbXNfYnlfaG90ZWxfZGF0ZWAgdGFibGUgaXMgYW4gaW5zdGFuY2UKLW9mIHRoZSAqd2lkZSBwYXJ0aXRpb24qIHBhdHRlcm4uIFRoaXMgcGF0dGVybiBpcyBzb21ldGltZXMgY2FsbGVkIHRoZQotKndpZGUgcm93KiBwYXR0ZXJuIHdoZW4gZGlzY3Vzc2luZyBkYXRhYmFzZXMgdGhhdCBzdXBwb3J0IHNpbWlsYXIKLW1vZGVscywgYnV0IHdpZGUgcGFydGl0aW9uIGlzIGEgbW9yZSBhY2N1cmF0ZSBkZXNjcmlwdGlvbiBmcm9tIGEKLUNhc3NhbmRyYSBwZXJzcGVjdGl2ZS4gVGhlIGVzc2VuY2Ugb2YgdGhlIHBhdHRlcm4gaXMgdG8gZ3JvdXAgbXVsdGlwbGUKLXJlbGF0ZWQgcm93cyBpbiBhIHBhcnRpdGlvbiBpbiBvcmRlciB0byBzdXBwb3J0IGZhc3QgYWNjZXNzIHRvIG11bHRpcGxlCi1yb3dzIHdpdGhpbiB0aGUgcGFydGl0aW9uIGluIGEgc2luZ2xlIHF1ZXJ5LgotCi1JbiBvcmRlciB0byByb3VuZCBvdXQgdGhlIHNob3BwaW5nIHBvcnRpb24gb2YgdGhlIGRhdGEgbW9kZWwsIGFkZCB0aGUKLWBhbWVuaXRpZXNfYnlfcm9vbWAgdGFibGUgdG8gc3VwcG9ydCBRNS4gVGhpcyB3aWxsIGFsbG93IHVzZXJzIHRvIHZpZXcKLXRoZSBhbWVuaXRpZXMgb2Ygb25lIG9mIHRoZSByb29tcyB0aGF0IGlzIGF2YWlsYWJsZSBmb3IgdGhlIGRlc2lyZWQgc3RheQotZGF0ZXMuCi0KLT09IFJlc2VydmF0aW9uIExvZ2ljYWwgRGF0YSBNb2RlbAotCi1Ob3cgbGV0J3Mgc3dpdGNoIGdlYXJzIHRvIGxvb2sgYXQgdGhlIHJlc2VydmF0aW9uIHF1ZXJpZXMuIFRoZSBmaWd1cmUKLXNob3dzIGEgbG9naWNhbCBkYXRhIG1vZGVsIGZvciByZXNlcnZhdGlvbnMuIFlvdeKAmWxsIG5vdGljZSB0aGF0IHRoZXNlCi10YWJsZXMgcmVwcmVzZW50IGEgZGVub3JtYWxpemVkIGRlc2lnbjsgdGhlIHNhbWUgZGF0YSBhcHBlYXJzIGluCi1tdWx0aXBsZSB0YWJsZXMsIHdpdGggZGlmZmVyaW5nIGtleXMuCi0KLWltYWdlOjpkYXRhX21vZGVsaW5nX3Jlc2VydmF0aW9uX2xvZ2ljYWwucG5nW2ltYWdlXQotCi1JbiBvcmRlciB0byBzYXRpc2Z5IFE2LCB0aGUgYHJlc2VydmF0aW9uc19ieV9ndWVzdGAgdGFibGUgY2FuIGJlIHVzZWQgdG8KLWxvb2sgdXAgdGhlIHJlc2VydmF0aW9uIGJ5IGd1ZXN0IG5hbWUuIFlvdSBjb3VsZCBlbnZpc2lvbiBxdWVyeSBRNyBiZWluZwotdXNlZCBvbiBiZWhhbGYgb2YgYSBndWVzdCBvbiBhIHNlbGYtc2VydmUgd2Vic2l0ZSBvciBhIGNhbGwgY2VudGVyIGFnZW50Ci10cnlpbmcgdG8gYXNzaXN0IHRoZSBndWVzdC4gQmVjYXVzZSB0aGUgZ3Vlc3QgbmFtZSBtaWdodCBub3QgYmUgdW5pcXVlLAoteW91IGluY2x1ZGUgdGhlIGd1ZXN0IElEIGhlcmUgYXMgYSBjbHVzdGVyaW5nIGNvbHVtbiBhcyB3ZWxsLgotCi1ROCBhbmQgUTkgaW4gcGFydGljdWxhciBoZWxwIHRvIHJlbWluZCB5b3UgdG8gY3JlYXRlIHF1ZXJpZXMgdGhhdAotc3VwcG9ydCB2YXJpb3VzIHN0YWtlaG9sZGVycyBvZiB0aGUgYXBwbGljYXRpb24sIG5vdCBqdXN0IGN1c3RvbWVycyBidXQKLXN0YWZmIGFzIHdlbGwsIGFuZCBwZXJoYXBzIGV2ZW4gdGhlIGFuYWx5dGljcyB0ZWFtLCBzdXBwbGllcnMsIGFuZCBzbwotb24uCi0KLVRoZSBob3RlbCBzdGFmZiBtaWdodCB3aXNoIHRvIHNlZSBhIHJlY29yZCBvZiB1cGNvbWluZyByZXNlcnZhdGlvbnMgYnkKLWRhdGUgaW4gb3JkZXIgdG8gZ2V0IGluc2lnaHQgaW50byBob3cgdGhlIGhvdGVsIGlzIHBlcmZvcm1pbmcsIHN1Y2ggYXMKLXdoYXQgZGF0ZXMgdGhlIGhvdGVsIGlzIHNvbGQgb3V0IG9yIHVuZGVyc29sZC4gUTggc3VwcG9ydHMgdGhlIHJldHJpZXZhbAotb2YgcmVzZXJ2YXRpb25zIGZvciBhIGdpdmVuIGhvdGVsIGJ5IGRhdGUuCi0KLUZpbmFsbHksIHlvdSBjcmVhdGUgYSBgZ3Vlc3RzYCB0YWJsZS4gVGhpcyBwcm92aWRlcyBhIHNpbmdsZSBsb2NhdGlvbgotdGhhdCB1c2VkIHRvIHN0b3JlIGd1ZXN0IGluZm9ybWF0aW9uLiBJbiB0aGlzIGNhc2UsIHlvdSBzcGVjaWZ5IGEKLXNlcGFyYXRlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBndWVzdCByZWNvcmRzLCBhcyBpdCBpcyBub3QgdW5jb21tb24gZm9yCi1ndWVzdHMgdG8gaGF2ZSB0aGUgc2FtZSBuYW1lLiBJbiBtYW55IG9yZ2FuaXphdGlvbnMsIGEgY3VzdG9tZXIgZGF0YWJhc2UKLXN1Y2ggYXMgdGhlIGBndWVzdHNgIHRhYmxlIHdvdWxkIGJlIHBhcnQgb2YgYSBzZXBhcmF0ZSBjdXN0b21lcgotbWFuYWdlbWVudCBhcHBsaWNhdGlvbiwgd2hpY2ggaXMgd2h5IG90aGVyIGd1ZXN0IGFjY2VzcyBwYXR0ZXJucyB3ZXJlCi1vbWl0dGVkIGZyb20gdGhlIGV4YW1wbGUuCi0KLT09IFBhdHRlcm5zIGFuZCBBbnRpLVBhdHRlcm5zCi0KLUFzIHdpdGggb3RoZXIgdHlwZXMgb2Ygc29mdHdhcmUgZGVzaWduLCB0aGVyZSBhcmUgc29tZSB3ZWxsLWtub3duCi1wYXR0ZXJucyBhbmQgYW50aS1wYXR0ZXJucyBmb3IgZGF0YSBtb2RlbGluZyBpbiBDYXNzYW5kcmEuIFlvdeKAmXZlCi1hbHJlYWR5IHVzZWQgb25lIG9mIHRoZSBtb3N0IGNvbW1vbiBwYXR0ZXJucyBpbiB0aGlzIGhvdGVsIG1vZGVs4oCUdGhlCi13aWRlIHBhcnRpdGlvbiBwYXR0ZXJuLgotCi1UaGUgKnRpbWUgc2VyaWVzKiBwYXR0ZXJuIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgd2lkZSBwYXJ0aXRpb24gcGF0dGVybi4KLUluIHRoaXMgcGF0dGVybiwgYSBzZXJpZXMgb2YgbWVhc3VyZW1lbnRzIGF0IHNwZWNpZmljIHRpbWUgaW50ZXJ2YWxzIGFyZQotc3RvcmVkIGluIGEgd2lkZSBwYXJ0aXRpb24sIHdoZXJlIHRoZSBtZWFzdXJlbWVudCB0aW1lIGlzIHVzZWQgYXMgcGFydAotb2YgdGhlIHBhcnRpdGlvbiBrZXkuIFRoaXMgcGF0dGVybiBpcyBmcmVxdWVudGx5IHVzZWQgaW4gZG9tYWlucwotaW5jbHVkaW5nIGJ1c2luZXNzIGFuYWx5c2lzLCBzZW5zb3IgZGF0YSBtYW5hZ2VtZW50LCBhbmQgc2NpZW50aWZpYwotZXhwZXJpbWVudHMuCi0KLVRoZSB0aW1lIHNlcmllcyBwYXR0ZXJuIGlzIGFsc28gdXNlZnVsIGZvciBkYXRhIG90aGVyIHRoYW4gbWVhc3VyZW1lbnRzLgotQ29uc2lkZXIgdGhlIGV4YW1wbGUgb2YgYSBiYW5raW5nIGFwcGxpY2F0aW9uLiBZb3UgY291bGQgc3RvcmUgZWFjaAotY3VzdG9tZXLigJlzIGJhbGFuY2UgaW4gYSByb3csIGJ1dCB0aGF0IG1pZ2h0IGxlYWQgdG8gYSBsb3Qgb2YgcmVhZCBhbmQKLXdyaXRlIGNvbnRlbnRpb24gYXMgdmFyaW91cyBjdXN0b21lcnMgY2hlY2sgdGhlaXIgYmFsYW5jZSBvciBtYWtlCi10cmFuc2FjdGlvbnMuIFlvdeKAmWQgcHJvYmFibHkgYmUgdGVtcHRlZCB0byB3cmFwIGEgdHJhbnNhY3Rpb24gYXJvdW5kCi13cml0ZXMganVzdCB0byBwcm90ZWN0IHRoZSBiYWxhbmNlIGZyb20gYmVpbmcgdXBkYXRlZCBpbiBlcnJvci4gSW4KLWNvbnRyYXN0LCBhIHRpbWUgc2VyaWVz4oCTc3R5bGUgZGVzaWduIHdvdWxkIHN0b3JlIGVhY2ggdHJhbnNhY3Rpb24gYXMgYQotdGltZXN0YW1wZWQgcm93IGFuZCBsZWF2ZSB0aGUgd29yayBvZiBjYWxjdWxhdGluZyB0aGUgY3VycmVudCBiYWxhbmNlIHRvCi10aGUgYXBwbGljYXRpb24uCi0KLU9uZSBkZXNpZ24gdHJhcCB0aGF0IG1hbnkgbmV3IHVzZXJzIGZhbGwgaW50byBpcyBhdHRlbXB0aW5nIHRvIHVzZQotQ2Fzc2FuZHJhIGFzIGEgcXVldWUuIEVhY2ggaXRlbSBpbiB0aGUgcXVldWUgaXMgc3RvcmVkIHdpdGggYSB0aW1lc3RhbXAKLWluIGEgd2lkZSBwYXJ0aXRpb24uIEl0ZW1zIGFyZSBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZSBhbmQgcmVhZAotZnJvbSB0aGUgZnJvbnQsIGJlaW5nIGRlbGV0ZWQgYWZ0ZXIgdGhleSBhcmUgcmVhZC4gVGhpcyBpcyBhIGRlc2lnbiB0aGF0Ci1zZWVtcyBhdHRyYWN0aXZlLCBlc3BlY2lhbGx5IGdpdmVuIGl0cyBhcHBhcmVudCBzaW1pbGFyaXR5IHRvIHRoZSB0aW1lCi1zZXJpZXMgcGF0dGVybi4gVGhlIHByb2JsZW0gd2l0aCB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgdGhlIGRlbGV0ZWQgaXRlbXMKLWFyZSBub3cgYHRvbWJzdG9uZXMgPGFzeW5jaC1kZWxldGVzPmAgdGhhdCBDYXNzYW5kcmEgbXVzdCBzY2FuIHBhc3QgaW4KLW9yZGVyIHRvIHJlYWQgZnJvbSB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlLiBPdmVyIHRpbWUsIGEgZ3Jvd2luZyBudW1iZXIKLW9mIHRvbWJzdG9uZXMgYmVnaW5zIHRvIGRlZ3JhZGUgcmVhZCBwZXJmb3JtYW5jZS4KLQotVGhlIHF1ZXVlIGFudGktcGF0dGVybiBzZXJ2ZXMgYXMgYSByZW1pbmRlciB0aGF0IGFueSBkZXNpZ24gdGhhdCByZWxpZXMKLW9uIHRoZSBkZWxldGlvbiBvZiBkYXRhIGlzIHBvdGVudGlhbGx5IGEgcG9vcmx5IHBlcmZvcm1pbmcgZGVzaWduLgotCi1fTWF0ZXJpYWwgYWRhcHRlZCBmcm9tIENhc3NhbmRyYSwgVGhlIERlZmluaXRpdmUgR3VpZGUuIFB1Ymxpc2hlZCBieQotTydSZWlsbHkgTWVkaWEsIEluYy4gQ29weXJpZ2h0IMKpIDIwMjAgSmVmZiBDYXJwZW50ZXIsIEViZW4gSGV3aXR0LiBBbGwKLXJpZ2h0cyByZXNlcnZlZC4gVXNlZCB3aXRoIHBlcm1pc3Npb24uXwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19waHlzaWNhbC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19waHlzaWNhbC5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTM0MDY3Li4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2RhdGFfbW9kZWxpbmdfcGh5c2ljYWwuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLT0gUGh5c2ljYWwgRGF0YSBNb2RlbGluZwotCi1PbmNlIHlvdSBoYXZlIGEgbG9naWNhbCBkYXRhIG1vZGVsIGRlZmluZWQsIGNyZWF0aW5nIHRoZSBwaHlzaWNhbCBtb2RlbAotaXMgYSByZWxhdGl2ZWx5IHNpbXBsZSBwcm9jZXNzLgotCi1Zb3Ugd2FsayB0aHJvdWdoIGVhY2ggb2YgdGhlIGxvZ2ljYWwgbW9kZWwgdGFibGVzLCBhc3NpZ25pbmcgdHlwZXMgdG8KLWVhY2ggaXRlbS4gWW91IGNhbiB1c2UgYW55IHZhbGlkIGBDUUwgZGF0YSB0eXBlIDxkYXRhLXR5cGVzPmAsIGluY2x1ZGluZwotdGhlIGJhc2ljIHR5cGVzLCBjb2xsZWN0aW9ucywgYW5kIHVzZXItZGVmaW5lZCB0eXBlcy4gWW91IG1heSBpZGVudGlmeQotYWRkaXRpb25hbCB1c2VyLWRlZmluZWQgdHlwZXMgdGhhdCBjYW4gYmUgY3JlYXRlZCB0byBzaW1wbGlmeSB5b3VyCi1kZXNpZ24uCi0KLUFmdGVyIHlvdeKAmXZlIGFzc2lnbmVkIGRhdGEgdHlwZXMsIHlvdSBhbmFseXplIHRoZSBtb2RlbCBieSBwZXJmb3JtaW5nCi1zaXplIGNhbGN1bGF0aW9ucyBhbmQgdGVzdGluZyBvdXQgaG93IHRoZSBtb2RlbCB3b3Jrcy4gWW91IG1heSBtYWtlIHNvbWUKLWFkanVzdG1lbnRzIGJhc2VkIG9uIHlvdXIgZmluZGluZ3MuIE9uY2UgYWdhaW4gbGV0J3MgY292ZXIgdGhlIGRhdGEKLW1vZGVsaW5nIHByb2Nlc3MgaW4gbW9yZSBkZXRhaWwgYnkgd29ya2luZyB0aHJvdWdoIGFuIGV4YW1wbGUuCi0KLUJlZm9yZSBnZXR0aW5nIHN0YXJ0ZWQsIGxldOKAmXMgbG9vayBhdCBhIGZldyBhZGRpdGlvbnMgdG8gdGhlIENoZWJvdGtvCi1ub3RhdGlvbiBmb3IgcGh5c2ljYWwgZGF0YSBtb2RlbHMuIFRvIGRyYXcgcGh5c2ljYWwgbW9kZWxzLCB5b3UgbmVlZCB0bwotYmUgYWJsZSB0byBhZGQgdGhlIHR5cGluZyBpbmZvcm1hdGlvbiBmb3IgZWFjaCBjb2x1bW4uIFRoaXMgZmlndXJlIHNob3dzCi10aGUgYWRkaXRpb24gb2YgYSB0eXBlIGZvciBlYWNoIGNvbHVtbiBpbiBhIHNhbXBsZSB0YWJsZS4KLQotaW1hZ2U6OmRhdGFfbW9kZWxpbmdfY2hlYm90a29fcGh5c2ljYWwucG5nW2ltYWdlXQotCi1UaGUgZmlndXJlIGluY2x1ZGVzIGEgZGVzaWduYXRpb24gb2YgdGhlIGtleXNwYWNlIGNvbnRhaW5pbmcgZWFjaCB0YWJsZQotYW5kIHZpc3VhbCBjdWVzIGZvciBjb2x1bW5zIHJlcHJlc2VudGVkIHVzaW5nIGNvbGxlY3Rpb25zIGFuZAotdXNlci1kZWZpbmVkIHR5cGVzLiBOb3RlIHRoZSBkZXNpZ25hdGlvbiBvZiBzdGF0aWMgY29sdW1ucyBhbmQgc2Vjb25kYXJ5Ci1pbmRleCBjb2x1bW5zLiBUaGVyZSBpcyBubyByZXN0cmljdGlvbiBvbiBhc3NpZ25pbmcgdGhlc2UgYXMgcGFydCBvZiBhCi1sb2dpY2FsIG1vZGVsLCBidXQgdGhleSBhcmUgdHlwaWNhbGx5IG1vcmUgb2YgYSBwaHlzaWNhbCBkYXRhIG1vZGVsaW5nCi1jb25jZXJuLgotCi09PSBIb3RlbCBQaHlzaWNhbCBEYXRhIE1vZGVsCi0KLU5vdyBsZXTigJlzIGdldCB0byB3b3JrIG9uIHRoZSBwaHlzaWNhbCBtb2RlbC4gRmlyc3QsIHlvdSBuZWVkIGtleXNwYWNlcwotdG8gY29udGFpbiB0aGUgdGFibGVzLiBUbyBrZWVwIHRoZSBkZXNpZ24gcmVsYXRpdmVseSBzaW1wbGUsIGNyZWF0ZSBhCi1gaG90ZWxgIGtleXNwYWNlIHRvIGNvbnRhaW4gdGFibGVzIGZvciBob3RlbCBhbmQgYXZhaWxhYmlsaXR5IGRhdGEsIGFuZAotYSBgcmVzZXJ2YXRpb25gIGtleXNwYWNlIHRvIGNvbnRhaW4gdGFibGVzIGZvciByZXNlcnZhdGlvbiBhbmQgZ3Vlc3QKLWRhdGEuIEluIGEgcmVhbCBzeXN0ZW0sIHlvdSBtaWdodCBkaXZpZGUgdGhlIHRhYmxlcyBhY3Jvc3MgZXZlbiBtb3JlCi1rZXlzcGFjZXMgaW4gb3JkZXIgdG8gc2VwYXJhdGUgY29uY2VybnMuCi0KLUZvciB0aGUgYGhvdGVsc2AgdGFibGUsIHVzZSBDYXNzYW5kcmHigJlzIGB0ZXh0YCB0eXBlIHRvIHJlcHJlc2VudCB0aGUKLWhvdGVs4oCZcyBgaWRgLiBGb3IgdGhlIGFkZHJlc3MsIGNyZWF0ZSBhbiBgYWRkcmVzc2AgdXNlciBkZWZpbmVkIHR5cGUuCi1Vc2UgdGhlIGB0ZXh0YCB0eXBlIHRvIHJlcHJlc2VudCB0aGUgcGhvbmUgbnVtYmVyLCBhcyB0aGVyZSBpcwotY29uc2lkZXJhYmxlIHZhcmlhbmNlIGluIHRoZSBmb3JtYXR0aW5nIG9mIG51bWJlcnMgYmV0d2VlbiBjb3VudHJpZXMuCi0KLVdoaWxlIGl0IHdvdWxkIG1ha2Ugc2Vuc2UgdG8gdXNlIHRoZSBgdXVpZGAgdHlwZSBmb3IgYXR0cmlidXRlcyBzdWNoIGFzCi10aGUgYGhvdGVsX2lkYCwgdGhpcyBkb2N1bWVudCB1c2VzIG1vc3RseSBgdGV4dGAgYXR0cmlidXRlcyBhcwotaWRlbnRpZmllcnMsIHRvIGtlZXAgdGhlIHNhbXBsZXMgc2ltcGxlIGFuZCByZWFkYWJsZS4gRm9yIGV4YW1wbGUsIGEKLWNvbW1vbiBjb252ZW50aW9uIGluIHRoZSBob3NwaXRhbGl0eSBpbmR1c3RyeSBpcyB0byByZWZlcmVuY2UgcHJvcGVydGllcwotYnkgc2hvcnQgY29kZXMgbGlrZSAiQVoxMjMiIG9yICJOWTIyOSIuIFRoaXMgZXhhbXBsZSB1c2VzIHRoZXNlIHZhbHVlcwotZm9yIGBob3RlbF9pZHNgLCB3aGlsZSBhY2tub3dsZWRnaW5nIHRoZXkgYXJlIG5vdCBuZWNlc3NhcmlseSBnbG9iYWxseQotdW5pcXVlLgotCi1Zb3XigJlsbCBmaW5kIHRoYXQgaXTigJlzIG9mdGVuIGhlbHBmdWwgdG8gdXNlIHVuaXF1ZSBJRHMgdG8gdW5pcXVlbHkKLXJlZmVyZW5jZSBlbGVtZW50cywgYW5kIHRvIHVzZSB0aGVzZSBgdXVpZHNgIGFzIHJlZmVyZW5jZXMgaW4gdGFibGVzCi1yZXByZXNlbnRpbmcgb3RoZXIgZW50aXRpZXMuIFRoaXMgaGVscHMgdG8gbWluaW1pemUgY291cGxpbmcgYmV0d2VlbgotZGlmZmVyZW50IGVudGl0eSB0eXBlcy4gVGhpcyBtYXkgcHJvdmUgZXNwZWNpYWxseSBlZmZlY3RpdmUgaWYgeW91IGFyZQotdXNpbmcgYSBtaWNyb3NlcnZpY2UgYXJjaGl0ZWN0dXJhbCBzdHlsZSBmb3IgeW91ciBhcHBsaWNhdGlvbiwgaW4gd2hpY2gKLXRoZXJlIGFyZSBzZXBhcmF0ZSBzZXJ2aWNlcyByZXNwb25zaWJsZSBmb3IgZWFjaCBlbnRpdHkgdHlwZS4KLQotQXMgeW91IHdvcmsgdG8gY3JlYXRlIHBoeXNpY2FsIHJlcHJlc2VudGF0aW9ucyBvZiB2YXJpb3VzIHRhYmxlcyBpbiB0aGUKLWxvZ2ljYWwgaG90ZWwgZGF0YSBtb2RlbCwgeW91IHVzZSB0aGUgc2FtZSBhcHByb2FjaC4gVGhlIHJlc3VsdGluZwotZGVzaWduIGlzIHNob3duIGluIHRoaXMgZmlndXJlOgotCi1pbWFnZTo6ZGF0YV9tb2RlbGluZ19ob3RlbF9waHlzaWNhbC5wbmdbaW1hZ2VdCi0KLU5vdGUgdGhhdCB0aGUgYGFkZHJlc3NgIHR5cGUgaXMgYWxzbyBpbmNsdWRlZCBpbiB0aGUgZGVzaWduLiBJdCBpcwotZGVzaWduYXRlZCB3aXRoIGFuIGFzdGVyaXNrIHRvIGRlbm90ZSB0aGF0IGl0IGlzIGEgdXNlci1kZWZpbmVkIHR5cGUsCi1hbmQgaGFzIG5vIHByaW1hcnkga2V5IGNvbHVtbnMgaWRlbnRpZmllZC4gVGhpcyB0eXBlIGlzIHVzZWQgaW4gdGhlCi1gaG90ZWxzYCBhbmQgYGhvdGVsc19ieV9wb2lgIHRhYmxlcy4KLQotVXNlci1kZWZpbmVkIHR5cGVzIGFyZSBmcmVxdWVudGx5IHVzZWQgdG8gaGVscCByZWR1Y2UgZHVwbGljYXRpb24gb2YKLW5vbi1wcmltYXJ5IGtleSBjb2x1bW5zLCBhcyB3YXMgZG9uZSB3aXRoIHRoZSBgYWRkcmVzc2AgdXNlci1kZWZpbmVkCi10eXBlLiBUaGlzIGNhbiByZWR1Y2UgY29tcGxleGl0eSBpbiB0aGUgZGVzaWduLgotCi1SZW1lbWJlciB0aGF0IHRoZSBzY29wZSBvZiBhIFVEVCBpcyB0aGUga2V5c3BhY2UgaW4gd2hpY2ggaXQgaXMgZGVmaW5lZC4KLVRvIHVzZSBgYWRkcmVzc2AgaW4gdGhlIGByZXNlcnZhdGlvbmAga2V5c3BhY2UgZGVmaW5lZCBiZWxvdyBkZXNpZ24sCi15b3XigJlsbCBoYXZlIHRvIGRlY2xhcmUgaXQgYWdhaW4uIFRoaXMgaXMganVzdCBvbmUgb2YgdGhlIG1hbnkgdHJhZGUtb2ZmcwoteW91IGhhdmUgdG8gbWFrZSBpbiBkYXRhIG1vZGVsIGRlc2lnbi4KLQotPT0gUmVzZXJ2YXRpb24gUGh5c2ljYWwgRGF0YSBNb2RlbAotCi1Ob3csIGxldOKAmXMgZXhhbWluZSByZXNlcnZhdGlvbiB0YWJsZXMgaW4gdGhlIGRlc2lnbi4gUmVtZW1iZXIgdGhhdCB0aGUKLWxvZ2ljYWwgbW9kZWwgY29udGFpbmVkIHRocmVlIGRlbm9ybWFsaXplZCB0YWJsZXMgdG8gc3VwcG9ydCBxdWVyaWVzIGZvcgotcmVzZXJ2YXRpb25zIGJ5IGNvbmZpcm1hdGlvbiBudW1iZXIsIGd1ZXN0LCBhbmQgaG90ZWwgYW5kIGRhdGUuIEZvciB0aGUKLWZpcnN0IGl0ZXJhdGlvbiBvZiB5b3VyIHBoeXNpY2FsIGRhdGEgbW9kZWwgZGVzaWduLCBhc3N1bWUgeW91J3JlIGdvaW5nCi10byBtYW5hZ2UgdGhpcyBkZW5vcm1hbGl6YXRpb24gbWFudWFsbHkuIE5vdGUgdGhhdCB0aGlzIGRlc2lnbiBjb3VsZCBiZQotcmV2aXNlZCB0byB1c2UgQ2Fzc2FuZHJh4oCZcyAoZXhwZXJpbWVudGFsKSBtYXRlcmlhbGl6ZWQgdmlldyBmZWF0dXJlLgotCi1pbWFnZTo6ZGF0YV9tb2RlbGluZ19yZXNlcnZhdGlvbl9waHlzaWNhbC5wbmdbaW1hZ2VdCi0KLU5vdGUgdGhhdCB0aGUgYGFkZHJlc3NgIHR5cGUgaXMgcmVwcm9kdWNlZCBpbiB0aGlzIGtleXNwYWNlIGFuZAotYGd1ZXN0X2lkYCBpcyBtb2RlbGVkIGFzIGEgYHV1aWRgIHR5cGUgaW4gYWxsIG9mIHRoZSB0YWJsZXMuCi0KLV9NYXRlcmlhbCBhZGFwdGVkIGZyb20gQ2Fzc2FuZHJhLCBUaGUgRGVmaW5pdGl2ZSBHdWlkZS4gUHVibGlzaGVkIGJ5Ci1PJ1JlaWxseSBNZWRpYSwgSW5jLiBDb3B5cmlnaHQgwqkgMjAyMCBKZWZmIENhcnBlbnRlciwgRWJlbiBIZXdpdHQuIEFsbAotcmlnaHRzIHJlc2VydmVkLiBVc2VkIHdpdGggcGVybWlzc2lvbi5fCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX3F1ZXJpZXMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2RhdGFfbW9kZWxpbmdfcXVlcmllcy5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDQwZmI4Li4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2RhdGFfbW9kZWxpbmdfcXVlcmllcy5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPSBEZWZpbmluZyBBcHBsaWNhdGlvbiBRdWVyaWVzCi0KLUxldOKAmXMgdHJ5IHRoZSBxdWVyeS1maXJzdCBhcHByb2FjaCB0byBzdGFydCBkZXNpZ25pbmcgdGhlIGRhdGEgbW9kZWwgZm9yCi1hIGhvdGVsIGFwcGxpY2F0aW9uLiBUaGUgdXNlciBpbnRlcmZhY2UgZGVzaWduIGZvciB0aGUgYXBwbGljYXRpb24gaXMKLW9mdGVuIGEgZ3JlYXQgYXJ0aWZhY3QgdG8gdXNlIHRvIGJlZ2luIGlkZW50aWZ5aW5nIHF1ZXJpZXMuIExldOKAmXMgYXNzdW1lCi10aGF0IHlvdeKAmXZlIHRhbGtlZCB3aXRoIHRoZSBwcm9qZWN0IHN0YWtlaG9sZGVycyBhbmQgeW91ciBVWCBkZXNpZ25lcnMKLWhhdmUgcHJvZHVjZWQgdXNlciBpbnRlcmZhY2UgZGVzaWducyBvciB3aXJlZnJhbWVzIGZvciB0aGUga2V5IHVzZQotY2FzZXMuIFlvdeKAmWxsIGxpa2VseSBoYXZlIGEgbGlzdCBvZiBzaG9wcGluZyBxdWVyaWVzIGxpa2UgdGhlIGZvbGxvd2luZzoKLQotKiBRMS4gRmluZCBob3RlbHMgbmVhciBhIGdpdmVuIHBvaW50IG9mIGludGVyZXN0LgotKiBRMi4gRmluZCBpbmZvcm1hdGlvbiBhYm91dCBhIGdpdmVuIGhvdGVsLCBzdWNoIGFzIGl0cyBuYW1lIGFuZAotbG9jYXRpb24uCi0qIFEzLiBGaW5kIHBvaW50cyBvZiBpbnRlcmVzdCBuZWFyIGEgZ2l2ZW4gaG90ZWwuCi0qIFE0LiBGaW5kIGFuIGF2YWlsYWJsZSByb29tIGluIGEgZ2l2ZW4gZGF0ZSByYW5nZS4KLSogUTUuIEZpbmQgdGhlIHJhdGUgYW5kIGFtZW5pdGllcyBmb3IgYSByb29tLgotCi1JdCBpcyBvZnRlbiBoZWxwZnVsIHRvIGJlIGFibGUgdG8gcmVmZXIgdG8gcXVlcmllcyBieSBhIHNob3J0aGFuZCBudW1iZXIKLXJhdGhlciB0aGF0IGV4cGxhaW5pbmcgdGhlbSBpbiBmdWxsLiBUaGUgcXVlcmllcyBsaXN0ZWQgaGVyZSBhcmUKLW51bWJlcmVkIFExLCBRMiwgYW5kIHNvIG9uLCB3aGljaCBpcyBob3cgdGhleSBhcmUgcmVmZXJlbmNlZCBpbiBkaWFncmFtcwotdGhyb3VnaG91dCB0aGUgZXhhbXBsZS4KLQotTm93IGlmIHRoZSBhcHBsaWNhdGlvbiBpcyB0byBiZSBhIHN1Y2Nlc3MsIHlvdeKAmWxsIGNlcnRhaW5seSB3YW50Ci1jdXN0b21lcnMgdG8gYmUgYWJsZSB0byBib29rIHJlc2VydmF0aW9ucyBhdCBob3RlbHMuIFRoaXMgaW5jbHVkZXMgc3RlcHMKLXN1Y2ggYXMgc2VsZWN0aW5nIGFuIGF2YWlsYWJsZSByb29tIGFuZCBlbnRlcmluZyB0aGVpciBndWVzdAotaW5mb3JtYXRpb24uIFNvIGNsZWFybHkgeW91IHdpbGwgYWxzbyBuZWVkIHNvbWUgcXVlcmllcyB0aGF0IGFkZHJlc3MgdGhlCi1yZXNlcnZhdGlvbiBhbmQgZ3Vlc3QgZW50aXRpZXMgZnJvbSB0aGUgY29uY2VwdHVhbCBkYXRhIG1vZGVsLiBFdmVuCi1oZXJlLCBob3dldmVyLCB5b3XigJlsbCB3YW50IHRvIHRoaW5rIG5vdCBvbmx5IGZyb20gdGhlIGN1c3RvbWVyCi1wZXJzcGVjdGl2ZSBpbiB0ZXJtcyBvZiBob3cgdGhlIGRhdGEgaXMgd3JpdHRlbiwgYnV0IGFsc28gaW4gdGVybXMgb2YKLWhvdyB0aGUgZGF0YSB3aWxsIGJlIHF1ZXJpZWQgYnkgZG93bnN0cmVhbSB1c2UgY2FzZXMuCi0KLVlvdXIgbmF0dXJhbCB0ZW5kZW5jeSBtaWdodCBiZSB0byBmb2N1cyBmaXJzdCBvbiBkZXNpZ25pbmcgdGhlIHRhYmxlcwotdG8gc3RvcmUgcmVzZXJ2YXRpb24gYW5kIGd1ZXN0IHJlY29yZHMsIGFuZCBvbmx5IHRoZW4gc3RhcnQgdGhpbmtpbmcKLWFib3V0IHRoZSBxdWVyaWVzIHRoYXQgd291bGQgYWNjZXNzIHRoZW0uIFlvdSBtYXkgaGF2ZSBmZWx0IGEgc2ltaWxhcgotdGVuc2lvbiBhbHJlYWR5IHdoZW4gZGlzY3Vzc2luZyB0aGUgc2hvcHBpbmcgcXVlcmllcyBiZWZvcmUsIHRoaW5raW5nCi3igJxidXQgd2hlcmUgZGlkIHRoZSBob3RlbCBhbmQgcG9pbnQgb2YgaW50ZXJlc3QgZGF0YSBjb21lIGZyb20/4oCdIERvbuKAmXQKLXdvcnJ5LCB5b3Ugd2lsbCBzZWUgc29vbiBlbm91Z2guIEhlcmUgYXJlIHNvbWUgcXVlcmllcyB0aGF0IGRlc2NyaWJlIGhvdwotdXNlcnMgd2lsbCBhY2Nlc3MgcmVzZXJ2YXRpb25zOgotCi0qIFE2LiBMb29rdXAgYSByZXNlcnZhdGlvbiBieSBjb25maXJtYXRpb24gbnVtYmVyLgotKiBRNy4gTG9va3VwIGEgcmVzZXJ2YXRpb24gYnkgaG90ZWwsIGRhdGUsIGFuZCBndWVzdCBuYW1lLgotKiBROC4gTG9va3VwIGFsbCByZXNlcnZhdGlvbnMgYnkgZ3Vlc3QgbmFtZS4KLSogUTkuIFZpZXcgZ3Vlc3QgZGV0YWlscy4KLQotQWxsIG9mIHRoZSBxdWVyaWVzIGFyZSBzaG93biBpbiB0aGUgY29udGV4dCBvZiB0aGUgd29ya2Zsb3cgb2YgdGhlCi1hcHBsaWNhdGlvbiBpbiB0aGUgZmlndXJlIGJlbG93LiBFYWNoIGJveCBvbiB0aGUgZGlhZ3JhbSByZXByZXNlbnRzIGEKLXN0ZXAgaW4gdGhlIGFwcGxpY2F0aW9uIHdvcmtmbG93LCB3aXRoIGFycm93cyBpbmRpY2F0aW5nIHRoZSBmbG93cwotYmV0d2VlbiBzdGVwcyBhbmQgdGhlIGFzc29jaWF0ZWQgcXVlcnkuIElmIHlvdeKAmXZlIG1vZGVsZWQgdGhlCi1hcHBsaWNhdGlvbiB3ZWxsLCBlYWNoIHN0ZXAgb2YgdGhlIHdvcmtmbG93IGFjY29tcGxpc2hlcyBhIHRhc2sgdGhhdAot4oCcdW5sb2Nrc+KAnSBzdWJzZXF1ZW50IHN0ZXBzLiBGb3IgZXhhbXBsZSwgdGhlIOKAnFZpZXcgaG90ZWxzIG5lYXIgUE9J4oCdIHRhc2sKLWhlbHBzIHRoZSBhcHBsaWNhdGlvbiBsZWFybiBhYm91dCBzZXZlcmFsIGhvdGVscywgaW5jbHVkaW5nIHRoZWlyIHVuaXF1ZQota2V5cy4gVGhlIGtleSBmb3IgYSBzZWxlY3RlZCBob3RlbCBtYXkgYmUgdXNlZCBhcyBwYXJ0IG9mIFEyLCBpbiBvcmRlcgotdG8gb2J0YWluIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBob3RlbC4gVGhlIGFjdCBvZiBib29raW5nIGEgcm9vbQotY3JlYXRlcyBhIHJlc2VydmF0aW9uIHJlY29yZCB0aGF0IG1heSBiZSBhY2Nlc3NlZCBieSB0aGUgZ3Vlc3QgYW5kIGhvdGVsCi1zdGFmZiBhdCBhIGxhdGVyIHRpbWUgdGhyb3VnaCB2YXJpb3VzIGFkZGl0aW9uYWwgcXVlcmllcy4KLQotaW1hZ2U6OmRhdGFfbW9kZWxpbmdfaG90ZWxfcXVlcmllcy5wbmdbaW1hZ2VdCi0KLV9NYXRlcmlhbCBhZGFwdGVkIGZyb20gQ2Fzc2FuZHJhLCBUaGUgRGVmaW5pdGl2ZSBHdWlkZS4gUHVibGlzaGVkIGJ5Ci1PJ1JlaWxseSBNZWRpYSwgSW5jLiBDb3B5cmlnaHQgwqkgMjAyMCBKZWZmIENhcnBlbnRlciwgRWJlbiBIZXdpdHQuIEFsbAotcmlnaHRzIHJlc2VydmVkLiBVc2VkIHdpdGggcGVybWlzc2lvbi5fCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX3JkYm1zLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX3JkYm1zLmFkb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhY2Q2Y2MuLjAwMDAwMDAKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19yZGJtcy5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLT0gUkRCTVMgRGVzaWduCi0KLVdoZW4geW91IHNldCBvdXQgdG8gYnVpbGQgYSBuZXcgZGF0YS1kcml2ZW4gYXBwbGljYXRpb24gdGhhdCB3aWxsIHVzZSBhCi1yZWxhdGlvbmFsIGRhdGFiYXNlLCB5b3UgbWlnaHQgc3RhcnQgYnkgbW9kZWxpbmcgdGhlIGRvbWFpbiBhcyBhIHNldCBvZgotcHJvcGVybHkgbm9ybWFsaXplZCB0YWJsZXMgYW5kIHVzZSBmb3JlaWduIGtleXMgdG8gcmVmZXJlbmNlIHJlbGF0ZWQKLWRhdGEgaW4gb3RoZXIgdGFibGVzLgotCi1UaGUgZmlndXJlIGJlbG93IHNob3dzIGhvdyB5b3UgbWlnaHQgcmVwcmVzZW50IHRoZSBkYXRhIHN0b3JhZ2UgZm9yIHlvdXIKLWFwcGxpY2F0aW9uIHVzaW5nIGEgcmVsYXRpb25hbCBkYXRhYmFzZSBtb2RlbC4gVGhlIHJlbGF0aW9uYWwgbW9kZWwKLWluY2x1ZGVzIGEgY291cGxlIG9mIOKAnGpvaW7igJ0gdGFibGVzIGluIG9yZGVyIHRvIHJlYWxpemUgdGhlIG1hbnktdG8tbWFueQotcmVsYXRpb25zaGlwcyBmcm9tIHRoZSBjb25jZXB0dWFsIG1vZGVsIG9mIGhvdGVscy10by1wb2ludHMgb2YgaW50ZXJlc3QsCi1yb29tcy10by1hbWVuaXRpZXMsIHJvb21zLXRvLWF2YWlsYWJpbGl0eSwgYW5kIGd1ZXN0cy10by1yb29tcyAodmlhIGEKLXJlc2VydmF0aW9uKS4KLQotaW1hZ2U6OmRhdGFfbW9kZWxpbmdfaG90ZWxfcmVsYXRpb25hbC5wbmdbaW1hZ2VdCi0KLT09IERlc2lnbiBEaWZmZXJlbmNlcyBCZXR3ZWVuIFJEQk1TIGFuZCBDYXNzYW5kcmEKLQotTGV04oCZcyB0YWtlIGEgbWludXRlIHRvIGhpZ2hsaWdodCBzb21lIG9mIHRoZSBrZXkgZGlmZmVyZW5jZXMgaW4gZG9pbmcKLWRhdGEgbW9kZWxpbmcgZm9yIENhc3NhbmRyYSB2ZXJzdXMgYSByZWxhdGlvbmFsIGRhdGFiYXNlLgotCi09PT0gTm8gam9pbnMKLQotWW91IGNhbm5vdCBwZXJmb3JtIGpvaW5zIGluIENhc3NhbmRyYS4gSWYgeW91IGhhdmUgZGVzaWduZWQgYSBkYXRhIG1vZGVsCi1hbmQgZmluZCB0aGF0IHlvdSBuZWVkIHNvbWV0aGluZyBsaWtlIGEgam9pbiwgeW914oCZbGwgaGF2ZSB0byBlaXRoZXIgZG8KLXRoZSB3b3JrIG9uIHRoZSBjbGllbnQgc2lkZSwgb3IgY3JlYXRlIGEgZGVub3JtYWxpemVkIHNlY29uZCB0YWJsZSB0aGF0Ci1yZXByZXNlbnRzIHRoZSBqb2luIHJlc3VsdHMgZm9yIHlvdS4gVGhpcyBsYXR0ZXIgb3B0aW9uIGlzIHByZWZlcnJlZCBpbgotQ2Fzc2FuZHJhIGRhdGEgbW9kZWxpbmcuIFBlcmZvcm1pbmcgam9pbnMgb24gdGhlIGNsaWVudCBzaG91bGQgYmUgYSB2ZXJ5Ci1yYXJlIGNhc2U7IHlvdSByZWFsbHkgd2FudCB0byBkdXBsaWNhdGUgKGRlbm9ybWFsaXplKSB0aGUgZGF0YSBpbnN0ZWFkLgotCi09PT0gTm8gcmVmZXJlbnRpYWwgaW50ZWdyaXR5Ci0KLUFsdGhvdWdoIENhc3NhbmRyYSBzdXBwb3J0cyBmZWF0dXJlcyBzdWNoIGFzIGxpZ2h0d2VpZ2h0IHRyYW5zYWN0aW9ucwotYW5kIGJhdGNoZXMsIENhc3NhbmRyYSBpdHNlbGYgaGFzIG5vIGNvbmNlcHQgb2YgcmVmZXJlbnRpYWwgaW50ZWdyaXR5Ci1hY3Jvc3MgdGFibGVzLiBJbiBhIHJlbGF0aW9uYWwgZGF0YWJhc2UsIHlvdSBjb3VsZCBzcGVjaWZ5IGZvcmVpZ24ga2V5cwotaW4gYSB0YWJsZSB0byByZWZlcmVuY2UgdGhlIHByaW1hcnkga2V5IG9mIGEgcmVjb3JkIGluIGFub3RoZXIgdGFibGUuCi1CdXQgQ2Fzc2FuZHJhIGRvZXMgbm90IGVuZm9yY2UgdGhpcy4gSXQgaXMgc3RpbGwgYSBjb21tb24gZGVzaWduCi1yZXF1aXJlbWVudCB0byBzdG9yZSBJRHMgcmVsYXRlZCB0byBvdGhlciBlbnRpdGllcyBpbiB5b3VyIHRhYmxlcywgYnV0Ci1vcGVyYXRpb25zIHN1Y2ggYXMgY2FzY2FkaW5nIGRlbGV0ZXMgYXJlIG5vdCBhdmFpbGFibGUuCi0KLT09PSBEZW5vcm1hbGl6YXRpb24KLQotSW4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24sIHlvdSBhcmUgb2Z0ZW4gdGF1Z2h0IHRoZSBpbXBvcnRhbmNlIG9mCi1ub3JtYWxpemF0aW9uLiBUaGlzIGlzIG5vdCBhbiBhZHZhbnRhZ2Ugd2hlbiB3b3JraW5nIHdpdGggQ2Fzc2FuZHJhCi1iZWNhdXNlIGl0IHBlcmZvcm1zIGJlc3Qgd2hlbiB0aGUgZGF0YSBtb2RlbCBpcyBkZW5vcm1hbGl6ZWQuIEl0IGlzCi1vZnRlbiB0aGUgY2FzZSB0aGF0IGNvbXBhbmllcyBlbmQgdXAgZGVub3JtYWxpemluZyBkYXRhIGluIHJlbGF0aW9uYWwKLWRhdGFiYXNlcyBhcyB3ZWxsLiBUaGVyZSBhcmUgdHdvIGNvbW1vbiByZWFzb25zIGZvciB0aGlzLiBPbmUgaXMKLXBlcmZvcm1hbmNlLiBDb21wYW5pZXMgc2ltcGx5IGNhbuKAmXQgZ2V0IHRoZSBwZXJmb3JtYW5jZSB0aGV5IG5lZWQgd2hlbgotdGhleSBoYXZlIHRvIGRvIHNvIG1hbnkgam9pbnMgb24geWVhcnPigJkgd29ydGggb2YgZGF0YSwgc28gdGhleQotZGVub3JtYWxpemUgYWxvbmcgdGhlIGxpbmVzIG9mIGtub3duIHF1ZXJpZXMuIFRoaXMgZW5kcyB1cCB3b3JraW5nLCBidXQKLWdvZXMgYWdhaW5zdCB0aGUgZ3JhaW4gb2YgaG93IHJlbGF0aW9uYWwgZGF0YWJhc2VzIGFyZSBpbnRlbmRlZCB0byBiZQotZGVzaWduZWQsIGFuZCB1bHRpbWF0ZWx5IG1ha2VzIG9uZSBxdWVzdGlvbiB3aGV0aGVyIHVzaW5nIGEgcmVsYXRpb25hbAotZGF0YWJhc2UgaXMgdGhlIGJlc3QgYXBwcm9hY2ggaW4gdGhlc2UgY2lyY3Vtc3RhbmNlcy4KLQotQSBzZWNvbmQgcmVhc29uIHRoYXQgcmVsYXRpb25hbCBkYXRhYmFzZXMgZ2V0IGRlbm9ybWFsaXplZCBvbiBwdXJwb3NlIGlzCi1hIGJ1c2luZXNzIGRvY3VtZW50IHN0cnVjdHVyZSB0aGF0IHJlcXVpcmVzIHJldGVudGlvbi4gVGhhdCBpcywgeW91IGhhdmUKLWFuIGVuY2xvc2luZyB0YWJsZSB0aGF0IHJlZmVycyB0byBhIGxvdCBvZiBleHRlcm5hbCB0YWJsZXMgd2hvc2UgZGF0YQotY291bGQgY2hhbmdlIG92ZXIgdGltZSwgYnV0IHlvdSBuZWVkIHRvIHByZXNlcnZlIHRoZSBlbmNsb3NpbmcgZG9jdW1lbnQKLWFzIGEgc25hcHNob3QgaW4gaGlzdG9yeS4gVGhlIGNvbW1vbiBleGFtcGxlIGhlcmUgaXMgd2l0aCBpbnZvaWNlcy4gWW91Ci1hbHJlYWR5IGhhdmUgY3VzdG9tZXIgYW5kIHByb2R1Y3QgdGFibGVzLCBhbmQgeW914oCZZCB0aGluayB0aGF0IHlvdSBjb3VsZAotanVzdCBtYWtlIGFuIGludm9pY2UgdGhhdCByZWZlcnMgdG8gdGhvc2UgdGFibGVzLiBCdXQgdGhpcyBzaG91bGQgbmV2ZXIKLWJlIGRvbmUgaW4gcHJhY3RpY2UuIEN1c3RvbWVyIG9yIHByaWNlIGluZm9ybWF0aW9uIGNvdWxkIGNoYW5nZSwgYW5kCi10aGVuIHlvdSB3b3VsZCBsb3NlIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGludm9pY2UgZG9jdW1lbnQgYXMgaXQgd2FzIG9uCi10aGUgaW52b2ljZSBkYXRlLCB3aGljaCBjb3VsZCB2aW9sYXRlIGF1ZGl0cywgcmVwb3J0cywgb3IgbGF3cywgYW5kCi1jYXVzZSBvdGhlciBwcm9ibGVtcy4KLQotSW4gdGhlIHJlbGF0aW9uYWwgd29ybGQsIGRlbm9ybWFsaXphdGlvbiB2aW9sYXRlcyBDb2Rk4oCZcyBub3JtYWwgZm9ybXMsCi1hbmQgeW91IHRyeSB0byBhdm9pZCBpdC4gQnV0IGluIENhc3NhbmRyYSwgZGVub3JtYWxpemF0aW9uIGlzLCB3ZWxsLAotcGVyZmVjdGx5IG5vcm1hbC4gSXTigJlzIG5vdCByZXF1aXJlZCBpZiB5b3VyIGRhdGEgbW9kZWwgaXMgc2ltcGxlLiBCdXQKLWRvbuKAmXQgYmUgYWZyYWlkIG9mIGl0LgotCi1IaXN0b3JpY2FsbHksIGRlbm9ybWFsaXphdGlvbiBpbiBDYXNzYW5kcmEgaGFzIHJlcXVpcmVkIGRlc2lnbmluZyBhbmQKLW1hbmFnaW5nIG11bHRpcGxlIHRhYmxlcyB1c2luZyB0ZWNobmlxdWVzIGRlc2NyaWJlZCBpbiB0aGlzCi1kb2N1bWVudGF0aW9uLiBCZWdpbm5pbmcgd2l0aCB0aGUgMy4wIHJlbGVhc2UsIENhc3NhbmRyYSBwcm92aWRlcyBhCi1mZWF0dXJlIGtub3duIGFzIGBtYXRlcmlhbGl6ZWQgdmlld3MgPG1hdGVyaWFsaXplZC12aWV3cz5gIHdoaWNoIGFsbG93cwoteW91IHRvIGNyZWF0ZSBtdWx0aXBsZSBkZW5vcm1hbGl6ZWQgdmlld3Mgb2YgZGF0YSBiYXNlZCBvbiBhIGJhc2UgdGFibGUKLWRlc2lnbi4gQ2Fzc2FuZHJhIG1hbmFnZXMgbWF0ZXJpYWxpemVkIHZpZXdzIG9uIHRoZSBzZXJ2ZXIsIGluY2x1ZGluZwotdGhlIHdvcmsgb2Yga2VlcGluZyB0aGUgdmlld3MgaW4gc3luYyB3aXRoIHRoZSB0YWJsZS4KLQotPT09IFF1ZXJ5LWZpcnN0IGRlc2lnbgotCi1SZWxhdGlvbmFsIG1vZGVsaW5nLCBpbiBzaW1wbGUgdGVybXMsIG1lYW5zIHRoYXQgeW91IHN0YXJ0IGZyb20gdGhlCi1jb25jZXB0dWFsIGRvbWFpbiBhbmQgdGhlbiByZXByZXNlbnQgdGhlIG5vdW5zIGluIHRoZSBkb21haW4gaW4gdGFibGVzLgotWW91IHRoZW4gYXNzaWduIHByaW1hcnkga2V5cyBhbmQgZm9yZWlnbiBrZXlzIHRvIG1vZGVsIHJlbGF0aW9uc2hpcHMuCi1XaGVuIHlvdSBoYXZlIGEgbWFueS10by1tYW55IHJlbGF0aW9uc2hpcCwgeW91IGNyZWF0ZSB0aGUgam9pbiB0YWJsZXMKLXRoYXQgcmVwcmVzZW50IGp1c3QgdGhvc2Uga2V5cy4gVGhlIGpvaW4gdGFibGVzIGRvbuKAmXQgZXhpc3QgaW4gdGhlIHJlYWwKLXdvcmxkLCBhbmQgYXJlIGEgbmVjZXNzYXJ5IHNpZGUgZWZmZWN0IG9mIHRoZSB3YXkgcmVsYXRpb25hbCBtb2RlbHMKLXdvcmsuIEFmdGVyIHlvdSBoYXZlIGFsbCB5b3VyIHRhYmxlcyBsYWlkIG91dCwgeW91IGNhbiBzdGFydCB3cml0aW5nCi1xdWVyaWVzIHRoYXQgcHVsbCB0b2dldGhlciBkaXNwYXJhdGUgZGF0YSB1c2luZyB0aGUgcmVsYXRpb25zaGlwcwotZGVmaW5lZCBieSB0aGUga2V5cy4gVGhlIHF1ZXJpZXMgaW4gdGhlIHJlbGF0aW9uYWwgd29ybGQgYXJlIHZlcnkgbXVjaAotc2Vjb25kYXJ5LiBJdCBpcyBhc3N1bWVkIHRoYXQgeW91IGNhbiBhbHdheXMgZ2V0IHRoZSBkYXRhIHlvdSB3YW50IGFzCi1sb25nIGFzIHlvdSBoYXZlIHlvdXIgdGFibGVzIG1vZGVsZWQgcHJvcGVybHkuIEV2ZW4gaWYgeW91IGhhdmUgdG8gdXNlCi1zZXZlcmFsIGNvbXBsZXggc3VicXVlcmllcyBvciBqb2luIHN0YXRlbWVudHMsIHRoaXMgaXMgdXN1YWxseSB0cnVlLgotCi1CeSBjb250cmFzdCwgaW4gQ2Fzc2FuZHJhIHlvdSBkb27igJl0IHN0YXJ0IHdpdGggdGhlIGRhdGEgbW9kZWw7IHlvdSBzdGFydAotd2l0aCB0aGUgcXVlcnkgbW9kZWwuIEluc3RlYWQgb2YgbW9kZWxpbmcgdGhlIGRhdGEgZmlyc3QgYW5kIHRoZW4KLXdyaXRpbmcgcXVlcmllcywgd2l0aCBDYXNzYW5kcmEgeW91IG1vZGVsIHRoZSBxdWVyaWVzIGFuZCBsZXQgdGhlIGRhdGEKLWJlIG9yZ2FuaXplZCBhcm91bmQgdGhlbS4gVGhpbmsgb2YgdGhlIG1vc3QgY29tbW9uIHF1ZXJ5IHBhdGhzIHlvdXIKLWFwcGxpY2F0aW9uIHdpbGwgdXNlLCBhbmQgdGhlbiBjcmVhdGUgdGhlIHRhYmxlcyB0aGF0IHlvdSBuZWVkIHRvCi1zdXBwb3J0IHRoZW0uCi0KLURldHJhY3RvcnMgaGF2ZSBzdWdnZXN0ZWQgdGhhdCBkZXNpZ25pbmcgdGhlIHF1ZXJpZXMgZmlyc3QgaXMgb3Zlcmx5Ci1jb25zdHJhaW5pbmcgb24gYXBwbGljYXRpb24gZGVzaWduLCBub3QgdG8gbWVudGlvbiBkYXRhYmFzZSBtb2RlbGluZy4KLUJ1dCBpdCBpcyBwZXJmZWN0bHkgcmVhc29uYWJsZSB0byBleHBlY3QgdGhhdCB5b3Ugc2hvdWxkIHRoaW5rIGhhcmQKLWFib3V0IHRoZSBxdWVyaWVzIGluIHlvdXIgYXBwbGljYXRpb24sIGp1c3QgYXMgeW91IHdvdWxkLCBwcmVzdW1hYmx5LAotdGhpbmsgaGFyZCBhYm91dCB5b3VyIHJlbGF0aW9uYWwgZG9tYWluLiBZb3UgbWF5IGdldCBpdCB3cm9uZywgYW5kIHRoZW4KLXlvdeKAmWxsIGhhdmUgcHJvYmxlbXMgaW4gZWl0aGVyIHdvcmxkLiBPciB5b3VyIHF1ZXJ5IG5lZWRzIG1pZ2h0IGNoYW5nZQotb3ZlciB0aW1lLCBhbmQgdGhlbiB5b3XigJlsbCBoYXZlIHRvIHdvcmsgdG8gdXBkYXRlIHlvdXIgZGF0YSBzZXQuIEJ1dAotdGhpcyBpcyBubyBkaWZmZXJlbnQgZnJvbSBkZWZpbmluZyB0aGUgd3JvbmcgdGFibGVzLCBvciBuZWVkaW5nCi1hZGRpdGlvbmFsIHRhYmxlcywgaW4gYW4gUkRCTVMuCi0KLT09PSBEZXNpZ25pbmcgZm9yIG9wdGltYWwgc3RvcmFnZQotCi1JbiBhIHJlbGF0aW9uYWwgZGF0YWJhc2UsIGl0IGlzIGZyZXF1ZW50bHkgdHJhbnNwYXJlbnQgdG8gdGhlIHVzZXIgaG93Ci10YWJsZXMgYXJlIHN0b3JlZCBvbiBkaXNrLCBhbmQgaXQgaXMgcmFyZSB0byBoZWFyIG9mIHJlY29tbWVuZGF0aW9ucwotYWJvdXQgZGF0YSBtb2RlbGluZyBiYXNlZCBvbiBob3cgdGhlIFJEQk1TIG1pZ2h0IHN0b3JlIHRhYmxlcyBvbiBkaXNrLgotSG93ZXZlciwgdGhhdCBpcyBhbiBpbXBvcnRhbnQgY29uc2lkZXJhdGlvbiBpbiBDYXNzYW5kcmEuIEJlY2F1c2UKLUNhc3NhbmRyYSB0YWJsZXMgYXJlIGVhY2ggc3RvcmVkIGluIHNlcGFyYXRlIGZpbGVzIG9uIGRpc2ssIGl04oCZcwotaW1wb3J0YW50IHRvIGtlZXAgcmVsYXRlZCBjb2x1bW5zIGRlZmluZWQgdG9nZXRoZXIgaW4gdGhlIHNhbWUgdGFibGUuCi0KLUEga2V5IGdvYWwgdGhhdCB5b3Ugd2lsbCBzZWUgYXMgeW91IGJlZ2luIGNyZWF0aW5nIGRhdGEgbW9kZWxzIGluCi1DYXNzYW5kcmEgaXMgdG8gbWluaW1pemUgdGhlIG51bWJlciBvZiBwYXJ0aXRpb25zIHRoYXQgbXVzdCBiZSBzZWFyY2hlZAotaW4gb3JkZXIgdG8gc2F0aXNmeSBhIGdpdmVuIHF1ZXJ5LiBCZWNhdXNlIHRoZSBwYXJ0aXRpb24gaXMgYSB1bml0IG9mCi1zdG9yYWdlIHRoYXQgZG9lcyBub3QgZ2V0IGRpdmlkZWQgYWNyb3NzIG5vZGVzLCBhIHF1ZXJ5IHRoYXQgc2VhcmNoZXMgYQotc2luZ2xlIHBhcnRpdGlvbiB3aWxsIHR5cGljYWxseSB5aWVsZCB0aGUgYmVzdCBwZXJmb3JtYW5jZS4KLQotPT09IFNvcnRpbmcgaXMgYSBkZXNpZ24gZGVjaXNpb24KLQotSW4gYW4gUkRCTVMsIHlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgb3JkZXIgaW4gd2hpY2ggcmVjb3JkcyBhcmUKLXJldHVybmVkIHRvIHlvdSBieSB1c2luZyBgT1JERVIgQllgIGluIHlvdXIgcXVlcnkuIFRoZSBkZWZhdWx0IHNvcnQKLW9yZGVyIGlzIG5vdCBjb25maWd1cmFibGU7IGJ5IGRlZmF1bHQsIHJlY29yZHMgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlcgotaW4gd2hpY2ggdGhleSBhcmUgd3JpdHRlbi4gSWYgeW91IHdhbnQgdG8gY2hhbmdlIHRoZSBvcmRlciwgeW91IGp1c3QKLW1vZGlmeSB5b3VyIHF1ZXJ5LCBhbmQgeW91IGNhbiBzb3J0IGJ5IGFueSBsaXN0IG9mIGNvbHVtbnMuCi0KLUluIENhc3NhbmRyYSwgaG93ZXZlciwgc29ydGluZyBpcyB0cmVhdGVkIGRpZmZlcmVudGx5OyBpdCBpcyBhIGRlc2lnbgotZGVjaXNpb24uIFRoZSBzb3J0IG9yZGVyIGF2YWlsYWJsZSBvbiBxdWVyaWVzIGlzIGZpeGVkLCBhbmQgaXMKLWRldGVybWluZWQgZW50aXJlbHkgYnkgdGhlIHNlbGVjdGlvbiBvZiBjbHVzdGVyaW5nIGNvbHVtbnMgeW91IHN1cHBseSBpbgotdGhlIGBDUkVBVEUgVEFCTEVgIGNvbW1hbmQuIFRoZSBDUUwgYFNFTEVDVGAgc3RhdGVtZW50IGRvZXMgc3VwcG9ydAotYE9SREVSIEJZYCBzZW1hbnRpY3MsIGJ1dCBvbmx5IGluIHRoZSBvcmRlciBzcGVjaWZpZWQgYnkgdGhlIGNsdXN0ZXJpbmcKLWNvbHVtbnMuCi0KLV9NYXRlcmlhbCBhZGFwdGVkIGZyb20gQ2Fzc2FuZHJhLCBUaGUgRGVmaW5pdGl2ZSBHdWlkZS4gUHVibGlzaGVkIGJ5Ci1PJ1JlaWxseSBNZWRpYSwgSW5jLiBDb3B5cmlnaHQgwqkgMjAyMCBKZWZmIENhcnBlbnRlciwgRWJlbiBIZXdpdHQuIEFsbAotcmlnaHRzIHJlc2VydmVkLiBVc2VkIHdpdGggcGVybWlzc2lvbi5fCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX3JlZmluaW5nLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX3JlZmluaW5nLmFkb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NWE4MGMuLjAwMDAwMDAKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19yZWZpbmluZy5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLT0gRXZhbHVhdGluZyBhbmQgUmVmaW5pbmcgRGF0YSBNb2RlbHMKLTpzdGVtOiBsYXRleG1hdGgKLQotT25jZSB5b3XigJl2ZSBjcmVhdGVkIGEgcGh5c2ljYWwgbW9kZWwsIHRoZXJlIGFyZSBzb21lIHN0ZXBzIHlvdeKAmWxsIHdhbnQKLXRvIHRha2UgdG8gZXZhbHVhdGUgYW5kIHJlZmluZSB0YWJsZSBkZXNpZ25zIHRvIGhlbHAgZW5zdXJlIG9wdGltYWwKLXBlcmZvcm1hbmNlLgotCi09PSBDYWxjdWxhdGluZyBQYXJ0aXRpb24gU2l6ZQotCi1UaGUgZmlyc3QgdGhpbmcgdGhhdCB5b3Ugd2FudCB0byBsb29rIGZvciBpcyB3aGV0aGVyIHlvdXIgdGFibGVzIHdpbGwKLWhhdmUgcGFydGl0aW9ucyB0aGF0IHdpbGwgYmUgb3Zlcmx5IGxhcmdlLCBvciB0byBwdXQgaXQgYW5vdGhlciB3YXksIHRvbwotd2lkZS4gUGFydGl0aW9uIHNpemUgaXMgbWVhc3VyZWQgYnkgdGhlIG51bWJlciBvZiBjZWxscyAodmFsdWVzKSB0aGF0Ci1hcmUgc3RvcmVkIGluIHRoZSBwYXJ0aXRpb24uIENhc3NhbmRyYeKAmXMgaGFyZCBsaW1pdCBpcyAyIGJpbGxpb24gY2VsbHMKLXBlciBwYXJ0aXRpb24sIGJ1dCB5b3XigJlsbCBsaWtlbHkgcnVuIGludG8gcGVyZm9ybWFuY2UgaXNzdWVzIGJlZm9yZQotcmVhY2hpbmcgdGhhdCBsaW1pdC4KLQotSW4gb3JkZXIgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIHBhcnRpdGlvbnMsIHVzZSB0aGUgZm9sbG93aW5nIGZvcm11bGE6Ci0KLVtsYXRleG1hdGhdCi0rKysrCi1cW05fdiA9IE5fciAoTl9jIC0gTl97cGt9IC0gTl9zKSArIE5fc1xdCi0rKysrCi0KLVRoZSBudW1iZXIgb2YgdmFsdWVzIChvciBjZWxscykgaW4gdGhlIHBhcnRpdGlvbiAoTn52fikgaXMgZXF1YWwgdG8gdGhlCi1udW1iZXIgb2Ygc3RhdGljIGNvbHVtbnMgKE5+c34pIHBsdXMgdGhlIHByb2R1Y3Qgb2YgdGhlIG51bWJlciBvZiByb3dzCi0oTn5yfikgYW5kIHRoZSBudW1iZXIgb2Ygb2YgdmFsdWVzIHBlciByb3cuIFRoZSBudW1iZXIgb2YgdmFsdWVzIHBlciByb3cKLWlzIGRlZmluZWQgYXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIChOfmN+KSBtaW51cyB0aGUgbnVtYmVyIG9mIHByaW1hcnkKLWtleSBjb2x1bW5zIChOfnBrfikgYW5kIHN0YXRpYyBjb2x1bW5zIChOfnN+KS4KLQotVGhlIG51bWJlciBvZiBjb2x1bW5zIHRlbmRzIHRvIGJlIHJlbGF0aXZlbHkgc3RhdGljLCBhbHRob3VnaCBpdCBpcwotcG9zc2libGUgdG8gYWx0ZXIgdGFibGVzIGF0IHJ1bnRpbWUuIEZvciB0aGlzIHJlYXNvbiwgYSBwcmltYXJ5IGRyaXZlcgotb2YgcGFydGl0aW9uIHNpemUgaXMgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBwYXJ0aXRpb24uIFRoaXMgaXMgYSBrZXkKLWZhY3RvciB0aGF0IHlvdSBtdXN0IGNvbnNpZGVyIGluIGRldGVybWluaW5nIHdoZXRoZXIgYSBwYXJ0aXRpb24gaGFzIHRoZQotcG90ZW50aWFsIHRvIGdldCB0b28gbGFyZ2UuIFR3byBiaWxsaW9uIHZhbHVlcyBzb3VuZHMgbGlrZSBhIGxvdCwgYnV0IGluCi1hIHNlbnNvciBzeXN0ZW0gd2hlcmUgdGVucyBvciBodW5kcmVkcyBvZiB2YWx1ZXMgYXJlIG1lYXN1cmVkIGV2ZXJ5Ci1taWxsaXNlY29uZCwgdGhlIG51bWJlciBvZiB2YWx1ZXMgc3RhcnRzIHRvIGFkZCB1cCBwcmV0dHkgZmFzdC4KLQotTGV04oCZcyB0YWtlIGEgbG9vayBhdCBvbmUgb2YgdGhlIHRhYmxlcyB0byBhbmFseXplIHRoZSBwYXJ0aXRpb24gc2l6ZS4KLUJlY2F1c2UgaXQgaGFzIGEgd2lkZSBwYXJ0aXRpb24gZGVzaWduIHdpdGggb25lIHBhcnRpdGlvbiBwZXIgaG90ZWwsCi1sb29rIGF0IHRoZSBgYXZhaWxhYmxlX3Jvb21zX2J5X2hvdGVsX2RhdGVgIHRhYmxlLiBUaGUgdGFibGUgaGFzIGZvdXIKLWNvbHVtbnMgdG90YWwgKE5+Y34gPSA0KSwgaW5jbHVkaW5nIHRocmVlIHByaW1hcnkga2V5IGNvbHVtbnMgKE5+cGt+ID0KLTMpIGFuZCBubyBzdGF0aWMgY29sdW1ucyAoTn5zfiA9IDApLiBQbHVnZ2luZyB0aGVzZSB2YWx1ZXMgaW50byB0aGUKLWZvcm11bGEsIHRoZSByZXN1bHQgaXM6Ci0KLVtsYXRleG1hdGhdCi0rKysrCi1cW05fdiA9IE5fciAoNCAtIDMgLSAwKSArIDAgPSAxTl9yXF0KLSsrKysKLQotVGhlcmVmb3JlIHRoZSBudW1iZXIgb2YgdmFsdWVzIGZvciB0aGlzIHRhYmxlIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YKLXJvd3MuIFlvdSBzdGlsbCBuZWVkIHRvIGRldGVybWluZSBhIG51bWJlciBvZiByb3dzLiBUbyBkbyB0aGlzLCBtYWtlCi1lc3RpbWF0ZXMgYmFzZWQgb24gdGhlIGFwcGxpY2F0aW9uIGRlc2lnbi4gVGhlIHRhYmxlIGlzIHN0b3JpbmcgYSByZWNvcmQKLWZvciBlYWNoIHJvb20sIGluIGVhY2ggb2YgaG90ZWwsIGZvciBldmVyeSBuaWdodC4gTGV0J3MgYXNzdW1lIHRoZQotc3lzdGVtIHdpbGwgYmUgdXNlZCB0byBzdG9yZSB0d28geWVhcnMgb2YgaW52ZW50b3J5IGF0IGEgdGltZSwgYW5kIHRoZXJlCi1hcmUgNSwwMDAgaG90ZWxzIGluIHRoZSBzeXN0ZW0sIHdpdGggYW4gYXZlcmFnZSBvZiAxMDAgcm9vbXMgaW4gZWFjaAotaG90ZWwuCi0KLVNpbmNlIHRoZXJlIGlzIGEgcGFydGl0aW9uIGZvciBlYWNoIGhvdGVsLCB0aGUgZXN0aW1hdGVkIG51bWJlciBvZiByb3dzCi1wZXIgcGFydGl0aW9uIGlzIGFzIGZvbGxvd3M6Ci0KLVtsYXRleG1hdGhdCi0rKysrCi1cW05fciA9IDEwMCByb29tcy9ob3RlbCBcdGltZXMgNzMwIGRheXMgPSA3MywwMDAgcm93c1xdCi0rKysrCi0KLVRoaXMgcmVsYXRpdmVseSBzbWFsbCBudW1iZXIgb2Ygcm93cyBwZXIgcGFydGl0aW9uIGlzIG5vdCBnb2luZyB0byBnZXQKLXlvdSBpbiB0b28gbXVjaCB0cm91YmxlLCBidXQgaWYgeW91IHN0YXJ0IHN0b3JpbmcgbW9yZSBkYXRlcyBvZgotaW52ZW50b3J5LCBvciBkb27igJl0IG1hbmFnZSB0aGUgc2l6ZSBvZiB0aGUgaW52ZW50b3J5IHdlbGwgdXNpbmcgVFRMLCB5b3UKLWNvdWxkIHN0YXJ0IGhhdmluZyBpc3N1ZXMuIFlvdSBzdGlsbCBtaWdodCB3YW50IHRvIGxvb2sgYXQgYnJlYWtpbmcgdXAKLXRoaXMgbGFyZ2UgcGFydGl0aW9uLCB3aGljaCB5b3UnbGwgc2VlIGhvdyB0byBkbyBzaG9ydGx5LgotCi1XaGVuIHBlcmZvcm1pbmcgc2l6aW5nIGNhbGN1bGF0aW9ucywgaXQgaXMgdGVtcHRpbmcgdG8gYXNzdW1lIHRoZQotbm9taW5hbCBvciBhdmVyYWdlIGNhc2UgZm9yIHZhcmlhYmxlcyBzdWNoIGFzIHRoZSBudW1iZXIgb2Ygcm93cy4KLUNvbnNpZGVyIGNhbGN1bGF0aW5nIHRoZSB3b3JzdCBjYXNlIGFzIHdlbGwsIGFzIHRoZXNlIHNvcnRzIG9mCi1wcmVkaWN0aW9ucyBoYXZlIGEgd2F5IG9mIGNvbWluZyB0cnVlIGluIHN1Y2Nlc3NmdWwgc3lzdGVtcy4KLQotPT0gQ2FsY3VsYXRpbmcgU2l6ZSBvbiBEaXNrCi0KLUluIGFkZGl0aW9uIHRvIGNhbGN1bGF0aW5nIHRoZSBzaXplIG9mIGEgcGFydGl0aW9uLCBpdCBpcyBhbHNvIGFuCi1leGNlbGxlbnQgaWRlYSB0byBlc3RpbWF0ZSB0aGUgYW1vdW50IG9mIGRpc2sgc3BhY2UgdGhhdCB3aWxsIGJlCi1yZXF1aXJlZCBmb3IgZWFjaCB0YWJsZSB5b3UgcGxhbiB0byBzdG9yZSBpbiB0aGUgY2x1c3Rlci4gSW4gb3JkZXIgdG8KLWRldGVybWluZSB0aGUgc2l6ZSwgdXNlIHRoZSBmb2xsb3dpbmcgZm9ybXVsYSB0byBkZXRlcm1pbmUgdGhlIHNpemUgU350fgotb2YgYSBwYXJ0aXRpb246Ci0KLVtsYXRleG1hdGhdCi0rKysrCi1cW1NfdCA9IFxkaXNwbGF5c3R5bGVcc3VtX2kgc2l6ZU9mXGJpZyAoY197a19pfVxiaWcpICsgXGRpc3BsYXlzdHlsZVxzdW1faiBzaXplT2ZcYmlnKGNfe3Nfan1cYmlnKSArIE5fclx0aW1lcyBcYmlnZyhcZGlzcGxheXN0eWxlXHN1bV9rIHNpemVPZlxiaWcoY197cl9rfVxiaWcpICsgXGRpc3BsYXlzdHlsZVxzdW1fbCBzaXplT2ZcYmlnKGNfe2NfbH1cYmlnKVxiaWdnKSArXF0KLSsrKysKLQotW2xhdGV4bWF0aF0KLSsrKysKLVxbTl92XHRpbWVzIHNpemVPZlxiaWcodF97YXZnfVxiaWcpXF0KLSsrKysKLQotVGhpcyBpcyBhIGJpdCBtb3JlIGNvbXBsZXggdGhhbiB0aGUgcHJldmlvdXMgZm9ybXVsYSwgYnV0IGxldCdzIGJyZWFrIGl0Ci1kb3duIGEgYml0IGF0IGEgdGltZS4gTGV04oCZcyB0YWtlIGEgbG9vayBhdCB0aGUgbm90YXRpb24gZmlyc3Q6Ci0KLSogSW4gdGhpcyBmb3JtdWxhLCBjfmt+IHJlZmVycyB0byBwYXJ0aXRpb24ga2V5IGNvbHVtbnMsIGN+c34gdG8gc3RhdGljCi1jb2x1bW5zLCBjfnJ+IHRvIHJlZ3VsYXIgY29sdW1ucywgYW5kIGN+Y34gdG8gY2x1c3RlcmluZyBjb2x1bW5zLgotKiBUaGUgdGVybSB0fmF2Z34gcmVmZXJzIHRvIHRoZSBhdmVyYWdlIG51bWJlciBvZiBieXRlcyBvZiBtZXRhZGF0YQotc3RvcmVkIHBlciBjZWxsLCBzdWNoIGFzIHRpbWVzdGFtcHMuIEl0IGlzIHR5cGljYWwgdG8gdXNlIGFuIGVzdGltYXRlIG9mCi04IGJ5dGVzIGZvciB0aGlzIHZhbHVlLgotKiBZb3UnbGwgcmVjb2duaXplIHRoZSBudW1iZXIgb2Ygcm93cyBOfnJ+IGFuZCBudW1iZXIgb2YgdmFsdWVzIE5+dn4KLWZyb20gcHJldmlvdXMgY2FsY3VsYXRpb25zLgotKiBUaGUgKnNpemVPZigpKiBmdW5jdGlvbiByZWZlcnMgdG8gdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIENRTCBkYXRhCi10eXBlIG9mIGVhY2ggcmVmZXJlbmNlZCBjb2x1bW4uCi0KLVRoZSBmaXJzdCB0ZXJtIGFza3MgeW91IHRvIHN1bSB0aGUgc2l6ZSBvZiB0aGUgcGFydGl0aW9uIGtleSBjb2x1bW5zLgotRm9yIHRoaXMgZXhhbXBsZSwgdGhlIGBhdmFpbGFibGVfcm9vbXNfYnlfaG90ZWxfZGF0ZWAgdGFibGUgaGFzIGEgc2luZ2xlCi1wYXJ0aXRpb24ga2V5IGNvbHVtbiwgdGhlIGBob3RlbF9pZGAsIHdoaWNoIGlzIG9mIHR5cGUgYHRleHRgLiBBc3N1bWluZwotdGhhdCBob3RlbCBpZGVudGlmaWVycyBhcmUgc2ltcGxlIDUtY2hhcmFjdGVyIGNvZGVzLCB5b3UgaGF2ZSBhIDUtYnl0ZQotdmFsdWUsIHNvIHRoZSBzdW0gb2YgdGhlIHBhcnRpdGlvbiBrZXkgY29sdW1uIHNpemVzIGlzIDUgYnl0ZXMuCi0KLVRoZSBzZWNvbmQgdGVybSBhc2tzIHlvdSB0byBzdW0gdGhlIHNpemUgb2YgdGhlIHN0YXRpYyBjb2x1bW5zLiBUaGlzCi10YWJsZSBoYXMgbm8gc3RhdGljIGNvbHVtbnMsIHNvIHRoZSBzaXplIGlzIDAgYnl0ZXMuCi0KLVRoZSB0aGlyZCB0ZXJtIGlzIHRoZSBtb3N0IGludm9sdmVkLCBhbmQgZm9yIGdvb2QgcmVhc29u4oCUaXQgaXMKLWNhbGN1bGF0aW5nIHRoZSBzaXplIG9mIHRoZSBjZWxscyBpbiB0aGUgcGFydGl0aW9uLiBTdW0gdGhlIHNpemUgb2YgdGhlCi1jbHVzdGVyaW5nIGNvbHVtbnMgYW5kIHJlZ3VsYXIgY29sdW1ucy4gVGhlIHR3byBjbHVzdGVyaW5nIGNvbHVtbnMgYXJlCi10aGUgYGRhdGVgLCB3aGljaCBpcyA0IGJ5dGVzLCBhbmQgdGhlIGByb29tX251bWJlcmAsIHdoaWNoIGlzIGEgMi1ieXRlCi1zaG9ydCBpbnRlZ2VyLCBnaXZpbmcgYSBzdW0gb2YgNiBieXRlcy4gVGhlcmUgaXMgb25seSBhIHNpbmdsZSByZWd1bGFyCi1jb2x1bW4sIHRoZSBib29sZWFuIGBpc19hdmFpbGFibGVgLCB3aGljaCBpcyAxIGJ5dGUgaW4gc2l6ZS4gU3VtbWluZyB0aGUKLXJlZ3VsYXIgY29sdW1uIHNpemUgKDEgYnl0ZSkgcGx1cyB0aGUgY2x1c3RlcmluZyBjb2x1bW4gc2l6ZSAoNiBieXRlcykKLWdpdmVzIGEgdG90YWwgb2YgNyBieXRlcy4gVG8gZmluaXNoIHVwIHRoZSB0ZXJtLCBtdWx0aXBseSB0aGlzIHZhbHVlIGJ5Ci10aGUgbnVtYmVyIG9mIHJvd3MgKDczLDAwMCksIGdpdmluZyBhIHJlc3VsdCBvZiA1MTEsMDAwIGJ5dGVzICgwLjUxIE1CKS4KLQotVGhlIGZvdXJ0aCB0ZXJtIGlzIHNpbXBseSBjb3VudGluZyB0aGUgbWV0YWRhdGEgdGhhdCB0aGF0IENhc3NhbmRyYQotc3RvcmVzIGZvciBlYWNoIGNlbGwuIEluIHRoZSBzdG9yYWdlIGZvcm1hdCB1c2VkIGJ5IENhc3NhbmRyYSAzLjAgYW5kCi1sYXRlciwgdGhlIGFtb3VudCBvZiBtZXRhZGF0YSBmb3IgYSBnaXZlbiBjZWxsIHZhcmllcyBiYXNlZCBvbiB0aGUgdHlwZQotb2YgZGF0YSBiZWluZyBzdG9yZWQsIGFuZCB3aGV0aGVyIG9yIG5vdCBjdXN0b20gdGltZXN0YW1wIG9yIFRUTCB2YWx1ZXMKLWFyZSBzcGVjaWZpZWQgZm9yIGluZGl2aWR1YWwgY2VsbHMuIEZvciB0aGlzIHRhYmxlLCByZXVzZSB0aGUgbnVtYmVyIG9mCi12YWx1ZXMgZnJvbSB0aGUgcHJldmlvdXMgY2FsY3VsYXRpb24gKDczLDAwMCkgYW5kIG11bHRpcGx5IGJ5IDgsIHdoaWNoCi1naXZlcyAwLjU4IE1CLgotCi1BZGRpbmcgdGhlc2UgdGVybXMgdG9nZXRoZXIsIHlvdSBnZXQgYSBmaW5hbCBlc3RpbWF0ZToKLQotW2xhdGV4bWF0aF0KLSsrKysKLVxbUGFydGl0aW9uIHNpemUgPSAxNiBieXRlcyArIDAgYnl0ZXMgKyAwLjUxIE1CICsgMC41OCBNQiA9IDEuMSBNQlxdCi0rKysrCi0KLVRoaXMgZm9ybXVsYSBpcyBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZSBhY3R1YWwgc2l6ZSBvZiBhIHBhcnRpdGlvbiBvbgotZGlzaywgYnV0IGlzIGFjY3VyYXRlIGVub3VnaCB0byBiZSBxdWl0ZSB1c2VmdWwuIFJlbWVtYmVyaW5nIHRoYXQgdGhlCi1wYXJ0aXRpb24gbXVzdCBiZSBhYmxlIHRvIGZpdCBvbiBhIHNpbmdsZSBub2RlLCBpdCBsb29rcyBsaWtlIHRoZSB0YWJsZQotZGVzaWduIHdpbGwgbm90IHB1dCBhIGxvdCBvZiBzdHJhaW4gb24gZGlzayBzdG9yYWdlLgotCi1DYXNzYW5kcmHigJlzIHN0b3JhZ2UgZW5naW5lIHdhcyByZS1pbXBsZW1lbnRlZCBmb3IgdGhlIDMuMCByZWxlYXNlLAotaW5jbHVkaW5nIGEgbmV3IGZvcm1hdCBmb3IgU1NUYWJsZSBmaWxlcy4gVGhlIHByZXZpb3VzIGZvcm1hdCBzdG9yZWQgYQotc2VwYXJhdGUgY29weSBvZiB0aGUgY2x1c3RlcmluZyBjb2x1bW5zIGFzIHBhcnQgb2YgdGhlIHJlY29yZCBmb3IgZWFjaAotY2VsbC4gVGhlIG5ld2VyIGZvcm1hdCBlbGltaW5hdGVzIHRoaXMgZHVwbGljYXRpb24sIHdoaWNoIHJlZHVjZXMgdGhlCi1zaXplIG9mIHN0b3JlZCBkYXRhIGFuZCBzaW1wbGlmaWVzIHRoZSBmb3JtdWxhIGZvciBjb21wdXRpbmcgdGhhdCBzaXplLgotCi1LZWVwIGluIG1pbmQgYWxzbyB0aGF0IHRoaXMgZXN0aW1hdGUgb25seSBjb3VudHMgYSBzaW5nbGUgcmVwbGljYSBvZgotZGF0YS4gWW91IHdpbGwgbmVlZCB0byBtdWx0aXBseSB0aGUgdmFsdWUgb2J0YWluZWQgaGVyZSBieSB0aGUgbnVtYmVyIG9mCi1wYXJ0aXRpb25zIGFuZCB0aGUgbnVtYmVyIG9mIHJlcGxpY2FzIHNwZWNpZmllZCBieSB0aGUga2V5c3BhY2XigJlzCi1yZXBsaWNhdGlvbiBzdHJhdGVneSBpbiBvcmRlciB0byBkZXRlcm1pbmUgdGhlIHRvdGFsIHJlcXVpcmVkIHRvdGFsCi1jYXBhY2l0eSBmb3IgZWFjaCB0YWJsZS4gVGhpcyB3aWxsIGNvbWUgaW4gaGFuZHkgd2hlbiB5b3UgcGxhbiB5b3VyCi1jbHVzdGVyLgotCi09PSBCcmVha2luZyBVcCBMYXJnZSBQYXJ0aXRpb25zCi0KLUFzIGRpc2N1c3NlZCBwcmV2aW91c2x5LCB0aGUgZ29hbCBpcyB0byBkZXNpZ24gdGFibGVzIHRoYXQgY2FuIHByb3ZpZGUKLXRoZSBkYXRhIHlvdSBuZWVkIHdpdGggcXVlcmllcyB0aGF0IHRvdWNoIGEgc2luZ2xlIHBhcnRpdGlvbiwgb3IgZmFpbGluZwotdGhhdCwgdGhlIG1pbmltdW0gcG9zc2libGUgbnVtYmVyIG9mIHBhcnRpdGlvbnMuIEhvd2V2ZXIsIGFzIHNob3duIGluCi10aGUgZXhhbXBsZXMsIGl0IGlzIHF1aXRlIHBvc3NpYmxlIHRvIGRlc2lnbiB3aWRlIHBhcnRpdGlvbi1zdHlsZSB0YWJsZXMKLXRoYXQgYXBwcm9hY2ggQ2Fzc2FuZHJh4oCZcyBidWlsdC1pbiBsaW1pdHMuIFBlcmZvcm1pbmcgc2l6aW5nIGFuYWx5c2lzIG9uCi10YWJsZXMgbWF5IHJldmVhbCBwYXJ0aXRpb25zIHRoYXQgYXJlIHBvdGVudGlhbGx5IHRvbyBsYXJnZSwgZWl0aGVyIGluCi1udW1iZXIgb2YgdmFsdWVzLCBzaXplIG9uIGRpc2ssIG9yIGJvdGguCi0KLVRoZSB0ZWNobmlxdWUgZm9yIHNwbGl0dGluZyBhIGxhcmdlIHBhcnRpdGlvbiBpcyBzdHJhaWdodGZvcndhcmQ6IGFkZCBhbgotYWRkaXRpb25hbCBjb2x1bW4gdG8gdGhlIHBhcnRpdGlvbiBrZXkuIEluIG1vc3QgY2FzZXMsIG1vdmluZyBvbmUgb2YgdGhlCi1leGlzdGluZyBjb2x1bW5zIGludG8gdGhlIHBhcnRpdGlvbiBrZXkgd2lsbCBiZSBzdWZmaWNpZW50LiBBbm90aGVyCi1vcHRpb24gaXMgdG8gaW50cm9kdWNlIGFuIGFkZGl0aW9uYWwgY29sdW1uIHRvIHRoZSB0YWJsZSB0byBhY3QgYXMgYQotc2hhcmRpbmcga2V5LCBidXQgdGhpcyByZXF1aXJlcyBhZGRpdGlvbmFsIGFwcGxpY2F0aW9uIGxvZ2ljLgotCi1Db250aW51aW5nIHRvIGV4YW1pbmUgdGhlIGF2YWlsYWJsZSByb29tcyBleGFtcGxlLCBpZiB5b3UgYWRkIHRoZSBgZGF0ZWAKLWNvbHVtbiB0byB0aGUgcGFydGl0aW9uIGtleSBmb3IgdGhlIGBhdmFpbGFibGVfcm9vbXNfYnlfaG90ZWxfZGF0ZWAKLXRhYmxlLCBlYWNoIHBhcnRpdGlvbiB3b3VsZCB0aGVuIHJlcHJlc2VudCB0aGUgYXZhaWxhYmlsaXR5IG9mIHJvb21zIGF0Ci1hIHNwZWNpZmljIGhvdGVsIG9uIGEgc3BlY2lmaWMgZGF0ZS4gVGhpcyB3aWxsIGNlcnRhaW5seSB5aWVsZAotcGFydGl0aW9ucyB0aGF0IGFyZSBzaWduaWZpY2FudGx5IHNtYWxsZXIsIHBlcmhhcHMgdG9vIHNtYWxsLCBhcyB0aGUKLWRhdGEgZm9yIGNvbnNlY3V0aXZlIGRheXMgd2lsbCBsaWtlbHkgYmUgb24gc2VwYXJhdGUgbm9kZXMuCi0KLUFub3RoZXIgdGVjaG5pcXVlIGtub3duIGFzICpidWNrZXRpbmcqIGlzIG9mdGVuIHVzZWQgdG8gYnJlYWsgdGhlIGRhdGEKLWludG8gbW9kZXJhdGUtc2l6ZSBwYXJ0aXRpb25zLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIGJ1Y2tldGl6ZSB0aGUKLWBhdmFpbGFibGVfcm9vbXNfYnlfaG90ZWxfZGF0ZWAgdGFibGUgYnkgYWRkaW5nIGEgYG1vbnRoYCBjb2x1bW4gdG8gdGhlCi1wYXJ0aXRpb24ga2V5LCBwZXJoYXBzIHJlcHJlc2VudGVkIGFzIGFuIGludGVnZXIuIFRoZSBjb21wYXJpc2lvbiB3aXRoCi10aGUgb3JpZ2luYWwgZGVzaWduIGlzIHNob3duIGluIHRoZSBmaWd1cmUgYmVsb3cuIFdoaWxlIHRoZSBgbW9udGhgCi1jb2x1bW4gaXMgcGFydGlhbGx5IGR1cGxpY2F0aXZlIG9mIHRoZSBgZGF0ZWAsIGl0IHByb3ZpZGVzIGEgbmljZSB3YXkgb2YKLWdyb3VwaW5nIHJlbGF0ZWQgZGF0YSBpbiBhIHBhcnRpdGlvbiB0aGF0IHdpbGwgbm90IGdldCB0b28gbGFyZ2UuCi0KLWltYWdlOjpkYXRhX21vZGVsaW5nX2hvdGVsX2J1Y2tldGluZy5wbmdbaW1hZ2VdCi0KLUlmIHlvdSByZWFsbHkgZmVsdCBzdHJvbmdseSBhYm91dCBwcmVzZXJ2aW5nIGEgd2lkZSBwYXJ0aXRpb24gZGVzaWduLAoteW91IGNvdWxkIGluc3RlYWQgYWRkIHRoZSBgcm9vbV9pZGAgdG8gdGhlIHBhcnRpdGlvbiBrZXksIHNvIHRoYXQgZWFjaAotcGFydGl0aW9uIHdvdWxkIHJlcHJlc2VudCB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSByb29tIGFjcm9zcyBhbGwgZGF0ZXMuCi1CZWNhdXNlIHRoZXJlIHdhcyBubyBxdWVyeSBpZGVudGlmaWVkIHRoYXQgaW52b2x2ZXMgc2VhcmNoaW5nCi1hdmFpbGFiaWxpdHkgb2YgYSBzcGVjaWZpYyByb29tLCB0aGUgZmlyc3Qgb3Igc2Vjb25kIGRlc2lnbiBhcHByb2FjaCBpcwotbW9zdCBzdWl0YWJsZSB0byB0aGUgYXBwbGljYXRpb24gbmVlZHMuCi0KLV9NYXRlcmlhbCBhZGFwdGVkIGZyb20gQ2Fzc2FuZHJhLCBUaGUgRGVmaW5pdGl2ZSBHdWlkZS4gUHVibGlzaGVkIGJ5Ci1PJ1JlaWxseSBNZWRpYSwgSW5jLiBDb3B5cmlnaHQgwqkgMjAyMCBKZWZmIENhcnBlbnRlciwgRWJlbiBIZXdpdHQuIEFsbAotcmlnaHRzIHJlc2VydmVkLiBVc2VkIHdpdGggcGVybWlzc2lvbi5fCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX3NjaGVtYS5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19zY2hlbWEuYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IwY2Y1Yy4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX3NjaGVtYS5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLT0gRGVmaW5pbmcgRGF0YWJhc2UgU2NoZW1hCi0KLU9uY2UgeW91IGhhdmUgZmluaXNoZWQgZXZhbHVhdGluZyBhbmQgcmVmaW5pbmcgdGhlIHBoeXNpY2FsIG1vZGVsLAoteW914oCZcmUgcmVhZHkgdG8gaW1wbGVtZW50IHRoZSBzY2hlbWEgaW4gQ1FMLiBIZXJlIGlzIHRoZSBzY2hlbWEgZm9yIHRoZQotYGhvdGVsYCBrZXlzcGFjZSwgdXNpbmcgQ1FM4oCZcyBjb21tZW50IGZlYXR1cmUgdG8gZG9jdW1lbnQgdGhlIHF1ZXJ5Ci1wYXR0ZXJuIHN1cHBvcnRlZCBieSBlYWNoIHRhYmxlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLUNSRUFURSBLRVlTUEFDRSBob3RlbCBXSVRIIHJlcGxpY2F0aW9uID0KLSAge+KAmGNsYXNz4oCZOiDigJhTaW1wbGVTdHJhdGVneeKAmSwg4oCYcmVwbGljYXRpb25fZmFjdG9y4oCZIDogM307Ci0KLUNSRUFURSBUWVBFIGhvdGVsLmFkZHJlc3MgKAotICBzdHJlZXQgdGV4dCwKLSAgY2l0eSB0ZXh0LAotICBzdGF0ZV9vcl9wcm92aW5jZSB0ZXh0LAotICBwb3N0YWxfY29kZSB0ZXh0LAotICBjb3VudHJ5IHRleHQgKTsKLQotQ1JFQVRFIFRBQkxFIGhvdGVsLmhvdGVsc19ieV9wb2kgKAotICBwb2lfbmFtZSB0ZXh0LAotICBob3RlbF9pZCB0ZXh0LAotICBuYW1lIHRleHQsCi0gIHBob25lIHRleHQsCi0gIGFkZHJlc3MgZnJvemVuPGFkZHJlc3M+LAotICBQUklNQVJZIEtFWSAoKHBvaV9uYW1lKSwgaG90ZWxfaWQpICkKLSAgV0lUSCBjb21tZW50ID0g4oCYUTEuIEZpbmQgaG90ZWxzIG5lYXIgZ2l2ZW4gcG9p4oCZCi0gIEFORCBDTFVTVEVSSU5HIE9SREVSIEJZIChob3RlbF9pZCBBU0MpIDsKLQotQ1JFQVRFIFRBQkxFIGhvdGVsLmhvdGVscyAoCi0gIGlkIHRleHQgUFJJTUFSWSBLRVksCi0gIG5hbWUgdGV4dCwKLSAgcGhvbmUgdGV4dCwKLSAgYWRkcmVzcyBmcm96ZW48YWRkcmVzcz4sCi0gIHBvaXMgc2V0ICkKLSAgV0lUSCBjb21tZW50ID0g4oCYUTIuIEZpbmQgaW5mb3JtYXRpb24gYWJvdXQgYSBob3RlbOKAmTsKLQotQ1JFQVRFIFRBQkxFIGhvdGVsLnBvaXNfYnlfaG90ZWwgKAotICBwb2lfbmFtZSB0ZXh0LAotICBob3RlbF9pZCB0ZXh0LAotICBkZXNjcmlwdGlvbiB0ZXh0LAotICBQUklNQVJZIEtFWSAoKGhvdGVsX2lkKSwgcG9pX25hbWUpICkKLSAgV0lUSCBjb21tZW50ID0gUTMuIEZpbmQgcG9pcyBuZWFyIGEgaG90ZWzigJk7Ci0KLUNSRUFURSBUQUJMRSBob3RlbC5hdmFpbGFibGVfcm9vbXNfYnlfaG90ZWxfZGF0ZSAoCi0gIGhvdGVsX2lkIHRleHQsCi0gIGRhdGUgZGF0ZSwKLSAgcm9vbV9udW1iZXIgc21hbGxpbnQsCi0gIGlzX2F2YWlsYWJsZSBib29sZWFuLAotICBQUklNQVJZIEtFWSAoKGhvdGVsX2lkKSwgZGF0ZSwgcm9vbV9udW1iZXIpICkKLSAgV0lUSCBjb21tZW50ID0g4oCYUTQuIEZpbmQgYXZhaWxhYmxlIHJvb21zIGJ5IGhvdGVsIGRhdGXigJk7Ci0KLUNSRUFURSBUQUJMRSBob3RlbC5hbWVuaXRpZXNfYnlfcm9vbSAoCi0gIGhvdGVsX2lkIHRleHQsCi0gIHJvb21fbnVtYmVyIHNtYWxsaW50LAotICBhbWVuaXR5X25hbWUgdGV4dCwKLSAgZGVzY3JpcHRpb24gdGV4dCwKLSAgUFJJTUFSWSBLRVkgKChob3RlbF9pZCwgcm9vbV9udW1iZXIpLCBhbWVuaXR5X25hbWUpICkKLSAgV0lUSCBjb21tZW50ID0g4oCYUTUuIEZpbmQgYW1lbml0aWVzIGZvciBhIHJvb23igJk7Ci0tLS0tCi0KLU5vdGljZSB0aGF0IHRoZSBlbGVtZW50cyBvZiB0aGUgcGFydGl0aW9uIGtleSBhcmUgc3Vycm91bmRlZCB3aXRoCi1wYXJlbnRoZXNlcywgZXZlbiB0aG91Z2ggdGhlIHBhcnRpdGlvbiBrZXkgY29uc2lzdHMgb2YgdGhlIHNpbmdsZSBjb2x1bW4KLWBwb2lfbmFtZWAuIFRoaXMgaXMgYSBiZXN0IHByYWN0aWNlIHRoYXQgbWFrZXMgdGhlIHNlbGVjdGlvbiBvZgotcGFydGl0aW9uIGtleSBtb3JlIGV4cGxpY2l0IHRvIG90aGVycyByZWFkaW5nIHlvdXIgQ1FMLgotCi1TaW1pbGFybHksIGhlcmUgaXMgdGhlIHNjaGVtYSBmb3IgdGhlIGByZXNlcnZhdGlvbmAga2V5c3BhY2U6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotQ1JFQVRFIEtFWVNQQUNFIHJlc2VydmF0aW9uIFdJVEggcmVwbGljYXRpb24gPSB74oCYY2xhc3PigJk6Ci0gIOKAmFNpbXBsZVN0cmF0ZWd54oCZLCDigJhyZXBsaWNhdGlvbl9mYWN0b3LigJkgOiAzfTsKLQotQ1JFQVRFIFRZUEUgcmVzZXJ2YXRpb24uYWRkcmVzcyAoCi0gIHN0cmVldCB0ZXh0LAotICBjaXR5IHRleHQsCi0gIHN0YXRlX29yX3Byb3ZpbmNlIHRleHQsCi0gIHBvc3RhbF9jb2RlIHRleHQsCi0gIGNvdW50cnkgdGV4dCApOwotCi1DUkVBVEUgVEFCTEUgcmVzZXJ2YXRpb24ucmVzZXJ2YXRpb25zX2J5X2NvbmZpcm1hdGlvbiAoCi0gIGNvbmZpcm1fbnVtYmVyIHRleHQsCi0gIGhvdGVsX2lkIHRleHQsCi0gIHN0YXJ0X2RhdGUgZGF0ZSwKLSAgZW5kX2RhdGUgZGF0ZSwKLSAgcm9vbV9udW1iZXIgc21hbGxpbnQsCi0gIGd1ZXN0X2lkIHV1aWQsCi0gIFBSSU1BUlkgS0VZIChjb25maXJtX251bWJlcikgKQotICBXSVRIIGNvbW1lbnQgPSDigJhRNi4gRmluZCByZXNlcnZhdGlvbnMgYnkgY29uZmlybWF0aW9uIG51bWJlcuKAmTsKLQotQ1JFQVRFIFRBQkxFIHJlc2VydmF0aW9uLnJlc2VydmF0aW9uc19ieV9ob3RlbF9kYXRlICgKLSAgaG90ZWxfaWQgdGV4dCwKLSAgc3RhcnRfZGF0ZSBkYXRlLAotICBlbmRfZGF0ZSBkYXRlLAotICByb29tX251bWJlciBzbWFsbGludCwKLSAgY29uZmlybV9udW1iZXIgdGV4dCwKLSAgZ3Vlc3RfaWQgdXVpZCwKLSAgUFJJTUFSWSBLRVkgKChob3RlbF9pZCwgc3RhcnRfZGF0ZSksIHJvb21fbnVtYmVyKSApCi0gIFdJVEggY29tbWVudCA9IOKAmFE3LiBGaW5kIHJlc2VydmF0aW9ucyBieSBob3RlbCBhbmQgZGF0ZeKAmTsKLQotQ1JFQVRFIFRBQkxFIHJlc2VydmF0aW9uLnJlc2VydmF0aW9uc19ieV9ndWVzdCAoCi0gIGd1ZXN0X2xhc3RfbmFtZSB0ZXh0LAotICBob3RlbF9pZCB0ZXh0LAotICBzdGFydF9kYXRlIGRhdGUsCi0gIGVuZF9kYXRlIGRhdGUsCi0gIHJvb21fbnVtYmVyIHNtYWxsaW50LAotICBjb25maXJtX251bWJlciB0ZXh0LAotICBndWVzdF9pZCB1dWlkLAotICBQUklNQVJZIEtFWSAoKGd1ZXN0X2xhc3RfbmFtZSksIGhvdGVsX2lkKSApCi0gIFdJVEggY29tbWVudCA9IOKAmFE4LiBGaW5kIHJlc2VydmF0aW9ucyBieSBndWVzdCBuYW1l4oCZOwotCi1DUkVBVEUgVEFCTEUgcmVzZXJ2YXRpb24uZ3Vlc3RzICgKLSAgZ3Vlc3RfaWQgdXVpZCBQUklNQVJZIEtFWSwKLSAgZmlyc3RfbmFtZSB0ZXh0LAotICBsYXN0X25hbWUgdGV4dCwKLSAgdGl0bGUgdGV4dCwKLSAgZW1haWxzIHNldCwKLSAgcGhvbmVfbnVtYmVycyBsaXN0LAotICBhZGRyZXNzZXMgbWFwPHRleHQsCi0gIGZyb3plbjxhZGRyZXNzPiwKLSAgY29uZmlybV9udW1iZXIgdGV4dCApCi0gIFdJVEggY29tbWVudCA9IOKAmFE5LiBGaW5kIGd1ZXN0IGJ5IElE4oCZOwotLS0tLQotCi1Zb3Ugbm93IGhhdmUgYSBjb21wbGV0ZSBDYXNzYW5kcmEgc2NoZW1hIGZvciBzdG9yaW5nIGRhdGEgZm9yIGEgaG90ZWwKLWFwcGxpY2F0aW9uLgotCi1fTWF0ZXJpYWwgYWRhcHRlZCBmcm9tIENhc3NhbmRyYSwgVGhlIERlZmluaXRpdmUgR3VpZGUuIFB1Ymxpc2hlZCBieQotTydSZWlsbHkgTWVkaWEsIEluYy4gQ29weXJpZ2h0IMKpIDIwMjAgSmVmZiBDYXJwZW50ZXIsIEViZW4gSGV3aXR0LiBBbGwKLXJpZ2h0cyByZXNlcnZlZC4gVXNlZCB3aXRoIHBlcm1pc3Npb24uXwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ190b29scy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ190b29scy5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjM1NTZmLi4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2RhdGFfbW9kZWxpbmdfdG9vbHMuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLT0gQ2Fzc2FuZHJhIERhdGEgTW9kZWxpbmcgVG9vbHMKLQotVGhlcmUgYXJlIHNldmVyYWwgdG9vbHMgYXZhaWxhYmxlIHRvIGhlbHAgeW91IGRlc2lnbiBhbmQgbWFuYWdlIHlvdXIKLUNhc3NhbmRyYSBzY2hlbWEgYW5kIGJ1aWxkIHF1ZXJpZXMuCi0KLSogaHR0cHM6Ly9oYWNrb2xhZGUuY29tL25vc3FsZGIuaHRtbCNjYXNzYW5kcmFbSGFja29sYWRlXSBpcyBhIGRhdGEKLW1vZGVsaW5nIHRvb2wgdGhhdCBzdXBwb3J0cyBzY2hlbWEgZGVzaWduIGZvciBDYXNzYW5kcmEgYW5kIG1hbnkgb3RoZXIKLU5vU1FMIGRhdGFiYXNlcy4gSGFja29sYWRlIHN1cHBvcnRzIHRoZSB1bmlxdWUgY29uY2VwdHMgb2YgQ1FMIHN1Y2ggYXMKLXBhcnRpdGlvbiBrZXlzIGFuZCBjbHVzdGVyaW5nIGNvbHVtbnMsIGFzIHdlbGwgYXMgZGF0YSB0eXBlcyBpbmNsdWRpbmcKLWNvbGxlY3Rpb25zIGFuZCBVRFRzLiBJdCBhbHNvIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGNyZWF0ZSBDaGVib3RrbwotZGlhZ3JhbXMuCi0qIGh0dHA6Ly9rZG0uZGF0YXZpZXcub3JnL1tLYXNobGV2IERhdGEgTW9kZWxlcl0gaXMgYSBDYXNzYW5kcmEgZGF0YQotbW9kZWxpbmcgdG9vbCB0aGF0IGF1dG9tYXRlcyB0aGUgZGF0YSBtb2RlbGluZyBtZXRob2RvbG9neSBkZXNjcmliZWQgaW4KLXRoaXMgZG9jdW1lbnRhdGlvbiwgaW5jbHVkaW5nIGlkZW50aWZ5aW5nIGFjY2VzcyBwYXR0ZXJucywgY29uY2VwdHVhbCwKLWxvZ2ljYWwsIGFuZCBwaHlzaWNhbCBkYXRhIG1vZGVsaW5nLCBhbmQgc2NoZW1hIGdlbmVyYXRpb24uIEl0IGFsc28KLWluY2x1ZGVzIG1vZGVsIHBhdHRlcm5zIHRoYXQgeW91IGNhbiBvcHRpb25hbGx5IGxldmVyYWdlIGFzIGEgc3RhcnRpbmcKLXBvaW50IGZvciB5b3VyIGRlc2lnbnMuCi0qIERhdGFTdGF4IERldkNlbnRlciBpcyBhIHRvb2wgZm9yIG1hbmFnaW5nIHNjaGVtYSwgZXhlY3V0aW5nIHF1ZXJpZXMKLWFuZCB2aWV3aW5nIHJlc3VsdHMuIFdoaWxlIHRoZSB0b29sIGlzIG5vIGxvbmdlciBhY3RpdmVseSBzdXBwb3J0ZWQsIGl0Ci1pcyBzdGlsbCBwb3B1bGFyIHdpdGggbWFueSBkZXZlbG9wZXJzIGFuZCBpcyBhdmFpbGFibGUgYXMgYQotaHR0cHM6Ly9hY2FkZW15LmRhdGFzdGF4LmNvbS9kb3dubG9hZHNbZnJlZSBkb3dubG9hZF0uIERldkNlbnRlcgotZmVhdHVyZXMgc3ludGF4IGhpZ2hsaWdodGluZyBmb3IgQ1FMIGNvbW1hbmRzLCB0eXBlcywgYW5kIG5hbWUgbGl0ZXJhbHMuCi1EZXZDZW50ZXIgcHJvdmlkZXMgY29tbWFuZCBjb21wbGV0aW9uIGFzIHlvdSB0eXBlIG91dCBDUUwgY29tbWFuZHMgYW5kCi1pbnRlcnByZXRzIHRoZSBjb21tYW5kcyB5b3UgdHlwZSwgaGlnaGxpZ2h0aW5nIGFueSBlcnJvcnMgeW91IG1ha2UuIFRoZQotdG9vbCBwcm92aWRlcyBwYW5lcyBmb3IgbWFuYWdpbmcgbXVsdGlwbGUgQ1FMIHNjcmlwdHMgYW5kIGNvbm5lY3Rpb25zIHRvCi1tdWx0aXBsZSBjbHVzdGVycy4gVGhlIGNvbm5lY3Rpb25zIGFyZSB1c2VkIHRvIHJ1biBDUUwgY29tbWFuZHMgYWdhaW5zdAotbGl2ZSBjbHVzdGVycyBhbmQgdmlldyB0aGUgcmVzdWx0cy4gVGhlIHRvb2wgYWxzbyBoYXMgYSBxdWVyeSB0cmFjZQotZmVhdHVyZSB0aGF0IGlzIHVzZWZ1bCBmb3IgZ2FpbmluZyBpbnNpZ2h0IGludG8gdGhlIHBlcmZvcm1hbmNlIG9mIHlvdXIKLXF1ZXJpZXMuCi0qIElERSBQbHVnaW5zIC0gVGhlcmUgYXJlIENRTCBwbHVnaW5zIGF2YWlsYWJsZSBmb3Igc2V2ZXJhbCBJbnRlZ3JhdGVkCi1EZXZlbG9wbWVudCBFbnZpcm9ubWVudHMgKElERXMpLCBzdWNoIGFzIEludGVsbGlKIElERUEgYW5kIEFwYWNoZQotTmV0QmVhbnMuIFRoZXNlIHBsdWdpbnMgdHlwaWNhbGx5IHByb3ZpZGUgZmVhdHVyZXMgc3VjaCBhcyBzY2hlbWEKLW1hbmFnZW1lbnQgYW5kIHF1ZXJ5IGV4ZWN1dGlvbi4KLQotU29tZSBJREVzIGFuZCB0b29scyB0aGF0IGNsYWltIHRvIHN1cHBvcnQgQ2Fzc2FuZHJhIGRvIG5vdCBhY3R1YWxseQotc3VwcG9ydCBDUUwgbmF0aXZlbHksIGJ1dCBpbnN0ZWFkIGFjY2VzcyBDYXNzYW5kcmEgdXNpbmcgYSBKREJDL09EQkMKLWRyaXZlciBhbmQgaW50ZXJhY3Qgd2l0aCBDYXNzYW5kcmEgYXMgaWYgaXQgd2VyZSBhIHJlbGF0aW9uYWwgZGF0YWJhc2UKLXdpdGggU1FMIHN1cHBvcnQuIFduZW4gc2VsZWN0aW5nIHRvb2xzIGZvciB3b3JraW5nIHdpdGggQ2Fzc2FuZHJhIHlvdeKAmWxsCi13YW50IHRvIG1ha2Ugc3VyZSB0aGV5IHN1cHBvcnQgQ1FMIGFuZCByZWluZm9yY2UgQ2Fzc2FuZHJhIGJlc3QKLXByYWN0aWNlcyBmb3IgZGF0YSBtb2RlbGluZyBhcyBwcmVzZW50ZWQgaW4gdGhpcyBkb2N1bWVudGF0aW9uLgotCi1fTWF0ZXJpYWwgYWRhcHRlZCBmcm9tIENhc3NhbmRyYSwgVGhlIERlZmluaXRpdmUgR3VpZGUuIFB1Ymxpc2hlZCBieQotTydSZWlsbHkgTWVkaWEsIEluYy4gQ29weXJpZ2h0IMKpIDIwMjAgSmVmZiBDYXJwZW50ZXIsIEViZW4gSGV3aXR0LiBBbGwKLXJpZ2h0cyByZXNlcnZlZC4gVXNlZCB3aXRoIHBlcm1pc3Npb24uXwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvaW5kZXguYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2luZGV4LmFkb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNWY1YTMuLjAwMDAwMDAKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvaW5kZXguYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLT0gRGF0YSBNb2RlbGluZwotCi0qIHhyZWY6ZGF0YV9tb2RlbGluZy9pbnRyby5hZG9jW0ludHJvZHVjdGlvbl0KLSogeHJlZjpkYXRhX21vZGVsaW5nL2RhdGFfbW9kZWxpbmdfcmRibXMuYWRvY1tSREJNU10KLSogeHJlZjpkYXRhX21vZGVsaW5nL2RhdGFfbW9kZWxpbmdfY29uY2VwdHVhbC5hZG9jW0NvbmNlcHR1YWxdCi0qIHhyZWY6ZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX2xvZ2ljYWwuYWRvY1tMb2dpY2FsXQotKiB4cmVmOmRhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19waHlzaWNhbC5hZG9jW1BoeXNpY2FsXQotKiB4cmVmOmRhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19zY2hlbWEuYWRvY1tTY2hlbWFdCi0qIHhyZWY6ZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX3F1ZXJpZXMuYWRvY1tRdWVyaWVzXQotKiB4cmVmOmRhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19yZWZpbmluZy5hZG9jW1JlZmluaW5nXQotKiB4cmVmOmRhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ190b29scy5hZG9jW1Rvb2xzXQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9TQVNJLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvU0FTSS5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL1NBU0kuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL1NBU0kuYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL2FwcGVuZGljZXMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9hcHBlbmRpY2VzLmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiMTEzYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9hcHBlbmRpY2VzLmFkb2MKQEAgLTAsMCArMSwxODMgQEAKKz0gQXBwZW5kaWNlcworCitbW2FwcGVuZGl4LUFdXQorPT0gQXBwZW5kaXggQTogQ1FMIEtleXdvcmRzCisKK0NRTCBkaXN0aW5ndWlzaGVzIGJldHdlZW4gX3Jlc2VydmVkXyBhbmQgX25vbi1yZXNlcnZlZF8ga2V5d29yZHMuCitSZXNlcnZlZCBrZXl3b3JkcyBjYW5ub3QgYmUgdXNlZCBhcyBpZGVudGlmaWVyLCB0aGV5IGFyZSB0cnVseSByZXNlcnZlZAorZm9yIHRoZSBsYW5ndWFnZSAoYnV0IG9uZSBjYW4gZW5jbG9zZSBhIHJlc2VydmVkIGtleXdvcmQgYnkKK2RvdWJsZS1xdW90ZXMgdG8gdXNlIGl0IGFzIGFuIGlkZW50aWZpZXIpLiBOb24tcmVzZXJ2ZWQga2V5d29yZHMgaG93ZXZlcgorb25seSBoYXZlIGEgc3BlY2lmaWMgbWVhbmluZyBpbiBjZXJ0YWluIGNvbnRleHQgYnV0IGNhbiB1c2VkIGFzCitpZGVudGlmaWVyIG90aGVyd2lzZS4gVGhlIG9ubHkgX3JhaXNvbiBk4oCZw6p0cmVfIG9mIHRoZXNlIG5vbi1yZXNlcnZlZAora2V5d29yZHMgaXMgY29udmVuaWVuY2U6IHNvbWUga2V5d29yZCBhcmUgbm9uLXJlc2VydmVkIHdoZW4gaXQgd2FzCithbHdheXMgZWFzeSBmb3IgdGhlIHBhcnNlciB0byBkZWNpZGUgd2hldGhlciB0aGV5IHdlcmUgdXNlZCBhcyBrZXl3b3Jkcworb3Igbm90LgorCitbd2lkdGg9IjQ4JSIsY29scz0iNjAlLDQwJSIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8S2V5d29yZCB8UmVzZXJ2ZWQ/Cit8YEFERGAgfHllcworfGBBR0dSRUdBVEVgIHxubworfGBBTExgIHxubworfGBBTExPV2AgfHllcworfGBBTFRFUmAgfHllcworfGBBTkRgIHx5ZXMKK3xgQVBQTFlgIHx5ZXMKK3xgQVNgIHxubworfGBBU0NgIHx5ZXMKK3xgQVNDSUlgIHxubworfGBBVVRIT1JJWkVgIHx5ZXMKK3xgQkFUQ0hgIHx5ZXMKK3xgQkVHSU5gIHx5ZXMKK3xgQklHSU5UYCB8bm8KK3xgQkxPQmAgfG5vCit8YEJPT0xFQU5gIHxubworfGBCWWAgfHllcworfGBDQUxMRURgIHxubworfGBDTFVTVEVSSU5HYCB8bm8KK3xgQ09MVU1ORkFNSUxZYCB8eWVzCit8YENPTVBBQ1RgIHxubworfGBDT05UQUlOU2AgfG5vCit8YENPVU5UYCB8bm8KK3xgQ09VTlRFUmAgfG5vCit8YENSRUFURWAgfHllcworfGBDVVNUT01gIHxubworfGBEQVRFYCB8bm8KK3xgREVDSU1BTGAgfG5vCit8YERFTEVURWAgfHllcworfGBERVNDYCB8eWVzCit8YERFU0NSSUJFYCB8eWVzCit8YERJU1RJTkNUYCB8bm8KK3xgRE9VQkxFYCB8bm8KK3xgRFJPUGAgfHllcworfGBFTlRSSUVTYCB8eWVzCit8YEVYRUNVVEVgIHx5ZXMKK3xgRVhJU1RTYCB8bm8KK3xgRklMVEVSSU5HYCB8bm8KK3xgRklOQUxGVU5DYCB8bm8KK3xgRkxPQVRgIHxubworfGBGUk9NYCB8eWVzCit8YEZST1pFTmAgfG5vCit8YEZVTExgIHx5ZXMKK3xgRlVOQ1RJT05gIHxubworfGBGVU5DVElPTlNgIHxubworfGBHUkFOVGAgfHllcworfGBJRmAgfHllcworfGBJTmAgfHllcworfGBJTkRFWGAgfHllcworfGBJTkVUYCB8bm8KK3xgSU5GSU5JVFlgIHx5ZXMKK3xgSU5JVENPTkRgIHxubworfGBJTlBVVGAgfG5vCit8YElOU0VSVGAgfHllcworfGBJTlRgIHxubworfGBJTlRPYCB8eWVzCit8YEpTT05gIHxubworfGBLRVlgIHxubworfGBLRVlTYCB8bm8KK3xgS0VZU1BBQ0VgIHx5ZXMKK3xgS0VZU1BBQ0VTYCB8bm8KK3xgTEFOR1VBR0VgIHxubworfGBMSU1JVGAgfHllcworfGBMSVNUYCB8bm8KK3xgTE9HSU5gIHxubworfGBNQVBgIHxubworfGBNQVNLRURgIHxubworfGBNT0RJRllgIHx5ZXMKK3xgTkFOYCB8eWVzCit8YE5PTE9HSU5gIHxubworfGBOT1JFQ1VSU0lWRWAgfHllcworfGBOT1NVUEVSVVNFUmAgfG5vCit8YE5PVGAgfHllcworfGBOVUxMYCB8eWVzCit8YE9GYCB8eWVzCit8YE9OYCB8eWVzCit8YE9QVElPTlNgIHxubworfGBPUmAgfHllcworfGBPUkRFUmAgfHllcworfGBQQVNTV09SRGAgfG5vCit8YFBFUk1JU1NJT05gIHxubworfGBQRVJNSVNTSU9OU2AgfG5vCit8YFBSSU1BUllgIHx5ZXMKK3xgUkVOQU1FYCB8eWVzCit8YFJFUExBQ0VgIHx5ZXMKK3xgUkVUVVJOU2AgfG5vCit8YFJFVk9LRWAgfHllcworfGBST0xFYCB8bm8KK3xgUk9MRVNgIHxubworfGBTQ0hFTUFgIHx5ZXMKK3xgU0VMRUNUYCB8eWVzCit8YFNFTEVDVF9NQVNLRURgIHxubworfGBTRVRgIHx5ZXMKK3xgU0ZVTkNgIHxubworfGBTTUFMTElOVGAgfG5vCit8YFNUQVRJQ2AgfG5vCit8YFNUT1JBR0VgIHxubworfGBTVFlQRWAgfG5vCit8YFNVUEVSVVNFUmAgfG5vCit8YFRBQkxFYCB8eWVzCit8YFRFWFRgIHxubworfGBUSU1FYCB8bm8KK3xgVElNRVNUQU1QYCB8bm8KK3xgVElNRVVVSURgIHxubworfGBUSU5ZSU5UYCB8bm8KK3xgVE9gIHx5ZXMKK3xgVE9LRU5gIHx5ZXMKK3xgVFJJR0dFUmAgfG5vCit8YFRSVU5DQVRFYCB8eWVzCit8YFRUTGAgfG5vCit8YFRVUExFYCB8bm8KK3xgVFlQRWAgfG5vCit8YFVOTE9HR0VEYCB8eWVzCit8YFVOTUFTS2AgfG5vCit8YFVQREFURWAgfHllcworfGBVU0VgIHx5ZXMKK3xgVVNFUmAgfG5vCit8YFVTRVJTYCB8bm8KK3xgVVNJTkdgIHx5ZXMKK3xgVVVJRGAgfG5vCit8YFZBTFVFU2AgfG5vCit8YFZBUkNIQVJgIHxubworfGBWQVJJTlRgIHxubworfGBXSEVSRWAgfHllcworfGBXSVRIYCB8eWVzCit8YFdSSVRFVElNRWAgfG5vCit8YE1BWFdSSVRFVElNRWAgfG5vCit8PT09CisKKz09IEFwcGVuZGl4IEI6IENRTCBSZXNlcnZlZCBUeXBlcworCitUaGUgZm9sbG93aW5nIHR5cGUgbmFtZXMgYXJlIG5vdCBjdXJyZW50bHkgdXNlZCBieSBDUUwsIGJ1dCBhcmUgcmVzZXJ2ZWQKK2ZvciBwb3RlbnRpYWwgZnV0dXJlIHVzZS4gVXNlci1kZWZpbmVkIHR5cGVzIG1heSBub3QgdXNlIHJlc2VydmVkIHR5cGUKK25hbWVzIGFzIHRoZWlyIG5hbWUuCisKK1t3aWR0aD0iMjUlIixjb2xzPSIxMDAlIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3x0eXBlCit8YGJpdHN0cmluZ2AKK3xgYnl0ZWAKK3xgY29tcGxleGAKK3xgZW51bWAKK3xgaW50ZXJ2YWxgCit8YG1hY2FkZHJgCit8PT09CisKKz09IEFwcGVuZGl4IEM6IERyb3BwaW5nIENvbXBhY3QgU3RvcmFnZQorCitTdGFydGluZyB2ZXJzaW9uIDQuMCwgVGhyaWZ0IGFuZCBDT01QQUNUIFNUT1JBR0UgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KKworYEFMVEVSIC4uLiBEUk9QIENPTVBBQ1QgU1RPUkFHRWAgc3RhdGVtZW50IG1ha2VzIENvbXBhY3QgVGFibGVzCitDUUwtY29tcGF0aWJsZSwgZXhwb3NpbmcgaW50ZXJuYWwgc3RydWN0dXJlIG9mIFRocmlmdC9Db21wYWN0IFRhYmxlczoKKworKiBDUUwtY3JlYXRlZCBDb21wYWN0IFRhYmxlcyB0aGF0IGhhdmUgbm8gY2x1c3RlcmluZyBjb2x1bW5zLCB3aWxsCitleHBvc2UgYW4gYWRkaXRpb25hbCBjbHVzdGVyaW5nIGNvbHVtbiBgY29sdW1uMWAgd2l0aCBgVVRGOFR5cGVgLgorKiBDUUwtY3JlYXRlZCBDb21wYWN0IFRhYmxlcyB0aGF0IGhhZCBubyByZWd1bGFyIGNvbHVtbnMsIHdpbGwgZXhwb3NlIGEKK3JlZ3VsYXIgY29sdW1uIGB2YWx1ZWAgd2l0aCBgQnl0ZXNUeXBlYC4KKyogRm9yIENRTC1DcmVhdGVkIENvbXBhY3QgVGFibGVzLCBhbGwgY29sdW1ucyBvcmlnaW5hbGx5IGRlZmluZWQgYXMKK2ByZWd1bGFyYCB3aWxsIGJlIGNvbWUgYHN0YXRpY2AKKyogQ1FMLWNyZWF0ZWQgQ29tcGFjdCBUYWJsZXMgdGhhdCBoYXZlIGNsdXN0ZXJpbmcgYnV0IGhhdmUgbm8gcmVndWxhcgorY29sdW1ucyB3aWxsIGhhdmUgYW4gZW1wdHkgdmFsdWUgY29sdW1uIChvZiBgRW1wdHlUeXBlYCkKKyogU3VwZXJDb2x1bW4gVGFibGVzIChjYW4gb25seSBiZSBjcmVhdGVkIHRocm91Z2ggVGhyaWZ0KSB3aWxsIGV4cG9zZSBhCitjb21wYWN0IHZhbHVlIG1hcCB3aXRoIGFuIGVtcHR5IG5hbWUuCisqIFRocmlmdC1jcmVhdGVkIENvbXBhY3QgVGFibGVzIHdpbGwgaGF2ZSB0eXBlcyBjb3JyZXNwb25kaW5nIHRvIHRoZWlyCitUaHJpZnQgZGVmaW5pdGlvbi4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9jaGFuZ2VzLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvY2hhbmdlcy5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MmExODIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvY2hhbmdlcy5hZG9jCkBAIC0wLDAgKzEsMjM0IEBACis9IENoYW5nZXMKKworVGhlIGZvbGxvd2luZyBkZXNjcmliZXMgdGhlIGNoYW5nZXMgaW4gZWFjaCB2ZXJzaW9uIG9mIENRTC4KKworPT0gMy40LjcKKworKiBSZW1vdmUgZGVwcmVjYXRlZCBmdW5jdGlvbnMgYGRhdGVPZmAgYW5kIGB1bml4VGltZXN0YW1wT2ZgLCByZXBsYWNlZCBieSBgdG9UaW1lc3RhbXBgIGFuZCBgdG9Vbml4VGltZXN0YW1wYCAoYDE4MzI4YCkKKyogQWRkZWQgc3VwcG9ydCBmb3IgYXR0YWNoaW5nIG1hc2tpbmcgZnVuY3Rpb25zIHRvIHRhYmxlIGNvbHVtbnMgKGAxODA2OGApCisqIEFkZCBVTk1BU0sgcGVybWlzc2lvbiAoYDE4MDY5YCkKKyogQWRkIFNFTEVDVF9NQVNLRUQgcGVybWlzc2lvbiAoYDE4MDcwYCkKKyogQWRkIHN1cHBvcnQgZm9yIHVzaW5nIFVERnMgYXMgbWFza2luZyBmdW5jdGlvbnMgKGAxODA3MWApCisqIEFkb3B0IHNuYWtlX2Nhc2UgZnVuY3Rpb24gbmFtZXMsIGRlcHJlY2F0aW5nIGFsbCBwcmV2aW91cyBjYW1lbENhc2Ugb3IgYWxsdG9nZXRoZXJ3aXRob3V0c3BhY2VzIGZ1bmN0aW9uIG5hbWVzIChgMTgwMzdgKQorCis9PSAzLjQuNgorCisqIEFkZCBzdXBwb3J0IGZvciBJRiBFWElTVFMgYW5kIElGIE5PVCBFWElTVFMgaW4gQUxURVIgc3RhdGVtZW50cyAgKGAxNjkxNmApCisqIEFsbG93IEdSQU5UL1JFVk9LRSBtdWx0aXBsZSBwZXJtaXNzaW9ucyBpbiBhIHNpbmdsZSBzdGF0ZW1lbnQgKGAxNzAzMGApCisqIFByZSBoYXNoZWQgcGFzc3dvcmRzIGluIENRTCAoYDE3MzM0YCkKKyogQWRkIHN1cHBvcnQgZm9yIHR5cGUgY2FzdGluZyBpbiBXSEVSRSBjbGF1c2UgY29tcG9uZW50cyBhbmQgaW4gdGhlIHZhbHVlcyBvZiBJTlNFUlQvVVBEQVRFIHN0YXRlbWVudHMgKGAxNDMzN2ApCisqIEFkZCBzdXBwb3J0IGZvciBDT05UQUlOUyBhbmQgQ09OVEFJTlMgS0VZIGluIGNvbmRpdGlvbmFsIFVQREFURSBhbmQgREVMRVRFIHN0YXRlbWVudCAoYDEwNTM3YCkKKyogQWxsb3cgdG8gZ3JhbnQgcGVybWlzc2lvbiBmb3IgYWxsIHRhYmxlcyBpbiBhIGtleXNwYWNlIChgMTcwMjdgKQorKiBBbGxvdyB0byBhZ2dyZWdhdGUgYnkgdGltZSBpbnRlcnZhbHMgKGAxMTg3MWApCisKKz09IDMuNC41CisKKyogQWRkcyBzdXBwb3J0IGZvciBhcml0aG1ldGljIG9wZXJhdG9ycyAoYDExOTM1YCkKKyogQWRkcyBzdXBwb3J0IGZvciBgK2AgYW5kIGAtYCBvcGVyYXRpb25zIG9uIGRhdGVzIChgMTE5MzZgKQorKiBBZGRzIGBjdXJyZW50VGltZXN0YW1wYCwgYGN1cnJlbnREYXRlYCwgYGN1cnJlbnRUaW1lYCBhbmQKK2BjdXJyZW50VGltZVVVSURgIGZ1bmN0aW9ucyAoYDEzMTMyYCkKKworPT0gMy40LjQKKworKiBgQUxURVIgVEFCTEVgIGBBTFRFUmAgaGFzIGJlZW4gcmVtb3ZlZDsgYSBjb2x1bW4ncyB0eXBlIG1heSBub3QgYmUKK2NoYW5nZWQgYWZ0ZXIgY3JlYXRpb24gKGAxMjQ0M2ApLgorKiBgQUxURVIgVFlQRWAgYEFMVEVSYCBoYXMgYmVlbiByZW1vdmVkOyBhIGZpZWxkJ3MgdHlwZSBtYXkgbm90IGJlCitjaGFuZ2VkIGFmdGVyIGNyZWF0aW9uIChgMTI0NDNgKS4KKworPT0gMy40LjMKKworKiBBZGRzIGEgbmV3IGBkdXJhdGlvbmAgYGRhdGEgdHlwZXMgPGRhdGEtdHlwZXM+YCAoYDExODczYCkuCisqIFN1cHBvcnQgZm9yIGBHUk9VUCBCWWAgKGAxMDcwN2ApLgorKiBBZGRzIGEgYERFRkFVTFQgVU5TRVRgIG9wdGlvbiBmb3IgYElOU0VSVCBKU09OYCB0byBpZ25vcmUgb21pdHRlZAorY29sdW1ucyAoYDExNDI0YCkuCisqIEFsbG93cyBgbnVsbGAgYXMgYSBsZWdhbCB2YWx1ZSBmb3IgVFRMIG9uIGluc2VydCBhbmQgdXBkYXRlLiBJdCB3aWxsCitiZSB0cmVhdGVkIGFzIGVxdWl2YWxlbnQgdG8gaW5zZXJ0aW5nIGEgMCAoYDEyMjE2YCkuCisKKz09IDMuNC4yCisKKyogSWYgYSB0YWJsZSBoYXMgYSBub24gemVybyBgZGVmYXVsdF90aW1lX3RvX2xpdmVgLCB0aGVuIGV4cGxpY2l0bHkKK3NwZWNpZnlpbmcgYSBUVEwgb2YgMCBpbiBhbiBgSU5TRVJUYCBvciBgVVBEQVRFYCBzdGF0ZW1lbnQgd2lsbCByZXN1bHQKK2luIHRoZSBuZXcgd3JpdGVzIG5vdCBoYXZpbmcgYW55IGV4cGlyYXRpb24gKHRoYXQgaXMsIGFuIGV4cGxpY2l0IFRUTCBvZgorMCBjYW5jZWxzIHRoZSBgZGVmYXVsdF90aW1lX3RvX2xpdmVgKS4gVGhpcyB3YXNuJ3QgdGhlIGNhc2UgYmVmb3JlIGFuZAordGhlIGBkZWZhdWx0X3RpbWVfdG9fbGl2ZWAgd2FzIGFwcGxpZWQgZXZlbiB0aG91Z2ggYSBUVEwgaGFkIGJlZW4KK2V4cGxpY2l0bHkgc2V0LgorKiBgQUxURVIgVEFCTEVgIGBBRERgIGFuZCBgRFJPUGAgbm93IGFsbG93IG11bHRpcGxlIGNvbHVtbnMgdG8gYmUKK2FkZGVkL3JlbW92ZWQuCisqIE5ldyBgUEVSIFBBUlRJVElPTiBMSU1JVGAgb3B0aW9uIGZvciBgU0VMRUNUYCBzdGF0ZW1lbnRzIChzZWUKK2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTcwMTcpW0NBU1NBTkRSQS03MDE3XS4KKyogYFVzZXItZGVmaW5lZCBmdW5jdGlvbnMgPGNxbC1mdW5jdGlvbnM+YCBjYW4gbm93IGluc3RhbnRpYXRlCitgVURUVmFsdWVgIGFuZCBgVHVwbGVWYWx1ZWAgaW5zdGFuY2VzIHZpYSB0aGUgbmV3IGBVREZDb250ZXh0YCBpbnRlcmZhY2UKKyhzZWUKK2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTEwODE4KVtDQVNTQU5EUkEtMTA4MThdLgorKiBgVXNlci1kZWZpbmVkIHR5cGVzIDx1ZHRzPmAgbWF5IG5vdyBiZSBzdG9yZWQgaW4gYSBub24tZnJvemVuIGZvcm0sCithbGxvd2luZyBpbmRpdmlkdWFsIGZpZWxkcyB0byBiZSB1cGRhdGVkIGFuZCBkZWxldGVkIGluIGBVUERBVEVgCitzdGF0ZW1lbnRzIGFuZCBgREVMRVRFYCBzdGF0ZW1lbnRzLCByZXNwZWN0aXZlbHkuCisoaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtNzQyMylbQ0FTU0FORFJBLTc0MjNdKS4KKworPT0gMy40LjEKKworKiBBZGRzIGBDQVNUYCBmdW5jdGlvbnMuCisKKz09IDMuNC4wCisKKyogU3VwcG9ydCBmb3IgYG1hdGVyaWFsaXplZCB2aWV3cyA8bWF0ZXJpYWxpemVkLXZpZXdzPmAuCisqIGBERUxFVEVgIHN1cHBvcnQgZm9yIGluZXF1YWxpdHkgZXhwcmVzc2lvbnMgYW5kIGBJTmAgcmVzdHJpY3Rpb25zIG9uCithbnkgcHJpbWFyeSBrZXkgY29sdW1ucy4KKyogYFVQREFURWAgc3VwcG9ydCBmb3IgYElOYCByZXN0cmljdGlvbnMgb24gYW55IHByaW1hcnkga2V5IGNvbHVtbnMuCisKKz09IDMuMy4xCisKKyogVGhlIHN5bnRheCBgVFJVTkNBVEUgVEFCTEUgWGAgaXMgbm93IGFjY2VwdGVkIGFzIGFuIGFsaWFzIGZvcgorYFRSVU5DQVRFIFhgLgorCis9PSAzLjMuMAorCisqIGBVc2VyLWRlZmluZWQgZnVuY3Rpb25zIGFuZCBhZ2dyZWdhdGVzIDxjcWwtZnVuY3Rpb25zPmAgYXJlIG5vdworc3VwcG9ydGVkLgorKiBBbGxvd3MgZG91YmxlLWRvbGxhciBlbmNsb3NlZCBzdHJpbmdzIGxpdGVyYWxzIGFzIGFuIGFsdGVybmF0aXZlIHRvCitzaW5nbGUtcXVvdGUgZW5jbG9zZWQgc3RyaW5ncy4KKyogSW50cm9kdWNlcyBSb2xlcyB0byBzdXBlcnNlZGUgdXNlciBiYXNlZCBhdXRoZW50aWNhdGlvbiBhbmQgYWNjZXNzCitjb250cm9sCisqIE5ldyBgZGF0ZWAsIGB0aW1lYCwgYHRpbnlpbnRgIGFuZCBgc21hbGxpbnRgIGBkYXRhIHR5cGVzIDxkYXRhLXR5cGVzPmAKK2hhdmUgYmVlbiBhZGRlZC4KKyogYEpTT04gc3VwcG9ydCA8Y3FsLWpzb24+YCBoYXMgYmVlbiBhZGRlZAorKiBBZGRzIG5ldyB0aW1lIGNvbnZlcnNpb24gZnVuY3Rpb25zIGFuZCBkZXByZWNhdGUgYGRhdGVPZmAgYW5kCitgdW5peFRpbWVzdGFtcE9mYC4KKworPT0gMy4yLjAKKworKiBgVXNlci1kZWZpbmVkIHR5cGVzIDx1ZHRzPmAgc3VwcG9ydGVkLgorKiBgQ1JFQVRFIElOREVYYCBub3cgc3VwcG9ydHMgaW5kZXhpbmcgY29sbGVjdGlvbiBjb2x1bW5zLCBpbmNsdWRpbmcKK2luZGV4aW5nIHRoZSBrZXlzIG9mIG1hcCBjb2xsZWN0aW9ucyB0aHJvdWdoIHRoZSBga2V5cygpYCBmdW5jdGlvbgorKiBJbmRleGVzIG9uIGNvbGxlY3Rpb25zIG1heSBiZSBxdWVyaWVkIHVzaW5nIHRoZSBuZXcgYENPTlRBSU5TYCBhbmQKK2BDT05UQUlOUyBLRVlgIG9wZXJhdG9ycworKiBgVHVwbGUgdHlwZXMgPHR1cGxlcz5gIHdlcmUgYWRkZWQgdG8gaG9sZCBmaXhlZC1sZW5ndGggc2V0cyBvZiB0eXBlZAorcG9zaXRpb25hbCBmaWVsZHMuCisqIGBEUk9QIElOREVYYCBub3cgc3VwcG9ydHMgb3B0aW9uYWxseSBzcGVjaWZ5aW5nIGEga2V5c3BhY2UuCisKKz09IDMuMS43CisKKyogYFNFTEVDVGAgc3RhdGVtZW50cyBub3cgc3VwcG9ydCBzZWxlY3RpbmcgbXVsdGlwbGUgcm93cyBpbiBhIHNpbmdsZQorcGFydGl0aW9uIHVzaW5nIGFuIGBJTmAgY2xhdXNlIG9uIGNvbWJpbmF0aW9ucyBvZiBjbHVzdGVyaW5nIGNvbHVtbnMuCisqIGBJRiBOT1QgRVhJU1RTYCBhbmQgYElGIEVYSVNUU2Agc3ludGF4IGlzIG5vdyBzdXBwb3J0ZWQgYnkKK2BDUkVBVEUgVVNFUmAgYW5kIGBEUk9QIFVTRVJgIHN0YXRlbWVudHMsIHJlc3BlY3RpdmVseS4KKworPT0gMy4xLjYKKworKiBBIG5ldyBgdXVpZCgpYCBtZXRob2QgaGFzIGJlZW4gYWRkZWQuCisqIFN1cHBvcnQgZm9yIGBERUxFVEUgLi4uIElGIEVYSVNUU2Agc3ludGF4LgorCis9PSAzLjEuNQorCisqIEl0IGlzIG5vdyBwb3NzaWJsZSB0byBncm91cCBjbHVzdGVyaW5nIGNvbHVtbnMgaW4gYSByZWxhdGlvbiwgc2VlCitgV0hFUkUgPHdoZXJlLWNsYXVzZT5gIGNsYXVzZXMuCisqIEFkZGVkIHN1cHBvcnQgZm9yIGBzdGF0aWMgY29sdW1ucyA8c3RhdGljLWNvbHVtbnM+YC4KKworPT0gMy4xLjQKKworKiBgQ1JFQVRFIElOREVYYCBub3cgYWxsb3dzIHNwZWNpZnlpbmcgb3B0aW9ucyB3aGVuIGNyZWF0aW5nIENVU1RPTQoraW5kZXhlcy4KKworPT0gMy4xLjMKKworKiBNaWxsaXNlY29uZCBwcmVjaXNpb24gZm9ybWF0cyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlCitgdGltZXN0YW1wIDx0aW1lc3RhbXBzPmAgcGFyc2VyLgorCis9PSAzLjEuMgorCisqIGBOYU5gIGFuZCBgSW5maW5pdHlgIGhhcyBiZWVuIGFkZGVkIGFzIHZhbGlkIGZsb2F0IGNvbnN0YW50cy4gVGhleSBhcmUKK25vdyByZXNlcnZlZCBrZXl3b3Jkcy4gSW4gdGhlIHVubGlrZWx5IGNhc2UgeW91IHdlIHVzaW5nIHRoZW0gYXMgYQorY29sdW1uIGlkZW50aWZpZXIgKG9yIGtleXNwYWNlL3RhYmxlIG9uZSksIHlvdSB3aWxsIG5vdyBuZWVkIHRvIGRvdWJsZQorcXVvdGUgdGhlbS4KKworPT0gMy4xLjEKKworKiBgU0VMRUNUYCBzdGF0ZW1lbnQgbm93IGFsbG93cyBsaXN0aW5nIHRoZSBwYXJ0aXRpb24ga2V5cyAodXNpbmcgdGhlCitgRElTVElOQ1RgIG1vZGlmaWVyKS4gU2VlCitodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS00NTM2W0NBU1NBTkRSQS00NTM2XS4KKyogVGhlIHN5bnRheCBgYyBJTiA/YCBpcyBub3cgc3VwcG9ydGVkIGluIGBXSEVSRWAgY2xhdXNlcy4gSW4gdGhhdCBjYXNlLAordGhlIHZhbHVlIGV4cGVjdGVkIGZvciB0aGUgYmluZCB2YXJpYWJsZSB3aWxsIGJlIGEgbGlzdCBvZiB3aGF0ZXZlciB0eXBlCitgY2AgaXMuCisqIEl0IGlzIG5vdyBwb3NzaWJsZSB0byB1c2UgbmFtZWQgYmluZCB2YXJpYWJsZXMgKHVzaW5nIGA6bmFtZWAgaW5zdGVhZAorb2YgYD9gKS4KKworPT0gMy4xLjAKKworKiBgQUxURVIgVEFCTEVgIGBEUk9QYCBvcHRpb24gYWRkZWQuCisqIGBTRUxFQ1RgIHN0YXRlbWVudCBub3cgc3VwcG9ydHMgYWxpYXNlcyBpbiBzZWxlY3QgY2xhdXNlLiBBbGlhc2VzIGluCitXSEVSRSBhbmQgT1JERVIgQlkgY2xhdXNlcyBhcmUgbm90IHN1cHBvcnRlZC4KKyogYENSRUFURWAgc3RhdGVtZW50cyBmb3IgYEtFWVNQQUNFYCwgYFRBQkxFYCBhbmQgYElOREVYYCBub3cgc3VwcG9ydHMKK2FuIGBJRiBOT1QgRVhJU1RTYCBjb25kaXRpb24uIFNpbWlsYXJseSwgYERST1BgIHN0YXRlbWVudHMgc3VwcG9ydCBhCitgSUYgRVhJU1RTYCBjb25kaXRpb24uCisqIGBJTlNFUlRgIHN0YXRlbWVudHMgb3B0aW9uYWxseSBzdXBwb3J0cyBhIGBJRiBOT1QgRVhJU1RTYCBjb25kaXRpb24KK2FuZCBgVVBEQVRFYCBzdXBwb3J0cyBgSUZgIGNvbmRpdGlvbnMuCisKKz09IDMuMC41CisKKyogYFNFTEVDVGAsIGBVUERBVEVgLCBhbmQgYERFTEVURWAgc3RhdGVtZW50cyBub3cgYWxsb3cgZW1wdHkgYElOYAorcmVsYXRpb25zIChzZWUKK2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTU2MjYpW0NBU1NBTkRSQS01NjI2XS4KKworPT0gMy4wLjQKKworKiBVcGRhdGVkIHRoZSBzeW50YXggZm9yIGN1c3RvbSBgc2Vjb25kYXJ5IGluZGV4ZXMgPHNlY29uZGFyeS1pbmRleGVzPmAuCisqIE5vbi1lcXVhbCBjb25kaXRpb24gb24gdGhlIHBhcnRpdGlvbiBrZXkgYXJlIG5vdyBuZXZlciBzdXBwb3J0ZWQsIGV2ZW4KK2ZvciBvcmRlcmluZyBwYXJ0aXRpb25lciBhcyB0aGlzIHdhcyBub3QgY29ycmVjdCAodGhlIG9yZGVyIHdhcyAqbm90KgordGhlIG9uZSBvZiB0aGUgdHlwZSBvZiB0aGUgcGFydGl0aW9uIGtleSkuIEluc3RlYWQsIHRoZSBgdG9rZW5gIG1ldGhvZAorc2hvdWxkIGFsd2F5cyBiZSB1c2VkIGZvciByYW5nZSBxdWVyaWVzIG9uIHRoZSBwYXJ0aXRpb24ga2V5IChzZWUKK2BXSEVSRSBjbGF1c2VzIDx3aGVyZS1jbGF1c2U+YCkuCisKKz09IDMuMC4zCisKKyogU3VwcG9ydCBmb3IgY3VzdG9tIGBzZWNvbmRhcnkgaW5kZXhlcyA8c2Vjb25kYXJ5LWluZGV4ZXM+YCBoYXMgYmVlbgorYWRkZWQuCisKKz09IDMuMC4yCisKKyogVHlwZSB2YWxpZGF0aW9uIGZvciB0aGUgYGNvbnN0YW50cyA8Y29uc3RhbnRzPmAgaGFzIGJlZW4gZml4ZWQuIEZvcgoraW5zdGFuY2UsIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VkIHRvIGFsbG93IGAnMidgIGFzIGEgdmFsaWQgdmFsdWUgZm9yIGFuCitgaW50YCBjb2x1bW4gKGludGVycHJldGluZyBpdCBoYXMgdGhlIGVxdWl2YWxlbnQgb2YgYDJgKSwgb3IgYDQyYCBhcyBhCit2YWxpZCBgYmxvYmAgdmFsdWUgKGluIHdoaWNoIGNhc2UgYDQyYCB3YXMgaW50ZXJwcmV0ZWQgYXMgYW4gaGV4YWRlY2ltYWwKK3JlcHJlc2VudGF0aW9uIG9mIHRoZSBibG9iKS4gVGhpcyBpcyBubyBsb25nZXIgdGhlIGNhc2UsIHR5cGUgdmFsaWRhdGlvbgorb2YgY29uc3RhbnRzIGlzIG5vdyBtb3JlIHN0cmljdC4gU2VlIHRoZSBgZGF0YSB0eXBlcyA8ZGF0YS10eXBlcz5gCitzZWN0aW9uIGZvciBkZXRhaWxzIG9uIHdoaWNoIGNvbnN0YW50IGlzIGFsbG93ZWQgZm9yIHdoaWNoIHR5cGUuCisqIFRoZSB0eXBlIHZhbGlkYXRpb24gZml4ZWQgb2YgdGhlIHByZXZpb3VzIHBvaW50IGhhcyBsZWFkIHRvIHRoZQoraW50cm9kdWN0aW9uIG9mIGJsb2JzIGNvbnN0YW50cyB0byBhbGxvdyB0aGUgaW5wdXQgb2YgYmxvYnMuIERvIG5vdGUKK3RoYXQgd2hpbGUgdGhlIGlucHV0IG9mIGJsb2JzIGFzIHN0cmluZ3MgY29uc3RhbnQgaXMgc3RpbGwgc3VwcG9ydGVkIGJ5Cit0aGlzIHZlcnNpb24gKHRvIGFsbG93IHNtb290aGVyIHRyYW5zaXRpb24gdG8gYmxvYiBjb25zdGFudCksIGl0IGlzIG5vdworZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGJ5IGEgZnV0dXJlIHZlcnNpb24uIElmIHlvdSB3ZXJlIHVzaW5nCitzdHJpbmdzIGFzIGJsb2JzLCB5b3Ugc2hvdWxkIHRodXMgdXBkYXRlIHlvdXIgY2xpZW50IGNvZGUgQVNBUCB0byBzd2l0Y2gKK2Jsb2IgY29uc3RhbnRzLgorKiBBIG51bWJlciBvZiBmdW5jdGlvbnMgdG8gY29udmVydCBuYXRpdmUgdHlwZXMgdG8gYmxvYnMgaGF2ZSBhbHNvIGJlZW4KK2ludHJvZHVjZWQuIEZ1cnRoZXJtb3JlIHRoZSB0b2tlbiBmdW5jdGlvbiBpcyBub3cgYWxzbyBhbGxvd2VkIGluIHNlbGVjdAorY2xhdXNlcy4gU2VlIHRoZSBgc2VjdGlvbiBvbiBmdW5jdGlvbnMgPGNxbC1mdW5jdGlvbnM+YCBmb3IgZGV0YWlscy4KKworPT0gMy4wLjEKKworKiBEYXRlIHN0cmluZ3MgKGFuZCB0aW1lc3RhbXBzKSBhcmUgbm8gbG9uZ2VyIGFjY2VwdGVkIGFzIHZhbGlkCitgdGltZXV1aWRgIHZhbHVlcy4gRG9pbmcgc28gd2FzIGEgYnVnIGluIHRoZSBzZW5zZSB0aGF0IGRhdGUgc3RyaW5nIGFyZQorbm90IHZhbGlkIGB0aW1ldXVpZGAsIGFuZCBpdCB3YXMgdGh1cyByZXN1bHRpbmcgaW4KK2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTQ5MzZbY29uZnVzaW5nCitiZWhhdmlvcnNdLiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5ldyBtZXRob2RzIGhhdmUgYmVlbiBhZGRlZCB0byBoZWxwCit3b3JraW5nIHdpdGggYHRpbWV1dWlkYDogYG5vd2AsIGBtaW5UaW1ldXVpZGAsIGBtYXhUaW1ldXVpZGAgLCBgZGF0ZU9mYAorYW5kIGB1bml4VGltZXN0YW1wT2ZgLgorKiBGbG9hdCBjb25zdGFudHMgbm93IHN1cHBvcnQgdGhlIGV4cG9uZW50IG5vdGF0aW9uLiBJbiBvdGhlciB3b3JkcywKK2A0LjJFMTBgIGlzIG5vdyBhIHZhbGlkIGZsb2F0aW5nIHBvaW50IHZhbHVlLgorCis9PSBWZXJzaW9uaW5nCisKK1ZlcnNpb25pbmcgb2YgdGhlIENRTCBsYW5ndWFnZSBhZGhlcmVzIHRvIHRoZSBodHRwOi8vc2VtdmVyLm9yZ1tTZW1hbnRpYworVmVyc2lvbmluZ10gZ3VpZGVsaW5lcy4gVmVyc2lvbnMgdGFrZSB0aGUgZm9ybSBYLlkuWiB3aGVyZSBYLCBZLCBhbmQgWgorYXJlIGludGVnZXIgdmFsdWVzIHJlcHJlc2VudGluZyBtYWpvciwgbWlub3IsIGFuZCBwYXRjaCBsZXZlbAorcmVzcGVjdGl2ZWx5LiBUaGVyZSBpcyBubyBjb3JyZWxhdGlvbiBiZXR3ZWVuIENhc3NhbmRyYSByZWxlYXNlIHZlcnNpb25zCithbmQgdGhlIENRTCBsYW5ndWFnZSB2ZXJzaW9uLgorCitbY29scz0iLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8dmVyc2lvbiB8ZGVzY3JpcHRpb24KK3wgTWFqb3IgfCBUaGUgbWFqb3IgdmVyc2lvbiBfbXVzdF8gYmUgYnVtcGVkIHdoZW4gYmFja3dhcmQgaW5jb21wYXRpYmxlIGNoYW5nZXMKK2FyZSBpbnRyb2R1Y2VkLiBUaGlzIHNob3VsZCByYXJlbHkgb2NjdXIuCit8IE1pbm9yIHwgTWlub3IgdmVyc2lvbiBpbmNyZW1lbnRzIG9jY3VyIHdoZW4gbmV3LCBidXQgYmFja3dhcmQgY29tcGF0aWJsZSwKK2Z1bmN0aW9uYWxpdHkgaXMgaW50cm9kdWNlZC4KK3wgUGF0Y2ggfCBUaGUgcGF0Y2ggdmVyc2lvbiBpcyBpbmNyZW1lbnRlZCB3aGVuIGJ1Z3MgYXJlIGZpeGVkLgorfD09PQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL2NxbF9zaW5nbGVmaWxlLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvY3FsX3NpbmdsZWZpbGUuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDJhYzNhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL2NxbF9zaW5nbGVmaWxlLmFkb2MKQEAgLTAsMCArMSwzOTIyIEBACis9PSBDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UgKENRTCkgdjMuNC4zCisKK1x7dG9jOm1heExldmVsPTN9CisKKz09PSBDUUwgU3ludGF4CisKKz09PT0gUHJlYW1ibGUKKworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIENhc3NhbmRyYSBRdWVyeSBMYW5ndWFnZSAoQ1FMKSB2ZXJzaW9uIDMuCitDUUwgdjMgaXMgbm90IGJhY2t3YXJkIGNvbXBhdGlibGUgd2l0aCBDUUwgdjIgYW5kIGRpZmZlcnMgZnJvbSBpdCBpbgorbnVtZXJvdXMgd2F5cy4gTm90ZSB0aGF0IHRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBsYXN0IHZlcnNpb24gb2YgdGhlCitsYW5ndWFnZXMuIEhvd2V2ZXIsIHRoZSBsaW5rOiNjaGFuZ2VzW2NoYW5nZXNdIHNlY3Rpb24gcHJvdmlkZXMgdGhlIGRpZmYKK2JldHdlZW4gdGhlIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBDUUwgdjMuCisKK0NRTCB2MyBvZmZlcnMgYSBtb2RlbCB2ZXJ5IGNsb3NlIHRvIFNRTCBpbiB0aGUgc2Vuc2UgdGhhdCBkYXRhIGlzIHB1dCBpbgorX3RhYmxlc18gY29udGFpbmluZyBfcm93c18gb2YgX2NvbHVtbnNfLiBGb3IgdGhhdCByZWFzb24sIHdoZW4gdXNlZCBpbgordGhpcyBkb2N1bWVudCwgdGhlc2UgdGVybXMgKHRhYmxlcywgcm93cyBhbmQgY29sdW1ucykgaGF2ZSB0aGUgc2FtZQorZGVmaW5pdGlvbiB0aGFuIHRoZXkgaGF2ZSBpbiBTUUwuIEJ1dCBwbGVhc2Ugbm90ZSB0aGF0IGFzIHN1Y2gsIHRoZXkgZG8KKypub3QqIHJlZmVyIHRvIHRoZSBjb25jZXB0IG9mIHJvd3MgYW5kIGNvbHVtbnMgZm91bmQgaW4gdGhlIGludGVybmFsCitpbXBsZW1lbnRhdGlvbiBvZiBDYXNzYW5kcmEgYW5kIGluIHRoZSB0aHJpZnQgYW5kIENRTCB2MiBBUEkuCisKKz09PT0gQ29udmVudGlvbnMKKworVG8gYWlkIGluIHNwZWNpZnlpbmcgdGhlIENRTCBzeW50YXgsIHdlIHdpbGwgdXNlIHRoZSBmb2xsb3dpbmcKK2NvbnZlbnRpb25zIGluIHRoaXMgZG9jdW1lbnQ6CisKKyogTGFuZ3VhZ2UgcnVsZXMgd2lsbCBiZSBnaXZlbiBpbiBhCitodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JhY2t1cyVFMiU4MCU5M05hdXJfRm9ybVtCTkZdIC1saWtlCitub3RhdGlvbjoKKworYmMoc3ludGF4KS4gOjo9IFRFUk1JTkFMCisKKyogTm9udGVybWluYWwgc3ltYm9scyB3aWxsIGhhdmUgYDxhbmdsZSBicmFja2V0cz5gLgorKiBBcyBhZGRpdGlvbmFsIHNob3J0Y3V0IG5vdGF0aW9ucyB0byBCTkYsIHdl4oCZbGwgdXNlIHRyYWRpdGlvbmFsIHJlZ3VsYXIKK2V4cHJlc3Npb27igJlzIHN5bWJvbHMgKGA/YCwgYCtgIGFuZCBgKmApIHRvIHNpZ25pZnkgdGhhdCBhIGdpdmVuIHN5bWJvbAoraXMgb3B0aW9uYWwgYW5kL29yIGNhbiBiZSByZXBlYXRlZC4gV2XigJlsbCBhbHNvIGFsbG93IHBhcmVudGhlc2VzIHRvCitncm91cCBzeW1ib2xzIGFuZCB0aGUgYFs8Y2hhcmFjdGVycz5dYCBub3RhdGlvbiB0byByZXByZXNlbnQgYW55IG9uZSBvZgorYDxjaGFyYWN0ZXJzPmAuCisqIFRoZSBncmFtbWFyIGlzIHByb3ZpZGVkIGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzIGFuZCBsZWF2ZSBzb21lCittaW5vciBkZXRhaWxzIG91dC4gRm9yIGluc3RhbmNlLCB0aGUgbGFzdCBjb2x1bW4gZGVmaW5pdGlvbiBpbiBhCitgQ1JFQVRFIFRBQkxFYCBzdGF0ZW1lbnQgaXMgb3B0aW9uYWwgYnV0IHN1cHBvcnRlZCBpZiBwcmVzZW50IGV2ZW4KK3Rob3VnaCB0aGUgcHJvdmlkZWQgZ3JhbW1hciBpbiB0aGlzIGRvY3VtZW50IHN1Z2dlc3QgaXQgaXMgbm90CitzdXBwb3J0ZWQuCisqIFNhbXBsZSBjb2RlIHdpbGwgYmUgcHJvdmlkZWQgaW4gYSBjb2RlIGJsb2NrOgorCitiYyhzYW1wbGUpLiBTRUxFQ1Qgc2FtcGxlX3VzYWdlIEZST00gY3FsOworCisqIFJlZmVyZW5jZXMgdG8ga2V5d29yZHMgb3IgcGllY2VzIG9mIENRTCBjb2RlIGluIHJ1bm5pbmcgdGV4dCB3aWxsIGJlCitzaG93biBpbiBhIGBmaXhlZC13aWR0aCBmb250YC4KKworW1tpZGVudGlmaWVyc11dCis9PT09IElkZW50aWZpZXJzIGFuZCBrZXl3b3JkcworCitUaGUgQ1FMIGxhbmd1YWdlIHVzZXMgX2lkZW50aWZpZXJzXyAob3IgX25hbWVzXykgdG8gaWRlbnRpZnkgdGFibGVzLAorY29sdW1ucyBhbmQgb3RoZXIgb2JqZWN0cy4gQW4gaWRlbnRpZmllciBpcyBhIHRva2VuIG1hdGNoaW5nIHRoZSByZWd1bGFyCitleHByZXNzaW9uIGBbYS16QS1aXWBgW2EtekEtWjAtOV9dYGAqYC4KKworQSBudW1iZXIgb2Ygc3VjaCBpZGVudGlmaWVycywgbGlrZSBgU0VMRUNUYCBvciBgV0lUSGAsIGFyZSBfa2V5d29yZHNfLgorVGhleSBoYXZlIGEgZml4ZWQgbWVhbmluZyBmb3IgdGhlIGxhbmd1YWdlIGFuZCBtb3N0IGFyZSByZXNlcnZlZC4gVGhlCitsaXN0IG9mIHRob3NlIGtleXdvcmRzIGNhbiBiZSBmb3VuZCBpbiBsaW5rOiNhcHBlbmRpeEFbQXBwZW5kaXggQV0uCisKK0lkZW50aWZpZXJzIGFuZCAodW5xdW90ZWQpIGtleXdvcmRzIGFyZSBjYXNlIGluc2Vuc2l0aXZlLiBUaHVzIGBTRUxFQ1RgCitpcyB0aGUgc2FtZSB0aGFuIGBzZWxlY3RgIG9yIGBzRWxFY1RgLCBhbmQgYG15SWRgIGlzIHRoZSBzYW1lIHRoYW4KK2BteWlkYCBvciBgTVlJRGAgZm9yIGluc3RhbmNlLiBBIGNvbnZlbnRpb24gb2Z0ZW4gdXNlZCAoaW4gcGFydGljdWxhciBieQordGhlIHNhbXBsZXMgb2YgdGhpcyBkb2N1bWVudGF0aW9uKSBpcyB0byB1c2UgdXBwZXIgY2FzZSBmb3Iga2V5d29yZHMgYW5kCitsb3dlciBjYXNlIGZvciBvdGhlciBpZGVudGlmaWVycy4KKworVGhlcmUgaXMgYSBzZWNvbmQga2luZCBvZiBpZGVudGlmaWVycyBjYWxsZWQgX3F1b3RlZCBpZGVudGlmaWVyc18KK2RlZmluZWQgYnkgZW5jbG9zaW5nIGFuIGFyYml0cmFyeSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGluCitkb3VibGUtcXVvdGVzKGAiYCkuIFF1b3RlZCBpZGVudGlmaWVycyBhcmUgbmV2ZXIga2V5d29yZHMuIFRodXMKK2Aic2VsZWN0ImAgaXMgbm90IGEgcmVzZXJ2ZWQga2V5d29yZCBhbmQgY2FuIGJlIHVzZWQgdG8gcmVmZXIgdG8gYQorY29sdW1uLCB3aGlsZSBgc2VsZWN0YCB3b3VsZCByYWlzZSBhIHBhcnNlIGVycm9yLiBBbHNvLCBjb250cmFyaWx5IHRvCit1bnF1b3RlZCBpZGVudGlmaWVycyBhbmQga2V5d29yZHMsIHF1b3RlZCBpZGVudGlmaWVycyBhcmUgY2FzZSBzZW5zaXRpdmUKKyhgIk15IFF1b3RlZCBJZCJgIGlzIF9kaWZmZXJlbnRfIGZyb20gYCJteSBxdW90ZWQgaWQiYCkuIEEgZnVsbHkKK2xvd2VyY2FzZSBxdW90ZWQgaWRlbnRpZmllciB0aGF0IG1hdGNoZXMgYFthLXpBLVpdYGBbYS16QS1aMC05X11gYCpgIGlzCitlcXVpdmFsZW50IHRvIHRoZSB1bnF1b3RlZCBpZGVudGlmaWVyIG9idGFpbmVkIGJ5IHJlbW92aW5nIHRoZQorZG91YmxlLXF1b3RlIChzbyBgIm15aWQiYCBpcyBlcXVpdmFsZW50IHRvIGBteWlkYCBhbmQgdG8gYG15SWRgIGJ1dAorZGlmZmVyZW50IGZyb20gYCJteUlkImApLiBJbnNpZGUgYSBxdW90ZWQgaWRlbnRpZmllciwgdGhlIGRvdWJsZS1xdW90ZQorY2hhcmFjdGVyIGNhbiBiZSByZXBlYXRlZCB0byBlc2NhcGUgaXQsIHNvIGAiZm9vICIiIGJhciJgIGlzIGEgdmFsaWQKK2lkZW50aWZpZXIuCisKKypXYXJuaW5nKjogX3F1b3RlZCBpZGVudGlmaWVyc18gYWxsb3dzIHRvIGRlY2xhcmUgY29sdW1ucyB3aXRoIGFyYml0cmFyeQorbmFtZXMsIGFuZCB0aG9zZSBjYW4gc29tZXRpbWUgY2xhc2ggd2l0aCBzcGVjaWZpYyBuYW1lcyB1c2VkIGJ5IHRoZQorc2VydmVyLiBGb3IgaW5zdGFuY2UsIHdoZW4gdXNpbmcgY29uZGl0aW9uYWwgdXBkYXRlLCB0aGUgc2VydmVyIHdpbGwKK3Jlc3BvbmQgd2l0aCBhIHJlc3VsdC1zZXQgY29udGFpbmluZyBhIHNwZWNpYWwgcmVzdWx0IG5hbWVkCitgIlthcHBsaWVkXSJgLiBJZiB5b3XigJl2ZSBkZWNsYXJlZCBhIGNvbHVtbiB3aXRoIHN1Y2ggYSBuYW1lLCB0aGlzIGNvdWxkCitwb3RlbnRpYWxseSBjb25mdXNlIHNvbWUgdG9vbHMgYW5kIHNob3VsZCBiZSBhdm9pZGVkLiBJbiBnZW5lcmFsLAordW5xdW90ZWQgaWRlbnRpZmllcnMgc2hvdWxkIGJlIHByZWZlcnJlZCBidXQgaWYgeW91IHVzZSBxdW90ZWQKK2lkZW50aWZpZXJzLCBpdCBpcyBzdHJvbmdseSBhZHZpc2VkIHRvIGF2b2lkIGFueSBuYW1lIGVuY2xvc2VkIGJ5CitzcXVhcmVkIGJyYWNrZXRzIChsaWtlIGAiW2FwcGxpZWRdImApIGFuZCBhbnkgbmFtZSB0aGF0IGxvb2tzIGxpa2UgYQorZnVuY3Rpb24gY2FsbCAobGlrZSBgImYoeCkiYCkuCisKKz09PT0gQ29uc3RhbnRzCisKK0NRTCBkZWZpbmVzIHRoZSBmb2xsb3dpbmcga2luZCBvZiBfY29uc3RhbnRzXzogc3RyaW5ncywgaW50ZWdlcnMsCitmbG9hdHMsIGJvb2xlYW5zLCB1dWlkcyBhbmQgYmxvYnM6CisKKyogQSBzdHJpbmcgY29uc3RhbnQgaXMgYW4gYXJiaXRyYXJ5IHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgY2hhcmFjdGVycworZW5jbG9zZWQgYnkgc2luZ2xlLXF1b3RlKGAnYCkuIE9uZSBjYW4gaW5jbHVkZSBhIHNpbmdsZS1xdW90ZSBpbiBhCitzdHJpbmcgYnkgcmVwZWF0aW5nIGl0LCBlLmcuIGAnSXQnJ3MgcmFpbmluZyB0b2RheSdgLiBUaG9zZSBhcmUgbm90IHRvCitiZSBjb25mdXNlZCB3aXRoIHF1b3RlZCBpZGVudGlmaWVycyB0aGF0IHVzZSBkb3VibGUtcXVvdGVzLgorKiBBbiBpbnRlZ2VyIGNvbnN0YW50IGlzIGRlZmluZWQgYnkgYCctJz9bMC05XStgLgorKiBBIGZsb2F0IGNvbnN0YW50IGlzIGRlZmluZWQgYnkKK2AnLSc/WzAtOV0rKCcuJ1swLTldKik/KFtlRV1bKy1dP1swLTkrXSk/YC4gT24gdG9wIG9mIHRoYXQsIGBOYU5gIGFuZAorYEluZmluaXR5YCBhcmUgYWxzbyBmbG9hdCBjb25zdGFudHMuCisqIEEgYm9vbGVhbiBjb25zdGFudCBpcyBlaXRoZXIgYHRydWVgIG9yIGBmYWxzZWAgdXAgdG8KK2Nhc2UtaW5zZW5zaXRpdml0eSAoaS5lLiBgVHJ1ZWAgaXMgYSB2YWxpZCBib29sZWFuIGNvbnN0YW50KS4KKyogQSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXZlcnNhbGx5X3VuaXF1ZV9pZGVudGlmaWVyW1VVSURdCitjb25zdGFudCBpcyBkZWZpbmVkIGJ5IGBoZXh7OH0taGV4ezR9LWhleHs0fS1oZXh7NH0taGV4ezEyfWAgd2hlcmUgYGhleGAKK2lzIGFuIGhleGFkZWNpbWFsIGNoYXJhY3RlciwgZS5nLiBgWzAtOWEtZkEtRl1gIGFuZCBgezR9YCBpcyB0aGUgbnVtYmVyCitvZiBzdWNoIGNoYXJhY3RlcnMuCisqIEEgYmxvYiBjb25zdGFudCBpcyBhbiBoZXhhZGVjaW1hbCBudW1iZXIgZGVmaW5lZCBieSBgMFt4WF0oaGV4KStgCit3aGVyZSBgaGV4YCBpcyBhbiBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIsIGUuZy4gYFswLTlhLWZBLUZdYC4KKworRm9yIGhvdyB0aGVzZSBjb25zdGFudHMgYXJlIHR5cGVkLCBzZWUgdGhlIGxpbms6I3R5cGVzW2RhdGEgdHlwZXMKK3NlY3Rpb25dLgorCis9PT09IENvbW1lbnRzCisKK0EgY29tbWVudCBpbiBDUUwgaXMgYSBsaW5lIGJlZ2lubmluZyBieSBlaXRoZXIgZG91YmxlIGRhc2hlcyAoYC0tYCkgb3IKK2RvdWJsZSBzbGFzaCAoYC8vYCkuCisKK011bHRpLWxpbmUgY29tbWVudHMgYXJlIGFsc28gc3VwcG9ydGVkIHRocm91Z2ggZW5jbG9zdXJlIHdpdGhpbiBgLypgIGFuZAorYCovYCAoYnV0IG5lc3RpbmcgaXMgbm90IHN1cHBvcnRlZCkuCisKK2JjKHNhbXBsZSkuICsKK+KAlCBUaGlzIGlzIGEgY29tbWVudCArCisvLyBUaGlzIGlzIGEgY29tbWVudCB0b28gKworLyogVGhpcyBpcyArCithIG11bHRpLWxpbmUgY29tbWVudCAqLworCis9PT09IFN0YXRlbWVudHMKKworQ1FMIGNvbnNpc3RzIG9mIHN0YXRlbWVudHMuIEFzIGluIFNRTCwgdGhlc2Ugc3RhdGVtZW50cyBjYW4gYmUgZGl2aWRlZAoraW4gMyBjYXRlZ29yaWVzOgorCisqIERhdGEgZGVmaW5pdGlvbiBzdGF0ZW1lbnRzLCB0aGF0IGFsbG93IHRvIHNldCBhbmQgY2hhbmdlIHRoZSB3YXkgZGF0YQoraXMgc3RvcmVkLgorKiBEYXRhIG1hbmlwdWxhdGlvbiBzdGF0ZW1lbnRzLCB0aGF0IGFsbG93IHRvIGNoYW5nZSBkYXRhCisqIFF1ZXJpZXMsIHRvIGxvb2sgdXAgZGF0YQorCitBbGwgc3RhdGVtZW50cyBlbmQgd2l0aCBhIHNlbWljb2xvbiAoYDtgKSBidXQgdGhhdCBzZW1pY29sb24gY2FuIGJlCitvbWl0dGVkIHdoZW4gZGVhbGluZyB3aXRoIGEgc2luZ2xlIHN0YXRlbWVudC4gVGhlIHN1cHBvcnRlZCBzdGF0ZW1lbnRzCithcmUgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMuIFdoZW4gZGVzY3JpYmluZyB0aGUgZ3JhbW1hciBvZgorc2FpZCBzdGF0ZW1lbnRzLCB3ZSB3aWxsIHJldXNlIHRoZSBub24tdGVybWluYWwgc3ltYm9scyBkZWZpbmVkIGJlbG93OgorCitiYyhzeW50YXgpLi4gKworOjo9IGFueSBxdW90ZWQgb3IgdW5xdW90ZWQgaWRlbnRpZmllciwgZXhjbHVkaW5nIHJlc2VydmVkIGtleXdvcmRzICsKKzo6PSAoIGAuJyk/CisKKzo6PSBhIHN0cmluZyBjb25zdGFudCArCis6Oj0gYW4gaW50ZWdlciBjb25zdGFudCArCis6Oj0gYSBmbG9hdCBjb25zdGFudCArCis6Oj0gfCAgKworOjo9IGEgdXVpZCBjb25zdGFudCArCis6Oj0gYSBib29sZWFuIGNvbnN0YW50ICsKKzo6PSBhIGJsb2IgY29uc3RhbnQKKworOjo9ICArCit8ICArCit8ICArCit8ICArCit8ICArCis6Oj0gYD8nICsKK3wgYDonICArCis6Oj0gICsKK3wgICsKK3wgICsKK3wgYCgnICggKGAsJyApKik/IGApJworCis6Oj0gICsKK3wgICsKK3wgICsKKzo6PSBgXHsnICggYDonICggYCwnIGA6JyApKiApPyBgfScgKworOjo9IGBceycgKCAoIGAsJyApKiApPyBgfScgKworOjo9IGBbJyAoICggYCwnICkqICk/IGBdJworCis6Oj0KKworOjo9IChBTkQgKSogKworOjo9IGA9JyAoIHwgfCApICsKK3AuICsKK1BsZWFzZSBub3RlIHRoYXQgbm90IGV2ZXJ5IHBvc3NpYmxlIHByb2R1Y3Rpb25zIG9mIHRoZSBncmFtbWFyIGFib3ZlCit3aWxsIGJlIHZhbGlkIGluIHByYWN0aWNlLiBNb3N0IG5vdGFibHksIGA8dmFyaWFibGU+YCBhbmQgbmVzdGVkCitgPGNvbGxlY3Rpb24tbGl0ZXJhbD5gIGFyZSBjdXJyZW50bHkgbm90IGFsbG93ZWQgaW5zaWRlCitgPGNvbGxlY3Rpb24tbGl0ZXJhbD5gLgorCitBIGA8dmFyaWFibGU+YCBjYW4gYmUgZWl0aGVyIGFub255bW91cyAoYSBxdWVzdGlvbiBtYXJrIChgP2ApKSBvciBuYW1lZAorKGFuIGlkZW50aWZpZXIgcHJlY2VkZWQgYnkgYDpgKS4gQm90aCBkZWNsYXJlIGEgYmluZCB2YXJpYWJsZXMgZm9yCitsaW5rOiNwcmVwYXJlZFN0YXRlbWVudFtwcmVwYXJlZCBzdGF0ZW1lbnRzXS4gVGhlIG9ubHkgZGlmZmVyZW5jZQorYmV0d2VlbiBhbiBhbnltb3VzIGFuZCBhIG5hbWVkIHZhcmlhYmxlIGlzIHRoYXQgYSBuYW1lZCBvbmUgd2lsbCBiZQorZWFzaWVyIHRvIHJlZmVyIHRvIChob3cgZXhhY3RseSBkZXBlbmRzIG9uIHRoZSBjbGllbnQgZHJpdmVyIHVzZWQpLgorCitUaGUgYDxwcm9wZXJ0aWVzPmAgcHJvZHVjdGlvbiBpcyB1c2UgYnkgc3RhdGVtZW50IHRoYXQgY3JlYXRlIGFuZCBhbHRlcgora2V5c3BhY2VzIGFuZCB0YWJsZXMuIEVhY2ggYDxwcm9wZXJ0eT5gIGlzIGVpdGhlciBhIF9zaW1wbGVfIG9uZSwgaW4KK3doaWNoIGNhc2UgaXQganVzdCBoYXMgYSB2YWx1ZSwgb3IgYSBfbWFwXyBvbmUsIGluIHdoaWNoIGNhc2UgaXTigJlzIHZhbHVlCitpcyBhIG1hcCBncm91cGluZyBzdWItb3B0aW9ucy4gVGhlIGZvbGxvd2luZyB3aWxsIHJlZmVyIHRvIG9uZSBvciB0aGUKK290aGVyIGFzIHRoZSBfa2luZF8gKF9zaW1wbGVfIG9yIF9tYXBfKSBvZiB0aGUgcHJvcGVydHkuCisKK0EgYDx0YWJsZW5hbWU+YCB3aWxsIGJlIHVzZWQgdG8gaWRlbnRpZnkgYSB0YWJsZS4gVGhpcyBpcyBhbiBpZGVudGlmaWVyCityZXByZXNlbnRpbmcgdGhlIHRhYmxlIG5hbWUgdGhhdCBjYW4gYmUgcHJlY2VkZWQgYnkgYSBrZXlzcGFjZSBuYW1lLiBUaGUKK2tleXNwYWNlIG5hbWUsIGlmIHByb3ZpZGVkLCBhbGxvdyB0byBpZGVudGlmeSBhIHRhYmxlIGluIGFub3RoZXIKK2tleXNwYWNlIHRoYW4gdGhlIGN1cnJlbnRseSBhY3RpdmUgb25lICh0aGUgY3VycmVudGx5IGFjdGl2ZSBrZXlzcGFjZSBpcworc2V0IHRocm91Z2ggdGhlIGBVU0VgIHN0YXRlbWVudCkuCisKK0ZvciBzdXBwb3J0ZWQgYDxmdW5jdGlvbj5gLCBzZWUgdGhlIHNlY3Rpb24gb24KK2xpbms6I2Z1bmN0aW9uc1tmdW5jdGlvbnNdLgorCitTdHJpbmdzIGNhbiBiZSBlaXRoZXIgZW5jbG9zZWQgd2l0aCBzaW5nbGUgcXVvdGVzIG9yIHR3byBkb2xsYXIKK2NoYXJhY3RlcnMuIFRoZSBzZWNvbmQgc3ludGF4IGhhcyBiZWVuIGludHJvZHVjZWQgdG8gYWxsb3cgc3RyaW5ncyB0aGF0Citjb250YWluIHNpbmdsZSBxdW90ZXMuIFR5cGljYWwgY2FuZGlkYXRlcyBmb3Igc3VjaCBzdHJpbmdzIGFyZSBzb3VyY2UKK2NvZGUgZnJhZ21lbnRzIGZvciB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLgorCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4uICsKK2Bzb21lIHN0cmluZyB2YWx1ZScKKworJCRkb3VibGUtZG9sbGFyIHN0cmluZyBjYW4gY29udGFpbiBzaW5nbGUg4oCZIHF1b3RlcyQkICsKK3AuCisKK1tbcHJlcGFyZWRTdGF0ZW1lbnRdXQorPT09PSBQcmVwYXJlZCBTdGF0ZW1lbnQKKworQ1FMIHN1cHBvcnRzIF9wcmVwYXJlZCBzdGF0ZW1lbnRzXy4gUHJlcGFyZWQgc3RhdGVtZW50IGlzIGFuCitvcHRpbWl6YXRpb24gdGhhdCBhbGxvd3MgdG8gcGFyc2UgYSBxdWVyeSBvbmx5IG9uY2UgYnV0IGV4ZWN1dGUgaXQKK211bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50IGNvbmNyZXRlIHZhbHVlcy4KKworSW4gYSBzdGF0ZW1lbnQsIGVhY2ggdGltZSBhIGNvbHVtbiB2YWx1ZSBpcyBleHBlY3RlZCAoaW4gdGhlIGRhdGEKK21hbmlwdWxhdGlvbiBhbmQgcXVlcnkgc3RhdGVtZW50cyksIGEgYDx2YXJpYWJsZT5gIChzZWUgYWJvdmUpIGNhbiBiZQordXNlZCBpbnN0ZWFkLiBBIHN0YXRlbWVudCB3aXRoIGJpbmQgdmFyaWFibGVzIG11c3QgdGhlbiBiZSBfcHJlcGFyZWRfLgorT25jZSBpdCBoYXMgYmVlbiBwcmVwYXJlZCwgaXQgY2FuIGV4ZWN1dGVkIGJ5IHByb3ZpZGluZyBjb25jcmV0ZSB2YWx1ZXMKK2ZvciB0aGUgYmluZCB2YXJpYWJsZXMuIFRoZSBleGFjdCBwcm9jZWR1cmUgdG8gcHJlcGFyZSBhIHN0YXRlbWVudCBhbmQKK2V4ZWN1dGUgYSBwcmVwYXJlZCBzdGF0ZW1lbnQgZGVwZW5kcyBvbiB0aGUgQ1FMIGRyaXZlciB1c2VkIGFuZCBpcworYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzIGRvY3VtZW50LgorCitJbiBhZGRpdGlvbiB0byBwcm92aWRpbmcgY29sdW1uIHZhbHVlcywgYmluZCBtYXJrZXJzIG1heSBiZSB1c2VkIHRvCitwcm92aWRlIHZhbHVlcyBmb3IgYExJTUlUYCwgYFRJTUVTVEFNUGAsIGFuZCBgVFRMYCBjbGF1c2VzLiBJZiBhbm9ueW1vdXMKK2JpbmQgbWFya2VycyBhcmUgdXNlZCwgdGhlIG5hbWVzIGZvciB0aGUgcXVlcnkgcGFyYW1ldGVycyB3aWxsIGJlCitgW2xpbWl0XWAsIGBbdGltZXN0YW1wXWAsIGFuZCBgW3R0bF1gLCByZXNwZWN0aXZlbHkuCisKK1tbZGF0YURlZmluaXRpb25dXQorPT09IERhdGEgRGVmaW5pdGlvbgorCitbW2NyZWF0ZUtleXNwYWNlU3RtdF1dCis9PT09IENSRUFURSBLRVlTUEFDRQorCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4uICsKKzo6PSBDUkVBVEUgS0VZU1BBQ0UgKElGIE5PVCBFWElTVFMpPyBXSVRIICArCitwLiArCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4uICsKK0NSRUFURSBLRVlTUEFDRSBFeGNlbHNpb3IgKworV0lUSCByZXBsaWNhdGlvbiA9IFx74oCZY2xhc3PigJk6IGBTaW1wbGVTdHJhdGVneScsIGByZXBsaWNhdGlvbl9mYWN0b3InIDoKKzN9OworCitDUkVBVEUgS0VZU1BBQ0UgRXhjYWxpYnVyICsKK1dJVEggcmVwbGljYXRpb24gPSBce+KAmWNsYXNz4oCZOiBgTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCBgREMxJyA6IDEsCitgREMyJyA6IDN9ICsKK0FORCBkdXJhYmxlX3dyaXRlcyA9IGZhbHNlOyArCitwLiArCitUaGUgYENSRUFURSBLRVlTUEFDRWAgc3RhdGVtZW50IGNyZWF0ZXMgYSBuZXcgdG9wLWxldmVsIF9rZXlzcGFjZV8uIEEKK2tleXNwYWNlIGlzIGEgbmFtZXNwYWNlIHRoYXQgZGVmaW5lcyBhIHJlcGxpY2F0aW9uIHN0cmF0ZWd5IGFuZCBzb21lCitvcHRpb25zIGZvciBhIHNldCBvZiB0YWJsZXMuIFZhbGlkIGtleXNwYWNlcyBuYW1lcyBhcmUgaWRlbnRpZmllcnMKK2NvbXBvc2VkIGV4Y2x1c2l2ZWx5IG9mIGFscGhhbnVtZXJpY2FsIGNoYXJhY3RlcnMgYW5kIHdob3NlIGxlbmd0aCBpcworbGVzc2VyIG9yIGVxdWFsIHRvIDMyLiBOb3RlIHRoYXQgYXMgaWRlbnRpZmllcnMsIGtleXNwYWNlIG5hbWVzIGFyZSBjYXNlCitpbnNlbnNpdGl2ZTogdXNlIGEgcXVvdGVkIGlkZW50aWZpZXIgZm9yIGNhc2Ugc2Vuc2l0aXZlIGtleXNwYWNlIG5hbWVzLgorCitUaGUgc3VwcG9ydGVkIGA8cHJvcGVydGllcz5gIGZvciBgQ1JFQVRFIEtFWVNQQUNFYCBhcmU6CisKK1tjb2xzPSIsLCwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xuYW1lIHxraW5kIHxtYW5kYXRvcnkgfGRlZmF1bHQgfGRlc2NyaXB0aW9uCit8YHJlcGxpY2F0aW9uYCB8X21hcF8gfHllcyB8IHxUaGUgcmVwbGljYXRpb24gc3RyYXRlZ3kgYW5kIG9wdGlvbnMgdG8KK3VzZSBmb3IgdGhlIGtleXNwYWNlLgorCit8YGR1cmFibGVfd3JpdGVzYCB8X3NpbXBsZV8gfG5vIHx0cnVlIHxXaGV0aGVyIHRvIHVzZSB0aGUgY29tbWl0IGxvZyBmb3IKK3VwZGF0ZXMgb24gdGhpcyBrZXlzcGFjZSAoZGlzYWJsZSB0aGlzIG9wdGlvbiBhdCB5b3VyIG93biByaXNrISkuCit8PT09CisKK1RoZSBgcmVwbGljYXRpb25gIGA8cHJvcGVydHk+YCBpcyBtYW5kYXRvcnkuIEl0IG11c3QgYXQgbGVhc3QgY29udGFpbnMKK3RoZSBgJ2NsYXNzJ2Agc3ViLW9wdGlvbiB3aGljaCBkZWZpbmVzIHRoZSByZXBsaWNhdGlvbiBzdHJhdGVneSBjbGFzcyB0bwordXNlLiBUaGUgcmVzdCBvZiB0aGUgc3ViLW9wdGlvbnMgZGVwZW5kcyBvbiB0aGF0IHJlcGxpY2F0aW9uIHN0cmF0ZWd5CitjbGFzcy4gQnkgZGVmYXVsdCwgQ2Fzc2FuZHJhIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBgJ2NsYXNzJ2A6CisKKyogYCdTaW1wbGVTdHJhdGVneSdgOiBBIHNpbXBsZSBzdHJhdGVneSB0aGF0IGRlZmluZXMgYSBzaW1wbGUKK3JlcGxpY2F0aW9uIGZhY3RvciBmb3IgdGhlIHdob2xlIGNsdXN0ZXIuIFRoZSBvbmx5IHN1Yi1vcHRpb25zIHN1cHBvcnRlZAoraXMgYCdyZXBsaWNhdGlvbl9mYWN0b3InYCB0byBkZWZpbmUgdGhhdCByZXBsaWNhdGlvbiBmYWN0b3IgYW5kIGlzCittYW5kYXRvcnkuCisqIGAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knYDogQSByZXBsaWNhdGlvbiBzdHJhdGVneSB0aGF0IGFsbG93cyB0byBzZXQKK3RoZSByZXBsaWNhdGlvbiBmYWN0b3IgaW5kZXBlbmRlbnRseSBmb3IgZWFjaCBkYXRhLWNlbnRlci4gVGhlIHJlc3Qgb2YKK3RoZSBzdWItb3B0aW9ucyBhcmUga2V5LXZhbHVlIHBhaXJzIHdoZXJlIGVhY2ggdGltZSB0aGUga2V5IGlzIHRoZSBuYW1lCitvZiBhIGRhdGFjZW50ZXIgYW5kIHRoZSB2YWx1ZSB0aGUgcmVwbGljYXRpb24gZmFjdG9yIGZvciB0aGF0CitkYXRhLWNlbnRlci4KKworQXR0ZW1wdGluZyB0byBjcmVhdGUgYW4gYWxyZWFkeSBleGlzdGluZyBrZXlzcGFjZSB3aWxsIHJldHVybiBhbiBlcnJvcgordW5sZXNzIHRoZSBgSUYgTk9UIEVYSVNUU2Agb3B0aW9uIGlzIHVzZWQuIElmIGl0IGlzIHVzZWQsIHRoZSBzdGF0ZW1lbnQKK3dpbGwgYmUgYSBuby1vcCBpZiB0aGUga2V5c3BhY2UgYWxyZWFkeSBleGlzdHMuCisKK1tbdXNlU3RtdF1dCis9PT09IFVTRQorCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4gOjo9IFVTRQorCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4gVVNFIG15QXBwOworCitUaGUgYFVTRWAgc3RhdGVtZW50IHRha2VzIGFuIGV4aXN0aW5nIGtleXNwYWNlIG5hbWUgYXMgYXJndW1lbnQgYW5kIHNldAoraXQgYXMgdGhlIHBlci1jb25uZWN0aW9uIGN1cnJlbnQgd29ya2luZyBrZXlzcGFjZS4gQWxsIHN1YnNlcXVlbnQKK2tleXNwYWNlLXNwZWNpZmljIGFjdGlvbnMgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlCitzZWxlY3RlZCBrZXlzcGFjZSwgdW5sZXNzIGxpbms6I3N0YXRlbWVudHNbb3RoZXJ3aXNlIHNwZWNpZmllZF0sIHVudGlsCithbm90aGVyIFVTRSBzdGF0ZW1lbnQgaXMgaXNzdWVkIG9yIHRoZSBjb25uZWN0aW9uIHRlcm1pbmF0ZXMuCisKK1tbYWx0ZXJLZXlzcGFjZVN0bXRdXQorPT09PSBBTFRFUiBLRVlTUEFDRQorCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4uICsKKzo6PSBBTFRFUiBLRVlTUEFDRSAoSUYgRVhJU1RTKT8gV0lUSCAgKworcC4gKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuLiArCitBTFRFUiBLRVlTUEFDRSBFeGNlbHNpb3IgKworV0lUSCByZXBsaWNhdGlvbiA9IFx74oCZY2xhc3PigJk6IGBTaW1wbGVTdHJhdGVneScsIGByZXBsaWNhdGlvbl9mYWN0b3InIDoKKzR9OworCitUaGUgYEFMVEVSIEtFWVNQQUNFYCBzdGF0ZW1lbnQgYWx0ZXJzIHRoZSBwcm9wZXJ0aWVzIG9mIGFuIGV4aXN0aW5nCitrZXlzcGFjZS4gVGhlIHN1cHBvcnRlZCBgPHByb3BlcnRpZXM+YCBhcmUgdGhlIHNhbWUgYXMgZm9yIHRoZQorbGluazojY3JlYXRlS2V5c3BhY2VTdG10W2BDUkVBVEUgS0VZU1BBQ0VgXSBzdGF0ZW1lbnQuCisKK1tbZHJvcEtleXNwYWNlU3RtdF1dCis9PT09IERST1AgS0VZU1BBQ0UKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuIDo6PSBEUk9QIEtFWVNQQUNFICggSUYgRVhJU1RTICk/CisKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLiBEUk9QIEtFWVNQQUNFIG15QXBwOworCitBIGBEUk9QIEtFWVNQQUNFYCBzdGF0ZW1lbnQgcmVzdWx0cyBpbiB0aGUgaW1tZWRpYXRlLCBpcnJldmVyc2libGUKK3JlbW92YWwgb2YgYW4gZXhpc3Rpbmcga2V5c3BhY2UsIGluY2x1ZGluZyBhbGwgY29sdW1uIGZhbWlsaWVzIGluIGl0LAorYW5kIGFsbCBkYXRhIGNvbnRhaW5lZCBpbiB0aG9zZSBjb2x1bW4gZmFtaWxpZXMuCisKK0lmIHRoZSBrZXlzcGFjZSBkb2VzIG5vdCBleGlzdHMsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsCit1bmxlc3MgYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KKworW1tjcmVhdGVUYWJsZVN0bXRdXQorPT09PSBDUkVBVEUgVEFCTEUKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuLiArCis6Oj0gQ1JFQVRFICggVEFCTEUgfCBDT0xVTU5GQU1JTFkgKSAoIElGIE5PVCBFWElTVFMgKT8gICsKK2AoJyAoIGAsJyApKiBgKScgKworKCBXSVRIICggQU5EICkqICk/CisKKzo6PSAoIFNUQVRJQyApPyAoIFBSSU1BUlkgS0VZICk/ICsKK3wgUFJJTUFSWSBLRVkgYCgnICggYCwnICkqIGApJworCis6Oj0gICsKK3wgYCgnIChgLCcgKSogYCknCisKKzo6PSAgKworfCBDT01QQUNUIFNUT1JBR0UgKworfCBDTFVTVEVSSU5HIE9SREVSICsKK3AuICsKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLi4gKworQ1JFQVRFIFRBQkxFIG1vbmtleVNwZWNpZXMgKCArCitzcGVjaWVzIHRleHQgUFJJTUFSWSBLRVksICsKK2NvbW1vbl9uYW1lIHRleHQsICsKK3BvcHVsYXRpb24gdmFyaW50LCArCithdmVyYWdlX3NpemUgaW50ICsKKykgV0lUSCBjb21tZW50PWBJbXBvcnRhbnQgYmlvbG9naWNhbCByZWNvcmRzJzsKKworQ1JFQVRFIFRBQkxFIHRpbWVsaW5lICggKwordXNlcmlkIHV1aWQsICsKK3Bvc3RlZF9tb250aCBpbnQsICsKK3Bvc3RlZF90aW1lIHV1aWQsICsKK2JvZHkgdGV4dCwgKworcG9zdGVkX2J5IHRleHQsICsKK1BSSU1BUlkgS0VZICh1c2VyaWQsIHBvc3RlZF9tb250aCwgcG9zdGVkX3RpbWUpICsKKykgV0lUSCBjb21wYWN0aW9uID0gXHsgYGNsYXNzJyA6IGBMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5JyB9OyArCitwLiArCitUaGUgYENSRUFURSBUQUJMRWAgc3RhdGVtZW50IGNyZWF0ZXMgYSBuZXcgdGFibGUuIEVhY2ggc3VjaCB0YWJsZSBpcyBhCitzZXQgb2YgX3Jvd3NfICh1c3VhbGx5IHJlcHJlc2VudGluZyByZWxhdGVkIGVudGl0aWVzKSBmb3Igd2hpY2ggaXQKK2RlZmluZXMgYSBudW1iZXIgb2YgcHJvcGVydGllcy4gQSB0YWJsZSBpcyBkZWZpbmVkIGJ5IGEKK2xpbms6I2NyZWF0ZVRhYmxlTmFtZVtuYW1lXSwgaXQgZGVmaW5lcyB0aGUgY29sdW1ucyBjb21wb3Npbmcgcm93cyBvZgordGhlIHRhYmxlIGFuZCBoYXZlIGEgbnVtYmVyIG9mIGxpbms6I2NyZWF0ZVRhYmxlT3B0aW9uc1tvcHRpb25zXS4gTm90ZQordGhhdCB0aGUgYENSRUFURSBDT0xVTU5GQU1JTFlgIHN5bnRheCBpcyBzdXBwb3J0ZWQgYXMgYW4gYWxpYXMgZm9yCitgQ1JFQVRFIFRBQkxFYCAoZm9yIGhpc3RvcmljYWwgcmVhc29ucykuCisKK0F0dGVtcHRpbmcgdG8gY3JlYXRlIGFuIGFscmVhZHkgZXhpc3RpbmcgdGFibGUgd2lsbCByZXR1cm4gYW4gZXJyb3IKK3VubGVzcyB0aGUgYElGIE5PVCBFWElTVFNgIG9wdGlvbiBpcyB1c2VkLiBJZiBpdCBpcyB1c2VkLCB0aGUgc3RhdGVtZW50Cit3aWxsIGJlIGEgbm8tb3AgaWYgdGhlIHRhYmxlIGFscmVhZHkgZXhpc3RzLgorCitbW2NyZWF0ZVRhYmxlTmFtZV1dCis9PT09PSBgPHRhYmxlbmFtZT5gCisKK1ZhbGlkIHRhYmxlIG5hbWVzIGFyZSB0aGUgc2FtZSBhcyB2YWxpZAorbGluazojY3JlYXRlS2V5c3BhY2VTdG10W2tleXNwYWNlIG5hbWVzXSAodXAgdG8gMzIgY2hhcmFjdGVycyBsb25nCithbHBoYW51bWVyaWNhbCBpZGVudGlmaWVycykuIElmIHRoZSB0YWJsZSBuYW1lIGlzIHByb3ZpZGVkIGFsb25lLCB0aGUKK3RhYmxlIGlzIGNyZWF0ZWQgd2l0aGluIHRoZSBjdXJyZW50IGtleXNwYWNlIChzZWUgYFVTRWApLCBidXQgaWYgaXQgaXMKK3ByZWZpeGVkIGJ5IGFuIGV4aXN0aW5nIGtleXNwYWNlIG5hbWUgKHNlZQorbGluazojc3RhdGVtZW50c1tgPHRhYmxlbmFtZT5gXSBncmFtbWFyKSwgaXQgaXMgY3JlYXRlZCBpbiB0aGUgc3BlY2lmaWVkCitrZXlzcGFjZSAoYnV0IGRvZXMgKm5vdCogY2hhbmdlIHRoZSBjdXJyZW50IGtleXNwYWNlKS4KKworW1tjcmVhdGVUYWJsZUNvbHVtbl1dCis9PT09PSBgPGNvbHVtbi1kZWZpbml0aW9uPmAKKworQSBgQ1JFQVRFIFRBQkxFYCBzdGF0ZW1lbnQgZGVmaW5lcyB0aGUgY29sdW1ucyB0aGF0IHJvd3Mgb2YgdGhlIHRhYmxlCitjYW4gaGF2ZS4gQSBfY29sdW1uXyBpcyBkZWZpbmVkIGJ5IGl0cyBuYW1lIChhbiBpZGVudGlmaWVyKSBhbmQgaXRzIHR5cGUKKyhzZWUgdGhlIGxpbms6I3R5cGVzW2RhdGEgdHlwZXNdIHNlY3Rpb24gZm9yIG1vcmUgZGV0YWlscyBvbiBhbGxvd2VkCit0eXBlcyBhbmQgdGhlaXIgcHJvcGVydGllcykuCisKK1dpdGhpbiBhIHRhYmxlLCBhIHJvdyBpcyB1bmlxdWVseSBpZGVudGlmaWVkIGJ5IGl0cyBgUFJJTUFSWSBLRVlgIChvcgorbW9yZSBzaW1wbHkgdGhlIGtleSksIGFuZCBoZW5jZSBhbGwgdGFibGUgZGVmaW5pdGlvbnMgKm11c3QqIGRlZmluZSBhCitQUklNQVJZIEtFWSAoYW5kIG9ubHkgb25lKS4gQSBgUFJJTUFSWSBLRVlgIGlzIGNvbXBvc2VkIG9mIG9uZSBvciBtb3JlCitvZiB0aGUgY29sdW1ucyBkZWZpbmVkIGluIHRoZSB0YWJsZS4gSWYgdGhlIGBQUklNQVJZIEtFWWAgaXMgb25seSBvbmUKK2NvbHVtbiwgdGhpcyBjYW4gYmUgc3BlY2lmaWVkIGRpcmVjdGx5IGFmdGVyIHRoZSBjb2x1bW4gZGVmaW5pdGlvbi4KK090aGVyd2lzZSwgaXQgbXVzdCBiZSBzcGVjaWZpZWQgYnkgZm9sbG93aW5nIGBQUklNQVJZIEtFWWAgYnkgdGhlCitjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBjb2x1bW4gbmFtZXMgY29tcG9zaW5nIHRoZSBrZXkgd2l0aGluCitwYXJlbnRoZXNpcy4gTm90ZSB0aGF0OgorCitiYyhzYW1wbGUpLiArCitDUkVBVEUgVEFCTEUgdCAoICsKK2sgaW50IFBSSU1BUlkgS0VZLCArCitvdGhlciB0ZXh0ICsKKykKKworaXMgZXF1aXZhbGVudCB0bworCitiYyhzYW1wbGUpLiArCitDUkVBVEUgVEFCTEUgdCAoICsKK2sgaW50LCArCitvdGhlciB0ZXh0LCArCitQUklNQVJZIEtFWSAoaykgKworKQorCitbW2NyZWF0ZVRhYmxlcGFydGl0aW9uQ2x1c3RlcmluZ11dCis9PT09PSBQYXJ0aXRpb24ga2V5IGFuZCBjbHVzdGVyaW5nIGNvbHVtbnMKKworSW4gQ1FMLCB0aGUgb3JkZXIgaW4gd2hpY2ggY29sdW1ucyBhcmUgZGVmaW5lZCBmb3IgdGhlIGBQUklNQVJZIEtFWWAKK21hdHRlcnMuIFRoZSBmaXJzdCBjb2x1bW4gb2YgdGhlIGtleSBpcyBjYWxsZWQgdGhlIF9wYXJ0aXRpb24ga2V5Xy4gSXQKK2hhcyB0aGUgcHJvcGVydHkgdGhhdCBhbGwgdGhlIHJvd3Mgc2hhcmluZyB0aGUgc2FtZSBwYXJ0aXRpb24ga2V5IChldmVuCithY3Jvc3MgdGFibGUgaW4gZmFjdCkgYXJlIHN0b3JlZCBvbiB0aGUgc2FtZSBwaHlzaWNhbCBub2RlLiBBbHNvLAoraW5zZXJ0aW9uL3VwZGF0ZS9kZWxldGlvbiBvbiByb3dzIHNoYXJpbmcgdGhlIHNhbWUgcGFydGl0aW9uIGtleSBmb3IgYQorZ2l2ZW4gdGFibGUgYXJlIHBlcmZvcm1lZCBfYXRvbWljYWxseV8gYW5kIGluIF9pc29sYXRpb25fLiBOb3RlIHRoYXQgaXQKK2lzIHBvc3NpYmxlIHRvIGhhdmUgYSBjb21wb3NpdGUgcGFydGl0aW9uIGtleSwgaS5lLiBhIHBhcnRpdGlvbiBrZXkKK2Zvcm1lZCBvZiBtdWx0aXBsZSBjb2x1bW5zLCB1c2luZyBhbiBleHRyYSBzZXQgb2YgcGFyZW50aGVzZXMgdG8gZGVmaW5lCit3aGljaCBjb2x1bW5zIGZvcm1zIHRoZSBwYXJ0aXRpb24ga2V5LgorCitUaGUgcmVtYWluaW5nIGNvbHVtbnMgb2YgdGhlIGBQUklNQVJZIEtFWWAgZGVmaW5pdGlvbiwgaWYgYW55LCBhcmUKK2NhbGxlZCBfX2NsdXN0ZXJpbmcgY29sdW1ucy4gT24gYSBnaXZlbiBwaHlzaWNhbCBub2RlLCByb3dzIGZvciBhIGdpdmVuCitwYXJ0aXRpb24ga2V5IGFyZSBzdG9yZWQgaW4gdGhlIG9yZGVyIGluZHVjZWQgYnkgdGhlIGNsdXN0ZXJpbmcgY29sdW1ucywKK21ha2luZyB0aGUgcmV0cmlldmFsIG9mIHJvd3MgaW4gdGhhdCBjbHVzdGVyaW5nIG9yZGVyIHBhcnRpY3VsYXJseQorZWZmaWNpZW50IChzZWUgYFNFTEVDVGApLgorCitbW2NyZWF0ZVRhYmxlU3RhdGljXV0KKz09PT09IGBTVEFUSUNgIGNvbHVtbnMKKworU29tZSBjb2x1bW5zIGNhbiBiZSBkZWNsYXJlZCBhcyBgU1RBVElDYCBpbiBhIHRhYmxlIGRlZmluaXRpb24uIEEgY29sdW1uCit0aGF0IGlzIHN0YXRpYyB3aWxsIGJlIGBgc2hhcmVkJycgYnkgYWxsIHRoZSByb3dzIGJlbG9uZ2luZyB0byB0aGUgc2FtZQorcGFydGl0aW9uIChoYXZpbmcgdGhlIHNhbWUgcGFydGl0aW9uIGtleSkuIEZvciBpbnN0YW5jZSwgaW46CisKK2JjKHNhbXBsZSkuICsKK0NSRUFURSBUQUJMRSB0ZXN0ICggKworcGsgaW50LCArCit0IGludCwgKwordiB0ZXh0LCArCitzIHRleHQgc3RhdGljLCArCitQUklNQVJZIEtFWSAocGssIHQpICsKKyk7ICsKK0lOU0VSVCBJTlRPIHRlc3QocGssIHQsIHYsIHMpIFZBTFVFUyAoMCwgMCwgYHZhbDAnLCBgc3RhdGljMCcpOyArCitJTlNFUlQgSU5UTyB0ZXN0KHBrLCB0LCB2LCBzKSBWQUxVRVMgKDAsIDEsIGB2YWwxJywgYHN0YXRpYzEnKTsgKworU0VMRUNUICogRlJPTSB0ZXN0IFdIRVJFIHBrPTAgQU5EIHQ9MDsKKwordGhlIGxhc3QgcXVlcnkgd2lsbCByZXR1cm4gYCdzdGF0aWMxJ2AgYXMgdmFsdWUgZm9yIGBzYCwgc2luY2UgYHNgIGlzCitzdGF0aWMgYW5kIHRodXMgdGhlIDJuZCBpbnNlcnRpb24gbW9kaWZpZWQgdGhpcyBgYHNoYXJlZCcnIHZhbHVlLiBOb3RlCitob3dldmVyIHRoYXQgc3RhdGljIGNvbHVtbnMgYXJlIG9ubHkgc3RhdGljIHdpdGhpbiBhIGdpdmVuIHBhcnRpdGlvbiwKK2FuZCBpZiBpbiB0aGUgZXhhbXBsZSBhYm92ZSBib3RoIHJvd3Mgd2hlcmUgZnJvbSBkaWZmZXJlbnQgcGFydGl0aW9ucworKGkuZS4gaWYgdGhleSBoYWQgZGlmZmVyZW50IHZhbHVlIGZvciBgcGtgKSwgdGhlbiB0aGUgMm5kIGluc2VydGlvbgord291bGQgbm90IGhhdmUgbW9kaWZpZWQgdGhlIHZhbHVlIG9mIGBzYCBmb3IgdGhlIGZpcnN0IHJvdy4KKworQSBmZXcgcmVzdHJpY3Rpb25zIGFwcGxpZXMgdG8gd2hlbiBzdGF0aWMgY29sdW1ucyBhcmUgYWxsb3dlZDoKKworKiB0YWJsZXMgd2l0aCB0aGUgYENPTVBBQ1QgU1RPUkFHRWAgb3B0aW9uIChzZWUgYmVsb3cpIGNhbm5vdCBoYXZlIHRoZW0KKyogYSB0YWJsZSB3aXRob3V0IGNsdXN0ZXJpbmcgY29sdW1ucyBjYW5ub3QgaGF2ZSBzdGF0aWMgY29sdW1ucyAoaW4gYQordGFibGUgd2l0aG91dCBjbHVzdGVyaW5nIGNvbHVtbnMsIGV2ZXJ5IHBhcnRpdGlvbiBoYXMgb25seSBvbmUgcm93LCBhbmQKK3NvIGV2ZXJ5IGNvbHVtbiBpcyBpbmhlcmVudGx5IHN0YXRpYykuCisqIG9ubHkgbm9uIGBQUklNQVJZIEtFWWAgY29sdW1ucyBjYW4gYmUgc3RhdGljCisKK1tbY3JlYXRlVGFibGVPcHRpb25zXV0KKz09PT09IGA8b3B0aW9uPmAKKworVGhlIGBDUkVBVEUgVEFCTEVgIHN0YXRlbWVudCBzdXBwb3J0cyBhIG51bWJlciBvZiBvcHRpb25zIHRoYXQgY29udHJvbHMKK3RoZSBjb25maWd1cmF0aW9uIG9mIGEgbmV3IHRhYmxlLiBUaGVzZSBvcHRpb25zIGNhbiBiZSBzcGVjaWZpZWQgYWZ0ZXIKK3RoZSBgV0lUSGAga2V5d29yZC4KKworVGhlIGZpcnN0IG9mIHRoZXNlIG9wdGlvbiBpcyBgQ09NUEFDVCBTVE9SQUdFYC4gVGhpcyBvcHRpb24gaXMgbWFpbmx5Cit0YXJnZXRlZCB0b3dhcmRzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIGRlZmluaXRpb25zIGNyZWF0ZWQgYmVmb3JlCitDUUwzIChzZWUKK2h0dHA6Ly93d3cuZGF0YXN0YXguY29tL2Rldi9ibG9nL3RocmlmdC10by1jcWwzW3d3dy5kYXRhc3RheC5jb20vZGV2L2Jsb2cvdGhyaWZ0LXRvLWNxbDNdCitmb3IgbW9yZSBkZXRhaWxzKS4gVGhlIG9wdGlvbiBhbHNvIHByb3ZpZGVzIGEgc2xpZ2h0bHkgbW9yZSBjb21wYWN0CitsYXlvdXQgb2YgZGF0YSBvbiBkaXNrIGJ1dCBhdCB0aGUgcHJpY2Ugb2YgZGltaW5pc2hlZCBmbGV4aWJpbGl0eSBhbmQKK2V4dGVuc2liaWxpdHkgZm9yIHRoZSB0YWJsZS4gTW9zdCBub3RhYmx5LCBgQ09NUEFDVCBTVE9SQUdFYCB0YWJsZXMKK2Nhbm5vdCBoYXZlIGNvbGxlY3Rpb25zIG5vciBzdGF0aWMgY29sdW1ucyBhbmQgYSBgQ09NUEFDVCBTVE9SQUdFYCB0YWJsZQord2l0aCBhdCBsZWFzdCBvbmUgY2x1c3RlcmluZyBjb2x1bW4gc3VwcG9ydHMgZXhhY3RseSBvbmUgKGFzIGluIG5vdCAwCitub3IgbW9yZSB0aGFuIDEpIGNvbHVtbiBub3QgcGFydCBvZiB0aGUgYFBSSU1BUlkgS0VZYCBkZWZpbml0aW9uICh3aGljaAoraW1wbHkgaW4gcGFydGljdWxhciB0aGF0IHlvdSBjYW5ub3QgYWRkIG5vciByZW1vdmUgY29sdW1ucyBhZnRlcgorY3JlYXRpb24pLiBGb3IgdGhvc2UgcmVhc29ucywgYENPTVBBQ1QgU1RPUkFHRWAgaXMgbm90IHJlY29tbWVuZGVkCitvdXRzaWRlIG9mIHRoZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHJlYXNvbiBldm9rZWQgYWJvdmUuCisKK0Fub3RoZXIgb3B0aW9uIGlzIGBDTFVTVEVSSU5HIE9SREVSYC4gSXQgYWxsb3dzIHRvIGRlZmluZSB0aGUgb3JkZXJpbmcKK29mIHJvd3Mgb24gZGlzay4gSXQgdGFrZXMgdGhlIGxpc3Qgb2YgdGhlIGNsdXN0ZXJpbmcgY29sdW1uIG5hbWVzIHdpdGgsCitmb3IgZWFjaCBvZiB0aGVtLCB0aGUgb24tZGlzayBvcmRlciAoQXNjZW5kaW5nIG9yIGRlc2NlbmRpbmcpLiBOb3RlIHRoYXQKK3RoaXMgb3B0aW9uIGFmZmVjdHMgbGluazojc2VsZWN0T3JkZXJCeVt3aGF0IGBPUkRFUiBCWWAgYXJlIGFsbG93ZWQKK2R1cmluZyBgU0VMRUNUYF0uCisKK1RhYmxlIGNyZWF0aW9uIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgb3RoZXIgYDxwcm9wZXJ0eT5gOgorCitbY29scz0iLCwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xvcHRpb24gfGtpbmQgfGRlZmF1bHQgfGRlc2NyaXB0aW9uCit8YGNvbW1lbnRgIHxfc2ltcGxlXyB8bm9uZSB8QSBmcmVlLWZvcm0sIGh1bWFuLXJlYWRhYmxlIGNvbW1lbnQuCisKK3xgZ2NfZ3JhY2Vfc2Vjb25kc2AgfF9zaW1wbGVfIHw4NjQwMDAgfFRpbWUgdG8gd2FpdCBiZWZvcmUgZ2FyYmFnZQorY29sbGVjdGluZyB0b21ic3RvbmVzIChkZWxldGlvbiBtYXJrZXJzKS4KKworfGBibG9vbV9maWx0ZXJfZnBfY2hhbmNlYCB8X3NpbXBsZV8gfDAuMDAwNzUgfFRoZSB0YXJnZXQgcHJvYmFiaWxpdHkgb2YKK2ZhbHNlIHBvc2l0aXZlIG9mIHRoZSBzc3RhYmxlIGJsb29tIGZpbHRlcnMuIFNhaWQgYmxvb20gZmlsdGVycyB3aWxsIGJlCitzaXplZCB0byBwcm92aWRlIHRoZSBwcm92aWRlZCBwcm9iYWJpbGl0eSAodGh1cyBsb3dlcmluZyB0aGlzIHZhbHVlCitpbXBhY3QgdGhlIHNpemUgb2YgYmxvb20gZmlsdGVycyBpbi1tZW1vcnkgYW5kIG9uLWRpc2spCisKK3xgZGVmYXVsdF90aW1lX3RvX2xpdmVgIHxfc2ltcGxlXyB8MCB8VGhlIGRlZmF1bHQgZXhwaXJhdGlvbiB0aW1lCisoYGBUVEwnJykgaW4gc2Vjb25kcyBmb3IgYSB0YWJsZS4KKworfGBjb21wYWN0aW9uYCB8X21hcF8gfF9zZWUgYmVsb3dfIHxDb21wYWN0aW9uIG9wdGlvbnMsIHNlZQorbGluazojY29tcGFjdGlvbk9wdGlvbnNbYmVsb3ddLgorCit8YGNvbXByZXNzaW9uYCB8X21hcF8gfF9zZWUgYmVsb3dfIHxDb21wcmVzc2lvbiBvcHRpb25zLCBzZWUKK2xpbms6I2NvbXByZXNzaW9uT3B0aW9uc1tiZWxvd10uCisKK3xgY2FjaGluZ2AgfF9tYXBfIHxfc2VlIGJlbG93XyB8Q2FjaGluZyBvcHRpb25zLCBzZWUKK2xpbms6I2NhY2hpbmdPcHRpb25zW2JlbG93XS4KK3w9PT0KKworW1tjb21wYWN0aW9uT3B0aW9uc11dCis9PT09PSBDb21wYWN0aW9uIG9wdGlvbnMKKworVGhlIGBjb21wYWN0aW9uYCBwcm9wZXJ0eSBtdXN0IGF0IGxlYXN0IGRlZmluZSB0aGUgYCdjbGFzcydgIHN1Yi1vcHRpb24sCit0aGF0IGRlZmluZXMgdGhlIGNvbXBhY3Rpb24gc3RyYXRlZ3kgY2xhc3MgdG8gdXNlLiBUaGUgZGVmYXVsdCBzdXBwb3J0ZWQKK2NsYXNzIGFyZSBgJ1NpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3knYCwKK2AnTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneSdgIGFuZAorYCdUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5J2AuIEN1c3RvbSBzdHJhdGVneSBjYW4gYmUgcHJvdmlkZWQgYnkKK3NwZWNpZnlpbmcgdGhlIGZ1bGwgY2xhc3MgbmFtZSBhcyBhIGxpbms6I2NvbnN0YW50c1tzdHJpbmcgY29uc3RhbnRdLgorVGhlIHJlc3Qgb2YgdGhlIHN1Yi1vcHRpb25zIGRlcGVuZHMgb24gdGhlIGNob3NlbiBjbGFzcy4gVGhlIHN1Yi1vcHRpb25zCitzdXBwb3J0ZWQgYnkgdGhlIGRlZmF1bHQgY2xhc3NlcyBhcmU6CisKK1tjb2xzPSIsLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfG9wdGlvbiB8c3VwcG9ydGVkIGNvbXBhY3Rpb24gc3RyYXRlZ3kgfGRlZmF1bHQgfGRlc2NyaXB0aW9uCit8YGVuYWJsZWRgIHxfYWxsXyB8dHJ1ZSB8QSBib29sZWFuIGRlbm90aW5nIHdoZXRoZXIgY29tcGFjdGlvbiBzaG91bGQgYmUKK2VuYWJsZWQgb3Igbm90LgorCit8YHRvbWJzdG9uZV90aHJlc2hvbGRgIHxfYWxsXyB8MC4yIHxBIHJhdGlvIHN1Y2ggdGhhdCBpZiBhIHNzdGFibGUgaGFzCittb3JlIHRoYW4gdGhpcyByYXRpbyBvZiBnY2FibGUgdG9tYnN0b25lcyBvdmVyIGFsbCBjb250YWluZWQgY29sdW1ucywKK3RoZSBzc3RhYmxlIHdpbGwgYmUgY29tcGFjdGVkICh3aXRoIG5vIG90aGVyIHNzdGFibGVzKSBmb3IgdGhlIHB1cnBvc2UKK29mIHB1cmdpbmcgdGhvc2UgdG9tYnN0b25lcy4KKworfGB0b21ic3RvbmVfY29tcGFjdGlvbl9pbnRlcnZhbGAgfF9hbGxfIHwxIGRheSB8VGhlIG1pbmltdW0gdGltZSB0byB3YWl0CithZnRlciBhbiBzc3RhYmxlIGNyZWF0aW9uIHRpbWUgYmVmb3JlIGNvbnNpZGVyaW5nIGl0IGZvciBgYHRvbWJzdG9uZQorY29tcGFjdGlvbicnLCB3aGVyZSBgYHRvbWJzdG9uZSBjb21wYWN0aW9uJycgaXMgdGhlIGNvbXBhY3Rpb24gdHJpZ2dlcmVkCitpZiB0aGUgc3N0YWJsZSBoYXMgbW9yZSBnY2FibGUgdG9tYnN0b25lcyB0aGFuIGB0b21ic3RvbmVfdGhyZXNob2xkYC4KKworfGB1bmNoZWNrZWRfdG9tYnN0b25lX2NvbXBhY3Rpb25gIHxfYWxsXyB8ZmFsc2UgfFNldHRpbmcgdGhpcyB0byB0cnVlCitlbmFibGVzIG1vcmUgYWdncmVzc2l2ZSB0b21ic3RvbmUgY29tcGFjdGlvbnMgLSBzaW5nbGUgc3N0YWJsZSB0b21ic3RvbmUKK2NvbXBhY3Rpb25zIHdpbGwgcnVuIHdpdGhvdXQgY2hlY2tpbmcgaG93IGxpa2VseSBpdCBpcyB0aGF0IHRoZXkgd2lsbCBiZQorc3VjY2Vzc2Z1bC4KKworfGBtaW5fc3N0YWJsZV9zaXplYCB8U2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSB8NTBNQiB8VGhlIHNpemUgdGllcmVkCitzdHJhdGVneSBncm91cHMgU1NUYWJsZXMgdG8gY29tcGFjdCBpbiBidWNrZXRzLiBBIGJ1Y2tldCBncm91cHMgU1NUYWJsZXMKK3RoYXQgZGlmZmVycyBmcm9tIGxlc3MgdGhhbiA1MCUgaW4gc2l6ZS4gSG93ZXZlciwgZm9yIHNtYWxsIHNpemVzLCB0aGlzCit3b3VsZCByZXN1bHQgaW4gYSBidWNrZXRpbmcgdGhhdCBpcyB0b28gZmluZSBncmFpbmVkLiBgbWluX3NzdGFibGVfc2l6ZWAKK2RlZmluZXMgYSBzaXplIHRocmVzaG9sZCAoaW4gYnl0ZXMpIGJlbG93IHdoaWNoIGFsbCBTU1RhYmxlcyBiZWxvbmcgdG8KK29uZSB1bmlxdWUgYnVja2V0CisKK3xgbWluX3RocmVzaG9sZGAgfFNpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kgfDQgfE1pbmltdW0gbnVtYmVyIG9mCitTU1RhYmxlcyBuZWVkZWQgdG8gc3RhcnQgYSBtaW5vciBjb21wYWN0aW9uLgorCit8YG1heF90aHJlc2hvbGRgIHxTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5IHwzMiB8TWF4aW11bSBudW1iZXIgb2YKK1NTVGFibGVzIHByb2Nlc3NlZCBieSBvbmUgbWlub3IgY29tcGFjdGlvbi4KKworfGBidWNrZXRfbG93YCB8U2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSB8MC41IHxTaXplIHRpZXJlZCBjb25zaWRlcgorc3N0YWJsZXMgdG8gYmUgd2l0aGluIHRoZSBzYW1lIGJ1Y2tldCBpZiB0aGVpciBzaXplIGlzIHdpdGhpbgorW2F2ZXJhZ2Vfc2l6ZSAqIGBidWNrZXRfbG93YCwgYXZlcmFnZV9zaXplICogYGJ1Y2tldF9oaWdoYCBdIChpLmUgdGhlCitkZWZhdWx0IGdyb3VwcyBzc3RhYmxlIHdob3NlIHNpemVzIGRpdmVyZ2VzIGJ5IGF0IG1vc3QgNTAlKQorCit8YGJ1Y2tldF9oaWdoYCB8U2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSB8MS41IHxTaXplIHRpZXJlZCBjb25zaWRlcgorc3N0YWJsZXMgdG8gYmUgd2l0aGluIHRoZSBzYW1lIGJ1Y2tldCBpZiB0aGVpciBzaXplIGlzIHdpdGhpbgorW2F2ZXJhZ2Vfc2l6ZSAqIGBidWNrZXRfbG93YCwgYXZlcmFnZV9zaXplICogYGJ1Y2tldF9oaWdoYCBdIChpLmUgdGhlCitkZWZhdWx0IGdyb3VwcyBzc3RhYmxlIHdob3NlIHNpemVzIGRpdmVyZ2VzIGJ5IGF0IG1vc3QgNTAlKS4KKworfGBzc3RhYmxlX3NpemVfaW5fbWJgIHxMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5IHw1TUIgfFRoZSB0YXJnZXQgc2l6ZQorKGluIE1CKSBmb3Igc3N0YWJsZXMgaW4gdGhlIGxldmVsZWQgc3RyYXRlZ3kuIE5vdGUgdGhhdCB3aGlsZSBzc3RhYmxlCitzaXplcyBzaG91bGQgc3RheSBsZXNzIG9yIGVxdWFsIHRvIGBzc3RhYmxlX3NpemVfaW5fbWJgLCBpdCBpcyBwb3NzaWJsZQordG8gZXhjZXB0aW9uYWxseSBoYXZlIGEgbGFyZ2VyIHNzdGFibGUgYXMgZHVyaW5nIGNvbXBhY3Rpb24sIGRhdGEgZm9yIGEKK2dpdmVuIHBhcnRpdGlvbiBrZXkgYXJlIG5ldmVyIHNwbGl0IGludG8gMiBzc3RhYmxlcworCit8YHRpbWVzdGFtcF9yZXNvbHV0aW9uYCB8VGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneSB8TUlDUk9TRUNPTkRTIHxUaGUKK3RpbWVzdGFtcCByZXNvbHV0aW9uIHVzZWQgd2hlbiBpbnNlcnRpbmcgZGF0YSwgY291bGQgYmUgTUlMTElTRUNPTkRTLAorTUlDUk9TRUNPTkRTIGV0YyAoc2hvdWxkIGJlIHVuZGVyc3RhbmRhYmxlIGJ5IEphdmEgVGltZVVuaXQpIC0gZG9u4oCZdAorY2hhbmdlIHRoaXMgdW5sZXNzIHlvdSBkbyBtdXRhdGlvbnMgd2l0aCBVU0lORyBUSU1FU1RBTVAgKG9yIGVxdWl2YWxlbnQKK2RpcmVjdGx5IGluIHRoZSBjbGllbnQpCisKK3xgY29tcGFjdGlvbl93aW5kb3dfdW5pdGAgfFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kgfERBWVMgfFRoZSBKYXZhCitUaW1lVW5pdCB1c2VkIGZvciB0aGUgd2luZG93IHNpemUsIHNldCBpbiBjb25qdW5jdGlvbiB3aXRoCitgY29tcGFjdGlvbl93aW5kb3dfc2l6ZWAuIE11c3QgYmUgb25lIG9mIERBWVMsIEhPVVJTLCBNSU5VVEVTCisKK3xgY29tcGFjdGlvbl93aW5kb3dfc2l6ZWAgfFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kgfDEgfFRoZSBudW1iZXIKK29mIGBjb21wYWN0aW9uX3dpbmRvd191bml0YCB1bml0cyB0aGF0IG1ha2UgdXAgYSB0aW1lIHdpbmRvdy4KKworfGB1bnNhZmVfYWdncmVzc2l2ZV9zc3RhYmxlX2V4cGlyYXRpb25gIHxUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5Cit8ZmFsc2UgfEV4cGlyZWQgc3N0YWJsZXMgd2lsbCBiZSBkcm9wcGVkIHdpdGhvdXQgY2hlY2tpbmcgaXRzIGRhdGEgaXMKK3NoYWRvd2luZyBvdGhlciBzc3RhYmxlcy4gVGhpcyBpcyBhIHBvdGVudGlhbGx5IHJpc2t5IG9wdGlvbiB0aGF0IGNhbgorbGVhZCB0byBkYXRhIGxvc3Mgb3IgZGVsZXRlZCBkYXRhIHJlLWFwcGVhcmluZywgZ29pbmcgYmV5b25kIHdoYXQKK2B1bmNoZWNrZWRfdG9tYnN0b25lX2NvbXBhY3Rpb25gIGRvZXMgZm9yIHNpbmdsZSBzc3RhYmxlIGNvbXBhY3Rpb24uIER1ZQordG8gdGhlIHJpc2sgdGhlIGp2bSBtdXN0IGFsc28gYmUgc3RhcnRlZCB3aXRoCitgLURjYXNzYW5kcmEudW5zYWZlX2FnZ3Jlc3NpdmVfc3N0YWJsZV9leHBpcmF0aW9uPXRydWVgLgorfD09PQorCitbW2NvbXByZXNzaW9uT3B0aW9uc11dCis9PT09PSBDb21wcmVzc2lvbiBvcHRpb25zCisKK0ZvciB0aGUgYGNvbXByZXNzaW9uYCBwcm9wZXJ0eSwgdGhlIGZvbGxvd2luZyBzdWItb3B0aW9ucyBhcmUgYXZhaWxhYmxlOgorCitbY29scz0iLCwsLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfG9wdGlvbiB8ZGVmYXVsdCB8ZGVzY3JpcHRpb24gfCB8IHwKK3xgY2xhc3NgIHxMWjRDb21wcmVzc29yIHxUaGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIHRvIHVzZS4gRGVmYXVsdAorY29tcHJlc3NvciBhcmU6IExaNENvbXByZXNzb3IsIFNuYXBweUNvbXByZXNzb3IgYW5kIERlZmxhdGVDb21wcmVzc29yLgorVXNlIGAnZW5hYmxlZCcgOiBmYWxzZWAgdG8gZGlzYWJsZSBjb21wcmVzc2lvbi4gQ3VzdG9tIGNvbXByZXNzb3IgY2FuIGJlCitwcm92aWRlZCBieSBzcGVjaWZ5aW5nIHRoZSBmdWxsIGNsYXNzIG5hbWUgYXMgYSBsaW5rOiNjb25zdGFudHNbc3RyaW5nCitjb25zdGFudF0uIHwgfCB8CisKK3xgZW5hYmxlZGAgfHRydWUgfEJ5IGRlZmF1bHQgY29tcHJlc3Npb24gaXMgZW5hYmxlZC4gVG8gZGlzYWJsZSBpdCwgc2V0CitgZW5hYmxlZGAgdG8gYGZhbHNlYCB8YGNodW5rX2xlbmd0aF9pbl9rYmAgfDY0S0IgfE9uIGRpc2sgU1NUYWJsZXMgYXJlCitjb21wcmVzc2VkIGJ5IGJsb2NrICh0byBhbGxvdyByYW5kb20gcmVhZHMpLiBUaGlzIGRlZmluZXMgdGhlIHNpemUgKGluCitLQikgb2Ygc2FpZCBibG9jay4gQmlnZ2VyIHZhbHVlcyBtYXkgaW1wcm92ZSB0aGUgY29tcHJlc3Npb24gcmF0ZSwgYnV0CitpbmNyZWFzZXMgdGhlIG1pbmltdW0gc2l6ZSBvZiBkYXRhIHRvIGJlIHJlYWQgZnJvbSBkaXNrIGZvciBhIHJlYWQKKworfGBjcmNfY2hlY2tfY2hhbmNlYCB8MS4wIHxXaGVuIGNvbXByZXNzaW9uIGlzIGVuYWJsZWQsIGVhY2ggY29tcHJlc3NlZAorYmxvY2sgaW5jbHVkZXMgYSBjaGVja3N1bSBvZiB0aGF0IGJsb2NrIGZvciB0aGUgcHVycG9zZSBvZiBkZXRlY3RpbmcKK2Rpc2sgYml0cm90IGFuZCBhdm9pZGluZyB0aGUgcHJvcGFnYXRpb24gb2YgY29ycnVwdGlvbiB0byBvdGhlciByZXBsaWNhLgorVGhpcyBvcHRpb24gZGVmaW5lcyB0aGUgcHJvYmFiaWxpdHkgd2l0aCB3aGljaCB0aG9zZSBjaGVja3N1bXMgYXJlCitjaGVja2VkIGR1cmluZyByZWFkLiBCeSBkZWZhdWx0IHRoZXkgYXJlIGFsd2F5cyBjaGVja2VkLiBTZXQgdG8gMCB0bworZGlzYWJsZSBjaGVja3N1bSBjaGVja2luZyBhbmQgdG8gMC41IGZvciBpbnN0YW5jZSB0byBjaGVjayB0aGVtIGV2ZXJ5CitvdGhlciByZWFkIHwgfCB8Cit8PT09CisKK1tbY2FjaGluZ09wdGlvbnNdXQorPT09PT0gQ2FjaGluZyBvcHRpb25zCisKK0ZvciB0aGUgYGNhY2hpbmdgIHByb3BlcnR5LCB0aGUgZm9sbG93aW5nIHN1Yi1vcHRpb25zIGFyZSBhdmFpbGFibGU6CisKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8b3B0aW9uIHxkZWZhdWx0IHxkZXNjcmlwdGlvbgorfGBrZXlzYCB8QUxMIHxXaGV0aGVyIHRvIGNhY2hlIGtleXMgKGBga2V5IGNhY2hlJycpIGZvciB0aGlzIHRhYmxlLgorVmFsaWQgdmFsdWVzIGFyZTogYEFMTGAgYW5kIGBOT05FYC4KKworfGByb3dzX3Blcl9wYXJ0aXRpb25gIHxOT05FIHxUaGUgYW1vdW50IG9mIHJvd3MgdG8gY2FjaGUgcGVyIHBhcnRpdGlvbgorKGBgcm93IGNhY2hlJycpLiBJZiBhbiBpbnRlZ2VyIGBuYCBpcyBzcGVjaWZpZWQsIHRoZSBmaXJzdCBgbmAgcXVlcmllZAorcm93cyBvZiBhIHBhcnRpdGlvbiB3aWxsIGJlIGNhY2hlZC4gT3RoZXIgcG9zc2libGUgb3B0aW9ucyBhcmUgYEFMTGAsIHRvCitjYWNoZSBhbGwgcm93cyBvZiBhIHF1ZXJpZWQgcGFydGl0aW9uLCBvciBgTk9ORWAgdG8gZGlzYWJsZSByb3cgY2FjaGluZy4KK3w9PT0KKworPT09PT0gT3RoZXIgY29uc2lkZXJhdGlvbnM6CisKKyogV2hlbiBsaW5rOiNpbnNlcnRTdG10W2luc2VydGluZ10gLyBsaW5rOiN1cGRhdGVTdG10W3VwZGF0aW5nXSBhIGdpdmVuCityb3csIG5vdCBhbGwgY29sdW1ucyBuZWVkcyB0byBiZSBkZWZpbmVkIChleGNlcHQgZm9yIHRob3NlIHBhcnQgb2YgdGhlCitrZXkpLCBhbmQgbWlzc2luZyBjb2x1bW5zIG9jY3VweSBubyBzcGFjZSBvbiBkaXNrLiBGdXJ0aGVybW9yZSwgYWRkaW5nCituZXcgY29sdW1ucyAoc2VlIGBBTFRFUiBUQUJMRWApIGlzIGEgY29uc3RhbnQgdGltZSBvcGVyYXRpb24uIFRoZXJlIGlzCit0aHVzIG5vIG5lZWQgdG8gdHJ5IHRvIGFudGljaXBhdGUgZnV0dXJlIHVzYWdlIChvciB0byBjcnkgd2hlbiB5b3UKK2hhdmVu4oCZdCkgd2hlbiBjcmVhdGluZyBhIHRhYmxlLgorCitbW2FsdGVyVGFibGVTdG10XV0KKz09PT0gQUxURVIgVEFCTEUKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuLiArCis6Oj0gQUxURVIgKFRBQkxFIHwgQ09MVU1ORkFNSUxZKSAoSUYgRVhJU1RTKT8KKworOjo9IEFERCAoSUYgTk9UIEVYSVNUUyk/ICsKK3wgQUREICAoSUYgTk9UIEVYSVNUUyk/ICggKCAsICkqICkgKworfCBEUk9QIChJRiBFWElTVFMpPyAgKworfCBEUk9QIChJRiBFWElTVFMpPyAoICggLCApKiApICsKK3wgUkVOQU1FIChJRiBFWElTVFMpPyBUTyAoQU5EIFRPKSogKworfCBXSVRIICggQU5EICkqICsKK3AuICsKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLi4gKworQUxURVIgVEFCTEUgYWRkYW1zRmFtaWx5CisKK0FMVEVSIFRBQkxFIGFkZGFtc0ZhbWlseSArCitBREQgZ3JhdmVzaXRlIHZhcmNoYXI7CisKK0FMVEVSIFRBQkxFIGFkZGFtc0ZhbWlseSArCitXSVRIIGNvbW1lbnQgPSBgQSBtb3N0IGV4Y2VsbGVudCBhbmQgdXNlZnVsIGNvbHVtbiBmYW1pbHknOyArCitwLiArCitUaGUgYEFMVEVSYCBzdGF0ZW1lbnQgaXMgdXNlZCB0byBtYW5pcHVsYXRlIHRhYmxlIGRlZmluaXRpb25zLiBJdCBhbGxvd3MKK2ZvciBhZGRpbmcgbmV3IGNvbHVtbnMsIGRyb3BwaW5nIGV4aXN0aW5nIG9uZXMsIG9yIHVwZGF0aW5nIHRoZSB0YWJsZQorb3B0aW9ucy4gQXMgd2l0aCB0YWJsZSBjcmVhdGlvbiwgYEFMVEVSIENPTFVNTkZBTUlMWWAgaXMgYWxsb3dlZCBhcyBhbgorYWxpYXMgZm9yIGBBTFRFUiBUQUJMRWAuCitJZiB0aGUgdGFibGUgZG9lcyBub3QgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgorCitUaGUgYDx0YWJsZW5hbWU+YCBpcyB0aGUgdGFibGUgbmFtZSBvcHRpb25hbGx5IHByZWNlZGVkIGJ5IHRoZSBrZXlzcGFjZQorbmFtZS4gVGhlIGA8aW5zdHJ1Y3Rpb24+YCBkZWZpbmVzIHRoZSBhbHRlcmF0aW9uIHRvIHBlcmZvcm06CisKKyogYEFERGA6IEFkZHMgYSBuZXcgY29sdW1uIHRvIHRoZSB0YWJsZS4gVGhlIGA8aWRlbnRpZmllcj5gIGZvciB0aGUgbmV3Citjb2x1bW4gbXVzdCBub3QgY29uZmxpY3Qgd2l0aCBhbiBleGlzdGluZyBjb2x1bW4uIE1vcmVvdmVyLCBjb2x1bW5zCitjYW5ub3QgYmUgYWRkZWQgdG8gdGFibGVzIGRlZmluZWQgd2l0aCB0aGUgYENPTVBBQ1QgU1RPUkFHRWAgb3B0aW9uLgorSWYgdGhlIG5ldyBjb2x1bW4gYWxyZWFkeSBleGlzdHMsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgTk9UIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KKyogYERST1BgOiBSZW1vdmVzIGEgY29sdW1uIGZyb20gdGhlIHRhYmxlLiBEcm9wcGVkIGNvbHVtbnMgd2lsbAoraW1tZWRpYXRlbHkgYmVjb21lIHVuYXZhaWxhYmxlIGluIHRoZSBxdWVyaWVzIGFuZCB3aWxsIG5vdCBiZSBpbmNsdWRlZAoraW4gY29tcGFjdGVkIHNzdGFibGVzIGluIHRoZSBmdXR1cmUuIElmIGEgY29sdW1uIGlzIHJlYWRkZWQsIHF1ZXJpZXMKK3dvbuKAmXQgcmV0dXJuIHZhbHVlcyB3cml0dGVuIGJlZm9yZSB0aGUgY29sdW1uIHdhcyBsYXN0IGRyb3BwZWQuIEl0IGlzCithc3N1bWVkIHRoYXQgdGltZXN0YW1wcyByZXByZXNlbnQgYWN0dWFsIHRpbWUsIHNvIGlmIHRoaXMgaXMgbm90IHlvdXIKK2Nhc2UsIHlvdSBzaG91bGQgTk9UIHJlYWQgcHJldmlvdXNseSBkcm9wcGVkIGNvbHVtbnMuIENvbHVtbnMgY2Fu4oCZdCBiZQorZHJvcHBlZCBmcm9tIHRhYmxlcyBkZWZpbmVkIHdpdGggdGhlIGBDT01QQUNUIFNUT1JBR0VgIG9wdGlvbi4KK0lmIHRoZSBkcm9wcGVkIGNvbHVtbiBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLCB1bmxlc3MgYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KKyogYFJFTkFNRWAgYSBwcmltYXJ5IGtleSBjb2x1bW4gb2YgYSB0YWJsZS4gTm9uIHByaW1hcnkga2V5IGNvbHVtbnMgY2Fubm90IGJlIHJlbmFtZWQuCitGdXJ0aGVybW9yZSwgcmVuYW1pbmcgYSBjb2x1bW4gdG8gYW5vdGhlciBuYW1lIHdoaWNoIGFscmVhZHkgZXhpc3RzIGlzbid0IGFsbG93ZWQuCitJdCdzIGltcG9ydGFudCB0byBrZWVwIGluIG1pbmQgdGhhdCByZW5hbWVkIGNvbHVtbnMgc2hvdWxkbid0IGhhdmUgZGVwZW5kZW50IHNlY29uZGF5IGluZGV4ZXMuCitJZiB0aGUgcmVuYW1lZCBjb2x1bW4gZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCisKKyogYFdJVEhgOiBBbGxvd3MgdG8gdXBkYXRlIHRoZSBvcHRpb25zIG9mIHRoZSB0YWJsZS4gVGhlCitsaW5rOiNjcmVhdGVUYWJsZU9wdGlvbnNbc3VwcG9ydGVkIGA8b3B0aW9uPmBdIChhbmQgc3ludGF4KSBhcmUgdGhlIHNhbWUKK2FzIGZvciB0aGUgYENSRUFURSBUQUJMRWAgc3RhdGVtZW50IGV4Y2VwdCB0aGF0IGBDT01QQUNUIFNUT1JBR0VgIGlzIG5vdAorc3VwcG9ydGVkLiBOb3RlIHRoYXQgc2V0dGluZyBhbnkgYGNvbXBhY3Rpb25gIHN1Yi1vcHRpb25zIGhhcyB0aGUgZWZmZWN0CitvZiBlcmFzaW5nIGFsbCBwcmV2aW91cyBgY29tcGFjdGlvbmAgb3B0aW9ucywgc28geW91IG5lZWQgdG8gcmUtc3BlY2lmeQorYWxsIHRoZSBzdWItb3B0aW9ucyBpZiB5b3Ugd2FudCB0byBrZWVwIHRoZW0uIFRoZSBzYW1lIG5vdGUgYXBwbGllcyB0bwordGhlIHNldCBvZiBgY29tcHJlc3Npb25gIHN1Yi1vcHRpb25zLgorCis9PT09PSBDUUwgdHlwZSBjb21wYXRpYmlsaXR5OgorCitDUUwgZGF0YSB0eXBlcyBtYXkgYmUgY29udmVydGVkIG9ubHkgYXMgdGhlIGZvbGxvd2luZyB0YWJsZS4KKworW2NvbHM9IiwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfERhdGEgdHlwZSBtYXkgYmUgYWx0ZXJlZCB0bzogfERhdGEgdHlwZQorfHRpbWVzdGFtcCB8YmlnaW50CisKK3xhc2NpaSwgYmlnaW50LCBib29sZWFuLCBkYXRlLCBkZWNpbWFsLCBkb3VibGUsIGZsb2F0LCBpbmV0LCBpbnQsCitzbWFsbGludCwgdGV4dCwgdGltZSwgdGltZXN0YW1wLCB0aW1ldXVpZCwgdGlueWludCwgdXVpZCwgdmFyY2hhciwKK3ZhcmludCB8YmxvYgorCit8aW50IHxkYXRlCisKK3xhc2NpaSwgdmFyY2hhciB8dGV4dAorCit8YmlnaW50IHx0aW1lCisKK3xiaWdpbnQgfHRpbWVzdGFtcAorCit8dGltZXV1aWQgfHV1aWQKKworfGFzY2lpLCB0ZXh0IHx2YXJjaGFyCisKK3xiaWdpbnQsIGludCwgdGltZXN0YW1wIHx2YXJpbnQKK3w9PT0KKworQ2x1c3RlcmluZyBjb2x1bW5zIGhhdmUgc3RyaWN0ZXIgcmVxdWlyZW1lbnRzLCBvbmx5IHRoZSBiZWxvdworY29udmVyc2lvbnMgYXJlIGFsbG93ZWQuCisKK1tjb2xzPSIsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xEYXRhIHR5cGUgbWF5IGJlIGFsdGVyZWQgdG86IHxEYXRhIHR5cGUKK3xhc2NpaSwgdGV4dCwgdmFyY2hhciB8YmxvYgorfGFzY2lpLCB2YXJjaGFyIHx0ZXh0Cit8YXNjaWksIHRleHQgfHZhcmNoYXIKK3w9PT0KKworW1tkcm9wVGFibGVTdG10XV0KKz09PT0gRFJPUCBUQUJMRQorCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4gOjo9IERST1AgVEFCTEUgKCBJRiBFWElTVFMgKT8KKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuIERST1AgVEFCTEUgd29ybGRTZXJpZXNBdHRlbmRlZXM7CisKK1RoZSBgRFJPUCBUQUJMRWAgc3RhdGVtZW50IHJlc3VsdHMgaW4gdGhlIGltbWVkaWF0ZSwgaXJyZXZlcnNpYmxlCityZW1vdmFsIG9mIGEgdGFibGUsIGluY2x1ZGluZyBhbGwgZGF0YSBjb250YWluZWQgaW4gaXQuIEFzIGZvciB0YWJsZQorY3JlYXRpb24sIGBEUk9QIENPTFVNTkZBTUlMWWAgaXMgYWxsb3dlZCBhcyBhbiBhbGlhcyBmb3IgYERST1AgVEFCTEVgLgorCitJZiB0aGUgdGFibGUgZG9lcyBub3QgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcworYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KKworW1t0cnVuY2F0ZVN0bXRdXQorPT09PSBUUlVOQ0FURQorCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4gOjo9IFRSVU5DQVRFICggVEFCTEUgfCBDT0xVTU5GQU1JTFkgKT8KKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuIFRSVU5DQVRFIHN1cGVySW1wb3J0YW50RGF0YTsKKworVGhlIGBUUlVOQ0FURWAgc3RhdGVtZW50IHBlcm1hbmVudGx5IHJlbW92ZXMgYWxsIGRhdGEgZnJvbSBhIHRhYmxlLgorCitbW2NyZWF0ZUluZGV4U3RtdF1dCis9PT09IENSRUFURSBJTkRFWAorCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4uICsKKzo6PSBDUkVBVEUgKCBDVVNUT00gKT8gSU5ERVggKCBJRiBOT1QgRVhJU1RTICk/ICggKT8gKworT04gYCgnIGApJyArCisoIFVTSU5HICggV0lUSCBPUFRJT05TID0gKT8gKT8KKworOjo9ICArCit8IGtleXMoICkgKworcC4gKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuICsKK0NSRUFURSBJTkRFWCB1c2VySW5kZXggT04gTmVyZE1vdmllcyAodXNlcik7ICsKK0NSRUFURSBJTkRFWCBPTiBNdXRhbnRzIChhYmlsaXR5SWQpOyArCitDUkVBVEUgSU5ERVggT04gdXNlcnMgKGtleXMoZmF2cykpOyArCitDUkVBVEUgQ1VTVE9NIElOREVYIE9OIHVzZXJzIChlbWFpbCkgVVNJTkcgYHBhdGgudG8udGhlLkluZGV4Q2xhc3MnOyArCitDUkVBVEUgQ1VTVE9NIElOREVYIE9OIHVzZXJzIChlbWFpbCkgVVNJTkcgYHBhdGgudG8udGhlLkluZGV4Q2xhc3MnIFdJVEgKK09QVElPTlMgPSBce+KAmXN0b3JhZ2XigJk6IGAvbW50L3NzZC9pbmRleGVzLyd9OworCitUaGUgYENSRUFURSBJTkRFWGAgc3RhdGVtZW50IGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IChhdXRvbWF0aWMpCitzZWNvbmRhcnkgaW5kZXggZm9yIGEgZ2l2ZW4gKGV4aXN0aW5nKSBjb2x1bW4gaW4gYSBnaXZlbiB0YWJsZS4gQSBuYW1lCitmb3IgdGhlIGluZGV4IGl0c2VsZiBjYW4gYmUgc3BlY2lmaWVkIGJlZm9yZSB0aGUgYE9OYCBrZXl3b3JkLCBpZgorZGVzaXJlZC4gSWYgZGF0YSBhbHJlYWR5IGV4aXN0cyBmb3IgdGhlIGNvbHVtbiwgaXQgd2lsbCBiZSBpbmRleGVkCithc3luY2hyb25vdXNseS4gQWZ0ZXIgdGhlIGluZGV4IGlzIGNyZWF0ZWQsIG5ldyBkYXRhIGZvciB0aGUgY29sdW1uIGlzCitpbmRleGVkIGF1dG9tYXRpY2FsbHkgYXQgaW5zZXJ0aW9uIHRpbWUuCisKK0F0dGVtcHRpbmcgdG8gY3JlYXRlIGFuIGFscmVhZHkgZXhpc3RpbmcgaW5kZXggd2lsbCByZXR1cm4gYW4gZXJyb3IKK3VubGVzcyB0aGUgYElGIE5PVCBFWElTVFNgIG9wdGlvbiBpcyB1c2VkLiBJZiBpdCBpcyB1c2VkLCB0aGUgc3RhdGVtZW50Cit3aWxsIGJlIGEgbm8tb3AgaWYgdGhlIGluZGV4IGFscmVhZHkgZXhpc3RzLgorCitbW2tleXNJbmRleF1dCis9PT09PSBJbmRleGVzIG9uIE1hcCBLZXlzCisKK1doZW4gY3JlYXRpbmcgYW4gaW5kZXggb24gYSBsaW5rOiNtYXBbbWFwIGNvbHVtbl0sIHlvdSBtYXkgaW5kZXggZWl0aGVyCit0aGUga2V5cyBvciB0aGUgdmFsdWVzLiBJZiB0aGUgY29sdW1uIGlkZW50aWZpZXIgaXMgcGxhY2VkIHdpdGhpbiB0aGUKK2BrZXlzKClgIGZ1bmN0aW9uLCB0aGUgaW5kZXggd2lsbCBiZSBvbiB0aGUgbWFwIGtleXMsIGFsbG93aW5nIHlvdSB0bwordXNlIGBDT05UQUlOUyBLRVlgIGluIGBXSEVSRWAgY2xhdXNlcy4gT3RoZXJ3aXNlLCB0aGUgaW5kZXggd2lsbCBiZSBvbgordGhlIG1hcCB2YWx1ZXMuCisKK1tbZHJvcEluZGV4U3RtdF1dCis9PT09IERST1AgSU5ERVgKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuIDo6PSBEUk9QIElOREVYICggSUYgRVhJU1RTICk/ICggYC4nICk/CisKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLi4gKworRFJPUCBJTkRFWCB1c2VySW5kZXg7CisKK0RST1AgSU5ERVggdXNlcmtleXNwYWNlLmFkZHJlc3NfaW5kZXg7ICsKK3AuICsKK1RoZSBgRFJPUCBJTkRFWGAgc3RhdGVtZW50IGlzIHVzZWQgdG8gZHJvcCBhbiBleGlzdGluZyBzZWNvbmRhcnkgaW5kZXguCitUaGUgYXJndW1lbnQgb2YgdGhlIHN0YXRlbWVudCBpcyB0aGUgaW5kZXggbmFtZSwgd2hpY2ggbWF5IG9wdGlvbmFsbHkKK3NwZWNpZnkgdGhlIGtleXNwYWNlIG9mIHRoZSBpbmRleC4KKworSWYgdGhlIGluZGV4IGRvZXMgbm90IGV4aXN0cywgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzCitgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgorCitbW2NyZWF0ZU1WU3RtdF1dCis9PT09IENSRUFURSBNQVRFUklBTElaRUQgVklFVworCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4uICsKKzo6PSBDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgKCBJRiBOT1QgRVhJU1RTICk/IEFTICsKK1NFTEVDVCAoIGAoJyAoIGAsJyApICogYCknIHwgYConICkgKworRlJPTSAgKworKCBXSEVSRSApPyArCitQUklNQVJZIEtFWSBgKCcgKCBgLCcgKSogYCknICsKKyggV0lUSCAoIEFORCApKiApPyArCitwLiArCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4uICsKK0NSRUFURSBNQVRFUklBTElaRUQgVklFVyBtb25rZXlTcGVjaWVzX2J5X3BvcHVsYXRpb24gQVMgKworU0VMRUNUICogKworRlJPTSBtb25rZXlTcGVjaWVzICsKK1dIRVJFIHBvcHVsYXRpb24gSVMgTk9UIE5VTEwgQU5EIHNwZWNpZXMgSVMgTk9UIE5VTEwgKworUFJJTUFSWSBLRVkgKHBvcHVsYXRpb24sIHNwZWNpZXMpICsKK1dJVEggY29tbWVudD1gQWxsb3cgcXVlcnkgYnkgcG9wdWxhdGlvbiBpbnN0ZWFkIG9mIHNwZWNpZXMnOyArCitwLiArCitUaGUgYENSRUFURSBNQVRFUklBTElaRUQgVklFV2Agc3RhdGVtZW50IGNyZWF0ZXMgYSBuZXcgbWF0ZXJpYWxpemVkCit2aWV3LiBFYWNoIHN1Y2ggdmlldyBpcyBhIHNldCBvZiBfcm93c18gd2hpY2ggY29ycmVzcG9uZHMgdG8gcm93cyB3aGljaAorYXJlIHByZXNlbnQgaW4gdGhlIHVuZGVybHlpbmcsIG9yIGJhc2UsIHRhYmxlIHNwZWNpZmllZCBpbiB0aGUgYFNFTEVDVGAKK3N0YXRlbWVudC4gQSBtYXRlcmlhbGl6ZWQgdmlldyBjYW5ub3QgYmUgZGlyZWN0bHkgdXBkYXRlZCwgYnV0IHVwZGF0ZXMKK3RvIHRoZSBiYXNlIHRhYmxlIHdpbGwgY2F1c2UgY29ycmVzcG9uZGluZyB1cGRhdGVzIGluIHRoZSB2aWV3LgorCitBdHRlbXB0aW5nIHRvIGNyZWF0ZSBhbiBhbHJlYWR5IGV4aXN0aW5nIG1hdGVyaWFsaXplZCB2aWV3IHdpbGwgcmV0dXJuCithbiBlcnJvciB1bmxlc3MgdGhlIGBJRiBOT1QgRVhJU1RTYCBvcHRpb24gaXMgdXNlZC4gSWYgaXQgaXMgdXNlZCwgdGhlCitzdGF0ZW1lbnQgd2lsbCBiZSBhIG5vLW9wIGlmIHRoZSBtYXRlcmlhbGl6ZWQgdmlldyBhbHJlYWR5IGV4aXN0cy4KKworW1tjcmVhdGVNVldoZXJlXV0KKz09PT09IGBXSEVSRWAgQ2xhdXNlCisKK1RoZSBgPHdoZXJlLWNsYXVzZT5gIGlzIHNpbWlsYXIgdG8gdGhlIGxpbms6I3NlbGVjdFdoZXJlW3doZXJlIGNsYXVzZSBvZgorYSBgU0VMRUNUYCBzdGF0ZW1lbnRdLCB3aXRoIGEgZmV3IGRpZmZlcmVuY2VzLiBGaXJzdCwgdGhlIHdoZXJlIGNsYXVzZQorbXVzdCBjb250YWluIGFuIGV4cHJlc3Npb24gdGhhdCBkaXNhbGxvd3MgYE5VTExgIHZhbHVlcyBpbiBjb2x1bW5zIGluCit0aGUgdmlld+KAmXMgcHJpbWFyeSBrZXkuIElmIG5vIG90aGVyIHJlc3RyaWN0aW9uIGlzIGRlc2lyZWQsIHRoaXMgY2FuIGJlCithY2NvbXBsaXNoZWQgd2l0aCBhbiBgSVMgTk9UIE5VTExgIGV4cHJlc3Npb24uIFNlY29uZCwgb25seSBjb2x1bW5zCit3aGljaCBhcmUgaW4gdGhlIGJhc2UgdGFibGXigJlzIHByaW1hcnkga2V5IG1heSBiZSByZXN0cmljdGVkIHdpdGgKK2V4cHJlc3Npb25zIG90aGVyIHRoYW4gYElTIE5PVCBOVUxMYC4gKE5vdGUgdGhhdCB0aGlzIHNlY29uZCByZXN0cmljdGlvbgorbWF5IGJlIGxpZnRlZCBpbiB0aGUgZnV0dXJlLikKKworW1thbHRlck1WU3RtdF1dCis9PT09IEFMVEVSIE1BVEVSSUFMSVpFRCBWSUVXCisKK19TeW50YXg6XworCitiYyhzeW50YXgpLiA6Oj0gQUxURVIgTUFURVJJQUxJWkVEIFZJRVcgICsKK1dJVEggKCBBTkQgKSoKKworVGhlIGBBTFRFUiBNQVRFUklBTElaRUQgVklFV2Agc3RhdGVtZW50IGFsbG93cyBvcHRpb25zIHRvIGJlIHVwZGF0ZTsKK3RoZXNlIG9wdGlvbnMgYXJlIHRoZSBzYW1lIGFzIGBDUkVBVEUgVEFCTEVg4oCZcyBvcHRpb25zLgorCitbW2Ryb3BNVlN0bXRdXQorPT09PSBEUk9QIE1BVEVSSUFMSVpFRCBWSUVXCisKK19TeW50YXg6XworCitiYyhzeW50YXgpLiA6Oj0gRFJPUCBNQVRFUklBTElaRUQgVklFVyAoIElGIEVYSVNUUyApPworCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4gRFJPUCBNQVRFUklBTElaRUQgVklFVyBtb25rZXlTcGVjaWVzX2J5X3BvcHVsYXRpb247CisKK1RoZSBgRFJPUCBNQVRFUklBTElaRUQgVklFV2Agc3RhdGVtZW50IGlzIHVzZWQgdG8gZHJvcCBhbiBleGlzdGluZworbWF0ZXJpYWxpemVkIHZpZXcuCisKK0lmIHRoZSBtYXRlcmlhbGl6ZWQgdmlldyBkb2VzIG5vdCBleGlzdHMsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4KK2Vycm9yLCB1bmxlc3MgYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYQorbm8tb3AuCisKK1tbY3JlYXRlVHlwZVN0bXRdXQorPT09PSBDUkVBVEUgVFlQRQorCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4uICsKKzo6PSBDUkVBVEUgVFlQRSAoIElGIE5PVCBFWElTVFMgKT8gICsKK2AoJyAoIGAsJyApKiBgKScKKworOjo9ICggYC4nICk/CisKKzo6PQorCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4uICsKK0NSRUFURSBUWVBFIGFkZHJlc3MgKCArCitzdHJlZXRfbmFtZSB0ZXh0LCArCitzdHJlZXRfbnVtYmVyIGludCwgKworY2l0eSB0ZXh0LCArCitzdGF0ZSB0ZXh0LCArCit6aXAgaW50ICsKKykKKworQ1JFQVRFIFRZUEUgd29ya19hbmRfaG9tZV9hZGRyZXNzZXMgKCArCitob21lX2FkZHJlc3MgYWRkcmVzcywgKword29ya19hZGRyZXNzIGFkZHJlc3MgKworKSArCitwLiArCitUaGUgYENSRUFURSBUWVBFYCBzdGF0ZW1lbnQgY3JlYXRlcyBhIG5ldyB1c2VyLWRlZmluZWQgdHlwZS4gRWFjaCB0eXBlCitpcyBhIHNldCBvZiBuYW1lZCwgdHlwZWQgZmllbGRzLiBGaWVsZCB0eXBlcyBtYXkgYmUgYW55IHZhbGlkIHR5cGUsCitpbmNsdWRpbmcgY29sbGVjdGlvbnMgYW5kIG90aGVyIGV4aXN0aW5nIHVzZXItZGVmaW5lZCB0eXBlcy4KKworQXR0ZW1wdGluZyB0byBjcmVhdGUgYW4gYWxyZWFkeSBleGlzdGluZyB0eXBlIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yCit1bmxlc3MgdGhlIGBJRiBOT1QgRVhJU1RTYCBvcHRpb24gaXMgdXNlZC4gSWYgaXQgaXMgdXNlZCwgdGhlIHN0YXRlbWVudAord2lsbCBiZSBhIG5vLW9wIGlmIHRoZSB0eXBlIGFscmVhZHkgZXhpc3RzLgorCitbW2NyZWF0ZVR5cGVOYW1lXV0KKz09PT09IGA8dHlwZW5hbWU+YAorCitWYWxpZCB0eXBlIG5hbWVzIGFyZSBpZGVudGlmaWVycy4gVGhlIG5hbWVzIG9mIGV4aXN0aW5nIENRTCB0eXBlcyBhbmQKK2xpbms6I2FwcGVuZGl4QltyZXNlcnZlZCB0eXBlIG5hbWVzXSBtYXkgbm90IGJlIHVzZWQuCisKK0lmIHRoZSB0eXBlIG5hbWUgaXMgcHJvdmlkZWQgYWxvbmUsIHRoZSB0eXBlIGlzIGNyZWF0ZWQgd2l0aCB0aGUgY3VycmVudAora2V5c3BhY2UgKHNlZSBgVVNFYCkuIElmIGl0IGlzIHByZWZpeGVkIGJ5IGFuIGV4aXN0aW5nIGtleXNwYWNlIG5hbWUsCit0aGUgdHlwZSBpcyBjcmVhdGVkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGtleXNwYWNlIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQKK2tleXNwYWNlLgorCitbW2FsdGVyVHlwZVN0bXRdXQorPT09PSBBTFRFUiBUWVBFCisKK19TeW50YXg6XworCitiYyhzeW50YXgpLi4gKworOjo9IEFMVEVSIFRZUEUgKElGIEVYSVNUUyk/CisKKzo6PSBBREQgKElGIE5PVCBFWElTVFMpPyAgKworfCBSRU5BTUUgKElGIEVYSVNUUyk/IFRPICggQU5EIFRPICkqICsKK3AuICsKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLi4gKworQUxURVIgVFlQRSBhZGRyZXNzIEFERCBjb3VudHJ5IHRleHQKKworQUxURVIgVFlQRSBhZGRyZXNzIFJFTkFNRSB6aXAgVE8gemlwY29kZSBBTkQgc3RyZWV0X25hbWUgVE8gc3RyZWV0ICsKK3AuICsKK1RoZSBgQUxURVIgVFlQRWAgc3RhdGVtZW50IGlzIHVzZWQgdG8gbWFuaXB1bGF0ZSB0eXBlIGRlZmluaXRpb25zLiBJdAorYWxsb3dzIGZvciBhZGRpbmcgbmV3IGZpZWxkcywgcmVuYW1pbmcgZXhpc3RpbmcgZmllbGRzLCBvciBjaGFuZ2luZyB0aGUKK3R5cGUgb2YgZXhpc3RpbmcgZmllbGRzLiBJZiB0aGUgdHlwZSBkb2VzIG5vdCBleGlzdCwgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCisKK1tbZHJvcFR5cGVTdG10XV0KKz09PT0gRFJPUCBUWVBFCisKK19TeW50YXg6XworCitiYyhzeW50YXgpLi4gKworOjo9IERST1AgVFlQRSAoIElGIEVYSVNUUyApPyAgKworcC4gKworVGhlIGBEUk9QIFRZUEVgIHN0YXRlbWVudCByZXN1bHRzIGluIHRoZSBpbW1lZGlhdGUsIGlycmV2ZXJzaWJsZSByZW1vdmFsCitvZiBhIHR5cGUuIEF0dGVtcHRpbmcgdG8gZHJvcCBhIHR5cGUgdGhhdCBpcyBzdGlsbCBpbiB1c2UgYnkgYW5vdGhlcgordHlwZSBvciBhIHRhYmxlIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLgorCitJZiB0aGUgdHlwZSBkb2VzIG5vdCBleGlzdCwgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCB1bmxlc3MgYElGIEVYSVNUU2AKK2lzIHVzZWQsIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgorCitbW2NyZWF0ZVRyaWdnZXJTdG10XV0KKz09PT0gQ1JFQVRFIFRSSUdHRVIKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuLiArCis6Oj0gQ1JFQVRFIFRSSUdHRVIgKCBJRiBOT1QgRVhJU1RTICk/ICggKT8gKworT04gICsKK1VTSU5HCisKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLiArCitDUkVBVEUgVFJJR0dFUiBteVRyaWdnZXIgT04gbXlUYWJsZSBVU0lORworYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyaWdnZXJzLkludmVydGVkSW5kZXgnOworCitUaGUgYWN0dWFsIGxvZ2ljIHRoYXQgbWFrZXMgdXAgdGhlIHRyaWdnZXIgY2FuIGJlIHdyaXR0ZW4gaW4gYW55IEphdmEKKyhKVk0pIGxhbmd1YWdlIGFuZCBleGlzdHMgb3V0c2lkZSB0aGUgZGF0YWJhc2UuIFlvdSBwbGFjZSB0aGUgdHJpZ2dlcgorY29kZSBpbiBhIGBsaWIvdHJpZ2dlcnNgIHN1YmRpcmVjdG9yeSBvZiB0aGUgQ2Fzc2FuZHJhIGluc3RhbGxhdGlvbgorZGlyZWN0b3J5LCBpdCBsb2FkcyBkdXJpbmcgY2x1c3RlciBzdGFydHVwLCBhbmQgZXhpc3RzIG9uIGV2ZXJ5IG5vZGUKK3RoYXQgcGFydGljaXBhdGVzIGluIGEgY2x1c3Rlci4gVGhlIHRyaWdnZXIgZGVmaW5lZCBvbiBhIHRhYmxlIGZpcmVzCitiZWZvcmUgYSByZXF1ZXN0ZWQgRE1MIHN0YXRlbWVudCBvY2N1cnMsIHdoaWNoIGVuc3VyZXMgdGhlIGF0b21pY2l0eSBvZgordGhlIHRyYW5zYWN0aW9uLgorCitbW2Ryb3BUcmlnZ2VyU3RtdF1dCis9PT09IERST1AgVFJJR0dFUgorCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4uICsKKzo6PSBEUk9QIFRSSUdHRVIgKCBJRiBFWElTVFMgKT8gKCApPyArCitPTiAgKworcC4gKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuICsKK0RST1AgVFJJR0dFUiBteVRyaWdnZXIgT04gbXlUYWJsZTsKKworYERST1AgVFJJR0dFUmAgc3RhdGVtZW50IHJlbW92ZXMgdGhlIHJlZ2lzdHJhdGlvbiBvZiBhIHRyaWdnZXIgY3JlYXRlZAordXNpbmcgYENSRUFURSBUUklHR0VSYC4KKworW1tjcmVhdGVGdW5jdGlvblN0bXRdXQorPT09PSBDUkVBVEUgRlVOQ1RJT04KKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuLiArCis6Oj0gQ1JFQVRFICggT1IgUkVQTEFDRSApPyArCitGVU5DVElPTiAoIElGIE5PVCBFWElTVFMgKT8gKworKCBgLicgKT8gICsKK2AoJyAoIGAsJyApKiBgKScgKworKCBDQUxMRUQgfCBSRVRVUk5TIE5VTEwgKSBPTiBOVUxMIElOUFVUICsKK1JFVFVSTlMgICsKK0xBTkdVQUdFICArCitBUworCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4gKworQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gc29tZWZ1bmN0aW9uICsKKyggc29tZWFyZyBpbnQsIGFub3RoZXJhcmcgdGV4dCwgY29tcGxleGFyZyBmcm96ZW4sIGxpc3RhcmcgbGlzdCApICsKK1JFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICsKK1JFVFVSTlMgdGV4dCArCitMQU5HVUFHRSBqYXZhICsKK0FTICQkICsKKy8vIHNvbWUgSmF2YSBjb2RlICsKKyQkOyArCitDUkVBVEUgRlVOQ1RJT04gYWtleXNwYWNlLmZuYW1lIElGIE5PVCBFWElTVFMgKworKCBzb21lQXJnIGludCApICsKK0NBTExFRCBPTiBOVUxMIElOUFVUICsKK1JFVFVSTlMgdGV4dCArCitMQU5HVUFHRSBqYXZhICsKK0FTICQkICsKKy8vIHNvbWUgSmF2YSBjb2RlICsKKyQkOworCitgQ1JFQVRFIEZVTkNUSU9OYCBjcmVhdGVzIG9yIHJlcGxhY2VzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uLgorCitbW2Z1bmN0aW9uU2lnbmF0dXJlXV0KKz09PT09IEZ1bmN0aW9uIFNpZ25hdHVyZQorCitTaWduYXR1cmVzIGFyZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGluZGl2aWR1YWwgZnVuY3Rpb25zLiBUaGUgc2lnbmF0dXJlCitjb25zaXN0cyBvZjoKKworLiBUaGUgZnVsbHkgcXVhbGlmaWVkIGZ1bmN0aW9uIG5hbWUgLSBpLmUgX2tleXNwYWNlXyBwbHVzCitfZnVuY3Rpb24tbmFtZV8KKy4gVGhlIGNvbmNhdGVuYXRlZCBsaXN0IG9mIGFsbCBhcmd1bWVudCB0eXBlcworCitOb3RlIHRoYXQga2V5c3BhY2UgbmFtZXMsIGZ1bmN0aW9uIG5hbWVzIGFuZCBhcmd1bWVudCB0eXBlcyBhcmUgc3ViamVjdAordG8gdGhlIGRlZmF1bHQgbmFtaW5nIGNvbnZlbnRpb25zIGFuZCBjYXNlLXNlbnNpdGl2aXR5IHJ1bGVzLgorCitgQ1JFQVRFIEZVTkNUSU9OYCB3aXRoIHRoZSBvcHRpb25hbCBgT1IgUkVQTEFDRWAga2V5d29yZHMgZWl0aGVyIGNyZWF0ZXMKK2EgZnVuY3Rpb24gb3IgcmVwbGFjZXMgYW4gZXhpc3Rpbmcgb25lIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlLiBBCitgQ1JFQVRFIEZVTkNUSU9OYCB3aXRob3V0IGBPUiBSRVBMQUNFYCBmYWlscyBpZiBhIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUKK3NpZ25hdHVyZSBhbHJlYWR5IGV4aXN0cy4KKworQmVoYXZpb3Igb24gaW52b2NhdGlvbiB3aXRoIGBudWxsYCB2YWx1ZXMgbXVzdCBiZSBkZWZpbmVkIGZvciBlYWNoCitmdW5jdGlvbi4gVGhlcmUgYXJlIHR3byBvcHRpb25zOgorCisuIGBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVGAgZGVjbGFyZXMgdGhhdCB0aGUgZnVuY3Rpb24gd2lsbCBhbHdheXMKK3JldHVybiBgbnVsbGAgaWYgYW55IG9mIHRoZSBpbnB1dCBhcmd1bWVudHMgaXMgYG51bGxgLgorLiBgQ0FMTEVEIE9OIE5VTEwgSU5QVVRgIGRlY2xhcmVzIHRoYXQgdGhlIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIGJlCitleGVjdXRlZC4KKworSWYgdGhlIG9wdGlvbmFsIGBJRiBOT1QgRVhJU1RTYCBrZXl3b3JkcyBhcmUgdXNlZCwgdGhlIGZ1bmN0aW9uIHdpbGwKK29ubHkgYmUgY3JlYXRlZCBpZiBhbm90aGVyIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGRvZXMgbm90CitleGlzdC4KKworYE9SIFJFUExBQ0VgIGFuZCBgSUYgTk9UIEVYSVNUYCBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci4KKworRnVuY3Rpb25zIGJlbG9uZyB0byBhIGtleXNwYWNlLiBJZiBubyBrZXlzcGFjZSBpcyBzcGVjaWZpZWQgaW4KK2A8ZnVuY3Rpb24tbmFtZT5gLCB0aGUgY3VycmVudCBrZXlzcGFjZSBpcyB1c2VkIChpLmUuIHRoZSBrZXlzcGFjZQorc3BlY2lmaWVkIHVzaW5nIHRoZSBsaW5rOiN1c2VTdG10W2BVU0VgXSBzdGF0ZW1lbnQpLiBJdCBpcyBub3QgcG9zc2libGUKK3RvIGNyZWF0ZSBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBpbiBvbmUgb2YgdGhlIHN5c3RlbSBrZXlzcGFjZXMuCisKK1NlZSB0aGUgc2VjdGlvbiBvbiBsaW5rOiN1ZGZzW3VzZXItZGVmaW5lZCBmdW5jdGlvbnNdIGZvciBtb3JlCitpbmZvcm1hdGlvbi4KKworW1tkcm9wRnVuY3Rpb25TdG10XV0KKz09PT0gRFJPUCBGVU5DVElPTgorCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4uICsKKzo6PSBEUk9QIEZVTkNUSU9OICggSUYgRVhJU1RTICk/ICsKKyggYC4nICk/ICArCisoIGAoJyAoIGAsJyApKiBgKScgKT8KKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuICsKK0RST1AgRlVOQ1RJT04gbXlmdW5jdGlvbjsgKworRFJPUCBGVU5DVElPTiBteWtleXNwYWNlLmFmdW5jdGlvbjsgKworRFJPUCBGVU5DVElPTiBhZnVuY3Rpb24gKCBpbnQgKTsgKworRFJPUCBGVU5DVElPTiBhZnVuY3Rpb24gKCB0ZXh0ICk7CisKK2BEUk9QIEZVTkNUSU9OYCBzdGF0ZW1lbnQgcmVtb3ZlcyBhIGZ1bmN0aW9uIGNyZWF0ZWQgdXNpbmcKK2BDUkVBVEUgRlVOQ1RJT05gLiArCitZb3UgbXVzdCBzcGVjaWZ5IHRoZSBhcmd1bWVudCB0eXBlcyAobGluazojZnVuY3Rpb25TaWduYXR1cmVbc2lnbmF0dXJlXQorKSBvZiB0aGUgZnVuY3Rpb24gdG8gZHJvcCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgZnVuY3Rpb25zIHdpdGggdGhlIHNhbWUKK25hbWUgYnV0IGEgZGlmZmVyZW50IHNpZ25hdHVyZSAob3ZlcmxvYWRlZCBmdW5jdGlvbnMpLgorCitgRFJPUCBGVU5DVElPTmAgd2l0aCB0aGUgb3B0aW9uYWwgYElGIEVYSVNUU2Aga2V5d29yZHMgZHJvcHMgYSBmdW5jdGlvbgoraWYgaXQgZXhpc3RzLgorCitbW2NyZWF0ZUFnZ3JlZ2F0ZVN0bXRdXQorPT09PSBDUkVBVEUgQUdHUkVHQVRFCisKK19TeW50YXg6XworCitiYyhzeW50YXgpLi4gKworOjo9IENSRUFURSAoIE9SIFJFUExBQ0UgKT8gKworQUdHUkVHQVRFICggSUYgTk9UIEVYSVNUUyApPyArCisoIGAuJyApPyAgKworYCgnICggYCwnICkqIGApJyArCitTRlVOQyAgKworU1RZUEUgICsKKyggRklOQUxGVU5DICk/ICsKKyggSU5JVENPTkQgKT8gKworcC4gKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuICsKK0NSRUFURSBBR0dSRUdBVEUgbXlhZ2dyZWdhdGUgKCB2YWwgdGV4dCApICsKK1NGVU5DIG15YWdncmVnYXRlX3N0YXRlICsKK1NUWVBFIHRleHQgKworRklOQUxGVU5DIG15YWdncmVnYXRlX2ZpbmFsICsKK0lOSVRDT05EIGBmb28nOworCitTZWUgdGhlIHNlY3Rpb24gb24gbGluazojdWRhc1t1c2VyLWRlZmluZWQgYWdncmVnYXRlc10gZm9yIGEgY29tcGxldGUKK2V4YW1wbGUuCisKK2BDUkVBVEUgQUdHUkVHQVRFYCBjcmVhdGVzIG9yIHJlcGxhY2VzIGEgdXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZS4KKworYENSRUFURSBBR0dSRUdBVEVgIHdpdGggdGhlIG9wdGlvbmFsIGBPUiBSRVBMQUNFYCBrZXl3b3JkcyBlaXRoZXIKK2NyZWF0ZXMgYW4gYWdncmVnYXRlIG9yIHJlcGxhY2VzIGFuIGV4aXN0aW5nIG9uZSB3aXRoIHRoZSBzYW1lCitzaWduYXR1cmUuIEEgYENSRUFURSBBR0dSRUdBVEVgIHdpdGhvdXQgYE9SIFJFUExBQ0VgIGZhaWxzIGlmIGFuCithZ2dyZWdhdGUgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgYWxyZWFkeSBleGlzdHMuCisKK2BDUkVBVEUgQUdHUkVHQVRFYCB3aXRoIHRoZSBvcHRpb25hbCBgSUYgTk9UIEVYSVNUU2Aga2V5d29yZHMgZWl0aGVyCitjcmVhdGVzIGFuIGFnZ3JlZ2F0ZSBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgorCitgT1IgUkVQTEFDRWAgYW5kIGBJRiBOT1QgRVhJU1RgIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyLgorCitBZ2dyZWdhdGVzIGJlbG9uZyB0byBhIGtleXNwYWNlLiBJZiBubyBrZXlzcGFjZSBpcyBzcGVjaWZpZWQgaW4KK2A8YWdncmVnYXRlLW5hbWU+YCwgdGhlIGN1cnJlbnQga2V5c3BhY2UgaXMgdXNlZCAoaS5lLiB0aGUga2V5c3BhY2UKK3NwZWNpZmllZCB1c2luZyB0aGUgbGluazojdXNlU3RtdFtgVVNFYF0gc3RhdGVtZW50KS4gSXQgaXMgbm90IHBvc3NpYmxlCit0byBjcmVhdGUgYSB1c2VyLWRlZmluZWQgYWdncmVnYXRlIGluIG9uZSBvZiB0aGUgc3lzdGVtIGtleXNwYWNlcy4KKworU2lnbmF0dXJlcyBmb3IgdXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZXMgZm9sbG93IHRoZQorbGluazojZnVuY3Rpb25TaWduYXR1cmVbc2FtZSBydWxlc10gYXMgZm9yIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMuCisKK2BTVFlQRWAgZGVmaW5lcyB0aGUgdHlwZSBvZiB0aGUgc3RhdGUgdmFsdWUgYW5kIG11c3QgYmUgc3BlY2lmaWVkLgorCitUaGUgb3B0aW9uYWwgYElOSVRDT05EYCBkZWZpbmVzIHRoZSBpbml0aWFsIHN0YXRlIHZhbHVlIGZvciB0aGUKK2FnZ3JlZ2F0ZS4gSXQgZGVmYXVsdHMgdG8gYG51bGxgLiBBIG5vbi1gbnVsbGAgYElOSVRDT05EYCBtdXN0IGJlCitzcGVjaWZpZWQgZm9yIHN0YXRlIGZ1bmN0aW9ucyB0aGF0IGFyZSBkZWNsYXJlZCB3aXRoCitgUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVRgLgorCitgU0ZVTkNgIHJlZmVyZW5jZXMgYW4gZXhpc3RpbmcgZnVuY3Rpb24gdG8gYmUgdXNlZCBhcyB0aGUgc3RhdGUKK21vZGlmeWluZyBmdW5jdGlvbi4gVGhlIHR5cGUgb2YgZmlyc3QgYXJndW1lbnQgb2YgdGhlIHN0YXRlIGZ1bmN0aW9uCittdXN0IG1hdGNoIGBTVFlQRWAuIFRoZSByZW1haW5pbmcgYXJndW1lbnQgdHlwZXMgb2YgdGhlIHN0YXRlIGZ1bmN0aW9uCittdXN0IG1hdGNoIHRoZSBhcmd1bWVudCB0eXBlcyBvZiB0aGUgYWdncmVnYXRlIGZ1bmN0aW9uLiBTdGF0ZSBpcyBub3QKK3VwZGF0ZWQgZm9yIHN0YXRlIGZ1bmN0aW9ucyBkZWNsYXJlZCB3aXRoIGBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVGAKK2FuZCBjYWxsZWQgd2l0aCBgbnVsbGAuCisKK1RoZSBvcHRpb25hbCBgRklOQUxGVU5DYCBpcyBjYWxsZWQganVzdCBiZWZvcmUgdGhlIGFnZ3JlZ2F0ZSByZXN1bHQgaXMKK3JldHVybmVkLiBJdCBtdXN0IHRha2Ugb25seSBvbmUgYXJndW1lbnQgd2l0aCB0eXBlIGBTVFlQRWAuIFRoZSByZXR1cm4KK3R5cGUgb2YgdGhlIGBGSU5BTEZVTkNgIG1heSBiZSBhIGRpZmZlcmVudCB0eXBlLiBBIGZpbmFsIGZ1bmN0aW9uCitkZWNsYXJlZCB3aXRoIGBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVGAgbWVhbnMgdGhhdCB0aGUgYWdncmVnYXRl4oCZcworcmV0dXJuIHZhbHVlIHdpbGwgYmUgYG51bGxgLCBpZiB0aGUgbGFzdCBzdGF0ZSBpcyBgbnVsbGAuCisKK0lmIG5vIGBGSU5BTEZVTkNgIGlzIGRlZmluZWQsIHRoZSBvdmVyYWxsIHJldHVybiB0eXBlIG9mIHRoZSBhZ2dyZWdhdGUKK2Z1bmN0aW9uIGlzIGBTVFlQRWAuIElmIGEgYEZJTkFMRlVOQ2AgaXMgZGVmaW5lZCwgaXQgaXMgdGhlIHJldHVybiB0eXBlCitvZiB0aGF0IGZ1bmN0aW9uLgorCitTZWUgdGhlIHNlY3Rpb24gb24gbGluazojdWRhc1t1c2VyLWRlZmluZWQgYWdncmVnYXRlc10gZm9yIG1vcmUKK2luZm9ybWF0aW9uLgorCitbW2Ryb3BBZ2dyZWdhdGVTdG10XV0KKz09PT0gRFJPUCBBR0dSRUdBVEUKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuLiArCis6Oj0gRFJPUCBBR0dSRUdBVEUgKCBJRiBFWElTVFMgKT8gKworKCBgLicgKT8gICsKKyggYCgnICggYCwnICkqIGApJyApPyArCitwLgorCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4gKworRFJPUCBBR0dSRUdBVEUgbXlBZ2dyZWdhdGU7ICsKK0RST1AgQUdHUkVHQVRFIG15S2V5c3BhY2UuYW5BZ2dyZWdhdGU7ICsKK0RST1AgQUdHUkVHQVRFIHNvbWVBZ2dyZWdhdGUgKCBpbnQgKTsgKworRFJPUCBBR0dSRUdBVEUgc29tZUFnZ3JlZ2F0ZSAoIHRleHQgKTsKKworVGhlIGBEUk9QIEFHR1JFR0FURWAgc3RhdGVtZW50IHJlbW92ZXMgYW4gYWdncmVnYXRlIGNyZWF0ZWQgdXNpbmcKK2BDUkVBVEUgQUdHUkVHQVRFYC4gWW91IG11c3Qgc3BlY2lmeSB0aGUgYXJndW1lbnQgdHlwZXMgb2YgdGhlIGFnZ3JlZ2F0ZQordG8gZHJvcCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgYWdncmVnYXRlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYnV0IGEKK2RpZmZlcmVudCBzaWduYXR1cmUgKG92ZXJsb2FkZWQgYWdncmVnYXRlcykuCisKK2BEUk9QIEFHR1JFR0FURWAgd2l0aCB0aGUgb3B0aW9uYWwgYElGIEVYSVNUU2Aga2V5d29yZHMgZHJvcHMgYW4KK2FnZ3JlZ2F0ZSBpZiBpdCBleGlzdHMsIGFuZCBkb2VzIG5vdGhpbmcgaWYgYSBmdW5jdGlvbiB3aXRoIHRoZQorc2lnbmF0dXJlIGRvZXMgbm90IGV4aXN0LgorCitTaWduYXR1cmVzIGZvciB1c2VyLWRlZmluZWQgYWdncmVnYXRlcyBmb2xsb3cgdGhlCitsaW5rOiNmdW5jdGlvblNpZ25hdHVyZVtzYW1lIHJ1bGVzXSBhcyBmb3IgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucy4KKworW1tkYXRhTWFuaXB1bGF0aW9uXV0KKz09PSBEYXRhIE1hbmlwdWxhdGlvbgorCitbW2luc2VydFN0bXRdXQorPT09PSBJTlNFUlQKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuLiArCis6Oj0gSU5TRVJUIElOVE8gICsKKyggKCBWQUxVRVMgKSArCit8ICggSlNPTiApKSArCisoIElGIE5PVCBFWElTVFMgKT8gKworKCBVU0lORyAoIEFORCApKiApPworCis6Oj0gYCgnICggYCwnICkqIGApJworCis6Oj0gYCgnICggYCwnICkqIGApJworCis6Oj0gVElNRVNUQU1QICArCit8IFRUTCAgKworcC4gKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuLiArCitJTlNFUlQgSU5UTyBOZXJkTW92aWVzIChtb3ZpZSwgZGlyZWN0b3IsIG1haW5fYWN0b3IsIHllYXIpICsKK1ZBTFVFUyAoYFNlcmVuaXR5JywgYEpvc3MgV2hlZG9uJywgYE5hdGhhbiBGaWxsaW9uJywgMjAwNSkgKworVVNJTkcgVFRMIDg2NDAwOworCitJTlNFUlQgSU5UTyBOZXJkTW92aWVzIEpTT04gYFx7YGBtb3ZpZScnOiBgYFNlcmVuaXR5JycsIGBgZGlyZWN0b3InJzoKK2BgSm9zcyBXaGVkb24nJywgYGB5ZWFyJyc6IDIwMDV9JyArCitwLiArCitUaGUgYElOU0VSVGAgc3RhdGVtZW50IHdyaXRlcyBvbmUgb3IgbW9yZSBjb2x1bW5zIGZvciBhIGdpdmVuIHJvdyBpbiBhCit0YWJsZS4gTm90ZSB0aGF0IHNpbmNlIGEgcm93IGlzIGlkZW50aWZpZWQgYnkgaXRzIGBQUklNQVJZIEtFWWAsIGF0CitsZWFzdCB0aGUgY29sdW1ucyBjb21wb3NpbmcgaXQgbXVzdCBiZSBzcGVjaWZpZWQuIFRoZSBsaXN0IG9mIGNvbHVtbnMgdG8KK2luc2VydCB0byBtdXN0IGJlIHN1cHBsaWVkIHdoZW4gdXNpbmcgdGhlIGBWQUxVRVNgIHN5bnRheC4gV2hlbiB1c2luZwordGhlIGBKU09OYCBzeW50YXgsIHRoZXkgYXJlIG9wdGlvbmFsLiBTZWUgdGhlIHNlY3Rpb24gb24KK2xpbms6I2luc2VydEpzb25bYElOU0VSVCBKU09OYF0gZm9yIG1vcmUgZGV0YWlscy4KKworTm90ZSB0aGF0IHVubGlrZSBpbiBTUUwsIGBJTlNFUlRgIGRvZXMgbm90IGNoZWNrIHRoZSBwcmlvciBleGlzdGVuY2Ugb2YKK3RoZSByb3cgYnkgZGVmYXVsdDogdGhlIHJvdyBpcyBjcmVhdGVkIGlmIG5vbmUgZXhpc3RlZCBiZWZvcmUsIGFuZAordXBkYXRlZCBvdGhlcndpc2UuIEZ1cnRoZXJtb3JlLCB0aGVyZSBpcyBubyBtZWFuIHRvIGtub3cgd2hpY2ggb2YKK2NyZWF0aW9uIG9yIHVwZGF0ZSBoYXBwZW5lZC4KKworSXQgaXMgaG93ZXZlciBwb3NzaWJsZSB0byB1c2UgdGhlIGBJRiBOT1QgRVhJU1RTYCBjb25kaXRpb24gdG8gb25seQoraW5zZXJ0IGlmIHRoZSByb3cgZG9lcyBub3QgZXhpc3QgcHJpb3IgdG8gdGhlIGluc2VydGlvbi4gQnV0IHBsZWFzZSBub3RlCit0aGF0IHVzaW5nIGBJRiBOT1QgRVhJU1RTYCB3aWxsIGluY3VyIGEgbm9uIG5lZ2xpZ2libGUgcGVyZm9ybWFuY2UgY29zdAorKGludGVybmFsbHksIFBheG9zIHdpbGwgYmUgdXNlZCkgc28gdGhpcyBzaG91bGQgYmUgdXNlZCBzcGFyaW5nbHkuCisKK0FsbCB1cGRhdGVzIGZvciBhbiBgSU5TRVJUYCBhcmUgYXBwbGllZCBhdG9taWNhbGx5IGFuZCBpbiBpc29sYXRpb24uCisKK1BsZWFzZSByZWZlciB0byB0aGUgbGluazojdXBkYXRlT3B0aW9uc1tgVVBEQVRFYF0gc2VjdGlvbiBmb3IKK2luZm9ybWF0aW9uIG9uIHRoZSBgPG9wdGlvbj5gIGF2YWlsYWJsZSBhbmQgdG8gdGhlCitsaW5rOiNjb2xsZWN0aW9uc1tjb2xsZWN0aW9uc10gc2VjdGlvbiBmb3IgdXNlIG9mCitgPGNvbGxlY3Rpb24tbGl0ZXJhbD5gLiBBbHNvIG5vdGUgdGhhdCBgSU5TRVJUYCBkb2VzIG5vdCBzdXBwb3J0Citjb3VudGVycywgd2hpbGUgYFVQREFURWAgZG9lcy4KKworW1t1cGRhdGVTdG10XV0KKz09PT0gVVBEQVRFCisKK19TeW50YXg6XworCitiYyhzeW50YXgpLi4gKworOjo9IFVQREFURSAgKworKCBVU0lORyAoIEFORCApKiApPyArCitTRVQgKCBgLCcgKSogKworV0hFUkUgICsKKyggSUYgKCBBTkQgY29uZGl0aW9uICkqICk/CisKKzo6PSBgPScgICsKK3wgYD0nIChgKycgfCBgLScpICggfCB8ICkgKworfCBgPScgYCsnICArCit8IGBbJyBgXScgYD0nICArCit8IGAuJyBgPScKKworOjo9ICArCit8IENPTlRBSU5TIChLRVkpPyArCit8IElOICArCit8IGBbJyBgXScgICsKK3wgYFsnIGBdJyBJTiAgKworfCBgLicgICsKK3wgYC4nIElOCisKKzo6PSBgPCcgfCBgPD0nIHwgYD0nIHwgYCE9JyB8IGA+PScgfCBgPicgKworOjo9ICggfCBgKCcgKCAoIGAsJyApKiApPyBgKScpCisKKzo6PSAoIEFORCApKgorCis6Oj0gYD0nICArCit8IGAoJyAoYCwnICkqIGApJyBgPScgICsKK3wgSU4gYCgnICggKCBgLCcgKSogKT8gYCknICsKK3wgSU4gICsKK3wgYCgnIChgLCcgKSogYCknIElOIGAoJyAoICggYCwnICkqICk/IGApJyArCit8IGAoJyAoYCwnICkqIGApJyBJTgorCis6Oj0gVElNRVNUQU1QICArCit8IFRUTCAgKworcC4gKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuLiArCitVUERBVEUgTmVyZE1vdmllcyBVU0lORyBUVEwgNDAwICsKK1NFVCBkaXJlY3RvciA9IGBKb3NzIFdoZWRvbicsICsKK21haW5fYWN0b3IgPSBgTmF0aGFuIEZpbGxpb24nLCArCit5ZWFyID0gMjAwNSArCitXSEVSRSBtb3ZpZSA9IGBTZXJlbml0eSc7CisKK1VQREFURSBVc2VyQWN0aW9ucyBTRVQgdG90YWwgPSB0b3RhbCArIDIgV0hFUkUgdXNlciA9CitCNzBERTFEMC05OTA4LTRBRTMtQkUzNC01NTczRTVCMDlGMTQgQU5EIGFjdGlvbiA9IGBjbGljayc7ICsKK3AuICsKK1RoZSBgVVBEQVRFYCBzdGF0ZW1lbnQgd3JpdGVzIG9uZSBvciBtb3JlIGNvbHVtbnMgZm9yIGEgZ2l2ZW4gcm93IGluIGEKK3RhYmxlLiBUaGUgYDx3aGVyZS1jbGF1c2U+YCBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgcm93IHRvIHVwZGF0ZSBhbmQgbXVzdAoraW5jbHVkZSBhbGwgY29sdW1ucyBjb21wb3NpbmcgdGhlIGBQUklNQVJZIEtFWWAuIE90aGVyIGNvbHVtbnMgdmFsdWVzCithcmUgc3BlY2lmaWVkIHRocm91Z2ggYDxhc3NpZ25tZW50PmAgYWZ0ZXIgdGhlIGBTRVRgIGtleXdvcmQuCisKK05vdGUgdGhhdCB1bmxpa2UgaW4gU1FMLCBgVVBEQVRFYCBkb2VzIG5vdCBjaGVjayB0aGUgcHJpb3IgZXhpc3RlbmNlIG9mCit0aGUgcm93IGJ5IGRlZmF1bHQgKGV4Y2VwdCB0aHJvdWdoIHRoZSB1c2Ugb2YgYDxjb25kaXRpb24+YCwgc2VlIGJlbG93KToKK3RoZSByb3cgaXMgY3JlYXRlZCBpZiBub25lIGV4aXN0ZWQgYmVmb3JlLCBhbmQgdXBkYXRlZCBvdGhlcndpc2UuCitGdXJ0aGVybW9yZSwgdGhlcmUgYXJlIG5vIG1lYW5zIHRvIGtub3cgd2hldGhlciBhIGNyZWF0aW9uIG9yIHVwZGF0ZQorb2NjdXJyZWQuCisKK0l0IGlzIGhvd2V2ZXIgcG9zc2libGUgdG8gdXNlIHRoZSBjb25kaXRpb25zIG9uIHNvbWUgY29sdW1ucyB0aHJvdWdoCitgSUZgLCBpbiB3aGljaCBjYXNlIHRoZSByb3cgd2lsbCBub3QgYmUgdXBkYXRlZCB1bmxlc3MgdGhlIGNvbmRpdGlvbnMKK2FyZSBtZXQuIEJ1dCwgcGxlYXNlIG5vdGUgdGhhdCB1c2luZyBgSUZgIGNvbmRpdGlvbnMgd2lsbCBpbmN1ciBhCitub24tbmVnbGlnaWJsZSBwZXJmb3JtYW5jZSBjb3N0IChpbnRlcm5hbGx5LCBQYXhvcyB3aWxsIGJlIHVzZWQpIHNvIHRoaXMKK3Nob3VsZCBiZSB1c2VkIHNwYXJpbmdseS4KKworSW4gYW4gYFVQREFURWAgc3RhdGVtZW50LCBhbGwgdXBkYXRlcyB3aXRoaW4gdGhlIHNhbWUgcGFydGl0aW9uIGtleSBhcmUKK2FwcGxpZWQgYXRvbWljYWxseSBhbmQgaW4gaXNvbGF0aW9uLgorCitUaGUgYGMgPSBjICsgM2AgZm9ybSBvZiBgPGFzc2lnbm1lbnQ+YCBpcyB1c2VkIHRvIGluY3JlbWVudC9kZWNyZW1lbnQKK2NvdW50ZXJzLiBUaGUgaWRlbnRpZmllciBhZnRlciB0aGUgYD0nIHNpZ24gKm11c3QqIGJlIHRoZSBzYW1lIHRoYW4gdGhlCitvbmUgYmVmb3JlIHRoZSBgPScgc2lnbiAoT25seSBpbmNyZW1lbnQvZGVjcmVtZW50IGlzIHN1cHBvcnRlZCBvbgorY291bnRlcnMsIG5vdCB0aGUgYXNzaWdubWVudCBvZiBhIHNwZWNpZmljIHZhbHVlKS4KKworVGhlIGBpZCA9IGlkICsgPGNvbGxlY3Rpb24tbGl0ZXJhbD5gIGFuZCBgaWRbdmFsdWUxXSA9IHZhbHVlMmAgZm9ybXMgb2YKK2A8YXNzaWdubWVudD5gIGFyZSBmb3IgY29sbGVjdGlvbnMuIFBsZWFzZSByZWZlciB0byB0aGUKK2xpbms6I2NvbGxlY3Rpb25zW3JlbGV2YW50IHNlY3Rpb25dIGZvciBtb3JlIGRldGFpbHMuCisKK1RoZSBgaWQuZmllbGQgPSA8dGVybT5gIGZvcm0gb2YgYDxhc3NpZ25lbXQ+YCBpcyBmb3Igc2V0dGluZyB0aGUgdmFsdWUKK29mIGEgc2luZ2xlIGZpZWxkIG9uIGEgbm9uLWZyb3plbiB1c2VyLWRlZmluZWQgdHlwZXMuCisKK1tbdXBkYXRlT3B0aW9uc11dCis9PT09PSBgPG9wdGlvbnM+YAorCitUaGUgYFVQREFURWAgYW5kIGBJTlNFUlRgIHN0YXRlbWVudHMgc3VwcG9ydCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKKyogYFRJTUVTVEFNUGA6IHNldHMgdGhlIHRpbWVzdGFtcCBmb3IgdGhlIG9wZXJhdGlvbi4gSWYgbm90IHNwZWNpZmllZCwKK3RoZSBjb29yZGluYXRvciB3aWxsIHVzZSB0aGUgY3VycmVudCB0aW1lIChpbiBtaWNyb3NlY29uZHMpIGF0IHRoZSBzdGFydAorb2Ygc3RhdGVtZW50IGV4ZWN1dGlvbiBhcyB0aGUgdGltZXN0YW1wLiBUaGlzIGlzIHVzdWFsbHkgYSBzdWl0YWJsZQorZGVmYXVsdC4KKyogYFRUTGA6IHNwZWNpZmllcyBhbiBvcHRpb25hbCBUaW1lIFRvIExpdmUgKGluIHNlY29uZHMpIGZvciB0aGUKK2luc2VydGVkIHZhbHVlcy4gSWYgc2V0LCB0aGUgaW5zZXJ0ZWQgdmFsdWVzIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQKK2Zyb20gdGhlIGRhdGFiYXNlIGFmdGVyIHRoZSBzcGVjaWZpZWQgdGltZS4gTm90ZSB0aGF0IHRoZSBUVEwgY29uY2VybnMKK3RoZSBpbnNlcnRlZCB2YWx1ZXMsIG5vdCB0aGUgY29sdW1ucyB0aGVtc2VsdmVzLiBUaGlzIG1lYW5zIHRoYXQgYW55CitzdWJzZXF1ZW50IHVwZGF0ZSBvZiB0aGUgY29sdW1uIHdpbGwgYWxzbyByZXNldCB0aGUgVFRMICh0byB3aGF0ZXZlciBUVEwKK2lzIHNwZWNpZmllZCBpbiB0aGF0IHVwZGF0ZSkuIEJ5IGRlZmF1bHQsIHZhbHVlcyBuZXZlciBleHBpcmUuIEEgVFRMIG9mCiswIGlzIGVxdWl2YWxlbnQgdG8gbm8gVFRMLiBJZiB0aGUgdGFibGUgaGFzIGEgZGVmYXVsdF90aW1lX3RvX2xpdmUsIGEKK1RUTCBvZiAwIHdpbGwgcmVtb3ZlIHRoZSBUVEwgZm9yIHRoZSBpbnNlcnRlZCBvciB1cGRhdGVkIHZhbHVlcy4KKworW1tkZWxldGVTdG10XV0KKz09PT0gREVMRVRFCisKK19TeW50YXg6XworCitiYyhzeW50YXgpLi4gKworOjo9IERFTEVURSAoICggYCwnICkqICk/ICsKK0ZST00gICsKKyggVVNJTkcgVElNRVNUQU1QICk/ICsKK1dIRVJFICArCisoIElGICggRVhJU1RTIHwgKCAoIEFORCApKikgKSApPworCis6Oj0gICsKK3wgYFsnIGBdJyArCit8IGAuJworCis6Oj0gKCBBTkQgKSoKKworOjo9ICArCit8IGAoJyAoYCwnICkqIGApJyAgKworfCBJTiBgKCcgKCAoIGAsJyApKiApPyBgKScgKworfCBJTiAgKworfCBgKCcgKGAsJyApKiBgKScgSU4gYCgnICggKCBgLCcgKSogKT8gYCknICsKK3wgYCgnIChgLCcgKSogYCknIElOCisKKzo6PSBgPScgfCBgPCcgfCBgPicgfCBgPD0nIHwgYD49JyArCis6Oj0gKCB8IGAoJyAoICggYCwnICkqICk/IGApJykKKworOjo9ICggfCBgIT0nKSAgKworfCBDT05UQUlOUyAoS0VZKT8gKworfCBJTiAgKworfCBgWycgYF0nICggfCBgIT0nKSAgKworfCBgWycgYF0nIElOICArCit8IGAuJyAoIHwgYCE9JykgICsKK3wgYC4nIElOCisKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLi4gKworREVMRVRFIEZST00gTmVyZE1vdmllcyBVU0lORyBUSU1FU1RBTVAgMTI0MDAwMzEzNCBXSEVSRSBtb3ZpZSA9CitgU2VyZW5pdHknOworCitERUxFVEUgcGhvbmUgRlJPTSBVc2VycyBXSEVSRSB1c2VyaWQgSU4KKyhDNzNERTFEMy1BRjA4LTQwRjMtQjEyNC0zRkYzRTUxMDlGMjIsCitCNzBERTFEMC05OTA4LTRBRTMtQkUzNC01NTczRTVCMDlGMTQpOyArCitwLiArCitUaGUgYERFTEVURWAgc3RhdGVtZW50IGRlbGV0ZXMgY29sdW1ucyBhbmQgcm93cy4gSWYgY29sdW1uIG5hbWVzIGFyZQorcHJvdmlkZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIGBERUxFVEVgIGtleXdvcmQsIG9ubHkgdGhvc2UgY29sdW1ucyBhcmUKK2RlbGV0ZWQgZnJvbSB0aGUgcm93IGluZGljYXRlZCBieSB0aGUgYDx3aGVyZS1jbGF1c2U+YC4gVGhlIGBpZFt2YWx1ZV1gCitzeW50YXggaW4gYDxzZWxlY3Rpb24+YCBpcyBmb3Igbm9uLWZyb3plbiBjb2xsZWN0aW9ucyAocGxlYXNlIHJlZmVyIHRvCit0aGUgbGluazojY29sbGVjdGlvbnNbY29sbGVjdGlvbiBzZWN0aW9uXSBmb3IgbW9yZSBkZXRhaWxzKS4gVGhlCitgaWQuZmllbGRgIHN5bnRheCBpcyBmb3IgdGhlIGRlbGV0aW9uIG9mIG5vbi1mcm96ZW4gdXNlci1kZWZpbmVkIHR5cGVzLgorT3RoZXJ3aXNlLCB3aG9sZSByb3dzIGFyZSByZW1vdmVkLiBUaGUgYDx3aGVyZS1jbGF1c2U+YCBzcGVjaWZpZXMgd2hpY2gKK3Jvd3MgYXJlIHRvIGJlIGRlbGV0ZWQuIE11bHRpcGxlIHJvd3MgbWF5IGJlIGRlbGV0ZWQgd2l0aCBvbmUgc3RhdGVtZW50CitieSB1c2luZyBhbiBgSU5gIGNsYXVzZS4gQSByYW5nZSBvZiByb3dzIG1heSBiZSBkZWxldGVkIHVzaW5nIGFuCitpbmVxdWFsaXR5IG9wZXJhdG9yIChzdWNoIGFzIGA+PWApLgorCitgREVMRVRFYCBzdXBwb3J0cyB0aGUgYFRJTUVTVEFNUGAgb3B0aW9uIHdpdGggdGhlIHNhbWUgc2VtYW50aWNzIGFzIHRoZQorbGluazojdXBkYXRlU3RtdFtgVVBEQVRFYF0gc3RhdGVtZW50LgorCitJbiBhIGBERUxFVEVgIHN0YXRlbWVudCwgYWxsIGRlbGV0aW9ucyB3aXRoaW4gdGhlIHNhbWUgcGFydGl0aW9uIGtleSBhcmUKK2FwcGxpZWQgYXRvbWljYWxseSBhbmQgaW4gaXNvbGF0aW9uLgorCitBIGBERUxFVEVgIG9wZXJhdGlvbiBjYW4gYmUgY29uZGl0aW9uYWwgdGhyb3VnaCB0aGUgdXNlIG9mIGFuIGBJRmAKK2NsYXVzZSwgc2ltaWxhciB0byBgVVBEQVRFYCBhbmQgYElOU0VSVGAgc3RhdGVtZW50cy4gSG93ZXZlciwgYXMgd2l0aAorYElOU0VSVGAgYW5kIGBVUERBVEVgIHN0YXRlbWVudHMsIHRoaXMgd2lsbCBpbmN1ciBhIG5vbi1uZWdsaWdpYmxlCitwZXJmb3JtYW5jZSBjb3N0IChpbnRlcm5hbGx5LCBQYXhvcyB3aWxsIGJlIHVzZWQpIGFuZCBzbyBzaG91bGQgYmUgdXNlZAorc3BhcmluZ2x5LgorCitbW2JhdGNoU3RtdF1dCis9PT09IEJBVENICisKK19TeW50YXg6XworCitiYyhzeW50YXgpLi4gKworOjo9IEJFR0lOICggVU5MT0dHRUQgfCBDT1VOVEVSICkgQkFUQ0ggKworKCBVU0lORyAoIEFORCApKiApPyArCisoIGA7JyApKiArCitBUFBMWSBCQVRDSAorCis6Oj0gICsKK3wgICsKK3wKKworOjo9IFRJTUVTVEFNUCAgKworcC4gKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuICsKK0JFR0lOIEJBVENIICsKK0lOU0VSVCBJTlRPIHVzZXJzICh1c2VyaWQsIHBhc3N3b3JkLCBuYW1lKSBWQUxVRVMgKGB1c2VyMicsIGBjaEBuZ2VtM2InLAorYHNlY29uZCB1c2VyJyk7ICsKK1VQREFURSB1c2VycyBTRVQgcGFzc3dvcmQgPSBgcHMyMmRoZHMnIFdIRVJFIHVzZXJpZCA9IGB1c2VyMyc7ICsKK0lOU0VSVCBJTlRPIHVzZXJzICh1c2VyaWQsIHBhc3N3b3JkKSBWQUxVRVMgKGB1c2VyNCcsIGBjaEBuZ2VtM2MnKTsgKworREVMRVRFIG5hbWUgRlJPTSB1c2VycyBXSEVSRSB1c2VyaWQgPSBgdXNlcjEnOyArCitBUFBMWSBCQVRDSDsKKworVGhlIGBCQVRDSGAgc3RhdGVtZW50IGdyb3VwIG11bHRpcGxlIG1vZGlmaWNhdGlvbiBzdGF0ZW1lbnRzCisoaW5zZXJ0aW9ucy91cGRhdGVzIGFuZCBkZWxldGlvbnMpIGludG8gYSBzaW5nbGUgc3RhdGVtZW50LiBJdCBzZXJ2ZXMKK3NldmVyYWwgcHVycG9zZXM6CisKKy4gSXQgc2F2ZXMgbmV0d29yayByb3VuZC10cmlwcyBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIgKGFuZAorc29tZXRpbWVzIGJldHdlZW4gdGhlIHNlcnZlciBjb29yZGluYXRvciBhbmQgdGhlIHJlcGxpY2FzKSB3aGVuIGJhdGNoaW5nCittdWx0aXBsZSB1cGRhdGVzLgorLiBBbGwgdXBkYXRlcyBpbiBhIGBCQVRDSGAgYmVsb25naW5nIHRvIGEgZ2l2ZW4gcGFydGl0aW9uIGtleSBhcmUKK3BlcmZvcm1lZCBpbiBpc29sYXRpb24uCisuIEJ5IGRlZmF1bHQsIGFsbCBvcGVyYXRpb25zIGluIHRoZSBiYXRjaCBhcmUgcGVyZm9ybWVkIGFzIGBMT0dHRURgLCB0bworZW5zdXJlIGFsbCBtdXRhdGlvbnMgZXZlbnR1YWxseSBjb21wbGV0ZSAob3Igbm9uZSB3aWxsKS4gU2VlIHRoZSBub3Rlcworb24gbGluazojdW5sb2dnZWRCYXRjaFtgVU5MT0dHRURgXSBmb3IgbW9yZSBkZXRhaWxzLgorCitOb3RlIHRoYXQ6CisKKyogYEJBVENIYCBzdGF0ZW1lbnRzIG1heSBvbmx5IGNvbnRhaW4gYFVQREFURWAsIGBJTlNFUlRgIGFuZCBgREVMRVRFYAorc3RhdGVtZW50cy4KKyogQmF0Y2hlcyBhcmUgX25vdF8gYSBmdWxsIGFuYWxvZ3VlIGZvciBTUUwgdHJhbnNhY3Rpb25zLgorKiBJZiBhIHRpbWVzdGFtcCBpcyBub3Qgc3BlY2lmaWVkIGZvciBlYWNoIG9wZXJhdGlvbiwgdGhlbiBhbGwKK29wZXJhdGlvbnMgd2lsbCBiZSBhcHBsaWVkIHdpdGggdGhlIHNhbWUgdGltZXN0YW1wLiBEdWUgdG8gQ2Fzc2FuZHJh4oCZcworY29uZmxpY3QgcmVzb2x1dGlvbiBwcm9jZWR1cmUgaW4gdGhlIGNhc2Ugb2YKK2h0dHA6Ly93aWtpLmFwYWNoZS5vcmcvY2Fzc2FuZHJhL0ZBUSNjbG9ja3RpZVt0aW1lc3RhbXAgdGllc10sCitvcGVyYXRpb25zIG1heSBiZSBhcHBsaWVkIGluIGFuIG9yZGVyIHRoYXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9yZGVyCit0aGV5IGFyZSBsaXN0ZWQgaW4gdGhlIGBCQVRDSGAgc3RhdGVtZW50LiBUbyBmb3JjZSBhIHBhcnRpY3VsYXIKK29wZXJhdGlvbiBvcmRlcmluZywgeW91IG11c3Qgc3BlY2lmeSBwZXItb3BlcmF0aW9uIHRpbWVzdGFtcHMuCisKK1tbdW5sb2dnZWRCYXRjaF1dCis9PT09PSBgVU5MT0dHRURgCisKK0J5IGRlZmF1bHQsIENhc3NhbmRyYSB1c2VzIGEgYmF0Y2ggbG9nIHRvIGVuc3VyZSBhbGwgb3BlcmF0aW9ucyBpbiBhCitiYXRjaCBldmVudHVhbGx5IGNvbXBsZXRlIG9yIG5vbmUgd2lsbCAobm90ZSBob3dldmVyIHRoYXQgb3BlcmF0aW9ucyBhcmUKK29ubHkgaXNvbGF0ZWQgd2l0aGluIGEgc2luZ2xlIHBhcnRpdGlvbikuCisKK1RoZXJlIGlzIGEgcGVyZm9ybWFuY2UgcGVuYWx0eSBmb3IgYmF0Y2ggYXRvbWljaXR5IHdoZW4gYSBiYXRjaCBzcGFucworbXVsdGlwbGUgcGFydGl0aW9ucy4gSWYgeW91IGRvIG5vdCB3YW50IHRvIGluY3VyIHRoaXMgcGVuYWx0eSwgeW91IGNhbgordGVsbCBDYXNzYW5kcmEgdG8gc2tpcCB0aGUgYmF0Y2hsb2cgd2l0aCB0aGUgYFVOTE9HR0VEYCBvcHRpb24uIElmIHRoZQorYFVOTE9HR0VEYCBvcHRpb24gaXMgdXNlZCwgYSBmYWlsZWQgYmF0Y2ggbWlnaHQgbGVhdmUgdGhlIHBhdGNoIG9ubHkKK3BhcnRseSBhcHBsaWVkLgorCitbW2NvdW50ZXJCYXRjaF1dCis9PT09PSBgQ09VTlRFUmAKKworVXNlIHRoZSBgQ09VTlRFUmAgb3B0aW9uIGZvciBiYXRjaGVkIGNvdW50ZXIgdXBkYXRlcy4gVW5saWtlIG90aGVyCit1cGRhdGVzIGluIENhc3NhbmRyYSwgY291bnRlciB1cGRhdGVzIGFyZSBub3QgaWRlbXBvdGVudC4KKworW1tiYXRjaE9wdGlvbnNdXQorPT09PT0gYDxvcHRpb24+YAorCitgQkFUQ0hgIHN1cHBvcnRzIGJvdGggdGhlIGBUSU1FU1RBTVBgIG9wdGlvbiwgd2l0aCBzaW1pbGFyIHNlbWFudGljIHRvCit0aGUgb25lIGRlc2NyaWJlZCBpbiB0aGUgbGluazojdXBkYXRlT3B0aW9uc1tgVVBEQVRFYF0gc3RhdGVtZW50ICh0aGUKK3RpbWVzdGFtcCBhcHBsaWVzIHRvIGFsbCB0aGUgc3RhdGVtZW50IGluc2lkZSB0aGUgYmF0Y2gpLiBIb3dldmVyLCBpZgordXNlZCwgYFRJTUVTVEFNUGAgKm11c3Qgbm90KiBiZSB1c2VkIGluIHRoZSBzdGF0ZW1lbnRzIHdpdGhpbiB0aGUgYmF0Y2guCisKKz09PSBRdWVyaWVzCisKK1tbc2VsZWN0U3RtdF1dCis9PT09IFNFTEVDVAorCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4uICsKKzo6PSBTRUxFQ1QgKCBKU09OICk/ICArCitGUk9NICArCisoIFdIRVJFICk/ICsKKyggR1JPVVAgQlkgKT8gKworKCBPUkRFUiBCWSApPyArCisoIFBFUiBQQVJUSVRJT04gTElNSVQgKT8gKworKCBMSU1JVCApPyArCisoIEFMTE9XIEZJTFRFUklORyApPworCis6Oj0gRElTVElOQ1Q/CisKKzo6PSAoQVMgKT8gKCBgLCcgKEFTICk/ICkqICsKK3wgYConCisKKzo6PSAgKworfCAgKworfCBXUklURVRJTUUgYCgnIGApJyArCit8IE1BWFdSSVRFVElNRSBgKCcgYCknICsKK3wgQ09VTlQgYCgnIGAqJyBgKScgKworfCBUVEwgYCgnIGApJyArCit8IENBU1QgYCgnIEFTIGApJyArCit8IGAoJyAoIChgLCcgKSopPyBgKScgKworfCBgLicgICsKK3wgYFsnIGBdJyArCit8IGBbJyA/IC4uID8gYF0nCisKKzo6PSAoIEFORCApKgorCis6Oj0gICsKK3wgYCgnIChgLCcgKSogYCknICArCit8IElOIGAoJyAoICggYCwnICkqICk/IGApJyArCit8IGAoJyAoYCwnICkqIGApJyBJTiBgKCcgKCAoIGAsJyApKiApPyBgKScgKworfCBUT0tFTiBgKCcgKCBgLCcgKSogYCknCisKKzo6PSBgPScgfCBgPCcgfCBgPicgfCBgPD0nIHwgYD49JyB8IENPTlRBSU5TIHwgQ09OVEFJTlMgS0VZICsKKzo6PSAoYCwnICkqICsKKzo6PSAoIGAsJyApKiArCis6Oj0gKCBBU0MgfCBERVNDICk/ICsKKzo6PSBgKCcgKGAsJyApKiBgKScgKworcC4gKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuLiArCitTRUxFQ1QgbmFtZSwgb2NjdXBhdGlvbiBGUk9NIHVzZXJzIFdIRVJFIHVzZXJpZCBJTiAoMTk5LCAyMDAsIDIwNyk7CisKK1NFTEVDVCBKU09OIG5hbWUsIG9jY3VwYXRpb24gRlJPTSB1c2VycyBXSEVSRSB1c2VyaWQgPSAxOTk7CisKK1NFTEVDVCBuYW1lIEFTIHVzZXJfbmFtZSwgb2NjdXBhdGlvbiBBUyB1c2VyX29jY3VwYXRpb24gRlJPTSB1c2VyczsKKworU0VMRUNUIHRpbWUsIHZhbHVlICsKK0ZST00gZXZlbnRzICsKK1dIRVJFIGV2ZW50X3R5cGUgPSBgbXlFdmVudCcgKworQU5EIHRpbWUgPiBgMjAxMS0wMi0wMycgKworQU5EIHRpbWUgPD0gYDIwMTItMDEtMDEnCisKK1NFTEVDVCBDT1VOVCAoKikgRlJPTSB1c2VyczsKKworU0VMRUNUIENPVU5UICgqKSBBUyB1c2VyX2NvdW50IEZST00gdXNlcnM7CisKK1RoZSBgU0VMRUNUYCBzdGF0ZW1lbnRzIHJlYWRzIG9uZSBvciBtb3JlIGNvbHVtbnMgZm9yIG9uZSBvciBtb3JlIHJvd3MKK2luIGEgdGFibGUuIEl0IHJldHVybnMgYSByZXN1bHQtc2V0IG9mIHJvd3MsIHdoZXJlIGVhY2ggcm93IGNvbnRhaW5zIHRoZQorY29sbGVjdGlvbiBvZiBjb2x1bW5zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHF1ZXJ5LiBJZiB0aGUgYEpTT05gIGtleXdvcmQKK2lzIHVzZWQsIHRoZSByZXN1bHRzIGZvciBlYWNoIHJvdyB3aWxsIGNvbnRhaW4gb25seSBhIHNpbmdsZSBjb2x1bW4KK25hbWVkIGBganNvbicnLiBTZWUgdGhlIHNlY3Rpb24gb24gbGluazojc2VsZWN0SnNvbltgU0VMRUNUIEpTT05gXSBmb3IKK21vcmUgZGV0YWlscy4KKworW1tzZWxlY3RTZWxlY3Rpb25dXQorPT09PT0gYDxzZWxlY3QtY2xhdXNlPmAKKworVGhlIGA8c2VsZWN0LWNsYXVzZT5gIGRldGVybWluZXMgd2hpY2ggY29sdW1ucyBuZWVkcyB0byBiZSBxdWVyaWVkIGFuZAorcmV0dXJuZWQgaW4gdGhlIHJlc3VsdC1zZXQuIEl0IGNvbnNpc3RzIG9mIGVpdGhlciB0aGUgY29tbWEtc2VwYXJhdGVkCitsaXN0IG9mIG9yIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgKGAqYCkgdG8gc2VsZWN0IGFsbCB0aGUgY29sdW1ucworZGVmaW5lZCBmb3IgdGhlIHRhYmxlLiBQbGVhc2Ugbm90ZSB0aGF0IGZvciB3aWxkY2FyZCBgU0VMRUNUYCBxdWVyaWVzCit0aGUgb3JkZXIgb2YgY29sdW1ucyByZXR1cm5lZCBpcyBub3Qgc3BlY2lmaWVkIGFuZCBpcyBub3QgZ3VhcmFudGVlZCB0bworYmUgc3RhYmxlIGJldHdlZW4gQ2Fzc2FuZHJhIHZlcnNpb25zLgorCitBIGA8c2VsZWN0b3I+YCBpcyBlaXRoZXIgYSBjb2x1bW4gbmFtZSB0byByZXRyaWV2ZSBvciBhIGA8ZnVuY3Rpb24+YCBvZgorb25lIG9yIG1vcmUgYDx0ZXJtPmBzLiBUaGUgZnVuY3Rpb24gYWxsb3dlZCBhcmUgdGhlIHNhbWUgYXMgZm9yIGA8dGVybT5gCithbmQgYXJlIGRlc2NyaWJlZCBpbiB0aGUgbGluazojZnVuY3Rpb25zW2Z1bmN0aW9uIHNlY3Rpb25dLiBJbiBhZGRpdGlvbgordG8gdGhlc2UgZ2VuZXJpYyBmdW5jdGlvbnMsIHRoZSBgV1JJVEVUSU1FYCBhbmQgYE1BWFdSSVRFVElNRWAgKHJlc3AuIGBUVExgKQorZnVuY3Rpb24gYWxsb3dzIHRvIHNlbGVjdCB0aGUgdGltZXN0YW1wIG9mIHdoZW4gdGhlIGNvbHVtbiB3YXMgaW5zZXJ0ZWQgKHJlc3AuCit0aGUgdGltZSB0byBsaXZlIChpbiBzZWNvbmRzKSBmb3IgdGhlIGNvbHVtbiAob3IgbnVsbCBpZiB0aGUgY29sdW1uIGhhcworbm8gZXhwaXJhdGlvbiBzZXQpKSBhbmQgdGhlIGxpbms6I2Nhc3RGdW5bYENBU1RgXSBmdW5jdGlvbiBjYW4gYmUgdXNlZAordG8gY29udmVydCBvbmUgZGF0YSB0eXBlIHRvIGFub3RoZXIuIFRoZSBgV1JJVEVUSU1FYCBhbmQgYFRUTGAgZnVuY3Rpb25zCitjYW4ndCBiZSB1c2VkIG9uIG11bHRpLWNlbGwgY29sdW1ucyBzdWNoIGFzIG5vbi1mcm96ZW4gY29sbGVjdGlvbnMgb3IKK25vbi1mcm96ZW4gdXNlci1kZWZpbmVkIHR5cGVzLgorCitBZGRpdGlvbmFsbHksIGluZGl2aWR1YWwgdmFsdWVzIG9mIG1hcHMgYW5kIHNldHMgY2FuIGJlIHNlbGVjdGVkIHVzaW5nCitgWyA8dGVybT4gXWAuIEZvciBtYXBzLCB0aGlzIHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZQora2V5LCBpZiBzdWNoIGVudHJ5IGV4aXN0cy4gRm9yIHNldHMsIHRoaXMgd2lsbCByZXR1cm4gdGhlIGtleSB0aGF0IGlzCitzZWxlY3RlZCBpZiBpdCBleGlzdHMgYW5kIGlzIHRodXMgbWFpbmx5IGEgd2F5IHRvIGNoZWNrIGVsZW1lbnQKK2V4aXN0ZW5jZS4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzZWxlY3QgYSBzbGljZSBvZiBhIHNldCBvciBtYXAgd2l0aAorYFsgPHRlcm0+IC4uLiA8dGVybT4gYF0sIHdoZXJlIGJvdGggYm91bmQgY2FuIGJlIG9taXR0ZWQuCisKK0FueSBgPHNlbGVjdG9yPmAgY2FuIGJlIGFsaWFzZWQgdXNpbmcgYEFTYCBrZXl3b3JkIChzZWUgZXhhbXBsZXMpLgorUGxlYXNlIG5vdGUgdGhhdCBgPHdoZXJlLWNsYXVzZT5gIGFuZCBgPG9yZGVyLWJ5PmAgY2xhdXNlIHNob3VsZCByZWZlcgordG8gdGhlIGNvbHVtbnMgYnkgdGhlaXIgb3JpZ2luYWwgbmFtZXMgYW5kIG5vdCBieSB0aGVpciBhbGlhc2VzLgorCitUaGUgYENPVU5UYCBrZXl3b3JkIGNhbiBiZSB1c2VkIHdpdGggcGFyZW50aGVzaXMgZW5jbG9zaW5nIGAqYC4gSWYgc28sCit0aGUgcXVlcnkgd2lsbCByZXR1cm4gYSBzaW5nbGUgcmVzdWx0OiB0aGUgbnVtYmVyIG9mIHJvd3MgbWF0Y2hpbmcgdGhlCitxdWVyeS4gTm90ZSB0aGF0IGBDT1VOVCgxKWAgaXMgc3VwcG9ydGVkIGFzIGFuIGFsaWFzLgorCitbW3NlbGVjdFdoZXJlXV0KKz09PT09IGA8d2hlcmUtY2xhdXNlPmAKKworVGhlIGA8d2hlcmUtY2xhdXNlPmAgc3BlY2lmaWVzIHdoaWNoIHJvd3MgbXVzdCBiZSBxdWVyaWVkLiBJdCBpcworY29tcG9zZWQgb2YgcmVsYXRpb25zIG9uIHRoZSBjb2x1bW5zIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGBQUklNQVJZIEtFWWAKK2FuZC9vciBoYXZlIGEgbGluazojY3JlYXRlSW5kZXhTdG10W3NlY29uZGFyeSBpbmRleF0gZGVmaW5lZCBvbiB0aGVtLgorCitOb3QgYWxsIHJlbGF0aW9ucyBhcmUgYWxsb3dlZCBpbiBhIHF1ZXJ5LiBGb3IgaW5zdGFuY2UsIG5vbi1lcXVhbAorcmVsYXRpb25zICh3aGVyZSBgSU5gIGlzIGNvbnNpZGVyZWQgYXMgYW4gZXF1YWwgcmVsYXRpb24pIG9uIGEgcGFydGl0aW9uCitrZXkgYXJlIG5vdCBzdXBwb3J0ZWQgKGJ1dCBzZWUgdGhlIHVzZSBvZiB0aGUgYFRPS0VOYCBtZXRob2QgYmVsb3cgdG8gZG8KK25vbi1lcXVhbCBxdWVyaWVzIG9uIHRoZSBwYXJ0aXRpb24ga2V5KS4gTW9yZW92ZXIsIGZvciBhIGdpdmVuIHBhcnRpdGlvbgora2V5LCB0aGUgY2x1c3RlcmluZyBjb2x1bW5zIGluZHVjZSBhbiBvcmRlcmluZyBvZiByb3dzIGFuZCByZWxhdGlvbnMgb24KK3RoZW0gaXMgcmVzdHJpY3RlZCB0byB0aGUgcmVsYXRpb25zIHRoYXQgYWxsb3cgdG8gc2VsZWN0IGEgKmNvbnRpZ3VvdXMqCisoZm9yIHRoZSBvcmRlcmluZykgc2V0IG9mIHJvd3MuIEZvciBpbnN0YW5jZSwgZ2l2ZW4KKworYmMoc2FtcGxlKS4gKworQ1JFQVRFIFRBQkxFIHBvc3RzICggKwordXNlcmlkIHRleHQsICsKK2Jsb2dfdGl0bGUgdGV4dCwgKworcG9zdGVkX2F0IHRpbWVzdGFtcCwgKworZW50cnlfdGl0bGUgdGV4dCwgKworY29udGVudCB0ZXh0LCArCitjYXRlZ29yeSBpbnQsICsKK1BSSU1BUlkgS0VZICh1c2VyaWQsIGJsb2dfdGl0bGUsIHBvc3RlZF9hdCkgKworKQorCitUaGUgZm9sbG93aW5nIHF1ZXJ5IGlzIGFsbG93ZWQ6CisKK2JjKHNhbXBsZSkuICsKK1NFTEVDVCBlbnRyeV90aXRsZSwgY29udGVudCBGUk9NIHBvc3RzIFdIRVJFIHVzZXJpZD1gam9obiBkb2UnIEFORAorYmxvZ190aXRsZT1gSm9obidgcyBCbG9nJyBBTkQgcG9zdGVkX2F0ID49IGAyMDEyLTAxLTAxJyBBTkQgcG9zdGVkX2F0IDwKK2AyMDEyLTAxLTMxJworCitCdXQgdGhlIGZvbGxvd2luZyBvbmUgaXMgbm90LCBhcyBpdCBkb2VzIG5vdCBzZWxlY3QgYSBjb250aWd1b3VzIHNldCBvZgorcm93cyAoYW5kIHdlIHN1cHBvc2Ugbm8gc2Vjb25kYXJ5IGluZGV4ZXMgYXJlIHNldCk6CisKK2JjKHNhbXBsZSkuICsKKy8vIE5lZWRzIGEgYmxvZ190aXRsZSB0byBiZSBzZXQgdG8gc2VsZWN0IHJhbmdlcyBvZiBwb3N0ZWRfYXQgKworU0VMRUNUIGVudHJ5X3RpdGxlLCBjb250ZW50IEZST00gcG9zdHMgV0hFUkUgdXNlcmlkPWBqb2huIGRvZScgQU5ECitwb3N0ZWRfYXQgPj0gYDIwMTItMDEtMDEnIEFORCBwb3N0ZWRfYXQgPCBgMjAxMi0wMS0zMScKKworV2hlbiBzcGVjaWZ5aW5nIHJlbGF0aW9ucywgdGhlIGBUT0tFTmAgZnVuY3Rpb24gY2FuIGJlIHVzZWQgb24gdGhlCitgUEFSVElUSU9OIEtFWWAgY29sdW1uIHRvIHF1ZXJ5LiBJbiB0aGF0IGNhc2UsIHJvd3Mgd2lsbCBiZSBzZWxlY3RlZAorYmFzZWQgb24gdGhlIHRva2VuIG9mIHRoZWlyIGBQQVJUSVRJT05fS0VZYCByYXRoZXIgdGhhbiBvbiB0aGUgdmFsdWUuCitOb3RlIHRoYXQgdGhlIHRva2VuIG9mIGEga2V5IGRlcGVuZHMgb24gdGhlIHBhcnRpdGlvbmVyIGluIHVzZSwgYW5kIHRoYXQKK2luIHBhcnRpY3VsYXIgdGhlIFJhbmRvbVBhcnRpdGlvbmVyIHdvbuKAmXQgeWllbGQgYSBtZWFuaW5nZnVsIG9yZGVyLiBBbHNvCitub3RlIHRoYXQgb3JkZXJpbmcgcGFydGl0aW9uZXJzIGFsd2F5cyBvcmRlciB0b2tlbiB2YWx1ZXMgYnkgYnl0ZXMgKHNvCitldmVuIGlmIHRoZSBwYXJ0aXRpb24ga2V5IGlzIG9mIHR5cGUgaW50LCBgdG9rZW4oLTEpID4gdG9rZW4oMClgIGluCitwYXJ0aWN1bGFyKS4gRXhhbXBsZToKKworYmMoc2FtcGxlKS4gKworU0VMRUNUICogRlJPTSBwb3N0cyBXSEVSRSB0b2tlbih1c2VyaWQpID4gdG9rZW4oYHRvbScpIEFORCB0b2tlbih1c2VyaWQpCis8IHRva2VuKGBib2InKQorCitNb3Jlb3ZlciwgdGhlIGBJTmAgcmVsYXRpb24gaXMgb25seSBhbGxvd2VkIG9uIHRoZSBsYXN0IGNvbHVtbiBvZiB0aGUKK3BhcnRpdGlvbiBrZXkgYW5kIG9uIHRoZSBsYXN0IGNvbHVtbiBvZiB0aGUgZnVsbCBwcmltYXJ5IGtleS4KKworSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBgYGdyb3VwJycgYENMVVNURVJJTkcgQ09MVU1OU2AgdG9nZXRoZXIgaW4gYQorcmVsYXRpb24gdXNpbmcgdGhlIHR1cGxlIG5vdGF0aW9uLiBGb3IgaW5zdGFuY2U6CisKK2JjKHNhbXBsZSkuICsKK1NFTEVDVCAqIEZST00gcG9zdHMgV0hFUkUgdXNlcmlkPWBqb2huIGRvZScgQU5EIChibG9nX3RpdGxlLCBwb3N0ZWRfYXQpCis+IChgSm9obidgcyBCbG9nJywgYDIwMTItMDEtMDEnKQorCit3aWxsIHJlcXVlc3QgYWxsIHJvd3MgdGhhdCBzb3J0cyBhZnRlciB0aGUgb25lIGhhdmluZyBgYEpvaG7igJlzIEJsb2cnJyBhcworYGJsb2dfdGlsZWAgYW5kIGAyMDEyLTAxLTAxJyBmb3IgYHBvc3RlZF9hdGAgaW4gdGhlIGNsdXN0ZXJpbmcgb3JkZXIuIEluCitwYXJ0aWN1bGFyLCByb3dzIGhhdmluZyBhIGBwb3N0X2F0IDw9ICcyMDEyLTAxLTAxJ2Agd2lsbCBiZSByZXR1cm5lZCBhcworbG9uZyBhcyB0aGVpciBgYmxvZ190aXRsZSA+ICdKb2huJydzIEJsb2cnYCwgd2hpY2ggd291bGRu4oCZdCBiZSB0aGUgY2FzZQorZm9yOgorCitiYyhzYW1wbGUpLiArCitTRUxFQ1QgKiBGUk9NIHBvc3RzIFdIRVJFIHVzZXJpZD1gam9obiBkb2UnIEFORCBibG9nX3RpdGxlID4gYEpvaG4nYHMKK0Jsb2cnIEFORCBwb3N0ZWRfYXQgPiBgMjAxMi0wMS0wMScKKworVGhlIHR1cGxlIG5vdGF0aW9uIG1heSBhbHNvIGJlIHVzZWQgZm9yIGBJTmAgY2xhdXNlcyBvbgorYENMVVNURVJJTkcgQ09MVU1OU2A6CisKK2JjKHNhbXBsZSkuICsKK1NFTEVDVCAqIEZST00gcG9zdHMgV0hFUkUgdXNlcmlkPWBqb2huIGRvZScgQU5EIChibG9nX3RpdGxlLCBwb3N0ZWRfYXQpCitJTiAoKGBKb2huJ2BzIEJsb2cnLCBgMjAxMi0wMS0wMSksICjigJlFeHRyZW1lIENoZXNzJywgYDIwMTQtMDYtMDEnKSkKKworVGhlIGBDT05UQUlOU2Agb3BlcmF0b3IgbWF5IG9ubHkgYmUgdXNlZCBvbiBjb2xsZWN0aW9uIGNvbHVtbnMgKGxpc3RzLAorc2V0cywgYW5kIG1hcHMpLiBJbiB0aGUgY2FzZSBvZiBtYXBzLCBgQ09OVEFJTlNgIGFwcGxpZXMgdG8gdGhlIG1hcAordmFsdWVzLiBUaGUgYENPTlRBSU5TIEtFWWAgb3BlcmF0b3IgbWF5IG9ubHkgYmUgdXNlZCBvbiBtYXAgY29sdW1ucyBhbmQKK2FwcGxpZXMgdG8gdGhlIG1hcCBrZXlzLgorCitbW3NlbGVjdE9yZGVyQnldXQorPT09PT0gYDxvcmRlci1ieT5gCisKK1RoZSBgT1JERVIgQllgIG9wdGlvbiBhbGxvd3MgdG8gc2VsZWN0IHRoZSBvcmRlciBvZiB0aGUgcmV0dXJuZWQKK3Jlc3VsdHMuIEl0IHRha2VzIGFzIGFyZ3VtZW50IGEgbGlzdCBvZiBjb2x1bW4gbmFtZXMgYWxvbmcgd2l0aCB0aGUKK29yZGVyIGZvciB0aGUgY29sdW1uIChgQVNDYCBmb3IgYXNjZW5kYW50IGFuZCBgREVTQ2AgZm9yIGRlc2NlbmRhbnQsCitvbWl0dGluZyB0aGUgb3JkZXIgYmVpbmcgZXF1aXZhbGVudCB0byBgQVNDYCkuIEN1cnJlbnRseSB0aGUgcG9zc2libGUKK29yZGVyaW5ncyBhcmUgbGltaXRlZCAod2hpY2ggZGVwZW5kcyBvbiB0aGUgdGFibGUKK2xpbms6I2NyZWF0ZVRhYmxlT3B0aW9uc1tgQ0xVU1RFUklORyBPUkRFUmBdICk6CisKKyogaWYgdGhlIHRhYmxlIGhhcyBiZWVuIGRlZmluZWQgd2l0aG91dCBhbnkgc3BlY2lmaWMgYENMVVNURVJJTkcgT1JERVJgLAordGhlbiB0aGVuIGFsbG93ZWQgb3JkZXJpbmdzIGFyZSB0aGUgb3JkZXIgaW5kdWNlZCBieSB0aGUgY2x1c3RlcmluZworY29sdW1ucyBhbmQgdGhlIHJldmVyc2Ugb2YgdGhhdCBvbmUuCisqIG90aGVyd2lzZSwgdGhlIG9yZGVyaW5ncyBhbGxvd2VkIGFyZSB0aGUgb3JkZXIgb2YgdGhlCitgQ0xVU1RFUklORyBPUkRFUmAgb3B0aW9uIGFuZCB0aGUgcmV2ZXJzZWQgb25lLgorCitbW3NlbGVjdEdyb3VwQnldXQorPT09PT0gYDxncm91cC1ieT5gCisKK1RoZSBgR1JPVVAgQllgIG9wdGlvbiBhbGxvd3MgdG8gY29uZGVuc2UgaW50byBhIHNpbmdsZSByb3cgYWxsIHNlbGVjdGVkCityb3dzIHRoYXQgc2hhcmUgdGhlIHNhbWUgdmFsdWVzIGZvciBhIHNldCBvZiBjb2x1bW5zLgorCitVc2luZyB0aGUgYEdST1VQIEJZYCBvcHRpb24sIGl0IGlzIG9ubHkgcG9zc2libGUgdG8gZ3JvdXAgcm93cyBhdCB0aGUKK3BhcnRpdGlvbiBrZXkgbGV2ZWwgb3IgYXQgYSBjbHVzdGVyaW5nIGNvbHVtbiBsZXZlbC4gQnkgY29uc2VxdWVuY2UsIHRoZQorYEdST1VQIEJZYCBvcHRpb24gb25seSBhY2NlcHQgYXMgYXJndW1lbnRzIHByaW1hcnkga2V5IGNvbHVtbiBuYW1lcyBpbgordGhlIHByaW1hcnkga2V5IG9yZGVyLiBJZiBhIHByaW1hcnkga2V5IGNvbHVtbiBpcyByZXN0cmljdGVkIGJ5IGFuCitlcXVhbGl0eSByZXN0cmljdGlvbiBpdCBpcyBub3QgcmVxdWlyZWQgdG8gYmUgcHJlc2VudCBpbiB0aGUgYEdST1VQIEJZYAorY2xhdXNlLgorCitBZ2dyZWdhdGUgZnVuY3Rpb25zIHdpbGwgcHJvZHVjZSBhIHNlcGFyYXRlIHZhbHVlIGZvciBlYWNoIGdyb3VwLiBJZiBubworYEdST1VQIEJZYCBjbGF1c2UgaXMgc3BlY2lmaWVkLCBhZ2dyZWdhdGVzIGZ1bmN0aW9ucyB3aWxsIHByb2R1Y2UgYQorc2luZ2xlIHZhbHVlIGZvciBhbGwgdGhlIHJvd3MuCisKK0lmIGEgY29sdW1uIGlzIHNlbGVjdGVkIHdpdGhvdXQgYW4gYWdncmVnYXRlIGZ1bmN0aW9uLCBpbiBhIHN0YXRlbWVudAord2l0aCBhIGBHUk9VUCBCWWAsIHRoZSBmaXJzdCB2YWx1ZSBlbmNvdW50ZXIgaW4gZWFjaCBncm91cCB3aWxsIGJlCityZXR1cm5lZC4KKworW1tzZWxlY3RMaW1pdF1dCis9PT09PSBgTElNSVRgIGFuZCBgUEVSIFBBUlRJVElPTiBMSU1JVGAKKworVGhlIGBMSU1JVGAgb3B0aW9uIHRvIGEgYFNFTEVDVGAgc3RhdGVtZW50IGxpbWl0cyB0aGUgbnVtYmVyIG9mIHJvd3MKK3JldHVybmVkIGJ5IGEgcXVlcnksIHdoaWxlIHRoZSBgUEVSIFBBUlRJVElPTiBMSU1JVGAgb3B0aW9uIGxpbWl0cyB0aGUKK251bWJlciBvZiByb3dzIHJldHVybmVkIGZvciBhIGdpdmVuIHBhcnRpdGlvbiBieSB0aGUgcXVlcnkuIE5vdGUgdGhhdAorYm90aCB0eXBlIG9mIGxpbWl0IGNhbiB1c2VkIGluIHRoZSBzYW1lIHN0YXRlbWVudC4KKworW1tzZWxlY3RBbGxvd0ZpbHRlcmluZ11dCis9PT09PSBgQUxMT1cgRklMVEVSSU5HYAorCitCeSBkZWZhdWx0LCBDUUwgb25seSBhbGxvd3Mgc2VsZWN0IHF1ZXJpZXMgdGhhdCBkb27igJl0IGludm9sdmUKK2BgZmlsdGVyaW5nJycgc2VydmVyIHNpZGUsIGkuZS4gcXVlcmllcyB3aGVyZSB3ZSBrbm93IHRoYXQgYWxsIChsaXZlKQorcmVjb3JkIHJlYWQgd2lsbCBiZSByZXR1cm5lZCAobWF5YmUgcGFydGx5KSBpbiB0aGUgcmVzdWx0IHNldC4gVGhlCityZWFzb25pbmcgaXMgdGhhdCB0aG9zZSBgYG5vbiBmaWx0ZXJpbmcnJyBxdWVyaWVzIGhhdmUgcHJlZGljdGFibGUKK3BlcmZvcm1hbmNlIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgd2lsbCBleGVjdXRlIGluIGEgdGltZSB0aGF0IGlzCitwcm9wb3J0aW9uYWwgdG8gdGhlIGFtb3VudCBvZiBkYXRhICpyZXR1cm5lZCogYnkgdGhlIHF1ZXJ5ICh3aGljaCBjYW4gYmUKK2NvbnRyb2xsZWQgdGhyb3VnaCBgTElNSVRgKS4KKworVGhlIGBBTExPVyBGSUxURVJJTkdgIG9wdGlvbiBhbGxvd3MgdG8gZXhwbGljaXRseSBhbGxvdyAoc29tZSkgcXVlcmllcwordGhhdCByZXF1aXJlIGZpbHRlcmluZy4gUGxlYXNlIG5vdGUgdGhhdCBhIHF1ZXJ5IHVzaW5nIGBBTExPVyBGSUxURVJJTkdgCittYXkgdGh1cyBoYXZlIHVucHJlZGljdGFibGUgcGVyZm9ybWFuY2UgKGZvciB0aGUgZGVmaW5pdGlvbiBhYm92ZSksIGkuZS4KK2V2ZW4gYSBxdWVyeSB0aGF0IHNlbGVjdHMgYSBoYW5kZnVsIG9mIHJlY29yZHMgKm1heSogZXhoaWJpdCBwZXJmb3JtYW5jZQordGhhdCBkZXBlbmRzIG9uIHRoZSB0b3RhbCBhbW91bnQgb2YgZGF0YSBzdG9yZWQgaW4gdGhlIGNsdXN0ZXIuCisKK0ZvciBpbnN0YW5jZSwgY29uc2lkZXJpbmcgdGhlIGZvbGxvd2luZyB0YWJsZSBob2xkaW5nIHVzZXIgcHJvZmlsZXMgd2l0aAordGhlaXIgeWVhciBvZiBiaXJ0aCAod2l0aCBhIHNlY29uZGFyeSBpbmRleCBvbiBpdCkgYW5kIGNvdW50cnkgb2YKK3Jlc2lkZW5jZToKKworYmMoc2FtcGxlKS4uICsKK0NSRUFURSBUQUJMRSB1c2VycyAoICsKK3VzZXJuYW1lIHRleHQgUFJJTUFSWSBLRVksICsKK2ZpcnN0bmFtZSB0ZXh0LCArCitsYXN0bmFtZSB0ZXh0LCArCitiaXJ0aF95ZWFyIGludCwgKworY291bnRyeSB0ZXh0ICsKKykKKworQ1JFQVRFIElOREVYIE9OIHVzZXJzKGJpcnRoX3llYXIpOyArCitwLgorCitUaGVuIHRoZSBmb2xsb3dpbmcgcXVlcmllcyBhcmUgdmFsaWQ6CisKK2JjKHNhbXBsZSkuICsKK1NFTEVDVCAqIEZST00gdXNlcnM7ICsKK1NFTEVDVCBmaXJzdG5hbWUsIGxhc3RuYW1lIEZST00gdXNlcnMgV0hFUkUgYmlydGhfeWVhciA9IDE5ODE7CisKK2JlY2F1c2UgaW4gYm90aCBjYXNlLCBDYXNzYW5kcmEgZ3VhcmFudGVlcyB0aGF0IHRoZXNlIHF1ZXJpZXMKK3BlcmZvcm1hbmNlIHdpbGwgYmUgcHJvcG9ydGlvbmFsIHRvIHRoZSBhbW91bnQgb2YgZGF0YSByZXR1cm5lZC4gSW4KK3BhcnRpY3VsYXIsIGlmIG5vIHVzZXJzIGFyZSBib3JuIGluIDE5ODEsIHRoZW4gdGhlIHNlY29uZCBxdWVyeQorcGVyZm9ybWFuY2Ugd2lsbCBub3QgZGVwZW5kIG9mIHRoZSBudW1iZXIgb2YgdXNlciBwcm9maWxlIHN0b3JlZCBpbiB0aGUKK2RhdGFiYXNlIChub3QgZGlyZWN0bHkgYXQgbGVhc3Q6IGR1ZSB0byBzZWNvbmRhcnkgaW5kZXggaW1wbGVtZW50YXRpb24KK2NvbnNpZGVyYXRpb24sIHRoaXMgcXVlcnkgbWF5IHN0aWxsIGRlcGVuZCBvbiB0aGUgbnVtYmVyIG9mIG5vZGUgaW4gdGhlCitjbHVzdGVyLCB3aGljaCBpbmRpcmVjdGx5IGRlcGVuZHMgb24gdGhlIGFtb3VudCBvZiBkYXRhIHN0b3JlZC4KK05ldmVydGhlbGVzcywgdGhlIG51bWJlciBvZiBub2RlcyB3aWxsIGFsd2F5cyBiZSBtdWx0aXBsZSBudW1iZXIgb2YKK21hZ25pdHVkZSBsb3dlciB0aGFuIHRoZSBudW1iZXIgb2YgdXNlciBwcm9maWxlIHN0b3JlZCkuIE9mIGNvdXJzZSwgYm90aAorcXVlcnkgbWF5IHJldHVybiB2ZXJ5IGxhcmdlIHJlc3VsdCBzZXQgaW4gcHJhY3RpY2UsIGJ1dCB0aGUgYW1vdW50IG9mCitkYXRhIHJldHVybmVkIGNhbiBhbHdheXMgYmUgY29udHJvbGxlZCBieSBhZGRpbmcgYSBgTElNSVRgLgorCitIb3dldmVyLCB0aGUgZm9sbG93aW5nIHF1ZXJ5IHdpbGwgYmUgcmVqZWN0ZWQ6CisKK2JjKHNhbXBsZSkuICsKK1NFTEVDVCBmaXJzdG5hbWUsIGxhc3RuYW1lIEZST00gdXNlcnMgV0hFUkUgYmlydGhfeWVhciA9IDE5ODEgQU5ECitjb3VudHJ5ID0gYEZSJzsKKworYmVjYXVzZSBDYXNzYW5kcmEgY2Fubm90IGd1YXJhbnRlZSB0aGF0IGl0IHdvbuKAmXQgaGF2ZSB0byBzY2FuIGxhcmdlCithbW91bnQgb2YgZGF0YSBldmVuIGlmIHRoZSByZXN1bHQgdG8gdGhvc2UgcXVlcnkgaXMgc21hbGwuIFR5cGljYWxseSwgaXQKK3dpbGwgc2NhbiBhbGwgdGhlIGluZGV4IGVudHJpZXMgZm9yIHVzZXJzIGJvcm4gaW4gMTk4MSBldmVuIGlmIG9ubHkgYQoraGFuZGZ1bCBhcmUgYWN0dWFsbHkgZnJvbSBGcmFuY2UuIEhvd2V2ZXIsIGlmIHlvdSBgYGtub3cgd2hhdCB5b3UgYXJlCitkb2luZycnLCB5b3UgY2FuIGZvcmNlIHRoZSBleGVjdXRpb24gb2YgdGhpcyBxdWVyeSBieSB1c2luZworYEFMTE9XIEZJTFRFUklOR2AgYW5kIHNvIHRoZSBmb2xsb3dpbmcgcXVlcnkgaXMgdmFsaWQ6CisKK2JjKHNhbXBsZSkuICsKK1NFTEVDVCBmaXJzdG5hbWUsIGxhc3RuYW1lIEZST00gdXNlcnMgV0hFUkUgYmlydGhfeWVhciA9IDE5ODEgQU5ECitjb3VudHJ5ID0gYEZSJyBBTExPVyBGSUxURVJJTkc7CisKK1tbZGF0YWJhc2VSb2xlc11dCis9PT0gRGF0YWJhc2UgUm9sZXMKKworW1tjcmVhdGVSb2xlU3RtdF1dCis9PT09IENSRUFURSBST0xFCisKK19TeW50YXg6XworCitiYyhzeW50YXgpLi4gKworOjo9IENSRUFURSBST0xFICggSUYgTk9UIEVYSVNUUyApPyAoIFdJVEggKCBBTkQgKSogKT8KKworOjo9IFBBU1NXT1JEID0gICsKK3wgTE9HSU4gPSAgKworfCBTVVBFUlVTRVIgPSAgKworfCBPUFRJT05TID0gICsKK3AuCisKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLiArCitDUkVBVEUgUk9MRSBuZXdfcm9sZTsgKworQ1JFQVRFIFJPTEUgYWxpY2UgV0lUSCBQQVNTV09SRCA9IGBwYXNzd29yZF9hJyBBTkQgTE9HSU4gPSB0cnVlOyArCitDUkVBVEUgUk9MRSBib2IgV0lUSCBQQVNTV09SRCA9IGBwYXNzd29yZF9iJyBBTkQgTE9HSU4gPSB0cnVlIEFORAorU1VQRVJVU0VSID0gdHJ1ZTsgKworQ1JFQVRFIFJPTEUgY2FybG9zIFdJVEggT1BUSU9OUyA9IFx7IGBjdXN0b21fb3B0aW9uMScgOiBgb3B0aW9uMV92YWx1ZScsCitgY3VzdG9tX29wdGlvbjInIDogOTkgfTsKKworQnkgZGVmYXVsdCByb2xlcyBkbyBub3QgcG9zc2VzcyBgTE9HSU5gIHByaXZpbGVnZXMgb3IgYFNVUEVSVVNFUmAKK3N0YXR1cy4KKworbGluazojcGVybWlzc2lvbnNbUGVybWlzc2lvbnNdIG9uIGRhdGFiYXNlIHJlc291cmNlcyBhcmUgZ3JhbnRlZCB0bworcm9sZXM7IHR5cGVzIG9mIHJlc291cmNlcyBpbmNsdWRlIGtleXNwYWNlcywgdGFibGVzLCBmdW5jdGlvbnMgYW5kIHJvbGVzCit0aGVtc2VsdmVzLiBSb2xlcyBtYXkgYmUgZ3JhbnRlZCB0byBvdGhlciByb2xlcyB0byBjcmVhdGUgaGllcmFyY2hpY2FsCitwZXJtaXNzaW9ucyBzdHJ1Y3R1cmVzOyBpbiB0aGVzZSBoaWVyYXJjaGllcywgcGVybWlzc2lvbnMgYW5kCitgU1VQRVJVU0VSYCBzdGF0dXMgYXJlIGluaGVyaXRlZCwgYnV0IHRoZSBgTE9HSU5gIHByaXZpbGVnZSBpcyBub3QuCisKK0lmIGEgcm9sZSBoYXMgdGhlIGBMT0dJTmAgcHJpdmlsZWdlLCBjbGllbnRzIG1heSBpZGVudGlmeSBhcyB0aGF0IHJvbGUKK3doZW4gY29ubmVjdGluZy4gRm9yIHRoZSBkdXJhdGlvbiBvZiB0aGF0IGNvbm5lY3Rpb24sIHRoZSBjbGllbnQgd2lsbAorYWNxdWlyZSBhbnkgcm9sZXMgYW5kIHByaXZpbGVnZXMgZ3JhbnRlZCB0byB0aGF0IHJvbGUuCisKK09ubHkgYSBjbGllbnQgd2l0aCB3aXRoIHRoZSBgQ1JFQVRFYCBwZXJtaXNzaW9uIG9uIHRoZSBkYXRhYmFzZSByb2xlcworcmVzb3VyY2UgbWF5IGlzc3VlIGBDUkVBVEUgUk9MRWAgcmVxdWVzdHMgKHNlZSB0aGUKK2xpbms6I3Blcm1pc3Npb25zW3JlbGV2YW50IHNlY3Rpb25dIGJlbG93KSwgdW5sZXNzIHRoZSBjbGllbnQgaXMgYQorYFNVUEVSVVNFUmAuIFJvbGUgbWFuYWdlbWVudCBpbiBDYXNzYW5kcmEgaXMgcGx1Z2dhYmxlIGFuZCBjdXN0b20KK2ltcGxlbWVudGF0aW9ucyBtYXkgc3VwcG9ydCBvbmx5IGEgc3Vic2V0IG9mIHRoZSBsaXN0ZWQgb3B0aW9ucy4KKworUm9sZSBuYW1lcyBzaG91bGQgYmUgcXVvdGVkIGlmIHRoZXkgY29udGFpbiBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuCisKK1tbY3JlYXRlUm9sZVB3ZF1dCis9PT09PSBTZXR0aW5nIGNyZWRlbnRpYWxzIGZvciBpbnRlcm5hbCBhdXRoZW50aWNhdGlvbgorCitVc2UgdGhlIGBXSVRIIFBBU1NXT1JEYCBjbGF1c2UgdG8gc2V0IGEgcGFzc3dvcmQgZm9yIGludGVybmFsCithdXRoZW50aWNhdGlvbiwgZW5jbG9zaW5nIHRoZSBwYXNzd29yZCBpbiBzaW5nbGUgcXVvdGF0aW9uIG1hcmtzLiArCitJZiBpbnRlcm5hbCBhdXRoZW50aWNhdGlvbiBoYXMgbm90IGJlZW4gc2V0IHVwIG9yIHRoZSByb2xlIGRvZXMgbm90IGhhdmUKK2BMT0dJTmAgcHJpdmlsZWdlcywgdGhlIGBXSVRIIFBBU1NXT1JEYCBjbGF1c2UgaXMgbm90IG5lY2Vzc2FyeS4KKworW1tjcmVhdGVSb2xlQ29uZGl0aW9uYWxdXQorPT09PT0gQ3JlYXRpbmcgYSByb2xlIGNvbmRpdGlvbmFsbHkKKworQXR0ZW1wdGluZyB0byBjcmVhdGUgYW4gZXhpc3Rpbmcgcm9sZSByZXN1bHRzIGluIGFuIGludmFsaWQgcXVlcnkKK2NvbmRpdGlvbiB1bmxlc3MgdGhlIGBJRiBOT1QgRVhJU1RTYCBvcHRpb24gaXMgdXNlZC4gSWYgdGhlIG9wdGlvbiBpcwordXNlZCBhbmQgdGhlIHJvbGUgZXhpc3RzLCB0aGUgc3RhdGVtZW50IGlzIGEgbm8tb3AuCisKK2JjKHNhbXBsZSkuICsKK0NSRUFURSBST0xFIG90aGVyX3JvbGU7ICsKK0NSRUFURSBST0xFIElGIE5PVCBFWElTVFMgb3RoZXJfcm9sZTsKKworW1thbHRlclJvbGVTdG10XV0KKz09PT0gQUxURVIgUk9MRQorCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4uICsKKzo6PSBBTFRFUiBST0xFIChJRiBFWElTVFMpPyAoIFdJVEggKCBBTkQgKSogKT8KKworOjo9IFBBU1NXT1JEID0gICsKK3wgTE9HSU4gPSAgKworfCBTVVBFUlVTRVIgPSAgKworfCBPUFRJT05TID0gICsKK3AuCisKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLiArCitBTFRFUiBST0xFIGJvYiBXSVRIIFBBU1NXT1JEID0gYFBBU1NXT1JEX0InIEFORCBTVVBFUlVTRVIgPSBmYWxzZTsKKworSWYgdGhlIHJvbGUgZG9lcyBub3QgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgorCitDb25kaXRpb25zIG9uIGV4ZWN1dGluZyBgQUxURVIgUk9MRWAgc3RhdGVtZW50czoKKworKiBBIGNsaWVudCBtdXN0IGhhdmUgYFNVUEVSVVNFUmAgc3RhdHVzIHRvIGFsdGVyIHRoZSBgU1VQRVJVU0VSYCBzdGF0dXMKK29mIGFub3RoZXIgcm9sZQorKiBBIGNsaWVudCBjYW5ub3QgYWx0ZXIgdGhlIGBTVVBFUlVTRVJgIHN0YXR1cyBvZiBhbnkgcm9sZSBpdCBjdXJyZW50bHkKK2hvbGRzCisqIEEgY2xpZW50IGNhbiBvbmx5IG1vZGlmeSBjZXJ0YWluIHByb3BlcnRpZXMgb2YgdGhlIHJvbGUgd2l0aCB3aGljaCBpdAoraWRlbnRpZmllZCBhdCBsb2dpbiAoZS5nLiBgUEFTU1dPUkRgKQorKiBUbyBtb2RpZnkgcHJvcGVydGllcyBvZiBhIHJvbGUsIHRoZSBjbGllbnQgbXVzdCBiZSBncmFudGVkIGBBTFRFUmAKK2xpbms6I3Blcm1pc3Npb25zW3Blcm1pc3Npb25dIG9uIHRoYXQgcm9sZQorCitbW2Ryb3BSb2xlU3RtdF1dCis9PT09IERST1AgUk9MRQorCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4uICsKKzo6PSBEUk9QIFJPTEUgKCBJRiBFWElTVFMgKT8gICsKK3AuCisKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLiArCitEUk9QIFJPTEUgYWxpY2U7ICsKK0RST1AgUk9MRSBJRiBFWElTVFMgYm9iOworCitgRFJPUCBST0xFYCByZXF1aXJlcyB0aGUgY2xpZW50IHRvIGhhdmUgYERST1BgCitsaW5rOiNwZXJtaXNzaW9uc1twZXJtaXNzaW9uXSBvbiB0aGUgcm9sZSBpbiBxdWVzdGlvbi4gSW4gYWRkaXRpb24sCitjbGllbnQgbWF5IG5vdCBgRFJPUGAgdGhlIHJvbGUgd2l0aCB3aGljaCBpdCBpZGVudGlmaWVkIGF0IGxvZ2luLgorRmluYWx5LCBvbmx5IGEgY2xpZW50IHdpdGggYFNVUEVSVVNFUmAgc3RhdHVzIG1heSBgRFJPUGAgYW5vdGhlcgorYFNVUEVSVVNFUmAgcm9sZS4gKworQXR0ZW1wdGluZyB0byBkcm9wIGEgcm9sZSB3aGljaCBkb2VzIG5vdCBleGlzdCByZXN1bHRzIGluIGFuIGludmFsaWQKK3F1ZXJ5IGNvbmRpdGlvbiB1bmxlc3MgdGhlIGBJRiBFWElTVFNgIG9wdGlvbiBpcyB1c2VkLiBJZiB0aGUgb3B0aW9uIGlzCit1c2VkIGFuZCB0aGUgcm9sZSBkb2VzIG5vdCBleGlzdCB0aGUgc3RhdGVtZW50IGlzIGEgbm8tb3AuCisKK1tbZ3JhbnRSb2xlU3RtdF1dCis9PT09IEdSQU5UIFJPTEUKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuICsKKzo6PSBHUkFOVCBUTworCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4gKworR1JBTlQgcmVwb3J0X3dyaXRlciBUTyBhbGljZTsKKworVGhpcyBzdGF0ZW1lbnQgZ3JhbnRzIHRoZSBgcmVwb3J0X3dyaXRlcmAgcm9sZSB0byBgYWxpY2VgLiBBbnkKK3Blcm1pc3Npb25zIGdyYW50ZWQgdG8gYHJlcG9ydF93cml0ZXJgIGFyZSBhbHNvIGFjcXVpcmVkIGJ5IGBhbGljZWAuICsKK1JvbGVzIGFyZSBtb2RlbGxlZCBhcyBhIGRpcmVjdGVkIGFjeWNsaWMgZ3JhcGgsIHNvIGNpcmN1bGFyIGdyYW50cyBhcmUKK25vdCBwZXJtaXR0ZWQuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgcmVzdWx0IGluIGVycm9yIGNvbmRpdGlvbnM6CisKK2JjKHNhbXBsZSkuICsKK0dSQU5UIHJvbGVfYSBUTyByb2xlX2I7ICsKK0dSQU5UIHJvbGVfYiBUTyByb2xlX2E7CisKK2JjKHNhbXBsZSkuICsKK0dSQU5UIHJvbGVfYSBUTyByb2xlX2I7ICsKK0dSQU5UIHJvbGVfYiBUTyByb2xlX2M7ICsKK0dSQU5UIHJvbGVfYyBUTyByb2xlX2E7CisKK1tbcmV2b2tlUm9sZVN0bXRdXQorPT09PSBSRVZPS0UgUk9MRQorCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4gKworOjo9IFJFVk9LRSBGUk9NCisKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLiArCitSRVZPS0UgcmVwb3J0X3dyaXRlciBGUk9NIGFsaWNlOworCitUaGlzIHN0YXRlbWVudCByZXZva2VzIHRoZSBgcmVwb3J0X3dyaXRlcmAgcm9sZSBmcm9tIGBhbGljZWAuIEFueQorcGVybWlzc2lvbnMgdGhhdCBgYWxpY2VgIGhhcyBhY3F1aXJlZCB2aWEgdGhlIGByZXBvcnRfd3JpdGVyYCByb2xlIGFyZQorYWxzbyByZXZva2VkLgorCitbW2xpc3RSb2xlc1N0bXRdXQorPT09PT0gTElTVCBST0xFUworCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4gKworOjo9IExJU1QgUk9MRVMgKCBPRiApPyAoIE5PUkVDVVJTSVZFICk/CisKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLiArCitMSVNUIFJPTEVTOworCitSZXR1cm4gYWxsIGtub3duIHJvbGVzIGluIHRoZSBzeXN0ZW0sIHRoaXMgcmVxdWlyZXMgYERFU0NSSUJFYAorcGVybWlzc2lvbiBvbiB0aGUgZGF0YWJhc2Ugcm9sZXMgcmVzb3VyY2UuCisKK2JjKHNhbXBsZSkuICsKK0xJU1QgUk9MRVMgT0YgYGFsaWNlYDsKKworRW51bWVyYXRlIGFsbCByb2xlcyBncmFudGVkIHRvIGBhbGljZWAsIGluY2x1ZGluZyB0aG9zZSB0cmFuc2l0aXZlbHkKK2FxdWlyZWQuCisKK2JjKHNhbXBsZSkuICsKK0xJU1QgUk9MRVMgT0YgYGJvYmAgTk9SRUNVUlNJVkUKKworTGlzdCBhbGwgcm9sZXMgZGlyZWN0bHkgZ3JhbnRlZCB0byBgYm9iYC4KKworW1tjcmVhdGVVc2VyU3RtdF1dCis9PT09IENSRUFURSBVU0VSCisKK1ByaW9yIHRvIHRoZSBpbnRyb2R1Y3Rpb24gb2Ygcm9sZXMgaW4gQ2Fzc2FuZHJhIDIuMiwgYXV0aGVudGljYXRpb24gYW5kCithdXRob3JpemF0aW9uIHdlcmUgYmFzZWQgYXJvdW5kIHRoZSBjb25jZXB0IG9mIGEgYFVTRVJgLiBGb3IgYmFja3dhcmQKK2NvbXBhdGliaWxpdHksIHRoZSBsZWdhY3kgc3ludGF4IGhhcyBiZWVuIHByZXNlcnZlZCB3aXRoIGBVU0VSYCBjZW50cmljCitzdGF0bWVudHMgYmVjb21pbmcgc3lub255bXMgZm9yIHRoZSBgUk9MRWAgYmFzZWQgZXF1aXZhbGVudHMuCisKK19TeW50YXg6XworCitiYyhzeW50YXgpLi4gKworOjo9IENSRUFURSBVU0VSICggSUYgTk9UIEVYSVNUUyApPyAoIFdJVEggUEFTU1dPUkQgKT8gKCk/CisKKzo6PSBTVVBFUlVTRVIgKworfCBOT1NVUEVSVVNFUiArCitwLgorCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4gKworQ1JFQVRFIFVTRVIgYWxpY2UgV0lUSCBQQVNTV09SRCBgcGFzc3dvcmRfYScgU1VQRVJVU0VSOyArCitDUkVBVEUgVVNFUiBib2IgV0lUSCBQQVNTV09SRCBgcGFzc3dvcmRfYicgTk9TVVBFUlVTRVI7CisKK2BDUkVBVEUgVVNFUmAgaXMgZXF1aXZhbGVudCB0byBgQ1JFQVRFIFJPTEVgIHdoZXJlIHRoZSBgTE9HSU5gIG9wdGlvbiBpcworYHRydWVgLiBTbywgdGhlIGZvbGxvd2luZyBwYWlycyBvZiBzdGF0ZW1lbnRzIGFyZSBlcXVpdmFsZW50OgorCitiYyhzYW1wbGUpLi4gKworQ1JFQVRFIFVTRVIgYWxpY2UgV0lUSCBQQVNTV09SRCBgcGFzc3dvcmRfYScgU1VQRVJVU0VSOyArCitDUkVBVEUgUk9MRSBhbGljZSBXSVRIIFBBU1NXT1JEID0gYHBhc3N3b3JkX2EnIEFORCBMT0dJTiA9IHRydWUgQU5ECitTVVBFUlVTRVIgPSB0cnVlOworCitDUkVBVEUgVVNFUiBJRiBOT1QgRVhJU1RTIGFsaWNlIFdJVEggUEFTU1dPUkQgYHBhc3N3b3JkX2EnIFNVUEVSVVNFUjsgKworQ1JFQVRFIFJPTEUgSUYgTk9UIEVYSVNUUyBhbGljZSBXSVRIIFBBU1NXT1JEID0gYHBhc3N3b3JkX2EnIEFORCBMT0dJTiA9Cit0cnVlIEFORCBTVVBFUlVTRVIgPSB0cnVlOworCitDUkVBVEUgVVNFUiBhbGljZSBXSVRIIFBBU1NXT1JEIGBwYXNzd29yZF9hJyBOT1NVUEVSVVNFUjsgKworQ1JFQVRFIFJPTEUgYWxpY2UgV0lUSCBQQVNTV09SRCA9IGBwYXNzd29yZF9hJyBBTkQgTE9HSU4gPSB0cnVlIEFORAorU1VQRVJVU0VSID0gZmFsc2U7CisKK0NSRUFURSBVU0VSIGFsaWNlIFdJVEggUEFTU1dPUkQgYHBhc3N3b3JkX2EnIE5PU1VQRVJVU0VSOyArCitDUkVBVEUgUk9MRSBhbGljZSBXSVRIIFBBU1NXT1JEID0gYHBhc3N3b3JkX2EnIEFORCBMT0dJTiA9IHRydWU7CisKK0NSRUFURSBVU0VSIGFsaWNlIFdJVEggUEFTU1dPUkQgYHBhc3N3b3JkX2EnOyArCitDUkVBVEUgUk9MRSBhbGljZSBXSVRIIFBBU1NXT1JEID0gYHBhc3N3b3JkX2EnIEFORCBMT0dJTiA9IHRydWU7ICsKK3AuCisKK1tbYWx0ZXJVc2VyU3RtdF1dCis9PT09IEFMVEVSIFVTRVIKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuLiArCis6Oj0gQUxURVIgVVNFUiAoSUYgRVhJU1RTKT8gKCBXSVRIIFBBU1NXT1JEICk/ICggKT8KKworOjo9IFNVUEVSVVNFUiArCit8IE5PU1VQRVJVU0VSICsKK3AuCisKK2JjKHNhbXBsZSkuICsKK0FMVEVSIFVTRVIgYWxpY2UgV0lUSCBQQVNTV09SRCBgUEFTU1dPUkRfQSc7ICsKK0FMVEVSIFVTRVIgYm9iIFNVUEVSVVNFUjsKKworSWYgdGhlIHVzZXIgZG9lcyBub3QgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgorCitbW2Ryb3BVc2VyU3RtdF1dCis9PT09IERST1AgVVNFUgorCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4uICsKKzo6PSBEUk9QIFVTRVIgKCBJRiBFWElTVFMgKT8gICsKK3AuCisKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLiArCitEUk9QIFVTRVIgYWxpY2U7ICsKK0RST1AgVVNFUiBJRiBFWElTVFMgYm9iOworCitbW2xpc3RVc2Vyc1N0bXRdXQorPT09PSBMSVNUIFVTRVJTCisKK19TeW50YXg6XworCitiYyhzeW50YXgpLiArCis6Oj0gTElTVCBVU0VSUzsKKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuICsKK0xJU1QgVVNFUlM7CisKK1RoaXMgc3RhdGVtZW50IGlzIGVxdWl2YWxlbnQgdG8KKworYmMoc2FtcGxlKS4gKworTElTVCBST0xFUzsKKworYnV0IG9ubHkgcm9sZXMgd2l0aCB0aGUgYExPR0lOYCBwcml2aWxlZ2UgYXJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQuCisKK1tbZGF0YUNvbnRyb2xdXQorPT09IERhdGEgQ29udHJvbAorCis9PT09IFBlcm1pc3Npb25zCisKK1Blcm1pc3Npb25zIG9uIHJlc291cmNlcyBhcmUgZ3JhbnRlZCB0byByb2xlczsgdGhlcmUgYXJlIHNldmVyYWwKK2RpZmZlcmVudCB0eXBlcyBvZiByZXNvdXJjZXMgaW4gQ2Fzc2FuZHJhIGFuZCBlYWNoIHR5cGUgaXMgbW9kZWxsZWQKK2hpZXJhcmNoaWNhbGx5OgorCisqIFRoZSBoaWVyYXJjaHkgb2YgRGF0YSByZXNvdXJjZXMsIEtleXNwYWNlcyBhbmQgVGFibGVzIGhhcyB0aGUKK3N0cnVjdHVyZSBgQUxMIEtFWVNQQUNFU2AgLT4gYEtFWVNQQUNFYCAtPiBgVEFCTEVgCisqIEZ1bmN0aW9uIHJlc291cmNlcyBoYXZlIHRoZSBzdHJ1Y3R1cmUgYEFMTCBGVU5DVElPTlNgIC0+IGBLRVlTUEFDRWAgLT4KK2BGVU5DVElPTmAKKyogUmVzb3VyY2VzIHJlcHJlc2VudGluZyByb2xlcyBoYXZlIHRoZSBzdHJ1Y3R1cmUgYEFMTCBST0xFU2AgLT4gYFJPTEVgCisqIFJlc291cmNlcyByZXByZXNlbnRpbmcgSk1YIE9iamVjdE5hbWVzLCB3aGljaCBtYXAgdG8gc2V0cyBvZgorTUJlYW5zL01YQmVhbnMsIGhhdmUgdGhlIHN0cnVjdHVyZSBgQUxMIE1CRUFOU2AgLT4gYE1CRUFOYAorCitQZXJtaXNzaW9ucyBjYW4gYmUgZ3JhbnRlZCBhdCBhbnkgbGV2ZWwgb2YgdGhlc2UgaGllcmFyY2hpZXMgYW5kIHRoZXkKK2Zsb3cgZG93bndhcmRzLiBTbyBncmFudGluZyBhIHBlcm1pc3Npb24gb24gYSByZXNvdXJjZSBoaWdoZXIgdXAgdGhlCitjaGFpbiBhdXRvbWF0aWNhbGx5IGdyYW50cyB0aGF0IHNhbWUgcGVybWlzc2lvbiBvbiBhbGwgcmVzb3VyY2VzIGxvd2VyCitkb3duLiBGb3IgZXhhbXBsZSwgZ3JhbnRpbmcgYFNFTEVDVGAgb24gYSBgS0VZU1BBQ0VgIGF1dG9tYXRpY2FsbHkKK2dyYW50cyBpdCBvbiBhbGwgYFRBQkxFU2AgaW4gdGhhdCBgS0VZU1BBQ0VgLiBMaWtld2lzZSwgZ3JhbnRpbmcgYQorcGVybWlzc2lvbiBvbiBgQUxMIEZVTkNUSU9OU2AgZ3JhbnRzIGl0IG9uIGV2ZXJ5IGRlZmluZWQgZnVuY3Rpb24sCityZWdhcmRsZXNzIG9mIHdoaWNoIGtleXNwYWNlIGl0IGlzIHNjb3BlZCBpbi4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0bworZ3JhbnQgcGVybWlzc2lvbnMgb24gYWxsIGZ1bmN0aW9ucyBzY29wZWQgdG8gYSBwYXJ0aWN1bGFyIGtleXNwYWNlLgorCitNb2RpZmljYXRpb25zIHRvIHBlcm1pc3Npb25zIGFyZSB2aXNpYmxlIHRvIGV4aXN0aW5nIGNsaWVudCBzZXNzaW9uczsKK3RoYXQgaXMsIGNvbm5lY3Rpb25zIG5lZWQgbm90IGJlIHJlLWVzdGFibGlzaGVkIGZvbGxvd2luZyBwZXJtaXNzaW9ucworY2hhbmdlcy4KKworVGhlIGZ1bGwgc2V0IG9mIGF2YWlsYWJsZSBwZXJtaXNzaW9ucyBpczoKKworKiBgQ1JFQVRFYAorKiBgQUxURVJgCisqIGBEUk9QYAorKiBgU0VMRUNUYAorKiBgTU9ESUZZYAorKiBgQVVUSE9SSVpFYAorKiBgREVTQ1JJQkVgCisqIGBFWEVDVVRFYAorKiBgVU5NQVNLYAorKiBgU0VMRUNUX01BU0tFRGAKKworTm90IGFsbCBwZXJtaXNzaW9ucyBhcmUgYXBwbGljYWJsZSB0byBldmVyeSB0eXBlIG9mIHJlc291cmNlLiBGb3IKK2luc3RhbmNlLCBgRVhFQ1VURWAgaXMgb25seSByZWxldmFudCBpbiB0aGUgY29udGV4dCBvZiBmdW5jdGlvbnMgb3IKK21iZWFuczsgZ3JhbnRpbmcgYEVYRUNVVEVgIG9uIGEgcmVzb3VyY2UgcmVwcmVzZW50aW5nIGEgdGFibGUgaXMKK25vbnNlbnNpY2FsLiBBdHRlbXB0aW5nIHRvIGBHUkFOVGAgYSBwZXJtaXNzaW9uIG9uIHJlc291cmNlIHRvIHdoaWNoIGl0CitjYW5ub3QgYmUgYXBwbGllZCByZXN1bHRzIGluIGFuIGVycm9yIHJlc3BvbnNlLiBUaGUgZm9sbG93aW5nCitpbGx1c3RyYXRlcyB3aGljaCBwZXJtaXNzaW9ucyBjYW4gYmUgZ3JhbnRlZCBvbiB3aGljaCB0eXBlcyBvZiByZXNvdXJjZSwKK2FuZCB3aGljaCBzdGF0ZW1lbnRzIGFyZSBlbmFibGVkIGJ5IHRoYXQgcGVybWlzc2lvbi4KKworW2NvbHM9IiwsLCwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xwZXJtaXNzaW9uIHxyZXNvdXJjZSB8b3BlcmF0aW9ucyB8IHwgfAorfGBDUkVBVEVgIHxgQUxMIEtFWVNQQUNFU2AgfGBDUkVBVEUgS0VZU1BBQ0VgIDxicj4gYENSRUFURSBUQUJMRWAgaW4gYW55CitrZXlzcGFjZSB8IHwgfAorCit8YENSRUFURWAgfGBLRVlTUEFDRWAgfGBDUkVBVEUgVEFCTEVgIGluIHNwZWNpZmllZCBrZXlzcGFjZSB8IHwgfAorCit8YENSRUFURWAgfGBBTEwgRlVOQ1RJT05TYCB8YENSRUFURSBGVU5DVElPTmAgaW4gYW55IGtleXNwYWNlIDxicj4KK2BDUkVBVEUgQUdHUkVHQVRFYCBpbiBhbnkga2V5c3BhY2UgfCB8IHwKKworfGBDUkVBVEVgIHxgQUxMIEZVTkNUSU9OUyBJTiBLRVlTUEFDRWAgfGBDUkVBVEUgRlVOQ1RJT05gIGluIGtleXNwYWNlCis8YnI+IGBDUkVBVEUgQUdHUkVHQVRFYCBpbiBrZXlzcGFjZSB8IHwgfAorCit8YENSRUFURWAgfGBBTEwgUk9MRVNgIHxgQ1JFQVRFIFJPTEVgIHwgfCB8CisKK3xgQUxURVJgIHxgQUxMIEtFWVNQQUNFU2AgfGBBTFRFUiBLRVlTUEFDRWAgPGJyPiBgQUxURVIgVEFCTEVgIGluIGFueQora2V5c3BhY2UgfCB8IHwKKworfGBBTFRFUmAgfGBLRVlTUEFDRWAgfGBBTFRFUiBLRVlTUEFDRWAgPGJyPiBgQUxURVIgVEFCTEVgIGluIGtleXNwYWNlIHwKK3wgfAorCit8YEFMVEVSYCB8YFRBQkxFYCB8YEFMVEVSIFRBQkxFYCB8IHwgfAorCit8YEFMVEVSYCB8YEFMTCBGVU5DVElPTlNgIHxgQ1JFQVRFIEZVTkNUSU9OYCByZXBsYWNpbmcgYW55IGV4aXN0aW5nIDxicj4KK2BDUkVBVEUgQUdHUkVHQVRFYCByZXBsYWNpbmcgYW55IGV4aXN0aW5nIHwgfCB8CisKK3xgQUxURVJgIHxgQUxMIEZVTkNUSU9OUyBJTiBLRVlTUEFDRWAgfGBDUkVBVEUgRlVOQ1RJT05gIHJlcGxhY2luZworZXhpc3RpbmcgaW4ga2V5c3BhY2UgPGJyPiBgQ1JFQVRFIEFHR1JFR0FURWAgcmVwbGFjaW5nIGFueSBleGlzdGluZyBpbgora2V5c3BhY2UgfCB8IHwKKworfGBBTFRFUmAgfGBGVU5DVElPTmAgfGBDUkVBVEUgRlVOQ1RJT05gIHJlcGxhY2luZyBleGlzdGluZyA8YnI+CitgQ1JFQVRFIEFHR1JFR0FURWAgcmVwbGFjaW5nIGV4aXN0aW5nIHwgfCB8CisKK3xgQUxURVJgIHxgQUxMIFJPTEVTYCB8YEFMVEVSIFJPTEVgIG9uIGFueSByb2xlIHwgfCB8CisKK3xgQUxURVJgIHxgUk9MRWAgfGBBTFRFUiBST0xFYCB8IHwgfAorCit8YERST1BgIHxgQUxMIEtFWVNQQUNFU2AgfGBEUk9QIEtFWVNQQUNFYCA8YnI+IGBEUk9QIFRBQkxFYCBpbiBhbnkKK2tleXNwYWNlIHwgfCB8CisKK3xgRFJPUGAgfGBLRVlTUEFDRWAgfGBEUk9QIFRBQkxFYCBpbiBzcGVjaWZpZWQga2V5c3BhY2UgfCB8IHwKKworfGBEUk9QYCB8YFRBQkxFYCB8YERST1AgVEFCTEVgIHwgfCB8CisKK3xgRFJPUGAgfGBBTEwgRlVOQ1RJT05TYCB8YERST1AgRlVOQ1RJT05gIGluIGFueSBrZXlzcGFjZSA8YnI+CitgRFJPUCBBR0dSRUdBVEVgIGluIGFueSBleGlzdGluZyB8IHwgfAorCit8YERST1BgIHxgQUxMIEZVTkNUSU9OUyBJTiBLRVlTUEFDRWAgfGBEUk9QIEZVTkNUSU9OYCBpbiBrZXlzcGFjZSA8YnI+CitgRFJPUCBBR0dSRUdBVEVgIGluIGV4aXN0aW5nIHwgfCB8CisKK3xgRFJPUGAgfGBGVU5DVElPTmAgfGBEUk9QIEZVTkNUSU9OYCB8IHwgfAorCit8YERST1BgIHxgQUxMIFJPTEVTYCB8YERST1AgUk9MRWAgb24gYW55IHJvbGUgfCB8IHwKKworfGBEUk9QYCB8YFJPTEVgIHxgRFJPUCBST0xFYCB8IHwgfAorCit8YFNFTEVDVGAgfGBBTEwgS0VZU1BBQ0VTYCB8YFNFTEVDVGAgb24gYW55IHRhYmxlIHwgfCB8CisKK3xgU0VMRUNUYCB8YEtFWVNQQUNFYCB8YFNFTEVDVGAgb24gYW55IHRhYmxlIGluIGtleXNwYWNlIHwgfCB8CisKK3xgU0VMRUNUYCB8YFRBQkxFYCB8YFNFTEVDVGAgb24gc3BlY2lmaWVkIHRhYmxlIHwgfCB8CisKK3xgU0VMRUNUYCB8YEFMTCBNQkVBTlNgIHxDYWxsIGdldHRlciBtZXRob2RzIG9uIGFueSBtYmVhbiB8IHwgfAorCit8YFNFTEVDVGAgfGBNQkVBTlNgIHxDYWxsIGdldHRlciBtZXRob2RzIG9uIGFueSBtYmVhbiBtYXRjaGluZyBhCit3aWxkY2FyZCBwYXR0ZXJuIHwgfCB8CisKK3xgU0VMRUNUYCB8YE1CRUFOYCB8Q2FsbCBnZXR0ZXIgbWV0aG9kcyBvbiBuYW1lZCBtYmVhbiB8IHwgfAorCit8YE1PRElGWWAgfGBBTEwgS0VZU1BBQ0VTYCB8YElOU0VSVGAgb24gYW55IHRhYmxlIDxicj4gYFVQREFURWAgb24gYW55Cit0YWJsZSA8YnI+IGBERUxFVEVgIG9uIGFueSB0YWJsZSA8YnI+IGBUUlVOQ0FURWAgb24gYW55IHRhYmxlIHwgfCB8CisKK3xgTU9ESUZZYCB8YEtFWVNQQUNFYCB8YElOU0VSVGAgb24gYW55IHRhYmxlIGluIGtleXNwYWNlIDxicj4gYFVQREFURWAKK29uIGFueSB0YWJsZSBpbiBrZXlzcGFjZSA8YnI+ICAgYERFTEVURWAgb24gYW55IHRhYmxlIGluIGtleXNwYWNlIDxicj4KK2BUUlVOQ0FURWAgb24gYW55IHRhYmxlIGluIGtleXNwYWNlIHxgTU9ESUZZYCB8YFRBQkxFYCB8YElOU0VSVGAgPGJyPgorYFVQREFURWAgPGJyPiBgREVMRVRFYCA8YnI+IGBUUlVOQ0FURWAKKworfGBNT0RJRllgIHxgQUxMIE1CRUFOU2AgfENhbGwgc2V0dGVyIG1ldGhvZHMgb24gYW55IG1iZWFuIHwgfCB8CisKK3xgTU9ESUZZYCB8YE1CRUFOU2AgfENhbGwgc2V0dGVyIG1ldGhvZHMgb24gYW55IG1iZWFuIG1hdGNoaW5nIGEKK3dpbGRjYXJkIHBhdHRlcm4gfCB8IHwKKworfGBNT0RJRllgIHxgTUJFQU5gIHxDYWxsIHNldHRlciBtZXRob2RzIG9uIG5hbWVkIG1iZWFuIHwgfCB8CisKK3xgQVVUSE9SSVpFYCB8YEFMTCBLRVlTUEFDRVNgIHxgR1JBTlQgUEVSTUlTU0lPTmAgb24gYW55IHRhYmxlIDxicj4KK2BSRVZPS0UgUEVSTUlTU0lPTmAgb24gYW55IHRhYmxlIHwgfCB8CisKK3xgQVVUSE9SSVpFYCB8YEtFWVNQQUNFYCB8YEdSQU5UIFBFUk1JU1NJT05gIG9uIHRhYmxlIGluIGtleXNwYWNlIDxicj4KK2BSRVZPS0UgUEVSTUlTU0lPTmAgb24gdGFibGUgaW4ga2V5c3BhY2UgfCB8IHwKKworfGBBVVRIT1JJWkVgIHxgVEFCTEVgIHxgR1JBTlQgUEVSTUlTU0lPTmAgPGJyPiBgUkVWT0tFIFBFUk1JU1NJT05gIHwgfCB8CisKK3xgQVVUSE9SSVpFYCB8YEFMTCBGVU5DVElPTlNgIHxgR1JBTlQgUEVSTUlTU0lPTmAgb24gYW55IGZ1bmN0aW9uIDxicj4KK2BSRVZPS0UgUEVSTUlTU0lPTmAgb24gYW55IGZ1bmN0aW9uIHwgfCB8CisKK3xgQVVUSE9SSVpFYCB8YEFMTCBGVU5DVElPTlMgSU4gS0VZU1BBQ0VgIHxgR1JBTlQgUEVSTUlTU0lPTmAgaW4KK2tleXNwYWNlIDxicj4gYFJFVk9LRSBQRVJNSVNTSU9OYCBpbiBrZXlzcGFjZSB8IHwgfAorCit8YEFVVEhPUklaRWAgfGBBTEwgRlVOQ1RJT05TIElOIEtFWVNQQUNFYCB8YEdSQU5UIFBFUk1JU1NJT05gIGluCitrZXlzcGFjZSA8YnI+IGBSRVZPS0UgUEVSTUlTU0lPTmAgaW4ga2V5c3BhY2UgfCB8IHwKKworfGBBVVRIT1JJWkVgIHxgRlVOQ1RJT05gIHxgR1JBTlQgUEVSTUlTU0lPTmAgPGJyPiBgUkVWT0tFIFBFUk1JU1NJT05gIHwKK3wgfAorCit8YEFVVEhPUklaRWAgfGBBTEwgTUJFQU5TYCB8YEdSQU5UIFBFUk1JU1NJT05gIG9uIGFueSBtYmVhbiA8YnI+CitgUkVWT0tFIFBFUk1JU1NJT05gIG9uIGFueSBtYmVhbiB8IHwgfAorCit8YEFVVEhPUklaRWAgfGBNQkVBTlNgIHxgR1JBTlQgUEVSTUlTU0lPTmAgb24gYW55IG1iZWFuIG1hdGNoaW5nIGEKK3dpbGRjYXJkIHBhdHRlcm4gPGJyPiBgUkVWT0tFIFBFUk1JU1NJT05gIG9uIGFueSBtYmVhbiBtYXRjaGluZyBhCit3aWxkY2FyZCBwYXR0ZXJuIHwgfCB8CisKK3xgQVVUSE9SSVpFYCB8YE1CRUFOYCB8YEdSQU5UIFBFUk1JU1NJT05gIG9uIG5hbWVkIG1iZWFuIDxicj4KK2BSRVZPS0UgUEVSTUlTU0lPTmAgb24gbmFtZWQgbWJlYW4gfCB8IHwKKworfGBBVVRIT1JJWkVgIHxgQUxMIFJPTEVTYCB8YEdSQU5UIFJPTEVgIGdyYW50IGFueSByb2xlIDxicj4KK2BSRVZPS0UgUk9MRWAgcmV2b2tlIGFueSByb2xlIHwgfCB8CisKK3xgQVVUSE9SSVpFYCB8YFJPTEVTYCB8YEdSQU5UIFJPTEVgIGdyYW50IHJvbGUgPGJyPiBgUkVWT0tFIFJPTEVgIHJldm9rZQorcm9sZSB8IHwgfAorCit8YERFU0NSSUJFYCB8YEFMTCBST0xFU2AgfGBMSVNUIFJPTEVTYCBhbGwgcm9sZXMgb3Igb25seSByb2xlcyBncmFudGVkCit0byBhbm90aGVyLCBzcGVjaWZpZWQgcm9sZSB8IHwgfAorCit8YERFU0NSSUJFYCB8QEFMTCBNQkVBTlMgfFJldHJpZXZlIG1ldGFkYXRhIGFib3V0IGFueSBtYmVhbiBmcm9tIHRoZQorcGxhdGZvcm3igJlzIE1CZWFuU2VydmVyIHwgfCB8CisKK3xgREVTQ1JJQkVgIHxATUJFQU5TIHxSZXRyaWV2ZSBtZXRhZGF0YSBhYm91dCBhbnkgbWJlYW4gbWF0Y2hpbmcgYQord2lsZGNhcmQgcGF0dGVyIGZyb20gdGhlIHBsYXRmb3Jt4oCZcyBNQmVhblNlcnZlciB8IHwgfAorCit8YERFU0NSSUJFYCB8QE1CRUFOIHxSZXRyaWV2ZSBtZXRhZGF0YSBhYm91dCBhIG5hbWVkIG1iZWFuIGZyb20gdGhlCitwbGF0Zm9ybeKAmXMgTUJlYW5TZXJ2ZXIgfCB8IHwKKworfGBFWEVDVVRFYCB8YEFMTCBGVU5DVElPTlNgIHxgU0VMRUNUYCwgYElOU0VSVGAsIGBVUERBVEVgIHVzaW5nIGFueQorZnVuY3Rpb24gPGJyPiB1c2Ugb2YgYW55IGZ1bmN0aW9uIGluIGBDUkVBVEUgQUdHUkVHQVRFYCB8IHwgfAorCit8YEVYRUNVVEVgIHxgQUxMIEZVTkNUSU9OUyBJTiBLRVlTUEFDRWAgfGBTRUxFQ1RgLCBgSU5TRVJUYCwgYFVQREFURWAKK3VzaW5nIGFueSBmdW5jdGlvbiBpbiBrZXlzcGFjZSA8YnI+IHVzZSBvZiBhbnkgZnVuY3Rpb24gaW4ga2V5c3BhY2UgaW4KK2BDUkVBVEUgQUdHUkVHQVRFYCB8IHwgfAorCit8YEVYRUNVVEVgIHxgRlVOQ1RJT05gIHxgU0VMRUNUYCwgYElOU0VSVGAsIGBVUERBVEVgIHVzaW5nIGZ1bmN0aW9uIDxicj4KK3VzZSBvZiBmdW5jdGlvbiBpbiBgQ1JFQVRFIEFHR1JFR0FURWAgfCB8IHwKKworfGBFWEVDVVRFYCB8YEFMTCBNQkVBTlNgIHxFeGVjdXRlIG9wZXJhdGlvbnMgb24gYW55IG1iZWFuIHwgfCB8CisKK3xgRVhFQ1VURWAgfGBNQkVBTlNgIHxFeGVjdXRlIG9wZXJhdGlvbnMgb24gYW55IG1iZWFuIG1hdGNoaW5nIGEKK3dpbGRjYXJkIHBhdHRlcm4gfCB8IHwKKworfGBFWEVDVVRFYCB8YE1CRUFOYCB8RXhlY3V0ZSBvcGVyYXRpb25zIG9uIG5hbWVkIG1iZWFuIHwgfCB8CisKK3xgVU5NQVNLYCB8YEFMTCBLRVlTUEFDRVNgIHxTZWUgdGhlIGNsZWFyIGNvbnRlbnRzIG9mIG1hc2tlZCBjb2x1bW5zIG9uIGFueSB0YWJsZSB8IHwgfAorCit8YFVOTUFTS2AgfGBLRVlTUEFDRWAgfFNlZSB0aGUgY2xlYXIgY29udGVudHMgb2YgbWFza2VkIGNvbHVtbnMgb24gYW55IHRhYmxlIGluIGtleXNwYWNlIHwgfCB8CisKK3xgVU5NQVNLYCB8YFRBQkxFYCB8U2VlIHRoZSBjbGVhciBjb250ZW50cyBvZiBtYXNrZWQgY29sdW1ucyBvbiB0aGUgc3BlY2lmaWVkIHRhYmxlIHwgfCB8CisKK3xgU0VMRUNUX01BU0tFRGAgfCBgQUxMIEtFWVNQQUNFU2AgfCBgU0VMRUNUYCByZXN0cmljdGluZyBtYXNrZWQgY29sdW1ucyBvbiBhbnkgdGFibGUgfCB8IHwKKworfGBTRUxFQ1RfTUFTS0VEYCB8IGBLRVlTUEFDRWAgfCBgU0VMRUNUYCByZXN0cmljdGluZyBtYXNrZWQgY29sdW1ucyBvbiBhbnkgdGFibGUgaW4gc3BlY2lmaWVkIGtleXNwYWNlIHwgfCB8CisKK3xgU0VMRUNUX01BU0tFRGAgfCBgVEFCTEVgIHwgYFNFTEVDVGAgcmVzdHJpY3RpbmcgbWFza2VkIGNvbHVtbnMgb24gdGhlIHNwZWNpZmllZCB0YWJsZSB8IHwgfAorfD09PQorCitbW2dyYW50UGVybWlzc2lvbnNTdG10XV0KKz09PT0gR1JBTlQgUEVSTUlTU0lPTgorCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4uICsKKzo6PSBHUkFOVCAoIEFMTCAoIFBFUk1JU1NJT05TICk/IHwgKCBQRVJNSVNTSU9OICk/ICkgT04gVE8KKworOjo9IENSRUFURSB8IEFMVEVSIHwgRFJPUCB8IFNFTEVDVCB8IE1PRElGWSB8IEFVVEhPUklaRSB8IERFU1JJQkUgfCBVTk1BU0sgfCBTRUxFQ1RfTUFTS0VECitFWEVDVVRFCisKKzo6PSBBTEwgS0VZU1BBQ0VTICsKK3wgS0VZU1BBQ0UgICsKK3wgKCBUQUJMRSApPyAgKworfCBBTEwgUk9MRVMgKworfCBST0xFICArCit8IEFMTCBGVU5DVElPTlMgKCBJTiBLRVlTUEFDRSApPyArCit8IEZVTkNUSU9OICArCit8IEFMTCBNQkVBTlMgKworfCAoIE1CRUFOIHwgTUJFQU5TICkgICsKK3AuCisKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLiArCitHUkFOVCBTRUxFQ1QgT04gQUxMIEtFWVNQQUNFUyBUTyBkYXRhX3JlYWRlcjsKKworVGhpcyBnaXZlcyBhbnkgdXNlciB3aXRoIHRoZSByb2xlIGBkYXRhX3JlYWRlcmAgcGVybWlzc2lvbiB0byBleGVjdXRlCitgU0VMRUNUYCBzdGF0ZW1lbnRzIG9uIGFueSB0YWJsZSBhY3Jvc3MgYWxsIGtleXNwYWNlcworCitiYyhzYW1wbGUpLiArCitHUkFOVCBNT0RJRlkgT04gS0VZU1BBQ0Uga2V5c3BhY2UxIFRPIGRhdGFfd3JpdGVyOworCitUaGlzIGdpdmUgYW55IHVzZXIgd2l0aCB0aGUgcm9sZSBgZGF0YV93cml0ZXJgIHBlcm1pc3Npb24gdG8gcGVyZm9ybQorYFVQREFURWAsIGBJTlNFUlRgLCBgVVBEQVRFYCwgYERFTEVURWAgYW5kIGBUUlVOQ0FURWAgcXVlcmllcyBvbiBhbGwKK3RhYmxlcyBpbiB0aGUgYGtleXNwYWNlMWAga2V5c3BhY2UKKworYmMoc2FtcGxlKS4gKworR1JBTlQgRFJPUCBPTiBrZXlzcGFjZTEudGFibGUxIFRPIHNjaGVtYV9vd25lcjsKKworVGhpcyBnaXZlcyBhbnkgdXNlciB3aXRoIHRoZSBgc2NoZW1hX293bmVyYCByb2xlIHBlcm1pc3Npb25zIHRvIGBEUk9QYAorYGtleXNwYWNlMS50YWJsZTFgLgorCitiYyhzYW1wbGUpLiArCitHUkFOVCBFWEVDVVRFIE9OIEZVTkNUSU9OIGtleXNwYWNlMS51c2VyX2Z1bmN0aW9uKCBpbnQgKSBUTworcmVwb3J0X3dyaXRlcjsKKworVGhpcyBncmFudHMgYW55IHVzZXIgd2l0aCB0aGUgYHJlcG9ydF93cml0ZXJgIHJvbGUgcGVybWlzc2lvbiB0byBleGVjdXRlCitgU0VMRUNUYCwgYElOU0VSVGAgYW5kIGBVUERBVEVgIHF1ZXJpZXMgd2hpY2ggdXNlIHRoZSBmdW5jdGlvbgorYGtleXNwYWNlMS51c2VyX2Z1bmN0aW9uKCBpbnQgKWAKKworYmMoc2FtcGxlKS4gKworR1JBTlQgREVTQ1JJQkUgT04gQUxMIFJPTEVTIFRPIHJvbGVfYWRtaW47CisKK1RoaXMgZ3JhbnRzIGFueSB1c2VyIHdpdGggdGhlIGByb2xlX2FkbWluYCByb2xlIHBlcm1pc3Npb24gdG8gdmlldyBhbnkKK2FuZCBhbGwgcm9sZXMgaW4gdGhlIHN5c3RlbSB3aXRoIGEgYExJU1QgUk9MRVNgIHN0YXRlbWVudAorCitbW2dyYW50QWxsXV0KKz09PT09IEdSQU5UIEFMTAorCitXaGVuIHRoZSBgR1JBTlQgQUxMYCBmb3JtIGlzIHVzZWQsIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2YgcGVybWlzc2lvbnMgaXMKK2RldGVybWluZWQgYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGUgdGFyZ2V0IHJlc291cmNlLgorCitbW2F1dG9HcmFudFBlcm1pc3Npb25zXV0KKz09PT09IEF1dG9tYXRpYyBHcmFudGluZworCitXaGVuIGEgcmVzb3VyY2UgaXMgY3JlYXRlZCwgdmlhIGEgYENSRUFURSBLRVlTUEFDRWAsIGBDUkVBVEUgVEFCTEVgLAorYENSRUFURSBGVU5DVElPTmAsIGBDUkVBVEUgQUdHUkVHQVRFYCBvciBgQ1JFQVRFIFJPTEVgIHN0YXRlbWVudCwgdGhlCitjcmVhdG9yICh0aGUgcm9sZSB0aGUgZGF0YWJhc2UgdXNlciB3aG8gaXNzdWVzIHRoZSBzdGF0ZW1lbnQgaXMKK2lkZW50aWZpZWQgYXMpLCBpcyBhdXRvbWF0aWNhbGx5IGdyYW50ZWQgYWxsIGFwcGxpY2FibGUgcGVybWlzc2lvbnMgb24KK3RoZSBuZXcgcmVzb3VyY2UuCisKK1tbcmV2b2tlUGVybWlzc2lvbnNTdG10XV0KKz09PT0gUkVWT0tFIFBFUk1JU1NJT04KKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuLiArCis6Oj0gUkVWT0tFICggQUxMICggUEVSTUlTU0lPTlMgKT8gfCAoIFBFUk1JU1NJT04gKT8gKSBPTiBGUk9NCisKKzo6PSBDUkVBVEUgfCBBTFRFUiB8IERST1AgfCBTRUxFQ1QgfCBNT0RJRlkgfCBBVVRIT1JJWkUgfCBERVNSSUJFIHwgVU5NQVNLIHwgU0VMRUNUX01BU0tFRAorRVhFQ1VURQorCis6Oj0gQUxMIEtFWVNQQUNFUyArCit8IEtFWVNQQUNFICArCit8ICggVEFCTEUgKT8gICsKK3wgQUxMIFJPTEVTICsKK3wgUk9MRSAgKworfCBBTEwgRlVOQ1RJT05TICggSU4gS0VZU1BBQ0UgKT8gKworfCBGVU5DVElPTiAgKworfCBBTEwgTUJFQU5TICsKK3wgKCBNQkVBTiB8IE1CRUFOUyApICArCitwLgorCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4uICsKK1JFVk9LRSBTRUxFQ1QgT04gQUxMIEtFWVNQQUNFUyBGUk9NIGRhdGFfcmVhZGVyOyArCitSRVZPS0UgTU9ESUZZIE9OIEtFWVNQQUNFIGtleXNwYWNlMSBGUk9NIGRhdGFfd3JpdGVyOyArCitSRVZPS0UgRFJPUCBPTiBrZXlzcGFjZTEudGFibGUxIEZST00gc2NoZW1hX293bmVyOyArCitSRVZPS0UgRVhFQ1VURSBPTiBGVU5DVElPTiBrZXlzcGFjZTEudXNlcl9mdW5jdGlvbiggaW50ICkgRlJPTQorcmVwb3J0X3dyaXRlcjsgKworUkVWT0tFIERFU0NSSUJFIE9OIEFMTCBST0xFUyBGUk9NIHJvbGVfYWRtaW47ICsKK3AuCisKK1tbbGlzdFBlcm1pc3Npb25zU3RtdF1dCis9PT09PSBMSVNUIFBFUk1JU1NJT05TCisKK19TeW50YXg6XworCitiYyhzeW50YXgpLi4gKworOjo9IExJU1QgKCBBTEwgKCBQRVJNSVNTSU9OUyApPyB8ICkgKworKCBPTiApPyArCisoIE9GICggTk9SRUNVUlNJVkUgKT8gKT8KKworOjo9IEFMTCBLRVlTUEFDRVMgKworfCBLRVlTUEFDRSAgKworfCAoIFRBQkxFICk/ICArCit8IEFMTCBST0xFUyArCit8IFJPTEUgICsKK3wgQUxMIEZVTkNUSU9OUyAoIElOIEtFWVNQQUNFICk/ICsKK3wgRlVOQ1RJT04gICsKK3wgQUxMIE1CRUFOUyArCit8ICggTUJFQU4gfCBNQkVBTlMgKSAgKworcC4KKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuICsKK0xJU1QgQUxMIFBFUk1JU1NJT05TIE9GIGFsaWNlOworCitTaG93IGFsbCBwZXJtaXNzaW9ucyBncmFudGVkIHRvIGBhbGljZWAsIGluY2x1ZGluZyB0aG9zZSBhY3F1aXJlZAordHJhbnNpdGl2ZWx5IGZyb20gYW55IG90aGVyIHJvbGVzLgorCitiYyhzYW1wbGUpLiArCitMSVNUIEFMTCBQRVJNSVNTSU9OUyBPTiBrZXlzcGFjZTEudGFibGUxIE9GIGJvYjsKKworU2hvdyBhbGwgcGVybWlzc2lvbnMgb24gYGtleXNwYWNlMS50YWJsZTFgIGdyYW50ZWQgdG8gYGJvYmAsIGluY2x1ZGluZwordGhvc2UgYWNxdWlyZWQgdHJhbnNpdGl2ZWx5IGZyb20gYW55IG90aGVyIHJvbGVzLiBUaGlzIGFsc28gaW5jbHVkZXMgYW55CitwZXJtaXNzaW9ucyBoaWdoZXIgdXAgdGhlIHJlc291cmNlIGhpZXJhcmNoeSB3aGljaCBjYW4gYmUgYXBwbGllZCB0bworYGtleXNwYWNlMS50YWJsZTFgLiBGb3IgZXhhbXBsZSwgc2hvdWxkIGBib2JgIGhhdmUgYEFMVEVSYCBwZXJtaXNzaW9uIG9uCitga2V5c3BhY2UxYCwgdGhhdCB3b3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0cyBvZiB0aGlzIHF1ZXJ5LiBBZGRpbmcKK3RoZSBgTk9SRUNVUlNJVkVgIHN3aXRjaCByZXN0cmljdHMgdGhlIHJlc3VsdHMgdG8gb25seSB0aG9zZSBwZXJtaXNzaW9ucword2hpY2ggd2VyZSBkaXJlY3RseSBncmFudGVkIHRvIGBib2JgIG9yIG9uZSBvZiBgYm9iYOKAmXMgcm9sZXMuCisKK2JjKHNhbXBsZSkuICsKK0xJU1QgU0VMRUNUIFBFUk1JU1NJT05TIE9GIGNhcmxvczsKKworU2hvdyBhbnkgcGVybWlzc2lvbnMgZ3JhbnRlZCB0byBgY2FybG9zYCBvciBhbnkgb2YgYGNhcmxvc2DigJlzIHJvbGVzLAorbGltaXRlZCB0byBgU0VMRUNUYCBwZXJtaXNzaW9ucyBvbiBhbnkgcmVzb3VyY2UuCisKK1tbdHlwZXNdXQorPT09IERhdGEgVHlwZXMKKworQ1FMIHN1cHBvcnRzIGEgcmljaCBzZXQgb2YgZGF0YSB0eXBlcyBmb3IgY29sdW1ucyBkZWZpbmVkIGluIGEgdGFibGUsCitpbmNsdWRpbmcgY29sbGVjdGlvbiB0eXBlcy4gT24gdG9wIG9mIHRob3NlIG5hdGl2ZSArCithbmQgY29sbGVjdGlvbiB0eXBlcywgdXNlcnMgY2FuIGFsc28gcHJvdmlkZSBjdXN0b20gdHlwZXMgKHRocm91Z2ggYQorSkFWQSBjbGFzcyBleHRlbmRpbmcgYEFic3RyYWN0VHlwZWAgbG9hZGFibGUgYnkgKworQ2Fzc2FuZHJhKS4gVGhlIHN5bnRheCBvZiB0eXBlcyBpcyB0aHVzOgorCitiYyhzeW50YXgpLi4gKworOjo9ICArCit8ICArCit8ICArCit8IC8vIFVzZWQgZm9yIGN1c3RvbSB0eXBlcy4gVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGEgSkFWQSBjbGFzcworCis6Oj0gYXNjaWkgKworfCBiaWdpbnQgKworfCBibG9iICsKK3wgYm9vbGVhbiArCit8IGNvdW50ZXIgKworfCBkYXRlICsKK3wgZGVjaW1hbCArCit8IGRvdWJsZSArCit8IGZsb2F0ICsKK3wgaW5ldCArCit8IGludCArCit8IHNtYWxsaW50ICsKK3wgdGV4dCArCit8IHRpbWUgKworfCB0aW1lc3RhbXAgKworfCB0aW1ldXVpZCArCit8IHRpbnlpbnQgKworfCB1dWlkICsKK3wgdmFyY2hhciArCit8IHZhcmludAorCis6Oj0gbGlzdCBgPCcgYD4nICsKK3wgc2V0IGA8JyBgPicgKworfCBtYXAgYDwnIGAsJyBgPicgKworOjo9IHR1cGxlIGA8JyAoYCwnICkqIGA+JyArCitwLiBOb3RlIHRoYXQgdGhlIG5hdGl2ZSB0eXBlcyBhcmUga2V5d29yZHMgYW5kIGFzIHN1Y2ggYXJlCitjYXNlLWluc2Vuc2l0aXZlLiBUaGV5IGFyZSBob3dldmVyIG5vdCByZXNlcnZlZCBvbmVzLgorCitUaGUgZm9sbG93aW5nIHRhYmxlIGdpdmVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25zIG9uIHRoZSBuYXRpdmUgZGF0YQordHlwZXMsIGFuZCBvbiB3aGljaCBraW5kIG9mIGxpbms6I2NvbnN0YW50c1tjb25zdGFudHNdIGVhY2ggdHlwZQorc3VwcG9ydHM6CisKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8dHlwZSB8Y29uc3RhbnRzIHN1cHBvcnRlZCB8ZGVzY3JpcHRpb24KK3xgYXNjaWlgIHxzdHJpbmdzIHxBU0NJSSBjaGFyYWN0ZXIgc3RyaW5nCisKK3xgYmlnaW50YCB8aW50ZWdlcnMgfDY0LWJpdCBzaWduZWQgbG9uZworCit8YGJsb2JgIHxibG9icyB8QXJiaXRyYXJ5IGJ5dGVzIChubyB2YWxpZGF0aW9uKQorCit8YGJvb2xlYW5gIHxib29sZWFucyB8dHJ1ZSBvciBmYWxzZQorCit8YGNvdW50ZXJgIHxpbnRlZ2VycyB8Q291bnRlciBjb2x1bW4gKDY0LWJpdCBzaWduZWQgdmFsdWUpLiBTZWUKK2xpbms6I2NvdW50ZXJzW0NvdW50ZXJzXSBmb3IgZGV0YWlscworCit8YGRhdGVgIHxpbnRlZ2Vycywgc3RyaW5ncyB8QSBkYXRlICh3aXRoIG5vIGNvcnJlc3BvbmRpbmcgdGltZSB2YWx1ZSkuCitTZWUgbGluazojdXNpbmdkYXRlc1tXb3JraW5nIHdpdGggZGF0ZXNdIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCit8YGRlY2ltYWxgIHxpbnRlZ2VycywgZmxvYXRzIHxWYXJpYWJsZS1wcmVjaXNpb24gZGVjaW1hbAorCit8YGRvdWJsZWAgfGludGVnZXJzIHw2NC1iaXQgSUVFRS03NTQgZmxvYXRpbmcgcG9pbnQKKworfGBmbG9hdGAgfGludGVnZXJzLCBmbG9hdHMgfDMyLWJpdCBJRUVFLTc1NCBmbG9hdGluZyBwb2ludAorCit8YGluZXRgIHxzdHJpbmdzIHxBbiBJUCBhZGRyZXNzLiBJdCBjYW4gYmUgZWl0aGVyIDQgYnl0ZXMgbG9uZyAoSVB2NCkgb3IKKzE2IGJ5dGVzIGxvbmcgKElQdjYpLiBUaGVyZSBpcyBubyBgaW5ldGAgY29uc3RhbnQsIElQIGFkZHJlc3Mgc2hvdWxkIGJlCitpbnB1dGVkIGFzIHN0cmluZ3MKKworfGBpbnRgIHxpbnRlZ2VycyB8MzItYml0IHNpZ25lZCBpbnQKKworfGBzbWFsbGludGAgfGludGVnZXJzIHwxNi1iaXQgc2lnbmVkIGludAorCit8YHRleHRgIHxzdHJpbmdzIHxVVEY4IGVuY29kZWQgc3RyaW5nCisKK3xgdGltZWAgfGludGVnZXJzLCBzdHJpbmdzIHxBIHRpbWUgd2l0aCBuYW5vc2Vjb25kIHByZWNpc2lvbi4gU2VlCitsaW5rOiN1c2luZ3RpbWVbV29ya2luZyB3aXRoIHRpbWVdIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCit8YHRpbWVzdGFtcGAgfGludGVnZXJzLCBzdHJpbmdzIHxBIHRpbWVzdGFtcC4gU3RyaW5ncyBjb25zdGFudCBhcmUgYWxsb3cKK3RvIGlucHV0IHRpbWVzdGFtcHMgYXMgZGF0ZXMsIHNlZSBsaW5rOiN1c2luZ3RpbWVzdGFtcHNbV29ya2luZyB3aXRoCit0aW1lc3RhbXBzXSBiZWxvdyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworfGB0aW1ldXVpZGAgfHV1aWRzIHxUeXBlIDEgVVVJRC4gVGhpcyBpcyBnZW5lcmFsbHkgdXNlZCBhcyBhCitgYGNvbmZsaWN0LWZyZWUnJyB0aW1lc3RhbXAuIEFsc28gc2VlIHRoZSBsaW5rOiN0aW1ldXVpZEZ1bltmdW5jdGlvbnMgb24KK1RpbWV1dWlkXQorCit8YHRpbnlpbnRgIHxpbnRlZ2VycyB8OC1iaXQgc2lnbmVkIGludAorCit8YHV1aWRgIHx1dWlkcyB8VHlwZSAxIG9yIHR5cGUgNCBVVUlECisKK3xgdmFyY2hhcmAgfHN0cmluZ3MgfFVURjggZW5jb2RlZCBzdHJpbmcKKworfGB2YXJpbnRgIHxpbnRlZ2VycyB8QXJiaXRyYXJ5LXByZWNpc2lvbiBpbnRlZ2VyCit8PT09CisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byB1c2UgdGhlIGNvbGxlY3Rpb24gdHlwZXMsIHNlZSB0aGUKK2xpbms6I2NvbGxlY3Rpb25zW1dvcmtpbmcgd2l0aCBjb2xsZWN0aW9uc10gc2VjdGlvbiBiZWxvdy4KKworW1t1c2luZ3RpbWVzdGFtcHNdXQorPT09PSBXb3JraW5nIHdpdGggdGltZXN0YW1wcworCitWYWx1ZXMgb2YgdGhlIGB0aW1lc3RhbXBgIHR5cGUgYXJlIGVuY29kZWQgYXMgNjQtYml0IHNpZ25lZCBpbnRlZ2VycworcmVwcmVzZW50aW5nIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgc3RhbmRhcmQgYmFzZSB0aW1lIGtub3duCithcyBgYHRoZSBlcG9jaCcnOiBKYW51YXJ5IDEgMTk3MCBhdCAwMDowMDowMCBHTVQuCisKK1RpbWVzdGFtcCBjYW4gYmUgaW5wdXQgaW4gQ1FMIGFzIHNpbXBsZSBsb25nIGludGVnZXJzLCBnaXZpbmcgdGhlIG51bWJlcgorb2YgbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaCwgYXMgZGVmaW5lZCBhYm92ZS4KKworVGhleSBjYW4gYWxzbyBiZSBpbnB1dCBhcyBzdHJpbmcgbGl0ZXJhbHMgaW4gYW55IG9mIHRoZSBmb2xsb3dpbmcgSVNPCis4NjAxIGZvcm1hdHMsIGVhY2ggcmVwcmVzZW50aW5nIHRoZSB0aW1lIGFuZCBkYXRlIE1hciAyLCAyMDExLCBhdAorMDQ6MDU6MDAgQU0sIEdNVC46CisKKyogYDIwMTEtMDItMDMgMDQ6MDUrMDAwMGAKKyogYDIwMTEtMDItMDMgMDQ6MDU6MDArMDAwMGAKKyogYDIwMTEtMDItMDMgMDQ6MDU6MDAuMDAwKzAwMDBgCisqIGAyMDExLTAyLTAzVDA0OjA1KzAwMDBgCisqIGAyMDExLTAyLTAzVDA0OjA1OjAwKzAwMDBgCisqIGAyMDExLTAyLTAzVDA0OjA1OjAwLjAwMCswMDAwYAorCitUaGUgYCswMDAwYCBhYm92ZSBpcyBhbiBSRkMgODIyIDQtZGlnaXQgdGltZSB6b25lIHNwZWNpZmljYXRpb247IGArMDAwMGAKK3JlZmVycyB0byBHTVQuIFVTIFBhY2lmaWMgU3RhbmRhcmQgVGltZSBpcyBgLTA4MDBgLiBUaGUgdGltZSB6b25lIG1heSBiZQorb21pdHRlZCBpZiBkZXNpcmVk4oCUIHRoZSBkYXRlIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYmVpbmcgaW4gdGhlIHRpbWUKK3pvbmUgdW5kZXIgd2hpY2ggdGhlIGNvb3JkaW5hdGluZyBDYXNzYW5kcmEgbm9kZSBpcyBjb25maWd1cmVkLgorCisqIGAyMDExLTAyLTAzIDA0OjA1YAorKiBgMjAxMS0wMi0wMyAwNDowNTowMGAKKyogYDIwMTEtMDItMDMgMDQ6MDU6MDAuMDAwYAorKiBgMjAxMS0wMi0wM1QwNDowNWAKKyogYDIwMTEtMDItMDNUMDQ6MDU6MDBgCisqIGAyMDExLTAyLTAzVDA0OjA1OjAwLjAwMGAKKworVGhlcmUgYXJlIGNsZWFyIGRpZmZpY3VsdGllcyBpbmhlcmVudCBpbiByZWx5aW5nIG9uIHRoZSB0aW1lIHpvbmUKK2NvbmZpZ3VyYXRpb24gYmVpbmcgYXMgZXhwZWN0ZWQsIHRob3VnaCwgc28gaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUKK3RpbWUgem9uZSBhbHdheXMgYmUgc3BlY2lmaWVkIGZvciB0aW1lc3RhbXBzIHdoZW4gZmVhc2libGUuCisKK1RoZSB0aW1lIG9mIGRheSBtYXkgYWxzbyBiZSBvbWl0dGVkLCBpZiB0aGUgZGF0ZSBpcyB0aGUgb25seSBwaWVjZSB0aGF0CittYXR0ZXJzOgorCisqIGAyMDExLTAyLTAzYAorKiBgMjAxMS0wMi0wMyswMDAwYAorCitJbiB0aGF0IGNhc2UsIHRoZSB0aW1lIG9mIGRheSB3aWxsIGRlZmF1bHQgdG8gMDA6MDA6MDAsIGluIHRoZSBzcGVjaWZpZWQKK29yIGRlZmF1bHQgdGltZSB6b25lLgorCitbW3VzaW5nZGF0ZXNdXQorPT09PSBXb3JraW5nIHdpdGggZGF0ZXMKKworVmFsdWVzIG9mIHRoZSBgZGF0ZWAgdHlwZSBhcmUgZW5jb2RlZCBhcyAzMi1iaXQgdW5zaWduZWQgaW50ZWdlcnMKK3JlcHJlc2VudGluZyBhIG51bWJlciBvZiBkYXlzIHdpdGggYGB0aGUgZXBvY2gnJyBhdCB0aGUgY2VudGVyIG9mIHRoZQorcmFuZ2UgKDJeMzEpLiBFcG9jaCBpcyBKYW51YXJ5IDFzdCwgMTk3MAorCitBIGRhdGUgY2FuIGJlIGlucHV0IGluIENRTCBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyIGFzIGRlZmluZWQgYWJvdmUuCisKK1RoZXkgY2FuIGFsc28gYmUgaW5wdXQgYXMgc3RyaW5nIGxpdGVyYWxzIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorCisqIGAyMDE0LTAxLTAxYAorCitbW3VzaW5ndGltZV1dCis9PT09IFdvcmtpbmcgd2l0aCB0aW1lCisKK1ZhbHVlcyBvZiB0aGUgYHRpbWVgIHR5cGUgYXJlIGVuY29kZWQgYXMgNjQtYml0IHNpZ25lZCBpbnRlZ2VycworcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgbmFub3NlY29uZHMgc2luY2UgbWlkbmlnaHQuCisKK0EgdGltZSBjYW4gYmUgaW5wdXQgaW4gQ1FMIGFzIHNpbXBsZSBsb25nIGludGVnZXJzLCBnaXZpbmcgdGhlIG51bWJlciBvZgorbmFub3NlY29uZHMgc2luY2UgbWlkbmlnaHQuCisKK1RoZXkgY2FuIGFsc28gYmUgaW5wdXQgYXMgc3RyaW5nIGxpdGVyYWxzIGluIGFueSBvZiB0aGUgZm9sbG93aW5nCitmb3JtYXRzOgorCisqIGAwODoxMjo1NGAKKyogYDA4OjEyOjU0LjEyM2AKKyogYDA4OjEyOjU0LjEyMzQ1NmAKKyogYDA4OjEyOjU0LjEyMzQ1Njc4OWAKKworPT09PSBDb3VudGVycworCitUaGUgYGNvdW50ZXJgIHR5cGUgaXMgdXNlZCB0byBkZWZpbmUgX2NvdW50ZXIgY29sdW1uc18uIEEgY291bnRlciBjb2x1bW4KK2lzIGEgY29sdW1uIHdob3NlIHZhbHVlIGlzIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIGFuZCBvbiB3aGljaCAyCitvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQ6IGluY3JlbWVudGF0aW9uIGFuZCBkZWNyZW1lbnRhdGlvbiAoc2VlCitsaW5rOiN1cGRhdGVTdG10W2BVUERBVEVgXSBmb3Igc3ludGF4KS4gTm90ZSB0aGUgdmFsdWUgb2YgYSBjb3VudGVyCitjYW5ub3QgYmUgc2V0LiBBIGNvdW50ZXIgZG9lc27igJl0IGV4aXN0IHVudGlsIGZpcnN0CitpbmNyZW1lbnRlZC9kZWNyZW1lbnRlZCwgYW5kIHRoZSBmaXJzdCBpbmNyZW1lbnRhdGlvbi9kZWNyZW1lbnRhdGlvbiBpcworbWFkZSBhcyBpZiB0aGUgcHJldmlvdXMgdmFsdWUgd2FzIDAuIERlbGV0aW9uIG9mIGNvdW50ZXIgY29sdW1ucyBpcworc3VwcG9ydGVkIGJ1dCBoYXZlIHNvbWUgbGltaXRhdGlvbnMgKHNlZSB0aGUKK2h0dHA6Ly93aWtpLmFwYWNoZS5vcmcvY2Fzc2FuZHJhL0NvdW50ZXJzW0Nhc3NhbmRyYSBXaWtpXSBmb3IgbW9yZQoraW5mb3JtYXRpb24pLgorCitUaGUgdXNlIG9mIHRoZSBjb3VudGVyIHR5cGUgaXMgbGltaXRlZCBpbiB0aGUgZm9sbG93aW5nIHdheToKKworKiBJdCBjYW5ub3QgYmUgdXNlZCBmb3IgY29sdW1uIHRoYXQgaXMgcGFydCBvZiB0aGUgYFBSSU1BUlkgS0VZYCBvZiBhCit0YWJsZS4KKyogQSB0YWJsZSB0aGF0IGNvbnRhaW5zIGEgY291bnRlciBjYW4gb25seSBjb250YWluIGNvdW50ZXJzLiBJbiBvdGhlcgord29yZHMsIGVpdGhlciBhbGwgdGhlIGNvbHVtbnMgb2YgYSB0YWJsZSBvdXRzaWRlIHRoZSBgUFJJTUFSWSBLRVlgIGhhdmUKK3RoZSBjb3VudGVyIHR5cGUsIG9yIG5vbmUgb2YgdGhlbSBoYXZlIGl0LgorCitbW2NvbGxlY3Rpb25zXV0KKz09PT0gV29ya2luZyB3aXRoIGNvbGxlY3Rpb25zCisKKz09PT09IE5vdGV3b3J0aHkgY2hhcmFjdGVyaXN0aWNzCisKK0NvbGxlY3Rpb25zIGFyZSBtZWFudCBmb3Igc3RvcmluZy9kZW5vcm1hbGl6aW5nIHJlbGF0aXZlbHkgc21hbGwgYW1vdW50CitvZiBkYXRhLiBUaGV5IHdvcmsgd2VsbCBmb3IgdGhpbmdzIGxpa2UgYGB0aGUgcGhvbmUgbnVtYmVycyBvZiBhIGdpdmVuCit1c2VyJycsIGBgbGFiZWxzIGFwcGxpZWQgdG8gYW4gZW1haWwnJywgZXRjLiBCdXQgd2hlbiBpdGVtcyBhcmUgZXhwZWN0ZWQKK3RvIGdyb3cgdW5ib3VuZGVkIChgYGFsbCB0aGUgbWVzc2FnZXMgc2VudCBieSBhIGdpdmVuIHVzZXInJywgYGBldmVudHMKK3JlZ2lzdGVyZWQgYnkgYSBzZW5zb3InJywg4oCmKSwgdGhlbiBjb2xsZWN0aW9ucyBhcmUgbm90IGFwcHJvcHJpYXRlCithbnltb3JlIGFuZCBhIHNwZWNpZmljIHRhYmxlICh3aXRoIGNsdXN0ZXJpbmcgY29sdW1ucykgc2hvdWxkIGJlIHVzZWQuCitDb25jcmV0ZWx5LCBjb2xsZWN0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnM6CisKKyogQ29sbGVjdGlvbnMgYXJlIGFsd2F5cyByZWFkIGluIHRoZWlyIGVudGlyZXR5IChhbmQgcmVhZGluZyBvbmUgaXMgbm90CitwYWdlZCBpbnRlcm5hbGx5KS4KKyogQ29sbGVjdGlvbnMgY2Fubm90IGhhdmUgbW9yZSB0aGFuIDY1NTM1IGVsZW1lbnRzLiBNb3JlIHByZWNpc2VseSwKK3doaWxlIGl0IG1heSBiZSBwb3NzaWJsZSB0byBpbnNlcnQgbW9yZSB0aGFuIDY1NTM1IGVsZW1lbnRzLCBpdCBpcyBub3QKK3Bvc3NpYmxlIHRvIHJlYWQgbW9yZSB0aGFuIHRoZSA2NTUzNSBmaXJzdCBlbGVtZW50cyAoc2VlCitodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS01NDI4W0NBU1NBTkRSQS01NDI4XSBmb3IKK2RldGFpbHMpLgorKiBXaGlsZSBpbnNlcnRpb24gb3BlcmF0aW9ucyBvbiBzZXRzIGFuZCBtYXBzIG5ldmVyIGluY3VyIGEKK3JlYWQtYmVmb3JlLXdyaXRlIGludGVybmFsbHksIHNvbWUgb3BlcmF0aW9ucyBvbiBsaXN0cyBkbyAoc2VlIHRoZQorc2VjdGlvbiBvbiBsaXN0cyBiZWxvdyBmb3IgZGV0YWlscykuIEl0IGlzIHRodXMgYWR2aXNlZCB0byBwcmVmZXIgc2V0cworb3ZlciBsaXN0cyB3aGVuIHBvc3NpYmxlLgorCitQbGVhc2Ugbm90ZSB0aGF0IHdoaWxlIHNvbWUgb2YgdGhvc2UgbGltaXRhdGlvbnMgbWF5IG9yIG1heSBub3QgYmUKK2xvb3NlbiBpbiB0aGUgZnV0dXJlLCB0aGUgZ2VuZXJhbCBydWxlIHRoYXQgY29sbGVjdGlvbnMgYXJlIGZvcgorZGVub3JtYWxpemluZyBzbWFsbCBhbW91bnQgb2YgZGF0YSBpcyBtZWFudCB0byBzdGF5LgorCitbW21hcF1dCis9PT09PSBNYXBzCisKK0EgYG1hcGAgaXMgYSBsaW5rOiN0eXBlc1t0eXBlZF0gc2V0IG9mIGtleS12YWx1ZSBwYWlycywgd2hlcmUga2V5cyBhcmUKK3VuaXF1ZS4gRnVydGhlcm1vcmUsIG5vdGUgdGhhdCB0aGUgbWFwIGFyZSBpbnRlcm5hbGx5IHNvcnRlZCBieSB0aGVpcgora2V5cyBhbmQgd2lsbCB0aHVzIGFsd2F5cyBiZSByZXR1cm5lZCBpbiB0aGF0IG9yZGVyLiBUbyBjcmVhdGUgYSBjb2x1bW4KK29mIHR5cGUgYG1hcGAsIHVzZSB0aGUgYG1hcGAga2V5d29yZCBzdWZmaXhlZCB3aXRoIGNvbW1hLXNlcGFyYXRlZCBrZXkKK2FuZCB2YWx1ZSB0eXBlcywgZW5jbG9zZWQgaW4gYW5nbGUgYnJhY2tldHMuIEZvciBleGFtcGxlOgorCitiYyhzYW1wbGUpLiArCitDUkVBVEUgVEFCTEUgdXNlcnMgKCArCitpZCB0ZXh0IFBSSU1BUlkgS0VZLCArCitnaXZlbiB0ZXh0LCArCitzdXJuYW1lIHRleHQsICsKK2ZhdnMgbWFwPHRleHQsIHRleHQ+IC8vIEEgbWFwIG9mIHRleHQga2V5cywgYW5kIHRleHQgdmFsdWVzICsKKykKKworV3JpdGluZyBgbWFwYCBkYXRhIGlzIGFjY29tcGxpc2hlZCB3aXRoIGEgSlNPTi1pbnNwaXJlZCBzeW50YXguIFRvIHdyaXRlCithIHJlY29yZCB1c2luZyBgSU5TRVJUYCwgc3BlY2lmeSB0aGUgZW50aXJlIG1hcCBhcyBhIEpTT04tc3R5bGUKK2Fzc29jaWF0aXZlIGFycmF5LiBfTm90ZTogVGhpcyBmb3JtIHdpbGwgYWx3YXlzIHJlcGxhY2UgdGhlIGVudGlyZSBtYXAuXworCitiYyhzYW1wbGUpLiArCisvLyBJbnNlcnRpbmcgKG9yIFVwZGF0aW5nKSArCitJTlNFUlQgSU5UTyB1c2VycyAoaWQsIGdpdmVuLCBzdXJuYW1lLCBmYXZzKSArCitWQUxVRVMgKGBqc21pdGgnLCBgSm9obicsIGBTbWl0aCcsIFx7IGBmcnVpdCcgOiBgYXBwbGUnLCBgYmFuZCcgOgorYEJlYXRsZXMnIH0pCisKK0FkZGluZyBvciB1cGRhdGluZyBrZXktdmFsdWVzIG9mIGEgKHBvdGVudGlhbGx5KSBleGlzdGluZyBtYXAgY2FuIGJlCithY2NvbXBsaXNoZWQgZWl0aGVyIGJ5IHN1YnNjcmlwdGluZyB0aGUgbWFwIGNvbHVtbiBpbiBhbiBgVVBEQVRFYAorc3RhdGVtZW50IG9yIGJ5IGFkZGluZyBhIG5ldyBtYXAgbGl0ZXJhbDoKKworYmMoc2FtcGxlKS4gKworLy8gVXBkYXRpbmcgKG9yIGluc2VydGluZykgKworVVBEQVRFIHVzZXJzIFNFVCBmYXZzW2BhdXRob3InXSA9IGBFZCBQb2UnIFdIRVJFIGlkID0gYGpzbWl0aCcgKworVVBEQVRFIHVzZXJzIFNFVCBmYXZzID0gZmF2cyArIFx7IGBtb3ZpZScgOiBgQ2Fzc2FibGFuY2EnIH0gV0hFUkUgaWQgPQorYGpzbWl0aCcKKworTm90ZSB0aGF0IFRUTHMgYXJlIGFsbG93ZWQgZm9yIGJvdGggYElOU0VSVGAgYW5kIGBVUERBVEVgLCBidXQgaW4gYm90aAorY2FzZSB0aGUgVFRMIHNldCBvbmx5IGFwcGx5IHRvIHRoZSBuZXdseSBpbnNlcnRlZC91cGRhdGVkIF92YWx1ZXNfLiBJbgorb3RoZXIgd29yZHMsCisKK2JjKHNhbXBsZSkuICsKKy8vIFVwZGF0aW5nIChvciBpbnNlcnRpbmcpICsKK1VQREFURSB1c2VycyBVU0lORyBUVEwgMTAgU0VUIGZhdnNbYGNvbG9yJ10gPSBgZ3JlZW4nIFdIRVJFIGlkID0KK2Bqc21pdGgnCisKK3dpbGwgb25seSBhcHBseSB0aGUgVFRMIHRvIHRoZSBgeyAnY29sb3InIDogJ2dyZWVuJyB9YCByZWNvcmQsIHRoZSByZXN0CitvZiB0aGUgbWFwIHJlbWFpbmluZyB1bmFmZmVjdGVkLgorCitEZWxldGluZyBhIG1hcCByZWNvcmQgaXMgZG9uZSB3aXRoOgorCitiYyhzYW1wbGUpLiArCitERUxFVEUgZmF2c1tgYXV0aG9yJ10gRlJPTSB1c2VycyBXSEVSRSBpZCA9IGBqc21pdGgnCisKK1tbc2V0XV0KKz09PT09IFNldHMKKworQSBgc2V0YCBpcyBhIGxpbms6I3R5cGVzW3R5cGVkXSBjb2xsZWN0aW9uIG9mIHVuaXF1ZSB2YWx1ZXMuIFNldHMgYXJlCitvcmRlcmVkIGJ5IHRoZWlyIHZhbHVlcy4gVG8gY3JlYXRlIGEgY29sdW1uIG9mIHR5cGUgYHNldGAsIHVzZSB0aGUgYHNldGAKK2tleXdvcmQgc3VmZml4ZWQgd2l0aCB0aGUgdmFsdWUgdHlwZSBlbmNsb3NlZCBpbiBhbmdsZSBicmFja2V0cy4gRm9yCitleGFtcGxlOgorCitiYyhzYW1wbGUpLiArCitDUkVBVEUgVEFCTEUgaW1hZ2VzICggKworbmFtZSB0ZXh0IFBSSU1BUlkgS0VZLCArCitvd25lciB0ZXh0LCArCitkYXRlIHRpbWVzdGFtcCwgKwordGFncyBzZXQgKworKTsKKworV3JpdGluZyBhIGBzZXRgIGlzIGFjY29tcGxpc2hlZCBieSBjb21tYSBzZXBhcmF0aW5nIHRoZSBzZXQgdmFsdWVzLCBhbmQKK2VuY2xvc2luZyB0aGVtIGluIGN1cmx5IGJyYWNlcy4gX05vdGU6IEFuIGBJTlNFUlRgIHdpbGwgYWx3YXlzIHJlcGxhY2UKK3RoZSBlbnRpcmUgc2V0Ll8KKworYmMoc2FtcGxlKS4gKworSU5TRVJUIElOVE8gaW1hZ2VzIChuYW1lLCBvd25lciwgZGF0ZSwgdGFncykgKworVkFMVUVTIChgY2F0LmpwZycsIGBqc21pdGgnLCBgbm93JywgXHsgYGtpdHRlbicsIGBjYXQnLCBgcGV0JyB9KTsKKworQWRkaW5nIGFuZCByZW1vdmluZyB2YWx1ZXMgb2YgYSBzZXQgY2FuIGJlIGFjY29tcGxpc2hlZCB3aXRoIGFuIGBVUERBVEVgCitieSBhZGRpbmcvcmVtb3ZpbmcgbmV3IHNldCB2YWx1ZXMgdG8gYW4gZXhpc3RpbmcgYHNldGAgY29sdW1uLgorCitiYyhzYW1wbGUpLiArCitVUERBVEUgaW1hZ2VzIFNFVCB0YWdzID0gdGFncyArIFx7IGBjdXRlJywgYGN1ZGRseScgfSBXSEVSRSBuYW1lID0KK2BjYXQuanBnJzsgKworVVBEQVRFIGltYWdlcyBTRVQgdGFncyA9IHRhZ3MgLSBceyBgbGFtZScgfSBXSEVSRSBuYW1lID0gYGNhdC5qcGcnOworCitBcyB3aXRoIGxpbms6I21hcFttYXBzXSwgVFRMcyBpZiB1c2VkIG9ubHkgYXBwbHkgdG8gdGhlIG5ld2x5CitpbnNlcnRlZC91cGRhdGVkIF92YWx1ZXNfLgorCitbW2xpc3RdXQorPT09PT0gTGlzdHMKKworQSBgbGlzdGAgaXMgYSBsaW5rOiN0eXBlc1t0eXBlZF0gY29sbGVjdGlvbiBvZiBub24tdW5pcXVlIHZhbHVlcyB3aGVyZQorZWxlbWVudHMgYXJlIG9yZGVyZWQgYnkgdGhlcmUgcG9zaXRpb24gaW4gdGhlIGxpc3QuIFRvIGNyZWF0ZSBhIGNvbHVtbgorb2YgdHlwZSBgbGlzdGAsIHVzZSB0aGUgYGxpc3RgIGtleXdvcmQgc3VmZml4ZWQgd2l0aCB0aGUgdmFsdWUgdHlwZQorZW5jbG9zZWQgaW4gYW5nbGUgYnJhY2tldHMuIEZvciBleGFtcGxlOgorCitiYyhzYW1wbGUpLiArCitDUkVBVEUgVEFCTEUgcGxheXMgKCArCitpZCB0ZXh0IFBSSU1BUlkgS0VZLCArCitnYW1lIHRleHQsICsKK3BsYXllcnMgaW50LCArCitzY29yZXMgbGlzdCArCispCisKK0RvIG5vdGUgdGhhdCBhcyBleHBsYWluZWQgYmVsb3csIGxpc3RzIGhhdmUgc29tZSBsaW1pdGF0aW9ucyBhbmQKK3BlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zIHRvIHRha2UgaW50byBhY2NvdW50LCBhbmQgaXQgaXMgYWR2aXNlZCB0bworcHJlZmVyIGxpbms6I3NldFtzZXRzXSBvdmVyIGxpc3RzIHdoZW4gdGhpcyBpcyBwb3NzaWJsZS4KKworV3JpdGluZyBgbGlzdGAgZGF0YSBpcyBhY2NvbXBsaXNoZWQgd2l0aCBhIEpTT04tc3R5bGUgc3ludGF4LiBUbyB3cml0ZSBhCityZWNvcmQgdXNpbmcgYElOU0VSVGAsIHNwZWNpZnkgdGhlIGVudGlyZSBsaXN0IGFzIGEgSlNPTiBhcnJheS4gX05vdGU6CitBbiBgSU5TRVJUYCB3aWxsIGFsd2F5cyByZXBsYWNlIHRoZSBlbnRpcmUgbGlzdC5fCisKK2JjKHNhbXBsZSkuICsKK0lOU0VSVCBJTlRPIHBsYXlzIChpZCwgZ2FtZSwgcGxheWVycywgc2NvcmVzKSArCitWQUxVRVMgKGAxMjMtYWZkZScsIGBxdWFrZScsIDMsIFsxNywgNCwgMl0pOworCitBZGRpbmcgKGFwcGVuZGluZyBvciBwcmVwZW5kaW5nKSB2YWx1ZXMgdG8gYSBsaXN0IGNhbiBiZSBhY2NvbXBsaXNoZWQgYnkKK2FkZGluZyBhIG5ldyBKU09OLXN0eWxlIGFycmF5IHRvIGFuIGV4aXN0aW5nIGBsaXN0YCBjb2x1bW4uCisKK2JjKHNhbXBsZSkuICsKK1VQREFURSBwbGF5cyBTRVQgcGxheWVycyA9IDUsIHNjb3JlcyA9IHNjb3JlcyArIFsgMTQsIDIxIF0gV0hFUkUgaWQgPQorYDEyMy1hZmRlJzsgKworVVBEQVRFIHBsYXlzIFNFVCBwbGF5ZXJzID0gNSwgc2NvcmVzID0gWyAxMiBdICsgc2NvcmVzIFdIRVJFIGlkID0KK2AxMjMtYWZkZSc7CisKK0l0IHNob3VsZCBiZSBub3RlZCB0aGF0IGFwcGVuZCBhbmQgcHJlcGVuZCBhcmUgbm90IGlkZW1wb3RlbnQKK29wZXJhdGlvbnMuIFRoaXMgbWVhbnMgdGhhdCBpZiBkdXJpbmcgYW4gYXBwZW5kIG9yIGEgcHJlcGVuZCB0aGUKK29wZXJhdGlvbiB0aW1lb3V0LCBpdCBpcyBub3QgYWx3YXlzIHNhZmUgdG8gcmV0cnkgdGhlIG9wZXJhdGlvbiAoYXMgdGhpcworY291bGQgcmVzdWx0IGluIHRoZSByZWNvcmQgYXBwZW5kZWQgb3IgcHJlcGVuZGVkIHR3aWNlKS4KKworTGlzdHMgYWxzbyBwcm92aWRlcyB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbjogc2V0dGluZyBhbiBlbGVtZW50IGJ5IGl0cworcG9zaXRpb24gaW4gdGhlIGxpc3QsIHJlbW92aW5nIGFuIGVsZW1lbnQgYnkgaXRzIHBvc2l0aW9uIGluIHRoZSBsaXN0CithbmQgcmVtb3ZlIGFsbCB0aGUgb2NjdXJyZW5jZSBvZiBhIGdpdmVuIHZhbHVlIGluIHRoZSBsaXN0LiBfSG93ZXZlciwKK2FuZCBjb250cmFyaWx5IHRvIGFsbCB0aGUgb3RoZXIgY29sbGVjdGlvbiBvcGVyYXRpb25zLCB0aGVzZSB0aHJlZQorb3BlcmF0aW9ucyBpbmR1Y2UgYW4gaW50ZXJuYWwgcmVhZCBiZWZvcmUgdGhlIHVwZGF0ZSwgYW5kIHdpbGwgdGh1cwordHlwaWNhbGx5IGhhdmUgc2xvd2VyIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljc18uIFRob3NlIG9wZXJhdGlvbnMKK2hhdmUgdGhlIGZvbGxvd2luZyBzeW50YXg6CisKK2JjKHNhbXBsZSkuICsKK1VQREFURSBwbGF5cyBTRVQgc2NvcmVzWzFdID0gNyBXSEVSRSBpZCA9IGAxMjMtYWZkZSc7IC8vIHNldHMgdGhlIDJuZAorZWxlbWVudCBvZiBzY29yZXMgdG8gNyAocmFpc2VzIGFuIGVycm9yIGlzIHNjb3JlcyBoYXMgbGVzcyB0aGFuIDIKK2VsZW1lbnRzKSArCitERUxFVEUgc2NvcmVzWzFdIEZST00gcGxheXMgV0hFUkUgaWQgPSBgMTIzLWFmZGUnOyAvLyBkZWxldGVzIHRoZSAybmQKK2VsZW1lbnQgb2Ygc2NvcmVzIChyYWlzZXMgYW4gZXJyb3IgaXMgc2NvcmVzIGhhcyBsZXNzIHRoYW4gMiBlbGVtZW50cykgKworVVBEQVRFIHBsYXlzIFNFVCBzY29yZXMgPSBzY29yZXMgLSBbIDEyLCAyMSBdIFdIRVJFIGlkID0gYDEyMy1hZmRlJzsgLy8KK3JlbW92ZXMgYWxsIG9jY3VycmVuY2VzIG9mIDEyIGFuZCAyMSBmcm9tIHNjb3JlcworCitBcyB3aXRoIGxpbms6I21hcFttYXBzXSwgVFRMcyBpZiB1c2VkIG9ubHkgYXBwbHkgdG8gdGhlIG5ld2x5CitpbnNlcnRlZC91cGRhdGVkIF92YWx1ZXNfLgorCis9PT0gRnVuY3Rpb25zCisKK0NRTDMgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGJ1aWx0LWluIGZ1bmN0aW9ucyAoc28gY2FsbGVkIGBuYXRpdmUKK2Z1bmN0aW9ucycpIGFuZCBsaW5rOiN1ZGZzW3VzZXItZGVmaW5lZCBmdW5jdGlvbnNdLiBDUUwzIGluY2x1ZGVzCitzZXZlcmFsIG5hdGl2ZSBmdW5jdGlvbnMsIGRlc2NyaWJlZCBiZWxvdzoKKworW1tjYXN0RnVuXV0KKz09PT0gQ2FzdAorCitUaGUgYGNhc3RgIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnRzIG9uZSBuYXRpdmUgZGF0YXR5cGUgdG8KK2Fub3RoZXIuCisKK1RoZSBmb2xsb3dpbmcgdGFibGUgZGVzY3JpYmVzIHRoZSBjb252ZXJzaW9ucyBzdXBwb3J0ZWQgYnkgdGhlIGBjYXN0YAorZnVuY3Rpb24uIENhc3NhbmRyYSB3aWxsIHNpbGVudGx5IGlnbm9yZSBhbnkgY2FzdCBjb252ZXJ0aW5nIGEgZGF0YXR5cGUKK2ludG8gaXRzIG93biBkYXRhdHlwZS4KKworW2NvbHM9IiwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfGZyb20gfHRvCit8YGFzY2lpYCB8YHRleHRgLCBgdmFyY2hhcmAKKworfGBiaWdpbnRgIHxgdGlueWludGAsIGBzbWFsbGludGAsIGBpbnRgLCBgZmxvYXRgLCBgZG91YmxlYCwgYGRlY2ltYWxgLAorYHZhcmludGAsIGB0ZXh0YCwgYHZhcmNoYXJgCisKK3xgYm9vbGVhbmAgfGB0ZXh0YCwgYHZhcmNoYXJgCisKK3xgY291bnRlcmAgfGB0aW55aW50YCwgYHNtYWxsaW50YCwgYGludGAsIGBiaWdpbnRgLCBgZmxvYXRgLCBgZG91YmxlYCwKK2BkZWNpbWFsYCwgYHZhcmludGAsIGB0ZXh0YCwgYHZhcmNoYXJgCisKK3xgZGF0ZWAgfGB0aW1lc3RhbXBgCisKK3xgZGVjaW1hbGAgfGB0aW55aW50YCwgYHNtYWxsaW50YCwgYGludGAsIGBiaWdpbnRgLCBgZmxvYXRgLCBgZG91YmxlYCwKK2B2YXJpbnRgLCBgdGV4dGAsIGB2YXJjaGFyYAorCit8YGRvdWJsZWAgfGB0aW55aW50YCwgYHNtYWxsaW50YCwgYGludGAsIGBiaWdpbnRgLCBgZmxvYXRgLCBgZGVjaW1hbGAsCitgdmFyaW50YCwgYHRleHRgLCBgdmFyY2hhcmAKKworfGBmbG9hdGAgfGB0aW55aW50YCwgYHNtYWxsaW50YCwgYGludGAsIGBiaWdpbnRgLCBgZG91YmxlYCwgYGRlY2ltYWxgLAorYHZhcmludGAsIGB0ZXh0YCwgYHZhcmNoYXJgCisKK3xgaW5ldGAgfGB0ZXh0YCwgYHZhcmNoYXJgCisKK3xgaW50YCB8YHRpbnlpbnRgLCBgc21hbGxpbnRgLCBgYmlnaW50YCwgYGZsb2F0YCwgYGRvdWJsZWAsIGBkZWNpbWFsYCwKK2B2YXJpbnRgLCBgdGV4dGAsIGB2YXJjaGFyYAorCit8YHNtYWxsaW50YCB8YHRpbnlpbnRgLCBgaW50YCwgYGJpZ2ludGAsIGBmbG9hdGAsIGBkb3VibGVgLCBgZGVjaW1hbGAsCitgdmFyaW50YCwgYHRleHRgLCBgdmFyY2hhcmAKKworfGB0aW1lYCB8YHRleHRgLCBgdmFyY2hhcmAKKworfGB0aW1lc3RhbXBgIHxgZGF0ZWAsIGB0ZXh0YCwgYHZhcmNoYXJgCisKK3xgdGltZXV1aWRgIHxgdGltZXN0YW1wYCwgYGRhdGVgLCBgdGV4dGAsIGB2YXJjaGFyYAorCit8YHRpbnlpbnRgIHxgdGlueWludGAsIGBzbWFsbGludGAsIGBpbnRgLCBgYmlnaW50YCwgYGZsb2F0YCwgYGRvdWJsZWAsCitgZGVjaW1hbGAsIGB2YXJpbnRgLCBgdGV4dGAsIGB2YXJjaGFyYAorCit8YHV1aWRgIHxgdGV4dGAsIGB2YXJjaGFyYAorCit8YHZhcmludGAgfGB0aW55aW50YCwgYHNtYWxsaW50YCwgYGludGAsIGBiaWdpbnRgLCBgZmxvYXRgLCBgZG91YmxlYCwKK2BkZWNpbWFsYCwgYHRleHRgLCBgdmFyY2hhcmAKK3w9PT0KKworVGhlIGNvbnZlcnNpb25zIHJlbHkgc3RyaWN0bHkgb24gSmF2YeKAmXMgc2VtYW50aWNzLiBGb3IgZXhhbXBsZSwgdGhlCitkb3VibGUgdmFsdWUgMSB3aWxsIGJlIGNvbnZlcnRlZCB0byB0aGUgdGV4dCB2YWx1ZSBgMS4wJy4KKworYmMoc2FtcGxlKS4gKworU0VMRUNUIGF2ZyhjYXN0KGNvdW50IGFzIGRvdWJsZSkpIEZST00gbXlUYWJsZQorCitbW3Rva2VuRnVuXV0KKz09PT0gVG9rZW4KKworVGhlIGB0b2tlbmAgZnVuY3Rpb24gYWxsb3dzIHRvIGNvbXB1dGUgdGhlIHRva2VuIGZvciBhIGdpdmVuIHBhcnRpdGlvbgora2V5LiBUaGUgZXhhY3Qgc2lnbmF0dXJlIG9mIHRoZSB0b2tlbiBmdW5jdGlvbiBkZXBlbmRzIG9uIHRoZSB0YWJsZQorY29uY2VybmVkIGFuZCBvZiB0aGUgcGFydGl0aW9uZXIgdXNlZCBieSB0aGUgY2x1c3Rlci4KKworVGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50cyBvZiB0aGUgYHRva2VuYCBkZXBlbmQgb24gdGhlIHR5cGUgb2YgdGhlCitwYXJ0aXRpb24ga2V5IGNvbHVtbnMuIFRoZSByZXR1cm4gdHlwZSBkZXBlbmQgb24gdGhlIHBhcnRpdGlvbmVyIGluIHVzZToKKworKiBGb3IgTXVybXVyM1BhcnRpdGlvbmVyLCB0aGUgcmV0dXJuIHR5cGUgaXMgYGJpZ2ludGAuCisqIEZvciBSYW5kb21QYXJ0aXRpb25lciwgdGhlIHJldHVybiB0eXBlIGlzIGB2YXJpbnRgLgorKiBGb3IgQnl0ZU9yZGVyZWRQYXJ0aXRpb25lciwgdGhlIHJldHVybiB0eXBlIGlzIGBibG9iYC4KKworRm9yIGluc3RhbmNlLCBpbiBhIGNsdXN0ZXIgdXNpbmcgdGhlIGRlZmF1bHQgTXVybXVyM1BhcnRpdGlvbmVyLCBpZiBhCit0YWJsZSBpcyBkZWZpbmVkIGJ5CisKK2JjKHNhbXBsZSkuICsKK0NSRUFURSBUQUJMRSB1c2VycyAoICsKK3VzZXJpZCB0ZXh0IFBSSU1BUlkgS0VZLCArCit1c2VybmFtZSB0ZXh0LCArCivigKYgKworKQorCit0aGVuIHRoZSBgdG9rZW5gIGZ1bmN0aW9uIHdpbGwgdGFrZSBhIHNpbmdsZSBhcmd1bWVudCBvZiB0eXBlIGB0ZXh0YCAoaW4KK3RoYXQgY2FzZSwgdGhlIHBhcnRpdGlvbiBrZXkgaXMgYHVzZXJpZGAgKHRoZXJlIGlzIG5vIGNsdXN0ZXJpbmcgY29sdW1ucworc28gdGhlIHBhcnRpdGlvbiBrZXkgaXMgdGhlIHNhbWUgdGhhbiB0aGUgcHJpbWFyeSBrZXkpKSwgYW5kIHRoZSByZXR1cm4KK3R5cGUgd2lsbCBiZSBgYmlnaW50YC4KKworW1t1dWlkRnVuXV0KKz09PT0gVXVpZAorCitUaGUgYHV1aWRgIGZ1bmN0aW9uIHRha2VzIG5vIHBhcmFtZXRlcnMgYW5kIGdlbmVyYXRlcyBhIHJhbmRvbSB0eXBlIDQKK3V1aWQgc3VpdGFibGUgZm9yIHVzZSBpbiBJTlNFUlQgb3IgU0VUIHN0YXRlbWVudHMuCisKK1tbdGltZXV1aWRGdW5dXQorPT09PSBUaW1ldXVpZCBmdW5jdGlvbnMKKworPT09PT0gYG5vd2AKKworVGhlIGBub3dgIGZ1bmN0aW9uIHRha2VzIG5vIGFyZ3VtZW50cyBhbmQgZ2VuZXJhdGVzLCBvbiB0aGUgY29vcmRpbmF0b3IKK25vZGUsIGEgbmV3IHVuaXF1ZSB0aW1ldXVpZCAoYXQgdGhlIHRpbWUgd2hlcmUgdGhlIHN0YXRlbWVudCB1c2luZyBpdCBpcworZXhlY3V0ZWQpLiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgdXNlZnVsIGZvciBpbnNlcnRpb24gYnV0IGlzIGxhcmdlbHkKK25vbi1zZW5zaWNhbCBpbiBgV0hFUkVgIGNsYXVzZXMuIEZvciBpbnN0YW5jZSwgYSBxdWVyeSBvZiB0aGUgZm9ybQorCitiYyhzYW1wbGUpLiArCitTRUxFQ1QgKiBGUk9NIG15VGFibGUgV0hFUkUgdCA9IG5vdygpCisKK3dpbGwgbmV2ZXIgcmV0dXJuIGFueSByZXN1bHQgYnkgZGVzaWduLCBzaW5jZSB0aGUgdmFsdWUgcmV0dXJuZWQgYnkKK2Bub3coKWAgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUuCisKKz09PT09IGBtaW5fdGltZXV1aWRgIGFuZCBgbWF4X3RpbWV1dWlkYAorCitUaGUgYG1pbl90aW1ldXVpZGAgKHJlc3AuIGBtYXhfdGltZXV1aWRgKSBmdW5jdGlvbiB0YWtlcyBhIGB0aW1lc3RhbXBgCit2YWx1ZSBgdGAgKHdoaWNoIGNhbiBiZSBsaW5rOiN1c2luZ3RpbWVzdGFtcHNbZWl0aGVyIGEgdGltZXN0YW1wIG9yIGEKK2RhdGUgc3RyaW5nXSApIGFuZCByZXR1cm4gYSBfZmFrZV8gYHRpbWV1dWlkYCBjb3JyZXNwb25kaW5nIHRvIHRoZQorX3NtYWxsZXN0XyAocmVzcC4gX2JpZ2dlc3RfKSBwb3NzaWJsZSBgdGltZXV1aWRgIGhhdmluZyBmb3IgdGltZXN0YW1wCitgdGAuIFNvIGZvciBpbnN0YW5jZToKKworYmMoc2FtcGxlKS4gKworU0VMRUNUICogRlJPTSBteVRhYmxlIFdIRVJFIHQgPiBtYXhfdGltZXV1aWQoYDIwMTMtMDEtMDEgMDA6MDUrMDAwMCcpIEFORAordCA8IG1pbl90aW1ldXVpZChgMjAxMy0wMi0wMiAxMDowMCswMDAwJykKKword2lsbCBzZWxlY3QgYWxsIHJvd3Mgd2hlcmUgdGhlIGB0aW1ldXVpZGAgY29sdW1uIGB0YCBpcyBzdHJpY3RseSBvbGRlcgordGhhbiBgMjAxMy0wMS0wMSAwMDowNSswMDAwJyBidXQgc3RyaWN0bHkgeW91bmdlciB0aGFuIGAyMDEzLTAyLTAyCisxMDowMCswMDAwJy4gUGxlYXNlIG5vdGUgdGhhdAorYHQgPj0gbWF4X3RpbWV1dWlkKCcyMDEzLTAxLTAxIDAwOjA1KzAwMDAnKWAgd291bGQgc3RpbGwgX25vdF8gc2VsZWN0IGEKK2B0aW1ldXVpZGAgZ2VuZXJhdGVkIGV4YWN0bHkgYXQgYDIwMTMtMDEtMDEgMDA6MDUrMDAwMCcgYW5kIGlzCitlc3NlbnRpYWxseSBlcXVpdmFsZW50IHRvIGB0ID4gbWF4X3RpbWV1dWlkKCcyMDEzLTAxLTAxIDAwOjA1KzAwMDAnKWAuCisKK19XYXJuaW5nXzogV2UgY2FsbGVkIHRoZSB2YWx1ZXMgZ2VuZXJhdGVkIGJ5IGBtaW5fdGltZXV1aWRgIGFuZAorYG1heF90aW1ldXVpZGAgX2Zha2VfIFVVSUQgYmVjYXVzZSB0aGV5IGRvIG5vIHJlc3BlY3QgdGhlIFRpbWUtQmFzZWQgVVVJRAorZ2VuZXJhdGlvbiBwcm9jZXNzIHNwZWNpZmllZCBieSB0aGUKK2h0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQxMjIudHh0W1JGQyA0MTIyXS4gSW4gcGFydGljdWxhciwgdGhlIHZhbHVlCityZXR1cm5lZCBieSB0aGVzZSAyIG1ldGhvZHMgd2lsbCBub3QgYmUgdW5pcXVlLiBUaGlzIG1lYW5zIHlvdSBzaG91bGQKK29ubHkgdXNlIHRob3NlIG1ldGhvZHMgZm9yIHF1ZXJ5aW5nIChhcyBpbiB0aGUgZXhhbXBsZSBhYm92ZSkuIEluc2VydGluZwordGhlIHJlc3VsdCBvZiB0aG9zZSBtZXRob2RzIGlzIGFsbW9zdCBjZXJ0YWlubHkgX2EgYmFkIGlkZWFfLgorCitbW3RpbWVGdW5dXQorPT09PSBUaW1lIGNvbnZlcnNpb24gZnVuY3Rpb25zCisKK0EgbnVtYmVyIG9mIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgdG8gYGBjb252ZXJ0JycgYSBgdGltZXV1aWRgLCBhCitgdGltZXN0YW1wYCBvciBhIGBkYXRlYCBpbnRvIGFub3RoZXIgYG5hdGl2ZWAgdHlwZS4KKworW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xmdW5jdGlvbiBuYW1lIHxpbnB1dCB0eXBlIHxkZXNjcmlwdGlvbgorfGB0b19kYXRlYCB8YHRpbWV1dWlkYCB8Q29udmVydHMgdGhlIGB0aW1ldXVpZGAgYXJndW1lbnQgaW50byBhIGBkYXRlYAordHlwZQorCit8YHRvX2RhdGVgIHxgdGltZXN0YW1wYCB8Q29udmVydHMgdGhlIGB0aW1lc3RhbXBgIGFyZ3VtZW50IGludG8gYSBgZGF0ZWAKK3R5cGUKKworfGB0b190aW1lc3RhbXBgIHxgdGltZXV1aWRgIHxDb252ZXJ0cyB0aGUgYHRpbWV1dWlkYCBhcmd1bWVudCBpbnRvIGEKK2B0aW1lc3RhbXBgIHR5cGUKKworfGB0b190aW1lc3RhbXBgIHxgZGF0ZWAgfENvbnZlcnRzIHRoZSBgZGF0ZWAgYXJndW1lbnQgaW50byBhIGB0aW1lc3RhbXBgCit0eXBlCisKK3xgdG9fdW5peF90aW1lc3RhbXBgIHxgdGltZXV1aWRgIHxDb252ZXJ0cyB0aGUgYHRpbWV1dWlkYCBhcmd1bWVudCBpbnRvIGEKK2BiaWdJbnRgIHJhdyB2YWx1ZQorCit8YHRvX3VuaXhfdGltZXN0YW1wYCB8YHRpbWVzdGFtcGAgfENvbnZlcnRzIHRoZSBgdGltZXN0YW1wYCBhcmd1bWVudCBpbnRvCithIGBiaWdJbnRgIHJhdyB2YWx1ZQorCit8YHRvX3VuaXhfdGltZXN0YW1wYCB8YGRhdGVgIHxDb252ZXJ0cyB0aGUgYGRhdGVgIGFyZ3VtZW50IGludG8gYSBgYmlnSW50YAorcmF3IHZhbHVlCit8PT09CisKK1tbYmxvYkZ1bl1dCis9PT09IEJsb2IgY29udmVyc2lvbiBmdW5jdGlvbnMKKworQSBudW1iZXIgb2YgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCB0byBgYGNvbnZlcnQnJyB0aGUgbmF0aXZlIHR5cGVzIGludG8KK2JpbmFyeSBkYXRhIChgYmxvYmApLiBGb3IgZXZlcnkgYDxuYXRpdmUtdHlwZT5gIGB0eXBlYCBzdXBwb3J0ZWQgYnkgQ1FMMworKGEgbm90YWJsZSBleGNlcHRpb25zIGlzIGBibG9iYCwgZm9yIG9idmlvdXMgcmVhc29ucyksIHRoZSBmdW5jdGlvbgorYHR5cGVfYXNfYmxvYmAgdGFrZXMgYSBhcmd1bWVudCBvZiB0eXBlIGB0eXBlYCBhbmQgcmV0dXJuIGl0IGFzIGEgYGJsb2JgLgorQ29udmVyc2VseSwgdGhlIGZ1bmN0aW9uIGBibG9iX2FzX3R5cGVgIHRha2VzIGEgNjQtYml0IGBibG9iYCBhcmd1bWVudCBhbmQKK2NvbnZlcnQgaXQgdG8gYSBgYmlnaW50YCB2YWx1ZS4gQW5kIHNvIGZvciBpbnN0YW5jZSwgYGJpZ2ludF9hc19ibG9iKDMpYAoraXMgYDB4MDAwMDAwMDAwMDAwMDAwM2AgYW5kIGBibG9iX2FzX2JpZ2ludCgweDAwMDAwMDAwMDAwMDAwMDMpYCBpcyBgM2AuCisKKz09PSBBZ2dyZWdhdGVzCisKK0FnZ3JlZ2F0ZSBmdW5jdGlvbnMgd29yayBvbiBhIHNldCBvZiByb3dzLiBUaGV5IHJlY2VpdmUgdmFsdWVzIGZvciBlYWNoCityb3cgYW5kIHJldHVybnMgb25lIHZhbHVlIGZvciB0aGUgd2hvbGUgc2V0LiArCitJZiBgbm9ybWFsYCBjb2x1bW5zLCBgc2NhbGFyIGZ1bmN0aW9uc2AsIGBVRFRgIGZpZWxkcywgYHdyaXRldGltZWAsIGBtYXh3cml0ZXRpbWVgCitvciBgdHRsYCBhcmUgc2VsZWN0ZWQgdG9nZXRoZXIgd2l0aCBhZ2dyZWdhdGUgZnVuY3Rpb25zLCB0aGUgdmFsdWVzCityZXR1cm5lZCBmb3IgdGhlbSB3aWxsIGJlIHRoZSBvbmVzIG9mIHRoZSBmaXJzdCByb3cgbWF0Y2hpbmcgdGhlIHF1ZXJ5LgorCitDUUwzIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBidWlsdC1pbiBhZ2dyZWdhdGVzIChzbyBjYWxsZWQgYG5hdGl2ZQorYWdncmVnYXRlcycpIGFuZCBsaW5rOiN1ZGFzW3VzZXItZGVmaW5lZCBhZ2dyZWdhdGVzXS4gQ1FMMyBpbmNsdWRlcworc2V2ZXJhbCBuYXRpdmUgYWdncmVnYXRlcywgZGVzY3JpYmVkIGJlbG93OgorCitbW2NvdW50RmN0XV0KKz09PT0gQ291bnQKKworVGhlIGBjb3VudGAgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY291bnQgdGhlIHJvd3MgcmV0dXJuZWQgYnkgYSBxdWVyeS4KK0V4YW1wbGU6CisKK2JjKHNhbXBsZSkuICsKK1NFTEVDVCBDT1VOVCAoKikgRlJPTSBwbGF5czsgKworU0VMRUNUIENPVU5UICgxKSBGUk9NIHBsYXlzOworCitJdCBhbHNvIGNhbiBiZSB1c2VkIHRvIGNvdW50IHRoZSBub24gbnVsbCB2YWx1ZSBvZiBhIGdpdmVuIGNvbHVtbi4KK0V4YW1wbGU6CisKK2JjKHNhbXBsZSkuICsKK1NFTEVDVCBDT1VOVCAoc2NvcmVzKSBGUk9NIHBsYXlzOworCitbW21heE1pbkZjdHNdXQorPT09PSBNYXggYW5kIE1pbgorCitUaGUgYG1heGAgYW5kIGBtaW5gIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCB0byBjb21wdXRlIHRoZSBtYXhpbXVtIGFuZCB0aGUKK21pbmltdW0gdmFsdWUgcmV0dXJuZWQgYnkgYSBxdWVyeSBmb3IgYSBnaXZlbiBjb2x1bW4uCisKK2JjKHNhbXBsZSkuICsKK1NFTEVDVCBNSU4gKHBsYXllcnMpLCBNQVggKHBsYXllcnMpIEZST00gcGxheXMgV0hFUkUgZ2FtZSA9IGBxdWFrZSc7CisKK1tbc3VtRmN0XV0KKz09PT0gU3VtCisKK1RoZSBgc3VtYCBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBzdW0gdXAgYWxsIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgYQorcXVlcnkgZm9yIGEgZ2l2ZW4gY29sdW1uLgorCitiYyhzYW1wbGUpLiArCitTRUxFQ1QgU1VNIChwbGF5ZXJzKSBGUk9NIHBsYXlzOworCitbW2F2Z0ZjdF1dCis9PT09IEF2ZworCitUaGUgYGF2Z2AgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgYXZlcmFnZSBvZiBhbGwgdGhlIHZhbHVlcworcmV0dXJuZWQgYnkgYSBxdWVyeSBmb3IgYSBnaXZlbiBjb2x1bW4uCisKK2JjKHNhbXBsZSkuICsKK1NFTEVDVCBBVkcgKHBsYXllcnMpIEZST00gcGxheXM7CisKK1tbdWRmc11dCis9PT0gVXNlci1EZWZpbmVkIEZ1bmN0aW9ucworCitVc2VyLWRlZmluZWQgZnVuY3Rpb25zIGFsbG93IGV4ZWN1dGlvbiBvZiB1c2VyLXByb3ZpZGVkIGNvZGUgaW4KK0Nhc3NhbmRyYS4gQnkgZGVmYXVsdCwgQ2Fzc2FuZHJhIHN1cHBvcnRzIGRlZmluaW5nIGZ1bmN0aW9ucyBpbiBfSmF2YV8KK2FuZCBfSmF2YVNjcmlwdF8uIFN1cHBvcnQgZm9yIG90aGVyIEpTUiAyMjMgY29tcGxpYW50IHNjcmlwdGluZworbGFuZ3VhZ2VzIChzdWNoIGFzIFB5dGhvbiwgUnVieSwgYW5kIFNjYWxhKSBoYXMgYmVlbiByZW1vdmVkIGluIDMuMC4xMS4KKworVURGcyBhcmUgcGFydCBvZiB0aGUgQ2Fzc2FuZHJhIHNjaGVtYS4gQXMgc3VjaCwgdGhleSBhcmUgYXV0b21hdGljYWxseQorcHJvcGFnYXRlZCB0byBhbGwgbm9kZXMgaW4gdGhlIGNsdXN0ZXIuCisKK1VERnMgY2FuIGJlIF9vdmVybG9hZGVkXyAtIGkuZS4gbXVsdGlwbGUgVURGcyB3aXRoIGRpZmZlcmVudCBhcmd1bWVudAordHlwZXMgYnV0IHRoZSBzYW1lIGZ1bmN0aW9uIG5hbWUuIEV4YW1wbGU6CisKK2JjKHNhbXBsZSkuICsKK0NSRUFURSBGVU5DVElPTiBzYW1wbGUgKCBhcmcgaW50ICkg4oCmOyArCitDUkVBVEUgRlVOQ1RJT04gc2FtcGxlICggYXJnIHRleHQgKSDigKY7CisKK1VzZXItZGVmaW5lZCBmdW5jdGlvbnMgYXJlIHN1c2NlcHRpYmxlIHRvIGFsbCBvZiB0aGUgbm9ybWFsIHByb2JsZW1zCit3aXRoIHRoZSBjaG9zZW4gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIEFjY29yZGluZ2x5LCBpbXBsZW1lbnRhdGlvbnMKK3Nob3VsZCBiZSBzYWZlIGFnYWluc3QgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbnMsIGlsbGVnYWwgYXJndW1lbnRzLCBvcgorYW55IG90aGVyIHBvdGVudGlhbCBzb3VyY2Ugb2YgZXhjZXB0aW9ucy4gQW4gZXhjZXB0aW9uIGR1cmluZyBmdW5jdGlvbgorZXhlY3V0aW9uIHdpbGwgcmVzdWx0IGluIHRoZSBlbnRpcmUgc3RhdGVtZW50IGZhaWxpbmcuCisKK0l0IGlzIHZhbGlkIHRvIHVzZSBfY29tcGxleF8gdHlwZXMgbGlrZSBjb2xsZWN0aW9ucywgdHVwbGUgdHlwZXMgYW5kCit1c2VyLWRlZmluZWQgdHlwZXMgYXMgYXJndW1lbnQgYW5kIHJldHVybiB0eXBlcy4gVHVwbGUgdHlwZXMgYW5kCit1c2VyLWRlZmluZWQgdHlwZXMgYXJlIGhhbmRsZWQgYnkgdGhlIGNvbnZlcnNpb24gZnVuY3Rpb25zIG9mIHRoZQorRGF0YVN0YXggSmF2YSBEcml2ZXIuIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIEphdmEgRHJpdmVyCitmb3IgZGV0YWlscyBvbiBoYW5kbGluZyB0dXBsZSB0eXBlcyBhbmQgdXNlci1kZWZpbmVkIHR5cGVzLgorCitBcmd1bWVudHMgZm9yIGZ1bmN0aW9ucyBjYW4gYmUgbGl0ZXJhbHMgb3IgdGVybXMuIFByZXBhcmVkIHN0YXRlbWVudAorcGxhY2Vob2xkZXJzIGNhbiBiZSB1c2VkLCB0b28uCisKK05vdGUgdGhhdCB5b3UgY2FuIHVzZSB0aGUgZG91YmxlLXF1b3RlZCBzdHJpbmcgc3ludGF4IHRvIGVuY2xvc2UgdGhlIFVERgorc291cmNlIGNvZGUuIEZvciBleGFtcGxlOgorCitiYyhzYW1wbGUpLi4gKworQ1JFQVRFIEZVTkNUSU9OIHNvbWVfZnVuY3Rpb24gKCBhcmcgaW50ICkgKworUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgKworUkVUVVJOUyBpbnQgKworTEFOR1VBR0UgamF2YSArCitBUyAkJCByZXR1cm4gYXJnOyAkJDsKKworU0VMRUNUIHNvbWVfZnVuY3Rpb24oY29sdW1uKSBGUk9NIGF0YWJsZSDigKY7ICsKK1VQREFURSBhdGFibGUgU0VUIGNvbCA9IHNvbWVfZnVuY3Rpb24oPykg4oCmOyArCitwLgorCitiYyhzYW1wbGUpLiArCitDUkVBVEUgVFlQRSBjdXN0b21fdHlwZSAodHh0IHRleHQsIGkgaW50KTsgKworQ1JFQVRFIEZVTkNUSU9OIGZjdF91c2luZ191ZHQgKCB1ZHRhcmcgZnJvemVuICkgKworUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgKworUkVUVVJOUyB0ZXh0ICsKK0xBTkdVQUdFIGphdmEgKworQVMgJCQgcmV0dXJuIHVkdGFyZy5nZXRTdHJpbmcoYGB0eHQnJyk7ICQkOworCitVc2VyLWRlZmluZWQgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIGluIGxpbms6I3NlbGVjdFN0bXRbYFNFTEVDVGBdLAorbGluazojaW5zZXJ0U3RtdFtgSU5TRVJUYF0gYW5kIGxpbms6I3VwZGF0ZVN0bXRbYFVQREFURWBdIHN0YXRlbWVudHMuCisKK1RoZSBpbXBsaWNpdGx5IGF2YWlsYWJsZSBgdWRmQ29udGV4dGAgZmllbGQgKG9yIGJpbmRpbmcgZm9yIHNjcmlwdCBVREZzKQorcHJvdmlkZXMgdGhlIG5lY2Nlc3NhcnkgZnVuY3Rpb25hbGl0eSB0byBjcmVhdGUgbmV3IFVEVCBhbmQgdHVwbGUKK3ZhbHVlcy4KKworYmMoc2FtcGxlKS4gKworQ1JFQVRFIFRZUEUgY3VzdG9tX3R5cGUgKHR4dCB0ZXh0LCBpIGludCk7ICsKK0NSRUFURSBGVU5DVElPTiBmY3RfdXNpbmdfdWR0ICggc29tZWFyZyBpbnQgKSArCitSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVCArCitSRVRVUk5TIGN1c3RvbV90eXBlICsKK0xBTkdVQUdFIGphdmEgKworQVMgJCQgKworVURUVmFsdWUgdWR0ID0gdWRmQ29udGV4dC5uZXdSZXR1cm5VRFRWYWx1ZSgpOyArCit1ZHQuc2V0U3RyaW5nKGBgdHh0JycsIGBgc29tZSBzdHJpbmcnJyk7ICsKK3VkdC5zZXRJbnQoYGBpJycsIDQyKTsgKworcmV0dXJuIHVkdDsgKworJCQ7CisKK1RoZSBkZWZpbml0aW9uIG9mIHRoZSBgVURGQ29udGV4dGAgaW50ZXJmYWNlIGNhbiBiZSBmb3VuZCBpbiB0aGUgQXBhY2hlCitDYXNzYW5kcmEgc291cmNlIGNvZGUgZm9yCitgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuVURGQ29udGV4dGAuCisKK2JjKHNhbXBsZSkuICsKK3B1YmxpYyBpbnRlcmZhY2UgVURGQ29udGV4dCArCitceyArCitVRFRWYWx1ZSBuZXdBcmdVRFRWYWx1ZShTdHJpbmcgYXJnTmFtZSk7ICsKK1VEVFZhbHVlIG5ld0FyZ1VEVFZhbHVlKGludCBhcmdOdW0pOyArCitVRFRWYWx1ZSBuZXdSZXR1cm5VRFRWYWx1ZSgpOyArCitVRFRWYWx1ZSBuZXdVRFRWYWx1ZShTdHJpbmcgdWR0TmFtZSk7ICsKK1R1cGxlVmFsdWUgbmV3QXJnVHVwbGVWYWx1ZShTdHJpbmcgYXJnTmFtZSk7ICsKK1R1cGxlVmFsdWUgbmV3QXJnVHVwbGVWYWx1ZShpbnQgYXJnTnVtKTsgKworVHVwbGVWYWx1ZSBuZXdSZXR1cm5UdXBsZVZhbHVlKCk7ICsKK1R1cGxlVmFsdWUgbmV3VHVwbGVWYWx1ZShTdHJpbmcgY3FsRGVmaW5pdGlvbik7ICsKK30KKworSmF2YSBVREZzIGFscmVhZHkgaGF2ZSBzb21lIGltcG9ydHMgZm9yIGNvbW1vbiBpbnRlcmZhY2VzIGFuZCBjbGFzc2VzCitkZWZpbmVkLiBUaGVzZSBpbXBvcnRzIGFyZTogKworUGxlYXNlIG5vdGUsIHRoYXQgdGhlc2UgY29udmVuaWVuY2UgaW1wb3J0cyBhcmUgbm90IGF2YWlsYWJsZSBmb3Igc2NyaXB0CitVREZzLgorCitiYyhzYW1wbGUpLiArCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsgKworaW1wb3J0IGphdmEudXRpbC5MaXN0OyArCitpbXBvcnQgamF2YS51dGlsLk1hcDsgKworaW1wb3J0IGphdmEudXRpbC5TZXQ7ICsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5VREZDb250ZXh0OyArCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlR5cGVDb2RlYzsgKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5UdXBsZVZhbHVlOyArCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlVEVFZhbHVlOworCitTZWUgbGluazojY3JlYXRlRnVuY3Rpb25TdG10W2BDUkVBVEUgRlVOQ1RJT05gXSBhbmQKK2xpbms6I2Ryb3BGdW5jdGlvblN0bXRbYERST1AgRlVOQ1RJT05gXS4KKworW1t1ZGFzXV0KKz09PSBVc2VyLURlZmluZWQgQWdncmVnYXRlcworCitVc2VyLWRlZmluZWQgYWdncmVnYXRlcyBhbGxvdyBjcmVhdGlvbiBvZiBjdXN0b20gYWdncmVnYXRlIGZ1bmN0aW9ucwordXNpbmcgbGluazojdWRmc1tVREZzXS4gQ29tbW9uIGV4YW1wbGVzIG9mIGFnZ3JlZ2F0ZSBmdW5jdGlvbnMgYXJlCitfY291bnRfLCBfbWluXywgYW5kIF9tYXhfLgorCitFYWNoIGFnZ3JlZ2F0ZSByZXF1aXJlcyBhbiBfaW5pdGlhbCBzdGF0ZV8gKGBJTklUQ09ORGAsIHdoaWNoIGRlZmF1bHRzCit0byBgbnVsbGApIG9mIHR5cGUgYFNUWVBFYC4gVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBzdGF0ZSBmdW5jdGlvbgorbXVzdCBoYXZlIHR5cGUgYFNUWVBFYC4gVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgb2YgdGhlIHN0YXRlIGZ1bmN0aW9uCittdXN0IG1hdGNoIHRoZSB0eXBlcyBvZiB0aGUgdXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSBhcmd1bWVudHMuIFRoZSBzdGF0ZQorZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggcm93LCBhbmQgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZQorc3RhdGUgZnVuY3Rpb24gYmVjb21lcyB0aGUgbmV3IHN0YXRlLiBBZnRlciBhbGwgcm93cyBhcmUgcHJvY2Vzc2VkLCB0aGUKK29wdGlvbmFsIGBGSU5BTEZVTkNgIGlzIGV4ZWN1dGVkIHdpdGggbGFzdCBzdGF0ZSB2YWx1ZSBhcyBpdHMgYXJndW1lbnQuCisKK2BTVFlQRWAgaXMgbWFuZGF0b3J5IGluIG9yZGVyIHRvIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2ggcG9zc2libHkKK292ZXJsb2FkZWQgdmVyc2lvbnMgb2YgdGhlIHN0YXRlIGFuZC9vciBmaW5hbCBmdW5jdGlvbiAoc2luY2UgdGhlCitvdmVybG9hZCBjYW4gYXBwZWFyIGFmdGVyIGNyZWF0aW9uIG9mIHRoZSBhZ2dyZWdhdGUpLgorCitVc2VyLWRlZmluZWQgYWdncmVnYXRlcyBjYW4gYmUgdXNlZCBpbiBsaW5rOiNzZWxlY3RTdG10W2BTRUxFQ1RgXQorc3RhdGVtZW50LgorCitBIGNvbXBsZXRlIHdvcmtpbmcgZXhhbXBsZSBmb3IgdXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZXMgKGFzc3VtaW5nIHRoYXQgYQora2V5c3BhY2UgaGFzIGJlZW4gc2VsZWN0ZWQgdXNpbmcgdGhlIGxpbms6I3VzZVN0bXRbYFVTRWBdIHN0YXRlbWVudCk6CisKK2JjKHNhbXBsZSkuLiArCitDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBhdmVyYWdlU3RhdGUgKCBzdGF0ZSB0dXBsZTxpbnQsYmlnaW50PiwgdmFsCitpbnQgKSArCitDQUxMRUQgT04gTlVMTCBJTlBVVCArCitSRVRVUk5TIHR1cGxlPGludCxiaWdpbnQ+ICsKK0xBTkdVQUdFIGphdmEgKworQVMg4oCZICsKK2lmICh2YWwgIT0gbnVsbCkgXHsgKworc3RhdGUuc2V0SW50KDAsIHN0YXRlLmdldEludCgwKSsxKTsgKworc3RhdGUuc2V0TG9uZygxLCBzdGF0ZS5nZXRMb25nKDEpK3ZhbC5pbnRWYWx1ZSgpKTsgKworfSArCityZXR1cm4gc3RhdGU7ICsKK+KAmTsKKworQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gYXZlcmFnZUZpbmFsICggc3RhdGUgdHVwbGU8aW50LGJpZ2ludD4gKSArCitDQUxMRUQgT04gTlVMTCBJTlBVVCArCitSRVRVUk5TIGRvdWJsZSArCitMQU5HVUFHRSBqYXZhICsKK0FTIOKAmSArCitkb3VibGUgciA9IDA7ICsKK2lmIChzdGF0ZS5nZXRJbnQoMCkgPT0gMCkgcmV0dXJuIG51bGw7ICsKK3IgPSBzdGF0ZS5nZXRMb25nKDEpOyArCityIC89IHN0YXRlLmdldEludCgwKTsgKworcmV0dXJuIERvdWJsZS52YWx1ZU9mwq47ICsKK+KAmTsKKworQ1JFQVRFIE9SIFJFUExBQ0UgQUdHUkVHQVRFIGF2ZXJhZ2UgKCBpbnQgKSArCitTRlVOQyBhdmVyYWdlU3RhdGUgKworU1RZUEUgdHVwbGU8aW50LGJpZ2ludD4gKworRklOQUxGVU5DIGF2ZXJhZ2VGaW5hbCArCitJTklUQ09ORCAoMCwgMCk7CisKK0NSRUFURSBUQUJMRSBhdGFibGUgKCArCitwayBpbnQgUFJJTUFSWSBLRVksICsKK3ZhbCBpbnQpOyArCitJTlNFUlQgSU5UTyBhdGFibGUgKHBrLCB2YWwpIFZBTFVFUyAoMSwxKTsgKworSU5TRVJUIElOVE8gYXRhYmxlIChwaywgdmFsKSBWQUxVRVMgKDIsMik7ICsKK0lOU0VSVCBJTlRPIGF0YWJsZSAocGssIHZhbCkgVkFMVUVTICgzLDMpOyArCitJTlNFUlQgSU5UTyBhdGFibGUgKHBrLCB2YWwpIFZBTFVFUyAoNCw0KTsgKworU0VMRUNUIGF2ZXJhZ2UodmFsKSBGUk9NIGF0YWJsZTsgKworcC4KKworU2VlIGxpbms6I2NyZWF0ZUFnZ3JlZ2F0ZVN0bXRbYENSRUFURSBBR0dSRUdBVEVgXSBhbmQKK2xpbms6I2Ryb3BBZ2dyZWdhdGVTdG10W2BEUk9QIEFHR1JFR0FURWBdLgorCitbW2pzb25dXQorPT09IEpTT04gU3VwcG9ydAorCitDYXNzYW5kcmEgMi4yIGludHJvZHVjZXMgSlNPTiBzdXBwb3J0IHRvIGxpbms6I3NlbGVjdFN0bXRbYFNFTEVDVGBdIGFuZAorbGluazojaW5zZXJ0U3RtdFtgSU5TRVJUYF0gc3RhdGVtZW50cy4gVGhpcyBzdXBwb3J0IGRvZXMgbm90CitmdW5kYW1lbnRhbGx5IGFsdGVyIHRoZSBDUUwgQVBJIChmb3IgZXhhbXBsZSwgdGhlIHNjaGVtYSBpcyBzdGlsbAorZW5mb3JjZWQpLCBpdCBzaW1wbHkgcHJvdmlkZXMgYSBjb252ZW5pZW50IHdheSB0byB3b3JrIHdpdGggSlNPTgorZG9jdW1lbnRzLgorCitbW3NlbGVjdEpzb25dXQorPT09PSBTRUxFQ1QgSlNPTgorCitXaXRoIGBTRUxFQ1RgIHN0YXRlbWVudHMsIHRoZSBuZXcgYEpTT05gIGtleXdvcmQgY2FuIGJlIHVzZWQgdG8gcmV0dXJuCitlYWNoIHJvdyBhcyBhIHNpbmdsZSBgSlNPTmAgZW5jb2RlZCBtYXAuIFRoZSByZW1haW5kZXIgb2YgdGhlIGBTRUxFQ1RgCitzdGF0bWVudCBiZWhhdmlvciBpcyB0aGUgc2FtZS4KKworVGhlIHJlc3VsdCBtYXAga2V5cyBhcmUgdGhlIHNhbWUgYXMgdGhlIGNvbHVtbiBuYW1lcyBpbiBhIG5vcm1hbCByZXN1bHQKK3NldC4gRm9yIGV4YW1wbGUsIGEgc3RhdGVtZW50IGxpa2UgYGBgU0VMRUNUIEpTT04gYSwgdHRsKGIpIEZST00gLi4uYCcnCit3b3VsZCByZXN1bHQgaW4gYSBtYXAgd2l0aCBrZXlzIGAiYSJgIGFuZCBgInR0bChiKSJgLiBIb3dldmVyLCB0aGlzIGlzCitvbmUgbm90YWJsZSBleGNlcHRpb246IGZvciBzeW1tZXRyeSB3aXRoIGBJTlNFUlQgSlNPTmAgYmVoYXZpb3IsCitjYXNlLXNlbnNpdGl2ZSBjb2x1bW4gbmFtZXMgd2l0aCB1cHBlci1jYXNlIGxldHRlcnMgd2lsbCBiZSBzdXJyb3VuZGVkCit3aXRoIGRvdWJsZSBxdW90ZXMuIEZvciBleGFtcGxlLCBgYGBTRUxFQ1QgSlNPTiBteUNvbHVtbiBGUk9NIC4uLmAnJword291bGQgcmVzdWx0IGluIGEgbWFwIGtleSBgIlwibXlDb2x1bW5cIiJgIChub3RlIHRoZSBlc2NhcGVkIHF1b3RlcykuCisKK1RoZSBtYXAgdmFsdWVzIHdpbGwgYEpTT05gLWVuY29kZWQgcmVwcmVzZW50YXRpb25zIChhcyBkZXNjcmliZWQgYmVsb3cpCitvZiB0aGUgcmVzdWx0IHNldCB2YWx1ZXMuCisKK1tbaW5zZXJ0SnNvbl1dCis9PT09IElOU0VSVCBKU09OCisKK1dpdGggYElOU0VSVGAgc3RhdGVtZW50cywgdGhlIG5ldyBgSlNPTmAga2V5d29yZCBjYW4gYmUgdXNlZCB0byBlbmFibGUKK2luc2VydGluZyBhIGBKU09OYCBlbmNvZGVkIG1hcCBhcyBhIHNpbmdsZSByb3cuIFRoZSBmb3JtYXQgb2YgdGhlIGBKU09OYAorbWFwIHNob3VsZCBnZW5lcmFsbHkgbWF0Y2ggdGhhdCByZXR1cm5lZCBieSBhIGBTRUxFQ1QgSlNPTmAgc3RhdGVtZW50IG9uCit0aGUgc2FtZSB0YWJsZS4gSW4gcGFydGljdWxhciwgY2FzZS1zZW5zaXRpdmUgY29sdW1uIG5hbWVzIHNob3VsZCBiZQorc3Vycm91bmRlZCB3aXRoIGRvdWJsZSBxdW90ZXMuIEZvciBleGFtcGxlLCB0byBpbnNlcnQgaW50byBhIHRhYmxlIHdpdGgKK3R3byBjb2x1bW5zIG5hbWVkIGBgbXlLZXknJyBhbmQgYGB2YWx1ZScnLCB5b3Ugd291bGQgZG8gdGhlIGZvbGxvd2luZzoKKworYmMoc2FtcGxlKS4gKworSU5TRVJUIElOVE8gbXl0YWJsZSBKU09OIGBce2BgXCcnbXlLZXlcYGAnJzogMCwgYGB2YWx1ZScnOiAwfScKKworQW55IGNvbHVtbnMgd2hpY2ggYXJlIG9tbWl0dGVkIGZyb20gdGhlIGBKU09OYCBtYXAgd2lsbCBiZSBkZWZhdWx0ZWQgdG8KK2EgYE5VTExgIHZhbHVlICh3aGljaCB3aWxsIHJlc3VsdCBpbiBhIHRvbWJzdG9uZSBiZWluZyBjcmVhdGVkKS4KKworW1tqc29uRW5jb2RpbmddXQorPT09PSBKU09OIEVuY29kaW5nIG9mIENhc3NhbmRyYSBEYXRhIFR5cGVzCisKK1doZXJlIHBvc3NpYmxlLCBDYXNzYW5kcmEgd2lsbCByZXByZXNlbnQgYW5kIGFjY2VwdCBkYXRhIHR5cGVzIGluIHRoZWlyCituYXRpdmUgYEpTT05gIHJlcHJlc2VudGF0aW9uLiBDYXNzYW5kcmEgd2lsbCBhbHNvIGFjY2VwdCBzdHJpbmcKK3JlcHJlc2VudGF0aW9ucyBtYXRjaGluZyB0aGUgQ1FMIGxpdGVyYWwgZm9ybWF0IGZvciBhbGwgc2luZ2xlLWZpZWxkCit0eXBlcy4gRm9yIGV4YW1wbGUsIGZsb2F0cywgaW50cywgVVVJRHMsIGFuZCBkYXRlcyBjYW4gYmUgcmVwcmVzZW50ZWQgYnkKK0NRTCBsaXRlcmFsIHN0cmluZ3MuIEhvd2V2ZXIsIGNvbXBvdW5kIHR5cGVzLCBzdWNoIGFzIGNvbGxlY3Rpb25zLAordHVwbGVzLCBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIG11c3QgYmUgcmVwcmVzZW50ZWQgYnkgbmF0aXZlIGBKU09OYAorY29sbGVjdGlvbnMgKG1hcHMgYW5kIGxpc3RzKSBvciBhIEpTT04tZW5jb2RlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YKK3RoZSBjb2xsZWN0aW9uLgorCitUaGUgZm9sbG93aW5nIHRhYmxlIGRlc2NyaWJlcyB0aGUgZW5jb2RpbmdzIHRoYXQgQ2Fzc2FuZHJhIHdpbGwgYWNjZXB0CitpbiBgSU5TRVJUIEpTT05gIHZhbHVlcyAoYW5kIGBmcm9tX2pzb24oKWAgYXJndW1lbnRzKSBhcyB3ZWxsIGFzIHRoZQorZm9ybWF0IENhc3NhbmRyYSB3aWxsIHVzZSB3aGVuIHJldHVybmluZyBkYXRhIGZvciBgU0VMRUNUIEpTT05gCitzdGF0ZW1lbnRzIChhbmQgYGZyb21fanNvbigpYCk6CisKK1tjb2xzPSIsLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfHR5cGUgfGZvcm1hdHMgYWNjZXB0ZWQgfHJldHVybiBmb3JtYXQgfG5vdGVzCit8YGFzY2lpYCB8c3RyaW5nIHxzdHJpbmcgfFVzZXMgSlNPTuKAmXMgYFx1YCBjaGFyYWN0ZXIgZXNjYXBlCisKK3xgYmlnaW50YCB8aW50ZWdlciwgc3RyaW5nIHxpbnRlZ2VyIHxTdHJpbmcgbXVzdCBiZSB2YWxpZCA2NCBiaXQgaW50ZWdlcgorCit8YGJsb2JgIHxzdHJpbmcgfHN0cmluZyB8U3RyaW5nIHNob3VsZCBiZSAweCBmb2xsb3dlZCBieSBhbiBldmVuIG51bWJlcgorb2YgaGV4IGRpZ2l0cworCit8YGJvb2xlYW5gIHxib29sZWFuLCBzdHJpbmcgfGJvb2xlYW4gfFN0cmluZyBtdXN0IGJlIGBgdHJ1ZScnIG9yCitgYGZhbHNlJycKKworfGBkYXRlYCB8c3RyaW5nIHxzdHJpbmcgfERhdGUgaW4gZm9ybWF0IGBZWVlZLU1NLUREYCwgdGltZXpvbmUgVVRDCisKK3xgZGVjaW1hbGAgfGludGVnZXIsIGZsb2F0LCBzdHJpbmcgfGZsb2F0IHxNYXkgZXhjZWVkIDMyIG9yIDY0LWJpdAorSUVFRS03NTQgZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uIGluIGNsaWVudC1zaWRlIGRlY29kZXIKKworfGBkb3VibGVgIHxpbnRlZ2VyLCBmbG9hdCwgc3RyaW5nIHxmbG9hdCB8U3RyaW5nIG11c3QgYmUgdmFsaWQgaW50ZWdlcgorb3IgZmxvYXQKKworfGBmbG9hdGAgfGludGVnZXIsIGZsb2F0LCBzdHJpbmcgfGZsb2F0IHxTdHJpbmcgbXVzdCBiZSB2YWxpZCBpbnRlZ2VyIG9yCitmbG9hdAorCit8YGluZXRgIHxzdHJpbmcgfHN0cmluZyB8SVB2NCBvciBJUHY2IGFkZHJlc3MKKworfGBpbnRgIHxpbnRlZ2VyLCBzdHJpbmcgfGludGVnZXIgfFN0cmluZyBtdXN0IGJlIHZhbGlkIDMyIGJpdCBpbnRlZ2VyCisKK3xgbGlzdGAgfGxpc3QsIHN0cmluZyB8bGlzdCB8VXNlcyBKU09O4oCZcyBuYXRpdmUgbGlzdCByZXByZXNlbnRhdGlvbgorCit8YG1hcGAgfG1hcCwgc3RyaW5nIHxtYXAgfFVzZXMgSlNPTuKAmXMgbmF0aXZlIG1hcCByZXByZXNlbnRhdGlvbgorCit8YHNtYWxsaW50YCB8aW50ZWdlciwgc3RyaW5nIHxpbnRlZ2VyIHxTdHJpbmcgbXVzdCBiZSB2YWxpZCAxNiBiaXQKK2ludGVnZXIKKworfGBzZXRgIHxsaXN0LCBzdHJpbmcgfGxpc3QgfFVzZXMgSlNPTuKAmXMgbmF0aXZlIGxpc3QgcmVwcmVzZW50YXRpb24KKworfGB0ZXh0YCB8c3RyaW5nIHxzdHJpbmcgfFVzZXMgSlNPTuKAmXMgYFx1YCBjaGFyYWN0ZXIgZXNjYXBlCisKK3xgdGltZWAgfHN0cmluZyB8c3RyaW5nIHxUaW1lIG9mIGRheSBpbiBmb3JtYXQgYEhILU1NLVNTWy5mZmZmZmZmZmZdYAorCit8YHRpbWVzdGFtcGAgfGludGVnZXIsIHN0cmluZyB8c3RyaW5nIHxBIHRpbWVzdGFtcC4gU3RyaW5ncyBjb25zdGFudCBhcmUKK2FsbG93IHRvIGlucHV0IHRpbWVzdGFtcHMgYXMgZGF0ZXMsIHNlZSBsaW5rOiN1c2luZ2RhdGVzW1dvcmtpbmcgd2l0aAorZGF0ZXNdIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uLiBEYXRlc3RhbXBzIHdpdGggZm9ybWF0CitgWVlZWS1NTS1ERCBISDpNTTpTUy5TU1NgIGFyZSByZXR1cm5lZC4KKworfGB0aW1ldXVpZGAgfHN0cmluZyB8c3RyaW5nIHxUeXBlIDEgVVVJRC4gU2VlIGxpbms6I2NvbnN0YW50c1tDb25zdGFudHNdCitmb3IgdGhlIFVVSUQgZm9ybWF0CisKK3xgdGlueWludGAgfGludGVnZXIsIHN0cmluZyB8aW50ZWdlciB8U3RyaW5nIG11c3QgYmUgdmFsaWQgOCBiaXQgaW50ZWdlcgorCit8YHR1cGxlYCB8bGlzdCwgc3RyaW5nIHxsaXN0IHxVc2VzIEpTT07igJlzIG5hdGl2ZSBsaXN0IHJlcHJlc2VudGF0aW9uCisKK3xgVURUYCB8bWFwLCBzdHJpbmcgfG1hcCB8VXNlcyBKU09O4oCZcyBuYXRpdmUgbWFwIHJlcHJlc2VudGF0aW9uIHdpdGgKK2ZpZWxkIG5hbWVzIGFzIGtleXMKKworfGB1dWlkYCB8c3RyaW5nIHxzdHJpbmcgfFNlZSBsaW5rOiNjb25zdGFudHNbQ29uc3RhbnRzXSBmb3IgdGhlIFVVSUQKK2Zvcm1hdAorCit8YHZhcmNoYXJgIHxzdHJpbmcgfHN0cmluZyB8VXNlcyBKU09O4oCZcyBgXHVgIGNoYXJhY3RlciBlc2NhcGUKKworfGB2YXJpbnRgIHxpbnRlZ2VyLCBzdHJpbmcgfGludGVnZXIgfFZhcmlhYmxlIGxlbmd0aDsgbWF5IG92ZXJmbG93IDMyIG9yCis2NCBiaXQgaW50ZWdlcnMgaW4gY2xpZW50LXNpZGUgZGVjb2RlcgorfD09PQorCitbW2Zyb21fanNvbl1dCis9PT09IFRoZSBmcm9tX2pzb24oKSBGdW5jdGlvbgorCitUaGUgYGZyb21fanNvbigpYCBmdW5jdGlvbiBtYXkgYmUgdXNlZCBzaW1pbGFybHkgdG8gYElOU0VSVCBKU09OYCwgYnV0Citmb3IgYSBzaW5nbGUgY29sdW1uIHZhbHVlLiBJdCBtYXkgb25seSBiZSB1c2VkIGluIHRoZSBgVkFMVUVTYCBjbGF1c2Ugb2YKK2FuIGBJTlNFUlRgIHN0YXRlbWVudCBvciBhcyBvbmUgb2YgdGhlIGNvbHVtbiB2YWx1ZXMgaW4gYW4gYFVQREFURWAsCitgREVMRVRFYCwgb3IgYFNFTEVDVGAgc3RhdGVtZW50LiBGb3IgZXhhbXBsZSwgaXQgY2Fubm90IGJlIHVzZWQgaW4gdGhlCitzZWxlY3Rpb24gY2xhdXNlIG9mIGEgYFNFTEVDVGAgc3RhdGVtZW50LgorCitbW3RvX2pzb25dXQorPT09PSBUaGUgdG9fanNvbigpIEZ1bmN0aW9uCisKK1RoZSBgdG9fanNvbigpYCBmdW5jdGlvbiBtYXkgYmUgdXNlZCBzaW1pbGFybHkgdG8gYFNFTEVDVCBKU09OYCwgYnV0IGZvcgorYSBzaW5nbGUgY29sdW1uIHZhbHVlLiBJdCBtYXkgb25seSBiZSB1c2VkIGluIHRoZSBzZWxlY3Rpb24gY2xhdXNlIG9mIGEKK2BTRUxFQ1RgIHN0YXRlbWVudC4KKworW1thcHBlbmRpeEFdXQorPT09IEFwcGVuZGl4IEE6IENRTCBLZXl3b3JkcworCitDUUwgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIF9yZXNlcnZlZF8gYW5kIF9ub24tcmVzZXJ2ZWRfIGtleXdvcmRzLgorUmVzZXJ2ZWQga2V5d29yZHMgY2Fubm90IGJlIHVzZWQgYXMgaWRlbnRpZmllciwgdGhleSBhcmUgdHJ1bHkgcmVzZXJ2ZWQKK2ZvciB0aGUgbGFuZ3VhZ2UgKGJ1dCBvbmUgY2FuIGVuY2xvc2UgYSByZXNlcnZlZCBrZXl3b3JkIGJ5Citkb3VibGUtcXVvdGVzIHRvIHVzZSBpdCBhcyBhbiBpZGVudGlmaWVyKS4gTm9uLXJlc2VydmVkIGtleXdvcmRzIGhvd2V2ZXIKK29ubHkgaGF2ZSBhIHNwZWNpZmljIG1lYW5pbmcgaW4gY2VydGFpbiBjb250ZXh0IGJ1dCBjYW4gdXNlZCBhcworaWRlbnRpZmVyIG90aGVyd2lzZS4gVGhlIG9ubHkgX3JhaXNvbiBk4oCZw6p0cmVfIG9mIHRoZXNlIG5vbi1yZXNlcnZlZAora2V5d29yZHMgaXMgY29udmVuaWVuY2U6IHNvbWUga2V5d29yZCBhcmUgbm9uLXJlc2VydmVkIHdoZW4gaXQgd2FzCithbHdheXMgZWFzeSBmb3IgdGhlIHBhcnNlciB0byBkZWNpZGUgd2hldGhlciB0aGV5IHdlcmUgdXNlZCBhcyBrZXl3b3Jkcworb3Igbm90LgorCitbY29scz0iLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8S2V5d29yZCB8UmVzZXJ2ZWQ/Cit8YEFERGAgfHllcworfGBBR0dSRUdBVEVgIHxubworfGBBTExgIHxubworfGBBTExPV2AgfHllcworfGBBTFRFUmAgfHllcworfGBBTkRgIHx5ZXMKK3xgQVBQTFlgIHx5ZXMKK3xgQVNgIHxubworfGBBU0NgIHx5ZXMKK3xgQVNDSUlgIHxubworfGBBVVRIT1JJWkVgIHx5ZXMKK3xgQkFUQ0hgIHx5ZXMKK3xgQkVHSU5gIHx5ZXMKK3xgQklHSU5UYCB8bm8KK3xgQkxPQmAgfG5vCit8YEJPT0xFQU5gIHxubworfGBCWWAgfHllcworfGBDQUxMRURgIHxubworfGBDQVNUYCB8bm8KK3xgQ0xVU1RFUklOR2AgfG5vCit8YENPTFVNTkZBTUlMWWAgfHllcworfGBDT01QQUNUYCB8bm8KK3xgQ09OVEFJTlNgIHxubworfGBDT1VOVGAgfG5vCit8YENPVU5URVJgIHxubworfGBDUkVBVEVgIHx5ZXMKK3xgQ1VTVE9NYCB8bm8KK3xgREFURWAgfG5vCit8YERFQ0lNQUxgIHxubworfGBERUZBVUxUYCB8eWVzCit8YERFTEVURWAgfHllcworfGBERVNDYCB8eWVzCit8YERFU0NSSUJFYCB8eWVzCit8YERJU1RJTkNUYCB8bm8KK3xgRE9VQkxFYCB8bm8KK3xgRFJPUGAgfHllcworfGBEVVJBVElPTmAgfG5vCit8YEVOVFJJRVNgIHx5ZXMKK3xgRVhFQ1VURWAgfHllcworfGBFWElTVFNgIHxubworfGBGSUxURVJJTkdgIHxubworfGBGSU5BTEZVTkNgIHxubworfGBGTE9BVGAgfG5vCit8YEZST01gIHx5ZXMKK3xgRlJPWkVOYCB8bm8KK3xgRlVMTGAgfHllcworfGBGVU5DVElPTmAgfG5vCit8YEZVTkNUSU9OU2AgfG5vCit8YEdSQU5UYCB8eWVzCit8YEdST1VQYCB8bm8KK3xgSUZgIHx5ZXMKK3xgSU5gIHx5ZXMKK3xgSU5ERVhgIHx5ZXMKK3xgSU5FVGAgfG5vCit8YElORklOSVRZYCB8eWVzCit8YElOSVRDT05EYCB8bm8KK3xgSU5QVVRgIHxubworfGBJTlNFUlRgIHx5ZXMKK3xgSU5UYCB8bm8KK3xgSU5UT2AgfHllcworfGBJU2AgfHllcworfGBKU09OYCB8bm8KK3xgS0VZYCB8bm8KK3xgS0VZU2AgfG5vCit8YEtFWVNQQUNFYCB8eWVzCit8YEtFWVNQQUNFU2AgfG5vCit8YExBTkdVQUdFYCB8bm8KK3xgTElLRWAgfG5vCit8YExJTUlUYCB8eWVzCit8YExJU1RgIHxubworfGBMT0dJTmAgfG5vCit8YE1BUGAgfG5vCit8YE1BU0tFRGAgfG5vCit8YE1BVEVSSUFMSVpFRGAgfHllcworfGBNQkVBTmAgfHllcworfGBNQkVBTlNgIHx5ZXMKK3xgTU9ESUZZYCB8eWVzCit8YE5BTmAgfHllcworfGBOT0xPR0lOYCB8bm8KK3xgTk9SRUNVUlNJVkVgIHx5ZXMKK3xgTk9TVVBFUlVTRVJgIHxubworfGBOT1RgIHx5ZXMKK3xgTlVMTGAgfHllcworfGBPRmAgfHllcworfGBPTmAgfHllcworfGBPUFRJT05TYCB8bm8KK3xgT1JgIHx5ZXMKK3xgT1JERVJgIHx5ZXMKK3xgUEFSVElUSU9OYCB8bm8KK3xgUEFTU1dPUkRgIHxubworfGBQRVJgIHxubworfGBQRVJNSVNTSU9OYCB8bm8KK3xgUEVSTUlTU0lPTlNgIHxubworfGBQUklNQVJZYCB8eWVzCit8YFJFTkFNRWAgfHllcworfGBSRVBMQUNFYCB8eWVzCit8YFJFVFVSTlNgIHxubworfGBSRVZPS0VgIHx5ZXMKK3xgUk9MRWAgfG5vCit8YFJPTEVTYCB8bm8KK3xgU0NIRU1BYCB8eWVzCit8YFNFTEVDVGAgfHllcworfGBTRUxFQ1RfTUFTS0VEYCB8bm8KK3xgU0VUYCB8eWVzCit8YFNGVU5DYCB8bm8KK3xgU01BTExJTlRgIHxubworfGBTVEFUSUNgIHxubworfGBTVE9SQUdFYCB8bm8KK3xgU1RZUEVgIHxubworfGBTVVBFUlVTRVJgIHxubworfGBUQUJMRWAgfHllcworfGBURVhUYCB8bm8KK3xgVElNRWAgfG5vCit8YFRJTUVTVEFNUGAgfG5vCit8YFRJTUVVVUlEYCB8bm8KK3xgVElOWUlOVGAgfG5vCit8YFRPYCB8eWVzCit8YFRPS0VOYCB8eWVzCit8YFRSSUdHRVJgIHxubworfGBUUlVOQ0FURWAgfHllcworfGBUVExgIHxubworfGBUVVBMRWAgfG5vCit8YFRZUEVgIHxubworfGBVTkxPR0dFRGAgfHllcworfGBVTk1BU0tgIHxubworfGBVTlNFVGAgfHllcworfGBVUERBVEVgIHx5ZXMKK3xgVVNFYCB8eWVzCit8YFVTRVJgIHxubworfGBVU0VSU2AgfG5vCit8YFVTSU5HYCB8eWVzCit8YFVVSURgIHxubworfGBWQUxVRVNgIHxubworfGBWQVJDSEFSYCB8bm8KK3xgVkFSSU5UYCB8bm8KK3xgVklFV2AgfHllcworfGBXSEVSRWAgfHllcworfGBXSVRIYCB8eWVzCit8YFdSSVRFVElNRWAgfG5vCit8PT09CisKK1tbYXBwZW5kaXhCXV0KKz09PSBBcHBlbmRpeCBCOiBDUUwgUmVzZXJ2ZWQgVHlwZXMKKworVGhlIGZvbGxvd2luZyB0eXBlIG5hbWVzIGFyZSBub3QgY3VycmVudGx5IHVzZWQgYnkgQ1FMLCBidXQgYXJlIHJlc2VydmVkCitmb3IgcG90ZW50aWFsIGZ1dHVyZSB1c2UuIFVzZXItZGVmaW5lZCB0eXBlcyBtYXkgbm90IHVzZSByZXNlcnZlZCB0eXBlCituYW1lcyBhcyB0aGVpciBuYW1lLgorCitbY29scz0iIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3x0eXBlCit8YGJpdHN0cmluZ2AKK3xgYnl0ZWAKK3xgY29tcGxleGAKK3xgZGF0ZWAKK3xgZW51bWAKK3xgaW50ZXJ2YWxgCit8YG1hY2FkZHJgCit8PT09CisKKz09PSBDaGFuZ2VzCisKK1RoZSBmb2xsb3dpbmcgZGVzY3JpYmVzIHRoZSBjaGFuZ2VzIGluIGVhY2ggdmVyc2lvbiBvZiBDUUwuCisKKz09PT0gMy40LjMKKworKiBTdXBwb3J0IGZvciBgR1JPVVAgQllgLiBTZWUgbGluazojc2VsZWN0R3JvdXBCeVtgPGdyb3VwLWJ5PmBdIChzZWUKK2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTEwNzA3KVtDQVNTQU5EUkEtMTA3MDddLgorCis9PT09IDMuNC4yCisKKyogU3VwcG9ydCBmb3Igc2VsZWN0aW5nIGVsZW1lbnRzIGFuZCBzbGljZXMgb2YgYSBjb2xsZWN0aW9uCisoaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtNzM5NilbQ0FTU0FORFJBLTczOTZdLgorCis9PT09IDMuNC4yCisKKyogbGluazojdXBkYXRlT3B0aW9uc1tgSU5TRVJUL1VQREFURSBvcHRpb25zYF0gZm9yIHRhYmxlcyBoYXZpbmcgYQorZGVmYXVsdF90aW1lX3RvX2xpdmUgc3BlY2lmeWluZyBhIFRUTCBvZiAwIHdpbGwgcmVtb3ZlIHRoZSBUVEwgZnJvbSB0aGUKK2luc2VydGVkIG9yIHVwZGF0ZWQgdmFsdWVzCisqIGxpbms6I2FsdGVyVGFibGVTdG10W2BBTFRFUiBUQUJMRWBdIGBBRERgIGFuZCBgRFJPUGAgbm93IGFsbG93IG11dGlwbGUKK2NvbHVtbnMgdG8gYmUgYWRkZWQvcmVtb3ZlZAorKiBOZXcgbGluazojc2VsZWN0TGltaXRbYFBFUiBQQVJUSVRJT04gTElNSVRgXSBvcHRpb24gKHNlZQoraHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtNzAxNylbQ0FTU0FORFJBLTcwMTddLgorKiBsaW5rOiN1ZGZzW1VzZXItZGVmaW5lZCBmdW5jdGlvbnNdIGNhbiBub3cgaW5zdGFudGlhdGUgYFVEVFZhbHVlYCBhbmQKK2BUdXBsZVZhbHVlYCBpbnN0YW5jZXMgdmlhIHRoZSBuZXcgYFVERkNvbnRleHRgIGludGVyZmFjZSAoc2VlCitodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS0xMDgxOClbQ0FTU0FORFJBLTEwODE4XS4KKyogYGBVc2VyLWRlZmluZWQgdHlwZXMnJyNjcmVhdGVUeXBlU3RtdCBtYXkgbm93IGJlIHN0b3JlZCBpbiBhCitub24tZnJvemVuIGZvcm0sIGFsbG93aW5nIGluZGl2aWR1YWwgZmllbGRzIHRvIGJlIHVwZGF0ZWQgYW5kIGRlbGV0ZWQgaW4KK2xpbms6I3VwZGF0ZVN0bXRbYFVQREFURWAgc3RhdGVtZW50c10gYW5kIGxpbms6I2RlbGV0ZVN0bXRbYERFTEVURWAKK3N0YXRlbWVudHNdLCByZXNwZWN0aXZlbHkuCisoaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtNzQyMylbQ0FTU0FORFJBLTc0MjNdCisKKz09PT0gMy40LjEKKworKiBBZGRzIGBDQVNUYCBmdW5jdGlvbnMuIFNlZSBsaW5rOiNjYXN0RnVuW2BDYXN0YF0uCisKKz09PT0gMy40LjAKKworKiBTdXBwb3J0IGZvciBsaW5rOiNjcmVhdGVNVlN0bXRbbWF0ZXJpYWxpemVkIHZpZXdzXQorKiBsaW5rOiNkZWxldGVTdG10W2BERUxFVEVgXSBzdXBwb3J0IGZvciBpbmVxdWFsaXR5IGV4cHJlc3Npb25zIGFuZCBgSU5gCityZXN0cmljdGlvbnMgb24gYW55IHByaW1hcnkga2V5IGNvbHVtbnMKKyogbGluazojdXBkYXRlU3RtdFtgVVBEQVRFYF0gc3VwcG9ydCBmb3IgYElOYCByZXN0cmljdGlvbnMgb24gYW55CitwcmltYXJ5IGtleSBjb2x1bW5zCisKKz09PT0gMy4zLjEKKworKiBUaGUgc3ludGF4IGBUUlVOQ0FURSBUQUJMRSBYYCBpcyBub3cgYWNjZXB0ZWQgYXMgYW4gYWxpYXMgZm9yCitgVFJVTkNBVEUgWGAKKworPT09PSAzLjMuMAorCisqIEFkZHMgbmV3IGxpbms6I2FnZ3JlZ2F0ZXNbYWdncmVnYXRlc10KKyogVXNlci1kZWZpbmVkIGZ1bmN0aW9ucyBhcmUgbm93IHN1cHBvcnRlZCB0aHJvdWdoCitsaW5rOiNjcmVhdGVGdW5jdGlvblN0bXRbYENSRUFURSBGVU5DVElPTmBdIGFuZAorbGluazojZHJvcEZ1bmN0aW9uU3RtdFtgRFJPUCBGVU5DVElPTmBdLgorKiBVc2VyLWRlZmluZWQgYWdncmVnYXRlcyBhcmUgbm93IHN1cHBvcnRlZCB0aHJvdWdoCitsaW5rOiNjcmVhdGVBZ2dyZWdhdGVTdG10W2BDUkVBVEUgQUdHUkVHQVRFYF0gYW5kCitsaW5rOiNkcm9wQWdncmVnYXRlU3RtdFtgRFJPUCBBR0dSRUdBVEVgXS4KKyogQWxsb3dzIGRvdWJsZS1kb2xsYXIgZW5jbG9zZWQgc3RyaW5ncyBsaXRlcmFscyBhcyBhbiBhbHRlcm5hdGl2ZSB0bworc2luZ2xlLXF1b3RlIGVuY2xvc2VkIHN0cmluZ3MuCisqIEludHJvZHVjZXMgUm9sZXMgdG8gc3VwZXJjZWRlIHVzZXIgYmFzZWQgYXV0aGVudGljYXRpb24gYW5kIGFjY2VzcworY29udHJvbAorKiBsaW5rOiN1c2luZ2RhdGVzW2BEYXRlYF0gYW5kIGxpbms6dXNpbmd0aW1lW2BUaW1lYF0gZGF0YSB0eXBlcyBoYXZlCitiZWVuIGFkZGVkCisqIGxpbms6I2pzb25bYEpTT05gXSBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkCisqIGBUaW55aW50YCBhbmQgYFNtYWxsaW50YCBkYXRhIHR5cGVzIGhhdmUgYmVlbiBhZGRlZAorKiBBZGRzIG5ldyB0aW1lIGNvbnZlcnNpb24gZnVuY3Rpb25zIGFuZCBkZXByZWNhdGUgYGRhdGVPZmAgYW5kCitgdW5peFRpbWVzdGFtcE9mYC4gU2VlIGxpbms6I3RpbWVGdW5bYFRpbWUgY29udmVyc2lvbiBmdW5jdGlvbnNgXQorCis9PT09IDMuMi4wCisKKyogVXNlci1kZWZpbmVkIHR5cGVzIGFyZSBub3cgc3VwcG9ydGVkIHRocm91Z2gKK2xpbms6I2NyZWF0ZVR5cGVTdG10W2BDUkVBVEUgVFlQRWBdLCBsaW5rOiNhbHRlclR5cGVTdG10W2BBTFRFUiBUWVBFYF0sCithbmQgbGluazojZHJvcFR5cGVTdG10W2BEUk9QIFRZUEVgXQorKiBsaW5rOiNjcmVhdGVJbmRleFN0bXRbYENSRUFURSBJTkRFWGBdIG5vdyBzdXBwb3J0cyBpbmRleGluZyBjb2xsZWN0aW9uCitjb2x1bW5zLCBpbmNsdWRpbmcgaW5kZXhpbmcgdGhlIGtleXMgb2YgbWFwIGNvbGxlY3Rpb25zIHRocm91Z2ggdGhlCitga2V5cygpYCBmdW5jdGlvbgorKiBJbmRleGVzIG9uIGNvbGxlY3Rpb25zIG1heSBiZSBxdWVyaWVkIHVzaW5nIHRoZSBuZXcgYENPTlRBSU5TYCBhbmQKK2BDT05UQUlOUyBLRVlgIG9wZXJhdG9ycworKiBUdXBsZSB0eXBlcyB3ZXJlIGFkZGVkIHRvIGhvbGQgZml4ZWQtbGVuZ3RoIHNldHMgb2YgdHlwZWQgcG9zaXRpb25hbAorZmllbGRzIChzZWUgdGhlIHNlY3Rpb24gb24gbGluazojdHlwZXNbdHlwZXNdICkKKyogbGluazojZHJvcEluZGV4U3RtdFtgRFJPUCBJTkRFWGBdIG5vdyBzdXBwb3J0cyBvcHRpb25hbGx5IHNwZWNpZnlpbmcgYQora2V5c3BhY2UKKworPT09PSAzLjEuNworCisqIGBTRUxFQ1RgIHN0YXRlbWVudHMgbm93IHN1cHBvcnQgc2VsZWN0aW5nIG11bHRpcGxlIHJvd3MgaW4gYSBzaW5nbGUKK3BhcnRpdGlvbiB1c2luZyBhbiBgSU5gIGNsYXVzZSBvbiBjb21iaW5hdGlvbnMgb2YgY2x1c3RlcmluZyBjb2x1bW5zLgorU2VlIGxpbms6I3NlbGVjdFdoZXJlW1NFTEVDVCBXSEVSRV0gY2xhdXNlcy4KKyogYElGIE5PVCBFWElTVFNgIGFuZCBgSUYgRVhJU1RTYCBzeW50YXggaXMgbm93IHN1cHBvcnRlZCBieQorYENSRUFURSBVU0VSYCBhbmQgYERST1AgVVNFUmAgc3RhdG1lbmV0cywgcmVzcGVjdGl2ZWx5LgorCis9PT09IDMuMS42CisKKyogQSBuZXcgbGluazojdXVpZEZ1bltgdXVpZGAgbWV0aG9kXSBoYXMgYmVlbiBhZGRlZC4KKyogU3VwcG9ydCBmb3IgYERFTEVURSAuLi4gSUYgRVhJU1RTYCBzeW50YXguCisKKz09PT0gMy4xLjUKKworKiBJdCBpcyBub3cgcG9zc2libGUgdG8gZ3JvdXAgY2x1c3RlcmluZyBjb2x1bW5zIGluIGEgcmVsYXRpaW9uLCBzZWUKK2xpbms6I3NlbGVjdFdoZXJlW1NFTEVDVCBXSEVSRV0gY2xhdXNlcy4KKyogQWRkZWQgc3VwcG9ydCBmb3IgYFNUQVRJQ2AgY29sdW1ucywgc2VlIGxpbms6I2NyZWF0ZVRhYmxlU3RhdGljW3N0YXRpYworaW4gQ1JFQVRFIFRBQkxFXS4KKworPT09PSAzLjEuNAorCisqIGBDUkVBVEUgSU5ERVhgIG5vdyBhbGxvd3Mgc3BlY2lmeWluZyBvcHRpb25zIHdoZW4gY3JlYXRpbmcgQ1VTVE9NCitpbmRleGVzIChzZWUgbGluazojY3JlYXRlSW5kZXhTdG10W0NSRUFURSBJTkRFWCByZWZlcmVuY2VdICkuCisKKz09PT0gMy4xLjMKKworKiBNaWxsaXNlY29uZCBwcmVjaXNpb24gZm9ybWF0cyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIHRpbWVzdGFtcCBwYXJzZXIKKyhzZWUgbGluazojdXNpbmd0aW1lc3RhbXBzW3dvcmtpbmcgd2l0aCBkYXRlc10gKS4KKworPT09PSAzLjEuMgorCisqIGBOYU5gIGFuZCBgSW5maW5pdHlgIGhhcyBiZWVuIGFkZGVkIGFzIHZhbGlkIGZsb2F0IGNvbnRhbnRzLiBUaGV5IGFyZQorbm93IHJlc2VydmVkIGtleXdvcmRzLiBJbiB0aGUgdW5saWtlbHkgY2FzZSB5b3Ugd2UgdXNpbmcgdGhlbSBhcyBhCitjb2x1bW4gaWRlbnRpZmllciAob3Iga2V5c3BhY2UvdGFibGUgb25lKSwgeW91IHdpbGwgbm9ldyBuZWVkIHRvIGRvdWJsZQorcXVvdGUgdGhlbSAoc2VlIGxpbms6I2lkZW50aWZpZXJzW3F1b3RlIGlkZW50aWZpZXJzXSApLgorCis9PT09IDMuMS4xCisKKyogYFNFTEVDVGAgc3RhdGVtZW50IG5vdyBhbGxvd3MgbGlzdGluZyB0aGUgcGFydGl0aW9uIGtleXMgKHVzaW5nIHRoZQorYERJU1RJTkNUYCBtb2RpZmllcikuIFNlZQoraHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtNDUzNltDQVNTQU5EUkEtNDUzNl0uCisqIFRoZSBzeW50YXggYGMgSU4gP2AgaXMgbm93IHN1cHBvcnRlZCBpbiBgV0hFUkVgIGNsYXVzZXMuIEluIHRoYXQgY2FzZSwKK3RoZSB2YWx1ZSBleHBlY3RlZCBmb3IgdGhlIGJpbmQgdmFyaWFibGUgd2lsbCBiZSBhIGxpc3Qgb2Ygd2hhdGV2ZXIgdHlwZQorYGNgIGlzLgorKiBJdCBpcyBub3cgcG9zc2libGUgdG8gdXNlIG5hbWVkIGJpbmQgdmFyaWFibGVzICh1c2luZyBgOm5hbWVgIGluc3RlYWQKK29mIGA/YCkuCisKKz09PT0gMy4xLjAKKworKiBsaW5rOiNhbHRlclRhYmxlU3RtdFtBTFRFUiBUQUJMRV0gYERST1BgIG9wdGlvbiBoYXMgYmVlbiByZWVuYWJsZWQgZm9yCitDUUwzIHRhYmxlcyBhbmQgaGFzIG5ldyBzZW1hbnRpY3Mgbm93OiB0aGUgc3BhY2UgZm9ybWVybHkgdXNlZCBieQorZHJvcHBlZCBjb2x1bW5zIHdpbGwgbm93IGJlIGV2ZW50dWFsbHkgcmVjbGFpbWVkIChwb3N0LWNvbXBhY3Rpb24pLiBZb3UKK3Nob3VsZCBub3QgcmVhZGQgcHJldmlvdXNseSBkcm9wcGVkIGNvbHVtbnMgdW5sZXNzIHlvdSB1c2UgdGltZXN0YW1wcword2l0aCBtaWNyb3NlY29uZCBwcmVjaXNpb24gKHNlZQoraHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMzkxOVtDQVNTQU5EUkEtMzkxOV0gZm9yCittb3JlIGRldGFpbHMpLgorKiBgU0VMRUNUYCBzdGF0ZW1lbnQgbm93IHN1cHBvcnRzIGFsaWFzZXMgaW4gc2VsZWN0IGNsYXVzZS4gQWxpYXNlcyBpbgorV0hFUkUgYW5kIE9SREVSIEJZIGNsYXVzZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIFNlZSB0aGUKK2xpbms6I3NlbGVjdFN0bXRbc2VjdGlvbiBvbiBzZWxlY3RdIGZvciBkZXRhaWxzLgorKiBgQ1JFQVRFYCBzdGF0ZW1lbnRzIGZvciBgS0VZU1BBQ0VgLCBgVEFCTEVgIGFuZCBgSU5ERVhgIG5vdyBzdXBwb3J0cworYW4gYElGIE5PVCBFWElTVFNgIGNvbmRpdGlvbi4gU2ltaWxhcmx5LCBgRFJPUGAgc3RhdGVtZW50cyBzdXBwb3J0IGEKK2BJRiBFWElTVFNgIGNvbmRpdGlvbi4KKyogYElOU0VSVGAgc3RhdGVtZW50cyBvcHRpb25hbGx5IHN1cHBvcnRzIGEgYElGIE5PVCBFWElTVFNgIGNvbmRpdGlvbgorYW5kIGBVUERBVEVgIHN1cHBvcnRzIGBJRmAgY29uZGl0aW9ucy4KKworPT09PSAzLjAuNQorCisqIGBTRUxFQ1RgLCBgVVBEQVRFYCwgYW5kIGBERUxFVEVgIHN0YXRlbWVudHMgbm93IGFsbG93IGVtcHR5IGBJTmAKK3JlbGF0aW9ucyAoc2VlCitodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS01NjI2KVtDQVNTQU5EUkEtNTYyNl0uCisKKz09PT0gMy4wLjQKKworKiBVcGRhdGVkIHRoZSBzeW50YXggZm9yIGN1c3RvbSBsaW5rOiNjcmVhdGVJbmRleFN0bXRbc2Vjb25kYXJ5CitpbmRleGVzXS4KKyogTm9uLWVxdWFsIGNvbmRpdGlvbiBvbiB0aGUgcGFydGl0aW9uIGtleSBhcmUgbm93IG5ldmVyIHN1cHBvcnRlZCwgZXZlbgorZm9yIG9yZGVyaW5nIHBhcnRpdGlvbmVyIGFzIHRoaXMgd2FzIG5vdCBjb3JyZWN0ICh0aGUgb3JkZXIgd2FzICpub3QqCit0aGUgb25lIG9mIHRoZSB0eXBlIG9mIHRoZSBwYXJ0aXRpb24ga2V5KS4gSW5zdGVhZCwgdGhlIGB0b2tlbmAgbWV0aG9kCitzaG91bGQgYWx3YXlzIGJlIHVzZWQgZm9yIHJhbmdlIHF1ZXJpZXMgb24gdGhlIHBhcnRpdGlvbiBrZXkgKHNlZQorbGluazojc2VsZWN0V2hlcmVbV0hFUkUgY2xhdXNlc10gKS4KKworPT09PSAzLjAuMworCisqIFN1cHBvcnQgZm9yIGN1c3RvbSBsaW5rOiNjcmVhdGVJbmRleFN0bXRbc2Vjb25kYXJ5IGluZGV4ZXNdIGhhcyBiZWVuCithZGRlZC4KKworPT09PSAzLjAuMgorCisqIFR5cGUgdmFsaWRhdGlvbiBmb3IgdGhlIGxpbms6I2NvbnN0YW50c1tjb25zdGFudHNdIGhhcyBiZWVuIGZpeGVkLiBGb3IKK2luc3RhbmNlLCB0aGUgaW1wbGVtZW50YXRpb24gdXNlZCB0byBhbGxvdyBgJzInYCBhcyBhIHZhbGlkIHZhbHVlIGZvciBhbgorYGludGAgY29sdW1uIChpbnRlcnByZXRpbmcgaXQgaGFzIHRoZSBlcXVpdmFsZW50IG9mIGAyYCksIG9yIGA0MmAgYXMgYQordmFsaWQgYGJsb2JgIHZhbHVlIChpbiB3aGljaCBjYXNlIGA0MmAgd2FzIGludGVycHJldGVkIGFzIGFuIGhleGFkZWNpbWFsCityZXByZXNlbnRhdGlvbiBvZiB0aGUgYmxvYikuIFRoaXMgaXMgbm8gbG9uZ2VyIHRoZSBjYXNlLCB0eXBlIHZhbGlkYXRpb24KK29mIGNvbnN0YW50cyBpcyBub3cgbW9yZSBzdHJpY3QuIFNlZSB0aGUgbGluazojdHlwZXNbZGF0YSB0eXBlc10gc2VjdGlvbgorZm9yIGRldGFpbHMgb24gd2hpY2ggY29uc3RhbnQgaXMgYWxsb3dlZCBmb3Igd2hpY2ggdHlwZS4KKyogVGhlIHR5cGUgdmFsaWRhdGlvbiBmaXhlZCBvZiB0aGUgcHJldmlvdXMgcG9pbnQgaGFzIGxlYWQgdG8gdGhlCitpbnRyb2R1Y3Rpb24gb2YgbGluazojY29uc3RhbnRzW2Jsb2JzIGNvbnN0YW50c10gdG8gYWxsb3cgaW5wdXRpbmcKK2Jsb2JzLiBEbyBub3RlIHRoYXQgd2hpbGUgaW5wdXRpbmcgYmxvYnMgYXMgc3RyaW5ncyBjb25zdGFudCBpcyBzdGlsbAorc3VwcG9ydGVkIGJ5IHRoaXMgdmVyc2lvbiAodG8gYWxsb3cgc21vb3RoZXIgdHJhbnNpdGlvbiB0byBibG9iCitjb25zdGFudCksIGl0IGlzIG5vdyBkZXByZWNhdGVkIChpbiBwYXJ0aWN1bGFyIHRoZSBsaW5rOiN0eXBlc1tkYXRhCit0eXBlc10gc2VjdGlvbiBkb2VzIG5vdCBsaXN0IHN0cmluZ3MgY29uc3RhbnRzIGFzIHZhbGlkIGJsb2JzKSBhbmQgd2lsbAorYmUgcmVtb3ZlZCBieSBhIGZ1dHVyZSB2ZXJzaW9uLiBJZiB5b3Ugd2VyZSB1c2luZyBzdHJpbmdzIGFzIGJsb2JzLCB5b3UKK3Nob3VsZCB0aHVzIHVwZGF0ZSB5b3VyIGNsaWVudCBjb2RlIEFTQVAgdG8gc3dpdGNoIGJsb2IgY29uc3RhbnRzLgorKiBBIG51bWJlciBvZiBmdW5jdGlvbnMgdG8gY29udmVydCBuYXRpdmUgdHlwZXMgdG8gYmxvYnMgaGF2ZSBhbHNvIGJlZW4KK2ludHJvZHVjZWQuIEZ1cnRoZXJtb3JlIHRoZSB0b2tlbiBmdW5jdGlvbiBpcyBub3cgYWxzbyBhbGxvd2VkIGluIHNlbGVjdAorY2xhdXNlcy4gU2VlIHRoZSBsaW5rOiNmdW5jdGlvbnNbc2VjdGlvbiBvbiBmdW5jdGlvbnNdIGZvciBkZXRhaWxzLgorCis9PT09IDMuMC4xCisKKyogbGluazojdXNpbmd0aW1lc3RhbXBzW0RhdGUgc3RyaW5nc10gKGFuZCB0aW1lc3RhbXBzKSBhcmUgbm8gbG9uZ2VyCithY2NlcHRlZCBhcyB2YWxpZCBgdGltZXV1aWRgIHZhbHVlcy4gRG9pbmcgc28gd2FzIGEgYnVnIGluIHRoZSBzZW5zZQordGhhdCBkYXRlIHN0cmluZyBhcmUgbm90IHZhbGlkIGB0aW1ldXVpZGAsIGFuZCBpdCB3YXMgdGh1cyByZXN1bHRpbmcgaW4KK2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTQ5MzZbY29uZnVzaW5nCitiZWhhdmlvcnNdLiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5ldyBtZXRob2RzIGhhdmUgYmVlbiBhZGRlZCB0byBoZWxwCit3b3JraW5nIHdpdGggYHRpbWV1dWlkYDogYG5vd2AsIGBtaW5UaW1ldXVpZGAsIGBtYXhUaW1ldXVpZGAgLCBgZGF0ZU9mYAorYW5kIGB1bml4VGltZXN0YW1wT2ZgLiBTZWUgdGhlIGxpbms6I3RpbWV1dWlkRnVuW3NlY3Rpb24gZGVkaWNhdGVkIHRvCit0aGVzZSBtZXRob2RzXSBmb3IgbW9yZSBkZXRhaWwuCisqIGBgRmxvYXQgY29uc3RhbnRzJycjY29uc3RhbnRzIG5vdyBzdXBwb3J0IHRoZSBleHBvbmVudCBub3RhdGlvbi4gSW4KK290aGVyIHdvcmRzLCBgNC4yRTEwYCBpcyBub3cgYSB2YWxpZCBmbG9hdGluZyBwb2ludCB2YWx1ZS4KKworPT09IFZlcnNpb25pbmcKKworVmVyc2lvbmluZyBvZiB0aGUgQ1FMIGxhbmd1YWdlIGFkaGVyZXMgdG8gdGhlIGh0dHA6Ly9zZW12ZXIub3JnW1NlbWFudGljCitWZXJzaW9uaW5nXSBndWlkZWxpbmVzLiBWZXJzaW9ucyB0YWtlIHRoZSBmb3JtIFguWS5aIHdoZXJlIFgsIFksIGFuZCBaCithcmUgaW50ZWdlciB2YWx1ZXMgcmVwcmVzZW50aW5nIG1ham9yLCBtaW5vciwgYW5kIHBhdGNoIGxldmVsCityZXNwZWN0aXZlbHkuIFRoZXJlIGlzIG5vIGNvcnJlbGF0aW9uIGJldHdlZW4gQ2Fzc2FuZHJhIHJlbGVhc2UgdmVyc2lvbnMKK2FuZCB0aGUgQ1FMIGxhbmd1YWdlIHZlcnNpb24uCisKK1tjb2xzPSIsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3x2ZXJzaW9uIHxkZXNjcmlwdGlvbgorfE1ham9yIHxUaGUgbWFqb3IgdmVyc2lvbiBfbXVzdF8gYmUgYnVtcGVkIHdoZW4gYmFja3dhcmQgaW5jb21wYXRpYmxlCitjaGFuZ2VzIGFyZSBpbnRyb2R1Y2VkLiBUaGlzIHNob3VsZCByYXJlbHkgb2NjdXIuCisKK3xNaW5vciB8TWlub3IgdmVyc2lvbiBpbmNyZW1lbnRzIG9jY3VyIHdoZW4gbmV3LCBidXQgYmFja3dhcmQKK2NvbXBhdGlibGUsIGZ1bmN0aW9uYWxpdHkgaXMgaW50cm9kdWNlZC4KKworfFBhdGNoIHxUaGUgcGF0Y2ggdmVyc2lvbiBpcyBpbmNyZW1lbnRlZCB3aGVuIGJ1Z3MgYXJlIGZpeGVkLgorfD09PQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL2RkbC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL2RkbC5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiOTA1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvZGRsLmFkb2MKQEAgLTAsMCArMSw4MDYgQEAKKz0gRGF0YSBEZWZpbml0aW9uCis6dGFiczoKKworQ1FMIHN0b3JlcyBkYXRhIGluIF90YWJsZXNfLCB3aG9zZSBzY2hlbWEgZGVmaW5lcyB0aGUgbGF5b3V0IG9mIHRoZQorZGF0YSBpbiB0aGUgdGFibGUuIFRhYmxlcyBhcmUgbG9jYXRlZCBpbiBfa2V5c3BhY2VzXy4gCitBIGtleXNwYWNlIGRlZmluZXMgb3B0aW9ucyB0aGF0IGFwcGx5IHRvIGFsbCB0aGUga2V5c3BhY2UncyB0YWJsZXMuIAorVGhlIHhyZWY6Y3FsL2RkbC5hZG9jI3JlcGxpY2F0aW9uLXN0cmF0ZWd5W3JlcGxpY2F0aW9uIHN0cmF0ZWd5XQoraXMgYW4gaW1wb3J0YW50IGtleXNwYWNlIG9wdGlvbiwgYXMgaXMgdGhlIHJlcGxpY2F0aW9uIGZhY3Rvci4gCitBIGdvb2QgZ2VuZXJhbCBydWxlIGlzIG9uZSBrZXlzcGFjZSBwZXIgYXBwbGljYXRpb24uCitJdCBpcyBjb21tb24gZm9yIGEgY2x1c3RlciB0byBkZWZpbmUgb25seSBvbmUga2V5c3BhY2UgZm9yIGFuIGFjdGl2ZSBhcHBsaWNhdGlvbi4KKworVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgc3RhdGVtZW50cyB1c2VkIHRvIGNyZWF0ZSwgbW9kaWZ5LCBhbmQgcmVtb3ZlCit0aG9zZSBrZXlzcGFjZSBhbmQgdGFibGVzLgorCis9PSBDb21tb24gZGVmaW5pdGlvbnMKKworVGhlIG5hbWVzIG9mIHRoZSBrZXlzcGFjZXMgYW5kIHRhYmxlcyBhcmUgZGVmaW5lZCBieSB0aGUgZm9sbG93aW5nCitncmFtbWFyOgorCitbc291cmNlLGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL2tzX3RhYmxlLmJuZltdCistLS0tCisKK0JvdGgga2V5c3BhY2UgYW5kIHRhYmxlIG5hbWUgc2hvdWxkIGJlIGNvbXByaXNlZCBvZiBvbmx5IGFscGhhbnVtZXJpYworY2hhcmFjdGVycywgY2Fubm90IGJlIGVtcHR5IGFuZCBhcmUgbGltaXRlZCBpbiBzaXplIHRvIDQ4IGNoYXJhY3RlcnMKKyh0aGF0IGxpbWl0IGV4aXN0cyBtb3N0bHkgdG8gYXZvaWQgZmlsZW5hbWVzICh3aGljaCBtYXkgaW5jbHVkZSB0aGUKK2tleXNwYWNlIGFuZCB0YWJsZSBuYW1lKSB0byBnbyBvdmVyIHRoZSBsaW1pdHMgb2YgY2VydGFpbiBmaWxlIHN5c3RlbXMpLgorQnkgZGVmYXVsdCwga2V5c3BhY2UgYW5kIHRhYmxlIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIChgbXlUYWJsZWAgaXMKK2VxdWl2YWxlbnQgdG8gYG15dGFibGVgKSBidXQgY2FzZSBzZW5zaXRpdml0eSBjYW4gYmUgZm9yY2VkIGJ5IHVzaW5nCitkb3VibGUtcXVvdGVzIChgIm15VGFibGUiYCBpcyBkaWZmZXJlbnQgZnJvbSBgbXl0YWJsZWApLgorCitGdXJ0aGVyLCBhIHRhYmxlIGlzIGFsd2F5cyBwYXJ0IG9mIGEga2V5c3BhY2UgYW5kIGEgdGFibGUgbmFtZSBjYW4gYmUKK3Byb3ZpZGVkIGZ1bGx5LXF1YWxpZmllZCBieSB0aGUga2V5c3BhY2UgaXQgaXMgcGFydCBvZi4gSWYgaXMgaXMgbm90CitmdWxseS1xdWFsaWZpZWQsIHRoZSB0YWJsZSBpcyBhc3N1bWVkIHRvIGJlIGluIHRoZSBfY3VycmVudF8ga2V5c3BhY2UKKyhzZWUgeHJlZjpjcWwvZGRsLmFkb2MjdXNlLXN0YXRlbWVudFtVU0VdIHN0YXRlbWVudCkuCisKK0Z1cnRoZXIsIHRoZSB2YWxpZCBuYW1lcyBmb3IgY29sdW1ucyBhcmUgZGVmaW5lZCBhczoKKworW3NvdXJjZSxibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9jb2x1bW4uYm5mW10KKy0tLS0KKworV2UgYWxzbyBkZWZpbmUgdGhlIG5vdGlvbiBvZiBzdGF0ZW1lbnQgb3B0aW9ucyBmb3IgdXNlIGluIHRoZSBmb2xsb3dpbmcKK3NlY3Rpb246CisKK1tzb3VyY2UsYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvb3B0aW9ucy5ibmZbXQorLS0tLQorCitbW2NyZWF0ZS1rZXlzcGFjZS1zdGF0ZW1lbnRdXQorPT0gQ1JFQVRFIEtFWVNQQUNFCisKK0Ega2V5c3BhY2UgaXMgY3JlYXRlZCB3aXRoIGEgYENSRUFURSBLRVlTUEFDRWAgc3RhdGVtZW50OgorCitbc291cmNlLGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL2NyZWF0ZV9rcy5ibmZbXQorLS0tLQorCitGb3IgZXhhbXBsZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9jcmVhdGVfa3MuY3FsW10KKy0tLS0KKworQXR0ZW1wdGluZyB0byBjcmVhdGUgYSBrZXlzcGFjZSB0aGF0IGFscmVhZHkgZXhpc3RzIHdpbGwgcmV0dXJuIGFuIGVycm9yCit1bmxlc3MgdGhlIGBJRiBOT1QgRVhJU1RTYCBvcHRpb24gaXMgdXNlZC4gSWYgaXQgaXMgdXNlZCwgdGhlIHN0YXRlbWVudAord2lsbCBiZSBhIG5vLW9wIGlmIHRoZSBrZXlzcGFjZSBhbHJlYWR5IGV4aXN0cy4KKworVGhlIHN1cHBvcnRlZCBgb3B0aW9uc2AgYXJlOgorCitbY29scz0iLCwsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8bmFtZSB8IGtpbmQgfCBtYW5kYXRvcnkgfCBkZWZhdWx0IHwgZGVzY3JpcHRpb24KK3xgcmVwbGljYXRpb25gIHwgX21hcF8gfCB5ZXMgfCBuL2EgfCBUaGUgcmVwbGljYXRpb24gc3RyYXRlZ3kgYW5kIG9wdGlvbnMgdG8gdXNlIGZvciB0aGUga2V5c3BhY2UgKHNlZQorZGV0YWlscyBiZWxvdykuCit8YGR1cmFibGVfd3JpdGVzYCB8IF9zaW1wbGVfIHwgbm8gfCB0cnVlIHwgV2hldGhlciB0byB1c2UgdGhlIGNvbW1pdCBsb2cgZm9yIHVwZGF0ZXMgb24gdGhpcyBrZXlzcGFjZSAoZGlzYWJsZSB0aGlzCitvcHRpb24gYXQgeW91ciBvd24gcmlzayEpLgorfD09PQorCitUaGUgYHJlcGxpY2F0aW9uYCBwcm9wZXJ0eSBpcyBtYW5kYXRvcnkgYW5kIG11c3QgY29udGFpbiB0aGUgYCdjbGFzcydgIHN1Yi1vcHRpb24gdGhhdCBkZWZpbmVzIHRoZSBkZXNpcmVkCit4cmVmOmNxbC9kZGwuYWRvYyNyZXBsaWNhdGlvbi1zdHJhdGVneVtyZXBsaWNhdGlvbiBzdHJhdGVneV0gY2xhc3MuIAorVGhlIHJlc3Qgb2YgdGhlIHN1Yi1vcHRpb25zIGRlcGVuZCBvbiB3aGljaCByZXBsaWNhdGlvbiBzdHJhdGVneSBpcyB1c2VkLiAKK0J5IGRlZmF1bHQsIENhc3NhbmRyYSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGAnY2xhc3MnYCB2YWx1ZXM6CisKK1tbcmVwbGljYXRpb24tc3RyYXRlZ3ldXQorPT09IGBTaW1wbGVTdHJhdGVneWAKKworQSBzaW1wbGUgc3RyYXRlZ3kgdGhhdCBkZWZpbmVzIGEgcmVwbGljYXRpb24gZmFjdG9yIGZvciBkYXRhIHRvIGJlCitzcHJlYWQgYWNyb3NzIHRoZSBlbnRpcmUgY2x1c3Rlci4gVGhpcyBpcyBnZW5lcmFsbHkgbm90IGEgd2lzZSBjaG9pY2UKK2ZvciBwcm9kdWN0aW9uLCBhcyBpdCBkb2VzIG5vdCByZXNwZWN0IGRhdGFjZW50ZXIgbGF5b3V0cyBhbmQgY2FuCitsZWFkIHRvIHdpbGRseSB2YXJ5aW5nIHF1ZXJ5IGxhdGVuY3kuIEZvciBwcm9kdWN0aW9uLCB1c2UKK2BOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneWAuIGBTaW1wbGVTdHJhdGVneWAgc3VwcG9ydHMgYSBzaW5nbGUKK21hbmRhdG9yeSBhcmd1bWVudDoKKworW2NvbHM9IiwsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8c3ViLW9wdGlvbiB8dHlwZSB8c2luY2UgfGRlc2NyaXB0aW9uCit8YCdyZXBsaWNhdGlvbl9mYWN0b3InYCB8IGludCB8IGFsbCB8IFRoZSBudW1iZXIgb2YgcmVwbGljYXMgdG8gc3RvcmUgcGVyIHJhbmdlCit8PT09CisKKz09PSBgTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3lgCisKK0EgcHJvZHVjdGlvbi1yZWFkeSByZXBsaWNhdGlvbiBzdHJhdGVneSB0aGF0IHNldHMgdGhlCityZXBsaWNhdGlvbiBmYWN0b3IgaW5kZXBlbmRlbnRseSBmb3IgZWFjaCBkYXRhLWNlbnRlci4gVGhlIHJlc3Qgb2YgdGhlCitzdWItb3B0aW9ucyBhcmUga2V5LXZhbHVlIHBhaXJzLCB3aXRoIGEga2V5IHNldCB0byBhIGRhdGEtY2VudGVyIG5hbWUgYW5kCitpdHMgdmFsdWUgc2V0IHRvIHRoZSBhc3NvY2lhdGVkIHJlcGxpY2F0aW9uIGZhY3Rvci4gT3B0aW9uczoKKworW2NvbHM9IiwsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8c3ViLW9wdGlvbiB8dHlwZSB8ZGVzY3JpcHRpb24KK3xgJzxkYXRhY2VudGVyPidgIHwgaW50IHwgVGhlIG51bWJlciBvZiByZXBsaWNhcyB0byBzdG9yZSBwZXIgcmFuZ2UgaW4gdGhlIHByb3ZpZGVkIGRhdGFjZW50ZXIuCit8YCdyZXBsaWNhdGlvbl9mYWN0b3InYCB8IGludCB8IFRoZSBudW1iZXIgb2YgcmVwbGljYXMgdG8gdXNlIGFzIGEgZGVmYXVsdCBwZXIgZGF0YWNlbnRlciBpZiBub3QKK3NwZWNpZmljYWxseSBwcm92aWRlZC4gTm90ZSB0aGF0IHRoaXMgYWx3YXlzIGRlZmVycyB0byBleGlzdGluZworZGVmaW5pdGlvbnMgb3IgZXhwbGljaXQgZGF0YWNlbnRlciBzZXR0aW5ncy4gRm9yIGV4YW1wbGUsIHRvIGhhdmUgdGhyZWUKK3JlcGxpY2FzIHBlciBkYXRhY2VudGVyLCBzZXQgYSB2YWx1ZSBvZiAzLgorfD09PQorCitXaGVuIGxhdGVyIGFsdGVyaW5nIGtleXNwYWNlcyBhbmQgY2hhbmdpbmcgdGhlIGByZXBsaWNhdGlvbl9mYWN0b3JgLAorYXV0by1leHBhbnNpb24gd2lsbCBvbmx5IF9hZGRfIG5ldyBkYXRhY2VudGVycyBmb3Igc2FmZXR5LCBpdCB3aWxsIG5vdAorYWx0ZXIgZXhpc3RpbmcgZGF0YWNlbnRlcnMgb3IgcmVtb3ZlIGFueSwgZXZlbiBpZiB0aGV5IGFyZSBubyBsb25nZXIgaW4KK3RoZSBjbHVzdGVyLiBJZiB5b3Ugd2FudCB0byByZW1vdmUgZGF0YWNlbnRlcnMgd2hpbGUgc2V0dGluZyB0aGUgCitgcmVwbGljYXRpb25fZmFjdG9yYCwgZXhwbGljaXRseSB6ZXJvIG91dCB0aGUgZGF0YWNlbnRlciB5b3Ugd2FudCB0bworaGF2ZSB6ZXJvIHJlcGxpY2FzLgorCitBbiBleGFtcGxlIG9mIGF1dG8tZXhwYW5kaW5nIGRhdGFjZW50ZXJzIHdpdGggdHdvIGRhdGFjZW50ZXJzOiBgREMxYCBhbmQKK2BEQzJgOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2F1dG9leHBhbmRfa3MuY3FsW10KKy0tLS0KK3dpbGwgcmVzdWx0IGluOgorW3NvdXJjZSxwbGFpbnRleHRdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvYXV0b2V4cGFuZF9rcy5yZXN1bHRbXQorLS0tLQorCitBbiBleGFtcGxlIG9mIGF1dG8tZXhwYW5kaW5nIGFuZCBvdmVycmlkaW5nIGEgZGF0YWNlbnRlcjoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9hdXRvZXhwYW5kX2tzX292ZXJyaWRlLmNxbFtdCistLS0tCit3aWxsIHJlc3VsdCBpbjoKK1tzb3VyY2UscGxhaW50ZXh0XQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL2F1dG9leHBhbmRfa3Nfb3ZlcnJpZGUucmVzdWx0W10KKy0tLS0KKworQW4gZXhhbXBsZSB0aGF0IGV4Y2x1ZGVzIGEgZGF0YWNlbnRlciB3aGlsZSB1c2luZyBgcmVwbGljYXRpb25fZmFjdG9yYDoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9hdXRvZXhwYW5kX2V4Y2x1ZGVfZGMuY3FsW10KKy0tLS0KK3dpbGwgcmVzdWx0IGluOgorW3NvdXJjZSxwbGFpbnRleHRdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvYXV0b2V4cGFuZF9leGNsdWRlX2RjLnJlc3VsdFtdCistLS0tCisKK0lmIHhyZWY6bmV3L3RyYW5zaWVudHJlcGxpY2F0aW9uLmFkb2NbdHJhbnNpZW50IHJlcGxpY2F0aW9uXSBoYXMgYmVlbiBlbmFibGVkLCB0cmFuc2llbnQgcmVwbGljYXMgY2FuIGJlCitjb25maWd1cmVkIGZvciBib3RoIGBTaW1wbGVTdHJhdGVneWAgYW5kIGBOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneWAgYnkKK2RlZmluaW5nIHJlcGxpY2F0aW9uIGZhY3RvcnMgaW4gdGhlIGZvcm1hdAorYCc8dG90YWxfcmVwbGljYXM+Lzx0cmFuc2llbnRfcmVwbGljYXM+J2AKKworRm9yIGluc3RhbmNlLCB0aGlzIGtleXNwYWNlIHdpbGwgaGF2ZSAzIHJlcGxpY2FzIGluIERDMSwgMSBvZiB3aGljaCBpcwordHJhbnNpZW50LCBhbmQgNSByZXBsaWNhcyBpbiBEQzIsIDIgb2Ygd2hpY2ggYXJlIHRyYW5zaWVudDoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9jcmVhdGVfa3NfdHJhbnNfcmVwbC5jcWxbXQorLS0tLQorCitbW3VzZS1zdGF0ZW1lbnRdXQorPT0gVVNFCisKK1RoZSBgVVNFYCBzdGF0ZW1lbnQgY2hhbmdlcyB0aGUgX2N1cnJlbnRfIGtleXNwYWNlIHRvIHRoZSBzcGVjaWZpZWQga2V5c3BhY2UuIAorQSBudW1iZXIgb2Ygb2JqZWN0cyBpbiBDUUwgYXJlIGJvdW5kIHRvIGEga2V5c3BhY2UgKHRhYmxlcywgdXNlci1kZWZpbmVkIHR5cGVzLCBmdW5jdGlvbnMsIGV0Yy4pIGFuZCB0aGUKK2N1cnJlbnQga2V5c3BhY2UgaXMgdGhlIGRlZmF1bHQga2V5c3BhY2UgdXNlZCB3aGVuIHRob3NlIG9iamVjdHMgYXJlCityZWZlcnJlZCB0byBpbiBhIHF1ZXJ5IHdpdGhvdXQgYSBmdWxseS1xdWFsaWZpZWQgbmFtZSAod2l0aG91dCBhIHByZWZpeGVkIGtleXNwYWNlIG5hbWUpLiAKK0EgYFVTRWAgc3RhdGVtZW50IHNwZWNpZmllcyB0aGUga2V5c3BhY2UgdG8gdXNlIGFzIGFuIGFyZ3VtZW50OgorCitbc291cmNlLGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL3VzZV9rcy5ibmZbXQorLS0tLQorVXNpbmcgQ1FMOgorW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC91c2Vfa3MuY3FsW10KKy0tLS0KKworW1thbHRlci1rZXlzcGFjZS1zdGF0ZW1lbnRdXQorPT0gQUxURVIgS0VZU1BBQ0UKKworQW4gYEFMVEVSIEtFWVNQQUNFYCBzdGF0ZW1lbnQgbW9kaWZpZXMgdGhlIG9wdGlvbnMgb2YgYSBrZXlzcGFjZToKKworW3NvdXJjZSxibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9hbHRlcl9rcy5ibmZbXQorLS0tLQorCitGb3IgZXhhbXBsZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9hbHRlcl9rcy5jcWxbXQorLS0tLQorSWYgdGhlIGtleXNwYWNlIGRvZXMgbm90IGV4aXN0LCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLCB1bmxlc3MgYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KK1RoZSBzdXBwb3J0ZWQgb3B0aW9ucyBhcmUgdGhlIHNhbWUgYXMgZm9yIHhyZWY6Y3FsL2RkbC5hZG9jI2NyZWF0ZS1rZXlzcGFjZS1zdGF0ZW1lbnRbY3JlYXRpbmcgYSBrZXlzcGFjZV0uCisKK1tbZHJvcC1rZXlzcGFjZS1zdGF0ZW1lbnRdXQorPT0gRFJPUCBLRVlTUEFDRQorCitEcm9wcGluZyBhIGtleXNwYWNlIGlzIGRvbmUgd2l0aCB0aGUgYERST1AgS0VZU1BBQ0VgIHN0YXRlbWVudDoKKworW3NvdXJjZSxibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9kcm9wX2tzLmJuZltdCistLS0tCisKK0ZvciBleGFtcGxlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2Ryb3Bfa3MuY3FsW10KKy0tLS0KKworRHJvcHBpbmcgYSBrZXlzcGFjZSByZXN1bHRzIGluIHRoZSBpbW1lZGlhdGUsIGlycmV2ZXJzaWJsZSByZW1vdmFsIG9mCit0aGF0IGtleXNwYWNlLCBpbmNsdWRpbmcgYWxsIHRoZSB0YWJsZXMsIHVzZXItZGVmaW5lZCB0eXBlcywgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucywgYW5kCithbGwgdGhlIGRhdGEgY29udGFpbmVkIGluIHRob3NlIHRhYmxlcy4KKworSWYgdGhlIGtleXNwYWNlIGRvZXMgbm90IGV4aXN0cywgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwKK3VubGVzcyBgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgorCitbW2NyZWF0ZS10YWJsZS1zdGF0ZW1lbnRdXQorPT0gQ1JFQVRFIFRBQkxFCisKK0NyZWF0aW5nIGEgbmV3IHRhYmxlIHVzZXMgdGhlIGBDUkVBVEUgVEFCTEVgIHN0YXRlbWVudDoKKworW3NvdXJjZSxibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9jcmVhdGVfdGFibGUuYm5mW10KKy0tLS0KKworRm9yIGV4YW1wbGUsIGhlcmUgYXJlIHNvbWUgQ1FMIHN0YXRlbWVudHMgdG8gY3JlYXRlIHRhYmxlczoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9jcmVhdGVfdGFibGUuY3FsW10KKy0tLS0KKworQSBDUUwgdGFibGUgaGFzIGEgbmFtZSBhbmQgaXMgY29tcG9zZWQgb2YgYSBzZXQgb2YgX3Jvd3NfLiAKK0NyZWF0aW5nIGEgdGFibGUgYW1vdW50cyB0byBkZWZpbmluZyB3aGljaCB4cmVmOmNxbC9kZGwuYWRvYyNjb2x1bW4tZGVmaW5pdGlvbltjb2x1bW5zXSBlYWNoIHJvd3Mgd2lsbCBoYXZlLCAKK3doaWNoIG9mIHRob3NlIGNvbHVtbnMgY29tcHJpc2UgdGhlIHhyZWY6Y3FsL2RkbC5hZG9jI3ByaW1hcnkta2V5W3ByaW1hcnkga2V5XSwgYXMgd2VsbCBhcyBkZWZpbmVkCit4cmVmOmNxbC9kZGwuYWRvYyNjcmVhdGUtdGFibGUtb3B0aW9uc1tvcHRpb25zXSBmb3IgdGhlIHRhYmxlLgorCitBdHRlbXB0aW5nIHRvIGNyZWF0ZSBhbiBhbHJlYWR5IGV4aXN0aW5nIHRhYmxlIHdpbGwgcmV0dXJuIGFuIGVycm9yCit1bmxlc3MgdGhlIGBJRiBOT1QgRVhJU1RTYCBkaXJlY3RpdmUgaXMgdXNlZC4gSWYgaXQgaXMgdXNlZCwgdGhlCitzdGF0ZW1lbnQgd2lsbCBiZSBhIG5vLW9wIGlmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0cy4KKworW1tjb2x1bW4tZGVmaW5pdGlvbl1dCis9PT0gQ29sdW1uIGRlZmluaXRpb25zCisKK0V2ZXJ5IHJvdyBpbiBhIENRTCB0YWJsZSB3aWxsIGhhdmUgdGhlIHByZWRlZmluZWQgY29sdW1ucyBkZWZpbmVkIGF0IHRhYmxlIGNyZWF0aW9uLiAKK0NvbHVtbnMgY2FuIGJlIGFkZGVkIGxhdGVyIHVzaW5nIGFuIHhyZWY6Y3FsL2RkbC5hZG9jI2FsdGVyLXRhYmxlLXN0YXRlbWVudFthbHRlciBzdGF0ZW1lbnRdLgorCitBIGBjb2x1bW5fZGVmaW5pdGlvbmAgaXMgY29tcHJpc2VkIG9mIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gYW5kIGl0cyB4cmVmOmNxbC9kZGwuYWRvYyNkYXRhLXR5cGVbdHlwZV0sIAorcmVzdHJpY3RpbmcgdGhlICB2YWx1ZXMgdGhhdCBhcmUgYWNjZXB0ZWQgZm9yIHRoYXQgY29sdW1uLiBBZGRpdGlvbmFsbHksIGEgY29sdW1uIGRlZmluaXRpb24gY2FuIGhhdmUgdGhlCitmb2xsb3dpbmcgbW9kaWZpZXJzOgorCisqIGBTVEFUSUNgOiBkZWNsYXJlcyB0aGUgY29sdW1uIGFzIGEgeHJlZjpjcWwvZGRsLmFkb2Mjc3RhdGljLWNvbHVtbltzdGF0aWMgY29sdW1uXQorKiBgUFJJTUFSWSBLRVlgOiBkZWNsYXJlcyB0aGUgY29sdW1uIGFzIHRoZSBzb2xlIGNvbXBvbmVudCBvZiB0aGUgeHJlZjpjcWwvZGRsLmFkb2MjcHJpbWFyeS1rZXlbcHJpbWFyeSBrZXldIG9mIHRoZSB0YWJsZQorCitbW3N0YXRpYy1jb2x1bW5dXQorPT09PSBTdGF0aWMgY29sdW1ucworCitTb21lIGNvbHVtbnMgY2FuIGJlIGRlY2xhcmVkIGFzIGBTVEFUSUNgIGluIGEgdGFibGUgZGVmaW5pdGlvbi4gQSBjb2x1bW4KK3RoYXQgaXMgc3RhdGljIHdpbGwgYmUg4oCcc2hhcmVk4oCdIGJ5IGFsbCB0aGUgcm93cyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUKK3BhcnRpdGlvbiAoaGF2aW5nIHRoZSBzYW1lIHhyZWY6Y3FsL2RkbC5hZG9jI3BhcnRpdGlvbi1rZXlbcGFydGl0aW9uIGtleV0uIAorCitGb3IgZXhhbXBsZToKKworW3t0YWJzfV0gCis9PT09IAorQ29kZTo6IAorKyAKKy0tIAorW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9jcmVhdGVfc3RhdGljX2NvbHVtbi5jcWxbXQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvaW5zZXJ0X3N0YXRpY19kYXRhLmNxbFtdCitpbmNsdWRlOjpleGFtcGxlJENRTC9zZWxlY3Rfc3RhdGljX2RhdGEuY3FsW10KKy0tLS0KKy0tCisKK1Jlc3VsdHM6OgorKworLS0KK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL3NlbGVjdF9zdGF0aWNfZGF0YS5yZXN1bHRbXQorLS0tLQorLS0KKz09PT0KKworQXMgY2FuIGJlIHNlZW4sIHRoZSBgc2AgdmFsdWUgaXMgdGhlIHNhbWUgKGBzdGF0aWMxYCkgZm9yIGJvdGggb2YgdGhlCityb3dzIGluIHRoZSBwYXJ0aXRpb24gKHRoZSBwYXJ0aXRpb24ga2V5IGJlaW5nIGBwa2AsIGFuZCBib3RoCityb3dzIGFyZSBpbiB0aGUgc2FtZSBwYXJ0aXRpb24pOiB0aGUgc2Vjb25kIGluc2VydGlvbiBvdmVycmlkZXMgdGhlCit2YWx1ZSBmb3IgYHNgLgorCitUaGUgdXNlIG9mIHN0YXRpYyBjb2x1bW5zIGhhcyB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworKiBBIHRhYmxlIHdpdGhvdXQgY2x1c3RlcmluZyBjb2x1bW5zIGNhbm5vdCBoYXZlIHN0YXRpYyBjb2x1bW5zLiAKK0luIGEgdGFibGUgd2l0aG91dCBjbHVzdGVyaW5nIGNvbHVtbnMsIGV2ZXJ5IHBhcnRpdGlvbiBoYXMgb25seSBvbmUgcm93LCBhbmQKK3NvIGV2ZXJ5IGNvbHVtbiBpcyBpbmhlcmVudGx5IHN0YXRpYykKKyogT25seSBub24tcHJpbWFyeSBrZXkgY29sdW1ucyBjYW4gYmUgc3RhdGljLgorCitbW3ByaW1hcnkta2V5XV0KKz09PSBUaGUgUHJpbWFyeSBrZXkKKworV2l0aGluIGEgdGFibGUsIGEgcm93IGlzIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgaXRzIGBQUklNQVJZIEtFWWAsIGFuZAoraGVuY2UgYWxsIHRhYmxlcyAqbXVzdCogZGVmaW5lIGEgc2luZ2xlIFBSSU1BUlkgS0VZLiAKK0EgYFBSSU1BUlkgS0VZYCBpcyBjb21wb3NlZCBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgZGVmaW5lZCBjb2x1bW5zIGluIHRoZSB0YWJsZS4gCitTeW50YWN0aWNhbGx5LCB0aGUgcHJpbWFyeSBrZXkgaXMgZGVmaW5lZCB3aXRoIHRoZSBwaHJhc2UgYFBSSU1BUlkgS0VZYCAKK2ZvbGxvd2VkIGJ5IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIGNvbHVtbiBuYW1lcyB3aXRoaW4gcGFyZW50aGVzaXMuCitJZiB0aGUgcHJpbWFyeSBrZXkgaGFzIG9ubHkgb25lIGNvbHVtbiwgeW91IGNhbiBhbHRlcm5hdGl2ZWx5IGFkZCB0aGUgYFBSSU1BUlkgS0VZYCBwaHJhc2UgdG8KK3RoYXQgY29sdW1uIGluIHRoZSB0YWJsZSBkZWZpbml0aW9uLiAKK1RoZSBvcmRlciBvZiB0aGUgY29sdW1ucyBpbiB0aGUgcHJpbWFyeSBrZXkgZGVmaW5pdGlvbiBkZWZpbmVzIHRoZSBwYXJ0aXRpb24ga2V5IGFuZCAKK2NsdXN0ZXJpbmcgY29sdW1ucy4KKworQSBDUUwgcHJpbWFyeSBrZXkgaXMgY29tcG9zZWQgb2YgdHdvIHBhcnRzOgorCit4cmVmOmNxbC9kZGwuYWRvYyNwYXJ0aXRpb24ta2V5W3BhcnRpdGlvbiBrZXldOjoKKyogSXQgaXMgdGhlIGZpcnN0IGNvbXBvbmVudCBvZiB0aGUgcHJpbWFyeSBrZXkgZGVmaW5pdGlvbi4gCitJdCBjYW4gYmUgYSBzaW5nbGUgY29sdW1uIG9yLCB1c2luZyBhbiBhZGRpdGlvbmFsIHNldCBvZiBwYXJlbnRoZXNpcywgY2FuIGJlIG11bHRpcGxlIGNvbHVtbnMuIAorQSB0YWJsZSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHBhcnRpdGlvbiBrZXksIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSB0YWJsZSBkZWZpbml0aW9uIGlzOgorKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9jcmVhdGVfdGFibGVfc2luZ2xlX3BrLmNxbFtdCistLS0tCit4cmVmOmNxbC9kZGwuYWRvYyNjbHVzdGVyaW5nLWNvbHVtbnNbY2x1c3RlcmluZyBjb2x1bW5zXTo6CisqIFRoZSBjb2x1bW5zIGFyZSB0aGUgY29sdW1ucyB0aGF0IGZvbGxvdyB0aGUgcGFydGl0aW9uIGtleSBpbiB0aGUgcHJpbWFyeSBrZXkgZGVmaW5pdGlvbi4KK1RoZSBvcmRlciBvZiB0aG9zZSBjb2x1bW5zIGRlZmluZSB0aGUgX2NsdXN0ZXJpbmcgb3JkZXJfLgorCitTb21lIGV4YW1wbGVzIG9mIHByaW1hcnkga2V5IGRlZmluaXRpb24gYXJlOgorCisqIGBQUklNQVJZIEtFWSAoYSlgOiBgYWAgaXMgdGhlIHNpbmdsZSBwYXJ0aXRpb24ga2V5IGFuZCB0aGVyZSBhcmUgbm8gY2x1c3RlcmluZyBjb2x1bW5zCisqIGBQUklNQVJZIEtFWSAoYSwgYiwgYylgIDogYGFgIGlzIHRoZSBzaW5nbGUgcGFydGl0aW9uIGtleSBhbmQgYGJgIGFuZCBgY2AgYXJlIHRoZSBjbHVzdGVyaW5nIGNvbHVtbnMKKyogYFBSSU1BUlkgS0VZICgoYSwgYiksIGMpYCA6IGBhYCBhbmQgYGJgIGNvbXBvc2UgdGhlIF9jb21wb3NpdGVfIHBhcnRpdGlvbiBrZXkgYW5kIGBjYCBpcyB0aGUgY2x1c3RlcmluZyBjb2x1bW4KKworW0lNUE9SVEFOVF0KKz09PT0KK1RoZSBwcmltYXJ5IGtleSB1bmlxdWVseSBpZGVudGlmaWVzIGEgcm93IGluIHRoZSB0YWJsZSwgYXMgZGVzY3JpYmVkIGFib3ZlLiAKK0EgY29uc2VxdWVuY2Ugb2YgdGhpcyB1bmlxdWVuZXNzIGlzIHRoYXQgaWYgYW5vdGhlciByb3cgaXMgaW5zZXJ0ZWQgdXNpbmcgdGhlIHNhbWUgcHJpbWFyeSBrZXksIAordGhlbiBhbiBgVVBTRVJUYCBvY2N1cnMgYW5kIGFuIGV4aXN0aW5nIHJvdyB3aXRoIHRoZSBzYW1lIHByaW1hcnkga2V5IGlzIHJlcGxhY2VkLiAKK0NvbHVtbnMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIHByaW1hcnkga2V5IGNhbm5vdCBkZWZpbmUgdW5pcXVlbmVzcy4KKz09PT0KKworW1twYXJ0aXRpb24ta2V5XV0KKz09PT0gUGFydGl0aW9uIGtleQorCitXaXRoaW4gYSB0YWJsZSwgQ1FMIGRlZmluZXMgdGhlIG5vdGlvbiBvZiBhIF9wYXJ0aXRpb25fIHRoYXQgZGVmaW5lcyB0aGUgbG9jYXRpb24gb2YgZGF0YSB3aXRoaW4gYSBDYXNzYW5kcmEgY2x1c3Rlci4KK0EgcGFydGl0aW9uIGlzIHRoZSBzZXQgb2Ygcm93cyB0aGF0IHNoYXJlIHRoZSBzYW1lIHZhbHVlIGZvciB0aGVpciBwYXJ0aXRpb24ga2V5LiAKKworTm90ZSB0aGF0IGlmIHRoZSBwYXJ0aXRpb24ga2V5IGlzIGNvbXBvc2VkIG9mIG11bHRpcGxlIGNvbHVtbnMsIHRoZW4gcm93cyBiZWxvbmcgdG8gdGhlIHNhbWUgcGFydGl0aW9uIAord2hlbiB0aGV5IGhhdmUgdGhlIHNhbWUgdmFsdWVzIGZvciBhbGwgdGhvc2UgcGFydGl0aW9uIGtleSBjb2x1bW5zLiAKK0EgaGFzaCBpcyBjb21wdXRlZCBmcm9tIHRoZSBwYXJ0aXRpb24ga2V5IGNvbHVtbnMgYW5kIHRoYXQgaGFzaCB2YWx1ZSBkZWZpbmVzIHRoZSBwYXJ0aXRpb24gbG9jYXRpb24uCitTbywgZm9yIGluc3RhbmNlLCBnaXZlbiB0aGUgZm9sbG93aW5nIHRhYmxlIGRlZmluaXRpb24gYW5kIGNvbnRlbnQ6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX3RhYmxlX2NvbXBvdW5kX3BrLmNxbFtdCitpbmNsdWRlOjpleGFtcGxlJENRTC9pbnNlcnRfdGFibGVfY29tcG91bmRfcGsuY3FsW10KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML3NlbGVjdF90YWJsZV9jb21wb3VuZF9way5jcWxbXQorLS0tLQorCit3aWxsIHJlc3VsdCBpbgorW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvc2VsZWN0X3RhYmxlX2NvbXBvdW5kX3BrLnJlc3VsdFtdCistLS0tCis8MT4gUm93cyAxIGFuZCAyIGFyZSBpbiB0aGUgc2FtZSBwYXJ0aXRpb24sIGJlY2F1c2UgYm90aCBjb2x1bW5zIGBhYCBhbmQgYGJgIGFyZSB6ZXJvLgorPDI+IFJvd3MgMyBhbmQgNCBhcmUgaW4gdGhlIHNhbWUgcGFydGl0aW9uLCBidXQgYSBkaWZmZXJlbnQgb25lLCBiZWNhdXNlIGNvbHVtbiBgYWAgaXMgemVybyBhbmQgY29sdW1uIGBiYCBpcyAxIGluIGJvdGggcm93cy4KKzwzPiBSb3cgNSBpcyBpbiBhIHRoaXJkIHBhcnRpdGlvbiBieSBpdHNlbGYsIGJlY2F1c2UgYm90aCBjb2x1bW5zIGBhYCBhbmQgYGJgIGFyZSAxLgorCitOb3RlIHRoYXQgYSB0YWJsZSBhbHdheXMgaGFzIGEgcGFydGl0aW9uIGtleSwgYW5kIHRoYXQgaWYgdGhlIHRhYmxlIGhhcworbm8gYGNsdXN0ZXJpbmcgY29sdW1uc2AsIHRoZW4gZXZlcnkgcGFydGl0aW9uIG9mIHRoYXQgdGFibGUgaGFzIGEgc2luZ2xlIHJvdy4KK2JlY2F1c2UgdGhlIHBhcnRpdGlvbiBrZXksIGNvbXBvdW5kIG9yIG90aGVyd2lzZSwgaWRlbnRpZmllcyBhIHNpbmdsZSBsb2NhdGlvbi4KKworVGhlIG1vc3QgaW1wb3J0YW50IHByb3BlcnR5IG9mIHBhcnRpdGlvbiBpcyB0aGF0IGFsbCB0aGUgcm93cyBiZWxvbmdpbmcKK3RvIHRoZSBzYW1lIHBhcnRpdGlvbiBhcmUgZ3VhcmFudGVlZCB0byBiZSBzdG9yZWQgb24gdGhlIHNhbWUgc2V0IG9mCityZXBsaWNhIG5vZGVzLiAKK0luIG90aGVyIHdvcmRzLCB0aGUgcGFydGl0aW9uIGtleSBvZiBhIHRhYmxlIGRlZmluZXMgd2hpY2ggcm93cyB3aWxsIGJlIGxvY2FsaXplZCBvbiB0aGUgc2FtZSAKK25vZGUgaW4gdGhlIGNsdXN0ZXIuIAorVGhlIGxvY2FsaXphdGlvbiBvZiBkYXRhIGlzIGltcG9ydGFudCB0byB0aGUgZWZmaWNpZW50IHJldHJpZXZhbCBvZiBkYXRhLCByZXF1aXJpbmcgdGhlIENhc3NhbmRyYSBjb29yZGluYXRvcgordG8gY29udGFjdCBhcyBmZXcgbm9kZXMgYXMgcG9zc2libGUuCitIb3dldmVyLCB0aGVyZSBpcyBhIGZsaXAtc2lkZSB0byB0aGlzIGd1YXJhbnRlZSwgYW5kIGFsbCByb3dzIHNoYXJpbmcgYSBwYXJ0aXRpb24ga2V5IHdpbGwgYmUgc3RvcmVkIG9uIHRoZSBzYW1lIAorbm9kZSwgY3JlYXRpbmcgYSBob3RzcG90IGZvciBib3RoIHJlYWRpbmcgYW5kIHdyaXRpbmcuCitXaGlsZSBzZWxlY3RpbmcgYSBwcmltYXJ5IGtleSB0aGF0IGdyb3VwcyB0YWJsZSByb3dzIGFzc2lzdHMgYmF0Y2ggdXBkYXRlcyBhbmQgY2FuIGVuc3VyZSB0aGF0IHRoZSB1cGRhdGVzIGFyZSAKK19hdG9taWNfIGFuZCBkb25lIGluIF9pc29sYXRpb25fLCB0aGUgcGFydGl0aW9ucyBtdXN0IGJlIHNpemVkICJqdXN0IHJpZ2h0LCBub3QgdG9vIGJpZyBub3IgdG9vIHNtYWxsIi4KKworRGF0YSBtb2RlbGluZyB0aGF0IGNvbnNpZGVycyB0aGUgcXVlcnlpbmcgcGF0dGVybnMgYW5kIGFzc2lnbnMgcHJpbWFyeSBrZXlzIGJhc2VkIG9uIHRoZSBxdWVyaWVzIHdpbGwgaGF2ZSB0aGUgbG93ZXN0IAorbGF0ZW5jeSBpbiBmZXRjaGluZyBkYXRhLgorCitbW2NsdXN0ZXJpbmctY29sdW1uc11dCis9PT09IENsdXN0ZXJpbmcgY29sdW1ucworCitUaGUgY2x1c3RlcmluZyBjb2x1bW5zIG9mIGEgdGFibGUgZGVmaW5lIHRoZSBjbHVzdGVyaW5nIG9yZGVyIGZvciB0aGUgcGFydGl0aW9uIG9mIHRoYXQgdGFibGUuIAorRm9yIGEgZ2l2ZW4gYHBhcnRpdGlvbmAsIGFsbCByb3dzIGFyZSBvcmRlcmVkIGJ5IHRoYXQgY2x1c3RlcmluZyBvcmRlci4gQ2x1c3RlcmluZyBjb2x1bW5zIGFsc28gYWRkIHVuaXF1ZW5lc3MgdG8KK2Egcm93IGluIGEgdGFibGUuCisKK0ZvciBpbnN0YW5jZSwgZ2l2ZW46CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX3RhYmxlX2NsdXN0ZXJjb2x1bW4uY3FsW10KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2luc2VydF90YWJsZV9jbHVzdGVyY29sdW1uLmNxbFtdCitpbmNsdWRlOjpleGFtcGxlJENRTC9zZWxlY3RfdGFibGVfY2x1c3RlcmNvbHVtbi5jcWxbXQorLS0tLQorCit3aWxsIHJlc3VsdCBpbgorW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvc2VsZWN0X3RhYmxlX2NsdXN0ZXJjb2x1bW4ucmVzdWx0W10KKy0tLS0KKzwxPiBSb3cgMSBpcyBpbiBvbmUgcGFydGl0aW9uLCBhbmQgUm93cyAyLTUgYXJlIGluIGEgZGlmZmVyZW50IG9uZS4gVGhlIGRpc3BsYXkgb3JkZXIgaXMgYWxzbyBkaWZmZXJlbnQuCisKK0xvb2tpbmcgbW9yZSBjbG9zZWx5IGF0IHRoZSBmb3VyIHJvd3MgaW4gdGhlIHNhbWUgcGFydGl0aW9uLCB0aGUgYGJgIGNsdXN0ZXJpbmcgY29sdW1uIGRlZmluZXMgdGhlIG9yZGVyIGluIHdoaWNoIHRob3NlIHJvd3MgCithcmUgZGlzcGxheWVkLiAKK1doZXJlYXMgdGhlIHBhcnRpdGlvbiBrZXkgb2YgdGhlIHRhYmxlIGdyb3VwcyByb3dzIG9uIHRoZSBzYW1lIG5vZGUsIHRoZSBjbHVzdGVyaW5nIGNvbHVtbnMgY29udHJvbCAKK2hvdyB0aG9zZSByb3dzIGFyZSBzdG9yZWQgb24gdGhlIG5vZGUuIAorCitUaGF0IHNvcnRpbmcgYWxsb3dzIHRoZSB2ZXJ5IGVmZmljaWVudCByZXRyaWV2YWwgb2YgYSByYW5nZSBvZiByb3dzIHdpdGhpbiBhIHBhcnRpdGlvbjoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9zZWxlY3RfcmFuZ2UuY3FsW10KKy0tLS0KKword2lsbCByZXN1bHQgaW4KK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL3NlbGVjdF9yYW5nZS5yZXN1bHRbXQorLS0tLQorCitbW2NyZWF0ZS10YWJsZS1vcHRpb25zXV0KKz09PSBUYWJsZSBvcHRpb25zCisKK0EgQ1FMIHRhYmxlIGhhcyBhIG51bWJlciBvZiBvcHRpb25zIHRoYXQgY2FuIGJlIHNldCBhdCBjcmVhdGlvbiAoYW5kLAorZm9yIG1vc3Qgb2YgdGhlbSwgYWx0ZXJlZCBsYXRlcikuIFRoZXNlIG9wdGlvbnMgYXJlIHNwZWNpZmllZCBhZnRlciB0aGUKK2BXSVRIYCBrZXl3b3JkLgorCitPbmUgaW1wb3J0YW50IG9wdGlvbiB0aGF0IGNhbm5vdCBiZSBjaGFuZ2VkIGFmdGVyIGNyZWF0aW9uLCBgQ0xVU1RFUklORyBPUkRFUiBCWWAsIGluZmx1ZW5jZXMgaG93IHF1ZXJpZXMgY2FuIGJlIGRvbmUgYWdhaW5zdCB0aGUgdGFibGUuIEl0IGlzIHdvcnRoIGRpc2N1c3NpbmcgaW4gbW9yZSBkZXRhaWwgaGVyZS4KKworW1tjbHVzdGVyaW5nLW9yZGVyXV0KKz09PT0gQ2x1c3RlcmluZyBvcmRlcgorCitUaGUgY2x1c3RlcmluZyBvcmRlciBvZiBhIHRhYmxlIGlzIGRlZmluZWQgYnkgdGhlIGNsdXN0ZXJpbmcgY29sdW1ucy4gCitCeSBkZWZhdWx0LCB0aGUgY2x1c3RlcmluZyBvcmRlciBpcyBhc2NlbmRpbmcgZm9yIHRoZSBjbHVzdGVyaW5nIGNvbHVtbidzIGRhdGEgdHlwZXMuIAorRm9yIGV4YW1wbGUsIGludGVnZXJzIG9yZGVyIGZyb20gMSwgMiwgLi4uIG4sIHdoaWxlIHRleHQgb3JkZXJzIGZyb20gQSB0byBaLiAKKworVGhlIGBDTFVTVEVSSU5HIE9SREVSIEJZYCB0YWJsZSBvcHRpb24gdXNlcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZQorY2x1c3RlcmluZyBjb2x1bW5zLCBlYWNoIHNldCBmb3IgZWl0aGVyIGBBU0NgIChmb3IgX2FzY2VuZGluZ18gb3JkZXIpIG9yIGBERVNDYCAoZm9yIF9kZXNjZW5kaW5nIG9yZGVyKS4KK1RoZSBkZWZhdWx0IGlzIGFzY2VuZGluZyBmb3IgYWxsIGNsdXN0ZXJpbmcgY29sdW1ucyBpZiB0aGUgYENMVVNURVJJTkcgT1JERVIgQllgIG9wdGlvbiBpcyBub3Qgc2V0LiAKKworVGhpcyBvcHRpb24gaXMgYmFzaWNhbGx5IGEgaGludCBmb3IgdGhlIHN0b3JhZ2UgZW5naW5lIHRoYXQgY2hhbmdlcyB0aGUgb3JkZXIgaW4gd2hpY2ggaXQgc3RvcmVzIHRoZSByb3cuCitCZXdhcmUgb2YgdGhlIGNvbnNlcXVlbmNlcyBvZiBzZXR0aW5nIHRoaXMgb3B0aW9uOgorCisqIEl0IGNoYW5nZXMgdGhlIGRlZmF1bHQgYXNjZW5kaW5nIG9yZGVyIG9mIHJlc3VsdHMgd2hlbiBxdWVyaWVkIHdpdGggYSBgU0VMRUNUYCBzdGF0ZW1lbnQgd2l0aCBubyBgT1JERVIgQllgIGNsYXVzZS4KKworKiBJdCBsaW1pdHMgaG93IHRoZSBgT1JERVIgQllgIGNsYXVzZSBpcyB1c2VkIGluIGBTRUxFQ1RgIHN0YXRlbWVudHMgb24gdGhhdCB0YWJsZS4gCitSZXN1bHRzIGNhbiBvbmx5IGJlIG9yZGVyZWQgd2l0aCBlaXRoZXIgdGhlIG9yaWdpbmFsIGNsdXN0ZXJpbmcgb3JkZXIgb3IgdGhlIHJldmVyc2UgY2x1c3RlcmluZyBvcmRlci4KK1N1cHBvc2UgeW91IGNyZWF0ZSBhIHRhYmxlIHdpdGggdHdvIGNsdXN0ZXJpbmcgY29sdW1ucyBgYWAgYW5kIGBiYCwgZGVmaW5lZCBgV0lUSCBDTFVTVEVSSU5HIE9SREVSIEJZIChhIERFU0MsIGIgQVNDKWAuCitRdWVyaWVzIG9uIHRoZSB0YWJsZSBjYW4gdXNlIGBPUkRFUiBCWSAoYSBERVNDLCBiIEFTQylgIG9yIGBPUkRFUiBCWSAoYSBBU0MsIGIgREVTQylgLiAKK01peGVkIG9yZGVyLCBzdWNoIGFzIGBPUkRFUiBCWSAoYSBBU0MsIGIgQVNDKWAgb3IgYE9SREVSIEJZIChhIERFU0MsIGIgREVTQylgIHdpbGwgbm90IHJldHVybiBleHBlY3RlZCBvcmRlci4KKworKiBJdCBoYXMgYSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24gcXVlcmllcy4gUXVlcmllcyBpbiByZXZlcnNlIGNsdXN0ZXJpbmcgb3JkZXIgYXJlIHNsb3dlciB0aGFuIHRoZSBkZWZhdWx0IGFzY2VuZGluZyBvcmRlci4KK0lmIHlvdSBwbGFuIHRvIHF1ZXJ5IG1vc3RseSBpbiBkZXNjZW5kaW5nIG9yZGVyLCBkZWNsYXJlIHRoZSBjbHVzdGVyaW5nIG9yZGVyIGluIHRoZSB0YWJsZSBzY2hlbWEgdXNpbmcgYFdJVEggQ0xVU1RFUklORyBPUkRFUiBCWSAoKWAuIAorVGhpcyBvcHRpbWl6YXRpb24gaXMgY29tbW9uIGZvciB0aW1lIHNlcmllcywgdG8gcmV0cmlldmUgdGhlIGRhdGEgZnJvbSBuZXdlc3QgdG8gb2xkZXN0LgorCitbW2NyZWF0ZS10YWJsZS1nZW5lcmFsLW9wdGlvbnNdXQorPT09PSBPdGhlciB0YWJsZSBvcHRpb25zCisKK0EgdGFibGUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCitbd2lkdGg9IjEwMCUiLGNvbHM9IjMwJSw5JSwxMSUsNTAlIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xvcHRpb24gfCBraW5kIHwgZGVmYXVsdCB8IGRlc2NyaXB0aW9uCisKK3wgYGNvbW1lbnRgIHwgX3NpbXBsZV8gfCBub25lIHwgQSBmcmVlLWZvcm0sIGh1bWFuLXJlYWRhYmxlIGNvbW1lbnQKK3wgeHJlZjpjcWwvZGRsLmFkb2Mjc3BlY19yZXRyeVtgc3BlY3VsYXRpdmVfcmV0cnlgXSB8IF9zaW1wbGVfIHwgOTlQRVJDRU5USUxFIHwgU3BlY3VsYXRpdmUgcmV0cnkgb3B0aW9ucworfCBgY2RjYCB8X2Jvb2xlYW5fIHxmYWxzZSB8Q3JlYXRlIGEgQ2hhbmdlIERhdGEgQ2FwdHVyZSAoQ0RDKSBsb2cgb24gdGhlIHRhYmxlCit8IGBhZGRpdGlvbmFsX3dyaXRlX3BvbGljeWAgfF9zaW1wbGVfIHw5OVBFUkNFTlRJTEUgfCBTYW1lIGFzIGBzcGVjdWxhdGl2ZV9yZXRyeWAKK3wgYGdjX2dyYWNlX3NlY29uZHNgIHxfc2ltcGxlXyB8ODY0MDAwIHxUaW1lIHRvIHdhaXQgYmVmb3JlIGdhcmJhZ2UgY29sbGVjdGluZyB0b21ic3RvbmVzIChkZWxldGlvbiBtYXJrZXJzKQorfCBgYmxvb21fZmlsdGVyX2ZwX2NoYW5jZWAgfF9zaW1wbGVfIHwwLjAwMDc1IHxUaGUgdGFyZ2V0IHByb2JhYmlsaXR5IG9mCitmYWxzZSBwb3NpdGl2ZSBvZiB0aGUgc3N0YWJsZSBibG9vbSBmaWx0ZXJzLiBTYWlkIGJsb29tIGZpbHRlcnMgd2lsbCBiZQorc2l6ZWQgdG8gcHJvdmlkZSB0aGUgcHJvdmlkZWQgcHJvYmFiaWxpdHksIHRodXMgbG93ZXJpbmcgdGhpcyB2YWx1ZQoraW1wYWN0cyB0aGUgc2l6ZSBvZiBibG9vbSBmaWx0ZXJzIGluLW1lbW9yeSBhbmQgb24tZGlzay4KK3wgYGRlZmF1bHRfdGltZV90b19saXZlYCB8X3NpbXBsZV8gfDAgfERlZmF1bHQgZXhwaXJhdGlvbiB0aW1lICjigJxUVEzigJ0pIGluIHNlY29uZHMgZm9yIGEgdGFibGUKK3wgYGNvbXBhY3Rpb25gIHxfbWFwXyB8X3NlZSBiZWxvd18gfCB4cmVmOm9wZXJhdGluZy9jb21wYWN0aW9uL2luZGV4LmFkb2MjY3FsLWNvbXBhY3Rpb24tb3B0aW9uc1tDb21wYWN0aW9uIG9wdGlvbnNdCit8IGBjb21wcmVzc2lvbmAgfF9tYXBfIHxfc2VlIGJlbG93XyB8IHhyZWY6b3BlcmF0aW5nL2NvbXByZXNzaW9uL2luZGV4LmFkb2MjY3FsLWNvbXByZXNzaW9uLW9wdGlvbnNbQ29tcHJlc3Npb24gb3B0aW9uc10KK3wgYGNhY2hpbmdgIHxfbWFwXyB8X3NlZSBiZWxvd18gfENhY2hpbmcgb3B0aW9ucworfCBgbWVtdGFibGVfZmx1c2hfcGVyaW9kX2luX21zYCB8X3NpbXBsZV8gfDAgfFRpbWUgKGluIG1zKSBiZWZvcmUgQ2Fzc2FuZHJhIGZsdXNoZXMgbWVtdGFibGVzIHRvIGRpc2sKK3wgYHJlYWRfcmVwYWlyYCB8X3NpbXBsZV8gfEJMT0NLSU5HIHxTZXRzIHJlYWQgcmVwYWlyIGJlaGF2aW9yIChzZWUgYmVsb3cpCit8PT09CisKK1tbc3BlY19yZXRyeV1dCis9PT09PSBTcGVjdWxhdGl2ZSByZXRyeSBvcHRpb25zCisKK0J5IGRlZmF1bHQsIENhc3NhbmRyYSByZWFkIGNvb3JkaW5hdG9ycyBvbmx5IHF1ZXJ5IGFzIG1hbnkgcmVwbGljYXMgYXMKK25lY2Vzc2FyeSB0byBzYXRpc2Z5IGNvbnNpc3RlbmN5IGxldmVsczogb25lIGZvciBjb25zaXN0ZW5jeSBsZXZlbAorYE9ORWAsIGEgcXVvcnVtIGZvciBgUVVPUlVNYCwgYW5kIHNvIG9uLiBgc3BlY3VsYXRpdmVfcmV0cnlgIGRldGVybWluZXMKK3doZW4gY29vcmRpbmF0b3JzIG1heSBxdWVyeSBhZGRpdGlvbmFsIHJlcGxpY2FzLCBhIHVzZWZ1bCBhY3Rpb24gd2hlbgorcmVwbGljYXMgYXJlIHNsb3cgb3IgdW5yZXNwb25zaXZlLiBTcGVjdWxhdGl2ZSByZXRyaWVzIHJlZHVjZSB0aGUgbGF0ZW5jeS4gCitUaGUgc3BlY3VsYXRpdmVfcmV0cnkgb3B0aW9uIGNvbmZpZ3VyZXMgcmFwaWQgcmVhZCBwcm90ZWN0aW9uLCB3aGVyZSBhIGNvb3JkaW5hdG9yIHNlbmRzIG1vcmUKK3JlcXVlc3RzIHRoYW4gbmVlZGVkIHRvIHNhdGlzZnkgdGhlIGNvbnNpc3RlbmN5IGxldmVsLgorCitbSU1QT1JUQU5UXQorPT09PQorRnJlcXVlbnRseSByZWFkaW5nIGZyb20gYWRkaXRpb25hbCByZXBsaWNhcyBjYW4gaHVydCBjbHVzdGVyCitwZXJmb3JtYW5jZS4gV2hlbiBpbiBkb3VidCwga2VlcCB0aGUgZGVmYXVsdCBgOTlQRVJDRU5USUxFYC4KKz09PT0KKworUHJlLUNhc3NhbmRyYSA0LjAgc3BlY3VsYXRpdmUgcmV0cnkgcG9saWN5IHRha2VzIGEgc2luZ2xlIHN0cmluZyBhcyBhIHBhcmFtZXRlcjoKKworKiBgTk9ORWAKKyogYEFMV0FZU2AKKyogYDk5UEVSQ0VOVElMRWAgKFBFUkNFTlRJTEUpCisqIGA1ME1TYCAoQ1VTVE9NKQorCitBbiBleGFtcGxlIG9mIHNldHRpbmcgc3BlY3VsYXRpdmUgcmV0cnkgc2V0cyBhIGN1c3RvbSB2YWx1ZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9hbHRlcl90YWJsZV9zcGVjX3JldHJ5LmNxbFtdCistLS0tCisKK1RoaXMgZXhhbXBsZSB1c2VzIGEgcGVyY2VudGlsZSBmb3IgdGhlIHNldHRpbmc6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvYWx0ZXJfdGFibGVfc3BlY19yZXRyeV9wZXJjZW50LmNxbFtdCistLS0tCisKK0EgcGVyY2VudGlsZSBzZXR0aW5nIGNhbiBiYWNrZmlyZS4gSWYgYSBzaW5nbGUgaG9zdCBiZWNvbWVzIHVuYXZhaWxhYmxlLCBpdCBjYW4KK2ZvcmNlIHVwIHRoZSBwZXJjZW50aWxlcy4gQSB2YWx1ZSBvZiBgcDk5YCB3aWxsIG5vdCBzcGVjdWxhdGUgYXMgaW50ZW5kZWQgYmVjYXVzZSB0aGUgCit2YWx1ZSBhdCB0aGUgc3BlY2lmaWVkIHBlcmNlbnRpbGUgaGFzIGluY3JlYXNlZCB0b28gbXVjaC4gSWYgdGhlIGNvbnNpc3RlbmN5IGxldmVsIGlzIHNldCB0byBgQUxMYCwgYWxsIAorcmVwbGljYXMgYXJlIHF1ZXJpZWQgcmVnYXJkbGVzcyBvZiB0aGUgc3BlY3VsYXRpdmUgcmV0cnkgc2V0dGluZy4gCisKK0Nhc3NhbmRyYSA0LjAgc3VwcG9ydHMgY2FzZS1pbnNlbnNpdGl2aXR5IGZvciBzcGVjdWxhdGl2ZSByZXRyeSB2YWx1ZXMgKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTE0MjkzW0NBU1NBTkRSQS0xNDI5M10pLiBGb3IgZXhhbXBsZSwgYXNzaWduaW5nIHRoZSB2YWx1ZSBhcyBgbm9uZWAsIGBOb25lYCwgb3IgYE5PTkVgIGhhcyB0aGUgc2FtZSBlZmZlY3QuCisKK0FkZGl0aW9uYWxseSwgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGFkZGVkOgorCitbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfEZvcm1hdCB8RXhhbXBsZSB8RGVzY3JpcHRpb24KK3wgYFhQRVJDRU5USUxFYCB8IDkwLjVQRVJDRU5USUxFIHwgQ29vcmRpbmF0b3JzIHJlY29yZCBhdmVyYWdlIHBlci10YWJsZSByZXNwb25zZSB0aW1lcworZm9yIGFsbCByZXBsaWNhcy4gSWYgYSByZXBsaWNhIHRha2VzIGxvbmdlciB0aGFuIGBYYCBwZXJjZW50IG9mIHRoaXMKK3RhYmxlJ3MgYXZlcmFnZSByZXNwb25zZSB0aW1lLCB0aGUgY29vcmRpbmF0b3IgcXVlcmllcyBhbiBhZGRpdGlvbmFsCityZXBsaWNhLiBgWGAgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMC4KK3wgYFhQYCB8IDkwLjVQIHwgU2FtZSBhcyBgWFBFUkNFTlRJTEVgCit8IGBZbXNgIHwgMjVtcyB8IElmIGEgcmVwbGljYSB0YWtlcyBtb3JlIHRoYW4gYFlgIG1pbGxpc2Vjb25kcyB0byByZXNwb25kLCB0aGUKK2Nvb3JkaW5hdG9yIHF1ZXJpZXMgYW4gYWRkaXRpb25hbCByZXBsaWNhLgorfCBgTUlOKFhQRVJDRU5USUxFLFlNUylgIHwgTUlOKDk5UEVSQ0VOVElMRSwzNU1TKSB8IEEgaHlicmlkIHBvbGljeSB0aGF0IHVzZXMgZWl0aGVyIHRoZQorc3BlY2lmaWVkIHBlcmNlbnRpbGUgb3IgZml4ZWQgbWlsbGlzZWNvbmRzIGRlcGVuZGluZyBvbiB3aGljaCB2YWx1ZSBpcworbG93ZXIgYXQgdGhlIHRpbWUgb2YgY2FsY3VsYXRpb24uIFBhcmFtZXRlcnMgYXJlIGBYUEVSQ0VOVElMRWAsIGBYUGAsIG9yCitgWW1zYC4gVGhpcyBzZXR0aW5nIGhlbHBzIHByb3RlY3QgYWdhaW5zdCBhIHNpbmdsZSBzbG93IGluc3RhbmNlLgorCit8IGBNQVgoWFBFUkNFTlRJTEUsWU1TKWAgYEFMV0FZU2AgYE5FVkVSYCB8IE1BWCg5MC41UCwyNW1zKSB8IEEgaHlicmlkIHBvbGljeSB0aGF0IHVzZXMgZWl0aGVyIHRoZSBzcGVjaWZpZWQKK3BlcmNlbnRpbGUgb3IgZml4ZWQgbWlsbGlzZWNvbmRzIGRlcGVuZGluZyBvbiB3aGljaCB2YWx1ZSBpcyBoaWdoZXIgYXQKK3RoZSB0aW1lIG9mIGNhbGN1bGF0aW9uLiAKK3w9PT0KKworQ2Fzc2FuZHJhIDQuMCBhZGRzIHN1cHBvcnQgZm9yIGh5YnJpZCBgTUlOKClgIGFuZCBgTUFYKClgIHNwZWN1bGF0aXZlIHJldHJ5IHBvbGljaWVzLCB3aXRoIGEgbWl4IGFuZCBtYXRjaCBvZiBlaXRoZXIgYE1JTigpLCBNQVgoKWAsIGBNSU4oKSwgTUlOKClgLCBvciBgTUFYKCksIE1BWCgpYCAoaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMTQyOTNbQ0FTU0FORFJBLTE0MjkzXSkuCitUaGUgaHlicmlkIG1vZGUgd2lsbCBzdGlsbCBzcGVjdWxhdGUgaWYgdGhlIG5vcm1hbCBgcDk5YCBmb3IgdGhlIHRhYmxlIGlzIDwgNTBtcywgdGhlIG1pbmltdW0gdmFsdWUuCitCdXQgaWYgdGhlIGBwOTlgIGxldmVsIGdvZXMgaGlnaGVyIHRoYW4gdGhlIG1heGltdW0gdmFsdWUsIHRoZW4gdGhhdCB2YWx1ZSBjYW4gYmUgdXNlZC4gCitJbiBhIGh5YnJpZCB2YWx1ZSwgb25lIHZhbHVlIG11c3QgYmUgYSBmaXhlZCB0aW1lIChtcykgdmFsdWUgYW5kIHRoZSBvdGhlciBhIHBlcmNlbnRpbGUgdmFsdWUuCisKK1RvIGlsbHVzdHJhdGUgdmFyaWF0aW9ucywgdGhlIGZvbGxvd2luZyBleGFtcGxlcyBhcmUgYWxsIHZhbGlkOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML3NwZWNfcmV0cnlfdmFsdWVzLmNxbFtdCistLS0tCisKK1RoZSBgYWRkaXRpb25hbF93cml0ZV9wb2xpY3lgIHNldHRpbmcgc3BlY2lmaWVzIHRoZSB0aHJlc2hvbGQgYXQgd2hpY2ggYSBjaGVhcAorcXVvcnVtIHdyaXRlIHdpbGwgYmUgdXBncmFkZWQgdG8gaW5jbHVkZSB0cmFuc2llbnQgcmVwbGljYXMuCisKK1tbY3FsLWNvbXBhY3Rpb24tb3B0aW9uc11dCis9PT09PSBDb21wYWN0aW9uIG9wdGlvbnMKKworVGhlIGBjb21wYWN0aW9uYCBvcHRpb25zIG11c3QgbWluaW1hbGx5IGRlZmluZSB0aGUgYCdjbGFzcydgIHN1Yi1vcHRpb24sCit0byBzcGVjaWZ5IHRoZSBjb21wYWN0aW9uIHN0cmF0ZWd5IGNsYXNzIHRvIHVzZS4gCitUaGUgc3VwcG9ydGVkIGNsYXNzZXMgYXJlOiAKKworKiBgJ1NpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3knYCwgeHJlZjpvcGVyYXRpbmcvY29tcGFjdGlvbi9zdGNzLmFkb2Mjc3Rjc1tTVENTXSAoRGVmYXVsdCkKKyogYCdMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5J2AsIHhyZWY6b3BlcmF0aW5nL2NvbXBhY3Rpb24vbGNzLmFkb2MjbGNzW0xDU10KKyogYCdUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5J2AsIHhyZWY6b3BlcmF0aW5nL2NvbXBhY3Rpb24vdHdjcy5hZG9jI3R3Y3NbVFdDU10gCisKK0lmIGEgY3VzdG9tIHN0cmF0ZWdpZXMgaXMgcmVxdWlyZWQsIHNwZWNpZnkgdGhlIGZ1bGwgY2xhc3MgbmFtZSBhcyBhIHhyZWY6Y3FsL2RlZmluaXRpb25zLmFkb2MjY29uc3RhbnRzW3N0cmluZyBjb25zdGFudF0uICAKKworQWxsIGRlZmF1bHQgc3RyYXRlZ2llcyBzdXBwb3J0IGEgbnVtYmVyIG9mIHhyZWY6b3BlcmF0aW5nL2NvbXBhY3Rpb24vaW5kZXguYWRvYyNjb21wYWN0aW9uLW9wdGlvbnNbY29tbW9uIG9wdGlvbnNdLCBhcyB3ZWxsIGFzIG9wdGlvbnMgc3BlY2lmaWMgdG8gdGhlIHN0cmF0ZWd5IGNob3Nlbi4gU2VlIHRoZSBzZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8geW91ciBzdHJhdGVneSBmb3IgZGV0YWlsczogeHJlZjpvcGVyYXRpbmcvY29tcGFjdGlvbi9zdGNzLmFkb2Mjc3Rjc19vcHRpb25zW1NUQ1NdLCB4cmVmOm9wZXJhdGluZy9jb21wYWN0aW9uL2xjcy5hZG9jI2xjc19vcHRpb25zW0xDU10sIHhyZWY6b3BlcmF0aW5nL2NvbXBhY3Rpb24vdHdjcy5hZG9jI3R3Y3Nfb3B0aW9uc1tUV0NTXS4KKworW1tjcWwtY29tcHJlc3Npb24tb3B0aW9uc11dCis9PT09PSBDb21wcmVzc2lvbiBvcHRpb25zCisKK1RoZSBgY29tcHJlc3Npb25gIG9wdGlvbnMgZGVmaW5lIGlmIGFuZCBob3cgdGhlIFNTVGFibGVzIG9mIHRoZSB0YWJsZQorYXJlIGNvbXByZXNzZWQuIENvbXByZXNzaW9uIGlzIGNvbmZpZ3VyZWQgb24gYSBwZXItdGFibGUgYmFzaXMgYXMgYW4KK29wdGlvbmFsIGFyZ3VtZW50IHRvIGBDUkVBVEUgVEFCTEVgIG9yIGBBTFRFUiBUQUJMRWAuIFRoZSBmb2xsb3dpbmcKK3N1Yi1vcHRpb25zIGFyZSBhdmFpbGFibGU6CisKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8T3B0aW9uIHxEZWZhdWx0IHxEZXNjcmlwdGlvbgorfCBgY2xhc3NgIHwgTFo0Q29tcHJlc3NvciB8IFRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gdG8gdXNlLiBEZWZhdWx0IGNvbXByZXNzb3IgYXJlOiBMWjRDb21wcmVzc29yLAorU25hcHB5Q29tcHJlc3NvciwgRGVmbGF0ZUNvbXByZXNzb3IgYW5kIFpzdGRDb21wcmVzc29yLiAKK1VzZSBgJ2VuYWJsZWQnIDogZmFsc2VgIHRvIGRpc2FibGUgY29tcHJlc3Npb24uIAorQ3VzdG9tIGNvbXByZXNzb3IgY2FuIGJlIHByb3ZpZGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZ1bGwgY2xhc3MgbmFtZSBhcyBhIHhyZWY6Y3FsL2RlZmluaXRpb25zLmFkb2MjY29uc3RhbnRzW3N0cmluZyBjb25zdGFudF0uCisKK3wgYGVuYWJsZWRgIHwgdHJ1ZSB8IEVuYWJsZS9kaXNhYmxlIHNzdGFibGUgY29tcHJlc3Npb24uIAorSWYgdGhlIGBlbmFibGVkYCBvcHRpb24gaXMgc2V0IHRvIGBmYWxzZWAsIG5vIG90aGVyIG9wdGlvbnMgbXVzdCBiZSBzcGVjaWZpZWQuCisKK3wgYGNodW5rX2xlbmd0aF9pbl9rYmAgfCA2NCB8IE9uIGRpc2sgU1NUYWJsZXMgYXJlIGNvbXByZXNzZWQgYnkgYmxvY2sgKHRvIGFsbG93IHJhbmRvbSByZWFkcykuIAorVGhpcyBvcHRpb24gZGVmaW5lcyB0aGUgc2l6ZSAoaW4gS0IpIG9mIHNhaWQgYmxvY2suIFNlZSB4cmVmOmNxbC9kZGwuYWRvYyNjaHVua19ub3RlW25vdGVdIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgorCit8IGBjcmNfY2hlY2tfY2hhbmNlYCB8IDEuMCB8IERldGVybWluZXMgaG93IGxpa2VseSBDYXNzYW5kcmEgaXMgdG8gdmVyaWZ5IHRoZSBjaGVja3N1bSBvbiBlYWNoCitjb21wcmVzc2lvbiBjaHVuayBkdXJpbmcgcmVhZHMuCisKK3wgYGNvbXByZXNzaW9uX2xldmVsYCB8IDMgfCBDb21wcmVzc2lvbiBsZXZlbC4gT25seSBhcHBsaWNhYmxlIGZvciBgWnN0ZENvbXByZXNzb3JgLiAgCitBY2NlcHRzIHZhbHVlcyBiZXR3ZWVuIGAtMTMxMDcyYCBhbmQgYDIyYC4KK3w9PT0KKworW1tjaHVua19ub3RlXV0KK1tOT1RFXQorPT09PQorQmlnZ2VyIHZhbHVlcyBtYXkgaW1wcm92ZSB0aGUgY29tcHJlc3Npb24gcmF0ZSwgYnV0IHdpbGwgaW5jcmVhc2UgdGhlIG1pbmltdW0gc2l6ZSBvZiBkYXRhIHRvIGJlIHJlYWQgZnJvbQorZGlzayBmb3IgYSByZWFkLiAKK1RoZSBkZWZhdWx0IHZhbHVlIGlzIGFuIG9wdGltYWwgdmFsdWUgZm9yIGNvbXByZXNzaW5nIHRhYmxlcy4gCitDaHVuayBsZW5ndGggbXVzdCBiZSBhIHBvd2VyIG9mIDIgd2hlbiBjb21wdXRpbmcgdGhlIGNodW5rIG51bWJlciBmcm9tIGFuIHVuY29tcHJlc3NlZCBmaWxlIG9mZnNldC4gCitCbG9jayBzaXplIG1heSBiZSBhZGp1c3RlZCBiYXNlZCBvbiByZWFkL3dyaXRlIGFjY2VzcyBwYXR0ZXJucyBzdWNoIGFzOgorCisqIEhvdyBtdWNoIGRhdGEgaXMgdHlwaWNhbGx5IHJlcXVlc3RlZCBhdCBvbmNlCisqIEF2ZXJhZ2Ugc2l6ZSBvZiByb3dzIGluIHRoZSB0YWJsZQorPT09PQorCitGb3IgaW5zdGFuY2UsIHRvIGNyZWF0ZSBhIHRhYmxlIHdpdGggTFo0Q29tcHJlc3NvciBhbmQgYSBgY2h1bmtfbGVuZ3RoX2luX2tiYCBvZiA0IEtCOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2NodW5rX2xlbmd0aC5jcWxbXQorLS0tLQorCitbW2NxbC1jYWNoaW5nLW9wdGlvbnNdXQorPT09PT0gQ2FjaGluZyBvcHRpb25zCisKK0NhY2hpbmcgb3B0aW1pemVzIHRoZSB1c2Ugb2YgY2FjaGUgbWVtb3J5IG9mIGEgdGFibGUuIFRoZSBjYWNoZWQgZGF0YSBpcword2VpZ2hlZCBieSBzaXplIGFuZCBhY2Nlc3MgZnJlcXVlbmN5LiAKK1RoZSBgY2FjaGluZ2Agb3B0aW9ucyBjYW4gY29uZmlndXJlIGJvdGggdGhlIGBrZXkgY2FjaGVgIGFuZCB0aGUgYHJvdyBjYWNoZWAgZm9yIHRoZSB0YWJsZS4gCitUaGUgZm9sbG93aW5nIHN1Yi1vcHRpb25zIGFyZSBhdmFpbGFibGU6CisKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8T3B0aW9uIHxEZWZhdWx0IHxEZXNjcmlwdGlvbgorfCBga2V5c2AgfCBBTEwgfCBXaGV0aGVyIHRvIGNhY2hlIGtleXMgKGtleSBjYWNoZSkgZm9yIHRoaXMgdGFibGUuIFZhbGlkIHZhbHVlcyBhcmU6IGBBTExgIGFuZCBgTk9ORWAuCisKK3wgYHJvd3NfcGVyX3BhcnRpdGlvbmAgfCBOT05FIHwgVGhlIGFtb3VudCBvZiByb3dzIHRvIGNhY2hlIHBlciBwYXJ0aXRpb24gKHJvdyBjYWNoZSkuIAorSWYgYW4gaW50ZWdlciBgbmAgaXMgc3BlY2lmaWVkLCB0aGUgZmlyc3QgYG5gIHF1ZXJpZWQgcm93cyBvZiBhIHBhcnRpdGlvbiB3aWxsIGJlIGNhY2hlZC4gCitWYWxpZCB2YWx1ZXMgYXJlOiBgQUxMYCwgdG8gY2FjaGUgYWxsIHJvd3Mgb2YgYSBxdWVyaWVkIHBhcnRpdGlvbiwgb3IgYE5PTkVgIHRvIGRpc2FibGUgcm93IGNhY2hpbmcuCit8PT09CisKK0ZvciBpbnN0YW5jZSwgdG8gY3JlYXRlIGEgdGFibGUgd2l0aCBib3RoIGEga2V5IGNhY2hlIGFuZCAxMCByb3dzIGNhY2hlZCBwZXIgcGFydGl0aW9uOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2NhY2hpbmdfb3B0aW9uLmNxbFtdCistLS0tCisKK1tbcmVhZC1yZXBhaXItb3B0aW9uc11dCis9PT09PSBSZWFkIFJlcGFpciBvcHRpb25zCisKK1RoZSBgcmVhZF9yZXBhaXJgIG9wdGlvbnMgY29uZmlndXJlIHRoZSByZWFkIHJlcGFpciBiZWhhdmlvciwgdHVuaW5nIGZvciB2YXJpb3VzIHBlcmZvcm1hbmNlIGFuZCBjb25zaXN0ZW5jeSBiZWhhdmlvcnMuIAorCitUaGUgdmFsdWVzIGFyZToKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8T3B0aW9uIHxEZWZhdWx0IHxEZXNjcmlwdGlvbgorfGBCTE9DS0lOR2AgfCB5ZXMgfCBJZiBhIHJlYWQgcmVwYWlyIGlzIHRyaWdnZXJlZCwgdGhlIHJlYWQgYmxvY2tzIHdyaXRlcyBzZW50IHRvIG90aGVyIHJlcGxpY2FzIHVudGlsIHRoZSBjb25zaXN0ZW5jeSBsZXZlbCBpcyByZWFjaGVkIGJ5IHRoZSB3cml0ZXMuCisKK3xgTk9ORWAgfCBubyB8IElmIHNldCwgdGhlIGNvb3JkaW5hdG9yIHJlY29uY2lsZXMgYW55IGRpZmZlcmVuY2VzIGJldHdlZW4gcmVwbGljYXMsIGJ1dCBkb2Vzbid0IGF0dGVtcHQgdG8gcmVwYWlyIHRoZW0uCit8PT09CisKK1R3byBjb25zaXN0ZW5jeSBwcm9wZXJ0aWVzIGFyZSBhZmZlY3RlZCBieSByZWFkIHJlcGFpciBiZWhhdmlvci4KKworKiBNb25vdG9uaWMgcXVvcnVtIHJlYWRzOiBNb25vdG9uaWMgcXVvcnVtIHJlYWRzCitwcmV2ZW50cyByZWFkcyBmcm9tIGFwcGVhcmluZyB0byBnbyBiYWNrIGluIHRpbWUgaW4gc29tZSBjaXJjdW1zdGFuY2VzLgorV2hlbiBtb25vdG9uaWMgcXVvcnVtIHJlYWRzIGFyZSBub3QgcHJvdmlkZWQgYW5kIGEgd3JpdGUgZmFpbHMgdG8gcmVhY2gKK2EgcXVvcnVtIG9mIHJlcGxpY2FzLCB0aGUgcmVhZCB2YWx1ZXMgbWF5IGJlIHZpc2libGUgaW4gb25lIHJlYWQsIGFuZCB0aGVuIGRpc2FwcGVhcgoraW4gYSBzdWJzZXF1ZW50IHJlYWQuIGBCTE9DS0lOR2AgcHJvdmlkZXMgdGhpcyBiZWhhdmlvci4KKyogV3JpdGUgYXRvbWljaXR5OiBXcml0ZSBhdG9taWNpdHkgcHJldmVudHMgcmVhZHMKK2Zyb20gcmV0dXJuaW5nIHBhcnRpYWxseS1hcHBsaWVkIHdyaXRlcy4gQ2Fzc2FuZHJhIGF0dGVtcHRzIHRvIHByb3ZpZGUKK3BhcnRpdGlvbi1sZXZlbCB3cml0ZSBhdG9taWNpdHksIGJ1dCBzaW5jZSBvbmx5IHRoZSBkYXRhIGNvdmVyZWQgYnkgYQorU0VMRUNUIHN0YXRlbWVudCBpcyByZXBhaXJlZCBieSBhIHJlYWQgcmVwYWlyLCByZWFkIHJlcGFpciBjYW4gYnJlYWsKK3dyaXRlIGF0b21pY2l0eSB3aGVuIGRhdGEgaXMgcmVhZCBhdCBhIG1vcmUgZ3JhbnVsYXIgbGV2ZWwgdGhhbiBpdCBpcword3JpdHRlbi4gRm9yIGV4YW1wbGUsIHJlYWQgcmVwYWlyIGNhbiBicmVhayB3cml0ZSBhdG9taWNpdHkgaWYgeW91IHdyaXRlCittdWx0aXBsZSByb3dzIHRvIGEgY2x1c3RlcmVkIHBhcnRpdGlvbiBpbiBhIGJhdGNoLCBidXQgdGhlbiBzZWxlY3QgYQorc2luZ2xlIHJvdyBieSBzcGVjaWZ5aW5nIHRoZSBjbHVzdGVyaW5nIGNvbHVtbiBpbiBhIFNFTEVDVCBzdGF0ZW1lbnQuCitgTk9ORWAgcHJvdmlkZXMgdGhpcyBiZWhhdmlvci4KKworPT09PT0gT3RoZXIgY29uc2lkZXJhdGlvbnM6CisKKyogQWRkaW5nIG5ldyBjb2x1bW5zIChzZWUgYEFMVEVSIFRBQkxFYCBiZWxvdykgaXMgYSBjb25zdGFudCB0aW1lCitvcGVyYXRpb24uIFRodXMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gYW50aWNpcGF0ZSBmdXR1cmUgdXNhZ2Ugd2hpbGUgaW5pdGlhbGx5IGNyZWF0aW5nIGEgdGFibGUuCisKK1tbYWx0ZXItdGFibGUtc3RhdGVtZW50XV0KKz09IEFMVEVSIFRBQkxFCisKK0FsdGVyaW5nIGFuIGV4aXN0aW5nIHRhYmxlIHVzZXMgdGhlIGBBTFRFUiBUQUJMRWAgc3RhdGVtZW50OgorCitbc291cmNlLGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL2FsdGVyX3RhYmxlLmJuZltdCistLS0tCitJZiB0aGUgdGFibGUgZG9lcyBub3QgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgorCitGb3IgZXhhbXBsZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9hbHRlcl90YWJsZV9hZGRfY29sdW1uLmNxbFtdCitpbmNsdWRlOjpleGFtcGxlJENRTC9hbHRlcl90YWJsZV93aXRoX2NvbW1lbnQuY3FsW10KKy0tLS0KKworVGhlIGBBTFRFUiBUQUJMRWAgc3RhdGVtZW50IGNhbjoKKworKiBgQUREYCBhIG5ldyBjb2x1bW4gdG8gYSB0YWJsZS4gVGhlIHByaW1hcnkga2V5IG9mIGEgdGFibGUgY2Fubm90IGV2ZXIgYmUgYWx0ZXJlZC4KK0EgbmV3IGNvbHVtbiwgdGh1cywgY2Fubm90IGJlIHBhcnQgb2YgdGhlIHByaW1hcnkga2V5LiAKK0FkZGluZyBhIGNvbHVtbiBpcyBhIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uIGJhc2VkIG9uIHRoZSBhbW91bnQgb2YgZGF0YSBpbiB0aGUgdGFibGUuCitJZiB0aGUgbmV3IGNvbHVtbiBhbHJlYWR5IGV4aXN0cywgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBOT1QgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgorKiBgRFJPUGAgYSBjb2x1bW4gZnJvbSBhIHRhYmxlLiBUaGlzIGNvbW1hbmQgZHJvcHMgYm90aCB0aGUgY29sdW1uIGFuZCBhbGwKK2l0cyBjb250ZW50LiBCZSBhd2FyZSB0aGF0LCB3aGlsZSB0aGUgY29sdW1uIGJlY29tZXMgaW1tZWRpYXRlbHkKK3VuYXZhaWxhYmxlLCBpdHMgY29udGVudCBhcmUgcmVtb3ZlZCBsYXppbHkgZHVyaW5nIGNvbXBhY3Rpb24uIEJlY2F1c2Ugb2YgdGhpcyBsYXp5IHJlbW92YWwsCit0aGUgY29tbWFuZCBpcyBhIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uIGJhc2VkIG9uIHRoZSBhbW91bnQgb2YgZGF0YSBpbiB0aGUgdGFibGUuIAorQWxzbywgaXQgaXMgaW1wb3J0YW50IHRvIGtub3cgdGhhdCBvbmNlIGEgY29sdW1uIGlzIGRyb3BwZWQsIGEgY29sdW1uIHdpdGggdGhlIHNhbWUgbmFtZSBjYW4gYmUgcmUtYWRkZWQsCit1bmxlc3MgdGhlIGRyb3BwZWQgY29sdW1uIHdhcyBhIG5vbi1mcm96ZW4gY29sdW1uIGxpa2UgYSBjb2xsZWN0aW9uLgorSWYgdGhlIGRyb3BwZWQgY29sdW1uIGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgorCitbV0FSTklOR10KKy5XYXJuaW5nCis9PT09CitEcm9wcGluZyBhIGNvbHVtbiBhc3N1bWVzIHRoYXQgdGhlIHRpbWVzdGFtcHMgdXNlZCBmb3IgdGhlIHZhbHVlIG9mIHRoaXMKK2NvbHVtbiBhcmUgInJlYWwiIHRpbWVzdGFtcCBpbiBtaWNyb3NlY29uZHMuIFVzaW5nICJyZWFsIiB0aW1lc3RhbXBzIGluCittaWNyb3NlY29uZHMgaXMgdGhlIGRlZmF1bHQgaXMgYW5kIGlzICpzdHJvbmdseSogcmVjb21tZW5kZWQgYnV0IGFzCitDYXNzYW5kcmEgYWxsb3dzIHRoZSBjbGllbnQgdG8gcHJvdmlkZSBhbnkgdGltZXN0YW1wIG9uIGFueSB0YWJsZSwgaXQgaXMKK3RoZW9yZXRpY2FsbHkgcG9zc2libGUgdG8gdXNlIGFub3RoZXIgY29udmVudGlvbi4gUGxlYXNlIGJlIGF3YXJlIHRoYXQKK2lmIHlvdSBkbyBzbywgZHJvcHBpbmcgYSBjb2x1bW4gd2lsbCBub3QgY29ycmVjdGx5IGV4ZWN1dGUuCis9PT09CisKKyogYFJFTkFNRWAgYSBwcmltYXJ5IGtleSBjb2x1bW4gb2YgYSB0YWJsZS4gTm9uIHByaW1hcnkga2V5IGNvbHVtbnMgY2Fubm90IGJlIHJlbmFtZWQuCitGdXJ0aGVybW9yZSwgcmVuYW1pbmcgYSBjb2x1bW4gdG8gYW5vdGhlciBuYW1lIHdoaWNoIGFscmVhZHkgZXhpc3RzIGlzbid0IGFsbG93ZWQuCitJdCdzIGltcG9ydGFudCB0byBrZWVwIGluIG1pbmQgdGhhdCByZW5hbWVkIGNvbHVtbnMgc2hvdWxkbid0IGhhdmUgZGVwZW5kZW50IHNlY29uZGF5IGluZGV4ZXMuCitJZiB0aGUgcmVuYW1lZCBjb2x1bW4gZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCisKKyogVXNlIGBXSVRIYCB0byBjaGFuZ2UgYSB0YWJsZSBvcHRpb24uIFRoZSB4cmVmOkNRTC9kZGwuYWRvYyNjcmVhdGUtdGFibGUtb3B0aW9uc1tzdXBwb3J0ZWQgb3B0aW9uc10KK2FyZSB0aGUgc2FtZSBhcyB0aG9zZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSB0YWJsZSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGBDTFVTVEVSSU5HIE9SREVSYC4KK0hvd2V2ZXIsIHNldHRpbmcgYW55IGBjb21wYWN0aW9uYCBzdWItb3B0aW9ucyB3aWxsIGVyYXNlICpBTEwqIHByZXZpb3VzIGBjb21wYWN0aW9uYCBvcHRpb25zLCBzbyB5b3UgbmVlZCB0byByZS1zcGVjaWZ5CithbGwgdGhlIHN1Yi1vcHRpb25zIHlvdSB3aXNoIHRvIGtlZXAuIFRoZSBzYW1lIGlzIHRydWUgZm9yIGBjb21wcmVzc2lvbmAgc3ViLW9wdGlvbnMuCisKK1tbZHJvcC10YWJsZS1zdGF0ZW1lbnRdXQorPT0gRFJPUCBUQUJMRQorCitEcm9wcGluZyBhIHRhYmxlIHVzZXMgdGhlIGBEUk9QIFRBQkxFYCBzdGF0ZW1lbnQ6CisKK1tzb3VyY2UsYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvZHJvcF90YWJsZS5ibmZbXQorLS0tLQorCitEcm9wcGluZyBhIHRhYmxlIHJlc3VsdHMgaW4gdGhlIGltbWVkaWF0ZSwgaXJyZXZlcnNpYmxlIHJlbW92YWwgb2YgdGhlCit0YWJsZSwgaW5jbHVkaW5nIGFsbCBkYXRhIGl0IGNvbnRhaW5zLgorCitJZiB0aGUgdGFibGUgZG9lcyBub3QgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcworYElGIEVYSVNUU2AgaXMgdXNlZCwgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCisKK1tbdHJ1bmNhdGUtc3RhdGVtZW50XV0KKz09IFRSVU5DQVRFCisKK0EgdGFibGUgY2FuIGJlIHRydW5jYXRlZCB1c2luZyB0aGUgYFRSVU5DQVRFYCBzdGF0ZW1lbnQ6CisKK1tzb3VyY2UsYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvdHJ1bmNhdGVfdGFibGUuYm5mW10KKy0tLS0KKworYFRSVU5DQVRFIFRBQkxFIGZvb2AgaXMgdGhlIHByZWZlcnJlZCBzeW50YXggZm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgRERMCitzdGF0ZW1lbnRzLiAKK0hvd2V2ZXIsIHRhYmxlcyBhcmUgdGhlIG9ubHkgb2JqZWN0IHRoYXQgY2FuIGJlIHRydW5jYXRlZCBjdXJyZW50bHksIGFuZCB0aGUgYFRBQkxFYCBrZXl3b3JkIGNhbiBiZSBvbWl0dGVkLgorCitUcnVuY2F0aW5nIGEgdGFibGUgcGVybWFuZW50bHkgcmVtb3ZlcyBhbGwgZXhpc3RpbmcgZGF0YSBmcm9tIHRoZSB0YWJsZSwgYnV0IHdpdGhvdXQgcmVtb3ZpbmcgdGhlIHRhYmxlIGl0c2VsZi4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9kZWZpbml0aW9ucy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL2RlZmluaXRpb25zLmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlNjA0OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9kZWZpbml0aW9ucy5hZG9jCkBAIC0wLDAgKzEsMTg3IEBACis9IERlZmluaXRpb25zCisKKz09IENvbnZlbnRpb25zCisKK1RvIGFpZCBpbiBzcGVjaWZ5aW5nIHRoZSBDUUwgc3ludGF4LCB3ZSB3aWxsIHVzZSB0aGUgZm9sbG93aW5nCitjb252ZW50aW9ucyBpbiB0aGlzIGRvY3VtZW50OgorCisqIExhbmd1YWdlIHJ1bGVzIHdpbGwgYmUgZ2l2ZW4gaW4gYW4gaW5mb3JtYWwKK2h0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFja3VzJUUyJTgwJTkzTmF1cl9Gb3JtI1ZhcmlhbnRzW0JORgordmFyaWFudF0gbm90YXRpb24uIEluIHBhcnRpY3VsYXIsIHdlJ2xsIHVzZSBzcXVhcmUgYnJha2V0cyAoYFsgaXRlbSBdYCkKK2ZvciBvcHRpb25hbCBpdGVtcywgYCpgIGFuZCBgK2AgZm9yIHJlcGVhdGVkIGl0ZW1zICh3aGVyZSBgK2AgaW1wbHkgYXQKK2xlYXN0IG9uZSkuCisqIFRoZSBncmFtbWFyIHdpbGwgYWxzbyB1c2UgdGhlIGZvbGxvd2luZyBjb252ZW50aW9uIGZvciBjb252ZW5pZW5jZToKK25vbi10ZXJtaW5hbCB0ZXJtIHdpbGwgYmUgbG93ZXJjYXNlIChhbmQgbGluayB0byB0aGVpciBkZWZpbml0aW9uKSB3aGlsZQordGVybWluYWwga2V5d29yZHMgd2lsbCBiZSBwcm92aWRlZCAiYWxsIGNhcHMiLiBOb3RlIGhvd2V2ZXIgdGhhdAora2V5d29yZHMgYXJlIGBpZGVudGlmaWVyc2AgYW5kIGFyZSB0aHVzIGNhc2UgaW5zZW5zaXRpdmUgaW4gcHJhY3RpY2UuIFdlCit3aWxsIGFsc28gZGVmaW5lIHNvbWUgZWFybHkgY29uc3RydWN0aW9uIHVzaW5nIHJlZ2V4cCwgd2hpY2ggd2UnbGwKK2luZGljYXRlIHdpdGggYHJlKDxzb21lIHJlZ3VsYXIgZXhwcmVzc2lvbj4pYC4KKyogVGhlIGdyYW1tYXIgaXMgcHJvdmlkZWQgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMgYW5kIGxlYXZlIHNvbWUKK21pbm9yIGRldGFpbHMgb3V0LiBGb3IgaW5zdGFuY2UsIHRoZSBjb21tYSBvbiB0aGUgbGFzdCBjb2x1bW4gZGVmaW5pdGlvbgoraW4gYSBgQ1JFQVRFIFRBQkxFYCBzdGF0ZW1lbnQgaXMgb3B0aW9uYWwgYnV0IHN1cHBvcnRlZCBpZiBwcmVzZW50IGV2ZW4KK3Rob3VnaCB0aGUgZ3JhbW1hciBpbiB0aGlzIGRvY3VtZW50IHN1Z2dlc3RzIG90aGVyd2lzZS4gQWxzbywgbm90CitldmVyeXRoaW5nIGFjY2VwdGVkIGJ5IHRoZSBncmFtbWFyIGlzIG5lY2Vzc2FyaWx5IHZhbGlkIENRTC4KKyogUmVmZXJlbmNlcyB0byBrZXl3b3JkcyBvciBwaWVjZXMgb2YgQ1FMIGNvZGUgaW4gcnVubmluZyB0ZXh0IHdpbGwgYmUKK3Nob3duIGluIGEgYGZpeGVkLXdpZHRoIGZvbnRgLgorCitbW2lkZW50aWZpZXJzXV0KKz09IElkZW50aWZpZXJzIGFuZCBrZXl3b3JkcworCitUaGUgQ1FMIGxhbmd1YWdlIHVzZXMgX2lkZW50aWZpZXJzXyAob3IgX25hbWVzXykgdG8gaWRlbnRpZnkgdGFibGVzLAorY29sdW1ucyBhbmQgb3RoZXIgb2JqZWN0cy4gQW4gaWRlbnRpZmllciBpcyBhIHRva2VuIG1hdGNoaW5nIHRoZSByZWd1bGFyCitleHByZXNzaW9uIGBbYS16QS1aXVthLXpBLVowLTlfXSpgLgorCitBIG51bWJlciBvZiBzdWNoIGlkZW50aWZpZXJzLCBsaWtlIGBTRUxFQ1RgIG9yIGBXSVRIYCwgYXJlIF9rZXl3b3Jkc18uCitUaGV5IGhhdmUgYSBmaXhlZCBtZWFuaW5nIGZvciB0aGUgbGFuZ3VhZ2UgYW5kIG1vc3QgYXJlIHJlc2VydmVkLiBUaGUKK2xpc3Qgb2YgdGhvc2Uga2V5d29yZHMgY2FuIGJlIGZvdW5kIGluIHhyZWY6Y3FsL2FwcGVuZGljZXMuYWRvYyNhcHBlbmRpeC1BW0FwcGVuZGl4IEFdLgorCitJZGVudGlmaWVycyBhbmQgKHVucXVvdGVkKSBrZXl3b3JkcyBhcmUgY2FzZSBpbnNlbnNpdGl2ZS4gVGh1cyBgU0VMRUNUYAoraXMgdGhlIHNhbWUgdGhhbiBgc2VsZWN0YCBvciBgc0VsRWNUYCwgYW5kIGBteUlkYCBpcyB0aGUgc2FtZSB0aGFuCitgbXlpZGAgb3IgYE1ZSURgLiBBIGNvbnZlbnRpb24gb2Z0ZW4gdXNlZCAoaW4gcGFydGljdWxhciBieSB0aGUgc2FtcGxlcworb2YgdGhpcyBkb2N1bWVudGF0aW9uKSBpcyB0byB1c2UgdXBwZXJjYXNlIGZvciBrZXl3b3JkcyBhbmQgbG93ZXJjYXNlCitmb3Igb3RoZXIgaWRlbnRpZmllcnMuCisKK1RoZXJlIGlzIGEgc2Vjb25kIGtpbmQgb2YgaWRlbnRpZmllciBjYWxsZWQgYSBfcXVvdGVkIGlkZW50aWZpZXJfCitkZWZpbmVkIGJ5IGVuY2xvc2luZyBhbiBhcmJpdHJhcnkgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyAobm9uLWVtcHR5KSBpbgorZG91YmxlLXF1b3RlcyhgImApLiBRdW90ZWQgaWRlbnRpZmllcnMgYXJlIG5ldmVyIGtleXdvcmRzLiBUaHVzCitgInNlbGVjdCJgIGlzIG5vdCBhIHJlc2VydmVkIGtleXdvcmQgYW5kIGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIGEKK2NvbHVtbiAobm90ZSB0aGF0IHVzaW5nIHRoaXMgaXMgcGFydGljdWxhcmx5IGlsbC1hZHZpc2VkKSwgd2hpbGUgYHNlbGVjdGAKK3dvdWxkIHJhaXNlIGEgcGFyc2luZyBlcnJvci4gQWxzbywgdW5saWtlIHVucXVvdGVkIGlkZW50aWZpZXJzCithbmQga2V5d29yZHMsIHF1b3RlZCBpZGVudGlmaWVycyBhcmUgY2FzZSBzZW5zaXRpdmUgKGAiTXkgUXVvdGVkIElkImAgaXMKK19kaWZmZXJlbnRfIGZyb20gYCJteSBxdW90ZWQgaWQiYCkuIEEgZnVsbHkgbG93ZXJjYXNlIHF1b3RlZCBpZGVudGlmaWVyCit0aGF0IG1hdGNoZXMgYFthLXpBLVpdW2EtekEtWjAtOV9dKmAgaXMgaG93ZXZlciBfZXF1aXZhbGVudF8gdG8gdGhlCit1bnF1b3RlZCBpZGVudGlmaWVyIG9idGFpbmVkIGJ5IHJlbW92aW5nIHRoZSBkb3VibGUtcXVvdGUgKHNvIGAibXlpZCJgCitpcyBlcXVpdmFsZW50IHRvIGBteWlkYCBhbmQgdG8gYG15SWRgIGJ1dCBkaWZmZXJlbnQgZnJvbSBgIm15SWQiYCkuCitJbnNpZGUgYSBxdW90ZWQgaWRlbnRpZmllciwgdGhlIGRvdWJsZS1xdW90ZSBjaGFyYWN0ZXIgY2FuIGJlIHJlcGVhdGVkCit0byBlc2NhcGUgaXQsIHNvIGAiZm9vICIiIGJhciJgIGlzIGEgdmFsaWQgaWRlbnRpZmllci4KKworW05PVEVdCisuTm90ZQorPT09PQorVGhlIF9xdW90ZWQgaWRlbnRpZmllcl8gY2FuIGRlY2xhcmUgY29sdW1ucyB3aXRoIGFyYml0cmFyeSBuYW1lcywgYW5kCit0aGVzZSBjYW4gc29tZXRpbWUgY2xhc2ggd2l0aCBzcGVjaWZpYyBuYW1lcyB1c2VkIGJ5IHRoZSBzZXJ2ZXIuIEZvcgoraW5zdGFuY2UsIHdoZW4gdXNpbmcgY29uZGl0aW9uYWwgdXBkYXRlLCB0aGUgc2VydmVyIHdpbGwgcmVzcG9uZCB3aXRoIGEKK3Jlc3VsdCBzZXQgY29udGFpbmluZyBhIHNwZWNpYWwgcmVzdWx0IG5hbWVkIGAiW2FwcGxpZWRdImAuIElmIHlvdeKAmXZlCitkZWNsYXJlZCBhIGNvbHVtbiB3aXRoIHN1Y2ggYSBuYW1lLCB0aGlzIGNvdWxkIHBvdGVudGlhbGx5IGNvbmZ1c2Ugc29tZQordG9vbHMgYW5kIHNob3VsZCBiZSBhdm9pZGVkLiBJbiBnZW5lcmFsLCB1bnF1b3RlZCBpZGVudGlmaWVycyBzaG91bGQgYmUKK3ByZWZlcnJlZCBidXQgaWYgeW91IHVzZSBxdW90ZWQgaWRlbnRpZmllcnMsIGl0IGlzIHN0cm9uZ2x5IGFkdmlzZWQgdGhhdCB5b3UKK2F2b2lkIGFueSBuYW1lIGVuY2xvc2VkIGJ5IHNxdWFyZWQgYnJhY2tldHMgKGxpa2UgYCJbYXBwbGllZF0iYCkgYW5kIGFueQorbmFtZSB0aGF0IGxvb2tzIGxpa2UgYSBmdW5jdGlvbiBjYWxsIChsaWtlIGAiZih4KSJgKS4KKz09PT0KKworTW9yZSBmb3JtYWxseSwgd2UgaGF2ZToKKworW3NvdXJjZSwgYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvaWRlbnRpZmllci5ibmZbXQorLS0tLQorCitbW2NvbnN0YW50c11dCis9PSBDb25zdGFudHMKKworQ1FMIGRlZmluZXMgdGhlIGZvbGxvd2luZyBfY29uc3RhbnRzXzoKKworW3NvdXJjZSwgYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvY29uc3RhbnQuYm5mW10KKy0tLS0KKworSW4gb3RoZXIgd29yZHM6CisKKyogQSBzdHJpbmcgY29uc3RhbnQgaXMgYW4gYXJiaXRyYXJ5IHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgZW5jbG9zZWQgYnkKK3NpbmdsZS1xdW90ZShgJ2ApLiBBIHNpbmdsZS1xdW90ZSBjYW4gYmUgaW5jbHVkZWQgYnkgcmVwZWF0aW5nIGl0LCBlLmcuCitgJ0l0JydzIHJhaW5pbmcgdG9kYXknYC4gVGhvc2UgYXJlIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIHF1b3RlZAorYGlkZW50aWZpZXJzYCB0aGF0IHVzZSBkb3VibGUtcXVvdGVzLiBBbHRlcm5hdGl2ZWx5LCBhIHN0cmluZyBjYW4gYmUKK2RlZmluZWQgYnkgZW5jbG9zaW5nIHRoZSBhcmJpdHJhcnkgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBieSB0d28gZG9sbGFyCitjaGFyYWN0ZXJzLCBpbiB3aGljaCBjYXNlIHNpbmdsZS1xdW90ZSBjYW4gYmUgdXNlZCB3aXRob3V0IGVzY2FwaW5nCisoYCQkSXQncyByYWluaW5nIHRvZGF5JCRgKS4gVGhhdCBsYXR0ZXIgZm9ybSBpcyBvZnRlbiB1c2VkIHdoZW4gZGVmaW5pbmcKK3hyZWY6Y3FsL2Z1bmN0aW9ucy5hZG9jI3VkZnNbdXNlci1kZWZpbmVkIGZ1bmN0aW9uc10gdG8gYXZvaWQgaGF2aW5nIHRvIGVzY2FwZSBzaW5nbGUtcXVvdGUKK2NoYXJhY3RlcnMgaW4gZnVuY3Rpb24gYm9keSAoYXMgdGhleSBhcmUgbW9yZSBsaWtlbHkgdG8gb2NjdXIgdGhhbgorYCQkYCkuCisqIEludGVnZXIsIGZsb2F0IGFuZCBib29sZWFuIGNvbnN0YW50IGFyZSBkZWZpbmVkIGFzIGV4cGVjdGVkLiBOb3RlCitob3dldmVyIHRoYW4gZmxvYXQgYWxsb3dzIHRoZSBzcGVjaWFsIGBOYU5gIGFuZCBgSW5maW5pdHlgIGNvbnN0YW50cy4KKyogQ1FMIHN1cHBvcnRzCitodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vbml2ZXJzYWxseV91bmlxdWVfaWRlbnRpZmllcltVVUlEXQorY29uc3RhbnRzLgorKiBUaGUgY29udGVudCBmb3IgYmxvYnMgaXMgcHJvdmlkZWQgaW4gaGV4YWRlY2ltYWwgYW5kIHByZWZpeGVkIGJ5IGAweGAuCisqIFRoZSBzcGVjaWFsIGBOVUxMYCBjb25zdGFudCBkZW5vdGVzIHRoZSBhYnNlbmNlIG9mIHZhbHVlLgorCitGb3IgaG93IHRoZXNlIGNvbnN0YW50cyBhcmUgdHlwZWQsIHNlZSB0aGUgeHJlZjpjcWwvdHlwZXMuYWRvY1tEYXRhIHR5cGVzXSBzZWN0aW9uLgorCis9PSBUZXJtcworCitDUUwgaGFzIHRoZSBub3Rpb24gb2YgYSBfdGVybV8sIHdoaWNoIGRlbm90ZXMgdGhlIGtpbmQgb2YgdmFsdWVzIHRoYXQKK0NRTCBzdXBwb3J0LiBUZXJtcyBhcmUgZGVmaW5lZCBieToKKworW3NvdXJjZSwgYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvdGVybS5ibmZbXQorLS0tLQorCitBIHRlcm0gaXMgdGh1cyBvbmUgb2Y6CisKKyogQSB4cmVmOmNxbC9kZWZpbnRpb25zLmFkb2MjY29uc3RhbnRzW2NvbnN0YW50XQorKiBBIGxpdGVyYWwgZm9yIGVpdGhlciBhIHhyZWY6Y3FsL3R5cGVzLmFkb2MjY29sbGVjdGlvbnNbY29sbGVjdGlvbl0sCithIHhyZWY6Y3FsL3R5cGVzLmFkb2MjdWR0c1t1c2VyLWRlZmluZWQgdHlwZV0gb3IgYSB4cmVmOmNxbC90eXBlcy5hZG9jI3R1cGxlc1t0dXBsZV0KKyogQSB4cmVmOmNxbC9mdW5jdGlvbnMuYWRvYyNjcWwtZnVuY3Rpb25zW2Z1bmN0aW9uXSBjYWxsLCBlaXRoZXIgYSB4cmVmOmNxbC9mdW5jdGlvbnMuYWRvYyNzY2FsYXItbmF0aXZlLWZ1bmN0aW9uc1tuYXRpdmUgZnVuY3Rpb25dCitvciBhIHhyZWY6Y3FsL2Z1bmN0aW9ucy5hZG9jI3VzZXItZGVmaW5lZC1zY2FsYXItZnVuY3Rpb25zW3VzZXItZGVmaW5lZCBmdW5jdGlvbl0KKyogQW4geHJlZjpjcWwvb3BlcmF0b3JzLmFkb2MjYXJpdGhtZXRpY19vcGVyYXRvcnNbYXJpdGhtZXRpYyBvcGVyYXRpb25dIGJldHdlZW4gdGVybXMKKyogQSB0eXBlIGhpbnQKKyogQSBiaW5kIG1hcmtlciwgd2hpY2ggZGVub3RlcyBhIHZhcmlhYmxlIHRvIGJlIGJvdW5kIGF0IGV4ZWN1dGlvbiB0aW1lLgorU2VlIHRoZSBzZWN0aW9uIG9uIGBwcmVwYXJlZC1zdGF0ZW1lbnRzYCBmb3IgZGV0YWlscy4gQSBiaW5kIG1hcmtlciBjYW4KK2JlIGVpdGhlciBhbm9ueW1vdXMgKGA/YCkgb3IgbmFtZWQgKGA6c29tZV9uYW1lYCkuIFRoZSBsYXR0ZXIgZm9ybQorcHJvdmlkZXMgYSBtb3JlIGNvbnZlbmllbnQgd2F5IHRvIHJlZmVyIHRvIHRoZSB2YXJpYWJsZSBmb3IgYmluZGluZyBpdAorYW5kIHNob3VsZCBnZW5lcmFsbHkgYmUgcHJlZmVycmVkLgorCis9PSBDb21tZW50cworCitBIGNvbW1lbnQgaW4gQ1FMIGlzIGEgbGluZSBiZWdpbm5pbmcgYnkgZWl0aGVyIGRvdWJsZSBkYXNoZXMgKGAtLWApIG9yCitkb3VibGUgc2xhc2ggKGAvL2ApLgorCitNdWx0aS1saW5lIGNvbW1lbnRzIGFyZSBhbHNvIHN1cHBvcnRlZCB0aHJvdWdoIGVuY2xvc3VyZSB3aXRoaW4gYC8qYCBhbmQKK2AqL2AgKGJ1dCBuZXN0aW5nIGlzIG5vdCBzdXBwb3J0ZWQpLgorCitbc291cmNlLGNxbF0KKy0tLS0KKy0tIFRoaXMgaXMgYSBjb21tZW50CisvLyBUaGlzIGlzIGEgY29tbWVudCB0b28KKy8qIFRoaXMgaXMKKyAgIGEgbXVsdGktbGluZSBjb21tZW50ICovCistLS0tCisKKz09IFN0YXRlbWVudHMKKworQ1FMIGNvbnNpc3RzIG9mIHN0YXRlbWVudHMgdGhhdCBjYW4gYmUgZGl2aWRlZCBpbiB0aGUgZm9sbG93aW5nCitjYXRlZ29yaWVzOgorCisqIGBkYXRhLWRlZmluaXRpb25gIHN0YXRlbWVudHMsIHRvIGRlZmluZSBhbmQgY2hhbmdlIGhvdyB0aGUgZGF0YSBpcworc3RvcmVkIChrZXlzcGFjZXMgYW5kIHRhYmxlcykuCisqIGBkYXRhLW1hbmlwdWxhdGlvbmAgc3RhdGVtZW50cywgZm9yIHNlbGVjdGluZywgaW5zZXJ0aW5nIGFuZCBkZWxldGluZworZGF0YS4KKyogYHNlY29uZGFyeS1pbmRleGVzYCBzdGF0ZW1lbnRzLgorKiBgbWF0ZXJpYWxpemVkLXZpZXdzYCBzdGF0ZW1lbnRzLgorKiBgY3FsLXJvbGVzYCBzdGF0ZW1lbnRzLgorKiBgY3FsLXBlcm1pc3Npb25zYCBzdGF0ZW1lbnRzLgorKiBgVXNlci1EZWZpbmVkIEZ1bmN0aW9ucyAoVURGcylgIHN0YXRlbWVudHMuCisqIGB1ZHRzYCBzdGF0ZW1lbnRzLgorKiBgY3FsLXRyaWdnZXJzYCBzdGF0ZW1lbnRzLgorCitBbGwgdGhlIHN0YXRlbWVudHMgYXJlIGxpc3RlZCBiZWxvdyBhbmQgYXJlIGRlc2NyaWJlZCBpbiB0aGUgcmVzdCBvZgordGhpcyBkb2N1bWVudGF0aW9uIChzZWUgbGlua3MgYWJvdmUpOgorCitbc291cmNlLCBibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9jcWxfc3RhdGVtZW50LmJuZltdCistLS0tCisKKz09IFByZXBhcmVkIFN0YXRlbWVudHMKKworQ1FMIHN1cHBvcnRzIF9wcmVwYXJlZCBzdGF0ZW1lbnRzXy4gUHJlcGFyZWQgc3RhdGVtZW50cyBhcmUgYW4KK29wdGltaXphdGlvbiB0aGF0IGFsbG93cyB0byBwYXJzZSBhIHF1ZXJ5IG9ubHkgb25jZSBidXQgZXhlY3V0ZSBpdAorbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgY29uY3JldGUgdmFsdWVzLgorCitBbnkgc3RhdGVtZW50IHRoYXQgdXNlcyBhdCBsZWFzdCBvbmUgYmluZCBtYXJrZXIgKHNlZSBgYmluZF9tYXJrZXJgKQord2lsbCBuZWVkIHRvIGJlIF9wcmVwYXJlZF8uIEFmdGVyIHdoaWNoIHRoZSBzdGF0ZW1lbnQgY2FuIGJlIF9leGVjdXRlZF8KK2J5IHByb3ZpZGVkIGNvbmNyZXRlIHZhbHVlcyBmb3IgZWFjaCBvZiBpdHMgbWFya2VyLiBUaGUgZXhhY3QgZGV0YWlscyBvZgoraG93IGEgc3RhdGVtZW50IGlzIHByZXBhcmVkIGFuZCB0aGVuIGV4ZWN1dGVkIGRlcGVuZHMgb24gdGhlIENRTCBkcml2ZXIKK3VzZWQgYW5kIHlvdSBzaG91bGQgcmVmZXIgdG8geW91ciBkcml2ZXIgZG9jdW1lbnRhdGlvbi4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9kbWwuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9kbWwuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGI5Mzc0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL2RtbC5hZG9jCkBAIC0wLDAgKzEsNDY1IEBACis9IERhdGEgTWFuaXB1bGF0aW9uCisKK1RoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIHN0YXRlbWVudHMgc3VwcG9ydGVkIGJ5IENRTCB0byBpbnNlcnQsCit1cGRhdGUsIGRlbGV0ZSBhbmQgcXVlcnkgZGF0YS4KKworW1tzZWxlY3Qtc3RhdGVtZW50XV0KKz09IFNFTEVDVAorCitRdWVyeWluZyBkYXRhIGZyb20gZGF0YSBpcyBkb25lIHVzaW5nIGEgYFNFTEVDVGAgc3RhdGVtZW50OgorCitbc291cmNlLGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL3NlbGVjdF9zdGF0ZW1lbnQuYm5mW10KKy0tLS0KKworRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvc2VsZWN0X3N0YXRlbWVudC5jcWxbXQorLS0tLQorCitUaGUgYFNFTEVDVGAgc3RhdGVtZW50cyByZWFkcyBvbmUgb3IgbW9yZSBjb2x1bW5zIGZvciBvbmUgb3IgbW9yZSByb3dzCitpbiBhIHRhYmxlLiBJdCByZXR1cm5zIGEgcmVzdWx0LXNldCBvZiB0aGUgcm93cyBtYXRjaGluZyB0aGUgcmVxdWVzdCwKK3doZXJlIGVhY2ggcm93IGNvbnRhaW5zIHRoZSB2YWx1ZXMgZm9yIHRoZSBzZWxlY3Rpb24gY29ycmVzcG9uZGluZyB0bwordGhlIHF1ZXJ5LiBBZGRpdGlvbmFsbHksIHhyZWY6Y3FsL2Z1bmN0aW9ucy5hZG9jI2NxbC1mdW5jdGlvbnNbZnVuY3Rpb25zXSBpbmNsdWRpbmcKK3hyZWY6Y3FsL2Z1bmN0aW9ucy5hZG9jI2FnZ3JlZ2F0ZS1mdW5jdGlvbnNbYWdncmVnYXRpb25zXSBjYW4gYmUgYXBwbGllZCB0byB0aGUgcmVzdWx0LgorCitBIGBTRUxFQ1RgIHN0YXRlbWVudCBjb250YWlucyBhdCBsZWFzdCBhIHhyZWY6Y3FsL2RtbC5hZG9jI3NlbGVjdGlvbi1jbGF1c2Vbc2VsZWN0aW9uIGNsYXVzZV0gYW5kIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSBvbiB3aGljaAordGhlIHNlbGVjdGlvbiBpcyBleGVjdXRlZC4gCitDUUwgZG9lcyAqbm90KiBleGVjdXRlIGpvaW5zIG9yIHN1Yi1xdWVyaWVzIGFuZCBhIHNlbGVjdCBzdGF0ZW1lbnQgb25seSBhcHBseSB0byBhIHNpbmdsZSB0YWJsZS4gCitBIHNlbGVjdCBzdGF0ZW1lbnQgY2FuIGFsc28gaGF2ZSBhIHhyZWY6Y3FsL2RtbC5hZG9jI3doZXJlLWNsYXVzZVt3aGVyZSBjbGF1c2VdIHRoYXQgY2FuIGZ1cnRoZXIgbmFycm93IHRoZSBxdWVyeSByZXN1bHRzLgorQWRkaXRpb25hbCBjbGF1c2VzIGNhbiB4cmVmOmNxbC9kbWwuYWRvYyNvcmRlcmluZy1jbGF1c2Vbb3JkZXJdIG9yIHhyZWY6Y3FsL2RtbC5hZG9jI2xpbWl0LWNsYXVzZVtsaW1pdF0gdGhlIHJlc3VsdHMuIAorTGFzdGx5LCB4cmVmOmNxbC9kbWwuYWRvYyNhbGxvdy1maWx0ZXJpbmdbcXVlcmllcyB0aGF0IHJlcXVpcmUgZnVsbCBjbHVzdGVyIGZpbHRlcmluZ10gY2FuIGFwcGVuZCBgQUxMT1cgRklMVEVSSU5HYCB0byBhbnkgcXVlcnkuCitGb3IgdmlydHVhbCB0YWJsZXMsIGZyb20gaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMTgyMzhbQ0FTU0FORFJBLTE4MjM4XSwgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBzcGVjaWZ5IGBBTExPVyBGSUxURVJJTkdgIHdoZW4gYSBxdWVyeSB3b3VsZCBub3JtYWxseSByZXF1aXJlIHRoYXQuIFBsZWFzZSBjb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIGZvciB2aXJ0dWFsIHRhYmxlcyB0byBrbm93IG1vcmUuCisKK1tbc2VsZWN0aW9uLWNsYXVzZV1dCis9PT0gU2VsZWN0aW9uIGNsYXVzZQorCitUaGUgYHNlbGVjdF9jbGF1c2VgIGRldGVybWluZXMgd2hpY2ggY29sdW1ucyB3aWxsIGJlIHF1ZXJpZWQgYW5kIHJldHVybmVkIGluIHRoZSByZXN1bHQgc2V0LiAKK1RoaXMgY2xhdXNlIGNhbiBhbHNvIGFwcGx5IHRyYW5zZm9ybWF0aW9ucyB0byBhcHBseSB0byB0aGUgcmVzdWx0IGJlZm9yZSByZXR1cm5pbmcuIAorVGhlIHNlbGVjdGlvbiBjbGF1c2UgY29uc2lzdHMgb2YgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBzcGVjaWZpYyBfc2VsZWN0b3JzXyBvciwgYWx0ZXJuYXRpdmVseSwgdGhlIHdpbGRjYXJkIGNoYXJhY3RlciAoYCpgKSB0byBzZWxlY3QgYWxsIHRoZSBjb2x1bW5zIGRlZmluZWQgaW4gdGhlIHRhYmxlLgorCis9PT09IFNlbGVjdG9ycworCitBIGBzZWxlY3RvcmAgY2FuIGJlIG9uZSBvZjoKKworKiBBIGNvbHVtbiBuYW1lIG9mIHRoZSB0YWJsZSBzZWxlY3RlZCwgdG8gcmV0cmlldmUgdGhlIHZhbHVlcyBmb3IgdGhhdAorY29sdW1uLgorKiBBIHRlcm0sIHdoaWNoIGlzIHVzdWFsbHkgdXNlZCBuZXN0ZWQgaW5zaWRlIG90aGVyIHNlbGVjdG9ycyBsaWtlCitmdW5jdGlvbnMgKGlmIGEgdGVybSBpcyBzZWxlY3RlZCBkaXJlY3RseSwgdGhlbiB0aGUgY29ycmVzcG9uZGluZyBjb2x1bW4KK29mIHRoZSByZXN1bHQtc2V0IHdpbGwgc2ltcGx5IGhhdmUgdGhlIHZhbHVlIG9mIHRoaXMgdGVybSBmb3IgZXZlcnkgcm93CityZXR1cm5lZCkuCisqIEEgY2FzdGluZywgd2hpY2ggYWxsb3dzIHRvIGNvbnZlcnQgYSBuZXN0ZWQgc2VsZWN0b3IgdG8gYSAoY29tcGF0aWJsZSkKK3R5cGUuCisqIEEgZnVuY3Rpb24gY2FsbCwgd2hlcmUgdGhlIGFyZ3VtZW50cyBhcmUgc2VsZWN0b3IgdGhlbXNlbHZlcy4gU2VlIHRoZQorc2VjdGlvbiBvbiB4cmVmOmNxbC9mdW5jdGlvbnMuYWRvYyNjcWwtZnVuY3Rpb25zW2Z1bmN0aW9uc10gZm9yIG1vcmUgZGV0YWlscy4KKyogVGhlIHNwZWNpYWwgY2FsbCBgQ09VTlQoKilgIHRvIHRoZSB4cmVmOmNxbC9mdW5jdGlvbnMuYWRvYyNjb3VudC1mdW5jdGlvbltDT1VOVCBmdW5jdGlvbl0sCit3aGljaCBjb3VudHMgYWxsIG5vbi1udWxsIHJlc3VsdHMuCisKKz09PT0gQWxpYXNlcworCitFdmVyeSBfdG9wLWxldmVsXyBzZWxlY3RvciBjYW4gYWxzbyBiZSBhbGlhc2VkICh1c2luZyBBUykuCitJZiBzbywgdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY29sdW1uIGluIHRoZSByZXN1bHQgc2V0IHdpbGwgYmUKK3RoYXQgb2YgdGhlIGFsaWFzLiBGb3IgaW5zdGFuY2U6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvYXMuY3FsW10KKy0tLS0KKworW05PVEVdCis9PT09CitDdXJyZW50bHksIGFsaWFzZXMgYXJlbid0IHJlY29nbml6ZWQgaW4gdGhlIGBXSEVSRWAgb3IgYE9SREVSIEJZYCBjbGF1c2VzIGluIHRoZSBzdGF0ZW1lbnQuCitZb3UgbXVzdCB1c2UgdGhlIG9yaWduYWwgY29sdW1uIG5hbWUgaW5zdGVhZC4KKz09PT0KKworW1t3cml0ZXRpbWUtYW5kLXR0bC1mdW5jdGlvbl1dCis9PT09IGBXUklURVRJTUVgLCBgTUFYV1JJVEVUSU1FYCBhbmQgYFRUTGAgZnVuY3Rpb24KKworU2VsZWN0aW9uIHN1cHBvcnRzIHRocmVlIHNwZWNpYWwgZnVuY3Rpb25zIHRoYXQgYXJlbid0IGFsbG93ZWQgYW55d2hlcmUKK2Vsc2U6IGBXUklURVRJTUVgLCBgTUFYV1JJVEVUSU1FYCBhbmQgYFRUTGAuCitBbGwgZnVuY3Rpb25zIHRha2Ugb25seSBvbmUgYXJndW1lbnQsIGEgY29sdW1uIG5hbWUuIElmIHRoZSBjb2x1bW4gaXMgYSBjb2xsZWN0aW9uIG9yIFVEVCwgaXQncyBwb3NzaWJsZSB0byBhZGQgZWxlbWVudAorc2VsZWN0b3JzLCBzdWNoIGFzIGBXUklURVRUSU1FKHBob25lc1syLi40XSlgIG9yIGBXUklURVRUSU1FKHVzZXIubmFtZSlgLgorVGhlc2UgZnVuY3Rpb25zIHJldHJpZXZlIG1ldGEtaW5mb3JtYXRpb24gdGhhdCBpcyBzdG9yZWQgaW50ZXJuYWxseSBmb3IgZWFjaCBjb2x1bW46CisKKyogYFdSSVRFVElNRWAgc3RvcmVzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4uCisqIGBNQVhXUklURVRJTUVgIHN0b3JlcyB0aGUgbGFyZ2VzdCB0aW1lc3RhbXAgb2YgdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4uIEZvciBub24tY29sbGVjdGlvbiBhbmQgbm9uLVVEVCBjb2x1bW5zLCBgTUFYV1JJVEVUSU1FYAoraXMgZXF1aXZhbGVudCB0byBgV1JJVEVUSU1FYC4gSW4gdGhlIG90aGVyIGNhc2VzLCBpdCByZXR1cm5zIHRoZSBsYXJnZXN0IHRpbWVzdGFtcCBvZiB0aGUgdmFsdWVzIGluIHRoZSBjb2x1bW4uCisqIGBUVExgIHN0b3JlcyB0aGUgcmVtYWluaW5nIHRpbWUgdG8gbGl2ZSAoaW4gc2Vjb25kcykgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uIGlmIGl0IGlzIHNldCB0byBleHBpcmU7IG90aGVyd2lzZSB0aGUgdmFsdWUgaXMgYG51bGxgLgorCitUaGUgYFdSSVRFVElNRWAgYW5kIGBUVExgIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBvbiBtdWx0aS1jZWxsIGNvbHVtbnMgc3VjaCBhcyBub24tZnJvemVuIGNvbGxlY3Rpb25zIG9yIG5vbi1mcm96ZW4KK3VzZXItZGVmaW5lZCB0eXBlcy4gSW4gdGhhdCBjYXNlLCB0aGUgZnVuY3Rpb25zIHdpbGwgcmV0dXJuIHRoZSBsaXN0IG9mIHRpbWVzdGFtcHMgb3IgVFRMcyBmb3IgZWFjaCBzZWxlY3RlZCBjZWxsLgorCitbW3doZXJlLWNsYXVzZV1dCis9PT0gVGhlIGBXSEVSRWAgY2xhdXNlCisKK1RoZSBgV0hFUkVgIGNsYXVzZSBzcGVjaWZpZXMgd2hpY2ggcm93cyBhcmUgcXVlcmllZC4gSXQgc3BlY2lmaWVzCithIHJlbGF0aW9uc2hpcCBmb3IgYFBSSU1BUlkgS0VZYCBjb2x1bW5zIG9yIGEgY29sdW1uIHRoYXQgaGFzCithIHhyZWY6Y3FsL2luZGV4ZXMuYWRvYyNjcmVhdGUtaW5kZXgtc3RhdGVtZW50W3NlY29uZGFyeSBpbmRleF0gZGVmaW5lZCwgYWxvbmcgd2l0aCBhIHNldCB2YWx1ZS4KKworTm90IGFsbCByZWxhdGlvbnNoaXBzIGFyZSBhbGxvd2VkIGluIGEgcXVlcnkuIEZvciBpbnN0YW5jZSwgb25seSBhbiBlcXVhbGl0eQoraXMgYWxsb3dlZCBvbiBhIHBhcnRpdGlvbiBrZXkuIFRoZSBgSU5gIGNsYXVzZSBpcyBjb25zaWRlcmVkIGFuIGVxdWFsaXR5IGZvciBvbmUgb3IgbW9yZSB2YWx1ZXMuCitUaGUgYFRPS0VOYCBjbGF1c2UgY2FuIGJlIHVzZWQgdG8gcXVlcnkgZm9yIHBhcnRpdGlvbiBrZXkgbm9uLWVxdWFsaXRpZXMuCitBIHBhcnRpdGlvbiBrZXkgbXVzdCBiZSBzcGVjaWZpZWQgYmVmb3JlIGNsdXN0ZXJpbmcgY29sdW1ucyBpbiB0aGUgYFdIRVJFYCBjbGF1c2UuIFRoZSByZWxhdGlvbnNoaXAgCitmb3IgY2x1c3RlcmluZyBjb2x1bW5zIG11c3Qgc3BlY2lmeSBhICpjb250aWd1b3VzKiBzZXQgb2Ygcm93cyB0byBvcmRlci4KKworRm9yIGluc3RhbmNlLCBnaXZlbjoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC90YWJsZV9mb3Jfd2hlcmUuY3FsW10KKy0tLS0KKworVGhlIGZvbGxvd2luZyBxdWVyeSBpcyBhbGxvd2VkOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML3doZXJlLmNxbFtdCistLS0tCisKK0J1dCB0aGUgZm9sbG93aW5nIG9uZSBpcyBub3QsIGFzIGl0IGRvZXMgbm90IHNlbGVjdCBhIGNvbnRpZ3VvdXMgc2V0IG9mCityb3dzIChhbmQgd2Ugc3VwcG9zZSBubyBzZWNvbmRhcnkgaW5kZXhlcyBhcmUgc2V0KToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC93aGVyZV9mYWlsLmNxbFtdCistLS0tCisKK1doZW4gc3BlY2lmeWluZyByZWxhdGlvbnNoaXBzLCB0aGUgYFRPS0VOYCBmdW5jdGlvbiBjYW4gYmUgYXBwbGllZCB0byB0aGUgYFBBUlRJVElPTiBLRVlgIGNvbHVtbiB0byBxdWVyeS4gCitSb3dzIHdpbGwgYmUgc2VsZWN0ZWQgYmFzZWQgb24gdGhlIHRva2VuIG9mIHRoZSBgUEFSVElUSU9OX0tFWWAgcmF0aGVyIHRoYW4gb24gdGhlIHZhbHVlLgorW0lNUE9SVEFOVF0KKz09PT0KK1RoZSB0b2tlbiBvZiBhIGtleSBkZXBlbmRzIG9uIHRoZSBwYXJ0aXRpb25lciBpbiB1c2UsIGFuZCB0aGF0CitpbiBwYXJ0aWN1bGFyIHRoZSBgUmFuZG9tUGFydGl0aW9uZXJgIHdvbid0IHlpZWxkIGEgbWVhbmluZ2Z1bCBvcmRlci4gCitBbHNvIG5vdGUgdGhhdCBvcmRlcmluZyBwYXJ0aXRpb25lcnMgYWx3YXlzIG9yZGVyIHRva2VuIHZhbHVlcyBieSBieXRlcyAoc28KK2V2ZW4gaWYgdGhlIHBhcnRpdGlvbiBrZXkgaXMgb2YgdHlwZSBpbnQsIGB0b2tlbigtMSkgPiB0b2tlbigwKWAgaW4KK3BhcnRpY3VsYXIpLiAKKz09PT0KKworRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvdG9rZW4uY3FsW10KKy0tLS0KKworVGhlIGBJTmAgcmVsYXRpb25zaGlwIGlzIG9ubHkgYWxsb3dlZCBvbiB0aGUgbGFzdCBjb2x1bW4gb2YgdGhlCitwYXJ0aXRpb24ga2V5IG9yIG9uIHRoZSBsYXN0IGNvbHVtbiBvZiB0aGUgZnVsbCBwcmltYXJ5IGtleS4KKworSXQgaXMgYWxzbyBwb3NzaWJsZSB0byDigJxncm91cOKAnSBgQ0xVU1RFUklORyBDT0xVTU5TYCB0b2dldGhlciBpbiBhCityZWxhdGlvbiB1c2luZyB0aGUgdHVwbGUgbm90YXRpb24uIAorCitGb3IgZXhhbXBsZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC93aGVyZV9ncm91cF9jbHVzdGVyX2NvbHVtbnMuY3FsW10KKy0tLS0KKworVGhpcyBxdWVyeSB3aWxsIHJldHVybiBhbGwgcm93cyB0aGF0IHNvcnQgYWZ0ZXIgdGhlIG9uZSBoYXZpbmcg4oCcSm9obidzIEJsb2figJ0gYXMKK2BibG9nX3RpbGVgIGFuZCAnMjAxMi0wMS0wMScgZm9yIGBwb3N0ZWRfYXRgIGluIHRoZSBjbHVzdGVyaW5nIG9yZGVyLiBJbgorcGFydGljdWxhciwgcm93cyBoYXZpbmcgYSBgcG9zdF9hdCA8PSAnMjAxMi0wMS0wMSdgIHdpbGwgYmUgcmV0dXJuZWQsIGFzCitsb25nIGFzIHRoZWlyIGBibG9nX3RpdGxlID4gJ0pvaG4nJ3MgQmxvZydgLiAKKworVGhhdCB3b3VsZCBub3QgYmUgdGhlIGNhc2UgZm9yIHRoaXMgZXhhbXBsZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC93aGVyZV9ub19ncm91cF9jbHVzdGVyX2NvbHVtbnMuY3FsW10KKy0tLS0KKworVGhlIHR1cGxlIG5vdGF0aW9uIG1heSBhbHNvIGJlIHVzZWQgZm9yIGBJTmAgY2xhdXNlcyBvbiBjbHVzdGVyaW5nIGNvbHVtbnM6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvd2hlcmVfaW5fdHVwbGUuY3FsW10KKy0tLS0KKworVGhlIGBDT05UQUlOU2Agb3BlcmF0b3IgbWF5IG9ubHkgYmUgdXNlZCBmb3IgY29sbGVjdGlvbiBjb2x1bW5zIChsaXN0cywKK3NldHMsIGFuZCBtYXBzKS4gSW4gdGhlIGNhc2Ugb2YgbWFwcywgYENPTlRBSU5TYCBhcHBsaWVzIHRvIHRoZSBtYXAKK3ZhbHVlcy4gVGhlIGBDT05UQUlOUyBLRVlgIG9wZXJhdG9yIG1heSBvbmx5IGJlIHVzZWQgb24gbWFwIGNvbHVtbnMgYW5kCithcHBsaWVzIHRvIHRoZSBtYXAga2V5cy4KKworW1tncm91cC1ieS1jbGF1c2VdXQorPT09IEdyb3VwaW5nIHJlc3VsdHMKKworVGhlIGBHUk9VUCBCWWAgb3B0aW9uIGNhbiBjb25kZW5zZSBhbGwgc2VsZWN0ZWQKK3Jvd3MgdGhhdCBzaGFyZSB0aGUgc2FtZSB2YWx1ZXMgZm9yIGEgc2V0IG9mIGNvbHVtbnMgaW50byBhIHNpbmdsZSByb3cuCisKK1VzaW5nIHRoZSBgR1JPVVAgQllgIG9wdGlvbiwgcm93cyBjYW4gYmUgZ3JvdXBlZCBhdCB0aGUgcGFydGl0aW9uIGtleSBvciBjbHVzdGVyaW5nIGNvbHVtbiBsZXZlbC4gCitDb25zZXF1ZW50bHksIHRoZSBgR1JPVVAgQllgIG9wdGlvbiBvbmx5IGFjY2VwdHMgcHJpbWFyeSBrZXkgY29sdW1ucyBpbiBkZWZpbmVkIG9yZGVyIGFzIGFyZ3VtZW50cy4KK0lmIGEgcHJpbWFyeSBrZXkgY29sdW1uIGlzIHJlc3RyaWN0ZWQgYnkgYW4gZXF1YWxpdHkgcmVzdHJpY3Rpb24sIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgYEdST1VQIEJZYCBjbGF1c2UuCisKK0FnZ3JlZ2F0ZSBmdW5jdGlvbnMgd2lsbCBwcm9kdWNlIGEgc2VwYXJhdGUgdmFsdWUgZm9yIGVhY2ggZ3JvdXAuIAorSWYgbm8gYEdST1VQIEJZYCBjbGF1c2UgaXMgc3BlY2lmaWVkLCBhZ2dyZWdhdGVzIGZ1bmN0aW9ucyB3aWxsIHByb2R1Y2UgYSBzaW5nbGUgdmFsdWUgZm9yIGFsbCB0aGUgcm93cy4KKworSWYgYSBjb2x1bW4gaXMgc2VsZWN0ZWQgd2l0aG91dCBhbiBhZ2dyZWdhdGUgZnVuY3Rpb24sIGluIGEgc3RhdGVtZW50Cit3aXRoIGEgYEdST1VQIEJZYCwgdGhlIGZpcnN0IHZhbHVlIGVuY291bnRlciBpbiBlYWNoIGdyb3VwIHdpbGwgYmUKK3JldHVybmVkLgorCitbW29yZGVyaW5nLWNsYXVzZV1dCis9PT0gT3JkZXJpbmcgcmVzdWx0cworCitUaGUgYE9SREVSIEJZYCBjbGF1c2Ugc2VsZWN0cyB0aGUgb3JkZXIgb2YgdGhlIHJldHVybmVkIHJlc3VsdHMuIAorVGhlIGFyZ3VtZW50IGlzIGEgbGlzdCBvZiBjb2x1bW4gbmFtZXMgYW5kIGVhY2ggY29sdW1uJ3Mgb3JkZXIgCisoYEFTQ2AgZm9yIGFzY2VuZGFudCBhbmQgYERFU0NgIGZvciBkZXNjZW5kYW50LAorVGhlIHBvc3NpYmxlIG9yZGVyaW5ncyBhcmUgbGltaXRlZCBieSB0aGUgeHJlZjpjcWwvZGRsLmFkb2MjY2x1c3RlcmluZy1vcmRlcltjbHVzdGVyaW5nIG9yZGVyXSBkZWZpbmVkIG9uIHRoZSB0YWJsZToKKworKiBpZiB0aGUgdGFibGUgaGFzIGJlZW4gZGVmaW5lZCB3aXRob3V0IGFueSBzcGVjaWZpYyBgQ0xVU1RFUklORyBPUkRFUmAsIHRoZW4gdGhlIG9yZGVyIGlzIGFzIGRlZmluZWQgYnkgdGhlIGNsdXN0ZXJpbmcgY29sdW1ucworb3IgdGhlIHJldmVyc2UKKyogb3RoZXJ3aXNlLCB0aGUgb3JkZXIgaXMgZGVmaW5lZCBieSB0aGUgYENMVVNURVJJTkcgT1JERVJgIG9wdGlvbiBhbmQgdGhlIHJldmVyc2VkIG9uZS4KKworW1tsaW1pdC1jbGF1c2VdXQorPT09IExpbWl0aW5nIHJlc3VsdHMKKworVGhlIGBMSU1JVGAgb3B0aW9uIHRvIGEgYFNFTEVDVGAgc3RhdGVtZW50IGxpbWl0cyB0aGUgbnVtYmVyIG9mIHJvd3MKK3JldHVybmVkIGJ5IGEgcXVlcnkuIFRoZSBgUEVSIFBBUlRJVElPTiBMSU1JVGAgb3B0aW9uIGxpbWl0cyB0aGUKK251bWJlciBvZiByb3dzIHJldHVybmVkIGZvciBhIGdpdmVuIHBhcnRpdGlvbiBieSB0aGUgcXVlcnkuIEJvdGggdHlwZXMgb2YgbGltaXRzIGNhbiB1c2VkIGluIHRoZSBzYW1lIHN0YXRlbWVudC4KKworW1thbGxvdy1maWx0ZXJpbmddXQorPT09IEFsbG93aW5nIGZpbHRlcmluZworCitCeSBkZWZhdWx0LCBDUUwgb25seSBhbGxvd3Mgc2VsZWN0IHF1ZXJpZXMgdGhhdCBkb24ndCBpbnZvbHZlIGEgZnVsbCBzY2FuIG9mIGFsbCBwYXJ0aXRpb25zLiAKK0lmIGFsbCBwYXJ0aXRpb25zIGFyZSBzY2FubmVkLCB0aGVuIHJldHVybmluZyB0aGUgcmVzdWx0cyBtYXkgZXhwZXJpZW5jZSBhIHNpZ25pZmljYW50IGxhdGVuY3kgcHJvcG9ydGlvbmFsIHRvIHRoZSAKK2Ftb3VudCBvZiBkYXRhIGluIHRoZSB0YWJsZS4gVGhlIGBBTExPVyBGSUxURVJJTkdgIG9wdGlvbiBleHBsaWNpdGx5IGV4ZWN1dGVzIGEgZnVsbCBzY2FuLiBUaHVzLCB0aGUgcGVyZm9ybWFuY2Ugb2YgCit0aGUgcXVlcnkgY2FuIGJlIHVucHJlZGljdGFibGUuCisKK0ZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIHRhYmxlIG9mIHVzZXIgcHJvZmlsZXMgd2l0aCBiaXJ0aCB5ZWFyIGFuZCBjb3VudHJ5IG9mIHJlc2lkZW5jZS4gCitUaGUgYmlydGggeWVhciBoYXMgYSBzZWNvbmRhcnkgaW5kZXggZGVmaW5lZC4KKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9hbGxvd19maWx0ZXJpbmcuY3FsW10KKy0tLS0KKworVGhlIGZvbGxvd2luZyBxdWVyaWVzIGFyZSB2YWxpZDoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9xdWVyeV9hbGxvd19maWx0ZXJpbmcuY3FsW10KKy0tLS0KKworSW4gYm90aCBjYXNlcywgdGhlIHF1ZXJ5IHBlcmZvcm1hbmNlIGlzIHByb3BvcnRpb25hbCB0byB0aGUgYW1vdW50IG9mIGRhdGEgcmV0dXJuZWQuIAorVGhlIGZpcnN0IHF1ZXJ5IHJldHVybnMgYWxsIHJvd3MsIGJlY2F1c2UgYWxsIHVzZXJzIGFyZSBzZWxlY3RlZC4KK1RoZSBzZWNvbmQgcXVlcnkgcmV0dXJucyBvbmx5IHRoZSByb3dzIGRlZmluZWQgYnkgdGhlIHNlY29uZGFyeSBpbmRleCwgYSBwZXItbm9kZSBpbXBsZW1lbnRhdGlvbjsgdGhlIHJlc3VsdHMgd2lsbAorZGVwZW5kIG9uIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlIGNsdXN0ZXIsIGFuZCBpcyBpbmRpcmVjdGx5IHByb3BvcnRpb25hbCB0byB0aGUgYW1vdW50IG9mIGRhdGEgc3RvcmVkLgorVGhlIG51bWJlciBvZiBub2RlcyB3aWxsIGFsd2F5cyBiZSBtdWx0aXBsZSBudW1iZXIgb2YgbWFnbml0dWRlIGxvd2VyIHRoYW4gdGhlIG51bWJlciBvZiB1c2VyIHByb2ZpbGVzIHN0b3JlZC4gCitCb3RoIHF1ZXJpZXMgbWF5IHJldHVybiB2ZXJ5IGxhcmdlIHJlc3VsdCBzZXRzLCBidXQgdGhlIGFkZGl0aW9uIG9mIGEgYExJTUlUYCBjbGF1c2UgY2FuIHJlZHVjZWQgdGhlIGxhdGVuY3kuCisKK1RoZSBmb2xsb3dpbmcgcXVlcnkgd2lsbCBiZSByZWplY3RlZDoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9xdWVyeV9mYWlsX2FsbG93X2ZpbHRlcmluZy5jcWxbXQorLS0tLQorCitDYXNzYW5kcmEgY2Fubm90IGd1YXJhbnRlZSB0aGF0IGxhcmdlIGFtb3VudHMgb2YgZGF0YSB3b24ndCBoYXZlIHRvIHNjYW5uZWQgYW1vdW50IG9mIGRhdGEsIGV2ZW4gaWYgdGhlIHJlc3VsdCBpcyBzbWFsbC4gCitJZiB5b3Uga25vdyB0aGF0IHRoZSBkYXRhc2V0IGlzIHNtYWxsLCBhbmQgdGhlIHBlcmZvcm1hbmNlIHdpbGwgYmUgcmVhc29uYWJsZSwgYWRkIGBBTExPVyBGSUxURVJJTkdgIHRvIGFsbG93IHRoZSBxdWVyeSB0byAKK2V4ZWN1dGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvcXVlcnlfbm9mYWlsX2FsbG93X2ZpbHRlcmluZy5jcWxbXQorLS0tLQorCitbW2luc2VydC1zdGF0ZW1lbnRdXQorPT0gSU5TRVJUCisKK0luc2VydGluZyBkYXRhIGZvciBhIHJvdyBpcyBkb25lIHVzaW5nIGFuIGBJTlNFUlRgIHN0YXRlbWVudDoKKworW3NvdXJjZSxibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9pbnNlcnRfc3RhdGVtZW50LmJuZltdCistLS0tCisKK0ZvciBleGFtcGxlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2luc2VydF9zdGF0ZW1lbnQuY3FsW10KKy0tLS0KKworVGhlIGBJTlNFUlRgIHN0YXRlbWVudCB3cml0ZXMgb25lIG9yIG1vcmUgY29sdW1ucyBmb3IgYSBnaXZlbiByb3cgaW4gYQordGFibGUuIAorU2luY2UgYSByb3cgaXMgaWRlbnRpZmllZCBieSBpdHMgYFBSSU1BUlkgS0VZYCwgYXQgbGVhc3Qgb25lIGNvbHVtbnMgbXVzdCBiZSBzcGVjaWZpZWQuIAorVGhlIGxpc3Qgb2YgY29sdW1ucyB0byBpbnNlcnQgbXVzdCBiZSBzdXBwbGllZCB3aXRoIHRoZSBgVkFMVUVTYCBzeW50YXguIAorV2hlbiB1c2luZyB0aGUgYEpTT05gIHN5bnRheCwgYFZBTFVFU2AgYXJlIG9wdGlvbmFsLiAKK1NlZSB0aGUgc2VjdGlvbiBvbiB4cmVmOmNxbC9kbWwuYWRvYyNjcWwtanNvbltKU09OIHN1cHBvcnRdIGZvciBtb3JlIGRldGFpbC4KK0FsbCB1cGRhdGVzIGZvciBhbiBgSU5TRVJUYCBhcmUgYXBwbGllZCBhdG9taWNhbGx5IGFuZCBpbiBpc29sYXRpb24uCisKK1VubGlrZSBpbiBTUUwsIGBJTlNFUlRgIGRvZXMgbm90IGNoZWNrIHRoZSBwcmlvciBleGlzdGVuY2Ugb2YgdGhlIHJvdyBieSBkZWZhdWx0LiAKK1RoZSByb3cgaXMgY3JlYXRlZCBpZiBub25lIGV4aXN0ZWQgYmVmb3JlLCBhbmQgdXBkYXRlZCBvdGhlcndpc2UuIAorRnVydGhlcm1vcmUsIHRoZXJlIGlzIG5vIG1lYW5zIG9mIGtub3dpbmcgd2hpY2ggYWN0aW9uIG9jY3VycmVkLgorCitUaGUgYElGIE5PVCBFWElTVFNgIGNvbmRpdGlvbiBjYW4gcmVzdHJpY3QgdGhlIGluc2VydGlvbiBpZiB0aGUgcm93IGRvZXMgbm90IGV4aXN0LiAKK0hvd2V2ZXIsIG5vdGUgdGhhdCB1c2luZyBgSUYgTk9UIEVYSVNUU2Agd2lsbCBpbmN1ciBhIG5vbi1uZWdsaWdpYmxlIHBlcmZvcm1hbmNlIGNvc3QsIGJlY2F1c2UgUGF4b3MgaXMgdXNlZCwKK3NvIHRoaXMgc2hvdWxkIGJlIHVzZWQgc3BhcmluZ2x5LgorCitQbGVhc2UgcmVmZXIgdG8gdGhlIHhyZWY6Y3FsL2RtbC5hZG9jI3VwZGF0ZS1wYXJhbWV0ZXJzW1VQREFURV0gc2VjdGlvbiBmb3IgaW5mb3JtYXRpb25zIG9uIHRoZSBgdXBkYXRlX3BhcmFtZXRlcmAuCitBbHNvIG5vdGUgdGhhdCBgSU5TRVJUYCBkb2VzIG5vdCBzdXBwb3J0IGNvdW50ZXJzLCB3aGlsZSBgVVBEQVRFYCBkb2VzLgorCitbW3VwZGF0ZS1zdGF0ZW1lbnRdXQorPT0gVVBEQVRFCisKK1VwZGF0aW5nIGEgcm93IGlzIGRvbmUgdXNpbmcgYW4gYFVQREFURWAgc3RhdGVtZW50OgorCitbc291cmNlLCBibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi91cGRhdGVfc3RhdGVtZW50LmJuZltdCistLS0tCisKK0ZvciBpbnN0YW5jZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC91cGRhdGVfc3RhdGVtZW50LmNxbFtdCistLS0tCisKK1RoZSBgVVBEQVRFYCBzdGF0ZW1lbnQgd3JpdGVzIG9uZSBvciBtb3JlIGNvbHVtbnMgZm9yIGEgZ2l2ZW4gcm93IGluIGEKK3RhYmxlLiAKK1RoZSBgV0hFUkVgIGNsYXVzZSBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgcm93IHRvIHVwZGF0ZSBhbmQgbXVzdCBpbmNsdWRlIGFsbCBjb2x1bW5zIG9mIHRoZSBgUFJJTUFSWSBLRVlgLiAKK05vbi1wcmltYXJ5IGtleSBjb2x1bW5zIGFyZSBzZXQgdXNpbmcgdGhlIGBTRVRgIGtleXdvcmQuCitJbiBhbiBgVVBEQVRFYCBzdGF0ZW1lbnQsIGFsbCB1cGRhdGVzIHdpdGhpbiB0aGUgc2FtZSBwYXJ0aXRpb24ga2V5IGFyZSBhcHBsaWVkIGF0b21pY2FsbHkgYW5kIGluIGlzb2xhdGlvbi4KKworVW5saWtlIGluIFNRTCwgYFVQREFURWAgZG9lcyBub3QgY2hlY2sgdGhlIHByaW9yIGV4aXN0ZW5jZSBvZiB0aGUgcm93IGJ5IGRlZmF1bHQuCitUaGUgcm93IGlzIGNyZWF0ZWQgaWYgbm9uZSBleGlzdGVkIGJlZm9yZSwgYW5kIHVwZGF0ZWQgb3RoZXJ3aXNlLgorRnVydGhlcm1vcmUsIHRoZXJlIGlzIG5vIG1lYW5zIG9mIGtub3dpbmcgd2hpY2ggYWN0aW9uIG9jY3VycmVkLgorCitUaGUgYElGYCBjb25kaXRpb24gY2FuIGJlIHVzZWQgdG8gY2hvb3NlIHdoZXRoZXIgdGhlIHJvdyBpcyB1cGRhdGVkIG9yIG5vdCBpZiBhIHBhcnRpY3VsYXIgY29uZGl0aW9uIGlzIG1ldC4KK0hvd2V2ZXIsIGxpa2UgdGhlIGBJRiBOT1QgRVhJU1RTYCBjb25kaXRpb24sIGEgbm9uLW5lZ2xpZ2libGUgcGVyZm9ybWFuY2UgY29zdCBjYW4gYmUgaW5jdXJyZWQuCisKK1JlZ2FyZGluZyB0aGUgYFNFVGAgYXNzaWdubWVudDoKKworKiBgYyA9IGMgKyAzYCB3aWxsIGluY3JlbWVudC9kZWNyZW1lbnQgY291bnRlcnMsIHRoZSBvbmx5IG9wZXJhdGlvbiBhbGxvd2VkLiAKK1RoZSBjb2x1bW4gbmFtZSBhZnRlciB0aGUgJz0nIHNpZ24gKm11c3QqIGJlIHRoZSBzYW1lIHRoYW4gdGhlIG9uZSBiZWZvcmUgdGhlICc9JyBzaWduLgorSW5jcmVtZW50L2RlY3JlbWVudCBpcyBvbmx5IGFsbG93ZWQgb24gY291bnRlcnMuIAorU2VlIHRoZSBzZWN0aW9uIG9uIHhyZWY6Y3FsL2RtbC5hZG9jI2NvdW50ZXJzW2NvdW50ZXJzXSBmb3IgZGV0YWlscy4KKyogYGlkID0gaWQgKyA8c29tZS1jb2xsZWN0aW9uPmAgYW5kIGBpZFt2YWx1ZTFdID0gdmFsdWUyYCBhcmUgZm9yIGNvbGxlY3Rpb25zLiAKK1NlZSB0aGUgeHJlZjpjcWwvdHlwZXMuYWRvYyNjb2xsZWN0aW9uc1tjb2xsZWN0aW9uc10gZm9yIGRldGFpbHMuICAKKyogYGlkLmZpZWxkID0gM2AgaXMgZm9yIHNldHRpbmcgdGhlIHZhbHVlIG9mIGEgZmllbGQgb24gYSBub24tZnJvemVuIHVzZXItZGVmaW5lZCB0eXBlcy4gCitTZWUgdGhlIHhyZWY6Y3FsL3R5cGVzLmFkb2MjdWR0c1tVRFRzXSBmb3IgZGV0YWlscy4KKworPT09IFVwZGF0ZSBwYXJhbWV0ZXJzCisKK2BVUERBVEVgIGFuZCBgSU5TRVJUYCBzdGF0ZW1lbnRzIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorCisqIGBUVExgOiBzcGVjaWZpZXMgYW4gb3B0aW9uYWwgVGltZSBUbyBMaXZlIChpbiBzZWNvbmRzKSBmb3IgdGhlCitpbnNlcnRlZCB2YWx1ZXMuIElmIHNldCwgdGhlIGluc2VydGVkIHZhbHVlcyBhcmUgYXV0b21hdGljYWxseSByZW1vdmVkCitmcm9tIHRoZSBkYXRhYmFzZSBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWUuIE5vdGUgdGhhdCB0aGUgVFRMIGNvbmNlcm5zCit0aGUgaW5zZXJ0ZWQgdmFsdWVzLCBub3QgdGhlIGNvbHVtbnMgdGhlbXNlbHZlcy4gVGhpcyBtZWFucyB0aGF0IGFueQorc3Vic2VxdWVudCB1cGRhdGUgb2YgdGhlIGNvbHVtbiB3aWxsIGFsc28gcmVzZXQgdGhlIFRUTCAodG8gd2hhdGV2ZXIgVFRMCitpcyBzcGVjaWZpZWQgaW4gdGhhdCB1cGRhdGUpLiBCeSBkZWZhdWx0LCB2YWx1ZXMgbmV2ZXIgZXhwaXJlLiBBIFRUTCBvZgorMCBpcyBlcXVpdmFsZW50IHRvIG5vIFRUTC4gSWYgdGhlIHRhYmxlIGhhcyBhIGRlZmF1bHRfdGltZV90b19saXZlLCBhCitUVEwgb2YgMCB3aWxsIHJlbW92ZSB0aGUgVFRMIGZvciB0aGUgaW5zZXJ0ZWQgb3IgdXBkYXRlZCB2YWx1ZXMuIEEgVFRMCitvZiBgbnVsbGAgaXMgZXF1aXZhbGVudCB0byBpbnNlcnRpbmcgd2l0aCBhIFRUTCBvZiAwLgorCitgVVBEQVRFYCwgYElOU0VSVGAsIGBERUxFVEVgIGFuZCBgQkFUQ0hgIHN0YXRlbWVudHMgc3VwcG9ydCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisKKyogYFRJTUVTVEFNUGA6IHNldHMgdGhlIHRpbWVzdGFtcCBmb3IgdGhlIG9wZXJhdGlvbi4gSWYgbm90IHNwZWNpZmllZCwKK3RoZSBjb29yZGluYXRvciB3aWxsIHVzZSB0aGUgY3VycmVudCB0aW1lIChpbiBtaWNyb3NlY29uZHMpIGF0IHRoZSBzdGFydAorb2Ygc3RhdGVtZW50IGV4ZWN1dGlvbiBhcyB0aGUgdGltZXN0YW1wLiBUaGlzIGlzIHVzdWFsbHkgYSBzdWl0YWJsZQorZGVmYXVsdC4KKworW1tkZWxldGVfc3RhdGVtZW50XV0KKz09IERFTEVURQorCitEZWxldGluZyByb3dzIG9yIHBhcnRzIG9mIHJvd3MgdXNlcyB0aGUgYERFTEVURWAgc3RhdGVtZW50OgorCitbc291cmNlLGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL2RlbGV0ZV9zdGF0ZW1lbnQuYm5mW10KKy0tLS0KKworRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvZGVsZXRlX3N0YXRlbWVudC5jcWxbXQorLS0tLQorCitUaGUgYERFTEVURWAgc3RhdGVtZW50IGRlbGV0ZXMgY29sdW1ucyBhbmQgcm93cy4gSWYgY29sdW1uIG5hbWVzIGFyZQorcHJvdmlkZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIGBERUxFVEVgIGtleXdvcmQsIG9ubHkgdGhvc2UgY29sdW1ucyBhcmUKK2RlbGV0ZWQgZnJvbSB0aGUgcm93IGluZGljYXRlZCBieSB0aGUgYFdIRVJFYCBjbGF1c2UuIE90aGVyd2lzZSwgd2hvbGUKK3Jvd3MgYXJlIHJlbW92ZWQuCisKK1RoZSBgV0hFUkVgIGNsYXVzZSBzcGVjaWZpZXMgd2hpY2ggcm93cyBhcmUgdG8gYmUgZGVsZXRlZC4gTXVsdGlwbGUgcm93cworbWF5IGJlIGRlbGV0ZWQgd2l0aCBvbmUgc3RhdGVtZW50IGJ5IHVzaW5nIGFuIGBJTmAgb3BlcmF0b3IuIEEgcmFuZ2Ugb2YKK3Jvd3MgbWF5IGJlIGRlbGV0ZWQgdXNpbmcgYW4gaW5lcXVhbGl0eSBvcGVyYXRvciAoc3VjaCBhcyBgPj1gKS4KKworYERFTEVURWAgc3VwcG9ydHMgdGhlIGBUSU1FU1RBTVBgIG9wdGlvbiB3aXRoIHRoZSBzYW1lIHNlbWFudGljcyBhcyBpbgoreHJlZjpjcWwvZG1sLmFkb2MjdXBkYXRlLXBhcmFtZXRlcnNbdXBkYXRlc10uCisKK0luIGEgYERFTEVURWAgc3RhdGVtZW50LCBhbGwgZGVsZXRpb25zIHdpdGhpbiB0aGUgc2FtZSBwYXJ0aXRpb24ga2V5IGFyZQorYXBwbGllZCBhdG9taWNhbGx5IGFuZCBpbiBpc29sYXRpb24uCisKK0EgYERFTEVURWAgb3BlcmF0aW9uIGNhbiBiZSBjb25kaXRpb25hbCB0aHJvdWdoIHRoZSB1c2Ugb2YgYW4gYElGYAorY2xhdXNlLCBzaW1pbGFyIHRvIGBVUERBVEVgIGFuZCBgSU5TRVJUYCBzdGF0ZW1lbnRzLiBIb3dldmVyLCBhcyB3aXRoCitgSU5TRVJUYCBhbmQgYFVQREFURWAgc3RhdGVtZW50cywgdGhpcyB3aWxsIGluY3VyIGEgbm9uLW5lZ2xpZ2libGUKK3BlcmZvcm1hbmNlIGNvc3QgYmVjYXVzZSBQYXhvcyBpcyB1c2VkLCBhbmQgc2hvdWxkIGJlIHVzZWQgc3BhcmluZ2x5LgorCitbW2JhdGNoX3N0YXRlbWVudF1dCis9PSBCQVRDSAorCitNdWx0aXBsZSBgSU5TRVJUYCwgYFVQREFURWAgYW5kIGBERUxFVEVgIGNhbiBiZSBleGVjdXRlZCBpbiBhIHNpbmdsZQorc3RhdGVtZW50IGJ5IGdyb3VwaW5nIHRoZW0gdGhyb3VnaCBhIGBCQVRDSGAgc3RhdGVtZW50OgorCitbc291cmNlLCBibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9iYXRjaF9zdGF0ZW1lbnQuYm5mW10KKy0tLS0KKworRm9yIGluc3RhbmNlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2JhdGNoX3N0YXRlbWVudC5jcWxbXQorLS0tLQorCitUaGUgYEJBVENIYCBzdGF0ZW1lbnQgZ3JvdXAgbXVsdGlwbGUgbW9kaWZpY2F0aW9uIHN0YXRlbWVudHMKKyhpbnNlcnRpb25zL3VwZGF0ZXMgYW5kIGRlbGV0aW9ucykgaW50byBhIHNpbmdsZSBzdGF0ZW1lbnQuIEl0IHNlcnZlcworc2V2ZXJhbCBwdXJwb3NlczoKKworKiBJdCBzYXZlcyBuZXR3b3JrIHJvdW5kLXRyaXBzIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlciAoYW5kCitzb21ldGltZXMgYmV0d2VlbiB0aGUgc2VydmVyIGNvb3JkaW5hdG9yIGFuZCB0aGUgcmVwbGljYXMpIHdoZW4gYmF0Y2hpbmcKK211bHRpcGxlIHVwZGF0ZXMuCisqIEFsbCB1cGRhdGVzIGluIGEgYEJBVENIYCBiZWxvbmdpbmcgdG8gYSBnaXZlbiBwYXJ0aXRpb24ga2V5IGFyZQorcGVyZm9ybWVkIGluIGlzb2xhdGlvbi4KKyogQnkgZGVmYXVsdCwgYWxsIG9wZXJhdGlvbnMgaW4gdGhlIGJhdGNoIGFyZSBwZXJmb3JtZWQgYXMgX2xvZ2dlZF8sIHRvCitlbnN1cmUgYWxsIG11dGF0aW9ucyBldmVudHVhbGx5IGNvbXBsZXRlIChvciBub25lIHdpbGwpLiBTZWUgdGhlIG5vdGVzCitvbiB4cmVmOmNxbC9kbWwuYWRvYyN1bmxvZ2dlZC1iYXRjaGVzW1VOTE9HR0VEIGJhdGNoZXNdIGZvciBtb3JlIGRldGFpbHMuCisKK05vdGUgdGhhdDoKKworKiBgQkFUQ0hgIHN0YXRlbWVudHMgbWF5IG9ubHkgY29udGFpbiBgVVBEQVRFYCwgYElOU0VSVGAgYW5kIGBERUxFVEVgCitzdGF0ZW1lbnRzIChub3Qgb3RoZXIgYmF0Y2hlcyBmb3IgaW5zdGFuY2UpLgorKiBCYXRjaGVzIGFyZSBfbm90XyBhIGZ1bGwgYW5hbG9ndWUgZm9yIFNRTCB0cmFuc2FjdGlvbnMuCisqIElmIGEgdGltZXN0YW1wIGlzIG5vdCBzcGVjaWZpZWQgZm9yIGVhY2ggb3BlcmF0aW9uLCB0aGVuIGFsbAorb3BlcmF0aW9ucyB3aWxsIGJlIGFwcGxpZWQgd2l0aCB0aGUgc2FtZSB0aW1lc3RhbXAgKGVpdGhlciBvbmUgZ2VuZXJhdGVkCithdXRvbWF0aWNhbGx5LCBvciB0aGUgdGltZXN0YW1wIHByb3ZpZGVkIGF0IHRoZSBiYXRjaCBsZXZlbCkuIER1ZSB0bworQ2Fzc2FuZHJhJ3MgY29uZmxpY3QgcmVzb2x1dGlvbiBwcm9jZWR1cmUgaW4gdGhlIGNhc2Ugb2YKK2h0dHA6Ly93aWtpLmFwYWNoZS5vcmcvY2Fzc2FuZHJhL0ZBUSNjbG9ja3RpZVt0aW1lc3RhbXAgdGllc10sCitvcGVyYXRpb25zIG1heSBiZSBhcHBsaWVkIGluIGFuIG9yZGVyIHRoYXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9yZGVyCit0aGV5IGFyZSBsaXN0ZWQgaW4gdGhlIGBCQVRDSGAgc3RhdGVtZW50LiBUbyBmb3JjZSBhIHBhcnRpY3VsYXIKK29wZXJhdGlvbiBvcmRlcmluZywgeW91IG11c3Qgc3BlY2lmeSBwZXItb3BlcmF0aW9uIHRpbWVzdGFtcHMuCisqIEEgTE9HR0VEIGJhdGNoIHRvIGEgc2luZ2xlIHBhcnRpdGlvbiB3aWxsIGJlIGNvbnZlcnRlZCB0byBhbiBVTkxPR0dFRAorYmF0Y2ggYXMgYW4gb3B0aW1pemF0aW9uLgorCitbW3VubG9nZ2VkLWJhdGNoZXNdXQorPT09IGBVTkxPR0dFRGAgYmF0Y2hlcworCitCeSBkZWZhdWx0LCBDYXNzYW5kcmEgdXNlcyBhIGJhdGNoIGxvZyB0byBlbnN1cmUgYWxsIG9wZXJhdGlvbnMgaW4gYQorYmF0Y2ggZXZlbnR1YWxseSBjb21wbGV0ZSBvciBub25lIHdpbGwgKG5vdGUgaG93ZXZlciB0aGF0IG9wZXJhdGlvbnMgYXJlCitvbmx5IGlzb2xhdGVkIHdpdGhpbiBhIHNpbmdsZSBwYXJ0aXRpb24pLgorCitUaGVyZSBpcyBhIHBlcmZvcm1hbmNlIHBlbmFsdHkgZm9yIGJhdGNoIGF0b21pY2l0eSB3aGVuIGEgYmF0Y2ggc3BhbnMKK211bHRpcGxlIHBhcnRpdGlvbnMuIElmIHlvdSBkbyBub3Qgd2FudCB0byBpbmN1ciB0aGlzIHBlbmFsdHksIHlvdSBjYW4KK3RlbGwgQ2Fzc2FuZHJhIHRvIHNraXAgdGhlIGJhdGNobG9nIHdpdGggdGhlIGBVTkxPR0dFRGAgb3B0aW9uLiBJZiB0aGUKK2BVTkxPR0dFRGAgb3B0aW9uIGlzIHVzZWQsIGEgZmFpbGVkIGJhdGNoIG1pZ2h0IGxlYXZlIHRoZSBwYXRjaCBvbmx5CitwYXJ0bHkgYXBwbGllZC4KKworPT09IGBDT1VOVEVSYCBiYXRjaGVzCisKK1VzZSB0aGUgYENPVU5URVJgIG9wdGlvbiBmb3IgYmF0Y2hlZCBjb3VudGVyIHVwZGF0ZXMuIFVubGlrZSBvdGhlcgordXBkYXRlcyBpbiBDYXNzYW5kcmEsIGNvdW50ZXIgdXBkYXRlcyBhcmUgbm90IGlkZW1wb3RlbnQuCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvZnVuY3Rpb25zLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvZnVuY3Rpb25zLmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ3NGI3MgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9mdW5jdGlvbnMuYWRvYwpAQCAtMCwwICsxLDU3OSBAQAorLy8gTmVlZCBzb21lIGludHJvIGZvciBVREYgYW5kIG5hdGl2ZSBmdW5jdGlvbnMgaW4gZ2VuZXJhbCBhbmQgcG9pbnQgdGhvc2UgdG8gaXQuICAKKy8vIFtbY3FsLWZ1bmN0aW9uc11dW1tuYXRpdmUtZnVuY3Rpb25zXV0gCisKKz09IEZ1bmN0aW9ucworCitDUUwgc3VwcG9ydHMgMiBtYWluIGNhdGVnb3JpZXMgb2YgZnVuY3Rpb25zOgorCisqIHhyZWY6Y3FsL2Z1bmN0aW9ucy5hZG9jI3NjYWxhci1mdW5jdGlvbnNbc2NhbGFyIGZ1bmN0aW9uc10gdGhhdCB0YWtlIGEgbnVtYmVyIG9mIHZhbHVlcyBhbmQgcHJvZHVjZSBhbiBvdXRwdXQKKyogeHJlZjpjcWwvZnVuY3Rpb25zLmFkb2MjYWdncmVnYXRlLWZ1bmN0aW9uc1thZ2dyZWdhdGUgZnVuY3Rpb25zXSB0aGF0IGFnZ3JlZ2F0ZSBtdWx0aXBsZSByb3dzIHJlc3VsdGluZyBmcm9tIGEgYFNFTEVDVGAgc3RhdGVtZW50CisKK0luIGJvdGggY2FzZXMsIENRTCBwcm92aWRlcyBhIG51bWJlciBvZiBuYXRpdmUgImhhcmQtY29kZWQiIGZ1bmN0aW9ucyBhcword2VsbCBhcyB0aGUgYWJpbGl0eSB0byBjcmVhdGUgbmV3IHVzZXItZGVmaW5lZCBmdW5jdGlvbnMuCisKK1tOT1RFXQorLk5vdGUKKz09PT0KK0J5IGRlZmF1bHQsIHRoZSB1c2Ugb2YgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGZvcgorc2VjdXJpdHkgY29uY2VybnMgKGV2ZW4gd2hlbiBlbmFibGVkLCB0aGUgZXhlY3V0aW9uIG9mIHVzZXItZGVmaW5lZAorZnVuY3Rpb25zIGlzIHNhbmRib3hlZCBhbmQgYSAicm9ndWUiIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgYWxsb3dlZCB0bworZG8gZXZpbCwgYnV0IG5vIHNhbmRib3ggaXMgcGVyZmVjdCBzbyB1c2luZyB1c2VyLWRlZmluZWQgZnVuY3Rpb25zIGlzCitvcHQtaW4pLiBTZWUgdGhlIGB1c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWRgIGluIGBjYXNzYW5kcmEueWFtbGAgdG8KK2VuYWJsZSB0aGVtLgorPT09PQorCitBIGZ1bmN0aW9uIGlzIGlkZW50aWZpZXIgYnkgaXRzIG5hbWU6CisKK1tzb3VyY2UsIGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL2Z1bmN0aW9uLmJuZltdCistLS0tCisKKz09PSBTY2FsYXIgZnVuY3Rpb25zCisKK1tbc2NhbGFyLW5hdGl2ZS1mdW5jdGlvbnNdXQorPT09PSBOYXRpdmUgZnVuY3Rpb25zCisKKz09PT09IENhc3QKKworVGhlIGBjYXN0YCBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjb252ZXJ0cyBvbmUgbmF0aXZlIGRhdGF0eXBlIHRvCithbm90aGVyLgorCitUaGUgZm9sbG93aW5nIHRhYmxlIGRlc2NyaWJlcyB0aGUgY29udmVyc2lvbnMgc3VwcG9ydGVkIGJ5IHRoZSBgY2FzdGAKK2Z1bmN0aW9uLiBDYXNzYW5kcmEgd2lsbCBzaWxlbnRseSBpZ25vcmUgYW55IGNhc3QgY29udmVydGluZyBhIGRhdGF0eXBlCitpbnRvIGl0cyBvd24gZGF0YXR5cGUuCisKK1tjb2xzPSIsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xGcm9tIHxUbworCit8IGBhc2NpaWAgfCBgdGV4dGAsIGB2YXJjaGFyYAorCit8IGBiaWdpbnRgIHwgYHRpbnlpbnRgLCBgc21hbGxpbnRgLCBgaW50YCwgYGZsb2F0YCwgYGRvdWJsZWAsIGBkZWNpbWFsYCwgYHZhcmludGAsCitgdGV4dGAsIGB2YXJjaGFyYAorCit8IGBib29sZWFuYCB8IGB0ZXh0YCwgYHZhcmNoYXJgCisKK3wgYGNvdW50ZXJgIHwgYHRpbnlpbnRgLCBgc21hbGxpbnRgLCBgaW50YCwgYGJpZ2ludGAsIGBmbG9hdGAsIGBkb3VibGVgLCBgZGVjaW1hbGAsCitgdmFyaW50YCwgYHRleHRgLCBgdmFyY2hhcmAKKworfCBgZGF0ZWAgfCBgdGltZXN0YW1wYAorCit8IGBkZWNpbWFsYCB8IGB0aW55aW50YCwgYHNtYWxsaW50YCwgYGludGAsIGBiaWdpbnRgLCBgZmxvYXRgLCBgZG91YmxlYCwgYHZhcmludGAsCitgdGV4dGAsIGB2YXJjaGFyYAorCit8IGBkb3VibGVgIHwgYHRpbnlpbnRgLCBgc21hbGxpbnRgLCBgaW50YCwgYGJpZ2ludGAsIGBmbG9hdGAsIGBkZWNpbWFsYCwgYHZhcmludGAsCitgdGV4dGAsIGB2YXJjaGFyYAorCit8IGBmbG9hdGAgfCBgdGlueWludGAsIGBzbWFsbGludGAsIGBpbnRgLCBgYmlnaW50YCwgYGRvdWJsZWAsIGBkZWNpbWFsYCwgYHZhcmludGAsCitgdGV4dGAsIGB2YXJjaGFyYAorCit8IGBpbmV0YCB8IGB0ZXh0YCwgYHZhcmNoYXJgCisKK3wgYGludGAgfCBgdGlueWludGAsIGBzbWFsbGludGAsIGBiaWdpbnRgLCBgZmxvYXRgLCBgZG91YmxlYCwgYGRlY2ltYWxgLCBgdmFyaW50YCwKK2B0ZXh0YCwgYHZhcmNoYXJgCisKK3wgYHNtYWxsaW50YCB8IGB0aW55aW50YCwgYGludGAsIGBiaWdpbnRgLCBgZmxvYXRgLCBgZG91YmxlYCwgYGRlY2ltYWxgLCBgdmFyaW50YCwKK2B0ZXh0YCwgYHZhcmNoYXJgCisKK3wgYHRpbWVgIHwgYHRleHRgLCBgdmFyY2hhcmAKKworfCBgdGltZXN0YW1wYCB8IGBkYXRlYCwgYHRleHRgLCBgdmFyY2hhcmAKKworfCBgdGltZXV1aWRgIHwgYHRpbWVzdGFtcGAsIGBkYXRlYCwgYHRleHRgLCBgdmFyY2hhcmAKKworfCBgdGlueWludGAgfCBgdGlueWludGAsIGBzbWFsbGludGAsIGBpbnRgLCBgYmlnaW50YCwgYGZsb2F0YCwgYGRvdWJsZWAsIGBkZWNpbWFsYCwKK2B2YXJpbnRgLCBgdGV4dGAsIGB2YXJjaGFyYAorCit8IGB1dWlkYCB8IGB0ZXh0YCwgYHZhcmNoYXJgCisKK3wgYHZhcmludGAgfCBgdGlueWludGAsIGBzbWFsbGludGAsIGBpbnRgLCBgYmlnaW50YCwgYGZsb2F0YCwgYGRvdWJsZWAsIGBkZWNpbWFsYCwKK2B0ZXh0YCwgYHZhcmNoYXJgCit8PT09CisKK1RoZSBjb252ZXJzaW9ucyByZWx5IHN0cmljdGx5IG9uIEphdmEncyBzZW1hbnRpY3MuIEZvciBleGFtcGxlLCB0aGUKK2RvdWJsZSB2YWx1ZSAxIHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSB0ZXh0IHZhbHVlICcxLjAnLiBGb3IgaW5zdGFuY2U6CisKK1tzb3VyY2UsY3FsXQorLS0tLQorU0VMRUNUIGF2ZyhjYXN0KGNvdW50IGFzIGRvdWJsZSkpIEZST00gbXlUYWJsZQorLS0tLQorCis9PT09PSBUb2tlbgorCitUaGUgYHRva2VuYCBmdW5jdGlvbiBjb21wdXRlcyB0aGUgdG9rZW4gZm9yIGEgZ2l2ZW4gcGFydGl0aW9uIGtleS4gCitUaGUgZXhhY3Qgc2lnbmF0dXJlIG9mIHRoZSB0b2tlbiBmdW5jdGlvbiBkZXBlbmRzIG9uIHRoZSB0YWJsZSBjb25jZXJuZWQgYW5kIHRoZSBwYXJ0aXRpb25lciB1c2VkIGJ5IHRoZSBjbHVzdGVyLgorCitUaGUgdHlwZSBvZiB0aGUgYXJndW1lbnRzIG9mIHRoZSBgdG9rZW5gIGRlcGVuZCBvbiB0aGUgcGFydGl0aW9uIGtleSBjb2x1bW4gdHlwZS4gVGhlIHJldHVybmVkIHR5cGUgZGVwZW5kcyBvbiB0aGUgZGVmaW5lZCBwYXJ0aXRpb25lcjoKKworW2NvbHM9IiwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfFBhcnRpdGlvbmVyIHwgUmV0dXJuZWQgdHlwZQorfCBNdXJtdXIzUGFydGl0aW9uZXIgfCBgYmlnaW50YAorfCBSYW5kb21QYXJ0aXRpb25lciB8IGB2YXJpbnRgCit8IEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIgfCBgYmxvYmAKK3w9PT0KKworRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX3RhYmxlX3NpbXBsZS5jcWxbXQorLS0tLQorCitUaGUgdGFibGUgdXNlcyB0aGUgZGVmYXVsdCBNdXJtdXIzUGFydGl0aW9uZXIuCitUaGUgYHRva2VuYCBmdW5jdGlvbiB1c2VzIHRoZSBzaW5nbGUgYXJndW1lbnQgYHRleHRgLCBiZWNhdXNlIHRoZSBwYXJ0aXRpb24ga2V5IGlzIGB1c2VyaWRgIG9mIHRleHQgdHlwZS4KK1RoZSByZXR1cm5lZCB0eXBlIHdpbGwgYmUgYGJpZ2ludGAuCisKKz09PT09IFV1aWQKKworVGhlIGB1dWlkYCBmdW5jdGlvbiB0YWtlcyBubyBwYXJhbWV0ZXJzIGFuZCBnZW5lcmF0ZXMgYSByYW5kb20gdHlwZSA0Cit1dWlkIHN1aXRhYmxlIGZvciB1c2UgaW4gYElOU0VSVGAgb3IgYFVQREFURWAgc3RhdGVtZW50cy4KKworPT09PT0gVGltZXV1aWQgZnVuY3Rpb25zCisKKz09PT09PSBgbm93YAorCitUaGUgYG5vd2AgZnVuY3Rpb24gdGFrZXMgbm8gYXJndW1lbnRzIGFuZCBnZW5lcmF0ZXMsIG9uIHRoZSBjb29yZGluYXRvcgorbm9kZSwgYSBuZXcgdW5pcXVlIHRpbWV1dWlkIGF0IHRoZSB0aW1lIHRoZSBmdW5jdGlvbiBpcyBpbnZva2VkLiBOb3RlCit0aGF0IHRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgaW5zZXJ0aW9uIGJ1dCBpcyBsYXJnZWx5IG5vbi1zZW5zaWNhbCBpbgorYFdIRVJFYCBjbGF1c2VzLiAKKworRm9yIGV4YW1wbGUsIGEgcXVlcnkgb2YgdGhlIGZvcm06CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvdGltZXV1aWRfbm93LmNxbFtdCistLS0tCisKK3dpbGwgbm90IHJldHVybiBhIHJlc3VsdCwgYnkgZGVzaWduLCBzaW5jZSB0aGUgdmFsdWUgcmV0dXJuZWQgYnkKK2Bub3coKWAgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUuCisKK2BjdXJyZW50X3RpbWV1dWlkYCBpcyBhbiBhbGlhcyBvZiBgbm93YC4KKworPT09PT09IGBtaW5fdGltZXV1aWRgIGFuZCBgbWF4X3RpbWV1dWlkYAorCitUaGUgYG1pbl90aW1ldXVpZGAgZnVuY3Rpb24gdGFrZXMgYSBgdGltZXN0YW1wYCB2YWx1ZSBgdGAsIGVpdGhlciBhIHRpbWVzdGFtcCBvciBhIGRhdGUgc3RyaW5nLgorSXQgcmV0dXJucyBhIF9mYWtlXyBgdGltZXV1aWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIF9zbWFsbGVzdF8gcG9zc2libGUgYHRpbWV1dWlkYCBmb3IgdGltZXN0YW1wIGB0YC4KK1RoZSBgbWF4X3RpbWV1dWlkYCB3b3JrcyBzaW1pbGFybHksIGJ1dCByZXR1cm5zIHRoZSBfbGFyZ2VzdF8gcG9zc2libGUgYHRpbWV1dWlkYC4KKworRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvdGltZXV1aWRfbWluX21heC5jcWxbXQorLS0tLQorCit3aWxsIHNlbGVjdCBhbGwgcm93cyB3aGVyZSB0aGUgYHRpbWV1dWlkYCBjb2x1bW4gYHRgIGlzIGxhdGVyIHRoYW4gYCcyMDEzLTAxLTAxIDAwOjA1KzAwMDAnYCBhbmQgZWFybGllciB0aGFuIGAnMjAxMy0wMi0wMiAxMDowMCswMDAwJ2AuIAorVGhlIGNsYXVzZSBgdCA+PSBtYXhUaW1ldXVpZCgnMjAxMy0wMS0wMSAwMDowNSswMDAwJylgIHdvdWxkIHN0aWxsIF9ub3RfIHNlbGVjdCBhIGB0aW1ldXVpZGAgZ2VuZXJhdGVkIGV4YWN0bHkgYXQgJzIwMTMtMDEtMDEgMDA6MDUrMDAwMCcsIGFuZCBpcyBlc3NlbnRpYWxseSBlcXVpdmFsZW50IHRvIGB0ID4gbWF4VGltZXV1aWQoJzIwMTMtMDEtMDEgMDA6MDUrMDAwMCcpYC4KKworW05PVEVdCisuTm90ZQorPT09PQorVGhlIHZhbHVlcyBnZW5lcmF0ZWQgYnkgYG1pbl90aW1ldXVpZGAgYW5kIGBtYXhfdGltZXV1aWRgIGFyZSBjYWxsZWQgX2Zha2VfIFVVSUQgYmVjYXVzZSB0aGV5IGRvIG5vIHJlc3BlY3QgdGhlIHRpbWUtYmFzZWQgVVVJRCBnZW5lcmF0aW9uIHByb2Nlc3MKK3NwZWNpZmllZCBieSB0aGUgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDEyMi50eHRbSUVURiBSRkMgNDEyMl0uCitJbiBwYXJ0aWN1bGFyLCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlc2UgdHdvIG1ldGhvZHMgd2lsbCBub3QgYmUgdW5pcXVlLgorVGh1cywgb25seSB1c2UgdGhlc2UgbWV0aG9kcyBmb3IgKnF1ZXJ5aW5nKiwgbm90IGZvciAqaW5zZXJ0aW9uKiwgdG8gcHJldmVudCBwb3NzaWJsZSBkYXRhIG92ZXJ3cml0aW5nLiAKKz09PT0KKworPT09PT0gRGF0ZXRpbWUgZnVuY3Rpb25zCisKKz09PT09PSBSZXRyaWV2aW5nIHRoZSBjdXJyZW50IGRhdGUvdGltZQorCitUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgZGF0ZS90aW1lIGF0IHRoZQordGltZSB3aGVyZSB0aGUgZnVuY3Rpb24gaXMgaW52b2tlZDoKKworW2NvbHM9IiwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfEZ1bmN0aW9uIG5hbWUgfE91dHB1dCB0eXBlCisKK3wgYGN1cnJlbnRfdGltZXN0YW1wYCB8IGB0aW1lc3RhbXBgCisKK3wgYGN1cnJlbnRfZGF0ZWAgfCBgZGF0ZWAKKworfCBgY3VycmVudF90aW1lYCB8IGB0aW1lYAorCit8IGBjdXJyZW50X3RpbWV1dWlkYCB8IGB0aW1lVVVJRGAKK3w9PT0KKworRm9yIGV4YW1wbGUgdGhlIGxhc3QgdHdvIGRheXMgb2YgZGF0YSBjYW4gYmUgcmV0cmlldmVkIHVzaW5nOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2N1cnJlbnRfZGF0ZS5jcWxbXQorLS0tLQorCis9PT09PT0gVGltZSBjb252ZXJzaW9uIGZ1bmN0aW9ucworCitBIG51bWJlciBvZiBmdW5jdGlvbnMgYXJlIHByb3ZpZGVkIHRvIGNvbnZlcnQgYSBgdGltZXV1aWRgLCBhIGB0aW1lc3RhbXBgIG9yIGEgYGRhdGVgIGludG8gYW5vdGhlciBgbmF0aXZlYCB0eXBlLgorCitbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfEZ1bmN0aW9uIG5hbWUgfElucHV0IHR5cGUgfERlc2NyaXB0aW9uCisKK3wgYHRvX2RhdGVgIHwgYHRpbWV1dWlkYCB8IENvbnZlcnRzIHRoZSBgdGltZXV1aWRgIGFyZ3VtZW50IGludG8gYSBgZGF0ZWAgdHlwZQorCit8IGB0b19kYXRlYCB8IGB0aW1lc3RhbXBgIHwgQ29udmVydHMgdGhlIGB0aW1lc3RhbXBgIGFyZ3VtZW50IGludG8gYSBgZGF0ZWAgdHlwZQorCit8IGB0b190aW1lc3RhbXBgIHwgYHRpbWV1dWlkYCB8IENvbnZlcnRzIHRoZSBgdGltZXV1aWRgIGFyZ3VtZW50IGludG8gYSBgdGltZXN0YW1wYCB0eXBlCisKK3wgYHRvX3RpbWVzdGFtcGAgfCBgZGF0ZWAgfCBDb252ZXJ0cyB0aGUgYGRhdGVgIGFyZ3VtZW50IGludG8gYSBgdGltZXN0YW1wYCB0eXBlCisKK3wgYHRvX3VuaXhfdGltZXN0YW1wYCB8IGB0aW1ldXVpZGAgfCBDb252ZXJ0cyB0aGUgYHRpbWV1dWlkYCBhcmd1bWVudCBpbnRvIGEgYGJpZ0ludGAgcmF3IHZhbHVlCisKK3wgYHRvX3VuaXhfdGltZXN0YW1wYCB8IGB0aW1lc3RhbXBgIHwgQ29udmVydHMgdGhlIGB0aW1lc3RhbXBgIGFyZ3VtZW50IGludG8gYSBgYmlnSW50YCByYXcgdmFsdWUKKworfCBgdG9fdW5peF90aW1lc3RhbXBgIHwgYGRhdGVgIHwgQ29udmVydHMgdGhlIGBkYXRlYCBhcmd1bWVudCBpbnRvIGEgYGJpZ0ludGAgcmF3IHZhbHVlCit8PT09CisKKz09PT09IEJsb2IgY29udmVyc2lvbiBmdW5jdGlvbnMKKworQSBudW1iZXIgb2YgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCB0byBjb252ZXJ0IHRoZSBuYXRpdmUgdHlwZXMgaW50bworYmluYXJ5IGRhdGEsIG9yIGEgYGJsb2JgLiAKK0ZvciBldmVyeSB4cmVmOmNxbC90eXBlcy5hZG9jI25hdGl2ZS10eXBlc1t0eXBlXSBzdXBwb3J0ZWQgYnkgQ1FMLCB0aGUgZnVuY3Rpb24gYHR5cGVfYXNfYmxvYmAgdGFrZXMgYSBhcmd1bWVudCBvZiB0eXBlIGB0eXBlYCBhbmQgcmV0dXJucyBpdCBhcyBhIGBibG9iYC4KK0NvbnZlcnNlbHksIHRoZSBmdW5jdGlvbiBgYmxvYl9hc190eXBlYCB0YWtlcyBhIDY0LWJpdCBgYmxvYmAgYXJndW1lbnQgYW5kIGNvbnZlcnRzIGl0IHRvIGEgYGJpZ2ludGAgdmFsdWUuCitGb3IgZXhhbXBsZSwgYGJpZ2ludF9hc19ibG9iKDMpYCByZXR1cm5zIGAweDAwMDAwMDAwMDAwMDAwMDNgIGFuZCBgYmxvYl9hc19iaWdpbnQoMHgwMDAwMDAwMDAwMDAwMDAzKWAgcmV0dXJucyBgM2AuCisKKz09PT09IE1hdGggRnVuY3Rpb25zCisKK0NxbCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIG1hdGggZnVuY3Rpb25zOiBgYWJzYCwgYGV4cGAsIGBsb2dgLCBgbG9nMTBgLCBhbmQgYHJvdW5kYC4KK1RoZSByZXR1cm4gdHlwZSBmb3IgdGhlc2UgZnVuY3Rpb25zIGlzIGFsd2F5cyB0aGUgc2FtZSBhcyB0aGUgaW5wdXQgdHlwZS4KKworW2NvbHM9IiwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfEZ1bmN0aW9uIG5hbWUgfERlc2NyaXB0aW9uCisKK3xgYWJzYCB8IFJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBpbnB1dC4KKworfGBleHBgIHwgUmV0dXJucyB0aGUgbnVtYmVyIGUgdG8gdGhlIHBvd2VyIG9mIHRoZSBpbnB1dC4KKworfGBsb2dgIHwgUmV0dXJucyB0aGUgbmF0dXJhbCBsb2cgb2YgdGhlIGlucHV0LgorCit8YGxvZzEwYCB8IFJldHVybnMgdGhlIGxvZyBiYXNlIDEwIG9mIHRoZSBpbnB1dC4KKworfGByb3VuZGAgfCBSb3VuZHMgdGhlIGlucHV0IHRvIHRoZSBuZWFyZXN0IHdob2xlIG51bWJlciB1c2luZyByb3VuZGluZyBtb2RlIGBIQUxGX1VQYC4KK3w9PT0KKworPT09PT0gQ29sbGVjdGlvbiBmdW5jdGlvbnMKKworQSBudW1iZXIgb2YgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCB0byBvcGVyYXRlIG9uIGNvbGxlY3Rpb24gY29sdW1ucy4KKworW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xGdW5jdGlvbiBuYW1lIHxJbnB1dCB0eXBlIHxEZXNjcmlwdGlvbgorCit8IGBtYXBfa2V5c2AgfCBgbWFwYCB8IEdldHMgdGhlIGtleXMgb2YgdGhlIGBtYXBgIGFyZ3VtZW50LCByZXR1cm5lZCBhcyBhIGBzZXRgLgorCit8IGBtYXBfdmFsdWVzYCB8IGBtYXBgIHwgR2V0cyB0aGUgdmFsdWVzIG9mIHRoZSBgbWFwYCBhcmd1bWVudCwgcmV0dXJuZWQgYXMgYSBgbGlzdGAuCisKK3wgYGNvbGxlY3Rpb25fY291bnRgIHwgYG1hcGAsIGBzZXRgIG9yIGBsaXN0YCB8IEdldHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29sbGVjdGlvbiBhcmd1bWVudC4KKworfCBgY29sbGVjdGlvbl9taW5gIHwgYHNldGAgb3IgYGxpc3RgIHwgR2V0cyB0aGUgbWluaW11bSBlbGVtZW50IGluIHRoZSBjb2xsZWN0aW9uIGFyZ3VtZW50LgorCit8IGBjb2xsZWN0aW9uX21heGAgfCBgc2V0YCBvciBgbGlzdGAgfCBHZXRzIHRoZSBtYXhpbXVtIGVsZW1lbnQgaW4gdGhlIGNvbGxlY3Rpb24gYXJndW1lbnQuCisKK3wgYGNvbGxlY3Rpb25fc3VtYCB8IG51bWVyaWMgYHNldGAgb3IgYGxpc3RgIHwgQ29tcHV0ZXMgdGhlIHN1bSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24gYXJndW1lbnQuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBpbnB1dCBjb2xsZWN0aW9uIGVsZW1lbnRzLCBzbyB0aGVyZSBpcyBhIHJpc2sgb2Ygb3ZlcmZsb3dpbmcgdGhlIGRhdGEgdHlwZSBpZiB0aGUgc3VtIG9mIHRoZSB2YWx1ZXMgZXhjZWVkcyB0aGUgbWF4aW11bSB2YWx1ZSB0aGF0IHRoZSB0eXBlIGNhbiByZXByZXNlbnQuCisKK3wgYGNvbGxlY3Rpb25fYXZnYCB8IG51bWVyaWMgYHNldGAgb3IgYGxpc3RgIHwgQ29tcHV0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uIGFyZ3VtZW50LiBUaGUgYXZlcmFnZSBvZiBhbiBlbXB0eSBjb2xsZWN0aW9uIHJldHVybnMgemVyby4gVGhlIHJldHVybmVkIHZhbHVlIGlzIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGlucHV0IGNvbGxlY3Rpb24gZWxlbWVudHMsIHdoaWNoIG1pZ2h0IGluY2x1ZGUgcm91bmRpbmcgYW5kIHRydW5jYXRpb25zLiBGb3IgZXhhbXBsZSBgY29sbGVjdGlvbl9hdmcoWzEsIDJdKWAgcmV0dXJucyBgMWAgaW5zdGVhZCBvZiBgMS41YC4KK3w9PT0KKworW1tkYXRhLW1hc2tpbmctZnVuY3Rpb25zXV0KKz09PT09IERhdGEgbWFza2luZyBmdW5jdGlvbnMKKworQSBudW1iZXIgb2YgZnVuY3Rpb25zIGFsbG93IHRvIG9ic2N1cmUgdGhlIHJlYWwgY29udGVudHMgb2YgYSBjb2x1bW4gY29udGFpbmluZyBzZW5zaXRpdmUgZGF0YS4KKworaW5jbHVkZTo6cGFydGlhbCRtYXNraW5nX2Z1bmN0aW9ucy5hZG9jW10KKworW1t1c2VyLWRlZmluZWQtc2NhbGFyLWZ1bmN0aW9uc11dCis9PT09IFVzZXItZGVmaW5lZCBmdW5jdGlvbnMKKworVXNlci1kZWZpbmVkIGZ1bmN0aW9ucyAoVURGcykgZXhlY3V0ZSB1c2VyLXByb3ZpZGVkIGNvZGUgaW4gQ2Fzc2FuZHJhLiAKK0J5IGRlZmF1bHQsIENhc3NhbmRyYSBzdXBwb3J0cyBkZWZpbmluZyBmdW5jdGlvbnMgaW4gX0phdmFfLgorCitVREZzIGFyZSBwYXJ0IG9mIHRoZSBDYXNzYW5kcmEgc2NoZW1hLCBhbmQgYXJlIGF1dG9tYXRpY2FsbHkgcHJvcGFnYXRlZCB0byBhbGwgbm9kZXMgaW4gdGhlIGNsdXN0ZXIuICAKK1VERnMgY2FuIGJlIF9vdmVybG9hZGVkXywgc28gdGhhdCBtdWx0aXBsZSBVREZzIHdpdGggZGlmZmVyZW50IGFyZ3VtZW50IHR5cGVzIGNhbiBoYXZlIHRoZSBzYW1lIGZ1bmN0aW9uIG5hbWUuCisKKworW05PVEVdCisuTm90ZQorPT09PQorX0phdmFTY3JpcHRfIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgaW4gQ2Fzc2FuZHJhIDQuMS4gSW4gcHJlcGFyYXRpb24gZm9yIENhc3NhbmRyYSA1LjAsIHRoZWlyIHJlbW92YWwgaXMKK2FscmVhZHkgaW4gcHJvZ3Jlc3MuIEZvciBtb3JlIGluZm9ybWF0aW9uIC0gQ0FTU0FORFJBLTE3MjgxLCBDQVNTQU5EUkEtMTgyNTIuCis9PT09CisKK0ZvciBleGFtcGxlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2Z1bmN0aW9uX292ZXJsb2FkLmNxbFtdCistLS0tCisKK1VERnMgYXJlIHN1c2NlcHRpYmxlIHRvIGFsbCBvZiB0aGUgbm9ybWFsIHByb2JsZW1zIHdpdGggdGhlIGNob3NlbiBwcm9ncmFtbWluZyBsYW5ndWFnZS4gCitBY2NvcmRpbmdseSwgaW1wbGVtZW50YXRpb25zIHNob3VsZCBiZSBzYWZlIGFnYWluc3QgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbnMsIGlsbGVnYWwgYXJndW1lbnRzLCBvciBhbnkgb3RoZXIgcG90ZW50aWFsIHNvdXJjZSBvZiBleGNlcHRpb25zLiAKK0FuIGV4Y2VwdGlvbiBkdXJpbmcgZnVuY3Rpb24gZXhlY3V0aW9uIHdpbGwgcmVzdWx0IGluIHRoZSBlbnRpcmUgc3RhdGVtZW50IGZhaWxpbmcuCitWYWxpZCBxdWVyaWVzIGZvciBVREYgdXNlIGFyZSBgU0VMRUNUYCwgYElOU0VSVGAgYW5kIGBVUERBVEVgIHN0YXRlbWVudHMuCisKK19Db21wbGV4XyB0eXBlcyBsaWtlIGNvbGxlY3Rpb25zLCB0dXBsZSB0eXBlcyBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIGFyZSB2YWxpZCBhcmd1bWVudCBhbmQgcmV0dXJuIHR5cGVzIGluIFVERnMuIAorVHVwbGUgdHlwZXMgYW5kIHVzZXItZGVmaW5lZCB0eXBlcyB1c2UgdGhlIERhdGFTdGF4IEphdmEgRHJpdmVyIGNvbnZlcnNpb24gZnVuY3Rpb25zLgorUGxlYXNlIHNlZSB0aGUgSmF2YSBEcml2ZXIgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvbiBoYW5kbGluZyB0dXBsZSB0eXBlcyBhbmQgdXNlci1kZWZpbmVkIHR5cGVzLgorCitBcmd1bWVudHMgZm9yIGZ1bmN0aW9ucyBjYW4gYmUgbGl0ZXJhbHMgb3IgdGVybXMuIAorUHJlcGFyZWQgc3RhdGVtZW50IHBsYWNlaG9sZGVycyBjYW4gYmUgdXNlZCwgdG9vLgorCitOb3RlIHRoZSB1c2UgdGhlIGRvdWJsZSBkb2xsYXItc2lnbiBzeW50YXggdG8gZW5jbG9zZSB0aGUgVURGIHNvdXJjZSBjb2RlLiAKKworRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvZnVuY3Rpb25fZG9sbGFyc2lnbi5jcWxbXQorLS0tLQorCitUaGUgaW1wbGljaXRseSBhdmFpbGFibGUgYHVkZkNvbnRleHRgIGZpZWxkIChvciBiaW5kaW5nIGZvciBzY3JpcHQgVURGcykgcHJvdmlkZXMgdGhlIG5lY2Vzc2FyeSBmdW5jdGlvbmFsaXR5IHRvIGNyZWF0ZSBuZXcgVURUIGFuZCB0dXBsZSB2YWx1ZXM6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvZnVuY3Rpb25fdWRmY29udGV4dC5jcWxbXQorLS0tLQorCitUaGUgZGVmaW5pdGlvbiBvZiB0aGUgYFVERkNvbnRleHRgIGludGVyZmFjZSBjYW4gYmUgZm91bmQgaW4gdGhlIEFwYWNoZSBDYXNzYW5kcmEgc291cmNlIGNvZGUgZm9yIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5VREZDb250ZXh0YC4KKworW3NvdXJjZSxqYXZhXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRKQVZBL3VkZmNvbnRleHQuamF2YVtdCistLS0tCisKK0phdmEgVURGcyBhbHJlYWR5IGhhdmUgc29tZSBpbXBvcnRzIGZvciBjb21tb24gaW50ZXJmYWNlcyBhbmQgY2xhc3NlcyBkZWZpbmVkLiBUaGVzZSBpbXBvcnRzIGFyZToKKworW3NvdXJjZSxqYXZhXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRKQVZBL3VkZl9pbXBvcnRzLmphdmFbXQorLS0tLQorCitQbGVhc2Ugbm90ZSwgdGhhdCB0aGVzZSBjb252ZW5pZW5jZSBpbXBvcnRzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBzY3JpcHQgVURGcy4KKworW1tjcmVhdGUtZnVuY3Rpb24tc3RhdGVtZW50XV0KKz09PT0gQ1JFQVRFIEZVTkNUSU9OIHN0YXRlbWVudAorCitDcmVhdGluZyBhIG5ldyB1c2VyLWRlZmluZWQgZnVuY3Rpb24gdXNlcyB0aGUgYENSRUFURSBGVU5DVElPTmAgc3RhdGVtZW50OgorCitbc291cmNlLGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL2NyZWF0ZV9mdW5jdGlvbl9zdGF0ZW1lbnQuYm5mW10KKy0tLS0KKworRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX2Z1bmN0aW9uLmNxbFtdCistLS0tCisKK2BDUkVBVEUgRlVOQ1RJT05gIHdpdGggdGhlIG9wdGlvbmFsIGBPUiBSRVBMQUNFYCBrZXl3b3JkcyBjcmVhdGVzIGVpdGhlciBhIGZ1bmN0aW9uIG9yIHJlcGxhY2VzIGFuIGV4aXN0aW5nIG9uZSB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZS4gCitBIGBDUkVBVEUgRlVOQ1RJT05gIHdpdGhvdXQgYE9SIFJFUExBQ0VgIGZhaWxzIGlmIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgYWxyZWFkeSBleGlzdHMuICAKK0lmIHRoZSBvcHRpb25hbCBgSUYgTk9UIEVYSVNUU2Aga2V5d29yZHMgYXJlIHVzZWQsIHRoZSBmdW5jdGlvbiB3aWxsIG9ubHkgYmUgY3JlYXRlZCBvbmx5IGlmIGFub3RoZXIgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgZG9lcyBub3QKK2V4aXN0LgorYE9SIFJFUExBQ0VgIGFuZCBgSUYgTk9UIEVYSVNUU2AgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIuCisKK0JlaGF2aW9yIGZvciBgbnVsbGAgaW5wdXQgdmFsdWVzIG11c3QgYmUgZGVmaW5lZCBmb3IgZWFjaCBmdW5jdGlvbjoKKworKiBgUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVRgIGRlY2xhcmVzIHRoYXQgdGhlIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIHJldHVybiBgbnVsbGAgaWYgYW55IG9mIHRoZSBpbnB1dCBhcmd1bWVudHMgaXMgYG51bGxgLgorKiBgQ0FMTEVEIE9OIE5VTEwgSU5QVVRgIGRlY2xhcmVzIHRoYXQgdGhlIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGVkLgorCis9PT09PSBGdW5jdGlvbiBTaWduYXR1cmUKKworU2lnbmF0dXJlcyBhcmUgdXNlZCB0byBkaXN0aW5ndWlzaCBpbmRpdmlkdWFsIGZ1bmN0aW9ucy4gVGhlIHNpZ25hdHVyZSBjb25zaXN0cyBvZiBhIGZ1bGx5LXF1YWxpZmllZCBmdW5jdGlvbiBuYW1lIG9mIHRoZSA8a2V5c3BhY2U+LjxmdW5jdGlvbl9uYW1lPiBhbmQgYSBjb25jYXRlbmF0ZWQgbGlzdCBvZiBhbGwgdGhlIGFyZ3VtZW50IHR5cGVzLgorCitOb3RlIHRoYXQga2V5c3BhY2UgbmFtZXMsIGZ1bmN0aW9uIG5hbWVzIGFuZCBhcmd1bWVudCB0eXBlcyBhcmUgc3ViamVjdCB0byB0aGUgZGVmYXVsdCBuYW1pbmcgY29udmVudGlvbnMgYW5kIGNhc2Utc2Vuc2l0aXZpdHkgcnVsZXMuCisKK0Z1bmN0aW9ucyBiZWxvbmcgdG8gYSBrZXlzcGFjZTsgaWYgbm8ga2V5c3BhY2UgaXMgc3BlY2lmaWVkLCB0aGUgY3VycmVudCBrZXlzcGFjZSBpcyB1c2VkLiAKK1VzZXItZGVmaW5lZCBmdW5jdGlvbnMgYXJlIG5vdCBhbGxvd2VkIGluIHRoZSBzeXN0ZW0ga2V5c3BhY2VzLgorCitbW2Ryb3AtZnVuY3Rpb24tc3RhdGVtZW50XV0KKz09PT0gRFJPUCBGVU5DVElPTiBzdGF0ZW1lbnQKKworRHJvcHBpbmcgYSBmdW5jdGlvbiB1c2VzIHRoZSBgRFJPUCBGVU5DVElPTmAgc3RhdGVtZW50OgorCitbc291cmNlLCBibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9kcm9wX2Z1bmN0aW9uX3N0YXRlbWVudC5ibmZbXQorLS0tLQorCitGb3IgZXhhbXBsZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9kcm9wX2Z1bmN0aW9uLmNxbFtdCistLS0tCisKK1lvdSBtdXN0IHNwZWNpZnkgdGhlIGFyZ3VtZW50IHR5cGVzIG9mIHRoZSBmdW5jdGlvbiwgdGhlIGFyZ3VtZW50c19zaWduYXR1cmUsIGluIHRoZSBkcm9wIGNvbW1hbmQgaWYgdGhlcmUgYXJlIG11bHRpcGxlIG92ZXJsb2FkZWQgZnVuY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSBidXQgZGlmZmVyZW50IHNpZ25hdHVyZXMuICAKK2BEUk9QIEZVTkNUSU9OYCB3aXRoIHRoZSBvcHRpb25hbCBgSUYgRVhJU1RTYCBrZXl3b3JkcyBkcm9wcyBhIGZ1bmN0aW9uIGlmIGl0IGV4aXN0cywgYnV0IGRvZXMgbm90IHRocm93IGFuIGVycm9yIGlmIGl0IGRvZXNuJ3QuCisKK1tbYWdncmVnYXRlLWZ1bmN0aW9uc11dCis9PT0gQWdncmVnYXRlIGZ1bmN0aW9ucworCitBZ2dyZWdhdGUgZnVuY3Rpb25zIHdvcmsgb24gYSBzZXQgb2Ygcm93cy4gCitWYWx1ZXMgZm9yIGVhY2ggcm93IGFyZSBpbnB1dCwgdG8gcmV0dXJuIGEgc2luZ2xlIHZhbHVlIGZvciB0aGUgc2V0IG9mIHJvd3MgYWdncmVnYXRlZC4KKworSWYgYG5vcm1hbGAgY29sdW1ucywgYHNjYWxhciBmdW5jdGlvbnNgLCBgVURUYCBmaWVsZHMsIGB3cml0ZXRpbWVgLCBvciBgdHRsYCBhcmUgc2VsZWN0ZWQgdG9nZXRoZXIgd2l0aCBhZ2dyZWdhdGUgZnVuY3Rpb25zLCB0aGUgdmFsdWVzCityZXR1cm5lZCBmb3IgdGhlbSB3aWxsIGJlIHRoZSBvbmVzIG9mIHRoZSBmaXJzdCByb3cgbWF0Y2hpbmcgdGhlIHF1ZXJ5LgorCis9PT09IE5hdGl2ZSBhZ2dyZWdhdGVzCisKK1tbY291bnQtZnVuY3Rpb25dXQorPT09PT0gQ291bnQKKworVGhlIGBjb3VudGAgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY291bnQgdGhlIHJvd3MgcmV0dXJuZWQgYnkgYSBxdWVyeS4KKworRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvY291bnQuY3FsW10KKy0tLS0KKworSXQgYWxzbyBjYW4gY291bnQgdGhlIG5vbi1udWxsIHZhbHVlcyBvZiBhIGdpdmVuIGNvbHVtbjoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9jb3VudF9ub25udWxsLmNxbFtdCistLS0tCisKKz09PT09IE1heCBhbmQgTWluCisKK1RoZSBgbWF4YCBhbmQgYG1pbmAgZnVuY3Rpb25zIGNvbXB1dGUgdGhlIG1heGltdW0gYW5kIHRoZSBtaW5pbXVtIHZhbHVlIHJldHVybmVkIGJ5IGEgcXVlcnkgZm9yIGEgZ2l2ZW4gY29sdW1uLiAKKworRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvbWluX21heC5jcWxbXQorLS0tLQorCis9PT09PSBTdW0KKworVGhlIGBzdW1gIGZ1bmN0aW9uIHN1bXMgdXAgYWxsIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgYSBxdWVyeSBmb3IgYSBnaXZlbiBjb2x1bW4uCisKK1RoZSByZXR1cm5lZCB2YWx1ZSBpcyBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBpbnB1dCBjb2xsZWN0aW9uIGVsZW1lbnRzLCBzbyB0aGVyZSBpcyBhIHJpc2sgb2Ygb3ZlcmZsb3dpbmcgaWYgdGhlIHN1bSBvZiB0aGUgdmFsdWVzIGV4Y2VlZHMgdGhlIG1heGltdW0gdmFsdWUgdGhhdCB0aGUgdHlwZSBjYW4gcmVwcmVzZW50LgorCitGb3IgZXhhbXBsZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9zdW0uY3FsW10KKy0tLS0KKworVGhlIHJldHVybmVkIHZhbHVlIGlzIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGlucHV0IHZhbHVlcywgc28gdGhlcmUgaXMgYSByaXNrIG9mIG92ZXJmbG93aW5nIHRoZSB0eXBlIGlmIHRoZSBzdW0gb2YgdGhlCit2YWx1ZXMgZXhjZWVkcyB0aGUgbWF4aW11bSB2YWx1ZSB0aGF0IHRoZSB0eXBlIGNhbiByZXByZXNlbnQuIFlvdSBjYW4gdXNlIHR5cGUgY2FzdGluZyB0byBjYXN0IHRoZSBpbnB1dCB2YWx1ZXMgYXMgYQordHlwZSBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiB0aGUgdHlwZS4gRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvc3VtX3dpdGhfY2FzdC5jcWxbXQorLS0tLQorCis9PT09PSBBdmcKKworVGhlIGBhdmdgIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBhdmVyYWdlIG9mIGFsbCB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IGEgcXVlcnkgZm9yIGEgZ2l2ZW4gY29sdW1uLgorCitGb3IgZXhhbXBsZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9hdmcuY3FsW10KKy0tLS0KKworVGhlIGF2ZXJhZ2Ugb2YgYW4gZW1wdHkgY29sbGVjdGlvbiByZXR1cm5zIHplcm8uCisKK1RoZSByZXR1cm5lZCB2YWx1ZSBpcyBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBpbnB1dCB2YWx1ZXMsIHdoaWNoIG1pZ2h0IGluY2x1ZGUgcm91bmRpbmcgYW5kIHRydW5jYXRpb25zLgorRm9yIGV4YW1wbGUgYGNvbGxlY3Rpb25fYXZnKFsxLCAyXSlgIHJldHVybnMgYDFgIGluc3RlYWQgb2YgYDEuNWAuCitZb3UgY2FuIHVzZSB0eXBlIGNhc3RpbmcgdG8gY2FzdCB0byBhIHR5cGUgd2l0aCB0aGUgZGVzaXJlZCBkZWNpbWFsIHByZWNpc2lvbi4gRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvYXZnX3dpdGhfY2FzdC5jcWxbXQorLS0tLQorCitbW3VzZXItZGVmaW5lZC1hZ2dyZWdhdGVzLWZ1bmN0aW9uc11dCis9PT09IFVzZXItRGVmaW5lZCBBZ2dyZWdhdGVzIChVREFzKQorCitVc2VyLWRlZmluZWQgYWdncmVnYXRlcyBhbGxvdyB0aGUgY3JlYXRpb24gb2YgY3VzdG9tIGFnZ3JlZ2F0ZSBmdW5jdGlvbnMuIAorVXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZXMgY2FuIGJlIHVzZWQgaW4gYFNFTEVDVGAgc3RhdGVtZW50LgorCitFYWNoIGFnZ3JlZ2F0ZSByZXF1aXJlcyBhbiBfaW5pdGlhbCBzdGF0ZV8gb2YgdHlwZSBgU1RZUEVgIGRlZmluZWQgd2l0aCB0aGUgYElOSVRDT05EYHZhbHVlIChkZWZhdWx0IHZhbHVlOiBgbnVsbGApLiAKK1RoZSBmaXJzdCBhcmd1bWVudCBvZiB0aGUgc3RhdGUgZnVuY3Rpb24gbXVzdCBoYXZlIHR5cGUgYFNUWVBFYC4gCitUaGUgcmVtYWluaW5nIGFyZ3VtZW50cyBvZiB0aGUgc3RhdGUgZnVuY3Rpb24gbXVzdCBtYXRjaCB0aGUgdHlwZXMgb2YgdGhlIHVzZXItZGVmaW5lZCBhZ2dyZWdhdGUgYXJndW1lbnRzLiAKK1RoZSBzdGF0ZSBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCByb3csIGFuZCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIHN0YXRlIGZ1bmN0aW9uIGJlY29tZXMgdGhlIG5ldyBzdGF0ZS4gCitBZnRlciBhbGwgcm93cyBhcmUgcHJvY2Vzc2VkLCB0aGUgb3B0aW9uYWwgYEZJTkFMRlVOQ2AgaXMgZXhlY3V0ZWQgd2l0aCBsYXN0IHN0YXRlIHZhbHVlIGFzIGl0cyBhcmd1bWVudC4KKworVGhlIGBTVFlQRWAgdmFsdWUgaXMgbWFuZGF0b3J5IGluIG9yZGVyIHRvIGRpc3Rpbmd1aXNoIHBvc3NpYmx5IG92ZXJsb2FkZWQgdmVyc2lvbnMgb2YgdGhlIHN0YXRlIGFuZC9vciBmaW5hbCBmdW5jdGlvbiwgc2luY2UgdGhlCitvdmVybG9hZCBjYW4gYXBwZWFyIGFmdGVyIGNyZWF0aW9uIG9mIHRoZSBhZ2dyZWdhdGUuCisKKworQSBjb21wbGV0ZSB3b3JraW5nIGV4YW1wbGUgZm9yIHVzZXItZGVmaW5lZCBhZ2dyZWdhdGVzIChhc3N1bWluZyB0aGF0IGEKK2tleXNwYWNlIGhhcyBiZWVuIHNlbGVjdGVkIHVzaW5nIHRoZSBgVVNFYCBzdGF0ZW1lbnQpOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML3VkYS5jcWxbXQorLS0tLQorCitbW2NyZWF0ZS1hZ2dyZWdhdGUtc3RhdGVtZW50XV0KKz09PT0gQ1JFQVRFIEFHR1JFR0FURSBzdGF0ZW1lbnQKKworQ3JlYXRpbmcgKG9yIHJlcGxhY2luZykgYSB1c2VyLWRlZmluZWQgYWdncmVnYXRlIGZ1bmN0aW9uIHVzZXMgdGhlCitgQ1JFQVRFIEFHR1JFR0FURWAgc3RhdGVtZW50OgorCitbc291cmNlLCBibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9jcmVhdGVfYWdncmVnYXRlX3N0YXRlbWVudC5ibmZbXQorLS0tLQorCitTZWUgYWJvdmUgZm9yIGEgY29tcGxldGUgZXhhbXBsZS4KKworVGhlIGBDUkVBVEUgQUdHUkVHQVRFYCBjb21tYW5kIHdpdGggdGhlIG9wdGlvbmFsIGBPUiBSRVBMQUNFYCBrZXl3b3JkcyBjcmVhdGVzIGVpdGhlciBhbiBhZ2dyZWdhdGUgb3IgcmVwbGFjZXMgYW4gZXhpc3Rpbmcgb25lIHdpdGggdGhlIHNhbWUKK3NpZ25hdHVyZS4gCitBIGBDUkVBVEUgQUdHUkVHQVRFYCB3aXRob3V0IGBPUiBSRVBMQUNFYCBmYWlscyBpZiBhbiBhZ2dyZWdhdGUgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgYWxyZWFkeSBleGlzdHMuCitUaGUgYENSRUFURSBBR0dSRUdBVEVgIGNvbW1hbmQgd2l0aCB0aGUgb3B0aW9uYWwgYElGIE5PVCBFWElTVFNgIGtleXdvcmRzIGNyZWF0ZXMgYW4gYWdncmVnYXRlIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCitUaGUgYE9SIFJFUExBQ0VgIGFuZCBgSUYgTk9UIEVYSVNUU2AgcGhyYXNlcyBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci4KKworVGhlIGBTVFlQRWAgdmFsdWUgZGVmaW5lcyB0aGUgdHlwZSBvZiB0aGUgc3RhdGUgdmFsdWUgYW5kIG11c3QgYmUgc3BlY2lmaWVkLgorVGhlIG9wdGlvbmFsIGBJTklUQ09ORGAgZGVmaW5lcyB0aGUgaW5pdGlhbCBzdGF0ZSB2YWx1ZSBmb3IgdGhlIGFnZ3JlZ2F0ZTsgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYG51bGxgLiAKK0Egbm9uLW51bGwgYElOSVRDT05EYCBtdXN0IGJlIHNwZWNpZmllZCBmb3Igc3RhdGUgZnVuY3Rpb25zIHRoYXQgYXJlIGRlY2xhcmVkIHdpdGggYFJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUYC4KKworVGhlIGBTRlVOQ2AgdmFsdWUgcmVmZXJlbmNlcyBhbiBleGlzdGluZyBmdW5jdGlvbiB0byB1c2UgYXMgdGhlIHN0YXRlLW1vZGlmeWluZyBmdW5jdGlvbi4gCitUaGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlIHN0YXRlIGZ1bmN0aW9uIG11c3QgaGF2ZSB0eXBlIGBTVFlQRWAuCitUaGUgcmVtYWluaW5nIGFyZ3VtZW50cyBvZiB0aGUgc3RhdGUgZnVuY3Rpb24gbXVzdCBtYXRjaCB0aGUgdHlwZXMgb2YgdGhlIHVzZXItZGVmaW5lZCBhZ2dyZWdhdGUgYXJndW1lbnRzLgorVGhlIHN0YXRlIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIHJvdywgYW5kIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgc3RhdGUgZnVuY3Rpb24gYmVjb21lcyB0aGUgbmV3IHN0YXRlLgorU3RhdGUgaXMgbm90IHVwZGF0ZWQgZm9yIHN0YXRlIGZ1bmN0aW9ucyBkZWNsYXJlZCB3aXRoIGBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVGAgYW5kIGNhbGxlZCB3aXRoIGBudWxsYC4KK0FmdGVyIGFsbCByb3dzIGFyZSBwcm9jZXNzZWQsIHRoZSBvcHRpb25hbCBgRklOQUxGVU5DYCBpcyBleGVjdXRlZCB3aXRoIGxhc3Qgc3RhdGUgdmFsdWUgYXMgaXRzIGFyZ3VtZW50LgorSXQgbXVzdCB0YWtlIG9ubHkgb25lIGFyZ3VtZW50IHdpdGggdHlwZSBgU1RZUEVgLCBidXQgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBgRklOQUxGVU5DYCBtYXkgYmUgYSBkaWZmZXJlbnQgdHlwZS4gCitBIGZpbmFsIGZ1bmN0aW9uIGRlY2xhcmVkIHdpdGggYFJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUYCBtZWFucyB0aGF0IHRoZSBhZ2dyZWdhdGUncyByZXR1cm4gdmFsdWUgd2lsbCBiZSBgbnVsbGAsIGlmIHRoZSBsYXN0IHN0YXRlIGlzIGBudWxsYC4KKworSWYgbm8gYEZJTkFMRlVOQ2AgaXMgZGVmaW5lZCwgdGhlIG92ZXJhbGwgcmV0dXJuIHR5cGUgb2YgdGhlIGFnZ3JlZ2F0ZSBmdW5jdGlvbiBpcyBgU1RZUEVgLiAKK0lmIGEgYEZJTkFMRlVOQ2AgaXMgZGVmaW5lZCwgaXQgaXMgdGhlIHJldHVybiB0eXBlIG9mIHRoYXQgZnVuY3Rpb24uCisKK1tbZHJvcC1hZ2dyZWdhdGUtc3RhdGVtZW50XV0KKz09PT0gRFJPUCBBR0dSRUdBVEUgc3RhdGVtZW50CisKK0Ryb3BwaW5nIGFuIHVzZXItZGVmaW5lZCBhZ2dyZWdhdGUgZnVuY3Rpb24gdXNlcyB0aGUgYERST1AgQUdHUkVHQVRFYAorc3RhdGVtZW50OgorCitbc291cmNlLCBibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9kcm9wX2FnZ3JlZ2F0ZV9zdGF0ZW1lbnQuYm5mW10KKy0tLS0KKworRm9yIGluc3RhbmNlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2Ryb3BfYWdncmVnYXRlLmNxbFtdCistLS0tCisKK1RoZSBgRFJPUCBBR0dSRUdBVEVgIHN0YXRlbWVudCByZW1vdmVzIGFuIGFnZ3JlZ2F0ZSBjcmVhdGVkIHVzaW5nIGBDUkVBVEUgQUdHUkVHQVRFYC4gCitZb3UgbXVzdCBzcGVjaWZ5IHRoZSBhcmd1bWVudCB0eXBlcyBvZiB0aGUgYWdncmVnYXRlIHRvIGRyb3AgaWYgdGhlcmUgYXJlIG11bHRpcGxlIG92ZXJsb2FkZWQgYWdncmVnYXRlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYnV0IGEKK2RpZmZlcmVudCBzaWduYXR1cmUuCisKK1RoZSBgRFJPUCBBR0dSRUdBVEVgIGNvbW1hbmQgd2l0aCB0aGUgb3B0aW9uYWwgYElGIEVYSVNUU2Aga2V5d29yZHMgZHJvcHMgYW4gYWdncmVnYXRlIGlmIGl0IGV4aXN0cywgYW5kIGRvZXMgbm90aGluZyBpZiBhIGZ1bmN0aW9uIHdpdGggdGhlCitzaWduYXR1cmUgZG9lcyBub3QgZXhpc3QuCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvaW5kZXguYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9pbmRleC5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZTg0YTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvaW5kZXguYWRvYwpAQCAtMCwwICsxLDI1IEBACis9IFRoZSBDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UgKENRTCkKKworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIENhc3NhbmRyYSBRdWVyeSBMYW5ndWFnZQorKENRTCkgdmVyc2lvbiAzLgorTm90ZSB0aGF0IHRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBsYXN0IHZlcnNpb24gb2YgdGhlIGxhbmd1YWdlLgorSG93ZXZlciwgdGhlIHhyZWY6Y3FsL2NoYW5nZXMuYWRvY1tjaGFuZ2VzXSBzZWN0aW9uIHByb3ZpZGVzIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyBvZiBDUUwgc2luY2UgdmVyc2lvbiAzLjAuCisKK0NRTCBvZmZlcnMgYSBtb2RlbCBzaW1pbGFyIHRvIFNRTC4KK1RoZSBkYXRhIGlzIHN0b3JlZCBpbiAqdGFibGVzKiBjb250YWluaW5nICpyb3dzKiBvZiAqY29sdW1ucyouCitGb3IgdGhhdCByZWFzb24sIHdoZW4gdXNlZCBpbiB0aGlzIGRvY3VtZW50LCB0aGVzZSB0ZXJtcyAodGFibGVzLCByb3dzIGFuZCBjb2x1bW5zKSBoYXZlIHRoZSBzYW1lIGRlZmluaXRpb24gdGhhdCB0aGV5IGhhdmUgaW4gU1FMLgorCisqIHhyZWY6Y3FsL2RlZmluaXRpb25zLmFkb2NbRGVmaW5pdGlvbnNdCisqIHhyZWY6Y3FsL3R5cGVzLmFkb2NbRGF0YSB0eXBlc10KKyogeHJlZjpjcWwvZGRsLmFkb2NbRGF0YSBkZWZpbml0aW9uIGxhbmd1YWdlXQorKiB4cmVmOmNxbC9kbWwuYWRvY1tEYXRhIG1hbmlwdWxhdGlvbiBsYW5ndWFnZV0KKyogeHJlZjpjcWwvb3BlcmF0b3JzLmFkb2NbT3BlcmF0b3JzXQorKiB4cmVmOmNxbC9pbmRleGVzLmFkb2NbU2Vjb25kYXJ5IGluZGV4ZXNdCisqIHhyZWY6Y3FsL212cy5hZG9jW01hdGVyaWFsaXplZCB2aWV3c10KKyogeHJlZjpjcWwvZnVuY3Rpb25zLmFkb2NbRnVuY3Rpb25zXQorKiB4cmVmOmNxbC9qc29uLmFkb2NbSlNPTl0KKyogeHJlZjpjcWwvc2VjdXJpdHkuYWRvY1tDUUwgc2VjdXJpdHldCisqIHhyZWY6Y3FsL2R5bmFtaWNfZGF0YV9tYXNraW5nLmFkb2NbRHluYW1pYyBkYXRhIG1hc2tpbmddCisqIHhyZWY6Y3FsL3RyaWdnZXJzLmFkb2NbVHJpZ2dlcnNdCisqIHhyZWY6Y3FsL2FwcGVuZGljZXMuYWRvY1tBcHBlbmRpY2VzXQorKiB4cmVmOmNxbC9jaGFuZ2VzLmFkb2NbQ2hhbmdlc10KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvaW5kZXhlcy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL2luZGV4ZXMuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9pbmRleGVzLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9pbmRleGVzLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9qc29uLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvanNvbi5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNDYyZTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvanNvbi5hZG9jCkBAIC0wLDAgKzEsMTI1IEBACis9IEpTT04gU3VwcG9ydAorCitDYXNzYW5kcmEgMi4yIGludHJvZHVjZXMgSlNPTiBzdXBwb3J0IHRvIGBTRUxFQ1QgPHNlbGVjdC1zdGF0ZW1lbnQ+YCBhbmQKK2BJTlNFUlQgPGluc2VydC1zdGF0ZW1lbnQ+YCBzdGF0ZW1lbnRzLiAKK1RoaXMgc3VwcG9ydCBkb2VzIG5vdCBmdW5kYW1lbnRhbGx5IGFsdGVyIHRoZSBDUUwgQVBJIChmb3IgZXhhbXBsZSwgdGhlIHNjaGVtYSBpcyBzdGlsbAorZW5mb3JjZWQpLgorSXQgc2ltcGx5IHByb3ZpZGVzIGEgY29udmVuaWVudCB3YXkgdG8gd29yayB3aXRoIEpTT04gZG9jdW1lbnRzLgorCis9PSBTRUxFQ1QgSlNPTgorCitXaXRoIGBTRUxFQ1RgIHN0YXRlbWVudHMsIHRoZSBgSlNPTmAga2V5d29yZCBpcyB1c2VkIHRvIHJldHVybiBlYWNoIHJvdyBhcyBhIHNpbmdsZSBgSlNPTmAgZW5jb2RlZCBtYXAuIAorVGhlIHJlbWFpbmRlciBvZiB0aGUgYFNFTEVDVGAgc3RhdGVtZW50IGJlaGF2aW9yIGlzIHRoZSBzYW1lLgorCitUaGUgcmVzdWx0IG1hcCBrZXlzIG1hdGNoIHRoZSBjb2x1bW4gbmFtZXMgaW4gYSBub3JtYWwgcmVzdWx0IHNldC4gCitGb3IgZXhhbXBsZSwgYSBzdGF0ZW1lbnQgbGlrZSBgU0VMRUNUIEpTT04gYSwgdHRsKGIpIEZST00gLi4uYCB3b3VsZCByZXN1bHQgaW4gYSBtYXAgd2l0aCBrZXlzIGAiYSJgIGFuZCBgInR0bChiKSJgLiAKK0hvd2V2ZXIsIHRoZXJlIGlzIG9uZSBub3RhYmxlIGV4Y2VwdGlvbjogZm9yIHN5bW1ldHJ5IHdpdGggYElOU0VSVCBKU09OYCBiZWhhdmlvciwgY2FzZS1zZW5zaXRpdmUgY29sdW1uIG5hbWVzIHdpdGggdXBwZXItY2FzZSBsZXR0ZXJzIHdpbGwgYmUgc3Vycm91bmRlZCB3aXRoIGRvdWJsZSBxdW90ZXMuIAorRm9yIGV4YW1wbGUsIGBTRUxFQ1QgSlNPTiBteUNvbHVtbiBGUk9NIC4uLmAgd291bGQgcmVzdWx0IGluIGEgbWFwIGtleSBgIlwibXlDb2x1bW5cIiJgIHdpdGggZXNjYXBlZCBxdW90ZXMpLgorCitUaGUgbWFwIHZhbHVlcyB3aWxsIEpTT04tZW5jb2RlZCByZXByZXNlbnRhdGlvbnMgKGFzIGRlc2NyaWJlZCBiZWxvdykgb2YgdGhlIHJlc3VsdCBzZXQgdmFsdWVzLgorCis9PSBJTlNFUlQgSlNPTgorCitXaXRoIGBJTlNFUlRgIHN0YXRlbWVudHMsIHRoZSBuZXcgYEpTT05gIGtleXdvcmQgY2FuIGJlIHVzZWQgdG8gZW5hYmxlCitpbnNlcnRpbmcgYSBgSlNPTmAgZW5jb2RlZCBtYXAgYXMgYSBzaW5nbGUgcm93LiBUaGUgZm9ybWF0IG9mIHRoZSBgSlNPTmAKK21hcCBzaG91bGQgZ2VuZXJhbGx5IG1hdGNoIHRoYXQgcmV0dXJuZWQgYnkgYSBgU0VMRUNUIEpTT05gIHN0YXRlbWVudCBvbgordGhlIHNhbWUgdGFibGUuIEluIHBhcnRpY3VsYXIsIGNhc2Utc2Vuc2l0aXZlIGNvbHVtbiBuYW1lcyBzaG91bGQgYmUKK3N1cnJvdW5kZWQgd2l0aCBkb3VibGUgcXVvdGVzLiBGb3IgZXhhbXBsZSwgdG8gaW5zZXJ0IGludG8gYSB0YWJsZSB3aXRoCit0d28gY29sdW1ucyBuYW1lZCAibXlLZXkiIGFuZCAidmFsdWUiLCB5b3Ugd291bGQgZG8gdGhlIGZvbGxvd2luZzoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9pbnNlcnRfanNvbi5jcWxbXQorLS0tLQorCitCeSBkZWZhdWx0IChvciBpZiBgREVGQVVMVCBOVUxMYCBpcyBleHBsaWNpdGx5IHVzZWQpLCBhIGNvbHVtbiBvbWl0dGVkCitmcm9tIHRoZSBgSlNPTmAgbWFwIHdpbGwgYmUgc2V0IHRvIGBOVUxMYCwgbWVhbmluZyB0aGF0IGFueSBwcmUtZXhpc3RpbmcKK3ZhbHVlIGZvciB0aGF0IGNvbHVtbiB3aWxsIGJlIHJlbW92ZWQgKHJlc3VsdGluZyBpbiBhIHRvbWJzdG9uZSBiZWluZworY3JlYXRlZCkuIEFsdGVybmF0aXZlbHksIGlmIHRoZSBgREVGQVVMVCBVTlNFVGAgZGlyZWN0aXZlIGlzIHVzZWQgYWZ0ZXIKK3RoZSB2YWx1ZSwgb21pdHRlZCBjb2x1bW4gdmFsdWVzIHdpbGwgYmUgbGVmdCB1bnNldCwgbWVhbmluZyB0aGF0CitwcmUtZXhpc3RpbmcgdmFsdWVzIGZvciB0aG9zZSBjb2x1bW4gd2lsbCBiZSBwcmVzZXJ2ZWQuCisKKz09IEpTT04gRW5jb2Rpbmcgb2YgQ2Fzc2FuZHJhIERhdGEgVHlwZXMKKworV2hlcmUgcG9zc2libGUsIENhc3NhbmRyYSB3aWxsIHJlcHJlc2VudCBhbmQgYWNjZXB0IGRhdGEgdHlwZXMgaW4gdGhlaXIKK25hdGl2ZSBgSlNPTmAgcmVwcmVzZW50YXRpb24uIENhc3NhbmRyYSB3aWxsIGFsc28gYWNjZXB0IHN0cmluZworcmVwcmVzZW50YXRpb25zIG1hdGNoaW5nIHRoZSBDUUwgbGl0ZXJhbCBmb3JtYXQgZm9yIGFsbCBzaW5nbGUtZmllbGQKK3R5cGVzLiBGb3IgZXhhbXBsZSwgZmxvYXRzLCBpbnRzLCBVVUlEcywgYW5kIGRhdGVzIGNhbiBiZSByZXByZXNlbnRlZCBieQorQ1FMIGxpdGVyYWwgc3RyaW5ncy4gSG93ZXZlciwgY29tcG91bmQgdHlwZXMsIHN1Y2ggYXMgY29sbGVjdGlvbnMsCit0dXBsZXMsIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMgbXVzdCBiZSByZXByZXNlbnRlZCBieSBuYXRpdmUgYEpTT05gCitjb2xsZWN0aW9ucyAobWFwcyBhbmQgbGlzdHMpIG9yIGEgSlNPTi1lbmNvZGVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZgordGhlIGNvbGxlY3Rpb24uCisKK1RoZSBmb2xsb3dpbmcgdGFibGUgZGVzY3JpYmVzIHRoZSBlbmNvZGluZ3MgdGhhdCBDYXNzYW5kcmEgd2lsbCBhY2NlcHQKK2luIGBJTlNFUlQgSlNPTmAgdmFsdWVzIChhbmQgYGZyb21fanNvbigpYCBhcmd1bWVudHMpIGFzIHdlbGwgYXMgdGhlCitmb3JtYXQgQ2Fzc2FuZHJhIHdpbGwgdXNlIHdoZW4gcmV0dXJuaW5nIGRhdGEgZm9yIGBTRUxFQ1QgSlNPTmAKK3N0YXRlbWVudHMgKGFuZCBgZnJvbV9qc29uKClgKToKKworW2NvbHM9IiwsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8VHlwZSB8Rm9ybWF0cyBhY2NlcHRlZCB8UmV0dXJuIGZvcm1hdCB8Tm90ZXMKKworfCBgYXNjaWlgIHwgc3RyaW5nIHwgc3RyaW5nIHwgVXNlcyBKU09OJ3MgYFx1YCBjaGFyYWN0ZXIgZXNjYXBlCisKK3wgYGJpZ2ludGAgfCBpbnRlZ2VyLCBzdHJpbmcgfCBpbnRlZ2VyIHwgU3RyaW5nIG11c3QgYmUgdmFsaWQgNjQgYml0IGludGVnZXIKKworfCBgYmxvYmAgfCBzdHJpbmcgfCBzdHJpbmcgfCBTdHJpbmcgc2hvdWxkIGJlIDB4IGZvbGxvd2VkIGJ5IGFuIGV2ZW4gbnVtYmVyIG9mIGhleCBkaWdpdHMKKworfCBgYm9vbGVhbmAgfCBib29sZWFuLCBzdHJpbmcgfCBib29sZWFuIHwgU3RyaW5nIG11c3QgYmUgInRydWUiIG9yICJmYWxzZSIKKworfCBgZGF0ZWAgfCBzdHJpbmcgfCBzdHJpbmcgfCBEYXRlIGluIGZvcm1hdCBgWVlZWS1NTS1ERGAsIHRpbWV6b25lIFVUQworCit8IGBkZWNpbWFsYCB8IGludGVnZXIsIGZsb2F0LCBzdHJpbmcgfCBmbG9hdCB8IE1heSBleGNlZWQgMzIgb3IgNjQtYml0IElFRUUtNzU0IGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbiBpbiBjbGllbnQtc2lkZSBkZWNvZGVyCisKK3wgYGRvdWJsZWAgfCBpbnRlZ2VyLCBmbG9hdCwgc3RyaW5nIHwgZmxvYXQgfCBTdHJpbmcgbXVzdCBiZSB2YWxpZCBpbnRlZ2VyIG9yIGZsb2F0CisKK3wgYGZsb2F0YCB8IGludGVnZXIsIGZsb2F0LCBzdHJpbmcgfCBmbG9hdCB8IFN0cmluZyBtdXN0IGJlIHZhbGlkIGludGVnZXIgb3IgZmxvYXQKKworfCBgaW5ldGAgfCBzdHJpbmcgfCBzdHJpbmcgfCBJUHY0IG9yIElQdjYgYWRkcmVzcworCit8IGBpbnRgIHwgaW50ZWdlciwgc3RyaW5nIHwgaW50ZWdlciB8IFN0cmluZyBtdXN0IGJlIHZhbGlkIDMyIGJpdCBpbnRlZ2VyCisKK3wgYGxpc3RgIHwgbGlzdCwgc3RyaW5nIHwgbGlzdCB8IFVzZXMgSlNPTidzIG5hdGl2ZSBsaXN0IHJlcHJlc2VudGF0aW9uCisKK3wgYG1hcGAgfCBtYXAsIHN0cmluZyB8IG1hcCB8IFVzZXMgSlNPTidzIG5hdGl2ZSBtYXAgcmVwcmVzZW50YXRpb24KKworfCBgc21hbGxpbnRgIHwgaW50ZWdlciwgc3RyaW5nIHwgaW50ZWdlciB8IFN0cmluZyBtdXN0IGJlIHZhbGlkIDE2IGJpdCBpbnRlZ2VyCisKK3wgYHNldGAgfCBsaXN0LCBzdHJpbmcgfCBsaXN0IHwgVXNlcyBKU09OJ3MgbmF0aXZlIGxpc3QgcmVwcmVzZW50YXRpb24KKworfCBgdGV4dGAgfCBzdHJpbmcgfCBzdHJpbmcgfCBVc2VzIEpTT04ncyBgXHVgIGNoYXJhY3RlciBlc2NhcGUKKworfCBgdGltZWAgfCBzdHJpbmcgfCBzdHJpbmcgfCBUaW1lIG9mIGRheSBpbiBmb3JtYXQgYEhILU1NLVNTWy5mZmZmZmZmZmZdYAorCit8IGB0aW1lc3RhbXBgIHwgaW50ZWdlciwgc3RyaW5nIHwgc3RyaW5nIHwgQSB0aW1lc3RhbXAuIFN0cmluZ3MgY29uc3RhbnQgYWxsb3dzIHRvIGlucHV0IGB0aW1lc3RhbXBzCithcyBkYXRlcyA8dGltZXN0YW1wcz5gLiBEYXRlc3RhbXBzIHdpdGggZm9ybWF0IGBZWVlZLU1NLUREIEhIOk1NOlNTLlNTU2AKK2FyZSByZXR1cm5lZC4KKworfCBgdGltZXV1aWRgIHwgc3RyaW5nIHwgc3RyaW5nIHwgVHlwZSAxIFVVSUQuIFNlZSBgY29uc3RhbnRgIGZvciB0aGUgVVVJRCBmb3JtYXQKKworfCBgdGlueWludGAgfCBpbnRlZ2VyLCBzdHJpbmcgfCBpbnRlZ2VyIHwgU3RyaW5nIG11c3QgYmUgdmFsaWQgOCBiaXQgaW50ZWdlcgorCit8IGB0dXBsZWAgfCBsaXN0LCBzdHJpbmcgfCBsaXN0IHwgVXNlcyBKU09OJ3MgbmF0aXZlIGxpc3QgcmVwcmVzZW50YXRpb24KKworfCBgVURUYCB8IG1hcCwgc3RyaW5nIHwgbWFwIHwgVXNlcyBKU09OJ3MgbmF0aXZlIG1hcCByZXByZXNlbnRhdGlvbiB3aXRoIGZpZWxkIG5hbWVzIGFzIGtleXMKKworfCBgdXVpZGAgfCBzdHJpbmcgfCBzdHJpbmcgfCBTZWUgYGNvbnN0YW50YCBmb3IgdGhlIFVVSUQgZm9ybWF0CisKK3wgYHZhcmNoYXJgIHwgc3RyaW5nIHwgc3RyaW5nIHwgVXNlcyBKU09OJ3MgYFx1YCBjaGFyYWN0ZXIgZXNjYXBlCisKK3wgYHZhcmludGAgfCBpbnRlZ2VyLCBzdHJpbmcgfCBpbnRlZ2VyIHwgVmFyaWFibGUgbGVuZ3RoOyBtYXkgb3ZlcmZsb3cgMzIgb3IgNjQgYml0IGludGVnZXJzIGluIGNsaWVudC1zaWRlIGRlY29kZXIKK3w9PT0KKworPT0gVGhlIGZyb21fanNvbigpIEZ1bmN0aW9uCisKK1RoZSBgZnJvbV9qc29uKClgIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHNpbWlsYXJseSB0byBgSU5TRVJUIEpTT05gLCBidXQKK2ZvciBhIHNpbmdsZSBjb2x1bW4gdmFsdWUuIEl0IG1heSBvbmx5IGJlIHVzZWQgaW4gdGhlIGBWQUxVRVNgIGNsYXVzZSBvZgorYW4gYElOU0VSVGAgc3RhdGVtZW50IG9yIGFzIG9uZSBvZiB0aGUgY29sdW1uIHZhbHVlcyBpbiBhbiBgVVBEQVRFYCwKK2BERUxFVEVgLCBvciBgU0VMRUNUYCBzdGF0ZW1lbnQuIEZvciBleGFtcGxlLCBpdCBjYW5ub3QgYmUgdXNlZCBpbiB0aGUKK3NlbGVjdGlvbiBjbGF1c2Ugb2YgYSBgU0VMRUNUYCBzdGF0ZW1lbnQuCisKKz09IFRoZSB0b19qc29uKCkgRnVuY3Rpb24KKworVGhlIGB0b19qc29uKClgIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHNpbWlsYXJseSB0byBgU0VMRUNUIEpTT05gLCBidXQgZm9yCithIHNpbmdsZSBjb2x1bW4gdmFsdWUuIEl0IG1heSBvbmx5IGJlIHVzZWQgaW4gdGhlIHNlbGVjdGlvbiBjbGF1c2Ugb2YgYQorYFNFTEVDVGAgc3RhdGVtZW50LgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9tdnMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9tdnMuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9tdnMuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL212cy5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL29wZXJhdG9ycy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL29wZXJhdG9ycy5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL29wZXJhdG9ycy5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvb3BlcmF0b3JzLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9zZWN1cml0eS5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL3NlY3VyaXR5LmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY2ZWI4NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9zZWN1cml0eS5hZG9jCkBAIC0wLDAgKzEsNjMwIEBACityb2xlX25hbWUgOjo9IGlkZW50aWZpZXIgfCBzdHJpbmc9IFNlY3VyaXR5CisKK1tbY3FsLXJvbGVzXV0KKz09IERhdGFiYXNlIFJvbGVzCisKK0NRTCB1c2VzIGRhdGFiYXNlIHJvbGVzIHRvIHJlcHJlc2VudCB1c2VycyBhbmQgZ3JvdXAgb2YgdXNlcnMuCitTeW50YWN0aWNhbGx5LCBhIHJvbGUgaXMgZGVmaW5lZCBieToKKworW3NvdXJjZSwgYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvcm9sZV9uYW1lLmJuZltdCistLS0tCisKKworW1tjcmVhdGUtcm9sZS1zdGF0ZW1lbnRdXQorPT09IENSRUFURSBST0xFCisKK0NyZWF0aW5nIGEgcm9sZSB1c2VzIHRoZSBgQ1JFQVRFIFJPTEVgIHN0YXRlbWVudDoKKworW3NvdXJjZSwgYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvY3JlYXRlX3JvbGVfc3RhdGVtZW50LmJuZltdCistLS0tCisKK0ZvciBpbnN0YW5jZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9jcmVhdGVfcm9sZS5jcWxbXQorLS0tLQorCitCeSBkZWZhdWx0IHJvbGVzIGRvIG5vdCBwb3NzZXNzIGBMT0dJTmAgcHJpdmlsZWdlcyBvciBgU1VQRVJVU0VSYAorc3RhdHVzLgorCit4cmVmOmNxbC9zZWN1cml0eS5hZG9jI2NxbC1wZXJtaXNzaW9uc1tQZXJtaXNzaW9uc10gb24gZGF0YWJhc2UgcmVzb3VyY2VzIGFyZSBncmFudGVkIHRvCityb2xlczsgdHlwZXMgb2YgcmVzb3VyY2VzIGluY2x1ZGUga2V5c3BhY2VzLCB0YWJsZXMsIGZ1bmN0aW9ucyBhbmQgcm9sZXMKK3RoZW1zZWx2ZXMuIFJvbGVzIG1heSBiZSBncmFudGVkIHRvIG90aGVyIHJvbGVzIHRvIGNyZWF0ZSBoaWVyYXJjaGljYWwKK3Blcm1pc3Npb25zIHN0cnVjdHVyZXM7IGluIHRoZXNlIGhpZXJhcmNoaWVzLCBwZXJtaXNzaW9ucyBhbmQKK2BTVVBFUlVTRVJgIHN0YXR1cyBhcmUgaW5oZXJpdGVkLCBidXQgdGhlIGBMT0dJTmAgcHJpdmlsZWdlIGlzIG5vdC4KKworSWYgYSByb2xlIGhhcyB0aGUgYExPR0lOYCBwcml2aWxlZ2UsIGNsaWVudHMgbWF5IGlkZW50aWZ5IGFzIHRoYXQgcm9sZQord2hlbiBjb25uZWN0aW5nLiBGb3IgdGhlIGR1cmF0aW9uIG9mIHRoYXQgY29ubmVjdGlvbiwgdGhlIGNsaWVudCB3aWxsCithY3F1aXJlIGFueSByb2xlcyBhbmQgcHJpdmlsZWdlcyBncmFudGVkIHRvIHRoYXQgcm9sZS4KKworT25seSBhIGNsaWVudCB3aXRoIHdpdGggdGhlIGBDUkVBVEVgIHBlcm1pc3Npb24gb24gdGhlIGRhdGFiYXNlIHJvbGVzCityZXNvdXJjZSBtYXkgaXNzdWUgYENSRUFURSBST0xFYCByZXF1ZXN0cyAoc2VlIHRoZQoreHJlZjpjcWwvc2VjdXJpdHkuYWRvYyNjcWwtcGVybWlzc2lvbnNbcmVsZXZhbnQgc2VjdGlvbl0pLCB1bmxlc3MgdGhlIGNsaWVudCBpcyBhCitgU1VQRVJVU0VSYC4gUm9sZSBtYW5hZ2VtZW50IGluIENhc3NhbmRyYSBpcyBwbHVnZ2FibGUgYW5kIGN1c3RvbQoraW1wbGVtZW50YXRpb25zIG1heSBzdXBwb3J0IG9ubHkgYSBzdWJzZXQgb2YgdGhlIGxpc3RlZCBvcHRpb25zLgorCitSb2xlIG5hbWVzIHNob3VsZCBiZSBxdW90ZWQgaWYgdGhleSBjb250YWluIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycy4KKworPT09PSBTZXR0aW5nIGNyZWRlbnRpYWxzIGZvciBpbnRlcm5hbCBhdXRoZW50aWNhdGlvbgorCitVc2UgdGhlIGBXSVRIIFBBU1NXT1JEYCBjbGF1c2UgdG8gc2V0IGEgcGFzc3dvcmQgZm9yIGludGVybmFsCithdXRoZW50aWNhdGlvbiwgZW5jbG9zaW5nIHRoZSBwYXNzd29yZCBpbiBzaW5nbGUgcXVvdGF0aW9uIG1hcmtzLgorCitJZiBpbnRlcm5hbCBhdXRoZW50aWNhdGlvbiBoYXMgbm90IGJlZW4gc2V0IHVwIG9yIHRoZSByb2xlIGRvZXMgbm90IGhhdmUKK2BMT0dJTmAgcHJpdmlsZWdlcywgdGhlIGBXSVRIIFBBU1NXT1JEYCBjbGF1c2UgaXMgbm90IG5lY2Vzc2FyeS4KKworVVNFIGBXSVRIIEhBU0hFRCBQQVNTV09SRGAgdG8gcHJvdmlkZSB0aGUgakJjcnlwdCBoYXNoZWQgcGFzc3dvcmQgZGlyZWN0bHkuIFNlZSB0aGUgYGhhc2hfcGFzc3dvcmRgIHRvb2wuCisKKz09PT0gUmVzdHJpY3RpbmcgY29ubmVjdGlvbnMgdG8gc3BlY2lmaWMgZGF0YWNlbnRlcnMKKworSWYgYSBgbmV0d29ya19hdXRob3JpemVyYCBoYXMgYmVlbiBjb25maWd1cmVkLCB5b3UgY2FuIHJlc3RyaWN0IGxvZ2luCityb2xlcyB0byBzcGVjaWZpYyBkYXRhY2VudGVycyB3aXRoIHRoZSBgQUNDRVNTIFRPIERBVEFDRU5URVJTYCBjbGF1c2UKK2ZvbGxvd2VkIGJ5IGEgc2V0IGxpdGVyYWwgb2YgZGF0YWNlbnRlcnMgdGhlIHVzZXIgY2FuIGFjY2Vzcy4gTm90CitzcGVjaWZpeWluZyBkYXRhY2VudGVycyBpbXBsaWNpdGx5IGdyYW50cyBhY2Nlc3MgdG8gYWxsIGRhdGFjZW50ZXJzLiBUaGUKK2NsYXVzZSBgQUNDRVNTIFRPIEFMTCBEQVRBQ0VOVEVSU2AgY2FuIGJlIHVzZWQgZm9yIGV4cGxpY2l0bmVzcywgYnV0Cit0aGVyZSdzIG5vIGZ1bmN0aW9uYWwgZGlmZmVyZW5jZS4KKworPT09PSBDcmVhdGluZyBhIHJvbGUgY29uZGl0aW9uYWxseQorCitBdHRlbXB0aW5nIHRvIGNyZWF0ZSBhbiBleGlzdGluZyByb2xlIHJlc3VsdHMgaW4gYW4gaW52YWxpZCBxdWVyeQorY29uZGl0aW9uIHVubGVzcyB0aGUgYElGIE5PVCBFWElTVFNgIG9wdGlvbiBpcyB1c2VkLiBJZiB0aGUgb3B0aW9uIGlzCit1c2VkIGFuZCB0aGUgcm9sZSBleGlzdHMsIHRoZSBzdGF0ZW1lbnQgaXMgYSBuby1vcDoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9jcmVhdGVfcm9sZV9pZm5vdGV4aXN0cy5jcWxbXQorLS0tLQorCitbW2FsdGVyLXJvbGUtc3RhdGVtZW50XV0KKz09PSBBTFRFUiBST0xFCisKK0FsdGVyaW5nIGEgcm9sZSBvcHRpb25zIHVzZXMgdGhlIGBBTFRFUiBST0xFYCBzdGF0ZW1lbnQ6CisKK1tzb3VyY2UsIGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL2FsdGVyX3JvbGVfc3RhdGVtZW50LmJuZltdCistLS0tCisKK0ZvciBleGFtcGxlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2FsdGVyX3JvbGUuY3FsW10KKy0tLS0KK0lmIHRoZSByb2xlIGRvZXMgbm90IGV4aXN0LCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLCB1bmxlc3MgYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KKworVVNFIGBXSVRIIEhBU0hFRCBQQVNTV09SRGAgdG8gcHJvdmlkZSB0aGUgakJjcnlwdCBoYXNoZWQgcGFzc3dvcmQgZGlyZWN0bHkuIFNlZSB0aGUgYGhhc2hfcGFzc3dvcmRgIHRvb2wuCisKKz09PT0gUmVzdHJpY3RpbmcgY29ubmVjdGlvbnMgdG8gc3BlY2lmaWMgZGF0YWNlbnRlcnMKKworSWYgYSBgbmV0d29ya19hdXRob3JpemVyYCBoYXMgYmVlbiBjb25maWd1cmVkLCB5b3UgY2FuIHJlc3RyaWN0IGxvZ2luCityb2xlcyB0byBzcGVjaWZpYyBkYXRhY2VudGVycyB3aXRoIHRoZSBgQUNDRVNTIFRPIERBVEFDRU5URVJTYCBjbGF1c2UKK2ZvbGxvd2VkIGJ5IGEgc2V0IGxpdGVyYWwgb2YgZGF0YWNlbnRlcnMgdGhlIHVzZXIgY2FuIGFjY2Vzcy4gVG8gcmVtb3ZlCithbnkgZGF0YSBjZW50ZXIgcmVzdHJpY3Rpb25zLCB1c2UgdGhlIGBBQ0NFU1MgVE8gQUxMIERBVEFDRU5URVJTYAorY2xhdXNlLgorCitDb25kaXRpb25zIG9uIGV4ZWN1dGluZyBgQUxURVIgUk9MRWAgc3RhdGVtZW50czoKKworKiBhIGNsaWVudCBtdXN0IGhhdmUgYFNVUEVSVVNFUmAgc3RhdHVzIHRvIGFsdGVyIHRoZSBgU1VQRVJVU0VSYCBzdGF0dXMKK29mIGFub3RoZXIgcm9sZQorKiBhIGNsaWVudCBjYW5ub3QgYWx0ZXIgdGhlIGBTVVBFUlVTRVJgIHN0YXR1cyBvZiBhbnkgcm9sZSBpdCBjdXJyZW50bHkKK2hvbGRzCisqIGEgY2xpZW50IGNhbiBvbmx5IG1vZGlmeSBjZXJ0YWluIHByb3BlcnRpZXMgb2YgdGhlIHJvbGUgd2l0aCB3aGljaCBpdAoraWRlbnRpZmllZCBhdCBsb2dpbiAoZS5nLiBgUEFTU1dPUkRgKQorKiB0byBtb2RpZnkgcHJvcGVydGllcyBvZiBhIHJvbGUsIHRoZSBjbGllbnQgbXVzdCBiZSBncmFudGVkIGBBTFRFUmAKK2BwZXJtaXNzaW9uIDxjcWwtcGVybWlzc2lvbnM+YCBvbiB0aGF0IHJvbGUKKworW1tkcm9wLXJvbGUtc3RhdGVtZW50XV0KKz09PSBEUk9QIFJPTEUKKworRHJvcHBpbmcgYSByb2xlIHVzZXMgdGhlIGBEUk9QIFJPTEVgIHN0YXRlbWVudDoKKworW3NvdXJjZSwgYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvZHJvcF9yb2xlX3N0YXRlbWVudC5ibmZbXQorLS0tLQorCitgRFJPUCBST0xFYCByZXF1aXJlcyB0aGUgY2xpZW50IHRvIGhhdmUgYERST1BgCitgcGVybWlzc2lvbiA8Y3FsLXBlcm1pc3Npb25zPmAgb24gdGhlIHJvbGUgaW4gcXVlc3Rpb24uIEluIGFkZGl0aW9uLAorY2xpZW50IG1heSBub3QgYERST1BgIHRoZSByb2xlIHdpdGggd2hpY2ggaXQgaWRlbnRpZmllZCBhdCBsb2dpbi4KK0ZpbmFsbHksIG9ubHkgYSBjbGllbnQgd2l0aCBgU1VQRVJVU0VSYCBzdGF0dXMgbWF5IGBEUk9QYCBhbm90aGVyCitgU1VQRVJVU0VSYCByb2xlLgorCitBdHRlbXB0aW5nIHRvIGRyb3AgYSByb2xlIHdoaWNoIGRvZXMgbm90IGV4aXN0IHJlc3VsdHMgaW4gYW4gaW52YWxpZAorcXVlcnkgY29uZGl0aW9uIHVubGVzcyB0aGUgYElGIEVYSVNUU2Agb3B0aW9uIGlzIHVzZWQuIElmIHRoZSBvcHRpb24gaXMKK3VzZWQgYW5kIHRoZSByb2xlIGRvZXMgbm90IGV4aXN0IHRoZSBzdGF0ZW1lbnQgaXMgYSBuby1vcC4KKworW05PVEVdCisuTm90ZQorPT09PQorRFJPUCBST0xFIGludGVudGlvbmFsbHkgZG9lcyBub3QgdGVybWluYXRlIGFueSBvcGVuIHVzZXIgc2Vzc2lvbnMuCitDdXJyZW50bHkgY29ubmVjdGVkIHNlc3Npb25zIHdpbGwgcmVtYWluIGNvbm5lY3RlZCBhbmQgd2lsbCByZXRhaW4gdGhlCithYmlsaXR5IHRvIHBlcmZvcm0gYW55IGRhdGFiYXNlIGFjdGlvbnMgd2hpY2ggZG8gbm90IHJlcXVpcmUKK3hyZWY6Y3FsL3NlY3VyaXR5LmFkb2MjYXV0aG9yaXphdGlvblthdXRob3JpemF0aW9uXS4gCitIb3dldmVyLCBpZiBhdXRob3JpemF0aW9uIGlzIGVuYWJsZWQsIHhyZWY6Y3FsL3NlY3VyaXR5LmFkb2MjY3FsLXBlcm1pc3Npb25zW3Blcm1pc3Npb25zXSBvZiB0aGUgZHJvcHBlZCByb2xlIGFyZSBhbHNvIHJldm9rZWQsCitzdWJqZWN0IHRvIHRoZSB4cmVmOmNxbC9zZWN1cml0eS5hZG9jI2F1dGgtY2FjaGluZ1tjYWNoaW5nIG9wdGlvbnNdIGNvbmZpZ3VyZWQgaW4geHJlZjpjcWwvY29uZmlndXJpbmcuYWRvYyNjYXNzYW5kcmEueWFtbFtjYXNzYW5kcmEteWFtbF0gZmlsZS4gCitTaG91bGQgYSBkcm9wcGVkIHJvbGUgYmUgc3Vic2VxdWVudGx5IHJlY3JlYXRlZCBhbmQgaGF2ZSBuZXcgeHJlZjpzZWN1cml0eS5hZG9jI2dyYW50LXBlcm1pc3Npb24tc3RhdGVtZW50W3Blcm1pc3Npb25zXSBvcgoreHJlZjpzZWN1cml0eS5hZG9jI2dyYW50LXJvbGUtc3RhdGVtZW50W3JvbGVzXWAgZ3JhbnRlZCB0byBpdCwgYW55IGNsaWVudCBzZXNzaW9ucyBzdGlsbAorY29ubmVjdGVkIHdpbGwgYWNxdWlyZSB0aGUgbmV3bHkgZ3JhbnRlZCBwZXJtaXNzaW9ucyBhbmQgcm9sZXMuCis9PT09CisKK1tbZ3JhbnQtcm9sZS1zdGF0ZW1lbnRdXQorPT09IEdSQU5UIFJPTEUKKworR3JhbnRpbmcgYSByb2xlIHRvIGFub3RoZXIgdXNlcyB0aGUgYEdSQU5UIFJPTEVgIHN0YXRlbWVudDoKKworW3NvdXJjZSwgYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvZ3JhbnRfcm9sZV9zdGF0ZW1lbnQuYm5mW10KKy0tLS0KKworRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvZ3JhbnRfcm9sZS5jcWxbXQorLS0tLQorCitUaGlzIHN0YXRlbWVudCBncmFudHMgdGhlIGByZXBvcnRfd3JpdGVyYCByb2xlIHRvIGBhbGljZWAuIEFueQorcGVybWlzc2lvbnMgZ3JhbnRlZCB0byBgcmVwb3J0X3dyaXRlcmAgYXJlIGFsc28gYWNxdWlyZWQgYnkgYGFsaWNlYC4KKworUm9sZXMgYXJlIG1vZGVsbGVkIGFzIGEgZGlyZWN0ZWQgYWN5Y2xpYyBncmFwaCwgc28gY2lyY3VsYXIgZ3JhbnRzIGFyZQorbm90IHBlcm1pdHRlZC4gVGhlIGZvbGxvd2luZyBleGFtcGxlcyByZXN1bHQgaW4gZXJyb3IgY29uZGl0aW9uczoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9yb2xlX2Vycm9yLmNxbFtdCistLS0tCisKK1tbcmV2b2tlLXJvbGUtc3RhdGVtZW50XV0KKz09PSBSRVZPS0UgUk9MRQorCitSZXZva2luZyBhIHJvbGUgdXNlcyB0aGUgYFJFVk9LRSBST0xFYCBzdGF0ZW1lbnQ6CisKK1tzb3VyY2UsIGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL3Jldm9rZV9yb2xlX3N0YXRlbWVudC5ibmZbXQorLS0tLQorCitGb3IgZXhhbXBsZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9yZXZva2Vfcm9sZS5jcWxbXQorLS0tLQorCitUaGlzIHN0YXRlbWVudCByZXZva2VzIHRoZSBgcmVwb3J0X3dyaXRlcmAgcm9sZSBmcm9tIGBhbGljZWAuIEFueQorcGVybWlzc2lvbnMgdGhhdCBgYWxpY2VgIGhhcyBhY3F1aXJlZCB2aWEgdGhlIGByZXBvcnRfd3JpdGVyYCByb2xlIGFyZQorYWxzbyByZXZva2VkLgorCitbW2xpc3Qtcm9sZXMtc3RhdGVtZW50XV0KKz09PSBMSVNUIFJPTEVTCisKK0FsbCB0aGUga25vd24gcm9sZXMgKGluIHRoZSBzeXN0ZW0gb3IgZ3JhbnRlZCB0byBzcGVjaWZpYyByb2xlKSBjYW4gYmUKK2xpc3RlZCB1c2luZyB0aGUgYExJU1QgUk9MRVNgIHN0YXRlbWVudDoKKworW3NvdXJjZSwgYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvbGlzdF9yb2xlc19zdGF0ZW1lbnQuYm5mW10KKy0tLS0KKworRm9yIGluc3RhbmNlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2xpc3Rfcm9sZXMuY3FsW10KKy0tLS0KKworcmV0dXJucyBhbGwga25vd24gcm9sZXMgaW4gdGhlIHN5c3RlbSwgdGhpcyByZXF1aXJlcyBgREVTQ1JJQkVgCitwZXJtaXNzaW9uIG9uIHRoZSBkYXRhYmFzZSByb2xlcyByZXNvdXJjZS4gCisKK1RoaXMgZXhhbXBsZSBlbnVtZXJhdGVzIGFsbCByb2xlcyBncmFudGVkIHRvIGBhbGljZWAsIGluY2x1ZGluZyB0aG9zZSB0cmFuc2l0aXZlbHkKK2FjcXVpcmVkOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2xpc3Rfcm9sZXNfb2YuY3FsW10KKy0tLS0KKworVGhpcyBleGFtcGxlIGxpc3RzIGFsbCByb2xlcyBkaXJlY3RseSBncmFudGVkIHRvIGBib2JgIHdpdGhvdXQgaW5jbHVkaW5nIGFueSBvZiB0aGUKK3RyYW5zaXRpdmVseSBhY3F1aXJlZCBvbmVzOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2xpc3Rfcm9sZXNfbm9ucmVjdXJzaXZlLmNxbFtdCistLS0tCisKKz09IFVzZXJzCisKK1ByaW9yIHRvIHRoZSBpbnRyb2R1Y3Rpb24gb2Ygcm9sZXMgaW4gQ2Fzc2FuZHJhIDIuMiwgYXV0aGVudGljYXRpb24gYW5kCithdXRob3JpemF0aW9uIHdlcmUgYmFzZWQgYXJvdW5kIHRoZSBjb25jZXB0IG9mIGEgYFVTRVJgLiBGb3IgYmFja3dhcmQKK2NvbXBhdGliaWxpdHksIHRoZSBsZWdhY3kgc3ludGF4IGhhcyBiZWVuIHByZXNlcnZlZCB3aXRoIGBVU0VSYCBjZW50cmljCitzdGF0ZW1lbnRzIGJlY29taW5nIHN5bm9ueW1zIGZvciB0aGUgYFJPTEVgIGJhc2VkIGVxdWl2YWxlbnRzLiBJbiBvdGhlcgord29yZHMsIGNyZWF0aW5nL3VwZGF0aW5nIGEgdXNlciBpcyBqdXN0IGEgZGlmZmVyZW50IHN5bnRheCBmb3IKK2NyZWF0aW5nL3VwZGF0aW5nIGEgcm9sZS4KKworW1tjcmVhdGUtdXNlci1zdGF0ZW1lbnRdXQorPT09IENSRUFURSBVU0VSCisKK0NyZWF0aW5nIGEgdXNlciB1c2VzIHRoZSBgQ1JFQVRFIFVTRVJgIHN0YXRlbWVudDoKKworW3NvdXJjZSwgYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvY3JlYXRlX3VzZXJfc3RhdGVtZW50LmJuZltdCistLS0tCisKK0ZvciBleGFtcGxlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2NyZWF0ZV91c2VyLmNxbFtdCistLS0tCisKK1RoZSBgQ1JFQVRFIFVTRVJgIGNvbW1hbmQgaXMgZXF1aXZhbGVudCB0byBgQ1JFQVRFIFJPTEVgIHdoZXJlIHRoZSBgTE9HSU5gIG9wdGlvbiBpcyBgdHJ1ZWAuIAorU28sIHRoZSBmb2xsb3dpbmcgcGFpcnMgb2Ygc3RhdGVtZW50cyBhcmUgZXF1aXZhbGVudDoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9jcmVhdGVfdXNlcl9yb2xlLmNxbFtdCistLS0tCisKK1tbYWx0ZXItdXNlci1zdGF0ZW1lbnRdXQorPT09IEFMVEVSIFVTRVIKKworQWx0ZXJpbmcgdGhlIG9wdGlvbnMgb2YgYSB1c2VyIHVzZXMgdGhlIGBBTFRFUiBVU0VSYCBzdGF0ZW1lbnQ6CisKK1tzb3VyY2UsIGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL2FsdGVyX3VzZXJfc3RhdGVtZW50LmJuZltdCistLS0tCitJZiB0aGUgcm9sZSBkb2VzIG5vdCBleGlzdCwgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCitGb3IgZXhhbXBsZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9hbHRlcl91c2VyLmNxbFtdCistLS0tCisKK1tbZHJvcC11c2VyLXN0YXRlbWVudF1dCis9PT0gRFJPUCBVU0VSCisKK0Ryb3BwaW5nIGEgdXNlciB1c2VzIHRoZSBgRFJPUCBVU0VSYCBzdGF0ZW1lbnQ6CisKK1tzb3VyY2UsIGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL2Ryb3BfdXNlcl9zdGF0ZW1lbnQuYm5mW10KKy0tLS0KKworW1tsaXN0LXVzZXJzLXN0YXRlbWVudF1dCis9PT0gTElTVCBVU0VSUworCitFeGlzdGluZyB1c2VycyBjYW4gYmUgbGlzdGVkIHVzaW5nIHRoZSBgTElTVCBVU0VSU2Agc3RhdGVtZW50OgorCitbc291cmNlLCBibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9saXN0X3VzZXJzX3N0YXRlbWVudC5ibmZbXQorLS0tLQorCitOb3RlIHRoYXQgdGhpcyBzdGF0ZW1lbnQgaXMgZXF1aXZhbGVudCB0byB4cmVmOnNlY3VyaXR5LmFkb2MjbGlzdC1yb2xlcy1zdGF0ZW1lbnRbYExJU1QgUk9MRVNdLCBidXQgb25seSByb2xlcyB3aXRoIHRoZSBgTE9HSU5gIHByaXZpbGVnZSBhcmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dC4KKworPT0gRGF0YSBDb250cm9sCisKK1tbY3FsLXBlcm1pc3Npb25zXV0KKz09PSBQZXJtaXNzaW9ucworCitQZXJtaXNzaW9ucyBvbiByZXNvdXJjZXMgYXJlIGdyYW50ZWQgdG8gcm9sZXM7IHRoZXJlIGFyZSBzZXZlcmFsCitkaWZmZXJlbnQgdHlwZXMgb2YgcmVzb3VyY2VzIGluIENhc3NhbmRyYSBhbmQgZWFjaCB0eXBlIGlzIG1vZGVsbGVkCitoaWVyYXJjaGljYWxseToKKworKiBUaGUgaGllcmFyY2h5IG9mIERhdGEgcmVzb3VyY2VzLCBLZXlzcGFjZXMgYW5kIFRhYmxlcyBoYXMgdGhlCitzdHJ1Y3R1cmUgYEFMTCBLRVlTUEFDRVNgIC0+IGBLRVlTUEFDRWAgLT4gYFRBQkxFYC4KKyogRnVuY3Rpb24gcmVzb3VyY2VzIGhhdmUgdGhlIHN0cnVjdHVyZSBgQUxMIEZVTkNUSU9OU2AgLT4gYEtFWVNQQUNFYCAtPgorYEZVTkNUSU9OYAorKiBSZXNvdXJjZXMgcmVwcmVzZW50aW5nIHJvbGVzIGhhdmUgdGhlIHN0cnVjdHVyZSBgQUxMIFJPTEVTYCAtPiBgUk9MRWAKKyogUmVzb3VyY2VzIHJlcHJlc2VudGluZyBKTVggT2JqZWN0TmFtZXMsIHdoaWNoIG1hcCB0byBzZXRzIG9mCitNQmVhbnMvTVhCZWFucywgaGF2ZSB0aGUgc3RydWN0dXJlIGBBTEwgTUJFQU5TYCAtPiBgTUJFQU5gCisKK1Blcm1pc3Npb25zIGNhbiBiZSBncmFudGVkIGF0IGFueSBsZXZlbCBvZiB0aGVzZSBoaWVyYXJjaGllcyBhbmQgdGhleQorZmxvdyBkb3dud2FyZHMuIFNvIGdyYW50aW5nIGEgcGVybWlzc2lvbiBvbiBhIHJlc291cmNlIGhpZ2hlciB1cCB0aGUKK2NoYWluIGF1dG9tYXRpY2FsbHkgZ3JhbnRzIHRoYXQgc2FtZSBwZXJtaXNzaW9uIG9uIGFsbCByZXNvdXJjZXMgbG93ZXIKK2Rvd24uIEZvciBleGFtcGxlLCBncmFudGluZyBgU0VMRUNUYCBvbiBhIGBLRVlTUEFDRWAgYXV0b21hdGljYWxseQorZ3JhbnRzIGl0IG9uIGFsbCBgVEFCTEVTYCBpbiB0aGF0IGBLRVlTUEFDRWAuIExpa2V3aXNlLCBncmFudGluZyBhCitwZXJtaXNzaW9uIG9uIGBBTEwgRlVOQ1RJT05TYCBncmFudHMgaXQgb24gZXZlcnkgZGVmaW5lZCBmdW5jdGlvbiwKK3JlZ2FyZGxlc3Mgb2Ygd2hpY2gga2V5c3BhY2UgaXQgaXMgc2NvcGVkIGluLiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvCitncmFudCBwZXJtaXNzaW9ucyBvbiBhbGwgZnVuY3Rpb25zIHNjb3BlZCB0byBhIHBhcnRpY3VsYXIga2V5c3BhY2UuCisKK01vZGlmaWNhdGlvbnMgdG8gcGVybWlzc2lvbnMgYXJlIHZpc2libGUgdG8gZXhpc3RpbmcgY2xpZW50IHNlc3Npb25zOwordGhhdCBpcywgY29ubmVjdGlvbnMgbmVlZCBub3QgYmUgcmUtZXN0YWJsaXNoZWQgZm9sbG93aW5nIHBlcm1pc3Npb25zCitjaGFuZ2VzLgorCitUaGUgZnVsbCBzZXQgb2YgYXZhaWxhYmxlIHBlcm1pc3Npb25zIGlzOgorCisqIGBDUkVBVEVgCisqIGBBTFRFUmAKKyogYERST1BgCisqIGBTRUxFQ1RgCisqIGBNT0RJRllgCisqIGBBVVRIT1JJWkVgCisqIGBERVNDUklCRWAKKyogYEVYRUNVVEVgCisqIGBVTk1BU0tgCisqIGBTRUxFQ1RfTUFTS0VEYAorCitOb3QgYWxsIHBlcm1pc3Npb25zIGFyZSBhcHBsaWNhYmxlIHRvIGV2ZXJ5IHR5cGUgb2YgcmVzb3VyY2UuIEZvcgoraW5zdGFuY2UsIGBFWEVDVVRFYCBpcyBvbmx5IHJlbGV2YW50IGluIHRoZSBjb250ZXh0IG9mIGZ1bmN0aW9ucyBvcgorbWJlYW5zOyBncmFudGluZyBgRVhFQ1VURWAgb24gYSByZXNvdXJjZSByZXByZXNlbnRpbmcgYSB0YWJsZSBpcworbm9uc2Vuc2ljYWwuIEF0dGVtcHRpbmcgdG8gYEdSQU5UYCBhIHBlcm1pc3Npb24gb24gcmVzb3VyY2UgdG8gd2hpY2ggaXQKK2Nhbm5vdCBiZSBhcHBsaWVkIHJlc3VsdHMgaW4gYW4gZXJyb3IgcmVzcG9uc2UuIFRoZSBmb2xsb3dpbmcKK2lsbHVzdHJhdGVzIHdoaWNoIHBlcm1pc3Npb25zIGNhbiBiZSBncmFudGVkIG9uIHdoaWNoIHR5cGVzIG9mIHJlc291cmNlLAorYW5kIHdoaWNoIHN0YXRlbWVudHMgYXJlIGVuYWJsZWQgYnkgdGhhdCBwZXJtaXNzaW9uLgorCitbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfFBlcm1pc3Npb24gfFJlc291cmNlIHxPcGVyYXRpb25zCisKK3wgYENSRUFURWAgfCBgQUxMIEtFWVNQQUNFU2AgfCBgQ1JFQVRFIEtFWVNQQUNFYCBhbmQgYENSRUFURSBUQUJMRWAgaW4gYW55IGtleXNwYWNlCisKK3wgYENSRUFURWAgfCBgS0VZU1BBQ0VgIHwgYENSRUFURSBUQUJMRWAgaW4gc3BlY2lmaWVkIGtleXNwYWNlCisKK3wgYENSRUFURWAgfCBgQUxMIEZVTkNUSU9OU2AgfCBgQ1JFQVRFIEZVTkNUSU9OYCBpbiBhbnkga2V5c3BhY2UgYW5kIGBDUkVBVEUgQUdHUkVHQVRFYCBpbiBhbnkga2V5c3BhY2UKKworfCBgQ1JFQVRFYCB8IGBBTEwgRlVOQ1RJT05TIElOIEtFWVNQQUNFYCB8IGBDUkVBVEUgRlVOQ1RJT05gIGFuZCBgQ1JFQVRFIEFHR1JFR0FURWAgaW4gc3BlY2lmaWVkIGtleXNwYWNlCisKK3wgYENSRUFURWAgfCBgQUxMIFJPTEVTYCB8IGBDUkVBVEUgUk9MRWAKKworfCBgQUxURVJgIHwgYEFMTCBLRVlTUEFDRVNgIHwgYEFMVEVSIEtFWVNQQUNFYCBhbmQgYEFMVEVSIFRBQkxFYCBpbiBhbnkga2V5c3BhY2UKKworfCBgQUxURVJgIHwgYEtFWVNQQUNFYCB8IGBBTFRFUiBLRVlTUEFDRWAgYW5kIGBBTFRFUiBUQUJMRWAgaW4gc3BlY2lmaWVkIGtleXNwYWNlIAorCit8IGBBTFRFUmAgfCBgVEFCTEVgIHwgYEFMVEVSIFRBQkxFYAorCit8IGBBTFRFUmAgfCBgQUxMIEZVTkNUSU9OU2AgfCBgQ1JFQVRFIEZVTkNUSU9OYCBhbmQgYENSRUFURSBBR0dSRUdBVEVgOiByZXBsYWNpbmcgYW55IGV4aXN0aW5nCisKK3wgYEFMVEVSYCB8IGBBTEwgRlVOQ1RJT05TIElOIEtFWVNQQUNFYCB8IGBDUkVBVEUgRlVOQ1RJT05gIGFuZCBgQ1JFQVRFIEFHR1JFR0FURWA6IHJlcGxhY2luZyBleGlzdGluZyBpbiBzcGVjaWZpZWQga2V5c3BhY2UKKworfCBgQUxURVJgIHwgYEZVTkNUSU9OYCB8IGBDUkVBVEUgRlVOQ1RJT05gIGFuZCBgQ1JFQVRFIEFHR1JFR0FURWA6IHJlcGxhY2luZyBleGlzdGluZworCit8IGBBTFRFUmAgfCBgQUxMIFJPTEVTYCB8IGBBTFRFUiBST0xFYCBvbiBhbnkgcm9sZQorCit8IGBBTFRFUmAgfCBgUk9MRWAgfCBgQUxURVIgUk9MRWAKKworfCBgRFJPUGAgfCBgQUxMIEtFWVNQQUNFU2AgfCBgRFJPUCBLRVlTUEFDRWAgYW5kIGBEUk9QIFRBQkxFYCBpbiBhbnkga2V5c3BhY2UKKworfCBgRFJPUGAgfCBgS0VZU1BBQ0VgIHwgYERST1AgVEFCTEVgIGluIHNwZWNpZmllZCBrZXlzcGFjZQorCit8IGBEUk9QYCB8IGBUQUJMRWAgfCBgRFJPUCBUQUJMRWAKKworfCBgRFJPUGAgfCBgQUxMIEZVTkNUSU9OU2AgfCBgRFJPUCBGVU5DVElPTmAgYW5kIGBEUk9QIEFHR1JFR0FURWAgaW4gYW55IGtleXNwYWNlCisKK3wgYERST1BgIHwgYEFMTCBGVU5DVElPTlMgSU4gS0VZU1BBQ0VgIHwgYERST1AgRlVOQ1RJT05gIGFuZCBgRFJPUCBBR0dSRUdBVEVgIGluIHNwZWNpZmllZCBrZXlzcGFjZQorCit8IGBEUk9QYCB8IGBGVU5DVElPTmAgfCBgRFJPUCBGVU5DVElPTmAKKworfCBgRFJPUGAgfCBgQUxMIFJPTEVTYCB8IGBEUk9QIFJPTEVgIG9uIGFueSByb2xlCisKK3wgYERST1BgIHwgYFJPTEVgIHwgYERST1AgUk9MRWAKKworfCBgU0VMRUNUYCB8IGBBTEwgS0VZU1BBQ0VTYCB8IGBTRUxFQ1RgIG9uIGFueSB0YWJsZQorCit8IGBTRUxFQ1RgIHwgYEtFWVNQQUNFYCB8IGBTRUxFQ1RgIG9uIGFueSB0YWJsZSBpbiBzcGVjaWZpZWQga2V5c3BhY2UKKworfCBgU0VMRUNUYCB8IGBUQUJMRWAgfCBgU0VMRUNUYCBvbiBzcGVjaWZpZWQgdGFibGUKKworfCBgU0VMRUNUYCB8IGBBTEwgTUJFQU5TYCB8IENhbGwgZ2V0dGVyIG1ldGhvZHMgb24gYW55IG1iZWFuCisKK3wgYFNFTEVDVGAgfCBgTUJFQU5TYCB8IENhbGwgZ2V0dGVyIG1ldGhvZHMgb24gYW55IG1iZWFuIG1hdGNoaW5nIGEgd2lsZGNhcmQgcGF0dGVybiAKKworfCBgU0VMRUNUYCB8IGBNQkVBTmAgfCBDYWxsIGdldHRlciBtZXRob2RzIG9uIG5hbWVkIG1iZWFuCisKK3wgYE1PRElGWWAgfCBgQUxMIEtFWVNQQUNFU2AgfCBgSU5TRVJUYCwgYFVQREFURWAsIGBERUxFVEVgIGFuZCBgVFJVTkNBVEVgIG9uIGFueSB0YWJsZQorCit8IGBNT0RJRllgIHwgYEtFWVNQQUNFYCB8IGBJTlNFUlRgLCBgVVBEQVRFYCwgYERFTEVURWAgYW5kIGBUUlVOQ0FURWAgb24gYW55IHRhYmxlIGluIHNwZWNpZmllZAora2V5c3BhY2UKKworfCBgTU9ESUZZYCB8IGBUQUJMRWAgfCBgSU5TRVJUYCwgYFVQREFURWAsIGBERUxFVEVgIGFuZCBgVFJVTkNBVEVgIG9uIHNwZWNpZmllZCB0YWJsZQorCit8IGBNT0RJRllgIHwgYEFMTCBNQkVBTlNgIHwgQ2FsbCBzZXR0ZXIgbWV0aG9kcyBvbiBhbnkgbWJlYW4KKworfCBgTU9ESUZZYCB8IGBNQkVBTlNgIHwgQ2FsbCBzZXR0ZXIgbWV0aG9kcyBvbiBhbnkgbWJlYW4gbWF0Y2hpbmcgYSB3aWxkY2FyZCBwYXR0ZXJuCisKK3wgYE1PRElGWWAgfCBgTUJFQU5gIHwgQ2FsbCBzZXR0ZXIgbWV0aG9kcyBvbiBuYW1lZCBtYmVhbgorCit8IGBBVVRIT1JJWkVgIHwgYEFMTCBLRVlTUEFDRVNgIHwgYEdSQU5UIFBFUk1JU1NJT05gIGFuZCBgUkVWT0tFIFBFUk1JU1NJT05gIG9uIGFueSB0YWJsZQorCit8IGBBVVRIT1JJWkVgIHwgYEtFWVNQQUNFYCB8IGBHUkFOVCBQRVJNSVNTSU9OYCBhbmQgYFJFVk9LRSBQRVJNSVNTSU9OYCBvbiBhbnkgdGFibGUgaW4gc3BlY2lmaWVkIGtleXNwYWNlCisKK3wgYEFVVEhPUklaRWAgfCBgVEFCTEVgIHwgYEdSQU5UIFBFUk1JU1NJT05gIGFuZCBgUkVWT0tFIFBFUk1JU1NJT05gIG9uIHNwZWNpZmllZCB0YWJsZQorCit8IGBBVVRIT1JJWkVgIHwgYEFMTCBGVU5DVElPTlNgIHwgYEdSQU5UIFBFUk1JU1NJT05gIGFuZCBgUkVWT0tFIFBFUk1JU1NJT05gIG9uIGFueSBmdW5jdGlvbgorCit8IGBBVVRIT1JJWkVgIHwgYEFMTCBGVU5DVElPTlMgSU4gS0VZU1BBQ0VgIHwgYEdSQU5UIFBFUk1JU1NJT05gIGFuZCBgUkVWT0tFIFBFUk1JU1NJT05gIGluIHNwZWNpZmllZCBrZXlzcGFjZQorCit8IGBBVVRIT1JJWkVgIHwgYEZVTkNUSU9OYCB8IGBHUkFOVCBQRVJNSVNTSU9OYCBhbmQgYFJFVk9LRSBQRVJNSVNTSU9OYCBvbiBzcGVjaWZpZWQgZnVuY3Rpb24KKworfCBgQVVUSE9SSVpFYCB8IGBBTEwgTUJFQU5TYCB8IGBHUkFOVCBQRVJNSVNTSU9OYCBhbmQgYFJFVk9LRSBQRVJNSVNTSU9OYCBvbiBhbnkgbWJlYW4KKworfCBgQVVUSE9SSVpFYCB8IGBNQkVBTlNgIHwgYEdSQU5UIFBFUk1JU1NJT05gIGFuZCBgUkVWT0tFIFBFUk1JU1NJT05gIG9uIGFueSBtYmVhbiBtYXRjaGluZyBhIHdpbGRjYXJkIHBhdHRlcm4KKworfCBgQVVUSE9SSVpFYCB8IGBNQkVBTmAgfCBgR1JBTlQgUEVSTUlTU0lPTmAgYW5kIGBSRVZPS0UgUEVSTUlTU0lPTmAgb24gbmFtZWQgbWJlYW4KKworfCBgQVVUSE9SSVpFYCB8IGBBTEwgUk9MRVNgIHwgYEdSQU5UIFJPTEVgIGFuZCBgUkVWT0tFIFJPTEVgIG9uIGFueSByb2xlCisKK3wgYEFVVEhPUklaRWAgfCBgUk9MRVNgIHwgYEdSQU5UIFJPTEVgIGFuZCBgUkVWT0tFIFJPTEVgIG9uIHNwZWNpZmllZCByb2xlcworCit8IGBERVNDUklCRWAgfCBgQUxMIFJPTEVTYCB8IGBMSVNUIFJPTEVTYCBvbiBhbGwgcm9sZXMgb3Igb25seSByb2xlcyBncmFudGVkIHRvIGFub3RoZXIsIHNwZWNpZmllZCByb2xlCisKK3wgYERFU0NSSUJFYCB8IGBBTEwgTUJFQU5TYCB8IFJldHJpZXZlIG1ldGFkYXRhIGFib3V0IGFueSBtYmVhbiBmcm9tIHRoZSBwbGF0Zm9ybSdzIE1CZWFuU2VydmVyCisKKworfCBgREVTQ1JJQkVgIHwgYE1CRUFOU2AgfCBSZXRyaWV2ZSBtZXRhZGF0YSBhYm91dCBhbnkgbWJlYW4gbWF0Y2hpbmcgYSB3aWxkY2FyZCBwYXR0ZXIgZnJvbSB0aGUKK3BsYXRmb3JtJ3MgTUJlYW5TZXJ2ZXIKKworfCBgREVTQ1JJQkVgIHwgYE1CRUFOYCB8IFJldHJpZXZlIG1ldGFkYXRhIGFib3V0IGEgbmFtZWQgbWJlYW4gZnJvbSB0aGUgcGxhdGZvcm0ncyBNQmVhblNlcnZlcgorCit8IGBFWEVDVVRFYCB8IGBBTEwgRlVOQ1RJT05TYCB8IGBTRUxFQ1RgLCBgSU5TRVJUYCBhbmQgYFVQREFURWAgdXNpbmcgYW55IGZ1bmN0aW9uLCBhbmQgdXNlIG9mIGFueQorZnVuY3Rpb24gaW4gYENSRUFURSBBR0dSRUdBVEVgCisKK3wgYEVYRUNVVEVgIHwgYEFMTCBGVU5DVElPTlMgSU4gS0VZU1BBQ0VgIHwgYFNFTEVDVGAsIGBJTlNFUlRgIGFuZCBgVVBEQVRFYCB1c2luZyBhbnkgZnVuY3Rpb24gaW4gc3BlY2lmaWVkIGtleXNwYWNlCithbmQgdXNlIG9mIGFueSBmdW5jdGlvbiBpbiBrZXlzcGFjZSBpbiBgQ1JFQVRFIEFHR1JFR0FURWAKKworfCBgRVhFQ1VURWAgfCBgRlVOQ1RJT05gIHwgYFNFTEVDVGAsIGBJTlNFUlRgIGFuZCBgVVBEQVRFYCB1c2luZyBzcGVjaWZpZWQgZnVuY3Rpb24gYW5kIHVzZSBvZiB0aGUgZnVuY3Rpb24gaW4gYENSRUFURSBBR0dSRUdBVEVgCisKK3wgYEVYRUNVVEVgIHwgYEFMTCBNQkVBTlNgIHwgRXhlY3V0ZSBvcGVyYXRpb25zIG9uIGFueSBtYmVhbgorCit8IGBFWEVDVVRFYCB8IGBNQkVBTlNgIHwgRXhlY3V0ZSBvcGVyYXRpb25zIG9uIGFueSBtYmVhbiBtYXRjaGluZyBhIHdpbGRjYXJkIHBhdHRlcm4KKworfCBgRVhFQ1VURWAgfCBgTUJFQU5gIHwgRXhlY3V0ZSBvcGVyYXRpb25zIG9uIG5hbWVkIG1iZWFuCisKK3xgVU5NQVNLYCB8YEFMTCBLRVlTUEFDRVNgIHwgU2VlIHRoZSBjbGVhciBjb250ZW50cyBvZiBtYXNrZWQgY29sdW1ucyBvbiBhbnkgdGFibGUKKworfGBVTk1BU0tgIHxgS0VZU1BBQ0VgIHwgU2VlIHRoZSBjbGVhciBjb250ZW50cyBvZiBtYXNrZWQgY29sdW1ucyBvbiBhbnkgdGFibGUgaW4ga2V5c3BhY2UKKworfGBVTk1BU0tgIHxgVEFCTEVgIHwgU2VlIHRoZSBjbGVhciBjb250ZW50cyBvZiBtYXNrZWQgY29sdW1ucyBvbiB0aGUgc3BlY2lmaWVkIHRhYmxlCisKK3xgU0VMRUNUX01BU0tFRGAgfCBgQUxMIEtFWVNQQUNFU2AgfCBgU0VMRUNUYCByZXN0cmljdGluZyBtYXNrZWQgY29sdW1ucyBvbiBhbnkgdGFibGUKKworfGBTRUxFQ1RfTUFTS0VEYCB8IGBLRVlTUEFDRWAgfCBgU0VMRUNUYCByZXN0cmljdGluZyBtYXNrZWQgY29sdW1ucyBvbiBhbnkgdGFibGUgaW4gc3BlY2lmaWVkIGtleXNwYWNlCisKK3xgU0VMRUNUX01BU0tFRGAgfCBgVEFCTEVgIHwgYFNFTEVDVGAgcmVzdHJpY3RpbmcgbWFza2VkIGNvbHVtbnMgb24gdGhlIHNwZWNpZmllZCB0YWJsZQorfD09PQorCitbW2dyYW50LXBlcm1pc3Npb24tc3RhdGVtZW50XV0KKz09PSBHUkFOVCBQRVJNSVNTSU9OCisKK0dyYW50aW5nIGEgcGVybWlzc2lvbiB1c2VzIHRoZSBgR1JBTlQgUEVSTUlTU0lPTmAgc3RhdGVtZW50OgorCitbc291cmNlLCBibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9ncmFudF9wZXJtaXNzaW9uX3N0YXRlbWVudC5ibmZbXQorLS0tLQorCitGb3IgZXhhbXBsZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9ncmFudF9wZXJtLmNxbFtdCistLS0tCisKK1RoaXMgZXhhbXBsZSBnaXZlcyBhbnkgdXNlciB3aXRoIHRoZSByb2xlIGBkYXRhX3JlYWRlcmAgcGVybWlzc2lvbiB0byBleGVjdXRlCitgU0VMRUNUYCBzdGF0ZW1lbnRzIG9uIGFueSB0YWJsZSBhY3Jvc3MgYWxsIGtleXNwYWNlczoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9ncmFudF9tb2RpZnkuY3FsW10KKy0tLS0KKworVG8gZ2l2ZSBhbnkgdXNlciB3aXRoIHRoZSByb2xlIGBkYXRhX3dyaXRlcmAgcGVybWlzc2lvbiB0byBwZXJmb3JtCitgVVBEQVRFYCwgYElOU0VSVGAsIGBVUERBVEVgLCBgREVMRVRFYCBhbmQgYFRSVU5DQVRFYCBxdWVyaWVzIG9uIGFsbAordGFibGVzIGluIHRoZSBga2V5c3BhY2UxYCBrZXlzcGFjZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9ncmFudF9kcm9wLmNxbFtdCistLS0tCisKK1RvIGdpdmUgYW55IHVzZXIgd2l0aCB0aGUgYHNjaGVtYV9vd25lcmAgcm9sZSBwZXJtaXNzaW9ucyB0byBgRFJPUGAgYSBzcGVjaWZpYworYGtleXNwYWNlMS50YWJsZTFgOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2dyYW50X2V4ZWN1dGUuY3FsW10KKy0tLS0KKworVGhpcyBjb21tYW5kIGdyYW50cyBhbnkgdXNlciB3aXRoIHRoZSBgcmVwb3J0X3dyaXRlcmAgcm9sZSBwZXJtaXNzaW9uIHRvIGV4ZWN1dGUKK2BTRUxFQ1RgLCBgSU5TRVJUYCBhbmQgYFVQREFURWAgcXVlcmllcyB3aGljaCB1c2UgdGhlIGZ1bmN0aW9uCitga2V5c3BhY2UxLnVzZXJfZnVuY3Rpb24oIGludCApYDoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9ncmFudF9kZXNjcmliZS5jcWxbXQorLS0tLQorCitUaGlzIGdyYW50cyBhbnkgdXNlciB3aXRoIHRoZSBgcm9sZV9hZG1pbmAgcm9sZSBwZXJtaXNzaW9uIHRvIHZpZXcgYW55CithbmQgYWxsIHJvbGVzIGluIHRoZSBzeXN0ZW0gd2l0aCBhIGBMSVNUIFJPTEVTYCBzdGF0ZW1lbnQuCisKKz09PT0gR1JBTlQgQUxMCisKK1doZW4gdGhlIGBHUkFOVCBBTExgIGZvcm0gaXMgdXNlZCwgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBwZXJtaXNzaW9ucyBpcworZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHRoZSB0YXJnZXQgcmVzb3VyY2UuCisKKz09PT0gQXV0b21hdGljIEdyYW50aW5nCisKK1doZW4gYSByZXNvdXJjZSBpcyBjcmVhdGVkLCB2aWEgYSBgQ1JFQVRFIEtFWVNQQUNFYCwgYENSRUFURSBUQUJMRWAsCitgQ1JFQVRFIEZVTkNUSU9OYCwgYENSRUFURSBBR0dSRUdBVEVgIG9yIGBDUkVBVEUgUk9MRWAgc3RhdGVtZW50LCB0aGUKK2NyZWF0b3IgKHRoZSByb2xlIHRoZSBkYXRhYmFzZSB1c2VyIHdobyBpc3N1ZXMgdGhlIHN0YXRlbWVudCBpcworaWRlbnRpZmllZCBhcyksIGlzIGF1dG9tYXRpY2FsbHkgZ3JhbnRlZCBhbGwgYXBwbGljYWJsZSBwZXJtaXNzaW9ucyBvbgordGhlIG5ldyByZXNvdXJjZS4KKworW1tyZXZva2UtcGVybWlzc2lvbi1zdGF0ZW1lbnRdXQorPT09IFJFVk9LRSBQRVJNSVNTSU9OCisKK1Jldm9raW5nIGEgcGVybWlzc2lvbiBmcm9tIGEgcm9sZSB1c2VzIHRoZSBgUkVWT0tFIFBFUk1JU1NJT05gCitzdGF0ZW1lbnQ6CisKK1tzb3VyY2UsIGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL3Jldm9rZV9wZXJtaXNzaW9uX3N0YXRlbWVudC5ibmZbXQorLS0tLQorCitGb3IgZXhhbXBsZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9yZXZva2VfcGVybS5jcWxbXQorLS0tLQorCitCZWNhdXNlIG9mIHRoZWlyIGZ1bmN0aW9uIGluIG5vcm1hbCBkcml2ZXIgb3BlcmF0aW9ucywgY2VydGFpbiB0YWJsZXMKK2Nhbm5vdCBoYXZlIHRoZWlyIGBTRUxFQ1RgIHBlcm1pc3Npb25zIHJldm9rZWQuIFRoZQorZm9sbG93aW5nIHRhYmxlcyB3aWxsIGJlIGF2YWlsYWJsZSB0byBhbGwgYXV0aG9yaXplZCB1c2VycyByZWdhcmRsZXNzIG9mCit0aGVpciBhc3NpZ25lZCByb2xlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML25vX3Jldm9rZS5jcWxbXQorLS0tLQorCitbW2xpc3QtcGVybWlzc2lvbnMtc3RhdGVtZW50XV0KKz09PSBMSVNUIFBFUk1JU1NJT05TCisKK0xpc3RpbmcgZ3JhbnRlZCBwZXJtaXNzaW9ucyB1c2VzIHRoZSBgTElTVCBQRVJNSVNTSU9OU2Agc3RhdGVtZW50OgorCitbc291cmNlLCBibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9saXN0X3Blcm1pc3Npb25zX3N0YXRlbWVudC5ibmZbXQorLS0tLQorCitGb3IgZXhhbXBsZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9saXN0X3Blcm0uY3FsW10KKy0tLS0KKworU2hvdyBhbGwgcGVybWlzc2lvbnMgZ3JhbnRlZCB0byBgYWxpY2VgLCBpbmNsdWRpbmcgdGhvc2UgYWNxdWlyZWQKK3RyYW5zaXRpdmVseSBmcm9tIGFueSBvdGhlciByb2xlczoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9saXN0X2FsbF9wZXJtLmNxbFtdCistLS0tCisKK1Nob3cgYWxsIHBlcm1pc3Npb25zIG9uIGBrZXlzcGFjZTEudGFibGUxYCBncmFudGVkIHRvIGBib2JgLCBpbmNsdWRpbmcKK3Rob3NlIGFjcXVpcmVkIHRyYW5zaXRpdmVseSBmcm9tIGFueSBvdGhlciByb2xlcy4gVGhpcyBhbHNvIGluY2x1ZGVzIGFueQorcGVybWlzc2lvbnMgaGlnaGVyIHVwIHRoZSByZXNvdXJjZSBoaWVyYXJjaHkgd2hpY2ggY2FuIGJlIGFwcGxpZWQgdG8KK2BrZXlzcGFjZTEudGFibGUxYC4gRm9yIGV4YW1wbGUsIHNob3VsZCBgYm9iYCBoYXZlIGBBTFRFUmAgcGVybWlzc2lvbiBvbgorYGtleXNwYWNlMWAsIHRoYXQgd291bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdHMgb2YgdGhpcyBxdWVyeS4gQWRkaW5nCit0aGUgYE5PUkVDVVJTSVZFYCBzd2l0Y2ggcmVzdHJpY3RzIHRoZSByZXN1bHRzIHRvIG9ubHkgdGhvc2UgcGVybWlzc2lvbnMKK3doaWNoIHdlcmUgZGlyZWN0bHkgZ3JhbnRlZCB0byBgYm9iYCBvciBvbmUgb2YgYGJvYmAncyByb2xlczoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9saXN0X3NlbGVjdF9wZXJtLmNxbFtdCistLS0tCisKK1Nob3cgYW55IHBlcm1pc3Npb25zIGdyYW50ZWQgdG8gYGNhcmxvc2Agb3IgYW55IG9mIGBjYXJsb3NgJ3Mgcm9sZXMsCitsaW1pdGVkIHRvIGBTRUxFQ1RgIHBlcm1pc3Npb25zIG9uIGFueSByZXNvdXJjZS4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvdHJpZ2dlcnMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC90cmlnZ2Vycy5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL3RyaWdnZXJzLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC90cmlnZ2Vycy5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvdHlwZXMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC90eXBlcy5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxN2RjMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvdHlwZXMuYWRvYwpAQCAtMCwwICsxLDUzOCBAQAorPSBEYXRhIFR5cGVzCisKK0NRTCBpcyBhIHR5cGVkIGxhbmd1YWdlIGFuZCBzdXBwb3J0cyBhIHJpY2ggc2V0IG9mIGRhdGEgdHlwZXMsIGluY2x1ZGluZworeHJlZjpjcWwvdHlwZXMuYWRvYyNuYXRpdmUtdHlwZXNbbmF0aXZlIHR5cGVzXSwgeHJlZjpjcWwvdHlwZXMuYWRvYyNjb2xsZWN0aW9uc1tjb2xsZWN0aW9uIHR5cGVzXSwKK3hyZWY6Y3FsL3R5cGVzLmFkb2MjdWR0c1t1c2VyLWRlZmluZWQgdHlwZXNdLCB4cmVmOmNxbC90eXBlcy5hZG9jI3R1cGxlc1t0dXBsZSB0eXBlc10sIGFuZCB4cmVmOmNxbC90eXBlcy5hZG9jI2N1c3RvbS10eXBlc1tjdXN0b20KK3R5cGVzXToKKworW3NvdXJjZSwgYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvY3FsX3R5cGUuYm5mW10KKy0tLS0KKworPT0gTmF0aXZlIHR5cGVzCisKK1RoZSBuYXRpdmUgdHlwZXMgc3VwcG9ydGVkIGJ5IENRTCBhcmU6CisKK1tzb3VyY2UsIGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL25hdGl2ZV90eXBlLmJuZltdCistLS0tCisKK1RoZSBmb2xsb3dpbmcgdGFibGUgZ2l2ZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbnMgb24gdGhlIG5hdGl2ZSBkYXRhCit0eXBlcywgYW5kIG9uIHdoaWNoIGtpbmQgb2YgeHJlZjpjcWwvZGVmaW5pdGlvbnMuYWRvYyNjb25zdGFudHNbY29uc3RhbnRzXSBlYWNoIHR5cGUgc3VwcG9ydHM6CisKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8IFR5cGUgfCBDb25zdGFudHMgc3VwcG9ydGVkIHwgRGVzY3JpcHRpb24KKworfCBgYXNjaWlgIHwgYHN0cmluZ2AgfCBBU0NJSSBjaGFyYWN0ZXIgc3RyaW5nCit8IGBiaWdpbnRgIHwgYGludGVnZXJgIHwgNjQtYml0IHNpZ25lZCBsb25nCit8IGBibG9iYCB8IGBibG9iYCB8IEFyYml0cmFyeSBieXRlcyAobm8gdmFsaWRhdGlvbikKK3wgYGJvb2xlYW5gIHwgYGJvb2xlYW5gIHwgRWl0aGVyIGB0cnVlYCBvciBgZmFsc2VgIAorfCBgY291bnRlcmAgfCBgaW50ZWdlcmAgfCBDb3VudGVyIGNvbHVtbiAoNjQtYml0IHNpZ25lZCB2YWx1ZSkuIFNlZSBgY291bnRlcnNgIGZvciBkZXRhaWxzLgorfCBgZGF0ZWAgfCBgaW50ZWdlcmAsIGBzdHJpbmdgIHwgQSBkYXRlICh3aXRoIG5vIGNvcnJlc3BvbmRpbmcgdGltZSB2YWx1ZSkuIFNlZSBgZGF0ZXNgIGJlbG93IGZvciBkZXRhaWxzLgorfCBgZGVjaW1hbGAgfCBgaW50ZWdlcmAsIGBmbG9hdGAgfCBWYXJpYWJsZS1wcmVjaXNpb24gZGVjaW1hbAorfCBgZG91YmxlYCB8IGBpbnRlZ2VyYCBgZmxvYXRgIHwgNjQtYml0IElFRUUtNzU0IGZsb2F0aW5nIHBvaW50Cit8IGBkdXJhdGlvbmAgfCBgZHVyYXRpb25gLCB8IEEgZHVyYXRpb24gd2l0aCBuYW5vc2Vjb25kIHByZWNpc2lvbi4gU2VlIGBkdXJhdGlvbnNgIGJlbG93IGZvciBkZXRhaWxzLgorfCBgZmxvYXRgIHwgYGludGVnZXJgLCBgZmxvYXRgIHwgMzItYml0IElFRUUtNzU0IGZsb2F0aW5nIHBvaW50Cit8IGBpbmV0YCB8IGBzdHJpbmdgIHwgQW4gSVAgYWRkcmVzcywgZWl0aGVyIElQdjQgKDQgYnl0ZXMgbG9uZykgb3IgSVB2NiAoMTYgYnl0ZXMgbG9uZykuIE5vdGUKK3RoYXQgdGhlcmUgaXMgbm8gYGluZXRgIGNvbnN0YW50LCBJUCBhZGRyZXNzIHNob3VsZCBiZSBpbnB1dCBhcyBzdHJpbmdzLgorfCBgaW50YCB8IGBpbnRlZ2VyYCB8IDMyLWJpdCBzaWduZWQgaW50Cit8IGBzbWFsbGludGAgfCBgaW50ZWdlcmAgfCAxNi1iaXQgc2lnbmVkIGludAorfCBgdGV4dGAgfCBgc3RyaW5nYCB8IFVURjggZW5jb2RlZCBzdHJpbmcKK3wgYHRpbWVgIHwgYGludGVnZXJgLCBgc3RyaW5nYCB8IEEgdGltZSAod2l0aCBubyBjb3JyZXNwb25kaW5nIGRhdGUgdmFsdWUpIHdpdGggbmFub3NlY29uZCBwcmVjaXNpb24uIFNlZQorYHRpbWVzYCBiZWxvdyBmb3IgZGV0YWlscy4KK3wgYHRpbWVzdGFtcGAgfCBgaW50ZWdlcmAsIGBzdHJpbmdgIHwgQSB0aW1lc3RhbXAgKGRhdGUgYW5kIHRpbWUpIHdpdGggbWlsbGlzZWNvbmQgcHJlY2lzaW9uLiBTZWUgYHRpbWVzdGFtcHNgCitiZWxvdyBmb3IgZGV0YWlscy4KK3wgYHRpbWV1dWlkYCB8IGB1dWlkYCB8IFZlcnNpb24gMSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vbml2ZXJzYWxseV91bmlxdWVfaWRlbnRpZmllcltVVUlEXSwKK2dlbmVyYWxseSB1c2VkIGFzIGEg4oCcY29uZmxpY3QtZnJlZeKAnSB0aW1lc3RhbXAuIEFsc28gc2VlIGB0aW1ldXVpZC1mdW5jdGlvbnNgLgorfCBgdGlueWludGAgfCBgaW50ZWdlcmAgfCA4LWJpdCBzaWduZWQgaW50Cit8IGB1dWlkYCB8IGB1dWlkYCB8IEEgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pdmVyc2FsbHlfdW5pcXVlX2lkZW50aWZpZXJbVVVJRF0gKG9mIGFueSB2ZXJzaW9uKQorfCBgdmFyY2hhcmAgfCBgc3RyaW5nYCB8IFVURjggZW5jb2RlZCBzdHJpbmcKK3wgYHZhcmludGAgfCBgaW50ZWdlcmAgfCBBcmJpdHJhcnktcHJlY2lzaW9uIGludGVnZXIKK3w9PT0KKworPT09IENvdW50ZXJzCisKK1RoZSBgY291bnRlcmAgdHlwZSBpcyB1c2VkIHRvIGRlZmluZSBfY291bnRlciBjb2x1bW5zXy4gQSBjb3VudGVyIGNvbHVtbgoraXMgYSBjb2x1bW4gd2hvc2UgdmFsdWUgaXMgYSA2NC1iaXQgc2lnbmVkIGludGVnZXIgYW5kIG9uIHdoaWNoIDIKK29wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZDogaW5jcmVtZW50aW5nIGFuZCBkZWNyZW1lbnRpbmcgKHNlZSB0aGUKK3hyZWY6Y3FsL2RtbC5hZG9jI3VwZGF0ZS1zdGF0ZW1lbnRbVVBEQVRFXSBzdGF0ZW1lbnQgZm9yIHN5bnRheCkuIAorTm90ZSB0aGF0IHRoZSB2YWx1ZSBvZiBhIGNvdW50ZXIgY2Fubm90CitiZSBzZXQ6IGEgY291bnRlciBkb2VzIG5vdCBleGlzdCB1bnRpbCBmaXJzdCBpbmNyZW1lbnRlZC9kZWNyZW1lbnRlZCwKK2FuZCB0aGF0IGZpcnN0IGluY3JlbWVudC9kZWNyZW1lbnQgaXMgbWFkZSBhcyBpZiB0aGUgcHJpb3IgdmFsdWUgd2FzIDAuCisKK1tbY291bnRlci1saW1pdGF0aW9uc11dCitDb3VudGVycyBoYXZlIGEgbnVtYmVyIG9mIGltcG9ydGFudCBsaW1pdGF0aW9uczoKKworKiBUaGV5IGNhbm5vdCBiZSB1c2VkIGZvciBjb2x1bW5zIHBhcnQgb2YgdGhlIGBQUklNQVJZIEtFWWAgb2YgYSB0YWJsZS4KKyogQSB0YWJsZSB0aGF0IGNvbnRhaW5zIGEgY291bnRlciBjYW4gb25seSBjb250YWluIGNvdW50ZXJzLiBJbiBvdGhlcgord29yZHMsIGVpdGhlciBhbGwgdGhlIGNvbHVtbnMgb2YgYSB0YWJsZSBvdXRzaWRlIHRoZSBgUFJJTUFSWSBLRVlgIGhhdmUKK3RoZSBgY291bnRlcmAgdHlwZSwgb3Igbm9uZSBvZiB0aGVtIGhhdmUgaXQuCisqIENvdW50ZXJzIGRvIG5vdCBzdXBwb3J0IHhyZWY6Y3FsL2RtbC5hZG9jI3dyaXRldGltZS1hbmQtdHRsLWZ1bmN0aW9uW2V4cGlyYXRpb25dLgorKiBUaGUgZGVsZXRpb24gb2YgY291bnRlcnMgaXMgc3VwcG9ydGVkLCBidXQgaXMgb25seSBndWFyYW50ZWVkIHRvIHdvcmsKK3RoZSBmaXJzdCB0aW1lIHlvdSBkZWxldGUgYSBjb3VudGVyLiBJbiBvdGhlciB3b3JkcywgeW91IHNob3VsZCBub3QKK3JlLXVwZGF0ZSBhIGNvdW50ZXIgdGhhdCB5b3UgaGF2ZSBkZWxldGVkIChpZiB5b3UgZG8sIHByb3BlciBiZWhhdmlvciBpcworbm90IGd1YXJhbnRlZWQpLgorKiBDb3VudGVyIHVwZGF0ZXMgYXJlLCBieSBuYXR1cmUsIG5vdAoraHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSWRlbXBvdGVuY2VbaWRlbXB0b3RlbnRdLiBBbiBpbXBvcnRhbnQKK2NvbnNlcXVlbmNlIGlzIHRoYXQgaWYgYSBjb3VudGVyIHVwZGF0ZSBmYWlscyB1bmV4cGVjdGVkbHkgKHRpbWVvdXQgb3IKK2xvc3Mgb2YgY29ubmVjdGlvbiB0byB0aGUgY29vcmRpbmF0b3Igbm9kZSksIHRoZSBjbGllbnQgaGFzIG5vIHdheSB0bwora25vdyBpZiB0aGUgdXBkYXRlIGhhcyBiZWVuIGFwcGxpZWQgb3Igbm90LiBJbiBwYXJ0aWN1bGFyLCByZXBsYXlpbmcgdGhlCit1cGRhdGUgbWF5IG9yIG1heSBub3QgbGVhZCB0byBhbiBvdmVyIGNvdW50LgorCitbW3RpbWVzdGFtcHNdXQorPT0gV29ya2luZyB3aXRoIHRpbWVzdGFtcHMKKworVmFsdWVzIG9mIHRoZSBgdGltZXN0YW1wYCB0eXBlIGFyZSBlbmNvZGVkIGFzIDY0LWJpdCBzaWduZWQgaW50ZWdlcnMKK3JlcHJlc2VudGluZyBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIHN0YW5kYXJkIGJhc2UgdGltZSBrbm93bgorYXMgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5peF90aW1lW3RoZSBlcG9jaF06IEphbnVhcnkgMSAxOTcwIGF0CiswMDowMDowMCBHTVQuCisKK1RpbWVzdGFtcHMgY2FuIGJlIGlucHV0IGluIENRTCBlaXRoZXIgdXNpbmcgdGhlaXIgdmFsdWUgYXMgYW4gYGludGVnZXJgLAorb3IgdXNpbmcgYSBgc3RyaW5nYCB0aGF0IHJlcHJlc2VudHMgYW4KK2h0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxW0lTTyA4NjAxXSBkYXRlLiBGb3IgaW5zdGFuY2UsIGFsbAorb2YgdGhlIHZhbHVlcyBiZWxvdyBhcmUgdmFsaWQgYHRpbWVzdGFtcGAgdmFsdWVzIGZvciBNYXIgMiwgMjAxMSwgYXQKKzA0OjA1OjAwIEFNLCBHTVQ6CisKKyogYDEyOTkwMzg3MDAwMDBgCisqIGAnMjAxMS0wMi0wMyAwNDowNSswMDAwJ2AKKyogYCcyMDExLTAyLTAzIDA0OjA1OjAwKzAwMDAnYAorKiBgJzIwMTEtMDItMDMgMDQ6MDU6MDAuMDAwKzAwMDAnYAorKiBgJzIwMTEtMDItMDNUMDQ6MDUrMDAwMCdgCisqIGAnMjAxMS0wMi0wM1QwNDowNTowMCswMDAwJ2AKKyogYCcyMDExLTAyLTAzVDA0OjA1OjAwLjAwMCswMDAwJ2AKKworVGhlIGArMDAwMGAgYWJvdmUgaXMgYW4gUkZDIDgyMiA0LWRpZ2l0IHRpbWUgem9uZSBzcGVjaWZpY2F0aW9uOyBgKzAwMDBgCityZWZlcnMgdG8gR01ULiBVUyBQYWNpZmljIFN0YW5kYXJkIFRpbWUgaXMgYC0wODAwYC4gVGhlIHRpbWUgem9uZSBtYXkgYmUKK29taXR0ZWQgaWYgZGVzaXJlZCAoYCcyMDExLTAyLTAzIDA0OjA1OjAwJ2ApLCBhbmQgaWYgc28sIHRoZSBkYXRlIHdpbGwKK2JlIGludGVycHJldGVkIGFzIGJlaW5nIGluIHRoZSB0aW1lIHpvbmUgdW5kZXIgd2hpY2ggdGhlIGNvb3JkaW5hdGluZworQ2Fzc2FuZHJhIG5vZGUgaXMgY29uZmlndXJlZC4gVGhlcmUgYXJlIGhvd2V2ZXIgZGlmZmljdWx0aWVzIGluaGVyZW50IGluCityZWx5aW5nIG9uIHRoZSB0aW1lIHpvbmUgY29uZmlndXJhdGlvbiBiZWluZyBhcyBleHBlY3RlZCwgc28gaXQgaXMKK3JlY29tbWVuZGVkIHRoYXQgdGhlIHRpbWUgem9uZSBhbHdheXMgYmUgc3BlY2lmaWVkIGZvciB0aW1lc3RhbXBzIHdoZW4KK2ZlYXNpYmxlLgorCitUaGUgdGltZSBvZiBkYXkgbWF5IGFsc28gYmUgb21pdHRlZCAoYCcyMDExLTAyLTAzJ2Agb3IKK2AnMjAxMS0wMi0wMyswMDAwJ2ApLCBpbiB3aGljaCBjYXNlIHRoZSB0aW1lIG9mIGRheSB3aWxsIGRlZmF1bHQgdG8KKzAwOjAwOjAwIGluIHRoZSBzcGVjaWZpZWQgb3IgZGVmYXVsdCB0aW1lIHpvbmUuIEhvd2V2ZXIsIGlmIG9ubHkgdGhlCitkYXRlIHBhcnQgaXMgcmVsZXZhbnQsIGNvbnNpZGVyIHVzaW5nIHRoZSB4cmVmOmNxbC90eXBlcy5hZG9jI2RhdGVzW2RhdGVdIHR5cGUuCisKK1tbZGF0ZXNdXQorPT0gRGF0ZSB0eXBlCisKK1ZhbHVlcyBvZiB0aGUgYGRhdGVgIHR5cGUgYXJlIGVuY29kZWQgYXMgMzItYml0IHVuc2lnbmVkIGludGVnZXJzCityZXByZXNlbnRpbmcgYSBudW1iZXIgb2YgZGF5cyB3aXRoIOKAnHRoZSBlcG9jaOKAnSBhdCB0aGUgY2VudGVyIG9mIHRoZQorcmFuZ2UgKDJeMzEpLiBFcG9jaCBpcyBKYW51YXJ5IDFzdCwgMTk3MAorCitGb3IgeHJlZjpjcWwvdHlwZXMuYWRvYyN0aW1lc3RhbXBzW3RpbWVzdGFtcHNdLCBhIGRhdGUgY2FuIGJlIGlucHV0IGVpdGhlciBhcyBhbgorYGludGVnZXJgIG9yIHVzaW5nIGEgZGF0ZSBgc3RyaW5nYC4gSW4gdGhlIGxhdGVyIGNhc2UsIHRoZSBmb3JtYXQgc2hvdWxkCitiZSBgeXl5eS1tbS1kZGAgKHNvIGAnMjAxMS0wMi0wMydgIGZvciBpbnN0YW5jZSkuCisKK1tbdGltZXNdXQorPT0gVGltZSB0eXBlCisKK1ZhbHVlcyBvZiB0aGUgYHRpbWVgIHR5cGUgYXJlIGVuY29kZWQgYXMgNjQtYml0IHNpZ25lZCBpbnRlZ2VycworcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgbmFub3NlY29uZHMgc2luY2UgbWlkbmlnaHQuCisKK0ZvciB4cmVmOmNxbC90eXBlcy5hZG9jI3RpbWVzdGFtcHNbdGltZXN0YW1wc10sIGEgdGltZSBjYW4gYmUgaW5wdXQgZWl0aGVyIGFzIGFuCitgaW50ZWdlcmAgb3IgdXNpbmcgYSBgc3RyaW5nYCByZXByZXNlbnRpbmcgdGhlIHRpbWUuIEluIHRoZSBsYXRlciBjYXNlLAordGhlIGZvcm1hdCBzaG91bGQgYmUgYGhoOm1tOnNzWy5mZmZmZmZmZmZdYCAod2hlcmUgdGhlIHN1Yi1zZWNvbmQKK3ByZWNpc2lvbiBpcyBvcHRpb25hbCBhbmQgaWYgcHJvdmlkZWQsIGNhbiBiZSBsZXNzIHRoYW4gdGhlIG5hbm9zZWNvbmQpLgorU28gZm9yIGluc3RhbmNlLCB0aGUgZm9sbG93aW5nIGFyZSB2YWxpZCBpbnB1dHMgZm9yIGEgdGltZToKKworKiBgJzA4OjEyOjU0J2AKKyogYCcwODoxMjo1NC4xMjMnYAorKiBgJzA4OjEyOjU0LjEyMzQ1NidgCisqIGAnMDg6MTI6NTQuMTIzNDU2Nzg5J2AKKworW1tkdXJhdGlvbnNdXQorPT0gRHVyYXRpb24gdHlwZQorCitWYWx1ZXMgb2YgdGhlIGBkdXJhdGlvbmAgdHlwZSBhcmUgZW5jb2RlZCBhcyAzIHNpZ25lZCBpbnRlZ2VyIG9mCit2YXJpYWJsZSBsZW5ndGhzLiBUaGUgZmlyc3QgaW50ZWdlciByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgbW9udGhzLCB0aGUKK3NlY29uZCB0aGUgbnVtYmVyIG9mIGRheXMgYW5kIHRoZSB0aGlyZCB0aGUgbnVtYmVyIG9mIG5hbm9zZWNvbmRzLiBUaGlzCitpcyBkdWUgdG8gdGhlIGZhY3QgdGhhdCB0aGUgbnVtYmVyIG9mIGRheXMgaW4gYSBtb250aCBjYW4gY2hhbmdlLCBhbmQgYQorZGF5IGNhbiBoYXZlIDIzIG9yIDI1IGhvdXJzIGRlcGVuZGluZyBvbiB0aGUgZGF5bGlnaHQgc2F2aW5nLgorSW50ZXJuYWxseSwgdGhlIG51bWJlciBvZiBtb250aHMgYW5kIGRheXMgYXJlIGRlY29kZWQgYXMgMzIgYml0cworaW50ZWdlcnMgd2hlcmVhcyB0aGUgbnVtYmVyIG9mIG5hbm9zZWNvbmRzIGlzIGRlY29kZWQgYXMgYSA2NCBiaXRzCitpbnRlZ2VyLgorCitBIGR1cmF0aW9uIGNhbiBiZSBpbnB1dCBhczoKKworKiBgKHF1YW50aXR5IHVuaXQpK2AgbGlrZSBgMTJoMzBtYCB3aGVyZSB0aGUgdW5pdCBjYW4gYmU6CisqKiBgeWA6IHllYXJzICgxMiBtb250aHMpCisqKiBgbW9gOiBtb250aHMgKDEgbW9udGgpCisqKiBgd2A6IHdlZWtzICg3IGRheXMpCisqKiBgZGA6IGRheXMgKDEgZGF5KQorKiogYGhgOiBob3VycyAoMyw2MDAsMDAwLDAwMCwwMDAgbmFub3NlY29uZHMpCisqKiBgbWA6IG1pbnV0ZXMgKDYwLDAwMCwwMDAsMDAwIG5hbm9zZWNvbmRzKQorKiogYHNgOiBzZWNvbmRzICgxLDAwMCwwMDAsMDAwIG5hbm9zZWNvbmRzKQorKiogYG1zYDogbWlsbGlzZWNvbmRzICgxLDAwMCwwMDAgbmFub3NlY29uZHMpCisqKiBgdXNgIG9yIGDCtXNgIDogbWljcm9zZWNvbmRzICgxMDAwIG5hbm9zZWNvbmRzKQorKiogYG5zYDogbmFub3NlY29uZHMgKDEgbmFub3NlY29uZCkKKyogSVNPIDg2MDEgZm9ybWF0OiBgUFtuXVlbbl1NW25dRFRbbl1IW25dTVtuXVMgb3IgUFtuXVdgCisqIElTTyA4NjAxIGFsdGVybmF0aXZlIGZvcm1hdDogYFBbWVlZWV0tW01NXS1bRERdVFtoaF06W21tXTpbc3NdYAorCitGb3IgZXhhbXBsZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9pbnNlcnRfZHVyYXRpb24uY3FsW10KKy0tLS0KKworW1tkdXJhdGlvbi1saW1pdGF0aW9uXV0KK0R1cmF0aW9uIGNvbHVtbnMgY2Fubm90IGJlIHVzZWQgaW4gYSB0YWJsZSdzIGBQUklNQVJZIEtFWWAuIFRoaXMKK2xpbWl0YXRpb24gaXMgZHVlIHRvIHRoZSBmYWN0IHRoYXQgZHVyYXRpb25zIGNhbm5vdCBiZSBvcmRlcmVkLiBJdCBpcworZWZmZWN0aXZlbHkgbm90IHBvc3NpYmxlIHRvIGtub3cgaWYgYDFtb2AgaXMgZ3JlYXRlciB0aGFuIGAyOWRgIHdpdGhvdXQKK2EgZGF0ZSBjb250ZXh0LgorCitBIGAxZGAgZHVyYXRpb24gaXMgbm90IGVxdWFsIHRvIGEgYDI0aGAgb25lIGFzIHRoZSBkdXJhdGlvbiB0eXBlIGhhcworYmVlbiBjcmVhdGVkIHRvIGJlIGFibGUgdG8gc3VwcG9ydCBkYXlsaWdodCBzYXZpbmcuCisKKz09IENvbGxlY3Rpb25zCisKK0NRTCBzdXBwb3J0cyB0aHJlZSBraW5kcyBvZiBjb2xsZWN0aW9uczogYG1hcHNgLCBgc2V0c2AgYW5kIGBsaXN0c2AuIFRoZQordHlwZXMgb2YgdGhvc2UgY29sbGVjdGlvbnMgaXMgZGVmaW5lZCBieToKKworW3NvdXJjZSxibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9jb2xsZWN0aW9uX3R5cGUuYm5mW10KKy0tLS0KKworYW5kIHRoZWlyIHZhbHVlcyBjYW4gYmUgaW5wdXRkIHVzaW5nIGNvbGxlY3Rpb24gbGl0ZXJhbHM6CisKK1tzb3VyY2UsYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvY29sbGVjdGlvbl9saXRlcmFsLmJuZltdCistLS0tCisKK05vdGUgaG93ZXZlciB0aGF0IG5laXRoZXIgYGJpbmRfbWFya2VyYCBub3IgYE5VTExgIGFyZSBzdXBwb3J0ZWQgaW5zaWRlCitjb2xsZWN0aW9uIGxpdGVyYWxzLgorCis9PT0gTm90ZXdvcnRoeSBjaGFyYWN0ZXJpc3RpY3MKKworQ29sbGVjdGlvbnMgYXJlIG1lYW50IGZvciBzdG9yaW5nL2Rlbm9ybWFsaXppbmcgcmVsYXRpdmVseSBzbWFsbCBhbW91bnQKK29mIGRhdGEuIFRoZXkgd29yayB3ZWxsIGZvciB0aGluZ3MgbGlrZSDigJx0aGUgcGhvbmUgbnVtYmVycyBvZiBhIGdpdmVuCit1c2Vy4oCdLCDigJxsYWJlbHMgYXBwbGllZCB0byBhbiBlbWFpbOKAnSwgZXRjLiBCdXQgd2hlbiBpdGVtcyBhcmUgZXhwZWN0ZWQgdG8KK2dyb3cgdW5ib3VuZGVkICjigJxhbGwgbWVzc2FnZXMgc2VudCBieSBhIHVzZXLigJ0sIOKAnGV2ZW50cyByZWdpc3RlcmVkIGJ5IGEKK3NlbnNvcuKAnS4uLiksIHRoZW4gY29sbGVjdGlvbnMgYXJlIG5vdCBhcHByb3ByaWF0ZSBhbmQgYSBzcGVjaWZpYyB0YWJsZQorKHdpdGggY2x1c3RlcmluZyBjb2x1bW5zKSBzaG91bGQgYmUgdXNlZC4gQ29uY3JldGVseSwgKG5vbi1mcm96ZW4pCitjb2xsZWN0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgbm90ZXdvcnRoeSBjaGFyYWN0ZXJpc3RpY3MgYW5kCitsaW1pdGF0aW9uczoKKworKiBJbmRpdmlkdWFsIGNvbGxlY3Rpb25zIGFyZSBub3QgaW5kZXhlZCBpbnRlcm5hbGx5LiBXaGljaCBtZWFucyB0aGF0CitldmVuIHRvIGFjY2VzcyBhIHNpbmdsZSBlbGVtZW50IG9mIGEgY29sbGVjdGlvbiwgdGhlIHdob2xlIGNvbGxlY3Rpb24KK2hhcyB0byBiZSByZWFkIChhbmQgcmVhZGluZyBvbmUgaXMgbm90IHBhZ2VkIGludGVybmFsbHkpLgorKiBXaGlsZSBpbnNlcnRpb24gb3BlcmF0aW9ucyBvbiBzZXRzIGFuZCBtYXBzIG5ldmVyIGluY3VyIGEKK3JlYWQtYmVmb3JlLXdyaXRlIGludGVybmFsbHksIHNvbWUgb3BlcmF0aW9ucyBvbiBsaXN0cyBkby4gRnVydGhlciwgc29tZQorbGlzdHMgb3BlcmF0aW9ucyBhcmUgbm90IGlkZW1wb3RlbnQgYnkgbmF0dXJlIChzZWUgdGhlIHNlY3Rpb24gb24KK3hyZWY6Y3FsL3R5cGVzLmFkb2MjbGlzdHNbbGlzdHNdIGJlbG93IGZvciBkZXRhaWxzKSwgbWFraW5nIHRoZWlyIHJldHJ5IGluIGNhc2Ugb2YKK3RpbWVvdXQgcHJvYmxlbWF0aWMuIEl0IGlzIHRodXMgYWR2aXNlZCB0byBwcmVmZXIgc2V0cyBvdmVyIGxpc3RzIHdoZW4KK3Bvc3NpYmxlLgorCitQbGVhc2Ugbm90ZSB0aGF0IHdoaWxlIHNvbWUgb2YgdGhvc2UgbGltaXRhdGlvbnMgbWF5IG9yIG1heSBub3QgYmUKK3JlbW92ZWQvaW1wcm92ZWQgdXBvbiBpbiB0aGUgZnV0dXJlLCBpdCBpcyBhIGFudGktcGF0dGVybiB0byB1c2UgYQorKHNpbmdsZSkgY29sbGVjdGlvbiB0byBzdG9yZSBsYXJnZSBhbW91bnRzIG9mIGRhdGEuCisKKz09PSBNYXBzCisKK0EgYG1hcGAgaXMgYSAoc29ydGVkKSBzZXQgb2Yga2V5LXZhbHVlIHBhaXJzLCB3aGVyZSBrZXlzIGFyZSB1bmlxdWUgYW5kCit0aGUgbWFwIGlzIHNvcnRlZCBieSBpdHMga2V5cy4gWW91IGNhbiBkZWZpbmUgYW5kIGluc2VydCBhIG1hcCB3aXRoOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML21hcC5jcWxbXQorLS0tLQorCitGdXJ0aGVyLCBtYXBzIHN1cHBvcnQ6CisKKyogVXBkYXRpbmcgb3IgaW5zZXJ0aW5nIG9uZSBvciBtb3JlIGVsZW1lbnRzOgorKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC91cGRhdGVfbWFwLmNxbFtdCistLS0tCisqIFJlbW92aW5nIG9uZSBvciBtb3JlIGVsZW1lbnQgKGlmIGFuIGVsZW1lbnQgZG9lc24ndCBleGlzdCwgcmVtb3ZpbmcgaXQKK2lzIGEgbm8tb3AgYnV0IG5vIGVycm9yIGlzIHRocm93bik6CisrCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2RlbGV0ZV9tYXAuY3FsW10KKy0tLS0KKysKK05vdGUgdGhhdCBmb3IgcmVtb3ZpbmcgbXVsdGlwbGUgZWxlbWVudHMgaW4gYSBgbWFwYCwgeW91IHJlbW92ZSBmcm9tIGl0CithIGBzZXRgIG9mIGtleXMuCisKK0xhc3RseSwgVFRMcyBhcmUgYWxsb3dlZCBmb3IgYm90aCBgSU5TRVJUYCBhbmQgYFVQREFURWAsIGJ1dCBpbiBib3RoCitjYXNlcyB0aGUgVFRMIHNldCBvbmx5IGFwcGx5IHRvIHRoZSBuZXdseSBpbnNlcnRlZC91cGRhdGVkIGVsZW1lbnRzLiBJbgorb3RoZXIgd29yZHM6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvdXBkYXRlX3R0bF9tYXAuY3FsW10KKy0tLS0KKword2lsbCBvbmx5IGFwcGx5IHRoZSBUVEwgdG8gdGhlIGB7ICdjb2xvcicgOiAnZ3JlZW4nIH1gIHJlY29yZCwgdGhlIHJlc3QKK29mIHRoZSBtYXAgcmVtYWluaW5nIHVuYWZmZWN0ZWQuCisKKz09PSBTZXRzCisKK0EgYHNldGAgaXMgYSAoc29ydGVkKSBjb2xsZWN0aW9uIG9mIHVuaXF1ZSB2YWx1ZXMuIFlvdSBjYW4gZGVmaW5lIGFuZAoraW5zZXJ0IGEgc2V0IHdpdGg6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvc2V0LmNxbFtdCistLS0tCisKK0Z1cnRoZXIsIHNldHMgc3VwcG9ydDoKKworKiBBZGRpbmcgb25lIG9yIG11bHRpcGxlIGVsZW1lbnRzIChhcyB0aGlzIGlzIGEgc2V0LCBpbnNlcnRpbmcgYW4KK2FscmVhZHkgZXhpc3RpbmcgZWxlbWVudCBpcyBhIG5vLW9wKToKKysKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvdXBkYXRlX3NldC5jcWxbXQorLS0tLQorKiBSZW1vdmluZyBvbmUgb3IgbXVsdGlwbGUgZWxlbWVudHMgKGlmIGFuIGVsZW1lbnQgZG9lc24ndCBleGlzdCwKK3JlbW92aW5nIGl0IGlzIGEgbm8tb3AgYnV0IG5vIGVycm9yIGlzIHRocm93bik6CisrCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2RlbGV0ZV9zZXQuY3FsW10KKy0tLS0KKworTGFzdGx5LCBmb3IgeHJlZjpjcWwvdHlwZXMuYWRvYyNzZXRzW3NldHNdLCBUVExzIGFyZSBvbmx5IGFwcGxpZWQgdG8gbmV3bHkgaW5zZXJ0ZWQgdmFsdWVzLgorCis9PT0gTGlzdHMKKworW05PVEVdCisuTm90ZQorPT09PQorQXMgbWVudGlvbmVkIGFib3ZlIGFuZCBmdXJ0aGVyIGRpc2N1c3NlZCBhdCB0aGUgZW5kIG9mIHRoaXMgc2VjdGlvbiwKK2xpc3RzIGhhdmUgbGltaXRhdGlvbnMgYW5kIHNwZWNpZmljIHBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zIHRoYXQgeW91CitzaG91bGQgdGFrZSBpbnRvIGFjY291bnQgYmVmb3JlIHVzaW5nIHRoZW0uIEluIGdlbmVyYWwsIGlmIHlvdSBjYW4gdXNlIGEKK3hyZWY6Y3FsL3R5cGVzLmFkb2Mjc2V0c1tzZXRdIGluc3RlYWQgb2YgbGlzdCwgYWx3YXlzIHByZWZlciBhIHNldC4KKz09PT0KKworQSBgbGlzdGAgaXMgYSAoc29ydGVkKSBjb2xsZWN0aW9uIG9mIG5vbi11bmlxdWUgdmFsdWVzIHdoZXJlCitlbGVtZW50cyBhcmUgb3JkZXJlZCBieSB0aGVpciBwb3NpdGlvbiBpbiB0aGUgbGlzdC4gWW91IGNhbiBkZWZpbmUgYW5kCitpbnNlcnQgYSBsaXN0IHdpdGg6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvbGlzdC5jcWxbXQorLS0tLQorCitGdXJ0aGVyLCBsaXN0cyBzdXBwb3J0OgorCisqIEFwcGVuZGluZyBhbmQgcHJlcGVuZGluZyB2YWx1ZXMgdG8gYSBsaXN0OgorKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC91cGRhdGVfbGlzdC5jcWxbXQorLS0tLQorCitbV0FSTklOR10KKy5XYXJuaW5nCis9PT09CitUaGUgYXBwZW5kIGFuZCBwcmVwZW5kIG9wZXJhdGlvbnMgYXJlIG5vdCBpZGVtcG90ZW50IGJ5IG5hdHVyZS4gU28gaW4KK3BhcnRpY3VsYXIsIGlmIG9uZSBvZiB0aGVzZSBvcGVyYXRpb25zIHRpbWVzIG91dCwgdGhlbiByZXRyeWluZyB0aGUKK29wZXJhdGlvbiBpcyBub3Qgc2FmZSBhbmQgaXQgbWF5IChvciBtYXkgbm90KSBsZWFkIHRvCithcHBlbmRpbmcvcHJlcGVuZGluZyB0aGUgdmFsdWUgdHdpY2UuCis9PT09CisKKyogU2V0dGluZyB0aGUgdmFsdWUgYXQgYSBwYXJ0aWN1bGFyIHBvc2l0aW9uIGluIGEgbGlzdCB0aGF0IGhhcyBhIHByZS1leGlzdGluZyBlbGVtZW50IGZvciB0aGF0IHBvc2l0aW9uLiBBbiBlcnJvcgord2lsbCBiZSB0aHJvd24gaWYgdGhlIGxpc3QgZG9lcyBub3QgaGF2ZSB0aGUgcG9zaXRpb246CisrCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML3VwZGF0ZV9wYXJ0aWN1bGFyX2xpc3RfZWxlbWVudC5jcWxbXQorLS0tLQorKiBSZW1vdmluZyBhbiBlbGVtZW50IGJ5IGl0cyBwb3NpdGlvbiBpbiB0aGUgbGlzdCB0aGF0IGhhcyBhIHByZS1leGlzdGluZyBlbGVtZW50IGZvciB0aGF0IHBvc2l0aW9uLiBBbiBlcnJvcgord2lsbCBiZSB0aHJvd24gaWYgdGhlIGxpc3QgZG9lcyBub3QgaGF2ZSB0aGUgcG9zaXRpb24uIEZ1cnRoZXIsIGFzIHRoZSBvcGVyYXRpb24gcmVtb3ZlcyBhbgorZWxlbWVudCBmcm9tIHRoZSBsaXN0LCB0aGUgbGlzdCBzaXplIHdpbGwgZGVjcmVhc2UgYnkgb25lIGVsZW1lbnQsIHNoaWZ0aW5nCit0aGUgcG9zaXRpb24gb2YgYWxsIHRoZSBmb2xsb3dpbmcgZWxlbWVudHMgb25lIGZvcndhcmQ6CisrCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2RlbGV0ZV9lbGVtZW50X2xpc3QuY3FsW10KKy0tLS0KKworKiBEZWxldGluZyBfYWxsXyB0aGUgb2NjdXJyZW5jZXMgb2YgcGFydGljdWxhciB2YWx1ZXMgaW4gdGhlIGxpc3QgKGlmIGEKK3BhcnRpY3VsYXIgZWxlbWVudCBkb2Vzbid0IG9jY3VyIGF0IGFsbCBpbiB0aGUgbGlzdCwgaXQgaXMgc2ltcGx5CitpZ25vcmVkIGFuZCBubyBlcnJvciBpcyB0aHJvd24pOgorKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9kZWxldGVfYWxsX2VsZW1lbnRzX2xpc3QuY3FsW10KKy0tLS0KKworW1dBUk5JTkddCisuV2FybmluZworPT09PQorU2V0dGluZyBhbmQgcmVtb3ZpbmcgYW4gZWxlbWVudCBieSBwb3NpdGlvbiBhbmQgcmVtb3Zpbmcgb2NjdXJlbmNlcyBvZgorcGFydGljdWxhciB2YWx1ZXMgaW5jdXIgYW4gaW50ZXJuYWwgX3JlYWQtYmVmb3JlLXdyaXRlXy4gVGhlc2Ugb3BlcmF0aW9ucyB3aWxsCitydW4gc2xvd2x5IGFuZCB1c2UgbW9yZSByZXNvdXJjZXMgdGhhbiB1c3VhbCB1cGRhdGVzICh3aXRoIHRoZQorZXhjbHVzaW9uIG9mIGNvbmRpdGlvbmFsIHdyaXRlIHRoYXQgaGF2ZSB0aGVpciBvd24gY29zdCkuCis9PT09CisKK0xhc3RseSwgZm9yIHhyZWY6Y3FsL3R5cGVzLmFkb2MjbGlzdHNbbGlzdHNdLCBUVExzIG9ubHkgYXBwbHkgdG8gbmV3bHkgaW5zZXJ0ZWQgdmFsdWVzLgorCitbW3VkdHNdXQorPT0gVXNlci1EZWZpbmVkIFR5cGVzIChVRFRzKQorCitDUUwgc3VwcG9ydCB0aGUgZGVmaW5pdGlvbiBvZiB1c2VyLWRlZmluZWQgdHlwZXMgKFVEVHMpLiBTdWNoIGEKK3R5cGUgY2FuIGJlIGNyZWF0ZWQsIG1vZGlmaWVkIGFuZCByZW1vdmVkIHVzaW5nIHRoZQorYGNyZWF0ZV90eXBlX3N0YXRlbWVudGAsIGBhbHRlcl90eXBlX3N0YXRlbWVudGAgYW5kCitgZHJvcF90eXBlX3N0YXRlbWVudGAgZGVzY3JpYmVkIGJlbG93LiBCdXQgb25jZSBjcmVhdGVkLCBhIFVEVCBpcyBzaW1wbHkKK3JlZmVycmVkIHRvIGJ5IGl0cyBuYW1lOgorCitbc291cmNlLCBibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi91ZHQuYm5mW10KKy0tLS0KKworPT09IENyZWF0aW5nIGEgVURUCisKK0NyZWF0aW5nIGEgbmV3IHVzZXItZGVmaW5lZCB0eXBlIGlzIGRvbmUgdXNpbmcgYSBgQ1JFQVRFIFRZUEVgIHN0YXRlbWVudAorZGVmaW5lZCBieToKKworW3NvdXJjZSwgYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvY3JlYXRlX3R5cGUuYm5mW10KKy0tLS0KKworQSBVRFQgaGFzIGEgbmFtZSAodXNlZCB0byBkZWNsYXJlZCBjb2x1bW5zIG9mIHRoYXQgdHlwZSkgYW5kIGlzIGEgc2V0IG9mCituYW1lZCBhbmQgdHlwZWQgZmllbGRzLiBGaWVsZHMgbmFtZSBjYW4gYmUgYW55IHR5cGUsIGluY2x1ZGluZworY29sbGVjdGlvbnMgb3Igb3RoZXIgVURULiBGb3IgaW5zdGFuY2U6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvdWR0LmNxbFtdCistLS0tCisKK1RoaW5ncyB0byBrZWVwIGluIG1pbmQgYWJvdXQgVURUczoKKworKiBBdHRlbXB0aW5nIHRvIGNyZWF0ZSBhbiBhbHJlYWR5IGV4aXN0aW5nIHR5cGUgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IKK3VubGVzcyB0aGUgYElGIE5PVCBFWElTVFNgIG9wdGlvbiBpcyB1c2VkLiBJZiBpdCBpcyB1c2VkLCB0aGUgc3RhdGVtZW50Cit3aWxsIGJlIGEgbm8tb3AgaWYgdGhlIHR5cGUgYWxyZWFkeSBleGlzdHMuCisqIEEgdHlwZSBpcyBpbnRyaW5zaWNhbGx5IGJvdW5kIHRvIHRoZSBrZXlzcGFjZSBpbiB3aGljaCBpdCBpcyBjcmVhdGVkLAorYW5kIGNhbiBvbmx5IGJlIHVzZWQgaW4gdGhhdCBrZXlzcGFjZS4gQXQgY3JlYXRpb24sIGlmIHRoZSB0eXBlIG5hbWUgaXMKK3ByZWZpeGVkIGJ5IGEga2V5c3BhY2UgbmFtZSwgaXQgaXMgY3JlYXRlZCBpbiB0aGF0IGtleXNwYWNlLiBPdGhlcndpc2UsCitpdCBpcyBjcmVhdGVkIGluIHRoZSBjdXJyZW50IGtleXNwYWNlLgorKiBBcyBvZiBDYXNzYW5kcmEgLCBVRFQgaGF2ZSB0byBiZSBmcm96ZW4gaW4gbW9zdCBjYXNlcywgaGVuY2UgdGhlCitgZnJvemVuPGFkZHJlc3M+YCBpbiB0aGUgdGFibGUgZGVmaW5pdGlvbiBhYm92ZS4KKworPT09IFVEVCBsaXRlcmFscworCitPbmNlIGEgdXNlci1kZWZpbmVkIHR5cGUgaGFzIGJlZW4gY3JlYXRlZCwgdmFsdWUgY2FuIGJlIGlucHV0IHVzaW5nIGEKK1VEVCBsaXRlcmFsOgorCitbc291cmNlLGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL3VkdF9saXRlcmFsLmJuZltdCistLS0tCisKK0luIG90aGVyIHdvcmRzLCBhIFVEVCBsaXRlcmFsIGlzIGxpa2UgYSB4cmVmOmNxbC90eXBlcy5hZG9jI21hcHNbbWFwXWAgbGl0ZXJhbCBidXQgaXRzCitrZXlzIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGZpZWxkcyBvZiB0aGUgdHlwZS4gRm9yIGluc3RhbmNlLCBvbmUgY291bGQKK2luc2VydCBpbnRvIHRoZSB0YWJsZSBkZWZpbmUgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24gdXNpbmc6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvaW5zZXJ0X3VkdC5jcWxbXQorLS0tLQorCitUbyBiZSB2YWxpZCwgYSBVRFQgbGl0ZXJhbCBjYW4gb25seSBpbmNsdWRlIGZpZWxkcyBkZWZpbmVkIGJ5IHRoZQordHlwZSBpdCBpcyBhIGxpdGVyYWwgb2YsIGJ1dCBpdCBjYW4gb21pdCBzb21lIGZpZWxkcyAodGhlc2Ugd2lsbCBiZSBzZXQgdG8gYE5VTExgKS4KKworPT09IEFsdGVyaW5nIGEgVURUCisKK0FuIGV4aXN0aW5nIHVzZXItZGVmaW5lZCB0eXBlIGNhbiBiZSBtb2RpZmllZCB1c2luZyBhbiBgQUxURVIgVFlQRWAKK3N0YXRlbWVudDoKKworW3NvdXJjZSxibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9hbHRlcl91ZHRfc3RhdGVtZW50LmJuZltdCistLS0tCitJZiB0aGUgdHlwZSBkb2VzIG5vdCBleGlzdCwgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCitZb3UgY2FuOgorCisqIEFkZCBhIG5ldyBmaWVsZCB0byB0aGUgdHlwZSAoYEFMVEVSIFRZUEUgYWRkcmVzcyBBREQgY291bnRyeSB0ZXh0YCkuCitUaGF0IG5ldyBmaWVsZCB3aWxsIGJlIGBOVUxMYCBmb3IgYW55IHZhbHVlcyBvZiB0aGUgdHlwZSBjcmVhdGVkIGJlZm9yZQordGhlIGFkZGl0aW9uLiBJZiB0aGUgbmV3IGZpZWxkIGV4aXN0cywgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBOT1QgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgorKiBSZW5hbWUgdGhlIGZpZWxkcyBvZiB0aGUgdHlwZS4gSWYgdGhlIGZpZWxkKHMpIGRvZXMgbm90IGV4aXN0LCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLCB1bmxlc3MgYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9yZW5hbWVfdWR0X2ZpZWxkLmNxbFtdCistLS0tCisKKz09PSBEcm9wcGluZyBhIFVEVAorCitZb3UgY2FuIGRyb3AgYW4gZXhpc3RpbmcgdXNlci1kZWZpbmVkIHR5cGUgdXNpbmcgYSBgRFJPUCBUWVBFYAorc3RhdGVtZW50OgorCitbc291cmNlLGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL2Ryb3BfdWR0X3N0YXRlbWVudC5ibmZbXQorLS0tLQorCitEcm9wcGluZyBhIHR5cGUgcmVzdWx0cyBpbiB0aGUgaW1tZWRpYXRlLCBpcnJldmVyc2libGUgcmVtb3ZhbCBvZiB0aGF0Cit0eXBlLiBIb3dldmVyLCBhdHRlbXB0aW5nIHRvIGRyb3AgYSB0eXBlIHRoYXQgaXMgc3RpbGwgaW4gdXNlIGJ5IGFub3RoZXIKK3R5cGUsIHRhYmxlIG9yIGZ1bmN0aW9uIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLgorCitJZiB0aGUgdHlwZSBkcm9wcGVkIGRvZXMgbm90IGV4aXN0LCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIHVubGVzcworYElGIEVYSVNUU2AgaXMgdXNlZCwgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCisKKz09IFR1cGxlcworCitDUUwgYWxzbyBzdXBwb3J0IHR1cGxlcyBhbmQgdHVwbGUgdHlwZXMgKHdoZXJlIHRoZSBlbGVtZW50cyBjYW4gYmUgb2YKK2RpZmZlcmVudCB0eXBlcykuIEZ1bmN0aW9uYWxseSwgdHVwbGVzIGNhbiBiZSB0aG91Z2ggYXMgYW5vbnltb3VzIFVEVAord2l0aCBhbm9ueW1vdXMgZmllbGRzLiBUdXBsZSB0eXBlcyBhbmQgdHVwbGUgbGl0ZXJhbHMgYXJlIGRlZmluZWQgYnk6CisKK1tzb3VyY2UsYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvdHVwbGUuYm5mW10KKy0tLS0KKworYW5kIGNhbiBiZSBjcmVhdGVkOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML3R1cGxlLmNxbFtdCistLS0tCisKK1VubGlrZSBvdGhlciBjb21wb3NlZCB0eXBlcywgbGlrZSBjb2xsZWN0aW9ucyBhbmQgVURUcywgYSB0dXBsZSBpcyBhbHdheXMKK2Bmcm96ZW4gPGZyb3plbj5gICh3aXRob3V0IHRoZSBuZWVkIG9mIHRoZSBgZnJvemVuYCBrZXl3b3JkKQorYW5kIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB1cGRhdGUgb25seSBzb21lIGVsZW1lbnRzIG9mIGEgdHVwbGUgKHdpdGhvdXQKK3VwZGF0aW5nIHRoZSB3aG9sZSB0dXBsZSkuIEFsc28sIGEgdHVwbGUgbGl0ZXJhbCBzaG91bGQgYWx3YXlzIGhhdmUgdGhlCitzYW1lIG51bWJlciBvZiB2YWx1ZSB0aGFuIGRlY2xhcmVkIGluIHRoZSB0eXBlIGl0IGlzIGEgdHVwbGUgb2YgKHNvbWUgb2YKK3Rob3NlIHZhbHVlcyBjYW4gYmUgbnVsbCBidXQgdGhleSBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgZGVjbGFyZWQgYXMgc28pLgorCis9PSBDdXN0b20gVHlwZXMKKworW05PVEVdCisuTm90ZQorPT09PQorQ3VzdG9tIHR5cGVzIGV4aXN0cyBtb3N0bHkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgcHVycG9zZXMgYW5kIHRoZWlyCit1c2FnZSBpcyBkaXNjb3VyYWdlZC4gVGhlaXIgdXNhZ2UgaXMgY29tcGxleCwgbm90IHVzZXIgZnJpZW5kbHkgYW5kIHRoZQorb3RoZXIgcHJvdmlkZWQgdHlwZXMsIHBhcnRpY3VsYXJseSB4cmVmOmNxbC90eXBlcy5hZG9jI3VkdHNbdXNlci1kZWZpbmVkIHR5cGVzXSwgc2hvdWxkCithbG1vc3QgYWx3YXlzIGJlIGVub3VnaC4KKz09PT0KKworQSBjdXN0b20gdHlwZSBpcyBkZWZpbmVkIGJ5OgorCitbc291cmNlLGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL2N1c3RvbV90eXBlLmJuZltdCistLS0tCisKK0EgY3VzdG9tIHR5cGUgaXMgYSBgc3RyaW5nYCB0aGF0IGNvbnRhaW5zIHRoZSBuYW1lIG9mIEphdmEgY2xhc3MgdGhhdAorZXh0ZW5kcyB0aGUgc2VydmVyIHNpZGUgYEFic3RyYWN0VHlwZWAgY2xhc3MgYW5kIHRoYXQgY2FuIGJlIGxvYWRlZCBieQorQ2Fzc2FuZHJhIChpdCBzaG91bGQgdGh1cyBiZSBpbiB0aGUgYENMQVNTUEFUSGAgb2YgZXZlcnkgbm9kZSBydW5uaW5nCitDYXNzYW5kcmEpLiBUaGF0IGNsYXNzIHdpbGwgZGVmaW5lIHdoYXQgdmFsdWVzIGFyZSB2YWxpZCBmb3IgdGhlIHR5cGUKK2FuZCBob3cgdGhlIHRpbWUgc29ydHMgd2hlbiB1c2VkIGZvciBhIGNsdXN0ZXJpbmcgY29sdW1uLiBGb3IgYW55IG90aGVyCitwdXJwb3NlLCBhIHZhbHVlIG9mIGEgY3VzdG9tIHR5cGUgaXMgdGhlIHNhbWUgdGhhbiB0aGF0IG9mIGEgYGJsb2JgLCBhbmQKK2NhbiBpbiBwYXJ0aWN1bGFyIGJlIGlucHV0IHVzaW5nIHRoZSBgYmxvYmAgbGl0ZXJhbCBzeW50YXguCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfY29uY2VwdHVhbC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX2NvbmNlcHR1YWwuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmZkZDFkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX2NvbmNlcHR1YWwuYWRvYwpAQCAtMCwwICsxLDQ0IEBACis9IENvbmNlcHR1YWwgRGF0YSBNb2RlbGluZworCitGaXJzdCwgbGV04oCZcyBjcmVhdGUgYSBzaW1wbGUgZG9tYWluIG1vZGVsIHRoYXQgaXMgZWFzeSB0byB1bmRlcnN0YW5kIGluCit0aGUgcmVsYXRpb25hbCB3b3JsZCwgYW5kIHRoZW4gc2VlIGhvdyB5b3UgbWlnaHQgbWFwIGl0IGZyb20gYQorcmVsYXRpb25hbCB0byBhIGRpc3RyaWJ1dGVkIGhhc2h0YWJsZSBtb2RlbCBpbiBDYXNzYW5kcmEuCisKK0xldCdzIHVzZSBhbiBleGFtcGxlIHRoYXQgaXMgY29tcGxleCBlbm91Z2ggdG8gc2hvdyB0aGUgdmFyaW91cyBkYXRhCitzdHJ1Y3R1cmVzIGFuZCBkZXNpZ24gcGF0dGVybnMsIGJ1dCBub3Qgc29tZXRoaW5nIHRoYXQgd2lsbCBib2cgeW91IGRvd24KK3dpdGggZGV0YWlscy4gQWxzbywgYSBkb21haW4gdGhhdOKAmXMgZmFtaWxpYXIgdG8gZXZlcnlvbmUgd2lsbCBhbGxvdyB5b3UKK3RvIGNvbmNlbnRyYXRlIG9uIGhvdyB0byB3b3JrIHdpdGggQ2Fzc2FuZHJhLCBub3Qgb24gd2hhdCB0aGUKK2FwcGxpY2F0aW9uIGRvbWFpbiBpcyBhbGwgYWJvdXQuCisKK0ZvciBleGFtcGxlLCBsZXQncyB1c2UgYSBkb21haW4gdGhhdCBpcyBlYXNpbHkgdW5kZXJzdG9vZCBhbmQgdGhhdAorZXZlcnlvbmUgY2FuIHJlbGF0ZSB0bzogbWFraW5nIGhvdGVsIHJlc2VydmF0aW9ucy4KKworVGhlIGNvbmNlcHR1YWwgZG9tYWluIGluY2x1ZGVzIGhvdGVscywgZ3Vlc3RzIHRoYXQgc3RheSBpbiB0aGUgaG90ZWxzLCBhCitjb2xsZWN0aW9uIG9mIHJvb21zIGZvciBlYWNoIGhvdGVsLCB0aGUgcmF0ZXMgYW5kIGF2YWlsYWJpbGl0eSBvZiB0aG9zZQorcm9vbXMsIGFuZCBhIHJlY29yZCBvZiByZXNlcnZhdGlvbnMgYm9va2VkIGZvciBndWVzdHMuIEhvdGVscyB0eXBpY2FsbHkKK2Fsc28gbWFpbnRhaW4gYSBjb2xsZWN0aW9uIG9mIOKAnHBvaW50cyBvZiBpbnRlcmVzdCzigJ0gd2hpY2ggYXJlIHBhcmtzLAorbXVzZXVtcywgc2hvcHBpbmcgZ2FsbGVyaWVzLCBtb251bWVudHMsIG9yIG90aGVyIHBsYWNlcyBuZWFyIHRoZSBob3RlbAordGhhdCBndWVzdHMgbWlnaHQgd2FudCB0byB2aXNpdCBkdXJpbmcgdGhlaXIgc3RheS4gQm90aCBob3RlbHMgYW5kCitwb2ludHMgb2YgaW50ZXJlc3QgbmVlZCB0byBtYWludGFpbiBnZW9sb2NhdGlvbiBkYXRhIHNvIHRoYXQgdGhleSBjYW4gYmUKK2ZvdW5kIG9uIG1hcHMgZm9yIG1hc2h1cHMsIGFuZCB0byBjYWxjdWxhdGUgZGlzdGFuY2VzLgorCitUaGUgY29uY2VwdHVhbCBkb21haW4gaXMgZGVwaWN0ZWQgYmVsb3cgdXNpbmcgdGhlIGVudGl0eeKAk3JlbGF0aW9uc2hpcAorbW9kZWwgcG9wdWxhcml6ZWQgYnkgUGV0ZXIgQ2hlbi4gVGhpcyBzaW1wbGUgZGlhZ3JhbSByZXByZXNlbnRzIHRoZQorZW50aXRpZXMgaW4gdGhlIGRvbWFpbiB3aXRoIHJlY3RhbmdsZXMsIGFuZCBhdHRyaWJ1dGVzIG9mIHRob3NlIGVudGl0aWVzCit3aXRoIG92YWxzLiBBdHRyaWJ1dGVzIHRoYXQgcmVwcmVzZW50IHVuaXF1ZSBpZGVudGlmaWVycyBmb3IgaXRlbXMgYXJlCit1bmRlcmxpbmVkLiBSZWxhdGlvbnNoaXBzIGJldHdlZW4gZW50aXRpZXMgYXJlIHJlcHJlc2VudGVkIGFzIGRpYW1vbmRzLAorYW5kIHRoZSBjb25uZWN0b3JzIGJldHdlZW4gdGhlIHJlbGF0aW9uc2hpcCBhbmQgZWFjaCBlbnRpdHkgc2hvdyB0aGUKK211bHRpcGxpY2l0eSBvZiB0aGUgY29ubmVjdGlvbi4KKworaW1hZ2U6OmRhdGEtbW9kZWxpbmdfaG90ZWxfZXJkLnBuZ1tpbWFnZV0KKworT2J2aW91c2x5LCBpbiB0aGUgcmVhbCB3b3JsZCwgdGhlcmUgd291bGQgYmUgbWFueSBtb3JlIGNvbnNpZGVyYXRpb25zCithbmQgbXVjaCBtb3JlIGNvbXBsZXhpdHkuIEZvciBleGFtcGxlLCBob3RlbCByYXRlcyBhcmUgbm90b3Jpb3VzbHkKK2R5bmFtaWMsIGFuZCBjYWxjdWxhdGluZyB0aGVtIGludm9sdmVzIGEgd2lkZSBhcnJheSBvZiBmYWN0b3JzLiBIZXJlCit5b3XigJlyZSBkZWZpbmluZyBzb21ldGhpbmcgY29tcGxleCBlbm91Z2ggdG8gYmUgaW50ZXJlc3RpbmcgYW5kIHRvdWNoIG9uCit0aGUgaW1wb3J0YW50IHBvaW50cywgYnV0IHNpbXBsZSBlbm91Z2ggdG8gbWFpbnRhaW4gdGhlIGZvY3VzIG9uCitsZWFybmluZyBDYXNzYW5kcmEuCisKK19NYXRlcmlhbCBhZGFwdGVkIGZyb20gQ2Fzc2FuZHJhLCBUaGUgRGVmaW5pdGl2ZSBHdWlkZS4gUHVibGlzaGVkIGJ5CitPJ1JlaWxseSBNZWRpYSwgSW5jLiBDb3B5cmlnaHQgwqkgMjAyMCBKZWZmIENhcnBlbnRlciwgRWJlbiBIZXdpdHQuIEFsbAorcmlnaHRzIHJlc2VydmVkLiBVc2VkIHdpdGggcGVybWlzc2lvbi5fCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfbG9naWNhbC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX2xvZ2ljYWwuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmM2OWVmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX2xvZ2ljYWwuYWRvYwpAQCAtMCwwICsxLDE5NSBAQAorPSBMb2dpY2FsIERhdGEgTW9kZWxpbmcKKworTm93IHRoYXQgeW91IGhhdmUgZGVmaW5lZCB5b3VyIHF1ZXJpZXMsIHlvdeKAmXJlIHJlYWR5IHRvIGJlZ2luIGRlc2lnbmluZworQ2Fzc2FuZHJhIHRhYmxlcy4gRmlyc3QsIGNyZWF0ZSBhIGxvZ2ljYWwgbW9kZWwgY29udGFpbmluZyBhIHRhYmxlIGZvcgorZWFjaCBxdWVyeSwgY2FwdHVyaW5nIGVudGl0aWVzIGFuZCByZWxhdGlvbnNoaXBzIGZyb20gdGhlIGNvbmNlcHR1YWwKK21vZGVsLgorCitUbyBuYW1lIGVhY2ggdGFibGUsIHlvdeKAmWxsIGlkZW50aWZ5IHRoZSBwcmltYXJ5IGVudGl0eSB0eXBlIGZvciB3aGljaAoreW91IGFyZSBxdWVyeWluZyBhbmQgdXNlIHRoYXQgdG8gc3RhcnQgdGhlIGVudGl0eSBuYW1lLiBJZiB5b3UgYXJlCitxdWVyeWluZyBieSBhdHRyaWJ1dGVzIG9mIG90aGVyIHJlbGF0ZWQgZW50aXRpZXMsIGFwcGVuZCB0aG9zZSB0byB0aGUKK3RhYmxlIG5hbWUsIHNlcGFyYXRlZCB3aXRoIGBfYnlfYC4gRm9yIGV4YW1wbGUsIGBob3RlbHNfYnlfcG9pYC4KKworTmV4dCwgeW91IGlkZW50aWZ5IHRoZSBwcmltYXJ5IGtleSBmb3IgdGhlIHRhYmxlLCBhZGRpbmcgcGFydGl0aW9uIGtleQorY29sdW1ucyBiYXNlZCBvbiB0aGUgcmVxdWlyZWQgcXVlcnkgYXR0cmlidXRlcywgYW5kIGNsdXN0ZXJpbmcgY29sdW1ucworaW4gb3JkZXIgdG8gZ3VhcmFudGVlIHVuaXF1ZW5lc3MgYW5kIHN1cHBvcnQgZGVzaXJlZCBzb3J0IG9yZGVyaW5nLgorCitUaGUgZGVzaWduIG9mIHRoZSBwcmltYXJ5IGtleSBpcyBleHRyZW1lbHkgaW1wb3J0YW50LCBhcyBpdCB3aWxsCitkZXRlcm1pbmUgaG93IG11Y2ggZGF0YSB3aWxsIGJlIHN0b3JlZCBpbiBlYWNoIHBhcnRpdGlvbiBhbmQgaG93IHRoYXQKK2RhdGEgaXMgb3JnYW5pemVkIG9uIGRpc2ssIHdoaWNoIGluIHR1cm4gd2lsbCBhZmZlY3QgaG93IHF1aWNrbHkKK0Nhc3NhbmRyYSBwcm9jZXNzZXMgcmVhZHMuCisKK0NvbXBsZXRlIGVhY2ggdGFibGUgYnkgYWRkaW5nIGFueSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgaWRlbnRpZmllZCBieQordGhlIHF1ZXJ5LiBJZiBhbnkgb2YgdGhlc2UgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIGFyZSB0aGUgc2FtZSBmb3IgZXZlcnkKK2luc3RhbmNlIG9mIHRoZSBwYXJ0aXRpb24ga2V5LCBtYXJrIHRoZSBjb2x1bW4gYXMgc3RhdGljLgorCitOb3cgdGhhdCB3YXMgYSBwcmV0dHkgcXVpY2sgZGVzY3JpcHRpb24gb2YgYSBmYWlybHkgaW52b2x2ZWQgcHJvY2Vzcywgc28KK2l0IHdpbGwgYmUgd29ydGh3aGlsZSB0byB3b3JrIHRocm91Z2ggYSBkZXRhaWxlZCBleGFtcGxlLiBGaXJzdCwgbGV04oCZcworaW50cm9kdWNlIGEgbm90YXRpb24gdGhhdCB5b3UgY2FuIHVzZSB0byByZXByZXNlbnQgbG9naWNhbCBtb2RlbHMuCisKK1NldmVyYWwgaW5kaXZpZHVhbHMgd2l0aGluIHRoZSBDYXNzYW5kcmEgY29tbXVuaXR5IGhhdmUgcHJvcG9zZWQKK25vdGF0aW9ucyBmb3IgY2FwdHVyaW5nIGRhdGEgbW9kZWxzIGluIGRpYWdyYW1tYXRpYyBmb3JtLiBUaGlzIGRvY3VtZW50Cit1c2VzIGEgbm90YXRpb24gcG9wdWxhcml6ZWQgYnkgQXJ0ZW0gQ2hlYm90a28gd2hpY2ggcHJvdmlkZXMgYSBzaW1wbGUsCitpbmZvcm1hdGl2ZSB3YXkgdG8gdmlzdWFsaXplIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gcXVlcmllcyBhbmQKK3RhYmxlcyBpbiB5b3VyIGRlc2lnbnMuIFRoaXMgZmlndXJlIHNob3dzIHRoZSBDaGVib3RrbyBub3RhdGlvbiBmb3IgYQorbG9naWNhbCBkYXRhIG1vZGVsLgorCitpbWFnZTo6ZGF0YS1tb2RlbGluZ19jaGVib3Rrb19sb2dpY2FsLnBuZ1tpbWFnZV0KKworRWFjaCB0YWJsZSBpcyBzaG93biB3aXRoIGl0cyB0aXRsZSBhbmQgYSBsaXN0IG9mIGNvbHVtbnMuIFByaW1hcnkga2V5Citjb2x1bW5zIGFyZSBpZGVudGlmaWVkIHZpYSBzeW1ib2xzIHN1Y2ggYXMgKksqIGZvciBwYXJ0aXRpb24ga2V5IGNvbHVtbnMKK2FuZCAqKkMqKuKGkSBvciAqKkMqKuKGkyB0byByZXByZXNlbnQgY2x1c3RlcmluZyBjb2x1bW5zLiBMaW5lcyBhcmUgc2hvd24KK2VudGVyaW5nIHRhYmxlcyBvciBiZXR3ZWVuIHRhYmxlcyB0byBpbmRpY2F0ZSB0aGUgcXVlcmllcyB0aGF0IGVhY2gKK3RhYmxlIGlzIGRlc2lnbmVkIHRvIHN1cHBvcnQuCisKKz09IEhvdGVsIExvZ2ljYWwgRGF0YSBNb2RlbAorCitUaGUgZmlndXJlIGJlbG93IHNob3dzIGEgQ2hlYm90a28gbG9naWNhbCBkYXRhIG1vZGVsIGZvciB0aGUgcXVlcmllcworaW52b2x2aW5nIGhvdGVscywgcG9pbnRzIG9mIGludGVyZXN0LCByb29tcywgYW5kIGFtZW5pdGllcy4gT25lIHRoaW5nCit5b3UnbGwgbm90aWNlIGltbWVkaWF0ZWx5IGlzIHRoYXQgdGhlIENhc3NhbmRyYSBkZXNpZ24gZG9lc27igJl0IGluY2x1ZGUKK2RlZGljYXRlZCB0YWJsZXMgZm9yIHJvb21zIG9yIGFtZW5pdGllcywgYXMgeW91IGhhZCBpbiB0aGUgcmVsYXRpb25hbAorZGVzaWduLiBUaGlzIGlzIGJlY2F1c2UgdGhlIHdvcmtmbG93IGRpZG7igJl0IGlkZW50aWZ5IGFueSBxdWVyaWVzCityZXF1aXJpbmcgdGhpcyBkaXJlY3QgYWNjZXNzLgorCitpbWFnZTo6ZGF0YS1tb2RlbGluZ19ob3RlbF9sb2dpY2FsLnBuZ1tpbWFnZV0KKworTGV04oCZcyBleHBsb3JlIHRoZSBkZXRhaWxzIG9mIGVhY2ggb2YgdGhlc2UgdGFibGVzLgorCitUaGUgZmlyc3QgcXVlcnkgUTEgaXMgdG8gZmluZCBob3RlbHMgbmVhciBhIHBvaW50IG9mIGludGVyZXN0LCBzbyB5b3XigJlsbAorY2FsbCB0aGlzIHRhYmxlIGBob3RlbHNfYnlfcG9pYC4gU2VhcmNoaW5nIGJ5IGEgbmFtZWQgcG9pbnQgb2YgaW50ZXJlc3QKK2lzIGEgY2x1ZSB0aGF0IHRoZSBwb2ludCBvZiBpbnRlcmVzdCBzaG91bGQgYmUgYSBwYXJ0IG9mIHRoZSBwcmltYXJ5CitrZXkuIExldOKAmXMgcmVmZXJlbmNlIHRoZSBwb2ludCBvZiBpbnRlcmVzdCBieSBuYW1lLCBiZWNhdXNlIGFjY29yZGluZyB0bwordGhlIHdvcmtmbG93IHRoYXQgaXMgaG93IHVzZXJzIHdpbGwgc3RhcnQgdGhlaXIgc2VhcmNoLgorCitZb3XigJlsbCBub3RlIHRoYXQgeW91IGNlcnRhaW5seSBjb3VsZCBoYXZlIG1vcmUgdGhhbiBvbmUgaG90ZWwgbmVhciBhCitnaXZlbiBwb2ludCBvZiBpbnRlcmVzdCwgc28geW914oCZbGwgbmVlZCBhbm90aGVyIGNvbXBvbmVudCBpbiB0aGUgcHJpbWFyeQora2V5IGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB5b3UgaGF2ZSBhIHVuaXF1ZSBwYXJ0aXRpb24gZm9yIGVhY2ggaG90ZWwuIFNvCit5b3UgYWRkIHRoZSBob3RlbCBrZXkgYXMgYSBjbHVzdGVyaW5nIGNvbHVtbi4KKworQW4gaW1wb3J0YW50IGNvbnNpZGVyYXRpb24gaW4gZGVzaWduaW5nIHlvdXIgdGFibGXigJlzIHByaW1hcnkga2V5IGlzCittYWtpbmcgc3VyZSB0aGF0IGl0IGRlZmluZXMgYSB1bmlxdWUgZGF0YSBlbGVtZW50LiBPdGhlcndpc2UgeW91IHJ1biB0aGUKK3Jpc2sgb2YgYWNjaWRlbnRhbGx5IG92ZXJ3cml0aW5nIGRhdGEuCisKK05vdyBmb3IgdGhlIHNlY29uZCBxdWVyeSAoUTIpLCB5b3XigJlsbCBuZWVkIGEgdGFibGUgdG8gZ2V0IGluZm9ybWF0aW9uCithYm91dCBhIHNwZWNpZmljIGhvdGVsLiBPbmUgYXBwcm9hY2ggd291bGQgaGF2ZSBiZWVuIHRvIHB1dCBhbGwgb2YgdGhlCithdHRyaWJ1dGVzIG9mIGEgaG90ZWwgaW4gdGhlIGBob3RlbHNfYnlfcG9pYCB0YWJsZSwgYnV0IHlvdSBhZGRlZCBvbmx5Cit0aG9zZSBhdHRyaWJ1dGVzIHRoYXQgd2VyZSByZXF1aXJlZCBieSB0aGUgYXBwbGljYXRpb24gd29ya2Zsb3cuCisKK0Zyb20gdGhlIHdvcmtmbG93IGRpYWdyYW0sIHlvdSBrbm93IHRoYXQgdGhlIGBob3RlbHNfYnlfcG9pYCB0YWJsZSBpcwordXNlZCB0byBkaXNwbGF5IGEgbGlzdCBvZiBob3RlbHMgd2l0aCBiYXNpYyBpbmZvcm1hdGlvbiBvbiBlYWNoIGhvdGVsLAorYW5kIHRoZSBhcHBsaWNhdGlvbiBrbm93cyB0aGUgdW5pcXVlIGlkZW50aWZpZXJzIG9mIHRoZSBob3RlbHMgcmV0dXJuZWQuCitXaGVuIHRoZSB1c2VyIHNlbGVjdHMgYSBob3RlbCB0byB2aWV3IGRldGFpbHMsIHlvdSBjYW4gdGhlbiB1c2UgUTIsCit3aGljaCBpcyB1c2VkIHRvIG9idGFpbiBkZXRhaWxzIGFib3V0IHRoZSBob3RlbC4gQmVjYXVzZSB5b3UgYWxyZWFkeQoraGF2ZSB0aGUgYGhvdGVsX2lkYCBmcm9tIFExLCB5b3UgdXNlIHRoYXQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGhvdGVsCit5b3XigJlyZSBsb29raW5nIGZvci4gVGhlcmVmb3JlIHRoZSBzZWNvbmQgdGFibGUgaXMganVzdCBjYWxsZWQgYGhvdGVsc2AuCisKK0Fub3RoZXIgb3B0aW9uIHdvdWxkIGhhdmUgYmVlbiB0byBzdG9yZSBhIHNldCBvZiBgcG9pX25hbWVzYCBpbiB0aGUKK2hvdGVscyB0YWJsZS4gVGhpcyBpcyBhbiBlcXVhbGx5IHZhbGlkIGFwcHJvYWNoLiBZb3XigJlsbCBsZWFybiB0aHJvdWdoCitleHBlcmllbmNlIHdoaWNoIGFwcHJvYWNoIGlzIGJlc3QgZm9yIHlvdXIgYXBwbGljYXRpb24uCisKK1EzIGlzIGp1c3QgYSByZXZlcnNlIG9mIFEx4oCUbG9va2luZyBmb3IgcG9pbnRzIG9mIGludGVyZXN0IG5lYXIgYSBob3RlbCwKK3JhdGhlciB0aGFuIGhvdGVscyBuZWFyIGEgcG9pbnQgb2YgaW50ZXJlc3QuIFRoaXMgdGltZSwgaG93ZXZlciwgeW91CituZWVkIHRvIGFjY2VzcyB0aGUgZGV0YWlscyBvZiBlYWNoIHBvaW50IG9mIGludGVyZXN0LCBhcyByZXByZXNlbnRlZCBieQordGhlIGBwb2lzX2J5X2hvdGVsYCB0YWJsZS4gQXMgcHJldmlvdXNseSwgeW91IGFkZCB0aGUgcG9pbnQgb2YgaW50ZXJlc3QKK25hbWUgYXMgYSBjbHVzdGVyaW5nIGtleSB0byBndWFyYW50ZWUgdW5pcXVlbmVzcy4KKworQXQgdGhpcyBwb2ludCwgbGV04oCZcyBub3cgY29uc2lkZXIgaG93IHRvIHN1cHBvcnQgcXVlcnkgUTQgdG8gaGVscCB0aGUKK3VzZXIgZmluZCBhdmFpbGFibGUgcm9vbXMgYXQgYSBzZWxlY3RlZCBob3RlbCBmb3IgdGhlIG5pZ2h0cyB0aGV5IGFyZQoraW50ZXJlc3RlZCBpbiBzdGF5aW5nLiBOb3RlIHRoYXQgdGhpcyBxdWVyeSBpbnZvbHZlcyBib3RoIGEgc3RhcnQgZGF0ZQorYW5kIGFuIGVuZCBkYXRlLiBCZWNhdXNlIHlvdeKAmXJlIHF1ZXJ5aW5nIG92ZXIgYSByYW5nZSBpbnN0ZWFkIG9mIGEKK3NpbmdsZSBkYXRlLCB5b3Uga25vdyB0aGF0IHlvdeKAmWxsIG5lZWQgdG8gdXNlIHRoZSBkYXRlIGFzIGEgY2x1c3RlcmluZwora2V5LiBVc2UgdGhlIGBob3RlbF9pZGAgYXMgYSBwcmltYXJ5IGtleSB0byBncm91cCByb29tIGRhdGEgZm9yIGVhY2gKK2hvdGVsIG9uIGEgc2luZ2xlIHBhcnRpdGlvbiwgd2hpY2ggc2hvdWxkIGhlbHAgc2VhcmNoZXMgYmUgc3VwZXIgZmFzdC4KK0xldOKAmXMgY2FsbCB0aGlzIHRoZSBgYXZhaWxhYmxlX3Jvb21zX2J5X2hvdGVsX2RhdGVgIHRhYmxlLgorCitUbyBzdXBwb3J0IHNlYXJjaGluZyBvdmVyIGEgcmFuZ2UsIHVzZSBgY2x1c3RlcmluZyBjb2x1bW5zCis8Y2x1c3RlcmluZy1jb2x1bW5zPmAgdG8gc3RvcmUgYXR0cmlidXRlcyB0aGF0IHlvdSBuZWVkIHRvIGFjY2VzcyBpbiBhCityYW5nZSBxdWVyeS4gUmVtZW1iZXIgdGhhdCB0aGUgb3JkZXIgb2YgdGhlIGNsdXN0ZXJpbmcgY29sdW1ucyBpcworaW1wb3J0YW50LgorCitUaGUgZGVzaWduIG9mIHRoZSBgYXZhaWxhYmxlX3Jvb21zX2J5X2hvdGVsX2RhdGVgIHRhYmxlIGlzIGFuIGluc3RhbmNlCitvZiB0aGUgKndpZGUgcGFydGl0aW9uKiBwYXR0ZXJuLiBUaGlzIHBhdHRlcm4gaXMgc29tZXRpbWVzIGNhbGxlZCB0aGUKKyp3aWRlIHJvdyogcGF0dGVybiB3aGVuIGRpc2N1c3NpbmcgZGF0YWJhc2VzIHRoYXQgc3VwcG9ydCBzaW1pbGFyCittb2RlbHMsIGJ1dCB3aWRlIHBhcnRpdGlvbiBpcyBhIG1vcmUgYWNjdXJhdGUgZGVzY3JpcHRpb24gZnJvbSBhCitDYXNzYW5kcmEgcGVyc3BlY3RpdmUuIFRoZSBlc3NlbmNlIG9mIHRoZSBwYXR0ZXJuIGlzIHRvIGdyb3VwIG11bHRpcGxlCityZWxhdGVkIHJvd3MgaW4gYSBwYXJ0aXRpb24gaW4gb3JkZXIgdG8gc3VwcG9ydCBmYXN0IGFjY2VzcyB0byBtdWx0aXBsZQorcm93cyB3aXRoaW4gdGhlIHBhcnRpdGlvbiBpbiBhIHNpbmdsZSBxdWVyeS4KKworSW4gb3JkZXIgdG8gcm91bmQgb3V0IHRoZSBzaG9wcGluZyBwb3J0aW9uIG9mIHRoZSBkYXRhIG1vZGVsLCBhZGQgdGhlCitgYW1lbml0aWVzX2J5X3Jvb21gIHRhYmxlIHRvIHN1cHBvcnQgUTUuIFRoaXMgd2lsbCBhbGxvdyB1c2VycyB0byB2aWV3Cit0aGUgYW1lbml0aWVzIG9mIG9uZSBvZiB0aGUgcm9vbXMgdGhhdCBpcyBhdmFpbGFibGUgZm9yIHRoZSBkZXNpcmVkIHN0YXkKK2RhdGVzLgorCis9PSBSZXNlcnZhdGlvbiBMb2dpY2FsIERhdGEgTW9kZWwKKworTm93IGxldCdzIHN3aXRjaCBnZWFycyB0byBsb29rIGF0IHRoZSByZXNlcnZhdGlvbiBxdWVyaWVzLiBUaGUgZmlndXJlCitzaG93cyBhIGxvZ2ljYWwgZGF0YSBtb2RlbCBmb3IgcmVzZXJ2YXRpb25zLiBZb3XigJlsbCBub3RpY2UgdGhhdCB0aGVzZQordGFibGVzIHJlcHJlc2VudCBhIGRlbm9ybWFsaXplZCBkZXNpZ247IHRoZSBzYW1lIGRhdGEgYXBwZWFycyBpbgorbXVsdGlwbGUgdGFibGVzLCB3aXRoIGRpZmZlcmluZyBrZXlzLgorCitpbWFnZTo6ZGF0YS1tb2RlbGluZ19yZXNlcnZhdGlvbl9sb2dpY2FsLnBuZ1tpbWFnZV0KKworSW4gb3JkZXIgdG8gc2F0aXNmeSBRNiwgdGhlIGByZXNlcnZhdGlvbnNfYnlfZ3Vlc3RgIHRhYmxlIGNhbiBiZSB1c2VkIHRvCitsb29rIHVwIHRoZSByZXNlcnZhdGlvbiBieSBndWVzdCBuYW1lLiBZb3UgY291bGQgZW52aXNpb24gcXVlcnkgUTcgYmVpbmcKK3VzZWQgb24gYmVoYWxmIG9mIGEgZ3Vlc3Qgb24gYSBzZWxmLXNlcnZlIHdlYnNpdGUgb3IgYSBjYWxsIGNlbnRlciBhZ2VudAordHJ5aW5nIHRvIGFzc2lzdCB0aGUgZ3Vlc3QuIEJlY2F1c2UgdGhlIGd1ZXN0IG5hbWUgbWlnaHQgbm90IGJlIHVuaXF1ZSwKK3lvdSBpbmNsdWRlIHRoZSBndWVzdCBJRCBoZXJlIGFzIGEgY2x1c3RlcmluZyBjb2x1bW4gYXMgd2VsbC4KKworUTggYW5kIFE5IGluIHBhcnRpY3VsYXIgaGVscCB0byByZW1pbmQgeW91IHRvIGNyZWF0ZSBxdWVyaWVzIHRoYXQKK3N1cHBvcnQgdmFyaW91cyBzdGFrZWhvbGRlcnMgb2YgdGhlIGFwcGxpY2F0aW9uLCBub3QganVzdCBjdXN0b21lcnMgYnV0CitzdGFmZiBhcyB3ZWxsLCBhbmQgcGVyaGFwcyBldmVuIHRoZSBhbmFseXRpY3MgdGVhbSwgc3VwcGxpZXJzLCBhbmQgc28KK29uLgorCitUaGUgaG90ZWwgc3RhZmYgbWlnaHQgd2lzaCB0byBzZWUgYSByZWNvcmQgb2YgdXBjb21pbmcgcmVzZXJ2YXRpb25zIGJ5CitkYXRlIGluIG9yZGVyIHRvIGdldCBpbnNpZ2h0IGludG8gaG93IHRoZSBob3RlbCBpcyBwZXJmb3JtaW5nLCBzdWNoIGFzCit3aGF0IGRhdGVzIHRoZSBob3RlbCBpcyBzb2xkIG91dCBvciB1bmRlcnNvbGQuIFE4IHN1cHBvcnRzIHRoZSByZXRyaWV2YWwKK29mIHJlc2VydmF0aW9ucyBmb3IgYSBnaXZlbiBob3RlbCBieSBkYXRlLgorCitGaW5hbGx5LCB5b3UgY3JlYXRlIGEgYGd1ZXN0c2AgdGFibGUuIFRoaXMgcHJvdmlkZXMgYSBzaW5nbGUgbG9jYXRpb24KK3RoYXQgdXNlZCB0byBzdG9yZSBndWVzdCBpbmZvcm1hdGlvbi4gSW4gdGhpcyBjYXNlLCB5b3Ugc3BlY2lmeSBhCitzZXBhcmF0ZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgZ3Vlc3QgcmVjb3JkcywgYXMgaXQgaXMgbm90IHVuY29tbW9uIGZvcgorZ3Vlc3RzIHRvIGhhdmUgdGhlIHNhbWUgbmFtZS4gSW4gbWFueSBvcmdhbml6YXRpb25zLCBhIGN1c3RvbWVyIGRhdGFiYXNlCitzdWNoIGFzIHRoZSBgZ3Vlc3RzYCB0YWJsZSB3b3VsZCBiZSBwYXJ0IG9mIGEgc2VwYXJhdGUgY3VzdG9tZXIKK21hbmFnZW1lbnQgYXBwbGljYXRpb24sIHdoaWNoIGlzIHdoeSBvdGhlciBndWVzdCBhY2Nlc3MgcGF0dGVybnMgd2VyZQorb21pdHRlZCBmcm9tIHRoZSBleGFtcGxlLgorCis9PSBQYXR0ZXJucyBhbmQgQW50aS1QYXR0ZXJucworCitBcyB3aXRoIG90aGVyIHR5cGVzIG9mIHNvZnR3YXJlIGRlc2lnbiwgdGhlcmUgYXJlIHNvbWUgd2VsbC1rbm93bgorcGF0dGVybnMgYW5kIGFudGktcGF0dGVybnMgZm9yIGRhdGEgbW9kZWxpbmcgaW4gQ2Fzc2FuZHJhLiBZb3XigJl2ZQorYWxyZWFkeSB1c2VkIG9uZSBvZiB0aGUgbW9zdCBjb21tb24gcGF0dGVybnMgaW4gdGhpcyBob3RlbCBtb2RlbOKAlHRoZQord2lkZSBwYXJ0aXRpb24gcGF0dGVybi4KKworVGhlICp0aW1lIHNlcmllcyogcGF0dGVybiBpcyBhbiBleHRlbnNpb24gb2YgdGhlIHdpZGUgcGFydGl0aW9uIHBhdHRlcm4uCitJbiB0aGlzIHBhdHRlcm4sIGEgc2VyaWVzIG9mIG1lYXN1cmVtZW50cyBhdCBzcGVjaWZpYyB0aW1lIGludGVydmFscyBhcmUKK3N0b3JlZCBpbiBhIHdpZGUgcGFydGl0aW9uLCB3aGVyZSB0aGUgbWVhc3VyZW1lbnQgdGltZSBpcyB1c2VkIGFzIHBhcnQKK29mIHRoZSBwYXJ0aXRpb24ga2V5LiBUaGlzIHBhdHRlcm4gaXMgZnJlcXVlbnRseSB1c2VkIGluIGRvbWFpbnMKK2luY2x1ZGluZyBidXNpbmVzcyBhbmFseXNpcywgc2Vuc29yIGRhdGEgbWFuYWdlbWVudCwgYW5kIHNjaWVudGlmaWMKK2V4cGVyaW1lbnRzLgorCitUaGUgdGltZSBzZXJpZXMgcGF0dGVybiBpcyBhbHNvIHVzZWZ1bCBmb3IgZGF0YSBvdGhlciB0aGFuIG1lYXN1cmVtZW50cy4KK0NvbnNpZGVyIHRoZSBleGFtcGxlIG9mIGEgYmFua2luZyBhcHBsaWNhdGlvbi4gWW91IGNvdWxkIHN0b3JlIGVhY2gKK2N1c3RvbWVy4oCZcyBiYWxhbmNlIGluIGEgcm93LCBidXQgdGhhdCBtaWdodCBsZWFkIHRvIGEgbG90IG9mIHJlYWQgYW5kCit3cml0ZSBjb250ZW50aW9uIGFzIHZhcmlvdXMgY3VzdG9tZXJzIGNoZWNrIHRoZWlyIGJhbGFuY2Ugb3IgbWFrZQordHJhbnNhY3Rpb25zLiBZb3XigJlkIHByb2JhYmx5IGJlIHRlbXB0ZWQgdG8gd3JhcCBhIHRyYW5zYWN0aW9uIGFyb3VuZAord3JpdGVzIGp1c3QgdG8gcHJvdGVjdCB0aGUgYmFsYW5jZSBmcm9tIGJlaW5nIHVwZGF0ZWQgaW4gZXJyb3IuIEluCitjb250cmFzdCwgYSB0aW1lIHNlcmllc+KAk3N0eWxlIGRlc2lnbiB3b3VsZCBzdG9yZSBlYWNoIHRyYW5zYWN0aW9uIGFzIGEKK3RpbWVzdGFtcGVkIHJvdyBhbmQgbGVhdmUgdGhlIHdvcmsgb2YgY2FsY3VsYXRpbmcgdGhlIGN1cnJlbnQgYmFsYW5jZSB0bwordGhlIGFwcGxpY2F0aW9uLgorCitPbmUgZGVzaWduIHRyYXAgdGhhdCBtYW55IG5ldyB1c2VycyBmYWxsIGludG8gaXMgYXR0ZW1wdGluZyB0byB1c2UKK0Nhc3NhbmRyYSBhcyBhIHF1ZXVlLiBFYWNoIGl0ZW0gaW4gdGhlIHF1ZXVlIGlzIHN0b3JlZCB3aXRoIGEgdGltZXN0YW1wCitpbiBhIHdpZGUgcGFydGl0aW9uLiBJdGVtcyBhcmUgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWUgYW5kIHJlYWQKK2Zyb20gdGhlIGZyb250LCBiZWluZyBkZWxldGVkIGFmdGVyIHRoZXkgYXJlIHJlYWQuIFRoaXMgaXMgYSBkZXNpZ24gdGhhdAorc2VlbXMgYXR0cmFjdGl2ZSwgZXNwZWNpYWxseSBnaXZlbiBpdHMgYXBwYXJlbnQgc2ltaWxhcml0eSB0byB0aGUgdGltZQorc2VyaWVzIHBhdHRlcm4uIFRoZSBwcm9ibGVtIHdpdGggdGhpcyBhcHByb2FjaCBpcyB0aGF0IHRoZSBkZWxldGVkIGl0ZW1zCithcmUgbm93IGB0b21ic3RvbmVzIDxhc3luY2gtZGVsZXRlcz5gIHRoYXQgQ2Fzc2FuZHJhIG11c3Qgc2NhbiBwYXN0IGluCitvcmRlciB0byByZWFkIGZyb20gdGhlIGZyb250IG9mIHRoZSBxdWV1ZS4gT3ZlciB0aW1lLCBhIGdyb3dpbmcgbnVtYmVyCitvZiB0b21ic3RvbmVzIGJlZ2lucyB0byBkZWdyYWRlIHJlYWQgcGVyZm9ybWFuY2UuCisKK1RoZSBxdWV1ZSBhbnRpLXBhdHRlcm4gc2VydmVzIGFzIGEgcmVtaW5kZXIgdGhhdCBhbnkgZGVzaWduIHRoYXQgcmVsaWVzCitvbiB0aGUgZGVsZXRpb24gb2YgZGF0YSBpcyBwb3RlbnRpYWxseSBhIHBvb3JseSBwZXJmb3JtaW5nIGRlc2lnbi4KKworX01hdGVyaWFsIGFkYXB0ZWQgZnJvbSBDYXNzYW5kcmEsIFRoZSBEZWZpbml0aXZlIEd1aWRlLiBQdWJsaXNoZWQgYnkKK08nUmVpbGx5IE1lZGlhLCBJbmMuIENvcHlyaWdodCDCqSAyMDIwIEplZmYgQ2FycGVudGVyLCBFYmVuIEhld2l0dC4gQWxsCityaWdodHMgcmVzZXJ2ZWQuIFVzZWQgd2l0aCBwZXJtaXNzaW9uLl8KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19waHlzaWNhbC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX3BoeXNpY2FsLmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA2Njk3MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19waHlzaWNhbC5hZG9jCkBAIC0wLDAgKzEsOTYgQEAKKz0gUGh5c2ljYWwgRGF0YSBNb2RlbGluZworCitPbmNlIHlvdSBoYXZlIGEgbG9naWNhbCBkYXRhIG1vZGVsIGRlZmluZWQsIGNyZWF0aW5nIHRoZSBwaHlzaWNhbCBtb2RlbAoraXMgYSByZWxhdGl2ZWx5IHNpbXBsZSBwcm9jZXNzLgorCitZb3Ugd2FsayB0aHJvdWdoIGVhY2ggb2YgdGhlIGxvZ2ljYWwgbW9kZWwgdGFibGVzLCBhc3NpZ25pbmcgdHlwZXMgdG8KK2VhY2ggaXRlbS4gWW91IGNhbiB1c2UgYW55IHZhbGlkIGBDUUwgZGF0YSB0eXBlIDxkYXRhLXR5cGVzPmAsIGluY2x1ZGluZwordGhlIGJhc2ljIHR5cGVzLCBjb2xsZWN0aW9ucywgYW5kIHVzZXItZGVmaW5lZCB0eXBlcy4gWW91IG1heSBpZGVudGlmeQorYWRkaXRpb25hbCB1c2VyLWRlZmluZWQgdHlwZXMgdGhhdCBjYW4gYmUgY3JlYXRlZCB0byBzaW1wbGlmeSB5b3VyCitkZXNpZ24uCisKK0FmdGVyIHlvdeKAmXZlIGFzc2lnbmVkIGRhdGEgdHlwZXMsIHlvdSBhbmFseXplIHRoZSBtb2RlbCBieSBwZXJmb3JtaW5nCitzaXplIGNhbGN1bGF0aW9ucyBhbmQgdGVzdGluZyBvdXQgaG93IHRoZSBtb2RlbCB3b3Jrcy4gWW91IG1heSBtYWtlIHNvbWUKK2FkanVzdG1lbnRzIGJhc2VkIG9uIHlvdXIgZmluZGluZ3MuIE9uY2UgYWdhaW4gbGV0J3MgY292ZXIgdGhlIGRhdGEKK21vZGVsaW5nIHByb2Nlc3MgaW4gbW9yZSBkZXRhaWwgYnkgd29ya2luZyB0aHJvdWdoIGFuIGV4YW1wbGUuCisKK0JlZm9yZSBnZXR0aW5nIHN0YXJ0ZWQsIGxldOKAmXMgbG9vayBhdCBhIGZldyBhZGRpdGlvbnMgdG8gdGhlIENoZWJvdGtvCitub3RhdGlvbiBmb3IgcGh5c2ljYWwgZGF0YSBtb2RlbHMuIFRvIGRyYXcgcGh5c2ljYWwgbW9kZWxzLCB5b3UgbmVlZCB0bworYmUgYWJsZSB0byBhZGQgdGhlIHR5cGluZyBpbmZvcm1hdGlvbiBmb3IgZWFjaCBjb2x1bW4uIFRoaXMgZmlndXJlIHNob3dzCit0aGUgYWRkaXRpb24gb2YgYSB0eXBlIGZvciBlYWNoIGNvbHVtbiBpbiBhIHNhbXBsZSB0YWJsZS4KKworaW1hZ2U6OmRhdGEtbW9kZWxpbmdfY2hlYm90a29fcGh5c2ljYWwucG5nW2ltYWdlXQorCitUaGUgZmlndXJlIGluY2x1ZGVzIGEgZGVzaWduYXRpb24gb2YgdGhlIGtleXNwYWNlIGNvbnRhaW5pbmcgZWFjaCB0YWJsZQorYW5kIHZpc3VhbCBjdWVzIGZvciBjb2x1bW5zIHJlcHJlc2VudGVkIHVzaW5nIGNvbGxlY3Rpb25zIGFuZAordXNlci1kZWZpbmVkIHR5cGVzLiBOb3RlIHRoZSBkZXNpZ25hdGlvbiBvZiBzdGF0aWMgY29sdW1ucyBhbmQgc2Vjb25kYXJ5CitpbmRleCBjb2x1bW5zLiBUaGVyZSBpcyBubyByZXN0cmljdGlvbiBvbiBhc3NpZ25pbmcgdGhlc2UgYXMgcGFydCBvZiBhCitsb2dpY2FsIG1vZGVsLCBidXQgdGhleSBhcmUgdHlwaWNhbGx5IG1vcmUgb2YgYSBwaHlzaWNhbCBkYXRhIG1vZGVsaW5nCitjb25jZXJuLgorCis9PSBIb3RlbCBQaHlzaWNhbCBEYXRhIE1vZGVsCisKK05vdyBsZXTigJlzIGdldCB0byB3b3JrIG9uIHRoZSBwaHlzaWNhbCBtb2RlbC4gRmlyc3QsIHlvdSBuZWVkIGtleXNwYWNlcwordG8gY29udGFpbiB0aGUgdGFibGVzLiBUbyBrZWVwIHRoZSBkZXNpZ24gcmVsYXRpdmVseSBzaW1wbGUsIGNyZWF0ZSBhCitgaG90ZWxgIGtleXNwYWNlIHRvIGNvbnRhaW4gdGFibGVzIGZvciBob3RlbCBhbmQgYXZhaWxhYmlsaXR5IGRhdGEsIGFuZAorYSBgcmVzZXJ2YXRpb25gIGtleXNwYWNlIHRvIGNvbnRhaW4gdGFibGVzIGZvciByZXNlcnZhdGlvbiBhbmQgZ3Vlc3QKK2RhdGEuIEluIGEgcmVhbCBzeXN0ZW0sIHlvdSBtaWdodCBkaXZpZGUgdGhlIHRhYmxlcyBhY3Jvc3MgZXZlbiBtb3JlCitrZXlzcGFjZXMgaW4gb3JkZXIgdG8gc2VwYXJhdGUgY29uY2VybnMuCisKK0ZvciB0aGUgYGhvdGVsc2AgdGFibGUsIHVzZSBDYXNzYW5kcmHigJlzIGB0ZXh0YCB0eXBlIHRvIHJlcHJlc2VudCB0aGUKK2hvdGVs4oCZcyBgaWRgLiBGb3IgdGhlIGFkZHJlc3MsIGNyZWF0ZSBhbiBgYWRkcmVzc2AgdXNlciBkZWZpbmVkIHR5cGUuCitVc2UgdGhlIGB0ZXh0YCB0eXBlIHRvIHJlcHJlc2VudCB0aGUgcGhvbmUgbnVtYmVyLCBhcyB0aGVyZSBpcworY29uc2lkZXJhYmxlIHZhcmlhbmNlIGluIHRoZSBmb3JtYXR0aW5nIG9mIG51bWJlcnMgYmV0d2VlbiBjb3VudHJpZXMuCisKK1doaWxlIGl0IHdvdWxkIG1ha2Ugc2Vuc2UgdG8gdXNlIHRoZSBgdXVpZGAgdHlwZSBmb3IgYXR0cmlidXRlcyBzdWNoIGFzCit0aGUgYGhvdGVsX2lkYCwgdGhpcyBkb2N1bWVudCB1c2VzIG1vc3RseSBgdGV4dGAgYXR0cmlidXRlcyBhcworaWRlbnRpZmllcnMsIHRvIGtlZXAgdGhlIHNhbXBsZXMgc2ltcGxlIGFuZCByZWFkYWJsZS4gRm9yIGV4YW1wbGUsIGEKK2NvbW1vbiBjb252ZW50aW9uIGluIHRoZSBob3NwaXRhbGl0eSBpbmR1c3RyeSBpcyB0byByZWZlcmVuY2UgcHJvcGVydGllcworYnkgc2hvcnQgY29kZXMgbGlrZSAiQVoxMjMiIG9yICJOWTIyOSIuIFRoaXMgZXhhbXBsZSB1c2VzIHRoZXNlIHZhbHVlcworZm9yIGBob3RlbF9pZHNgLCB3aGlsZSBhY2tub3dsZWRnaW5nIHRoZXkgYXJlIG5vdCBuZWNlc3NhcmlseSBnbG9iYWxseQordW5pcXVlLgorCitZb3XigJlsbCBmaW5kIHRoYXQgaXTigJlzIG9mdGVuIGhlbHBmdWwgdG8gdXNlIHVuaXF1ZSBJRHMgdG8gdW5pcXVlbHkKK3JlZmVyZW5jZSBlbGVtZW50cywgYW5kIHRvIHVzZSB0aGVzZSBgdXVpZHNgIGFzIHJlZmVyZW5jZXMgaW4gdGFibGVzCityZXByZXNlbnRpbmcgb3RoZXIgZW50aXRpZXMuIFRoaXMgaGVscHMgdG8gbWluaW1pemUgY291cGxpbmcgYmV0d2VlbgorZGlmZmVyZW50IGVudGl0eSB0eXBlcy4gVGhpcyBtYXkgcHJvdmUgZXNwZWNpYWxseSBlZmZlY3RpdmUgaWYgeW91IGFyZQordXNpbmcgYSBtaWNyb3NlcnZpY2UgYXJjaGl0ZWN0dXJhbCBzdHlsZSBmb3IgeW91ciBhcHBsaWNhdGlvbiwgaW4gd2hpY2gKK3RoZXJlIGFyZSBzZXBhcmF0ZSBzZXJ2aWNlcyByZXNwb25zaWJsZSBmb3IgZWFjaCBlbnRpdHkgdHlwZS4KKworQXMgeW91IHdvcmsgdG8gY3JlYXRlIHBoeXNpY2FsIHJlcHJlc2VudGF0aW9ucyBvZiB2YXJpb3VzIHRhYmxlcyBpbiB0aGUKK2xvZ2ljYWwgaG90ZWwgZGF0YSBtb2RlbCwgeW91IHVzZSB0aGUgc2FtZSBhcHByb2FjaC4gVGhlIHJlc3VsdGluZworZGVzaWduIGlzIHNob3duIGluIHRoaXMgZmlndXJlOgorCitpbWFnZTo6ZGF0YS1tb2RlbGluZ19ob3RlbF9waHlzaWNhbC5wbmdbaW1hZ2VdCisKK05vdGUgdGhhdCB0aGUgYGFkZHJlc3NgIHR5cGUgaXMgYWxzbyBpbmNsdWRlZCBpbiB0aGUgZGVzaWduLiBJdCBpcworZGVzaWduYXRlZCB3aXRoIGFuIGFzdGVyaXNrIHRvIGRlbm90ZSB0aGF0IGl0IGlzIGEgdXNlci1kZWZpbmVkIHR5cGUsCithbmQgaGFzIG5vIHByaW1hcnkga2V5IGNvbHVtbnMgaWRlbnRpZmllZC4gVGhpcyB0eXBlIGlzIHVzZWQgaW4gdGhlCitgaG90ZWxzYCBhbmQgYGhvdGVsc19ieV9wb2lgIHRhYmxlcy4KKworVXNlci1kZWZpbmVkIHR5cGVzIGFyZSBmcmVxdWVudGx5IHVzZWQgdG8gaGVscCByZWR1Y2UgZHVwbGljYXRpb24gb2YKK25vbi1wcmltYXJ5IGtleSBjb2x1bW5zLCBhcyB3YXMgZG9uZSB3aXRoIHRoZSBgYWRkcmVzc2AgdXNlci1kZWZpbmVkCit0eXBlLiBUaGlzIGNhbiByZWR1Y2UgY29tcGxleGl0eSBpbiB0aGUgZGVzaWduLgorCitSZW1lbWJlciB0aGF0IHRoZSBzY29wZSBvZiBhIFVEVCBpcyB0aGUga2V5c3BhY2UgaW4gd2hpY2ggaXQgaXMgZGVmaW5lZC4KK1RvIHVzZSBgYWRkcmVzc2AgaW4gdGhlIGByZXNlcnZhdGlvbmAga2V5c3BhY2UgZGVmaW5lZCBiZWxvdyBkZXNpZ24sCit5b3XigJlsbCBoYXZlIHRvIGRlY2xhcmUgaXQgYWdhaW4uIFRoaXMgaXMganVzdCBvbmUgb2YgdGhlIG1hbnkgdHJhZGUtb2ZmcworeW91IGhhdmUgdG8gbWFrZSBpbiBkYXRhIG1vZGVsIGRlc2lnbi4KKworPT0gUmVzZXJ2YXRpb24gUGh5c2ljYWwgRGF0YSBNb2RlbAorCitOb3csIGxldOKAmXMgZXhhbWluZSByZXNlcnZhdGlvbiB0YWJsZXMgaW4gdGhlIGRlc2lnbi4gUmVtZW1iZXIgdGhhdCB0aGUKK2xvZ2ljYWwgbW9kZWwgY29udGFpbmVkIHRocmVlIGRlbm9ybWFsaXplZCB0YWJsZXMgdG8gc3VwcG9ydCBxdWVyaWVzIGZvcgorcmVzZXJ2YXRpb25zIGJ5IGNvbmZpcm1hdGlvbiBudW1iZXIsIGd1ZXN0LCBhbmQgaG90ZWwgYW5kIGRhdGUuIEZvciB0aGUKK2ZpcnN0IGl0ZXJhdGlvbiBvZiB5b3VyIHBoeXNpY2FsIGRhdGEgbW9kZWwgZGVzaWduLCBhc3N1bWUgeW91J3JlIGdvaW5nCit0byBtYW5hZ2UgdGhpcyBkZW5vcm1hbGl6YXRpb24gbWFudWFsbHkuIE5vdGUgdGhhdCB0aGlzIGRlc2lnbiBjb3VsZCBiZQorcmV2aXNlZCB0byB1c2UgQ2Fzc2FuZHJh4oCZcyAoZXhwZXJpbWVudGFsKSBtYXRlcmlhbGl6ZWQgdmlldyBmZWF0dXJlLgorCitpbWFnZTo6ZGF0YS1tb2RlbGluZ19yZXNlcnZhdGlvbl9waHlzaWNhbC5wbmdbaW1hZ2VdCisKK05vdGUgdGhhdCB0aGUgYGFkZHJlc3NgIHR5cGUgaXMgcmVwcm9kdWNlZCBpbiB0aGlzIGtleXNwYWNlIGFuZAorYGd1ZXN0X2lkYCBpcyBtb2RlbGVkIGFzIGEgYHV1aWRgIHR5cGUgaW4gYWxsIG9mIHRoZSB0YWJsZXMuCisKK19NYXRlcmlhbCBhZGFwdGVkIGZyb20gQ2Fzc2FuZHJhLCBUaGUgRGVmaW5pdGl2ZSBHdWlkZS4gUHVibGlzaGVkIGJ5CitPJ1JlaWxseSBNZWRpYSwgSW5jLiBDb3B5cmlnaHQgwqkgMjAyMCBKZWZmIENhcnBlbnRlciwgRWJlbiBIZXdpdHQuIEFsbAorcmlnaHRzIHJlc2VydmVkLiBVc2VkIHdpdGggcGVybWlzc2lvbi5fCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfcXVlcmllcy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX3F1ZXJpZXMuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mzc4MDA2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX3F1ZXJpZXMuYWRvYwpAQCAtMCwwICsxLDYwIEBACis9IERlZmluaW5nIEFwcGxpY2F0aW9uIFF1ZXJpZXMKKworTGV04oCZcyB0cnkgdGhlIHF1ZXJ5LWZpcnN0IGFwcHJvYWNoIHRvIHN0YXJ0IGRlc2lnbmluZyB0aGUgZGF0YSBtb2RlbCBmb3IKK2EgaG90ZWwgYXBwbGljYXRpb24uIFRoZSB1c2VyIGludGVyZmFjZSBkZXNpZ24gZm9yIHRoZSBhcHBsaWNhdGlvbiBpcworb2Z0ZW4gYSBncmVhdCBhcnRpZmFjdCB0byB1c2UgdG8gYmVnaW4gaWRlbnRpZnlpbmcgcXVlcmllcy4gTGV04oCZcyBhc3N1bWUKK3RoYXQgeW914oCZdmUgdGFsa2VkIHdpdGggdGhlIHByb2plY3Qgc3Rha2Vob2xkZXJzIGFuZCB5b3VyIFVYIGRlc2lnbmVycworaGF2ZSBwcm9kdWNlZCB1c2VyIGludGVyZmFjZSBkZXNpZ25zIG9yIHdpcmVmcmFtZXMgZm9yIHRoZSBrZXkgdXNlCitjYXNlcy4gWW914oCZbGwgbGlrZWx5IGhhdmUgYSBsaXN0IG9mIHNob3BwaW5nIHF1ZXJpZXMgbGlrZSB0aGUgZm9sbG93aW5nOgorCisqIFExLiBGaW5kIGhvdGVscyBuZWFyIGEgZ2l2ZW4gcG9pbnQgb2YgaW50ZXJlc3QuCisqIFEyLiBGaW5kIGluZm9ybWF0aW9uIGFib3V0IGEgZ2l2ZW4gaG90ZWwsIHN1Y2ggYXMgaXRzIG5hbWUgYW5kCitsb2NhdGlvbi4KKyogUTMuIEZpbmQgcG9pbnRzIG9mIGludGVyZXN0IG5lYXIgYSBnaXZlbiBob3RlbC4KKyogUTQuIEZpbmQgYW4gYXZhaWxhYmxlIHJvb20gaW4gYSBnaXZlbiBkYXRlIHJhbmdlLgorKiBRNS4gRmluZCB0aGUgcmF0ZSBhbmQgYW1lbml0aWVzIGZvciBhIHJvb20uCisKK0l0IGlzIG9mdGVuIGhlbHBmdWwgdG8gYmUgYWJsZSB0byByZWZlciB0byBxdWVyaWVzIGJ5IGEgc2hvcnRoYW5kIG51bWJlcgorcmF0aGVyIHRoYXQgZXhwbGFpbmluZyB0aGVtIGluIGZ1bGwuIFRoZSBxdWVyaWVzIGxpc3RlZCBoZXJlIGFyZQorbnVtYmVyZWQgUTEsIFEyLCBhbmQgc28gb24sIHdoaWNoIGlzIGhvdyB0aGV5IGFyZSByZWZlcmVuY2VkIGluIGRpYWdyYW1zCit0aHJvdWdob3V0IHRoZSBleGFtcGxlLgorCitOb3cgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHRvIGJlIGEgc3VjY2VzcywgeW914oCZbGwgY2VydGFpbmx5IHdhbnQKK2N1c3RvbWVycyB0byBiZSBhYmxlIHRvIGJvb2sgcmVzZXJ2YXRpb25zIGF0IGhvdGVscy4gVGhpcyBpbmNsdWRlcyBzdGVwcworc3VjaCBhcyBzZWxlY3RpbmcgYW4gYXZhaWxhYmxlIHJvb20gYW5kIGVudGVyaW5nIHRoZWlyIGd1ZXN0CitpbmZvcm1hdGlvbi4gU28gY2xlYXJseSB5b3Ugd2lsbCBhbHNvIG5lZWQgc29tZSBxdWVyaWVzIHRoYXQgYWRkcmVzcyB0aGUKK3Jlc2VydmF0aW9uIGFuZCBndWVzdCBlbnRpdGllcyBmcm9tIHRoZSBjb25jZXB0dWFsIGRhdGEgbW9kZWwuIEV2ZW4KK2hlcmUsIGhvd2V2ZXIsIHlvdeKAmWxsIHdhbnQgdG8gdGhpbmsgbm90IG9ubHkgZnJvbSB0aGUgY3VzdG9tZXIKK3BlcnNwZWN0aXZlIGluIHRlcm1zIG9mIGhvdyB0aGUgZGF0YSBpcyB3cml0dGVuLCBidXQgYWxzbyBpbiB0ZXJtcyBvZgoraG93IHRoZSBkYXRhIHdpbGwgYmUgcXVlcmllZCBieSBkb3duc3RyZWFtIHVzZSBjYXNlcy4KKworWW91IG5hdHVyYWwgdGVuZGVuY3kgYXMgbWlnaHQgYmUgdG8gZm9jdXMgZmlyc3Qgb24gZGVzaWduaW5nIHRoZSB0YWJsZXMKK3RvIHN0b3JlIHJlc2VydmF0aW9uIGFuZCBndWVzdCByZWNvcmRzLCBhbmQgb25seSB0aGVuIHN0YXJ0IHRoaW5raW5nCithYm91dCB0aGUgcXVlcmllcyB0aGF0IHdvdWxkIGFjY2VzcyB0aGVtLiBZb3UgbWF5IGhhdmUgZmVsdCBhIHNpbWlsYXIKK3RlbnNpb24gYWxyZWFkeSB3aGVuIGRpc2N1c3NpbmcgdGhlIHNob3BwaW5nIHF1ZXJpZXMgYmVmb3JlLCB0aGlua2luZwor4oCcYnV0IHdoZXJlIGRpZCB0aGUgaG90ZWwgYW5kIHBvaW50IG9mIGludGVyZXN0IGRhdGEgY29tZSBmcm9tP+KAnSBEb27igJl0Cit3b3JyeSwgeW91IHdpbGwgc2VlIHNvb24gZW5vdWdoLiBIZXJlIGFyZSBzb21lIHF1ZXJpZXMgdGhhdCBkZXNjcmliZSBob3cKK3VzZXJzIHdpbGwgYWNjZXNzIHJlc2VydmF0aW9uczoKKworKiBRNi4gTG9va3VwIGEgcmVzZXJ2YXRpb24gYnkgY29uZmlybWF0aW9uIG51bWJlci4KKyogUTcuIExvb2t1cCBhIHJlc2VydmF0aW9uIGJ5IGhvdGVsLCBkYXRlLCBhbmQgZ3Vlc3QgbmFtZS4KKyogUTguIExvb2t1cCBhbGwgcmVzZXJ2YXRpb25zIGJ5IGd1ZXN0IG5hbWUuCisqIFE5LiBWaWV3IGd1ZXN0IGRldGFpbHMuCisKK0FsbCBvZiB0aGUgcXVlcmllcyBhcmUgc2hvd24gaW4gdGhlIGNvbnRleHQgb2YgdGhlIHdvcmtmbG93IG9mIHRoZQorYXBwbGljYXRpb24gaW4gdGhlIGZpZ3VyZSBiZWxvdy4gRWFjaCBib3ggb24gdGhlIGRpYWdyYW0gcmVwcmVzZW50cyBhCitzdGVwIGluIHRoZSBhcHBsaWNhdGlvbiB3b3JrZmxvdywgd2l0aCBhcnJvd3MgaW5kaWNhdGluZyB0aGUgZmxvd3MKK2JldHdlZW4gc3RlcHMgYW5kIHRoZSBhc3NvY2lhdGVkIHF1ZXJ5LiBJZiB5b3XigJl2ZSBtb2RlbGVkIHRoZQorYXBwbGljYXRpb24gd2VsbCwgZWFjaCBzdGVwIG9mIHRoZSB3b3JrZmxvdyBhY2NvbXBsaXNoZXMgYSB0YXNrIHRoYXQKK+KAnHVubG9ja3PigJ0gc3Vic2VxdWVudCBzdGVwcy4gRm9yIGV4YW1wbGUsIHRoZSDigJxWaWV3IGhvdGVscyBuZWFyIFBPSeKAnSB0YXNrCitoZWxwcyB0aGUgYXBwbGljYXRpb24gbGVhcm4gYWJvdXQgc2V2ZXJhbCBob3RlbHMsIGluY2x1ZGluZyB0aGVpciB1bmlxdWUKK2tleXMuIFRoZSBrZXkgZm9yIGEgc2VsZWN0ZWQgaG90ZWwgbWF5IGJlIHVzZWQgYXMgcGFydCBvZiBRMiwgaW4gb3JkZXIKK3RvIG9idGFpbiBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgaG90ZWwuIFRoZSBhY3Qgb2YgYm9va2luZyBhIHJvb20KK2NyZWF0ZXMgYSByZXNlcnZhdGlvbiByZWNvcmQgdGhhdCBtYXkgYmUgYWNjZXNzZWQgYnkgdGhlIGd1ZXN0IGFuZCBob3RlbAorc3RhZmYgYXQgYSBsYXRlciB0aW1lIHRocm91Z2ggdmFyaW91cyBhZGRpdGlvbmFsIHF1ZXJpZXMuCisKK2ltYWdlOjpkYXRhLW1vZGVsaW5nX2hvdGVsX3F1ZXJpZXMucG5nW2ltYWdlXQorCitfTWF0ZXJpYWwgYWRhcHRlZCBmcm9tIENhc3NhbmRyYSwgVGhlIERlZmluaXRpdmUgR3VpZGUuIFB1Ymxpc2hlZCBieQorTydSZWlsbHkgTWVkaWEsIEluYy4gQ29weXJpZ2h0IMKpIDIwMjAgSmVmZiBDYXJwZW50ZXIsIEViZW4gSGV3aXR0LiBBbGwKK3JpZ2h0cyByZXNlcnZlZC4gVXNlZCB3aXRoIHBlcm1pc3Npb24uXwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX3JkYm1zLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfcmRibXMuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDAwN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX3JkYm1zLmFkb2MKQEAgLTAsMCArMSwxNDQgQEAKKz0gUkRCTVMgRGVzaWduCisKK1doZW4geW91IHNldCBvdXQgdG8gYnVpbGQgYSBuZXcgZGF0YS1kcml2ZW4gYXBwbGljYXRpb24gdGhhdCB3aWxsIHVzZSBhCityZWxhdGlvbmFsIGRhdGFiYXNlLCB5b3UgbWlnaHQgc3RhcnQgYnkgbW9kZWxpbmcgdGhlIGRvbWFpbiBhcyBhIHNldCBvZgorcHJvcGVybHkgbm9ybWFsaXplZCB0YWJsZXMgYW5kIHVzZSBmb3JlaWduIGtleXMgdG8gcmVmZXJlbmNlIHJlbGF0ZWQKK2RhdGEgaW4gb3RoZXIgdGFibGVzLgorCitUaGUgZmlndXJlIGJlbG93IHNob3dzIGhvdyB5b3UgbWlnaHQgcmVwcmVzZW50IHRoZSBkYXRhIHN0b3JhZ2UgZm9yIHlvdXIKK2FwcGxpY2F0aW9uIHVzaW5nIGEgcmVsYXRpb25hbCBkYXRhYmFzZSBtb2RlbC4gVGhlIHJlbGF0aW9uYWwgbW9kZWwKK2luY2x1ZGVzIGEgY291cGxlIG9mIOKAnGpvaW7igJ0gdGFibGVzIGluIG9yZGVyIHRvIHJlYWxpemUgdGhlIG1hbnktdG8tbWFueQorcmVsYXRpb25zaGlwcyBmcm9tIHRoZSBjb25jZXB0dWFsIG1vZGVsIG9mIGhvdGVscy10by1wb2ludHMgb2YgaW50ZXJlc3QsCityb29tcy10by1hbWVuaXRpZXMsIHJvb21zLXRvLWF2YWlsYWJpbGl0eSwgYW5kIGd1ZXN0cy10by1yb29tcyAodmlhIGEKK3Jlc2VydmF0aW9uKS4KKworaW1hZ2U6OmRhdGEtbW9kZWxpbmdfaG90ZWxfcmVsYXRpb25hbC5wbmdbaW1hZ2VdCisKKz09IERlc2lnbiBEaWZmZXJlbmNlcyBCZXR3ZWVuIFJEQk1TIGFuZCBDYXNzYW5kcmEKKworTGV04oCZcyB0YWtlIGEgbWludXRlIHRvIGhpZ2hsaWdodCBzb21lIG9mIHRoZSBrZXkgZGlmZmVyZW5jZXMgaW4gZG9pbmcKK2RhdGEgbW9kZWxpbmcgZm9yIENhc3NhbmRyYSB2ZXJzdXMgYSByZWxhdGlvbmFsIGRhdGFiYXNlLgorCis9PT0gTm8gam9pbnMKKworWW91IGNhbm5vdCBwZXJmb3JtIGpvaW5zIGluIENhc3NhbmRyYS4gSWYgeW91IGhhdmUgZGVzaWduZWQgYSBkYXRhIG1vZGVsCithbmQgZmluZCB0aGF0IHlvdSBuZWVkIHNvbWV0aGluZyBsaWtlIGEgam9pbiwgeW914oCZbGwgaGF2ZSB0byBlaXRoZXIgZG8KK3RoZSB3b3JrIG9uIHRoZSBjbGllbnQgc2lkZSwgb3IgY3JlYXRlIGEgZGVub3JtYWxpemVkIHNlY29uZCB0YWJsZSB0aGF0CityZXByZXNlbnRzIHRoZSBqb2luIHJlc3VsdHMgZm9yIHlvdS4gVGhpcyBsYXR0ZXIgb3B0aW9uIGlzIHByZWZlcnJlZCBpbgorQ2Fzc2FuZHJhIGRhdGEgbW9kZWxpbmcuIFBlcmZvcm1pbmcgam9pbnMgb24gdGhlIGNsaWVudCBzaG91bGQgYmUgYSB2ZXJ5CityYXJlIGNhc2U7IHlvdSByZWFsbHkgd2FudCB0byBkdXBsaWNhdGUgKGRlbm9ybWFsaXplKSB0aGUgZGF0YSBpbnN0ZWFkLgorCis9PT0gTm8gcmVmZXJlbnRpYWwgaW50ZWdyaXR5CisKK0FsdGhvdWdoIENhc3NhbmRyYSBzdXBwb3J0cyBmZWF0dXJlcyBzdWNoIGFzIGxpZ2h0d2VpZ2h0IHRyYW5zYWN0aW9ucworYW5kIGJhdGNoZXMsIENhc3NhbmRyYSBpdHNlbGYgaGFzIG5vIGNvbmNlcHQgb2YgcmVmZXJlbnRpYWwgaW50ZWdyaXR5CithY3Jvc3MgdGFibGVzLiBJbiBhIHJlbGF0aW9uYWwgZGF0YWJhc2UsIHlvdSBjb3VsZCBzcGVjaWZ5IGZvcmVpZ24ga2V5cworaW4gYSB0YWJsZSB0byByZWZlcmVuY2UgdGhlIHByaW1hcnkga2V5IG9mIGEgcmVjb3JkIGluIGFub3RoZXIgdGFibGUuCitCdXQgQ2Fzc2FuZHJhIGRvZXMgbm90IGVuZm9yY2UgdGhpcy4gSXQgaXMgc3RpbGwgYSBjb21tb24gZGVzaWduCityZXF1aXJlbWVudCB0byBzdG9yZSBJRHMgcmVsYXRlZCB0byBvdGhlciBlbnRpdGllcyBpbiB5b3VyIHRhYmxlcywgYnV0CitvcGVyYXRpb25zIHN1Y2ggYXMgY2FzY2FkaW5nIGRlbGV0ZXMgYXJlIG5vdCBhdmFpbGFibGUuCisKKz09PSBEZW5vcm1hbGl6YXRpb24KKworSW4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24sIHlvdSBhcmUgb2Z0ZW4gdGF1Z2h0IHRoZSBpbXBvcnRhbmNlIG9mCitub3JtYWxpemF0aW9uLiBUaGlzIGlzIG5vdCBhbiBhZHZhbnRhZ2Ugd2hlbiB3b3JraW5nIHdpdGggQ2Fzc2FuZHJhCitiZWNhdXNlIGl0IHBlcmZvcm1zIGJlc3Qgd2hlbiB0aGUgZGF0YSBtb2RlbCBpcyBkZW5vcm1hbGl6ZWQuIEl0IGlzCitvZnRlbiB0aGUgY2FzZSB0aGF0IGNvbXBhbmllcyBlbmQgdXAgZGVub3JtYWxpemluZyBkYXRhIGluIHJlbGF0aW9uYWwKK2RhdGFiYXNlcyBhcyB3ZWxsLiBUaGVyZSBhcmUgdHdvIGNvbW1vbiByZWFzb25zIGZvciB0aGlzLiBPbmUgaXMKK3BlcmZvcm1hbmNlLiBDb21wYW5pZXMgc2ltcGx5IGNhbuKAmXQgZ2V0IHRoZSBwZXJmb3JtYW5jZSB0aGV5IG5lZWQgd2hlbgordGhleSBoYXZlIHRvIGRvIHNvIG1hbnkgam9pbnMgb24geWVhcnPigJkgd29ydGggb2YgZGF0YSwgc28gdGhleQorZGVub3JtYWxpemUgYWxvbmcgdGhlIGxpbmVzIG9mIGtub3duIHF1ZXJpZXMuIFRoaXMgZW5kcyB1cCB3b3JraW5nLCBidXQKK2dvZXMgYWdhaW5zdCB0aGUgZ3JhaW4gb2YgaG93IHJlbGF0aW9uYWwgZGF0YWJhc2VzIGFyZSBpbnRlbmRlZCB0byBiZQorZGVzaWduZWQsIGFuZCB1bHRpbWF0ZWx5IG1ha2VzIG9uZSBxdWVzdGlvbiB3aGV0aGVyIHVzaW5nIGEgcmVsYXRpb25hbAorZGF0YWJhc2UgaXMgdGhlIGJlc3QgYXBwcm9hY2ggaW4gdGhlc2UgY2lyY3Vtc3RhbmNlcy4KKworQSBzZWNvbmQgcmVhc29uIHRoYXQgcmVsYXRpb25hbCBkYXRhYmFzZXMgZ2V0IGRlbm9ybWFsaXplZCBvbiBwdXJwb3NlIGlzCithIGJ1c2luZXNzIGRvY3VtZW50IHN0cnVjdHVyZSB0aGF0IHJlcXVpcmVzIHJldGVudGlvbi4gVGhhdCBpcywgeW91IGhhdmUKK2FuIGVuY2xvc2luZyB0YWJsZSB0aGF0IHJlZmVycyB0byBhIGxvdCBvZiBleHRlcm5hbCB0YWJsZXMgd2hvc2UgZGF0YQorY291bGQgY2hhbmdlIG92ZXIgdGltZSwgYnV0IHlvdSBuZWVkIHRvIHByZXNlcnZlIHRoZSBlbmNsb3NpbmcgZG9jdW1lbnQKK2FzIGEgc25hcHNob3QgaW4gaGlzdG9yeS4gVGhlIGNvbW1vbiBleGFtcGxlIGhlcmUgaXMgd2l0aCBpbnZvaWNlcy4gWW91CithbHJlYWR5IGhhdmUgY3VzdG9tZXIgYW5kIHByb2R1Y3QgdGFibGVzLCBhbmQgeW914oCZZCB0aGluayB0aGF0IHlvdSBjb3VsZAoranVzdCBtYWtlIGFuIGludm9pY2UgdGhhdCByZWZlcnMgdG8gdGhvc2UgdGFibGVzLiBCdXQgdGhpcyBzaG91bGQgbmV2ZXIKK2JlIGRvbmUgaW4gcHJhY3RpY2UuIEN1c3RvbWVyIG9yIHByaWNlIGluZm9ybWF0aW9uIGNvdWxkIGNoYW5nZSwgYW5kCit0aGVuIHlvdSB3b3VsZCBsb3NlIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGludm9pY2UgZG9jdW1lbnQgYXMgaXQgd2FzIG9uCit0aGUgaW52b2ljZSBkYXRlLCB3aGljaCBjb3VsZCB2aW9sYXRlIGF1ZGl0cywgcmVwb3J0cywgb3IgbGF3cywgYW5kCitjYXVzZSBvdGhlciBwcm9ibGVtcy4KKworSW4gdGhlIHJlbGF0aW9uYWwgd29ybGQsIGRlbm9ybWFsaXphdGlvbiB2aW9sYXRlcyBDb2Rk4oCZcyBub3JtYWwgZm9ybXMsCithbmQgeW91IHRyeSB0byBhdm9pZCBpdC4gQnV0IGluIENhc3NhbmRyYSwgZGVub3JtYWxpemF0aW9uIGlzLCB3ZWxsLAorcGVyZmVjdGx5IG5vcm1hbC4gSXTigJlzIG5vdCByZXF1aXJlZCBpZiB5b3VyIGRhdGEgbW9kZWwgaXMgc2ltcGxlLiBCdXQKK2RvbuKAmXQgYmUgYWZyYWlkIG9mIGl0LgorCitIaXN0b3JpY2FsbHksIGRlbm9ybWFsaXphdGlvbiBpbiBDYXNzYW5kcmEgaGFzIHJlcXVpcmVkIGRlc2lnbmluZyBhbmQKK21hbmFnaW5nIG11bHRpcGxlIHRhYmxlcyB1c2luZyB0ZWNobmlxdWVzIGRlc2NyaWJlZCBpbiB0aGlzCitkb2N1bWVudGF0aW9uLiBCZWdpbm5pbmcgd2l0aCB0aGUgMy4wIHJlbGVhc2UsIENhc3NhbmRyYSBwcm92aWRlcyBhCitmZWF0dXJlIGtub3duIGFzIGBtYXRlcmlhbGl6ZWQgdmlld3MgPG1hdGVyaWFsaXplZC12aWV3cz5gIHdoaWNoIGFsbG93cworeW91IHRvIGNyZWF0ZSBtdWx0aXBsZSBkZW5vcm1hbGl6ZWQgdmlld3Mgb2YgZGF0YSBiYXNlZCBvbiBhIGJhc2UgdGFibGUKK2Rlc2lnbi4gQ2Fzc2FuZHJhIG1hbmFnZXMgbWF0ZXJpYWxpemVkIHZpZXdzIG9uIHRoZSBzZXJ2ZXIsIGluY2x1ZGluZwordGhlIHdvcmsgb2Yga2VlcGluZyB0aGUgdmlld3MgaW4gc3luYyB3aXRoIHRoZSB0YWJsZS4KKworPT09IFF1ZXJ5LWZpcnN0IGRlc2lnbgorCitSZWxhdGlvbmFsIG1vZGVsaW5nLCBpbiBzaW1wbGUgdGVybXMsIG1lYW5zIHRoYXQgeW91IHN0YXJ0IGZyb20gdGhlCitjb25jZXB0dWFsIGRvbWFpbiBhbmQgdGhlbiByZXByZXNlbnQgdGhlIG5vdW5zIGluIHRoZSBkb21haW4gaW4gdGFibGVzLgorWW91IHRoZW4gYXNzaWduIHByaW1hcnkga2V5cyBhbmQgZm9yZWlnbiBrZXlzIHRvIG1vZGVsIHJlbGF0aW9uc2hpcHMuCitXaGVuIHlvdSBoYXZlIGEgbWFueS10by1tYW55IHJlbGF0aW9uc2hpcCwgeW91IGNyZWF0ZSB0aGUgam9pbiB0YWJsZXMKK3RoYXQgcmVwcmVzZW50IGp1c3QgdGhvc2Uga2V5cy4gVGhlIGpvaW4gdGFibGVzIGRvbuKAmXQgZXhpc3QgaW4gdGhlIHJlYWwKK3dvcmxkLCBhbmQgYXJlIGEgbmVjZXNzYXJ5IHNpZGUgZWZmZWN0IG9mIHRoZSB3YXkgcmVsYXRpb25hbCBtb2RlbHMKK3dvcmsuIEFmdGVyIHlvdSBoYXZlIGFsbCB5b3VyIHRhYmxlcyBsYWlkIG91dCwgeW91IGNhbiBzdGFydCB3cml0aW5nCitxdWVyaWVzIHRoYXQgcHVsbCB0b2dldGhlciBkaXNwYXJhdGUgZGF0YSB1c2luZyB0aGUgcmVsYXRpb25zaGlwcworZGVmaW5lZCBieSB0aGUga2V5cy4gVGhlIHF1ZXJpZXMgaW4gdGhlIHJlbGF0aW9uYWwgd29ybGQgYXJlIHZlcnkgbXVjaAorc2Vjb25kYXJ5LiBJdCBpcyBhc3N1bWVkIHRoYXQgeW91IGNhbiBhbHdheXMgZ2V0IHRoZSBkYXRhIHlvdSB3YW50IGFzCitsb25nIGFzIHlvdSBoYXZlIHlvdXIgdGFibGVzIG1vZGVsZWQgcHJvcGVybHkuIEV2ZW4gaWYgeW91IGhhdmUgdG8gdXNlCitzZXZlcmFsIGNvbXBsZXggc3VicXVlcmllcyBvciBqb2luIHN0YXRlbWVudHMsIHRoaXMgaXMgdXN1YWxseSB0cnVlLgorCitCeSBjb250cmFzdCwgaW4gQ2Fzc2FuZHJhIHlvdSBkb27igJl0IHN0YXJ0IHdpdGggdGhlIGRhdGEgbW9kZWw7IHlvdSBzdGFydAord2l0aCB0aGUgcXVlcnkgbW9kZWwuIEluc3RlYWQgb2YgbW9kZWxpbmcgdGhlIGRhdGEgZmlyc3QgYW5kIHRoZW4KK3dyaXRpbmcgcXVlcmllcywgd2l0aCBDYXNzYW5kcmEgeW91IG1vZGVsIHRoZSBxdWVyaWVzIGFuZCBsZXQgdGhlIGRhdGEKK2JlIG9yZ2FuaXplZCBhcm91bmQgdGhlbS4gVGhpbmsgb2YgdGhlIG1vc3QgY29tbW9uIHF1ZXJ5IHBhdGhzIHlvdXIKK2FwcGxpY2F0aW9uIHdpbGwgdXNlLCBhbmQgdGhlbiBjcmVhdGUgdGhlIHRhYmxlcyB0aGF0IHlvdSBuZWVkIHRvCitzdXBwb3J0IHRoZW0uCisKK0RldHJhY3RvcnMgaGF2ZSBzdWdnZXN0ZWQgdGhhdCBkZXNpZ25pbmcgdGhlIHF1ZXJpZXMgZmlyc3QgaXMgb3Zlcmx5Citjb25zdHJhaW5pbmcgb24gYXBwbGljYXRpb24gZGVzaWduLCBub3QgdG8gbWVudGlvbiBkYXRhYmFzZSBtb2RlbGluZy4KK0J1dCBpdCBpcyBwZXJmZWN0bHkgcmVhc29uYWJsZSB0byBleHBlY3QgdGhhdCB5b3Ugc2hvdWxkIHRoaW5rIGhhcmQKK2Fib3V0IHRoZSBxdWVyaWVzIGluIHlvdXIgYXBwbGljYXRpb24sIGp1c3QgYXMgeW91IHdvdWxkLCBwcmVzdW1hYmx5LAordGhpbmsgaGFyZCBhYm91dCB5b3VyIHJlbGF0aW9uYWwgZG9tYWluLiBZb3UgbWF5IGdldCBpdCB3cm9uZywgYW5kIHRoZW4KK3lvdeKAmWxsIGhhdmUgcHJvYmxlbXMgaW4gZWl0aGVyIHdvcmxkLiBPciB5b3VyIHF1ZXJ5IG5lZWRzIG1pZ2h0IGNoYW5nZQorb3ZlciB0aW1lLCBhbmQgdGhlbiB5b3XigJlsbCBoYXZlIHRvIHdvcmsgdG8gdXBkYXRlIHlvdXIgZGF0YSBzZXQuIEJ1dAordGhpcyBpcyBubyBkaWZmZXJlbnQgZnJvbSBkZWZpbmluZyB0aGUgd3JvbmcgdGFibGVzLCBvciBuZWVkaW5nCithZGRpdGlvbmFsIHRhYmxlcywgaW4gYW4gUkRCTVMuCisKKz09PSBEZXNpZ25pbmcgZm9yIG9wdGltYWwgc3RvcmFnZQorCitJbiBhIHJlbGF0aW9uYWwgZGF0YWJhc2UsIGl0IGlzIGZyZXF1ZW50bHkgdHJhbnNwYXJlbnQgdG8gdGhlIHVzZXIgaG93Cit0YWJsZXMgYXJlIHN0b3JlZCBvbiBkaXNrLCBhbmQgaXQgaXMgcmFyZSB0byBoZWFyIG9mIHJlY29tbWVuZGF0aW9ucworYWJvdXQgZGF0YSBtb2RlbGluZyBiYXNlZCBvbiBob3cgdGhlIFJEQk1TIG1pZ2h0IHN0b3JlIHRhYmxlcyBvbiBkaXNrLgorSG93ZXZlciwgdGhhdCBpcyBhbiBpbXBvcnRhbnQgY29uc2lkZXJhdGlvbiBpbiBDYXNzYW5kcmEuIEJlY2F1c2UKK0Nhc3NhbmRyYSB0YWJsZXMgYXJlIGVhY2ggc3RvcmVkIGluIHNlcGFyYXRlIGZpbGVzIG9uIGRpc2ssIGl04oCZcworaW1wb3J0YW50IHRvIGtlZXAgcmVsYXRlZCBjb2x1bW5zIGRlZmluZWQgdG9nZXRoZXIgaW4gdGhlIHNhbWUgdGFibGUuCisKK0Ega2V5IGdvYWwgdGhhdCB5b3Ugd2lsbCBzZWUgYXMgeW91IGJlZ2luIGNyZWF0aW5nIGRhdGEgbW9kZWxzIGluCitDYXNzYW5kcmEgaXMgdG8gbWluaW1pemUgdGhlIG51bWJlciBvZiBwYXJ0aXRpb25zIHRoYXQgbXVzdCBiZSBzZWFyY2hlZAoraW4gb3JkZXIgdG8gc2F0aXNmeSBhIGdpdmVuIHF1ZXJ5LiBCZWNhdXNlIHRoZSBwYXJ0aXRpb24gaXMgYSB1bml0IG9mCitzdG9yYWdlIHRoYXQgZG9lcyBub3QgZ2V0IGRpdmlkZWQgYWNyb3NzIG5vZGVzLCBhIHF1ZXJ5IHRoYXQgc2VhcmNoZXMgYQorc2luZ2xlIHBhcnRpdGlvbiB3aWxsIHR5cGljYWxseSB5aWVsZCB0aGUgYmVzdCBwZXJmb3JtYW5jZS4KKworPT09IFNvcnRpbmcgaXMgYSBkZXNpZ24gZGVjaXNpb24KKworSW4gYW4gUkRCTVMsIHlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgb3JkZXIgaW4gd2hpY2ggcmVjb3JkcyBhcmUKK3JldHVybmVkIHRvIHlvdSBieSB1c2luZyBgT1JERVIgQllgIGluIHlvdXIgcXVlcnkuIFRoZSBkZWZhdWx0IHNvcnQKK29yZGVyIGlzIG5vdCBjb25maWd1cmFibGU7IGJ5IGRlZmF1bHQsIHJlY29yZHMgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlcgoraW4gd2hpY2ggdGhleSBhcmUgd3JpdHRlbi4gSWYgeW91IHdhbnQgdG8gY2hhbmdlIHRoZSBvcmRlciwgeW91IGp1c3QKK21vZGlmeSB5b3VyIHF1ZXJ5LCBhbmQgeW91IGNhbiBzb3J0IGJ5IGFueSBsaXN0IG9mIGNvbHVtbnMuCisKK0luIENhc3NhbmRyYSwgaG93ZXZlciwgc29ydGluZyBpcyB0cmVhdGVkIGRpZmZlcmVudGx5OyBpdCBpcyBhIGRlc2lnbgorZGVjaXNpb24uIFRoZSBzb3J0IG9yZGVyIGF2YWlsYWJsZSBvbiBxdWVyaWVzIGlzIGZpeGVkLCBhbmQgaXMKK2RldGVybWluZWQgZW50aXJlbHkgYnkgdGhlIHNlbGVjdGlvbiBvZiBjbHVzdGVyaW5nIGNvbHVtbnMgeW91IHN1cHBseSBpbgordGhlIGBDUkVBVEUgVEFCTEVgIGNvbW1hbmQuIFRoZSBDUUwgYFNFTEVDVGAgc3RhdGVtZW50IGRvZXMgc3VwcG9ydAorYE9SREVSIEJZYCBzZW1hbnRpY3MsIGJ1dCBvbmx5IGluIHRoZSBvcmRlciBzcGVjaWZpZWQgYnkgdGhlIGNsdXN0ZXJpbmcKK2NvbHVtbnMuCisKK19NYXRlcmlhbCBhZGFwdGVkIGZyb20gQ2Fzc2FuZHJhLCBUaGUgRGVmaW5pdGl2ZSBHdWlkZS4gUHVibGlzaGVkIGJ5CitPJ1JlaWxseSBNZWRpYSwgSW5jLiBDb3B5cmlnaHQgwqkgMjAyMCBKZWZmIENhcnBlbnRlciwgRWJlbiBIZXdpdHQuIEFsbAorcmlnaHRzIHJlc2VydmVkLiBVc2VkIHdpdGggcGVybWlzc2lvbi5fCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfcmVmaW5pbmcuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19yZWZpbmluZy5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZDhmZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfcmVmaW5pbmcuYWRvYwpAQCAtMCwwICsxLDIwMiBAQAorPSBFdmFsdWF0aW5nIGFuZCBSZWZpbmluZyBEYXRhIE1vZGVscworOnN0ZW06IGxhdGV4bWF0aAorCitPbmNlIHlvdeKAmXZlIGNyZWF0ZWQgYSBwaHlzaWNhbCBtb2RlbCwgdGhlcmUgYXJlIHNvbWUgc3RlcHMgeW914oCZbGwgd2FudAordG8gdGFrZSB0byBldmFsdWF0ZSBhbmQgcmVmaW5lIHRhYmxlIGRlc2lnbnMgdG8gaGVscCBlbnN1cmUgb3B0aW1hbAorcGVyZm9ybWFuY2UuCisKKz09IENhbGN1bGF0aW5nIFBhcnRpdGlvbiBTaXplCisKK1RoZSBmaXJzdCB0aGluZyB0aGF0IHlvdSB3YW50IHRvIGxvb2sgZm9yIGlzIHdoZXRoZXIgeW91ciB0YWJsZXMgd2lsbAoraGF2ZSBwYXJ0aXRpb25zIHRoYXQgd2lsbCBiZSBvdmVybHkgbGFyZ2UsIG9yIHRvIHB1dCBpdCBhbm90aGVyIHdheSwgdG9vCit3aWRlLiBQYXJ0aXRpb24gc2l6ZSBpcyBtZWFzdXJlZCBieSB0aGUgbnVtYmVyIG9mIGNlbGxzICh2YWx1ZXMpIHRoYXQKK2FyZSBzdG9yZWQgaW4gdGhlIHBhcnRpdGlvbi4gQ2Fzc2FuZHJh4oCZcyBoYXJkIGxpbWl0IGlzIDIgYmlsbGlvbiBjZWxscworcGVyIHBhcnRpdGlvbiwgYnV0IHlvdeKAmWxsIGxpa2VseSBydW4gaW50byBwZXJmb3JtYW5jZSBpc3N1ZXMgYmVmb3JlCityZWFjaGluZyB0aGF0IGxpbWl0LgorCitJbiBvcmRlciB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgcGFydGl0aW9ucywgdXNlIHRoZSBmb2xsb3dpbmcgZm9ybXVsYToKKworW2xhdGV4bWF0aF0KKysrKysKK1xbTl92ID0gTl9yIChOX2MgLSBOX3twa30gLSBOX3MpICsgTl9zXF0KKysrKysKKworVGhlIG51bWJlciBvZiB2YWx1ZXMgKG9yIGNlbGxzKSBpbiB0aGUgcGFydGl0aW9uIChOfnZ+KSBpcyBlcXVhbCB0byB0aGUKK251bWJlciBvZiBzdGF0aWMgY29sdW1ucyAoTn5zfikgcGx1cyB0aGUgcHJvZHVjdCBvZiB0aGUgbnVtYmVyIG9mIHJvd3MKKyhOfnJ+KSBhbmQgdGhlIG51bWJlciBvZiBvZiB2YWx1ZXMgcGVyIHJvdy4gVGhlIG51bWJlciBvZiB2YWx1ZXMgcGVyIHJvdworaXMgZGVmaW5lZCBhcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgKE5+Y34pIG1pbnVzIHRoZSBudW1iZXIgb2YgcHJpbWFyeQora2V5IGNvbHVtbnMgKE5+cGt+KSBhbmQgc3RhdGljIGNvbHVtbnMgKE5+c34pLgorCitUaGUgbnVtYmVyIG9mIGNvbHVtbnMgdGVuZHMgdG8gYmUgcmVsYXRpdmVseSBzdGF0aWMsIGFsdGhvdWdoIGl0IGlzCitwb3NzaWJsZSB0byBhbHRlciB0YWJsZXMgYXQgcnVudGltZS4gRm9yIHRoaXMgcmVhc29uLCBhIHByaW1hcnkgZHJpdmVyCitvZiBwYXJ0aXRpb24gc2l6ZSBpcyB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIHBhcnRpdGlvbi4gVGhpcyBpcyBhIGtleQorZmFjdG9yIHRoYXQgeW91IG11c3QgY29uc2lkZXIgaW4gZGV0ZXJtaW5pbmcgd2hldGhlciBhIHBhcnRpdGlvbiBoYXMgdGhlCitwb3RlbnRpYWwgdG8gZ2V0IHRvbyBsYXJnZS4gVHdvIGJpbGxpb24gdmFsdWVzIHNvdW5kcyBsaWtlIGEgbG90LCBidXQgaW4KK2Egc2Vuc29yIHN5c3RlbSB3aGVyZSB0ZW5zIG9yIGh1bmRyZWRzIG9mIHZhbHVlcyBhcmUgbWVhc3VyZWQgZXZlcnkKK21pbGxpc2Vjb25kLCB0aGUgbnVtYmVyIG9mIHZhbHVlcyBzdGFydHMgdG8gYWRkIHVwIHByZXR0eSBmYXN0LgorCitMZXTigJlzIHRha2UgYSBsb29rIGF0IG9uZSBvZiB0aGUgdGFibGVzIHRvIGFuYWx5emUgdGhlIHBhcnRpdGlvbiBzaXplLgorQmVjYXVzZSBpdCBoYXMgYSB3aWRlIHBhcnRpdGlvbiBkZXNpZ24gd2l0aCBvbmUgcGFydGl0aW9uIHBlciBob3RlbCwKK2xvb2sgYXQgdGhlIGBhdmFpbGFibGVfcm9vbXNfYnlfaG90ZWxfZGF0ZWAgdGFibGUuIFRoZSB0YWJsZSBoYXMgZm91cgorY29sdW1ucyB0b3RhbCAoTn5jfiA9IDQpLCBpbmNsdWRpbmcgdGhyZWUgcHJpbWFyeSBrZXkgY29sdW1ucyAoTn5wa34gPQorMykgYW5kIG5vIHN0YXRpYyBjb2x1bW5zIChOfnN+ID0gMCkuIFBsdWdnaW5nIHRoZXNlIHZhbHVlcyBpbnRvIHRoZQorZm9ybXVsYSwgdGhlIHJlc3VsdCBpczoKKworW2xhdGV4bWF0aF0KKysrKysKK1xbTl92ID0gTl9yICg0IC0gMyAtIDApICsgMCA9IDFOX3JcXQorKysrKworCitUaGVyZWZvcmUgdGhlIG51bWJlciBvZiB2YWx1ZXMgZm9yIHRoaXMgdGFibGUgaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZgorcm93cy4gWW91IHN0aWxsIG5lZWQgdG8gZGV0ZXJtaW5lIGEgbnVtYmVyIG9mIHJvd3MuIFRvIGRvIHRoaXMsIG1ha2UKK2VzdGltYXRlcyBiYXNlZCBvbiB0aGUgYXBwbGljYXRpb24gZGVzaWduLiBUaGUgdGFibGUgaXMgc3RvcmluZyBhIHJlY29yZAorZm9yIGVhY2ggcm9vbSwgaW4gZWFjaCBvZiBob3RlbCwgZm9yIGV2ZXJ5IG5pZ2h0LiBMZXQncyBhc3N1bWUgdGhlCitzeXN0ZW0gd2lsbCBiZSB1c2VkIHRvIHN0b3JlIHR3byB5ZWFycyBvZiBpbnZlbnRvcnkgYXQgYSB0aW1lLCBhbmQgdGhlcmUKK2FyZSA1LDAwMCBob3RlbHMgaW4gdGhlIHN5c3RlbSwgd2l0aCBhbiBhdmVyYWdlIG9mIDEwMCByb29tcyBpbiBlYWNoCitob3RlbC4KKworU2luY2UgdGhlcmUgaXMgYSBwYXJ0aXRpb24gZm9yIGVhY2ggaG90ZWwsIHRoZSBlc3RpbWF0ZWQgbnVtYmVyIG9mIHJvd3MKK3BlciBwYXJ0aXRpb24gaXMgYXMgZm9sbG93czoKKworW2xhdGV4bWF0aF0KKysrKysKK1xbTl9yID0gMTAwIHJvb21zL2hvdGVsIFx0aW1lcyA3MzAgZGF5cyA9IDczLDAwMCByb3dzXF0KKysrKysKKworVGhpcyByZWxhdGl2ZWx5IHNtYWxsIG51bWJlciBvZiByb3dzIHBlciBwYXJ0aXRpb24gaXMgbm90IGdvaW5nIHRvIGdldAoreW91IGluIHRvbyBtdWNoIHRyb3VibGUsIGJ1dCBpZiB5b3Ugc3RhcnQgc3RvcmluZyBtb3JlIGRhdGVzIG9mCitpbnZlbnRvcnksIG9yIGRvbuKAmXQgbWFuYWdlIHRoZSBzaXplIG9mIHRoZSBpbnZlbnRvcnkgd2VsbCB1c2luZyBUVEwsIHlvdQorY291bGQgc3RhcnQgaGF2aW5nIGlzc3Vlcy4gWW91IHN0aWxsIG1pZ2h0IHdhbnQgdG8gbG9vayBhdCBicmVha2luZyB1cAordGhpcyBsYXJnZSBwYXJ0aXRpb24sIHdoaWNoIHlvdSdsbCBzZWUgaG93IHRvIGRvIHNob3J0bHkuCisKK1doZW4gcGVyZm9ybWluZyBzaXppbmcgY2FsY3VsYXRpb25zLCBpdCBpcyB0ZW1wdGluZyB0byBhc3N1bWUgdGhlCitub21pbmFsIG9yIGF2ZXJhZ2UgY2FzZSBmb3IgdmFyaWFibGVzIHN1Y2ggYXMgdGhlIG51bWJlciBvZiByb3dzLgorQ29uc2lkZXIgY2FsY3VsYXRpbmcgdGhlIHdvcnN0IGNhc2UgYXMgd2VsbCwgYXMgdGhlc2Ugc29ydHMgb2YKK3ByZWRpY3Rpb25zIGhhdmUgYSB3YXkgb2YgY29taW5nIHRydWUgaW4gc3VjY2Vzc2Z1bCBzeXN0ZW1zLgorCis9PSBDYWxjdWxhdGluZyBTaXplIG9uIERpc2sKKworSW4gYWRkaXRpb24gdG8gY2FsY3VsYXRpbmcgdGhlIHNpemUgb2YgYSBwYXJ0aXRpb24sIGl0IGlzIGFsc28gYW4KK2V4Y2VsbGVudCBpZGVhIHRvIGVzdGltYXRlIHRoZSBhbW91bnQgb2YgZGlzayBzcGFjZSB0aGF0IHdpbGwgYmUKK3JlcXVpcmVkIGZvciBlYWNoIHRhYmxlIHlvdSBwbGFuIHRvIHN0b3JlIGluIHRoZSBjbHVzdGVyLiBJbiBvcmRlciB0bworZGV0ZXJtaW5lIHRoZSBzaXplLCB1c2UgdGhlIGZvbGxvd2luZyBmb3JtdWxhIHRvIGRldGVybWluZSB0aGUgc2l6ZSBTfnR+CitvZiBhIHBhcnRpdGlvbjoKKworW2xhdGV4bWF0aF0KKysrKysKK1xbU190ID0gXGRpc3BsYXlzdHlsZVxzdW1faSBzaXplT2ZcYmlnIChjX3trX2l9XGJpZykgKyBcZGlzcGxheXN0eWxlXHN1bV9qIHNpemVPZlxiaWcoY197c19qfVxiaWcpICsgTl9yXHRpbWVzIFxiaWdnKFxkaXNwbGF5c3R5bGVcc3VtX2sgc2l6ZU9mXGJpZyhjX3tyX2t9XGJpZykgKyBcZGlzcGxheXN0eWxlXHN1bV9sIHNpemVPZlxiaWcoY197Y19sfVxiaWcpXGJpZ2cpICtcXQorKysrKworCitbbGF0ZXhtYXRoXQorKysrKworXFtOX3ZcdGltZXMgc2l6ZU9mXGJpZyh0X3thdmd9XGJpZylcXQorKysrKworCitUaGlzIGlzIGEgYml0IG1vcmUgY29tcGxleCB0aGFuIHRoZSBwcmV2aW91cyBmb3JtdWxhLCBidXQgbGV0J3MgYnJlYWsgaXQKK2Rvd24gYSBiaXQgYXQgYSB0aW1lLiBMZXTigJlzIHRha2UgYSBsb29rIGF0IHRoZSBub3RhdGlvbiBmaXJzdDoKKworKiBJbiB0aGlzIGZvcm11bGEsIGN+a34gcmVmZXJzIHRvIHBhcnRpdGlvbiBrZXkgY29sdW1ucywgY35zfiB0byBzdGF0aWMKK2NvbHVtbnMsIGN+cn4gdG8gcmVndWxhciBjb2x1bW5zLCBhbmQgY35jfiB0byBjbHVzdGVyaW5nIGNvbHVtbnMuCisqIFRoZSB0ZXJtIHR+YXZnfiByZWZlcnMgdG8gdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGJ5dGVzIG9mIG1ldGFkYXRhCitzdG9yZWQgcGVyIGNlbGwsIHN1Y2ggYXMgdGltZXN0YW1wcy4gSXQgaXMgdHlwaWNhbCB0byB1c2UgYW4gZXN0aW1hdGUgb2YKKzggYnl0ZXMgZm9yIHRoaXMgdmFsdWUuCisqIFlvdSdsbCByZWNvZ25pemUgdGhlIG51bWJlciBvZiByb3dzIE5+cn4gYW5kIG51bWJlciBvZiB2YWx1ZXMgTn52fgorZnJvbSBwcmV2aW91cyBjYWxjdWxhdGlvbnMuCisqIFRoZSAqc2l6ZU9mKCkqIGZ1bmN0aW9uIHJlZmVycyB0byB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgQ1FMIGRhdGEKK3R5cGUgb2YgZWFjaCByZWZlcmVuY2VkIGNvbHVtbi4KKworVGhlIGZpcnN0IHRlcm0gYXNrcyB5b3UgdG8gc3VtIHRoZSBzaXplIG9mIHRoZSBwYXJ0aXRpb24ga2V5IGNvbHVtbnMuCitGb3IgdGhpcyBleGFtcGxlLCB0aGUgYGF2YWlsYWJsZV9yb29tc19ieV9ob3RlbF9kYXRlYCB0YWJsZSBoYXMgYSBzaW5nbGUKK3BhcnRpdGlvbiBrZXkgY29sdW1uLCB0aGUgYGhvdGVsX2lkYCwgd2hpY2ggaXMgb2YgdHlwZSBgdGV4dGAuIEFzc3VtaW5nCit0aGF0IGhvdGVsIGlkZW50aWZpZXJzIGFyZSBzaW1wbGUgNS1jaGFyYWN0ZXIgY29kZXMsIHlvdSBoYXZlIGEgNS1ieXRlCit2YWx1ZSwgc28gdGhlIHN1bSBvZiB0aGUgcGFydGl0aW9uIGtleSBjb2x1bW4gc2l6ZXMgaXMgNSBieXRlcy4KKworVGhlIHNlY29uZCB0ZXJtIGFza3MgeW91IHRvIHN1bSB0aGUgc2l6ZSBvZiB0aGUgc3RhdGljIGNvbHVtbnMuIFRoaXMKK3RhYmxlIGhhcyBubyBzdGF0aWMgY29sdW1ucywgc28gdGhlIHNpemUgaXMgMCBieXRlcy4KKworVGhlIHRoaXJkIHRlcm0gaXMgdGhlIG1vc3QgaW52b2x2ZWQsIGFuZCBmb3IgZ29vZCByZWFzb27igJRpdCBpcworY2FsY3VsYXRpbmcgdGhlIHNpemUgb2YgdGhlIGNlbGxzIGluIHRoZSBwYXJ0aXRpb24uIFN1bSB0aGUgc2l6ZSBvZiB0aGUKK2NsdXN0ZXJpbmcgY29sdW1ucyBhbmQgcmVndWxhciBjb2x1bW5zLiBUaGUgdHdvIGNsdXN0ZXJpbmcgY29sdW1ucyBhcmUKK3RoZSBgZGF0ZWAsIHdoaWNoIGlzIDQgYnl0ZXMsIGFuZCB0aGUgYHJvb21fbnVtYmVyYCwgd2hpY2ggaXMgYSAyLWJ5dGUKK3Nob3J0IGludGVnZXIsIGdpdmluZyBhIHN1bSBvZiA2IGJ5dGVzLiBUaGVyZSBpcyBvbmx5IGEgc2luZ2xlIHJlZ3VsYXIKK2NvbHVtbiwgdGhlIGJvb2xlYW4gYGlzX2F2YWlsYWJsZWAsIHdoaWNoIGlzIDEgYnl0ZSBpbiBzaXplLiBTdW1taW5nIHRoZQorcmVndWxhciBjb2x1bW4gc2l6ZSAoMSBieXRlKSBwbHVzIHRoZSBjbHVzdGVyaW5nIGNvbHVtbiBzaXplICg2IGJ5dGVzKQorZ2l2ZXMgYSB0b3RhbCBvZiA3IGJ5dGVzLiBUbyBmaW5pc2ggdXAgdGhlIHRlcm0sIG11bHRpcGx5IHRoaXMgdmFsdWUgYnkKK3RoZSBudW1iZXIgb2Ygcm93cyAoNzMsMDAwKSwgZ2l2aW5nIGEgcmVzdWx0IG9mIDUxMSwwMDAgYnl0ZXMgKDAuNTEgTUIpLgorCitUaGUgZm91cnRoIHRlcm0gaXMgc2ltcGx5IGNvdW50aW5nIHRoZSBtZXRhZGF0YSB0aGF0IHRoYXQgQ2Fzc2FuZHJhCitzdG9yZXMgZm9yIGVhY2ggY2VsbC4gSW4gdGhlIHN0b3JhZ2UgZm9ybWF0IHVzZWQgYnkgQ2Fzc2FuZHJhIDMuMCBhbmQKK2xhdGVyLCB0aGUgYW1vdW50IG9mIG1ldGFkYXRhIGZvciBhIGdpdmVuIGNlbGwgdmFyaWVzIGJhc2VkIG9uIHRoZSB0eXBlCitvZiBkYXRhIGJlaW5nIHN0b3JlZCwgYW5kIHdoZXRoZXIgb3Igbm90IGN1c3RvbSB0aW1lc3RhbXAgb3IgVFRMIHZhbHVlcworYXJlIHNwZWNpZmllZCBmb3IgaW5kaXZpZHVhbCBjZWxscy4gRm9yIHRoaXMgdGFibGUsIHJldXNlIHRoZSBudW1iZXIgb2YKK3ZhbHVlcyBmcm9tIHRoZSBwcmV2aW91cyBjYWxjdWxhdGlvbiAoNzMsMDAwKSBhbmQgbXVsdGlwbHkgYnkgOCwgd2hpY2gKK2dpdmVzIDAuNTggTUIuCisKK0FkZGluZyB0aGVzZSB0ZXJtcyB0b2dldGhlciwgeW91IGdldCBhIGZpbmFsIGVzdGltYXRlOgorCitbbGF0ZXhtYXRoXQorKysrKworXFtQYXJ0aXRpb24gc2l6ZSA9IDE2IGJ5dGVzICsgMCBieXRlcyArIDAuNTEgTUIgKyAwLjU4IE1CID0gMS4xIE1CXF0KKysrKysKKworVGhpcyBmb3JtdWxhIGlzIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIGFjdHVhbCBzaXplIG9mIGEgcGFydGl0aW9uIG9uCitkaXNrLCBidXQgaXMgYWNjdXJhdGUgZW5vdWdoIHRvIGJlIHF1aXRlIHVzZWZ1bC4gUmVtZW1iZXJpbmcgdGhhdCB0aGUKK3BhcnRpdGlvbiBtdXN0IGJlIGFibGUgdG8gZml0IG9uIGEgc2luZ2xlIG5vZGUsIGl0IGxvb2tzIGxpa2UgdGhlIHRhYmxlCitkZXNpZ24gd2lsbCBub3QgcHV0IGEgbG90IG9mIHN0cmFpbiBvbiBkaXNrIHN0b3JhZ2UuCisKK0Nhc3NhbmRyYeKAmXMgc3RvcmFnZSBlbmdpbmUgd2FzIHJlLWltcGxlbWVudGVkIGZvciB0aGUgMy4wIHJlbGVhc2UsCitpbmNsdWRpbmcgYSBuZXcgZm9ybWF0IGZvciBTU1RhYmxlIGZpbGVzLiBUaGUgcHJldmlvdXMgZm9ybWF0IHN0b3JlZCBhCitzZXBhcmF0ZSBjb3B5IG9mIHRoZSBjbHVzdGVyaW5nIGNvbHVtbnMgYXMgcGFydCBvZiB0aGUgcmVjb3JkIGZvciBlYWNoCitjZWxsLiBUaGUgbmV3ZXIgZm9ybWF0IGVsaW1pbmF0ZXMgdGhpcyBkdXBsaWNhdGlvbiwgd2hpY2ggcmVkdWNlcyB0aGUKK3NpemUgb2Ygc3RvcmVkIGRhdGEgYW5kIHNpbXBsaWZpZXMgdGhlIGZvcm11bGEgZm9yIGNvbXB1dGluZyB0aGF0IHNpemUuCisKK0tlZXAgaW4gbWluZCBhbHNvIHRoYXQgdGhpcyBlc3RpbWF0ZSBvbmx5IGNvdW50cyBhIHNpbmdsZSByZXBsaWNhIG9mCitkYXRhLiBZb3Ugd2lsbCBuZWVkIHRvIG11bHRpcGx5IHRoZSB2YWx1ZSBvYnRhaW5lZCBoZXJlIGJ5IHRoZSBudW1iZXIgb2YKK3BhcnRpdGlvbnMgYW5kIHRoZSBudW1iZXIgb2YgcmVwbGljYXMgc3BlY2lmaWVkIGJ5IHRoZSBrZXlzcGFjZeKAmXMKK3JlcGxpY2F0aW9uIHN0cmF0ZWd5IGluIG9yZGVyIHRvIGRldGVybWluZSB0aGUgdG90YWwgcmVxdWlyZWQgdG90YWwKK2NhcGFjaXR5IGZvciBlYWNoIHRhYmxlLiBUaGlzIHdpbGwgY29tZSBpbiBoYW5keSB3aGVuIHlvdSBwbGFuIHlvdXIKK2NsdXN0ZXIuCisKKz09IEJyZWFraW5nIFVwIExhcmdlIFBhcnRpdGlvbnMKKworQXMgZGlzY3Vzc2VkIHByZXZpb3VzbHksIHRoZSBnb2FsIGlzIHRvIGRlc2lnbiB0YWJsZXMgdGhhdCBjYW4gcHJvdmlkZQordGhlIGRhdGEgeW91IG5lZWQgd2l0aCBxdWVyaWVzIHRoYXQgdG91Y2ggYSBzaW5nbGUgcGFydGl0aW9uLCBvciBmYWlsaW5nCit0aGF0LCB0aGUgbWluaW11bSBwb3NzaWJsZSBudW1iZXIgb2YgcGFydGl0aW9ucy4gSG93ZXZlciwgYXMgc2hvd24gaW4KK3RoZSBleGFtcGxlcywgaXQgaXMgcXVpdGUgcG9zc2libGUgdG8gZGVzaWduIHdpZGUgcGFydGl0aW9uLXN0eWxlIHRhYmxlcwordGhhdCBhcHByb2FjaCBDYXNzYW5kcmHigJlzIGJ1aWx0LWluIGxpbWl0cy4gUGVyZm9ybWluZyBzaXppbmcgYW5hbHlzaXMgb24KK3RhYmxlcyBtYXkgcmV2ZWFsIHBhcnRpdGlvbnMgdGhhdCBhcmUgcG90ZW50aWFsbHkgdG9vIGxhcmdlLCBlaXRoZXIgaW4KK251bWJlciBvZiB2YWx1ZXMsIHNpemUgb24gZGlzaywgb3IgYm90aC4KKworVGhlIHRlY2huaXF1ZSBmb3Igc3BsaXR0aW5nIGEgbGFyZ2UgcGFydGl0aW9uIGlzIHN0cmFpZ2h0Zm9yd2FyZDogYWRkIGFuCithZGRpdGlvbmFsIGNvbHVtbiB0byB0aGUgcGFydGl0aW9uIGtleS4gSW4gbW9zdCBjYXNlcywgbW92aW5nIG9uZSBvZiB0aGUKK2V4aXN0aW5nIGNvbHVtbnMgaW50byB0aGUgcGFydGl0aW9uIGtleSB3aWxsIGJlIHN1ZmZpY2llbnQuIEFub3RoZXIKK29wdGlvbiBpcyB0byBpbnRyb2R1Y2UgYW4gYWRkaXRpb25hbCBjb2x1bW4gdG8gdGhlIHRhYmxlIHRvIGFjdCBhcyBhCitzaGFyZGluZyBrZXksIGJ1dCB0aGlzIHJlcXVpcmVzIGFkZGl0aW9uYWwgYXBwbGljYXRpb24gbG9naWMuCisKK0NvbnRpbnVpbmcgdG8gZXhhbWluZSB0aGUgYXZhaWxhYmxlIHJvb21zIGV4YW1wbGUsIGlmIHlvdSBhZGQgdGhlIGBkYXRlYAorY29sdW1uIHRvIHRoZSBwYXJ0aXRpb24ga2V5IGZvciB0aGUgYGF2YWlsYWJsZV9yb29tc19ieV9ob3RlbF9kYXRlYAordGFibGUsIGVhY2ggcGFydGl0aW9uIHdvdWxkIHRoZW4gcmVwcmVzZW50IHRoZSBhdmFpbGFiaWxpdHkgb2Ygcm9vbXMgYXQKK2Egc3BlY2lmaWMgaG90ZWwgb24gYSBzcGVjaWZpYyBkYXRlLiBUaGlzIHdpbGwgY2VydGFpbmx5IHlpZWxkCitwYXJ0aXRpb25zIHRoYXQgYXJlIHNpZ25pZmljYW50bHkgc21hbGxlciwgcGVyaGFwcyB0b28gc21hbGwsIGFzIHRoZQorZGF0YSBmb3IgY29uc2VjdXRpdmUgZGF5cyB3aWxsIGxpa2VseSBiZSBvbiBzZXBhcmF0ZSBub2Rlcy4KKworQW5vdGhlciB0ZWNobmlxdWUga25vd24gYXMgKmJ1Y2tldGluZyogaXMgb2Z0ZW4gdXNlZCB0byBicmVhayB0aGUgZGF0YQoraW50byBtb2RlcmF0ZS1zaXplIHBhcnRpdGlvbnMuIEZvciBleGFtcGxlLCB5b3UgY291bGQgYnVja2V0aXplIHRoZQorYGF2YWlsYWJsZV9yb29tc19ieV9ob3RlbF9kYXRlYCB0YWJsZSBieSBhZGRpbmcgYSBgbW9udGhgIGNvbHVtbiB0byB0aGUKK3BhcnRpdGlvbiBrZXksIHBlcmhhcHMgcmVwcmVzZW50ZWQgYXMgYW4gaW50ZWdlci4gVGhlIGNvbXBhcmlzaW9uIHdpdGgKK3RoZSBvcmlnaW5hbCBkZXNpZ24gaXMgc2hvd24gaW4gdGhlIGZpZ3VyZSBiZWxvdy4gV2hpbGUgdGhlIGBtb250aGAKK2NvbHVtbiBpcyBwYXJ0aWFsbHkgZHVwbGljYXRpdmUgb2YgdGhlIGBkYXRlYCwgaXQgcHJvdmlkZXMgYSBuaWNlIHdheSBvZgorZ3JvdXBpbmcgcmVsYXRlZCBkYXRhIGluIGEgcGFydGl0aW9uIHRoYXQgd2lsbCBub3QgZ2V0IHRvbyBsYXJnZS4KKworaW1hZ2U6OmRhdGEtbW9kZWxpbmdfaG90ZWxfYnVja2V0aW5nLnBuZ1tpbWFnZV0KKworSWYgeW91IHJlYWxseSBmZWx0IHN0cm9uZ2x5IGFib3V0IHByZXNlcnZpbmcgYSB3aWRlIHBhcnRpdGlvbiBkZXNpZ24sCit5b3UgY291bGQgaW5zdGVhZCBhZGQgdGhlIGByb29tX2lkYCB0byB0aGUgcGFydGl0aW9uIGtleSwgc28gdGhhdCBlYWNoCitwYXJ0aXRpb24gd291bGQgcmVwcmVzZW50IHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIHJvb20gYWNyb3NzIGFsbCBkYXRlcy4KK0JlY2F1c2UgdGhlcmUgd2FzIG5vIHF1ZXJ5IGlkZW50aWZpZWQgdGhhdCBpbnZvbHZlcyBzZWFyY2hpbmcKK2F2YWlsYWJpbGl0eSBvZiBhIHNwZWNpZmljIHJvb20sIHRoZSBmaXJzdCBvciBzZWNvbmQgZGVzaWduIGFwcHJvYWNoIGlzCittb3N0IHN1aXRhYmxlIHRvIHRoZSBhcHBsaWNhdGlvbiBuZWVkcy4KKworX01hdGVyaWFsIGFkYXB0ZWQgZnJvbSBDYXNzYW5kcmEsIFRoZSBEZWZpbml0aXZlIEd1aWRlLiBQdWJsaXNoZWQgYnkKK08nUmVpbGx5IE1lZGlhLCBJbmMuIENvcHlyaWdodCDCqSAyMDIwIEplZmYgQ2FycGVudGVyLCBFYmVuIEhld2l0dC4gQWxsCityaWdodHMgcmVzZXJ2ZWQuIFVzZWQgd2l0aCBwZXJtaXNzaW9uLl8KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19zY2hlbWEuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19zY2hlbWEuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGEwNDM0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX3NjaGVtYS5hZG9jCkBAIC0wLDAgKzEsMTMwIEBACis9IERlZmluaW5nIERhdGFiYXNlIFNjaGVtYQorCitPbmNlIHlvdSBoYXZlIGZpbmlzaGVkIGV2YWx1YXRpbmcgYW5kIHJlZmluaW5nIHRoZSBwaHlzaWNhbCBtb2RlbCwKK3lvdeKAmXJlIHJlYWR5IHRvIGltcGxlbWVudCB0aGUgc2NoZW1hIGluIENRTC4gSGVyZSBpcyB0aGUgc2NoZW1hIGZvciB0aGUKK2Bob3RlbGAga2V5c3BhY2UsIHVzaW5nIENRTOKAmXMgY29tbWVudCBmZWF0dXJlIHRvIGRvY3VtZW50IHRoZSBxdWVyeQorcGF0dGVybiBzdXBwb3J0ZWQgYnkgZWFjaCB0YWJsZToKKworW3NvdXJjZSxjcWxdCistLS0tCitDUkVBVEUgS0VZU1BBQ0UgaG90ZWwgV0lUSCByZXBsaWNhdGlvbiA9CisgIHvigJhjbGFzc+KAmTog4oCYU2ltcGxlU3RyYXRlZ3nigJksIOKAmHJlcGxpY2F0aW9uX2ZhY3RvcuKAmSA6IDN9OworCitDUkVBVEUgVFlQRSBob3RlbC5hZGRyZXNzICgKKyAgc3RyZWV0IHRleHQsCisgIGNpdHkgdGV4dCwKKyAgc3RhdGVfb3JfcHJvdmluY2UgdGV4dCwKKyAgcG9zdGFsX2NvZGUgdGV4dCwKKyAgY291bnRyeSB0ZXh0ICk7CisKK0NSRUFURSBUQUJMRSBob3RlbC5ob3RlbHNfYnlfcG9pICgKKyAgcG9pX25hbWUgdGV4dCwKKyAgaG90ZWxfaWQgdGV4dCwKKyAgbmFtZSB0ZXh0LAorICBwaG9uZSB0ZXh0LAorICBhZGRyZXNzIGZyb3plbjxhZGRyZXNzPiwKKyAgUFJJTUFSWSBLRVkgKChwb2lfbmFtZSksIGhvdGVsX2lkKSApCisgIFdJVEggY29tbWVudCA9IOKAmFExLiBGaW5kIGhvdGVscyBuZWFyIGdpdmVuIHBvaeKAmQorICBBTkQgQ0xVU1RFUklORyBPUkRFUiBCWSAoaG90ZWxfaWQgQVNDKSA7CisKK0NSRUFURSBUQUJMRSBob3RlbC5ob3RlbHMgKAorICBpZCB0ZXh0IFBSSU1BUlkgS0VZLAorICBuYW1lIHRleHQsCisgIHBob25lIHRleHQsCisgIGFkZHJlc3MgZnJvemVuPGFkZHJlc3M+LAorICBwb2lzIHNldDx0ZXh0PiApCisgIFdJVEggY29tbWVudCA9IOKAmFEyLiBGaW5kIGluZm9ybWF0aW9uIGFib3V0IGEgaG90ZWzigJk7CisKK0NSRUFURSBUQUJMRSBob3RlbC5wb2lzX2J5X2hvdGVsICgKKyAgcG9pX25hbWUgdGV4dCwKKyAgaG90ZWxfaWQgdGV4dCwKKyAgZGVzY3JpcHRpb24gdGV4dCwKKyAgUFJJTUFSWSBLRVkgKChob3RlbF9pZCksIHBvaV9uYW1lKSApCisgIFdJVEggY29tbWVudCA9IFEzLiBGaW5kIHBvaXMgbmVhciBhIGhvdGVs4oCZOworCitDUkVBVEUgVEFCTEUgaG90ZWwuYXZhaWxhYmxlX3Jvb21zX2J5X2hvdGVsX2RhdGUgKAorICBob3RlbF9pZCB0ZXh0LAorICBkYXRlIGRhdGUsCisgIHJvb21fbnVtYmVyIHNtYWxsaW50LAorICBpc19hdmFpbGFibGUgYm9vbGVhbiwKKyAgUFJJTUFSWSBLRVkgKChob3RlbF9pZCksIGRhdGUsIHJvb21fbnVtYmVyKSApCisgIFdJVEggY29tbWVudCA9IOKAmFE0LiBGaW5kIGF2YWlsYWJsZSByb29tcyBieSBob3RlbCBkYXRl4oCZOworCitDUkVBVEUgVEFCTEUgaG90ZWwuYW1lbml0aWVzX2J5X3Jvb20gKAorICBob3RlbF9pZCB0ZXh0LAorICByb29tX251bWJlciBzbWFsbGludCwKKyAgYW1lbml0eV9uYW1lIHRleHQsCisgIGRlc2NyaXB0aW9uIHRleHQsCisgIFBSSU1BUlkgS0VZICgoaG90ZWxfaWQsIHJvb21fbnVtYmVyKSwgYW1lbml0eV9uYW1lKSApCisgIFdJVEggY29tbWVudCA9IOKAmFE1LiBGaW5kIGFtZW5pdGllcyBmb3IgYSByb29t4oCZOworLS0tLQorCitOb3RpY2UgdGhhdCB0aGUgZWxlbWVudHMgb2YgdGhlIHBhcnRpdGlvbiBrZXkgYXJlIHN1cnJvdW5kZWQgd2l0aAorcGFyZW50aGVzZXMsIGV2ZW4gdGhvdWdoIHRoZSBwYXJ0aXRpb24ga2V5IGNvbnNpc3RzIG9mIHRoZSBzaW5nbGUgY29sdW1uCitgcG9pX25hbWVgLiBUaGlzIGlzIGEgYmVzdCBwcmFjdGljZSB0aGF0IG1ha2VzIHRoZSBzZWxlY3Rpb24gb2YKK3BhcnRpdGlvbiBrZXkgbW9yZSBleHBsaWNpdCB0byBvdGhlcnMgcmVhZGluZyB5b3VyIENRTC4KKworU2ltaWxhcmx5LCBoZXJlIGlzIHRoZSBzY2hlbWEgZm9yIHRoZSBgcmVzZXJ2YXRpb25gIGtleXNwYWNlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK0NSRUFURSBLRVlTUEFDRSByZXNlcnZhdGlvbiBXSVRIIHJlcGxpY2F0aW9uID0ge+KAmGNsYXNz4oCZOgorICDigJhTaW1wbGVTdHJhdGVneeKAmSwg4oCYcmVwbGljYXRpb25fZmFjdG9y4oCZIDogM307CisKK0NSRUFURSBUWVBFIHJlc2VydmF0aW9uLmFkZHJlc3MgKAorICBzdHJlZXQgdGV4dCwKKyAgY2l0eSB0ZXh0LAorICBzdGF0ZV9vcl9wcm92aW5jZSB0ZXh0LAorICBwb3N0YWxfY29kZSB0ZXh0LAorICBjb3VudHJ5IHRleHQgKTsKKworQ1JFQVRFIFRBQkxFIHJlc2VydmF0aW9uLnJlc2VydmF0aW9uc19ieV9jb25maXJtYXRpb24gKAorICBjb25maXJtX251bWJlciB0ZXh0LAorICBob3RlbF9pZCB0ZXh0LAorICBzdGFydF9kYXRlIGRhdGUsCisgIGVuZF9kYXRlIGRhdGUsCisgIHJvb21fbnVtYmVyIHNtYWxsaW50LAorICBndWVzdF9pZCB1dWlkLAorICBQUklNQVJZIEtFWSAoY29uZmlybV9udW1iZXIpICkKKyAgV0lUSCBjb21tZW50ID0g4oCYUTYuIEZpbmQgcmVzZXJ2YXRpb25zIGJ5IGNvbmZpcm1hdGlvbiBudW1iZXLigJk7CisKK0NSRUFURSBUQUJMRSByZXNlcnZhdGlvbi5yZXNlcnZhdGlvbnNfYnlfaG90ZWxfZGF0ZSAoCisgIGhvdGVsX2lkIHRleHQsCisgIHN0YXJ0X2RhdGUgZGF0ZSwKKyAgZW5kX2RhdGUgZGF0ZSwKKyAgcm9vbV9udW1iZXIgc21hbGxpbnQsCisgIGNvbmZpcm1fbnVtYmVyIHRleHQsCisgIGd1ZXN0X2lkIHV1aWQsCisgIFBSSU1BUlkgS0VZICgoaG90ZWxfaWQsIHN0YXJ0X2RhdGUpLCByb29tX251bWJlcikgKQorICBXSVRIIGNvbW1lbnQgPSDigJhRNy4gRmluZCByZXNlcnZhdGlvbnMgYnkgaG90ZWwgYW5kIGRhdGXigJk7CisKK0NSRUFURSBUQUJMRSByZXNlcnZhdGlvbi5yZXNlcnZhdGlvbnNfYnlfZ3Vlc3QgKAorICBndWVzdF9sYXN0X25hbWUgdGV4dCwKKyAgaG90ZWxfaWQgdGV4dCwKKyAgc3RhcnRfZGF0ZSBkYXRlLAorICBlbmRfZGF0ZSBkYXRlLAorICByb29tX251bWJlciBzbWFsbGludCwKKyAgY29uZmlybV9udW1iZXIgdGV4dCwKKyAgZ3Vlc3RfaWQgdXVpZCwKKyAgUFJJTUFSWSBLRVkgKChndWVzdF9sYXN0X25hbWUpLCBob3RlbF9pZCkgKQorICBXSVRIIGNvbW1lbnQgPSDigJhROC4gRmluZCByZXNlcnZhdGlvbnMgYnkgZ3Vlc3QgbmFtZeKAmTsKKworQ1JFQVRFIFRBQkxFIHJlc2VydmF0aW9uLmd1ZXN0cyAoCisgIGd1ZXN0X2lkIHV1aWQgUFJJTUFSWSBLRVksCisgIGZpcnN0X25hbWUgdGV4dCwKKyAgbGFzdF9uYW1lIHRleHQsCisgIHRpdGxlIHRleHQsCisgIGVtYWlscyBzZXQsCisgIHBob25lX251bWJlcnMgbGlzdCwKKyAgYWRkcmVzc2VzIG1hcDx0ZXh0LAorICBmcm96ZW48YWRkcmVzcz4sCisgIGNvbmZpcm1fbnVtYmVyIHRleHQgKQorICBXSVRIIGNvbW1lbnQgPSDigJhROS4gRmluZCBndWVzdCBieSBJROKAmTsKKy0tLS0KKworWW91IG5vdyBoYXZlIGEgY29tcGxldGUgQ2Fzc2FuZHJhIHNjaGVtYSBmb3Igc3RvcmluZyBkYXRhIGZvciBhIGhvdGVsCithcHBsaWNhdGlvbi4KKworX01hdGVyaWFsIGFkYXB0ZWQgZnJvbSBDYXNzYW5kcmEsIFRoZSBEZWZpbml0aXZlIEd1aWRlLiBQdWJsaXNoZWQgYnkKK08nUmVpbGx5IE1lZGlhLCBJbmMuIENvcHlyaWdodCDCqSAyMDIwIEplZmYgQ2FycGVudGVyLCBFYmVuIEhld2l0dC4gQWxsCityaWdodHMgcmVzZXJ2ZWQuIFVzZWQgd2l0aCBwZXJtaXNzaW9uLl8KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ190b29scy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX3Rvb2xzLmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA4Y2FhYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ190b29scy5hZG9jCkBAIC0wLDAgKzEsNDQgQEAKKz0gQ2Fzc2FuZHJhIERhdGEgTW9kZWxpbmcgVG9vbHMKKworVGhlcmUgYXJlIHNldmVyYWwgdG9vbHMgYXZhaWxhYmxlIHRvIGhlbHAgeW91IGRlc2lnbiBhbmQgbWFuYWdlIHlvdXIKK0Nhc3NhbmRyYSBzY2hlbWEgYW5kIGJ1aWxkIHF1ZXJpZXMuCisKKyogaHR0cHM6Ly9oYWNrb2xhZGUuY29tL25vc3FsZGIuaHRtbCNjYXNzYW5kcmFbSGFja29sYWRlXSBpcyBhIGRhdGEKK21vZGVsaW5nIHRvb2wgdGhhdCBzdXBwb3J0cyBzY2hlbWEgZGVzaWduIGZvciBDYXNzYW5kcmEgYW5kIG1hbnkgb3RoZXIKK05vU1FMIGRhdGFiYXNlcy4gSGFja29sYWRlIHN1cHBvcnRzIHRoZSB1bmlxdWUgY29uY2VwdHMgb2YgQ1FMIHN1Y2ggYXMKK3BhcnRpdGlvbiBrZXlzIGFuZCBjbHVzdGVyaW5nIGNvbHVtbnMsIGFzIHdlbGwgYXMgZGF0YSB0eXBlcyBpbmNsdWRpbmcKK2NvbGxlY3Rpb25zIGFuZCBVRFRzLiBJdCBhbHNvIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGNyZWF0ZSBDaGVib3RrbworZGlhZ3JhbXMuCisqIGh0dHA6Ly9rZG0uZGF0YXZpZXcub3JnL1tLYXNobGV2IERhdGEgTW9kZWxlcl0gaXMgYSBDYXNzYW5kcmEgZGF0YQorbW9kZWxpbmcgdG9vbCB0aGF0IGF1dG9tYXRlcyB0aGUgZGF0YSBtb2RlbGluZyBtZXRob2RvbG9neSBkZXNjcmliZWQgaW4KK3RoaXMgZG9jdW1lbnRhdGlvbiwgaW5jbHVkaW5nIGlkZW50aWZ5aW5nIGFjY2VzcyBwYXR0ZXJucywgY29uY2VwdHVhbCwKK2xvZ2ljYWwsIGFuZCBwaHlzaWNhbCBkYXRhIG1vZGVsaW5nLCBhbmQgc2NoZW1hIGdlbmVyYXRpb24uIEl0IGFsc28KK2luY2x1ZGVzIG1vZGVsIHBhdHRlcm5zIHRoYXQgeW91IGNhbiBvcHRpb25hbGx5IGxldmVyYWdlIGFzIGEgc3RhcnRpbmcKK3BvaW50IGZvciB5b3VyIGRlc2lnbnMuCisqIERhdGFTdGF4IERldkNlbnRlciBpcyBhIHRvb2wgZm9yIG1hbmFnaW5nIHNjaGVtYSwgZXhlY3V0aW5nIHF1ZXJpZXMKK2FuZCB2aWV3aW5nIHJlc3VsdHMuIFdoaWxlIHRoZSB0b29sIGlzIG5vIGxvbmdlciBhY3RpdmVseSBzdXBwb3J0ZWQsIGl0CitpcyBzdGlsbCBwb3B1bGFyIHdpdGggbWFueSBkZXZlbG9wZXJzIGFuZCBpcyBhdmFpbGFibGUgYXMgYQoraHR0cHM6Ly9hY2FkZW15LmRhdGFzdGF4LmNvbS9kb3dubG9hZHNbZnJlZSBkb3dubG9hZF0uIERldkNlbnRlcgorZmVhdHVyZXMgc3ludGF4IGhpZ2hsaWdodGluZyBmb3IgQ1FMIGNvbW1hbmRzLCB0eXBlcywgYW5kIG5hbWUgbGl0ZXJhbHMuCitEZXZDZW50ZXIgcHJvdmlkZXMgY29tbWFuZCBjb21wbGV0aW9uIGFzIHlvdSB0eXBlIG91dCBDUUwgY29tbWFuZHMgYW5kCitpbnRlcnByZXRzIHRoZSBjb21tYW5kcyB5b3UgdHlwZSwgaGlnaGxpZ2h0aW5nIGFueSBlcnJvcnMgeW91IG1ha2UuIFRoZQordG9vbCBwcm92aWRlcyBwYW5lcyBmb3IgbWFuYWdpbmcgbXVsdGlwbGUgQ1FMIHNjcmlwdHMgYW5kIGNvbm5lY3Rpb25zIHRvCittdWx0aXBsZSBjbHVzdGVycy4gVGhlIGNvbm5lY3Rpb25zIGFyZSB1c2VkIHRvIHJ1biBDUUwgY29tbWFuZHMgYWdhaW5zdAorbGl2ZSBjbHVzdGVycyBhbmQgdmlldyB0aGUgcmVzdWx0cy4gVGhlIHRvb2wgYWxzbyBoYXMgYSBxdWVyeSB0cmFjZQorZmVhdHVyZSB0aGF0IGlzIHVzZWZ1bCBmb3IgZ2FpbmluZyBpbnNpZ2h0IGludG8gdGhlIHBlcmZvcm1hbmNlIG9mIHlvdXIKK3F1ZXJpZXMuCisqIElERSBQbHVnaW5zIC0gVGhlcmUgYXJlIENRTCBwbHVnaW5zIGF2YWlsYWJsZSBmb3Igc2V2ZXJhbCBJbnRlZ3JhdGVkCitEZXZlbG9wbWVudCBFbnZpcm9ubWVudHMgKElERXMpLCBzdWNoIGFzIEludGVsbGlKIElERUEgYW5kIEFwYWNoZQorTmV0QmVhbnMuIFRoZXNlIHBsdWdpbnMgdHlwaWNhbGx5IHByb3ZpZGUgZmVhdHVyZXMgc3VjaCBhcyBzY2hlbWEKK21hbmFnZW1lbnQgYW5kIHF1ZXJ5IGV4ZWN1dGlvbi4KKworU29tZSBJREVzIGFuZCB0b29scyB0aGF0IGNsYWltIHRvIHN1cHBvcnQgQ2Fzc2FuZHJhIGRvIG5vdCBhY3R1YWxseQorc3VwcG9ydCBDUUwgbmF0aXZlbHksIGJ1dCBpbnN0ZWFkIGFjY2VzcyBDYXNzYW5kcmEgdXNpbmcgYSBKREJDL09EQkMKK2RyaXZlciBhbmQgaW50ZXJhY3Qgd2l0aCBDYXNzYW5kcmEgYXMgaWYgaXQgd2VyZSBhIHJlbGF0aW9uYWwgZGF0YWJhc2UKK3dpdGggU1FMIHN1cHBvcnQuIFdoZW4gc2VsZWN0aW5nIHRvb2xzIGZvciB3b3JraW5nIHdpdGggQ2Fzc2FuZHJhIHlvdeKAmWxsCit3YW50IHRvIG1ha2Ugc3VyZSB0aGV5IHN1cHBvcnQgQ1FMIGFuZCByZWluZm9yY2UgQ2Fzc2FuZHJhIGJlc3QKK3ByYWN0aWNlcyBmb3IgZGF0YSBtb2RlbGluZyBhcyBwcmVzZW50ZWQgaW4gdGhpcyBkb2N1bWVudGF0aW9uLgorCitfTWF0ZXJpYWwgYWRhcHRlZCBmcm9tIENhc3NhbmRyYSwgVGhlIERlZmluaXRpdmUgR3VpZGUuIFB1Ymxpc2hlZCBieQorTydSZWlsbHkgTWVkaWEsIEluYy4gQ29weXJpZ2h0IMKpIDIwMjAgSmVmZiBDYXJwZW50ZXIsIEViZW4gSGV3aXR0LiBBbGwKK3JpZ2h0cyByZXNlcnZlZC4gVXNlZCB3aXRoIHBlcm1pc3Npb24uXwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvaW1hZ2VzL0ZpZ3VyZV8xX2RhdGFfbW9kZWwuanBnIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbWFnZXMvRmlndXJlXzFfZGF0YV9tb2RlbC5qcGcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2ltYWdlcy9GaWd1cmVfMV9kYXRhX21vZGVsLmpwZwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbWFnZXMvRmlndXJlXzFfZGF0YV9tb2RlbC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvaW1hZ2VzL0ZpZ3VyZV8yX2RhdGFfbW9kZWwuanBnIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbWFnZXMvRmlndXJlXzJfZGF0YV9tb2RlbC5qcGcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2ltYWdlcy9GaWd1cmVfMl9kYXRhX21vZGVsLmpwZwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbWFnZXMvRmlndXJlXzJfZGF0YV9tb2RlbC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfY2hlYm90a29fbG9naWNhbC5wbmcgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX2NoZWJvdGtvX2xvZ2ljYWwucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19jaGVib3Rrb19sb2dpY2FsLnBuZwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19jaGVib3Rrb19sb2dpY2FsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19jaGVib3Rrb19waHlzaWNhbC5wbmcgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX2NoZWJvdGtvX3BoeXNpY2FsLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfY2hlYm90a29fcGh5c2ljYWwucG5nCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX2NoZWJvdGtvX3BoeXNpY2FsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19ob3RlbF9idWNrZXRpbmcucG5nIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19ob3RlbF9idWNrZXRpbmcucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19ob3RlbF9idWNrZXRpbmcucG5nCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX2hvdGVsX2J1Y2tldGluZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfaG90ZWxfZXJkLnBuZyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfaG90ZWxfZXJkLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfaG90ZWxfZXJkLnBuZwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19ob3RlbF9lcmQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX2hvdGVsX2xvZ2ljYWwucG5nIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19ob3RlbF9sb2dpY2FsLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfaG90ZWxfbG9naWNhbC5wbmcKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfaG90ZWxfbG9naWNhbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfaG90ZWxfcGh5c2ljYWwucG5nIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19ob3RlbF9waHlzaWNhbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX2hvdGVsX3BoeXNpY2FsLnBuZwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19ob3RlbF9waHlzaWNhbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfaG90ZWxfcXVlcmllcy5wbmcgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX2hvdGVsX3F1ZXJpZXMucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19ob3RlbF9xdWVyaWVzLnBuZwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19ob3RlbF9xdWVyaWVzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19ob3RlbF9yZWxhdGlvbmFsLnBuZyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfaG90ZWxfcmVsYXRpb25hbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX2hvdGVsX3JlbGF0aW9uYWwucG5nCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX2hvdGVsX3JlbGF0aW9uYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX3Jlc2VydmF0aW9uX2xvZ2ljYWwucG5nIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19yZXNlcnZhdGlvbl9sb2dpY2FsLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfcmVzZXJ2YXRpb25fbG9naWNhbC5wbmcKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfcmVzZXJ2YXRpb25fbG9naWNhbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfcmVzZXJ2YXRpb25fcGh5c2ljYWwucG5nIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19yZXNlcnZhdGlvbl9waHlzaWNhbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX3Jlc2VydmF0aW9uX3BoeXNpY2FsLnBuZwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19yZXNlcnZhdGlvbl9waHlzaWNhbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbmRleC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbmRleC5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1M2U0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2luZGV4LmFkb2MKQEAgLTAsMCArMSwxMSBAQAorPSBEYXRhIE1vZGVsaW5nCisKKyogeHJlZjpkYXRhLW1vZGVsaW5nL2ludHJvLmFkb2NbSW50cm9kdWN0aW9uXQorKiB4cmVmOmRhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19yZGJtcy5hZG9jW1JEQk1TXQorKiB4cmVmOmRhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19jb25jZXB0dWFsLmFkb2NbQ29uY2VwdHVhbF0KKyogeHJlZjpkYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfbG9naWNhbC5hZG9jW0xvZ2ljYWxdCisqIHhyZWY6ZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX3BoeXNpY2FsLmFkb2NbUGh5c2ljYWxdCisqIHhyZWY6ZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX3NjaGVtYS5hZG9jW1NjaGVtYV0KKyogeHJlZjpkYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfcXVlcmllcy5hZG9jW1F1ZXJpZXNdCisqIHhyZWY6ZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX3JlZmluaW5nLmFkb2NbUmVmaW5pbmddCisqIHhyZWY6ZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX3Rvb2xzLmFkb2NbVG9vbHNdCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9pbnRyby5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbnRyby5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9pbnRyby5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2ludHJvLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9mYXEvaW5kZXguYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9mYXEvaW5kZXguYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3NGRiOS4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZmFxL2luZGV4LmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotPSBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucwotCi1bW3doeS1jYW50LWxpc3QtYWxsXV0KLT09IFdoeSBjYW4ndCBJIHNldCBgbGlzdGVuX2FkZHJlc3NgIHRvIGxpc3RlbiBvbiAwLjAuMC4wIChhbGwgbXkgYWRkcmVzc2VzKT8KLQotQ2Fzc2FuZHJhIGlzIGEgZ29zc2lwLWJhc2VkIGRpc3RyaWJ1dGVkIHN5c3RlbSBhbmQgYGxpc3Rlbl9hZGRyZXNzYCBpcwotdGhlIGFkZHJlc3MgYSBub2RlIHRlbGxzIG90aGVyIG5vZGVzIHRvIHJlYWNoIGl0IGF0LiBUZWxsaW5nIG90aGVyIG5vZGVzCi0iY29udGFjdCBtZSBvbiBhbnkgb2YgbXkgYWRkcmVzc2VzIiBpcyBhIGJhZCBpZGVhOyBpZiBkaWZmZXJlbnQgbm9kZXMgaW4KLXRoZSBjbHVzdGVyIHBpY2sgZGlmZmVyZW50IGFkZHJlc3NlcyBmb3IgeW91LCBCYWQgVGhpbmdzIGhhcHBlbi4KLQotSWYgeW91IGRvbid0IHdhbnQgdG8gbWFudWFsbHkgc3BlY2lmeSBhbiBJUCB0byBgbGlzdGVuX2FkZHJlc3NgIGZvciBlYWNoCi1ub2RlIGluIHlvdXIgY2x1c3RlciAodW5kZXJzdGFuZGFibGUhKSwgbGVhdmUgaXQgYmxhbmsgYW5kIENhc3NhbmRyYQotd2lsbCB1c2UgYEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpYCB0byBwaWNrIGFuIGFkZHJlc3MuIFRoZW4gaXQncyB1cAotdG8geW91IG9yIHlvdXIgb3BzIHRlYW0gdG8gbWFrZSB0aGluZ3MgcmVzb2x2ZSBjb3JyZWN0bHkgKGAvZXRjL2hvc3RzL2AsCi1kbnMsIGV0YykuCi0KLU9uZSBleGNlcHRpb24gdG8gdGhpcyBwcm9jZXNzIGlzIEpNWCwgd2hpY2ggYnkgZGVmYXVsdCBiaW5kcyB0byAwLjAuMC4wCi0oSmF2YSBidWcgNjQyNTc2OSkuCi0KLVNlZSBgMjU2YCBhbmQgYDQzYCBmb3IgbW9yZSBnb3J5IGRldGFpbHMuCi0KLVtbd2hhdC1wb3J0c11dCi09PSBXaGF0IHBvcnRzIGRvZXMgQ2Fzc2FuZHJhIHVzZT8KLQotQnkgZGVmYXVsdCwgQ2Fzc2FuZHJhIHVzZXMgNzAwMCBmb3IgY2x1c3RlciBjb21tdW5pY2F0aW9uICg3MDAxIGlmIFNTTAotaXMgZW5hYmxlZCksIDkwNDIgZm9yIG5hdGl2ZSBwcm90b2NvbCBjbGllbnRzLCBhbmQgNzE5OSBmb3IgSk1YLiBUaGUKLWludGVybm9kZSBjb21tdW5pY2F0aW9uIGFuZCBuYXRpdmUgcHJvdG9jb2wgcG9ydHMgYXJlIGNvbmZpZ3VyYWJsZSBpbgotdGhlIGBjYXNzYW5kcmEteWFtbGAuIFRoZSBKTVggcG9ydCBpcyBjb25maWd1cmFibGUgaW4gYGNhc3NhbmRyYS1lbnYuc2hgCi0odGhyb3VnaCBKVk0gb3B0aW9ucykuIEFsbCBwb3J0cyBhcmUgVENQLgotCi1bW3doYXQtaGFwcGVucy1vbi1qb2luc11dCi09PSBXaGF0IGhhcHBlbnMgdG8gZXhpc3RpbmcgZGF0YSBpbiBteSBjbHVzdGVyIHdoZW4gSSBhZGQgbmV3IG5vZGVzPwotCi1XaGVuIGEgbmV3IG5vZGVzIGpvaW5zIGEgY2x1c3RlciwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGNvbnRhY3QgdGhlCi1vdGhlciBub2RlcyBpbiB0aGUgY2x1c3RlciBhbmQgY29weSB0aGUgcmlnaHQgZGF0YSB0byBpdHNlbGYuIFNlZQotYHRvcG9sb2d5LWNoYW5nZXNgLgotCi1bW2FzeW5jaC1kZWxldGVzXV0KLT09IEkgZGVsZXRlIGRhdGEgZnJvbSBDYXNzYW5kcmEsIGJ1dCBkaXNrIHVzYWdlIHN0YXlzIHRoZSBzYW1lLiBXaGF0IGdpdmVzPwotCi1EYXRhIHlvdSB3cml0ZSB0byBDYXNzYW5kcmEgZ2V0cyBwZXJzaXN0ZWQgdG8gU1NUYWJsZXMuIFNpbmNlIFNTVGFibGVzCi1hcmUgaW1tdXRhYmxlLCB0aGUgZGF0YSBjYW4ndCBhY3R1YWxseSBiZSByZW1vdmVkIHdoZW4geW91IHBlcmZvcm0gYQotZGVsZXRlLCBpbnN0ZWFkLCBhIG1hcmtlciAoYWxzbyBjYWxsZWQgYSAidG9tYnN0b25lIikgaXMgd3JpdHRlbiB0bwotaW5kaWNhdGUgdGhlIHZhbHVlJ3MgbmV3IHN0YXR1cy4gTmV2ZXIgZmVhciB0aG91Z2gsIG9uIHRoZSBmaXJzdAotY29tcGFjdGlvbiB0aGF0IG9jY3VycyBiZXR3ZWVuIHRoZSBkYXRhIGFuZCB0aGUgdG9tYnN0b25lLCB0aGUgZGF0YSB3aWxsCi1iZSBleHB1bmdlZCBjb21wbGV0ZWx5IGFuZCB0aGUgY29ycmVzcG9uZGluZyBkaXNrIHNwYWNlIHJlY292ZXJlZC4gU2VlCi1gY29tcGFjdGlvbmAgZm9yIG1vcmUgZGV0YWlsLgotCi1bW29uZS1lbnRyeS1yaW5nXV0KLT09IFdoeSBkb2VzIG5vZGV0b29sIHJpbmcgb25seSBzaG93IG9uZSBlbnRyeSwgZXZlbiB0aG91Z2ggbXkgbm9kZXMgbG9nZ2VkIHRoYXQgdGhleSBzZWUgZWFjaCBvdGhlciBqb2luaW5nIHRoZSByaW5nPwotCi1UaGlzIGhhcHBlbnMgd2hlbiB5b3UgaGF2ZSB0aGUgc2FtZSB0b2tlbiBhc3NpZ25lZCB0byBlYWNoIG5vZGUuIERvbid0Ci1kbyB0aGF0LgotCi1Nb3N0IG9mdGVuIHRoaXMgYml0ZXMgcGVvcGxlIHdobyBkZXBsb3kgYnkgaW5zdGFsbGluZyBDYXNzYW5kcmEgb24gYSBWTQotKGVzcGVjaWFsbHkgd2hlbiB1c2luZyB0aGUgRGViaWFuIHBhY2thZ2UsIHdoaWNoIGF1dG8tc3RhcnRzIENhc3NhbmRyYQotYWZ0ZXIgaW5zdGFsbGF0aW9uLCB0aHVzIGdlbmVyYXRpbmcgYW5kIHNhdmluZyBhIHRva2VuKSwgdGhlbiBjbG9uaW5nCi10aGF0IFZNIHRvIG90aGVyIG5vZGVzLgotCi1UaGUgZWFzaWVzdCBmaXggaXMgdG8gd2lwZSB0aGUgZGF0YSBhbmQgY29tbWl0bG9nIGRpcmVjdG9yaWVzLCB0aHVzCi1tYWtpbmcgc3VyZSB0aGF0IGVhY2ggbm9kZSB3aWxsIGdlbmVyYXRlIGEgcmFuZG9tIHRva2VuIG9uIHRoZSBuZXh0Ci1yZXN0YXJ0LgotCi1bW2NoYW5nZS1yZXBsaWNhdGlvbi1mYWN0b3JdXQotPT0gQ2FuIEkgY2hhbmdlIHRoZSByZXBsaWNhdGlvbiBmYWN0b3IgKGEgYSBrZXlzcGFjZSkgb24gYSBsaXZlIGNsdXN0ZXI/Ci0KLVllcywgYnV0IGl0IHdpbGwgcmVxdWlyZSBydW5uaW5nIGEgZnVsbCByZXBhaXIgKG9yIGNsZWFudXApIHRvIGNoYW5nZQotdGhlIHJlcGxpY2EgY291bnQgb2YgZXhpc3RpbmcgZGF0YToKLQotKiBgQWx0ZXIgPGFsdGVyLWtleXNwYWNlLXN0YXRlbWVudD5gIHRoZSByZXBsaWNhdGlvbiBmYWN0b3IgZm9yIGRlc2lyZWQKLWtleXNwYWNlICh1c2luZyBjcWxzaCBmb3IgaW5zdGFuY2UpLgotKiBJZiB5b3UncmUgcmVkdWNpbmcgdGhlIHJlcGxpY2F0aW9uIGZhY3RvciwgcnVuIGBub2RldG9vbCBjbGVhbnVwYCBvbgotdGhlIGNsdXN0ZXIgdG8gcmVtb3ZlIHN1cnBsdXMgcmVwbGljYXRlZCBkYXRhLiBDbGVhbnVwIHJ1bnMgb24gYQotcGVyLW5vZGUgYmFzaXMuCi0qIElmIHlvdSdyZSBpbmNyZWFzaW5nIHRoZSByZXBsaWNhdGlvbiBmYWN0b3IsIHJ1bgotYG5vZGV0b29sIHJlcGFpciAtZnVsbGAgdG8gZW5zdXJlIGRhdGEgaXMgcmVwbGljYXRlZCBhY2NvcmRpbmcgdG8gdGhlCi1uZXcgY29uZmlndXJhdGlvbi4gUmVwYWlyIHJ1bnMgb24gYSBwZXItcmVwbGljYSBzZXQgYmFzaXMuIFRoaXMgaXMgYW4KLWludGVuc2l2ZSBwcm9jZXNzIHRoYXQgbWF5IHJlc3VsdCBpbiBhZHZlcnNlIGNsdXN0ZXIgcGVyZm9ybWFuY2UuIEl0J3MKLWhpZ2hseSByZWNvbW1lbmRlZCB0byBkbyByb2xsaW5nIHJlcGFpcnMsIGFzIGFuIGF0dGVtcHQgdG8gcmVwYWlyIHRoZQotZW50aXJlIGNsdXN0ZXIgYXQgb25jZSB3aWxsIG1vc3QgbGlrZWx5IHN3YW1wIGl0LiBOb3RlIHRoYXQgeW91IHdpbGwKLW5lZWQgdG8gcnVuIGEgZnVsbCByZXBhaXIgKGAtZnVsbGApIHRvIG1ha2Ugc3VyZSB0aGF0IGFscmVhZHkgcmVwYWlyZWQKLXNzdGFibGVzIGFyZSBub3Qgc2tpcHBlZC4KLQotW1tjYW4tbGFyZ2UtYmxvYl1dCi09PSBDYW4gSSBTdG9yZSAobGFyZ2UpIEJMT0JzIGluIENhc3NhbmRyYT8KLQotQ2Fzc2FuZHJhIGlzbid0IG9wdGltaXplZCBmb3IgbGFyZ2UgZmlsZSBvciBCTE9CIHN0b3JhZ2UgYW5kIGEgc2luZ2xlCi1gYmxvYmAgdmFsdWUgaXMgYWx3YXlzIHJlYWQgYW5kIHNlbmQgdG8gdGhlIGNsaWVudCBlbnRpcmVseS4gQXMgc3VjaCwKLXN0b3Jpbmcgc21hbGwgYmxvYnMgKGxlc3MgdGhhbiBzaW5nbGUgZGlnaXQgTUIpIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtLAotYnV0IGl0IGlzIGFkdmlzZWQgdG8gbWFudWFsbHkgc3BsaXQgbGFyZ2UgYmxvYnMgaW50byBzbWFsbGVyIGNodW5rcy4KLQotUGxlYXNlIG5vdGUgaW4gcGFydGljdWxhciB0aGF0IGJ5IGRlZmF1bHQsIGFueSB2YWx1ZSBncmVhdGVyIHRoYW4gMTZNaUIKLXdpbGwgYmUgcmVqZWN0ZWQgYnkgQ2Fzc2FuZHJhIGR1ZSB0aGUgYG1heF9tdXRhdGlvbl9zaXplYAotY29uZmlndXJhdGlvbiBvZiB0aGUgYGNhc3NhbmRyYS15YW1sYCBmaWxlICh3aGljaCBkZWZhdWx0IHRvIGhhbGYgb2YKLWBjb21taXRsb2dfc2VnbWVudF9zaXplYCwgd2hpY2ggaXRzZWxmIGRlZmF1bHQgdG8gMzJNaUIpLgotCi1bW25vZGV0b29sLWNvbm5lY3Rpb24tcmVmdXNlZF1dCi09PSBOb2RldG9vbCBzYXlzICJDb25uZWN0aW9uIHJlZnVzZWQgdG8gaG9zdDogMTI3LjAuMS4xIiBmb3IgYW55IHJlbW90ZSBob3N0LiBXaGF0IGdpdmVzPwotCi1Ob2RldG9vbCByZWxpZXMgb24gSk1YLCB3aGljaCBpbiB0dXJuIHJlbGllcyBvbiBSTUksIHdoaWNoIGluIHR1cm4gc2V0cwotdXAgaXRzIG93biBsaXN0ZW5lcnMgYW5kIGNvbm5lY3RvcnMgYXMgbmVlZGVkIG9uIGVhY2ggZW5kIG9mIHRoZQotZXhjaGFuZ2UuIE5vcm1hbGx5IGFsbCBvZiB0aGlzIGhhcHBlbnMgYmVoaW5kIHRoZSBzY2VuZXMgdHJhbnNwYXJlbnRseSwKLWJ1dCBpbmNvcnJlY3QgbmFtZSByZXNvbHV0aW9uIGZvciBlaXRoZXIgdGhlIGhvc3QgY29ubmVjdGluZywgb3IgdGhlIG9uZQotYmVpbmcgY29ubmVjdGVkIHRvLCBjYW4gcmVzdWx0IGluIGNyb3NzZWQgd2lyZXMgYW5kIGNvbmZ1c2luZwotZXhjZXB0aW9ucy4KLQotSWYgeW91IGFyZSBub3QgdXNpbmcgRE5TLCB0aGVuIG1ha2Ugc3VyZSB0aGF0IHlvdXIgYC9ldGMvaG9zdHNgIGZpbGVzCi1hcmUgYWNjdXJhdGUgb24gYm90aCBlbmRzLiBJZiB0aGF0IGZhaWxzLCB0cnkgc2V0dGluZyB0aGUKLWAtRGphdmEucm1pLnNlcnZlci5ob3N0bmFtZT08cHVibGljIG5hbWU+YCBKVk0gb3B0aW9uIG5lYXIgdGhlIGJvdHRvbSBvZgotYGNhc3NhbmRyYS1lbnYuc2hgIHRvIGFuIGludGVyZmFjZSB0aGF0IHlvdSBjYW4gcmVhY2ggZnJvbSB0aGUgcmVtb3RlCi1tYWNoaW5lLgotCi1bW3RvLWJhdGNoLW9yLW5vdC10by1iYXRjaF1dCi09PSBXaWxsIGJhdGNoaW5nIG15IG9wZXJhdGlvbnMgc3BlZWQgdXAgbXkgYnVsayBsb2FkPwotCi1Oby4gVXNpbmcgYmF0Y2hlcyB0byBsb2FkIGRhdGEgd2lsbCBnZW5lcmFsbHkganVzdCBhZGQgInNwaWtlcyIgb2YKLWxhdGVuY3kuIFVzZSBhc3luY2hyb25vdXMgSU5TRVJUcyBpbnN0ZWFkLCBvciB1c2UgdHJ1ZSBgYnVsay1sb2FkaW5nYC4KLQotQW4gZXhjZXB0aW9uIGlzIGJhdGNoaW5nIHVwZGF0ZXMgdG8gYSBzaW5nbGUgcGFydGl0aW9uLCB3aGljaCBjYW4gYmUgYQotR29vZCBUaGluZyAoYXMgbG9uZyBhcyB0aGUgc2l6ZSBvZiBhIHNpbmdsZSBiYXRjaCBzdGF5IHJlYXNvbmFibGUpLiBCdXQKLW5ldmVyIGV2ZXIgYmxpbmRseSBiYXRjaCBldmVyeXRoaW5nIQotCi1bW3NlbGludXhdXQotPT0gT24gUkhFTCBub2RlcyBhcmUgdW5hYmxlIHRvIGpvaW4gdGhlIHJpbmcKLQotQ2hlY2sgaWYgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2VjdXJpdHktRW5oYW5jZWRfTGludXhbU0VMaW51eF0KLWlzIG9uOyBpZiBpdCBpcywgdHVybiBpdCBvZmYuCi0KLVtbaG93LXRvLXVuc3Vic2NyaWJlXV0KLT09IEhvdyBkbyBJIHVuc3Vic2NyaWJlIGZyb20gdGhlIGVtYWlsIGxpc3Q/Ci0KLVNlbmQgYW4gZW1haWwgdG8gYHVzZXItdW5zdWJzY3JpYmVAY2Fzc2FuZHJhLmFwYWNoZS5vcmdgLgotCi1bW2Nhc3NhbmRyYS1lYXRzLWFsbC1teS1tZW1vcnldXQotPT0gV2h5IGRvZXMgdG9wIHJlcG9ydCB0aGF0IENhc3NhbmRyYSBpcyB1c2luZyBhIGxvdCBtb3JlIG1lbW9yeSB0aGFuIHRoZSBKYXZhIGhlYXAgbWF4PwotCi1DYXNzYW5kcmEgdXNlcyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NZW1vcnktbWFwcGVkX2ZpbGVbTWVtb3J5Ci1NYXBwZWQgRmlsZXNdIChtbWFwKSBpbnRlcm5hbGx5LiBUaGF0IGlzLCB3ZSB1c2UgdGhlIG9wZXJhdGluZyBzeXN0ZW0ncwotdmlydHVhbCBtZW1vcnkgc3lzdGVtIHRvIG1hcCBhIG51bWJlciBvZiBvbi1kaXNrIGZpbGVzIGludG8gdGhlCi1DYXNzYW5kcmEgcHJvY2VzcycgYWRkcmVzcyBzcGFjZS4gVGhpcyB3aWxsICJ1c2UiIHZpcnR1YWwgbWVtb3J5OyBpLmUuCi1hZGRyZXNzIHNwYWNlLCBhbmQgd2lsbCBiZSByZXBvcnRlZCBieSB0b29scyBsaWtlIHRvcCBhY2NvcmRpbmdseSwgYnV0Ci1vbiA2NCBiaXQgc3lzdGVtcyB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgaXMgZWZmZWN0aXZlbHkgdW5saW1pdGVkIHNvIHlvdQotc2hvdWxkIG5vdCB3b3JyeSBhYm91dCB0aGF0LgotCi1XaGF0IG1hdHRlcnMgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgIm1lbW9yeSB1c2UiIGluIHRoZSBzZW5zZSBhcyBpdCBpcwotbm9ybWFsbHkgbWVhbnQsIGlzIHRoZSBhbW91bnQgb2YgZGF0YSBhbGxvY2F0ZWQgb24gYnJrKCkgb3IgbW1hcCdkCi0vZGV2L3plcm8sIHdoaWNoIHJlcHJlc2VudCByZWFsIG1lbW9yeSB1c2VkLiBUaGUga2V5IGlzc3VlIGlzIHRoYXQgZm9yIGEKLW1tYXAnZCBmaWxlLCB0aGVyZSBpcyBuZXZlciBhIG5lZWQgdG8gcmV0YWluIHRoZSBkYXRhIHJlc2lkZW50IGluCi1waHlzaWNhbCBtZW1vcnkuIFRodXMsIHdoYXRldmVyIHlvdSBkbyBrZWVwIHJlc2lkZW50IGluIHBoeXNpY2FsIG1lbW9yeQotaXMgZXNzZW50aWFsbHkganVzdCB0aGVyZSBhcyBhIGNhY2hlLCBpbiB0aGUgc2FtZSB3YXkgYXMgbm9ybWFsIEkvTyB3aWxsCi1jYXVzZSB0aGUga2VybmVsIHBhZ2UgY2FjaGUgdG8gcmV0YWluIGRhdGEgdGhhdCB5b3UgcmVhZC93cml0ZS4KLQotVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBub3JtYWwgSS9PIGFuZCBtbWFwKCkgaXMgdGhhdCBpbiB0aGUgbW1hcCgpIGNhc2UKLXRoZSBtZW1vcnkgaXMgYWN0dWFsbHkgbWFwcGVkIHRvIHRoZSBwcm9jZXNzLCB0aHVzIGFmZmVjdGluZyB0aGUgdmlydHVhbAotc2l6ZSBhcyByZXBvcnRlZCBieSB0b3AuIFRoZSBtYWluIGFyZ3VtZW50IGZvciB1c2luZyBtbWFwKCkgaW5zdGVhZCBvZgotc3RhbmRhcmQgSS9PIGlzIHRoZSBmYWN0IHRoYXQgcmVhZGluZyBlbnRhaWxzIGp1c3QgdG91Y2hpbmcgbWVtb3J5IC0gaW4KLXRoZSBjYXNlIG9mIHRoZSBtZW1vcnkgYmVpbmcgcmVzaWRlbnQsIHlvdSBqdXN0IHJlYWQgaXQgLSB5b3UgZG9uJ3QgZXZlbgotdGFrZSBhIHBhZ2UgZmF1bHQgKHNvIG5vIG92ZXJoZWFkIGluIGVudGVyaW5nIHRoZSBrZXJuZWwgYW5kIGRvaW5nIGEKLXNlbWktY29udGV4dCBzd2l0Y2gpLiBUaGlzIGlzIGNvdmVyZWQgaW4gbW9yZSBkZXRhaWwKLWh0dHA6Ly93d3cudmFybmlzaC1jYWNoZS5vcmcvdHJhYy93aWtpL0FyY2hpdGVjdE5vdGVzW2hlcmVdLgotCi09PSBXaGF0IGFyZSBzZWVkcz8KLQotU2VlZHMgYXJlIHVzZWQgZHVyaW5nIHN0YXJ0dXAgdG8gZGlzY292ZXIgdGhlIGNsdXN0ZXIuCi0KLUlmIHlvdSBjb25maWd1cmUgeW91ciBub2RlcyB0byByZWZlciBzb21lIG5vZGUgYXMgc2VlZCwgbm9kZXMgaW4geW91cgotcmluZyB0ZW5kIHRvIHNlbmQgR29zc2lwIG1lc3NhZ2UgdG8gc2VlZHMgbW9yZSBvZnRlbiAoYWxzbyBzZWUgdGhlCi1gc2VjdGlvbiBvbiBnb3NzaXAgPGdvc3NpcD5gKSB0aGFuIHRvIG5vbi1zZWVkcy4gSW4gb3RoZXIgd29yZHMsIHNlZWRzCi1hcmUgd29ya2VkIGFzIGh1YnMgb2YgR29zc2lwIG5ldHdvcmsuIFdpdGggc2VlZHMsIGVhY2ggbm9kZSBjYW4gZGV0ZWN0Ci1zdGF0dXMgY2hhbmdlcyBvZiBvdGhlciBub2RlcyBxdWlja2x5LgotCi1TZWVkcyBhcmUgYWxzbyByZWZlcnJlZCBieSBuZXcgbm9kZXMgb24gYm9vdHN0cmFwIHRvIGxlYXJuIG90aGVyIG5vZGVzCi1pbiByaW5nLiBXaGVuIHlvdSBhZGQgYSBuZXcgbm9kZSB0byByaW5nLCB5b3UgbmVlZCB0byBzcGVjaWZ5IGF0IGxlYXN0Ci1vbmUgbGl2ZSBzZWVkIHRvIGNvbnRhY3QuIE9uY2UgYSBub2RlIGpvaW4gdGhlIHJpbmcsIGl0IGxlYXJucyBhYm91dCB0aGUKLW90aGVyIG5vZGVzLCBzbyBpdCBkb2Vzbid0IG5lZWQgc2VlZCBvbiBzdWJzZXF1ZW50IGJvb3QuCi0KLVlvdSBjYW4gbWFrZSBhIHNlZWQgYSBub2RlIGF0IGFueSB0aW1lLiBUaGVyZSBpcyBub3RoaW5nIHNwZWNpYWwgYWJvdXQKLXNlZWQgbm9kZXMuIElmIHlvdSBsaXN0IHRoZSBub2RlIGluIHNlZWQgbGlzdCBpdCBpcyBhIHNlZWQKLQotU2VlZHMgZG8gbm90IGF1dG8gYm9vdHN0cmFwIChpLmUuIGlmIGEgbm9kZSBoYXMgaXRzZWxmIGluIGl0cyBzZWVkIGxpc3QKLWl0IHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgdHJhbnNmZXIgZGF0YSB0byBpdHNlbGYpIElmIHlvdSB3YW50IGEgbm9kZSB0bwotZG8gdGhhdCwgYm9vdHN0cmFwIGl0IGZpcnN0IGFuZCB0aGVuIGFkZCBpdCB0byBzZWVkcyBsYXRlci4gSWYgeW91IGhhdmUKLW5vIGRhdGEgKG5ldyBpbnN0YWxsKSB5b3UgZG8gbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgYm9vdHN0cmFwIGF0IGFsbC4KLQotUmVjb21tZW5kZWQgdXNhZ2Ugb2Ygc2VlZHM6Ci0KLSogcGljayB0d28gKG9yIG1vcmUpIG5vZGVzIHBlciBkYXRhIGNlbnRlciBhcyBzZWVkIG5vZGVzLgotKiBzeW5jIHRoZSBzZWVkIGxpc3QgdG8gYWxsIHlvdXIgbm9kZXMKLQotW1thcmUtc2VlZHMtU1BPRl1dCi09PSBEb2VzIHNpbmdsZSBzZWVkIG1lYW4gc2luZ2xlIHBvaW50IG9mIGZhaWx1cmU/Ci0KLVRoZSByaW5nIGNhbiBvcGVyYXRlIG9yIGJvb3Qgd2l0aG91dCBhIHNlZWQ7IGhvd2V2ZXIsIHlvdSB3aWxsIG5vdCBiZQotYWJsZSB0byBhZGQgbmV3IG5vZGVzIHRvIHRoZSBjbHVzdGVyLiBJdCBpcyByZWNvbW1lbmRlZCB0byBjb25maWd1cmUKLW11bHRpcGxlIHNlZWRzIGluIHByb2R1Y3Rpb24gc3lzdGVtLgotCi1bW2NhbnQtY2FsbC1qbXgtbWV0aG9kXV0KLT09IFdoeSBjYW4ndCBJIGNhbGwgam14IG1ldGhvZCBYIG9uIGpjb25zb2xlPwotCi1Tb21lIG9mIEpNWCBvcGVyYXRpb25zIHVzZSBhcnJheSBhcmd1bWVudCBhbmQgYXMgamNvbnNvbGUgZG9lc24ndAotc3VwcG9ydCBhcnJheSBhcmd1bWVudCwgdGhvc2Ugb3BlcmF0aW9ucyBjYW4ndCBiZSBjYWxsZWQgd2l0aCBqY29uc29sZQotKHRoZSBidXR0b25zIGFyZSBpbmFjdGl2ZSBmb3IgdGhlbSkuIFlvdSBuZWVkIHRvIHdyaXRlIGEgSk1YIGNsaWVudCB0bwotY2FsbCBzdWNoIG9wZXJhdGlvbnMgb3IgbmVlZCBhcnJheS1jYXBhYmxlIEpNWCBtb25pdG9yaW5nIHRvb2wuCi0KLVtbd2h5LW1lc3NhZ2UtZHJvcHBlZF1dCi09PSBXaHkgZG8gSSBzZWUgIi4uLiBtZXNzYWdlcyBkcm9wcGVkIC4uLiIgaW4gdGhlIGxvZ3M/Ci0KLVRoaXMgaXMgYSBzeW1wdG9tIG9mIGxvYWQgc2hlZGRpbmcgLS0gQ2Fzc2FuZHJhIGRlZmVuZGluZyBpdHNlbGYgYWdhaW5zdAotbW9yZSByZXF1ZXN0cyB0aGFuIGl0IGNhbiBoYW5kbGUuCi0KLUludGVybm9kZSBtZXNzYWdlcyB3aGljaCBhcmUgcmVjZWl2ZWQgYnkgYSBub2RlLCBidXQgZG8gbm90IGdldCBub3QgdG8KLWJlIHByb2Nlc3NlZCB3aXRoaW4gdGhlaXIgcHJvcGVyIHRpbWVvdXQgKHNlZSBgcmVhZF9yZXF1ZXN0X3RpbWVvdXRgLAotYHdyaXRlX3JlcXVlc3RfdGltZW91dGAsIC4uLiBpbiB0aGUgYGNhc3NhbmRyYS15YW1sYCksIGFyZSBkcm9wcGVkCi1yYXRoZXIgdGhhbiBwcm9jZXNzZWQgKHNpbmNlIHRoZSBhcyB0aGUgY29vcmRpbmF0b3Igbm9kZSB3aWxsIG5vIGxvbmdlcgotYmUgd2FpdGluZyBmb3IgYSByZXNwb25zZSkuCi0KLUZvciB3cml0ZXMsIHRoaXMgbWVhbnMgdGhhdCB0aGUgbXV0YXRpb24gd2FzIG5vdCBhcHBsaWVkIHRvIGFsbCByZXBsaWNhcwotaXQgd2FzIHNlbnQgdG8uIFRoZSBpbmNvbnNpc3RlbmN5IHdpbGwgYmUgcmVwYWlyZWQgYnkgcmVhZCByZXBhaXIsIGhpbnRzCi1vciBhIG1hbnVhbCByZXBhaXIuIFRoZSB3cml0ZSBvcGVyYXRpb24gbWF5IGFsc28gaGF2ZSB0aW1lb3V0ZWQgYXMgYQotcmVzdWx0LgotCi1Gb3IgcmVhZHMsIHRoaXMgbWVhbnMgYSByZWFkIHJlcXVlc3QgbWF5IG5vdCBoYXZlIGNvbXBsZXRlZC4KLQotTG9hZCBzaGVkZGluZyBpcyBwYXJ0IG9mIHRoZSBDYXNzYW5kcmEgYXJjaGl0ZWN0dXJlLCBpZiB0aGlzIGlzIGEKLXBlcnNpc3RlbnQgaXNzdWUgaXQgaXMgZ2VuZXJhbGx5IGEgc2lnbiBvZiBhbiBvdmVybG9hZGVkIG5vZGUgb3IKLWNsdXN0ZXIuCi0KLVtbb29tLW1hcC1mYWlsZWRdXQotPT0gQ2Fzc2FuZHJhIGRpZXMgd2l0aCBgamF2YS5sYW5nLk91dE9mTWVtb3J5RXJyb3I6IE1hcCBmYWlsZWRgCi0KLUlmIENhc3NhbmRyYSBpcyBkeWluZyAqc3BlY2lmaWNhbGx5KiB3aXRoIHRoZSAiTWFwIGZhaWxlZCIgbWVzc2FnZSwgaXQKLW1lYW5zIHRoZSBPUyBpcyBkZW55aW5nIGphdmEgdGhlIGFiaWxpdHkgdG8gbG9jayBtb3JlIG1lbW9yeS4gSW4gbGludXgsCi10aGlzIHR5cGljYWxseSBtZWFucyBtZW1sb2NrIGlzIGxpbWl0ZWQuIENoZWNrCi1gL3Byb2MvPHBpZCBvZiBjYXNzYW5kcmE+L2xpbWl0c2AgdG8gdmVyaWZ5IHRoaXMgYW5kIHJhaXNlIGl0IChlZywgdmlhCi11bGltaXQgaW4gYmFzaCkuIFlvdSBtYXkgYWxzbyBuZWVkIHRvIGluY3JlYXNlIGB2bS5tYXhfbWFwX2NvdW50LmAgTm90ZQotdGhhdCB0aGUgZGViaWFuIHBhY2thZ2UgaGFuZGxlcyB0aGlzIGZvciB5b3UgYXV0b21hdGljYWxseS4KLQotW1t3aGF0LW9uLXNhbWUtdGltZXN0YW1wLXVwZGF0ZV1dCi09PSBXaGF0IGhhcHBlbnMgaWYgdHdvIHVwZGF0ZXMgYXJlIG1hZGUgd2l0aCB0aGUgc2FtZSB0aW1lc3RhbXA/Ci0KLVVwZGF0ZXMgbXVzdCBiZSBjb21tdXRhdGl2ZSwgc2luY2UgdGhleSBtYXkgYXJyaXZlIGluIGRpZmZlcmVudCBvcmRlcnMKLW9uIGRpZmZlcmVudCByZXBsaWNhcy4gQXMgbG9uZyBhcyBDYXNzYW5kcmEgaGFzIGEgZGV0ZXJtaW5pc3RpYyB3YXkgdG8KLXBpY2sgdGhlIHdpbm5lciAoaW4gYSB0aW1lc3RhbXAgdGllKSwgdGhlIG9uZSBzZWxlY3RlZCBpcyBhcyB2YWxpZCBhcwotYW55IG90aGVyLCBhbmQgdGhlIHNwZWNpZmljcyBzaG91bGQgYmUgdHJlYXRlZCBhcyBhbiBpbXBsZW1lbnRhdGlvbgotZGV0YWlsLiBUaGF0IHNhaWQsIGluIHRoZSBjYXNlIG9mIGEgdGltZXN0YW1wIHRpZSwgQ2Fzc2FuZHJhIGZvbGxvd3MgdHdvCi1ydWxlczogZmlyc3QsIGRlbGV0ZXMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgaW5zZXJ0cy91cGRhdGVzLiBTZWNvbmQsIGlmCi10aGVyZSBhcmUgdHdvIHVwZGF0ZXMsIHRoZSBvbmUgd2l0aCB0aGUgbGV4aWNhbGx5IGxhcmdlciB2YWx1ZSBpcwotc2VsZWN0ZWQuCi0KLVtbd2h5LWJvb3RzdHJhcHBpbmctc3RyZWFtLWVycm9yXV0KLT09IFdoeSBib290c3RyYXBwaW5nIGEgbmV3IG5vZGUgZmFpbHMgd2l0aCBhICJTdHJlYW0gZmFpbGVkIiBlcnJvcj8KLQotVHdvIG1haW4gcG9zc2liaWxpdGllczoKLQotLiB0aGUgR0MgbWF5IGJlIGNyZWF0aW5nIGxvbmcgcGF1c2VzIGRpc3J1cHRpbmcgdGhlIHN0cmVhbWluZyBwcm9jZXNzCi0uIGNvbXBhY3Rpb25zIGhhcHBlbmluZyBpbiB0aGUgYmFja2dyb3VuZCBob2xkIHN0cmVhbWluZyBsb25nIGVub3VnaAotdGhhdCB0aGUgVENQIGNvbm5lY3Rpb24gZmFpbHMKLQotSW4gdGhlIGZpcnN0IGNhc2UsIHJlZ3VsYXIgR0MgdHVuaW5nIGFkdmljZXMgYXBwbHkuIEluIHRoZSBzZWNvbmQgY2FzZSwKLXlvdSBuZWVkIHRvIHNldCBUQ1Aga2VlcGFsaXZlIHRvIGEgbG93ZXIgdmFsdWUgKGRlZmF1bHQgaXMgdmVyeSBoaWdoIG9uCi1MaW51eCkuIFRyeSB0byBqdXN0IHJ1biB0aGUgZm9sbG93aW5nOgotCi0uLi4uCi0kIHN1ZG8gL3NiaW4vc3lzY3RsIC13IG5ldC5pcHY0LnRjcF9rZWVwYWxpdmVfdGltZT02MCBuZXQuaXB2NC50Y3Bfa2VlcGFsaXZlX2ludHZsPTYwIG5ldC5pcHY0LnRjcF9rZWVwYWxpdmVfcHJvYmVzPTUKLS4uLi4KLQotVG8gbWFrZSB0aG9zZSBzZXR0aW5ncyBwZXJtYW5lbnQsIGFkZCB0aGVtIHRvIHlvdXIgYC9ldGMvc3lzY3RsLmNvbmZgCi1maWxlLgotCi1Ob3RlOiBodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vY29tcHV0ZS9bR0NFXSdzIGZpcmV3YWxsIHdpbGwgYWx3YXlzCi1pbnRlcnJ1cHQgVENQIGNvbm5lY3Rpb25zIHRoYXQgYXJlIGluYWN0aXZlIGZvciBtb3JlIHRoYW4gMTAgbWluLgotUnVubmluZyB0aGUgYWJvdmUgY29tbWFuZCBpcyBoaWdobHkgcmVjb21tZW5kZWQgaW4gdGhhdCBlbnZpcm9ubWVudC4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nX3N0YXJ0ZWQvY29uZmlndXJpbmcuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nLXN0YXJ0ZWQvY29uZmlndXJpbmcuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmdfc3RhcnRlZC9jb25maWd1cmluZy5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZy1zdGFydGVkL2NvbmZpZ3VyaW5nLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nLXN0YXJ0ZWQvZHJpdmVycy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmctc3RhcnRlZC9kcml2ZXJzLmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlYjYxMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nLXN0YXJ0ZWQvZHJpdmVycy5hZG9jCkBAIC0wLDAgKzEsOTAgQEAKKz0gQ2xpZW50IGRyaXZlcnMKKworSGVyZSBhcmUga25vd24gQ2Fzc2FuZHJhIGNsaWVudCBkcml2ZXJzIG9yZ2FuaXplZCBieSBsYW5ndWFnZS4gQmVmb3JlCitjaG9vc2luZyBhIGRyaXZlciwgeW91IHNob3VsZCB2ZXJpZnkgdGhlIENhc3NhbmRyYSB2ZXJzaW9uIGFuZAorZnVuY3Rpb25hbGl0eSBzdXBwb3J0ZWQgYnkgYSBzcGVjaWZpYyBkcml2ZXIuCisKKz09IEphdmEKKworKiBodHRwOi8vYWNoaWxsZXMuYXJjaGlubm92LmluZm8vW0FjaGlsbGVzXQorKiBodHRwczovL2dpdGh1Yi5jb20vTmV0ZmxpeC9hc3R5YW5heC93aWtpL0dldHRpbmctU3RhcnRlZFtBc3R5YW5heF0KKyogaHR0cHM6Ly9naXRodWIuY29tL25vb3JxL2Nhc3NlcltDYXNzZXJdCisqIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRhc3RheC9qYXZhLWRyaXZlcltEYXRhc3RheCBKYXZhIGRyaXZlcl0KKyogaHR0cHM6Ly9naXRodWIuY29tL0ltcGV0dXMva3VuZGVyYVtLdW5kZXJhXQorKiBodHRwczovL2dpdGh1Yi5jb20vZGVhbmhpbGxlci9wbGF5b3JtW1BsYXlPUk1dCisKKz09IFB5dGhvbgorCisqIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRhc3RheC9weXRob24tZHJpdmVyW0RhdGFzdGF4IFB5dGhvbiBkcml2ZXJdCisKKz09IFJ1YnkKKworKiBodHRwczovL2dpdGh1Yi5jb20vZGF0YXN0YXgvcnVieS1kcml2ZXJbRGF0YXN0YXggUnVieSBkcml2ZXJdCisKKz09IEMjIC8gLk5FVAorCisqIGh0dHBzOi8vZ2l0aHViLmNvbS9wY2hhbGFtZXQvY2Fzc2FuZHJhLXNoYXJwW0Nhc3NhbmRyYSBTaGFycF0KKyogaHR0cHM6Ly9naXRodWIuY29tL2RhdGFzdGF4L2NzaGFycC1kcml2ZXJbRGF0YXN0YXggQyMgZHJpdmVyXQorKiBodHRwczovL2dpdGh1Yi5jb20vbWFuYWdlZGZ1c2lvbi9mbHVlbnRjYXNzYW5kcmFbRmx1ZW50IENhc3NhbmRyYV0KKworPT0gTm9kZWpzCisKKyogaHR0cHM6Ly9naXRodWIuY29tL2RhdGFzdGF4L25vZGVqcy1kcml2ZXJbRGF0YXN0YXggTm9kZWpzIGRyaXZlcl0KKworPT0gUEhQCisKKyogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9hL2FwYWNoZS1leHRyYXMub3JnL3AvY2Fzc2FuZHJhLXBkb1tDUUwgfCBQSFBdCisqIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRhc3RheC9waHAtZHJpdmVyL1tEYXRhc3RheCBQSFAgZHJpdmVyXQorKiBodHRwczovL2dpdGh1Yi5jb20vYXBhcmtob21lbmtvL3BocC1jYXNzYW5kcmFbUEhQLUNhc3NhbmRyYV0KKyogaHR0cHM6Ly9naXRodWIuY29tL2R1b3NodW8vcGhwLWNhc3NhbmRyYVtQSFAgTGlicmFyeSBmb3IgQ2Fzc2FuZHJhXQorCis9PSBDKysKKworKiBodHRwczovL2dpdGh1Yi5jb20vZGF0YXN0YXgvY3BwLWRyaXZlcltEYXRhc3RheCBDKysgZHJpdmVyXQorKiBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnF0Y2Fzc2FuZHJhW2xpYlFUQ2Fzc2FuZHJhXQorCis9PSBTY2FsYQorCisqIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRhc3RheC9zcGFyay1jYXNzYW5kcmEtY29ubmVjdG9yW0RhdGFzdGF4IFNwYXJrCitjb25uZWN0b3JdCisqIGh0dHBzOi8vZ2l0aHViLmNvbS9uZXd6bHkvcGhhbnRvbVtQaGFudG9tXQorKiBodHRwczovL2dpdGh1Yi5jb20vZ2V0cXVpbGwvcXVpbGxbUXVpbGxdCisKKz09IENsb2p1cmUKKworKiBodHRwczovL2dpdGh1Yi5jb20vbXBlbmV0L2FsaWFbQWxpYV0KKyogaHR0cHM6Ly9naXRodWIuY29tL2Nsb2p1cmV3ZXJrei9jYXNzYWZvcnRlW0Nhc3NhZm9ydGVdCisqIGh0dHBzOi8vZ2l0aHViLmNvbS9tcGVuZXQvaGF5dFtIYXl0XQorCis9PSBFcmxhbmcKKworKiBodHRwczovL2dpdGh1Yi5jb20vbWF0ZWhhdC9jcWVybFtDUWVybF0KKyogaHR0cHM6Ly9naXRodWIuY29tL3NpbHZpdWNwcC9lcmxjYXNzW0VybGNhc3NdCisKKz09IEdvCisKKyogaHR0cHM6Ly9naXRodWIuY29tL3JlbG9wcy9jcWxjW0NRTGNdCisqIGh0dHBzOi8vZ2l0aHViLmNvbS9oYWlsb2NhYi9nb2Nhc3NhW0dvY2Fzc2FdCisqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb2NxbC9nb2NxbFtHb0NRTF0KKworPT0gSGFza2VsbAorCisqIGh0dHBzOi8vZ2l0aHViLmNvbS9vemF0YW1hbi9jYXNzeVtDYXNzeV0KKworPT0gUnVzdAorCisqIGh0dHBzOi8vZ2l0aHViLmNvbS9uZWljaC9ydXN0LWNxbFtSdXN0IENRTF0KKworPT0gUGVybAorCisqIGh0dHBzOi8vZ2l0aHViLmNvbS90dmR3L3BlcmwtZGJkLWNhc3NhbmRyYVtDYXNzYW5kcmE6OkNsaWVudCBhbmQKK0RCRDo6Q2Fzc2FuZHJhXQorCis9PSBFbGl4aXIKKworKiBodHRwczovL2dpdGh1Yi5jb20vbGV4aGlkZS94YW5kcmFbWGFuZHJhXQorKiBodHRwczovL2dpdGh1Yi5jb20vbWF0ZWhhdC9jcWV4W0NRRXhdCisKKz09IERhcnQKKworKiBodHRwczovL2dpdGh1Yi5jb20vYWNoaWxsZWFzYS9kYXJ0X2Nhc3NhbmRyYV9jcWxbZGFydF9jYXNzYW5kcmFfY3FsXQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmctc3RhcnRlZC9pbmRleC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmctc3RhcnRlZC9pbmRleC5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkM2M4MjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZy1zdGFydGVkL2luZGV4LmFkb2MKQEAgLTAsMCArMSwzMCBAQAorPSBHZXR0aW5nIFN0YXJ0ZWQKKworVGhpcyBzZWN0aW9uIGNvdmVycyBob3cgdG8gZ2V0IHN0YXJ0ZWQgdXNpbmcgQXBhY2hlIENhc3NhbmRyYSBhbmQgc2hvdWxkCitiZSB0aGUgZmlyc3QgdGhpbmcgdG8gcmVhZCBpZiB5b3UgYXJlIG5ldyB0byBDYXNzYW5kcmEuCisKKyogeHJlZjppbnN0YWxsaW5nL2luc3RhbGxpbmcuYWRvY1tJbnN0YWxsaW5nIENhc3NhbmRyYV06IEluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgcGx1cyBpbmZvcm1hdGlvbiBvbiBjaG9vc2luZyBhIG1ldGhvZC4gIAorKiogWyB4cmVmOmluc3RhbGxpbmcvaW5zdGFsbGluZy5hZG9jI2luc3RhbGxpbmctdGhlLWRvY2tlci1pbWFnZVtEb2NrZXJdIF0KK1sgeHJlZjppbnN0YWxsaW5nL2luc3RhbGxpbmcuYWRvYyNpbnN0YWxsaW5nLXRoZS1iaW5hcnktdGFyYmFsbFt0YXJiYWxsXSBdCitbIHhyZWY6aW5zdGFsbGluZy9pbnN0YWxsaW5nLmFkb2MjaW5zdGFsbGluZy10aGUtZGViaWFuLXBhY2thZ2VzW0RlYmlhbl0gXQorWyB4cmVmOmluc3RhbGxpbmcvaW5zdGFsbGluZy5hZG9jI2luc3RhbGxpbmctdGhlLXJwbS1wYWNrYWdlc1tSUE1dIF0KKyogeHJlZjpnZXR0aW5nLXN0YXJ0ZWQvY29uZmlndXJpbmcuYWRvY1tDb25maWd1cmluZyBDYXNzYW5kcmFdCisqIHhyZWY6Z2V0dGluZy1zdGFydGVkL3F1ZXJ5aW5nLmFkb2NbSW5zZXJ0aW5nIGFuZCBxdWVyeWluZyBkYXRhXQorKiB4cmVmOmdldHRpbmctc3RhcnRlZC9kcml2ZXJzLmFkb2NbQ2xpZW50IGRyaXZlcnNdOiBEcml2ZXJzIGZvciB2YXJpb3VzIGxhbmd1YWdlcy4KKyoqIFsgeHJlZjpnZXR0aW5nLXN0YXJ0ZWQvZHJpdmVycy5hZG9jI2phdmFbSmF2YV0gXQorIFsgeHJlZjpnZXR0aW5nLXN0YXJ0ZWQvZHJpdmVycy5hZG9jI3B5dGhvbltQeXRob25dIF0KKyBbIHhyZWY6Z2V0dGluZy1zdGFydGVkL2RyaXZlcnMuYWRvYyNydWJ5W1J1YnldIF0KKyBbIHhyZWY6Z2V0dGluZy1zdGFydGVkL2RyaXZlcnMuYWRvYyNjLW5ldFtDIyAvIC5ORVRdIF0KKyBbIHhyZWY6Z2V0dGluZy1zdGFydGVkL2RyaXZlcnMuYWRvYyNub2RlanNbTm9kZS5qc10gXQorIFsgeHJlZjpnZXR0aW5nLXN0YXJ0ZWQvZHJpdmVycy5hZG9jI3BocFtQSFBdIF0KKyBbIHhyZWY6Z2V0dGluZy1zdGFydGVkL2RyaXZlcnMuYWRvYyNjW0MrK10gXQorIFsgeHJlZjpnZXR0aW5nLXN0YXJ0ZWQvZHJpdmVycy5hZG9jI3NjYWxhW1NjYWxhXSBdCisgWyB4cmVmOmdldHRpbmctc3RhcnRlZC9kcml2ZXJzLmFkb2MjY2xvanVyZVtDbG9qdXJlXSBdCisgWyB4cmVmOmdldHRpbmctc3RhcnRlZC9kcml2ZXJzLmFkb2MjZXJsYW5nW0VybGFuZ10gXQorIFsgeHJlZjpnZXR0aW5nLXN0YXJ0ZWQvZHJpdmVycy5hZG9jI2dvW0dvXSBdCisgWyB4cmVmOmdldHRpbmctc3RhcnRlZC9kcml2ZXJzLmFkb2MjaGFza2VsbFtIYXNrZWxsXSBdCisgWyB4cmVmOmdldHRpbmctc3RhcnRlZC9kcml2ZXJzLmFkb2MjcnVzdFtSdXN0XSBdCisgWyB4cmVmOmdldHRpbmctc3RhcnRlZC9kcml2ZXJzLmFkb2MjcGVybFtQZXJsXSBdCisgWyB4cmVmOmdldHRpbmctc3RhcnRlZC9kcml2ZXJzLmFkb2MjZWxpeGlyW0VsaXhpcl0gXQorIFsgeHJlZjpnZXR0aW5nLXN0YXJ0ZWQvZHJpdmVycy5hZG9jI2RhcnRbRGFydF0gXQorKiB4cmVmOmdldHRpbmctc3RhcnRlZC9wcm9kdWN0aW9uLmFkb2NbUHJvZHVjdGlvbiByZWNvbW1lbmRhdGlvbnNdCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZy1zdGFydGVkL3Byb2R1Y3Rpb24uYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nLXN0YXJ0ZWQvcHJvZHVjdGlvbi5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMjhhMzUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZy1zdGFydGVkL3Byb2R1Y3Rpb24uYWRvYwpAQCAtMCwwICsxLDE2MyBAQAorPSBQcm9kdWN0aW9uIHJlY29tbWVuZGF0aW9ucworCitUaGUgYGNhc3NhbmRyYS55YW1sYCBhbmQgYGp2bS5vcHRpb25zYCBmaWxlcyBoYXZlIGEgbnVtYmVyIG9mIG5vdGVzIGFuZAorcmVjb21tZW5kYXRpb25zIGZvciBwcm9kdWN0aW9uIHVzYWdlLgorVGhpcyBwYWdlIGV4cGFuZHMgb24gc29tZSBvZiB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGZpbGVzLgorCis9PSBUb2tlbnMKKworVXNpbmcgbW9yZSB0aGFuIG9uZSB0b2tlbi1yYW5nZSBwZXIgbm9kZSBpcyByZWZlcnJlZCB0byBhcyB2aXJ0dWFsIG5vZGVzLCBvciB2bm9kZXMuCitgdm5vZGVzYCBmYWNpbGl0YXRlIGZsZXhpYmxlIGV4cGFuc2lvbiB3aXRoIG1vcmUgc3RyZWFtaW5nIHBlZXJzIHdoZW4gYSBuZXcgbm9kZSBib290c3RyYXBzCitpbnRvIGEgY2x1c3Rlci4KK0xpbWl0aW5nIHRoZSBuZWdhdGl2ZSBpbXBhY3Qgb2Ygc3RyZWFtaW5nIChJL08gYW5kIENQVSBvdmVyaGVhZCkgZW5hYmxlcyBpbmNyZW1lbnRhbCBjbHVzdGVyIGV4cGFuc2lvbi4KK0hvd2V2ZXIsIG1vcmUgdG9rZW5zIGxlYWRzIHRvIHNoYXJpbmcgZGF0YSB3aXRoIG1vcmUgcGVlcnMsIGFuZCByZXN1bHRzIGluIGRlY3JlYXNlZCBhdmFpbGFiaWxpdHkuCitUaGVzZSB0d28gZmFjdG9ycyBtdXN0IGJlIGJhbGFuY2VkIGJhc2VkIG9uIGEgY2x1c3RlcidzIGNoYXJhY3RlcmlzdGljIHJlYWRzIGFuZCB3cml0ZXMuCitUbyBsZWFybiBtb3JlLAoraHR0cHM6Ly9naXRodWIuY29tL2pvbHluY2gvcHl0aG9uX3BlcmZvcm1hbmNlX3Rvb2xraXQvcmF3L21hc3Rlci9ub3RlYm9va3MvY2Fzc2FuZHJhX2F2YWlsYWJpbGl0eS93aGl0ZXBhcGVyL2Nhc3NhbmRyYS1hdmFpbGFiaWxpdHktdmlydHVhbC5wZGZbQ2Fzc2FuZHJhIEF2YWlsYWJpbGl0eSBpbiBWaXJ0dWFsIE5vZGVzLCBKb3NlcGggTHluY2ggYW5kIEpvc2ggU255ZGVyXSBpcyByZWNvbW1lbmRlZCByZWFkaW5nLgorCitDaGFuZ2UgdGhlIG51bWJlciBvZiB0b2tlbnMgdXNpbmcgdGhlIHNldHRpbmcgaW4gdGhlIGBjYXNzYW5kcmEueWFtbGAgZmlsZToKKworYG51bV90b2tlbnM6IDE2YAorCitIZXJlIGFyZSB0aGUgbW9zdCBjb21tb24gdG9rZW4gY291bnRzIHdpdGggYSBicmllZiBleHBsYW5hdGlvbiBvZiB3aGVuCithbmQgd2h5IHlvdSB3b3VsZCB1c2UgZWFjaCBvbmUuCisKK1t3aWR0aD0iMTAwJSIsY29scz0iMTMlLDg3JSIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8VG9rZW4gQ291bnQgfERlc2NyaXB0aW9uCit8MSB8TWF4aW11bSBhdmFpbGFibGlsaXR5LCBtYXhpbXVtIGNsdXN0ZXIgc2l6ZSwgZmV3ZXN0IHBlZXJzLCBidXQKK2luZmxleGlibGUgZXhwYW5zaW9uLiBNdXN0IGFsd2F5cyBkb3VibGUgc2l6ZSBvZiBjbHVzdGVyIHRvIGV4cGFuZCBhbmQKK3JlbWFpbiBiYWxhbmNlZC4KKworfDQgfEEgaGVhbHRoeSBtaXggb2YgZWxhc3RpY2l0eSBhbmQgYXZhaWxhYmlsaXR5LiBSZWNvbW1lbmRlZCBmb3IKK2NsdXN0ZXJzIHdoaWNoIHdpbGwgZXZlbnR1YWxseSByZWFjaCBvdmVyIDMwIG5vZGVzLiBSZXF1aXJlcyBhZGRpbmcKK2FwcHJveGltYXRlbHkgMjAlIG1vcmUgbm9kZXMgdG8gcmVtYWluIGJhbGFuY2VkLiBTaHJpbmtpbmcgYSBjbHVzdGVyIG1heQorcmVzdWx0IGluIGNsdXN0ZXIgaW1iYWxhbmNlLgorCit8OCB8IFVzaW5nIDggdm5vZGVzIGRpc3RyaWJ1dGVzIHRoZSB3b3JrbG9hZCBiZXR3ZWVuIHN5c3RlbXMgd2l0aCBhIH4xMCUgdmFyaWFuY2UKK2FuZCBoYXMgbWluaW1hbCBpbXBhY3Qgb24gcGVyZm9ybWFuY2UuCisKK3wxNiB8QmVzdCBmb3IgaGVhdmlseSBlbGFzdGljIGNsdXN0ZXJzIHdoaWNoIGV4cGFuZCBhbmQgc2hyaW5rCityZWd1bGFybHksIGJ1dCBtYXkgaGF2ZSBpc3N1ZXMgYXZhaWxhYmlsaXR5IHdpdGggbGFyZ2VyIGNsdXN0ZXJzLiBOb3QKK3JlY29tbWVuZGVkIGZvciBjbHVzdGVycyBvdmVyIDUwIG5vZGVzLgorfD09PQorCitJbiBhZGRpdGlvbiB0byBzZXR0aW5nIHRoZSB0b2tlbiBjb3VudCwgaXQncyBleHRyZW1lbHkgaW1wb3J0YW50IHRoYXQKK2BhbGxvY2F0ZV90b2tlbnNfZm9yX2xvY2FsX3JlcGxpY2F0aW9uX2ZhY3RvcmAgaW4gYGNhc3NhbmRyYS55YW1sYCBpcyBzZXQgdG8gYW4KK2FwcHJvcHJpYXRlIG51bWJlciBvZiByZXBsaWNhdGVzLCB0byBlbnN1cmUgZXZlbiB0b2tlbiBhbGxvY2F0aW9uLgorCis9PSBSZWFkIGFoZWFkCisKK1JlYWQgYWhlYWQgaXMgYW4gb3BlcmF0aW5nIHN5c3RlbSBmZWF0dXJlIHRoYXQgYXR0ZW1wdHMgdG8ga2VlcCBhcyBtdWNoCitkYXRhIGFzIHBvc3NpYmxlIGxvYWRlZCBpbiB0aGUgcGFnZSBjYWNoZS4KK1NwaW5uaW5nIGRpc2tzIGNhbiBoYXZlIGxvbmcgc2VlayB0aW1lcyBjYXVzaW5nIGhpZ2ggbGF0ZW5jeSwgc28gYWRkaXRpb25hbAordGhyb3VnaHB1dCBvbiByZWFkcyB1c2luZyBwYWdlIGNhY2hlIGNhbiBpbXByb3ZlIHBlcmZvcm1hbmNlLgorQnkgbGV2ZXJhZ2luZyByZWFkIGFoZWFkLCB0aGUgT1MgY2FuIHB1bGwgYWRkaXRpb25hbCBkYXRhIGludG8gbWVtb3J5IHdpdGhvdXQKK3RoZSBjb3N0IG9mIGFkZGl0aW9uYWwgc2Vla3MuCitUaGlzIG1ldGhvZCB3b3JrcyB3ZWxsIHdoZW4gdGhlIGF2YWlsYWJsZSBSQU0gaXMgZ3JlYXRlciB0aGFuIHRoZSBzaXplIG9mIHRoZQoraG90IGRhdGFzZXQsIGJ1dCBjYW4gYmUgcHJvYmxlbWF0aWMgd2hlbiB0aGUgcmV2ZXJzZSBpcyB0cnVlIChkYXRhc2V0ID4gUkFNKS4KK1RoZSBsYXJnZXIgdGhlIGhvdCBkYXRhc2V0LCB0aGUgbGVzcyByZWFkIGFoZWFkIGlzIHVzZWZ1bC4KKworUmVhZCBhaGVhZCBpcyBkZWZpbml0ZWx5IG5vdCB1c2VmdWwgaW4gdGhlIGZvbGxvd2luZyBjYXNlczoKKworKiBTbWFsbCBwYXJ0aXRpb25zLCBzdWNoIGFzIHRhYmxlcyB3aXRoIGEgc2luZ2xlIHBhcnRpdGlvbiBrZXkKKyogU29saWQgc3RhdGUgZHJpdmVzIChTU0RzKQorCisKK1JlYWQgYWhlYWQgY2FuIGFjdHVhbGx5IGluY3JlYXNlIGRpc2sgdXNhZ2UsIGFuZCBpbiBzb21lIGNhc2VzIHJlc3VsdCBpbiBhcyBtdWNoCithcyBhIDV4IGxhdGVuY3kgYW5kIHRocm91Z2hwdXQgcGVyZm9ybWFuY2UgcGVuYWx0eS4KK1JlYWQtaGVhdnksIGtleS92YWx1ZSB0YWJsZXMgd2l0aCBzbWFsbCAodW5kZXIgMUtCKSByb3dzIGFyZSBlc3BlY2lhbGx5IHByb25lCit0byB0aGlzIHByb2JsZW0uCisKK1RoZSByZWNvbW1lbmRlZCByZWFkIGFoZWFkIHNldHRpbmdzIGFyZToKKworW3dpZHRoPSI1OSUiLGNvbHM9IjQwJSw2MCUiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfEhhcmR3YXJlIHxJbml0aWFsIFJlY29tbWVuZGF0aW9uCit8U3Bpbm5pbmcgRGlza3MgfDY0S0IKK3xTU0QgfDRLQgorfD09PQorCitSZWFkIGFoZWFkIGNhbiBiZSBhZGp1c3RlZCBvbiBMaW51eCBzeXN0ZW1zIHVzaW5nIHRoZSBgYmxvY2tkZXZgIHRvb2wuCisKK0ZvciBleGFtcGxlLCBzZXQgdGhlIHJlYWQgYWhlYWQgb2YgdGhlIGRpc2sgYC9kZXYvc2RhMWAgdG8gNEtCOgorCitbc291cmNlLCBzaGVsbF0KKy0tLS0KKyQgYmxvY2tkZXYgLS1zZXRyYSA4IC9kZXYvc2RhMQorLS0tLQorW05PVEVdCis9PT09CitUaGUgYGJsb2NrZGV2YCBzZXR0aW5nIHNldHMgdGhlIG51bWJlciBvZiA1MTIgYnl0ZSBzZWN0b3JzIHRvIHJlYWQgYWhlYWQuCitUaGUgYXJndW1lbnQgb2YgOCBhYm92ZSBpcyBlcXVpdmFsZW50IHRvIDRLQiwgb3IgOCAqIDUxMiBieXRlcy4KKz09PT0KKworQWxsIHN5c3RlbXMgYXJlIGRpZmZlcmVudCwgc28gdXNlIHRoZXNlIHJlY29tbWVuZGF0aW9ucyBhcyBhIHN0YXJ0aW5nIHBvaW50IGFuZAordHVuZSwgYmFzZWQgb24geW91ciBTTEEgYW5kIHRocm91Z2hwdXQgcmVxdWlyZW1lbnRzLgorVG8gdW5kZXJzdGFuZCBob3cgcmVhZCBhaGVhZCBpbXBhY3RzIGRpc2sgcmVzb3VyY2UgdXNhZ2UsIHdlIHJlY29tbWVuZCBjYXJlZnVsbHkKK3JlYWRpbmcgdGhyb3VnaCB0aGUgeHJlZjp0cm91Ymxlc2hvb3RpbmcvdXNlX3Rvb2xzLmFkb2NbRGl2aW5nIERlZXAsIHVzaW5nIGV4dGVybmFsIHRvb2xzXQorc2VjdGlvbi4KKworPT0gQ29tcHJlc3Npb24KKworQ29tcHJlc3NlZCBkYXRhIGlzIHN0b3JlZCBieSBjb21wcmVzc2luZyBmaXhlZC1zaXplIGJ5dGUgYnVmZmVycyBhbmQgd3JpdGluZyB0aGUKK2RhdGEgdG8gZGlzay4KK1RoZSBidWZmZXIgc2l6ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBgY2h1bmtfbGVuZ3RoX2luX2tiYCBlbGVtZW50IGluIHRoZSBjb21wcmVzc2lvbgorbWFwIG9mIGEgdGFibGUncyBzY2hlbWEgc2V0dGluZ3MgZm9yIGBXSVRIIENPTVBSRVNTSU9OYC4KK1RoZSBkZWZhdWx0IHNldHRpbmcgaXMgMTZLQiBzdGFydGluZyB3aXRoIENhc3NhbmRyYSB7NDBfdmVyc2lvbn0uCisKK1NpbmNlIHRoZSBlbnRpcmUgY29tcHJlc3NlZCBidWZmZXIgbXVzdCBiZSByZWFkIG9mZi1kaXNrLCB1c2luZyBhIGNvbXByZXNzaW9uCitjaHVuayBsZW5ndGggdGhhdCBpcyB0b28gbGFyZ2UgY2FuIGxlYWQgdG8gc2lnbmlmaWNhbnQgb3ZlcmhlYWQgd2hlbiByZWFkaW5nIHNtYWxsIHJlY29yZHMuCitDb21iaW5lZCB3aXRoIHRoZSBkZWZhdWx0IHJlYWQgYWhlYWQgc2V0dGluZywgdGhlIHJlc3VsdCBjYW4gYmUgbWFzc2l2ZQorcmVhZCBhbXBsaWZpY2F0aW9uIGZvciBjZXJ0YWluIHdvcmtsb2Fkcy4gVGhlcmVmb3JlLCBwaWNraW5nIGFuIGFwcHJvcHJpYXRlCit2YWx1ZSBmb3IgdGhpcyBzZXR0aW5nIGlzIGltcG9ydGFudC4KKworTFo0Q29tcHJlc3NvciBpcyB0aGUgZGVmYXVsdCBhbmQgcmVjb21tZW5kZWQgY29tcHJlc3Npb24gYWxnb3JpdGhtLgorSWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBjb21wcmVzc2lvbiwgcmVhZAoraHR0cHM6Ly90aGVsYXN0cGlja2xlLmNvbS9ibG9nLzIwMTgvMDgvMDgvY29tcHJlc3Npb25fcGVyZm9ybWFuY2UuaHRtbFtUaGUgTGFzdCBQaWNrbGUgYmxvZ3Bvc3Qgb24gY29tcHJlc3Npb24gcGVyZm9ybWFuY2VdLgorCis9PSBDb21wYWN0aW9uCisKK1RoZXJlIGFyZSBkaWZmZXJlbnQgeHJlZjpjb21wYWN0aW9uL2luZGV4LmFkb2NbY29tcGFjdGlvbl0gc3RyYXRlZ2llcyBhdmFpbGFibGUKK2ZvciBkaWZmZXJlbnQgd29ya2xvYWRzLgorV2UgcmVjb21tZW5kIHJlYWRpbmcgYWJvdXQgdGhlIGRpZmZlcmVudCBzdHJhdGVnaWVzIHRvIHVuZGVyc3RhbmQgd2hpY2ggaXMgdGhlCitiZXN0IGZvciB5b3VyIGVudmlyb25tZW50LgorRGlmZmVyZW50IHRhYmxlcyBtYXksIGFuZCBmcmVxdWVudGx5IGRvIHVzZSBkaWZmZXJlbnQgY29tcGFjdGlvbiBzdHJhdGVnaWVzIGluCit0aGUgc2FtZSBjbHVzdGVyLgorCis9PSBFbmNyeXB0aW9uCisKK0l0IGlzIHNpZ25pZmljYW50bHkgYmV0dGVyIHRvIHNldCB1cCBwZWVyLXRvLXBlZXIgZW5jcnlwdGlvbiBhbmQgY2xpZW50IHNlcnZlcgorZW5jcnlwdGlvbiB3aGVuIHNldHRpbmcgdXAgeW91ciBwcm9kdWN0aW9uIGNsdXN0ZXIuCitTZXR0aW5nIGl0IHVwIGFmdGVyIHRoZSBjbHVzdGVyIGlzIHNlcnZpbmcgcHJvZHVjdGlvbiB0cmFmZmljIGlzIGNoYWxsZW5naW5nCit0byBkbyBjb3JyZWN0bHkuCitJZiB5b3UgZXZlciBwbGFuIHRvIHVzZSBuZXR3b3JrIGVuY3J5cHRpb24gb2YgYW55IHR5cGUsIHdlIHJlY29tbWVuZCBzZXR0aW5nIGl0Cit1cCB3aGVuIGluaXRpYWxseSBjb25maWd1cmluZyB5b3VyIGNsdXN0ZXIuCitDaGFuZ2luZyB0aGVzZSBjb25maWd1cmF0aW9ucyBsYXRlciBpcyBub3QgaW1wb3NzaWJsZSwgYnV0IG1pc3Rha2VzIGNhbgorcmVzdWx0IGluIGRvd250aW1lIG9yIGRhdGEgbG9zcy4KKworPT0gRW5zdXJlIGtleXNwYWNlcyBhcmUgY3JlYXRlZCB3aXRoIE5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5CisKK1Byb2R1Y3Rpb24gY2x1c3RlcnMgc2hvdWxkIG5ldmVyIHVzZSBgU2ltcGxlU3RyYXRlZ3lgLgorUHJvZHVjdGlvbiBrZXlzcGFjZXMgc2hvdWxkIHVzZSB0aGUgYE5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5YCAoTlRTKS4KK0ZvciBleGFtcGxlOgorCitbc291cmNlLCBjcWxdCistLS0tCitDUkVBVEUgS0VZU1BBQ0UgbXlrZXlzcGFjZSBXSVRIIHJlcGxpY2F0aW9uID0gICAgIHsKKyAgICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsCisgICAnZGF0YWNlbnRlcjEnOiAzCit9OworLS0tLQorCitDYXNzYW5kcmEgY2x1c3RlcnMgaW5pdGlhbGl6ZWQgd2l0aCBgTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3lgIGNhbiB0YWtlIGFkdmFudGFnZQorb2YgdGhlIGFiaWxpdHkgdG8gY29uZmlndXJlIG11bHRpcGxlIHJhY2tzIGFuZCBkYXRhIGNlbnRlcnMuCisKKz09IENvbmZpZ3VyZSByYWNrcyBhbmQgc25pdGNoCisKKyoqQ29ycmVjdGx5IGNvbmZpZ3VyaW5nIG9yIGNoYW5naW5nIHJhY2tzIGFmdGVyIGEgY2x1c3RlciBoYXMgYmVlbiBwcm92aXNpb25lZCBpcyBhbiB1bnN1cHBvcnRlZCBwcm9jZXNzKiouCitNaWdyYXRpbmcgZnJvbSBhIHNpbmdsZSByYWNrIHRvIG11bHRpcGxlIHJhY2tzIGlzIGFsc28gdW5zdXBwb3J0ZWQgYW5kIGNhbgorcmVzdWx0IGluIGRhdGEgbG9zcy4KK1VzaW5nIGBHb3NzaXBpbmdQcm9wZXJ0eUZpbGVTbml0Y2hgIGlzIHRoZSBtb3N0IGZsZXhpYmxlIHNvbHV0aW9uIGZvcgorb24tcHJlbWlzZSBvciBtaXhlZCBjbG91ZCBlbnZpcm9ubWVudHMuCitgRWMyU25pdGNoYCBpcyByZWxpYWJsZSBmb3IgQVdTIEVDMiBvbmx5IGVudmlyb25tZW50cy4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nLXN0YXJ0ZWQvcXVlcnlpbmcuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nLXN0YXJ0ZWQvcXVlcnlpbmcuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGE2ZDZmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmctc3RhcnRlZC9xdWVyeWluZy5hZG9jCkBAIC0wLDAgKzEsMzEgQEAKKz0gSW5zZXJ0aW5nIGFuZCBxdWVyeWluZworCitUaGUgQVBJIGZvciBDYXNzYW5kcmEgaXMgeHJlZjpjcWwvZGRsLmFkb2NbYENRTGAsIHRoZSBDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2VdLiBUbwordXNlIENRTCwgeW91IHdpbGwgbmVlZCB0byBjb25uZWN0IHRvIHRoZSBjbHVzdGVyLCB1c2luZyBlaXRoZXI6CisKKyogYGNxbHNoYCwgYSBzaGVsbCBmb3IgQ1FMCisqIGEgY2xpZW50IGRyaXZlciBmb3IgQ2Fzc2FuZHJhCisqIGZvciB0aGUgYWR2ZW50dXJvdXMsIGNoZWNrIG91dCBodHRwczovL3plcHBlbGluLmFwYWNoZS5vcmcvZG9jcy8wLjcuMC9pbnRlcnByZXRlci9jYXNzYW5kcmEuaHRtbFtBcGFjaGUgWmVwcGVsaW5dLCBhIG5vdGVib29rLXN0eWxlIHRvb2wKKworPT0gQ1FMU0gKKworYGNxbHNoYCBpcyBhIGNvbW1hbmQtbGluZSBzaGVsbCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBDYXNzYW5kcmEgdXNpbmcKK0NRTC4gSXQgaXMgc2hpcHBlZCB3aXRoIGV2ZXJ5IENhc3NhbmRyYSBwYWNrYWdlLCBhbmQgY2FuIGJlIGZvdW5kIGluIHRoZQorYGJpbmAgZGlyZWN0b3J5IGFsb25nc2lkZSB0aGUgYGNhc3NhbmRyYWAgZXhlY3V0YWJsZS4gSXQgY29ubmVjdHMgdG8gdGhlCitzaW5nbGUgbm9kZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsIHNoZWxsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2NxbHNoX2xvY2FsaG9zdC5zaFtdCistLS0tCitbc291cmNlLCBjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvY3Fsc2hfbG9jYWxob3N0LnJlc3VsdFtdCistLS0tCitJZiB0aGUgY29tbWFuZCBpcyB1c2VkIHdpdGhvdXQgc3BlY2lmeWluZyBhIG5vZGUsIGBsb2NhbGhvc3RgIGlzIHRoZSBkZWZhdWx0LiBTZWUgdGhlIHhyZWY6dG9vbHMvY3Fsc2guYWRvY1tgY3Fsc2hgIHNlY3Rpb25dIGZvciBmdWxsIGRvY3VtZW50YXRpb24uCisKKz09IENsaWVudCBkcml2ZXJzCisKK0EgbG90IG9mIHhyZWY6Z2V0dGluZy1zdGFydGVkL2RyaXZlcnMuYWRvY1tjbGllbnQgZHJpdmVyc10gYXJlIHByb3ZpZGVkIGJ5IHRoZSBDb21tdW5pdHkgYW5kIGEgbGlzdCBvZgora25vd24gZHJpdmVycyBpcyBwcm92aWRlZC4gWW91IHNob3VsZCByZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBvZiBlYWNoIGRyaXZlcgorZm9yIG1vcmUgaW5mb3JtYXRpb24uCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZy1zdGFydGVkL3F1aWNrc3RhcnQuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nLXN0YXJ0ZWQvcXVpY2tzdGFydC5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2M2QyNjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZy1zdGFydGVkL3F1aWNrc3RhcnQuYWRvYwpAQCAtMCwwICsxLDExNiBAQAorPSBBcGFjaGUgQ2Fzc2FuZHJhIFF1aWNrc3RhcnQKKzp0YWJzOgorCitfSW50ZXJlc3RlZCBpbiBnZXR0aW5nIHN0YXJ0ZWQgd2l0aCBDYXNzYW5kcmE/IEZvbGxvdyB0aGVzZSBpbnN0cnVjdGlvbnMuXworCisqU1RFUCAxOiBHRVQgQ0FTU0FORFJBIFVTSU5HIERPQ0tFUioKKworWW91J2xsIG5lZWQgdG8gaGF2ZSBEb2NrZXIgRGVza3RvcCBmb3IgTWFjLCBEb2NrZXIgRGVza3RvcCBmb3IgV2luZG93cywgb3IKK3NpbWlsYXIgc29mdHdhcmUgaW5zdGFsbGVkIG9uIHlvdXIgY29tcHV0ZXIuCisKK1tzb3VyY2UsIHBsYWludGV4dF0KKy0tLS0KK2RvY2tlciBwdWxsIGNhc3NhbmRyYTpsYXRlc3QKKy0tLS0KKworQXBhY2hlIENhc3NhbmRyYSBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIGh0dHBzOi8vY2Fzc2FuZHJhLmFwYWNoZS5vcmcvZG93bmxvYWQvW3RhcmJhbGwgb3IgcGFja2FnZSBkb3dubG9hZF0uCisKKypTVEVQIDI6IFNUQVJUIENBU1NBTkRSQSoKKworW3NvdXJjZSwgcGxhaW50ZXh0XQorLS0tLQorZG9ja2VyIHJ1biAtLW5hbWUgY2Fzc2FuZHJhIGNhc3NhbmRyYQorLS0tLQorCisqU1RFUCAzOiBDUkVBVEUgRklMRVMqCisKK0luIHRoZSBkaXJlY3Rvcnkgd2hlcmUgeW91IHBsYW4gdG8gcnVuIHRoZSBuZXh0IHN0ZXAsIGNyZWF0ZSB0aGVzZSB0d28gZmlsZXMKK3NvIHRoYXQgc29tZSBkYXRhIGNhbiBiZSBhdXRvbWF0aWNhbGx5IGluc2VydGVkIGluIHRoZSBuZXh0IHN0ZXAuCisKK0EgX2NxbHNocmNfIGZpbGUgd2lsbCBsb2cgaW50byB0aGUgQ2Fzc2FuZHJhIGRhdGFiYXNlIHdpdGggdGhlIGRlZmF1bHQgc3VwZXJ1c2VyOgorCitbc291cmNlLCBwbGFpbnRleHRdCistLS0tCitbYXV0aGVudGljYXRpb25dCisJdXNlcm5hbWUgPSBjYXNzYW5kcmEKKwlwYXNzd29yZCA9IGNhc3NhbmRyYQorLS0tLQorCitDcmVhdGUgYSBfc2NyaXB0c18gZGlyZWN0b3J5IGFuZCBjaGFuZ2UgdG8gdGhhdCBkaXJlY3RvcnkuCitUaGUgZm9sbG93aW5nIF9kYXRhLmNxbF8gZmlsZSB3aWxsIGNyZWF0ZSBhIGtleXNwYWNlLCB0aGUgbGF5ZXIgYXQgd2hpY2ggQ2Fzc2FuZHJhCityZXBsaWNhdGVzIGl0cyBkYXRhLCBhIHRhYmxlIHRvIGhvbGQgdGhlIGRhdGEsIGFuZCBpbnNlcnQgc29tZSBkYXRhOgorCitbc291cmNlLCBwbGFpbnRleHRdCistLS0tCisjIENyZWF0ZSBhIGtleXNwYWNlCitDUkVBVEUgS0VZU1BBQ0UgSUYgTk9UIEVYSVNUUyBzdG9yZSBXSVRIIFJFUExJQ0FUSU9OID0geyAnY2xhc3MnIDogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3RvcicgOiAnMScgfTsKKworIyBDcmVhdGUgYSB0YWJsZQorQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgc3RvcmUuc2hvcHBpbmdfY2FydCAgKAorCXVzZXJpZCB0ZXh0IFBSSU1BUlkgS0VZLAorCWl0ZW1fY291bnQgaW50LAorCWxhc3RfdXBkYXRlX3RpbWVzdGFtcCB0aW1lc3RhbXAKKyk7CisKKyMgSW5zZXJ0IHNvbWUgZGF0YQorSU5TRVJUIElOVE8gc3RvcmUuc2hvcHBpbmdfY2FydAorKHVzZXJpZCwgaXRlbV9jb3VudCwgbGFzdF91cGRhdGVfdGltZXN0YW1wKQorVkFMVUVTICgnOTg3NicsIDIsIHRvX3RpbWVzdGFtcCh0b19kYXRlKG5vdykpKSk7CitJTlNFUlQgSU5UTyBzdG9yZS5zaG9wcGluZ19jYXJ0CisodXNlcmlkLCBpdGVtX2NvdW50LCBsYXN0X3VwZGF0ZV90aW1lc3RhbXApCitWQUxVRVMgKDEyMzQsIDUsIHRvX3RpbWVzdGFtcCh0b0RhdGUobm93KSkpKTsKKy0tLS0KKworWW91IHNob3VsZCBub3cgaGF2ZSBhIF9jcWxzaHJjXyBmaWxlIGFuZCBfPGN1cnJlbnRkaXI+L3NjcmlwdHMvZGF0YS5jcWxfIGZpbGUuCisKKypTVEVQIDQ6IFJVTiBDUUxTSCBUTyBJTlRFUkFDVCoKKworQ2Fzc2FuZHJhIGlzIGEgZGlzdHJpYnV0ZWQgZGF0YWJhc2UgdGhhdCBjYW4gcmVhZCBhbmQgd3JpdGUgZGF0YSBhY3Jvc3MgbXVsdGlwbGUKK25vZGVzIHdpdGggIHBlZXItdG8tcGVlciByZXBsaWNhdGlvbi4gVGhlIENhc3NhbmRyYSBRdWVyeSBMYW5ndWFnZSAoQ1FMKSBpcworc2ltaWxhciB0byBTUUwgYnV0IHN1aXRlZCBmb3IgdGhlIEpPSU5sZXNzIHN0cnVjdHVyZSBvZiBDYXNzYW5kcmEuIFRoZSBDUUwKK3NoZWxsLCBvciBgY3Fsc2hgLCBpcyBvbmUgdG9vbCB0byB1c2UgaW4gaW50ZXJhY3Rpbmcgd2l0aCB0aGUgZGF0YWJhc2UuCisKK1tzb3VyY2UsIHBsYWludGV4dF0KKy0tLS0KK2RvY2tlciBydW4gLS1ybSAtaXQgLXYgLzxjdXJyZW50ZGlyPi9zY3JpcHRzOi9zY3JpcHRzICBcCistdiAvPGN1cnJlbnRkaXIvY3Fsc2hyYzovLmNhc3NhbmRyYS9jcWxzaHJjICBcCistLWVudiBDUUxTSF9IT1NUPWhvc3QuZG9ja2VyLmludGVybmFsIC0tZW52IENRTFNIX1BPUlQ9OTA0MiAgbnV2by9kb2NrZXItY3Fsc2gKKy0tLS0KKworRm9yIHRoaXMgcXVpY2tzdGFydCwgdGhpcyBjcWxzaCBkb2NrZXIgaW1hZ2UgYWxzbyBsb2FkcyBzb21lIGRhdGEgYXV0b21hdGljYWxseSwKK3NvIHlvdSBjYW4gc3RhcnQgcnVubmluZyBxdWVyaWVzLgorCisqU1RFUCA1OiBSRUFEIFNPTUUgREFUQSoKKworW3NvdXJjZSwgcGxhaW50ZXh0XQorLS0tLQorU0VMRUNUICogRlJPTSBzdG9yZS5zaG9wcGluZ19jYXJ0OworLS0tLQorCisqU1RFUCA2OiBXUklURSBTT01FIE1PUkUgREFUQSoKKworW3NvdXJjZSwgcGxhaW50ZXh0XQorLS0tLQorSU5TRVJUICh1c2VyaWQsIGl0ZW1fY291bnQpIFZBTFVFUyAoNDU2NywgMjApIElOVE8gc3RvcmUuc2hvcHBpbmdfY2FydDsKKy0tLS0KKworKlNURVAgNzogVEVSTUlOQVRFIENBU1NBTkRSQSoKKworW3NvdXJjZSwgcGxhaW50ZXh0XQorLS0tLQorZG9ja2VyIHJtIGNhc3NhbmRyYQorLS0tLQorCisqQ09OR1JBVFVMQVRJT05TISoKKworSGV5LCB0aGF0IHdhc24ndCBzbyBoYXJkLCB3YXMgaXQ/CisKK1RvIGxlYXJuIG1vcmUsIHdlIHN1Z2dlc3QgdGhlIGZvbGxvd2luZyBuZXh0IHN0ZXBzOgorCisqIFJlYWQgdGhyb3VnaCB0aGUgKm5lZWQgbGluaypbT3ZlcnZpZXddIHRvIGxlYXJuIG1haW4gY29uY2VwdHMgYW5kIGhvdyBDYXNzYW5kcmEgd29ya3MgYXQgYQoraGlnaCBsZXZlbC4KKyogVG8gdW5kZXJzdGFuZCBDYXNzYW5kcmEgaW4gbW9yZSBkZXRhaWwsIGhlYWQgb3ZlciB0byB0aGUKK2h0dHBzOi8vY2Fzc2FuZHJhLmFwYWNoZS5vcmcvZG9jL2xhdGVzdC9bRG9jc10uCisqIEJyb3dzZSB0aHJvdWdoIHRoZSBodHRwczovL2Nhc3NhbmRyYS5hcGFjaGUub3JnL2Nhc2Utc3R1ZGllcy9bQ2FzZSBTdHVkaWVzXSB0bworbGVhcm4gaG93IG90aGVyIHVzZXJzIGluIG91ciB3b3JsZHdpZGUgY29tbXVuaXR5IGFyZSBnZXR0aW5nIHZhbHVlIG91dCBvZgorQ2Fzc2FuZHJhLgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmdfc3RhcnRlZC9kcml2ZXJzLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZ19zdGFydGVkL2RyaXZlcnMuYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxNWE1NS4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZ19zdGFydGVkL2RyaXZlcnMuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLT0gQ2xpZW50IGRyaXZlcnMKLQotSGVyZSBhcmUga25vd24gQ2Fzc2FuZHJhIGNsaWVudCBkcml2ZXJzIG9yZ2FuaXplZCBieSBsYW5ndWFnZS4gQmVmb3JlCi1jaG9vc2luZyBhIGRyaXZlciwgeW91IHNob3VsZCB2ZXJpZnkgdGhlIENhc3NhbmRyYSB2ZXJzaW9uIGFuZAotZnVuY3Rpb25hbGl0eSBzdXBwb3J0ZWQgYnkgYSBzcGVjaWZpYyBkcml2ZXIuCi0KLT09IEphdmEKLQotKiBodHRwOi8vYWNoaWxsZXMuYXJjaGlubm92LmluZm8vW0FjaGlsbGVzXQotKiBodHRwczovL2dpdGh1Yi5jb20vTmV0ZmxpeC9hc3R5YW5heC93aWtpL0dldHRpbmctU3RhcnRlZFtBc3R5YW5heF0KLSogaHR0cHM6Ly9naXRodWIuY29tL25vb3JxL2Nhc3NlcltDYXNzZXJdCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRhc3RheC9qYXZhLWRyaXZlcltEYXRhc3RheCBKYXZhIGRyaXZlcl0KLSogaHR0cHM6Ly9naXRodWIuY29tL2ltcGV0dXMtb3BlbnNvdXJjZS9LdW5kZXJhW0t1bmRlcmFdCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9kZWFuaGlsbGVyL3BsYXlvcm1bUGxheU9STV0KLQotPT0gUHl0aG9uCi0KLSogaHR0cHM6Ly9naXRodWIuY29tL2RhdGFzdGF4L3B5dGhvbi1kcml2ZXJbRGF0YXN0YXggUHl0aG9uIGRyaXZlcl0KLQotPT0gUnVieQotCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRhc3RheC9ydWJ5LWRyaXZlcltEYXRhc3RheCBSdWJ5IGRyaXZlcl0KLQotPT0gQyMgLyAuTkVUCi0KLSogaHR0cHM6Ly9naXRodWIuY29tL3BjaGFsYW1ldC9jYXNzYW5kcmEtc2hhcnBbQ2Fzc2FuZHJhIFNoYXJwXQotKiBodHRwczovL2dpdGh1Yi5jb20vZGF0YXN0YXgvY3NoYXJwLWRyaXZlcltEYXRhc3RheCBDIyBkcml2ZXJdCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9tYW5hZ2VkZnVzaW9uL2ZsdWVudGNhc3NhbmRyYVtGbHVlbnQgQ2Fzc2FuZHJhXQotCi09PSBOb2RlanMKLQotKiBodHRwczovL2dpdGh1Yi5jb20vZGF0YXN0YXgvbm9kZWpzLWRyaXZlcltEYXRhc3RheCBOb2RlanMgZHJpdmVyXQotCi09PSBQSFAKLQotKiBodHRwOi8vY29kZS5nb29nbGUuY29tL2EvYXBhY2hlLWV4dHJhcy5vcmcvcC9jYXNzYW5kcmEtcGRvW0NRTCB8IFBIUF0KLSogaHR0cHM6Ly9naXRodWIuY29tL2RhdGFzdGF4L3BocC1kcml2ZXIvW0RhdGFzdGF4IFBIUCBkcml2ZXJdCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFya2hvbWVua28vcGhwLWNhc3NhbmRyYVtQSFAtQ2Fzc2FuZHJhXQotKiBodHRwczovL2dpdGh1Yi5jb20vZHVvc2h1by9waHAtY2Fzc2FuZHJhW1BIUCBMaWJyYXJ5IGZvciBDYXNzYW5kcmFdCi0KLT09IEMrKwotCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRhc3RheC9jcHAtZHJpdmVyW0RhdGFzdGF4IEMrKyBkcml2ZXJdCi0qIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlicXRjYXNzYW5kcmFbbGliUVRDYXNzYW5kcmFdCi0KLT09IFNjYWxhCi0KLSogaHR0cHM6Ly9naXRodWIuY29tL2RhdGFzdGF4L3NwYXJrLWNhc3NhbmRyYS1jb25uZWN0b3JbRGF0YXN0YXggU3BhcmsKLWNvbm5lY3Rvcl0KLSogaHR0cHM6Ly9naXRodWIuY29tL25ld3pseS9waGFudG9tW1BoYW50b21dCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRxdWlsbC9xdWlsbFtRdWlsbF0KLQotPT0gQ2xvanVyZQotCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9tcGVuZXQvYWxpYVtBbGlhXQotKiBodHRwczovL2dpdGh1Yi5jb20vY2xvanVyZXdlcmt6L2Nhc3NhZm9ydGVbQ2Fzc2Fmb3J0ZV0KLSogaHR0cHM6Ly9naXRodWIuY29tL21wZW5ldC9oYXl0W0hheXRdCi0KLT09IEVybGFuZwotCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRlaGF0L2NxZXJsW0NRZXJsXQotKiBodHRwczovL2dpdGh1Yi5jb20vc2lsdml1Y3BwL2VybGNhc3NbRXJsY2Fzc10KLQotPT0gR28KLQotKiBodHRwczovL2dpdGh1Yi5jb20vcmVsb3BzL2NxbGNbQ1FMY10KLSogaHR0cHM6Ly9naXRodWIuY29tL2hhaWxvY2FiL2dvY2Fzc2FbR29jYXNzYV0KLSogaHR0cHM6Ly9naXRodWIuY29tL2dvY3FsL2dvY3FsW0dvQ1FMXQotCi09PSBIYXNrZWxsCi0KLSogaHR0cHM6Ly9naXRodWIuY29tL296YXRhbWFuL2Nhc3N5W0Nhc3N5XQotCi09PSBSdXN0Ci0KLSogaHR0cHM6Ly9naXRodWIuY29tL25laWNoL3J1c3QtY3FsW1J1c3QgQ1FMXQotCi09PSBQZXJsCi0KLSogaHR0cHM6Ly9naXRodWIuY29tL3R2ZHcvcGVybC1kYmQtY2Fzc2FuZHJhW0Nhc3NhbmRyYTo6Q2xpZW50IGFuZAotREJEOjpDYXNzYW5kcmFdCi0KLT09IEVsaXhpcgotCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9sZXhoaWRlL3hhbmRyYVtYYW5kcmFdCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRlaGF0L2NxZXhbQ1FFeF0KLQotPT0gRGFydAotCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9hY2hpbGxlYXNhL2RhcnRfY2Fzc2FuZHJhX2NxbFtkYXJ0X2Nhc3NhbmRyYV9jcWxdCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZ19zdGFydGVkL2luZGV4LmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZ19zdGFydGVkL2luZGV4LmFkb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNDNjMTcuLjAwMDAwMDAKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmdfc3RhcnRlZC9pbmRleC5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPSBHZXR0aW5nIFN0YXJ0ZWQKLQotVGhpcyBzZWN0aW9uIGNvdmVycyBob3cgdG8gZ2V0IHN0YXJ0ZWQgdXNpbmcgQXBhY2hlIENhc3NhbmRyYSBhbmQgc2hvdWxkCi1iZSB0aGUgZmlyc3QgdGhpbmcgdG8gcmVhZCBpZiB5b3UgYXJlIG5ldyB0byBDYXNzYW5kcmEuCi0KLSogeHJlZjpnZXR0aW5nX3N0YXJ0ZWQvaW5zdGFsbGluZy5hZG9jW0luc3RhbGxpbmcgQ2Fzc2FuZHJhXTogSW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBwbHVzIGluZm9ybWF0aW9uIG9uIGNob29zaW5nIGEgbWV0aG9kLiAgCi0qKiBbIHhyZWY6Z2V0dGluZ19zdGFydGVkL2luc3RhbGxpbmcuYWRvYyNpbnN0YWxsaW5nLXRoZS1kb2NrZXItaW1hZ2VbRG9ja2VyXSBdCi1bIHhyZWY6Z2V0dGluZ19zdGFydGVkL2luc3RhbGxpbmcuYWRvYyNpbnN0YWxsaW5nLXRoZS1iaW5hcnktdGFyYmFsbFt0YXJiYWxsXSBdCi1bIHhyZWY6Z2V0dGluZ19zdGFydGVkL2luc3RhbGxpbmcuYWRvYyNpbnN0YWxsaW5nLXRoZS1kZWJpYW4tcGFja2FnZXNbRGViaWFuXSBdCi1bIHhyZWY6Z2V0dGluZ19zdGFydGVkL2luc3RhbGxpbmcuYWRvYyNpbnN0YWxsaW5nLXRoZS1ycG0tcGFja2FnZXNbUlBNXSBdCi0qIHhyZWY6Z2V0dGluZ19zdGFydGVkL2NvbmZpZ3VyaW5nLmFkb2NbQ29uZmlndXJpbmcgQ2Fzc2FuZHJhXQotKiB4cmVmOmdldHRpbmdfc3RhcnRlZC9xdWVyeWluZy5hZG9jW0luc2VydGluZyBhbmQgcXVlcnlpbmcgZGF0YV0KLSogeHJlZjpnZXR0aW5nX3N0YXJ0ZWQvZHJpdmVycy5hZG9jW0NsaWVudCBkcml2ZXJzXTogRHJpdmVycyBmb3IgdmFyaW91cyBsYW5ndWFnZXMuCi0qKiBbIHhyZWY6Z2V0dGluZ19zdGFydGVkL2RyaXZlcnMuYWRvYyNqYXZhW0phdmFdIF0KLSBbIHhyZWY6Z2V0dGluZ19zdGFydGVkL2RyaXZlcnMuYWRvYyNweXRob25bUHl0aG9uXSBdCi0gWyB4cmVmOmdldHRpbmdfc3RhcnRlZC9kcml2ZXJzLmFkb2MjcnVieVtSdWJ5XSBdCi0gWyB4cmVmOmdldHRpbmdfc3RhcnRlZC9kcml2ZXJzLmFkb2MjYy1uZXRbQyMgLyAuTkVUXSBdCi0gWyB4cmVmOmdldHRpbmdfc3RhcnRlZC9kcml2ZXJzLmFkb2Mjbm9kZWpzW05vZGUuanNdIF0KLSBbIHhyZWY6Z2V0dGluZ19zdGFydGVkL2RyaXZlcnMuYWRvYyNwaHBbUEhQXSBdCi0gWyB4cmVmOmdldHRpbmdfc3RhcnRlZC9kcml2ZXJzLmFkb2MjY1tDKytdIF0KLSBbIHhyZWY6Z2V0dGluZ19zdGFydGVkL2RyaXZlcnMuYWRvYyNzY2FsYVtTY2FsYV0gXQotIFsgeHJlZjpnZXR0aW5nX3N0YXJ0ZWQvZHJpdmVycy5hZG9jI2Nsb2p1cmVbQ2xvanVyZV0gXQotIFsgeHJlZjpnZXR0aW5nX3N0YXJ0ZWQvZHJpdmVycy5hZG9jI2VybGFuZ1tFcmxhbmddIF0KLSBbIHhyZWY6Z2V0dGluZ19zdGFydGVkL2RyaXZlcnMuYWRvYyNnb1tHb10gXQotIFsgeHJlZjpnZXR0aW5nX3N0YXJ0ZWQvZHJpdmVycy5hZG9jI2hhc2tlbGxbSGFza2VsbF0gXQotIFsgeHJlZjpnZXR0aW5nX3N0YXJ0ZWQvZHJpdmVycy5hZG9jI3J1c3RbUnVzdF0gXQotIFsgeHJlZjpnZXR0aW5nX3N0YXJ0ZWQvZHJpdmVycy5hZG9jI3BlcmxbUGVybF0gXQotIFsgeHJlZjpnZXR0aW5nX3N0YXJ0ZWQvZHJpdmVycy5hZG9jI2VsaXhpcltFbGl4aXJdIF0KLSBbIHhyZWY6Z2V0dGluZ19zdGFydGVkL2RyaXZlcnMuYWRvYyNkYXJ0W0RhcnRdIF0KLSogeHJlZjpnZXR0aW5nX3N0YXJ0ZWQvcHJvZHVjdGlvbi5hZG9jW1Byb2R1Y3Rpb24gcmVjb21tZW5kYXRpb25zXQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmdfc3RhcnRlZC9pbnN0YWxsaW5nLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZ19zdGFydGVkL2luc3RhbGxpbmcuYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkZGNkMC4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZ19zdGFydGVkL2luc3RhbGxpbmcuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi09IEluc3RhbGxpbmcgQ2Fzc2FuZHJhCi06dGFiczoKLQotVGhlc2UgYXJlIHRoZSBpbnN0cnVjdGlvbnMgZm9yIGRlcGxveWluZyB0aGUgc3VwcG9ydGVkIHJlbGVhc2VzIG9mCi1BcGFjaGUgQ2Fzc2FuZHJhIG9uIExpbnV4IHNlcnZlcnMuCi0KLUNhc3NhbmRyYSBydW5zIG9uIGEgd2lkZSBhcnJheSBvZiBMaW51eCBkaXN0cmlidXRpb25zIGluY2x1ZGluZyAoYnV0IG5vdAotbGltaXRlZCB0byk6Ci0KLSogVWJ1bnR1LCBtb3N0IG5vdGFibHkgTFRTIHJlbGVhc2VzIDE2LjA0IHRvIDE4LjA0Ci0qIENlbnRPUyAmIFJlZEhhdCBFbnRlcnByaXNlIExpbnV4IChSSEVMKSBpbmNsdWRpbmcgNi42IHRvIDcuNwotKiBBbWF6b24gTGludXggQU1JcyBpbmNsdWRpbmcgMjAxNi4wOSB0aHJvdWdoIHRvIExpbnV4IDIKLSogRGViaWFuIHZlcnNpb25zIDggJiA5Ci0qIFNVU0UgRW50ZXJwcmlzZSBMaW51eCAxMgotCi1UaGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3Qgb2Ygb3BlcmF0aW5nIHN5c3RlbSBwbGF0Zm9ybXMsIG5vciBpcyBpdAotcHJlc2NyaXB0aXZlLiBIb3dldmVyLCB1c2VycyB3aWxsIGJlIHdlbGwtYWR2aXNlZCB0byBjb25kdWN0IGV4aGF1c3RpdmUKLXRlc3RzIG9mIHRoZWlyIG93biBwYXJ0aWN1bGFybHkgZm9yIGxlc3MtcG9wdWxhciBkaXN0cmlidXRpb25zIG9mIExpbnV4LgotRGVwbG95aW5nIG9uIG9sZGVyIHZlcnNpb25zIGlzIG5vdCByZWNvbW1lbmRlZCB1bmxlc3MgeW91IGhhdmUgcHJldmlvdXMKLWV4cGVyaWVuY2Ugd2l0aCB0aGUgb2xkZXIgZGlzdHJpYnV0aW9uIGluIGEgcHJvZHVjdGlvbiBlbnZpcm9ubWVudC4KLQotPT0gUHJlcmVxdWlzaXRlcwotCi0qIEluc3RhbGwgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIEphdmEgOCBvciBKYXZhIDExLCBlaXRoZXIgdGhlCi1odHRwOi8vd3d3Lm9yYWNsZS5jb20vdGVjaG5ldHdvcmsvamF2YS9qYXZhc2UvZG93bmxvYWRzL2luZGV4Lmh0bWxbT3JhY2xlCi1KYXZhIFN0YW5kYXJkIEVkaXRpb24gOF0gLyBodHRwOi8vd3d3Lm9yYWNsZS5jb20vdGVjaG5ldHdvcmsvamF2YS9qYXZhc2UvZG93bmxvYWRzL2luZGV4Lmh0bWxbT3JhY2xlIEphdmEgU3RhbmRhcmQgRWRpdGlvbiAxMSAoTG9uZyBUZXJtIFN1cHBvcnQpXQotb3IgaHR0cDovL29wZW5qZGsuamF2YS5uZXQvW09wZW5KREsgOF0gLyBodHRwOi8vb3Blbmpkay5qYXZhLm5ldC9bT3BlbkpESyAxMV0uIFRvCi12ZXJpZnkgdGhhdCB5b3UgaGF2ZSB0aGUgY29ycmVjdCB2ZXJzaW9uIG9mIGphdmEgaW5zdGFsbGVkLCB0eXBlCi1gamF2YSAtdmVyc2lvbmAuCi0qICpOT1RFKjogRXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIEphdmEgMTEgd2FzIGFkZGVkIGluIENhc3NhbmRyYSB7NDBfdmVyc2lvbn0KLShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS05NjA4W0NBU1NBTkRSQS05NjA4XSkuCi1GdWxsIHN1cHBvcnQgaXMgZWZmZWN0aXZlIENhc3NhbmRyYSA0LjAuMiB2ZXJzaW9uIChodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS0xNjg5NFtDQVNTQU5EUkEtMTY4OTRdKQotRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQotaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEvYmxvYi90cnVuay9ORVdTLnR4dFtORVdTLnR4dF0uCi0qIEZvciB1c2luZyBjcWxzaCwgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mCi1QeXRob24gMy42KyBvciBQeXRob24gMi43IChzdXBwb3J0IGRlcHJlY2F0ZWQpLiBUbyB2ZXJpZnkKLXRoYXQgeW91IGhhdmUgdGhlIGNvcnJlY3QgdmVyc2lvbiBvZiBQeXRob24gaW5zdGFsbGVkLCB0eXBlCi1gcHl0aG9uIC0tdmVyc2lvbmAuCi0KLT09IENob29zaW5nIGFuIGluc3RhbGxhdGlvbiBtZXRob2QKLQotVGhlcmUgYXJlIHRocmVlIG1ldGhvZHMgb2YgaW5zdGFsbGluZyBDYXNzYW5kcmEgdGhhdCBhcmUgY29tbW9uOgotCi0qIERvY2tlciBpbWFnZQotKiBUYXJiYWxsIGJpbmFyeSBmaWxlCi0qIFBhY2thZ2UgaW5zdGFsbGF0aW9uIChSUE0sIFlVTSkKLQotSWYgeW91IGFyZSBhIGN1cnJlbnQgRG9ja2VyIHVzZXIsIGluc3RhbGxpbmcgYSBEb2NrZXIgaW1hZ2UgaXMgc2ltcGxlLiAKLVlvdSdsbCBuZWVkIHRvIGluc3RhbGwgRG9ja2VyIERlc2t0b3AgZm9yIE1hYywgRG9ja2VyIERlc2t0b3AgZm9yIFdpbmRvd3MsCi1vciBoYXZlIGBkb2NrZXJgIGluc3RhbGxlZCBvbiBMaW51eC4gCi1QdWxsIHRoZSBhcHByb3ByaWF0ZSBpbWFnZSBhbmQgdGhlbiBzdGFydCBDYXNzYW5kcmEgd2l0aCBhIHJ1biBjb21tYW5kLiAKLQotRm9yIG1vc3QgdXNlcnMsIGluc3RhbGxpbmcgdGhlIGJpbmFyeSB0YXJiYWxsIGlzIGFsc28gYSBzaW1wbGUgY2hvaWNlLgotVGhlIHRhcmJhbGwgdW5wYWNrcyBhbGwgaXRzIGNvbnRlbnRzIGludG8gYSBzaW5nbGUgbG9jYXRpb24gd2l0aAotYmluYXJpZXMgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMgbG9jYXRlZCBpbiB0aGVpciBvd24gc3ViZGlyZWN0b3JpZXMuCi1UaGUgbW9zdCBvYnZpb3VzIGF0dHJpYnV0ZSBvZiB0aGUgdGFyYmFsbCBpbnN0YWxsYXRpb24gaXMgaXQgZG9lcyBub3QKLXJlcXVpcmUgYHJvb3RgIHBlcm1pc3Npb25zIGFuZCBjYW4gYmUgaW5zdGFsbGVkIG9uIGFueSBMaW51eAotZGlzdHJpYnV0aW9uLgotCi1QYWNrYWdlZCBpbnN0YWxsYXRpb25zIHJlcXVpcmUgYHJvb3RgIHBlcm1pc3Npb25zLCBhbmQgYXJlIG1vc3QgYXBwcm9wcmlhdGUgZm9yCi1wcm9kdWN0aW9uIGluc3RhbGxzLiAKLUluc3RhbGwgdGhlIFJQTSBidWlsZCBvbiBDZW50T1MgYW5kIFJIRUwtYmFzZWQgZGlzdHJpYnV0aW9ucyBpZiB5b3Ugd2FudCB0byAKLWluc3RhbGwgQ2Fzc2FuZHJhIHVzaW5nIFlVTS4gCi1JbnN0YWxsIHRoZSBEZWJpYW4gYnVpbGQgb24gVWJ1bnR1IGFuZCBvdGhlciBEZWJpYW4tYmFzZWQKLWRpc3RyaWJ1dGlvbnMgaWYgeW91IHdhbnQgdG8gaW5zdGFsbCBDYXNzYW5kcmEgdXNpbmcgQVBULiAKLU5vdGUgdGhhdCBib3RoIHRoZSBZVU0gYW5kIEFQVCBtZXRob2RzIHJlcXVpcmVkIGByb290YCBwZXJtaXNzaW9ucyBhbmQgCi13aWxsIGluc3RhbGwgdGhlIGJpbmFyaWVzIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzIGFzIHRoZSBgY2Fzc2FuZHJhYCBPUyB1c2VyLgotCi09PSBJbnN0YWxsaW5nIHRoZSBkb2NrZXIgaW1hZ2UKLQotW2FyYWJpYywgc3RhcnQ9MV0KLS4gUHVsbCB0aGUgZG9ja2VyIGltYWdlLiBGb3IgdGhlIGxhdGVzdCBpbWFnZSwgdXNlOgotCi1bc291cmNlLCBzaGVsbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQkFTSC9kb2NrZXJfcHVsbC5zaFtdCi0tLS0tCi0KLVRoaXMgYGRvY2tlciBwdWxsYCBjb21tYW5kIHdpbGwgZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgJ0RvY2tlciBPZmZpY2lhbCcKLUFwYWNoZSBDYXNzYW5kcmEgaW1hZ2UgYXZhaWxhYmxlIGZyb20gdGhlIGh0dHBzOi8vaHViLmRvY2tlci5jb20vXy9jYXNzYW5kcmFbRG9ja2VyaHViXS4KLQotW2FyYWJpYywgc3RhcnQ9Ml0KLS4gU3RhcnQgQ2Fzc2FuZHJhIHdpdGggYSBgZG9ja2VyIHJ1bmAgY29tbWFuZDoKLQotW3NvdXJjZSwgc2hlbGxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvZG9ja2VyX3J1bi5zaFtdCi0tLS0tCi0KLVRoZSBgLS1uYW1lYCBvcHRpb24gd2lsbCBiZSB0aGUgbmFtZSBvZiB0aGUgQ2Fzc2FuZHJhIGNsdXN0ZXIgY3JlYXRlZC4KLQotW2FyYWJpYywgc3RhcnQ9M10KLS4gU3RhcnQgdGhlIENRTCBzaGVsbCwgYGNxbHNoYCB0byBpbnRlcmFjdCB3aXRoIHRoZSBDYXNzYW5kcmEgbm9kZSBjcmVhdGVkOgotCi1bc291cmNlLCBzaGVsbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQkFTSC9kb2NrZXJfY3Fsc2guc2hbXQotLS0tLQotPT0gSW5zdGFsbGluZyB0aGUgYmluYXJ5IHRhcmJhbGwKLQotaW5jbHVkZTo6cGFydGlhbCRqYXZhX3ZlcnNpb24uYWRvY1tdCi0KLVthcmFiaWMsIHN0YXJ0PTJdCi0uIERvd25sb2FkIHRoZSBiaW5hcnkgdGFyYmFsbCBmcm9tIG9uZSBvZiB0aGUgbWlycm9ycyBvbiB0aGUKLXtjYXNzX3VybH1kb3dubG9hZC9bQXBhY2hlIENhc3NhbmRyYSBEb3dubG9hZF0gc2l0ZS4KLUZvciBleGFtcGxlLCB0byBkb3dubG9hZCBDYXNzYW5kcmEgezQwX3ZlcnNpb259OgotCi1bc291cmNlLHNoZWxsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2N1cmxfaW5zdGFsbC5zaFtdCi0tLS0tCi0KLU5PVEU6IFRoZSBtaXJyb3JzIG9ubHkgaG9zdCB0aGUgbGF0ZXN0IHZlcnNpb25zIG9mIGVhY2ggbWFqb3Igc3VwcG9ydGVkCi1yZWxlYXNlLiBUbyBkb3dubG9hZCBhbiBlYXJsaWVyIHZlcnNpb24gb2YgQ2Fzc2FuZHJhLCB2aXNpdCB0aGUKLWh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC9jYXNzYW5kcmEvW0FwYWNoZSBBcmNoaXZlc10uCi0KLVthcmFiaWMsIHN0YXJ0PTNdCi0uIE9QVElPTkFMOiBWZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGUgZG93bmxvYWRlZCB0YXJiYWxsIHVzaW5nIG9uZSBvZgotdGhlIG1ldGhvZHMgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaSN2ZXJpZnlbaGVyZV0uIEZvcgotZXhhbXBsZSwgdG8gdmVyaWZ5IHRoZSBoYXNoIG9mIHRoZSBkb3dubG9hZGVkIGZpbGUgdXNpbmcgR1BHOgotCi1be3RhYnN9XQotPT09PQotQ29tbWFuZDo6Ci0rCi0tLQotW3NvdXJjZSxzaGVsbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQkFTSC92ZXJpZnlfZ3BnLnNoW10KLS0tLS0KLS0tCi0KLVJlc3VsdDo6Ci0rCi0tLQotW3NvdXJjZSxwbGFpbnRleHRdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvdmVyaWZ5X2dwZy5yZXN1bHRbXQotLS0tLQotLS0KLT09PT0KLQotQ29tcGFyZSB0aGUgc2lnbmF0dXJlIHdpdGggdGhlIFNIQTI1NiBmaWxlIGZyb20gdGhlIERvd25sb2FkcyBzaXRlOgotCi1be3RhYnN9XQotPT09PQotQ29tbWFuZDo6Ci0rCi0tLQotW3NvdXJjZSxzaGVsbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQkFTSC9jdXJsX3ZlcmlmeV9zaGEuc2hbXQotLS0tLQotLS0KLQotUmVzdWx0OjoKLSsKLS0tCi1bc291cmNlLHBsYWludGV4dF0KLS0tLS0KLTI4NzU3ZGRlNTg5ZjcwNDEwZjlhNmE5NWMzOWVlN2U2Y2RlNjM0NDBlMmIwNmI5MWFlNmIyMDA2MTRmYTM2NGQKLS0tLS0KLS0tCi09PT09Ci0KLVthcmFiaWMsIHN0YXJ0PTRdCi0uIFVucGFjayB0aGUgdGFyYmFsbDoKLQotW3NvdXJjZSxzaGVsbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQkFTSC90YXJiYWxsLnNoW10KLS0tLS0KLQotVGhlIGZpbGVzIHdpbGwgYmUgZXh0cmFjdGVkIHRvIHRoZSBgYXBhY2hlLWNhc3NhbmRyYS00LjAuMC9gIGRpcmVjdG9yeS4KLVRoaXMgaXMgdGhlIHRhcmJhbGwgaW5zdGFsbGF0aW9uIGxvY2F0aW9uLgotCi1bYXJhYmljLCBzdGFydD01XQotLiBMb2NhdGVkIGluIHRoZSB0YXJiYWxsIGluc3RhbGxhdGlvbiBsb2NhdGlvbiBhcmUgdGhlIGRpcmVjdG9yaWVzIGZvcgotdGhlIHNjcmlwdHMsIGJpbmFyaWVzLCB1dGlsaXRpZXMsIGNvbmZpZ3VyYXRpb24sIGRhdGEgYW5kIGxvZyBmaWxlczoKLQotW3NvdXJjZSxwbGFpbnRleHRdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJFRFWFQvdGFyYmFsbF9pbnN0YWxsX2RpcnMudHh0W10KLS0tLS0KLTwxPiBsb2NhdGlvbiBvZiB0aGUgY29tbWFuZHMgdG8gcnVuIGNhc3NhbmRyYSwgY3Fsc2gsIG5vZGV0b29sLCBhbmQgU1NUYWJsZSB0b29scwotPDI+IGxvY2F0aW9uIG9mIGNhc3NhbmRyYS55YW1sIGFuZCBvdGhlciBjb25maWd1cmF0aW9uIGZpbGVzCi08Mz4gbG9jYXRpb24gb2YgdGhlIGNvbW1pdCBsb2dzLCBoaW50cywgYW5kIFNTVGFibGVzCi08ND4gbG9jYXRpb24gb2Ygc3lzdGVtIGFuZCBkZWJ1ZyBsb2dzCi08NT5sb2NhdGlvbiBvZiBjYXNzYW5kcmEtc3RyZXNzIHRvb2wKLQotRm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb25maWd1cmUgeW91ciBpbnN0YWxsYXRpb24sIHNlZQote2Nhc3NfdXJsfWRvYy9sYXRlc3QvZ2V0dGluZ19zdGFydGVkL2NvbmZpZ3VyaW5nLmh0bWxbQ29uZmlndXJpbmcKLUNhc3NhbmRyYV0uCi0KLVthcmFiaWMsIHN0YXJ0PTZdCi0uIFN0YXJ0IENhc3NhbmRyYToKLQotW3NvdXJjZSxzaGVsbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQkFTSC9zdGFydF90YXJiYWxsLnNoW10KLS0tLS0KLQotTk9URTogVGhpcyB3aWxsIHJ1biBDYXNzYW5kcmEgYXMgdGhlIGF1dGhlbnRpY2F0ZWQgTGludXggdXNlci4KLQotaW5jbHVkZTo6cGFydGlhbCR0YWlsX3N5c2xvZy5hZG9jW10KLVlvdSBjYW4gbW9uaXRvciB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIHN0YXJ0dXAgd2l0aDoKLQotW3t0YWJzfV0KLT09PT0KLUNvbW1hbmQ6OgotKwotLS0KLVtzb3VyY2Usc2hlbGxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvdGFpbF9zeXNsb2cuc2hbXQotLS0tLQotLS0KLQotUmVzdWx0OjoKLSsKLS0tCi1DYXNzYW5kcmEgaXMgcmVhZHkgd2hlbiB5b3Ugc2VlIGFuIGVudHJ5IGxpa2UgdGhpcyBpbiB0aGUgYHN5c3RlbS5sb2dgOgotCi1bc291cmNlLHBsYWludGV4dF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy90YWlsX3N5c2xvZy5yZXN1bHRbXQotLS0tLQotLS0KLT09PT0KLQotaW5jbHVkZTo6cGFydGlhbCRub2RldG9vbF9hbmRfY3Fsc2guYWRvY1tdCi0KLT09IEluc3RhbGxpbmcgdGhlIERlYmlhbiBwYWNrYWdlcwotCi1pbmNsdWRlOjpwYXJ0aWFsJGphdmFfdmVyc2lvbi5hZG9jW10KLQotW2FyYWJpYywgc3RhcnQ9Ml0KLS4gQWRkIHRoZSBBcGFjaGUgcmVwb3NpdG9yeSBvZiBDYXNzYW5kcmEgdG8gdGhlIGZpbGUKLWBjYXNzYW5kcmEuc291cmNlcy5saXN0YC4gCi1pbmNsdWRlOjpwYXJ0aWFsJHBhY2thZ2VfdmVyc2lvbnMuYWRvY1tdCi0KLVtzb3VyY2Usc2hlbGxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvZ2V0X2RlYl9wYWNrYWdlLnNoW10KLS0tLS0KLQotW2FyYWJpYywgc3RhcnQ9M10KLS4gQWRkIHRoZSBBcGFjaGUgQ2Fzc2FuZHJhIHJlcG9zaXRvcnkga2V5cyB0byB0aGUgbGlzdCBvZiB0cnVzdGVkIGtleXMKLW9uIHRoZSBzZXJ2ZXI6Ci0KLVt7dGFic31dCi09PT09Ci1Db21tYW5kOjoKLSsKLS0tCi1bc291cmNlLHNoZWxsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2FkZF9yZXBvX2tleXMuc2hbXQotLS0tLQotLS0KLQotUmVzdWx0OjoKLSsKLS0tCi1bc291cmNlLHBsYWludGV4dF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9hZGRfcmVwb19rZXlzLnJlc3VsdFtdCi0tLS0tCi0tLQotPT09PQotCi1bYXJhYmljLCBzdGFydD00XQotLiBVcGRhdGUgdGhlIHBhY2thZ2UgaW5kZXggZnJvbSBzb3VyY2VzOgotCi1bc291cmNlLHNoZWxsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2FwdC1nZXRfdXBkYXRlLnNoW10KLS0tLS0KLQotW2FyYWJpYywgc3RhcnQ9NV0KLS4gSW5zdGFsbCBDYXNzYW5kcmEgd2l0aCBBUFQ6Ci0KLVtzb3VyY2Usc2hlbGxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvYXB0LWdldF9jYXNzLnNoW10KLS0tLS0KLQotTk9URTogRm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb25maWd1cmUgeW91ciBpbnN0YWxsYXRpb24sIHNlZQote2Nhc3NfdXJsfWRvYy9sYXRlc3QvZ2V0dGluZ19zdGFydGVkL2NvbmZpZ3VyaW5nLmh0bWxbQ29uZmlndXJpbmcKLUNhc3NhbmRyYV0uCi0KLWluY2x1ZGU6OnBhcnRpYWwkdGFpbF9zeXNsb2cuYWRvY1tdCi0KLWluY2x1ZGU6OnBhcnRpYWwkbm9kZXRvb2xfYW5kX2NxbHNoX25vYmluLmFkb2NbXQotCi09PSBJbnN0YWxsaW5nIHRoZSBSUE0gcGFja2FnZXMKLQotaW5jbHVkZTo6cGFydGlhbCRqYXZhX3ZlcnNpb24uYWRvY1tdCi0KLVthcmFiaWMsIHN0YXJ0PTJdCi0uIEFkZCB0aGUgQXBhY2hlIHJlcG9zaXRvcnkgb2YgQ2Fzc2FuZHJhIHRvIHRoZSBmaWxlCi1gL2V0Yy95dW0ucmVwb3MuZC9jYXNzYW5kcmEucmVwb2AgKGFzIHRoZSBgcm9vdGAgdXNlcikuCi1pbmNsdWRlOjpwYXJ0aWFsJHBhY2thZ2VfdmVyc2lvbnMuYWRvY1tdCi0gCi1bc291cmNlLHBsYWludGV4dF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9hZGRfeXVtX3JlcG8ucmVzdWx0W10KLS0tLS0KLQotW2FyYWJpYywgc3RhcnQ9M10KLS4gVXBkYXRlIHRoZSBwYWNrYWdlIGluZGV4IGZyb20gc291cmNlczoKLQotW3NvdXJjZSxzaGVsbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQkFTSC95dW1fdXBkYXRlLnNoW10KLS0tLS0KLQotW2FyYWJpYywgc3RhcnQ9NF0KLS4gSW5zdGFsbCBDYXNzYW5kcmEgd2l0aCBZVU06Ci0KLVtzb3VyY2Usc2hlbGxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gveXVtX2Nhc3Muc2hbXQotLS0tLQotCi1OT1RFOiBBIG5ldyBMaW51eCB1c2VyIGBjYXNzYW5kcmFgIHdpbGwgZ2V0IGNyZWF0ZWQgYXMgcGFydCBvZiB0aGUKLWluc3RhbGxhdGlvbi4gVGhlIENhc3NhbmRyYSBzZXJ2aWNlIHdpbGwgYWxzbyBiZSBydW4gYXMgdGhpcyB1c2VyLgotCi1bYXJhYmljLCBzdGFydD01XQotLiBTdGFydCB0aGUgQ2Fzc2FuZHJhIHNlcnZpY2U6Ci0KLVtzb3VyY2Usc2hlbGxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gveXVtX3N0YXJ0LnNoW10KLS0tLS0KLQotaW5jbHVkZTo6cGFydGlhbCR0YWlsX3N5c2xvZy5hZG9jW10KLQotaW5jbHVkZTo6cGFydGlhbCRub2RldG9vbF9hbmRfY3Fsc2hfbm9iaW4uYWRvY1tdCi0KLT09IEZ1cnRoZXIgaW5zdGFsbGF0aW9uIGluZm8KLQotRm9yIGhlbHAgd2l0aCBpbnN0YWxsYXRpb24gaXNzdWVzLCBzZWUgdGhlCi17Y2Fzc191cmx9ZG9jL2xhdGVzdC90cm91Ymxlc2hvb3RpbmcvaW5kZXguaHRtbFtUcm91Ymxlc2hvb3RpbmddCi1zZWN0aW9uLgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmdfc3RhcnRlZC9qYXZhMTEuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nX3N0YXJ0ZWQvamF2YTExLmFkb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MWE1N2YuLjAwMDAwMDAKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmdfc3RhcnRlZC9qYXZhMTEuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi09IFN1cHBvcnQgZm9yIEphdmEgMTEKLQotSW4gdGhlIG5ldyBKYXZhIHJlbGVhc2UgY2FkZW5jZSBhIG5ldyBKYXZhIHZlcnNpb24gaXMgbWFkZSBhdmFpbGFibGUKLWV2ZXJ5IHNpeCBtb250aHMuIFRoZSBtb3JlIGZyZXF1ZW50IHJlbGVhc2UgY3ljbGUgaXMgZmF2b3JlZCBhcyBpdAotYnJpbmdzIG5ldyBKYXZhIGZlYXR1cmVzIHRvIHRoZSBkZXZlbG9wZXJzIGFzIGFuZCB3aGVuIHRoZXkgYXJlCi1kZXZlbG9wZWQgd2l0aG91dCB0aGUgd2FpdCB0aGF0IHRoZSBlYXJsaWVyIDMgeWVhciByZWxlYXNlIG1vZGVsCi1pbmN1cnJlZC4gTm90IGV2ZXJ5IEphdmEgdmVyc2lvbiBpcyBhIExvbmcgVGVybSBTdXBwb3J0IChMVFMpIHZlcnNpb24uCi1BZnRlciBKYXZhIDggdGhlIG5leHQgTFRTIHZlcnNpb24gaXMgSmF2YSAxMS4gSmF2YSA5LCAxMCwgMTIgYW5kIDEzIGFyZQotYWxsIG5vbi1MVFMgdmVyc2lvbnMuCi0KLU9uZSBvZiB0aGUgb2JqZWN0aXZlcyBvZiB0aGUgQXBhY2hlIENhc3NhbmRyYSA0LjAgdmVyc2lvbiBpcyB0byBzdXBwb3J0Ci10aGUgcmVjZW50IExUUyBKYXZhIHZlcnNpb25zIDggYW5kIDExCi0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtOTYwOFtDQVNTQU5EUkEtOTYwOF0pLgotSmF2YSA4IGFuZCBKYXZhIDExIG1heSBiZSB1c2VkIHRvIGJ1aWxkIGFuZCBydW4gQXBhY2hlIENhc3NhbmRyYSA0LjAuIEVmZmVjdGl2ZSBDYXNzYW5kcmEKLTQuMC4yIHRoZXJlIGlzIGZ1bGwgSmF2YSAxMSBzdXBwb3J0LCBpdCBpcyBub3QgZXhwZXJpbWVudGFsIGFueW1vcmUuCi0KLT09IFN1cHBvcnQgTWF0cml4Ci0KLVRoZSBzdXBwb3J0IG1hdHJpeCBmb3IgdGhlIEphdmEgdmVyc2lvbnMgZm9yIGNvbXBpbGluZyBhbmQgcnVubmluZwotQXBhY2hlIENhc3NhbmRyYSA0LjAgaXMgZGV0YWlsZWQgaW4gVGFibGUgMS4gVGhlIGJ1aWxkIHZlcnNpb24gaXMgYWxvbmcKLXRoZSB2ZXJ0aWNhbCBheGlzIGFuZCB0aGUgcnVuIHZlcnNpb24gaXMgYWxvbmcgdGhlIGhvcml6b250YWwgYXhpcy4KLQotVGFibGUgMSA6IFN1cHBvcnQgTWF0cml4IGZvciBKYXZhCi0KLVt3aWR0aD0iNjglIixjb2xzPSIzNCUsMzAlLDM2JSIsXQotfD09PQotfCB8SmF2YSA4IChSdW4pIHxKYXZhIDExIChSdW4pCi18SmF2YSA4IChCdWlsZCkgfFN1cHBvcnRlZCB8U3VwcG9ydGVkCi18SmF2YSAxMShCdWlsZCkgfE5vdCBTdXBwb3J0ZWQgfFN1cHBvcnRlZAotfD09PQotCi1Fc3NlbnRpYWxseSBBcGFjaGUgNC4wIHNvdXJjZSBjb2RlIGJ1aWx0IHdpdGggSmF2YSAxMSBjYW5ub3QgYmUgcnVuIHdpdGgKLUphdmEgOC4gTmV4dCwgd2Ugc2hhbGwgZGlzY3VzcyB1c2luZyBlYWNoIG9mIEphdmEgOCBhbmQgMTEgdG8gYnVpbGQgYW5kCi1ydW4gQXBhY2hlIENhc3NhbmRyYSA0LjAuCi0KLT09IFVzaW5nIEphdmEgOCB0byBCdWlsZAotCi1UbyBzdGFydCB3aXRoLCBpbnN0YWxsIEphdmEgOC4gQXMgYW4gZXhhbXBsZSwgZm9yIGluc3RhbGxpbmcgSmF2YSA4IG9uCi1SZWRIYXQgTGludXggdGhlIGNvbW1hbmQgaXMgYXMgZm9sbG93czoKLQotLi4uLgotJCBzdWRvIHl1bSBpbnN0YWxsIGphdmEtMS44LjAtb3Blbmpkay1kZXZlbAotLi4uLgotCi1TZXQgYEpBVkFfSE9NRWAgYW5kIGBKUkVfSE9NRWAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIHRoZSBzaGVsbCBiYXNoCi1zY3JpcHQuIEZpcnN0LCBvcGVuIHRoZSBiYXNoIHNjcmlwdDoKLQotLi4uLgotJCBzdWRvIHZpIH4vLmJhc2hyYwotLi4uLgotCi1TZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbmNsdWRpbmcgdGhlIGBQQVRIYC4KLQotLi4uLgotJCBleHBvcnQgSkFWQV9IT01FPS91c3IvbGliL2p2bS9qYXZhLTEuOC4wLW9wZW5qZGsKLSQgZXhwb3J0IEpSRV9IT01FPS91c3IvbGliL2p2bS9qYXZhLTEuOC4wLW9wZW5qZGsvanJlCi0kIGV4cG9ydCBQQVRIPSRQQVRIOiRKQVZBX0hPTUUvYmluOiRKUkVfSE9NRS9iaW4KLS4uLi4KLQotRG93bmxvYWQgYW5kIGluc3RhbGwgQXBhY2hlIENhc3NhbmRyYSA0LjAgc291cmNlIGNvZGUgZnJvbSB0aGUgR2l0IGFsb25nCi13aXRoIHRoZSBkZXBlbmRlbmNpZXMuCi0KLS4uLi4KLSQgZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLmdpdAotLi4uLgotCi1JZiBDYXNzYW5kcmEgaXMgYWxyZWFkeSBydW5uaW5nIHN0b3AgQ2Fzc2FuZHJhIHdpdGggdGhlIGZvbGxvd2luZwotY29tbWFuZC4KLQotLi4uLgotW2VjMi11c2VyQGlwLTE3Mi0zMC0zLTE0NiBiaW5dJCAuL25vZGV0b29sIHN0b3BkYWVtb24KLS4uLi4KLQotQnVpbGQgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIGBjYXNzYW5kcmFgIGRpcmVjdG9yeSwgd2hpY2ggaGFzIHRoZQotYGJ1aWxkLnhtbGAgYnVpbGQgc2NyaXB0LiBUaGUgQXBhY2hlIEFudCB1c2VzIHRoZSBKYXZhIHZlcnNpb24gc2V0IGluCi10aGUgYEpBVkFfSE9NRWAgZW52aXJvbm1lbnQgdmFyaWFibGUuCi0KLS4uLi4KLSQgY2Qgfi9jYXNzYW5kcmEKLSQgYW50Ci0uLi4uCi0KLUFwYWNoZSBDYXNzYW5kcmEgNC4wIGdldHMgYnVpbHQgd2l0aCBKYXZhIDguIFNldCB0aGUgZW52aXJvbm1lbnQKLXZhcmlhYmxlIGZvciBgQ0FTU0FORFJBX0hPTUVgIGluIHRoZSBiYXNoIHNjcmlwdC4gQWxzbyBhZGQgdGhlCi1gQ0FTU0FORFJBX0hPTUUvYmluYCB0byB0aGUgYFBBVEhgIHZhcmlhYmxlLgotCi0uLi4uCi0kIGV4cG9ydCBDQVNTQU5EUkFfSE9NRT1+L2Nhc3NhbmRyYQotJCBleHBvcnQgUEFUSD0kUEFUSDokSkFWQV9IT01FL2JpbjokSlJFX0hPTUUvYmluOiRDQVNTQU5EUkFfSE9NRS9iaW4KLS4uLi4KLQotVG8gcnVuIEFwYWNoZSBDYXNzYW5kcmEgNC4wIHdpdGggZWl0aGVyIG9mIEphdmEgOCBvciBKYXZhIDExIHJ1biB0aGUKLUNhc3NhbmRyYSBhcHBsaWNhdGlvbiBpbiB0aGUgYENBU1NBTkRSQV9IT01FL2JpbmAgZGlyZWN0b3J5LCB3aGljaCBpcyBpbgotdGhlIGBQQVRIYCBlbnYgdmFyaWFibGUuCi0KLS4uLi4KLSQgY2Fzc2FuZHJhCi0uLi4uCi0KLVRoZSBKYXZhIHZlcnNpb24gdXNlZCB0byBydW4gQ2Fzc2FuZHJhIGdldHMgb3V0cHV0IGFzIENhc3NhbmRyYSBpcwotZ2V0dGluZyBzdGFydGVkLiBBcyBhbiBleGFtcGxlIGlmIEphdmEgMTEgaXMgdXNlZCwgdGhlIHJ1biBvdXRwdXQgc2hvdWxkCi1pbmNsdWRlIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZyBvdXRwdXQgc25pcHBldDoKLQotLi4uLgotSU5GTyAgW21haW5dIDIwMTktMDctMzEgMjE6MTg6MTYsODYyIENhc3NhbmRyYURhZW1vbi5qYXZhOjQ4MCAtIEhvc3RuYW1lOiBpcC0xNzItMzAtMy0gCi0xNDYuZWMyLmludGVybmFsOjcwMDA6NzAwMQotSU5GTyAgW21haW5dIDIwMTktMDctMzEgMjE6MTg6MTYsODYyIENhc3NhbmRyYURhZW1vbi5qYXZhOjQ4NyAtIEpWTSB2ZW5kb3IvdmVyc2lvbjogT3BlbkpESyAKLTY0LUJpdCBTZXJ2ZXIgVk0vMTEuMC4zCi1JTkZPICBbbWFpbl0gMjAxOS0wNy0zMSAyMToxODoxNiw4NjMgQ2Fzc2FuZHJhRGFlbW9uLmphdmE6NDg4IC0gSGVhcCBzaXplOiAKLTEwMDQuMDAwTWlCLzEwMDQuMDAwTWlCCi0uLi4uCi0KLVRoZSBmb2xsb3dpbmcgb3V0cHV0IGluZGljYXRlcyBhIHNpbmdsZSBub2RlIENhc3NhbmRyYSA0LjAgY2x1c3RlciBoYXMKLXN0YXJ0ZWQuCi0KLS4uLi4KLUlORk8gIFttYWluXSAyMDE5LTA3LTMxIDIxOjE4OjE5LDY4NyBJbmJvdW5kQ29ubmVjdGlvbkluaXRpYXRvci5qYXZhOjEzMCAtIExpc3RlbmluZyBvbiAKLWFkZHJlc3M6ICgxMjcuMC4wLjE6NzAwMCksIG5pYzogbG8sIGVuY3J5cHRpb246IGVuYWJsZWQgKG9wZW5zc2wpCi0uLi4KLS4uLgotSU5GTyAgW21haW5dIDIwMTktMDctMzEgMjE6MTg6MTksODUwIFN0b3JhZ2VTZXJ2aWNlLmphdmE6NTEyIC0gVW5hYmxlIHRvIGdvc3NpcCB3aXRoIGFueSAKLXBlZXJzIGJ1dCBjb250aW51aW5nIGFueXdheSBzaW5jZSBub2RlIGlzIGluIGl0cyBvd24gc2VlZCBsaXN0Ci1JTkZPICBbbWFpbl0gMjAxOS0wNy0zMSAyMToxODoxOSw4NjQgU3RvcmFnZVNlcnZpY2UuamF2YTo2OTUgLSBMb2FkaW5nIHBlcnNpc3RlZCByaW5nIHN0YXRlCi1JTkZPICBbbWFpbl0gMjAxOS0wNy0zMSAyMToxODoxOSw4NjUgU3RvcmFnZVNlcnZpY2UuamF2YTo4MTQgLSBTdGFydGluZyB1cCBzZXJ2ZXIgZ29zc2lwCi1JTkZPICBbbWFpbl0gMjAxOS0wNy0zMSAyMToxODoyMCwwODggQnVmZmVyUG9vbC5qYXZhOjIxNiAtIEdsb2JhbCBidWZmZXIgcG9vbCBpcyBlbmFibGVkLCAgCi13aGVuIHBvb2wgaXMgZXhoYXVzdGVkIChtYXggaXMgMjUxLjAwME1pQikgaXQgd2lsbCBhbGxvY2F0ZSBvbiBoZWFwCi1JTkZPICBbbWFpbl0gMjAxOS0wNy0zMSAyMToxODoyMCwxMTAgU3RvcmFnZVNlcnZpY2UuamF2YTo4NzUgLSBUaGlzIG5vZGUgd2lsbCBub3QgYXV0byAKLWJvb3RzdHJhcCBiZWNhdXNlIGl0IGlzIGNvbmZpZ3VyZWQgdG8gYmUgYSBzZWVkIG5vZGUuCi0uLi4KLS4uLgotSU5GTyAgW21haW5dIDIwMTktMDctMzEgMjE6MTg6MjAsODA5IFN0b3JhZ2VTZXJ2aWNlLmphdmE6MTUwNyAtIEpPSU5JTkc6IEZpbmlzaCBqb2luaW5nIHJpbmcKLUlORk8gIFttYWluXSAyMDE5LTA3LTMxIDIxOjE4OjIwLDkyMSBTdG9yYWdlU2VydmljZS5qYXZhOjI1MDggLSBOb2RlIDEyNy4wLjAuMTo3MDAwIHN0YXRlIAotanVtcCB0byBOT1JNQUwKLS4uLi4KLQotPT0gVXNpbmcgSmF2YSAxMSB0byBCdWlsZAotCi1JZiBKYXZhIDExIGlzIHVzZWQgdG8gYnVpbGQgQXBhY2hlIENhc3NhbmRyYSA0LjAsIGZpcnN0IEphdmEgMTEgbXVzdCBiZQotaW5zdGFsbGVkIGFuZCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNldC4gQXMgYW4gZXhhbXBsZSwgdG8gZG93bmxvYWQKLWFuZCBpbnN0YWxsIEphdmEgMTEgb24gUmVkSGF0IExpbnV4IHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQuCi0KLS4uLi4KLSQgeXVtIGluc3RhbGwgamF2YS0xMS1vcGVuamRrLWRldmVsCi0uLi4uCi0KLVNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIHRoZSBiYXNoIHNjcmlwdCBmb3IgSmF2YSAxMS4gVGhlIGZpcnN0Ci1jb21tYW5kIGlzIHRvIG9wZW4gdGhlIGJhc2ggc2NyaXB0LgotCi0uLi4uCi0kIHN1ZG8gdmkgfi8uYmFzaHJjIAotJCBleHBvcnQgSkFWQV9IT01FPS91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGsKLSQgZXhwb3J0IEpSRV9IT01FPS91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGsvanJlCi0kIGV4cG9ydCBQQVRIPSRQQVRIOiRKQVZBX0hPTUUvYmluOiRKUkVfSE9NRS9iaW4KLS4uLi4KLQotVG8gYnVpbGQgc291cmNlIGNvZGUgd2l0aCBKYXZhIDExIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBvcHRpb25zIG11c3QKLWJlIHVzZWQuCi0KLV9fX18KLVthcmFiaWNdCi0uIHtibGFua30KLSsKLUluY2x1ZGUgQXBhY2hlIEFudCBjb21tYW5kLWxpbmUgb3B0aW9uIGAtRHVzZS5qZGs9MTFgIGFzIGZvbGxvd3M6OjoKLS4uLi4KLSQgYW50IC1EdXNlLmpkaz0xMQotLi4uLgotLiB7Ymxhbmt9Ci0rCi1TZXQgZW52aXJvbm1lbnQgdmFyaWFibGUgYENBU1NBTkRSQV9VU0VfSkRLMTFgIHRvIGB0cnVlYDo6OgotLi4uLgotJCBleHBvcnQgQ0FTU0FORFJBX1VTRV9KREsxMT10cnVlCi0uLi4uCi1fX19fCi0KLUFzIGFuIGV4YW1wbGUsIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYENBU1NBTkRSQV9VU0VfSkRLMTFgIHRvCi1gdHJ1ZWAuCi0KLS4uLi4KLVtlYzItdXNlckBpcC0xNzItMzAtMy0xNDYgY2Fzc2FuZHJhXSQgZXhwb3J0IENBU1NBTkRSQV9VU0VfSkRLMTE9dHJ1ZQotW2VjMi11c2VyQGlwLTE3Mi0zMC0zLTE0NiBjYXNzYW5kcmFdJCBhbnQKLUJ1aWxkZmlsZTogL2hvbWUvZWMyLXVzZXIvY2Fzc2FuZHJhL2J1aWxkLnhtbAotLi4uLgotCi1Pciwgc2V0IHRoZSBjb21tYW5kLWxpbmUgb3B0aW9uLgotCi0uLi4uCi1bZWMyLXVzZXJAaXAtMTcyLTMwLTMtMTQ2IGNhc3NhbmRyYV0kIGFudCAtRHVzZS5qZGsxMT10cnVlCi0uLi4uCi0KLVRoZSBidWlsZCBvdXRwdXQgc2hvdWxkIGluY2x1ZGUgdGhlIGZvbGxvd2luZy4KLQotLi4uLgotX2J1aWxkX2phdmE6Ci0gICAgW2VjaG9dIENvbXBpbGluZyBmb3IgSmF2YSAxMQotLi4uCi0uLi4KLWJ1aWxkOgotCi1fbWFpbi1qYXI6Ci0gICAgICAgICBbY29weV0gQ29weWluZyAxIGZpbGUgdG8gL2hvbWUvZWMyLXVzZXIvY2Fzc2FuZHJhL2J1aWxkL2NsYXNzZXMvbWFpbi9NRVRBLUlORgotICAgICBbamFyXSBCdWlsZGluZyBqYXI6IC9ob21lL2VjMi11c2VyL2Nhc3NhbmRyYS9idWlsZC9hcGFjaGUtY2Fzc2FuZHJhLTQuMC1TTkFQU0hPVC5qYXIKLS4uLgotLi4uCi1fYnVpbGQtdGVzdDoKLSAgIFtqYXZhY10gQ29tcGlsaW5nIDczOSBzb3VyY2UgZmlsZXMgdG8gL2hvbWUvZWMyLXVzZXIvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvY2xhc3NlcwotICAgIFtjb3B5XSBDb3B5aW5nIDI1IGZpbGVzIHRvIC9ob21lL2VjMi11c2VyL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2NsYXNzZXMKLS4uLgotLi4uCi1qYXI6Ci0gICBbbWtkaXJdIENyZWF0ZWQgZGlyOiAvaG9tZS9lYzItdXNlci9jYXNzYW5kcmEvYnVpbGQvY2xhc3Nlcy9zdHJlc3MvTUVUQS1JTkYKLSAgIFtta2Rpcl0gQ3JlYXRlZCBkaXI6IC9ob21lL2VjMi11c2VyL2Nhc3NhbmRyYS9idWlsZC90b29scy9saWIKLSAgICAgW2phcl0gQnVpbGRpbmcgamFyOiAvaG9tZS9lYzItdXNlci9jYXNzYW5kcmEvYnVpbGQvdG9vbHMvbGliL3N0cmVzcy5qYXIKLSAgIFtta2Rpcl0gQ3JlYXRlZCBkaXI6IC9ob21lL2VjMi11c2VyL2Nhc3NhbmRyYS9idWlsZC9jbGFzc2VzL2ZxbHRvb2wvTUVUQS1JTkYKLSAgICAgW2phcl0gQnVpbGRpbmcgamFyOiAvaG9tZS9lYzItdXNlci9jYXNzYW5kcmEvYnVpbGQvdG9vbHMvbGliL2ZxbHRvb2wuamFyCi0KLUJVSUxEIFNVQ0NFU1NGVUwKLVRvdGFsIHRpbWU6IDEgbWludXRlIDMgc2Vjb25kcwotW2VjMi11c2VyQGlwLTE3Mi0zMC0zLTE0NiBjYXNzYW5kcmFdJCAKLS4uLi4KLQotPT0gQ29tbW9uIElzc3VlcwotCi1PbmUgb2YgdGhlIHR3byBvcHRpb25zIG1lbnRpb25lZCBtdXN0IGJlIHVzZWQgdG8gY29tcGlsZSB3aXRoIEpESyAxMSBvcgotdGhlIGJ1aWxkIGZhaWxzIGFuZCB0aGUgZm9sbG93aW5nIGVycm9yIG1lc3NhZ2UgaXMgb3V0cHV0LgotCi0uLi4uCi1bZWMyLXVzZXJAaXAtMTcyLTMwLTMtMTQ2IGNhc3NhbmRyYV0kIGFudAotQnVpbGRmaWxlOiAvaG9tZS9lYzItdXNlci9jYXNzYW5kcmEvYnVpbGQueG1sCi12YWxpZGF0ZS1idWlsZC1jb25mOgotCi1CVUlMRCBGQUlMRUQKLS9ob21lL2VjMi11c2VyL2Nhc3NhbmRyYS9idWlsZC54bWw6MjkzOiAtRHVzZS5qZGsxMT10cnVlIG9yICRDQVNTQU5EUkFfVVNFX0pESzExPXRydWUgbXVzdCAKLWJlIHNldCB3aGVuIGJ1aWxkaW5nIGZyb20gamF2YSAxMQotVG90YWwgdGltZTogMSBzZWNvbmQKLVtlYzItdXNlckBpcC0xNzItMzAtMy0xNDYgY2Fzc2FuZHJhXSQgCi0uLi4uCi0KLVRoZSBKYXZhIDExIGJ1aWx0IEFwYWNoZSBDYXNzYW5kcmEgNC4wIHNvdXJjZSBjb2RlIG1heSBiZSBydW4gd2l0aCBKYXZhCi0xMSBvbmx5LiBJZiBhIEphdmEgMTEgYnVpbHQgY29kZSBpcyBydW4gd2l0aCBKYXZhIDggdGhlIGZvbGxvd2luZyBlcnJvcgotbWVzc2FnZSBnZXRzIG91dHB1dC4KLQotLi4uLgotW3Jvb3RAbG9jYWxob3N0IH5dIyBzc2ggLWkgY2Fzc2FuZHJhLnBlbSBlYzItdXNlckBlYzItMy04NS04NS03NS5jb21wdXRlLTEuYW1hem9uYXdzLmNvbQotTGFzdCBsb2dpbjogV2VkIEp1bCAzMSAyMDo0NzoyNiAyMDE5IGZyb20gNzUuMTU1LjI1NS41MQotW2VjMi11c2VyQGlwLTE3Mi0zMC0zLTE0NiB+XSQgZWNobyAkSkFWQV9IT01FCi0vdXNyL2xpYi9qdm0vamF2YS0xLjguMC1vcGVuamRrCi1bZWMyLXVzZXJAaXAtMTcyLTMwLTMtMTQ2IH5dJCBjYXNzYW5kcmEgCi0uLi4KLS4uLgotRXJyb3I6IEEgSk5JIGVycm9yIGhhcyBvY2N1cnJlZCwgcGxlYXNlIGNoZWNrIHlvdXIgaW5zdGFsbGF0aW9uIGFuZCB0cnkgYWdhaW4KLUV4Y2VwdGlvbiBpbiB0aHJlYWQgIm1haW4iIGphdmEubGFuZy5VbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yOiAKLW9yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQ2Fzc2FuZHJhRGFlbW9uIGhhcyBiZWVuIGNvbXBpbGVkIGJ5IGEgbW9yZSByZWNlbnQgdmVyc2lvbiBvZiAKLXRoZSBKYXZhIFJ1bnRpbWUgKGNsYXNzIGZpbGUgdmVyc2lvbiA1NS4wKSwgdGhpcyB2ZXJzaW9uIG9mIHRoZSBKYXZhIFJ1bnRpbWUgb25seSByZWNvZ25pemVzIAotY2xhc3MgZmlsZSB2ZXJzaW9ucyB1cCB0byA1Mi4wCi0gIGF0IGphdmEubGFuZy5DbGFzc0xvYWRlci5kZWZpbmVDbGFzczEoTmF0aXZlIE1ldGhvZCkKLSAgYXQgamF2YS5sYW5nLkNsYXNzTG9hZGVyLmRlZmluZUNsYXNzKENsYXNzTG9hZGVyLmphdmE6NzYzKQotICBhdCAuLi4KLS4uLgotLi4uLgotCi1UaGUgYENBU1NBTkRSQV9VU0VfSkRLMTFgIHZhcmlhYmxlIG9yIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9uCi1gLUR1c2UuamRrMTFgIGNhbm5vdCBiZSB1c2VkIHRvIGJ1aWxkIHdpdGggSmF2YSA4LiBUbyBkZW1vbnN0cmF0ZSBzZXQKLWBKQVZBX0hPTUVgIHRvIHZlcnNpb24gOC4KLQotLi4uLgotW3Jvb3RAbG9jYWxob3N0IH5dIyBzc2ggLWkgY2Fzc2FuZHJhLnBlbSBlYzItdXNlckBlYzItMy04NS04NS03NS5jb21wdXRlLTEuYW1hem9uYXdzLmNvbQotTGFzdCBsb2dpbjogV2VkIEp1bCAzMSAyMTo0MTo1MCAyMDE5IGZyb20gNzUuMTU1LjI1NS41MQotW2VjMi11c2VyQGlwLTE3Mi0zMC0zLTE0NiB+XSQgZWNobyAkSkFWQV9IT01FCi0vdXNyL2xpYi9qdm0vamF2YS0xLjguMC1vcGVuamRrCi0uLi4uCi0KLVNldCB0aGUgYENBU1NBTkRSQV9VU0VfSkRLMTE9dHJ1ZWAgb3IgY29tbWFuZC1saW5lIG9wdGlvbgotYC1EdXNlLmpkazExPXRydWVgLiBTdWJzZXF1ZW50bHksIHJ1biBBcGFjaGUgQW50IHRvIHN0YXJ0IHRoZSBidWlsZC4gVGhlCi1idWlsZCBmYWlscyB3aXRoIGVycm9yIG1lc3NhZ2UgbGlzdGVkLgotCi0uLi4uCi1bZWMyLXVzZXJAaXAtMTcyLTMwLTMtMTQ2IH5dJCBjZCAKLWNhc3NhbmRyYQotW2VjMi11c2VyQGlwLTE3Mi0zMC0zLTE0NiBjYXNzYW5kcmFdJCBleHBvcnQgQ0FTU0FORFJBX1VTRV9KREsxMT10cnVlCi1bZWMyLXVzZXJAaXAtMTcyLTMwLTMtMTQ2IGNhc3NhbmRyYV0kIGFudCAKLUJ1aWxkZmlsZTogL2hvbWUvZWMyLXVzZXIvY2Fzc2FuZHJhL2J1aWxkLnhtbAotCi12YWxpZGF0ZS1idWlsZC1jb25mOgotCi1CVUlMRCBGQUlMRUQKLS9ob21lL2VjMi11c2VyL2Nhc3NhbmRyYS9idWlsZC54bWw6Mjg1OiAtRHVzZS5qZGsxMT10cnVlIG9yICRDQVNTQU5EUkFfVVNFX0pESzExPXRydWUgY2Fubm90IAotYmUgc2V0IHdoZW4gYnVpbGRpbmcgZnJvbSBqYXZhIDgKLQotVG90YWwgdGltZTogMCBzZWNvbmRzCi0uLi4uCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZ19zdGFydGVkL3Byb2R1Y3Rpb24uYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nX3N0YXJ0ZWQvcHJvZHVjdGlvbi5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2IyNjA4Li4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nX3N0YXJ0ZWQvcHJvZHVjdGlvbi5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLT0gUHJvZHVjdGlvbiByZWNvbW1lbmRhdGlvbnMKLQotVGhlIGBjYXNzYW5kcmEueWFtbGAgYW5kIGBqdm0ub3B0aW9uc2AgZmlsZXMgaGF2ZSBhIG51bWJlciBvZiBub3RlcyBhbmQKLXJlY29tbWVuZGF0aW9ucyBmb3IgcHJvZHVjdGlvbiB1c2FnZS4KLVRoaXMgcGFnZSBleHBhbmRzIG9uIHNvbWUgb2YgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBmaWxlcy4KLQotPT0gVG9rZW5zCi0KLVVzaW5nIG1vcmUgdGhhbiBvbmUgdG9rZW4tcmFuZ2UgcGVyIG5vZGUgaXMgcmVmZXJyZWQgdG8gYXMgdmlydHVhbCBub2Rlcywgb3Igdm5vZGVzLgotYHZub2Rlc2AgZmFjaWxpdGF0ZSBmbGV4aWJsZSBleHBhbnNpb24gd2l0aCBtb3JlIHN0cmVhbWluZyBwZWVycyB3aGVuIGEgbmV3IG5vZGUgYm9vdHN0cmFwcwotaW50byBhIGNsdXN0ZXIuCi1MaW1pdGluZyB0aGUgbmVnYXRpdmUgaW1wYWN0IG9mIHN0cmVhbWluZyAoSS9PIGFuZCBDUFUgb3ZlcmhlYWQpIGVuYWJsZXMgaW5jcmVtZW50YWwgY2x1c3RlciBleHBhbnNpb24uCi1Ib3dldmVyLCBtb3JlIHRva2VucyBsZWFkcyB0byBzaGFyaW5nIGRhdGEgd2l0aCBtb3JlIHBlZXJzLCBhbmQgcmVzdWx0cyBpbiBkZWNyZWFzZWQgYXZhaWxhYmlsaXR5LgotVGhlc2UgdHdvIGZhY3RvcnMgbXVzdCBiZSBiYWxhbmNlZCBiYXNlZCBvbiBhIGNsdXN0ZXIncyBjaGFyYWN0ZXJpc3RpYyByZWFkcyBhbmQgd3JpdGVzLgotVG8gbGVhcm4gbW9yZSwKLWh0dHBzOi8vZ2l0aHViLmNvbS9qb2x5bmNoL3B5dGhvbl9wZXJmb3JtYW5jZV90b29sa2l0L3Jhdy9tYXN0ZXIvbm90ZWJvb2tzL2Nhc3NhbmRyYV9hdmFpbGFiaWxpdHkvd2hpdGVwYXBlci9jYXNzYW5kcmEtYXZhaWxhYmlsaXR5LXZpcnR1YWwucGRmW0Nhc3NhbmRyYSBBdmFpbGFiaWxpdHkgaW4gVmlydHVhbCBOb2RlcywgSm9zZXBoIEx5bmNoIGFuZCBKb3NoIFNueWRlcl0gaXMgcmVjb21tZW5kZWQgcmVhZGluZy4KLQotQ2hhbmdlIHRoZSBudW1iZXIgb2YgdG9rZW5zIHVzaW5nIHRoZSBzZXR0aW5nIGluIHRoZSBgY2Fzc2FuZHJhLnlhbWxgIGZpbGU6Ci0KLWBudW1fdG9rZW5zOiAxNmAKLQotSGVyZSBhcmUgdGhlIG1vc3QgY29tbW9uIHRva2VuIGNvdW50cyB3aXRoIGEgYnJpZWYgZXhwbGFuYXRpb24gb2Ygd2hlbgotYW5kIHdoeSB5b3Ugd291bGQgdXNlIGVhY2ggb25lLgotCi1bd2lkdGg9IjEwMCUiLGNvbHM9IjEzJSw4NyUiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfFRva2VuIENvdW50IHxEZXNjcmlwdGlvbgotfDEgfE1heGltdW0gYXZhaWxhYmxpbGl0eSwgbWF4aW11bSBjbHVzdGVyIHNpemUsIGZld2VzdCBwZWVycywgYnV0Ci1pbmZsZXhpYmxlIGV4cGFuc2lvbi4gTXVzdCBhbHdheXMgZG91YmxlIHNpemUgb2YgY2x1c3RlciB0byBleHBhbmQgYW5kCi1yZW1haW4gYmFsYW5jZWQuCi0KLXw0IHxBIGhlYWx0aHkgbWl4IG9mIGVsYXN0aWNpdHkgYW5kIGF2YWlsYWJpbGl0eS4gUmVjb21tZW5kZWQgZm9yCi1jbHVzdGVycyB3aGljaCB3aWxsIGV2ZW50dWFsbHkgcmVhY2ggb3ZlciAzMCBub2Rlcy4gUmVxdWlyZXMgYWRkaW5nCi1hcHByb3hpbWF0ZWx5IDIwJSBtb3JlIG5vZGVzIHRvIHJlbWFpbiBiYWxhbmNlZC4gU2hyaW5raW5nIGEgY2x1c3RlciBtYXkKLXJlc3VsdCBpbiBjbHVzdGVyIGltYmFsYW5jZS4KLQotfDggfCBVc2luZyA4IHZub2RlcyBkaXN0cmlidXRlcyB0aGUgd29ya2xvYWQgYmV0d2VlbiBzeXN0ZW1zIHdpdGggYSB+MTAlIHZhcmlhbmNlCi1hbmQgaGFzIG1pbmltYWwgaW1wYWN0IG9uIHBlcmZvcm1hbmNlLgotCi18MTYgfEJlc3QgZm9yIGhlYXZpbHkgZWxhc3RpYyBjbHVzdGVycyB3aGljaCBleHBhbmQgYW5kIHNocmluawotcmVndWxhcmx5LCBidXQgbWF5IGhhdmUgaXNzdWVzIGF2YWlsYWJpbGl0eSB3aXRoIGxhcmdlciBjbHVzdGVycy4gTm90Ci1yZWNvbW1lbmRlZCBmb3IgY2x1c3RlcnMgb3ZlciA1MCBub2Rlcy4KLXw9PT0KLQotSW4gYWRkaXRpb24gdG8gc2V0dGluZyB0aGUgdG9rZW4gY291bnQsIGl0J3MgZXh0cmVtZWx5IGltcG9ydGFudCB0aGF0Ci1gYWxsb2NhdGVfdG9rZW5zX2Zvcl9sb2NhbF9yZXBsaWNhdGlvbl9mYWN0b3JgIGluIGBjYXNzYW5kcmEueWFtbGAgaXMgc2V0IHRvIGFuCi1hcHByb3ByaWF0ZSBudW1iZXIgb2YgcmVwbGljYXRlcywgdG8gZW5zdXJlIGV2ZW4gdG9rZW4gYWxsb2NhdGlvbi4KLQotPT0gUmVhZCBhaGVhZAotCi1SZWFkIGFoZWFkIGlzIGFuIG9wZXJhdGluZyBzeXN0ZW0gZmVhdHVyZSB0aGF0IGF0dGVtcHRzIHRvIGtlZXAgYXMgbXVjaAotZGF0YSBhcyBwb3NzaWJsZSBsb2FkZWQgaW4gdGhlIHBhZ2UgY2FjaGUuCi1TcGlubmluZyBkaXNrcyBjYW4gaGF2ZSBsb25nIHNlZWsgdGltZXMgY2F1c2luZyBoaWdoIGxhdGVuY3ksIHNvIGFkZGl0aW9uYWwKLXRocm91Z2hwdXQgb24gcmVhZHMgdXNpbmcgcGFnZSBjYWNoZSBjYW4gaW1wcm92ZSBwZXJmb3JtYW5jZS4KLUJ5IGxldmVyYWdpbmcgcmVhZCBhaGVhZCwgdGhlIE9TIGNhbiBwdWxsIGFkZGl0aW9uYWwgZGF0YSBpbnRvIG1lbW9yeSB3aXRob3V0Ci10aGUgY29zdCBvZiBhZGRpdGlvbmFsIHNlZWtzLgotVGhpcyBtZXRob2Qgd29ya3Mgd2VsbCB3aGVuIHRoZSBhdmFpbGFibGUgUkFNIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUKLWhvdCBkYXRhc2V0LCBidXQgY2FuIGJlIHByb2JsZW1hdGljIHdoZW4gdGhlIHJldmVyc2UgaXMgdHJ1ZSAoZGF0YXNldCA+IFJBTSkuCi1UaGUgbGFyZ2VyIHRoZSBob3QgZGF0YXNldCwgdGhlIGxlc3MgcmVhZCBhaGVhZCBpcyB1c2VmdWwuCi0KLVJlYWQgYWhlYWQgaXMgZGVmaW5pdGVseSBub3QgdXNlZnVsIGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6Ci0KLSogU21hbGwgcGFydGl0aW9ucywgc3VjaCBhcyB0YWJsZXMgd2l0aCBhIHNpbmdsZSBwYXJ0aXRpb24ga2V5Ci0qIFNvbGlkIHN0YXRlIGRyaXZlcyAoU1NEcykKLQotCi1SZWFkIGFoZWFkIGNhbiBhY3R1YWxseSBpbmNyZWFzZSBkaXNrIHVzYWdlLCBhbmQgaW4gc29tZSBjYXNlcyByZXN1bHQgaW4gYXMgbXVjaAotYXMgYSA1eCBsYXRlbmN5IGFuZCB0aHJvdWdocHV0IHBlcmZvcm1hbmNlIHBlbmFsdHkuCi1SZWFkLWhlYXZ5LCBrZXkvdmFsdWUgdGFibGVzIHdpdGggc21hbGwgKHVuZGVyIDFLQikgcm93cyBhcmUgZXNwZWNpYWxseSBwcm9uZQotdG8gdGhpcyBwcm9ibGVtLgotCi1UaGUgcmVjb21tZW5kZWQgcmVhZCBhaGVhZCBzZXR0aW5ncyBhcmU6Ci0KLVt3aWR0aD0iNTklIixjb2xzPSI0MCUsNjAlIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxIYXJkd2FyZSB8SW5pdGlhbCBSZWNvbW1lbmRhdGlvbgotfFNwaW5uaW5nIERpc2tzIHw2NEtCCi18U1NEIHw0S0IKLXw9PT0KLQotUmVhZCBhaGVhZCBjYW4gYmUgYWRqdXN0ZWQgb24gTGludXggc3lzdGVtcyB1c2luZyB0aGUgYGJsb2NrZGV2YCB0b29sLgotCi1Gb3IgZXhhbXBsZSwgc2V0IHRoZSByZWFkIGFoZWFkIG9mIHRoZSBkaXNrIGAvZGV2L3NkYTFcYCB0byA0S0I6Ci0KLVtzb3VyY2UsIHNoZWxsXQotLS0tLQotJCBibG9ja2RldiAtLXNldHJhIDggL2Rldi9zZGExCi0tLS0tCi1bTk9URV0KLT09PT0KLVRoZSBgYmxvY2tkZXZgIHNldHRpbmcgc2V0cyB0aGUgbnVtYmVyIG9mIDUxMiBieXRlIHNlY3RvcnMgdG8gcmVhZCBhaGVhZC4KLVRoZSBhcmd1bWVudCBvZiA4IGFib3ZlIGlzIGVxdWl2YWxlbnQgdG8gNEtCLCBvciA4ICogNTEyIGJ5dGVzLgotPT09PQotCi1BbGwgc3lzdGVtcyBhcmUgZGlmZmVyZW50LCBzbyB1c2UgdGhlc2UgcmVjb21tZW5kYXRpb25zIGFzIGEgc3RhcnRpbmcgcG9pbnQgYW5kCi10dW5lLCBiYXNlZCBvbiB5b3VyIFNMQSBhbmQgdGhyb3VnaHB1dCByZXF1aXJlbWVudHMuCi1UbyB1bmRlcnN0YW5kIGhvdyByZWFkIGFoZWFkIGltcGFjdHMgZGlzayByZXNvdXJjZSB1c2FnZSwgd2UgcmVjb21tZW5kIGNhcmVmdWxseQotcmVhZGluZyB0aHJvdWdoIHRoZSB4cmVmOnRyb3VibGVzaG9vdGluZy91c2VfdG9vbHMuYWRvY1tEaXZpbmcgRGVlcCwgdXNpbmcgZXh0ZXJuYWwgdG9vbHNdCi1zZWN0aW9uLgotCi09PSBDb21wcmVzc2lvbgotCi1Db21wcmVzc2VkIGRhdGEgaXMgc3RvcmVkIGJ5IGNvbXByZXNzaW5nIGZpeGVkIHNpemUgYnl0ZSBidWZmZXJzIGFuZCB3cml0aW5nIHRoZQotZGF0YSB0byBkaXNrLgotVGhlIGJ1ZmZlciBzaXplIGlzIGRldGVybWluZWQgYnkgdGhlIGBjaHVua19sZW5ndGhfaW5fa2JgIGVsZW1lbnQgaW4gdGhlIGNvbXByZXNzaW9uCi1tYXAgb2YgYSB0YWJsZSdzIHNjaGVtYSBzZXR0aW5ncyBmb3IgYFdJVEggQ09NUFJFU1NJT05gLgotVGhlIGRlZmF1bHQgc2V0dGluZyBpcyAxNktCIHN0YXJ0aW5nIHdpdGggQ2Fzc2FuZHJhIHs0MF92ZXJzaW9ufS4KLQotU2luY2UgdGhlIGVudGlyZSBjb21wcmVzc2VkIGJ1ZmZlciBtdXN0IGJlIHJlYWQgb2ZmLWRpc2ssIHVzaW5nIGEgY29tcHJlc3Npb24KLWNodW5rIGxlbmd0aCB0aGF0IGlzIHRvbyBsYXJnZSBjYW4gbGVhZCB0byBzaWduaWZpY2FudCBvdmVyaGVhZCB3aGVuIHJlYWRpbmcgc21hbGwgcmVjb3Jkcy4KLUNvbWJpbmVkIHdpdGggdGhlIGRlZmF1bHQgcmVhZCBhaGVhZCBzZXR0aW5nLCB0aGUgcmVzdWx0IGNhbiBiZSBtYXNzaXZlCi1yZWFkIGFtcGxpZmljYXRpb24gZm9yIGNlcnRhaW4gd29ya2xvYWRzLiBUaGVyZWZvcmUsIHBpY2tpbmcgYW4gYXBwcm9wcmlhdGUKLXZhbHVlIGZvciB0aGlzIHNldHRpbmcgaXMgaW1wb3J0YW50LgotCi1MWjRDb21wcmVzc29yIGlzIHRoZSBkZWZhdWx0IGFuZCByZWNvbW1lbmRlZCBjb21wcmVzc2lvbiBhbGdvcml0aG0uCi1JZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGNvbXByZXNzaW9uLCByZWFkCi1odHRwczovL3RoZWxhc3RwaWNrbGUuY29tL2Jsb2cvMjAxOC8wOC8wOC9jb21wcmVzc2lvbl9wZXJmb3JtYW5jZS5odG1sW1RoZSBMYXN0IFBpY2tsZSBibG9ncG9zdCBvbiBjb21wcmVzc2lvbiBwZXJmb3JtYW5jZV0uCi0KLT09IENvbXBhY3Rpb24KLQotVGhlcmUgYXJlIGRpZmZlcmVudCB4cmVmOmNvbXBhY3Rpb24vaW5kZXguYWRvY1tjb21wYWN0aW9uXSBzdHJhdGVnaWVzIGF2YWlsYWJsZQotZm9yIGRpZmZlcmVudCB3b3JrbG9hZHMuCi1XZSByZWNvbW1lbmQgcmVhZGluZyBhYm91dCB0aGUgZGlmZmVyZW50IHN0cmF0ZWdpZXMgdG8gdW5kZXJzdGFuZCB3aGljaCBpcyB0aGUKLWJlc3QgZm9yIHlvdXIgZW52aXJvbm1lbnQuCi1EaWZmZXJlbnQgdGFibGVzIG1heSwgYW5kIGZyZXF1ZW50bHkgZG8gdXNlIGRpZmZlcmVudCBjb21wYWN0aW9uIHN0cmF0ZWdpZXMgaW4KLXRoZSBzYW1lIGNsdXN0ZXIuCi0KLT09IEVuY3J5cHRpb24KLQotSXQgaXMgc2lnbmlmaWNhbnRseSBiZXR0ZXIgdG8gc2V0IHVwIHBlZXItdG8tcGVlciBlbmNyeXB0aW9uIGFuZCBjbGllbnQgc2VydmVyCi1lbmNyeXB0aW9uIHdoZW4gc2V0dGluZyB1cCB5b3VyIHByb2R1Y3Rpb24gY2x1c3Rlci4KLVNldHRpbmcgaXQgdXAgYWZ0ZXIgdGhlIGNsdXN0ZXIgaXMgc2VydmluZyBwcm9kdWN0aW9uIHRyYWZmaWMgaXMgY2hhbGxlbmdpbmcKLXRvIGRvIGNvcnJlY3RseS4KLUlmIHlvdSBldmVyIHBsYW4gdG8gdXNlIG5ldHdvcmsgZW5jcnlwdGlvbiBvZiBhbnkgdHlwZSwgd2UgcmVjb21tZW5kIHNldHRpbmcgaXQKLXVwIHdoZW4gaW5pdGlhbGx5IGNvbmZpZ3VyaW5nIHlvdXIgY2x1c3Rlci4KLUNoYW5naW5nIHRoZXNlIGNvbmZpZ3VyYXRpb25zIGxhdGVyIGlzIG5vdCBpbXBvc3NpYmxlLCBidXQgbWlzdGFrZXMgY2FuCi1yZXN1bHQgaW4gZG93bnRpbWUgb3IgZGF0YSBsb3NzLgotCi09PSBFbnN1cmUga2V5c3BhY2VzIGFyZSBjcmVhdGVkIHdpdGggTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3kKLQotUHJvZHVjdGlvbiBjbHVzdGVycyBzaG91bGQgbmV2ZXIgdXNlIGBTaW1wbGVTdHJhdGVneWAuCi1Qcm9kdWN0aW9uIGtleXNwYWNlcyBzaG91bGQgdXNlIHRoZSBgTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3lgIChOVFMpLgotRm9yIGV4YW1wbGU6Ci0KLVtzb3VyY2UsIGNxbF0KLS0tLS0KLUNSRUFURSBLRVlTUEFDRSBteWtleXNwYWNlIFdJVEggcmVwbGljYXRpb24gPSAgICAgewotICAgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywKLSAgICdkYXRhY2VudGVyMSc6IDMKLX07Ci0tLS0tCi0KLUNhc3NhbmRyYSBjbHVzdGVycyBpbml0aWFsaXplZCB3aXRoIGBOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneWAgY2FuIHRha2UgYWR2YW50YWdlCi1vZiB0aGUgYWJpbGl0eSB0byBjb25maWd1cmUgbXVsdGlwbGUgcmFja3MgYW5kIGRhdGEgY2VudGVycy4KLQotPT0gQ29uZmlndXJlIHJhY2tzIGFuZCBzbml0Y2gKLQotKipDb3JyZWN0bHkgY29uZmlndXJpbmcgb3IgY2hhbmdpbmcgcmFja3MgYWZ0ZXIgYSBjbHVzdGVyIGhhcyBiZWVuIHByb3Zpc2lvbmVkIGlzIGFuIHVuc3VwcG9ydGVkIHByb2Nlc3MqKi4KLU1pZ3JhdGluZyBmcm9tIGEgc2luZ2xlIHJhY2sgdG8gbXVsdGlwbGUgcmFja3MgaXMgYWxzbyB1bnN1cHBvcnRlZCBhbmQgY2FuCi1yZXN1bHQgaW4gZGF0YSBsb3NzLgotVXNpbmcgYEdvc3NpcGluZ1Byb3BlcnR5RmlsZVNuaXRjaGAgaXMgdGhlIG1vc3QgZmxleGlibGUgc29sdXRpb24gZm9yIG9uCi1wcmVtaXNlIG9yIG1peGVkIGNsb3VkIGVudmlyb25tZW50cy4KLWBFYzJTbml0Y2hgIGlzIHJlbGlhYmxlIGZvciBBV1MgRUMyIG9ubHkgZW52aXJvbm1lbnRzLgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmdfc3RhcnRlZC9xdWVyeWluZy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmdfc3RhcnRlZC9xdWVyeWluZy5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGIzNDhhLi4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nX3N0YXJ0ZWQvcXVlcnlpbmcuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLT0gSW5zZXJ0aW5nIGFuZCBxdWVyeWluZwotCi1UaGUgQVBJIGZvciBDYXNzYW5kcmEgaXMgeHJlZjpjcWwvZGRsLmFkb2NbYENRTGAsIHRoZSBDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2VdLiBUbwotdXNlIENRTCwgeW91IHdpbGwgbmVlZCB0byBjb25uZWN0IHRvIHRoZSBjbHVzdGVyLCB1c2luZyBlaXRoZXI6Ci0KLSogYGNxbHNoYCwgYSBzaGVsbCBmb3IgQ1FMCi0qIGEgY2xpZW50IGRyaXZlciBmb3IgQ2Fzc2FuZHJhCi0qIGZvciB0aGUgYWR2ZW50dXJvdXMsIGNoZWNrIG91dCBodHRwczovL3plcHBlbGluLmFwYWNoZS5vcmcvZG9jcy8wLjcuMC9pbnRlcnByZXRlci9jYXNzYW5kcmEuaHRtbFtBcGFjaGUgWmVwcGVsaW5dLCBhIG5vdGVib29rLXN0eWxlIHRvb2wKLQotPT0gQ1FMU0gKLQotYGNxbHNoYCBpcyBhIGNvbW1hbmQtbGluZSBzaGVsbCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBDYXNzYW5kcmEgdXNpbmcKLUNRTC4gSXQgaXMgc2hpcHBlZCB3aXRoIGV2ZXJ5IENhc3NhbmRyYSBwYWNrYWdlLCBhbmQgY2FuIGJlIGZvdW5kIGluIHRoZQotYGJpbmAgZGlyZWN0b3J5IGFsb25nc2lkZSB0aGUgYGNhc3NhbmRyYWAgZXhlY3V0YWJsZS4gSXQgY29ubmVjdHMgdG8gdGhlCi1zaW5nbGUgbm9kZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0KLVtzb3VyY2UsIHNoZWxsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2NxbHNoX2xvY2FsaG9zdC5zaFtdCi0tLS0tCi1bc291cmNlLCBjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvY3Fsc2hfbG9jYWxob3N0LnJlc3VsdFtdCi0tLS0tCi1JZiB0aGUgY29tbWFuZCBpcyB1c2VkIHdpdGhvdXQgc3BlY2lmeWluZyBhIG5vZGUsIGBsb2NhbGhvc3RgIGlzIHRoZSBkZWZhdWx0LiBTZWUgdGhlIHhyZWY6dG9vbHMvY3Fsc2guYWRvY1tgY3Fsc2hgIHNlY3Rpb25dIGZvciBmdWxsIGRvY3VtZW50YXRpb24uCi0KLT09IENsaWVudCBkcml2ZXJzCi0KLUEgbG90IG9mIHhyZWY6Z2V0dGluZ19zdGFydGVkL2RyaXZlcnMuYWRvY1tjbGllbnQgZHJpdmVyc10gYXJlIHByb3ZpZGVkIGJ5IHRoZSBDb21tdW5pdHkgYW5kIGEgbGlzdCBvZgota25vd24gZHJpdmVycyBpcyBwcm92aWRlZC4gWW91IHNob3VsZCByZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBvZiBlYWNoIGRyaXZlcgotZm9yIG1vcmUgaW5mb3JtYXRpb24uCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZ19zdGFydGVkL3F1aWNrc3RhcnQuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nX3N0YXJ0ZWQvcXVpY2tzdGFydC5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWI1NWE2Li4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nX3N0YXJ0ZWQvcXVpY2tzdGFydC5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLT0gQXBhY2hlIENhc3NhbmRyYSBRdWlja3N0YXJ0Ci06dGFiczoKLQotX0ludGVyZXN0ZWQgaW4gZ2V0dGluZyBzdGFydGVkIHdpdGggQ2Fzc2FuZHJhPyBGb2xsb3cgdGhlc2UgaW5zdHJ1Y3Rpb25zLl8KLQotKlNURVAgMTogR0VUIENBU1NBTkRSQSBVU0lORyBET0NLRVIqCi0KLVlvdSdsbCBuZWVkIHRvIGhhdmUgRG9ja2VyIERlc2t0b3AgZm9yIE1hYywgRG9ja2VyIERlc2t0b3AgZm9yIFdpbmRvd3MsIG9yCi1zaW1pbGFyIHNvZnR3YXJlIGluc3RhbGxlZCBvbiB5b3VyIGNvbXB1dGVyLgotCi1bc291cmNlLCBwbGFpbnRleHRdCi0tLS0tCi1kb2NrZXIgcHVsbCBjYXNzYW5kcmE6bGF0ZXN0Ci0tLS0tCi0KLUFwYWNoZSBDYXNzYW5kcmEgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBodHRwczovL2Nhc3NhbmRyYS5hcGFjaGUub3JnL2Rvd25sb2FkL1t0YXJiYWxsIG9yIHBhY2thZ2UgZG93bmxvYWRdLgotCi0qU1RFUCAyOiBTVEFSVCBDQVNTQU5EUkEqCi0KLVtzb3VyY2UsIHBsYWludGV4dF0KLS0tLS0KLWRvY2tlciBydW4gLS1uYW1lIGNhc3NhbmRyYSBjYXNzYW5kcmEKLS0tLS0KLQotKlNURVAgMzogQ1JFQVRFIEZJTEVTKgotCi1JbiB0aGUgZGlyZWN0b3J5IHdoZXJlIHlvdSBwbGFuIHRvIHJ1biB0aGUgbmV4dCBzdGVwLCBjcmVhdGUgdGhlc2UgdHdvIGZpbGVzCi1zbyB0aGF0IHNvbWUgZGF0YSBjYW4gYmUgYXV0b21hdGljYWxseSBpbnNlcnRlZCBpbiB0aGUgbmV4dCBzdGVwLgotCi1BIF9jcWxzaHJjXyBmaWxlIHdpbGwgbG9nIGludG8gdGhlIENhc3NhbmRyYSBkYXRhYmFzZSB3aXRoIHRoZSBkZWZhdWx0IHN1cGVydXNlcjoKLQotW3NvdXJjZSwgcGxhaW50ZXh0XQotLS0tLQotW2F1dGhlbnRpY2F0aW9uXQotCXVzZXJuYW1lID0gY2Fzc2FuZHJhCi0JcGFzc3dvcmQgPSBjYXNzYW5kcmEKLS0tLS0KLQotQ3JlYXRlIGEgX3NjcmlwdHNfIGRpcmVjdG9yeSBhbmQgY2hhbmdlIHRvIHRoYXQgZGlyZWN0b3J5LgotVGhlIGZvbGxvd2luZyBfZGF0YS5jcWxfIGZpbGUgd2lsbCBjcmVhdGUgYSBrZXlzcGFjZSwgdGhlIGxheWVyIGF0IHdoaWNoIENhc3NhbmRyYQotcmVwbGljYXRlcyBpdHMgZGF0YSwgYSB0YWJsZSB0byBob2xkIHRoZSBkYXRhLCBhbmQgaW5zZXJ0IHNvbWUgZGF0YToKLQotW3NvdXJjZSwgcGxhaW50ZXh0XQotLS0tLQotIyBDcmVhdGUgYSBrZXlzcGFjZQotQ1JFQVRFIEtFWVNQQUNFIElGIE5PVCBFWElTVFMgc3RvcmUgV0lUSCBSRVBMSUNBVElPTiA9IHsgJ2NsYXNzJyA6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InIDogJzEnIH07Ci0KLSMgQ3JlYXRlIGEgdGFibGUKLUNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHN0b3JlLnNob3BwaW5nX2NhcnQgICgKLQl1c2VyaWQgdGV4dCBQUklNQVJZIEtFWSwKLQlpdGVtX2NvdW50IGludCwKLQlsYXN0X3VwZGF0ZV90aW1lc3RhbXAgdGltZXN0YW1wCi0pOwotCi0jIEluc2VydCBzb21lIGRhdGEKLUlOU0VSVCBJTlRPIHN0b3JlLnNob3BwaW5nX2NhcnQKLSh1c2VyaWQsIGl0ZW1fY291bnQsIGxhc3RfdXBkYXRlX3RpbWVzdGFtcCkKLVZBTFVFUyAoJzk4NzYnLCAyLCB0b1RpbWVTdGFtcCh0b0RhdGUobm93KSkpKTsKLUlOU0VSVCBJTlRPIHN0b3JlLnNob3BwaW5nX2NhcnQKLSh1c2VyaWQsIGl0ZW1fY291bnQsIGxhc3RfdXBkYXRlX3RpbWVzdGFtcCkKLVZBTFVFUyAoMTIzNCwgNSwgdG9UaW1lU3RhbXAodG9EYXRlKG5vdykpKSk7Ci0tLS0tCi0KLVlvdSBzaG91bGQgbm93IGhhdmUgYSBfY3Fsc2hyY18gZmlsZSBhbmQgXzxjdXJyZW50ZGlyPi9zY3JpcHRzL2RhdGEuY3FsXyBmaWxlLgotCi0qU1RFUCA0OiBSVU4gQ1FMU0ggVE8gSU5URVJBQ1QqCi0KLUNhc3NhbmRyYSBpcyBhIGRpc3RyaWJ1dGVkIGRhdGFiYXNlIHRoYXQgY2FuIHJlYWQgYW5kIHdyaXRlIGRhdGEgYWNyb3NzIG11bHRpcGxlCi1ub2RlcyB3aXRoICBwZWVyLXRvLXBlZXIgcmVwbGljYXRpb24uIFRoZSBDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UgKENRTCkgaXMKLXNpbWlsYXIgdG8gU1FMIGJ1dCBzdWl0ZWQgZm9yIHRoZSBKT0lObGVzcyBzdHJ1Y3R1cmUgb2YgQ2Fzc2FuZHJhLiBUaGUgQ1FMCi1zaGVsbCwgb3IgYGNxbHNoYCwgaXMgb25lIHRvb2wgdG8gdXNlIGluIGludGVyYWN0aW5nIHdpdGggdGhlIGRhdGFiYXNlLgotCi1bc291cmNlLCBwbGFpbnRleHRdCi0tLS0tCi1kb2NrZXIgcnVuIC0tcm0gLWl0IC12IC88Y3VycmVudGRpcj4vc2NyaXB0czovc2NyaXB0cyAgXAotLXYgLzxjdXJyZW50ZGlyL2NxbHNocmM6Ly5jYXNzYW5kcmEvY3Fsc2hyYyAgXAotLS1lbnYgQ1FMU0hfSE9TVD1ob3N0LmRvY2tlci5pbnRlcm5hbCAtLWVudiBDUUxTSF9QT1JUPTkwNDIgIG51dm8vZG9ja2VyLWNxbHNoCi0tLS0tCi0KLUZvciB0aGlzIHF1aWNrc3RhcnQsIHRoaXMgY3Fsc2ggZG9ja2VyIGltYWdlIGFsc28gbG9hZHMgc29tZSBkYXRhIGF1dG9tYXRpY2FsbHksCi1zbyB5b3UgY2FuIHN0YXJ0IHJ1bm5pbmcgcXVlcmllcy4KLQotKlNURVAgNTogUkVBRCBTT01FIERBVEEqCi0KLVtzb3VyY2UsIHBsYWludGV4dF0KLS0tLS0KLVNFTEVDVCAqIEZST00gc3RvcmUuc2hvcHBpbmdfY2FydDsKLS0tLS0KLQotKlNURVAgNjogV1JJVEUgU09NRSBNT1JFIERBVEEqCi0KLVtzb3VyY2UsIHBsYWludGV4dF0KLS0tLS0KLUlOU0VSVCAodXNlcmlkLCBpdGVtX2NvdW50KSBWQUxVRVMgKDQ1NjcsIDIwKSBJTlRPIHN0b3JlLnNob3BwaW5nX2NhcnQ7Ci0tLS0tCi0KLSpTVEVQIDc6IFRFUk1JTkFURSBDQVNTQU5EUkEqCi0KLVtzb3VyY2UsIHBsYWludGV4dF0KLS0tLS0KLWRvY2tlciBybSBjYXNzYW5kcmEKLS0tLS0KLQotKkNPTkdSQVRVTEFUSU9OUyEqCi0KLUhleSwgdGhhdCB3YXNuJ3Qgc28gaGFyZCwgd2FzIGl0PwotCi1UbyBsZWFybiBtb3JlLCB3ZSBzdWdnZXN0IHRoZSBmb2xsb3dpbmcgbmV4dCBzdGVwczoKLQotKiBSZWFkIHRocm91Z2ggdGhlICpuZWVkIGxpbmsqW092ZXJ2aWV3XSB0byBsZWFybiBtYWluIGNvbmNlcHRzIGFuZCBob3cgQ2Fzc2FuZHJhIHdvcmtzIGF0IGEKLWhpZ2ggbGV2ZWwuCi0qIFRvIHVuZGVyc3RhbmQgQ2Fzc2FuZHJhIGluIG1vcmUgZGV0YWlsLCBoZWFkIG92ZXIgdG8gdGhlCi1odHRwczovL2Nhc3NhbmRyYS5hcGFjaGUub3JnL2RvYy9sYXRlc3QvW0RvY3NdLgotKiBCcm93c2UgdGhyb3VnaCB0aGUgaHR0cHM6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZy9jYXNlLXN0dWRpZXMvW0Nhc2UgU3R1ZGllc10gdG8KLWxlYXJuIGhvdyBvdGhlciB1c2VycyBpbiBvdXIgd29ybGR3aWRlIGNvbW11bml0eSBhcmUgZ2V0dGluZyB2YWx1ZSBvdXQgb2YKLUNhc3NhbmRyYS4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9pbnN0YWxsaW5nL2luc3RhbGxpbmcuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9pbnN0YWxsaW5nL2luc3RhbGxpbmcuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGMzMDg5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2luc3RhbGxpbmcvaW5zdGFsbGluZy5hZG9jCkBAIC0wLDAgKzEsMzQ1IEBACis9IEluc3RhbGxpbmcgQ2Fzc2FuZHJhCis6dGFiczoKKworVGhlc2UgYXJlIHRoZSBpbnN0cnVjdGlvbnMgZm9yIGRlcGxveWluZyB0aGUgc3VwcG9ydGVkIHJlbGVhc2VzIG9mCitBcGFjaGUgQ2Fzc2FuZHJhIG9uIExpbnV4IHNlcnZlcnMuCisKK0Nhc3NhbmRyYSBydW5zIG9uIGEgd2lkZSBhcnJheSBvZiBMaW51eCBkaXN0cmlidXRpb25zIGluY2x1ZGluZyAoYnV0IG5vdAorbGltaXRlZCB0byk6CisKKyogVWJ1bnR1LCBtb3N0IG5vdGFibHkgTFRTIHJlbGVhc2VzIDE2LjA0IHRvIDE4LjA0CisqIENlbnRPUyAmIFJlZEhhdCBFbnRlcnByaXNlIExpbnV4IChSSEVMKSBpbmNsdWRpbmcgNi42IHRvIDcuNworKiBBbWF6b24gTGludXggQU1JcyBpbmNsdWRpbmcgMjAxNi4wOSB0aHJvdWdoIHRvIExpbnV4IDIKKyogRGViaWFuIHZlcnNpb25zIDggJiA5CisqIFNVU0UgRW50ZXJwcmlzZSBMaW51eCAxMgorCitUaGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3Qgb2Ygb3BlcmF0aW5nIHN5c3RlbSBwbGF0Zm9ybXMsIG5vciBpcyBpdAorcHJlc2NyaXB0aXZlLiBIb3dldmVyLCB1c2VycyB3aWxsIGJlIHdlbGwtYWR2aXNlZCB0byBjb25kdWN0IGV4aGF1c3RpdmUKK3Rlc3RzIG9mIHRoZWlyIG93biBwYXJ0aWN1bGFybHkgZm9yIGxlc3MtcG9wdWxhciBkaXN0cmlidXRpb25zIG9mIExpbnV4LgorRGVwbG95aW5nIG9uIG9sZGVyIHZlcnNpb25zIGlzIG5vdCByZWNvbW1lbmRlZCB1bmxlc3MgeW91IGhhdmUgcHJldmlvdXMKK2V4cGVyaWVuY2Ugd2l0aCB0aGUgb2xkZXIgZGlzdHJpYnV0aW9uIGluIGEgcHJvZHVjdGlvbiBlbnZpcm9ubWVudC4KKworPT0gUHJlcmVxdWlzaXRlcworCisqIEluc3RhbGwgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIEphdmEgOCBvciBKYXZhIDExLCBlaXRoZXIgdGhlCitodHRwOi8vd3d3Lm9yYWNsZS5jb20vdGVjaG5ldHdvcmsvamF2YS9qYXZhc2UvZG93bmxvYWRzL2luZGV4Lmh0bWxbT3JhY2xlCitKYXZhIFN0YW5kYXJkIEVkaXRpb24gOF0gLyBodHRwOi8vd3d3Lm9yYWNsZS5jb20vdGVjaG5ldHdvcmsvamF2YS9qYXZhc2UvZG93bmxvYWRzL2luZGV4Lmh0bWxbT3JhY2xlIEphdmEgU3RhbmRhcmQgRWRpdGlvbiAxMSAoTG9uZyBUZXJtIFN1cHBvcnQpXQorb3IgaHR0cDovL29wZW5qZGsuamF2YS5uZXQvW09wZW5KREsgOF0gLyBodHRwOi8vb3Blbmpkay5qYXZhLm5ldC9bT3BlbkpESyAxMV0uIFRvCit2ZXJpZnkgdGhhdCB5b3UgaGF2ZSB0aGUgY29ycmVjdCB2ZXJzaW9uIG9mIGphdmEgaW5zdGFsbGVkLCB0eXBlCitgamF2YSAtdmVyc2lvbmAuCisqICpOT1RFKjogRXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIEphdmEgMTEgd2FzIGFkZGVkIGluIENhc3NhbmRyYSB7NDBfdmVyc2lvbn0KKyhodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS05NjA4W0NBU1NBTkRSQS05NjA4XSkuCitGdWxsIHN1cHBvcnQgaXMgZWZmZWN0aXZlIENhc3NhbmRyYSA0LjAuMiB2ZXJzaW9uIChodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS0xNjg5NFtDQVNTQU5EUkEtMTY4OTRdKQorRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQoraHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEvYmxvYi90cnVuay9ORVdTLnR4dFtORVdTLnR4dF0uCisqIEZvciB1c2luZyBjcWxzaCwgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mCitQeXRob24gMy42KyBvciBQeXRob24gMi43IChzdXBwb3J0IGRlcHJlY2F0ZWQpLiBUbyB2ZXJpZnkKK3RoYXQgeW91IGhhdmUgdGhlIGNvcnJlY3QgdmVyc2lvbiBvZiBQeXRob24gaW5zdGFsbGVkLCB0eXBlCitgcHl0aG9uIC0tdmVyc2lvbmAuCisKKz09IENob29zaW5nIGFuIGluc3RhbGxhdGlvbiBtZXRob2QKKworVGhlcmUgYXJlIHRocmVlIG1ldGhvZHMgb2YgaW5zdGFsbGluZyBDYXNzYW5kcmEgdGhhdCBhcmUgY29tbW9uOgorCisqIERvY2tlciBpbWFnZQorKiBUYXJiYWxsIGJpbmFyeSBmaWxlCisqIFBhY2thZ2UgaW5zdGFsbGF0aW9uIChSUE0sIFlVTSkKKworSWYgeW91IGFyZSBhIGN1cnJlbnQgRG9ja2VyIHVzZXIsIGluc3RhbGxpbmcgYSBEb2NrZXIgaW1hZ2UgaXMgc2ltcGxlLiAKK1lvdSdsbCBuZWVkIHRvIGluc3RhbGwgRG9ja2VyIERlc2t0b3AgZm9yIE1hYywgRG9ja2VyIERlc2t0b3AgZm9yIFdpbmRvd3MsCitvciBoYXZlIGBkb2NrZXJgIGluc3RhbGxlZCBvbiBMaW51eC4gCitQdWxsIHRoZSBhcHByb3ByaWF0ZSBpbWFnZSBhbmQgdGhlbiBzdGFydCBDYXNzYW5kcmEgd2l0aCBhIHJ1biBjb21tYW5kLiAKKworRm9yIG1vc3QgdXNlcnMsIGluc3RhbGxpbmcgdGhlIGJpbmFyeSB0YXJiYWxsIGlzIGFsc28gYSBzaW1wbGUgY2hvaWNlLgorVGhlIHRhcmJhbGwgdW5wYWNrcyBhbGwgaXRzIGNvbnRlbnRzIGludG8gYSBzaW5nbGUgbG9jYXRpb24gd2l0aAorYmluYXJpZXMgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMgbG9jYXRlZCBpbiB0aGVpciBvd24gc3ViZGlyZWN0b3JpZXMuCitUaGUgbW9zdCBvYnZpb3VzIGF0dHJpYnV0ZSBvZiB0aGUgdGFyYmFsbCBpbnN0YWxsYXRpb24gaXMgaXQgZG9lcyBub3QKK3JlcXVpcmUgYHJvb3RgIHBlcm1pc3Npb25zIGFuZCBjYW4gYmUgaW5zdGFsbGVkIG9uIGFueSBMaW51eAorZGlzdHJpYnV0aW9uLgorCitQYWNrYWdlZCBpbnN0YWxsYXRpb25zIHJlcXVpcmUgYHJvb3RgIHBlcm1pc3Npb25zLCBhbmQgYXJlIG1vc3QgYXBwcm9wcmlhdGUgZm9yCitwcm9kdWN0aW9uIGluc3RhbGxzLiAKK0luc3RhbGwgdGhlIFJQTSBidWlsZCBvbiBDZW50T1MgYW5kIFJIRUwtYmFzZWQgZGlzdHJpYnV0aW9ucyBpZiB5b3Ugd2FudCB0byAKK2luc3RhbGwgQ2Fzc2FuZHJhIHVzaW5nIFlVTS4gCitJbnN0YWxsIHRoZSBEZWJpYW4gYnVpbGQgb24gVWJ1bnR1IGFuZCBvdGhlciBEZWJpYW4tYmFzZWQKK2Rpc3RyaWJ1dGlvbnMgaWYgeW91IHdhbnQgdG8gaW5zdGFsbCBDYXNzYW5kcmEgdXNpbmcgQVBULiAKK05vdGUgdGhhdCBib3RoIHRoZSBZVU0gYW5kIEFQVCBtZXRob2RzIHJlcXVpcmVkIGByb290YCBwZXJtaXNzaW9ucyBhbmQgCit3aWxsIGluc3RhbGwgdGhlIGJpbmFyaWVzIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzIGFzIHRoZSBgY2Fzc2FuZHJhYCBPUyB1c2VyLgorCis9PSBJbnN0YWxsaW5nIHRoZSBkb2NrZXIgaW1hZ2UKKworW2FyYWJpYywgc3RhcnQ9MV0KKy4gUHVsbCB0aGUgZG9ja2VyIGltYWdlLiBGb3IgdGhlIGxhdGVzdCBpbWFnZSwgdXNlOgorCitbc291cmNlLCBzaGVsbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQkFTSC9kb2NrZXJfcHVsbC5zaFtdCistLS0tCisKK1RoaXMgYGRvY2tlciBwdWxsYCBjb21tYW5kIHdpbGwgZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgJ0RvY2tlciBPZmZpY2lhbCcKK0FwYWNoZSBDYXNzYW5kcmEgaW1hZ2UgYXZhaWxhYmxlIGZyb20gdGhlIGh0dHBzOi8vaHViLmRvY2tlci5jb20vXy9jYXNzYW5kcmFbRG9ja2VyaHViXS4KKworW2FyYWJpYywgc3RhcnQ9Ml0KKy4gU3RhcnQgQ2Fzc2FuZHJhIHdpdGggYSBgZG9ja2VyIHJ1bmAgY29tbWFuZDoKKworW3NvdXJjZSwgc2hlbGxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvZG9ja2VyX3J1bi5zaFtdCistLS0tCisKK1RoZSBgLS1uYW1lYCBvcHRpb24gd2lsbCBiZSB0aGUgbmFtZSBvZiB0aGUgQ2Fzc2FuZHJhIGNsdXN0ZXIgY3JlYXRlZC4KKworW2FyYWJpYywgc3RhcnQ9M10KKy4gU3RhcnQgdGhlIENRTCBzaGVsbCwgYGNxbHNoYCB0byBpbnRlcmFjdCB3aXRoIHRoZSBDYXNzYW5kcmEgbm9kZSBjcmVhdGVkOgorCitbc291cmNlLCBzaGVsbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQkFTSC9kb2NrZXJfY3Fsc2guc2hbXQorLS0tLQorPT0gSW5zdGFsbGluZyB0aGUgYmluYXJ5IHRhcmJhbGwKKworaW5jbHVkZTo6cGFydGlhbCRqYXZhX3ZlcnNpb24uYWRvY1tdCisKK1thcmFiaWMsIHN0YXJ0PTJdCisuIERvd25sb2FkIHRoZSBiaW5hcnkgdGFyYmFsbCBmcm9tIG9uZSBvZiB0aGUgbWlycm9ycyBvbiB0aGUKK3tjYXNzX3VybH1kb3dubG9hZC9bQXBhY2hlIENhc3NhbmRyYSBEb3dubG9hZF0gc2l0ZS4KK0ZvciBleGFtcGxlLCB0byBkb3dubG9hZCBDYXNzYW5kcmEgezQwX3ZlcnNpb259OgorCitbc291cmNlLHNoZWxsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2N1cmxfaW5zdGFsbC5zaFtdCistLS0tCisKK05PVEU6IFRoZSBtaXJyb3JzIG9ubHkgaG9zdCB0aGUgbGF0ZXN0IHZlcnNpb25zIG9mIGVhY2ggbWFqb3Igc3VwcG9ydGVkCityZWxlYXNlLiBUbyBkb3dubG9hZCBhbiBlYXJsaWVyIHZlcnNpb24gb2YgQ2Fzc2FuZHJhLCB2aXNpdCB0aGUKK2h0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC9jYXNzYW5kcmEvW0FwYWNoZSBBcmNoaXZlc10uCisKK1thcmFiaWMsIHN0YXJ0PTNdCisuIE9QVElPTkFMOiBWZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGUgZG93bmxvYWRlZCB0YXJiYWxsIHVzaW5nIG9uZSBvZgordGhlIG1ldGhvZHMgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaSN2ZXJpZnlbaGVyZV0uIEZvcgorZXhhbXBsZSwgdG8gdmVyaWZ5IHRoZSBoYXNoIG9mIHRoZSBkb3dubG9hZGVkIGZpbGUgdXNpbmcgR1BHOgorCitbe3RhYnN9XQorPT09PQorQ29tbWFuZDo6CisrCistLQorW3NvdXJjZSxzaGVsbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQkFTSC92ZXJpZnlfZ3BnLnNoW10KKy0tLS0KKy0tCisKK1Jlc3VsdDo6CisrCistLQorW3NvdXJjZSxwbGFpbnRleHRdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvdmVyaWZ5X2dwZy5yZXN1bHRbXQorLS0tLQorLS0KKz09PT0KKworQ29tcGFyZSB0aGUgc2lnbmF0dXJlIHdpdGggdGhlIFNIQTI1NiBmaWxlIGZyb20gdGhlIERvd25sb2FkcyBzaXRlOgorCitbe3RhYnN9XQorPT09PQorQ29tbWFuZDo6CisrCistLQorW3NvdXJjZSxzaGVsbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQkFTSC9jdXJsX3ZlcmlmeV9zaGEuc2hbXQorLS0tLQorLS0KKworUmVzdWx0OjoKKysKKy0tCitbc291cmNlLHBsYWludGV4dF0KKy0tLS0KKzI4NzU3ZGRlNTg5ZjcwNDEwZjlhNmE5NWMzOWVlN2U2Y2RlNjM0NDBlMmIwNmI5MWFlNmIyMDA2MTRmYTM2NGQKKy0tLS0KKy0tCis9PT09CisKK1thcmFiaWMsIHN0YXJ0PTRdCisuIFVucGFjayB0aGUgdGFyYmFsbDoKKworW3NvdXJjZSxzaGVsbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQkFTSC90YXJiYWxsLnNoW10KKy0tLS0KKworVGhlIGZpbGVzIHdpbGwgYmUgZXh0cmFjdGVkIHRvIHRoZSBgYXBhY2hlLWNhc3NhbmRyYS00LjAuMC9gIGRpcmVjdG9yeS4KK1RoaXMgaXMgdGhlIHRhcmJhbGwgaW5zdGFsbGF0aW9uIGxvY2F0aW9uLgorCitbYXJhYmljLCBzdGFydD01XQorLiBMb2NhdGVkIGluIHRoZSB0YXJiYWxsIGluc3RhbGxhdGlvbiBsb2NhdGlvbiBhcmUgdGhlIGRpcmVjdG9yaWVzIGZvcgordGhlIHNjcmlwdHMsIGJpbmFyaWVzLCB1dGlsaXRpZXMsIGNvbmZpZ3VyYXRpb24sIGRhdGEgYW5kIGxvZyBmaWxlczoKKworW3NvdXJjZSxwbGFpbnRleHRdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFRFWFQvdGFyYmFsbF9pbnN0YWxsX2RpcnMudHh0W10KKy0tLS0KKzwxPiBsb2NhdGlvbiBvZiB0aGUgY29tbWFuZHMgdG8gcnVuIGNhc3NhbmRyYSwgY3Fsc2gsIG5vZGV0b29sLCBhbmQgU1NUYWJsZSB0b29scworPDI+IGxvY2F0aW9uIG9mIGNhc3NhbmRyYS55YW1sIGFuZCBvdGhlciBjb25maWd1cmF0aW9uIGZpbGVzCis8Mz4gbG9jYXRpb24gb2YgdGhlIGNvbW1pdCBsb2dzLCBoaW50cywgYW5kIFNTVGFibGVzCis8ND4gbG9jYXRpb24gb2Ygc3lzdGVtIGFuZCBkZWJ1ZyBsb2dzCis8NT5sb2NhdGlvbiBvZiBjYXNzYW5kcmEtc3RyZXNzIHRvb2wKKworRm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb25maWd1cmUgeW91ciBpbnN0YWxsYXRpb24sIHNlZQore2Nhc3NfdXJsfWRvYy9sYXRlc3QvZ2V0dGluZy1zdGFydGVkL2NvbmZpZ3VyaW5nLmh0bWxbQ29uZmlndXJpbmcKK0Nhc3NhbmRyYV0uCisKK1thcmFiaWMsIHN0YXJ0PTZdCisuIFN0YXJ0IENhc3NhbmRyYToKKworW3NvdXJjZSxzaGVsbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQkFTSC9zdGFydF90YXJiYWxsLnNoW10KKy0tLS0KKworTk9URTogVGhpcyB3aWxsIHJ1biBDYXNzYW5kcmEgYXMgdGhlIGF1dGhlbnRpY2F0ZWQgTGludXggdXNlci4KKworaW5jbHVkZTo6cGFydGlhbCR0YWlsX3N5c2xvZy5hZG9jW10KK1lvdSBjYW4gbW9uaXRvciB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIHN0YXJ0dXAgd2l0aDoKKworW3t0YWJzfV0KKz09PT0KK0NvbW1hbmQ6OgorKworLS0KK1tzb3VyY2Usc2hlbGxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvdGFpbF9zeXNsb2cuc2hbXQorLS0tLQorLS0KKworUmVzdWx0OjoKKysKKy0tCitDYXNzYW5kcmEgaXMgcmVhZHkgd2hlbiB5b3Ugc2VlIGFuIGVudHJ5IGxpa2UgdGhpcyBpbiB0aGUgYHN5c3RlbS5sb2dgOgorCitbc291cmNlLHBsYWludGV4dF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy90YWlsX3N5c2xvZy5yZXN1bHRbXQorLS0tLQorLS0KKz09PT0KKworaW5jbHVkZTo6cGFydGlhbCRub2RldG9vbF9hbmRfY3Fsc2guYWRvY1tdCisKKz09IEluc3RhbGxpbmcgdGhlIERlYmlhbiBwYWNrYWdlcworCitpbmNsdWRlOjpwYXJ0aWFsJGphdmFfdmVyc2lvbi5hZG9jW10KKworW2FyYWJpYywgc3RhcnQ9Ml0KKy4gQWRkIHRoZSBBcGFjaGUgcmVwb3NpdG9yeSBvZiBDYXNzYW5kcmEgdG8gdGhlIGZpbGUKK2BjYXNzYW5kcmEuc291cmNlcy5saXN0YC4gCitpbmNsdWRlOjpwYXJ0aWFsJHBhY2thZ2VfdmVyc2lvbnMuYWRvY1tdCisKK1tzb3VyY2Usc2hlbGxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvZ2V0X2RlYl9wYWNrYWdlLnNoW10KKy0tLS0KKworW2FyYWJpYywgc3RhcnQ9M10KKy4gQWRkIHRoZSBBcGFjaGUgQ2Fzc2FuZHJhIHJlcG9zaXRvcnkga2V5cyB0byB0aGUgbGlzdCBvZiB0cnVzdGVkIGtleXMKK29uIHRoZSBzZXJ2ZXI6CisKK1t7dGFic31dCis9PT09CitDb21tYW5kOjoKKysKKy0tCitbc291cmNlLHNoZWxsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2FkZF9yZXBvX2tleXMuc2hbXQorLS0tLQorLS0KKworUmVzdWx0OjoKKysKKy0tCitbc291cmNlLHBsYWludGV4dF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9hZGRfcmVwb19rZXlzLnJlc3VsdFtdCistLS0tCistLQorPT09PQorCitbYXJhYmljLCBzdGFydD00XQorLiBVcGRhdGUgdGhlIHBhY2thZ2UgaW5kZXggZnJvbSBzb3VyY2VzOgorCitbc291cmNlLHNoZWxsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2FwdC1nZXRfdXBkYXRlLnNoW10KKy0tLS0KKworW2FyYWJpYywgc3RhcnQ9NV0KKy4gSW5zdGFsbCBDYXNzYW5kcmEgd2l0aCBBUFQ6CisKK1tzb3VyY2Usc2hlbGxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvYXB0LWdldF9jYXNzLnNoW10KKy0tLS0KKworTk9URTogRm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb25maWd1cmUgeW91ciBpbnN0YWxsYXRpb24sIHNlZQore2Nhc3NfdXJsfWRvYy9sYXRlc3QvZ2V0dGluZy1zdGFydGVkL2NvbmZpZ3VyaW5nLmh0bWxbQ29uZmlndXJpbmcKK0Nhc3NhbmRyYV0uCisKK2luY2x1ZGU6OnBhcnRpYWwkdGFpbF9zeXNsb2cuYWRvY1tdCisKK2luY2x1ZGU6OnBhcnRpYWwkbm9kZXRvb2xfYW5kX2NxbHNoX25vYmluLmFkb2NbXQorCis9PSBJbnN0YWxsaW5nIHRoZSBSUE0gcGFja2FnZXMKKworaW5jbHVkZTo6cGFydGlhbCRqYXZhX3ZlcnNpb24uYWRvY1tdCisKK1thcmFiaWMsIHN0YXJ0PTJdCisuIEFkZCB0aGUgQXBhY2hlIHJlcG9zaXRvcnkgb2YgQ2Fzc2FuZHJhIHRvIHRoZSBmaWxlCitgL2V0Yy95dW0ucmVwb3MuZC9jYXNzYW5kcmEucmVwb2AgKGFzIHRoZSBgcm9vdGAgdXNlcikuCitpbmNsdWRlOjpwYXJ0aWFsJHBhY2thZ2VfdmVyc2lvbnMuYWRvY1tdCisgCitbc291cmNlLHBsYWludGV4dF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9hZGRfeXVtX3JlcG8ucmVzdWx0W10KKy0tLS0KKworW2FyYWJpYywgc3RhcnQ9M10KKy4gVXBkYXRlIHRoZSBwYWNrYWdlIGluZGV4IGZyb20gc291cmNlczoKKworW3NvdXJjZSxzaGVsbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQkFTSC95dW1fdXBkYXRlLnNoW10KKy0tLS0KKworW2FyYWJpYywgc3RhcnQ9NF0KKy4gSW5zdGFsbCBDYXNzYW5kcmEgd2l0aCBZVU06CisKK1tzb3VyY2Usc2hlbGxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gveXVtX2Nhc3Muc2hbXQorLS0tLQorCitOT1RFOiBBIG5ldyBMaW51eCB1c2VyIGBjYXNzYW5kcmFgIHdpbGwgZ2V0IGNyZWF0ZWQgYXMgcGFydCBvZiB0aGUKK2luc3RhbGxhdGlvbi4gVGhlIENhc3NhbmRyYSBzZXJ2aWNlIHdpbGwgYWxzbyBiZSBydW4gYXMgdGhpcyB1c2VyLgorCitbYXJhYmljLCBzdGFydD01XQorLiBTdGFydCB0aGUgQ2Fzc2FuZHJhIHNlcnZpY2U6CisKK1tzb3VyY2Usc2hlbGxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gveXVtX3N0YXJ0LnNoW10KKy0tLS0KKworaW5jbHVkZTo6cGFydGlhbCR0YWlsX3N5c2xvZy5hZG9jW10KKworaW5jbHVkZTo6cGFydGlhbCRub2RldG9vbF9hbmRfY3Fsc2hfbm9iaW4uYWRvY1tdCisKKz09IEZ1cnRoZXIgaW5zdGFsbGF0aW9uIGluZm8KKworRm9yIGhlbHAgd2l0aCBpbnN0YWxsYXRpb24gaXNzdWVzLCBzZWUgdGhlCit7Y2Fzc191cmx9ZG9jL2xhdGVzdC90cm91Ymxlc2hvb3RpbmcvaW5kZXguaHRtbFtUcm91Ymxlc2hvb3RpbmddCitzZWN0aW9uLgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3BsdWdpbnMvaW5kZXguYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9pbnRlZ3JhdGluZy9wbHVnaW5zL2luZGV4LmFkb2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9wbHVnaW5zL2luZGV4LmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9pbnRlZ3JhdGluZy9wbHVnaW5zL2luZGV4LmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jb25maWd1cmF0aW9uL2Nhc3NfY2xfYXJjaGl2ZV9maWxlLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvY29uZmlndXJhdGlvbi9jYXNzX2NsX2FyY2hpdmVfZmlsZS5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY29uZmlndXJhdGlvbi9jYXNzX2NsX2FyY2hpdmVfZmlsZS5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvY29uZmlndXJhdGlvbi9jYXNzX2NsX2FyY2hpdmVfZmlsZS5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY29uZmlndXJhdGlvbi9jYXNzX2Vudl9zaF9maWxlLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvY29uZmlndXJhdGlvbi9jYXNzX2Vudl9zaF9maWxlLmFkb2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jb25maWd1cmF0aW9uL2Nhc3NfZW52X3NoX2ZpbGUuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL2NvbmZpZ3VyYXRpb24vY2Fzc19lbnZfc2hfZmlsZS5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY29uZmlndXJhdGlvbi9jYXNzX2p2bV9vcHRpb25zX2ZpbGUuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9jb25maWd1cmF0aW9uL2Nhc3NfanZtX29wdGlvbnNfZmlsZS5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY29uZmlndXJhdGlvbi9jYXNzX2p2bV9vcHRpb25zX2ZpbGUuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL2NvbmZpZ3VyYXRpb24vY2Fzc19qdm1fb3B0aW9uc19maWxlLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9jb25maWd1cmF0aW9uL2Nhc3NfbG9nYmFja194bWxfZmlsZS5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL2NvbmZpZ3VyYXRpb24vY2Fzc19sb2diYWNrX3htbF9maWxlLmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U2NGFlYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9jb25maWd1cmF0aW9uL2Nhc3NfbG9nYmFja194bWxfZmlsZS5hZG9jCkBAIC0wLDAgKzEsMTk3IEBACis9IGxvZ2JhY2sueG1sIGZpbGUKKworVGhlIGBsb2diYWNrLnhtbGAgY29uZmlndXJhdGlvbiBmaWxlIGNhbiBvcHRpb25hbGx5IHNldCBsb2dnaW5nIGxldmVscworZm9yIHRoZSBsb2dzIHdyaXR0ZW4gdG8gYHN5c3RlbS5sb2dgIGFuZCBgZGVidWcubG9nYC4gVGhlIGxvZ2dpbmcgbGV2ZWxzCitjYW4gYWxzbyBiZSBzZXQgdXNpbmcgYG5vZGV0b29sIHNldGxvZ2dpbmdsZXZlbHNgLgorCis9PSBPcHRpb25zCisKKz09PSBgYXBwZW5kZXIgbmFtZT0iPGFwcGVuZGVyX2Nob2ljZT4iLi4uPC9hcHBlbmRlcj5gIAorCitTcGVjaWZ5IGxvZyB0eXBlIGFuZCBzZXR0aW5ncy4gUG9zc2libGUgYXBwZW5kZXIgbmFtZXMgYXJlOiBgU1lTVEVNTE9HYCwKK2BERUJVR0xPR2AsIGBBU1lOQ0RFQlVHTE9HYCwgYW5kIGBTVERPVVRgLiBgU1lTVEVNTE9HYCBlbnN1cmVzIHRoYXQgV0FSTgorYW5kIEVSUk9SIG1lc3NhZ2UgYXJlIHdyaXR0ZW4gc3luY2hyb25vdXNseSB0byB0aGUgc3BlY2lmaWVkIGZpbGUuCitgREVCVUdMT0dgIGFuZCBgQVNZTkNERUJVR0xPR2AgZW5zdXJlIHRoYXQgREVCVUcgbWVzc2FnZXMgYXJlIHdyaXR0ZW4KK2VpdGhlciBzeW5jaHJvbm91c2x5IG9yIGFzeW5jaHJvbm91c2x5LCByZXNwZWN0aXZlbHksIHRvIHRoZSBzcGVjaWZpZWQKK2ZpbGUuIGBTVERPVVRgIHdyaXRlcyBhbGwgbWVzc2FnZXMgdG8gdGhlIGNvbnNvbGUgaW4gYSBodW1hbi1yZWFkYWJsZQorZm9ybWF0LgorCisqRXhhbXBsZToqIDxhcHBlbmRlciBuYW1lPSJTWVNURU1MT0ciCitjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLlJvbGxpbmdGaWxlQXBwZW5kZXIiPgorCis9PT0gYDxmaWxlPiA8ZmlsZW5hbWU+IDwvZmlsZT5gIAorCitTcGVjaWZ5IHRoZSBmaWxlbmFtZSBmb3IgYSBsb2cuCisKKypFeGFtcGxlOiogPGZpbGU+JFx7Y2Fzc2FuZHJhLmxvZ2Rpcn0vc3lzdGVtLmxvZzwvZmlsZT4KKworPT09IGA8bGV2ZWw+IDxsb2dfbGV2ZWw+IDwvbGV2ZWw+YAorCitTcGVjaWZ5IHRoZSBsZXZlbCBmb3IgYSBsb2cuIFBhcnQgb2YgdGhlIGZpbHRlci4gTGV2ZWxzIGFyZTogYEFMTGAsCitgVFJBQ0VgLCBgREVCVUdgLCBgSU5GT2AsIGBXQVJOYCwgYEVSUk9SYCwgYE9GRmAuIGBUUkFDRWAgY3JlYXRlcyB0aGUKK21vc3QgdmVyYm9zZSBsb2csIGBFUlJPUmAgdGhlIGxlYXN0LgorCitbTk9URV0KKy5Ob3RlCis9PT09CitOb3RlOiBJbmNyZWFzaW5nIGxvZ2dpbmcgbGV2ZWxzIGNhbiBnZW5lcmF0ZSBoZWF2eSBsb2dnaW5nIG91dHB1dCBvbgorYSBtb2RlcmF0ZWx5IHRyYWZmaWNrZWQgY2x1c3Rlci4gWW91IGNhbiB1c2UgdGhlCitgbm9kZXRvb2wgZ2V0bG9nZ2luZ2xldmVsc2AgY29tbWFuZCB0byBzZWUgdGhlIGN1cnJlbnQgbG9nZ2luZworY29uZmlndXJhdGlvbi4KKz09PT0KKworKkRlZmF1bHQ6KiBJTkZPCisKKypFeGFtcGxlOiogPGxldmVsPklORk88L2xldmVsPgorCis9PT0gYDxyb2xsaW5nUG9saWN5IGNsYXNzPSI8cm9sbGluZ19wb2xpY3lfY2hvaWNlPiIgPGZpbGVOYW1lUGF0dGVybj48cGF0dGVybl9pbmZvPjwvZmlsZU5hbWVQYXR0ZXJuPiAuLi4gPC9yb2xsaW5nUG9saWN5PmAKKworU3BlY2lmeSB0aGUgcG9saWN5IGZvciByb2xsaW5nIGxvZ3Mgb3ZlciB0byBhbiBhcmNoaXZlLgorCisqRXhhbXBsZToqIDxyb2xsaW5nUG9saWN5CitjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLlNpemVBbmRUaW1lQmFzZWRSb2xsaW5nUG9saWN5Ij4KKworPT09IGA8ZmlsZU5hbWVQYXR0ZXJuPiA8cGF0dGVybl9pbmZvPiA8L2ZpbGVOYW1lUGF0dGVybj5gCisKK1NwZWNpZnkgdGhlIHBhdHRlcm4gaW5mb3JtYXRpb24gZm9yIHJvbGxpbmcgb3ZlciB0aGUgbG9nIHRvIGFyY2hpdmUuCitQYXJ0IG9mIHRoZSByb2xsaW5nIHBvbGljeS4KKworKkV4YW1wbGU6KgorPGZpbGVOYW1lUGF0dGVybj4kXHtjYXNzYW5kcmEubG9nZGlyfS9zeXN0ZW0ubG9nLiVkXHt5eXl5LU1NLWRkfS4laS56aXA8L2ZpbGVOYW1lUGF0dGVybj4KKworPT09IGA8bWF4RmlsZVNpemU+IDxzaXplPiA8L21heEZpbGVTaXplPmAKKworU3BlY2lmeSB0aGUgbWF4aW11bSBmaWxlIHNpemUgdG8gdHJpZ2dlciByb2xsaW5nIGEgbG9nLiBQYXJ0IG9mIHRoZQorcm9sbGluZyBwb2xpY3kuCisKKypFeGFtcGxlOiogPG1heEZpbGVTaXplPjUwTUI8L21heEZpbGVTaXplPgorCis9PT0gYDxtYXhIaXN0b3J5PiA8bnVtYmVyX29mX2RheXM+IDwvbWF4SGlzdG9yeT5gCisKK1NwZWNpZnkgdGhlIG1heGltdW0gaGlzdG9yeSBpbiBkYXlzIHRvIHRyaWdnZXIgcm9sbGluZyBhIGxvZy4gUGFydCBvZgordGhlIHJvbGxpbmcgcG9saWN5LgorCisqRXhhbXBsZToqIDxtYXhIaXN0b3J5Pjc8L21heEhpc3Rvcnk+CisKKz09PSBgPGVuY29kZXI+IDxwYXR0ZXJuPi4uLjwvcGF0dGVybj4gPC9lbmNvZGVyPmAKKworU3BlY2lmeSB0aGUgZm9ybWF0IG9mIHRoZSBtZXNzYWdlLiBQYXJ0IG9mIHRoZSByb2xsaW5nIHBvbGljeS4KKworKkV4YW1wbGU6KiA8bWF4SGlzdG9yeT43PC9tYXhIaXN0b3J5PiAqRXhhbXBsZToqIDxlbmNvZGVyPgorPHBhdHRlcm4+JS01bGV2ZWwgWyV0aHJlYWRdICVkYXRlXHtJU084NjAxfSAlRjolTCAtICVtc2clbjwvcGF0dGVybj4KKzwvZW5jb2Rlcj4KKworPT09IExvZ2dpbmcgdG8gQ2Fzc2FuZHJhIHZpcnR1YWwgdGFibGUKKworSXQgaXMgcG9zc2libGUgdG8gY29uZmlndXJlIGxvZ2JhY2sueG1sIGluIHN1Y2ggYSB3YXkgdGhhdCBsb2dzIHdvdWxkIGFwcGVhciBpbiBgc3lzdGVtX3ZpZXdzLnN5c3RlbV9sb2dgIHRhYmxlLgorVGhpcyBpcyBhY2hpZXZlZCBieSBhcHBlbmRlciBpbXBsZW1lbnRlZCBpbiBjbGFzcyBgVmlydHVhbFRhYmxlQXBwZW5kZXJgIHdoaWNoIGlzIGNhbGxlZCBgQ1FMTE9HYCBpbiB0aGUKK2RlZmF1bHQgY29uZmlncmF0aW9uLiBXaGVuIHRoZSBhcHBlbmRlciBpcyBjb21tZW50ZWQgb3V0LCBubyBzeXN0ZW0gbG9ncyBhcmUgd3JpdHRlbiB0byB0aGUgdmlydHVhbCB0YWJsZS4KKworQ1FMTE9HIGFwcGVuZGVyIGlzIHNwZWNpYWwgYXMgdGhlIHVuZGVybHlpbmcgc3RydWN0dXJlIGl0IHNhdmVzIGxvZyBtZXNzYWdlcyBpbnRvIGNhbiBub3QgZ3JvdyB3aXRob3V0IGFueSBib3VuZAorYXMgYSBub2RlIHdvdWxkIHJ1biBvdXQgb2YgbWVtb3J5LiBGb3IgdGhpcyByZWFzb24sIGBzeXN0ZW1fbG9nYCB0YWJsZSBpcyBsaW1pdGVkIG9uIGl0cyBzaXplLgorQnkgZGVmYXVsdCwgaXQgY2FuIGhvbGQgYXQgbW9zdCA1MCAwMDAgbG9nIG1lc3NhZ2VzLCBpdCBjYW4gbmV2ZXIgaG9sZCBtb3JlIHRoYW4gMTAwIDAwMCBsb2cgbWVzc2FnZXMuCisKK1RvIHNwZWNpZnkgaG93IG1hbnkgcm93cyB5b3Ugd2FudCB0aGF0IHZpcnR1YWwgdGFibGUgdG8gaG9sZCBhdCBtb3N0LCB0aGVyZSBpcworYSBzeXN0ZW0gcHJvcGVydHkgY2FsbGVkIGBjYXNzYW5kcmEudmlydHVhbC5sb2dzLm1heC5yb3dzYCB3aGljaCB0YWtlcyBhbiBpbnRlZ2VyIGFzIHZhbHVlLgorCitZb3UgY2FuIGV4ZWN1dGUgQ1FMIGB0cnVuY2F0ZWAgcXVlcnkgZm9yIGBzeXN0ZW1fdmlld3Muc3lzdGVtX2xvZ2AgaWYgeW91IHdhbnQgdG8gd2lwZSBvdXQgYWxsIHRoZSBsb2dzIGluIHZpcnR1YWwgdGFibGUKK3RvIGUuZy4gc2F2ZSBzb21lIG1lbW9yeS4KKworSXQgaXMgcmVjb21tZW5kZWQgdG8gc2V0IGZpbHRlciB0byBhdCBsZWFzdCBgV0FSTmAgbGV2ZWwgc28gdGhpcyB0YWJsZSBob2xkcyBvbmx5IGltcG9ydGFudCBsb2dnaW5nIG1lc3NhZ2VzIGFzCitlYWNoIG1lc3NhZ2Ugd2lsbCBvY2N1cHkgbWVtb3J5LgorCitUaGUgYXBwZW5kZXIgdG8gdmlydHVhbCB0YWJsZSBpcyBjb21tZW50ZWQgb3V0IGJ5IGRlZmF1bHQgc28gbG9nZ2luZyB0byB2aXJ0dWFsIHRhYmxlIGlzIG5vdCBhY3RpdmUuCisKKz09PSBDb250ZW50cyBvZiBkZWZhdWx0IGBsb2diYWNrLnhtbGAKKworW3NvdXJjZSxYTUxdCistLS0tCis8Y29uZmlndXJhdGlvbiBzY2FuPSJ0cnVlIiBzY2FuUGVyaW9kPSI2MCBzZWNvbmRzIj4KKyAgPGpteENvbmZpZ3VyYXRvciAvPgorCisgIDwhLS0gTm8gc2h1dGRvd24gaG9vazsgd2UgcnVuIGl0IG91cnNlbHZlcyBpbiBTdG9yYWdlU2VydmljZSBhZnRlciBzaHV0ZG93biAtLT4KKworICA8IS0tIFNZU1RFTUxPRyByb2xsaW5nIGZpbGUgYXBwZW5kZXIgdG8gc3lzdGVtLmxvZyAoSU5GTyBsZXZlbCkgLS0+CisKKyAgPGFwcGVuZGVyIG5hbWU9IlNZU1RFTUxPRyIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5Sb2xsaW5nRmlsZUFwcGVuZGVyIj4KKyAgICA8ZmlsdGVyIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLmZpbHRlci5UaHJlc2hvbGRGaWx0ZXIiPgorICA8bGV2ZWw+SU5GTzwvbGV2ZWw+CisgICAgPC9maWx0ZXI+CisgICAgPGZpbGU+JHtjYXNzYW5kcmEubG9nZGlyfS9zeXN0ZW0ubG9nPC9maWxlPgorICAgIDxyb2xsaW5nUG9saWN5IGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLnJvbGxpbmcuU2l6ZUFuZFRpbWVCYXNlZFJvbGxpbmdQb2xpY3kiPgorICAgICAgPCEtLSByb2xsb3ZlciBkYWlseSAtLT4KKyAgICAgIDxmaWxlTmFtZVBhdHRlcm4+JHtjYXNzYW5kcmEubG9nZGlyfS9zeXN0ZW0ubG9nLiVke3l5eXktTU0tZGR9LiVpLnppcDwvZmlsZU5hbWVQYXR0ZXJuPgorICAgICAgPCEtLSBlYWNoIGZpbGUgc2hvdWxkIGJlIGF0IG1vc3QgNTBNQiwga2VlcCA3IGRheXMgd29ydGggb2YgaGlzdG9yeSwgYnV0IGF0IG1vc3QgNUdCIC0tPgorICAgICAgPG1heEZpbGVTaXplPjUwTUI8L21heEZpbGVTaXplPgorICAgICAgPG1heEhpc3Rvcnk+NzwvbWF4SGlzdG9yeT4KKyAgICAgIDx0b3RhbFNpemVDYXA+NUdCPC90b3RhbFNpemVDYXA+CisgICAgPC9yb2xsaW5nUG9saWN5PgorICAgIDxlbmNvZGVyPgorICAgICAgPHBhdHRlcm4+JS01bGV2ZWwgWyV0aHJlYWRdICVkYXRle0lTTzg2MDF9ICVGOiVMIC0gJW1zZyVuPC9wYXR0ZXJuPgorICAgIDwvZW5jb2Rlcj4KKyAgPC9hcHBlbmRlcj4KKworICA8IS0tIERFQlVHTE9HIHJvbGxpbmcgZmlsZSBhcHBlbmRlciB0byBkZWJ1Zy5sb2cgKGFsbCBsZXZlbHMpIC0tPgorCisgIDxhcHBlbmRlciBuYW1lPSJERUJVR0xPRyIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5Sb2xsaW5nRmlsZUFwcGVuZGVyIj4KKyAgICA8ZmlsZT4ke2Nhc3NhbmRyYS5sb2dkaXJ9L2RlYnVnLmxvZzwvZmlsZT4KKyAgICA8cm9sbGluZ1BvbGljeSBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLlNpemVBbmRUaW1lQmFzZWRSb2xsaW5nUG9saWN5Ij4KKyAgICAgIDwhLS0gcm9sbG92ZXIgZGFpbHkgLS0+CisgICAgICA8ZmlsZU5hbWVQYXR0ZXJuPiR7Y2Fzc2FuZHJhLmxvZ2Rpcn0vZGVidWcubG9nLiVke3l5eXktTU0tZGR9LiVpLnppcDwvZmlsZU5hbWVQYXR0ZXJuPgorICAgICAgPCEtLSBlYWNoIGZpbGUgc2hvdWxkIGJlIGF0IG1vc3QgNTBNQiwga2VlcCA3IGRheXMgd29ydGggb2YgaGlzdG9yeSwgYnV0IGF0IG1vc3QgNUdCIC0tPgorICAgICAgPG1heEZpbGVTaXplPjUwTUI8L21heEZpbGVTaXplPgorICAgICAgPG1heEhpc3Rvcnk+NzwvbWF4SGlzdG9yeT4KKyAgICAgIDx0b3RhbFNpemVDYXA+NUdCPC90b3RhbFNpemVDYXA+CisgICAgPC9yb2xsaW5nUG9saWN5PgorICAgIDxlbmNvZGVyPgorICAgICAgPHBhdHRlcm4+JS01bGV2ZWwgWyV0aHJlYWRdICVkYXRle0lTTzg2MDF9ICVGOiVMIC0gJW1zZyVuPC9wYXR0ZXJuPgorICAgIDwvZW5jb2Rlcj4KKyAgPC9hcHBlbmRlcj4KKworICA8IS0tIEFTWU5DTE9HIGFzc3luY2hyb25vdXMgYXBwZW5kZXIgdG8gZGVidWcubG9nIChhbGwgbGV2ZWxzKSAtLT4KKworICA8YXBwZW5kZXIgbmFtZT0iQVNZTkNERUJVR0xPRyIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNsYXNzaWMuQXN5bmNBcHBlbmRlciI+CisgICAgPHF1ZXVlU2l6ZT4xMDI0PC9xdWV1ZVNpemU+CisgICAgPGRpc2NhcmRpbmdUaHJlc2hvbGQ+MDwvZGlzY2FyZGluZ1RocmVzaG9sZD4KKyAgICA8aW5jbHVkZUNhbGxlckRhdGE+dHJ1ZTwvaW5jbHVkZUNhbGxlckRhdGE+CisgICAgPGFwcGVuZGVyLXJlZiByZWY9IkRFQlVHTE9HIiAvPgorICA8L2FwcGVuZGVyPgorCisgIDwhLS0gU1RET1VUIGNvbnNvbGUgYXBwZW5kZXIgdG8gc3Rkb3V0IChJTkZPIGxldmVsKSAtLT4KKworICA8YXBwZW5kZXIgbmFtZT0iU1RET1VUIiBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5Db25zb2xlQXBwZW5kZXIiPgorICAgIDxmaWx0ZXIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNsYXNzaWMuZmlsdGVyLlRocmVzaG9sZEZpbHRlciI+CisgICAgICA8bGV2ZWw+SU5GTzwvbGV2ZWw+CisgICAgPC9maWx0ZXI+CisgICAgPGVuY29kZXI+CisgICAgICA8cGF0dGVybj4lLTVsZXZlbCBbJXRocmVhZF0gJWRhdGV7SVNPODYwMX0gJUY6JUwgLSAlbXNnJW48L3BhdHRlcm4+CisgICAgPC9lbmNvZGVyPgorICA8L2FwcGVuZGVyPgorCisgIDwhLS0gVW5jb21tZW50IGJlbGxvdyBhbmQgY29ycmVzcG9uZGluZyBhcHBlbmRlci1yZWYgdG8gYWN0aXZhdGUgbG9nYmFjayBtZXRyaWNzCisgIDxhcHBlbmRlciBuYW1lPSJMb2diYWNrTWV0cmljcyIgY2xhc3M9ImNvbS5jb2RhaGFsZS5tZXRyaWNzLmxvZ2JhY2suSW5zdHJ1bWVudGVkQXBwZW5kZXIiIC8+CisgICAtLT4KKworICA8IS0tIFVuY29tbWVudCBiZWxvdyBjb25maWd1cmF0aW9uIGFuZCBjb3JyZXNwb25kaW5nIGFwcGVuZGVyLXJlZiB0byBhY3RpdmF0ZQorICBsb2dnaW5nIGludG8gc3lzdGVtX3ZpZXdzLnN5c3RlbV9sb2dzIHZpcnR1YWwgdGFibGUuIC0tPgorICA8IS0tIDxhcHBlbmRlciBuYW1lPSJDUUxMT0ciIGNsYXNzPSJvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5sb2dnaW5nLlZpcnR1YWxUYWJsZUFwcGVuZGVyIj4KKyAgICA8ZmlsdGVyIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLmZpbHRlci5UaHJlc2hvbGRGaWx0ZXIiPgorICAgICAgPGxldmVsPldBUk48L2xldmVsPgorICAgIDwvZmlsdGVyPgorICA8L2FwcGVuZGVyPiAtLT4KKworICA8cm9vdCBsZXZlbD0iSU5GTyI+CisgICAgPGFwcGVuZGVyLXJlZiByZWY9IlNZU1RFTUxPRyIgLz4KKyAgICA8YXBwZW5kZXItcmVmIHJlZj0iU1RET1VUIiAvPgorICAgIDxhcHBlbmRlci1yZWYgcmVmPSJBU1lOQ0RFQlVHTE9HIiAvPiA8IS0tIENvbW1lbnQgdGhpcyBsaW5lIHRvIGRpc2FibGUgZGVidWcubG9nIC0tPgorICAgIDwhLS0KKyAgICA8YXBwZW5kZXItcmVmIHJlZj0iTG9nYmFja01ldHJpY3MiIC8+CisgICAgLS0+CisgICAgPCEtLQorICAgIDxhcHBlbmRlci1yZWYgcmVmPSJDUUxMT0ciLz4KKyAgICAtLT4KKyAgPC9yb290PgorCisgIDxsb2dnZXIgbmFtZT0ib3JnLmFwYWNoZS5jYXNzYW5kcmEiIGxldmVsPSJERUJVRyIvPgorPC9jb25maWd1cmF0aW9uPgorLS0tLQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NvbmZpZ3VyYXRpb24vY2Fzc19yYWNrZGNfZmlsZS5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL2NvbmZpZ3VyYXRpb24vY2Fzc19yYWNrZGNfZmlsZS5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY29uZmlndXJhdGlvbi9jYXNzX3JhY2tkY19maWxlLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9jb25maWd1cmF0aW9uL2Nhc3NfcmFja2RjX2ZpbGUuYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NvbmZpZ3VyYXRpb24vY2Fzc190b3BvX2ZpbGUuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9jb25maWd1cmF0aW9uL2Nhc3NfdG9wb19maWxlLmFkb2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jb25maWd1cmF0aW9uL2Nhc3NfdG9wb19maWxlLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9jb25maWd1cmF0aW9uL2Nhc3NfdG9wb19maWxlLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jb25maWd1cmF0aW9uL2NvbmZpZ3VyYXRpb24uYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9jb25maWd1cmF0aW9uL2NvbmZpZ3VyYXRpb24uYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvY29uZmlndXJhdGlvbi9jb25maWd1cmF0aW9uLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jb25maWd1cmF0aW9uL2luZGV4LmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvY29uZmlndXJhdGlvbi9pbmRleC5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY29uZmlndXJhdGlvbi9pbmRleC5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvY29uZmlndXJhdGlvbi9pbmRleC5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL2F1ZGl0X2xvZ2dpbmcuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvYXVkaXRfbG9nZ2luZy5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL2F1ZGl0X2xvZ2dpbmcuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9hdWRpdF9sb2dnaW5nLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvYXVkaXRsb2dnaW5nLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL2F1ZGl0bG9nZ2luZy5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4M2M1YWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL2F1ZGl0bG9nZ2luZy5hZG9jCkBAIC0wLDAgKzEsNTQ5IEBACis9IEF1ZGl0IExvZ2dpbmcKKworQXVkaXQgTG9nZ2luZyBpcyBhIG5ldyBmZWF0dXJlIGluIEFwYWNoZSBDYXNzYW5kcmEgNC4wIChodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS0xMjE1MVtDQVNTQU5EUkEtMTIxNTFdKS4KK1RoaXMgbmV3IGZlYXR1cmUgaXMgc2FmZSBmb3IgcHJvZHVjdGlvbiB1c2UsIHdpdGggY29uZmlndXJhYmxlIGxpbWl0cyB0byBoZWFwIG1lbW9yeSBhbmQgZGlzayBzcGFjZSB0byBwcmV2ZW50IG91dC1vZi1tZW1vcnkgZXJyb3JzLgorQWxsIGRhdGFiYXNlIGFjdGl2aXR5IGlzIGxvZ2dlZCBwZXItbm9kZSBhcyBmaWxlLWJhc2VkIHJlY29yZHMgdG8gYSBzcGVjaWZpZWQgbG9jYWwgZmlsZXN5c3RlbSBkaXJlY3RvcnkuIAorVGhlIGF1ZGl0IGxvZyBmaWxlcyBhcmUgcm9sbGVkIHBlcmlvZGljYWxseSBiYXNlZCBvbiBhIGNvbmZpZ3VyYWJsZSB2YWx1ZS4gCisKK1NvbWUgb2YgdGhlIGZlYXR1cmVzIG9mIGF1ZGl0IGxvZ2dpbmcgYXJlOgorCisqIE5vIGFkZGl0aW9uYWwgZGF0YWJhc2UgY2FwYWNpdHkgaXMgbmVlZGVkIHRvIHN0b3JlIGF1ZGl0IGxvZ3MuCisqIE5vIHF1ZXJ5IHRvb2wgaXMgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIGF1ZGl0IGxvZ3MuCisqIExhdGVuY3kgb2YgZGF0YWJhc2Ugb3BlcmF0aW9ucyBpcyBub3QgYWZmZWN0ZWQsIHNvIHRoZXJlIGlzIG5vIHBlcmZvcm1hbmNlIGltcGFjdC4KKyogSGVhcCBtZW1vcnkgdXNhZ2UgaXMgYm91bmRlZCBieSBhIHdlaWdodGVkIHF1ZXVlLCB3aXRoIGNvbmZpZ3VyYWJsZSBtYXhpbXVtIHdlaWdodCBzaXR0aW5nIGluIGZyb250IG9mIGxvZ2dpbmcgdGhyZWFkLgorKiBEaXNrIHV0aWxpemF0aW9uIGlzIGJvdW5kZWQgYnkgYSBjb25maWd1cmFibGUgc2l6ZSwgZGVsZXRpbmcgb2xkIGxvZyBzZWdtZW50cyBvbmNlIHRoZSBsaW1pdCBpcyByZWFjaGVkLgorKiBDYW4gYmUgZW5hYmxlZCBvciBkaXNhYmxlZCBhdCBzdGFydHVwIHRpbWUgdXNpbmcgYGNhc3NhbmRyYS55YW1sYCBvciBhdCBydW50aW1lIHVzaW5nIHRoZSBKTVggdG9vbCwgYGBub2RldG9vbGBgLgorKiBDYW4gY29uZmlndXJlIHRoZSBzZXR0aW5ncyBpbiBlaXRoZXIgdGhlIGBjYXNzYW5kcmEueWFtbGAgZmlsZSBvciBieSB1c2luZyBgYG5vZGV0b29sYGAuCisKK0F1ZGl0IGxvZ2dpbmcgaW5jbHVkZXMgYWxsIENRTCByZXF1ZXN0cywgYm90aCBzdWNjZXNzZnVsIGFuZCBmYWlsZWQuIAorSXQgYWxzbyBjYXB0dXJlcyBhbGwgc3VjY2Vzc2Z1bCBhbmQgZmFpbGVkIGF1dGhlbnRpY2F0aW9uIGFuZCBhdXRob3JpemF0aW9uIGV2ZW50cywgc3VjaCBhcyBsb2dpbiBhdHRlbXB0cy4gCitUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIEZ1bGwgUXVlcnkgTG9nZ2luZyAoRlFMKSBhbmQgYXVkaXQgbG9nZ2luZyBpcyB0aGF0IEZRTCBjYXB0dXJlcyBvbmx5IHN1Y2Nlc3NmdWwgQ1FMIHJlcXVlc3RzLCB3aGljaCBhbGxvdyByZXBsYXkgb3IgY29tcGFyaXNvbiBvZiBsb2dzLgorQXVkaXQgbG9ncyBhcmUgdXNlZnVsIGZvciBjb21wbGlhbmNlIGFuZCBkZWJ1Z2dpbmcsIHdoaWxlIEZRTCBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZywgcGVyZm9ybWFuY2UgYmVuY2htYXJraW5nLCB0ZXN0aW5nIGFuZCBhdWRpdGluZyBDUUwgcXVlcmllcy4KKworPT0gQXVkaXQgaW5mb3JtYXRpb24gbG9nZ2VkCisKK1RoZSBhdWRpdCBsb2cgY29udGFpbnM6CisKKyogYWxsIGV2ZW50cyBpbiB0aGUgY29uZmlndXJlZCBrZXlzcGFjZXMgdG8gaW5jbHVkZQorKiBhbGwgZXZlbnRzIGluIHRoZSBjb25maWd1cmVkIGNhdGVnb3JpZXMgdG8gaW5jbHVkZQorKiBhbGwgZXZlbnRzIGV4ZWN1dGVkIGJ5IHRoZSBjb25maWd1cmVkIHVzZXJzIHRvIGluY2x1ZGUKKworVGhlIGF1ZGl0IGxvZyBkb2VzIG5vdCBjb250YWluOgorCisqIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBtYWRlIGluIGBjYXNzYW5kcmEueWFtbGAgZmlsZQorKiBgbm9kZXRvb2xgIGNvbW1hbmRzCisqIFBhc3N3b3JkcyBtZW50aW9uZWQgYXMgcGFydCBvZiBEQ0wgc3RhdGVtZW50czogUGFzc3dvcmRzIHdpbGwgYmUgb2JmdXNjYXRlZCBhcyBcKlwqXCpcKlwqXCpcKi4KKyAqKiBTdGF0ZW1lbnRzIHRoYXQgZmFpbCB0byBwYXJzZSB3aWxsIGhhdmUgZXZlcnl0aGluZyBhZnRlciB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgd29yZCBwYXNzd29yZCBvYmZ1c2NhdGVkIGFzIFwqXCpcKlwqXCpcKlwqLgorICoqIFN0YXRlbWVudHMgd2l0aCBhIG1pc3R5cGVkIHdvcmQgJ3Bhc3N3b3JkJyB3aWxsIGJlIGxvZ2dlZCB3aXRob3V0IG9iZnVzY2F0aW9uLiBQbGVhc2UgbWFrZSBzdXJlIHRvIHVzZSBhIGRpZmZlcmVudCBwYXNzd29yZCBvbiByZXRyaWVzLgorCitUaGUgYXVkaXQgbG9nIGlzIGEgc2VyaWVzIG9mIGxvZyBlbnRyaWVzLiAKK0FuIGF1ZGl0IGxvZyBlbnRyeSBjb250YWluczoKKworKiBrZXlzcGFjZSAoU3RyaW5nKSAtIEtleXNwYWNlIG9uIHdoaWNoIHJlcXVlc3QgaXMgbWFkZQorKiBvcGVyYXRpb24gKFN0cmluZykgLSBEYXRhYmFzZSBvcGVyYXRpb24gc3VjaCBhcyBDUUwgY29tbWFuZAorKiB1c2VyIChTdHJpbmcpIC0gVXNlciBuYW1lCisqIHNjb3BlIChTdHJpbmcpIC0gU2NvcGUgb2YgcmVxdWVzdCBzdWNoIGFzIFRhYmxlL0Z1bmN0aW9uL0FnZ3JlZ2F0ZSBuYW1lCisqIHR5cGUgKEF1ZGl0TG9nRW50cnlUeXBlKSAtIFR5cGUgb2YgcmVxdWVzdAorKiogQ1FMIEF1ZGl0IExvZyBFbnRyeSBUeXBlCisqKiBDb21tb24gQXVkaXQgTG9nIEVudHJ5IFR5cGUKKyogc291cmNlIChJbmV0QWRkcmVzc0FuZFBvcnQpIC0gU291cmNlIElQIEFkZHJlc3MgZnJvbSB3aGljaCByZXF1ZXN0IG9yaWdpbmF0ZWQKKyogdGltZXN0YW1wIChsb25nICkgLSBUaW1lc3RhbXAgb2YgdGhlIHJlcXVlc3QKKyogYmF0Y2ggKFVVSUQpIC0gQmF0Y2ggb2YgcmVxdWVzdAorKiBvcHRpb25zIChRdWVyeU9wdGlvbnMpIC0gQ1FMIFF1ZXJ5IG9wdGlvbnMKKyogc3RhdGUgKFF1ZXJ5U3RhdGUpIC0gU3RhdGUgcmVsYXRlZCB0byBhIGdpdmVuIHF1ZXJ5CisKK0VhY2ggZW50cnkgY29udGFpbnMgYWxsIGFwcGxpY2FibGUgYXR0cmlidXRlcyBmb3IgdGhlIGdpdmVuIGV2ZW50LCBjb25jYXRlbmF0ZWQgd2l0aCBhIHBpcGUgKHwpLgorCitDUUwgYXVkaXQgbG9nIGVudHJ5IHR5cGVzIGFyZSB0aGUgZm9sbG93aW5nIENRTCBjb21tYW5kcy4gRWFjaCBjb21tYW5kIGlzIGFzc2lnbmVkIHRvIGEgcGFydGljdWxhciBzcGVjaWZpZWQgY2F0ZWdvcnkgdG8gbG9nOgorCitbd2lkdGg9IjEwMCUiLGNvbHM9IjIwJSw4MCUiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfCBDYXRlZ29yeSB8IENRTCBjb21tYW5kcworCit8IERETCB8IEFMVEVSX0tFWVNQQUNFLCBDUkVBVEVfS0VZU1BBQ0UsIERST1BfS0VZU1BBQ0UsIAorQUxURVJfVEFCTEUsIENSRUFURV9UQUJMRSwgRFJPUF9UQUJMRSwgCitDUkVBVEVfRlVOQ1RJT04sIERST1BfRlVOQ1RJT04sIAorQ1JFQVRFX0FHR1JFR0FURSwgRFJPUF9BR0dSRUdBVEUsIAorQ1JFQVRFX0lOREVYLCBEUk9QX0lOREVYLCAKK0FMVEVSX1RZUEUsIENSRUFURV9UWVBFLCBEUk9QX1RZUEUsCitDUkVBVEVfVFJJR0dFUiwgRFJPUF9UUklHR0VSLAorQUxURVJfVklFVywgQ1JFQVRFX1ZJRVcsIERST1BfVklFVywKK1RSVU5DQVRFCit8IERNTCB8IEJBVENILCBERUxFVEUsIFVQREFURQorfCBEQ0wgfCBHUkFOVCwgUkVWT0tFLCAKK0FMVEVSX1JPTEUsIENSRUFURV9ST0xFLCBEUk9QX1JPTEUsIAorTElTVF9ST0xFUywgTElTVF9QRVJNSVNTSU9OUywgTElTVF9VU0VSUworfCBPVEhFUiB8IFVTRV9LRVlTUEFDRQorfCBRVUVSWSB8IFNFTEVDVAorfCBQUkVQQVJFIHwgUFJFUEFSRV9TVEFURU1FTlQKK3w9PT0KKworQ29tbW9uIGF1ZGl0IGxvZyBlbnRyeSB0eXBlcyBhcmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKK1t3aWR0aD0iMTAwJSIsY29scz0iNTAlLDUwJSIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8IENhdGVnb3J5IHwgQ1FMIGNvbW1hbmRzCisKK3wgQVVUSCB8IExPR0lOX1NVQ0NFU1MsIExPR0lOX0VSUk9SLCBVTkFVVEhPUklaRURfQVRURU1QVAorfCBFUlJPUiB8IFJFUVVFU1RfRkFJTFVSRQorfD09PQorCis9PSBBdmFpbGFiaWxpdHkgYW5kIGR1cmFiaWxpdHkKKworTk9URTogVW5saWtlIGRhdGEsIGF1ZGl0IGxvZyBlbnRyaWVzIGFyZSBub3QgcmVwbGljYXRlZAorCitGb3IgYSBnaXZlbiBxdWVyeSwgdGhlIGNvcnJlc3BvbmRpbmcgYXVkaXQgZW50cnkgaXMgb25seSBzdG9yZWQgb24gdGhlIGNvb3JkaW5hdG9yIG5vZGUuCitGb3IgZXhhbXBsZSwgYW4gYGBJTlNFUlRgYCBpbiBhIGtleXNwYWNlIHdpdGggcmVwbGljYXRpb24gZmFjdG9yIG9mIDMgd2lsbCBwcm9kdWNlIGFuIGF1ZGl0IGVudHJ5IG9uIG9uZSBub2RlLCB0aGUgY29vcmRpbmF0b3Igd2hvIGhhbmRsZWQgdGhlIHJlcXVlc3QsIGFuZCBub3Qgb24gdGhlIHR3byBvdGhlciBub2Rlcy4KK0ZvciB0aGlzIHJlYXNvbiwgYW5kIGRlcGVuZGluZyBvbiBjb21wbGlhbmNlIHJlcXVpcmVtZW50cyB5b3UgbXVzdCBtZWV0LAorbWFrZSBzdXJlIHRoYXQgYXVkaXQgbG9ncyBhcmUgc3RvcmVkIG9uIGEgbm9uLWVwaGVtZXJhbCBzdG9yYWdlLgorCitZb3UgY2FuIGFjaGlldmUgY3VzdG9tIG5lZWRzIHdpdGggdGhlIDw8YXJjaGl2ZV9jb21tYW5kPj4gb3B0aW9uLgorCis9PSBDb25maWd1cmluZyBhdWRpdCBsb2dnaW5nIGluIGNhc3NhbmRyYS55YW1sCisKK1RoZSBgY2Fzc2FuZHJhLnlhbWxgIGZpbGUgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIGFuZCBlbmFibGUgYXVkaXQgbG9nZ2luZy4KK0NvbmZpZ3VyYXRpb24gYW5kIGVuYWJsZW1lbnQgbWF5IGJlIHRoZSBzYW1lIG9yIGRpZmZlcmVudCBvbiBlYWNoIG5vZGUsIGRlcGVuZGluZyBvbiB0aGUgYGNhc3NhbmRyYS55YW1sYCBmaWxlIHNldHRpbmdzLgorCitBdWRpdCBsb2dnaW5nIGNhbiBhbHNvIGJlIGNvbmZpZ3VyZWQgdXNpbmcgYGBub2RldG9vbGBgIHdoZW4gZW5hYmxpbmcgdGhlIGZlYXR1cmUsIGFuZCB3aWxsIG92ZXJyaWRlIGFueSB2YWx1ZXMgc2V0IGluIHRoZSBgY2Fzc2FuZHJhLnlhbWxgIGZpbGUsIGFzIGRpc2N1c3NlZCBpbiA8PGVuYWJsaW5nX2F1ZGl0X3dpdGhfbm9kZXRvb2wsIEVuYWJsaW5nIEF1ZGl0IExvZ2dpbmcgd2l0aCBub2RldG9vbD4+LgorCitBdWRpdCBsb2dzIGFyZSBnZW5lcmF0ZWQgb24gZWFjaCBlbmFibGVkIG5vZGUsIHNvIGxvZ3Mgb24gZWFjaCBub2RlIHdpbGwgaGF2ZSB0aGF0IG5vZGUncyBxdWVyaWVzLgorQWxsIG9wdGlvbnMgZm9yIGF1ZGl0IGxvZ2dpbmcgY2FuIGJlIHNldCBpbiB0aGUgYGNhc3NhbmRyYS55YW1sYCBmaWxlIHVuZGVyIHRoZSBgYGF1ZGl0X2xvZ2dpbmdfb3B0aW9uczpgYC4KKworVGhlIGZpbGUgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBvcHRpb25zIHRoYXQgY2FuIGJlIHVuY29tbWVudGVkIGZvciB1c2U6CisKK1tzb3VyY2UsIHlhbWxdCistLS0tCisjIEF1ZGl0IGxvZ2dpbmcgLSBMb2dzIGV2ZXJ5IGluY29taW5nIENRTCBjb21tYW5kIHJlcXVlc3QsIGF1dGhlbnRpY2F0aW9uIHRvIGEgbm9kZS4gU2VlIHRoZSBkb2NzCisjIG9uIGF1ZGl0X2xvZ2dpbmcgZm9yIGZ1bGwgZGV0YWlscyBhYm91dCB0aGUgdmFyaW91cyBjb25maWd1cmF0aW9uIG9wdGlvbnMuCithdWRpdF9sb2dnaW5nX29wdGlvbnM6CisgICAgZW5hYmxlZDogZmFsc2UKKyAgICBsb2dnZXI6CisgICAgICAtIGNsYXNzX25hbWU6IEJpbkF1ZGl0TG9nZ2VyCisgICAgIyBhdWRpdF9sb2dzX2RpcjoKKyAgICAjIGluY2x1ZGVkX2tleXNwYWNlczoKKyAgICAjIGV4Y2x1ZGVkX2tleXNwYWNlczogc3lzdGVtLCBzeXN0ZW1fc2NoZW1hLCBzeXN0ZW1fdmlydHVhbF9zY2hlbWEKKyAgICAjIGluY2x1ZGVkX2NhdGVnb3JpZXM6CisgICAgIyBleGNsdWRlZF9jYXRlZ29yaWVzOgorICAgICMgaW5jbHVkZWRfdXNlcnM6CisgICAgIyBleGNsdWRlZF91c2VyczoKKyAgICAjIHJvbGxfY3ljbGU6IEhPVVJMWQorICAgICMgYmxvY2s6IHRydWUKKyAgICAjIG1heF9xdWV1ZV93ZWlnaHQ6IDI2ODQzNTQ1NiAjIDI1NiBNaUIKKyAgICAjIG1heF9sb2dfc2l6ZTogMTcxNzk4NjkxODQgIyAxNiBHaUIKKyAgICAjIyBhcmNoaXZlIGNvbW1hbmQgaXMgIi9wYXRoL3RvL3NjcmlwdC5zaCAlcGF0aCIgd2hlcmUgJXBhdGggaXMgcmVwbGFjZWQgd2l0aCB0aGUgZmlsZSBiZWluZyByb2xsZWQ6CisgICAgIyBhcmNoaXZlX2NvbW1hbmQ6CisgICAgIyBtYXhfYXJjaGl2ZV9yZXRyaWVzOiAxMAorLS0tLQorCis9PT0gZW5hYmxlZAorCitDb250cm9sIHdoZXRoZXIgYXVkaXQgbG9nZ2luZyBpcyBlbmFibGVkIG9yIGRpc2FibGVkIChkZWZhdWx0KS4KKworVG8gZW5hYmxlIGF1ZGl0IGxvZ2dpbmcgc2V0IGBgZW5hYmxlZDogdHJ1ZWBgLgorCitJZiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLCBhdWRpdCBsb2dnaW5nIHdpbGwgc3RhcnQgd2hlbiBDYXNzYW5kcmEgaXMgc3RhcnRlZC4KK0l0IGNhbiBiZSBkaXNhYmxlZCBhZnRlcndhcmRzIGF0IHJ1bnRpbWUgd2l0aCA8PGVuYWJsaW5nX2F1ZGl0X3dpdGhfbm9kZXRvb2wsIG5vZGV0b29sPj4uCisKK1RJUDogWW91IGNhbiBtb25pdG9yIHdoZXRoZXIgYXVkaXQgbG9nZ2luZyBpcyBlbmFibGVkIHdpdGggYGBBdWRpdExvZ0VuYWJsZWRgYCBhdHRyaWJ1dGUgb2YgdGhlIEpNWCBNQmVhbiBgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiOnR5cGU9U3RvcmFnZVNlcnZpY2VgYC4KKworPT09IGxvZ2dlcgorCitUaGUgdHlwZSBvZiBhdWRpdCBsb2dnZXIgaXMgc2V0IHdpdGggdGhlIGBsb2dnZXJgIG9wdGlvbi4gCitTdXBwb3J0ZWQgdmFsdWVzIGFyZToKKworLSBgQmluQXVkaXRMb2dnZXJgIChkZWZhdWx0KQorLSBgRmlsZUF1ZGl0TG9nZ2VyYAorLSBgTm9PcEF1ZGl0TG9nZ2VyYAorCitgQmluQXVkaXRMb2dnZXJgIGxvZ3MgZXZlbnRzIHRvIGEgZmlsZSBpbiBiaW5hcnkgZm9ybWF0LgorYEZpbGVBdWRpdExvZ2dlcmAgdXNlcyB0aGUgc3RhbmRhcmQgbG9nZ2luZyBtZWNoYW5pc20sIGBzbGY0amAgdG8gbG9nIGV2ZW50cyB0byB0aGUgYGF1ZGl0L2F1ZGl0LmxvZ2AgZmlsZS4gSXQgaXMgYSBzeW5jaHJvbm91cywgZmlsZS1iYXNlZCBhdWRpdCBsb2dnZXIuIFRoZSByb2xsX2N5Y2xlIHdpbGwgYmUgc2V0IGluIHRoZSBgbG9nYmFjay54bWxgIGZpbGUuCitgTm9PcEF1ZGl0TG9nZ2VyYCBpcyBhIG5vLW9wIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhdWRpdCBsb2dnZXIgdGhhdCBzaG91ZGwgYmUgc3BlY2lmaWVkIHdoZW4gYXVkaXQgbG9nZ2luZyBpcyBkaXNhYmxlZC4KKworRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsIHlhbWxdCistLS0tCitsb2dnZXI6IAorICAtIGNsYXNzX25hbWU6IEZpbGVBdWRpdExvZ2dlcgorLS0tLQorCitUSVA6ICBgQmluQXVkaXRMb2dnZXJgIG1ha2UgdXNlIG9mIG9wZW4gc291cmNlIGh0dHBzOi8vZ2l0aHViLmNvbS9PcGVuSEZUL0Nocm9uaWNsZS1RdWV1ZVtDaHJvbmljbGUgUXVldWVdIHVuZGVyIHRoZSBob29kLiBJZiB5b3UgY29uc2lkZXIgdXNpbmcgYXVkaXQgbG9nZ2luZyBmb3IgcmVndWxhdG9yeSBjb21wbGlhbmNlIHB1cnBvc2UsIGl0IG1pZ2h0IGJlIHdpc2UgdG8gYmUgc29tZXdoYXQgZmFtaWxpYXIgd2l0aCB0aGlzIGxpYnJhcnkuIFNlZSA8PGFyY2hpdmVfY29tbWFuZD4+IGFuZCA8PHJvbGxfY3ljbGU+PiBmb3IgYW4gZXhhbXBsZSBvZiB0aGUgaW1wbGljYXRpb25zLgorCis9PT0gYXVkaXRfbG9nc19kaXIKKworVG8gd3JpdGUgYXVkaXQgbG9ncywgYW4gZXhpc3RpbmcgZGlyZWN0b3J5IG11c3QgYmUgc2V0IGluIGBgYXVkaXRfbG9nc19kaXJgYC4KKworVGhlIGRpcmVjdG9yeSBtdXN0IGhhdmUgYXBwcm9wcmlhdGUgcGVybWlzc2lvbnMgc2V0IHRvIGFsbG93IHJlYWRpbmcsIHdyaXRpbmcsIGFuZCBleGVjdXRpbmcuCitMb2dnaW5nIHdpbGwgcmVjdXJzaXZlbHkgZGVsZXRlIHRoZSBkaXJlY3RvcnkgY29udGVudHMgYXMgbmVlZGVkLgorRG8gbm90IHBsYWNlIGxpbmtzIGluIHRoaXMgZGlyZWN0b3J5IHRvIG90aGVyIHNlY3Rpb25zIG9mIHRoZSBmaWxlc3lzdGVtLgorRm9yIGV4YW1wbGUsIGBgYXVkaXRfbG9nc19kaXI6IC9ub25fZXBoZW1lcmFsX3N0b3JhZ2UvYXVkaXQvbG9ncy9ob3VybHlgYC4KKworVGhlIGF1ZGl0IGxvZyBkaXJlY3RvcnkgY2FuIGFsc28gYmUgY29uZmlndXJlZCB1c2luZyB0aGUgc3lzdGVtIHByb3BlcnR5IGBjYXNzYW5kcmEubG9nZGlyLmF1ZGl0YCwgd2hpY2ggYnkgZGVmYXVsdCBpcyBzZXQgdG8gYGNhc3NhbmRyYS5sb2dkaXIgKyAvYXVkaXQvYC4KKworPT09IGluY2x1ZGVkX2tleXNwYWNlcyBhbmQgZXhjbHVkZWRfa2V5c3BhY2VzCisKK1NldCB0aGUga2V5c3BhY2VzIHRvIGluY2x1ZGUgd2l0aCB0aGUgYGluY2x1ZGVkX2tleXNwYWNlc2Agb3B0aW9uIGFuZAordGhlIGtleXNwYWNlcyB0byBleGNsdWRlIHdpdGggdGhlIGBleGNsdWRlZF9rZXlzcGFjZXNgIG9wdGlvbi4gCitCeSBkZWZhdWx0LCBgc3lzdGVtYCwgYHN5c3RlbV9zY2hlbWFgIGFuZCBgc3lzdGVtX3ZpcnR1YWxfc2NoZW1hYCBhcmUgZXhjbHVkZWQsIGFuZCBhbGwgb3RoZXIga2V5c3BhY2VzIGFyZSBpbmNsdWRlZC4KKworRm9yIGV4YW1wbGU6Citbc291cmNlLCB5YW1sXQorLS0tLQoraW5jbHVkZWRfa2V5c3BhY2VzOiB0ZXN0LCBkZW1vCitleGNsdWRlZF9rZXlzcGFjZXM6IHN5c3RlbSwgc3lzdGVtX3NjaGVtYSwgc3lzdGVtX3ZpcnR1YWxfc2NoZW1hCistLS0tCisKKz09PSBpbmNsdWRlZF9jYXRlZ29yaWVzIGFuZCBleGNsdWRlZF9jYXRlZ29yaWVzCisKK1RoZSBjYXRlZ29yaWVzIG9mIGRhdGFiYXNlIG9wZXJhdGlvbnMgdG8gaW5jbHVkZSBhcmUgc3BlY2lmaWVkIHdpdGggdGhlIGBpbmNsdWRlZF9jYXRlZ29yaWVzYCBvcHRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdC4gCitUaGUgY2F0ZWdvcmllcyBvZiBkYXRhYmFzZSBvcGVyYXRpb25zIHRvIGV4Y2x1ZGUgYXJlIHNwZWNpZmllZCB3aXRoIGBleGNsdWRlZF9jYXRlZ29yaWVzYCBvcHRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdC4gCitUaGUgc3VwcG9ydGVkIGNhdGVnb3JpZXMgZm9yIGF1ZGl0IGxvZyBhcmU6IGBBVVRIYCwgYERDTGAsIGBERExgLCBgRE1MYCwgYEVSUk9SYCwgYE9USEVSYCwgYFBSRVBBUkVgLCBhbmQgYFFVRVJZYC4KK0J5IGRlZmF1bHQsIGFsbCBzdXBwb3J0ZWQgY2F0ZWdvcmllcyBhcmUgaW5jbHVkZWQsIGFuZCBubyBjYXRlZ29yeSBpcyBleGNsdWRlZC4KKworW3NvdXJjZSwgeWFtbF0KKy0tLS0KK2luY2x1ZGVkX2NhdGVnb3JpZXM6IEFVVEgsIEVSUk9SLCBEQ0wKK2V4Y2x1ZGVkX2NhdGVnb3JpZXM6IERETCwgRE1MLCBRVUVSWSwgUFJFUEFSRQorLS0tLQorCis9PT0gaW5jbHVkZWRfdXNlcnMgYW5kIGV4Y2x1ZGVkX3VzZXJzCisKK1VzZXJzIHRvIGF1ZGl0IGxvZyBhcmUgc2V0IHdpdGggdGhlIGBpbmNsdWRlZF91c2Vyc2AgYW5kIGBleGNsdWRlZF91c2Vyc2Agb3B0aW9ucy4gCitUaGUgYGluY2x1ZGVkX3VzZXJzYCBvcHRpb24gc3BlY2lmaWVzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdXNlcnMgdG8gaW5jbHVkZSBleHBsaWNpdGx5LgorVGhlIGBleGNsdWRlZF91c2Vyc2Agb3B0aW9uIHNwZWNpZmllcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHVzZXJzIHRvIGV4Y2x1ZGUgZXhwbGljaXRseS4KK0J5IGRlZmF1bHQsIGFsbCB1c2VycyBhcmUgaW5jbHVkZWQsIGFuZCBubyB1c2VycyBhcmUgZXhjbHVkZWQuCisKK1tzb3VyY2UsIHlhbWxdCistLS0tCitpbmNsdWRlZF91c2VyczogCitleGNsdWRlZF91c2Vyczogam9obiwgbWFyeQorLS0tLQorCitbW3JvbGxfY3ljbGVdXQorPT09IHJvbGxfY3ljbGUKKworVGhlIGBgcm9sbF9jeWNsZWBgIGRlZmluZXMgdGhlIGZyZXF1ZW5jeSB3aXRoIHdoaWNoIHRoZSBhdWRpdCBsb2cgc2VnbWVudHMgYXJlIHJvbGxlZC4KK1N1cHBvcnRlZCB2YWx1ZXMgYXJlOgorCistIGBgTUlOVVRFTFlgYAorLSBgYEZJVkVfTUlOVVRFTFlgYAorLSBgYFRFTl9NSU5VVEVMWWBgCistIGBgVFdFTlRZX01JTlVURUxZYGAKKy0gYGBIQUxGX0hPVVJMWWBgCistIGBgSE9VUkxZYGAgKGRlZmF1bHQpCistIGBgVFdPX0hPVVJMWWBgCistIGBgRk9VUl9IT1VSTFlgYAorLSBgYFNJWF9IT1VSTFlgYAorLSBgYERBSUxZYGAKKworRm9yIGV4YW1wbGU6IGBgcm9sbF9jeWNsZTogREFJTFlgYAorCitXQVJOSU5HOiBSZWFkIHRoZSBmb2xsb3dpbmcgcGFyYWdyYXBoIHdoZW4gY2hhbmdpbmcgYGByb2xsX2N5Y2xlYGAgb24gYSBwcm9kdWN0aW9uIG5vZGUuCisKK1dpdGggdGhlIGBCaW5Mb2dnZXJgIGltcGxlbWVudGF0aW9uLCBhbnkgYXR0ZW1wdCB0byBtb2RpZnkgdGhlIHJvbGwgY3ljbGUgb24gYSBub2RlIHdoZXJlIGF1ZGl0IGxvZ2dpbmcgd2FzIHByZXZpb3VzbHkgZW5hYmxlZCB3aWxsIGZhaWwgc2lsZW50ZWx5IGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vT3BlbkhGVC9DaHJvbmljbGUtUXVldWVbQ2hyb25pY2xlIFF1ZXVlXSByb2xsIGN5Y2xlIGluZmVyZW5jZSBtZWNoYW5pc20gKGV2ZW4gaWYgeW91IGRlbGV0ZSB0aGUgYGBtZXRhZGF0YS5jcTR0YGAgZmlsZSkuCisKK0hlcmUgaXMgYW4gZXhhbXBsZSBvZiBzdWNoIGFuIG92ZXJyaWRlIHZpc2libGUgaW4gQ2Fzc2FuZHJhIGxvZ3M6CistLS0tCitJTkZPICBbbWFpbl0gPERBVEUgVElNRT4gQmluTG9nLmphdmE6NDIwIC0gQXR0ZW1wdGluZyB0byBjb25maWd1cmUgYmluIGxvZzogUGF0aDogL3BhdGgvdG8vYXVkaXQgUm9sbCBjeWNsZTogVFdPX0hPVVJMWSBbLi4uXQorV0FSTiAgW21haW5dIDxEQVRFIFRJTUU+IFNpbmdsZUNocm9uaWNsZVF1ZXVlQnVpbGRlci5qYXZhOjQ3NyAtIE92ZXJyaWRpbmcgcm9sbCBjeWNsZSBmcm9tIFRXT19IT1VSTFkgdG8gRklWRV9NSU5VVEUKKy0tLS0KKworSW4gb3JkZXIgdG8gY2hhbmdlIGBgcm9sbF9jeWNsZWBgIG9uIGEgbm9kZSwgeW91IGhhdmUgdG86CisKKzEuIFN0b3AgQ2Fzc2FuZHJhCisyLiBNb3ZlIG9yIG9mZmxvYWQgYWxsIGF1ZGl0IGxvZ3Mgc29tZXdoZXJlIGVsc2UgKGluIGEgc2FmZSBhbmQgZHVyYWJsZSBsb2NhdGlvbikKKzMuIFJlc3RhcnQgQ2Fzc2FuZHJhLgorNC4gQ2hlY2sgQ2Fzc2FuZHJhIGxvZ3MKKzUuIE1ha2Ugc3VyZSB0aGF0IGF1ZGl0IGxvZyBmaWxlbmFtZXMgdW5kZXIgYGBhdWRpdF9sb2dzX2RpcmBgIGNvcnJlc3BvbmQgdG8gdGhlIG5ldyByb2xsIGN5Y2xlLgorCis9PT0gYmxvY2sKKworVGhlIGBgYmxvY2tgYCBvcHRpb24gc3BlY2lmaWVzIHdoZXRoZXIgYXVkaXQgbG9nZ2luZyBzaG91bGQgYmxvY2sgd3JpdGluZyBvciBkcm9wIGxvZyByZWNvcmRzIGlmIHRoZSBhdWRpdCBsb2dnaW5nIGZhbGxzIGJlaGluZC4gU3VwcG9ydGVkIGJvb2xlYW4gdmFsdWVzIGFyZSBgYHRydWVgYCAoZGVmYXVsdCkgb3IgYGBmYWxzZWBgLgorCitGb3IgZXhhbXBsZTogYGBibG9jazogZmFsc2VgYCB0byBkcm9wIHJlY29yZHMgKGUuZy4gaWYgYXVkaXQgaXMgdXNlZCBmb3IgdHJvb2JsZXNob290aW5nKQorCitGb3IgcmVndWxhdG9yeSBjb21wbGlhbmNlIHB1cnBvc2VzLCBpdCdzIGEgZ29vZCBwcmFjdGljZSB0byBleHBsaWNpdGx5IHNldCBgYGJsb2NrOiB0cnVlYGAgdG8gcHJldmVudCBhbnkgcmVncmVzc2lvbiBpbiBjYXNlIG9mIGZ1dHVyZSBkZWZhdWx0IHZhbHVlIGNoYW5nZS4KKworPT09IG1heF9xdWV1ZV93ZWlnaHQKKworVGhlIGBgbWF4X3F1ZXVlX3dlaWdodGBgIG9wdGlvbiBzZXRzIHRoZSBtYXhpbXVtIHdlaWdodCBvZiBpbi1tZW1vcnkgcXVldWUgZm9yIHJlY29yZHMgd2FpdGluZyB0byBiZSB3cml0dGVuIHRvIHRoZSBmaWxlIGJlZm9yZSBibG9ja2luZyBvciBkcm9wcGluZy4gIFRoZSBvcHRpb24gbXVzdCBiZSBzZXQgdG8gYSBwb3NpdGl2ZSB2YWx1ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMjY4NDM1NDU2LCBvciAyNTYgTWlCLgorCitGb3IgZXhhbXBsZSwgdG8gY2hhbmdlIHRoZSBkZWZhdWx0OiBgYG1heF9xdWV1ZV93ZWlnaHQ6IDEzNDIxNzcyOCAjIDEyOCBNaUJgYAorCis9PT0gbWF4X2xvZ19zaXplCisKK1RoZSBgYG1heF9sb2dfc2l6ZWBgIG9wdGlvbiBzZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHJvbGxlZCBmaWxlcyB0byByZXRhaW4gb24gZGlzayBiZWZvcmUgZGVsZXRpbmcgdGhlIG9sZGVzdCBmaWxlLiAgVGhlIG9wdGlvbiBtdXN0IGJlIHNldCB0byBhIHBvc2l0aXZlIHZhbHVlLiBUaGUgZGVmYXVsdCBpcyAxNzE3OTg2OTE4NCwgb3IgMTYgR2lCLgorRm9yIGV4YW1wbGUsIHRvIGNoYW5nZSB0aGUgZGVmYXVsdDogYGBtYXhfbG9nX3NpemU6IDM0MzU5NzM4MzY4ICMgMzIgR2lCYGAKKworV0FSTklORzogYGBtYXhfbG9nX3NpemVgYCBpcyBpZ25vcmVkIGlmIGBgYXJjaGl2ZV9jb21tYW5kYGAgb3B0aW9uIGlzIHNldC4KKworW1thcmNoaXZlX2NvbW1hbmRdXQorPT09IGFyY2hpdmVfY29tbWFuZAorCitOT1RFOiBJZiBgYGFyY2hpdmVfY29tbWFuZGBgIG9wdGlvbiBpcyBlbXB0eSBvciB1bnNldCAoZGVmYXVsdCksIENhc3NhbmRyYSB1c2VzIGEgYnVpbHQtaW4gRGVsZXRpbmdBcmNoaXZlciB0aGF0IGRlbGV0ZXMgdGhlIG9sZGVzdCBmaWxlcyBpZiBgYG1heF9sb2dfc2l6ZWBgIGlzIHJlYWNoZWQuCisKK1RoZSBgYGFyY2hpdmVfY29tbWFuZGBgIG9wdGlvbiBzZXRzIHRoZSB1c2VyLWRlZmluZWQgYXJjaGl2ZSBzY3JpcHQgdG8gZXhlY3V0ZSBvbiByb2xsZWQgbG9nIGZpbGVzLgorRm9yIGV4YW1wbGU6IGBgYXJjaGl2ZV9jb21tYW5kOiAiL3Vzci9sb2NhbC9iaW4vYXJjaGl2ZWl0LnNoICVwYXRoImBgCisKK2BgJXBhdGhgYCBpcyByZXBsYWNlZCB3aXRoIHRoZSBhYnNvbHV0ZSBmaWxlIHBhdGggb2YgdGhlIGZpbGUgYmVpbmcgcm9sbGVkLgorCitXaGVuIHVzaW5nIGEgdXNlci1kZWZpbmVkIHNjcmlwdCwgQ2Fzc2FuZHJhIGRvZXMgKipub3QqKiB1c2UgdGhlIERlbGV0aW5nQXJjaGl2ZXIsIHNvIGl0J3MgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBzY3JpcHQgdG8gbWFrZSBhbnkgcmVxdWlyZWQgY2xlYW51cC4KKworQ2Fzc2FuZHJhIHdpbGwgY2FsbCB0aGUgdXNlci1kZWZpbmVkIHNjcmlwdCBhcyBzb29uIGFzIHRoZSBsb2cgZmlsZSBpcyByb2xsZWQuIEl0IG1lYW5zIHRoYXQgQ2hyb25pY2xlIFF1ZXVlJ3MgUXVldWVGaWxlU2hyaW5rTWFuYWdlciB3aWxsIG5vdCBiZSBhYmxlIHRvIHNocmluayB0aGUgc3BhcnNlIGxvZyBmaWxlIGJlY2F1c2UgaXQncyBkb25lIGFzeW5jaHJvbm91c2x5LiBJbiBvdGhlciB3b3JkcywgYWxsIGxvZyBmaWxlcyB3aWxsIGhhdmUgYXQgbGVhc3QgdGhlIHNpemUgb2YgdGhlIGRlZmF1bHQgYmxvY2sgc2l6ZSAoODAgTWlCKSwgZXZlbiBpZiB0aGVyZSBhcmUgb25seSBhIGZldyBLQiBvZiByZWFsIGRhdGEuIENvbnNlcXVlbnRseSwgc29tZSB3YXJuaW5ncyB3aWxsIGFwcGVhciBpbiBDYXNzYW5kcmEgc3lzdGVtLmxvZzoKKworLS0tLQorV0FSTiAgW21haW4vcXVldWV+ZmlsZX5zaHJpbmt+ZGFlbW9uXSA8REFURSBUSU1FPiBRdWV1ZUZpbGVTaHJpbmtNYW5hZ2VyLmphdmE6NjMgLSBGYWlsZWQgdG8gc2hyaW5rIGZpbGUgYXMgaXQgZXhpc3RzIG5vIGxvbmdlciwgZmlsZT0vcGF0aC90by94eHguY3E0CistLS0tCisKK1RJUDogQmVjYXVzZSBDYXNzYW5kcmEgZG9lcyBub3QgbWFrZSB1c2Ugb2YgUHJldG91Y2hlciwgeW91IGNhbiBjb25maWd1cmUgQ2hyb25pY2xlIFF1ZXVlIHRvIHNocmluayBmaWxlcyBzeW5jaHJvbm91c2x5IC0tIGkuZS4gYXMgc29vbiBhcyB0aGUgZmlsZSBpcyByb2xsZWQgLS0gd2l0aCBgYGNocm9uaWNsZS5xdWV1ZS5zeW5jaHJvbm91c0ZpbGVTaHJpbmtpbmdgYCBKVk0gcHJvcGVydGllcy4gRm9yIGluc3RhbmNlLCB5b3UgY2FuIGFkZCB0aGUgZm9sbG93aW5nIGxpbmUgYXQgdGhlIGVuZCBvZiBgYGNhc3NhbmRyYS1lbnYuc2hgYDogYGBKVk1fT1BUUz0iJEpWTV9PUFRTIC1EY2hyb25pY2xlLnF1ZXVlLnN5bmNocm9ub3VzRmlsZVNocmlua2luZz10cnVlImBgCisKKz09PSBtYXhfYXJjaGl2ZV9yZXRyaWVzCisKK1RoZSBgYG1heF9hcmNoaXZlX3JldHJpZXNgYCBvcHRpb24gc2V0cyB0aGUgbWF4IG51bWJlciBvZiByZXRyaWVzIG9mIGZhaWxlZCBhcmNoaXZlIGNvbW1hbmRzLiBUaGUgZGVmYXVsdCBpcyAxMC4KKworRm9yIGV4YW1wbGU6IGBgbWF4X2FyY2hpdmVfcmV0cmllczogMTBgYAorCitJbnRlcnZhbCBiZXR3ZWVuIGVhY2ggcmV0cnkgaXMgaGFyZCBjb2RlZCB0byA1IG1pbnV0ZXMuCisKK1tbZW5hYmxpbmdfYXVkaXRfd2l0aF9ub2RldG9vbF1dCis9PSBFbmFibGluZyBBdWRpdCBMb2dnaW5nIHdpdGggYGBub2RldG9vbGBgCisgCitBdWRpdCBsb2dnaW5nIGlzIGVuYWJsZWQgb24gYSBwZXItbm9kZSBiYXNpcyB1c2luZyB0aGUgYGBub2RldG9vbCBlbmFibGVhdWRpdGxvZ2BgIGNvbW1hbmQuIFRoZSBsb2dnaW5nIGRpcmVjdG9yeSBtdXN0IGJlIGRlZmluZWQgd2l0aCBgYGF1ZGl0X2xvZ3NfZGlyYGAgaW4gdGhlIGBjYXNzYW5kcmEueWFtbGAgZmlsZSBvciB1c2VzIHRoZSBkZWZhdWx0IHZhbHVlIGBgY2Fzc2FuZHJhLmxvZ2Rpci5hdWRpdGBgLgorCitUaGUgc3ludGF4IG9mIHRoZSBgYG5vZGV0b29sIGVuYWJsZWF1ZGl0bG9nYGAgY29tbWFuZCBoYXMgYWxsIHRoZSBzYW1lIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IGluIHRoZSBgYGNhc3NhbmRyYS55YW1sYGAgZmlsZSBleGNlcHQgYGBhdWRpdF9sb2dzX2RpcmBgLgorSW4gYWRkaXRpb24sIGBgbm9kZXRvb2xgYCBoYXMgb3B0aW9ucyB0byBzZXQgd2hpY2ggaG9zdCBhbmQgcG9ydCB0byBydW4gdGhlIGNvbW1hbmQgb24sIGFuZCB1c2VybmFtZSBhbmQgcGFzc3dvcmQgaWYgdGhlIGNvbW1hbmQgcmVxdWlyZXMgYXV0aGVudGljYXRpb24uCisKK1tzb3VyY2UsIHBsYWludGV4dF0KKy0tLS0KKyAgICAgICBub2RldG9vbCBbKC1oIDxob3N0PiB8IC0taG9zdCA8aG9zdD4pXSBbKC1wIDxwb3J0PiB8IC0tcG9ydCA8cG9ydD4pXQorICAgICAgICAgICAgICAgIFsoLXBwIHwgLS1wcmludC1wb3J0KV0gWygtcHcgPHBhc3N3b3JkPiB8IC0tcGFzc3dvcmQgPHBhc3N3b3JkPildCisgICAgICAgICAgICAgICAgWygtcHdmIDxwYXNzd29yZEZpbGVQYXRoPiB8IC0tcGFzc3dvcmQtZmlsZSA8cGFzc3dvcmRGaWxlUGF0aD4pXQorICAgICAgICAgICAgICAgIFsoLXUgPHVzZXJuYW1lPiB8IC0tdXNlcm5hbWUgPHVzZXJuYW1lPildIGVuYWJsZWF1ZGl0bG9nCisgICAgICAgICAgICAgICAgWy0tZXhjbHVkZWQtY2F0ZWdvcmllcyA8ZXhjbHVkZWRfY2F0ZWdvcmllcz5dCisgICAgICAgICAgICAgICAgWy0tZXhjbHVkZWQta2V5c3BhY2VzIDxleGNsdWRlZF9rZXlzcGFjZXM+XQorICAgICAgICAgICAgICAgIFstLWV4Y2x1ZGVkLXVzZXJzIDxleGNsdWRlZF91c2Vycz5dCisgICAgICAgICAgICAgICAgWy0taW5jbHVkZWQtY2F0ZWdvcmllcyA8aW5jbHVkZWRfY2F0ZWdvcmllcz5dCisgICAgICAgICAgICAgICAgWy0taW5jbHVkZWQta2V5c3BhY2VzIDxpbmNsdWRlZF9rZXlzcGFjZXM+XQorICAgICAgICAgICAgICAgIFstLWluY2x1ZGVkLXVzZXJzIDxpbmNsdWRlZF91c2Vycz5dIFstLWxvZ2dlciA8bG9nZ2VyPl0KKworT1BUSU9OUworICAgICAgICAtLWV4Y2x1ZGVkLWNhdGVnb3JpZXMgPGV4Y2x1ZGVkX2NhdGVnb3JpZXM+CisgICAgICAgICAgICBDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBBdWRpdCBMb2cgQ2F0ZWdvcmllcyB0byBiZSBleGNsdWRlZCBmb3IKKyAgICAgICAgICAgIGF1ZGl0IGxvZy4gSWYgbm90IHNldCB0aGUgdmFsdWUgZnJvbSBjYXNzYW5kcmEueWFtbCB3aWxsIGJlIHVzZWQKKworICAgICAgICAtLWV4Y2x1ZGVkLWtleXNwYWNlcyA8ZXhjbHVkZWRfa2V5c3BhY2VzPgorICAgICAgICAgICAgQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Yga2V5c3BhY2VzIHRvIGJlIGV4Y2x1ZGVkIGZvciBhdWRpdCBsb2cuIElmCisgICAgICAgICAgICBub3Qgc2V0IHRoZSB2YWx1ZSBmcm9tIGNhc3NhbmRyYS55YW1sIHdpbGwgYmUgdXNlZAorCisgICAgICAgIC0tZXhjbHVkZWQtdXNlcnMgPGV4Y2x1ZGVkX3VzZXJzPgorICAgICAgICAgICAgQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdXNlcnMgdG8gYmUgZXhjbHVkZWQgZm9yIGF1ZGl0IGxvZy4gSWYgbm90CisgICAgICAgICAgICBzZXQgdGhlIHZhbHVlIGZyb20gY2Fzc2FuZHJhLnlhbWwgd2lsbCBiZSB1c2VkCisKKyAgICAgICAgLWggPGhvc3Q+LCAtLWhvc3QgPGhvc3Q+CisgICAgICAgICAgICBOb2RlIGhvc3RuYW1lIG9yIGlwIGFkZHJlc3MKKworICAgICAgICAtLWluY2x1ZGVkLWNhdGVnb3JpZXMgPGluY2x1ZGVkX2NhdGVnb3JpZXM+CisgICAgICAgICAgICBDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBBdWRpdCBMb2cgQ2F0ZWdvcmllcyB0byBiZSBpbmNsdWRlZCBmb3IKKyAgICAgICAgICAgIGF1ZGl0IGxvZy4gSWYgbm90IHNldCB0aGUgdmFsdWUgZnJvbSBjYXNzYW5kcmEueWFtbCB3aWxsIGJlIHVzZWQKKworICAgICAgICAtLWluY2x1ZGVkLWtleXNwYWNlcyA8aW5jbHVkZWRfa2V5c3BhY2VzPgorICAgICAgICAgICAgQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Yga2V5c3BhY2VzIHRvIGJlIGluY2x1ZGVkIGZvciBhdWRpdCBsb2cuIElmCisgICAgICAgICAgICBub3Qgc2V0IHRoZSB2YWx1ZSBmcm9tIGNhc3NhbmRyYS55YW1sIHdpbGwgYmUgdXNlZAorCisgICAgICAgIC0taW5jbHVkZWQtdXNlcnMgPGluY2x1ZGVkX3VzZXJzPgorICAgICAgICAgICAgQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdXNlcnMgdG8gYmUgaW5jbHVkZWQgZm9yIGF1ZGl0IGxvZy4gSWYgbm90CisgICAgICAgICAgICBzZXQgdGhlIHZhbHVlIGZyb20gY2Fzc2FuZHJhLnlhbWwgd2lsbCBiZSB1c2VkCisKKyAgICAgICAgLS1sb2dnZXIgPGxvZ2dlcj4KKyAgICAgICAgICAgIExvZ2dlciBuYW1lIHRvIGJlIHVzZWQgZm9yIEF1ZGl0TG9nZ2luZy4gRGVmYXVsdCBCaW5BdWRpdExvZ2dlci4gSWYKKyAgICAgICAgICAgIG5vdCBzZXQgdGhlIHZhbHVlIGZyb20gY2Fzc2FuZHJhLnlhbWwgd2lsbCBiZSB1c2VkCisKKyAgICAgICAgLXAgPHBvcnQ+LCAtLXBvcnQgPHBvcnQ+CisgICAgICAgICAgICBSZW1vdGUgam14IGFnZW50IHBvcnQgbnVtYmVyCisKKyAgICAgICAgLXBwLCAtLXByaW50LXBvcnQKKyAgICAgICAgICAgIE9wZXJhdGUgaW4gNC4wIG1vZGUgd2l0aCBob3N0cyBkaXNhbWJpZ3VhdGVkIGJ5IHBvcnQgbnVtYmVyCisKKyAgICAgICAgLXB3IDxwYXNzd29yZD4sIC0tcGFzc3dvcmQgPHBhc3N3b3JkPgorICAgICAgICAgICAgUmVtb3RlIGpteCBhZ2VudCBwYXNzd29yZAorCisgICAgICAgIC1wd2YgPHBhc3N3b3JkRmlsZVBhdGg+LCAtLXBhc3N3b3JkLWZpbGUgPHBhc3N3b3JkRmlsZVBhdGg+CisgICAgICAgICAgICBQYXRoIHRvIHRoZSBKTVggcGFzc3dvcmQgZmlsZQorCisgICAgICAgIC11IDx1c2VybmFtZT4sIC0tdXNlcm5hbWUgPHVzZXJuYW1lPgorICAgICAgICAgICAgUmVtb3RlIGpteCBhZ2VudCB1c2VybmFtZQorLS0tLQorCitUbyBlbmFibGUgYXVkaXQgbG9nZ2luZywgcnVuIGZvbGxvd2luZyBjb21tYW5kIG9uIGVhY2ggbm9kZSBpbiB0aGUgY2x1c3RlciBvbiB3aGljaCB5b3Ugd2FudCB0byBlbmFibGUgbG9nZ2luZzoKKworW3NvdXJjZSwgYmFzaF0KKy0tLS0KKyQgbm9kZXRvb2wgZW5hYmxlYXVkaXRsb2cKKy0tLS0KKworPT0gRGlzYWJsaW5nIGF1ZGl0IGxvZ2dpbmcKKworVXNlIHRoZSBgbm9kZXRvb2wgZGlzYWJsZWF1ZGl0bG9nYCBjb21tYW5kIHRvIGRpc2FibGUgYXVkaXQgbG9nZ2luZy4gCisKKz09IFZpZXdpbmcgYXVkaXQgbG9ncworCitUaGUgYGF1ZGl0bG9ndmlld2VyYCB0b29sIGlzIHVzZWQgdG8gdmlldyAoZHVtcCkgYXVkaXQgbG9ncyBpZiB0aGUgbG9nZ2VyIHdhcyBgYEJpbkF1ZGl0TG9nZ2VyYGAuLiAKK2BgYXVkaXRsb2d2aWV3ZXJgYCBjb252ZXJ0cyB0aGUgYmluYXJ5IGxvZyBmaWxlcyBpbnRvIGh1bWFuLXJlYWRhYmxlIGZvcm1hdDsgb25seSB0aGUgYXVkaXQgbG9nIGRpcmVjdG9yeSBtdXN0IGJlIHN1cHBsaWVkIGFzIGEgY29tbWFuZC1saW5lIG9wdGlvbi4KK0lmIHRoZSBsb2dnZXIgYGBGaWxlQXVkaXRMb2dnZXJgYCB3YXMgc2V0LCB0aGUgbG9nIGZpbGUgYXJlIGFscmVhZHkgaW4gaHVtYW4tcmVhZGFibGUgZm9ybWF0IGFuZCBgYGF1ZGl0bG9ndmlld2VyYGAgaXMgbm90IG5lZWRlZCB0byByZWFkIGZpbGVzLiAKKworCitUaGUgc3ludGF4IG9mIGBhdWRpdGxvZ3ZpZXdlcmAgaXM6CisKK1tzb3VyY2UsIHBsYWludGV4dF0KKy0tLS0KK2F1ZGl0bG9ndmlld2VyCisKK0F1ZGl0IGxvZyBmaWxlcyBkaXJlY3RvcnkgcGF0aCBpcyBhIHJlcXVpcmVkIGFyZ3VtZW50LgordXNhZ2U6IGF1ZGl0bG9ndmlld2VyIDxwYXRoMT4gWzxwYXRoMj4uLi48cGF0aE4+XSBbb3B0aW9uc10KKy0tCitWaWV3IHRoZSBhdWRpdCBsb2cgY29udGVudHMgaW4gaHVtYW4gcmVhZGFibGUgZm9ybWF0CistLQorT3B0aW9ucyBhcmU6CistZiwtLWZvbGxvdyAgICAgICBVcG9uIHJlYWNoaW5nIHRoZSBlbmQgb2YgdGhlIGxvZyBjb250aW51ZSBpbmRlZmluaXRlbHkKKyAgICAgICAgICAgICAgICAgIHdhaXRpbmcgZm9yIG1vcmUgcmVjb3JkcworLWgsLS1oZWxwICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgbWVzc2FnZQorLXIsLS1yb2xsX2N5Y2xlICAgSG93IG9mdGVuIHRvIHJvbGwgdGhlIGxvZyBmaWxlIHdhcyByb2xsZWQuIE1heSBiZQorICAgICAgICAgICAgICAgICAgbmVjZXNzYXJ5IGZvciBDaHJvbmljbGUgdG8gY29ycmVjdGx5IHBhcnNlIGZpbGUgbmFtZXMuIChNSU5VVEVMWSwgSE9VUkxZLAorICAgICAgICAgICAgICAgICAgREFJTFkpLiBEZWZhdWx0IEhPVVJMWS4KKy0tLS0KKworPT0gRXhhbXBsZQorCitbYXJhYmljLCBzdGFydD0xXQorLiBUbyBkZW1vbnN0cmF0ZSBhdWRpdCBsb2dnaW5nLCBmaXJzdCBjb25maWd1cmUgdGhlIGBgY2Fzc2FuZHJhLnlhbWxgYCBmaWxlIHdpdGggdGhlIGZvbGxvd2luZyBzZXR0aW5nczoKKworW3NvdXJjZSwgeWFtbF0KKy0tLS0KK2F1ZGl0X2xvZ2dpbmdfb3B0aW9uczoKKyAgIGVuYWJsZWQ6IHRydWUKKyAgIGxvZ2dlcjogQmluQXVkaXRMb2dnZXIKKyAgIGF1ZGl0X2xvZ3NfZGlyOiAiL2Nhc3NhbmRyYS9hdWRpdC9sb2dzL2hvdXJseSIKKyAgICMgaW5jbHVkZWRfa2V5c3BhY2VzOgorICAgIyBleGNsdWRlZF9rZXlzcGFjZXM6IHN5c3RlbSwgc3lzdGVtX3NjaGVtYSwgc3lzdGVtX3ZpcnR1YWxfc2NoZW1hCisgICAjIGluY2x1ZGVkX2NhdGVnb3JpZXM6CisgICAjIGV4Y2x1ZGVkX2NhdGVnb3JpZXM6CisgICAjIGluY2x1ZGVkX3VzZXJzOgorICAgIyBleGNsdWRlZF91c2VyczoKKyAgIHJvbGxfY3ljbGU6IEhPVVJMWQorICAgIyBibG9jazogdHJ1ZQorICAgIyBtYXhfcXVldWVfd2VpZ2h0OiAyNjg0MzU0NTYgIyAyNTYgTWlCCisgICAjIG1heF9sb2dfc2l6ZTogMTcxNzk4NjkxODQgIyAxNiBHaUIKKyAgICMjIGFyY2hpdmUgY29tbWFuZCBpcyAiL3BhdGgvdG8vc2NyaXB0LnNoICVwYXRoIiB3aGVyZSAlcGF0aCBpcyByZXBsYWNlZCB3aXRoIHRoZSBmaWxlIGJlaW5nIHJvbGxlZDoKKyAgICMgYXJjaGl2ZV9jb21tYW5kOgorICAgIyBtYXhfYXJjaGl2ZV9yZXRyaWVzOiAxMAorLS0tLQorCitbYXJhYmljLCBzdGFydD0yXQorLiBDcmVhdGUgdGhlIGF1ZGl0IGxvZyBkaXJlY3RvcnkgYC9jYXNzYW5kcmEvYXVkaXQvbG9ncy9ob3VybHlgIGFuZCBzZXQgdGhlIGRpcmVjdG9yeSBwZXJtaXNzaW9ucyB0byByZWFkLCB3cml0ZSwgYW5kIGV4ZWN1dGUgZm9yIGFsbC4gCisKK1thcmFiaWMsIHN0YXJ0PTNdCisuIE5vdyBjcmVhdGUgYSBkZW1vIGtleXNwYWNlIGFuZCB0YWJsZSBhbmQgaW5zZXJ0IHNvbWUgZGF0YSB1c2luZyBgYGNxbHNoYGA6CisKK1tzb3VyY2UsIGNxbF0KKy0tLS0KKyBjcWxzaD4gQ1JFQVRFIEtFWVNQQUNFIGF1ZGl0bG9na2V5c3BhY2UKKyAgIC4uLiBXSVRIIHJlcGxpY2F0aW9uID0geydjbGFzcyc6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InIDogMX07CisgY3Fsc2g+IFVTRSBhdWRpdGxvZ2tleXNwYWNlOworIGNxbHNoOmF1ZGl0bG9na2V5c3BhY2U+IENSRUFURSBUQUJMRSB0ICgKKyAuLi5pZCBpbnQsCisgLi4uayBpbnQsCisgLi4udiB0ZXh0LAorIC4uLlBSSU1BUlkgS0VZIChpZCkKKyAuLi4gKTsKKyBjcWxzaDphdWRpdGxvZ2tleXNwYWNlPiBJTlNFUlQgSU5UTyB0IChpZCwgaywgdikgVkFMVUVTICgwLCAwLCAndmFsMCcpOworIGNxbHNoOmF1ZGl0bG9na2V5c3BhY2U+IElOU0VSVCBJTlRPIHQgKGlkLCBrLCB2KSBWQUxVRVMgKDAsIDEsICd2YWwxJyk7CistLS0tCisKK0FsbCB0aGUgc3VwcG9ydGVkIENRTCBjb21tYW5kcyB3aWxsIGJlIGxvZ2dlZCB0byB0aGUgYXVkaXQgbG9nIGRpcmVjdG9yeS4KKworW2FyYWJpYywgc3RhcnQ9NF0KKy4gQ2hhbmdlIGRpcmVjdG9yeSB0byB0aGUgYXVkaXQgbG9ncyBkaXJlY3RvcnkuCisKK1tzb3VyY2UsIGJhc2hdCistLS0tCiskIGNkIC9jYXNzYW5kcmEvYXVkaXQvbG9ncy9ob3VybHkKKy0tLS0KKworW2FyYWJpYywgc3RhcnQ9NV0KKy4gTGlzdCB0aGUgYXVkaXQgbG9nIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4gCisKK1tzb3VyY2UsIGJhc2hdCistLS0tCiskIGxzIC1sCistLS0tCisKK1lvdSBzaG91bGQgc2VlIHJlc3VsdHMgc2ltaWxhciB0bzoKKworW3NvdXJjZSwgcGxhaW50ZXh0XQorLS0tLQordG90YWwgMjgKKy1ydy1ydy1yLS0uIDEgZWMyLXVzZXIgZWMyLXVzZXIgICAgNjU1MzYgQXVnICAyIDAzOjAxIGRpcmVjdG9yeS1saXN0aW5nLmNxNHQKKy1ydy1ydy1yLS0uIDEgZWMyLXVzZXIgZWMyLXVzZXIgODM4ODYwODAgQXVnICAyIDAzOjAxIDIwMTkwODAyLTAyLmNxNAorLXJ3LXJ3LXItLS4gMSBlYzItdXNlciBlYzItdXNlciA4Mzg4NjA4MCBBdWcgIDIgMDM6MDEgMjAxOTA4MDItMDMuY3E0CistLS0tCisKK1RoZSBhdWRpdCBsb2cgZmlsZXMgd2lsbCBhbGwgYmUgbGlzdGVkIHdpdGggYSBgLmNxNGAgZmlsZSB0eXBlLiBUaGUgYXVkaXQgZGlyZWN0b3J5IGlzIG9mIGAuY3E0dGAgdHlwZS4KKworW2FyYWJpYywgc3RhcnQ9Nl0KKy4gUnVuIGBhdWRpdGxvZ3ZpZXdlcmAgdG9vbCB0byB2aWV3IHRoZSBhdWRpdCBsb2dzLiAKKworW3NvdXJjZSwgYmFzaF0KKy0tLS0KKyQgYXVkaXRsb2d2aWV3ZXIgL2Nhc3NhbmRyYS9hdWRpdC9sb2dzL2hvdXJseQorLS0tLQorCitUaGlzIGNvbW1hbmQgd2lsbCByZXR1cm4gYSByZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBsb2cuIEhlcmUgaXMgYSBwYXJ0aWFsIHNhbXBsZSBvZiB0aGUgbG9nIGZvciB0aGUgY29tbWFuZHMgaW4gdGhpcyBkZW1vOgorCitbc291cmNlLCBwbGFpbnRleHRdCistLS0tCitXQVJOICAwMzoxMjoxMSwxMjQgVXNpbmcgUGF1c2VyLnNsZWVweSgpIGFzIG5vdCBlbm91Z2ggcHJvY2Vzc29ycywgaGF2ZSAyLCBuZWVkcyA4KworVHlwZTogQXVkaXRMb2cKK0xvZ01lc3NhZ2U6Cit1c2VyOmFub255bW91c3xob3N0OjEwLjAuMi4yMzg6NzAwMHxzb3VyY2U6LzEyNy4wLjAuMXxwb3J0OjQ2MjY0fHRpbWVzdGFtcDoxNTY0NzExNDI3MzI4fHR5cGUgOlVTRV9LRVlTUEFDRXxjYXRlZ29yeTpPVEhFUnxrczphdWRpdGxvZ2tleXNwYWNlfG9wZXJhdGlvbjpVU0UgQXVkaXRMb2dLZXlzcGFjZTsKK1R5cGU6IEF1ZGl0TG9nCitMb2dNZXNzYWdlOgordXNlcjphbm9ueW1vdXN8aG9zdDoxMC4wLjIuMjM4OjcwMDB8c291cmNlOi8xMjcuMC4wLjF8cG9ydDo0NjI2NHx0aW1lc3RhbXA6MTU2NDcxMTQyNzMyOXx0eXBlIDpVU0VfS0VZU1BBQ0V8Y2F0ZWdvcnk6T1RIRVJ8a3M6YXVkaXRsb2drZXlzcGFjZXxvcGVyYXRpb246VVNFICJhdWRpdGxvZ2tleXNwYWNlIgorVHlwZTogQXVkaXRMb2cKK0xvZ01lc3NhZ2U6Cit1c2VyOmFub255bW91c3xob3N0OjEwLjAuMi4yMzg6NzAwMHxzb3VyY2U6LzEyNy4wLjAuMXxwb3J0OjQ2MjY0fHRpbWVzdGFtcDoxNTY0NzExNDQ2Mjc5fHR5cGUgOlNFTEVDVHxjYXRlZ29yeTpRVUVSWXxrczphdWRpdGxvZ2tleXNwYWNlfHNjb3BlOnR8b3BlcmF0aW9uOlNFTEVDVCAqIEZST00gdDsKK1R5cGU6IEF1ZGl0TG9nCitMb2dNZXNzYWdlOgordXNlcjphbm9ueW1vdXN8aG9zdDoxMC4wLjIuMjM4OjcwMDB8c291cmNlOi8xMjcuMC4wLjF8cG9ydDo0NjI2NHx0aW1lc3RhbXA6MTU2NDcxMzg3ODgzNHx0eXBlIDpEUk9QX1RBQkxFfGNhdGVnb3J5OkRETHxrczphdWRpdGxvZ2tleXNwYWNlfHNjb3BlOnR8b3BlcmF0aW9uOkRST1AgVEFCTEUgSUYgRVhJU1RTCitBdWRpdExvZ0tleXNwYWNlLnQ7CitUeXBlOiBBdWRpdExvZworTG9nTWVzc2FnZToKK3VzZXI6YW5vbnltb3VzfGhvc3Q6MTAuMC4yLjIzODo3MDAwfHNvdXJjZTovMy45MS41Ni4xNjR8cG9ydDo0MjM4Mnx0aW1lc3RhbXA6MTU2NDcxNDYxODM2MHx0eQorcGU6UkVRVUVTVF9GQUlMVVJFfGNhdGVnb3J5OkVSUk9SfG9wZXJhdGlvbjpDUkVBVEUgS0VZU1BBQ0UgQXVkaXRMb2dLZXlzcGFjZQorV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJyA6IDF9OzsgQ2Fubm90IGFkZAorZXhpc3Rpbmcga2V5c3BhY2UgImF1ZGl0bG9na2V5c3BhY2UiCitUeXBlOiBBdWRpdExvZworTG9nTWVzc2FnZToKK3VzZXI6YW5vbnltb3VzfGhvc3Q6MTAuMC4yLjIzODo3MDAwfHNvdXJjZTovMTI3LjAuMC4xfHBvcnQ6NDYyNjR8dGltZXN0YW1wOjE1NjQ3MTQ2OTA5Njh8dHlwZSA6RFJPUF9LRVlTUEFDRXxjYXRlZ29yeTpEREx8a3M6YXVkaXRsb2drZXlzcGFjZXxvcGVyYXRpb246RFJPUCBLRVlTUEFDRSBBdWRpdExvZ0tleXNwYWNlOworVHlwZTogQXVkaXRMb2cKK0xvZ01lc3NhZ2U6Cit1c2VyOmFub255bW91c3xob3N0OjEwLjAuMi4yMzg6NzAwMHxzb3VyY2U6LzMuOTEuNTYuMTY0fHBvcnQ6NDI0MDZ8dGltZXN0YW1wOjE1NjQ3MTQ3MDgzMjl8dHkgcGU6Q1JFQVRFX0tFWVNQQUNFfGNhdGVnb3J5OkRETHxrczphdWRpdGxvZ2tleXNwYWNlfG9wZXJhdGlvbjpDUkVBVEUgS0VZU1BBQ0UKK0F1ZGl0TG9nS2V5c3BhY2UKK1dJVEggcmVwbGljYXRpb24gPSB7J2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3RvcicgOiAxfTsKK1R5cGU6IEF1ZGl0TG9nCitMb2dNZXNzYWdlOgordXNlcjphbm9ueW1vdXN8aG9zdDoxMC4wLjIuMjM4OjcwMDB8c291cmNlOi8xMjcuMC4wLjF8cG9ydDo0NjI2NHx0aW1lc3RhbXA6MTU2NDcxNDg3MDY3OHx0eXBlIDpVU0VfS0VZU1BBQ0V8Y2F0ZWdvcnk6T1RIRVJ8a3M6YXVkaXRsb2drZXlzcGFjZXxvcGVyYXRpb246VVNFIGF1ZGl0bG9na2V5c3BhY2U7CisKK1Bhc3N3b3JkIG9iZnVzY2F0aW9uIGV4YW1wbGVzOgorTG9nTWVzc2FnZTogdXNlcjpjYXNzYW5kcmF8aG9zdDpsb2NhbGhvc3QvMTI3LjAuMC4xOjcwMDB8c291cmNlOi8xMjcuMC4wLjF8cG9ydDo2NTI4Mnx0aW1lc3RhbXA6MTYyMjYzMDQ5NjcwOHx0eXBlOkNSRUFURV9ST0xFfGNhdGVnb3J5OkRDTHxvcGVyYXRpb246Q1JFQVRFIFJPTEUgcm9sZTEgV0lUSCBQQVNTV09SRCA9ICcqKioqKioqJzsKK1R5cGU6IGF1ZGl0CitMb2dNZXNzYWdlOiB1c2VyOmNhc3NhbmRyYXxob3N0OmxvY2FsaG9zdC8xMjcuMC4wLjE6NzAwMHxzb3VyY2U6LzEyNy4wLjAuMXxwb3J0OjY1MjgyfHRpbWVzdGFtcDoxNjIyNjMwNjM0NTUyfHR5cGU6QUxURVJfUk9MRXxjYXRlZ29yeTpEQ0x8b3BlcmF0aW9uOkFUTEVSIFJPTEUgcm9sZTEgV0lUSCBQQVNTV09SRCA9ICcqKioqKioqJzsKK1R5cGU6IGF1ZGl0CitMb2dNZXNzYWdlOiB1c2VyOmNhc3NhbmRyYXxob3N0OmxvY2FsaG9zdC8xMjcuMC4wLjE6NzAwMHxzb3VyY2U6LzEyNy4wLjAuMXxwb3J0OjY1MjgyfHRpbWVzdGFtcDoxNjIyNjMwNjk4Njg2fHR5cGU6Q1JFQVRFX1JPTEV8Y2F0ZWdvcnk6RENMfG9wZXJhdGlvbjpDUkVBVEUgVVNFUiB1c2VyMSBXSVRIIFBBU1NXT1JEICcqKioqKioqJzsKK1R5cGU6IGF1ZGl0CitMb2dNZXNzYWdlOiB1c2VyOmNhc3NhbmRyYXxob3N0OmxvY2FsaG9zdC8xMjcuMC4wLjE6NzAwMHxzb3VyY2U6LzEyNy4wLjAuMXxwb3J0OjY1MjgyfHRpbWVzdGFtcDoxNjIyNjMwNzQ3MzQ0fHR5cGU6QUxURVJfUk9MRXxjYXRlZ29yeTpEQ0x8b3BlcmF0aW9uOkFMVEVSIFVTRVIgdXNlcjEgV0lUSCBQQVNTV09SRCAnKioqKioqKic7CistLS0tCisKKz09IERpYWdub3N0aWMgZXZlbnRzIGZvciB1c2VyIGF1ZGl0IGxvZ2dpbmcKKworQW55IG5hdGl2ZSB0cmFuc3BvcnQtZW5hYmxlZCBjbGllbnQgY2FuIHN1YnNjcmliZSB0byBhdWRpdCBsb2cgZXZlbnRzIGZvciBkaWFnbm9zaW5nIGNsdXN0ZXIgaXNzdWVzLgorVGhlc2UgZXZlbnRzIGNhbiBiZSBjb25zdW1lZCBieSBleHRlcm5hbCB0b29scyB0byBpbXBsZW1lbnQgYSBDYXNzYW5kcmEgdXNlciBhdWRpdGluZyBzb2x1dGlvbi4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvYmFja3Vwcy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9iYWNrdXBzLmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmOTE4NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvYmFja3Vwcy5hZG9jCkBAIC0wLDAgKzEsNTE3IEBACis9IEJhY2t1cHMKKworQXBhY2hlIENhc3NhbmRyYSBzdG9yZXMgZGF0YSBpbiBpbW11dGFibGUgU1NUYWJsZSBmaWxlcy4gQmFja3VwcyBpbgorQXBhY2hlIENhc3NhbmRyYSBkYXRhYmFzZSBhcmUgYmFja3VwIGNvcGllcyBvZiB0aGUgZGF0YWJhc2UgZGF0YSB0aGF0IGlzCitzdG9yZWQgYXMgU1NUYWJsZSBmaWxlcy4gQmFja3VwcyBhcmUgdXNlZCBmb3Igc2V2ZXJhbCBwdXJwb3NlcyBpbmNsdWRpbmcKK3RoZSBmb2xsb3dpbmc6CisKKyogVG8gc3RvcmUgYSBkYXRhIGNvcHkgZm9yIGR1cmFiaWxpdHkKKyogVG8gYmUgYWJsZSB0byByZXN0b3JlIGEgdGFibGUgaWYgdGFibGUgZGF0YSBpcyBsb3N0IGR1ZSB0bworbm9kZS9wYXJ0aXRpb24vbmV0d29yayBmYWlsdXJlCisqIFRvIGJlIGFibGUgdG8gdHJhbnNmZXIgdGhlIFNTVGFibGUgZmlsZXMgdG8gYSBkaWZmZXJlbnQgbWFjaGluZTsgZm9yCitwb3J0YWJpbGl0eQorCis9PSBUeXBlcyBvZiBCYWNrdXBzCisKK0FwYWNoZSBDYXNzYW5kcmEgc3VwcG9ydHMgdHdvIGtpbmRzIG9mIGJhY2t1cCBzdHJhdGVnaWVzLgorCisqIFNuYXBzaG90cworKiBJbmNyZW1lbnRhbCBCYWNrdXBzCisKK0EgX3NuYXBzaG90XyBpcyBhIGNvcHkgb2YgYSB0YWJsZeKAmXMgU1NUYWJsZSBmaWxlcyBhdCBhIGdpdmVuIHRpbWUsCitjcmVhdGVkIHZpYSBoYXJkIGxpbmtzLiAKK1RoZSBEREwgdG8gY3JlYXRlIHRoZSB0YWJsZSBpcyBzdG9yZWQgYXMgd2VsbC4KK1NuYXBzaG90cyBtYXkgYmUgY3JlYXRlZCBieSBhIHVzZXIgb3IgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LiAKK1RoZSBzZXR0aW5nIGBzbmFwc2hvdF9iZWZvcmVfY29tcGFjdGlvbmAgaW4gdGhlIGBjYXNzYW5kcmEueWFtbGAgZmlsZSBkZXRlcm1pbmVzIGlmCitzbmFwc2hvdHMgYXJlIGNyZWF0ZWQgYmVmb3JlIGVhY2ggY29tcGFjdGlvbi4gCitCeSBkZWZhdWx0LCBgc25hcHNob3RfYmVmb3JlX2NvbXBhY3Rpb25gIGlzIHNldCB0byBmYWxzZS4gCitTbmFwc2hvdHMgbWF5IGJlIGNyZWF0ZWQgYXV0b21hdGljYWxseSBiZWZvcmUga2V5c3BhY2UgdHJ1bmNhdGlvbiBvciBkcm9wcGluZyBvZiBhIHRhYmxlIGJ5CitzZXR0aW5nIGBhdXRvX3NuYXBzaG90YCB0byB0cnVlIChkZWZhdWx0KSBpbiBgY2Fzc2FuZHJhLnlhbWxgLiAKK1RydW5jYXRlcyBjb3VsZCBiZSBkZWxheWVkIGR1ZSB0byB0aGUgYXV0byBzbmFwc2hvdHMgYW5kIGFub3RoZXIgc2V0dGluZyBpbgorYGNhc3NhbmRyYS55YW1sYCBkZXRlcm1pbmVzIGhvdyBsb25nIHRoZSBjb29yZGluYXRvciBzaG91bGQgd2FpdCBmb3IKK3RydW5jYXRlcyB0byBjb21wbGV0ZS4gCitCeSBkZWZhdWx0IENhc3NhbmRyYSB3YWl0cyA2MCBzZWNvbmRzIGZvciBhdXRvIHNuYXBzaG90cyB0byBjb21wbGV0ZS4KKworQW4gX2luY3JlbWVudGFsIGJhY2t1cF8gaXMgYSBjb3B5IG9mIGEgdGFibGXigJlzIFNTVGFibGUgZmlsZXMgY3JlYXRlZCBieQorYSBoYXJkIGxpbmsgd2hlbiBtZW10YWJsZXMgYXJlIGZsdXNoZWQgdG8gZGlzayBhcyBTU1RhYmxlcy4gCitUeXBpY2FsbHkgaW5jcmVtZW50YWwgYmFja3VwcyBhcmUgcGFpcmVkIHdpdGggc25hcHNob3RzIHRvIHJlZHVjZSB0aGUgYmFja3VwIHRpbWUKK2FzIHdlbGwgYXMgcmVkdWNlIGRpc2sgc3BhY2UuIAorSW5jcmVtZW50YWwgYmFja3VwcyBhcmUgbm90IGVuYWJsZWQgYnkgZGVmYXVsdCBhbmQgbXVzdCBiZSBlbmFibGVkIGV4cGxpY2l0bHkgaW4gYGNhc3NhbmRyYS55YW1sYCAod2l0aAorYGluY3JlbWVudGFsX2JhY2t1cHNgIHNldHRpbmcpIG9yIHdpdGggYG5vZGV0b29sYC4gCitPbmNlIGVuYWJsZWQsIENhc3NhbmRyYSBjcmVhdGVzIGEgaGFyZCBsaW5rIHRvIGVhY2ggU1NUYWJsZSBmbHVzaGVkIG9yIHN0cmVhbWVkCitsb2NhbGx5IGluIGEgYGJhY2t1cHMvYCBzdWJkaXJlY3Rvcnkgb2YgdGhlIGtleXNwYWNlIGRhdGEuIAorSW5jcmVtZW50YWwgYmFja3VwcyBvZiBzeXN0ZW0gdGFibGVzIGFyZSBhbHNvIGNyZWF0ZWQuCisKKz09IERhdGEgRGlyZWN0b3J5IFN0cnVjdHVyZQorCitUaGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBvZiBDYXNzYW5kcmEgZGF0YSBjb25zaXN0cyBvZiBkaWZmZXJlbnQKK2RpcmVjdG9yaWVzIGZvciBrZXlzcGFjZXMsIGFuZCB0YWJsZXMgd2l0aCB0aGUgZGF0YSBmaWxlcyB3aXRoaW4gdGhlCit0YWJsZSBkaXJlY3Rvcmllcy4gCitEaXJlY3RvcmllcyBiYWNrdXBzIGFuZCBzbmFwc2hvdHMgdG8gc3RvcmUgYmFja3VwcworYW5kIHNuYXBzaG90cyByZXNwZWN0aXZlbHkgZm9yIGEgcGFydGljdWxhciB0YWJsZSBhcmUgYWxzbyBzdG9yZWQgd2l0aGluCit0aGUgdGFibGUgZGlyZWN0b3J5LiAKK1RoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZvciBDYXNzYW5kcmEgaXMgaWxsdXN0cmF0ZWQgaW4gRmlndXJlIDEuCisKK2ltYWdlOjpGaWd1cmVfMV9iYWNrdXBzLmpwZ1tEYXRhIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIGJhY2t1cHNdCisKK0ZpZ3VyZSAxLiBEaXJlY3RvcnkgU3RydWN0dXJlIGZvciBDYXNzYW5kcmEgRGF0YQorCis9PT0gU2V0dGluZyBVcCBFeGFtcGxlIFRhYmxlcyBmb3IgQmFja3VwcyBhbmQgU25hcHNob3RzCisKK0luIHRoaXMgc2VjdGlvbiB3ZSBzaGFsbCBjcmVhdGUgc29tZSBleGFtcGxlIGRhdGEgdGhhdCBjb3VsZCBiZSB1c2VkIHRvCitkZW1vbnN0cmF0ZSBpbmNyZW1lbnRhbCBiYWNrdXBzIGFuZCBzbmFwc2hvdHMuIAorV2UgaGF2ZSB1c2VkIGEgdGhyZWUgbm9kZSBDYXNzYW5kcmEgY2x1c3Rlci4gCitGaXJzdCwgdGhlIGtleXNwYWNlcyBhcmUgY3JlYXRlZC4gCitUaGVuIHRhYmxlcyBhcmUgY3JlYXRlZCB3aXRoaW4gYSBrZXlzcGFjZSBhbmQgdGFibGUgZGF0YSBpcyBhZGRlZC4gCitXZSBoYXZlIHVzZWQgdHdvIGtleXNwYWNlcyBgY3Fsa2V5c3BhY2VgIGFuZCBgY2F0YWxvZ2tleXNwYWNlYCB3aXRoIHR3byB0YWJsZXMgd2l0aGluCitlYWNoLiAKKworQ3JlYXRlIHRoZSBrZXlzcGFjZSBgY3Fsa2V5c3BhY2VgOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2NyZWF0ZV9rc19iYWNrdXAuY3FsW10KKy0tLS0KKworQ3JlYXRlIHR3byB0YWJsZXMgYHRgIGFuZCBgdDJgIGluIHRoZSBgY3Fsa2V5c3BhY2VgIGtleXNwYWNlLgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2NyZWF0ZV90YWJsZV9iYWNrdXAuY3FsW10KKy0tLS0KKworQWRkIGRhdGEgdG8gdGhlIHRhYmxlczogCisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvaW5zZXJ0X2RhdGFfYmFja3VwLmNxbFtdCistLS0tCisKK1F1ZXJ5IHRoZSB0YWJsZSB0byBsaXN0IHRoZSBkYXRhOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML3NlbGVjdF9kYXRhX2JhY2t1cC5jcWxbXQorLS0tLQorCityZXN1bHRzIGluCisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL3NlbGVjdF9kYXRhX2JhY2t1cC5yZXN1bHRbXQorLS0tLQorCitDcmVhdGUgYSBzZWNvbmQga2V5c3BhY2UgYGNhdGFsb2drZXlzcGFjZWA6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX2tzMl9iYWNrdXAuY3FsW10KKy0tLS0KKworQ3JlYXRlIHR3byB0YWJsZXMgYGpvdXJuYWxgICBhbmQgYG1hZ2F6aW5lYCBpbiBgY2F0YWxvZ2tleXNwYWNlYDoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9jcmVhdGVfdGFibGUyX2JhY2t1cC5jcWxbXQorLS0tLQorCitBZGQgZGF0YSB0byB0aGUgdGFibGVzOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2luc2VydF9kYXRhMl9iYWNrdXAuY3FsW10KKy0tLS0KKworUXVlcnkgdGhlIHRhYmxlcyB0byBsaXN0IHRoZSBkYXRhOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML3NlbGVjdF9kYXRhMl9iYWNrdXAuY3FsW10KKy0tLS0KKworcmVzdWx0cyBpbiAKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvc2VsZWN0X2RhdGEyX2JhY2t1cC5yZXN1bHRbXQorLS0tLQorCis9PSBTbmFwc2hvdHMKKworSW4gdGhpcyBzZWN0aW9uLCB3ZSBkZW1vbnN0cmF0ZSBjcmVhdGluZyBzbmFwc2hvdHMuIAorVGhlIGNvbW1hbmQgdXNlZCB0byBjcmVhdGUgYSBzbmFwc2hvdCBpcyBgbm9kZXRvb2wgc25hcHNob3RgIHdpdGggdGhlIHVzYWdlOgorCitbc291cmNlLGJhc2hdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvbm9kZXRvb2xfc25hcHNob3Quc2hbXQorLS0tLQorCityZXN1bHRzIGluCisKK1tzb3VyY2UsIHBsYWludGV4dF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9ub2RldG9vbF9zbmFwc2hvdF9oZWxwLnJlc3VsdFtdCistLS0tCisKKz09PSBDb25maWd1cmluZyBmb3IgU25hcHNob3RzCisKK1RvIGRlbW9uc3RyYXRlIGNyZWF0aW5nIHNuYXBzaG90cyB3aXRoIE5vZGV0b29sIG9uIHRoZSBjb21tYW5kbGluZSB3ZQoraGF2ZSBzZXQgYGF1dG9fc25hcHNob3RzYCBzZXR0aW5nIHRvIGBmYWxzZWAgaW4gdGhlIGBjYXNzYW5kcmEueWFtbGAgZmlsZToKKworW3NvdXJjZSx5YW1sXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRZQU1ML2F1dG9fc25hcHNob3QueWFtbFtdCistLS0tCisKK0Fsc28gc2V0IGBzbmFwc2hvdF9iZWZvcmVfY29tcGFjdGlvbmAgdG8gYGZhbHNlYCB0byBkaXNhYmxlIGNyZWF0aW5nCitzbmFwc2hvdHMgYXV0b21hdGljYWxseSBiZWZvcmUgY29tcGFjdGlvbjoKKworW3NvdXJjZSx5YW1sXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRZQU1ML3NuYXBzaG90X2JlZm9yZV9jb21wYWN0aW9uLnlhbWxbXQorLS0tLQorCis9PT0gQ3JlYXRpbmcgU25hcHNob3RzCisKK0JlZm9yZSBjcmVhdGluZyBhbnkgc25hcHNob3RzLCBzZWFyY2ggZm9yIHNuYXBzaG90cyBhbmQgbm9uZSB3aWxsIGJlIGxpc3RlZDoKKworW3NvdXJjZSxiYXNoXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2ZpbmRfc25hcHNob3RzLnNoW10KKy0tLS0KKworV2Ugc2hhbGwgYmUgdXNpbmcgdGhlIGV4YW1wbGUga2V5c3BhY2VzIGFuZCB0YWJsZXMgdG8gY3JlYXRlIHNuYXBzaG90cy4KKworPT09PSBUYWtpbmcgU25hcHNob3RzIG9mIGFsbCBUYWJsZXMgaW4gYSBLZXlzcGFjZQorCitVc2luZyB0aGUgc3ludGF4IGFib3ZlLCBjcmVhdGUgYSBzbmFwc2hvdCBjYWxsZWQgYGNhdGFsb2cta3NgIGZvciBhbGwgdGhlIHRhYmxlcworaW4gdGhlIGBjYXRhbG9na2V5c3BhY2VgIGtleXNwYWNlOgorCitbc291cmNlLGJhc2hdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvc25hcHNob3RfYmFja3VwMi5zaFtdCistLS0tCisKK3Jlc3VsdHMgaW4KKworW3NvdXJjZSxub25lXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL3NuYXBzaG90X2JhY2t1cDIucmVzdWx0W10KKy0tLS0KKworVXNpbmcgdGhlIGBmaW5kYCBjb21tYW5kIGFib3ZlLCB0aGUgc25hcHNob3RzIGFuZCBgc25hcHNob3RzYCBkaXJlY3RvcmllcyAKK2FyZSBub3cgZm91bmQgd2l0aCBsaXN0ZWQgZmlsZXMgc2ltaWxhciB0bzoKKworW3NvdXJjZSwgcGxhaW50ZXh0XQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL3NuYXBzaG90X2JhY2t1cDJfZmluZC5yZXN1bHRbXQorLS0tLQorCitTbmFwc2hvdHMgb2YgYWxsIHRhYmxlcyBpbiBtdWx0aXBsZSBrZXlzcGFjZXMgbWF5IGJlIGNyZWF0ZWQgc2ltaWxhcmx5OgorCitbc291cmNlLGJhc2hdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvc25hcHNob3RfYm90aF9iYWNrdXBzLnNoW10KKy0tLS0KKworPT09PSBUYWtpbmcgU25hcHNob3RzIG9mIFNpbmdsZSBUYWJsZSBpbiBhIEtleXNwYWNlCisKK1RvIHRha2UgYSBzbmFwc2hvdCBvZiBhIHNpbmdsZSB0YWJsZSB0aGUgYG5vZGV0b29sIHNuYXBzaG90YCBjb21tYW5kCitzeW50YXggYmVjb21lcyBhcyBmb2xsb3dzOgorCitbc291cmNlLGJhc2hdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvc25hcHNob3Rfb25lX3RhYmxlLnNoW10KKy0tLS0KKworVXNpbmcgdGhlIHN5bnRheCBhYm92ZSwgY3JlYXRlIGEgc25hcHNob3QgZm9yIHRhYmxlIGBtYWdhemluZWAgaW4ga2V5c3BhY2UgYGNhdGFsb2drZXlzcGFjZWA6CisKK1tzb3VyY2UsYmFzaF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQkFTSC9zbmFwc2hvdF9vbmVfdGFibGUyLnNoW10KKy0tLS0KKworcmVzdWx0cyBpbgorIAorW3NvdXJjZSwgcGxhaW50ZXh0XQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL3NuYXBzaG90X29uZV90YWJsZTIucmVzdWx0W10KKy0tLS0KKworPT09PSBUYWtpbmcgU25hcHNob3Qgb2YgTXVsdGlwbGUgVGFibGVzIGZyb20gc2FtZSBLZXlzcGFjZQorCitUbyB0YWtlIHNuYXBzaG90cyBvZiBtdWx0aXBsZSB0YWJsZXMgaW4gYSBrZXlzcGFjZSB0aGUgbGlzdCBvZgorX0tleXNwYWNlLnRhYmxlXyBtdXN0IGJlIHNwZWNpZmllZCB3aXRoIG9wdGlvbiBgLS1rdC1saXN0YC4gCitGb3IgZXhhbXBsZSwgY3JlYXRlIHNuYXBzaG90cyBmb3IgdGFibGVzIGB0YCBhbmQgYHQyYCBpbiB0aGUgYGNxbGtleXNwYWNlYCBrZXlzcGFjZToKKworW3NvdXJjZSxiYXNoXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL3NuYXBzaG90X211bHRfdGFibGVzLnNoW10KKy0tLS0KKworcmVzdWx0cyBpbgorCitbc291cmNlLHBsYWludGV4dF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9zbmFwc2hvdF9tdWx0X3RhYmxlcy5yZXN1bHRbXQorLS0tLQorCitNdWx0aXBsZSBzbmFwc2hvdHMgb2YgdGhlIHNhbWUgc2V0IG9mIHRhYmxlcyBtYXkgYmUgY3JlYXRlZCBhbmQgdGFnZ2VkIHdpdGggYSBkaWZmZXJlbnQgbmFtZS4gCitBcyBhbiBleGFtcGxlLCBjcmVhdGUgYW5vdGhlciBzbmFwc2hvdCBmb3IgdGhlIHNhbWUgc2V0IG9mIHRhYmxlcyBgdGAgYW5kIGB0MmAgaW4gdGhlIGBjcWxrZXlzcGFjZWAgCitrZXlzcGFjZSBhbmQgdGFnIHRoZSBzbmFwc2hvdHMgZGlmZmVyZW50bHk6CisKK1tzb3VyY2UsYmFzaF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQkFTSC9zbmFwc2hvdF9tdWx0X3RhYmxlc19hZ2Fpbi5zaFtdCistLS0tCisKK3Jlc3VsdHMgaW4KKworW3NvdXJjZSwgcGxhaW50ZXh0XQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL3NuYXBzaG90X211bHRfdGFibGVzX2FnYWluLnJlc3VsdFtdCistLS0tCisKKz09PT0gVGFraW5nIFNuYXBzaG90IG9mIE11bHRpcGxlIFRhYmxlcyBmcm9tIERpZmZlcmVudCBLZXlzcGFjZXMKKworVG8gdGFrZSBzbmFwc2hvdHMgb2YgbXVsdGlwbGUgdGFibGVzIHRoYXQgYXJlIGluIGRpZmZlcmVudCBrZXlzcGFjZXMgdGhlCitjb21tYW5kIHN5bnRheCBpcyB0aGUgc2FtZSBhcyB3aGVuIG11bHRpcGxlIHRhYmxlcyBhcmUgaW4gdGhlIHNhbWUKK2tleXNwYWNlLiAKK0VhY2ggPGtleXNwYWNlPi48dGFibGU+IG11c3QgYmUgc3BlY2lmaWVkIHNlcGFyYXRlbHkgaW4gdGhlCitgLS1rdC1saXN0YCBvcHRpb24uIAorCitGb3IgZXhhbXBsZSwgY3JlYXRlIGEgc25hcHNob3QgZm9yIHRhYmxlIGB0YCBpbgordGhlIGBjcWxrZXlzcGFjZWAgYW5kIHRhYmxlIGBqb3VybmFsYCBpbiB0aGUgY2F0YWxvZ2tleXNwYWNlIGFuZCB0YWcgdGhlCitzbmFwc2hvdCBgbXVsdGkta3NgLgorCitbc291cmNlLGJhc2hdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvc25hcHNob3RfbXVsdF9rcy5zaFtdCistLS0tCisKK3Jlc3VsdHMgaW4KK1tzb3VyY2UsIHBsYWludGV4dF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9zbmFwc2hvdF9tdWx0X2tzLnJlc3VsdFtdCistLS0tCisKKz09PSBMaXN0aW5nIFNuYXBzaG90cworCitUbyBsaXN0IHNuYXBzaG90cyB1c2UgdGhlIGBub2RldG9vbCBsaXN0c25hcHNob3RzYCBjb21tYW5kLiBBbGwgdGhlCitzbmFwc2hvdHMgdGhhdCB3ZSBjcmVhdGVkIGluIHRoZSBwcmVjZWRpbmcgZXhhbXBsZXMgZ2V0IGxpc3RlZDoKKworW3NvdXJjZSxiYXNoXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL25vZGV0b29sX2xpc3Rfc25hcHNob3RzLnNoW10KKy0tLS0KKworcmVzdWx0cyBpbgorCitbc291cmNlLCBwbGFpbnRleHRdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvbm9kZXRvb2xfbGlzdF9zbmFwc2hvdHMucmVzdWx0W10KKy0tLS0KKworPT09IEZpbmRpbmcgU25hcHNob3RzIERpcmVjdG9yaWVzCisKK1RoZSBgc25hcHNob3RzYCBkaXJlY3RvcmllcyBtYXkgYmUgbGlzdGVkIHdpdGggYGZpbmQg4oCTbmFtZSBzbmFwc2hvdHNgCitjb21tYW5kOgorCitbc291cmNlLGJhc2hdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvZmluZF9zbmFwc2hvdHMuc2hbXQorLS0tLQorCityZXN1bHRzIGluCisKK1tzb3VyY2UsIHBsYWludGV4dF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9zbmFwc2hvdF9hbGwucmVzdWx0W10KKy0tLS0KKworVG8gbGlzdCB0aGUgc25hcHNob3RzIGZvciBhIHBhcnRpY3VsYXIgdGFibGUgZmlyc3QgY2hhbmdlIHRvIHRoZSBzbmFwc2hvdHMgZGlyZWN0b3J5IGZvciB0aGF0IHRhYmxlLiAKK0ZvciBleGFtcGxlLCBsaXN0IHRoZSBzbmFwc2hvdHMgZm9yIHRoZSBgY2F0YWxvZ2tleXNwYWNlL2pvdXJuYWxgIHRhYmxlOgorCitbc291cmNlLGJhc2hdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvZmluZF90d29fc25hcHNob3RzLnNoW10KKy0tLS0KKworcmVzdWx0cyBpbgorCitbc291cmNlLCBwbGFpbnRleHRdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvZmluZF90d29fc25hcHNob3RzLnJlc3VsdFtdCistLS0tCisKK0EgYHNuYXBzaG90c2AgZGlyZWN0b3J5IGxpc3RzIHRoZSBTU1RhYmxlIGZpbGVzIGluIHRoZSBzbmFwc2hvdC4KK0EgYHNjaGVtYS5jcWxgIGZpbGUgaXMgYWxzbyBjcmVhdGVkIGluIGVhY2ggc25hcHNob3QgdGhhdCBkZWZpbmVzIHNjaGVtYQordGhhdCBjYW4gcmVjcmVhdGUgdGhlIHRhYmxlIHdpdGggQ1FMIHdoZW4gcmVzdG9yaW5nIGZyb20gYSBzbmFwc2hvdDoKKworW3NvdXJjZSxiYXNoXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL3NuYXBzaG90X2ZpbGVzLnNoW10KKy0tLS0KKworcmVzdWx0cyBpbgorCitbc291cmNlLCBwbGFpbnRleHRdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvc25hcHNob3RfZmlsZXMucmVzdWx0W10KKy0tLS0KKworPT09IENsZWFyaW5nIFNuYXBzaG90cworCitTbmFwc2hvdHMgbWF5IGJlIGNsZWFyZWQgb3IgZGVsZXRlZCB3aXRoIHRoZSBgbm9kZXRvb2wgY2xlYXJzbmFwc2hvdGAKK2NvbW1hbmQuIEVpdGhlciBhIHNwZWNpZmljIHNuYXBzaG90IG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgb3IgdGhlIGDigJNhbGxgCitvcHRpb24gbXVzdCBiZSBzcGVjaWZpZWQuIAorCitGb3IgZXhhbXBsZSwgZGVsZXRlIGEgc25hcHNob3QgY2FsbGVkIGBtYWdhemluZWAgZnJvbSBrZXlzcGFjZSBgY3Fsa2V5c3BhY2VgOgorCitbc291cmNlLGJhc2hdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvbm9kZXRvb2xfY2xlYXJzbmFwc2hvdC5zaFtdCistLS0tCisKK29yIGRlbGV0ZSBhbGwgc25hcHNob3RzIGZyb20gYGNxbGtleXNwYWNlYCB3aXRoIHRoZSDigJNhbGwgb3B0aW9uOgorCitbc291cmNlLGJhc2hdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvbm9kZXRvb2xfY2xlYXJzbmFwc2hvdF9hbGwuc2hbXQorLS0tLQorCis9PSBJbmNyZW1lbnRhbCBCYWNrdXBzCisKK0luIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMsIHdlIHNoYWxsIGRpc2N1c3MgY29uZmlndXJpbmcgYW5kIGNyZWF0aW5nCitpbmNyZW1lbnRhbCBiYWNrdXBzLgorCis9PT0gQ29uZmlndXJpbmcgZm9yIEluY3JlbWVudGFsIEJhY2t1cHMKKworVG8gY3JlYXRlIGluY3JlbWVudGFsIGJhY2t1cHMgc2V0IGBpbmNyZW1lbnRhbF9iYWNrdXBzYCB0byBgdHJ1ZWAgaW4KK2BjYXNzYW5kcmEueWFtbGAuCisKK1tzb3VyY2UseWFtbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkWUFNTC9pbmNyZW1lbnRhbF9idXBzLnlhbWxbXQorLS0tLQorCitUaGlzIGlzIHRoZSBvbmx5IHNldHRpbmcgbmVlZGVkIHRvIGNyZWF0ZSBpbmNyZW1lbnRhbCBiYWNrdXBzLiAKK0J5IGRlZmF1bHQgYGluY3JlbWVudGFsX2JhY2t1cHNgIHNldHRpbmcgaXMgc2V0IHRvIGBmYWxzZWAgYmVjYXVzZSBhIG5ldworc2V0IG9mIFNTVGFibGUgZmlsZXMgaXMgY3JlYXRlZCBmb3IgZWFjaCBkYXRhIGZsdXNoIGFuZCBpZiBzZXZlcmFsIENRTAorc3RhdGVtZW50cyBhcmUgdG8gYmUgcnVuIHRoZSBgYmFja3Vwc2AgZGlyZWN0b3J5IGNvdWxkIGZpbGwgdXAgcXVpY2tseQorYW5kIHVzZSB1cCBzdG9yYWdlIHRoYXQgaXMgbmVlZGVkIHRvIHN0b3JlIHRhYmxlIGRhdGEuIAorSW5jcmVtZW50YWwgYmFja3VwcyBtYXkgYWxzbyBiZSBlbmFibGVkIG9uIHRoZSBjb21tYW5kIGxpbmUgd2l0aCB0aGUgbm9kZXRvb2wKK2NvbW1hbmQgYG5vZGV0b29sIGVuYWJsZWJhY2t1cGAuIAorSW5jcmVtZW50YWwgYmFja3VwcyBtYXkgYmUgZGlzYWJsZWQgd2l0aCBgbm9kZXRvb2wgZGlzYWJsZWJhY2t1cGAgY29tbWFuZC4gCitTdGF0dXMgb2YgaW5jcmVtZW50YWwgYmFja3Vwcywgd2hldGhlciB0aGV5IGFyZSBlbmFibGVkIG1heSBiZSBjaGVja2VkIHdpdGggYG5vZGV0b29sIHN0YXR1c2JhY2t1cGAuCisKKz09PSBDcmVhdGluZyBJbmNyZW1lbnRhbCBCYWNrdXBzCisKK0FmdGVyIGVhY2ggdGFibGUgaXMgY3JlYXRlZCBmbHVzaCB0aGUgdGFibGUgZGF0YSB3aXRoIGBub2RldG9vbCBmbHVzaGAKK2NvbW1hbmQuIEluY3JlbWVudGFsIGJhY2t1cHMgZ2V0IGNyZWF0ZWQuCisKK1tzb3VyY2UsYmFzaF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQkFTSC9ub2RldG9vbF9mbHVzaC5zaFtdCistLS0tCisKKz09PSBGaW5kaW5nIEluY3JlbWVudGFsIEJhY2t1cHMKKworSW5jcmVtZW50YWwgYmFja3VwcyBhcmUgY3JlYXRlZCB3aXRoaW4gdGhlIENhc3NhbmRyYeKAmXMgYGRhdGFgIGRpcmVjdG9yeQord2l0aGluIGEgdGFibGUgZGlyZWN0b3J5LiBCYWNrdXBzIG1heSBiZSBmb3VuZCB3aXRoIGZvbGxvd2luZyBjb21tYW5kLgorCitbc291cmNlLGJhc2hdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvZmluZF9iYWNrdXBzLnNoW10KKy0tLS0KK3Jlc3VsdHMgaW4KK1tzb3VyY2Usbm9uZV0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9maW5kX2JhY2t1cHMucmVzdWx0W10KKy0tLS0KKworPT09IENyZWF0aW5nIGFuIEluY3JlbWVudGFsIEJhY2t1cAorCitUaGlzIHNlY3Rpb24gZGlzY3Vzc2VzIGhvdyBpbmNyZW1lbnRhbCBiYWNrdXBzIGFyZSBjcmVhdGVkIGluIG1vcmUKK2RldGFpbCB1c2luZyB0aGUga2V5c3BhY2UgYW5kIHRhYmxlIHByZXZpb3VzbHkgY3JlYXRlZC4KKworRmx1c2ggdGhlIGtleXNwYWNlIGFuZCB0YWJsZToKKworW3NvdXJjZSxiYXNoXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL25vZGV0b29sX2ZsdXNoX3RhYmxlLnNoW10KKy0tLS0KKworQSBzZWFyY2ggZm9yIGJhY2t1cHMgYW5kIGEgYGJhY2t1cHNgIGRpcmVjdG9yeSB3aWxsIGxpc3QgYSBiYWNrdXAgZGlyZWN0b3J5LAorZXZlbiBpZiB3ZSBoYXZlIGFkZGVkIG5vIHRhYmxlIGRhdGEgeWV0LgorCitbc291cmNlLGJhc2hdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvZmluZF9iYWNrdXBzLnNoW10KKy0tLS0KKworcmVzdWx0cyBpbgorCitbc291cmNlLHBsYWludGV4dF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9maW5kX2JhY2t1cHNfdGFibGUucmVzdWx0W10KKy0tLS0KKworQ2hlY2tpbmcgdGhlIGBiYWNrdXBzYCBkaXJlY3Rvcnkgd2lsbCBzaG93IHRoYXQgdGhlcmUgYXJlIGFsc28gbm8gYmFja3VwIGZpbGVzOgorCitbc291cmNlLGJhc2hdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvY2hlY2tfYmFja3Vwcy5zaFtdCistLS0tCisKK3Jlc3VsdHMgaW4KKworW3NvdXJjZSwgcGxhaW50ZXh0XQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL25vX2J1cHMucmVzdWx0W10KKy0tLS0KKworSWYgYSByb3cgb2YgZGF0YSBpcyBhZGRlZCB0byB0aGUgZGF0YSwgcnVubmluZyB0aGUgYG5vZGV0b29sIGZsdXNoYCBjb21tYW5kIHdpbGwKK2ZsdXNoIHRoZSB0YWJsZSBkYXRhIGFuZCBhbiBpbmNyZW1lbnRhbCBiYWNrdXAgd2lsbCBiZSBjcmVhdGVkOgorCitbc291cmNlLGJhc2hdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvZmx1c2hfYW5kX2NoZWNrLnNoW10KKy0tLS0KKworcmVzdWx0cyBpbiAKKworW3NvdXJjZSwgcGxhaW50ZXh0XQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL2ZsdXNoX2FuZF9jaGVjay5yZXN1bHRbXQorLS0tLQorCitbTk9URV0KKy5ub3RlCis9PT09CitUaGUgYGJhY2t1cHNgIGRpcmVjdG9yeSBmb3IgYW55IHRhYmxlLCBzdWNoIGFzIGBjcWxrZXlzcGFjZS90YCBpcyBjcmVhdGVkIGluIHRoZQorYGRhdGFgIGRpcmVjdG9yeSBmb3IgdGhhdCB0YWJsZS4KKz09PT0KKworQWRkaW5nIGFub3RoZXIgcm93IG9mIGRhdGEgYW5kIGZsdXNoaW5nIHdpbGwgcmVzdWx0IGluIGFub3RoZXIgc2V0IG9mIGluY3JlbWVudGFsIGJhY2t1cCBmaWxlcy4KK1RoZSBTU1RhYmxlIGZpbGVzIGFyZSB0aW1lc3RhbXBlZCwgd2hpY2ggZGlzdGluZ3Vpc2hlcyB0aGUgZmlyc3QgaW5jcmVtZW50YWwgYmFja3VwIGZyb20gdGhlCitzZWNvbmQ6CisKK1tzb3VyY2Usbm9uZV0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9mbHVzaF9hbmRfY2hlY2syLnJlc3VsdFtdCistLS0tCisKKz09IFJlc3RvcmluZyBmcm9tIEluY3JlbWVudGFsIEJhY2t1cHMgYW5kIFNuYXBzaG90cworCitUaGUgdHdvIG1haW4gdG9vbHMvY29tbWFuZHMgZm9yIHJlc3RvcmluZyBhIHRhYmxlIGFmdGVyIGl0IGhhcyBiZWVuCitkcm9wcGVkIGFyZToKKworKiBzc3RhYmxlbG9hZGVyCisqIG5vZGV0b29sIHJlZnJlc2gKKworQSBzbmFwc2hvdCBjb250YWlucyBlc3NlbnRpYWxseSB0aGUgc2FtZSBzZXQgb2YgU1NUYWJsZSBmaWxlcyBhcyBhbgoraW5jcmVtZW50YWwgYmFja3VwIGRvZXMgd2l0aCBhIGZldyBhZGRpdGlvbmFsIGZpbGVzLiBBIHNuYXBzaG90IGluY2x1ZGVzCithIGBzY2hlbWEuY3FsYCBmaWxlIGZvciB0aGUgc2NoZW1hIERETCB0byBjcmVhdGUgYSB0YWJsZSBpbiBDUUwuIEEgdGFibGUKK2JhY2t1cCBkb2VzIG5vdCBpbmNsdWRlIERETCB3aGljaCBtdXN0IGJlIG9idGFpbmVkIGZyb20gYSBzbmFwc2hvdCB3aGVuCityZXN0b3JpbmcgZnJvbSBhbiBpbmNyZW1lbnRhbCBiYWNrdXAuCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL2Jsb29tX2ZpbHRlcnMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvYmxvb21fZmlsdGVycy5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL2Jsb29tX2ZpbHRlcnMuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9ibG9vbV9maWx0ZXJzLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvYnVsa19sb2FkaW5nLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL2J1bGtfbG9hZGluZy5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL2J1bGtfbG9hZGluZy5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL2J1bGtfbG9hZGluZy5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL2NkYy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9jZGMuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9jZGMuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9jZGMuYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9jb21wYWN0aW9uL2luZGV4LmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL2NvbXBhY3Rpb24vaW5kZXguYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzk1ZjAzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9jb21wYWN0aW9uL2luZGV4LmFkb2MKQEAgLTAsMCArMSwzMzYgQEAKKz0gQ29tcGFjdGlvbgorCis9PSBTdHJhdGVnaWVzCisKK1BpY2tpbmcgdGhlIHJpZ2h0IGNvbXBhY3Rpb24gc3RyYXRlZ3kgZm9yIHlvdXIgd29ya2xvYWQgd2lsbCBlbnN1cmUgdGhlCitiZXN0IHBlcmZvcm1hbmNlIGZvciBib3RoIHF1ZXJ5aW5nIGFuZCBmb3IgY29tcGFjdGlvbiBpdHNlbGYuCisKK3hyZWY6b3BlcmF0aW5nL2NvbXBhY3Rpb24vc3Rjcy5hZG9jW2BTaXplIFRpZXJlZCBDb21wYWN0aW9uIFN0cmF0ZWd5IChTVENTKWBdOjoKKyAgVGhlIGRlZmF1bHQgY29tcGFjdGlvbiBzdHJhdGVneS4gVXNlZnVsIGFzIGEgZmFsbGJhY2sgd2hlbiBvdGhlcgorICBzdHJhdGVnaWVzIGRvbid0IGZpdCB0aGUgd29ya2xvYWQuIE1vc3QgdXNlZnVsIGZvciBub24gcHVyZSB0aW1lCisgIHNlcmllcyB3b3JrbG9hZHMgd2l0aCBzcGlubmluZyBkaXNrcywgb3Igd2hlbiB0aGUgSS9PIGZyb20gYExDU2AKKyAgaXMgdG9vIGhpZ2guCit4cmVmOm9wZXJhdGluZy9jb21wYWN0aW9uL2xjcy5hZG9jW2BMZXZlbGVkIENvbXBhY3Rpb24gU3RyYXRlZ3kgKExDUylgXTo6CisgIExldmVsZWQgQ29tcGFjdGlvbiBTdHJhdGVneSAoTENTKSBpcyBvcHRpbWl6ZWQgZm9yIHJlYWQgaGVhdnkKKyAgd29ya2xvYWRzLCBvciB3b3JrbG9hZHMgd2l0aCBsb3RzIG9mIHVwZGF0ZXMgYW5kIGRlbGV0ZXMuIEl0IGlzIG5vdCBhCisgIGdvb2QgY2hvaWNlIGZvciBpbW11dGFibGUgdGltZSBzZXJpZXMgZGF0YS4KK3hyZWY6b3BlcmF0aW5nL2NvbXBhY3Rpb24vdHdjcy5hZG9jW2BUaW1lIFdpbmRvdyBDb21wYWN0aW9uIFN0cmF0ZWd5IChUV0NTKWBdOjoKKyAgVGltZSBXaW5kb3cgQ29tcGFjdGlvbiBTdHJhdGVneSBpcyBkZXNpZ25lZCBmb3IgVFRMJ2VkLCBtb3N0bHkKKyAgaW1tdXRhYmxlIHRpbWUgc2VyaWVzIGRhdGEuCisKKz09IFR5cGVzIG9mIGNvbXBhY3Rpb24KKworVGhlIGNvbmNlcHQgb2YgY29tcGFjdGlvbiBpcyB1c2VkIGZvciBkaWZmZXJlbnQga2luZHMgb2Ygb3BlcmF0aW9ucyBpbgorQ2Fzc2FuZHJhLCB0aGUgY29tbW9uIHRoaW5nIGFib3V0IHRoZXNlIG9wZXJhdGlvbnMgaXMgdGhhdCBpdCB0YWtlcyBvbmUKK29yIG1vcmUgU1NUYWJsZXMgYW5kIG91dHB1dCBuZXcgU1NUYWJsZXMuIFRoZSB0eXBlcyBvZiBjb21wYWN0aW9ucyBhcmU6CisKK01pbm9yIGNvbXBhY3Rpb246OgorICB0cmlnZ2VyZWQgYXV0b21hdGljYWxseSBpbiBDYXNzYW5kcmEuCitNYWpvciBjb21wYWN0aW9uOjoKKyAgYSB1c2VyIGV4ZWN1dGVzIGEgY29tcGFjdGlvbiBvdmVyIGFsbCBTU1RhYmxlcyBvbiB0aGUgbm9kZS4KK1VzZXIgZGVmaW5lZCBjb21wYWN0aW9uOjoKKyAgYSB1c2VyIHRyaWdnZXJzIGEgY29tcGFjdGlvbiBvbiBhIGdpdmVuIHNldCBvZiBTU1RhYmxlcy4KK1NjcnViOjoKKyAgdHJ5IHRvIGZpeCBhbnkgYnJva2VuIFNTVGFibGVzLiBUaGlzIGNhbiBhY3R1YWxseSByZW1vdmUgdmFsaWQgZGF0YSBpZgorICB0aGF0IGRhdGEgaXMgY29ycnVwdGVkLCBpZiB0aGF0IGhhcHBlbnMgeW91IHdpbGwgbmVlZCB0byBydW4gYSBmdWxsCisgIHJlcGFpciBvbiB0aGUgbm9kZS4KK1VwZ3JhZGVTU1RhYmxlczo6CisgIHVwZ3JhZGUgU1NUYWJsZXMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uLiBSdW4gdGhpcyBhZnRlciB1cGdyYWRpbmcgdG8gYQorICBuZXcgbWFqb3IgdmVyc2lvbi4KK0NsZWFudXA6OgorICByZW1vdmUgYW55IHJhbmdlcyB0aGlzIG5vZGUgZG9lcyBub3Qgb3duIGFueW1vcmUsIHR5cGljYWxseSB0cmlnZ2VyZWQKKyAgb24gbmVpZ2hib3VyaW5nIG5vZGVzIGFmdGVyIGEgbm9kZSBoYXMgYmVlbiBib290c3RyYXBwZWQgc2luY2UgdGhhdAorICBub2RlIHdpbGwgdGFrZSBvd25lcnNoaXAgb2Ygc29tZSByYW5nZXMgZnJvbSB0aG9zZSBub2Rlcy4KK1NlY29uZGFyeSBpbmRleCByZWJ1aWxkOjoKKyAgcmVidWlsZCB0aGUgc2Vjb25kYXJ5IGluZGV4ZXMgb24gdGhlIG5vZGUuCitBbnRpY29tcGFjdGlvbjo6CisgIGFmdGVyIHJlcGFpciB0aGUgcmFuZ2VzIHRoYXQgd2VyZSBhY3R1YWxseSByZXBhaXJlZCBhcmUgc3BsaXQgb3V0IG9mCisgIHRoZSBTU1RhYmxlcyB0aGF0IGV4aXN0ZWQgd2hlbiByZXBhaXIgc3RhcnRlZC4KK1N1YiByYW5nZSBjb21wYWN0aW9uOjoKKyAgSXQgaXMgcG9zc2libGUgdG8gb25seSBjb21wYWN0IGEgZ2l2ZW4gc3ViIHJhbmdlIC0gdGhpcyBjb3VsZCBiZQorICB1c2VmdWwgaWYgeW91IGtub3cgYSB0b2tlbiB0aGF0IGhhcyBiZWVuIG1pc2JlaGF2aW5nIC0gZWl0aGVyCisgIGdhdGhlcmluZyBtYW55IHVwZGF0ZXMgb3IgbWFueSBkZWxldGVzLgorICAoYG5vZGV0b29sIGNvbXBhY3QgLXN0IHggLWV0IHlgKSB3aWxsIHBpY2sgYWxsIFNTVGFibGVzIGNvbnRhaW5pbmcgdGhlCisgIHJhbmdlIGJldHdlZW4geCBhbmQgeSBhbmQgaXNzdWUgYSBjb21wYWN0aW9uIGZvciB0aG9zZSBTU1RhYmxlcy4gRm9yCisgIFNUQ1MgdGhpcyB3aWxsIG1vc3QgbGlrZWx5IGluY2x1ZGUgYWxsIFNTVGFibGVzIGJ1dCB3aXRoIExDUyBpdCBjYW4KKyAgaXNzdWUgdGhlIGNvbXBhY3Rpb24gZm9yIGEgc3Vic2V0IG9mIHRoZSBTU1RhYmxlcy4gV2l0aCBMQ1MgdGhlCisgIHJlc3VsdGluZyBzc3RhYmxlIHdpbGwgZW5kIHVwIGluIEwwLgorCis9PSBXaGVuIGlzIGEgbWlub3IgY29tcGFjdGlvbiB0cmlnZ2VyZWQ/CisKKyogV2hlbiBhbiBzc3RhYmxlIGlzIGFkZGVkIHRvIHRoZSBub2RlIHRocm91Z2ggZmx1c2hpbmcvc3RyZWFtaW5nCisqIFdoZW4gYXV0b2NvbXBhY3Rpb24gaXMgZW5hYmxlZCBhZnRlciBiZWluZyBkaXNhYmxlZCAoYG5vZGV0b29sIGVuYWJsZWF1dG9jb21wYWN0aW9uYCkgCisqIFdoZW4gY29tcGFjdGlvbiBhZGRzIG5ldyBTU1RhYmxlcyAKKyogQSBjaGVjayBmb3IgbmV3IG1pbm9yIGNvbXBhY3Rpb25zIGV2ZXJ5IDUgbWludXRlcworCis9PSBNZXJnaW5nIFNTVGFibGVzCisKK0NvbXBhY3Rpb24gaXMgYWJvdXQgbWVyZ2luZyBTU1RhYmxlcywgc2luY2UgcGFydGl0aW9ucyBpbiBTU1RhYmxlcyBhcmUKK3NvcnRlZCBiYXNlZCBvbiB0aGUgaGFzaCBvZiB0aGUgcGFydGl0aW9uIGtleSBpdCBpcyBwb3NzaWJsZSB0bworZWZmaWNpZW50bHkgbWVyZ2Ugc2VwYXJhdGUgU1NUYWJsZXMuIENvbnRlbnQgb2YgZWFjaCBwYXJ0aXRpb24gaXMgYWxzbworc29ydGVkIHNvIGVhY2ggcGFydGl0aW9uIGNhbiBiZSBtZXJnZWQgZWZmaWNpZW50bHkuCisKKz09IFRvbWJzdG9uZXMgYW5kIEdhcmJhZ2UgQ29sbGVjdGlvbiAoR0MpIEdyYWNlCisKKz09PSBXaHkgVG9tYnN0b25lcworCitXaGVuIGEgZGVsZXRlIHJlcXVlc3QgaXMgcmVjZWl2ZWQgYnkgQ2Fzc2FuZHJhIGl0IGRvZXMgbm90IGFjdHVhbGx5CityZW1vdmUgdGhlIGRhdGEgZnJvbSB0aGUgdW5kZXJseWluZyBzdG9yZS4gSW5zdGVhZCBpdCB3cml0ZXMgYSBzcGVjaWFsCitwaWVjZSBvZiBkYXRhIGtub3duIGFzIGEgdG9tYnN0b25lLiBUaGUgVG9tYnN0b25lIHJlcHJlc2VudHMgdGhlIGRlbGV0ZQorYW5kIGNhdXNlcyBhbGwgdmFsdWVzIHdoaWNoIG9jY3VycmVkIGJlZm9yZSB0aGUgdG9tYnN0b25lIHRvIG5vdCBhcHBlYXIKK2luIHF1ZXJpZXMgdG8gdGhlIGRhdGFiYXNlLiBUaGlzIGFwcHJvYWNoIGlzIHVzZWQgaW5zdGVhZCBvZiByZW1vdmluZwordmFsdWVzIGJlY2F1c2Ugb2YgdGhlIGRpc3RyaWJ1dGVkIG5hdHVyZSBvZiBDYXNzYW5kcmEuCisKKz09PSBEZWxldGVzIHdpdGhvdXQgdG9tYnN0b25lcworCitJbWFnaW5lIGEgdGhyZWUgbm9kZSBjbHVzdGVyIHdoaWNoIGhhcyB0aGUgdmFsdWUgW0FdIHJlcGxpY2F0ZWQgdG8gZXZlcnkKK25vZGUuOgorCitbc291cmNlLG5vbmVdCistLS0tCitbQV0sIFtBXSwgW0FdCistLS0tCisKK0lmIG9uZSBvZiB0aGUgbm9kZXMgZmFpbHMgYW5kIGFuZCBvdXIgZGVsZXRlIG9wZXJhdGlvbiBvbmx5IHJlbW92ZXMKK2V4aXN0aW5nIHZhbHVlcyB3ZSBjYW4gZW5kIHVwIHdpdGggYSBjbHVzdGVyIHRoYXQgbG9va3MgbGlrZToKKworW3NvdXJjZSxub25lXQorLS0tLQorW10sIFtdLCBbQV0KKy0tLS0KKworVGhlbiBhIHJlcGFpciBvcGVyYXRpb24gd291bGQgcmVwbGFjZSB0aGUgdmFsdWUgb2YgW0FdIGJhY2sgb250byB0aGUgdHdvCitub2RlcyB3aGljaCBhcmUgbWlzc2luZyB0aGUgdmFsdWUuOgorCitbc291cmNlLG5vbmVdCistLS0tCitbQV0sIFtBXSwgW0FdCistLS0tCisKK1RoaXMgd291bGQgY2F1c2Ugb3VyIGRhdGEgdG8gYmUgcmVzdXJyZWN0ZWQgZXZlbiB0aG91Z2ggaXQgaGFkIGJlZW4KK2RlbGV0ZWQuCisKKz09PSBEZWxldGVzIHdpdGggVG9tYnN0b25lcworCitTdGFydGluZyBhZ2FpbiB3aXRoIGEgdGhyZWUgbm9kZSBjbHVzdGVyIHdoaWNoIGhhcyB0aGUgdmFsdWUgW0FdCityZXBsaWNhdGVkIHRvIGV2ZXJ5IG5vZGUuOgorCitbc291cmNlLG5vbmVdCistLS0tCitbQV0sIFtBXSwgW0FdCistLS0tCisKK0lmIGluc3RlYWQgb2YgcmVtb3ZpbmcgZGF0YSB3ZSBhZGQgYSB0b21ic3RvbmUgcmVjb3JkLCBvdXIgc2luZ2xlIG5vZGUKK2ZhaWx1cmUgc2l0dWF0aW9uIHdpbGwgbG9vayBsaWtlIHRoaXMuOgorCitbc291cmNlLG5vbmVdCistLS0tCitbQSwgVG9tYnN0b25lW0FdXSwgW0EsIFRvbWJzdG9uZVtBXV0sIFtBXQorLS0tLQorCitOb3cgd2hlbiB3ZSBpc3N1ZSBhIHJlcGFpciB0aGUgVG9tYnN0b25lIHdpbGwgYmUgY29waWVkIHRvIHRoZSByZXBsaWNhLAorcmF0aGVyIHRoYW4gdGhlIGRlbGV0ZWQgZGF0YSBiZWluZyByZXN1cnJlY3RlZC46CisKK1tzb3VyY2Usbm9uZV0KKy0tLS0KK1tBLCBUb21ic3RvbmVbQV1dLCBbQSwgVG9tYnN0b25lW0FdXSwgW0EsIFRvbWJzdG9uZVtBXV0KKy0tLS0KKworT3VyIHJlcGFpciBvcGVyYXRpb24gd2lsbCBjb3JyZWN0bHkgcHV0IHRoZSBzdGF0ZSBvZiB0aGUgc3lzdGVtIHRvIHdoYXQKK3dlIGV4cGVjdCB3aXRoIHRoZSByZWNvcmQgW0FdIG1hcmtlZCBhcyBkZWxldGVkIG9uIGFsbCBub2Rlcy4gVGhpcyBkb2VzCittZWFuIHdlIHdpbGwgZW5kIHVwIGFjY3J1aW5nIFRvbWJzdG9uZXMgd2hpY2ggd2lsbCBwZXJtYW5lbnRseQorYWNjdW11bGF0ZSBkaXNrIHNwYWNlLiBUbyBhdm9pZCBrZWVwaW5nIHRvbWJzdG9uZXMgZm9yZXZlciB3ZSBoYXZlIGEKK3BhcmFtZXRlciBrbm93biBhcyBgZ2NfZ3JhY2Vfc2Vjb25kc2AgZm9yIGV2ZXJ5IHRhYmxlIGluIENhc3NhbmRyYS4KKworPT09IFRoZSBnY19ncmFjZV9zZWNvbmRzIHBhcmFtZXRlciBhbmQgVG9tYnN0b25lIFJlbW92YWwKKworVGhlIHRhYmxlIGxldmVsIGBnY19ncmFjZV9zZWNvbmRzYCBwYXJhbWV0ZXIgY29udHJvbHMgaG93IGxvbmcgQ2Fzc2FuZHJhCit3aWxsIHJldGFpbiB0b21ic3RvbmVzIHRocm91Z2ggY29tcGFjdGlvbiBldmVudHMgYmVmb3JlIGZpbmFsbHkgcmVtb3ZpbmcKK3RoZW0uIFRoaXMgZHVyYXRpb24gc2hvdWxkIGRpcmVjdGx5IHJlZmxlY3QgdGhlIGFtb3VudCBvZiB0aW1lIGEgdXNlcgorZXhwZWN0cyB0byBhbGxvdyBiZWZvcmUgcmVjb3ZlcmluZyBhIGZhaWxlZCBub2RlLiBBZnRlcgorYGdjX2dyYWNlX3NlY29uZHNgIGhhcyBleHBpcmVkIHRoZSB0b21ic3RvbmUgbWF5IGJlIHJlbW92ZWQgKG1lYW5pbmcKK3RoZXJlIHdpbGwgbm8gbG9uZ2VyIGJlIGFueSByZWNvcmQgdGhhdCBhIGNlcnRhaW4gcGllY2Ugb2YgZGF0YSB3YXMKK2RlbGV0ZWQpLCBidXQgYXMgYSB0b21ic3RvbmUgY2FuIGxpdmUgaW4gb25lIHNzdGFibGUgYW5kIHRoZSBkYXRhIGl0Citjb3ZlcnMgaW4gYW5vdGhlciwgYSBjb21wYWN0aW9uIG11c3QgYWxzbyBpbmNsdWRlIGJvdGggc3N0YWJsZSBmb3IgYQordG9tYnN0b25lIHRvIGJlIHJlbW92ZWQuIE1vcmUgcHJlY2lzZWx5LCB0byBiZSBhYmxlIHRvIGRyb3AgYW4gYWN0dWFsCit0b21ic3RvbmUgdGhlIGZvbGxvd2luZyBuZWVkcyB0byBiZSB0cnVlOworCisqIFRoZSB0b21ic3RvbmUgbXVzdCBiZSBvbGRlciB0aGFuIGBnY19ncmFjZV9zZWNvbmRzYAorKiBJZiBwYXJ0aXRpb24gWCBjb250YWlucyB0aGUgdG9tYnN0b25lLCB0aGUgc3N0YWJsZSBjb250YWluaW5nIHRoZQorcGFydGl0aW9uIHBsdXMgYWxsIFNTVGFibGVzIGNvbnRhaW5pbmcgZGF0YSBvbGRlciB0aGFuIHRoZSB0b21ic3RvbmUKK2NvbnRhaW5pbmcgWCBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBzYW1lIGNvbXBhY3Rpb24uIFdlIGRvbid0IG5lZWQgdG8KK2NhcmUgaWYgdGhlIHBhcnRpdGlvbiBpcyBpbiBhbiBzc3RhYmxlIGlmIHdlIGNhbiBndWFyYW50ZWUgdGhhdCBhbGwgZGF0YQoraW4gdGhhdCBzc3RhYmxlIGlzIG5ld2VyIHRoYW4gdGhlIHRvbWJzdG9uZS4gSWYgdGhlIHRvbWJzdG9uZSBpcyBvbGRlcgordGhhbiB0aGUgZGF0YSBpdCBjYW5ub3Qgc2hhZG93IHRoYXQgZGF0YS4KKyogSWYgdGhlIG9wdGlvbiBgb25seV9wdXJnZV9yZXBhaXJlZF90b21ic3RvbmVzYCBpcyBlbmFibGVkLCB0b21ic3RvbmVzCithcmUgb25seSByZW1vdmVkIGlmIHRoZSBkYXRhIGhhcyBhbHNvIGJlZW4gcmVwYWlyZWQuCisKK0lmIGEgbm9kZSByZW1haW5zIGRvd24gb3IgZGlzY29ubmVjdGVkIGZvciBsb25nZXIgdGhhbgorYGdjX2dyYWNlX3NlY29uZHNgIGl0J3MgZGVsZXRlZCBkYXRhIHdpbGwgYmUgcmVwYWlyZWQgYmFjayB0byB0aGUgb3RoZXIKK25vZGVzIGFuZCByZS1hcHBlYXIgaW4gdGhlIGNsdXN0ZXIuIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzIGluIHRoZQorIkRlbGV0ZXMgd2l0aG91dCBUb21ic3RvbmVzIiBzZWN0aW9uLiBOb3RlIHRoYXQgdG9tYnN0b25lcyB3aWxsIG5vdCBiZQorcmVtb3ZlZCB1bnRpbCBhIGNvbXBhY3Rpb24gZXZlbnQgZXZlbiBpZiBgZ2NfZ3JhY2Vfc2Vjb25kc2AgaGFzIGVsYXBzZWQuCisKK1RoZSBkZWZhdWx0IHZhbHVlIGZvciBgZ2NfZ3JhY2Vfc2Vjb25kc2AgaXMgODY0MDAwIHdoaWNoIGlzIGVxdWl2YWxlbnQKK3RvIDEwIGRheXMuIFRoaXMgY2FuIGJlIHNldCB3aGVuIGNyZWF0aW5nIG9yIGFsdGVyaW5nIGEgdGFibGUgdXNpbmcKK2BXSVRIIGdjX2dyYWNlX3NlY29uZHNgLgorCis9PSBUVEwKKworRGF0YSBpbiBDYXNzYW5kcmEgY2FuIGhhdmUgYW4gYWRkaXRpb25hbCBwcm9wZXJ0eSBjYWxsZWQgdGltZSB0byBsaXZlIC0KK3RoaXMgaXMgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGRyb3AgZGF0YSB0aGF0IGhhcyBleHBpcmVkIG9uY2UgdGhlIHRpbWUKK2lzIHJlYWNoZWQuIE9uY2UgdGhlIFRUTCBoYXMgZXhwaXJlZCB0aGUgZGF0YSBpcyBjb252ZXJ0ZWQgdG8gYQordG9tYnN0b25lIHdoaWNoIHN0YXlzIGFyb3VuZCBmb3IgYXQgbGVhc3QgYGdjX2dyYWNlX3NlY29uZHNgLiBOb3RlIHRoYXQKK2lmIHlvdSBtaXggZGF0YSB3aXRoIFRUTCBhbmQgZGF0YSB3aXRob3V0IFRUTCAob3IganVzdCBkaWZmZXJlbnQgbGVuZ3RoCitvZiB0aGUgVFRMKSBDYXNzYW5kcmEgd2lsbCBoYXZlIGEgaGFyZCB0aW1lIGRyb3BwaW5nIHRoZSB0b21ic3RvbmVzCitjcmVhdGVkIHNpbmNlIHRoZSBwYXJ0aXRpb24gbWlnaHQgc3BhbiBtYW55IFNTVGFibGVzIGFuZCBub3QgYWxsIGFyZQorY29tcGFjdGVkIGF0IG9uY2UuCisKKz09IEZ1bGx5IGV4cGlyZWQgU1NUYWJsZXMKKworSWYgYW4gU1NUYWJsZSBjb250YWlucyBvbmx5IHRvbWJzdG9uZXMgYW5kIGl0IGlzIGd1YXJhbnRlZWQgdGhhdAorU1NUYWJsZSBpcyBub3Qgc2hhZG93aW5nIGRhdGEgaW4gYW55IG90aGVyIFNTVGFibGUsIHRoZW4gdGhlIGNvbXBhY3Rpb24gY2FuIGRyb3AKK3RoYXQgU1NUYWJsZS4gSWYgeW91IHNlZSBTU1RhYmxlcyB3aXRoIG9ubHkgdG9tYnN0b25lcyAobm90ZSB0aGF0IFRUTC1lZAorZGF0YSBpcyBjb25zaWRlcmVkIHRvbWJzdG9uZXMgb25jZSB0aGUgdGltZS10by1saXZlIGhhcyBleHBpcmVkKSwgYnV0IGl0CitpcyBub3QgYmVpbmcgZHJvcHBlZCBieSBjb21wYWN0aW9uLCBpdCBpcyBsaWtlbHkgdGhhdCBvdGhlciBTU1RhYmxlcworY29udGFpbiBvbGRlciBkYXRhLiBUaGVyZSBpcyBhIHRvb2wgY2FsbGVkIGBzc3RhYmxlZXhwaXJlZGJsb2NrZXJzYCB0aGF0Cit3aWxsIGxpc3Qgd2hpY2ggU1NUYWJsZXMgYXJlIGRyb3BwYWJsZSBhbmQgd2hpY2ggYXJlIGJsb2NraW5nIHRoZW0gZnJvbQorYmVpbmcgZHJvcHBlZC4gV2l0aCBgVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneWAgaXQKK2lzIHBvc3NpYmxlIHRvIHJlbW92ZSB0aGUgZ3VhcmFudGVlIChub3QgY2hlY2sgZm9yIHNoYWRvd2luZyBkYXRhKSBieQorZW5hYmxpbmcgYHVuc2FmZV9hZ2dyZXNzaXZlX3NzdGFibGVfZXhwaXJhdGlvbmAuCisKKz09IFJlcGFpcmVkL3VucmVwYWlyZWQgZGF0YQorCitXaXRoIGluY3JlbWVudGFsIHJlcGFpcnMgQ2Fzc2FuZHJhIG11c3Qga2VlcCB0cmFjayBvZiB3aGF0IGRhdGEgaXMKK3JlcGFpcmVkIGFuZCB3aGF0IGRhdGEgaXMgdW5yZXBhaXJlZC4gV2l0aCBhbnRpY29tcGFjdGlvbiByZXBhaXJlZCBkYXRhCitpcyBzcGxpdCBvdXQgaW50byByZXBhaXJlZCBhbmQgdW5yZXBhaXJlZCBTU1RhYmxlcy4gVG8gYXZvaWQgbWl4aW5nIHVwCit0aGUgZGF0YSBhZ2FpbiBzZXBhcmF0ZSBjb21wYWN0aW9uIHN0cmF0ZWd5IGluc3RhbmNlcyBhcmUgcnVuIG9uIHRoZSB0d28KK3NldHMgb2YgZGF0YSwgZWFjaCBpbnN0YW5jZSBvbmx5IGtub3dpbmcgYWJvdXQgZWl0aGVyIHRoZSByZXBhaXJlZCBvcgordGhlIHVucmVwYWlyZWQgU1NUYWJsZXMuIFRoaXMgbWVhbnMgdGhhdCBpZiB5b3Ugb25seSBydW4gaW5jcmVtZW50YWwKK3JlcGFpciBvbmNlIGFuZCB0aGVuIG5ldmVyIGFnYWluLCB5b3UgbWlnaHQgaGF2ZSB2ZXJ5IG9sZCBkYXRhIGluIHRoZQorcmVwYWlyZWQgU1NUYWJsZXMgdGhhdCBibG9jayBjb21wYWN0aW9uIGZyb20gZHJvcHBpbmcgdG9tYnN0b25lcyBpbiB0aGUKK3VucmVwYWlyZWQgKHByb2JhYmx5IG5ld2VyKSBTU1RhYmxlcy4KKworPT0gRGF0YSBkaXJlY3RvcmllcworCitTaW5jZSB0b21ic3RvbmVzIGFuZCBkYXRhIGNhbiBsaXZlIGluIGRpZmZlcmVudCBTU1RhYmxlcyBpdCBpcyBpbXBvcnRhbnQKK3RvIHJlYWxpemUgdGhhdCBsb3NpbmcgYW4gc3N0YWJsZSBtaWdodCBsZWFkIHRvIGRhdGEgYmVjb21pbmcgbGl2ZSBhZ2FpbgorLSB0aGUgbW9zdCBjb21tb24gd2F5IG9mIGxvc2luZyBTU1RhYmxlcyBpcyB0byBoYXZlIGEgaGFyZCBkcml2ZSBicmVhaworZG93bi4gVG8gYXZvaWQgbWFraW5nIGRhdGEgbGl2ZSB0b21ic3RvbmVzIGFuZCBhY3R1YWwgZGF0YSBhcmUgYWx3YXlzIGluCit0aGUgc2FtZSBkYXRhIGRpcmVjdG9yeS4gVGhpcyB3YXksIGlmIGEgZGlzayBpcyBsb3N0LCBhbGwgdmVyc2lvbnMgb2YgYQorcGFydGl0aW9uIGFyZSBsb3N0IGFuZCBubyBkYXRhIGNhbiBnZXQgdW5kZWxldGVkLiBUbyBhY2hpZXZlIHRoaXMgYQorY29tcGFjdGlvbiBzdHJhdGVneSBpbnN0YW5jZSBwZXIgZGF0YSBkaXJlY3RvcnkgaXMgcnVuIGluIGFkZGl0aW9uIHRvCit0aGUgY29tcGFjdGlvbiBzdHJhdGVneSBpbnN0YW5jZXMgY29udGFpbmluZyByZXBhaXJlZC91bnJlcGFpcmVkIGRhdGEsCit0aGlzIG1lYW5zIHRoYXQgaWYgeW91IGhhdmUgNCBkYXRhIGRpcmVjdG9yaWVzIHRoZXJlIHdpbGwgYmUgOAorY29tcGFjdGlvbiBzdHJhdGVneSBpbnN0YW5jZXMgcnVubmluZy4gVGhpcyBoYXMgYSBmZXcgbW9yZSBiZW5lZml0cyB0aGFuCitqdXN0IGF2b2lkaW5nIGRhdGEgZ2V0dGluZyB1bmRlbGV0ZWQ6CisKKyogSXQgaXMgcG9zc2libGUgdG8gcnVuIG1vcmUgY29tcGFjdGlvbnMgaW4gcGFyYWxsZWwgLSBsZXZlbGVkCitjb21wYWN0aW9uIHdpbGwgaGF2ZSBzZXZlcmFsIHRvdGFsbHkgc2VwYXJhdGUgbGV2ZWxpbmdzIGFuZCBlYWNoIG9uZSBjYW4KK3J1biBjb21wYWN0aW9ucyBpbmRlcGVuZGVudGx5IGZyb20gdGhlIG90aGVycy4KKyogVXNlcnMgY2FuIGJhY2t1cCBhbmQgcmVzdG9yZSBhIHNpbmdsZSBkYXRhIGRpcmVjdG9yeS4KKyogTm90ZSB0aG91Z2ggdGhhdCBjdXJyZW50bHkgYWxsIGRhdGEgZGlyZWN0b3JpZXMgYXJlIGNvbnNpZGVyZWQgZXF1YWwsCitzbyBpZiB5b3UgaGF2ZSBhIHRpbnkgZGlzayBhbmQgYSBiaWcgZGlzayBiYWNraW5nIHR3byBkYXRhIGRpcmVjdG9yaWVzLAordGhlIGJpZyBvbmUgd2lsbCBiZSBsaW1pdGVkIHRoZSBieSB0aGUgc21hbGwgb25lLiBPbmUgd29yayBhcm91bmQgdG8KK3RoaXMgaXMgdG8gY3JlYXRlIG1vcmUgZGF0YSBkaXJlY3RvcmllcyBiYWNrZWQgYnkgdGhlIGJpZyBkaXNrLgorCis9PSBTaW5nbGUgc3N0YWJsZSB0b21ic3RvbmUgY29tcGFjdGlvbgorCitXaGVuIGFuIHNzdGFibGUgaXMgd3JpdHRlbiBhIGhpc3RvZ3JhbSB3aXRoIHRoZSB0b21ic3RvbmUgZXhwaXJ5IHRpbWVzCitpcyBjcmVhdGVkIGFuZCB0aGlzIGlzIHVzZWQgdG8gdHJ5IHRvIGZpbmQgU1NUYWJsZXMgd2l0aCB2ZXJ5IG1hbnkKK3RvbWJzdG9uZXMgYW5kIHJ1biBzaW5nbGUgc3N0YWJsZSBjb21wYWN0aW9uIG9uIHRoYXQgc3N0YWJsZSBpbiBob3BlIG9mCitiZWluZyBhYmxlIHRvIGRyb3AgdG9tYnN0b25lcyBpbiB0aGF0IHNzdGFibGUuIEJlZm9yZSBzdGFydGluZyB0aGlzIGl0CitpcyBhbHNvIGNoZWNrZWQgaG93IGxpa2VseSBpdCBpcyB0aGF0IGFueSB0b21ic3RvbmVzIHdpbGwgYWN0dWFsbHkgd2lsbAorYmUgYWJsZSB0byBiZSBkcm9wcGVkIGhvdyBtdWNoIHRoaXMgc3N0YWJsZSBvdmVybGFwcyB3aXRoIG90aGVyCitTU1RhYmxlcy4gVG8gYXZvaWQgbW9zdCBvZiB0aGVzZSBjaGVja3MgdGhlIGNvbXBhY3Rpb24gb3B0aW9uCitgdW5jaGVja2VkX3RvbWJzdG9uZV9jb21wYWN0aW9uYCBjYW4gYmUgZW5hYmxlZC4KKworW1tjb21wYWN0aW9uLW9wdGlvbnNdXQorPT0gQ29tbW9uIG9wdGlvbnMKKworVGhlcmUgaXMgYSBudW1iZXIgb2YgY29tbW9uIG9wdGlvbnMgZm9yIGFsbCB0aGUgY29tcGFjdGlvbiBzdHJhdGVnaWVzOworCitgZW5hYmxlZGAgKGRlZmF1bHQ6IHRydWUpOjoKKyAgV2hldGhlciBtaW5vciBjb21wYWN0aW9ucyBzaG91bGQgcnVuLiBOb3RlIHRoYXQgeW91IGNhbiBoYXZlCisgICdlbmFibGVkJzogdHJ1ZSBhcyBhIGNvbXBhY3Rpb24gb3B0aW9uIGFuZCB0aGVuIGRvICdub2RldG9vbAorICBlbmFibGVhdXRvY29tcGFjdGlvbicgdG8gc3RhcnQgcnVubmluZyBjb21wYWN0aW9ucy4KK2B0b21ic3RvbmVfdGhyZXNob2xkYCAoZGVmYXVsdDogMC4yKTo6CisgIEhvdyBtdWNoIG9mIHRoZSBzc3RhYmxlIHNob3VsZCBiZSB0b21ic3RvbmVzIGZvciB1cyB0byBjb25zaWRlciBkb2luZworICBhIHNpbmdsZSBzc3RhYmxlIGNvbXBhY3Rpb24gb2YgdGhhdCBzc3RhYmxlLgorYHRvbWJzdG9uZV9jb21wYWN0aW9uX2ludGVydmFsYCAoZGVmYXVsdDogODY0MDBzICgxIGRheSkpOjoKKyAgU2luY2UgaXQgbWlnaHQgbm90IGJlIHBvc3NpYmxlIHRvIGRyb3AgYW55IHRvbWJzdG9uZXMgd2hlbiBkb2luZyBhCisgIHNpbmdsZSBzc3RhYmxlIGNvbXBhY3Rpb24gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBvbmUgc3N0YWJsZSBpcyBub3QKKyAgY29uc3RhbnRseSBnZXR0aW5nIHJlY29tcGFjdGVkIC0gdGhpcyBvcHRpb24gc3RhdGVzIGhvdyBvZnRlbiB3ZQorICBzaG91bGQgdHJ5IGZvciBhIGdpdmVuIHNzdGFibGUuCitgbG9nX2FsbGAgKGRlZmF1bHQ6IGZhbHNlKTo6CisgIE5ldyBkZXRhaWxlZCBjb21wYWN0aW9uIGxvZ2dpbmcsIHNlZQorICBgYmVsb3cgPGRldGFpbGVkLWNvbXBhY3Rpb24tbG9nZ2luZz5gLgorYHVuY2hlY2tlZF90b21ic3RvbmVfY29tcGFjdGlvbmAgKGRlZmF1bHQ6IGZhbHNlKTo6CisgIFRoZSBzaW5nbGUgc3N0YWJsZSBjb21wYWN0aW9uIGhhcyBxdWl0ZSBzdHJpY3QgY2hlY2tzIGZvciB3aGV0aGVyIGl0CisgIHNob3VsZCBiZSBzdGFydGVkLCB0aGlzIG9wdGlvbiBkaXNhYmxlcyB0aG9zZSBjaGVja3MgYW5kIGZvciBzb21lCisgIHVzZWNhc2VzIHRoaXMgbWlnaHQgYmUgbmVlZGVkLiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBjaGFuZ2UgYW55dGhpbmcKKyAgZm9yIHRoZSBhY3R1YWwgY29tcGFjdGlvbiwgdG9tYnN0b25lcyBhcmUgb25seSBkcm9wcGVkIGlmIGl0IGlzIHNhZmUKKyAgdG8gZG8gc28gLSBpdCBtaWdodCBqdXN0IHJld3JpdGUgYW4gc3N0YWJsZSB3aXRob3V0IGJlaW5nIGFibGUgdG8gZHJvcAorICBhbnkgdG9tYnN0b25lcy4KK2Bvbmx5X3B1cmdlX3JlcGFpcmVkX3RvbWJzdG9uZWAgKGRlZmF1bHQ6IGZhbHNlKTo6CisgIE9wdGlvbiB0byBlbmFibGUgdGhlIGV4dHJhIHNhZmV0eSBvZiBtYWtpbmcgc3VyZSB0aGF0IHRvbWJzdG9uZXMgYXJlCisgIG9ubHkgZHJvcHBlZCBpZiB0aGUgZGF0YSBoYXMgYmVlbiByZXBhaXJlZC4KK2BtaW5fdGhyZXNob2xkYCAoZGVmYXVsdDogNCk6OgorICBMb3dlciBsaW1pdCBvZiBudW1iZXIgb2YgU1NUYWJsZXMgYmVmb3JlIGEgY29tcGFjdGlvbiBpcyB0cmlnZ2VyZWQuCisgIE5vdCB1c2VkIGZvciBgTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneWAuCitgbWF4X3RocmVzaG9sZGAgKGRlZmF1bHQ6IDMyKTo6CisgIFVwcGVyIGxpbWl0IG9mIG51bWJlciBvZiBTU1RhYmxlcyBiZWZvcmUgYSBjb21wYWN0aW9uIGlzIHRyaWdnZXJlZC4KKyAgTm90IHVzZWQgZm9yIGBMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5YC4KKworRnVydGhlciwgc2VlIHRoZSBzZWN0aW9uIG9uIGVhY2ggc3RyYXRlZ3kgZm9yIHNwZWNpZmljIGFkZGl0aW9uYWwKK29wdGlvbnMuCisKKz09IENvbXBhY3Rpb24gbm9kZXRvb2wgY29tbWFuZHMKKworVGhlIGBub2RldG9vbCA8bm9kZXRvb2w+YCB1dGlsaXR5IHByb3ZpZGVzIGEgbnVtYmVyIG9mIGNvbW1hbmRzIHJlbGF0ZWQKK3RvIGNvbXBhY3Rpb246CisKK2BlbmFibGVhdXRvY29tcGFjdGlvbmA6OgorICBFbmFibGUgY29tcGFjdGlvbi4KK2BkaXNhYmxlYXV0b2NvbXBhY3Rpb25gOjoKKyAgRGlzYWJsZSBjb21wYWN0aW9uLgorYHNldGNvbXBhY3Rpb250aHJvdWdocHV0YDo6CisgIEhvdyBmYXN0IGNvbXBhY3Rpb24gc2hvdWxkIHJ1biBhdCBtb3N0IC0gZGVmYXVsdHMgdG8gNjRNaUIvcy4KK2Bjb21wYWN0aW9uc3RhdHNgOjoKKyAgU3RhdGlzdGljcyBhYm91dCBjdXJyZW50IGFuZCBwZW5kaW5nIGNvbXBhY3Rpb25zLgorYGNvbXBhY3Rpb25oaXN0b3J5YDo6CisgIExpc3QgZGV0YWlscyBhYm91dCB0aGUgbGFzdCBjb21wYWN0aW9ucy4KK2BzZXRjb21wYWN0aW9udGhyZXNob2xkYDo6CisgIFNldCB0aGUgbWluL21heCBzc3RhYmxlIGNvdW50IGZvciB3aGVuIHRvIHRyaWdnZXIgY29tcGFjdGlvbiwgZGVmYXVsdHMKKyAgdG8gNC8zMi4KKworPT0gU3dpdGNoaW5nIHRoZSBjb21wYWN0aW9uIHN0cmF0ZWd5IGFuZCBvcHRpb25zIHVzaW5nIEpNWAorCitJdCBpcyBwb3NzaWJsZSB0byBzd2l0Y2ggY29tcGFjdGlvbiBzdHJhdGVnaWVzIGFuZCBpdHMgb3B0aW9ucyBvbiBqdXN0IGEKK3NpbmdsZSBub2RlIHVzaW5nIEpNWCwgdGhpcyBpcyBhIGdyZWF0IHdheSB0byBleHBlcmltZW50IHdpdGggc2V0dGluZ3MKK3dpdGhvdXQgYWZmZWN0aW5nIHRoZSB3aG9sZSBjbHVzdGVyLiBUaGUgbWJlYW4gaXM6CisKK1tzb3VyY2Usbm9uZV0KKy0tLS0KK29yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiOnR5cGU9Q29sdW1uRmFtaWxpZXMsa2V5c3BhY2U9PGtleXNwYWNlX25hbWU+LGNvbHVtbmZhbWlseT08dGFibGVfbmFtZT4KKy0tLS0KKworYW5kIHRoZSBhdHRyaWJ1dGUgdG8gY2hhbmdlIGlzIGBDb21wYWN0aW9uUGFyYW1ldGVyc2Agb3IKK2BDb21wYWN0aW9uUGFyYW1ldGVyc0pzb25gIGlmIHlvdSB1c2UgamNvbnNvbGUgb3Igam1jLiBUaGUgc3ludGF4IGZvcgordGhlIGpzb24gdmVyc2lvbiBpcyB0aGUgc2FtZSBhcyB5b3Ugd291bGQgdXNlIGluIGFuCitgQUxURVIgVEFCTEUgPGFsdGVyLXRhYmxlLXN0YXRlbWVudD5gIHN0YXRlbWVudCAtZm9yIGV4YW1wbGU6CisKK1tzb3VyY2Usbm9uZV0KKy0tLS0KK3sgJ2NsYXNzJzogJ0xldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3knLCAnc3N0YWJsZV9zaXplX2luX21iJzogMTIzLCAnZmFub3V0X3NpemUnOiAxMH0KKy0tLS0KKworVGhlIHNldHRpbmcgaXMga2VwdCB1bnRpbCBzb21lb25lIGV4ZWN1dGVzIGFuCitgQUxURVIgVEFCTEUgPGFsdGVyLXRhYmxlLXN0YXRlbWVudD5gIHRoYXQgdG91Y2hlcyB0aGUgY29tcGFjdGlvbgorc2V0dGluZ3Mgb3IgcmVzdGFydHMgdGhlIG5vZGUuCisKK1tbZGV0YWlsZWQtY29tcGFjdGlvbi1sb2dnaW5nXV0KKz09IE1vcmUgZGV0YWlsZWQgY29tcGFjdGlvbiBsb2dnaW5nCisKK0VuYWJsZSB3aXRoIHRoZSBjb21wYWN0aW9uIG9wdGlvbiBgbG9nX2FsbGAgYW5kIGEgbW9yZSBkZXRhaWxlZAorY29tcGFjdGlvbiBsb2cgZmlsZSB3aWxsIGJlIHByb2R1Y2VkIGluIHlvdXIgbG9nIGRpcmVjdG9yeS4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvY29tcGFjdGlvbi9sY3MuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvY29tcGFjdGlvbi9sY3MuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9jb21wYWN0aW9uL2xjcy5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL2NvbXBhY3Rpb24vbGNzLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvY29tcGFjdGlvbi9zdGNzLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL2NvbXBhY3Rpb24vc3Rjcy5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL2NvbXBhY3Rpb24vc3Rjcy5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL2NvbXBhY3Rpb24vc3Rjcy5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL2NvbXBhY3Rpb24vdHdjcy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9jb21wYWN0aW9uL3R3Y3MuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9jb21wYWN0aW9uL3R3Y3MuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9jb21wYWN0aW9uL3R3Y3MuYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9jb21wcmVzc2lvbi5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9jb21wcmVzc2lvbi5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL2NvbXByZXNzaW9uLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvY29tcHJlc3Npb24uYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9kZW55bGlzdGluZ19wYXJ0aXRpb25zLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL2RlbnlsaXN0aW5nX3BhcnRpdGlvbnMuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODFkYzgwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9kZW55bGlzdGluZ19wYXJ0aXRpb25zLmFkb2MKQEAgLTAsMCArMSwxNDMgQEAKKz0gRGVueWxpc3RpbmcgUGFydGl0aW9ucworCitEdWUgdG8gYWNjZXNzIHBhdHRlcm5zIGFuZCBkYXRhIG1vZGVsaW5nLCBzb21ldGltZXMgdGhlcmUgYXJlIHNwZWNpZmljIHBhcnRpdGlvbnMKK3RoYXQgYXJlICJob3QiIGFuZCBjYW4gY2F1c2UgaW5zdGFiaWxpdHkgaW4gYSBDYXNzYW5kcmEgY2x1c3Rlci4gVGhpcyBvZnRlbiBvY2N1cnMKK3doZW4geW91ciBkYXRhIG1vZGVsIGluY2x1ZGVzIG1hbnkgdXBkYXRlIG9yIGluc2VydCBvcGVyYXRpb25zIG9uIGEgc2luZ2xlIHBhcnRpdGlvbiwKK2NhdXNpbmcgdGhlIHBhcnRpdGlvbiB0byBncm93IHZlcnkgbGFyZ2Ugb3ZlciB0aW1lIGFuZCBpbiB0dXJuIG1ha2luZyBpdCB2ZXJ5IGV4cGVuc2l2ZQordG8gcmVhZCBhbmQgbWFpbnRhaW4uCisKK0Nhc3NhbmRyYSBzdXBwb3J0cyAiZGVueWxpc3RpbmciIHRoZXNlIHByb2JsZW1hdGljIHBhcnRpdGlvbnMgc28gdGhhdCB3aGVuIGNsaWVudHMKK2lzc3VlIHBvaW50IHJlYWRzIChgU0VMRUNUYCBzdGF0ZW1lbnRzIHdpdGggdGhlIHBhcnRpdGlvbiBrZXkgc3BlY2lmaWVkKSBvciByYW5nZQorcmVhZHMgKGBTRUxFQ1QgKmAsIGV0YyB0aGF0IHB1bGwgYSByYW5nZSBvZiBkYXRhKSB0aGF0IGludGVyc2VjdCB3aXRoIGEgYmxvY2tlZAorcGFydGl0aW9uIGtleSwgdGhlIHF1ZXJ5IHdpbGwgYmUgaW1tZWRpYXRlbHkgcmVqZWN0ZWQgd2l0aCBhbiBgSW52YWxpZFF1ZXJ5RXhjZXB0aW9uYC4KKworPT0gSG93IHRvIGRlbnlsaXN0IGEgcGFydGl0aW9uIGtleQorCitUaGUgYGBzeXN0ZW1fZGlzdHJpYnV0ZWQuZGVueWxpc3RlZF9wYXJ0aXRpb25zYGAgdGFibGUgY2FuIGJlIHVzZWQgdG8gZGVueWxpc3QgcGFydGl0aW9ucy4KK1RoZXJlIGFyZSBhIGNvdXBsZSBvZiB3YXlzIHRvIGludGVyYWN0IHdpdGggYW5kIG11dGF0ZSB0aGlzIGRhdGEuIEZpcnN0OiBkaXJlY3RseQordmlhIENRTCBieSBpbnNlcnRpbmcgYSByZWNvcmQgd2l0aCB0aGUgZm9sbG93aW5nIGRldGFpbHM6CisKKy0gS2V5c3BhY2UgbmFtZSAoa3NfbmFtZSkKKy0gVGFibGUgbmFtZSAodGFibGVfbmFtZSkKKy0gUGFydGl0aW9uIEtleSAocGFydGl0aW9uX2tleSkKKworVGhlIHBhcnRpdGlvbiBrZXkgZm9ybWF0IG5lZWRzIHRvIGJlIGluIHRoZSBzYW1lIGZvcm0gcmVxdWlyZWQgYnkgYGBub2RldG9vbCBnZXRlbmRwb2ludHNgYC4KKworRm9sbG93aW5nIGFyZSBzZXZlcmFsIGV4YW1wbGVzIGZvciBkZW55bGlzdGluZyBwYXJ0aXRpb24ga2V5cyBpbiBrZXlzcGFjZSBga3NgIGFuZAordGFibGUgYHRhYmxlMWAgZm9yIGRpZmZlcmVudCBkYXRhIHR5cGVzIG9uIHRoZSBwcmltYXJ5IGtleSBgSWRgOgorCistIElkIGlzIGEgc2ltcGxlIHR5cGUgLSBgSU5TRVJUIElOVE8gc3lzdGVtX2Rpc3RyaWJ1dGVkLmRlbnlsaXN0ZWRfcGFydGl0aW9ucyAoa3NfbmFtZSwgdGFibGVfbmFtZSwgcGFydGl0aW9uX2tleSkgVkFMVUVTICgna3MnLCd0YWJsZTEnLCcxJyk7YAorLSBJZCBpcyBhIGJsb2IgICAgICAgIC0gYElOU0VSVCBJTlRPIHN5c3RlbV9kaXN0cmlidXRlZC5kZW55bGlzdGVkX3BhcnRpdGlvbnMgKGtzX25hbWUsIHRhYmxlX25hbWUsIHBhcnRpdGlvbl9rZXkpIFZBTFVFUyAoJ2tzJywndGFibGUxJywnMTIzNDVmJyk7YAorLSBJZCBoYXMgYSBjb2xvbiAgICAgIC0gYElOU0VSVCBJTlRPIHN5c3RlbV9kaXN0cmlidXRlZC5kZW55bGlzdGVkX3BhcnRpdGlvbnMgKGtzX25hbWUsIHRhYmxlX25hbWUsIHBhcnRpdGlvbl9rZXkpIFZBTFVFUyAoJ2tzJywndGFibGUxJywnMVw6MicpO2AKKworSW4gdGhlIGNhc2Ugb2YgY29tcG9zaXRlIGNvbHVtbiBwYXJ0aXRpb24ga2V5cyAoS2V5MSwgS2V5Mik6CisKKy0gYElOU0VSVCBJTlRPIHN5c3RlbV9kaXN0cmlidXRlZC5kZW55bGlzdGVkX3BhcnRpdGlvbnMgKGtzX25hbWUsIHRhYmxlX25hbWUsIHBhcnRpdGlvbl9rZXkpIFZBTFVFUyAoJ2tzJywgJ3RhYmxlMScsICdrMTE6azIxJylgCisKKworPT09IFNwZWNpYWwgY29uc2lkZXJhdGlvbnMKKworVGhlIGRlbnlsaXN0IGhhcyB0aGUgcHJvcGVydHkgaW4gdGhhdCB5b3Ugd2FudCB0byBrZWVwIHlvdXIgY2FjaGUgKHNlZSBiZWxvdykgYW5kCitDUUwgZGF0YSBvbiBhIHJlcGxpY2Egc2V0IGFzIGNsb3NlIHRvZ2V0aGVyIGFzIHBvc3NpYmxlLCBzbyB5b3UgZG9uJ3QgaGF2ZSBkaWZmZXJlbnQKK25vZGVzIGluIHlvdXIgY2x1c3RlciBkZW55aW5nIG9yIGFsbG93aW5nIGRpZmZlcmVudCBrZXlzLiBUbyBiZXN0IGFjaGlldmUgdGhpcywKK3RoZSB3b3JrZmxvdyBmb3IgYSBkZW55bGlzdCBjaGFuZ2UgKGFkZGl0aW9uIG9yIGRlbGV0aW9uKSBzaG91bGQgYWx3YXlzIGJlIGFzIGZvbGxvd3M6CisKK0pNWCBQQVRIIChwcmVmZXJyZWQgZm9yIHNpbmdsZSBjaGFuZ2VzKToKKworMS4gQ2FsbCB0aGUgSk1YIGhvb2sgZm9yIGBgZGVueWxpc3RLZXkoKWBgIHdpdGggdGhlIGRlc2lyZWQga2V5CisyLiBEb3VibGUtY2hlY2sgdGhlIGNhY2hlIHJlbG9hZGVkIHdpdGggYGBpc0tleURlbnlsaXN0ZWQoKWBgCiszLiBDaGVjayBmb3Igd2FybmluZ3MgYWJvdXQgdW5yZWNvZ25pemVkIGtleXNwYWNlL3RhYmxlIGNvbWJpbmF0aW9ucywgbGltaXRzLCBvcgorY29uc2lzdGVuY3kgbGV2ZWwuIElmIHlvdSBnZXQgYSBtZXNzYWdlIGFib3V0IG5vZGVzIGJlaW5nIGRvd24gYW5kIG5vdCBoaXR0aW5nIENMCitmb3IgZGVueWxpc3QsIHJlY292ZXIgdGhlIGRvd25lZCBub2RlcyBhbmQgdGhlbiB0cmlnZ2VyIGEgcmUtbG9hZCBvZiB0aGUgY2FjaGUgb24gZWFjaAorbm9kZSB3aXRoIGBgbG9hZFBhcnRpdGlvbkRlbnlsaXN0KClgYAorCitDUUwgUEFUSCAocHJlZmVycmVkIGZvciBidWxrIGNoYW5nZXMpOgorCisxLiBNdXRhdGUgdGhlIGRlbnlsaXN0ZWQgcGFydGl0aW9uIGxpc3RzIHZpYSBDUUwKKzIuIFRyaWdnZXIgYSByZS1sb2FkIG9mIHRoZSBkZW55bGlzdCBjYWNoZSBvbiBlYWNoIG5vZGUgdmlhIEpNWCBgYGxvYWRQYXJ0aXRpb25EZW55bGlzdCgpYGAgKHNlZSBiZWxvdykKKzMuIENoZWNrIGZvciB3YXJuaW5ncyBhYm91dCBsYWNrIG9mIGF2YWlsYWJpbGl0eSBmb3IgYSBkZW55bGlzdCByZWZyZXNoLiBJbiB0aGUgZXZlbnQgbm9kZXMgYXJlIGRvd24sIHJlY292ZXIgdGhlbSwgdGhlbiBnbyB0byAyLgorCitEdWUgdG8gY29uZGl0aW9ucyBvbiBrbm93biB1bmF2YWlsYWJsZSByYW5nZSBzbGljZXMgbGVhZGluZyB0byBhbGVydCBzdG9ybWluZyBvbgorc3RhcnR1cCwgdGhlIGRlbnlsaXN0IGNhY2hlIHdpbGwgbm90IGxvYWQgb24gbm9kZSBzdGFydCB1bmxlc3MgaXQgY2FuIGFjaGlldmUgdGhlCitjb25maWd1cmVkIGNvbnNpc3RlbmN5IGxldmVsIGluIGBjYXNzYW5kcmEueWFtbGAgLSBgZGVueWxpc3RfY29uc2lzdGVuY3lfbGV2ZWxgLgorVGhlIEpNWCBjYWxsIHRvIGBsb2FkUGFydGl0aW9uRGVueWxpc3RgIHdpbGwsIGhvd2V2ZXIsIGxvYWQgdGhlIGNhY2hlIHJlZ2FyZGxlc3MKK29mIHRoZSBudW1iZXIgb2Ygbm9kZXMgYXZhaWxhYmxlLiBUaGlzIGxlYXZlcyB0aGUgY29udHJvbCBmb3IgZGVueWxpc3Rpbmcgb3Igbm90CitkZW55bGlzdGluZyBkdXJpbmcgZGVncmFkZWQgY2x1c3RlciBzdGF0ZXMgaW4gdGhlIGhhbmRzIG9mIHRoZSBvcGVyYXRvci4KKworPT0gRGVueWxpc3RlZCBQYXJ0aXRpb25zIENhY2hlCisKK0Nhc3NhbmRyYSBpbnRlcm5hbGx5IG1haW50YWlucyBhbiBvbi1oZWFwIGNhY2hlIG9mIGRlbnlsaXN0ZWQgcGFydGl0aW9ucyBsb2FkZWQKK2Zyb20gYGBzeXN0ZW1fZGlzdHJpYnV0ZWQuZGVueWxpc3RlZF9wYXJ0aXRpb25zYGAuIFRoZSB2YWx1ZXMgZm9yIGEgdGFibGUgd2lsbCBiZQorYXV0b21hdGljYWxseSByZXBvcHVsYXRlZCBldmVyeSBgYGRlbnlsaXN0X3JlZnJlc2hgYCBhcyBzcGVjaWZpZWQgaW4gdGhlCitgY29uZi9jYXNzYW5kcmEueWFtbGAgZmlsZSwgZGVmYXVsdGluZyB0byBgNjAwc2AsIG9yIDEwIG1pbnV0ZXMuIEludmFsaWQgcmVjb3JkcworKHVua25vd24ga2V5c3BhY2VzLCB0YWJsZXMsIG9yIGtleXMpIHdpbGwgYmUgaWdub3JlZCBhbmQgbm90IGNhY2hlZCBvbiBsb2FkLgorCitUaGUgY2FjaGUgY2FuIGJlIHJlZnJlc2hlZCBpbiB0aGUgZm9sbG93aW5nIHdheXM6CisKKy0gRHVyaW5nIENhc3NhbmRyYSBub2RlIHN0YXJ0dXAKKy0gVmlhIHRoZSBhdXRvbWF0aWMgb24taGVhcCBjYWNoZSByZWZyZXNoIG1lY2hhbmlzbXMuIE5vdGU6IHRoaXMgd2lsbCBvY2N1ciBhc3luY2hyb25vdXNseQorb24gcXVlcnkgYWZ0ZXIgdGhlIGBgZGVueWxpc3RfcmVmcmVzaGBgIHRpbWUgaXMgaGl0LgorLSBWaWEgdGhlIEpNWCBjb21tYW5kOiBgYGxvYWRQYXJ0aXRpb25EZW55bGlzdGBgIGluIGBgdGhlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuCitTdG9yYWdlUHJveHlNQmVhbmBgIGludm9jYXRpb24gcG9pbnQuCisKK1RoZSBDYWNoZSBzaXplIGlzIGJvdW5kZWQgYnkgdGhlIGZvbGxvd2luZyB0d28gY29uZmlnIHByb3BlcnRpZXMKKworLSBkZW55bGlzdF9tYXhfa2V5c19wZXJfdGFibGUKKy0gZGVueWxpc3RfbWF4X2tleXNfdG90YWwKKworT24gY2FjaGUgbG9hZCwgaWYgYSB0YWJsZSBleGNlZWRzIHRoZSB2YWx1ZSBhbGxvd2VkIGluIGBkZW55bGlzdF9tYXhfa2V5c19wZXJfdGFibGVgIChkZWZhdWx0cyB0byAxMDAwKSwKK2Egd2FybmluZyB3aWxsIGJlIHByaW50ZWQgdG8gdGhlIGxvZ3MgYW5kIHRoZSByZW1haW5kZXIgb2YgdGhlIGtleXMgd2lsbCBub3QgYmUgY2FjaGVkLgorU2ltaWxhcmx5LCBpZiB0aGUgdG90YWwgYWxsb3dlZCBzaXplIGlzIGV4Y2VlZGVkLCBzdWJzZXF1ZW50IGtzX25hbWUgKyB0YWJsZV9uYW1lCitjb21iaW5hdGlvbnMgKGluIGNsdXN0ZXJpbmcgLyBsZXhpY29ncmFwaGljYWwgb3JkZXIpIHdpbGwgYmUgc2tpcHBlZCBhcyB3ZWxsLCBhbmQgYQord2FybmluZyBsb2dnZWQgdG8gdGhlIHNlcnZlciBsb2dzLgorCitbTk9URV0KKz09PT0KK0dpdmVuIHRoZSByZXF1aXJlZCB3b3JrZmxvdyBvZiAxKSBNdXRhdGUsIDIpIFJlbG9hZCBjYWNoZSwgdGhlIGF1dG8tcmVsb2FkCitwcm9wZXJ0eSBzZWVtcyBzdXBlcmZsdW91cy4gSXQgZXhpc3RzIHRvIGVuc3VyZSB0aGF0LCBzaG91bGQgYW4gb3BlcmF0b3IgbWFrZSBhCittaXN0YWtlIGFuZCBkZW55bGlzdCAob3IgdW5kZW55bGlzdCkgYSBrZXkgYnV0IGZvcmdldCB0byByZWxvYWQgdGhlIGNhY2hlLCB0aGF0CitpbnRlbnQgd2lsbCBiZSBjYXB0dXJlZCBvbiB0aGUgbmV4dCBjYWNoZSByZWxvYWQuCis9PT09CisKKz09IEpNWCBJbnRlcmZhY2UKKworW2NvbHM9IjEsMSJdCit8PT09Cit8IENvbW1hbmQgfCBFZmZlY3QKKworfCBsb2FkUGFydGl0aW9uRGVueWxpc3QoKQorfCBSZWxvYWRzIGNhY2hlZCBkZW55bGlzdCBmcm9tIENRTCB0YWJsZQorCit8IGdldFBhcnRpdGlvbkRlbnlsaXN0TG9hZEF0dGVtcHRzKCkKK3wgR2V0cyB0aGUgY291bnQgb2YgY2FjaGUgcmVsb2FkIGF0dGVtcHRzCisKK3wgZ2V0UGFydGl0aW9uRGVueWxpc3RMb2FkU3VjY2Vzc2VzKCkKK3wgR2V0cyB0aGUgY291bnQgb2YgY2FjaGUgcmVsb2FkIHN1Y2Nlc3NlcworCit8IHNldEVuYWJsZVBhcnRpdGlvbkRlbnlsaXN0KGJvb2xlYW4gZW5hYmxlZCkKK3wgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgcGFydGl0aW9uIGRlbnlsaXN0aW5nIGZ1bmN0aW9uYWxpdHkKKworfCBzZXRFbmFibGVEZW55bGlzdFdyaXRlcyhib29sZWFuIGVuYWJsZWQpCit8IEVuYWJsZXMgb3IgZGlzYWJsZXMgd3JpdGUgZGVueWxpc3RpbmcgZnVuY3Rpb25hbGl0eQorCit8IHNldEVuYWJsZURlbnlsaXN0UmVhZHMoYm9vbGVhbiBlbmFibGVkKQorfCBFbmFibGVzIG9yIGRpc2FibGVzIHJlYWQgZGVueWxpc3RpbmcgZnVuY3Rpb25hbGl0eQorCit8IHNldEVuYWJsZURlbnlsaXN0UmFuZ2VSZWFkcyhib29sZWFuIGVuYWJsZWQpCit8IEVuYWJsZXMgb3IgZGlzYWJsZXMgcmFuZ2UgcmVhZCBkZW55bGlzdGluZyBmdW5jdGlvbmFsaXR5CisKK3wgZGVueWxpc3RLZXkoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUsIFN0cmluZyBwYXJ0aXRpb25LZXlBc1N0cmluZykKK3wgQWRkcyBhIHNwZWNpZmljIGtleXNwYWNlLCB0YWJsZSwgYW5kIHBhcnRpdGlvbiBrZXkgY29tYm8gdG8gdGhlIGRlbnlsaXN0CisKK3wgcmVtb3ZlRGVueWxpc3RLZXkoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgY2YsIFN0cmluZyBwYXJ0aXRpb25LZXlBc1N0cmluZykKK3wgUmVtb3ZlcyBhIHNwZWNpZmljIGtleXNwYWNlLCB0YWJsZSwgYW5kIHBhcnRpdGlvbiBrZXkgY29tYm8gZnJvbSB0aGUgZGVueWxpc3QKKworfCBzZXREZW55bGlzdE1heEtleXNQZXJUYWJsZShpbnQgdmFsdWUpCit8IExpbWl0cyBjb3VudCBvZiBhbGxvd2VkIGtleXMgcGVyIHRhYmxlIGluIHRoZSBkZW55bGlzdAorCit8IHNldERlbnlsaXN0TWF4S2V5c1RvdGFsKGludCB2YWx1ZSkKK3wgTGltaXRzIHRoZSB0b3RhbCBjb3VudCBvZiBhbGxvd2FibGUgZGVueWxpc3RlZCBrZXlzIGluIHRoZSBzeXN0ZW0KKworfCBpc0tleURlbnlsaXN0ZWQoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUsIFN0cmluZyBwYXJ0aXRpb25LZXlBc1N0cmluZykKK3wgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGtleXNwYWNlLnRhYmxlIGhhcyB0aGUgaW5wdXQgcGFydGl0aW9uIGtleSBkZW5pZWQKK3w9PT0KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvZnFsbG9nZ2luZy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9mcWxsb2dnaW5nLmFkb2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvZnFsbG9nZ2luZy5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL2ZxbGxvZ2dpbmcuYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9oYXJkd2FyZS5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9oYXJkd2FyZS5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL2hhcmR3YXJlLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvaGFyZHdhcmUuYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9oaW50cy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9oaW50cy5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL2hpbnRzLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvaGludHMuYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9pbmRleC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9pbmRleC5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZWUxYjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL2luZGV4LmFkb2MKQEAgLTAsMCArMSwxNiBAQAorPT0gT3BlcmF0aW5nIENhc3NhbmRyYQorCisqIHhyZWY6b3BlcmF0aW5nL2hhcmR3YXJlLmFkb2NbSGFyZHdhcmVdCisqIHhyZWY6b3BlcmF0aW5nL3NlY3VyaXR5LmFkb2NbU2VjdXJpdHldCisqIHhyZWY6b3BlcmF0aW5nL3RvcG9fY2hhbmdlcy5hZG9jW1RvcG9sb2d5IGNoYW5nZXNdCisqIHhyZWY6b3BlcmF0aW5nL2hpbnRzLmFkb2NbSGludHNdCisqIHhyZWY6b3BlcmF0aW5nL3JlcGFpci5hZG9jW1JlcGFpcl0KKyogeHJlZjpvcGVyYXRpbmcvcmVhZF9yZXBhaXIuYWRvY1tSZWFkIHJlcGFpcl0KKyogeHJlZjpvcGVyYXRpbmcvYmFja3Vwcy5hZG9jW0JhY2t1cHNdCisqIHhyZWY6b3BlcmF0aW5nL2NvbXByZXNzaW9uLmFkb2NbQ29tcHJlc3Npb25dCisqIHhyZWY6b3BlcmF0aW5nL2NvbXBhY3Rpb24vaW5kZXguYWRvY1tDb21wYWN0aW9uXQorKiB4cmVmOm9wZXJhdGluZy9tZXRyaWNzLmFkb2NbTW9uaXRvcmluZ10KKyogeHJlZjpvcGVyYXRpbmcvYnVsa19sb2FkaW5nLmFkb2NbQnVsayBsb2FkaW5nXQorKiB4cmVmOm9wZXJhdGluZy9jZGMuYWRvY1tDRENdCisqIHhyZWY6b3BlcmF0aW5nL2Jsb29tX2ZpbHRlcnMuYWRvY1tCbG9vbSBmaWx0ZXJzXQorKiB4cmVmOm9wZXJhdGluZy9kZW55bGlzdGluZ19wYXJ0aXRpb25zLmFkb2NbRGVueWxpc3RpbmcgcGFydGl0aW9uc10KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvbWV0cmljcy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9tZXRyaWNzLmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEwMjI4NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvbWV0cmljcy5hZG9jCkBAIC0wLDAgKzEsMTA5NyBAQAorPSBNb25pdG9yaW5nCisKK01ldHJpY3MgaW4gQ2Fzc2FuZHJhIGFyZSBtYW5hZ2VkIHVzaW5nIHRoZQoraHR0cDovL21ldHJpY3MuZHJvcHdpemFyZC5pb1tEcm9wd2l6YXJkIE1ldHJpY3NdIGxpYnJhcnkuIFRoZXNlIG1ldHJpY3MKK2NhbiBiZSBxdWVyaWVkIHZpYSBKTVggb3IgcHVzaGVkIHRvIGV4dGVybmFsIG1vbml0b3Jpbmcgc3lzdGVtcyB1c2luZyBhCitudW1iZXIgb2YKK2h0dHA6Ly9tZXRyaWNzLmRyb3B3aXphcmQuaW8vMy4xLjAvZ2V0dGluZy1zdGFydGVkLyNvdGhlci1yZXBvcnRpbmdbYnVpbHQKK2luXSBhbmQgaHR0cDovL21ldHJpY3MuZHJvcHdpemFyZC5pby8zLjEuMC9tYW51YWwvdGhpcmQtcGFydHkvW3RoaXJkCitwYXJ0eV0gcmVwb3J0ZXIgcGx1Z2lucy4KKworTWV0cmljcyBhcmUgY29sbGVjdGVkIGZvciBhIHNpbmdsZSBub2RlLiBJdCdzIHVwIHRvIHRoZSBvcGVyYXRvciB0byB1c2UKK2FuIGV4dGVybmFsIG1vbml0b3Jpbmcgc3lzdGVtIHRvIGFnZ3JlZ2F0ZSB0aGVtLgorCis9PSBNZXRyaWMgVHlwZXMKKworQWxsIG1ldHJpY3MgcmVwb3J0ZWQgYnkgY2Fzc2FuZHJhIGZpdCBpbnRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzLgorCitgR2F1Z2VgOjoKKyAgQW4gaW5zdGFudGFuZW91cyBtZWFzdXJlbWVudCBvZiBhIHZhbHVlLgorYENvdW50ZXJgOjoKKyAgQSBnYXVnZSBmb3IgYW4gYEF0b21pY0xvbmdgIGluc3RhbmNlLiBUeXBpY2FsbHkgdGhpcyBpcyBjb25zdW1lZCBieQorICBtb25pdG9yaW5nIHRoZSBjaGFuZ2Ugc2luY2UgdGhlIGxhc3QgY2FsbCB0byBzZWUgaWYgdGhlcmUgaXMgYSBsYXJnZQorICBpbmNyZWFzZSBjb21wYXJlZCB0byB0aGUgbm9ybS4KK2BIaXN0b2dyYW1gOjoKKyAgTWVhc3VyZXMgdGhlIHN0YXRpc3RpY2FsIGRpc3RyaWJ1dGlvbiBvZiB2YWx1ZXMgaW4gYSBzdHJlYW0gb2YgZGF0YS4KKyAgKworICBJbiBhZGRpdGlvbiB0byBtaW5pbXVtLCBtYXhpbXVtLCBtZWFuLCBldGMuLCBpdCBhbHNvIG1lYXN1cmVzIG1lZGlhbiwKKyAgNzV0aCwgOTB0aCwgOTV0aCwgOTh0aCwgOTl0aCwgYW5kIDk5Ljl0aCBwZXJjZW50aWxlcy4KK2BUaW1lcmA6OgorICBNZWFzdXJlcyBib3RoIHRoZSByYXRlIHRoYXQgYSBwYXJ0aWN1bGFyIHBpZWNlIG9mIGNvZGUgaXMgY2FsbGVkIGFuZAorICB0aGUgaGlzdG9ncmFtIG9mIGl0cyBkdXJhdGlvbi4KK2BMYXRlbmN5YDo6CisgIFNwZWNpYWwgdHlwZSB0aGF0IHRyYWNrcyBsYXRlbmN5IChpbiBtaWNyb3NlY29uZHMpIHdpdGggYSBgVGltZXJgIHBsdXMKKyAgYSBgQ291bnRlcmAgdGhhdCB0cmFja3MgdGhlIHRvdGFsIGxhdGVuY3kgYWNjcnVlZCBzaW5jZSBzdGFydGluZy4gVGhlCisgIGZvcm1lciBpcyB1c2VmdWwgaWYgeW91IHRyYWNrIHRoZSBjaGFuZ2UgaW4gdG90YWwgbGF0ZW5jeSBzaW5jZSB0aGUKKyAgbGFzdCBjaGVjay4gRWFjaCBtZXRyaWMgbmFtZSBvZiB0aGlzIHR5cGUgd2lsbCBoYXZlICdMYXRlbmN5JyBhbmQKKyAgJ1RvdGFsTGF0ZW5jeScgYXBwZW5kZWQgdG8gaXQuCitgTWV0ZXJgOjoKKyAgQSBtZXRlciBtZXRyaWMgd2hpY2ggbWVhc3VyZXMgbWVhbiB0aHJvdWdocHV0IGFuZCBvbmUtLCBmaXZlLSwgYW5kCisgIGZpZnRlZW4tbWludXRlIGV4cG9uZW50aWFsbHktd2VpZ2h0ZWQgbW92aW5nIGF2ZXJhZ2UgdGhyb3VnaHB1dHMuCisKKz09IFRhYmxlIE1ldHJpY3MKKworRWFjaCB0YWJsZSBpbiBDYXNzYW5kcmEgaGFzIG1ldHJpY3MgcmVzcG9uc2libGUgZm9yIHRyYWNraW5nIGl0cyBzdGF0ZQorYW5kIHBlcmZvcm1hbmNlLgorCitUaGUgbWV0cmljIG5hbWVzIGFyZSBhbGwgYXBwZW5kZWQgd2l0aCB0aGUgc3BlY2lmaWMgYEtleXNwYWNlYCBhbmQKK2BUYWJsZWAgbmFtZS4KKworUmVwb3J0ZWQgbmFtZSBmb3JtYXQ6CisKKypNZXRyaWMgTmFtZSo6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5UYWJsZS48TWV0cmljTmFtZT4uPEtleXNwYWNlPi48VGFibGU+YAorKkpNWCBNQmVhbio6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPVRhYmxlIGtleXNwYWNlPTxLZXlzcGFjZT4gc2NvcGU9PFRhYmxlPiBuYW1lPTxNZXRyaWNOYW1lPmAKKworW05PVEVdCis9PT09CitUaGVyZSBpcyBhIHNwZWNpYWwgdGFibGUgY2FsbGVkICdgYWxsYCcgd2l0aG91dCBhIGtleXNwYWNlLiBUaGlzCityZXByZXNlbnRzIHRoZSBhZ2dyZWdhdGlvbiBvZiBtZXRyaWNzIGFjcm9zcyAqYWxsKiB0YWJsZXMgYW5kIGtleXNwYWNlcworb24gdGhlIG5vZGUuCis9PT09CitbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCit8TWVtdGFibGVPbkhlYXBTaXplIHxHYXVnZTxMb25nPiB8VG90YWwgYW1vdW50IG9mIGRhdGEgc3RvcmVkIGluIHRoZQorbWVtdGFibGUgdGhhdCByZXNpZGVzICpvbiotaGVhcCwgaW5jbHVkaW5nIGNvbHVtbiByZWxhdGVkIG92ZXJoZWFkIGFuZAorcGFydGl0aW9ucyBvdmVyd3JpdHRlbi4KKworfE1lbXRhYmxlT2ZmSGVhcFNpemUgfEdhdWdlPExvbmc+IHxUb3RhbCBhbW91bnQgb2YgZGF0YSBzdG9yZWQgaW4gdGhlCittZW10YWJsZSB0aGF0IHJlc2lkZXMgKm9mZiotaGVhcCwgaW5jbHVkaW5nIGNvbHVtbiByZWxhdGVkIG92ZXJoZWFkIGFuZAorcGFydGl0aW9ucyBvdmVyd3JpdHRlbi4KKworfE1lbXRhYmxlTGl2ZURhdGFTaXplIHxHYXVnZTxMb25nPiB8VG90YWwgYW1vdW50IG9mIGxpdmUgZGF0YSBzdG9yZWQgaW4KK3RoZSBtZW10YWJsZSwgZXhjbHVkaW5nIGFueSBkYXRhIHN0cnVjdHVyZSBvdmVyaGVhZC4KKworfEFsbE1lbXRhYmxlc09uSGVhcFNpemUgfEdhdWdlPExvbmc+IHxUb3RhbCBhbW91bnQgb2YgZGF0YSBzdG9yZWQgaW4gdGhlCittZW10YWJsZXMgKDJpIGFuZCBwZW5kaW5nIGZsdXNoIG1lbXRhYmxlcyBpbmNsdWRlZCkgdGhhdCByZXNpZGVzCisqb24qLWhlYXAuCisKK3xBbGxNZW10YWJsZXNPZmZIZWFwU2l6ZSB8R2F1Z2U8TG9uZz4gfFRvdGFsIGFtb3VudCBvZiBkYXRhIHN0b3JlZCBpbgordGhlIG1lbXRhYmxlcyAoMmkgYW5kIHBlbmRpbmcgZmx1c2ggbWVtdGFibGVzIGluY2x1ZGVkKSB0aGF0IHJlc2lkZXMKKypvZmYqLWhlYXAuCisKK3xBbGxNZW10YWJsZXNMaXZlRGF0YVNpemUgfEdhdWdlPExvbmc+IHxUb3RhbCBhbW91bnQgb2YgbGl2ZSBkYXRhIHN0b3JlZAoraW4gdGhlIG1lbXRhYmxlcyAoMmkgYW5kIHBlbmRpbmcgZmx1c2ggbWVtdGFibGVzIGluY2x1ZGVkKSB0aGF0IHJlc2lkZXMKK29mZi1oZWFwLCBleGNsdWRpbmcgYW55IGRhdGEgc3RydWN0dXJlIG92ZXJoZWFkLgorCit8TWVtdGFibGVDb2x1bW5zQ291bnQgfEdhdWdlPExvbmc+IHxUb3RhbCBudW1iZXIgb2YgY29sdW1ucyBwcmVzZW50IGluCit0aGUgbWVtdGFibGUuCisKK3xNZW10YWJsZVN3aXRjaENvdW50IHxDb3VudGVyIHxOdW1iZXIgb2YgdGltZXMgZmx1c2ggaGFzIHJlc3VsdGVkIGluIHRoZQorbWVtdGFibGUgYmVpbmcgc3dpdGNoZWQgb3V0LgorCit8Q29tcHJlc3Npb25SYXRpbyB8R2F1Z2U8RG91YmxlPiB8Q3VycmVudCBjb21wcmVzc2lvbiByYXRpbyBmb3IgYWxsCitTU1RhYmxlcy4KKworfEVzdGltYXRlZFBhcnRpdGlvblNpemVIaXN0b2dyYW0gfEdhdWdlPGxvbmdbXT4gfEhpc3RvZ3JhbSBvZiBlc3RpbWF0ZWQKK3BhcnRpdGlvbiBzaXplIChpbiBieXRlcykuCisKK3xFc3RpbWF0ZWRQYXJ0aXRpb25Db3VudCB8R2F1Z2U8TG9uZz4gfEFwcHJveGltYXRlIG51bWJlciBvZiBrZXlzIGluCit0YWJsZS4KKworfEVzdGltYXRlZENvbHVtbkNvdW50SGlzdG9ncmFtIHxHYXVnZTxsb25nW10+IHxIaXN0b2dyYW0gb2YgZXN0aW1hdGVkCitudW1iZXIgb2YgY29sdW1ucy4KKworfFNTVGFibGVzUGVyUmVhZEhpc3RvZ3JhbSB8SGlzdG9ncmFtIHxIaXN0b2dyYW0gb2YgdGhlIG51bWJlciBvZiBzc3RhYmxlCitkYXRhIGZpbGVzIGFjY2Vzc2VkIHBlciBzaW5nbGUgcGFydGl0aW9uIHJlYWQuIFNTVGFibGVzIHNraXBwZWQgZHVlIHRvCitCbG9vbSBGaWx0ZXJzLCBtaW4tbWF4IGtleSBvciBwYXJ0aXRpb24gaW5kZXggbG9va3VwIGFyZSBub3QgdGFrZW4gaW50bworYWNvb3VudC4KKworfFJlYWRMYXRlbmN5IHxMYXRlbmN5IHxMb2NhbCByZWFkIGxhdGVuY3kgZm9yIHRoaXMgdGFibGUuCisKK3xSYW5nZUxhdGVuY3kgfExhdGVuY3kgfExvY2FsIHJhbmdlIHNjYW4gbGF0ZW5jeSBmb3IgdGhpcyB0YWJsZS4KKworfFdyaXRlTGF0ZW5jeSB8TGF0ZW5jeSB8TG9jYWwgd3JpdGUgbGF0ZW5jeSBmb3IgdGhpcyB0YWJsZS4KKworfENvb3JkaW5hdG9yUmVhZExhdGVuY3kgfFRpbWVyIHxDb29yZGluYXRvciByZWFkIGxhdGVuY3kgZm9yIHRoaXMgdGFibGUuCisKK3xDb29yZGluYXRvcldyaXRlTGF0ZW5jeSB8VGltZXIgfENvb3JkaW5hdG9yIHdyaXRlIGxhdGVuY3kgZm9yIHRoaXMKK3RhYmxlLgorCit8Q29vcmRpbmF0b3JTY2FuTGF0ZW5jeSB8VGltZXIgfENvb3JkaW5hdG9yIHJhbmdlIHNjYW4gbGF0ZW5jeSBmb3IgdGhpcwordGFibGUuCisKK3xQZW5kaW5nRmx1c2hlcyB8Q291bnRlciB8RXN0aW1hdGVkIG51bWJlciBvZiBmbHVzaCB0YXNrcyBwZW5kaW5nIGZvcgordGhpcyB0YWJsZS4KKworfEJ5dGVzRmx1c2hlZCB8Q291bnRlciB8VG90YWwgbnVtYmVyIG9mIGJ5dGVzIGZsdXNoZWQgc2luY2Ugc2VydmVyCitbcmVdc3RhcnQuCisKK3xDb21wYWN0aW9uQnl0ZXNXcml0dGVuIHxDb3VudGVyIHxUb3RhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBieQorY29tcGFjdGlvbiBzaW5jZSBzZXJ2ZXIgW3JlXXN0YXJ0LgorCit8UGVuZGluZ0NvbXBhY3Rpb25zIHxHYXVnZTxJbnRlZ2VyPiB8RXN0aW1hdGUgb2YgbnVtYmVyIG9mIHBlbmRpbmcKK2NvbXBhY3Rpb25zIGZvciB0aGlzIHRhYmxlLgorCit8TGl2ZVNTVGFibGVDb3VudCB8R2F1Z2U8SW50ZWdlcj4gfE51bWJlciBvZiBTU1RhYmxlcyBvbiBkaXNrIGZvciB0aGlzCit0YWJsZS4KKworfExpdmVEaXNrU3BhY2VVc2VkIHxDb3VudGVyIHxEaXNrIHNwYWNlIHVzZWQgYnkgU1NUYWJsZXMgYmVsb25naW5nIHRvCit0aGlzIHRhYmxlIChpbiBieXRlcykuCisKK3xUb3RhbERpc2tTcGFjZVVzZWQgfENvdW50ZXIgfFRvdGFsIGRpc2sgc3BhY2UgdXNlZCBieSBTU1RhYmxlcworYmVsb25naW5nIHRvIHRoaXMgdGFibGUsIGluY2x1ZGluZyBvYnNvbGV0ZSBvbmVzIHdhaXRpbmcgdG8gYmUgR0MnZC4KKworfE1heFNTVGFibGVTaXplIHxHYXVnZTxMb25nPiB8TWF4aW11bSBzaXplIG9mIFNTVGFibGUgb2YgdGhpcyB0YWJsZSAtCit0aGUgcGh5c2ljYWwgc2l6ZSBvbiBkaXNrIG9mIGFsbCBjb21wb25lbnRzIGZvciBzdWNoIFNTVGFibGUgaW4gYnl0ZXMuIEVxdWFscyB0bworemVybyBpZiB0aGVyZSBpcyBub3QgYW55IFNTVGFibGUgb24gZGlzay4KKworfE1heFNTVGFibGVEdXJhdGlvbiB8R2F1Z2U8TG9uZz4gfE1heGltdW0gZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIG9mIGFuIFNTVGFibGUgZm9yIHRoaXMgdGFibGUsCitjb21wdXRlZCBhcyBgbWF4VGltZXN0YW1wIC0gbWluVGltZXN0YW1wYC4gRXF1YWxzIHRvIHplcm8gaWYgbWluIG9yIG1heCB0aW1lc3RhbXAgaXMgYExvbmcuTUFYX1ZBTFVFYC4KKworfE1pblBhcnRpdGlvblNpemUgfEdhdWdlPExvbmc+IHxTaXplIG9mIHRoZSBzbWFsbGVzdCBjb21wYWN0ZWQgcGFydGl0aW9uCisoaW4gYnl0ZXMpLgorCit8TWF4UGFydGl0aW9uU2l6ZSB8R2F1Z2U8TG9uZz4gfFNpemUgb2YgdGhlIGxhcmdlc3QgY29tcGFjdGVkIHBhcnRpdGlvbgorKGluIGJ5dGVzKS4KKworfE1lYW5QYXJ0aXRpb25TaXplIHxHYXVnZTxMb25nPiB8U2l6ZSBvZiB0aGUgYXZlcmFnZSBjb21wYWN0ZWQgcGFydGl0aW9uCisoaW4gYnl0ZXMpLgorCit8Qmxvb21GaWx0ZXJGYWxzZVBvc2l0aXZlcyB8R2F1Z2U8TG9uZz4gfE51bWJlciBvZiBmYWxzZSBwb3NpdGl2ZXMgb24KK3RhYmxlJ3MgYmxvb20gZmlsdGVyLgorCit8Qmxvb21GaWx0ZXJGYWxzZVJhdGlvIHxHYXVnZTxEb3VibGU+IHxGYWxzZSBwb3NpdGl2ZSByYXRpbyBvZiB0YWJsZSdzCitibG9vbSBmaWx0ZXIuCisKK3xCbG9vbUZpbHRlckRpc2tTcGFjZVVzZWQgfEdhdWdlPExvbmc+IHxEaXNrIHNwYWNlIHVzZWQgYnkgYmxvb20gZmlsdGVyCisoaW4gYnl0ZXMpLgorCit8Qmxvb21GaWx0ZXJPZmZIZWFwTWVtb3J5VXNlZCB8R2F1Z2U8TG9uZz4gfE9mZi1oZWFwIG1lbW9yeSB1c2VkIGJ5CitibG9vbSBmaWx0ZXIuCisKK3xJbmRleFN1bW1hcnlPZmZIZWFwTWVtb3J5VXNlZCB8R2F1Z2U8TG9uZz4gfE9mZi1oZWFwIG1lbW9yeSB1c2VkIGJ5CitpbmRleCBzdW1tYXJ5LgorCit8Q29tcHJlc3Npb25NZXRhZGF0YU9mZkhlYXBNZW1vcnlVc2VkIHxHYXVnZTxMb25nPiB8T2ZmLWhlYXAgbWVtb3J5IHVzZWQKK2J5IGNvbXByZXNzaW9uIG1ldGEgZGF0YS4KKworfEtleUNhY2hlSGl0UmF0ZSB8R2F1Z2U8RG91YmxlPiB8S2V5IGNhY2hlIGhpdCByYXRlIGZvciB0aGlzIHRhYmxlLgorCit8VG9tYnN0b25lU2Nhbm5lZEhpc3RvZ3JhbSB8SGlzdG9ncmFtIHxIaXN0b2dyYW0gb2YgdG9tYnN0b25lcyBzY2FubmVkCitpbiBxdWVyaWVzIG9uIHRoaXMgdGFibGUuCisKK3xMaXZlU2Nhbm5lZEhpc3RvZ3JhbSB8SGlzdG9ncmFtIHxIaXN0b2dyYW0gb2YgbGl2ZSBjZWxscyBzY2FubmVkIGluCitxdWVyaWVzIG9uIHRoaXMgdGFibGUuCisKK3xDb2xVcGRhdGVUaW1lRGVsdGFIaXN0b2dyYW0gfEhpc3RvZ3JhbSB8SGlzdG9ncmFtIG9mIGNvbHVtbiB1cGRhdGUgdGltZQorZGVsdGEgb24gdGhpcyB0YWJsZS4KKworfFZpZXdMb2NrQWNxdWlyZVRpbWUgfFRpbWVyIHxUaW1lIHRha2VuIGFjcXVpcmluZyBhIHBhcnRpdGlvbiBsb2NrIGZvcgorbWF0ZXJpYWxpemVkIHZpZXcgdXBkYXRlcyBvbiB0aGlzIHRhYmxlLgorCit8Vmlld1JlYWRUaW1lIHxUaW1lciB8VGltZSB0YWtlbiBkdXJpbmcgdGhlIGxvY2FsIHJlYWQgb2YgYSBtYXRlcmlhbGl6ZWQKK3ZpZXcgdXBkYXRlLgorCit8VHJ1ZVNuYXBzaG90c1NpemUgfEdhdWdlPExvbmc+IHxEaXNrIHNwYWNlIHVzZWQgYnkgc25hcHNob3RzIG9mIHRoaXMKK3RhYmxlIGluY2x1ZGluZyBhbGwgU1NUYWJsZSBjb21wb25lbnRzLgorCit8Um93Q2FjaGVIaXRPdXRPZlJhbmdlIHxDb3VudGVyIHxOdW1iZXIgb2YgdGFibGUgcm93IGNhY2hlIGhpdHMgdGhhdCBkbworbm90IHNhdGlzZnkgdGhlIHF1ZXJ5IGZpbHRlciwgdGh1cyB3ZW50IHRvIGRpc2suCisKK3xSb3dDYWNoZUhpdCB8Q291bnRlciB8TnVtYmVyIG9mIHRhYmxlIHJvdyBjYWNoZSBoaXRzLgorCit8Um93Q2FjaGVNaXNzIHxDb3VudGVyIHxOdW1iZXIgb2YgdGFibGUgcm93IGNhY2hlIG1pc3Nlcy4KKworfENhc1ByZXBhcmUgfExhdGVuY3kgfExhdGVuY3kgb2YgcGF4b3MgcHJlcGFyZSByb3VuZC4KKworfENhc1Byb3Bvc2UgfExhdGVuY3kgfExhdGVuY3kgb2YgcGF4b3MgcHJvcG9zZSByb3VuZC4KKworfENhc0NvbW1pdCB8TGF0ZW5jeSB8TGF0ZW5jeSBvZiBwYXhvcyBjb21taXQgcm91bmQuCisKK3xQZXJjZW50UmVwYWlyZWQgfEdhdWdlPERvdWJsZT4gfFBlcmNlbnQgb2YgdGFibGUgZGF0YSB0aGF0IGlzIHJlcGFpcmVkCitvbiBkaXNrLgorCit8Qnl0ZXNSZXBhaXJlZCB8R2F1Z2U8TG9uZz4gfFNpemUgb2YgdGFibGUgZGF0YSByZXBhaXJlZCBvbiBkaXNrCisKK3xCeXRlc1VucmVwYWlyZWQgfEdhdWdlPExvbmc+IHxTaXplIG9mIHRhYmxlIGRhdGEgdW5yZXBhaXJlZCBvbiBkaXNrCisKK3xCeXRlc1BlbmRpbmdSZXBhaXIgfEdhdWdlPExvbmc+IHxTaXplIG9mIHRhYmxlIGRhdGEgaXNvbGF0ZWQgZm9yIGFuCitvbmdvaW5nIGluY3JlbWVudGFsIHJlcGFpcgorCit8U3BlY3VsYXRpdmVSZXRyaWVzIHxDb3VudGVyIHxOdW1iZXIgb2YgdGltZXMgc3BlY3VsYXRpdmUgcmV0cmllcyB3ZXJlCitzZW50IGZvciB0aGlzIHRhYmxlLgorCit8U3BlY3VsYXRpdmVGYWlsZWRSZXRyaWVzIHxDb3VudGVyIHxOdW1iZXIgb2Ygc3BlY3VsYXRpdmUgcmV0cmllcyB0aGF0CitmYWlsZWQgdG8gcHJldmVudCBhIHRpbWVvdXQKKworfFNwZWN1bGF0aXZlSW5zdWZmaWNpZW50UmVwbGljYXMgfENvdW50ZXIgfE51bWJlciBvZiBzcGVjdWxhdGl2ZSByZXRyaWVzCit0aGF0IGNvdWxkbid0IGJlIGF0dGVtcHRlZCBkdWUgdG8gbGFjayBvZiByZXBsaWNhcworCit8U3BlY3VsYXRpdmVTYW1wbGVMYXRlbmN5TmFub3MgfEdhdWdlPExvbmc+IHxOdW1iZXIgb2YgbmFub3NlY29uZHMgdG8KK3dhaXQgYmVmb3JlIHNwZWN1bGF0aW9uIGlzIGF0dGVtcHRlZC4gVmFsdWUgbWF5IGJlIHN0YXRpY2FsbHkgY29uZmlndXJlZAorb3IgdXBkYXRlZCBwZXJpb2RpY2FsbHkgYmFzZWQgb24gY29vcmRpbmF0b3IgbGF0ZW5jeS4KKworfFdhaXRpbmdPbkZyZWVNZW10YWJsZVNwYWNlIHxIaXN0b2dyYW0gfEhpc3RvZ3JhbSBvZiB0aW1lIHNwZW50IHdhaXRpbmcKK2ZvciBmcmVlIG1lbXRhYmxlIHNwYWNlLCBlaXRoZXIgb24tIG9yIG9mZi1oZWFwLgorCit8RHJvcHBlZE11dGF0aW9ucyB8Q291bnRlciB8TnVtYmVyIG9mIGRyb3BwZWQgbXV0YXRpb25zIG9uIHRoaXMgdGFibGUuCisKK3xBbnRpY29tcGFjdGlvblRpbWUgfFRpbWVyIHxUaW1lIHNwZW50IGFudGljb21wYWN0aW5nIGJlZm9yZSBhCitjb25zaXN0ZW50IHJlcGFpci4KKworfFZhbGlkYXRpb25UaW1lIHxUaW1lciB8VGltZSBzcGVudCBkb2luZyB2YWxpZGF0aW9uIGNvbXBhY3Rpb24gZHVyaW5nCityZXBhaXIuCisKK3xTeW5jVGltZSB8VGltZXIgfFRpbWUgc3BlbnQgZG9pbmcgc3RyZWFtaW5nIGR1cmluZyByZXBhaXIuCisKK3xCeXRlc1ZhbGlkYXRlZCB8SGlzdG9ncmFtIHxIaXN0b2dyYW0gb3ZlciB0aGUgYW1vdW50IG9mIGJ5dGVzIHJlYWQKK2R1cmluZyB2YWxpZGF0aW9uLgorCit8UGFydGl0aW9uc1ZhbGlkYXRlZCB8SGlzdG9ncmFtIHxIaXN0b2dyYW0gb3ZlciB0aGUgbnVtYmVyIG9mIHBhcnRpdGlvbnMKK3JlYWQgZHVyaW5nIHZhbGlkYXRpb24uCisKK3xCeXRlc0FudGljb21wYWN0ZWQgfENvdW50ZXIgfEhvdyBtYW55IGJ5dGVzIHdlIGFudGljb21wYWN0ZWQuCisKK3xCeXRlc011dGF0ZWRBbnRpY29tcGFjdGlvbiB8Q291bnRlciB8SG93IG1hbnkgYnl0ZXMgd2UgYXZvaWRlZAorYW50aWNvbXBhY3RpbmcgYmVjYXVzZSB0aGUgc3N0YWJsZSB3YXMgZnVsbHkgY29udGFpbmVkIGluIHRoZSByZXBhaXJlZAorcmFuZ2UuCisKK3xNdXRhdGVkQW50aWNvbXBhY3Rpb25HYXVnZSB8R2F1Z2U8RG91YmxlPiB8UmF0aW8gb2YgYnl0ZXMgbXV0YXRlZCB2cwordG90YWwgYnl0ZXMgcmVwYWlyZWQuCit8PT09CisKKz09IEtleXNwYWNlIE1ldHJpY3MKKworRWFjaCBrZXlzcGFjZSBpbiBDYXNzYW5kcmEgaGFzIG1ldHJpY3MgcmVzcG9uc2libGUgZm9yIHRyYWNraW5nIGl0cworc3RhdGUgYW5kIHBlcmZvcm1hbmNlLgorCitNb3N0IG9mIHRoZXNlIG1ldHJpY3MgYXJlIHRoZSBzYW1lIGFzIHRoZSBgVGFibGUgTWV0cmljc2AgYWJvdmUsIG9ubHkKK3RoZXkgYXJlIGFnZ3JlZ2F0ZWQgYXQgdGhlIEtleXNwYWNlIGxldmVsLiBUaGUga2V5c3BhY2Ugc3BlY2lmaWMgbWV0cmljcworYXJlIHNwZWNpZmllZCBpbiB0aGUgdGFibGUgYmVsb3cuCisKK1JlcG9ydGVkIG5hbWUgZm9ybWF0OgorCisqTWV0cmljIE5hbWUqOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3Mua2V5c3BhY2UuPE1ldHJpY05hbWU+LjxLZXlzcGFjZT5gCisqSk1YIE1CZWFuKjo6CisgIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9S2V5c3BhY2Ugc2NvcGU9PEtleXNwYWNlPiBuYW1lPTxNZXRyaWNOYW1lPmAKKworW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgorfFdyaXRlRmFpbGVkSWRlYUNMIHxDb3VudGVyIHxOdW1iZXIgb2Ygd3JpdGVzIHRoYXQgZmFpbGVkIHRvIGFjaGlldmUgdGhlCitjb25maWd1cmVkIGlkZWFsIGNvbnNpc3RlbmN5IGxldmVsIG9yIDAgaWYgbm9uZSBpcyBjb25maWd1cmVkCisKK3xJZGVhbENMV3JpdGVMYXRlbmN5IHxMYXRlbmN5IHxDb29yZGluYXRvciBsYXRlbmN5IG9mIHdyaXRlcyBhdCB0aGUKK2NvbmZpZ3VyZWQgaWRlYWwgY29uc2lzdGVuY3kgbGV2ZWwuIE5vIHZhbHVlcyBhcmUgcmVjb3JkZWQgaWYgaWRlYWwKK2NvbnNpc3RlbmN5IGxldmVsIGlzIG5vdCBjb25maWd1cmVkCisKK3xSZXBhaXJUaW1lIHxUaW1lciB8VG90YWwgdGltZSBzcGVudCBhcyByZXBhaXIgY29vcmRpbmF0b3IuCisKK3xSZXBhaXJQcmVwYXJlVGltZSB8VGltZXIgfFRvdGFsIHRpbWUgc3BlbnQgcHJlcGFyaW5nIGZvciByZXBhaXIuCit8PT09CisKKz09IFRocmVhZFBvb2wgTWV0cmljcworCitDYXNzYW5kcmEgc3BsaXRzIHdvcmsgb2YgYSBwYXJ0aWN1bGFyIHR5cGUgaW50byBpdHMgb3duIHRocmVhZCBwb29sLgorVGhpcyBwcm92aWRlcyBiYWNrLXByZXNzdXJlIGFuZCBhc3luY2hyb255IGZvciByZXF1ZXN0cyBvbiBhIG5vZGUuIEl0J3MKK2ltcG9ydGFudCB0byBtb25pdG9yIHRoZSBzdGF0ZSBvZiB0aGVzZSB0aHJlYWQgcG9vbHMgc2luY2UgdGhleSBjYW4gdGVsbAoreW91IGhvdyBzYXR1cmF0ZWQgYSBub2RlIGlzLgorCitUaGUgbWV0cmljIG5hbWVzIGFyZSBhbGwgYXBwZW5kZWQgd2l0aCB0aGUgc3BlY2lmaWMgYFRocmVhZFBvb2xgIG5hbWUuCitUaGUgdGhyZWFkIHBvb2xzIGFyZSBhbHNvIGNhdGVnb3JpemVkIHVuZGVyIGEgc3BlY2lmaWMgdHlwZS4KKworUmVwb3J0ZWQgbmFtZSBmb3JtYXQ6CisKKypNZXRyaWMgTmFtZSo6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5UaHJlYWRQb29scy48TWV0cmljTmFtZT4uPFBhdGg+LjxUaHJlYWRQb29sTmFtZT5gCisqSk1YIE1CZWFuKjo6CisgIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9VGhyZWFkUG9vbHMgcGF0aD08UGF0aD4gc2NvcGU9PFRocmVhZFBvb2xOYW1lPiBuYW1lPTxNZXRyaWNOYW1lPmAKKworW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgorfEFjdGl2ZVRhc2tzIHxHYXVnZTxJbnRlZ2VyPiB8TnVtYmVyIG9mIHRhc2tzIGJlaW5nIGFjdGl2ZWx5IHdvcmtlZCBvbgorYnkgdGhpcyBwb29sLgorCit8UGVuZGluZ1Rhc2tzIHxHYXVnZTxJbnRlZ2VyPiB8TnVtYmVyIG9mIHF1ZXVlZCB0YXNrcyBxdWV1ZWQgdXAgb24gdGhpcworcG9vbC4KKworfENvbXBsZXRlZFRhc2tzIHxDb3VudGVyIHxOdW1iZXIgb2YgdGFza3MgY29tcGxldGVkLgorCit8VG90YWxCbG9ja2VkVGFza3MgfENvdW50ZXIgfE51bWJlciBvZiB0YXNrcyB0aGF0IHdlcmUgYmxvY2tlZCBkdWUgdG8KK3F1ZXVlIHNhdHVyYXRpb24uCisKK3xDdXJyZW50bHlCbG9ja2VkVGFzayB8Q291bnRlciB8TnVtYmVyIG9mIHRhc2tzIHRoYXQgYXJlIGN1cnJlbnRseQorYmxvY2tlZCBkdWUgdG8gcXVldWUgc2F0dXJhdGlvbiBidXQgb24gcmV0cnkgd2lsbCBiZWNvbWUgdW5ibG9ja2VkLgorCit8TWF4UG9vbFNpemUgfEdhdWdlPEludGVnZXI+IHxUaGUgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkcyBpbiB0aGlzCitwb29sLgorCit8TWF4VGFza3NRdWV1ZWQgfEdhdWdlPEludGVnZXI+IHxUaGUgbWF4aW11bSBudW1iZXIgb2YgdGFza3MgcXVldWVkCitiZWZvcmUgYSB0YXNrIGdldCBibG9ja2VkLgorfD09PQorCitUaGUgZm9sbG93aW5nIHRocmVhZCBwb29scyBjYW4gYmUgbW9uaXRvcmVkLgorCitbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCit8TmF0aXZlLVRyYW5zcG9ydC1SZXF1ZXN0cyB8dHJhbnNwb3J0IHxIYW5kbGVzIGNsaWVudCBDUUwgcmVxdWVzdHMKKworfENvdW50ZXJNdXRhdGlvblN0YWdlIHxyZXF1ZXN0IHxSZXNwb25zaWJsZSBmb3IgY291bnRlciB3cml0ZXMKKworfFZpZXdNdXRhdGlvblN0YWdlIHxyZXF1ZXN0IHxSZXNwb25zaWJsZSBmb3IgbWF0ZXJpYWxpemVkIHZpZXcgd3JpdGVzCisKK3xNdXRhdGlvblN0YWdlIHxyZXF1ZXN0IHxSZXNwb25zaWJsZSBmb3IgYWxsIG90aGVyIHdyaXRlcworCit8UmVhZFJlcGFpclN0YWdlIHxyZXF1ZXN0IHxSZWFkUmVwYWlyIGhhcHBlbnMgb24gdGhpcyB0aHJlYWQgcG9vbAorCit8UmVhZFN0YWdlIHxyZXF1ZXN0IHxMb2NhbCByZWFkcyBydW4gb24gdGhpcyB0aHJlYWQgcG9vbAorCit8UmVxdWVzdFJlc3BvbnNlU3RhZ2UgfHJlcXVlc3QgfENvb3JkaW5hdG9yIHJlcXVlc3RzIHRvIHRoZSBjbHVzdGVyIHJ1bgorb24gdGhpcyB0aHJlYWQgcG9vbAorCit8QW50aUVudHJvcHlTdGFnZSB8aW50ZXJuYWwgfEJ1aWxkcyBtZXJrbGUgdHJlZSBmb3IgcmVwYWlycworCit8Q2FjaGVDbGVhbnVwRXhlY3V0b3IgfGludGVybmFsIHxDYWNoZSBtYWludGVuYW5jZSBwZXJmb3JtZWQgb24gdGhpcwordGhyZWFkIHBvb2wKKworfENvbXBhY3Rpb25FeGVjdXRvciB8aW50ZXJuYWwgfENvbXBhY3Rpb25zIGFyZSBydW4gb24gdGhlc2UgdGhyZWFkcworCit8R29zc2lwU3RhZ2UgfGludGVybmFsIHxIYW5kbGVzIGdvc3NpcCByZXF1ZXN0cworCit8SGludHNEaXNwYXRjaGVyIHxpbnRlcm5hbCB8UGVyZm9ybXMgaGludGVkIGhhbmRvZmYKKworfEludGVybmFsUmVzcG9uc2VTdGFnZSB8aW50ZXJuYWwgfFJlc3BvbnNpYmxlIGZvciBpbnRyYS1jbHVzdGVyCitjYWxsYmFja3MKKworfE1lbXRhYmxlRmx1c2hXcml0ZXIgfGludGVybmFsIHxXcml0ZXMgbWVtdGFibGVzIHRvIGRpc2sKKworfE1lbXRhYmxlUG9zdEZsdXNoIHxpbnRlcm5hbCB8Q2xlYW5zIHVwIGNvbW1pdCBsb2cgYWZ0ZXIgbWVtdGFibGUgaXMKK3dyaXR0ZW4gdG8gZGlzaworCit8TWVtdGFibGVSZWNsYWltTWVtb3J5IHxpbnRlcm5hbCB8TWVtdGFibGUgcmVjeWNsaW5nCisKK3xNaWdyYXRpb25TdGFnZSB8aW50ZXJuYWwgfFJ1bnMgc2NoZW1hIG1pZ3JhdGlvbnMKKworfE1pc2NTdGFnZSB8aW50ZXJuYWwgfE1pc2NlbGVuZW91cyB0YXNrcyBydW4gaGVyZQorCit8UGVuZGluZ1JhbmdlQ2FsY3VsYXRvciB8aW50ZXJuYWwgfENhbGN1bGF0ZXMgdG9rZW4gcmFuZ2UKKworfFBlckRpc2tNZW10YWJsZUZsdXNoV3JpdGVyXzAgfGludGVybmFsIHxSZXNwb25zaWJsZSBmb3Igd3JpdGluZyBhIHNwZWMKKyh0aGVyZSBpcyBvbmUgb2YgdGhlc2UgcGVyIGRpc2sgMC1OKQorCit8U2FtcGxlciB8aW50ZXJuYWwgfFJlc3BvbnNpYmxlIGZvciByZS1zYW1wbGluZyB0aGUgaW5kZXggc3VtbWFyaWVzIG9mCitTU3RhYmxlcworCit8U2Vjb25kYXJ5SW5kZXhNYW5hZ2VtZW50IHxpbnRlcm5hbCB8UGVyZm9ybXMgdXBkYXRlcyB0byBzZWNvbmRhcnkKK2luZGV4ZXMKKworfFZhbGlkYXRpb25FeGVjdXRvciB8aW50ZXJuYWwgfFBlcmZvcm1zIHZhbGlkYXRpb24gY29tcGFjdGlvbiBvcgorc2NydWJiaW5nCisKK3xWaWV3QnVpbGRFeGVjdXRvciB8aW50ZXJuYWwgfFBlcmZvcm1zIG1hdGVyaWFsaXplZCB2aWV3cyBpbml0aWFsIGJ1aWxkCit8PT09CisKKz09IENsaWVudCBSZXF1ZXN0IE1ldHJpY3MKKworQ2xpZW50IHJlcXVlc3RzIGhhdmUgdGhlaXIgb3duIHNldCBvZiBtZXRyaWNzIHRoYXQgZW5jYXBzdWxhdGUgdGhlIHdvcmsKK2hhcHBlbmluZyBhdCBjb29yZGluYXRvciBsZXZlbC4KKworRGlmZmVyZW50IHR5cGVzIG9mIGNsaWVudCByZXF1ZXN0cyBhcmUgYnJva2VuIGRvd24gYnkgYFJlcXVlc3RUeXBlYC4KKworUmVwb3J0ZWQgbmFtZSBmb3JtYXQ6CisKKypNZXRyaWMgTmFtZSo6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DbGllbnRSZXF1ZXN0LjxNZXRyaWNOYW1lPi48UmVxdWVzdFR5cGU+YAorKkpNWCBNQmVhbio6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUNsaWVudFJlcXVlc3Qgc2NvcGU9PFJlcXVlc3RUeXBlPiBuYW1lPTxNZXRyaWNOYW1lPmAKKworUmVxdWVzdFR5cGU6OgorICBDQVNSZWFkCitEZXNjcmlwdGlvbjo6CisgIE1ldHJpY3MgcmVsYXRlZCB0byB0cmFuc2FjdGlvbmFsIHJlYWQgcmVxdWVzdHMuCitNZXRyaWNzOjoKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KK3xUaW1lb3V0cyB8Q291bnRlciB8TnVtYmVyIG9mIHRpbWVvdXRzIGVuY291bnRlcmVkLgorCit8RmFpbHVyZXMgfENvdW50ZXIgfE51bWJlciBvZiB0cmFuc2FjdGlvbiBmYWlsdXJlcyBlbmNvdW50ZXJlZC4KKworfMKgIHxMYXRlbmN5IHxUcmFuc2FjdGlvbiByZWFkIGxhdGVuY3kuCisKK3xVbmF2YWlsYWJsZXMgfENvdW50ZXIgfE51bWJlciBvZiB1bmF2YWlsYWJsZSBleGNlcHRpb25zIGVuY291bnRlcmVkLgorCit8VW5maW5pc2hlZENvbW1pdCB8Q291bnRlciB8TnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgY29tbWl0dGVkCitvbiByZWFkLgorCit8Q29uZGl0aW9uTm90TWV0IHxDb3VudGVyIHxOdW1iZXIgb2YgdHJhbnNhY3Rpb24gcHJlY29uZGl0aW9ucyBkaWQgbm90CittYXRjaCBjdXJyZW50IHZhbHVlcy4KKworfENvbnRlbnRpb25IaXN0b2dyYW0gfEhpc3RvZ3JhbSB8SG93IG1hbnkgY29udGVuZGVkIHJlYWRzIHdlcmUKK2VuY291bnRlcmVkCit8PT09CitSZXF1ZXN0VHlwZTo6CisgIENBU1dyaXRlCitEZXNjcmlwdGlvbjo6CisgIE1ldHJpY3MgcmVsYXRlZCB0byB0cmFuc2FjdGlvbmFsIHdyaXRlIHJlcXVlc3RzLgorTWV0cmljczo6CitbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCit8VGltZW91dHMgfENvdW50ZXIgfE51bWJlciBvZiB0aW1lb3V0cyBlbmNvdW50ZXJlZC4KKworfEZhaWx1cmVzIHxDb3VudGVyIHxOdW1iZXIgb2YgdHJhbnNhY3Rpb24gZmFpbHVyZXMgZW5jb3VudGVyZWQuCisKK3zCoCB8TGF0ZW5jeSB8VHJhbnNhY3Rpb24gd3JpdGUgbGF0ZW5jeS4KKworfFVuYXZhaWxhYmxlcyB8Q291bnRlciB8TnVtYmVyIG9mIHVuYXZhaWxhYmxlIGV4Y2VwdGlvbnMgZW5jb3VudGVyZWQuCisKK3xVbmZpbmlzaGVkQ29tbWl0IHxDb3VudGVyIHxOdW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBjb21taXR0ZWQKK29uIHdyaXRlLgorCit8Q29uZGl0aW9uTm90TWV0IHxDb3VudGVyIHxOdW1iZXIgb2YgdHJhbnNhY3Rpb24gcHJlY29uZGl0aW9ucyBkaWQgbm90CittYXRjaCBjdXJyZW50IHZhbHVlcy4KKworfENvbnRlbnRpb25IaXN0b2dyYW0gfEhpc3RvZ3JhbSB8SG93IG1hbnkgY29udGVuZGVkIHdyaXRlcyB3ZXJlCitlbmNvdW50ZXJlZAorCit8TXV0YXRpb25TaXplSGlzdG9ncmFtIHxIaXN0b2dyYW0gfFRvdGFsIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlcXVlc3RzCittdXRhdGlvbnMuCit8PT09CitSZXF1ZXN0VHlwZTo6CisgIFJlYWQKK0Rlc2NyaXB0aW9uOjoKKyAgTWV0cmljcyByZWxhdGVkIHRvIHN0YW5kYXJkIHJlYWQgcmVxdWVzdHMuCitNZXRyaWNzOjoKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KK3xUaW1lb3V0cyB8Q291bnRlciB8TnVtYmVyIG9mIHRpbWVvdXRzIGVuY291bnRlcmVkLgorfEZhaWx1cmVzIHxDb3VudGVyIHxOdW1iZXIgb2YgcmVhZCBmYWlsdXJlcyBlbmNvdW50ZXJlZC4KK3zCoCB8TGF0ZW5jeSB8UmVhZCBsYXRlbmN5LgorfFVuYXZhaWxhYmxlcyB8Q291bnRlciB8TnVtYmVyIG9mIHVuYXZhaWxhYmxlIGV4Y2VwdGlvbnMgZW5jb3VudGVyZWQuCit8PT09CitSZXF1ZXN0VHlwZTo6CisgIFJhbmdlU2xpY2UKK0Rlc2NyaXB0aW9uOjoKKyAgTWV0cmljcyByZWxhdGVkIHRvIHRva2VuIHJhbmdlIHJlYWQgcmVxdWVzdHMuCitNZXRyaWNzOjoKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KK3xUaW1lb3V0cyB8Q291bnRlciB8TnVtYmVyIG9mIHRpbWVvdXRzIGVuY291bnRlcmVkLgorfEZhaWx1cmVzIHxDb3VudGVyIHxOdW1iZXIgb2YgcmFuZ2UgcXVlcnkgZmFpbHVyZXMgZW5jb3VudGVyZWQuCit8wqAgfExhdGVuY3kgfFJhbmdlIHF1ZXJ5IGxhdGVuY3kuCit8VW5hdmFpbGFibGVzIHxDb3VudGVyIHxOdW1iZXIgb2YgdW5hdmFpbGFibGUgZXhjZXB0aW9ucyBlbmNvdW50ZXJlZC4KK3w9PT0KK1JlcXVlc3RUeXBlOjoKKyAgV3JpdGUKK0Rlc2NyaXB0aW9uOjoKKyAgTWV0cmljcyByZWxhdGVkIHRvIHJlZ3VsYXIgd3JpdGUgcmVxdWVzdHMuCitNZXRyaWNzOjoKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KK3xUaW1lb3V0cyB8Q291bnRlciB8TnVtYmVyIG9mIHRpbWVvdXRzIGVuY291bnRlcmVkLgorCit8RmFpbHVyZXMgfENvdW50ZXIgfE51bWJlciBvZiB3cml0ZSBmYWlsdXJlcyBlbmNvdW50ZXJlZC4KKworfMKgIHxMYXRlbmN5IHxXcml0ZSBsYXRlbmN5LgorCit8VW5hdmFpbGFibGVzIHxDb3VudGVyIHxOdW1iZXIgb2YgdW5hdmFpbGFibGUgZXhjZXB0aW9ucyBlbmNvdW50ZXJlZC4KKworfE11dGF0aW9uU2l6ZUhpc3RvZ3JhbSB8SGlzdG9ncmFtIHxUb3RhbCBzaXplIGluIGJ5dGVzIG9mIHRoZSByZXF1ZXN0cworbXV0YXRpb25zLgorfD09PQorUmVxdWVzdFR5cGU6OgorICBWaWV3V3JpdGUKK0Rlc2NyaXB0aW9uOjoKKyAgTWV0cmljcyByZWxhdGVkIHRvIG1hdGVyaWFsaXplZCB2aWV3IHdyaXRlIHdydGVzLgorTWV0cmljczo6CitbY29scz0iLCwiLF0KK3w9PT0KK3xUaW1lb3V0cyB8Q291bnRlciB8TnVtYmVyIG9mIHRpbWVvdXRzIGVuY291bnRlcmVkLgorCit8RmFpbHVyZXMgfENvdW50ZXIgfE51bWJlciBvZiB0cmFuc2FjdGlvbiBmYWlsdXJlcyBlbmNvdW50ZXJlZC4KKworfFVuYXZhaWxhYmxlcyB8Q291bnRlciB8TnVtYmVyIG9mIHVuYXZhaWxhYmxlIGV4Y2VwdGlvbnMgZW5jb3VudGVyZWQuCisKK3xWaWV3UmVwbGljYXNBdHRlbXB0ZWQgfENvdW50ZXIgfFRvdGFsIG51bWJlciBvZiBhdHRlbXB0ZWQgdmlldworcmVwbGljYSB3cml0ZXMuCisKK3xWaWV3UmVwbGljYXNTdWNjZXNzIHxDb3VudGVyIHxUb3RhbCBudW1iZXIgb2Ygc3VjY2VkZWQgdmlldyByZXBsaWNhCit3cml0ZXMuCisKK3xWaWV3UGVuZGluZ011dGF0aW9ucyB8R2F1Z2U8TG9uZz4gfFZpZXdSZXBsaWNhc0F0dGVtcHRlZCAtCitWaWV3UmVwbGljYXNTdWNjZXNzLgorCit8Vmlld1dyaXRlTGF0ZW5jeSB8VGltZXIgfFRpbWUgYmV0d2VlbiB3aGVuIG11dGF0aW9uIGlzIGFwcGxpZWQgdG8KK2Jhc2UgdGFibGUgYW5kIHdoZW4gQ0wuT05FIGlzIGFjaGlldmVkIG9uIHZpZXcuCit8PT09CisKKz09IENhY2hlIE1ldHJpY3MKKworQ2Fzc2FuZHJhIGNhY2hlcyBoYXZlIG1ldHJpY3MgdG8gdHJhY2sgdGhlIGVmZmVjdGl2bmVzcyBvZiB0aGUgY2FjaGVzLgorVGhvdWdoIHRoZSBgVGFibGUgTWV0cmljc2AgbWlnaHQgYmUgbW9yZSB1c2VmdWwuCisKK1JlcG9ydGVkIG5hbWUgZm9ybWF0OgorCisqTWV0cmljIE5hbWUqOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2FjaGUuPE1ldHJpY05hbWU+LjxDYWNoZU5hbWU+YAorKkpNWCBNQmVhbio6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUNhY2hlIHNjb3BlPTxDYWNoZU5hbWU+IG5hbWU9PE1ldHJpY05hbWU+YAorCitbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCit8Q2FwYWNpdHkgfEdhdWdlPExvbmc+IHxDYWNoZSBjYXBhY2l0eSBpbiBieXRlcy4KK3xFbnRyaWVzIHxHYXVnZTxJbnRlZ2VyPiB8VG90YWwgbnVtYmVyIG9mIGNhY2hlIGVudHJpZXMuCit8RmlmdGVlbk1pbnV0ZUNhY2hlSGl0UmF0ZSB8R2F1Z2U8RG91YmxlPiB8MTVtIGNhY2hlIGhpdCByYXRlLgorfEZpdmVNaW51dGVDYWNoZUhpdFJhdGUgfEdhdWdlPERvdWJsZT4gfDVtIGNhY2hlIGhpdCByYXRlLgorfE9uZU1pbnV0ZUNhY2hlSGl0UmF0ZSB8R2F1Z2U8RG91YmxlPiB8MW0gY2FjaGUgaGl0IHJhdGUuCit8SGl0UmF0ZSB8R2F1Z2U8RG91YmxlPiB8QWxsIHRpbWUgY2FjaGUgaGl0IHJhdGUuCit8SGl0cyB8TWV0ZXIgfFRvdGFsIG51bWJlciBvZiBjYWNoZSBoaXRzLgorfE1pc3NlcyB8TWV0ZXIgfFRvdGFsIG51bWJlciBvZiBjYWNoZSBtaXNzZXMuCit8TWlzc0xhdGVuY3kgfFRpbWVyIHxMYXRlbmN5IG9mIG1pc3Nlcy4KK3xSZXF1ZXN0cyB8R2F1Z2U8TG9uZz4gfFRvdGFsIG51bWJlciBvZiBjYWNoZSByZXF1ZXN0cy4KK3xTaXplIHxHYXVnZTxMb25nPiB8VG90YWwgc2l6ZSBvZiBvY2N1cGllZCBjYWNoZSwgaW4gYnl0ZXMuCit8PT09CisKK1RoZSBmb2xsb3dpbmcgY2FjaGVzIGFyZSBjb3ZlcmVkOgorCitbY29scz0iLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8TmFtZSB8RGVzY3JpcHRpb24KK3xDb3VudGVyQ2FjaGUgfEtlZXBzIGhvdCBjb3VudGVycyBpbiBtZW1vcnkgZm9yIHBlcmZvcm1hbmNlLgorfENodW5rQ2FjaGUgfEluIHByb2Nlc3MgdW5jb21wcmVzc2VkIHBhZ2UgY2FjaGUuCit8S2V5Q2FjaGUgfENhY2hlIGZvciBwYXJ0aXRpb24gdG8gc3N0YWJsZSBvZmZzZXRzLgorfFJvd0NhY2hlIHxDYWNoZSBmb3Igcm93cyBrZXB0IGluIG1lbW9yeS4KK3w9PT0KKworW05PVEVdCis9PT09CitNaXNzZXMgYW5kIE1pc3NMYXRlbmN5IGFyZSBvbmx5IGRlZmluZWQgZm9yIHRoZSBDaHVua0NhY2hlCis9PT09Cis9PSBDUUwgTWV0cmljcworCitNZXRyaWNzIHNwZWNpZmljIHRvIENRTCBwcmVwYXJlZCBzdGF0ZW1lbnQgY2FjaGluZy4KKworUmVwb3J0ZWQgbmFtZSBmb3JtYXQ6CisKKypNZXRyaWMgTmFtZSo6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DUUwuPE1ldHJpY05hbWU+YAorKkpNWCBNQmVhbio6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUNRTCBuYW1lPTxNZXRyaWNOYW1lPmAKKworW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgorfFByZXBhcmVkU3RhdGVtZW50c0NvdW50IHxHYXVnZTxJbnRlZ2VyPiB8TnVtYmVyIG9mIGNhY2hlZCBwcmVwYXJlZAorc3RhdGVtZW50cy4KKworfFByZXBhcmVkU3RhdGVtZW50c0V2aWN0ZWQgfENvdW50ZXIgfE51bWJlciBvZiBwcmVwYXJlZCBzdGF0ZW1lbnRzCitldmljdGVkIGZyb20gdGhlIHByZXBhcmVkIHN0YXRlbWVudCBjYWNoZQorCit8UHJlcGFyZWRTdGF0ZW1lbnRzRXhlY3V0ZWQgfENvdW50ZXIgfE51bWJlciBvZiBwcmVwYXJlZCBzdGF0ZW1lbnRzCitleGVjdXRlZC4KKworfFJlZ3VsYXJTdGF0ZW1lbnRzRXhlY3V0ZWQgfENvdW50ZXIgfE51bWJlciBvZiAqbm9uKiBwcmVwYXJlZCBzdGF0ZW1lbnRzCitleGVjdXRlZC4KKworfFByZXBhcmVkU3RhdGVtZW50c1JhdGlvIHxHYXVnZTxEb3VibGU+IHxQZXJjZW50YWdlIG9mIHN0YXRlbWVudHMgdGhhdAorYXJlIHByZXBhcmVkIHZzIHVucHJlcGFyZWQuCit8PT09CisKK1tbZHJvcHBlZC1tZXRyaWNzXV0KKz09IERyb3BwZWRNZXNzYWdlIE1ldHJpY3MKKworTWV0cmljcyBzcGVjaWZpYyB0byB0cmFja2luZyBkcm9wcGVkIG1lc3NhZ2VzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YKK3JlcXVlc3RzLiBEcm9wcGVkIHdyaXRlcyBhcmUgc3RvcmVkIGFuZCByZXRyaWVkIGJ5IGBIaW50ZWQgSGFuZG9mZmAKKworUmVwb3J0ZWQgbmFtZSBmb3JtYXQ6CisKKypNZXRyaWMgTmFtZSo6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5Ecm9wcGVkTWVzc2FnZS48TWV0cmljTmFtZT4uPFR5cGU+YAorKkpNWCBNQmVhbio6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPURyb3BwZWRNZXNzYWdlIHNjb3BlPTxUeXBlPiBuYW1lPTxNZXRyaWNOYW1lPmAKKworW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgorfENyb3NzTm9kZURyb3BwZWRMYXRlbmN5IHxUaW1lciB8VGhlIGRyb3BwZWQgbGF0ZW5jeSBhY3Jvc3Mgbm9kZXMuCit8SW50ZXJuYWxEcm9wcGVkTGF0ZW5jeSB8VGltZXIgfFRoZSBkcm9wcGVkIGxhdGVuY3kgd2l0aGluIG5vZGUuCit8RHJvcHBlZCB8TWV0ZXIgfE51bWJlciBvZiBkcm9wcGVkIG1lc3NhZ2VzLgorfD09PQorCitUaGUgZGlmZmVyZW50IHR5cGVzIG9mIG1lc3NhZ2VzIHRyYWNrZWQgYXJlOgorCitbY29scz0iLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8TmFtZSB8RGVzY3JpcHRpb24KK3xCQVRDSF9TVE9SRSB8QmF0Y2hsb2cgd3JpdGUKK3xCQVRDSF9SRU1PVkUgfEJhdGNobG9nIGNsZWFudXAgKGFmdGVyIHN1Y2Nlc2Z1bGx5IGFwcGxpZWQpCit8Q09VTlRFUl9NVVRBVElPTiB8Q291bnRlciB3cml0ZXMKK3xISU5UIHxIaW50IHJlcGxheQorfE1VVEFUSU9OIHxSZWd1bGFyIHdyaXRlcworfFJFQUQgfFJlZ3VsYXIgcmVhZHMKK3xSRUFEX1JFUEFJUiB8UmVhZCByZXBhaXIKK3xQQUdFRF9TTElDRSB8UGFnZWQgcmVhZAorfFJBTkdFX1NMSUNFIHxUb2tlbiByYW5nZSByZWFkCit8UkVRVUVTVF9SRVNQT05TRSB8UlBDIENhbGxiYWNrcworfF9UUkFDRSB8VHJhY2luZyB3cml0ZXMKK3w9PT0KKworPT0gU3RyZWFtaW5nIE1ldHJpY3MKKworTWV0cmljcyByZXBvcnRlZCBkdXJpbmcgYFN0cmVhbWluZ2Agb3BlcmF0aW9ucywgc3VjaCBhcyByZXBhaXIsCitib290c3RyYXAsIHJlYnVpbGQuCisKK1RoZXNlIG1ldHJpY3MgYXJlIHNwZWNpZmljIHRvIGEgcGVlciBlbmRwb2ludCwgd2l0aCB0aGUgc291cmNlIG5vZGUKK2JlaW5nIHRoZSBub2RlIHlvdSBhcmUgcHVsbGluZyB0aGUgbWV0cmljcyBmcm9tLgorCitSZXBvcnRlZCBuYW1lIGZvcm1hdDoKKworKk1ldHJpYyBOYW1lKjo6CisgIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlN0cmVhbWluZy48TWV0cmljTmFtZT4uPFBlZXJJUD5gCisqSk1YIE1CZWFuKjo6CisgIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9U3RyZWFtaW5nIHNjb3BlPTxQZWVySVA+IG5hbWU9PE1ldHJpY05hbWU+YAorCitbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCit8SW5jb21pbmdCeXRlcyB8Q291bnRlciB8TnVtYmVyIG9mIGJ5dGVzIHN0cmVhbWVkIHRvIHRoaXMgbm9kZSBmcm9tIHRoZQorcGVlci4KKworfE91dGdvaW5nQnl0ZXMgfENvdW50ZXIgfE51bWJlciBvZiBieXRlcyBzdHJlYW1lZCB0byB0aGUgcGVlciBlbmRwb2ludAorZnJvbSB0aGlzIG5vZGUuCit8PT09CisKKz09IENvbXBhY3Rpb24gTWV0cmljcworCitNZXRyaWNzIHNwZWNpZmljIHRvIGBDb21wYWN0aW9uYCB3b3JrLgorCitSZXBvcnRlZCBuYW1lIGZvcm1hdDoKKworKk1ldHJpYyBOYW1lKjo6CisgIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNvbXBhY3Rpb24uPE1ldHJpY05hbWU+YAorKkpNWCBNQmVhbio6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUNvbXBhY3Rpb24gbmFtZT08TWV0cmljTmFtZT5gCisKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KK3xCeXRlc0NvbXBhY3RlZCB8Q291bnRlciB8VG90YWwgbnVtYmVyIG9mIGJ5dGVzIGNvbXBhY3RlZCBzaW5jZSBzZXJ2ZXIKK1tyZV1zdGFydC4KKworfFBlbmRpbmdUYXNrcyB8R2F1Z2U8SW50ZWdlcj4gfEVzdGltYXRlZCBudW1iZXIgb2YgY29tcGFjdGlvbnMgcmVtYWluaW5nCit0byBwZXJmb3JtLgorCit8Q29tcGxldGVkVGFza3MgfEdhdWdlPExvbmc+IHxOdW1iZXIgb2YgY29tcGxldGVkIGNvbXBhY3Rpb25zIHNpbmNlCitzZXJ2ZXIgW3JlXXN0YXJ0LgorCit8VG90YWxDb21wYWN0aW9uc0NvbXBsZXRlZCB8TWV0ZXIgfFRocm91Z2hwdXQgb2YgY29tcGxldGVkIGNvbXBhY3Rpb25zCitzaW5jZSBzZXJ2ZXIgW3JlXXN0YXJ0LgorCit8UGVuZGluZ1Rhc2tzQnlUYWJsZU5hbWUgfEdhdWdlPE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIEludGVnZXI+Pj4KK3xFc3RpbWF0ZWQgbnVtYmVyIG9mIGNvbXBhY3Rpb25zIHJlbWFpbmluZyB0byBwZXJmb3JtLCBncm91cGVkIGJ5CitrZXlzcGFjZSBhbmQgdGhlbiB0YWJsZSBuYW1lLiBUaGlzIGluZm8gaXMgYWxzbyBrZXB0IGluIGBUYWJsZSBNZXRyaWNzYC4KK3w9PT0KKworPT0gQ29tbWl0TG9nIE1ldHJpY3MKKworTWV0cmljcyBzcGVjaWZpYyB0byB0aGUgYENvbW1pdExvZ2AKKworUmVwb3J0ZWQgbmFtZSBmb3JtYXQ6CisKKypNZXRyaWMgTmFtZSo6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5Db21taXRMb2cuPE1ldHJpY05hbWU+YAorKkpNWCBNQmVhbio6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUNvbW1pdExvZyBuYW1lPTxNZXRyaWNOYW1lPmAKKworW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgorfENvbXBsZXRlZFRhc2tzIHxHYXVnZTxMb25nPiB8VG90YWwgbnVtYmVyIG9mIGNvbW1pdCBsb2cgbWVzc2FnZXMKK3dyaXR0ZW4gc2luY2UgW3JlXXN0YXJ0LgorCit8UGVuZGluZ1Rhc2tzIHxHYXVnZTxMb25nPiB8TnVtYmVyIG9mIGNvbW1pdCBsb2cgbWVzc2FnZXMgd3JpdHRlbiBidXQKK3lldCB0byBiZSBmc3luYydkLgorCit8VG90YWxDb21taXRMb2dTaXplIHxHYXVnZTxMb25nPiB8Q3VycmVudCBzaXplLCBpbiBieXRlcywgdXNlZCBieSBhbGwKK3RoZSBjb21taXQgbG9nIHNlZ21lbnRzLgorCit8V2FpdGluZ09uU2VnbWVudEFsbG9jYXRpb24gfFRpbWVyIHxUaW1lIHNwZW50IHdhaXRpbmcgZm9yIGEKK0NvbW1pdExvZ1NlZ21lbnQgdG8gYmUgYWxsb2NhdGVkIC0gdW5kZXIgbm9ybWFsIGNvbmRpdGlvbnMgdGhpcyBzaG91bGQKK2JlIHplcm8uCisKK3xXYWl0aW5nT25Db21taXQgfFRpbWVyIHxUaGUgdGltZSBzcGVudCB3YWl0aW5nIG9uIENMIGZzeW5jOyBmb3IKK1BlcmlvZGljIHRoaXMgaXMgb25seSBvY2N1cnMgd2hlbiB0aGUgc3luYyBpcyBsYWdnaW5nIGl0cyBzeW5jIGludGVydmFsLgorfD09PQorCis9PSBTdG9yYWdlIE1ldHJpY3MKKworTWV0cmljcyBzcGVjaWZpYyB0byB0aGUgc3RvcmFnZSBlbmdpbmUuCisKK1JlcG9ydGVkIG5hbWUgZm9ybWF0OgorCisqTWV0cmljIE5hbWUqOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuU3RvcmFnZS48TWV0cmljTmFtZT5gCisqSk1YIE1CZWFuKjo6CisgIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9U3RvcmFnZSBuYW1lPTxNZXRyaWNOYW1lPmAKKworW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgorfEV4Y2VwdGlvbnMgfENvdW50ZXIgfE51bWJlciBvZiBpbnRlcm5hbCBleGNlcHRpb25zIGNhdWdodC4gVW5kZXIgbm9ybWFsCitleGNlcHRpb25zIHRoaXMgc2hvdWxkIGJlIHplcm8uCisKK3xMb2FkIHxDb3VudGVyIHxTaXplLCBpbiBieXRlcywgb2YgdGhlIG9uIGRpc2sgZGF0YSBzaXplIHRoaXMgbm9kZQorbWFuYWdlcy4KKworfFRvdGFsSGludHMgfENvdW50ZXIgfE51bWJlciBvZiBoaW50IG1lc3NhZ2VzIHdyaXR0ZW4gdG8gdGhpcyBub2RlIHNpbmNlCitbcmVdc3RhcnQuIEluY2x1ZGVzIG9uZSBlbnRyeSBmb3IgZWFjaCBob3N0IHRvIGJlIGhpbnRlZCBwZXIgaGludC4KKworfFRvdGFsSGludHNJblByb2dyZXNzIHxDb3VudGVyIHxOdW1iZXIgb2YgaGludHMgYXR0ZW1waW5nIHRvIGJlIHNlbnQKK2N1cnJlbnRseS4KK3w9PT0KKworW1toYW5kb2ZmLW1ldHJpY3NdXQorPT0gSGludGVkSGFuZG9mZiBNZXRyaWNzCisKK01ldHJpY3Mgc3BlY2lmaWMgdG8gSGludGVkIEhhbmRvZmYuIFRoZXJlIGFyZSBhbHNvIHNvbWUgbWV0cmljcyByZWxhdGVkCit0byBoaW50cyB0cmFja2VkIGluIGBTdG9yYWdlIE1ldHJpY3NgCisKK1RoZXNlIG1ldHJpY3MgaW5jbHVkZSB0aGUgcGVlciBlbmRwb2ludCAqaW4gdGhlIG1ldHJpYyBuYW1lKgorCitSZXBvcnRlZCBuYW1lIGZvcm1hdDoKKworKk1ldHJpYyBOYW1lKjo6CisgIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkhpbnRlZEhhbmRPZmZNYW5hZ2VyLjxNZXRyaWNOYW1lPmAKKypKTVggTUJlYW4qOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1IaW50ZWRIYW5kT2ZmTWFuYWdlciBuYW1lPTxNZXRyaWNOYW1lPmAKKworW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgorfEhpbnRzX2NyZWF0ZWQtPFBlZXJJUD4gYXwKK19fX18KK0NvdW50ZXIKK19fX18KKworYXwKK19fX18KK051bWJlciBvZiBoaW50cyBvbiBkaXNrIGZvciB0aGlzIHBlZXIuCitfX19fCisKK3xIaW50c19ub3Rfc3RvcmVkLTxQZWVySVA+IGF8CitfX19fCitDb3VudGVyCitfX19fCisKK2F8CitfX19fCitOdW1iZXIgb2YgaGludHMgbm90IHN0b3JlZCBmb3IgdGhpcyBwZWVyLCBkdWUgdG8gYmVpbmcgZG93biBwYXN0IHRoZQorY29uZmlndXJlZCBoaW50IHdpbmRvdy4KK19fX18KKworfD09PQorCis9PSBIaW50c1NlcnZpY2UgTWV0cmljcworCitNZXRyaWNzIHNwZWNpZmljIHRvIHRoZSBIaW50cyBkZWxpdmVyeSBzZXJ2aWNlLiBUaGVyZSBhcmUgYWxzbyBzb21lCittZXRyaWNzIHJlbGF0ZWQgdG8gaGludHMgdHJhY2tlZCBpbiBgU3RvcmFnZSBNZXRyaWNzYAorCitUaGVzZSBtZXRyaWNzIGluY2x1ZGUgdGhlIHBlZXIgZW5kcG9pbnQgKmluIHRoZSBtZXRyaWMgbmFtZSoKKworUmVwb3J0ZWQgbmFtZSBmb3JtYXQ6CisKKypNZXRyaWMgTmFtZSo6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5IaW50c1NlcnZpY2UuPE1ldHJpY05hbWU+YAorKkpNWCBNQmVhbio6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUhpbnRzU2VydmljZSBuYW1lPTxNZXRyaWNOYW1lPmAKKworW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgorfEhpbnRzU3VjY2VlZGVkIGF8CitfX19fCitNZXRlcgorX19fXworCithfAorX19fXworQSBtZXRlciBvZiB0aGUgaGludHMgc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZAorX19fXworCit8SGludHNGYWlsZWQgYXwKK19fX18KK01ldGVyCitfX19fCisKK2F8CitfX19fCitBIG1ldGVyIG9mIHRoZSBoaW50cyB0aGF0IGZhaWxlZCBkZWxpdmVyCitfX19fCisKK3xIaW50c1RpbWVkT3V0IGF8CitfX19fCitNZXRlcgorX19fXworCithfAorX19fXworQSBtZXRlciBvZiB0aGUgaGludHMgdGhhdCB0aW1lZCBvdXQKK19fX18KKworfEhpbnRfZGVsYXlzIHxIaXN0b2dyYW0gfEhpc3RvZ3JhbSBvZiBoaW50IGRlbGl2ZXJ5IGRlbGF5cyAoaW4KK21pbGxpc2Vjb25kcykKKworfEhpbnRfZGVsYXlzLTxQZWVySVA+IHxIaXN0b2dyYW0gfEhpc3RvZ3JhbSBvZiBoaW50IGRlbGl2ZXJ5IGRlbGF5cyAoaW4KK21pbGxpc2Vjb25kcykgcGVyIHBlZXIKK3w9PT0KKworPT0gU1NUYWJsZSBJbmRleCBNZXRyaWNzCisKK01ldHJpY3Mgc3BlY2lmaWMgdG8gdGhlIFNTVGFibGUgaW5kZXggbWV0YWRhdGEuCisKK1JlcG9ydGVkIG5hbWUgZm9ybWF0OgorCisqTWV0cmljIE5hbWUqOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuSW5kZXguPE1ldHJpY05hbWU+LlJvd0luZGV4RW50cnlgCisqSk1YIE1CZWFuKjo6CisgIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9SW5kZXggc2NvcGU9Um93SW5kZXhFbnRyeSBuYW1lPTxNZXRyaWNOYW1lPmAKKworW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgorfEluZGV4ZWRFbnRyeVNpemUgfEhpc3RvZ3JhbSB8SGlzdG9ncmFtIG9mIHRoZSBvbi1oZWFwIHNpemUsIGluIGJ5dGVzLAorb2YgdGhlIGluZGV4IGFjcm9zcyBhbGwgU1NUYWJsZXMuCisKK3xJbmRleEluZm9Db3VudCB8SGlzdG9ncmFtIHxIaXN0b2dyYW0gb2YgdGhlIG51bWJlciBvZiBvbi1oZWFwIGluZGV4CitlbnRyaWVzIG1hbmFnZWQgYWNyb3NzIGFsbCBTU1RhYmxlcy4KKworfEluZGV4SW5mb0dldHMgfEhpc3RvZ3JhbSB8SGlzdG9ncmFtIG9mIHRoZSBudW1iZXIgaW5kZXggc2Vla3MgcGVyZm9ybWVkCitwZXIgU1NUYWJsZS4KK3w9PT0KKworPT0gQnVmZmVyUG9vbCBNZXRyaWNzCisKK01ldHJpY3Mgc3BlY2lmaWMgdG8gdGhlIGludGVybmFsIHJlY3ljbGVkIGJ1ZmZlciBwb29sIENhc3NhbmRyYSBtYW5hZ2VzLgorVGhpcyBwb29sIGlzIG1lYW50IHRvIGtlZXAgYWxsb2NhdGlvbnMgYW5kIEdDIGxvd2VyIGJ5IHJlY3ljbGluZyBvbiBhbmQKK29mZiBoZWFwIGJ1ZmZlcnMuCisKK1JlcG9ydGVkIG5hbWUgZm9ybWF0OgorCisqTWV0cmljIE5hbWUqOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQnVmZmVyUG9vbC48TWV0cmljTmFtZT5gCisqSk1YIE1CZWFuKjo6CisgIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9QnVmZmVyUG9vbCBuYW1lPTxNZXRyaWNOYW1lPmAKKworW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgorfFNpemUgfEdhdWdlPExvbmc+IHxTaXplLCBpbiBieXRlcywgb2YgdGhlIG1hbmFnZWQgYnVmZmVyIHBvb2wKKworfE1pc3NlcyB8TWV0ZXIgYXwKK19fX18KK1RoZSByYXRlIG9mIG1pc3NlcyBpbiB0aGUgcG9vbC4gVGhlIGhpZ2hlciB0aGlzIGlzIHRoZSBtb3JlIGFsbG9jYXRpb25zCitpbmN1cnJlZC4KK19fX18KKworfD09PQorCis9PSBDbGllbnQgTWV0cmljcworCitNZXRyaWNzIHNwZWNpZmMgdG8gY2xpZW50IG1hbmFnbWVudC4KKworUmVwb3J0ZWQgbmFtZSBmb3JtYXQ6CisKKypNZXRyaWMgTmFtZSo6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DbGllbnQuPE1ldHJpY05hbWU+YAorKkpNWCBNQmVhbio6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUNsaWVudCBuYW1lPTxNZXRyaWNOYW1lPmAKKworW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgorfGNvbm5lY3RlZE5hdGl2ZUNsaWVudHMgfEdhdWdlPEludGVnZXI+IHxOdW1iZXIgb2YgY2xpZW50cyBjb25uZWN0ZWQgdG8KK3RoaXMgbm9kZXMgbmF0aXZlIHByb3RvY29sIHNlcnZlcgorCit8Y29ubmVjdGlvbnMgfEdhdWdlPExpc3Q8TWFwPFN0cmluZywgU3RyaW5nPj4gfExpc3Qgb2YgYWxsIGNvbm5lY3Rpb25zCithbmQgdGhlaXIgc3RhdGUgaW5mb3JtYXRpb24KKworfGNvbm5lY3RlZE5hdGl2ZUNsaWVudHNCeVVzZXIgfEdhdWdlPE1hcDxTdHJpbmcsIEludD4gfE51bWJlciBvZgorY29ubm5lY3RpdmUgbmF0aXZlIGNsaWVudHMgYnkgdXNlcm5hbWUKK3w9PT0KKworPT0gQmF0Y2ggTWV0cmljcworCitNZXRyaWNzIHNwZWNpZmMgdG8gYmF0Y2ggc3RhdGVtZW50cy4KKworUmVwb3J0ZWQgbmFtZSBmb3JtYXQ6CisKKypNZXRyaWMgTmFtZSo6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5CYXRjaC48TWV0cmljTmFtZT5gCisqSk1YIE1CZWFuKjo6CisgIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9QmF0Y2ggbmFtZT08TWV0cmljTmFtZT5gCisKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KK3xQYXJ0aXRpb25zUGVyQ291bnRlckJhdGNoIHxIaXN0b2dyYW0gfERpc3RyaWJ1dGlvbiBvZiB0aGUgbnVtYmVyIG9mCitwYXJ0aXRpb25zIHByb2Nlc3NlZCBwZXIgY291bnRlciBiYXRjaAorCit8UGFydGl0aW9uc1BlckxvZ2dlZEJhdGNoIHxIaXN0b2dyYW0gfERpc3RyaWJ1dGlvbiBvZiB0aGUgbnVtYmVyIG9mCitwYXJ0aXRpb25zIHByb2Nlc3NlZCBwZXIgbG9nZ2VkIGJhdGNoCisKK3xQYXJ0aXRpb25zUGVyVW5sb2dnZWRCYXRjaCB8SGlzdG9ncmFtIHxEaXN0cmlidXRpb24gb2YgdGhlIG51bWJlciBvZgorcGFydGl0aW9ucyBwcm9jZXNzZWQgcGVyIHVubG9nZ2VkIGJhdGNoCit8PT09CisKKz09IEpWTSBNZXRyaWNzCisKK0pWTSBtZXRyaWNzIHN1Y2ggYXMgbWVtb3J5IGFuZCBnYXJiYWdlIGNvbGxlY3Rpb24gc3RhdGlzdGljcyBjYW4gZWl0aGVyCitiZSBhY2Nlc3NlZCBieSBjb25uZWN0aW5nIHRvIHRoZSBKVk0gdXNpbmcgSk1YIG9yIGNhbiBiZSBleHBvcnRlZCB1c2luZworPDxtZXRyaWNfcmVwb3J0ZXJzPj4uCisKKz09PSBCdWZmZXJQb29sCisKKypNZXRyaWMgTmFtZSo6OgorICBganZtLmJ1ZmZlcnMuPGRpcmVjdHxtYXBwZWQ+LjxNZXRyaWNOYW1lPmAKKypKTVggTUJlYW4qOjoKKyAgYGphdmEubmlvOnR5cGU9QnVmZmVyUG9vbCBuYW1lPTxkaXJlY3R8bWFwcGVkPmAKKworW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgorfENhcGFjaXR5IHxHYXVnZTxMb25nPiB8RXN0aW1hdGVkIHRvdGFsIGNhcGFjaXR5IG9mIHRoZSBidWZmZXJzIGluIHRoaXMKK3Bvb2wKKworfENvdW50IHxHYXVnZTxMb25nPiB8RXN0aW1hdGVkIG51bWJlciBvZiBidWZmZXJzIGluIHRoZSBwb29sCisKK3xVc2VkIHxHYXVnZTxMb25nPiB8RXN0aW1hdGVkIG1lbW9yeSB0aGF0IHRoZSBKYXZhIHZpcnR1YWwgbWFjaGluZSBpcwordXNpbmcgZm9yIHRoaXMgYnVmZmVyIHBvb2wKK3w9PT0KKworPT09IEZpbGVEZXNjcmlwdG9yUmF0aW8KKworKk1ldHJpYyBOYW1lKjo6CisgIGBqdm0uZmQuPE1ldHJpY05hbWU+YAorKkpNWCBNQmVhbio6OgorICBgamF2YS5sYW5nOnR5cGU9T3BlcmF0aW5nU3lzdGVtIG5hbWU9PE9wZW5GaWxlRGVzY3JpcHRvckNvdW50fE1heEZpbGVEZXNjcmlwdG9yQ291bnQ+YAorCitbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCit8VXNhZ2UgfFJhdGlvIHxSYXRpbyBvZiB1c2VkIHRvIHRvdGFsIGZpbGUgZGVzY3JpcHRvcnMKK3w9PT0KKworPT09IEdhcmJhZ2VDb2xsZWN0b3IKKworKk1ldHJpYyBOYW1lKjo6CisgIGBqdm0uZ2MuPGdjX3R5cGU+LjxNZXRyaWNOYW1lPmAKKypKTVggTUJlYW4qOjoKKyAgYGphdmEubGFuZzp0eXBlPUdhcmJhZ2VDb2xsZWN0b3IgbmFtZT08Z2NfdHlwZT5gCisKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KK3xDb3VudCB8R2F1Z2U8TG9uZz4gfFRvdGFsIG51bWJlciBvZiBjb2xsZWN0aW9ucyB0aGF0IGhhdmUgb2NjdXJyZWQKKworfFRpbWUgfEdhdWdlPExvbmc+IHxBcHByb3hpbWF0ZSBhY2N1bXVsYXRlZCBjb2xsZWN0aW9uIGVsYXBzZWQgdGltZSBpbgorbWlsbGlzZWNvbmRzCit8PT09CisKKz09PSBNZW1vcnkKKworKk1ldHJpYyBOYW1lKjo6CisgIGBqdm0ubWVtb3J5LjxoZWFwL25vbi1oZWFwL3RvdGFsPi48TWV0cmljTmFtZT5gCisqSk1YIE1CZWFuKjo6CisgIGBqYXZhLmxhbmc6dHlwZT1NZW1vcnlgCisKK1tjb2xzPSIsLCIsXQorfD09PQorfENvbW1pdHRlZCB8R2F1Z2U8TG9uZz4gfEFtb3VudCBvZiBtZW1vcnkgaW4gYnl0ZXMgdGhhdCBpcyBjb21taXR0ZWQgZm9yCit0aGUgSlZNIHRvIHVzZQorCit8SW5pdCB8R2F1Z2U8TG9uZz4gfEFtb3VudCBvZiBtZW1vcnkgaW4gYnl0ZXMgdGhhdCB0aGUgSlZNIGluaXRpYWxseQorcmVxdWVzdHMgZnJvbSB0aGUgT1MKKworfE1heCB8R2F1Z2U8TG9uZz4gfE1heGltdW0gYW1vdW50IG9mIG1lbW9yeSBpbiBieXRlcyB0aGF0IGNhbiBiZSB1c2VkCitmb3IgbWVtb3J5IG1hbmFnZW1lbnQKKworfFVzYWdlIHxSYXRpbyB8UmF0aW8gb2YgdXNlZCB0byBtYXhpbXVtIG1lbW9yeQorCit8VXNlZCB8R2F1Z2U8TG9uZz4gfEFtb3VudCBvZiB1c2VkIG1lbW9yeSBpbiBieXRlcworfD09PQorCis9PT0gTWVtb3J5UG9vbAorCisqTWV0cmljIE5hbWUqOjoKKyAgYGp2bS5tZW1vcnkucG9vbHMuPG1lbW9yeV9wb29sPi48TWV0cmljTmFtZT5gCisqSk1YIE1CZWFuKjo6CisgIGBqYXZhLmxhbmc6dHlwZT1NZW1vcnlQb29sIG5hbWU9PG1lbW9yeV9wb29sPmAKKworW2NvbHM9IiwsIixdCit8PT09Cit8Q29tbWl0dGVkIHxHYXVnZTxMb25nPiB8QW1vdW50IG9mIG1lbW9yeSBpbiBieXRlcyB0aGF0IGlzIGNvbW1pdHRlZCBmb3IKK3RoZSBKVk0gdG8gdXNlCisKK3xJbml0IHxHYXVnZTxMb25nPiB8QW1vdW50IG9mIG1lbW9yeSBpbiBieXRlcyB0aGF0IHRoZSBKVk0gaW5pdGlhbGx5CityZXF1ZXN0cyBmcm9tIHRoZSBPUworCit8TWF4IHxHYXVnZTxMb25nPiB8TWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IGluIGJ5dGVzIHRoYXQgY2FuIGJlIHVzZWQKK2ZvciBtZW1vcnkgbWFuYWdlbWVudAorCit8VXNhZ2UgfFJhdGlvIHxSYXRpbyBvZiB1c2VkIHRvIG1heGltdW0gbWVtb3J5CisKK3xVc2VkIHxHYXVnZTxMb25nPiB8QW1vdW50IG9mIHVzZWQgbWVtb3J5IGluIGJ5dGVzCit8PT09CisKKz09IEpNWAorCitBbnkgSk1YIGJhc2VkIGNsaWVudCBjYW4gYWNjZXNzIG1ldHJpY3MgZnJvbSBjYXNzYW5kcmEuCisKK0lmIHlvdSB3aXNoIHRvIGFjY2VzcyBKTVggbWV0cmljcyBvdmVyIGh0dHAgaXQncyBwb3NzaWJsZSB0byBkb3dubG9hZAoraHR0cDovL214NGouc291cmNlZm9yZ2UubmV0L1tNeDRqVG9vbF0gYW5kIHBsYWNlIGBteDRqLXRvb2xzLmphcmAgaW50bwordGhlIGNsYXNzcGF0aC4gT24gc3RhcnR1cCB5b3Ugd2lsbCBzZWUgaW4gdGhlIGxvZzoKKworW3NvdXJjZSxub25lXQorLS0tLQorSHR0cEFkYXB0b3IgdmVyc2lvbiAzLjAuMiBzdGFydGVkIG9uIHBvcnQgODA4MQorLS0tLQorCitUbyBjaG9vc2UgYSBkaWZmZXJlbnQgcG9ydCAoODA4MSBpcyB0aGUgZGVmYXVsdCkgb3IgYSBkaWZmZXJlbnQgbGlzdGVuCithZGRyZXNzICgwLjAuMC4wIGlzIG5vdCB0aGUgZGVmYXVsdCkgZWRpdCBgY29uZi9jYXNzYW5kcmEtZW52LnNoYCBhbmQKK3VuY29tbWVudDoKKworW3NvdXJjZSxub25lXQorLS0tLQorI01YNEpfQUREUkVTUz0iLURteDRqYWRkcmVzcz0wLjAuMC4wIgorCisjTVg0Sl9QT1JUPSItRG14NGpwb3J0PTgwODEiCistLS0tCisKKz09IE1ldHJpYyBSZXBvcnRlcnMgW1ttZXRyaWNfcmVwb3J0ZXJzXV0KKworQXMgbWVudGlvbmVkIGF0IHRoZSB0b3Agb2YgdGhpcyBzZWN0aW9uIG9uIG1vbml0b3JpbmcgdGhlIENhc3NhbmRyYQorbWV0cmljcyBjYW4gYmUgZXhwb3J0ZWQgdG8gYSBudW1iZXIgb2YgbW9uaXRvcmluZyBzeXN0ZW0gYSBudW1iZXIgb2YKK2h0dHA6Ly9tZXRyaWNzLmRyb3B3aXphcmQuaW8vMy4xLjAvZ2V0dGluZy1zdGFydGVkLyNvdGhlci1yZXBvcnRpbmdbYnVpbHQKK2luXSBhbmQgaHR0cDovL21ldHJpY3MuZHJvcHdpemFyZC5pby8zLjEuMC9tYW51YWwvdGhpcmQtcGFydHkvW3RoaXJkCitwYXJ0eV0gcmVwb3J0ZXIgcGx1Z2lucy4KKworVGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlc2UgcGx1Z2lucyBpcyBtYW5hZ2VkIGJ5IHRoZQoraHR0cHM6Ly9naXRodWIuY29tL2FkZHRoaXMvbWV0cmljcy1yZXBvcnRlci1jb25maWdbbWV0cmljcyByZXBvcnRlcgorY29uZmlnIHByb2plY3RdLiBUaGVyZSBpcyBhIHNhbXBsZSBjb25maWd1cmF0aW9uIGZpbGUgbG9jYXRlZCBhdAorYGNvbmYvbWV0cmljcy1yZXBvcnRlci1jb25maWctc2FtcGxlLnlhbWxgLgorCitPbmNlIGNvbmZpZ3VyZWQsIHlvdSBzaW1wbHkgc3RhcnQgY2Fzc2FuZHJhIHdpdGggdGhlIGZsYWcKK2AtRGNhc3NhbmRyYS5tZXRyaWNzUmVwb3J0ZXJDb25maWdGaWxlPW1ldHJpY3MtcmVwb3J0ZXItY29uZmlnLnlhbWxgLgorVGhlIHNwZWNpZmllZCAueWFtbCBmaWxlIHBsdXMgYW55IDNyZCBwYXJ0eSByZXBvcnRlciBqYXJzIG11c3QgYWxsIGJlIGluCitDYXNzYW5kcmEncyBjbGFzc3BhdGguCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL3JlYWRfcmVwYWlyLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL3JlYWRfcmVwYWlyLmFkb2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvcmVhZF9yZXBhaXIuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9yZWFkX3JlcGFpci5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL3JlcGFpci5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9yZXBhaXIuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9yZXBhaXIuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9yZXBhaXIuYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9zZWN1cml0eS5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9zZWN1cml0eS5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL3NlY3VyaXR5LmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvc2VjdXJpdHkuYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy90b3BvX2NoYW5nZXMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvdG9wb19jaGFuZ2VzLmFkb2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvdG9wb19jaGFuZ2VzLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvdG9wb19jaGFuZ2VzLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvdHJhbnNpZW50cmVwbGljYXRpb24uYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvdHJhbnNpZW50cmVwbGljYXRpb24uYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy90cmFuc2llbnRyZXBsaWNhdGlvbi5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL3RyYW5zaWVudHJlcGxpY2F0aW9uLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvdmlydHVhbHRhYmxlcy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy92aXJ0dWFsdGFibGVzLmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EwYmNiMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvdmlydHVhbHRhYmxlcy5hZG9jCkBAIC0wLDAgKzEsNDg0IEBACis9IFZpcnR1YWwgVGFibGVzCisKK0FwYWNoZSBDYXNzYW5kcmEgNC4wIGltcGxlbWVudHMgdmlydHVhbCB0YWJsZXMgKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTc2MjJbQ0FTU0FORFJBLTc2MjJdKS4KK1ZpcnR1YWwgdGFibGVzIGFyZSB0YWJsZXMgYmFja2VkIGJ5IGFuIEFQSSBpbnN0ZWFkIG9mIGRhdGEgZXhwbGljaXRseSBtYW5hZ2VkIGFuZCBzdG9yZWQgYXMgU1NUYWJsZXMuIAorQXBhY2hlIENhc3NhbmRyYSA0LjAgaW1wbGVtZW50cyBhIHZpcnR1YWwga2V5c3BhY2UgaW50ZXJmYWNlIGZvciB2aXJ0dWFsIHRhYmxlcy4gCitWaXJ0dWFsIHRhYmxlcyBhcmUgc3BlY2lmaWMgdG8gZWFjaCBub2RlLgorCitTb21lIG9mIHRoZSBmZWF0dXJlcyBvZiB2aXJ0dWFsIHRhYmxlcyBhcmUgdGhlIGFiaWxpdHkgdG86CisKKyogZXhwb3NlIG1ldHJpY3MgdGhyb3VnaCBDUUwKKyogZXhwb3NlIFlBTUwgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbgorCitWaXJ0dWFsIGtleXNwYWNlcyBhbmQgdGFibGVzIGFyZSBxdWl0ZSBkaWZmZXJlbnQgZnJvbSByZWd1bGFyIHRhYmxlcyBhbmQga2V5c3BhY2VzOgorCisqIFZpcnR1YWwgdGFibGVzIGFyZSBjcmVhdGVkIGluIHNwZWNpYWwga2V5c3BhY2VzIGFuZCBub3QganVzdCBhbnkga2V5c3BhY2UuCisqIFZpcnR1YWwgdGFibGVzIGFyZSBtYW5hZ2VkIGJ5IENhc3NhbmRyYS4gVXNlcnMgY2Fubm90IHJ1biBEREwgdG8gY3JlYXRlIG5ldyB2aXJ0dWFsIHRhYmxlcyBvciBETUwgdG8gbW9kaWZ5IGV4aXN0aW5nIHZpcnR1YWwgdGFibGVzLgorKiBWaXJ0dWFsIHRhYmxlcyBhcmUgY3VycmVudGx5IHJlYWQtb25seSwgYWx0aG91Z2ggdGhhdCBtYXkgY2hhbmdlIGluIGEgbGF0ZXIgdmVyc2lvbi4KKyogVmlydHVhbCB0YWJsZXMgYXJlIGxvY2FsIG9ubHksIG5vbi1kaXN0cmlidXRlZCwgYW5kIHRodXMgbm90IHJlcGxpY2F0ZWQuCisqIFZpcnR1YWwgdGFibGVzIGhhdmUgbm8gYXNzb2NpYXRlZCBTU1RhYmxlcy4KKyogQ29uc2lzdGVuY3kgbGV2ZWwgb2YgdGhlIHF1ZXJpZXMgc2VudCB0byB2aXJ0dWFsIHRhYmxlcyBhcmUgaWdub3JlZC4KKyogQWxsIGV4aXN0aW5nIHZpcnR1YWwgdGFibGVzIHVzZSBgTG9jYWxQYXJ0aXRpb25lcmAuIAorU2luY2UgYSB2aXJ0dWFsIHRhYmxlIGlzIG5vdCByZXBsaWNhdGVkIHRoZSBwYXJ0aXRpb25lciBzb3J0cyBpbiBvcmRlciBvZiBwYXJ0aXRpb24ga2V5cyBpbnN0ZWFkIG9mIGJ5IHRoZWlyIGhhc2guCisqIE1ha2luZyBhZHZhbmNlZCBxdWVyaWVzIHVzaW5nIGBBTExPVyBGSUxURVJJTkdgIGFuZCBhZ2dyZWdhdGlvbiBmdW5jdGlvbnMgY2FuIGJlIGV4ZWN1dGVkIGluIHZpcnR1YWwgdGFibGVzLCBldmVuIHRob3VnaCBpbiBub3JtYWwgdGFibGVzIHdlIGRvIG5vdCByZWNvbW1lbmQgaXQuCitGcm9tIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTE4MjM4W0NBU1NBTkRSQS0xODIzOF0sIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gc3BlY2lmeSBgQUxMT1cgRklMVEVSSU5HYCB3aGVuIGEgcXVlcnkgd291bGQgbm9ybWFsbHkgcmVxdWlyZSB0aGF0LCBleGNlcHQgd2hlbiBxdWVyeWluZyB0aGUgdGFibGUgYHN5c3RlbV92aWV3cy5zeXN0ZW1fbG9nc2AuCisKKz09IFZpcnR1YWwgS2V5c3BhY2VzCisKK0FwYWNoZSBDYXNzYW5kcmEgNC4wIGhhcyBhZGRlZCB0d28gbmV3IGtleXNwYWNlcyBmb3IgdmlydHVhbCB0YWJsZXM6CisKKyogYHN5c3RlbV92aXJ0dWFsX3NjaGVtYWAgCisqIGBzeXN0ZW1fdmlld3NgLiAKKworVGhlIGBzeXN0ZW1fdmlydHVhbF9zY2hlbWFgIGtleXNwYWNlIGhhcyB0aHJlZSB0YWJsZXM6IGBrZXlzcGFjZXNgLAorYGNvbHVtbnNgIGFuZCBgdGFibGVzYCBmb3IgdGhlIHZpcnR1YWwga2V5c3BhY2UsIHRhYmxlLCBhbmQgY29sdW1uIGRlZmluaXRpb25zLCByZXNwZWN0aXZlbHkuCitUaGVzZSB0YWJsZXMgY29udGFpbiBzY2hlbWEgaW5mb3JtYXRpb24gZm9yIHRoZSB2aXJ0dWFsIHRhYmxlcy4KK0l0IGlzIHVzZWQgYnkgQ2Fzc2FuZHJhIGludGVybmFsbHkgYW5kIGEgdXNlciBzaG91bGQgbm90IGFjY2VzcyBpdCBkaXJlY3RseS4KKworVGhlIGBzeXN0ZW1fdmlld3NgIGtleXNwYWNlIGNvbnRhaW5zIHRoZSBhY3R1YWwgdmlydHVhbCB0YWJsZXMuCisKKz09IFZpcnR1YWwgVGFibGUgTGltaXRhdGlvbnMKKworQmVmb3JlIGRpc2NjdXNpbmcgdmlydHVhbCBrZXlzcGFjZXMgYW5kIHRhYmxlcywgbm90ZSB0aGF0IHZpcnR1YWwga2V5c3BhY2VzIGFuZCB0YWJsZXMgaGF2ZSBzb21lIGxpbWl0YXRpb25zLiAKK1RoZXNlIGxpbWl0YXRpb25zIGFyZSBzdWJqZWN0IHRvIGNoYW5nZS4KK1ZpcnR1YWwga2V5c3BhY2VzIGNhbm5vdCBiZSBhbHRlcmVkIG9yIGRyb3BwZWQuIAorSW4gZmFjdCwgbm8gb3BlcmF0aW9ucyBjYW4gYmUgcGVyZm9ybWVkIGFnYWluc3QgdmlydHVhbCBrZXlzcGFjZXMuCisKK1ZpcnR1YWwgdGFibGVzIGNhbm5vdCBiZSBjcmVhdGVkIGluIHZpcnR1YWwga2V5c3BhY2VzLgorVmlydHVhbCB0YWJsZXMgY2Fubm90IGJlIGFsdGVyZWQsIGRyb3BwZWQsIG9yIHRydW5jYXRlZC4KK1NlY29uZGFyeSBpbmRleGVzLCB0eXBlcywgZnVuY3Rpb25zLCBhZ2dyZWdhdGVzLCBtYXRlcmlhbGl6ZWQgdmlld3MsIGFuZCB0cmlnZ2VycyBjYW5ub3QgYmUgY3JlYXRlZCBmb3IgdmlydHVhbCB0YWJsZXMuCitFeHBpcmluZyB0aW1lLXRvLWxpdmUgKFRUTCkgY29sdW1ucyBjYW5ub3QgYmUgY3JlYXRlZC4KK1ZpcnR1YWwgdGFibGVzIGRvIG5vdCBzdXBwb3J0IGNvbmRpdGlvbmFsIHVwZGF0ZXMgb3IgZGVsZXRlcy4KK0FnZ3JlZ2F0ZXMgbWF5IGJlIHJ1biBpbiBTRUxFQ1Qgc3RhdGVtZW50cy4KKworQ29uZGl0aW9uYWwgYmF0Y2ggc3RhdGVtZW50cyBjYW5ub3QgaW5jbHVkZSBtdXRhdGlvbnMgZm9yIHZpcnR1YWwgdGFibGVzLCBub3IgY2FuIGEgdmlydHVhbCB0YWJsZSBzdGF0ZW1lbnQgYmUgaW5jbHVkZWQgaW4gYSBsb2dnZWQgYmF0Y2guCitJbiBmYWN0LCBtdXRhdGlvbnMgZm9yIHZpcnR1YWwgYW5kIHJlZ3VsYXIgdGFibGVzIGNhbm5vdCBvY2N1ciBpbiB0aGUgc2FtZSBiYXRjaCB0YWJsZS4KKworPT0gVmlydHVhbCBUYWJsZXMKKworRWFjaCBvZiB0aGUgdmlydHVhbCB0YWJsZXMgaW4gdGhlIGBzeXN0ZW1fdmlld3NgIHZpcnR1YWwga2V5c3BhY2UgY29udGFpbiBkaWZmZXJlbnQgaW5mb3JtYXRpb24uCisKK1RoZSBmb2xsb3dpbmcgdGFibGUgZGVzY3JpYmVzIHRoZSB2aXJ0dWFsIHRhYmxlczogCisKK1t3aWR0aD0iOTglIixjb2xzPSIyNyUsNzMlIixdCit8PT09Cit8VmlydHVhbCBUYWJsZSB8RGVzY3JpcHRpb24KKworfGNhY2hlcyB8RGlzcGxheXMgdGhlIGdlbmVyYWwgY2FjaGUgaW5mb3JtYXRpb24gaW5jbHVkaW5nIGNhY2hlIG5hbWUsIGNhcGFjaXR5X2J5dGVzLCBlbnRyeV9jb3VudCwgaGl0X2NvdW50LCBoaXRfcmF0aW8gZG91YmxlLAorcmVjZW50X2hpdF9yYXRlX3Blcl9zZWNvbmQsIHJlY2VudF9yZXF1ZXN0X3JhdGVfcGVyX3NlY29uZCwgcmVxdWVzdF9jb3VudCwgYW5kIHNpemVfYnl0ZXMuCisKK3xjbGllbnRzIHxMaXN0cyBpbmZvcm1hdGlvbiBhYm91dCBhbGwgY29ubmVjdGVkIGNsaWVudHMuCisKK3xjb29yZGluYXRvcl9yZWFkX2xhdGVuY3kgfFJlY29yZHMgY291bnRzLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBtYXgsIG1lZGlhbiwgYW5kIHBlcl9zZWNvbmQgZm9yIGNvb3JkaW5hdG9yIHJlYWRzLgorCit8Y29vcmRpbmF0b3Jfc2NhbiB8UmVjb3JkcyBjb3VudHMsIGtleXNwYWNlX25hbWUsIHRhYmxlX25hbWUsIG1heCwgbWVkaWFuLCBhbmQgcGVyX3NlY29uZCBmb3IgY29vcmRpbmF0b3Igc2NhbnMuCisKK3xjb29yZGluYXRvcl93cml0ZV9sYXRlbmN5IHxSZWNvcmRzIGNvdW50cywga2V5c3BhY2VfbmFtZSwgdGFibGVfbmFtZSwgbWF4LCBtZWRpYW4sIGFuZCBwZXJfc2Vjb25kIGZvciBjb29yZGluYXRvciB3cml0ZXMuCisKK3xkaXNrX3VzYWdlIHxSZWNvcmRzIGRpc2sgdXNhZ2UgaW5jbHVkaW5nIGRpc2tfc3BhY2UsIGtleXNwYWNlX25hbWUsIGFuZCB0YWJsZV9uYW1lLCBzb3J0ZWQgYnkgc3lzdGVtIGtleXNwYWNlcy4KKworfGludGVybm9kZV9pbmJvdW5kIHxMaXN0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5ib3VuZCBpbnRlcm5vZGUgbWVzc2FnaW5nLgorCit8aW50ZXJub2RlX291dGJvdW5kIHxJbmZvcm1hdGlvbiBhYm91dCB0aGUgb3V0Ym91bmQgaW50ZXJub2RlIG1lc3NhZ2luZy4KKworfGxvY2FsX3JlYWRfbGF0ZW5jeSB8UmVjb3JkcyBjb3VudHMsIGtleXNwYWNlX25hbWUsIHRhYmxlX25hbWUsIG1heCwgbWVkaWFuLCBhbmQgcGVyX3NlY29uZCBmb3IgbG9jYWwgcmVhZHMuCisKK3xsb2NhbF9zY2FuIHxSZWNvcmRzIGNvdW50cywga2V5c3BhY2VfbmFtZSwgdGFibGVfbmFtZSwgbWF4LCBtZWRpYW4sIGFuZCBwZXJfc2Vjb25kIGZvciBsb2NhbCBzY2Fucy4KKworfGxvY2FsX3dyaXRlX2xhdGVuY3kgfFJlY29yZHMgY291bnRzLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBtYXgsIG1lZGlhbiwgYW5kIHBlcl9zZWNvbmQgZm9yIGxvY2FsIHdyaXRlcy4KKworfG1heF9wYXJ0aXRpb25fc2l6ZSB8QSB0YWJsZSBtZXRyaWMgZm9yIG1heGltdW0gcGFydGl0aW9uIHNpemUuCisKK3xyb3dzX3Blcl9yZWFkIHxSZWNvcmRzIGNvdW50cywga2V5c3BhY2VfbmFtZSwgdGFibGVrX25hbWUsIG1heCwgYW5kIG1lZGlhbiBmb3Igcm93cyByZWFkLgorCit8c2V0dGluZ3MgfERpc3BsYXlzIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgaW4gY2Fzc2FuZHJhLnlhbWwuCisKK3xzc3RhYmxlX3Rhc2tzIHxMaXN0cyBjdXJyZW50bHkgcnVubmluZyB0YXNrcyBhbmQgcHJvZ3Jlc3Mgb24gU1NUYWJsZXMsIGZvciBvcGVyYXRpb25zIGxpa2UgY29tcGFjdGlvbiBhbmQgdXBncmFkZS4KKworfHN5c3RlbV9sb2dzIHxEaXNwbGF5cyBDYXNzYW5kcmEgbG9ncyBpZiBsb2dnZWQgdmlhIENRTExPRyBhcHBlbmRlciBpbiBsb2diYWNrLnhtbAorCit8c3lzdGVtX3Byb3BlcnRpZXMgfERpc3BsYXlzIGVudmlyb25tZW50YWwgc3lzdGVtIHByb3BlcnRpZXMgc2V0IG9uIHRoZSBub2RlLgorCit8dGhyZWFkX3Bvb2xzIHxMaXN0cyBtZXRyaWNzIGZvciBlYWNoIHRocmVhZCBwb29sLgorCit8dG9tYnN0b25lc19wZXJfcmVhZCB8UmVjb3JkcyBjb3VudHMsIGtleXNwYWNlX25hbWUsIHRhYmxla19uYW1lLCBtYXgsIGFuZCBtZWRpYW4gZm9yIHRvbWJzdG9uZXMuCit8PT09CisKK0ZvciBpbXByb3ZlZCB1c2FiaWxpdHksIGZyb20gaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMTgyMzhbQ0FTU0FORFJBLTE4MjM4XSwKK2FsbCB0YWJsZXMgZXhjZXB0IGBzeXN0ZW1fbG9nc2AgaGF2ZSBgQUxMT1cgRklMVEVSSU5HYCBpbXBsaWNpdGx5IGFkZGVkIHRvIGEgcXVlcnkgd2hlbiByZXF1aXJlZCBieSBDUUwgc3BlY2lmaWNhdGlvbi4KKworV2Ugc2hhbGwgZGlzY3VzcyBzb21lIG9mIHRoZSB2aXJ0dWFsIHRhYmxlcyBpbiBtb3JlIGRldGFpbCBuZXh0LgorCis9PT0gQ2xpZW50cyBWaXJ0dWFsIFRhYmxlCisKK1RoZSBgY2xpZW50c2AgdmlydHVhbCB0YWJsZSBsaXN0cyBhbGwgYWN0aXZlIGNvbm5lY3Rpb25zIChjb25uZWN0ZWQKK2NsaWVudHMpIGluY2x1ZGluZyB0aGVpciBpcCBhZGRyZXNzLCBwb3J0LCBjbGllbnRfb3B0aW9ucywgY29ubmVjdGlvbiBzdGFnZSwgZHJpdmVyCituYW1lLCBkcml2ZXIgdmVyc2lvbiwgaG9zdG5hbWUsIHByb3RvY29sIHZlcnNpb24sIHJlcXVlc3QgY291bnQsIHNzbAorZW5hYmxlZCwgc3NsIHByb3RvY29sIGFuZCB1c2VyIG5hbWU6CisKKy4uLi4KK2NxbHNoPiBFWFBBTkQgT04gOworTm93IEV4cGFuZGVkIG91dHB1dCBpcyBlbmFibGVkCitjcWxzaD4gU0VMRUNUICogRlJPTSBzeXN0ZW1fdmlld3MuY2xpZW50czsKKworQCBSb3cgMQorLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgYWRkcmVzcyAgICAgICAgICB8IDEyNy4wLjAuMQorIHBvcnQgICAgICAgICAgICAgfCA1MDY4NworIGNsaWVudF9vcHRpb25zICAgfCB7J0NRTF9WRVJTSU9OJzogJzMuNC43JywgJ0RSSVZFUl9OQU1FJzogJ0RhdGFTdGF4IFB5dGhvbiBEcml2ZXInLCAnRFJJVkVSX1ZFUlNJT04nOiAnMy4yNS4wJ30KKyBjb25uZWN0aW9uX3N0YWdlIHwgcmVhZHkKKyBkcml2ZXJfbmFtZSAgICAgIHwgRGF0YVN0YXggUHl0aG9uIERyaXZlcgorIGRyaXZlcl92ZXJzaW9uICAgfCAzLjI1LjAKKyBob3N0bmFtZSAgICAgICAgIHwgbG9jYWxob3N0CisgcHJvdG9jb2xfdmVyc2lvbiB8IDUKKyByZXF1ZXN0X2NvdW50ICAgIHwgMTYKKyBzc2xfY2lwaGVyX3N1aXRlIHwgbnVsbAorIHNzbF9lbmFibGVkICAgICAgfCBGYWxzZQorIHNzbF9wcm90b2NvbCAgICAgfCBudWxsCisgdXNlcm5hbWUgICAgICAgICB8IGFub255bW91cworCitAIFJvdyAyCistLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBhZGRyZXNzICAgICAgICAgIHwgMTI3LjAuMC4xCisgcG9ydCAgICAgICAgICAgICB8IDUwNjg4CisgY2xpZW50X29wdGlvbnMgICB8IHsnQ1FMX1ZFUlNJT04nOiAnMy40LjcnLCAnRFJJVkVSX05BTUUnOiAnRGF0YVN0YXggUHl0aG9uIERyaXZlcicsICdEUklWRVJfVkVSU0lPTic6ICczLjI1LjAnfQorIGNvbm5lY3Rpb25fc3RhZ2UgfCByZWFkeQorIGRyaXZlcl9uYW1lICAgICAgfCBEYXRhU3RheCBQeXRob24gRHJpdmVyCisgZHJpdmVyX3ZlcnNpb24gICB8IDMuMjUuMAorIGhvc3RuYW1lICAgICAgICAgfCBsb2NhbGhvc3QKKyBwcm90b2NvbF92ZXJzaW9uIHwgNQorIHJlcXVlc3RfY291bnQgICAgfCA0Cisgc3NsX2NpcGhlcl9zdWl0ZSB8IG51bGwKKyBzc2xfZW5hYmxlZCAgICAgIHwgRmFsc2UKKyBzc2xfcHJvdG9jb2wgICAgIHwgbnVsbAorIHVzZXJuYW1lICAgICAgICAgfCBhbm9ueW1vdXMKKworQCBSb3cgMworLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgYWRkcmVzcyAgICAgICAgICB8IDEyNy4wLjAuMQorIHBvcnQgICAgICAgICAgICAgfCA1MDc1MworIGNsaWVudF9vcHRpb25zICAgfCB7J0FQUExJQ0FUSU9OX05BTUUnOiAnVGVzdEFwcCcsICdBUFBMSUNBVElPTl9WRVJTSU9OJzogJzEuMC4wJywgJ0NMSUVOVF9JRCc6ICc1NWIzZWZiZC1jNTZiLTQ2OWQtOGNjYS0wMTZiODYwYjJmMDMnLCAnQ1FMX1ZFUlNJT04nOiAnMy4wLjAnLCAnRFJJVkVSX05BTUUnOiAnRGF0YVN0YXggSmF2YSBkcml2ZXIgZm9yIEFwYWNoZSBDYXNzYW5kcmEoUiknLCAnRFJJVkVSX1ZFUlNJT04nOiAnNC4xMy4wJ30KKyBjb25uZWN0aW9uX3N0YWdlIHwgcmVhZHkKKyBkcml2ZXJfbmFtZSAgICAgIHwgRGF0YVN0YXggSmF2YSBkcml2ZXIgZm9yIEFwYWNoZSBDYXNzYW5kcmEoUikKKyBkcml2ZXJfdmVyc2lvbiAgIHwgNC4xMy4wCisgaG9zdG5hbWUgICAgICAgICB8IGxvY2FsaG9zdAorIHByb3RvY29sX3ZlcnNpb24gfCA1CisgcmVxdWVzdF9jb3VudCAgICB8IDE4Cisgc3NsX2NpcGhlcl9zdWl0ZSB8IG51bGwKKyBzc2xfZW5hYmxlZCAgICAgIHwgRmFsc2UKKyBzc2xfcHJvdG9jb2wgICAgIHwgbnVsbAorIHVzZXJuYW1lICAgICAgICAgfCBhbm9ueW1vdXMKKworQCBSb3cgNAorLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgYWRkcmVzcyAgICAgICAgICB8IDEyNy4wLjAuMQorIHBvcnQgICAgICAgICAgICAgfCA1MDc1NQorIGNsaWVudF9vcHRpb25zICAgfCB7J0FQUExJQ0FUSU9OX05BTUUnOiAnVGVzdEFwcCcsICdBUFBMSUNBVElPTl9WRVJTSU9OJzogJzEuMC4wJywgJ0NMSUVOVF9JRCc6ICc1NWIzZWZiZC1jNTZiLTQ2OWQtOGNjYS0wMTZiODYwYjJmMDMnLCAnQ1FMX1ZFUlNJT04nOiAnMy4wLjAnLCAnRFJJVkVSX05BTUUnOiAnRGF0YVN0YXggSmF2YSBkcml2ZXIgZm9yIEFwYWNoZSBDYXNzYW5kcmEoUiknLCAnRFJJVkVSX1ZFUlNJT04nOiAnNC4xMy4wJ30KKyBjb25uZWN0aW9uX3N0YWdlIHwgcmVhZHkKKyBkcml2ZXJfbmFtZSAgICAgIHwgRGF0YVN0YXggSmF2YSBkcml2ZXIgZm9yIEFwYWNoZSBDYXNzYW5kcmEoUikKKyBkcml2ZXJfdmVyc2lvbiAgIHwgNC4xMy4wCisgaG9zdG5hbWUgICAgICAgICB8IGxvY2FsaG9zdAorIHByb3RvY29sX3ZlcnNpb24gfCA1CisgcmVxdWVzdF9jb3VudCAgICB8IDcKKyBzc2xfY2lwaGVyX3N1aXRlIHwgbnVsbAorIHNzbF9lbmFibGVkICAgICAgfCBGYWxzZQorIHNzbF9wcm90b2NvbCAgICAgfCBudWxsCisgdXNlcm5hbWUgICAgICAgICB8IGFub255bW91cworCisoNCByb3dzKQorLi4uLgorCitTb21lIGV4YW1wbGVzIG9mIGhvdyBgY2xpZW50c2AgY2FuIGJlIHVzZWQgYXJlOgorCisqIFRvIGZpbmQgYXBwbGljYXRpb25zIHVzaW5nIG9sZCBpbmNvbXBhdGlibGUgdmVyc2lvbnMgb2YgZHJpdmVycyBiZWZvcmUKK3VwZ3JhZGluZyBhbmQgd2l0aCBgbm9kZXRvb2wgZW5hYmxlb2xkcHJvdG9jb2x2ZXJzaW9uc2AgYW5kCitgbm9kZXRvb2wgZGlzYWJsZW9sZHByb3RvY29sdmVyc2lvbnNgIGR1cmluZyB1cGdyYWRlcy4KKyogVG8gaWRlbnRpZnkgY2xpZW50cyBzZW5kaW5nIHRvbyBtYW55IHJlcXVlc3RzLgorKiBUbyBmaW5kIGlmIFNTTCBpcyBlbmFibGVkIGR1cmluZyB0aGUgbWlncmF0aW9uIHRvIGFuZCBmcm9tIHNzbC4KKworVGhlIHZpcnR1YWwgdGFibGVzIG1heSBiZSBkZXNjcmliZWQgd2l0aCBgREVTQ1JJQkVgIHN0YXRlbWVudC4gVGhlIERETAorbGlzdGVkIGhvd2V2ZXIgY2Fubm90IGJlIHJ1biB0byBjcmVhdGUgYSB2aXJ0dWFsIHRhYmxlLiBBcyBhbiBleGFtcGxlCitkZXNjcmliZSB0aGUgYHN5c3RlbV92aWV3cy5jbGllbnRzYCB2aXJ0dWFsIHRhYmxlOgorCisuLi4uCitjcWxzaD4gREVTQ1JJQkUgVEFCTEUgc3lzdGVtX3ZpZXdzLmNsaWVudHM7CisKKy8qCitXYXJuaW5nOiBUYWJsZSBzeXN0ZW1fdmlld3MuY2xpZW50cyBpcyBhIHZpcnR1YWwgdGFibGUgYW5kIGNhbm5vdCBiZSByZWNyZWF0ZWQgd2l0aCBDUUwuCitTdHJ1Y3R1cmUsIGZvciByZWZlcmVuY2U6CitWSVJUVUFMIFRBQkxFIHN5c3RlbV92aWV3cy5jbGllbnRzICgKKyAgYWRkcmVzcyBpbmV0LAorICBwb3J0IGludCwKKyAgY2xpZW50X29wdGlvbnMgZnJvemVuPG1hcDx0ZXh0LCB0ZXh0Pj4sCisgIGNvbm5lY3Rpb25fc3RhZ2UgdGV4dCwKKyAgZHJpdmVyX25hbWUgdGV4dCwKKyAgZHJpdmVyX3ZlcnNpb24gdGV4dCwKKyAgaG9zdG5hbWUgdGV4dCwKKyAgcHJvdG9jb2xfdmVyc2lvbiBpbnQsCisgIHJlcXVlc3RfY291bnQgYmlnaW50LAorICBzc2xfY2lwaGVyX3N1aXRlIHRleHQsCisgIHNzbF9lbmFibGVkIGJvb2xlYW4sCisgIHNzbF9wcm90b2NvbCB0ZXh0LAorICB1c2VybmFtZSB0ZXh0LAorICAgIFBSSU1BUlkgS0VZIChhZGRyZXNzLCBwb3J0KQorKSBXSVRIIENMVVNURVJJTkcgT1JERVIgQlkgKHBvcnQgQVNDKQorICAgIEFORCBjb21tZW50ID0gJ2N1cnJlbnRseSBjb25uZWN0ZWQgY2xpZW50cyc7CisqLworLi4uLgorCis9PT0gQ2FjaGVzIFZpcnR1YWwgVGFibGUKKworVGhlIGBjYWNoZXNgIHZpcnR1YWwgdGFibGUgbGlzdHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhY2hlcy4gVGhlIGZvdXIKK2NhY2hlcyBwcmVzZW50bHkgY3JlYXRlZCBhcmUgY2h1bmtzLCBjb3VudGVycywga2V5cyBhbmQgcm93cy4gQSBxdWVyeSBvbgordGhlIGBjYWNoZXNgIHZpcnR1YWwgdGFibGUgcmV0dXJucyB0aGUgZm9sbG93aW5nIGRldGFpbHM6CisKKy4uLi4KK2NxbHNoOnN5c3RlbV92aWV3cz4gU0VMRUNUICogRlJPTSBzeXN0ZW1fdmlld3MuY2FjaGVzOworbmFtZSAgICAgfCBjYXBhY2l0eV9ieXRlcyB8IGVudHJ5X2NvdW50IHwgaGl0X2NvdW50IHwgaGl0X3JhdGlvIHwgcmVjZW50X2hpdF9yYXRlX3Blcl9zZWNvbmQgfCByZWNlbnRfcmVxdWVzdF9yYXRlX3Blcl9zZWNvbmQgfCByZXF1ZXN0X2NvdW50IHwgc2l6ZV9ieXRlcworLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0KKyAgY2h1bmtzIHwgICAgICAyMjk2MzgxNDQgfCAgICAgICAgICAyOSB8ICAgICAgIDE2NiB8ICAgICAgMC44MyB8ICAgICAgICAgICAgICAgICAgICAgICAgICA1IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2IHwgICAgICAgICAgIDIwMCB8ICAgICA0NzUxMzYKK2NvdW50ZXJzIHwgICAgICAgMjYyMTQ0MDAgfCAgICAgICAgICAgMCB8ICAgICAgICAgMCB8ICAgICAgIE5hTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgIDAKKyAgICBrZXlzIHwgICAgICAgNTI0Mjg4MDAgfCAgICAgICAgICAxNCB8ICAgICAgIDEyNCB8ICAwLjg3MzIzOSB8ICAgICAgICAgICAgICAgICAgICAgICAgICA0IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0IHwgICAgICAgICAgIDE0MiB8ICAgICAgIDEyNDgKKyAgICByb3dzIHwgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgMCB8ICAgICAgICAgMCB8ICAgICAgIE5hTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgIDAKKworKDQgcm93cykKKy4uLi4KKworPT09IFNldHRpbmdzIFZpcnR1YWwgVGFibGUKKworVGhlIGBzZXR0aW5nc2AgdGFibGUgaXMgcmF0aGVyIHVzZWZ1bCBhbmQgbGlzdHMgYWxsIHRoZSBjdXJyZW50Citjb25maWd1cmF0aW9uIHNldHRpbmdzIGZyb20gdGhlIGBjYXNzYW5kcmEueWFtbGAuIFRoZSBlbmNyeXB0aW9uIG9wdGlvbnMKK2FyZSBvdmVycmlkZGVuIHRvIGhpZGUgdGhlIHNlbnNpdGl2ZSB0cnVzdHN0b3JlIGluZm9ybWF0aW9uIG9yCitwYXNzd29yZHMuIFRoZSBjb25maWd1cmF0aW9uIHNldHRpbmdzIGhvd2V2ZXIgY2Fubm90IGJlIHNldCB1c2luZyBETUwgb24KK3RoZSB2aXJ0dWFsIHRhYmxlIHByZXNlbnRseTogOgorCisuLi4uCitjcWxzaDpzeXN0ZW1fdmlld3M+IFNFTEVDVCAqIEZST00gc3lzdGVtX3ZpZXdzLnNldHRpbmdzOworCituYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLQorICBhbGxvY2F0ZV90b2tlbnNfZm9yX2tleXNwYWNlICAgICAgIHwgbnVsbAorICBhdWRpdF9sb2dnaW5nX29wdGlvbnNfZW5hYmxlZCAgICAgIHwgZmFsc2UKKyAgYXV0b19zbmFwc2hvdCAgICAgICAgICAgICAgICAgICAgICB8IHRydWUKKyAgYXV0b21hdGljX3NzdGFibGVfdXBncmFkZSAgICAgICAgICB8IGZhbHNlCisgIGNsdXN0ZXJfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgfCBUZXN0IENsdXN0ZXIKKyAgZW5hYmxlX3RyYW5zaWVudF9yZXBsaWNhdGlvbiAgICAgICB8IGZhbHNlCisgIGhpbnRlZF9oYW5kb2ZmX2VuYWJsZWQgICAgICAgICAgICAgfCB0cnVlCisgIGhpbnRzX2RpcmVjdG9yeSAgICAgICAgICAgICAgICAgICAgfCAvaG9tZS9lYzItdXNlci9jYXNzYW5kcmEvZGF0YS9oaW50cworICBpbmNyZW1lbnRhbF9iYWNrdXBzICAgICAgICAgICAgICAgIHwgZmFsc2UKKyAgaW5pdGlhbF90b2tlbiAgICAgICAgICAgICAgICAgICAgICB8IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KKyAgcnBjX2FkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICB8IGxvY2FsaG9zdAorICBzc2xfc3RvcmFnZV9wb3J0ICAgICAgICAgICAgICAgICAgIHwgNzAwMQorICBzdGFydF9uYXRpdmVfdHJhbnNwb3J0ICAgICAgICAgICAgIHwgdHJ1ZQorICBzdG9yYWdlX3BvcnQgICAgICAgICAgICAgICAgICAgICAgIHwgNzAwMAorICBzdHJlYW1fZW50aXJlX3NzdGFibGVzICAgICAgICAgICAgIHwgdHJ1ZQorICAoMjI0IHJvd3MpCisuLi4uCisKK1RoZSBgc2V0dGluZ3NgIHRhYmxlIGNhbiBiZSByZWFsbHkgdXNlZnVsIGlmIHlhbWwgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkCitzaW5jZSBzdGFydHVwIGFuZCBkb250IGtub3cgcnVubmluZyBjb25maWd1cmF0aW9uLCBvciB0byBmaW5kIGlmIHRoZXkKK2hhdmUgYmVlbiBtb2RpZmllZCB2aWEgam14L25vZGV0b29sIG9yIHZpcnR1YWwgdGFibGVzLgorCis9PT0gVGhyZWFkIFBvb2xzIFZpcnR1YWwgVGFibGUKKworVGhlIGB0aHJlYWRfcG9vbHNgIHRhYmxlIGxpc3RzIGluZm9ybWF0aW9uIGFib3V0IGFsbCB0aHJlYWQgcG9vbHMuCitUaHJlYWQgcG9vbCBpbmZvcm1hdGlvbiBpbmNsdWRlcyBhY3RpdmUgdGFza3MsIGFjdGl2ZSB0YXNrcyBsaW1pdCwKK2Jsb2NrZWQgdGFza3MsIGJsb2NrZWQgdGFza3MgYWxsIHRpbWUsIGNvbXBsZXRlZCB0YXNrcywgYW5kIHBlbmRpbmcKK3Rhc2tzLiBBIHF1ZXJ5IG9uIHRoZSBgdGhyZWFkX3Bvb2xzYCByZXR1cm5zIGZvbGxvd2luZyBkZXRhaWxzOgorCisuLi4uCitjcWxzaDpzeXN0ZW1fdmlld3M+IHNlbGVjdCAqIGZyb20gc3lzdGVtX3ZpZXdzLnRocmVhZF9wb29sczsKKworbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICB8IGFjdGl2ZV90YXNrcyB8IGFjdGl2ZV90YXNrc19saW1pdCB8IGJsb2NrZWRfdGFza3MgfCBibG9ja2VkX3Rhc2tzX2FsbF90aW1lIHwgY29tcGxldGVkX3Rhc2tzIHwgcGVuZGluZ190YXNrcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBbnRpRW50cm9weVN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgIENhY2hlQ2xlYW51cEV4ZWN1dG9yIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgICAgQ29tcGFjdGlvbkV4ZWN1dG9yIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICA4ODEgfCAgICAgICAgICAgICAwCisgICAgICAgIENvdW50ZXJNdXRhdGlvblN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgIDMyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgICAgICAgICAgIEdvc3NpcFN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgICAgICAgSGludHNEaXNwYXRjaGVyIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgSW50ZXJuYWxSZXNwb25zZVN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgICBNZW10YWJsZUZsdXNoV3JpdGVyIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwCisgICAgICAgICAgIE1lbXRhYmxlUG9zdEZsdXNoIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDIgfCAgICAgICAgICAgICAwCisgICAgICAgTWVtdGFibGVSZWNsYWltTWVtb3J5IHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwCisgICAgICAgICAgICAgIE1pZ3JhdGlvblN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgICAgICAgICAgICAgTWlzY1N0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgICAgICAgICBNdXRhdGlvblN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgIDMyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICBOYXRpdmUtVHJhbnNwb3J0LVJlcXVlc3RzIHwgICAgICAgICAgICAxIHwgICAgICAgICAgICAgICAgMTI4IHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAxMzAgfCAgICAgICAgICAgICAwCisgICAgICBQZW5kaW5nUmFuZ2VDYWxjdWxhdG9yIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwCitQZXJEaXNrTWVtdGFibGVGbHVzaFdyaXRlcl8wIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwCisgICAgICAgICAgICAgICAgICAgUmVhZFN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgIDMyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgMTMgfCAgICAgICAgICAgICAwCisgICAgICAgICAgICAgICAgIFJlcGFpci1UYXNrIHwgICAgICAgICAgICAwIHwgICAgICAgICAyMTQ3NDgzNjQ3IHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgIFJlcXVlc3RSZXNwb25zZVN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgICAgICAgICAgICAgICBTYW1wbGVyIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgU2Vjb25kYXJ5SW5kZXhNYW5hZ2VtZW50IHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgICAgVmFsaWRhdGlvbkV4ZWN1dG9yIHwgICAgICAgICAgICAwIHwgICAgICAgICAyMTQ3NDgzNjQ3IHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgICAgIFZpZXdCdWlsZEV4ZWN1dG9yIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgICAgIFZpZXdNdXRhdGlvblN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgIDMyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisuLi4uCisKKygyNCByb3dzKQorCis9PT0gSW50ZXJub2RlIEluYm91bmQgTWVzc2FnaW5nIFZpcnR1YWwgVGFibGUKKworVGhlIGBpbnRlcm5vZGVfaW5ib3VuZGAgdmlydHVhbCB0YWJsZSBpcyBmb3IgdGhlIGludGVybm9kZSBpbmJvdW5kCittZXNzYWdpbmcuIEluaXRpYWxseSBubyBpbnRlcm5vZGUgaW5ib3VuZCBtZXNzYWdpbmcgbWF5IGdldCBsaXN0ZWQuIEluCithZGRpdGlvbiB0byB0aGUgYWRkcmVzcywgcG9ydCwgZGF0YWNlbnRlciBhbmQgcmFjayBpbmZvcm1hdGlvbiBpbmNsdWRlcworY29ycnVwdCBmcmFtZXMgcmVjb3ZlcmVkLCBjb3JydXB0IGZyYW1lcyB1bnJlY292ZXJlZCwgZXJyb3IgYnl0ZXMsIGVycm9yCitjb3VudCwgZXhwaXJlZCBieXRlcywgZXhwaXJlZCBjb3VudCwgcHJvY2Vzc2VkIGJ5dGVzLCBwcm9jZXNzZWQgY291bnQsCityZWNlaXZlZCBieXRlcywgcmVjZWl2ZWQgY291bnQsIHNjaGVkdWxlZCBieXRlcywgc2NoZWR1bGVkIGNvdW50LAordGhyb3R0bGVkIGNvdW50LCB0aHJvdHRsZWQgbmFub3MsIHVzaW5nIGJ5dGVzLCB1c2luZyByZXNlcnZlIGJ5dGVzLiBBCitxdWVyeSBvbiB0aGUgYGludGVybm9kZV9pbmJvdW5kYCByZXR1cm5zIGZvbGxvd2luZyBkZXRhaWxzOgorCisuLi4uCitjcWxzaDpzeXN0ZW1fdmlld3M+IFNFTEVDVCAqIEZST00gc3lzdGVtX3ZpZXdzLmludGVybm9kZV9pbmJvdW5kOworYWRkcmVzcyB8IHBvcnQgfCBkYyB8IHJhY2sgfCBjb3JydXB0X2ZyYW1lc19yZWNvdmVyZWQgfCBjb3JydXB0X2ZyYW1lc191bnJlY292ZXJlZCB8CitlcnJvcl9ieXRlcyB8IGVycm9yX2NvdW50IHwgZXhwaXJlZF9ieXRlcyB8IGV4cGlyZWRfY291bnQgfCBwcm9jZXNzZWRfYnl0ZXMgfAorcHJvY2Vzc2VkX2NvdW50IHwgcmVjZWl2ZWRfYnl0ZXMgfCByZWNlaXZlZF9jb3VudCB8IHNjaGVkdWxlZF9ieXRlcyB8IHNjaGVkdWxlZF9jb3VudCB8IHRocm90dGxlZF9jb3VudCB8IHRocm90dGxlZF9uYW5vcyB8IHVzaW5nX2J5dGVzIHwgdXNpbmdfcmVzZXJ2ZV9ieXRlcworLS0tLS0tLS0tKy0tLS0tLSstLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0KKy0tLS0tLS0tLS0KKygwIHJvd3MpCisuLi4uCisKKz09PSBTU1RhYmxlcyBUYXNrcyBWaXJ0dWFsIFRhYmxlCisKK1RoZSBgc3N0YWJsZV90YXNrc2AgY291bGQgYmUgdXNlZCB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgcnVubmluZwordGFza3MuIEl0IGxpc3RzIGZvbGxvd2luZyBjb2x1bW5zOgorCisuLi4uCitjcWxzaDpzeXN0ZW1fdmlld3M+IFNFTEVDVCAqIEZST00gc3N0YWJsZV90YXNrczsKK2tleXNwYWNlX25hbWUgfCB0YWJsZV9uYW1lIHwgdGFza19pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwga2luZCAgICAgICB8IHByb2dyZXNzIHwgdG90YWwgICAgfCB1bml0CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLQorICAgICAgIGJhc2ljIHwgICAgICB3aWRlMiB8IGMzOTA5NzQwLWNkZjctMTFlOS1hOGVkLTBmMDNkZTJkOWFlMSB8IGNvbXBhY3Rpb24gfCA2MDQxODc2MSB8IDcwODgyMTEwIHwgYnl0ZXMKKyAgICAgICBiYXNpYyB8ICAgICAgd2lkZTIgfCBjNzU1Njc3MC1jZGY3LTExZTktYThlZC0wZjAzZGUyZDlhZTEgfCBjb21wYWN0aW9uIHwgIDI5OTU2MjMgfCA0MDMxNDY3OSB8IGJ5dGVzCisuLi4uCisKK0FzIGFub3RoZXIgZXhhbXBsZSwgdG8gZmluZCBob3cgbXVjaCB0aW1lIGlzIHJlbWFpbmluZyBmb3IgU1NUYWJsZQordGFza3MsIHVzZSB0aGUgZm9sbG93aW5nIHF1ZXJ5OgorCisuLi4uCitTRUxFQ1QgdG90YWwgLSBwcm9ncmVzcyBBUyByZW1haW5pbmcKK0ZST00gc3lzdGVtX3ZpZXdzLnNzdGFibGVfdGFza3M7CisuLi4uCisKKz09PSBPdGhlciBWaXJ0dWFsIFRhYmxlcworCitTb21lIGV4YW1wbGVzIG9mIHVzaW5nIG90aGVyIHZpcnR1YWwgdGFibGVzIGFyZSBhcyBmb2xsb3dzLgorCitGaW5kIHRhYmxlcyB3aXRoIG1vc3QgZGlzayB1c2FnZToKKworLi4uLgorY3Fsc2g+IFNFTEVDVCAqIEZST00gZGlza191c2FnZSBXSEVSRSBtZWJpYnl0ZXMgPiAxIEFMTE9XIEZJTFRFUklORzsKKwora2V5c3BhY2VfbmFtZSB8IHRhYmxlX25hbWUgfCBtZWJpYnl0ZXMKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0KKyAgIGtleXNwYWNlMSB8ICBzdGFuZGFyZDEgfCAgICAgICAyODgKKyAgdGxwX3N0cmVzcyB8ICAga2V5dmFsdWUgfCAgICAgIDMyMTEKKy4uLi4KKworRmluZCBxdWVyaWVzIG9uIHRhYmxlL3Mgd2l0aCBncmVhdGVzdCByZWFkIGxhdGVuY3k6CisKKy4uLi4KK2NxbHNoPiBTRUxFQ1QgKiBGUk9NICBsb2NhbF9yZWFkX2xhdGVuY3kgV0hFUkUgcGVyX3NlY29uZCA+IDEgQUxMT1cgRklMVEVSSU5HOworCitrZXlzcGFjZV9uYW1lIHwgdGFibGVfbmFtZSB8IHA1MHRoX21zIHwgcDk5dGhfbXMgfCBjb3VudCAgICB8IG1heF9tcyAgfCBwZXJfc2Vjb25kCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0KKyAgdGxwX3N0cmVzcyB8ICAga2V5dmFsdWUgfCAgICAwLjA0MyB8ICAgIDAuMTUyIHwgNDk3ODUxNTggfCAxODYuNTYzIHwgIDExNDE4LjM1NgorLi4uLgorCisKKz09IEV4YW1wbGUKKworW2FyYWJpYywgc3RhcnQ9MV0KKy4gVG8gbGlzdCB0aGUga2V5c3BhY2VzLCBlbnRlciBgYGNxbHNoYGAgYW5kIHJ1biB0aGUgQ1FMIGNvbW1hbmQgYGBERVNDUklCRSBLRVlTUEFDRVNgYDoKKworW3NvdXJjZSwgY3FsXQorLS0tLQorY3Fsc2g+IERFU0MgS0VZU1BBQ0VTOworc3lzdGVtX3NjaGVtYSAgc3lzdGVtICAgICAgICAgIHN5c3RlbV9kaXN0cmlidXRlZCAgc3lzdGVtX3ZpcnR1YWxfc2NoZW1hCitzeXN0ZW1fYXV0aCAgICBzeXN0ZW1fdHJhY2VzICAgc3lzdGVtX3ZpZXdzCistLS0tCisKK1thcmFiaWMsIHN0YXJ0PTJdCisuIFRvIHZpZXcgdGhlIHZpcnR1YWwgdGFibGUgc2NoZW1hLCBydW4gdGhlIENRTCBjb21tYW5kcyBgYFVTRSBzeXN0ZW1fdmlydHVhbF9zY2hlbWFgYCBhbmQgYGBTRUxFQ1QgKiBGUk9NIHRhYmxlc2BgOgorCitbc291cmNlLCBjcWxdCistLS0tCitjcWxzaD4gVVNFIHN5c3RlbV92aXJ0dWFsX3NjaGVtYTsKK2NxbHNoPiBTRUxFQ1QgKiBGUk9NIHRhYmxlczsKKy0tLS0KKyAKK3Jlc3VsdHMgaW46CisKK1tzb3VyY2UsIGNxbF0KKy0tLS0KKyBrZXlzcGFjZV9uYW1lICAgICAgICAgfCB0YWJsZV9uYW1lICAgICAgICAgICAgICAgIHwgY29tbWVudAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgICAgICAgICAgICAgIGNhY2hlcyB8ICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtIGNhY2hlcworICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICAgICAgICAgICAgIGNsaWVudHMgfCAgICAgICAgICBjdXJyZW50bHkgY29ubmVjdGVkIGNsaWVudHMKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgY29vcmRpbmF0b3JfcmVhZF9sYXRlbmN5IHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgY29vcmRpbmF0b3Jfc2Nhbl9sYXRlbmN5IHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCBjb29yZGluYXRvcl93cml0ZV9sYXRlbmN5IHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgICAgICAgICBkaXNrX3VzYWdlIHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgIGludGVybm9kZV9pbmJvdW5kIHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgaW50ZXJub2RlX291dGJvdW5kIHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgbG9jYWxfcmVhZF9sYXRlbmN5IHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgbG9jYWxfc2Nhbl9sYXRlbmN5IHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICBsb2NhbF93cml0ZV9sYXRlbmN5IHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgbWF4X3BhcnRpdGlvbl9zaXplIHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgICAgICByb3dzX3Blcl9yZWFkIHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgICAgICAgICAgIHNldHRpbmdzIHwgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHNldHRpbmdzCisgICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgICAgICAgc3N0YWJsZV90YXNrcyB8ICAgICAgICAgICAgICAgIGN1cnJlbnQgc3N0YWJsZSB0YXNrcworICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICAgc3lzdGVtX3Byb3BlcnRpZXMgfCBDYXNzYW5kcmEgcmVsZXZhbnQgc3lzdGVtIHByb3BlcnRpZXMKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgICAgICAgdGhyZWFkX3Bvb2xzIHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICB0b21ic3RvbmVzX3Blcl9yZWFkIHwKKyBzeXN0ZW1fdmlydHVhbF9zY2hlbWEgfCAgICAgICAgICAgICAgICAgICBjb2x1bW5zIHwgICAgICAgICAgIHZpcnR1YWwgY29sdW1uIGRlZmluaXRpb25zCisgc3lzdGVtX3ZpcnR1YWxfc2NoZW1hIHwgICAgICAgICAgICAgICAgIGtleXNwYWNlcyB8ICAgICAgICAgdmlydHVhbCBrZXlzcGFjZSBkZWZpbml0aW9ucworIHN5c3RlbV92aXJ0dWFsX3NjaGVtYSB8ICAgICAgICAgICAgICAgICAgICB0YWJsZXMgfCAgICAgICAgICAgIHZpcnR1YWwgdGFibGUgZGVmaW5pdGlvbnMKKworKDIxIHJvd3MpCistLS0tCisKK1thcmFiaWMsIHN0YXJ0PTNdCisuIFRvIHZpZXcgdGhlIHZpcnR1YWwgdGFibGVzLCBydW4gdGhlIENRTCBjb21tYW5kcyBgYFVTRSBzeXN0ZW1fdmlld2BgIGFuZCBgYERFU0NSSUJFIHRhYmxlc2BgOgorCitbc291cmNlLCBjcWxdCistLS0tCitjcWxzaD4gVVNFIHN5c3RlbV92aWV3OzsKK2NxbHNoPiBERVNDUklCRSB0YWJsZXM7CistLS0tCisKK3Jlc3VsdHMgaW46CisKK1tzb3VyY2UsIGNxbF0KKy0tLS0KK3NzdGFibGVfdGFza3MgICAgICAgY2xpZW50cyAgICAgICAgICAgICAgICAgICBjb29yZGluYXRvcl93cml0ZV9sYXRlbmN5CitkaXNrX3VzYWdlICAgICAgICAgIGxvY2FsX3dyaXRlX2xhdGVuY3kgICAgICAgdG9tYnN0b25lc19wZXJfcmVhZAordGhyZWFkX3Bvb2xzICAgICAgICBpbnRlcm5vZGVfb3V0Ym91bmQgICAgICAgIHNldHRpbmdzCitsb2NhbF9zY2FuX2xhdGVuY3kgIGNvb3JkaW5hdG9yX3NjYW5fbGF0ZW5jeSAgc3lzdGVtX3Byb3BlcnRpZXMKK2ludGVybm9kZV9pbmJvdW5kICAgY29vcmRpbmF0b3JfcmVhZF9sYXRlbmN5ICBtYXhfcGFydGl0aW9uX3NpemUKK2xvY2FsX3JlYWRfbGF0ZW5jeSAgcm93c19wZXJfcmVhZCAgICAgICAgICAgICBjYWNoZXMKKy0tLS0KKworW2FyYWJpYywgc3RhcnQ9NF0KKy4gVG8gbG9vayBhdCBhbnkgdGFibGUgZGF0YSwgcnVuIHRoZSBDUUwgY29tbWFuZCBgYFNFTEVDVGBgOgorCitbc291cmNlLCBjcWxdCistLS0tCitjcWxzaD4gVVNFIHN5c3RlbV92aWV3OzsKK2NxbHNoPiBTRUxFQ1QgKiBGUk9NIGNsaWVudHMgTElNSVQgMjsKKy0tLS0KKyByZXN1bHRzIGluOgorCitbc291cmNlLCBjcWxdCistLS0tCisgYWRkcmVzcyAgIHwgcG9ydCAgfCBjb25uZWN0aW9uX3N0YWdlIHwgZHJpdmVyX25hbWUgICAgICAgICAgICB8IGRyaXZlcl92ZXJzaW9uIHwgaG9zdG5hbWUgIHwgcHJvdG9jb2xfdmVyc2lvbiB8IHJlcXVlc3RfY291bnQgfCBzc2xfY2lwaGVyX3N1aXRlIHwgc3NsX2VuYWJsZWQgfCBzc2xfcHJvdG9jb2wgfCB1c2VybmFtZQorLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLQorIDEyNy4wLjAuMSB8IDM3MzA4IHwgICAgICAgICAgICByZWFkeSB8IERhdGFTdGF4IFB5dGhvbiBEcml2ZXIgfCAgIDMuMjEuMC5wb3N0MCB8IGxvY2FsaG9zdCB8ICAgICAgICAgICAgICAgIDQgfCAgICAgICAgICAgIDE3IHwgICAgICAgICAgICAgbnVsbCB8ICAgICAgIEZhbHNlIHwgICAgICAgICBudWxsIHwgYW5vbnltb3VzCisgMTI3LjAuMC4xIHwgMzczMTAgfCAgICAgICAgICAgIHJlYWR5IHwgRGF0YVN0YXggUHl0aG9uIERyaXZlciB8ICAgMy4yMS4wLnBvc3QwIHwgbG9jYWxob3N0IHwgICAgICAgICAgICAgICAgNCB8ICAgICAgICAgICAgIDggfCAgICAgICAgICAgICBudWxsIHwgICAgICAgRmFsc2UgfCAgICAgICAgIG51bGwgfCBhbm9ueW1vdXMKKworKDIgcm93cykKKy0tLS0KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9jYXNzYW5kcmFfc3RyZXNzLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvY2Fzc2FuZHJhX3N0cmVzcy5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNmYwYTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvY2Fzc2FuZHJhX3N0cmVzcy5hZG9jCkBAIC0wLDAgKzEsMzMwIEBACis9IENhc3NhbmRyYSBTdHJlc3MKKworVGhlIGBjYXNzYW5kcmEtc3RyZXNzYCB0b29sIGlzIHVzZWQgdG8gYmVuY2htYXJrIGFuZCBsb2FkLXRlc3QgYSBDYXNzYW5kcmEKK2NsdXN0ZXIuIAorYGNhc3NhbmRyYS1zdHJlc3NgIHN1cHBvcnRzIHRlc3RpbmcgYXJiaXRyYXJ5IENRTCB0YWJsZXMgYW5kIHF1ZXJpZXMsIGFsbG93aW5nIHVzZXJzIHRvIGJlbmNobWFyayB0aGVpciBvd24gZGF0YSBtb2RlbC4KKworVGhpcyBkb2N1bWVudGF0aW9uIGZvY3VzZXMgb24gdXNlciBtb2RlIHRvIHRlc3QgcGVyc29uYWwgc2NoZW1hLgorCis9PSBVc2FnZQorCitUaGVyZSBhcmUgc2V2ZXJhbCBvcGVyYXRpb24gdHlwZXM6CisKKyogd3JpdGUtb25seSwgcmVhZC1vbmx5LCBhbmQgbWl4ZWQgd29ya2xvYWRzIG9mIHN0YW5kYXJkIGRhdGEKKyogd3JpdGUtb25seSBhbmQgcmVhZC1vbmx5IHdvcmtsb2FkcyBmb3IgY291bnRlciBjb2x1bW5zCisqIHVzZXIgY29uZmlndXJlZCB3b3JrbG9hZHMsIHJ1bm5pbmcgY3VzdG9tIHF1ZXJpZXMgb24gY3VzdG9tIHNjaGVtYXMKKworVGhlIHN5bnRheCBpcyBgY2Fzc2FuZHJhLXN0cmVzcyA8Y29tbWFuZD4gW29wdGlvbnNdYC4gCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBhIGdpdmVuIGNvbW1hbmQgb3Igb3B0aW9ucywgcnVuIGBjYXNzYW5kcmEtc3RyZXNzIGhlbHAgPGNvbW1hbmR8b3B0aW9uPmAuCisKK0NvbW1hbmRzOjo6CisgIHJlYWQ6OzsKKyAgICBNdWx0aXBsZSBjb25jdXJyZW50IHJlYWRzIC0gdGhlIGNsdXN0ZXIgbXVzdCBmaXJzdCBiZSBwb3B1bGF0ZWQgYnkgYQorICAgIHdyaXRlIHRlc3QKKyAgd3JpdGU6OzsKKyAgICBNdWx0aXBsZSBjb25jdXJyZW50IHdyaXRlcyBhZ2FpbnN0IHRoZSBjbHVzdGVyCisgIG1peGVkOjs7CisgICAgSW50ZXJsZWF2aW5nIG9mIGFueSBiYXNpYyBjb21tYW5kcywgd2l0aCBjb25maWd1cmFibGUgcmF0aW8gYW5kCisgICAgZGlzdHJpYnV0aW9uIC0gdGhlIGNsdXN0ZXIgbXVzdCBmaXJzdCBiZSBwb3B1bGF0ZWQgYnkgYSB3cml0ZSB0ZXN0CisgIGNvdW50ZXJfd3JpdGU6OzsKKyAgICBNdWx0aXBsZSBjb25jdXJyZW50IHVwZGF0ZXMgb2YgY291bnRlcnMuCisgIGNvdW50ZXJfcmVhZDo7OworICAgIE11bHRpcGxlIGNvbmN1cnJlbnQgcmVhZHMgb2YgY291bnRlcnMuIFRoZSBjbHVzdGVyIG11c3QgZmlyc3QgYmUKKyAgICBwb3B1bGF0ZWQgYnkgYSBjb3VudGVyd3JpdGUgdGVzdC4KKyAgdXNlcjo7OworICAgIEludGVybGVhdmluZyBvZiB1c2VyIHByb3ZpZGVkIHF1ZXJpZXMsIHdpdGggY29uZmlndXJhYmxlIHJhdGlvIGFuZAorICAgIGRpc3RyaWJ1dGlvbi4KKyAgaGVscDo7OworICAgIFByaW50IGhlbHAgZm9yIGEgY29tbWFuZCBvciBvcHRpb24KKyAgcHJpbnQ6OzsKKyAgICBJbnNwZWN0IHRoZSBvdXRwdXQgb2YgYSBkaXN0cmlidXRpb24gZGVmaW5pdGlvbgorICBsZWdhY3k6OzsKKyAgICBMZWdhY3kgc3VwcG9ydCBtb2RlCitQcmltYXJ5IE9wdGlvbnM6OjoKKyAgLXBvcDo7OworICAgIFBvcHVsYXRpb24gZGlzdHJpYnV0aW9uIGFuZCBpbnRyYS1wYXJ0aXRpb24gdmlzaXQgb3JkZXIKKyAgLWluc2VydDo7OworICAgIEluc2VydCBzcGVjaWZpYyBvcHRpb25zIHJlbGF0aW5nIHRvIHZhcmlvdXMgbWV0aG9kcyBmb3IgYmF0Y2hpbmcgYW5kCisgICAgc3BsaXR0aW5nIHBhcnRpdGlvbiB1cGRhdGVzCisgIC1jb2w6OzsKKyAgICBDb2x1bW4gZGV0YWlscyBzdWNoIGFzIHNpemUgYW5kIGNvdW50IGRpc3RyaWJ1dGlvbiwgZGF0YSBnZW5lcmF0b3IsCisgICAgbmFtZXMsIGNvbXBhcmF0b3IgYW5kIGlmIHN1cGVyIGNvbHVtbnMgc2hvdWxkIGJlIHVzZWQKKyAgLXJhdGU6OzsKKyAgICBUaHJlYWQgY291bnQsIHJhdGUgbGltaXQgb3IgYXV0b21hdGljIG1vZGUgKGRlZmF1bHQgaXMgYXV0bykKKyAgLW1vZGU6OzsKKyAgICBUaHJpZnQgb3IgQ1FMIHdpdGggb3B0aW9ucworICAtZXJyb3JzOjs7CisgICAgSG93IHRvIGhhbmRsZSBlcnJvcnMgd2hlbiBlbmNvdW50ZXJlZCBkdXJpbmcgc3RyZXNzCisgIC1zYW1wbGU6OzsKKyAgICBTcGVjaWZ5IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBjb2xsZWN0IGZvciBtZWFzdXJpbmcgbGF0ZW5jeQorICAtc2NoZW1hOjs7CisgICAgUmVwbGljYXRpb24gc2V0dGluZ3MsIGNvbXByZXNzaW9uLCBjb21wYWN0aW9uLCBldGMuCisgIC1ub2RlOjs7CisgICAgTm9kZXMgdG8gY29ubmVjdCB0bworICAtbG9nOjs7CisgICAgV2hlcmUgdG8gbG9nIHByb2dyZXNzIHRvLCBhbmQgdGhlIGludGVydmFsIGF0IHdoaWNoIHRvIGRvIGl0CisgIC10cmFuc3BvcnQ6OzsKKyAgICBDdXN0b20gdHJhbnNwb3J0IGZhY3RvcmllcworICAtcG9ydDo7OworICAgIFRoZSBwb3J0IHRvIGNvbm5lY3QgdG8gY2Fzc2FuZHJhIG5vZGVzIG9uCisgIC1ncmFwaDo7OworICAgIEdyYXBoIHJlY29yZGVkIG1ldHJpY3MKKyAgLXRva2VucmFuZ2U6OzsKKyAgICBUb2tlbiByYW5nZSBzZXR0aW5ncworICAtam14Ojs7CisgICAgVXNlcm5hbWUgYW5kIHBhc3N3b3JkIGZvciBKTVggY29ubmVjdGlvbgorICAtY3JlZGVudGlhbHMtZmlsZSA8cGF0aD46OzsKKyAgICBDcmVkZW50aWFscyBmaWxlIHRvIHNwZWNpZnkgZm9yIENRTCwgSk1YIGFuZCB0cmFuc3BvcnQKKyAgLXJlcG9ydGluZzo7OworICAgIEZyZXF1ZW5jeSBvZiBwcmludGluZyBzdGF0aXN0aWNzIGFuZCBoZWFkZXIgZm9yIHN0cmVzcyBvdXRwdXQKK1N1Ym9wdGlvbnM6OjoKKyAgRXZlcnkgY29tbWFuZCBhbmQgcHJpbWFyeSBvcHRpb24gaGFzIGl0cyBvd24gY29sbGVjdGlvbiBvZiBzdWJvcHRpb25zLgorICBUaGVzZSBhcmUgdG9vIG51bWVyb3VzIHRvIGxpc3QgaGVyZS4gRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBzdWJvcHRpb25zCisgIGZvciBlYWNoIGNvbW1hbmQgb3Igb3B0aW9uLCBwbGVhc2UgdXNlIHRoZSBoZWxwIGNvbW1hbmQsCisgIGBjYXNzYW5kcmEtc3RyZXNzIGhlbHAgPGNvbW1hbmR8b3B0aW9uPmAuCisKKz09IFVzZXIgbW9kZQorCitVc2VyIG1vZGUgYWxsb3dzIHlvdSB0byBzdHJlc3MgeW91ciBvd24gc2NoZW1hcywgdG8gc2F2ZSB5b3UgdGltZQoraW4gdGhlIGxvbmcgcnVuLiBGaW5kIG91dCBpZiB5b3VyIGFwcGxpY2F0aW9uIGNhbiBzY2FsZSB1c2luZyBzdHJlc3MgdGVzdCB3aXRoIHlvdXIgc2NoZW1hLgorCis9PT0gUHJvZmlsZQorCitVc2VyIG1vZGUgZGVmaW5lcyBhIHByb2ZpbGUgdXNpbmcgWUFNTC4gCitNdWx0aXBsZSBZQU1MIGZpbGVzIG1heSBiZSBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2Ugb3BlcmF0aW9ucyBpbiB0aGUgb3BzIGFyZ3VtZW50IGFyZSByZWZlcmVuY2VkIGFzCitzcGVjbmFtZS5vcG5hbWUuCisKK0FuIGlkZW50aWZpZXIgZm9yIHRoZSBwcm9maWxlOgorCitbc291cmNlLHlhbWxdCistLS0tCitzcGVjbmFtZTogc3RhZmZfYWN0aXZpdGllcworLS0tLQorCitUaGUga2V5c3BhY2UgZm9yIHRoZSB0ZXN0OgorCitbc291cmNlLHlhbWxdCistLS0tCitrZXlzcGFjZTogc3RhZmYKKy0tLS0KKworQ1FMIGZvciB0aGUga2V5c3BhY2UuIE9wdGlvbmFsIGlmIHRoZSBrZXlzcGFjZSBhbHJlYWR5IGV4aXN0czoKKworW3NvdXJjZSx5YW1sXQorLS0tLQora2V5c3BhY2VfZGVmaW5pdGlvbjogfAorIENSRUFURSBLRVlTUEFDRSBzdHJlc3NjcWwgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJzogM307CistLS0tCisKK1RoZSB0YWJsZSB0byBiZSBzdHJlc3NlZDoKKworW3NvdXJjZSx5YW1sXQorLS0tLQordGFibGU6IHN0YWZmX2FjdGl2aXRpZXMKKy0tLS0KKworQ1FMIGZvciB0aGUgdGFibGUuIE9wdGlvbmFsIGlmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0czoKKworW3NvdXJjZSx5YW1sXQorLS0tLQordGFibGVfZGVmaW5pdGlvbjogfAorICBDUkVBVEUgVEFCTEUgc3RhZmZfYWN0aXZpdGllcyAoCisgICAgICBuYW1lIHRleHQsCisgICAgICB3aGVuIHRpbWV1dWlkLAorICAgICAgd2hhdCB0ZXh0LAorICAgICAgUFJJTUFSWSBLRVkobmFtZSwgd2hlbiwgd2hhdCkKKyAgKSAKKy0tLS0KKworT3B0aW9uYWwgbWV0YS1pbmZvcm1hdGlvbiBvbiB0aGUgZ2VuZXJhdGVkIGNvbHVtbnMgaW4gdGhlIGFib3ZlIHRhYmxlLgorVGhlIG1pbiBhbmQgbWF4IG9ubHkgYXBwbHkgdG8gdGV4dCBhbmQgYmxvYiB0eXBlcy4gVGhlIGRpc3RyaWJ1dGlvbgorZmllbGQgcmVwcmVzZW50cyB0aGUgdG90YWwgdW5pcXVlIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9uIG9mIHRoYXQgY29sdW1uCithY3Jvc3Mgcm93czoKKworW3NvdXJjZSx5YW1sXQorLS0tLQorY29sdW1uc3BlYzoKKyAgLSBuYW1lOiBuYW1lCisgICAgc2l6ZTogdW5pZm9ybSg1Li4xMCkgIyBUaGUgbmFtZXMgb2YgdGhlIHN0YWZmIG1lbWJlcnMgYXJlIGJldHdlZW4gNS0xMCBjaGFyYWN0ZXJzCisgICAgcG9wdWxhdGlvbjogdW5pZm9ybSgxLi4xMCkgIyAxMCBwb3NzaWJsZSBzdGFmZiBtZW1iZXJzIHRvIHBpY2sgZnJvbQorICAtIG5hbWU6IHdoZW4KKyAgICBjbHVzdGVyOiB1bmlmb3JtKDIwLi41MDApICMgU3RhZmYgbWVtYmVycyBkbyBiZXR3ZWVuIDIwIGFuZCA1MDAgZXZlbnRzCisgIC0gbmFtZTogd2hhdAorICAgIHNpemU6IG5vcm1hbCgxMC4uMTAwLDUwKQorLS0tLQorCitTdXBwb3J0ZWQgdHlwZXMgYXJlOgorCitBbiBleHBvbmVudGlhbCBkaXN0cmlidXRpb24gb3ZlciB0aGUgcmFuZ2UgW21pbi4ubWF4XToKKworW3NvdXJjZSx5YW1sXQorLS0tLQorRVhQKG1pbi4ubWF4KQorLS0tLQorCitBbiBleHRyZW1lIHZhbHVlIChXZWlidWxsKSBkaXN0cmlidXRpb24gb3ZlciB0aGUgcmFuZ2UgW21pbi4ubWF4XToKKworW3NvdXJjZSx5YW1sXQorLS0tLQorRVhUUkVNRShtaW4uLm1heCxzaGFwZSkKKy0tLS0KKworQSBnYXVzc2lhbi9ub3JtYWwgZGlzdHJpYnV0aW9uLCB3aGVyZSBtZWFuPShtaW4rbWF4KS8yLCBhbmQgc3RkZXYgaXMKKyhtZWFuLW1pbikvc3RkdnJuZzoKKworW3NvdXJjZSx5YW1sXQorLS0tLQorR0FVU1NJQU4obWluLi5tYXgsc3RkdnJuZykKKy0tLS0KKworQSBnYXVzc2lhbi9ub3JtYWwgZGlzdHJpYnV0aW9uLCB3aXRoIGV4cGxpY2l0bHkgZGVmaW5lZCBtZWFuIGFuZCBzdGRldjoKKworW3NvdXJjZSx5YW1sXQorLS0tLQorR0FVU1NJQU4obWluLi5tYXgsbWVhbixzdGRldikKKy0tLS0KKworQSB1bmlmb3JtIGRpc3RyaWJ1dGlvbiBvdmVyIHRoZSByYW5nZSBbbWluLCBtYXhdOgorCitbc291cmNlLHlhbWxdCistLS0tCitVTklGT1JNKG1pbi4ubWF4KQorLS0tLQorCitBIGZpeGVkIGRpc3RyaWJ1dGlvbiwgYWx3YXlzIHJldHVybmluZyB0aGUgc2FtZSB2YWx1ZToKKworW3NvdXJjZSx5YW1sXQorLS0tLQorRklYRUQodmFsKQorLS0tLQorCitJZiBwcmVjZWRlZCBieSB+LCB0aGUgZGlzdHJpYnV0aW9uIGlzIGludmVydGVkCisKK0RlZmF1bHRzIGZvciBhbGwgY29sdW1ucyBhcmUgc2l6ZTogdW5pZm9ybSg0Li44KSwgcG9wdWxhdGlvbjoKK3VuaWZvcm0oMS4uMTAwQiksIGNsdXN0ZXI6IGZpeGVkKDEpCisKK0luc2VydCBkaXN0cmlidXRpb25zOgorCitbc291cmNlLHlhbWxdCistLS0tCitpbnNlcnQ6CisgICMgSG93IG1hbnkgcGFydGl0aW9uIHRvIGluc2VydCBwZXIgYmF0Y2gKKyAgcGFydGl0aW9uczogZml4ZWQoMSkKKyAgIyBIb3cgbWFueSByb3dzIHRvIHVwZGF0ZSBwZXIgcGFydGl0aW9uCisgIHNlbGVjdDogZml4ZWQoMSkvNTAwCisgICMgVU5MT0dHRUQgb3IgTE9HR0VEIGJhdGNoIGZvciBpbnNlcnQKKyAgYmF0Y2h0eXBlOiBVTkxPR0dFRAorLS0tLQorCitDdXJyZW50bHkgYWxsIGluc2VydHMgYXJlIGRvbmUgaW5zaWRlIGJhdGNoZXMuCisKK1JlYWQgc3RhdGVtZW50cyB0byB1c2UgZHVyaW5nIHRoZSB0ZXN0OgorCitbc291cmNlLHlhbWxdCistLS0tCitxdWVyaWVzOgorICAgZXZlbnRzOgorICAgICAgY3FsOiBzZWxlY3QgKiAgZnJvbSBzdGFmZl9hY3Rpdml0aWVzIHdoZXJlIG5hbWUgPSA/CisgICAgICBmaWVsZHM6IHNhbWVyb3cKKyAgIGxhdGVzdF9ldmVudDoKKyAgICAgIGNxbDogc2VsZWN0ICogZnJvbSBzdGFmZl9hY3Rpdml0aWVzIHdoZXJlIG5hbWUgPSA/ICBMSU1JVCAxCisgICAgICBmaWVsZHM6IHNhbWVyb3cKKy0tLS0KKworUnVubmluZyBhIHVzZXIgbW9kZSB0ZXN0OgorCitbc291cmNlLHlhbWxdCistLS0tCitjYXNzYW5kcmEtc3RyZXNzIHVzZXIgcHJvZmlsZT0uL2V4YW1wbGUueWFtbCBkdXJhdGlvbj0xbSAib3BzKGluc2VydD0xLGxhdGVzdF9ldmVudD0xLGV2ZW50cz0xKSIgdHJ1bmNhdGU9b25jZQorLS0tLQorCitUaGlzIHdpbGwgY3JlYXRlIHRoZSBzY2hlbWEgdGhlbiBydW4gdGVzdHMgZm9yIDEgbWludXRlIHdpdGggYW4gZXF1YWwKK251bWJlciBvZiBpbnNlcnRzLCBsYXRlc3RfZXZlbnQgcXVlcmllcyBhbmQgZXZlbnRzIHF1ZXJpZXMuIEFkZGl0aW9uYWxseQordGhlIHRhYmxlIHdpbGwgYmUgdHJ1bmNhdGVkIG9uY2UgYmVmb3JlIHRoZSB0ZXN0LgorCitUaGUgZnVsbCBleGFtcGxlIGNhbiBiZSBmb3VuZCBoZXJlOgorW3NvdXJjZSwgeWFtbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkWUFNTC9zdHJlc3MtZXhhbXBsZS55YW1sW10KKy0tLS0gCisKK1J1bm5pbmcgYSB1c2VyIG1vZGUgdGVzdCB3aXRoIG11bHRpcGxlIHlhbWwgZmlsZXM6Ojo6CisgIGNhc3NhbmRyYS1zdHJlc3MgdXNlciBwcm9maWxlPS4vZXhhbXBsZS55YW1sLC4vZXhhbXBsZTIueWFtbAorICBkdXJhdGlvbj0xbSAib3BzKGV4MS5pbnNlcnQ9MSxleDEubGF0ZXN0X2V2ZW50PTEsZXgyLmluc2VydD0yKSIKKyAgdHJ1bmNhdGU9b25jZQorVGhpcyB3aWxsIHJ1biBvcGVyYXRpb25zIGFzIHNwZWNpZmllZCBpbiBib3RoIHRoZSBleGFtcGxlLnlhbWwgYW5kCitleGFtcGxlMi55YW1sIGZpbGVzLiBleGFtcGxlLnlhbWwgYW5kIGV4YW1wbGUyLnlhbWwgY2FuIHJlZmVyZW5jZSB0aGUKK3NhbWUgdGFibGUsIGFsdGhvdWdoIGNhcmUgbXVzdCBiZSB0YWtlbiB0aGF0IHRoZSB0YWJsZSBkZWZpbml0aW9uIGlzIGlkZW50aWNhbAorIChkYXRhIGdlbmVyYXRpb24gc3BlY3MgY2FuIGJlIGRpZmZlcmVudCkuCisKKz09PSBMaWdodHdlaWdodCB0cmFuc2FjdGlvbiBzdXBwb3J0CisKK2Nhc3NhbmRyYS1zdHJlc3Mgc3VwcG9ydHMgbGlnaHR3ZWlnaHQgdHJhbnNhY3Rpb25zLiAKK1RvIHVzZSB0aGlzIGZlYXR1cmUsIHRoZSBjb21tYW5kIHdpbGwgZmlyc3QgcmVhZCBjdXJyZW50IGRhdGEgZnJvbSBDYXNzYW5kcmEsIGFuZCB0aGVuIHVzZXMgcmVhZCB2YWx1ZXMgdG8KK2Z1bGZpbGwgbGlnaHR3ZWlnaHQgdHJhbnNhY3Rpb24gY29uZGl0aW9ucy4KKworTGlnaHR3ZWlnaHQgdHJhbnNhY3Rpb24gdXBkYXRlIHF1ZXJ5OgorCitbc291cmNlLHlhbWxdCistLS0tCitxdWVyaWVzOgorICByZWd1bGFydXBkYXRlOgorICAgICAgY3FsOiB1cGRhdGUgYmxvZ3Bvc3RzIHNldCBhdXRob3IgPSA/IHdoZXJlIGRvbWFpbiA9ID8gYW5kIHB1Ymxpc2hlZF9kYXRlID0gPworICAgICAgZmllbGRzOiBzYW1lcm93CisgIHVwZGF0ZXdpdGhsd3Q6CisgICAgICBjcWw6IHVwZGF0ZSBibG9ncG9zdHMgc2V0IGF1dGhvciA9ID8gd2hlcmUgZG9tYWluID0gPyBhbmQgcHVibGlzaGVkX2RhdGUgPSA/IElGIGJvZHkgPSA/IEFORCB1cmwgPSA/CisgICAgICBmaWVsZHM6IHNhbWVyb3cKKy0tLS0KKworVGhlIGZ1bGwgZXhhbXBsZSBjYW4gYmUgZm91bmQgaGVyZToKK1tzb3VyY2UsIHlhbWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFlBTUwvc3RyZXNzLWx3dC1leGFtcGxlLnlhbWxbXQorLS0tLQorCis9PSBHcmFwaGluZworCitHcmFwaHMgY2FuIGJlIGdlbmVyYXRlZCBmb3IgZWFjaCBydW4gb2Ygc3RyZXNzLgorCitpbWFnZTo6ZXhhbXBsZS1zdHJlc3MtZ3JhcGgucG5nW2V4YW1wbGUgY2Fzc2FuZHJhLXN0cmVzcyBncmFwaF0KKworVG8gY3JlYXRlIGEgbmV3IGdyYXBoOgorCitbc291cmNlLHlhbWxdCistLS0tCitjYXNzYW5kcmEtc3RyZXNzIHVzZXIgcHJvZmlsZT0uL3N0cmVzcy1leGFtcGxlLnlhbWwgIm9wcyhpbnNlcnQ9MSxsYXRlc3RfZXZlbnQ9MSxldmVudHM9MSkiIC1ncmFwaCBmaWxlPWdyYXBoLmh0bWwgdGl0bGU9IkF3ZXNvbWUgZ3JhcGgiCistLS0tCisKK1RvIGFkZCBhIG5ldyBydW4gdG8gYW4gZXhpc3RpbmcgZ3JhcGggcG9pbnQgdG8gYW4gZXhpc3RpbmcgZmlsZSBhbmQgYWRkCithIHJldmlzaW9uIG5hbWU6CisKK1tzb3VyY2UseWFtbF0KKy0tLS0KK2Nhc3NhbmRyYS1zdHJlc3MgdXNlciBwcm9maWxlPS4vc3RyZXNzLWV4YW1wbGUueWFtbCBkdXJhdGlvbj0xbSAib3BzKGluc2VydD0xLGxhdGVzdF9ldmVudD0xLGV2ZW50cz0xKSIgLWdyYXBoIGZpbGU9Z3JhcGguaHRtbCB0aXRsZT0iQXdlc29tZSBncmFwaCIgcmV2aXNpb249IlNlY29uZCBydW4iCistLS0tCisKKz09IEZBUQorCisqSG93IGRvIHlvdSB1c2UgTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3kgZm9yIHRoZSBrZXlzcGFjZT8qCisKK1VzZSB0aGUgc2NoZW1hIG9wdGlvbiBtYWtpbmcgc3VyZSB0byBlaXRoZXIgZXNjYXBlIHRoZSBwYXJlbnRoZXNpcyBvcgorZW5jbG9zZSBpbiBxdW90ZXM6CisKK1tzb3VyY2UseWFtbF0KKy0tLS0KK2Nhc3NhbmRyYS1zdHJlc3Mgd3JpdGUgLXNjaGVtYSAicmVwbGljYXRpb24oc3RyYXRlZ3k9TmV0d29ya1RvcG9sb2d5U3RyYXRlZ3ksZGF0YWNlbnRlcjE9MykiCistLS0tCisKKypIb3cgZG8geW91IHVzZSBTU0w/KgorCitVc2UgdGhlIHRyYW5zcG9ydCBvcHRpb246CisKK1tzb3VyY2UseWFtbF0KKy0tLS0KK2Nhc3NhbmRyYS1zdHJlc3MgIndyaXRlIG49MTAwayBjbD1PTkUgbm8td2FybXVwIiAtdHJhbnNwb3J0ICJ0cnVzdHN0b3JlPSRIT01FL2prcy90cnVzdHN0b3JlLmprcyB0cnVzdHN0b3JlLXBhc3N3b3JkPWNhc3NhbmRyYSIKKy0tLS0KKworKklzIENhc3NhbmRyYSBTdHJlc3MgYSBzZWN1cmVkIHRvb2w/KgorCitDYXNzYW5kcmEgc3RyZXNzIGlzIG5vdCBhIHNlY3VyZWQgdG9vbC4gU2VyaWFsaXphdGlvbiBhbmQgb3RoZXIgYXNwZWN0cworb2YgdGhlIHRvb2wgb2ZmZXIgbm8gc2VjdXJpdHkgZ3VhcmFudGVlcy4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9jcWxzaC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL2NxbHNoLmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUyMDllOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9jcWxzaC5hZG9jCkBAIC0wLDAgKzEsNTU2IEBACis9IGNxbHNoOiB0aGUgQ1FMIHNoZWxsCisKK2BjcWxzaGAgaXMgYSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlIGZvciBpbnRlcmFjdGluZyB3aXRoIENhc3NhbmRyYSB1c2luZyBDUUwgKHRoZSBDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UpLiAKK0l0IGlzIHNoaXBwZWQgd2l0aCBldmVyeSBDYXNzYW5kcmEgcGFja2FnZSwgYW5kIGNhbiBiZSBmb3VuZCBpbiB0aGUgYmluLyBkaXJlY3RvcnkgYWxvbmdzaWRlIHRoZSBjYXNzYW5kcmEKK2V4ZWN1dGFibGUuIAorYGNxbHNoYCBpcyBpbXBsZW1lbnRlZCB3aXRoIHRoZSBQeXRob24gbmF0aXZlIHByb3RvY29sIGRyaXZlciwgYW5kIGNvbm5lY3RzIHRvIHRoZSBzaW5nbGUgc3BlY2lmaWVkIG5vZGUuCisKKz09IENvbXBhdGliaWxpdHkKKworYGNxbHNoYCBpcyBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuNy4KKworSW4gZ2VuZXJhbCwgYSBnaXZlbiB2ZXJzaW9uIG9mIGBjcWxzaGAgaXMgb25seSBndWFyYW50ZWVkIHRvIHdvcmsgd2l0aCB0aGUKK3ZlcnNpb24gb2YgQ2Fzc2FuZHJhIHRoYXQgaXQgd2FzIHJlbGVhc2VkIHdpdGguIAorSW4gc29tZSBjYXNlcywgYGNxbHNoYCBtYXkgd29yayB3aXRoIG9sZGVyIG9yIG5ld2VyIHZlcnNpb25zIG9mIENhc3NhbmRyYSwgYnV0IHRoaXMgaXMgbm90CitvZmZpY2lhbGx5IHN1cHBvcnRlZC4KKworPT0gT3B0aW9uYWwgRGVwZW5kZW5jaWVzCisKK2BjcWxzaGAgc2hpcHMgd2l0aCBhbGwgZXNzZW50aWFsIGRlcGVuZGVuY2llcy4gSG93ZXZlciwgdGhlcmUgYXJlIHNvbWUKK29wdGlvbmFsIGRlcGVuZGVuY2llcyB0aGF0IGNhbiBiZSBpbnN0YWxsZWQgdG8gaW1wcm92ZSB0aGUgY2FwYWJpbGl0aWVzCitvZiBgY3Fsc2hgLgorCis9PT0gcHl0egorCitCeSBkZWZhdWx0LCBgY3Fsc2hgIGRpc3BsYXlzIGFsbCB0aW1lc3RhbXBzIHdpdGggYSBVVEMgdGltZXpvbmUuIAorVG8gc3VwcG9ydCBkaXNwbGF5IG9mIHRpbWVzdGFtcHMgd2l0aCBhbm90aGVyIHRpbWV6b25lLCBpbnN0YWxsCit0aGUgaHR0cDovL3B5dHouc291cmNlZm9yZ2UubmV0L1tweXR6XSBsaWJyYXJ5LiAKK1NlZSB0aGUgYHRpbWV6b25lYCBvcHRpb24gaW4geHJlZjpjcWwvdG9vbHMvY3Fsc2guYWRvYyNjcWxzaHJjW2NxbHNocmNdIGZvciBzcGVjaWZ5aW5nIGEgdGltZXpvbmUgdG8KK3VzZS4KKworPT09IGN5dGhvbgorCitUaGUgcGVyZm9ybWFuY2Ugb2YgY3Fsc2gncyBgQ09QWWAgb3BlcmF0aW9ucyBjYW4gYmUgaW1wcm92ZWQgYnkKK2luc3RhbGxpbmcgaHR0cDovL2N5dGhvbi5vcmcvW2N5dGhvbl0uIFRoaXMgd2lsbCBjb21waWxlIHRoZSBweXRob24KK21vZHVsZXMgdGhhdCBhcmUgY2VudHJhbCB0byB0aGUgcGVyZm9ybWFuY2Ugb2YgYENPUFlgLgorCitbW2NxbHNocmNdXQorPT0gY3Fsc2hyYworCitUaGUgYGNxbHNocmNgIGZpbGUgaG9sZHMgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBgY3Fsc2hgLiAKK0J5IGRlZmF1bHQsIHRoZSBmaWxlIGlzIGxvY2F0ZWQgdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSBhdCBgfi8uY2Fzc2FuZHJhL2NxbHNocmNgLCBidXQgYQorY3VzdG9tIGxvY2F0aW9uIGNhbiBiZSBzcGVjaWZpZWQgd2l0aCB0aGUgYC0tY3Fsc2hyY2Agb3B0aW9uLgorCitFeGFtcGxlIGNvbmZpZyB2YWx1ZXMgYW5kIGRvY3VtZW50YXRpb24gY2FuIGJlIGZvdW5kIGluIHRoZQorYGNvbmYvY3Fsc2hyYy5zYW1wbGVgIGZpbGUgb2YgYSB0YXJiYWxsIGluc3RhbGxhdGlvbi4gCitZb3UgY2FuIGFsc28gdmlldyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlCitodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS9ibG9iL3RydW5rL2NvbmYvY3Fsc2hyYy5zYW1wbGVbY3Fsc2hyYyBmaWxlIG9ubGluZV0uCisKK1tbY3FsX2hpc3RvcnldXQorPT0gY3FsIGhpc3RvcnkKKworQWxsIENRTCBjb21tYW5kcyB5b3UgZXhlY3V0ZSBhcmUgd3JpdHRlbiB0byBhIGhpc3RvcnkgZmlsZS4gQnkgZGVmYXVsdCwgQ1FMIGhpc3Rvcnkgd2lsbCBiZSB3cml0dGVuIHRvIGB+Ly5jYXNzYW5kcmEvY3FsX2hpc3RvcnlgLiBZb3UgY2FuIGNoYW5nZSB0aGlzIGRlZmF1bHQgYnkgc2V0dGluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYENRTF9ISVNUT1JZYCBsaWtlIGB+L3NvbWUvb3RoZXIvcGF0aC90by9jcWxzaF9oaXN0b3J5YCB3aGVyZSBgY3Fsc2hfaGlzdG9yeWAgaXMgYSBmaWxlLiBBbGwgcGFyZW50IGRpcmVjdG9yaWVzIHRvIGhpc3RvcnkgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgaWYgdGhleSBkbyBub3QgZXhpc3QuIElmIHlvdSBkbyBub3Qgd2FudCB0byBwZXJzaXN0IGhpc3RvcnksIHlvdSBjYW4gZG8gc28gYnkgc2V0dGluZyBDUUxfSElTVE9SWSB0byAvZGV2L251bGwuCitUaGlzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGZyb20gQ2Fzc2FuZHJhIDQuMS4KKworPT0gQ29tbWFuZCBMaW5lIE9wdGlvbnMKKworVXNhZ2U6IGBjcWxzaC5weSBbb3B0aW9uc10gW2hvc3QgW3BvcnRdXWAKKworQ1FMIFNoZWxsIGZvciBBcGFjaGUgQ2Fzc2FuZHJhCisKK09wdGlvbnM6CisKK2AtLXZlcnNpb25gOjoKKyAgc2hvdyBwcm9ncmFtJ3MgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQKKworYC1oYCBgLS1oZWxwYDo6CisgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKK2AtQ2AgYC0tY29sb3JgOjoKKyAgQWx3YXlzIHVzZSBjb2xvciBvdXRwdXQKK2AtLW5vLWNvbG9yYDo6CisgIE5ldmVyIHVzZSBjb2xvciBvdXRwdXQKK2AtLWJyb3dzZXI9QlJPV1NFUmA6OgorICBUaGUgYnJvd3NlciB0byB1c2UgdG8gZGlzcGxheSBDUUwgaGVscCwgd2hlcmUgQlJPV1NFUiBjYW4gYmU6CisgIG9uZSBvZiB0aGUgc3VwcG9ydGVkIGJyb3dzZXJzIGluIGh0dHBzOi8vZG9jcy5weXRob24ub3JnLzMvbGlicmFyeS93ZWJicm93c2VyLmh0bWwuCisgIGJyb3dzZXIgcGF0aCBmb2xsb3dlZCBieSAlcywgZXhhbXBsZTogL3Vzci9iaW4vZ29vZ2xlLWNocm9tZS1zdGFibGUgJXMKK2AtLXNzbGA6OgorICBVc2UgU1NMCisKK2AtdSBVU0VSTkFNRWAgYC0tdXNlcm5hbWU9VVNFUk5BTUVgOjoKKyAgQXV0aGVudGljYXRlIGFzIHVzZXIuCitgLXAgUEFTU1dPUkRgIGAtLXBhc3N3b3JkPVBBU1NXT1JEYDo6CisgIEF1dGhlbnRpY2F0ZSB1c2luZyBwYXNzd29yZC4KK2AtayBLRVlTUEFDRWAgYC0ta2V5c3BhY2U9S0VZU1BBQ0VgOjoKKyAgQXV0aGVudGljYXRlIHRvIHRoZSBnaXZlbiBrZXlzcGFjZS4KK2AtZiBGSUxFYCBgLS1maWxlPUZJTEVgOjoKKyAgRXhlY3V0ZSBjb21tYW5kcyBmcm9tIEZJTEUsIHRoZW4gZXhpdAorYC0tZGVidWdgOjoKKyAgU2hvdyBhZGRpdGlvbmFsIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgorYC0tY292ZXJhZ2VgOjoKKyAgQ29sbGVjdCBjb3ZlcmFnZSBkYXRhCitgLS1lbmNvZGluZz1FTkNPRElOR2A6OgorICBTcGVjaWZ5IGEgbm9uLWRlZmF1bHQgZW5jb2RpbmcgZm9yIG91dHB1dC4gKERlZmF1bHQ6IHV0Zi04KQorYC0tY3Fsc2hyYz1DUUxTSFJDYDo6CisgIFNwZWNpZnkgYW4gYWx0ZXJuYXRpdmUgY3Fsc2hyYyBmaWxlIGxvY2F0aW9uLgorYC0tY3JlZGVudGlhbHM9Q1JFREVOVElBTFNgOjoKKyAgU3BlY2lmeSBhbiBhbHRlcm5hdGl2ZSBjcmVkZW50aWFscyBmaWxlIGxvY2F0aW9uLgorYC0tY3FsdmVyc2lvbj1DUUxWRVJTSU9OYDo6CisgIFNwZWNpZnkgYSBwYXJ0aWN1bGFyIENRTCB2ZXJzaW9uLCBieSBkZWZhdWx0IHRoZQorICBoaWdoZXN0IHZlcnNpb24gc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIgd2lsbCBiZSB1c2VkLgorICBFeGFtcGxlczogIjMuMC4zIiwgIjMuMS4wIgorYC0tcHJvdG9jb2wtdmVyc2lvbj1QUk9UT0NPTF9WRVJTSU9OYDo6CisgIFNwZWNpZnkgYSBzcGVjaWZpYyBwcm90Y29sIHZlcnNpb24gb3RoZXJ3aXNlIHRoZQorICBjbGllbnQgd2lsbCBkZWZhdWx0IGFuZCBkb3duZ3JhZGUgYXMgbmVjZXNzYXJ5CitgLWUgRVhFQ1VURWAgYC0tZXhlY3V0ZT1FWEVDVVRFYDo6CisgIEV4ZWN1dGUgdGhlIHN0YXRlbWVudCBhbmQgcXVpdC4KK2AtLWNvbm5lY3QtdGltZW91dD1DT05ORUNUX1RJTUVPVVRgOjoKKyAgU3BlY2lmeSB0aGUgY29ubmVjdGlvbiB0aW1lb3V0IGluIHNlY29uZHMgKGRlZmF1bHQ6IDUgc2Vjb25kcykuCitgLS1yZXF1ZXN0LXRpbWVvdXQ9UkVRVUVTVF9USU1FT1VUYDo6CisgIFNwZWNpZnkgdGhlIGRlZmF1bHQgcmVxdWVzdCB0aW1lb3V0IGluIHNlY29uZHMKKyAgKGRlZmF1bHQ6IDEwIHNlY29uZHMpLgorYC10LCAtLXR0eWA6OgorICBGb3JjZSB0dHkgbW9kZSAoY29tbWFuZCBwcm9tcHQpLgorYC12YCBgLS12YDo6CisgIFByaW50IHRoZSBjdXJyZW50IHZlcnNpb24gb2YgY3Fsc2guCisKKz09IFNwZWNpYWwgQ29tbWFuZHMKKworSW4gYWRkaXRpb24gdG8gc3VwcG9ydGluZyByZWd1bGFyIENRTCBzdGF0ZW1lbnRzLCBgY3Fsc2hgIGFsc28gc3VwcG9ydHMgYQorbnVtYmVyIG9mIHNwZWNpYWwgY29tbWFuZHMgdGhhdCBhcmUgbm90IHBhcnQgb2YgQ1FMLiBUaGVzZSBhcmUgZGV0YWlsZWQKK2JlbG93LgorCis9PT0gYENPTlNJU1RFTkNZYAorCitgVXNhZ2VgOiBgQ09OU0lTVEVOQ1kgPGNvbnNpc3RlbmN5IGxldmVsPmAKKworU2V0cyB0aGUgY29uc2lzdGVuY3kgbGV2ZWwgZm9yIG9wZXJhdGlvbnMgdG8gZm9sbG93LiBWYWxpZCBhcmd1bWVudHMKK2luY2x1ZGU6CisKKyogYEFOWWAKKyogYE9ORWAKKyogYFRXT2AKKyogYFRIUkVFYAorKiBgUVVPUlVNYAorKiBgQUxMYAorKiBgTE9DQUxfUVVPUlVNYAorKiBgTE9DQUxfT05FYAorKiBgU0VSSUFMYAorKiBgTE9DQUxfU0VSSUFMYAorCis9PT0gYFNFUklBTCBDT05TSVNURU5DWWAKKworYFVzYWdlYDogYFNFUklBTCBDT05TSVNURU5DWSA8Y29uc2lzdGVuY3kgbGV2ZWw+YAorCitTZXRzIHRoZSBzZXJpYWwgY29uc2lzdGVuY3kgbGV2ZWwgZm9yIG9wZXJhdGlvbnMgdG8gZm9sbG93LiBWYWxpZAorYXJndW1lbnRzIGluY2x1ZGU6CisKKyogYFNFUklBTGAKKyogYExPQ0FMX1NFUklBTGAKKworVGhlIHNlcmlhbCBjb25zaXN0ZW5jeSBsZXZlbCBpcyBvbmx5IHVzZWQgYnkgY29uZGl0aW9uYWwgdXBkYXRlcworKGBJTlNFUlRgLCBgVVBEQVRFYCBhbmQgYERFTEVURWAgd2l0aCBhbiBgSUZgIGNvbmRpdGlvbikuIEZvciB0aG9zZSwgdGhlCitzZXJpYWwgY29uc2lzdGVuY3kgbGV2ZWwgZGVmaW5lcyB0aGUgY29uc2lzdGVuY3kgbGV2ZWwgb2YgdGhlIHNlcmlhbAorcGhhc2UgKG9yIOKAnHBheG9z4oCdIHBoYXNlKSB3aGlsZSB0aGUgbm9ybWFsIGNvbnNpc3RlbmN5IGxldmVsIGRlZmluZXMgdGhlCitjb25zaXN0ZW5jeSBmb3IgdGhlIOKAnGxlYXJu4oCdIHBoYXNlLCBpLmUuIHdoYXQgdHlwZSBvZiByZWFkcyB3aWxsIGJlCitndWFyYW50ZWVkIHRvIHNlZSB0aGUgdXBkYXRlIHJpZ2h0IGF3YXkuIEZvciBleGFtcGxlLCBpZiBhIGNvbmRpdGlvbmFsCit3cml0ZSBoYXMgYSBjb25zaXN0ZW5jeSBsZXZlbCBvZiBgUVVPUlVNYCAoYW5kIGlzIHN1Y2Nlc3NmdWwpLCB0aGVuIGEKK2BRVU9SVU1gIHJlYWQgaXMgZ3VhcmFudGVlZCB0byBzZWUgdGhhdCB3cml0ZS4gQnV0IGlmIHRoZSByZWd1bGFyCitjb25zaXN0ZW5jeSBsZXZlbCBvZiB0aGF0IHdyaXRlIGlzIGBBTllgLCB0aGVuIG9ubHkgYSByZWFkIHdpdGggYQorY29uc2lzdGVuY3kgbGV2ZWwgb2YgYFNFUklBTGAgaXMgZ3VhcmFudGVlZCB0byBzZWUgaXQgKGV2ZW4gYSByZWFkIHdpdGgKK2NvbnNpc3RlbmN5IGBBTExgIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGVub3VnaCkuCisKKz09PSBgU0hPVyBWRVJTSU9OYAorCitQcmludHMgdGhlIGBjcWxzaGAsIENhc3NhbmRyYSwgQ1FMLCBhbmQgbmF0aXZlIHByb3RvY29sIHZlcnNpb25zIGluIHVzZS4KK0V4YW1wbGU6CisKK1tzb3VyY2Usbm9uZV0KKy0tLS0KK2NxbHNoPiBTSE9XIFZFUlNJT04KK1tjcWxzaCA1LjAuMSB8IENhc3NhbmRyYSAzLjggfCBDUUwgc3BlYyAzLjQuMiB8IE5hdGl2ZSBwcm90b2NvbCB2NF0KKy0tLS0KKworPT09IGBTSE9XIEhPU1RgCisKK1ByaW50cyB0aGUgSVAgYWRkcmVzcyBhbmQgcG9ydCBvZiB0aGUgQ2Fzc2FuZHJhIG5vZGUgdGhhdCBgY3Fsc2hgIGlzCitjb25uZWN0ZWQgdG8gaW4gYWRkaXRpb24gdG8gdGhlIGNsdXN0ZXIgbmFtZS4gRXhhbXBsZToKKworW3NvdXJjZSxub25lXQorLS0tLQorY3Fsc2g+IFNIT1cgSE9TVAorQ29ubmVjdGVkIHRvIFByb2RfQ2x1c3RlciBhdCAxOTIuMC4wLjE6OTA0Mi4KKy0tLS0KKworPT09IGBTSE9XIFJFUExJQ0FTYAorCitQcmludHMgdGhlIElQIGFkZHJlc3NlcyBvZiB0aGUgQ2Fzc2FuZHJhIG5vZGVzIHdoaWNoIGFyZSByZXBsaWNhcyBmb3IgdGhlCitsaXN0ZWQgZ2l2ZW4gdG9rZW4gYW5kIGtleXNwYWNlLiBUaGlzIGNvbW1hbmQgaXMgYXZhaWxhYmxlIGZyb20gQ2Fzc2FuZHJhIDQuMi4KKworYFVzYWdlYDogYFNIT1cgUkVQTElDQVMgPHRva2VuPiAoPGtleXNwYWNlPilgCisKK0V4YW1wbGUgdXNhZ2U6CisKK1tzb3VyY2Usbm9uZV0KKy0tLS0KK2NxbHNoPiBTSE9XIFJFUExJQ0FTIDk1CitbJzE5Mi4wLjAuMScsICcxOTIuMC4wLjInXQorLS0tLQorCis9PT0gYFNIT1cgU0VTU0lPTmAKKworUHJldHR5IHByaW50cyBhIHNwZWNpZmljIHRyYWNpbmcgc2Vzc2lvbi4KKworYFVzYWdlYDogYFNIT1cgU0VTU0lPTiA8c2Vzc2lvbiBpZD5gCisKK0V4YW1wbGUgdXNhZ2U6CisKK1tzb3VyY2Usbm9uZV0KKy0tLS0KK2NxbHNoPiBTSE9XIFNFU1NJT04gOTVhYzY0NzAtMzI3ZS0xMWU2LWJlY2EtZGZiNjYwZDkyYWQ4CisKK1RyYWNpbmcgc2Vzc2lvbjogOTVhYzY0NzAtMzI3ZS0xMWU2LWJlY2EtZGZiNjYwZDkyYWQ4CisKKyBhY3Rpdml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0aW1lc3RhbXAgICAgICAgICAgICAgICAgICB8IHNvdXJjZSAgICB8IHNvdXJjZV9lbGFwc2VkIHwgY2xpZW50CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRlIENRTDMgcXVlcnkgfCAyMDE2LTA2LTE0IDE3OjIzOjEzLjk3OTAwMCB8IDEyNy4wLjAuMSB8ICAgICAgICAgICAgICAwIHwgMTI3LjAuMC4xCisgUGFyc2luZyBTRUxFQ1QgKiBGUk9NIHN5c3RlbS5sb2NhbDsgW1NoYXJlZFBvb2wtV29ya2VyLTFdIHwgMjAxNi0wNi0xNCAxNzoyMzoxMy45ODIwMDAgfCAxMjcuMC4wLjEgfCAgICAgICAgICAgMzg0MyB8IDEyNy4wLjAuMQorLi4uCistLS0tCisKKz09PSBgU09VUkNFYAorCitSZWFkcyB0aGUgY29udGVudHMgb2YgYSBmaWxlIGFuZCBleGVjdXRlcyBlYWNoIGxpbmUgYXMgYSBDUUwgc3RhdGVtZW50CitvciBzcGVjaWFsIGNxbHNoIGNvbW1hbmQuCisKK2BVc2FnZWA6IGBTT1VSQ0UgPHN0cmluZyBmaWxlbmFtZT5gCisKK0V4YW1wbGUgdXNhZ2U6CisKK1tzb3VyY2Usbm9uZV0KKy0tLS0KK2NxbHNoPiBTT1VSQ0UgJy9ob21lL2NhbHZpbmhvYmJzL2NvbW1hbmRzLmNxbCcKKy0tLS0KKworPT09IGBDQVBUVVJFYAorCitCZWdpbnMgY2FwdHVyaW5nIGNvbW1hbmQgb3V0cHV0IGFuZCBhcHBlbmRpbmcgaXQgdG8gYSBzcGVjaWZpZWQgZmlsZS4KK091dHB1dCB3aWxsIG5vdCBiZSBzaG93biBhdCB0aGUgY29uc29sZSB3aGlsZSBpdCBpcyBjYXB0dXJlZC4KKworYFVzYWdlYDoKKworW3NvdXJjZSxub25lXQorLS0tLQorQ0FQVFVSRSAnPGZpbGU+JzsKK0NBUFRVUkUgT0ZGOworQ0FQVFVSRTsKKy0tLS0KKworVGhhdCBpcywgdGhlIHBhdGggdG8gdGhlIGZpbGUgdG8gYmUgYXBwZW5kZWQgdG8gbXVzdCBiZSBnaXZlbiBpbnNpZGUgYQorc3RyaW5nIGxpdGVyYWwuIFRoZSBwYXRoIGlzIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcKK2RpcmVjdG9yeS4gVGhlIHRpbGRlIHNob3J0aGFuZCBub3RhdGlvbiAoYCd+L215ZGlyJ2ApIGlzIHN1cHBvcnRlZCBmb3IKK3JlZmVycmluZyB0byBgJEhPTUVgLgorCitPbmx5IHF1ZXJ5IHJlc3VsdCBvdXRwdXQgaXMgY2FwdHVyZWQuIEVycm9ycyBhbmQgb3V0cHV0IGZyb20gY3Fsc2gtb25seQorY29tbWFuZHMgd2lsbCBzdGlsbCBiZSBzaG93biBpbiB0aGUgY3Fsc2ggc2Vzc2lvbi4KKworVG8gc3RvcCBjYXB0dXJpbmcgb3V0cHV0IGFuZCBzaG93IGl0IGluIHRoZSBjcWxzaCBzZXNzaW9uIGFnYWluLCB1c2UKK2BDQVBUVVJFIE9GRmAuCisKK1RvIGluc3BlY3QgdGhlIGN1cnJlbnQgY2FwdHVyZSBjb25maWd1cmF0aW9uLCB1c2UgYENBUFRVUkVgIHdpdGggbm8KK2FyZ3VtZW50cy4KKworPT09IGBIRUxQYAorCitHaXZlcyBpbmZvcm1hdGlvbiBhYm91dCBjcWxzaCBjb21tYW5kcy4gVG8gc2VlIGF2YWlsYWJsZSB0b3BpY3MsIGVudGVyCitgSEVMUGAgd2l0aG91dCBhbnkgYXJndW1lbnRzLiBUbyBzZWUgaGVscCBvbiBhIHRvcGljLCB1c2UKK2BIRUxQIDx0b3BpYz5gLiBBbHNvIHNlZSB0aGUgYC0tYnJvd3NlcmAgYXJndW1lbnQgZm9yIGNvbnRyb2xsaW5nIHdoYXQKK2Jyb3dzZXIgaXMgdXNlZCB0byBkaXNwbGF5IGhlbHAuCisKKz09PSBgSElTVE9SWWAKKworUHJpbnRzIHRvIHRoZSBzY3JlZW4gdGhlIGxhc3QgYG5gIGNxbHNoIGNvbW1hbmRzIGV4ZWN1dGVkIG9uIHRoZSBzZXJ2ZXIuCitUaGUgbnVtYmVyIG9mIGxpbmVzIGRlZmF1bHRzIHRvIDUwIGlmIG5vdCBzcGVjaWZpZWQuIGBuYCBpcyBzZXQgZm9yCit0aGUgY3VycmVudCBDUUwgc2Vzc2lvbiBzbyBpZiB5b3Ugc2V0IGl0IGUuZy4gdG8gYDEwYCwgZnJvbSB0aGF0IHBvaW50Cit0aGVyZSB3aWxsIGJlIGF0IG1vc3QgMTAgbGFzdCBjb21tYW5kcyByZXR1cm5lZCB0byB5b3UuCisKK2BVc2FnZWA6CisKK1tzb3VyY2Usbm9uZV0KKy0tLS0KK0hJU1RPUlkgPG4+CistLS0tCisKKz09PSBgVFJBQ0lOR2AKKworRW5hYmxlcyBvciBkaXNhYmxlcyB0cmFjaW5nIGZvciBxdWVyaWVzLiBXaGVuIHRyYWNpbmcgaXMgZW5hYmxlZCwgb25jZSBhCitxdWVyeSBjb21wbGV0ZXMsIGEgdHJhY2Ugb2YgdGhlIGV2ZW50cyBkdXJpbmcgdGhlIHF1ZXJ5IHdpbGwgYmUgcHJpbnRlZC4KKworYFVzYWdlYDoKKworW3NvdXJjZSxub25lXQorLS0tLQorVFJBQ0lORyBPTgorVFJBQ0lORyBPRkYKKy0tLS0KKworPT09IGBQQUdJTkdgCisKK0VuYWJsZXMgcGFnaW5nLCBkaXNhYmxlcyBwYWdpbmcsIG9yIHNldHMgdGhlIHBhZ2Ugc2l6ZSBmb3IgcmVhZCBxdWVyaWVzLgorV2hlbiBwYWdpbmcgaXMgZW5hYmxlZCwgb25seSBvbmUgcGFnZSBvZiBkYXRhIHdpbGwgYmUgZmV0Y2hlZCBhdCBhIHRpbWUKK2FuZCBhIHByb21wdCB3aWxsIGFwcGVhciB0byBmZXRjaCB0aGUgbmV4dCBwYWdlLiBHZW5lcmFsbHksIGl0J3MgYSBnb29kCitpZGVhIHRvIGxlYXZlIHBhZ2luZyBlbmFibGVkIGluIGFuIGludGVyYWN0aXZlIHNlc3Npb24gdG8gYXZvaWQgZmV0Y2hpbmcKK2FuZCBwcmludGluZyBsYXJnZSBhbW91bnRzIG9mIGRhdGEgYXQgb25jZS4KKworYFVzYWdlYDoKKworW3NvdXJjZSxub25lXQorLS0tLQorUEFHSU5HIE9OCitQQUdJTkcgT0ZGCitQQUdJTkcgPHBhZ2Ugc2l6ZSBpbiByb3dzPgorLS0tLQorCis9PT0gYEVYUEFORGAKKworRW5hYmxlcyBvciBkaXNhYmxlcyB2ZXJ0aWNhbCBwcmludGluZyBvZiByb3dzLiBFbmFibGluZyBgRVhQQU5EYCBpcwordXNlZnVsIHdoZW4gbWFueSBjb2x1bW5zIGFyZSBmZXRjaGVkLCBvciB0aGUgY29udGVudHMgb2YgYSBzaW5nbGUgY29sdW1uCithcmUgbGFyZ2UuCisKK2BVc2FnZWA6CisKK1tzb3VyY2Usbm9uZV0KKy0tLS0KK0VYUEFORCBPTgorRVhQQU5EIE9GRgorLS0tLQorCis9PT0gYExPR0lOYAorCitBdXRoZW50aWNhdGUgYXMgYSBzcGVjaWZpZWQgQ2Fzc2FuZHJhIHVzZXIgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24uCisKK2BVc2FnZWA6CisKK1tzb3VyY2Usbm9uZV0KKy0tLS0KK0xPR0lOIDx1c2VybmFtZT4gWzxwYXNzd29yZD5dCistLS0tCisKKz09PSBgRVhJVGAKKworRW5kcyB0aGUgY3VycmVudCBzZXNzaW9uIGFuZCB0ZXJtaW5hdGVzIHRoZSBjcWxzaCBwcm9jZXNzLgorCitgVXNhZ2VgOgorCitbc291cmNlLG5vbmVdCistLS0tCitFWElUCitRVUlUCistLS0tCisKKz09PSBgQ0xFQVJgCisKK0NsZWFycyB0aGUgY29uc29sZS4KKworYFVzYWdlYDoKKworW3NvdXJjZSxub25lXQorLS0tLQorQ0xFQVIKK0NMUworLS0tLQorCis9PT0gYERFU0NSSUJFYAorCitQcmludHMgYSBkZXNjcmlwdGlvbiAodHlwaWNhbGx5IGEgc2VyaWVzIG9mIERETCBzdGF0ZW1lbnRzKSBvZiBhIHNjaGVtYQorZWxlbWVudCBvciB0aGUgY2x1c3Rlci4gVGhpcyBpcyB1c2VmdWwgZm9yIGR1bXBpbmcgYWxsIG9yIHBvcnRpb25zIG9mCit0aGUgc2NoZW1hLgorCitgVXNhZ2VgOgorCitbc291cmNlLG5vbmVdCistLS0tCitERVNDUklCRSBDTFVTVEVSCitERVNDUklCRSBTQ0hFTUEKK0RFU0NSSUJFIEtFWVNQQUNFUworREVTQ1JJQkUgS0VZU1BBQ0UgPGtleXNwYWNlIG5hbWU+CitERVNDUklCRSBUQUJMRVMKK0RFU0NSSUJFIFRBQkxFIDx0YWJsZSBuYW1lPgorREVTQ1JJQkUgSU5ERVggPGluZGV4IG5hbWU+CitERVNDUklCRSBNQVRFUklBTElaRUQgVklFVyA8dmlldyBuYW1lPgorREVTQ1JJQkUgVFlQRVMKK0RFU0NSSUJFIFRZUEUgPHR5cGUgbmFtZT4KK0RFU0NSSUJFIEZVTkNUSU9OUworREVTQ1JJQkUgRlVOQ1RJT04gPGZ1bmN0aW9uIG5hbWU+CitERVNDUklCRSBBR0dSRUdBVEVTCitERVNDUklCRSBBR0dSRUdBVEUgPGFnZ3JlZ2F0ZSBmdW5jdGlvbiBuYW1lPgorLS0tLQorCitJbiBhbnkgb2YgdGhlIGNvbW1hbmRzLCBgREVTQ2AgbWF5IGJlIHVzZWQgaW4gcGxhY2Ugb2YgYERFU0NSSUJFYC4KKworVGhlIGBERVNDUklCRSBDTFVTVEVSYCBjb21tYW5kIHByaW50cyB0aGUgY2x1c3RlciBuYW1lIGFuZCBwYXJ0aXRpb25lcjoKKworW3NvdXJjZSxub25lXQorLS0tLQorY3Fsc2g+IERFU0NSSUJFIENMVVNURVIKKworQ2x1c3RlcjogVGVzdCBDbHVzdGVyCitQYXJ0aXRpb25lcjogTXVybXVyM1BhcnRpdGlvbmVyCistLS0tCisKK1RoZSBgREVTQ1JJQkUgU0NIRU1BYCBjb21tYW5kIHByaW50cyB0aGUgRERMIHN0YXRlbWVudHMgbmVlZGVkIHRvCityZWNyZWF0ZSB0aGUgZW50aXJlIHNjaGVtYS4gVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBmb3IgZHVtcGluZyB0aGUKK3NjaGVtYSBpbiBvcmRlciB0byBjbG9uZSBhIGNsdXN0ZXIgb3IgcmVzdG9yZSBmcm9tIGEgYmFja3VwLgorCis9PT0gYENPUFkgVE9gCisKK0NvcGllcyBkYXRhIGZyb20gYSB0YWJsZSB0byBhIENTViBmaWxlLgorCitgVXNhZ2VgOgorCitbc291cmNlLG5vbmVdCistLS0tCitDT1BZIDx0YWJsZSBuYW1lPiBbKDxjb2x1bW4+LCAuLi4pXSBUTyA8ZmlsZSBuYW1lPiBXSVRIIDxjb3B5IG9wdGlvbj4gW0FORCA8Y29weSBvcHRpb24+IC4uLl0KKy0tLS0KKworSWYgbm8gY29sdW1ucyBhcmUgc3BlY2lmaWVkLCBhbGwgY29sdW1ucyBmcm9tIHRoZSB0YWJsZSB3aWxsIGJlIGNvcGllZAordG8gdGhlIENTViBmaWxlLiBBIHN1YnNldCBvZiBjb2x1bW5zIHRvIGNvcHkgbWF5IGJlIHNwZWNpZmllZCBieSBhZGRpbmcKK2EgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY29sdW1uIG5hbWVzIHN1cnJvdW5kZWQgYnkgcGFyZW50aGVzaXMgYWZ0ZXIKK3RoZSB0YWJsZSBuYW1lLgorCitUaGUgYDxmaWxlIG5hbWU+YCBzaG91bGQgYmUgYSBzdHJpbmcgbGl0ZXJhbCAod2l0aCBzaW5nbGUgcXVvdGVzKQorcmVwcmVzZW50aW5nIGEgcGF0aCB0byB0aGUgZGVzdGluYXRpb24gZmlsZS4gVGhpcyBjYW4gYWxzbyB0aGUgc3BlY2lhbAordmFsdWUgYFNURE9VVGAgKHdpdGhvdXQgc2luZ2xlIHF1b3RlcykgdG8gcHJpbnQgdGhlIENTViB0byBzdGRvdXQuCisKK1NlZSBgc2hhcmVkLWNvcHktb3B0aW9uc2AgZm9yIG9wdGlvbnMgdGhhdCBhcHBseSB0byBib3RoIGBDT1BZIFRPYCBhbmQKK2BDT1BZIEZST01gLgorCis9PT09IE9wdGlvbnMgZm9yIGBDT1BZIFRPYAorCitgTUFYUkVRVUVTVFNgOjoKKyAgVGhlIG1heGltdW0gbnVtYmVyIHRva2VuIHJhbmdlcyB0byBmZXRjaCBzaW11bHRhbmVvdXNseS4gRGVmYXVsdHMgdG8KKyAgNi4KK2BQQUdFU0laRWA6OgorICBUaGUgbnVtYmVyIG9mIHJvd3MgdG8gZmV0Y2ggaW4gYSBzaW5nbGUgcGFnZS4gRGVmYXVsdHMgdG8gMTAwMC4KK2BQQUdFVElNRU9VVGA6OgorICBCeSBkZWZhdWx0IHRoZSBwYWdlIHRpbWVvdXQgaXMgMTAgc2Vjb25kcyBwZXIgMTAwMCBlbnRyaWVzIGluIHRoZSBwYWdlCisgIHNpemUgb3IgMTAgc2Vjb25kcyBpZiBwYWdlc2l6ZSBpcyBzbWFsbGVyLgorYEJFR0lOVE9LRU5gLCBgRU5EVE9LRU5gOjoKKyAgVG9rZW4gcmFuZ2UgdG8gZXhwb3J0LiBEZWZhdWx0cyB0byBleHBvcnRpbmcgdGhlIGZ1bGwgcmluZy4KK2BNQVhPVVRQVVRTSVpFYDo6CisgIFRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG91dHB1dCBmaWxlIG1lYXN1cmVkIGluIG51bWJlciBvZiBsaW5lczsKKyAgYmV5b25kIHRoaXMgbWF4aW11bSB0aGUgb3V0cHV0IGZpbGUgd2lsbCBiZSBzcGxpdCBpbnRvIHNlZ21lbnRzLiAtMQorICBtZWFucyB1bmxpbWl0ZWQsIGFuZCBpcyB0aGUgZGVmYXVsdC4KK2BFTkNPRElOR2A6OgorICBUaGUgZW5jb2RpbmcgdXNlZCBmb3IgY2hhcmFjdGVycy4gRGVmYXVsdHMgdG8gYHV0ZjhgLgorCis9PT0gYENPUFkgRlJPTWAKKworQ29waWVzIGRhdGEgZnJvbSBhIENTViBmaWxlIHRvIHRhYmxlLgorCitgVXNhZ2VgOgorCitbc291cmNlLG5vbmVdCistLS0tCitDT1BZIDx0YWJsZSBuYW1lPiBbKDxjb2x1bW4+LCAuLi4pXSBGUk9NIDxmaWxlIG5hbWU+IFdJVEggPGNvcHkgb3B0aW9uPiBbQU5EIDxjb3B5IG9wdGlvbj4gLi4uXQorLS0tLQorCitJZiBubyBjb2x1bW5zIGFyZSBzcGVjaWZpZWQsIGFsbCBjb2x1bW5zIGZyb20gdGhlIENTViBmaWxlIHdpbGwgYmUKK2NvcGllZCB0byB0aGUgdGFibGUuIEEgc3Vic2V0IG9mIGNvbHVtbnMgdG8gY29weSBtYXkgYmUgc3BlY2lmaWVkIGJ5CithZGRpbmcgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBjb2x1bW4gbmFtZXMgc3Vycm91bmRlZCBieSBwYXJlbnRoZXNpcworYWZ0ZXIgdGhlIHRhYmxlIG5hbWUuCisKK1RoZSBgPGZpbGUgbmFtZT5gIHNob3VsZCBiZSBhIHN0cmluZyBsaXRlcmFsICh3aXRoIHNpbmdsZSBxdW90ZXMpCityZXByZXNlbnRpbmcgYSBwYXRoIHRvIHRoZSBzb3VyY2UgZmlsZS4gVGhpcyBjYW4gYWxzbyB0aGUgc3BlY2lhbCB2YWx1ZQorYFNURElOYCAod2l0aG91dCBzaW5nbGUgcXVvdGVzKSB0byByZWFkIHRoZSBDU1YgZGF0YSBmcm9tIHN0ZGluLgorCitTZWUgYHNoYXJlZC1jb3B5LW9wdGlvbnNgIGZvciBvcHRpb25zIHRoYXQgYXBwbHkgdG8gYm90aCBgQ09QWSBUT2AgYW5kCitgQ09QWSBGUk9NYC4KKworPT09PSBPcHRpb25zIGZvciBgQ09QWSBGUk9NYAorCitgSU5HRVNUUkFURWA6OgorICBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byBwcm9jZXNzIHBlciBzZWNvbmQuIERlZmF1bHRzIHRvIDEwMDAwMC4KK2BNQVhST1dTYDo6CisgIFRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIGltcG9ydC4gLTEgbWVhbnMgdW5saW1pdGVkLCBhbmQgaXMgdGhlCisgIGRlZmF1bHQuCitgU0tJUFJPV1NgOjoKKyAgQSBudW1iZXIgb2YgaW5pdGlhbCByb3dzIHRvIHNraXAuIERlZmF1bHRzIHRvIDAuCitgU0tJUENPTFNgOjoKKyAgQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBjb2x1bW4gbmFtZXMgdG8gaWdub3JlLiBCeSBkZWZhdWx0LCBubworICBjb2x1bW5zIGFyZSBza2lwcGVkLgorYE1BWFBBUlNFRVJST1JTYDo6CisgIFRoZSBtYXhpbXVtIGdsb2JhbCBudW1iZXIgb2YgcGFyc2luZyBlcnJvcnMgdG8gaWdub3JlLiAtMSBtZWFucworICB1bmxpbWl0ZWQsIGFuZCBpcyB0aGUgZGVmYXVsdC4KK2BNQVhJTlNFUlRFUlJPUlNgOjoKKyAgVGhlIG1heGltdW0gZ2xvYmFsIG51bWJlciBvZiBpbnNlcnQgZXJyb3JzIHRvIGlnbm9yZS4gLTEgbWVhbnMKKyAgdW5saW1pdGVkLiBUaGUgZGVmYXVsdCBpcyAxMDAwLgorYEVSUkZJTEVgID06OgorICBBIGZpbGUgdG8gc3RvcmUgYWxsIHJvd3MgdGhhdCBjb3VsZCBub3QgYmUgaW1wb3J0ZWQsIGJ5IGRlZmF1bHQgdGhpcworICBpcyBgaW1wb3J0Xzxrcz5fPHRhYmxlPi5lcnJgIHdoZXJlIGA8a3M+YCBpcyB5b3VyIGtleXNwYWNlIGFuZAorICBgPHRhYmxlPmAgaXMgeW91ciB0YWJsZSBuYW1lLgorYE1BWEJBVENIU0laRWA6OgorICBUaGUgbWF4IG51bWJlciBvZiByb3dzIGluc2VydGVkIGluIGEgc2luZ2xlIGJhdGNoLiBEZWZhdWx0cyB0byAyMC4KK2BNSU5CQVRDSFNJWkVgOjoKKyAgVGhlIG1pbiBudW1iZXIgb2Ygcm93cyBpbnNlcnRlZCBpbiBhIHNpbmdsZSBiYXRjaC4gRGVmYXVsdHMgdG8gMTAuCitgQ0hVTktTSVpFYDo6CisgIFRoZSBudW1iZXIgb2Ygcm93cyB0aGF0IGFyZSBwYXNzZWQgdG8gY2hpbGQgd29ya2VyIHByb2Nlc3NlcyBmcm9tIHRoZQorICBtYWluIHByb2Nlc3MgYXQgYSB0aW1lLiBEZWZhdWx0cyB0byA1MDAwLgorCis9PT09IFNoYXJlZCBDT1BZIE9wdGlvbnMKKworT3B0aW9ucyB0aGF0IGFyZSBjb21tb24gdG8gYm90aCBgQ09QWSBUT2AgYW5kIGBDT1BZIEZST01gLgorCitgTlVMTFZBTGA6OgorICBUaGUgc3RyaW5nIHBsYWNlaG9sZGVyIGZvciBudWxsIHZhbHVlcy4gRGVmYXVsdHMgdG8gYG51bGxgLgorYEhFQURFUmA6OgorICBGb3IgYENPUFkgVE9gLCBjb250cm9scyB3aGV0aGVyIHRoZSBmaXJzdCBsaW5lIGluIHRoZSBDU1Ygb3V0cHV0IGZpbGUKKyAgd2lsbCBjb250YWluIHRoZSBjb2x1bW4gbmFtZXMuIEZvciBDT1BZIEZST00sIHNwZWNpZmllcyB3aGV0aGVyIHRoZQorICBmaXJzdCBsaW5lIGluIHRoZSBDU1YgaW5wdXQgZmlsZSBjb250YWlucyBjb2x1bW4gbmFtZXMuIERlZmF1bHRzIHRvCisgIGBmYWxzZWAuCitgREVDSU1BTFNFUGA6OgorICBUaGUgY2hhcmFjdGVyIHRoYXQgaXMgdXNlZCBhcyB0aGUgZGVjaW1hbCBwb2ludCBzZXBhcmF0b3IuIERlZmF1bHRzIHRvCisgIGAuYC4KK2BUSE9VU0FORFNTRVBgOjoKKyAgVGhlIGNoYXJhY3RlciB0aGF0IGlzIHVzZWQgdG8gc2VwYXJhdGUgdGhvdXNhbmRzLiBEZWZhdWx0cyB0byB0aGUKKyAgZW1wdHkgc3RyaW5nLgorYEJPT0xTVFlsRWA6OgorICBUaGUgc3RyaW5nIGxpdGVyYWwgZm9ybWF0IGZvciBib29sZWFuIHZhbHVlcy4gRGVmYXVsdHMgdG8KKyAgYFRydWUsRmFsc2VgLgorYE5VTVBST0NFU1NFU2A6OgorICBUaGUgbnVtYmVyIG9mIGNoaWxkIHdvcmtlciBwcm9jZXNzZXMgdG8gY3JlYXRlIGZvciBgQ09QWWAgdGFza3MuCisgIERlZmF1bHRzIHRvIDE2IGZvciBgQ09QWWAgdGFza3MuIEhvd2V2ZXIsIGF0IG1vc3QgKG51bV9jb3JlcyAtIDEpCisgIHByb2Nlc3NlcyB3aWxsIGJlIGNyZWF0ZWQuCitgTUFYQVRURU1QVFNgOjoKKyAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGZhaWxlZCBhdHRlbXB0cyB0byBmZXRjaCBhIHJhbmdlIG9mIGRhdGEgKHdoZW4KKyAgdXNpbmcgYENPUFkgVE9gKSBvciBpbnNlcnQgYSBjaHVuayBvZiBkYXRhICh3aGVuIHVzaW5nIGBDT1BZIEZST01gKQorICBiZWZvcmUgZ2l2aW5nIHVwLiBEZWZhdWx0cyB0byA1LgorYFJFUE9SVEZSRVFVRU5DWWA6OgorICBIb3cgb2Z0ZW4gc3RhdHVzIHVwZGF0ZXMgYXJlIHJlZnJlc2hlZCwgaW4gc2Vjb25kcy4gRGVmYXVsdHMgdG8gMC4yNS4KK2BSQVRFRklMRWA6OgorICBBbiBvcHRpb25hbCBmaWxlIHRvIG91dHB1dCByYXRlIHN0YXRpc3RpY3MgdG8uIEJ5IGRlZmF1bHQsIHN0YXRpc3RpY3MKKyAgYXJlIG5vdCBvdXRwdXQgdG8gYSBmaWxlLgorCis9PSBFc2NhcGluZyBRdW90ZXMKKworRGF0ZXMsIElQIGFkZHJlc3NlcywgYW5kIHN0cmluZ3MgbmVlZCB0byBiZSBlbmNsb3NlZCBpbiBzaW5nbGUgcXVvdGF0aW9uIG1hcmtzLiBUbyB1c2UgYSBzaW5nbGUgcXVvdGF0aW9uIG1hcmsgaXRzZWxmIGluIGEgc3RyaW5nIGxpdGVyYWwsIGVzY2FwZSBpdCB1c2luZyBhIHNpbmdsZSBxdW90YXRpb24gbWFyay4KKworV2hlbiBmZXRjaGluZyBzaW1wbGUgdGV4dCBkYXRhLCBgY3Fsc2hgIHdpbGwgcmV0dXJuIGFuIHVucXVvdGVkIHN0cmluZy4gSG93ZXZlciwgd2hlbiBmZXRjaGluZyB0ZXh0IGRhdGEgZnJvbSBjb21wbGV4IHR5cGVzIChjb2xsZWN0aW9ucywgdXNlci1kZWZpbmVkIHR5cGVzLCBldGMuKSBgY3Fsc2hgIHdpbGwgcmV0dXJuIGEgcXVvdGVkIHN0cmluZyBjb250YWluaW5nIHRoZSBlc2NhcGVkIGNoYXJhY3RlcnMuIEZvciBleGFtcGxlOgorCitTaW1wbGUgZGF0YQorW3NvdXJjZSxub25lXQorLS0tLQorY3Fsc2g+IENSRUFURSBUQUJMRSB0ZXN0LnNpbXBsZV9kYXRhIChpZCBpbnQsIGRhdGEgdGV4dCwgUFJJTUFSWSBLRVkgKGlkKSk7CitjcWxzaD4gSU5TRVJUIElOVE8gdGVzdC5zaW1wbGVfZGF0YSAoaWQsIGRhdGEpIHZhbHVlcygxLCAnSScnbSBmaW5lJyk7CitjcWxzaD4gU0VMRUNUIGRhdGEgZnJvbSB0ZXN0LnNpbXBsZV9kYXRhOyBkYXRhCistLS0tLS0tLS0tCisgSSdtIGZpbmUKKy0tLS0KK0NvbXBsZXggZGF0YQorW3NvdXJjZSxub25lXQorLS0tLQorY3Fsc2g+IENSRUFURSBUQUJMRSB0ZXN0LmNvbXBsZXhfZGF0YSAoaWQgaW50LCBkYXRhIG1hcDxpbnQsIHRleHQ+LCBQUklNQVJZIEtFWSAoaWQpKTsKK2NxbHNoPiBJTlNFUlQgSU5UTyB0ZXN0LmNvbXBsZXhfZGF0YSAoaWQsIGRhdGEpIHZhbHVlcygxLCB7MTonSScnbSBmaW5lJ30pOworY3Fsc2g+IFNFTEVDVCBkYXRhIGZyb20gdGVzdC5jb21wbGV4X2RhdGE7IGRhdGEKKy0tLS0tLS0tLS0tLS0tLS0tLQorIHsxOiAnSScnbSBmaW5lJ30KKy0tLS0KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29scy9oYXNoX3Bhc3N3b3JkLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvaGFzaF9wYXNzd29yZC5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvaGFzaF9wYXNzd29yZC5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvaGFzaF9wYXNzd29yZC5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvaW5kZXguYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9pbmRleC5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvaW5kZXguYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL2luZGV4LmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9zc3RhYmxlL2luZGV4LmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9pbmRleC5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNzYzN2MKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9pbmRleC5hZG9jCkBAIC0wLDAgKzEsMjEgQEAKKz0gU1NUYWJsZSBUb29scworCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSB2YXJpb3VzIHNzdGFibGUgdG9vbHMuCisKK0Nhc3NhbmRyYSBtdXN0IGJlIHN0b3BwZWQgYmVmb3JlIHRoZXNlIHRvb2xzIGFyZSBleGVjdXRlZCwgb3IgdW5leHBlY3RlZAorcmVzdWx0cyB3aWxsIG9jY3VyLiBOb3RlOiB0aGUgc2NyaXB0cyBkbyBub3QgdmVyaWZ5IHRoYXQgQ2Fzc2FuZHJhIGlzCitzdG9wcGVkLgorCisqIHhyZWY6dG9vbHMvc3N0YWJsZS9zc3RhYmxlZHVtcC5hZG9jW3NzdGFibGVkdW1wXQorKiB4cmVmOnRvb2xzL3NzdGFibGUvc3N0YWJsZWV4cGlyZWRibG9ja2Vycy5hZG9jW3NzdGFibGVleHBpcmVkYmxvY2tlcnNdCisqIHhyZWY6dG9vbHMvc3N0YWJsZS9zc3RhYmxlbGV2ZWxyZXNldC5hZG9jW3NzdGFibGVsZXZlbHJlc2V0XQorKiB4cmVmOnRvb2xzL3NzdGFibGUvc3N0YWJsZWxvYWRlci5hZG9jW3NzdGFibGVsb2FkZXJdCisqIHhyZWY6dG9vbHMvc3N0YWJsZS9zc3RhYmxlbWV0YWRhdGEuYWRvY1tzc3RhYmxlbWV0YWRhdGFdCisqIHhyZWY6dG9vbHMvc3N0YWJsZS9zc3RhYmxlb2ZmbGluZXJlbGV2ZWwuYWRvY1tzc3RhYmxlb2ZmbGluZXJlbGV2ZWxdCisqIHhyZWY6dG9vbHMvc3N0YWJsZS9zc3RhYmxlcGFydGl0aW9ucy5hZG9jW3NzdGFibGVwYXJ0aXRpb25zXQorKiB4cmVmOnRvb2xzL3NzdGFibGUvc3N0YWJsZXJlcGFpcmVkc2V0LmFkb2Nbc3N0YWJsZXJlcGFpcmRzZXRdCisqIHhyZWY6dG9vbHMvc3N0YWJsZS9zc3RhYmxlc2NydWIuYWRvY1tzc3RhYmxlc2NydWJdCisqIHhyZWY6dG9vbHMvc3N0YWJsZS9zc3RhYmxlc3BsaXQuYWRvY1tzc3RhYmxlc3BsaXRdCisqIHhyZWY6dG9vbHMvc3N0YWJsZS9zc3RhYmxldXBncmFkZS5hZG9jW3NzdGFibGV1cGdyYWRlXQorKiB4cmVmOnRvb2xzL3NzdGFibGUvc3N0YWJsZXV0aWwuYWRvY1tzc3RhYmxldXRpbF0KKyogeHJlZjp0b29scy9zc3RhYmxlL3NzdGFibGV2ZXJpZnkuYWRvY1tzc3RhYmxldmVyaWZ5XQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL3NzdGFibGUvc3N0YWJsZWR1bXAuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9zc3RhYmxlL3NzdGFibGVkdW1wLmFkb2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29scy9zc3RhYmxlL3NzdGFibGVkdW1wLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9zc3RhYmxlL3NzdGFibGVkdW1wLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29scy9zc3RhYmxlL3NzdGFibGVleHBpcmVkYmxvY2tlcnMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9zc3RhYmxlL3NzdGFibGVleHBpcmVkYmxvY2tlcnMuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL3NzdGFibGUvc3N0YWJsZWV4cGlyZWRibG9ja2Vycy5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9zc3RhYmxlZXhwaXJlZGJsb2NrZXJzLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9zc3RhYmxlL3NzdGFibGVsZXZlbHJlc2V0LmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9zc3RhYmxlbGV2ZWxyZXNldC5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YmJmNDIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9zc3RhYmxlbGV2ZWxyZXNldC5hZG9jCkBAIC0wLDAgKzEsNjkgQEAKKz0gc3N0YWJsZWxldmVscmVzZXQKKworSWYgTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneSBpcyBzZXQsIHRoaXMgc2NyaXB0IGNhbiBiZSB1c2VkIHRvIHJlc2V0CitsZXZlbCB0byAwIG9uIGEgZ2l2ZW4gc2V0IG9mIHNzdGFibGVzLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0bywKK2ZvciBleGFtcGxlLCBjaGFuZ2UgdGhlIG1pbmltdW0gc3N0YWJsZSBzaXplLCBhbmQgdGhlcmVmb3JlIHJlc3RhcnQgdGhlCitjb21wYWN0aW9uIHByb2Nlc3MgdXNpbmcgdGhpcyBuZXcgY29uZmlndXJhdGlvbi4KKworU2VlCitodHRwczovL2Nhc3NhbmRyYS5hcGFjaGUub3JnL2RvYy9sYXRlc3Qvb3BlcmF0aW5nL2NvbXBhY3Rpb24vbGNzLmh0bWwjbGNzCitmb3IgaW5mb3JtYXRpb24gb24gaG93IGxldmVscyBhcmUgdXNlZCBpbiB0aGlzIGNvbXBhY3Rpb24gc3RyYXRlZ3kuCisKK0Nhc3NhbmRyYSBtdXN0IGJlIHN0b3BwZWQgYmVmb3JlIHRoaXMgdG9vbCBpcyBleGVjdXRlZCwgb3IgdW5leHBlY3RlZAorcmVzdWx0cyB3aWxsIG9jY3VyLiBOb3RlOiB0aGUgc2NyaXB0IGRvZXMgbm90IHZlcmlmeSB0aGF0IENhc3NhbmRyYSBpcworc3RvcHBlZC4KKworcmVmOiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS01MjcxCisKKz09IFVzYWdlCisKK3NzdGFibGVsZXZlbHJlc2V0IC0tcmVhbGx5LXJlc2V0IDxrZXlzcGFjZT4gPHRhYmxlPgorCitUaGUgcmVhbGx5LXJlc2V0IGZsYWcgaXMgcmVxdWlyZWQsIHRvIGVuc3VyZSB0aGlzIGludHJ1c2l2ZSBjb21tYW5kIGlzCitub3QgcnVuIGFjY2lkZW50YWxseS4KKworPT0gVGFibGUgbm90IGZvdW5kCisKK0lmIHRoZSBrZXlzcGFjZSBhbmQvb3IgdGFibGUgaXMgbm90IGluIHRoZSBzY2hlbWEgKGUuZy4sIGlmIHlvdQorbWlzc3BlbGxlZCB0aGUgdGFibGUgbmFtZSksIHRoZSBzY3JpcHQgd2lsbCByZXR1cm4gYW4gZXJyb3IuCisKK0V4YW1wbGU6CisKKy4uLi4KK0NvbHVtbkZhbWlseSBub3QgZm91bmQ6IGtleXNwYWNlL2V2ZW5sb2cuCisuLi4uCisKKz09IFRhYmxlIGhhcyBubyBzc3RhYmxlcworCitFeGFtcGxlOgorCisuLi4uCitGb3VuZCBubyBzc3RhYmxlcywgZGlkIHlvdSBnaXZlIHRoZSBjb3JyZWN0IGtleXNwYWNlL3RhYmxlPworLi4uLgorCis9PSBUYWJsZSBhbHJlYWR5IGF0IGxldmVsIDAKKworVGhlIHNjcmlwdCB3aWxsIG5vdCBzZXQgdGhlIGxldmVsIGlmIGl0IGlzIGFscmVhZHkgc2V0IHRvIDAuCisKK0V4YW1wbGU6CisKKy4uLi4KK1NraXBwZWQgL3Zhci9saWIvY2Fzc2FuZHJhL2RhdGEva2V5c3BhY2UvZXZlbnRsb2ctNjVjNDI5ZTA4YzVhMTFlODkzOWVkZjRmNDAzOTc5ZWYvbWMtMS1iaWctRGF0YS5kYiBzaW5jZSBpdCBpcyBhbHJlYWR5IG9uIGxldmVsIDAKKy4uLi4KKworPT0gVGFibGUgbGV2ZWxzIHJlZHVjZWQgdG8gMAorCitJZiB0aGUgbGV2ZWwgaXMgbm90IGFscmVhZHkgMCwgdGhlbiB0aGlzIHdpbGwgcmVzZXQgaXQgdG8gMC4KKworRXhhbXBsZToKKworLi4uLgorc3N0YWJsZW1ldGFkYXRhIC92YXIvbGliL2Nhc3NhbmRyYS9kYXRhL2tleXNwYWNlL2V2ZW50bG9nLTYzNjUzMzIwOTRkZDExZTg4ZjMyNGY5YzUwM2U0NzUzL21jLTgtYmlnLURhdGEuZGIgfCBncmVwIC1pIGxldmVsCitTU1RhYmxlIExldmVsOiAxCisKK3NzdGFibGVsZXZlbHJlc2V0IC0tcmVhbGx5LXJlc2V0IGtleXNwYWNlIGV2ZW50bG9nCitDaGFuZ2luZyBsZXZlbCBmcm9tIDEgdG8gMCBvbiAvdmFyL2xpYi9jYXNzYW5kcmEvZGF0YS9rZXlzcGFjZS9ldmVudGxvZy02MzY1MzMyMDk0ZGQxMWU4OGYzMjRmOWM1MDNlNDc1My9tYy04LWJpZy1EYXRhLmRiCisKK3NzdGFibGVtZXRhZGF0YSAvdmFyL2xpYi9jYXNzYW5kcmEvZGF0YS9rZXlzcGFjZS9ldmVudGxvZy02MzY1MzMyMDk0ZGQxMWU4OGYzMjRmOWM1MDNlNDc1My9tYy04LWJpZy1EYXRhLmRiIHwgZ3JlcCAtaSBsZXZlbAorU1NUYWJsZSBMZXZlbDogMAorLi4uLgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL3NzdGFibGUvc3N0YWJsZWxvYWRlci5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL3NzdGFibGUvc3N0YWJsZWxvYWRlci5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvc3N0YWJsZS9zc3RhYmxlbG9hZGVyLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9zc3RhYmxlL3NzdGFibGVsb2FkZXIuYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL3NzdGFibGUvc3N0YWJsZW1ldGFkYXRhLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9zc3RhYmxlbWV0YWRhdGEuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL3NzdGFibGUvc3N0YWJsZW1ldGFkYXRhLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9zc3RhYmxlL3NzdGFibGVtZXRhZGF0YS5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvc3N0YWJsZS9zc3RhYmxlb2ZmbGluZXJlbGV2ZWwuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9zc3RhYmxlL3NzdGFibGVvZmZsaW5lcmVsZXZlbC5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvc3N0YWJsZS9zc3RhYmxlb2ZmbGluZXJlbGV2ZWwuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL3NzdGFibGUvc3N0YWJsZW9mZmxpbmVyZWxldmVsLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9zc3RhYmxlL3NzdGFibGVwYXJ0aXRpb25zLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9zc3RhYmxlcGFydGl0aW9ucy5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ODQ5NDYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9zc3RhYmxlcGFydGl0aW9ucy5hZG9jCkBAIC0wLDAgKzEsMTcxIEBACis9IHNzdGFibGVwYXJ0aXRpb25zCisKK0lkZW50aWZpZXMgbGFyZ2UgcGFydGl0aW9ucyBvZiBTU1RhYmxlcyBhbmQgb3V0cHV0cyB0aGUgcGFydGl0aW9uIHNpemUgaW4gYnl0ZXMsIHJvdyBjb3VudCwgY2VsbCBjb3VudCwgYW5kIHRvbWJzdG9uZSBjb3VudC4KKworWW91IGNhbiBzdXBwbHkgYW55IG51bWJlciBvZiBzc3RhYmxlcyBmaWxlIHBhdGhzLCBvciBkaXJlY3RvcmllcyBjb250YWluaW5nIHNzdGFibGVzLiBFYWNoIHNzdGFibGUgd2lsbCBiZSBhbmFseXplZCBzZXBhcmF0ZWx5LgorCitJZiBhIG1ldHJpY3MgdGhyZXNob2xkIHN1Y2ggYXMgYC0tbWluLXNpemVgLCBgLS1taW4tcm93c2AsIGAtLW1pbi1jZWxsc2Agb3IgYC0tbWluLXRvbWJzdG9uZXNgIGlzIHByb3ZpZGVkLAordGhlbiB0aGUgcGFydGl0aW9uIGtleXMgZXhjZWVkaW5nIG9mIHRoZSB0aHJlc2hvbGQgd2lsbCBiZSBwcmludGVkIGluIHRoZSBvdXRwdXQuCitJdCBhbHNvIHByaW50cyBhIHN1bW1hcnkgb2YgbWV0cmljcyBmb3IgdGhlIHRhYmxlLiBUaGUgcGVyY2VudGlsZXMgaW4gdGhlIG1ldHJpY3MgYXJlIGVzdGltYXRlcywKK3doaWxlIHRoZSBtaW4vbWF4L2NvdW50IG1ldHJpY3MgYXJlIGFjY3VyYXRlLgorCitUaGUgZGVmYXVsdCBvdXRwdXQgb2YgdGhpcyB0b29sIGlzIG1lYW50IHRvIGJlIHJlYWQgYnkgaHVtYW4gZXllcy4KK0Z1dHVyZSB2ZXJzaW9ucyBtaWdodCBpbmNsdWRlIHNtYWxsIGZvcm1hdHRpbmcgY2hhbmdlcyBvciBwcmVzZW50IG5ldyBkYXRhIHRoYXQgY2FuIGZvb2wgc2NyaXB0cyByZWFkaW5nIGl0LgorU2NyaXB0cyBvciBvdGhlciBhdXRvbWF0aWMgdG9vbHMgc2hvdWxkIHVzZSB0aGUgYC0tY3N2YCBmbGFnIHRvIHByb2R1Y2UgbWFjaGluZS1yZWFkYWJsZSBvdXRwdXQuCitGdXR1cmUgdmVyc2lvbnMgd2lsbCBub3QgY2hhbmdlIHRoZSBmb3JtYXQgb2YgdGhlIENTViBvdXRwdXQgZXhjZXB0IGZvciBtYXliZSBhZGRpbmcgbmV3IGNvbHVtbnMsCitzbyBhIHByb3BlciBDU1YgcGFyc2VyIGNvbnN1bWluZyB0aGUgb3V0cHV0IHNob3VsZCBrZWVwIHdvcmtpbmcuCisKK0Nhc3NhbmRyYSBkb2Vzbid0IG5lZWQgdG8gYmUgcnVubmluZyBiZWZvcmUgdGhpcyB0b29sIGlzIGV4ZWN1dGVkLgorCis9PSBVc2FnZQorCitzc3RhYmxlcGFydGl0aW9ucyA8b3B0aW9ucz4gPHNzdGFibGUgZmlsZXMgb3IgZGlyZWN0b3JpZXM+CisKK1tjb2xzPSIsIixdCit8PT09Cit8LXQsIC0tbWluLXNpemUgPGFyZz4gICAgICAgICAgICB8UGFydGl0aW9uIHNpemUgdGhyZXNob2xkLCBleHByZXNzZWQgYXMgZWl0aGVyIHRoZSBudW1iZXIgb2YgYnl0ZXMgb3IgYSBzaXplIHdpdGggdW5pdCBvZiB0aGUgZm9ybSAxMEtpQiwgMjBNaUIsIDMwR2lCLCBldGMuCit8LXcsIC0tbWluLXJvd3MgPGFyZz4gICAgICAgICAgICB8UGFydGl0aW9uIHJvdyBjb3VudCB0aHJlc2hvbGQuCit8LWMsIC0tbWluLWNlbGxzIDxhcmc+ICAgICAgICAgICB8UGFydGl0aW9uIGNlbGwgY291bnQgdGhyZXNob2xkCit8LW8sIC0tbWluLXRvbWJzdG9uZXMgPGFyZz4gICAgICB8UGFydGl0aW9uIHRvbWJzdG9uZSBjb3VudCB0aHJlc2hvbGQuCit8LWssIC0ta2V5IDxhcmc+ICAgICAgICAgICAgICAgICB8UGFydGl0aW9uIGtleXMgdG8gaW5jbHVkZSwgaW5zdGVhZCBvZiBzY2FubmluZyBhbGwgcGFydGl0aW9ucy4KK3wteCwgLS1leGNsdWRlLWtleSA8YXJnPiAgICAgICAgIHxQYXJ0aXRpb24ga2V5cyB0byBleGNsdWRlLgorfC1yLCAtLXJlY3Vyc2l2ZSAgICAgICAgICAgICAgICAgfFNjYW4gZm9yIHNzdGFibGVzIHJlY3Vyc2l2ZWx5Cit8LWIsIC0tYmFja3VwcyAgICAgICAgICAgICAgICAgICB8SW5jbHVkZSBiYWNrdXBzIHByZXNlbnQgaW4gZGF0YSBkaXJlY3RvcmllcyB3aGVuIHNjYW5uaW5nIGRpcmVjdG9yaWVzCit8LXMsIC0tc25hcGhzb3RzICAgICAgICAgICAgICAgICB8SW5jbHVkZSBzbmFwc2hvdHMgcHJlc2VudCBpbiBkYXRhIGRpcmVjdG9yaWVzIHdoZW4gc2Nhbm5pbmcgZGlyZWN0b3JpZXMKK3wtdSwgLS1jdXJyZW50LXRpbWVzdGFtcCA8YXJnPiAgIHxUaW1lc3RhbXAgKHNlY29uZHMgc2luY2UgZXBvY2gsIHVuaXQgdGltZSkgZm9yIFRUTCBleHBpcmVkIGNhbGN1bGF0aW9uLgorfC15LCAtLXBhcnRpdGlvbnMtb25seSAgICAgICAgICAgfE9ubHkgYnJpZWYgcGFydGl0aW9uIGluZm9ybWF0aW9uLiBFeGNsdWRlIHBlci1wYXJ0aXRpb24gZGV0YWlsZWQgcm93L2NlbGwvdG9tYnN0b25lIGluZm9ybWF0aW9uIGZyb20gcHJvY2VzcyBhbmQgb3V0cHV0LgorfC1tLCAtLWNzdiAgICAgICAgICAgICAgICAgICAgICAgfFByb2R1Y2VkIENTViBvdXRwdXQgKG1hY2hpbmUgcmVhZGFibGUpCit8PT09CisKKz09IEV4YW1wbGVzCisKKz09PSBBbmFseXplIHBhcnRpdGlvbiBzdGF0aXN0aWNzIGZvciBhIHNpbmdsZSBTU1RhYmxlCisKK1VzZSB0aGUgcGF0aCB0byB0aGUgU1NUYWJsZSBmaWxlIGFzIHRoZSBvbmx5IGFyZ3VtZW50LgorCitFeGFtcGxlOgorCisuLi4uCitzc3RhYmxlcGFydGl0aW9ucyBkYXRhL2RhdGEvay90LWQ3YmU1ZTkwZTkwMTExZWQ4YjU0ZWZlM2MzOWNiMGJiL25jLTgtYmlnLURhdGEuZGIKKworUHJvY2Vzc2luZyBrLnQtZDdiZTVlOTBlOTAxMTFlZDhiNTRlZmUzYzM5Y2IwYmIgIzggKGJpZy1uYykgKDEuMzY4IEdpQiB1bmNvbXByZXNzZWQsIDUzNC45NzkgTWlCIG9uIGRpc2spCisgICAgICAgICAgICAgICBQYXJ0aXRpb24gc2l6ZSAgICAgICAgICAgIFJvdyBjb3VudCAgICAgICAgICAgQ2VsbCBjb3VudCAgICAgIFRvbWJzdG9uZSBjb3VudAorICB+cDUwICAgICAgICAgICAgNzY3LjUxOSBLaUIgICAgICAgICAgICAgICAgICA3NzAgICAgICAgICAgICAgICAgIDE5MTYgICAgICAgICAgICAgICAgICAgIDAKKyAgfnA3NSAgICAgICAgICAgICAgMi4yMzggTWlCICAgICAgICAgICAgICAgICAyMjk5ICAgICAgICAgICAgICAgICA1NzIyICAgICAgICAgICAgICAgICAgICAwCisgIH5wOTAgICAgICAgICAgICAgIDMuODY3IE1pQiAgICAgICAgICAgICAgICAgMzMxMSAgICAgICAgICAgICAgICAgOTg4NyAgICAgICAgICAgICAgICAgICA1MAorICB+cDk1ICAgICAgICAgICAgIDE2LjYyOSBNaUIgICAgICAgICAgICAgICAgMTQyMzcgICAgICAgICAgICAgICAgNDI1MTAgICAgICAgICAgICAgICAgICA0NDYKKyAgfnA5OSAgICAgICAgICAgIDE0OC4yNjcgTWlCICAgICAgICAgICAgICAgMTI2OTM0ICAgICAgICAgICAgICAgMzc5MDIyICAgICAgICAgICAgICAgICAxMzMxCisgIH5wOTk5ICAgICAgICAgICAzNjguOTM2IE1pQiAgICAgICAgICAgICAgIDMxNTg1MiAgICAgICAgICAgICAgIDk0MzEyNyAgICAgICAgICAgICAgICAgMjc1OQorICBtaW4gICAgICAgICAgICAgIDU2Ljg1NCBLaUIgICAgICAgICAgICAgICAgICAxMDAgICAgICAgICAgICAgICAgICAxNTAgICAgICAgICAgICAgICAgICAgIDAKKyAgbWF4ICAgICAgICAgICAgIDM1Ni4wNjcgTWlCICAgICAgICAgICAgICAgMzEwNzA2ICAgICAgICAgICAgICAgOTMyMTE4ICAgICAgICAgICAgICAgICAyNDUwCisgIGNvdW50ICAgICAgICAgICAgICAgICAgIDIxMAorLi4uLgorCis9PT0gQW5hbHl6ZSBwYXJ0aXRpb24gc3RhdGlzdGljcyBmb3IgYWxsIFNTVGFibGVzIGluIGEgZGlyZWN0b3J5CisKK1VzZSB0aGUgcGF0aCB0byB0aGUgU1NUYWJsZXMgZGlyZWN0b3J5IGFzIHRoZSBvbmx5IGFyZ3VtZW50LgorCitFeGFtcGxlOgorCisuLi4uCitzc3RhYmxlcGFydGl0aW9ucyBkYXRhL2RhdGEvay90LWQ3YmU1ZTkwZTkwMTExZWQ4YjU0ZWZlM2MzOWNiMGJiCisKK1Byb2Nlc3Npbmcgay50LWQ3YmU1ZTkwZTkwMTExZWQ4YjU0ZWZlM2MzOWNiMGJiICM4IChiaWctbmMpICgxLjM2OCBHaUIgdW5jb21wcmVzc2VkLCA1MzQuOTc5IE1pQiBvbiBkaXNrKQorICAgICAgICAgICAgICAgUGFydGl0aW9uIHNpemUgICAgICAgICAgICBSb3cgY291bnQgICAgICAgICAgIENlbGwgY291bnQgICAgICBUb21ic3RvbmUgY291bnQKKyAgfnA1MCAgICAgICAgICAgIDc2Ny41MTkgS2lCICAgICAgICAgICAgICAgICAgNzcwICAgICAgICAgICAgICAgICAxOTE2ICAgICAgICAgICAgICAgICAgICAwCisgIH5wNzUgICAgICAgICAgICAgIDIuMjM4IE1pQiAgICAgICAgICAgICAgICAgMjI5OSAgICAgICAgICAgICAgICAgNTcyMiAgICAgICAgICAgICAgICAgICAgMAorICB+cDkwICAgICAgICAgICAgICAzLjg2NyBNaUIgICAgICAgICAgICAgICAgIDMzMTEgICAgICAgICAgICAgICAgIDk4ODcgICAgICAgICAgICAgICAgICAgNTAKKyAgfnA5NSAgICAgICAgICAgICAxNi42MjkgTWlCICAgICAgICAgICAgICAgIDE0MjM3ICAgICAgICAgICAgICAgIDQyNTEwICAgICAgICAgICAgICAgICAgNDQ2CisgIH5wOTkgICAgICAgICAgICAxNDguMjY3IE1pQiAgICAgICAgICAgICAgIDEyNjkzNCAgICAgICAgICAgICAgIDM3OTAyMiAgICAgICAgICAgICAgICAgMTMzMQorICB+cDk5OSAgICAgICAgICAgMzY4LjkzNiBNaUIgICAgICAgICAgICAgICAzMTU4NTIgICAgICAgICAgICAgICA5NDMxMjcgICAgICAgICAgICAgICAgIDI3NTkKKyAgbWluICAgICAgICAgICAgICA1Ni44NTQgS2lCICAgICAgICAgICAgICAgICAgMTAwICAgICAgICAgICAgICAgICAgMTUwICAgICAgICAgICAgICAgICAgICAwCisgIG1heCAgICAgICAgICAgICAzNTYuMDY3IE1pQiAgICAgICAgICAgICAgIDMxMDcwNiAgICAgICAgICAgICAgIDkzMjExOCAgICAgICAgICAgICAgICAgMjQ1MAorICBjb3VudCAgICAgICAgICAgICAgICAgICAyMTAKKworUHJvY2Vzc2luZyBrLnQtZDdiZTVlOTBlOTAxMTFlZDhiNTRlZmUzYzM5Y2IwYmIgIzkgKGJpZy1uYykgKDQ1Ny41NDAgTWlCIHVuY29tcHJlc3NlZCwgMTc0Ljg4MCBNaUIgb24gZGlzaykKKyAgICAgICAgICAgICAgIFBhcnRpdGlvbiBzaXplICAgICAgICAgICAgUm93IGNvdW50ICAgICAgICAgICBDZWxsIGNvdW50ICAgICAgVG9tYnN0b25lIGNvdW50CisgIH5wNTAgICAgICAgICAgICAgIDEuODY1IE1pQiAgICAgICAgICAgICAgICAgMTU5NyAgICAgICAgICAgICAgICAgNDc2OCAgICAgICAgICAgICAgICAgICAgMAorICB+cDc1ICAgICAgICAgICAgIDEzLjg1OCBNaUIgICAgICAgICAgICAgICAgMTQyMzcgICAgICAgICAgICAgICAgNDI1MTAgICAgICAgICAgICAgICAgICAgIDAKKyAgfnA5MCAgICAgICAgICAgICAyOC43MzUgTWlCICAgICAgICAgICAgICAgIDI5NTIxICAgICAgICAgICAgICAgIDczNDU3ICAgICAgICAgICAgICAgICAgIDUwCisgIH5wOTUgICAgICAgICAgICAgMzQuNDgyIE1pQiAgICAgICAgICAgICAgICAyOTUyMSAgICAgICAgICAgICAgICA4ODE0OCAgICAgICAgICAgICAgICAgODIzOQorICB+cDk5ICAgICAgICAgICAgIDQ5LjY1NCBNaUIgICAgICAgICAgICAgICAgNDI1MTAgICAgICAgICAgICAgICAxMjY5MzQgICAgICAgICAgICAgICAgMTQyMzcKKyAgfnA5OTkgICAgICAgICAgICA0OS42NTQgTWlCICAgICAgICAgICAgICAgIDQyNTEwICAgICAgICAgICAgICAgMTI2OTM0ICAgICAgICAgICAgICAgIDE0MjM3CisgIG1pbiAgICAgICAgICAgICAgNDcuMjcyIEtpQiAgICAgICAgICAgICAgICAgIDEwMCAgICAgICAgICAgICAgICAgIDE1MCAgICAgICAgICAgICAgICAgICAgMAorICBtYXggICAgICAgICAgICAgIDQ1LjEzMyBNaUIgICAgICAgICAgICAgICAgMzk0MjkgICAgICAgICAgICAgICAxMTgyODcgICAgICAgICAgICAgICAgMTMwMzAKKyAgY291bnQgICAgICAgICAgICAgICAgICAgIDU3CisuLi4uCisKKz09PSBPdXRwdXQgb25seSBwYXJ0aXRpb25zIG92ZXIgMTAwTWlCIGluIHNpemUKKworVXNlIHRoZSBgLS1taW4tc2l6ZWAgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIG1pbmltdW0gc2l6ZSBhIHBhcnRpdGlvbiBtdXN0IGhhdmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dC4KKworRXhhbXBsZToKKworLi4uLgorc3N0YWJsZXBhcnRpdGlvbnMgZGF0YS9kYXRhL2svdC1kN2JlNWU5MGU5MDExMWVkOGI1NGVmZTNjMzljYjBiYi9uYy04LWJpZy1EYXRhLmRiIC0tbWluLXNpemUgMTAwTWlCCisKK1Byb2Nlc3Npbmcgay50LWQ3YmU1ZTkwZTkwMTExZWQ4YjU0ZWZlM2MzOWNiMGJiICM4IChiaWctbmMpICgxLjM2OCBHaUIgdW5jb21wcmVzc2VkLCA1MzQuOTc5IE1pQiBvbiBkaXNrKQorICBQYXJ0aXRpb246ICcxMycgKDAwMDAwMDBkKSBsaXZlLCBzaXplOiAxMDUuMDU2IE1pQiwgcm93czogOTE0OTAsIGNlbGxzOiAyNzQ0NzAsIHRvbWJzdG9uZXM6IDUwIChyb3c6NTAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MCkKKyAgUGFydGl0aW9uOiAnMScgKDAwMDAwMDAxKSBsaXZlLCBzaXplOiAxMjcuMjQxIE1pQiwgcm93czogMTExMDY1LCBjZWxsczogMzMzMTk1LCB0b21ic3RvbmVzOiA1MCAocm93OjUwLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApCisgIFBhcnRpdGlvbjogJzgnICgwMDAwMDAwOCkgbGl2ZSwgc2l6ZTogMzU2LjA2NyBNaUIsIHJvd3M6IDMxMDcwNiwgY2VsbHM6IDkzMjExOCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MCkKKyAgUGFydGl0aW9uOiAnMicgKDAwMDAwMDAyKSBsaXZlLCBzaXplOiAyMTMuMzQxIE1pQiwgcm93czogMTg2NTgyLCBjZWxsczogNTU5MTI1LCB0b21ic3RvbmVzOiA5NzggKHJvdzo5NzgsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MCkKK1N1bW1hcnkgb2Ygay50LWQ3YmU1ZTkwZTkwMTExZWQ4YjU0ZWZlM2MzOWNiMGJiICM4IChiaWctbmMpOgorICBGaWxlOiAvVXNlcnMvYWRlbGFwZW5hL3NyYy9jYXNzYW5kcmEvdHJ1bmsvZGF0YS9kYXRhL2svdC1kN2JlNWU5MGU5MDExMWVkOGI1NGVmZTNjMzljYjBiYi9uYy04LWJpZy1EYXRhLmRiCisgIDQgcGFydGl0aW9ucyBtYXRjaAorICBLZXlzOiAxMyAxIDggMgorICAgICAgICAgICAgICAgUGFydGl0aW9uIHNpemUgICAgICAgICAgICBSb3cgY291bnQgICAgICAgICAgIENlbGwgY291bnQgICAgICBUb21ic3RvbmUgY291bnQKKyAgfnA1MCAgICAgICAgICAgIDc2Ny41MTkgS2lCICAgICAgICAgICAgICAgICAgNzcwICAgICAgICAgICAgICAgICAxOTE2ICAgICAgICAgICAgICAgICAgICAwCisgIH5wNzUgICAgICAgICAgICAgIDIuMjM4IE1pQiAgICAgICAgICAgICAgICAgMjI5OSAgICAgICAgICAgICAgICAgNTcyMiAgICAgICAgICAgICAgICAgICAgMAorICB+cDkwICAgICAgICAgICAgICAzLjg2NyBNaUIgICAgICAgICAgICAgICAgIDMzMTEgICAgICAgICAgICAgICAgIDk4ODcgICAgICAgICAgICAgICAgICAgNTAKKyAgfnA5NSAgICAgICAgICAgICAxNi42MjkgTWlCICAgICAgICAgICAgICAgIDE0MjM3ICAgICAgICAgICAgICAgIDQyNTEwICAgICAgICAgICAgICAgICAgNDQ2CisgIH5wOTkgICAgICAgICAgICAxNDguMjY3IE1pQiAgICAgICAgICAgICAgIDEyNjkzNCAgICAgICAgICAgICAgIDM3OTAyMiAgICAgICAgICAgICAgICAgMTMzMQorICB+cDk5OSAgICAgICAgICAgMzY4LjkzNiBNaUIgICAgICAgICAgICAgICAzMTU4NTIgICAgICAgICAgICAgICA5NDMxMjcgICAgICAgICAgICAgICAgIDI3NTkKKyAgbWluICAgICAgICAgICAgICA1Ni44NTQgS2lCICAgICAgICAgICAgICAgICAgMTAwICAgICAgICAgICAgICAgICAgMTUwICAgICAgICAgICAgICAgICAgICAwCisgIG1heCAgICAgICAgICAgICAzNTYuMDY3IE1pQiAgICAgICAgICAgICAgIDMxMDcwNiAgICAgICAgICAgICAgIDkzMjExOCAgICAgICAgICAgICAgICAgMjQ1MAorICBjb3VudCAgICAgICAgICAgICAgICAgICAyMTAKKy4uLi4KKworPT09IE91dHB1dCBvbmx5IHBhcnRpdGlvbnMgd2l0aCBtb3JlIHRoYW4gMTAwMCB0b21ic3RvbmVzCisKK1VzZSB0aGUgYC0tbWluLXRvbWJzdG9uZXNgIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBtaW5pbXVtIG51bWJlciBvZiB0b21ic3RvbmVzIGEgcGFydGl0aW9uIG11c3QgaGF2ZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0LgorCitFeGFtcGxlOgorCisuLi4uCitzc3RhYmxlcGFydGl0aW9ucyBkYXRhL2RhdGEvay90LWQ3YmU1ZTkwZTkwMTExZWQ4YjU0ZWZlM2MzOWNiMGJiL25jLTgtYmlnLURhdGEuZGIgLS1taW4tdG9tYnN0b25lcyAxMDAwCisKK1Byb2Nlc3Npbmcgay50LWQ3YmU1ZTkwZTkwMTExZWQ4YjU0ZWZlM2MzOWNiMGJiICM4IChiaWctbmMpICgxLjM2OCBHaUIgdW5jb21wcmVzc2VkLCA1MzQuOTc5IE1pQiBvbiBkaXNrKQorICBQYXJ0aXRpb246ICc1NScgKDAwMDAwMDM3KSBsaXZlLCBzaXplOiAxLjI5MCBNaUIsIHJvd3M6IDIzMTcsIGNlbGxzOiAzNDc0LCB0b21ic3RvbmVzOiAxMTU5IChyb3c6MTE1OSwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKQorICBQYXJ0aXRpb246ICcyOCcgKDAwMDAwMDFjKSBsaXZlLCBzaXplOiAxLjE5OCBNaUIsIHJvd3M6IDIwOTksIGNlbGxzOiAzMTQ3LCB0b21ic3RvbmVzOiAxMDUwIChyb3c6MTA1MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKQorICBQYXJ0aXRpb246ICc4OScgKDAwMDAwMDU5KSBsaXZlLCBzaXplOiAxLjM0NiBNaUIsIHJvd3M6IDIyMjYsIGNlbGxzOiAzMzM5LCB0b21ic3RvbmVzOiAxMTEzIChyb3c6MTExMywgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKQorICBQYXJ0aXRpb246ICcyMScgKDAwMDAwMDE1KSBsaXZlLCBzaXplOiAzLjg1MyBNaUIsIHJvd3M6IDQ5MDAsIGNlbGxzOiA5OTI3LCB0b21ic3RvbmVzOiAyNDUwIChyb3c6MjQ1MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKQorU3VtbWFyeSBvZiBrLnQtZDdiZTVlOTBlOTAxMTFlZDhiNTRlZmUzYzM5Y2IwYmIgIzggKGJpZy1uYyk6CisgIEZpbGU6IC9Vc2Vycy9hZGVsYXBlbmEvc3JjL2Nhc3NhbmRyYS90cnVuay9kYXRhL2RhdGEvay90LWQ3YmU1ZTkwZTkwMTExZWQ4YjU0ZWZlM2MzOWNiMGJiL25jLTgtYmlnLURhdGEuZGIKKyAgNCBwYXJ0aXRpb25zIG1hdGNoCisgIEtleXM6IDU1IDI4IDg5IDIxCisgICAgICAgICAgICAgICBQYXJ0aXRpb24gc2l6ZSAgICAgICAgICAgIFJvdyBjb3VudCAgICAgICAgICAgQ2VsbCBjb3VudCAgICAgIFRvbWJzdG9uZSBjb3VudAorICB+cDUwICAgICAgICAgICAgNzY3LjUxOSBLaUIgICAgICAgICAgICAgICAgICA3NzAgICAgICAgICAgICAgICAgIDE5MTYgICAgICAgICAgICAgICAgICAgIDAKKyAgfnA3NSAgICAgICAgICAgICAgMi4yMzggTWlCICAgICAgICAgICAgICAgICAyMjk5ICAgICAgICAgICAgICAgICA1NzIyICAgICAgICAgICAgICAgICAgICAwCisgIH5wOTAgICAgICAgICAgICAgIDMuODY3IE1pQiAgICAgICAgICAgICAgICAgMzMxMSAgICAgICAgICAgICAgICAgOTg4NyAgICAgICAgICAgICAgICAgICA1MAorICB+cDk1ICAgICAgICAgICAgIDE2LjYyOSBNaUIgICAgICAgICAgICAgICAgMTQyMzcgICAgICAgICAgICAgICAgNDI1MTAgICAgICAgICAgICAgICAgICA0NDYKKyAgfnA5OSAgICAgICAgICAgIDE0OC4yNjcgTWlCICAgICAgICAgICAgICAgMTI2OTM0ICAgICAgICAgICAgICAgMzc5MDIyICAgICAgICAgICAgICAgICAxMzMxCisgIH5wOTk5ICAgICAgICAgICAzNjguOTM2IE1pQiAgICAgICAgICAgICAgIDMxNTg1MiAgICAgICAgICAgICAgIDk0MzEyNyAgICAgICAgICAgICAgICAgMjc1OQorICBtaW4gICAgICAgICAgICAgIDU2Ljg1NCBLaUIgICAgICAgICAgICAgICAgICAxMDAgICAgICAgICAgICAgICAgICAxNTAgICAgICAgICAgICAgICAgICAgIDAKKyAgbWF4ICAgICAgICAgICAgIDM1Ni4wNjcgTWlCICAgICAgICAgICAgICAgMzEwNzA2ICAgICAgICAgICAgICAgOTMyMTE4ICAgICAgICAgICAgICAgICAyNDUwCisgIGNvdW50ICAgICAgICAgICAgICAgICAgIDIxMAorLi4uLgorCis9PT0gT3V0cHV0IENTViBtYWNoaW5lLXJlYWRhYmxlIG91dHB1dAorCitVc2UgdGhlIGAtLWNzdmAgb3B0aW9uIHRvIG91dHB1dCBhIENTViBtYWNoaW5lLXJlYWRhYmxlIG91dHB1dCwgY29tYmluZWQgd2l0aCBhbnkgdGhyZXNob2xkIHZhbHVlLgorCitFeGFtcGxlOgorCisuLi4uCitzc3RhYmxlcGFydGl0aW9ucyBkYXRhL2RhdGEvay90LWQ3YmU1ZTkwZTkwMTExZWQ4YjU0ZWZlM2MzOWNiMGJiL25jLTgtYmlnLURhdGEuZGIgLS1taW4tc2l6ZSAxMDBNaUIgLS1jc3YKK2tleSxrZXlCaW5hcnksbGl2ZSxvZmZzZXQsc2l6ZSxyb3dDb3VudCxjZWxsQ291bnQsdG9tYnN0b25lQ291bnQscm93VG9tYnN0b25lQ291bnQscmFuZ2VUb21ic3RvbmVDb3VudCxjb21wbGV4VG9tYnN0b25lQ291bnQsY2VsbFRvbWJzdG9uZUNvdW50LHJvd1R0bEV4cGlyZWQsY2VsbFR0bEV4cGlyZWQsZGlyZWN0b3J5LGtleXNwYWNlLHRhYmxlLGluZGV4LHNuYXBzaG90LGJhY2t1cCxnZW5lcmF0aW9uLGZvcm1hdCx2ZXJzaW9uCisiMTMiLDAwMDAwMDBkLHRydWUsMTg2NDAzNTQzLDExMDE1ODk2NSw5MTQ5MCwyNzQ0NzAsNTAsNTAsMCwwLDAsMCwwLC9Vc2Vycy9hZGVsYXBlbmEvc3JjL2Nhc3NhbmRyYS90cnVuay9kYXRhL2RhdGEvay90LWQ3YmU1ZTkwZTkwMTExZWQ4YjU0ZWZlM2MzOWNiMGJiL25jLTgtYmlnLURhdGEuZGIsayx0LCwsLDgsYmlnLG5jCisiMSIsMDAwMDAwMDEsdHJ1ZSwzMjUxNDE1NDIsMTMzNDIyMTgzLDExMTA2NSwzMzMxOTUsNTAsNTAsMCwwLDAsMCwwLC9Vc2Vycy9hZGVsYXBlbmEvc3JjL2Nhc3NhbmRyYS90cnVuay9kYXRhL2RhdGEvay90LWQ3YmU1ZTkwZTkwMTExZWQ4YjU0ZWZlM2MzOWNiMGJiL25jLTgtYmlnLURhdGEuZGIsayx0LCwsLDgsYmlnLG5jCisiOCIsMDAwMDAwMDgsdHJ1ZSw0NzcxMzM3NTIsMzczMzYyODE5LDMxMDcwNiw5MzIxMTgsMCwwLDAsMCwwLDAsMCwvVXNlcnMvYWRlbGFwZW5hL3NyYy9jYXNzYW5kcmEvdHJ1bmsvZGF0YS9kYXRhL2svdC1kN2JlNWU5MGU5MDExMWVkOGI1NGVmZTNjMzljYjBiYi9uYy04LWJpZy1EYXRhLmRiLGssdCwsLCw4LGJpZyxuYworIjIiLDAwMDAwMDAyLHRydWUsODUxODQxMzYzLDIyMzcwNDE5MiwxODY1ODIsNTU5MTI1LDk3OCw5NzgsMCwwLDAsMCwwLC9Vc2Vycy9hZGVsYXBlbmEvc3JjL2Nhc3NhbmRyYS90cnVuay9kYXRhL2RhdGEvay90LWQ3YmU1ZTkwZTkwMTExZWQ4YjU0ZWZlM2MzOWNiMGJiL25jLTgtYmlnLURhdGEuZGIsayx0LCwsLDgsYmlnLG5jCisuLi4uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL3NzdGFibGUvc3N0YWJsZXJlcGFpcmVkc2V0LmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9zc3RhYmxlcmVwYWlyZWRzZXQuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL3NzdGFibGUvc3N0YWJsZXJlcGFpcmVkc2V0LmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9zc3RhYmxlL3NzdGFibGVyZXBhaXJlZHNldC5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvc3N0YWJsZS9zc3RhYmxlc2NydWIuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9zc3RhYmxlL3NzdGFibGVzY3J1Yi5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvc3N0YWJsZS9zc3RhYmxlc2NydWIuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL3NzdGFibGUvc3N0YWJsZXNjcnViLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29scy9zc3RhYmxlL3NzdGFibGVzcGxpdC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL3NzdGFibGUvc3N0YWJsZXNwbGl0LmFkb2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29scy9zc3RhYmxlL3NzdGFibGVzcGxpdC5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9zc3RhYmxlc3BsaXQuYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL3NzdGFibGUvc3N0YWJsZXVwZ3JhZGUuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9zc3RhYmxlL3NzdGFibGV1cGdyYWRlLmFkb2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29scy9zc3RhYmxlL3NzdGFibGV1cGdyYWRlLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9zc3RhYmxlL3NzdGFibGV1cGdyYWRlLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29scy9zc3RhYmxlL3NzdGFibGV1dGlsLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9zc3RhYmxldXRpbC5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvc3N0YWJsZS9zc3RhYmxldXRpbC5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9zc3RhYmxldXRpbC5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvc3N0YWJsZS9zc3RhYmxldmVyaWZ5LmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9zc3RhYmxldmVyaWZ5LmFkb2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29scy9zc3RhYmxlL3NzdGFibGV2ZXJpZnkuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL3NzdGFibGUvc3N0YWJsZXZlcmlmeS5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdmlydHVhbHRhYmxlcy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3ZpcnR1YWx0YWJsZXMuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjI2MmMxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3ZpcnR1YWx0YWJsZXMuYWRvYwpAQCAtMCwwICsxLDUxNyBAQAorPSBWaXJ0dWFsIFRhYmxlcworCitBcGFjaGUgQ2Fzc2FuZHJhIDQuMCBpbXBsZW1lbnRzIHZpcnR1YWwgdGFibGVzIChodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS03NjIyW0NBU1NBTkRSQS03NjIyXSkuCitWaXJ0dWFsIHRhYmxlcyBhcmUgdGFibGVzIGJhY2tlZCBieSBhbiBBUEkgaW5zdGVhZCBvZiBkYXRhIGV4cGxpY2l0bHkgbWFuYWdlZCBhbmQgc3RvcmVkIGFzIFNTVGFibGVzLiAKK0FwYWNoZSBDYXNzYW5kcmEgNC4wIGltcGxlbWVudHMgYSB2aXJ0dWFsIGtleXNwYWNlIGludGVyZmFjZSBmb3IgdmlydHVhbCB0YWJsZXMuIAorVmlydHVhbCB0YWJsZXMgYXJlIHNwZWNpZmljIHRvIGVhY2ggbm9kZS4KKworU29tZSBvZiB0aGUgZmVhdHVyZXMgb2YgdmlydHVhbCB0YWJsZXMgYXJlIHRoZSBhYmlsaXR5IHRvOgorCisqIGV4cG9zZSBtZXRyaWNzIHRocm91Z2ggQ1FMCisqIGV4cG9zZSBZQU1MIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KKworVmlydHVhbCBrZXlzcGFjZXMgYW5kIHRhYmxlcyBhcmUgcXVpdGUgZGlmZmVyZW50IGZyb20gcmVndWxhciB0YWJsZXMgYW5kIGtleXNwYWNlczoKKworKiBWaXJ0dWFsIHRhYmxlcyBhcmUgY3JlYXRlZCBpbiBzcGVjaWFsIGtleXNwYWNlcyBhbmQgbm90IGp1c3QgYW55IGtleXNwYWNlLgorKiBWaXJ0dWFsIHRhYmxlcyBhcmUgbWFuYWdlZCBieSBDYXNzYW5kcmEuIFVzZXJzIGNhbm5vdCBydW4gRERMIHRvIGNyZWF0ZSBuZXcgdmlydHVhbCB0YWJsZXMgb3IgRE1MIHRvIG1vZGlmeSBleGlzdGluZyB2aXJ0dWFsIHRhYmxlcy4KKyogVmlydHVhbCB0YWJsZXMgYXJlIGN1cnJlbnRseSByZWFkLW9ubHksIGFsdGhvdWdoIHRoYXQgbWF5IGNoYW5nZSBpbiBhIGxhdGVyIHZlcnNpb24uCisqIFZpcnR1YWwgdGFibGVzIGFyZSBsb2NhbCBvbmx5LCBub24tZGlzdHJpYnV0ZWQsIGFuZCB0aHVzIG5vdCByZXBsaWNhdGVkLgorKiBWaXJ0dWFsIHRhYmxlcyBoYXZlIG5vIGFzc29jaWF0ZWQgU1NUYWJsZXMuCisqIENvbnNpc3RlbmN5IGxldmVsIG9mIHRoZSBxdWVyaWVzIHNlbnQgdG8gdmlydHVhbCB0YWJsZXMgYXJlIGlnbm9yZWQuCisqIEFsbCBleGlzdGluZyB2aXJ0dWFsIHRhYmxlcyB1c2UgYExvY2FsUGFydGl0aW9uZXJgLiAKK1NpbmNlIGEgdmlydHVhbCB0YWJsZSBpcyBub3QgcmVwbGljYXRlZCB0aGUgcGFydGl0aW9uZXIgc29ydHMgaW4gb3JkZXIgb2YgcGFydGl0aW9uIGtleXMgaW5zdGVhZCBvZiBieSB0aGVpciBoYXNoLgorKiBNYWtpbmcgYWR2YW5jZWQgcXVlcmllcyB1c2luZyBgQUxMT1cgRklMVEVSSU5HYCBhbmQgYWdncmVnYXRpb24gZnVuY3Rpb25zIGNhbiBiZSBleGVjdXRlZCBpbiB2aXJ0dWFsIHRhYmxlcywgZXZlbiB0aG91Z2ggaW4gbm9ybWFsIHRhYmxlcyB3ZSBkb250IHJlY29tbWVuZCBpdC4KKworPT0gVmlydHVhbCBLZXlzcGFjZXMKKworQXBhY2hlIENhc3NhbmRyYSA0LjAgaGFzIGFkZGVkIHR3byBuZXcga2V5c3BhY2VzIGZvciB2aXJ0dWFsIHRhYmxlczoKKworKiBgc3lzdGVtX3ZpcnR1YWxfc2NoZW1hYCAKKyogYHN5c3RlbV92aWV3c2AuIAorCitUaGUgYHN5c3RlbV92aXJ0dWFsX3NjaGVtYWAga2V5c3BhY2UgaGFzIHRocmVlIHRhYmxlczogYGtleXNwYWNlc2AsCitgY29sdW1uc2AgYW5kIGB0YWJsZXNgIGZvciB0aGUgdmlydHVhbCBrZXlzcGFjZSwgdGFibGUsIGFuZCBjb2x1bW4gZGVmaW5pdGlvbnMsIHJlc3BlY3RpdmVseS4KK1RoZXNlIHRhYmxlcyBjb250YWluIHNjaGVtYSBpbmZvcm1hdGlvbiBmb3IgdGhlIHZpcnR1YWwgdGFibGVzLgorSXQgaXMgdXNlZCBieSBDYXNzYW5kcmEgaW50ZXJuYWxseSBhbmQgYSB1c2VyIHNob3VsZCBub3QgYWNjZXNzIGl0IGRpcmVjdGx5LgorCitUaGUgYHN5c3RlbV92aWV3c2Aga2V5c3BhY2UgY29udGFpbnMgdGhlIGFjdHVhbCB2aXJ0dWFsIHRhYmxlcy4KKworPT0gVmlydHVhbCBUYWJsZSBMaW1pdGF0aW9ucworCitCZWZvcmUgZGlzY2N1c2luZyB2aXJ0dWFsIGtleXNwYWNlcyBhbmQgdGFibGVzLCBub3RlIHRoYXQgdmlydHVhbCBrZXlzcGFjZXMgYW5kIHRhYmxlcyBoYXZlIHNvbWUgbGltaXRhdGlvbnMuIAorVGhlc2UgbGltaXRhdGlvbnMgYXJlIHN1YmplY3QgdG8gY2hhbmdlLgorVmlydHVhbCBrZXlzcGFjZXMgY2Fubm90IGJlIGFsdGVyZWQgb3IgZHJvcHBlZC4gCitJbiBmYWN0LCBubyBvcGVyYXRpb25zIGNhbiBiZSBwZXJmb3JtZWQgYWdhaW5zdCB2aXJ0dWFsIGtleXNwYWNlcy4KKworVmlydHVhbCB0YWJsZXMgY2Fubm90IGJlIGNyZWF0ZWQgaW4gdmlydHVhbCBrZXlzcGFjZXMuCitWaXJ0dWFsIHRhYmxlcyBjYW5ub3QgYmUgYWx0ZXJlZCwgZHJvcHBlZCwgb3IgdHJ1bmNhdGVkLgorU2Vjb25kYXJ5IGluZGV4ZXMsIHR5cGVzLCBmdW5jdGlvbnMsIGFnZ3JlZ2F0ZXMsIG1hdGVyaWFsaXplZCB2aWV3cywgYW5kIHRyaWdnZXJzIGNhbm5vdCBiZSBjcmVhdGVkIGZvciB2aXJ0dWFsIHRhYmxlcy4KK0V4cGlyaW5nIHRpbWUtdG8tbGl2ZSAoVFRMKSBjb2x1bW5zIGNhbm5vdCBiZSBjcmVhdGVkLgorVmlydHVhbCB0YWJsZXMgZG8gbm90IHN1cHBvcnQgY29uZGl0aW9uYWwgdXBkYXRlcyBvciBkZWxldGVzLgorQWdncmVnYXRlcyBtYXkgYmUgcnVuIGluIFNFTEVDVCBzdGF0ZW1lbnRzLgorCitDb25kaXRpb25hbCBiYXRjaCBzdGF0ZW1lbnRzIGNhbm5vdCBpbmNsdWRlIG11dGF0aW9ucyBmb3IgdmlydHVhbCB0YWJsZXMsIG5vciBjYW4gYSB2aXJ0dWFsIHRhYmxlIHN0YXRlbWVudCBiZSBpbmNsdWRlZCBpbiBhIGxvZ2dlZCBiYXRjaC4KK0luIGZhY3QsIG11dGF0aW9ucyBmb3IgdmlydHVhbCBhbmQgcmVndWxhciB0YWJsZXMgY2Fubm90IG9jY3VyIGluIHRoZSBzYW1lIGJhdGNoIHRhYmxlLgorCis9PSBWaXJ0dWFsIFRhYmxlcworCitFYWNoIG9mIHRoZSB2aXJ0dWFsIHRhYmxlcyBpbiB0aGUgYHN5c3RlbV92aWV3c2AgdmlydHVhbCBrZXlzcGFjZSBjb250YWluIGRpZmZlcmVudCBpbmZvcm1hdGlvbi4KKworVGhlIGZvbGxvd2luZyB0YWJsZSBkZXNjcmliZXMgdGhlIHZpcnR1YWwgdGFibGVzOiAKKworW3dpZHRoPSI5OCUiLGNvbHM9IjI3JSw3MyUiLF0KK3w9PT0KK3xWaXJ0dWFsIFRhYmxlIHxEZXNjcmlwdGlvbgorCit8Y2FjaGVzIHxEaXNwbGF5cyB0aGUgZ2VuZXJhbCBjYWNoZSBpbmZvcm1hdGlvbiBpbmNsdWRpbmcgY2FjaGUgbmFtZSwgY2FwYWNpdHlfYnl0ZXMsIGVudHJ5X2NvdW50LCBoaXRfY291bnQsIGhpdF9yYXRpbyBkb3VibGUsCityZWNlbnRfaGl0X3JhdGVfcGVyX3NlY29uZCwgcmVjZW50X3JlcXVlc3RfcmF0ZV9wZXJfc2Vjb25kLCByZXF1ZXN0X2NvdW50LCBhbmQgc2l6ZV9ieXRlcy4KKworfGNsaWVudHMgfExpc3RzIGluZm9ybWF0aW9uIGFib3V0IGFsbCBjb25uZWN0ZWQgY2xpZW50cy4KKworfGNvb3JkaW5hdG9yX3JlYWRfbGF0ZW5jeSB8UmVjb3JkcyBjb3VudHMsIGtleXNwYWNlX25hbWUsIHRhYmxlX25hbWUsIG1heCwgbWVkaWFuLCBhbmQgcGVyX3NlY29uZCBmb3IgY29vcmRpbmF0b3IgcmVhZHMuCisKK3xjb29yZGluYXRvcl9zY2FuIHxSZWNvcmRzIGNvdW50cywga2V5c3BhY2VfbmFtZSwgdGFibGVfbmFtZSwgbWF4LCBtZWRpYW4sIGFuZCBwZXJfc2Vjb25kIGZvciBjb29yZGluYXRvciBzY2Fucy4KKworfGNvb3JkaW5hdG9yX3dyaXRlX2xhdGVuY3kgfFJlY29yZHMgY291bnRzLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBtYXgsIG1lZGlhbiwgYW5kIHBlcl9zZWNvbmQgZm9yIGNvb3JkaW5hdG9yIHdyaXRlcy4KKworfGNxbF9tZXRyaWNzIHxNZXRyaWNzIHNwZWNpZmljIHRvIENRTCBwcmVwYXJlZCBzdGF0ZW1lbnQgY2FjaGluZy4KKworfGRpc2tfdXNhZ2UgfFJlY29yZHMgZGlzayB1c2FnZSBpbmNsdWRpbmcgZGlza19zcGFjZSwga2V5c3BhY2VfbmFtZSwgYW5kIHRhYmxlX25hbWUsIHNvcnRlZCBieSBzeXN0ZW0ga2V5c3BhY2VzLgorCit8Z29zc2lwX2luZm8gfExpc3RzIHRoZSBnb3NzaXAgaW5mb3JtYXRpb24gZm9yIHRoZSBjbHVzdGVyLgorCit8aW50ZXJub2RlX2luYm91bmQgfExpc3RzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbmJvdW5kIGludGVybm9kZSBtZXNzYWdpbmcuCisKK3xpbnRlcm5vZGVfb3V0Ym91bmQgfEluZm9ybWF0aW9uIGFib3V0IHRoZSBvdXRib3VuZCBpbnRlcm5vZGUgbWVzc2FnaW5nLgorCit8bG9jYWxfcmVhZF9sYXRlbmN5IHxSZWNvcmRzIGNvdW50cywga2V5c3BhY2VfbmFtZSwgdGFibGVfbmFtZSwgbWF4LCBtZWRpYW4sIGFuZCBwZXJfc2Vjb25kIGZvciBsb2NhbCByZWFkcy4KKworfGxvY2FsX3NjYW4gfFJlY29yZHMgY291bnRzLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBtYXgsIG1lZGlhbiwgYW5kIHBlcl9zZWNvbmQgZm9yIGxvY2FsIHNjYW5zLgorCit8bG9jYWxfd3JpdGVfbGF0ZW5jeSB8UmVjb3JkcyBjb3VudHMsIGtleXNwYWNlX25hbWUsIHRhYmxlX25hbWUsIG1heCwgbWVkaWFuLCBhbmQgcGVyX3NlY29uZCBmb3IgbG9jYWwgd3JpdGVzLgorCit8bWF4X3BhcnRpdGlvbl9zaXplIHxBIHRhYmxlIG1ldHJpYyBmb3IgbWF4aW11bSBwYXJ0aXRpb24gc2l6ZS4KKworfHJvd3NfcGVyX3JlYWQgfFJlY29yZHMgY291bnRzLCBrZXlzcGFjZV9uYW1lLCB0YWJsZWtfbmFtZSwgbWF4LCBhbmQgbWVkaWFuIGZvciByb3dzIHJlYWQuCisKK3xzZXR0aW5ncyB8RGlzcGxheXMgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBpbiBjYXNzYW5kcmEueWFtbC4KKworfHNzdGFibGVfdGFza3MgfExpc3RzIGN1cnJlbnRseSBydW5uaW5nIHRhc2tzIGFuZCBwcm9ncmVzcyBvbiBTU1RhYmxlcywgZm9yIG9wZXJhdGlvbnMgbGlrZSBjb21wYWN0aW9uIGFuZCB1cGdyYWRlLgorCit8c3lzdGVtX3Byb3BlcnRpZXMgfERpc3BsYXlzIGVudmlyb25tZW50YWwgc3lzdGVtIHByb3BlcnRpZXMgc2V0IG9uIHRoZSBub2RlLgorCit8dGhyZWFkX3Bvb2xzIHxMaXN0cyBtZXRyaWNzIGZvciBlYWNoIHRocmVhZCBwb29sLgorCit8dG9tYnN0b25lc19wZXJfcmVhZCB8UmVjb3JkcyBjb3VudHMsIGtleXNwYWNlX25hbWUsIHRhYmxla19uYW1lLCBtYXgsIGFuZCBtZWRpYW4gZm9yIHRvbWJzdG9uZXMuCisKK3w9PT0KKworV2Ugc2hhbGwgZGlzY3VzcyBzb21lIG9mIHRoZSB2aXJ0dWFsIHRhYmxlcyBpbiBtb3JlIGRldGFpbCBuZXh0LgorCis9PT0gQ2xpZW50cyBWaXJ0dWFsIFRhYmxlCisKK1RoZSBgY2xpZW50c2AgdmlydHVhbCB0YWJsZSBsaXN0cyBhbGwgYWN0aXZlIGNvbm5lY3Rpb25zIChjb25uZWN0ZWQKK2NsaWVudHMpIGluY2x1ZGluZyB0aGVpciBpcCBhZGRyZXNzLCBwb3J0LCBjbGllbnRfb3B0aW9ucywgY29ubmVjdGlvbiBzdGFnZSwgZHJpdmVyCituYW1lLCBkcml2ZXIgdmVyc2lvbiwgaG9zdG5hbWUsIHByb3RvY29sIHZlcnNpb24sIHJlcXVlc3QgY291bnQsIHNzbAorZW5hYmxlZCwgc3NsIHByb3RvY29sIGFuZCB1c2VyIG5hbWU6CisKKy4uLi4KK2NxbHNoPiBFWFBBTkQgT04gOworTm93IEV4cGFuZGVkIG91dHB1dCBpcyBlbmFibGVkCitjcWxzaD4gU0VMRUNUICogRlJPTSBzeXN0ZW1fdmlld3MuY2xpZW50czsKKworQCBSb3cgMQorLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgYWRkcmVzcyAgICAgICAgICB8IDEyNy4wLjAuMQorIHBvcnQgICAgICAgICAgICAgfCA1MDY4NworIGNsaWVudF9vcHRpb25zICAgfCB7J0NRTF9WRVJTSU9OJzogJzMuNC43JywgJ0RSSVZFUl9OQU1FJzogJ0RhdGFTdGF4IFB5dGhvbiBEcml2ZXInLCAnRFJJVkVSX1ZFUlNJT04nOiAnMy4yNS4wJ30KKyBjb25uZWN0aW9uX3N0YWdlIHwgcmVhZHkKKyBkcml2ZXJfbmFtZSAgICAgIHwgRGF0YVN0YXggUHl0aG9uIERyaXZlcgorIGRyaXZlcl92ZXJzaW9uICAgfCAzLjI1LjAKKyBob3N0bmFtZSAgICAgICAgIHwgbG9jYWxob3N0CisgcHJvdG9jb2xfdmVyc2lvbiB8IDUKKyByZXF1ZXN0X2NvdW50ICAgIHwgMTYKKyBzc2xfY2lwaGVyX3N1aXRlIHwgbnVsbAorIHNzbF9lbmFibGVkICAgICAgfCBGYWxzZQorIHNzbF9wcm90b2NvbCAgICAgfCBudWxsCisgdXNlcm5hbWUgICAgICAgICB8IGFub255bW91cworCitAIFJvdyAyCistLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBhZGRyZXNzICAgICAgICAgIHwgMTI3LjAuMC4xCisgcG9ydCAgICAgICAgICAgICB8IDUwNjg4CisgY2xpZW50X29wdGlvbnMgICB8IHsnQ1FMX1ZFUlNJT04nOiAnMy40LjcnLCAnRFJJVkVSX05BTUUnOiAnRGF0YVN0YXggUHl0aG9uIERyaXZlcicsICdEUklWRVJfVkVSU0lPTic6ICczLjI1LjAnfQorIGNvbm5lY3Rpb25fc3RhZ2UgfCByZWFkeQorIGRyaXZlcl9uYW1lICAgICAgfCBEYXRhU3RheCBQeXRob24gRHJpdmVyCisgZHJpdmVyX3ZlcnNpb24gICB8IDMuMjUuMAorIGhvc3RuYW1lICAgICAgICAgfCBsb2NhbGhvc3QKKyBwcm90b2NvbF92ZXJzaW9uIHwgNQorIHJlcXVlc3RfY291bnQgICAgfCA0Cisgc3NsX2NpcGhlcl9zdWl0ZSB8IG51bGwKKyBzc2xfZW5hYmxlZCAgICAgIHwgRmFsc2UKKyBzc2xfcHJvdG9jb2wgICAgIHwgbnVsbAorIHVzZXJuYW1lICAgICAgICAgfCBhbm9ueW1vdXMKKworQCBSb3cgMworLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgYWRkcmVzcyAgICAgICAgICB8IDEyNy4wLjAuMQorIHBvcnQgICAgICAgICAgICAgfCA1MDc1MworIGNsaWVudF9vcHRpb25zICAgfCB7J0FQUExJQ0FUSU9OX05BTUUnOiAnVGVzdEFwcCcsICdBUFBMSUNBVElPTl9WRVJTSU9OJzogJzEuMC4wJywgJ0NMSUVOVF9JRCc6ICc1NWIzZWZiZC1jNTZiLTQ2OWQtOGNjYS0wMTZiODYwYjJmMDMnLCAnQ1FMX1ZFUlNJT04nOiAnMy4wLjAnLCAnRFJJVkVSX05BTUUnOiAnRGF0YVN0YXggSmF2YSBkcml2ZXIgZm9yIEFwYWNoZSBDYXNzYW5kcmEoUiknLCAnRFJJVkVSX1ZFUlNJT04nOiAnNC4xMy4wJ30KKyBjb25uZWN0aW9uX3N0YWdlIHwgcmVhZHkKKyBkcml2ZXJfbmFtZSAgICAgIHwgRGF0YVN0YXggSmF2YSBkcml2ZXIgZm9yIEFwYWNoZSBDYXNzYW5kcmEoUikKKyBkcml2ZXJfdmVyc2lvbiAgIHwgNC4xMy4wCisgaG9zdG5hbWUgICAgICAgICB8IGxvY2FsaG9zdAorIHByb3RvY29sX3ZlcnNpb24gfCA1CisgcmVxdWVzdF9jb3VudCAgICB8IDE4Cisgc3NsX2NpcGhlcl9zdWl0ZSB8IG51bGwKKyBzc2xfZW5hYmxlZCAgICAgIHwgRmFsc2UKKyBzc2xfcHJvdG9jb2wgICAgIHwgbnVsbAorIHVzZXJuYW1lICAgICAgICAgfCBhbm9ueW1vdXMKKworQCBSb3cgNAorLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgYWRkcmVzcyAgICAgICAgICB8IDEyNy4wLjAuMQorIHBvcnQgICAgICAgICAgICAgfCA1MDc1NQorIGNsaWVudF9vcHRpb25zICAgfCB7J0FQUExJQ0FUSU9OX05BTUUnOiAnVGVzdEFwcCcsICdBUFBMSUNBVElPTl9WRVJTSU9OJzogJzEuMC4wJywgJ0NMSUVOVF9JRCc6ICc1NWIzZWZiZC1jNTZiLTQ2OWQtOGNjYS0wMTZiODYwYjJmMDMnLCAnQ1FMX1ZFUlNJT04nOiAnMy4wLjAnLCAnRFJJVkVSX05BTUUnOiAnRGF0YVN0YXggSmF2YSBkcml2ZXIgZm9yIEFwYWNoZSBDYXNzYW5kcmEoUiknLCAnRFJJVkVSX1ZFUlNJT04nOiAnNC4xMy4wJ30KKyBjb25uZWN0aW9uX3N0YWdlIHwgcmVhZHkKKyBkcml2ZXJfbmFtZSAgICAgIHwgRGF0YVN0YXggSmF2YSBkcml2ZXIgZm9yIEFwYWNoZSBDYXNzYW5kcmEoUikKKyBkcml2ZXJfdmVyc2lvbiAgIHwgNC4xMy4wCisgaG9zdG5hbWUgICAgICAgICB8IGxvY2FsaG9zdAorIHByb3RvY29sX3ZlcnNpb24gfCA1CisgcmVxdWVzdF9jb3VudCAgICB8IDcKKyBzc2xfY2lwaGVyX3N1aXRlIHwgbnVsbAorIHNzbF9lbmFibGVkICAgICAgfCBGYWxzZQorIHNzbF9wcm90b2NvbCAgICAgfCBudWxsCisgdXNlcm5hbWUgICAgICAgICB8IGFub255bW91cworCisoNCByb3dzKQorLi4uLgorCitTb21lIGV4YW1wbGVzIG9mIGhvdyBgY2xpZW50c2AgY2FuIGJlIHVzZWQgYXJlOgorCisqIFRvIGZpbmQgYXBwbGljYXRpb25zIHVzaW5nIG9sZCBpbmNvbXBhdGlibGUgdmVyc2lvbnMgb2YgZHJpdmVycyBiZWZvcmUKK3VwZ3JhZGluZyBhbmQgd2l0aCBgbm9kZXRvb2wgZW5hYmxlb2xkcHJvdG9jb2x2ZXJzaW9uc2AgYW5kCitgbm9kZXRvb2wgZGlzYWJsZW9sZHByb3RvY29sdmVyc2lvbnNgIGR1cmluZyB1cGdyYWRlcy4KKyogVG8gaWRlbnRpZnkgY2xpZW50cyBzZW5kaW5nIHRvbyBtYW55IHJlcXVlc3RzLgorKiBUbyBmaW5kIGlmIFNTTCBpcyBlbmFibGVkIGR1cmluZyB0aGUgbWlncmF0aW9uIHRvIGFuZCBmcm9tIHNzbC4KKyogVG8gaWRlbnRpZnkgYWxsIG9wdGlvbnMgdGhlIGNsaWVudCBpcyBzZW5kaW5nLCBlLmcuIEFQUExJQ0FUSU9OX05BTUUgYW5kIEFQUExJQ0FUSU9OX1ZFUlNJT04KKworVGhlIHZpcnR1YWwgdGFibGVzIG1heSBiZSBkZXNjcmliZWQgd2l0aCBgREVTQ1JJQkVgIHN0YXRlbWVudC4gVGhlIERETAorbGlzdGVkIGhvd2V2ZXIgY2Fubm90IGJlIHJ1biB0byBjcmVhdGUgYSB2aXJ0dWFsIHRhYmxlLiBBcyBhbiBleGFtcGxlCitkZXNjcmliZSB0aGUgYHN5c3RlbV92aWV3cy5jbGllbnRzYCB2aXJ0dWFsIHRhYmxlOgorCisuLi4uCitjcWxzaD4gREVTQ1JJQkUgVEFCTEUgc3lzdGVtX3ZpZXdzLmNsaWVudHM7CisKKy8qCitXYXJuaW5nOiBUYWJsZSBzeXN0ZW1fdmlld3MuY2xpZW50cyBpcyBhIHZpcnR1YWwgdGFibGUgYW5kIGNhbm5vdCBiZSByZWNyZWF0ZWQgd2l0aCBDUUwuCitTdHJ1Y3R1cmUsIGZvciByZWZlcmVuY2U6CitWSVJUVUFMIFRBQkxFIHN5c3RlbV92aWV3cy5jbGllbnRzICgKKyAgICBhZGRyZXNzIGluZXQsCisgICAgcG9ydCBpbnQsCisgICAgY2xpZW50X29wdGlvbnMgZnJvemVuPG1hcDx0ZXh0LCB0ZXh0Pj4sCisgICAgY29ubmVjdGlvbl9zdGFnZSB0ZXh0LAorICAgIGRyaXZlcl9uYW1lIHRleHQsCisgICAgZHJpdmVyX3ZlcnNpb24gdGV4dCwKKyAgICBob3N0bmFtZSB0ZXh0LAorICAgIHByb3RvY29sX3ZlcnNpb24gaW50LAorICAgIHJlcXVlc3RfY291bnQgYmlnaW50LAorICAgIHNzbF9jaXBoZXJfc3VpdGUgdGV4dCwKKyAgICBzc2xfZW5hYmxlZCBib29sZWFuLAorICAgIHNzbF9wcm90b2NvbCB0ZXh0LAorICAgIHVzZXJuYW1lIHRleHQsCisgICAgUFJJTUFSWSBLRVkgKGFkZHJlc3MsIHBvcnQpCispIFdJVEggQ0xVU1RFUklORyBPUkRFUiBCWSAocG9ydCBBU0MpCisgICAgQU5EIGNvbW1lbnQgPSAnY3VycmVudGx5IGNvbm5lY3RlZCBjbGllbnRzJzsKKyovCisuLi4uCisKKz09PSBDYWNoZXMgVmlydHVhbCBUYWJsZQorCitUaGUgYGNhY2hlc2AgdmlydHVhbCB0YWJsZSBsaXN0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2FjaGVzLiBUaGUgZm91cgorY2FjaGVzIHByZXNlbnRseSBjcmVhdGVkIGFyZSBjaHVua3MsIGNvdW50ZXJzLCBrZXlzIGFuZCByb3dzLiBBIHF1ZXJ5IG9uCit0aGUgYGNhY2hlc2AgdmlydHVhbCB0YWJsZSByZXR1cm5zIHRoZSBmb2xsb3dpbmcgZGV0YWlsczoKKworLi4uLgorY3Fsc2g6c3lzdGVtX3ZpZXdzPiBTRUxFQ1QgKiBGUk9NIHN5c3RlbV92aWV3cy5jYWNoZXM7CituYW1lICAgICB8IGNhcGFjaXR5X2J5dGVzIHwgZW50cnlfY291bnQgfCBoaXRfY291bnQgfCBoaXRfcmF0aW8gfCByZWNlbnRfaGl0X3JhdGVfcGVyX3NlY29uZCB8IHJlY2VudF9yZXF1ZXN0X3JhdGVfcGVyX3NlY29uZCB8IHJlcXVlc3RfY291bnQgfCBzaXplX2J5dGVzCistLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLQorICBjaHVua3MgfCAgICAgIDIyOTYzODE0NCB8ICAgICAgICAgIDI5IHwgICAgICAgMTY2IHwgICAgICAwLjgzIHwgICAgICAgICAgICAgICAgICAgICAgICAgIDUgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYgfCAgICAgICAgICAgMjAwIHwgICAgIDQ3NTEzNgorY291bnRlcnMgfCAgICAgICAyNjIxNDQwMCB8ICAgICAgICAgICAwIHwgICAgICAgICAwIHwgICAgICAgTmFOIHwgICAgICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgMAorICAgIGtleXMgfCAgICAgICA1MjQyODgwMCB8ICAgICAgICAgIDE0IHwgICAgICAgMTI0IHwgIDAuODczMjM5IHwgICAgICAgICAgICAgICAgICAgICAgICAgIDQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgfCAgICAgICAgICAgMTQyIHwgICAgICAgMTI0OAorICAgIHJvd3MgfCAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAwIHwgICAgICAgICAwIHwgICAgICAgTmFOIHwgICAgICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgMAorCisoNCByb3dzKQorLi4uLgorCis9PT0gQ1FMIG1ldHJpY3MgVmlydHVhbCBUYWJsZQorVGhlIGBjcWxfbWV0cmljc2AgdmlydHVhbCB0YWJsZSBsaXN0cyBtZXRyaWNzIHNwZWNpZmljIHRvIENRTCBwcmVwYXJlZCBzdGF0ZW1lbnQgY2FjaGluZy4gQSBxdWVyeSBvbiBgY3FsX21ldHJpY3NgIHZpcnR1YWwgdGFibGUgbGlzdHMgYmVsb3cgbWV0cmljcy4KKworLi4uLgorY3Fsc2g+IHNlbGVjdCAqIGZyb20gc3lzdGVtX3ZpZXdzLmNxbF9tZXRyaWNzIDsKKworIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0KKyAgICBwcmVwYXJlZF9zdGF0ZW1lbnRzX2NvdW50IHwgICAgIDAKKyAgcHJlcGFyZWRfc3RhdGVtZW50c19ldmljdGVkIHwgICAgIDAKKyBwcmVwYXJlZF9zdGF0ZW1lbnRzX2V4ZWN1dGVkIHwgICAgIDAKKyAgICBwcmVwYXJlZF9zdGF0ZW1lbnRzX3JhdGlvIHwgICAgIDAKKyAgcmVndWxhcl9zdGF0ZW1lbnRzX2V4ZWN1dGVkIHwgICAgMTcKKy4uLi4KKworPT09IFNldHRpbmdzIFZpcnR1YWwgVGFibGUKKworVGhlIGBzZXR0aW5nc2AgdGFibGUgaXMgcmF0aGVyIHVzZWZ1bCBhbmQgbGlzdHMgYWxsIHRoZSBjdXJyZW50Citjb25maWd1cmF0aW9uIHNldHRpbmdzIGZyb20gdGhlIGBjYXNzYW5kcmEueWFtbGAuIFRoZSBlbmNyeXB0aW9uIG9wdGlvbnMKK2FyZSBvdmVycmlkZGVuIHRvIGhpZGUgdGhlIHNlbnNpdGl2ZSB0cnVzdHN0b3JlIGluZm9ybWF0aW9uIG9yCitwYXNzd29yZHMuIFRoZSBjb25maWd1cmF0aW9uIHNldHRpbmdzIGhvd2V2ZXIgY2Fubm90IGJlIHNldCB1c2luZyBETUwgb24KK3RoZSB2aXJ0dWFsIHRhYmxlIHByZXNlbnRseTogOgorCisuLi4uCitjcWxzaDpzeXN0ZW1fdmlld3M+IFNFTEVDVCAqIEZST00gc3lzdGVtX3ZpZXdzLnNldHRpbmdzOworCituYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLQorICBhbGxvY2F0ZV90b2tlbnNfZm9yX2tleXNwYWNlICAgICAgIHwgbnVsbAorICBhdWRpdF9sb2dnaW5nX29wdGlvbnNfZW5hYmxlZCAgICAgIHwgZmFsc2UKKyAgYXV0b19zbmFwc2hvdCAgICAgICAgICAgICAgICAgICAgICB8IHRydWUKKyAgYXV0b21hdGljX3NzdGFibGVfdXBncmFkZSAgICAgICAgICB8IGZhbHNlCisgIGNsdXN0ZXJfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgfCBUZXN0IENsdXN0ZXIKKyAgdHJhbnNpZW50X3JlcGxpY2F0aW9uX2VuYWJsZWQgICAgICB8IGZhbHNlCisgIGhpbnRlZF9oYW5kb2ZmX2VuYWJsZWQgICAgICAgICAgICAgfCB0cnVlCisgIGhpbnRzX2RpcmVjdG9yeSAgICAgICAgICAgICAgICAgICAgfCAvaG9tZS9lYzItdXNlci9jYXNzYW5kcmEvZGF0YS9oaW50cworICBpbmNyZW1lbnRhbF9iYWNrdXBzICAgICAgICAgICAgICAgIHwgZmFsc2UKKyAgaW5pdGlhbF90b2tlbiAgICAgICAgICAgICAgICAgICAgICB8IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KKyAgcnBjX2FkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICB8IGxvY2FsaG9zdAorICBzc2xfc3RvcmFnZV9wb3J0ICAgICAgICAgICAgICAgICAgIHwgNzAwMQorICBzdGFydF9uYXRpdmVfdHJhbnNwb3J0ICAgICAgICAgICAgIHwgdHJ1ZQorICBzdG9yYWdlX3BvcnQgICAgICAgICAgICAgICAgICAgICAgIHwgNzAwMAorICBzdHJlYW1fZW50aXJlX3NzdGFibGVzICAgICAgICAgICAgIHwgdHJ1ZQorICAoMjI0IHJvd3MpCisuLi4uCisKK1RoZSBgc2V0dGluZ3NgIHRhYmxlIGNhbiBiZSByZWFsbHkgdXNlZnVsIGlmIHlhbWwgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkCitzaW5jZSBzdGFydHVwIGFuZCBkb250IGtub3cgcnVubmluZyBjb25maWd1cmF0aW9uLCBvciB0byBmaW5kIGlmIHRoZXkKK2hhdmUgYmVlbiBtb2RpZmllZCB2aWEgam14L25vZGV0b29sIG9yIHZpcnR1YWwgdGFibGVzLgorCis9PT0gVGhyZWFkIFBvb2xzIFZpcnR1YWwgVGFibGUKKworVGhlIGB0aHJlYWRfcG9vbHNgIHRhYmxlIGxpc3RzIGluZm9ybWF0aW9uIGFib3V0IGFsbCB0aHJlYWQgcG9vbHMuCitUaHJlYWQgcG9vbCBpbmZvcm1hdGlvbiBpbmNsdWRlcyBhY3RpdmUgdGFza3MsIGFjdGl2ZSB0YXNrcyBsaW1pdCwKK2Jsb2NrZWQgdGFza3MsIGJsb2NrZWQgdGFza3MgYWxsIHRpbWUsIGNvbXBsZXRlZCB0YXNrcywgYW5kIHBlbmRpbmcKK3Rhc2tzLiBBIHF1ZXJ5IG9uIHRoZSBgdGhyZWFkX3Bvb2xzYCByZXR1cm5zIGZvbGxvd2luZyBkZXRhaWxzOgorCisuLi4uCitjcWxzaDpzeXN0ZW1fdmlld3M+IHNlbGVjdCAqIGZyb20gc3lzdGVtX3ZpZXdzLnRocmVhZF9wb29sczsKKworbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICB8IGFjdGl2ZV90YXNrcyB8IGFjdGl2ZV90YXNrc19saW1pdCB8IGJsb2NrZWRfdGFza3MgfCBibG9ja2VkX3Rhc2tzX2FsbF90aW1lIHwgY29tcGxldGVkX3Rhc2tzIHwgcGVuZGluZ190YXNrcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBbnRpRW50cm9weVN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgIENhY2hlQ2xlYW51cEV4ZWN1dG9yIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgICAgQ29tcGFjdGlvbkV4ZWN1dG9yIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICA4ODEgfCAgICAgICAgICAgICAwCisgICAgICAgIENvdW50ZXJNdXRhdGlvblN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgIDMyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgICAgICAgICAgIEdvc3NpcFN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgICAgICAgSGludHNEaXNwYXRjaGVyIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgSW50ZXJuYWxSZXNwb25zZVN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgICBNZW10YWJsZUZsdXNoV3JpdGVyIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwCisgICAgICAgICAgIE1lbXRhYmxlUG9zdEZsdXNoIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDIgfCAgICAgICAgICAgICAwCisgICAgICAgTWVtdGFibGVSZWNsYWltTWVtb3J5IHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwCisgICAgICAgICAgICAgIE1pZ3JhdGlvblN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgICAgICAgICAgICAgTWlzY1N0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgICAgICAgICBNdXRhdGlvblN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgIDMyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICBOYXRpdmUtVHJhbnNwb3J0LVJlcXVlc3RzIHwgICAgICAgICAgICAxIHwgICAgICAgICAgICAgICAgMTI4IHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAxMzAgfCAgICAgICAgICAgICAwCisgICAgICBQZW5kaW5nUmFuZ2VDYWxjdWxhdG9yIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwCitQZXJEaXNrTWVtdGFibGVGbHVzaFdyaXRlcl8wIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwCisgICAgICAgICAgICAgICAgICAgUmVhZFN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgIDMyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgMTMgfCAgICAgICAgICAgICAwCisgICAgICAgICAgICAgICAgIFJlcGFpci1UYXNrIHwgICAgICAgICAgICAwIHwgICAgICAgICAyMTQ3NDgzNjQ3IHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgIFJlcXVlc3RSZXNwb25zZVN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgICAgICAgICAgICAgICBTYW1wbGVyIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgU2Vjb25kYXJ5SW5kZXhNYW5hZ2VtZW50IHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgICAgVmFsaWRhdGlvbkV4ZWN1dG9yIHwgICAgICAgICAgICAwIHwgICAgICAgICAyMTQ3NDgzNjQ3IHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgICAgIFZpZXdCdWlsZEV4ZWN1dG9yIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisgICAgICAgICAgIFZpZXdNdXRhdGlvblN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgIDMyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCisuLi4uCisKKygyNCByb3dzKQorCis9PT0gSW50ZXJub2RlIEluYm91bmQgTWVzc2FnaW5nIFZpcnR1YWwgVGFibGUKKworVGhlIGBpbnRlcm5vZGVfaW5ib3VuZGAgdmlydHVhbCB0YWJsZSBpcyBmb3IgdGhlIGludGVybm9kZSBpbmJvdW5kCittZXNzYWdpbmcuIEluaXRpYWxseSBubyBpbnRlcm5vZGUgaW5ib3VuZCBtZXNzYWdpbmcgbWF5IGdldCBsaXN0ZWQuIEluCithZGRpdGlvbiB0byB0aGUgYWRkcmVzcywgcG9ydCwgZGF0YWNlbnRlciBhbmQgcmFjayBpbmZvcm1hdGlvbiBpbmNsdWRlcworY29ycnVwdCBmcmFtZXMgcmVjb3ZlcmVkLCBjb3JydXB0IGZyYW1lcyB1bnJlY292ZXJlZCwgZXJyb3IgYnl0ZXMsIGVycm9yCitjb3VudCwgZXhwaXJlZCBieXRlcywgZXhwaXJlZCBjb3VudCwgcHJvY2Vzc2VkIGJ5dGVzLCBwcm9jZXNzZWQgY291bnQsCityZWNlaXZlZCBieXRlcywgcmVjZWl2ZWQgY291bnQsIHNjaGVkdWxlZCBieXRlcywgc2NoZWR1bGVkIGNvdW50LAordGhyb3R0bGVkIGNvdW50LCB0aHJvdHRsZWQgbmFub3MsIHVzaW5nIGJ5dGVzLCB1c2luZyByZXNlcnZlIGJ5dGVzLiBBCitxdWVyeSBvbiB0aGUgYGludGVybm9kZV9pbmJvdW5kYCByZXR1cm5zIGZvbGxvd2luZyBkZXRhaWxzOgorCisuLi4uCitjcWxzaDpzeXN0ZW1fdmlld3M+IFNFTEVDVCAqIEZST00gc3lzdGVtX3ZpZXdzLmludGVybm9kZV9pbmJvdW5kOworYWRkcmVzcyB8IHBvcnQgfCBkYyB8IHJhY2sgfCBjb3JydXB0X2ZyYW1lc19yZWNvdmVyZWQgfCBjb3JydXB0X2ZyYW1lc191bnJlY292ZXJlZCB8CitlcnJvcl9ieXRlcyB8IGVycm9yX2NvdW50IHwgZXhwaXJlZF9ieXRlcyB8IGV4cGlyZWRfY291bnQgfCBwcm9jZXNzZWRfYnl0ZXMgfAorcHJvY2Vzc2VkX2NvdW50IHwgcmVjZWl2ZWRfYnl0ZXMgfCByZWNlaXZlZF9jb3VudCB8IHNjaGVkdWxlZF9ieXRlcyB8IHNjaGVkdWxlZF9jb3VudCB8IHRocm90dGxlZF9jb3VudCB8IHRocm90dGxlZF9uYW5vcyB8IHVzaW5nX2J5dGVzIHwgdXNpbmdfcmVzZXJ2ZV9ieXRlcworLS0tLS0tLS0tKy0tLS0tLSstLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0KKy0tLS0tLS0tLS0KKygwIHJvd3MpCisuLi4uCisKKz09PSBTU1RhYmxlcyBUYXNrcyBWaXJ0dWFsIFRhYmxlCisKK1RoZSBgc3N0YWJsZV90YXNrc2AgY291bGQgYmUgdXNlZCB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgcnVubmluZwordGFza3MuIEl0IGxpc3RzIGZvbGxvd2luZyBjb2x1bW5zOgorCisuLi4uCitjcWxzaDpzeXN0ZW1fdmlld3M+IFNFTEVDVCAqIEZST00gc3N0YWJsZV90YXNrczsKK2tleXNwYWNlX25hbWUgfCB0YWJsZV9uYW1lIHwgdGFza19pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwga2luZCAgICAgICB8IHByb2dyZXNzIHwgdG90YWwgICAgfCB1bml0CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLQorICAgICAgIGJhc2ljIHwgICAgICB3aWRlMiB8IGMzOTA5NzQwLWNkZjctMTFlOS1hOGVkLTBmMDNkZTJkOWFlMSB8IGNvbXBhY3Rpb24gfCA2MDQxODc2MSB8IDcwODgyMTEwIHwgYnl0ZXMKKyAgICAgICBiYXNpYyB8ICAgICAgd2lkZTIgfCBjNzU1Njc3MC1jZGY3LTExZTktYThlZC0wZjAzZGUyZDlhZTEgfCBjb21wYWN0aW9uIHwgIDI5OTU2MjMgfCA0MDMxNDY3OSB8IGJ5dGVzCisuLi4uCisKK0FzIGFub3RoZXIgZXhhbXBsZSwgdG8gZmluZCBob3cgbXVjaCB0aW1lIGlzIHJlbWFpbmluZyBmb3IgU1NUYWJsZQordGFza3MsIHVzZSB0aGUgZm9sbG93aW5nIHF1ZXJ5OgorCisuLi4uCitTRUxFQ1QgdG90YWwgLSBwcm9ncmVzcyBBUyByZW1haW5pbmcKK0ZST00gc3lzdGVtX3ZpZXdzLnNzdGFibGVfdGFza3M7CisuLi4uCisKKz09PSBHb3NzaXAgSW5mb3JtYXRpb24gVmlydHVhbCBUYWJsZQorCitUaGUgYGdvc3NpcF9pbmZvYCB2aXJ0dWFsIHRhYmxlIGxpc3RzIHRoZSBHb3NzaXAgaW5mb3JtYXRpb24gZm9yIHRoZSBjbHVzdGVyLiBBbiBleGFtcGxlIHF1ZXJ5IGlzIGFzIGZvbGxvd3M6CisKKy4uLi4KK2NxbHNoPiBzZWxlY3QgYWRkcmVzcywgcG9ydCwgZ2VuZXJhdGlvbiwgaGVhcnRiZWF0LCBsb2FkLCBkYywgcmFjayBmcm9tIHN5c3RlbV92aWV3cy5nb3NzaXBfaW5mbzsKKworIGFkZHJlc3MgICB8IHBvcnQgfCBnZW5lcmF0aW9uIHwgaGVhcnRiZWF0IHwgbG9hZCAgICB8IGRjICAgICAgICAgIHwgcmFjaworLS0tLS0tLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tCisgMTI3LjAuMC4xIHwgNzAwMCB8IDE2NDU1NzUxNDAgfCAgICAgICAzMTIgfCA3MDU0Mi4wIHwgZGF0YWNlbnRlcjEgfCByYWNrMQorIDEyNy4wLjAuMiB8IDcwMDAgfCAxNjQ1NTc1MTM1IHwgICAgICAgMzE4IHwgNzA0OTkuMCB8IGRhdGFjZW50ZXIxIHwgcmFjazEKKyAxMjcuMC4wLjMgfCA3MDAwIHwgMTY0NTU3NTE0MCB8ICAgICAgIDMxMiB8IDcwNTA0LjAgfCBkYXRhY2VudGVyMSB8IHJhY2sxCisgMTI3LjAuMC40IHwgNzAwMCB8IDE2NDU1NzUxNDEgfCAgICAgICAzMTEgfCA3MDUwMi4wIHwgZGF0YWNlbnRlcjEgfCByYWNrMQorIDEyNy4wLjAuNSB8IDcwMDAgfCAxNjQ1NTc1MTM2IHwgICAgICAgMzE1IHwgNzA1MDAuMCB8IGRhdGFjZW50ZXIxIHwgcmFjazEKKworKDUgcm93cykKKy4uLi4KKworPT09IE90aGVyIFZpcnR1YWwgVGFibGVzCisKK1NvbWUgZXhhbXBsZXMgb2YgdXNpbmcgb3RoZXIgdmlydHVhbCB0YWJsZXMgYXJlIGFzIGZvbGxvd3MuCisKK0ZpbmQgdGFibGVzIHdpdGggbW9zdCBkaXNrIHVzYWdlOgorCisuLi4uCitjcWxzaD4gU0VMRUNUICogRlJPTSBkaXNrX3VzYWdlIFdIRVJFIG1lYmlieXRlcyA+IDEgQUxMT1cgRklMVEVSSU5HOworCitrZXlzcGFjZV9uYW1lIHwgdGFibGVfbmFtZSB8IG1lYmlieXRlcworLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLQorICAga2V5c3BhY2UxIHwgIHN0YW5kYXJkMSB8ICAgICAgIDI4OAorICB0bHBfc3RyZXNzIHwgICBrZXl2YWx1ZSB8ICAgICAgMzIxMQorLi4uLgorCitGaW5kIHF1ZXJpZXMgb24gdGFibGUvcyB3aXRoIGdyZWF0ZXN0IHJlYWQgbGF0ZW5jeToKKworLi4uLgorY3Fsc2g+IFNFTEVDVCAqIEZST00gIGxvY2FsX3JlYWRfbGF0ZW5jeSBXSEVSRSBwZXJfc2Vjb25kID4gMSBBTExPVyBGSUxURVJJTkc7CisKK2tleXNwYWNlX25hbWUgfCB0YWJsZV9uYW1lIHwgcDUwdGhfbXMgfCBwOTl0aF9tcyB8IGNvdW50ICAgIHwgbWF4X21zICB8IHBlcl9zZWNvbmQKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLQorICB0bHBfc3RyZXNzIHwgICBrZXl2YWx1ZSB8ICAgIDAuMDQzIHwgICAgMC4xNTIgfCA0OTc4NTE1OCB8IDE4Ni41NjMgfCAgMTE0MTguMzU2CisuLi4uCisKKworPT0gRXhhbXBsZQorCitbYXJhYmljLCBzdGFydD0xXQorLiBUbyBsaXN0IHRoZSBrZXlzcGFjZXMsIGVudGVyIGBgY3Fsc2hgYCBhbmQgcnVuIHRoZSBDUUwgY29tbWFuZCBgYERFU0NSSUJFIEtFWVNQQUNFU2BgOgorCitbc291cmNlLCBjcWxdCistLS0tCitjcWxzaD4gREVTQyBLRVlTUEFDRVM7CitzeXN0ZW1fc2NoZW1hICBzeXN0ZW0gICAgICAgICAgc3lzdGVtX2Rpc3RyaWJ1dGVkICBzeXN0ZW1fdmlydHVhbF9zY2hlbWEKK3N5c3RlbV9hdXRoICAgIHN5c3RlbV90cmFjZXMgICBzeXN0ZW1fdmlld3MKKy0tLS0KKworW2FyYWJpYywgc3RhcnQ9Ml0KKy4gVG8gdmlldyB0aGUgdmlydHVhbCB0YWJsZSBzY2hlbWEsIHJ1biB0aGUgQ1FMIGNvbW1hbmRzIGBgVVNFIHN5c3RlbV92aXJ0dWFsX3NjaGVtYWBgIGFuZCBgYFNFTEVDVCAqIEZST00gdGFibGVzYGA6CisKK1tzb3VyY2UsIGNxbF0KKy0tLS0KK2NxbHNoPiBVU0Ugc3lzdGVtX3ZpcnR1YWxfc2NoZW1hOworY3Fsc2g+IFNFTEVDVCAqIEZST00gdGFibGVzOworLS0tLQorIAorcmVzdWx0cyBpbjoKKworW3NvdXJjZSwgY3FsXQorLS0tLQorIGtleXNwYWNlX25hbWUgICAgICAgICB8IHRhYmxlX25hbWUgICAgICAgICAgICAgICAgfCBjb21tZW50CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgICAgICAgICAgICAgY2FjaGVzIHwgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW0gY2FjaGVzCisgICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgICAgICAgICAgICAgY2xpZW50cyB8ICAgICAgICAgIGN1cnJlbnRseSBjb25uZWN0ZWQgY2xpZW50cworICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICBjb29yZGluYXRvcl9yZWFkX2xhdGVuY3kgfAorICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICBjb29yZGluYXRvcl9zY2FuX2xhdGVuY3kgfAorICAgICAgICAgIHN5c3RlbV92aWV3cyB8IGNvb3JkaW5hdG9yX3dyaXRlX2xhdGVuY3kgfAorICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICAgICAgICAgIGRpc2tfdXNhZ2UgfAorICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICAgaW50ZXJub2RlX2luYm91bmQgfAorICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICBpbnRlcm5vZGVfb3V0Ym91bmQgfAorICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICBsb2NhbF9yZWFkX2xhdGVuY3kgfAorICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICBsb2NhbF9zY2FuX2xhdGVuY3kgfAorICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgIGxvY2FsX3dyaXRlX2xhdGVuY3kgfAorICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICBtYXhfcGFydGl0aW9uX3NpemUgfAorICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICAgICAgIHJvd3NfcGVyX3JlYWQgfAorICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICAgICAgICAgICAgc2V0dGluZ3MgfCAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgc2V0dGluZ3MKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgICAgICBzc3RhYmxlX3Rhc2tzIHwgICAgICAgICAgICAgICAgY3VycmVudCBzc3RhYmxlIHRhc2tzCisgICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgICBzeXN0ZW1fcHJvcGVydGllcyB8IENhc3NhbmRyYSByZWxldmFudCBzeXN0ZW0gcHJvcGVydGllcworICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICAgICAgICB0aHJlYWRfcG9vbHMgfAorICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgIHRvbWJzdG9uZXNfcGVyX3JlYWQgfAorIHN5c3RlbV92aXJ0dWFsX3NjaGVtYSB8ICAgICAgICAgICAgICAgICAgIGNvbHVtbnMgfCAgICAgICAgICAgdmlydHVhbCBjb2x1bW4gZGVmaW5pdGlvbnMKKyBzeXN0ZW1fdmlydHVhbF9zY2hlbWEgfCAgICAgICAgICAgICAgICAga2V5c3BhY2VzIHwgICAgICAgICB2aXJ0dWFsIGtleXNwYWNlIGRlZmluaXRpb25zCisgc3lzdGVtX3ZpcnR1YWxfc2NoZW1hIHwgICAgICAgICAgICAgICAgICAgIHRhYmxlcyB8ICAgICAgICAgICAgdmlydHVhbCB0YWJsZSBkZWZpbml0aW9ucworCisoMjEgcm93cykKKy0tLS0KKworW2FyYWJpYywgc3RhcnQ9M10KKy4gVG8gdmlldyB0aGUgdmlydHVhbCB0YWJsZXMsIHJ1biB0aGUgQ1FMIGNvbW1hbmRzIGBgVVNFIHN5c3RlbV92aWV3YGAgYW5kIGBgREVTQ1JJQkUgdGFibGVzYGA6CisKK1tzb3VyY2UsIGNxbF0KKy0tLS0KK2NxbHNoPiBVU0Ugc3lzdGVtX3ZpZXc7OworY3Fsc2g+IERFU0NSSUJFIHRhYmxlczsKKy0tLS0KKworcmVzdWx0cyBpbjoKKworW3NvdXJjZSwgY3FsXQorLS0tLQorc3N0YWJsZV90YXNrcyAgICAgICBjbGllbnRzICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdG9yX3dyaXRlX2xhdGVuY3kKK2Rpc2tfdXNhZ2UgICAgICAgICAgbG9jYWxfd3JpdGVfbGF0ZW5jeSAgICAgICB0b21ic3RvbmVzX3Blcl9yZWFkCit0aHJlYWRfcG9vbHMgICAgICAgIGludGVybm9kZV9vdXRib3VuZCAgICAgICAgc2V0dGluZ3MKK2xvY2FsX3NjYW5fbGF0ZW5jeSAgY29vcmRpbmF0b3Jfc2Nhbl9sYXRlbmN5ICBzeXN0ZW1fcHJvcGVydGllcworaW50ZXJub2RlX2luYm91bmQgICBjb29yZGluYXRvcl9yZWFkX2xhdGVuY3kgIG1heF9wYXJ0aXRpb25fc2l6ZQorbG9jYWxfcmVhZF9sYXRlbmN5ICByb3dzX3Blcl9yZWFkICAgICAgICAgICAgIGNhY2hlcworLS0tLQorCitbYXJhYmljLCBzdGFydD00XQorLiBUbyBsb29rIGF0IGFueSB0YWJsZSBkYXRhLCBydW4gdGhlIENRTCBjb21tYW5kIGBgU0VMRUNUYGA6CisKK1tzb3VyY2UsIGNxbF0KKy0tLS0KK2NxbHNoPiBVU0Ugc3lzdGVtX3ZpZXc7OworY3Fsc2g+IFNFTEVDVCAqIEZST00gY2xpZW50cyBMSU1JVCAyOworLS0tLQorIHJlc3VsdHMgaW46CisKK1tzb3VyY2UsIGNxbF0KKy0tLS0KKyBhZGRyZXNzICAgfCBwb3J0ICB8IGNvbm5lY3Rpb25fc3RhZ2UgfCBkcml2ZXJfbmFtZSAgICAgICAgICAgIHwgZHJpdmVyX3ZlcnNpb24gfCBob3N0bmFtZSAgfCBwcm90b2NvbF92ZXJzaW9uIHwgcmVxdWVzdF9jb3VudCB8IHNzbF9jaXBoZXJfc3VpdGUgfCBzc2xfZW5hYmxlZCB8IHNzbF9wcm90b2NvbCB8IHVzZXJuYW1lCistLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tCisgMTI3LjAuMC4xIHwgMzczMDggfCAgICAgICAgICAgIHJlYWR5IHwgRGF0YVN0YXggUHl0aG9uIERyaXZlciB8ICAgMy4yMS4wLnBvc3QwIHwgbG9jYWxob3N0IHwgICAgICAgICAgICAgICAgNCB8ICAgICAgICAgICAgMTcgfCAgICAgICAgICAgICBudWxsIHwgICAgICAgRmFsc2UgfCAgICAgICAgIG51bGwgfCBhbm9ueW1vdXMKKyAxMjcuMC4wLjEgfCAzNzMxMCB8ICAgICAgICAgICAgcmVhZHkgfCBEYXRhU3RheCBQeXRob24gRHJpdmVyIHwgICAzLjIxLjAucG9zdDAgfCBsb2NhbGhvc3QgfCAgICAgICAgICAgICAgICA0IHwgICAgICAgICAgICAgOCB8ICAgICAgICAgICAgIG51bGwgfCAgICAgICBGYWxzZSB8ICAgICAgICAgbnVsbCB8IGFub255bW91cworCisoMiByb3dzKQorLS0tLQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL25ldy9pbmRleC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL25ldy9pbmRleC5hZG9jCmluZGV4IGE2NTQ1YTcuLjFhNjAyOGMgMTAwNjQ0Ci0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9uZXcvaW5kZXguYWRvYworKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbmV3L2luZGV4LmFkb2MKQEAgLTEsMjAgKzEsMTYgQEAKLT0gTmV3IEZlYXR1cmVzIGluIEFwYWNoZSBDYXNzYW5kcmEgNC4xCis9IE5ldyBGZWF0dXJlcwogCi1UaGlzIHNlY3Rpb24gY292ZXJzIHRoZSBuZXcgZmVhdHVyZXMgaW4gQXBhY2hlIENhc3NhbmRyYSA0LjEuCis9PSBOZXcgRmVhdHVyZXMgaW4gQXBhY2hlIENhc3NhbmRyYSA1LjAKIAorVGhpcyBzZWN0aW9uIGNvdmVycyB0aGUgbmV3IGZlYXR1cmVzIGluIEFwYWNoZSBDYXNzYW5kcmEgNS4wLgogCi0qIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTE3MTY0W1BheG9zIHYyXQotKiBsaW5rOi9fL2Jsb2cvQXBhY2hlLUNhc3NhbmRyYS00LjEtRmVhdHVyZXMtR3VhcmRyYWlscy1GcmFtZXdvcmsuaHRtbFtHdWFyZHJhaWxzXQotKiBsaW5rOi9fL2Jsb2cvQXBhY2hlLUNhc3NhbmRyYS00LjEtQ29uZmlndXJhdGlvbi1TdGFuZGFyZGl6YXRpb24uaHRtbFtOZXcgYW5kIEltcHJvdmVkIENvbmZpZ3VyYXRpb24gRm9ybWF0XQotKiBsaW5rOi9fL2Jsb2cvQXBhY2hlLUNhc3NhbmRyYS00LjEtRmVhdHVyZXMtQ2xpZW50LXNpZGUtUGFzc3dvcmQtSGFzaGluZy5odG1sW0NsaWVudC1zaWRlIFBhc3N3b3JkIEhhc2hpbmddCi0qIGxpbms6L18vYmxvZy9BcGFjaGUtQ2Fzc2FuZHJhLTQuMS1EZW55bGlzdGluZy1QYXJ0aXRpb25zLmh0bWxbUGFydGl0aW9uIERlbnlsaXN0XQotKiBMb3RzIG9mIENRTCBpbXByb3ZlbWVudHMKLSogbGluazovXy9ibG9nL0FwYWNoZS1DYXNzYW5kcmEtNC4xLU5ldy1TU1RhYmxlLUlkZW50aWZpZXJzLmh0bWxbTmV3IFNTVGFibGUgSWRlbnRpZmllcnNdCi0qIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTE3NDIzW05hdGl2ZSBUcmFuc3BvcnQgcmF0ZSBsaW1pdGluZ10KLSogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMTYzMTBbVG9wIHBhcnRpdGlvbiB0cmFja2luZyBwZXIgdGFibGVdCi0qIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTE0MzA5W0hpbnQgV2luZG93IGNvbnNpc3RlbmN5XQotKiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS0xNzA0NFtQbHVnZ2FiaWxpdHldCi0qKiBsaW5rOi9fL2Jsb2cvQXBhY2hlLUNhc3NhbmRyYS00LjEtRmVhdHVyZXMtUGx1Z2dhYmxlLU1lbXRhYmxlLUltcGxlbWVudGF0aW9ucy5odG1sW01lbXRhYmxlXQotKiogRW5jcnlwdGlvbgotKiogbGluazovXy9ibG9nL0FwYWNoZS1DYXNzYW5kcmEtNC4xLUZlYXR1cmVzLUF1dGhlbnRpY2F0aW9uLVBsdWdpbi1TdXBwb3J0LWZvci1DUUxTSC5odG1sW0NRTFNIIEF1dGhlbnRpY2F0aW9uXQotKiBhbmQgbXVjaCBsaW5rOmh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhL2Jsb2IvY2Fzc2FuZHJhLTQuMS9ORVdTLnR4dFttb3JlXQorKiBodHRwczovL2N3aWtpLmFwYWNoZS5vcmcvY29uZmx1ZW5jZS94L0ZRUkFDd1tBQ0lEIFRyYW5zYWN0aW9ucyAoQWNjb3JkKV0KKyogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMTYwNTJbU3RvcmFnZSBBdHRhY2hlZCBJbmRleGVzXQorKiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS0xNzI0MFtUcmllIE1lbXRhYmxlc10KKyogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEvYmxvYi90cnVuay9ORVdTLnR4dFtNb3JlIEd1YXJkcmFpbHNdCisqIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTg4NzdbVFRMIGFuZCB3cml0ZXRpbWUgb24gY29sbGVjdGlvbnMgYW5kIFVEVHNdCisqIGh0dHBzOi8vY3dpa2kuYXBhY2hlLm9yZy9jb25mbHVlbmNlL3gvWXlEMURbVHJhbnNhY3Rpb25hbCBDbHVzdGVyIE1ldGFkYXRhXQorKiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS0xNjg5NVtKREsgMTddCisqIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTE3MjIxW0FkZCBuZXcgTWF0aGVtYXRpY2FsIENRTCBmdW5jdGlvbnM6IGFicywgZXhwLCBsb2csIGxvZzEwIGFuZCByb3VuZF0KKyogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMTgwNjBbQWRkZWQgbmV3IENRTCBuYXRpdmUgc2NhbGFyIGZ1bmN0aW9ucyBmb3IgY29sbGVjdGlvbnNdIAorKiogVGhlIG5ldyBmdW5jdGlvbnMgYXJlIG1vc3RseSBhbmFsb2dvdXMgdG8gdGhlIGV4aXN0aW5nIGFnZ3JlZ2F0aW9uIGZ1bmN0aW9ucywgYnV0IHRoZXkgb3BlcmF0ZSBvbiB0aGUgZWxlbWVudHMgb2YgY29sbGVjdGlvbiBjb2x1bW5zLiBUaGUgbmV3IGZ1bmN0aW9ucyBhcmUgYG1hcF9rZXlzYCwgYG1hcF92YWx1ZXNgLCBgY29sbGVjdGlvbl9jb3VudGAsIGBjb2xsZWN0aW9uX21pbmAsIGBjb2xsZWN0aW9uX21heGAsIGBjb2xsZWN0aW9uX3N1bWAgYW5kIGBjb2xsZWN0aW9uX2F2Z2AuCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbmV3L3ZpcnR1YWx0YWJsZXMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9uZXcvdmlydHVhbHRhYmxlcy5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTdhNGJlLi4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9uZXcvdmlydHVhbHRhYmxlcy5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsNTE3ICswLDAgQEAKLT0gVmlydHVhbCBUYWJsZXMKLQotQXBhY2hlIENhc3NhbmRyYSA0LjAgaW1wbGVtZW50cyB2aXJ0dWFsIHRhYmxlcyAoaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtNzYyMltDQVNTQU5EUkEtNzYyMl0pLgotVmlydHVhbCB0YWJsZXMgYXJlIHRhYmxlcyBiYWNrZWQgYnkgYW4gQVBJIGluc3RlYWQgb2YgZGF0YSBleHBsaWNpdGx5IG1hbmFnZWQgYW5kIHN0b3JlZCBhcyBTU1RhYmxlcy4gCi1BcGFjaGUgQ2Fzc2FuZHJhIDQuMCBpbXBsZW1lbnRzIGEgdmlydHVhbCBrZXlzcGFjZSBpbnRlcmZhY2UgZm9yIHZpcnR1YWwgdGFibGVzLiAKLVZpcnR1YWwgdGFibGVzIGFyZSBzcGVjaWZpYyB0byBlYWNoIG5vZGUuCi0KLVNvbWUgb2YgdGhlIGZlYXR1cmVzIG9mIHZpcnR1YWwgdGFibGVzIGFyZSB0aGUgYWJpbGl0eSB0bzoKLQotKiBleHBvc2UgbWV0cmljcyB0aHJvdWdoIENRTAotKiBleHBvc2UgWUFNTCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCi0KLVZpcnR1YWwga2V5c3BhY2VzIGFuZCB0YWJsZXMgYXJlIHF1aXRlIGRpZmZlcmVudCBmcm9tIHJlZ3VsYXIgdGFibGVzIGFuZCBrZXlzcGFjZXM6Ci0KLSogVmlydHVhbCB0YWJsZXMgYXJlIGNyZWF0ZWQgaW4gc3BlY2lhbCBrZXlzcGFjZXMgYW5kIG5vdCBqdXN0IGFueSBrZXlzcGFjZS4KLSogVmlydHVhbCB0YWJsZXMgYXJlIG1hbmFnZWQgYnkgQ2Fzc2FuZHJhLiBVc2VycyBjYW5ub3QgcnVuIERETCB0byBjcmVhdGUgbmV3IHZpcnR1YWwgdGFibGVzIG9yIERNTCB0byBtb2RpZnkgZXhpc3RpbmcgdmlydHVhbCB0YWJsZXMuCi0qIFZpcnR1YWwgdGFibGVzIGFyZSBjdXJyZW50bHkgcmVhZC1vbmx5LCBhbHRob3VnaCB0aGF0IG1heSBjaGFuZ2UgaW4gYSBsYXRlciB2ZXJzaW9uLgotKiBWaXJ0dWFsIHRhYmxlcyBhcmUgbG9jYWwgb25seSwgbm9uLWRpc3RyaWJ1dGVkLCBhbmQgdGh1cyBub3QgcmVwbGljYXRlZC4KLSogVmlydHVhbCB0YWJsZXMgaGF2ZSBubyBhc3NvY2lhdGVkIFNTVGFibGVzLgotKiBDb25zaXN0ZW5jeSBsZXZlbCBvZiB0aGUgcXVlcmllcyBzZW50IHRvIHZpcnR1YWwgdGFibGVzIGFyZSBpZ25vcmVkLgotKiBBbGwgZXhpc3RpbmcgdmlydHVhbCB0YWJsZXMgdXNlIGBMb2NhbFBhcnRpdGlvbmVyYC4gCi1TaW5jZSBhIHZpcnR1YWwgdGFibGUgaXMgbm90IHJlcGxpY2F0ZWQgdGhlIHBhcnRpdGlvbmVyIHNvcnRzIGluIG9yZGVyIG9mIHBhcnRpdGlvbiBrZXlzIGluc3RlYWQgb2YgYnkgdGhlaXIgaGFzaC4KLSogTWFraW5nIGFkdmFuY2VkIHF1ZXJpZXMgdXNpbmcgYEFMTE9XIEZJTFRFUklOR2AgYW5kIGFnZ3JlZ2F0aW9uIGZ1bmN0aW9ucyBjYW4gYmUgZXhlY3V0ZWQgaW4gdmlydHVhbCB0YWJsZXMsIGV2ZW4gdGhvdWdoIGluIG5vcm1hbCB0YWJsZXMgd2UgZG9udCByZWNvbW1lbmQgaXQuCi0KLT09IFZpcnR1YWwgS2V5c3BhY2VzCi0KLUFwYWNoZSBDYXNzYW5kcmEgNC4wIGhhcyBhZGRlZCB0d28gbmV3IGtleXNwYWNlcyBmb3IgdmlydHVhbCB0YWJsZXM6Ci0KLSogYHN5c3RlbV92aXJ0dWFsX3NjaGVtYWAgCi0qIGBzeXN0ZW1fdmlld3NgLiAKLQotVGhlIGBzeXN0ZW1fdmlydHVhbF9zY2hlbWFgIGtleXNwYWNlIGhhcyB0aHJlZSB0YWJsZXM6IGBrZXlzcGFjZXNgLAotYGNvbHVtbnNgIGFuZCBgdGFibGVzYCBmb3IgdGhlIHZpcnR1YWwga2V5c3BhY2UsIHRhYmxlLCBhbmQgY29sdW1uIGRlZmluaXRpb25zLCByZXNwZWN0aXZlbHkuCi1UaGVzZSB0YWJsZXMgY29udGFpbiBzY2hlbWEgaW5mb3JtYXRpb24gZm9yIHRoZSB2aXJ0dWFsIHRhYmxlcy4KLUl0IGlzIHVzZWQgYnkgQ2Fzc2FuZHJhIGludGVybmFsbHkgYW5kIGEgdXNlciBzaG91bGQgbm90IGFjY2VzcyBpdCBkaXJlY3RseS4KLQotVGhlIGBzeXN0ZW1fdmlld3NgIGtleXNwYWNlIGNvbnRhaW5zIHRoZSBhY3R1YWwgdmlydHVhbCB0YWJsZXMuCi0KLT09IFZpcnR1YWwgVGFibGUgTGltaXRhdGlvbnMKLQotQmVmb3JlIGRpc2NjdXNpbmcgdmlydHVhbCBrZXlzcGFjZXMgYW5kIHRhYmxlcywgbm90ZSB0aGF0IHZpcnR1YWwga2V5c3BhY2VzIGFuZCB0YWJsZXMgaGF2ZSBzb21lIGxpbWl0YXRpb25zLiAKLVRoZXNlIGxpbWl0YXRpb25zIGFyZSBzdWJqZWN0IHRvIGNoYW5nZS4KLVZpcnR1YWwga2V5c3BhY2VzIGNhbm5vdCBiZSBhbHRlcmVkIG9yIGRyb3BwZWQuIAotSW4gZmFjdCwgbm8gb3BlcmF0aW9ucyBjYW4gYmUgcGVyZm9ybWVkIGFnYWluc3QgdmlydHVhbCBrZXlzcGFjZXMuCi0KLVZpcnR1YWwgdGFibGVzIGNhbm5vdCBiZSBjcmVhdGVkIGluIHZpcnR1YWwga2V5c3BhY2VzLgotVmlydHVhbCB0YWJsZXMgY2Fubm90IGJlIGFsdGVyZWQsIGRyb3BwZWQsIG9yIHRydW5jYXRlZC4KLVNlY29uZGFyeSBpbmRleGVzLCB0eXBlcywgZnVuY3Rpb25zLCBhZ2dyZWdhdGVzLCBtYXRlcmlhbGl6ZWQgdmlld3MsIGFuZCB0cmlnZ2VycyBjYW5ub3QgYmUgY3JlYXRlZCBmb3IgdmlydHVhbCB0YWJsZXMuCi1FeHBpcmluZyB0aW1lLXRvLWxpdmUgKFRUTCkgY29sdW1ucyBjYW5ub3QgYmUgY3JlYXRlZC4KLVZpcnR1YWwgdGFibGVzIGRvIG5vdCBzdXBwb3J0IGNvbmRpdGlvbmFsIHVwZGF0ZXMgb3IgZGVsZXRlcy4KLUFnZ3JlZ2F0ZXMgbWF5IGJlIHJ1biBpbiBTRUxFQ1Qgc3RhdGVtZW50cy4KLQotQ29uZGl0aW9uYWwgYmF0Y2ggc3RhdGVtZW50cyBjYW5ub3QgaW5jbHVkZSBtdXRhdGlvbnMgZm9yIHZpcnR1YWwgdGFibGVzLCBub3IgY2FuIGEgdmlydHVhbCB0YWJsZSBzdGF0ZW1lbnQgYmUgaW5jbHVkZWQgaW4gYSBsb2dnZWQgYmF0Y2guCi1JbiBmYWN0LCBtdXRhdGlvbnMgZm9yIHZpcnR1YWwgYW5kIHJlZ3VsYXIgdGFibGVzIGNhbm5vdCBvY2N1ciBpbiB0aGUgc2FtZSBiYXRjaCB0YWJsZS4KLQotPT0gVmlydHVhbCBUYWJsZXMKLQotRWFjaCBvZiB0aGUgdmlydHVhbCB0YWJsZXMgaW4gdGhlIGBzeXN0ZW1fdmlld3NgIHZpcnR1YWwga2V5c3BhY2UgY29udGFpbiBkaWZmZXJlbnQgaW5mb3JtYXRpb24uCi0KLVRoZSBmb2xsb3dpbmcgdGFibGUgZGVzY3JpYmVzIHRoZSB2aXJ0dWFsIHRhYmxlczogCi0KLVt3aWR0aD0iOTglIixjb2xzPSIyNyUsNzMlIixdCi18PT09Ci18VmlydHVhbCBUYWJsZSB8RGVzY3JpcHRpb24KLQotfGNhY2hlcyB8RGlzcGxheXMgdGhlIGdlbmVyYWwgY2FjaGUgaW5mb3JtYXRpb24gaW5jbHVkaW5nIGNhY2hlIG5hbWUsIGNhcGFjaXR5X2J5dGVzLCBlbnRyeV9jb3VudCwgaGl0X2NvdW50LCBoaXRfcmF0aW8gZG91YmxlLAotcmVjZW50X2hpdF9yYXRlX3Blcl9zZWNvbmQsIHJlY2VudF9yZXF1ZXN0X3JhdGVfcGVyX3NlY29uZCwgcmVxdWVzdF9jb3VudCwgYW5kIHNpemVfYnl0ZXMuCi0KLXxjbGllbnRzIHxMaXN0cyBpbmZvcm1hdGlvbiBhYm91dCBhbGwgY29ubmVjdGVkIGNsaWVudHMuCi0KLXxjb29yZGluYXRvcl9yZWFkX2xhdGVuY3kgfFJlY29yZHMgY291bnRzLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBtYXgsIG1lZGlhbiwgYW5kIHBlcl9zZWNvbmQgZm9yIGNvb3JkaW5hdG9yIHJlYWRzLgotCi18Y29vcmRpbmF0b3Jfc2NhbiB8UmVjb3JkcyBjb3VudHMsIGtleXNwYWNlX25hbWUsIHRhYmxlX25hbWUsIG1heCwgbWVkaWFuLCBhbmQgcGVyX3NlY29uZCBmb3IgY29vcmRpbmF0b3Igc2NhbnMuCi0KLXxjb29yZGluYXRvcl93cml0ZV9sYXRlbmN5IHxSZWNvcmRzIGNvdW50cywga2V5c3BhY2VfbmFtZSwgdGFibGVfbmFtZSwgbWF4LCBtZWRpYW4sIGFuZCBwZXJfc2Vjb25kIGZvciBjb29yZGluYXRvciB3cml0ZXMuCi0KLXxjcWxfbWV0cmljcyB8TWV0cmljcyBzcGVjaWZpYyB0byBDUUwgcHJlcGFyZWQgc3RhdGVtZW50IGNhY2hpbmcuCi0KLXxkaXNrX3VzYWdlIHxSZWNvcmRzIGRpc2sgdXNhZ2UgaW5jbHVkaW5nIGRpc2tfc3BhY2UsIGtleXNwYWNlX25hbWUsIGFuZCB0YWJsZV9uYW1lLCBzb3J0ZWQgYnkgc3lzdGVtIGtleXNwYWNlcy4KLQotfGdvc3NpcF9pbmZvIHxMaXN0cyB0aGUgZ29zc2lwIGluZm9ybWF0aW9uIGZvciB0aGUgY2x1c3Rlci4KLQotfGludGVybm9kZV9pbmJvdW5kIHxMaXN0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5ib3VuZCBpbnRlcm5vZGUgbWVzc2FnaW5nLgotCi18aW50ZXJub2RlX291dGJvdW5kIHxJbmZvcm1hdGlvbiBhYm91dCB0aGUgb3V0Ym91bmQgaW50ZXJub2RlIG1lc3NhZ2luZy4KLQotfGxvY2FsX3JlYWRfbGF0ZW5jeSB8UmVjb3JkcyBjb3VudHMsIGtleXNwYWNlX25hbWUsIHRhYmxlX25hbWUsIG1heCwgbWVkaWFuLCBhbmQgcGVyX3NlY29uZCBmb3IgbG9jYWwgcmVhZHMuCi0KLXxsb2NhbF9zY2FuIHxSZWNvcmRzIGNvdW50cywga2V5c3BhY2VfbmFtZSwgdGFibGVfbmFtZSwgbWF4LCBtZWRpYW4sIGFuZCBwZXJfc2Vjb25kIGZvciBsb2NhbCBzY2Fucy4KLQotfGxvY2FsX3dyaXRlX2xhdGVuY3kgfFJlY29yZHMgY291bnRzLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBtYXgsIG1lZGlhbiwgYW5kIHBlcl9zZWNvbmQgZm9yIGxvY2FsIHdyaXRlcy4KLQotfG1heF9wYXJ0aXRpb25fc2l6ZSB8QSB0YWJsZSBtZXRyaWMgZm9yIG1heGltdW0gcGFydGl0aW9uIHNpemUuCi0KLXxyb3dzX3Blcl9yZWFkIHxSZWNvcmRzIGNvdW50cywga2V5c3BhY2VfbmFtZSwgdGFibGVrX25hbWUsIG1heCwgYW5kIG1lZGlhbiBmb3Igcm93cyByZWFkLgotCi18c2V0dGluZ3MgfERpc3BsYXlzIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgaW4gY2Fzc2FuZHJhLnlhbWwuCi0KLXxzc3RhYmxlX3Rhc2tzIHxMaXN0cyBjdXJyZW50bHkgcnVubmluZyB0YXNrcyBhbmQgcHJvZ3Jlc3Mgb24gU1NUYWJsZXMsIGZvciBvcGVyYXRpb25zIGxpa2UgY29tcGFjdGlvbiBhbmQgdXBncmFkZS4KLQotfHN5c3RlbV9wcm9wZXJ0aWVzIHxEaXNwbGF5cyBlbnZpcm9ubWVudGFsIHN5c3RlbSBwcm9wZXJ0aWVzIHNldCBvbiB0aGUgbm9kZS4KLQotfHRocmVhZF9wb29scyB8TGlzdHMgbWV0cmljcyBmb3IgZWFjaCB0aHJlYWQgcG9vbC4KLQotfHRvbWJzdG9uZXNfcGVyX3JlYWQgfFJlY29yZHMgY291bnRzLCBrZXlzcGFjZV9uYW1lLCB0YWJsZWtfbmFtZSwgbWF4LCBhbmQgbWVkaWFuIGZvciB0b21ic3RvbmVzLgotCi18PT09Ci0KLVdlIHNoYWxsIGRpc2N1c3Mgc29tZSBvZiB0aGUgdmlydHVhbCB0YWJsZXMgaW4gbW9yZSBkZXRhaWwgbmV4dC4KLQotPT09IENsaWVudHMgVmlydHVhbCBUYWJsZQotCi1UaGUgYGNsaWVudHNgIHZpcnR1YWwgdGFibGUgbGlzdHMgYWxsIGFjdGl2ZSBjb25uZWN0aW9ucyAoY29ubmVjdGVkCi1jbGllbnRzKSBpbmNsdWRpbmcgdGhlaXIgaXAgYWRkcmVzcywgcG9ydCwgY2xpZW50X29wdGlvbnMsIGNvbm5lY3Rpb24gc3RhZ2UsIGRyaXZlcgotbmFtZSwgZHJpdmVyIHZlcnNpb24sIGhvc3RuYW1lLCBwcm90b2NvbCB2ZXJzaW9uLCByZXF1ZXN0IGNvdW50LCBzc2wKLWVuYWJsZWQsIHNzbCBwcm90b2NvbCBhbmQgdXNlciBuYW1lOgotCi0uLi4uCi1jcWxzaD4gRVhQQU5EIE9OIDsKLU5vdyBFeHBhbmRlZCBvdXRwdXQgaXMgZW5hYmxlZAotY3Fsc2g+IFNFTEVDVCAqIEZST00gc3lzdGVtX3ZpZXdzLmNsaWVudHM7Ci0KLUAgUm93IDEKLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIGFkZHJlc3MgICAgICAgICAgfCAxMjcuMC4wLjEKLSBwb3J0ICAgICAgICAgICAgIHwgNTA2ODcKLSBjbGllbnRfb3B0aW9ucyAgIHwgeydDUUxfVkVSU0lPTic6ICczLjQuNicsICdEUklWRVJfTkFNRSc6ICdEYXRhU3RheCBQeXRob24gRHJpdmVyJywgJ0RSSVZFUl9WRVJTSU9OJzogJzMuMjUuMCd9Ci0gY29ubmVjdGlvbl9zdGFnZSB8IHJlYWR5Ci0gZHJpdmVyX25hbWUgICAgICB8IERhdGFTdGF4IFB5dGhvbiBEcml2ZXIKLSBkcml2ZXJfdmVyc2lvbiAgIHwgMy4yNS4wCi0gaG9zdG5hbWUgICAgICAgICB8IGxvY2FsaG9zdAotIHByb3RvY29sX3ZlcnNpb24gfCA1Ci0gcmVxdWVzdF9jb3VudCAgICB8IDE2Ci0gc3NsX2NpcGhlcl9zdWl0ZSB8IG51bGwKLSBzc2xfZW5hYmxlZCAgICAgIHwgRmFsc2UKLSBzc2xfcHJvdG9jb2wgICAgIHwgbnVsbAotIHVzZXJuYW1lICAgICAgICAgfCBhbm9ueW1vdXMKLQotQCBSb3cgMgotLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gYWRkcmVzcyAgICAgICAgICB8IDEyNy4wLjAuMQotIHBvcnQgICAgICAgICAgICAgfCA1MDY4OAotIGNsaWVudF9vcHRpb25zICAgfCB7J0NRTF9WRVJTSU9OJzogJzMuNC42JywgJ0RSSVZFUl9OQU1FJzogJ0RhdGFTdGF4IFB5dGhvbiBEcml2ZXInLCAnRFJJVkVSX1ZFUlNJT04nOiAnMy4yNS4wJ30KLSBjb25uZWN0aW9uX3N0YWdlIHwgcmVhZHkKLSBkcml2ZXJfbmFtZSAgICAgIHwgRGF0YVN0YXggUHl0aG9uIERyaXZlcgotIGRyaXZlcl92ZXJzaW9uICAgfCAzLjI1LjAKLSBob3N0bmFtZSAgICAgICAgIHwgbG9jYWxob3N0Ci0gcHJvdG9jb2xfdmVyc2lvbiB8IDUKLSByZXF1ZXN0X2NvdW50ICAgIHwgNAotIHNzbF9jaXBoZXJfc3VpdGUgfCBudWxsCi0gc3NsX2VuYWJsZWQgICAgICB8IEZhbHNlCi0gc3NsX3Byb3RvY29sICAgICB8IG51bGwKLSB1c2VybmFtZSAgICAgICAgIHwgYW5vbnltb3VzCi0KLUAgUm93IDMKLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIGFkZHJlc3MgICAgICAgICAgfCAxMjcuMC4wLjEKLSBwb3J0ICAgICAgICAgICAgIHwgNTA3NTMKLSBjbGllbnRfb3B0aW9ucyAgIHwgeydBUFBMSUNBVElPTl9OQU1FJzogJ1Rlc3RBcHAnLCAnQVBQTElDQVRJT05fVkVSU0lPTic6ICcxLjAuMCcsICdDTElFTlRfSUQnOiAnNTViM2VmYmQtYzU2Yi00NjlkLThjY2EtMDE2Yjg2MGIyZjAzJywgJ0NRTF9WRVJTSU9OJzogJzMuMC4wJywgJ0RSSVZFUl9OQU1FJzogJ0RhdGFTdGF4IEphdmEgZHJpdmVyIGZvciBBcGFjaGUgQ2Fzc2FuZHJhKFIpJywgJ0RSSVZFUl9WRVJTSU9OJzogJzQuMTMuMCd9Ci0gY29ubmVjdGlvbl9zdGFnZSB8IHJlYWR5Ci0gZHJpdmVyX25hbWUgICAgICB8IERhdGFTdGF4IEphdmEgZHJpdmVyIGZvciBBcGFjaGUgQ2Fzc2FuZHJhKFIpCi0gZHJpdmVyX3ZlcnNpb24gICB8IDQuMTMuMAotIGhvc3RuYW1lICAgICAgICAgfCBsb2NhbGhvc3QKLSBwcm90b2NvbF92ZXJzaW9uIHwgNQotIHJlcXVlc3RfY291bnQgICAgfCAxOAotIHNzbF9jaXBoZXJfc3VpdGUgfCBudWxsCi0gc3NsX2VuYWJsZWQgICAgICB8IEZhbHNlCi0gc3NsX3Byb3RvY29sICAgICB8IG51bGwKLSB1c2VybmFtZSAgICAgICAgIHwgYW5vbnltb3VzCi0KLUAgUm93IDQKLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIGFkZHJlc3MgICAgICAgICAgfCAxMjcuMC4wLjEKLSBwb3J0ICAgICAgICAgICAgIHwgNTA3NTUKLSBjbGllbnRfb3B0aW9ucyAgIHwgeydBUFBMSUNBVElPTl9OQU1FJzogJ1Rlc3RBcHAnLCAnQVBQTElDQVRJT05fVkVSU0lPTic6ICcxLjAuMCcsICdDTElFTlRfSUQnOiAnNTViM2VmYmQtYzU2Yi00NjlkLThjY2EtMDE2Yjg2MGIyZjAzJywgJ0NRTF9WRVJTSU9OJzogJzMuMC4wJywgJ0RSSVZFUl9OQU1FJzogJ0RhdGFTdGF4IEphdmEgZHJpdmVyIGZvciBBcGFjaGUgQ2Fzc2FuZHJhKFIpJywgJ0RSSVZFUl9WRVJTSU9OJzogJzQuMTMuMCd9Ci0gY29ubmVjdGlvbl9zdGFnZSB8IHJlYWR5Ci0gZHJpdmVyX25hbWUgICAgICB8IERhdGFTdGF4IEphdmEgZHJpdmVyIGZvciBBcGFjaGUgQ2Fzc2FuZHJhKFIpCi0gZHJpdmVyX3ZlcnNpb24gICB8IDQuMTMuMAotIGhvc3RuYW1lICAgICAgICAgfCBsb2NhbGhvc3QKLSBwcm90b2NvbF92ZXJzaW9uIHwgNQotIHJlcXVlc3RfY291bnQgICAgfCA3Ci0gc3NsX2NpcGhlcl9zdWl0ZSB8IG51bGwKLSBzc2xfZW5hYmxlZCAgICAgIHwgRmFsc2UKLSBzc2xfcHJvdG9jb2wgICAgIHwgbnVsbAotIHVzZXJuYW1lICAgICAgICAgfCBhbm9ueW1vdXMKLQotKDQgcm93cykKLS4uLi4KLQotU29tZSBleGFtcGxlcyBvZiBob3cgYGNsaWVudHNgIGNhbiBiZSB1c2VkIGFyZToKLQotKiBUbyBmaW5kIGFwcGxpY2F0aW9ucyB1c2luZyBvbGQgaW5jb21wYXRpYmxlIHZlcnNpb25zIG9mIGRyaXZlcnMgYmVmb3JlCi11cGdyYWRpbmcgYW5kIHdpdGggYG5vZGV0b29sIGVuYWJsZW9sZHByb3RvY29sdmVyc2lvbnNgIGFuZAotYG5vZGV0b29sIGRpc2FibGVvbGRwcm90b2NvbHZlcnNpb25zYCBkdXJpbmcgdXBncmFkZXMuCi0qIFRvIGlkZW50aWZ5IGNsaWVudHMgc2VuZGluZyB0b28gbWFueSByZXF1ZXN0cy4KLSogVG8gZmluZCBpZiBTU0wgaXMgZW5hYmxlZCBkdXJpbmcgdGhlIG1pZ3JhdGlvbiB0byBhbmQgZnJvbSBzc2wuCi0qIFRvIGlkZW50aWZ5IGFsbCBvcHRpb25zIHRoZSBjbGllbnQgaXMgc2VuZGluZywgZS5nLiBBUFBMSUNBVElPTl9OQU1FIGFuZCBBUFBMSUNBVElPTl9WRVJTSU9OCi0KLVRoZSB2aXJ0dWFsIHRhYmxlcyBtYXkgYmUgZGVzY3JpYmVkIHdpdGggYERFU0NSSUJFYCBzdGF0ZW1lbnQuIFRoZSBEREwKLWxpc3RlZCBob3dldmVyIGNhbm5vdCBiZSBydW4gdG8gY3JlYXRlIGEgdmlydHVhbCB0YWJsZS4gQXMgYW4gZXhhbXBsZQotZGVzY3JpYmUgdGhlIGBzeXN0ZW1fdmlld3MuY2xpZW50c2AgdmlydHVhbCB0YWJsZToKLQotLi4uLgotY3Fsc2g+IERFU0NSSUJFIFRBQkxFIHN5c3RlbV92aWV3cy5jbGllbnRzOwotCi0vKgotV2FybmluZzogVGFibGUgc3lzdGVtX3ZpZXdzLmNsaWVudHMgaXMgYSB2aXJ0dWFsIHRhYmxlIGFuZCBjYW5ub3QgYmUgcmVjcmVhdGVkIHdpdGggQ1FMLgotU3RydWN0dXJlLCBmb3IgcmVmZXJlbmNlOgotVklSVFVBTCBUQUJMRSBzeXN0ZW1fdmlld3MuY2xpZW50cyAoCi0gICAgYWRkcmVzcyBpbmV0LAotICAgIHBvcnQgaW50LAotICAgIGNsaWVudF9vcHRpb25zIGZyb3plbjxtYXA8dGV4dCwgdGV4dD4+LAotICAgIGNvbm5lY3Rpb25fc3RhZ2UgdGV4dCwKLSAgICBkcml2ZXJfbmFtZSB0ZXh0LAotICAgIGRyaXZlcl92ZXJzaW9uIHRleHQsCi0gICAgaG9zdG5hbWUgdGV4dCwKLSAgICBwcm90b2NvbF92ZXJzaW9uIGludCwKLSAgICByZXF1ZXN0X2NvdW50IGJpZ2ludCwKLSAgICBzc2xfY2lwaGVyX3N1aXRlIHRleHQsCi0gICAgc3NsX2VuYWJsZWQgYm9vbGVhbiwKLSAgICBzc2xfcHJvdG9jb2wgdGV4dCwKLSAgICB1c2VybmFtZSB0ZXh0LAotICAgIFBSSU1BUlkgS0VZIChhZGRyZXNzLCBwb3J0KQotKSBXSVRIIENMVVNURVJJTkcgT1JERVIgQlkgKHBvcnQgQVNDKQotICAgIEFORCBjb21tZW50ID0gJ2N1cnJlbnRseSBjb25uZWN0ZWQgY2xpZW50cyc7Ci0qLwotLi4uLgotCi09PT0gQ2FjaGVzIFZpcnR1YWwgVGFibGUKLQotVGhlIGBjYWNoZXNgIHZpcnR1YWwgdGFibGUgbGlzdHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhY2hlcy4gVGhlIGZvdXIKLWNhY2hlcyBwcmVzZW50bHkgY3JlYXRlZCBhcmUgY2h1bmtzLCBjb3VudGVycywga2V5cyBhbmQgcm93cy4gQSBxdWVyeSBvbgotdGhlIGBjYWNoZXNgIHZpcnR1YWwgdGFibGUgcmV0dXJucyB0aGUgZm9sbG93aW5nIGRldGFpbHM6Ci0KLS4uLi4KLWNxbHNoOnN5c3RlbV92aWV3cz4gU0VMRUNUICogRlJPTSBzeXN0ZW1fdmlld3MuY2FjaGVzOwotbmFtZSAgICAgfCBjYXBhY2l0eV9ieXRlcyB8IGVudHJ5X2NvdW50IHwgaGl0X2NvdW50IHwgaGl0X3JhdGlvIHwgcmVjZW50X2hpdF9yYXRlX3Blcl9zZWNvbmQgfCByZWNlbnRfcmVxdWVzdF9yYXRlX3Blcl9zZWNvbmQgfCByZXF1ZXN0X2NvdW50IHwgc2l6ZV9ieXRlcwotLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0KLSAgY2h1bmtzIHwgICAgICAyMjk2MzgxNDQgfCAgICAgICAgICAyOSB8ICAgICAgIDE2NiB8ICAgICAgMC44MyB8ICAgICAgICAgICAgICAgICAgICAgICAgICA1IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2IHwgICAgICAgICAgIDIwMCB8ICAgICA0NzUxMzYKLWNvdW50ZXJzIHwgICAgICAgMjYyMTQ0MDAgfCAgICAgICAgICAgMCB8ICAgICAgICAgMCB8ICAgICAgIE5hTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgIDAKLSAgICBrZXlzIHwgICAgICAgNTI0Mjg4MDAgfCAgICAgICAgICAxNCB8ICAgICAgIDEyNCB8ICAwLjg3MzIzOSB8ICAgICAgICAgICAgICAgICAgICAgICAgICA0IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0IHwgICAgICAgICAgIDE0MiB8ICAgICAgIDEyNDgKLSAgICByb3dzIHwgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgMCB8ICAgICAgICAgMCB8ICAgICAgIE5hTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgIDAKLQotKDQgcm93cykKLS4uLi4KLQotPT09IENRTCBtZXRyaWNzIFZpcnR1YWwgVGFibGUKLVRoZSBgY3FsX21ldHJpY3NgIHZpcnR1YWwgdGFibGUgbGlzdHMgbWV0cmljcyBzcGVjaWZpYyB0byBDUUwgcHJlcGFyZWQgc3RhdGVtZW50IGNhY2hpbmcuIEEgcXVlcnkgb24gYGNxbF9tZXRyaWNzYCB2aXJ0dWFsIHRhYmxlIGxpc3RzIGJlbG93IG1ldHJpY3MuCi0KLS4uLi4KLWNxbHNoPiBzZWxlY3QgKiBmcm9tIHN5c3RlbV92aWV3cy5jcWxfbWV0cmljcyA7Ci0KLSBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tCi0gICAgcHJlcGFyZWRfc3RhdGVtZW50c19jb3VudCB8ICAgICAwCi0gIHByZXBhcmVkX3N0YXRlbWVudHNfZXZpY3RlZCB8ICAgICAwCi0gcHJlcGFyZWRfc3RhdGVtZW50c19leGVjdXRlZCB8ICAgICAwCi0gICAgcHJlcGFyZWRfc3RhdGVtZW50c19yYXRpbyB8ICAgICAwCi0gIHJlZ3VsYXJfc3RhdGVtZW50c19leGVjdXRlZCB8ICAgIDE3Ci0uLi4uCi0KLT09PSBTZXR0aW5ncyBWaXJ0dWFsIFRhYmxlCi0KLVRoZSBgc2V0dGluZ3NgIHRhYmxlIGlzIHJhdGhlciB1c2VmdWwgYW5kIGxpc3RzIGFsbCB0aGUgY3VycmVudAotY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmcm9tIHRoZSBgY2Fzc2FuZHJhLnlhbWxgLiBUaGUgZW5jcnlwdGlvbiBvcHRpb25zCi1hcmUgb3ZlcnJpZGRlbiB0byBoaWRlIHRoZSBzZW5zaXRpdmUgdHJ1c3RzdG9yZSBpbmZvcm1hdGlvbiBvcgotcGFzc3dvcmRzLiBUaGUgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBob3dldmVyIGNhbm5vdCBiZSBzZXQgdXNpbmcgRE1MIG9uCi10aGUgdmlydHVhbCB0YWJsZSBwcmVzZW50bHk6IDoKLQotLi4uLgotY3Fsc2g6c3lzdGVtX3ZpZXdzPiBTRUxFQ1QgKiBGUk9NIHN5c3RlbV92aWV3cy5zZXR0aW5nczsKLQotbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgYWxsb2NhdGVfdG9rZW5zX2Zvcl9rZXlzcGFjZSAgICAgICB8IG51bGwKLSAgYXVkaXRfbG9nZ2luZ19vcHRpb25zX2VuYWJsZWQgICAgICB8IGZhbHNlCi0gIGF1dG9fc25hcHNob3QgICAgICAgICAgICAgICAgICAgICAgfCB0cnVlCi0gIGF1dG9tYXRpY19zc3RhYmxlX3VwZ3JhZGUgICAgICAgICAgfCBmYWxzZQotICBjbHVzdGVyX25hbWUgICAgICAgICAgICAgICAgICAgICAgIHwgVGVzdCBDbHVzdGVyCi0gIHRyYW5zaWVudF9yZXBsaWNhdGlvbl9lbmFibGVkICAgICAgfCBmYWxzZQotICBoaW50ZWRfaGFuZG9mZl9lbmFibGVkICAgICAgICAgICAgIHwgdHJ1ZQotICBoaW50c19kaXJlY3RvcnkgICAgICAgICAgICAgICAgICAgIHwgL2hvbWUvZWMyLXVzZXIvY2Fzc2FuZHJhL2RhdGEvaGludHMKLSAgaW5jcmVtZW50YWxfYmFja3VwcyAgICAgICAgICAgICAgICB8IGZhbHNlCi0gIGluaXRpYWxfdG9rZW4gICAgICAgICAgICAgICAgICAgICAgfCBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uCi0gIHJwY19hZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgfCBsb2NhbGhvc3QKLSAgc3NsX3N0b3JhZ2VfcG9ydCAgICAgICAgICAgICAgICAgICB8IDcwMDEKLSAgc3RhcnRfbmF0aXZlX3RyYW5zcG9ydCAgICAgICAgICAgICB8IHRydWUKLSAgc3RvcmFnZV9wb3J0ICAgICAgICAgICAgICAgICAgICAgICB8IDcwMDAKLSAgc3RyZWFtX2VudGlyZV9zc3RhYmxlcyAgICAgICAgICAgICB8IHRydWUKLSAgKDIyNCByb3dzKQotLi4uLgotCi1UaGUgYHNldHRpbmdzYCB0YWJsZSBjYW4gYmUgcmVhbGx5IHVzZWZ1bCBpZiB5YW1sIGZpbGUgaGFzIGJlZW4gY2hhbmdlZAotc2luY2Ugc3RhcnR1cCBhbmQgZG9udCBrbm93IHJ1bm5pbmcgY29uZmlndXJhdGlvbiwgb3IgdG8gZmluZCBpZiB0aGV5Ci1oYXZlIGJlZW4gbW9kaWZpZWQgdmlhIGpteC9ub2RldG9vbCBvciB2aXJ0dWFsIHRhYmxlcy4KLQotPT09IFRocmVhZCBQb29scyBWaXJ0dWFsIFRhYmxlCi0KLVRoZSBgdGhyZWFkX3Bvb2xzYCB0YWJsZSBsaXN0cyBpbmZvcm1hdGlvbiBhYm91dCBhbGwgdGhyZWFkIHBvb2xzLgotVGhyZWFkIHBvb2wgaW5mb3JtYXRpb24gaW5jbHVkZXMgYWN0aXZlIHRhc2tzLCBhY3RpdmUgdGFza3MgbGltaXQsCi1ibG9ja2VkIHRhc2tzLCBibG9ja2VkIHRhc2tzIGFsbCB0aW1lLCBjb21wbGV0ZWQgdGFza3MsIGFuZCBwZW5kaW5nCi10YXNrcy4gQSBxdWVyeSBvbiB0aGUgYHRocmVhZF9wb29sc2AgcmV0dXJucyBmb2xsb3dpbmcgZGV0YWlsczoKLQotLi4uLgotY3Fsc2g6c3lzdGVtX3ZpZXdzPiBzZWxlY3QgKiBmcm9tIHN5c3RlbV92aWV3cy50aHJlYWRfcG9vbHM7Ci0KLW5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgfCBhY3RpdmVfdGFza3MgfCBhY3RpdmVfdGFza3NfbGltaXQgfCBibG9ja2VkX3Rhc2tzIHwgYmxvY2tlZF90YXNrc19hbGxfdGltZSB8IGNvbXBsZXRlZF90YXNrcyB8IHBlbmRpbmdfdGFza3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgQW50aUVudHJvcHlTdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAotICAgICAgICBDYWNoZUNsZWFudXBFeGVjdXRvciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAotICAgICAgICAgIENvbXBhY3Rpb25FeGVjdXRvciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgODgxIHwgICAgICAgICAgICAgMAotICAgICAgICBDb3VudGVyTXV0YXRpb25TdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAzMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAotICAgICAgICAgICAgICAgICBHb3NzaXBTdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAotICAgICAgICAgICAgIEhpbnRzRGlzcGF0Y2hlciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAotICAgICAgIEludGVybmFsUmVzcG9uc2VTdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAotICAgICAgICAgTWVtdGFibGVGbHVzaFdyaXRlciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMAotICAgICAgICAgICBNZW10YWJsZVBvc3RGbHVzaCB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAyIHwgICAgICAgICAgICAgMAotICAgICAgIE1lbXRhYmxlUmVjbGFpbU1lbW9yeSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMAotICAgICAgICAgICAgICBNaWdyYXRpb25TdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAotICAgICAgICAgICAgICAgICAgIE1pc2NTdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAotICAgICAgICAgICAgICAgTXV0YXRpb25TdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAzMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAotICAgTmF0aXZlLVRyYW5zcG9ydC1SZXF1ZXN0cyB8ICAgICAgICAgICAgMSB8ICAgICAgICAgICAgICAgIDEyOCB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMTMwIHwgICAgICAgICAgICAgMAotICAgICAgUGVuZGluZ1JhbmdlQ2FsY3VsYXRvciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMAotUGVyRGlza01lbXRhYmxlRmx1c2hXcml0ZXJfMCB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMAotICAgICAgICAgICAgICAgICAgIFJlYWRTdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAzMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgIDEzIHwgICAgICAgICAgICAgMAotICAgICAgICAgICAgICAgICBSZXBhaXItVGFzayB8ICAgICAgICAgICAgMCB8ICAgICAgICAgMjE0NzQ4MzY0NyB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAotICAgICAgICBSZXF1ZXN0UmVzcG9uc2VTdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAotICAgICAgICAgICAgICAgICAgICAgU2FtcGxlciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAotICAgIFNlY29uZGFyeUluZGV4TWFuYWdlbWVudCB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAotICAgICAgICAgIFZhbGlkYXRpb25FeGVjdXRvciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgMjE0NzQ4MzY0NyB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAotICAgICAgICAgICBWaWV3QnVpbGRFeGVjdXRvciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAotICAgICAgICAgICBWaWV3TXV0YXRpb25TdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAzMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAotLi4uLgotCi0oMjQgcm93cykKLQotPT09IEludGVybm9kZSBJbmJvdW5kIE1lc3NhZ2luZyBWaXJ0dWFsIFRhYmxlCi0KLVRoZSBgaW50ZXJub2RlX2luYm91bmRgIHZpcnR1YWwgdGFibGUgaXMgZm9yIHRoZSBpbnRlcm5vZGUgaW5ib3VuZAotbWVzc2FnaW5nLiBJbml0aWFsbHkgbm8gaW50ZXJub2RlIGluYm91bmQgbWVzc2FnaW5nIG1heSBnZXQgbGlzdGVkLiBJbgotYWRkaXRpb24gdG8gdGhlIGFkZHJlc3MsIHBvcnQsIGRhdGFjZW50ZXIgYW5kIHJhY2sgaW5mb3JtYXRpb24gaW5jbHVkZXMKLWNvcnJ1cHQgZnJhbWVzIHJlY292ZXJlZCwgY29ycnVwdCBmcmFtZXMgdW5yZWNvdmVyZWQsIGVycm9yIGJ5dGVzLCBlcnJvcgotY291bnQsIGV4cGlyZWQgYnl0ZXMsIGV4cGlyZWQgY291bnQsIHByb2Nlc3NlZCBieXRlcywgcHJvY2Vzc2VkIGNvdW50LAotcmVjZWl2ZWQgYnl0ZXMsIHJlY2VpdmVkIGNvdW50LCBzY2hlZHVsZWQgYnl0ZXMsIHNjaGVkdWxlZCBjb3VudCwKLXRocm90dGxlZCBjb3VudCwgdGhyb3R0bGVkIG5hbm9zLCB1c2luZyBieXRlcywgdXNpbmcgcmVzZXJ2ZSBieXRlcy4gQQotcXVlcnkgb24gdGhlIGBpbnRlcm5vZGVfaW5ib3VuZGAgcmV0dXJucyBmb2xsb3dpbmcgZGV0YWlsczoKLQotLi4uLgotY3Fsc2g6c3lzdGVtX3ZpZXdzPiBTRUxFQ1QgKiBGUk9NIHN5c3RlbV92aWV3cy5pbnRlcm5vZGVfaW5ib3VuZDsKLWFkZHJlc3MgfCBwb3J0IHwgZGMgfCByYWNrIHwgY29ycnVwdF9mcmFtZXNfcmVjb3ZlcmVkIHwgY29ycnVwdF9mcmFtZXNfdW5yZWNvdmVyZWQgfAotZXJyb3JfYnl0ZXMgfCBlcnJvcl9jb3VudCB8IGV4cGlyZWRfYnl0ZXMgfCBleHBpcmVkX2NvdW50IHwgcHJvY2Vzc2VkX2J5dGVzIHwKLXByb2Nlc3NlZF9jb3VudCB8IHJlY2VpdmVkX2J5dGVzIHwgcmVjZWl2ZWRfY291bnQgfCBzY2hlZHVsZWRfYnl0ZXMgfCBzY2hlZHVsZWRfY291bnQgfCB0aHJvdHRsZWRfY291bnQgfCB0aHJvdHRsZWRfbmFub3MgfCB1c2luZ19ieXRlcyB8IHVzaW5nX3Jlc2VydmVfYnl0ZXMKLS0tLS0tLS0tLSstLS0tLS0rLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstCi0tLS0tLS0tLS0tCi0oMCByb3dzKQotLi4uLgotCi09PT0gU1NUYWJsZXMgVGFza3MgVmlydHVhbCBUYWJsZQotCi1UaGUgYHNzdGFibGVfdGFza3NgIGNvdWxkIGJlIHVzZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHJ1bm5pbmcKLXRhc2tzLiBJdCBsaXN0cyBmb2xsb3dpbmcgY29sdW1uczoKLQotLi4uLgotY3Fsc2g6c3lzdGVtX3ZpZXdzPiBTRUxFQ1QgKiBGUk9NIHNzdGFibGVfdGFza3M7Ci1rZXlzcGFjZV9uYW1lIHwgdGFibGVfbmFtZSB8IHRhc2tfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtpbmQgICAgICAgfCBwcm9ncmVzcyB8IHRvdGFsICAgIHwgdW5pdAotLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0KLSAgICAgICBiYXNpYyB8ICAgICAgd2lkZTIgfCBjMzkwOTc0MC1jZGY3LTExZTktYThlZC0wZjAzZGUyZDlhZTEgfCBjb21wYWN0aW9uIHwgNjA0MTg3NjEgfCA3MDg4MjExMCB8IGJ5dGVzCi0gICAgICAgYmFzaWMgfCAgICAgIHdpZGUyIHwgYzc1NTY3NzAtY2RmNy0xMWU5LWE4ZWQtMGYwM2RlMmQ5YWUxIHwgY29tcGFjdGlvbiB8ICAyOTk1NjIzIHwgNDAzMTQ2NzkgfCBieXRlcwotLi4uLgotCi1BcyBhbm90aGVyIGV4YW1wbGUsIHRvIGZpbmQgaG93IG11Y2ggdGltZSBpcyByZW1haW5pbmcgZm9yIFNTVGFibGUKLXRhc2tzLCB1c2UgdGhlIGZvbGxvd2luZyBxdWVyeToKLQotLi4uLgotU0VMRUNUIHRvdGFsIC0gcHJvZ3Jlc3MgQVMgcmVtYWluaW5nCi1GUk9NIHN5c3RlbV92aWV3cy5zc3RhYmxlX3Rhc2tzOwotLi4uLgotCi09PT0gR29zc2lwIEluZm9ybWF0aW9uIFZpcnR1YWwgVGFibGUKLQotVGhlIGBnb3NzaXBfaW5mb2AgdmlydHVhbCB0YWJsZSBsaXN0cyB0aGUgR29zc2lwIGluZm9ybWF0aW9uIGZvciB0aGUgY2x1c3Rlci4gQW4gZXhhbXBsZSBxdWVyeSBpcyBhcyBmb2xsb3dzOgotCi0uLi4uCi1jcWxzaD4gc2VsZWN0IGFkZHJlc3MsIHBvcnQsIGdlbmVyYXRpb24sIGhlYXJ0YmVhdCwgbG9hZCwgZGMsIHJhY2sgZnJvbSBzeXN0ZW1fdmlld3MuZ29zc2lwX2luZm87Ci0KLSBhZGRyZXNzICAgfCBwb3J0IHwgZ2VuZXJhdGlvbiB8IGhlYXJ0YmVhdCB8IGxvYWQgICAgfCBkYyAgICAgICAgICB8IHJhY2sKLS0tLS0tLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLQotIDEyNy4wLjAuMSB8IDcwMDAgfCAxNjQ1NTc1MTQwIHwgICAgICAgMzEyIHwgNzA1NDIuMCB8IGRhdGFjZW50ZXIxIHwgcmFjazEKLSAxMjcuMC4wLjIgfCA3MDAwIHwgMTY0NTU3NTEzNSB8ICAgICAgIDMxOCB8IDcwNDk5LjAgfCBkYXRhY2VudGVyMSB8IHJhY2sxCi0gMTI3LjAuMC4zIHwgNzAwMCB8IDE2NDU1NzUxNDAgfCAgICAgICAzMTIgfCA3MDUwNC4wIHwgZGF0YWNlbnRlcjEgfCByYWNrMQotIDEyNy4wLjAuNCB8IDcwMDAgfCAxNjQ1NTc1MTQxIHwgICAgICAgMzExIHwgNzA1MDIuMCB8IGRhdGFjZW50ZXIxIHwgcmFjazEKLSAxMjcuMC4wLjUgfCA3MDAwIHwgMTY0NTU3NTEzNiB8ICAgICAgIDMxNSB8IDcwNTAwLjAgfCBkYXRhY2VudGVyMSB8IHJhY2sxCi0KLSg1IHJvd3MpCi0uLi4uCi0KLT09PSBPdGhlciBWaXJ0dWFsIFRhYmxlcwotCi1Tb21lIGV4YW1wbGVzIG9mIHVzaW5nIG90aGVyIHZpcnR1YWwgdGFibGVzIGFyZSBhcyBmb2xsb3dzLgotCi1GaW5kIHRhYmxlcyB3aXRoIG1vc3QgZGlzayB1c2FnZToKLQotLi4uLgotY3Fsc2g+IFNFTEVDVCAqIEZST00gZGlza191c2FnZSBXSEVSRSBtZWJpYnl0ZXMgPiAxIEFMTE9XIEZJTFRFUklORzsKLQota2V5c3BhY2VfbmFtZSB8IHRhYmxlX25hbWUgfCBtZWJpYnl0ZXMKLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0KLSAgIGtleXNwYWNlMSB8ICBzdGFuZGFyZDEgfCAgICAgICAyODgKLSAgdGxwX3N0cmVzcyB8ICAga2V5dmFsdWUgfCAgICAgIDMyMTEKLS4uLi4KLQotRmluZCBxdWVyaWVzIG9uIHRhYmxlL3Mgd2l0aCBncmVhdGVzdCByZWFkIGxhdGVuY3k6Ci0KLS4uLi4KLWNxbHNoPiBTRUxFQ1QgKiBGUk9NICBsb2NhbF9yZWFkX2xhdGVuY3kgV0hFUkUgcGVyX3NlY29uZCA+IDEgQUxMT1cgRklMVEVSSU5HOwotCi1rZXlzcGFjZV9uYW1lIHwgdGFibGVfbmFtZSB8IHA1MHRoX21zIHwgcDk5dGhfbXMgfCBjb3VudCAgICB8IG1heF9tcyAgfCBwZXJfc2Vjb25kCi0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0KLSAgdGxwX3N0cmVzcyB8ICAga2V5dmFsdWUgfCAgICAwLjA0MyB8ICAgIDAuMTUyIHwgNDk3ODUxNTggfCAxODYuNTYzIHwgIDExNDE4LjM1NgotLi4uLgotCi0KLT09IEV4YW1wbGUKLQotW2FyYWJpYywgc3RhcnQ9MV0KLS4gVG8gbGlzdCB0aGUga2V5c3BhY2VzLCBlbnRlciBgYGNxbHNoYGAgYW5kIHJ1biB0aGUgQ1FMIGNvbW1hbmQgYGBERVNDUklCRSBLRVlTUEFDRVNgYDoKLQotW3NvdXJjZSwgY3FsXQotLS0tLQotY3Fsc2g+IERFU0MgS0VZU1BBQ0VTOwotc3lzdGVtX3NjaGVtYSAgc3lzdGVtICAgICAgICAgIHN5c3RlbV9kaXN0cmlidXRlZCAgc3lzdGVtX3ZpcnR1YWxfc2NoZW1hCi1zeXN0ZW1fYXV0aCAgICBzeXN0ZW1fdHJhY2VzICAgc3lzdGVtX3ZpZXdzCi0tLS0tCi0KLVthcmFiaWMsIHN0YXJ0PTJdCi0uIFRvIHZpZXcgdGhlIHZpcnR1YWwgdGFibGUgc2NoZW1hLCBydW4gdGhlIENRTCBjb21tYW5kcyBgYFVTRSBzeXN0ZW1fdmlydHVhbF9zY2hlbWFgYCBhbmQgYGBTRUxFQ1QgKiBGUk9NIHRhYmxlc2BgOgotCi1bc291cmNlLCBjcWxdCi0tLS0tCi1jcWxzaD4gVVNFIHN5c3RlbV92aXJ0dWFsX3NjaGVtYTsKLWNxbHNoPiBTRUxFQ1QgKiBGUk9NIHRhYmxlczsKLS0tLS0KLSAKLXJlc3VsdHMgaW46Ci0KLVtzb3VyY2UsIGNxbF0KLS0tLS0KLSBrZXlzcGFjZV9uYW1lICAgICAgICAgfCB0YWJsZV9uYW1lICAgICAgICAgICAgICAgIHwgY29tbWVudAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgICAgICAgICAgICAgIGNhY2hlcyB8ICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtIGNhY2hlcwotICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICAgICAgICAgICAgIGNsaWVudHMgfCAgICAgICAgICBjdXJyZW50bHkgY29ubmVjdGVkIGNsaWVudHMKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgY29vcmRpbmF0b3JfcmVhZF9sYXRlbmN5IHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgY29vcmRpbmF0b3Jfc2Nhbl9sYXRlbmN5IHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCBjb29yZGluYXRvcl93cml0ZV9sYXRlbmN5IHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgICAgICAgICBkaXNrX3VzYWdlIHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgIGludGVybm9kZV9pbmJvdW5kIHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgaW50ZXJub2RlX291dGJvdW5kIHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgbG9jYWxfcmVhZF9sYXRlbmN5IHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgbG9jYWxfc2Nhbl9sYXRlbmN5IHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICBsb2NhbF93cml0ZV9sYXRlbmN5IHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgbWF4X3BhcnRpdGlvbl9zaXplIHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgICAgICByb3dzX3Blcl9yZWFkIHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgICAgICAgICAgIHNldHRpbmdzIHwgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHNldHRpbmdzCi0gICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgICAgICAgc3N0YWJsZV90YXNrcyB8ICAgICAgICAgICAgICAgIGN1cnJlbnQgc3N0YWJsZSB0YXNrcwotICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICAgc3lzdGVtX3Byb3BlcnRpZXMgfCBDYXNzYW5kcmEgcmVsZXZhbnQgc3lzdGVtIHByb3BlcnRpZXMKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgICAgICAgdGhyZWFkX3Bvb2xzIHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICB0b21ic3RvbmVzX3Blcl9yZWFkIHwKLSBzeXN0ZW1fdmlydHVhbF9zY2hlbWEgfCAgICAgICAgICAgICAgICAgICBjb2x1bW5zIHwgICAgICAgICAgIHZpcnR1YWwgY29sdW1uIGRlZmluaXRpb25zCi0gc3lzdGVtX3ZpcnR1YWxfc2NoZW1hIHwgICAgICAgICAgICAgICAgIGtleXNwYWNlcyB8ICAgICAgICAgdmlydHVhbCBrZXlzcGFjZSBkZWZpbml0aW9ucwotIHN5c3RlbV92aXJ0dWFsX3NjaGVtYSB8ICAgICAgICAgICAgICAgICAgICB0YWJsZXMgfCAgICAgICAgICAgIHZpcnR1YWwgdGFibGUgZGVmaW5pdGlvbnMKLQotKDIxIHJvd3MpCi0tLS0tCi0KLVthcmFiaWMsIHN0YXJ0PTNdCi0uIFRvIHZpZXcgdGhlIHZpcnR1YWwgdGFibGVzLCBydW4gdGhlIENRTCBjb21tYW5kcyBgYFVTRSBzeXN0ZW1fdmlld2BgIGFuZCBgYERFU0NSSUJFIHRhYmxlc2BgOgotCi1bc291cmNlLCBjcWxdCi0tLS0tCi1jcWxzaD4gVVNFIHN5c3RlbV92aWV3OzsKLWNxbHNoPiBERVNDUklCRSB0YWJsZXM7Ci0tLS0tCi0KLXJlc3VsdHMgaW46Ci0KLVtzb3VyY2UsIGNxbF0KLS0tLS0KLXNzdGFibGVfdGFza3MgICAgICAgY2xpZW50cyAgICAgICAgICAgICAgICAgICBjb29yZGluYXRvcl93cml0ZV9sYXRlbmN5Ci1kaXNrX3VzYWdlICAgICAgICAgIGxvY2FsX3dyaXRlX2xhdGVuY3kgICAgICAgdG9tYnN0b25lc19wZXJfcmVhZAotdGhyZWFkX3Bvb2xzICAgICAgICBpbnRlcm5vZGVfb3V0Ym91bmQgICAgICAgIHNldHRpbmdzCi1sb2NhbF9zY2FuX2xhdGVuY3kgIGNvb3JkaW5hdG9yX3NjYW5fbGF0ZW5jeSAgc3lzdGVtX3Byb3BlcnRpZXMKLWludGVybm9kZV9pbmJvdW5kICAgY29vcmRpbmF0b3JfcmVhZF9sYXRlbmN5ICBtYXhfcGFydGl0aW9uX3NpemUKLWxvY2FsX3JlYWRfbGF0ZW5jeSAgcm93c19wZXJfcmVhZCAgICAgICAgICAgICBjYWNoZXMKLS0tLS0KLQotW2FyYWJpYywgc3RhcnQ9NF0KLS4gVG8gbG9vayBhdCBhbnkgdGFibGUgZGF0YSwgcnVuIHRoZSBDUUwgY29tbWFuZCBgYFNFTEVDVGBgOgotCi1bc291cmNlLCBjcWxdCi0tLS0tCi1jcWxzaD4gVVNFIHN5c3RlbV92aWV3OzsKLWNxbHNoPiBTRUxFQ1QgKiBGUk9NIGNsaWVudHMgTElNSVQgMjsKLS0tLS0KLSByZXN1bHRzIGluOgotCi1bc291cmNlLCBjcWxdCi0tLS0tCi0gYWRkcmVzcyAgIHwgcG9ydCAgfCBjb25uZWN0aW9uX3N0YWdlIHwgZHJpdmVyX25hbWUgICAgICAgICAgICB8IGRyaXZlcl92ZXJzaW9uIHwgaG9zdG5hbWUgIHwgcHJvdG9jb2xfdmVyc2lvbiB8IHJlcXVlc3RfY291bnQgfCBzc2xfY2lwaGVyX3N1aXRlIHwgc3NsX2VuYWJsZWQgfCBzc2xfcHJvdG9jb2wgfCB1c2VybmFtZQotLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLQotIDEyNy4wLjAuMSB8IDM3MzA4IHwgICAgICAgICAgICByZWFkeSB8IERhdGFTdGF4IFB5dGhvbiBEcml2ZXIgfCAgIDMuMjEuMC5wb3N0MCB8IGxvY2FsaG9zdCB8ICAgICAgICAgICAgICAgIDQgfCAgICAgICAgICAgIDE3IHwgICAgICAgICAgICAgbnVsbCB8ICAgICAgIEZhbHNlIHwgICAgICAgICBudWxsIHwgYW5vbnltb3VzCi0gMTI3LjAuMC4xIHwgMzczMTAgfCAgICAgICAgICAgIHJlYWR5IHwgRGF0YVN0YXggUHl0aG9uIERyaXZlciB8ICAgMy4yMS4wLnBvc3QwIHwgbG9jYWxob3N0IHwgICAgICAgICAgICAgICAgNCB8ICAgICAgICAgICAgIDggfCAgICAgICAgICAgICBudWxsIHwgICAgICAgRmFsc2UgfCAgICAgICAgIG51bGwgfCBhbm9ueW1vdXMKLQotKDIgcm93cykKLS0tLS0KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvYXVkaXRsb2dnaW5nLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL2F1ZGl0bG9nZ2luZy5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDc5OTIxLi4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvYXVkaXRsb2dnaW5nLmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NzUgKzAsMCBAQAotPSBBdWRpdCBMb2dnaW5nCi0KLUF1ZGl0IExvZ2dpbmcgaXMgYSBuZXcgZmVhdHVyZSBpbiBBcGFjaGUgQ2Fzc2FuZHJhIDQuMCAoaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMTIxNTFbQ0FTU0FORFJBLTEyMTUxXSkuCi1UaGlzIG5ldyBmZWF0dXJlIGlzIHNhZmUgZm9yIHByb2R1Y3Rpb24gdXNlLCB3aXRoIGNvbmZpZ3VyYWJsZSBsaW1pdHMgdG8gaGVhcCBtZW1vcnkgYW5kIGRpc2sgc3BhY2UgdG8gcHJldmVudCBvdXQtb2YtbWVtb3J5IGVycm9ycy4KLUFsbCBkYXRhYmFzZSBhY3Rpdml0eSBpcyBsb2dnZWQgcGVyLW5vZGUgYXMgZmlsZS1iYXNlZCByZWNvcmRzIHRvIGEgc3BlY2lmaWVkIGxvY2FsIGZpbGVzeXN0ZW0gZGlyZWN0b3J5LiAKLVRoZSBhdWRpdCBsb2cgZmlsZXMgYXJlIHJvbGxlZCBwZXJpb2RpY2FsbHkgYmFzZWQgb24gYSBjb25maWd1cmFibGUgdmFsdWUuIAotCi1Tb21lIG9mIHRoZSBmZWF0dXJlcyBvZiBhdWRpdCBsb2dnaW5nIGFyZToKLQotKiBObyBhZGRpdGlvbmFsIGRhdGFiYXNlIGNhcGFjaXR5IGlzIG5lZWRlZCB0byBzdG9yZSBhdWRpdCBsb2dzLgotKiBObyBxdWVyeSB0b29sIGlzIHJlcXVpcmVkIHRvIHN0b3JlIHRoZSBhdWRpdCBsb2dzLgotKiBMYXRlbmN5IG9mIGRhdGFiYXNlIG9wZXJhdGlvbnMgaXMgbm90IGFmZmVjdGVkLCBzbyB0aGVyZSBpcyBubyBwZXJmb3JtYW5jZSBpbXBhY3QuCi0qIEhlYXAgbWVtb3J5IHVzYWdlIGlzIGJvdW5kZWQgYnkgYSB3ZWlnaHRlZCBxdWV1ZSwgd2l0aCBjb25maWd1cmFibGUgbWF4aW11bSB3ZWlnaHQgc2l0dGluZyBpbiBmcm9udCBvZiBsb2dnaW5nIHRocmVhZC4KLSogRGlzayB1dGlsaXphdGlvbiBpcyBib3VuZGVkIGJ5IGEgY29uZmlndXJhYmxlIHNpemUsIGRlbGV0aW5nIG9sZCBsb2cgc2VnbWVudHMgb25jZSB0aGUgbGltaXQgaXMgcmVhY2hlZC4KLSogQ2FuIGJlIGVuYWJsZWQsIGRpc2FibGVkLCBvciByZXNldCAodG8gZGVsZXRlIG9uLWRpc2sgZGF0YSkgdXNpbmcgdGhlIEpNWCB0b29sLCBgYG5vZGV0b29sYGAuCi0qIENhbiBjb25maWd1cmUgdGhlIHNldHRpbmdzIGluIGVpdGhlciB0aGUgYGNhc3NhbmRyYS55YW1sYCBmaWxlIG9yIGJ5IHVzaW5nIGBgbm9kZXRvb2xgYC4KLQotQXVkaXQgbG9nZ2luZyBpbmNsdWRlcyBhbGwgQ1FMIHJlcXVlc3RzLCBib3RoIHN1Y2Nlc3NmdWwgYW5kIGZhaWxlZC4gCi1JdCBhbHNvIGNhcHR1cmVzIGFsbCBzdWNjZXNzZnVsIGFuZCBmYWlsZWQgYXV0aGVudGljYXRpb24gYW5kIGF1dGhvcml6YXRpb24gZXZlbnRzLCBzdWNoIGFzIGxvZ2luIGF0dGVtcHRzLiAKLVRoZSBkaWZmZXJlbmNlIGJldHdlZW4gRnVsbCBRdWVyeSBMb2dnaW5nIChGUUwpIGFuZCBhdWRpdCBsb2dnaW5nIGlzIHRoYXQgRlFMIGNhcHR1cmVzIG9ubHkgc3VjY2Vzc2Z1bCBDUUwgcmVxdWVzdHMsIHdoaWNoIGFsbG93IHJlcGxheSBvciBjb21wYXJpc29uIG9mIGxvZ3MuCi1BdWRpdCBsb2dzIGFyZSB1c2VmdWwgZm9yIGNvbXBsaWFuY2UgYW5kIGRlYnVnZ2luZywgd2hpbGUgRlFMIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nLCBwZXJmb3JtYW5jZSBiZW5jaG1hcmtpbmcsIHRlc3RpbmcgYW5kIGF1ZGl0aW5nIENRTCBxdWVyaWVzLgotCi09PSBBdWRpdCBpbmZvcm1hdGlvbiBsb2dnZWQKLQotVGhlIGF1ZGl0IGxvZyBjb250YWluczoKLQotKiBhbGwgZXZlbnRzIGluIHRoZSBjb25maWd1cmVkIGtleXNwYWNlcyB0byBpbmNsdWRlCi0qIGFsbCBldmVudHMgaW4gdGhlIGNvbmZpZ3VyZWQgY2F0ZWdvcmllcyB0byBpbmNsdWRlCi0qIGFsbCBldmVudHMgZXhlY3V0ZWQgYnkgdGhlIGNvbmZpZ3VyZWQgdXNlcnMgdG8gaW5jbHVkZQotCi1UaGUgYXVkaXQgbG9nIGRvZXMgbm90IGNvbnRhaW46Ci0KLSogY29uZmlndXJhdGlvbiBjaGFuZ2VzIG1hZGUgaW4gYGNhc3NhbmRyYS55YW1sYCBmaWxlCi0qIGBub2RldG9vbGAgY29tbWFuZHMKLSogUGFzc3dvcmRzIG1lbnRpb25lZCBhcyBwYXJ0IG9mIERDTCBzdGF0ZW1lbnRzOiBQYXNzd29yZHMgd2lsbCBiZSBvYmZ1c2NhdGVkIGFzIFwqXCpcKlwqXCpcKlwqLgotICoqIFN0YXRlbWVudHMgdGhhdCBmYWlsIHRvIHBhcnNlIHdpbGwgaGF2ZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSB3b3JkIHBhc3N3b3JkIG9iZnVzY2F0ZWQgYXMgXCpcKlwqXCpcKlwqXCouCi0gKiogU3RhdGVtZW50cyB3aXRoIGEgbWlzdHlwZWQgd29yZCAncGFzc3dvcmQnIHdpbGwgYmUgbG9nZ2VkIHdpdGhvdXQgb2JmdXNjYXRpb24uIFBsZWFzZSBtYWtlIHN1cmUgdG8gdXNlIGEgZGlmZmVyZW50IHBhc3N3b3JkIG9uIHJldHJpZXMuCi0KLVRoZSBhdWRpdCBsb2cgaXMgYSBzZXJpZXMgb2YgbG9nIGVudHJpZXMuIAotQW4gYXVkaXQgbG9nIGVudHJ5IGNvbnRhaW5zOgotCi0qIGtleXNwYWNlIChTdHJpbmcpIC0gS2V5c3BhY2Ugb24gd2hpY2ggcmVxdWVzdCBpcyBtYWRlCi0qIG9wZXJhdGlvbiAoU3RyaW5nKSAtIERhdGFiYXNlIG9wZXJhdGlvbiBzdWNoIGFzIENRTCBjb21tYW5kCi0qIHVzZXIgKFN0cmluZykgLSBVc2VyIG5hbWUKLSogc2NvcGUgKFN0cmluZykgLSBTY29wZSBvZiByZXF1ZXN0IHN1Y2ggYXMgVGFibGUvRnVuY3Rpb24vQWdncmVnYXRlIG5hbWUKLSogdHlwZSAoQXVkaXRMb2dFbnRyeVR5cGUpIC0gVHlwZSBvZiByZXF1ZXN0Ci0qKiBDUUwgQXVkaXQgTG9nIEVudHJ5IFR5cGUKLSoqIENvbW1vbiBBdWRpdCBMb2cgRW50cnkgVHlwZQotKiBzb3VyY2UgKEluZXRBZGRyZXNzQW5kUG9ydCkgLSBTb3VyY2UgSVAgQWRkcmVzcyBmcm9tIHdoaWNoIHJlcXVlc3Qgb3JpZ2luYXRlZAotKiB0aW1lc3RhbXAgKGxvbmcgKSAtIFRpbWVzdGFtcCBvZiB0aGUgcmVxdWVzdAotKiBiYXRjaCAoVVVJRCkgLSBCYXRjaCBvZiByZXF1ZXN0Ci0qIG9wdGlvbnMgKFF1ZXJ5T3B0aW9ucykgLSBDUUwgUXVlcnkgb3B0aW9ucwotKiBzdGF0ZSAoUXVlcnlTdGF0ZSkgLSBTdGF0ZSByZWxhdGVkIHRvIGEgZ2l2ZW4gcXVlcnkKLQotRWFjaCBlbnRyeSBjb250YWlucyBhbGwgYXBwbGljYWJsZSBhdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gZXZlbnQsIGNvbmNhdGVuYXRlZCB3aXRoIGEgcGlwZSAofCkuCi0KLUNRTCBhdWRpdCBsb2cgZW50cnkgdHlwZXMgYXJlIHRoZSBmb2xsb3dpbmcgQ1FMIGNvbW1hbmRzLiBFYWNoIGNvbW1hbmQgaXMgYXNzaWduZWQgdG8gYSBwYXJ0aWN1bGFyIHNwZWNpZmllZCBjYXRlZ29yeSB0byBsb2c6Ci0KLVt3aWR0aD0iMTAwJSIsY29scz0iMjAlLDgwJSIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18IENhdGVnb3J5IHwgQ1FMIGNvbW1hbmRzCi0KLXwgRERMIHwgQUxURVJfS0VZU1BBQ0UsIENSRUFURV9LRVlTUEFDRSwgRFJPUF9LRVlTUEFDRSwgCi1BTFRFUl9UQUJMRSwgQ1JFQVRFX1RBQkxFLCBEUk9QX1RBQkxFLCAKLUNSRUFURV9GVU5DVElPTiwgRFJPUF9GVU5DVElPTiwgCi1DUkVBVEVfQUdHUkVHQVRFLCBEUk9QX0FHR1JFR0FURSwgCi1DUkVBVEVfSU5ERVgsIERST1BfSU5ERVgsIAotQUxURVJfVFlQRSwgQ1JFQVRFX1RZUEUsIERST1BfVFlQRSwKLUNSRUFURV9UUklHR0VSLCBEUk9QX1RSSUdHRVIsCi1BTFRFUl9WSUVXLCBDUkVBVEVfVklFVywgRFJPUF9WSUVXLAotVFJVTkNBVEUKLXwgRE1MIHwgQkFUQ0gsIERFTEVURSwgVVBEQVRFCi18IERDTCB8IEdSQU5ULCBSRVZPS0UsIAotQUxURVJfUk9MRSwgQ1JFQVRFX1JPTEUsIERST1BfUk9MRSwgCi1MSVNUX1JPTEVTLCBMSVNUX1BFUk1JU1NJT05TLCBMSVNUX1VTRVJTCi18IE9USEVSIHwgVVNFX0tFWVNQQUNFCi18IFFVRVJZIHwgU0VMRUNUCi18IFBSRVBBUkUgfCBQUkVQQVJFX1NUQVRFTUVOVAotfD09PQotCi1Db21tb24gYXVkaXQgbG9nIGVudHJ5IHR5cGVzIGFyZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotW3dpZHRoPSIxMDAlIixjb2xzPSI1MCUsNTAlIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXwgQ2F0ZWdvcnkgfCBDUUwgY29tbWFuZHMKLQotfCBBVVRIIHwgTE9HSU5fU1VDQ0VTUywgTE9HSU5fRVJST1IsIFVOQVVUSE9SSVpFRF9BVFRFTVBUCi18IEVSUk9SIHwgUkVRVUVTVF9GQUlMVVJFCi18PT09Ci0KLT09IENvbmZpZ3VyaW5nIGF1ZGl0IGxvZ2dpbmcgaW4gY2Fzc2FuZHJhLnlhbWwKLQotVGhlIGBjYXNzYW5kcmEueWFtbGAgZmlsZSBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgYW5kIGVuYWJsZSBhdWRpdCBsb2dnaW5nLgotQ29uZmlndXJhdGlvbiBhbmQgZW5hYmxlbWVudCBtYXkgYmUgdGhlIHNhbWUgb3IgZGlmZmVyZW50IG9uIGVhY2ggbm9kZSwgZGVwZW5kaW5nIG9uIHRoZSBgY2Fzc2FuZHJhLnlhbWxgIGZpbGUgc2V0dGluZ3MuCi1BdWRpdCBsb2dzIGFyZSBnZW5lcmF0ZWQgb24gZWFjaCBlbmFibGVkIG5vZGUsIHNvIGxvZ3Mgb24gZWFjaCBub2RlIHdpbGwgaGF2ZSB0aGF0IG5vZGUncyBxdWVyaWVzLgotQWxsIG9wdGlvbnMgZm9yIGF1ZGl0IGxvZ2dpbmcgY2FuIGJlIHNldCBpbiB0aGUgYGNhc3NhbmRyYS55YW1sYCBmaWxlIHVuZGVyIHRoZSBgYGF1ZGl0X2xvZ2dpbmdfb3B0aW9uczpgYC4KLQotVGhlIGZpbGUgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBvcHRpb25zIHRoYXQgY2FuIGJlIHVuY29tbWVudGVkIGZvciB1c2U6Ci0KLVtzb3VyY2UsIHlhbWxdCi0tLS0tCi0jIEF1ZGl0IGxvZ2dpbmcgLSBMb2dzIGV2ZXJ5IGluY29taW5nIENRTCBjb21tYW5kIHJlcXVlc3QsIGF1dGhlbnRpY2F0aW9uIHRvIGEgbm9kZS4gU2VlIHRoZSBkb2NzCi0jIG9uIGF1ZGl0X2xvZ2dpbmcgZm9yIGZ1bGwgZGV0YWlscyBhYm91dCB0aGUgdmFyaW91cyBjb25maWd1cmF0aW9uIG9wdGlvbnMuCi1hdWRpdF9sb2dnaW5nX29wdGlvbnM6Ci0gICAgZW5hYmxlZDogZmFsc2UKLSAgICBsb2dnZXI6Ci0gICAgICAtIGNsYXNzX25hbWU6IEJpbkF1ZGl0TG9nZ2VyCi0gICAgIyBhdWRpdF9sb2dzX2RpcjoKLSAgICAjIGluY2x1ZGVkX2tleXNwYWNlczoKLSAgICAjIGV4Y2x1ZGVkX2tleXNwYWNlczogc3lzdGVtLCBzeXN0ZW1fc2NoZW1hLCBzeXN0ZW1fdmlydHVhbF9zY2hlbWEKLSAgICAjIGluY2x1ZGVkX2NhdGVnb3JpZXM6Ci0gICAgIyBleGNsdWRlZF9jYXRlZ29yaWVzOgotICAgICMgaW5jbHVkZWRfdXNlcnM6Ci0gICAgIyBleGNsdWRlZF91c2VyczoKLSAgICAjIHJvbGxfY3ljbGU6IEhPVVJMWQotICAgICMgYmxvY2s6IHRydWUKLSAgICAjIG1heF9xdWV1ZV93ZWlnaHQ6IDI2ODQzNTQ1NiAjIDI1NiBNaUIKLSAgICAjIG1heF9sb2dfc2l6ZTogMTcxNzk4NjkxODQgIyAxNiBHaUIKLSAgICAjIyBhcmNoaXZlIGNvbW1hbmQgaXMgIi9wYXRoL3RvL3NjcmlwdC5zaCAlcGF0aCIgd2hlcmUgJXBhdGggaXMgcmVwbGFjZWQgd2l0aCB0aGUgZmlsZSBiZWluZyByb2xsZWQ6Ci0gICAgIyBhcmNoaXZlX2NvbW1hbmQ6Ci0gICAgIyBtYXhfYXJjaGl2ZV9yZXRyaWVzOiAxMAotLS0tLQotCi09PT0gZW5hYmxlZAotCi1BdWRpdCBsb2dnaW5nIGlzIGVuYWJsZWQgYnkgc2V0dGluZyB0aGUgYGVuYWJsZWRgIG9wdGlvbiB0byBgdHJ1ZWAgaW4KLXRoZSBgYXVkaXRfbG9nZ2luZ19vcHRpb25zYCBzZXR0aW5nLiAKLUlmIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQsIGF1ZGl0IGxvZ2dpbmcgd2lsbCBzdGFydCB3aGVuIENhc3NhbmRyYSBpcyBzdGFydGVkLgotRm9yIGV4YW1wbGUsIGBgZW5hYmxlZDogdHJ1ZWBgLgotCi09PT0gbG9nZ2VyCi0KLVRoZSB0eXBlIG9mIGF1ZGl0IGxvZ2dlciBpcyBzZXQgd2l0aCB0aGUgYGxvZ2dlcmAgb3B0aW9uLiAKLVN1cHBvcnRlZCB2YWx1ZXMgYXJlOiBgQmluQXVkaXRMb2dnZXJgIChkZWZhdWx0KSwgYEZpbGVBdWRpdExvZ2dlcmAgYW5kIGBOb09wQXVkaXRMb2dnZXJgLgotYEJpbkF1ZGl0TG9nZ2VyYCBsb2dzIGV2ZW50cyB0byBhIGZpbGUgaW4gYmluYXJ5IGZvcm1hdC4gCi1gRmlsZUF1ZGl0TG9nZ2VyYCB1c2VzIHRoZSBzdGFuZGFyZCBsb2dnaW5nIG1lY2hhbmlzbSwgYHNsZjRqYCB0byBsb2cgZXZlbnRzIHRvIHRoZSBgYXVkaXQvYXVkaXQubG9nYCBmaWxlLiBJdCBpcyBhIHN5bmNocm9ub3VzLCBmaWxlLWJhc2VkIGF1ZGl0IGxvZ2dlci4gVGhlIHJvbGxfY3ljbGUgd2lsbCBiZSBzZXQgaW4gdGhlIGBsb2diYWNrLnhtbGAgZmlsZS4KLWBOb09wQXVkaXRMb2dnZXJgIGlzIGEgbm8tb3AgaW1wbGVtZW50YXRpb24gb2YgdGhlIGF1ZGl0IGxvZ2dlciB0aGF0IHNob3VkbCBiZSBzcGVjaWZpZWQgd2hlbiBhdWRpdCBsb2dnaW5nIGlzIGRpc2FibGVkLgotCi1Gb3IgZXhhbXBsZToKLQotW3NvdXJjZSwgeWFtbF0KLS0tLS0KLWxvZ2dlcjogCi0gIC0gY2xhc3NfbmFtZTogRmlsZUF1ZGl0TG9nZ2VyCi0tLS0tCi0KLT09PSBhdWRpdF9sb2dzX2RpcgotCi1UbyB3cml0ZSBhdWRpdCBsb2dzLCBhbiBleGlzdGluZyBkaXJlY3RvcnkgbXVzdCBiZSBzZXQgaW4gYGBhdWRpdF9sb2dzX2RpcmBgLgotCi1UaGUgZGlyZWN0b3J5IG11c3QgaGF2ZSBhcHByb3ByaWF0ZSBwZXJtaXNzaW9ucyBzZXQgdG8gYWxsb3cgcmVhZGluZywgd3JpdGluZywgYW5kIGV4ZWN1dGluZy4KLUxvZ2dpbmcgd2lsbCByZWN1cnNpdmVseSBkZWxldGUgdGhlIGRpcmVjdG9yeSBjb250ZW50cyBhcyBuZWVkZWQuCi1EbyBub3QgcGxhY2UgbGlua3MgaW4gdGhpcyBkaXJlY3RvcnkgdG8gb3RoZXIgc2VjdGlvbnMgb2YgdGhlIGZpbGVzeXN0ZW0uCi1Gb3IgZXhhbXBsZSwgYGBhdWRpdF9sb2dzX2RpcjogL2Nhc3NhbmRyYS9hdWRpdC9sb2dzL2hvdXJseWBgLgotCi1UaGUgYXVkaXQgbG9nIGRpcmVjdG9yeSBjYW4gYWxzbyBiZSBjb25maWd1cmVkIHVzaW5nIHRoZSBzeXN0ZW0gcHJvcGVydHkgYGNhc3NhbmRyYS5sb2dkaXIuYXVkaXRgLCB3aGljaCBieSBkZWZhdWx0IGlzIHNldCB0byBgY2Fzc2FuZHJhLmxvZ2RpciArIC9hdWRpdC9gLgotCi09PT0gaW5jbHVkZWRfa2V5c3BhY2VzIGFuZCBleGNsdWRlZF9rZXlzcGFjZXMKLQotU2V0IHRoZSBrZXlzcGFjZXMgdG8gaW5jbHVkZSB3aXRoIHRoZSBgaW5jbHVkZWRfa2V5c3BhY2VzYCBvcHRpb24gYW5kCi10aGUga2V5c3BhY2VzIHRvIGV4Y2x1ZGUgd2l0aCB0aGUgYGV4Y2x1ZGVkX2tleXNwYWNlc2Agb3B0aW9uLiAKLUJ5IGRlZmF1bHQsIGBzeXN0ZW1gLCBgc3lzdGVtX3NjaGVtYWAgYW5kIGBzeXN0ZW1fdmlydHVhbF9zY2hlbWFgIGFyZSBleGNsdWRlZCwgYW5kIGFsbCBvdGhlciBrZXlzcGFjZXMgYXJlIGluY2x1ZGVkLgotCi1Gb3IgZXhhbXBsZToKLVtzb3VyY2UsIHlhbWxdCi0tLS0tCi1pbmNsdWRlZF9rZXlzcGFjZXM6IHRlc3QsIGRlbW8KLWV4Y2x1ZGVkX2tleXNwYWNlczogc3lzdGVtLCBzeXN0ZW1fc2NoZW1hLCBzeXN0ZW1fdmlydHVhbF9zY2hlbWEKLS0tLS0KLQotPT09IGluY2x1ZGVkX2NhdGVnb3JpZXMgYW5kIGV4Y2x1ZGVkX2NhdGVnb3JpZXMKLQotVGhlIGNhdGVnb3JpZXMgb2YgZGF0YWJhc2Ugb3BlcmF0aW9ucyB0byBpbmNsdWRlIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgYGluY2x1ZGVkX2NhdGVnb3JpZXNgIG9wdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LiAKLVRoZSBjYXRlZ29yaWVzIG9mIGRhdGFiYXNlIG9wZXJhdGlvbnMgdG8gZXhjbHVkZSBhcmUgc3BlY2lmaWVkIHdpdGggYGV4Y2x1ZGVkX2NhdGVnb3JpZXNgIG9wdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LiAKLVRoZSBzdXBwb3J0ZWQgY2F0ZWdvcmllcyBmb3IgYXVkaXQgbG9nIGFyZTogYEFVVEhgLCBgRENMYCwgYERETGAsIGBETUxgLCBgRVJST1JgLCBgT1RIRVJgLCBgUFJFUEFSRWAsIGFuZCBgUVVFUllgLgotQnkgZGVmYXVsdCBhbGwgc3VwcG9ydGVkIGNhdGVnb3JpZXMgYXJlIGluY2x1ZGVkLCBhbmQgbm8gY2F0ZWdvcnkgaXMgZXhjbHVkZWQuIAotCi1bc291cmNlLCB5YW1sXQotLS0tLQotaW5jbHVkZWRfY2F0ZWdvcmllczogQVVUSCwgRVJST1IsIERDTAotZXhjbHVkZWRfY2F0ZWdvcmllczogRERMLCBETUwsIFFVRVJZLCBQUkVQQVJFCi0tLS0tCi0KLT09PSBpbmNsdWRlZF91c2VycyBhbmQgZXhjbHVkZWRfdXNlcnMKLQotVXNlcnMgdG8gYXVkaXQgbG9nIGFyZSBzZXQgd2l0aCB0aGUgYGluY2x1ZGVkX3VzZXJzYCBhbmQgYGV4Y2x1ZGVkX3VzZXJzYCBvcHRpb25zLiAKLVRoZSBgaW5jbHVkZWRfdXNlcnNgIG9wdGlvbiBzcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB1c2VycyB0byBpbmNsdWRlIGV4cGxpY2l0bHkuCi1UaGUgYGV4Y2x1ZGVkX3VzZXJzYCBvcHRpb24gc3BlY2lmaWVzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdXNlcnMgdG8gZXhjbHVkZSBleHBsaWNpdGx5LgotQnkgZGVmYXVsdCBhbGwgdXNlcnMgYXJlIGluY2x1ZGVkLCBhbmQgbm8gdXNlcnMgYXJlIGV4Y2x1ZGVkLiAKLQotW3NvdXJjZSwgeWFtbF0KLS0tLS0KLWluY2x1ZGVkX3VzZXJzOiAKLWV4Y2x1ZGVkX3VzZXJzOiBqb2huLCBtYXJ5Ci0tLS0tCi0KLT09PSByb2xsX2N5Y2xlCi0KLVRoZSBgYHJvbGxfY3ljbGVgYCBkZWZpbmVzIHRoZSBmcmVxdWVuY3kgd2l0aCB3aGljaCB0aGUgYXVkaXQgbG9nIHNlZ21lbnRzIGFyZSByb2xsZWQuCi1TdXBwb3J0ZWQgdmFsdWVzIGFyZSBgYEhPVVJMWWBgIChkZWZhdWx0KSwgYGBNSU5VVEVMWWBgLCBhbmQgYGBEQUlMWWBgLgotRm9yIGV4YW1wbGU6IGBgcm9sbF9jeWNsZTogREFJTFlgYAotCi09PT0gYmxvY2sKLQotVGhlIGBgYmxvY2tgYCBvcHRpb24gc3BlY2lmaWVzIHdoZXRoZXIgYXVkaXQgbG9nZ2luZyBzaG91bGQgYmxvY2sgd3JpdGluZyBvciBkcm9wIGxvZyByZWNvcmRzIGlmIHRoZSBhdWRpdCBsb2dnaW5nIGZhbGxzIGJlaGluZC4gU3VwcG9ydGVkIGJvb2xlYW4gdmFsdWVzIGFyZSBgYHRydWVgYCAoZGVmYXVsdCkgb3IgYGBmYWxzZWBgLgotRm9yIGV4YW1wbGU6IGBgYmxvY2s6IGZhbHNlYGAgdG8gZHJvcCByZWNvcmRzCi0KLT09PSBtYXhfcXVldWVfd2VpZ2h0Ci0KLVRoZSBgYG1heF9xdWV1ZV93ZWlnaHRgYCBvcHRpb24gc2V0cyB0aGUgbWF4aW11bSB3ZWlnaHQgb2YgaW4tbWVtb3J5IHF1ZXVlIGZvciByZWNvcmRzIHdhaXRpbmcgdG8gYmUgd3JpdHRlbiB0byB0aGUgZmlsZSBiZWZvcmUgYmxvY2tpbmcgb3IgZHJvcHBpbmcuICBUaGUgb3B0aW9uIG11c3QgYmUgc2V0IHRvIGEgcG9zaXRpdmUgdmFsdWUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDI2ODQzNTQ1Niwgb3IgMjU2IE1pQi4KLUZvciBleGFtcGxlLCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQ6IGBgbWF4X3F1ZXVlX3dlaWdodDogMTM0MjE3NzI4ICMgMTI4IE1pQmBgCi0KLT09PSBtYXhfbG9nX3NpemUKLQotVGhlIGBgbWF4X2xvZ19zaXplYGAgb3B0aW9uIHNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgcm9sbGVkIGZpbGVzIHRvIHJldGFpbiBvbiBkaXNrIGJlZm9yZSBkZWxldGluZyB0aGUgb2xkZXN0IGZpbGUuICBUaGUgb3B0aW9uIG11c3QgYmUgc2V0IHRvIGEgcG9zaXRpdmUgdmFsdWUuIFRoZSBkZWZhdWx0IGlzIDE3MTc5ODY5MTg0LCBvciAxNiBHaUIuCi1Gb3IgZXhhbXBsZSwgdG8gY2hhbmdlIHRoZSBkZWZhdWx0OiBgYG1heF9sb2dfc2l6ZTogMzQzNTk3MzgzNjggIyAzMiBHaUJgYAotCi09PT0gYXJjaGl2ZV9jb21tYW5kCi0KLVRoZSBgYGFyY2hpdmVfY29tbWFuZGBgIG9wdGlvbiBzZXRzIHRoZSB1c2VyLWRlZmluZWQgYXJjaGl2ZSBzY3JpcHQgdG8gZXhlY3V0ZSBvbiByb2xsZWQgbG9nIGZpbGVzLgotRm9yIGV4YW1wbGU6IGBgYXJjaGl2ZV9jb21tYW5kOiAvdXNyL2xvY2FsL2Jpbi9hcmNoaXZlaXQuc2ggJXBhdGggIyAlcGF0aCBpcyB0aGUgZmlsZSBiZWluZyByb2xsZWRgYAotCi09PT0gbWF4X2FyY2hpdmVfcmV0cmllcwotCi1UaGUgYGBtYXhfYXJjaGl2ZV9yZXRyaWVzYGAgb3B0aW9uIHNldHMgdGhlIG1heCBudW1iZXIgb2YgcmV0cmllcyBvZiBmYWlsZWQgYXJjaGl2ZSBjb21tYW5kcy4gVGhlIGRlZmF1bHQgaXMgMTAuCi1Gb3IgZXhhbXBsZTogYGBtYXhfYXJjaGl2ZV9yZXRyaWVzOiAxMGBgCi0KLQotQW4gYXVkaXQgbG9nIGZpbGUgY291bGQgZ2V0IHJvbGxlZCBmb3Igb3RoZXIgcmVhc29ucyBhcyB3ZWxsIHN1Y2ggYXMgYQotbG9nIGZpbGUgcmVhY2hlcyB0aGUgY29uZmlndXJlZCBzaXplIHRocmVzaG9sZC4KLQotQXVkaXQgbG9nZ2luZyBjYW4gYWxzbyBiZSBjb25maWd1cmVkIHVzaW5nIGBgbm9kZXRvb2xgIHdoZW4gZW5hYmxpbmcgdGhlIGZlYXR1cmUsIGFuZCB3aWxsIG92ZXJyaWRlIGFueSB2YWx1ZXMgc2V0IGluIHRoZSBgY2Fzc2FuZHJhLnlhbWxgIGZpbGUsIGFzIGRpc2N1c3NlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLgotCi0KLT09IEVuYWJsaW5nIEF1ZGl0IExvZ2dpbmcgd2l0aCBgYG5vZGV0b29sYGAKLSAKLUF1ZGl0IGxvZ2dpbmcgaXMgZW5hYmxlZCBvbiBhIHBlci1ub2RlIGJhc2lzIHVzaW5nIHRoZSBgYG5vZGV0b29sIGVuYWJsZWF1ZGl0bG9nYGAgY29tbWFuZC4gVGhlIGxvZ2dpbmcgZGlyZWN0b3J5IG11c3QgYmUgZGVmaW5lZCB3aXRoIGBgYXVkaXRfbG9nc19kaXJgYCBpbiB0aGUgYGNhc3NhbmRyYS55YW1sYCBmaWxlIG9yIHVzZXMgdGhlIGRlZmF1bHQgdmFsdWUgYGBjYXNzYW5kcmEubG9nZGlyLmF1ZGl0YGAuCi0KLVRoZSBzeW50YXggb2YgdGhlIGBgbm9kZXRvb2wgZW5hYmxlYXVkaXRsb2dgYCBjb21tYW5kIGhhcyBhbGwgdGhlIHNhbWUgb3B0aW9ucyB0aGF0IGNhbiBiZSBzZXQgaW4gdGhlIGBgY2Fzc2FuZHJhLnlhbWxgYCBmaWxlIGV4Y2VwdCBgYGF1ZGl0X2xvZ3NfZGlyYGAuCi1JbiBhZGRpdGlvbiwgYGBub2RldG9vbGBgIGhhcyBvcHRpb25zIHRvIHNldCB3aGljaCBob3N0IGFuZCBwb3J0IHRvIHJ1biB0aGUgY29tbWFuZCBvbiwgYW5kIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBpZiB0aGUgY29tbWFuZCByZXF1aXJlcyBhdXRoZW50aWNhdGlvbi4KLQotW3NvdXJjZSwgcGxhaW50ZXh0XQotLS0tLQotICAgICAgIG5vZGV0b29sIFsoLWggPGhvc3Q+IHwgLS1ob3N0IDxob3N0PildIFsoLXAgPHBvcnQ+IHwgLS1wb3J0IDxwb3J0PildCi0gICAgICAgICAgICAgICAgWygtcHAgfCAtLXByaW50LXBvcnQpXSBbKC1wdyA8cGFzc3dvcmQ+IHwgLS1wYXNzd29yZCA8cGFzc3dvcmQ+KV0KLSAgICAgICAgICAgICAgICBbKC1wd2YgPHBhc3N3b3JkRmlsZVBhdGg+IHwgLS1wYXNzd29yZC1maWxlIDxwYXNzd29yZEZpbGVQYXRoPildCi0gICAgICAgICAgICAgICAgWygtdSA8dXNlcm5hbWU+IHwgLS11c2VybmFtZSA8dXNlcm5hbWU+KV0gZW5hYmxlYXVkaXRsb2cKLSAgICAgICAgICAgICAgICBbLS1leGNsdWRlZC1jYXRlZ29yaWVzIDxleGNsdWRlZF9jYXRlZ29yaWVzPl0KLSAgICAgICAgICAgICAgICBbLS1leGNsdWRlZC1rZXlzcGFjZXMgPGV4Y2x1ZGVkX2tleXNwYWNlcz5dCi0gICAgICAgICAgICAgICAgWy0tZXhjbHVkZWQtdXNlcnMgPGV4Y2x1ZGVkX3VzZXJzPl0KLSAgICAgICAgICAgICAgICBbLS1pbmNsdWRlZC1jYXRlZ29yaWVzIDxpbmNsdWRlZF9jYXRlZ29yaWVzPl0KLSAgICAgICAgICAgICAgICBbLS1pbmNsdWRlZC1rZXlzcGFjZXMgPGluY2x1ZGVkX2tleXNwYWNlcz5dCi0gICAgICAgICAgICAgICAgWy0taW5jbHVkZWQtdXNlcnMgPGluY2x1ZGVkX3VzZXJzPl0gWy0tbG9nZ2VyIDxsb2dnZXI+XQotCi1PUFRJT05TCi0gICAgICAgIC0tZXhjbHVkZWQtY2F0ZWdvcmllcyA8ZXhjbHVkZWRfY2F0ZWdvcmllcz4KLSAgICAgICAgICAgIENvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIEF1ZGl0IExvZyBDYXRlZ29yaWVzIHRvIGJlIGV4Y2x1ZGVkIGZvcgotICAgICAgICAgICAgYXVkaXQgbG9nLiBJZiBub3Qgc2V0IHRoZSB2YWx1ZSBmcm9tIGNhc3NhbmRyYS55YW1sIHdpbGwgYmUgdXNlZAotCi0gICAgICAgIC0tZXhjbHVkZWQta2V5c3BhY2VzIDxleGNsdWRlZF9rZXlzcGFjZXM+Ci0gICAgICAgICAgICBDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBrZXlzcGFjZXMgdG8gYmUgZXhjbHVkZWQgZm9yIGF1ZGl0IGxvZy4gSWYKLSAgICAgICAgICAgIG5vdCBzZXQgdGhlIHZhbHVlIGZyb20gY2Fzc2FuZHJhLnlhbWwgd2lsbCBiZSB1c2VkCi0KLSAgICAgICAgLS1leGNsdWRlZC11c2VycyA8ZXhjbHVkZWRfdXNlcnM+Ci0gICAgICAgICAgICBDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiB1c2VycyB0byBiZSBleGNsdWRlZCBmb3IgYXVkaXQgbG9nLiBJZiBub3QKLSAgICAgICAgICAgIHNldCB0aGUgdmFsdWUgZnJvbSBjYXNzYW5kcmEueWFtbCB3aWxsIGJlIHVzZWQKLQotICAgICAgICAtaCA8aG9zdD4sIC0taG9zdCA8aG9zdD4KLSAgICAgICAgICAgIE5vZGUgaG9zdG5hbWUgb3IgaXAgYWRkcmVzcwotCi0gICAgICAgIC0taW5jbHVkZWQtY2F0ZWdvcmllcyA8aW5jbHVkZWRfY2F0ZWdvcmllcz4KLSAgICAgICAgICAgIENvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIEF1ZGl0IExvZyBDYXRlZ29yaWVzIHRvIGJlIGluY2x1ZGVkIGZvcgotICAgICAgICAgICAgYXVkaXQgbG9nLiBJZiBub3Qgc2V0IHRoZSB2YWx1ZSBmcm9tIGNhc3NhbmRyYS55YW1sIHdpbGwgYmUgdXNlZAotCi0gICAgICAgIC0taW5jbHVkZWQta2V5c3BhY2VzIDxpbmNsdWRlZF9rZXlzcGFjZXM+Ci0gICAgICAgICAgICBDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBrZXlzcGFjZXMgdG8gYmUgaW5jbHVkZWQgZm9yIGF1ZGl0IGxvZy4gSWYKLSAgICAgICAgICAgIG5vdCBzZXQgdGhlIHZhbHVlIGZyb20gY2Fzc2FuZHJhLnlhbWwgd2lsbCBiZSB1c2VkCi0KLSAgICAgICAgLS1pbmNsdWRlZC11c2VycyA8aW5jbHVkZWRfdXNlcnM+Ci0gICAgICAgICAgICBDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiB1c2VycyB0byBiZSBpbmNsdWRlZCBmb3IgYXVkaXQgbG9nLiBJZiBub3QKLSAgICAgICAgICAgIHNldCB0aGUgdmFsdWUgZnJvbSBjYXNzYW5kcmEueWFtbCB3aWxsIGJlIHVzZWQKLQotICAgICAgICAtLWxvZ2dlciA8bG9nZ2VyPgotICAgICAgICAgICAgTG9nZ2VyIG5hbWUgdG8gYmUgdXNlZCBmb3IgQXVkaXRMb2dnaW5nLiBEZWZhdWx0IEJpbkF1ZGl0TG9nZ2VyLiBJZgotICAgICAgICAgICAgbm90IHNldCB0aGUgdmFsdWUgZnJvbSBjYXNzYW5kcmEueWFtbCB3aWxsIGJlIHVzZWQKLQotICAgICAgICAtcCA8cG9ydD4sIC0tcG9ydCA8cG9ydD4KLSAgICAgICAgICAgIFJlbW90ZSBqbXggYWdlbnQgcG9ydCBudW1iZXIKLQotICAgICAgICAtcHAsIC0tcHJpbnQtcG9ydAotICAgICAgICAgICAgT3BlcmF0ZSBpbiA0LjAgbW9kZSB3aXRoIGhvc3RzIGRpc2FtYmlndWF0ZWQgYnkgcG9ydCBudW1iZXIKLQotICAgICAgICAtcHcgPHBhc3N3b3JkPiwgLS1wYXNzd29yZCA8cGFzc3dvcmQ+Ci0gICAgICAgICAgICBSZW1vdGUgam14IGFnZW50IHBhc3N3b3JkCi0KLSAgICAgICAgLXB3ZiA8cGFzc3dvcmRGaWxlUGF0aD4sIC0tcGFzc3dvcmQtZmlsZSA8cGFzc3dvcmRGaWxlUGF0aD4KLSAgICAgICAgICAgIFBhdGggdG8gdGhlIEpNWCBwYXNzd29yZCBmaWxlCi0KLSAgICAgICAgLXUgPHVzZXJuYW1lPiwgLS11c2VybmFtZSA8dXNlcm5hbWU+Ci0gICAgICAgICAgICBSZW1vdGUgam14IGFnZW50IHVzZXJuYW1lCi0tLS0tCi0KLVRvIGVuYWJsZSBhdWRpdCBsb2dnaW5nLCBydW4gZm9sbG93aW5nIGNvbW1hbmQgb24gZWFjaCBub2RlIGluIHRoZSBjbHVzdGVyIG9uIHdoaWNoIHlvdSB3YW50IHRvIGVuYWJsZSBsb2dnaW5nOgotCi1bc291cmNlLCBiYXNoXQotLS0tLQotJCBub2RldG9vbCBlbmFibGVhdWRpdGxvZwotLS0tLQotCi09PSBEaXNhYmxpbmcgYXVkaXQgbG9nZ2luZwotCi1Vc2UgdGhlIGBub2RldG9vbCBkaXNhYmxlYXVkaXRsb2dgIGNvbW1hbmQgdG8gZGlzYWJsZSBhdWRpdCBsb2dnaW5nLiAKLQotPT0gVmlld2luZyBhdWRpdCBsb2dzCi0KLVRoZSBgYXVkaXRsb2d2aWV3ZXJgIHRvb2wgaXMgdXNlZCB0byB2aWV3IChkdW1wKSBhdWRpdCBsb2dzIGlmIHRoZSBsb2dnZXIgd2FzIGBgQmluQXVkaXRMb2dnZXJgYC4uIAotYGBhdWRpdGxvZ3ZpZXdlcmBgIGNvbnZlcnRzIHRoZSBiaW5hcnkgbG9nIGZpbGVzIGludG8gaHVtYW4tcmVhZGFibGUgZm9ybWF0OyBvbmx5IHRoZSBhdWRpdCBsb2cgZGlyZWN0b3J5IG11c3QgYmUgc3VwcGxpZWQgYXMgYSBjb21tYW5kLWxpbmUgb3B0aW9uLgotSWYgdGhlIGxvZ2dlciBgYEZpbGVBdWRpdExvZ2dlcmBgIHdhcyBzZXQsIHRoZSBsb2cgZmlsZSBhcmUgYWxyZWFkeSBpbiBodW1hbi1yZWFkYWJsZSBmb3JtYXQgYW5kIGBgYXVkaXRsb2d2aWV3ZXJgYCBpcyBub3QgbmVlZGVkIHRvIHJlYWQgZmlsZXMuIAotCi0KLVRoZSBzeW50YXggb2YgYGF1ZGl0bG9ndmlld2VyYCBpczoKLQotW3NvdXJjZSwgcGxhaW50ZXh0XQotLS0tLQotYXVkaXRsb2d2aWV3ZXIKLQotQXVkaXQgbG9nIGZpbGVzIGRpcmVjdG9yeSBwYXRoIGlzIGEgcmVxdWlyZWQgYXJndW1lbnQuCi11c2FnZTogYXVkaXRsb2d2aWV3ZXIgPHBhdGgxPiBbPHBhdGgyPi4uLjxwYXRoTj5dIFtvcHRpb25zXQotLS0KLVZpZXcgdGhlIGF1ZGl0IGxvZyBjb250ZW50cyBpbiBodW1hbiByZWFkYWJsZSBmb3JtYXQKLS0tCi1PcHRpb25zIGFyZToKLS1mLC0tZm9sbG93ICAgICAgIFVwb24gcmVhY2hpbmcgdGhlIGVuZCBvZiB0aGUgbG9nIGNvbnRpbnVlIGluZGVmaW5pdGVseQotICAgICAgICAgICAgICAgICAgd2FpdGluZyBmb3IgbW9yZSByZWNvcmRzCi0taCwtLWhlbHAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBtZXNzYWdlCi0tciwtLXJvbGxfY3ljbGUgICBIb3cgb2Z0ZW4gdG8gcm9sbCB0aGUgbG9nIGZpbGUgd2FzIHJvbGxlZC4gTWF5IGJlCi0gICAgICAgICAgICAgICAgICBuZWNlc3NhcnkgZm9yIENocm9uaWNsZSB0byBjb3JyZWN0bHkgcGFyc2UgZmlsZSBuYW1lcy4gKE1JTlVURUxZLCBIT1VSTFksCi0gICAgICAgICAgICAgICAgICBEQUlMWSkuIERlZmF1bHQgSE9VUkxZLgotLS0tLQotCi09PSBFeGFtcGxlCi0KLVthcmFiaWMsIHN0YXJ0PTFdCi0uIFRvIGRlbW9uc3RyYXRlIGF1ZGl0IGxvZ2dpbmcsIGZpcnN0IGNvbmZpZ3VyZSB0aGUgYGBjYXNzYW5kcmEueWFtbGBgIGZpbGUgd2l0aCB0aGUgZm9sbG93aW5nIHNldHRpbmdzOgotCi1bc291cmNlLCB5YW1sXQotLS0tLQotYXVkaXRfbG9nZ2luZ19vcHRpb25zOgotICAgZW5hYmxlZDogdHJ1ZQotICAgbG9nZ2VyOiBCaW5BdWRpdExvZ2dlcgotICAgYXVkaXRfbG9nc19kaXI6ICIvY2Fzc2FuZHJhL2F1ZGl0L2xvZ3MvaG91cmx5IgotICAgIyBpbmNsdWRlZF9rZXlzcGFjZXM6Ci0gICAjIGV4Y2x1ZGVkX2tleXNwYWNlczogc3lzdGVtLCBzeXN0ZW1fc2NoZW1hLCBzeXN0ZW1fdmlydHVhbF9zY2hlbWEKLSAgICMgaW5jbHVkZWRfY2F0ZWdvcmllczoKLSAgICMgZXhjbHVkZWRfY2F0ZWdvcmllczoKLSAgICMgaW5jbHVkZWRfdXNlcnM6Ci0gICAjIGV4Y2x1ZGVkX3VzZXJzOgotICAgcm9sbF9jeWNsZTogSE9VUkxZCi0gICAjIGJsb2NrOiB0cnVlCi0gICAjIG1heF9xdWV1ZV93ZWlnaHQ6IDI2ODQzNTQ1NiAjIDI1NiBNaUIKLSAgICMgbWF4X2xvZ19zaXplOiAxNzE3OTg2OTE4NCAjIDE2IEdpQgotICAgIyMgYXJjaGl2ZSBjb21tYW5kIGlzICIvcGF0aC90by9zY3JpcHQuc2ggJXBhdGgiIHdoZXJlICVwYXRoIGlzIHJlcGxhY2VkIHdpdGggdGhlIGZpbGUgYmVpbmcgcm9sbGVkOgotICAgIyBhcmNoaXZlX2NvbW1hbmQ6Ci0gICAjIG1heF9hcmNoaXZlX3JldHJpZXM6IDEwCi0tLS0tCi0KLVthcmFiaWMsIHN0YXJ0PTJdCi0uIENyZWF0ZSB0aGUgYXVkaXQgbG9nIGRpcmVjdG9yeSBgL2Nhc3NhbmRyYS9hdWRpdC9sb2dzL2hvdXJseWAgYW5kIHNldCB0aGUgZGlyZWN0b3J5IHBlcm1pc3Npb25zIHRvIHJlYWQsIHdyaXRlLCBhbmQgZXhlY3V0ZSBmb3IgYWxsLiAKLQotW2FyYWJpYywgc3RhcnQ9M10KLS4gTm93IGNyZWF0ZSBhIGRlbW8ga2V5c3BhY2UgYW5kIHRhYmxlIGFuZCBpbnNlcnQgc29tZSBkYXRhIHVzaW5nIGBgY3Fsc2hgYDoKLQotW3NvdXJjZSwgY3FsXQotLS0tLQotIGNxbHNoPiBDUkVBVEUgS0VZU1BBQ0UgYXVkaXRsb2drZXlzcGFjZQotICAgLi4uIFdJVEggcmVwbGljYXRpb24gPSB7J2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3RvcicgOiAxfTsKLSBjcWxzaD4gVVNFIGF1ZGl0bG9na2V5c3BhY2U7Ci0gY3Fsc2g6YXVkaXRsb2drZXlzcGFjZT4gQ1JFQVRFIFRBQkxFIHQgKAotIC4uLmlkIGludCwKLSAuLi5rIGludCwKLSAuLi52IHRleHQsCi0gLi4uUFJJTUFSWSBLRVkgKGlkKQotIC4uLiApOwotIGNxbHNoOmF1ZGl0bG9na2V5c3BhY2U+IElOU0VSVCBJTlRPIHQgKGlkLCBrLCB2KSBWQUxVRVMgKDAsIDAsICd2YWwwJyk7Ci0gY3Fsc2g6YXVkaXRsb2drZXlzcGFjZT4gSU5TRVJUIElOVE8gdCAoaWQsIGssIHYpIFZBTFVFUyAoMCwgMSwgJ3ZhbDEnKTsKLS0tLS0KLQotQWxsIHRoZSBzdXBwb3J0ZWQgQ1FMIGNvbW1hbmRzIHdpbGwgYmUgbG9nZ2VkIHRvIHRoZSBhdWRpdCBsb2cgZGlyZWN0b3J5LgotCi1bYXJhYmljLCBzdGFydD00XQotLiBDaGFuZ2UgZGlyZWN0b3J5IHRvIHRoZSBhdWRpdCBsb2dzIGRpcmVjdG9yeS4KLQotW3NvdXJjZSwgYmFzaF0KLS0tLS0KLSQgY2QgL2Nhc3NhbmRyYS9hdWRpdC9sb2dzL2hvdXJseQotLS0tLQotCi1bYXJhYmljLCBzdGFydD01XQotLiBMaXN0IHRoZSBhdWRpdCBsb2cgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLiAKLQotW3NvdXJjZSwgYmFzaF0KLS0tLS0KLSQgbHMgLWwKLS0tLS0KLQotWW91IHNob3VsZCBzZWUgcmVzdWx0cyBzaW1pbGFyIHRvOgotCi1bc291cmNlLCBwbGFpbnRleHRdCi0tLS0tCi10b3RhbCAyOAotLXJ3LXJ3LXItLS4gMSBlYzItdXNlciBlYzItdXNlciAgICA2NTUzNiBBdWcgIDIgMDM6MDEgZGlyZWN0b3J5LWxpc3RpbmcuY3E0dAotLXJ3LXJ3LXItLS4gMSBlYzItdXNlciBlYzItdXNlciA4Mzg4NjA4MCBBdWcgIDIgMDM6MDEgMjAxOTA4MDItMDIuY3E0Ci0tcnctcnctci0tLiAxIGVjMi11c2VyIGVjMi11c2VyIDgzODg2MDgwIEF1ZyAgMiAwMzowMSAyMDE5MDgwMi0wMy5jcTQKLS0tLS0KLQotVGhlIGF1ZGl0IGxvZyBmaWxlcyB3aWxsIGFsbCBiZSBsaXN0ZWQgd2l0aCBhIGAuY3E0YCBmaWxlIHR5cGUuIFRoZSBhdWRpdCBkaXJlY3RvcnkgaXMgb2YgYC5jcTR0YCB0eXBlLgotCi1bYXJhYmljLCBzdGFydD02XQotLiBSdW4gYGF1ZGl0bG9ndmlld2VyYCB0b29sIHRvIHZpZXcgdGhlIGF1ZGl0IGxvZ3MuIAotCi1bc291cmNlLCBiYXNoXQotLS0tLQotJCBhdWRpdGxvZ3ZpZXdlciAvY2Fzc2FuZHJhL2F1ZGl0L2xvZ3MvaG91cmx5Ci0tLS0tCi0KLVRoaXMgY29tbWFuZCB3aWxsIHJldHVybiBhIHJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIGxvZy4gSGVyZSBpcyBhIHBhcnRpYWwgc2FtcGxlIG9mIHRoZSBsb2cgZm9yIHRoZSBjb21tYW5kcyBpbiB0aGlzIGRlbW86Ci0KLVtzb3VyY2UsIHBsYWludGV4dF0KLS0tLS0KLVdBUk4gIDAzOjEyOjExLDEyNCBVc2luZyBQYXVzZXIuc2xlZXB5KCkgYXMgbm90IGVub3VnaCBwcm9jZXNzb3JzLCBoYXZlIDIsIG5lZWRzIDgrCi1UeXBlOiBBdWRpdExvZwotTG9nTWVzc2FnZToKLXVzZXI6YW5vbnltb3VzfGhvc3Q6MTAuMC4yLjIzODo3MDAwfHNvdXJjZTovMTI3LjAuMC4xfHBvcnQ6NDYyNjR8dGltZXN0YW1wOjE1NjQ3MTE0MjczMjh8dHlwZSA6VVNFX0tFWVNQQUNFfGNhdGVnb3J5Ok9USEVSfGtzOmF1ZGl0bG9na2V5c3BhY2V8b3BlcmF0aW9uOlVTRSBBdWRpdExvZ0tleXNwYWNlOwotVHlwZTogQXVkaXRMb2cKLUxvZ01lc3NhZ2U6Ci11c2VyOmFub255bW91c3xob3N0OjEwLjAuMi4yMzg6NzAwMHxzb3VyY2U6LzEyNy4wLjAuMXxwb3J0OjQ2MjY0fHRpbWVzdGFtcDoxNTY0NzExNDI3MzI5fHR5cGUgOlVTRV9LRVlTUEFDRXxjYXRlZ29yeTpPVEhFUnxrczphdWRpdGxvZ2tleXNwYWNlfG9wZXJhdGlvbjpVU0UgImF1ZGl0bG9na2V5c3BhY2UiCi1UeXBlOiBBdWRpdExvZwotTG9nTWVzc2FnZToKLXVzZXI6YW5vbnltb3VzfGhvc3Q6MTAuMC4yLjIzODo3MDAwfHNvdXJjZTovMTI3LjAuMC4xfHBvcnQ6NDYyNjR8dGltZXN0YW1wOjE1NjQ3MTE0NDYyNzl8dHlwZSA6U0VMRUNUfGNhdGVnb3J5OlFVRVJZfGtzOmF1ZGl0bG9na2V5c3BhY2V8c2NvcGU6dHxvcGVyYXRpb246U0VMRUNUICogRlJPTSB0OwotVHlwZTogQXVkaXRMb2cKLUxvZ01lc3NhZ2U6Ci11c2VyOmFub255bW91c3xob3N0OjEwLjAuMi4yMzg6NzAwMHxzb3VyY2U6LzEyNy4wLjAuMXxwb3J0OjQ2MjY0fHRpbWVzdGFtcDoxNTY0NzEzODc4ODM0fHR5cGUgOkRST1BfVEFCTEV8Y2F0ZWdvcnk6RERMfGtzOmF1ZGl0bG9na2V5c3BhY2V8c2NvcGU6dHxvcGVyYXRpb246RFJPUCBUQUJMRSBJRiBFWElTVFMKLUF1ZGl0TG9nS2V5c3BhY2UudDsKLVR5cGU6IEF1ZGl0TG9nCi1Mb2dNZXNzYWdlOgotdXNlcjphbm9ueW1vdXN8aG9zdDoxMC4wLjIuMjM4OjcwMDB8c291cmNlOi8zLjkxLjU2LjE2NHxwb3J0OjQyMzgyfHRpbWVzdGFtcDoxNTY0NzE0NjE4MzYwfHR5Ci1wZTpSRVFVRVNUX0ZBSUxVUkV8Y2F0ZWdvcnk6RVJST1J8b3BlcmF0aW9uOkNSRUFURSBLRVlTUEFDRSBBdWRpdExvZ0tleXNwYWNlCi1XSVRIIHJlcGxpY2F0aW9uID0geydjbGFzcyc6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InIDogMX07OyBDYW5ub3QgYWRkCi1leGlzdGluZyBrZXlzcGFjZSAiYXVkaXRsb2drZXlzcGFjZSIKLVR5cGU6IEF1ZGl0TG9nCi1Mb2dNZXNzYWdlOgotdXNlcjphbm9ueW1vdXN8aG9zdDoxMC4wLjIuMjM4OjcwMDB8c291cmNlOi8xMjcuMC4wLjF8cG9ydDo0NjI2NHx0aW1lc3RhbXA6MTU2NDcxNDY5MDk2OHx0eXBlIDpEUk9QX0tFWVNQQUNFfGNhdGVnb3J5OkRETHxrczphdWRpdGxvZ2tleXNwYWNlfG9wZXJhdGlvbjpEUk9QIEtFWVNQQUNFIEF1ZGl0TG9nS2V5c3BhY2U7Ci1UeXBlOiBBdWRpdExvZwotTG9nTWVzc2FnZToKLXVzZXI6YW5vbnltb3VzfGhvc3Q6MTAuMC4yLjIzODo3MDAwfHNvdXJjZTovMy45MS41Ni4xNjR8cG9ydDo0MjQwNnx0aW1lc3RhbXA6MTU2NDcxNDcwODMyOXx0eSBwZTpDUkVBVEVfS0VZU1BBQ0V8Y2F0ZWdvcnk6RERMfGtzOmF1ZGl0bG9na2V5c3BhY2V8b3BlcmF0aW9uOkNSRUFURSBLRVlTUEFDRQotQXVkaXRMb2dLZXlzcGFjZQotV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJyA6IDF9OwotVHlwZTogQXVkaXRMb2cKLUxvZ01lc3NhZ2U6Ci11c2VyOmFub255bW91c3xob3N0OjEwLjAuMi4yMzg6NzAwMHxzb3VyY2U6LzEyNy4wLjAuMXxwb3J0OjQ2MjY0fHRpbWVzdGFtcDoxNTY0NzE0ODcwNjc4fHR5cGUgOlVTRV9LRVlTUEFDRXxjYXRlZ29yeTpPVEhFUnxrczphdWRpdGxvZ2tleXNwYWNlfG9wZXJhdGlvbjpVU0UgYXVkaXRsb2drZXlzcGFjZTsKLQotUGFzc3dvcmQgb2JmdXNjYXRpb24gZXhhbXBsZXM6Ci1Mb2dNZXNzYWdlOiB1c2VyOmNhc3NhbmRyYXxob3N0OmxvY2FsaG9zdC8xMjcuMC4wLjE6NzAwMHxzb3VyY2U6LzEyNy4wLjAuMXxwb3J0OjY1MjgyfHRpbWVzdGFtcDoxNjIyNjMwNDk2NzA4fHR5cGU6Q1JFQVRFX1JPTEV8Y2F0ZWdvcnk6RENMfG9wZXJhdGlvbjpDUkVBVEUgUk9MRSByb2xlMSBXSVRIIFBBU1NXT1JEID0gJyoqKioqKionOwotVHlwZTogYXVkaXQKLUxvZ01lc3NhZ2U6IHVzZXI6Y2Fzc2FuZHJhfGhvc3Q6bG9jYWxob3N0LzEyNy4wLjAuMTo3MDAwfHNvdXJjZTovMTI3LjAuMC4xfHBvcnQ6NjUyODJ8dGltZXN0YW1wOjE2MjI2MzA2MzQ1NTJ8dHlwZTpBTFRFUl9ST0xFfGNhdGVnb3J5OkRDTHxvcGVyYXRpb246QVRMRVIgUk9MRSByb2xlMSBXSVRIIFBBU1NXT1JEID0gJyoqKioqKionOwotVHlwZTogYXVkaXQKLUxvZ01lc3NhZ2U6IHVzZXI6Y2Fzc2FuZHJhfGhvc3Q6bG9jYWxob3N0LzEyNy4wLjAuMTo3MDAwfHNvdXJjZTovMTI3LjAuMC4xfHBvcnQ6NjUyODJ8dGltZXN0YW1wOjE2MjI2MzA2OTg2ODZ8dHlwZTpDUkVBVEVfUk9MRXxjYXRlZ29yeTpEQ0x8b3BlcmF0aW9uOkNSRUFURSBVU0VSIHVzZXIxIFdJVEggUEFTU1dPUkQgJyoqKioqKionOwotVHlwZTogYXVkaXQKLUxvZ01lc3NhZ2U6IHVzZXI6Y2Fzc2FuZHJhfGhvc3Q6bG9jYWxob3N0LzEyNy4wLjAuMTo3MDAwfHNvdXJjZTovMTI3LjAuMC4xfHBvcnQ6NjUyODJ8dGltZXN0YW1wOjE2MjI2MzA3NDczNDR8dHlwZTpBTFRFUl9ST0xFfGNhdGVnb3J5OkRDTHxvcGVyYXRpb246QUxURVIgVVNFUiB1c2VyMSBXSVRIIFBBU1NXT1JEICcqKioqKioqJzsKLS0tLS0KLQotPT0gRGlhZ25vc3RpYyBldmVudHMgZm9yIHVzZXIgYXVkaXQgbG9nZ2luZwotCi1BbnkgbmF0aXZlIHRyYW5zcG9ydC1lbmFibGVkIGNsaWVudCBjYW4gc3Vic2NyaWJlIHRvIGF1ZGl0IGxvZyBldmVudHMgZm9yIGRpYWdub3NpbmcgY2x1c3RlciBpc3N1ZXMuCi1UaGVzZSBldmVudHMgY2FuIGJlIGNvbnN1bWVkIGJ5IGV4dGVybmFsIHRvb2xzIHRvIGltcGxlbWVudCBhIENhc3NhbmRyYSB1c2VyIGF1ZGl0aW5nIHNvbHV0aW9uLgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9iYWNrdXBzLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL2JhY2t1cHMuYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4M2Q1Yi4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL2JhY2t1cHMuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDUxNyArMCwwIEBACi09IEJhY2t1cHMKLQotQXBhY2hlIENhc3NhbmRyYSBzdG9yZXMgZGF0YSBpbiBpbW11dGFibGUgU1NUYWJsZSBmaWxlcy4gQmFja3VwcyBpbgotQXBhY2hlIENhc3NhbmRyYSBkYXRhYmFzZSBhcmUgYmFja3VwIGNvcGllcyBvZiB0aGUgZGF0YWJhc2UgZGF0YSB0aGF0IGlzCi1zdG9yZWQgYXMgU1NUYWJsZSBmaWxlcy4gQmFja3VwcyBhcmUgdXNlZCBmb3Igc2V2ZXJhbCBwdXJwb3NlcyBpbmNsdWRpbmcKLXRoZSBmb2xsb3dpbmc6Ci0KLSogVG8gc3RvcmUgYSBkYXRhIGNvcHkgZm9yIGR1cmFiaWxpdHkKLSogVG8gYmUgYWJsZSB0byByZXN0b3JlIGEgdGFibGUgaWYgdGFibGUgZGF0YSBpcyBsb3N0IGR1ZSB0bwotbm9kZS9wYXJ0aXRpb24vbmV0d29yayBmYWlsdXJlCi0qIFRvIGJlIGFibGUgdG8gdHJhbnNmZXIgdGhlIFNTVGFibGUgZmlsZXMgdG8gYSBkaWZmZXJlbnQgbWFjaGluZTsgZm9yCi1wb3J0YWJpbGl0eQotCi09PSBUeXBlcyBvZiBCYWNrdXBzCi0KLUFwYWNoZSBDYXNzYW5kcmEgc3VwcG9ydHMgdHdvIGtpbmRzIG9mIGJhY2t1cCBzdHJhdGVnaWVzLgotCi0qIFNuYXBzaG90cwotKiBJbmNyZW1lbnRhbCBCYWNrdXBzCi0KLUEgX3NuYXBzaG90XyBpcyBhIGNvcHkgb2YgYSB0YWJsZeKAmXMgU1NUYWJsZSBmaWxlcyBhdCBhIGdpdmVuIHRpbWUsCi1jcmVhdGVkIHZpYSBoYXJkIGxpbmtzLiAKLVRoZSBEREwgdG8gY3JlYXRlIHRoZSB0YWJsZSBpcyBzdG9yZWQgYXMgd2VsbC4KLVNuYXBzaG90cyBtYXkgYmUgY3JlYXRlZCBieSBhIHVzZXIgb3IgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LiAKLVRoZSBzZXR0aW5nIGBzbmFwc2hvdF9iZWZvcmVfY29tcGFjdGlvbmAgaW4gdGhlIGBjYXNzYW5kcmEueWFtbGAgZmlsZSBkZXRlcm1pbmVzIGlmCi1zbmFwc2hvdHMgYXJlIGNyZWF0ZWQgYmVmb3JlIGVhY2ggY29tcGFjdGlvbi4gCi1CeSBkZWZhdWx0LCBgc25hcHNob3RfYmVmb3JlX2NvbXBhY3Rpb25gIGlzIHNldCB0byBmYWxzZS4gCi1TbmFwc2hvdHMgbWF5IGJlIGNyZWF0ZWQgYXV0b21hdGljYWxseSBiZWZvcmUga2V5c3BhY2UgdHJ1bmNhdGlvbiBvciBkcm9wcGluZyBvZiBhIHRhYmxlIGJ5Ci1zZXR0aW5nIGBhdXRvX3NuYXBzaG90YCB0byB0cnVlIChkZWZhdWx0KSBpbiBgY2Fzc2FuZHJhLnlhbWxgLiAKLVRydW5jYXRlcyBjb3VsZCBiZSBkZWxheWVkIGR1ZSB0byB0aGUgYXV0byBzbmFwc2hvdHMgYW5kIGFub3RoZXIgc2V0dGluZyBpbgotYGNhc3NhbmRyYS55YW1sYCBkZXRlcm1pbmVzIGhvdyBsb25nIHRoZSBjb29yZGluYXRvciBzaG91bGQgd2FpdCBmb3IKLXRydW5jYXRlcyB0byBjb21wbGV0ZS4gCi1CeSBkZWZhdWx0IENhc3NhbmRyYSB3YWl0cyA2MCBzZWNvbmRzIGZvciBhdXRvIHNuYXBzaG90cyB0byBjb21wbGV0ZS4KLQotQW4gX2luY3JlbWVudGFsIGJhY2t1cF8gaXMgYSBjb3B5IG9mIGEgdGFibGXigJlzIFNTVGFibGUgZmlsZXMgY3JlYXRlZCBieQotYSBoYXJkIGxpbmsgd2hlbiBtZW10YWJsZXMgYXJlIGZsdXNoZWQgdG8gZGlzayBhcyBTU1RhYmxlcy4gCi1UeXBpY2FsbHkgaW5jcmVtZW50YWwgYmFja3VwcyBhcmUgcGFpcmVkIHdpdGggc25hcHNob3RzIHRvIHJlZHVjZSB0aGUgYmFja3VwIHRpbWUKLWFzIHdlbGwgYXMgcmVkdWNlIGRpc2sgc3BhY2UuIAotSW5jcmVtZW50YWwgYmFja3VwcyBhcmUgbm90IGVuYWJsZWQgYnkgZGVmYXVsdCBhbmQgbXVzdCBiZSBlbmFibGVkIGV4cGxpY2l0bHkgaW4gYGNhc3NhbmRyYS55YW1sYCAod2l0aAotYGluY3JlbWVudGFsX2JhY2t1cHNgIHNldHRpbmcpIG9yIHdpdGggYG5vZGV0b29sYC4gCi1PbmNlIGVuYWJsZWQsIENhc3NhbmRyYSBjcmVhdGVzIGEgaGFyZCBsaW5rIHRvIGVhY2ggU1NUYWJsZSBmbHVzaGVkIG9yIHN0cmVhbWVkCi1sb2NhbGx5IGluIGEgYGJhY2t1cHMvYCBzdWJkaXJlY3Rvcnkgb2YgdGhlIGtleXNwYWNlIGRhdGEuIAotSW5jcmVtZW50YWwgYmFja3VwcyBvZiBzeXN0ZW0gdGFibGVzIGFyZSBhbHNvIGNyZWF0ZWQuCi0KLT09IERhdGEgRGlyZWN0b3J5IFN0cnVjdHVyZQotCi1UaGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBvZiBDYXNzYW5kcmEgZGF0YSBjb25zaXN0cyBvZiBkaWZmZXJlbnQKLWRpcmVjdG9yaWVzIGZvciBrZXlzcGFjZXMsIGFuZCB0YWJsZXMgd2l0aCB0aGUgZGF0YSBmaWxlcyB3aXRoaW4gdGhlCi10YWJsZSBkaXJlY3Rvcmllcy4gCi1EaXJlY3RvcmllcyBiYWNrdXBzIGFuZCBzbmFwc2hvdHMgdG8gc3RvcmUgYmFja3VwcwotYW5kIHNuYXBzaG90cyByZXNwZWN0aXZlbHkgZm9yIGEgcGFydGljdWxhciB0YWJsZSBhcmUgYWxzbyBzdG9yZWQgd2l0aGluCi10aGUgdGFibGUgZGlyZWN0b3J5LiAKLVRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZvciBDYXNzYW5kcmEgaXMgaWxsdXN0cmF0ZWQgaW4gRmlndXJlIDEuCi0KLWltYWdlOjpGaWd1cmVfMV9iYWNrdXBzLmpwZ1tEYXRhIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIGJhY2t1cHNdCi0KLUZpZ3VyZSAxLiBEaXJlY3RvcnkgU3RydWN0dXJlIGZvciBDYXNzYW5kcmEgRGF0YQotCi09PT0gU2V0dGluZyBVcCBFeGFtcGxlIFRhYmxlcyBmb3IgQmFja3VwcyBhbmQgU25hcHNob3RzCi0KLUluIHRoaXMgc2VjdGlvbiB3ZSBzaGFsbCBjcmVhdGUgc29tZSBleGFtcGxlIGRhdGEgdGhhdCBjb3VsZCBiZSB1c2VkIHRvCi1kZW1vbnN0cmF0ZSBpbmNyZW1lbnRhbCBiYWNrdXBzIGFuZCBzbmFwc2hvdHMuIAotV2UgaGF2ZSB1c2VkIGEgdGhyZWUgbm9kZSBDYXNzYW5kcmEgY2x1c3Rlci4gCi1GaXJzdCwgdGhlIGtleXNwYWNlcyBhcmUgY3JlYXRlZC4gCi1UaGVuIHRhYmxlcyBhcmUgY3JlYXRlZCB3aXRoaW4gYSBrZXlzcGFjZSBhbmQgdGFibGUgZGF0YSBpcyBhZGRlZC4gCi1XZSBoYXZlIHVzZWQgdHdvIGtleXNwYWNlcyBgY3Fsa2V5c3BhY2VgIGFuZCBgY2F0YWxvZ2tleXNwYWNlYCB3aXRoIHR3byB0YWJsZXMgd2l0aGluCi1lYWNoLiAKLQotQ3JlYXRlIHRoZSBrZXlzcGFjZSBgY3Fsa2V5c3BhY2VgOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2NyZWF0ZV9rc19iYWNrdXAuY3FsW10KLS0tLS0KLQotQ3JlYXRlIHR3byB0YWJsZXMgYHRgIGFuZCBgdDJgIGluIHRoZSBgY3Fsa2V5c3BhY2VgIGtleXNwYWNlLgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2NyZWF0ZV90YWJsZV9iYWNrdXAuY3FsW10KLS0tLS0KLQotQWRkIGRhdGEgdG8gdGhlIHRhYmxlczogCi0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvaW5zZXJ0X2RhdGFfYmFja3VwLmNxbFtdCi0tLS0tCi0KLVF1ZXJ5IHRoZSB0YWJsZSB0byBsaXN0IHRoZSBkYXRhOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML3NlbGVjdF9kYXRhX2JhY2t1cC5jcWxbXQotLS0tLQotCi1yZXN1bHRzIGluCi0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL3NlbGVjdF9kYXRhX2JhY2t1cC5yZXN1bHRbXQotLS0tLQotCi1DcmVhdGUgYSBzZWNvbmQga2V5c3BhY2UgYGNhdGFsb2drZXlzcGFjZWA6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX2tzMl9iYWNrdXAuY3FsW10KLS0tLS0KLQotQ3JlYXRlIHR3byB0YWJsZXMgYGpvdXJuYWxgICBhbmQgYG1hZ2F6aW5lYCBpbiBgY2F0YWxvZ2tleXNwYWNlYDoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9jcmVhdGVfdGFibGUyX2JhY2t1cC5jcWxbXQotLS0tLQotCi1BZGQgZGF0YSB0byB0aGUgdGFibGVzOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2luc2VydF9kYXRhMl9iYWNrdXAuY3FsW10KLS0tLS0KLQotUXVlcnkgdGhlIHRhYmxlcyB0byBsaXN0IHRoZSBkYXRhOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML3NlbGVjdF9kYXRhMl9iYWNrdXAuY3FsW10KLS0tLS0KLQotcmVzdWx0cyBpbiAKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvc2VsZWN0X2RhdGEyX2JhY2t1cC5yZXN1bHRbXQotLS0tLQotCi09PSBTbmFwc2hvdHMKLQotSW4gdGhpcyBzZWN0aW9uLCB3ZSBkZW1vbnN0cmF0ZSBjcmVhdGluZyBzbmFwc2hvdHMuIAotVGhlIGNvbW1hbmQgdXNlZCB0byBjcmVhdGUgYSBzbmFwc2hvdCBpcyBgbm9kZXRvb2wgc25hcHNob3RgIHdpdGggdGhlIHVzYWdlOgotCi1bc291cmNlLGJhc2hdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvbm9kZXRvb2xfc25hcHNob3Quc2hbXQotLS0tLQotCi1yZXN1bHRzIGluCi0KLVtzb3VyY2UsIHBsYWludGV4dF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9ub2RldG9vbF9zbmFwc2hvdF9oZWxwLnJlc3VsdFtdCi0tLS0tCi0KLT09PSBDb25maWd1cmluZyBmb3IgU25hcHNob3RzCi0KLVRvIGRlbW9uc3RyYXRlIGNyZWF0aW5nIHNuYXBzaG90cyB3aXRoIE5vZGV0b29sIG9uIHRoZSBjb21tYW5kbGluZSB3ZQotaGF2ZSBzZXQgYGF1dG9fc25hcHNob3RzYCBzZXR0aW5nIHRvIGBmYWxzZWAgaW4gdGhlIGBjYXNzYW5kcmEueWFtbGAgZmlsZToKLQotW3NvdXJjZSx5YW1sXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRZQU1ML2F1dG9fc25hcHNob3QueWFtbFtdCi0tLS0tCi0KLUFsc28gc2V0IGBzbmFwc2hvdF9iZWZvcmVfY29tcGFjdGlvbmAgdG8gYGZhbHNlYCB0byBkaXNhYmxlIGNyZWF0aW5nCi1zbmFwc2hvdHMgYXV0b21hdGljYWxseSBiZWZvcmUgY29tcGFjdGlvbjoKLQotW3NvdXJjZSx5YW1sXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRZQU1ML3NuYXBzaG90X2JlZm9yZV9jb21wYWN0aW9uLnlhbWxbXQotLS0tLQotCi09PT0gQ3JlYXRpbmcgU25hcHNob3RzCi0KLUJlZm9yZSBjcmVhdGluZyBhbnkgc25hcHNob3RzLCBzZWFyY2ggZm9yIHNuYXBzaG90cyBhbmQgbm9uZSB3aWxsIGJlIGxpc3RlZDoKLQotW3NvdXJjZSxiYXNoXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2ZpbmRfc25hcHNob3RzLnNoW10KLS0tLS0KLQotV2Ugc2hhbGwgYmUgdXNpbmcgdGhlIGV4YW1wbGUga2V5c3BhY2VzIGFuZCB0YWJsZXMgdG8gY3JlYXRlIHNuYXBzaG90cy4KLQotPT09PSBUYWtpbmcgU25hcHNob3RzIG9mIGFsbCBUYWJsZXMgaW4gYSBLZXlzcGFjZQotCi1Vc2luZyB0aGUgc3ludGF4IGFib3ZlLCBjcmVhdGUgYSBzbmFwc2hvdCBjYWxsZWQgYGNhdGFsb2cta3NgIGZvciBhbGwgdGhlIHRhYmxlcwotaW4gdGhlIGBjYXRhbG9na2V5c3BhY2VgIGtleXNwYWNlOgotCi1bc291cmNlLGJhc2hdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvc25hcHNob3RfYmFja3VwMi5zaFtdCi0tLS0tCi0KLXJlc3VsdHMgaW4KLQotW3NvdXJjZSxub25lXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL3NuYXBzaG90X2JhY2t1cDIucmVzdWx0W10KLS0tLS0KLQotVXNpbmcgdGhlIGBmaW5kYCBjb21tYW5kIGFib3ZlLCB0aGUgc25hcHNob3RzIGFuZCBgc25hcHNob3RzYCBkaXJlY3RvcmllcyAKLWFyZSBub3cgZm91bmQgd2l0aCBsaXN0ZWQgZmlsZXMgc2ltaWxhciB0bzoKLQotW3NvdXJjZSwgcGxhaW50ZXh0XQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL3NuYXBzaG90X2JhY2t1cDJfZmluZC5yZXN1bHRbXQotLS0tLQotCi1TbmFwc2hvdHMgb2YgYWxsIHRhYmxlcyBpbiBtdWx0aXBsZSBrZXlzcGFjZXMgbWF5IGJlIGNyZWF0ZWQgc2ltaWxhcmx5OgotCi1bc291cmNlLGJhc2hdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvc25hcHNob3RfYm90aF9iYWNrdXBzLnNoW10KLS0tLS0KLQotPT09PSBUYWtpbmcgU25hcHNob3RzIG9mIFNpbmdsZSBUYWJsZSBpbiBhIEtleXNwYWNlCi0KLVRvIHRha2UgYSBzbmFwc2hvdCBvZiBhIHNpbmdsZSB0YWJsZSB0aGUgYG5vZGV0b29sIHNuYXBzaG90YCBjb21tYW5kCi1zeW50YXggYmVjb21lcyBhcyBmb2xsb3dzOgotCi1bc291cmNlLGJhc2hdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvc25hcHNob3Rfb25lX3RhYmxlLnNoW10KLS0tLS0KLQotVXNpbmcgdGhlIHN5bnRheCBhYm92ZSwgY3JlYXRlIGEgc25hcHNob3QgZm9yIHRhYmxlIGBtYWdhemluZWAgaW4ga2V5c3BhY2UgYGNhdGFsb2drZXlzcGFjZWA6Ci0KLVtzb3VyY2UsYmFzaF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQkFTSC9zbmFwc2hvdF9vbmVfdGFibGUyLnNoW10KLS0tLS0KLQotcmVzdWx0cyBpbgotIAotW3NvdXJjZSwgcGxhaW50ZXh0XQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL3NuYXBzaG90X29uZV90YWJsZTIucmVzdWx0W10KLS0tLS0KLQotPT09PSBUYWtpbmcgU25hcHNob3Qgb2YgTXVsdGlwbGUgVGFibGVzIGZyb20gc2FtZSBLZXlzcGFjZQotCi1UbyB0YWtlIHNuYXBzaG90cyBvZiBtdWx0aXBsZSB0YWJsZXMgaW4gYSBrZXlzcGFjZSB0aGUgbGlzdCBvZgotX0tleXNwYWNlLnRhYmxlXyBtdXN0IGJlIHNwZWNpZmllZCB3aXRoIG9wdGlvbiBgLS1rdC1saXN0YC4gCi1Gb3IgZXhhbXBsZSwgY3JlYXRlIHNuYXBzaG90cyBmb3IgdGFibGVzIGB0YCBhbmQgYHQyYCBpbiB0aGUgYGNxbGtleXNwYWNlYCBrZXlzcGFjZToKLQotW3NvdXJjZSxiYXNoXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL3NuYXBzaG90X211bHRfdGFibGVzLnNoW10KLS0tLS0KLQotcmVzdWx0cyBpbgotCi1bc291cmNlLHBsYWludGV4dF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9zbmFwc2hvdF9tdWx0X3RhYmxlcy5yZXN1bHRbXQotLS0tLQotCi1NdWx0aXBsZSBzbmFwc2hvdHMgb2YgdGhlIHNhbWUgc2V0IG9mIHRhYmxlcyBtYXkgYmUgY3JlYXRlZCBhbmQgdGFnZ2VkIHdpdGggYSBkaWZmZXJlbnQgbmFtZS4gCi1BcyBhbiBleGFtcGxlLCBjcmVhdGUgYW5vdGhlciBzbmFwc2hvdCBmb3IgdGhlIHNhbWUgc2V0IG9mIHRhYmxlcyBgdGAgYW5kIGB0MmAgaW4gdGhlIGBjcWxrZXlzcGFjZWAgCi1rZXlzcGFjZSBhbmQgdGFnIHRoZSBzbmFwc2hvdHMgZGlmZmVyZW50bHk6Ci0KLVtzb3VyY2UsYmFzaF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQkFTSC9zbmFwc2hvdF9tdWx0X3RhYmxlc19hZ2Fpbi5zaFtdCi0tLS0tCi0KLXJlc3VsdHMgaW4KLQotW3NvdXJjZSwgcGxhaW50ZXh0XQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL3NuYXBzaG90X211bHRfdGFibGVzX2FnYWluLnJlc3VsdFtdCi0tLS0tCi0KLT09PT0gVGFraW5nIFNuYXBzaG90IG9mIE11bHRpcGxlIFRhYmxlcyBmcm9tIERpZmZlcmVudCBLZXlzcGFjZXMKLQotVG8gdGFrZSBzbmFwc2hvdHMgb2YgbXVsdGlwbGUgdGFibGVzIHRoYXQgYXJlIGluIGRpZmZlcmVudCBrZXlzcGFjZXMgdGhlCi1jb21tYW5kIHN5bnRheCBpcyB0aGUgc2FtZSBhcyB3aGVuIG11bHRpcGxlIHRhYmxlcyBhcmUgaW4gdGhlIHNhbWUKLWtleXNwYWNlLiAKLUVhY2ggPGtleXNwYWNlPi48dGFibGU+IG11c3QgYmUgc3BlY2lmaWVkIHNlcGFyYXRlbHkgaW4gdGhlCi1gLS1rdC1saXN0YCBvcHRpb24uIAotCi1Gb3IgZXhhbXBsZSwgY3JlYXRlIGEgc25hcHNob3QgZm9yIHRhYmxlIGB0YCBpbgotdGhlIGBjcWxrZXlzcGFjZWAgYW5kIHRhYmxlIGBqb3VybmFsYCBpbiB0aGUgY2F0YWxvZ2tleXNwYWNlIGFuZCB0YWcgdGhlCi1zbmFwc2hvdCBgbXVsdGkta3NgLgotCi1bc291cmNlLGJhc2hdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvc25hcHNob3RfbXVsdF9rcy5zaFtdCi0tLS0tCi0KLXJlc3VsdHMgaW4KLVtzb3VyY2UsIHBsYWludGV4dF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9zbmFwc2hvdF9tdWx0X2tzLnJlc3VsdFtdCi0tLS0tCi0KLT09PSBMaXN0aW5nIFNuYXBzaG90cwotCi1UbyBsaXN0IHNuYXBzaG90cyB1c2UgdGhlIGBub2RldG9vbCBsaXN0c25hcHNob3RzYCBjb21tYW5kLiBBbGwgdGhlCi1zbmFwc2hvdHMgdGhhdCB3ZSBjcmVhdGVkIGluIHRoZSBwcmVjZWRpbmcgZXhhbXBsZXMgZ2V0IGxpc3RlZDoKLQotW3NvdXJjZSxiYXNoXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL25vZGV0b29sX2xpc3Rfc25hcHNob3RzLnNoW10KLS0tLS0KLQotcmVzdWx0cyBpbgotCi1bc291cmNlLCBwbGFpbnRleHRdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvbm9kZXRvb2xfbGlzdF9zbmFwc2hvdHMucmVzdWx0W10KLS0tLS0KLQotPT09IEZpbmRpbmcgU25hcHNob3RzIERpcmVjdG9yaWVzCi0KLVRoZSBgc25hcHNob3RzYCBkaXJlY3RvcmllcyBtYXkgYmUgbGlzdGVkIHdpdGggYGZpbmQg4oCTbmFtZSBzbmFwc2hvdHNgCi1jb21tYW5kOgotCi1bc291cmNlLGJhc2hdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvZmluZF9zbmFwc2hvdHMuc2hbXQotLS0tLQotCi1yZXN1bHRzIGluCi0KLVtzb3VyY2UsIHBsYWludGV4dF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9zbmFwc2hvdF9hbGwucmVzdWx0W10KLS0tLS0KLQotVG8gbGlzdCB0aGUgc25hcHNob3RzIGZvciBhIHBhcnRpY3VsYXIgdGFibGUgZmlyc3QgY2hhbmdlIHRvIHRoZSBzbmFwc2hvdHMgZGlyZWN0b3J5IGZvciB0aGF0IHRhYmxlLiAKLUZvciBleGFtcGxlLCBsaXN0IHRoZSBzbmFwc2hvdHMgZm9yIHRoZSBgY2F0YWxvZ2tleXNwYWNlL2pvdXJuYWxgIHRhYmxlOgotCi1bc291cmNlLGJhc2hdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvZmluZF90d29fc25hcHNob3RzLnNoW10KLS0tLS0KLQotcmVzdWx0cyBpbgotCi1bc291cmNlLCBwbGFpbnRleHRdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvZmluZF90d29fc25hcHNob3RzLnJlc3VsdFtdCi0tLS0tCi0KLUEgYHNuYXBzaG90c2AgZGlyZWN0b3J5IGxpc3RzIHRoZSBTU1RhYmxlIGZpbGVzIGluIHRoZSBzbmFwc2hvdC4KLUEgYHNjaGVtYS5jcWxgIGZpbGUgaXMgYWxzbyBjcmVhdGVkIGluIGVhY2ggc25hcHNob3QgdGhhdCBkZWZpbmVzIHNjaGVtYQotdGhhdCBjYW4gcmVjcmVhdGUgdGhlIHRhYmxlIHdpdGggQ1FMIHdoZW4gcmVzdG9yaW5nIGZyb20gYSBzbmFwc2hvdDoKLQotW3NvdXJjZSxiYXNoXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL3NuYXBzaG90X2ZpbGVzLnNoW10KLS0tLS0KLQotcmVzdWx0cyBpbgotCi1bc291cmNlLCBwbGFpbnRleHRdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvc25hcHNob3RfZmlsZXMucmVzdWx0W10KLS0tLS0KLQotPT09IENsZWFyaW5nIFNuYXBzaG90cwotCi1TbmFwc2hvdHMgbWF5IGJlIGNsZWFyZWQgb3IgZGVsZXRlZCB3aXRoIHRoZSBgbm9kZXRvb2wgY2xlYXJzbmFwc2hvdGAKLWNvbW1hbmQuIEVpdGhlciBhIHNwZWNpZmljIHNuYXBzaG90IG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgb3IgdGhlIGDigJNhbGxgCi1vcHRpb24gbXVzdCBiZSBzcGVjaWZpZWQuIAotCi1Gb3IgZXhhbXBsZSwgZGVsZXRlIGEgc25hcHNob3QgY2FsbGVkIGBtYWdhemluZWAgZnJvbSBrZXlzcGFjZSBgY3Fsa2V5c3BhY2VgOgotCi1bc291cmNlLGJhc2hdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvbm9kZXRvb2xfY2xlYXJzbmFwc2hvdC5zaFtdCi0tLS0tCi0KLW9yIGRlbGV0ZSBhbGwgc25hcHNob3RzIGZyb20gYGNxbGtleXNwYWNlYCB3aXRoIHRoZSDigJNhbGwgb3B0aW9uOgotCi1bc291cmNlLGJhc2hdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvbm9kZXRvb2xfY2xlYXJzbmFwc2hvdF9hbGwuc2hbXQotLS0tLQotCi09PSBJbmNyZW1lbnRhbCBCYWNrdXBzCi0KLUluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMsIHdlIHNoYWxsIGRpc2N1c3MgY29uZmlndXJpbmcgYW5kIGNyZWF0aW5nCi1pbmNyZW1lbnRhbCBiYWNrdXBzLgotCi09PT0gQ29uZmlndXJpbmcgZm9yIEluY3JlbWVudGFsIEJhY2t1cHMKLQotVG8gY3JlYXRlIGluY3JlbWVudGFsIGJhY2t1cHMgc2V0IGBpbmNyZW1lbnRhbF9iYWNrdXBzYCB0byBgdHJ1ZWAgaW4KLWBjYXNzYW5kcmEueWFtbGAuCi0KLVtzb3VyY2UseWFtbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkWUFNTC9pbmNyZW1lbnRhbF9idXBzLnlhbWxbXQotLS0tLQotCi1UaGlzIGlzIHRoZSBvbmx5IHNldHRpbmcgbmVlZGVkIHRvIGNyZWF0ZSBpbmNyZW1lbnRhbCBiYWNrdXBzLiAKLUJ5IGRlZmF1bHQgYGluY3JlbWVudGFsX2JhY2t1cHNgIHNldHRpbmcgaXMgc2V0IHRvIGBmYWxzZWAgYmVjYXVzZSBhIG5ldwotc2V0IG9mIFNTVGFibGUgZmlsZXMgaXMgY3JlYXRlZCBmb3IgZWFjaCBkYXRhIGZsdXNoIGFuZCBpZiBzZXZlcmFsIENRTAotc3RhdGVtZW50cyBhcmUgdG8gYmUgcnVuIHRoZSBgYmFja3Vwc2AgZGlyZWN0b3J5IGNvdWxkIGZpbGwgdXAgcXVpY2tseQotYW5kIHVzZSB1cCBzdG9yYWdlIHRoYXQgaXMgbmVlZGVkIHRvIHN0b3JlIHRhYmxlIGRhdGEuIAotSW5jcmVtZW50YWwgYmFja3VwcyBtYXkgYWxzbyBiZSBlbmFibGVkIG9uIHRoZSBjb21tYW5kIGxpbmUgd2l0aCB0aGUgbm9kZXRvb2wKLWNvbW1hbmQgYG5vZGV0b29sIGVuYWJsZWJhY2t1cGAuIAotSW5jcmVtZW50YWwgYmFja3VwcyBtYXkgYmUgZGlzYWJsZWQgd2l0aCBgbm9kZXRvb2wgZGlzYWJsZWJhY2t1cGAgY29tbWFuZC4gCi1TdGF0dXMgb2YgaW5jcmVtZW50YWwgYmFja3Vwcywgd2hldGhlciB0aGV5IGFyZSBlbmFibGVkIG1heSBiZSBjaGVja2VkIHdpdGggYG5vZGV0b29sIHN0YXR1c2JhY2t1cGAuCi0KLT09PSBDcmVhdGluZyBJbmNyZW1lbnRhbCBCYWNrdXBzCi0KLUFmdGVyIGVhY2ggdGFibGUgaXMgY3JlYXRlZCBmbHVzaCB0aGUgdGFibGUgZGF0YSB3aXRoIGBub2RldG9vbCBmbHVzaGAKLWNvbW1hbmQuIEluY3JlbWVudGFsIGJhY2t1cHMgZ2V0IGNyZWF0ZWQuCi0KLVtzb3VyY2UsYmFzaF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQkFTSC9ub2RldG9vbF9mbHVzaC5zaFtdCi0tLS0tCi0KLT09PSBGaW5kaW5nIEluY3JlbWVudGFsIEJhY2t1cHMKLQotSW5jcmVtZW50YWwgYmFja3VwcyBhcmUgY3JlYXRlZCB3aXRoaW4gdGhlIENhc3NhbmRyYeKAmXMgYGRhdGFgIGRpcmVjdG9yeQotd2l0aGluIGEgdGFibGUgZGlyZWN0b3J5LiBCYWNrdXBzIG1heSBiZSBmb3VuZCB3aXRoIGZvbGxvd2luZyBjb21tYW5kLgotCi1bc291cmNlLGJhc2hdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvZmluZF9iYWNrdXBzLnNoW10KLS0tLS0KLXJlc3VsdHMgaW4KLVtzb3VyY2Usbm9uZV0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9maW5kX2JhY2t1cHMucmVzdWx0W10KLS0tLS0KLQotPT09IENyZWF0aW5nIGFuIEluY3JlbWVudGFsIEJhY2t1cAotCi1UaGlzIHNlY3Rpb24gZGlzY3Vzc2VzIGhvdyBpbmNyZW1lbnRhbCBiYWNrdXBzIGFyZSBjcmVhdGVkIGluIG1vcmUKLWRldGFpbCB1c2luZyB0aGUga2V5c3BhY2UgYW5kIHRhYmxlIHByZXZpb3VzbHkgY3JlYXRlZC4KLQotRmx1c2ggdGhlIGtleXNwYWNlIGFuZCB0YWJsZToKLQotW3NvdXJjZSxiYXNoXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL25vZGV0b29sX2ZsdXNoX3RhYmxlLnNoW10KLS0tLS0KLQotQSBzZWFyY2ggZm9yIGJhY2t1cHMgYW5kIGEgYGJhY2t1cHNgIGRpcmVjdG9yeSB3aWxsIGxpc3QgYSBiYWNrdXAgZGlyZWN0b3J5LAotZXZlbiBpZiB3ZSBoYXZlIGFkZGVkIG5vIHRhYmxlIGRhdGEgeWV0LgotCi1bc291cmNlLGJhc2hdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvZmluZF9iYWNrdXBzLnNoW10KLS0tLS0KLQotcmVzdWx0cyBpbgotCi1bc291cmNlLHBsYWludGV4dF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9maW5kX2JhY2t1cHNfdGFibGUucmVzdWx0W10KLS0tLS0KLQotQ2hlY2tpbmcgdGhlIGBiYWNrdXBzYCBkaXJlY3Rvcnkgd2lsbCBzaG93IHRoYXQgdGhlcmUgYXJlIGFsc28gbm8gYmFja3VwIGZpbGVzOgotCi1bc291cmNlLGJhc2hdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvY2hlY2tfYmFja3Vwcy5zaFtdCi0tLS0tCi0KLXJlc3VsdHMgaW4KLQotW3NvdXJjZSwgcGxhaW50ZXh0XQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL25vX2J1cHMucmVzdWx0W10KLS0tLS0KLQotSWYgYSByb3cgb2YgZGF0YSBpcyBhZGRlZCB0byB0aGUgZGF0YSwgcnVubmluZyB0aGUgYG5vZGV0b29sIGZsdXNoYCBjb21tYW5kIHdpbGwKLWZsdXNoIHRoZSB0YWJsZSBkYXRhIGFuZCBhbiBpbmNyZW1lbnRhbCBiYWNrdXAgd2lsbCBiZSBjcmVhdGVkOgotCi1bc291cmNlLGJhc2hdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvZmx1c2hfYW5kX2NoZWNrLnNoW10KLS0tLS0KLQotcmVzdWx0cyBpbiAKLQotW3NvdXJjZSwgcGxhaW50ZXh0XQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL2ZsdXNoX2FuZF9jaGVjay5yZXN1bHRbXQotLS0tLQotCi1bTk9URV0KLS5ub3RlCi09PT09Ci1UaGUgYGJhY2t1cHNgIGRpcmVjdG9yeSBmb3IgYW55IHRhYmxlLCBzdWNoIGFzIGBjcWxrZXlzcGFjZS90YCBpcyBjcmVhdGVkIGluIHRoZQotYGRhdGFgIGRpcmVjdG9yeSBmb3IgdGhhdCB0YWJsZS4KLT09PT0KLQotQWRkaW5nIGFub3RoZXIgcm93IG9mIGRhdGEgYW5kIGZsdXNoaW5nIHdpbGwgcmVzdWx0IGluIGFub3RoZXIgc2V0IG9mIGluY3JlbWVudGFsIGJhY2t1cCBmaWxlcy4KLVRoZSBTU1RhYmxlIGZpbGVzIGFyZSB0aW1lc3RhbXBlZCwgd2hpY2ggZGlzdGluZ3Vpc2hlcyB0aGUgZmlyc3QgaW5jcmVtZW50YWwgYmFja3VwIGZyb20gdGhlCi1zZWNvbmQ6Ci0KLVtzb3VyY2Usbm9uZV0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9mbHVzaF9hbmRfY2hlY2syLnJlc3VsdFtdCi0tLS0tCi0KLT09IFJlc3RvcmluZyBmcm9tIEluY3JlbWVudGFsIEJhY2t1cHMgYW5kIFNuYXBzaG90cwotCi1UaGUgdHdvIG1haW4gdG9vbHMvY29tbWFuZHMgZm9yIHJlc3RvcmluZyBhIHRhYmxlIGFmdGVyIGl0IGhhcyBiZWVuCi1kcm9wcGVkIGFyZToKLQotKiBzc3RhYmxlbG9hZGVyCi0qIG5vZGV0b29sIGltcG9ydAotCi1BIHNuYXBzaG90IGNvbnRhaW5zIGVzc2VudGlhbGx5IHRoZSBzYW1lIHNldCBvZiBTU1RhYmxlIGZpbGVzIGFzIGFuCi1pbmNyZW1lbnRhbCBiYWNrdXAgZG9lcyB3aXRoIGEgZmV3IGFkZGl0aW9uYWwgZmlsZXMuIEEgc25hcHNob3QgaW5jbHVkZXMKLWEgYHNjaGVtYS5jcWxgIGZpbGUgZm9yIHRoZSBzY2hlbWEgRERMIHRvIGNyZWF0ZSBhIHRhYmxlIGluIENRTC4gQSB0YWJsZQotYmFja3VwIGRvZXMgbm90IGluY2x1ZGUgRERMIHdoaWNoIG11c3QgYmUgb2J0YWluZWQgZnJvbSBhIHNuYXBzaG90IHdoZW4KLXJlc3RvcmluZyBmcm9tIGFuIGluY3JlbWVudGFsIGJhY2t1cC4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvY29tcGFjdGlvbi9pbmRleC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9jb21wYWN0aW9uL2luZGV4LmFkb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMjA2NTYuLjAwMDAwMDAKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9jb21wYWN0aW9uL2luZGV4LmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotPSBDb21wYWN0aW9uCi0KLT09IFN0cmF0ZWdpZXMKLQotUGlja2luZyB0aGUgcmlnaHQgY29tcGFjdGlvbiBzdHJhdGVneSBmb3IgeW91ciB3b3JrbG9hZCB3aWxsIGVuc3VyZSB0aGUKLWJlc3QgcGVyZm9ybWFuY2UgZm9yIGJvdGggcXVlcnlpbmcgYW5kIGZvciBjb21wYWN0aW9uIGl0c2VsZi4KLQoteHJlZjpvcGVyYXRpbmcvY29tcGFjdGlvbi9zdGNzLmFkb2NbYFNpemUgVGllcmVkIENvbXBhY3Rpb24gU3RyYXRlZ3kgKFNUQ1MpYF06OgotICBUaGUgZGVmYXVsdCBjb21wYWN0aW9uIHN0cmF0ZWd5LiBVc2VmdWwgYXMgYSBmYWxsYmFjayB3aGVuIG90aGVyCi0gIHN0cmF0ZWdpZXMgZG9uJ3QgZml0IHRoZSB3b3JrbG9hZC4gTW9zdCB1c2VmdWwgZm9yIG5vbiBwdXJlIHRpbWUKLSAgc2VyaWVzIHdvcmtsb2FkcyB3aXRoIHNwaW5uaW5nIGRpc2tzLCBvciB3aGVuIHRoZSBJL08gZnJvbSBgTENTYAotICBpcyB0b28gaGlnaC4KLXhyZWY6b3BlcmF0aW5nL2NvbXBhY3Rpb24vbGNzLmFkb2NbYExldmVsZWQgQ29tcGFjdGlvbiBTdHJhdGVneSAoTENTKWBdOjoKLSAgTGV2ZWxlZCBDb21wYWN0aW9uIFN0cmF0ZWd5IChMQ1MpIGlzIG9wdGltaXplZCBmb3IgcmVhZCBoZWF2eQotICB3b3JrbG9hZHMsIG9yIHdvcmtsb2FkcyB3aXRoIGxvdHMgb2YgdXBkYXRlcyBhbmQgZGVsZXRlcy4gSXQgaXMgbm90IGEKLSAgZ29vZCBjaG9pY2UgZm9yIGltbXV0YWJsZSB0aW1lIHNlcmllcyBkYXRhLgoteHJlZjpvcGVyYXRpbmcvY29tcGFjdGlvbi90d2NzLmFkb2NbYFRpbWUgV2luZG93IENvbXBhY3Rpb24gU3RyYXRlZ3kgKFRXQ1MpYF06OgotICBUaW1lIFdpbmRvdyBDb21wYWN0aW9uIFN0cmF0ZWd5IGlzIGRlc2lnbmVkIGZvciBUVEwnZWQsIG1vc3RseQotICBpbW11dGFibGUgdGltZSBzZXJpZXMgZGF0YS4KLQotPT0gVHlwZXMgb2YgY29tcGFjdGlvbgotCi1UaGUgY29uY2VwdCBvZiBjb21wYWN0aW9uIGlzIHVzZWQgZm9yIGRpZmZlcmVudCBraW5kcyBvZiBvcGVyYXRpb25zIGluCi1DYXNzYW5kcmEsIHRoZSBjb21tb24gdGhpbmcgYWJvdXQgdGhlc2Ugb3BlcmF0aW9ucyBpcyB0aGF0IGl0IHRha2VzIG9uZQotb3IgbW9yZSBTU1RhYmxlcyBhbmQgb3V0cHV0IG5ldyBTU1RhYmxlcy4gVGhlIHR5cGVzIG9mIGNvbXBhY3Rpb25zIGFyZToKLQotTWlub3IgY29tcGFjdGlvbjo6Ci0gIHRyaWdnZXJlZCBhdXRvbWF0aWNhbGx5IGluIENhc3NhbmRyYS4KLU1ham9yIGNvbXBhY3Rpb246OgotICBhIHVzZXIgZXhlY3V0ZXMgYSBjb21wYWN0aW9uIG92ZXIgYWxsIFNTVGFibGVzIG9uIHRoZSBub2RlLgotVXNlciBkZWZpbmVkIGNvbXBhY3Rpb246OgotICBhIHVzZXIgdHJpZ2dlcnMgYSBjb21wYWN0aW9uIG9uIGEgZ2l2ZW4gc2V0IG9mIFNTVGFibGVzLgotU2NydWI6OgotICB0cnkgdG8gZml4IGFueSBicm9rZW4gU1NUYWJsZXMuIFRoaXMgY2FuIGFjdHVhbGx5IHJlbW92ZSB2YWxpZCBkYXRhIGlmCi0gIHRoYXQgZGF0YSBpcyBjb3JydXB0ZWQsIGlmIHRoYXQgaGFwcGVucyB5b3Ugd2lsbCBuZWVkIHRvIHJ1biBhIGZ1bGwKLSAgcmVwYWlyIG9uIHRoZSBub2RlLgotVXBncmFkZVNTVGFibGVzOjoKLSAgdXBncmFkZSBTU1RhYmxlcyB0byB0aGUgbGF0ZXN0IHZlcnNpb24uIFJ1biB0aGlzIGFmdGVyIHVwZ3JhZGluZyB0byBhCi0gIG5ldyBtYWpvciB2ZXJzaW9uLgotQ2xlYW51cDo6Ci0gIHJlbW92ZSBhbnkgcmFuZ2VzIHRoaXMgbm9kZSBkb2VzIG5vdCBvd24gYW55bW9yZSwgdHlwaWNhbGx5IHRyaWdnZXJlZAotICBvbiBuZWlnaGJvdXJpbmcgbm9kZXMgYWZ0ZXIgYSBub2RlIGhhcyBiZWVuIGJvb3RzdHJhcHBlZCBzaW5jZSB0aGF0Ci0gIG5vZGUgd2lsbCB0YWtlIG93bmVyc2hpcCBvZiBzb21lIHJhbmdlcyBmcm9tIHRob3NlIG5vZGVzLgotU2Vjb25kYXJ5IGluZGV4IHJlYnVpbGQ6OgotICByZWJ1aWxkIHRoZSBzZWNvbmRhcnkgaW5kZXhlcyBvbiB0aGUgbm9kZS4KLUFudGljb21wYWN0aW9uOjoKLSAgYWZ0ZXIgcmVwYWlyIHRoZSByYW5nZXMgdGhhdCB3ZXJlIGFjdHVhbGx5IHJlcGFpcmVkIGFyZSBzcGxpdCBvdXQgb2YKLSAgdGhlIFNTVGFibGVzIHRoYXQgZXhpc3RlZCB3aGVuIHJlcGFpciBzdGFydGVkLgotU3ViIHJhbmdlIGNvbXBhY3Rpb246OgotICBJdCBpcyBwb3NzaWJsZSB0byBvbmx5IGNvbXBhY3QgYSBnaXZlbiBzdWIgcmFuZ2UgLSB0aGlzIGNvdWxkIGJlCi0gIHVzZWZ1bCBpZiB5b3Uga25vdyBhIHRva2VuIHRoYXQgaGFzIGJlZW4gbWlzYmVoYXZpbmcgLSBlaXRoZXIKLSAgZ2F0aGVyaW5nIG1hbnkgdXBkYXRlcyBvciBtYW55IGRlbGV0ZXMuCi0gIChgbm9kZXRvb2wgY29tcGFjdCAtc3QgeCAtZXQgeWApIHdpbGwgcGljayBhbGwgU1NUYWJsZXMgY29udGFpbmluZyB0aGUKLSAgcmFuZ2UgYmV0d2VlbiB4IGFuZCB5IGFuZCBpc3N1ZSBhIGNvbXBhY3Rpb24gZm9yIHRob3NlIFNTVGFibGVzLiBGb3IKLSAgU1RDUyB0aGlzIHdpbGwgbW9zdCBsaWtlbHkgaW5jbHVkZSBhbGwgU1NUYWJsZXMgYnV0IHdpdGggTENTIGl0IGNhbgotICBpc3N1ZSB0aGUgY29tcGFjdGlvbiBmb3IgYSBzdWJzZXQgb2YgdGhlIFNTVGFibGVzLiBXaXRoIExDUyB0aGUKLSAgcmVzdWx0aW5nIHNzdGFibGUgd2lsbCBlbmQgdXAgaW4gTDAuCi0KLT09IFdoZW4gaXMgYSBtaW5vciBjb21wYWN0aW9uIHRyaWdnZXJlZD8KLQotKiBXaGVuIGFuIHNzdGFibGUgaXMgYWRkZWQgdG8gdGhlIG5vZGUgdGhyb3VnaCBmbHVzaGluZy9zdHJlYW1pbmcKLSogV2hlbiBhdXRvY29tcGFjdGlvbiBpcyBlbmFibGVkIGFmdGVyIGJlaW5nIGRpc2FibGVkIChgbm9kZXRvb2wgZW5hYmxlYXV0b2NvbXBhY3Rpb25gKSAKLSogV2hlbiBjb21wYWN0aW9uIGFkZHMgbmV3IFNTVGFibGVzIAotKiBBIGNoZWNrIGZvciBuZXcgbWlub3IgY29tcGFjdGlvbnMgZXZlcnkgNSBtaW51dGVzCi0KLT09IE1lcmdpbmcgU1NUYWJsZXMKLQotQ29tcGFjdGlvbiBpcyBhYm91dCBtZXJnaW5nIFNTVGFibGVzLCBzaW5jZSBwYXJ0aXRpb25zIGluIFNTVGFibGVzIGFyZQotc29ydGVkIGJhc2VkIG9uIHRoZSBoYXNoIG9mIHRoZSBwYXJ0aXRpb24ga2V5IGl0IGlzIHBvc3NpYmxlIHRvCi1lZmZpY2llbnRseSBtZXJnZSBzZXBhcmF0ZSBTU1RhYmxlcy4gQ29udGVudCBvZiBlYWNoIHBhcnRpdGlvbiBpcyBhbHNvCi1zb3J0ZWQgc28gZWFjaCBwYXJ0aXRpb24gY2FuIGJlIG1lcmdlZCBlZmZpY2llbnRseS4KLQotPT0gVG9tYnN0b25lcyBhbmQgR2FyYmFnZSBDb2xsZWN0aW9uIChHQykgR3JhY2UKLQotPT09IFdoeSBUb21ic3RvbmVzCi0KLVdoZW4gYSBkZWxldGUgcmVxdWVzdCBpcyByZWNlaXZlZCBieSBDYXNzYW5kcmEgaXQgZG9lcyBub3QgYWN0dWFsbHkKLXJlbW92ZSB0aGUgZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0b3JlLiBJbnN0ZWFkIGl0IHdyaXRlcyBhIHNwZWNpYWwKLXBpZWNlIG9mIGRhdGEga25vd24gYXMgYSB0b21ic3RvbmUuIFRoZSBUb21ic3RvbmUgcmVwcmVzZW50cyB0aGUgZGVsZXRlCi1hbmQgY2F1c2VzIGFsbCB2YWx1ZXMgd2hpY2ggb2NjdXJyZWQgYmVmb3JlIHRoZSB0b21ic3RvbmUgdG8gbm90IGFwcGVhcgotaW4gcXVlcmllcyB0byB0aGUgZGF0YWJhc2UuIFRoaXMgYXBwcm9hY2ggaXMgdXNlZCBpbnN0ZWFkIG9mIHJlbW92aW5nCi12YWx1ZXMgYmVjYXVzZSBvZiB0aGUgZGlzdHJpYnV0ZWQgbmF0dXJlIG9mIENhc3NhbmRyYS4KLQotPT09IERlbGV0ZXMgd2l0aG91dCB0b21ic3RvbmVzCi0KLUltYWdpbmUgYSB0aHJlZSBub2RlIGNsdXN0ZXIgd2hpY2ggaGFzIHRoZSB2YWx1ZSBbQV0gcmVwbGljYXRlZCB0byBldmVyeQotbm9kZS46Ci0KLVtzb3VyY2Usbm9uZV0KLS0tLS0KLVtBXSwgW0FdLCBbQV0KLS0tLS0KLQotSWYgb25lIG9mIHRoZSBub2RlcyBmYWlscyBhbmQgYW5kIG91ciBkZWxldGUgb3BlcmF0aW9uIG9ubHkgcmVtb3ZlcwotZXhpc3RpbmcgdmFsdWVzIHdlIGNhbiBlbmQgdXAgd2l0aCBhIGNsdXN0ZXIgdGhhdCBsb29rcyBsaWtlOgotCi1bc291cmNlLG5vbmVdCi0tLS0tCi1bXSwgW10sIFtBXQotLS0tLQotCi1UaGVuIGEgcmVwYWlyIG9wZXJhdGlvbiB3b3VsZCByZXBsYWNlIHRoZSB2YWx1ZSBvZiBbQV0gYmFjayBvbnRvIHRoZSB0d28KLW5vZGVzIHdoaWNoIGFyZSBtaXNzaW5nIHRoZSB2YWx1ZS46Ci0KLVtzb3VyY2Usbm9uZV0KLS0tLS0KLVtBXSwgW0FdLCBbQV0KLS0tLS0KLQotVGhpcyB3b3VsZCBjYXVzZSBvdXIgZGF0YSB0byBiZSByZXN1cnJlY3RlZCBldmVuIHRob3VnaCBpdCBoYWQgYmVlbgotZGVsZXRlZC4KLQotPT09IERlbGV0ZXMgd2l0aCBUb21ic3RvbmVzCi0KLVN0YXJ0aW5nIGFnYWluIHdpdGggYSB0aHJlZSBub2RlIGNsdXN0ZXIgd2hpY2ggaGFzIHRoZSB2YWx1ZSBbQV0KLXJlcGxpY2F0ZWQgdG8gZXZlcnkgbm9kZS46Ci0KLVtzb3VyY2Usbm9uZV0KLS0tLS0KLVtBXSwgW0FdLCBbQV0KLS0tLS0KLQotSWYgaW5zdGVhZCBvZiByZW1vdmluZyBkYXRhIHdlIGFkZCBhIHRvbWJzdG9uZSByZWNvcmQsIG91ciBzaW5nbGUgbm9kZQotZmFpbHVyZSBzaXR1YXRpb24gd2lsbCBsb29rIGxpa2UgdGhpcy46Ci0KLVtzb3VyY2Usbm9uZV0KLS0tLS0KLVtBLCBUb21ic3RvbmVbQV1dLCBbQSwgVG9tYnN0b25lW0FdXSwgW0FdCi0tLS0tCi0KLU5vdyB3aGVuIHdlIGlzc3VlIGEgcmVwYWlyIHRoZSBUb21ic3RvbmUgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIHJlcGxpY2EsCi1yYXRoZXIgdGhhbiB0aGUgZGVsZXRlZCBkYXRhIGJlaW5nIHJlc3VycmVjdGVkLjoKLQotW3NvdXJjZSxub25lXQotLS0tLQotW0EsIFRvbWJzdG9uZVtBXV0sIFtBLCBUb21ic3RvbmVbQV1dLCBbQSwgVG9tYnN0b25lW0FdXQotLS0tLQotCi1PdXIgcmVwYWlyIG9wZXJhdGlvbiB3aWxsIGNvcnJlY3RseSBwdXQgdGhlIHN0YXRlIG9mIHRoZSBzeXN0ZW0gdG8gd2hhdAotd2UgZXhwZWN0IHdpdGggdGhlIHJlY29yZCBbQV0gbWFya2VkIGFzIGRlbGV0ZWQgb24gYWxsIG5vZGVzLiBUaGlzIGRvZXMKLW1lYW4gd2Ugd2lsbCBlbmQgdXAgYWNjcnVpbmcgVG9tYnN0b25lcyB3aGljaCB3aWxsIHBlcm1hbmVudGx5Ci1hY2N1bXVsYXRlIGRpc2sgc3BhY2UuIFRvIGF2b2lkIGtlZXBpbmcgdG9tYnN0b25lcyBmb3JldmVyIHdlIGhhdmUgYQotcGFyYW1ldGVyIGtub3duIGFzIGBnY19ncmFjZV9zZWNvbmRzYCBmb3IgZXZlcnkgdGFibGUgaW4gQ2Fzc2FuZHJhLgotCi09PT0gVGhlIGdjX2dyYWNlX3NlY29uZHMgcGFyYW1ldGVyIGFuZCBUb21ic3RvbmUgUmVtb3ZhbAotCi1UaGUgdGFibGUgbGV2ZWwgYGdjX2dyYWNlX3NlY29uZHNgIHBhcmFtZXRlciBjb250cm9scyBob3cgbG9uZyBDYXNzYW5kcmEKLXdpbGwgcmV0YWluIHRvbWJzdG9uZXMgdGhyb3VnaCBjb21wYWN0aW9uIGV2ZW50cyBiZWZvcmUgZmluYWxseSByZW1vdmluZwotdGhlbS4gVGhpcyBkdXJhdGlvbiBzaG91bGQgZGlyZWN0bHkgcmVmbGVjdCB0aGUgYW1vdW50IG9mIHRpbWUgYSB1c2VyCi1leHBlY3RzIHRvIGFsbG93IGJlZm9yZSByZWNvdmVyaW5nIGEgZmFpbGVkIG5vZGUuIEFmdGVyCi1gZ2NfZ3JhY2Vfc2Vjb25kc2AgaGFzIGV4cGlyZWQgdGhlIHRvbWJzdG9uZSBtYXkgYmUgcmVtb3ZlZCAobWVhbmluZwotdGhlcmUgd2lsbCBubyBsb25nZXIgYmUgYW55IHJlY29yZCB0aGF0IGEgY2VydGFpbiBwaWVjZSBvZiBkYXRhIHdhcwotZGVsZXRlZCksIGJ1dCBhcyBhIHRvbWJzdG9uZSBjYW4gbGl2ZSBpbiBvbmUgc3N0YWJsZSBhbmQgdGhlIGRhdGEgaXQKLWNvdmVycyBpbiBhbm90aGVyLCBhIGNvbXBhY3Rpb24gbXVzdCBhbHNvIGluY2x1ZGUgYm90aCBzc3RhYmxlIGZvciBhCi10b21ic3RvbmUgdG8gYmUgcmVtb3ZlZC4gTW9yZSBwcmVjaXNlbHksIHRvIGJlIGFibGUgdG8gZHJvcCBhbiBhY3R1YWwKLXRvbWJzdG9uZSB0aGUgZm9sbG93aW5nIG5lZWRzIHRvIGJlIHRydWU7Ci0KLSogVGhlIHRvbWJzdG9uZSBtdXN0IGJlIG9sZGVyIHRoYW4gYGdjX2dyYWNlX3NlY29uZHNgCi0qIElmIHBhcnRpdGlvbiBYIGNvbnRhaW5zIHRoZSB0b21ic3RvbmUsIHRoZSBzc3RhYmxlIGNvbnRhaW5pbmcgdGhlCi1wYXJ0aXRpb24gcGx1cyBhbGwgU1NUYWJsZXMgY29udGFpbmluZyBkYXRhIG9sZGVyIHRoYW4gdGhlIHRvbWJzdG9uZQotY29udGFpbmluZyBYIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIHNhbWUgY29tcGFjdGlvbi4gV2UgZG9uJ3QgbmVlZCB0bwotY2FyZSBpZiB0aGUgcGFydGl0aW9uIGlzIGluIGFuIHNzdGFibGUgaWYgd2UgY2FuIGd1YXJhbnRlZSB0aGF0IGFsbCBkYXRhCi1pbiB0aGF0IHNzdGFibGUgaXMgbmV3ZXIgdGhhbiB0aGUgdG9tYnN0b25lLiBJZiB0aGUgdG9tYnN0b25lIGlzIG9sZGVyCi10aGFuIHRoZSBkYXRhIGl0IGNhbm5vdCBzaGFkb3cgdGhhdCBkYXRhLgotKiBJZiB0aGUgb3B0aW9uIGBvbmx5X3B1cmdlX3JlcGFpcmVkX3RvbWJzdG9uZXNgIGlzIGVuYWJsZWQsIHRvbWJzdG9uZXMKLWFyZSBvbmx5IHJlbW92ZWQgaWYgdGhlIGRhdGEgaGFzIGFsc28gYmVlbiByZXBhaXJlZC4KLQotSWYgYSBub2RlIHJlbWFpbnMgZG93biBvciBkaXNjb25uZWN0ZWQgZm9yIGxvbmdlciB0aGFuCi1gZ2NfZ3JhY2Vfc2Vjb25kc2AgaXQncyBkZWxldGVkIGRhdGEgd2lsbCBiZSByZXBhaXJlZCBiYWNrIHRvIHRoZSBvdGhlcgotbm9kZXMgYW5kIHJlLWFwcGVhciBpbiB0aGUgY2x1c3Rlci4gVGhpcyBpcyBiYXNpY2FsbHkgdGhlIHNhbWUgYXMgaW4gdGhlCi0iRGVsZXRlcyB3aXRob3V0IFRvbWJzdG9uZXMiIHNlY3Rpb24uIE5vdGUgdGhhdCB0b21ic3RvbmVzIHdpbGwgbm90IGJlCi1yZW1vdmVkIHVudGlsIGEgY29tcGFjdGlvbiBldmVudCBldmVuIGlmIGBnY19ncmFjZV9zZWNvbmRzYCBoYXMgZWxhcHNlZC4KLQotVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGBnY19ncmFjZV9zZWNvbmRzYCBpcyA4NjQwMDAgd2hpY2ggaXMgZXF1aXZhbGVudAotdG8gMTAgZGF5cy4gVGhpcyBjYW4gYmUgc2V0IHdoZW4gY3JlYXRpbmcgb3IgYWx0ZXJpbmcgYSB0YWJsZSB1c2luZwotYFdJVEggZ2NfZ3JhY2Vfc2Vjb25kc2AuCi0KLT09IFRUTAotCi1EYXRhIGluIENhc3NhbmRyYSBjYW4gaGF2ZSBhbiBhZGRpdGlvbmFsIHByb3BlcnR5IGNhbGxlZCB0aW1lIHRvIGxpdmUgLQotdGhpcyBpcyB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgZHJvcCBkYXRhIHRoYXQgaGFzIGV4cGlyZWQgb25jZSB0aGUgdGltZQotaXMgcmVhY2hlZC4gT25jZSB0aGUgVFRMIGhhcyBleHBpcmVkIHRoZSBkYXRhIGlzIGNvbnZlcnRlZCB0byBhCi10b21ic3RvbmUgd2hpY2ggc3RheXMgYXJvdW5kIGZvciBhdCBsZWFzdCBgZ2NfZ3JhY2Vfc2Vjb25kc2AuIE5vdGUgdGhhdAotaWYgeW91IG1peCBkYXRhIHdpdGggVFRMIGFuZCBkYXRhIHdpdGhvdXQgVFRMIChvciBqdXN0IGRpZmZlcmVudCBsZW5ndGgKLW9mIHRoZSBUVEwpIENhc3NhbmRyYSB3aWxsIGhhdmUgYSBoYXJkIHRpbWUgZHJvcHBpbmcgdGhlIHRvbWJzdG9uZXMKLWNyZWF0ZWQgc2luY2UgdGhlIHBhcnRpdGlvbiBtaWdodCBzcGFuIG1hbnkgU1NUYWJsZXMgYW5kIG5vdCBhbGwgYXJlCi1jb21wYWN0ZWQgYXQgb25jZS4KLQotPT0gRnVsbHkgZXhwaXJlZCBTU1RhYmxlcwotCi1JZiBhbiBzc3RhYmxlIGNvbnRhaW5zIG9ubHkgdG9tYnN0b25lcyBhbmQgaXQgaXMgZ3VhcmFudGVlZCB0aGF0IHRoYXQKLXNzdGFibGUgaXMgbm90IHNoYWRvd2luZyBkYXRhIGluIGFueSBvdGhlciBzc3RhYmxlIGNvbXBhY3Rpb24gY2FuIGRyb3AKLXRoYXQgc3N0YWJsZS4gSWYgeW91IHNlZSBTU1RhYmxlcyB3aXRoIG9ubHkgdG9tYnN0b25lcyAobm90ZSB0aGF0IFRUTDplZAotZGF0YSBpcyBjb25zaWRlcmVkIHRvbWJzdG9uZXMgb25jZSB0aGUgdGltZSB0byBsaXZlIGhhcyBleHBpcmVkKSBidXQgaXQKLWlzIG5vdCBiZWluZyBkcm9wcGVkIGJ5IGNvbXBhY3Rpb24sIGl0IGlzIGxpa2VseSB0aGF0IG90aGVyIFNTVGFibGVzCi1jb250YWluIG9sZGVyIGRhdGEuIFRoZXJlIGlzIGEgdG9vbCBjYWxsZWQgYHNzdGFibGVleHBpcmVkYmxvY2tlcnNgIHRoYXQKLXdpbGwgbGlzdCB3aGljaCBTU1RhYmxlcyBhcmUgZHJvcHBhYmxlIGFuZCB3aGljaCBhcmUgYmxvY2tpbmcgdGhlbSBmcm9tCi1iZWluZyBkcm9wcGVkLiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvciB0aW1lIHNlcmllcyBjb21wYWN0aW9uIHdpdGgKLWBUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5YCAoYW5kIHRoZSBkZXByZWNhdGVkCi1gRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneWApLiBXaXRoIGBUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5YCBpdAotaXMgcG9zc2libGUgdG8gcmVtb3ZlIHRoZSBndWFyYW50ZWUgKG5vdCBjaGVjayBmb3Igc2hhZG93aW5nIGRhdGEpIGJ5Ci1lbmFibGluZyBgdW5zYWZlX2FnZ3Jlc3NpdmVfc3N0YWJsZV9leHBpcmF0aW9uYC4KLQotPT0gUmVwYWlyZWQvdW5yZXBhaXJlZCBkYXRhCi0KLVdpdGggaW5jcmVtZW50YWwgcmVwYWlycyBDYXNzYW5kcmEgbXVzdCBrZWVwIHRyYWNrIG9mIHdoYXQgZGF0YSBpcwotcmVwYWlyZWQgYW5kIHdoYXQgZGF0YSBpcyB1bnJlcGFpcmVkLiBXaXRoIGFudGljb21wYWN0aW9uIHJlcGFpcmVkIGRhdGEKLWlzIHNwbGl0IG91dCBpbnRvIHJlcGFpcmVkIGFuZCB1bnJlcGFpcmVkIFNTVGFibGVzLiBUbyBhdm9pZCBtaXhpbmcgdXAKLXRoZSBkYXRhIGFnYWluIHNlcGFyYXRlIGNvbXBhY3Rpb24gc3RyYXRlZ3kgaW5zdGFuY2VzIGFyZSBydW4gb24gdGhlIHR3bwotc2V0cyBvZiBkYXRhLCBlYWNoIGluc3RhbmNlIG9ubHkga25vd2luZyBhYm91dCBlaXRoZXIgdGhlIHJlcGFpcmVkIG9yCi10aGUgdW5yZXBhaXJlZCBTU1RhYmxlcy4gVGhpcyBtZWFucyB0aGF0IGlmIHlvdSBvbmx5IHJ1biBpbmNyZW1lbnRhbAotcmVwYWlyIG9uY2UgYW5kIHRoZW4gbmV2ZXIgYWdhaW4sIHlvdSBtaWdodCBoYXZlIHZlcnkgb2xkIGRhdGEgaW4gdGhlCi1yZXBhaXJlZCBTU1RhYmxlcyB0aGF0IGJsb2NrIGNvbXBhY3Rpb24gZnJvbSBkcm9wcGluZyB0b21ic3RvbmVzIGluIHRoZQotdW5yZXBhaXJlZCAocHJvYmFibHkgbmV3ZXIpIFNTVGFibGVzLgotCi09PSBEYXRhIGRpcmVjdG9yaWVzCi0KLVNpbmNlIHRvbWJzdG9uZXMgYW5kIGRhdGEgY2FuIGxpdmUgaW4gZGlmZmVyZW50IFNTVGFibGVzIGl0IGlzIGltcG9ydGFudAotdG8gcmVhbGl6ZSB0aGF0IGxvc2luZyBhbiBzc3RhYmxlIG1pZ2h0IGxlYWQgdG8gZGF0YSBiZWNvbWluZyBsaXZlIGFnYWluCi0tIHRoZSBtb3N0IGNvbW1vbiB3YXkgb2YgbG9zaW5nIFNTVGFibGVzIGlzIHRvIGhhdmUgYSBoYXJkIGRyaXZlIGJyZWFrCi1kb3duLiBUbyBhdm9pZCBtYWtpbmcgZGF0YSBsaXZlIHRvbWJzdG9uZXMgYW5kIGFjdHVhbCBkYXRhIGFyZSBhbHdheXMgaW4KLXRoZSBzYW1lIGRhdGEgZGlyZWN0b3J5LiBUaGlzIHdheSwgaWYgYSBkaXNrIGlzIGxvc3QsIGFsbCB2ZXJzaW9ucyBvZiBhCi1wYXJ0aXRpb24gYXJlIGxvc3QgYW5kIG5vIGRhdGEgY2FuIGdldCB1bmRlbGV0ZWQuIFRvIGFjaGlldmUgdGhpcyBhCi1jb21wYWN0aW9uIHN0cmF0ZWd5IGluc3RhbmNlIHBlciBkYXRhIGRpcmVjdG9yeSBpcyBydW4gaW4gYWRkaXRpb24gdG8KLXRoZSBjb21wYWN0aW9uIHN0cmF0ZWd5IGluc3RhbmNlcyBjb250YWluaW5nIHJlcGFpcmVkL3VucmVwYWlyZWQgZGF0YSwKLXRoaXMgbWVhbnMgdGhhdCBpZiB5b3UgaGF2ZSA0IGRhdGEgZGlyZWN0b3JpZXMgdGhlcmUgd2lsbCBiZSA4Ci1jb21wYWN0aW9uIHN0cmF0ZWd5IGluc3RhbmNlcyBydW5uaW5nLiBUaGlzIGhhcyBhIGZldyBtb3JlIGJlbmVmaXRzIHRoYW4KLWp1c3QgYXZvaWRpbmcgZGF0YSBnZXR0aW5nIHVuZGVsZXRlZDoKLQotKiBJdCBpcyBwb3NzaWJsZSB0byBydW4gbW9yZSBjb21wYWN0aW9ucyBpbiBwYXJhbGxlbCAtIGxldmVsZWQKLWNvbXBhY3Rpb24gd2lsbCBoYXZlIHNldmVyYWwgdG90YWxseSBzZXBhcmF0ZSBsZXZlbGluZ3MgYW5kIGVhY2ggb25lIGNhbgotcnVuIGNvbXBhY3Rpb25zIGluZGVwZW5kZW50bHkgZnJvbSB0aGUgb3RoZXJzLgotKiBVc2VycyBjYW4gYmFja3VwIGFuZCByZXN0b3JlIGEgc2luZ2xlIGRhdGEgZGlyZWN0b3J5LgotKiBOb3RlIHRob3VnaCB0aGF0IGN1cnJlbnRseSBhbGwgZGF0YSBkaXJlY3RvcmllcyBhcmUgY29uc2lkZXJlZCBlcXVhbCwKLXNvIGlmIHlvdSBoYXZlIGEgdGlueSBkaXNrIGFuZCBhIGJpZyBkaXNrIGJhY2tpbmcgdHdvIGRhdGEgZGlyZWN0b3JpZXMsCi10aGUgYmlnIG9uZSB3aWxsIGJlIGxpbWl0ZWQgdGhlIGJ5IHRoZSBzbWFsbCBvbmUuIE9uZSB3b3JrIGFyb3VuZCB0bwotdGhpcyBpcyB0byBjcmVhdGUgbW9yZSBkYXRhIGRpcmVjdG9yaWVzIGJhY2tlZCBieSB0aGUgYmlnIGRpc2suCi0KLT09IFNpbmdsZSBzc3RhYmxlIHRvbWJzdG9uZSBjb21wYWN0aW9uCi0KLVdoZW4gYW4gc3N0YWJsZSBpcyB3cml0dGVuIGEgaGlzdG9ncmFtIHdpdGggdGhlIHRvbWJzdG9uZSBleHBpcnkgdGltZXMKLWlzIGNyZWF0ZWQgYW5kIHRoaXMgaXMgdXNlZCB0byB0cnkgdG8gZmluZCBTU1RhYmxlcyB3aXRoIHZlcnkgbWFueQotdG9tYnN0b25lcyBhbmQgcnVuIHNpbmdsZSBzc3RhYmxlIGNvbXBhY3Rpb24gb24gdGhhdCBzc3RhYmxlIGluIGhvcGUgb2YKLWJlaW5nIGFibGUgdG8gZHJvcCB0b21ic3RvbmVzIGluIHRoYXQgc3N0YWJsZS4gQmVmb3JlIHN0YXJ0aW5nIHRoaXMgaXQKLWlzIGFsc28gY2hlY2tlZCBob3cgbGlrZWx5IGl0IGlzIHRoYXQgYW55IHRvbWJzdG9uZXMgd2lsbCBhY3R1YWxseSB3aWxsCi1iZSBhYmxlIHRvIGJlIGRyb3BwZWQgaG93IG11Y2ggdGhpcyBzc3RhYmxlIG92ZXJsYXBzIHdpdGggb3RoZXIKLVNTVGFibGVzLiBUbyBhdm9pZCBtb3N0IG9mIHRoZXNlIGNoZWNrcyB0aGUgY29tcGFjdGlvbiBvcHRpb24KLWB1bmNoZWNrZWRfdG9tYnN0b25lX2NvbXBhY3Rpb25gIGNhbiBiZSBlbmFibGVkLgotCi1bW2NvbXBhY3Rpb24tb3B0aW9uc11dCi09PSBDb21tb24gb3B0aW9ucwotCi1UaGVyZSBpcyBhIG51bWJlciBvZiBjb21tb24gb3B0aW9ucyBmb3IgYWxsIHRoZSBjb21wYWN0aW9uIHN0cmF0ZWdpZXM7Ci0KLWBlbmFibGVkYCAoZGVmYXVsdDogdHJ1ZSk6OgotICBXaGV0aGVyIG1pbm9yIGNvbXBhY3Rpb25zIHNob3VsZCBydW4uIE5vdGUgdGhhdCB5b3UgY2FuIGhhdmUKLSAgJ2VuYWJsZWQnOiB0cnVlIGFzIGEgY29tcGFjdGlvbiBvcHRpb24gYW5kIHRoZW4gZG8gJ25vZGV0b29sCi0gIGVuYWJsZWF1dG9jb21wYWN0aW9uJyB0byBzdGFydCBydW5uaW5nIGNvbXBhY3Rpb25zLgotYHRvbWJzdG9uZV90aHJlc2hvbGRgIChkZWZhdWx0OiAwLjIpOjoKLSAgSG93IG11Y2ggb2YgdGhlIHNzdGFibGUgc2hvdWxkIGJlIHRvbWJzdG9uZXMgZm9yIHVzIHRvIGNvbnNpZGVyIGRvaW5nCi0gIGEgc2luZ2xlIHNzdGFibGUgY29tcGFjdGlvbiBvZiB0aGF0IHNzdGFibGUuCi1gdG9tYnN0b25lX2NvbXBhY3Rpb25faW50ZXJ2YWxgIChkZWZhdWx0OiA4NjQwMHMgKDEgZGF5KSk6OgotICBTaW5jZSBpdCBtaWdodCBub3QgYmUgcG9zc2libGUgdG8gZHJvcCBhbnkgdG9tYnN0b25lcyB3aGVuIGRvaW5nIGEKLSAgc2luZ2xlIHNzdGFibGUgY29tcGFjdGlvbiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IG9uZSBzc3RhYmxlIGlzIG5vdAotICBjb25zdGFudGx5IGdldHRpbmcgcmVjb21wYWN0ZWQgLSB0aGlzIG9wdGlvbiBzdGF0ZXMgaG93IG9mdGVuIHdlCi0gIHNob3VsZCB0cnkgZm9yIGEgZ2l2ZW4gc3N0YWJsZS4KLWBsb2dfYWxsYCAoZGVmYXVsdDogZmFsc2UpOjoKLSAgTmV3IGRldGFpbGVkIGNvbXBhY3Rpb24gbG9nZ2luZywgc2VlCi0gIGBiZWxvdyA8ZGV0YWlsZWQtY29tcGFjdGlvbi1sb2dnaW5nPmAuCi1gdW5jaGVja2VkX3RvbWJzdG9uZV9jb21wYWN0aW9uYCAoZGVmYXVsdDogZmFsc2UpOjoKLSAgVGhlIHNpbmdsZSBzc3RhYmxlIGNvbXBhY3Rpb24gaGFzIHF1aXRlIHN0cmljdCBjaGVja3MgZm9yIHdoZXRoZXIgaXQKLSAgc2hvdWxkIGJlIHN0YXJ0ZWQsIHRoaXMgb3B0aW9uIGRpc2FibGVzIHRob3NlIGNoZWNrcyBhbmQgZm9yIHNvbWUKLSAgdXNlY2FzZXMgdGhpcyBtaWdodCBiZSBuZWVkZWQuIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGNoYW5nZSBhbnl0aGluZwotICBmb3IgdGhlIGFjdHVhbCBjb21wYWN0aW9uLCB0b21ic3RvbmVzIGFyZSBvbmx5IGRyb3BwZWQgaWYgaXQgaXMgc2FmZQotICB0byBkbyBzbyAtIGl0IG1pZ2h0IGp1c3QgcmV3cml0ZSBhbiBzc3RhYmxlIHdpdGhvdXQgYmVpbmcgYWJsZSB0byBkcm9wCi0gIGFueSB0b21ic3RvbmVzLgotYG9ubHlfcHVyZ2VfcmVwYWlyZWRfdG9tYnN0b25lYCAoZGVmYXVsdDogZmFsc2UpOjoKLSAgT3B0aW9uIHRvIGVuYWJsZSB0aGUgZXh0cmEgc2FmZXR5IG9mIG1ha2luZyBzdXJlIHRoYXQgdG9tYnN0b25lcyBhcmUKLSAgb25seSBkcm9wcGVkIGlmIHRoZSBkYXRhIGhhcyBiZWVuIHJlcGFpcmVkLgotYG1pbl90aHJlc2hvbGRgIChkZWZhdWx0OiA0KTo6Ci0gIExvd2VyIGxpbWl0IG9mIG51bWJlciBvZiBTU1RhYmxlcyBiZWZvcmUgYSBjb21wYWN0aW9uIGlzIHRyaWdnZXJlZC4KLSAgTm90IHVzZWQgZm9yIGBMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5YC4KLWBtYXhfdGhyZXNob2xkYCAoZGVmYXVsdDogMzIpOjoKLSAgVXBwZXIgbGltaXQgb2YgbnVtYmVyIG9mIFNTVGFibGVzIGJlZm9yZSBhIGNvbXBhY3Rpb24gaXMgdHJpZ2dlcmVkLgotICBOb3QgdXNlZCBmb3IgYExldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3lgLgotCi1GdXJ0aGVyLCBzZWUgdGhlIHNlY3Rpb24gb24gZWFjaCBzdHJhdGVneSBmb3Igc3BlY2lmaWMgYWRkaXRpb25hbAotb3B0aW9ucy4KLQotPT0gQ29tcGFjdGlvbiBub2RldG9vbCBjb21tYW5kcwotCi1UaGUgYG5vZGV0b29sIDxub2RldG9vbD5gIHV0aWxpdHkgcHJvdmlkZXMgYSBudW1iZXIgb2YgY29tbWFuZHMgcmVsYXRlZAotdG8gY29tcGFjdGlvbjoKLQotYGVuYWJsZWF1dG9jb21wYWN0aW9uYDo6Ci0gIEVuYWJsZSBjb21wYWN0aW9uLgotYGRpc2FibGVhdXRvY29tcGFjdGlvbmA6OgotICBEaXNhYmxlIGNvbXBhY3Rpb24uCi1gc2V0Y29tcGFjdGlvbnRocm91Z2hwdXRgOjoKLSAgSG93IGZhc3QgY29tcGFjdGlvbiBzaG91bGQgcnVuIGF0IG1vc3QgLSBkZWZhdWx0cyB0byA2NE1pQi9zLgotYGNvbXBhY3Rpb25zdGF0c2A6OgotICBTdGF0aXN0aWNzIGFib3V0IGN1cnJlbnQgYW5kIHBlbmRpbmcgY29tcGFjdGlvbnMuCi1gY29tcGFjdGlvbmhpc3RvcnlgOjoKLSAgTGlzdCBkZXRhaWxzIGFib3V0IHRoZSBsYXN0IGNvbXBhY3Rpb25zLgotYHNldGNvbXBhY3Rpb250aHJlc2hvbGRgOjoKLSAgU2V0IHRoZSBtaW4vbWF4IHNzdGFibGUgY291bnQgZm9yIHdoZW4gdG8gdHJpZ2dlciBjb21wYWN0aW9uLCBkZWZhdWx0cwotICB0byA0LzMyLgotCi09PSBTd2l0Y2hpbmcgdGhlIGNvbXBhY3Rpb24gc3RyYXRlZ3kgYW5kIG9wdGlvbnMgdXNpbmcgSk1YCi0KLUl0IGlzIHBvc3NpYmxlIHRvIHN3aXRjaCBjb21wYWN0aW9uIHN0cmF0ZWdpZXMgYW5kIGl0cyBvcHRpb25zIG9uIGp1c3QgYQotc2luZ2xlIG5vZGUgdXNpbmcgSk1YLCB0aGlzIGlzIGEgZ3JlYXQgd2F5IHRvIGV4cGVyaW1lbnQgd2l0aCBzZXR0aW5ncwotd2l0aG91dCBhZmZlY3RpbmcgdGhlIHdob2xlIGNsdXN0ZXIuIFRoZSBtYmVhbiBpczoKLQotW3NvdXJjZSxub25lXQotLS0tLQotb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGI6dHlwZT1Db2x1bW5GYW1pbGllcyxrZXlzcGFjZT08a2V5c3BhY2VfbmFtZT4sY29sdW1uZmFtaWx5PTx0YWJsZV9uYW1lPgotLS0tLQotCi1hbmQgdGhlIGF0dHJpYnV0ZSB0byBjaGFuZ2UgaXMgYENvbXBhY3Rpb25QYXJhbWV0ZXJzYCBvcgotYENvbXBhY3Rpb25QYXJhbWV0ZXJzSnNvbmAgaWYgeW91IHVzZSBqY29uc29sZSBvciBqbWMuIFRoZSBzeW50YXggZm9yCi10aGUganNvbiB2ZXJzaW9uIGlzIHRoZSBzYW1lIGFzIHlvdSB3b3VsZCB1c2UgaW4gYW4KLWBBTFRFUiBUQUJMRSA8YWx0ZXItdGFibGUtc3RhdGVtZW50PmAgc3RhdGVtZW50IC1mb3IgZXhhbXBsZToKLQotW3NvdXJjZSxub25lXQotLS0tLQoteyAnY2xhc3MnOiAnTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneScsICdzc3RhYmxlX3NpemVfaW5fbWInOiAxMjMsICdmYW5vdXRfc2l6ZSc6IDEwfQotLS0tLQotCi1UaGUgc2V0dGluZyBpcyBrZXB0IHVudGlsIHNvbWVvbmUgZXhlY3V0ZXMgYW4KLWBBTFRFUiBUQUJMRSA8YWx0ZXItdGFibGUtc3RhdGVtZW50PmAgdGhhdCB0b3VjaGVzIHRoZSBjb21wYWN0aW9uCi1zZXR0aW5ncyBvciByZXN0YXJ0cyB0aGUgbm9kZS4KLQotW1tkZXRhaWxlZC1jb21wYWN0aW9uLWxvZ2dpbmddXQotPT0gTW9yZSBkZXRhaWxlZCBjb21wYWN0aW9uIGxvZ2dpbmcKLQotRW5hYmxlIHdpdGggdGhlIGNvbXBhY3Rpb24gb3B0aW9uIGBsb2dfYWxsYCBhbmQgYSBtb3JlIGRldGFpbGVkCi1jb21wYWN0aW9uIGxvZyBmaWxlIHdpbGwgYmUgcHJvZHVjZWQgaW4geW91ciBsb2cgZGlyZWN0b3J5LgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9pbmRleC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9pbmRleC5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjc0MzBhLi4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvaW5kZXguYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLT09IE9wZXJhdGluZyBDYXNzYW5kcmEKLQotKiB4cmVmOm9wZXJhdGluZy9oYXJkd2FyZS5hZG9jW0hhcmR3YXJlXQotKiB4cmVmOm9wZXJhdGluZy9zZWN1cml0eS5hZG9jW1NlY3VyaXR5XQotKiB4cmVmOm9wZXJhdGluZy90b3BvX2NoYW5nZXMuYWRvY1tUb3BvbG9neSBjaGFuZ2VzXQotKiB4cmVmOm9wZXJhdGluZy9oaW50cy5hZG9jW0hpbnRzXQotKiB4cmVmOm9wZXJhdGluZy9yZXBhaXIuYWRvY1tSZXBhaXJdCi0qIHhyZWY6b3BlcmF0aW5nL3JlYWRfcmVwYWlyLmFkb2NbUmVhZCByZXBhaXJdCi0qIHhyZWY6b3BlcmF0aW5nL2JhY2t1cHMuYWRvY1tCYWNrdXBzXQotKiB4cmVmOm9wZXJhdGluZy9jb21wcmVzc2lvbi5hZG9jW0NvbXByZXNzaW9uXQotKiB4cmVmOm9wZXJhdGluZy9jb21wYWN0aW9uL2luZGV4LmFkb2NbQ29tcGFjdGlvbl0KLSogeHJlZjpvcGVyYXRpbmcvbWV0cmljcy5hZG9jW01vbml0b3JpbmddCi0qIHhyZWY6b3BlcmF0aW5nL2J1bGtfbG9hZGluZy5hZG9jW0J1bGsgbG9hZGluZ10KLSogeHJlZjpvcGVyYXRpbmcvY2RjLmFkb2NbQ0RDXQotKiB4cmVmOm9wZXJhdGluZy9ibG9vbV9maWx0ZXJzLmFkb2NbQmxvb20gZmlsdGVyc10KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvbWV0cmljcy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9tZXRyaWNzLmFkb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYjgxNTYuLjAwMDAwMDAKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9tZXRyaWNzLmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDg4ICswLDAgQEAKLT0gTW9uaXRvcmluZwotCi1NZXRyaWNzIGluIENhc3NhbmRyYSBhcmUgbWFuYWdlZCB1c2luZyB0aGUKLWh0dHA6Ly9tZXRyaWNzLmRyb3B3aXphcmQuaW9bRHJvcHdpemFyZCBNZXRyaWNzXSBsaWJyYXJ5LiBUaGVzZSBtZXRyaWNzCi1jYW4gYmUgcXVlcmllZCB2aWEgSk1YIG9yIHB1c2hlZCB0byBleHRlcm5hbCBtb25pdG9yaW5nIHN5c3RlbXMgdXNpbmcgYQotbnVtYmVyIG9mCi1odHRwOi8vbWV0cmljcy5kcm9wd2l6YXJkLmlvLzMuMS4wL2dldHRpbmctc3RhcnRlZC8jb3RoZXItcmVwb3J0aW5nW2J1aWx0Ci1pbl0gYW5kIGh0dHA6Ly9tZXRyaWNzLmRyb3B3aXphcmQuaW8vMy4xLjAvbWFudWFsL3RoaXJkLXBhcnR5L1t0aGlyZAotcGFydHldIHJlcG9ydGVyIHBsdWdpbnMuCi0KLU1ldHJpY3MgYXJlIGNvbGxlY3RlZCBmb3IgYSBzaW5nbGUgbm9kZS4gSXQncyB1cCB0byB0aGUgb3BlcmF0b3IgdG8gdXNlCi1hbiBleHRlcm5hbCBtb25pdG9yaW5nIHN5c3RlbSB0byBhZ2dyZWdhdGUgdGhlbS4KLQotPT0gTWV0cmljIFR5cGVzCi0KLUFsbCBtZXRyaWNzIHJlcG9ydGVkIGJ5IGNhc3NhbmRyYSBmaXQgaW50byBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlcy4KLQotYEdhdWdlYDo6Ci0gIEFuIGluc3RhbnRhbmVvdXMgbWVhc3VyZW1lbnQgb2YgYSB2YWx1ZS4KLWBDb3VudGVyYDo6Ci0gIEEgZ2F1Z2UgZm9yIGFuIGBBdG9taWNMb25nYCBpbnN0YW5jZS4gVHlwaWNhbGx5IHRoaXMgaXMgY29uc3VtZWQgYnkKLSAgbW9uaXRvcmluZyB0aGUgY2hhbmdlIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbGFyZ2UKLSAgaW5jcmVhc2UgY29tcGFyZWQgdG8gdGhlIG5vcm0uCi1gSGlzdG9ncmFtYDo6Ci0gIE1lYXN1cmVzIHRoZSBzdGF0aXN0aWNhbCBkaXN0cmlidXRpb24gb2YgdmFsdWVzIGluIGEgc3RyZWFtIG9mIGRhdGEuCi0gICsKLSAgSW4gYWRkaXRpb24gdG8gbWluaW11bSwgbWF4aW11bSwgbWVhbiwgZXRjLiwgaXQgYWxzbyBtZWFzdXJlcyBtZWRpYW4sCi0gIDc1dGgsIDkwdGgsIDk1dGgsIDk4dGgsIDk5dGgsIGFuZCA5OS45dGggcGVyY2VudGlsZXMuCi1gVGltZXJgOjoKLSAgTWVhc3VyZXMgYm90aCB0aGUgcmF0ZSB0aGF0IGEgcGFydGljdWxhciBwaWVjZSBvZiBjb2RlIGlzIGNhbGxlZCBhbmQKLSAgdGhlIGhpc3RvZ3JhbSBvZiBpdHMgZHVyYXRpb24uCi1gTGF0ZW5jeWA6OgotICBTcGVjaWFsIHR5cGUgdGhhdCB0cmFja3MgbGF0ZW5jeSAoaW4gbWljcm9zZWNvbmRzKSB3aXRoIGEgYFRpbWVyYCBwbHVzCi0gIGEgYENvdW50ZXJgIHRoYXQgdHJhY2tzIHRoZSB0b3RhbCBsYXRlbmN5IGFjY3J1ZWQgc2luY2Ugc3RhcnRpbmcuIFRoZQotICBmb3JtZXIgaXMgdXNlZnVsIGlmIHlvdSB0cmFjayB0aGUgY2hhbmdlIGluIHRvdGFsIGxhdGVuY3kgc2luY2UgdGhlCi0gIGxhc3QgY2hlY2suIEVhY2ggbWV0cmljIG5hbWUgb2YgdGhpcyB0eXBlIHdpbGwgaGF2ZSAnTGF0ZW5jeScgYW5kCi0gICdUb3RhbExhdGVuY3knIGFwcGVuZGVkIHRvIGl0LgotYE1ldGVyYDo6Ci0gIEEgbWV0ZXIgbWV0cmljIHdoaWNoIG1lYXN1cmVzIG1lYW4gdGhyb3VnaHB1dCBhbmQgb25lLSwgZml2ZS0sIGFuZAotICBmaWZ0ZWVuLW1pbnV0ZSBleHBvbmVudGlhbGx5LXdlaWdodGVkIG1vdmluZyBhdmVyYWdlIHRocm91Z2hwdXRzLgotCi09PSBUYWJsZSBNZXRyaWNzCi0KLUVhY2ggdGFibGUgaW4gQ2Fzc2FuZHJhIGhhcyBtZXRyaWNzIHJlc3BvbnNpYmxlIGZvciB0cmFja2luZyBpdHMgc3RhdGUKLWFuZCBwZXJmb3JtYW5jZS4KLQotVGhlIG1ldHJpYyBuYW1lcyBhcmUgYWxsIGFwcGVuZGVkIHdpdGggdGhlIHNwZWNpZmljIGBLZXlzcGFjZWAgYW5kCi1gVGFibGVgIG5hbWUuCi0KLVJlcG9ydGVkIG5hbWUgZm9ybWF0OgotCi0qTWV0cmljIE5hbWUqOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuVGFibGUuPE1ldHJpY05hbWU+LjxLZXlzcGFjZT4uPFRhYmxlPmAKLSpKTVggTUJlYW4qOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1UYWJsZSBrZXlzcGFjZT08S2V5c3BhY2U+IHNjb3BlPTxUYWJsZT4gbmFtZT08TWV0cmljTmFtZT5gCi0KLVtOT1RFXQotLk5vdGUKLT09PT0KLVRoZXJlIGlzIGEgc3BlY2lhbCB0YWJsZSBjYWxsZWQgJ2BhbGxgJyB3aXRob3V0IGEga2V5c3BhY2UuIFRoaXMKLXJlcHJlc2VudHMgdGhlIGFnZ3JlZ2F0aW9uIG9mIG1ldHJpY3MgYWNyb3NzICphbGwqIHRhYmxlcyBhbmQga2V5c3BhY2VzCi1vbiB0aGUgbm9kZS4KLT09PT1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCi18TWVtdGFibGVPbkhlYXBTaXplIHxHYXVnZTxMb25nPiB8VG90YWwgYW1vdW50IG9mIGRhdGEgc3RvcmVkIGluIHRoZQotbWVtdGFibGUgdGhhdCByZXNpZGVzICpvbiotaGVhcCwgaW5jbHVkaW5nIGNvbHVtbiByZWxhdGVkIG92ZXJoZWFkIGFuZAotcGFydGl0aW9ucyBvdmVyd3JpdHRlbi4KLQotfE1lbXRhYmxlT2ZmSGVhcFNpemUgfEdhdWdlPExvbmc+IHxUb3RhbCBhbW91bnQgb2YgZGF0YSBzdG9yZWQgaW4gdGhlCi1tZW10YWJsZSB0aGF0IHJlc2lkZXMgKm9mZiotaGVhcCwgaW5jbHVkaW5nIGNvbHVtbiByZWxhdGVkIG92ZXJoZWFkIGFuZAotcGFydGl0aW9ucyBvdmVyd3JpdHRlbi4KLQotfE1lbXRhYmxlTGl2ZURhdGFTaXplIHxHYXVnZTxMb25nPiB8VG90YWwgYW1vdW50IG9mIGxpdmUgZGF0YSBzdG9yZWQgaW4KLXRoZSBtZW10YWJsZSwgZXhjbHVkaW5nIGFueSBkYXRhIHN0cnVjdHVyZSBvdmVyaGVhZC4KLQotfEFsbE1lbXRhYmxlc09uSGVhcFNpemUgfEdhdWdlPExvbmc+IHxUb3RhbCBhbW91bnQgb2YgZGF0YSBzdG9yZWQgaW4gdGhlCi1tZW10YWJsZXMgKDJpIGFuZCBwZW5kaW5nIGZsdXNoIG1lbXRhYmxlcyBpbmNsdWRlZCkgdGhhdCByZXNpZGVzCi0qb24qLWhlYXAuCi0KLXxBbGxNZW10YWJsZXNPZmZIZWFwU2l6ZSB8R2F1Z2U8TG9uZz4gfFRvdGFsIGFtb3VudCBvZiBkYXRhIHN0b3JlZCBpbgotdGhlIG1lbXRhYmxlcyAoMmkgYW5kIHBlbmRpbmcgZmx1c2ggbWVtdGFibGVzIGluY2x1ZGVkKSB0aGF0IHJlc2lkZXMKLSpvZmYqLWhlYXAuCi0KLXxBbGxNZW10YWJsZXNMaXZlRGF0YVNpemUgfEdhdWdlPExvbmc+IHxUb3RhbCBhbW91bnQgb2YgbGl2ZSBkYXRhIHN0b3JlZAotaW4gdGhlIG1lbXRhYmxlcyAoMmkgYW5kIHBlbmRpbmcgZmx1c2ggbWVtdGFibGVzIGluY2x1ZGVkKSB0aGF0IHJlc2lkZXMKLW9mZi1oZWFwLCBleGNsdWRpbmcgYW55IGRhdGEgc3RydWN0dXJlIG92ZXJoZWFkLgotCi18TWVtdGFibGVDb2x1bW5zQ291bnQgfEdhdWdlPExvbmc+IHxUb3RhbCBudW1iZXIgb2YgY29sdW1ucyBwcmVzZW50IGluCi10aGUgbWVtdGFibGUuCi0KLXxNZW10YWJsZVN3aXRjaENvdW50IHxDb3VudGVyIHxOdW1iZXIgb2YgdGltZXMgZmx1c2ggaGFzIHJlc3VsdGVkIGluIHRoZQotbWVtdGFibGUgYmVpbmcgc3dpdGNoZWQgb3V0LgotCi18Q29tcHJlc3Npb25SYXRpbyB8R2F1Z2U8RG91YmxlPiB8Q3VycmVudCBjb21wcmVzc2lvbiByYXRpbyBmb3IgYWxsCi1TU1RhYmxlcy4KLQotfEVzdGltYXRlZFBhcnRpdGlvblNpemVIaXN0b2dyYW0gfEdhdWdlPGxvbmdbXT4gfEhpc3RvZ3JhbSBvZiBlc3RpbWF0ZWQKLXBhcnRpdGlvbiBzaXplIChpbiBieXRlcykuCi0KLXxFc3RpbWF0ZWRQYXJ0aXRpb25Db3VudCB8R2F1Z2U8TG9uZz4gfEFwcHJveGltYXRlIG51bWJlciBvZiBrZXlzIGluCi10YWJsZS4KLQotfEVzdGltYXRlZENvbHVtbkNvdW50SGlzdG9ncmFtIHxHYXVnZTxsb25nW10+IHxIaXN0b2dyYW0gb2YgZXN0aW1hdGVkCi1udW1iZXIgb2YgY29sdW1ucy4KLQotfFNTVGFibGVzUGVyUmVhZEhpc3RvZ3JhbSB8SGlzdG9ncmFtIHxIaXN0b2dyYW0gb2YgdGhlIG51bWJlciBvZiBzc3RhYmxlCi1kYXRhIGZpbGVzIGFjY2Vzc2VkIHBlciBzaW5nbGUgcGFydGl0aW9uIHJlYWQuIFNTVGFibGVzIHNraXBwZWQgZHVlIHRvCi1CbG9vbSBGaWx0ZXJzLCBtaW4tbWF4IGtleSBvciBwYXJ0aXRpb24gaW5kZXggbG9va3VwIGFyZSBub3QgdGFrZW4gaW50bwotYWNvb3VudC4KLQotfFJlYWRMYXRlbmN5IHxMYXRlbmN5IHxMb2NhbCByZWFkIGxhdGVuY3kgZm9yIHRoaXMgdGFibGUuCi0KLXxSYW5nZUxhdGVuY3kgfExhdGVuY3kgfExvY2FsIHJhbmdlIHNjYW4gbGF0ZW5jeSBmb3IgdGhpcyB0YWJsZS4KLQotfFdyaXRlTGF0ZW5jeSB8TGF0ZW5jeSB8TG9jYWwgd3JpdGUgbGF0ZW5jeSBmb3IgdGhpcyB0YWJsZS4KLQotfENvb3JkaW5hdG9yUmVhZExhdGVuY3kgfFRpbWVyIHxDb29yZGluYXRvciByZWFkIGxhdGVuY3kgZm9yIHRoaXMgdGFibGUuCi0KLXxDb29yZGluYXRvcldyaXRlTGF0ZW5jeSB8VGltZXIgfENvb3JkaW5hdG9yIHdyaXRlIGxhdGVuY3kgZm9yIHRoaXMKLXRhYmxlLgotCi18Q29vcmRpbmF0b3JTY2FuTGF0ZW5jeSB8VGltZXIgfENvb3JkaW5hdG9yIHJhbmdlIHNjYW4gbGF0ZW5jeSBmb3IgdGhpcwotdGFibGUuCi0KLXxQZW5kaW5nRmx1c2hlcyB8Q291bnRlciB8RXN0aW1hdGVkIG51bWJlciBvZiBmbHVzaCB0YXNrcyBwZW5kaW5nIGZvcgotdGhpcyB0YWJsZS4KLQotfEJ5dGVzRmx1c2hlZCB8Q291bnRlciB8VG90YWwgbnVtYmVyIG9mIGJ5dGVzIGZsdXNoZWQgc2luY2Ugc2VydmVyCi1bcmVdc3RhcnQuCi0KLXxDb21wYWN0aW9uQnl0ZXNXcml0dGVuIHxDb3VudGVyIHxUb3RhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBieQotY29tcGFjdGlvbiBzaW5jZSBzZXJ2ZXIgW3JlXXN0YXJ0LgotCi18UGVuZGluZ0NvbXBhY3Rpb25zIHxHYXVnZTxJbnRlZ2VyPiB8RXN0aW1hdGUgb2YgbnVtYmVyIG9mIHBlbmRpbmcKLWNvbXBhY3Rpb25zIGZvciB0aGlzIHRhYmxlLgotCi18TGl2ZVNTVGFibGVDb3VudCB8R2F1Z2U8SW50ZWdlcj4gfE51bWJlciBvZiBTU1RhYmxlcyBvbiBkaXNrIGZvciB0aGlzCi10YWJsZS4KLQotfExpdmVEaXNrU3BhY2VVc2VkIHxDb3VudGVyIHxEaXNrIHNwYWNlIHVzZWQgYnkgU1NUYWJsZXMgYmVsb25naW5nIHRvCi10aGlzIHRhYmxlIChpbiBieXRlcykuCi0KLXxUb3RhbERpc2tTcGFjZVVzZWQgfENvdW50ZXIgfFRvdGFsIGRpc2sgc3BhY2UgdXNlZCBieSBTU1RhYmxlcwotYmVsb25naW5nIHRvIHRoaXMgdGFibGUsIGluY2x1ZGluZyBvYnNvbGV0ZSBvbmVzIHdhaXRpbmcgdG8gYmUgR0MnZC4KLQotfE1pblBhcnRpdGlvblNpemUgfEdhdWdlPExvbmc+IHxTaXplIG9mIHRoZSBzbWFsbGVzdCBjb21wYWN0ZWQgcGFydGl0aW9uCi0oaW4gYnl0ZXMpLgotCi18TWF4UGFydGl0aW9uU2l6ZSB8R2F1Z2U8TG9uZz4gfFNpemUgb2YgdGhlIGxhcmdlc3QgY29tcGFjdGVkIHBhcnRpdGlvbgotKGluIGJ5dGVzKS4KLQotfE1lYW5QYXJ0aXRpb25TaXplIHxHYXVnZTxMb25nPiB8U2l6ZSBvZiB0aGUgYXZlcmFnZSBjb21wYWN0ZWQgcGFydGl0aW9uCi0oaW4gYnl0ZXMpLgotCi18Qmxvb21GaWx0ZXJGYWxzZVBvc2l0aXZlcyB8R2F1Z2U8TG9uZz4gfE51bWJlciBvZiBmYWxzZSBwb3NpdGl2ZXMgb24KLXRhYmxlJ3MgYmxvb20gZmlsdGVyLgotCi18Qmxvb21GaWx0ZXJGYWxzZVJhdGlvIHxHYXVnZTxEb3VibGU+IHxGYWxzZSBwb3NpdGl2ZSByYXRpbyBvZiB0YWJsZSdzCi1ibG9vbSBmaWx0ZXIuCi0KLXxCbG9vbUZpbHRlckRpc2tTcGFjZVVzZWQgfEdhdWdlPExvbmc+IHxEaXNrIHNwYWNlIHVzZWQgYnkgYmxvb20gZmlsdGVyCi0oaW4gYnl0ZXMpLgotCi18Qmxvb21GaWx0ZXJPZmZIZWFwTWVtb3J5VXNlZCB8R2F1Z2U8TG9uZz4gfE9mZi1oZWFwIG1lbW9yeSB1c2VkIGJ5Ci1ibG9vbSBmaWx0ZXIuCi0KLXxJbmRleFN1bW1hcnlPZmZIZWFwTWVtb3J5VXNlZCB8R2F1Z2U8TG9uZz4gfE9mZi1oZWFwIG1lbW9yeSB1c2VkIGJ5Ci1pbmRleCBzdW1tYXJ5LgotCi18Q29tcHJlc3Npb25NZXRhZGF0YU9mZkhlYXBNZW1vcnlVc2VkIHxHYXVnZTxMb25nPiB8T2ZmLWhlYXAgbWVtb3J5IHVzZWQKLWJ5IGNvbXByZXNzaW9uIG1ldGEgZGF0YS4KLQotfEtleUNhY2hlSGl0UmF0ZSB8R2F1Z2U8RG91YmxlPiB8S2V5IGNhY2hlIGhpdCByYXRlIGZvciB0aGlzIHRhYmxlLgotCi18VG9tYnN0b25lU2Nhbm5lZEhpc3RvZ3JhbSB8SGlzdG9ncmFtIHxIaXN0b2dyYW0gb2YgdG9tYnN0b25lcyBzY2FubmVkCi1pbiBxdWVyaWVzIG9uIHRoaXMgdGFibGUuCi0KLXxMaXZlU2Nhbm5lZEhpc3RvZ3JhbSB8SGlzdG9ncmFtIHxIaXN0b2dyYW0gb2YgbGl2ZSBjZWxscyBzY2FubmVkIGluCi1xdWVyaWVzIG9uIHRoaXMgdGFibGUuCi0KLXxDb2xVcGRhdGVUaW1lRGVsdGFIaXN0b2dyYW0gfEhpc3RvZ3JhbSB8SGlzdG9ncmFtIG9mIGNvbHVtbiB1cGRhdGUgdGltZQotZGVsdGEgb24gdGhpcyB0YWJsZS4KLQotfFZpZXdMb2NrQWNxdWlyZVRpbWUgfFRpbWVyIHxUaW1lIHRha2VuIGFjcXVpcmluZyBhIHBhcnRpdGlvbiBsb2NrIGZvcgotbWF0ZXJpYWxpemVkIHZpZXcgdXBkYXRlcyBvbiB0aGlzIHRhYmxlLgotCi18Vmlld1JlYWRUaW1lIHxUaW1lciB8VGltZSB0YWtlbiBkdXJpbmcgdGhlIGxvY2FsIHJlYWQgb2YgYSBtYXRlcmlhbGl6ZWQKLXZpZXcgdXBkYXRlLgotCi18VHJ1ZVNuYXBzaG90c1NpemUgfEdhdWdlPExvbmc+IHxEaXNrIHNwYWNlIHVzZWQgYnkgc25hcHNob3RzIG9mIHRoaXMKLXRhYmxlIGluY2x1ZGluZyBhbGwgU1NUYWJsZSBjb21wb25lbnRzLgotCi18Um93Q2FjaGVIaXRPdXRPZlJhbmdlIHxDb3VudGVyIHxOdW1iZXIgb2YgdGFibGUgcm93IGNhY2hlIGhpdHMgdGhhdCBkbwotbm90IHNhdGlzZnkgdGhlIHF1ZXJ5IGZpbHRlciwgdGh1cyB3ZW50IHRvIGRpc2suCi0KLXxSb3dDYWNoZUhpdCB8Q291bnRlciB8TnVtYmVyIG9mIHRhYmxlIHJvdyBjYWNoZSBoaXRzLgotCi18Um93Q2FjaGVNaXNzIHxDb3VudGVyIHxOdW1iZXIgb2YgdGFibGUgcm93IGNhY2hlIG1pc3Nlcy4KLQotfENhc1ByZXBhcmUgfExhdGVuY3kgfExhdGVuY3kgb2YgcGF4b3MgcHJlcGFyZSByb3VuZC4KLQotfENhc1Byb3Bvc2UgfExhdGVuY3kgfExhdGVuY3kgb2YgcGF4b3MgcHJvcG9zZSByb3VuZC4KLQotfENhc0NvbW1pdCB8TGF0ZW5jeSB8TGF0ZW5jeSBvZiBwYXhvcyBjb21taXQgcm91bmQuCi0KLXxQZXJjZW50UmVwYWlyZWQgfEdhdWdlPERvdWJsZT4gfFBlcmNlbnQgb2YgdGFibGUgZGF0YSB0aGF0IGlzIHJlcGFpcmVkCi1vbiBkaXNrLgotCi18Qnl0ZXNSZXBhaXJlZCB8R2F1Z2U8TG9uZz4gfFNpemUgb2YgdGFibGUgZGF0YSByZXBhaXJlZCBvbiBkaXNrCi0KLXxCeXRlc1VucmVwYWlyZWQgfEdhdWdlPExvbmc+IHxTaXplIG9mIHRhYmxlIGRhdGEgdW5yZXBhaXJlZCBvbiBkaXNrCi0KLXxCeXRlc1BlbmRpbmdSZXBhaXIgfEdhdWdlPExvbmc+IHxTaXplIG9mIHRhYmxlIGRhdGEgaXNvbGF0ZWQgZm9yIGFuCi1vbmdvaW5nIGluY3JlbWVudGFsIHJlcGFpcgotCi18U3BlY3VsYXRpdmVSZXRyaWVzIHxDb3VudGVyIHxOdW1iZXIgb2YgdGltZXMgc3BlY3VsYXRpdmUgcmV0cmllcyB3ZXJlCi1zZW50IGZvciB0aGlzIHRhYmxlLgotCi18U3BlY3VsYXRpdmVGYWlsZWRSZXRyaWVzIHxDb3VudGVyIHxOdW1iZXIgb2Ygc3BlY3VsYXRpdmUgcmV0cmllcyB0aGF0Ci1mYWlsZWQgdG8gcHJldmVudCBhIHRpbWVvdXQKLQotfFNwZWN1bGF0aXZlSW5zdWZmaWNpZW50UmVwbGljYXMgfENvdW50ZXIgfE51bWJlciBvZiBzcGVjdWxhdGl2ZSByZXRyaWVzCi10aGF0IGNvdWxkbid0IGJlIGF0dGVtcHRlZCBkdWUgdG8gbGFjayBvZiByZXBsaWNhcwotCi18U3BlY3VsYXRpdmVTYW1wbGVMYXRlbmN5TmFub3MgfEdhdWdlPExvbmc+IHxOdW1iZXIgb2YgbmFub3NlY29uZHMgdG8KLXdhaXQgYmVmb3JlIHNwZWN1bGF0aW9uIGlzIGF0dGVtcHRlZC4gVmFsdWUgbWF5IGJlIHN0YXRpY2FsbHkgY29uZmlndXJlZAotb3IgdXBkYXRlZCBwZXJpb2RpY2FsbHkgYmFzZWQgb24gY29vcmRpbmF0b3IgbGF0ZW5jeS4KLQotfFdhaXRpbmdPbkZyZWVNZW10YWJsZVNwYWNlIHxIaXN0b2dyYW0gfEhpc3RvZ3JhbSBvZiB0aW1lIHNwZW50IHdhaXRpbmcKLWZvciBmcmVlIG1lbXRhYmxlIHNwYWNlLCBlaXRoZXIgb24tIG9yIG9mZi1oZWFwLgotCi18RHJvcHBlZE11dGF0aW9ucyB8Q291bnRlciB8TnVtYmVyIG9mIGRyb3BwZWQgbXV0YXRpb25zIG9uIHRoaXMgdGFibGUuCi0KLXxBbnRpY29tcGFjdGlvblRpbWUgfFRpbWVyIHxUaW1lIHNwZW50IGFudGljb21wYWN0aW5nIGJlZm9yZSBhCi1jb25zaXN0ZW50IHJlcGFpci4KLQotfFZhbGlkYXRpb25UaW1lIHxUaW1lciB8VGltZSBzcGVudCBkb2luZyB2YWxpZGF0aW9uIGNvbXBhY3Rpb24gZHVyaW5nCi1yZXBhaXIuCi0KLXxTeW5jVGltZSB8VGltZXIgfFRpbWUgc3BlbnQgZG9pbmcgc3RyZWFtaW5nIGR1cmluZyByZXBhaXIuCi0KLXxCeXRlc1ZhbGlkYXRlZCB8SGlzdG9ncmFtIHxIaXN0b2dyYW0gb3ZlciB0aGUgYW1vdW50IG9mIGJ5dGVzIHJlYWQKLWR1cmluZyB2YWxpZGF0aW9uLgotCi18UGFydGl0aW9uc1ZhbGlkYXRlZCB8SGlzdG9ncmFtIHxIaXN0b2dyYW0gb3ZlciB0aGUgbnVtYmVyIG9mIHBhcnRpdGlvbnMKLXJlYWQgZHVyaW5nIHZhbGlkYXRpb24uCi0KLXxCeXRlc0FudGljb21wYWN0ZWQgfENvdW50ZXIgfEhvdyBtYW55IGJ5dGVzIHdlIGFudGljb21wYWN0ZWQuCi0KLXxCeXRlc011dGF0ZWRBbnRpY29tcGFjdGlvbiB8Q291bnRlciB8SG93IG1hbnkgYnl0ZXMgd2UgYXZvaWRlZAotYW50aWNvbXBhY3RpbmcgYmVjYXVzZSB0aGUgc3N0YWJsZSB3YXMgZnVsbHkgY29udGFpbmVkIGluIHRoZSByZXBhaXJlZAotcmFuZ2UuCi0KLXxNdXRhdGVkQW50aWNvbXBhY3Rpb25HYXVnZSB8R2F1Z2U8RG91YmxlPiB8UmF0aW8gb2YgYnl0ZXMgbXV0YXRlZCB2cwotdG90YWwgYnl0ZXMgcmVwYWlyZWQuCi18PT09Ci0KLT09IEtleXNwYWNlIE1ldHJpY3MKLQotRWFjaCBrZXlzcGFjZSBpbiBDYXNzYW5kcmEgaGFzIG1ldHJpY3MgcmVzcG9uc2libGUgZm9yIHRyYWNraW5nIGl0cwotc3RhdGUgYW5kIHBlcmZvcm1hbmNlLgotCi1Nb3N0IG9mIHRoZXNlIG1ldHJpY3MgYXJlIHRoZSBzYW1lIGFzIHRoZSBgVGFibGUgTWV0cmljc2AgYWJvdmUsIG9ubHkKLXRoZXkgYXJlIGFnZ3JlZ2F0ZWQgYXQgdGhlIEtleXNwYWNlIGxldmVsLiBUaGUga2V5c3BhY2Ugc3BlY2lmaWMgbWV0cmljcwotYXJlIHNwZWNpZmllZCBpbiB0aGUgdGFibGUgYmVsb3cuCi0KLVJlcG9ydGVkIG5hbWUgZm9ybWF0OgotCi0qTWV0cmljIE5hbWUqOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3Mua2V5c3BhY2UuPE1ldHJpY05hbWU+LjxLZXlzcGFjZT5gCi0qSk1YIE1CZWFuKjo6Ci0gIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9S2V5c3BhY2Ugc2NvcGU9PEtleXNwYWNlPiBuYW1lPTxNZXRyaWNOYW1lPmAKLQotW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgotfFdyaXRlRmFpbGVkSWRlYUNMIHxDb3VudGVyIHxOdW1iZXIgb2Ygd3JpdGVzIHRoYXQgZmFpbGVkIHRvIGFjaGlldmUgdGhlCi1jb25maWd1cmVkIGlkZWFsIGNvbnNpc3RlbmN5IGxldmVsIG9yIDAgaWYgbm9uZSBpcyBjb25maWd1cmVkCi0KLXxJZGVhbENMV3JpdGVMYXRlbmN5IHxMYXRlbmN5IHxDb29yZGluYXRvciBsYXRlbmN5IG9mIHdyaXRlcyBhdCB0aGUKLWNvbmZpZ3VyZWQgaWRlYWwgY29uc2lzdGVuY3kgbGV2ZWwuIE5vIHZhbHVlcyBhcmUgcmVjb3JkZWQgaWYgaWRlYWwKLWNvbnNpc3RlbmN5IGxldmVsIGlzIG5vdCBjb25maWd1cmVkCi0KLXxSZXBhaXJUaW1lIHxUaW1lciB8VG90YWwgdGltZSBzcGVudCBhcyByZXBhaXIgY29vcmRpbmF0b3IuCi0KLXxSZXBhaXJQcmVwYXJlVGltZSB8VGltZXIgfFRvdGFsIHRpbWUgc3BlbnQgcHJlcGFyaW5nIGZvciByZXBhaXIuCi18PT09Ci0KLT09IFRocmVhZFBvb2wgTWV0cmljcwotCi1DYXNzYW5kcmEgc3BsaXRzIHdvcmsgb2YgYSBwYXJ0aWN1bGFyIHR5cGUgaW50byBpdHMgb3duIHRocmVhZCBwb29sLgotVGhpcyBwcm92aWRlcyBiYWNrLXByZXNzdXJlIGFuZCBhc3luY2hyb255IGZvciByZXF1ZXN0cyBvbiBhIG5vZGUuIEl0J3MKLWltcG9ydGFudCB0byBtb25pdG9yIHRoZSBzdGF0ZSBvZiB0aGVzZSB0aHJlYWQgcG9vbHMgc2luY2UgdGhleSBjYW4gdGVsbAoteW91IGhvdyBzYXR1cmF0ZWQgYSBub2RlIGlzLgotCi1UaGUgbWV0cmljIG5hbWVzIGFyZSBhbGwgYXBwZW5kZWQgd2l0aCB0aGUgc3BlY2lmaWMgYFRocmVhZFBvb2xgIG5hbWUuCi1UaGUgdGhyZWFkIHBvb2xzIGFyZSBhbHNvIGNhdGVnb3JpemVkIHVuZGVyIGEgc3BlY2lmaWMgdHlwZS4KLQotUmVwb3J0ZWQgbmFtZSBmb3JtYXQ6Ci0KLSpNZXRyaWMgTmFtZSo6OgotICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5UaHJlYWRQb29scy48TWV0cmljTmFtZT4uPFBhdGg+LjxUaHJlYWRQb29sTmFtZT5gCi0qSk1YIE1CZWFuKjo6Ci0gIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9VGhyZWFkUG9vbHMgcGF0aD08UGF0aD4gc2NvcGU9PFRocmVhZFBvb2xOYW1lPiBuYW1lPTxNZXRyaWNOYW1lPmAKLQotW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgotfEFjdGl2ZVRhc2tzIHxHYXVnZTxJbnRlZ2VyPiB8TnVtYmVyIG9mIHRhc2tzIGJlaW5nIGFjdGl2ZWx5IHdvcmtlZCBvbgotYnkgdGhpcyBwb29sLgotCi18UGVuZGluZ1Rhc2tzIHxHYXVnZTxJbnRlZ2VyPiB8TnVtYmVyIG9mIHF1ZXVlZCB0YXNrcyBxdWV1ZWQgdXAgb24gdGhpcwotcG9vbC4KLQotfENvbXBsZXRlZFRhc2tzIHxDb3VudGVyIHxOdW1iZXIgb2YgdGFza3MgY29tcGxldGVkLgotCi18VG90YWxCbG9ja2VkVGFza3MgfENvdW50ZXIgfE51bWJlciBvZiB0YXNrcyB0aGF0IHdlcmUgYmxvY2tlZCBkdWUgdG8KLXF1ZXVlIHNhdHVyYXRpb24uCi0KLXxDdXJyZW50bHlCbG9ja2VkVGFzayB8Q291bnRlciB8TnVtYmVyIG9mIHRhc2tzIHRoYXQgYXJlIGN1cnJlbnRseQotYmxvY2tlZCBkdWUgdG8gcXVldWUgc2F0dXJhdGlvbiBidXQgb24gcmV0cnkgd2lsbCBiZWNvbWUgdW5ibG9ja2VkLgotCi18TWF4UG9vbFNpemUgfEdhdWdlPEludGVnZXI+IHxUaGUgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkcyBpbiB0aGlzCi1wb29sLgotCi18TWF4VGFza3NRdWV1ZWQgfEdhdWdlPEludGVnZXI+IHxUaGUgbWF4aW11bSBudW1iZXIgb2YgdGFza3MgcXVldWVkCi1iZWZvcmUgYSB0YXNrIGdldCBibG9ja2VkLgotfD09PQotCi1UaGUgZm9sbG93aW5nIHRocmVhZCBwb29scyBjYW4gYmUgbW9uaXRvcmVkLgotCi1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCi18TmF0aXZlLVRyYW5zcG9ydC1SZXF1ZXN0cyB8dHJhbnNwb3J0IHxIYW5kbGVzIGNsaWVudCBDUUwgcmVxdWVzdHMKLQotfENvdW50ZXJNdXRhdGlvblN0YWdlIHxyZXF1ZXN0IHxSZXNwb25zaWJsZSBmb3IgY291bnRlciB3cml0ZXMKLQotfFZpZXdNdXRhdGlvblN0YWdlIHxyZXF1ZXN0IHxSZXNwb25zaWJsZSBmb3IgbWF0ZXJpYWxpemVkIHZpZXcgd3JpdGVzCi0KLXxNdXRhdGlvblN0YWdlIHxyZXF1ZXN0IHxSZXNwb25zaWJsZSBmb3IgYWxsIG90aGVyIHdyaXRlcwotCi18UmVhZFJlcGFpclN0YWdlIHxyZXF1ZXN0IHxSZWFkUmVwYWlyIGhhcHBlbnMgb24gdGhpcyB0aHJlYWQgcG9vbAotCi18UmVhZFN0YWdlIHxyZXF1ZXN0IHxMb2NhbCByZWFkcyBydW4gb24gdGhpcyB0aHJlYWQgcG9vbAotCi18UmVxdWVzdFJlc3BvbnNlU3RhZ2UgfHJlcXVlc3QgfENvb3JkaW5hdG9yIHJlcXVlc3RzIHRvIHRoZSBjbHVzdGVyIHJ1bgotb24gdGhpcyB0aHJlYWQgcG9vbAotCi18QW50aUVudHJvcHlTdGFnZSB8aW50ZXJuYWwgfEJ1aWxkcyBtZXJrbGUgdHJlZSBmb3IgcmVwYWlycwotCi18Q2FjaGVDbGVhbnVwRXhlY3V0b3IgfGludGVybmFsIHxDYWNoZSBtYWludGVuYW5jZSBwZXJmb3JtZWQgb24gdGhpcwotdGhyZWFkIHBvb2wKLQotfENvbXBhY3Rpb25FeGVjdXRvciB8aW50ZXJuYWwgfENvbXBhY3Rpb25zIGFyZSBydW4gb24gdGhlc2UgdGhyZWFkcwotCi18R29zc2lwU3RhZ2UgfGludGVybmFsIHxIYW5kbGVzIGdvc3NpcCByZXF1ZXN0cwotCi18SGludHNEaXNwYXRjaGVyIHxpbnRlcm5hbCB8UGVyZm9ybXMgaGludGVkIGhhbmRvZmYKLQotfEludGVybmFsUmVzcG9uc2VTdGFnZSB8aW50ZXJuYWwgfFJlc3BvbnNpYmxlIGZvciBpbnRyYS1jbHVzdGVyCi1jYWxsYmFja3MKLQotfE1lbXRhYmxlRmx1c2hXcml0ZXIgfGludGVybmFsIHxXcml0ZXMgbWVtdGFibGVzIHRvIGRpc2sKLQotfE1lbXRhYmxlUG9zdEZsdXNoIHxpbnRlcm5hbCB8Q2xlYW5zIHVwIGNvbW1pdCBsb2cgYWZ0ZXIgbWVtdGFibGUgaXMKLXdyaXR0ZW4gdG8gZGlzawotCi18TWVtdGFibGVSZWNsYWltTWVtb3J5IHxpbnRlcm5hbCB8TWVtdGFibGUgcmVjeWNsaW5nCi0KLXxNaWdyYXRpb25TdGFnZSB8aW50ZXJuYWwgfFJ1bnMgc2NoZW1hIG1pZ3JhdGlvbnMKLQotfE1pc2NTdGFnZSB8aW50ZXJuYWwgfE1pc2NlbGVuZW91cyB0YXNrcyBydW4gaGVyZQotCi18UGVuZGluZ1JhbmdlQ2FsY3VsYXRvciB8aW50ZXJuYWwgfENhbGN1bGF0ZXMgdG9rZW4gcmFuZ2UKLQotfFBlckRpc2tNZW10YWJsZUZsdXNoV3JpdGVyXzAgfGludGVybmFsIHxSZXNwb25zaWJsZSBmb3Igd3JpdGluZyBhIHNwZWMKLSh0aGVyZSBpcyBvbmUgb2YgdGhlc2UgcGVyIGRpc2sgMC1OKQotCi18U2FtcGxlciB8aW50ZXJuYWwgfFJlc3BvbnNpYmxlIGZvciByZS1zYW1wbGluZyB0aGUgaW5kZXggc3VtbWFyaWVzIG9mCi1TU3RhYmxlcwotCi18U2Vjb25kYXJ5SW5kZXhNYW5hZ2VtZW50IHxpbnRlcm5hbCB8UGVyZm9ybXMgdXBkYXRlcyB0byBzZWNvbmRhcnkKLWluZGV4ZXMKLQotfFZhbGlkYXRpb25FeGVjdXRvciB8aW50ZXJuYWwgfFBlcmZvcm1zIHZhbGlkYXRpb24gY29tcGFjdGlvbiBvcgotc2NydWJiaW5nCi0KLXxWaWV3QnVpbGRFeGVjdXRvciB8aW50ZXJuYWwgfFBlcmZvcm1zIG1hdGVyaWFsaXplZCB2aWV3cyBpbml0aWFsIGJ1aWxkCi18PT09Ci0KLT09IENsaWVudCBSZXF1ZXN0IE1ldHJpY3MKLQotQ2xpZW50IHJlcXVlc3RzIGhhdmUgdGhlaXIgb3duIHNldCBvZiBtZXRyaWNzIHRoYXQgZW5jYXBzdWxhdGUgdGhlIHdvcmsKLWhhcHBlbmluZyBhdCBjb29yZGluYXRvciBsZXZlbC4KLQotRGlmZmVyZW50IHR5cGVzIG9mIGNsaWVudCByZXF1ZXN0cyBhcmUgYnJva2VuIGRvd24gYnkgYFJlcXVlc3RUeXBlYC4KLQotUmVwb3J0ZWQgbmFtZSBmb3JtYXQ6Ci0KLSpNZXRyaWMgTmFtZSo6OgotICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DbGllbnRSZXF1ZXN0LjxNZXRyaWNOYW1lPi48UmVxdWVzdFR5cGU+YAotKkpNWCBNQmVhbio6OgotICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUNsaWVudFJlcXVlc3Qgc2NvcGU9PFJlcXVlc3RUeXBlPiBuYW1lPTxNZXRyaWNOYW1lPmAKLQotUmVxdWVzdFR5cGU6OgotICBDQVNSZWFkCi1EZXNjcmlwdGlvbjo6Ci0gIE1ldHJpY3MgcmVsYXRlZCB0byB0cmFuc2FjdGlvbmFsIHJlYWQgcmVxdWVzdHMuCi1NZXRyaWNzOjoKLSAgW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KLSAgfD09PQotICB8TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KLSAgfFRpbWVvdXRzIHxDb3VudGVyIHxOdW1iZXIgb2YgdGltZW91dHMgZW5jb3VudGVyZWQuCi0KLSAgfEZhaWx1cmVzIHxDb3VudGVyIHxOdW1iZXIgb2YgdHJhbnNhY3Rpb24gZmFpbHVyZXMgZW5jb3VudGVyZWQuCi0KLSAgfMKgIHxMYXRlbmN5IHxUcmFuc2FjdGlvbiByZWFkIGxhdGVuY3kuCi0KLSAgfFVuYXZhaWxhYmxlcyB8Q291bnRlciB8TnVtYmVyIG9mIHVuYXZhaWxhYmxlIGV4Y2VwdGlvbnMgZW5jb3VudGVyZWQuCi0KLSAgfFVuZmluaXNoZWRDb21taXQgfENvdW50ZXIgfE51bWJlciBvZiB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIGNvbW1pdHRlZAotICBvbiByZWFkLgotCi0gIHxDb25kaXRpb25Ob3RNZXQgfENvdW50ZXIgfE51bWJlciBvZiB0cmFuc2FjdGlvbiBwcmVjb25kaXRpb25zIGRpZCBub3QKLSAgbWF0Y2ggY3VycmVudCB2YWx1ZXMuCi0KLSAgfENvbnRlbnRpb25IaXN0b2dyYW0gfEhpc3RvZ3JhbSB8SG93IG1hbnkgY29udGVuZGVkIHJlYWRzIHdlcmUKLSAgZW5jb3VudGVyZWQKLSAgfD09PQotUmVxdWVzdFR5cGU6OgotICBDQVNXcml0ZQotRGVzY3JpcHRpb246OgotICBNZXRyaWNzIHJlbGF0ZWQgdG8gdHJhbnNhY3Rpb25hbCB3cml0ZSByZXF1ZXN0cy4KLU1ldHJpY3M6OgotICBbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotICB8PT09Ci0gIHxOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgotICB8VGltZW91dHMgfENvdW50ZXIgfE51bWJlciBvZiB0aW1lb3V0cyBlbmNvdW50ZXJlZC4KLQotICB8RmFpbHVyZXMgfENvdW50ZXIgfE51bWJlciBvZiB0cmFuc2FjdGlvbiBmYWlsdXJlcyBlbmNvdW50ZXJlZC4KLQotICB8wqAgfExhdGVuY3kgfFRyYW5zYWN0aW9uIHdyaXRlIGxhdGVuY3kuCi0KLSAgfFVuZmluaXNoZWRDb21taXQgfENvdW50ZXIgfE51bWJlciBvZiB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIGNvbW1pdHRlZAotICBvbiB3cml0ZS4KLQotICB8Q29uZGl0aW9uTm90TWV0IHxDb3VudGVyIHxOdW1iZXIgb2YgdHJhbnNhY3Rpb24gcHJlY29uZGl0aW9ucyBkaWQgbm90Ci0gIG1hdGNoIGN1cnJlbnQgdmFsdWVzLgotCi0gIHxDb250ZW50aW9uSGlzdG9ncmFtIHxIaXN0b2dyYW0gfEhvdyBtYW55IGNvbnRlbmRlZCB3cml0ZXMgd2VyZQotICBlbmNvdW50ZXJlZAotCi0gIHxNdXRhdGlvblNpemVIaXN0b2dyYW0gfEhpc3RvZ3JhbSB8VG90YWwgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVxdWVzdHMKLSAgbXV0YXRpb25zLgotICB8PT09Ci1SZXF1ZXN0VHlwZTo6Ci0gIFJlYWQKLURlc2NyaXB0aW9uOjoKLSAgTWV0cmljcyByZWxhdGVkIHRvIHN0YW5kYXJkIHJlYWQgcmVxdWVzdHMuCi1NZXRyaWNzOjoKLSAgW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KLSAgfD09PQotICB8TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KLSAgfFRpbWVvdXRzIHxDb3VudGVyIHxOdW1iZXIgb2YgdGltZW91dHMgZW5jb3VudGVyZWQuCi0gIHxGYWlsdXJlcyB8Q291bnRlciB8TnVtYmVyIG9mIHJlYWQgZmFpbHVyZXMgZW5jb3VudGVyZWQuCi0gIHzCoCB8TGF0ZW5jeSB8UmVhZCBsYXRlbmN5LgotICB8VW5hdmFpbGFibGVzIHxDb3VudGVyIHxOdW1iZXIgb2YgdW5hdmFpbGFibGUgZXhjZXB0aW9ucyBlbmNvdW50ZXJlZC4KLSAgfD09PQotUmVxdWVzdFR5cGU6OgotICBSYW5nZVNsaWNlCi1EZXNjcmlwdGlvbjo6Ci0gIE1ldHJpY3MgcmVsYXRlZCB0byB0b2tlbiByYW5nZSByZWFkIHJlcXVlc3RzLgotTWV0cmljczo6Ci0gIFtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi0gIHw9PT0KLSAgfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCi0gIHxUaW1lb3V0cyB8Q291bnRlciB8TnVtYmVyIG9mIHRpbWVvdXRzIGVuY291bnRlcmVkLgotICB8RmFpbHVyZXMgfENvdW50ZXIgfE51bWJlciBvZiByYW5nZSBxdWVyeSBmYWlsdXJlcyBlbmNvdW50ZXJlZC4KLSAgfMKgIHxMYXRlbmN5IHxSYW5nZSBxdWVyeSBsYXRlbmN5LgotICB8VW5hdmFpbGFibGVzIHxDb3VudGVyIHxOdW1iZXIgb2YgdW5hdmFpbGFibGUgZXhjZXB0aW9ucyBlbmNvdW50ZXJlZC4KLSAgfD09PQotUmVxdWVzdFR5cGU6OgotICBXcml0ZQotRGVzY3JpcHRpb246OgotICBNZXRyaWNzIHJlbGF0ZWQgdG8gcmVndWxhciB3cml0ZSByZXF1ZXN0cy4KLU1ldHJpY3M6OgotICBbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotICB8PT09Ci0gIHxOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgotICB8VGltZW91dHMgfENvdW50ZXIgfE51bWJlciBvZiB0aW1lb3V0cyBlbmNvdW50ZXJlZC4KLQotICB8RmFpbHVyZXMgfENvdW50ZXIgfE51bWJlciBvZiB3cml0ZSBmYWlsdXJlcyBlbmNvdW50ZXJlZC4KLQotICB8wqAgfExhdGVuY3kgfFdyaXRlIGxhdGVuY3kuCi0KLSAgfFVuYXZhaWxhYmxlcyB8Q291bnRlciB8TnVtYmVyIG9mIHVuYXZhaWxhYmxlIGV4Y2VwdGlvbnMgZW5jb3VudGVyZWQuCi0KLSAgfE11dGF0aW9uU2l6ZUhpc3RvZ3JhbSB8SGlzdG9ncmFtIHxUb3RhbCBzaXplIGluIGJ5dGVzIG9mIHRoZSByZXF1ZXN0cwotICBtdXRhdGlvbnMuCi0gIHw9PT0KLVJlcXVlc3RUeXBlOjoKLSAgVmlld1dyaXRlCi1EZXNjcmlwdGlvbjo6Ci0gIE1ldHJpY3MgcmVsYXRlZCB0byBtYXRlcmlhbGl6ZWQgdmlldyB3cml0ZSB3cnRlcy4KLU1ldHJpY3M6OgotICBbY29scz0iLCwiLF0KLSAgfD09PQotICB8VGltZW91dHMgfENvdW50ZXIgfE51bWJlciBvZiB0aW1lb3V0cyBlbmNvdW50ZXJlZC4KLQotICB8RmFpbHVyZXMgfENvdW50ZXIgfE51bWJlciBvZiB0cmFuc2FjdGlvbiBmYWlsdXJlcyBlbmNvdW50ZXJlZC4KLQotICB8VW5hdmFpbGFibGVzIHxDb3VudGVyIHxOdW1iZXIgb2YgdW5hdmFpbGFibGUgZXhjZXB0aW9ucyBlbmNvdW50ZXJlZC4KLQotICB8Vmlld1JlcGxpY2FzQXR0ZW1wdGVkIHxDb3VudGVyIHxUb3RhbCBudW1iZXIgb2YgYXR0ZW1wdGVkIHZpZXcKLSAgcmVwbGljYSB3cml0ZXMuCi0KLSAgfFZpZXdSZXBsaWNhc1N1Y2Nlc3MgfENvdW50ZXIgfFRvdGFsIG51bWJlciBvZiBzdWNjZWRlZCB2aWV3IHJlcGxpY2EKLSAgd3JpdGVzLgotCi0gIHxWaWV3UGVuZGluZ011dGF0aW9ucyB8R2F1Z2U8TG9uZz4gfFZpZXdSZXBsaWNhc0F0dGVtcHRlZCAtCi0gIFZpZXdSZXBsaWNhc1N1Y2Nlc3MuCi0KLSAgfFZpZXdXcml0ZUxhdGVuY3kgfFRpbWVyIHxUaW1lIGJldHdlZW4gd2hlbiBtdXRhdGlvbiBpcyBhcHBsaWVkIHRvCi0gIGJhc2UgdGFibGUgYW5kIHdoZW4gQ0wuT05FIGlzIGFjaGlldmVkIG9uIHZpZXcuCi0gIHw9PT0KLQotPT0gQ2FjaGUgTWV0cmljcwotCi1DYXNzYW5kcmEgY2FjaGVzIGhhdmUgbWV0cmljcyB0byB0cmFjayB0aGUgZWZmZWN0aXZuZXNzIG9mIHRoZSBjYWNoZXMuCi1UaG91Z2ggdGhlIGBUYWJsZSBNZXRyaWNzYCBtaWdodCBiZSBtb3JlIHVzZWZ1bC4KLQotUmVwb3J0ZWQgbmFtZSBmb3JtYXQ6Ci0KLSpNZXRyaWMgTmFtZSo6OgotICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DYWNoZS48TWV0cmljTmFtZT4uPENhY2hlTmFtZT5gCi0qSk1YIE1CZWFuKjo6Ci0gIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9Q2FjaGUgc2NvcGU9PENhY2hlTmFtZT4gbmFtZT08TWV0cmljTmFtZT5gCi0KLVtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KLXxDYXBhY2l0eSB8R2F1Z2U8TG9uZz4gfENhY2hlIGNhcGFjaXR5IGluIGJ5dGVzLgotfEVudHJpZXMgfEdhdWdlPEludGVnZXI+IHxUb3RhbCBudW1iZXIgb2YgY2FjaGUgZW50cmllcy4KLXxGaWZ0ZWVuTWludXRlQ2FjaGVIaXRSYXRlIHxHYXVnZTxEb3VibGU+IHwxNW0gY2FjaGUgaGl0IHJhdGUuCi18Rml2ZU1pbnV0ZUNhY2hlSGl0UmF0ZSB8R2F1Z2U8RG91YmxlPiB8NW0gY2FjaGUgaGl0IHJhdGUuCi18T25lTWludXRlQ2FjaGVIaXRSYXRlIHxHYXVnZTxEb3VibGU+IHwxbSBjYWNoZSBoaXQgcmF0ZS4KLXxIaXRSYXRlIHxHYXVnZTxEb3VibGU+IHxBbGwgdGltZSBjYWNoZSBoaXQgcmF0ZS4KLXxIaXRzIHxNZXRlciB8VG90YWwgbnVtYmVyIG9mIGNhY2hlIGhpdHMuCi18TWlzc2VzIHxNZXRlciB8VG90YWwgbnVtYmVyIG9mIGNhY2hlIG1pc3Nlcy4KLXxNaXNzTGF0ZW5jeSB8VGltZXIgfExhdGVuY3kgb2YgbWlzc2VzLgotfFJlcXVlc3RzIHxHYXVnZTxMb25nPiB8VG90YWwgbnVtYmVyIG9mIGNhY2hlIHJlcXVlc3RzLgotfFNpemUgfEdhdWdlPExvbmc+IHxUb3RhbCBzaXplIG9mIG9jY3VwaWVkIGNhY2hlLCBpbiBieXRlcy4KLXw9PT0KLQotVGhlIGZvbGxvd2luZyBjYWNoZXMgYXJlIGNvdmVyZWQ6Ci0KLVtjb2xzPSIsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxOYW1lIHxEZXNjcmlwdGlvbgotfENvdW50ZXJDYWNoZSB8S2VlcHMgaG90IGNvdW50ZXJzIGluIG1lbW9yeSBmb3IgcGVyZm9ybWFuY2UuCi18Q2h1bmtDYWNoZSB8SW4gcHJvY2VzcyB1bmNvbXByZXNzZWQgcGFnZSBjYWNoZS4KLXxLZXlDYWNoZSB8Q2FjaGUgZm9yIHBhcnRpdGlvbiB0byBzc3RhYmxlIG9mZnNldHMuCi18Um93Q2FjaGUgfENhY2hlIGZvciByb3dzIGtlcHQgaW4gbWVtb3J5LgotfD09PQotCi1bTk9URV0KLS5Ob3RlCi09PT09Ci1NaXNzZXMgYW5kIE1pc3NMYXRlbmN5IGFyZSBvbmx5IGRlZmluZWQgZm9yIHRoZSBDaHVua0NhY2hlCi09PT09PT0gQ1FMIE1ldHJpY3MKLQotTWV0cmljcyBzcGVjaWZpYyB0byBDUUwgcHJlcGFyZWQgc3RhdGVtZW50IGNhY2hpbmcuCi0KLVJlcG9ydGVkIG5hbWUgZm9ybWF0OgotCi0qTWV0cmljIE5hbWUqOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ1FMLjxNZXRyaWNOYW1lPmAKLSpKTVggTUJlYW4qOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1DUUwgbmFtZT08TWV0cmljTmFtZT5gCi0KLVtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KLXxQcmVwYXJlZFN0YXRlbWVudHNDb3VudCB8R2F1Z2U8SW50ZWdlcj4gfE51bWJlciBvZiBjYWNoZWQgcHJlcGFyZWQKLXN0YXRlbWVudHMuCi0KLXxQcmVwYXJlZFN0YXRlbWVudHNFdmljdGVkIHxDb3VudGVyIHxOdW1iZXIgb2YgcHJlcGFyZWQgc3RhdGVtZW50cwotZXZpY3RlZCBmcm9tIHRoZSBwcmVwYXJlZCBzdGF0ZW1lbnQgY2FjaGUKLQotfFByZXBhcmVkU3RhdGVtZW50c0V4ZWN1dGVkIHxDb3VudGVyIHxOdW1iZXIgb2YgcHJlcGFyZWQgc3RhdGVtZW50cwotZXhlY3V0ZWQuCi0KLXxSZWd1bGFyU3RhdGVtZW50c0V4ZWN1dGVkIHxDb3VudGVyIHxOdW1iZXIgb2YgKm5vbiogcHJlcGFyZWQgc3RhdGVtZW50cwotZXhlY3V0ZWQuCi0KLXxQcmVwYXJlZFN0YXRlbWVudHNSYXRpbyB8R2F1Z2U8RG91YmxlPiB8UGVyY2VudGFnZSBvZiBzdGF0ZW1lbnRzIHRoYXQKLWFyZSBwcmVwYXJlZCB2cyB1bnByZXBhcmVkLgotfD09PQotCi1bW2Ryb3BwZWQtbWV0cmljc11dCi09PSBEcm9wcGVkTWVzc2FnZSBNZXRyaWNzCi0KLU1ldHJpY3Mgc3BlY2lmaWMgdG8gdHJhY2tpbmcgZHJvcHBlZCBtZXNzYWdlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mCi1yZXF1ZXN0cy4gRHJvcHBlZCB3cml0ZXMgYXJlIHN0b3JlZCBhbmQgcmV0cmllZCBieSBgSGludGVkIEhhbmRvZmZgCi0KLVJlcG9ydGVkIG5hbWUgZm9ybWF0OgotCi0qTWV0cmljIE5hbWUqOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuRHJvcHBlZE1lc3NhZ2UuPE1ldHJpY05hbWU+LjxUeXBlPmAKLSpKTVggTUJlYW4qOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1Ecm9wcGVkTWVzc2FnZSBzY29wZT08VHlwZT4gbmFtZT08TWV0cmljTmFtZT5gCi0KLVtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KLXxDcm9zc05vZGVEcm9wcGVkTGF0ZW5jeSB8VGltZXIgfFRoZSBkcm9wcGVkIGxhdGVuY3kgYWNyb3NzIG5vZGVzLgotfEludGVybmFsRHJvcHBlZExhdGVuY3kgfFRpbWVyIHxUaGUgZHJvcHBlZCBsYXRlbmN5IHdpdGhpbiBub2RlLgotfERyb3BwZWQgfE1ldGVyIHxOdW1iZXIgb2YgZHJvcHBlZCBtZXNzYWdlcy4KLXw9PT0KLQotVGhlIGRpZmZlcmVudCB0eXBlcyBvZiBtZXNzYWdlcyB0cmFja2VkIGFyZToKLQotW2NvbHM9IiwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfE5hbWUgfERlc2NyaXB0aW9uCi18QkFUQ0hfU1RPUkUgfEJhdGNobG9nIHdyaXRlCi18QkFUQ0hfUkVNT1ZFIHxCYXRjaGxvZyBjbGVhbnVwIChhZnRlciBzdWNjZXNmdWxseSBhcHBsaWVkKQotfENPVU5URVJfTVVUQVRJT04gfENvdW50ZXIgd3JpdGVzCi18SElOVCB8SGludCByZXBsYXkKLXxNVVRBVElPTiB8UmVndWxhciB3cml0ZXMKLXxSRUFEIHxSZWd1bGFyIHJlYWRzCi18UkVBRF9SRVBBSVIgfFJlYWQgcmVwYWlyCi18UEFHRURfU0xJQ0UgfFBhZ2VkIHJlYWQKLXxSQU5HRV9TTElDRSB8VG9rZW4gcmFuZ2UgcmVhZAotfFJFUVVFU1RfUkVTUE9OU0UgfFJQQyBDYWxsYmFja3MKLXxfVFJBQ0UgfFRyYWNpbmcgd3JpdGVzCi18PT09Ci0KLT09IFN0cmVhbWluZyBNZXRyaWNzCi0KLU1ldHJpY3MgcmVwb3J0ZWQgZHVyaW5nIGBTdHJlYW1pbmdgIG9wZXJhdGlvbnMsIHN1Y2ggYXMgcmVwYWlyLAotYm9vdHN0cmFwLCByZWJ1aWxkLgotCi1UaGVzZSBtZXRyaWNzIGFyZSBzcGVjaWZpYyB0byBhIHBlZXIgZW5kcG9pbnQsIHdpdGggdGhlIHNvdXJjZSBub2RlCi1iZWluZyB0aGUgbm9kZSB5b3UgYXJlIHB1bGxpbmcgdGhlIG1ldHJpY3MgZnJvbS4KLQotUmVwb3J0ZWQgbmFtZSBmb3JtYXQ6Ci0KLSpNZXRyaWMgTmFtZSo6OgotICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5TdHJlYW1pbmcuPE1ldHJpY05hbWU+LjxQZWVySVA+YAotKkpNWCBNQmVhbio6OgotICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPVN0cmVhbWluZyBzY29wZT08UGVlcklQPiBuYW1lPTxNZXRyaWNOYW1lPmAKLQotW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgotfEluY29taW5nQnl0ZXMgfENvdW50ZXIgfE51bWJlciBvZiBieXRlcyBzdHJlYW1lZCB0byB0aGlzIG5vZGUgZnJvbSB0aGUKLXBlZXIuCi0KLXxPdXRnb2luZ0J5dGVzIHxDb3VudGVyIHxOdW1iZXIgb2YgYnl0ZXMgc3RyZWFtZWQgdG8gdGhlIHBlZXIgZW5kcG9pbnQKLWZyb20gdGhpcyBub2RlLgotfD09PQotCi09PSBDb21wYWN0aW9uIE1ldHJpY3MKLQotTWV0cmljcyBzcGVjaWZpYyB0byBgQ29tcGFjdGlvbmAgd29yay4KLQotUmVwb3J0ZWQgbmFtZSBmb3JtYXQ6Ci0KLSpNZXRyaWMgTmFtZSo6OgotICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5Db21wYWN0aW9uLjxNZXRyaWNOYW1lPmAKLSpKTVggTUJlYW4qOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1Db21wYWN0aW9uIG5hbWU9PE1ldHJpY05hbWU+YAotCi1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCi18Qnl0ZXNDb21wYWN0ZWQgfENvdW50ZXIgfFRvdGFsIG51bWJlciBvZiBieXRlcyBjb21wYWN0ZWQgc2luY2Ugc2VydmVyCi1bcmVdc3RhcnQuCi0KLXxQZW5kaW5nVGFza3MgfEdhdWdlPEludGVnZXI+IHxFc3RpbWF0ZWQgbnVtYmVyIG9mIGNvbXBhY3Rpb25zIHJlbWFpbmluZwotdG8gcGVyZm9ybS4KLQotfENvbXBsZXRlZFRhc2tzIHxHYXVnZTxMb25nPiB8TnVtYmVyIG9mIGNvbXBsZXRlZCBjb21wYWN0aW9ucyBzaW5jZQotc2VydmVyIFtyZV1zdGFydC4KLQotfFRvdGFsQ29tcGFjdGlvbnNDb21wbGV0ZWQgfE1ldGVyIHxUaHJvdWdocHV0IG9mIGNvbXBsZXRlZCBjb21wYWN0aW9ucwotc2luY2Ugc2VydmVyIFtyZV1zdGFydC4KLQotfFBlbmRpbmdUYXNrc0J5VGFibGVOYW1lIHxHYXVnZTxNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBJbnRlZ2VyPj4+Ci18RXN0aW1hdGVkIG51bWJlciBvZiBjb21wYWN0aW9ucyByZW1haW5pbmcgdG8gcGVyZm9ybSwgZ3JvdXBlZCBieQota2V5c3BhY2UgYW5kIHRoZW4gdGFibGUgbmFtZS4gVGhpcyBpbmZvIGlzIGFsc28ga2VwdCBpbiBgVGFibGUgTWV0cmljc2AuCi18PT09Ci0KLT09IENvbW1pdExvZyBNZXRyaWNzCi0KLU1ldHJpY3Mgc3BlY2lmaWMgdG8gdGhlIGBDb21taXRMb2dgCi0KLVJlcG9ydGVkIG5hbWUgZm9ybWF0OgotCi0qTWV0cmljIE5hbWUqOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ29tbWl0TG9nLjxNZXRyaWNOYW1lPmAKLSpKTVggTUJlYW4qOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1Db21taXRMb2cgbmFtZT08TWV0cmljTmFtZT5gCi0KLVtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KLXxDb21wbGV0ZWRUYXNrcyB8R2F1Z2U8TG9uZz4gfFRvdGFsIG51bWJlciBvZiBjb21taXQgbG9nIG1lc3NhZ2VzCi13cml0dGVuIHNpbmNlIFtyZV1zdGFydC4KLQotfFBlbmRpbmdUYXNrcyB8R2F1Z2U8TG9uZz4gfE51bWJlciBvZiBjb21taXQgbG9nIG1lc3NhZ2VzIHdyaXR0ZW4gYnV0Ci15ZXQgdG8gYmUgZnN5bmMnZC4KLQotfFRvdGFsQ29tbWl0TG9nU2l6ZSB8R2F1Z2U8TG9uZz4gfEN1cnJlbnQgc2l6ZSwgaW4gYnl0ZXMsIHVzZWQgYnkgYWxsCi10aGUgY29tbWl0IGxvZyBzZWdtZW50cy4KLQotfFdhaXRpbmdPblNlZ21lbnRBbGxvY2F0aW9uIHxUaW1lciB8VGltZSBzcGVudCB3YWl0aW5nIGZvciBhCi1Db21taXRMb2dTZWdtZW50IHRvIGJlIGFsbG9jYXRlZCAtIHVuZGVyIG5vcm1hbCBjb25kaXRpb25zIHRoaXMgc2hvdWxkCi1iZSB6ZXJvLgotCi18V2FpdGluZ09uQ29tbWl0IHxUaW1lciB8VGhlIHRpbWUgc3BlbnQgd2FpdGluZyBvbiBDTCBmc3luYzsgZm9yCi1QZXJpb2RpYyB0aGlzIGlzIG9ubHkgb2NjdXJzIHdoZW4gdGhlIHN5bmMgaXMgbGFnZ2luZyBpdHMgc3luYyBpbnRlcnZhbC4KLXw9PT0KLQotPT0gU3RvcmFnZSBNZXRyaWNzCi0KLU1ldHJpY3Mgc3BlY2lmaWMgdG8gdGhlIHN0b3JhZ2UgZW5naW5lLgotCi1SZXBvcnRlZCBuYW1lIGZvcm1hdDoKLQotKk1ldHJpYyBOYW1lKjo6Ci0gIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlN0b3JhZ2UuPE1ldHJpY05hbWU+YAotKkpNWCBNQmVhbio6OgotICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPVN0b3JhZ2UgbmFtZT08TWV0cmljTmFtZT5gCi0KLVtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KLXxFeGNlcHRpb25zIHxDb3VudGVyIHxOdW1iZXIgb2YgaW50ZXJuYWwgZXhjZXB0aW9ucyBjYXVnaHQuIFVuZGVyIG5vcm1hbAotZXhjZXB0aW9ucyB0aGlzIHNob3VsZCBiZSB6ZXJvLgotCi18TG9hZCB8Q291bnRlciB8U2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBvbiBkaXNrIGRhdGEgc2l6ZSB0aGlzIG5vZGUKLW1hbmFnZXMuCi0KLXxUb3RhbEhpbnRzIHxDb3VudGVyIHxOdW1iZXIgb2YgaGludCBtZXNzYWdlcyB3cml0dGVuIHRvIHRoaXMgbm9kZSBzaW5jZQotW3JlXXN0YXJ0LiBJbmNsdWRlcyBvbmUgZW50cnkgZm9yIGVhY2ggaG9zdCB0byBiZSBoaW50ZWQgcGVyIGhpbnQuCi0KLXxUb3RhbEhpbnRzSW5Qcm9ncmVzcyB8Q291bnRlciB8TnVtYmVyIG9mIGhpbnRzIGF0dGVtcGluZyB0byBiZSBzZW50Ci1jdXJyZW50bHkuCi18PT09Ci0KLVtbaGFuZG9mZi1tZXRyaWNzXV0KLT09IEhpbnRlZEhhbmRvZmYgTWV0cmljcwotCi1NZXRyaWNzIHNwZWNpZmljIHRvIEhpbnRlZCBIYW5kb2ZmLiBUaGVyZSBhcmUgYWxzbyBzb21lIG1ldHJpY3MgcmVsYXRlZAotdG8gaGludHMgdHJhY2tlZCBpbiBgU3RvcmFnZSBNZXRyaWNzYAotCi1UaGVzZSBtZXRyaWNzIGluY2x1ZGUgdGhlIHBlZXIgZW5kcG9pbnQgKmluIHRoZSBtZXRyaWMgbmFtZSoKLQotUmVwb3J0ZWQgbmFtZSBmb3JtYXQ6Ci0KLSpNZXRyaWMgTmFtZSo6OgotICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5IaW50ZWRIYW5kT2ZmTWFuYWdlci48TWV0cmljTmFtZT5gCi0qSk1YIE1CZWFuKjo6Ci0gIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9SGludGVkSGFuZE9mZk1hbmFnZXIgbmFtZT08TWV0cmljTmFtZT5gCi0KLVtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KLXxIaW50c19jcmVhdGVkLTxQZWVySVA+IGF8Ci1fX19fCi1Db3VudGVyCi1fX19fCi0KLWF8Ci1fX19fCi1OdW1iZXIgb2YgaGludHMgb24gZGlzayBmb3IgdGhpcyBwZWVyLgotX19fXwotCi18SGludHNfbm90X3N0b3JlZC08UGVlcklQPiBhfAotX19fXwotQ291bnRlcgotX19fXwotCi1hfAotX19fXwotTnVtYmVyIG9mIGhpbnRzIG5vdCBzdG9yZWQgZm9yIHRoaXMgcGVlciwgZHVlIHRvIGJlaW5nIGRvd24gcGFzdCB0aGUKLWNvbmZpZ3VyZWQgaGludCB3aW5kb3cuCi1fX19fCi0KLXw9PT0KLQotPT0gSGludHNTZXJ2aWNlIE1ldHJpY3MKLQotTWV0cmljcyBzcGVjaWZpYyB0byB0aGUgSGludHMgZGVsaXZlcnkgc2VydmljZS4gVGhlcmUgYXJlIGFsc28gc29tZQotbWV0cmljcyByZWxhdGVkIHRvIGhpbnRzIHRyYWNrZWQgaW4gYFN0b3JhZ2UgTWV0cmljc2AKLQotVGhlc2UgbWV0cmljcyBpbmNsdWRlIHRoZSBwZWVyIGVuZHBvaW50ICppbiB0aGUgbWV0cmljIG5hbWUqCi0KLVJlcG9ydGVkIG5hbWUgZm9ybWF0OgotCi0qTWV0cmljIE5hbWUqOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuSGludHNTZXJ2aWNlLjxNZXRyaWNOYW1lPmAKLSpKTVggTUJlYW4qOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1IaW50c1NlcnZpY2UgbmFtZT08TWV0cmljTmFtZT5gCi0KLVtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KLXxIaW50c1N1Y2NlZWRlZCBhfAotX19fXwotTWV0ZXIKLV9fX18KLQotYXwKLV9fX18KLUEgbWV0ZXIgb2YgdGhlIGhpbnRzIHN1Y2Nlc3NmdWxseSBkZWxpdmVyZWQKLV9fX18KLQotfEhpbnRzRmFpbGVkIGF8Ci1fX19fCi1NZXRlcgotX19fXwotCi1hfAotX19fXwotQSBtZXRlciBvZiB0aGUgaGludHMgdGhhdCBmYWlsZWQgZGVsaXZlcgotX19fXwotCi18SGludHNUaW1lZE91dCBhfAotX19fXwotTWV0ZXIKLV9fX18KLQotYXwKLV9fX18KLUEgbWV0ZXIgb2YgdGhlIGhpbnRzIHRoYXQgdGltZWQgb3V0Ci1fX19fCi0KLXxIaW50X2RlbGF5cyB8SGlzdG9ncmFtIHxIaXN0b2dyYW0gb2YgaGludCBkZWxpdmVyeSBkZWxheXMgKGluCi1taWxsaXNlY29uZHMpCi0KLXxIaW50X2RlbGF5cy08UGVlcklQPiB8SGlzdG9ncmFtIHxIaXN0b2dyYW0gb2YgaGludCBkZWxpdmVyeSBkZWxheXMgKGluCi1taWxsaXNlY29uZHMpIHBlciBwZWVyCi18PT09Ci0KLT09IFNTVGFibGUgSW5kZXggTWV0cmljcwotCi1NZXRyaWNzIHNwZWNpZmljIHRvIHRoZSBTU1RhYmxlIGluZGV4IG1ldGFkYXRhLgotCi1SZXBvcnRlZCBuYW1lIGZvcm1hdDoKLQotKk1ldHJpYyBOYW1lKjo6Ci0gIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkluZGV4LjxNZXRyaWNOYW1lPi5Sb3dJbmRleEVudHJ5YAotKkpNWCBNQmVhbio6OgotICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUluZGV4IHNjb3BlPVJvd0luZGV4RW50cnkgbmFtZT08TWV0cmljTmFtZT5gCi0KLVtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KLXxJbmRleGVkRW50cnlTaXplIHxIaXN0b2dyYW0gfEhpc3RvZ3JhbSBvZiB0aGUgb24taGVhcCBzaXplLCBpbiBieXRlcywKLW9mIHRoZSBpbmRleCBhY3Jvc3MgYWxsIFNTVGFibGVzLgotCi18SW5kZXhJbmZvQ291bnQgfEhpc3RvZ3JhbSB8SGlzdG9ncmFtIG9mIHRoZSBudW1iZXIgb2Ygb24taGVhcCBpbmRleAotZW50cmllcyBtYW5hZ2VkIGFjcm9zcyBhbGwgU1NUYWJsZXMuCi0KLXxJbmRleEluZm9HZXRzIHxIaXN0b2dyYW0gfEhpc3RvZ3JhbSBvZiB0aGUgbnVtYmVyIGluZGV4IHNlZWtzIHBlcmZvcm1lZAotcGVyIFNTVGFibGUuCi18PT09Ci0KLT09IEJ1ZmZlclBvb2wgTWV0cmljcwotCi1NZXRyaWNzIHNwZWNpZmljIHRvIHRoZSBpbnRlcm5hbCByZWN5Y2xlZCBidWZmZXIgcG9vbCBDYXNzYW5kcmEgbWFuYWdlcy4KLVRoaXMgcG9vbCBpcyBtZWFudCB0byBrZWVwIGFsbG9jYXRpb25zIGFuZCBHQyBsb3dlciBieSByZWN5Y2xpbmcgb24gYW5kCi1vZmYgaGVhcCBidWZmZXJzLgotCi1SZXBvcnRlZCBuYW1lIGZvcm1hdDoKLQotKk1ldHJpYyBOYW1lKjo6Ci0gIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkJ1ZmZlclBvb2wuPE1ldHJpY05hbWU+YAotKkpNWCBNQmVhbio6OgotICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUJ1ZmZlclBvb2wgbmFtZT08TWV0cmljTmFtZT5gCi0KLVtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KLXxTaXplIHxHYXVnZTxMb25nPiB8U2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBtYW5hZ2VkIGJ1ZmZlciBwb29sCi0KLXxNaXNzZXMgfE1ldGVyIGF8Ci1fX19fCi1UaGUgcmF0ZSBvZiBtaXNzZXMgaW4gdGhlIHBvb2wuIFRoZSBoaWdoZXIgdGhpcyBpcyB0aGUgbW9yZSBhbGxvY2F0aW9ucwotaW5jdXJyZWQuCi1fX19fCi0KLXw9PT0KLQotPT0gQ2xpZW50IE1ldHJpY3MKLQotTWV0cmljcyBzcGVjaWZjIHRvIGNsaWVudCBtYW5hZ21lbnQuCi0KLVJlcG9ydGVkIG5hbWUgZm9ybWF0OgotCi0qTWV0cmljIE5hbWUqOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2xpZW50LjxNZXRyaWNOYW1lPmAKLSpKTVggTUJlYW4qOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1DbGllbnQgbmFtZT08TWV0cmljTmFtZT5gCi0KLVtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KLXxjb25uZWN0ZWROYXRpdmVDbGllbnRzIHxHYXVnZTxJbnRlZ2VyPiB8TnVtYmVyIG9mIGNsaWVudHMgY29ubmVjdGVkIHRvCi10aGlzIG5vZGVzIG5hdGl2ZSBwcm90b2NvbCBzZXJ2ZXIKLQotfGNvbm5lY3Rpb25zIHxHYXVnZTxMaXN0PE1hcDxTdHJpbmcsIFN0cmluZz4+IHxMaXN0IG9mIGFsbCBjb25uZWN0aW9ucwotYW5kIHRoZWlyIHN0YXRlIGluZm9ybWF0aW9uCi0KLXxjb25uZWN0ZWROYXRpdmVDbGllbnRzQnlVc2VyIHxHYXVnZTxNYXA8U3RyaW5nLCBJbnQ+IHxOdW1iZXIgb2YKLWNvbm5uZWN0aXZlIG5hdGl2ZSBjbGllbnRzIGJ5IHVzZXJuYW1lCi18PT09Ci0KLT09IEJhdGNoIE1ldHJpY3MKLQotTWV0cmljcyBzcGVjaWZjIHRvIGJhdGNoIHN0YXRlbWVudHMuCi0KLVJlcG9ydGVkIG5hbWUgZm9ybWF0OgotCi0qTWV0cmljIE5hbWUqOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQmF0Y2guPE1ldHJpY05hbWU+YAotKkpNWCBNQmVhbio6OgotICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUJhdGNoIG5hbWU9PE1ldHJpY05hbWU+YAotCi1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCi18UGFydGl0aW9uc1BlckNvdW50ZXJCYXRjaCB8SGlzdG9ncmFtIHxEaXN0cmlidXRpb24gb2YgdGhlIG51bWJlciBvZgotcGFydGl0aW9ucyBwcm9jZXNzZWQgcGVyIGNvdW50ZXIgYmF0Y2gKLQotfFBhcnRpdGlvbnNQZXJMb2dnZWRCYXRjaCB8SGlzdG9ncmFtIHxEaXN0cmlidXRpb24gb2YgdGhlIG51bWJlciBvZgotcGFydGl0aW9ucyBwcm9jZXNzZWQgcGVyIGxvZ2dlZCBiYXRjaAotCi18UGFydGl0aW9uc1BlclVubG9nZ2VkQmF0Y2ggfEhpc3RvZ3JhbSB8RGlzdHJpYnV0aW9uIG9mIHRoZSBudW1iZXIgb2YKLXBhcnRpdGlvbnMgcHJvY2Vzc2VkIHBlciB1bmxvZ2dlZCBiYXRjaAotfD09PQotCi09PSBKVk0gTWV0cmljcwotCi1KVk0gbWV0cmljcyBzdWNoIGFzIG1lbW9yeSBhbmQgZ2FyYmFnZSBjb2xsZWN0aW9uIHN0YXRpc3RpY3MgY2FuIGVpdGhlcgotYmUgYWNjZXNzZWQgYnkgY29ubmVjdGluZyB0byB0aGUgSlZNIHVzaW5nIEpNWCBvciBjYW4gYmUgZXhwb3J0ZWQgdXNpbmcKLWxpbms6I21ldHJpYy1yZXBvcnRlcnNbTWV0cmljIFJlcG9ydGVyc10uCi0KLT09PSBCdWZmZXJQb29sCi0KLSpNZXRyaWMgTmFtZSo6OgotICBganZtLmJ1ZmZlcnMuPGRpcmVjdHxtYXBwZWQ+LjxNZXRyaWNOYW1lPmAKLSpKTVggTUJlYW4qOjoKLSAgYGphdmEubmlvOnR5cGU9QnVmZmVyUG9vbCBuYW1lPTxkaXJlY3R8bWFwcGVkPmAKLQotW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgotfENhcGFjaXR5IHxHYXVnZTxMb25nPiB8RXN0aW1hdGVkIHRvdGFsIGNhcGFjaXR5IG9mIHRoZSBidWZmZXJzIGluIHRoaXMKLXBvb2wKLQotfENvdW50IHxHYXVnZTxMb25nPiB8RXN0aW1hdGVkIG51bWJlciBvZiBidWZmZXJzIGluIHRoZSBwb29sCi0KLXxVc2VkIHxHYXVnZTxMb25nPiB8RXN0aW1hdGVkIG1lbW9yeSB0aGF0IHRoZSBKYXZhIHZpcnR1YWwgbWFjaGluZSBpcwotdXNpbmcgZm9yIHRoaXMgYnVmZmVyIHBvb2wKLXw9PT0KLQotPT09IEZpbGVEZXNjcmlwdG9yUmF0aW8KLQotKk1ldHJpYyBOYW1lKjo6Ci0gIGBqdm0uZmQuPE1ldHJpY05hbWU+YAotKkpNWCBNQmVhbio6OgotICBgamF2YS5sYW5nOnR5cGU9T3BlcmF0aW5nU3lzdGVtIG5hbWU9PE9wZW5GaWxlRGVzY3JpcHRvckNvdW50fE1heEZpbGVEZXNjcmlwdG9yQ291bnQ+YAotCi1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCi18VXNhZ2UgfFJhdGlvIHxSYXRpbyBvZiB1c2VkIHRvIHRvdGFsIGZpbGUgZGVzY3JpcHRvcnMKLXw9PT0KLQotPT09IEdhcmJhZ2VDb2xsZWN0b3IKLQotKk1ldHJpYyBOYW1lKjo6Ci0gIGBqdm0uZ2MuPGdjX3R5cGU+LjxNZXRyaWNOYW1lPmAKLSpKTVggTUJlYW4qOjoKLSAgYGphdmEubGFuZzp0eXBlPUdhcmJhZ2VDb2xsZWN0b3IgbmFtZT08Z2NfdHlwZT5gCi0KLVtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KLXxDb3VudCB8R2F1Z2U8TG9uZz4gfFRvdGFsIG51bWJlciBvZiBjb2xsZWN0aW9ucyB0aGF0IGhhdmUgb2NjdXJyZWQKLQotfFRpbWUgfEdhdWdlPExvbmc+IHxBcHByb3hpbWF0ZSBhY2N1bXVsYXRlZCBjb2xsZWN0aW9uIGVsYXBzZWQgdGltZSBpbgotbWlsbGlzZWNvbmRzCi18PT09Ci0KLT09PSBNZW1vcnkKLQotKk1ldHJpYyBOYW1lKjo6Ci0gIGBqdm0ubWVtb3J5LjxoZWFwL25vbi1oZWFwL3RvdGFsPi48TWV0cmljTmFtZT5gCi0qSk1YIE1CZWFuKjo6Ci0gIGBqYXZhLmxhbmc6dHlwZT1NZW1vcnlgCi0KLVtjb2xzPSIsLCIsXQotfD09PQotfENvbW1pdHRlZCB8R2F1Z2U8TG9uZz4gfEFtb3VudCBvZiBtZW1vcnkgaW4gYnl0ZXMgdGhhdCBpcyBjb21taXR0ZWQgZm9yCi10aGUgSlZNIHRvIHVzZQotCi18SW5pdCB8R2F1Z2U8TG9uZz4gfEFtb3VudCBvZiBtZW1vcnkgaW4gYnl0ZXMgdGhhdCB0aGUgSlZNIGluaXRpYWxseQotcmVxdWVzdHMgZnJvbSB0aGUgT1MKLQotfE1heCB8R2F1Z2U8TG9uZz4gfE1heGltdW0gYW1vdW50IG9mIG1lbW9yeSBpbiBieXRlcyB0aGF0IGNhbiBiZSB1c2VkCi1mb3IgbWVtb3J5IG1hbmFnZW1lbnQKLQotfFVzYWdlIHxSYXRpbyB8UmF0aW8gb2YgdXNlZCB0byBtYXhpbXVtIG1lbW9yeQotCi18VXNlZCB8R2F1Z2U8TG9uZz4gfEFtb3VudCBvZiB1c2VkIG1lbW9yeSBpbiBieXRlcwotfD09PQotCi09PT0gTWVtb3J5UG9vbAotCi0qTWV0cmljIE5hbWUqOjoKLSAgYGp2bS5tZW1vcnkucG9vbHMuPG1lbW9yeV9wb29sPi48TWV0cmljTmFtZT5gCi0qSk1YIE1CZWFuKjo6Ci0gIGBqYXZhLmxhbmc6dHlwZT1NZW1vcnlQb29sIG5hbWU9PG1lbW9yeV9wb29sPmAKLQotW2NvbHM9IiwsIixdCi18PT09Ci18Q29tbWl0dGVkIHxHYXVnZTxMb25nPiB8QW1vdW50IG9mIG1lbW9yeSBpbiBieXRlcyB0aGF0IGlzIGNvbW1pdHRlZCBmb3IKLXRoZSBKVk0gdG8gdXNlCi0KLXxJbml0IHxHYXVnZTxMb25nPiB8QW1vdW50IG9mIG1lbW9yeSBpbiBieXRlcyB0aGF0IHRoZSBKVk0gaW5pdGlhbGx5Ci1yZXF1ZXN0cyBmcm9tIHRoZSBPUwotCi18TWF4IHxHYXVnZTxMb25nPiB8TWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IGluIGJ5dGVzIHRoYXQgY2FuIGJlIHVzZWQKLWZvciBtZW1vcnkgbWFuYWdlbWVudAotCi18VXNhZ2UgfFJhdGlvIHxSYXRpbyBvZiB1c2VkIHRvIG1heGltdW0gbWVtb3J5Ci0KLXxVc2VkIHxHYXVnZTxMb25nPiB8QW1vdW50IG9mIHVzZWQgbWVtb3J5IGluIGJ5dGVzCi18PT09Ci0KLT09IEpNWAotCi1BbnkgSk1YIGJhc2VkIGNsaWVudCBjYW4gYWNjZXNzIG1ldHJpY3MgZnJvbSBjYXNzYW5kcmEuCi0KLUlmIHlvdSB3aXNoIHRvIGFjY2VzcyBKTVggbWV0cmljcyBvdmVyIGh0dHAgaXQncyBwb3NzaWJsZSB0byBkb3dubG9hZAotaHR0cDovL214NGouc291cmNlZm9yZ2UubmV0L1tNeDRqVG9vbF0gYW5kIHBsYWNlIGBteDRqLXRvb2xzLmphcmAgaW50bwotdGhlIGNsYXNzcGF0aC4gT24gc3RhcnR1cCB5b3Ugd2lsbCBzZWUgaW4gdGhlIGxvZzoKLQotW3NvdXJjZSxub25lXQotLS0tLQotSHR0cEFkYXB0b3IgdmVyc2lvbiAzLjAuMiBzdGFydGVkIG9uIHBvcnQgODA4MQotLS0tLQotCi1UbyBjaG9vc2UgYSBkaWZmZXJlbnQgcG9ydCAoODA4MSBpcyB0aGUgZGVmYXVsdCkgb3IgYSBkaWZmZXJlbnQgbGlzdGVuCi1hZGRyZXNzICgwLjAuMC4wIGlzIG5vdCB0aGUgZGVmYXVsdCkgZWRpdCBgY29uZi9jYXNzYW5kcmEtZW52LnNoYCBhbmQKLXVuY29tbWVudDoKLQotW3NvdXJjZSxub25lXQotLS0tLQotI01YNEpfQUREUkVTUz0iLURteDRqYWRkcmVzcz0wLjAuMC4wIgotCi0jTVg0Sl9QT1JUPSItRG14NGpwb3J0PTgwODEiCi0tLS0tCi0KLT09IE1ldHJpYyBSZXBvcnRlcnMKLQotQXMgbWVudGlvbmVkIGF0IHRoZSB0b3Agb2YgdGhpcyBzZWN0aW9uIG9uIG1vbml0b3JpbmcgdGhlIENhc3NhbmRyYQotbWV0cmljcyBjYW4gYmUgZXhwb3J0ZWQgdG8gYSBudW1iZXIgb2YgbW9uaXRvcmluZyBzeXN0ZW0gYSBudW1iZXIgb2YKLWh0dHA6Ly9tZXRyaWNzLmRyb3B3aXphcmQuaW8vMy4xLjAvZ2V0dGluZy1zdGFydGVkLyNvdGhlci1yZXBvcnRpbmdbYnVpbHQKLWluXSBhbmQgaHR0cDovL21ldHJpY3MuZHJvcHdpemFyZC5pby8zLjEuMC9tYW51YWwvdGhpcmQtcGFydHkvW3RoaXJkCi1wYXJ0eV0gcmVwb3J0ZXIgcGx1Z2lucy4KLQotVGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlc2UgcGx1Z2lucyBpcyBtYW5hZ2VkIGJ5IHRoZQotaHR0cHM6Ly9naXRodWIuY29tL2FkZHRoaXMvbWV0cmljcy1yZXBvcnRlci1jb25maWdbbWV0cmljcyByZXBvcnRlcgotY29uZmlnIHByb2plY3RdLiBUaGVyZSBpcyBhIHNhbXBsZSBjb25maWd1cmF0aW9uIGZpbGUgbG9jYXRlZCBhdAotYGNvbmYvbWV0cmljcy1yZXBvcnRlci1jb25maWctc2FtcGxlLnlhbWxgLgotCi1PbmNlIGNvbmZpZ3VyZWQsIHlvdSBzaW1wbHkgc3RhcnQgY2Fzc2FuZHJhIHdpdGggdGhlIGZsYWcKLWAtRGNhc3NhbmRyYS5tZXRyaWNzUmVwb3J0ZXJDb25maWdGaWxlPW1ldHJpY3MtcmVwb3J0ZXItY29uZmlnLnlhbWxgLgotVGhlIHNwZWNpZmllZCAueWFtbCBmaWxlIHBsdXMgYW55IDNyZCBwYXJ0eSByZXBvcnRlciBqYXJzIG11c3QgYWxsIGJlIGluCi1DYXNzYW5kcmEncyBjbGFzc3BhdGguCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL3ZpcnR1YWx0YWJsZXMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvdmlydHVhbHRhYmxlcy5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTYzZWNiLi4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvdmlydHVhbHRhYmxlcy5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsNDc4ICswLDAgQEAKLT0gVmlydHVhbCBUYWJsZXMKLQotQXBhY2hlIENhc3NhbmRyYSA0LjAgaW1wbGVtZW50cyB2aXJ0dWFsIHRhYmxlcyAoaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtNzYyMltDQVNTQU5EUkEtNzYyMl0pLgotVmlydHVhbCB0YWJsZXMgYXJlIHRhYmxlcyBiYWNrZWQgYnkgYW4gQVBJIGluc3RlYWQgb2YgZGF0YSBleHBsaWNpdGx5IG1hbmFnZWQgYW5kIHN0b3JlZCBhcyBTU1RhYmxlcy4gCi1BcGFjaGUgQ2Fzc2FuZHJhIDQuMCBpbXBsZW1lbnRzIGEgdmlydHVhbCBrZXlzcGFjZSBpbnRlcmZhY2UgZm9yIHZpcnR1YWwgdGFibGVzLiAKLVZpcnR1YWwgdGFibGVzIGFyZSBzcGVjaWZpYyB0byBlYWNoIG5vZGUuCi0KLVNvbWUgb2YgdGhlIGZlYXR1cmVzIG9mIHZpcnR1YWwgdGFibGVzIGFyZSB0aGUgYWJpbGl0eSB0bzoKLQotKiBleHBvc2UgbWV0cmljcyB0aHJvdWdoIENRTAotKiBleHBvc2UgWUFNTCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCi0KLVZpcnR1YWwga2V5c3BhY2VzIGFuZCB0YWJsZXMgYXJlIHF1aXRlIGRpZmZlcmVudCBmcm9tIHJlZ3VsYXIgdGFibGVzIGFuZCBrZXlzcGFjZXM6Ci0KLSogVmlydHVhbCB0YWJsZXMgYXJlIGNyZWF0ZWQgaW4gc3BlY2lhbCBrZXlzcGFjZXMgYW5kIG5vdCBqdXN0IGFueSBrZXlzcGFjZS4KLSogVmlydHVhbCB0YWJsZXMgYXJlIG1hbmFnZWQgYnkgQ2Fzc2FuZHJhLiBVc2VycyBjYW5ub3QgcnVuIERETCB0byBjcmVhdGUgbmV3IHZpcnR1YWwgdGFibGVzIG9yIERNTCB0byBtb2RpZnkgZXhpc3RpbmcgdmlydHVhbCB0YWJsZXMuCi0qIFZpcnR1YWwgdGFibGVzIGFyZSBjdXJyZW50bHkgcmVhZC1vbmx5LCBhbHRob3VnaCB0aGF0IG1heSBjaGFuZ2UgaW4gYSBsYXRlciB2ZXJzaW9uLgotKiBWaXJ0dWFsIHRhYmxlcyBhcmUgbG9jYWwgb25seSwgbm9uLWRpc3RyaWJ1dGVkLCBhbmQgdGh1cyBub3QgcmVwbGljYXRlZC4KLSogVmlydHVhbCB0YWJsZXMgaGF2ZSBubyBhc3NvY2lhdGVkIFNTVGFibGVzLgotKiBDb25zaXN0ZW5jeSBsZXZlbCBvZiB0aGUgcXVlcmllcyBzZW50IHRvIHZpcnR1YWwgdGFibGVzIGFyZSBpZ25vcmVkLgotKiBBbGwgZXhpc3RpbmcgdmlydHVhbCB0YWJsZXMgdXNlIGBMb2NhbFBhcnRpdGlvbmVyYC4gCi1TaW5jZSBhIHZpcnR1YWwgdGFibGUgaXMgbm90IHJlcGxpY2F0ZWQgdGhlIHBhcnRpdGlvbmVyIHNvcnRzIGluIG9yZGVyIG9mIHBhcnRpdGlvbiBrZXlzIGluc3RlYWQgb2YgYnkgdGhlaXIgaGFzaC4KLSogTWFraW5nIGFkdmFuY2VkIHF1ZXJpZXMgdXNpbmcgYEFMTE9XIEZJTFRFUklOR2AgYW5kIGFnZ3JlZ2F0aW9uIGZ1bmN0aW9ucyBjYW4gYmUgZXhlY3V0ZWQgaW4gdmlydHVhbCB0YWJsZXMsIGV2ZW4gdGhvdWdoIGluIG5vcm1hbCB0YWJsZXMgd2UgZG9udCByZWNvbW1lbmQgaXQuCi0KLT09IFZpcnR1YWwgS2V5c3BhY2VzCi0KLUFwYWNoZSBDYXNzYW5kcmEgNC4wIGhhcyBhZGRlZCB0d28gbmV3IGtleXNwYWNlcyBmb3IgdmlydHVhbCB0YWJsZXM6Ci0KLSogYHN5c3RlbV92aXJ0dWFsX3NjaGVtYWAgCi0qIGBzeXN0ZW1fdmlld3NgLiAKLQotVGhlIGBzeXN0ZW1fdmlydHVhbF9zY2hlbWFgIGtleXNwYWNlIGhhcyB0aHJlZSB0YWJsZXM6IGBrZXlzcGFjZXNgLAotYGNvbHVtbnNgIGFuZCBgdGFibGVzYCBmb3IgdGhlIHZpcnR1YWwga2V5c3BhY2UsIHRhYmxlLCBhbmQgY29sdW1uIGRlZmluaXRpb25zLCByZXNwZWN0aXZlbHkuCi1UaGVzZSB0YWJsZXMgY29udGFpbiBzY2hlbWEgaW5mb3JtYXRpb24gZm9yIHRoZSB2aXJ0dWFsIHRhYmxlcy4KLUl0IGlzIHVzZWQgYnkgQ2Fzc2FuZHJhIGludGVybmFsbHkgYW5kIGEgdXNlciBzaG91bGQgbm90IGFjY2VzcyBpdCBkaXJlY3RseS4KLQotVGhlIGBzeXN0ZW1fdmlld3NgIGtleXNwYWNlIGNvbnRhaW5zIHRoZSBhY3R1YWwgdmlydHVhbCB0YWJsZXMuCi0KLT09IFZpcnR1YWwgVGFibGUgTGltaXRhdGlvbnMKLQotQmVmb3JlIGRpc2NjdXNpbmcgdmlydHVhbCBrZXlzcGFjZXMgYW5kIHRhYmxlcywgbm90ZSB0aGF0IHZpcnR1YWwga2V5c3BhY2VzIGFuZCB0YWJsZXMgaGF2ZSBzb21lIGxpbWl0YXRpb25zLiAKLVRoZXNlIGxpbWl0YXRpb25zIGFyZSBzdWJqZWN0IHRvIGNoYW5nZS4KLVZpcnR1YWwga2V5c3BhY2VzIGNhbm5vdCBiZSBhbHRlcmVkIG9yIGRyb3BwZWQuIAotSW4gZmFjdCwgbm8gb3BlcmF0aW9ucyBjYW4gYmUgcGVyZm9ybWVkIGFnYWluc3QgdmlydHVhbCBrZXlzcGFjZXMuCi0KLVZpcnR1YWwgdGFibGVzIGNhbm5vdCBiZSBjcmVhdGVkIGluIHZpcnR1YWwga2V5c3BhY2VzLgotVmlydHVhbCB0YWJsZXMgY2Fubm90IGJlIGFsdGVyZWQsIGRyb3BwZWQsIG9yIHRydW5jYXRlZC4KLVNlY29uZGFyeSBpbmRleGVzLCB0eXBlcywgZnVuY3Rpb25zLCBhZ2dyZWdhdGVzLCBtYXRlcmlhbGl6ZWQgdmlld3MsIGFuZCB0cmlnZ2VycyBjYW5ub3QgYmUgY3JlYXRlZCBmb3IgdmlydHVhbCB0YWJsZXMuCi1FeHBpcmluZyB0aW1lLXRvLWxpdmUgKFRUTCkgY29sdW1ucyBjYW5ub3QgYmUgY3JlYXRlZC4KLVZpcnR1YWwgdGFibGVzIGRvIG5vdCBzdXBwb3J0IGNvbmRpdGlvbmFsIHVwZGF0ZXMgb3IgZGVsZXRlcy4KLUFnZ3JlZ2F0ZXMgbWF5IGJlIHJ1biBpbiBTRUxFQ1Qgc3RhdGVtZW50cy4KLQotQ29uZGl0aW9uYWwgYmF0Y2ggc3RhdGVtZW50cyBjYW5ub3QgaW5jbHVkZSBtdXRhdGlvbnMgZm9yIHZpcnR1YWwgdGFibGVzLCBub3IgY2FuIGEgdmlydHVhbCB0YWJsZSBzdGF0ZW1lbnQgYmUgaW5jbHVkZWQgaW4gYSBsb2dnZWQgYmF0Y2guCi1JbiBmYWN0LCBtdXRhdGlvbnMgZm9yIHZpcnR1YWwgYW5kIHJlZ3VsYXIgdGFibGVzIGNhbm5vdCBvY2N1ciBpbiB0aGUgc2FtZSBiYXRjaCB0YWJsZS4KLQotPT0gVmlydHVhbCBUYWJsZXMKLQotRWFjaCBvZiB0aGUgdmlydHVhbCB0YWJsZXMgaW4gdGhlIGBzeXN0ZW1fdmlld3NgIHZpcnR1YWwga2V5c3BhY2UgY29udGFpbiBkaWZmZXJlbnQgaW5mb3JtYXRpb24uCi0KLVRoZSBmb2xsb3dpbmcgdGFibGUgZGVzY3JpYmVzIHRoZSB2aXJ0dWFsIHRhYmxlczogCi0KLVt3aWR0aD0iOTglIixjb2xzPSIyNyUsNzMlIixdCi18PT09Ci18VmlydHVhbCBUYWJsZSB8RGVzY3JpcHRpb24KLQotfGNhY2hlcyB8RGlzcGxheXMgdGhlIGdlbmVyYWwgY2FjaGUgaW5mb3JtYXRpb24gaW5jbHVkaW5nIGNhY2hlIG5hbWUsIGNhcGFjaXR5X2J5dGVzLCBlbnRyeV9jb3VudCwgaGl0X2NvdW50LCBoaXRfcmF0aW8gZG91YmxlLAotcmVjZW50X2hpdF9yYXRlX3Blcl9zZWNvbmQsIHJlY2VudF9yZXF1ZXN0X3JhdGVfcGVyX3NlY29uZCwgcmVxdWVzdF9jb3VudCwgYW5kIHNpemVfYnl0ZXMuCi0KLXxjbGllbnRzIHxMaXN0cyBpbmZvcm1hdGlvbiBhYm91dCBhbGwgY29ubmVjdGVkIGNsaWVudHMuCi0KLXxjb29yZGluYXRvcl9yZWFkX2xhdGVuY3kgfFJlY29yZHMgY291bnRzLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBtYXgsIG1lZGlhbiwgYW5kIHBlcl9zZWNvbmQgZm9yIGNvb3JkaW5hdG9yIHJlYWRzLgotCi18Y29vcmRpbmF0b3Jfc2NhbiB8UmVjb3JkcyBjb3VudHMsIGtleXNwYWNlX25hbWUsIHRhYmxlX25hbWUsIG1heCwgbWVkaWFuLCBhbmQgcGVyX3NlY29uZCBmb3IgY29vcmRpbmF0b3Igc2NhbnMuCi0KLXxjb29yZGluYXRvcl93cml0ZV9sYXRlbmN5IHxSZWNvcmRzIGNvdW50cywga2V5c3BhY2VfbmFtZSwgdGFibGVfbmFtZSwgbWF4LCBtZWRpYW4sIGFuZCBwZXJfc2Vjb25kIGZvciBjb29yZGluYXRvciB3cml0ZXMuCi0KLXxkaXNrX3VzYWdlIHxSZWNvcmRzIGRpc2sgdXNhZ2UgaW5jbHVkaW5nIGRpc2tfc3BhY2UsIGtleXNwYWNlX25hbWUsIGFuZCB0YWJsZV9uYW1lLCBzb3J0ZWQgYnkgc3lzdGVtIGtleXNwYWNlcy4KLQotfGludGVybm9kZV9pbmJvdW5kIHxMaXN0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5ib3VuZCBpbnRlcm5vZGUgbWVzc2FnaW5nLgotCi18aW50ZXJub2RlX291dGJvdW5kIHxJbmZvcm1hdGlvbiBhYm91dCB0aGUgb3V0Ym91bmQgaW50ZXJub2RlIG1lc3NhZ2luZy4KLQotfGxvY2FsX3JlYWRfbGF0ZW5jeSB8UmVjb3JkcyBjb3VudHMsIGtleXNwYWNlX25hbWUsIHRhYmxlX25hbWUsIG1heCwgbWVkaWFuLCBhbmQgcGVyX3NlY29uZCBmb3IgbG9jYWwgcmVhZHMuCi0KLXxsb2NhbF9zY2FuIHxSZWNvcmRzIGNvdW50cywga2V5c3BhY2VfbmFtZSwgdGFibGVfbmFtZSwgbWF4LCBtZWRpYW4sIGFuZCBwZXJfc2Vjb25kIGZvciBsb2NhbCBzY2Fucy4KLQotfGxvY2FsX3dyaXRlX2xhdGVuY3kgfFJlY29yZHMgY291bnRzLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBtYXgsIG1lZGlhbiwgYW5kIHBlcl9zZWNvbmQgZm9yIGxvY2FsIHdyaXRlcy4KLQotfG1heF9wYXJ0aXRpb25fc2l6ZSB8QSB0YWJsZSBtZXRyaWMgZm9yIG1heGltdW0gcGFydGl0aW9uIHNpemUuCi0KLXxyb3dzX3Blcl9yZWFkIHxSZWNvcmRzIGNvdW50cywga2V5c3BhY2VfbmFtZSwgdGFibGVrX25hbWUsIG1heCwgYW5kIG1lZGlhbiBmb3Igcm93cyByZWFkLgotCi18c2V0dGluZ3MgfERpc3BsYXlzIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgaW4gY2Fzc2FuZHJhLnlhbWwuCi0KLXxzc3RhYmxlX3Rhc2tzIHxMaXN0cyBjdXJyZW50bHkgcnVubmluZyB0YXNrcyBhbmQgcHJvZ3Jlc3Mgb24gU1NUYWJsZXMsIGZvciBvcGVyYXRpb25zIGxpa2UgY29tcGFjdGlvbiBhbmQgdXBncmFkZS4KLQotfHN5c3RlbV9wcm9wZXJ0aWVzIHxEaXNwbGF5cyBlbnZpcm9ubWVudGFsIHN5c3RlbSBwcm9wZXJ0aWVzIHNldCBvbiB0aGUgbm9kZS4KLQotfHRocmVhZF9wb29scyB8TGlzdHMgbWV0cmljcyBmb3IgZWFjaCB0aHJlYWQgcG9vbC4KLQotfHRvbWJzdG9uZXNfcGVyX3JlYWQgfFJlY29yZHMgY291bnRzLCBrZXlzcGFjZV9uYW1lLCB0YWJsZWtfbmFtZSwgbWF4LCBhbmQgbWVkaWFuIGZvciB0b21ic3RvbmVzLgotfD09PQotCi1XZSBzaGFsbCBkaXNjdXNzIHNvbWUgb2YgdGhlIHZpcnR1YWwgdGFibGVzIGluIG1vcmUgZGV0YWlsIG5leHQuCi0KLT09PSBDbGllbnRzIFZpcnR1YWwgVGFibGUKLQotVGhlIGBjbGllbnRzYCB2aXJ0dWFsIHRhYmxlIGxpc3RzIGFsbCBhY3RpdmUgY29ubmVjdGlvbnMgKGNvbm5lY3RlZAotY2xpZW50cykgaW5jbHVkaW5nIHRoZWlyIGlwIGFkZHJlc3MsIHBvcnQsIGNsaWVudF9vcHRpb25zLCBjb25uZWN0aW9uIHN0YWdlLCBkcml2ZXIKLW5hbWUsIGRyaXZlciB2ZXJzaW9uLCBob3N0bmFtZSwgcHJvdG9jb2wgdmVyc2lvbiwgcmVxdWVzdCBjb3VudCwgc3NsCi1lbmFibGVkLCBzc2wgcHJvdG9jb2wgYW5kIHVzZXIgbmFtZToKLQotLi4uLgotY3Fsc2g+IEVYUEFORCBPTiA7Ci1Ob3cgRXhwYW5kZWQgb3V0cHV0IGlzIGVuYWJsZWQKLWNxbHNoPiBTRUxFQ1QgKiBGUk9NIHN5c3RlbV92aWV3cy5jbGllbnRzOwotCi1AIFJvdyAxCi0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBhZGRyZXNzICAgICAgICAgIHwgMTI3LjAuMC4xCi0gcG9ydCAgICAgICAgICAgICB8IDUwNjg3Ci0gY2xpZW50X29wdGlvbnMgICB8IHsnQ1FMX1ZFUlNJT04nOiAnMy40LjYnLCAnRFJJVkVSX05BTUUnOiAnRGF0YVN0YXggUHl0aG9uIERyaXZlcicsICdEUklWRVJfVkVSU0lPTic6ICczLjI1LjAnfQotIGNvbm5lY3Rpb25fc3RhZ2UgfCByZWFkeQotIGRyaXZlcl9uYW1lICAgICAgfCBEYXRhU3RheCBQeXRob24gRHJpdmVyCi0gZHJpdmVyX3ZlcnNpb24gICB8IDMuMjUuMAotIGhvc3RuYW1lICAgICAgICAgfCBsb2NhbGhvc3QKLSBwcm90b2NvbF92ZXJzaW9uIHwgNQotIHJlcXVlc3RfY291bnQgICAgfCAxNgotIHNzbF9jaXBoZXJfc3VpdGUgfCBudWxsCi0gc3NsX2VuYWJsZWQgICAgICB8IEZhbHNlCi0gc3NsX3Byb3RvY29sICAgICB8IG51bGwKLSB1c2VybmFtZSAgICAgICAgIHwgYW5vbnltb3VzCi0KLUAgUm93IDIKLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIGFkZHJlc3MgICAgICAgICAgfCAxMjcuMC4wLjEKLSBwb3J0ICAgICAgICAgICAgIHwgNTA2ODgKLSBjbGllbnRfb3B0aW9ucyAgIHwgeydDUUxfVkVSU0lPTic6ICczLjQuNicsICdEUklWRVJfTkFNRSc6ICdEYXRhU3RheCBQeXRob24gRHJpdmVyJywgJ0RSSVZFUl9WRVJTSU9OJzogJzMuMjUuMCd9Ci0gY29ubmVjdGlvbl9zdGFnZSB8IHJlYWR5Ci0gZHJpdmVyX25hbWUgICAgICB8IERhdGFTdGF4IFB5dGhvbiBEcml2ZXIKLSBkcml2ZXJfdmVyc2lvbiAgIHwgMy4yNS4wCi0gaG9zdG5hbWUgICAgICAgICB8IGxvY2FsaG9zdAotIHByb3RvY29sX3ZlcnNpb24gfCA1Ci0gcmVxdWVzdF9jb3VudCAgICB8IDQKLSBzc2xfY2lwaGVyX3N1aXRlIHwgbnVsbAotIHNzbF9lbmFibGVkICAgICAgfCBGYWxzZQotIHNzbF9wcm90b2NvbCAgICAgfCBudWxsCi0gdXNlcm5hbWUgICAgICAgICB8IGFub255bW91cwotCi1AIFJvdyAzCi0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBhZGRyZXNzICAgICAgICAgIHwgMTI3LjAuMC4xCi0gcG9ydCAgICAgICAgICAgICB8IDUwNzUzCi0gY2xpZW50X29wdGlvbnMgICB8IHsnQVBQTElDQVRJT05fTkFNRSc6ICdUZXN0QXBwJywgJ0FQUExJQ0FUSU9OX1ZFUlNJT04nOiAnMS4wLjAnLCAnQ0xJRU5UX0lEJzogJzU1YjNlZmJkLWM1NmItNDY5ZC04Y2NhLTAxNmI4NjBiMmYwMycsICdDUUxfVkVSU0lPTic6ICczLjAuMCcsICdEUklWRVJfTkFNRSc6ICdEYXRhU3RheCBKYXZhIGRyaXZlciBmb3IgQXBhY2hlIENhc3NhbmRyYShSKScsICdEUklWRVJfVkVSU0lPTic6ICc0LjEzLjAnfQotIGNvbm5lY3Rpb25fc3RhZ2UgfCByZWFkeQotIGRyaXZlcl9uYW1lICAgICAgfCBEYXRhU3RheCBKYXZhIGRyaXZlciBmb3IgQXBhY2hlIENhc3NhbmRyYShSKQotIGRyaXZlcl92ZXJzaW9uICAgfCA0LjEzLjAKLSBob3N0bmFtZSAgICAgICAgIHwgbG9jYWxob3N0Ci0gcHJvdG9jb2xfdmVyc2lvbiB8IDUKLSByZXF1ZXN0X2NvdW50ICAgIHwgMTgKLSBzc2xfY2lwaGVyX3N1aXRlIHwgbnVsbAotIHNzbF9lbmFibGVkICAgICAgfCBGYWxzZQotIHNzbF9wcm90b2NvbCAgICAgfCBudWxsCi0gdXNlcm5hbWUgICAgICAgICB8IGFub255bW91cwotCi1AIFJvdyA0Ci0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBhZGRyZXNzICAgICAgICAgIHwgMTI3LjAuMC4xCi0gcG9ydCAgICAgICAgICAgICB8IDUwNzU1Ci0gY2xpZW50X29wdGlvbnMgICB8IHsnQVBQTElDQVRJT05fTkFNRSc6ICdUZXN0QXBwJywgJ0FQUExJQ0FUSU9OX1ZFUlNJT04nOiAnMS4wLjAnLCAnQ0xJRU5UX0lEJzogJzU1YjNlZmJkLWM1NmItNDY5ZC04Y2NhLTAxNmI4NjBiMmYwMycsICdDUUxfVkVSU0lPTic6ICczLjAuMCcsICdEUklWRVJfTkFNRSc6ICdEYXRhU3RheCBKYXZhIGRyaXZlciBmb3IgQXBhY2hlIENhc3NhbmRyYShSKScsICdEUklWRVJfVkVSU0lPTic6ICc0LjEzLjAnfQotIGNvbm5lY3Rpb25fc3RhZ2UgfCByZWFkeQotIGRyaXZlcl9uYW1lICAgICAgfCBEYXRhU3RheCBKYXZhIGRyaXZlciBmb3IgQXBhY2hlIENhc3NhbmRyYShSKQotIGRyaXZlcl92ZXJzaW9uICAgfCA0LjEzLjAKLSBob3N0bmFtZSAgICAgICAgIHwgbG9jYWxob3N0Ci0gcHJvdG9jb2xfdmVyc2lvbiB8IDUKLSByZXF1ZXN0X2NvdW50ICAgIHwgNwotIHNzbF9jaXBoZXJfc3VpdGUgfCBudWxsCi0gc3NsX2VuYWJsZWQgICAgICB8IEZhbHNlCi0gc3NsX3Byb3RvY29sICAgICB8IG51bGwKLSB1c2VybmFtZSAgICAgICAgIHwgYW5vbnltb3VzCi0KLSg0IHJvd3MpCi0uLi4uCi0KLVNvbWUgZXhhbXBsZXMgb2YgaG93IGBjbGllbnRzYCBjYW4gYmUgdXNlZCBhcmU6Ci0KLSogVG8gZmluZCBhcHBsaWNhdGlvbnMgdXNpbmcgb2xkIGluY29tcGF0aWJsZSB2ZXJzaW9ucyBvZiBkcml2ZXJzIGJlZm9yZQotdXBncmFkaW5nIGFuZCB3aXRoIGBub2RldG9vbCBlbmFibGVvbGRwcm90b2NvbHZlcnNpb25zYCBhbmQKLWBub2RldG9vbCBkaXNhYmxlb2xkcHJvdG9jb2x2ZXJzaW9uc2AgZHVyaW5nIHVwZ3JhZGVzLgotKiBUbyBpZGVudGlmeSBjbGllbnRzIHNlbmRpbmcgdG9vIG1hbnkgcmVxdWVzdHMuCi0qIFRvIGZpbmQgaWYgU1NMIGlzIGVuYWJsZWQgZHVyaW5nIHRoZSBtaWdyYXRpb24gdG8gYW5kIGZyb20gc3NsLgotCi1UaGUgdmlydHVhbCB0YWJsZXMgbWF5IGJlIGRlc2NyaWJlZCB3aXRoIGBERVNDUklCRWAgc3RhdGVtZW50LiBUaGUgRERMCi1saXN0ZWQgaG93ZXZlciBjYW5ub3QgYmUgcnVuIHRvIGNyZWF0ZSBhIHZpcnR1YWwgdGFibGUuIEFzIGFuIGV4YW1wbGUKLWRlc2NyaWJlIHRoZSBgc3lzdGVtX3ZpZXdzLmNsaWVudHNgIHZpcnR1YWwgdGFibGU6Ci0KLS4uLi4KLWNxbHNoPiBERVNDUklCRSBUQUJMRSBzeXN0ZW1fdmlld3MuY2xpZW50czsKLQotLyoKLVdhcm5pbmc6IFRhYmxlIHN5c3RlbV92aWV3cy5jbGllbnRzIGlzIGEgdmlydHVhbCB0YWJsZSBhbmQgY2Fubm90IGJlIHJlY3JlYXRlZCB3aXRoIENRTC4KLVN0cnVjdHVyZSwgZm9yIHJlZmVyZW5jZToKLVZJUlRVQUwgVEFCTEUgc3lzdGVtX3ZpZXdzLmNsaWVudHMgKAotICBhZGRyZXNzIGluZXQsCi0gIHBvcnQgaW50LAotICBjbGllbnRfb3B0aW9ucyBmcm96ZW48bWFwPHRleHQsIHRleHQ+PiwKLSAgY29ubmVjdGlvbl9zdGFnZSB0ZXh0LAotICBkcml2ZXJfbmFtZSB0ZXh0LAotICBkcml2ZXJfdmVyc2lvbiB0ZXh0LAotICBob3N0bmFtZSB0ZXh0LAotICBwcm90b2NvbF92ZXJzaW9uIGludCwKLSAgcmVxdWVzdF9jb3VudCBiaWdpbnQsCi0gIHNzbF9jaXBoZXJfc3VpdGUgdGV4dCwKLSAgc3NsX2VuYWJsZWQgYm9vbGVhbiwKLSAgc3NsX3Byb3RvY29sIHRleHQsCi0gIHVzZXJuYW1lIHRleHQsCi0gICAgUFJJTUFSWSBLRVkgKGFkZHJlc3MsIHBvcnQpCi0pIFdJVEggQ0xVU1RFUklORyBPUkRFUiBCWSAocG9ydCBBU0MpCi0gICAgQU5EIGNvbW1lbnQgPSAnY3VycmVudGx5IGNvbm5lY3RlZCBjbGllbnRzJzsKLSovCi0uLi4uCi0KLT09PSBDYWNoZXMgVmlydHVhbCBUYWJsZQotCi1UaGUgYGNhY2hlc2AgdmlydHVhbCB0YWJsZSBsaXN0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2FjaGVzLiBUaGUgZm91cgotY2FjaGVzIHByZXNlbnRseSBjcmVhdGVkIGFyZSBjaHVua3MsIGNvdW50ZXJzLCBrZXlzIGFuZCByb3dzLiBBIHF1ZXJ5IG9uCi10aGUgYGNhY2hlc2AgdmlydHVhbCB0YWJsZSByZXR1cm5zIHRoZSBmb2xsb3dpbmcgZGV0YWlsczoKLQotLi4uLgotY3Fsc2g6c3lzdGVtX3ZpZXdzPiBTRUxFQ1QgKiBGUk9NIHN5c3RlbV92aWV3cy5jYWNoZXM7Ci1uYW1lICAgICB8IGNhcGFjaXR5X2J5dGVzIHwgZW50cnlfY291bnQgfCBoaXRfY291bnQgfCBoaXRfcmF0aW8gfCByZWNlbnRfaGl0X3JhdGVfcGVyX3NlY29uZCB8IHJlY2VudF9yZXF1ZXN0X3JhdGVfcGVyX3NlY29uZCB8IHJlcXVlc3RfY291bnQgfCBzaXplX2J5dGVzCi0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLQotICBjaHVua3MgfCAgICAgIDIyOTYzODE0NCB8ICAgICAgICAgIDI5IHwgICAgICAgMTY2IHwgICAgICAwLjgzIHwgICAgICAgICAgICAgICAgICAgICAgICAgIDUgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYgfCAgICAgICAgICAgMjAwIHwgICAgIDQ3NTEzNgotY291bnRlcnMgfCAgICAgICAyNjIxNDQwMCB8ICAgICAgICAgICAwIHwgICAgICAgICAwIHwgICAgICAgTmFOIHwgICAgICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgMAotICAgIGtleXMgfCAgICAgICA1MjQyODgwMCB8ICAgICAgICAgIDE0IHwgICAgICAgMTI0IHwgIDAuODczMjM5IHwgICAgICAgICAgICAgICAgICAgICAgICAgIDQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgfCAgICAgICAgICAgMTQyIHwgICAgICAgMTI0OAotICAgIHJvd3MgfCAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAwIHwgICAgICAgICAwIHwgICAgICAgTmFOIHwgICAgICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgMAotCi0oNCByb3dzKQotLi4uLgotCi09PT0gU2V0dGluZ3MgVmlydHVhbCBUYWJsZQotCi1UaGUgYHNldHRpbmdzYCB0YWJsZSBpcyByYXRoZXIgdXNlZnVsIGFuZCBsaXN0cyBhbGwgdGhlIGN1cnJlbnQKLWNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZnJvbSB0aGUgYGNhc3NhbmRyYS55YW1sYC4gVGhlIGVuY3J5cHRpb24gb3B0aW9ucwotYXJlIG92ZXJyaWRkZW4gdG8gaGlkZSB0aGUgc2Vuc2l0aXZlIHRydXN0c3RvcmUgaW5mb3JtYXRpb24gb3IKLXBhc3N3b3Jkcy4gVGhlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgaG93ZXZlciBjYW5ub3QgYmUgc2V0IHVzaW5nIERNTCBvbgotdGhlIHZpcnR1YWwgdGFibGUgcHJlc2VudGx5OiA6Ci0KLS4uLi4KLWNxbHNoOnN5c3RlbV92aWV3cz4gU0VMRUNUICogRlJPTSBzeXN0ZW1fdmlld3Muc2V0dGluZ3M7Ci0KLW5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIGFsbG9jYXRlX3Rva2Vuc19mb3Jfa2V5c3BhY2UgICAgICAgfCBudWxsCi0gIGF1ZGl0X2xvZ2dpbmdfb3B0aW9uc19lbmFibGVkICAgICAgfCBmYWxzZQotICBhdXRvX3NuYXBzaG90ICAgICAgICAgICAgICAgICAgICAgIHwgdHJ1ZQotICBhdXRvbWF0aWNfc3N0YWJsZV91cGdyYWRlICAgICAgICAgIHwgZmFsc2UKLSAgY2x1c3Rlcl9uYW1lICAgICAgICAgICAgICAgICAgICAgICB8IFRlc3QgQ2x1c3RlcgotICBlbmFibGVfdHJhbnNpZW50X3JlcGxpY2F0aW9uICAgICAgIHwgZmFsc2UKLSAgaGludGVkX2hhbmRvZmZfZW5hYmxlZCAgICAgICAgICAgICB8IHRydWUKLSAgaGludHNfZGlyZWN0b3J5ICAgICAgICAgICAgICAgICAgICB8IC9ob21lL2VjMi11c2VyL2Nhc3NhbmRyYS9kYXRhL2hpbnRzCi0gIGluY3JlbWVudGFsX2JhY2t1cHMgICAgICAgICAgICAgICAgfCBmYWxzZQotICBpbml0aWFsX3Rva2VuICAgICAgICAgICAgICAgICAgICAgIHwgbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgotICBycGNfYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgIHwgbG9jYWxob3N0Ci0gIHNzbF9zdG9yYWdlX3BvcnQgICAgICAgICAgICAgICAgICAgfCA3MDAxCi0gIHN0YXJ0X25hdGl2ZV90cmFuc3BvcnQgICAgICAgICAgICAgfCB0cnVlCi0gIHN0b3JhZ2VfcG9ydCAgICAgICAgICAgICAgICAgICAgICAgfCA3MDAwCi0gIHN0cmVhbV9lbnRpcmVfc3N0YWJsZXMgICAgICAgICAgICAgfCB0cnVlCi0gICgyMjQgcm93cykKLS4uLi4KLQotVGhlIGBzZXR0aW5nc2AgdGFibGUgY2FuIGJlIHJlYWxseSB1c2VmdWwgaWYgeWFtbCBmaWxlIGhhcyBiZWVuIGNoYW5nZWQKLXNpbmNlIHN0YXJ0dXAgYW5kIGRvbnQga25vdyBydW5uaW5nIGNvbmZpZ3VyYXRpb24sIG9yIHRvIGZpbmQgaWYgdGhleQotaGF2ZSBiZWVuIG1vZGlmaWVkIHZpYSBqbXgvbm9kZXRvb2wgb3IgdmlydHVhbCB0YWJsZXMuCi0KLT09PSBUaHJlYWQgUG9vbHMgVmlydHVhbCBUYWJsZQotCi1UaGUgYHRocmVhZF9wb29sc2AgdGFibGUgbGlzdHMgaW5mb3JtYXRpb24gYWJvdXQgYWxsIHRocmVhZCBwb29scy4KLVRocmVhZCBwb29sIGluZm9ybWF0aW9uIGluY2x1ZGVzIGFjdGl2ZSB0YXNrcywgYWN0aXZlIHRhc2tzIGxpbWl0LAotYmxvY2tlZCB0YXNrcywgYmxvY2tlZCB0YXNrcyBhbGwgdGltZSwgY29tcGxldGVkIHRhc2tzLCBhbmQgcGVuZGluZwotdGFza3MuIEEgcXVlcnkgb24gdGhlIGB0aHJlYWRfcG9vbHNgIHJldHVybnMgZm9sbG93aW5nIGRldGFpbHM6Ci0KLS4uLi4KLWNxbHNoOnN5c3RlbV92aWV3cz4gc2VsZWN0ICogZnJvbSBzeXN0ZW1fdmlld3MudGhyZWFkX3Bvb2xzOwotCi1uYW1lICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWN0aXZlX3Rhc2tzIHwgYWN0aXZlX3Rhc2tzX2xpbWl0IHwgYmxvY2tlZF90YXNrcyB8IGJsb2NrZWRfdGFza3NfYWxsX3RpbWUgfCBjb21wbGV0ZWRfdGFza3MgfCBwZW5kaW5nX3Rhc2tzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgIEFudGlFbnRyb3B5U3RhZ2UgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgQ2FjaGVDbGVhbnVwRXhlY3V0b3IgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICBDb21wYWN0aW9uRXhlY3V0b3IgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDIgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDg4MSB8ICAgICAgICAgICAgIDAKLSAgICAgICAgQ291bnRlck11dGF0aW9uU3RhZ2UgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgMzIgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICAgICAgICAgR29zc2lwU3RhZ2UgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICAgICBIaW50c0Rpc3BhdGNoZXIgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDIgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICBJbnRlcm5hbFJlc3BvbnNlU3RhZ2UgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDIgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgIE1lbXRhYmxlRmx1c2hXcml0ZXIgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDIgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICAgTWVtdGFibGVQb3N0Rmx1c2ggfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMiB8ICAgICAgICAgICAgIDAKLSAgICAgICBNZW10YWJsZVJlY2xhaW1NZW1vcnkgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICAgICAgTWlncmF0aW9uU3RhZ2UgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICAgICAgICAgICBNaXNjU3RhZ2UgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICAgICAgIE11dGF0aW9uU3RhZ2UgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgMzIgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgIE5hdGl2ZS1UcmFuc3BvcnQtUmVxdWVzdHMgfCAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAgICAxMjggfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDEzMCB8ICAgICAgICAgICAgIDAKLSAgICAgIFBlbmRpbmdSYW5nZUNhbGN1bGF0b3IgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAKLVBlckRpc2tNZW10YWJsZUZsdXNoV3JpdGVyXzAgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDIgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICAgICAgICAgICBSZWFkU3RhZ2UgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgMzIgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAxMyB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICAgICAgICAgUmVwYWlyLVRhc2sgfCAgICAgICAgICAgIDAgfCAgICAgICAgIDIxNDc0ODM2NDcgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgUmVxdWVzdFJlc3BvbnNlU3RhZ2UgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDIgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICAgICAgICAgICAgIFNhbXBsZXIgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICBTZWNvbmRhcnlJbmRleE1hbmFnZW1lbnQgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICBWYWxpZGF0aW9uRXhlY3V0b3IgfCAgICAgICAgICAgIDAgfCAgICAgICAgIDIxNDc0ODM2NDcgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICAgVmlld0J1aWxkRXhlY3V0b3IgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICAgVmlld011dGF0aW9uU3RhZ2UgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgMzIgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLS4uLi4KLQotKDI0IHJvd3MpCi0KLT09PSBJbnRlcm5vZGUgSW5ib3VuZCBNZXNzYWdpbmcgVmlydHVhbCBUYWJsZQotCi1UaGUgYGludGVybm9kZV9pbmJvdW5kYCB2aXJ0dWFsIHRhYmxlIGlzIGZvciB0aGUgaW50ZXJub2RlIGluYm91bmQKLW1lc3NhZ2luZy4gSW5pdGlhbGx5IG5vIGludGVybm9kZSBpbmJvdW5kIG1lc3NhZ2luZyBtYXkgZ2V0IGxpc3RlZC4gSW4KLWFkZGl0aW9uIHRvIHRoZSBhZGRyZXNzLCBwb3J0LCBkYXRhY2VudGVyIGFuZCByYWNrIGluZm9ybWF0aW9uIGluY2x1ZGVzCi1jb3JydXB0IGZyYW1lcyByZWNvdmVyZWQsIGNvcnJ1cHQgZnJhbWVzIHVucmVjb3ZlcmVkLCBlcnJvciBieXRlcywgZXJyb3IKLWNvdW50LCBleHBpcmVkIGJ5dGVzLCBleHBpcmVkIGNvdW50LCBwcm9jZXNzZWQgYnl0ZXMsIHByb2Nlc3NlZCBjb3VudCwKLXJlY2VpdmVkIGJ5dGVzLCByZWNlaXZlZCBjb3VudCwgc2NoZWR1bGVkIGJ5dGVzLCBzY2hlZHVsZWQgY291bnQsCi10aHJvdHRsZWQgY291bnQsIHRocm90dGxlZCBuYW5vcywgdXNpbmcgYnl0ZXMsIHVzaW5nIHJlc2VydmUgYnl0ZXMuIEEKLXF1ZXJ5IG9uIHRoZSBgaW50ZXJub2RlX2luYm91bmRgIHJldHVybnMgZm9sbG93aW5nIGRldGFpbHM6Ci0KLS4uLi4KLWNxbHNoOnN5c3RlbV92aWV3cz4gU0VMRUNUICogRlJPTSBzeXN0ZW1fdmlld3MuaW50ZXJub2RlX2luYm91bmQ7Ci1hZGRyZXNzIHwgcG9ydCB8IGRjIHwgcmFjayB8IGNvcnJ1cHRfZnJhbWVzX3JlY292ZXJlZCB8IGNvcnJ1cHRfZnJhbWVzX3VucmVjb3ZlcmVkIHwKLWVycm9yX2J5dGVzIHwgZXJyb3JfY291bnQgfCBleHBpcmVkX2J5dGVzIHwgZXhwaXJlZF9jb3VudCB8IHByb2Nlc3NlZF9ieXRlcyB8Ci1wcm9jZXNzZWRfY291bnQgfCByZWNlaXZlZF9ieXRlcyB8IHJlY2VpdmVkX2NvdW50IHwgc2NoZWR1bGVkX2J5dGVzIHwgc2NoZWR1bGVkX2NvdW50IHwgdGhyb3R0bGVkX2NvdW50IHwgdGhyb3R0bGVkX25hbm9zIHwgdXNpbmdfYnl0ZXMgfCB1c2luZ19yZXNlcnZlX2J5dGVzCi0tLS0tLS0tLS0rLS0tLS0tKy0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLQotLS0tLS0tLS0tLQotKDAgcm93cykKLS4uLi4KLQotPT09IFNTVGFibGVzIFRhc2tzIFZpcnR1YWwgVGFibGUKLQotVGhlIGBzc3RhYmxlX3Rhc2tzYCBjb3VsZCBiZSB1c2VkIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCBydW5uaW5nCi10YXNrcy4gSXQgbGlzdHMgZm9sbG93aW5nIGNvbHVtbnM6Ci0KLS4uLi4KLWNxbHNoOnN5c3RlbV92aWV3cz4gU0VMRUNUICogRlJPTSBzc3RhYmxlX3Rhc2tzOwota2V5c3BhY2VfbmFtZSB8IHRhYmxlX25hbWUgfCB0YXNrX2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBraW5kICAgICAgIHwgcHJvZ3Jlc3MgfCB0b3RhbCAgICB8IHVuaXQKLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tCi0gICAgICAgYmFzaWMgfCAgICAgIHdpZGUyIHwgYzM5MDk3NDAtY2RmNy0xMWU5LWE4ZWQtMGYwM2RlMmQ5YWUxIHwgY29tcGFjdGlvbiB8IDYwNDE4NzYxIHwgNzA4ODIxMTAgfCBieXRlcwotICAgICAgIGJhc2ljIHwgICAgICB3aWRlMiB8IGM3NTU2NzcwLWNkZjctMTFlOS1hOGVkLTBmMDNkZTJkOWFlMSB8IGNvbXBhY3Rpb24gfCAgMjk5NTYyMyB8IDQwMzE0Njc5IHwgYnl0ZXMKLS4uLi4KLQotQXMgYW5vdGhlciBleGFtcGxlLCB0byBmaW5kIGhvdyBtdWNoIHRpbWUgaXMgcmVtYWluaW5nIGZvciBTU1RhYmxlCi10YXNrcywgdXNlIHRoZSBmb2xsb3dpbmcgcXVlcnk6Ci0KLS4uLi4KLVNFTEVDVCB0b3RhbCAtIHByb2dyZXNzIEFTIHJlbWFpbmluZwotRlJPTSBzeXN0ZW1fdmlld3Muc3N0YWJsZV90YXNrczsKLS4uLi4KLQotPT09IE90aGVyIFZpcnR1YWwgVGFibGVzCi0KLVNvbWUgZXhhbXBsZXMgb2YgdXNpbmcgb3RoZXIgdmlydHVhbCB0YWJsZXMgYXJlIGFzIGZvbGxvd3MuCi0KLUZpbmQgdGFibGVzIHdpdGggbW9zdCBkaXNrIHVzYWdlOgotCi0uLi4uCi1jcWxzaD4gU0VMRUNUICogRlJPTSBkaXNrX3VzYWdlIFdIRVJFIG1lYmlieXRlcyA+IDEgQUxMT1cgRklMVEVSSU5HOwotCi1rZXlzcGFjZV9uYW1lIHwgdGFibGVfbmFtZSB8IG1lYmlieXRlcwotLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLQotICAga2V5c3BhY2UxIHwgIHN0YW5kYXJkMSB8ICAgICAgIDI4OAotICB0bHBfc3RyZXNzIHwgICBrZXl2YWx1ZSB8ICAgICAgMzIxMQotLi4uLgotCi1GaW5kIHF1ZXJpZXMgb24gdGFibGUvcyB3aXRoIGdyZWF0ZXN0IHJlYWQgbGF0ZW5jeToKLQotLi4uLgotY3Fsc2g+IFNFTEVDVCAqIEZST00gIGxvY2FsX3JlYWRfbGF0ZW5jeSBXSEVSRSBwZXJfc2Vjb25kID4gMSBBTExPVyBGSUxURVJJTkc7Ci0KLWtleXNwYWNlX25hbWUgfCB0YWJsZV9uYW1lIHwgcDUwdGhfbXMgfCBwOTl0aF9tcyB8IGNvdW50ICAgIHwgbWF4X21zICB8IHBlcl9zZWNvbmQKLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLQotICB0bHBfc3RyZXNzIHwgICBrZXl2YWx1ZSB8ICAgIDAuMDQzIHwgICAgMC4xNTIgfCA0OTc4NTE1OCB8IDE4Ni41NjMgfCAgMTE0MTguMzU2Ci0uLi4uCi0KLQotPT0gRXhhbXBsZQotCi1bYXJhYmljLCBzdGFydD0xXQotLiBUbyBsaXN0IHRoZSBrZXlzcGFjZXMsIGVudGVyIGBgY3Fsc2hgYCBhbmQgcnVuIHRoZSBDUUwgY29tbWFuZCBgYERFU0NSSUJFIEtFWVNQQUNFU2BgOgotCi1bc291cmNlLCBjcWxdCi0tLS0tCi1jcWxzaD4gREVTQyBLRVlTUEFDRVM7Ci1zeXN0ZW1fc2NoZW1hICBzeXN0ZW0gICAgICAgICAgc3lzdGVtX2Rpc3RyaWJ1dGVkICBzeXN0ZW1fdmlydHVhbF9zY2hlbWEKLXN5c3RlbV9hdXRoICAgIHN5c3RlbV90cmFjZXMgICBzeXN0ZW1fdmlld3MKLS0tLS0KLQotW2FyYWJpYywgc3RhcnQ9Ml0KLS4gVG8gdmlldyB0aGUgdmlydHVhbCB0YWJsZSBzY2hlbWEsIHJ1biB0aGUgQ1FMIGNvbW1hbmRzIGBgVVNFIHN5c3RlbV92aXJ0dWFsX3NjaGVtYWBgIGFuZCBgYFNFTEVDVCAqIEZST00gdGFibGVzYGA6Ci0KLVtzb3VyY2UsIGNxbF0KLS0tLS0KLWNxbHNoPiBVU0Ugc3lzdGVtX3ZpcnR1YWxfc2NoZW1hOwotY3Fsc2g+IFNFTEVDVCAqIEZST00gdGFibGVzOwotLS0tLQotIAotcmVzdWx0cyBpbjoKLQotW3NvdXJjZSwgY3FsXQotLS0tLQotIGtleXNwYWNlX25hbWUgICAgICAgICB8IHRhYmxlX25hbWUgICAgICAgICAgICAgICAgfCBjb21tZW50Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgICAgICAgICAgICAgY2FjaGVzIHwgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW0gY2FjaGVzCi0gICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgICAgICAgICAgICAgY2xpZW50cyB8ICAgICAgICAgIGN1cnJlbnRseSBjb25uZWN0ZWQgY2xpZW50cwotICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICBjb29yZGluYXRvcl9yZWFkX2xhdGVuY3kgfAotICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICBjb29yZGluYXRvcl9zY2FuX2xhdGVuY3kgfAotICAgICAgICAgIHN5c3RlbV92aWV3cyB8IGNvb3JkaW5hdG9yX3dyaXRlX2xhdGVuY3kgfAotICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICAgICAgICAgIGRpc2tfdXNhZ2UgfAotICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICAgaW50ZXJub2RlX2luYm91bmQgfAotICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICBpbnRlcm5vZGVfb3V0Ym91bmQgfAotICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICBsb2NhbF9yZWFkX2xhdGVuY3kgfAotICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICBsb2NhbF9zY2FuX2xhdGVuY3kgfAotICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgIGxvY2FsX3dyaXRlX2xhdGVuY3kgfAotICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICBtYXhfcGFydGl0aW9uX3NpemUgfAotICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICAgICAgIHJvd3NfcGVyX3JlYWQgfAotICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICAgICAgICAgICAgc2V0dGluZ3MgfCAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgc2V0dGluZ3MKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgICAgICBzc3RhYmxlX3Rhc2tzIHwgICAgICAgICAgICAgICAgY3VycmVudCBzc3RhYmxlIHRhc2tzCi0gICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgICBzeXN0ZW1fcHJvcGVydGllcyB8IENhc3NhbmRyYSByZWxldmFudCBzeXN0ZW0gcHJvcGVydGllcwotICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICAgICAgICB0aHJlYWRfcG9vbHMgfAotICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgIHRvbWJzdG9uZXNfcGVyX3JlYWQgfAotIHN5c3RlbV92aXJ0dWFsX3NjaGVtYSB8ICAgICAgICAgICAgICAgICAgIGNvbHVtbnMgfCAgICAgICAgICAgdmlydHVhbCBjb2x1bW4gZGVmaW5pdGlvbnMKLSBzeXN0ZW1fdmlydHVhbF9zY2hlbWEgfCAgICAgICAgICAgICAgICAga2V5c3BhY2VzIHwgICAgICAgICB2aXJ0dWFsIGtleXNwYWNlIGRlZmluaXRpb25zCi0gc3lzdGVtX3ZpcnR1YWxfc2NoZW1hIHwgICAgICAgICAgICAgICAgICAgIHRhYmxlcyB8ICAgICAgICAgICAgdmlydHVhbCB0YWJsZSBkZWZpbml0aW9ucwotCi0oMjEgcm93cykKLS0tLS0KLQotW2FyYWJpYywgc3RhcnQ9M10KLS4gVG8gdmlldyB0aGUgdmlydHVhbCB0YWJsZXMsIHJ1biB0aGUgQ1FMIGNvbW1hbmRzIGBgVVNFIHN5c3RlbV92aWV3YGAgYW5kIGBgREVTQ1JJQkUgdGFibGVzYGA6Ci0KLVtzb3VyY2UsIGNxbF0KLS0tLS0KLWNxbHNoPiBVU0Ugc3lzdGVtX3ZpZXc7OwotY3Fsc2g+IERFU0NSSUJFIHRhYmxlczsKLS0tLS0KLQotcmVzdWx0cyBpbjoKLQotW3NvdXJjZSwgY3FsXQotLS0tLQotc3N0YWJsZV90YXNrcyAgICAgICBjbGllbnRzICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdG9yX3dyaXRlX2xhdGVuY3kKLWRpc2tfdXNhZ2UgICAgICAgICAgbG9jYWxfd3JpdGVfbGF0ZW5jeSAgICAgICB0b21ic3RvbmVzX3Blcl9yZWFkCi10aHJlYWRfcG9vbHMgICAgICAgIGludGVybm9kZV9vdXRib3VuZCAgICAgICAgc2V0dGluZ3MKLWxvY2FsX3NjYW5fbGF0ZW5jeSAgY29vcmRpbmF0b3Jfc2Nhbl9sYXRlbmN5ICBzeXN0ZW1fcHJvcGVydGllcwotaW50ZXJub2RlX2luYm91bmQgICBjb29yZGluYXRvcl9yZWFkX2xhdGVuY3kgIG1heF9wYXJ0aXRpb25fc2l6ZQotbG9jYWxfcmVhZF9sYXRlbmN5ICByb3dzX3Blcl9yZWFkICAgICAgICAgICAgIGNhY2hlcwotLS0tLQotCi1bYXJhYmljLCBzdGFydD00XQotLiBUbyBsb29rIGF0IGFueSB0YWJsZSBkYXRhLCBydW4gdGhlIENRTCBjb21tYW5kIGBgU0VMRUNUYGA6Ci0KLVtzb3VyY2UsIGNxbF0KLS0tLS0KLWNxbHNoPiBVU0Ugc3lzdGVtX3ZpZXc7OwotY3Fsc2g+IFNFTEVDVCAqIEZST00gY2xpZW50cyBMSU1JVCAyOwotLS0tLQotIHJlc3VsdHMgaW46Ci0KLVtzb3VyY2UsIGNxbF0KLS0tLS0KLSBhZGRyZXNzICAgfCBwb3J0ICB8IGNvbm5lY3Rpb25fc3RhZ2UgfCBkcml2ZXJfbmFtZSAgICAgICAgICAgIHwgZHJpdmVyX3ZlcnNpb24gfCBob3N0bmFtZSAgfCBwcm90b2NvbF92ZXJzaW9uIHwgcmVxdWVzdF9jb3VudCB8IHNzbF9jaXBoZXJfc3VpdGUgfCBzc2xfZW5hYmxlZCB8IHNzbF9wcm90b2NvbCB8IHVzZXJuYW1lCi0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tCi0gMTI3LjAuMC4xIHwgMzczMDggfCAgICAgICAgICAgIHJlYWR5IHwgRGF0YVN0YXggUHl0aG9uIERyaXZlciB8ICAgMy4yMS4wLnBvc3QwIHwgbG9jYWxob3N0IHwgICAgICAgICAgICAgICAgNCB8ICAgICAgICAgICAgMTcgfCAgICAgICAgICAgICBudWxsIHwgICAgICAgRmFsc2UgfCAgICAgICAgIG51bGwgfCBhbm9ueW1vdXMKLSAxMjcuMC4wLjEgfCAzNzMxMCB8ICAgICAgICAgICAgcmVhZHkgfCBEYXRhU3RheCBQeXRob24gRHJpdmVyIHwgICAzLjIxLjAucG9zdDAgfCBsb2NhbGhvc3QgfCAgICAgICAgICAgICAgICA0IHwgICAgICAgICAgICAgOCB8ICAgICAgICAgICAgIG51bGwgfCAgICAgICBGYWxzZSB8ICAgICAgICAgbnVsbCB8IGFub255bW91cwotCi0oMiByb3dzKQotLS0tLQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL292ZXJ2aWV3L2ZhcS9pbmRleC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL292ZXJ2aWV3L2ZhcS9pbmRleC5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NDVlMTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL292ZXJ2aWV3L2ZhcS9pbmRleC5hZG9jCkBAIC0wLDAgKzEsMjc1IEBACis9IEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zCisKK1tbd2h5LWNhbnQtbGlzdC1hbGxdXQorPT0gV2h5IGNhbid0IEkgc2V0IGBsaXN0ZW5fYWRkcmVzc2AgdG8gbGlzdGVuIG9uIDAuMC4wLjAgKGFsbCBteSBhZGRyZXNzZXMpPworCitDYXNzYW5kcmEgaXMgYSBnb3NzaXAtYmFzZWQgZGlzdHJpYnV0ZWQgc3lzdGVtIGFuZCBgbGlzdGVuX2FkZHJlc3NgIGlzCit0aGUgYWRkcmVzcyBhIG5vZGUgdGVsbHMgb3RoZXIgbm9kZXMgdG8gcmVhY2ggaXQgYXQuIFRlbGxpbmcgb3RoZXIgbm9kZXMKKyJjb250YWN0IG1lIG9uIGFueSBvZiBteSBhZGRyZXNzZXMiIGlzIGEgYmFkIGlkZWE7IGlmIGRpZmZlcmVudCBub2RlcyBpbgordGhlIGNsdXN0ZXIgcGljayBkaWZmZXJlbnQgYWRkcmVzc2VzIGZvciB5b3UsIEJhZCBUaGluZ3MgaGFwcGVuLgorCitJZiB5b3UgZG9uJ3Qgd2FudCB0byBtYW51YWxseSBzcGVjaWZ5IGFuIElQIHRvIGBsaXN0ZW5fYWRkcmVzc2AgZm9yIGVhY2gKK25vZGUgaW4geW91ciBjbHVzdGVyICh1bmRlcnN0YW5kYWJsZSEpLCBsZWF2ZSBpdCBibGFuayBhbmQgQ2Fzc2FuZHJhCit3aWxsIHVzZSBgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KClgIHRvIHBpY2sgYW4gYWRkcmVzcy4gVGhlbiBpdCdzIHVwCit0byB5b3Ugb3IgeW91ciBvcHMgdGVhbSB0byBtYWtlIHRoaW5ncyByZXNvbHZlIGNvcnJlY3RseSAoYC9ldGMvaG9zdHMvYCwKK2RucywgZXRjKS4KKworT25lIGV4Y2VwdGlvbiB0byB0aGlzIHByb2Nlc3MgaXMgSk1YLCB3aGljaCBieSBkZWZhdWx0IGJpbmRzIHRvIDAuMC4wLjAKKyhKYXZhIGJ1ZyA2NDI1NzY5KS4KKworU2VlIGAyNTZgIGFuZCBgNDNgIGZvciBtb3JlIGdvcnkgZGV0YWlscy4KKworW1t3aGF0LXBvcnRzXV0KKz09IFdoYXQgcG9ydHMgZG9lcyBDYXNzYW5kcmEgdXNlPworCitCeSBkZWZhdWx0LCBDYXNzYW5kcmEgdXNlcyA3MDAwIGZvciBjbHVzdGVyIGNvbW11bmljYXRpb24gKDcwMDEgaWYgU1NMCitpcyBlbmFibGVkKSwgOTA0MiBmb3IgbmF0aXZlIHByb3RvY29sIGNsaWVudHMsIGFuZCA3MTk5IGZvciBKTVguIFRoZQoraW50ZXJub2RlIGNvbW11bmljYXRpb24gYW5kIG5hdGl2ZSBwcm90b2NvbCBwb3J0cyBhcmUgY29uZmlndXJhYmxlIGluCit0aGUgYGNhc3NhbmRyYS15YW1sYC4gVGhlIEpNWCBwb3J0IGlzIGNvbmZpZ3VyYWJsZSBpbiBgY2Fzc2FuZHJhLWVudi5zaGAKKyh0aHJvdWdoIEpWTSBvcHRpb25zKS4gQWxsIHBvcnRzIGFyZSBUQ1AuCisKK1tbd2hhdC1oYXBwZW5zLW9uLWpvaW5zXV0KKz09IFdoYXQgaGFwcGVucyB0byBleGlzdGluZyBkYXRhIGluIG15IGNsdXN0ZXIgd2hlbiBJIGFkZCBuZXcgbm9kZXM/CisKK1doZW4gYSBuZXcgbm9kZXMgam9pbnMgYSBjbHVzdGVyLCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgY29udGFjdCB0aGUKK290aGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyIGFuZCBjb3B5IHRoZSByaWdodCBkYXRhIHRvIGl0c2VsZi4gU2VlCitgdG9wb2xvZ3ktY2hhbmdlc2AuCisKK1tbYXN5bmNoLWRlbGV0ZXNdXQorPT0gSSBkZWxldGUgZGF0YSBmcm9tIENhc3NhbmRyYSwgYnV0IGRpc2sgdXNhZ2Ugc3RheXMgdGhlIHNhbWUuIFdoYXQgZ2l2ZXM/CisKK0RhdGEgeW91IHdyaXRlIHRvIENhc3NhbmRyYSBnZXRzIHBlcnNpc3RlZCB0byBTU1RhYmxlcy4gU2luY2UgU1NUYWJsZXMKK2FyZSBpbW11dGFibGUsIHRoZSBkYXRhIGNhbid0IGFjdHVhbGx5IGJlIHJlbW92ZWQgd2hlbiB5b3UgcGVyZm9ybSBhCitkZWxldGUsIGluc3RlYWQsIGEgbWFya2VyIChhbHNvIGNhbGxlZCBhICJ0b21ic3RvbmUiKSBpcyB3cml0dGVuIHRvCitpbmRpY2F0ZSB0aGUgdmFsdWUncyBuZXcgc3RhdHVzLiBOZXZlciBmZWFyIHRob3VnaCwgb24gdGhlIGZpcnN0Citjb21wYWN0aW9uIHRoYXQgb2NjdXJzIGJldHdlZW4gdGhlIGRhdGEgYW5kIHRoZSB0b21ic3RvbmUsIHRoZSBkYXRhIHdpbGwKK2JlIGV4cHVuZ2VkIGNvbXBsZXRlbHkgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGRpc2sgc3BhY2UgcmVjb3ZlcmVkLiBTZWUKK2Bjb21wYWN0aW9uYCBmb3IgbW9yZSBkZXRhaWwuCisKK1tbb25lLWVudHJ5LXJpbmddXQorPT0gV2h5IGRvZXMgbm9kZXRvb2wgcmluZyBvbmx5IHNob3cgb25lIGVudHJ5LCBldmVuIHRob3VnaCBteSBub2RlcyBsb2dnZWQgdGhhdCB0aGV5IHNlZSBlYWNoIG90aGVyIGpvaW5pbmcgdGhlIHJpbmc/CisKK1RoaXMgaGFwcGVucyB3aGVuIHlvdSBoYXZlIHRoZSBzYW1lIHRva2VuIGFzc2lnbmVkIHRvIGVhY2ggbm9kZS4gRG9uJ3QKK2RvIHRoYXQuCisKK01vc3Qgb2Z0ZW4gdGhpcyBiaXRlcyBwZW9wbGUgd2hvIGRlcGxveSBieSBpbnN0YWxsaW5nIENhc3NhbmRyYSBvbiBhIFZNCisoZXNwZWNpYWxseSB3aGVuIHVzaW5nIHRoZSBEZWJpYW4gcGFja2FnZSwgd2hpY2ggYXV0by1zdGFydHMgQ2Fzc2FuZHJhCithZnRlciBpbnN0YWxsYXRpb24sIHRodXMgZ2VuZXJhdGluZyBhbmQgc2F2aW5nIGEgdG9rZW4pLCB0aGVuIGNsb25pbmcKK3RoYXQgVk0gdG8gb3RoZXIgbm9kZXMuCisKK1RoZSBlYXNpZXN0IGZpeCBpcyB0byB3aXBlIHRoZSBkYXRhIGFuZCBjb21taXRsb2cgZGlyZWN0b3JpZXMsIHRodXMKK21ha2luZyBzdXJlIHRoYXQgZWFjaCBub2RlIHdpbGwgZ2VuZXJhdGUgYSByYW5kb20gdG9rZW4gb24gdGhlIG5leHQKK3Jlc3RhcnQuCisKK1tbY2hhbmdlLXJlcGxpY2F0aW9uLWZhY3Rvcl1dCis9PSBDYW4gSSBjaGFuZ2UgdGhlIHJlcGxpY2F0aW9uIGZhY3RvciAoYSBhIGtleXNwYWNlKSBvbiBhIGxpdmUgY2x1c3Rlcj8KKworWWVzLCBidXQgaXQgd2lsbCByZXF1aXJlIHJ1bm5pbmcgYSBmdWxsIHJlcGFpciAob3IgY2xlYW51cCkgdG8gY2hhbmdlCit0aGUgcmVwbGljYSBjb3VudCBvZiBleGlzdGluZyBkYXRhOgorCisqIGBBbHRlciA8YWx0ZXIta2V5c3BhY2Utc3RhdGVtZW50PmAgdGhlIHJlcGxpY2F0aW9uIGZhY3RvciBmb3IgZGVzaXJlZAora2V5c3BhY2UgKHVzaW5nIGNxbHNoIGZvciBpbnN0YW5jZSkuCisqIElmIHlvdSdyZSByZWR1Y2luZyB0aGUgcmVwbGljYXRpb24gZmFjdG9yLCBydW4gYG5vZGV0b29sIGNsZWFudXBgIG9uCit0aGUgY2x1c3RlciB0byByZW1vdmUgc3VycGx1cyByZXBsaWNhdGVkIGRhdGEuIENsZWFudXAgcnVucyBvbiBhCitwZXItbm9kZSBiYXNpcy4KKyogSWYgeW91J3JlIGluY3JlYXNpbmcgdGhlIHJlcGxpY2F0aW9uIGZhY3RvciwgcnVuCitgbm9kZXRvb2wgcmVwYWlyIC1mdWxsYCB0byBlbnN1cmUgZGF0YSBpcyByZXBsaWNhdGVkIGFjY29yZGluZyB0byB0aGUKK25ldyBjb25maWd1cmF0aW9uLiBSZXBhaXIgcnVucyBvbiBhIHBlci1yZXBsaWNhIHNldCBiYXNpcy4gVGhpcyBpcyBhbgoraW50ZW5zaXZlIHByb2Nlc3MgdGhhdCBtYXkgcmVzdWx0IGluIGFkdmVyc2UgY2x1c3RlciBwZXJmb3JtYW5jZS4gSXQncworaGlnaGx5IHJlY29tbWVuZGVkIHRvIGRvIHJvbGxpbmcgcmVwYWlycywgYXMgYW4gYXR0ZW1wdCB0byByZXBhaXIgdGhlCitlbnRpcmUgY2x1c3RlciBhdCBvbmNlIHdpbGwgbW9zdCBsaWtlbHkgc3dhbXAgaXQuIE5vdGUgdGhhdCB5b3Ugd2lsbAorbmVlZCB0byBydW4gYSBmdWxsIHJlcGFpciAoYC1mdWxsYCkgdG8gbWFrZSBzdXJlIHRoYXQgYWxyZWFkeSByZXBhaXJlZAorc3N0YWJsZXMgYXJlIG5vdCBza2lwcGVkLiBZb3Ugc2hvdWxkIHVzZSBgQ29uc2lzdGVuY3lMZXZlbC5RVU9SVU1gIG9yCitgQUxMYCAoZGVwZW5kaW5nIG9uIHlvdXIgZXhpc3RpbmcgcmVwbGljYXRpb24gZmFjdG9yKSB0byBtYWtlIHN1cmUgdGhhdAorYSByZXBsaWNhIHRoYXQgYWN0dWFsbHkgaGFzIHRoZSBkYXRhIGlzIGNvbnN1bHRlZC4gT3RoZXJ3aXNlIHNvbWUKK2NsaWVudHMgcG90ZW50aWFsbHkgYmVpbmcgdG9sZCBubyBkYXRhIGV4aXN0cyB1bnRpbCByZXBhaXIgaXMgZG9uZS4KKworW1tjYW4tbGFyZ2UtYmxvYl1dCis9PSBDYW4gSSBTdG9yZSAobGFyZ2UpIEJMT0JzIGluIENhc3NhbmRyYT8KKworQ2Fzc2FuZHJhIGlzbid0IG9wdGltaXplZCBmb3IgbGFyZ2UgZmlsZSBvciBCTE9CIHN0b3JhZ2UgYW5kIGEgc2luZ2xlCitgYmxvYmAgdmFsdWUgaXMgYWx3YXlzIHJlYWQgYW5kIHNlbmQgdG8gdGhlIGNsaWVudCBlbnRpcmVseS4gQXMgc3VjaCwKK3N0b3Jpbmcgc21hbGwgYmxvYnMgKGxlc3MgdGhhbiBzaW5nbGUgZGlnaXQgTUIpIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtLAorYnV0IGl0IGlzIGFkdmlzZWQgdG8gbWFudWFsbHkgc3BsaXQgbGFyZ2UgYmxvYnMgaW50byBzbWFsbGVyIGNodW5rcy4KKworUGxlYXNlIG5vdGUgaW4gcGFydGljdWxhciB0aGF0IGJ5IGRlZmF1bHQsIGFueSB2YWx1ZSBncmVhdGVyIHRoYW4gMTZNaUIKK3dpbGwgYmUgcmVqZWN0ZWQgYnkgQ2Fzc2FuZHJhIGR1ZSB0aGUgYG1heF9tdXRhdGlvbl9zaXplYAorY29uZmlndXJhdGlvbiBvZiB0aGUgYGNhc3NhbmRyYS15YW1sYCBmaWxlICh3aGljaCBkZWZhdWx0IHRvIGhhbGYgb2YKK2Bjb21taXRsb2dfc2VnbWVudF9zaXplYCwgd2hpY2ggaXRzZWxmIGRlZmF1bHQgdG8gMzJNaUIpLgorCitbW25vZGV0b29sLWNvbm5lY3Rpb24tcmVmdXNlZF1dCis9PSBOb2RldG9vbCBzYXlzICJDb25uZWN0aW9uIHJlZnVzZWQgdG8gaG9zdDogMTI3LjAuMS4xIiBmb3IgYW55IHJlbW90ZSBob3N0LiBXaGF0IGdpdmVzPworCitOb2RldG9vbCByZWxpZXMgb24gSk1YLCB3aGljaCBpbiB0dXJuIHJlbGllcyBvbiBSTUksIHdoaWNoIGluIHR1cm4gc2V0cwordXAgaXRzIG93biBsaXN0ZW5lcnMgYW5kIGNvbm5lY3RvcnMgYXMgbmVlZGVkIG9uIGVhY2ggZW5kIG9mIHRoZQorZXhjaGFuZ2UuIE5vcm1hbGx5IGFsbCBvZiB0aGlzIGhhcHBlbnMgYmVoaW5kIHRoZSBzY2VuZXMgdHJhbnNwYXJlbnRseSwKK2J1dCBpbmNvcnJlY3QgbmFtZSByZXNvbHV0aW9uIGZvciBlaXRoZXIgdGhlIGhvc3QgY29ubmVjdGluZywgb3IgdGhlIG9uZQorYmVpbmcgY29ubmVjdGVkIHRvLCBjYW4gcmVzdWx0IGluIGNyb3NzZWQgd2lyZXMgYW5kIGNvbmZ1c2luZworZXhjZXB0aW9ucy4KKworSWYgeW91IGFyZSBub3QgdXNpbmcgRE5TLCB0aGVuIG1ha2Ugc3VyZSB0aGF0IHlvdXIgYC9ldGMvaG9zdHNgIGZpbGVzCithcmUgYWNjdXJhdGUgb24gYm90aCBlbmRzLiBJZiB0aGF0IGZhaWxzLCB0cnkgc2V0dGluZyB0aGUKK2AtRGphdmEucm1pLnNlcnZlci5ob3N0bmFtZT08cHVibGljIG5hbWU+YCBKVk0gb3B0aW9uIG5lYXIgdGhlIGJvdHRvbSBvZgorYGNhc3NhbmRyYS1lbnYuc2hgIHRvIGFuIGludGVyZmFjZSB0aGF0IHlvdSBjYW4gcmVhY2ggZnJvbSB0aGUgcmVtb3RlCittYWNoaW5lLgorCitbW3RvLWJhdGNoLW9yLW5vdC10by1iYXRjaF1dCis9PSBXaWxsIGJhdGNoaW5nIG15IG9wZXJhdGlvbnMgc3BlZWQgdXAgbXkgYnVsayBsb2FkPworCitOby4gVXNpbmcgYmF0Y2hlcyB0byBsb2FkIGRhdGEgd2lsbCBnZW5lcmFsbHkganVzdCBhZGQgInNwaWtlcyIgb2YKK2xhdGVuY3kuIFVzZSBhc3luY2hyb25vdXMgSU5TRVJUcyBpbnN0ZWFkLCBvciB1c2UgdHJ1ZSBgYnVsay1sb2FkaW5nYC4KKworQW4gZXhjZXB0aW9uIGlzIGJhdGNoaW5nIHVwZGF0ZXMgdG8gYSBzaW5nbGUgcGFydGl0aW9uLCB3aGljaCBjYW4gYmUgYQorR29vZCBUaGluZyAoYXMgbG9uZyBhcyB0aGUgc2l6ZSBvZiBhIHNpbmdsZSBiYXRjaCBzdGF5IHJlYXNvbmFibGUpLiBCdXQKK25ldmVyIGV2ZXIgYmxpbmRseSBiYXRjaCBldmVyeXRoaW5nIQorCitbW3NlbGludXhdXQorPT0gT24gUkhFTCBub2RlcyBhcmUgdW5hYmxlIHRvIGpvaW4gdGhlIHJpbmcKKworQ2hlY2sgaWYgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2VjdXJpdHktRW5oYW5jZWRfTGludXhbU0VMaW51eF0KK2lzIG9uOyBpZiBpdCBpcywgdHVybiBpdCBvZmYuCisKK1tbaG93LXRvLXVuc3Vic2NyaWJlXV0KKz09IEhvdyBkbyBJIHVuc3Vic2NyaWJlIGZyb20gdGhlIGVtYWlsIGxpc3Q/CisKK1NlbmQgYW4gZW1haWwgdG8gYHVzZXItdW5zdWJzY3JpYmVAY2Fzc2FuZHJhLmFwYWNoZS5vcmdgLgorCitbW2Nhc3NhbmRyYS1lYXRzLWFsbC1teS1tZW1vcnldXQorPT0gV2h5IGRvZXMgdG9wIHJlcG9ydCB0aGF0IENhc3NhbmRyYSBpcyB1c2luZyBhIGxvdCBtb3JlIG1lbW9yeSB0aGFuIHRoZSBKYXZhIGhlYXAgbWF4PworCitDYXNzYW5kcmEgdXNlcyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NZW1vcnktbWFwcGVkX2ZpbGVbTWVtb3J5CitNYXBwZWQgRmlsZXNdIChtbWFwKSBpbnRlcm5hbGx5LiBUaGF0IGlzLCB3ZSB1c2UgdGhlIG9wZXJhdGluZyBzeXN0ZW0ncwordmlydHVhbCBtZW1vcnkgc3lzdGVtIHRvIG1hcCBhIG51bWJlciBvZiBvbi1kaXNrIGZpbGVzIGludG8gdGhlCitDYXNzYW5kcmEgcHJvY2VzcycgYWRkcmVzcyBzcGFjZS4gVGhpcyB3aWxsICJ1c2UiIHZpcnR1YWwgbWVtb3J5OyBpLmUuCithZGRyZXNzIHNwYWNlLCBhbmQgd2lsbCBiZSByZXBvcnRlZCBieSB0b29scyBsaWtlIHRvcCBhY2NvcmRpbmdseSwgYnV0CitvbiA2NCBiaXQgc3lzdGVtcyB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgaXMgZWZmZWN0aXZlbHkgdW5saW1pdGVkIHNvIHlvdQorc2hvdWxkIG5vdCB3b3JyeSBhYm91dCB0aGF0LgorCitXaGF0IG1hdHRlcnMgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgIm1lbW9yeSB1c2UiIGluIHRoZSBzZW5zZSBhcyBpdCBpcworbm9ybWFsbHkgbWVhbnQsIGlzIHRoZSBhbW91bnQgb2YgZGF0YSBhbGxvY2F0ZWQgb24gYnJrKCkgb3IgbW1hcCdkCisvZGV2L3plcm8sIHdoaWNoIHJlcHJlc2VudCByZWFsIG1lbW9yeSB1c2VkLiBUaGUga2V5IGlzc3VlIGlzIHRoYXQgZm9yIGEKK21tYXAnZCBmaWxlLCB0aGVyZSBpcyBuZXZlciBhIG5lZWQgdG8gcmV0YWluIHRoZSBkYXRhIHJlc2lkZW50IGluCitwaHlzaWNhbCBtZW1vcnkuIFRodXMsIHdoYXRldmVyIHlvdSBkbyBrZWVwIHJlc2lkZW50IGluIHBoeXNpY2FsIG1lbW9yeQoraXMgZXNzZW50aWFsbHkganVzdCB0aGVyZSBhcyBhIGNhY2hlLCBpbiB0aGUgc2FtZSB3YXkgYXMgbm9ybWFsIEkvTyB3aWxsCitjYXVzZSB0aGUga2VybmVsIHBhZ2UgY2FjaGUgdG8gcmV0YWluIGRhdGEgdGhhdCB5b3UgcmVhZC93cml0ZS4KKworVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBub3JtYWwgSS9PIGFuZCBtbWFwKCkgaXMgdGhhdCBpbiB0aGUgbW1hcCgpIGNhc2UKK3RoZSBtZW1vcnkgaXMgYWN0dWFsbHkgbWFwcGVkIHRvIHRoZSBwcm9jZXNzLCB0aHVzIGFmZmVjdGluZyB0aGUgdmlydHVhbAorc2l6ZSBhcyByZXBvcnRlZCBieSB0b3AuIFRoZSBtYWluIGFyZ3VtZW50IGZvciB1c2luZyBtbWFwKCkgaW5zdGVhZCBvZgorc3RhbmRhcmQgSS9PIGlzIHRoZSBmYWN0IHRoYXQgcmVhZGluZyBlbnRhaWxzIGp1c3QgdG91Y2hpbmcgbWVtb3J5IC0gaW4KK3RoZSBjYXNlIG9mIHRoZSBtZW1vcnkgYmVpbmcgcmVzaWRlbnQsIHlvdSBqdXN0IHJlYWQgaXQgLSB5b3UgZG9uJ3QgZXZlbgordGFrZSBhIHBhZ2UgZmF1bHQgKHNvIG5vIG92ZXJoZWFkIGluIGVudGVyaW5nIHRoZSBrZXJuZWwgYW5kIGRvaW5nIGEKK3NlbWktY29udGV4dCBzd2l0Y2gpLiBUaGlzIGlzIGNvdmVyZWQgaW4gbW9yZSBkZXRhaWwKK2h0dHA6Ly93d3cudmFybmlzaC1jYWNoZS5vcmcvdHJhYy93aWtpL0FyY2hpdGVjdE5vdGVzW2hlcmVdLgorCis9PSBXaGF0IGFyZSBzZWVkcz8KKworU2VlZHMgYXJlIHVzZWQgZHVyaW5nIHN0YXJ0dXAgdG8gZGlzY292ZXIgdGhlIGNsdXN0ZXIuCisKK0lmIHlvdSBjb25maWd1cmUgeW91ciBub2RlcyB0byByZWZlciBzb21lIG5vZGUgYXMgc2VlZCwgbm9kZXMgaW4geW91cgorcmluZyB0ZW5kIHRvIHNlbmQgR29zc2lwIG1lc3NhZ2UgdG8gc2VlZHMgbW9yZSBvZnRlbiAoYWxzbyBzZWUgdGhlCitgc2VjdGlvbiBvbiBnb3NzaXAgPGdvc3NpcD5gKSB0aGFuIHRvIG5vbi1zZWVkcy4gSW4gb3RoZXIgd29yZHMsIHNlZWRzCithcmUgd29ya2VkIGFzIGh1YnMgb2YgR29zc2lwIG5ldHdvcmsuIFdpdGggc2VlZHMsIGVhY2ggbm9kZSBjYW4gZGV0ZWN0CitzdGF0dXMgY2hhbmdlcyBvZiBvdGhlciBub2RlcyBxdWlja2x5LgorCitTZWVkcyBhcmUgYWxzbyByZWZlcnJlZCBieSBuZXcgbm9kZXMgb24gYm9vdHN0cmFwIHRvIGxlYXJuIG90aGVyIG5vZGVzCitpbiByaW5nLiBXaGVuIHlvdSBhZGQgYSBuZXcgbm9kZSB0byByaW5nLCB5b3UgbmVlZCB0byBzcGVjaWZ5IGF0IGxlYXN0CitvbmUgbGl2ZSBzZWVkIHRvIGNvbnRhY3QuIE9uY2UgYSBub2RlIGpvaW4gdGhlIHJpbmcsIGl0IGxlYXJucyBhYm91dCB0aGUKK290aGVyIG5vZGVzLCBzbyBpdCBkb2Vzbid0IG5lZWQgc2VlZCBvbiBzdWJzZXF1ZW50IGJvb3QuCisKK1lvdSBjYW4gbWFrZSBhIHNlZWQgYSBub2RlIGF0IGFueSB0aW1lLiBUaGVyZSBpcyBub3RoaW5nIHNwZWNpYWwgYWJvdXQKK3NlZWQgbm9kZXMuIElmIHlvdSBsaXN0IHRoZSBub2RlIGluIHNlZWQgbGlzdCBpdCBpcyBhIHNlZWQKKworU2VlZHMgZG8gbm90IGF1dG8gYm9vdHN0cmFwIChpLmUuIGlmIGEgbm9kZSBoYXMgaXRzZWxmIGluIGl0cyBzZWVkIGxpc3QKK2l0IHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgdHJhbnNmZXIgZGF0YSB0byBpdHNlbGYpIElmIHlvdSB3YW50IGEgbm9kZSB0bworZG8gdGhhdCwgYm9vdHN0cmFwIGl0IGZpcnN0IGFuZCB0aGVuIGFkZCBpdCB0byBzZWVkcyBsYXRlci4gSWYgeW91IGhhdmUKK25vIGRhdGEgKG5ldyBpbnN0YWxsKSB5b3UgZG8gbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgYm9vdHN0cmFwIGF0IGFsbC4KKworUmVjb21tZW5kZWQgdXNhZ2Ugb2Ygc2VlZHM6CisKKyogcGljayB0d28gKG9yIG1vcmUpIG5vZGVzIHBlciBkYXRhIGNlbnRlciBhcyBzZWVkIG5vZGVzLgorKiBzeW5jIHRoZSBzZWVkIGxpc3QgdG8gYWxsIHlvdXIgbm9kZXMKKworW1thcmUtc2VlZHMtU1BPRl1dCis9PSBEb2VzIHNpbmdsZSBzZWVkIG1lYW4gc2luZ2xlIHBvaW50IG9mIGZhaWx1cmU/CisKK1RoZSByaW5nIGNhbiBvcGVyYXRlIG9yIGJvb3Qgd2l0aG91dCBhIHNlZWQ7IGhvd2V2ZXIsIHlvdSB3aWxsIG5vdCBiZQorYWJsZSB0byBhZGQgbmV3IG5vZGVzIHRvIHRoZSBjbHVzdGVyLiBJdCBpcyByZWNvbW1lbmRlZCB0byBjb25maWd1cmUKK211bHRpcGxlIHNlZWRzIGluIHByb2R1Y3Rpb24gc3lzdGVtLgorCitbW2NhbnQtY2FsbC1qbXgtbWV0aG9kXV0KKz09IFdoeSBjYW4ndCBJIGNhbGwgam14IG1ldGhvZCBYIG9uIGpjb25zb2xlPworCitTb21lIG9mIEpNWCBvcGVyYXRpb25zIHVzZSBhcnJheSBhcmd1bWVudCBhbmQgYXMgamNvbnNvbGUgZG9lc24ndAorc3VwcG9ydCBhcnJheSBhcmd1bWVudCwgdGhvc2Ugb3BlcmF0aW9ucyBjYW4ndCBiZSBjYWxsZWQgd2l0aCBqY29uc29sZQorKHRoZSBidXR0b25zIGFyZSBpbmFjdGl2ZSBmb3IgdGhlbSkuIFlvdSBuZWVkIHRvIHdyaXRlIGEgSk1YIGNsaWVudCB0bworY2FsbCBzdWNoIG9wZXJhdGlvbnMgb3IgbmVlZCBhcnJheS1jYXBhYmxlIEpNWCBtb25pdG9yaW5nIHRvb2wuCisKK1tbd2h5LW1lc3NhZ2UtZHJvcHBlZF1dCis9PSBXaHkgZG8gSSBzZWUgIi4uLiBtZXNzYWdlcyBkcm9wcGVkIC4uLiIgaW4gdGhlIGxvZ3M/CisKK1RoaXMgaXMgYSBzeW1wdG9tIG9mIGxvYWQgc2hlZGRpbmcgLS0gQ2Fzc2FuZHJhIGRlZmVuZGluZyBpdHNlbGYgYWdhaW5zdAorbW9yZSByZXF1ZXN0cyB0aGFuIGl0IGNhbiBoYW5kbGUuCisKK0ludGVybm9kZSBtZXNzYWdlcyB3aGljaCBhcmUgcmVjZWl2ZWQgYnkgYSBub2RlLCBidXQgZG8gbm90IGdldCBub3QgdG8KK2JlIHByb2Nlc3NlZCB3aXRoaW4gdGhlaXIgcHJvcGVyIHRpbWVvdXQgKHNlZSBgcmVhZF9yZXF1ZXN0X3RpbWVvdXRgLAorYHdyaXRlX3JlcXVlc3RfdGltZW91dGAsIC4uLiBpbiB0aGUgYGNhc3NhbmRyYS15YW1sYCksIGFyZSBkcm9wcGVkCityYXRoZXIgdGhhbiBwcm9jZXNzZWQgKHNpbmNlIHRoZSBhcyB0aGUgY29vcmRpbmF0b3Igbm9kZSB3aWxsIG5vIGxvbmdlcgorYmUgd2FpdGluZyBmb3IgYSByZXNwb25zZSkuCisKK0ZvciB3cml0ZXMsIHRoaXMgbWVhbnMgdGhhdCB0aGUgbXV0YXRpb24gd2FzIG5vdCBhcHBsaWVkIHRvIGFsbCByZXBsaWNhcworaXQgd2FzIHNlbnQgdG8uIFRoZSBpbmNvbnNpc3RlbmN5IHdpbGwgYmUgcmVwYWlyZWQgYnkgcmVhZCByZXBhaXIsIGhpbnRzCitvciBhIG1hbnVhbCByZXBhaXIuIFRoZSB3cml0ZSBvcGVyYXRpb24gbWF5IGFsc28gaGF2ZSB0aW1lb3V0ZWQgYXMgYQorcmVzdWx0LgorCitGb3IgcmVhZHMsIHRoaXMgbWVhbnMgYSByZWFkIHJlcXVlc3QgbWF5IG5vdCBoYXZlIGNvbXBsZXRlZC4KKworTG9hZCBzaGVkZGluZyBpcyBwYXJ0IG9mIHRoZSBDYXNzYW5kcmEgYXJjaGl0ZWN0dXJlLCBpZiB0aGlzIGlzIGEKK3BlcnNpc3RlbnQgaXNzdWUgaXQgaXMgZ2VuZXJhbGx5IGEgc2lnbiBvZiBhbiBvdmVybG9hZGVkIG5vZGUgb3IKK2NsdXN0ZXIuCisKK1tbb29tLW1hcC1mYWlsZWRdXQorPT0gQ2Fzc2FuZHJhIGRpZXMgd2l0aCBgamF2YS5sYW5nLk91dE9mTWVtb3J5RXJyb3I6IE1hcCBmYWlsZWRgCisKK0lmIENhc3NhbmRyYSBpcyBkeWluZyAqc3BlY2lmaWNhbGx5KiB3aXRoIHRoZSAiTWFwIGZhaWxlZCIgbWVzc2FnZSwgaXQKK21lYW5zIHRoZSBPUyBpcyBkZW55aW5nIGphdmEgdGhlIGFiaWxpdHkgdG8gbG9jayBtb3JlIG1lbW9yeS4gSW4gbGludXgsCit0aGlzIHR5cGljYWxseSBtZWFucyBtZW1sb2NrIGlzIGxpbWl0ZWQuIENoZWNrCitgL3Byb2MvPHBpZCBvZiBjYXNzYW5kcmE+L2xpbWl0c2AgdG8gdmVyaWZ5IHRoaXMgYW5kIHJhaXNlIGl0IChlZywgdmlhCit1bGltaXQgaW4gYmFzaCkuIFlvdSBtYXkgYWxzbyBuZWVkIHRvIGluY3JlYXNlIGB2bS5tYXhfbWFwX2NvdW50LmAgTm90ZQordGhhdCB0aGUgZGViaWFuIHBhY2thZ2UgaGFuZGxlcyB0aGlzIGZvciB5b3UgYXV0b21hdGljYWxseS4KKworW1t3aGF0LW9uLXNhbWUtdGltZXN0YW1wLXVwZGF0ZV1dCis9PSBXaGF0IGhhcHBlbnMgaWYgdHdvIHVwZGF0ZXMgYXJlIG1hZGUgd2l0aCB0aGUgc2FtZSB0aW1lc3RhbXA/CisKK1VwZGF0ZXMgbXVzdCBiZSBjb21tdXRhdGl2ZSwgc2luY2UgdGhleSBtYXkgYXJyaXZlIGluIGRpZmZlcmVudCBvcmRlcnMKK29uIGRpZmZlcmVudCByZXBsaWNhcy4gQXMgbG9uZyBhcyBDYXNzYW5kcmEgaGFzIGEgZGV0ZXJtaW5pc3RpYyB3YXkgdG8KK3BpY2sgdGhlIHdpbm5lciAoaW4gYSB0aW1lc3RhbXAgdGllKSwgdGhlIG9uZSBzZWxlY3RlZCBpcyBhcyB2YWxpZCBhcworYW55IG90aGVyLCBhbmQgdGhlIHNwZWNpZmljcyBzaG91bGQgYmUgdHJlYXRlZCBhcyBhbiBpbXBsZW1lbnRhdGlvbgorZGV0YWlsLiBUaGF0IHNhaWQsIGluIHRoZSBjYXNlIG9mIGEgdGltZXN0YW1wIHRpZSwgQ2Fzc2FuZHJhIGZvbGxvd3MgdHdvCitydWxlczogZmlyc3QsIGRlbGV0ZXMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgaW5zZXJ0cy91cGRhdGVzLiBTZWNvbmQsIGlmCit0aGVyZSBhcmUgdHdvIHVwZGF0ZXMsIHRoZSBvbmUgd2l0aCB0aGUgbGV4aWNhbGx5IGxhcmdlciB2YWx1ZSBpcworc2VsZWN0ZWQuCisKK1tbd2h5LWJvb3RzdHJhcHBpbmctc3RyZWFtLWVycm9yXV0KKz09IFdoeSBib290c3RyYXBwaW5nIGEgbmV3IG5vZGUgZmFpbHMgd2l0aCBhICJTdHJlYW0gZmFpbGVkIiBlcnJvcj8KKworVHdvIG1haW4gcG9zc2liaWxpdGllczoKKworLiB0aGUgR0MgbWF5IGJlIGNyZWF0aW5nIGxvbmcgcGF1c2VzIGRpc3J1cHRpbmcgdGhlIHN0cmVhbWluZyBwcm9jZXNzCisuIGNvbXBhY3Rpb25zIGhhcHBlbmluZyBpbiB0aGUgYmFja2dyb3VuZCBob2xkIHN0cmVhbWluZyBsb25nIGVub3VnaAordGhhdCB0aGUgVENQIGNvbm5lY3Rpb24gZmFpbHMKKworSW4gdGhlIGZpcnN0IGNhc2UsIHJlZ3VsYXIgR0MgdHVuaW5nIGFkdmljZXMgYXBwbHkuIEluIHRoZSBzZWNvbmQgY2FzZSwKK3lvdSBuZWVkIHRvIHNldCBUQ1Aga2VlcGFsaXZlIHRvIGEgbG93ZXIgdmFsdWUgKGRlZmF1bHQgaXMgdmVyeSBoaWdoIG9uCitMaW51eCkuIFRyeSB0byBqdXN0IHJ1biB0aGUgZm9sbG93aW5nOgorCisuLi4uCiskIHN1ZG8gL3NiaW4vc3lzY3RsIC13IG5ldC5pcHY0LnRjcF9rZWVwYWxpdmVfdGltZT02MCBuZXQuaXB2NC50Y3Bfa2VlcGFsaXZlX2ludHZsPTYwIG5ldC5pcHY0LnRjcF9rZWVwYWxpdmVfcHJvYmVzPTUKKy4uLi4KKworVG8gbWFrZSB0aG9zZSBzZXR0aW5ncyBwZXJtYW5lbnQsIGFkZCB0aGVtIHRvIHlvdXIgYC9ldGMvc3lzY3RsLmNvbmZgCitmaWxlLgorCitOb3RlOiBodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vY29tcHV0ZS9bR0NFXSdzIGZpcmV3YWxsIHdpbGwgYWx3YXlzCitpbnRlcnJ1cHQgVENQIGNvbm5lY3Rpb25zIHRoYXQgYXJlIGluYWN0aXZlIGZvciBtb3JlIHRoYW4gMTAgbWluLgorUnVubmluZyB0aGUgYWJvdmUgY29tbWFuZCBpcyBoaWdobHkgcmVjb21tZW5kZWQgaW4gdGhhdCBlbnZpcm9ubWVudC4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vdmVydmlldy90ZXJtaW5vbG9neS5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL292ZXJ2aWV3L3Rlcm1pbm9sb2d5LmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIwMDA1NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vdmVydmlldy90ZXJtaW5vbG9neS5hZG9jCkBAIC0wLDAgKzEsMjMgQEAKKz0gVGVybWlub2xvZ3kKKworYSB8IGIgfCB4cmVmOiNjW2NdIHwgZCB8IGUgfCBmCisKK1tbY11dCitjbHVzdGVyOjoKK0EgcmluZyBvZiBub2RlcyB0aGF0IGhvbGRzIGEgZGF0YWJhc2UuCisKK25vZGU6OgorQSBtYWNoaW5lIHRoYXQgaG9sZHMgQ2Fzc2FuZHJhIHJlcGxpY2FzLgorRWFjaCBub2RlIGhvbGRzIGEgcG9ydGlvbiBvZiB0aGUgd2hvbGUgZGF0YWJhc2UuCisKK3JlcGxpY2E6OgorQSBjb3B5IG9mIGEgcG9ydGlvbiBvZiB0aGUgd2hvbGUgZGF0YWJhc2UuIEVhY2ggbm9kZSBob2xkcyBzb21lIHJlcGxpY2FzLgorCityZXBsaWNhdGlvbjo6CitUaGUgcHJvY2VzcyBvZiBjcmVhdGluZyByZXBsaWNhcyBhY3Jvc3Mgbm9kZXMgaW4gYSBjbHVzdGVyLgorCityZXBsaWNhdGlvbiBmYWN0b3IgKFJGKTo6CitBIHNjYWxhciB2YWx1ZSB0aGF0IHNldHMgdGhlIG51bWJlciBvZiByZXBsaWNhcyBvZiBlYWNoIHBhcnRpdGlvbiBpbiBhIGNsdXN0ZXIuCitGb3IgZXhhbXBsZSwgYW5kIFJGPTMgbWVhbnMgdGhhdCB0aHJlZSBub2RlcyBob2xkIGEgcmVwbGljYSBvZiBlYWNoIHBhcnRpdGlvbi4KKworCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvcmVmZXJlbmNlcy9qYXZhMTEuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9yZWZlcmVuY2VzL2phdmExMS5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZDVjMmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvcmVmZXJlbmNlcy9qYXZhMTEuYWRvYwpAQCAtMCwwICsxLDIwNiBAQAorPSBTdXBwb3J0IGZvciBKYXZhIDExCisKK0luIHRoZSBuZXcgSmF2YSByZWxlYXNlIGNhZGVuY2UgYSBuZXcgSmF2YSB2ZXJzaW9uIGlzIG1hZGUgYXZhaWxhYmxlCitldmVyeSBzaXggbW9udGhzLiBUaGUgbW9yZSBmcmVxdWVudCByZWxlYXNlIGN5Y2xlIGlzIGZhdm9yZWQgYXMgaXQKK2JyaW5ncyBuZXcgSmF2YSBmZWF0dXJlcyB0byB0aGUgZGV2ZWxvcGVycyBhcyBhbmQgd2hlbiB0aGV5IGFyZQorZGV2ZWxvcGVkIHdpdGhvdXQgdGhlIHdhaXQgdGhhdCB0aGUgZWFybGllciAzIHllYXIgcmVsZWFzZSBtb2RlbAoraW5jdXJyZWQuIE5vdCBldmVyeSBKYXZhIHZlcnNpb24gaXMgYSBMb25nIFRlcm0gU3VwcG9ydCAoTFRTKSB2ZXJzaW9uLgorQWZ0ZXIgSmF2YSA4IHRoZSBuZXh0IExUUyB2ZXJzaW9uIGlzIEphdmEgMTEuIEphdmEgOSwgMTAsIDEyIGFuZCAxMyBhcmUKK2FsbCBub24tTFRTIHZlcnNpb25zLgorCitPbmUgb2YgdGhlIG9iamVjdGl2ZXMgb2YgdGhlIEFwYWNoZSBDYXNzYW5kcmEgNC4wIHZlcnNpb24gaXMgdG8gc3VwcG9ydAordGhlIHJlY2VudCBMVFMgSmF2YSB2ZXJzaW9ucyA4IGFuZCAxMQorKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTk2MDhbQ0FTU0FORFJBLTk2MDhdKS4KK0phdmEgOCBhbmQgSmF2YSAxMSBtYXkgYmUgdXNlZCB0byBidWlsZCBhbmQgcnVuIEFwYWNoZSBDYXNzYW5kcmEgNC4wLiBFZmZlY3RpdmUgQ2Fzc2FuZHJhCis0LjAuMiB0aGVyZSBpcyBmdWxsIEphdmEgMTEgc3VwcG9ydCwgaXQgaXMgbm90IGV4cGVyaW1lbnRhbCBhbnltb3JlLgorCis9PSBTdXBwb3J0IE1hdHJpeAorCitUaGUgc3VwcG9ydCBtYXRyaXggZm9yIHRoZSBKYXZhIHZlcnNpb25zIGZvciBjb21waWxpbmcgYW5kIHJ1bm5pbmcKK0FwYWNoZSBDYXNzYW5kcmEgNC4wIGlzIGRldGFpbGVkIGluIFRhYmxlIDEuIFRoZSBidWlsZCB2ZXJzaW9uIGlzIGFsb25nCit0aGUgdmVydGljYWwgYXhpcyBhbmQgdGhlIHJ1biB2ZXJzaW9uIGlzIGFsb25nIHRoZSBob3Jpem9udGFsIGF4aXMuCisKK1RhYmxlIDEgOiBTdXBwb3J0IE1hdHJpeCBmb3IgSmF2YQorCitbd2lkdGg9IjY4JSIsY29scz0iMzQlLDMwJSwzNiUiLF0KK3w9PT0KK3wgfEphdmEgOCAoUnVuKSB8SmF2YSAxMSAoUnVuKQorfEphdmEgOCAoQnVpbGQpIHxTdXBwb3J0ZWQgfFN1cHBvcnRlZAorfEphdmEgMTEoQnVpbGQpIHxOb3QgU3VwcG9ydGVkIHxFeHBlcmltZW50YWwKK3w9PT0KKworQXBhY2hlIDQuMCBzb3VyY2UgY29kZSBidWlsdCB3aXRoIEphdmEgMTEgY2Fubm90IGJlIHJ1biB3aXRoCitKYXZhIDguCisKK0FsbCBiaW5hcnkgcmVsZWFzZXMgYXJlIGJ1aWx0IHdpdGggSmF2YSA4LgorCitOZXh0LCB3ZSBzaGFsbCBkaXNjdXNzIHVzaW5nIGVhY2ggb2YgSmF2YSA4IGFuZCAxMSB0byBidWlsZCBhbmQKK3J1biBBcGFjaGUgQ2Fzc2FuZHJhIDQuMC4KKworPT0gVXNpbmcgSmF2YSA4IHRvIEJ1aWxkCisKK1RvIHN0YXJ0IHdpdGgsIGluc3RhbGwgSmF2YSA4LiBBcyBhbiBleGFtcGxlLCBmb3IgaW5zdGFsbGluZyBKYXZhIDggb24KK1JlZEhhdCBMaW51eCB0aGUgY29tbWFuZCBpcyBhcyBmb2xsb3dzOgorCisuLi4uCiskIHN1ZG8geXVtIGluc3RhbGwgamF2YS0xLjguMC1vcGVuamRrLWRldmVsCisuLi4uCisKK1NldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGBKQVZBX0hPTUVgIGFuZCBgUEFUSGAuCisKKy4uLi4KKyQgZXhwb3J0IEpBVkFfSE9NRT0vdXNyL2xpYi9qdm0vamF2YS0xLjguMC1vcGVuamRrCiskIGV4cG9ydCBQQVRIPSRQQVRIOiRKQVZBX0hPTUUvYmluOiRKUkVfSE9NRS9iaW4KKy4uLi4KKworRG93bmxvYWQgYW5kIGluc3RhbGwgQXBhY2hlIENhc3NhbmRyYSA0LjAgc291cmNlIGNvZGUgZnJvbSB0aGUgR2l0IGFsb25nCit3aXRoIHRoZSBkZXBlbmRlbmNpZXMuCisKKy4uLi4KKyQgZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLmdpdAorLi4uLgorCitJZiBDYXNzYW5kcmEgaXMgYWxyZWFkeSBydW5uaW5nIHN0b3AgQ2Fzc2FuZHJhIHdpdGggdGhlIGZvbGxvd2luZworY29tbWFuZC4KKworLi4uLgorJCAuL25vZGV0b29sIHN0b3BkYWVtb24KKy4uLi4KKworQnVpbGQgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIGBjYXNzYW5kcmFgIGRpcmVjdG9yeSwgd2hpY2ggaGFzIHRoZQorYGJ1aWxkLnhtbGAgYnVpbGQgc2NyaXB0LiBUaGUgQXBhY2hlIEFudCB1c2VzIHRoZSBKYXZhIHZlcnNpb24gc2V0IGluCit0aGUgYEpBVkFfSE9NRWAgZW52aXJvbm1lbnQgdmFyaWFibGUuCisKKy4uLi4KKyQgY2Qgfi9jYXNzYW5kcmEKKyQgYW50CisuLi4uCisKK0FwYWNoZSBDYXNzYW5kcmEgNC4wIGdldHMgYnVpbHQgd2l0aCBKYXZhIDguIFNldCB0aGUgZW52aXJvbm1lbnQKK3ZhcmlhYmxlIGZvciBgQ0FTU0FORFJBX0hPTUVgIGluIHRoZSBiYXNoIHNjcmlwdC4gQWxzbyBhZGQgdGhlCitgQ0FTU0FORFJBX0hPTUUvYmluYCB0byB0aGUgYFBBVEhgIHZhcmlhYmxlLgorCisuLi4uCiskIGV4cG9ydCBDQVNTQU5EUkFfSE9NRT1+L2Nhc3NhbmRyYQorJCBleHBvcnQgUEFUSD0kUEFUSDokSkFWQV9IT01FL2JpbjokSlJFX0hPTUUvYmluOiRDQVNTQU5EUkFfSE9NRS9iaW4KKy4uLi4KKworVG8gcnVuIEFwYWNoZSBDYXNzYW5kcmEgNC4wIHdpdGggZWl0aGVyIG9mIEphdmEgOCBvciBKYXZhIDExIHJ1biB0aGUKK0Nhc3NhbmRyYSBhcHBsaWNhdGlvbiBpbiB0aGUgYENBU1NBTkRSQV9IT01FL2JpbmAgZGlyZWN0b3J5LCB3aGljaCBpcyBpbgordGhlIGBQQVRIYCBlbnYgdmFyaWFibGUuCisKKy4uLi4KKyQgY2Fzc2FuZHJhCisuLi4uCisKK1RoZSBKYXZhIHZlcnNpb24gdXNlZCB0byBydW4gQ2Fzc2FuZHJhIGdldHMgb3V0cHV0IGFzIENhc3NhbmRyYSBpcworZ2V0dGluZyBzdGFydGVkLiBBcyBhbiBleGFtcGxlIGlmIEphdmEgMTEgaXMgdXNlZCwgdGhlIHJ1biBvdXRwdXQgc2hvdWxkCitpbmNsdWRlIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZyBvdXRwdXQgc25pcHBldDoKKworLi4uLgorSU5GTyAgW21haW5dIDIwMTktMDctMzEgMjE6MTg6MTYsODYyIENhc3NhbmRyYURhZW1vbi5qYXZhOjQ4MCAtIEhvc3RuYW1lOiBpcC0xNzItMzAtMy0gCisxNDYuZWMyLmludGVybmFsOjcwMDA6NzAwMQorSU5GTyAgW21haW5dIDIwMTktMDctMzEgMjE6MTg6MTYsODYyIENhc3NhbmRyYURhZW1vbi5qYXZhOjQ4NyAtIEpWTSB2ZW5kb3IvdmVyc2lvbjogT3BlbkpESyAKKzY0LUJpdCBTZXJ2ZXIgVk0vMTEuMC4zCitJTkZPICBbbWFpbl0gMjAxOS0wNy0zMSAyMToxODoxNiw4NjMgQ2Fzc2FuZHJhRGFlbW9uLmphdmE6NDg4IC0gSGVhcCBzaXplOiAKKzEwMDQuMDAwTWlCLzEwMDQuMDAwTWlCCisuLi4uCisKK1RoZSBmb2xsb3dpbmcgb3V0cHV0IGluZGljYXRlcyBhIHNpbmdsZSBub2RlIENhc3NhbmRyYSA0LjAgY2x1c3RlciBoYXMKK3N0YXJ0ZWQuCisKKy4uLi4KK0lORk8gIFttYWluXSAyMDE5LTA3LTMxIDIxOjE4OjE5LDY4NyBJbmJvdW5kQ29ubmVjdGlvbkluaXRpYXRvci5qYXZhOjEzMCAtIExpc3RlbmluZyBvbiAKK2FkZHJlc3M6ICgxMjcuMC4wLjE6NzAwMCksIG5pYzogbG8sIGVuY3J5cHRpb246IGVuYWJsZWQgKG9wZW5zc2wpCisuLi4KKy4uLgorSU5GTyAgW21haW5dIDIwMTktMDctMzEgMjE6MTg6MTksODUwIFN0b3JhZ2VTZXJ2aWNlLmphdmE6NTEyIC0gVW5hYmxlIHRvIGdvc3NpcCB3aXRoIGFueSAKK3BlZXJzIGJ1dCBjb250aW51aW5nIGFueXdheSBzaW5jZSBub2RlIGlzIGluIGl0cyBvd24gc2VlZCBsaXN0CitJTkZPICBbbWFpbl0gMjAxOS0wNy0zMSAyMToxODoxOSw4NjQgU3RvcmFnZVNlcnZpY2UuamF2YTo2OTUgLSBMb2FkaW5nIHBlcnNpc3RlZCByaW5nIHN0YXRlCitJTkZPICBbbWFpbl0gMjAxOS0wNy0zMSAyMToxODoxOSw4NjUgU3RvcmFnZVNlcnZpY2UuamF2YTo4MTQgLSBTdGFydGluZyB1cCBzZXJ2ZXIgZ29zc2lwCitJTkZPICBbbWFpbl0gMjAxOS0wNy0zMSAyMToxODoyMCwwODggQnVmZmVyUG9vbC5qYXZhOjIxNiAtIEdsb2JhbCBidWZmZXIgcG9vbCBpcyBlbmFibGVkLCAgCit3aGVuIHBvb2wgaXMgZXhoYXVzdGVkIChtYXggaXMgMjUxLjAwME1pQikgaXQgd2lsbCBhbGxvY2F0ZSBvbiBoZWFwCitJTkZPICBbbWFpbl0gMjAxOS0wNy0zMSAyMToxODoyMCwxMTAgU3RvcmFnZVNlcnZpY2UuamF2YTo4NzUgLSBUaGlzIG5vZGUgd2lsbCBub3QgYXV0byAKK2Jvb3RzdHJhcCBiZWNhdXNlIGl0IGlzIGNvbmZpZ3VyZWQgdG8gYmUgYSBzZWVkIG5vZGUuCisuLi4KKy4uLgorSU5GTyAgW21haW5dIDIwMTktMDctMzEgMjE6MTg6MjAsODA5IFN0b3JhZ2VTZXJ2aWNlLmphdmE6MTUwNyAtIEpPSU5JTkc6IEZpbmlzaCBqb2luaW5nIHJpbmcKK0lORk8gIFttYWluXSAyMDE5LTA3LTMxIDIxOjE4OjIwLDkyMSBTdG9yYWdlU2VydmljZS5qYXZhOjI1MDggLSBOb2RlIDEyNy4wLjAuMTo3MDAwIHN0YXRlIAoranVtcCB0byBOT1JNQUwKKy4uLi4KKworPT0gVXNpbmcgSmF2YSAxMSB0byBCdWlsZAorCitJZiBKYXZhIDExIGlzIHVzZWQgdG8gYnVpbGQgQXBhY2hlIENhc3NhbmRyYSA0LjAsIGZpcnN0IEphdmEgMTEgbXVzdCBiZQoraW5zdGFsbGVkIGFuZCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNldC4gQXMgYW4gZXhhbXBsZSwgdG8gZG93bmxvYWQKK2FuZCBpbnN0YWxsIEphdmEgMTEgb24gUmVkSGF0IExpbnV4IHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQuCisKKy4uLi4KKyQgeXVtIGluc3RhbGwgamF2YS0xMS1vcGVuamRrLWRldmVsCisuLi4uCisKK1NldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGBKQVZBX0hPTUVgIGFuZCBgUEFUSGAuCisKKy4uLi4KKyQgZXhwb3J0IEpBVkFfSE9NRT0vdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrCiskIGV4cG9ydCBQQVRIPSRQQVRIOiRKQVZBX0hPTUUvYmluOiRKUkVfSE9NRS9iaW4KKy4uLi4KKworVGhlIGJ1aWxkIG91dHB1dCBzaG91bGQgbm93IGluY2x1ZGUgdGhlIGZvbGxvd2luZy4KKworLi4uLgorW2VjaG9dIE5vbiBkZWZhdWx0IEpESyB2ZXJzaW9uIHVzZWQ6IDExCisuLi4KKy4uLgorX2J1aWxkX2phdmE6CisgICAgW2VjaG9dIENvbXBpbGluZyBmb3IgSmF2YSAxMQorLi4uCisuLi4KK2J1aWxkOgorCitfbWFpbi1qYXI6CisgICAgICAgICBbY29weV0gQ29weWluZyAxIGZpbGUgdG8gL2hvbWUvZWMyLXVzZXIvY2Fzc2FuZHJhL2J1aWxkL2NsYXNzZXMvbWFpbi9NRVRBLUlORgorICAgICBbamFyXSBCdWlsZGluZyBqYXI6IC9ob21lL2VjMi11c2VyL2Nhc3NhbmRyYS9idWlsZC9hcGFjaGUtY2Fzc2FuZHJhLTQuMC1TTkFQU0hPVC5qYXIKKy4uLgorLi4uCitfYnVpbGQtdGVzdDoKKyAgIFtqYXZhY10gQ29tcGlsaW5nIDczOSBzb3VyY2UgZmlsZXMgdG8gL2hvbWUvZWMyLXVzZXIvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvY2xhc3NlcworICAgIFtjb3B5XSBDb3B5aW5nIDI1IGZpbGVzIHRvIC9ob21lL2VjMi11c2VyL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2NsYXNzZXMKKy4uLgorLi4uCitqYXI6CisgICBbbWtkaXJdIENyZWF0ZWQgZGlyOiAvaG9tZS9lYzItdXNlci9jYXNzYW5kcmEvYnVpbGQvY2xhc3Nlcy9zdHJlc3MvTUVUQS1JTkYKKyAgIFtta2Rpcl0gQ3JlYXRlZCBkaXI6IC9ob21lL2VjMi11c2VyL2Nhc3NhbmRyYS9idWlsZC90b29scy9saWIKKyAgICAgW2phcl0gQnVpbGRpbmcgamFyOiAvaG9tZS9lYzItdXNlci9jYXNzYW5kcmEvYnVpbGQvdG9vbHMvbGliL3N0cmVzcy5qYXIKKyAgIFtta2Rpcl0gQ3JlYXRlZCBkaXI6IC9ob21lL2VjMi11c2VyL2Nhc3NhbmRyYS9idWlsZC9jbGFzc2VzL2ZxbHRvb2wvTUVUQS1JTkYKKyAgICAgW2phcl0gQnVpbGRpbmcgamFyOiAvaG9tZS9lYzItdXNlci9jYXNzYW5kcmEvYnVpbGQvdG9vbHMvbGliL2ZxbHRvb2wuamFyCisKK0JVSUxEIFNVQ0NFU1NGVUwKK1RvdGFsIHRpbWU6IDEgbWludXRlIDMgc2Vjb25kcworLi4uLgorCis9PSBDb21tb24gSXNzdWVzCisKK1RoZSBKYXZhIDExIGJ1aWx0IEFwYWNoZSBDYXNzYW5kcmEgNC4wIHNvdXJjZSBjb2RlIG1heSBiZSBydW4gd2l0aCBKYXZhCisxMSBvbmx5LiBJZiBhIEphdmEgMTEgYnVpbHQgY29kZSBpcyBydW4gd2l0aCBKYXZhIDggdGhlIGZvbGxvd2luZyBlcnJvcgorbWVzc2FnZSBnZXRzIG91dHB1dC4KKworLi4uLgorIyBzc2ggLWkgY2Fzc2FuZHJhLnBlbSBlYzItdXNlckBlYzItMy04NS04NS03NS5jb21wdXRlLTEuYW1hem9uYXdzLmNvbQorTGFzdCBsb2dpbjogV2VkIEp1bCAzMSAyMDo0NzoyNiAyMDE5IGZyb20gNzUuMTU1LjI1NS41MQorJCBlY2hvICRKQVZBX0hPTUUKKy91c3IvbGliL2p2bS9qYXZhLTEuOC4wLW9wZW5qZGsKKyQgY2Fzc2FuZHJhIAorLi4uCisuLi4KK0Vycm9yOiBBIEpOSSBlcnJvciBoYXMgb2NjdXJyZWQsIHBsZWFzZSBjaGVjayB5b3VyIGluc3RhbGxhdGlvbiBhbmQgdHJ5IGFnYWluCitFeGNlcHRpb24gaW4gdGhyZWFkICJtYWluIiBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRDbGFzc1ZlcnNpb25FcnJvcjogCitvcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0Nhc3NhbmRyYURhZW1vbiBoYXMgYmVlbiBjb21waWxlZCBieSBhIG1vcmUgcmVjZW50IHZlcnNpb24gb2YgCit0aGUgSmF2YSBSdW50aW1lIChjbGFzcyBmaWxlIHZlcnNpb24gNTUuMCksIHRoaXMgdmVyc2lvbiBvZiB0aGUgSmF2YSBSdW50aW1lIG9ubHkgcmVjb2duaXplcyAKK2NsYXNzIGZpbGUgdmVyc2lvbnMgdXAgdG8gNTIuMAorICBhdCBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIuZGVmaW5lQ2xhc3MxKE5hdGl2ZSBNZXRob2QpCisgIGF0IGphdmEubGFuZy5DbGFzc0xvYWRlci5kZWZpbmVDbGFzcyhDbGFzc0xvYWRlci5qYXZhOjc2MykKKyAgYXQgLi4uCisuLi4KKy4uLi4KKwpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL2RiLldyaXRlUmVzcG9uc2UuYmluIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xpbmcvY2Fzcy1zdHJlc3MtZGVwcmVjYXRlZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9kYi5Xcml0ZVJlc3BvbnNlLmJpbgpjb3B5IHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29saW5nL2Nhc3Mtc3RyZXNzLWRlcHJlY2F0ZWQKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9kYi5Xcml0ZVJlc3BvbnNlLmJpbiBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29saW5nL2dlbmVyYXRlLXRva2VucwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9kYi5Xcml0ZVJlc3BvbnNlLmJpbgpjb3B5IHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29saW5nL2dlbmVyYXRlLXRva2VucwpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL2RiLldyaXRlUmVzcG9uc2UuYmluIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xpbmcvaGFzaC1wYXNzd29yZC10b29sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL2RiLldyaXRlUmVzcG9uc2UuYmluCmNvcHkgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xpbmcvaGFzaC1wYXNzd29yZC10b29sCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvY2Fzc2FuZHJhX3N0cmVzcy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL2Nhc3NhbmRyYV9zdHJlc3MuYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NmMzU0OC4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvY2Fzc2FuZHJhX3N0cmVzcy5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsMzI0ICswLDAgQEAKLT0gQ2Fzc2FuZHJhIFN0cmVzcwotCi1UaGUgYGNhc3NhbmRyYS1zdHJlc3NgIHRvb2wgaXMgdXNlZCB0byBiZW5jaG1hcmsgYW5kIGxvYWQtdGVzdCBhIENhc3NhbmRyYQotY2x1c3Rlci4gCi1gY2Fzc2FuZHJhLXN0cmVzc2Agc3VwcG9ydHMgdGVzdGluZyBhcmJpdHJhcnkgQ1FMIHRhYmxlcyBhbmQgcXVlcmllcywgYWxsb3dpbmcgdXNlcnMgdG8gYmVuY2htYXJrIHRoZWlyIG93biBkYXRhIG1vZGVsLgotCi1UaGlzIGRvY3VtZW50YXRpb24gZm9jdXNlcyBvbiB1c2VyIG1vZGUgdG8gdGVzdCBwZXJzb25hbCBzY2hlbWEuCi0KLT09IFVzYWdlCi0KLVRoZXJlIGFyZSBzZXZlcmFsIG9wZXJhdGlvbiB0eXBlczoKLQotKiB3cml0ZS1vbmx5LCByZWFkLW9ubHksIGFuZCBtaXhlZCB3b3JrbG9hZHMgb2Ygc3RhbmRhcmQgZGF0YQotKiB3cml0ZS1vbmx5IGFuZCByZWFkLW9ubHkgd29ya2xvYWRzIGZvciBjb3VudGVyIGNvbHVtbnMKLSogdXNlciBjb25maWd1cmVkIHdvcmtsb2FkcywgcnVubmluZyBjdXN0b20gcXVlcmllcyBvbiBjdXN0b20gc2NoZW1hcwotCi1UaGUgc3ludGF4IGlzIGBjYXNzYW5kcmEtc3RyZXNzIDxjb21tYW5kPiBbb3B0aW9uc11gLiAKLUZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGEgZ2l2ZW4gY29tbWFuZCBvciBvcHRpb25zLCBydW4gYGNhc3NhbmRyYS1zdHJlc3MgaGVscCA8Y29tbWFuZHxvcHRpb24+YC4KLQotQ29tbWFuZHM6OjoKLSAgcmVhZDo7OwotICAgIE11bHRpcGxlIGNvbmN1cnJlbnQgcmVhZHMgLSB0aGUgY2x1c3RlciBtdXN0IGZpcnN0IGJlIHBvcHVsYXRlZCBieSBhCi0gICAgd3JpdGUgdGVzdAotICB3cml0ZTo7OwotICAgIE11bHRpcGxlIGNvbmN1cnJlbnQgd3JpdGVzIGFnYWluc3QgdGhlIGNsdXN0ZXIKLSAgbWl4ZWQ6OzsKLSAgICBJbnRlcmxlYXZpbmcgb2YgYW55IGJhc2ljIGNvbW1hbmRzLCB3aXRoIGNvbmZpZ3VyYWJsZSByYXRpbyBhbmQKLSAgICBkaXN0cmlidXRpb24gLSB0aGUgY2x1c3RlciBtdXN0IGZpcnN0IGJlIHBvcHVsYXRlZCBieSBhIHdyaXRlIHRlc3QKLSAgY291bnRlcl93cml0ZTo7OwotICAgIE11bHRpcGxlIGNvbmN1cnJlbnQgdXBkYXRlcyBvZiBjb3VudGVycy4KLSAgY291bnRlcl9yZWFkOjs7Ci0gICAgTXVsdGlwbGUgY29uY3VycmVudCByZWFkcyBvZiBjb3VudGVycy4gVGhlIGNsdXN0ZXIgbXVzdCBmaXJzdCBiZQotICAgIHBvcHVsYXRlZCBieSBhIGNvdW50ZXJ3cml0ZSB0ZXN0LgotICB1c2VyOjs7Ci0gICAgSW50ZXJsZWF2aW5nIG9mIHVzZXIgcHJvdmlkZWQgcXVlcmllcywgd2l0aCBjb25maWd1cmFibGUgcmF0aW8gYW5kCi0gICAgZGlzdHJpYnV0aW9uLgotICBoZWxwOjs7Ci0gICAgUHJpbnQgaGVscCBmb3IgYSBjb21tYW5kIG9yIG9wdGlvbgotICBwcmludDo7OwotICAgIEluc3BlY3QgdGhlIG91dHB1dCBvZiBhIGRpc3RyaWJ1dGlvbiBkZWZpbml0aW9uCi0gIGxlZ2FjeTo7OwotICAgIExlZ2FjeSBzdXBwb3J0IG1vZGUKLVByaW1hcnkgT3B0aW9uczo6OgotICAtcG9wOjs7Ci0gICAgUG9wdWxhdGlvbiBkaXN0cmlidXRpb24gYW5kIGludHJhLXBhcnRpdGlvbiB2aXNpdCBvcmRlcgotICAtaW5zZXJ0Ojs7Ci0gICAgSW5zZXJ0IHNwZWNpZmljIG9wdGlvbnMgcmVsYXRpbmcgdG8gdmFyaW91cyBtZXRob2RzIGZvciBiYXRjaGluZyBhbmQKLSAgICBzcGxpdHRpbmcgcGFydGl0aW9uIHVwZGF0ZXMKLSAgLWNvbDo7OwotICAgIENvbHVtbiBkZXRhaWxzIHN1Y2ggYXMgc2l6ZSBhbmQgY291bnQgZGlzdHJpYnV0aW9uLCBkYXRhIGdlbmVyYXRvciwKLSAgICBuYW1lcywgY29tcGFyYXRvciBhbmQgaWYgc3VwZXIgY29sdW1ucyBzaG91bGQgYmUgdXNlZAotICAtcmF0ZTo7OwotICAgIFRocmVhZCBjb3VudCwgcmF0ZSBsaW1pdCBvciBhdXRvbWF0aWMgbW9kZSAoZGVmYXVsdCBpcyBhdXRvKQotICAtbW9kZTo7OwotICAgIFRocmlmdCBvciBDUUwgd2l0aCBvcHRpb25zCi0gIC1lcnJvcnM6OzsKLSAgICBIb3cgdG8gaGFuZGxlIGVycm9ycyB3aGVuIGVuY291bnRlcmVkIGR1cmluZyBzdHJlc3MKLSAgLXNhbXBsZTo7OwotICAgIFNwZWNpZnkgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIGNvbGxlY3QgZm9yIG1lYXN1cmluZyBsYXRlbmN5Ci0gIC1zY2hlbWE6OzsKLSAgICBSZXBsaWNhdGlvbiBzZXR0aW5ncywgY29tcHJlc3Npb24sIGNvbXBhY3Rpb24sIGV0Yy4KLSAgLW5vZGU6OzsKLSAgICBOb2RlcyB0byBjb25uZWN0IHRvCi0gIC1sb2c6OzsKLSAgICBXaGVyZSB0byBsb2cgcHJvZ3Jlc3MgdG8sIGFuZCB0aGUgaW50ZXJ2YWwgYXQgd2hpY2ggdG8gZG8gaXQKLSAgLXRyYW5zcG9ydDo7OwotICAgIEN1c3RvbSB0cmFuc3BvcnQgZmFjdG9yaWVzCi0gIC1wb3J0Ojs7Ci0gICAgVGhlIHBvcnQgdG8gY29ubmVjdCB0byBjYXNzYW5kcmEgbm9kZXMgb24KLSAgLWdyYXBoOjs7Ci0gICAgR3JhcGggcmVjb3JkZWQgbWV0cmljcwotICAtdG9rZW5yYW5nZTo7OwotICAgIFRva2VuIHJhbmdlIHNldHRpbmdzCi1TdWJvcHRpb25zOjo6Ci0gIEV2ZXJ5IGNvbW1hbmQgYW5kIHByaW1hcnkgb3B0aW9uIGhhcyBpdHMgb3duIGNvbGxlY3Rpb24gb2Ygc3Vib3B0aW9ucy4KLSAgVGhlc2UgYXJlIHRvbyBudW1lcm91cyB0byBsaXN0IGhlcmUuIEZvciBpbmZvcm1hdGlvbiBvbiB0aGUgc3Vib3B0aW9ucwotICBmb3IgZWFjaCBjb21tYW5kIG9yIG9wdGlvbiwgcGxlYXNlIHVzZSB0aGUgaGVscCBjb21tYW5kLAotICBgY2Fzc2FuZHJhLXN0cmVzcyBoZWxwIDxjb21tYW5kfG9wdGlvbj5gLgotCi09PSBVc2VyIG1vZGUKLQotVXNlciBtb2RlIGFsbG93cyB5b3UgdG8gc3RyZXNzIHlvdXIgb3duIHNjaGVtYXMsIHRvIHNhdmUgeW91IHRpbWUKLWluIHRoZSBsb25nIHJ1bi4gRmluZCBvdXQgaWYgeW91ciBhcHBsaWNhdGlvbiBjYW4gc2NhbGUgdXNpbmcgc3RyZXNzIHRlc3Qgd2l0aCB5b3VyIHNjaGVtYS4KLQotPT09IFByb2ZpbGUKLQotVXNlciBtb2RlIGRlZmluZXMgYSBwcm9maWxlIHVzaW5nIFlBTUwuIAotTXVsdGlwbGUgWUFNTCBmaWxlcyBtYXkgYmUgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIG9wZXJhdGlvbnMgaW4gdGhlIG9wcyBhcmd1bWVudCBhcmUgcmVmZXJlbmNlZCBhcwotc3BlY25hbWUub3BuYW1lLgotCi1BbiBpZGVudGlmaWVyIGZvciB0aGUgcHJvZmlsZToKLQotW3NvdXJjZSx5YW1sXQotLS0tLQotc3BlY25hbWU6IHN0YWZmX2FjdGl2aXRpZXMKLS0tLS0KLQotVGhlIGtleXNwYWNlIGZvciB0aGUgdGVzdDoKLQotW3NvdXJjZSx5YW1sXQotLS0tLQota2V5c3BhY2U6IHN0YWZmCi0tLS0tCi0KLUNRTCBmb3IgdGhlIGtleXNwYWNlLiBPcHRpb25hbCBpZiB0aGUga2V5c3BhY2UgYWxyZWFkeSBleGlzdHM6Ci0KLVtzb3VyY2UseWFtbF0KLS0tLS0KLWtleXNwYWNlX2RlZmluaXRpb246IHwKLSBDUkVBVEUgS0VZU1BBQ0Ugc3RyZXNzY3FsIFdJVEggcmVwbGljYXRpb24gPSB7J2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3Rvcic6IDN9OwotLS0tLQotCi1UaGUgdGFibGUgdG8gYmUgc3RyZXNzZWQ6Ci0KLVtzb3VyY2UseWFtbF0KLS0tLS0KLXRhYmxlOiBzdGFmZl9hY3Rpdml0aWVzCi0tLS0tCi0KLUNRTCBmb3IgdGhlIHRhYmxlLiBPcHRpb25hbCBpZiB0aGUgdGFibGUgYWxyZWFkeSBleGlzdHM6Ci0KLVtzb3VyY2UseWFtbF0KLS0tLS0KLXRhYmxlX2RlZmluaXRpb246IHwKLSAgQ1JFQVRFIFRBQkxFIHN0YWZmX2FjdGl2aXRpZXMgKAotICAgICAgbmFtZSB0ZXh0LAotICAgICAgd2hlbiB0aW1ldXVpZCwKLSAgICAgIHdoYXQgdGV4dCwKLSAgICAgIFBSSU1BUlkgS0VZKG5hbWUsIHdoZW4sIHdoYXQpCi0gICkgCi0tLS0tCi0KLU9wdGlvbmFsIG1ldGEtaW5mb3JtYXRpb24gb24gdGhlIGdlbmVyYXRlZCBjb2x1bW5zIGluIHRoZSBhYm92ZSB0YWJsZS4KLVRoZSBtaW4gYW5kIG1heCBvbmx5IGFwcGx5IHRvIHRleHQgYW5kIGJsb2IgdHlwZXMuIFRoZSBkaXN0cmlidXRpb24KLWZpZWxkIHJlcHJlc2VudHMgdGhlIHRvdGFsIHVuaXF1ZSBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBvZiB0aGF0IGNvbHVtbgotYWNyb3NzIHJvd3M6Ci0KLVtzb3VyY2UseWFtbF0KLS0tLS0KLWNvbHVtbnNwZWM6Ci0gIC0gbmFtZTogbmFtZQotICAgIHNpemU6IHVuaWZvcm0oNS4uMTApICMgVGhlIG5hbWVzIG9mIHRoZSBzdGFmZiBtZW1iZXJzIGFyZSBiZXR3ZWVuIDUtMTAgY2hhcmFjdGVycwotICAgIHBvcHVsYXRpb246IHVuaWZvcm0oMS4uMTApICMgMTAgcG9zc2libGUgc3RhZmYgbWVtYmVycyB0byBwaWNrIGZyb20KLSAgLSBuYW1lOiB3aGVuCi0gICAgY2x1c3RlcjogdW5pZm9ybSgyMC4uNTAwKSAjIFN0YWZmIG1lbWJlcnMgZG8gYmV0d2VlbiAyMCBhbmQgNTAwIGV2ZW50cwotICAtIG5hbWU6IHdoYXQKLSAgICBzaXplOiBub3JtYWwoMTAuLjEwMCw1MCkKLS0tLS0KLQotU3VwcG9ydGVkIHR5cGVzIGFyZToKLQotQW4gZXhwb25lbnRpYWwgZGlzdHJpYnV0aW9uIG92ZXIgdGhlIHJhbmdlIFttaW4uLm1heF06Ci0KLVtzb3VyY2UseWFtbF0KLS0tLS0KLUVYUChtaW4uLm1heCkKLS0tLS0KLQotQW4gZXh0cmVtZSB2YWx1ZSAoV2VpYnVsbCkgZGlzdHJpYnV0aW9uIG92ZXIgdGhlIHJhbmdlIFttaW4uLm1heF06Ci0KLVtzb3VyY2UseWFtbF0KLS0tLS0KLUVYVFJFTUUobWluLi5tYXgsc2hhcGUpCi0tLS0tCi0KLUEgZ2F1c3NpYW4vbm9ybWFsIGRpc3RyaWJ1dGlvbiwgd2hlcmUgbWVhbj0obWluK21heCkvMiwgYW5kIHN0ZGV2IGlzCi0obWVhbi1taW4pL3N0ZHZybmc6Ci0KLVtzb3VyY2UseWFtbF0KLS0tLS0KLUdBVVNTSUFOKG1pbi4ubWF4LHN0ZHZybmcpCi0tLS0tCi0KLUEgZ2F1c3NpYW4vbm9ybWFsIGRpc3RyaWJ1dGlvbiwgd2l0aCBleHBsaWNpdGx5IGRlZmluZWQgbWVhbiBhbmQgc3RkZXY6Ci0KLVtzb3VyY2UseWFtbF0KLS0tLS0KLUdBVVNTSUFOKG1pbi4ubWF4LG1lYW4sc3RkZXYpCi0tLS0tCi0KLUEgdW5pZm9ybSBkaXN0cmlidXRpb24gb3ZlciB0aGUgcmFuZ2UgW21pbiwgbWF4XToKLQotW3NvdXJjZSx5YW1sXQotLS0tLQotVU5JRk9STShtaW4uLm1heCkKLS0tLS0KLQotQSBmaXhlZCBkaXN0cmlidXRpb24sIGFsd2F5cyByZXR1cm5pbmcgdGhlIHNhbWUgdmFsdWU6Ci0KLVtzb3VyY2UseWFtbF0KLS0tLS0KLUZJWEVEKHZhbCkKLS0tLS0KLQotSWYgcHJlY2VkZWQgYnkgfiwgdGhlIGRpc3RyaWJ1dGlvbiBpcyBpbnZlcnRlZAotCi1EZWZhdWx0cyBmb3IgYWxsIGNvbHVtbnMgYXJlIHNpemU6IHVuaWZvcm0oNC4uOCksIHBvcHVsYXRpb246Ci11bmlmb3JtKDEuLjEwMEIpLCBjbHVzdGVyOiBmaXhlZCgxKQotCi1JbnNlcnQgZGlzdHJpYnV0aW9uczoKLQotW3NvdXJjZSx5YW1sXQotLS0tLQotaW5zZXJ0OgotICAjIEhvdyBtYW55IHBhcnRpdGlvbiB0byBpbnNlcnQgcGVyIGJhdGNoCi0gIHBhcnRpdGlvbnM6IGZpeGVkKDEpCi0gICMgSG93IG1hbnkgcm93cyB0byB1cGRhdGUgcGVyIHBhcnRpdGlvbgotICBzZWxlY3Q6IGZpeGVkKDEpLzUwMAotICAjIFVOTE9HR0VEIG9yIExPR0dFRCBiYXRjaCBmb3IgaW5zZXJ0Ci0gIGJhdGNodHlwZTogVU5MT0dHRUQKLS0tLS0KLQotQ3VycmVudGx5IGFsbCBpbnNlcnRzIGFyZSBkb25lIGluc2lkZSBiYXRjaGVzLgotCi1SZWFkIHN0YXRlbWVudHMgdG8gdXNlIGR1cmluZyB0aGUgdGVzdDoKLQotW3NvdXJjZSx5YW1sXQotLS0tLQotcXVlcmllczoKLSAgIGV2ZW50czoKLSAgICAgIGNxbDogc2VsZWN0ICogIGZyb20gc3RhZmZfYWN0aXZpdGllcyB3aGVyZSBuYW1lID0gPwotICAgICAgZmllbGRzOiBzYW1lcm93Ci0gICBsYXRlc3RfZXZlbnQ6Ci0gICAgICBjcWw6IHNlbGVjdCAqIGZyb20gc3RhZmZfYWN0aXZpdGllcyB3aGVyZSBuYW1lID0gPyAgTElNSVQgMQotICAgICAgZmllbGRzOiBzYW1lcm93Ci0tLS0tCi0KLVJ1bm5pbmcgYSB1c2VyIG1vZGUgdGVzdDoKLQotW3NvdXJjZSx5YW1sXQotLS0tLQotY2Fzc2FuZHJhLXN0cmVzcyB1c2VyIHByb2ZpbGU9Li9leGFtcGxlLnlhbWwgZHVyYXRpb249MW0gIm9wcyhpbnNlcnQ9MSxsYXRlc3RfZXZlbnQ9MSxldmVudHM9MSkiIHRydW5jYXRlPW9uY2UKLS0tLS0KLQotVGhpcyB3aWxsIGNyZWF0ZSB0aGUgc2NoZW1hIHRoZW4gcnVuIHRlc3RzIGZvciAxIG1pbnV0ZSB3aXRoIGFuIGVxdWFsCi1udW1iZXIgb2YgaW5zZXJ0cywgbGF0ZXN0X2V2ZW50IHF1ZXJpZXMgYW5kIGV2ZW50cyBxdWVyaWVzLiBBZGRpdGlvbmFsbHkKLXRoZSB0YWJsZSB3aWxsIGJlIHRydW5jYXRlZCBvbmNlIGJlZm9yZSB0aGUgdGVzdC4KLQotVGhlIGZ1bGwgZXhhbXBsZSBjYW4gYmUgZm91bmQgaGVyZToKLVtzb3VyY2UsIHlhbWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJFlBTUwvc3RyZXNzLWV4YW1wbGUueWFtbFtdCi0tLS0tIAotCi1SdW5uaW5nIGEgdXNlciBtb2RlIHRlc3Qgd2l0aCBtdWx0aXBsZSB5YW1sIGZpbGVzOjo6OgotICBjYXNzYW5kcmEtc3RyZXNzIHVzZXIgcHJvZmlsZT0uL2V4YW1wbGUueWFtbCwuL2V4YW1wbGUyLnlhbWwKLSAgZHVyYXRpb249MW0gIm9wcyhleDEuaW5zZXJ0PTEsZXgxLmxhdGVzdF9ldmVudD0xLGV4Mi5pbnNlcnQ9MikiCi0gIHRydW5jYXRlPW9uY2UKLVRoaXMgd2lsbCBydW4gb3BlcmF0aW9ucyBhcyBzcGVjaWZpZWQgaW4gYm90aCB0aGUgZXhhbXBsZS55YW1sIGFuZAotZXhhbXBsZTIueWFtbCBmaWxlcy4gZXhhbXBsZS55YW1sIGFuZCBleGFtcGxlMi55YW1sIGNhbiByZWZlcmVuY2UgdGhlCi1zYW1lIHRhYmxlLCBhbHRob3VnaCBjYXJlIG11c3QgYmUgdGFrZW4gdGhhdCB0aGUgdGFibGUgZGVmaW5pdGlvbiBpcyBpZGVudGljYWwKLSAoZGF0YSBnZW5lcmF0aW9uIHNwZWNzIGNhbiBiZSBkaWZmZXJlbnQpLgotCi09PT0gTGlnaHR3ZWlnaHQgdHJhbnNhY3Rpb24gc3VwcG9ydAotCi1jYXNzYW5kcmEtc3RyZXNzIHN1cHBvcnRzIGxpZ2h0d2VpZ2h0IHRyYW5zYWN0aW9ucy4gCi1UbyB1c2UgdGhpcyBmZWF0dXJlLCB0aGUgY29tbWFuZCB3aWxsIGZpcnN0IHJlYWQgY3VycmVudCBkYXRhIGZyb20gQ2Fzc2FuZHJhLCBhbmQgdGhlbiB1c2VzIHJlYWQgdmFsdWVzIHRvCi1mdWxmaWxsIGxpZ2h0d2VpZ2h0IHRyYW5zYWN0aW9uIGNvbmRpdGlvbnMuCi0KLUxpZ2h0d2VpZ2h0IHRyYW5zYWN0aW9uIHVwZGF0ZSBxdWVyeToKLQotW3NvdXJjZSx5YW1sXQotLS0tLQotcXVlcmllczoKLSAgcmVndWxhcnVwZGF0ZToKLSAgICAgIGNxbDogdXBkYXRlIGJsb2dwb3N0cyBzZXQgYXV0aG9yID0gPyB3aGVyZSBkb21haW4gPSA/IGFuZCBwdWJsaXNoZWRfZGF0ZSA9ID8KLSAgICAgIGZpZWxkczogc2FtZXJvdwotICB1cGRhdGV3aXRobHd0OgotICAgICAgY3FsOiB1cGRhdGUgYmxvZ3Bvc3RzIHNldCBhdXRob3IgPSA/IHdoZXJlIGRvbWFpbiA9ID8gYW5kIHB1Ymxpc2hlZF9kYXRlID0gPyBJRiBib2R5ID0gPyBBTkQgdXJsID0gPwotICAgICAgZmllbGRzOiBzYW1lcm93Ci0tLS0tCi0KLVRoZSBmdWxsIGV4YW1wbGUgY2FuIGJlIGZvdW5kIGhlcmU6Ci1bc291cmNlLCB5YW1sXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRZQU1ML3N0cmVzcy1sd3QtZXhhbXBsZS55YW1sW10KLS0tLS0KLQotPT0gR3JhcGhpbmcKLQotR3JhcGhzIGNhbiBiZSBnZW5lcmF0ZWQgZm9yIGVhY2ggcnVuIG9mIHN0cmVzcy4KLQotaW1hZ2U6OmV4YW1wbGUtc3RyZXNzLWdyYXBoLnBuZ1tleGFtcGxlIGNhc3NhbmRyYS1zdHJlc3MgZ3JhcGhdCi0KLVRvIGNyZWF0ZSBhIG5ldyBncmFwaDoKLQotW3NvdXJjZSx5YW1sXQotLS0tLQotY2Fzc2FuZHJhLXN0cmVzcyB1c2VyIHByb2ZpbGU9Li9zdHJlc3MtZXhhbXBsZS55YW1sICJvcHMoaW5zZXJ0PTEsbGF0ZXN0X2V2ZW50PTEsZXZlbnRzPTEpIiAtZ3JhcGggZmlsZT1ncmFwaC5odG1sIHRpdGxlPSJBd2Vzb21lIGdyYXBoIgotLS0tLQotCi1UbyBhZGQgYSBuZXcgcnVuIHRvIGFuIGV4aXN0aW5nIGdyYXBoIHBvaW50IHRvIGFuIGV4aXN0aW5nIGZpbGUgYW5kIGFkZAotYSByZXZpc2lvbiBuYW1lOgotCi1bc291cmNlLHlhbWxdCi0tLS0tCi1jYXNzYW5kcmEtc3RyZXNzIHVzZXIgcHJvZmlsZT0uL3N0cmVzcy1leGFtcGxlLnlhbWwgZHVyYXRpb249MW0gIm9wcyhpbnNlcnQ9MSxsYXRlc3RfZXZlbnQ9MSxldmVudHM9MSkiIC1ncmFwaCBmaWxlPWdyYXBoLmh0bWwgdGl0bGU9IkF3ZXNvbWUgZ3JhcGgiIHJldmlzaW9uPSJTZWNvbmQgcnVuIgotLS0tLQotCi09PSBGQVEKLQotKkhvdyBkbyB5b3UgdXNlIE5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5IGZvciB0aGUga2V5c3BhY2U/KgotCi1Vc2UgdGhlIHNjaGVtYSBvcHRpb24gbWFraW5nIHN1cmUgdG8gZWl0aGVyIGVzY2FwZSB0aGUgcGFyZW50aGVzaXMgb3IKLWVuY2xvc2UgaW4gcXVvdGVzOgotCi1bc291cmNlLHlhbWxdCi0tLS0tCi1jYXNzYW5kcmEtc3RyZXNzIHdyaXRlIC1zY2hlbWEgInJlcGxpY2F0aW9uKHN0cmF0ZWd5PU5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5LGRhdGFjZW50ZXIxPTMpIgotLS0tLQotCi0qSG93IGRvIHlvdSB1c2UgU1NMPyoKLQotVXNlIHRoZSB0cmFuc3BvcnQgb3B0aW9uOgotCi1bc291cmNlLHlhbWxdCi0tLS0tCi1jYXNzYW5kcmEtc3RyZXNzICJ3cml0ZSBuPTEwMGsgY2w9T05FIG5vLXdhcm11cCIgLXRyYW5zcG9ydCAidHJ1c3RzdG9yZT0kSE9NRS9qa3MvdHJ1c3RzdG9yZS5qa3MgdHJ1c3RzdG9yZS1wYXNzd29yZD1jYXNzYW5kcmEiCi0tLS0tCi0KLSpJcyBDYXNzYW5kcmEgU3RyZXNzIGEgc2VjdXJlZCB0b29sPyoKLQotQ2Fzc2FuZHJhIHN0cmVzcyBpcyBub3QgYSBzZWN1cmVkIHRvb2wuIFNlcmlhbGl6YXRpb24gYW5kIG90aGVyIGFzcGVjdHMKLW9mIHRoZSB0b29sIG9mZmVyIG5vIHNlY3VyaXR5IGd1YXJhbnRlZXMuCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvY3Fsc2guYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29scy9jcWxzaC5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDUwZWU1Li4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29scy9jcWxzaC5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsNTAyICswLDAgQEAKLT0gY3Fsc2g6IHRoZSBDUUwgc2hlbGwKLQotYGNxbHNoYCBpcyBhIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UgZm9yIGludGVyYWN0aW5nIHdpdGggQ2Fzc2FuZHJhIHVzaW5nIENRTCAodGhlIENhc3NhbmRyYSBRdWVyeSBMYW5ndWFnZSkuIAotSXQgaXMgc2hpcHBlZCB3aXRoIGV2ZXJ5IENhc3NhbmRyYSBwYWNrYWdlLCBhbmQgY2FuIGJlIGZvdW5kIGluIHRoZSBiaW4vIGRpcmVjdG9yeSBhbG9uZ3NpZGUgdGhlIGNhc3NhbmRyYQotZXhlY3V0YWJsZS4gCi1gY3Fsc2hgIGlzIGltcGxlbWVudGVkIHdpdGggdGhlIFB5dGhvbiBuYXRpdmUgcHJvdG9jb2wgZHJpdmVyLCBhbmQgY29ubmVjdHMgdG8gdGhlIHNpbmdsZSBzcGVjaWZpZWQgbm9kZS4KLQotPT0gQ29tcGF0aWJpbGl0eQotCi1gY3Fsc2hgIGlzIGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi43LgotCi1JbiBnZW5lcmFsLCBhIGdpdmVuIHZlcnNpb24gb2YgYGNxbHNoYCBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gd29yayB3aXRoIHRoZQotdmVyc2lvbiBvZiBDYXNzYW5kcmEgdGhhdCBpdCB3YXMgcmVsZWFzZWQgd2l0aC4gCi1JbiBzb21lIGNhc2VzLCBgY3Fsc2hgIG1heSB3b3JrIHdpdGggb2xkZXIgb3IgbmV3ZXIgdmVyc2lvbnMgb2YgQ2Fzc2FuZHJhLCBidXQgdGhpcyBpcyBub3QKLW9mZmljaWFsbHkgc3VwcG9ydGVkLgotCi09PSBPcHRpb25hbCBEZXBlbmRlbmNpZXMKLQotYGNxbHNoYCBzaGlwcyB3aXRoIGFsbCBlc3NlbnRpYWwgZGVwZW5kZW5jaWVzLiBIb3dldmVyLCB0aGVyZSBhcmUgc29tZQotb3B0aW9uYWwgZGVwZW5kZW5jaWVzIHRoYXQgY2FuIGJlIGluc3RhbGxlZCB0byBpbXByb3ZlIHRoZSBjYXBhYmlsaXRpZXMKLW9mIGBjcWxzaGAuCi0KLT09PSBweXR6Ci0KLUJ5IGRlZmF1bHQsIGBjcWxzaGAgZGlzcGxheXMgYWxsIHRpbWVzdGFtcHMgd2l0aCBhIFVUQyB0aW1lem9uZS4gCi1UbyBzdXBwb3J0IGRpc3BsYXkgb2YgdGltZXN0YW1wcyB3aXRoIGFub3RoZXIgdGltZXpvbmUsIGluc3RhbGwKLXRoZSBodHRwOi8vcHl0ei5zb3VyY2Vmb3JnZS5uZXQvW3B5dHpdIGxpYnJhcnkuIAotU2VlIHRoZSBgdGltZXpvbmVgIG9wdGlvbiBpbiB4cmVmOmNxbC90b29scy9jcWxzaC5hZG9jI2NxbHNocmNbY3Fsc2hyY10gZm9yIHNwZWNpZnlpbmcgYSB0aW1lem9uZSB0bwotdXNlLgotCi09PT0gY3l0aG9uCi0KLVRoZSBwZXJmb3JtYW5jZSBvZiBjcWxzaCdzIGBDT1BZYCBvcGVyYXRpb25zIGNhbiBiZSBpbXByb3ZlZCBieQotaW5zdGFsbGluZyBodHRwOi8vY3l0aG9uLm9yZy9bY3l0aG9uXS4gVGhpcyB3aWxsIGNvbXBpbGUgdGhlIHB5dGhvbgotbW9kdWxlcyB0aGF0IGFyZSBjZW50cmFsIHRvIHRoZSBwZXJmb3JtYW5jZSBvZiBgQ09QWWAuCi0KLVtbY3Fsc2hyY11dCi09PSBjcWxzaHJjCi0KLVRoZSBgY3Fsc2hyY2AgZmlsZSBob2xkcyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGBjcWxzaGAuIAotQnkgZGVmYXVsdCwgdGhlIGZpbGUgaXMgbG9jYWd0ZWQgdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSBhdCBgfi8uY2Fzc2FuZHJhL2NxbHNoYCwgYnV0IGEKLWN1c3RvbSBsb2NhdGlvbiBjYW4gYmUgc3BlY2lmaWVkIHdpdGggdGhlIGAtLWNxbHNocmNgIG9wdGlvbi4KLQotRXhhbXBsZSBjb25maWcgdmFsdWVzIGFuZCBkb2N1bWVudGF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0aGUKLWBjb25mL2NxbHNocmMuc2FtcGxlYCBmaWxlIG9mIGEgdGFyYmFsbCBpbnN0YWxsYXRpb24uIAotWW91IGNhbiBhbHNvIHZpZXcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZQotaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEvYmxvYi90cnVuay9jb25mL2NxbHNocmMuc2FtcGxlW2NxbHNocmMgZmlsZSBvbmxpbmVdLgotCi1bW2NxbF9oaXN0b3J5XV0KLT09IGNxbCBoaXN0b3J5Ci0KLUFsbCBDUUwgY29tbWFuZHMgeW91IGV4ZWN1dGUgYXJlIHdyaXR0ZW4gdG8gYSBoaXN0b3J5IGZpbGUuIEJ5IGRlZmF1bHQsIENRTCBoaXN0b3J5IHdpbGwgYmUgd3JpdHRlbiB0byBgfi8uY2Fzc2FuZHJhL2NxbF9oaXN0b3J5YC4gWW91IGNhbiBjaGFuZ2UgdGhpcyBkZWZhdWx0IGJ5IHNldHRpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGBDUUxfSElTVE9SWWAgbGlrZSBgfi9zb21lL290aGVyL3BhdGgvdG8vY3Fsc2hfaGlzdG9yeWAgd2hlcmUgYGNxbHNoX2hpc3RvcnlgIGlzIGEgZmlsZS4gQWxsIHBhcmVudCBkaXJlY3RvcmllcyB0byBoaXN0b3J5IGZpbGUgd2lsbCBiZSBjcmVhdGVkIGlmIHRoZXkgZG8gbm90IGV4aXN0LiBJZiB5b3UgZG8gbm90IHdhbnQgdG8gcGVyc2lzdCBoaXN0b3J5LCB5b3UgY2FuIGRvIHNvIGJ5IHNldHRpbmcgQ1FMX0hJU1RPUlkgdG8gL2Rldi9udWxsLgotVGhpcyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBmcm9tIENhc3NhbmRyYSA0LjEuCi0KLT09IENvbW1hbmQgTGluZSBPcHRpb25zCi0KLVVzYWdlOiBgY3Fsc2gucHkgW29wdGlvbnNdIFtob3N0IFtwb3J0XV1gCi0KLUNRTCBTaGVsbCBmb3IgQXBhY2hlIENhc3NhbmRyYQotCi1PcHRpb25zOgotCi1gLS12ZXJzaW9uYDo6Ci0gIHNob3cgcHJvZ3JhbSdzIHZlcnNpb24gbnVtYmVyIGFuZCBleGl0Ci0KLWAtaGAgYC0taGVscGA6OgotICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0Ci1gLUNgIGAtLWNvbG9yYDo6Ci0gIEFsd2F5cyB1c2UgY29sb3Igb3V0cHV0Ci1gLS1uby1jb2xvcmA6OgotICBOZXZlciB1c2UgY29sb3Igb3V0cHV0Ci1gLS1icm93c2VyPUJST1dTRVJgOjoKLSAgVGhlIGJyb3dzZXIgdG8gdXNlIHRvIGRpc3BsYXkgQ1FMIGhlbHAsIHdoZXJlIEJST1dTRVIgY2FuIGJlOgotICBvbmUgb2YgdGhlIHN1cHBvcnRlZCBicm93c2VycyBpbiBodHRwczovL2RvY3MucHl0aG9uLm9yZy8zL2xpYnJhcnkvd2ViYnJvd3Nlci5odG1sLgotICBicm93c2VyIHBhdGggZm9sbG93ZWQgYnkgJXMsIGV4YW1wbGU6IC91c3IvYmluL2dvb2dsZS1jaHJvbWUtc3RhYmxlICVzCi1gLS1zc2xgOjoKLSAgVXNlIFNTTAotCi1gLXUgVVNFUk5BTUVgIGAtLXVzZXJuYW1lPVVTRVJOQU1FYDo6Ci0gIEF1dGhlbnRpY2F0ZSBhcyB1c2VyLgotYC1wIFBBU1NXT1JEYCBgLS1wYXNzd29yZD1QQVNTV09SRGA6OgotICBBdXRoZW50aWNhdGUgdXNpbmcgcGFzc3dvcmQuCi1gLWsgS0VZU1BBQ0VgIGAtLWtleXNwYWNlPUtFWVNQQUNFYDo6Ci0gIEF1dGhlbnRpY2F0ZSB0byB0aGUgZ2l2ZW4ga2V5c3BhY2UuCi1gLWYgRklMRWAgYC0tZmlsZT1GSUxFYDo6Ci0gIEV4ZWN1dGUgY29tbWFuZHMgZnJvbSBGSUxFLCB0aGVuIGV4aXQKLWAtLWRlYnVnYDo6Ci0gIFNob3cgYWRkaXRpb25hbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLWAtLWNvdmVyYWdlYDo6Ci0gIENvbGxlY3QgY292ZXJhZ2UgZGF0YQotYC0tZW5jb2Rpbmc9RU5DT0RJTkdgOjoKLSAgU3BlY2lmeSBhIG5vbi1kZWZhdWx0IGVuY29kaW5nIGZvciBvdXRwdXQuIChEZWZhdWx0OiB1dGYtOCkKLWAtLWNxbHNocmM9Q1FMU0hSQ2A6OgotICBTcGVjaWZ5IGFuIGFsdGVybmF0aXZlIGNxbHNocmMgZmlsZSBsb2NhdGlvbi4KLWAtLWNyZWRlbnRpYWxzPUNSRURFTlRJQUxTYDo6Ci0gIFNwZWNpZnkgYW4gYWx0ZXJuYXRpdmUgY3JlZGVudGlhbHMgZmlsZSBsb2NhdGlvbi4KLWAtLWNxbHZlcnNpb249Q1FMVkVSU0lPTmA6OgotICBTcGVjaWZ5IGEgcGFydGljdWxhciBDUUwgdmVyc2lvbiwgYnkgZGVmYXVsdCB0aGUKLSAgaGlnaGVzdCB2ZXJzaW9uIHN1cHBvcnRlZCBieSB0aGUgc2VydmVyIHdpbGwgYmUgdXNlZC4KLSAgRXhhbXBsZXM6ICIzLjAuMyIsICIzLjEuMCIKLWAtLXByb3RvY29sLXZlcnNpb249UFJPVE9DT0xfVkVSU0lPTmA6OgotICBTcGVjaWZ5IGEgc3BlY2lmaWMgcHJvdGNvbCB2ZXJzaW9uIG90aGVyd2lzZSB0aGUKLSAgY2xpZW50IHdpbGwgZGVmYXVsdCBhbmQgZG93bmdyYWRlIGFzIG5lY2Vzc2FyeQotYC1lIEVYRUNVVEVgIGAtLWV4ZWN1dGU9RVhFQ1VURWA6OgotICBFeGVjdXRlIHRoZSBzdGF0ZW1lbnQgYW5kIHF1aXQuCi1gLS1jb25uZWN0LXRpbWVvdXQ9Q09OTkVDVF9USU1FT1VUYDo6Ci0gIFNwZWNpZnkgdGhlIGNvbm5lY3Rpb24gdGltZW91dCBpbiBzZWNvbmRzIChkZWZhdWx0OiA1IHNlY29uZHMpLgotYC0tcmVxdWVzdC10aW1lb3V0PVJFUVVFU1RfVElNRU9VVGA6OgotICBTcGVjaWZ5IHRoZSBkZWZhdWx0IHJlcXVlc3QgdGltZW91dCBpbiBzZWNvbmRzCi0gIChkZWZhdWx0OiAxMCBzZWNvbmRzKS4KLWAtdCwgLS10dHlgOjoKLSAgRm9yY2UgdHR5IG1vZGUgKGNvbW1hbmQgcHJvbXB0KS4KLWAtdmAgYC0tdmA6OgotICBQcmludCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIGNxbHNoLgotCi09PSBTcGVjaWFsIENvbW1hbmRzCi0KLUluIGFkZGl0aW9uIHRvIHN1cHBvcnRpbmcgcmVndWxhciBDUUwgc3RhdGVtZW50cywgYGNxbHNoYCBhbHNvIHN1cHBvcnRzIGEKLW51bWJlciBvZiBzcGVjaWFsIGNvbW1hbmRzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIENRTC4gVGhlc2UgYXJlIGRldGFpbGVkCi1iZWxvdy4KLQotPT09IGBDT05TSVNURU5DWWAKLQotYFVzYWdlYDogYENPTlNJU1RFTkNZIDxjb25zaXN0ZW5jeSBsZXZlbD5gCi0KLVNldHMgdGhlIGNvbnNpc3RlbmN5IGxldmVsIGZvciBvcGVyYXRpb25zIHRvIGZvbGxvdy4gVmFsaWQgYXJndW1lbnRzCi1pbmNsdWRlOgotCi0qIGBBTllgCi0qIGBPTkVgCi0qIGBUV09gCi0qIGBUSFJFRWAKLSogYFFVT1JVTWAKLSogYEFMTGAKLSogYExPQ0FMX1FVT1JVTWAKLSogYExPQ0FMX09ORWAKLSogYFNFUklBTGAKLSogYExPQ0FMX1NFUklBTGAKLQotPT09IGBTRVJJQUwgQ09OU0lTVEVOQ1lgCi0KLWBVc2FnZWA6IGBTRVJJQUwgQ09OU0lTVEVOQ1kgPGNvbnNpc3RlbmN5IGxldmVsPmAKLQotU2V0cyB0aGUgc2VyaWFsIGNvbnNpc3RlbmN5IGxldmVsIGZvciBvcGVyYXRpb25zIHRvIGZvbGxvdy4gVmFsaWQKLWFyZ3VtZW50cyBpbmNsdWRlOgotCi0qIGBTRVJJQUxgCi0qIGBMT0NBTF9TRVJJQUxgCi0KLVRoZSBzZXJpYWwgY29uc2lzdGVuY3kgbGV2ZWwgaXMgb25seSB1c2VkIGJ5IGNvbmRpdGlvbmFsIHVwZGF0ZXMKLShgSU5TRVJUYCwgYFVQREFURWAgYW5kIGBERUxFVEVgIHdpdGggYW4gYElGYCBjb25kaXRpb24pLiBGb3IgdGhvc2UsIHRoZQotc2VyaWFsIGNvbnNpc3RlbmN5IGxldmVsIGRlZmluZXMgdGhlIGNvbnNpc3RlbmN5IGxldmVsIG9mIHRoZSBzZXJpYWwKLXBoYXNlIChvciDigJxwYXhvc+KAnSBwaGFzZSkgd2hpbGUgdGhlIG5vcm1hbCBjb25zaXN0ZW5jeSBsZXZlbCBkZWZpbmVzIHRoZQotY29uc2lzdGVuY3kgZm9yIHRoZSDigJxsZWFybuKAnSBwaGFzZSwgaS5lLiB3aGF0IHR5cGUgb2YgcmVhZHMgd2lsbCBiZQotZ3VhcmFudGVlZCB0byBzZWUgdGhlIHVwZGF0ZSByaWdodCBhd2F5LiBGb3IgZXhhbXBsZSwgaWYgYSBjb25kaXRpb25hbAotd3JpdGUgaGFzIGEgY29uc2lzdGVuY3kgbGV2ZWwgb2YgYFFVT1JVTWAgKGFuZCBpcyBzdWNjZXNzZnVsKSwgdGhlbiBhCi1gUVVPUlVNYCByZWFkIGlzIGd1YXJhbnRlZWQgdG8gc2VlIHRoYXQgd3JpdGUuIEJ1dCBpZiB0aGUgcmVndWxhcgotY29uc2lzdGVuY3kgbGV2ZWwgb2YgdGhhdCB3cml0ZSBpcyBgQU5ZYCwgdGhlbiBvbmx5IGEgcmVhZCB3aXRoIGEKLWNvbnNpc3RlbmN5IGxldmVsIG9mIGBTRVJJQUxgIGlzIGd1YXJhbnRlZWQgdG8gc2VlIGl0IChldmVuIGEgcmVhZCB3aXRoCi1jb25zaXN0ZW5jeSBgQUxMYCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBlbm91Z2gpLgotCi09PT0gYFNIT1cgVkVSU0lPTmAKLQotUHJpbnRzIHRoZSBgY3Fsc2hgLCBDYXNzYW5kcmEsIENRTCwgYW5kIG5hdGl2ZSBwcm90b2NvbCB2ZXJzaW9ucyBpbiB1c2UuCi1FeGFtcGxlOgotCi1bc291cmNlLG5vbmVdCi0tLS0tCi1jcWxzaD4gU0hPVyBWRVJTSU9OCi1bY3Fsc2ggNS4wLjEgfCBDYXNzYW5kcmEgMy44IHwgQ1FMIHNwZWMgMy40LjIgfCBOYXRpdmUgcHJvdG9jb2wgdjRdCi0tLS0tCi0KLT09PSBgU0hPVyBIT1NUYAotCi1QcmludHMgdGhlIElQIGFkZHJlc3MgYW5kIHBvcnQgb2YgdGhlIENhc3NhbmRyYSBub2RlIHRoYXQgYGNxbHNoYCBpcwotY29ubmVjdGVkIHRvIGluIGFkZGl0aW9uIHRvIHRoZSBjbHVzdGVyIG5hbWUuIEV4YW1wbGU6Ci0KLVtzb3VyY2Usbm9uZV0KLS0tLS0KLWNxbHNoPiBTSE9XIEhPU1QKLUNvbm5lY3RlZCB0byBQcm9kX0NsdXN0ZXIgYXQgMTkyLjAuMC4xOjkwNDIuCi0tLS0tCi0KLT09PSBgU0hPVyBTRVNTSU9OYAotCi1QcmV0dHkgcHJpbnRzIGEgc3BlY2lmaWMgdHJhY2luZyBzZXNzaW9uLgotCi1gVXNhZ2VgOiBgU0hPVyBTRVNTSU9OIDxzZXNzaW9uIGlkPmAKLQotRXhhbXBsZSB1c2FnZToKLQotW3NvdXJjZSxub25lXQotLS0tLQotY3Fsc2g+IFNIT1cgU0VTU0lPTiA5NWFjNjQ3MC0zMjdlLTExZTYtYmVjYS1kZmI2NjBkOTJhZDgKLQotVHJhY2luZyBzZXNzaW9uOiA5NWFjNjQ3MC0zMjdlLTExZTYtYmVjYS1kZmI2NjBkOTJhZDgKLQotIGFjdGl2aXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRpbWVzdGFtcCAgICAgICAgICAgICAgICAgIHwgc291cmNlICAgIHwgc291cmNlX2VsYXBzZWQgfCBjbGllbnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dGUgQ1FMMyBxdWVyeSB8IDIwMTYtMDYtMTQgMTc6MjM6MTMuOTc5MDAwIHwgMTI3LjAuMC4xIHwgICAgICAgICAgICAgIDAgfCAxMjcuMC4wLjEKLSBQYXJzaW5nIFNFTEVDVCAqIEZST00gc3lzdGVtLmxvY2FsOyBbU2hhcmVkUG9vbC1Xb3JrZXItMV0gfCAyMDE2LTA2LTE0IDE3OjIzOjEzLjk4MjAwMCB8IDEyNy4wLjAuMSB8ICAgICAgICAgICAzODQzIHwgMTI3LjAuMC4xCi0uLi4KLS0tLS0KLQotPT09IGBTT1VSQ0VgCi0KLVJlYWRzIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgYW5kIGV4ZWN1dGVzIGVhY2ggbGluZSBhcyBhIENRTCBzdGF0ZW1lbnQKLW9yIHNwZWNpYWwgY3Fsc2ggY29tbWFuZC4KLQotYFVzYWdlYDogYFNPVVJDRSA8c3RyaW5nIGZpbGVuYW1lPmAKLQotRXhhbXBsZSB1c2FnZToKLQotW3NvdXJjZSxub25lXQotLS0tLQotY3Fsc2g+IFNPVVJDRSAnL2hvbWUvY2FsdmluaG9iYnMvY29tbWFuZHMuY3FsJwotLS0tLQotCi09PT0gYENBUFRVUkVgCi0KLUJlZ2lucyBjYXB0dXJpbmcgY29tbWFuZCBvdXRwdXQgYW5kIGFwcGVuZGluZyBpdCB0byBhIHNwZWNpZmllZCBmaWxlLgotT3V0cHV0IHdpbGwgbm90IGJlIHNob3duIGF0IHRoZSBjb25zb2xlIHdoaWxlIGl0IGlzIGNhcHR1cmVkLgotCi1gVXNhZ2VgOgotCi1bc291cmNlLG5vbmVdCi0tLS0tCi1DQVBUVVJFICc8ZmlsZT4nOwotQ0FQVFVSRSBPRkY7Ci1DQVBUVVJFOwotLS0tLQotCi1UaGF0IGlzLCB0aGUgcGF0aCB0byB0aGUgZmlsZSB0byBiZSBhcHBlbmRlZCB0byBtdXN0IGJlIGdpdmVuIGluc2lkZSBhCi1zdHJpbmcgbGl0ZXJhbC4gVGhlIHBhdGggaXMgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZwotZGlyZWN0b3J5LiBUaGUgdGlsZGUgc2hvcnRoYW5kIG5vdGF0aW9uIChgJ34vbXlkaXInYCkgaXMgc3VwcG9ydGVkIGZvcgotcmVmZXJyaW5nIHRvIGAkSE9NRWAuCi0KLU9ubHkgcXVlcnkgcmVzdWx0IG91dHB1dCBpcyBjYXB0dXJlZC4gRXJyb3JzIGFuZCBvdXRwdXQgZnJvbSBjcWxzaC1vbmx5Ci1jb21tYW5kcyB3aWxsIHN0aWxsIGJlIHNob3duIGluIHRoZSBjcWxzaCBzZXNzaW9uLgotCi1UbyBzdG9wIGNhcHR1cmluZyBvdXRwdXQgYW5kIHNob3cgaXQgaW4gdGhlIGNxbHNoIHNlc3Npb24gYWdhaW4sIHVzZQotYENBUFRVUkUgT0ZGYC4KLQotVG8gaW5zcGVjdCB0aGUgY3VycmVudCBjYXB0dXJlIGNvbmZpZ3VyYXRpb24sIHVzZSBgQ0FQVFVSRWAgd2l0aCBubwotYXJndW1lbnRzLgotCi09PT0gYEhFTFBgCi0KLUdpdmVzIGluZm9ybWF0aW9uIGFib3V0IGNxbHNoIGNvbW1hbmRzLiBUbyBzZWUgYXZhaWxhYmxlIHRvcGljcywgZW50ZXIKLWBIRUxQYCB3aXRob3V0IGFueSBhcmd1bWVudHMuIFRvIHNlZSBoZWxwIG9uIGEgdG9waWMsIHVzZQotYEhFTFAgPHRvcGljPmAuIEFsc28gc2VlIHRoZSBgLS1icm93c2VyYCBhcmd1bWVudCBmb3IgY29udHJvbGxpbmcgd2hhdAotYnJvd3NlciBpcyB1c2VkIHRvIGRpc3BsYXkgaGVscC4KLQotPT09IGBUUkFDSU5HYAotCi1FbmFibGVzIG9yIGRpc2FibGVzIHRyYWNpbmcgZm9yIHF1ZXJpZXMuIFdoZW4gdHJhY2luZyBpcyBlbmFibGVkLCBvbmNlIGEKLXF1ZXJ5IGNvbXBsZXRlcywgYSB0cmFjZSBvZiB0aGUgZXZlbnRzIGR1cmluZyB0aGUgcXVlcnkgd2lsbCBiZSBwcmludGVkLgotCi1gVXNhZ2VgOgotCi1bc291cmNlLG5vbmVdCi0tLS0tCi1UUkFDSU5HIE9OCi1UUkFDSU5HIE9GRgotLS0tLQotCi09PT0gYFBBR0lOR2AKLQotRW5hYmxlcyBwYWdpbmcsIGRpc2FibGVzIHBhZ2luZywgb3Igc2V0cyB0aGUgcGFnZSBzaXplIGZvciByZWFkIHF1ZXJpZXMuCi1XaGVuIHBhZ2luZyBpcyBlbmFibGVkLCBvbmx5IG9uZSBwYWdlIG9mIGRhdGEgd2lsbCBiZSBmZXRjaGVkIGF0IGEgdGltZQotYW5kIGEgcHJvbXB0IHdpbGwgYXBwZWFyIHRvIGZldGNoIHRoZSBuZXh0IHBhZ2UuIEdlbmVyYWxseSwgaXQncyBhIGdvb2QKLWlkZWEgdG8gbGVhdmUgcGFnaW5nIGVuYWJsZWQgaW4gYW4gaW50ZXJhY3RpdmUgc2Vzc2lvbiB0byBhdm9pZCBmZXRjaGluZwotYW5kIHByaW50aW5nIGxhcmdlIGFtb3VudHMgb2YgZGF0YSBhdCBvbmNlLgotCi1gVXNhZ2VgOgotCi1bc291cmNlLG5vbmVdCi0tLS0tCi1QQUdJTkcgT04KLVBBR0lORyBPRkYKLVBBR0lORyA8cGFnZSBzaXplIGluIHJvd3M+Ci0tLS0tCi0KLT09PSBgRVhQQU5EYAotCi1FbmFibGVzIG9yIGRpc2FibGVzIHZlcnRpY2FsIHByaW50aW5nIG9mIHJvd3MuIEVuYWJsaW5nIGBFWFBBTkRgIGlzCi11c2VmdWwgd2hlbiBtYW55IGNvbHVtbnMgYXJlIGZldGNoZWQsIG9yIHRoZSBjb250ZW50cyBvZiBhIHNpbmdsZSBjb2x1bW4KLWFyZSBsYXJnZS4KLQotYFVzYWdlYDoKLQotW3NvdXJjZSxub25lXQotLS0tLQotRVhQQU5EIE9OCi1FWFBBTkQgT0ZGCi0tLS0tCi0KLT09PSBgTE9HSU5gCi0KLUF1dGhlbnRpY2F0ZSBhcyBhIHNwZWNpZmllZCBDYXNzYW5kcmEgdXNlciBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLQotYFVzYWdlYDoKLQotW3NvdXJjZSxub25lXQotLS0tLQotTE9HSU4gPHVzZXJuYW1lPiBbPHBhc3N3b3JkPl0KLS0tLS0KLQotPT09IGBFWElUYAotCi1FbmRzIHRoZSBjdXJyZW50IHNlc3Npb24gYW5kIHRlcm1pbmF0ZXMgdGhlIGNxbHNoIHByb2Nlc3MuCi0KLWBVc2FnZWA6Ci0KLVtzb3VyY2Usbm9uZV0KLS0tLS0KLUVYSVQKLVFVSVQKLS0tLS0KLQotPT09IGBDTEVBUmAKLQotQ2xlYXJzIHRoZSBjb25zb2xlLgotCi1gVXNhZ2VgOgotCi1bc291cmNlLG5vbmVdCi0tLS0tCi1DTEVBUgotQ0xTCi0tLS0tCi0KLT09PSBgREVTQ1JJQkVgCi0KLVByaW50cyBhIGRlc2NyaXB0aW9uICh0eXBpY2FsbHkgYSBzZXJpZXMgb2YgRERMIHN0YXRlbWVudHMpIG9mIGEgc2NoZW1hCi1lbGVtZW50IG9yIHRoZSBjbHVzdGVyLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZHVtcGluZyBhbGwgb3IgcG9ydGlvbnMgb2YKLXRoZSBzY2hlbWEuCi0KLWBVc2FnZWA6Ci0KLVtzb3VyY2Usbm9uZV0KLS0tLS0KLURFU0NSSUJFIENMVVNURVIKLURFU0NSSUJFIFNDSEVNQQotREVTQ1JJQkUgS0VZU1BBQ0VTCi1ERVNDUklCRSBLRVlTUEFDRSA8a2V5c3BhY2UgbmFtZT4KLURFU0NSSUJFIFRBQkxFUwotREVTQ1JJQkUgVEFCTEUgPHRhYmxlIG5hbWU+Ci1ERVNDUklCRSBJTkRFWCA8aW5kZXggbmFtZT4KLURFU0NSSUJFIE1BVEVSSUFMSVpFRCBWSUVXIDx2aWV3IG5hbWU+Ci1ERVNDUklCRSBUWVBFUwotREVTQ1JJQkUgVFlQRSA8dHlwZSBuYW1lPgotREVTQ1JJQkUgRlVOQ1RJT05TCi1ERVNDUklCRSBGVU5DVElPTiA8ZnVuY3Rpb24gbmFtZT4KLURFU0NSSUJFIEFHR1JFR0FURVMKLURFU0NSSUJFIEFHR1JFR0FURSA8YWdncmVnYXRlIGZ1bmN0aW9uIG5hbWU+Ci0tLS0tCi0KLUluIGFueSBvZiB0aGUgY29tbWFuZHMsIGBERVNDYCBtYXkgYmUgdXNlZCBpbiBwbGFjZSBvZiBgREVTQ1JJQkVgLgotCi1UaGUgYERFU0NSSUJFIENMVVNURVJgIGNvbW1hbmQgcHJpbnRzIHRoZSBjbHVzdGVyIG5hbWUgYW5kIHBhcnRpdGlvbmVyOgotCi1bc291cmNlLG5vbmVdCi0tLS0tCi1jcWxzaD4gREVTQ1JJQkUgQ0xVU1RFUgotCi1DbHVzdGVyOiBUZXN0IENsdXN0ZXIKLVBhcnRpdGlvbmVyOiBNdXJtdXIzUGFydGl0aW9uZXIKLS0tLS0KLQotVGhlIGBERVNDUklCRSBTQ0hFTUFgIGNvbW1hbmQgcHJpbnRzIHRoZSBEREwgc3RhdGVtZW50cyBuZWVkZWQgdG8KLXJlY3JlYXRlIHRoZSBlbnRpcmUgc2NoZW1hLiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvciBkdW1waW5nIHRoZQotc2NoZW1hIGluIG9yZGVyIHRvIGNsb25lIGEgY2x1c3RlciBvciByZXN0b3JlIGZyb20gYSBiYWNrdXAuCi0KLT09PSBgQ09QWSBUT2AKLQotQ29waWVzIGRhdGEgZnJvbSBhIHRhYmxlIHRvIGEgQ1NWIGZpbGUuCi0KLWBVc2FnZWA6Ci0KLVtzb3VyY2Usbm9uZV0KLS0tLS0KLUNPUFkgPHRhYmxlIG5hbWU+IFsoPGNvbHVtbj4sIC4uLildIFRPIDxmaWxlIG5hbWU+IFdJVEggPGNvcHkgb3B0aW9uPiBbQU5EIDxjb3B5IG9wdGlvbj4gLi4uXQotLS0tLQotCi1JZiBubyBjb2x1bW5zIGFyZSBzcGVjaWZpZWQsIGFsbCBjb2x1bW5zIGZyb20gdGhlIHRhYmxlIHdpbGwgYmUgY29waWVkCi10byB0aGUgQ1NWIGZpbGUuIEEgc3Vic2V0IG9mIGNvbHVtbnMgdG8gY29weSBtYXkgYmUgc3BlY2lmaWVkIGJ5IGFkZGluZwotYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBjb2x1bW4gbmFtZXMgc3Vycm91bmRlZCBieSBwYXJlbnRoZXNpcyBhZnRlcgotdGhlIHRhYmxlIG5hbWUuCi0KLVRoZSBgPGZpbGUgbmFtZT5gIHNob3VsZCBiZSBhIHN0cmluZyBsaXRlcmFsICh3aXRoIHNpbmdsZSBxdW90ZXMpCi1yZXByZXNlbnRpbmcgYSBwYXRoIHRvIHRoZSBkZXN0aW5hdGlvbiBmaWxlLiBUaGlzIGNhbiBhbHNvIHRoZSBzcGVjaWFsCi12YWx1ZSBgU1RET1VUYCAod2l0aG91dCBzaW5nbGUgcXVvdGVzKSB0byBwcmludCB0aGUgQ1NWIHRvIHN0ZG91dC4KLQotU2VlIGBzaGFyZWQtY29weS1vcHRpb25zYCBmb3Igb3B0aW9ucyB0aGF0IGFwcGx5IHRvIGJvdGggYENPUFkgVE9gIGFuZAotYENPUFkgRlJPTWAuCi0KLT09PT0gT3B0aW9ucyBmb3IgYENPUFkgVE9gCi0KLWBNQVhSRVFVRVNUU2A6OgotICBUaGUgbWF4aW11bSBudW1iZXIgdG9rZW4gcmFuZ2VzIHRvIGZldGNoIHNpbXVsdGFuZW91c2x5LiBEZWZhdWx0cyB0bwotICA2LgotYFBBR0VTSVpFYDo6Ci0gIFRoZSBudW1iZXIgb2Ygcm93cyB0byBmZXRjaCBpbiBhIHNpbmdsZSBwYWdlLiBEZWZhdWx0cyB0byAxMDAwLgotYFBBR0VUSU1FT1VUYDo6Ci0gIEJ5IGRlZmF1bHQgdGhlIHBhZ2UgdGltZW91dCBpcyAxMCBzZWNvbmRzIHBlciAxMDAwIGVudHJpZXMgaW4gdGhlIHBhZ2UKLSAgc2l6ZSBvciAxMCBzZWNvbmRzIGlmIHBhZ2VzaXplIGlzIHNtYWxsZXIuCi1gQkVHSU5UT0tFTmAsIGBFTkRUT0tFTmA6OgotICBUb2tlbiByYW5nZSB0byBleHBvcnQuIERlZmF1bHRzIHRvIGV4cG9ydGluZyB0aGUgZnVsbCByaW5nLgotYE1BWE9VVFBVVFNJWkVgOjoKLSAgVGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgb3V0cHV0IGZpbGUgbWVhc3VyZWQgaW4gbnVtYmVyIG9mIGxpbmVzOwotICBiZXlvbmQgdGhpcyBtYXhpbXVtIHRoZSBvdXRwdXQgZmlsZSB3aWxsIGJlIHNwbGl0IGludG8gc2VnbWVudHMuIC0xCi0gIG1lYW5zIHVubGltaXRlZCwgYW5kIGlzIHRoZSBkZWZhdWx0LgotYEVOQ09ESU5HYDo6Ci0gIFRoZSBlbmNvZGluZyB1c2VkIGZvciBjaGFyYWN0ZXJzLiBEZWZhdWx0cyB0byBgdXRmOGAuCi0KLT09PSBgQ09QWSBGUk9NYAotCi1Db3BpZXMgZGF0YSBmcm9tIGEgQ1NWIGZpbGUgdG8gdGFibGUuCi0KLWBVc2FnZWA6Ci0KLVtzb3VyY2Usbm9uZV0KLS0tLS0KLUNPUFkgPHRhYmxlIG5hbWU+IFsoPGNvbHVtbj4sIC4uLildIEZST00gPGZpbGUgbmFtZT4gV0lUSCA8Y29weSBvcHRpb24+IFtBTkQgPGNvcHkgb3B0aW9uPiAuLi5dCi0tLS0tCi0KLUlmIG5vIGNvbHVtbnMgYXJlIHNwZWNpZmllZCwgYWxsIGNvbHVtbnMgZnJvbSB0aGUgQ1NWIGZpbGUgd2lsbCBiZQotY29waWVkIHRvIHRoZSB0YWJsZS4gQSBzdWJzZXQgb2YgY29sdW1ucyB0byBjb3B5IG1heSBiZSBzcGVjaWZpZWQgYnkKLWFkZGluZyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNvbHVtbiBuYW1lcyBzdXJyb3VuZGVkIGJ5IHBhcmVudGhlc2lzCi1hZnRlciB0aGUgdGFibGUgbmFtZS4KLQotVGhlIGA8ZmlsZSBuYW1lPmAgc2hvdWxkIGJlIGEgc3RyaW5nIGxpdGVyYWwgKHdpdGggc2luZ2xlIHF1b3RlcykKLXJlcHJlc2VudGluZyBhIHBhdGggdG8gdGhlIHNvdXJjZSBmaWxlLiBUaGlzIGNhbiBhbHNvIHRoZSBzcGVjaWFsIHZhbHVlCi1gU1RESU5gICh3aXRob3V0IHNpbmdsZSBxdW90ZXMpIHRvIHJlYWQgdGhlIENTViBkYXRhIGZyb20gc3RkaW4uCi0KLVNlZSBgc2hhcmVkLWNvcHktb3B0aW9uc2AgZm9yIG9wdGlvbnMgdGhhdCBhcHBseSB0byBib3RoIGBDT1BZIFRPYCBhbmQKLWBDT1BZIEZST01gLgotCi09PT09IE9wdGlvbnMgZm9yIGBDT1BZIFRPYAotCi1gSU5HRVNUUkFURWA6OgotICBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byBwcm9jZXNzIHBlciBzZWNvbmQuIERlZmF1bHRzIHRvIDEwMDAwMC4KLWBNQVhST1dTYDo6Ci0gIFRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIGltcG9ydC4gLTEgbWVhbnMgdW5saW1pdGVkLCBhbmQgaXMgdGhlCi0gIGRlZmF1bHQuCi1gU0tJUFJPV1NgOjoKLSAgQSBudW1iZXIgb2YgaW5pdGlhbCByb3dzIHRvIHNraXAuIERlZmF1bHRzIHRvIDAuCi1gU0tJUENPTFNgOjoKLSAgQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBjb2x1bW4gbmFtZXMgdG8gaWdub3JlLiBCeSBkZWZhdWx0LCBubwotICBjb2x1bW5zIGFyZSBza2lwcGVkLgotYE1BWFBBUlNFRVJST1JTYDo6Ci0gIFRoZSBtYXhpbXVtIGdsb2JhbCBudW1iZXIgb2YgcGFyc2luZyBlcnJvcnMgdG8gaWdub3JlLiAtMSBtZWFucwotICB1bmxpbWl0ZWQsIGFuZCBpcyB0aGUgZGVmYXVsdC4KLWBNQVhJTlNFUlRFUlJPUlNgOjoKLSAgVGhlIG1heGltdW0gZ2xvYmFsIG51bWJlciBvZiBpbnNlcnQgZXJyb3JzIHRvIGlnbm9yZS4gLTEgbWVhbnMKLSAgdW5saW1pdGVkLiBUaGUgZGVmYXVsdCBpcyAxMDAwLgotYEVSUkZJTEVgID06OgotICBBIGZpbGUgdG8gc3RvcmUgYWxsIHJvd3MgdGhhdCBjb3VsZCBub3QgYmUgaW1wb3J0ZWQsIGJ5IGRlZmF1bHQgdGhpcwotICBpcyBgaW1wb3J0Xzxrcz5fPHRhYmxlPi5lcnJgIHdoZXJlIGA8a3M+YCBpcyB5b3VyIGtleXNwYWNlIGFuZAotICBgPHRhYmxlPmAgaXMgeW91ciB0YWJsZSBuYW1lLgotYE1BWEJBVENIU0laRWA6OgotICBUaGUgbWF4IG51bWJlciBvZiByb3dzIGluc2VydGVkIGluIGEgc2luZ2xlIGJhdGNoLiBEZWZhdWx0cyB0byAyMC4KLWBNSU5CQVRDSFNJWkVgOjoKLSAgVGhlIG1pbiBudW1iZXIgb2Ygcm93cyBpbnNlcnRlZCBpbiBhIHNpbmdsZSBiYXRjaC4gRGVmYXVsdHMgdG8gMi4KLWBDSFVOS1NJWkVgOjoKLSAgVGhlIG51bWJlciBvZiByb3dzIHRoYXQgYXJlIHBhc3NlZCB0byBjaGlsZCB3b3JrZXIgcHJvY2Vzc2VzIGZyb20gdGhlCi0gIG1haW4gcHJvY2VzcyBhdCBhIHRpbWUuIERlZmF1bHRzIHRvIDEwMDAuCi0KLT09PT0gU2hhcmVkIENPUFkgT3B0aW9ucwotCi1PcHRpb25zIHRoYXQgYXJlIGNvbW1vbiB0byBib3RoIGBDT1BZIFRPYCBhbmQgYENPUFkgRlJPTWAuCi0KLWBOVUxMVkFMYDo6Ci0gIFRoZSBzdHJpbmcgcGxhY2Vob2xkZXIgZm9yIG51bGwgdmFsdWVzLiBEZWZhdWx0cyB0byBgbnVsbGAuCi1gSEVBREVSYDo6Ci0gIEZvciBgQ09QWSBUT2AsIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGZpcnN0IGxpbmUgaW4gdGhlIENTViBvdXRwdXQgZmlsZQotICB3aWxsIGNvbnRhaW4gdGhlIGNvbHVtbiBuYW1lcy4gRm9yIENPUFkgRlJPTSwgc3BlY2lmaWVzIHdoZXRoZXIgdGhlCi0gIGZpcnN0IGxpbmUgaW4gdGhlIENTViBpbnB1dCBmaWxlIGNvbnRhaW5zIGNvbHVtbiBuYW1lcy4gRGVmYXVsdHMgdG8KLSAgYGZhbHNlYC4KLWBERUNJTUFMU0VQYDo6Ci0gIFRoZSBjaGFyYWN0ZXIgdGhhdCBpcyB1c2VkIGFzIHRoZSBkZWNpbWFsIHBvaW50IHNlcGFyYXRvci4gRGVmYXVsdHMgdG8KLSAgYC5gLgotYFRIT1VTQU5EU1NFUGA6OgotICBUaGUgY2hhcmFjdGVyIHRoYXQgaXMgdXNlZCB0byBzZXBhcmF0ZSB0aG91c2FuZHMuIERlZmF1bHRzIHRvIHRoZQotICBlbXB0eSBzdHJpbmcuCi1gQk9PTFNUWWxFYDo6Ci0gIFRoZSBzdHJpbmcgbGl0ZXJhbCBmb3JtYXQgZm9yIGJvb2xlYW4gdmFsdWVzLiBEZWZhdWx0cyB0bwotICBgVHJ1ZSxGYWxzZWAuCi1gTlVNUFJPQ0VTU0VTYDo6Ci0gIFRoZSBudW1iZXIgb2YgY2hpbGQgd29ya2VyIHByb2Nlc3NlcyB0byBjcmVhdGUgZm9yIGBDT1BZYCB0YXNrcy4KLSAgRGVmYXVsdHMgdG8gYSBtYXggb2YgNCBmb3IgYENPUFkgRlJPTWAgYW5kIDE2IGZvciBgQ09QWSBUT2AuIEhvd2V2ZXIsCi0gIGF0IG1vc3QgKG51bV9jb3JlcyAtIDEpIHByb2Nlc3NlcyB3aWxsIGJlIGNyZWF0ZWQuCi1gTUFYQVRURU1QVFNgOjoKLSAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGZhaWxlZCBhdHRlbXB0cyB0byBmZXRjaCBhIHJhbmdlIG9mIGRhdGEgKHdoZW4KLSAgdXNpbmcgYENPUFkgVE9gKSBvciBpbnNlcnQgYSBjaHVuayBvZiBkYXRhICh3aGVuIHVzaW5nIGBDT1BZIEZST01gKQotICBiZWZvcmUgZ2l2aW5nIHVwLiBEZWZhdWx0cyB0byA1LgotYFJFUE9SVEZSRVFVRU5DWWA6OgotICBIb3cgb2Z0ZW4gc3RhdHVzIHVwZGF0ZXMgYXJlIHJlZnJlc2hlZCwgaW4gc2Vjb25kcy4gRGVmYXVsdHMgdG8gMC4yNS4KLWBSQVRFRklMRWA6OgotICBBbiBvcHRpb25hbCBmaWxlIHRvIG91dHB1dCByYXRlIHN0YXRpc3RpY3MgdG8uIEJ5IGRlZmF1bHQsIHN0YXRpc3RpY3MKLSAgYXJlIG5vdCBvdXRwdXQgdG8gYSBmaWxlLgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL3NzdGFibGUvaW5kZXguYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29scy9zc3RhYmxlL2luZGV4LmFkb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNzg3ZWMuLjAwMDAwMDAKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL3NzdGFibGUvaW5kZXguYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLT0gU1NUYWJsZSBUb29scwotCi1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSB2YXJpb3VzIHNzdGFibGUgdG9vbHMuCi0KLUNhc3NhbmRyYSBtdXN0IGJlIHN0b3BwZWQgYmVmb3JlIHRoZXNlIHRvb2xzIGFyZSBleGVjdXRlZCwgb3IgdW5leHBlY3RlZAotcmVzdWx0cyB3aWxsIG9jY3VyLiBOb3RlOiB0aGUgc2NyaXB0cyBkbyBub3QgdmVyaWZ5IHRoYXQgQ2Fzc2FuZHJhIGlzCi1zdG9wcGVkLgotCi0qIHhyZWY6dG9vbHMvc3N0YWJsZS9zc3RhYmxlZHVtcC5hZG9jW3NzdGFibGVkdW1wXQotKiB4cmVmOnRvb2xzL3NzdGFibGUvc3N0YWJsZWV4cGlyZWRibG9ja2Vycy5hZG9jW3NzdGFibGVleHBpcmVkYmxvY2tlcnNdCi0qIHhyZWY6dG9vbHMvc3N0YWJsZS9zc3RhYmxlbGV2ZWxyZXNldC5hZG9jW3NzdGFibGVsZXZlbHJlc2V0XQotKiB4cmVmOnRvb2xzL3NzdGFibGUvc3N0YWJsZWxvYWRlci5hZG9jW3NzdGFibGVsb2FkZXJdCi0qIHhyZWY6dG9vbHMvc3N0YWJsZS9zc3RhYmxlbWV0YWRhdGEuYWRvY1tzc3RhYmxlbWV0YWRhdGFdCi0qIHhyZWY6dG9vbHMvc3N0YWJsZS9zc3RhYmxlb2ZmbGluZXJlbGV2ZWwuYWRvY1tzc3RhYmxlb2ZmbGluZXJlbGV2ZWxdCi0qIHhyZWY6dG9vbHMvc3N0YWJsZS9zc3RhYmxlcmVwYWlyZWRzZXQuYWRvY1tzc3RhYmxlcmVwYWlyZHNldF0KLSogeHJlZjp0b29scy9zc3RhYmxlL3NzdGFibGVzY3J1Yi5hZG9jW3NzdGFibGVzY3J1Yl0KLSogeHJlZjp0b29scy9zc3RhYmxlL3NzdGFibGVzcGxpdC5hZG9jW3NzdGFibGVzcGxpdF0KLSogeHJlZjp0b29scy9zc3RhYmxlL3NzdGFibGV1cGdyYWRlLmFkb2Nbc3N0YWJsZXVwZ3JhZGVdCi0qIHhyZWY6dG9vbHMvc3N0YWJsZS9zc3RhYmxldXRpbC5hZG9jW3NzdGFibGV1dGlsXQotKiB4cmVmOnRvb2xzL3NzdGFibGUvc3N0YWJsZXZlcmlmeS5hZG9jW3NzdGFibGV2ZXJpZnldCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvc3N0YWJsZS9zc3RhYmxlbGV2ZWxyZXNldC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL3NzdGFibGUvc3N0YWJsZWxldmVscmVzZXQuYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVkYzAyZS4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvc3N0YWJsZS9zc3RhYmxlbGV2ZWxyZXNldC5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPSBzc3RhYmxlbGV2ZWxyZXNldAotCi1JZiBMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5IGlzIHNldCwgdGhpcyBzY3JpcHQgY2FuIGJlIHVzZWQgdG8gcmVzZXQKLWxldmVsIHRvIDAgb24gYSBnaXZlbiBzZXQgb2Ygc3N0YWJsZXMuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvLAotZm9yIGV4YW1wbGUsIGNoYW5nZSB0aGUgbWluaW11bSBzc3RhYmxlIHNpemUsIGFuZCB0aGVyZWZvcmUgcmVzdGFydCB0aGUKLWNvbXBhY3Rpb24gcHJvY2VzcyB1c2luZyB0aGlzIG5ldyBjb25maWd1cmF0aW9uLgotCi1TZWUKLWh0dHA6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZy9kb2MvbGF0ZXN0L29wZXJhdGluZy9jb21wYWN0aW9uLmh0bWwjbGV2ZWxlZC1jb21wYWN0aW9uLXN0cmF0ZWd5Ci1mb3IgaW5mb3JtYXRpb24gb24gaG93IGxldmVscyBhcmUgdXNlZCBpbiB0aGlzIGNvbXBhY3Rpb24gc3RyYXRlZ3kuCi0KLUNhc3NhbmRyYSBtdXN0IGJlIHN0b3BwZWQgYmVmb3JlIHRoaXMgdG9vbCBpcyBleGVjdXRlZCwgb3IgdW5leHBlY3RlZAotcmVzdWx0cyB3aWxsIG9jY3VyLiBOb3RlOiB0aGUgc2NyaXB0IGRvZXMgbm90IHZlcmlmeSB0aGF0IENhc3NhbmRyYSBpcwotc3RvcHBlZC4KLQotcmVmOiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS01MjcxCi0KLT09IFVzYWdlCi0KLXNzdGFibGVsZXZlbHJlc2V0IC0tcmVhbGx5LXJlc2V0IDxrZXlzcGFjZT4gPHRhYmxlPgotCi1UaGUgcmVhbGx5LXJlc2V0IGZsYWcgaXMgcmVxdWlyZWQsIHRvIGVuc3VyZSB0aGlzIGludHJ1c2l2ZSBjb21tYW5kIGlzCi1ub3QgcnVuIGFjY2lkZW50YWxseS4KLQotPT0gVGFibGUgbm90IGZvdW5kCi0KLUlmIHRoZSBrZXlzcGFjZSBhbmQvb3IgdGFibGUgaXMgbm90IGluIHRoZSBzY2hlbWEgKGUuZy4sIGlmIHlvdQotbWlzc3BlbGxlZCB0aGUgdGFibGUgbmFtZSksIHRoZSBzY3JpcHQgd2lsbCByZXR1cm4gYW4gZXJyb3IuCi0KLUV4YW1wbGU6Ci0KLS4uLi4KLUNvbHVtbkZhbWlseSBub3QgZm91bmQ6IGtleXNwYWNlL2V2ZW5sb2cuCi0uLi4uCi0KLT09IFRhYmxlIGhhcyBubyBzc3RhYmxlcwotCi1FeGFtcGxlOgotCi0uLi4uCi1Gb3VuZCBubyBzc3RhYmxlcywgZGlkIHlvdSBnaXZlIHRoZSBjb3JyZWN0IGtleXNwYWNlL3RhYmxlPwotLi4uLgotCi09PSBUYWJsZSBhbHJlYWR5IGF0IGxldmVsIDAKLQotVGhlIHNjcmlwdCB3aWxsIG5vdCBzZXQgdGhlIGxldmVsIGlmIGl0IGlzIGFscmVhZHkgc2V0IHRvIDAuCi0KLUV4YW1wbGU6Ci0KLS4uLi4KLVNraXBwZWQgL3Zhci9saWIvY2Fzc2FuZHJhL2RhdGEva2V5c3BhY2UvZXZlbnRsb2ctNjVjNDI5ZTA4YzVhMTFlODkzOWVkZjRmNDAzOTc5ZWYvbWMtMS1iaWctRGF0YS5kYiBzaW5jZSBpdCBpcyBhbHJlYWR5IG9uIGxldmVsIDAKLS4uLi4KLQotPT0gVGFibGUgbGV2ZWxzIHJlZHVjZWQgdG8gMAotCi1JZiB0aGUgbGV2ZWwgaXMgbm90IGFscmVhZHkgMCwgdGhlbiB0aGlzIHdpbGwgcmVzZXQgaXQgdG8gMC4KLQotRXhhbXBsZToKLQotLi4uLgotc3N0YWJsZW1ldGFkYXRhIC92YXIvbGliL2Nhc3NhbmRyYS9kYXRhL2tleXNwYWNlL2V2ZW50bG9nLTYzNjUzMzIwOTRkZDExZTg4ZjMyNGY5YzUwM2U0NzUzL21jLTgtYmlnLURhdGEuZGIgfCBncmVwIC1pIGxldmVsCi1TU1RhYmxlIExldmVsOiAxCi0KLXNzdGFibGVsZXZlbHJlc2V0IC0tcmVhbGx5LXJlc2V0IGtleXNwYWNlIGV2ZW50bG9nCi1DaGFuZ2luZyBsZXZlbCBmcm9tIDEgdG8gMCBvbiAvdmFyL2xpYi9jYXNzYW5kcmEvZGF0YS9rZXlzcGFjZS9ldmVudGxvZy02MzY1MzMyMDk0ZGQxMWU4OGYzMjRmOWM1MDNlNDc1My9tYy04LWJpZy1EYXRhLmRiCi0KLXNzdGFibGVtZXRhZGF0YSAvdmFyL2xpYi9jYXNzYW5kcmEvZGF0YS9rZXlzcGFjZS9ldmVudGxvZy02MzY1MzMyMDk0ZGQxMWU4OGYzMjRmOWM1MDNlNDc1My9tYy04LWJpZy1EYXRhLmRiIHwgZ3JlcCAtaSBsZXZlbAotU1NUYWJsZSBMZXZlbDogMAotLi4uLgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhcnRpYWxzL21hc2tpbmdfZnVuY3Rpb25zLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFydGlhbHMvbWFza2luZ19mdW5jdGlvbnMuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmFkY2QwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhcnRpYWxzL21hc2tpbmdfZnVuY3Rpb25zLmFkb2MKQEAgLTAsMCArMSw2MSBAQAorW2NvbHM9IiwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfEZ1bmN0aW9uIHwgRGVzY3JpcHRpb24KKworfCBgbWFza19udWxsKHZhbHVlKWAgfCBSZXBsYWNlcyB0aGUgZmlyc3QgYXJndW1lbnQgYnkgYSBgbnVsbGAgY29sdW1uLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYWx3YXlzIGFuIGFic2VudCBjb2x1bW4sIGFzIGl0IGRpZG4ndCBleGlzdCwgYW5kIG5vdCBhIG5vdC1udWxsIGNvbHVtbiByZXByZXNlbnRpbmcgYSBgbnVsbGAgdmFsdWUuCisKK0V4YW1wbGVzOgorCitgbWFza19udWxsKCdBbGljZScpYCAtPiBgbnVsbGAKKworYG1hc2tfbnVsbCgxMjMpYCAtPiBgbnVsbGAKKworfCBgbWFza19kZWZhdWx0KHZhbHVlKWAgfCBSZXBsYWNlcyBpdHMgYXJndW1lbnQgYnkgYW4gYXJiaXRyYXJ5LCBmaXhlZCBkZWZhdWx0IHZhbHVlIG9mIHRoZSBzYW1lIHR5cGUuIFRoaXMgd2lsbCBiZSBgXCoqKlwqKipgIGZvciB0ZXh0IHZhbHVlcywgemVybyBmb3IgbnVtZXJpYyB2YWx1ZXMsIGBmYWxzZWAgZm9yIGJvb2xlYW5zLCBldGMuCisKK0V4YW1wbGVzOgorCitgbWFza19kZWZhdWx0KCdBbGljZScpYCAtPiBgJ1wqKioqJ2AKKworYG1hc2tfZGVmYXVsdCgxMjMpYCAtPiBgMGAKKworfCBgbWFza19yZXBsYWNlKHZhbHVlLCByZXBsYWNlbWVudF0pYCB8IFJlcGxhY2VzIHRoZSBmaXJzdCBhcmd1bWVudCBieSB0aGUgcmVwbGFjZW1lbnQgdmFsdWUgb24gdGhlIHNlY29uZCBhcmd1bWVudC4gVGhlIHJlcGxhY2VtZW50IHZhbHVlIG5lZWRzIHRvIGhhdmUgdGhlIHNhbWUgdHlwZSBhcyB0aGUgcmVwbGFjZWQgdmFsdWUuCisKK0V4YW1wbGVzOgorCitgbWFza19yZXBsYWNlKCdBbGljZScsICdSRURBQ1RFRCcpYCAtPiBgJ1JFREFDVEVEJ2AKKworYG1hc2tfcmVwbGFjZSgxMjMsIC0xKWAgLT4gYC0xYAorCit8IGBtYXNrX2lubmVyKHZhbHVlLCBiZWdpbiwgZW5kLCBbcGFkZGluZ10pYCB8IFJldHVybnMgYSBjb3B5IG9mIHRoZSBmaXJzdCBgdGV4dGAsIGB2YXJjaGFyYCBvciBgYXNjaWlgIGFyZ3VtZW50LCByZXBsYWNpbmcgZWFjaCBjaGFyYWN0ZXIgZXhjZXB0IHRoZSBmaXJzdCBhbmQgbGFzdCBvbmVzIGJ5IGEgcGFkZGluZyBjaGFyYWN0ZXIuIFRoZSAybmQgYW5kIDNyZCBhcmd1bWVudHMgYXJlIHRoZSBzaXplIG9mIHRoZSBleHBvc2VkIHByZWZpeCBhbmQgc3VmZml4LiBUaGUgb3B0aW9uYWwgNHRoIGFyZ3VtZW50IGlzIHRoZSBwYWRkaW5nIGNoYXJhY3RlciwgYFwqYCBieSBkZWZhdWx0LgorCitFeGFtcGxlczoKKworYG1hc2tfaW5uZXIoJ0FsaWNlJywgMSwgMilgIC0+IGAnQSoqY2UnYAorCitgbWFza19pbm5lcignQWxpY2UnLCAxLCBudWxsKWAgLT4gYCdBKioqKidgCisKK2BtYXNrX2lubmVyKCdBbGljZScsIG51bGwsIDIpYCAtPiBgJyoqKmNlJ2AKKworYG1hc2tfaW5uZXIoJ0FsaWNlJywgMiwgMSwgJ1wjJylgIC0+IGAnQWwjI2UnYAorCit8IGBtYXNrX291dGVyKHZhbHVlLCBiZWdpbiwgZW5kLCBbcGFkZGluZ10pYCB8IFJldHVybnMgYSBjb3B5IG9mIHRoZSBmaXJzdCBgdGV4dGAsIGB2YXJjaGFyYCBvciBgYXNjaWlgIGFyZ3VtZW50LCByZXBsYWNpbmcgdGhlIGZpcnN0IGFuZCBsYXN0IGNoYXJhY3RlciBieSBhIHBhZGRpbmcgY2hhcmFjdGVyLiBUaGUgMm5kIGFuZCAzcmQgYXJndW1lbnRzIGFyZSB0aGUgc2l6ZSBvZiB0aGUgZXhwb3NlZCBwcmVmaXggYW5kIHN1ZmZpeC4gVGhlIG9wdGlvbmFsIDR0aCBhcmd1bWVudCBpcyB0aGUgcGFkZGluZyBjaGFyYWN0ZXIsIGBcKmAgYnkgZGVmYXVsdC4KKworRXhhbXBsZXM6CisKK2BtYXNrX291dGVyKCdBbGljZScsIDEsIDIpYCAtPiBgJypsaSoqJ2AKKworYG1hc2tfb3V0ZXIoJ0FsaWNlJywgMSwgbnVsbClgIC0+IGAnKmxpY2UnYAorCitgbWFza19vdXRlcignQWxpY2UnLCBudWxsLCAyKWAgLT4gYCdBbGkqKidgCisKK2BtYXNrX291dGVyKCdBbGljZScsIDIsIDEsICdcIycpYCAtPiBgJyMjaWMjJ2AKKworfCBgbWFza19oYXNoKHZhbHVlLCBbYWxnb3JpdGhtXSlgIHwgUmV0dXJucyBhIGBibG9iYCBjb250YWluaW5nIHRoZSBoYXNoIG9mIHRoZSBmaXJzdCBhcmd1bWVudC4gVGhlIG9wdGlvbmFsIDJuZCBhcmd1bWVudCBpcyB0aGUgaGFzaGluZyBhbGdvcml0aG0gdG8gYmUgdXNlZCwgYWNjb3JkaW5nIHRoZSBhdmFpbGFibGUgSmF2YSBzZWN1cml0eSBwcm92aWRlci4gVGhlIGRlZmF1bHQgaGFzaGluZyBhbGdvcml0aG0gaXMgYFNIQS0yNTZgLgorCitFeGFtcGxlczoKKworYG1hc2tfaGFzaCgnQWxpY2UnKWAKKworYG1hc2tfaGFzaCgnQWxpY2UnLCAnU0hBLTUxMicpYAorCit8PT09ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhcnRpYWxzL25vZGV0b29sX2FuZF9jcWxzaC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhcnRpYWxzL25vZGV0b29sX2FuZF9jcWxzaC5hZG9jCmluZGV4IGQxYzRlNzMuLjgwZGE5MTUgMTAwNjQ0Ci0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYXJ0aWFscy9ub2RldG9vbF9hbmRfY3Fsc2guYWRvYworKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFydGlhbHMvbm9kZXRvb2xfYW5kX2NxbHNoLmFkb2MKQEAgLTEsNSArMSw1IEBACiBOT1RFOiBGb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbmZpZ3VyZSB5b3VyIGluc3RhbGxhdGlvbiwgc2VlCi17Y2Fzc191cmx9ZG9jL2xhdGVzdC9nZXR0aW5nX3N0YXJ0ZWQvY29uZmlndXJpbmcuaHRtbFtDb25maWd1cmluZwore2Nhc3NfdXJsfWRvYy9sYXRlc3QvZ2V0dGluZy1zdGFydGVkL2NvbmZpZ3VyaW5nLmh0bWxbQ29uZmlndXJpbmcKIENhc3NhbmRyYV0uCiAKIFthcmFiaWMsIHN0YXJ0PTddCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFydGlhbHMvbm9kZXRvb2xfYW5kX2NxbHNoX25vYmluLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFydGlhbHMvbm9kZXRvb2xfYW5kX2NxbHNoX25vYmluLmFkb2MKaW5kZXggYzE3OTQ5Yy4uYmY3NGFkMiAxMDA2NDQKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhcnRpYWxzL25vZGV0b29sX2FuZF9jcWxzaF9ub2Jpbi5hZG9jCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYXJ0aWFscy9ub2RldG9vbF9hbmRfY3Fsc2hfbm9iaW4uYWRvYwpAQCAtMSw1ICsxLDUgQEAKIE5PVEU6IEZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29uZmlndXJlIHlvdXIgaW5zdGFsbGF0aW9uLCBzZWUKLXtjYXNzX3VybH1kb2MvbGF0ZXN0L2dldHRpbmdfc3RhcnRlZC9jb25maWd1cmluZy5odG1sW0NvbmZpZ3VyaW5nCit7Y2Fzc191cmx9ZG9jL2xhdGVzdC9nZXR0aW5nLXN0YXJ0ZWQvY29uZmlndXJpbmcuaHRtbFtDb25maWd1cmluZwogQ2Fzc2FuZHJhXS4KIAogW2FyYWJpYywgc3RhcnQ9N10KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NzbC1mYWN0b3J5L3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9LdWJlcm5ldGVzU2VjcmV0c1BFTVNzbENvbnRleHRGYWN0b3J5LmphdmEgYi9leGFtcGxlcy9zc2wtZmFjdG9yeS9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvS3ViZXJuZXRlc1NlY3JldHNQRU1Tc2xDb250ZXh0RmFjdG9yeS5qYXZhCmluZGV4IGZiMTFjOTEuLjE4ZTIxMWIgMTAwNjQ0Ci0tLSBhL2V4YW1wbGVzL3NzbC1mYWN0b3J5L3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9LdWJlcm5ldGVzU2VjcmV0c1BFTVNzbENvbnRleHRGYWN0b3J5LmphdmEKKysrIGIvZXhhbXBsZXMvc3NsLWZhY3Rvcnkvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0t1YmVybmV0ZXNTZWNyZXRzUEVNU3NsQ29udGV4dEZhY3RvcnkuamF2YQpAQCAtMTI1LDYgKzEyNSw4IEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgcGVtRW5jb2RlZENlcnRpZmljYXRlczsKICAgICBwcml2YXRlIFBFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnkgcGVtQmFzZWRTc2xDb250ZXh0RmFjdG9yeTsKIAorICAgIHB1YmxpYyBib29sZWFuIGNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKKwogICAgIHB1YmxpYyBLdWJlcm5ldGVzU2VjcmV0c1BFTVNzbENvbnRleHRGYWN0b3J5KCkKICAgICB7CiAgICAgICAgIHBlbUJhc2VkU3NsQ29udGV4dEZhY3RvcnkgPSBuZXcgUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeSgpOwpAQCAtMTY1LDcgKzE2Nyw3IEBACiAgICAgcHJvdGVjdGVkIEtleU1hbmFnZXJGYWN0b3J5IGJ1aWxkS2V5TWFuYWdlckZhY3RvcnkoKSB0aHJvd3MgU1NMRXhjZXB0aW9uCiAgICAgewogICAgICAgICBLZXlNYW5hZ2VyRmFjdG9yeSBrbWYgPSBwZW1CYXNlZFNzbENvbnRleHRGYWN0b3J5LmJ1aWxkS2V5TWFuYWdlckZhY3RvcnkoKTsKLSAgICAgICAgY2hlY2tlZEV4cGlyeSA9IHBlbUJhc2VkU3NsQ29udGV4dEZhY3RvcnkuY2hlY2tlZEV4cGlyeTsKKyAgICAgICAgY2hlY2tlZEV4cGlyeSA9IHBlbUJhc2VkU3NsQ29udGV4dEZhY3Rvcnkua2V5c3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnk7CiAgICAgICAgIHJldHVybiBrbWY7CiAgICAgfQogCmRpZmYgLS1naXQgYS9leGFtcGxlcy9zc2wtZmFjdG9yeS9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvS3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5qYXZhIGIvZXhhbXBsZXMvc3NsLWZhY3Rvcnkvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0t1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkuamF2YQppbmRleCBjODNmYjAzLi5lYmVhYzZjIDEwMDY0NAotLS0gYS9leGFtcGxlcy9zc2wtZmFjdG9yeS9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvS3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5qYXZhCisrKyBiL2V4YW1wbGVzL3NzbC1mYWN0b3J5L3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9LdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LmphdmEKQEAgLTE0OSwxMiArMTQ5LDEyIEBACiAKICAgICBwdWJsaWMgS3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeSgpCiAgICAgewotICAgICAgICBrZXlzdG9yZSA9IGdldFN0cmluZyhFbmNyeXB0aW9uT3B0aW9ucy5Db25maWdLZXkuS0VZU1RPUkUudG9TdHJpbmcoKSwgS0VZU1RPUkVfUEFUSF9WQUxVRSk7Ci0gICAgICAgIGtleXN0b3JlX3Bhc3N3b3JkID0gZ2V0VmFsdWVGcm9tRW52KEtFWVNUT1JFX1BBU1NXT1JEX0VOVl9WQVJfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9LRVlTVE9SRV9QQVNTV09SRCk7Ci0gICAgICAgIHRydXN0c3RvcmUgPSBnZXRTdHJpbmcoRW5jcnlwdGlvbk9wdGlvbnMuQ29uZmlnS2V5LlRSVVNUU1RPUkUudG9TdHJpbmcoKSwgVFJVU1RTVE9SRV9QQVRIX1ZBTFVFKTsKLSAgICAgICAgdHJ1c3RzdG9yZV9wYXNzd29yZCA9IGdldFZhbHVlRnJvbUVudihUUlVTVFNUT1JFX1BBU1NXT1JEX0VOVl9WQVJfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1RSVVNUU1RPUkVfUEFTU1dPUkQpOworICAgICAgICBrZXlzdG9yZUNvbnRleHQgPSBuZXcgRmlsZUJhc2VkU3RvcmVDb250ZXh0KGdldFN0cmluZyhFbmNyeXB0aW9uT3B0aW9ucy5Db25maWdLZXkuS0VZU1RPUkUudG9TdHJpbmcoKSwgS0VZU1RPUkVfUEFUSF9WQUxVRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWVGcm9tRW52KEtFWVNUT1JFX1BBU1NXT1JEX0VOVl9WQVJfTkFNRSwgREVGQVVMVF9LRVlTVE9SRV9QQVNTV09SRCkpOworCisgICAgICAgIHRydXN0U3RvcmVDb250ZXh0ID0gbmV3IEZpbGVCYXNlZFN0b3JlQ29udGV4dChnZXRTdHJpbmcoRW5jcnlwdGlvbk9wdGlvbnMuQ29uZmlnS2V5LlRSVVNUU1RPUkUudG9TdHJpbmcoKSwgVFJVU1RTVE9SRV9QQVRIX1ZBTFVFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlRnJvbUVudihUUlVTVFNUT1JFX1BBU1NXT1JEX0VOVl9WQVJfTkFNRSwgREVGQVVMVF9UUlVTVFNUT1JFX1BBU1NXT1JEKSk7CisKICAgICAgICAga2V5c3RvcmVMYXN0VXBkYXRlZFRpbWUgPSBTeXN0ZW0ubmFub1RpbWUoKTsKICAgICAgICAga2V5c3RvcmVVcGRhdGVkVGltZVNlY3JldEtleVBhdGggPSBnZXRTdHJpbmcoQ29uZmlnS2V5cy5LRVlTVE9SRV9VUERBVEVEX1RJTUVTVEFNUF9QQVRILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlTVE9SRV9VUERBVEVEX1RJTUVTVEFNUF9QQVRIX1ZBTFVFKTsKQEAgLTE2NiwxMiArMTY2LDEzIEBACiAgICAgcHVibGljIEt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkoTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbWV0ZXJzKQogICAgIHsKICAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7Ci0gICAgICAgIGtleXN0b3JlID0gZ2V0U3RyaW5nKEVuY3J5cHRpb25PcHRpb25zLkNvbmZpZ0tleS5LRVlTVE9SRS50b1N0cmluZygpLCBLRVlTVE9SRV9QQVRIX1ZBTFVFKTsKLSAgICAgICAga2V5c3RvcmVfcGFzc3dvcmQgPSBnZXRWYWx1ZUZyb21FbnYoZ2V0U3RyaW5nKENvbmZpZ0tleXMuS0VZU1RPUkVfUEFTU1dPUkRfRU5WX1ZBUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWVNUT1JFX1BBU1NXT1JEX0VOVl9WQVJfTkFNRSksIERFRkFVTFRfS0VZU1RPUkVfUEFTU1dPUkQpOwotICAgICAgICB0cnVzdHN0b3JlID0gZ2V0U3RyaW5nKEVuY3J5cHRpb25PcHRpb25zLkNvbmZpZ0tleS5UUlVTVFNUT1JFLnRvU3RyaW5nKCksIFRSVVNUU1RPUkVfUEFUSF9WQUxVRSk7Ci0gICAgICAgIHRydXN0c3RvcmVfcGFzc3dvcmQgPSBnZXRWYWx1ZUZyb21FbnYoZ2V0U3RyaW5nKENvbmZpZ0tleXMuVFJVU1RTVE9SRV9QQVNTV09SRF9FTlZfVkFSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVTVFNUT1JFX1BBU1NXT1JEX0VOVl9WQVJfTkFNRSksIERFRkFVTFRfVFJVU1RTVE9SRV9QQVNTV09SRCk7CisgICAgICAgIGtleXN0b3JlQ29udGV4dCA9IG5ldyBGaWxlQmFzZWRTdG9yZUNvbnRleHQoZ2V0U3RyaW5nKEVuY3J5cHRpb25PcHRpb25zLkNvbmZpZ0tleS5LRVlTVE9SRS50b1N0cmluZygpLCBLRVlTVE9SRV9QQVRIX1ZBTFVFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWx1ZUZyb21FbnYoZ2V0U3RyaW5nKENvbmZpZ0tleXMuS0VZU1RPUkVfUEFTU1dPUkRfRU5WX1ZBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWVNUT1JFX1BBU1NXT1JEX0VOVl9WQVJfTkFNRSksIERFRkFVTFRfS0VZU1RPUkVfUEFTU1dPUkQpKTsKKworICAgICAgICB0cnVzdFN0b3JlQ29udGV4dCA9IG5ldyBGaWxlQmFzZWRTdG9yZUNvbnRleHQoZ2V0U3RyaW5nKEVuY3J5cHRpb25PcHRpb25zLkNvbmZpZ0tleS5UUlVTVFNUT1JFLnRvU3RyaW5nKCksIFRSVVNUU1RPUkVfUEFUSF9WQUxVRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWx1ZUZyb21FbnYoZ2V0U3RyaW5nKENvbmZpZ0tleXMuVFJVU1RTVE9SRV9QQVNTV09SRF9FTlZfVkFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVTVFNUT1JFX1BBU1NXT1JEX0VOVl9WQVJfTkFNRSksIERFRkFVTFRfVFJVU1RTVE9SRV9QQVNTV09SRCkpOwogICAgICAgICBrZXlzdG9yZUxhc3RVcGRhdGVkVGltZSA9IFN5c3RlbS5uYW5vVGltZSgpOwogICAgICAgICBrZXlzdG9yZVVwZGF0ZWRUaW1lU2VjcmV0S2V5UGF0aCA9IGdldFN0cmluZyhDb25maWdLZXlzLktFWVNUT1JFX1VQREFURURfVElNRVNUQU1QX1BBVEgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWVNUT1JFX1VQREFURURfVElNRVNUQU1QX1BBVEhfVkFMVUUpOwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3NsLWZhY3RvcnkvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0t1YmVybmV0ZXNTZWNyZXRzUEVNU3NsQ29udGV4dEZhY3RvcnlUZXN0LmphdmEgYi9leGFtcGxlcy9zc2wtZmFjdG9yeS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvS3ViZXJuZXRlc1NlY3JldHNQRU1Tc2xDb250ZXh0RmFjdG9yeVRlc3QuamF2YQppbmRleCAyZDEyN2YzLi5mMTAxZTg5IDEwMDY0NAotLS0gYS9leGFtcGxlcy9zc2wtZmFjdG9yeS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvS3ViZXJuZXRlc1NlY3JldHNQRU1Tc2xDb250ZXh0RmFjdG9yeVRlc3QuamF2YQorKysgYi9leGFtcGxlcy9zc2wtZmFjdG9yeS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvS3ViZXJuZXRlc1NlY3JldHNQRU1Tc2xDb250ZXh0RmFjdG9yeVRlc3QuamF2YQpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAKICAgICAgICAgS3ViZXJuZXRlc1NlY3JldHNQRU1Tc2xDb250ZXh0RmFjdG9yeSBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5ID0KICAgICAgICAgbmV3IEt1YmVybmV0ZXNTZWNyZXRzUEVNU3NsQ29udGV4dEZhY3RvcnlGb3JUZXN0T25seShjb25maWcpOwotICAgICAgICBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKKyAgICAgICAga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS50cnVzdFN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5ID0gZmFsc2U7CiAgICAgICAgIGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkuYnVpbGRUcnVzdE1hbmFnZXJGYWN0b3J5KCk7CiAgICAgfQogCkBAIC0xNTgsNyArMTU4LDcgQEAKICAgICAgICAgY29uZmlnLnB1dEFsbChjb21tb25Db25maWcpOwogCiAgICAgICAgIEt1YmVybmV0ZXNTZWNyZXRzUEVNU3NsQ29udGV4dEZhY3Rvcnkga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeSA9IG5ldyBLdWJlcm5ldGVzU2VjcmV0c1BFTVNzbENvbnRleHRGYWN0b3J5Rm9yVGVzdE9ubHkoY29uZmlnKTsKLSAgICAgICAga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5jaGVja2VkRXhwaXJ5ID0gZmFsc2U7CisgICAgICAgIGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkudHJ1c3RTdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOwogICAgICAgICBUcnVzdE1hbmFnZXJGYWN0b3J5IHRydXN0TWFuYWdlckZhY3RvcnkgPSBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LmJ1aWxkVHJ1c3RNYW5hZ2VyRmFjdG9yeSgpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCh0cnVzdE1hbmFnZXJGYWN0b3J5KTsKICAgICB9CkBAIC0xNzIsNyArMTcyLDcgQEAKIAogICAgICAgICBLdWJlcm5ldGVzU2VjcmV0c1BFTVNzbENvbnRleHRGYWN0b3J5IGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkgPQogICAgICAgICBuZXcgS3ViZXJuZXRlc1NlY3JldHNQRU1Tc2xDb250ZXh0RmFjdG9yeUZvclRlc3RPbmx5KGNvbmZpZyk7Ci0gICAgICAgIGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOworICAgICAgICBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LmtleXN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5ID0gZmFsc2U7CiAgICAgICAgIGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkuYnVpbGRLZXlNYW5hZ2VyRmFjdG9yeSgpOwogICAgIH0KIApAQCAtMjYyLDcgKzI2Miw3IEBACiAgICAgICAgIGFkZEtleXN0b3JlT3B0aW9ucyhjb25maWcpOwogCiAgICAgICAgIEt1YmVybmV0ZXNTZWNyZXRzUEVNU3NsQ29udGV4dEZhY3Rvcnkga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeSA9IG5ldyBLdWJlcm5ldGVzU2VjcmV0c1BFTVNzbENvbnRleHRGYWN0b3J5Rm9yVGVzdE9ubHkoY29uZmlnKTsKLSAgICAgICAga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5jaGVja2VkRXhwaXJ5ID0gZmFsc2U7CisgICAgICAgIGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkudHJ1c3RTdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOwogICAgICAgICBUcnVzdE1hbmFnZXJGYWN0b3J5IHRydXN0TWFuYWdlckZhY3RvcnkgPSBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LmJ1aWxkVHJ1c3RNYW5hZ2VyRmFjdG9yeSgpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCh0cnVzdE1hbmFnZXJGYWN0b3J5KTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3Rvcnkuc2hvdWxkUmVsb2FkKCkpOwpAQCAtMjgyLDcgKzI4Miw3IEBACiAgICAgICAgIGFkZEtleXN0b3JlT3B0aW9ucyhjb25maWcpOwogCiAgICAgICAgIEt1YmVybmV0ZXNTZWNyZXRzUEVNU3NsQ29udGV4dEZhY3Rvcnkga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeSA9IG5ldyBLdWJlcm5ldGVzU2VjcmV0c1BFTVNzbENvbnRleHRGYWN0b3J5Rm9yVGVzdE9ubHkoY29uZmlnKTsKLSAgICAgICAga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5jaGVja2VkRXhwaXJ5ID0gZmFsc2U7CisgICAgICAgIGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3Rvcnkua2V5c3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKICAgICAgICAgS2V5TWFuYWdlckZhY3Rvcnkga2V5TWFuYWdlckZhY3RvcnkgPSBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LmJ1aWxkS2V5TWFuYWdlckZhY3RvcnkoKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoa2V5TWFuYWdlckZhY3RvcnkpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2Uoa3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5zaG91bGRSZWxvYWQoKSk7CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zc2wtZmFjdG9yeS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvS3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeVRlc3QuamF2YSBiL2V4YW1wbGVzL3NzbC1mYWN0b3J5L3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9LdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5VGVzdC5qYXZhCmluZGV4IGQzNzk5MmEuLjBjMzY0MTkgMTAwNjQ0Ci0tLSBhL2V4YW1wbGVzL3NzbC1mYWN0b3J5L3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9LdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5VGVzdC5qYXZhCisrKyBiL2V4YW1wbGVzL3NzbC1mYWN0b3J5L3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9LdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5VGVzdC5qYXZhCkBAIC0yMCw4ICsyMCw4IEBACiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwotaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKIGltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CkBAIC0zOCw3ICszOCw2IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRW5jcnlwdGlvbk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5Lkt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkuQ29uZmlnS2V5cy5LRVlTVE9SRV9QQVNTV09SRF9FTlZfVkFSOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZWN1cml0eS5LdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LkNvbmZpZ0tleXMuS0VZU1RPUkVfVVBEQVRFRF9USU1FU1RBTVBfUEFUSDsKQEAgLTYzLDExICs2MiwxMCBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWxldGVGaWxlSWZFeGlzdHMoU3RyaW5nIGZpbGUpCiAgICAgewotICAgICAgICBQYXRoIGZpbGVQYXRoID0gUGF0aHMuZ2V0KGZpbGUpOwotICAgICAgICBib29sZWFuIGRlbGV0ZWQgPSBuZXcgRmlsZShmaWxlUGF0aCkudG9KYXZhSU9GaWxlKCkuZGVsZXRlKCk7CisgICAgICAgIGJvb2xlYW4gZGVsZXRlZCA9IG5ldyBGaWxlKGZpbGUpLmRlbGV0ZSgpOwogICAgICAgICBpZiAoIWRlbGV0ZWQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci53YXJuKCJGaWxlIHt9IGNvdWxkIG5vdCBiZSBkZWxldGVkLiIsIGZpbGVQYXRoKTsKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCJGaWxlIHt9IGNvdWxkIG5vdCBiZSBkZWxldGVkLiIsIGZpbGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDYsNyArMTA0LDcgQEAKICAgICAgICAgY29uZmlnLnB1dChUUlVTVFNUT1JFX1BBVEgsICIvdGhpcy9pcy9wcm9iYWJseS9ub3QvYS9maWxlL29uL3lvdXIvdGVzdC9tYWNoaW5lIik7CiAKICAgICAgICAgS3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeSBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5ID0gbmV3IEt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnlGb3JUZXN0T25seShjb25maWcpOwotICAgICAgICBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKKyAgICAgICAga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS50cnVzdFN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5ID0gZmFsc2U7CiAgICAgICAgIGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkuYnVpbGRUcnVzdE1hbmFnZXJGYWN0b3J5KCk7CiAgICAgfQogCkBAIC0xMTksNyArMTE3LDcgQEAKICAgICAgICAgY29uZmlnLnB1dChLdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LkRFRkFVTFRfVFJVU1RTVE9SRV9QQVNTV09SRF9FTlZfVkFSX05BTUUsICJIb21lT2ZCYWRQYXNzd29yZHMiKTsKIAogICAgICAgICBLdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5IGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkgPSBuZXcgS3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeUZvclRlc3RPbmx5KGNvbmZpZyk7Ci0gICAgICAgIGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOworICAgICAgICBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LnRydXN0U3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKICAgICAgICAga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5idWlsZFRydXN0TWFuYWdlckZhY3RvcnkoKTsKICAgICB9CiAKQEAgLTEzMyw3ICsxMzEsNyBAQAogICAgICAgICBjb25maWcucHV0KEt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkuREVGQVVMVF9UUlVTVFNUT1JFX1BBU1NXT1JEX0VOVl9WQVJfTkFNRSwgIiIpOwogCiAgICAgICAgIEt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3Rvcnkga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeSA9IG5ldyBLdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5Rm9yVGVzdE9ubHkoY29uZmlnKTsKLSAgICAgICAga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5jaGVja2VkRXhwaXJ5ID0gZmFsc2U7CisgICAgICAgIGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkudHJ1c3RTdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOwogICAgICAgICBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LmJ1aWxkVHJ1c3RNYW5hZ2VyRmFjdG9yeSgpOwogICAgIH0KIApAQCAtMTQ0LDcgKzE0Miw3IEBACiAgICAgICAgIGNvbmZpZy5wdXRBbGwoY29tbW9uQ29uZmlnKTsKIAogICAgICAgICBLdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5IGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkgPSBuZXcgS3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeUZvclRlc3RPbmx5KGNvbmZpZyk7Ci0gICAgICAgIGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOworICAgICAgICBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LnRydXN0U3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKICAgICAgICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeSB0cnVzdE1hbmFnZXJGYWN0b3J5ID0ga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5idWlsZFRydXN0TWFuYWdlckZhY3RvcnkoKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwodHJ1c3RNYW5hZ2VyRmFjdG9yeSk7CiAgICAgfQpAQCAtMTU5LDcgKzE1Nyw3IEBACiAgICAgICAgIGNvbmZpZy5wdXQoIk1ZX0tFWVNUT1JFX1BBU1NXT1JEIiwiVGhpc1dvbnRNYXR0ZXIiKTsKIAogICAgICAgICBLdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5IGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkgPSBuZXcgS3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeUZvclRlc3RPbmx5KGNvbmZpZyk7Ci0gICAgICAgIGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOworICAgICAgICBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LmtleXN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5ID0gZmFsc2U7CiAgICAgICAgIGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkuYnVpbGRLZXlNYW5hZ2VyRmFjdG9yeSgpOwogICAgIH0KIApAQCAtMTgzLDIwICsxODEsMjAgQEAKIAogICAgICAgICBLdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5IGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkxID0gbmV3IEt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnlGb3JUZXN0T25seShjb25maWcpOwogICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGV4aXJ5IGNoZWNrIGRpZG4ndCBoYXBwZW4gc28gZmFyIGZvciB0aGUgcHJpdmF0ZSBrZXkKLSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkxLmNoZWNrZWRFeHBpcnkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2Uoa3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeTEua2V5c3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkpOwogCiAgICAgICAgIGFkZEtleXN0b3JlT3B0aW9ucyhjb25maWcpOwogICAgICAgICBLdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5IGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkyID0gbmV3IEt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnlGb3JUZXN0T25seShjb25maWcpOwogICAgICAgICAvLyBUcmlnZ2VyIHRoZSBwcml2YXRlIGtleSBsb2FkaW5nLiBUaGF0IHdpbGwgYWxzbyBjaGVjayBmb3IgZXhwaXJlZCBwcml2YXRlIGtleQogICAgICAgICBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5Mi5idWlsZEtleU1hbmFnZXJGYWN0b3J5KCk7CiAgICAgICAgIC8vIE5vdyB3ZSBzaG91bGQgaGF2ZSBjaGVja2VkIHRoZSBwcml2YXRlIGtleSdzIGV4cGlyeQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5Mi5jaGVja2VkRXhwaXJ5KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoa3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeTIua2V5c3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkpOwogCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IG5ldyBmYWN0b3J5IG9iamVjdCBwcmVmb3JtcyB0aGUgZnJlc2ggcHJpdmF0ZSBrZXkgZXhwaXJ5IGNoZWNrCiAgICAgICAgIEt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3Rvcnkga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeTMgPSBuZXcgS3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeUZvclRlc3RPbmx5KGNvbmZpZyk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5My5jaGVja2VkRXhwaXJ5KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkzLmtleXN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5KTsKICAgICAgICAga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeTMuYnVpbGRLZXlNYW5hZ2VyRmFjdG9yeSgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5My5jaGVja2VkRXhwaXJ5KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoa3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeTMua2V5c3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yMDcsNyArMjA1LDcgQEAKICAgICAgICAgYWRkS2V5c3RvcmVPcHRpb25zKGNvbmZpZyk7CiAKICAgICAgICAgS3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeSBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5ID0gbmV3IEt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnlGb3JUZXN0T25seShjb25maWcpOwotICAgICAgICBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKKyAgICAgICAga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS50cnVzdFN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5ID0gZmFsc2U7CiAgICAgICAgIFRydXN0TWFuYWdlckZhY3RvcnkgdHJ1c3RNYW5hZ2VyRmFjdG9yeSA9IGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkuYnVpbGRUcnVzdE1hbmFnZXJGYWN0b3J5KCk7CiAgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHRydXN0TWFuYWdlckZhY3RvcnkpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2Uoa3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5zaG91bGRSZWxvYWQoKSk7CkBAIC0yMjcsNyArMjI1LDcgQEAKICAgICAgICAgYWRkS2V5c3RvcmVPcHRpb25zKGNvbmZpZyk7CiAKICAgICAgICAgS3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeSBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5ID0gbmV3IEt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnlGb3JUZXN0T25seShjb25maWcpOwotICAgICAgICBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKKyAgICAgICAga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOwogICAgICAgICBLZXlNYW5hZ2VyRmFjdG9yeSBrZXlNYW5hZ2VyRmFjdG9yeSA9IGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkuYnVpbGRLZXlNYW5hZ2VyRmFjdG9yeSgpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChrZXlNYW5hZ2VyRmFjdG9yeSk7CiAgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LnNob3VsZFJlbG9hZCgpKTsKZGlmZiAtLWdpdCBhL2lkZS9pZGVhL3dvcmtzcGFjZS54bWwgYi9pZGUvaWRlYS93b3Jrc3BhY2UueG1sCmluZGV4IDhhZWEzMTUuLmZmZDc1MzAgMTAwNjQ0Ci0tLSBhL2lkZS9pZGVhL3dvcmtzcGFjZS54bWwKKysrIGIvaWRlL2lkZWEvd29ya3NwYWNlLnhtbApAQCAtMTUxLDYgKzE1MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtRGNhc3NhbmRyYS5zdG9yYWdlZGlyPSRQUk9KRUNUX0RJUiQvZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLURqYXZhLmxpYnJhcnkucGF0aD0kUFJPSkVDVF9ESVIkL2xpYi9zaWdhci1iaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1EbG9nYmFjay5jb25maWd1cmF0aW9uRmlsZT1maWxlOi8vJFBST0pFQ1RfRElSJC9jb25mL2xvZ2JhY2sueG1sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtWFg6SGVhcER1bXBQYXRoPWJ1aWxkL3Rlc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1lYSIgLz4KICAgICAgIDxvcHRpb24gbmFtZT0iUFJPR1JBTV9QQVJBTUVURVJTIiB2YWx1ZT0iIiAvPgogICAgICAgPG9wdGlvbiBuYW1lPSJXT1JLSU5HX0RJUkVDVE9SWSIgdmFsdWU9IiIgLz4KQEAgLTE5OCw3ICsxOTksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLURsb2diYWNrLmNvbmZpZ3VyYXRpb25GaWxlPWZpbGU6Ly8kUFJPSkVDVF9ESVIkL3Rlc3QvY29uZi9sb2diYWNrLXRlc3QueG1sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtRG1pZ3JhdGlvbi1zc3RhYmxlLXJvb3Q9JFBST0pFQ1RfRElSJC90ZXN0L2RhdGEvbWlncmF0aW9uLXNzdGFibGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtWFg6QWN0aXZlUHJvY2Vzc29yQ291bnQ9MgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVhYOk1heE1ldGFzcGFjZVNpemU9Mzg0TQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVhYOkhlYXBEdW1wUGF0aD1idWlsZC90ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtWFg6TWF4TWV0YXNwYWNlU2l6ZT0xRwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVhYOlNvZnRSZWZMUlVQb2xpY3lNU1Blck1CPTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1lYSIgLz4KICAgICAgIDxvcHRpb24gbmFtZT0iUEFSQU1FVEVSUyIgdmFsdWU9IiIgLz4KQEAgLTIzMCw2ICsyMzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLURjYXNzYW5kcmEudHJpZ2dlcnNfZGlyPSRQUk9KRUNUX0RJUiQvY29uZi90cmlnZ2VycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLURqYXZhLmxpYnJhcnkucGF0aD0kUFJPSkVDVF9ESVIkL2xpYi9zaWdhci1iaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1EbG9nYmFjay5jb25maWd1cmF0aW9uRmlsZT1maWxlOi8vJFBST0pFQ1RfRElSJC9jb25mL2xvZ2JhY2sueG1sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtWFg6SGVhcER1bXBQYXRoPWJ1aWxkL3Rlc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1YbXgxRwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWVhIiAvPgogICAgICAgPG9wdGlvbiBuYW1lPSJQUk9HUkFNX1BBUkFNRVRFUlMiIHZhbHVlPSIiIC8+CmRpZmYgLS1naXQgYS9pZGUvbmJwcm9qZWN0L3Byb2plY3QueG1sIGIvaWRlL25icHJvamVjdC9wcm9qZWN0LnhtbAppbmRleCAzOTAwZjFmLi41ZWEyMjI1IDEwMDY0NAotLS0gYS9pZGUvbmJwcm9qZWN0L3Byb2plY3QueG1sCisrKyBiL2lkZS9uYnByb2plY3QvcHJvamVjdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICAgICAgICAgICA8cHJvcGVydGllcz4KICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icHJvamVjdC5kaXIiPi4uPC9wcm9wZXJ0eT4KICAgICAgICAgICAgICAgICA8IS0tIHRoZSBjb21waWxlIGNsYXNzcGF0aHMgc2hvdWxkIGJlIGRpc3RpbmN0IHBlciBjb21waWxhdGlvbiB1bml04oCmIGJ1dCBpdCBpcyBrZXB0IHNpbXBsZSBhbmQgdGhlIGJ1aWxkIHdpbGwgY2F0Y2ggZXJyb3JzIC0tPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYXNzYW5kcmEuY2xhc3NwYXRoLmphcnMiPiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL0hkckhpc3RvZ3JhbS0yLjEuOS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvU1Q0LTQuMC44Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9haXJsaW5lLTAuOC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvYW50bHItMy41LjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2FudGxyLXJ1bnRpbWUtMy41LjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2FzbS05LjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2Fzc2VydGotY29yZS0zLjE1LjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2J5dGVtYW4tNC4wLjYuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2J5dGVtYW4tYm11bml0LTQuMC42Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9ieXRlbWFuLWluc3RhbGwtNC4wLjYuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2J5dGVtYW4tc3VibWl0LTQuMC42Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jYWZmZWluZS0yLjkuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY2Fzc2FuZHJhLWRyaXZlci1jb3JlLTMuMTEuMC1zaGFkZWQuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NoZWNrZXItcXVhbC0zLjEwLjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2Nocm9uaWNsZS1ieXRlcy0yLjIwLjExMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY2hyb25pY2xlLWNvcmUtMi4yMC4xMjYuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2Nocm9uaWNsZS1xdWV1ZS01LjIwLjEyMy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY2hyb25pY2xlLXRocmVhZHMtMi4yMC4xMTEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2Nocm9uaWNsZS13aXJlLTIuMjAuMTE3Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jb21tb25zLWJlYW51dGlscy0xLjcuMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY29tbW9ucy1iZWFudXRpbHMtY29yZS0xLjguMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY29tbW9ucy1jbGktMS4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jb21tb25zLWNvZGVjLTEuOS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY29tbW9ucy1jb2xsZWN0aW9ucy0zLjIuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY29tbW9ucy1jb25maWd1cmF0aW9uLTEuNi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY29tbW9ucy1kaWdlc3Rlci0xLjguamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbW1vbnMtZWwtMS4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jb21tb25zLWh0dHBjbGllbnQtMy4wLjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbW1vbnMtbGFuZzMtMy4xMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY29tbW9ucy1tYXRoLTIuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY29tbW9ucy1tYXRoMy0zLjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbW1vbnMtbmV0LTEuNC4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jb21waWxlLWNvbW1hbmQtYW5ub3RhdGlvbnMtMS4yLjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbXByZXNzLWx6Zi0wLjguNC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY29uY3VycmVudC10cmVlcy0yLjQuMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvZWNqLTQuNi4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9lcnJvcl9wcm9uZV9hbm5vdGF0aW9ucy0yLjUuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvZnRwbGV0LWFwaS0xLjAuMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvZnRwc2VydmVyLWNvcmUtMS4wLjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2Z0cHNlcnZlci1kZXByZWNhdGVkLTEuMC4wLU0yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9ndWF2YS0yNy4wLWpyZS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvaGFkb29wLWNvcmUtMS4wLjMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2hhZG9vcC1taW5pY2x1c3Rlci0xLjAuMy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvaGFkb29wLXRlc3QtMS4wLjMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2hpZ2gtc2NhbGUtbGliLTEuMC42Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9ocHBjLTAuOC4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9oc3FsZGItMS44LjAuMTAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2lwYWRkcmVzcy01LjMuMy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvajJvYmpjLWFubm90YXRpb25zLTEuMy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamFja3Nvbi1hbm5vdGF0aW9ucy0yLjEzLjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2phY2tzb24tY29yZS0yLjEzLjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2phY2tzb24tZGF0YWJpbmQtMi4xMy4yLjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2phY2tzb24tZGF0YXR5cGUtanNyMzEwLTIuMTMuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamFjb2NvYWdlbnQuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2phbW0tMC4zLjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2phc3Blci1jb21waWxlci01LjUuMTIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2phc3Blci1ydW50aW1lLTUuNS4xMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamF2YS1jdXAtcnVudGltZS0xMWItMjAxNjA2MTUuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2phdmF4LmluamVjdC0xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qYmNyeXB0LTAuNC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamNsLW92ZXItc2xmNGotMS43LjI1Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qY29tbWFuZGVyLTEuMzAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2pjdG9vbHMtY29yZS0zLjEuMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamVyc2V5LWNvcmUtMS4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qZXJzZXktc2VydmVyLTEuMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamV0czN0LTAuNy4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qZXR0eS02LjEuMjYuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2pldHR5LXV0aWwtNi4xLjI2Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qZmxleC0xLjguMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvam5hLTUuOS4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qc29uLXNpbXBsZS0xLjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2pzcC0yLjEtNi4xLjE0Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qc3AtYXBpLTIuMS02LjEuMTQuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2pzcjMwNS0yLjAuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvanNyMzExLWFwaS0xLjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2p2bS1hdHRhY2gtYXBpLTEuNS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMva2ZzLTAuMy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvbG9nNGotb3Zlci1zbGY0ai0xLjcuMjUuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2xvZ2JhY2stY2xhc3NpYy0xLjIuOS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvbG9nYmFjay1jb3JlLTEuMi45Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9sejQtamF2YS0xLjguMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvbWV0cmljcy1jb3JlLTMuMS41Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9tZXRyaWNzLWp2bS0zLjEuNS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvbWV0cmljcy1sb2diYWNrLTMuMS41Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9taW5hLWNvcmUtMi4wLjAtTTUuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL214ZHVtcC0wLjE0Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9uZXR0eS1hbGwtNC4xLjU4LkZpbmFsLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9uZXR0eS10Y25hdGl2ZS1ib3Jpbmdzc2wtc3RhdGljLTIuMC4zNi5GaW5hbC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvb2hjLWNvcmUtMC41LjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL29oYy1jb3JlLWo4LTAuNS4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9vcm8tMi4wLjguamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL3BzamF2YS0wLjEuMTkuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL3JlcG9ydGVyLWNvbmZpZy1iYXNlLTMuMC4zLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9yZXBvcnRlci1jb25maWczLTMuMC4zLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9zZXJ2bGV0LWFwaS0yLjUtNi4xLjE0Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9zaWdhci0xLjYuNC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvc2prLWNsaS0wLjE0Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9zamstY29yZS0wLjE0Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9zamstanNvbi0wLjE0Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9zamstc3RhY2t0cmFjZS0wLjE0Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9zbGY0ai1hcGktMS43LjI1Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9zbmFrZXlhbWwtMS4yNi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvc25hcHB5LWphdmEtMS4xLjguNC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvc25vd2JhbGwtc3RlbW1lci0xLjMuMC41ODEuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvc3RyZWFtLTIuNS4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy94bWxlbmMtMC41Mi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvenN0ZC1qbmktMS41LjAtNC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9TYXhvbi1IRS0xMC4zLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2FudC0xLjEwLjEyLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2FudC1qdW5pdC0xLjEwLjEyLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2FudC1sYXVuY2hlci0xLjEwLjEyLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2FudGxyLTIuNy43Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2FudGxyNC1ydW50aW1lLTQuOS4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2FzbS1hbmFseXNpcy05LjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvYXNtLWNvbW1vbnMtOS4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2FzbS10cmVlLTkuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9hc20tdXRpbC05LjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvYXNtLXhtbC02LjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvYXdhaXRpbGl0eS00LjAuMy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9ieXRlLWJ1ZGR5LTEuMTAuNS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9ieXRlLWJ1ZGR5LWFnZW50LTEuMTAuNS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9jaGVja3N0eWxlLTguNDAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvY29tbW9ucy1iZWFudXRpbHMtMS45LjQuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvY29tbW9ucy1jb2xsZWN0aW9ucy0zLjIuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9jb21tb25zLWlvLTIuNi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9jb21tb25zLWxvZ2dpbmctMS4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2NvbW1vbnMtbWF0aDMtMy4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2NvbXBpbGUtY29tbWFuZC1hbm5vdGF0aW9ucy0xLjIuMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9kdGVzdC1hcGktMC4wLjEzLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2d1YXZhLTE4LjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvaGFtY3Jlc3QtMi4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2hhcnJ5LWNvcmUtMC4wLjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvamFja3Nvbi1hbm5vdGF0aW9ucy0yLjExLjMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvamFja3Nvbi1jb3JlLTIuMTMuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9qYWNrc29uLWRhdGFiaW5kLTIuMTEuMy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9qYWNrc29uLWRhdGFmb3JtYXQteWFtbC0yLjEzLjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvamF2YS1hbGxvY2F0aW9uLWluc3RydW1lbnRlci0zLjEuMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9qYXZhc3Npc3QtMy4yOC4wLUdBLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2ppbWZzLTEuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9qbWgtY29yZS0xLjIxLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2ptaC1nZW5lcmF0b3ItYW5ucHJvY2Vzcy0xLjIxLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2pvcHQtc2ltcGxlLTQuNi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9qc3IzMDUtMy4wLjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvanVuaXQtNC4xMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9tb2NraXRvLWNvcmUtMy4yLjQuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvb2JqZW5lc2lzLTIuNi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9vcmcuamFjb2NvLmFnZW50LTAuOC42Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL29yZy5qYWNvY28uYW50LTAuOC42Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL29yZy5qYWNvY28uY29yZS0wLjguNi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9vcmcuamFjb2NvLnJlcG9ydC0wLjguNi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9waWNvY2xpLTQuNi4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL3F1aWNrdGhlb3JpZXMtMC4yNi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9yZWZsZWN0aW9ucy0wLjEwLjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvc2VtdmVyNGotMy4xLjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvc2ltdWxhdG9yLWFzbS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9zaW11bGF0b3ItYm9vdHN0cmFwLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL3NsZjRqLWFwaS0xLjcuMzIuamFyOjwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNhc3NhbmRyYS5jbGFzc3BhdGguamFycyI+JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvSGRySGlzdG9ncmFtLTIuMS45Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9TVDQtNC4wLjguamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2Fncm9uYS0xLjE3LjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2FpcmxpbmUtMC44Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9hbnRsci0zLjUuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvYW50bHItcnVudGltZS0zLjUuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvYXNtLTkuMy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvYXNzZXJ0ai1jb3JlLTMuMTUuMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvYmlnLW1hdGgtMi4zLjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2J5dGVtYW4tNC4wLjIwLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9ieXRlbWFuLWJtdW5pdC00LjAuMjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2J5dGVtYW4taW5zdGFsbC00LjAuMjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2J5dGVtYW4tc3VibWl0LTQuMC4yMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY2FmZmVpbmUtMi45LjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2Nhc3NhbmRyYS1kcml2ZXItY29yZS0zLjExLjAtc2hhZGVkLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jaGVja2VyLXF1YWwtMy4xMC4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jaHJvbmljbGUtYnl0ZXMtMi4yMC4xMTEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2Nocm9uaWNsZS1jb3JlLTIuMjAuMTI2Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jaHJvbmljbGUtcXVldWUtNS4yMC4xMjMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2Nocm9uaWNsZS10aHJlYWRzLTIuMjAuMTExLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jaHJvbmljbGUtd2lyZS0yLjIwLjExNy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY29tbW9ucy1iZWFudXRpbHMtMS43LjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbW1vbnMtYmVhbnV0aWxzLWNvcmUtMS44LjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbW1vbnMtY2xpLTEuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY29tbW9ucy1jb2RlYy0xLjkuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbW1vbnMtY29sbGVjdGlvbnMtMy4yLjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbW1vbnMtY29uZmlndXJhdGlvbi0xLjYuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbW1vbnMtZGlnZXN0ZXItMS44Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jb21tb25zLWVsLTEuMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY29tbW9ucy1odHRwY2xpZW50LTMuMC4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jb21tb25zLWxhbmczLTMuMTEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbW1vbnMtbWF0aC0yLjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbW1vbnMtbWF0aDMtMy4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jb21tb25zLW5ldC0xLjQuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY29tcGlsZS1jb21tYW5kLWFubm90YXRpb25zLTEuMi4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jb21wcmVzcy1semYtMC44LjQuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbmN1cnJlbnQtdHJlZXMtMi40LjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2Vjai00LjYuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvZXJyb3JfcHJvbmVfYW5ub3RhdGlvbnMtMi41LjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2Z0cGxldC1hcGktMS4wLjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2Z0cHNlcnZlci1jb3JlLTEuMC4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9mdHBzZXJ2ZXItZGVwcmVjYXRlZC0xLjAuMC1NMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvZ3VhdmEtMjcuMC1qcmUuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2hhZG9vcC1jb3JlLTEuMC4zLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9oYWRvb3AtbWluaWNsdXN0ZXItMS4wLjMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2hhZG9vcC10ZXN0LTEuMC4zLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9oaWdoLXNjYWxlLWxpYi0xLjAuNi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvaHBwYy0wLjguMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvaHNxbGRiLTEuOC4wLjEwLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9pcGFkZHJlc3MtNS4zLjMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2oyb2JqYy1hbm5vdGF0aW9ucy0xLjMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2phY2tzb24tYW5ub3RhdGlvbnMtMi4xMy4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qYWNrc29uLWNvcmUtMi4xMy4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qYWNrc29uLWRhdGFiaW5kLTIuMTMuMi4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qYWNrc29uLWRhdGF0eXBlLWpzcjMxMC0yLjEzLjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2phY29jb2FnZW50Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qYW1tLTAuMy4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qYXNwZXItY29tcGlsZXItNS41LjEyLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qYXNwZXItcnVudGltZS01LjUuMTIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2phdmEtY3VwLXJ1bnRpbWUtMTFiLTIwMTYwNjE1Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qYXZheC5pbmplY3QtMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamJjcnlwdC0wLjQuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2pjbC1vdmVyLXNsZjRqLTEuNy4yNS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamNvbW1hbmRlci0xLjMwLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qY3Rvb2xzLWNvcmUtMy4xLjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2plcnNleS1jb3JlLTEuMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamVyc2V5LXNlcnZlci0xLjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2pldHMzdC0wLjcuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamV0dHktNi4xLjI2Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qZXR0eS11dGlsLTYuMS4yNi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamZsZXgtMS44LjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2puYS01LjEzLjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2pzb24tc2ltcGxlLTEuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvanNwLTIuMS02LjEuMTQuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2pzcC1hcGktMi4xLTYuMS4xNC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvanNyMzA1LTIuMC4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qc3IzMTEtYXBpLTEuMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvanZtLWF0dGFjaC1hcGktMS41Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9rZnMtMC4zLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9sb2c0ai1vdmVyLXNsZjRqLTEuNy4yNS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvbG9nYmFjay1jbGFzc2ljLTEuMi45Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9sb2diYWNrLWNvcmUtMS4yLjkuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2x6NC1qYXZhLTEuOC4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9tZXRyaWNzLWNvcmUtMy4xLjUuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL21ldHJpY3MtanZtLTMuMS41Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9tZXRyaWNzLWxvZ2JhY2stMy4xLjUuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL21pbmEtY29yZS0yLjAuMC1NNS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvbXhkdW1wLTAuMTQuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL25ldHR5LWFsbC00LjEuNTguRmluYWwuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL25ldHR5LXRjbmF0aXZlLWJvcmluZ3NzbC1zdGF0aWMtMi4wLjM2LkZpbmFsLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9vaGMtY29yZS0wLjUuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvb2hjLWNvcmUtajgtMC41LjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL29yby0yLjAuOC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvcHNqYXZhLTAuMS4xOS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvcmVwb3J0ZXItY29uZmlnLWJhc2UtMy4wLjMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL3JlcG9ydGVyLWNvbmZpZzMtMy4wLjMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL3NlcnZsZXQtYXBpLTIuNS02LjEuMTQuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL3NpZ2FyLTEuNi40Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9zamstY2xpLTAuMTQuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL3Nqay1jb3JlLTAuMTQuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL3Nqay1qc29uLTAuMTQuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL3Nqay1zdGFja3RyYWNlLTAuMTQuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL3NsZjRqLWFwaS0xLjcuMjUuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL3NuYWtleWFtbC0xLjI2Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9zbmFwcHktamF2YS0xLjEuOC40Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9zbm93YmFsbC1zdGVtbWVyLTEuMy4wLjU4MS4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9zdHJlYW0tMi41LjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL3htbGVuYy0wLjUyLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy96c3RkLWpuaS0xLjUuNC0xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL1NheG9uLUhFLTEwLjMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvYW50LTEuMTAuMTIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvYW50LWp1bml0LTEuMTAuMTIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvYW50LWxhdW5jaGVyLTEuMTAuMTIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvYW50bHItMi43LjcuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvYW50bHI0LXJ1bnRpbWUtNC45LjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvYXNtLTkuMy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9hc20tYW5hbHlzaXMtOS4zLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2FzbS1jb21tb25zLTkuMy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9hc20tdHJlZS05LjMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvYXNtLXV0aWwtOS4zLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2FzbS14bWwtNi4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2F3YWl0aWxpdHktNC4wLjMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvYnl0ZS1idWRkeS0xLjEyLjEzLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2J5dGUtYnVkZHktYWdlbnQtMS4xMi4xMy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9jaGVja3N0eWxlLTguNDAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvY29tbW9ucy1iZWFudXRpbHMtMS45LjQuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvY29tbW9ucy1jb2xsZWN0aW9ucy0zLjIuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9jb21tb25zLWlvLTIuNi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9jb21tb25zLWxvZ2dpbmctMS4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2NvbW1vbnMtbWF0aDMtMy4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2R0ZXN0LWFwaS0wLjAuMTMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvZ3VhdmEtMTguMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9oYW1jcmVzdC0yLjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvaGFycnktY29yZS0wLjAuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9qYWNrc29uLWFubm90YXRpb25zLTIuMTEuMy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9qYWNrc29uLWNvcmUtMi4xMy4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2phY2tzb24tZGF0YWJpbmQtMi4xMS4zLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2phY2tzb24tZGF0YWZvcm1hdC15YW1sLTIuMTMuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9qYXZhLWFsbG9jYXRpb24taW5zdHJ1bWVudGVyLTMuMS4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2phdmFzc2lzdC0zLjI4LjAtR0EuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvamltZnMtMS4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2ptaC1jb3JlLTEuMjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvam1oLWdlbmVyYXRvci1hbm5wcm9jZXNzLTEuMjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvam9wdC1zaW1wbGUtNC42Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2pzcjMwNS0zLjAuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9qdW5pdC00LjEyLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL21vY2tpdG8tY29yZS00LjcuMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9tb2NraXRvLWlubGluZS00LjcuMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9vYmplbmVzaXMtMy4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL29yZy5qYWNvY28uYWdlbnQtMC44LjguamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvb3JnLmphY29jby5hbnQtMC44LjguamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvb3JnLmphY29jby5jb3JlLTAuOC44Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL29yZy5qYWNvY28ucmVwb3J0LTAuOC44Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL3BpY29jbGktNC42LjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvcXVpY2t0aGVvcmllcy0wLjI2Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL3JlZmxlY3Rpb25zLTAuMTAuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9zZW12ZXI0ai0zLjEuMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9zbGY0ai1hcGktMS43LjMyLmphcjo8L3Byb3BlcnR5PgogICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgogICAgICAgICAgICAgPGZvbGRlcnM+CiAgICAgICAgICAgICAgICAgPHNvdXJjZS1mb2xkZXI+CmRpZmYgLS1naXQgYS9weWxpYi9jYXNzYW5kcmEtY3Fsc2gtdGVzdHMuc2ggYi9weWxpYi9jYXNzYW5kcmEtY3Fsc2gtdGVzdHMuc2gKaW5kZXggYWQ2YWU3NS4uZjZiMWYyMSAxMDA3NTUKLS0tIGEvcHlsaWIvY2Fzc2FuZHJhLWNxbHNoLXRlc3RzLnNoCisrKyBiL3B5bGliL2Nhc3NhbmRyYS1jcWxzaC10ZXN0cy5zaApAQCAtNDEsMTggKzQxLDkgQEAKIGV4cG9ydCBDQ01fQ09ORklHX0RJUj0ke1dPUktTUEFDRX0vLmNjbQogZXhwb3J0IE5VTV9UT0tFTlM9IjE2IgogZXhwb3J0IENBU1NBTkRSQV9ESVI9JHtXT1JLU1BBQ0V9Ci1leHBvcnQgVEVTVFNVSVRFX05BTUU9ImNxbHNobGliLiR7UFlUSE9OX1ZFUlNJT059IgogCi1pZiBbIC16ICIkQ0FTU0FORFJBX1VTRV9KREsxMSIgXTsgdGhlbgotICAgIGV4cG9ydCBDQVNTQU5EUkFfVVNFX0pESzExPWZhbHNlCi1maQotCi1pZiBbICIkQ0FTU0FORFJBX1VTRV9KREsxMSIgPSB0cnVlIF0gOyB0aGVuCi0gICAgVEVTVFNVSVRFX05BTUU9IiR7VEVTVFNVSVRFX05BTUV9LmpkazExIgotZWxzZQotICAgIFRFU1RTVUlURV9OQU1FPSIke1RFU1RTVUlURV9OQU1FfS5qZGs4IgotICAgIHVuc2V0IEpBVkExMV9IT01FCi1maQoramF2YV92ZXJzaW9uPSQoamF2YSAtdmVyc2lvbiAyPiYxIHwgYXdrIC1GICciJyAnL3ZlcnNpb24vIHtwcmludCAkMn0nIHwgYXdrIC1GLiAne3ByaW50ICQxfScpCitleHBvcnQgVEVTVFNVSVRFX05BTUU9ImNxbHNobGliLiR7UFlUSE9OX1ZFUlNJT059LmpkayR7amF2YV92ZXJzaW9ufSIKIAogYW50IC1idWlsZGZpbGUgJHtDQVNTQU5EUkFfRElSfS9idWlsZC54bWwgcmVhbGNsZWFuCiAjIExvb3AgdG8gcHJldmVudCBmYWlsdXJlIGR1ZSB0byBtYXZlbi1hbnQtdGFza3Mgbm90IGRvd25sb2FkaW5nIGEgamFyLi4KQEAgLTk3LDcgKzg4LDYgQEAKIGNjbSByZW1vdmUgdGVzdCB8fCB0cnVlICMgaW4gY2FzZSBhbiBvbGQgY2NtIGNsdXN0ZXIgaXMgbGVmdCBiZWhpbmQKIGNjbSBjcmVhdGUgdGVzdCAtbiAxIC0taW5zdGFsbC1kaXI9JHtDQVNTQU5EUkFfRElSfQogY2NtIHVwZGF0ZWNvbmYgInVzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZDogdHJ1ZSIKLWNjbSB1cGRhdGVjb25mICJzY3JpcHRlZF91c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQ6IHRydWUiCiAKIHZlcnNpb25fZnJvbV9idWlsZD0kKGNjbSBub2RlMSB2ZXJzaW9uZnJvbWJ1aWxkKQogZXhwb3J0IHByZV9vcl9wb3N0X2NkYz0kKHB5dGhvbiAtYyAiIiJmcm9tIGRpc3R1dGlscy52ZXJzaW9uIGltcG9ydCBMb29zZVZlcnNpb24KZGlmZiAtLWdpdCBhL3B5bGliL2NxbHNobGliL2NxbDNoYW5kbGluZy5weSBiL3B5bGliL2NxbHNobGliL2NxbDNoYW5kbGluZy5weQppbmRleCAwM2UwNmQ4Li43ZmYyNTJiIDEwMDY0NAotLS0gYS9weWxpYi9jcWxzaGxpYi9jcWwzaGFuZGxpbmcucHkKKysrIGIvcHlsaWIvY3Fsc2hsaWIvY3FsM2hhbmRsaW5nLnB5CkBAIC00MywxNCArNDMsMTcgQEAKIGNsYXNzIENxbDNQYXJzaW5nUnVsZVNldChDcWxQYXJzaW5nUnVsZVNldCk6CiAKICAgICBjb2x1bW5mYW1pbHlfbGF5b3V0X29wdGlvbnMgPSAoCisgICAgICAgICgnYWxsb3dfYXV0b19zbmFwc2hvdCcsIE5vbmUpLAogICAgICAgICAoJ2Jsb29tX2ZpbHRlcl9mcF9jaGFuY2UnLCBOb25lKSwKICAgICAgICAgKCdjb21tZW50JywgTm9uZSksCiAgICAgICAgICgnZ2NfZ3JhY2Vfc2Vjb25kcycsIE5vbmUpLAorICAgICAgICAoJ2luY3JlbWVudGFsX2JhY2t1cHMnLCBOb25lKSwKICAgICAgICAgKCdtaW5faW5kZXhfaW50ZXJ2YWwnLCBOb25lKSwKICAgICAgICAgKCdtYXhfaW5kZXhfaW50ZXJ2YWwnLCBOb25lKSwKICAgICAgICAgKCdkZWZhdWx0X3RpbWVfdG9fbGl2ZScsIE5vbmUpLAogICAgICAgICAoJ3NwZWN1bGF0aXZlX3JldHJ5JywgTm9uZSksCiAgICAgICAgICgnYWRkaXRpb25hbF93cml0ZV9wb2xpY3knLCBOb25lKSwKKyAgICAgICAgKCdtZW10YWJsZScsIE5vbmUpLAogICAgICAgICAoJ21lbXRhYmxlX2ZsdXNoX3BlcmlvZF9pbl9tcycsIE5vbmUpLAogICAgICAgICAoJ2NkYycsIE5vbmUpLAogICAgICAgICAoJ3JlYWRfcmVwYWlyJywgTm9uZSksCkBAIC05NCwxNCArOTcsNiBAQAogICAgICAgICAnZmFub3V0X3NpemUnCiAgICAgKQogCi0gICAgZGF0ZV90aWVyZWRfY29tcGFjdGlvbl9zdHJhdGVneV9vcHRpb25zID0gKAotICAgICAgICAnYmFzZV90aW1lX3NlY29uZHMnLAotICAgICAgICAnbWF4X3NzdGFibGVfYWdlX2RheXMnLAotICAgICAgICAnbWluX3RocmVzaG9sZCcsCi0gICAgICAgICdtYXhfd2luZG93X3NpemVfc2Vjb25kcycsCi0gICAgICAgICd0aW1lc3RhbXBfcmVzb2x1dGlvbicKLSAgICApCi0KICAgICB0aW1lX3dpbmRvd19jb21wYWN0aW9uX3N0cmF0ZWd5X29wdGlvbnMgPSAoCiAgICAgICAgICdjb21wYWN0aW9uX3dpbmRvd191bml0JywKICAgICAgICAgJ2NvbXBhY3Rpb25fd2luZG93X3NpemUnLApAQCAtMzEwLDcgKzMwNSw5IEBACiAKIDx1c2VyVHlwZT4gOjo9IHV0bmFtZT08Y2ZPcktzTmFtZT4gOwogCi08c3RvcmFnZVR5cGU+IDo6PSA8c2ltcGxlU3RvcmFnZVR5cGU+IHwgPGNvbGxlY3Rpb25UeXBlPiB8IDxmcm96ZW5Db2xsZWN0aW9uVHlwZT4gfCA8dXNlclR5cGU+IDsKKzxzdG9yYWdlVHlwZT4gOjo9ICggPHNpbXBsZVN0b3JhZ2VUeXBlPiB8IDxjb2xsZWN0aW9uVHlwZT4gfCA8ZnJvemVuQ29sbGVjdGlvblR5cGU+IHwgPHVzZXJUeXBlPiApICggPGNvbHVtbl9tYXNrPiApPyA7CisKKzxjb2x1bW5fbWFzaz4gOjo9ICJNQVNLRUQiICJXSVRIIiAoICJERUZBVUxUIiB8IDxmdW5jdGlvbk5hbWU+IDxzZWxlY3Rpb25GdW5jdGlvbkFyZ3VtZW50cz4gKTsKIAogIyBOb3RlOiBhdXRvY29tcGxldGUgZm9yIGZyb3plbiBjb2xsZWN0aW9uIHR5cGVzIGRvZXMgbm90IGhhbmRsZSBuZXN0aW5nIHBhc3QgZGVwdGggMSBwcm9wZXJseSwKICMgYnV0IHRoYXQncyBhIGxvdCBvZiB3b3JrIHRvIGZpeCBmb3IgbGl0dGxlIGJlbmVmaXQuCkBAIC01MTksNiArNTE2LDEwIEBACiAgICAgICAgIHJldHVybiBbSGludCgnPHRydWV8ZmFsc2U+JyldCiAgICAgaWYgdGhpc19vcHQgaW4gKCdyZWFkX3JlcGFpcicpOgogICAgICAgICByZXR1cm4gW0hpbnQoJzxcJ25vbmVcJ3xcJ2Jsb2NraW5nXCc+JyldCisgICAgaWYgdGhpc19vcHQgPT0gJ2FsbG93X2F1dG9fc25hcHNob3QnOgorICAgICAgICByZXR1cm4gW0hpbnQoJzxib29sZWFuPicpXQorICAgIGlmIHRoaXNfb3B0ID09ICdpbmNyZW1lbnRhbF9iYWNrdXBzJzoKKyAgICAgICAgcmV0dXJuIFtIaW50KCc8Ym9vbGVhbj4nKV0KICAgICByZXR1cm4gW0hpbnQoJzxvcHRpb25fdmFsdWU+JyldCiAKIApAQCAtNTQ3LDggKzU0OCw2IEBACiAgICAgICAgICAgICBvcHRzID0gb3B0cy51bmlvbihzZXQoQ3FsUnVsZVNldC5zaXplX3RpZXJlZF9jb21wYWN0aW9uX3N0cmF0ZWd5X29wdGlvbnMpKQogICAgICAgICBlbGlmIGNzYyA9PSAnTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneSc6CiAgICAgICAgICAgICBvcHRzID0gb3B0cy51bmlvbihzZXQoQ3FsUnVsZVNldC5sZXZlbGVkX2NvbXBhY3Rpb25fc3RyYXRlZ3lfb3B0aW9ucykpCi0gICAgICAgIGVsaWYgY3NjID09ICdEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5JzoKLSAgICAgICAgICAgIG9wdHMgPSBvcHRzLnVuaW9uKHNldChDcWxSdWxlU2V0LmRhdGVfdGllcmVkX2NvbXBhY3Rpb25fc3RyYXRlZ3lfb3B0aW9ucykpCiAgICAgICAgIGVsaWYgY3NjID09ICdUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5JzoKICAgICAgICAgICAgIG9wdHMgPSBvcHRzLnVuaW9uKHNldChDcWxSdWxlU2V0LnRpbWVfd2luZG93X2NvbXBhY3Rpb25fc3RyYXRlZ3lfb3B0aW9ucykpCiAKQEAgLTczNiw2ICs3MzUsNyBAQAogPHNlbGVjdG9yPiA6Oj0gW2NvbG5hbWVdPTxjaWRlbnQ+ICggIlsiICggPHRlcm0+ICggIi4uIiA8dGVybT4gIl0iICk/IHwgPHRlcm0+ICIuLiIgKSApPwogICAgICAgICAgICAgIHwgPHVkdFN1YmZpZWxkU2VsZWN0aW9uPgogICAgICAgICAgICAgIHwgIldSSVRFVElNRSIgIigiIFtjb2xuYW1lXT08Y2lkZW50PiAiKSIKKyAgICAgICAgICAgICB8ICJNQVhXUklURVRJTUUiICIoIiBbY29sbmFtZV09PGNpZGVudD4gIikiCiAgICAgICAgICAgICAgfCAiVFRMIiAiKCIgW2NvbG5hbWVdPTxjaWRlbnQ+ICIpIgogICAgICAgICAgICAgIHwgIkNPVU5UIiAiKCIgc3Rhcj0oICIqIiB8ICIxIiApICIpIgogICAgICAgICAgICAgIHwgIkNBU1QiICIoIiA8c2VsZWN0b3I+ICJBUyIgPHN0b3JhZ2VUeXBlPiAiKSIKQEAgLTEzMDgsNyArMTMwOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggIldJVEgiIDxjZmFtUHJvcGVydHk+ICggIkFORCIgPGNmYW1Qcm9wZXJ0eT4gKSogKT8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKIAotPGNyZWF0ZVVzZXJUeXBlU3RhdGVtZW50PiA6Oj0gIkNSRUFURSIgIlRZUEUiICgga3M9PG5vblN5c3RlbUtleXNwYWNlTmFtZT4gZG90PSIuIiApPyB0eXBlbmFtZT08Y2ZPcktzTmFtZT4gIigiIG5ld2NvbD08Y2lkZW50PiA8c3RvcmFnZVR5cGU+Cis8Y3JlYXRlVXNlclR5cGVTdGF0ZW1lbnQ+IDo6PSAiQ1JFQVRFIiAiVFlQRSIgKCJJRiIgIk5PVCIgIkVYSVNUUyIpPyAoIGtzPTxub25TeXN0ZW1LZXlzcGFjZU5hbWU+IGRvdD0iLiIgKT8gdHlwZW5hbWU9PGNmT3JLc05hbWU+ICIoIiBuZXdjb2w9PGNpZGVudD4gPHN0b3JhZ2VUeXBlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICIsIiBbbmV3Y29sbmFtZV09PGNpZGVudD4gPHN0b3JhZ2VUeXBlPiApKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIgogICAgICAgICAgICAgICAgICAgICAgICAgIDsKQEAgLTEzNzIsNyArMTM3Miw3IEBACiA8ZHJvcE1hdGVyaWFsaXplZFZpZXdTdGF0ZW1lbnQ+IDo6PSAiRFJPUCIgIk1BVEVSSUFMSVpFRCIgIlZJRVciICgiSUYiICJFWElTVFMiKT8gbXY9PG1hdGVyaWFsaXplZFZpZXdOYW1lPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKIAotPGRyb3BVc2VyVHlwZVN0YXRlbWVudD4gOjo9ICJEUk9QIiAiVFlQRSIgdXQ9PHVzZXJUeXBlTmFtZT4KKzxkcm9wVXNlclR5cGVTdGF0ZW1lbnQ+IDo6PSAiRFJPUCIgIlRZUEUiICggIklGIiAiRVhJU1RTIiApPyB1dD08dXNlclR5cGVOYW1lPgogICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAKIDxkcm9wRnVuY3Rpb25TdGF0ZW1lbnQ+IDo6PSAiRFJPUCIgIkZVTkNUSU9OIiAoICJJRiIgIkVYSVNUUyIgKT8gPHVzZXJGdW5jdGlvbk5hbWU+CkBAIC0xNDIwLDYgKzE0MjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIHwgIldJVEgiIDxjZmFtUHJvcGVydHk+ICggIkFORCIgPGNmYW1Qcm9wZXJ0eT4gKSoKICAgICAgICAgICAgICAgICAgICAgICB8ICJSRU5BTUUiICgiSUYiICJFWElTVFMiKT8gZXhpc3Rjb2w9PGNpZGVudD4gIlRPIiBuZXdjb2w9PGNpZGVudD4KICAgICAgICAgICAgICAgICAgICAgICAgICAoICJBTkQiIGV4aXN0Y29sPTxjaWRlbnQ+ICJUTyIgbmV3Y29sPTxjaWRlbnQ+ICkqCisgICAgICAgICAgICAgICAgICAgICAgfCAiQUxURVIiICgiSUYiICJFWElTVFMiKT8gZXhpc3Rjb2w9PGNpZGVudD4gKCA8Y29sdW1uX21hc2s+IHwgIkRST1AiICJNQVNLRUQiICkKICAgICAgICAgICAgICAgICAgICAgICA7CiAKIDxhbHRlclVzZXJUeXBlU3RhdGVtZW50PiA6Oj0gIkFMVEVSIiAiVFlQRSIgKCJJRiIgIkVYSVNUUyIpPyB1dD08dXNlclR5cGVOYW1lPgpAQCAtMTQ4MywxMiArMTQ4NCwxMiBAQAogICAgICAgICAgICAgIHwgPHVucmVzZXJ2ZWRLZXl3b3JkPgogICAgICAgICAgICAgIDsKIAotPGNyZWF0ZVJvbGVTdGF0ZW1lbnQ+IDo6PSAiQ1JFQVRFIiAiUk9MRSIgPHJvbGVuYW1lPgorPGNyZWF0ZVJvbGVTdGF0ZW1lbnQ+IDo6PSAiQ1JFQVRFIiAiUk9MRSIgKCJJRiIgIk5PVCIgIkVYSVNUUyIpPyA8cm9sZW5hbWU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICJXSVRIIiA8cm9sZVByb3BlcnR5PiAoIkFORCIgPHJvbGVQcm9wZXJ0eT4pKik/CiAgICAgICAgICAgICAgICAgICAgICAgICA7CiAKIDxhbHRlclJvbGVTdGF0ZW1lbnQ+IDo6PSAiQUxURVIiICJST0xFIiAoIklGIiAiRVhJU1RTIik/IDxyb2xlbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggIldJVEgiIDxyb2xlUHJvcGVydHk+ICgiQU5EIiA8cm9sZVByb3BlcnR5PikqKT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggIldJVEgiIDxyb2xlUHJvcGVydHk+ICgiQU5EIiA8cm9sZVByb3BlcnR5PikqKQogICAgICAgICAgICAgICAgICAgICAgICA7CiAKIDxyb2xlUHJvcGVydHk+IDo6PSAoKCJIQVNIRUQiKT8gIlBBU1NXT1JEIikgIj0iIDxzdHJpbmdMaXRlcmFsPgpAQCAtMTQ5OSw3ICsxNTAwLDcgQEAKICAgICAgICAgICAgICAgICAgfCAiQUNDRVNTIiAiVE8iICJBTEwiICJEQVRBQ0VOVEVSUyIKICAgICAgICAgICAgICAgICAgOwogCi08ZHJvcFJvbGVTdGF0ZW1lbnQ+IDo6PSAiRFJPUCIgIlJPTEUiIDxyb2xlbmFtZT4KKzxkcm9wUm9sZVN0YXRlbWVudD4gOjo9ICJEUk9QIiAiUk9MRSIgKCJJRiIgIkVYSVNUUyIpPyA8cm9sZW5hbWU+CiAgICAgICAgICAgICAgICAgICAgICAgOwogCiA8Z3JhbnRSb2xlU3RhdGVtZW50PiA6Oj0gIkdSQU5UIiA8cm9sZW5hbWU+ICJUTyIgPHJvbGVuYW1lPgpAQCAtMTUzMiw2ICsxNTMzLDggQEAKICAgICAgICAgICAgICAgIHwgIk1PRElGWSIKICAgICAgICAgICAgICAgIHwgIkRFU0NSSUJFIgogICAgICAgICAgICAgICAgfCAiRVhFQ1VURSIKKyAgICAgICAgICAgICAgIHwgIlVOTUFTSyIKKyAgICAgICAgICAgICAgIHwgIlNFTEVDVF9NQVNLRUQiCiAgICAgICAgICAgICAgICA7CiAKIDxwZXJtaXNzaW9uRXhwcj4gOjo9ICggW25ld3Blcm1pc3Npb25dPTxwZXJtaXNzaW9uPiAiUEVSTUlTU0lPTiI/ICggIiwiIFtuZXdwZXJtaXNzaW9uXT08cGVybWlzc2lvbj4gIlBFUk1JU1NJT04iPyApKiApCmRpZmYgLS1naXQgYS9weWxpYi9jcWxzaGxpYi9jcWxoYW5kbGluZy5weSBiL3B5bGliL2NxbHNobGliL2NxbGhhbmRsaW5nLnB5CmluZGV4IGNhMTJhMjUuLjVlYTAzOTEgMTAwNjQ0Ci0tLSBhL3B5bGliL2NxbHNobGliL2NxbGhhbmRsaW5nLnB5CisrKyBiL3B5bGliL2NxbHNobGliL2NxbGhhbmRsaW5nLnB5CkBAIC00OSw3ICs0OSw2IEBACiAgICAgYXZhaWxhYmxlX2NvbXBhY3Rpb25fY2xhc3NlcyA9ICgKICAgICAgICAgJ0xldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3knLAogICAgICAgICAnU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneScsCi0gICAgICAgICdEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5JywKICAgICAgICAgJ1RpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3knCiAgICAgKQogCmRpZmYgLS1naXQgYS9weWxpYi9jcWxzaGxpYi9jcWxzaGhhbmRsaW5nLnB5IGIvcHlsaWIvY3Fsc2hsaWIvY3Fsc2hoYW5kbGluZy5weQppbmRleCBhYTFmYmMwLi5lNmExMjFmIDEwMDY0NAotLS0gYS9weWxpYi9jcWxzaGxpYi9jcWxzaGhhbmRsaW5nLnB5CisrKyBiL3B5bGliL2NxbHNobGliL2NxbHNoaGFuZGxpbmcucHkKQEAgLTM3LDcgKzM3LDggQEAKICAgICAnZXhpdCcsCiAgICAgJ3F1aXQnLAogICAgICdjbGVhcicsCi0gICAgJ2NscycKKyAgICAnY2xzJywKKyAgICAnaGlzdG9yeScKICkKIAogY3Fsc2hfc3ludGF4X2NvbXBsZXRlcnMgPSBbXQpAQCAtNzMsNiArNzQsNyBAQAogICAgICAgICAgICAgICAgICAgIHwgPGV4aXRDb21tYW5kPgogICAgICAgICAgICAgICAgICAgIHwgPHBhZ2luZ0NvbW1hbmQ+CiAgICAgICAgICAgICAgICAgICAgfCA8Y2xlYXJDb21tYW5kPgorICAgICAgICAgICAgICAgICAgIHwgPGhpc3RvcnlDb21tYW5kPgogICAgICAgICAgICAgICAgICAgIDsKICcnJwogCkBAIC0xMzEsNyArMTMzLDcgQEAKICcnJwogCiBjcWxzaF9zaG93X2NtZF9zeW50YXhfcnVsZXMgPSByJycnCi08c2hvd0NvbW1hbmQ+IDo6PSAiU0hPVyIgd2hhdD0oICJWRVJTSU9OIiB8ICJIT1NUIiB8ICJTRVNTSU9OIiBzZXNzaW9uaWQ9PHV1aWQ+ICkKKzxzaG93Q29tbWFuZD4gOjo9ICJTSE9XIiB3aGF0PSggIlZFUlNJT04iIHwgIkhPU1QiIHwgIlNFU1NJT04iIHNlc3Npb25pZD08dXVpZD4gfCAiUkVQTElDQVMiIHRva2VuPTxpbnRlZ2VyPiAoa2V5c3BhY2U9PGtleXNwYWNlTmFtZT4pPyApCiAgICAgICAgICAgICAgICAgOwogJycnCiAKQEAgLTE0MSw3ICsxNDMsNyBAQAogJycnCiAKIGNxbHNoX2NhcHR1cmVfY21kX3N5bnRheF9ydWxlcyA9IHInJycKLTxjYXB0dXJlQ29tbWFuZD4gOjo9ICJDQVBUVVJFIiAoIGZuYW1lPSggPHN0cmluZ0xpdGVyYWw+IHwgIk9GRiIgKSApPworPGNhcHR1cmVDb21tYW5kPiA6Oj0gIkNBUFRVUkUiICggZm5hbWU9KCA8c3RyaW5nTGl0ZXJhbD4pIHwgIk9GRiIgKT8KICAgICAgICAgICAgICAgICAgICA7CiAnJycKIApAQCAtMTg4LDcgKzE5MCw3IEBACiAnJycKIAogY3Fsc2hfcGFnaW5nX2NtZF9zeW50YXhfcnVsZXMgPSByJycnCi08cGFnaW5nQ29tbWFuZD4gOjo9ICJQQUdJTkciICggc3dpdGNoPSggIk9OIiB8ICJPRkYiIHwgL1swLTldKy8pICk/Cis8cGFnaW5nQ29tbWFuZD4gOjo9ICJQQUdJTkciICggc3dpdGNoPSggIk9OIiB8ICJPRkYiIHwgPHdob2xlbnVtYmVyPikgKT8KICAgICAgICAgICAgICAgICAgIDsKICcnJwogCkBAIC0yMDcsNiArMjA5LDExIEBACiAgICAgICAgICAgICAgICAgIDsKICcnJwogCitjcWxzaF9oaXN0b3J5X2NtZF9zeW50YXhfcnVsZXMgPSByJycnCis8aGlzdG9yeUNvbW1hbmQ+IDo6PSAiaGlzdG9yeSIgKG49PHdob2xlbnVtYmVyPik/CisgICAgICAgICAgICAgICAgICAgIDsKKycnJworCiBjcWxzaF9xdWVzdGlvbl9tYXJrID0gcicnJwogPHFtYXJrPiA6Oj0gIj8iIDsKICcnJwpAQCAtMjMyLDYgKzIzOSw3IEBACiAgICAgY3Fsc2hfbG9naW5fY21kX3N5bnRheF9ydWxlcyArIFwKICAgICBjcWxzaF9leGl0X2NtZF9zeW50YXhfcnVsZXMgKyBcCiAgICAgY3Fsc2hfY2xlYXJfY21kX3N5bnRheF9ydWxlcyArIFwKKyAgICBjcWxzaF9oaXN0b3J5X2NtZF9zeW50YXhfcnVsZXMgKyBcCiAgICAgY3Fsc2hfcXVlc3Rpb25fbWFyawogCiAKZGlmZiAtLWdpdCBhL3B5bGliL2NxbHNobGliL2NxbHNobWFpbi5weSBiL3B5bGliL2NxbHNobGliL2NxbHNobWFpbi5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43Y2ZmZDY4Ci0tLSAvZGV2L251bGwKKysrIGIvcHlsaWIvY3Fsc2hsaWIvY3Fsc2htYWluLnB5CkBAIC0wLDAgKzEsMjM3NCBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0IGNtZAoraW1wb3J0IGNvZGVjcworaW1wb3J0IGNvbmZpZ3BhcnNlcgoraW1wb3J0IGNzdgoraW1wb3J0IGdldHBhc3MKK2ltcG9ydCBvcHRwYXJzZQoraW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdHJhY2ViYWNrCitpbXBvcnQgd2FybmluZ3MKK2ltcG9ydCB3ZWJicm93c2VyCitmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNvbnRleHRtYW5hZ2VyCitmcm9tIGlvIGltcG9ydCBTdHJpbmdJTworZnJvbSB1dWlkIGltcG9ydCBVVUlECisKK1VURjggPSAndXRmLTgnCisKK2Rlc2NyaXB0aW9uID0gIkNRTCBTaGVsbCBmb3IgQXBhY2hlIENhc3NhbmRyYSIKK3ZlcnNpb24gPSAiNi4yLjAiCisKK3JlYWRsaW5lID0gTm9uZQordHJ5OgorICAgICMgY2hlY2sgaWYgdHR5IGZpcnN0LCBjYXVzZSByZWFkbGluZSBkb2Vzbid0IGNoZWNrLCBhbmQgb25seSBjYXJlcworICAgICMgYWJvdXQgJFRFUk0uIHdlIGRvbid0IHdhbnQgdGhlIGZ1bmt5IGVzY2FwZSBjb2RlIHN0dWZmIHRvIGJlCisgICAgIyBvdXRwdXQgaWYgbm90IGEgdHR5LgorICAgIGlmIHN5cy5zdGRpbi5pc2F0dHkoKToKKyAgICAgICAgaW1wb3J0IHJlYWRsaW5lCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworCisjIE9uIExpbnV4LCB0aGUgUHl0aG9uIHdlYmJyb3dzZXIgbW9kdWxlIHVzZXMgdGhlICd4ZGctb3BlbicgZXhlY3V0YWJsZQorIyB0byBvcGVuIGEgZmlsZS9VUkwuIEJ1dCB0aGF0IG9ubHkgd29ya3MsIGlmIHRoZSBjdXJyZW50IHNlc3Npb24gaGFzIGJlZW4KKyMgb3BlbmVkIGZyb20gX3dpdGhpbl8gYSBkZXNrdG9wIGVudmlyb25tZW50LiBJLmUuICd4ZGctb3Blbicgd2lsbCBmYWlsLAorIyBpZiB0aGUgc2Vzc2lvbidzIGJlZW4gb3BlbmVkIHZpYSBzc2ggdG8gYSByZW1vdGUgYm94LgorIwordHJ5OgorICAgIHdlYmJyb3dzZXIucmVnaXN0ZXJfc3RhbmRhcmRfYnJvd3NlcnMoKSAgIyByZWdpc3RyYXRpb24gaXMgb3RoZXJ3aXNlIGxhenkgaW4gUHl0aG9uMworZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgIHBhc3MKK2lmIHdlYmJyb3dzZXIuX3RyeW9yZGVyIGFuZCB3ZWJicm93c2VyLl90cnlvcmRlclswXSA9PSAneGRnLW9wZW4nIGFuZCBvcy5lbnZpcm9uLmdldCgnWERHX0RBVEFfRElSUycsICcnKSA9PSAnJzoKKyAgICAjIG9ubHkgb24gTGludXggKHNvbWUgT1Mgd2l0aCB4ZGctb3BlbikKKyAgICB3ZWJicm93c2VyLl90cnlvcmRlci5yZW1vdmUoJ3hkZy1vcGVuJykKKyAgICB3ZWJicm93c2VyLl90cnlvcmRlci5hcHBlbmQoJ3hkZy1vcGVuJykKKword2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsIHIiLipibGlzdC4qIikKKworaW1wb3J0IGNhc3NhbmRyYQorZnJvbSBjYXNzYW5kcmEuYXV0aCBpbXBvcnQgUGxhaW5UZXh0QXV0aFByb3ZpZGVyCitmcm9tIGNhc3NhbmRyYS5jbHVzdGVyIGltcG9ydCBDbHVzdGVyCitmcm9tIGNhc3NhbmRyYS5jcWx0eXBlcyBpbXBvcnQgY3FsX3R5cGVuYW1lCitmcm9tIGNhc3NhbmRyYS5tYXJzaGFsIGltcG9ydCBpbnQ2NF91bnBhY2sKK2Zyb20gY2Fzc2FuZHJhLm1ldGFkYXRhIGltcG9ydCAoQ29sdW1uTWV0YWRhdGEsIEtleXNwYWNlTWV0YWRhdGEsIFRhYmxlTWV0YWRhdGEpCitmcm9tIGNhc3NhbmRyYS5wb2xpY2llcyBpbXBvcnQgV2hpdGVMaXN0Um91bmRSb2JpblBvbGljeQorZnJvbSBjYXNzYW5kcmEucXVlcnkgaW1wb3J0IFNpbXBsZVN0YXRlbWVudCwgb3JkZXJlZF9kaWN0X2ZhY3RvcnksIFRyYWNlVW5hdmFpbGFibGUKK2Zyb20gY2Fzc2FuZHJhLnV0aWwgaW1wb3J0IGRhdGV0aW1lX2Zyb21fdGltZXN0YW1wCisKK2Zyb20gY3Fsc2hsaWIgaW1wb3J0IGNxbDNoYW5kbGluZywgcHlsZXhvdHJvbiwgc3NsaGFuZGxpbmcsIGNxbHNoaGFuZGxpbmcsIGF1dGhwcm92aWRlcmhhbmRsaW5nCitmcm9tIGNxbHNobGliLmNvcHl1dGlsIGltcG9ydCBFeHBvcnRUYXNrLCBJbXBvcnRUYXNrCitmcm9tIGNxbHNobGliLmRpc3BsYXlpbmcgaW1wb3J0IChBTlNJX1JFU0VULCBCTFVFLCBDT0xVTU5fTkFNRV9DT0xPUlMsIENZQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUQsIFdISVRFLCBGb3JtYXR0ZWRWYWx1ZSwgY29sb3JtZSkKK2Zyb20gY3Fsc2hsaWIuZm9ybWF0dGluZyBpbXBvcnQgKERFRkFVTFRfREFURV9GT1JNQVQsIERFRkFVTFRfTkFOT1RJTUVfRk9STUFULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9USU1FU1RBTVBfRk9STUFULCBDcWxUeXBlLCBEYXRlVGltZUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9ieV90eXBlKQorZnJvbSBjcWxzaGxpYi50cmFjaW5nIGltcG9ydCBwcmludF90cmFjZSwgcHJpbnRfdHJhY2Vfc2Vzc2lvbgorZnJvbSBjcWxzaGxpYi51dGlsIGltcG9ydCBnZXRfZmlsZV9lbmNvZGluZ19ib21zaXplCitmcm9tIGNxbHNobGliLnV0aWwgaW1wb3J0IGlzX2ZpbGVfc2VjdXJlCisKKworREVGQVVMVF9IT1NUID0gJzEyNy4wLjAuMScKK0RFRkFVTFRfUE9SVCA9IDkwNDIKK0RFRkFVTFRfU1NMID0gRmFsc2UKK0RFRkFVTFRfQ09OTkVDVF9USU1FT1VUX1NFQ09ORFMgPSA1CitERUZBVUxUX1JFUVVFU1RfVElNRU9VVF9TRUNPTkRTID0gMTAKKworREVGQVVMVF9GTE9BVF9QUkVDSVNJT04gPSA1CitERUZBVUxUX0RPVUJMRV9QUkVDSVNJT04gPSA1CitERUZBVUxUX01BWF9UUkFDRV9XQUlUID0gMTAKKworaWYgcmVhZGxpbmUgaXMgbm90IE5vbmUgYW5kIHJlYWRsaW5lLl9fZG9jX18gaXMgbm90IE5vbmUgYW5kICdsaWJlZGl0JyBpbiByZWFkbGluZS5fX2RvY19fOgorICAgIERFRkFVTFRfQ09NUExFVEVLRVkgPSAnXHQnCitlbHNlOgorICAgIERFRkFVTFRfQ09NUExFVEVLRVkgPSAndGFiJworCitjcWxkb2NzID0gTm9uZQorY3FscnVsZXNldCA9IE5vbmUKK0NBU1NBTkRSQV9DUUxfSFRNTCA9IE5vbmUKKworZXBpbG9nID0gIiIiQ29ubmVjdHMgdG8gJShERUZBVUxUX0hPU1QpczolKERFRkFVTFRfUE9SVClkIGJ5IGRlZmF1bHQuIFRoZXNlCitkZWZhdWx0cyBjYW4gYmUgY2hhbmdlZCBieSBzZXR0aW5nICRDUUxTSF9IT1NUIGFuZC9vciAkQ1FMU0hfUE9SVC4gV2hlbiBhCitob3N0IChhbmQgb3B0aW9uYWwgcG9ydCBudW1iZXIpIGFyZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGV5IHRha2UKK3ByZWNlZGVuY2Ugb3ZlciBhbnkgZGVmYXVsdHMuIiIiICUgZ2xvYmFscygpCisKK3BhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcihkZXNjcmlwdGlvbj1kZXNjcmlwdGlvbiwgZXBpbG9nPWVwaWxvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZT0iVXNhZ2U6ICVwcm9nIFtvcHRpb25zXSBbaG9zdCBbcG9ydF1dIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPSdjcWxzaCAnICsgdmVyc2lvbikKK3BhcnNlci5hZGRfb3B0aW9uKCItQyIsICItLWNvbG9yIiwgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0nY29sb3InLAorICAgICAgICAgICAgICAgICAgaGVscD0nQWx3YXlzIHVzZSBjb2xvciBvdXRwdXQnKQorcGFyc2VyLmFkZF9vcHRpb24oIi0tbm8tY29sb3IiLCBhY3Rpb249J3N0b3JlX2ZhbHNlJywgZGVzdD0nY29sb3InLAorICAgICAgICAgICAgICAgICAgaGVscD0nTmV2ZXIgdXNlIGNvbG9yIG91dHB1dCcpCitwYXJzZXIuYWRkX29wdGlvbigiLS1icm93c2VyIiwgZGVzdD0nYnJvd3NlcicsIGhlbHA9IiIiVGhlIGJyb3dzZXIgdG8gdXNlIHRvIGRpc3BsYXkgQ1FMIGhlbHAsIHdoZXJlIEJST1dTRVIgY2FuIGJlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gb25lIG9mIHRoZSBzdXBwb3J0ZWQgYnJvd3NlcnMgaW4gaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy9saWJyYXJ5L3dlYmJyb3dzZXIuaHRtbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGJyb3dzZXIgcGF0aCBmb2xsb3dlZCBieSAlcywgZXhhbXBsZTogL3Vzci9iaW4vZ29vZ2xlLWNocm9tZS1zdGFibGUgJXMiIiIpCitwYXJzZXIuYWRkX29wdGlvbignLS1zc2wnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSdVc2UgU1NMJywgZGVmYXVsdD1GYWxzZSkKK3BhcnNlci5hZGRfb3B0aW9uKCItdSIsICItLXVzZXJuYW1lIiwgaGVscD0iQXV0aGVudGljYXRlIGFzIHVzZXIuIikKK3BhcnNlci5hZGRfb3B0aW9uKCItcCIsICItLXBhc3N3b3JkIiwgaGVscD0iQXV0aGVudGljYXRlIHVzaW5nIHBhc3N3b3JkLiIpCitwYXJzZXIuYWRkX29wdGlvbignLWsnLCAnLS1rZXlzcGFjZScsIGhlbHA9J0F1dGhlbnRpY2F0ZSB0byB0aGUgZ2l2ZW4ga2V5c3BhY2UuJykKK3BhcnNlci5hZGRfb3B0aW9uKCItZiIsICItLWZpbGUiLCBoZWxwPSJFeGVjdXRlIGNvbW1hbmRzIGZyb20gRklMRSwgdGhlbiBleGl0IikKK3BhcnNlci5hZGRfb3B0aW9uKCctLWRlYnVnJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgIGhlbHA9J1Nob3cgYWRkaXRpb25hbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24nKQorcGFyc2VyLmFkZF9vcHRpb24oJy0tY292ZXJhZ2UnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgaGVscD0nQ29sbGVjdCBjb3ZlcmFnZSBkYXRhJykKK3BhcnNlci5hZGRfb3B0aW9uKCItLWVuY29kaW5nIiwgaGVscD0iU3BlY2lmeSBhIG5vbi1kZWZhdWx0IGVuY29kaW5nIGZvciBvdXRwdXQuIgorICAgICAgICAgICAgICAgICAgKyAiIChEZWZhdWx0OiAlcykiICUgKFVURjgsKSkKK3BhcnNlci5hZGRfb3B0aW9uKCItLWNxbHNocmMiLCBoZWxwPSJTcGVjaWZ5IGFuIGFsdGVybmF0aXZlIGNxbHNocmMgZmlsZSBsb2NhdGlvbi4iKQorcGFyc2VyLmFkZF9vcHRpb24oIi0tY3JlZGVudGlhbHMiLCBoZWxwPSJTcGVjaWZ5IGFuIGFsdGVybmF0aXZlIGNyZWRlbnRpYWxzIGZpbGUgbG9jYXRpb24uIikKK3BhcnNlci5hZGRfb3B0aW9uKCctLWNxbHZlcnNpb24nLCBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgICBoZWxwPSdTcGVjaWZ5IGEgcGFydGljdWxhciBDUUwgdmVyc2lvbiwgJworICAgICAgICAgICAgICAgICAgICAgICAnYnkgZGVmYXVsdCB0aGUgaGlnaGVzdCB2ZXJzaW9uIHN1cHBvcnRlZCBieSB0aGUgc2VydmVyIHdpbGwgYmUgdXNlZC4nCisgICAgICAgICAgICAgICAgICAgICAgICcgRXhhbXBsZXM6ICIzLjAuMyIsICIzLjEuMCInKQorcGFyc2VyLmFkZF9vcHRpb24oIi0tcHJvdG9jb2wtdmVyc2lvbiIsIHR5cGU9ImludCIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgIGhlbHA9J1NwZWNpZnkgYSBzcGVjaWZpYyBwcm90Y29sIHZlcnNpb24gb3RoZXJ3aXNlIHRoZSBjbGllbnQgd2lsbCBkZWZhdWx0IGFuZCBkb3duZ3JhZGUgYXMgbmVjZXNzYXJ5JykKKworcGFyc2VyLmFkZF9vcHRpb24oIi1lIiwgIi0tZXhlY3V0ZSIsIGhlbHA9J0V4ZWN1dGUgdGhlIHN0YXRlbWVudCBhbmQgcXVpdC4nKQorcGFyc2VyLmFkZF9vcHRpb24oIi0tY29ubmVjdC10aW1lb3V0IiwgZGVmYXVsdD1ERUZBVUxUX0NPTk5FQ1RfVElNRU9VVF9TRUNPTkRTLCBkZXN0PSdjb25uZWN0X3RpbWVvdXQnLAorICAgICAgICAgICAgICAgICAgaGVscD0nU3BlY2lmeSB0aGUgY29ubmVjdGlvbiB0aW1lb3V0IGluIHNlY29uZHMgKGRlZmF1bHQ6ICVkZWZhdWx0IHNlY29uZHMpLicpCitwYXJzZXIuYWRkX29wdGlvbigiLS1yZXF1ZXN0LXRpbWVvdXQiLCBkZWZhdWx0PURFRkFVTFRfUkVRVUVTVF9USU1FT1VUX1NFQ09ORFMsIGRlc3Q9J3JlcXVlc3RfdGltZW91dCcsCisgICAgICAgICAgICAgICAgICBoZWxwPSdTcGVjaWZ5IHRoZSBkZWZhdWx0IHJlcXVlc3QgdGltZW91dCBpbiBzZWNvbmRzIChkZWZhdWx0OiAlZGVmYXVsdCBzZWNvbmRzKS4nKQorcGFyc2VyLmFkZF9vcHRpb24oIi10IiwgIi0tdHR5IiwgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0ndHR5JywKKyAgICAgICAgICAgICAgICAgIGhlbHA9J0ZvcmNlIHR0eSBtb2RlIChjb21tYW5kIHByb21wdCkuJykKK3BhcnNlci5hZGRfb3B0aW9uKCctdicsIGFjdGlvbj0idmVyc2lvbiIsIGhlbHA9J1ByaW50IHRoZSBjdXJyZW50IHZlcnNpb24gb2YgY3Fsc2guJykKKworIyBUaGlzIGlzIGEgaGlkZGVuIG9wdGlvbiB0byBzdXBwcmVzcyB0aGUgd2FybmluZyB3aGVuIHRoZSAtcC8tLXBhc3N3b3JkIGNvbW1hbmQgbGluZSBvcHRpb24gaXMgdXNlZC4KKyMgUG93ZXIgdXNlcnMgbWF5IHVzZSB0aGlzIG9wdGlvbiBpZiB0aGV5IGtub3cgbm8gb3RoZXIgcGVvcGxlIGhhcyBhY2Nlc3MgdG8gdGhlIHN5c3RlbSB3aGVyZSBjcWxzaCBpcyBydW4gb3IgZG9uJ3QgY2FyZSBhYm91dCBzZWN1cml0eS4KKyMgVXNlIG9mIHRoaXMgb3B0aW9uIGluIHNjcmlwdGluZyBpcyBkaXNjb3VyYWdlZC4gUGxlYXNlIHVzZSBhICh0ZW1wb3JhcnkpIGNyZWRlbnRpYWxzIGZpbGUgd2hlcmUgcG9zc2libGUuCisjIFRoZSBDYXNzYW5kcmEgZGlzdHJpYnV0ZWQgdGVzdHMgKGR0ZXN0cykgYWxzbyB1c2UgdGhpcyBvcHRpb24gaW4gc29tZSB0ZXN0cyB3aGVuIGEgd2VsbC1rbm93biBwYXNzd29yZCBpcyBzdXBwbGllZCB2aWEgdGhlIGNvbW1hbmQgbGluZS4KK3BhcnNlci5hZGRfb3B0aW9uKCItLWluc2VjdXJlLXBhc3N3b3JkLXdpdGhvdXQtd2FybmluZyIsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlc3Q9J2luc2VjdXJlX3Bhc3N3b3JkX3dpdGhvdXRfd2FybmluZycsCisgICAgICAgICAgICAgICAgICBoZWxwPW9wdHBhcnNlLlNVUFBSRVNTX0hFTFApCisKKyMgdXNlIGNmb3B0aW9ucyBmb3IgY29uZmlnIGZpbGUKKworb3B0X3ZhbHVlcyA9IG9wdHBhcnNlLlZhbHVlcygpCisoY2ZvcHRpb25zLCBhcmd1bWVudHMpID0gcGFyc2VyLnBhcnNlX2FyZ3Moc3lzLmFyZ3ZbMTpdLCB2YWx1ZXM9b3B0X3ZhbHVlcykKKworIyBCRUdJTiBoaXN0b3J5IGNvbmZpZworCisKK2RlZiBta2RpcnAocGF0aCk6CisgICAgIiIiQ3JlYXRlcyBhbGwgcGFyZW50IGRpcmVjdG9yaWVzIHVwIHRvIHBhdGggcGFyYW1ldGVyIG9yIGZhaWxzIHdoZW4gcGF0aCBleGlzdHMsIGJ1dCBpdCBpcyBub3QgYSBkaXJlY3RvcnkuIiIiCisKKyAgICB0cnk6CisgICAgICAgIG9zLm1ha2VkaXJzKHBhdGgpCisgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHBhdGgpOgorICAgICAgICAgICAgcmFpc2UKKworCitkZWYgcmVzb2x2ZV9jcWxfaGlzdG9yeV9maWxlKCk6CisgICAgZGVmYXVsdF9jcWxfaGlzdG9yeSA9IG9zLnBhdGguZXhwYW5kdXNlcihvcy5wYXRoLmpvaW4oJ34nLCAnLmNhc3NhbmRyYScsICdjcWxzaF9oaXN0b3J5JykpCisgICAgaWYgJ0NRTF9ISVNUT1JZJyBpbiBvcy5lbnZpcm9uOgorICAgICAgICByZXR1cm4gb3MuZW52aXJvblsnQ1FMX0hJU1RPUlknXQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBkZWZhdWx0X2NxbF9oaXN0b3J5CisKKworSElTVE9SWSA9IHJlc29sdmVfY3FsX2hpc3RvcnlfZmlsZSgpCitISVNUT1JZX0RJUiA9IG9zLnBhdGguZGlybmFtZShISVNUT1JZKQorCit0cnk6CisgICAgbWtkaXJwKEhJU1RPUllfRElSKQorZXhjZXB0IE9TRXJyb3I6CisgICAgcHJpbnQoJ1xuV2FybmluZzogQ2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgYXQgYCVzYC4gQ29tbWFuZCBoaXN0b3J5IHdpbGwgbm90IGJlIHNhdmVkLiBQbGVhc2UgY2hlY2sgd2hhdCB3YXMgdGhlIGVudmlyb25tZW50IHByb3BlcnR5IENRTF9ISVNUT1JZIHNldCB0by5cbicgJSBISVNUT1JZX0RJUikKKworCisjIEVORCBoaXN0b3J5IGNvbmZpZworCisKK0RFRkFVTFRfQ1FMU0hSQyA9IG9zLnBhdGguZXhwYW5kdXNlcihvcy5wYXRoLmpvaW4oJ34nLCAnLmNhc3NhbmRyYScsICdjcWxzaHJjJykpCisKK2lmIGhhc2F0dHIoY2ZvcHRpb25zLCAnY3Fsc2hyYycpOgorICAgIENPTkZJR19GSUxFID0gb3MucGF0aC5leHBhbmR1c2VyKGNmb3B0aW9ucy5jcWxzaHJjKQorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhDT05GSUdfRklMRSk6CisgICAgICAgIHByaW50KCdcbldhcm5pbmc6IFNwZWNpZmllZCBjcWxzaHJjIGxvY2F0aW9uIGAlc2AgZG9lcyBub3QgZXhpc3QuICBVc2luZyBgJXNgIGluc3RlYWQuXG4nICUgKENPTkZJR19GSUxFLCBERUZBVUxUX0NRTFNIUkMpKQorICAgICAgICBDT05GSUdfRklMRSA9IERFRkFVTFRfQ1FMU0hSQworZWxzZToKKyAgICBDT05GSUdfRklMRSA9IERFRkFVTFRfQ1FMU0hSQworCitDUUxfRElSID0gb3MucGF0aC5kaXJuYW1lKENPTkZJR19GSUxFKQorCitDUUxfRVJST1JTID0gKAorICAgIGNhc3NhbmRyYS5BbHJlYWR5RXhpc3RzLCBjYXNzYW5kcmEuQXV0aGVudGljYXRpb25GYWlsZWQsIGNhc3NhbmRyYS5Db29yZGluYXRpb25GYWlsdXJlLAorICAgIGNhc3NhbmRyYS5JbnZhbGlkUmVxdWVzdCwgY2Fzc2FuZHJhLlRpbWVvdXQsIGNhc3NhbmRyYS5VbmF1dGhvcml6ZWQsIGNhc3NhbmRyYS5PcGVyYXRpb25UaW1lZE91dCwKKyAgICBjYXNzYW5kcmEuY2x1c3Rlci5Ob0hvc3RBdmFpbGFibGUsCisgICAgY2Fzc2FuZHJhLmNvbm5lY3Rpb24uQ29ubmVjdGlvbkJ1c3ksIGNhc3NhbmRyYS5jb25uZWN0aW9uLlByb3RvY29sRXJyb3IsIGNhc3NhbmRyYS5jb25uZWN0aW9uLkNvbm5lY3Rpb25FeGNlcHRpb24sCisgICAgY2Fzc2FuZHJhLnByb3RvY29sLkVycm9yTWVzc2FnZSwgY2Fzc2FuZHJhLnByb3RvY29sLkludGVybmFsRXJyb3IsIGNhc3NhbmRyYS5xdWVyeS5UcmFjZVVuYXZhaWxhYmxlCispCisKK2RlYnVnX2NvbXBsZXRpb24gPSBib29sKG9zLmVudmlyb24uZ2V0KCdDUUxTSF9ERUJVR19DT01QTEVUSU9OJywgJycpID09ICdZRVMnKQorCisKK2NsYXNzIE5vS2V5c3BhY2VFcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitjbGFzcyBLZXlzcGFjZU5vdEZvdW5kKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2NsYXNzIENvbHVtbkZhbWlseU5vdEZvdW5kKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2NsYXNzIEluZGV4Tm90Rm91bmQoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKKworY2xhc3MgTWF0ZXJpYWxpemVkVmlld05vdEZvdW5kKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2NsYXNzIE9iamVjdE5vdEZvdW5kKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2NsYXNzIFZlcnNpb25Ob3RTdXBwb3J0ZWQoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKKworY2xhc3MgVXNlclR5cGVOb3RGb3VuZChFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitjbGFzcyBGdW5jdGlvbk5vdEZvdW5kKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2NsYXNzIEFnZ3JlZ2F0ZU5vdEZvdW5kKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2NsYXNzIERlY29kZUVycm9yKEV4Y2VwdGlvbik6CisgICAgdmVyYiA9ICdkZWNvZGUnCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGhlYnl0ZXMsIGVyciwgY29sbmFtZT1Ob25lKToKKyAgICAgICAgc2VsZi50aGVieXRlcyA9IHRoZWJ5dGVzCisgICAgICAgIHNlbGYuZXJyID0gZXJyCisgICAgICAgIHNlbGYuY29sbmFtZSA9IGNvbG5hbWUKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc3RyKHNlbGYudGhlYnl0ZXMpCisKKyAgICBkZWYgbWVzc2FnZShzZWxmKToKKyAgICAgICAgd2hhdCA9ICd2YWx1ZSAlcicgJSAoc2VsZi50aGVieXRlcywpCisgICAgICAgIGlmIHNlbGYuY29sbmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHdoYXQgPSAndmFsdWUgJXIgKGZvciBjb2x1bW4gJXIpJyAlIChzZWxmLnRoZWJ5dGVzLCBzZWxmLmNvbG5hbWUpCisgICAgICAgIHJldHVybiAnRmFpbGVkIHRvICVzICVzIDogJXMnIFwKKyAgICAgICAgICAgICAgICUgKHNlbGYudmVyYiwgd2hhdCwgc2VsZi5lcnIpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnPCVzICVzPicgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYubWVzc2FnZSgpKQorCisKK2RlZiBtYXliZV9lbnN1cmVfdGV4dCh2YWwpOgorICAgIHJldHVybiBzdHIodmFsKSBpZiB2YWwgZWxzZSB2YWwKKworCitjbGFzcyBGb3JtYXRFcnJvcihEZWNvZGVFcnJvcik6CisgICAgdmVyYiA9ICdmb3JtYXQnCisKKworZGVmIGZ1bGxfY3FsX3ZlcnNpb24odmVyKToKKyAgICB3aGlsZSB2ZXIuY291bnQoJy4nKSA8IDI6CisgICAgICAgIHZlciArPSAnLjAnCisgICAgdmVyX3BhcnRzID0gdmVyLnNwbGl0KCctJywgMSkgKyBbJyddCisgICAgdmVydHVwbGUgPSB0dXBsZShsaXN0KG1hcChpbnQsIHZlcl9wYXJ0c1swXS5zcGxpdCgnLicpKSkgKyBbdmVyX3BhcnRzWzFdXSkKKyAgICByZXR1cm4gdmVyLCB2ZXJ0dXBsZQorCisKK2RlZiBmb3JtYXRfdmFsdWUodmFsLCBjcWx0eXBlLCBlbmNvZGluZywgYWRkY29sb3I9RmFsc2UsIGRhdGVfdGltZV9mb3JtYXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgZmxvYXRfcHJlY2lzaW9uPU5vbmUsIGNvbG9ybWFwPU5vbmUsIG51bGx2YWw9Tm9uZSk6CisgICAgaWYgaXNpbnN0YW5jZSh2YWwsIERlY29kZUVycm9yKToKKyAgICAgICAgaWYgYWRkY29sb3I6CisgICAgICAgICAgICByZXR1cm4gY29sb3JtZShyZXByKHZhbC50aGVieXRlcyksIGNvbG9ybWFwLCAnZXJyb3InKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEZvcm1hdHRlZFZhbHVlKHJlcHIodmFsLnRoZWJ5dGVzKSkKKyAgICByZXR1cm4gZm9ybWF0X2J5X3R5cGUodmFsLCBjcWx0eXBlPWNxbHR5cGUsIGVuY29kaW5nPWVuY29kaW5nLCBjb2xvcm1hcD1jb2xvcm1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkY29sb3I9YWRkY29sb3IsIG51bGx2YWw9bnVsbHZhbCwgZGF0ZV90aW1lX2Zvcm1hdD1kYXRlX3RpbWVfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdF9wcmVjaXNpb249ZmxvYXRfcHJlY2lzaW9uKQorCisKK2RlZiBzaG93X3dhcm5pbmdfd2l0aG91dF9xdW90aW5nX2xpbmUobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGZpbGU9Tm9uZSwgbGluZT1Ob25lKToKKyAgICBpZiBmaWxlIGlzIE5vbmU6CisgICAgICAgIGZpbGUgPSBzeXMuc3RkZXJyCisgICAgdHJ5OgorICAgICAgICBmaWxlLndyaXRlKHdhcm5pbmdzLmZvcm1hdHdhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGxpbmU9JycpKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICBwYXNzCisKKword2FybmluZ3Muc2hvd3dhcm5pbmcgPSBzaG93X3dhcm5pbmdfd2l0aG91dF9xdW90aW5nX2xpbmUKK3dhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdhbHdheXMnLCBjYXRlZ29yeT1jcWwzaGFuZGxpbmcuVW5leHBlY3RlZFRhYmxlU3RydWN0dXJlKQorCisKK2NsYXNzIFNoZWxsKGNtZC5DbWQpOgorICAgIGN1c3RvbV9wcm9tcHQgPSBvcy5nZXRlbnYoJ0NRTFNIX1BST01QVCcsICcnKQorICAgIGlmIGN1c3RvbV9wcm9tcHQgIT0gJyc6CisgICAgICAgIGN1c3RvbV9wcm9tcHQgKz0gIlxuIgorICAgIGRlZmF1bHRfcHJvbXB0ID0gY3VzdG9tX3Byb21wdCArICJjcWxzaD4gIgorICAgIGNvbnRpbnVlX3Byb21wdCA9ICIgICAuLi4gIgorICAgIGtleXNwYWNlX3Byb21wdCA9IGN1c3RvbV9wcm9tcHQgKyAiY3Fsc2g6e30+ICIKKyAgICBrZXlzcGFjZV9jb250aW51ZV9wcm9tcHQgPSAie30gICAgLi4uICIKKyAgICBzaG93X2xpbmVfbnVtcyA9IEZhbHNlCisgICAgZGVidWcgPSBGYWxzZQorICAgIGNvdmVyYWdlID0gRmFsc2UKKyAgICBjb3ZlcmFnZXJjX3BhdGggPSBOb25lCisgICAgc3RvcCA9IEZhbHNlCisgICAgbGFzdF9oaXN0ID0gTm9uZQorICAgIHNodW50ZWRfcXVlcnlfb3V0ID0gTm9uZQorICAgIHVzZV9wYWdpbmcgPSBUcnVlCisKKyAgICBkZWZhdWx0X3BhZ2Vfc2l6ZSA9IDEwMAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3RuYW1lLCBwb3J0LCBjb2xvcj1GYWxzZSwKKyAgICAgICAgICAgICAgICAgdXNlcm5hbWU9Tm9uZSwgZW5jb2Rpbmc9Tm9uZSwgc3RkaW49Tm9uZSwgdHR5PVRydWUsCisgICAgICAgICAgICAgICAgIGNvbXBsZXRla2V5PURFRkFVTFRfQ09NUExFVEVLRVksIGJyb3dzZXI9Tm9uZSwgdXNlX2Nvbm49Tm9uZSwKKyAgICAgICAgICAgICAgICAgY3FsdmVyPU5vbmUsIGtleXNwYWNlPU5vbmUsCisgICAgICAgICAgICAgICAgIHRyYWNpbmdfZW5hYmxlZD1GYWxzZSwgZXhwYW5kX2VuYWJsZWQ9RmFsc2UsCisgICAgICAgICAgICAgICAgIGRpc3BsYXlfbmFub3RpbWVfZm9ybWF0PURFRkFVTFRfTkFOT1RJTUVfRk9STUFULAorICAgICAgICAgICAgICAgICBkaXNwbGF5X3RpbWVzdGFtcF9mb3JtYXQ9REVGQVVMVF9USU1FU1RBTVBfRk9STUFULAorICAgICAgICAgICAgICAgICBkaXNwbGF5X2RhdGVfZm9ybWF0PURFRkFVTFRfREFURV9GT1JNQVQsCisgICAgICAgICAgICAgICAgIGRpc3BsYXlfZmxvYXRfcHJlY2lzaW9uPURFRkFVTFRfRkxPQVRfUFJFQ0lTSU9OLAorICAgICAgICAgICAgICAgICBkaXNwbGF5X2RvdWJsZV9wcmVjaXNpb249REVGQVVMVF9ET1VCTEVfUFJFQ0lTSU9OLAorICAgICAgICAgICAgICAgICBkaXNwbGF5X3RpbWV6b25lPU5vbmUsCisgICAgICAgICAgICAgICAgIG1heF90cmFjZV93YWl0PURFRkFVTFRfTUFYX1RSQUNFX1dBSVQsCisgICAgICAgICAgICAgICAgIHNzbD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgc2luZ2xlX3N0YXRlbWVudD1Ob25lLAorICAgICAgICAgICAgICAgICByZXF1ZXN0X3RpbWVvdXQ9REVGQVVMVF9SRVFVRVNUX1RJTUVPVVRfU0VDT05EUywKKyAgICAgICAgICAgICAgICAgcHJvdG9jb2xfdmVyc2lvbj1Ob25lLAorICAgICAgICAgICAgICAgICBjb25uZWN0X3RpbWVvdXQ9REVGQVVMVF9DT05ORUNUX1RJTUVPVVRfU0VDT05EUywKKyAgICAgICAgICAgICAgICAgaXNfc3Vic2hlbGw9RmFsc2UsCisgICAgICAgICAgICAgICAgIGF1dGhfcHJvdmlkZXI9Tm9uZSk6CisgICAgICAgIGNtZC5DbWQuX19pbml0X18oc2VsZiwgY29tcGxldGVrZXk9Y29tcGxldGVrZXkpCisgICAgICAgIHNlbGYuaG9zdG5hbWUgPSBob3N0bmFtZQorICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CisgICAgICAgIHNlbGYuYXV0aF9wcm92aWRlciA9IGF1dGhfcHJvdmlkZXIKKyAgICAgICAgc2VsZi51c2VybmFtZSA9IHVzZXJuYW1lCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShhdXRoX3Byb3ZpZGVyLCBQbGFpblRleHRBdXRoUHJvdmlkZXIpOgorICAgICAgICAgICAgc2VsZi51c2VybmFtZSA9IGF1dGhfcHJvdmlkZXIudXNlcm5hbWUKKyAgICAgICAgICAgIGlmIG5vdCBhdXRoX3Byb3ZpZGVyLnBhc3N3b3JkOgorICAgICAgICAgICAgICAgICMgaWYgbm8gcGFzc3dvcmQgaXMgcHJvdmlkZWQsIHdlIG5lZWQgdG8gcXVlcnkgdGhlIHVzZXIgdG8gZ2V0IG9uZS4KKyAgICAgICAgICAgICAgICBwYXNzd29yZCA9IGdldHBhc3MuZ2V0cGFzcygpCisgICAgICAgICAgICAgICAgc2VsZi5hdXRoX3Byb3ZpZGVyID0gUGxhaW5UZXh0QXV0aFByb3ZpZGVyKHVzZXJuYW1lPWF1dGhfcHJvdmlkZXIudXNlcm5hbWUsIHBhc3N3b3JkPXBhc3N3b3JkKQorCisgICAgICAgIHNlbGYua2V5c3BhY2UgPSBrZXlzcGFjZQorICAgICAgICBzZWxmLnNzbCA9IHNzbAorICAgICAgICBzZWxmLnRyYWNpbmdfZW5hYmxlZCA9IHRyYWNpbmdfZW5hYmxlZAorICAgICAgICBzZWxmLnBhZ2Vfc2l6ZSA9IHNlbGYuZGVmYXVsdF9wYWdlX3NpemUKKyAgICAgICAgc2VsZi5leHBhbmRfZW5hYmxlZCA9IGV4cGFuZF9lbmFibGVkCisgICAgICAgIGlmIHVzZV9jb25uOgorICAgICAgICAgICAgc2VsZi5jb25uID0gdXNlX2Nvbm4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGt3YXJncyA9IHt9CisgICAgICAgICAgICBpZiBwcm90b2NvbF92ZXJzaW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGt3YXJnc1sncHJvdG9jb2xfdmVyc2lvbiddID0gcHJvdG9jb2xfdmVyc2lvbgorICAgICAgICAgICAgc2VsZi5jb25uID0gQ2x1c3Rlcihjb250YWN0X3BvaW50cz0oc2VsZi5ob3N0bmFtZSwpLCBwb3J0PXNlbGYucG9ydCwgY3FsX3ZlcnNpb249Y3FsdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoX3Byb3ZpZGVyPXNlbGYuYXV0aF9wcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX29wdGlvbnM9c3NsaGFuZGxpbmcuc3NsX3NldHRpbmdzKGhvc3RuYW1lLCBDT05GSUdfRklMRSkgaWYgc3NsIGVsc2UgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9iYWxhbmNpbmdfcG9saWN5PVdoaXRlTGlzdFJvdW5kUm9iaW5Qb2xpY3koW3NlbGYuaG9zdG5hbWVdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbF9jb25uZWN0aW9uX3RpbWVvdXQ9Y29ubmVjdF90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0X3RpbWVvdXQ9Y29ubmVjdF90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmt3YXJncykKKyAgICAgICAgc2VsZi5vd25zX2Nvbm5lY3Rpb24gPSBub3QgdXNlX2Nvbm4KKworICAgICAgICBpZiBrZXlzcGFjZToKKyAgICAgICAgICAgIHNlbGYuc2Vzc2lvbiA9IHNlbGYuY29ubi5jb25uZWN0KGtleXNwYWNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zZXNzaW9uID0gc2VsZi5jb25uLmNvbm5lY3QoKQorCisgICAgICAgIGlmIGJyb3dzZXIgPT0gIiI6CisgICAgICAgICAgICBicm93c2VyID0gTm9uZQorICAgICAgICBzZWxmLmJyb3dzZXIgPSBicm93c2VyCisgICAgICAgIHNlbGYuY29sb3IgPSBjb2xvcgorCisgICAgICAgIHNlbGYuZGlzcGxheV9uYW5vdGltZV9mb3JtYXQgPSBkaXNwbGF5X25hbm90aW1lX2Zvcm1hdAorICAgICAgICBzZWxmLmRpc3BsYXlfdGltZXN0YW1wX2Zvcm1hdCA9IGRpc3BsYXlfdGltZXN0YW1wX2Zvcm1hdAorICAgICAgICBzZWxmLmRpc3BsYXlfZGF0ZV9mb3JtYXQgPSBkaXNwbGF5X2RhdGVfZm9ybWF0CisKKyAgICAgICAgc2VsZi5kaXNwbGF5X2Zsb2F0X3ByZWNpc2lvbiA9IGRpc3BsYXlfZmxvYXRfcHJlY2lzaW9uCisgICAgICAgIHNlbGYuZGlzcGxheV9kb3VibGVfcHJlY2lzaW9uID0gZGlzcGxheV9kb3VibGVfcHJlY2lzaW9uCisKKyAgICAgICAgc2VsZi5kaXNwbGF5X3RpbWV6b25lID0gZGlzcGxheV90aW1lem9uZQorCisgICAgICAgIHNlbGYuc2Vzc2lvbi5kZWZhdWx0X3RpbWVvdXQgPSByZXF1ZXN0X3RpbWVvdXQKKyAgICAgICAgc2VsZi5zZXNzaW9uLnJvd19mYWN0b3J5ID0gb3JkZXJlZF9kaWN0X2ZhY3RvcnkKKyAgICAgICAgc2VsZi5zZXNzaW9uLmRlZmF1bHRfY29uc2lzdGVuY3lfbGV2ZWwgPSBjYXNzYW5kcmEuQ29uc2lzdGVuY3lMZXZlbC5PTkUKKyAgICAgICAgc2VsZi5nZXRfY29ubmVjdGlvbl92ZXJzaW9ucygpCisgICAgICAgIHNlbGYuc2V0X2V4cGFuZGVkX2NxbF92ZXJzaW9uKHNlbGYuY29ubmVjdGlvbl92ZXJzaW9uc1snY3FsJ10pCisKKyAgICAgICAgc2VsZi5jdXJyZW50X2tleXNwYWNlID0ga2V5c3BhY2UKKworICAgICAgICBzZWxmLm1heF90cmFjZV93YWl0ID0gbWF4X3RyYWNlX3dhaXQKKyAgICAgICAgc2VsZi5zZXNzaW9uLm1heF90cmFjZV93YWl0ID0gbWF4X3RyYWNlX3dhaXQKKworICAgICAgICBzZWxmLnR0eSA9IHR0eQorICAgICAgICBzZWxmLmVuY29kaW5nID0gZW5jb2RpbmcKKworICAgICAgICBzZWxmLm91dHB1dF9jb2RlYyA9IGNvZGVjcy5sb29rdXAoZW5jb2RpbmcpCisKKyAgICAgICAgc2VsZi5zdGF0ZW1lbnQgPSBTdHJpbmdJTygpCisgICAgICAgIHNlbGYubGluZW5vID0gMQorICAgICAgICBzZWxmLmluX2NvbW1lbnQgPSBGYWxzZQorCisgICAgICAgIHNlbGYucHJvbXB0ID0gJycKKyAgICAgICAgaWYgc3RkaW4gaXMgTm9uZToKKyAgICAgICAgICAgIHN0ZGluID0gc3lzLnN0ZGluCisKKyAgICAgICAgaWYgdHR5OgorICAgICAgICAgICAgc2VsZi5yZXNldF9wcm9tcHQoKQorICAgICAgICAgICAgc2VsZi5yZXBvcnRfY29ubmVjdGlvbigpCisgICAgICAgICAgICBwcmludCgnVXNlIEhFTFAgZm9yIGhlbHAuJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc2hvd19saW5lX251bXMgPSBUcnVlCisgICAgICAgIHNlbGYuc3RkaW4gPSBzdGRpbgorICAgICAgICBzZWxmLnF1ZXJ5X291dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgc2VsZi5jb25zaXN0ZW5jeV9sZXZlbCA9IGNhc3NhbmRyYS5Db25zaXN0ZW5jeUxldmVsLk9ORQorICAgICAgICBzZWxmLnNlcmlhbF9jb25zaXN0ZW5jeV9sZXZlbCA9IGNhc3NhbmRyYS5Db25zaXN0ZW5jeUxldmVsLlNFUklBTAorCisgICAgICAgIHNlbGYuZW1wdHlfbGluZXMgPSAwCisgICAgICAgIHNlbGYuc3RhdGVtZW50X2Vycm9yID0gRmFsc2UKKyAgICAgICAgc2VsZi5zaW5nbGVfc3RhdGVtZW50ID0gc2luZ2xlX3N0YXRlbWVudAorICAgICAgICBzZWxmLmlzX3N1YnNoZWxsID0gaXNfc3Vic2hlbGwKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBiYXRjaF9tb2RlKHNlbGYpOgorICAgICAgICByZXR1cm4gbm90IHNlbGYudHR5CisKKyAgICBkZWYgc2V0X2V4cGFuZGVkX2NxbF92ZXJzaW9uKHNlbGYsIHZlcik6CisgICAgICAgIHZlciwgdmVydHVwbGUgPSBmdWxsX2NxbF92ZXJzaW9uKHZlcikKKyAgICAgICAgc2VsZi5jcWxfdmVyc2lvbiA9IHZlcgorICAgICAgICBzZWxmLmNxbF92ZXJfdHVwbGUgPSB2ZXJ0dXBsZQorCisgICAgZGVmIGNxbHZlcl9hdGxlYXN0KHNlbGYsIG1ham9yLCBtaW5vcj0wLCBwYXRjaD0wKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY3FsX3Zlcl90dXBsZVs6M10gPj0gKG1ham9yLCBtaW5vciwgcGF0Y2gpCisKKyAgICBkZWYgbXlmb3JtYXRfdmFsdWUoc2VsZiwgdmFsLCBjcWx0eXBlPU5vbmUsICoqa3dhcmdzKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWwsIERlY29kZUVycm9yKToKKyAgICAgICAgICAgIHNlbGYuZGVjb2RpbmdfZXJyb3JzLmFwcGVuZCh2YWwpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGR0Zm9ybWF0cyA9IERhdGVUaW1lRm9ybWF0KHRpbWVzdGFtcF9mb3JtYXQ9c2VsZi5kaXNwbGF5X3RpbWVzdGFtcF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlX2Zvcm1hdD1zZWxmLmRpc3BsYXlfZGF0ZV9mb3JtYXQsIG5hbm90aW1lX2Zvcm1hdD1zZWxmLmRpc3BsYXlfbmFub3RpbWVfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXpvbmU9c2VsZi5kaXNwbGF5X3RpbWV6b25lKQorICAgICAgICAgICAgcHJlY2lzaW9uID0gc2VsZi5kaXNwbGF5X2RvdWJsZV9wcmVjaXNpb24gaWYgY3FsdHlwZSBpcyBub3QgTm9uZSBhbmQgY3FsdHlwZS50eXBlX25hbWUgPT0gJ2RvdWJsZScgXAorICAgICAgICAgICAgICAgIGVsc2Ugc2VsZi5kaXNwbGF5X2Zsb2F0X3ByZWNpc2lvbgorICAgICAgICAgICAgcmV0dXJuIGZvcm1hdF92YWx1ZSh2YWwsIGNxbHR5cGU9Y3FsdHlwZSwgZW5jb2Rpbmc9c2VsZi5vdXRwdXRfY29kZWMubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkY29sb3I9c2VsZi5jb2xvciwgZGF0ZV90aW1lX2Zvcm1hdD1kdGZvcm1hdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0X3ByZWNpc2lvbj1wcmVjaXNpb24sICoqa3dhcmdzKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICBlcnIgPSBGb3JtYXRFcnJvcih2YWwsIGUpCisgICAgICAgICAgICBzZWxmLmRlY29kaW5nX2Vycm9ycy5hcHBlbmQoZXJyKQorICAgICAgICAgICAgcmV0dXJuIGZvcm1hdF92YWx1ZShlcnIsIGNxbHR5cGU9Y3FsdHlwZSwgZW5jb2Rpbmc9c2VsZi5vdXRwdXRfY29kZWMubmFtZSwgYWRkY29sb3I9c2VsZi5jb2xvcikKKworICAgIGRlZiBteWZvcm1hdF9jb2xuYW1lKHNlbGYsIG5hbWUsIHRhYmxlX21ldGE9Tm9uZSk6CisgICAgICAgIGNvbHVtbl9jb2xvcnMgPSBDT0xVTU5fTkFNRV9DT0xPUlMuY29weSgpCisgICAgICAgICMgY2hlY2sgY29sdW1uIHJvbGUgYW5kIGNvbG9yIGFwcHJvcHJpYXRlbHkKKyAgICAgICAgaWYgdGFibGVfbWV0YToKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gW2NvbC5uYW1lIGZvciBjb2wgaW4gdGFibGVfbWV0YS5wYXJ0aXRpb25fa2V5XToKKyAgICAgICAgICAgICAgICBjb2x1bW5fY29sb3JzLmRlZmF1bHRfZmFjdG9yeSA9IGxhbWJkYTogUkVECisgICAgICAgICAgICBlbGlmIG5hbWUgaW4gW2NvbC5uYW1lIGZvciBjb2wgaW4gdGFibGVfbWV0YS5jbHVzdGVyaW5nX2tleV06CisgICAgICAgICAgICAgICAgY29sdW1uX2NvbG9ycy5kZWZhdWx0X2ZhY3RvcnkgPSBsYW1iZGE6IENZQU4KKyAgICAgICAgICAgIGVsaWYgbmFtZSBpbiB0YWJsZV9tZXRhLmNvbHVtbnMgYW5kIHRhYmxlX21ldGEuY29sdW1uc1tuYW1lXS5pc19zdGF0aWM6CisgICAgICAgICAgICAgICAgY29sdW1uX2NvbG9ycy5kZWZhdWx0X2ZhY3RvcnkgPSBsYW1iZGE6IFdISVRFCisgICAgICAgIHJldHVybiBzZWxmLm15Zm9ybWF0X3ZhbHVlKG5hbWUsIGNvbG9ybWFwPWNvbHVtbl9jb2xvcnMpCisKKyAgICBkZWYgcmVwb3J0X2Nvbm5lY3Rpb24oc2VsZik6CisgICAgICAgIHNlbGYuc2hvd19ob3N0KCkKKyAgICAgICAgc2VsZi5zaG93X3ZlcnNpb24oKQorCisgICAgZGVmIHNob3dfaG9zdChzZWxmKToKKyAgICAgICAgcHJpbnQoIkNvbm5lY3RlZCB0byB7MH0gYXQgezF9OnsyfSIKKyAgICAgICAgICAgICAgLmZvcm1hdChzZWxmLmFwcGx5Y29sb3Ioc2VsZi5nZXRfY2x1c3Rlcl9uYW1lKCksIEJMVUUpLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaG9zdG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3J0KSkKKworICAgIGRlZiBzaG93X3ZlcnNpb24oc2VsZik6CisgICAgICAgIHZlcnMgPSBzZWxmLmNvbm5lY3Rpb25fdmVyc2lvbnMuY29weSgpCisgICAgICAgIHZlcnNbJ3NodmVyJ10gPSB2ZXJzaW9uCisgICAgICAgICMgc3lzdGVtLlZlcnNpb25zWydjcWwnXSBhcHBhcmVudGx5IGRvZXMgbm90IHJlZmxlY3QgY2hhbmdlcyB3aXRoCisgICAgICAgICMgc2V0X2NxbF92ZXJzaW9uLgorICAgICAgICB2ZXJzWydjcWwnXSA9IHNlbGYuY3FsX3ZlcnNpb24KKyAgICAgICAgcHJpbnQoIltjcWxzaCAlKHNodmVyKXMgfCBDYXNzYW5kcmEgJShidWlsZClzIHwgQ1FMIHNwZWMgJShjcWwpcyB8IE5hdGl2ZSBwcm90b2NvbCB2JShwcm90b2NvbClzXSIgJSB2ZXJzKQorCisgICAgZGVmIHNob3dfc2Vzc2lvbihzZWxmLCBzZXNzaW9uaWQsIHBhcnRpYWxfc2Vzc2lvbj1GYWxzZSk6CisgICAgICAgIHByaW50X3RyYWNlX3Nlc3Npb24oc2VsZiwgc2VsZi5zZXNzaW9uLCBzZXNzaW9uaWQsIHBhcnRpYWxfc2Vzc2lvbikKKworICAgIGRlZiBzaG93X3JlcGxpY2FzKHNlbGYsIHRva2VuX3ZhbHVlLCBrZXlzcGFjZT1Ob25lKToKKyAgICAgICAga3MgPSBzZWxmLmN1cnJlbnRfa2V5c3BhY2UgaWYga2V5c3BhY2UgaXMgTm9uZSBlbHNlIGtleXNwYWNlCisgICAgICAgIHRva2VuX21hcCA9IHNlbGYuY29ubi5tZXRhZGF0YS50b2tlbl9tYXAKKyAgICAgICAgbm9kZXMgPSB0b2tlbl9tYXAuZ2V0X3JlcGxpY2FzKGtzLCB0b2tlbl9tYXAudG9rZW5fY2xhc3ModG9rZW5fdmFsdWUpKQorICAgICAgICBhZGRyZXNzZXMgPSBbeC5hZGRyZXNzIGZvciB4IGluIG5vZGVzXQorICAgICAgICBwcmludChmInthZGRyZXNzZXN9IikKKworICAgIGRlZiBnZXRfY29ubmVjdGlvbl92ZXJzaW9ucyhzZWxmKToKKyAgICAgICAgcmVzdWx0LCA9IHNlbGYuc2Vzc2lvbi5leGVjdXRlKCJzZWxlY3QgKiBmcm9tIHN5c3RlbS5sb2NhbCB3aGVyZSBrZXkgPSAnbG9jYWwnIikKKyAgICAgICAgdmVycyA9IHsKKyAgICAgICAgICAgICdidWlsZCc6IHJlc3VsdFsncmVsZWFzZV92ZXJzaW9uJ10sCisgICAgICAgICAgICAncHJvdG9jb2wnOiBzZWxmLmNvbm4ucHJvdG9jb2xfdmVyc2lvbiwKKyAgICAgICAgICAgICdjcWwnOiByZXN1bHRbJ2NxbF92ZXJzaW9uJ10sCisgICAgICAgIH0KKyAgICAgICAgc2VsZi5jb25uZWN0aW9uX3ZlcnNpb25zID0gdmVycworCisgICAgZGVmIGdldF9rZXlzcGFjZV9uYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5jb25uLm1ldGFkYXRhLmtleXNwYWNlcykKKworICAgIGRlZiBnZXRfY29sdW1uZmFtaWx5X25hbWVzKHNlbGYsIGtzbmFtZT1Ob25lKToKKyAgICAgICAgaWYga3NuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBrc25hbWUgPSBzZWxmLmN1cnJlbnRfa2V5c3BhY2UKKworICAgICAgICByZXR1cm4gbGlzdChzZWxmLmdldF9rZXlzcGFjZV9tZXRhKGtzbmFtZSkudGFibGVzKQorCisgICAgZGVmIGdldF9tYXRlcmlhbGl6ZWRfdmlld19uYW1lcyhzZWxmLCBrc25hbWU9Tm9uZSk6CisgICAgICAgIGlmIGtzbmFtZSBpcyBOb25lOgorICAgICAgICAgICAga3NuYW1lID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCisKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5nZXRfa2V5c3BhY2VfbWV0YShrc25hbWUpLnZpZXdzKQorCisgICAgZGVmIGdldF9pbmRleF9uYW1lcyhzZWxmLCBrc25hbWU9Tm9uZSk6CisgICAgICAgIGlmIGtzbmFtZSBpcyBOb25lOgorICAgICAgICAgICAga3NuYW1lID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCisKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5nZXRfa2V5c3BhY2VfbWV0YShrc25hbWUpLmluZGV4ZXMpCisKKyAgICBkZWYgZ2V0X2NvbHVtbl9uYW1lcyhzZWxmLCBrc25hbWUsIGNmbmFtZSk6CisgICAgICAgIGlmIGtzbmFtZSBpcyBOb25lOgorICAgICAgICAgICAga3NuYW1lID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCisgICAgICAgIGxheW91dCA9IHNlbGYuZ2V0X3RhYmxlX21ldGEoa3NuYW1lLCBjZm5hbWUpCisgICAgICAgIHJldHVybiBsaXN0KGxheW91dC5jb2x1bW5zKQorCisgICAgZGVmIGdldF91c2VydHlwZV9uYW1lcyhzZWxmLCBrc25hbWU9Tm9uZSk6CisgICAgICAgIGlmIGtzbmFtZSBpcyBOb25lOgorICAgICAgICAgICAga3NuYW1lID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCisKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5nZXRfa2V5c3BhY2VfbWV0YShrc25hbWUpLnVzZXJfdHlwZXMpCisKKyAgICBkZWYgZ2V0X3VzZXJ0eXBlX2xheW91dChzZWxmLCBrc25hbWUsIHR5cGVuYW1lKToKKyAgICAgICAgaWYga3NuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBrc25hbWUgPSBzZWxmLmN1cnJlbnRfa2V5c3BhY2UKKworICAgICAgICBrc19tZXRhID0gc2VsZi5nZXRfa2V5c3BhY2VfbWV0YShrc25hbWUpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdXNlcl90eXBlID0ga3NfbWV0YS51c2VyX3R5cGVzW3R5cGVuYW1lXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByYWlzZSBVc2VyVHlwZU5vdEZvdW5kKCJVc2VyIHR5cGUgeyFyfSBub3QgZm91bmQiLmZvcm1hdCh0eXBlbmFtZSkpCisKKyAgICAgICAgcmV0dXJuIGxpc3QoemlwKHVzZXJfdHlwZS5maWVsZF9uYW1lcywgdXNlcl90eXBlLmZpZWxkX3R5cGVzKSkKKworICAgIGRlZiBnZXRfdXNlcmZ1bmN0aW9uX25hbWVzKHNlbGYsIGtzbmFtZT1Ob25lKToKKyAgICAgICAgaWYga3NuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBrc25hbWUgPSBzZWxmLmN1cnJlbnRfa2V5c3BhY2UKKworICAgICAgICByZXR1cm4gW2YubmFtZSBmb3IgZiBpbiBsaXN0KHNlbGYuZ2V0X2tleXNwYWNlX21ldGEoa3NuYW1lKS5mdW5jdGlvbnMudmFsdWVzKCkpXQorCisgICAgZGVmIGdldF91c2VyYWdncmVnYXRlX25hbWVzKHNlbGYsIGtzbmFtZT1Ob25lKToKKyAgICAgICAgaWYga3NuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBrc25hbWUgPSBzZWxmLmN1cnJlbnRfa2V5c3BhY2UKKworICAgICAgICByZXR1cm4gW2YubmFtZSBmb3IgZiBpbiBsaXN0KHNlbGYuZ2V0X2tleXNwYWNlX21ldGEoa3NuYW1lKS5hZ2dyZWdhdGVzLnZhbHVlcygpKV0KKworICAgIGRlZiBnZXRfY2x1c3Rlcl9uYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jb25uLm1ldGFkYXRhLmNsdXN0ZXJfbmFtZQorCisgICAgZGVmIGdldF9wYXJ0aXRpb25lcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY29ubi5tZXRhZGF0YS5wYXJ0aXRpb25lcgorCisgICAgZGVmIGdldF9rZXlzcGFjZV9tZXRhKHNlbGYsIGtzbmFtZSk6CisgICAgICAgIGlmIGtzbmFtZSBpbiBzZWxmLmNvbm4ubWV0YWRhdGEua2V5c3BhY2VzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29ubi5tZXRhZGF0YS5rZXlzcGFjZXNba3NuYW1lXQorCisgICAgICAgIHJhaXNlIEtleXNwYWNlTm90Rm91bmQoJ0tleXNwYWNlICVyIG5vdCBmb3VuZC4nICUga3NuYW1lKQorCisgICAgZGVmIGdldF9rZXlzcGFjZXMoc2VsZik6CisgICAgICAgIHJldHVybiBsaXN0KHNlbGYuY29ubi5tZXRhZGF0YS5rZXlzcGFjZXMudmFsdWVzKCkpCisKKyAgICBkZWYgZ2V0X3Jpbmcoc2VsZiwga3MpOgorICAgICAgICBzZWxmLmNvbm4ubWV0YWRhdGEudG9rZW5fbWFwLnJlYnVpbGRfa2V5c3BhY2Uoa3MsIGJ1aWxkX2lmX2Fic2VudD1UcnVlKQorICAgICAgICByZXR1cm4gc2VsZi5jb25uLm1ldGFkYXRhLnRva2VuX21hcC50b2tlbnNfdG9faG9zdHNfYnlfa3Nba3NdCisKKyAgICBkZWYgZ2V0X3RhYmxlX21ldGEoc2VsZiwga3NuYW1lLCB0YWJsZW5hbWUpOgorICAgICAgICBpZiBrc25hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGtzbmFtZSA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQorICAgICAgICBrc21ldGEgPSBzZWxmLmdldF9rZXlzcGFjZV9tZXRhKGtzbmFtZSkKKyAgICAgICAgaWYgdGFibGVuYW1lIG5vdCBpbiBrc21ldGEudGFibGVzOgorICAgICAgICAgICAgaWYga3NuYW1lID09ICdzeXN0ZW1fYXV0aCcgYW5kIHRhYmxlbmFtZSBpbiBbJ3JvbGVzJywgJ3JvbGVfcGVybWlzc2lvbnMnXToKKyAgICAgICAgICAgICAgICBzZWxmLmdldF9mYWtlX2F1dGhfdGFibGVfbWV0YShrc25hbWUsIHRhYmxlbmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgQ29sdW1uRmFtaWx5Tm90Rm91bmQoIkNvbHVtbiBmYW1pbHkge30gbm90IGZvdW5kIi5mb3JtYXQodGFibGVuYW1lKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBrc21ldGEudGFibGVzW3RhYmxlbmFtZV0KKworICAgIGRlZiBnZXRfZmFrZV9hdXRoX3RhYmxlX21ldGEoc2VsZiwga3NuYW1lLCB0YWJsZW5hbWUpOgorICAgICAgICAjIG1heSBiZSB1c2luZyBleHRlcm5hbCBhdXRoIGltcGxlbWVudGF0aW9uIHNvIGludGVybmFsIHRhYmxlcworICAgICAgICAjIGFyZW4ndCBhY3R1YWxseSBkZWZpbmVkIGluIHNjaGVtYS4gSW4gdGhpcyBjYXNlLCB3ZSdsbCBmYWtlCisgICAgICAgICMgdGhlbSB1cAorICAgICAgICBpZiB0YWJsZW5hbWUgPT0gJ3JvbGVzJzoKKyAgICAgICAgICAgIGtzX21ldGEgPSBLZXlzcGFjZU1ldGFkYXRhKGtzbmFtZSwgVHJ1ZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgICAgIHRhYmxlX21ldGEgPSBUYWJsZU1ldGFkYXRhKGtzX21ldGEsICdyb2xlcycpCisgICAgICAgICAgICB0YWJsZV9tZXRhLmNvbHVtbnNbJ3JvbGUnXSA9IENvbHVtbk1ldGFkYXRhKHRhYmxlX21ldGEsICdyb2xlJywgY2Fzc2FuZHJhLmNxbHR5cGVzLlVURjhUeXBlKQorICAgICAgICAgICAgdGFibGVfbWV0YS5jb2x1bW5zWydpc19zdXBlcnVzZXInXSA9IENvbHVtbk1ldGFkYXRhKHRhYmxlX21ldGEsICdpc19zdXBlcnVzZXInLCBjYXNzYW5kcmEuY3FsdHlwZXMuQm9vbGVhblR5cGUpCisgICAgICAgICAgICB0YWJsZV9tZXRhLmNvbHVtbnNbJ2Nhbl9sb2dpbiddID0gQ29sdW1uTWV0YWRhdGEodGFibGVfbWV0YSwgJ2Nhbl9sb2dpbicsIGNhc3NhbmRyYS5jcWx0eXBlcy5Cb29sZWFuVHlwZSkKKyAgICAgICAgZWxpZiB0YWJsZW5hbWUgPT0gJ3JvbGVfcGVybWlzc2lvbnMnOgorICAgICAgICAgICAga3NfbWV0YSA9IEtleXNwYWNlTWV0YWRhdGEoa3NuYW1lLCBUcnVlLCBOb25lLCBOb25lKQorICAgICAgICAgICAgdGFibGVfbWV0YSA9IFRhYmxlTWV0YWRhdGEoa3NfbWV0YSwgJ3JvbGVfcGVybWlzc2lvbnMnKQorICAgICAgICAgICAgdGFibGVfbWV0YS5jb2x1bW5zWydyb2xlJ10gPSBDb2x1bW5NZXRhZGF0YSh0YWJsZV9tZXRhLCAncm9sZScsIGNhc3NhbmRyYS5jcWx0eXBlcy5VVEY4VHlwZSkKKyAgICAgICAgICAgIHRhYmxlX21ldGEuY29sdW1uc1sncmVzb3VyY2UnXSA9IENvbHVtbk1ldGFkYXRhKHRhYmxlX21ldGEsICdyZXNvdXJjZScsIGNhc3NhbmRyYS5jcWx0eXBlcy5VVEY4VHlwZSkKKyAgICAgICAgICAgIHRhYmxlX21ldGEuY29sdW1uc1sncGVybWlzc2lvbiddID0gQ29sdW1uTWV0YWRhdGEodGFibGVfbWV0YSwgJ3Blcm1pc3Npb24nLCBjYXNzYW5kcmEuY3FsdHlwZXMuVVRGOFR5cGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBDb2x1bW5GYW1pbHlOb3RGb3VuZCgiQ29sdW1uIGZhbWlseSB7fSBub3QgZm91bmQiLmZvcm1hdCh0YWJsZW5hbWUpKQorCisgICAgZGVmIGdldF9pbmRleF9tZXRhKHNlbGYsIGtzbmFtZSwgaWR4bmFtZSk6CisgICAgICAgIGlmIGtzbmFtZSBpcyBOb25lOgorICAgICAgICAgICAga3NuYW1lID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCisgICAgICAgIGtzbWV0YSA9IHNlbGYuZ2V0X2tleXNwYWNlX21ldGEoa3NuYW1lKQorCisgICAgICAgIGlmIGlkeG5hbWUgbm90IGluIGtzbWV0YS5pbmRleGVzOgorICAgICAgICAgICAgcmFpc2UgSW5kZXhOb3RGb3VuZCgiSW5kZXgge30gbm90IGZvdW5kIi5mb3JtYXQoaWR4bmFtZSkpCisKKyAgICAgICAgcmV0dXJuIGtzbWV0YS5pbmRleGVzW2lkeG5hbWVdCisKKyAgICBkZWYgZ2V0X3ZpZXdfbWV0YShzZWxmLCBrc25hbWUsIHZpZXduYW1lKToKKyAgICAgICAgaWYga3NuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBrc25hbWUgPSBzZWxmLmN1cnJlbnRfa2V5c3BhY2UKKyAgICAgICAga3NtZXRhID0gc2VsZi5nZXRfa2V5c3BhY2VfbWV0YShrc25hbWUpCisKKyAgICAgICAgaWYgdmlld25hbWUgbm90IGluIGtzbWV0YS52aWV3czoKKyAgICAgICAgICAgIHJhaXNlIE1hdGVyaWFsaXplZFZpZXdOb3RGb3VuZCgiTWF0ZXJpYWxpemVkIHZpZXcgJ3t9JyBub3QgZm91bmQiLmZvcm1hdCh2aWV3bmFtZSkpCisgICAgICAgIHJldHVybiBrc21ldGEudmlld3Nbdmlld25hbWVdCisKKyAgICBkZWYgZ2V0X29iamVjdF9tZXRhKHNlbGYsIGtzLCBuYW1lKToKKyAgICAgICAgaWYgbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgaWYga3MgYW5kIGtzIGluIHNlbGYuY29ubi5tZXRhZGF0YS5rZXlzcGFjZXM6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29ubi5tZXRhZGF0YS5rZXlzcGFjZXNba3NdCisgICAgICAgICAgICBlbGlmIHNlbGYuY3VycmVudF9rZXlzcGFjZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIE9iamVjdE5vdEZvdW5kKCIne30nIG5vdCBmb3VuZCBpbiBrZXlzcGFjZXMiLmZvcm1hdChrcykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5hbWUgPSBrcworICAgICAgICAgICAgICAgIGtzID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCisKKyAgICAgICAgaWYga3MgaXMgTm9uZToKKyAgICAgICAgICAgIGtzID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCisKKyAgICAgICAga3NtZXRhID0gc2VsZi5nZXRfa2V5c3BhY2VfbWV0YShrcykKKworICAgICAgICBpZiBuYW1lIGluIGtzbWV0YS50YWJsZXM6CisgICAgICAgICAgICByZXR1cm4ga3NtZXRhLnRhYmxlc1tuYW1lXQorICAgICAgICBlbGlmIG5hbWUgaW4ga3NtZXRhLmluZGV4ZXM6CisgICAgICAgICAgICByZXR1cm4ga3NtZXRhLmluZGV4ZXNbbmFtZV0KKyAgICAgICAgZWxpZiBuYW1lIGluIGtzbWV0YS52aWV3czoKKyAgICAgICAgICAgIHJldHVybiBrc21ldGEudmlld3NbbmFtZV0KKworICAgICAgICByYWlzZSBPYmplY3ROb3RGb3VuZCgiJ3t9JyBub3QgZm91bmQgaW4ga2V5c3BhY2UgJ3t9JyIuZm9ybWF0KG5hbWUsIGtzKSkKKworICAgIGRlZiBnZXRfdHJpZ2dlcl9uYW1lcyhzZWxmLCBrc25hbWU9Tm9uZSk6CisgICAgICAgIGlmIGtzbmFtZSBpcyBOb25lOgorICAgICAgICAgICAga3NuYW1lID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCisKKyAgICAgICAgcmV0dXJuIFt0cmlnZ2VyLm5hbWUKKyAgICAgICAgICAgICAgICBmb3IgdGFibGUgaW4gbGlzdChzZWxmLmdldF9rZXlzcGFjZV9tZXRhKGtzbmFtZSkudGFibGVzLnZhbHVlcygpKQorICAgICAgICAgICAgICAgIGZvciB0cmlnZ2VyIGluIGxpc3QodGFibGUudHJpZ2dlcnMudmFsdWVzKCkpXQorCisgICAgZGVmIHJlc2V0X3N0YXRlbWVudChzZWxmKToKKyAgICAgICAgc2VsZi5yZXNldF9wcm9tcHQoKQorICAgICAgICBzZWxmLnN0YXRlbWVudC50cnVuY2F0ZSgwKQorICAgICAgICBzZWxmLnN0YXRlbWVudC5zZWVrKDApCisgICAgICAgIHNlbGYuZW1wdHlfbGluZXMgPSAwCisKKyAgICBkZWYgcmVzZXRfcHJvbXB0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmN1cnJlbnRfa2V5c3BhY2UgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc2V0X3Byb21wdChzZWxmLmRlZmF1bHRfcHJvbXB0LCBUcnVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zZXRfcHJvbXB0KHNlbGYua2V5c3BhY2VfcHJvbXB0LmZvcm1hdChzZWxmLmN1cnJlbnRfa2V5c3BhY2UpLCBUcnVlKQorCisgICAgZGVmIHNldF9jb250aW51ZV9wcm9tcHQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuZW1wdHlfbGluZXMgPj0gMzoKKyAgICAgICAgICAgIHNlbGYuc2V0X3Byb21wdCgiU3RhdGVtZW50cyBhcmUgdGVybWluYXRlZCB3aXRoIGEgJzsnLiAgWW91IGNhbiBwcmVzcyBDVFJMLUMgdG8gY2FuY2VsIGFuIGluY29tcGxldGUgc3RhdGVtZW50LiIpCisgICAgICAgICAgICBzZWxmLmVtcHR5X2xpbmVzID0gMAorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHNlbGYuY3VycmVudF9rZXlzcGFjZSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5zZXRfcHJvbXB0KHNlbGYuY29udGludWVfcHJvbXB0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3BhY2VzID0gJyAnICogbGVuKHN0cihzZWxmLmN1cnJlbnRfa2V5c3BhY2UpKQorICAgICAgICAgICAgc2VsZi5zZXRfcHJvbXB0KHNlbGYua2V5c3BhY2VfY29udGludWVfcHJvbXB0LmZvcm1hdChzcGFjZXMpKQorICAgICAgICBzZWxmLmVtcHR5X2xpbmVzID0gc2VsZi5lbXB0eV9saW5lcyArIDEgaWYgbm90IHNlbGYubGFzdGNtZCBlbHNlIDAKKworICAgIEBjb250ZXh0bWFuYWdlcgorICAgIGRlZiBwcmVwYXJlX2xvb3Aoc2VsZik6CisgICAgICAgIHJlYWRsaW5lID0gTm9uZQorICAgICAgICBpZiBzZWxmLnR0eSBhbmQgc2VsZi5jb21wbGV0ZWtleToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgcmVhZGxpbmUKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9sZF9jb21wbGV0ZXIgPSByZWFkbGluZS5nZXRfY29tcGxldGVyKCkKKyAgICAgICAgICAgICAgICByZWFkbGluZS5zZXRfY29tcGxldGVyKHNlbGYuY29tcGxldGUpCisgICAgICAgICAgICAgICAgaWYgcmVhZGxpbmUuX19kb2NfXyBpcyBub3QgTm9uZSBhbmQgJ2xpYmVkaXQnIGluIHJlYWRsaW5lLl9fZG9jX186CisgICAgICAgICAgICAgICAgICAgIHJlYWRsaW5lLnBhcnNlX2FuZF9iaW5kKCJiaW5kIC1lIikKKyAgICAgICAgICAgICAgICAgICAgcmVhZGxpbmUucGFyc2VfYW5kX2JpbmQoImJpbmQgJyIgKyBzZWxmLmNvbXBsZXRla2V5ICsgIicgcmxfY29tcGxldGUiKQorICAgICAgICAgICAgICAgICAgICByZWFkbGluZS5wYXJzZV9hbmRfYmluZCgiYmluZCBeUiBlbS1pbmMtc2VhcmNoLXByZXYiKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJlYWRsaW5lLnBhcnNlX2FuZF9iaW5kKHNlbGYuY29tcGxldGVrZXkgKyAiOiBjb21wbGV0ZSIpCisgICAgICAgICMgc3RhcnQgY292ZXJhZ2UgY29sbGVjdGlvbiBpZiByZXF1ZXN0ZWQsIHVubGVzcyBpbiBzdWJzaGVsbAorICAgICAgICBpZiBzZWxmLmNvdmVyYWdlIGFuZCBub3Qgc2VsZi5pc19zdWJzaGVsbDoKKyAgICAgICAgICAgICMgY2hlY2sgZm9yIGNvdmVyYWdlcmMgZmlsZSwgd3JpdGUgaXQgaWYgbWlzc2luZworICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoQ1FMX0RJUik6CisgICAgICAgICAgICAgICAgc2VsZi5jb3ZlcmFnZXJjX3BhdGggPSBvcy5wYXRoLmpvaW4oQ1FMX0RJUiwgJy5jb3ZlcmFnZXJjJykKKyAgICAgICAgICAgICAgICBjb3ZkYXRhX3BhdGggPSBvcy5wYXRoLmpvaW4oQ1FMX0RJUiwgJy5jb3ZlcmFnZScpCisgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKHNlbGYuY292ZXJhZ2VyY19wYXRoKToKKyAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYuY292ZXJhZ2VyY19wYXRoLCAndycpIGFzIGY6CisgICAgICAgICAgICAgICAgICAgICAgICBmLndyaXRlbGluZXMoWyJbcnVuXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmN1cnJlbmN5ID0gbXVsdGlwcm9jZXNzaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YV9maWxlID0ge31cbiIuZm9ybWF0KGNvdmRhdGFfcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbGxlbCA9IHRydWVcbiJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICMgc3RhcnQgY292ZXJhZ2UKKyAgICAgICAgICAgICAgICBpbXBvcnQgY292ZXJhZ2UKKyAgICAgICAgICAgICAgICBzZWxmLmNvdiA9IGNvdmVyYWdlLkNvdmVyYWdlKGNvbmZpZ19maWxlPXNlbGYuY292ZXJhZ2VyY19wYXRoKQorICAgICAgICAgICAgICAgIHNlbGYuY292LnN0YXJ0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeWllbGQKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIHJlYWRsaW5lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJlYWRsaW5lLnNldF9jb21wbGV0ZXIob2xkX2NvbXBsZXRlcikKKyAgICAgICAgICAgIGlmIHNlbGYuY292ZXJhZ2UgYW5kIG5vdCBzZWxmLmlzX3N1YnNoZWxsOgorICAgICAgICAgICAgICAgIHNlbGYuc3RvcF9jb3ZlcmFnZSgpCisKKyAgICBkZWYgZ2V0X2lucHV0X2xpbmUoc2VsZiwgcHJvbXB0PScnKToKKyAgICAgICAgaWYgc2VsZi50dHk6CisgICAgICAgICAgICBzZWxmLmxhc3RjbWQgPSBpbnB1dChzdHIocHJvbXB0KSkKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLmxhc3RjbWQgKyAnXG4nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmxhc3RjbWQgPSBzZWxmLnN0ZGluLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLmxhc3RjbWQKKyAgICAgICAgICAgIGlmIG5vdCBsZW4obGluZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IKKyAgICAgICAgc2VsZi5saW5lbm8gKz0gMQorICAgICAgICByZXR1cm4gbGluZQorCisgICAgZGVmIHVzZV9zdGRpbl9yZWFkZXIoc2VsZiwgdW50aWw9JycsIHByb21wdD0nJyk6CisgICAgICAgIHVudGlsICs9ICdcbicKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBuZXdsaW5lID0gc2VsZi5nZXRfaW5wdXRfbGluZShwcm9tcHQ9cHJvbXB0KQorICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaWYgbmV3bGluZSA9PSB1bnRpbDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHlpZWxkIG5ld2xpbmUKKworICAgIGRlZiBjbWRsb29wKHNlbGYsIGludHJvPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgQWRhcHRlZCBmcm9tIGNtZC5DbWQncyB2ZXJzaW9uLCBiZWNhdXNlIHRoZXJlIGlzIGxpdGVyYWxseSBubyB3YXkgd2l0aAorICAgICAgICBjbWQuQ21kLmNtZGxvb3AoKSB0byB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gIkVPRiIgc2hvd2luZyB1cCBpbgorICAgICAgICBpbnB1dCBhbmQgYW4gYWN0dWFsIEVPRi4KKyAgICAgICAgIiIiCisgICAgICAgIHdpdGggc2VsZi5wcmVwYXJlX2xvb3AoKToKKyAgICAgICAgICAgIHdoaWxlIG5vdCBzZWxmLnN0b3A6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnNpbmdsZV9zdGF0ZW1lbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5zaW5nbGVfc3RhdGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0b3AgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5nZXRfaW5wdXRfbGluZShzZWxmLnByb21wdCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZW1lbnQud3JpdGUobGluZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5vbmVjbWQoc2VsZi5zdGF0ZW1lbnQuZ2V0dmFsdWUoKSk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc2V0X3N0YXRlbWVudCgpCisgICAgICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9lb2YoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBDUUxfRVJST1JTIGFzIGNxbGVycjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmludGVycihjcWxlcnIubWVzc2FnZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzZXRfc3RhdGVtZW50KCkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQoJycpCisKKyAgICBkZWYgc3RyaXBfY29tbWVudF9ibG9ja3Moc2VsZiwgc3RhdGVtZW50dGV4dCk6CisgICAgICAgIGNvbW1lbnRfYmxvY2tfaW5fbGl0ZXJhbF9zdHJpbmcgPSByZS5zZWFyY2goJ1siXS4qWy9dWypdLipbKl1bL10uKlsiXScsIHN0YXRlbWVudHRleHQpCisgICAgICAgIGlmIG5vdCBjb21tZW50X2Jsb2NrX2luX2xpdGVyYWxfc3RyaW5nOgorICAgICAgICAgICAgcmVzdWx0ID0gcmUuc3ViKCdbL11bKl0uKlsqXVsvXScsICIiLCBzdGF0ZW1lbnR0ZXh0KQorICAgICAgICAgICAgaWYgJyovJyBpbiByZXN1bHQgYW5kICcvKicgbm90IGluIHJlc3VsdCBhbmQgbm90IHNlbGYuaW5fY29tbWVudDoKKyAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigiRW5jb3VudGVyZWQgY29tbWVudCBibG9jayB0ZXJtaW5hdG9yIHdpdGhvdXQgYmVpbmcgaW4gY29tbWVudCBibG9jayIpCisgICAgICAgICAgICBpZiAnLyonIGluIHJlc3VsdDoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSByZS5zdWIoJ1svXVsqXS4qJywgIiIsIHJlc3VsdCkKKyAgICAgICAgICAgICAgICBzZWxmLmluX2NvbW1lbnQgPSBUcnVlCisgICAgICAgICAgICBpZiAnKi8nIGluIHJlc3VsdDoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSByZS5zdWIoJy4qWypdWy9dJywgIiIsIHJlc3VsdCkKKyAgICAgICAgICAgICAgICBzZWxmLmluX2NvbW1lbnQgPSBGYWxzZQorICAgICAgICAgICAgaWYgc2VsZi5pbl9jb21tZW50IGFuZCBub3QgcmUuZmluZGFsbCgnWy9dWypdfFsqXVsvXScsIHN0YXRlbWVudHRleHQpOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9ICcnCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIHJldHVybiBzdGF0ZW1lbnR0ZXh0CisKKyAgICBkZWYgb25lY21kKHNlbGYsIHN0YXRlbWVudHRleHQpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJucyB0cnVlIGlmIHRoZSBzdGF0ZW1lbnQgaXMgY29tcGxldGUgYW5kIHdhcyBoYW5kbGVkIChtZWFuaW5nIGl0CisgICAgICAgIGNhbiBiZSByZXNldCkuCisgICAgICAgICIiIgorICAgICAgICBzdGF0ZW1lbnR0ZXh0ID0gc2VsZi5zdHJpcF9jb21tZW50X2Jsb2NrcyhzdGF0ZW1lbnR0ZXh0KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzdGF0ZW1lbnRzLCBlbmR0b2tlbl9lc2NhcGVkID0gY3FscnVsZXNldC5jcWxfc3BsaXRfc3RhdGVtZW50cyhzdGF0ZW1lbnR0ZXh0KQorICAgICAgICBleGNlcHQgcHlsZXhvdHJvbi5MZXhpbmdFcnJvciBhcyBlOgorICAgICAgICAgICAgaWYgc2VsZi5zaG93X2xpbmVfbnVtczoKKyAgICAgICAgICAgICAgICBzZWxmLnByaW50ZXJyKCdJbnZhbGlkIHN5bnRheCBhdCBsaW5lIHswfSwgY2hhciB7MX0nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KGUubGluZW51bSwgZS5jaGFybnVtKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5wcmludGVycignSW52YWxpZCBzeW50YXggYXQgY2hhciB7MH0nLmZvcm1hdChlLmNoYXJudW0pKQorICAgICAgICAgICAgc3RhdGVtZW50bGluZSA9IHN0YXRlbWVudHRleHQuc3BsaXQoJ1xuJylbZS5saW5lbnVtIC0gMV0KKyAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoJyAgezB9Jy5mb3JtYXQoc3RhdGVtZW50bGluZSkpCisgICAgICAgICAgICBzZWxmLnByaW50ZXJyKCcgezB9XicuZm9ybWF0KCcgJyAqIGUuY2hhcm51bSkpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIHdoaWxlIHN0YXRlbWVudHMgYW5kIG5vdCBzdGF0ZW1lbnRzWy0xXToKKyAgICAgICAgICAgIHN0YXRlbWVudHMgPSBzdGF0ZW1lbnRzWzotMV0KKyAgICAgICAgaWYgbm90IHN0YXRlbWVudHM6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBpZiBlbmR0b2tlbl9lc2NhcGVkIG9yIHN0YXRlbWVudHNbLTFdWy0xXVswXSAhPSAnZW5kdG9rZW4nOgorICAgICAgICAgICAgc2VsZi5zZXRfY29udGludWVfcHJvbXB0KCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmb3Igc3QgaW4gc3RhdGVtZW50czoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9zdGF0ZW1lbnQoc3QsIHN0YXRlbWVudHRleHQpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZzoKKyAgICAgICAgICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmludGVycihlKQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGhhbmRsZV9lb2Yoc2VsZik6CisgICAgICAgIGlmIHNlbGYudHR5OgorICAgICAgICAgICAgcHJpbnQoJycpCisgICAgICAgIHN0YXRlbWVudCA9IHNlbGYuc3RhdGVtZW50LmdldHZhbHVlKCkKKyAgICAgICAgaWYgc3RhdGVtZW50LnN0cmlwKCk6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5vbmVjbWQoc3RhdGVtZW50KToKKyAgICAgICAgICAgICAgICBzZWxmLnByaW50ZXJyKCdJbmNvbXBsZXRlIHN0YXRlbWVudCBhdCBlbmQgb2YgZmlsZScpCisgICAgICAgIHNlbGYuZG9fZXhpdCgpCisKKyAgICBkZWYgaGFuZGxlX3N0YXRlbWVudChzZWxmLCB0b2tlbnMsIHNyY3N0cik6CisgICAgICAgICMgQ29uY2F0IG11bHRpLWxpbmUgc3RhdGVtZW50cyBhbmQgaW5zZXJ0IGludG8gaGlzdG9yeQorICAgICAgICBpZiByZWFkbGluZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG5sX2NvdW50ID0gc3Jjc3RyLmNvdW50KCJcbiIpCisKKyAgICAgICAgICAgIG5ld19oaXN0ID0gc3Jjc3RyLnJlcGxhY2UoIlxuIiwgIiAiKS5yc3RyaXAoKQorCisgICAgICAgICAgICBpZiBubF9jb3VudCA+IDEgYW5kIHNlbGYubGFzdF9oaXN0ICE9IG5ld19oaXN0OgorICAgICAgICAgICAgICAgIHJlYWRsaW5lLmFkZF9oaXN0b3J5KG5ld19oaXN0KQorCisgICAgICAgICAgICBzZWxmLmxhc3RfaGlzdCA9IG5ld19oaXN0CisgICAgICAgIGNtZHdvcmQgPSB0b2tlbnNbMF1bMV0KKyAgICAgICAgaWYgY21kd29yZCA9PSAnPyc6CisgICAgICAgICAgICBjbWR3b3JkID0gJ2hlbHAnCisgICAgICAgIGN1c3RvbV9oYW5kbGVyID0gZ2V0YXR0cihzZWxmLCAnZG9fJyArIGNtZHdvcmQubG93ZXIoKSwgTm9uZSkKKyAgICAgICAgaWYgY3VzdG9tX2hhbmRsZXI6CisgICAgICAgICAgICBwYXJzZWQgPSBjcWxydWxlc2V0LmNxbF93aG9sZV9wYXJzZV90b2tlbnModG9rZW5zLCBzcmNzdHI9c3Jjc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0c3ltYm9sPSdjcWxzaENvbW1hbmQnKQorICAgICAgICAgICAgaWYgcGFyc2VkIGFuZCBub3QgcGFyc2VkLnJlbWFpbmRlcjoKKyAgICAgICAgICAgICAgICAjIHN1Y2Nlc3NmdWwgY29tcGxldGUgcGFyc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9tX2hhbmRsZXIocGFyc2VkKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5oYW5kbGVfcGFyc2VfZXJyb3IoY21kd29yZCwgdG9rZW5zLCBwYXJzZWQsIHNyY3N0cikKKyAgICAgICAgcmV0dXJuIHNlbGYucGVyZm9ybV9zdGF0ZW1lbnQoY3FscnVsZXNldC5jcWxfZXh0cmFjdF9vcmlnKHRva2Vucywgc3Jjc3RyKSkKKworICAgIGRlZiBoYW5kbGVfcGFyc2VfZXJyb3Ioc2VsZiwgY21kd29yZCwgdG9rZW5zLCBwYXJzZWQsIHNyY3N0cik6CisgICAgICAgIGlmIGNtZHdvcmQubG93ZXIoKSBpbiAoJ3NlbGVjdCcsICdpbnNlcnQnLCAndXBkYXRlJywgJ2RlbGV0ZScsICd0cnVuY2F0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NyZWF0ZScsICdkcm9wJywgJ2FsdGVyJywgJ2dyYW50JywgJ3Jldm9rZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JhdGNoJywgJ2xpc3QnKToKKyAgICAgICAgICAgICMgaGV5LCBtYXliZSB0aGV5IGtub3cgYWJvdXQgc29tZSBuZXcgc3ludGF4IHdlIGRvbid0LiB0eXBlCisgICAgICAgICAgICAjIGFzc3VtcHRpb25zIHdvbid0IHdvcmssIGJ1dCBtYXliZSB0aGUgcXVlcnkgd2lsbC4KKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBlcmZvcm1fc3RhdGVtZW50KGNxbHJ1bGVzZXQuY3FsX2V4dHJhY3Rfb3JpZyh0b2tlbnMsIHNyY3N0cikpCisgICAgICAgIGlmIHBhcnNlZDoKKyAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoJ0ltcHJvcGVyICVzIGNvbW1hbmQgKHByb2JsZW0gYXQgJXIpLicgJSAoY21kd29yZCwgcGFyc2VkLnJlbWFpbmRlclswXSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnByaW50ZXJyKGYnSW1wcm9wZXIge2NtZHdvcmR9IGNvbW1hbmQuJykKKworICAgIGRlZiBkb191c2Uoc2VsZiwgcGFyc2VkKToKKyAgICAgICAga3NuYW1lID0gcGFyc2VkLmdldF9iaW5kaW5nKCdrc25hbWUnKQorICAgICAgICBzdWNjZXNzLCBfID0gc2VsZi5wZXJmb3JtX3NpbXBsZV9zdGF0ZW1lbnQoU2ltcGxlU3RhdGVtZW50KHBhcnNlZC5leHRyYWN0X29yaWcoKSkpCisgICAgICAgIGlmIHN1Y2Nlc3M6CisgICAgICAgICAgICBpZiBrc25hbWVbMF0gPT0gJyInIGFuZCBrc25hbWVbLTFdID09ICciJzoKKyAgICAgICAgICAgICAgICBzZWxmLmN1cnJlbnRfa2V5c3BhY2UgPSBzZWxmLmNxbF91bnByb3RlY3RfbmFtZShrc25hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudF9rZXlzcGFjZSA9IGtzbmFtZS5sb3dlcigpCisKKyAgICBkZWYgZG9fc2VsZWN0KHNlbGYsIHBhcnNlZCk6CisgICAgICAgIHRyYWNpbmdfd2FzX2VuYWJsZWQgPSBzZWxmLnRyYWNpbmdfZW5hYmxlZAorICAgICAgICBrc25hbWUgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ2tzbmFtZScpCisgICAgICAgIHN0b3BfdHJhY2luZyA9IGtzbmFtZSA9PSAnc3lzdGVtX3RyYWNlcycgb3IgKGtzbmFtZSBpcyBOb25lIGFuZCBzZWxmLmN1cnJlbnRfa2V5c3BhY2UgPT0gJ3N5c3RlbV90cmFjZXMnKQorICAgICAgICBzZWxmLnRyYWNpbmdfZW5hYmxlZCA9IHNlbGYudHJhY2luZ19lbmFibGVkIGFuZCBub3Qgc3RvcF90cmFjaW5nCisgICAgICAgIHN0YXRlbWVudCA9IHBhcnNlZC5leHRyYWN0X29yaWcoKQorICAgICAgICBzZWxmLnBlcmZvcm1fc3RhdGVtZW50KHN0YXRlbWVudCkKKyAgICAgICAgc2VsZi50cmFjaW5nX2VuYWJsZWQgPSB0cmFjaW5nX3dhc19lbmFibGVkCisKKyAgICBkZWYgcGVyZm9ybV9zdGF0ZW1lbnQoc2VsZiwgc3RhdGVtZW50KToKKworICAgICAgICBzdG10ID0gU2ltcGxlU3RhdGVtZW50KHN0YXRlbWVudCwgY29uc2lzdGVuY3lfbGV2ZWw9c2VsZi5jb25zaXN0ZW5jeV9sZXZlbCwgc2VyaWFsX2NvbnNpc3RlbmN5X2xldmVsPXNlbGYuc2VyaWFsX2NvbnNpc3RlbmN5X2xldmVsLCBmZXRjaF9zaXplPXNlbGYucGFnZV9zaXplIGlmIHNlbGYudXNlX3BhZ2luZyBlbHNlIE5vbmUpCisgICAgICAgIHN1Y2Nlc3MsIGZ1dHVyZSA9IHNlbGYucGVyZm9ybV9zaW1wbGVfc3RhdGVtZW50KHN0bXQpCisKKyAgICAgICAgaWYgZnV0dXJlOgorICAgICAgICAgICAgaWYgZnV0dXJlLndhcm5pbmdzOgorICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfd2FybmluZ3MoZnV0dXJlLndhcm5pbmdzKQorCisgICAgICAgICAgICBpZiBzZWxmLnRyYWNpbmdfZW5hYmxlZDoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGZvciB0cmFjZSBpbiBmdXR1cmUuZ2V0X2FsbF9xdWVyeV90cmFjZXMobWF4X3dhaXRfcGVyPXNlbGYubWF4X3RyYWNlX3dhaXQsIHF1ZXJ5X2NsPXNlbGYuY29uc2lzdGVuY3lfbGV2ZWwpOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdHJhY2Uoc2VsZiwgdHJhY2UpCisgICAgICAgICAgICAgICAgZXhjZXB0IFRyYWNlVW5hdmFpbGFibGU6CisgICAgICAgICAgICAgICAgICAgIG1zZyA9ICJTdGF0ZW1lbnQgdHJhY2UgZGlkIG5vdCBjb21wbGV0ZSB3aXRoaW4gJWQgc2Vjb25kczsgdHJhY2UgZGF0YSBtYXkgYmUgaW5jb21wbGV0ZS4iICUgKHNlbGYuc2Vzc2lvbi5tYXhfdHJhY2Vfd2FpdCwpCisgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQobXNnLCBjb2xvcj1SRUQpCisgICAgICAgICAgICAgICAgICAgIGZvciB0cmFjZV9pZCBpbiBmdXR1cmUuZ2V0X3F1ZXJ5X3RyYWNlX2lkcygpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93X3Nlc3Npb24odHJhY2VfaWQsIHBhcnRpYWxfc2Vzc2lvbj1UcnVlKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXJyOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnByaW50ZXJyKCJVbmFibGUgdG8gZmV0Y2ggcXVlcnkgdHJhY2U6ICVzIiAlIChzdHIoZXJyKSwpKQorCisgICAgICAgIHJldHVybiBzdWNjZXNzCisKKyAgICBkZWYgcGFyc2VfZm9yX3NlbGVjdF9tZXRhKHNlbGYsIHF1ZXJ5X3N0cmluZyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBhcnNlZCA9IGNxbHJ1bGVzZXQuY3FsX3BhcnNlKHF1ZXJ5X3N0cmluZylbMV0KKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBrcyA9IHNlbGYuY3FsX3VucHJvdGVjdF9uYW1lKHBhcnNlZC5nZXRfYmluZGluZygna3NuYW1lJywgTm9uZSkpCisgICAgICAgIG5hbWUgPSBzZWxmLmNxbF91bnByb3RlY3RfbmFtZShwYXJzZWQuZ2V0X2JpbmRpbmcoJ2NmbmFtZScsIE5vbmUpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5nZXRfdGFibGVfbWV0YShrcywgbmFtZSkKKyAgICAgICAgZXhjZXB0IENvbHVtbkZhbWlseU5vdEZvdW5kOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmdldF92aWV3X21ldGEoa3MsIG5hbWUpCisgICAgICAgICAgICBleGNlcHQgTWF0ZXJpYWxpemVkVmlld05vdEZvdW5kOgorICAgICAgICAgICAgICAgIHJhaXNlIE9iamVjdE5vdEZvdW5kKCIne30nIG5vdCBmb3VuZCBpbiBrZXlzcGFjZSAne30nIi5mb3JtYXQobmFtZSwga3MpKQorCisgICAgZGVmIHBhcnNlX2Zvcl91cGRhdGVfbWV0YShzZWxmLCBxdWVyeV9zdHJpbmcpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwYXJzZWQgPSBjcWxydWxlc2V0LmNxbF9wYXJzZShxdWVyeV9zdHJpbmcpWzFdCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAga3MgPSBzZWxmLmNxbF91bnByb3RlY3RfbmFtZShwYXJzZWQuZ2V0X2JpbmRpbmcoJ2tzbmFtZScsIE5vbmUpKQorICAgICAgICBjZiA9IHNlbGYuY3FsX3VucHJvdGVjdF9uYW1lKHBhcnNlZC5nZXRfYmluZGluZygnY2ZuYW1lJykpCisgICAgICAgIHJldHVybiBzZWxmLmdldF90YWJsZV9tZXRhKGtzLCBjZikKKworICAgIGRlZiBwZXJmb3JtX3NpbXBsZV9zdGF0ZW1lbnQoc2VsZiwgc3RhdGVtZW50KToKKyAgICAgICAgaWYgbm90IHN0YXRlbWVudDoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZSwgTm9uZQorCisgICAgICAgIGZ1dHVyZSA9IHNlbGYuc2Vzc2lvbi5leGVjdXRlX2FzeW5jKHN0YXRlbWVudCwgdHJhY2U9c2VsZi50cmFjaW5nX2VuYWJsZWQpCisgICAgICAgIHJlc3VsdCA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0ID0gZnV0dXJlLnJlc3VsdCgpCisgICAgICAgIGV4Y2VwdCBDUUxfRVJST1JTIGFzIGVycjoKKyAgICAgICAgICAgIGVycl9tc2cgPSBlcnIubWVzc2FnZSBpZiBoYXNhdHRyKGVyciwgJ21lc3NhZ2UnKSBlbHNlIHN0cihlcnIpCisgICAgICAgICAgICBzZWxmLnByaW50ZXJyKHN0cihlcnIuX19jbGFzc19fLl9fbmFtZV9fKSArICI6ICIgKyBlcnJfbXNnKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICAgICAgc2VsZi5wcmludGVycih0cmFjZWJhY2suZm9ybWF0X2V4YygpKQorCisgICAgICAgICMgRXZlbiBpZiBzdGF0ZW1lbnQgZmFpbGVkIHdlIHRyeSB0byByZWZyZXNoIHNjaGVtYSBpZiBub3QgYWdyZWVkIChzZWUgQ0FTU0FORFJBLTk2ODkpCisgICAgICAgIGlmIG5vdCBmdXR1cmUuaXNfc2NoZW1hX2FncmVlZDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmNvbm4ucmVmcmVzaF9zY2hlbWFfbWV0YWRhdGEoNSkgICMgd2lsbCB0aHJvdyBleGNlcHRpb24gaWYgdGhlcmUgaXMgYSBzY2hlbWEgbWlzbWF0Y2gKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgc2VsZi5wcmludGVycigiV2FybmluZzogc2NoZW1hIHZlcnNpb24gbWlzbWF0Y2ggZGV0ZWN0ZWQ7IGNoZWNrIHRoZSBzY2hlbWEgdmVyc2lvbnMgb2YgeW91ciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9kZXMgaW4gc3lzdGVtLmxvY2FsIGFuZCBzeXN0ZW0ucGVlcnMuIikKKyAgICAgICAgICAgICAgICBzZWxmLmNvbm4ucmVmcmVzaF9zY2hlbWFfbWV0YWRhdGEoLTEpCisKKyAgICAgICAgaWYgcmVzdWx0IGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UsIE5vbmUKKworICAgICAgICBpZiBzdGF0ZW1lbnQucXVlcnlfc3RyaW5nWzo2XS5sb3dlcigpID09ICdzZWxlY3QnOgorICAgICAgICAgICAgc2VsZi5wcmludF9yZXN1bHQocmVzdWx0LCBzZWxmLnBhcnNlX2Zvcl9zZWxlY3RfbWV0YShzdGF0ZW1lbnQucXVlcnlfc3RyaW5nKSkKKyAgICAgICAgZWxpZiBzdGF0ZW1lbnQucXVlcnlfc3RyaW5nLmxvd2VyKCkuc3RhcnRzd2l0aCgibGlzdCB1c2VycyIpIG9yIHN0YXRlbWVudC5xdWVyeV9zdHJpbmcubG93ZXIoKS5zdGFydHN3aXRoKCJsaXN0IHJvbGVzIik6CisgICAgICAgICAgICBzZWxmLnByaW50X3Jlc3VsdChyZXN1bHQsIHNlbGYuZ2V0X3RhYmxlX21ldGEoJ3N5c3RlbV9hdXRoJywgJ3JvbGVzJykpCisgICAgICAgIGVsaWYgc3RhdGVtZW50LnF1ZXJ5X3N0cmluZy5sb3dlcigpLnN0YXJ0c3dpdGgoImxpc3QiKToKKyAgICAgICAgICAgIHNlbGYucHJpbnRfcmVzdWx0KHJlc3VsdCwgc2VsZi5nZXRfdGFibGVfbWV0YSgnc3lzdGVtX2F1dGgnLCAncm9sZV9wZXJtaXNzaW9ucycpKQorICAgICAgICBlbGlmIHJlc3VsdDoKKyAgICAgICAgICAgICMgQ0FTIElOU0VSVC9VUERBVEUKKyAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoIiIpCisgICAgICAgICAgICBzZWxmLnByaW50X3N0YXRpY19yZXN1bHQocmVzdWx0LCBzZWxmLnBhcnNlX2Zvcl91cGRhdGVfbWV0YShzdGF0ZW1lbnQucXVlcnlfc3RyaW5nKSwgd2l0aF9oZWFkZXI9VHJ1ZSwgdHR5PXNlbGYudHR5KQorICAgICAgICBzZWxmLmZsdXNoX291dHB1dCgpCisgICAgICAgIHJldHVybiBUcnVlLCBmdXR1cmUKKworICAgIGRlZiBwcmludF9yZXN1bHQoc2VsZiwgcmVzdWx0LCB0YWJsZV9tZXRhKToKKyAgICAgICAgc2VsZi5kZWNvZGluZ19lcnJvcnMgPSBbXQorCisgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoIiIpCisKKyAgICAgICAgZGVmIHByaW50X2FsbChyZXN1bHQsIHRhYmxlX21ldGEsIHR0eSk6CisgICAgICAgICAgICAjIFJldHVybiB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdG90YWwKKyAgICAgICAgICAgIG51bV9yb3dzID0gMAorICAgICAgICAgICAgaXNfZmlyc3QgPSBUcnVlCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICMgQWx3YXlzIHByaW50IGZvciB0aGUgZmlyc3QgcGFnZSBldmVuIGl0IGlzIGVtcHR5CisgICAgICAgICAgICAgICAgaWYgcmVzdWx0LmN1cnJlbnRfcm93cyBvciBpc19maXJzdDoKKyAgICAgICAgICAgICAgICAgICAgd2l0aF9oZWFkZXIgPSBpc19maXJzdCBvciB0dHkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmludF9zdGF0aWNfcmVzdWx0KHJlc3VsdCwgdGFibGVfbWV0YSwgd2l0aF9oZWFkZXIsIHR0eSwgbnVtX3Jvd3MpCisgICAgICAgICAgICAgICAgICAgIG51bV9yb3dzICs9IGxlbihyZXN1bHQuY3VycmVudF9yb3dzKQorICAgICAgICAgICAgICAgIGlmIHJlc3VsdC5oYXNfbW9yZV9wYWdlczoKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5zaHVudGVkX3F1ZXJ5X291dCBpcyBOb25lIGFuZCB0dHk6CisgICAgICAgICAgICAgICAgICAgICAgICAjIE9ubHkgcGF1c2Ugd2hlbiBub3QgY2FwdHVyaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoIi0tLU1PUkUtLS0iKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQuZmV0Y2hfbmV4dF9wYWdlKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgdHR5OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZXJlc3VsdCgiIikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpc19maXJzdCA9IEZhbHNlCisgICAgICAgICAgICByZXR1cm4gbnVtX3Jvd3MKKworICAgICAgICBudW1fcm93cyA9IHByaW50X2FsbChyZXN1bHQsIHRhYmxlX21ldGEsIHNlbGYudHR5KQorICAgICAgICBzZWxmLndyaXRlcmVzdWx0KCIoJWQgcm93cykiICUgbnVtX3Jvd3MpCisKKyAgICAgICAgaWYgc2VsZi5kZWNvZGluZ19lcnJvcnM6CisgICAgICAgICAgICBmb3IgZXJyIGluIHNlbGYuZGVjb2RpbmdfZXJyb3JzWzoyXToKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlcmVzdWx0KGVyci5tZXNzYWdlKCksIGNvbG9yPVJFRCkKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLmRlY29kaW5nX2Vycm9ycykgPiAyOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoJyVkIG1vcmUgZGVjb2RpbmcgZXJyb3JzIHN1cHByZXNzZWQuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAobGVuKHNlbGYuZGVjb2RpbmdfZXJyb3JzKSAtIDIpLCBjb2xvcj1SRUQpCisKKyAgICBkZWYgcHJpbnRfc3RhdGljX3Jlc3VsdChzZWxmLCByZXN1bHQsIHRhYmxlX21ldGEsIHdpdGhfaGVhZGVyLCB0dHksIHJvd19jb3VudF9vZmZzZXQ9MCk6CisgICAgICAgIGlmIG5vdCByZXN1bHQuY29sdW1uX25hbWVzIGFuZCBub3QgdGFibGVfbWV0YToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGNvbHVtbl9uYW1lcyA9IHJlc3VsdC5jb2x1bW5fbmFtZXMgb3IgbGlzdCh0YWJsZV9tZXRhLmNvbHVtbnMua2V5cygpKQorICAgICAgICBmb3JtYXR0ZWRfbmFtZXMgPSBbc2VsZi5teWZvcm1hdF9jb2xuYW1lKG5hbWUsIHRhYmxlX21ldGEpIGZvciBuYW1lIGluIGNvbHVtbl9uYW1lc10KKyAgICAgICAgaWYgbm90IHJlc3VsdC5jdXJyZW50X3Jvd3M6CisgICAgICAgICAgICAjIHByaW50IGhlYWRlciBvbmx5CisgICAgICAgICAgICBzZWxmLnByaW50X2Zvcm1hdHRlZF9yZXN1bHQoZm9ybWF0dGVkX25hbWVzLCBOb25lLCB3aXRoX2hlYWRlcj1UcnVlLCB0dHk9dHR5KQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgY3FsX3R5cGVzID0gW10KKyAgICAgICAgaWYgcmVzdWx0LmNvbHVtbl90eXBlczoKKyAgICAgICAgICAgIGtzX25hbWUgPSB0YWJsZV9tZXRhLmtleXNwYWNlX25hbWUgaWYgdGFibGVfbWV0YSBlbHNlIHNlbGYuY3VycmVudF9rZXlzcGFjZQorICAgICAgICAgICAga3NfbWV0YSA9IHNlbGYuY29ubi5tZXRhZGF0YS5rZXlzcGFjZXMuZ2V0KGtzX25hbWUsIE5vbmUpCisgICAgICAgICAgICBjcWxfdHlwZXMgPSBbQ3FsVHlwZShjcWxfdHlwZW5hbWUodCksIGtzX21ldGEpIGZvciB0IGluIHJlc3VsdC5jb2x1bW5fdHlwZXNdCisKKyAgICAgICAgZm9ybWF0dGVkX3ZhbHVlcyA9IFtsaXN0KG1hcChzZWxmLm15Zm9ybWF0X3ZhbHVlLCBbcm93W2NdIGZvciBjIGluIGNvbHVtbl9uYW1lc10sIGNxbF90eXBlcykpIGZvciByb3cgaW4gcmVzdWx0LmN1cnJlbnRfcm93c10KKworICAgICAgICBpZiBzZWxmLmV4cGFuZF9lbmFibGVkOgorICAgICAgICAgICAgc2VsZi5wcmludF9mb3JtYXR0ZWRfcmVzdWx0X3ZlcnRpY2FsbHkoZm9ybWF0dGVkX25hbWVzLCBmb3JtYXR0ZWRfdmFsdWVzLCByb3dfY291bnRfb2Zmc2V0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wcmludF9mb3JtYXR0ZWRfcmVzdWx0KGZvcm1hdHRlZF9uYW1lcywgZm9ybWF0dGVkX3ZhbHVlcywgd2l0aF9oZWFkZXIsIHR0eSkKKworICAgIGRlZiBwcmludF9mb3JtYXR0ZWRfcmVzdWx0KHNlbGYsIGZvcm1hdHRlZF9uYW1lcywgZm9ybWF0dGVkX3ZhbHVlcywgd2l0aF9oZWFkZXIsIHR0eSk6CisgICAgICAgICMgZGV0ZXJtaW5lIGNvbHVtbiB3aWR0aHMKKyAgICAgICAgd2lkdGhzID0gW24uZGlzcGxheXdpZHRoIGZvciBuIGluIGZvcm1hdHRlZF9uYW1lc10KKyAgICAgICAgaWYgZm9ybWF0dGVkX3ZhbHVlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZvciBmbXRyb3cgaW4gZm9ybWF0dGVkX3ZhbHVlczoKKyAgICAgICAgICAgICAgICBmb3IgbnVtLCBjb2wgaW4gZW51bWVyYXRlKGZtdHJvdyk6CisgICAgICAgICAgICAgICAgICAgIHdpZHRoc1tudW1dID0gbWF4KHdpZHRoc1tudW1dLCBjb2wuZGlzcGxheXdpZHRoKQorCisgICAgICAgICMgcHJpbnQgaGVhZGVyCisgICAgICAgIGlmIHdpdGhfaGVhZGVyOgorICAgICAgICAgICAgaGVhZGVyID0gJyB8ICcuam9pbihoZHIubGp1c3QodywgY29sb3I9c2VsZi5jb2xvcikgZm9yIChoZHIsIHcpIGluIHppcChmb3JtYXR0ZWRfbmFtZXMsIHdpZHRocykpCisgICAgICAgICAgICBzZWxmLndyaXRlcmVzdWx0KCcgJyArIGhlYWRlci5yc3RyaXAoKSkKKyAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoJy0lcy0nICUgJy0rLScuam9pbignLScgKiB3IGZvciB3IGluIHdpZHRocykpCisKKyAgICAgICAgIyBzdG9wIGlmIHRoZXJlIGFyZSBubyByb3dzCisgICAgICAgIGlmIGZvcm1hdHRlZF92YWx1ZXMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoIiIpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIHByaW50IHJvdyBkYXRhCisgICAgICAgIGZvciByb3cgaW4gZm9ybWF0dGVkX3ZhbHVlczoKKyAgICAgICAgICAgIGxpbmUgPSAnIHwgJy5qb2luKGNvbC5yanVzdCh3LCBjb2xvcj1zZWxmLmNvbG9yKSBmb3IgKGNvbCwgdykgaW4gemlwKHJvdywgd2lkdGhzKSkKKyAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoJyAnICsgbGluZSkKKworICAgICAgICBpZiB0dHk6CisgICAgICAgICAgICBzZWxmLndyaXRlcmVzdWx0KCIiKQorCisgICAgZGVmIHByaW50X2Zvcm1hdHRlZF9yZXN1bHRfdmVydGljYWxseShzZWxmLCBmb3JtYXR0ZWRfbmFtZXMsIGZvcm1hdHRlZF92YWx1ZXMsIHJvd19jb3VudF9vZmZzZXQpOgorICAgICAgICBtYXhfY29sX3dpZHRoID0gbWF4KFtuLmRpc3BsYXl3aWR0aCBmb3IgbiBpbiBmb3JtYXR0ZWRfbmFtZXNdKQorICAgICAgICBtYXhfdmFsX3dpZHRoID0gbWF4KFtuLmRpc3BsYXl3aWR0aCBmb3Igcm93IGluIGZvcm1hdHRlZF92YWx1ZXMgZm9yIG4gaW4gcm93XSkKKworICAgICAgICAjIGZvciBlYWNoIHJvdyByZXR1cm5lZCwgbGlzdCBhbGwgdGhlIGNvbHVtbi12YWx1ZSBwYWlycworICAgICAgICBmb3IgaSwgcm93IGluIGVudW1lcmF0ZShmb3JtYXR0ZWRfdmFsdWVzKToKKyAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoIkAgUm93ICVkIiAlIChyb3dfY291bnRfb2Zmc2V0ICsgaSArIDEpKQorICAgICAgICAgICAgc2VsZi53cml0ZXJlc3VsdCgnLSVzLScgJSAnLSstJy5qb2luKFsnLScgKiBtYXhfY29sX3dpZHRoLCAnLScgKiBtYXhfdmFsX3dpZHRoXSkpCisgICAgICAgICAgICBmb3IgZmllbGRfaWQsIGZpZWxkIGluIGVudW1lcmF0ZShyb3cpOgorICAgICAgICAgICAgICAgIGNvbHVtbiA9IGZvcm1hdHRlZF9uYW1lc1tmaWVsZF9pZF0ubGp1c3QobWF4X2NvbF93aWR0aCwgY29sb3I9c2VsZi5jb2xvcikKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGZpZWxkLmxqdXN0KGZpZWxkLmRpc3BsYXl3aWR0aCwgY29sb3I9c2VsZi5jb2xvcikKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlcmVzdWx0KCcgJyArICIgfCAiLmpvaW4oW2NvbHVtbiwgdmFsdWVdKSkKKyAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoJycpCisKKyAgICBkZWYgcHJpbnRfd2FybmluZ3Moc2VsZiwgd2FybmluZ3MpOgorICAgICAgICBpZiB3YXJuaW5ncyBpcyBOb25lIG9yIGxlbih3YXJuaW5ncykgPT0gMDoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoJycpCisgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoJ1dhcm5pbmdzIDonKQorICAgICAgICBmb3Igd2FybmluZyBpbiB3YXJuaW5nczoKKyAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQod2FybmluZykKKyAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoJycpCisKKyAgICBkZWYgZW1wdHlsaW5lKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgcGFyc2VsaW5lKHNlbGYsIGxpbmUpOgorICAgICAgICAjIHRoaXMgc2hvdWxkbid0IGJlIG5lZWRlZAorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgY29tcGxldGUoc2VsZiwgdGV4dCwgc3RhdGUpOgorICAgICAgICBpZiByZWFkbGluZSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHN0YXRlID09IDA6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5jb21wbGV0aW9uX21hdGNoZXMgPSBzZWxmLmZpbmRfY29tcGxldGlvbnModGV4dCkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgaWYgZGVidWdfY29tcGxldGlvbjoKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICAgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb21wbGV0aW9uX21hdGNoZXNbc3RhdGVdCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBmaW5kX2NvbXBsZXRpb25zKHNlbGYsIHRleHQpOgorICAgICAgICBjdXJsaW5lID0gcmVhZGxpbmUuZ2V0X2xpbmVfYnVmZmVyKCkKKyAgICAgICAgcHJldmxpbmVzID0gc2VsZi5zdGF0ZW1lbnQuZ2V0dmFsdWUoKQorICAgICAgICB3aG9sZXN0bXQgPSBwcmV2bGluZXMgKyBjdXJsaW5lCisgICAgICAgIGJlZ2lkeCA9IHJlYWRsaW5lLmdldF9iZWdpZHgoKSArIGxlbihwcmV2bGluZXMpCisgICAgICAgIHN0dWZmX3RvX2NvbXBsZXRlID0gd2hvbGVzdG10WzpiZWdpZHhdCisgICAgICAgIHJldHVybiBjcWxydWxlc2V0LmNxbF9jb21wbGV0ZShzdHVmZl90b19jb21wbGV0ZSwgdGV4dCwgY2Fzc2FuZHJhX2Nvbm49c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnPWRlYnVnX2NvbXBsZXRpb24sIHN0YXJ0c3ltYm9sPSdjcWxzaENvbW1hbmQnKQorCisgICAgZGVmIHNldF9wcm9tcHQoc2VsZiwgcHJvbXB0LCBwcmVwZW5kX3VzZXI9RmFsc2UpOgorICAgICAgICBpZiBwcmVwZW5kX3VzZXIgYW5kIHNlbGYudXNlcm5hbWU6CisgICAgICAgICAgICBzZWxmLnByb21wdCA9ICJ7MH1AezF9Ii5mb3JtYXQoc2VsZi51c2VybmFtZSwgcHJvbXB0KQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYucHJvbXB0ID0gcHJvbXB0CisKKyAgICBkZWYgY3FsX3VucHJvdGVjdF9uYW1lKHNlbGYsIG5hbWVzdHIpOgorICAgICAgICBpZiBuYW1lc3RyIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcmV0dXJuIGNxbHJ1bGVzZXQuZGVxdW90ZV9uYW1lKG5hbWVzdHIpCisKKyAgICBkZWYgY3FsX3VucHJvdGVjdF92YWx1ZShzZWxmLCB2YWxzdHIpOgorICAgICAgICBpZiB2YWxzdHIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gY3FscnVsZXNldC5kZXF1b3RlX3ZhbHVlKHZhbHN0cikKKworICAgIGRlZiBfY29sdW1uaXplX3VuaWNvZGUoc2VsZiwgbmFtZV9saXN0KToKKyAgICAgICAgIiIiCisgICAgICAgIFVzZWQgd2hlbiBjb2x1bW5pemluZyBpZGVudGlmaWVycyB0aGF0IG1heSBjb250YWluIHVuaWNvZGUKKyAgICAgICAgIiIiCisgICAgICAgIG5hbWVzID0gW24gZm9yIG4gaW4gbmFtZV9saXN0XQorICAgICAgICBjbWQuQ21kLmNvbHVtbml6ZShzZWxmLCBuYW1lcykKKyAgICAgICAgcHJpbnQoJycpCisKKyAgICBkZWYgZG9fZGVzY3JpYmUoc2VsZiwgcGFyc2VkKToKKworICAgICAgICAiIiIKKyAgICAgICAgREVTQ1JJQkUgW2NxbHNoIG9ubHldCisKKyAgICAgICAgKERFU0MgbWF5IGJlIHVzZWQgYXMgYSBzaG9ydGhhbmQuKQorCisgICAgICAgICAgT3V0cHV0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29ubmVjdGVkIENhc3NhbmRyYSBjbHVzdGVyLCBvciBhYm91dAorICAgICAgICAgIHRoZSBkYXRhIG9iamVjdHMgc3RvcmVkIGluIHRoZSBjbHVzdGVyLiBVc2UgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgd2F5czoKKworICAgICAgICBERVNDUklCRSBLRVlTUEFDRVMKKworICAgICAgICAgIE91dHB1dCB0aGUgbmFtZXMgb2YgYWxsIGtleXNwYWNlcy4KKworICAgICAgICBERVNDUklCRSBLRVlTUEFDRSBbPGtleXNwYWNlbmFtZT5dCisKKyAgICAgICAgICBPdXRwdXQgQ1FMIGNvbW1hbmRzIHRoYXQgY291bGQgYmUgdXNlZCB0byByZWNyZWF0ZSB0aGUgZ2l2ZW4ga2V5c3BhY2UsCisgICAgICAgICAgYW5kIHRoZSBvYmplY3RzIGluIGl0IChzdWNoIGFzIHRhYmxlcywgdHlwZXMsIGZ1bmN0aW9ucywgZXRjLikuCisgICAgICAgICAgSW4gc29tZSBjYXNlcywgYXMgdGhlIENRTCBpbnRlcmZhY2UgbWF0dXJlcywgdGhlcmUgd2lsbCBiZSBzb21lIG1ldGFkYXRhCisgICAgICAgICAgYWJvdXQgYSBrZXlzcGFjZSB0aGF0IGlzIG5vdCByZXByZXNlbnRhYmxlIHdpdGggQ1FMLiBUaGF0IG1ldGFkYXRhIHdpbGwgbm90IGJlIHNob3duLgorICAgICAgICAgIFRoZSAnPGtleXNwYWNlbmFtZT4nIGFyZ3VtZW50IG1heSBiZSBvbWl0dGVkLCBpbiB3aGljaCBjYXNlIHRoZSBjdXJyZW50CisgICAgICAgICAga2V5c3BhY2Ugd2lsbCBiZSBkZXNjcmliZWQuCisKKyAgICAgICAgREVTQ1JJQkUgVEFCTEVTCisKKyAgICAgICAgICBPdXRwdXQgdGhlIG5hbWVzIG9mIGFsbCB0YWJsZXMgaW4gdGhlIGN1cnJlbnQga2V5c3BhY2UsIG9yIGluIGFsbAorICAgICAgICAgIGtleXNwYWNlcyBpZiB0aGVyZSBpcyBubyBjdXJyZW50IGtleXNwYWNlLgorCisgICAgICAgIERFU0NSSUJFIFRBQkxFIFs8a2V5c3BhY2U+Ll08dGFibGVuYW1lPgorCisgICAgICAgICAgT3V0cHV0IENRTCBjb21tYW5kcyB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gcmVjcmVhdGUgdGhlIGdpdmVuIHRhYmxlLgorICAgICAgICAgIEluIHNvbWUgY2FzZXMsIGFzIGFib3ZlLCB0aGVyZSBtYXkgYmUgdGFibGUgbWV0YWRhdGEgd2hpY2ggaXMgbm90CisgICAgICAgICAgcmVwcmVzZW50YWJsZSBhbmQgd2hpY2ggd2lsbCBub3QgYmUgc2hvd24uCisKKyAgICAgICAgREVTQ1JJQkUgSU5ERVggPGluZGV4bmFtZT4KKworICAgICAgICAgIE91dHB1dCB0aGUgQ1FMIGNvbW1hbmQgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIHJlY3JlYXRlIHRoZSBnaXZlbiBpbmRleC4KKyAgICAgICAgICBJbiBzb21lIGNhc2VzLCB0aGVyZSBtYXkgYmUgaW5kZXggbWV0YWRhdGEgd2hpY2ggaXMgbm90IHJlcHJlc2VudGFibGUKKyAgICAgICAgICBhbmQgd2hpY2ggd2lsbCBub3QgYmUgc2hvd24uCisKKyAgICAgICAgREVTQ1JJQkUgTUFURVJJQUxJWkVEIFZJRVcgPHZpZXduYW1lPgorCisgICAgICAgICAgT3V0cHV0IHRoZSBDUUwgY29tbWFuZCB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gcmVjcmVhdGUgdGhlIGdpdmVuIG1hdGVyaWFsaXplZCB2aWV3LgorICAgICAgICAgIEluIHNvbWUgY2FzZXMsIHRoZXJlIG1heSBiZSBtYXRlcmlhbGl6ZWQgdmlldyBtZXRhZGF0YSB3aGljaCBpcyBub3QgcmVwcmVzZW50YWJsZQorICAgICAgICAgIGFuZCB3aGljaCB3aWxsIG5vdCBiZSBzaG93bi4KKworICAgICAgICBERVNDUklCRSBDTFVTVEVSCisKKyAgICAgICAgICBPdXRwdXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbm5lY3RlZCBDYXNzYW5kcmEgY2x1c3Rlciwgc3VjaCBhcyB0aGUKKyAgICAgICAgICBjbHVzdGVyIG5hbWUsIGFuZCB0aGUgcGFydGl0aW9uZXIgYW5kIHNuaXRjaCBpbiB1c2UuIFdoZW4geW91IGFyZQorICAgICAgICAgIGNvbm5lY3RlZCB0byBhIG5vbi1zeXN0ZW0ga2V5c3BhY2UsIGFsc28gc2hvd3MgZW5kcG9pbnQtcmFuZ2UKKyAgICAgICAgICBvd25lcnNoaXAgaW5mb3JtYXRpb24gZm9yIHRoZSBDYXNzYW5kcmEgcmluZy4KKworICAgICAgICBERVNDUklCRSBbRlVMTF0gU0NIRU1BCisKKyAgICAgICAgICBPdXRwdXQgQ1FMIGNvbW1hbmRzIHRoYXQgY291bGQgYmUgdXNlZCB0byByZWNyZWF0ZSB0aGUgZW50aXJlIChub24tc3lzdGVtKSBzY2hlbWEuCisgICAgICAgICAgV29ya3MgYXMgdGhvdWdoICJERVNDUklCRSBLRVlTUEFDRSBrIiB3YXMgaW52b2tlZCBmb3IgZWFjaCBub24tc3lzdGVtIGtleXNwYWNlCisgICAgICAgICAgay4gVXNlIERFU0NSSUJFIEZVTEwgU0NIRU1BIHRvIGluY2x1ZGUgdGhlIHN5c3RlbSBrZXlzcGFjZXMuCisKKyAgICAgICAgREVTQ1JJQkUgVFlQRVMKKworICAgICAgICAgIE91dHB1dCB0aGUgbmFtZXMgb2YgYWxsIHVzZXItZGVmaW5lZC10eXBlcyBpbiB0aGUgY3VycmVudCBrZXlzcGFjZSwgb3IgaW4gYWxsCisgICAgICAgICAga2V5c3BhY2VzIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQga2V5c3BhY2UuCisKKyAgICAgICAgREVTQ1JJQkUgVFlQRSBbPGtleXNwYWNlPi5dPHR5cGU+CisKKyAgICAgICAgICBPdXRwdXQgdGhlIENRTCBjb21tYW5kIHRoYXQgY291bGQgYmUgdXNlZCB0byByZWNyZWF0ZSB0aGUgZ2l2ZW4gdXNlci1kZWZpbmVkLXR5cGUuCisKKyAgICAgICAgREVTQ1JJQkUgRlVOQ1RJT05TCisKKyAgICAgICAgICBPdXRwdXQgdGhlIG5hbWVzIG9mIGFsbCB1c2VyLWRlZmluZWQtZnVuY3Rpb25zIGluIHRoZSBjdXJyZW50IGtleXNwYWNlLCBvciBpbiBhbGwKKyAgICAgICAgICBrZXlzcGFjZXMgaWYgdGhlcmUgaXMgbm8gY3VycmVudCBrZXlzcGFjZS4KKworICAgICAgICBERVNDUklCRSBGVU5DVElPTiBbPGtleXNwYWNlPi5dPGZ1bmN0aW9uPgorCisgICAgICAgICAgT3V0cHV0IHRoZSBDUUwgY29tbWFuZCB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gcmVjcmVhdGUgdGhlIGdpdmVuIHVzZXItZGVmaW5lZC1mdW5jdGlvbi4KKworICAgICAgICBERVNDUklCRSBBR0dSRUdBVEVTCisKKyAgICAgICAgICBPdXRwdXQgdGhlIG5hbWVzIG9mIGFsbCB1c2VyLWRlZmluZWQtYWdncmVnYXRlcyBpbiB0aGUgY3VycmVudCBrZXlzcGFjZSwgb3IgaW4gYWxsCisgICAgICAgICAga2V5c3BhY2VzIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQga2V5c3BhY2UuCisKKyAgICAgICAgREVTQ1JJQkUgQUdHUkVHQVRFIFs8a2V5c3BhY2U+Ll08YWdncmVnYXRlPgorCisgICAgICAgICAgT3V0cHV0IHRoZSBDUUwgY29tbWFuZCB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gcmVjcmVhdGUgdGhlIGdpdmVuIHVzZXItZGVmaW5lZC1hZ2dyZWdhdGUuCisKKyAgICAgICAgREVTQ1JJQkUgPG9iam5hbWU+CisKKyAgICAgICAgICBPdXRwdXQgQ1FMIGNvbW1hbmRzIHRoYXQgY291bGQgYmUgdXNlZCB0byByZWNyZWF0ZSB0aGUgZW50aXJlIG9iamVjdCBzY2hlbWEsCisgICAgICAgICAgd2hlcmUgb2JqZWN0IGNhbiBiZSBlaXRoZXIgYSBrZXlzcGFjZSBvciBhIHRhYmxlIG9yIGFuIGluZGV4IG9yIGEgbWF0ZXJpYWxpemVkCisgICAgICAgICAgdmlldyAoaW4gdGhpcyBvcmRlcikuCisgICAgICAgICIiIgorICAgICAgICBzdG10ID0gU2ltcGxlU3RhdGVtZW50KHBhcnNlZC5leHRyYWN0X29yaWcoKSwgY29uc2lzdGVuY3lfbGV2ZWw9Y2Fzc2FuZHJhLkNvbnNpc3RlbmN5TGV2ZWwuTE9DQUxfT05FLCBmZXRjaF9zaXplPXNlbGYucGFnZV9zaXplIGlmIHNlbGYudXNlX3BhZ2luZyBlbHNlIE5vbmUpCisgICAgICAgIGZ1dHVyZSA9IHNlbGYuc2Vzc2lvbi5leGVjdXRlX2FzeW5jKHN0bXQpCisKKyAgICAgICAgaWYgc2VsZi5jb25uZWN0aW9uX3ZlcnNpb25zWydidWlsZCddWzBdIDwgJzQnOgorICAgICAgICAgICAgcHJpbnQoJ1xuV0FSTjogREVTQ1JJQkV8REVTQyB3YXMgbW92ZWQgdG8gc2VydmVyIHNpZGUgaW4gQ2Fzc2FuZHJhIDQuMC4gQXMgYSBjb25zZXF1ZW5jZSBERVNSSUJFfERFU0MgJworICAgICAgICAgICAgICAgICAgJ3dpbGwgbm90IHdvcmsgaW4gY3Fsc2ggJXIgY29ubmVjdGVkIHRvIENhc3NhbmRyYSAlciwgdGhlIHZlcnNpb24gdGhhdCB5b3UgYXJlIGNvbm5lY3RlZCB0by4gJworICAgICAgICAgICAgICAgICAgJ0RFU0NSSUJFIGRvZXMgbm90IGV4aXN0IHNlcnZlciBzaWRlIHByaW9yIENhc3NhbmRyYSA0LjAuJworICAgICAgICAgICAgICAgICAgJSAodmVyc2lvbiwgc2VsZi5jb25uZWN0aW9uX3ZlcnNpb25zWydidWlsZCddKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBmdXR1cmUucmVzdWx0KCkKKworICAgICAgICAgICAgICAgIHdoYXQgPSBwYXJzZWQubWF0Y2hlZFsxXVsxXS5sb3dlcigpCisKKyAgICAgICAgICAgICAgICBpZiB3aGF0IGluICgnY29sdW1uZmFtaWxpZXMnLCAndGFibGVzJywgJ3R5cGVzJywgJ2Z1bmN0aW9ucycsICdhZ2dyZWdhdGVzJyk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzY3JpYmVfbGlzdChyZXN1bHQpCisgICAgICAgICAgICAgICAgZWxpZiB3aGF0ID09ICdrZXlzcGFjZXMnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRlc2NyaWJlX2tleXNwYWNlcyhyZXN1bHQpCisgICAgICAgICAgICAgICAgZWxpZiB3aGF0ID09ICdjbHVzdGVyJzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kZXNjcmliZV9jbHVzdGVyKHJlc3VsdCkKKyAgICAgICAgICAgICAgICBlbGlmIHdoYXQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzY3JpYmVfZWxlbWVudChyZXN1bHQpCisKKyAgICAgICAgICAgIGV4Y2VwdCBDUUxfRVJST1JTIGFzIGVycjoKKyAgICAgICAgICAgICAgICBlcnJfbXNnID0gZXJyLm1lc3NhZ2UgaWYgaGFzYXR0cihlcnIsICdtZXNzYWdlJykgZWxzZSBzdHIoZXJyKQorICAgICAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoZXJyX21zZy5wYXJ0aXRpb24oIm1lc3NhZ2U9IilbMl0uc3RyaXAoJyInKSkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICAgICAgICAgIHNlbGYucHJpbnRlcnIodHJhY2ViYWNrLmZvcm1hdF9leGMoKSkKKworICAgICAgICAgICAgaWYgZnV0dXJlOgorICAgICAgICAgICAgICAgIGlmIGZ1dHVyZS53YXJuaW5nczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmludF93YXJuaW5ncyhmdXR1cmUud2FybmluZ3MpCisKKyAgICBkb19kZXNjID0gZG9fZGVzY3JpYmUKKworICAgIGRlZiBkZXNjcmliZV9rZXlzcGFjZXMoc2VsZiwgcm93cyk6CisgICAgICAgICIiIgorICAgICAgICBQcmludCB0aGUgb3V0cHV0IGZvciBhIERFU0NSSUJFIEtFWVNQQUNFUyBxdWVyeQorICAgICAgICAiIiIKKyAgICAgICAgbmFtZXMgPSBbclsnbmFtZSddIGZvciByIGluIHJvd3NdCisKKyAgICAgICAgcHJpbnQoJycpCisgICAgICAgIGNtZC5DbWQuY29sdW1uaXplKHNlbGYsIG5hbWVzKQorICAgICAgICBwcmludCgnJykKKworICAgIGRlZiBkZXNjcmliZV9saXN0KHNlbGYsIHJvd3MpOgorICAgICAgICAiIiIKKyAgICAgICAgUHJpbnQgdGhlIG91dHB1dCBmb3IgYWxsIHRoZSBERVNDUklCRSBxdWVyaWVzIGZvciBlbGVtZW50IG5hbWVzIChlLmcgREVTQ1JJQkUgVEFCTEVTLCBERVNDUklCRSBGVU5DVElPTlMgLi4uKQorICAgICAgICAiIiIKKyAgICAgICAga2V5c3BhY2UgPSBOb25lCisgICAgICAgIG5hbWVzID0gbGlzdCgpCisgICAgICAgIGZvciByb3cgaW4gcm93czoKKyAgICAgICAgICAgIGlmIHJvd1sna2V5c3BhY2VfbmFtZSddICE9IGtleXNwYWNlOgorICAgICAgICAgICAgICAgIGlmIGtleXNwYWNlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnByaW50X2tleXNwYWNlX2VsZW1lbnRfbmFtZXMoa2V5c3BhY2UsIG5hbWVzKQorCisgICAgICAgICAgICAgICAga2V5c3BhY2UgPSByb3dbJ2tleXNwYWNlX25hbWUnXQorICAgICAgICAgICAgICAgIG5hbWVzID0gbGlzdCgpCisKKyAgICAgICAgICAgIG5hbWVzLmFwcGVuZChzdHIocm93WyduYW1lJ10pKQorCisgICAgICAgIGlmIGtleXNwYWNlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5wcmludF9rZXlzcGFjZV9lbGVtZW50X25hbWVzKGtleXNwYWNlLCBuYW1lcykKKyAgICAgICAgICAgIHByaW50KCcnKQorCisgICAgZGVmIHByaW50X2tleXNwYWNlX2VsZW1lbnRfbmFtZXMoc2VsZiwga2V5c3BhY2UsIG5hbWVzKToKKyAgICAgICAgcHJpbnQoJycpCisgICAgICAgIGlmIHNlbGYuY3VycmVudF9rZXlzcGFjZSBpcyBOb25lOgorICAgICAgICAgICAgcHJpbnQoJ0tleXNwYWNlICVzJyAlIChrZXlzcGFjZSkpCisgICAgICAgICAgICBwcmludCgnLS0tLS0tLS0tJXMnICUgKCctJyAqIGxlbihrZXlzcGFjZSkpKQorICAgICAgICBjbWQuQ21kLmNvbHVtbml6ZShzZWxmLCBuYW1lcykKKworICAgIGRlZiBkZXNjcmliZV9lbGVtZW50KHNlbGYsIHJvd3MpOgorICAgICAgICAiIiIKKyAgICAgICAgUHJpbnQgdGhlIG91dHB1dCBmb3IgYWxsIHRoZSBERVNDUklCRSBxdWVyaWVzIHdoZXJlIGFuIGVsZW1lbnQgbmFtZSBhcyBiZWVuIHNwZWNpZmllZCAoZS5nIERFU0NSSUJFIFRBQkxFLCBERVNDUklCRSBJTkRFWCAuLi4pCisgICAgICAgICIiIgorICAgICAgICBmb3Igcm93IGluIHJvd3M6CisgICAgICAgICAgICBwcmludCgnJykKKyAgICAgICAgICAgIHNlbGYucXVlcnlfb3V0LndyaXRlKHJvd1snY3JlYXRlX3N0YXRlbWVudCddKQorICAgICAgICAgICAgcHJpbnQoJycpCisKKyAgICBkZWYgZGVzY3JpYmVfY2x1c3RlcihzZWxmLCByb3dzKToKKyAgICAgICAgIiIiCisgICAgICAgIFByaW50IHRoZSBvdXRwdXQgZm9yIGEgREVTQ1JJQkUgQ0xVU1RFUiBxdWVyeS4KKworICAgICAgICBJZiBhIHNwZWNpZmllZCBrZXlzcGFjZSB3YXMgaW4gdXNlIHRoZSByZXR1cm5lZCBSZXN1bHRTZXQgd2lsbCBjb250YWlucyBhICdyYW5nZV9vd25lcnNoaXAnIGNvbHVtbiwKKyAgICAgICAgb3RoZXJ3aXNlIG5vdC4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciByb3cgaW4gcm93czoKKyAgICAgICAgICAgIHByaW50KCdcbkNsdXN0ZXI6ICVzJyAlIHJvd1snY2x1c3RlciddKQorICAgICAgICAgICAgcHJpbnQoJ1BhcnRpdGlvbmVyOiAlcycgJSByb3dbJ3BhcnRpdGlvbmVyJ10pCisgICAgICAgICAgICBwcmludCgnU25pdGNoOiAlc1xuJyAlIHJvd1snc25pdGNoJ10pCisgICAgICAgICAgICBpZiAncmFuZ2Vfb3duZXJzaGlwJyBpbiByb3c6CisgICAgICAgICAgICAgICAgcHJpbnQoIlJhbmdlIG93bmVyc2hpcDoiKQorICAgICAgICAgICAgICAgIGZvciBlbnRyeSBpbiBsaXN0KHJvd1sncmFuZ2Vfb3duZXJzaGlwJ10uaXRlbXMoKSk6CisgICAgICAgICAgICAgICAgICAgIHByaW50KCcgJTM5cyAgWyVzXScgJSAoZW50cnlbMF0sICcsICcuam9pbihbaG9zdCBmb3IgaG9zdCBpbiBlbnRyeVsxXV0pKSkKKyAgICAgICAgICAgICAgICBwcmludCgnJykKKworICAgIGRlZiBkb19jb3B5KHNlbGYsIHBhcnNlZCk6CisgICAgICAgIHIiIiIKKyAgICAgICAgQ09QWSBbY3Fsc2ggb25seV0KKworICAgICAgICAgIENPUFkgeCBGUk9NOiBJbXBvcnRzIENTViBkYXRhIGludG8gYSBDYXNzYW5kcmEgdGFibGUKKyAgICAgICAgICBDT1BZIHggVE86IEV4cG9ydHMgZGF0YSBmcm9tIGEgQ2Fzc2FuZHJhIHRhYmxlIGluIENTViBmb3JtYXQuCisKKyAgICAgICAgQ09QWSA8dGFibGVfbmFtZT4gWyAoIGNvbHVtbiBbLCAuLi5dICkgXQorICAgICAgICAgICAgIEZST00gKCAnPGZpbGVfcGF0dGVybl8xLCBmaWxlX3BhdHRlcm5fMiwgLi4uIGZpbGVfcGF0dGVybl9uPicgfCBTVERJTiApCisgICAgICAgICAgICAgWyBXSVRIIDxvcHRpb24+PSd2YWx1ZScgW0FORCAuLi5dIF07CisKKyAgICAgICAgRmlsZSBwYXR0ZXJucyBhcmUgZWl0aGVyIGZpbGUgbmFtZXMgb3IgdmFsaWQgcHl0aG9uIGdsb2IgZXhwcmVzc2lvbnMsIGUuZy4gKi5jc3Ygb3IgZm9sZGVyLyouY3N2LgorCisgICAgICAgIENPUFkgPHRhYmxlX25hbWU+IFsgKCBjb2x1bW4gWywgLi4uXSApIF0KKyAgICAgICAgICAgICBUTyAoICc8ZmlsZW5hbWU+JyB8IFNURE9VVCApCisgICAgICAgICAgICAgWyBXSVRIIDxvcHRpb24+PSd2YWx1ZScgW0FORCAuLi5dIF07CisKKyAgICAgICAgQXZhaWxhYmxlIGNvbW1vbiBDT1BZIG9wdGlvbnMgYW5kIGRlZmF1bHRzOgorCisgICAgICAgICAgREVMSU1JVEVSPScsJyAgICAgICAgICAgLSBjaGFyYWN0ZXIgdGhhdCBhcHBlYXJzIGJldHdlZW4gcmVjb3JkcworICAgICAgICAgIFFVT1RFPSciJyAgICAgICAgICAgICAgIC0gcXVvdGluZyBjaGFyYWN0ZXIgdG8gYmUgdXNlZCB0byBxdW90ZSBmaWVsZHMKKyAgICAgICAgICBFU0NBUEU9J1wnICAgICAgICAgICAgICAtIGNoYXJhY3RlciB0byBhcHBlYXIgYmVmb3JlIHRoZSBRVU9URSBjaGFyIHdoZW4gcXVvdGVkCisgICAgICAgICAgSEVBREVSPWZhbHNlICAgICAgICAgICAgLSB3aGV0aGVyIHRvIGlnbm9yZSB0aGUgZmlyc3QgbGluZQorICAgICAgICAgIE5VTEw9JycgICAgICAgICAgICAgICAgIC0gc3RyaW5nIHRoYXQgcmVwcmVzZW50cyBhIG51bGwgdmFsdWUKKyAgICAgICAgICBEQVRFVElNRUZPUk1BVD0gICAgICAgICAtIHRpbWVzdGFtcCBzdHJmdGltZSBmb3JtYXQKKyAgICAgICAgICAgICclWS0lbS0lZCAlSDolTTolUyV6JyAgIGRlZmF1bHRzIHRvIHRpbWVfZm9ybWF0IHZhbHVlIGluIGNxbHNocmMKKyAgICAgICAgICBNQVhBVFRFTVBUUz01ICAgICAgICAgICAtIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cyBwZXIgYmF0Y2ggb3IgcmFuZ2UKKyAgICAgICAgICBSRVBPUlRGUkVRVUVOQ1k9MC4yNSAgICAtIHRoZSBmcmVxdWVuY3kgd2l0aCB3aGljaCB3ZSBkaXNwbGF5IHN0YXR1cyB1cGRhdGVzIGluIHNlY29uZHMKKyAgICAgICAgICBERUNJTUFMU0VQPScuJyAgICAgICAgICAtIHRoZSBzZXBhcmF0b3IgZm9yIGRlY2ltYWwgdmFsdWVzCisgICAgICAgICAgVEhPVVNBTkRTU0VQPScnICAgICAgICAgLSB0aGUgc2VwYXJhdG9yIGZvciB0aG91c2FuZHMgZGlnaXQgZ3JvdXBzCisgICAgICAgICAgQk9PTFNUWUxFPSdUcnVlLEZhbHNlJyAgLSB0aGUgcmVwcmVzZW50YXRpb24gZm9yIGJvb2xlYW5zLCBjYXNlIGluc2Vuc2l0aXZlLCBzcGVjaWZ5IHRydWUgZm9sbG93ZWQgYnkgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZSB5ZXMsbm8gb3IgMSwwCisgICAgICAgICAgTlVNUFJPQ0VTU0VTPW4gICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHdvcmtlciBwcm9jZXNzZXMsIGJ5IGRlZmF1bHQgdGhlIG51bWJlciBvZiBjb3JlcyBtaW51cyBvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHBlZCBhdCAxNgorICAgICAgICAgIENPTkZJR0ZJTEU9JycgICAgICAgICAgIC0gYSBjb25maWd1cmF0aW9uIGZpbGUgd2l0aCB0aGUgc2FtZSBmb3JtYXQgYXMgLmNxbHNocmMgKHNlZSB0aGUgUHl0aG9uIENvbmZpZ1BhcnNlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbikgd2hlcmUgeW91IGNhbiBzcGVjaWZ5IFdJVEggb3B0aW9ucyB1bmRlciB0aGUgZm9sbG93aW5nIG9wdGlvbmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uczogW2NvcHldLCBbY29weS10b10sIFtjb3B5LWZyb21dLCBbY29weTprcy50YWJsZV0sIFtjb3B5LXRvOmtzLnRhYmxlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb3B5LWZyb206a3MudGFibGVdLCB3aGVyZSA8a3M+IGlzIHlvdXIga2V5c3BhY2UgbmFtZSBhbmQgPHRhYmxlPiBpcyB5b3VyIHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLiBPcHRpb25zIGFyZSByZWFkIGZyb20gdGhlc2Ugc2VjdGlvbnMsIGluIHRoZSBvcmRlciBzcGVjaWZpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlLCBhbmQgY29tbWFuZCBsaW5lIG9wdGlvbnMgYWx3YXlzIG92ZXJyaWRlIG9wdGlvbnMgaW4gY29uZmlndXJhdGlvbiBmaWxlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGVuZGluZyBvbiB0aGUgQ09QWSBkaXJlY3Rpb24sIG9ubHkgdGhlIHJlbGV2YW50IGNvcHktZnJvbSBvciBjb3B5LXRvIHNlY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgdXNlZC4gSWYgbm8gY29uZmlnZmlsZSBpcyBzcGVjaWZpZWQgdGhlbiAuY3Fsc2hyYyBpcyBzZWFyY2hlZCBpbnN0ZWFkLgorICAgICAgICAgIFJBVEVGSUxFPScnICAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgZmlsZSB3aGVyZSB0byBwcmludCB0aGUgb3V0cHV0IHN0YXRpc3RpY3MKKworICAgICAgICBBdmFpbGFibGUgQ09QWSBGUk9NIG9wdGlvbnMgYW5kIGRlZmF1bHRzOgorCisgICAgICAgICAgQ0hVTktTSVpFPTUwMDAgICAgICAgICAgLSB0aGUgc2l6ZSBvZiBjaHVua3MgcGFzc2VkIHRvIHdvcmtlciBwcm9jZXNzZXMKKyAgICAgICAgICBJTkdFU1RSQVRFPTEwMDAwMCAgICAgICAtIGFuIGFwcHJveGltYXRlIGluZ2VzdCByYXRlIGluIHJvd3MgcGVyIHNlY29uZAorICAgICAgICAgIE1JTkJBVENIU0laRT0xMCAgICAgICAgIC0gdGhlIG1pbmltdW0gc2l6ZSBvZiBhbiBpbXBvcnQgYmF0Y2gKKyAgICAgICAgICBNQVhCQVRDSFNJWkU9MjAgICAgICAgICAtIHRoZSBtYXhpbXVtIHNpemUgb2YgYW4gaW1wb3J0IGJhdGNoCisgICAgICAgICAgTUFYUk9XUz0tMSAgICAgICAgICAgICAgLSB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cywgLTEgbWVhbnMgbm8gbWF4aW11bQorICAgICAgICAgIFNLSVBST1dTPTAgICAgICAgICAgICAgIC0gdGhlIG51bWJlciBvZiByb3dzIHRvIHNraXAKKyAgICAgICAgICBTS0lQQ09MUz0nJyAgICAgICAgICAgICAtIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgY29sdW1uIG5hbWVzIHRvIHNraXAKKyAgICAgICAgICBNQVhQQVJTRUVSUk9SUz0tMSAgICAgICAtIHRoZSBtYXhpbXVtIGdsb2JhbCBudW1iZXIgb2YgcGFyc2luZyBlcnJvcnMsIC0xIG1lYW5zIG5vIG1heGltdW0KKyAgICAgICAgICBNQVhJTlNFUlRFUlJPUlM9MTAwMCAgICAtIHRoZSBtYXhpbXVtIGdsb2JhbCBudW1iZXIgb2YgaW5zZXJ0IGVycm9ycywgLTEgbWVhbnMgbm8gbWF4aW11bQorICAgICAgICAgIEVSUkZJTEU9JycgICAgICAgICAgICAgIC0gYSBmaWxlIHdoZXJlIHRvIHN0b3JlIGFsbCByb3dzIHRoYXQgY291bGQgbm90IGJlIGltcG9ydGVkLCBieSBkZWZhdWx0IHRoaXMgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydF9rc190YWJsZS5lcnIgd2hlcmUgPGtzPiBpcyB5b3VyIGtleXNwYWNlIGFuZCA8dGFibGU+IGlzIHlvdXIgdGFibGUgbmFtZS4KKyAgICAgICAgICBQUkVQQVJFRFNUQVRFTUVOVFM9VHJ1ZSAtIHdoZXRoZXIgdG8gdXNlIHByZXBhcmVkIHN0YXRlbWVudHMgd2hlbiBpbXBvcnRpbmcsIGJ5IGRlZmF1bHQgVHJ1ZS4gU2V0IHRoaXMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlIGlmIHlvdSBkb24ndCBtaW5kIHNoaWZ0aW5nIGRhdGEgcGFyc2luZyB0byB0aGUgY2x1c3Rlci4gVGhlIGNsdXN0ZXIgd2lsbCBhbHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlIHRvIGNvbXBpbGUgZXZlcnkgYmF0Y2ggc3RhdGVtZW50LiBGb3IgbGFyZ2UgYW5kIG92ZXJzaXplZCBjbHVzdGVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyB3aWxsIHJlc3VsdCBpbiBhIGZhc3RlciBpbXBvcnQgYnV0IGZvciBzbWFsbGVyIGNsdXN0ZXJzIGl0IG1heSBnZW5lcmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dHMuCisgICAgICAgICAgVFRMPTM2MDAgICAgICAgICAgICAgICAgLSB0aGUgdGltZSB0byBsaXZlIGluIHNlY29uZHMsIGJ5IGRlZmF1bHQgZGF0YSB3aWxsIG5vdCBleHBpcmUKKworICAgICAgICBBdmFpbGFibGUgQ09QWSBUTyBvcHRpb25zIGFuZCBkZWZhdWx0czoKKworICAgICAgICAgIEVOQ09ESU5HPSd1dGY4JyAgICAgICAgICAtIGVuY29kaW5nIGZvciBDU1Ygb3V0cHV0CisgICAgICAgICAgUEFHRVNJWkU9JzEwMDAnICAgICAgICAgIC0gdGhlIHBhZ2Ugc2l6ZSBmb3IgZmV0Y2hpbmcgcmVzdWx0cworICAgICAgICAgIFBBR0VUSU1FT1VUPTEwICAgICAgICAgICAtIHRoZSBwYWdlIHRpbWVvdXQgaW4gc2Vjb25kcyBmb3IgZmV0Y2hpbmcgcmVzdWx0cworICAgICAgICAgIEJFR0lOVE9LRU49JycgICAgICAgICAgICAtIHRoZSBtaW5pbXVtIHRva2VuIHN0cmluZyB0byBjb25zaWRlciB3aGVuIGV4cG9ydGluZyBkYXRhCisgICAgICAgICAgRU5EVE9LRU49JycgICAgICAgICAgICAgIC0gdGhlIG1heGltdW0gdG9rZW4gc3RyaW5nIHRvIGNvbnNpZGVyIHdoZW4gZXhwb3J0aW5nIGRhdGEKKyAgICAgICAgICBNQVhSRVFVRVNUUz02ICAgICAgICAgICAgLSB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdHMgZWFjaCB3b3JrZXIgcHJvY2VzcyBjYW4gd29yayBvbiBpbiBwYXJhbGxlbAorICAgICAgICAgIE1BWE9VVFBVVFNJWkU9Jy0xJyAgICAgICAtIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG91dHB1dCBmaWxlIG1lYXN1cmVkIGluIG51bWJlciBvZiBsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXlvbmQgdGhpcyBtYXhpbXVtIHRoZSBvdXRwdXQgZmlsZSB3aWxsIGJlIHNwbGl0IGludG8gc2VnbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgbWVhbnMgdW5saW1pdGVkLgorICAgICAgICAgIEZMT0FUUFJFQ0lTSU9OPTUgICAgICAgICAtIHRoZSBudW1iZXIgb2YgZGlnaXRzIGRpc3BsYXllZCBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCBmb3IgY3FsIGZsb2F0IHZhbHVlcworICAgICAgICAgIERPVUJMRVBSRUNJU0lPTj0xMiAgICAgICAtIHRoZSBudW1iZXIgb2YgZGlnaXRzIGRpc3BsYXllZCBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCBmb3IgY3FsIGRvdWJsZSB2YWx1ZXMKKworICAgICAgICBXaGVuIGVudGVyaW5nIENTViBkYXRhIG9uIFNURElOLCB5b3UgY2FuIHVzZSB0aGUgc2VxdWVuY2UgIlwuIgorICAgICAgICBvbiBhIGxpbmUgYnkgaXRzZWxmIHRvIGVuZCB0aGUgZGF0YSBpbnB1dC4KKyAgICAgICAgIiIiCisKKyAgICAgICAga3MgPSBzZWxmLmNxbF91bnByb3RlY3RfbmFtZShwYXJzZWQuZ2V0X2JpbmRpbmcoJ2tzbmFtZScsIE5vbmUpKQorICAgICAgICBpZiBrcyBpcyBOb25lOgorICAgICAgICAgICAga3MgPSBzZWxmLmN1cnJlbnRfa2V5c3BhY2UKKyAgICAgICAgICAgIGlmIGtzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgTm9LZXlzcGFjZUVycm9yKCJOb3QgaW4gYW55IGtleXNwYWNlLiIpCisgICAgICAgIHRhYmxlID0gc2VsZi5jcWxfdW5wcm90ZWN0X25hbWUocGFyc2VkLmdldF9iaW5kaW5nKCdjZm5hbWUnKSkKKyAgICAgICAgY29sdW1ucyA9IHBhcnNlZC5nZXRfYmluZGluZygnY29sbmFtZXMnLCBOb25lKQorICAgICAgICBpZiBjb2x1bW5zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY29sdW1ucyA9IGxpc3QobWFwKHNlbGYuY3FsX3VucHJvdGVjdF9uYW1lLCBjb2x1bW5zKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgZGVmYXVsdCB0byBhbGwga25vd24gY29sdW1ucworICAgICAgICAgICAgY29sdW1ucyA9IHNlbGYuZ2V0X2NvbHVtbl9uYW1lcyhrcywgdGFibGUpCisKKyAgICAgICAgZm5hbWUgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ2ZuYW1lJywgTm9uZSkKKyAgICAgICAgaWYgZm5hbWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmbmFtZSA9IHNlbGYuY3FsX3VucHJvdGVjdF92YWx1ZShmbmFtZSkKKworICAgICAgICBjb3B5b3B0bmFtZXMgPSBsaXN0KG1hcChzdHIubG93ZXIsIHBhcnNlZC5nZXRfYmluZGluZygnb3B0bmFtZXMnLCAoKSkpKQorICAgICAgICBjb3B5b3B0dmFscyA9IGxpc3QobWFwKHNlbGYuY3FsX3VucHJvdGVjdF92YWx1ZSwgcGFyc2VkLmdldF9iaW5kaW5nKCdvcHR2YWxzJywgKCkpKSkKKyAgICAgICAgb3B0cyA9IGRpY3QobGlzdCh6aXAoY29weW9wdG5hbWVzLCBjb3B5b3B0dmFscykpKQorCisgICAgICAgIGRpcmVjdGlvbiA9IHBhcnNlZC5nZXRfYmluZGluZygnZGlyJykudXBwZXIoKQorICAgICAgICBpZiBkaXJlY3Rpb24gPT0gJ0ZST00nOgorICAgICAgICAgICAgdGFzayA9IEltcG9ydFRhc2soc2VsZiwga3MsIHRhYmxlLCBjb2x1bW5zLCBmbmFtZSwgb3B0cywgc2VsZi5jb25uLnByb3RvY29sX3ZlcnNpb24sIENPTkZJR19GSUxFKQorICAgICAgICBlbGlmIGRpcmVjdGlvbiA9PSAnVE8nOgorICAgICAgICAgICAgdGFzayA9IEV4cG9ydFRhc2soc2VsZiwga3MsIHRhYmxlLCBjb2x1bW5zLCBmbmFtZSwgb3B0cywgc2VsZi5jb25uLnByb3RvY29sX3ZlcnNpb24sIENPTkZJR19GSUxFKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoIlVua25vd24gZGlyZWN0aW9uICVzIiAlIGRpcmVjdGlvbikKKworICAgICAgICB0YXNrLnJ1bigpCisKKyAgICBkZWYgZG9fc2hvdyhzZWxmLCBwYXJzZWQpOgorICAgICAgICAiIiIKKyAgICAgICAgU0hPVyBbY3Fsc2ggb25seV0KKworICAgICAgICAgIERpc3BsYXlzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IGNxbHNoIHNlc3Npb24uIENhbiBiZSBjYWxsZWQgaW4KKyAgICAgICAgICB0aGUgZm9sbG93aW5nIHdheXM6CisKKyAgICAgICAgU0hPVyBWRVJTSU9OCisKKyAgICAgICAgICBTaG93cyB0aGUgdmVyc2lvbiBhbmQgYnVpbGQgb2YgdGhlIGNvbm5lY3RlZCBDYXNzYW5kcmEgaW5zdGFuY2UsIGFzCisgICAgICAgICAgd2VsbCBhcyB0aGUgdmVyc2lvbiBvZiB0aGUgQ1FMIHNwZWMgdGhhdCB0aGUgY29ubmVjdGVkIENhc3NhbmRyYQorICAgICAgICAgIGluc3RhbmNlIHVuZGVyc3RhbmRzLgorCisgICAgICAgIFNIT1cgSE9TVAorCisgICAgICAgICAgU2hvd3Mgd2hlcmUgY3Fsc2ggaXMgY3VycmVudGx5IGNvbm5lY3RlZC4KKworICAgICAgICBTSE9XIFNFU1NJT04gPHNlc3Npb25pZD4KKworICAgICAgICAgIFByZXR0eS1wcmludHMgdGhlIHJlcXVlc3RlZCB0cmFjaW5nIHNlc3Npb24uCisKKyAgICAgICAgU0hPVyBSRVBMSUNBUyA8dG9rZW4+ICg8a2V5c3BhY2U+KQorCisgICAgICAgICAgTGlzdHMgdGhlIHJlcGxpY2Egbm9kZXMgYnkgSVAgYWRkcmVzcyBmb3IgdGhlIGdpdmVuIHRva2VuLiBUaGUgY3VycmVudAorICAgICAgICAgIGtleXNwYWNlIGlzIHVzZWQgaWYgb25lIGlzIG5vdCBzcGVjaWZpZWQuCisgICAgICAgICIiIgorICAgICAgICBzaG93d2hhdCA9IHBhcnNlZC5nZXRfYmluZGluZygnd2hhdCcpLmxvd2VyKCkKKyAgICAgICAgaWYgc2hvd3doYXQgPT0gJ3ZlcnNpb24nOgorICAgICAgICAgICAgc2VsZi5nZXRfY29ubmVjdGlvbl92ZXJzaW9ucygpCisgICAgICAgICAgICBzZWxmLnNob3dfdmVyc2lvbigpCisgICAgICAgIGVsaWYgc2hvd3doYXQgPT0gJ2hvc3QnOgorICAgICAgICAgICAgc2VsZi5zaG93X2hvc3QoKQorICAgICAgICBlbGlmIHNob3d3aGF0LnN0YXJ0c3dpdGgoJ3Nlc3Npb24nKToKKyAgICAgICAgICAgIHNlc3Npb25faWQgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ3Nlc3Npb25pZCcpLmxvd2VyKCkKKyAgICAgICAgICAgIHNlbGYuc2hvd19zZXNzaW9uKFVVSUQoc2Vzc2lvbl9pZCkpCisgICAgICAgIGVsaWYgc2hvd3doYXQuc3RhcnRzd2l0aCgncmVwbGljYXMnKToKKyAgICAgICAgICAgIHRva2VuX2lkID0gcGFyc2VkLmdldF9iaW5kaW5nKCd0b2tlbicpCisgICAgICAgICAgICBrZXlzcGFjZSA9IHBhcnNlZC5nZXRfYmluZGluZygna2V5c3BhY2UnKQorICAgICAgICAgICAgc2VsZi5zaG93X3JlcGxpY2FzKHRva2VuX2lkLCBrZXlzcGFjZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoJ1dhaXQsIGhvdyBkbyBJIHNob3cgJXI/JyAlIChzaG93d2hhdCwpKQorCisgICAgZGVmIGRvX3NvdXJjZShzZWxmLCBwYXJzZWQpOgorICAgICAgICAiIiIKKyAgICAgICAgU09VUkNFIFtjcWxzaCBvbmx5XQorCisgICAgICAgIEV4ZWN1dGVzIGEgZmlsZSBjb250YWluaW5nIENRTCBzdGF0ZW1lbnRzLiBHaXZlcyB0aGUgb3V0cHV0IGZvciBlYWNoCisgICAgICAgIHN0YXRlbWVudCBpbiB0dXJuLCBpZiBhbnksIG9yIGFueSBlcnJvcnMgdGhhdCBvY2N1ciBhbG9uZyB0aGUgd2F5LgorCisgICAgICAgIEVycm9ycyBkbyBOT1QgYWJvcnQgZXhlY3V0aW9uIG9mIHRoZSBDUUwgc291cmNlIGZpbGUuCisKKyAgICAgICAgVXNhZ2U6CisKKyAgICAgICAgICBTT1VSQ0UgJzxmaWxlPic7CisKKyAgICAgICAgVGhhdCBpcywgdGhlIHBhdGggdG8gdGhlIGZpbGUgdG8gYmUgZXhlY3V0ZWQgbXVzdCBiZSBnaXZlbiBpbnNpZGUgYQorICAgICAgICBzdHJpbmcgbGl0ZXJhbC4gVGhlIHBhdGggaXMgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZworICAgICAgICBkaXJlY3RvcnkuIFRoZSB0aWxkZSBzaG9ydGhhbmQgbm90YXRpb24gKCd+L215ZGlyJykgaXMgc3VwcG9ydGVkIGZvcgorICAgICAgICByZWZlcnJpbmcgdG8gJEhPTUUuCisKKyAgICAgICAgU2VlIGFsc28gdGhlIC0tZmlsZSBvcHRpb24gdG8gY3Fsc2guCisgICAgICAgICIiIgorICAgICAgICBmbmFtZSA9IHBhcnNlZC5nZXRfYmluZGluZygnZm5hbWUnKQorICAgICAgICBmbmFtZSA9IG9zLnBhdGguZXhwYW5kdXNlcihzZWxmLmNxbF91bnByb3RlY3RfdmFsdWUoZm5hbWUpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBlbmNvZGluZywgYm9tX3NpemUgPSBnZXRfZmlsZV9lbmNvZGluZ19ib21zaXplKGZuYW1lKQorICAgICAgICAgICAgZiA9IGNvZGVjcy5vcGVuKGZuYW1lLCAncicsIGVuY29kaW5nKQorICAgICAgICAgICAgZi5zZWVrKGJvbV9zaXplKQorICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgc2VsZi5wcmludGVycignQ291bGQgbm90IG9wZW4gJXI6ICVzJyAlIChmbmFtZSwgZSkpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc3Vic2hlbGwgPSBTaGVsbChzZWxmLmhvc3RuYW1lLCBzZWxmLnBvcnQsIGNvbG9yPXNlbGYuY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWU9c2VsZi51c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZz1zZWxmLmVuY29kaW5nLCBzdGRpbj1mLCB0dHk9RmFsc2UsIHVzZV9jb25uPXNlbGYuY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjcWx2ZXI9c2VsZi5jcWxfdmVyc2lvbiwga2V5c3BhY2U9c2VsZi5jdXJyZW50X2tleXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNpbmdfZW5hYmxlZD1zZWxmLnRyYWNpbmdfZW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X25hbm90aW1lX2Zvcm1hdD1zZWxmLmRpc3BsYXlfbmFub3RpbWVfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfdGltZXN0YW1wX2Zvcm1hdD1zZWxmLmRpc3BsYXlfdGltZXN0YW1wX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2RhdGVfZm9ybWF0PXNlbGYuZGlzcGxheV9kYXRlX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2Zsb2F0X3ByZWNpc2lvbj1zZWxmLmRpc3BsYXlfZmxvYXRfcHJlY2lzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfZG91YmxlX3ByZWNpc2lvbj1zZWxmLmRpc3BsYXlfZG91YmxlX3ByZWNpc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X3RpbWV6b25lPXNlbGYuZGlzcGxheV90aW1lem9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdHJhY2Vfd2FpdD1zZWxmLm1heF90cmFjZV93YWl0LCBzc2w9c2VsZi5zc2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF90aW1lb3V0PXNlbGYuc2Vzc2lvbi5kZWZhdWx0X3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdF90aW1lb3V0PXNlbGYuY29ubi5jb25uZWN0X3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXNfc3Vic2hlbGw9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoX3Byb3ZpZGVyPXNlbGYuYXV0aF9wcm92aWRlcikKKyAgICAgICAgIyBkdXBsaWNhdGUgY292ZXJhZ2UgcmVsYXRlZCBzZXR0aW5ncyBpbiBzdWJzaGVsbAorICAgICAgICBpZiBzZWxmLmNvdmVyYWdlOgorICAgICAgICAgICAgc3Vic2hlbGwuY292ZXJhZ2UgPSBUcnVlCisgICAgICAgICAgICBzdWJzaGVsbC5jb3ZlcmFnZXJjX3BhdGggPSBzZWxmLmNvdmVyYWdlcmNfcGF0aAorICAgICAgICBzdWJzaGVsbC5jbWRsb29wKCkKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgZG9fY2FwdHVyZShzZWxmLCBwYXJzZWQpOgorICAgICAgICAiIiIKKyAgICAgICAgQ0FQVFVSRSBbY3Fsc2ggb25seV0KKworICAgICAgICBCZWdpbnMgY2FwdHVyaW5nIGNvbW1hbmQgb3V0cHV0IGFuZCBhcHBlbmRpbmcgaXQgdG8gYSBzcGVjaWZpZWQgZmlsZS4KKyAgICAgICAgT3V0cHV0IHdpbGwgbm90IGJlIHNob3duIGF0IHRoZSBjb25zb2xlIHdoaWxlIGl0IGlzIGNhcHR1cmVkLgorCisgICAgICAgIFVzYWdlOgorCisgICAgICAgICAgQ0FQVFVSRSAnPGZpbGU+JzsKKyAgICAgICAgICBDQVBUVVJFIE9GRjsKKyAgICAgICAgICBDQVBUVVJFOworCisgICAgICAgIFRoYXQgaXMsIHRoZSBwYXRoIHRvIHRoZSBmaWxlIHRvIGJlIGFwcGVuZGVkIHRvIG11c3QgYmUgZ2l2ZW4gaW5zaWRlIGEKKyAgICAgICAgc3RyaW5nIGxpdGVyYWwuIFRoZSBwYXRoIGlzIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcKKyAgICAgICAgZGlyZWN0b3J5LiBUaGUgdGlsZGUgc2hvcnRoYW5kIG5vdGF0aW9uICgnfi9teWRpcicpIGlzIHN1cHBvcnRlZCBmb3IKKyAgICAgICAgcmVmZXJyaW5nIHRvICRIT01FLgorCisgICAgICAgIE9ubHkgcXVlcnkgcmVzdWx0IG91dHB1dCBpcyBjYXB0dXJlZC4gRXJyb3JzIGFuZCBvdXRwdXQgZnJvbSBjcWxzaC1vbmx5CisgICAgICAgIGNvbW1hbmRzIHdpbGwgc3RpbGwgYmUgc2hvd24gaW4gdGhlIGNxbHNoIHNlc3Npb24uCisKKyAgICAgICAgVG8gc3RvcCBjYXB0dXJpbmcgb3V0cHV0IGFuZCBzaG93IGl0IGluIHRoZSBjcWxzaCBzZXNzaW9uIGFnYWluLCB1c2UKKyAgICAgICAgQ0FQVFVSRSBPRkYuCisKKyAgICAgICAgVG8gaW5zcGVjdCB0aGUgY3VycmVudCBjYXB0dXJlIGNvbmZpZ3VyYXRpb24sIHVzZSBDQVBUVVJFIHdpdGggbm8KKyAgICAgICAgYXJndW1lbnRzLgorICAgICAgICAiIiIKKyAgICAgICAgZm5hbWUgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ2ZuYW1lJykKKyAgICAgICAgaWYgZm5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuc2h1bnRlZF9xdWVyeV9vdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcHJpbnQoIkN1cnJlbnRseSBjYXB0dXJpbmcgcXVlcnkgb3V0cHV0IHRvICVyLiIgJSAoc2VsZi5xdWVyeV9vdXQubmFtZSwpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCgiQ3VycmVudGx5IG5vdCBjYXB0dXJpbmcgcXVlcnkgb3V0cHV0LiIpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBmbmFtZS51cHBlcigpID09ICdPRkYnOgorICAgICAgICAgICAgaWYgc2VsZi5zaHVudGVkX3F1ZXJ5X291dCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoJ05vdCBjdXJyZW50bHkgY2FwdHVyaW5nIG91dHB1dC4nKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5xdWVyeV9vdXQuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5xdWVyeV9vdXQgPSBzZWxmLnNodW50ZWRfcXVlcnlfb3V0CisgICAgICAgICAgICBzZWxmLmNvbG9yID0gc2VsZi5zaHVudGVkX2NvbG9yCisgICAgICAgICAgICBzZWxmLnNodW50ZWRfcXVlcnlfb3V0ID0gTm9uZQorICAgICAgICAgICAgZGVsIHNlbGYuc2h1bnRlZF9jb2xvcgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgc2VsZi5zaHVudGVkX3F1ZXJ5X291dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoJ0FscmVhZHkgY2FwdHVyaW5nIG91dHB1dCB0byAlcy4gVXNlIENBUFRVUkUgT0ZGJworICAgICAgICAgICAgICAgICAgICAgICAgICAnIHRvIGRpc2FibGUuJyAlIChzZWxmLnF1ZXJ5X291dC5uYW1lLCkpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBmbmFtZSA9IG9zLnBhdGguZXhwYW5kdXNlcihzZWxmLmNxbF91bnByb3RlY3RfdmFsdWUoZm5hbWUpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gb3BlbihmbmFtZSwgJ2EnKQorICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgc2VsZi5wcmludGVycignQ291bGQgbm90IG9wZW4gJXIgZm9yIGFwcGVuZDogJXMnICUgKGZuYW1lLCBlKSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnNodW50ZWRfcXVlcnlfb3V0ID0gc2VsZi5xdWVyeV9vdXQKKyAgICAgICAgc2VsZi5zaHVudGVkX2NvbG9yID0gc2VsZi5jb2xvcgorICAgICAgICBzZWxmLnF1ZXJ5X291dCA9IGYKKyAgICAgICAgc2VsZi5jb2xvciA9IEZhbHNlCisgICAgICAgIHByaW50KCdOb3cgY2FwdHVyaW5nIHF1ZXJ5IG91dHB1dCB0byAlci4nICUgKGZuYW1lLCkpCisKKyAgICBkZWYgZG9fdHJhY2luZyhzZWxmLCBwYXJzZWQpOgorICAgICAgICAiIiIKKyAgICAgICAgVFJBQ0lORyBbY3Fsc2hdCisKKyAgICAgICAgICBFbmFibGVzIG9yIGRpc2FibGVzIHJlcXVlc3QgdHJhY2luZy4KKworICAgICAgICBUUkFDSU5HIE9OCisKKyAgICAgICAgICBFbmFibGVzIHRyYWNpbmcgZm9yIGFsbCBmdXJ0aGVyIHJlcXVlc3RzLgorCisgICAgICAgIFRSQUNJTkcgT0ZGCisKKyAgICAgICAgICBEaXNhYmxlcyB0cmFjaW5nLgorCisgICAgICAgIFRSQUNJTkcKKworICAgICAgICAgIFRSQUNJTkcgd2l0aCBubyBhcmd1bWVudHMgc2hvd3MgdGhlIGN1cnJlbnQgdHJhY2luZyBzdGF0dXMuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnRyYWNpbmdfZW5hYmxlZCA9IFN3aXRjaENvbW1hbmQoIlRSQUNJTkciLCAiVHJhY2luZyIpLmV4ZWN1dGUoc2VsZi50cmFjaW5nX2VuYWJsZWQsIHBhcnNlZCwgc2VsZi5wcmludGVycikKKworICAgIGRlZiBkb19leHBhbmQoc2VsZiwgcGFyc2VkKToKKyAgICAgICAgIiIiCisgICAgICAgIEVYUEFORCBbY3Fsc2hdCisKKyAgICAgICAgICBFbmFibGVzIG9yIGRpc2FibGVzIGV4cGFuZGVkICh2ZXJ0aWNhbCkgb3V0cHV0LgorCisgICAgICAgIEVYUEFORCBPTgorCisgICAgICAgICAgRW5hYmxlcyBleHBhbmRlZCAodmVydGljYWwpIG91dHB1dC4KKworICAgICAgICBFWFBBTkQgT0ZGCisKKyAgICAgICAgICBEaXNhYmxlcyBleHBhbmRlZCAodmVydGljYWwpIG91dHB1dC4KKworICAgICAgICBFWFBBTkQKKworICAgICAgICAgIEVYUEFORCB3aXRoIG5vIGFyZ3VtZW50cyBzaG93cyB0aGUgY3VycmVudCB2YWx1ZSBvZiBleHBhbmQgc2V0dGluZy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZXhwYW5kX2VuYWJsZWQgPSBTd2l0Y2hDb21tYW5kKCJFWFBBTkQiLCAiRXhwYW5kZWQgb3V0cHV0IikuZXhlY3V0ZShzZWxmLmV4cGFuZF9lbmFibGVkLCBwYXJzZWQsIHNlbGYucHJpbnRlcnIpCisKKyAgICBkZWYgZG9fY29uc2lzdGVuY3koc2VsZiwgcGFyc2VkKToKKyAgICAgICAgIiIiCisgICAgICAgIENPTlNJU1RFTkNZIFtjcWxzaCBvbmx5XQorCisgICAgICAgICAgIE92ZXJyaWRlcyBkZWZhdWx0IGNvbnNpc3RlbmN5IGxldmVsIChkZWZhdWx0IGxldmVsIGlzIE9ORSkuCisKKyAgICAgICAgQ09OU0lTVEVOQ1kgPGxldmVsPgorCisgICAgICAgICAgIFNldHMgY29uc2lzdGVuY3kgbGV2ZWwgZm9yIGZ1dHVyZSByZXF1ZXN0cy4KKworICAgICAgICAgICBWYWxpZCBjb25zaXN0ZW5jeSBsZXZlbHM6CisKKyAgICAgICAgICAgQU5ZLCBPTkUsIFRXTywgVEhSRUUsIFFVT1JVTSwgQUxMLCBMT0NBTF9PTkUsIExPQ0FMX1FVT1JVTSwgRUFDSF9RVU9SVU0sIFNFUklBTCBhbmQgTE9DQUxfU0VSSUFMLgorCisgICAgICAgICAgIFNFUklBTCBhbmQgTE9DQUxfU0VSSUFMIG1heSBiZSB1c2VkIG9ubHkgZm9yIFNFTEVDVHM7IHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCB1cGRhdGVzLgorCisgICAgICAgIENPTlNJU1RFTkNZCisKKyAgICAgICAgICAgQ09OU0lTVEVOQ1kgd2l0aCBubyBhcmd1bWVudHMgc2hvd3MgdGhlIGN1cnJlbnQgY29uc2lzdGVuY3kgbGV2ZWwuCisgICAgICAgICIiIgorICAgICAgICBsZXZlbCA9IHBhcnNlZC5nZXRfYmluZGluZygnbGV2ZWwnKQorICAgICAgICBpZiBsZXZlbCBpcyBOb25lOgorICAgICAgICAgICAgcHJpbnQoJ0N1cnJlbnQgY29uc2lzdGVuY3kgbGV2ZWwgaXMgJXMuJyAlIChjYXNzYW5kcmEuQ29uc2lzdGVuY3lMZXZlbC52YWx1ZV90b19uYW1lW3NlbGYuY29uc2lzdGVuY3lfbGV2ZWxdKSkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYuY29uc2lzdGVuY3lfbGV2ZWwgPSBjYXNzYW5kcmEuQ29uc2lzdGVuY3lMZXZlbC5uYW1lX3RvX3ZhbHVlW2xldmVsLnVwcGVyKCldCisgICAgICAgIHByaW50KCdDb25zaXN0ZW5jeSBsZXZlbCBzZXQgdG8gJXMuJyAlIChsZXZlbC51cHBlcigpLCkpCisKKyAgICBkZWYgZG9fc2VyaWFsKHNlbGYsIHBhcnNlZCk6CisgICAgICAgICIiIgorICAgICAgICBTRVJJQUwgQ09OU0lTVEVOQ1kgW2NxbHNoIG9ubHldCisKKyAgICAgICAgICAgT3ZlcnJpZGVzIHNlcmlhbCBjb25zaXN0ZW5jeSBsZXZlbCAoZGVmYXVsdCBsZXZlbCBpcyBTRVJJQUwpLgorCisgICAgICAgIFNFUklBTCBDT05TSVNURU5DWSA8bGV2ZWw+CisKKyAgICAgICAgICAgU2V0cyBjb25zaXN0ZW5jeSBsZXZlbCBmb3IgZnV0dXJlIGNvbmRpdGlvbmFsIHVwZGF0ZXMuCisKKyAgICAgICAgICAgVmFsaWQgY29uc2lzdGVuY3kgbGV2ZWxzOgorCisgICAgICAgICAgIFNFUklBTCwgTE9DQUxfU0VSSUFMLgorCisgICAgICAgIFNFUklBTCBDT05TSVNURU5DWQorCisgICAgICAgICAgIFNFUklBTCBDT05TSVNURU5DWSB3aXRoIG5vIGFyZ3VtZW50cyBzaG93cyB0aGUgY3VycmVudCBjb25zaXN0ZW5jeSBsZXZlbC4KKyAgICAgICAgIiIiCisgICAgICAgIGxldmVsID0gcGFyc2VkLmdldF9iaW5kaW5nKCdsZXZlbCcpCisgICAgICAgIGlmIGxldmVsIGlzIE5vbmU6CisgICAgICAgICAgICBwcmludCgnQ3VycmVudCBzZXJpYWwgY29uc2lzdGVuY3kgbGV2ZWwgaXMgJXMuJyAlIChjYXNzYW5kcmEuQ29uc2lzdGVuY3lMZXZlbC52YWx1ZV90b19uYW1lW3NlbGYuc2VyaWFsX2NvbnNpc3RlbmN5X2xldmVsXSkpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLnNlcmlhbF9jb25zaXN0ZW5jeV9sZXZlbCA9IGNhc3NhbmRyYS5Db25zaXN0ZW5jeUxldmVsLm5hbWVfdG9fdmFsdWVbbGV2ZWwudXBwZXIoKV0KKyAgICAgICAgcHJpbnQoJ1NlcmlhbCBjb25zaXN0ZW5jeSBsZXZlbCBzZXQgdG8gJXMuJyAlIChsZXZlbC51cHBlcigpLCkpCisKKyAgICBkZWYgZG9fbG9naW4oc2VsZiwgcGFyc2VkKToKKyAgICAgICAgIiIiCisgICAgICAgIExPR0lOIFtjcWxzaCBvbmx5XQorCisgICAgICAgICAgIENoYW5nZXMgbG9naW4gaW5mb3JtYXRpb24gd2l0aG91dCByZXF1aXJpbmcgcmVzdGFydC4KKworICAgICAgICBMT0dJTiA8dXNlcm5hbWU+ICg8cGFzc3dvcmQ+KQorCisgICAgICAgICAgIExvZ2luIHVzaW5nIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUuIElmIHBhc3N3b3JkIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBiZSB1c2VkCisgICAgICAgICAgIG90aGVyd2lzZSwgeW91IHdpbGwgYmUgcHJvbXB0ZWQgdG8gZW50ZXIuCisgICAgICAgICIiIgorICAgICAgICB1c2VybmFtZSA9IHBhcnNlZC5nZXRfYmluZGluZygndXNlcm5hbWUnKQorICAgICAgICBwYXNzd29yZCA9IHBhcnNlZC5nZXRfYmluZGluZygncGFzc3dvcmQnKQorICAgICAgICBpZiBwYXNzd29yZCBpcyBOb25lOgorICAgICAgICAgICAgcGFzc3dvcmQgPSBnZXRwYXNzLmdldHBhc3MoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFzc3dvcmQgPSBwYXNzd29yZFsxOi0xXQorCisgICAgICAgIGF1dGhfcHJvdmlkZXIgPSBQbGFpblRleHRBdXRoUHJvdmlkZXIodXNlcm5hbWU9dXNlcm5hbWUsIHBhc3N3b3JkPXBhc3N3b3JkKQorCisgICAgICAgIGNvbm4gPSBDbHVzdGVyKGNvbnRhY3RfcG9pbnRzPShzZWxmLmhvc3RuYW1lLCksIHBvcnQ9c2VsZi5wb3J0LCBjcWxfdmVyc2lvbj1zZWxmLmNvbm4uY3FsX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sX3ZlcnNpb249c2VsZi5jb25uLnByb3RvY29sX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGF1dGhfcHJvdmlkZXI9YXV0aF9wcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgc3NsX29wdGlvbnM9c2VsZi5jb25uLnNzbF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICBsb2FkX2JhbGFuY2luZ19wb2xpY3k9V2hpdGVMaXN0Um91bmRSb2JpblBvbGljeShbc2VsZi5ob3N0bmFtZV0pLAorICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sX2Nvbm5lY3Rpb25fdGltZW91dD1zZWxmLmNvbm4uY29ubmVjdF90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0X3RpbWVvdXQ9c2VsZi5jb25uLmNvbm5lY3RfdGltZW91dCkKKworICAgICAgICBpZiBzZWxmLmN1cnJlbnRfa2V5c3BhY2U6CisgICAgICAgICAgICBzZXNzaW9uID0gY29ubi5jb25uZWN0KHNlbGYuY3VycmVudF9rZXlzcGFjZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlc3Npb24gPSBjb25uLmNvbm5lY3QoKQorCisgICAgICAgICMgQ29weSBzZXNzaW9uIHByb3BlcnRpZXMKKyAgICAgICAgc2Vzc2lvbi5kZWZhdWx0X3RpbWVvdXQgPSBzZWxmLnNlc3Npb24uZGVmYXVsdF90aW1lb3V0CisgICAgICAgIHNlc3Npb24ucm93X2ZhY3RvcnkgPSBzZWxmLnNlc3Npb24ucm93X2ZhY3RvcnkKKyAgICAgICAgc2Vzc2lvbi5kZWZhdWx0X2NvbnNpc3RlbmN5X2xldmVsID0gc2VsZi5zZXNzaW9uLmRlZmF1bHRfY29uc2lzdGVuY3lfbGV2ZWwKKyAgICAgICAgc2Vzc2lvbi5tYXhfdHJhY2Vfd2FpdCA9IHNlbGYuc2Vzc2lvbi5tYXhfdHJhY2Vfd2FpdAorCisgICAgICAgICMgVXBkYXRlIGFmdGVyIHdlJ3ZlIGNvbm5lY3RlZCBpbiBjYXNlIHdlIGZhaWwgdG8gYXV0aGVudGljYXRlCisgICAgICAgIHNlbGYuY29ubiA9IGNvbm4KKyAgICAgICAgc2VsZi5hdXRoX3Byb3ZpZGVyID0gYXV0aF9wcm92aWRlcgorICAgICAgICBzZWxmLnVzZXJuYW1lID0gdXNlcm5hbWUKKyAgICAgICAgc2VsZi5zZXNzaW9uID0gc2Vzc2lvbgorCisgICAgZGVmIGRvX2V4aXQoc2VsZiwgcGFyc2VkPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgRVhJVC9RVUlUIFtjcWxzaCBvbmx5XQorCisgICAgICAgIEV4aXRzIGNxbHNoLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5zdG9wID0gVHJ1ZQorICAgICAgICBpZiBzZWxmLm93bnNfY29ubmVjdGlvbjoKKyAgICAgICAgICAgIHNlbGYuY29ubi5zaHV0ZG93bigpCisgICAgZG9fcXVpdCA9IGRvX2V4aXQKKworICAgIGRlZiBkb19jbGVhcihzZWxmLCBwYXJzZWQpOgorICAgICAgICAiIiIKKyAgICAgICAgQ0xFQVIvQ0xTIFtjcWxzaCBvbmx5XQorCisgICAgICAgIENsZWFycyB0aGUgY29uc29sZS4KKyAgICAgICAgIiIiCisgICAgICAgIHN1YnByb2Nlc3MuY2FsbCgnY2xlYXInLCBzaGVsbD1UcnVlKQorICAgIGRvX2NscyA9IGRvX2NsZWFyCisKKyAgICBkZWYgZG9fZGVidWcoc2VsZiwgcGFyc2VkKToKKyAgICAgICAgaW1wb3J0IHBkYgorICAgICAgICBwZGIuc2V0X3RyYWNlKCkKKworICAgIGRlZiBnZXRfaGVscF90b3BpY3Moc2VsZik6CisgICAgICAgIHRvcGljcyA9IFt0WzM6XSBmb3IgdCBpbiBkaXIoc2VsZikgaWYgdC5zdGFydHN3aXRoKCdkb18nKSBhbmQgZ2V0YXR0cihzZWxmLCB0LCBOb25lKS5fX2RvY19fXQorICAgICAgICBmb3IgaGlkZV9mcm9tX2hlbHAgaW4gKCdxdWl0JywpOgorICAgICAgICAgICAgdG9waWNzLnJlbW92ZShoaWRlX2Zyb21faGVscCkKKyAgICAgICAgcmV0dXJuIHRvcGljcworCisgICAgZGVmIGNvbHVtbml6ZShzZWxmLCBzbGlzdCwgKmEsICoqa3cpOgorICAgICAgICByZXR1cm4gY21kLkNtZC5jb2x1bW5pemUoc2VsZiwgc29ydGVkKFt1LnVwcGVyKCkgZm9yIHUgaW4gc2xpc3RdKSwgKmEsICoqa3cpCisKKyAgICBkZWYgZG9faGVscChzZWxmLCBwYXJzZWQpOgorICAgICAgICAiIiIKKyAgICAgICAgSEVMUCBbY3Fsc2ggb25seV0KKworICAgICAgICBHaXZlcyBpbmZvcm1hdGlvbiBhYm91dCBjcWxzaCBjb21tYW5kcy4gVG8gc2VlIGF2YWlsYWJsZSB0b3BpY3MsCisgICAgICAgIGVudGVyICJIRUxQIiB3aXRob3V0IGFueSBhcmd1bWVudHMuIFRvIHNlZSBoZWxwIG9uIGEgdG9waWMsCisgICAgICAgIHVzZSAiSEVMUCA8dG9waWM+Ii4KKyAgICAgICAgIiIiCisgICAgICAgIHRvcGljcyA9IHBhcnNlZC5nZXRfYmluZGluZygndG9waWMnLCAoKSkKKyAgICAgICAgaWYgbm90IHRvcGljczoKKyAgICAgICAgICAgIHNoZWxsX3RvcGljcyA9IFt0LnVwcGVyKCkgZm9yIHQgaW4gc2VsZi5nZXRfaGVscF90b3BpY3MoKV0KKyAgICAgICAgICAgIHNlbGYucHJpbnRfdG9waWNzKCJcbkRvY3VtZW50ZWQgc2hlbGwgY29tbWFuZHM6Iiwgc2hlbGxfdG9waWNzLCAxNSwgODApCisgICAgICAgICAgICBjcWxfdG9waWNzID0gW3QudXBwZXIoKSBmb3IgdCBpbiBjcWxkb2NzLmdldF9oZWxwX3RvcGljcygpXQorICAgICAgICAgICAgc2VsZi5wcmludF90b3BpY3MoIkNRTCBoZWxwIHRvcGljczoiLCBjcWxfdG9waWNzLCAxNSwgODApCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZm9yIHQgaW4gdG9waWNzOgorICAgICAgICAgICAgaWYgdC5sb3dlcigpIGluIHNlbGYuZ2V0X2hlbHBfdG9waWNzKCk6CisgICAgICAgICAgICAgICAgZG9jID0gZ2V0YXR0cihzZWxmLCAnZG9fJyArIHQubG93ZXIoKSkuX19kb2NfXworICAgICAgICAgICAgICAgIHNlbGYuc3Rkb3V0LndyaXRlKGRvYyArICJcbiIpCisgICAgICAgICAgICBlbGlmIHQubG93ZXIoKSBpbiBjcWxkb2NzLmdldF9oZWxwX3RvcGljcygpOgorICAgICAgICAgICAgICAgIHVybHBhcnQgPSBjcWxkb2NzLmdldF9oZWxwX3RvcGljKHQpCisgICAgICAgICAgICAgICAgaWYgdXJscGFydCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgdXJsID0gIiVzIyVzIiAlIChDQVNTQU5EUkFfQ1FMX0hUTUwsIHVybHBhcnQpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuYnJvd3NlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5lZCA9IHdlYmJyb3dzZXIuZ2V0KHNlbGYuYnJvd3Nlcikub3Blbl9uZXdfdGFiKHVybCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5lZCA9IHdlYmJyb3dzZXIub3Blbl9uZXdfdGFiKHVybCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9wZW5lZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoIioqKiBObyBicm93c2VyIHRvIGRpc3BsYXkgQ1FMIGhlbHAuIFVSTCBmb3IgaGVscCB0b3BpYyAlcyA6ICVzIiAlICh0LCB1cmwpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnByaW50ZXJyKCIqKiogTm8gaGVscCBvbiAlcyIgJSAodCwpKQorCisgICAgZGVmIGRvX2hpc3Rvcnkoc2VsZiwgcGFyc2VkKToKKyAgICAgICAgIiIiCisgICAgICAgIEhJU1RPUlkgW2NxbHNoIG9ubHldCisKKyAgICAgICAgICAgRGlzcGxheXMgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmRzIGV4ZWN1dGVkIGluIGNxbHNoCisKKyAgICAgICAgSElTVE9SWSAoPG4+KQorCisgICAgICAgICAgIElmIG4gaXMgc3BlY2lmaWVkLCB0aGUgaGlzdG9yeSBkaXNwbGF5IGxlbmd0aCBpcyBzZXQgdG8gbiBmb3IgdGhpcyBzZXNzaW9uCisgICAgICAgICIiIgorCisgICAgICAgIGhpc3RvcnlfbGVuZ3RoID0gcmVhZGxpbmUuZ2V0X2N1cnJlbnRfaGlzdG9yeV9sZW5ndGgoKQorCisgICAgICAgIG4gPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ24nKQorICAgICAgICBpZiAobiBpcyBub3QgTm9uZSk6CisgICAgICAgICAgICBzZWxmLm1heF9oaXN0b3J5X2xlbmd0aF9zaG93biA9IGludChuKQorCisgICAgICAgIGZvciBpbmRleCBpbiByYW5nZShtYXgoMSwgaGlzdG9yeV9sZW5ndGggLSBzZWxmLm1heF9oaXN0b3J5X2xlbmd0aF9zaG93biksIGhpc3RvcnlfbGVuZ3RoKToKKyAgICAgICAgICAgIHByaW50KHJlYWRsaW5lLmdldF9oaXN0b3J5X2l0ZW0oaW5kZXgpKQorCisgICAgZGVmIGRvX3VuaWNvZGUoc2VsZiwgcGFyc2VkKToKKyAgICAgICAgIiIiCisgICAgICAgIFRleHR1YWwgaW5wdXQvb3V0cHV0CisKKyAgICAgICAgV2hlbiBjb250cm9sIGNoYXJhY3RlcnMsIG9yIG90aGVyIGNoYXJhY3RlcnMgd2hpY2ggY2FuJ3QgYmUgZW5jb2RlZAorICAgICAgICBpbiB5b3VyIGN1cnJlbnQgbG9jYWxlLCBhcmUgZm91bmQgaW4gdmFsdWVzIG9mICd0ZXh0JyBvciAnYXNjaWknCisgICAgICAgIHR5cGVzLCBpdCB3aWxsIGJlIHNob3duIGFzIGEgYmFja3NsYXNoIGVzY2FwZS4gSWYgY29sb3IgaXMgZW5hYmxlZCwKKyAgICAgICAgYW55IHN1Y2ggYmFja3NsYXNoIGVzY2FwZXMgd2lsbCBiZSBzaG93biBpbiBhIGRpZmZlcmVudCBjb2xvciBmcm9tCisgICAgICAgIHRoZSBzdXJyb3VuZGluZyB0ZXh0LgorCisgICAgICAgIFVuaWNvZGUgY29kZSBwb2ludHMgaW4geW91ciBkYXRhIHdpbGwgYmUgb3V0cHV0IGludGFjdCwgaWYgdGhlCisgICAgICAgIGVuY29kaW5nIGZvciB5b3VyIGxvY2FsZSBpcyBjYXBhYmxlIG9mIGRlY29kaW5nIHRoZW0uIElmIHlvdSBwcmVmZXIKKyAgICAgICAgdGhhdCBub24tYXNjaWkgY2hhcmFjdGVycyBiZSBzaG93biB3aXRoIFB5dGhvbi1zdHlsZSAiXFx1QUJDRCIKKyAgICAgICAgZXNjYXBlIHNlcXVlbmNlcywgaW52b2tlIGNxbHNoIHdpdGggYW4gQVNDSUkgbG9jYWxlIChmb3IgZXhhbXBsZSwKKyAgICAgICAgYnkgc2V0dGluZyB0aGUgJExBTkcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gIkMiKS4KKyAgICAgICAgIiIiCisKKyAgICBkZWYgZG9fcGFnaW5nKHNlbGYsIHBhcnNlZCk6CisgICAgICAgICIiIgorICAgICAgICBQQUdJTkcgW2NxbHNoXQorCisgICAgICAgICAgRW5hYmxlcyBvciBkaXNhYmxlcyBxdWVyeSBwYWdpbmcuCisKKyAgICAgICAgUEFHSU5HIE9OCisKKyAgICAgICAgICBFbmFibGVzIHF1ZXJ5IHBhZ2luZyBmb3IgYWxsIGZ1cnRoZXIgcXVlcmllcy4KKworICAgICAgICBQQUdJTkcgT0ZGCisKKyAgICAgICAgICBEaXNhYmxlcyBwYWdpbmcuCisKKyAgICAgICAgUEFHSU5HCisKKyAgICAgICAgICBQQUdJTkcgd2l0aCBubyBhcmd1bWVudHMgc2hvd3MgdGhlIGN1cnJlbnQgcXVlcnkgcGFnaW5nIHN0YXR1cy4KKyAgICAgICAgIiIiCisgICAgICAgIChzZWxmLnVzZV9wYWdpbmcsIHJlcXVlc3RlZF9wYWdlX3NpemUpID0gU3dpdGNoQ29tbWFuZFdpdGhWYWx1ZSgKKyAgICAgICAgICAgICJQQUdJTkciLCAiUXVlcnkgcGFnaW5nIiwgdmFsdWVfdHlwZT1pbnQpLmV4ZWN1dGUoc2VsZi51c2VfcGFnaW5nLCBwYXJzZWQsIHNlbGYucHJpbnRlcnIpCisgICAgICAgIGlmIHNlbGYudXNlX3BhZ2luZyBhbmQgcmVxdWVzdGVkX3BhZ2Vfc2l6ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYucGFnZV9zaXplID0gcmVxdWVzdGVkX3BhZ2Vfc2l6ZQorICAgICAgICBpZiBzZWxmLnVzZV9wYWdpbmc6CisgICAgICAgICAgICBwcmludCgoIlBhZ2Ugc2l6ZToge30iLmZvcm1hdChzZWxmLnBhZ2Vfc2l6ZSkpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wYWdlX3NpemUgPSBzZWxmLmRlZmF1bHRfcGFnZV9zaXplCisKKyAgICBkZWYgYXBwbHljb2xvcihzZWxmLCB0ZXh0LCBjb2xvcj1Ob25lKToKKyAgICAgICAgaWYgbm90IGNvbG9yIG9yIG5vdCBzZWxmLmNvbG9yOgorICAgICAgICAgICAgcmV0dXJuIHRleHQKKyAgICAgICAgcmV0dXJuIGNvbG9yICsgdGV4dCArIEFOU0lfUkVTRVQKKworICAgIGRlZiB3cml0ZXJlc3VsdChzZWxmLCB0ZXh0LCBjb2xvcj1Ob25lLCBuZXdsaW5lPVRydWUsIG91dD1Ob25lKToKKyAgICAgICAgaWYgb3V0IGlzIE5vbmU6CisgICAgICAgICAgICBvdXQgPSBzZWxmLnF1ZXJ5X291dAorCisgICAgICAgICMgY29udmVydCBFeGNlcHRpb25zLCBldGMgdG8gdGV4dAorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0ZXh0LCBzdHIpOgorICAgICAgICAgICAgdGV4dCA9IHN0cih0ZXh0KQorCisgICAgICAgIHRvX3dyaXRlID0gc2VsZi5hcHBseWNvbG9yKHRleHQsIGNvbG9yKSArICgnXG4nIGlmIG5ld2xpbmUgZWxzZSAnJykKKyAgICAgICAgb3V0LndyaXRlKHRvX3dyaXRlKQorCisgICAgZGVmIGZsdXNoX291dHB1dChzZWxmKToKKyAgICAgICAgc2VsZi5xdWVyeV9vdXQuZmx1c2goKQorCisgICAgZGVmIHByaW50ZXJyKHNlbGYsIHRleHQsIGNvbG9yPVJFRCwgbmV3bGluZT1UcnVlLCBzaG93bnVtPU5vbmUpOgorICAgICAgICBzZWxmLnN0YXRlbWVudF9lcnJvciA9IFRydWUKKyAgICAgICAgaWYgc2hvd251bSBpcyBOb25lOgorICAgICAgICAgICAgc2hvd251bSA9IHNlbGYuc2hvd19saW5lX251bXMKKyAgICAgICAgaWYgc2hvd251bToKKyAgICAgICAgICAgIHRleHQgPSAnJXM6JWQ6JXMnICUgKHNlbGYuc3RkaW4ubmFtZSwgc2VsZi5saW5lbm8sIHRleHQpCisgICAgICAgIHNlbGYud3JpdGVyZXN1bHQodGV4dCwgY29sb3IsIG5ld2xpbmU9bmV3bGluZSwgb3V0PXN5cy5zdGRlcnIpCisKKyAgICBkZWYgc3RvcF9jb3ZlcmFnZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jb3ZlcmFnZSBhbmQgc2VsZi5jb3YgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmNvdi5zdG9wKCkKKyAgICAgICAgICAgIHNlbGYuY292LnNhdmUoKQorICAgICAgICAgICAgc2VsZi5jb3YgPSBOb25lCisKKyAgICBkZWYgaW5pdF9oaXN0b3J5KHNlbGYpOgorICAgICAgICBpZiByZWFkbGluZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZWFkbGluZS5yZWFkX2hpc3RvcnlfZmlsZShISVNUT1JZKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZGVsaW1zID0gcmVhZGxpbmUuZ2V0X2NvbXBsZXRlcl9kZWxpbXMoKQorICAgICAgICAgICAgZGVsaW1zLnJlcGxhY2UoIiciLCAiIikKKyAgICAgICAgICAgIGRlbGltcyArPSAnLicKKyAgICAgICAgICAgIHJlYWRsaW5lLnNldF9jb21wbGV0ZXJfZGVsaW1zKGRlbGltcykKKworICAgICAgICAgICAgIyBjb25maWd1cmUgbGVuZ3RoIG9mIGhpc3Rvcnkgc2hvd24KKyAgICAgICAgICAgIHNlbGYubWF4X2hpc3RvcnlfbGVuZ3RoX3Nob3duID0gNTAKKworICAgIGRlZiBzYXZlX2hpc3Rvcnkoc2VsZik6CisgICAgICAgIGlmIHJlYWRsaW5lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlYWRsaW5lLndyaXRlX2hpc3RvcnlfZmlsZShISVNUT1JZKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisKK2NsYXNzIFN3aXRjaENvbW1hbmQob2JqZWN0KToKKyAgICBjb21tYW5kID0gTm9uZQorICAgIGRlc2NyaXB0aW9uID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbW1hbmQsIGRlc2MpOgorICAgICAgICBzZWxmLmNvbW1hbmQgPSBjb21tYW5kCisgICAgICAgIHNlbGYuZGVzY3JpcHRpb24gPSBkZXNjCisKKyAgICBkZWYgZXhlY3V0ZShzZWxmLCBzdGF0ZSwgcGFyc2VkLCBwcmludGVycik6CisgICAgICAgIHN3aXRjaCA9IHBhcnNlZC5nZXRfYmluZGluZygnc3dpdGNoJykKKyAgICAgICAgaWYgc3dpdGNoIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzdGF0ZToKKyAgICAgICAgICAgICAgICBwcmludCgiJXMgaXMgY3VycmVudGx5IGVuYWJsZWQuIFVzZSAlcyBPRkYgdG8gZGlzYWJsZSIKKyAgICAgICAgICAgICAgICAgICAgICAlIChzZWxmLmRlc2NyaXB0aW9uLCBzZWxmLmNvbW1hbmQpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCgiJXMgaXMgY3VycmVudGx5IGRpc2FibGVkLiBVc2UgJXMgT04gdG8gZW5hYmxlLiIKKyAgICAgICAgICAgICAgICAgICAgICAlIChzZWxmLmRlc2NyaXB0aW9uLCBzZWxmLmNvbW1hbmQpKQorICAgICAgICAgICAgcmV0dXJuIHN0YXRlCisKKyAgICAgICAgaWYgc3dpdGNoLnVwcGVyKCkgPT0gJ09OJzoKKyAgICAgICAgICAgIGlmIHN0YXRlOgorICAgICAgICAgICAgICAgIHByaW50ZXJyKCclcyBpcyBhbHJlYWR5IGVuYWJsZWQuIFVzZSAlcyBPRkYgdG8gZGlzYWJsZS4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi5kZXNjcmlwdGlvbiwgc2VsZi5jb21tYW5kKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGUKKyAgICAgICAgICAgIHByaW50KCdOb3cgJXMgaXMgZW5hYmxlZCcgJSAoc2VsZi5kZXNjcmlwdGlvbiwpKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICBpZiBzd2l0Y2gudXBwZXIoKSA9PSAnT0ZGJzoKKyAgICAgICAgICAgIGlmIG5vdCBzdGF0ZToKKyAgICAgICAgICAgICAgICBwcmludGVycignJXMgaXMgbm90IGVuYWJsZWQuJyAlIChzZWxmLmRlc2NyaXB0aW9uLCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlCisgICAgICAgICAgICBwcmludCgnRGlzYWJsZWQgJXMuJyAlIChzZWxmLmRlc2NyaXB0aW9uLCkpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworCitjbGFzcyBTd2l0Y2hDb21tYW5kV2l0aFZhbHVlKFN3aXRjaENvbW1hbmQpOgorICAgICIiIlRoZSBzYW1lIGFzIFN3aXRjaENvbW1hbmQgZXhjZXB0IGl0IGFsc28gYWNjZXB0cyBhIHZhbHVlIGluIHBsYWNlIG9mIE9OLgorCisgICAgVGhpcyByZXR1cm5zIGEgdHVwbGUgb2YgdGhlIGZvcm06IChTV0lUQ0hfVkFMVUUsIFBBU1NFRF9WQUxVRSkKKyAgICBlZzogUEFHSU5HIDUwIHJldHVybnMgKFRydWUsIDUwKQorICAgICAgICBQQUdJTkcgT0ZGIHJldHVybnMgKEZhbHNlLCBOb25lKQorICAgICAgICBQQUdJTkcgT04gcmV0dXJucyAoVHJ1ZSwgTm9uZSkKKworICAgIFRoZSB2YWx1ZV90eXBlIG11c3QgbWF0Y2ggZm9yIHRoZSBQQVNTRURfVkFMVUUsIG90aGVyd2lzZSBpdCB3aWxsIHJldHVybiBOb25lLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb21tYW5kLCBkZXNjLCB2YWx1ZV90eXBlPWludCk6CisgICAgICAgIFN3aXRjaENvbW1hbmQuX19pbml0X18oc2VsZiwgY29tbWFuZCwgZGVzYykKKyAgICAgICAgc2VsZi52YWx1ZV90eXBlID0gdmFsdWVfdHlwZQorCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgc3RhdGUsIHBhcnNlZCwgcHJpbnRlcnIpOgorICAgICAgICBiaW5hcnlfc3dpdGNoX3ZhbHVlID0gU3dpdGNoQ29tbWFuZC5leGVjdXRlKHNlbGYsIHN0YXRlLCBwYXJzZWQsIHByaW50ZXJyKQorICAgICAgICBzd2l0Y2ggPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ3N3aXRjaCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHZhbHVlID0gc2VsZi52YWx1ZV90eXBlKHN3aXRjaCkKKyAgICAgICAgICAgIGJpbmFyeV9zd2l0Y2hfdmFsdWUgPSBUcnVlCisgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgICAgIHZhbHVlID0gTm9uZQorICAgICAgICByZXR1cm4gYmluYXJ5X3N3aXRjaF92YWx1ZSwgdmFsdWUKKworCitkZWYgb3B0aW9uX3dpdGhfZGVmYXVsdChjcGFyc2VyX2dldHRlciwgc2VjdGlvbiwgb3B0aW9uLCBkZWZhdWx0PU5vbmUpOgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIGNwYXJzZXJfZ2V0dGVyKHNlY3Rpb24sIG9wdGlvbikKKyAgICBleGNlcHQgY29uZmlncGFyc2VyLkVycm9yOgorICAgICAgICByZXR1cm4gZGVmYXVsdAorCisKK2RlZiByYXdfb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLCBzZWN0aW9uLCBvcHRpb24sIGRlZmF1bHQ9Tm9uZSk6CisgICAgIiIiCisgICAgU2FtZSAoYWxtb3N0KSBhcyBvcHRpb25fd2l0aF9kZWZhdWx0KCkgYnV0IHdvbid0IGRvIGFueSBzdHJpbmcgaW50ZXJwb2xhdGlvbi4KKyAgICBVc2VmdWwgZm9yIGNvbmZpZyB2YWx1ZXMgdGhhdCBpbmNsdWRlICclJyBzeW1ib2wsIGUuZy4gdGltZSBmb3JtYXQgc3RyaW5nLgorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIGNvbmZpZ3MuZ2V0KHNlY3Rpb24sIG9wdGlvbiwgcmF3PVRydWUpCisgICAgZXhjZXB0IGNvbmZpZ3BhcnNlci5FcnJvcjoKKyAgICAgICAgcmV0dXJuIGRlZmF1bHQKKworCitkZWYgc2hvdWxkX3VzZV9jb2xvcigpOgorICAgIGlmIG5vdCBzeXMuc3Rkb3V0LmlzYXR0eSgpOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBpZiBvcy5lbnZpcm9uLmdldCgnVEVSTScsICcnKSBpbiAoJ2R1bWInLCAnJyk6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIHRyeToKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oWyd0cHV0JywgJ2NvbG9ycyddLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzdGRvdXQsIF8gPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgaWYgaW50KHN0ZG91dC5zdHJpcCgpKSA8IDg6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBleGNlcHQgKE9TRXJyb3IsIEltcG9ydEVycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgIyBvaCB3ZWxsLCB3ZSB0cmllZC4gYXQgbGVhc3Qgd2Uga25vdyB0aGVyZSdzIGEgJFRFUk0gYW5kIGl0J3MKKyAgICAgICAgIyBub3QgImR1bWIiLgorICAgICAgICBwYXNzCisgICAgcmV0dXJuIFRydWUKKworCitkZWYgcmVhZF9vcHRpb25zKGNtZGxpbmVhcmdzLCBlbnZpcm9ubWVudD1vcy5lbnZpcm9uKToKKyAgICBjb25maWdzID0gY29uZmlncGFyc2VyLkNvbmZpZ1BhcnNlcigpCisgICAgY29uZmlncy5yZWFkKENPTkZJR19GSUxFKQorCisgICAgcmF3Y29uZmlncyA9IGNvbmZpZ3BhcnNlci5SYXdDb25maWdQYXJzZXIoKQorICAgIHJhd2NvbmZpZ3MucmVhZChDT05GSUdfRklMRSkKKworICAgIHVzZXJuYW1lX2Zyb21fY3Fsc2hyYyA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXQsICdhdXRoZW50aWNhdGlvbicsICd1c2VybmFtZScpCisgICAgcGFzc3dvcmRfZnJvbV9jcWxzaHJjID0gb3B0aW9uX3dpdGhfZGVmYXVsdChyYXdjb25maWdzLmdldCwgJ2F1dGhlbnRpY2F0aW9uJywgJ3Bhc3N3b3JkJykKKyAgICBpZiB1c2VybmFtZV9mcm9tX2NxbHNocmMgb3IgcGFzc3dvcmRfZnJvbV9jcWxzaHJjOgorICAgICAgICBpZiBwYXNzd29yZF9mcm9tX2NxbHNocmMgYW5kIG5vdCBpc19maWxlX3NlY3VyZShvcy5wYXRoLmV4cGFuZHVzZXIoQ09ORklHX0ZJTEUpKToKKyAgICAgICAgICAgIHByaW50KCJcbldhcm5pbmc6IFBhc3N3b3JkIGlzIGZvdW5kIGluIGFuIGluc2VjdXJlIGNxbHNocmMgZmlsZS4gVGhlIGZpbGUgaXMgb3duZWQgb3IgcmVhZGFibGUgYnkgb3RoZXIgdXNlcnMgb24gdGhlIHN5c3RlbS4iLAorICAgICAgICAgICAgICAgICAgZW5kPScnLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHByaW50KCJcbk5vdGljZTogQ3JlZGVudGlhbHMgaW4gdGhlIGNxbHNocmMgZmlsZSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIGlnbm9yZWQgaW4gdGhlIGZ1dHVyZS4iCisgICAgICAgICAgICAgICJcblBsZWFzZSB1c2UgYSBjcmVkZW50aWFscyBmaWxlIHRvIHNwZWNpZnkgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZC5cbiIsIGZpbGU9c3lzLnN0ZGVycikKKworICAgIG9wdHZhbHVlcyA9IG9wdHBhcnNlLlZhbHVlcygpCisKKyAgICBvcHR2YWx1ZXMudXNlcm5hbWUgPSBOb25lCisgICAgb3B0dmFsdWVzLnBhc3N3b3JkID0gTm9uZQorICAgIG9wdHZhbHVlcy5jcmVkZW50aWFscyA9IG9zLnBhdGguZXhwYW5kdXNlcihvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0LCAnYXV0aGVudGljYXRpb24nLCAnY3JlZGVudGlhbHMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihDUUxfRElSLCAnY3JlZGVudGlhbHMnKSkpCisgICAgb3B0dmFsdWVzLmtleXNwYWNlID0gb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldCwgJ2F1dGhlbnRpY2F0aW9uJywgJ2tleXNwYWNlJykKKyAgICBvcHR2YWx1ZXMuYnJvd3NlciA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXQsICd1aScsICdicm93c2VyJywgTm9uZSkKKyAgICBvcHR2YWx1ZXMuY29tcGxldGVrZXkgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0LCAndWknLCAnY29tcGxldGVrZXknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9DT01QTEVURUtFWSkKKyAgICBvcHR2YWx1ZXMuY29sb3IgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0Ym9vbGVhbiwgJ3VpJywgJ2NvbG9yJykKKyAgICBvcHR2YWx1ZXMudGltZV9mb3JtYXQgPSByYXdfb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLCAndWknLCAndGltZV9mb3JtYXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfVElNRVNUQU1QX0ZPUk1BVCkKKyAgICBvcHR2YWx1ZXMubmFub3RpbWVfZm9ybWF0ID0gcmF3X29wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncywgJ3VpJywgJ25hbm90aW1lX2Zvcm1hdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfTkFOT1RJTUVfRk9STUFUKQorICAgIG9wdHZhbHVlcy5kYXRlX2Zvcm1hdCA9IHJhd19vcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MsICd1aScsICdkYXRlX2Zvcm1hdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9EQVRFX0ZPUk1BVCkKKyAgICBvcHR2YWx1ZXMuZmxvYXRfcHJlY2lzaW9uID0gb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldGludCwgJ3VpJywgJ2Zsb2F0X3ByZWNpc2lvbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9GTE9BVF9QUkVDSVNJT04pCisgICAgb3B0dmFsdWVzLmRvdWJsZV9wcmVjaXNpb24gPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0aW50LCAndWknLCAnZG91YmxlX3ByZWNpc2lvbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRE9VQkxFX1BSRUNJU0lPTikKKyAgICBvcHR2YWx1ZXMuZmllbGRfc2l6ZV9saW1pdCA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXRpbnQsICdjc3YnLCAnZmllbGRfc2l6ZV9saW1pdCcsIGNzdi5maWVsZF9zaXplX2xpbWl0KCkpCisgICAgb3B0dmFsdWVzLm1heF90cmFjZV93YWl0ID0gb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldGZsb2F0LCAndHJhY2luZycsICdtYXhfdHJhY2Vfd2FpdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX01BWF9UUkFDRV9XQUlUKQorICAgIG9wdHZhbHVlcy50aW1lem9uZSA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXQsICd1aScsICd0aW1lem9uZScsIE5vbmUpCisKKyAgICBvcHR2YWx1ZXMuZGVidWcgPSBGYWxzZQorCisgICAgb3B0dmFsdWVzLmNvdmVyYWdlID0gRmFsc2UKKyAgICBpZiAnQ1FMU0hfQ09WRVJBR0UnIGluIGVudmlyb25tZW50LmtleXMoKToKKyAgICAgICAgb3B0dmFsdWVzLmNvdmVyYWdlID0gVHJ1ZQorCisgICAgb3B0dmFsdWVzLmZpbGUgPSBOb25lCisgICAgb3B0dmFsdWVzLnNzbCA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXRib29sZWFuLCAnY29ubmVjdGlvbicsICdzc2wnLCBERUZBVUxUX1NTTCkKKyAgICBvcHR2YWx1ZXMuZW5jb2RpbmcgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0LCAndWknLCAnZW5jb2RpbmcnLCBVVEY4KQorCisgICAgb3B0dmFsdWVzLnR0eSA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXRib29sZWFuLCAndWknLCAndHR5Jywgc3lzLnN0ZGluLmlzYXR0eSgpKQorICAgIG9wdHZhbHVlcy5wcm90b2NvbF92ZXJzaW9uID0gb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldGludCwgJ3Byb3RvY29sJywgJ3ZlcnNpb24nLCBOb25lKQorICAgIG9wdHZhbHVlcy5jcWx2ZXJzaW9uID0gb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldCwgJ2NxbCcsICd2ZXJzaW9uJywgTm9uZSkKKyAgICBvcHR2YWx1ZXMuY29ubmVjdF90aW1lb3V0ID0gb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldGludCwgJ2Nvbm5lY3Rpb24nLCAndGltZW91dCcsIERFRkFVTFRfQ09OTkVDVF9USU1FT1VUX1NFQ09ORFMpCisgICAgb3B0dmFsdWVzLnJlcXVlc3RfdGltZW91dCA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXRpbnQsICdjb25uZWN0aW9uJywgJ3JlcXVlc3RfdGltZW91dCcsIERFRkFVTFRfUkVRVUVTVF9USU1FT1VUX1NFQ09ORFMpCisgICAgb3B0dmFsdWVzLmV4ZWN1dGUgPSBOb25lCisgICAgb3B0dmFsdWVzLmluc2VjdXJlX3Bhc3N3b3JkX3dpdGhvdXRfd2FybmluZyA9IEZhbHNlCisKKyAgICAob3B0aW9ucywgYXJndW1lbnRzKSA9IHBhcnNlci5wYXJzZV9hcmdzKGNtZGxpbmVhcmdzLCB2YWx1ZXM9b3B0dmFsdWVzKQorCisgICAgIyBDcmVkZW50aWFscyBmcm9tIGNxbHNocmMgd2lsbCBiZSBleHBhbmRlZCwKKyAgICAjIGNyZWRlbnRpYWxzIGZyb20gdGhlIGNvbW1hbmQgbGluZSBhcmUgYWxzbyBleHBhbmRlZCBpZiB0aGVyZSBpcyBhIHNwYWNlLi4uCisgICAgIyB3ZSBuZWVkIHRoZSBmb2xsb3dpbmcgc28gdGhhdCB0aGVzZSB0d28gc2NlbmFyaW9zIHdpbGwgd29yaworICAgICMgICBjcWxzaCAtLWNyZWRlbnRpYWxzPX4vLmNhc3NhbmRyYS9jcmVkcworICAgICMgICBjcWxzaCAtLWNyZWRlbnRpYWxzIH4vLmNhc3NhbmRyYS9jcmVkcworICAgIG9wdGlvbnMuY3JlZGVudGlhbHMgPSBvcy5wYXRoLmV4cGFuZHVzZXIob3B0aW9ucy5jcmVkZW50aWFscykKKworICAgIGlmIG5vdCBpc19maWxlX3NlY3VyZShvcHRpb25zLmNyZWRlbnRpYWxzKToKKyAgICAgICAgcHJpbnQoIlxuV2FybmluZzogQ3JlZGVudGlhbHMgZmlsZSAnezB9JyBleGlzdHMgYnV0IGlzIG5vdCB1c2VkLCBiZWNhdXNlOiIKKyAgICAgICAgICAgICAgIlxuICBhLiB0aGUgZmlsZSBvd25lciBpcyBub3QgdGhlIGN1cnJlbnQgdXNlcjsgb3IiCisgICAgICAgICAgICAgICJcbiAgYi4gdGhlIGZpbGUgaXMgcmVhZGFibGUgYnkgZ3JvdXAgb3Igb3RoZXIuIgorICAgICAgICAgICAgICAiXG5QbGVhc2UgZW5zdXJlIHRoZSBmaWxlIGlzIG93bmVkIGJ5IHRoZSBjdXJyZW50IHVzZXIgYW5kIGlzIG5vdCByZWFkYWJsZSBieSBncm91cCBvciBvdGhlci4iCisgICAgICAgICAgICAgICJcbk9uIGEgTGludXggb3IgVU5JWC1saWtlIHN5c3RlbSwgeW91IG9mdGVuIGNhbiBkbyB0aGlzIGJ5IHVzaW5nIHRoZSBgY2hvd25gIGFuZCBgY2htb2RgIGNvbW1hbmRzOiIKKyAgICAgICAgICAgICAgIlxuICBjaG93biBZT1VSX1VTRVJOQU1FIGNyZWRlbnRpYWxzIgorICAgICAgICAgICAgICAiXG4gIGNobW9kIDYwMCBjcmVkZW50aWFsc1xuIi5mb3JtYXQob3B0aW9ucy5jcmVkZW50aWFscyksCisgICAgICAgICAgICAgIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgb3B0aW9ucy5jcmVkZW50aWFscyA9ICcnICAjIENvbmZpZ1BhcnNlci5yZWFkKCkgd2lsbCBpZ25vcmUgdW5yZWFkYWJsZSBmaWxlcworCisgICAgaWYgbm90IG9wdGlvbnMudXNlcm5hbWU6CisgICAgICAgIGNyZWRlbnRpYWxzID0gY29uZmlncGFyc2VyLkNvbmZpZ1BhcnNlcigpCisgICAgICAgIGNyZWRlbnRpYWxzLnJlYWQob3B0aW9ucy5jcmVkZW50aWFscykKKworICAgICAgICAjIHVzZSB0aGUgdXNlcm5hbWUgZnJvbSBjcmVkZW50aWFscyBmaWxlIGJ1dCBmYWxsYmFjayB0byBjcWxzaHJjIGlmIHVzZXJuYW1lIGlzIGFic2VudCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgcGFyYW1ldGVycworICAgICAgICBvcHRpb25zLnVzZXJuYW1lID0gdXNlcm5hbWVfZnJvbV9jcWxzaHJjCisKKyAgICBpZiBub3Qgb3B0aW9ucy5wYXNzd29yZDoKKyAgICAgICAgcmF3Y3JlZGVudGlhbHMgPSBjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyKCkKKyAgICAgICAgcmF3Y3JlZGVudGlhbHMucmVhZChvcHRpb25zLmNyZWRlbnRpYWxzKQorCisgICAgICAgICMgaGFuZGxpbmcgcGFzc3dvcmQgaW4gdGhlIHNhbWUgd2F5IGFzIHVzZXJuYW1lLCBwcmlvcml0eSBjbGkgPiBjcmVkZW50aWFscyA+IGNxbHNocmMKKyAgICAgICAgb3B0aW9ucy5wYXNzd29yZCA9IG9wdGlvbl93aXRoX2RlZmF1bHQocmF3Y3JlZGVudGlhbHMuZ2V0LCAncGxhaW5fdGV4dF9hdXRoJywgJ3Bhc3N3b3JkJywgcGFzc3dvcmRfZnJvbV9jcWxzaHJjKQorICAgICAgICBvcHRpb25zLnBhc3N3b3JkID0gcGFzc3dvcmRfZnJvbV9jcWxzaHJjCisgICAgZWxpZiBub3Qgb3B0aW9ucy5pbnNlY3VyZV9wYXNzd29yZF93aXRob3V0X3dhcm5pbmc6CisgICAgICAgIHByaW50KCJcbldhcm5pbmc6IFVzaW5nIGEgcGFzc3dvcmQgb24gdGhlIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UgY2FuIGJlIGluc2VjdXJlLiIKKyAgICAgICAgICAgICAgIlxuUmVjb21tZW5kYXRpb246IHVzZSB0aGUgY3JlZGVudGlhbHMgZmlsZSB0byBzZWN1cmVseSBwcm92aWRlIHRoZSBwYXNzd29yZC5cbiIsIGZpbGU9c3lzLnN0ZGVycikKKworICAgICMgTWFrZSBzdXJlIHNvbWUgdXNlciB2YWx1ZXMgcmVhZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYXJlIGluIHVuaWNvZGUKKyAgICBvcHRpb25zLmV4ZWN1dGUgPSBtYXliZV9lbnN1cmVfdGV4dChvcHRpb25zLmV4ZWN1dGUpCisgICAgb3B0aW9ucy51c2VybmFtZSA9IG1heWJlX2Vuc3VyZV90ZXh0KG9wdGlvbnMudXNlcm5hbWUpCisgICAgb3B0aW9ucy5wYXNzd29yZCA9IG1heWJlX2Vuc3VyZV90ZXh0KG9wdGlvbnMucGFzc3dvcmQpCisgICAgb3B0aW9ucy5rZXlzcGFjZSA9IG1heWJlX2Vuc3VyZV90ZXh0KG9wdGlvbnMua2V5c3BhY2UpCisKKyAgICBob3N0bmFtZSA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXQsICdjb25uZWN0aW9uJywgJ2hvc3RuYW1lJywgREVGQVVMVF9IT1NUKQorICAgIHBvcnQgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0LCAnY29ubmVjdGlvbicsICdwb3J0JywgREVGQVVMVF9QT1JUKQorCisgICAgdHJ5OgorICAgICAgICBvcHRpb25zLmNvbm5lY3RfdGltZW91dCA9IGludChvcHRpb25zLmNvbm5lY3RfdGltZW91dCkKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgcGFyc2VyLmVycm9yKCciJXMiIGlzIG5vdCBhIHZhbGlkIGNvbm5lY3QgdGltZW91dC4nICUgKG9wdGlvbnMuY29ubmVjdF90aW1lb3V0LCkpCisgICAgICAgIG9wdGlvbnMuY29ubmVjdF90aW1lb3V0ID0gREVGQVVMVF9DT05ORUNUX1RJTUVPVVRfU0VDT05EUworCisgICAgdHJ5OgorICAgICAgICBvcHRpb25zLnJlcXVlc3RfdGltZW91dCA9IGludChvcHRpb25zLnJlcXVlc3RfdGltZW91dCkKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgcGFyc2VyLmVycm9yKCciJXMiIGlzIG5vdCBhIHZhbGlkIHJlcXVlc3QgdGltZW91dC4nICUgKG9wdGlvbnMucmVxdWVzdF90aW1lb3V0LCkpCisgICAgICAgIG9wdGlvbnMucmVxdWVzdF90aW1lb3V0ID0gREVGQVVMVF9SRVFVRVNUX1RJTUVPVVRfU0VDT05EUworCisgICAgaG9zdG5hbWUgPSBlbnZpcm9ubWVudC5nZXQoJ0NRTFNIX0hPU1QnLCBob3N0bmFtZSkKKyAgICBwb3J0ID0gZW52aXJvbm1lbnQuZ2V0KCdDUUxTSF9QT1JUJywgcG9ydCkKKworICAgIGlmIGxlbihhcmd1bWVudHMpID4gMDoKKyAgICAgICAgaG9zdG5hbWUgPSBhcmd1bWVudHNbMF0KKyAgICBpZiBsZW4oYXJndW1lbnRzKSA+IDE6CisgICAgICAgIHBvcnQgPSBhcmd1bWVudHNbMV0KKworICAgIGlmIG9wdGlvbnMuZmlsZSBvciBvcHRpb25zLmV4ZWN1dGU6CisgICAgICAgIG9wdGlvbnMudHR5ID0gRmFsc2UKKworICAgIGlmIG9wdGlvbnMuZXhlY3V0ZSBhbmQgbm90IG9wdGlvbnMuZXhlY3V0ZS5lbmRzd2l0aCgnOycpOgorICAgICAgICBvcHRpb25zLmV4ZWN1dGUgKz0gJzsnCisKKyAgICBpZiBvcHR2YWx1ZXMuY29sb3IgaW4gKFRydWUsIEZhbHNlKToKKyAgICAgICAgb3B0aW9ucy5jb2xvciA9IG9wdHZhbHVlcy5jb2xvcgorICAgIGVsc2U6CisgICAgICAgIGlmIG9wdGlvbnMuZmlsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG9wdGlvbnMuY29sb3IgPSBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3B0aW9ucy5jb2xvciA9IHNob3VsZF91c2VfY29sb3IoKQorCisgICAgaWYgb3B0aW9ucy5jcWx2ZXJzaW9uIGlzIG5vdCBOb25lOgorICAgICAgICBvcHRpb25zLmNxbHZlcnNpb24sIGNxbHZlcnR1cCA9IGZ1bGxfY3FsX3ZlcnNpb24ob3B0aW9ucy5jcWx2ZXJzaW9uKQorICAgICAgICBpZiBjcWx2ZXJ0dXBbMF0gPCAzOgorICAgICAgICAgICAgcGFyc2VyLmVycm9yKCclciBpcyBub3QgYSBzdXBwb3J0ZWQgQ1FMIHZlcnNpb24uJyAlIG9wdGlvbnMuY3FsdmVyc2lvbikKKyAgICBvcHRpb25zLmNxbG1vZHVsZSA9IGNxbDNoYW5kbGluZworCisgICAgdHJ5OgorICAgICAgICBwb3J0ID0gaW50KHBvcnQpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHBhcnNlci5lcnJvcignJXIgaXMgbm90IGEgdmFsaWQgcG9ydCBudW1iZXIuJyAlIHBvcnQpCisgICAgcmV0dXJuIG9wdGlvbnMsIGhvc3RuYW1lLCBwb3J0CisKKworZGVmIHNldHVwX2NxbHJ1bGVzZXQoY3FsbW9kdWxlKToKKyAgICBnbG9iYWwgY3FscnVsZXNldAorICAgIGNxbHJ1bGVzZXQgPSBjcWxtb2R1bGUuQ3FsUnVsZVNldAorICAgIGNxbHJ1bGVzZXQuYXBwZW5kX3J1bGVzKGNxbHNoaGFuZGxpbmcuY3Fsc2hfZXh0cmFfc3ludGF4X3J1bGVzKQorICAgIGZvciBydWxlbmFtZSwgdGVybW5hbWUsIGZ1bmMgaW4gY3Fsc2hoYW5kbGluZy5jcWxzaF9zeW50YXhfY29tcGxldGVyczoKKyAgICAgICAgY3FscnVsZXNldC5jb21wbGV0ZXJfZm9yKHJ1bGVuYW1lLCB0ZXJtbmFtZSkoZnVuYykKKyAgICBjcWxydWxlc2V0LmNvbW1hbmRzX2VuZF93aXRoX25ld2xpbmUudXBkYXRlKGNxbHNoaGFuZGxpbmcubXlfY29tbWFuZHNfZW5kaW5nX3dpdGhfbmV3bGluZSkKKworCitkZWYgc2V0dXBfY3FsZG9jcyhjcWxtb2R1bGUpOgorICAgIGdsb2JhbCBjcWxkb2NzCisgICAgY3FsZG9jcyA9IGNxbG1vZHVsZS5jcWxkb2NzCisKKworZGVmIHNldHVwX2RvY3NwYXRoKHBhdGgpOgorICAgIGdsb2JhbCBDQVNTQU5EUkFfQ1FMX0hUTUwKKyAgICBDQVNTQU5EUkFfQ1FMX0hUTUxfRkFMTEJBQ0sgPSAnaHR0cHM6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZy9kb2MvbGF0ZXN0L2NxbC9pbmRleC5odG1sJworICAgICMKKyAgICAjIGRlZmF1bHQgbG9jYXRpb24gb2YgbG9jYWwgQ1FMLmh0bWwKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoICsgJy9kb2MvY3FsMy9DUUwuaHRtbCcpOgorICAgICAgICAjIGRlZmF1bHQgbG9jYXRpb24gb2YgbG9jYWwgQ1FMLmh0bWwKKyAgICAgICAgQ0FTU0FORFJBX0NRTF9IVE1MID0gJ2ZpbGU6Ly8nICsgcGF0aCArICcvZG9jL2NxbDMvQ1FMLmh0bWwnCisgICAgZWxpZiBvcy5wYXRoLmV4aXN0cygnL3Vzci9zaGFyZS9kb2MvY2Fzc2FuZHJhL0NRTC5odG1sJyk6CisgICAgICAgICMgZmFsbGJhY2sgdG8gcGFja2FnZSBmaWxlCisgICAgICAgIENBU1NBTkRSQV9DUUxfSFRNTCA9ICdmaWxlOi8vL3Vzci9zaGFyZS9kb2MvY2Fzc2FuZHJhL0NRTC5odG1sJworICAgIGVsc2U6CisgICAgICAgICMgZmFsbGJhY2sgdG8gb25saW5lIHZlcnNpb24KKyAgICAgICAgQ0FTU0FORFJBX0NRTF9IVE1MID0gQ0FTU0FORFJBX0NRTF9IVE1MX0ZBTExCQUNLCisKKworZGVmIGluc2VydF9kcml2ZXJfaG9va3MoKToKKworICAgIGNsYXNzIERhdGVPdmVyRmxvd1dhcm5pbmcoUnVudGltZVdhcm5pbmcpOgorICAgICAgICBwYXNzCisKKyAgICAjIERpc3BsYXkgbWlsbGlzZWNvbmRzIHdoZW4gZGF0ZXRpbWUgb3ZlcmZsb3dzIChDQVNTQU5EUkEtMTA2MjUpLCBFLmcuLCB0aGUgeWVhciAxMDAwMC4KKyAgICAjIE5hdGl2ZSBkYXRldGltZSB0eXBlcyBibG93IHVwIG91dHNpZGUgb2YgZGF0ZXRpbWUuW01JTnxNQVhdX1lFQVIuIFdlIHdpbGwgZmFsbCBiYWNrIHRvIGFuIGludCB0aW1lc3RhbXAKKyAgICBkZWYgZGVzZXJpYWxpemVfZGF0ZV9mYWxsYmFja19pbnQoYnl0cywgcHJvdG9jb2xfdmVyc2lvbik6CisgICAgICAgIHRpbWVzdGFtcF9tcyA9IGludDY0X3VucGFjayhieXRzKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gZGF0ZXRpbWVfZnJvbV90aW1lc3RhbXAodGltZXN0YW1wX21zIC8gMTAwMC4wKQorICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oRGF0ZU92ZXJGbG93V2FybmluZygiU29tZSB0aW1lc3RhbXBzIGFyZSBsYXJnZXIgdGhhbiBQeXRob24gZGF0ZXRpbWUgY2FuIHJlcHJlc2VudC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaW1lc3RhbXBzIGFyZSBkaXNwbGF5ZWQgaW4gbWlsbGlzZWNvbmRzIGZyb20gZXBvY2guIikpCisgICAgICAgICAgICByZXR1cm4gdGltZXN0YW1wX21zCisKKyAgICBjYXNzYW5kcmEuY3FsdHlwZXMuRGF0ZVR5cGUuZGVzZXJpYWxpemUgPSBzdGF0aWNtZXRob2QoZGVzZXJpYWxpemVfZGF0ZV9mYWxsYmFja19pbnQpCisKKyAgICBpZiBoYXNhdHRyKGNhc3NhbmRyYSwgJ2Rlc2VyaWFsaXplcnMnKToKKyAgICAgICAgZGVsIGNhc3NhbmRyYS5kZXNlcmlhbGl6ZXJzLkRlc0RhdGVUeXBlCisKKyAgICAjIFJldHVybiBjYXNzYW5kcmEuY3FsdHlwZXMuRU1QVFkgaW5zdGVhZCBvZiBOb25lIGZvciBlbXB0eSB2YWx1ZXMKKyAgICBjYXNzYW5kcmEuY3FsdHlwZXMuQ2Fzc2FuZHJhVHlwZS5zdXBwb3J0X2VtcHR5X3ZhbHVlcyA9IFRydWUKKworCitkZWYgbWFpbihjbWRsaW5lLCBwa2dwYXRoKToKKyAgICBpbnNlcnRfZHJpdmVyX2hvb2tzKCkKKyAgICAob3B0aW9ucywgaG9zdG5hbWUsIHBvcnQpID0gcmVhZF9vcHRpb25zKGNtZGxpbmUpCisKKyAgICBzZXR1cF9kb2NzcGF0aChwa2dwYXRoKQorICAgIHNldHVwX2NxbHJ1bGVzZXQob3B0aW9ucy5jcWxtb2R1bGUpCisgICAgc2V0dXBfY3FsZG9jcyhvcHRpb25zLmNxbG1vZHVsZSkKKyAgICBjc3YuZmllbGRfc2l6ZV9saW1pdChvcHRpb25zLmZpZWxkX3NpemVfbGltaXQpCisKKyAgICBpZiBvcHRpb25zLmZpbGUgaXMgTm9uZToKKyAgICAgICAgc3RkaW4gPSBOb25lCisgICAgZWxzZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZW5jb2RpbmcsIGJvbV9zaXplID0gZ2V0X2ZpbGVfZW5jb2RpbmdfYm9tc2l6ZShvcHRpb25zLmZpbGUpCisgICAgICAgICAgICBzdGRpbiA9IGNvZGVjcy5vcGVuKG9wdGlvbnMuZmlsZSwgJ3InLCBlbmNvZGluZykKKyAgICAgICAgICAgIHN0ZGluLnNlZWsoYm9tX3NpemUpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CisgICAgICAgICAgICBzeXMuZXhpdCgiQ2FuJ3Qgb3BlbiAlcjogJXMiICUgKG9wdGlvbnMuZmlsZSwgZSkpCisKKyAgICBpZiBvcHRpb25zLmRlYnVnOgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJVc2luZyBDUUwgZHJpdmVyOiAlc1xuIiAlIChjYXNzYW5kcmEsKSkKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiVXNpbmcgY29ubmVjdCB0aW1lb3V0OiAlcyBzZWNvbmRzXG4iICUgKG9wdGlvbnMuY29ubmVjdF90aW1lb3V0LCkpCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIlVzaW5nICclcycgZW5jb2RpbmdcbiIgJSAob3B0aW9ucy5lbmNvZGluZywpKQorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJVc2luZyBzc2w6ICVzXG4iICUgKG9wdGlvbnMuc3NsLCkpCisKKyAgICAjIGNyZWF0ZSB0aW1lem9uZSBiYXNlZCBvbiBzZXR0aW5ncywgZW52aXJvbm1lbnQgb3IgYXV0by1kZXRlY3Rpb24KKyAgICB0aW1lem9uZSA9IE5vbmUKKyAgICBpZiBvcHRpb25zLnRpbWV6b25lIG9yICdUWicgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHB5dHoKKyAgICAgICAgICAgIGlmIG9wdGlvbnMudGltZXpvbmU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB0aW1lem9uZSA9IHB5dHoudGltZXpvbmUob3B0aW9ucy50aW1lem9uZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJXYXJuaW5nOiBjb3VsZCBub3QgcmVjb2duaXplIHRpbWV6b25lICclcycgc3BlY2lmaWVkIGluIGNxbHNocmNcblxuIiAlIChvcHRpb25zLnRpbWV6b25lKSkKKyAgICAgICAgICAgIGlmICdUWicgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHRpbWV6b25lID0gcHl0ei50aW1lem9uZShvcy5lbnZpcm9uWydUWiddKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIldhcm5pbmc6IGNvdWxkIG5vdCByZWNvZ25pemUgdGltZXpvbmUgJyVzJyBmcm9tIGVudmlyb25tZW50IHZhbHVlIFRaXG5cbiIgJSAob3MuZW52aXJvblsnVFonXSkpCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIldhcm5pbmc6IFRpbWV6b25lIGRlZmluZWQgYW5kICdweXR6JyBtb2R1bGUgZm9yIHRpbWV6b25lIGNvbnZlcnNpb24gbm90IGluc3RhbGxlZC4gVGltZXN0YW1wcyB3aWxsIGJlIGRpc3BsYXllZCBpbiBVVEMgdGltZXpvbmUuXG5cbiIpCisKKyAgICAjIHRyeSBhdXRvLWRldGVjdCB0aW1lem9uZSBpZiB0emxvY2FsIGlzIGluc3RhbGxlZAorICAgIGlmIG5vdCB0aW1lem9uZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSB0emxvY2FsIGltcG9ydCBnZXRfbG9jYWx6b25lCisgICAgICAgICAgICB0aW1lem9uZSA9IGdldF9sb2NhbHpvbmUoKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAjIHdlIHNpbGVudGx5IGlnbm9yZSBhbmQgZmFsbGJhY2sgdG8gVVRDIHVubGVzcyBhIGN1c3RvbSB0aW1lc3RhbXAgZm9ybWF0ICh3aGljaCBsaWtlbHkKKyAgICAgICAgICAgICMgZG9lcyBjb250YWluIGEgVFogcGFydCkgd2FzIHNwZWNpZmllZAorICAgICAgICAgICAgaWYgb3B0aW9ucy50aW1lX2Zvcm1hdCAhPSBERUZBVUxUX1RJTUVTVEFNUF9GT1JNQVQ6CisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiV2FybmluZzogY3VzdG9tIHRpbWVzdGFtcCBmb3JtYXQgc3BlY2lmaWVkIGluIGNxbHNocmMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImJ1dCBsb2NhbCB0aW1lem9uZSBjb3VsZCBub3QgYmUgZGV0ZWN0ZWQuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJFaXRoZXIgaW5zdGFsbCBQeXRob24gJ3R6bG9jYWwnIG1vZHVsZSBmb3IgYXV0by1kZXRlY3Rpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAib3Igc3BlY2lmeSBjbGllbnQgdGltZXpvbmUgaW4geW91ciBjcWxzaHJjLlxuXG4iKQorCisgICAgdHJ5OgorICAgICAgICBzaGVsbCA9IFNoZWxsKGhvc3RuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgY29sb3I9b3B0aW9ucy5jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZT1vcHRpb25zLnVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN0ZGluLAorICAgICAgICAgICAgICAgICAgICAgIHR0eT1vcHRpb25zLnR0eSwKKyAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWtleT1vcHRpb25zLmNvbXBsZXRla2V5LAorICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXI9b3B0aW9ucy5icm93c2VyLAorICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sX3ZlcnNpb249b3B0aW9ucy5wcm90b2NvbF92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgIGNxbHZlcj1vcHRpb25zLmNxbHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAga2V5c3BhY2U9b3B0aW9ucy5rZXlzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X3RpbWVzdGFtcF9mb3JtYXQ9b3B0aW9ucy50aW1lX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X25hbm90aW1lX2Zvcm1hdD1vcHRpb25zLm5hbm90aW1lX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2RhdGVfZm9ybWF0PW9wdGlvbnMuZGF0ZV9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9mbG9hdF9wcmVjaXNpb249b3B0aW9ucy5mbG9hdF9wcmVjaXNpb24sCisgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9kb3VibGVfcHJlY2lzaW9uPW9wdGlvbnMuZG91YmxlX3ByZWNpc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X3RpbWV6b25lPXRpbWV6b25lLAorICAgICAgICAgICAgICAgICAgICAgIG1heF90cmFjZV93YWl0PW9wdGlvbnMubWF4X3RyYWNlX3dhaXQsCisgICAgICAgICAgICAgICAgICAgICAgc3NsPW9wdGlvbnMuc3NsLAorICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZV9zdGF0ZW1lbnQ9b3B0aW9ucy5leGVjdXRlLAorICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfdGltZW91dD1vcHRpb25zLnJlcXVlc3RfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0X3RpbWVvdXQ9b3B0aW9ucy5jb25uZWN0X3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc9b3B0aW9ucy5lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICBhdXRoX3Byb3ZpZGVyPWF1dGhwcm92aWRlcmhhbmRsaW5nLmxvYWRfYXV0aF9wcm92aWRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnX2ZpbGU9Q09ORklHX0ZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRfZmlsZT1vcHRpb25zLmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZT1vcHRpb25zLnVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZD1vcHRpb25zLnBhc3N3b3JkKSkKKyAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgIHN5cy5leGl0KCdDb25uZWN0aW9uIGFib3J0ZWQuJykKKyAgICBleGNlcHQgQ1FMX0VSUk9SUyBhcyBlOgorICAgICAgICBzeXMuZXhpdCgnQ29ubmVjdGlvbiBlcnJvcjogJXMnICUgKGUsKSkKKyAgICBleGNlcHQgVmVyc2lvbk5vdFN1cHBvcnRlZCBhcyBlOgorICAgICAgICBzeXMuZXhpdCgnVW5zdXBwb3J0ZWQgQ1FMIHZlcnNpb246ICVzJyAlIChlLCkpCisgICAgaWYgb3B0aW9ucy5kZWJ1ZzoKKyAgICAgICAgc2hlbGwuZGVidWcgPSBUcnVlCisgICAgaWYgb3B0aW9ucy5jb3ZlcmFnZToKKyAgICAgICAgc2hlbGwuY292ZXJhZ2UgPSBUcnVlCisgICAgICAgIGltcG9ydCBzaWduYWwKKworICAgICAgICBkZWYgaGFuZGxlX3NpZ2h1cCgpOgorICAgICAgICAgICAgc2hlbGwuc3RvcF9jb3ZlcmFnZSgpCisgICAgICAgICAgICBzaGVsbC5kb19leGl0KCkKKworICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdIVVAsIGhhbmRsZV9zaWdodXApCisKKyAgICBzaGVsbC5pbml0X2hpc3RvcnkoKQorICAgIHNoZWxsLmNtZGxvb3AoKQorICAgIHNoZWxsLnNhdmVfaGlzdG9yeSgpCisKKyAgICBpZiBzaGVsbC5iYXRjaF9tb2RlIGFuZCBzaGVsbC5zdGF0ZW1lbnRfZXJyb3I6CisgICAgICAgIHN5cy5leGl0KDIpCisKKworIyB2aW06IHNldCBmdD1weXRob24gZXQgdHM9NCBzdz00IDoKZGlmZiAtLWdpdCBhL3B5bGliL2NxbHNobGliL2Zvcm1hdHRpbmcucHkgYi9weWxpYi9jcWxzaGxpYi9mb3JtYXR0aW5nLnB5CmluZGV4IGViZjlmYzcuLjRlYjM2NTggMTAwNjQ0Ci0tLSBhL3B5bGliL2NxbHNobGliL2Zvcm1hdHRpbmcucHkKKysrIGIvcHlsaWIvY3Fsc2hsaWIvZm9ybWF0dGluZy5weQpAQCAtMjAsMTIgKzIwLDEyIEBACiBpbXBvcnQgb3MKIGltcG9ydCByZQogaW1wb3J0IHN5cworaW1wb3J0IHdjd2lkdGgKIAogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKIAogZnJvbSBjYXNzYW5kcmEuY3FsdHlwZXMgaW1wb3J0IEVNUFRZCiBmcm9tIGNhc3NhbmRyYS51dGlsIGltcG9ydCBkYXRldGltZV9mcm9tX3RpbWVzdGFtcAotZnJvbSAuIGltcG9ydCB3Y3dpZHRoCiBmcm9tIC5kaXNwbGF5aW5nIGltcG9ydCBjb2xvcm1lLCBnZXRfc3RyLCBGb3JtYXR0ZWRWYWx1ZSwgREVGQVVMVF9WQUxVRV9DT0xPUlMsIE5PX0NPTE9SX01BUAogZnJvbSAudXRpbCBpbXBvcnQgVVRDCiAKQEAgLTMyNiwxOSArMzI2LDkgQEAKICAgICByZXR1cm4gY29sb3JtZShidmFsLCBjb2xvcm1hcCwgJ2ludCcpCiAKIAotIyBXZSBjYW4gZ2V0IHJpZCBvZiB0aGlzIGluIGNhc3NhbmRyYS0yLjIKLWlmIHN5cy52ZXJzaW9uX2luZm8gPj0gKDIsIDcpOgotICAgIGRlZiBmb3JtYXRfaW50ZWdlcl93aXRoX3Rob3VzYW5kc19zZXAodmFsLCB0aG91c2FuZHNfc2VwPScsJyk6Ci0gICAgICAgIHJldHVybiAiezosLjBmfSIuZm9ybWF0KHZhbCkucmVwbGFjZSgnLCcsIHRob3VzYW5kc19zZXApCi1lbHNlOgotICAgIGRlZiBmb3JtYXRfaW50ZWdlcl93aXRoX3Rob3VzYW5kc19zZXAodmFsLCB0aG91c2FuZHNfc2VwPScsJyk6Ci0gICAgICAgIGlmIHZhbCA8IDA6Ci0gICAgICAgICAgICByZXR1cm4gJy0nICsgZm9ybWF0X2ludGVnZXJfd2l0aF90aG91c2FuZHNfc2VwKC12YWwsIHRob3VzYW5kc19zZXApCi0gICAgICAgIHJlc3VsdCA9ICcnCi0gICAgICAgIHdoaWxlIHZhbCA+PSAxMDAwOgotICAgICAgICAgICAgdmFsLCByID0gZGl2bW9kKHZhbCwgMTAwMCkKLSAgICAgICAgICAgIHJlc3VsdCA9ICIlcyUwM2QlcyIgJSAodGhvdXNhbmRzX3NlcCwgciwgcmVzdWx0KQotICAgICAgICByZXR1cm4gIiVkJXMiICUgKHZhbCwgcmVzdWx0KQorZGVmIGZvcm1hdF9pbnRlZ2VyX3dpdGhfdGhvdXNhbmRzX3NlcCh2YWwsIHRob3VzYW5kc19zZXA9JywnKToKKyAgICByZXR1cm4gIns6LC4wZn0iLmZvcm1hdCh2YWwpLnJlcGxhY2UoJywnLCB0aG91c2FuZHNfc2VwKQorCiAKIGZvcm1hdHRlcl9mb3IoJ2xvbmcnKShmb3JtYXRfaW50ZWdlcl90eXBlKQogZm9ybWF0dGVyX2ZvcignaW50JykoZm9ybWF0X2ludGVnZXJfdHlwZSkKZGlmZiAtLWdpdCBhL3B5bGliL2NxbHNobGliL3B5bGV4b3Ryb24ucHkgYi9weWxpYi9jcWxzaGxpYi9weWxleG90cm9uLnB5CmluZGV4IDY5ZjMxZGMuLmMxZmQ1NWUgMTAwNjQ0Ci0tLSBhL3B5bGliL2NxbHNobGliL3B5bGV4b3Ryb24ucHkKKysrIGIvcHlsaWIvY3Fsc2hsaWIvcHlsZXhvdHJvbi5weQpAQCAtMTQsNyArMTQsMTIgQEAKICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAorIiIiUHlsZXhvdHJvbiB1c2VzIFB5dGhvbidzIHJlLlNjYW5uZXIgbW9kdWxlIGFzIGEgc2ltcGxlIHJlZ2V4LWJhc2VkIHRva2VuaXplciBmb3IgQk5GIHByb2R1Y3Rpb24gcnVsZXMiIiIKKwogaW1wb3J0IHJlCitpbXBvcnQgaW5zcGVjdAoraW1wb3J0IHN5cworZnJvbSB0eXBpbmcgaW1wb3J0IFVuaW9uCiAKIGZyb20gY3Fsc2hsaWIuc2FmZXJzY2FubmVyIGltcG9ydCBTYWZlclNjYW5uZXIKIApAQCAtNTYsOCArNjEsOCBAQAogICAgICAgICByZXR1cm4gJyVzKCVyKScgJSAoc2VsZi5fX2NsYXNzX18sIHNlbGYudGV4dCkKIAogCi1kZWYgaXNfaGludCh4KToKLSAgICByZXR1cm4gaXNpbnN0YW5jZSh4LCBIaW50KQorZGVmIGlzX2hpbnQob2JqKToKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvYmosIEhpbnQpCiAKIAogY2xhc3MgUGFyc2VDb250ZXh0OgpAQCAtMTE1LDcgKzEyMCw3IEBACiAgICAgICAgICAgICAgICAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5tYXRjaGVkLCBzZWxmLnJlbWFpbmRlciwgc2VsZi5wcm9kdWN0aW9ubmFtZSwgc2VsZi5iaW5kaW5ncykKIAogCi1jbGFzcyBtYXRjaGVyOgorY2xhc3MgTWF0Y2hlcjoKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmcpOgogICAgICAgICBzZWxmLmFyZyA9IGFyZwpAQCAtMTU1LDM4ICsxNjAsMzggQEAKICAgICAgICAgcmV0dXJuICclcyglciknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLmFyZykKIAogCi1jbGFzcyBjaG9pY2UobWF0Y2hlcik6CitjbGFzcyBDaG9pY2UoTWF0Y2hlcik6CiAKICAgICBkZWYgbWF0Y2goc2VsZiwgY3R4dCwgY29tcGxldGlvbnMpOgogICAgICAgICBmb3VuZGN0eHRzID0gW10KLSAgICAgICAgZm9yIGEgaW4gc2VsZi5hcmc6Ci0gICAgICAgICAgICBzdWJjdHh0cyA9IGEubWF0Y2goY3R4dCwgY29tcGxldGlvbnMpCisgICAgICAgIGZvciBlYWNoIGluIHNlbGYuYXJnOgorICAgICAgICAgICAgc3ViY3R4dHMgPSBlYWNoLm1hdGNoKGN0eHQsIGNvbXBsZXRpb25zKQogICAgICAgICAgICAgZm91bmRjdHh0cy5leHRlbmQoc3ViY3R4dHMpCiAgICAgICAgIHJldHVybiBmb3VuZGN0eHRzCiAKIAotY2xhc3Mgb25lX29yX25vbmUobWF0Y2hlcik6CitjbGFzcyBPbmVPck5vbmUoTWF0Y2hlcik6CiAKICAgICBkZWYgbWF0Y2goc2VsZiwgY3R4dCwgY29tcGxldGlvbnMpOgogICAgICAgICByZXR1cm4gW2N0eHRdICsgbGlzdChzZWxmLmFyZy5tYXRjaChjdHh0LCBjb21wbGV0aW9ucykpCiAKIAotY2xhc3MgcmVwZWF0KG1hdGNoZXIpOgorY2xhc3MgUmVwZWF0KE1hdGNoZXIpOgogCiAgICAgZGVmIG1hdGNoKHNlbGYsIGN0eHQsIGNvbXBsZXRpb25zKToKICAgICAgICAgZm91bmQgPSBbY3R4dF0KICAgICAgICAgY3R4dHMgPSBbY3R4dF0KICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgIG5ld19jdHh0cyA9IFtdCi0gICAgICAgICAgICBmb3IgYyBpbiBjdHh0czoKLSAgICAgICAgICAgICAgICBuZXdfY3R4dHMuZXh0ZW5kKHNlbGYuYXJnLm1hdGNoKGMsIGNvbXBsZXRpb25zKSkKKyAgICAgICAgICAgIGZvciBlYWNoIGluIGN0eHRzOgorICAgICAgICAgICAgICAgIG5ld19jdHh0cy5leHRlbmQoc2VsZi5hcmcubWF0Y2goZWFjaCwgY29tcGxldGlvbnMpKQogICAgICAgICAgICAgaWYgbm90IG5ld19jdHh0czoKICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQKICAgICAgICAgICAgIGZvdW5kLmV4dGVuZChuZXdfY3R4dHMpCiAgICAgICAgICAgICBjdHh0cyA9IG5ld19jdHh0cwogCiAKLWNsYXNzIHJ1bGVfcmVmZXJlbmNlKG1hdGNoZXIpOgorY2xhc3MgUnVsZVJlZmVyZW5jZShNYXRjaGVyKToKIAogICAgIGRlZiBtYXRjaChzZWxmLCBjdHh0LCBjb21wbGV0aW9ucyk6CiAgICAgICAgIHByZXZuYW1lID0gY3R4dC5wcm9kdWN0aW9ubmFtZQpAQCAtMTk4LDI0ICsyMDMsMjQgQEAKICAgICAgICAgcmV0dXJuIFtjLndpdGhfcHJvZHVjdGlvbl9uYW1lZChwcmV2bmFtZSkgZm9yIGMgaW4gb3V0cHV0XQogCiAKLWNsYXNzIHJ1bGVfc2VyaWVzKG1hdGNoZXIpOgorY2xhc3MgUnVsZVNlcmllcyhNYXRjaGVyKToKIAogICAgIGRlZiBtYXRjaChzZWxmLCBjdHh0LCBjb21wbGV0aW9ucyk6CiAgICAgICAgIGN0eHRzID0gW2N0eHRdCiAgICAgICAgIGZvciBwYXRwaWVjZSBpbiBzZWxmLmFyZzoKICAgICAgICAgICAgIG5ld19jdHh0cyA9IFtdCi0gICAgICAgICAgICBmb3IgYyBpbiBjdHh0czoKLSAgICAgICAgICAgICAgICBuZXdfY3R4dHMuZXh0ZW5kKHBhdHBpZWNlLm1hdGNoKGMsIGNvbXBsZXRpb25zKSkKKyAgICAgICAgICAgIGZvciBlYWNoIGluIGN0eHRzOgorICAgICAgICAgICAgICAgIG5ld19jdHh0cy5leHRlbmQocGF0cGllY2UubWF0Y2goZWFjaCwgY29tcGxldGlvbnMpKQogICAgICAgICAgICAgaWYgbm90IG5ld19jdHh0czoKICAgICAgICAgICAgICAgICByZXR1cm4gKCkKICAgICAgICAgICAgIGN0eHRzID0gbmV3X2N0eHRzCiAgICAgICAgIHJldHVybiBjdHh0cwogCiAKLWNsYXNzIG5hbWVkX3N5bWJvbChtYXRjaGVyKToKK2NsYXNzIE5hbWVkU3ltYm9sKE1hdGNoZXIpOgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGFyZyk6Ci0gICAgICAgIG1hdGNoZXIuX19pbml0X18oc2VsZiwgYXJnKQorICAgICAgICBNYXRjaGVyLl9faW5pdF9fKHNlbGYsIGFyZykKICAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogCiAgICAgZGVmIG1hdGNoKHNlbGYsIGN0eHQsIGNvbXBsZXRpb25zKToKQEAgLTIyNCwxMyArMjI5LDE0IEBACiAgICAgICAgICAgICAjIGRvbid0IGNvbGxlY3Qgb3RoZXIgY29tcGxldGlvbnMgdW5kZXIgdGhpczsgdXNlIGEgZHVtbXkKICAgICAgICAgICAgIHBhc3NfaW5fY29tcGxzID0gc2V0KCkKICAgICAgICAgcmVzdWx0cyA9IHNlbGYuYXJnLm1hdGNoX3dpdGhfcmVzdWx0cyhjdHh0LCBwYXNzX2luX2NvbXBscykKLSAgICAgICAgcmV0dXJuIFtjLndpdGhfYmluZGluZyhzZWxmLm5hbWUsIGN0eHQuZXh0cmFjdF9vcmlnKG1hdGNodG9rcykpIGZvciAoYywgbWF0Y2h0b2tzKSBpbiByZXN1bHRzXQorICAgICAgICByZXR1cm4gW2Mud2l0aF9iaW5kaW5nKHNlbGYubmFtZSwgY3R4dC5leHRyYWN0X29yaWcobWF0Y2h0b2tzKSkKKyAgICAgICAgICAgICAgICBmb3IgKGMsIG1hdGNodG9rcykgaW4gcmVzdWx0c10KIAogICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICAgcmV0dXJuICclcyglciwgJXIpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5uYW1lLCBzZWxmLmFyZykKIAogCi1jbGFzcyBuYW1lZF9jb2xsZWN0b3IobmFtZWRfc3ltYm9sKToKK2NsYXNzIE5hbWVkQ29sbGVjdG9yKE5hbWVkU3ltYm9sKToKIAogICAgIGRlZiBtYXRjaChzZWxmLCBjdHh0LCBjb21wbGV0aW9ucyk6CiAgICAgICAgIHBhc3NfaW5fY29tcGxzID0gY29tcGxldGlvbnMKQEAgLTI0NCwxOCArMjUwLDIxIEBACiAgICAgICAgIHJldHVybiBvdXRwdXQKIAogCi1jbGFzcyB0ZXJtaW5hbF9tYXRjaGVyKG1hdGNoZXIpOgorY2xhc3MgVGVybWluYWxNYXRjaGVyKE1hdGNoZXIpOgorCisgICAgZGVmIG1hdGNoKHNlbGYsIGN0eHQsIGNvbXBsZXRpb25zKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogCiAgICAgZGVmIHBhdHRlcm4oc2VsZik6CiAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKIAogCi1jbGFzcyByZWdleF9ydWxlKHRlcm1pbmFsX21hdGNoZXIpOgorY2xhc3MgUmVnZXhSdWxlKFRlcm1pbmFsTWF0Y2hlcik6CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0KToKLSAgICAgICAgdGVybWluYWxfbWF0Y2hlci5fX2luaXRfXyhzZWxmLCBwYXQpCisgICAgICAgIFRlcm1pbmFsTWF0Y2hlci5fX2luaXRfXyhzZWxmLCBwYXQpCiAgICAgICAgIHNlbGYucmVnZXggPSBwYXQKLSAgICAgICAgc2VsZi5yZSA9IHJlLmNvbXBpbGUocGF0ICsgJyQnLCByZS5JIHwgcmUuUykKKyAgICAgICAgc2VsZi5yZSA9IHJlLmNvbXBpbGUocGF0ICsgJyQnLCByZS5JR05PUkVDQVNFIHwgcmUuRE9UQUxMKQogCiAgICAgZGVmIG1hdGNoKHNlbGYsIGN0eHQsIGNvbXBsZXRpb25zKToKICAgICAgICAgaWYgY3R4dC5yZW1haW5kZXI6CkBAIC0yNjksMTIgKzI3OCwxMiBAQAogICAgICAgICByZXR1cm4gc2VsZi5yZWdleAogCiAKLWNsYXNzIHRleHRfbWF0Y2godGVybWluYWxfbWF0Y2hlcik6CitjbGFzcyBUZXh0TWF0Y2goVGVybWluYWxNYXRjaGVyKToKICAgICBhbHBoYV9yZSA9IHJlLmNvbXBpbGUocidbYS16QS1aXScpCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgdGV4dCk6CiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHRlcm1pbmFsX21hdGNoZXIuX19pbml0X18oc2VsZiwgZXZhbCh0ZXh0KSkKKyAgICAgICAgICAgIFRlcm1pbmFsTWF0Y2hlci5fX2luaXRfXyhzZWxmLCBldmFsKHRleHQpKQogICAgICAgICBleGNlcHQgU3ludGF4RXJyb3I6CiAgICAgICAgICAgICBwcmludCgiYmFkIHN5bnRheCAlciIgJSAodGV4dCwpKQogCkBAIC0yODksMTIgKzI5OCwxMyBAQAogICAgIGRlZiBwYXR0ZXJuKHNlbGYpOgogICAgICAgICAjIGNhbid0IHVzZSAoP2kpIGhlcmUtIFNjYW5uZXIgY29tcG9uZW50IHJlZ2V4IGZsYWdzIHdvbid0IGJlIGFwcGxpZWQKICAgICAgICAgZGVmIGlnbm9yZWNhc2VpZnkobWF0Y2hvYmopOgotICAgICAgICAgICAgYyA9IG1hdGNob2JqLmdyb3VwKDApCi0gICAgICAgICAgICByZXR1cm4gJ1slcyVzXScgJSAoYy51cHBlcigpLCBjLmxvd2VyKCkpCisgICAgICAgICAgICB2YWwgPSBtYXRjaG9iai5ncm91cCgwKQorICAgICAgICAgICAgcmV0dXJuICdbJXMlc10nICUgKHZhbC51cHBlcigpLCB2YWwubG93ZXIoKSkKKwogICAgICAgICByZXR1cm4gc2VsZi5hbHBoYV9yZS5zdWIoaWdub3JlY2FzZWlmeSwgcmUuZXNjYXBlKHNlbGYuYXJnKSkKIAogCi1jbGFzcyBjYXNlX21hdGNoKHRleHRfbWF0Y2gpOgorY2xhc3MgQ2FzZU1hdGNoKFRleHRNYXRjaCk6CiAKICAgICBkZWYgbWF0Y2goc2VsZiwgY3R4dCwgY29tcGxldGlvbnMpOgogICAgICAgICBpZiBjdHh0LnJlbWFpbmRlcjoKQEAgLTMwOCwyMiArMzE4LDIyIEBACiAgICAgICAgIHJldHVybiByZS5lc2NhcGUoc2VsZi5hcmcpCiAKIAotY2xhc3Mgd29yZF9tYXRjaCh0ZXh0X21hdGNoKToKK2NsYXNzIFdvcmRNYXRjaChUZXh0TWF0Y2gpOgogCiAgICAgZGVmIHBhdHRlcm4oc2VsZik6Ci0gICAgICAgIHJldHVybiByJ1xiJyArIHRleHRfbWF0Y2gucGF0dGVybihzZWxmKSArIHInXGInCisgICAgICAgIHJldHVybiByJ1xiJyArIFRleHRNYXRjaC5wYXR0ZXJuKHNlbGYpICsgcidcYicKIAogCi1jbGFzcyBjYXNlX3dvcmRfbWF0Y2goY2FzZV9tYXRjaCk6CitjbGFzcyBDYXNlV29yZE1hdGNoKENhc2VNYXRjaCk6CiAKICAgICBkZWYgcGF0dGVybihzZWxmKToKLSAgICAgICAgcmV0dXJuIHInXGInICsgY2FzZV9tYXRjaC5wYXR0ZXJuKHNlbGYpICsgcidcYicKKyAgICAgICAgcmV0dXJuIHInXGInICsgQ2FzZU1hdGNoLnBhdHRlcm4oc2VsZikgKyByJ1xiJwogCiAKLWNsYXNzIHRlcm1pbmFsX3R5cGVfbWF0Y2hlcihtYXRjaGVyKToKK2NsYXNzIFRlcm1pbmFsVHlwZU1hdGNoZXIoTWF0Y2hlcik6CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgdG9rZW50eXBlLCBzdWJtYXRjaGVyKToKLSAgICAgICAgbWF0Y2hlci5fX2luaXRfXyhzZWxmLCB0b2tlbnR5cGUpCisgICAgICAgIE1hdGNoZXIuX19pbml0X18oc2VsZiwgdG9rZW50eXBlKQogICAgICAgICBzZWxmLnRva2VudHlwZSA9IHRva2VudHlwZQogICAgICAgICBzZWxmLnN1Ym1hdGNoZXIgPSBzdWJtYXRjaGVyCiAKQEAgLTM0MCwxOCArMzUwLDI0IEBACiAKIAogY2xhc3MgUGFyc2luZ1J1bGVTZXQ6CisgICAgIiIiRGVmaW5lIHRoZSBCTkYgdG9rZW5pemF0aW9uIHJ1bGVzIGZvciBjcWwzaGFuZGxpbmcuc3ludGF4X3J1bGVzLiBCYWNrdXMtTmF1ciBGb3JtIGNvbnNpc3RzIG9mCisgICAgICAgLSBQcm9kdWN0aW9uIHJ1bGVzIGluIHRoZSBmb3JtOiBMZWZ0LUhhbmQtU2lkZSA6Oj0gUmlnaHQtSGFuZC1TaWRlLiAgVGhlIExIUyBpcyBhIG5vbi10ZXJtaW5hbC4KKyAgICAgICAtIFByb2R1Y3Rpb25zIG9yIG5vbi10ZXJtaW5hbCBzeW1ib2xzCisgICAgICAgLSBUZXJtaW5hbCBzeW1ib2xzLiAgRXZlcnkgdGVybWluYWwgaXMgYSBzaW5nbGUgdG9rZW4uCisgICAgIiIiCisKICAgICBSdWxlU3BlY1NjYW5uZXIgPSBTYWZlclNjYW5uZXIoWwotICAgICAgICAocic6Oj0nLCBsYW1iZGEgcywgdDogdCksCisgICAgICAgIChyJzo6PScsIGxhbWJkYSBzLCB0OiB0KSwgICAgICAgICAgICAgICAgICAgIyBCTkYgcnVsZSBkZWZpbml0aW9uCiAgICAgICAgIChyJ1xbW2EtejAtOV9dK1xdPScsIGxhbWJkYSBzLCB0OiAoJ25hbWVkX2NvbGxlY3RvcicsIHRbMTotMl0pKSwKICAgICAgICAgKHInW2EtejAtOV9dKz0nLCBsYW1iZGEgcywgdDogKCduYW1lZF9zeW1ib2wnLCB0WzotMV0pKSwKICAgICAgICAgKHInLyhcW1xePy5bXl1dKlxdfFteL118XFwuKSovJywgbGFtYmRhIHMsIHQ6ICgncmVnZXgnLCB0WzE6LTFdLnJlcGxhY2UocidcLycsICcvJykpKSwKLSAgICAgICAgKHInIihbXiJdfFxcLikqIicsIGxhbWJkYSBzLCB0OiAoJ2xpdHN0cmluZycsIHQpKSwKKyAgICAgICAgKHInIihbXiJdfFxcLikqIicsIGxhbWJkYSBzLCB0OiAoJ3N0cmluZ19saXRlcmFsJywgdCkpLAogICAgICAgICAocic8W14+XSo+JywgbGFtYmRhIHMsIHQ6ICgncmVmZXJlbmNlJywgdFsxOi0xXSkpLAogICAgICAgICAocidcYkpVTktcYicsIGxhbWJkYSBzLCB0OiAoJ2p1bmsnLCB0KSksCiAgICAgICAgIChyJ1tAKCl8Pyo7XScsIGxhbWJkYSBzLCB0OiB0KSwKLSAgICAgICAgKHInXHMrJywgTm9uZSksCisgICAgICAgIChyJ1xzKycsIE5vbmUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3aGl0ZXNwYWNlCiAgICAgICAgIChyJyNbXlxuXSonLCBOb25lKSwKLSAgICBdLCByZS5JIHwgcmUuUyB8IHJlLlUpCisgICAgXSwgcmUuSUdOT1JFQ0FTRSB8IHJlLkRPVEFMTCB8IHJlLlVOSUNPREUpCiAKICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIHNlbGYucnVsZXNldCA9IHt9CkBAIC0zNjgsNyArMzg0LDcgQEAKICAgICBkZWYgcGFyc2VfcnVsZXMoY2xzLCBydWxlc3RyKToKICAgICAgICAgdG9rZW5zLCB1bm1hdGNoZWQgPSBjbHMuUnVsZVNwZWNTY2FubmVyLnNjYW4ocnVsZXN0cikKICAgICAgICAgaWYgdW5tYXRjaGVkOgotICAgICAgICAgICAgcmFpc2UgTGV4aW5nRXJyb3IuZnJvbV90ZXh0KHJ1bGVzdHIsIHVubWF0Y2hlZCwgbXNnPSJTeW50YXggcnVsZXMgdW5wYXJzZWFibGUiKQorICAgICAgICAgICAgcmFpc2UgTGV4aW5nRXJyb3IuZnJvbV90ZXh0KHJ1bGVzdHIsIHVubWF0Y2hlZCwgbXNnPSJTeW50YXggcnVsZXMgYXJlIHVucGFyc2VhYmxlIikKICAgICAgICAgcnVsZXMgPSB7fQogICAgICAgICB0ZXJtaW5hbHMgPSBbXQogICAgICAgICB0b2tlbml0ZXIgPSBpdGVyKHRva2VucykKQEAgLTM3OSw5ICszOTUsOSBAQAogICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmV4cGVjdGVkIHRva2VuICVyOyBleHBlY3RlZCAiOjo9IicgJSAoYXNzaWduLCkpCiAgICAgICAgICAgICAgICAgbmFtZSA9IHRbMV0KICAgICAgICAgICAgICAgICBwcm9kdWN0aW9uID0gY2xzLnJlYWRfcnVsZV90b2tlbnNfdW50aWwoJzsnLCB0b2tlbml0ZXIpCi0gICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwcm9kdWN0aW9uLCB0ZXJtaW5hbF9tYXRjaGVyKToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHByb2R1Y3Rpb24sIFRlcm1pbmFsTWF0Y2hlcik6CiAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFscy5hcHBlbmQoKG5hbWUsIHByb2R1Y3Rpb24pKQotICAgICAgICAgICAgICAgICAgICBwcm9kdWN0aW9uID0gdGVybWluYWxfdHlwZV9tYXRjaGVyKG5hbWUsIHByb2R1Y3Rpb24pCisgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rpb24gPSBUZXJtaW5hbFR5cGVNYXRjaGVyKG5hbWUsIHByb2R1Y3Rpb24pCiAgICAgICAgICAgICAgICAgcnVsZXNbbmFtZV0gPSBwcm9kdWN0aW9uCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuZXhwZWN0ZWQgdG9rZW4gJXI7IGV4cGVjdGVkIG5hbWUnICUgKHQsKSkKQEAgLTM5MiwxMSArNDA4LDExIEBACiAgICAgICAgIGlmIGlzaW5zdGFuY2UocGllY2VzLCAodHVwbGUsIGxpc3QpKToKICAgICAgICAgICAgIGlmIGxlbihwaWVjZXMpID09IDE6CiAgICAgICAgICAgICAgICAgcmV0dXJuIHBpZWNlc1swXQotICAgICAgICAgICAgcmV0dXJuIHJ1bGVfc2VyaWVzKHBpZWNlcykKKyAgICAgICAgICAgIHJldHVybiBSdWxlU2VyaWVzKHBpZWNlcykKICAgICAgICAgcmV0dXJuIHBpZWNlcwogCiAgICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIHJlYWRfcnVsZV90b2tlbnNfdW50aWwoY2xzLCBlbmR0b2tzLCB0b2tlbml0ZXIpOgorICAgIGRlZiByZWFkX3J1bGVfdG9rZW5zX3VudGlsKGNscywgZW5kdG9rczogVW5pb25bc3RyLCBpbnRdLCB0b2tlbml0ZXIpOgogICAgICAgICBpZiBpc2luc3RhbmNlKGVuZHRva3MsIHN0cik6CiAgICAgICAgICAgICBlbmR0b2tzID0gKGVuZHRva3MsKQogICAgICAgICBjb3VudHRhcmdldCA9IE5vbmUKQEAgLTQxMSwzMiArNDI3LDMyIEBACiAgICAgICAgICAgICBpZiB0IGluIGVuZHRva3M6CiAgICAgICAgICAgICAgICAgaWYgbGVuKG15YnJhbmNoZXMpID09IDE6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbHMubWtydWxlKG15YnJhbmNoZXNbMF0pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNob2ljZShsaXN0KG1hcChjbHMubWtydWxlLCBteWJyYW5jaGVzKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIENob2ljZShsaXN0KG1hcChjbHMubWtydWxlLCBteWJyYW5jaGVzKSkpCiAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHQsIHR1cGxlKToKICAgICAgICAgICAgICAgICBpZiB0WzBdID09ICdyZWZlcmVuY2UnOgotICAgICAgICAgICAgICAgICAgICB0ID0gcnVsZV9yZWZlcmVuY2UodFsxXSkKLSAgICAgICAgICAgICAgICBlbGlmIHRbMF0gPT0gJ2xpdHN0cmluZyc6CisgICAgICAgICAgICAgICAgICAgIHQgPSBSdWxlUmVmZXJlbmNlKHRbMV0pCisgICAgICAgICAgICAgICAgZWxpZiB0WzBdID09ICdzdHJpbmdfbGl0ZXJhbCc6CiAgICAgICAgICAgICAgICAgICAgIGlmIHRbMV1bMV0uaXNhbG51bSgpIG9yIHRbMV1bMV0gPT0gJ18nOgotICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHdvcmRfbWF0Y2godFsxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBXb3JkTWF0Y2godFsxXSkKICAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0ZXh0X21hdGNoKHRbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICB0ID0gVGV4dE1hdGNoKHRbMV0pCiAgICAgICAgICAgICAgICAgZWxpZiB0WzBdID09ICdyZWdleCc6Ci0gICAgICAgICAgICAgICAgICAgIHQgPSByZWdleF9ydWxlKHRbMV0pCisgICAgICAgICAgICAgICAgICAgIHQgPSBSZWdleFJ1bGUodFsxXSkKICAgICAgICAgICAgICAgICBlbGlmIHRbMF0gPT0gJ25hbWVkX2NvbGxlY3Rvcic6Ci0gICAgICAgICAgICAgICAgICAgIHQgPSBuYW1lZF9jb2xsZWN0b3IodFsxXSwgY2xzLnJlYWRfcnVsZV90b2tlbnNfdW50aWwoMSwgdG9rZW5pdGVyKSkKKyAgICAgICAgICAgICAgICAgICAgdCA9IE5hbWVkQ29sbGVjdG9yKHRbMV0sIGNscy5yZWFkX3J1bGVfdG9rZW5zX3VudGlsKDEsIHRva2VuaXRlcikpCiAgICAgICAgICAgICAgICAgZWxpZiB0WzBdID09ICduYW1lZF9zeW1ib2wnOgotICAgICAgICAgICAgICAgICAgICB0ID0gbmFtZWRfc3ltYm9sKHRbMV0sIGNscy5yZWFkX3J1bGVfdG9rZW5zX3VudGlsKDEsIHRva2VuaXRlcikpCisgICAgICAgICAgICAgICAgICAgIHQgPSBOYW1lZFN5bWJvbCh0WzFdLCBjbHMucmVhZF9ydWxlX3Rva2Vuc191bnRpbCgxLCB0b2tlbml0ZXIpKQogICAgICAgICAgICAgZWxpZiB0ID09ICcoJzoKICAgICAgICAgICAgICAgICB0ID0gY2xzLnJlYWRfcnVsZV90b2tlbnNfdW50aWwoJyknLCB0b2tlbml0ZXIpCiAgICAgICAgICAgICBlbGlmIHQgPT0gJz8nOgotICAgICAgICAgICAgICAgIHQgPSBvbmVfb3Jfbm9uZShteXJ1bGVzLnBvcCgtMSkpCisgICAgICAgICAgICAgICAgdCA9IE9uZU9yTm9uZShteXJ1bGVzLnBvcCgtMSkpCiAgICAgICAgICAgICBlbGlmIHQgPT0gJyonOgotICAgICAgICAgICAgICAgIHQgPSByZXBlYXQobXlydWxlcy5wb3AoLTEpKQorICAgICAgICAgICAgICAgIHQgPSBSZXBlYXQobXlydWxlcy5wb3AoLTEpKQogICAgICAgICAgICAgZWxpZiB0ID09ICdAJzoKLSAgICAgICAgICAgICAgICB4ID0gbmV4dCh0b2tlbml0ZXIpCi0gICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoeCwgdHVwbGUpIG9yIHhbMF0gIT0gJ2xpdHN0cmluZyc6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlVuZXhwZWN0ZWQgdG9rZW4gJXIgZm9sbG93aW5nICdAJyIgJSAoeCwpKQotICAgICAgICAgICAgICAgIHQgPSBjYXNlX21hdGNoKHhbMV0pCisgICAgICAgICAgICAgICAgdmFsID0gbmV4dCh0b2tlbml0ZXIpCisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsLCB0dXBsZSkgb3IgdmFsWzBdICE9ICdzdHJpbmdfbGl0ZXJhbCc6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlVuZXhwZWN0ZWQgdG9rZW4gJXIgZm9sbG93aW5nICdAJyIgJSAodmFsLCkpCisgICAgICAgICAgICAgICAgdCA9IENhc2VNYXRjaCh2YWxbMV0pCiAgICAgICAgICAgICBlbGlmIHQgPT0gJ3wnOgogICAgICAgICAgICAgICAgIG15cnVsZXMgPSBbXQogICAgICAgICAgICAgICAgIG15YnJhbmNoZXMuYXBwZW5kKG15cnVsZXMpCkBAIC00NDcsNyArNDYzLDcgQEAKICAgICAgICAgICAgIGlmIGNvdW50c29mYXIgPT0gY291bnR0YXJnZXQ6CiAgICAgICAgICAgICAgICAgaWYgbGVuKG15YnJhbmNoZXMpID09IDE6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbHMubWtydWxlKG15YnJhbmNoZXNbMF0pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNob2ljZShsaXN0KG1hcChjbHMubWtydWxlLCBteWJyYW5jaGVzKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIENob2ljZShsaXN0KG1hcChjbHMubWtydWxlLCBteWJyYW5jaGVzKSkpCiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuZXhwZWN0ZWQgZW5kIG9mIHJ1bGUgdG9rZW5zJykKIAogICAgIGRlZiBhcHBlbmRfcnVsZXMoc2VsZiwgcnVsZXN0cik6CkBAIC00NjUsOCArNDgxLDkgQEAKICAgICAgICAgICAgIGlmIG5hbWUgPT0gJ0pVTksnOgogICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgICByZXR1cm4gbGFtYmRhIHMsIHQ6IChuYW1lLCB0LCBzLm1hdGNoLnNwYW4oKSkKKwogICAgICAgICByZWdleGVzID0gWyhwLnBhdHRlcm4oKSwgbWFrZV9oYW5kbGVyKG5hbWUpKSBmb3IgKG5hbWUsIHApIGluIHNlbGYudGVybWluYWxzXQotICAgICAgICByZXR1cm4gU2FmZXJTY2FubmVyKHJlZ2V4ZXMsIHJlLkkgfCByZS5TIHwgcmUuVSkuc2NhbgorICAgICAgICByZXR1cm4gU2FmZXJTY2FubmVyKHJlZ2V4ZXMsIHJlLklHTk9SRUNBU0UgfCByZS5ET1RBTEwgfCByZS5VTklDT0RFKS5zY2FuCiAKICAgICBkZWYgbGV4KHNlbGYsIHRleHQpOgogICAgICAgICBpZiBzZWxmLnNjYW5uZXIgaXMgTm9uZToKQEAgLTQ4Nyw5ICs1MDQsOSBAQAogICAgICAgICBiaW5kaW5ncyA9IHt9CiAgICAgICAgIGlmIHNyY3N0ciBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGJpbmRpbmdzWycqU1JDKiddID0gc3Jjc3RyCi0gICAgICAgIGZvciBjIGluIHNlbGYucGFyc2Uoc3RhcnRzeW1ib2wsIHRva2VucywgaW5pdF9iaW5kaW5ncz1iaW5kaW5ncyk6Ci0gICAgICAgICAgICBpZiBub3QgYy5yZW1haW5kZXI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGMKKyAgICAgICAgZm9yIHZhbCBpbiBzZWxmLnBhcnNlKHN0YXJ0c3ltYm9sLCB0b2tlbnMsIGluaXRfYmluZGluZ3M9YmluZGluZ3MpOgorICAgICAgICAgICAgaWYgbm90IHZhbC5yZW1haW5kZXI6CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAogCiAgICAgZGVmIGxleF9hbmRfcGFyc2Uoc2VsZiwgdGV4dCwgc3RhcnRzeW1ib2w9J1N0YXJ0Jyk6CiAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlKHN0YXJ0c3ltYm9sLCBzZWxmLmxleCh0ZXh0KSwgaW5pdF9iaW5kaW5ncz17JypTUkMqJzogdGV4dH0pCkBAIC01MTEsOSArNTI4LDYgQEAKICAgICAgICAgcmV0dXJuIGNvbXBsZXRpb25zCiAKIAotaW1wb3J0IHN5cwotCi0KIGNsYXNzIERlYnVnb3Ryb24oc2V0KToKICAgICBkZXB0aCA9IDEwCiAKQEAgLTUyNSw5ICs1MzksOSBAQAogICAgICAgICBzZWxmLl9ub3RlX2FkZGl0aW9uKGl0ZW0pCiAgICAgICAgIHNldC5hZGQoc2VsZiwgaXRlbSkKIAotICAgIGRlZiBfbm90ZV9hZGRpdGlvbihzZWxmLCBmb28pOgotICAgICAgICBzZWxmLnN0cmVhbS53cml0ZSgiXG5pdGVtICVyIGFkZGVkIGJ5OlxuIiAlIChmb28sKSkKLSAgICAgICAgZnJhbWUgPSBzeXMuX2dldGZyYW1lKCkuZl9iYWNrLmZfYmFjaworICAgIGRlZiBfbm90ZV9hZGRpdGlvbihzZWxmLCBpdGVtKToKKyAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoIlxuaXRlbSAlciBhZGRlZCBieTpcbiIgJSAoaXRlbSwpKQorICAgICAgICBmcmFtZSA9IGluc3BlY3QuY3VycmVudGZyYW1lKCkuZl9iYWNrLmZfYmFjawogICAgICAgICBmb3IgaSBpbiByYW5nZShzZWxmLmRlcHRoKToKICAgICAgICAgICAgIG5hbWUgPSBmcmFtZS5mX2NvZGUuY29fbmFtZQogICAgICAgICAgICAgZmlsZW5hbWUgPSBmcmFtZS5mX2NvZGUuY29fZmlsZW5hbWUKZGlmZiAtLWdpdCBhL3B5bGliL2NxbHNobGliL3Rlc3QvdGVzdF9jcWxzaF9jb21wbGV0aW9uLnB5IGIvcHlsaWIvY3Fsc2hsaWIvdGVzdC90ZXN0X2NxbHNoX2NvbXBsZXRpb24ucHkKaW5kZXggYWY5ZDA1ZS4uYjBmMGI4NyAxMDA2NDQKLS0tIGEvcHlsaWIvY3Fsc2hsaWIvdGVzdC90ZXN0X2NxbHNoX2NvbXBsZXRpb24ucHkKKysrIGIvcHlsaWIvY3Fsc2hsaWIvdGVzdC90ZXN0X2NxbHNoX2NvbXBsZXRpb24ucHkKQEAgLTEyOCw3ICsxMjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXRfY29tcGxldGVkX2xpbmVzPXNwbGl0X2NvbXBsZXRlZF9saW5lcykKIAogICAgICAgICBpZiBpbW1lZGlhdGU6Ci0gICAgICAgICAgICBtc2cgPSAnY3Fsc2ggY29tcGxldGVkICVyLCBidXQgd2UgZXhwZWN0ZWQgJXInICUgKGNvbXBsZXRlZCwgaW1tZWRpYXRlKQorICAgICAgICAgICAgbXNnID0gJ2NxbHNoIGNvbXBsZXRlZCAlciAoJWQpLCBidXQgd2UgZXhwZWN0ZWQgJXIgKCVkKScgJSAoY29tcGxldGVkLCBsZW4oY29tcGxldGVkKSwgaW1tZWRpYXRlLCBsZW4oaW1tZWRpYXRlKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVkLCBpbW1lZGlhdGUsIG1zZz1tc2cpCiAgICAgICAgICAgICByZXR1cm4KIApAQCAtMTY0LDcgKzE2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDT1BZJywgJ0NSRUFURScsICdERUJVRycsICdERUxFVEUnLCAnREVTQycsICdERVNDUklCRScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEUk9QJywgJ0dSQU5UJywgJ0hFTFAnLCAnSU5TRVJUJywgJ0xJU1QnLCAnTE9HSU4nLCAnUEFHSU5HJywgJ1JFVk9LRScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTRUxFQ1QnLCAnU0hPVycsICdTT1VSQ0UnLCAnVFJBQ0lORycsICdFWFBBTkQnLCAnU0VSSUFMJywgJ1RSVU5DQVRFJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VQREFURScsICdVU0UnLCAnZXhpdCcsICdxdWl0JywgJ0NMRUFSJywgJ0NMUycpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVVBEQVRFJywgJ1VTRScsICdleGl0JywgJ3F1aXQnLCAnQ0xFQVInLCAnQ0xTJywgJ2hpc3RvcnknKSkKIAogICAgIGRlZiB0ZXN0X2NvbXBsZXRlX2NvbW1hbmRfd29yZHMoc2VsZik6CiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ2FsdCcsICdcYlxiXGJBTFRFUiAnKQpAQCAtMjUwLDcgKzI1MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAnQ1JFQVRFJywgJ0RFQlVHJywgJ0RFTEVURScsICdERVNDJywgJ0RFU0NSSUJFJywgJ0RST1AnLAogICAgICAgICAgICAgICAgICAgICAgJ0VYUEFORCcsICdHUkFOVCcsICdIRUxQJywgJ0lOU0VSVCcsICdMSVNUJywgJ0xPR0lOJywgJ1BBR0lORycsCiAgICAgICAgICAgICAgICAgICAgICAnUkVWT0tFJywgJ1NFTEVDVCcsICdTSE9XJywgJ1NPVVJDRScsICdTRVJJQUwnLCAnVFJBQ0lORycsCi0gICAgICAgICAgICAgICAgICAgICAnVFJVTkNBVEUnLCAnVVBEQVRFJywgJ1VTRScsICdleGl0JywgJ3F1aXQnLAorICAgICAgICAgICAgICAgICAgICAgJ1RSVU5DQVRFJywgJ1VQREFURScsICdVU0UnLCAnZXhpdCcsICdoaXN0b3J5JywgJ3F1aXQnLAogICAgICAgICAgICAgICAgICAgICAgJ0NMRUFSJywgJ0NMUyddKQogCiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoCkBAIC00ODksOCArNDg5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiID0gJ2VnZ3MnIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1bJ0FORCcsICdJRicsICc7J10pCiAKLSAgICBkZWYgdGVzdF9jb21wbGV0ZV9pbl9iYXRjaChzZWxmKToKLSAgICAgICAgcGFzcworICAgIGRlZiB0ZXN0X2NvbXBsZXRlX2luX2JlZ2luX2JhdGNoKHNlbGYpOgorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdCRUdJTiAnLCBjaG9pY2VzPVsnQkFUQ0gnLCAnQ09VTlRFUicsICdVTkxPR0dFRCddKQorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdCRUdJTiBCQVRDSCAnLCBjaG9pY2VzPVsnREVMRVRFJywgJ0lOU0VSVCcsICdVUERBVEUnLCAnVVNJTkcnXSkKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnQkVHSU4gQkFUQ0ggSU5TRVJUICcsIGltbWVkaWF0ZT0nSU5UTyAnICkKIAogICAgIGRlZiB0ZXN0X2NvbXBsZXRlX2luX2NyZWF0ZV9rZXlzcGFjZShzZWxmKToKICAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnY3JlYXRlIGtleXNwYWNlICcsICcnLCBjaG9pY2VzPSgnPGlkZW50aWZpZXI+JywgJzxxdW90ZWROYW1lPicsICdJRicpKQpAQCAtNTY2LDYgKzU2OCwyMyBAQAogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdEUk9QIEtFWVNQQUNFIEknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbWVkaWF0ZT0nRiBFWElTVFMgJyArIHNlbGYuY3Fsc2gua2V5c3BhY2UgKyAnIDsnKQogCisgICAgZGVmIHRlc3RfY29tcGxldGVfaW5fY3JlYXRlX3R5cGUoc2VsZik6CisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0NSRUFURSBUWVBFIGZvbyAnLCBjaG9pY2VzPVsnKCcsICcuJ10pCisKKyAgICBkZWYgdGVzdF9jb21wbGV0ZV9pbl9kcm9wX3R5cGUoc2VsZik6CisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0RST1AgVFlQRSAnLCBjaG9pY2VzPVsnSUYnLCAnc3lzdGVtX3ZpZXdzLicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RhZ3MnLCAnc3lzdGVtX3RyYWNlcy4nLCAnc3lzdGVtX2Rpc3RyaWJ1dGVkLicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Bob25lX251bWJlcicsICdxdW90ZV91ZHQnLCAnYmFuZF9pbmZvX3R5cGUnLCAnYWRkcmVzcycsICdzeXN0ZW0uJywgJ3N5c3RlbV9zY2hlbWEuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzdGVtX2F1dGguJywgJ3N5c3RlbV92aXJ0dWFsX3NjaGVtYS4nLCBzZWxmLmNxbHNoLmtleXNwYWNlICsgJy4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2NvbXBsZXRlX2luX2NyZWF0ZV90cmlnZ2VyKHNlbGYpOgorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdDUkVBVEUgVFJJR0dFUiAnLCBjaG9pY2VzPVsnPGlkZW50aWZpZXI+JywgJzxxdW90ZWROYW1lPicsICdJRicgXSkKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnQ1JFQVRFIFRSSUdHRVIgZm9vICcsIGltbWVkaWF0ZT0nT04gJyApCisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0NSRUFURSBUUklHR0VSIGZvbyBPTiAnLCBjaG9pY2VzPVsnc3lzdGVtLicsICdzeXN0ZW1fYXV0aC4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXN0ZW1fZGlzdHJpYnV0ZWQuJywgJ3N5c3RlbV9zY2hlbWEuJywgJ3N5c3RlbV90cmFjZXMuJywgJ3N5c3RlbV92aWV3cy4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXN0ZW1fdmlydHVhbF9zY2hlbWEuJyBdLCBvdGhlcl9jaG9pY2VzX29rPVRydWUpCisKICAgICBkZWYgY3JlYXRlX2NvbHVtbmZhbWlseV90YWJsZV90ZW1wbGF0ZShzZWxmLCBuYW1lKToKICAgICAgICAgIiIiUGFyYW1ldGVyaXplZCB0ZXN0IGZvciBDUkVBVEUgQ09MVU1ORkFNSUxZIGFuZCBDUkVBVEUgVEFCTEUuIFNpbmNlCiAgICAgICAgIHRoZXkncmUgc3lub255bXMsIHRoZXkgc2hvdWxkIGhhdmUgdGhlIHNhbWUgY29tcGxldGlvbiBiZWhhdmlvciwgc28gdGhpcwpAQCAtNjAxLDcgKzYyMCwxMiBAQAogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKHByZWZpeCArICcgbmV3X3RhYmxlIChjb2xfYSBpbmUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbWVkaWF0ZT0ndCAnKQogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKHByZWZpeCArICcgbmV3X3RhYmxlIChjb2xfYSBpbnQgJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsnLCcsICdQUklNQVJZJ10pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1bJywnLCAnTUFTS0VEJywgJ1BSSU1BUlknXSkKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucyhwcmVmaXggKyAnIG5ld190YWJsZSAoY29sX2EgaW50IE0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbWVkaWF0ZT0nQVNLRUQgV0lUSCAnKQorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKHByZWZpeCArICcgbmV3X3RhYmxlIChjb2xfYSBpbnQgTUFTS0VEIFdJVEggJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsnREVGQVVMVCcsIHNlbGYuY3Fsc2gua2V5c3BhY2UgKyAnLicsICdzeXN0ZW0uJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfY2hvaWNlc19vaz1UcnVlKQogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKHByZWZpeCArICcgbmV3X3RhYmxlIChjb2xfYSBpbnQgUCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tZWRpYXRlPSdSSU1BUlkgS0VZICcpCiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMocHJlZml4ICsgJyBuZXdfdGFibGUgKGNvbF9hIGludCBQUklNQVJZIEtFWSAnLApAQCAtNjE2LDE5ICs2NDAsMjUgQEAKICAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucyhwcmVmaXggKyAnIG5ld190YWJsZSAoY29sX2EgaW50IFBSSU1BUlkgS0VZKSBXJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW1lZGlhdGU9J0lUSCAnKQogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKHByZWZpeCArICcgbmV3X3RhYmxlIChjb2xfYSBpbnQgUFJJTUFSWSBLRVkpIFdJVEggJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsnYmxvb21fZmlsdGVyX2ZwX2NoYW5jZScsICdjb21wYWN0aW9uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsnYWxsb3dfYXV0b19zbmFwc2hvdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Jsb29tX2ZpbHRlcl9mcF9jaGFuY2UnLCAnY29tcGFjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbXByZXNzaW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdF90aW1lX3RvX2xpdmUnLCAnZ2NfZ3JhY2Vfc2Vjb25kcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luY3JlbWVudGFsX2JhY2t1cHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXhfaW5kZXhfaW50ZXJ2YWwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZW10YWJsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lbXRhYmxlX2ZsdXNoX3BlcmlvZF9pbl9tcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NMVVNURVJJTkcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDT01QQUNUJywgJ2NhY2hpbmcnLCAnY29tbWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21pbl9pbmRleF9pbnRlcnZhbCcsICdzcGVjdWxhdGl2ZV9yZXRyeScsICdhZGRpdGlvbmFsX3dyaXRlX3BvbGljeScsICdjZGMnLCAncmVhZF9yZXBhaXInXSkKICAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucyhwcmVmaXggKyAnIG5ld190YWJsZSAoY29sX2EgaW50IFBSSU1BUlkgS0VZKSBXSVRIICcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1bJ2Jsb29tX2ZpbHRlcl9mcF9jaGFuY2UnLCAnY29tcGFjdGlvbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1bJ2FsbG93X2F1dG9fc25hcHNob3QnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdibG9vbV9maWx0ZXJfZnBfY2hhbmNlJywgJ2NvbXBhY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb21wcmVzc2lvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRfdGltZV90b19saXZlJywgJ2djX2dyYWNlX3NlY29uZHMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNyZW1lbnRhbF9iYWNrdXBzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWF4X2luZGV4X2ludGVydmFsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVtdGFibGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZW10YWJsZV9mbHVzaF9wZXJpb2RfaW5fbXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDTFVTVEVSSU5HJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ09NUEFDVCcsICdjYWNoaW5nJywgJ2NvbW1lbnQnLApAQCAtNjQ0LDcgKzY3NCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAieydjbGFzcyc6ICciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9WydTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0RhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3knLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5J10pCiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMocHJlZml4ICsgIiBuZXdfdGFibGUgKGNvbF9hIGludCBQUklNQVJZIEtFWSkgV0lUSCBjb21wYWN0aW9uID0gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInsnY2xhc3MnOiAnUyIsCkBAIC02NzMsMjMgKzcwMiwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9Wyc7JywgJ0FORCddKQogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKHByZWZpeCArICIgbmV3X3RhYmxlIChjb2xfYSBpbnQgUFJJTUFSWSBLRVkpIFdJVEggY29tcGFjdGlvbiA9ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ7J2NsYXNzJzogJ1NpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3knfSBBTkQgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsnYmxvb21fZmlsdGVyX2ZwX2NoYW5jZScsICdjb21wYWN0aW9uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsnYWxsb3dfYXV0b19zbmFwc2hvdCcsICdibG9vbV9maWx0ZXJfZnBfY2hhbmNlJywgJ2NvbXBhY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb21wcmVzc2lvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRfdGltZV90b19saXZlJywgJ2djX2dyYWNlX3NlY29uZHMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNyZW1lbnRhbF9iYWNrdXBzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWF4X2luZGV4X2ludGVydmFsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVtdGFibGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZW10YWJsZV9mbHVzaF9wZXJpb2RfaW5fbXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDTFVTVEVSSU5HJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ09NUEFDVCcsICdjYWNoaW5nJywgJ2NvbW1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtaW5faW5kZXhfaW50ZXJ2YWwnLCAnc3BlY3VsYXRpdmVfcmV0cnknLCAnYWRkaXRpb25hbF93cml0ZV9wb2xpY3knLCAnY2RjJywgJ3JlYWRfcmVwYWlyJ10pCiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMocHJlZml4ICsgIiBuZXdfdGFibGUgKGNvbF9hIGludCBQUklNQVJZIEtFWSkgV0lUSCBjb21wYWN0aW9uID0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInsnY2xhc3MnOiAnRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneScsICciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9WydiYXNlX3RpbWVfc2Vjb25kcycsICdtYXhfc3N0YWJsZV9hZ2VfZGF5cycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RpbWVzdGFtcF9yZXNvbHV0aW9uJywgJ21pbl90aHJlc2hvbGQnLCAnY2xhc3MnLCAnbWF4X3RocmVzaG9sZCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RvbWJzdG9uZV9jb21wYWN0aW9uX2ludGVydmFsJywgJ3RvbWJzdG9uZV90aHJlc2hvbGQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbmFibGVkJywgJ3VuY2hlY2tlZF90b21ic3RvbmVfY29tcGFjdGlvbicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21heF93aW5kb3dfc2l6ZV9zZWNvbmRzJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb25seV9wdXJnZV9yZXBhaXJlZF90b21ic3RvbmVzJywgJ3Byb3ZpZGVfb3ZlcmxhcHBpbmdfdG9tYnN0b25lcyddKQotICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKHByZWZpeCArICIgbmV3X3RhYmxlIChjb2xfYSBpbnQgUFJJTUFSWSBLRVkpIFdJVEggY29tcGFjdGlvbiA9ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ7J2NsYXNzJzogJ1RpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3knLCAnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsnY29tcGFjdGlvbl93aW5kb3dfdW5pdCcsICdjb21wYWN0aW9uX3dpbmRvd19zaXplJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGltZXN0YW1wX3Jlc29sdXRpb24nLCAnbWluX3RocmVzaG9sZCcsICdjbGFzcycsICdtYXhfdGhyZXNob2xkJywKQEAgLTgyMiwyNCArODQ1LDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FnZ21heCddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2Nob2ljZXNfb2s9VHJ1ZSkKIAotICAgICMgVE9ETzogQ0FTU0FORFJBLTE2NjQwCi0gICAgIyBkZWYgdGVzdF9jb21wbGV0ZV9pbl9kcm9wX2NvbHVtbmZhbWlseShzZWxmKToKLSAgICAjICAgICBwYXNzCi0gICAgIwotICAgICMgZGVmIHRlc3RfY29tcGxldGVfaW5fdHJ1bmNhdGUoc2VsZik6Ci0gICAgIyAgICAgcGFzcwotICAgICMKLSAgICAjIGRlZiB0ZXN0X2NvbXBsZXRlX2luX2FsdGVyX2NvbHVtbmZhbWlseShzZWxmKToKLSAgICAjICAgICBwYXNzCi0gICAgIwotICAgICMgZGVmIHRlc3RfY29tcGxldGVfaW5fdXNlKHNlbGYpOgotICAgICMgICAgIHBhc3MKLSAgICAjCi0gICAgIyBkZWYgdGVzdF9jb21wbGV0ZV9pbl9jcmVhdGVfaW5kZXgoc2VsZik6Ci0gICAgIyAgICAgcGFzcwotICAgICMKLSAgICAjIGRlZiB0ZXN0X2NvbXBsZXRlX2luX2Ryb3BfaW5kZXgoc2VsZik6Ci0gICAgIyAgICAgcGFzcworICAgIGRlZiB0ZXN0X2NvbXBsZXRlX2luX2Ryb3BfdGFibGUoc2VsZik6CisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0RST1AgVCcsIGNob2ljZXM9WydUQUJMRScsICdUUklHR0VSJywgJ1RZUEUnXSkKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnRFJPUCBUQScsIGltbWVkaWF0ZT0nQkxFICcpCisKKyAgICBkZWYgdGVzdF9jb21wbGV0ZV9pbl90cnVuY2F0ZShzZWxmKToKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnVFInLCBjaG9pY2VzPVsnVFJBQ0lORycsICdUUlVOQ0FURSddKQorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdUUlUnLCBpbW1lZGlhdGU9J05DQVRFICcpCisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ1RSVU5DQVRFIFQnLCBjaG9pY2VzPVsnVEFCTEUnLCAndHdlbnR5X3Jvd3NfY29tcG9zaXRlX3RhYmxlJywgJ3R3ZW50eV9yb3dzX3RhYmxlJ10pCisKKyAgICBkZWYgdGVzdF9jb21wbGV0ZV9pbl91c2Uoc2VsZik6CisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ1VTJywgaW1tZWRpYXRlPSdFICcpCisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ1VTRSAnLCBjaG9pY2VzPVtzZWxmLmNxbHNoLmtleXNwYWNlLCAnc3lzdGVtJywgJ3N5c3RlbV9hdXRoJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzdGVtX2Rpc3RyaWJ1dGVkJywgJ3N5c3RlbV9zY2hlbWEnLCAnc3lzdGVtX3RyYWNlcycsICdzeXN0ZW1fdmlld3MnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXN0ZW1fdmlydHVhbF9zY2hlbWEnIF0pCisKKyAgICBkZWYgdGVzdF9jb21wbGV0ZV9pbl9jcmVhdGVfaW5kZXgoc2VsZik6CisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0NSRUFURSBJJywgaW1tZWRpYXRlPSdOREVYICcpCisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0NSRUFURSBJTkRFWCAnLCBjaG9pY2VzPVsnPG5ld19pbmRleF9uYW1lPicsICdJRicsICdPTiddKQorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdDUkVBVEUgSU5ERVggZXhhbXBsZSAnLCBpbW1lZGlhdGU9J09OICcpCisKKyAgICBkZWYgdGVzdF9jb21wbGV0ZV9pbl9kcm9wX2luZGV4KHNlbGYpOgorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdEUk9QIEknLCBpbW1lZGlhdGU9J05ERVggJykKIAogICAgIGRlZiB0ZXN0X2NvbXBsZXRlX2luX2FsdGVyX2tleXNwYWNlKHNlbGYpOgogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdBTFRFUiBLRVknLCAnU1BBQ0UgJykKQEAgLTg1NCw3ICs4ODEsNyBAQAogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCJHUiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tZWRpYXRlPSdBTlQgJykKICAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygiR1JBTlQgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsnQUxMJywgJ0FMVEVSJywgJ0FVVEhPUklaRScsICdDUkVBVEUnLCAnREVTQ1JJQkUnLCAnRFJPUCcsICdFWEVDVVRFJywgJ01PRElGWScsICdTRUxFQ1QnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsnQUxMJywgJ0FMVEVSJywgJ0FVVEhPUklaRScsICdDUkVBVEUnLCAnREVTQ1JJQkUnLCAnRFJPUCcsICdFWEVDVVRFJywgJ01PRElGWScsICdTRUxFQ1QnLCAnVU5NQVNLJywgJ1NFTEVDVF9NQVNLRUQnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9jaG9pY2VzX29rPVRydWUpCiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoIkdSQU5UIE1PRElGWSAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9WycsJywgJ09OJywgJ1BFUk1JU1NJT04nXSkKQEAgLTg2Myw3ICs4OTAsNyBAQAogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCJHUkFOVCBNT0RJRlkgUEVSTUlTU0lPTiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9WycsJywgJ09OJ10pCiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoIkdSQU5UIE1PRElGWSBQRVJNSVNTSU9OLCAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9WydBTFRFUicsICdBVVRIT1JJWkUnLCAnQ1JFQVRFJywgJ0RFU0NSSUJFJywgJ0RST1AnLCAnRVhFQ1VURScsICdTRUxFQ1QnXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsnQUxURVInLCAnQVVUSE9SSVpFJywgJ0NSRUFURScsICdERVNDUklCRScsICdEUk9QJywgJ0VYRUNVVEUnLCAnU0VMRUNUJywgJ1VOTUFTSycsICdTRUxFQ1RfTUFTS0VEJ10pCiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoIkdSQU5UIE1PRElGWSBQRVJNSVNTSU9OLCBEIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsnREVTQ1JJQkUnLCAnRFJPUCddKQogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCJHUkFOVCBNT0RJRlkgUEVSTUlTU0lPTiwgRFIiLApAQCAtODg1LDcgKzkxMiw3IEBACiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoIlJFIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW1lZGlhdGU9J1ZPS0UgJykKICAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygiUkVWT0tFICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1bJ0FMTCcsICdBTFRFUicsICdBVVRIT1JJWkUnLCAnQ1JFQVRFJywgJ0RFU0NSSUJFJywgJ0RST1AnLCAnRVhFQ1VURScsICdNT0RJRlknLCAnU0VMRUNUJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1bJ0FMTCcsICdBTFRFUicsICdBVVRIT1JJWkUnLCAnQ1JFQVRFJywgJ0RFU0NSSUJFJywgJ0RST1AnLCAnRVhFQ1VURScsICdNT0RJRlknLCAnU0VMRUNUJywgJ1VOTUFTSycsICdTRUxFQ1RfTUFTS0VEJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfY2hvaWNlc19vaz1UcnVlKQogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCJSRVZPS0UgTU9ESUZZICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1bJywnLCAnT04nLCAnUEVSTUlTU0lPTiddKQpAQCAtODk0LDcgKzkyMSw3IEBACiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoIlJFVk9LRSBNT0RJRlkgUEVSTUlTU0lPTiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9WycsJywgJ09OJ10pCiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoIlJFVk9LRSBNT0RJRlkgUEVSTUlTU0lPTiwgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsnQUxURVInLCAnQVVUSE9SSVpFJywgJ0NSRUFURScsICdERVNDUklCRScsICdEUk9QJywgJ0VYRUNVVEUnLCAnU0VMRUNUJ10pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1bJ0FMVEVSJywgJ0FVVEhPUklaRScsICdDUkVBVEUnLCAnREVTQ1JJQkUnLCAnRFJPUCcsICdFWEVDVVRFJywgJ1NFTEVDVCcsICdVTk1BU0snLCAnU0VMRUNUX01BU0tFRCddKQogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCJSRVZPS0UgTU9ESUZZIFBFUk1JU1NJT04sIEQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9WydERVNDUklCRScsICdEUk9QJ10pCiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoIlJFVk9LRSBNT0RJRlkgUEVSTUlTU0lPTiwgRFIiLApAQCAtOTIwLDcgKzk0Nyw3IEBACiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0FMVEVSIFRBQkxFICcsIGNob2ljZXM9WydJRicsICd0d2VudHlfcm93c190YWJsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhc2NpaV93aXRoX3NwZWNpYWxfY2hhcnMnLCAndXNlcnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGFzX2FsbF90eXBlcycsICdzeXN0ZW0uJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VtcHR5X2NvbXBvc2l0ZV90YWJsZScsICdlbXB0eV90YWJsZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbXB0eV9jb21wb3NpdGVfdGFibGUnLCAnZXNjYXBlX3F1b3RlcycsICdlbXB0eV90YWJsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXN0ZW1fYXV0aC4nLCAndW5kZWZpbmVkX3ZhbHVlc190YWJsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkeW5hbWljX2NvbHVtbnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHdlbnR5X3Jvd3NfY29tcG9zaXRlX3RhYmxlJywKQEAgLTkzMiwxNSArOTU5LDI5IEBACiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0FMVEVSIFRBQkxFIElGIEVYSVNUUyBuZXdfdGFibGUgQUREICcsIGNob2ljZXM9Wyc8bmV3X2NvbHVtbl9uYW1lPicsICdJRiddKQogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdBTFRFUiBUQUJMRSBJRiBFWElTVFMgbmV3X3RhYmxlIEFERCBJRiBOT1QgRVhJU1RTICcsIGNob2ljZXM9Wyc8bmV3X2NvbHVtbl9uYW1lPiddKQogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdBTFRFUiBUQUJMRSBuZXdfdGFibGUgQUREIElGIE5PVCBFWElTVFMgJywgY2hvaWNlcz1bJzxuZXdfY29sdW1uX25hbWU+J10pCisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0FMVEVSIFRBQkxFIG5ld190YWJsZSBBREQgY29sIGludCAnLCBjaG9pY2VzPVsnOycsICdNQVNLRUQnLCAnc3RhdGljJ10pCisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0FMVEVSIFRBQkxFIG5ld190YWJsZSBBREQgY29sIGludCBNJywgaW1tZWRpYXRlPSdBU0tFRCBXSVRIICcpCisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0FMVEVSIFRBQkxFIG5ld190YWJsZSBBREQgY29sIGludCBNQVNLRUQgV0lUSCAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9WydERUZBVUxUJywgc2VsZi5jcWxzaC5rZXlzcGFjZSArICcuJywgJ3N5c3RlbS4nXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9jaG9pY2VzX29rPVRydWUpCiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0FMVEVSIFRBQkxFIElGIEVYSVNUUyBuZXdfdGFibGUgUkVOQU1FICcsIGNob2ljZXM9WydJRicsICc8cXVvdGVkTmFtZT4nLCAnPGlkZW50aWZpZXI+J10pCiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0FMVEVSIFRBQkxFIG5ld190YWJsZSBSRU5BTUUgJywgY2hvaWNlcz1bJ0lGJywgJzxxdW90ZWROYW1lPicsICc8aWRlbnRpZmllcj4nXSkKICAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnQUxURVIgVEFCTEUgSUYgRVhJU1RTIG5ld190YWJsZSBEUk9QICcsIGNob2ljZXM9WydJRicsICc8cXVvdGVkTmFtZT4nLCAnPGlkZW50aWZpZXI+J10pCisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0FMVEVSIFRBQkxFIElGIEVYSVNUUyBuZXdfdGFibGUgQUxURVIgJywgY2hvaWNlcz1bJ0lGJywgJzxxdW90ZWROYW1lPicsICc8aWRlbnRpZmllcj4nXSkKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnQUxURVIgVEFCTEUgSUYgRVhJU1RTIG5ld190YWJsZSBBTFRFUiBJRiBFJywgaW1tZWRpYXRlPSdYSVNUUyAnKQorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdBTFRFUiBUQUJMRSBJRiBFWElTVFMgbmV3X3RhYmxlIEFMVEVSIElGIEVYSVNUUyBjb2wgJywgY2hvaWNlcz1bJ01BU0tFRCcsICdEUk9QJ10pCisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0FMVEVSIFRBQkxFIElGIEVYSVNUUyBuZXdfdGFibGUgQUxURVIgSUYgRVhJU1RTIGNvbCBNJywgaW1tZWRpYXRlPSdBU0tFRCBXSVRIICcpCisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0FMVEVSIFRBQkxFIElGIEVYSVNUUyBuZXdfdGFibGUgQUxURVIgSUYgRVhJU1RTIGNvbCBNQVNLRUQgV0lUSCAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9WydERUZBVUxUJywgc2VsZi5jcWxzaC5rZXlzcGFjZSArICcuJywgJ3N5c3RlbS4nXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9jaG9pY2VzX29rPVRydWUpCisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0FMVEVSIFRBQkxFIElGIEVYSVNUUyBuZXdfdGFibGUgQUxURVIgSUYgRVhJU1RTIGNvbCBEJywgaW1tZWRpYXRlPSdST1AgTUFTS0VEIDsnKQorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdBTFRFUiBUQUJMRSBJRiBFWElTVFMgbmV3X3RhYmxlIEFMVEVSIElGIEVYSVNUUyBjb2wgRFJPUCBNJywgaW1tZWRpYXRlPSdBU0tFRCA7JykKIAogICAgIGRlZiB0ZXN0X2NvbXBsZXRlX2luX2FsdGVyX3R5cGUoc2VsZik6CiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0FMVEVSIFRZUEUgSScsIGltbWVkaWF0ZT0nRiBFWElTVFMgJykKICAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnQUxURVIgVFlQRSAnLCBjaG9pY2VzPVsnSUYnLCAnc3lzdGVtX3ZpZXdzLicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RhZ3MnLCAnc3lzdGVtX3RyYWNlcy4nLCAnc3lzdGVtX2Rpc3RyaWJ1dGVkLicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Bob25lX251bWJlcicsICdiYW5kX2luZm9fdHlwZScsICdhZGRyZXNzJywgJ3N5c3RlbS4nLCAnc3lzdGVtX3NjaGVtYS4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwaG9uZV9udW1iZXInLCAncXVvdGVfdWR0JywgJ2JhbmRfaW5mb190eXBlJywgJ2FkZHJlc3MnLCAnc3lzdGVtLicsICdzeXN0ZW1fc2NoZW1hLicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbV9hdXRoLicsICdzeXN0ZW1fdmlydHVhbF9zY2hlbWEuJywgc2VsZi5jcWxzaC5rZXlzcGFjZSArICcuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0FMVEVSIFRZUEUgSUYgRVhJU1RTIG5ld190eXBlIEFERCAnLCBjaG9pY2VzPVsnPG5ld19maWVsZF9uYW1lPicsICdJRiddKQpAQCAtOTUwLDUgKzk5MSw0NCBAQAogICAgIGRlZiB0ZXN0X2NvbXBsZXRlX2luX2FsdGVyX3VzZXIoc2VsZik6CiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0FMVEVSIFVTRVIgJywgY2hvaWNlcz1bJzxpZGVudGlmaWVyPicsICdJRicsICc8cGdTdHJpbmdMaXRlcmFsPicsICc8cXVvdGVkU3RyaW5nTGl0ZXJhbD4nXSkKIAorICAgIGRlZiB0ZXN0X2NvbXBsZXRlX2luX2NyZWF0ZV9yb2xlKHNlbGYpOgorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdDUkVBVEUgUk9MRSAnLCBjaG9pY2VzPVsnPGlkZW50aWZpZXI+JywgJ0lGJywgJzxxdW90ZWROYW1lPiddKQorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdDUkVBVEUgUk9MRSBJRiAnLCBpbW1lZGlhdGU9J05PVCBFWElTVFMgJyk7CisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0NSRUFURSBST0xFIGZvbyBXSVRIICcsIGNob2ljZXM9WydBQ0NFU1MnLCAnSEFTSEVEJywgJ0xPR0lOJywgJ09QVElPTlMnLCAnUEFTU1dPUkQnLCAnU1VQRVJVU0VSJ10pCisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0NSRUFURSBST0xFIGZvbyBXSVRIIEhBU0hFRCAnLCBpbW1lZGlhdGU9J1BBU1NXT1JEID0gJyk7CisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0NSRUFURSBST0xFIGZvbyBXSVRIIEFDQ0VTUyBUTyAnLCBjaG9pY2VzPVsnQUxMJywgJ0RBVEFDRU5URVJTJ10pCisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0NSRUFURSBST0xFIGZvbyBXSVRIIEFDQ0VTUyBUTyBBTEwgJywgaW1tZWRpYXRlPSdEQVRBQ0VOVEVSUyAnKQorCiAgICAgZGVmIHRlc3RfY29tcGxldGVfaW5fYWx0ZXJfcm9sZShzZWxmKToKICAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnQUxURVIgUk9MRSAnLCBjaG9pY2VzPVsnPGlkZW50aWZpZXI+JywgJ0lGJywgJzxxdW90ZWROYW1lPiddKQorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdBTFRFUiBST0xFIGZvbyAnLCBpbW1lZGlhdGU9J1dJVEggJykKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnQUxURVIgUk9MRSBmb28gV0lUSCAnLCBjaG9pY2VzPVsnQUNDRVNTJywgJ0hBU0hFRCcsICdMT0dJTicsICdPUFRJT05TJywgJ1BBU1NXT1JEJywgJ1NVUEVSVVNFUiddKQorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdBTFRFUiBST0xFIGZvbyBXSVRIIEFDQ0VTUyBUTyAnLCBjaG9pY2VzPVsnQUxMJywgJ0RBVEFDRU5URVJTJ10pCisKKyAgICBkZWYgdGVzdF9jb21wbGV0ZV9pbl9kcm9wX3JvbGUoc2VsZik6CisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0RST1AgUk9MRSAnLCBjaG9pY2VzPVsnPGlkZW50aWZpZXI+JywgJ0lGJywgJzxxdW90ZWROYW1lPiddKQorCisKKyAgICBkZWYgdGVzdF9jb21wbGV0ZV9pbl9saXN0KHNlbGYpOgorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdMSVNUICcsIGNob2ljZXM9WydBTEwnLCAnQVVUSE9SSVpFJywgJ0RFU0NSSUJFJywgJ0VYRUNVVEUnLCAnUk9MRVMnLCAnVVNFUlMnLCAnQUxURVInLCAnQ1JFQVRFJywgJ0RST1AnLCAnTU9ESUZZJywgJ1NFTEVDVCcsICdVTk1BU0snLCAnU0VMRUNUX01BU0tFRCddKQorCisKKyAgICAjIE5vbi1DUUwgU2hlbGwgQ29tbWFuZHMKKworICAgIGRlZiB0ZXN0X2NvbXBsZXRlX2luX2NhcHR1cmUoc2VsZik6CisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0NBUFRVUkUgJywgY2hvaWNlcz1bJ09GRicsICc7JywgJzxlbnRlcj4nXSwgb3RoZXJfY2hvaWNlc19vaz1UcnVlKQorCisgICAgZGVmIHRlc3RfY29tcGxldGVfaW5fcGFnaW5nKHNlbGYpOgorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdQQUdJTkcgJywgY2hvaWNlcz1bJ09OJywgJ09GRicsICc7JywgJzxlbnRlcj4nLCAnPHdob2xlbnVtYmVyPicgXSApCisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ1BBR0lORyA1MCAnLCBjaG9pY2VzPVsnOycsICc8ZW50ZXI+JyBdICkKKworICAgIGRlZiB0ZXN0X2NvbXBsZXRlX2luX3NlcmlhbChzZWxmKToKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnU0VSSUFMIENPTlNJU1RFTkNZICcsIGNob2ljZXM9Wyc7JywgJzxlbnRlcj4nLCAnTE9DQUxfU0VSSUFMJywgJ1NFUklBTCddKQorCisgICAgZGVmIHRlc3RfY29tcGxldGVfaW5fc2hvdyhzZWxmKToKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnU0hPVyAnLCBjaG9pY2VzPVsnSE9TVCcsICdSRVBMSUNBUycsICdTRVNTSU9OJywgJ1ZFUlNJT04nXSkKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnU0hPVyBTRVNTSU9OICcsIGNob2ljZXM9Wyc8dXVpZD4nXSkKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnU0hPVyBSRVBMSUNBUyAnLCBjaG9pY2VzPVsnLScsICc8d2hvbGVudW1iZXI+J10pCisKKyAgICBkZWYgdGVzdF9jb21wbGV0ZV9pbl90cmFjaW5nKHNlbGYpOgorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdUUkFDSU5HICcsIGNob2ljZXM9Wyc7JywgJzxlbnRlcj4nLCAnT0ZGJywgJ09OJ10pCmRpZmYgLS1naXQgYS9weWxpYi9jcWxzaGxpYi90ZXN0L3Rlc3RfY3Fsc2hfb3V0cHV0LnB5IGIvcHlsaWIvY3Fsc2hsaWIvdGVzdC90ZXN0X2NxbHNoX291dHB1dC5weQppbmRleCA1MmY1NjRhLi5mZTA4YzhkIDEwMDY0NAotLS0gYS9weWxpYi9jcWxzaGxpYi90ZXN0L3Rlc3RfY3Fsc2hfb3V0cHV0LnB5CisrKyBiL3B5bGliL2NxbHNobGliL3Rlc3QvdGVzdF9jcWxzaF9vdXRwdXQucHkKQEAgLTY3NSw2ICs2NzUsNyBAQAogICAgICAgICAgICAgICAgIHZhcmNoYXJjb2wgdGV4dCwKICAgICAgICAgICAgICAgICB2YXJpbnRjb2wgdmFyaW50CiAgICAgICAgICAgICApIFdJVEggYWRkaXRpb25hbF93cml0ZV9wb2xpY3kgPSAnOTlwJworICAgICAgICAgICAgICAgIEFORCBhbGxvd19hdXRvX3NuYXBzaG90ID0gdHJ1ZQogICAgICAgICAgICAgICAgIEFORCBibG9vbV9maWx0ZXJfZnBfY2hhbmNlID0gMC4wMQogICAgICAgICAgICAgICAgIEFORCBjYWNoaW5nID0geydrZXlzJzogJ0FMTCcsICdyb3dzX3Blcl9wYXJ0aXRpb24nOiAnTk9ORSd9CiAgICAgICAgICAgICAgICAgQU5EIGNkYyA9IGZhbHNlCkBAIC02ODYsNiArNjg3LDcgQEAKICAgICAgICAgICAgICAgICBBTkQgZGVmYXVsdF90aW1lX3RvX2xpdmUgPSAwCiAgICAgICAgICAgICAgICAgQU5EIGV4dGVuc2lvbnMgPSB7fQogICAgICAgICAgICAgICAgIEFORCBnY19ncmFjZV9zZWNvbmRzID0gODY0MDAwCisgICAgICAgICAgICAgICAgQU5EIGluY3JlbWVudGFsX2JhY2t1cHMgPSB0cnVlCiAgICAgICAgICAgICAgICAgQU5EIG1heF9pbmRleF9pbnRlcnZhbCA9IDIwNDgKICAgICAgICAgICAgICAgICBBTkQgbWVtdGFibGVfZmx1c2hfcGVyaW9kX2luX21zID0gMAogICAgICAgICAgICAgICAgIEFORCBtaW5faW5kZXhfaW50ZXJ2YWwgPSAxMjgKQEAgLTkzNiwzICs5MzgsNTEgQEAKICAgICAgICAgcm93X2hlYWRlcnMgPSBbcyBmb3IgcyBpbiBvdXRwdXQuc3BsaXRsaW5lcygpIGlmICJAIFJvdyIgaW4gc10KICAgICAgICAgcm93X2lkcyA9IFtpbnQocy5zcGxpdCgnICcpWzJdKSBmb3IgcyBpbiByb3dfaGVhZGVyc10KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbaSBmb3IgaSBpbiByYW5nZSgxLCAyMSldLCByb3dfaWRzKQorCisgICAgZGVmIHRlc3RfcXVvdGVkX291dHB1dF90ZXh0X2luX21hcChzZWxmKToKKyAgICAgICAga3MgPSBnZXRfa2V5c3BhY2UoKQorCisgICAgICAgIHF1ZXJ5ID0gIlNFTEVDVCB0ZXh0X2RhdGEgRlJPTSAiICsga3MgKyAiLmVzY2FwZV9xdW90ZXM7IgorICAgICAgICBvdXRwdXQsIHJlc3VsdCA9IHRlc3RjYWxsX2NxbHNoKHByb21wdD1Ob25lLCBlbnY9c2VsZi5kZWZhdWx0X2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0eT1GYWxzZSwgaW5wdXQ9cXVlcnkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dC5zcGxpdGxpbmVzKClbM10uc3RyaXAoKSwgIkknbSBuZXdiIikKKworICAgICAgICBxdWVyeSA9ICJTRUxFQ1QgbWFwX2RhdGEgRlJPTSAiICsga3MgKyAiLmVzY2FwZV9xdW90ZXM7IgorICAgICAgICBvdXRwdXQsIHJlc3VsdCA9IHRlc3RjYWxsX2NxbHNoKHByb21wdD1Ob25lLCBlbnY9c2VsZi5kZWZhdWx0X2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHR5PUZhbHNlLCBpbnB1dD1xdWVyeSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCByZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cHV0LnNwbGl0bGluZXMoKVszXS5zdHJpcCgpLCAiezE6ICdJJydtIG5ld2InfSIpCisKKyAgICBkZWYgdGVzdF9xdW90ZWRfb3V0cHV0X3RleHRfaW5fc2ltcGxlX2NvbGxlY3Rpb25zKHNlbGYpOgorICAgICAgICBrcyA9IGdldF9rZXlzcGFjZSgpCisKKyAgICAgICAgIyBTZXRzCisgICAgICAgIHF1ZXJ5ID0gIlNFTEVDVCBzZXRfZGF0YSBGUk9NICIgKyBrcyArICIuZXNjYXBlX3F1b3RlczsiCisgICAgICAgIG91dHB1dCwgcmVzdWx0ID0gdGVzdGNhbGxfY3Fsc2gocHJvbXB0PU5vbmUsIGVudj1zZWxmLmRlZmF1bHRfZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dHk9RmFsc2UsIGlucHV0PXF1ZXJ5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRwdXQuc3BsaXRsaW5lcygpWzNdLnN0cmlwKCksICJ7J0knJ20gbmV3Yid9IikKKworICAgICAgICAjIExpc3RzCisgICAgICAgIHF1ZXJ5ID0gIlNFTEVDVCBsaXN0X2RhdGEgRlJPTSAiICsga3MgKyAiLmVzY2FwZV9xdW90ZXM7IgorICAgICAgICBvdXRwdXQsIHJlc3VsdCA9IHRlc3RjYWxsX2NxbHNoKHByb21wdD1Ob25lLCBlbnY9c2VsZi5kZWZhdWx0X2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHR5PUZhbHNlLCBpbnB1dD1xdWVyeSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCByZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cHV0LnNwbGl0bGluZXMoKVszXS5zdHJpcCgpLCAiWydJJydtIG5ld2InXSIpCisKKyAgICAgICAgIyBUdXBsZXMKKyAgICAgICAgcXVlcnkgPSAiU0VMRUNUIHR1cGxlX2RhdGEgRlJPTSAiICsga3MgKyAiLmVzY2FwZV9xdW90ZXM7IgorICAgICAgICBvdXRwdXQsIHJlc3VsdCA9IHRlc3RjYWxsX2NxbHNoKHByb21wdD1Ob25lLCBlbnY9c2VsZi5kZWZhdWx0X2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHR5PUZhbHNlLCBpbnB1dD1xdWVyeSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCByZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cHV0LnNwbGl0bGluZXMoKVszXS5zdHJpcCgpLCAiKDEsICdJJydtIG5ld2InKSIpCisKKyAgICBkZWYgdGVzdF9xdW90ZWRfb3V0cHV0X3RleHRfaW5fdWR0cyhzZWxmKToKKyAgICAgICAga3MgPSBnZXRfa2V5c3BhY2UoKQorCisgICAgICAgIHF1ZXJ5ID0gIlNFTEVDVCB1ZHRfZGF0YSBGUk9NICIgKyBrcyArICIuZXNjYXBlX3F1b3RlczsiCisgICAgICAgIG91dHB1dCwgcmVzdWx0ID0gdGVzdGNhbGxfY3Fsc2gocHJvbXB0PU5vbmUsIGVudj1zZWxmLmRlZmF1bHRfZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dHk9RmFsc2UsIGlucHV0PXF1ZXJ5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRwdXQuc3BsaXRsaW5lcygpWzNdLnN0cmlwKCksICJ7ZGF0YTogJ0knJ20gbmV3Yid9IikKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9weWxpYi9jcWxzaGxpYi90ZXN0L3Rlc3Rfa2V5c3BhY2VfaW5pdC5jcWwgYi9weWxpYi9jcWxzaGxpYi90ZXN0L3Rlc3Rfa2V5c3BhY2VfaW5pdC5jcWwKaW5kZXggOTZiZjllYS4uNWZmNDEwOCAxMDA2NDQKLS0tIGEvcHlsaWIvY3Fsc2hsaWIvdGVzdC90ZXN0X2tleXNwYWNlX2luaXQuY3FsCisrKyBiL3B5bGliL2NxbHNobGliL3Rlc3QvdGVzdF9rZXlzcGFjZV9pbml0LmNxbApAQCAtNjksOSArNjksOSBAQAogSU5TRVJUIElOVE8gaGFzX2FsbF90eXBlcyAobnVtLCBpbnRjb2wsIGFzY2lpY29sLCBiaWdpbnRjb2wsIGJsb2Jjb2wsIGJvb2xlYW5jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsY29sLCBkb3VibGVjb2wsIGZsb2F0Y29sLCBzbWFsbGludGNvbCwgdGV4dGNvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcGNvbCwgdGlueWludGNvbCwgdXVpZGNvbCwgdmFyY2hhcmNvbCwgdmFyaW50Y29sKQotVkFMVUVTICg0LCBibG9iQXNJbnQoMHgpLCAnJywgYmxvYkFzQmlnaW50KDB4KSwgMHgsIGJsb2JBc0Jvb2xlYW4oMHgpLAotCWJsb2JBc0RlY2ltYWwoMHgpLCBibG9iQXNEb3VibGUoMHgpLCBibG9iQXNGbG9hdCgweCksIGJsb2JBc1NtYWxsSW50KDB4MDAwMCksICcnLAotCWJsb2JBc1RpbWVzdGFtcCgweCksIGJsb2JBc1RpbnlJbnQoMHgwMCksIGJsb2JBc1V1aWQoMHgpLCAnJywgYmxvYkFzVmFyaW50KDB4KSk7CitWQUxVRVMgKDQsIGJsb2JfYXNfaW50KDB4KSwgJycsIGJsb2JfYXNfYmlnaW50KDB4KSwgMHgsIGJsb2JfYXNfYm9vbGVhbigweCksCisJYmxvYl9hc19kZWNpbWFsKDB4KSwgYmxvYl9hc19kb3VibGUoMHgpLCBibG9iX2FzX2Zsb2F0KDB4KSwgYmxvYl9hc19zbWFsbEludCgweDAwMDApLCAnJywKKwlibG9iX2FzX3RpbWVzdGFtcCgweCksIGJsb2JfYXNfdGlueWludCgweDAwKSwgYmxvYl9hc191dWlkKDB4KSwgJycsIGJsb2JfYXNfdmFyaW50KDB4KSk7CiAKIAogCkBAIC0xNDEsMTMgKzE0MSwxMyBAQAogKTsKIAogLS0gIm5ld2xpbmU6XG4iCi1JTlNFUlQgSU5UTyBhc2NpaV93aXRoX3NwZWNpYWxfY2hhcnMgKGssIHZhbCkgVkFMVUVTICgwLCBibG9iQXNBc2NpaSgweDZlNjU3NzZjNjk2ZTY1M2EwYSkpOworSU5TRVJUIElOVE8gYXNjaWlfd2l0aF9zcGVjaWFsX2NoYXJzIChrLCB2YWwpIFZBTFVFUyAoMCwgYmxvYl9hc19hc2NpaSgweDZlNjU3NzZjNjk2ZTY1M2EwYSkpOwogLS0gInJldHVyblxyYW5kIG51bGxcMCEiCi1JTlNFUlQgSU5UTyBhc2NpaV93aXRoX3NwZWNpYWxfY2hhcnMgKGssIHZhbCkgVkFMVUVTICgxLCBibG9iQXNBc2NpaSgweDcyNjU3NDc1NzI2ZTBkNjE2ZTY0MjA2ZTc1NmM2YzAwMjEpKTsKK0lOU0VSVCBJTlRPIGFzY2lpX3dpdGhfc3BlY2lhbF9jaGFycyAoaywgdmFsKSBWQUxVRVMgKDEsIGJsb2JfYXNfYXNjaWkoMHg3MjY1NzQ3NTcyNmUwZDYxNmU2NDIwNmU3NTZjNmMwMDIxKSk7CiAtLSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1Y29udHJvbCBjaGFyc1x4MDZceDA3IgotSU5TRVJUIElOVE8gYXNjaWlfd2l0aF9zcGVjaWFsX2NoYXJzIChrLCB2YWwpIFZBTFVFUyAoMiwgYmxvYkFzQXNjaWkoMHgwMDAxMDIwMzA0MDU2MzZmNmU3NDcyNmY2YzIwNjM2ODYxNzI3MzA2MDcpKTsKK0lOU0VSVCBJTlRPIGFzY2lpX3dpdGhfc3BlY2lhbF9jaGFycyAoaywgdmFsKSBWQUxVRVMgKDIsIGJsb2JfYXNfYXNjaWkoMHgwMDAxMDIwMzA0MDU2MzZmNmU3NDcyNmY2YzIwNjM2ODYxNzI3MzA2MDcpKTsKIC0tICJmYWtlIHNwZWNpYWwgY2hhcnNcXHgwMFxcbiIKLUlOU0VSVCBJTlRPIGFzY2lpX3dpdGhfc3BlY2lhbF9jaGFycyAoaywgdmFsKSBWQUxVRVMgKDMsIGJsb2JBc0FzY2lpKDB4NjY2MTZiNjUyMDczNzA2NTYzNjk2MTZjMjA2MzY4NjE3MjczNWM3ODMwMzA1YzZlKSk7CitJTlNFUlQgSU5UTyBhc2NpaV93aXRoX3NwZWNpYWxfY2hhcnMgKGssIHZhbCkgVkFMVUVTICgzLCBibG9iX2FzX2FzY2lpKDB4NjY2MTZiNjUyMDczNzA2NTYzNjk2MTZjMjA2MzY4NjE3MjczNWM3ODMwMzA1YzZlKSk7CiAKIAogCkBAIC0yODAsMjYgKzI4MCwyNiBAQAogCiBDUkVBVEUgRlVOQ1RJT04gZkJlc3RiYW5kICggaW5wdXQgZG91YmxlICkKICAgICBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVAotICAgIFJFVFVSTlMgdGV4dCAKKyAgICBSRVRVUk5TIHRleHQKICAgICBMQU5HVUFHRSBqYXZhCiAgICAgQVMgJ3JldHVybiAiSXJvbiBNYWlkZW4iOyc7CiAKIENSRUFURSBGVU5DVElPTiBmQmVzdHNvbmcgKCBpbnB1dCBkb3VibGUgKQogICAgIFJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUCi0gICAgUkVUVVJOUyB0ZXh0IAorICAgIFJFVFVSTlMgdGV4dAogICAgIExBTkdVQUdFIGphdmEKICAgICBBUyAncmV0dXJuICJSZXZlbGF0aW9ucyI7JzsKIAogQ1JFQVRFIEZVTkNUSU9OIGZNYXgoY3VycmVudCBpbnQsIGNhbmRpZGF0ZSBpbnQpCiAgICAgQ0FMTEVEIE9OIE5VTEwgSU5QVVQKLSAgICBSRVRVUk5TIGludCAKLSAgICBMQU5HVUFHRSBqYXZhIAorICAgIFJFVFVSTlMgaW50CisgICAgTEFOR1VBR0UgamF2YQogICAgIEFTICdpZiAoY3VycmVudCA9PSBudWxsKSByZXR1cm4gY2FuZGlkYXRlOyBlbHNlIHJldHVybiBNYXRoLm1heChjdXJyZW50LCBjYW5kaWRhdGUpOycgOwogCiBDUkVBVEUgRlVOQ1RJT04gZk1pbihjdXJyZW50IGludCwgY2FuZGlkYXRlIGludCkKICAgICBDQUxMRUQgT04gTlVMTCBJTlBVVAogICAgIFJFVFVSTlMgaW50Ci0gICAgTEFOR1VBR0UgamF2YSAKKyAgICBMQU5HVUFHRSBqYXZhCiAgICAgQVMgJ2lmIChjdXJyZW50ID09IG51bGwpIHJldHVybiBjYW5kaWRhdGU7IGVsc2UgcmV0dXJuIE1hdGgubWluKGN1cnJlbnQsIGNhbmRpZGF0ZSk7JyA7CiAKIENSRUFURSBBR0dSRUdBVEUgYWdnTWF4KGludCkKQEAgLTMxMiwzICszMTIsMTggQEAKICAgICBTVFlQRSBpbnQKICAgICBJTklUQ09ORCBudWxsOwogCitDUkVBVEUgVFlQRSBxdW90ZV91ZHQgKAorICAgIGRhdGEgdGV4dAorKTsKKworQ1JFQVRFIFRBQkxFIGVzY2FwZV9xdW90ZXMgKAorICAgIGlkIGludCBQUklNQVJZIEtFWSwKKyAgICB0ZXh0X2RhdGEgdGV4dCwKKyAgICBtYXBfZGF0YSBtYXA8aW50LCB0ZXh0PiwKKyAgICBzZXRfZGF0YSBzZXQ8dGV4dD4sCisgICAgbGlzdF9kYXRhIGxpc3Q8dGV4dD4sCisgICAgdHVwbGVfZGF0YSB0dXBsZTxpbnQsIHRleHQ+LAorICAgIHVkdF9kYXRhIGZyb3plbjxxdW90ZV91ZHQ+CispOworCitJTlNFUlQgSU5UTyBlc2NhcGVfcXVvdGVzIChpZCwgdGV4dF9kYXRhLCBtYXBfZGF0YSwgc2V0X2RhdGEsIGxpc3RfZGF0YSwgdHVwbGVfZGF0YSwgdWR0X2RhdGEpIHZhbHVlcygxLCAnSScnbSBuZXdiJywgezE6J0knJ20gbmV3Yid9LCB7J0knJ20gbmV3Yid9LCBbJ0knJ20gbmV3YiddLCAoMSwgJ0knJ20gbmV3YicpLCB7ZGF0YTogJ0knJ20gbmV3Yid9KTsKZGlmZiAtLWdpdCBhL3B5bGliL2NxbHNobGliL3djd2lkdGgucHkgYi9weWxpYi9jcWxzaGxpYi93Y3dpZHRoLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmUzYWYyLi4wMDAwMDAwCi0tLSBhL3B5bGliL2NxbHNobGliL3djd2lkdGgucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzNzkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBhZGFwdGVkIGZyb20gaHR0cDovL3d3dy5jbC5jYW0uYWMudWsvfm1nazI1L3Vjcy93Y3dpZHRoLmMKLSMgLXRoZXBhdWwKLQotIyBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHdjd2lkdGgoKSBhbmQgd2Nzd2lkdGgoKSAoZGVmaW5lZCBpbgotIyBJRUVFIFN0ZCAxMDAyLjEtMjAwMSkgZm9yIFVuaWNvZGUuCi0jCi0jIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS9mdW5jdGlvbnMvd2N3aWR0aC5odG1sCi0jIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS9mdW5jdGlvbnMvd2Nzd2lkdGguaHRtbAotIwotIyBJbiBmaXhlZC13aWR0aCBvdXRwdXQgZGV2aWNlcywgTGF0aW4gY2hhcmFjdGVycyBhbGwgb2NjdXB5IGEgc2luZ2xlCi0jICJjZWxsIiBwb3NpdGlvbiBvZiBlcXVhbCB3aWR0aCwgd2hlcmVhcyBpZGVvZ3JhcGhpYyBDSksgY2hhcmFjdGVycwotIyBvY2N1cHkgdHdvIHN1Y2ggY2VsbHMuIEludGVyb3BlcmFiaWxpdHkgYmV0d2VlbiB0ZXJtaW5hbC1saW5lCi0jIGFwcGxpY2F0aW9ucyBhbmQgKHRlbGV0eXBlLXN0eWxlKSBjaGFyYWN0ZXIgdGVybWluYWxzIHVzaW5nIHRoZQotIyBVVEYtOCBlbmNvZGluZyByZXF1aXJlcyBhZ3JlZW1lbnQgb24gd2hpY2ggY2hhcmFjdGVyIHNob3VsZCBhZHZhbmNlCi0jIHRoZSBjdXJzb3IgYnkgaG93IG1hbnkgY2VsbCBwb3NpdGlvbnMuIE5vIGVzdGFibGlzaGVkIGZvcm1hbAotIyBzdGFuZGFyZHMgZXhpc3QgYXQgcHJlc2VudCBvbiB3aGljaCBVbmljb2RlIGNoYXJhY3RlciBzaGFsbCBvY2N1cHkKLSMgaG93IG1hbnkgY2VsbCBwb3NpdGlvbnMgb24gY2hhcmFjdGVyIHRlcm1pbmFscy4gVGhlc2Ugcm91dGluZXMgYXJlCi0jIGEgZmlyc3QgYXR0ZW1wdCBvZiBkZWZpbmluZyBzdWNoIGJlaGF2aW9yIGJhc2VkIG9uIHNpbXBsZSBydWxlcwotIyBhcHBsaWVkIHRvIGRhdGEgcHJvdmlkZWQgYnkgdGhlIFVuaWNvZGUgQ29uc29ydGl1bS4KLSMKLSMgRm9yIHNvbWUgZ3JhcGhpY2FsIGNoYXJhY3RlcnMsIHRoZSBVbmljb2RlIHN0YW5kYXJkIGV4cGxpY2l0bHkKLSMgZGVmaW5lcyBhIGNoYXJhY3Rlci1jZWxsIHdpZHRoIHZpYSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgRWFzdCBBc2lhbgotIyBGdWxsV2lkdGggKEYpLCBXaWRlIChXKSwgSGFsZi13aWR0aCAoSCksIGFuZCBOYXJyb3cgKE5hKSBjbGFzc2VzLgotIyBJbiBhbGwgdGhlc2UgY2FzZXMsIHRoZXJlIGlzIG5vIGFtYmlndWl0eSBhYm91dCB3aGljaCB3aWR0aCBhCi0jIHRlcm1pbmFsIHNoYWxsIHVzZS4gRm9yIGNoYXJhY3RlcnMgaW4gdGhlIEVhc3QgQXNpYW4gQW1iaWd1b3VzIChBKQotIyBjbGFzcywgdGhlIHdpZHRoIGNob2ljZSBkZXBlbmRzIHB1cmVseSBvbiBhIHByZWZlcmVuY2Ugb2YgYmFja3dhcmQKLSMgY29tcGF0aWJpbGl0eSB3aXRoIGVpdGhlciBoaXN0b3JpYyBDSksgb3IgV2VzdGVybiBwcmFjdGljZS4KLSMgQ2hvb3Npbmcgc2luZ2xlLXdpZHRoIGZvciB0aGVzZSBjaGFyYWN0ZXJzIGlzIGVhc3kgdG8ganVzdGlmeSBhcwotIyB0aGUgYXBwcm9wcmlhdGUgbG9uZy10ZXJtIHNvbHV0aW9uLCBhcyB0aGUgQ0pLIHByYWN0aWNlIG9mCi0jIGRpc3BsYXlpbmcgdGhlc2UgY2hhcmFjdGVycyBhcyBkb3VibGUtd2lkdGggY29tZXMgZnJvbSBoaXN0b3JpYwotIyBpbXBsZW1lbnRhdGlvbiBzaW1wbGljaXR5ICg4LWJpdCBlbmNvZGVkIGNoYXJhY3RlcnMgd2VyZSBkaXNwbGF5ZWQKLSMgc2luZ2xlLXdpZHRoIGFuZCAxNi1iaXQgb25lcyBkb3VibGUtd2lkdGgsIGV2ZW4gZm9yIEdyZWVrLAotIyBDeXJpbGxpYywgZXRjLikgYW5kIG5vdCBhbnkgdHlwb2dyYXBoaWMgY29uc2lkZXJhdGlvbnMuCi0jCi0jIE11Y2ggbGVzcyBjbGVhciBpcyB0aGUgY2hvaWNlIG9mIHdpZHRoIGZvciB0aGUgTm90IEVhc3QgQXNpYW4KLSMgKE5ldXRyYWwpIGNsYXNzLiBFeGlzdGluZyBwcmFjdGljZSBkb2VzIG5vdCBkaWN0YXRlIGEgd2lkdGggZm9yIGFueQotIyBvZiB0aGVzZSBjaGFyYWN0ZXJzLiBJdCB3b3VsZCBuZXZlcnRoZWxlc3MgbWFrZSBzZW5zZQotIyB0eXBvZ3JhcGhpY2FsbHkgdG8gYWxsb2NhdGUgdHdvIGNoYXJhY3RlciBjZWxscyB0byBjaGFyYWN0ZXJzIHN1Y2gKLSMgYXMgZm9yIGluc3RhbmNlIEVNIFNQQUNFIG9yIFZPTFVNRSBJTlRFR1JBTCwgd2hpY2ggY2Fubm90IGJlCi0jIHJlcHJlc2VudGVkIGFkZXF1YXRlbHkgd2l0aCBhIHNpbmdsZS13aWR0aCBnbHlwaC4gVGhlIGZvbGxvd2luZwotIyByb3V0aW5lcyBhdCBwcmVzZW50IG1lcmVseSBhc3NpZ24gYSBzaW5nbGUtY2VsbCB3aWR0aCB0byBhbGwKLSMgbmV1dHJhbCBjaGFyYWN0ZXJzLCBpbiB0aGUgaW50ZXJlc3Qgb2Ygc2ltcGxpY2l0eS4gVGhpcyBpcyBub3QKLSMgZW50aXJlbHkgc2F0aXNmYWN0b3J5IGFuZCBzaG91bGQgYmUgcmVjb25zaWRlcmVkIGJlZm9yZQotIyBlc3RhYmxpc2hpbmcgYSBmb3JtYWwgc3RhbmRhcmQgaW4gdGhpcyBhcmVhLiBBdCB0aGUgbW9tZW50LCB0aGUKLSMgZGVjaXNpb24gd2hpY2ggTm90IEVhc3QgQXNpYW4gKE5ldXRyYWwpIGNoYXJhY3RlcnMgc2hvdWxkIGJlCi0jIHJlcHJlc2VudGVkIGJ5IGRvdWJsZS13aWR0aCBnbHlwaHMgY2Fubm90IHlldCBiZSBhbnN3ZXJlZCBieQotIyBhcHBseWluZyBhIHNpbXBsZSBydWxlIGZyb20gdGhlIFVuaWNvZGUgZGF0YWJhc2UgY29udGVudC4gU2V0dGluZwotIyB1cCBhIHByb3BlciBzdGFuZGFyZCBmb3IgdGhlIGJlaGF2aW9yIG9mIFVURi04IGNoYXJhY3RlciB0ZXJtaW5hbHMKLSMgd2lsbCByZXF1aXJlIGEgY2FyZWZ1bCBhbmFseXNpcyBub3Qgb25seSBvZiBlYWNoIFVuaWNvZGUgY2hhcmFjdGVyLAotIyBidXQgYWxzbyBvZiBlYWNoIHByZXNlbnRhdGlvbiBmb3JtLCBzb21ldGhpbmcgdGhlIGF1dGhvciBvZiB0aGVzZQotIyByb3V0aW5lcyBoYXMgYXZvaWRlZCB0byBkbyBzbyBmYXIuCi0jCi0jIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvdW5pY29kZS9yZXBvcnRzL3RyMTEvCi0jCi0jIE1hcmt1cyBLdWhuIC0tIDIwMDctMDUtMjYgKFVuaWNvZGUgNS4wKQotIwotIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCi0jIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuIFRoZSBhdXRob3IKLSMgZGlzY2xhaW1zIGFsbCB3YXJyYW50aWVzIHdpdGggcmVnYXJkIHRvIHRoaXMgc29mdHdhcmUuCi0jCi0jIExhdGVzdCBDIHZlcnNpb246IGh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35tZ2syNS91Y3Mvd2N3aWR0aC5jCi0KLSMgYXV4aWxpYXJ5IGZ1bmN0aW9uIGZvciBiaW5hcnkgc2VhcmNoIGluIGludGVydmFsIHRhYmxlCi0KLQotZGVmIGJpc2VhcmNoKHVjcywgdGFibGUpOgotICAgIG1pbiA9IDAKLSAgICBtYXggPSBsZW4odGFibGUpIC0gMQotICAgIGlmIHVjcyA8IHRhYmxlWzBdWzBdIG9yIHVjcyA+IHRhYmxlW21heF1bMV06Ci0gICAgICAgIHJldHVybiAwCi0gICAgd2hpbGUgbWF4ID49IG1pbjoKLSAgICAgICAgbWlkID0gaW50KChtaW4gKyBtYXgpIC8gMikKLSAgICAgICAgaWYgdWNzID4gdGFibGVbbWlkXVsxXToKLSAgICAgICAgICAgIG1pbiA9IG1pZCArIDEKLSAgICAgICAgZWxpZiB1Y3MgPCB0YWJsZVttaWRdWzBdOgotICAgICAgICAgICAgbWF4ID0gbWlkIC0gMQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIDEKLSAgICByZXR1cm4gMAotCi0KLSMgVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGRlZmluZSB0aGUgY29sdW1uIHdpZHRoIG9mIGFuIElTTyAxMDY0NgotIyBjaGFyYWN0ZXIgYXMgZm9sbG93czoKLSMKLSMgICAgLSBUaGUgbnVsbCBjaGFyYWN0ZXIgKFUrMDAwMCkgaGFzIGEgY29sdW1uIHdpZHRoIG9mIDAuCi0jCi0jICAgIC0gT3RoZXIgQzAvQzEgY29udHJvbCBjaGFyYWN0ZXJzIGFuZCBERUwgd2lsbCBsZWFkIHRvIGEgcmV0dXJuCi0jICAgICAgdmFsdWUgb2YgLTEuCi0jCi0jICAgIC0gTm9uLXNwYWNpbmcgYW5kIGVuY2xvc2luZyBjb21iaW5pbmcgY2hhcmFjdGVycyAoZ2VuZXJhbAotIyAgICAgIGNhdGVnb3J5IGNvZGUgTW4gb3IgTWUgaW4gdGhlIFVuaWNvZGUgZGF0YWJhc2UpIGhhdmUgYQotIyAgICAgIGNvbHVtbiB3aWR0aCBvZiAwLgotIwotIyAgICAtIFNPRlQgSFlQSEVOIChVKzAwQUQpIGhhcyBhIGNvbHVtbiB3aWR0aCBvZiAxLgotIwotIyAgICAtIE90aGVyIGZvcm1hdCBjaGFyYWN0ZXJzIChnZW5lcmFsIGNhdGVnb3J5IGNvZGUgQ2YgaW4gdGhlIFVuaWNvZGUKLSMgICAgICBkYXRhYmFzZSkgYW5kIFpFUk8gV0lEVEggU1BBQ0UgKFUrMjAwQikgaGF2ZSBhIGNvbHVtbiB3aWR0aCBvZiAwLgotIwotIyAgICAtIEhhbmd1bCBKYW1vIG1lZGlhbCB2b3dlbHMgYW5kIGZpbmFsIGNvbnNvbmFudHMgKFUrMTE2MC1VKzExRkYpCi0jICAgICAgaGF2ZSBhIGNvbHVtbiB3aWR0aCBvZiAwLgotIwotIyAgICAtIFNwYWNpbmcgY2hhcmFjdGVycyBpbiB0aGUgRWFzdCBBc2lhbiBXaWRlIChXKSBvciBFYXN0IEFzaWFuCi0jICAgICAgRnVsbC13aWR0aCAoRikgY2F0ZWdvcnkgYXMgZGVmaW5lZCBpbiBVbmljb2RlIFRlY2huaWNhbAotIyAgICAgIFJlcG9ydCAjMTEgaGF2ZSBhIGNvbHVtbiB3aWR0aCBvZiAyLgotIwotIyAgICAtIEFsbCByZW1haW5pbmcgY2hhcmFjdGVycyAoaW5jbHVkaW5nIGFsbCBwcmludGFibGUKLSMgICAgICBJU08gODg1OS0xIGFuZCBXR0w0IGNoYXJhY3RlcnMsIFVuaWNvZGUgY29udHJvbCBjaGFyYWN0ZXJzLAotIyAgICAgIGV0Yy4pIGhhdmUgYSBjb2x1bW4gd2lkdGggb2YgMS4KLSMKLSMgVGhpcyBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRoYXQgd2NoYXJfdCBjaGFyYWN0ZXJzIGFyZSBlbmNvZGVkCi0jIGluIElTTyAxMDY0Ni4KLQotIyBzb3J0ZWQgbGlzdCBvZiBub24tb3ZlcmxhcHBpbmcgaW50ZXJ2YWxzIG9mIG5vbi1zcGFjaW5nIGNoYXJhY3RlcnMKLSMgZ2VuZXJhdGVkIGJ5ICJ1bmlzZXQgK2NhdD1NZSArY2F0PU1uICtjYXQ9Q2YgLTAwQUQgKzExNjAtMTFGRiArMjAwQiBjIgotY29tYmluaW5nID0gKAotICAgICgweDAzMDAsIDB4MDM2RiksICgweDA0ODMsIDB4MDQ4NiksICgweDA0ODgsIDB4MDQ4OSksCi0gICAgKDB4MDU5MSwgMHgwNUJEKSwgKDB4MDVCRiwgMHgwNUJGKSwgKDB4MDVDMSwgMHgwNUMyKSwKLSAgICAoMHgwNUM0LCAweDA1QzUpLCAoMHgwNUM3LCAweDA1QzcpLCAoMHgwNjAwLCAweDA2MDMpLAotICAgICgweDA2MTAsIDB4MDYxNSksICgweDA2NEIsIDB4MDY1RSksICgweDA2NzAsIDB4MDY3MCksCi0gICAgKDB4MDZENiwgMHgwNkU0KSwgKDB4MDZFNywgMHgwNkU4KSwgKDB4MDZFQSwgMHgwNkVEKSwKLSAgICAoMHgwNzBGLCAweDA3MEYpLCAoMHgwNzExLCAweDA3MTEpLCAoMHgwNzMwLCAweDA3NEEpLAotICAgICgweDA3QTYsIDB4MDdCMCksICgweDA3RUIsIDB4MDdGMyksICgweDA5MDEsIDB4MDkwMiksCi0gICAgKDB4MDkzQywgMHgwOTNDKSwgKDB4MDk0MSwgMHgwOTQ4KSwgKDB4MDk0RCwgMHgwOTREKSwKLSAgICAoMHgwOTUxLCAweDA5NTQpLCAoMHgwOTYyLCAweDA5NjMpLCAoMHgwOTgxLCAweDA5ODEpLAotICAgICgweDA5QkMsIDB4MDlCQyksICgweDA5QzEsIDB4MDlDNCksICgweDA5Q0QsIDB4MDlDRCksCi0gICAgKDB4MDlFMiwgMHgwOUUzKSwgKDB4MEEwMSwgMHgwQTAyKSwgKDB4MEEzQywgMHgwQTNDKSwKLSAgICAoMHgwQTQxLCAweDBBNDIpLCAoMHgwQTQ3LCAweDBBNDgpLCAoMHgwQTRCLCAweDBBNEQpLAotICAgICgweDBBNzAsIDB4MEE3MSksICgweDBBODEsIDB4MEE4MiksICgweDBBQkMsIDB4MEFCQyksCi0gICAgKDB4MEFDMSwgMHgwQUM1KSwgKDB4MEFDNywgMHgwQUM4KSwgKDB4MEFDRCwgMHgwQUNEKSwKLSAgICAoMHgwQUUyLCAweDBBRTMpLCAoMHgwQjAxLCAweDBCMDEpLCAoMHgwQjNDLCAweDBCM0MpLAotICAgICgweDBCM0YsIDB4MEIzRiksICgweDBCNDEsIDB4MEI0MyksICgweDBCNEQsIDB4MEI0RCksCi0gICAgKDB4MEI1NiwgMHgwQjU2KSwgKDB4MEI4MiwgMHgwQjgyKSwgKDB4MEJDMCwgMHgwQkMwKSwKLSAgICAoMHgwQkNELCAweDBCQ0QpLCAoMHgwQzNFLCAweDBDNDApLCAoMHgwQzQ2LCAweDBDNDgpLAotICAgICgweDBDNEEsIDB4MEM0RCksICgweDBDNTUsIDB4MEM1NiksICgweDBDQkMsIDB4MENCQyksCi0gICAgKDB4MENCRiwgMHgwQ0JGKSwgKDB4MENDNiwgMHgwQ0M2KSwgKDB4MENDQywgMHgwQ0NEKSwKLSAgICAoMHgwQ0UyLCAweDBDRTMpLCAoMHgwRDQxLCAweDBENDMpLCAoMHgwRDRELCAweDBENEQpLAotICAgICgweDBEQ0EsIDB4MERDQSksICgweDBERDIsIDB4MERENCksICgweDBERDYsIDB4MERENiksCi0gICAgKDB4MEUzMSwgMHgwRTMxKSwgKDB4MEUzNCwgMHgwRTNBKSwgKDB4MEU0NywgMHgwRTRFKSwKLSAgICAoMHgwRUIxLCAweDBFQjEpLCAoMHgwRUI0LCAweDBFQjkpLCAoMHgwRUJCLCAweDBFQkMpLAotICAgICgweDBFQzgsIDB4MEVDRCksICgweDBGMTgsIDB4MEYxOSksICgweDBGMzUsIDB4MEYzNSksCi0gICAgKDB4MEYzNywgMHgwRjM3KSwgKDB4MEYzOSwgMHgwRjM5KSwgKDB4MEY3MSwgMHgwRjdFKSwKLSAgICAoMHgwRjgwLCAweDBGODQpLCAoMHgwRjg2LCAweDBGODcpLCAoMHgwRjkwLCAweDBGOTcpLAotICAgICgweDBGOTksIDB4MEZCQyksICgweDBGQzYsIDB4MEZDNiksICgweDEwMkQsIDB4MTAzMCksCi0gICAgKDB4MTAzMiwgMHgxMDMyKSwgKDB4MTAzNiwgMHgxMDM3KSwgKDB4MTAzOSwgMHgxMDM5KSwKLSAgICAoMHgxMDU4LCAweDEwNTkpLCAoMHgxMTYwLCAweDExRkYpLCAoMHgxMzVGLCAweDEzNUYpLAotICAgICgweDE3MTIsIDB4MTcxNCksICgweDE3MzIsIDB4MTczNCksICgweDE3NTIsIDB4MTc1MyksCi0gICAgKDB4MTc3MiwgMHgxNzczKSwgKDB4MTdCNCwgMHgxN0I1KSwgKDB4MTdCNywgMHgxN0JEKSwKLSAgICAoMHgxN0M2LCAweDE3QzYpLCAoMHgxN0M5LCAweDE3RDMpLCAoMHgxN0RELCAweDE3REQpLAotICAgICgweDE4MEIsIDB4MTgwRCksICgweDE4QTksIDB4MThBOSksICgweDE5MjAsIDB4MTkyMiksCi0gICAgKDB4MTkyNywgMHgxOTI4KSwgKDB4MTkzMiwgMHgxOTMyKSwgKDB4MTkzOSwgMHgxOTNCKSwKLSAgICAoMHgxQTE3LCAweDFBMTgpLCAoMHgxQjAwLCAweDFCMDMpLCAoMHgxQjM0LCAweDFCMzQpLAotICAgICgweDFCMzYsIDB4MUIzQSksICgweDFCM0MsIDB4MUIzQyksICgweDFCNDIsIDB4MUI0MiksCi0gICAgKDB4MUI2QiwgMHgxQjczKSwgKDB4MURDMCwgMHgxRENBKSwgKDB4MURGRSwgMHgxREZGKSwKLSAgICAoMHgyMDBCLCAweDIwMEYpLCAoMHgyMDJBLCAweDIwMkUpLCAoMHgyMDYwLCAweDIwNjMpLAotICAgICgweDIwNkEsIDB4MjA2RiksICgweDIwRDAsIDB4MjBFRiksICgweDMwMkEsIDB4MzAyRiksCi0gICAgKDB4MzA5OSwgMHgzMDlBKSwgKDB4QTgwNiwgMHhBODA2KSwgKDB4QTgwQiwgMHhBODBCKSwKLSAgICAoMHhBODI1LCAweEE4MjYpLCAoMHhGQjFFLCAweEZCMUUpLCAoMHhGRTAwLCAweEZFMEYpLAotICAgICgweEZFMjAsIDB4RkUyMyksICgweEZFRkYsIDB4RkVGRiksICgweEZGRjksIDB4RkZGQiksCi0gICAgKDB4MTBBMDEsIDB4MTBBMDMpLCAoMHgxMEEwNSwgMHgxMEEwNiksICgweDEwQTBDLCAweDEwQTBGKSwKLSAgICAoMHgxMEEzOCwgMHgxMEEzQSksICgweDEwQTNGLCAweDEwQTNGKSwgKDB4MUQxNjcsIDB4MUQxNjkpLAotICAgICgweDFEMTczLCAweDFEMTgyKSwgKDB4MUQxODUsIDB4MUQxOEIpLCAoMHgxRDFBQSwgMHgxRDFBRCksCi0gICAgKDB4MUQyNDIsIDB4MUQyNDQpLCAoMHhFMDAwMSwgMHhFMDAwMSksICgweEUwMDIwLCAweEUwMDdGKSwKLSAgICAoMHhFMDEwMCwgMHhFMDFFRikKLSkKLQotCi0jIHNvcnRlZCBsaXN0IG9mIG5vbi1vdmVybGFwcGluZyBpbnRlcnZhbHMgb2YgRWFzdCBBc2lhbiBBbWJpZ3VvdXMKLSMgY2hhcmFjdGVycywgZ2VuZXJhdGVkIGJ5ICJ1bmlzZXQgK1dJRFRILUEgLWNhdD1NZSAtY2F0PU1uIC1jYXQ9Q2YgYyIKLWFtYmlndW91cyA9ICgKLSAgICAoMHgwMEExLCAweDAwQTEpLCAoMHgwMEE0LCAweDAwQTQpLCAoMHgwMEE3LCAweDAwQTgpLAotICAgICgweDAwQUEsIDB4MDBBQSksICgweDAwQUUsIDB4MDBBRSksICgweDAwQjAsIDB4MDBCNCksCi0gICAgKDB4MDBCNiwgMHgwMEJBKSwgKDB4MDBCQywgMHgwMEJGKSwgKDB4MDBDNiwgMHgwMEM2KSwKLSAgICAoMHgwMEQwLCAweDAwRDApLCAoMHgwMEQ3LCAweDAwRDgpLCAoMHgwMERFLCAweDAwRTEpLAotICAgICgweDAwRTYsIDB4MDBFNiksICgweDAwRTgsIDB4MDBFQSksICgweDAwRUMsIDB4MDBFRCksCi0gICAgKDB4MDBGMCwgMHgwMEYwKSwgKDB4MDBGMiwgMHgwMEYzKSwgKDB4MDBGNywgMHgwMEZBKSwKLSAgICAoMHgwMEZDLCAweDAwRkMpLCAoMHgwMEZFLCAweDAwRkUpLCAoMHgwMTAxLCAweDAxMDEpLAotICAgICgweDAxMTEsIDB4MDExMSksICgweDAxMTMsIDB4MDExMyksICgweDAxMUIsIDB4MDExQiksCi0gICAgKDB4MDEyNiwgMHgwMTI3KSwgKDB4MDEyQiwgMHgwMTJCKSwgKDB4MDEzMSwgMHgwMTMzKSwKLSAgICAoMHgwMTM4LCAweDAxMzgpLCAoMHgwMTNGLCAweDAxNDIpLCAoMHgwMTQ0LCAweDAxNDQpLAotICAgICgweDAxNDgsIDB4MDE0QiksICgweDAxNEQsIDB4MDE0RCksICgweDAxNTIsIDB4MDE1MyksCi0gICAgKDB4MDE2NiwgMHgwMTY3KSwgKDB4MDE2QiwgMHgwMTZCKSwgKDB4MDFDRSwgMHgwMUNFKSwKLSAgICAoMHgwMUQwLCAweDAxRDApLCAoMHgwMUQyLCAweDAxRDIpLCAoMHgwMUQ0LCAweDAxRDQpLAotICAgICgweDAxRDYsIDB4MDFENiksICgweDAxRDgsIDB4MDFEOCksICgweDAxREEsIDB4MDFEQSksCi0gICAgKDB4MDFEQywgMHgwMURDKSwgKDB4MDI1MSwgMHgwMjUxKSwgKDB4MDI2MSwgMHgwMjYxKSwKLSAgICAoMHgwMkM0LCAweDAyQzQpLCAoMHgwMkM3LCAweDAyQzcpLCAoMHgwMkM5LCAweDAyQ0IpLAotICAgICgweDAyQ0QsIDB4MDJDRCksICgweDAyRDAsIDB4MDJEMCksICgweDAyRDgsIDB4MDJEQiksCi0gICAgKDB4MDJERCwgMHgwMkREKSwgKDB4MDJERiwgMHgwMkRGKSwgKDB4MDM5MSwgMHgwM0ExKSwKLSAgICAoMHgwM0EzLCAweDAzQTkpLCAoMHgwM0IxLCAweDAzQzEpLCAoMHgwM0MzLCAweDAzQzkpLAotICAgICgweDA0MDEsIDB4MDQwMSksICgweDA0MTAsIDB4MDQ0RiksICgweDA0NTEsIDB4MDQ1MSksCi0gICAgKDB4MjAxMCwgMHgyMDEwKSwgKDB4MjAxMywgMHgyMDE2KSwgKDB4MjAxOCwgMHgyMDE5KSwKLSAgICAoMHgyMDFDLCAweDIwMUQpLCAoMHgyMDIwLCAweDIwMjIpLCAoMHgyMDI0LCAweDIwMjcpLAotICAgICgweDIwMzAsIDB4MjAzMCksICgweDIwMzIsIDB4MjAzMyksICgweDIwMzUsIDB4MjAzNSksCi0gICAgKDB4MjAzQiwgMHgyMDNCKSwgKDB4MjAzRSwgMHgyMDNFKSwgKDB4MjA3NCwgMHgyMDc0KSwKLSAgICAoMHgyMDdGLCAweDIwN0YpLCAoMHgyMDgxLCAweDIwODQpLCAoMHgyMEFDLCAweDIwQUMpLAotICAgICgweDIxMDMsIDB4MjEwMyksICgweDIxMDUsIDB4MjEwNSksICgweDIxMDksIDB4MjEwOSksCi0gICAgKDB4MjExMywgMHgyMTEzKSwgKDB4MjExNiwgMHgyMTE2KSwgKDB4MjEyMSwgMHgyMTIyKSwKLSAgICAoMHgyMTI2LCAweDIxMjYpLCAoMHgyMTJCLCAweDIxMkIpLCAoMHgyMTUzLCAweDIxNTQpLAotICAgICgweDIxNUIsIDB4MjE1RSksICgweDIxNjAsIDB4MjE2QiksICgweDIxNzAsIDB4MjE3OSksCi0gICAgKDB4MjE5MCwgMHgyMTk5KSwgKDB4MjFCOCwgMHgyMUI5KSwgKDB4MjFEMiwgMHgyMUQyKSwKLSAgICAoMHgyMUQ0LCAweDIxRDQpLCAoMHgyMUU3LCAweDIxRTcpLCAoMHgyMjAwLCAweDIyMDApLAotICAgICgweDIyMDIsIDB4MjIwMyksICgweDIyMDcsIDB4MjIwOCksICgweDIyMEIsIDB4MjIwQiksCi0gICAgKDB4MjIwRiwgMHgyMjBGKSwgKDB4MjIxMSwgMHgyMjExKSwgKDB4MjIxNSwgMHgyMjE1KSwKLSAgICAoMHgyMjFBLCAweDIyMUEpLCAoMHgyMjFELCAweDIyMjApLCAoMHgyMjIzLCAweDIyMjMpLAotICAgICgweDIyMjUsIDB4MjIyNSksICgweDIyMjcsIDB4MjIyQyksICgweDIyMkUsIDB4MjIyRSksCi0gICAgKDB4MjIzNCwgMHgyMjM3KSwgKDB4MjIzQywgMHgyMjNEKSwgKDB4MjI0OCwgMHgyMjQ4KSwKLSAgICAoMHgyMjRDLCAweDIyNEMpLCAoMHgyMjUyLCAweDIyNTIpLCAoMHgyMjYwLCAweDIyNjEpLAotICAgICgweDIyNjQsIDB4MjI2NyksICgweDIyNkEsIDB4MjI2QiksICgweDIyNkUsIDB4MjI2RiksCi0gICAgKDB4MjI4MiwgMHgyMjgzKSwgKDB4MjI4NiwgMHgyMjg3KSwgKDB4MjI5NSwgMHgyMjk1KSwKLSAgICAoMHgyMjk5LCAweDIyOTkpLCAoMHgyMkE1LCAweDIyQTUpLCAoMHgyMkJGLCAweDIyQkYpLAotICAgICgweDIzMTIsIDB4MjMxMiksICgweDI0NjAsIDB4MjRFOSksICgweDI0RUIsIDB4MjU0QiksCi0gICAgKDB4MjU1MCwgMHgyNTczKSwgKDB4MjU4MCwgMHgyNThGKSwgKDB4MjU5MiwgMHgyNTk1KSwKLSAgICAoMHgyNUEwLCAweDI1QTEpLCAoMHgyNUEzLCAweDI1QTkpLCAoMHgyNUIyLCAweDI1QjMpLAotICAgICgweDI1QjYsIDB4MjVCNyksICgweDI1QkMsIDB4MjVCRCksICgweDI1QzAsIDB4MjVDMSksCi0gICAgKDB4MjVDNiwgMHgyNUM4KSwgKDB4MjVDQiwgMHgyNUNCKSwgKDB4MjVDRSwgMHgyNUQxKSwKLSAgICAoMHgyNUUyLCAweDI1RTUpLCAoMHgyNUVGLCAweDI1RUYpLCAoMHgyNjA1LCAweDI2MDYpLAotICAgICgweDI2MDksIDB4MjYwOSksICgweDI2MEUsIDB4MjYwRiksICgweDI2MTQsIDB4MjYxNSksCi0gICAgKDB4MjYxQywgMHgyNjFDKSwgKDB4MjYxRSwgMHgyNjFFKSwgKDB4MjY0MCwgMHgyNjQwKSwKLSAgICAoMHgyNjQyLCAweDI2NDIpLCAoMHgyNjYwLCAweDI2NjEpLCAoMHgyNjYzLCAweDI2NjUpLAotICAgICgweDI2NjcsIDB4MjY2QSksICgweDI2NkMsIDB4MjY2RCksICgweDI2NkYsIDB4MjY2RiksCi0gICAgKDB4MjczRCwgMHgyNzNEKSwgKDB4Mjc3NiwgMHgyNzdGKSwgKDB4RTAwMCwgMHhGOEZGKSwKLSAgICAoMHhGRkZELCAweEZGRkQpLCAoMHhGMDAwMCwgMHhGRkZGRCksICgweDEwMDAwMCwgMHgxMEZGRkQpCi0pCi0KLQotZGVmIG1rX3djd2lkdGgodWNzKToKLSAgICAjIHRlc3QgZm9yIDgtYml0IGNvbnRyb2wgY2hhcmFjdGVycwotICAgIGlmIHVjcyA9PSAwOgotICAgICAgICByZXR1cm4gMAotICAgIGlmIHVjcyA8IDMyIG9yICh1Y3MgPj0gMHg3ZiBhbmQgdWNzIDwgMHhhMCk6Ci0gICAgICAgIHJldHVybiAtMQotCi0gICAgIyBiaW5hcnkgc2VhcmNoIGluIHRhYmxlIG9mIG5vbi1zcGFjaW5nIGNoYXJhY3RlcnMKLSAgICBpZiBiaXNlYXJjaCh1Y3MsIGNvbWJpbmluZyk6Ci0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIGlmIHdlIGFycml2ZSBoZXJlLCB1Y3MgaXMgbm90IGEgY29tYmluaW5nIG9yIEMwL0MxIGNvbnRyb2wgY2hhcmFjdGVyCi0KLSAgICByZXR1cm4gMSArIGludCgKLSAgICAgICAgdWNzID49IDB4MTEwMAotICAgICAgICBhbmQgKHVjcyA8PSAweDExNWYgICAgICAgICAgICAgICAgICAgICMgSGFuZ3VsIEphbW8gaW5pdC4gY29uc29uYW50cwotICAgICAgICAgICAgIG9yIHVjcyA9PSAweDIzMjkgb3IgdWNzID09IDB4MjMyYQotICAgICAgICAgICAgIG9yICh1Y3MgPj0gMHgyZTgwIGFuZCB1Y3MgPD0gMHhhNGNmCi0gICAgICAgICAgICAgICAgIGFuZCB1Y3MgIT0gMHgzMDNmKSAgICAgICAgICAgICAgICAjIENKSyAuLi4gWWkKLSAgICAgICAgICAgICBvciAodWNzID49IDB4YWMwMCBhbmQgdWNzIDw9IDB4ZDdhMykgICMgSGFuZ3VsIFN5bGxhYmxlcwotICAgICAgICAgICAgIG9yICh1Y3MgPj0gMHhmOTAwIGFuZCB1Y3MgPD0gMHhmYWZmKSAgIyBDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzCi0gICAgICAgICAgICAgb3IgKHVjcyA+PSAweGZlMTAgYW5kIHVjcyA8PSAweGZlMTkpICAjIFZlcnRpY2FsIGZvcm1zCi0gICAgICAgICAgICAgb3IgKHVjcyA+PSAweGZlMzAgYW5kIHVjcyA8PSAweGZlNmYpICAjIENKSyBDb21wYXRpYmlsaXR5IEZvcm1zCi0gICAgICAgICAgICAgb3IgKHVjcyA+PSAweGZmMDAgYW5kIHVjcyA8PSAweGZmNjApICAjIEZ1bGx3aWR0aCBGb3JtcwotICAgICAgICAgICAgIG9yICh1Y3MgPj0gMHhmZmUwIGFuZCB1Y3MgPD0gMHhmZmU2KQotICAgICAgICAgICAgIG9yICh1Y3MgPj0gMHgyMDAwMCBhbmQgdWNzIDw9IDB4MmZmZmQpCi0gICAgICAgICAgICAgb3IgKHVjcyA+PSAweDMwMDAwIGFuZCB1Y3MgPD0gMHgzZmZmZCkpCi0gICAgKQotCi0KLWRlZiBta193Y3N3aWR0aChwd2NzKToKLSAgICB3aWR0aCA9IDAKLSAgICBmb3IgYyBpbiBwd2NzOgotICAgICAgICB3ID0gbWtfd2N3aWR0aChjKQotICAgICAgICBpZiB3IDwgMDoKLSAgICAgICAgICAgIHJldHVybiAtMQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgd2lkdGggKz0gdwotCi0gICAgcmV0dXJuIHdpZHRoCi0KLQotIyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgdGhlIHNhbWUgYXMgbWtfd2N3aWR0aCgpIGFuZAotIyBta193Y3N3aWR0aCgpLCBleGNlcHQgdGhhdCBzcGFjaW5nIGNoYXJhY3RlcnMgaW4gdGhlIEVhc3QgQXNpYW4KLSMgQW1iaWd1b3VzIChBKSBjYXRlZ29yeSBhcyBkZWZpbmVkIGluIFVuaWNvZGUgVGVjaG5pY2FsIFJlcG9ydCAjMTEKLSMgaGF2ZSBhIGNvbHVtbiB3aWR0aCBvZiAyLiBUaGlzIHZhcmlhbnQgbWlnaHQgYmUgdXNlZnVsIGZvciB1c2VycyBvZgotIyBDSksgbGVnYWN5IGVuY29kaW5ncyB3aG8gd2FudCB0byBtaWdyYXRlIHRvIFVDUyB3aXRob3V0IGNoYW5naW5nCi0jIHRoZSB0cmFkaXRpb25hbCB0ZXJtaW5hbCBjaGFyYWN0ZXItd2lkdGggYmVoYXZpb3VyLiBJdCBpcyBub3QKLSMgb3RoZXJ3aXNlIHJlY29tbWVuZGVkIGZvciBnZW5lcmFsIHVzZS4KLWRlZiBta193Y3dpZHRoX2Nqayh1Y3MpOgotICAgICMgYmluYXJ5IHNlYXJjaCBpbiB0YWJsZSBvZiBub24tc3BhY2luZyBjaGFyYWN0ZXJzCi0gICAgaWYgYmlzZWFyY2godWNzLCBhbWJpZ3VvdXMpOgotICAgICAgICByZXR1cm4gMgotCi0gICAgcmV0dXJuIG1rX3djd2lkdGgodWNzKQotCi0KLWRlZiBta193Y3N3aWR0aF9jamsocHdjcyk6Ci0gICAgd2lkdGggPSAwCi0KLSAgICBmb3IgYyBpbiBwd2NzOgotICAgICAgICB3ID0gbWtfd2N3aWR0aF9jamsoYykKLSAgICAgICAgaWYgdyA8IDA6Ci0gICAgICAgICAgICByZXR1cm4gLTEKLSAgICAgICAgd2lkdGggKz0gdwotCi0gICAgcmV0dXJuIHdpZHRoCi0KLSMgcHl0aG9uLXkgdmVyc2lvbnMsIGRlYWxpbmcgd2l0aCB1bmljb2RlIG9iamVjdHMKLQotCi1kZWYgd2N3aWR0aChjKToKLSAgICByZXR1cm4gbWtfd2N3aWR0aChvcmQoYykpCi0KLQotZGVmIHdjc3dpZHRoKHMpOgotICAgIHJldHVybiBta193Y3N3aWR0aChsaXN0KG1hcChvcmQsIHMpKSkKLQotCi1kZWYgd2N3aWR0aF9jamsoYyk6Ci0gICAgcmV0dXJuIG1rX3djd2lkdGhfY2prKG9yZChjKSkKLQotCi1kZWYgd2Nzd2lkdGhfY2prKHMpOgotICAgIHJldHVybiBta193Y3N3aWR0aF9jamsobGlzdChtYXAob3JkLCBzKSkpCi0KLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBzYW1wbGVzID0gKAotICAgICAgICAoJ01VU0lDIFNIQVJQIFNJR04nLCAxKSwKLSAgICAgICAgKCdGVUxMV0lEVEggUE9VTkQgU0lHTicsIDIpLAotICAgICAgICAoJ0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBQJywgMiksCi0gICAgICAgICgnQ0pLIFJBRElDQUwgQk9MVCBPRiBDTE9USCcsIDIpLAotICAgICAgICAoJ0xBVElOIFNNQUxMIExFVFRFUiBBJywgMSksCi0gICAgICAgICgnTEFUSU4gU01BTEwgTEVUVEVSIEFFJywgMSksCi0gICAgICAgICgnU1BBQ0UnLCAxKSwKLSAgICAgICAgKCdOTy1CUkVBSyBTUEFDRScsIDEpLAotICAgICAgICAoJ0NKSyBDT01QQVRJQklMSVRZIElERU9HUkFQSC1GOTIwJywgMiksCi0gICAgICAgICgnTUFMQVlBTEFNIFZPV0VMIFNJR04gVVUnLCAwKSwKLSAgICAgICAgKCdaRVJPIFdJRFRIIFNQQUNFJywgMCksCi0gICAgICAgICgnWkVSTyBXSURUSCBOTy1CUkVBSyBTUEFDRScsIDApLAotICAgICAgICAoJ0NPTUJJTklORyBQQUxBVEFMSVpFRCBIT09LIEJFTE9XJywgMCksCi0gICAgICAgICgnQ09NQklOSU5HIEdSQVZFIEFDQ0VOVCcsIDApLAotICAgICkKLSAgICBub25wcmludGluZyA9ICdcclxuXHRcYVxiXGZcdlx4N2YnCi0KLSAgICBpbXBvcnQgdW5pY29kZWRhdGEKLQotICAgIGZvciBuYW1lLCBwcmludHdpZHRoIGluIHNhbXBsZXM6Ci0gICAgICAgIHVjaHIgPSB1bmljb2RlZGF0YS5sb29rdXAobmFtZSkKLSAgICAgICAgY2FsY3VsYXRlZHdpZHRoID0gd2N3aWR0aCh1Y2hyKQotICAgICAgICBhc3NlcnQgY2FsY3VsYXRlZHdpZHRoID09IHByaW50d2lkdGgsIFwKLSAgICAgICAgICAgICd3aWR0aCBmb3IgJXIgc2hvdWxkIGJlICVkLCBidXQgaXMgJWQ/JyAlICh1Y2hyLCBwcmludHdpZHRoLCBjYWxjdWxhdGVkd2lkdGgpCi0KLSAgICBmb3IgYyBpbiBub25wcmludGluZzoKLSAgICAgICAgY2FsY3VsYXRlZHdpZHRoID0gd2N3aWR0aChjKQotICAgICAgICBhc3NlcnQgY2FsY3VsYXRlZHdpZHRoIDwgMCwgXAotICAgICAgICAgICAgJyVyIGlzIGEgY29udHJvbCBjaGFyYWN0ZXIsIGJ1dCB3Y3dpZHRoIGdpdmVzICVkJyAlIChjLCBjYWxjdWxhdGVkd2lkdGgpCi0KLSAgICBhc3NlcnQgd2N3aWR0aCgnXDAnKSA9PSAwICAjIHNwZWNpYWwgY2FzZQotCi0gICAgIyBkZXBlbmRpbmcgb24gaG93IHB5dGhvbiBpcyBjb21waWxlZCwgY29kZSBwb2ludHMgYWJvdmUgVStGRkZGIG1heSBub3QgYmUKLSAgICAjIHRyZWF0ZWQgYXMgc2luZ2xlIGNoYXJhY3RlcnMsIHNvIG9yZCgpIHdvbid0IHdvcmsuIHRlc3QgYSBmZXcgb2YgdGhlc2UKLSAgICAjIG1hbnVhbGx5LgotCi0gICAgYXNzZXJ0IG1rX3djd2lkdGgoMHhlMDFlZikgPT0gMAotICAgIGFzc2VydCBta193Y3dpZHRoKDB4MTBmZmZmKSA9PSAxCi0gICAgYXNzZXJ0IG1rX3djd2lkdGgoMHgzZmZmZCkgPT0gMgotCi0gICAgdGVzdHN0ciA9ICdCXDBpZyBiclx1MDBmOHduIG1vb3NlXHViMTQzXHUyMDBiJwotICAgIGNhbGN1bGF0ZWR3aWR0aCA9IHdjc3dpZHRoKHRlc3RzdHIpCi0gICAgYXNzZXJ0IGNhbGN1bGF0ZWR3aWR0aCA9PSAxNywgJ2V4cGVjdGVkIDE3LCBnb3QgJWQnICUgY2FsY3VsYXRlZHdpZHRoCi0KLSAgICBjYWxjdWxhdGVkd2lkdGggPSB3Y3N3aWR0aF9jamsodGVzdHN0cikKLSAgICBhc3NlcnQgY2FsY3VsYXRlZHdpZHRoID09IDE4LCAnZXhwZWN0ZWQgMTgsIGdvdCAlZCcgJSBjYWxjdWxhdGVkd2lkdGgKLQotICAgIGFzc2VydCB3Y3N3aWR0aCgnZm9vYmFyXHUyMDBiXGEnKSA8IDAKLQotICAgIHByaW50KCd0ZXN0cyBwYXNzLicpCmRpZmYgLS1naXQgYS9weWxpYi9yZXF1aXJlbWVudHMudHh0IGIvcHlsaWIvcmVxdWlyZW1lbnRzLnR4dAppbmRleCBjMDMwNDYwLi4zNzlmNmFlIDEwMDY0NAotLS0gYS9weWxpYi9yZXF1aXJlbWVudHMudHh0CisrKyBiL3B5bGliL3JlcXVpcmVtZW50cy50eHQKQEAgLTMsMyArMyw0IEBACiAtZSBnaXQraHR0cHM6Ly9naXRodWIuY29tL3JpcHRhbm8vY2NtLmdpdEBjYXNzYW5kcmEtdGVzdCNlZ2c9Y2NtCiBjb3ZlcmFnZQogcHl0ZXN0Cit3Y3dpZHRoCmRpZmYgLS1naXQgYS9weWxpYi9zZXR1cC5weSBiL3B5bGliL3NldHVwLnB5CmluZGV4IGE5ZjY1NGEuLmY1ZmQxODQgMTAwNzU1Ci0tLSBhL3B5bGliL3NldHVwLnB5CisrKyBiL3B5bGliL3NldHVwLnB5CkBAIC0xLDQgKzEsNCBAQAotIyEvdXNyL2Jpbi9weXRob24KKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKICMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KZGlmZiAtLWdpdCBhL3JlZGhhdC9jYXNzYW5kcmEuc3BlYyBiL3JlZGhhdC9jYXNzYW5kcmEuc3BlYwppbmRleCA3NDMxYzFjLi5hZTVhZDRjIDEwMDY0NAotLS0gYS9yZWRoYXQvY2Fzc2FuZHJhLnNwZWMKKysrIGIvcmVkaGF0L2Nhc3NhbmRyYS5zcGVjCkBAIC0xNyw4ICsxNyw4IEBACiAjCiAKICVkZWZpbmUgX19qYXJfcmVwYWNrICV7bmlsfQotIyBUdXJuIG9mZiB0aGUgYnJwLXB5dGhvbi1ieXRlY29tcGlsZSBzY3JpcHQKLSVnbG9iYWwgX19vc19pbnN0YWxsX3Bvc3QgJShlY2hvICcle19fb3NfaW5zdGFsbF9wb3N0fScgfCBzZWQgLWUgJ3MhL3Vzci9saWJbXls6c3BhY2U6XV0qL2JycC1weXRob24tYnl0ZWNvbXBpbGVbWzpzcGFjZTpdXS4qJCEhZycpCisjIFR1cm4gb2ZmIHRoZSBicnAtcHl0aG9uLWJ5dGVjb21waWxlIHNjcmlwdCBhbmQgbWFuZ2xpbmcgc2hlYmFuZ3MgZm9yIFB5dGhvbiBzY3JpcHRzCislZ2xvYmFsIF9fb3NfaW5zdGFsbF9wb3N0ICUoZWNobyAnJXtfX29zX2luc3RhbGxfcG9zdH0nIHwgc2VkIC1lICdzIS91c3IvbGliW15bOnNwYWNlOl1dKi9icnAtcHl0aG9uLWJ5dGVjb21waWxlW1s6c3BhY2U6XV0uKiQhIWcnIC1lICdzIS91c3IvbGliW15bOnNwYWNlOl1dKi9icnAtbWFuZ2xlLXNoZWJhbmdzW1s6c3BhY2U6XV0uKiQhIWcnKQogCiAjIHJwbWJ1aWxkIHNob3VsZCBub3QgYmFyZiB3aGVuIGl0IHNwb3RzIHdlIHNoaXAKICMgYmluYXJ5IGV4ZWN1dGFibGUgZmlsZXMgaW4gb3VyICdub2FyY2gnIHBhY2thZ2UKQEAgLTE2MSw5ICsxNjEsOSBAQAogJXtfc3lzY29uZmRpcn0vc2VjdXJpdHkvbGltaXRzLmQvJXt1c2VybmFtZX0uY29uZgogL3Vzci9zaGFyZS8le3VzZXJuYW1lfSoKICVjb25maWcobm9yZXBsYWNlKSAvJXtfc3lzY29uZmRpcn0vJXt1c2VybmFtZX0KLSVhdHRyKDc1NSwle3VzZXJuYW1lfSwle3VzZXJuYW1lfSkgJWNvbmZpZyhub3JlcGxhY2UpIC92YXIvbGliLyV7dXNlcm5hbWV9LyoKLSVhdHRyKDc1NSwle3VzZXJuYW1lfSwle3VzZXJuYW1lfSkgL3Zhci9sb2cvJXt1c2VybmFtZX0qCi0lYXR0cig3NTUsJXt1c2VybmFtZX0sJXt1c2VybmFtZX0pIC92YXIvcnVuLyV7dXNlcm5hbWV9KgorJWF0dHIoNzUwLCV7dXNlcm5hbWV9LCV7dXNlcm5hbWV9KSAlY29uZmlnKG5vcmVwbGFjZSkgL3Zhci9saWIvJXt1c2VybmFtZX0vKgorJWF0dHIoNzUwLCV7dXNlcm5hbWV9LCV7dXNlcm5hbWV9KSAvdmFyL2xvZy8le3VzZXJuYW1lfSoKKyVhdHRyKDc1MCwle3VzZXJuYW1lfSwle3VzZXJuYW1lfSkgL3Zhci9ydW4vJXt1c2VybmFtZX0qCiAle3B5dGhvbl9zaXRlbGlifS9jcWxzaGxpYi8KICV7cHl0aG9uX3NpdGVsaWJ9L2Nhc3NhbmRyYV9weWxpYiouZWdnLWluZm8KIApAQCAtMTk4LDYgKzE5OCw3IEBACiAlYXR0cig3NTUscm9vdCxyb290KSAle19iaW5kaXJ9L3NzdGFibGVvZmZsaW5lcmVsZXZlbAogJWF0dHIoNzU1LHJvb3Qscm9vdCkgJXtfYmluZGlyfS9zc3RhYmxlcmVwYWlyZWRzZXQKICVhdHRyKDc1NSxyb290LHJvb3QpICV7X2JpbmRpcn0vc3N0YWJsZXNwbGl0CislYXR0cig3NTUscm9vdCxyb290KSAle19iaW5kaXJ9L3NzdGFibGVwYXJ0aXRpb25zCiAlYXR0cig3NTUscm9vdCxyb290KSAle19iaW5kaXJ9L2F1ZGl0bG9ndmlld2VyCiAlYXR0cig3NTUscm9vdCxyb290KSAle19iaW5kaXJ9L2pteHRvb2wKICVhdHRyKDc1NSxyb290LHJvb3QpICV7X2JpbmRpcn0vZnFsdG9vbApkaWZmIC0tZ2l0IGEvcmVkaGF0L25vYm9vbGVhbi9jYXNzYW5kcmEuc3BlYyBiL3JlZGhhdC9ub2Jvb2xlYW4vY2Fzc2FuZHJhLnNwZWMKaW5kZXggYTNhYmFhNi4uMmI2Y2RkNCAxMDA2NDQKLS0tIGEvcmVkaGF0L25vYm9vbGVhbi9jYXNzYW5kcmEuc3BlYworKysgYi9yZWRoYXQvbm9ib29sZWFuL2Nhc3NhbmRyYS5zcGVjCkBAIC0xNyw4ICsxNyw4IEBACiAjCiAKICVkZWZpbmUgX19qYXJfcmVwYWNrICV7bmlsfQotIyBUdXJuIG9mZiB0aGUgYnJwLXB5dGhvbi1ieXRlY29tcGlsZSBzY3JpcHQKLSVnbG9iYWwgX19vc19pbnN0YWxsX3Bvc3QgJShlY2hvICcle19fb3NfaW5zdGFsbF9wb3N0fScgfCBzZWQgLWUgJ3MhL3Vzci9saWJbXls6c3BhY2U6XV0qL2JycC1weXRob24tYnl0ZWNvbXBpbGVbWzpzcGFjZTpdXS4qJCEhZycpCisjIFR1cm4gb2ZmIHRoZSBicnAtcHl0aG9uLWJ5dGVjb21waWxlIHNjcmlwdCBhbmQgbWFuZ2xpbmcgc2hlYmFuZ3MgZm9yIFB5dGhvbiBzY3JpcHRzCislZ2xvYmFsIF9fb3NfaW5zdGFsbF9wb3N0ICUoZWNobyAnJXtfX29zX2luc3RhbGxfcG9zdH0nIHwgc2VkIC1lICdzIS91c3IvbGliW15bOnNwYWNlOl1dKi9icnAtcHl0aG9uLWJ5dGVjb21waWxlW1s6c3BhY2U6XV0uKiQhIWcnIC1lICdzIS91c3IvbGliW15bOnNwYWNlOl1dKi9icnAtbWFuZ2xlLXNoZWJhbmdzW1s6c3BhY2U6XV0uKiQhIWcnKQogCiAjIHJwbWJ1aWxkIHNob3VsZCBub3QgYmFyZiB3aGVuIGl0IHNwb3RzIHdlIHNoaXAKICMgYmluYXJ5IGV4ZWN1dGFibGUgZmlsZXMgaW4gb3VyICdub2FyY2gnIHBhY2thZ2UKQEAgLTE2MSw5ICsxNjEsOSBAQAogJXtfc3lzY29uZmRpcn0vc2VjdXJpdHkvbGltaXRzLmQvJXt1c2VybmFtZX0uY29uZgogL3Vzci9zaGFyZS8le3VzZXJuYW1lfSoKICVjb25maWcobm9yZXBsYWNlKSAvJXtfc3lzY29uZmRpcn0vJXt1c2VybmFtZX0KLSVhdHRyKDc1NSwle3VzZXJuYW1lfSwle3VzZXJuYW1lfSkgJWNvbmZpZyhub3JlcGxhY2UpIC92YXIvbGliLyV7dXNlcm5hbWV9LyoKLSVhdHRyKDc1NSwle3VzZXJuYW1lfSwle3VzZXJuYW1lfSkgL3Zhci9sb2cvJXt1c2VybmFtZX0qCi0lYXR0cig3NTUsJXt1c2VybmFtZX0sJXt1c2VybmFtZX0pIC92YXIvcnVuLyV7dXNlcm5hbWV9KgorJWF0dHIoNzUwLCV7dXNlcm5hbWV9LCV7dXNlcm5hbWV9KSAlY29uZmlnKG5vcmVwbGFjZSkgL3Zhci9saWIvJXt1c2VybmFtZX0vKgorJWF0dHIoNzUwLCV7dXNlcm5hbWV9LCV7dXNlcm5hbWV9KSAvdmFyL2xvZy8le3VzZXJuYW1lfSoKKyVhdHRyKDc1MCwle3VzZXJuYW1lfSwle3VzZXJuYW1lfSkgL3Zhci9ydW4vJXt1c2VybmFtZX0qCiAle3B5dGhvbl9zaXRlbGlifS9jcWxzaGxpYi8KICV7cHl0aG9uX3NpdGVsaWJ9L2Nhc3NhbmRyYV9weWxpYiouZWdnLWluZm8KIApAQCAtMTkwLDYgKzE5MCw3IEBACiBUaGlzIHBhY2thZ2UgY29udGFpbnMgZXh0cmEgdG9vbHMgZm9yIHdvcmtpbmcgd2l0aCBDYXNzYW5kcmEgY2x1c3RlcnMuCiAKICVmaWxlcyB0b29scworJWF0dHIoNzU1LHJvb3Qscm9vdCkgJXtfYmluZGlyfS9zc3RhYmxlcGFydGl0aW9ucwogJWF0dHIoNzU1LHJvb3Qscm9vdCkgJXtfYmluZGlyfS9zc3RhYmxlZHVtcAogJWF0dHIoNzU1LHJvb3Qscm9vdCkgJXtfYmluZGlyfS9jb21wYWN0aW9uLXN0cmVzcwogJWF0dHIoNzU1LHJvb3Qscm9vdCkgJXtfYmluZGlyfS9zc3RhYmxlZXhwaXJlZGJsb2NrZXJzCmRpZmYgLS1naXQgYS9zcmMvYW50bHIvQ3FsLmcgYi9zcmMvYW50bHIvQ3FsLmcKaW5kZXggMjcyYzYzYi4uMGViMmFjNSAxMDA2NDQKLS0tIGEvc3JjL2FudGxyL0NxbC5nCisrKyBiL3NyYy9hbnRsci9DcWwuZwpAQCAtMzksNiArMzksNyBAQAogICAgIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLio7CiAgICAgaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuY29uZGl0aW9ucy4qOwogICAgIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy4qOworICAgIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nLio7CiAgICAgaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMucmVzdHJpY3Rpb25zLkN1c3RvbUluZGV4RXhwcmVzc2lvbjsKICAgICBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zZWxlY3Rpb24uKjsKICAgICBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLio7CmRpZmYgLS1naXQgYS9zcmMvYW50bHIvTGV4ZXIuZyBiL3NyYy9hbnRsci9MZXhlci5nCmluZGV4IDcyYWI3ZGIuLjUxMmE4MmQgMTAwNjQ0Ci0tLSBhL3NyYy9hbnRsci9MZXhlci5nCisrKyBiL3NyYy9hbnRsci9MZXhlci5nCkBAIC0xNzgsNiArMTc4LDcgQEAKIEtfVElNRVVVSUQ6ICAgIFQgSSBNIEUgVSBVIEkgRDsKIEtfVE9LRU46ICAgICAgIFQgTyBLIEUgTjsKIEtfV1JJVEVUSU1FOiAgIFcgUiBJIFQgRSBUIEkgTSBFOworS19NQVhXUklURVRJTUU6TSBBIFggVyBSIEkgVCBFIFQgSSBNIEU7CiBLX0RBVEU6ICAgICAgICBEIEEgVCBFOwogS19USU1FOiAgICAgICAgVCBJIE0gRTsKIApAQCAtMjE3LDYgKzIxOCwxMCBAQAogS19VTlNFVDogICAgICAgVSBOIFMgRSBUOwogS19MSUtFOiAgICAgICAgTCBJIEsgRTsKIAorS19NQVNLRUQ6ICAgICAgTSBBIFMgSyBFIEQ7CitLX1VOTUFTSzogICAgICBVIE4gTSBBIFMgSzsKK0tfU0VMRUNUX01BU0tFRDogUyBFIEwgRSBDIFQgJ18nIE0gQSBTIEsgRSBEOworCiAvLyBDYXNlLWluc2Vuc2l0aXZlIGFscGhhIGNoYXJhY3RlcnMKIGZyYWdtZW50IEE6ICgnYSd8J0EnKTsKIGZyYWdtZW50IEI6ICgnYid8J0InKTsKZGlmZiAtLWdpdCBhL3NyYy9hbnRsci9QYXJzZXIuZyBiL3NyYy9hbnRsci9QYXJzZXIuZwppbmRleCBkMDYxZWU0Li4wMjlkN2ZjIDEwMDY0NAotLS0gYS9zcmMvYW50bHIvUGFyc2VyLmcKKysrIGIvc3JjL2FudGxyL1BhcnNlci5nCkBAIC00MTQsMTEgKzQxNCwxMiBAQAogICAgIDsKIAogc2VsZWN0aW9uRnVuY3Rpb24gcmV0dXJucyBbU2VsZWN0YWJsZS5SYXcgc10KLSAgICA6IEtfQ09VTlQgJygnICdcKicgJyknICAgICAgICAgICAgICAgICAgICAgIHsgJHMgPSBTZWxlY3RhYmxlLldpdGhGdW5jdGlvbi5SYXcubmV3Q291bnRSb3dzRnVuY3Rpb24oKTsgfQotICAgIHwgS19XUklURVRJTUUgJygnIGM9c2lkZW50ICcpJyAgICAgICAgICAgICAgeyAkcyA9IG5ldyBTZWxlY3RhYmxlLldyaXRldGltZU9yVFRMLlJhdyhjLCB0cnVlKTsgfQotICAgIHwgS19UVEwgICAgICAgJygnIGM9c2lkZW50ICcpJyAgICAgICAgICAgICAgeyAkcyA9IG5ldyBTZWxlY3RhYmxlLldyaXRldGltZU9yVFRMLlJhdyhjLCBmYWxzZSk7IH0KLSAgICB8IEtfQ0FTVCAgICAgICcoJyBzbj11bmFsaWFzZWRTZWxlY3RvciBLX0FTIHQ9bmF0aXZlX3R5cGUgJyknIHskcyA9IG5ldyBTZWxlY3RhYmxlLldpdGhDYXN0LlJhdyhzbiwgdCk7fQotICAgIHwgZj1mdW5jdGlvbk5hbWUgYXJncz1zZWxlY3Rpb25GdW5jdGlvbkFyZ3MgeyAkcyA9IG5ldyBTZWxlY3RhYmxlLldpdGhGdW5jdGlvbi5SYXcoZiwgYXJncyk7IH0KKyAgICA6IEtfQ09VTlQgICAgICAgICcoJyAnXConICcpJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgJHMgPSBTZWxlY3RhYmxlLldpdGhGdW5jdGlvbi5SYXcubmV3Q291bnRSb3dzRnVuY3Rpb24oKTsgfQorICAgIHwgS19NQVhXUklURVRJTUUgJygnIGM9c2lkZW50IG09c2VsZWN0b3JNb2RpZmllcltjXSAnKScgICAgICAgICAgeyAkcyA9IG5ldyBTZWxlY3RhYmxlLldyaXRldGltZU9yVFRMLlJhdyhjLCBtLCBTZWxlY3RhYmxlLldyaXRldGltZU9yVFRMLktpbmQuTUFYX1dSSVRFX1RJTUUpOyB9CisgICAgfCBLX1dSSVRFVElNRSAgICAnKCcgYz1zaWRlbnQgbT1zZWxlY3Rvck1vZGlmaWVyW2NdICcpJyAgICAgICAgICB7ICRzID0gbmV3IFNlbGVjdGFibGUuV3JpdGV0aW1lT3JUVEwuUmF3KGMsIG0sIFNlbGVjdGFibGUuV3JpdGV0aW1lT3JUVEwuS2luZC5XUklURV9USU1FKTsgfQorICAgIHwgS19UVEwgICAgICAgICAgJygnIGM9c2lkZW50IG09c2VsZWN0b3JNb2RpZmllcltjXSAnKScgICAgICAgICAgeyAkcyA9IG5ldyBTZWxlY3RhYmxlLldyaXRldGltZU9yVFRMLlJhdyhjLCBtLCBTZWxlY3RhYmxlLldyaXRldGltZU9yVFRMLktpbmQuVFRMKTsgfQorICAgIHwgS19DQVNUICAgICAgICAgJygnIHNuPXVuYWxpYXNlZFNlbGVjdG9yIEtfQVMgdD1uYXRpdmVfdHlwZSAnKScgeyAkcyA9IG5ldyBTZWxlY3RhYmxlLldpdGhDYXN0LlJhdyhzbiwgdCk7fQorICAgIHwgZj1mdW5jdGlvbk5hbWUgYXJncz1zZWxlY3Rpb25GdW5jdGlvbkFyZ3MgICAgICAgICAgICAgICAgICAgICAgeyAkcyA9IG5ldyBTZWxlY3RhYmxlLldpdGhGdW5jdGlvbi5SYXcoZiwgYXJncyk7IH0KICAgICA7CiAKIHNlbGVjdGlvbkxpdGVyYWwgcmV0dXJucyBbVGVybS5SYXcgdmFsdWVdCkBAIC03ODEsMTEgKzc4MiwyMSBAQAogCiB0YWJsZUNvbHVtbnNbQ3JlYXRlVGFibGVTdGF0ZW1lbnQuUmF3IHN0bXRdCiAgICAgQGluaXQgeyBib29sZWFuIGlzU3RhdGljID0gZmFsc2U7IH0KLSAgICA6IGs9aWRlbnQgdj1jb21wYXJhdG9yVHlwZSAoS19TVEFUSUMgeyBpc1N0YXRpYyA9IHRydWU7IH0pPyB7ICRzdG10LmFkZENvbHVtbihrLCB2LCBpc1N0YXRpYyk7IH0KKyAgICA6IGs9aWRlbnQgdj1jb21wYXJhdG9yVHlwZSAoS19TVEFUSUMgeyBpc1N0YXRpYyA9IHRydWU7IH0pPyAobWFzaz1jb2x1bW5NYXNrKT8geyAkc3RtdC5hZGRDb2x1bW4oaywgdiwgaXNTdGF0aWMsIG1hc2spOyB9CiAgICAgICAgIChLX1BSSU1BUlkgS19LRVkgeyAkc3RtdC5zZXRQYXJ0aXRpb25LZXlDb2x1bW4oayk7IH0pPwogICAgIHwgS19QUklNQVJZIEtfS0VZICcoJyB0YWJsZVBhcnRpdGlvbktleVtzdG10XSAoJywnIGM9aWRlbnQgeyAkc3RtdC5tYXJrQ2x1c3RlcmluZ0NvbHVtbihjKTsgfSApKiAnKScKICAgICA7CiAKK2NvbHVtbk1hc2sgcmV0dXJucyBbQ29sdW1uTWFzay5SYXcgbWFza10KKyAgICBAaW5pdCB7IExpc3Q8VGVybS5SYXc+IGFyZ3VtZW50cyA9IG5ldyBBcnJheUxpc3Q8PigpOyB9CisgICAgOiBLX01BU0tFRCBLX1dJVEggbmFtZT1mdW5jdGlvbk5hbWUgY29sdW1uTWFza0FyZ3VtZW50c1thcmd1bWVudHNdIHsgJG1hc2sgPSBuZXcgQ29sdW1uTWFzay5SYXcobmFtZSwgYXJndW1lbnRzKTsgfQorICAgIHwgS19NQVNLRUQgS19XSVRIIEtfREVGQVVMVCB7ICRtYXNrID0gbmV3IENvbHVtbk1hc2suUmF3KEZ1bmN0aW9uTmFtZS5uYXRpdmVGdW5jdGlvbigibWFza19kZWZhdWx0IiksIGFyZ3VtZW50cyk7IH0KKyAgICA7CisKK2NvbHVtbk1hc2tBcmd1bWVudHNbTGlzdDxUZXJtLlJhdz4gYXJndW1lbnRzXQorICAgIDogJygnICAnKScgfCAnKCcgYz10ZXJtIHsgYXJndW1lbnRzLmFkZChjKTsgfSAoJywnIGNuPXRlcm0geyBhcmd1bWVudHMuYWRkKGNuKTsgfSkqICcpJworICAgIDsKKwogdGFibGVQYXJ0aXRpb25LZXlbQ3JlYXRlVGFibGVTdGF0ZW1lbnQuUmF3IHN0bXRdCiAgICAgQGluaXQge0xpc3Q8Q29sdW1uSWRlbnRpZmllcj4gbCA9IG5ldyBBcnJheUxpc3Q8Q29sdW1uSWRlbnRpZmllcj4oKTt9CiAgICAgQGFmdGVyeyAkc3RtdC5zZXRQYXJ0aXRpb25LZXlDb2x1bW5zKGwpOyB9CkBAIC05MjgsNyArOTM5LDkgQEAKIAogLyoqCiAgKiBBTFRFUiBUQUJMRSA8dGFibGU+IEFMVEVSIDxjb2x1bW4+IFRZUEUgPG5ld3R5cGU+OwotICogQUxURVIgVEFCTEUgW0lGIEVYSVNUU10gPHRhYmxlPiBBREQgW0lGIE5PVCBFWElTVFNdIDxjb2x1bW4+IDxuZXd0eXBlPjsgfCBBTFRFUiBUQUJMRSBbSUYgRVhJU1RTXSA8dGFibGU+IEFERCBbSUYgTk9UIEVYSVNUU10gKDxjb2x1bW4+IDxuZXd0eXBlPiw8Y29sdW1uMT4gPG5ld3R5cGUxPi4uLi4uIDxjb2x1bW4gbj4gPG5ld3R5cGUgbj4pCisgKiBBTFRFUiBUQUJMRSBbSUYgRVhJU1RTXSA8dGFibGU+IEFMVEVSIFtJRiBFWElTVFNdIDxjb2x1bW4+IE1BU0tFRCBXSVRIIDxtYXNrRnVuY3Rpb24+KTsKKyAqIEFMVEVSIFRBQkxFIFtJRiBFWElTVFNdIDx0YWJsZT4gQUxURVIgW0lGIEVYSVNUU10gPGNvbHVtbj4gRFJPUCBNQVNLRUQ7CisgKiBBTFRFUiBUQUJMRSBbSUYgRVhJU1RTXSA8dGFibGU+IEFERCBbSUYgTk9UIEVYSVNUU10gPGNvbHVtbj4gPG5ld3R5cGU+IDxtYXNrRnVuY3Rpb24+OyB8IEFMVEVSIFRBQkxFIFtJRiBFWElTVFNdIDx0YWJsZT4gQUREIFtJRiBOT1QgRVhJU1RTXSAoPGNvbHVtbj4gPG5ld3R5cGU+IDxtYXNrRnVuY3Rpb24+LCA8Y29sdW1uMT4gPG5ld3R5cGUxPiAgPG1hc2tGdW5jdGlvbjE+Li4uLi4gPGNvbHVtbiBuPiA8bmV3dHlwZSBuPiAgPG1hc2tGdW5jdGlvbiBuPikKICAqIEFMVEVSIFRBQkxFIFtJRiBFWElTVFNdIDx0YWJsZT4gRFJPUCBbSUYgRVhJU1RTXSA8Y29sdW1uPjsgfCBBTFRFUiBUQUJMRSBbSUYgRVhJU1RTXSA8dGFibGU+IERST1AgW0lGIEVYSVNUU10gKCA8Y29sdW1uPiw8Y29sdW1uMT4uLi4uLjxjb2x1bW4gbj4pCiAgKiBBTFRFUiBUQUJMRSBbSUYgRVhJU1RTXSA8dGFibGU+IFJFTkFNRSBbSUYgRVhJU1RTXSA8Y29sdW1uPiBUTyA8Y29sdW1uPjsKICAqIEFMVEVSIFRBQkxFIFtJRiBFWElTVFNdIDx0YWJsZT4gV0lUSCA8cHJvcGVydHk+ID0gPHZhbHVlPjsKQEAgLTk0MCwxMCArOTUzLDE0IEBACiAgICAgICAoCiAgICAgICAgIEtfQUxURVIgaWQ9Y2lkZW50IEtfVFlQRSB2PWNvbXBhcmF0b3JUeXBlIHsgJHN0bXQuYWx0ZXIoaWQsIHYpOyB9CiAKKyAgICAgIHwgS19BTFRFUiAoIEtfSUYgS19FWElTVFMgeyAkc3RtdC5pZkNvbHVtbkV4aXN0cyh0cnVlKTsgfSApPyBpZD1jaWRlbnQKKyAgICAgICAgICAgICAgKCBtYXNrPWNvbHVtbk1hc2sgeyAkc3RtdC5tYXNrKGlkLCBtYXNrKTsgfQorICAgICAgICAgICAgICB8IEtfRFJPUCBLX01BU0tFRCB7ICRzdG10Lm1hc2soaWQsIG51bGwpOyB9ICkKKwogICAgICAgfCBLX0FERCAoIEtfSUYgS19OT1QgS19FWElTVFMgeyAkc3RtdC5pZkNvbHVtbk5vdEV4aXN0cyh0cnVlKTsgfSApPwotICAgICAgICAgICAgICAoICAgICAgICBpZD1pZGVudCAgdj1jb21wYXJhdG9yVHlwZSAgYj1pc1N0YXRpY0NvbHVtbiB7ICRzdG10LmFkZChpZCwgIHYsICBiKTsgIH0KLSAgICAgICAgICAgICAgIHwgKCcoJyAgaWQxPWlkZW50IHYxPWNvbXBhcmF0b3JUeXBlIGIxPWlzU3RhdGljQ29sdW1uIHsgJHN0bXQuYWRkKGlkMSwgdjEsIGIxKTsgfQotICAgICAgICAgICAgICAgICAoICcsJyBpZG49aWRlbnQgdm49Y29tcGFyYXRvclR5cGUgYm49aXNTdGF0aWNDb2x1bW4geyAkc3RtdC5hZGQoaWRuLCB2biwgYm4pOyB9ICkqICcpJykgKQorICAgICAgICAgICAgICAoICAgICAgICBpZD1pZGVudCAgdj1jb21wYXJhdG9yVHlwZSAgYj1pc1N0YXRpY0NvbHVtbiAobT1jb2x1bW5NYXNrKT8geyAkc3RtdC5hZGQoaWQsICB2LCAgYiwgbSk7ICB9CisgICAgICAgICAgICAgICB8ICgnKCcgIGlkMT1pZGVudCB2MT1jb21wYXJhdG9yVHlwZSBiMT1pc1N0YXRpY0NvbHVtbiAobTE9Y29sdW1uTWFzayk/IHsgJHN0bXQuYWRkKGlkMSwgdjEsIGIxLCBtMSk7IH0KKyAgICAgICAgICAgICAgICAgKCAnLCcgaWRuPWlkZW50IHZuPWNvbXBhcmF0b3JUeXBlIGJuPWlzU3RhdGljQ29sdW1uIChtbj1jb2x1bW5NYXNrKT8geyAkc3RtdC5hZGQoaWRuLCB2biwgYm4sIG1uKTsgbW49bnVsbDsgfSApKiAnKScpICkKIAogICAgICAgfCBLX0RST1AgKCBLX0lGIEtfRVhJU1RTIHsgJHN0bXQuaWZDb2x1bW5FeGlzdHModHJ1ZSk7IH0gKT8KICAgICAgICAgICAgICAgICggICAgICAgaWQ9aWRlbnQgeyAkc3RtdC5kcm9wKGlkKTsgIH0KQEAgLTExMTEsNyArMTEyOCw3IEBACiAgICAgOwogCiBwZXJtaXNzaW9uIHJldHVybnMgW1Blcm1pc3Npb24gcGVybV0KLSAgICA6IHA9KEtfQ1JFQVRFIHwgS19BTFRFUiB8IEtfRFJPUCB8IEtfU0VMRUNUIHwgS19NT0RJRlkgfCBLX0FVVEhPUklaRSB8IEtfREVTQ1JJQkUgfCBLX0VYRUNVVEUpCisgICAgOiBwPShLX0NSRUFURSB8IEtfQUxURVIgfCBLX0RST1AgfCBLX1NFTEVDVCB8IEtfTU9ESUZZIHwgS19BVVRIT1JJWkUgfCBLX0RFU0NSSUJFIHwgS19FWEVDVVRFIHwgS19VTk1BU0sgfCBLX1NFTEVDVF9NQVNLRUQpCiAgICAgeyAkcGVybSA9IFBlcm1pc3Npb24udmFsdWVPZigkcC50ZXh0LnRvVXBwZXJDYXNlKCkpOyB9CiAgICAgOwogCkBAIC0xODcwLDcgKzE4ODcsNyBAQAogCiB1bnJlc2VydmVkX2tleXdvcmQgcmV0dXJucyBbU3RyaW5nIHN0cl0KICAgICA6IHU9dW5yZXNlcnZlZF9mdW5jdGlvbl9rZXl3b3JkICAgICB7ICRzdHIgPSB1OyB9Ci0gICAgfCBrPShLX1RUTCB8IEtfQ09VTlQgfCBLX1dSSVRFVElNRSB8IEtfS0VZIHwgS19DQVNUIHwgS19KU09OIHwgS19ESVNUSU5DVCkgeyAkc3RyID0gJGsudGV4dDsgfQorICAgIHwgaz0oS19UVEwgfCBLX0NPVU5UIHwgS19XUklURVRJTUUgfCBLX01BWFdSSVRFVElNRSB8IEtfS0VZIHwgS19DQVNUIHwgS19KU09OIHwgS19ESVNUSU5DVCkgeyAkc3RyID0gJGsudGV4dDsgfQogICAgIDsKIAogdW5yZXNlcnZlZF9mdW5jdGlvbl9rZXl3b3JkIHJldHVybnMgW1N0cmluZyBzdHJdCkBAIC0xOTM5LDUgKzE5NTYsOCBAQAogICAgICAgICB8IEtfTUJFQU5TCiAgICAgICAgIHwgS19SRVBMQUNFCiAgICAgICAgIHwgS19VTlNFVAorICAgICAgICB8IEtfTUFTS0VECisgICAgICAgIHwgS19VTk1BU0sKKyAgICAgICAgfCBLX1NFTEVDVF9NQVNLRUQKICAgICAgICAgKSB7ICRzdHIgPSAkay50ZXh0OyB9CiAgICAgOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9BbGxvd0FsbEludGVybm9kZUF1dGhlbnRpY2F0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvQWxsb3dBbGxJbnRlcm5vZGVBdXRoZW50aWNhdG9yLmphdmEKaW5kZXggZDBkMmQ3NC4uYWM2MmJmYSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9BbGxvd0FsbEludGVybm9kZUF1dGhlbnRpY2F0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL0FsbG93QWxsSW50ZXJub2RlQXV0aGVudGljYXRvci5qYXZhCkBAIC0yMCwxMiArMjAsMTQgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aDsKIAogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIAogcHVibGljIGNsYXNzIEFsbG93QWxsSW50ZXJub2RlQXV0aGVudGljYXRvciBpbXBsZW1lbnRzIElJbnRlcm5vZGVBdXRoZW50aWNhdG9yCiB7Ci0gICAgcHVibGljIGJvb2xlYW4gYXV0aGVudGljYXRlKEluZXRBZGRyZXNzIHJlbW90ZUFkZHJlc3MsIGludCByZW1vdGVQb3J0KQorICAgIHB1YmxpYyBib29sZWFuIGF1dGhlbnRpY2F0ZShJbmV0QWRkcmVzcyByZW1vdGVBZGRyZXNzLCBpbnQgcmVtb3RlUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMsIEludGVybm9kZUNvbm5lY3Rpb25EaXJlY3Rpb24gY29ubmVjdGlvblR5cGUpCiAgICAgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL0F1dGhDYWNoZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9BdXRoQ2FjaGUuamF2YQppbmRleCA2NmEyYTRmLi43ZDNhMTY0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL0F1dGhDYWNoZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvQXV0aENhY2hlLmphdmEKQEAgLTQ4LDYgKzQ4LDkgQEAKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LkV4ZWN1dG9yRmFjdG9yeS5HbG9iYWwuZXhlY3V0b3JGYWN0b3J5OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkFVVEhfQ0FDSEVfV0FSTUlOR19NQVhfUkVUUklFUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5BVVRIX0NBQ0hFX1dBUk1JTkdfUkVUUllfSU5URVJWQUxfTVM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRElTQUJMRV9BVVRIX0NBQ0hFU19SRU1PVEVfQ09ORklHVVJBVElPTjsKIAogcHVibGljIGNsYXNzIEF1dGhDYWNoZTxLLCBWPiBpbXBsZW1lbnRzIEF1dGhDYWNoZU1CZWFuLCBTaHV0ZG93bmFibGUKIHsKQEAgLTU1LDExICs1OCw2IEBACiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQkVBTl9OQU1FX0JBU0UgPSAib3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aDp0eXBlPSI7CiAKLSAgICAvLyBXZSBleHBlY3QgZGVmYXVsdCB2YWx1ZXMgb24gY2FjaGUgcmV0cmllcyBhbmQgaW50ZXJ2YWwgdG8gYmUgc3VmZmljaWVudCBmb3IgZXZlcnlvbmUgYnV0IGhhdmUgdGhpcyBlc2NhcGUgaGF0Y2gKLSAgICAvLyBqdXN0IGluIGNhc2UuCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9MT0FEX1JFVFJJRVNfUFJPUEVSVFkgPSAiY2Fzc2FuZHJhLmF1dGhfY2FjaGUud2FybWluZy5tYXhfcmV0cmllcyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9MT0FEX1JFVFJZX0lOVEVSVkFMX1BST1BFUlRZID0gImNhc3NhbmRyYS5hdXRoX2NhY2hlLndhcm1pbmcucmV0cnlfaW50ZXJ2YWxfbXMiOwotCiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBTY2hlZHVsZWRGdXR1cmUgY2FjaGVSZWZyZXNoZXIgPSBudWxsOwogCiAgICAgLy8gS2VlcCBhIGhhbmRsZSBvbiBjcmVhdGVkIGluc3RhbmNlcyBzbyB0aGVpciBleGVjdXRvcnMgY2FuIGJlIHRlcm1pbmF0ZWQgY2xlYW5seQpAQCAtMjU0LDcgKzI1Miw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFZhbGlkaXR5KGludCB2YWxpZGl0eVBlcmlvZCkKICAgICB7Ci0gICAgICAgIGlmIChCb29sZWFuLmdldEJvb2xlYW4oImNhc3NhbmRyYS5kaXNhYmxlX2F1dGhfY2FjaGVzX3JlbW90ZV9jb25maWd1cmF0aW9uIikpCisgICAgICAgIGlmIChESVNBQkxFX0FVVEhfQ0FDSEVTX1JFTU9URV9DT05GSUdVUkFUSU9OLmdldEJvb2xlYW4oKSkKICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiUmVtb3RlIGNvbmZpZ3VyYXRpb24gb2YgYXV0aCBjYWNoZXMgaXMgZGlzYWJsZWQiKTsKIAogICAgICAgICBzZXRWYWxpZGl0eURlbGVnYXRlLmFjY2VwdCh2YWxpZGl0eVBlcmlvZCk7CkBAIC0yNzIsNyArMjcwLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VXBkYXRlSW50ZXJ2YWwoaW50IHVwZGF0ZUludGVydmFsKQogICAgIHsKLSAgICAgICAgaWYgKEJvb2xlYW4uZ2V0Qm9vbGVhbigiY2Fzc2FuZHJhLmRpc2FibGVfYXV0aF9jYWNoZXNfcmVtb3RlX2NvbmZpZ3VyYXRpb24iKSkKKyAgICAgICAgaWYgKERJU0FCTEVfQVVUSF9DQUNIRVNfUkVNT1RFX0NPTkZJR1VSQVRJT04uZ2V0Qm9vbGVhbigpKQogICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJSZW1vdGUgY29uZmlndXJhdGlvbiBvZiBhdXRoIGNhY2hlcyBpcyBkaXNhYmxlZCIpOwogCiAgICAgICAgIHNldFVwZGF0ZUludGVydmFsRGVsZWdhdGUuYWNjZXB0KHVwZGF0ZUludGVydmFsKTsKQEAgLTI5MCw3ICsyODgsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRNYXhFbnRyaWVzKGludCBtYXhFbnRyaWVzKQogICAgIHsKLSAgICAgICAgaWYgKEJvb2xlYW4uZ2V0Qm9vbGVhbigiY2Fzc2FuZHJhLmRpc2FibGVfYXV0aF9jYWNoZXNfcmVtb3RlX2NvbmZpZ3VyYXRpb24iKSkKKyAgICAgICAgaWYgKERJU0FCTEVfQVVUSF9DQUNIRVNfUkVNT1RFX0NPTkZJR1VSQVRJT04uZ2V0Qm9vbGVhbigpKQogICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJSZW1vdGUgY29uZmlndXJhdGlvbiBvZiBhdXRoIGNhY2hlcyBpcyBkaXNhYmxlZCIpOwogCiAgICAgICAgIHNldE1heEVudHJpZXNEZWxlZ2F0ZS5hY2NlcHQobWF4RW50cmllcyk7CkBAIC0zMDksNyArMzA3LDcgQEAKIAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRBY3RpdmVVcGRhdGUoYm9vbGVhbiB1cGRhdGUpCiAgICAgewotICAgICAgICBpZiAoQm9vbGVhbi5nZXRCb29sZWFuKCJjYXNzYW5kcmEuZGlzYWJsZV9hdXRoX2NhY2hlc19yZW1vdGVfY29uZmlndXJhdGlvbiIpKQorICAgICAgICBpZiAoRElTQUJMRV9BVVRIX0NBQ0hFU19SRU1PVEVfQ09ORklHVVJBVElPTi5nZXRCb29sZWFuKCkpCiAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlJlbW90ZSBjb25maWd1cmF0aW9uIG9mIGF1dGggY2FjaGVzIGlzIGRpc2FibGVkIik7CiAKICAgICAgICAgc2V0QWN0aXZlVXBkYXRlLmFjY2VwdCh1cGRhdGUpOwpAQCAtNDA5LDggKzQwNyw4IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgcmV0cmllcyA9IEludGVnZXIuZ2V0SW50ZWdlcihDQUNIRV9MT0FEX1JFVFJJRVNfUFJPUEVSVFksIDEwKTsKLSAgICAgICAgbG9uZyByZXRyeUludGVydmFsID0gTG9uZy5nZXRMb25nKENBQ0hFX0xPQURfUkVUUllfSU5URVJWQUxfUFJPUEVSVFksIDEwMDApOworICAgICAgICBpbnQgcmV0cmllcyA9IEFVVEhfQ0FDSEVfV0FSTUlOR19NQVhfUkVUUklFUy5nZXRJbnQoMTApOworICAgICAgICBsb25nIHJldHJ5SW50ZXJ2YWwgPSBBVVRIX0NBQ0hFX1dBUk1JTkdfUkVUUllfSU5URVJWQUxfTVMuZ2V0TG9uZygxMDAwKTsKIAogICAgICAgICB3aGlsZSAocmV0cmllcy0tID4gMCkKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9BdXRoS2V5c3BhY2UuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvQXV0aEtleXNwYWNlLmphdmEKaW5kZXggNjdmYzljMS4uZjBhM2RhOCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9BdXRoS2V5c3BhY2UuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL0F1dGhLZXlzcGFjZS5qYXZhCkBAIC0zMCw2ICszMCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlczsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TVVBFUlVTRVJfU0VUVVBfREVMQVlfTVM7CiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBBdXRoS2V5c3BhY2UKIHsKQEAgLTU1LDcgKzU2LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9ST0xFX0lOREVYID0gInJlc291cmNlX3JvbGVfcGVybWlzc29uc19pbmRleCI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS19QRVJNSVNTSU9OUyA9ICJuZXR3b3JrX3Blcm1pc3Npb25zIjsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBTVVBFUlVTRVJfU0VUVVBfREVMQVkgPSBMb25nLmdldExvbmcoImNhc3NhbmRyYS5zdXBlcnVzZXJfc2V0dXBfZGVsYXlfbXMiLCAxMDAwMCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFNVUEVSVVNFUl9TRVRVUF9ERUxBWSA9IFNVUEVSVVNFUl9TRVRVUF9ERUxBWV9NUy5nZXRMb25nKCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUYWJsZU1ldGFkYXRhIFJvbGVzID0KICAgICAgICAgcGFyc2UoUk9MRVMsCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL0Nhc3NhbmRyYVJvbGVNYW5hZ2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL0Nhc3NhbmRyYVJvbGVNYW5hZ2VyLmphdmEKaW5kZXggNzMzZTlkYS4uMzdiZGE0ZSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9DYXNzYW5kcmFSb2xlTWFuYWdlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvQ2Fzc2FuZHJhUm9sZU1hbmFnZXIuamF2YQpAQCAtMzQsNyArMzQsNiBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy4qOwpAQCAtNDMsMTEgKzQyLDEzIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DbGllbnRTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VQcm94eTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5tZXNzYWdlcy5SZXN1bHRNZXNzYWdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogaW1wb3J0IG9yZy5taW5kcm90LmpiY3J5cHQuQkNyeXB0OwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQVVUSF9CQ1JZUFRfR0VOU0FMVF9MT0cyX1JPVU5EUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5RdWVyeVN0YXRlLmZvckludGVybmFsQ2FsbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKIApAQCAtODEsNyArODIsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDYXNzYW5kcmFSb2xlTWFuYWdlci5jbGFzcyk7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NVUEVSVVNFUl9OQU1FID0gImNhc3NhbmRyYSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NVUEVSVVNFUl9QQVNTV09SRCA9ICJjYXNzYW5kcmEiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU1VQRVJVU0VSX1BBU1NXT1JEID0gImNhc3NhbmRyYSI7CiAKICAgICAvKioKICAgICAgKiBXZSBuZWVkIHRvIHRyZWF0IHRoZSBkZWZhdWx0IHN1cGVydXNlciBhcyBhIHNwZWNpYWwgY2FzZSBzaW5jZSBkdXJpbmcgaW5pdGlhbCBub2RlIHN0YXJ0dXAsIHdlIG1heSBlbmQgdXAgd2l0aApAQCAtMTEyLDE5ICsxMTMsMTUgQEAKICAgICAgICAgfQogICAgIH07CiAKLSAgICAvLyAyICoqIEdFTlNBTFRfTE9HMl9ST1VORFMgcm91bmRzIG9mIGhhc2hpbmcgd2lsbCBiZSBwZXJmb3JtZWQuCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VOU0FMVF9MT0cyX1JPVU5EU19QUk9QRVJUWSA9IENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAiYXV0aF9iY3J5cHRfZ2Vuc2FsdF9sb2cyX3JvdW5kcyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFTlNBTFRfTE9HMl9ST1VORFMgPSBnZXRHZW5zYWx0TG9nUm91bmRzKCk7CiAKICAgICBzdGF0aWMgaW50IGdldEdlbnNhbHRMb2dSb3VuZHMoKQogICAgIHsKLSAgICAgICAgIGludCByb3VuZHMgPSBJbnRlZ2VyLmdldEludGVnZXIoR0VOU0FMVF9MT0cyX1JPVU5EU19QUk9QRVJUWSwgMTApOwotICAgICAgICAgaWYgKHJvdW5kcyA8IDQgfHwgcm91bmRzID4gMzApCi0gICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJCYWQgdmFsdWUgZm9yIHN5c3RlbSBwcm9wZXJ0eSAtRCVzLiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIHVzZSBhIHZhbHVlIGJldHdlZW4gNCBhbmQgMzAgaW5jbHVzaXZlbHkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5TQUxUX0xPRzJfUk9VTkRTX1BST1BFUlRZKSk7Ci0gICAgICAgICByZXR1cm4gcm91bmRzOworICAgICAgICBpbnQgcm91bmRzID0gQVVUSF9CQ1JZUFRfR0VOU0FMVF9MT0cyX1JPVU5EUy5nZXRJbnQoMTApOworICAgICAgICBpZiAocm91bmRzIDwgNCB8fCByb3VuZHMgPiAzMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkJhZCB2YWx1ZSBmb3Igc3lzdGVtIHByb3BlcnR5ICVzLiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIHVzZSBhIHZhbHVlIGJldHdlZW4gNCBhbmQgMzAgaW5jbHVzaXZlbHkiLCBBVVRIX0JDUllQVF9HRU5TQUxUX0xPRzJfUk9VTkRTLmdldEtleSgpKSk7CisgICAgICAgIHJldHVybiByb3VuZHM7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBTZWxlY3RTdGF0ZW1lbnQgbG9hZFJvbGVTdGF0ZW1lbnQ7CkBAIC0zODYsNiArMzgzLDEyIEBACiAgICAgewogICAgICAgICAvLyBUaGUgZGVsYXkgaXMgdG8gZ2l2ZSB0aGUgbm9kZSBhIGNoYW5jZSB0byBzZWUgaXRzIHBlZXJzIGJlZm9yZSBhdHRlbXB0aW5nIHRoZSBvcGVyYXRpb24KICAgICAgICAgU2NoZWR1bGVkRXhlY3V0b3JzLm9wdGlvbmFsVGFza3Muc2NoZWR1bGVTZWxmUmVjdXJyaW5nKCgpIC0+IHsKKyAgICAgICAgICAgIGlmICghU3RvcmFnZVByb3h5LmlzU2FmZVRvUGVyZm9ybVJlYWQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIlNldHVwIHRhc2sgbWF5IG5vdCBydW4gZHVlIHRvIGl0IG5vdCBiZWluZyBzYWZlIHRvIHBlcmZvcm0gcmVhZHMuLi4gcmVzY2hlZHVsaW5nIik7CisgICAgICAgICAgICAgICAgc2NoZWR1bGVTZXR1cFRhc2soc2V0dXBUYXNrKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBzZXR1cFRhc2suY2FsbCgpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9EYXRhUmVzb3VyY2UuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvRGF0YVJlc291cmNlLmphdmEKaW5kZXggMjQyMTkzMC4uNDkyM2EwYiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9EYXRhUmVzb3VyY2UuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL0RhdGFSZXNvdXJjZS5qYXZhCkBAIC00Niw3ICs0Niw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24uRFJPUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbi5TRUxFQ1QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24uTU9ESUZZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uLkFVVEhPUklaRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24uQVVUSE9SSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uLlVOTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbi5TRUxFQ1RfTUFTS0VEKTsKIAogICAgIC8vIHBlcm1pc3Npb25zIHdoaWNoIG1heSBiZSBncmFudGVkIG9uIGFsbCB0YWJsZXMgb2YgYSBnaXZlbiBrZXlzcGFjZQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxQZXJtaXNzaW9uPiBBTExfVEFCTEVTX0xFVkVMX1BFUk1JU1NJT05TID0gU2V0cy5pbW11dGFibGVFbnVtU2V0KFBlcm1pc3Npb24uQ1JFQVRFLApAQCAtNTQsNyArNTYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24uRFJPUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uLlNFTEVDVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uLk1PRElGWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uLkFVVEhPUklaRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbi5BVVRIT1JJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbi5VTk1BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbi5TRUxFQ1RfTUFTS0VEKTsKIAogICAgIC8vIHBlcm1pc3Npb25zIHdoaWNoIG1heSBiZSBncmFudGVkIG9uIG9uZSBvciBhbGwga2V5c3BhY2VzCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFBlcm1pc3Npb24+IEtFWVNQQUNFX0xFVkVMX1BFUk1JU1NJT05TID0gU2V0cy5pbW11dGFibGVFbnVtU2V0KFBlcm1pc3Npb24uQ1JFQVRFLApAQCAtNjIsNyArNjYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uLkRST1AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24uU0VMRUNULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uLk1PRElGWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbi5BVVRIT1JJWkUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uLkFVVEhPUklaRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbi5VTk1BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24uU0VMRUNUX01BU0tFRCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfTkFNRSA9ICJkYXRhIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRhUmVzb3VyY2UgUk9PVF9SRVNPVVJDRSA9IG5ldyBEYXRhUmVzb3VyY2UoTGV2ZWwuUk9PVCwgbnVsbCwgbnVsbCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvRnVuY3Rpb25SZXNvdXJjZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9GdW5jdGlvblJlc291cmNlLmphdmEKaW5kZXggYTY3ZWYxYS4uODZiMTU5MiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9GdW5jdGlvblJlc291cmNlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9GdW5jdGlvblJlc291cmNlLmphdmEKQEAgLTI5LDEzICsyOSwxNCBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHM7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5Vc2VyRnVuY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTDNUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uTmFtZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlR5cGVQYXJzZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOwogCiAvKioKICAqIElSZXNvdXJjZSBpbXBsZW1lbnRhdGlvbiByZXByZXNlbnRpbmcgZnVuY3Rpb25zLgpAQCAtMTM1LDcgKzEzNiw3IEBACiAgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25SZXNvdXJjZShrZXlzcGFjZSwgbmFtZSwgYXJnVHlwZXMpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRnVuY3Rpb25SZXNvdXJjZSBmdW5jdGlvbihGdW5jdGlvbiBmdW5jdGlvbikKKyAgICBwdWJsaWMgc3RhdGljIEZ1bmN0aW9uUmVzb3VyY2UgZnVuY3Rpb24oVXNlckZ1bmN0aW9uIGZ1bmN0aW9uKQogICAgIHsKICAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvblJlc291cmNlKGZ1bmN0aW9uLm5hbWUoKS5rZXlzcGFjZSwgZnVuY3Rpb24ubmFtZSgpLm5hbWUsIGZ1bmN0aW9uLmFyZ1R5cGVzKCkpOwogICAgIH0KQEAgLTI3MSw2ICsyNzIsNyBAQAogCiAgICAgcHVibGljIGJvb2xlYW4gZXhpc3RzKCkKICAgICB7CisgICAgICAgIHZhbGlkYXRlKCk7CiAgICAgICAgIHN3aXRjaCAobGV2ZWwpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNhc2UgUk9PVDoKQEAgLTI3OCwxMyArMjgwLDE0IEBACiAgICAgICAgICAgICBjYXNlIEtFWVNQQUNFOgogICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWEuaW5zdGFuY2UuZ2V0S2V5c3BhY2VzKCkuY29udGFpbnMoa2V5c3BhY2UpOwogICAgICAgICAgICAgY2FzZSBGVU5DVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hLmluc3RhbmNlLmZpbmRGdW5jdGlvbihnZXRGdW5jdGlvbk5hbWUoKSwgYXJnVHlwZXMpLmlzUHJlc2VudCgpOworICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWEuaW5zdGFuY2UuZmluZFVzZXJGdW5jdGlvbihnZXRGdW5jdGlvbk5hbWUoKSwgYXJnVHlwZXMpLmlzUHJlc2VudCgpOwogICAgICAgICB9CiAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOwogICAgIH0KIAogICAgIHB1YmxpYyBTZXQ8UGVybWlzc2lvbj4gYXBwbGljYWJsZVBlcm1pc3Npb25zKCkKICAgICB7CisgICAgICAgIHZhbGlkYXRlKCk7CiAgICAgICAgIHN3aXRjaCAobGV2ZWwpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNhc2UgUk9PVDoKQEAgLTI5Miw3ICsyOTUsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBDT0xMRUNUSU9OX0xFVkVMX1BFUk1JU1NJT05TOwogICAgICAgICAgICAgY2FzZSBGVU5DVElPTjoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPcHRpb25hbDxGdW5jdGlvbj4gZnVuY3Rpb24gPSBTY2hlbWEuaW5zdGFuY2UuZmluZEZ1bmN0aW9uKGdldEZ1bmN0aW9uTmFtZSgpLCBhcmdUeXBlcyk7CisgICAgICAgICAgICAgICAgT3B0aW9uYWw8VXNlckZ1bmN0aW9uPiBmdW5jdGlvbiA9IFNjaGVtYS5pbnN0YW5jZS5maW5kVXNlckZ1bmN0aW9uKGdldEZ1bmN0aW9uTmFtZSgpLCBhcmdUeXBlcyk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0IGZ1bmN0aW9uLmlzUHJlc2VudCgpIDogIlVuYWJsZSB0byBmaW5kIGZ1bmN0aW9uIG9iamVjdCBmb3IgcmVzb3VyY2UgIiArIHRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uLmdldCgpLmlzQWdncmVnYXRlKCkgPyBBR0dSRUdBVEVfRlVOQ1RJT05fUEVSTUlTU0lPTlMgOiBTQ0FMQVJfRlVOQ1RJT05fUEVSTUlTU0lPTlM7CiAgICAgICAgICAgICB9CkBAIC0zMDAsNiArMzAzLDEyIEBACiAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpCisgICAgeworICAgICAgICBpZiAoU2NoZW1hQ29uc3RhbnRzLlNZU1RFTV9LRVlTUEFDRV9OQU1FLmVxdWFscyhrZXlzcGFjZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oIkFsdGVyaW5nIHBlcm1pc3Npb25zIG9uIGJ1aWx0aW4gZnVuY3Rpb25zIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9CisKICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhGdW5jdGlvblJlc291cmNlIG8pCiAgICAgewogICAgICAgICByZXR1cm4gdGhpcy5uYW1lLmNvbXBhcmVUbyhvLm5hbWUpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9JQXV0aGVudGljYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9JQXV0aGVudGljYXRvci5qYXZhCmluZGV4IDgwZWE3MTkuLjk5NjNlNGUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvSUF1dGhlbnRpY2F0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL0lBdXRoZW50aWNhdG9yLmphdmEKQEAgLTE4LDExICsxOCwxMCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoOwogCiBpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAotaW1wb3J0IGphdmF4LnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5BdXRoZW50aWNhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiAKQEAgLTczLDExICs3MiwxNCBAQAogICAgICAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGdhaW4gYWNjZXNzIHRvIGNsaWVudCdzIGNlcnRpZmljYXRlIGNoYWluLCBpZiBwcmVzZW50LgogICAgICAqIEBwYXJhbSBjbGllbnRBZGRyZXNzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBjbGllbnQgd2hvbSB3ZSB3aXNoIHRvIGF1dGhlbnRpY2F0ZSwgb3IgbnVsbAogICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlmIGFuIGludGVybmFsIGNsaWVudCAob25lIG5vdCBjb25uZWN0ZWQgb3ZlciB0aGUgcmVtb3RlIHRyYW5zcG9ydCkuCi0gICAgICogQHBhcmFtIGNlcnRpZmljYXRlcyB0aGUgcGVlcidzIFg1MDkgQ2VydGlmaWNhdGUgY2hhaW4sIGlmIHByZXNlbnQuCisgICAgICogQHBhcmFtIGNlcnRpZmljYXRlcyB0aGUgcGVlcidzIENlcnRpZmljYXRlIGNoYWluLCBpZiBwcmVzZW50LgorICAgICAqICAgICAgICAgICAgICAgICAgICAgSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGVzZSB3aWxsIGFsbCBiZSBpbnN0YW5jZXMgb2Yge0BsaW5rIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGV9LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgYnV0IHdlIHBhc3MgdGhlbSBhcyB0aGUgYmFzZSB7QGxpbmsgQ2VydGlmaWNhdGV9IGluIGNhc2UgZnV0dXJlIGltcGxlbWVudGF0aW9ucyBsZXZlcmFnZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgb3RoZXIgY2VydGlmaWNhdGUgdHlwZXMuCiAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLklBdXRoZW50aWNhdG9yLlNhc2xOZWdvdGlhdG9yIGltcGxlbWVudGF0aW9uCiAgICAgICogKHNlZSB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5QYXNzd29yZEF1dGhlbnRpY2F0b3IuUGxhaW5UZXh0U2FzbEF1dGhlbnRpY2F0b3J9KQogICAgICAqLwotICAgIGRlZmF1bHQgU2FzbE5lZ290aWF0b3IgbmV3U2FzbE5lZ290aWF0b3IoSW5ldEFkZHJlc3MgY2xpZW50QWRkcmVzcywgWDUwOUNlcnRpZmljYXRlW10gY2VydGlmaWNhdGVzKQorICAgIGRlZmF1bHQgU2FzbE5lZ290aWF0b3IgbmV3U2FzbE5lZ290aWF0b3IoSW5ldEFkZHJlc3MgY2xpZW50QWRkcmVzcywgQ2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMpCiAgICAgewogICAgICAgICByZXR1cm4gbmV3U2FzbE5lZ290aWF0b3IoY2xpZW50QWRkcmVzcyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9JSW50ZXJub2RlQXV0aGVudGljYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9JSW50ZXJub2RlQXV0aGVudGljYXRvci5qYXZhCmluZGV4IDhlMDliOTAuLmU1MDM4YzAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvSUludGVybm9kZUF1dGhlbnRpY2F0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL0lJbnRlcm5vZGVBdXRoZW50aWNhdG9yLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aDsKIAogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIApAQCAtMzMsNyArMzQsMzUgQEAKICAgICAgKiBAcGFyYW0gcmVtb3RlUG9ydCBwb3J0IG9mIHRoZSBjb25uZWN0aW5nIG5vZGUuCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwotICAgIGJvb2xlYW4gYXV0aGVudGljYXRlKEluZXRBZGRyZXNzIHJlbW90ZUFkZHJlc3MsIGludCByZW1vdGVQb3J0KTsKKyAgICBARGVwcmVjYXRlZAorICAgIGRlZmF1bHQgYm9vbGVhbiBhdXRoZW50aWNhdGUoSW5ldEFkZHJlc3MgcmVtb3RlQWRkcmVzcywgaW50IHJlbW90ZVBvcnQpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjaWRlcyB3aGV0aGVyIGEgcGVlciBpcyBhbGxvd2VkIHRvIGNvbm5lY3QgdG8gdGhpcyBub2RlLgorICAgICAqIElmIHRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UsIHRoZSBzb2NrZXQgd2lsbCBiZSBpbW1lZGlhdGVseSBjbG9zZWQuCisgICAgICogPHA+CisgICAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYWxscyBhdXRoZW50aWNhdGUgbWV0aG9kIGJ5IElQIGFuZCBwb3J0IG1ldGhvZAorICAgICAqIDxwPgorICAgICAqIDEuIElmIGl0IGlzIElQIGJhc2VkIGF1dGhlbnRpY2F0aW9uIGlnbm9yZSB0aGUgY2VydGlmaWNhdGVzICYgY29ubmVjdGlvblR5cGUgcGFyYW1ldGVycyBpbiB0aGUgaW1wbGVtZW50YXRpb24KKyAgICAgKiBvZiB0aGlzIG1ldGhvZC4KKyAgICAgKiAyLiBGb3IgY2VydGlmaWNhdGUgYmFzZWQgYXV0aGVudGljYXRpb24gbGlrZSBtVExTLCBzZXJ2ZXIncyBpZGVudGl0eSBmb3Igb3V0Ym91bmQgY29ubmVjdGlvbnMgaXMgdmVyaWZpZWQgYnkgdGhlCisgICAgICogdHJ1c3RlZCByb290IGNlcnRpZmljYXRlcyBpbiB0aGUgb3V0Ym91bmRfa2V5c3RvcmUuIEluIHN1Y2ggY2FzZXMgdGhpcyBtZXRob2QgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcmV0dXJuIHRydWUKKyAgICAgKiB3aGVuIGNlcnRpZmljYXRlVHlwZSBpcyBPVVRCT1VORCwgYXMgdGhlIGF1dGhlbnRpY2F0aW9uIG9mIHRoZSBzZXJ2ZXIgaGFwcGVucyBkdXJpbmcgU1NMIEhhbmRzaGFrZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZW1vdGVBZGRyZXNzICBpcCBhZGRyZXNzIG9mIHRoZSBjb25uZWN0aW5nIG5vZGUuCisgICAgICogQHBhcmFtIHJlbW90ZVBvcnQgICAgIHBvcnQgb2YgdGhlIGNvbm5lY3Rpbmcgbm9kZS4KKyAgICAgKiBAcGFyYW0gY2VydGlmaWNhdGVzICAgcGVlciBjZXJ0aWZpY2F0ZXMKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvblR5cGUgSWYgdGhlIGNvbm5lY3Rpb24gaXMgaW5ib3VuZC9vdXRib3VuZCBjb25uZWN0aW9uLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBzaG91bGQgYmUgYWNjZXB0ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBkZWZhdWx0IGJvb2xlYW4gYXV0aGVudGljYXRlKEluZXRBZGRyZXNzIHJlbW90ZUFkZHJlc3MsIGludCByZW1vdGVQb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMsIEludGVybm9kZUNvbm5lY3Rpb25EaXJlY3Rpb24gY29ubmVjdGlvblR5cGUpCisgICAgeworICAgICAgICByZXR1cm4gYXV0aGVudGljYXRlKHJlbW90ZUFkZHJlc3MsIHJlbW90ZVBvcnQpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFZhbGlkYXRlcyBjb25maWd1cmF0aW9uIG9mIElJbnRlcm5vZGVBdXRoZW50aWNhdG9yIGltcGxlbWVudGF0aW9uIChpZiBjb25maWd1cmFibGUpLgpAQCAtNDEsNCArNzAsMzAgQEAKICAgICAgKiBAdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gd2hlbiB0aGVyZSBpcyBhIGNvbmZpZ3VyYXRpb24gZXJyb3IuCiAgICAgICovCiAgICAgdm9pZCB2YWxpZGF0ZUNvbmZpZ3VyYXRpb24oKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldHVwIGlzIGNhbGxlZCBvbmNlIHVwb24gc3lzdGVtIHN0YXJ0dXAgdG8gaW5pdGlhbGl6ZSB0aGUgSUF1dGhlbnRpY2F0b3IuCisgICAgICoKKyAgICAgKiBGb3IgZXhhbXBsZSwgdXNlIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSBhbnkgcmVxdWlyZWQga2V5c3BhY2VzL2NvbHVtbiBmYW1pbGllcy4KKyAgICAgKi8KKyAgICBkZWZhdWx0IHZvaWQgc2V0dXBJbnRlcm5vZGUoKQorICAgIHsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEVudW0gdGhhdCByZXByZXNlbnRzIGNvbm5lY3Rpb24gdHlwZSBvZiBpbnRlcm5vZGUgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIElOQk9VTkQgLSBjYWxsZWQgYWZ0ZXIgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCwgd2l0aCBjZXJ0aWZpY2F0ZSBhdmFpbGFibGUgaWYgcHJlc2VudC4KKyAgICAgKiBPVVRCT1VORCAtIGNhbGxlZCBhZnRlciBjb25uZWN0aW9uIGVzdGFibGlzaGVkLCB3aXRoIGNlcnRpZmljYXRlIGF2YWlsYWJsZSBpZiBwcmVzZW50LgorICAgICAqIE9VVEJPVU5EX1BSRUNPTk5FQ1QgLSBjYWxsZWQgYmVmb3JlIGluaXRpYXRpbmcgYSBjb25uZWN0aW9uLCB3aXRob3V0IGNlcnRpZmljYXRlIGF2YWlsYWJsZS4KKyAgICAgKiBUaGUgb3V0Ym91bmQgY29ubmVjdGlvbiB3aWxsIGJlIGF1dGhlbnRpY2F0ZWQgd2l0aCB0aGUgY2VydGlmaWNhdGUgb25jZSBhIHJlZGlyZWN0ZWQgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZC4KKyAgICAgKiBUaGlzIGlzIGFuIGV4dHJhIGNoZWNrIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IG1pc2NvbmZpZ3VyYXRpb24gYmVmb3JlIHJlY29ubmVjdGlvbiwgb3IgaWdub3JlZCBieSByZXR1cm5pbmcgdHJ1ZS4KKyAgICAgKi8KKyAgICBlbnVtIEludGVybm9kZUNvbm5lY3Rpb25EaXJlY3Rpb24KKyAgICB7CisgICAgICAgIElOQk9VTkQsCisgICAgICAgIE9VVEJPVU5ELAorICAgICAgICBPVVRCT1VORF9QUkVDT05ORUNUCisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9QZXJtaXNzaW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL1Blcm1pc3Npb24uamF2YQppbmRleCBkNTUyMjgwLi5kMzI1NjUyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL1Blcm1pc3Npb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL1Blcm1pc3Npb24uamF2YQpAQCAtNjEsOSArNjEsMTMgQEAKICAgICBERVNDUklCRSwgLy8gcmVxdWlyZWQgb24gdGhlIHJvb3QtbGV2ZWwgUm9sZVJlc291cmNlIHRvIGxpc3QgYWxsIFJvbGVzCiAKICAgICAvLyBVREYgcGVybWlzc2lvbnMKLSAgICBFWEVDVVRFOyAgLy8gcmVxdWlyZWQgdG8gaW52b2tlIGFueSB1c2VyIGRlZmluZWQgZnVuY3Rpb24gb3IgYWdncmVnYXRlCisgICAgRVhFQ1VURSwgIC8vIHJlcXVpcmVkIHRvIGludm9rZSBhbnkgdXNlciBkZWZpbmVkIGZ1bmN0aW9uIG9yIGFnZ3JlZ2F0ZQorCisgICAgVU5NQVNLLCAvLyByZXF1aXJlZCB0byBzZWUgbWFza2VkIGRhdGEKKworICAgIFNFTEVDVF9NQVNLRUQ7IC8vIHJlcXVpcmVkIGZvciBTRUxFQ1Qgb24gYSB0YWJsZSB3aXRoIHJlc3RpY3Rpb25zIG9uIG1hc2tlZCBjb2x1bW5zCiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNldDxQZXJtaXNzaW9uPiBBTEwgPQotICAgICAgICAgICAgU2V0cy5pbW11dGFibGVFbnVtU2V0KEVudW1TZXQucmFuZ2UoUGVybWlzc2lvbi5DUkVBVEUsIFBlcm1pc3Npb24uRVhFQ1VURSkpOworICAgICAgICAgICAgU2V0cy5pbW11dGFibGVFbnVtU2V0KEVudW1TZXQucmFuZ2UoUGVybWlzc2lvbi5DUkVBVEUsIFBlcm1pc3Npb24uU0VMRUNUX01BU0tFRCkpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0PFBlcm1pc3Npb24+IE5PTkUgPSBJbW11dGFibGVTZXQub2YoKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2JhdGNobG9nL0JhdGNoLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9iYXRjaGxvZy9CYXRjaC5qYXZhCmluZGV4IGI1YTYyODguLjY2NzI2M2IgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2JhdGNobG9nL0JhdGNoLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYmF0Y2hsb2cvQmF0Y2guamF2YQpAQCAtMTI2LDEwICsxMjYsMTAgQEAKICAgICAgICAgICAgIGJhdGNoLmlkLnNlcmlhbGl6ZShvdXQpOwogICAgICAgICAgICAgb3V0LndyaXRlTG9uZyhiYXRjaC5jcmVhdGlvblRpbWUpOwogCi0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoYmF0Y2guZGVjb2RlZE11dGF0aW9ucy5zaXplKCkpOworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoYmF0Y2guZGVjb2RlZE11dGF0aW9ucy5zaXplKCkpOwogICAgICAgICAgICAgZm9yIChNdXRhdGlvbiBtdXRhdGlvbiA6IGJhdGNoLmRlY29kZWRNdXRhdGlvbnMpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KG11dGF0aW9uLnNlcmlhbGl6ZWRTaXplKHZlcnNpb24pKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihtdXRhdGlvbi5zZXJpYWxpemVkU2l6ZSh2ZXJzaW9uKSk7CiAgICAgICAgICAgICAgICAgTXV0YXRpb24uc2VyaWFsaXplci5zZXJpYWxpemUobXV0YXRpb24sIG91dCwgdmVyc2lvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE1MCw3ICsxNTAsNyBAQAogCiAgICAgICAgIHByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248Qnl0ZUJ1ZmZlcj4gcmVhZEVuY29kZWRNdXRhdGlvbnMoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IChpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogCiAgICAgICAgICAgICBBcnJheUxpc3Q8Qnl0ZUJ1ZmZlcj4gbXV0YXRpb25zID0gbmV3IEFycmF5TGlzdDw+KGNvdW50KTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKQEAgLTE2MSwxMiArMTYxLDEyIEBACiAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxNdXRhdGlvbj4gZGVjb2RlTXV0YXRpb25zKERhdGFJbnB1dFBsdXMgaW4sIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewotICAgICAgICAgICAgaW50IGNvdW50ID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgaW50IGNvdW50ID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAKICAgICAgICAgICAgIEFycmF5TGlzdDxNdXRhdGlvbj4gbXV0YXRpb25zID0gbmV3IEFycmF5TGlzdDw+KGNvdW50KTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbi5yZWFkVW5zaWduZWRWSW50KCk7IC8vIHNraXAgbXV0YXRpb24gc2l6ZQorICAgICAgICAgICAgICAgIGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOyAvLyBza2lwIG11dGF0aW9uIHNpemUKICAgICAgICAgICAgICAgICBtdXRhdGlvbnMuYWRkKE11dGF0aW9uLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIHZlcnNpb24pKTsKICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYmF0Y2hsb2cvQmF0Y2hsb2dNYW5hZ2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9iYXRjaGxvZy9CYXRjaGxvZ01hbmFnZXIuamF2YQppbmRleCA2ZDEwMmIwLi5iN2IyNWNiIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9iYXRjaGxvZy9CYXRjaGxvZ01hbmFnZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9iYXRjaGxvZy9CYXRjaGxvZ01hbmFnZXIuamF2YQpAQCAtNzcsNiArNzcsNyBAQAogCiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTExJU0VDT05EUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvckZhY3RvcnkuR2xvYmFsLmV4ZWN1dG9yRmFjdG9yeTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5CQVRDSExPR19SRVBMQVlfVElNRU9VVF9JTl9NUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5RdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWw7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsV2l0aFBhZ2luZzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlZlcmIuTVVUQVRJT05fUkVROwpAQCAtOTEsNyArOTIsNyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEJhdGNobG9nTWFuYWdlci5jbGFzcyk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCYXRjaGxvZ01hbmFnZXIgaW5zdGFuY2UgPSBuZXcgQmF0Y2hsb2dNYW5hZ2VyKCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEJBVENITE9HX1JFUExBWV9USU1FT1VUID0gTG9uZy5nZXRMb25nKCJjYXNzYW5kcmEuYmF0Y2hsb2cucmVwbGF5X3RpbWVvdXRfaW5fbXMiLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0V3JpdGVScGNUaW1lb3V0KE1JTExJU0VDT05EUykgKiAyKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQkFUQ0hMT0dfUkVQTEFZX1RJTUVPVVQgPSBCQVRDSExPR19SRVBMQVlfVElNRU9VVF9JTl9NUy5nZXRMb25nKERhdGFiYXNlRGVzY3JpcHRvci5nZXRXcml0ZVJwY1RpbWVvdXQoTUlMTElTRUNPTkRTKSAqIDIpOwogCiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBsb25nIHRvdGFsQmF0Y2hlc1JlcGxheWVkID0gMDsgLy8gbm8gY29uY3VycmVuY3kgcHJvdGVjdGlvbiBuZWNlc3NhcnkgYXMgb25seSB3cml0dGVuIGJ5IHJlcGxheSB0aHJlYWQuCiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBUaW1lVVVJRCBsYXN0UmVwbGF5ZWRVdWlkID0gVGltZVVVSUQubWluQXRVbml4TWlsbGlzKDApOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY2FjaGUvQXV0b1NhdmluZ0NhY2hlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jYWNoZS9BdXRvU2F2aW5nQ2FjaGUuamF2YQppbmRleCAxZjM4M2VjLi5kZGUzNmYxIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jYWNoZS9BdXRvU2F2aW5nQ2FjaGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jYWNoZS9BdXRvU2F2aW5nQ2FjaGUuamF2YQpAQCAtMTcsMTUgKzE3LDE3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGU7CiAKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEubmlvLmZpbGUuTm9TdWNoRmlsZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlEZXF1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRGdXR1cmU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5jb25jdXJyZW50Lk5vdFRocmVhZFNhZmU7CiAKIGltcG9ydCBvcmcuY2xpZmZjLmhpZ2hfc2NhbGVfbGliLk5vbkJsb2NraW5nSGFzaFNldDsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwpAQCAtMzMsMTkgKzM1LDMwIEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LkV4ZWN1dG9yUGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkluZm8uVW5pdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25JbmZvLlVuaXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNXcml0ZUVycm9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkNoZWNrc3VtbWVkUmFuZG9tQWNjZXNzUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuQ2hlY2tzdW1tZWRTZXF1ZW50aWFsV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuQ29ycnVwdEZpbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1cy5EYXRhSW5wdXRTdHJlYW1QbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSW5wdXRTdHJlYW1QbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZU91dHB1dFN0cmVhbVBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuV3JhcHBlZERhdGFPdXRwdXRTdHJlYW1QbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNhY2hlU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5KVk1TdGFiaWxpdHlJbnNwZWN0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKQEAgLTU5LDggKzcyLDkgQEAKIHsKICAgICBwdWJsaWMgaW50ZXJmYWNlIElTdHJlYW1GYWN0b3J5CiAgICAgewotICAgICAgICBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShGaWxlIGRhdGFQYXRoLCBGaWxlIGNyY1BhdGgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLSAgICAgICAgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbShGaWxlIGRhdGFQYXRoLCBGaWxlIGNyY1BhdGgpOworICAgICAgICBEYXRhSW5wdXRTdHJlYW1QbHVzIGdldElucHV0U3RyZWFtKEZpbGUgZGF0YVBhdGgsIEZpbGUgY3JjUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgICAgIERhdGFPdXRwdXRTdHJlYW1QbHVzIGdldE91dHB1dFN0cmVhbShGaWxlIGRhdGFQYXRoLCBGaWxlIGNyY1BhdGgpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBdXRvU2F2aW5nQ2FjaGUuY2xhc3MpOwpAQCAtODUsOCArOTksMTAgQEAKICAgICAgKiAiZSIgaW50cm9kdWNlZCB3aXRoIENBU1NBTkRSQS0xMTIwNiwgb21pdHMgSW5kZXhJbmZvIGZyb20ga2V5LWNhY2hlLCBzdG9yZXMgb2Zmc2V0IGludG8gaW5kZXgtZmlsZQogICAgICAqCiAgICAgICogImYiIGludHJvZHVjZWQgd2l0aCBDQVNTQU5EUkEtOTQyNSwgY2hhbmdlcyAia2V5c3BhY2UudGFibGUuaW5kZXgiIGluIGNhY2hlIGtleXMgdG8gVGFibGVNZXRhZGF0YS5pZCtUYWJsZU1ldGFkYXRhLmluZGV4TmFtZQorICAgICAqCisgICAgICogImciIGludHJvZHVjZWQgYW4gZXhwbGljaXQgc3N0YWJsZSBmb3JtYXQgdHlwZSBvcmRpbmFsIG51bWJlciBzbyB0aGF0IHRoZSBlbnRyeSBjYW4gYmUgc2tpcHBlZCByZWdhcmRsZXNzIG9mIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gYW5kIHVzZWQgc2VyaWFsaXplcgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVJSRU5UX1ZFUlNJT04gPSAiZiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVUlJFTlRfVkVSU0lPTiA9ICJnIjsKIAogICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIElTdHJlYW1GYWN0b3J5IHN0cmVhbUZhY3RvcnkgPSBuZXcgSVN0cmVhbUZhY3RvcnkoKQogICAgIHsKQEAgLTk1LDEyICsxMTEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRyaWNrbGVGc3luY0J5dGVJbnRlcnZhbChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0VHJpY2tsZUZzeW5jSW50ZXJ2YWxJbktpQigpICogMTAyNCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmlzaE9uQ2xvc2UodHJ1ZSkuYnVpbGQoKTsKIAotICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oRmlsZSBkYXRhUGF0aCwgRmlsZSBjcmNQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgcHVibGljIERhdGFJbnB1dFN0cmVhbVBsdXMgZ2V0SW5wdXRTdHJlYW0oRmlsZSBkYXRhUGF0aCwgRmlsZSBjcmNQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIENoZWNrc3VtbWVkUmFuZG9tQWNjZXNzUmVhZGVyLm9wZW4oZGF0YVBhdGgsIGNyY1BhdGgpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oRmlsZSBkYXRhUGF0aCwgRmlsZSBjcmNQYXRoKQorICAgICAgICBwdWJsaWMgRGF0YU91dHB1dFN0cmVhbVBsdXMgZ2V0T3V0cHV0U3RyZWFtKEZpbGUgZGF0YVBhdGgsIEZpbGUgY3JjUGF0aCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGVja3N1bW1lZFNlcXVlbnRpYWxXcml0ZXIoZGF0YVBhdGgsIGNyY1BhdGgsIG51bGwsIHdyaXRlck9wdGlvbik7CiAgICAgICAgIH0KQEAgLTEyMSwxMiArMTM3LDE3IEBACiAKICAgICBwdWJsaWMgRmlsZSBnZXRDYWNoZURhdGFQYXRoKFN0cmluZyB2ZXJzaW9uKQogICAgIHsKLSAgICAgICAgcmV0dXJuIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZXJpYWxpemVkQ2FjaGVQYXRoKCBjYWNoZVR5cGUsIHZlcnNpb24sICJkYiIpOworICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlcmlhbGl6ZWRDYWNoZVBhdGgoY2FjaGVUeXBlLCB2ZXJzaW9uLCAiZGIiKTsKICAgICB9CiAKICAgICBwdWJsaWMgRmlsZSBnZXRDYWNoZUNyY1BhdGgoU3RyaW5nIHZlcnNpb24pCiAgICAgewotICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlcmlhbGl6ZWRDYWNoZVBhdGgoIGNhY2hlVHlwZSwgdmVyc2lvbiwgImNyYyIpOworICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlcmlhbGl6ZWRDYWNoZVBhdGgoY2FjaGVUeXBlLCB2ZXJzaW9uLCAiY3JjIik7CisgICAgfQorCisgICAgcHVibGljIEZpbGUgZ2V0Q2FjaGVNZXRhZGF0YVBhdGgoU3RyaW5nIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlcmlhbGl6ZWRDYWNoZVBhdGgoY2FjaGVUeXBlLCB2ZXJzaW9uLCAibWV0YWRhdGEiKTsKICAgICB9CiAKICAgICBwdWJsaWMgV3JpdGVyIGdldFdyaXRlcihpbnQga2V5c1RvU2F2ZSkKQEAgLTE3NSw2ICsxOTYsNyBAQAogICAgICAgICByZXR1cm4gY2FjaGVMb2FkOwogICAgIH0KIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCiAgICAgcHVibGljIGludCBsb2FkU2F2ZWQoKQogICAgIHsKICAgICAgICAgaW50IGNvdW50ID0gMDsKQEAgLTE4MywzOSArMjA1LDMzIEBACiAgICAgICAgIC8vIG1vZGVybiBmb3JtYXQsIGFsbG93cyBib3RoIGtleSBhbmQgdmFsdWUgKHNvIGtleSBjYWNoZSBsb2FkIGNhbiBiZSBwdXJlbHkgc2VxdWVudGlhbCkKICAgICAgICAgRmlsZSBkYXRhUGF0aCA9IGdldENhY2hlRGF0YVBhdGgoQ1VSUkVOVF9WRVJTSU9OKTsKICAgICAgICAgRmlsZSBjcmNQYXRoID0gZ2V0Q2FjaGVDcmNQYXRoKENVUlJFTlRfVkVSU0lPTik7Ci0gICAgICAgIGlmIChkYXRhUGF0aC5leGlzdHMoKSAmJiBjcmNQYXRoLmV4aXN0cygpKQorICAgICAgICBGaWxlIG1ldGFkYXRhUGF0aCA9IGdldENhY2hlTWV0YWRhdGFQYXRoKENVUlJFTlRfVkVSU0lPTik7CisgICAgICAgIGlmIChkYXRhUGF0aC5leGlzdHMoKSAmJiBjcmNQYXRoLmV4aXN0cygpICYmIG1ldGFkYXRhUGF0aC5leGlzdHMoKSkKICAgICAgICAgewogICAgICAgICAgICAgRGF0YUlucHV0U3RyZWFtUGx1cyBpbiA9IG51bGw7CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygicmVhZGluZyBzYXZlZCBjYWNoZSB7fSIsIGRhdGFQYXRoKTsKLSAgICAgICAgICAgICAgICBpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW1QbHVzKG5ldyBMZW5ndGhBdmFpbGFibGVJbnB1dFN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzdHJlYW1GYWN0b3J5LmdldElucHV0U3RyZWFtKGRhdGFQYXRoLCBjcmNQYXRoKSksIGRhdGFQYXRoLmxlbmd0aCgpKSk7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlJlYWRpbmcgc2F2ZWQgY2FjaGU6IHt9LCB7fSwge30iLCBkYXRhUGF0aCwgY3JjUGF0aCwgbWV0YWRhdGFQYXRoKTsKKyAgICAgICAgICAgICAgICB0cnkgKEZpbGVJbnB1dFN0cmVhbVBsdXMgbWV0YWRhdGFJbiA9IG1ldGFkYXRhUGF0aC5uZXdJbnB1dFN0cmVhbSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVMb2FkZXIuZGVzZXJpYWxpemVNZXRhZGF0YShtZXRhZGF0YUluKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbiA9IHN0cmVhbUZhY3RvcnkuZ2V0SW5wdXRTdHJlYW0oZGF0YVBhdGgsIGNyY1BhdGgpOwogCiAgICAgICAgICAgICAgICAgLy9DaGVjayB0aGUgc2NoZW1hIGhhcyBub3QgY2hhbmdlZCBzaW5jZSBDRnMgYXJlIGxvb2tlZCB1cCBieSBuYW1lIHdoaWNoIGlzIGFtYmlndW91cwogICAgICAgICAgICAgICAgIFVVSUQgc2NoZW1hVmVyc2lvbiA9IG5ldyBVVUlEKGluLnJlYWRMb25nKCksIGluLnJlYWRMb25nKCkpOwogICAgICAgICAgICAgICAgIGlmICghc2NoZW1hVmVyc2lvbi5lcXVhbHMoU2NoZW1hLmluc3RhbmNlLmdldFZlcnNpb24oKSkpCiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYWNoZSBzY2hlbWEgdmVyc2lvbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzY2hlbWFWZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1hdGNoIGN1cnJlbnQgc2NoZW1hIHZlcnNpb24gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU2NoZW1hLmluc3RhbmNlLmdldFZlcnNpb24oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2NoZW1hVmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWF0Y2ggY3VycmVudCBzY2hlbWEgdmVyc2lvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU2NoZW1hLmluc3RhbmNlLmdldFZlcnNpb24oKSk7CiAKICAgICAgICAgICAgICAgICBBcnJheURlcXVlPEZ1dHVyZTxQYWlyPEssIFY+Pj4gZnV0dXJlcyA9IG5ldyBBcnJheURlcXVlPD4oKTsKICAgICAgICAgICAgICAgICBsb25nIGxvYWRCeU5hbm9zID0gc3RhcnQgKyBUaW1lVW5pdC5TRUNPTkRTLnRvTmFub3MoRGF0YWJhc2VEZXNjcmlwdG9yLmdldENhY2hlTG9hZFRpbWVvdXQoKSk7CiAgICAgICAgICAgICAgICAgd2hpbGUgKG5hbm9UaW1lKCkgPCBsb2FkQnlOYW5vcyAmJiBpbi5hdmFpbGFibGUoKSA+IDApCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvL3RhYmxlSWQgYW5kIGluZGV4TmFtZSBhcmUgc2VyaWFsaXplZCBieSB0aGUgc2VyaWFsaXplcnMgaW4gQ2FjaGVTZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgIC8vVGhhdCBpcyBkZWxlZ2F0ZWQgdGhlcmUgYmVjYXVzZSB0aGVyZSBhcmUgc2VyaWFsaXplciBzcGVjaWZpYyBjb25kaXRpb25zCi0gICAgICAgICAgICAgICAgICAgIC8vd2hlcmUgYSBjYWNoZSBrZXkgaXMgc2tpcHBlZCBhbmQgbm90IHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgVGFibGVJZCB0YWJsZUlkID0gVGFibGVJZC5kZXNlcmlhbGl6ZShpbik7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbmRleE5hbWUgPSBpbi5yZWFkVVRGKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleE5hbWUuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhOYW1lID0gbnVsbDsKLQotICAgICAgICAgICAgICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBTY2hlbWEuaW5zdGFuY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmVJbnN0YW5jZSh0YWJsZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4TmFtZSAhPSBudWxsICYmIGNmcyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgY2ZzID0gY2ZzLmluZGV4TWFuYWdlci5nZXRJbmRleEJ5TmFtZShpbmRleE5hbWUpLmdldEJhY2tpbmdUYWJsZSgpLm9yRWxzZShudWxsKTsKLQotICAgICAgICAgICAgICAgICAgICBGdXR1cmU8UGFpcjxLLCBWPj4gZW50cnlGdXR1cmUgPSBjYWNoZUxvYWRlci5kZXNlcmlhbGl6ZShpbiwgY2ZzKTsKKyAgICAgICAgICAgICAgICAgICAgRnV0dXJlPFBhaXI8SywgVj4+IGVudHJ5RnV0dXJlID0gY2FjaGVMb2FkZXIuZGVzZXJpYWxpemUoaW4pOwogICAgICAgICAgICAgICAgICAgICAvLyBLZXkgY2FjaGUgZW50cnkgY2FuIHJldHVybiBudWxsLCBpZiB0aGUgU1NUYWJsZSBkb2Vzbid0IGV4aXN0LgogICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnlGdXR1cmUgPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMjY4LDcgKzI4NCw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQogICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJjb21wbGV0ZWQgcmVhZGluZyAoe30gbXM7IHt9IGtleXMpIHNhdmVkIGNhY2hlIHt9IiwKLSAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTkFOT1NFQ09ORFMudG9NaWxsaXMobmFub1RpbWUoKSAtIHN0YXJ0KSwgY291bnQsIGRhdGFQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5OQU5PU0VDT05EUy50b01pbGxpcyhuYW5vVGltZSgpIC0gc3RhcnQpLCBjb3VudCwgZGF0YVBhdGgpOwogICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgfQogCkBAIC0zMTMsNyArMzI5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c0VzdGltYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbml0LktFWVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRUaW1lVVVJRCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFRpbWVVVUlEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhY2hlRGF0YVBhdGgoQ1VSUkVOVF9WRVJTSU9OKS50b1BhdGgoKS50b1N0cmluZygpKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBDYWNoZVNlcnZpY2UuQ2FjaGVUeXBlIGNhY2hlVHlwZSgpCkBAIC0zNDEsOCArMzU4LDEyIEBACiAKICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBuYW5vVGltZSgpOwogCi0gICAgICAgICAgICBQYWlyPEZpbGUsIEZpbGU+IGNhY2hlRmlsZVBhdGhzID0gdGVtcENhY2hlRmlsZXMoKTsKLSAgICAgICAgICAgIHRyeSAoV3JhcHBlZERhdGFPdXRwdXRTdHJlYW1QbHVzIHdyaXRlciA9IG5ldyBXcmFwcGVkRGF0YU91dHB1dFN0cmVhbVBsdXMoc3RyZWFtRmFjdG9yeS5nZXRPdXRwdXRTdHJlYW0oY2FjaGVGaWxlUGF0aHMubGVmdCwgY2FjaGVGaWxlUGF0aHMucmlnaHQpKSkKKyAgICAgICAgICAgIEZpbGUgZGF0YVRtcEZpbGUgPSBnZXRUZW1wQ2FjaGVGaWxlKGdldENhY2hlRGF0YVBhdGgoQ1VSUkVOVF9WRVJTSU9OKSk7CisgICAgICAgICAgICBGaWxlIGNyY1RtcEZpbGUgPSBnZXRUZW1wQ2FjaGVGaWxlKGdldENhY2hlQ3JjUGF0aChDVVJSRU5UX1ZFUlNJT04pKTsKKyAgICAgICAgICAgIEZpbGUgbWV0YWRhdGFUbXBGaWxlID0gZ2V0VGVtcENhY2hlRmlsZShnZXRDYWNoZU1ldGFkYXRhUGF0aChDVVJSRU5UX1ZFUlNJT04pKTsKKworICAgICAgICAgICAgdHJ5IChXcmFwcGVkRGF0YU91dHB1dFN0cmVhbVBsdXMgd3JpdGVyID0gbmV3IFdyYXBwZWREYXRhT3V0cHV0U3RyZWFtUGx1cyhzdHJlYW1GYWN0b3J5LmdldE91dHB1dFN0cmVhbShkYXRhVG1wRmlsZSwgY3JjVG1wRmlsZSkpOworICAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtUGx1cyBtZXRhZGF0YVdyaXRlciA9IG1ldGFkYXRhVG1wRmlsZS5uZXdPdXRwdXRTdHJlYW0oRmlsZS5Xcml0ZU1vZGUuT1ZFUldSSVRFKSkKICAgICAgICAgICAgIHsKIAogICAgICAgICAgICAgICAgIC8vTmVlZCB0byBiZSBhYmxlIHRvIGNoZWNrIHNjaGVtYSB2ZXJzaW9uIGJlY2F1c2UgQ0YgbmFtZXMgYXJlIGFtYmlndW91cwpAQCAtMzY2LDYgKzM4Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlzV3JpdHRlbiA+PSBrZXlzRXN0aW1hdGUpCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYWNoZUxvYWRlci5zZXJpYWxpemVNZXRhZGF0YShtZXRhZGF0YVdyaXRlcik7CisgICAgICAgICAgICAgICAgbWV0YWRhdGFXcml0ZXIuc3luYygpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB8IE5vU3VjaEZpbGVFeGNlcHRpb24gZSkKICAgICAgICAgICAgIHsKQEAgLTM3MywzMCArMzk3LDM2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRlNXcml0ZUVycm9yKGUsIGNhY2hlRmlsZVBhdGhzLmxlZnQpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBGU1dyaXRlRXJyb3IoZSwgZGF0YVRtcEZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhY2hlTG9hZGVyLmNsZWFudXBBZnRlclNlcmlhbGl6ZSgpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBGaWxlIGNhY2hlRmlsZSA9IGdldENhY2hlRGF0YVBhdGgoQ1VSUkVOVF9WRVJTSU9OKTsKKyAgICAgICAgICAgIEZpbGUgZGF0YUZpbGUgPSBnZXRDYWNoZURhdGFQYXRoKENVUlJFTlRfVkVSU0lPTik7CiAgICAgICAgICAgICBGaWxlIGNyY0ZpbGUgPSBnZXRDYWNoZUNyY1BhdGgoQ1VSUkVOVF9WRVJTSU9OKTsKKyAgICAgICAgICAgIEZpbGUgbWV0YWRhdGFGaWxlID0gZ2V0Q2FjaGVNZXRhZGF0YVBhdGgoQ1VSUkVOVF9WRVJTSU9OKTsKIAotICAgICAgICAgICAgY2FjaGVGaWxlLnRyeURlbGV0ZSgpOyAvLyBpZ25vcmUgZXJyb3IgaWYgaXQgZGlkbid0IGV4aXN0CisgICAgICAgICAgICBkYXRhRmlsZS50cnlEZWxldGUoKTsgLy8gaWdub3JlIGVycm9yIGlmIGl0IGRpZG4ndCBleGlzdAogICAgICAgICAgICAgY3JjRmlsZS50cnlEZWxldGUoKTsKKyAgICAgICAgICAgIG1ldGFkYXRhRmlsZS50cnlEZWxldGUoKTsKIAotICAgICAgICAgICAgaWYgKCFjYWNoZUZpbGVQYXRocy5sZWZ0LnRyeU1vdmUoY2FjaGVGaWxlKSkKLSAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlVuYWJsZSB0byByZW5hbWUge30gdG8ge30iLCBjYWNoZUZpbGVQYXRocy5sZWZ0LCBjYWNoZUZpbGUpOworICAgICAgICAgICAgaWYgKCFkYXRhVG1wRmlsZS50cnlNb3ZlKGRhdGFGaWxlKSkKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlVuYWJsZSB0byByZW5hbWUge30gdG8ge30iLCBkYXRhVG1wRmlsZSwgZGF0YUZpbGUpOwogCi0gICAgICAgICAgICBpZiAoIWNhY2hlRmlsZVBhdGhzLnJpZ2h0LnRyeU1vdmUoY3JjRmlsZSkpCi0gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJVbmFibGUgdG8gcmVuYW1lIHt9IHRvIHt9IiwgY2FjaGVGaWxlUGF0aHMucmlnaHQsIGNyY0ZpbGUpOworICAgICAgICAgICAgaWYgKCFjcmNUbXBGaWxlLnRyeU1vdmUoY3JjRmlsZSkpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJVbmFibGUgdG8gcmVuYW1lIHt9IHRvIHt9IiwgY3JjVG1wRmlsZSwgY3JjRmlsZSk7CiAKLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJTYXZlZCB7fSAoe30gaXRlbXMpIGluIHt9IG1zIiwgY2FjaGVUeXBlLCBrZXlzV3JpdHRlbiwgVGltZVVuaXQuTkFOT1NFQ09ORFMudG9NaWxsaXMobmFub1RpbWUoKSAtIHN0YXJ0KSk7CisgICAgICAgICAgICBpZiAoIW1ldGFkYXRhVG1wRmlsZS50cnlNb3ZlKG1ldGFkYXRhRmlsZSkpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJVbmFibGUgdG8gcmVuYW1lIHt9IHRvIHt9IiwgbWV0YWRhdGFUbXBGaWxlLCBtZXRhZGF0YUZpbGUpOworCisgICAgICAgICAgICBsb2dnZXIuaW5mbygiU2F2ZWQge30gKHt9IGl0ZW1zKSBpbiB7fSBtcyB0byB7fSA6IHt9IE1CIiwgY2FjaGVUeXBlLCBrZXlzV3JpdHRlbiwgVGltZVVuaXQuTkFOT1NFQ09ORFMudG9NaWxsaXMobmFub1RpbWUoKSAtIHN0YXJ0KSwgZGF0YUZpbGUudG9QYXRoKCksIGRhdGFGaWxlLmxlbmd0aCgpIC8gKDEgPDwgMjApKTsKICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgUGFpcjxGaWxlLCBGaWxlPiB0ZW1wQ2FjaGVGaWxlcygpCisgICAgICAgIHByaXZhdGUgRmlsZSBnZXRUZW1wQ2FjaGVGaWxlKEZpbGUgY2FjaGVGaWxlKQogICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIGRhdGFQYXRoID0gZ2V0Q2FjaGVEYXRhUGF0aChDVVJSRU5UX1ZFUlNJT04pOwotICAgICAgICAgICAgRmlsZSBjcmNQYXRoID0gZ2V0Q2FjaGVDcmNQYXRoKENVUlJFTlRfVkVSU0lPTik7Ci0gICAgICAgICAgICByZXR1cm4gUGFpci5jcmVhdGUoRmlsZVV0aWxzLmNyZWF0ZVRlbXBGaWxlKGRhdGFQYXRoLm5hbWUoKSwgbnVsbCwgZGF0YVBhdGgucGFyZW50KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZShjcmNQYXRoLm5hbWUoKSwgbnVsbCwgY3JjUGF0aC5wYXJlbnQoKSkpOworICAgICAgICAgICAgcmV0dXJuIEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZShjYWNoZUZpbGUubmFtZSgpLCBudWxsLCBjYWNoZUZpbGUucGFyZW50KCkpOwogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZU9sZENhY2hlRmlsZXMoKQpAQCAtNDMyLDEyICs0NjIsOTEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2FjaGVTZXJpYWxpemVyPEsgZXh0ZW5kcyBDYWNoZUtleSwgVj4KKyAgICAvKioKKyAgICAgKiBBIGJhc2UgY2FjaGUgc2VyaWFsaXplciB0aGF0IGlzIHVzZWQgdG8gc2VyaWFsaXplL2Rlc2VyaWFsaXplIGEgY2FjaGUgdG8vZnJvbSBkaXNrLgorICAgICAqIDxwPgorICAgICAqIEl0IGV4cGVjdHMgdGhlIGZvbGxvd2luZyBsaWZlY3ljbGU6CisgICAgICogU2VyaWFsaXphdGlvbnM6CisgICAgICogMS4ge0BsaW5rICNzZXJpYWxpemUoQ2FjaGVLZXksIERhdGFPdXRwdXRQbHVzLCBDb2x1bW5GYW1pbHlTdG9yZSl9IGlzIGNhbGxlZCBmb3IgZWFjaCBrZXkgaW4gdGhlIGNhY2hlLgorICAgICAqIDIuIHtAbGluayAjc2VyaWFsaXplTWV0YWRhdGEoRGF0YU91dHB1dFBsdXMpfSBpcyBjYWxsZWQgdG8gc2VyaWFsaXplIGFueSBtZXRhZGF0YS4KKyAgICAgKiAzLiB7QGxpbmsgI2NsZWFudXBBZnRlclNlcmlhbGl6ZSgpfSBpcyBjYWxsZWQgdG8gY2xlYW4gdXAgYW55IHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIHNlcmlhbGl6YXRpb24uCisgICAgICogPHA+CisgICAgICogRGVzZXJpYWxpemF0aW9uczoKKyAgICAgKiAxLiB7QGxpbmsgI2Rlc2VyaWFsaXplTWV0YWRhdGEoRGF0YUlucHV0UGx1cyl9IGlzIGNhbGxlZCB0byBkZXNlcmlhbGl6ZSBhbnkgbWV0YWRhdGEuCisgICAgICogMi4ge0BsaW5rICNkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzKX0gaXMgY2FsbGVkIGZvciBlYWNoIGtleSBpbiB0aGUgY2FjaGUuCisgICAgICogMy4ge0BsaW5rICNjbGVhbnVwQWZ0ZXJEZXNlcmlhbGl6ZSgpfSBpcyBjYWxsZWQgdG8gY2xlYW4gdXAgYW55IHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIGRlc2VyaWFsaXphdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciB0aGUgbWV0YWRhdGEgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24uCisgICAgICogVGhlIG1ldGFkYXRhIGluY2x1ZGVzIGEgZGljdGlvbmFyeSBvZiBjb2x1bW4gZmFtaWx5IHN0b3JlcyBjb2xsZWN0ZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24gd2hlbmV2ZXIKKyAgICAgKiB7QGxpbmsgI3dyaXRlQ0ZTKERhdGFPdXRwdXRQbHVzLCBDb2x1bW5GYW1pbHlTdG9yZSl9IG9yIHtAbGluayAjZ2V0T3JDcmVhdGVDRlNPcmRpbmFsKENvbHVtbkZhbWlseVN0b3JlKX0KKyAgICAgKiBhcmUgY2FsbGVkLiBXaGVuIHN1Y2ggbWV0YWRhdGEgaXMgZGVzZXJpYWxpemVkLCB0aGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rICNkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzKX0gbWF5CisgICAgICogdXNlIHtAbGluayAjcmVhZENGUyhEYXRhSW5wdXRQbHVzKX0gbWV0aG9kIHRvIHJlYWQgdGhlIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlZCB3aXRoCisgICAgICoge0BsaW5rICN3cml0ZUNGUyhEYXRhT3V0cHV0UGx1cywgQ29sdW1uRmFtaWx5U3RvcmUpfS4KKyAgICAgKi8KKyAgICBATm90VGhyZWFkU2FmZQorICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ2FjaGVTZXJpYWxpemVyPEsgZXh0ZW5kcyBDYWNoZUtleSwgVj4KICAgICB7Ci0gICAgICAgIHZvaWQgc2VyaWFsaXplKEsga2V5LCBEYXRhT3V0cHV0UGx1cyBvdXQsIENvbHVtbkZhbWlseVN0b3JlIGNmcykgdGhyb3dzIElPRXhjZXB0aW9uOworICAgICAgICBwcml2YXRlIENvbHVtbkZhbWlseVN0b3JlW10gY2ZTdG9yZXM7CiAKLSAgICAgICAgRnV0dXJlPFBhaXI8SywgVj4+IGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4sIENvbHVtbkZhbWlseVN0b3JlIGNmcykgdGhyb3dzIElPRXhjZXB0aW9uOworICAgICAgICBwcml2YXRlIGZpbmFsIExpbmtlZEhhc2hNYXA8UGFpcjxUYWJsZUlkLCBTdHJpbmc+LCBJbnRlZ2VyPiBjZnNPcmRpbmFscyA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKIAotICAgICAgICBkZWZhdWx0IHZvaWQgY2xlYW51cEFmdGVyRGVzZXJpYWxpemUoKSB7IH0KKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIGludCBnZXRPckNyZWF0ZUNGU09yZGluYWwoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKQorICAgICAgICB7CisgICAgICAgICAgICBJbnRlZ2VyIG9yZGluYWwgPSBjZnNPcmRpbmFscy5wdXRJZkFic2VudChQYWlyLmNyZWF0ZShjZnMubWV0YWRhdGEoKS5pZCwgY2ZzLm1ldGFkYXRhKCkuaW5kZXhOYW1lKCkub3JFbHNlKCIiKSksIGNmc09yZGluYWxzLnNpemUoKSk7CisgICAgICAgICAgICBpZiAob3JkaW5hbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIG9yZGluYWwgPSBjZnNPcmRpbmFscy5zaXplKCkgLSAxOworICAgICAgICAgICAgcmV0dXJuIG9yZGluYWw7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgQ29sdW1uRmFtaWx5U3RvcmUgcmVhZENGUyhEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNmU3RvcmVzW2luLnJlYWRVbnNpZ25lZFZJbnQzMigpXTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlQ0ZTKERhdGFPdXRwdXRQbHVzIG91dCwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoZ2V0T3JDcmVhdGVDRlNPcmRpbmFsKGNmcykpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplTWV0YWRhdGEoRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgLy8gd3JpdGUgdGhlIHRhYmxlIGlkcworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoY2ZzT3JkaW5hbHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoUGFpcjxUYWJsZUlkLCBTdHJpbmc+IHRhYmxlQW5kSW5kZXggOiBjZnNPcmRpbmFscy5rZXlTZXQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0YWJsZUFuZEluZGV4LmxlZnQuc2VyaWFsaXplKG91dCk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlVVRGKHRhYmxlQW5kSW5kZXgucmlnaHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZGVzZXJpYWxpemVNZXRhZGF0YShEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaW50IHRhYmxlRW50cmllcyA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOworICAgICAgICAgICAgaWYgKHRhYmxlRW50cmllcyA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNmU3RvcmVzID0gbmV3IENvbHVtbkZhbWlseVN0b3JlW3RhYmxlRW50cmllc107CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlRW50cmllczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRhYmxlSWQgdGFibGVJZCA9IFRhYmxlSWQuZGVzZXJpYWxpemUoaW4pOworICAgICAgICAgICAgICAgIFN0cmluZyBpbmRleE5hbWUgPSBpbi5yZWFkVVRGKCk7CisgICAgICAgICAgICAgICAgY2ZTdG9yZXNbaV0gPSBTY2hlbWEuaW5zdGFuY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmVJbnN0YW5jZSh0YWJsZUlkKTsKKyAgICAgICAgICAgICAgICBpZiAoY2ZTdG9yZXNbaV0gIT0gbnVsbCAmJiAhaW5kZXhOYW1lLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgY2ZTdG9yZXNbaV0gPSBjZlN0b3Jlc1tpXS5pbmRleE1hbmFnZXIuZ2V0SW5kZXhCeU5hbWUoaW5kZXhOYW1lKS5nZXRCYWNraW5nVGFibGUoKS5vckVsc2UobnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXJpYWxpemUoSyBrZXksIERhdGFPdXRwdXRQbHVzIG91dCwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IEZ1dHVyZTxQYWlyPEssIFY+PiBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xlYW51cEFmdGVyU2VyaWFsaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgY2ZzT3JkaW5hbHMuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFudXBBZnRlckRlc2VyaWFsaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgY2ZTdG9yZXMgPSBudWxsOworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY2FjaGUvQ2h1bmtDYWNoZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY2FjaGUvQ2h1bmtDYWNoZS5qYXZhCmluZGV4IDUxZGJkYzYuLjhmMjJlZTggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NhY2hlL0NodW5rQ2FjaGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jYWNoZS9DaHVua0NhY2hlLmphdmEKQEAgLTIzLDE1ICsyMywyMiBAQAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CiAKLWltcG9ydCBjb20uZ2l0aHViLmJlbm1hbmVzLmNhZmZlaW5lLmNhY2hlLio7CitpbXBvcnQgY29tLmdpdGh1Yi5iZW5tYW5lcy5jYWZmZWluZS5jYWNoZS5DYWNoZUxvYWRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmJlbm1hbmVzLmNhZmZlaW5lLmNhY2hlLkNhZmZlaW5lOworaW1wb3J0IGNvbS5naXRodWIuYmVubWFuZXMuY2FmZmVpbmUuY2FjaGUuTG9hZGluZ0NhY2hlOworaW1wb3J0IGNvbS5naXRodWIuYmVubWFuZXMuY2FmZmVpbmUuY2FjaGUuUmVtb3ZhbENhdXNlOworaW1wb3J0IGNvbS5naXRodWIuYmVubWFuZXMuY2FmZmVpbmUuY2FjaGUuUmVtb3ZhbExpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuSW1tZWRpYXRlRXhlY3V0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkNoYW5uZWxQcm94eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkNodW5rUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJlYnVmZmVyZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SZWJ1ZmZlcmVyRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNodW5rQ2FjaGVNZXRyaWNzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5CdWZmZXJQb29sOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5CdWZmZXJQb29sczsKQEAgLTE3MCw3ICsxNzcsNyBAQAogICAgICAgICBjYWNoZS5pbnZhbGlkYXRlQWxsKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBSZWJ1ZmZlcmVyRmFjdG9yeSB3cmFwKENodW5rUmVhZGVyIGZpbGUpCisgICAgcHVibGljIFJlYnVmZmVyZXJGYWN0b3J5IHdyYXAoQ2h1bmtSZWFkZXIgZmlsZSkKICAgICB7CiAgICAgICAgIHJldHVybiBuZXcgQ2FjaGluZ1JlYnVmZmVyZXIoZmlsZSk7CiAgICAgfQpAQCAtMTk2LDE0ICsyMDMsNiBAQAogICAgICAgICBjYWNoZS5pbnZhbGlkYXRlQWxsKEl0ZXJhYmxlcy5maWx0ZXIoY2FjaGUuYXNNYXAoKS5rZXlTZXQoKSwgeCAtPiB4LnBhdGguZXF1YWxzKGZpbGVOYW1lKSkpOwogICAgIH0KIAotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHB1YmxpYyB2b2lkIGVuYWJsZShib29sZWFuIGVuYWJsZWQpCi0gICAgewotICAgICAgICBDaHVua0NhY2hlLmVuYWJsZWQgPSBlbmFibGVkOwotICAgICAgICBjYWNoZS5pbnZhbGlkYXRlQWxsKCk7Ci0gICAgICAgIG1ldHJpY3MucmVzZXQoKTsKLSAgICB9Ci0KICAgICAvLyBUT0RPOiBJbnZhbGlkYXRlIGNhY2hlcyBmb3Igb2Jzb2xldGVkL01PVkVEX1NUQVJUIHRhYmxlcz8KIAogICAgIC8qKgpAQCAtMjM4LDggKzIzNywxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRocm93YWJsZXMucHJvcGFnYXRlSWZJbnN0YW5jZU9mKHQuZ2V0Q2F1c2UoKSwgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24uY2xhc3MpOwotICAgICAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKHQpOworICAgICAgICAgICAgICAgIGlmICh0LmdldENhdXNlKCkgaW5zdGFuY2VvZiBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKXQuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgICAgICBUaHJvd2FibGVzLnRocm93SWZVbmNoZWNrZWQodCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzE3LDQgKzMxOCw0IEBACiAgICAgICAgICAgICAgICAgLm1hcChwb2xpY3kgLT4gcG9saWN5LndlaWdodGVkU2l6ZSgpLm9yRWxzZUdldChjYWNoZTo6ZXN0aW1hdGVkU2l6ZSkpCiAgICAgICAgICAgICAgICAgLm9yRWxzZUdldChjYWNoZTo6ZXN0aW1hdGVkU2l6ZSk7CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmN1cnJlbnQvRGVidWdnYWJsZVRhc2suamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmN1cnJlbnQvRGVidWdnYWJsZVRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzA0ZWI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uY3VycmVudC9EZWJ1Z2dhYmxlVGFzay5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5TaGFyZWQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2hhcmVkLlJlY3Vyc2l2ZS5JTlRFUkZBQ0VTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5TaGFyZWQuU2NvcGUuU0lNVUxBVElPTjsKKworLyoqCisgKiBJbnRlcmZhY2UgdG8gaW5jbHVkZSBvbiBhIFJ1bm5hYmxlIG9yIENhbGxhYmxlIHN1Ym1pdHRlZCB0byB0aGUge0BsaW5rIFNoYXJlZEV4ZWN1dG9yUG9vbH0gdG8gcHJvdmlkZSBtb3JlCisgKiBkZXRhaWxlZCBkaWFnbm9zdGljcy4KKyAqLworQFNoYXJlZChzY29wZSA9IFNJTVVMQVRJT04sIGlubmVyID0gSU5URVJGQUNFUykKK3B1YmxpYyBpbnRlcmZhY2UgRGVidWdnYWJsZVRhc2sKK3sKKyAgICBwdWJsaWMgbG9uZyBjcmVhdGlvblRpbWVOYW5vcygpOworCisgICAgcHVibGljIGxvbmcgc3RhcnRUaW1lTmFub3MoKTsKKworICAgIHB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb24oKTsKKyAgICAKKyAgICBpbnRlcmZhY2UgUnVubmFibGVEZWJ1Z2dhYmxlVGFzayBleHRlbmRzIFJ1bm5hYmxlLCBEZWJ1Z2dhYmxlVGFzayB7fQorCisgICAgLyoqCisgICAgICogV3JhcHMgYSB7QGxpbmsgRGVidWdnYWJsZVRhc2t9IHRvIGluY2x1ZGUgdGhlIG5hbWUgb2YgdGhlIHRocmVhZCBydW5uaW5nIGl0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUnVubmluZ0RlYnVnZ2FibGVUYXNrIGltcGxlbWVudHMgRGVidWdnYWJsZVRhc2sKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgRGVidWdnYWJsZVRhc2sgdGFzazsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGhyZWFkSWQ7CisKKyAgICAgICAgcHVibGljIFJ1bm5pbmdEZWJ1Z2dhYmxlVGFzayhTdHJpbmcgdGhyZWFkSWQsIERlYnVnZ2FibGVUYXNrIHRhc2spCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudGFzayA9IHRhc2s7CisgICAgICAgICAgICB0aGlzLnRocmVhZElkID0gdGhyZWFkSWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRocmVhZElkKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRocmVhZElkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzVGFzaygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0YXNrICE9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgY3JlYXRpb25UaW1lTmFub3MoKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgaGFzVGFzaygpOworICAgICAgICAgICAgcmV0dXJuIHRhc2suY3JlYXRpb25UaW1lTmFub3MoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBzdGFydFRpbWVOYW5vcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBoYXNUYXNrKCk7CisgICAgICAgICAgICByZXR1cm4gdGFzay5zdGFydFRpbWVOYW5vcygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb24oKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgaGFzVGFzaygpOworICAgICAgICAgICAgcmV0dXJuIHRhc2suZGVzY3JpcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmN1cnJlbnQvRXhlY3V0aW9uRmFpbHVyZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uY3VycmVudC9FeGVjdXRpb25GYWlsdXJlLmphdmEKaW5kZXggN2ZhN2RjYi4uMjdhYjg4NSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uY3VycmVudC9FeGVjdXRpb25GYWlsdXJlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uY3VycmVudC9FeGVjdXRpb25GYWlsdXJlLmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LkRlYnVnZ2FibGVUYXNrLlJ1bm5hYmxlRGVidWdnYWJsZVRhc2s7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIApAQCAtMTA2LDYgKzEwNywxNCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEBzZWUgI3N1cHByZXNzaW5nKFdpdGhSZXNvdXJjZXMsIFJ1bm5hYmxlKQorICAgICAqLworICAgIHN0YXRpYyBSdW5uYWJsZURlYnVnZ2FibGVUYXNrIHN1cHByZXNzaW5nRGVidWdnYWJsZShXaXRoUmVzb3VyY2VzIHdpdGhSZXNvdXJjZXMsIFJ1bm5hYmxlRGVidWdnYWJsZVRhc2sgZGVidWdnYWJsZSkKKyAgICB7CisgICAgICAgIHJldHVybiBlbmZvcmNlT3B0aW9uc0RlYnVnZ2FibGUod2l0aFJlc291cmNlcywgZGVidWdnYWJsZSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEVuY2Fwc3VsYXRlIHRoZSBleGVjdXRpb24sIHByb3BhZ2F0aW5nIG9yIHN1cHByZXNzaW5nIGFueSBleGNlcHRpb25zIGFzIHJlcXVlc3RlZC4KICAgICAgKgogICAgICAqIG5vdGUgdGhhdCBpZiB7QGNvZGUgd3JhcH0gaXMgYSB7QGxpbmsgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlfSBpdHMgZXhjZXB0aW9ucyBtYXkgbm90IGJlIGNhcHR1cmVkLApAQCAtMTE5LDcgKzEyOCw3IEBACiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5IChDbG9zZWFibGUgY2xvc2UgPSB3aXRoUmVzb3VyY2VzLmdldCgpKQorICAgICAgICAgICAgICAgIHRyeSAoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENsb3NlYWJsZSBjbG9zZSA9IHdpdGhSZXNvdXJjZXMuZ2V0KCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICB3cmFwLnJ1bigpOwogICAgICAgICAgICAgICAgIH0KQEAgLTE0MCw2ICsxNDksNTQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBAc2VlICNlbmZvcmNlT3B0aW9ucyhXaXRoUmVzb3VyY2VzLCBSdW5uYWJsZSwgYm9vbGVhbikKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBSdW5uYWJsZURlYnVnZ2FibGVUYXNrIGVuZm9yY2VPcHRpb25zRGVidWdnYWJsZShXaXRoUmVzb3VyY2VzIHdpdGhSZXNvdXJjZXMsIFJ1bm5hYmxlRGVidWdnYWJsZVRhc2sgZGVidWdnYWJsZSwgYm9vbGVhbiBwcm9wYWdhdGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFJ1bm5hYmxlRGVidWdnYWJsZVRhc2soKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5IChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ2xvc2VhYmxlIGNsb3NlID0gd2l0aFJlc291cmNlcy5nZXQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnZ2FibGUucnVuKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZSh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BhZ2F0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBkZWJ1Z2dhYmxlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGxvbmcgY3JlYXRpb25UaW1lTmFub3MoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBkZWJ1Z2dhYmxlLmNyZWF0aW9uVGltZU5hbm9zKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGxvbmcgc3RhcnRUaW1lTmFub3MoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBkZWJ1Z2dhYmxlLnN0YXJ0VGltZU5hbm9zKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlYnVnZ2FibGUuZGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZWUge0BsaW5rICNlbmZvcmNlT3B0aW9ucyhXaXRoUmVzb3VyY2VzLCBDYWxsYWJsZSl9CiAgICAgICovCiAgICAgc3RhdGljIDxWPiBDYWxsYWJsZTxWPiBwcm9wYWdhdGluZyhDYWxsYWJsZTxWPiB3cmFwKQpAQCAtMTU4LDcgKzIxNSw3IEBACiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBWIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5IChDbG9zZWFibGUgY2xvc2UgPSB3aXRoUmVzb3VyY2VzLmdldCgpKQorICAgICAgICAgICAgICAgIHRyeSAoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENsb3NlYWJsZSBjbG9zZSA9IHdpdGhSZXNvdXJjZXMuZ2V0KCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcC5jYWxsKCk7CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uY3VycmVudC9GdXR1cmVUYXNrLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25jdXJyZW50L0Z1dHVyZVRhc2suamF2YQppbmRleCAyMzQ4ZmY2Li43NjM4ODRhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25jdXJyZW50L0Z1dHVyZVRhc2suamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25jdXJyZW50L0Z1dHVyZVRhc2suamF2YQpAQCAtMjAsOSArMjAsMTAgQEAKIAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SdW5uYWJsZUZ1dHVyZTsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5Bc3luY0Z1dHVyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlJ1bm5hYmxlRnV0dXJlOwogCiAvKioKICAqIEEgRnV0dXJlVGFzayB0aGF0IHV0aWxpc2VzIENhc3NhbmRyYSdzIHtAbGluayBBc3luY0Z1dHVyZX0sIG1ha2luZyBpdCBjb21wYXRpYmxlIHdpdGgge0BsaW5rIEV4ZWN1dG9yUGx1c30uCkBAIC0zMSwxNSArMzIsMjggQEAKIHB1YmxpYyBjbGFzcyBGdXR1cmVUYXNrPFY+IGV4dGVuZHMgQXN5bmNGdXR1cmU8Vj4gaW1wbGVtZW50cyBSdW5uYWJsZUZ1dHVyZTxWPgogewogICAgIHByaXZhdGUgQ2FsbGFibGU8PyBleHRlbmRzIFY+IGNhbGw7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBEZWJ1Z2dhYmxlVGFzayBkZWJ1Z2dhYmxlOwogCiAgICAgcHVibGljIEZ1dHVyZVRhc2soQ2FsbGFibGU8PyBleHRlbmRzIFY+IGNhbGwpCiAgICAgewotICAgICAgICB0aGlzLmNhbGwgPSBjYWxsOworICAgICAgICB0aGlzKGNhbGwsIGNhbGwgaW5zdGFuY2VvZiBEZWJ1Z2dhYmxlVGFzayA/IChEZWJ1Z2dhYmxlVGFzaykgY2FsbCA6IG51bGwpOwogICAgIH0KIAogICAgIHB1YmxpYyBGdXR1cmVUYXNrKFJ1bm5hYmxlIHJ1bikKICAgICB7Ci0gICAgICAgIHRoaXMuY2FsbCA9IGNhbGxhYmxlKHJ1bik7CisgICAgICAgIHRoaXMoY2FsbGFibGUocnVuKSwgcnVuIGluc3RhbmNlb2YgRGVidWdnYWJsZVRhc2sgPyAoRGVidWdnYWJsZVRhc2spIHJ1biA6IG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgRnV0dXJlVGFzayhDYWxsYWJsZTw/IGV4dGVuZHMgVj4gY2FsbCwgRGVidWdnYWJsZVRhc2sgZGVidWdnYWJsZSkKKyAgICB7CisgICAgICAgIHRoaXMuY2FsbCA9IGNhbGw7CisgICAgICAgIHRoaXMuZGVidWdnYWJsZSA9IGRlYnVnZ2FibGU7CisgICAgfQorCisgICAgQE51bGxhYmxlCisgICAgRGVidWdnYWJsZVRhc2sgZGVidWdnYWJsZVRhc2soKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlYnVnZ2FibGU7CiAgICAgfQogCiAgICAgViBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbgpAQCAtNjMsNiArNzcsNyBAQAogICAgICAgICBmaW5hbGx5CiAgICAgICAgIHsKICAgICAgICAgICAgIGNhbGwgPSBudWxsOworICAgICAgICAgICAgZGVidWdnYWJsZSA9IG51bGw7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmN1cnJlbnQvU0VQRXhlY3V0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmN1cnJlbnQvU0VQRXhlY3V0b3IuamF2YQppbmRleCAwNWI1OWM2Li5mNGI3NGMwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25jdXJyZW50L1NFUEV4ZWN1dG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uY3VycmVudC9TRVBFeGVjdXRvci5qYXZhCkBAIC03MCw3ICs3MCw3IEBACiAgICAgU0VQRXhlY3V0b3IoU2hhcmVkRXhlY3V0b3JQb29sIHBvb2wsIGludCBtYXhpbXVtUG9vbFNpemUsIE1heGltdW1Qb29sU2l6ZUxpc3RlbmVyIG1heGltdW1Qb29sU2l6ZUxpc3RlbmVyLCBTdHJpbmcgam14UGF0aCwgU3RyaW5nIG5hbWUpCiAgICAgewogICAgICAgICB0aGlzLnBvb2wgPSBwb29sOwotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLm5hbWUgPSBOYW1lZFRocmVhZEZhY3RvcnkuZ2xvYmFsUHJlZml4KCkgKyBuYW1lOwogICAgICAgICB0aGlzLm1iZWFuTmFtZSA9ICJvcmcuYXBhY2hlLmNhc3NhbmRyYS4iICsgam14UGF0aCArICI6dHlwZT0iICsgbmFtZTsKICAgICAgICAgdGhpcy5tYXhpbXVtUG9vbFNpemUgPSBuZXcgQXRvbWljSW50ZWdlcihtYXhpbXVtUG9vbFNpemUpOwogICAgICAgICB0aGlzLm1heGltdW1Qb29sU2l6ZUxpc3RlbmVyID0gbWF4aW11bVBvb2xTaXplTGlzdGVuZXI7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25jdXJyZW50L1NFUFdvcmtlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uY3VycmVudC9TRVBXb3JrZXIuamF2YQppbmRleCBjN2I5YWJmLi45M2MwMWZhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25jdXJyZW50L1NFUFdvcmtlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmN1cnJlbnQvU0VQV29ya2VyLmphdmEKQEAgLTMwLDEyICszMCwxMyBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuU0VQRXhlY3V0b3IuVGFrZVRhc2tQZXJtaXRSZXN1bHQuUkVUVVJORURfV09SS19QRVJNSVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuU0VQRXhlY3V0b3IuVGFrZVRhc2tQZXJtaXRSZXN1bHQuVE9PS19QRVJNSVQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU0VUX1NFUF9USFJFQURfTkFNRTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLm5hbm9UaW1lOwogCiBmaW5hbCBjbGFzcyBTRVBXb3JrZXIgZXh0ZW5kcyBBdG9taWNSZWZlcmVuY2U8U0VQV29ya2VyLldvcms+IGltcGxlbWVudHMgUnVubmFibGUKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU0VQV29ya2VyLmNsYXNzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFNFVF9USFJFQURfTkFNRSA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnNldF9zZXBfdGhyZWFkX25hbWUiLCAidHJ1ZSIpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFNFVF9USFJFQURfTkFNRSA9IFNFVF9TRVBfVEhSRUFEX05BTUUuZ2V0Qm9vbGVhbigpOwogCiAgICAgZmluYWwgTG9uZyB3b3JrZXJJZDsKICAgICBmaW5hbCBUaHJlYWQgdGhyZWFkOwpAQCAtNDgsNiArNDksOCBAQAogICAgIGxvbmcgcHJldlN0b3BDaGVjayA9IDA7CiAgICAgbG9uZyBzb2xlU3Bpbm5lclNwaW5UaW1lID0gMDsKIAorICAgIHByaXZhdGUgZmluYWwgQXRvbWljUmVmZXJlbmNlPFJ1bm5hYmxlPiBjdXJyZW50VGFzayA9IG5ldyBBdG9taWNSZWZlcmVuY2U8PigpOworCiAgICAgU0VQV29ya2VyKFRocmVhZEdyb3VwIHRocmVhZEdyb3VwLCBMb25nIHdvcmtlcklkLCBXb3JrIGluaXRpYWxTdGF0ZSwgU2hhcmVkRXhlY3V0b3JQb29sIHBvb2wpCiAgICAgewogICAgICAgICB0aGlzLnBvb2wgPSBwb29sOwpAQCAtNTgsOSArNjEsMjcgQEAKICAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY3VycmVudCB7QGxpbmsgRGVidWdnYWJsZVRhc2t9LCBpZiBvbmUgZXhpc3RzCisgICAgICovCisgICAgcHVibGljIERlYnVnZ2FibGVUYXNrIGN1cnJlbnREZWJ1Z2dhYmxlVGFzaygpCisgICAgeworICAgICAgICAvLyBjYW4gY2hhbmdlIGFmdGVyIG51bGwgY2hlY2sgc28gZ28gb2ZmIGxvY2FsIHJlZmVyZW5jZQorICAgICAgICBSdW5uYWJsZSB0YXNrID0gY3VycmVudFRhc2suZ2V0KCk7CisKKyAgICAgICAgLy8gTG9jYWwgcmVhZCBhbmQgbXV0YXRpb24gUnVubmFibGVzIGFyZSB0aGVtc2VsdmVzIGRlYnVnZ2FibGUKKyAgICAgICAgaWYgKHRhc2sgaW5zdGFuY2VvZiBEZWJ1Z2dhYmxlVGFzaykKKyAgICAgICAgICAgIHJldHVybiAoRGVidWdnYWJsZVRhc2spIHRhc2s7CisKKyAgICAgICAgaWYgKHRhc2sgaW5zdGFuY2VvZiBGdXR1cmVUYXNrKQorICAgICAgICAgICAgcmV0dXJuICgoRnV0dXJlVGFzazw/PikgdGFzaykuZGVidWdnYWJsZVRhc2soKTsKKyAgICAgICAgICAgIAorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBydW4oKQogICAgIHsKLSAgICAgICAgLyoqCisgICAgICAgIC8qCiAgICAgICAgICAqIHdlIG1haW50YWluIHR3byBpbXBvcnRhbnQgaW52YXJpYW50czoKICAgICAgICAgICogMSkgICBhZnRlciBleGl0aW5nIHNwaW5uaW5nIHBoYXNlLCB3ZSBlbnN1cmUgYXQgbGVhc3Qgb25lIG1vcmUgdGFzayBvbiBfZWFjaF8gcXVldWUgd2lsbCBiZSBwcm9jZXNzZWQKICAgICAgICAgICogICAgICBwcm9tcHRseSBhZnRlciB3ZSBiZWdpbiwgYXNzdW1pbmcgYW55IGFyZSBvdXRzdGFuZGluZyBvbiBhbnkgcG9vbHMuIHRoaXMgaXMgdG8gcGVybWl0IHByb2R1Y2VycyB0bwpAQCAtMTAxLDggKzEyMiwxMCBAQAogICAgICAgICAgICAgICAgIGlmIChhc3NpZ25lZCA9PSBudWxsKQogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICBpZiAoU0VUX1RIUkVBRF9OQU1FKQotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldE5hbWUoYXNzaWduZWQubmFtZSArICItIiArIHdvcmtlcklkKTsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXROYW1lKGFzc2lnbmVkLm5hbWUgKyAnLScgKyB3b3JrZXJJZCk7CisKICAgICAgICAgICAgICAgICB0YXNrID0gYXNzaWduZWQudGFza3MucG9sbCgpOworICAgICAgICAgICAgICAgIGN1cnJlbnRUYXNrLmxhenlTZXQodGFzayk7CiAKICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBkbyBoYXZlIHRhc2tzIGFzc2lnbmVkLCBub2JvZHkgd2lsbCBjaGFuZ2Ugb3VyIHN0YXRlIHNvIHdlIGNhbiBzaW1wbHkgc2V0IGl0IHRvIFdPUktJTkcKICAgICAgICAgICAgICAgICAvLyAod2hpY2ggaXMgYWxzbyBhIHN0YXRlIHRoYXQgd2lsbCBuZXZlciBiZSBpbnRlcnJ1cHRlZCBleHRlcm5hbGx5KQpAQCAtMTI4LDkgKzE1MSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICAgICAgdGFzayA9IGFzc2lnbmVkLnRhc2tzLnBvbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFRhc2subGF6eVNldCh0YXNrKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyByZXR1cm4gb3VyIHdvcmsgcGVybWl0LCBhbmQgbWF5YmUgc2lnbmFsIHNodXRkb3duCisgICAgICAgICAgICAgICAgY3VycmVudFRhc2subGF6eVNldChudWxsKTsKKwogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gUkVUVVJORURfV09SS19QRVJNSVQpCiAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkLnJldHVybldvcmtQZXJtaXQoKTsKIApAQCAtMTczLDYgKzE5OSwxMSBAQAogICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVW5leHBlY3RlZCBleGNlcHRpb24ga2lsbGVkIHdvcmtlciIsIHQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgY3VycmVudFRhc2subGF6eVNldChudWxsKTsKKyAgICAgICAgICAgIHBvb2wud29ya2VyRW5kZWQodGhpcyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyB0cnkgdG8gYXNzaWduIHRoaXMgd29ya2VyIHRoZSBwcm92aWRlZCB3b3JrCkBAIC00MjAsNCArNDUxLDIyIEBACiAgICAgICAgICAgICByZXR1cm4gYXNzaWduZWQgIT0gbnVsbDsKICAgICAgICAgfQogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRocmVhZC5nZXROYW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpCisgICAgeworICAgICAgICByZXR1cm4gd29ya2VySWQuaW50VmFsdWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikKKyAgICB7CisgICAgICAgIHJldHVybiBvYmogPT0gdGhpczsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25jdXJyZW50L1NoYXJlZEV4ZWN1dG9yUG9vbC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uY3VycmVudC9TaGFyZWRFeGVjdXRvclBvb2wuamF2YQppbmRleCBmNzQ4NTRmLi4wNjMxZWM2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25jdXJyZW50L1NoYXJlZEV4ZWN1dG9yUG9vbC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmN1cnJlbnQvU2hhcmVkRXhlY3V0b3JQb29sLmphdmEKQEAgLTE3LDggKzE3LDExIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudDsKIAoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudFNraXBMaXN0TWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwpAQCAtMjYsNiArMjksOSBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkxvY2tTdXBwb3J0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRGVidWdnYWJsZVRhc2suUnVubmluZ0RlYnVnZ2FibGVUYXNrOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRXhlY3V0b3JGYWN0b3J5Lkdsb2JhbC5leGVjdXRvckZhY3Rvcnk7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuU0VQV29ya2VyLldvcms7CkBAIC03Nyw2ICs4Myw4IEBACiAgICAgZmluYWwgQ29uY3VycmVudFNraXBMaXN0TWFwPExvbmcsIFNFUFdvcmtlcj4gc3Bpbm5pbmcgPSBuZXcgQ29uY3VycmVudFNraXBMaXN0TWFwPD4oKTsKICAgICAvLyB0aGUgY29sbGVjdGlvbiBvZiB0aHJlYWRzIHRoYXQgaGF2ZSBiZWVuIGFza2VkIHRvIHN0b3AvZGVzY2hlZHVsZSAtIG5ldyB3b3JrZXJzIGFyZSBzY2hlZHVsZWQgZnJvbSBoZXJlIGxhc3QKICAgICBmaW5hbCBDb25jdXJyZW50U2tpcExpc3RNYXA8TG9uZywgU0VQV29ya2VyPiBkZXNjaGVkdWxlZCA9IG5ldyBDb25jdXJyZW50U2tpcExpc3RNYXA8PigpOworICAgIC8vIEFsbCBTRVBXb3JrZXJzIHRoYXQgYXJlIGN1cnJlbnRseSBydW5uaW5nCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U0VQV29ya2VyPiBhbGxXb3JrZXJzID0gQ29sbGVjdGlvbnMubmV3U2V0RnJvbU1hcChuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpKTsKIAogICAgIHZvbGF0aWxlIGJvb2xlYW4gc2h1dHRpbmdEb3duID0gZmFsc2U7CiAKQEAgLTEwMiw3ICsxMTAsMjMgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAKICAgICAgICAgaWYgKCF3b3JrLmlzU3RvcCgpKQotICAgICAgICAgICAgbmV3IFNFUFdvcmtlcih0aHJlYWRHcm91cCwgd29ya2VySWQuaW5jcmVtZW50QW5kR2V0KCksIHdvcmssIHRoaXMpOworICAgICAgICB7CisgICAgICAgICAgICBTRVBXb3JrZXIgd29ya2VyID0gbmV3IFNFUFdvcmtlcih0aHJlYWRHcm91cCwgd29ya2VySWQuaW5jcmVtZW50QW5kR2V0KCksIHdvcmssIHRoaXMpOworICAgICAgICAgICAgYWxsV29ya2Vycy5hZGQod29ya2VyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgd29ya2VyRW5kZWQoU0VQV29ya2VyIHdvcmtlcikKKyAgICB7CisgICAgICAgIGFsbFdvcmtlcnMucmVtb3ZlKHdvcmtlcik7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8UnVubmluZ0RlYnVnZ2FibGVUYXNrPiBydW5uaW5nVGFza3MoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFsbFdvcmtlcnMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKHdvcmtlciAtPiBuZXcgUnVubmluZ0RlYnVnZ2FibGVUYXNrKHdvcmtlci50b1N0cmluZygpLCB3b3JrZXIuY3VycmVudERlYnVnZ2FibGVUYXNrKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoUnVubmluZ0RlYnVnZ2FibGVUYXNrOjpoYXNUYXNrKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOwogICAgIH0KIAogICAgIHZvaWQgbWF5YmVTdGFydFNwaW5uaW5nV29ya2VyKCkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmN1cnJlbnQvVGFza0ZhY3RvcnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmN1cnJlbnQvVGFza0ZhY3RvcnkuamF2YQppbmRleCA1NjA4N2Q5Li5mYWVhYmU2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25jdXJyZW50L1Rhc2tGYWN0b3J5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uY3VycmVudC9UYXNrRmFjdG9yeS5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRGVidWdnYWJsZVRhc2suUnVubmFibGVEZWJ1Z2dhYmxlVGFzazsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5TaGFyZWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuV2l0aFJlc291cmNlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlJ1bm5hYmxlRnV0dXJlOwpAQCAtMTI3LDYgKzEyOCw5IEBACiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgUnVubmFibGUgdG9FeGVjdXRlKFJ1bm5hYmxlIHJ1bm5hYmxlKQogICAgICAgICB7CisgICAgICAgICAgICBpZiAocnVubmFibGUgaW5zdGFuY2VvZiBSdW5uYWJsZURlYnVnZ2FibGVUYXNrKQorICAgICAgICAgICAgICAgIHJldHVybiBFeGVjdXRpb25GYWlsdXJlLnN1cHByZXNzaW5nRGVidWdnYWJsZShFeGVjdXRvckxvY2Fscy5wcm9wYWdhdGUoKSwgKFJ1bm5hYmxlRGVidWdnYWJsZVRhc2spIHJ1bm5hYmxlKTsKKwogICAgICAgICAgICAgLy8gbm8gcmVhc29uIHRvIHByb3BhZ2F0ZSBleGNlcHRpb24gd2hlbiBpdCBpcyBpbmFjY2Vzc2libGUgdG8gY2FsbGVyCiAgICAgICAgICAgICByZXR1cm4gRXhlY3V0aW9uRmFpbHVyZS5zdXBwcmVzc2luZyhFeGVjdXRvckxvY2Fscy5wcm9wYWdhdGUoKSwgcnVubmFibGUpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvQ2Fzc2FuZHJhUmVsZXZhbnRFbnYuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9DYXNzYW5kcmFSZWxldmFudEVudi5qYXZhCmluZGV4IDQ5NjAzNzQuLjBmZGNkNmMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9DYXNzYW5kcmFSZWxldmFudEVudi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9DYXNzYW5kcmFSZWxldmFudEVudi5qYXZhCkBAIC0xOCwxMyArMTgsMTkgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWc7CiAKKy8vIGNoZWNrc3R5bGU6IHN1cHByZXNzIGJlbG93ICdibG9ja1N5c3RlbVByb3BlcnR5VXNhZ2UnCisKIHB1YmxpYyBlbnVtIENhc3NhbmRyYVJlbGV2YW50RW52CiB7CiAgICAgLyoqCiAgICAgICogU2VhcmNoaW5nIGluIHRoZSBKQVZBX0hPTUUgaXMgc2FmZXIgdGhhbiBzZWFyY2hpbmcgaW50byBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpIGFzIHRoZSBPcmFjbGUKICAgICAgKiBKVk0gbWlnaHQgdXNlIHRoZSBKUkUgd2hpY2ggZG8gbm90IGNvbnRhaW5zIGptYXAuCiAgICAgICovCi0gICAgSkFWQV9IT01FICgiSkFWQV9IT01FIik7CisgICAgSkFWQV9IT01FICgiSkFWQV9IT01FIiksCisgICAgQ0lSQ0xFQ0koIkNJUkNMRUNJIiksCisgICAgQ0FTU0FORFJBX1NLSVBfU1lOQygiQ0FTU0FORFJBX1NLSVBfU1lOQyIpCisKKyAgICA7CiAKICAgICBDYXNzYW5kcmFSZWxldmFudEVudihTdHJpbmcga2V5KQogICAgIHsKQEAgLTM4LDYgKzQ0LDE1IEBACiAgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0ZW52KGtleSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzeXN0ZW0gZW52IGFzIGEgYm9vbGVhbi4KKyAgICAgKiBAcmV0dXJuIFN5c3RlbSBlbnYgYm9vbGVhbiB2YWx1ZSBpZiBpdCBleGlzdHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKCkKKyAgICB7CisgICAgICAgIHJldHVybiBCb29sZWFuLnBhcnNlQm9vbGVhbihTeXN0ZW0uZ2V0ZW52KGtleSkpOworICAgIH0KKwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewogICAgICAgICByZXR1cm4ga2V5OwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuamF2YQppbmRleCA3NWUzNmI0Li40ZGFhODI1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0Nhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5qYXZhCkBAIC0xOCwzMTggKzE4LDUwNSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZzsKIAoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5JbnRzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbC5Mb2dNZXNzYWdlc1RhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkZpbGVTeXN0ZW1Pd25lcnNoaXBDaGVjazsKIAorLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgYmVsb3cgJ2Jsb2NrU3lzdGVtUHJvcGVydHlVc2FnZScKKwogLyoqIEEgY2xhc3MgdGhhdCBleHRyYWN0cyBzeXN0ZW0gcHJvcGVydGllcyBmb3IgdGhlIGNhc3NhbmRyYSBub2RlIGl0IHJ1bnMgd2l0aGluLiAqLwogcHVibGljIGVudW0gQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzCiB7Ci0gICAgLy9iYXNlIEpWTSBwcm9wZXJ0aWVzCi0gICAgSkFWQV9IT01FKCJqYXZhLmhvbWUiKSwKLSAgICBDQVNTQU5EUkFfUElEX0ZJTEUgKCJjYXNzYW5kcmEtcGlkZmlsZSIpLAotCisgICAgQUNRVUlSRV9SRVRSWV9TRUNPTkRTKCJjYXNzYW5kcmEuYWNxdWlyZV9yZXRyeV9zZWNvbmRzIiwgIjYwIiksCisgICAgQUNRVUlSRV9TTEVFUF9NUygiY2Fzc2FuZHJhLmFjcXVpcmVfc2xlZXBfbXMiLCAiMTAwMCIpLAorICAgIEFMTE9DQVRFX1RPS0VOU19GT1JfS0VZU1BBQ0UoImNhc3NhbmRyYS5hbGxvY2F0ZV90b2tlbnNfZm9yX2tleXNwYWNlIiksCisgICAgQUxMT1dfQUxURVJfUkZfRFVSSU5HX1JBTkdFX01PVkVNRU5UKCJjYXNzYW5kcmEuYWxsb3dfYWx0ZXJfcmZfZHVyaW5nX3JhbmdlX21vdmVtZW50IiksCisgICAgLyoqIElmIHdlIHNob3VsZCBhbGxvdyBoYXZpbmcgZHVwbGljYXRlIGtleXMgaW4gdGhlIGNvbmZpZyBmaWxlLCBkZWZhdWx0IHRvIHRydWUgZm9yIGxlZ2FjeSByZWFzb25zICovCisgICAgQUxMT1dfRFVQTElDQVRFX0NPTkZJR19LRVlTKCJjYXNzYW5kcmEuYWxsb3dfZHVwbGljYXRlX2NvbmZpZ19rZXlzIiwgInRydWUiKSwKKyAgICAvKiogSWYgd2Ugc2hvdWxkIGFsbG93IGhhdmluZyBib3RoIG5ldyAocG9zdCBDQVNTQU5EUkEtMTUyMzQpIGFuZCBvbGQgY29uZmlnIGtleXMgZm9yIHRoZSBzYW1lIGNvbmZpZyBpdGVtIGluIHRoZSB5YW1sICovCisgICAgQUxMT1dfTkVXX09MRF9DT05GSUdfS0VZUygiY2Fzc2FuZHJhLmFsbG93X25ld19vbGRfY29uZmlnX2tleXMiKSwKKyAgICBBTExPV19VTkxJTUlURURfQ09OQ1VSUkVOVF9WQUxJREFUSU9OUygiY2Fzc2FuZHJhLmFsbG93X3VubGltaXRlZF9jb25jdXJyZW50X3ZhbGlkYXRpb25zIiksCisgICAgQUxMT1dfVU5TQUZFX0FHR1JFU1NJVkVfU1NUQUJMRV9FWFBJUkFUSU9OKCJjYXNzYW5kcmEuYWxsb3dfdW5zYWZlX2FnZ3Jlc3NpdmVfc3N0YWJsZV9leHBpcmF0aW9uIiksCisgICAgQUxMT1dfVU5TQUZFX0pPSU4oImNhc3NhbmRyYS5hbGxvd191bnNhZmVfam9pbiIpLAorICAgIEFMTE9XX1VOU0FGRV9SRVBMQUNFKCJjYXNzYW5kcmEuYWxsb3dfdW5zYWZlX3JlcGxhY2UiKSwKKyAgICBBTExPV19VTlNBRkVfVFJBTlNJRU5UX0NIQU5HRVMoImNhc3NhbmRyYS5hbGxvd191bnNhZmVfdHJhbnNpZW50X2NoYW5nZXMiKSwKKyAgICBBUFBST1hJTUFURV9USU1FX1BSRUNJU0lPTl9NUygiY2Fzc2FuZHJhLmFwcHJveGltYXRlX3RpbWVfcHJlY2lzaW9uX21zIiwgIjIiKSwKKyAgICAvKiogMiAqKiBHRU5TQUxUX0xPRzJfUk9VTkRTIHJvdW5kcyBvZiBoYXNoaW5nIHdpbGwgYmUgcGVyZm9ybWVkLiAqLworICAgIEFVVEhfQkNSWVBUX0dFTlNBTFRfTE9HMl9ST1VORFMoImNhc3NhbmRyYS5hdXRoX2JjcnlwdF9nZW5zYWx0X2xvZzJfcm91bmRzIiksCisgICAgLyoqIFdlIGV4cGVjdCBkZWZhdWx0IHZhbHVlcyBvbiBjYWNoZSByZXRyaWVzIGFuZCBpbnRlcnZhbCB0byBiZSBzdWZmaWNpZW50IGZvciBldmVyeW9uZSBidXQgaGF2ZSB0aGlzIGVzY2FwZSBoYXRjaCBqdXN0IGluIGNhc2UuICovCisgICAgQVVUSF9DQUNIRV9XQVJNSU5HX01BWF9SRVRSSUVTKCJjYXNzYW5kcmEuYXV0aF9jYWNoZS53YXJtaW5nLm1heF9yZXRyaWVzIiksCisgICAgQVVUSF9DQUNIRV9XQVJNSU5HX1JFVFJZX0lOVEVSVkFMX01TKCJjYXNzYW5kcmEuYXV0aF9jYWNoZS53YXJtaW5nLnJldHJ5X2ludGVydmFsX21zIiksCisgICAgQVVUT0NPTVBBQ1RJT05fT05fU1RBUlRVUF9FTkFCTEVEKCJjYXNzYW5kcmEuYXV0b2NvbXBhY3Rpb25fb25fc3RhcnR1cF9lbmFibGVkIiwgInRydWUiKSwKKyAgICBBVVRPX0JPT1RTVFJBUCgiY2Fzc2FuZHJhLmF1dG9fYm9vdHN0cmFwIiksCisgICAgQVVUT19SRVBBSVJfRlJFUVVFTkNZX1NFQ09ORFMoImNhc3NhbmRyYS5hdXRvX3JlcGFpcl9mcmVxdWVuY3lfc2Vjb25kcyIsIGNvbnZlcnRUb1N0cmluZyhUaW1lVW5pdC5NSU5VVEVTLnRvU2Vjb25kcyg1KSkpLAorICAgIEJBVENITE9HX1JFUExBWV9USU1FT1VUX0lOX01TKCJjYXNzYW5kcmEuYmF0Y2hsb2cucmVwbGF5X3RpbWVvdXRfaW5fbXMiKSwKKyAgICBCQVRDSF9DT01NSVRfTE9HX1NZTkNfSU5URVJWQUwoImNhc3NhbmRyYS5iYXRjaF9jb21taXRsb2dfc3luY19pbnRlcnZhbF9taWxsaXMiLCAiMTAwMCIpLAogICAgIC8qKgotICAgICAqIEluZGljYXRlcyB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSB1c2VkIGJ5IHRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSAoSlZNKQotICAgICAqIHRvIGNyZWF0ZSBhbmQgc3RvcmUgdGVtcG9yYXJ5IGZpbGVzLgorICAgICAqIFdoZW4gYm9vdHN0cmFwaW5nIGhvdyBsb25nIHRvIHdhaXQgZm9yIHNjaGVtYSB2ZXJzaW9ucyB0byBiZSBzZWVuLgogICAgICAqLwotICAgIEpBVkFfSU9fVE1QRElSICgiamF2YS5pby50bXBkaXIiKSwKLQorICAgIEJPT1RTVFJBUF9TQ0hFTUFfREVMQVlfTVMoImNhc3NhbmRyYS5zY2hlbWFfZGVsYXlfbXMiKSwKICAgICAvKioKLSAgICAgKiBQYXRoIGZyb20gd2hpY2ggdG8gbG9hZCBuYXRpdmUgbGlicmFyaWVzLgotICAgICAqIERlZmF1bHQgaXMgYWJzb2x1dGUgcGF0aCB0byBsaWIgZGlyZWN0b3J5LgorICAgICAqIFdoZW4gYm9vdHN0cmFwaW5nIHdlIHdhaXQgZm9yIGFsbCBzY2hlbWEgdmVyc2lvbnMgZm91bmQgaW4gZ29zc2lwIHRvIGJlIHNlZW4sIGFuZCBpZiBub3Qgc2VlbiBpbiB0aW1lIHdlIGZhaWwKKyAgICAgKiB0aGUgYm9vdHN0cmFwOyB0aGlzIHByb3BlcnR5IHdpbGwgYXZvaWQgZmFpbGluZyBhbmQgYWxsb3cgYm9vdHN0cmFwIHRvIGNvbnRpbnVlIGlmIHNldCB0byB0cnVlLgogICAgICAqLwotICAgIEpBVkFfTElCUkFSWV9QQVRIICgiamF2YS5saWJyYXJ5LnBhdGgiKSwKLQotICAgIEpBVkFfU0VDVVJJVFlfRUdEICgiamF2YS5zZWN1cml0eS5lZ2QiKSwKLQotICAgIC8qKiBKYXZhIFJ1bnRpbWUgRW52aXJvbm1lbnQgdmVyc2lvbiAqLwotICAgIEpBVkFfVkVSU0lPTiAoImphdmEudmVyc2lvbiIpLAotCi0gICAgLyoqIEphdmEgVmlydHVhbCBNYWNoaW5lIGltcGxlbWVudGF0aW9uIG5hbWUgKi8KLSAgICBKQVZBX1ZNX05BTUUgKCJqYXZhLnZtLm5hbWUiKSwKLQotICAgIC8qKiBMaW5lIHNlcGFyYXRvciAoIlxuIiBvbiBVTklYKS4gKi8KLSAgICBMSU5FX1NFUEFSQVRPUiAoImxpbmUuc2VwYXJhdG9yIiksCi0KLSAgICAvKiogSmF2YSBjbGFzcyBwYXRoLiAqLwotICAgIEpBVkFfQ0xBU1NfUEFUSCAoImphdmEuY2xhc3MucGF0aCIpLAotCi0gICAgLyoqIE9wZXJhdGluZyBzeXN0ZW0gYXJjaGl0ZWN0dXJlLiAqLwotICAgIE9TX0FSQ0ggKCJvcy5hcmNoIiksCi0KLSAgICAvKiogT3BlcmF0aW5nIHN5c3RlbSBuYW1lLiAqLwotICAgIE9TX05BTUUgKCJvcy5uYW1lIiksCi0KLSAgICAvKiogVXNlcidzIGhvbWUgZGlyZWN0b3J5LiAqLwotICAgIFVTRVJfSE9NRSAoInVzZXIuaG9tZSIpLAotCi0gICAgLyoqIFBsYXRmb3JtIHdvcmQgc2l6ZSBzdW4uYXJjaC5kYXRhLm1vZGVsLiBFeGFtcGxlczogIjMyIiwgIjY0IiwgInVua25vd24iKi8KLSAgICBTVU5fQVJDSF9EQVRBX01PREVMICgic3VuLmFyY2guZGF0YS5tb2RlbCIpLAotCi0gICAgLy9KTVggcHJvcGVydGllcworICAgIEJPT1RTVFJBUF9TS0lQX1NDSEVNQV9DSEVDSygiY2Fzc2FuZHJhLnNraXBfc2NoZW1hX2NoZWNrIiksCisgICAgQlJPQURDQVNUX0lOVEVSVkFMX01TKCJjYXNzYW5kcmEuYnJvYWRjYXN0X2ludGVydmFsX21zIiwgIjYwMDAwIiksCisgICAgQlRSRUVfQlJBTkNIX1NISUZUKCJjYXNzYW5kcmEuYnRyZWUuYnJhbmNoc2hpZnQiLCAiNSIpLAorICAgIEJUUkVFX0ZBTl9GQUNUT1IoImNhc3NhbmRyYS5idHJlZS5mYW5mYWN0b3IiKSwKKyAgICAvKiogUmVwcmVzZW50cyB0aGUgbWF4aW11bSBzaXplIChpbiBieXRlcykgb2YgYSBzZXJpYWxpemVkIG11dGF0aW9uIHRoYXQgY2FuIGJlIGNhY2hlZCAqKi8KKyAgICBDQUNIRUFCTEVfTVVUQVRJT05fU0laRV9MSU1JVCgiY2Fzc2FuZHJhLmNhY2hlYWJsZV9tdXRhdGlvbl9zaXplX2xpbWl0X2J5dGVzIiwgY29udmVydFRvU3RyaW5nKDFfMDAwXzAwMCkpLAorICAgIENBU1NBTkRSQV9BTExPV19TSU1QTEVfU1RSQVRFR1koImNhc3NhbmRyYS5hbGxvd19zaW1wbGVzdHJhdGVneSIpLAorICAgIENBU1NBTkRSQV9BVkFJTEFCTEVfUFJPQ0VTU09SUygiY2Fzc2FuZHJhLmF2YWlsYWJsZV9wcm9jZXNzb3JzIiksCisgICAgLyoqIFRoZSBjbGFzc3BhdGggc3RvcmFnZSBjb25maWd1cmF0aW9uIGZpbGUuICovCisgICAgQ0FTU0FORFJBX0NPTkZJRygiY2Fzc2FuZHJhLmNvbmZpZyIsICJjYXNzYW5kcmEueWFtbCIpLAogICAgIC8qKgotICAgICAqIFRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IHJlcHJlc2VudHMgdGhlIGhvc3QgbmFtZSBzdHJpbmcKLSAgICAgKiB0aGF0IHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggcmVtb3RlIHN0dWJzIGZvciBsb2NhbGx5IGNyZWF0ZWQgcmVtb3RlIG9iamVjdHMsCi0gICAgICogaW4gb3JkZXIgdG8gYWxsb3cgY2xpZW50cyB0byBpbnZva2UgbWV0aG9kcyBvbiB0aGUgcmVtb3RlIG9iamVjdC4KKyAgICAgKiBUaGUgY2Fzc2FuZHJhLWZvcmVncm91bmQgb3B0aW9uIHdpbGwgdGVsbCBDYXNzYW5kcmFEYWVtb24gd2hldGhlcgorICAgICAqIHRvIGNsb3NlIHN0ZG91dC9zdGRlcnIsIGJ1dCBpdCdzIHVwIHRvIHVzIG5vdCB0byBiYWNrZ3JvdW5kLgorICAgICAqIHllcy9udWxsCiAgICAgICovCi0gICAgSkFWQV9STUlfU0VSVkVSX0hPU1ROQU1FICgiamF2YS5ybWkuc2VydmVyLmhvc3RuYW1lIiksCi0KKyAgICBDQVNTQU5EUkFfRk9SRUdST1VORCgiY2Fzc2FuZHJhLWZvcmVncm91bmQiKSwKKyAgICBDQVNTQU5EUkFfSk1YX0FVVEhPUklaRVIoImNhc3NhbmRyYS5qbXguYXV0aG9yaXplciIpLAorICAgIENBU1NBTkRSQV9KTVhfTE9DQUxfUE9SVCgiY2Fzc2FuZHJhLmpteC5sb2NhbC5wb3J0IiksCisgICAgQ0FTU0FORFJBX0pNWF9SRU1PVEVfTE9HSU5fQ09ORklHKCJjYXNzYW5kcmEuam14LnJlbW90ZS5sb2dpbi5jb25maWciKSwKKyAgICAvKiogQ2Fzc2FuZHJhIGpteCByZW1vdGUgYW5kIGxvY2FsIHBvcnQgKi8KKyAgICBDQVNTQU5EUkFfSk1YX1JFTU9URV9QT1JUKCJjYXNzYW5kcmEuam14LnJlbW90ZS5wb3J0IiksCisgICAgQ0FTU0FORFJBX01BWF9ISU5UX1RUTCgiY2Fzc2FuZHJhLm1heEhpbnRUVEwiLCBjb252ZXJ0VG9TdHJpbmcoSW50ZWdlci5NQVhfVkFMVUUpKSwKKyAgICBDQVNTQU5EUkFfTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1IoImNhc3NhbmRyYS5taW5pbXVtX3JlcGxpY2F0aW9uX2ZhY3RvciIpLAorICAgIENBU1NBTkRSQV9ORVRUWV9VU0VfSEVBUF9BTExPQ0FUT1IoImNhc3NhbmRyYS5uZXR0eV91c2VfaGVhcF9hbGxvY2F0b3IiKSwKKyAgICBDQVNTQU5EUkFfUElEX0ZJTEUoImNhc3NhbmRyYS1waWRmaWxlIiksCisgICAgQ0FTU0FORFJBX1JBQ0tEQ19QUk9QRVJUSUVTKCJjYXNzYW5kcmEtcmFja2RjLnByb3BlcnRpZXMiKSwKKyAgICBDQVNTQU5EUkFfU0tJUF9BVVRPTUFUSUNfVURUX0ZJWCgiY2Fzc2FuZHJhLnNraXBhdXRvbWF0aWN1ZHRmaXgiKSwKKyAgICBDQVNTQU5EUkFfU1RSRUFNSU5HX0RFQlVHX1NUQUNLVFJBQ0VfTElNSVQoImNhc3NhbmRyYS5zdHJlYW1pbmcuZGVidWdfc3RhY2t0cmFjZV9saW1pdCIsICIyIiksCisgICAgQ0FTU0FORFJBX1VOU0FGRV9USU1FX1VVSURfTk9ERSgiY2Fzc2FuZHJhLnVuc2FmZS50aW1ldXVpZG5vZGUiKSwKKyAgICBDQVNTQU5EUkFfVkVSU0lPTigiY2Fzc2FuZHJhLnZlcnNpb24iKSwKKyAgICAvKiogZGVmYXVsdCBoZWFydGJlYXRpbmcgcGVyaW9kIGlzIDEgbWludXRlICovCisgICAgQ0hFQ0tfREFUQV9SRVNVUlJFQ1RJT05fSEVBUlRCRUFUX1BFUklPRCgiY2hlY2tfZGF0YV9yZXN1cnJlY3Rpb25faGVhcnRiZWF0X3BlcmlvZF9taWxsaSIsICI2MDAwMCIpLAorICAgIENIUk9OSUNMRV9BTk5PVU5DRVJfRElTQUJMRSgiY2hyb25pY2xlLmFubm91bmNlci5kaXNhYmxlIiksCisgICAgQ0xPQ0tfR0xPQkFMKCJjYXNzYW5kcmEuY2xvY2siKSwKKyAgICBDTE9DS19NT05PVE9OSUNfQVBQUk9YKCJjYXNzYW5kcmEubW9ub3RvbmljX2Nsb2NrLmFwcHJveCIpLAorICAgIENMT0NLX01PTk9UT05JQ19QUkVDSVNFKCJjYXNzYW5kcmEubW9ub3RvbmljX2Nsb2NrLnByZWNpc2UiKSwKKyAgICBDT01NSVRMT0dfQUxMT1dfSUdOT1JFX1NZTkNfQ1JDKCJjYXNzYW5kcmEuY29tbWl0bG9nLmFsbG93X2lnbm9yZV9zeW5jX2NyYyIpLAorICAgIENPTU1JVExPR19JR05PUkVfUkVQTEFZX0VSUk9SUygiY2Fzc2FuZHJhLmNvbW1pdGxvZy5pZ25vcmVyZXBsYXllcnJvcnMiKSwKKyAgICBDT01NSVRMT0dfTUFYX09VVFNUQU5ESU5HX1JFUExBWV9CWVRFUygiY2Fzc2FuZHJhLmNvbW1pdGxvZ19tYXhfb3V0c3RhbmRpbmdfcmVwbGF5X2J5dGVzIiwgY29udmVydFRvU3RyaW5nKDEwMjQgKiAxMDI0ICogNjQpKSwKKyAgICBDT01NSVRMT0dfTUFYX09VVFNUQU5ESU5HX1JFUExBWV9DT1VOVCgiY2Fzc2FuZHJhLmNvbW1pdGxvZ19tYXhfb3V0c3RhbmRpbmdfcmVwbGF5X2NvdW50IiwgIjEwMjQiKSwKKyAgICBDT01NSVRMT0dfU1RPUF9PTl9FUlJPUlMoImNhc3NhbmRyYS5jb21taXRsb2cuc3RvcF9vbl9lcnJvcnMiKSwKICAgICAvKioKLSAgICAgKiBJZiB0aGlzIHZhbHVlIGlzIHRydWUsIG9iamVjdCBpZGVudGlmaWVycyBmb3IgcmVtb3RlIG9iamVjdHMgZXhwb3J0ZWQgYnkgdGhpcyBWTSB3aWxsIGJlIGdlbmVyYXRlZCBieSB1c2luZwotICAgICAqIGEgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KKyAgICAgKiBFbnRpdGllcyB0byByZXBsYXkgbXV0YXRpb25zIGZvciB1cG9uIGNvbW1pdCBsb2cgcmVwbGF5LCBwcm9wZXJ0eSBpcyBtZWFudCB0byBjb250YWluCisgICAgICogY29tbWEtc2VwYXJhdGVkIGVudGl0aWVzIHdoaWNoIGFyZSBlaXRoZXIgbmFtZXMgb2Yga2V5c3BhY2VzIG9yIGtleXNwYWNlcyBhbmQgdGFibGVzIG9yIHRoZWlyIG1peC4KKyAgICAgKiBFeGFtcGxlczoKKyAgICAgKiBqdXN0IGtleXNwYWNlcworICAgICAqIC1EY2Fzc2FuZHJhLnJlcGxheUxpc3Q9a3MxLGtzMixrczMKKyAgICAgKiBzcGVjaWZpYyB0YWJsZXMKKyAgICAgKiAtRGNhc3NhbmRyYS5yZXBsYXlMaXN0PWtzMS50YjEsa3MyLnRiMgorICAgICAqIG1peCBvZiB0YWJsZXMgYW5kIGtleXNwYWNlcworICAgICAqIC1EY2Fzc2FuZHJhLnJlcGxheUxpc3Q9a3MxLnRiMSxrczIKKyAgICAgKgorICAgICAqIElmIG9ubHkga2V5c3BhY2VzIGFyZSBzcGVjaWZpZWQsIG11dGF0aW9ucyBmb3IgYWxsIHRhYmxlcyBpbiBzdWNoIGtleXNwYWNlIHdpbGwgYmUgcmVwbGF5ZWQKKyAgICAgKiAqLworICAgIENPTU1JVF9MT0dfUkVQTEFZX0xJU1QoImNhc3NhbmRyYS5yZXBsYXlMaXN0IiksCisgICAgLyoqCisgICAgICogVGhpcyBwcm9wZXJ0eSBpbmRpY2F0ZXMgdGhlIGxvY2F0aW9uIGZvciB0aGUgYWNjZXNzIGZpbGUuIElmIGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuYXV0aGVudGljYXRlIGlzIGZhbHNlLAorICAgICAqIHRoZW4gdGhpcyBwcm9wZXJ0eSBhbmQgdGhlIHBhc3N3b3JkIGFuZCBhY2Nlc3MgZmlsZXMsIGFyZSBpZ25vcmVkLiBPdGhlcndpc2UsIHRoZSBhY2Nlc3MgZmlsZSBtdXN0IGV4aXN0IGFuZAorICAgICAqIGJlIGluIHRoZSB2YWxpZCBmb3JtYXQuIElmIHRoZSBhY2Nlc3MgZmlsZSBpcyBlbXB0eSBvciBub25leGlzdGVudCwgdGhlbiBubyBhY2Nlc3MgaXMgYWxsb3dlZC4KICAgICAgKi8KLSAgICBKQVZBX1JNSV9TRVJWRVJfUkFORE9NX0lEICgiamF2YS5ybWkuc2VydmVyLnJhbmRvbUlEcyIpLAotCisgICAgQ09NX1NVTl9NQU5BR0VNRU5UX0pNWFJFTU9URV9BQ0NFU1NfRklMRSgiY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5hY2Nlc3MuZmlsZSIpLAogICAgIC8qKgogICAgICAqIFRoaXMgcHJvcGVydHkgaW5kaWNhdGVzIHdoZXRoZXIgcGFzc3dvcmQgYXV0aGVudGljYXRpb24gZm9yIHJlbW90ZSBtb25pdG9yaW5nIGlzCiAgICAgICogZW5hYmxlZC4gQnkgZGVmYXVsdCBpdCBpcyBkaXNhYmxlZCAtIGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuYXV0aGVudGljYXRlCiAgICAgICovCi0gICAgQ09NX1NVTl9NQU5BR0VNRU5UX0pNWFJFTU9URV9BVVRIRU5USUNBVEUgKCJjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLmF1dGhlbnRpY2F0ZSIpLAotCi0KLSAgICAvKioKLSAgICAgKiBDb250cm9scyB0aGUgSk1YIHNlcnZlciB0aHJlYWRwb29sIGtlYXAtYWxpdmUgdGltZS4KLSAgICAgKiBTaG91bGQgb25seSBiZSBzZXQgYnkgaW4tanZtIGR0ZXN0cy4KLSAgICAgKi8KLSAgICBTVU5fUk1JX1RSQU5TUE9SVF9UQ1BfVEhSRUFES0VFUEFMSVZFVElNRSgic3VuLnJtaS50cmFuc3BvcnQudGNwLnRocmVhZEtlZXBBbGl2ZVRpbWUiKSwKLQotICAgIC8qKgotICAgICAqIENvbnRyb2xzIHRoZSBkaXN0cmlidXRlZCBnYXJiYWdlIGNvbGxlY3RvciBsZWFzZSB0aW1lIGZvciBKTVggb2JqZWN0cy4KLSAgICAgKiBTaG91bGQgb25seSBiZSBzZXQgYnkgaW4tanZtIGR0ZXN0cy4KLSAgICAgKi8KLSAgICBKQVZBX1JNSV9ER0NfTEVBU0VfVkFMVUVfSU5fSlZNX0RURVNUKCJqYXZhLnJtaS5kZ2MubGVhc2VWYWx1ZSIpLAotCisgICAgQ09NX1NVTl9NQU5BR0VNRU5UX0pNWFJFTU9URV9BVVRIRU5USUNBVEUoImNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuYXV0aGVudGljYXRlIiksCisgICAgLyoqIFRoaXMgcHJvcGVydHkgaW5kaWNhdGVzIHRoZSBwYXRoIHRvIHRoZSBwYXNzd29yZCBmaWxlIC0gY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5wYXNzd29yZC5maWxlICovCisgICAgQ09NX1NVTl9NQU5BR0VNRU5UX0pNWFJFTU9URV9QQVNTV09SRF9GSUxFKCJjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnBhc3N3b3JkLmZpbGUiKSwKKyAgICAvKiogUG9ydCBudW1iZXIgdG8gZW5hYmxlIEpNWCBSTUkgY29ubmVjdGlvbnMgLSBjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnBvcnQgKi8KKyAgICBDT01fU1VOX01BTkFHRU1FTlRfSk1YUkVNT1RFX1BPUlQoImNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUucG9ydCIpLAogICAgIC8qKgogICAgICAqIFRoZSBwb3J0IG51bWJlciB0byB3aGljaCB0aGUgUk1JIGNvbm5lY3RvciB3aWxsIGJlIGJvdW5kIC0gY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5ybWkucG9ydC4KICAgICAgKiBBbiBJbnRlZ2VyIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgcmV0dXJuZWQKICAgICAgKiBpZiB0aGVyZSBpcyBubyBwb3J0IHNwZWNpZmllZCwgaWYgdGhlIHBvcnQgZG9lcyBub3QgaGF2ZSB0aGUgY29ycmVjdCBudW1lcmljIGZvcm1hdCwKICAgICAgKiBvciBpZiB0aGUgc3BlY2lmaWVkIG5hbWUgaXMgZW1wdHkgb3IgbnVsbC4KICAgICAgKi8KLSAgICBDT01fU1VOX01BTkFHRU1FTlRfSk1YUkVNT1RFX1JNSV9QT1JUICgiY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5ybWkucG9ydCIsICIwIiksCi0KLSAgICAvKiogQ2Fzc2FuZHJhIGpteCByZW1vdGUgYW5kIGxvY2FsIHBvcnQgKi8KLSAgICBDQVNTQU5EUkFfSk1YX1JFTU9URV9QT1JUKCJjYXNzYW5kcmEuam14LnJlbW90ZS5wb3J0IiksCi0gICAgQ0FTU0FORFJBX0pNWF9MT0NBTF9QT1JUKCJjYXNzYW5kcmEuam14LmxvY2FsLnBvcnQiKSwKLQorICAgIENPTV9TVU5fTUFOQUdFTUVOVF9KTVhSRU1PVEVfUk1JX1BPUlQoImNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUucm1pLnBvcnQiLCAiMCIpLAogICAgIC8qKiBUaGlzIHByb3BlcnR5ICBpbmRpY2F0ZXMgd2hldGhlciBTU0wgaXMgZW5hYmxlZCBmb3IgbW9uaXRvcmluZyByZW1vdGVseS4gRGVmYXVsdCBpcyBzZXQgdG8gZmFsc2UuICovCi0gICAgQ09NX1NVTl9NQU5BR0VNRU5UX0pNWFJFTU9URV9TU0wgKCJjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnNzbCIpLAotCi0gICAgLyoqCi0gICAgICogVGhpcyBwcm9wZXJ0eSBpbmRpY2F0ZXMgd2hldGhlciBTU0wgY2xpZW50IGF1dGhlbnRpY2F0aW9uIGlzIGVuYWJsZWQgLSBjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnNzbC5uZWVkLmNsaWVudC5hdXRoLgotICAgICAqIERlZmF1bHQgaXMgc2V0IHRvIGZhbHNlLgotICAgICAqLwotICAgIENPTV9TVU5fTUFOQUdFTUVOVF9KTVhSRU1PVEVfU1NMX05FRURfQ0xJRU5UX0FVVEggKCJjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnNzbC5uZWVkLmNsaWVudC5hdXRoIiksCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIHByb3BlcnR5IGluZGljYXRlcyB0aGUgbG9jYXRpb24gZm9yIHRoZSBhY2Nlc3MgZmlsZS4gSWYgY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5hdXRoZW50aWNhdGUgaXMgZmFsc2UsCi0gICAgICogdGhlbiB0aGlzIHByb3BlcnR5IGFuZCB0aGUgcGFzc3dvcmQgYW5kIGFjY2VzcyBmaWxlcywgYXJlIGlnbm9yZWQuIE90aGVyd2lzZSwgdGhlIGFjY2VzcyBmaWxlIG11c3QgZXhpc3QgYW5kCi0gICAgICogYmUgaW4gdGhlIHZhbGlkIGZvcm1hdC4gSWYgdGhlIGFjY2VzcyBmaWxlIGlzIGVtcHR5IG9yIG5vbmV4aXN0ZW50LCB0aGVuIG5vIGFjY2VzcyBpcyBhbGxvd2VkLgotICAgICAqLwotICAgIENPTV9TVU5fTUFOQUdFTUVOVF9KTVhSRU1PVEVfQUNDRVNTX0ZJTEUgKCJjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLmFjY2Vzcy5maWxlIiksCi0KLSAgICAvKiogVGhpcyBwcm9wZXJ0eSBpbmRpY2F0ZXMgdGhlIHBhdGggdG8gdGhlIHBhc3N3b3JkIGZpbGUgLSBjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnBhc3N3b3JkLmZpbGUgKi8KLSAgICBDT01fU1VOX01BTkFHRU1FTlRfSk1YUkVNT1RFX1BBU1NXT1JEX0ZJTEUgKCJjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnBhc3N3b3JkLmZpbGUiKSwKLQotICAgIC8qKiBQb3J0IG51bWJlciB0byBlbmFibGUgSk1YIFJNSSBjb25uZWN0aW9ucyAtIGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUucG9ydCAqLwotICAgIENPTV9TVU5fTUFOQUdFTUVOVF9KTVhSRU1PVEVfUE9SVCAoImNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUucG9ydCIpLAotCi0gICAgLyoqCi0gICAgICogQSBjb21tYS1kZWxpbWl0ZWQgbGlzdCBvZiBTU0wvVExTIHByb3RvY29sIHZlcnNpb25zIHRvIGVuYWJsZS4KLSAgICAgKiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5zc2wgLSBjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnNzbC5lbmFibGVkLnByb3RvY29scwotICAgICAqLwotICAgIENPTV9TVU5fTUFOQUdFTUVOVF9KTVhSRU1PVEVfU1NMX0VOQUJMRURfUFJPVE9DT0xTICgiY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5zc2wuZW5hYmxlZC5wcm90b2NvbHMiKSwKLQorICAgIENPTV9TVU5fTUFOQUdFTUVOVF9KTVhSRU1PVEVfU1NMKCJjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnNzbCIpLAogICAgIC8qKgogICAgICAqIEEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgU1NML1RMUyBjaXBoZXIgc3VpdGVzIHRvIGVuYWJsZS4KICAgICAgKiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5zc2wgLSBjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnNzbC5lbmFibGVkLmNpcGhlci5zdWl0ZXMKICAgICAgKi8KLSAgICBDT01fU1VOX01BTkFHRU1FTlRfSk1YUkVNT1RFX1NTTF9FTkFCTEVEX0NJUEhFUl9TVUlURVMgKCJjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnNzbC5lbmFibGVkLmNpcGhlci5zdWl0ZXMiKSwKLQotICAgIC8qKiBteDRqYWRkcmVzcyAqLwotICAgIE1YNEpBRERSRVNTICgibXg0amFkZHJlc3MiKSwKLQotICAgIC8qKiBteDRqcG9ydCAqLwotICAgIE1YNEpQT1JUICgibXg0anBvcnQiKSwKLQotICAgIFJJTkdfREVMQVkoImNhc3NhbmRyYS5yaW5nX2RlbGF5X21zIiksCi0KKyAgICBDT01fU1VOX01BTkFHRU1FTlRfSk1YUkVNT1RFX1NTTF9FTkFCTEVEX0NJUEhFUl9TVUlURVMoImNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuc3NsLmVuYWJsZWQuY2lwaGVyLnN1aXRlcyIpLAogICAgIC8qKgotICAgICAqIFdoZW4gYm9vdHN0cmFwaW5nIHdlIHdhaXQgZm9yIGFsbCBzY2hlbWEgdmVyc2lvbnMgZm91bmQgaW4gZ29zc2lwIHRvIGJlIHNlZW4sIGFuZCBpZiBub3Qgc2VlbiBpbiB0aW1lIHdlIGZhaWwKLSAgICAgKiB0aGUgYm9vdHN0cmFwOyB0aGlzIHByb3BlcnR5IHdpbGwgYXZvaWQgZmFpbGluZyBhbmQgYWxsb3cgYm9vdHN0cmFwIHRvIGNvbnRpbnVlIGlmIHNldCB0byB0cnVlLgorICAgICAqIEEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgU1NML1RMUyBwcm90b2NvbCB2ZXJzaW9ucyB0byBlbmFibGUuCisgICAgICogVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuc3NsIC0gY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5zc2wuZW5hYmxlZC5wcm90b2NvbHMKICAgICAgKi8KLSAgICBCT09UU1RSQVBfU0tJUF9TQ0hFTUFfQ0hFQ0soImNhc3NhbmRyYS5za2lwX3NjaGVtYV9jaGVjayIpLAotCisgICAgQ09NX1NVTl9NQU5BR0VNRU5UX0pNWFJFTU9URV9TU0xfRU5BQkxFRF9QUk9UT0NPTFMoImNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuc3NsLmVuYWJsZWQucHJvdG9jb2xzIiksCiAgICAgLyoqCi0gICAgICogV2hlbiBib290c3RyYXBpbmcgaG93IGxvbmcgdG8gd2FpdCBmb3Igc2NoZW1hIHZlcnNpb25zIHRvIGJlIHNlZW4uCisgICAgICogVGhpcyBwcm9wZXJ0eSBpbmRpY2F0ZXMgd2hldGhlciBTU0wgY2xpZW50IGF1dGhlbnRpY2F0aW9uIGlzIGVuYWJsZWQgLSBjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnNzbC5uZWVkLmNsaWVudC5hdXRoLgorICAgICAqIERlZmF1bHQgaXMgc2V0IHRvIGZhbHNlLgogICAgICAqLwotICAgIEJPT1RTVFJBUF9TQ0hFTUFfREVMQVlfTVMoImNhc3NhbmRyYS5zY2hlbWFfZGVsYXlfbXMiKSwKLQorICAgIENPTV9TVU5fTUFOQUdFTUVOVF9KTVhSRU1PVEVfU1NMX05FRURfQ0xJRU5UX0FVVEgoImNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuc3NsLm5lZWQuY2xpZW50LmF1dGgiKSwKKyAgICAvKiogRGVmYXVsdHMgdG8gZmFsc2UgZm9yIDQuMSBidXQgcGxhbiB0byBzd2l0Y2ggdG8gdHJ1ZSBpbiBhIGxhdGVyIHJlbGVhc2UgdGhlIHRoaW5raW5nIGlzIHRoYXQgZW52aXJvbm1lbnRzCisgICAgICogbWF5IG5vdCB3b3JrIHJpZ2h0IG9mZiB0aGUgYmF0IHNvIHNhZmVyIHRvIGFkZCB0aGlzIGZlYXR1cmUgZGlzYWJsZWQgYnkgZGVmYXVsdCAqLworICAgIENPTkZJR19BTExPV19TWVNURU1fUFJPUEVSVElFUygiY2Fzc2FuZHJhLmNvbmZpZy5hbGxvd19zeXN0ZW1fcHJvcGVydGllcyIpLAorICAgIENPTkZJR19MT0FERVIoImNhc3NhbmRyYS5jb25maWcubG9hZGVyIiksCisgICAgQ09OU0lTVEVOVF9ESVJFQ1RPUllfTElTVElOR1MoImNhc3NhbmRyYS5jb25zaXN0ZW50X2RpcmVjdG9yeV9saXN0aW5ncyIpLAorICAgIENPTlNJU1RFTlRfUkFOR0VfTU9WRU1FTlQoImNhc3NhbmRyYS5jb25zaXN0ZW50LnJhbmdlbW92ZW1lbnQiLCAidHJ1ZSIpLAorICAgIENPTlNJU1RFTlRfU0lNVUxUQU5FT1VTX01PVkVTX0FMTE9XKCJjYXNzYW5kcmEuY29uc2lzdGVudC5zaW11bHRhbmVvdXNtb3Zlcy5hbGxvdyIpLAorICAgIENVU1RPTV9HVUFSRFJBSUxTX0NPTkZJR19QUk9WSURFUl9DTEFTUygiY2Fzc2FuZHJhLmN1c3RvbV9ndWFyZHJhaWxzX2NvbmZpZ19wcm92aWRlcl9jbGFzcyIpLAorICAgIENVU1RPTV9RVUVSWV9IQU5ETEVSX0NMQVNTKCJjYXNzYW5kcmEuY3VzdG9tX3F1ZXJ5X2hhbmRsZXJfY2xhc3MiKSwKKyAgICBDVVNUT01fVFJBQ0lOR19DTEFTUygiY2Fzc2FuZHJhLmN1c3RvbV90cmFjaW5nX2NsYXNzIiksCisgICAgLyoqIENvbnRyb2xzIHRoZSB0eXBlIG9mIGJ1ZmZmZXIgKGhlYXAvZGlyZWN0KSB1c2VkIGZvciBzaGFyZWQgc2NyYXRjaCBidWZmZXJzICovCisgICAgREFUQV9PVVRQVVRfQlVGRkVSX0FMTE9DQVRFX1RZUEUoImNhc3NhbmRyYS5kb2IuYWxsb2NhdGVfdHlwZSIpLAorICAgIERBVEFfT1VUUFVUX1NUUkVBTV9QTFVTX1RFTVBfQlVGRkVSX1NJWkUoImNhc3NhbmRyYS5kYXRhX291dHB1dF9zdHJlYW1fcGx1c190ZW1wX2J1ZmZlcl9zaXplIiwgIjgxOTIiKSwKKyAgICBERUNBWUlOR19FU1RJTUFURURfSElTVE9HUkFNX1JFU0VSVk9JUl9TVFJJUEVfQ09VTlQoImNhc3NhbmRyYS5kZWhyX3N0cmlwZV9jb3VudCIsICIyIiksCisgICAgREVGQVVMVF9QUk9WSURFX09WRVJMQVBQSU5HX1RPTUJTVE9ORVMoImRlZmF1bHQucHJvdmlkZS5vdmVybGFwcGluZy50b21ic3RvbmVzIiksCisgICAgLyoqIGRldGVybWluaXNtIHByb3BlcnRpZXMgZm9yIHRlc3RpbmcgKi8KKyAgICBERVRFUk1JTklTTV9TU1RBQkxFX0NPTVBSRVNTSU9OX0RFRkFVTFQoImNhc3NhbmRyYS5zc3RhYmxlX2NvbXByZXNzaW9uX2RlZmF1bHQiLCAidHJ1ZSIpLAorICAgIERFVEVSTUlOSVNNX1VOU0FGRV9VVUlEX05PREUoImNhc3NhbmRyYS51bnNhZmUuZGV0ZXJtaW5pc3RpY3V1aWRub2RlIiksCisgICAgRElBR05PU1RJQ19TTkFQU0hPVF9JTlRFUlZBTF9OQU5PUygiY2Fzc2FuZHJhLmRpYWdub3N0aWNfc25hcHNob3RfaW50ZXJ2YWxfbmFub3MiLCAiNjAwMDAwMDAwMDAiKSwKKyAgICBESVNBQkxFX0FVVEhfQ0FDSEVTX1JFTU9URV9DT05GSUdVUkFUSU9OKCJjYXNzYW5kcmEuZGlzYWJsZV9hdXRoX2NhY2hlc19yZW1vdGVfY29uZmlndXJhdGlvbiIpLAorICAgIC8qKiBwcm9wZXJ0aWVzIHRvIGRpc2FibGUgY2VydGFpbiBiZWhhdmlvdXJzIGZvciB0ZXN0aW5nICovCisgICAgRElTQUJMRV9HT1NTSVBfRU5EUE9JTlRfUkVNT1ZBTCgiY2Fzc2FuZHJhLmdvc3NpcC5kaXNhYmxlX2VuZHBvaW50X3JlbW92YWwiKSwKKyAgICBESVNBQkxFX1BBWE9TX0FVVE9fUkVQQUlSUygiY2Fzc2FuZHJhLmRpc2FibGVfcGF4b3NfYXV0b19yZXBhaXJzIiksCisgICAgRElTQUJMRV9QQVhPU19TVEFURV9GTFVTSCgiY2Fzc2FuZHJhLmRpc2FibGVfcGF4b3Nfc3RhdGVfZmx1c2giKSwKKyAgICBESVNBQkxFX1NTVEFCTEVfQUNUSVZJVFlfVFJBQ0tJTkcoImNhc3NhbmRyYS5zc3RhYmxlX2FjdGl2aXR5X3RyYWNraW5nIiwgInRydWUiKSwKKyAgICBESVNBQkxFX1NUQ1NfSU5fTDAoImNhc3NhbmRyYS5kaXNhYmxlX3N0Y3NfaW5fbDAiKSwKKyAgICBESVNBQkxFX1RDQUNUSVZFX09QRU5TU0woImNhc3NhbmRyYS5kaXNhYmxlX3RjYWN0aXZlX29wZW5zc2wiKSwKKyAgICAvKiogcHJvcGVydHkgZm9yIHRoZSByYXRlIG9mIHRoZSBzY2hlZHVsZWQgdGFzayB0aGF0IG1vbml0b3JzIGRpc2sgdXNhZ2UgKi8KKyAgICBESVNLX1VTQUdFX01PTklUT1JfSU5URVJWQUxfTVMoImNhc3NhbmRyYS5kaXNrX3VzYWdlLm1vbml0b3JfaW50ZXJ2YWxfbXMiLCBjb252ZXJ0VG9TdHJpbmcoVGltZVVuaXQuU0VDT05EUy50b01pbGxpcygzMCkpKSwKKyAgICAvKiogcHJvcGVydHkgZm9yIHRoZSBpbnRlcnZhbCBvbiB3aGljaCB0aGUgcmVwZWF0ZWQgY2xpZW50IHdhcm5pbmdzIGFuZCBkaWFnbm9zdGljIGV2ZW50cyBhYm91dCBkaXNrIHVzYWdlIGFyZSBpZ25vcmVkICovCisgICAgRElTS19VU0FHRV9OT1RJRllfSU5URVJWQUxfTVMoImNhc3NhbmRyYS5kaXNrX3VzYWdlLm5vdGlmeV9pbnRlcnZhbF9tcyIsIGNvbnZlcnRUb1N0cmluZyhUaW1lVW5pdC5NSU5VVEVTLnRvTWlsbGlzKDMwKSkpLAorICAgIERPQl9ET1VCTElOR19USFJFU0hPTERfTUIoImNhc3NhbmRyYS5ET0JfRE9VQkxJTkdfVEhSRVNIT0xEX01CIiwgIjY0IiksCisgICAgRE9CX01BWF9SRUNZQ0xFX0JZVEVTKCJjYXNzYW5kcmEuZG9iX21heF9yZWN5Y2xlX2J5dGVzIiwgY29udmVydFRvU3RyaW5nKDEwMjQgKiAxMDI0KSksCiAgICAgLyoqCiAgICAgICogV2hlbiBkcmFpbmluZywgaG93IGxvbmcgdG8gd2FpdCBmb3IgbXV0YXRpbmcgZXhlY3V0b3JzIHRvIHNodXRkb3duLgogICAgICAqLwotICAgIERSQUlOX0VYRUNVVE9SX1RJTUVPVVRfTVMoImNhc3NhbmRyYS5kcmFpbl9leGVjdXRvcl90aW1lb3V0X21zIiwgU3RyaW5nLnZhbHVlT2YoVGltZVVuaXQuTUlOVVRFUy50b01pbGxpcyg1KSkpLAotCisgICAgRFJBSU5fRVhFQ1VUT1JfVElNRU9VVF9NUygiY2Fzc2FuZHJhLmRyYWluX2V4ZWN1dG9yX3RpbWVvdXRfbXMiLCBjb252ZXJ0VG9TdHJpbmcoVGltZVVuaXQuTUlOVVRFUy50b01pbGxpcyg1KSkpLAorICAgIERST1BfT1ZFUlNJWkVEX1JFQURfUkVQQUlSX01VVEFUSU9OUygiY2Fzc2FuZHJhLmRyb3Bfb3ZlcnNpemVkX3JlYWRyZXBhaXJfbXV0YXRpb25zIiksCisgICAgRFRFU1RfQVBJX0xPR19UT1BPTE9HWSgiY2Fzc2FuZHJhLmR0ZXN0LmFwaS5sb2cudG9wb2xvZ3kiKSwKKyAgICAvKiogVGhpcyBwcm9wZXJ0eSBpbmRpY2F0ZXMgaWYgdGhlIGNvZGUgaXMgcnVubmluZyB1bmRlciB0aGUgaW4tanZtIGR0ZXN0IGZyYW1ld29yayAqLworICAgIERURVNUX0lTX0lOX0pWTV9EVEVTVCgib3JnLmFwYWNoZS5jYXNzYW5kcmEuZHRlc3QuaXNfaW5fanZtX2R0ZXN0IiksCisgICAgRU5BQkxFX0RDX0xPQ0FMX0NPTU1JVCgiY2Fzc2FuZHJhLmVuYWJsZV9kY19sb2NhbF9jb21taXQiLCAidHJ1ZSIpLAorICAgIC8qKgorICAgICAqIFdoZXRoZXIge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbnNpc3RlbmN5TGV2ZWwjTk9ERV9MT0NBTH0gc2hvdWxkIGJlIGFsbG93ZWQuCisgICAgICovCisgICAgRU5BQkxFX05PREVMT0NBTF9RVUVSSUVTKCJjYXNzYW5kcmEuZW5hYmxlX25vZGVsb2NhbF9xdWVyaWVzIiksCisgICAgRVhQSVJBVElPTl9EQVRFX09WRVJGTE9XX1BPTElDWSgiY2Fzc2FuZHJhLmV4cGlyYXRpb25fZGF0ZV9vdmVyZmxvd19wb2xpY3kiKSwKKyAgICBFWFBJUkFUSU9OX09WRVJGTE9XX1dBUk5JTkdfSU5URVJWQUxfTUlOVVRFUygiY2Fzc2FuZHJhLmV4cGlyYXRpb25fb3ZlcmZsb3dfd2FybmluZ19pbnRlcnZhbF9taW51dGVzIiwgIjUiKSwKKyAgICBGQUlMVVJFX0xPR0dJTkdfSU5URVJWQUxfU0VDT05EUygiY2Fzc2FuZHJhLnJlcXVlc3RfZmFpbHVyZV9sb2dfaW50ZXJ2YWxfc2Vjb25kcyIsICI2MCIpLAorICAgIEZEX0lOSVRJQUxfVkFMVUVfTVMoImNhc3NhbmRyYS5mZF9pbml0aWFsX3ZhbHVlX21zIiksCisgICAgRkRfTUFYX0lOVEVSVkFMX01TKCJjYXNzYW5kcmEuZmRfbWF4X2ludGVydmFsX21zIiksCisgICAgRklMRV9DQUNIRV9FTkFCTEVEKCJjYXNzYW5kcmEuZmlsZV9jYWNoZV9lbmFibGVkIiksCisgICAgLyoqIEBkZXByZWNhdGVkIHNob3VsZCBiZSByZW1vdmVkIGluIGZhdm9yIG9mIGVuYWJsZSBmbGFnIG9mIHJlbGV2YW50IHN0YXJ0dXAgY2hlY2sgKEZpbGVTeXN0ZW1Pd25lcnNoaXBDaGVjaykgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIEZJTEVfU1lTVEVNX0NIRUNLX0VOQUJMRSgiY2Fzc2FuZHJhLmVuYWJsZV9mc19vd25lcnNoaXBfY2hlY2siKSwKKyAgICAvKiogQGRlcHJlY2F0ZWQgc2hvdWxkIGJlIHJlbW92ZWQgaW4gZmF2b3Igb2YgZmxhZ3MgaW4gcmVsZXZhbnQgc3RhcnR1cCBjaGVjayAoRmlsZVN5c3RlbU93bmVyc2hpcENoZWNrKSAqLworICAgIEBEZXByZWNhdGVkCisgICAgRklMRV9TWVNURU1fQ0hFQ0tfT1dORVJTSElQX0ZJTEVOQU1FKCJjYXNzYW5kcmEuZnNfb3duZXJzaGlwX2ZpbGVuYW1lIiwgRmlsZVN5c3RlbU93bmVyc2hpcENoZWNrLkRFRkFVTFRfRlNfT1dORVJTSElQX0ZJTEVOQU1FKSwKKyAgICAvKiogQGRlcHJlY2F0ZWQgc2hvdWxkIGJlIHJlbW92ZWQgaW4gZmF2b3Igb2YgZmxhZ3MgaW4gcmVsZXZhbnQgc3RhcnR1cCBjaGVjayAoRmlsZVN5c3RlbU93bmVyc2hpcENoZWNrKSAqLworICAgIEBEZXByZWNhdGVkCisgICAgRklMRV9TWVNURU1fQ0hFQ0tfT1dORVJTSElQX1RPS0VOKEZpbGVTeXN0ZW1Pd25lcnNoaXBDaGVjay5GSUxFX1NZU1RFTV9DSEVDS19PV05FUlNISVBfVE9LRU4pLAorICAgIEZPUkNFX0RFRkFVTFRfSU5ERVhJTkdfUEFHRV9TSVpFKCJjYXNzYW5kcmEuZm9yY2VfZGVmYXVsdF9pbmRleGluZ19wYWdlX3NpemUiKSwKKyAgICAvKiogVXNlZCB3aGVuIHJ1bm5pbmcgaW4gQ2xpZW50IG1vZGUgYW5kIHRoZSBzeXN0ZW0gYW5kIHNjaGVtYSBrZXlzcGFjZXMgbmVlZCB0byBiZSBpbml0aWFsaXplZCBvdXRzaWRlIG9mIHRoZWlyIG5vcm1hbCBpbml0aWFsaXphdGlvbiBwYXRoICoqLworICAgIEZPUkNFX0xPQURfTE9DQUxfS0VZU1BBQ0VTKCJjYXNzYW5kcmEuc2NoZW1hLmZvcmNlX2xvYWRfbG9jYWxfa2V5c3BhY2VzIiksCisgICAgRk9SQ0VfUEFYT1NfU1RBVEVfUkVCVUlMRCgiY2Fzc2FuZHJhLmZvcmNlX3BheG9zX3N0YXRlX3JlYnVpbGQiKSwKKyAgICBHSVRfU0hBKCJjYXNzYW5kcmEuZ2l0U0hBIiksCiAgICAgLyoqCiAgICAgICogR29zc2lwIHF1YXJhbnRpbmUgZGVsYXkgaXMgdXNlZCB3aGlsZSBldmFsdWF0aW5nIG1lbWJlcnNoaXAgY2hhbmdlcyBhbmQgc2hvdWxkIG9ubHkgYmUgY2hhbmdlZCB3aXRoIGV4dHJlbWUgY2FyZS4KICAgICAgKi8KICAgICBHT1NTSVBFUl9RVUFSQU5USU5FX0RFTEFZKCJjYXNzYW5kcmEuZ29zc2lwX3F1YXJhbnRpbmVfZGVsYXlfbXMiKSwKLQogICAgIEdPU1NJUEVSX1NLSVBfV0FJVElOR19UT19TRVRUTEUoImNhc3NhbmRyYS5za2lwX3dhaXRfZm9yX2dvc3NpcF90b19zZXR0bGUiLCAiLTEiKSwKLQotICAgIElHTk9SRURfU0NIRU1BX0NIRUNLX1ZFUlNJT05TKCJjYXNzYW5kcmEuc2tpcF9zY2hlbWFfY2hlY2tfZm9yX3ZlcnNpb25zIiksCi0KKyAgICBHT1NTSVBfRElTQUJMRV9USFJFQURfVkFMSURBVElPTigiY2Fzc2FuZHJhLmdvc3NpcC5kaXNhYmxlX3RocmVhZF92YWxpZGF0aW9uIiksCiAgICAgSUdOT1JFRF9TQ0hFTUFfQ0hFQ0tfRU5EUE9JTlRTKCJjYXNzYW5kcmEuc2tpcF9zY2hlbWFfY2hlY2tfZm9yX2VuZHBvaW50cyIpLAotCi0gICAgU0hVVERPV05fQU5OT1VOQ0VfREVMQVlfSU5fTVMoImNhc3NhbmRyYS5zaHV0ZG93bl9hbm5vdW5jZV9pbl9tcyIsICIyMDAwIiksCi0KKyAgICBJR05PUkVEX1NDSEVNQV9DSEVDS19WRVJTSU9OUygiY2Fzc2FuZHJhLnNraXBfc2NoZW1hX2NoZWNrX2Zvcl92ZXJzaW9ucyIpLAorICAgIElHTk9SRV9DT1JSVVBURURfU0NIRU1BX1RBQkxFUygiY2Fzc2FuZHJhLmlnbm9yZV9jb3JydXB0ZWRfc2NoZW1hX3RhYmxlcyIpLAorICAgIC8qKiBAZGVwcmVjYXRlZCBzaG91bGQgYmUgcmVtb3ZlZCBpbiBmYXZvciBvZiBlbmFibGUgZmxhZyBvZiByZWxldmFudCBzdGFydHVwIGNoZWNrIChjaGVja0RhdGFjZW50ZXIpICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBJR05PUkVfREMoImNhc3NhbmRyYS5pZ25vcmVfZGMiKSwKKyAgICBJR05PUkVfRFlOQU1JQ19TTklUQ0hfU0VWRVJJVFkoImNhc3NhbmRyYS5pZ25vcmVfZHluYW1pY19zbml0Y2hfc2V2ZXJpdHkiKSwKKyAgICBJR05PUkVfTUlTU0lOR19OQVRJVkVfRklMRV9ISU5UUygiY2Fzc2FuZHJhLnJlcXVpcmVfbmF0aXZlX2ZpbGVfaGludHMiKSwKKyAgICAvKiogQGRlcHJlY2F0ZWQgc2hvdWxkIGJlIHJlbW92ZWQgaW4gZmF2b3Igb2YgZW5hYmxlIGZsYWcgb2YgcmVsZXZhbnQgc3RhcnR1cCBjaGVjayAoY2hlY2tSYWNrKSAqLworICAgIEBEZXByZWNhdGVkCisgICAgSUdOT1JFX1JBQ0soImNhc3NhbmRyYS5pZ25vcmVfcmFjayIpLAorICAgIElOREVYX1NVTU1BUllfRVhQRUNURURfS0VZX1NJWkUoImNhc3NhbmRyYS5pbmRleF9zdW1tYXJ5X2V4cGVjdGVkX2tleV9zaXplIiwgIjY0IiksCisgICAgSU5JVElBTF9UT0tFTigiY2Fzc2FuZHJhLmluaXRpYWxfdG9rZW4iKSwKKyAgICBJTlRFUk5PREVfRVZFTlRfVEhSRUFEUygiY2Fzc2FuZHJhLmludGVybm9kZS1ldmVudC10aHJlYWRzIiksCisgICAgSU9fTkVUVFlfRVZFTlRMT09QX1RIUkVBRFMoImlvLm5ldHR5LmV2ZW50TG9vcFRocmVhZHMiKSwKKyAgICBJT19ORVRUWV9UUkFOU1BPUlRfRVNUSU1BVEVfU0laRV9PTl9TVUJNSVQoImlvLm5ldHR5LnRyYW5zcG9ydC5lc3RpbWF0ZVNpemVPblN1Ym1pdCIpLAorICAgIEpBVkFYX1JNSV9TU0xfQ0xJRU5UX0VOQUJMRURfQ0lQSEVSX1NVSVRFUygiamF2YXgucm1pLnNzbC5jbGllbnQuZW5hYmxlZENpcGhlclN1aXRlcyIpLAorICAgIEpBVkFYX1JNSV9TU0xfQ0xJRU5UX0VOQUJMRURfUFJPVE9DT0xTKCJqYXZheC5ybWkuc3NsLmNsaWVudC5lbmFibGVkUHJvdG9jb2xzIiksCisgICAgLyoqIEphdmEgY2xhc3MgcGF0aC4gKi8KKyAgICBKQVZBX0NMQVNTX1BBVEgoImphdmEuY2xhc3MucGF0aCIpLAorICAgIEpBVkFfSE9NRSgiamF2YS5ob21lIiksCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHVzZWQgYnkgdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lIChKVk0pCisgICAgICogdG8gY3JlYXRlIGFuZCBzdG9yZSB0ZW1wb3JhcnkgZmlsZXMuCisgICAgICovCisgICAgSkFWQV9JT19UTVBESVIoImphdmEuaW8udG1wZGlyIiksCisgICAgLyoqCisgICAgICogUGF0aCBmcm9tIHdoaWNoIHRvIGxvYWQgbmF0aXZlIGxpYnJhcmllcy4KKyAgICAgKiBEZWZhdWx0IGlzIGFic29sdXRlIHBhdGggdG8gbGliIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBKQVZBX0xJQlJBUllfUEFUSCgiamF2YS5saWJyYXJ5LnBhdGgiKSwKKyAgICAvKioKKyAgICAgKiBDb250cm9scyB0aGUgZGlzdHJpYnV0ZWQgZ2FyYmFnZSBjb2xsZWN0b3IgbGVhc2UgdGltZSBmb3IgSk1YIG9iamVjdHMuCisgICAgICogU2hvdWxkIG9ubHkgYmUgc2V0IGJ5IGluLWp2bSBkdGVzdHMuCisgICAgICovCisgICAgSkFWQV9STUlfREdDX0xFQVNFX1ZBTFVFX0lOX0pWTV9EVEVTVCgiamF2YS5ybWkuZGdjLmxlYXNlVmFsdWUiKSwKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSByZXByZXNlbnRzIHRoZSBob3N0IG5hbWUgc3RyaW5nCisgICAgICogdGhhdCBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoIHJlbW90ZSBzdHVicyBmb3IgbG9jYWxseSBjcmVhdGVkIHJlbW90ZSBvYmplY3RzLAorICAgICAqIGluIG9yZGVyIHRvIGFsbG93IGNsaWVudHMgdG8gaW52b2tlIG1ldGhvZHMgb24gdGhlIHJlbW90ZSBvYmplY3QuCisgICAgICovCisgICAgSkFWQV9STUlfU0VSVkVSX0hPU1ROQU1FKCJqYXZhLnJtaS5zZXJ2ZXIuaG9zdG5hbWUiKSwKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIHZhbHVlIGlzIHRydWUsIG9iamVjdCBpZGVudGlmaWVycyBmb3IgcmVtb3RlIG9iamVjdHMgZXhwb3J0ZWQgYnkgdGhpcyBWTSB3aWxsIGJlIGdlbmVyYXRlZCBieSB1c2luZworICAgICAqIGEgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KKyAgICAgKi8KKyAgICBKQVZBX1JNSV9TRVJWRVJfUkFORE9NX0lEKCJqYXZhLnJtaS5zZXJ2ZXIucmFuZG9tSURzIiksCisgICAgSkFWQV9TRUNVUklUWV9BVVRIX0xPR0lOX0NPTkZJRygiamF2YS5zZWN1cml0eS5hdXRoLmxvZ2luLmNvbmZpZyIpLAorICAgIEpBVkFfU0VDVVJJVFlfRUdEKCJqYXZhLnNlY3VyaXR5LmVnZCIpLAorICAgIC8qKiBKYXZhIFJ1bnRpbWUgRW52aXJvbm1lbnQgdmVyc2lvbiAqLworICAgIEpBVkFfVkVSU0lPTigiamF2YS52ZXJzaW9uIiksCisgICAgLyoqIEphdmEgVmlydHVhbCBNYWNoaW5lIGltcGxlbWVudGF0aW9uIG5hbWUgKi8KKyAgICBKQVZBX1ZNX05BTUUoImphdmEudm0ubmFtZSIpLAorICAgIEpPSU5fUklORygiY2Fzc2FuZHJhLmpvaW5fcmluZyIsICJ0cnVlIiksCisgICAgLyoqIHN0YXJ0dXAgY2hlY2tzIHByb3BlcnRpZXMgKi8KKyAgICBMSUJKRU1BTExPQygiY2Fzc2FuZHJhLmxpYmplbWFsbG9jIiksCisgICAgLyoqIExpbmUgc2VwYXJhdG9yICgiXG4iIG9uIFVOSVgpLiAqLworICAgIExJTkVfU0VQQVJBVE9SKCJsaW5lLnNlcGFyYXRvciIpLAorICAgIC8qKiBMb2FkIHBlcnNpc3RlbmNlIHJpbmcgc3RhdGUuIERlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIHRydWV9LiAqLworICAgIExPQURfUklOR19TVEFURSgiY2Fzc2FuZHJhLmxvYWRfcmluZ19zdGF0ZSIsICJ0cnVlIiksCisgICAgTE9HNEoyX0RJU0FCTEVfSk1YKCJsb2c0ajIuZGlzYWJsZUpteCIpLAorICAgIExPRzRKMl9ESVNBQkxFX0pNWF9MRUdBQ1koImxvZzRqMi5kaXNhYmxlLmpteCIpLAorICAgIExPRzRKX1NIVVRET1dOX0hPT0tfRU5BQkxFRCgibG9nNGouc2h1dGRvd25Ib29rRW5hYmxlZCIpLAorICAgIExPR0JBQ0tfQ09ORklHVVJBVElPTl9GSUxFKCJsb2diYWNrLmNvbmZpZ3VyYXRpb25GaWxlIiksCisgICAgLyoqIE1heGltdW0gbnVtYmVyIG9mIHJvd3MgaW4gc3lzdGVtX3ZpZXdzLmxvZ3MgdGFibGUgKi8KKyAgICBMT0dTX1ZJUlRVQUxfVEFCTEVfTUFYX1JPV1MoImNhc3NhbmRyYS52aXJ0dWFsLmxvZ3MubWF4LnJvd3MiLCBjb252ZXJ0VG9TdHJpbmcoTG9nTWVzc2FnZXNUYWJsZS5MT0dTX1ZJUlRVQUxfVEFCTEVfREVGQVVMVF9ST1dTKSksCisgICAgLyoqCisgICAgICogRGlyZWN0b3J5IHdoZXJlIENhc3NhbmRyYSBwdXRzIGl0cyBsb2dzLCBkZWZhdWx0cyB0byAiLiIgd2hpY2ggaXMgY3VycmVudCBkaXJlY3RvcnkuCisgICAgICovCisgICAgTE9HX0RJUigiY2Fzc2FuZHJhLmxvZ2RpciIsICIuIiksCisgICAgLyoqCisgICAgICogRGlyZWN0b3J5IHdoZXJlIENhc3NhbmRyYSBwZXJzaXN0cyBsb2dzIGZyb20gYXVkaXQgbG9nZ2luZy4gSWYgdGhpcyBwcm9wZXJ0eSBpcyBub3Qgc2V0LCB0aGUgYXVkaXQgbG9nIGZyYW1ld29yaworICAgICAqIHdpbGwgc2V0IGl0IGF1dG9tYXRpY2FsbHkgdG8ge0BsaW5rIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyNMT0dfRElSfSArICIvYXVkaXQiLgorICAgICAqLworICAgIExPR19ESVJfQVVESVQoImNhc3NhbmRyYS5sb2dkaXIuYXVkaXQiKSwKKyAgICAvKiogTG9vc2VuIHRoZSBkZWZpbml0aW9uIG9mICJlbXB0eSIgZm9yIGdvc3NpcCBzdGF0ZSwgZm9yIHVzZSBkdXJpbmcgaG9zdCByZXBsYWNlbWVudHMgaWYgdGhpbmdzIGdvIGF3cnkgKi8KKyAgICBMT09TRV9ERUZfT0ZfRU1QVFlfRU5BQkxFRChDb25maWcuUFJPUEVSVFlfUFJFRklYICsgImdvc3NpcGVyLmxvb3NlX2VtcHR5X2VuYWJsZWQiKSwKKyAgICBNQVhfQ09OQ1VSUkVOVF9SQU5HRV9SRVFVRVNUUygiY2Fzc2FuZHJhLm1heF9jb25jdXJyZW50X3JhbmdlX3JlcXVlc3RzIiksCisgICAgTUFYX0hJTlRfQlVGRkVSUygiY2Fzc2FuZHJhLk1BWF9ISU5UX0JVRkZFUlMiLCAiMyIpLAorICAgIE1BWF9MT0NBTF9QQVVTRV9JTl9NUygiY2Fzc2FuZHJhLm1heF9sb2NhbF9wYXVzZV9pbl9tcyIsICI1MDAwIiksCisgICAgLyoqIHdoYXQgY2xhc3MgdG8gdXNlIGZvciBtYmVhbiByZWdpc3RlcmF0aW9uICovCisgICAgTUJFQU5fUkVHSVNUUkFUSU9OX0NMQVNTKCJvcmcuYXBhY2hlLmNhc3NhbmRyYS5tYmVhbl9yZWdpc3RyYXRpb25fY2xhc3MiKSwKKyAgICBNRU1UQUJMRV9PVkVSSEVBRF9DT01QVVRFX1NURVBTKCJjYXNzYW5kcmEubWVtdGFibGVfcm93X292ZXJoZWFkX2NvbXB1dGF0aW9uX3N0ZXAiLCAiMTAwMDAwIiksCisgICAgTUVNVEFCTEVfT1ZFUkhFQURfU0laRSgiY2Fzc2FuZHJhLm1lbXRhYmxlLnJvd19vdmVyaGVhZF9zaXplIiwgIi0xIiksCisgICAgTUVNVEFCTEVfU0hBUkRfQ09VTlQoImNhc3NhbmRyYS5tZW10YWJsZS5zaGFyZC5jb3VudCIpLAorICAgIE1FTVRBQkxFX1RSSUVfU0laRV9MSU1JVCgiY2Fzc2FuZHJhLnRyaWVfc2l6ZV9saW1pdF9tYiIpLAorICAgIE1FVFJJQ1NfUkVQT1JURVJfQ09ORklHX0ZJTEUoImNhc3NhbmRyYS5tZXRyaWNzUmVwb3J0ZXJDb25maWdGaWxlIiksCisgICAgTUlHUkFUSU9OX0RFTEFZKCJjYXNzYW5kcmEubWlncmF0aW9uX2RlbGF5X21zIiwgIjYwMDAwIiksCisgICAgLyoqIERlZmluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHVuaXF1ZSB0aW1lZCBvdXQgcXVlcmllcyB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgaW4gdGhlIGxvZ3MuIFVzZSBhIG5lZ2F0aXZlIG51bWJlciB0byByZW1vdmUgYW55IGxpbWl0LiAqLworICAgIE1PTklUT1JJTkdfTUFYX09QRVJBVElPTlMoImNhc3NhbmRyYS5tb25pdG9yaW5nX21heF9vcGVyYXRpb25zIiwgIjUwIiksCisgICAgLyoqIERlZmluZXMgdGhlIGludGVydmFsIGZvciByZXBvcnRpbmcgYW55IG9wZXJhdGlvbnMgdGhhdCBoYXZlIHRpbWVkIG91dC4gKi8KKyAgICBNT05JVE9SSU5HX1JFUE9SVF9JTlRFUlZBTF9NUygiY2Fzc2FuZHJhLm1vbml0b3JpbmdfcmVwb3J0X2ludGVydmFsX21zIiwgIjUwMDAiKSwKKyAgICBNVl9BTExPV19GSUxURVJJTkdfTk9OS0VZX0NPTFVNTlNfVU5TQUZFKCJjYXNzYW5kcmEubXYuYWxsb3dfZmlsdGVyaW5nX25vbmtleV9jb2x1bW5zX3Vuc2FmZSIpLAorICAgIE1WX0VOQUJMRV9DT09SRElOQVRPUl9CQVRDSExPRygiY2Fzc2FuZHJhLm12X2VuYWJsZV9jb29yZGluYXRvcl9iYXRjaGxvZyIpLAorICAgIC8qKiBteDRqYWRkcmVzcyAqLworICAgIE1YNEpBRERSRVNTKCJteDRqYWRkcmVzcyIpLAorICAgIC8qKiBteDRqcG9ydCAqLworICAgIE1YNEpQT1JUKCJteDRqcG9ydCIpLAorICAgIE5BTk9USU1FVE9NSUxMSVNfVElNRVNUQU1QX1VQREFURV9JTlRFUlZBTCgiY2Fzc2FuZHJhLk5BTk9USU1FVE9NSUxMSVNfVElNRVNUQU1QX1VQREFURV9JTlRFUlZBTCIsICIxMDAwMCIpLAorICAgIE5BVElWRV9FUE9MTF9FTkFCTEVEKCJjYXNzYW5kcmEubmF0aXZlLmVwb2xsLmVuYWJsZWQiLCAidHJ1ZSIpLAorICAgIC8qKiBUaGlzIGlzIHRoZSBwb3J0IHVzZWQgd2l0aCBSUEMgYWRkcmVzcyBmb3IgdGhlIG5hdGl2ZSBwcm90b2NvbCB0byBjb21tdW5pY2F0ZSB3aXRoIGNsaWVudHMuIE5vdyB0aGF0IHRocmlmdCBSUEMgaXMgbm8gbG9uZ2VyIGluIHVzZSB0aGVyZSBpcyBubyBSUEMgcG9ydC4gKi8KKyAgICBOQVRJVkVfVFJBTlNQT1JUX1BPUlQoImNhc3NhbmRyYS5uYXRpdmVfdHJhbnNwb3J0X3BvcnQiKSwKKyAgICBORVZFUl9QVVJHRV9UT01CU1RPTkVTKCJjYXNzYW5kcmEubmV2ZXJfcHVyZ2VfdG9tYnN0b25lcyIpLAorICAgIE5JT19EQVRBX09VVFBVVF9TVFJFQU1fUExVU19CVUZGRVJfU0laRSgiY2Fzc2FuZHJhLm5pb19kYXRhX291dHB1dF9zdHJlYW1fcGx1c19idWZmZXJfc2l6ZSIsIGNvbnZlcnRUb1N0cmluZygzMiAqIDEwMjQpKSwKKyAgICBOT0RFVE9PTF9KTVhfTk9USUZJQ0FUSU9OX1BPTExfSU5URVJWQUxfU0VDT05EUygiY2Fzc2FuZHJhLm5vZGV0b29sLmpteF9ub3RpZmljYXRpb25fcG9sbF9pbnRlcnZhbF9zZWNvbmRzIiwgY29udmVydFRvU3RyaW5nKFRpbWVVbml0LlNFQ09ORFMuY29udmVydCg1LCBUaW1lVW5pdC5NSU5VVEVTKSkpLAorICAgIC8qKiBJZiBzZXQsIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZX0gaXMgc2h1dGRvd24gYWJydHVwdGx5IHdpdGhvdXQgd2FpdGluZyBmb3IgYW55dGhpbmcuCisgICAgICogVGhpcyBpcyBhbiBvcHRpbWl6YXRpb24gdXNlZCBpbiB1bml0IHRlc3RzIGJlY3Vhc2Ugd2UgbmV2ZXIgcmVzdGFydCBhIG5vZGUgdGhlcmUuIFRoZSBvbmx5IG5vZGUgaXMgc3RvcG9wZWQKKyAgICAgKiB3aGVuIHRoZSBKVk0gdGVybWluYXRlcy4gVGhlcmVmb3JlLCB3ZSBjYW4gdXNlIHN1Y2ggb3B0aW1pemF0aW9uIGFuZCBub3Qgd2FpdCB1bm5lY2Vzc2FyaWx5LiAqLworICAgIE5PTl9HUkFDRUZVTF9TSFVURE9XTigiY2Fzc2FuZHJhLnRlc3QubWVzc2FnaW5nU2VydmljZS5ub25HcmFjZWZ1bFNodXRkb3duIiksCisgICAgLyoqIGZvciBzcGVjaWZpYyB0ZXN0cyAqLworICAgIC8qKiBUaGlzIHByb3BlcnR5IGluZGljYXRlcyB3aGV0aGVyIGRpc2FibGVfbWJlYW5fcmVnaXN0cmF0aW9uIGlzIHRydWUgKi8KKyAgICBPUkdfQVBBQ0hFX0NBU1NBTkRSQV9ESVNBQkxFX01CRUFOX1JFR0lTVFJBVElPTigib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzYWJsZV9tYmVhbl9yZWdpc3RyYXRpb24iKSwKKyAgICAvKiogT3BlcmF0aW5nIHN5c3RlbSBhcmNoaXRlY3R1cmUuICovCisgICAgT1NfQVJDSCgib3MuYXJjaCIpLAorICAgIC8qKiBPcGVyYXRpbmcgc3lzdGVtIG5hbWUuICovCisgICAgT1NfTkFNRSgib3MubmFtZSIpLAorICAgIE9UQ1BfTEFSR0VfTUVTU0FHRV9USFJFU0hPTEQoImNhc3NhbmRyYS5vdGNwX2xhcmdlX21lc3NhZ2VfdGhyZXNob2xkIiwgY29udmVydFRvU3RyaW5nKDEwMjQgKiA2NCkpLAorICAgIC8qKiBFbmFibGVkL2Rpc2FibGUgVENQX05PREVMQVkgZm9yIGludHJhZGMgY29ubmVjdGlvbnMuIERlZmF1bHRzIGlzIGVuYWJsZWQuICovCisgICAgT1RDX0lOVFJBRENfVENQX05PREVMQVkoImNhc3NhbmRyYS5vdGNfaW50cmFkY190Y3Bfbm9kZWxheSIsICJ0cnVlIiksCisgICAgT1ZFUlJJREVfREVDT01NSVNTSU9OKCJjYXNzYW5kcmEub3ZlcnJpZGVfZGVjb21taXNzaW9uIiksCisgICAgUEFSRU5UX1JFUEFJUl9TVEFUVVNfQ0FDSEVfU0laRSgiY2Fzc2FuZHJhLnBhcmVudF9yZXBhaXJfc3RhdHVzX2NhY2hlX3NpemUiLCAiMTAwMDAwIiksCisgICAgUEFSRU5UX1JFUEFJUl9TVEFUVVNfRVhQSVJZX1NFQ09ORFMoImNhc3NhbmRyYS5wYXJlbnRfcmVwYWlyX3N0YXR1c19leHBpcnlfc2Vjb25kcyIsIGNvbnZlcnRUb1N0cmluZyhUaW1lVW5pdC5TRUNPTkRTLmNvbnZlcnQoMSwgVGltZVVuaXQuREFZUykpKSwKKyAgICBQQVJUSVRJT05FUigiY2Fzc2FuZHJhLnBhcnRpdGlvbmVyIiksCisgICAgUEFYT1NfQ0xFQU5VUF9TRVNTSU9OX1RJTUVPVVRfU0VDT05EUygiY2Fzc2FuZHJhLnBheG9zX2NsZWFudXBfc2Vzc2lvbl90aW1lb3V0X3NlY29uZHMiLCBjb252ZXJ0VG9TdHJpbmcoVGltZVVuaXQuSE9VUlMudG9TZWNvbmRzKDIpKSksCisgICAgUEFYT1NfRElTQUJMRV9DT09SRElOQVRPUl9MT0NLSU5HKCJjYXNzYW5kcmEucGF4b3MuZGlzYWJsZV9jb29yZGluYXRvcl9sb2NraW5nIiksCisgICAgUEFYT1NfTE9HX1RUTF9MSU5FQVJJWkFCSUxJVFlfVklPTEFUSU9OUygiY2Fzc2FuZHJhLnBheG9zLmxvZ190dGxfbGluZWFyaXphYmlsaXR5X3Zpb2xhdGlvbnMiLCAidHJ1ZSIpLAorICAgIFBBWE9TX01PREVSTl9SRUxFQVNFKCJjYXNzYW5kcmEucGF4b3MubW9kZXJuX3JlbGVhc2UiLCAiNC4xIiksCisgICAgUEFYT1NfUkVQQUlSX0FMTE9XX01VTFRJUExFX1BFTkRJTkdfVU5TQUZFKCJjYXNzYW5kcmEucGF4b3NfcmVwYWlyX2FsbG93X211bHRpcGxlX3BlbmRpbmdfdW5zYWZlIiksCisgICAgUEFYT1NfUkVQQUlSX09OX1RPUE9MT0dZX0NIQU5HRV9SRVRSSUVTKCJjYXNzYW5kcmEucGF4b3NfcmVwYWlyX29uX3RvcG9sb2d5X2NoYW5nZV9yZXRyaWVzIiwgIjEwIiksCisgICAgUEFYT1NfUkVQQUlSX09OX1RPUE9MT0dZX0NIQU5HRV9SRVRSWV9ERUxBWV9TRUNPTkRTKCJjYXNzYW5kcmEucGF4b3NfcmVwYWlyX29uX3RvcG9sb2d5X2NoYW5nZV9yZXRyeV9kZWxheV9zZWNvbmRzIiwgIjEwIiksCisgICAgUEFYT1NfUkVQQUlSX1JFVFJZX1RJTUVPVVRfSU5fTVMoImNhc3NhbmRyYS5wYXhvc19yZXBhaXJfcmV0cnlfdGltZW91dF9taWxsaXMiLCAiNjAwMDAiKSwKKyAgICBQQVhPU19VU0VfU0VMRl9FWEVDVVRJT04oImNhc3NhbmRyYS5wYXhvcy51c2Vfc2VsZl9leGVjdXRpb24iLCAidHJ1ZSIpLAorICAgIFBSSU5UX0hFQVBfSElTVE9HUkFNX09OX09VVF9PRl9NRU1PUllfRVJST1IoImNhc3NhbmRyYS5wcmludEhlYXBIaXN0b2dyYW1Pbk91dE9mTWVtb3J5RXJyb3IiKSwKKyAgICBSRUFEU19USFJFU0hPTERTX0NPT1JESU5BVE9SX0RFRkVOU0lWRV9DSEVDS1NfRU5BQkxFRCgiY2Fzc2FuZHJhLnJlYWRzLnRocmVzaG9sZHMuY29vcmRpbmF0b3IuZGVmZW5zaXZlX2NoZWNrc19lbmFibGVkIiksCisgICAgUkVMRUFTRV9WRVJTSU9OKCJjYXNzYW5kcmEucmVsZWFzZVZlcnNpb24iKSwKKyAgICBSRUxPQ0FURURfU0hBREVEX0lPX05FVFRZX1RSQU5TUE9SVF9OT05BVElWRSgicmVsb2NhdGVkLnNoYWRlZC5pby5uZXR0eS50cmFuc3BvcnQubm9OYXRpdmUiKSwKKyAgICBSRVBBSVJfQ0xFQU5VUF9JTlRFUlZBTF9TRUNPTkRTKCJjYXNzYW5kcmEucmVwYWlyX2NsZWFudXBfaW50ZXJ2YWxfc2Vjb25kcyIsIGNvbnZlcnRUb1N0cmluZyhJbnRzLmNoZWNrZWRDYXN0KFRpbWVVbml0Lk1JTlVURVMudG9TZWNvbmRzKDEwKSkpKSwKKyAgICBSRVBBSVJfREVMRVRFX1RJTUVPVVRfU0VDT05EUygiY2Fzc2FuZHJhLnJlcGFpcl9kZWxldGVfdGltZW91dF9zZWNvbmRzIiwgY29udmVydFRvU3RyaW5nKEludHMuY2hlY2tlZENhc3QoVGltZVVuaXQuREFZUy50b1NlY29uZHMoMSkpKSksCisgICAgUkVQQUlSX0ZBSUxfVElNRU9VVF9TRUNPTkRTKCJjYXNzYW5kcmEucmVwYWlyX2ZhaWxfdGltZW91dF9zZWNvbmRzIiwgY29udmVydFRvU3RyaW5nKEludHMuY2hlY2tlZENhc3QoVGltZVVuaXQuREFZUy50b1NlY29uZHMoMSkpKSksCisgICAgUkVQQUlSX01VVEFUSU9OX1JFUEFJUl9ST1dTX1BFUl9CQVRDSCgiY2Fzc2FuZHJhLnJlcGFpci5tdXRhdGlvbl9yZXBhaXJfcm93c19wZXJfYmF0Y2giLCAiMTAwIiksCisgICAgUkVQQUlSX1NUQVRVU19DSEVDS19USU1FT1VUX1NFQ09ORFMoImNhc3NhbmRyYS5yZXBhaXJfc3RhdHVzX2NoZWNrX3RpbWVvdXRfc2Vjb25kcyIsIGNvbnZlcnRUb1N0cmluZyhJbnRzLmNoZWNrZWRDYXN0KFRpbWVVbml0LkhPVVJTLnRvU2Vjb25kcygxKSkpKSwKICAgICAvKioKICAgICAgKiBXaGVuIGRvaW5nIGEgaG9zdCByZXBsYWNlbWVudCBpdHMgcG9zc2libGUgdGhhdCB0aGUgZ29zc2lwIHN0YXRlIGlzICJlbXB0eSIgbWVhbmluZyB0aGF0IHRoZSBlbmRwb2ludCBpcyBrbm93bgogICAgICAqIGJ1dCB0aGUgY3VycmVudCBzdGF0ZSBpc24ndCBrbm93bi4gIElmIHRoZSBob3N0IHJlcGxhY2VtZW50IGlzIG5lZWRlZCB0byByZXBhaXIgdGhpcyBzdGF0ZSwgdGhpcyBwcm9wZXJ0eSBtdXN0CiAgICAgICogYmUgdHJ1ZS4KICAgICAgKi8KICAgICBSRVBMQUNFTUVOVF9BTExPV19FTVBUWSgiY2Fzc2FuZHJhLmFsbG93X2VtcHR5X3JlcGxhY2VfYWRkcmVzcyIsICJ0cnVlIiksCi0KKyAgICBSRVBMQUNFX0FERFJFU1MoImNhc3NhbmRyYS5yZXBsYWNlX2FkZHJlc3MiKSwKKyAgICBSRVBMQUNFX0FERFJFU1NfRklSU1RfQk9PVCgiY2Fzc2FuZHJhLnJlcGxhY2VfYWRkcmVzc19maXJzdF9ib290IiksCisgICAgUkVQTEFDRV9OT0RFKCJjYXNzYW5kcmEucmVwbGFjZV9ub2RlIiksCisgICAgUkVQTEFDRV9UT0tFTigiY2Fzc2FuZHJhLnJlcGxhY2VfdG9rZW4iKSwKICAgICAvKioKLSAgICAgKiBEaXJlY3Rvcnkgd2hlcmUgQ2Fzc2FuZHJhIHB1dHMgaXRzIGxvZ3MsIGRlZmF1bHRzIHRvICIuIiB3aGljaCBpcyBjdXJyZW50IGRpcmVjdG9yeS4KKyAgICAgKiBXaGV0aGVyIHdlIHJlc2V0IGFueSBmb3VuZCBkYXRhIGZyb20gcHJldmlvdXNseSBydW4gYm9vdHN0cmFwcy4KICAgICAgKi8KLSAgICBMT0dfRElSKCJjYXNzYW5kcmEubG9nZGlyIiwgIi4iKSwKLQotICAgIC8qKgotICAgICAqIERpcmVjdG9yeSB3aGVyZSBDYXNzYW5kcmEgcGVyc2lzdHMgbG9ncyBmcm9tIGF1ZGl0IGxvZ2dpbmcuIElmIHRoaXMgcHJvcGVydHkgaXMgbm90IHNldCwgdGhlIGF1ZGl0IGxvZyBmcmFtZXdvcmsKLSAgICAgKiB3aWxsIHNldCBpdCBhdXRvbWF0aWNhbGx5IHRvIHtAbGluayBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMjTE9HX0RJUn0gKyAiL2F1ZGl0Ii4KLSAgICAgKi8KLSAgICBMT0dfRElSX0FVRElUKCJjYXNzYW5kcmEubG9nZGlyLmF1ZGl0IiksCi0KLSAgICBDT05TSVNURU5UX0RJUkVDVE9SWV9MSVNUSU5HUygiY2Fzc2FuZHJhLmNvbnNpc3RlbnRfZGlyZWN0b3J5X2xpc3RpbmdzIiwgImZhbHNlIiksCi0gICAgQ0xPQ0tfR0xPQkFMKCJjYXNzYW5kcmEuY2xvY2siLCBudWxsKSwKLSAgICBDTE9DS19NT05PVE9OSUNfQVBQUk9YKCJjYXNzYW5kcmEubW9ub3RvbmljX2Nsb2NrLmFwcHJveCIsIG51bGwpLAotICAgIENMT0NLX01PTk9UT05JQ19QUkVDSVNFKCJjYXNzYW5kcmEubW9ub3RvbmljX2Nsb2NrLnByZWNpc2UiLCBudWxsKSwKLQotICAgIC8qCi0gICAgICogV2hldGhlciB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29uc2lzdGVuY3lMZXZlbCNOT0RFX0xPQ0FMfSBzaG91bGQgYmUgYWxsb3dlZC4KLSAgICAgKi8KLSAgICBFTkFCTEVfTk9ERUxPQ0FMX1FVRVJJRVMoImNhc3NhbmRyYS5lbmFibGVfbm9kZWxvY2FsX3F1ZXJpZXMiLCAiZmFsc2UiKSwKLQotICAgIC8vY2Fzc2FuZHJhIHByb3BlcnRpZXMgKHdpdGhvdXQgdGhlICJjYXNzYW5kcmEuIiBwcmVmaXgpCi0KLSAgICAvKioKLSAgICAgKiBUaGUgY2Fzc2FuZHJhLWZvcmVncm91bmQgb3B0aW9uIHdpbGwgdGVsbCBDYXNzYW5kcmFEYWVtb24gd2hldGhlcgotICAgICAqIHRvIGNsb3NlIHN0ZG91dC9zdGRlcnIsIGJ1dCBpdCdzIHVwIHRvIHVzIG5vdCB0byBiYWNrZ3JvdW5kLgotICAgICAqIHllcy9udWxsCi0gICAgICovCi0gICAgQ0FTU0FORFJBX0ZPUkVHUk9VTkQgKCJjYXNzYW5kcmEtZm9yZWdyb3VuZCIpLAotCi0gICAgREVGQVVMVF9QUk9WSURFX09WRVJMQVBQSU5HX1RPTUJTVE9ORVMgKCJkZWZhdWx0LnByb3ZpZGUub3ZlcmxhcHBpbmcudG9tYnN0b25lcyIpLAotICAgIE9SR19BUEFDSEVfQ0FTU0FORFJBX0RJU0FCTEVfTUJFQU5fUkVHSVNUUkFUSU9OICgib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzYWJsZV9tYmVhbl9yZWdpc3RyYXRpb24iKSwKLQotICAgIC8qKiBUaGlzIHByb3BlcnR5IGluZGljYXRlcyB3aGV0aGVyIGRpc2FibGVfbWJlYW5fcmVnaXN0cmF0aW9uIGlzIHRydWUgKi8KLSAgICBJU19ESVNBQkxFRF9NQkVBTl9SRUdJU1RSQVRJT04oIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc2FibGVfbWJlYW5fcmVnaXN0cmF0aW9uIiksCi0KLSAgICAvKiogc25hcHNob3RzIHR0bCBjbGVhbnVwIHBlcmlvZCBpbiBzZWNvbmRzICovCi0gICAgU05BUFNIT1RfQ0xFQU5VUF9QRVJJT0RfU0VDT05EUygiY2Fzc2FuZHJhLnNuYXBzaG90LnR0bF9jbGVhbnVwX3BlcmlvZF9zZWNvbmRzIiwgIjYwIiksCi0KLSAgICAvKiogc25hcHNob3RzIHR0bCBjbGVhbnVwIGluaXRpYWwgZGVsYXkgaW4gc2Vjb25kcyAqLwotICAgIFNOQVBTSE9UX0NMRUFOVVBfSU5JVElBTF9ERUxBWV9TRUNPTkRTKCJjYXNzYW5kcmEuc25hcHNob3QudHRsX2NsZWFudXBfaW5pdGlhbF9kZWxheV9zZWNvbmRzIiwgIjUiKSwKLQotICAgIC8qKiBtaW5pbXVtIGFsbG93ZWQgVFRMIGZvciBzbmFwc2hvdHMgKi8KLSAgICBTTkFQU0hPVF9NSU5fQUxMT1dFRF9UVExfU0VDT05EUygiY2Fzc2FuZHJhLnNuYXBzaG90Lm1pbl9hbGxvd2VkX3R0bF9zZWNvbmRzIiwgIjYwIiksCi0KLSAgICAvKiogd2hhdCBjbGFzcyB0byB1c2UgZm9yIG1iZWFuIHJlZ2lzdGVyYXRpb24gKi8KLSAgICBNQkVBTl9SRUdJU1RSQVRJT05fQ0xBU1MoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1iZWFuX3JlZ2lzdHJhdGlvbl9jbGFzcyIpLAotCi0gICAgLyoqIFRoaXMgcHJvcGVydHkgaW5kaWNhdGVzIGlmIHRoZSBjb2RlIGlzIHJ1bm5pbmcgdW5kZXIgdGhlIGluLWp2bSBkdGVzdCBmcmFtZXdvcmsgKi8KLSAgICBEVEVTVF9JU19JTl9KVk1fRFRFU1QoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmR0ZXN0LmlzX2luX2p2bV9kdGVzdCIpLAotCi0gICAgQkFUQ0hfQ09NTUlUX0xPR19TWU5DX0lOVEVSVkFMKCJjYXNzYW5kcmEuYmF0Y2hfY29tbWl0bG9nX3N5bmNfaW50ZXJ2YWxfbWlsbGlzIiwgIjEwMDAiKSwKLQotICAgIFNZU1RFTV9BVVRIX0RFRkFVTFRfUkYoImNhc3NhbmRyYS5zeXN0ZW1fYXV0aC5kZWZhdWx0X3JmIiwgIjEiKSwKLSAgICBTWVNURU1fVFJBQ0VTX0RFRkFVTFRfUkYoImNhc3NhbmRyYS5zeXN0ZW1fdHJhY2VzLmRlZmF1bHRfcmYiLCAiMiIpLAotICAgIFNZU1RFTV9ESVNUUklCVVRFRF9ERUZBVUxUX1JGKCJjYXNzYW5kcmEuc3lzdGVtX2Rpc3RyaWJ1dGVkLmRlZmF1bHRfcmYiLCAiMyIpLAotCi0gICAgTUVNVEFCTEVfT1ZFUkhFQURfU0laRSgiY2Fzc2FuZHJhLm1lbXRhYmxlLnJvd19vdmVyaGVhZF9zaXplIiwgIi0xIiksCi0gICAgTUVNVEFCTEVfT1ZFUkhFQURfQ09NUFVURV9TVEVQUygiY2Fzc2FuZHJhLm1lbXRhYmxlX3Jvd19vdmVyaGVhZF9jb21wdXRhdGlvbl9zdGVwIiwgIjEwMDAwMCIpLAotICAgIE1JR1JBVElPTl9ERUxBWSgiY2Fzc2FuZHJhLm1pZ3JhdGlvbl9kZWxheV9tcyIsICI2MDAwMCIpLAorICAgIFJFU0VUX0JPT1RTVFJBUF9QUk9HUkVTUygiY2Fzc2FuZHJhLnJlc2V0X2Jvb3RzdHJhcF9wcm9ncmVzcyIpLAorICAgIFJJTkdfREVMQVkoImNhc3NhbmRyYS5yaW5nX2RlbGF5X21zIiksCiAgICAgLyoqIERlZmluZXMgaG93IG9mdGVuIHNjaGVtYSBkZWZpbml0aW9ucyBhcmUgcHVsbGVkIGZyb20gdGhlIG90aGVyIG5vZGVzICovCiAgICAgU0NIRU1BX1BVTExfSU5URVJWQUxfTVMoImNhc3NhbmRyYS5zY2hlbWFfcHVsbF9pbnRlcnZhbF9tcyIsICI2MDAwMCIpLAotCi0gICAgUEFYT1NfUkVQQUlSX1JFVFJZX1RJTUVPVVRfSU5fTVMoImNhc3NhbmRyYS5wYXhvc19yZXBhaXJfcmV0cnlfdGltZW91dF9taWxsaXMiLCAiNjAwMDAiKSwKLQotICAgIC8qKiBJZiB3ZSBzaG91bGQgYWxsb3cgaGF2aW5nIGR1cGxpY2F0ZSBrZXlzIGluIHRoZSBjb25maWcgZmlsZSwgZGVmYXVsdCB0byB0cnVlIGZvciBsZWdhY3kgcmVhc29ucyAqLwotICAgIEFMTE9XX0RVUExJQ0FURV9DT05GSUdfS0VZUygiY2Fzc2FuZHJhLmFsbG93X2R1cGxpY2F0ZV9jb25maWdfa2V5cyIsICJ0cnVlIiksCi0gICAgLyoqIElmIHdlIHNob3VsZCBhbGxvdyBoYXZpbmcgYm90aCBuZXcgKHBvc3QgQ0FTU0FORFJBLTE1MjM0KSBhbmQgb2xkIGNvbmZpZyBrZXlzIGZvciB0aGUgc2FtZSBjb25maWcgaXRlbSBpbiB0aGUgeWFtbCAqLwotICAgIEFMTE9XX05FV19PTERfQ09ORklHX0tFWVMoImNhc3NhbmRyYS5hbGxvd19uZXdfb2xkX2NvbmZpZ19rZXlzIiwgImZhbHNlIiksCi0KLSAgICAvLyBzdGFydHVwIGNoZWNrcyBwcm9wZXJ0aWVzCi0gICAgTElCSkVNQUxMT0MoImNhc3NhbmRyYS5saWJqZW1hbGxvYyIpLAotICAgIEBEZXByZWNhdGVkIC8vIHNob3VsZCBiZSByZW1vdmVkIGluIGZhdm9yIG9mIGVuYWJsZSBmbGFnIG9mIHJlbGV2YW50IHN0YXJ0dXAgY2hlY2sgKGNoZWNrRGF0YWNlbnRlcikKLSAgICBJR05PUkVfREMoImNhc3NhbmRyYS5pZ25vcmVfZGMiKSwKLSAgICBARGVwcmVjYXRlZCAvLyBzaG91bGQgYmUgcmVtb3ZlZCBpbiBmYXZvciBvZiBlbmFibGUgZmxhZyBvZiByZWxldmFudCBzdGFydHVwIGNoZWNrIChjaGVja1JhY2spCi0gICAgSUdOT1JFX1JBQ0soImNhc3NhbmRyYS5pZ25vcmVfcmFjayIpLAotICAgIEBEZXByZWNhdGVkIC8vIHNob3VsZCBiZSByZW1vdmVkIGluIGZhdm9yIG9mIGVuYWJsZSBmbGFnIG9mIHJlbGV2YW50IHN0YXJ0dXAgY2hlY2sgKEZpbGVTeXN0ZW1Pd25lcnNoaXBDaGVjaykKLSAgICBGSUxFX1NZU1RFTV9DSEVDS19FTkFCTEUoImNhc3NhbmRyYS5lbmFibGVfZnNfb3duZXJzaGlwX2NoZWNrIiksCi0gICAgQERlcHJlY2F0ZWQgLy8gc2hvdWxkIGJlIHJlbW92ZWQgaW4gZmF2b3Igb2YgZmxhZ3MgaW4gcmVsZXZhbnQgc3RhcnR1cCBjaGVjayAoRmlsZVN5c3RlbU93bmVyc2hpcENoZWNrKQotICAgIEZJTEVfU1lTVEVNX0NIRUNLX09XTkVSU0hJUF9GSUxFTkFNRSgiY2Fzc2FuZHJhLmZzX293bmVyc2hpcF9maWxlbmFtZSIsIEZpbGVTeXN0ZW1Pd25lcnNoaXBDaGVjay5ERUZBVUxUX0ZTX09XTkVSU0hJUF9GSUxFTkFNRSksCi0gICAgQERlcHJlY2F0ZWQgLy8gc2hvdWxkIGJlIHJlbW92ZWQgaW4gZmF2b3Igb2YgZmxhZ3MgaW4gcmVsZXZhbnQgc3RhcnR1cCBjaGVjayAoRmlsZVN5c3RlbU93bmVyc2hpcENoZWNrKQotICAgIEZJTEVfU1lTVEVNX0NIRUNLX09XTkVSU0hJUF9UT0tFTihGaWxlU3lzdGVtT3duZXJzaGlwQ2hlY2suRklMRV9TWVNURU1fQ0hFQ0tfT1dORVJTSElQX1RPS0VOKSwKLSAgICAvLyBkZWZhdWx0IGhlYXJ0YmVhdGluZyBwZXJpb2QgaXMgMSBtaW51dGUKLSAgICBDSEVDS19EQVRBX1JFU1VSUkVDVElPTl9IRUFSVEJFQVRfUEVSSU9EKCJjaGVja19kYXRhX3Jlc3VycmVjdGlvbl9oZWFydGJlYXRfcGVyaW9kX21pbGxpIiwgIjYwMDAwIiksCi0KLSAgICAvLyBkZWZhdWx0cyB0byBmYWxzZSBmb3IgNC4xIGJ1dCBwbGFuIHRvIHN3aXRjaCB0byB0cnVlIGluIGEgbGF0ZXIgcmVsZWFzZQotICAgIC8vIHRoZSB0aGlua2luZyBpcyB0aGF0IGVudmlyb25tZW50cyBtYXkgbm90IHdvcmsgcmlnaHQgb2ZmIHRoZSBiYXQgc28gc2FmZXIgdG8gYWRkIHRoaXMgZmVhdHVyZSBkaXNhYmxlZCBieSBkZWZhdWx0Ci0gICAgQ09ORklHX0FMTE9XX1NZU1RFTV9QUk9QRVJUSUVTKCJjYXNzYW5kcmEuY29uZmlnLmFsbG93X3N5c3RlbV9wcm9wZXJ0aWVzIiwgImZhbHNlIiksCi0KLSAgICAvLyBwcm9wZXJ0aWVzIGZvciBkZWJ1Z2dpbmcgc2ltdWxhdG9yIEFTTSBvdXRwdXQKLSAgICBURVNUX1NJTVVMQVRPUl9QUklOVF9BU00oImNhc3NhbmRyYS50ZXN0LnNpbXVsYXRvci5wcmludF9hc20iLCAibm9uZSIpLAotICAgIFRFU1RfU0lNVUxBVE9SX1BSSU5UX0FTTV9UWVBFUygiY2Fzc2FuZHJhLnRlc3Quc2ltdWxhdG9yLnByaW50X2FzbV90eXBlcyIsICIiKSwKLSAgICBURVNUX1NJTVVMQVRPUl9MSVZFTkVTU19DSEVDSygiY2Fzc2FuZHJhLnRlc3Quc2ltdWxhdG9yLmxpdmVuZXNzY2hlY2siLCAidHJ1ZSIpLAotICAgIFRFU1RfU0lNVUxBVE9SX0RFQlVHKCJjYXNzYW5kcmEudGVzdC5zaW11bGF0b3IuZGVidWciLCAiZmFsc2UiKSwKLSAgICBURVNUX1NJTVVMQVRPUl9ERVRFUk1JTklTTV9DSEVDSygiY2Fzc2FuZHJhLnRlc3Quc2ltdWxhdG9yLmRldGVybWluaXNtY2hlY2siLCAibm9uZSIpLAotICAgIFRFU1RfSlZNX0RURVNUX0RJU0FCTEVfU1NMKCJjYXNzYW5kcmEudGVzdC5kaXNhYmxlX3NzbCIsICJmYWxzZSIpLAotCi0gICAgLy8gZGV0ZXJtaW5pc20gcHJvcGVydGllcyBmb3IgdGVzdGluZwotICAgIERFVEVSTUlOSVNNX1NTVEFCTEVfQ09NUFJFU1NJT05fREVGQVVMVCgiY2Fzc2FuZHJhLnNzdGFibGVfY29tcHJlc3Npb25fZGVmYXVsdCIsICJ0cnVlIiksCi0gICAgREVURVJNSU5JU01fQ09OU0lTVEVOVF9ESVJFQ1RPUllfTElTVElOR1MoImNhc3NhbmRyYS5jb25zaXN0ZW50X2RpcmVjdG9yeV9saXN0aW5ncyIsICJmYWxzZSIpLAotICAgIERFVEVSTUlOSVNNX1VOU0FGRV9VVUlEX05PREUoImNhc3NhbmRyYS51bnNhZmUuZGV0ZXJtaW5pc3RpY3V1aWRub2RlIiwgImZhbHNlIiksCi0gICAgRkFJTFVSRV9MT0dHSU5HX0lOVEVSVkFMX1NFQ09ORFMoImNhc3NhbmRyYS5yZXF1ZXN0X2ZhaWx1cmVfbG9nX2ludGVydmFsX3NlY29uZHMiLCAiNjAiKSwKLQotICAgIC8vIHByb3BlcnRpZXMgdG8gZGlzYWJsZSBjZXJ0YWluIGJlaGF2aW91cnMgZm9yIHRlc3RpbmcKLSAgICBESVNBQkxFX0dPU1NJUF9FTkRQT0lOVF9SRU1PVkFMKCJjYXNzYW5kcmEuZ29zc2lwLmRpc2FibGVfZW5kcG9pbnRfcmVtb3ZhbCIpLAotICAgIElHTk9SRV9NSVNTSU5HX05BVElWRV9GSUxFX0hJTlRTKCJjYXNzYW5kcmEucmVxdWlyZV9uYXRpdmVfZmlsZV9oaW50cyIsICJmYWxzZSIpLAotICAgIERJU0FCTEVfU1NUQUJMRV9BQ1RJVklUWV9UUkFDS0lORygiY2Fzc2FuZHJhLnNzdGFibGVfYWN0aXZpdHlfdHJhY2tpbmciLCAidHJ1ZSIpLAotICAgIFRFU1RfSUdOT1JFX1NJR0FSKCJjYXNzYW5kcmEudGVzdC5pZ25vcmVfc2lnYXIiLCAiZmFsc2UiKSwKLSAgICBQQVhPU19FWEVDVVRFX09OX1NFTEYoImNhc3NhbmRyYS5wYXhvcy51c2Vfc2VsZl9leGVjdXRpb24iLCAidHJ1ZSIpLAotCi0gICAgLyoqIHByb3BlcnR5IGZvciB0aGUgcmF0ZSBvZiB0aGUgc2NoZWR1bGVkIHRhc2sgdGhhdCBtb25pdG9ycyBkaXNrIHVzYWdlICovCi0gICAgRElTS19VU0FHRV9NT05JVE9SX0lOVEVSVkFMX01TKCJjYXNzYW5kcmEuZGlza191c2FnZS5tb25pdG9yX2ludGVydmFsX21zIiwgTG9uZy50b1N0cmluZyhUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDMwKSkpLAotCi0gICAgLyoqIHByb3BlcnR5IGZvciB0aGUgaW50ZXJ2YWwgb24gd2hpY2ggdGhlIHJlcGVhdGVkIGNsaWVudCB3YXJuaW5ncyBhbmQgZGlhZ25vc3RpYyBldmVudHMgYWJvdXQgZGlzayB1c2FnZSBhcmUgaWdub3JlZCAqLwotICAgIERJU0tfVVNBR0VfTk9USUZZX0lOVEVSVkFMX01TKCJjYXNzYW5kcmEuZGlza191c2FnZS5ub3RpZnlfaW50ZXJ2YWxfbXMiLCBMb25nLnRvU3RyaW5nKFRpbWVVbml0Lk1JTlVURVMudG9NaWxsaXMoMzApKSksCi0KLSAgICAvLyBmb3Igc3BlY2lmaWMgdGVzdHMKLSAgICBPUkdfQVBBQ0hFX0NBU1NBTkRSQV9DT05GX0NBU1NBTkRSQV9SRUxFVkFOVF9QUk9QRVJUSUVTX1RFU1QoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmYuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzVGVzdCIpLAotICAgIE9SR19BUEFDSEVfQ0FTU0FORFJBX0RCX1ZJUlRVQUxfU1lTVEVNX1BST1BFUlRJRVNfVEFCTEVfVEVTVCgib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbC5TeXN0ZW1Qcm9wZXJ0aWVzVGFibGVUZXN0IiksCi0KLSAgICAvKiogVXNlZCB3aGVuIHJ1bm5pbmcgaW4gQ2xpZW50IG1vZGUgYW5kIHRoZSBzeXN0ZW0gYW5kIHNjaGVtYSBrZXlzcGFjZXMgbmVlZCB0byBiZSBpbml0aWFsaXplZCBvdXRzaWRlIG9mIHRoZWlyIG5vcm1hbCBpbml0aWFsaXphdGlvbiBwYXRoICoqLwotICAgIEZPUkNFX0xPQURfTE9DQUxfS0VZU1BBQ0VTKCJjYXNzYW5kcmEuc2NoZW1hLmZvcmNlX2xvYWRfbG9jYWxfa2V5c3BhY2VzIiksCi0KLSAgICAvKiogV2hlbiBlbmFibGVkLCByZWN1cnNpdmUgZGlyZWN0b3J5IGRlbGV0aW9uIHdpbGwgYmUgZXhlY3V0ZWQgdXNpbmcgYSB1bml4IGNvbW1hbmQgYHJtIC1yZmAgaW5zdGVhZCBvZiB0cmF2ZXJzaW5nCi0gICAgICogYW5kIHJlbW92aW5nIGluZGl2aWR1YWwgZmlsZXMuIFRoaXMgaXMgbm93IHVzZWQgb25seSB0ZXN0cywgYnV0IGV2ZW50dWFsbHkgd2Ugd2lsbCBtYWtlIGl0IHRydWUgYnkgZGVmYXVsdC4qLwotICAgIFVTRV9OSVhfUkVDVVJTSVZFX0RFTEVURSgiY2Fzc2FuZHJhLnVzZV9uaXhfcmVjdXJzaXZlX2RlbGV0ZSIpLAotCi0gICAgLyoqIElmIHNldCwge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlfSBpcyBzaHV0ZG93biBhYnJ0dXB0bHkgd2l0aG91dCB3YWl0aW5nIGZvciBhbnl0aGluZy4KLSAgICAgKiBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiB1c2VkIGluIHVuaXQgdGVzdHMgYmVjdWFzZSB3ZSBuZXZlciByZXN0YXJ0IGEgbm9kZSB0aGVyZS4gVGhlIG9ubHkgbm9kZSBpcyBzdG9wb3BlZAotICAgICAqIHdoZW4gdGhlIEpWTSB0ZXJtaW5hdGVzLiBUaGVyZWZvcmUsIHdlIGNhbiB1c2Ugc3VjaCBvcHRpbWl6YXRpb24gYW5kIG5vdCB3YWl0IHVubmVjZXNzYXJpbHkuICovCi0gICAgTk9OX0dSQUNFRlVMX1NIVVRET1dOKCJjYXNzYW5kcmEudGVzdC5tZXNzYWdpbmdTZXJ2aWNlLm5vbkdyYWNlZnVsU2h1dGRvd24iKSwKLQorICAgIFNDSEVNQV9VUERBVEVfSEFORExFUl9GQUNUT1JZX0NMQVNTKCJjYXNzYW5kcmEuc2NoZW1hLnVwZGF0ZV9oYW5kbGVyX2ZhY3RvcnkuY2xhc3MiKSwKKyAgICBTRUFSQ0hfQ09OQ1VSUkVOQ1lfRkFDVE9SKCJjYXNzYW5kcmEuc2VhcmNoX2NvbmN1cnJlbmN5X2ZhY3RvciIsICIxIiksCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHNlZWRzIHJldHVybmVkIGJ5IGEgc2VlZCBwcm92aWRlciBiZWZvcmUgZW1taXR0aW5nIGEgd2FybmluZy4KKyAgICAgKiBBIGxhcmdlIHNlZWQgbGlzdCBtYXkgaW1wYWN0IGVmZmVjdGl2ZW5lc3Mgb2YgdGhlIHRoaXJkIGdvc3NpcCByb3VuZC4KKyAgICAgKiBUaGUgZGVmYXVsdCB1c2VkIGluIFNpbXBsZVNlZWRQcm92aWRlciBpcyAyMC4KKyAgICAgKi8KKyAgICBTRUVEX0NPVU5UX1dBUk5fVEhSRVNIT0xEKCJjYXNzYW5kcmEuc2VlZF9jb3VudF93YXJuX3RocmVzaG9sZCIpLAorICAgIFNFUklBTElaQVRJT05fRU1QVFlfVFlQRV9OT05FTVBUWV9CRUhBVklPUigiY2Fzc2FuZHJhLnNlcmlhbGl6YXRpb24uZW1wdHl0eXBlLm5vbmVtcHR5X2JlaGF2aW9yIiksCisgICAgU0VUX1NFUF9USFJFQURfTkFNRSgiY2Fzc2FuZHJhLnNldF9zZXBfdGhyZWFkX25hbWUiLCAidHJ1ZSIpLAorICAgIFNIVVRET1dOX0FOTk9VTkNFX0RFTEFZX0lOX01TKCJjYXNzYW5kcmEuc2h1dGRvd25fYW5ub3VuY2VfaW5fbXMiLCAiMjAwMCIpLAorICAgIFNJWkVfUkVDT1JERVJfSU5URVJWQUwoImNhc3NhbmRyYS5zaXplX3JlY29yZGVyX2ludGVydmFsIiwgIjMwMCIpLAorICAgIFNLSVBfUEFYT1NfUkVQQUlSX09OX1RPUE9MT0dZX0NIQU5HRSgiY2Fzc2FuZHJhLnNraXBfcGF4b3NfcmVwYWlyX29uX3RvcG9sb2d5X2NoYW5nZSIpLAorICAgIC8qKiBJZiBuZWNlc3NhcnkgZm9yIG9wZXJhdGlvbmFsIHB1cnBvc2VzLCBwZXJtaXQgY2VydGFpbiBrZXlzcGFjZXMgdG8gYmUgaWdub3JlZCBmb3IgcGF4b3MgdG9wb2xvZ3kgcmVwYWlycy4gKi8KKyAgICBTS0lQX1BBWE9TX1JFUEFJUl9PTl9UT1BPTE9HWV9DSEFOR0VfS0VZU1BBQ0VTKCJjYXNzYW5kcmEuc2tpcF9wYXhvc19yZXBhaXJfb25fdG9wb2xvZ3lfY2hhbmdlX2tleXNwYWNlcyIpLAorICAgIFNLSVBfUEFYT1NfUkVQQUlSX1ZFUlNJT05fVkFMSURBVElPTigiY2Fzc2FuZHJhLnNraXBfcGF4b3NfcmVwYWlyX3ZlcnNpb25fdmFsaWRhdGlvbiIpLAorICAgIFNLSVBfUEFYT1NfU1RBVEVfUkVCVUlMRCgiY2Fzc2FuZHJhLnNraXBfcGF4b3Nfc3RhdGVfcmVidWlsZCIpLAorICAgIC8qKiBzbmFwc2hvdHMgdHRsIGNsZWFudXAgaW5pdGlhbCBkZWxheSBpbiBzZWNvbmRzICovCisgICAgU05BUFNIT1RfQ0xFQU5VUF9JTklUSUFMX0RFTEFZX1NFQ09ORFMoImNhc3NhbmRyYS5zbmFwc2hvdC50dGxfY2xlYW51cF9pbml0aWFsX2RlbGF5X3NlY29uZHMiLCAiNSIpLAorICAgIC8qKiBzbmFwc2hvdHMgdHRsIGNsZWFudXAgcGVyaW9kIGluIHNlY29uZHMgKi8KKyAgICBTTkFQU0hPVF9DTEVBTlVQX1BFUklPRF9TRUNPTkRTKCJjYXNzYW5kcmEuc25hcHNob3QudHRsX2NsZWFudXBfcGVyaW9kX3NlY29uZHMiLCAiNjAiKSwKKyAgICAvKiogbWluaW11bSBhbGxvd2VkIFRUTCBmb3Igc25hcHNob3RzICovCisgICAgU05BUFNIT1RfTUlOX0FMTE9XRURfVFRMX1NFQ09ORFMoImNhc3NhbmRyYS5zbmFwc2hvdC5taW5fYWxsb3dlZF90dGxfc2Vjb25kcyIsICI2MCIpLAorICAgIFNTTF9FTkFCTEUoInNzbC5lbmFibGUiKSwKKyAgICBTU0xfU1RPUkFHRV9QT1JUKCJjYXNzYW5kcmEuc3NsX3N0b3JhZ2VfcG9ydCIpLAorICAgIFNTVEFCTEVfRk9STUFUX0RFRkFVTFQoImNhc3NhbmRyYS5zc3RhYmxlLmZvcm1hdC5kZWZhdWx0IiksCisgICAgU1RBUlRfR09TU0lQKCJjYXNzYW5kcmEuc3RhcnRfZ29zc2lwIiwgInRydWUiKSwKKyAgICBTVEFSVF9OQVRJVkVfVFJBTlNQT1JUKCJjYXNzYW5kcmEuc3RhcnRfbmF0aXZlX3RyYW5zcG9ydCIpLAorICAgIFNUT1JBR0VfRElSKCJjYXNzYW5kcmEuc3RvcmFnZWRpciIpLAorICAgIFNUT1JBR0VfSE9PSygiY2Fzc2FuZHJhLnN0b3JhZ2VfaG9vayIpLAorICAgIFNUT1JBR0VfUE9SVCgiY2Fzc2FuZHJhLnN0b3JhZ2VfcG9ydCIpLAorICAgIFNUUkVBTUlOR19ISVNUT0dSQU1fUk9VTkRfU0VDT05EUygiY2Fzc2FuZHJhLnN0cmVhbWluZ2hpc3RvZ3JhbS5yb3VuZHNlY29uZHMiLCAiNjAiKSwKKyAgICBTVFJFQU1JTkdfU0VTU0lPTl9QQVJBTExFTFRSQU5TRkVSUygiY2Fzc2FuZHJhLnN0cmVhbWluZy5zZXNzaW9uLnBhcmFsbGVsVHJhbnNmZXJzIiksCisgICAgU1RSRUFNX0hPT0soImNhc3NhbmRyYS5zdHJlYW1faG9vayIpLAorICAgIC8qKiBQbGF0Zm9ybSB3b3JkIHNpemUgc3VuLmFyY2guZGF0YS5tb2RlbC4gRXhhbXBsZXM6ICIzMiIsICI2NCIsICJ1bmtub3duIiovCisgICAgU1VOX0FSQ0hfREFUQV9NT0RFTCgic3VuLmFyY2guZGF0YS5tb2RlbCIpLAorICAgIFNVTl9KQVZBX0NPTU1BTkQoInN1bi5qYXZhLmNvbW1hbmQiLCAiIiksCisgICAgLyoqCisgICAgICogQ29udHJvbHMgdGhlIEpNWCBzZXJ2ZXIgdGhyZWFkcG9vbCBrZWFwLWFsaXZlIHRpbWUuCisgICAgICogU2hvdWxkIG9ubHkgYmUgc2V0IGJ5IGluLWp2bSBkdGVzdHMuCisgICAgICovCisgICAgU1VOX1JNSV9UUkFOU1BPUlRfVENQX1RIUkVBREtFRVBBTElWRVRJTUUoInN1bi5ybWkudHJhbnNwb3J0LnRjcC50aHJlYWRLZWVwQWxpdmVUaW1lIiksCisgICAgU1VOX1NUREVSUl9FTkNPRElORygic3VuLnN0ZGVyci5lbmNvZGluZyIpLAorICAgIFNVTl9TVERPVVRfRU5DT0RJTkcoInN1bi5zdGRvdXQuZW5jb2RpbmciKSwKKyAgICBTVVBFUlVTRVJfU0VUVVBfREVMQVlfTVMoImNhc3NhbmRyYS5zdXBlcnVzZXJfc2V0dXBfZGVsYXlfbXMiLCAiMTAwMDAiKSwKKyAgICBTWVNURU1fQVVUSF9ERUZBVUxUX1JGKCJjYXNzYW5kcmEuc3lzdGVtX2F1dGguZGVmYXVsdF9yZiIsICIxIiksCisgICAgU1lTVEVNX0RJU1RSSUJVVEVEX0RFRkFVTFRfUkYoImNhc3NhbmRyYS5zeXN0ZW1fZGlzdHJpYnV0ZWQuZGVmYXVsdF9yZiIsICIzIiksCisgICAgU1lTVEVNX1RSQUNFU19ERUZBVUxUX1JGKCJjYXNzYW5kcmEuc3lzdGVtX3RyYWNlcy5kZWZhdWx0X3JmIiwgIjIiKSwKKyAgICBURVNUX0JCRkFJTEhFTFBFUl9FTkFCTEVEKCJ0ZXN0LmJiZmFpbGhlbHBlci5lbmFibGVkIiksCisgICAgVEVTVF9CTE9CX1NIQVJFRF9TRUVEKCJjYXNzYW5kcmEudGVzdC5ibG9iLnNoYXJlZC5zZWVkIiksCisgICAgVEVTVF9CWVRFTUFOX1RSQU5TRk9STUFUSU9OU19ERUJVRygiY2Fzc2FuZHJhLnRlc3QuYnl0ZW1hbi50cmFuc2Zvcm1hdGlvbnMuZGVidWciKSwKKyAgICBURVNUX0NBU1NBTkRSQV9LRUVQQlJJRUZCUklFRigiY2Fzc2FuZHJhLmtlZXBCcmllZkJyaWVmIiksCisgICAgVEVTVF9DQVNTQU5EUkFfUkVMRVZBTlRfUFJPUEVSVElFUygib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZi5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXNUZXN0IiksCisgICAgLyoqIEEgcHJvcGVydHkgZm9yIHZhcmlvdXMgbWVjaGFuaXNtcyBmb3Igc3luY2luZyBmaWxlcyB0aGF0IG1ha2VzIGl0IHBvc3NpYmxlIGl0IGludGVyY2VwdCBhbmQgc2tpcCBzeW5jaW5nLiAqLworICAgIFRFU1RfQ0FTU0FORFJBX1NLSVBfU1lOQygiY2Fzc2FuZHJhLnNraXBfc3luYyIpLAorICAgIFRFU1RfQ0FTU0FORFJBX1NVSVRFTkFNRSgic3VpdGVuYW1lIiwgInN1aXRlbmFtZV9JU19VTkRFRklORUQiKSwKKyAgICBURVNUX0NBU1NBTkRSQV9URVNUVEFHKCJjYXNzYW5kcmEudGVzdHRhZyIsICJjYXNzYW5kcmEudGVzdHRhZ19JU19VTkRFRklORUQiKSwKKyAgICBURVNUX0NPTVBSRVNTSU9OKCJjYXNzYW5kcmEudGVzdC5jb21wcmVzc2lvbiIpLAorICAgIFRFU1RfQ09NUFJFU1NJT05fQUxHTygiY2Fzc2FuZHJhLnRlc3QuY29tcHJlc3Npb24uYWxnbyIsICJsejQiKSwKKyAgICBURVNUX0RFQlVHX1JFRl9DT1VOVCgiY2Fzc2FuZHJhLmRlYnVncmVmY291bnQiKSwKKyAgICBURVNUX0RSSVZFUl9DT05ORUNUSU9OX1RJTUVPVVRfTVMoImNhc3NhbmRyYS50ZXN0LmRyaXZlci5jb25uZWN0aW9uX3RpbWVvdXRfbXMiLCAiNTAwMCIpLAorICAgIFRFU1RfRFJJVkVSX1JFQURfVElNRU9VVF9NUygiY2Fzc2FuZHJhLnRlc3QuZHJpdmVyLnJlYWRfdGltZW91dF9tcyIsICIxMjAwMCIpLAorICAgIFRFU1RfRkFJTF9NVl9MT0NLU19DT1VOVCgiY2Fzc2FuZHJhLnRlc3QuZmFpbF9tdl9sb2Nrc19jb3VudCIsICIwIiksCisgICAgVEVTVF9GQUlMX1dSSVRFU19LUygiY2Fzc2FuZHJhLnRlc3QuZmFpbF93cml0ZXNfa3MiLCAiIiksCiAgICAgLyoqIEZsdXNoIGNoYW5nZXMgb2Yge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFLZXlzcGFjZX0gYWZ0ZXIgZWFjaCBzY2hlbWEgbW9kaWZpY2F0aW9uLiBJbiBwcm9kdWN0aW9uLAogICAgICAqIHdlIGFsd2F5cyBkbyB0aGF0LiBIb3dldmVyLCB0ZXN0cyB3aGljaCBkbyBub3QgcmVzdGFydCBub2RlcyBtYXkgZGlzYWJsZSB0aGlzIGZ1bmN0aW9uYWxpdHkgaW4gb3JkZXIgdG8gcnVuCiAgICAgICogZmFzdGVyLiBOb3RlIHRoYXQgdGhpcyBpcyBkaXNhYmxlZCBmb3IgdW5pdCB0ZXN0cyBidXQgaWYgYW4gaW5kaXZpZHVhbCB0ZXN0IHJlcXVpcmVzIHNjaGVtYSB0byBiZSBmbHVzaGVkLCBpdAogICAgICAqIGNhbiBiZSBhbHNvIGRvbmUgbWFudWFsbHkgZm9yIHRoYXQgcGFydGljdWxhciBjYXNlOiB7QGNvZGUgZmx1c2goU2NoZW1hQ29uc3RhbnRzLlNDSEVNQV9LRVlTUEFDRV9OQU1FKTt9LiAqLwotICAgIEZMVVNIX0xPQ0FMX1NDSEVNQV9DSEFOR0VTKCJjYXNzYW5kcmEudGVzdC5mbHVzaF9sb2NhbF9zY2hlbWFfY2hhbmdlcyIsICJ0cnVlIiksCisgICAgVEVTVF9GTFVTSF9MT0NBTF9TQ0hFTUFfQ0hBTkdFUygiY2Fzc2FuZHJhLnRlc3QuZmx1c2hfbG9jYWxfc2NoZW1hX2NoYW5nZXMiLCAidHJ1ZSIpLAorICAgIFRFU1RfSUdOT1JFX1NJR0FSKCJjYXNzYW5kcmEudGVzdC5pZ25vcmVfc2lnYXIiKSwKKyAgICBURVNUX0lOVkFMSURfTEVHQUNZX1NTVEFCTEVfUk9PVCgiaW52YWxpZC1sZWdhY3ktc3N0YWJsZS1yb290IiksCisgICAgVEVTVF9KVk1fRFRFU1RfRElTQUJMRV9TU0woImNhc3NhbmRyYS50ZXN0LmRpc2FibGVfc3NsIiksCisgICAgVEVTVF9MRUdBQ1lfU1NUQUJMRV9ST09UKCJsZWdhY3ktc3N0YWJsZS1yb290IiksCisgICAgVEVTVF9PUkdfQ0FGRklOSVRBU19PSENfU0VHTUVOVENPVU5UKCJvcmcuY2FmZmluaXRhcy5vaGMuc2VnbWVudENvdW50IiksCisgICAgVEVTVF9SRUFEX0lURVJBVElPTl9ERUxBWV9NUygiY2Fzc2FuZHJhLnRlc3QucmVhZF9pdGVyYXRpb25fZGVsYXlfbXMiLCAiMCIpLAorICAgIFRFU1RfUkVVU0VfUFJFUEFSRUQoImNhc3NhbmRyYS50ZXN0LnJldXNlX3ByZXBhcmVkIiwgInRydWUiKSwKKyAgICBURVNUX1JPV19DQUNIRV9TSVpFKCJjYXNzYW5kcmEudGVzdC5yb3dfY2FjaGVfc2l6ZSIpLAorICAgIFRFU1RfU0VSSUFMSVpBVElPTl9XUklURVMoImNhc3NhbmRyYS50ZXN0LXNlcmlhbGl6YXRpb24td3JpdGVzIiksCisgICAgVEVTVF9TSU1VTEFUT1JfREVCVUcoImNhc3NhbmRyYS50ZXN0LnNpbXVsYXRvci5kZWJ1ZyIpLAorICAgIFRFU1RfU0lNVUxBVE9SX0RFVEVSTUlOSVNNX0NIRUNLKCJjYXNzYW5kcmEudGVzdC5zaW11bGF0b3IuZGV0ZXJtaW5pc21jaGVjayIsICJub25lIiksCisgICAgVEVTVF9TSU1VTEFUT1JfTElWRU5FU1NfQ0hFQ0soImNhc3NhbmRyYS50ZXN0LnNpbXVsYXRvci5saXZlbmVzc2NoZWNrIiwgInRydWUiKSwKKyAgICAvKiogcHJvcGVydGllcyBmb3IgZGVidWdnaW5nIHNpbXVsYXRvciBBU00gb3V0cHV0ICovCisgICAgVEVTVF9TSU1VTEFUT1JfUFJJTlRfQVNNKCJjYXNzYW5kcmEudGVzdC5zaW11bGF0b3IucHJpbnRfYXNtIiwgIm5vbmUiKSwKKyAgICBURVNUX1NJTVVMQVRPUl9QUklOVF9BU01fQ0xBU1NFUygiY2Fzc2FuZHJhLnRlc3Quc2ltdWxhdG9yLnByaW50X2FzbV9jbGFzc2VzIiwgIiIpLAorICAgIFRFU1RfU0lNVUxBVE9SX1BSSU5UX0FTTV9PUFRTKCJjYXNzYW5kcmEudGVzdC5zaW11bGF0b3IucHJpbnRfYXNtX29wdHMiLCAiIiksCisgICAgVEVTVF9TSU1VTEFUT1JfUFJJTlRfQVNNX1RZUEVTKCJjYXNzYW5kcmEudGVzdC5zaW11bGF0b3IucHJpbnRfYXNtX3R5cGVzIiwgIiIpLAorICAgIFRFU1RfU1NUQUJMRV9GT1JNQVRfREVWRUxPUE1FTlQoImNhc3NhbmRyYS50ZXN0LnNzdGFibGVmb3JtYXRkZXZlbG9wbWVudCIpLAorICAgIFRFU1RfU1RSSUNUX0xDU19DSEVDS1MoImNhc3NhbmRyYS50ZXN0LnN0cmljdF9sY3NfY2hlY2tzIiksCisgICAgLyoqIFR1cm5zIHNvbWUgd2FybmluZ3MgaW50byBleGNlcHRpb25zIGZvciB0ZXN0aW5nLiAqLworICAgIFRFU1RfU1RSSUNUX1JVTlRJTUVfQ0hFQ0tTKCJjYXNzYW5kcmEuc3RyaWN0LnJ1bnRpbWUuY2hlY2tzIiksCisgICAgLyoqIE5vdCB0byBiZSB1c2VkIGluIHByb2R1Y3Rpb24sIHRoaXMgY2F1c2VzIGEgTmV0dHkgbG9nZ2luZyBoYW5kbGVyIHRvIGJlIGFkZGVkIHRvIHRoZSBwaXBlbGluZSwgd2hpY2ggd2lsbCB0aHJvdHRsZSBhIHN5c3RlbSB1bmRlciBhbnkgbm9ybWFsIGxvYWQuICovCisgICAgVEVTVF9VTlNBRkVfVkVSQk9TRV9ERUJVR19DTElFTlRfUFJPVE9DT0woImNhc3NhbmRyYS51bnNhZmVfdmVyYm9zZV9kZWJ1Z19jbGllbnRfcHJvdG9jb2wiKSwKKyAgICBURVNUX1VTRV9QUkVQQVJFRCgiY2Fzc2FuZHJhLnRlc3QudXNlX3ByZXBhcmVkIiwgInRydWUiKSwKKyAgICBURVNUX1VUSUxfQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlV0aWxBTExPV19UT09MX1JFSU5JVF9GT1JfVEVTVCIpLAorICAgIC8qKiBBY3RpdmF0ZSB3cml0ZSBzdXJ2ZXkgbW9kZS4gVGhlIG5vZGUgbm90IGJlY29taW5nIGFuIGFjdGl2ZSByaW5nIG1lbWJlciwgYW5kIHlvdSBtdXN0IHVzZSBKTVggU3RvcmFnZVNlcnZpY2UtPmpvaW5SaW5nKCkgdG8gZmluYWxpemUgdGhlIHJpbmcgam9pbmluZy4gKi8KKyAgICBURVNUX1dSSVRFX1NVUlZFWSgiY2Fzc2FuZHJhLndyaXRlX3N1cnZleSIpLAorICAgIFRPTEVSQVRFX1NTVEFCTEVfU0laRSgiY2Fzc2FuZHJhLnRvbGVyYXRlX3NzdGFibGVfc2l6ZSIpLAorICAgIFRSSUdHRVJTX0RJUigiY2Fzc2FuZHJhLnRyaWdnZXJzX2RpciIpLAorICAgIFRSVU5DQVRFX0JBTExPVF9NRVRBREFUQSgiY2Fzc2FuZHJhLnRydW5jYXRlX2JhbGxvdF9tZXRhZGF0YSIpLAorICAgIFRZUEVfVURUX0NPTkZMSUNUX0JFSEFWSU9SKCJjYXNzYW5kcmEudHlwZS51ZHQuY29uZmxpY3RfYmVoYXZpb3IiKSwKKyAgICBVREZfRVhFQ1VUT1JfVEhSRUFEX0tFRVBBTElWRV9NUygiY2Fzc2FuZHJhLnVkZl9leGVjdXRvcl90aHJlYWRfa2VlcGFsaXZlX21zIiwgIjMwMDAwIiksCisgICAgVU5TQUZFX1NZU1RFTSgiY2Fzc2FuZHJhLnVuc2FmZXN5c3RlbSIpLAorICAgIC8qKiBVc2VyJ3MgaG9tZSBkaXJlY3RvcnkuICovCisgICAgVVNFUl9IT01FKCJ1c2VyLmhvbWUiKSwKKyAgICAvKiogV2hlbiBlbmFibGVkLCByZWN1cnNpdmUgZGlyZWN0b3J5IGRlbGV0aW9uIHdpbGwgYmUgZXhlY3V0ZWQgdXNpbmcgYSB1bml4IGNvbW1hbmQgYHJtIC1yZmAgaW5zdGVhZCBvZiB0cmF2ZXJzaW5nCisgICAgICogYW5kIHJlbW92aW5nIGluZGl2aWR1YWwgZmlsZXMuIFRoaXMgaXMgbm93IHVzZWQgb25seSB0ZXN0cywgYnV0IGV2ZW50dWFsbHkgd2Ugd2lsbCBtYWtlIGl0IHRydWUgYnkgZGVmYXVsdC4qLworICAgIFVTRV9OSVhfUkVDVVJTSVZFX0RFTEVURSgiY2Fzc2FuZHJhLnVzZV9uaXhfcmVjdXJzaXZlX2RlbGV0ZSIpLAorICAgIC8qKiBHb3NzaXBlciBjb21wdXRlIGV4cGlyYXRpb24gdGltZW91dC4gRGVmYXVsdCB2YWx1ZSAzIGRheXMuICovCisgICAgVkVSWV9MT05HX1RJTUVfTVMoImNhc3NhbmRyYS52ZXJ5X2xvbmdfdGltZV9tcyIsICIyNTkyMDAwMDAiKSwKKyAgICBXQUlUX0ZPUl9UUkFDSU5HX0VWRU5UU19USU1FT1VUX1NFQ1MoImNhc3NhbmRyYS53YWl0X2Zvcl90cmFjaW5nX2V2ZW50c190aW1lb3V0X3NlY3MiLCAiMCIpOwogCi0gICAgOworICAgIHN0YXRpYworICAgIHsKKyAgICAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzW10gdmFsdWVzID0gQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLnZhbHVlcygpOworICAgICAgICBTZXQ8U3RyaW5nPiB2aXNpdGVkID0gbmV3IEhhc2hTZXQ8Pih2YWx1ZXMubGVuZ3RoKTsKKyAgICAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzIHByZXYgPSBudWxsOworICAgICAgICBmb3IgKENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyBuZXh0IDogdmFsdWVzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXZpc2l0ZWQuYWRkKG5leHQuZ2V0S2V5KCkpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlN5c3RlbSBwcm9wZXJ0aWVzIGhhdmUgZHVwbGljYXRlIGtleTogIiArIG5leHQuZ2V0S2V5KCkpOworICAgICAgICAgICAgaWYgKHByZXYgIT0gbnVsbCAmJiBuZXh0Lm5hbWUoKS5jb21wYXJlVG8ocHJldi5uYW1lKCkpIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFbnVtIGNvbnN0YW50cyBhcmUgbm90IGluIGFscGhhYmV0aWNhbCBvcmRlcjogIiArIHByZXYubmFtZSgpICsgIiBzaG91bGQgY29tZSBiZWZvcmUgIiArIG5leHQubmFtZSgpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmV2ID0gbmV4dDsKKyAgICAgICAgfQorICAgIH0KIAogICAgIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyhTdHJpbmcga2V5LCBTdHJpbmcgZGVmYXVsdFZhbCkKICAgICB7CkBAIC00MDUsMTMgKzU5MiwzMiBAQAogICAgICAgICByZXR1cm4gY29udmVydGVyLmNvbnZlcnQodmFsdWUpOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhATnVsbGFibGUgT2JqZWN0IHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQorICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIHZhbHVlOworICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKQorICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4udG9TdHJpbmcoKEJvb2xlYW4pIHZhbHVlKTsKKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTG9uZykKKyAgICAgICAgICAgIHJldHVybiBMb25nLnRvU3RyaW5nKChMb25nKSB2YWx1ZSk7CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpCisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZygoSW50ZWdlcikgdmFsdWUpOworICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEb3VibGUpCisgICAgICAgICAgICByZXR1cm4gRG91YmxlLnRvU3RyaW5nKChEb3VibGUpIHZhbHVlKTsKKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmxvYXQpCisgICAgICAgICAgICByZXR1cm4gRmxvYXQudG9TdHJpbmcoKEZsb2F0KSB2YWx1ZSk7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gdHlwZSAiICsgdmFsdWUuZ2V0Q2xhc3MoKSk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgdmFsdWUgaW50byBzeXN0ZW0gcHJvcGVydGllcy4KICAgICAgKiBAcGFyYW0gdmFsdWUgdG8gc2V0CiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3RyaW5nKFN0cmluZyB2YWx1ZSkKKyAgICBwdWJsaWMgU3RyaW5nIHNldFN0cmluZyhTdHJpbmcgdmFsdWUpCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiBTeXN0ZW0uc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00NDEsMzYgKzY0Nyw2MSBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHZhbHVlIGludG8gc3lzdGVtIHByb3BlcnRpZXMuCiAgICAgICogQHBhcmFtIHZhbHVlIHRvIHNldAorICAgICAqIEByZXR1cm4gUHJldmlvdXMgdmFsdWUgaWYgaXQgZXhpc3RzLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJvb2xlYW4oYm9vbGVhbiB2YWx1ZSkKKyAgICBwdWJsaWMgQm9vbGVhbiBzZXRCb29sZWFuKGJvb2xlYW4gdmFsdWUpCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoa2V5LCBCb29sZWFuLnRvU3RyaW5nKHZhbHVlKSk7CisgICAgICAgIFN0cmluZyBwcmV2ID0gU3lzdGVtLnNldFByb3BlcnR5KGtleSwgY29udmVydFRvU3RyaW5nKHZhbHVlKSk7CisgICAgICAgIHJldHVybiBwcmV2ID09IG51bGwgPyBudWxsIDogQk9PTEVBTl9DT05WRVJURVIuY29udmVydChwcmV2KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhlIHZhbHVlIHNldCBpbiB0aGUgc3lzdGVtIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyVmFsdWUoKQorICAgIHsKKyAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoa2V5KTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHN5c3RlbSBwcm9wZXJ0eSBhcyBhIGludC4KLSAgICAgKiBAcmV0dXJuIHN5c3RlbSBwcm9wZXJ0eSBpbnQgdmFsdWUgaWYgaXQgZXhpc3RzLCBkZWZhdWx0VmFsdWUgb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gU3lzdGVtIHByb3BlcnR5IHZhbHVlIGlmIGl0IGV4aXN0cywgZGVmYXVsdFZhbHVlIG90aGVyd2lzZS4gVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBubyBkZWZhdWx0IHZhbHVlIGlzIHNldC4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldEludCgpCiAgICAgewogICAgICAgICBTdHJpbmcgdmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoa2V5KTsKLQorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCAmJiBkZWZhdWx0VmFsID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiTWlzc2luZyBwcm9wZXJ0eSB2YWx1ZSBvciBkZWZhdWx0IHZhbHVlIGlzIG5vdCBzZXQ6ICIgKyBrZXkpOwogICAgICAgICByZXR1cm4gSU5URUdFUl9DT05WRVJURVIuY29udmVydCh2YWx1ZSA9PSBudWxsID8gZGVmYXVsdFZhbCA6IHZhbHVlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHN5c3RlbSBwcm9wZXJ0eSBhcyBhIGludC4KLSAgICAgKiBAcmV0dXJuIHN5c3RlbSBwcm9wZXJ0eSBpbnQgdmFsdWUgaWYgaXQgZXhpc3RzLCBkZWZhdWx0VmFsdWUgb3RoZXJ3aXNlLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3lzdGVtIHByb3BlcnR5IGFzIGEgbG9uZy4KKyAgICAgKiBAcmV0dXJuIFN5c3RlbSBwcm9wZXJ0eSB2YWx1ZSBpZiBpdCBleGlzdHMsIGRlZmF1bHRWYWx1ZSBvdGhlcndpc2UuIFRocm93cyBhbiBleGNlcHRpb24gaWYgbm8gZGVmYXVsdCB2YWx1ZSBpcyBzZXQuCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgZ2V0TG9uZygpCiAgICAgewogICAgICAgICBTdHJpbmcgdmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoa2V5KTsKLQorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCAmJiBkZWZhdWx0VmFsID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiTWlzc2luZyBwcm9wZXJ0eSB2YWx1ZSBvciBkZWZhdWx0IHZhbHVlIGlzIG5vdCBzZXQ6ICIgKyBrZXkpOwogICAgICAgICByZXR1cm4gTE9OR19DT05WRVJURVIuY29udmVydCh2YWx1ZSA9PSBudWxsID8gZGVmYXVsdFZhbCA6IHZhbHVlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHN5c3RlbSBwcm9wZXJ0eSBhcyBhIGludC4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHN5c3RlbSBwcm9wZXJ0eSBhcyBhIGxvbmcuCisgICAgICogQHJldHVybiBzeXN0ZW0gcHJvcGVydHkgbG9uZyB2YWx1ZSBpZiBpdCBleGlzdHMsIGRlZmF1bHRWYWx1ZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TG9uZyhsb25nIG92ZXJyaWRlRGVmYXVsdFZhbHVlKQorICAgIHsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gU3lzdGVtLmdldFByb3BlcnR5KGtleSk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlRGVmYXVsdFZhbHVlOworCisgICAgICAgIHJldHVybiBMT05HX0NPTlZFUlRFUi5jb252ZXJ0KHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHN5c3RlbSBwcm9wZXJ0eSBhcyBhbiBpbnQuCiAgICAgICogQHJldHVybiBzeXN0ZW0gcHJvcGVydHkgaW50IHZhbHVlIGlmIGl0IGV4aXN0cywgb3ZlcnJpZGVEZWZhdWx0VmFsdWUgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0SW50KGludCBvdmVycmlkZURlZmF1bHRWYWx1ZSkKQEAgLTQ4NSwxOSArNzE2LDc1IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgdmFsdWUgaW50byBzeXN0ZW0gcHJvcGVydGllcy4KICAgICAgKiBAcGFyYW0gdmFsdWUgdG8gc2V0CisgICAgICogQHJldHVybiBQcmV2aW91cyB2YWx1ZSBvciBudWxsIGlmIGl0IGRpZCBub3QgaGF2ZSBvbmUuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW50KGludCB2YWx1ZSkKKyAgICBwdWJsaWMgSW50ZWdlciBzZXRJbnQoaW50IHZhbHVlKQogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KGtleSwgSW50ZWdlci50b1N0cmluZyh2YWx1ZSkpOworICAgICAgICBTdHJpbmcgcHJldiA9IFN5c3RlbS5zZXRQcm9wZXJ0eShrZXksIGNvbnZlcnRUb1N0cmluZyh2YWx1ZSkpOworICAgICAgICByZXR1cm4gcHJldiA9PSBudWxsID8gbnVsbCA6IElOVEVHRVJfQ09OVkVSVEVSLmNvbnZlcnQocHJldik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgaW50byBzeXN0ZW0gcHJvcGVydGllcy4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdG8gc2V0CisgICAgICogQHJldHVybiBQcmV2aW91cyB2YWx1ZSBvciBudWxsIGlmIGl0IGRpZCBub3QgaGF2ZSBvbmUuCisgICAgICovCisgICAgcHVibGljIExvbmcgc2V0TG9uZyhsb25nIHZhbHVlKQorICAgIHsKKyAgICAgICAgU3RyaW5nIHByZXYgPSBTeXN0ZW0uc2V0UHJvcGVydHkoa2V5LCBjb252ZXJ0VG9TdHJpbmcodmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIHByZXYgPT0gbnVsbCA/IG51bGwgOiBMT05HX0NPTlZFUlRFUi5jb252ZXJ0KHByZXYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3lzdGVtIHByb3BlcnR5IGFzIGEgZW51bSwgY2FsbGluZyB7QGxpbmsgU3RyaW5nI3RvVXBwZXJDYXNlKCl9IGZpcnN0LgorICAgICAqCisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0byByZXR1cm4gd2hlbiBub3QgZGVmaW5lZAorICAgICAqIEBwYXJhbSA8VD4gdHlwZQorICAgICAqIEByZXR1cm4gZW51bSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyA8VCBleHRlbmRzIEVudW08VD4+IFQgZ2V0RW51bShUIGRlZmF1bHRWYWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRFbnVtKHRydWUsIGRlZmF1bHRWYWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzeXN0ZW0gcHJvcGVydHkgYXMgYSBlbnVtLCBvcHRpb25hbGx5IGNhbGxpbmcge0BsaW5rIFN0cmluZyN0b1VwcGVyQ2FzZSgpfSBmaXJzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0b1VwcGVyY2FzZSBiZWZvcmUgY29udmVydGluZyB0byBlbnVtCisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0byByZXR1cm4gd2hlbiBub3QgZGVmaW5lZAorICAgICAqIEBwYXJhbSA8VD4gdHlwZQorICAgICAqIEByZXR1cm4gZW51bSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyA8VCBleHRlbmRzIEVudW08VD4+IFQgZ2V0RW51bShib29sZWFuIHRvVXBwZXJjYXNlLCBUIGRlZmF1bHRWYWx1ZSkKKyAgICB7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShrZXkpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIHJldHVybiBFbnVtLnZhbHVlT2YoZGVmYXVsdFZhbHVlLmdldERlY2xhcmluZ0NsYXNzKCksIHRvVXBwZXJjYXNlID8gdmFsdWUudG9VcHBlckNhc2UoKSA6IHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHN5c3RlbSBwcm9wZXJ0eSBhcyBhbiBlbnVtLCBvcHRpb25hbGx5IGNhbGxpbmcge0BsaW5rIFN0cmluZyN0b1VwcGVyQ2FzZSgpfSBmaXJzdC4KKyAgICAgKiBJZiB0aGUgdmFsdWUgaXMgbWlzc2luZywgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcHJvcGVydHkgaXMgdXNlZAorICAgICAqCisgICAgICogQHBhcmFtIHRvVXBwZXJjYXNlIGJlZm9yZSBjb252ZXJ0aW5nIHRvIGVudW0KKyAgICAgKiBAcGFyYW0gZW51bUNsYXNzIGVudW1lcmF0aW9uIGNsYXNzCisgICAgICogQHBhcmFtIDxUPiB0eXBlCisgICAgICogQHJldHVybiBlbnVtIHZhbHVlCisgICAgICovCisgICAgcHVibGljIDxUIGV4dGVuZHMgRW51bTxUPj4gVCBnZXRFbnVtKGJvb2xlYW4gdG9VcHBlcmNhc2UsIENsYXNzPFQ+IGVudW1DbGFzcykKKyAgICB7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShrZXksIGRlZmF1bHRWYWwpOworICAgICAgICByZXR1cm4gRW51bS52YWx1ZU9mKGVudW1DbGFzcywgdG9VcHBlcmNhc2UgPyB2YWx1ZS50b1VwcGVyQ2FzZSgpIDogdmFsdWUpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHZhbHVlIGludG8gc3lzdGVtIHByb3BlcnRpZXMuCiAgICAgICogQHBhcmFtIHZhbHVlIHRvIHNldAogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvbmcobG9uZyB2YWx1ZSkKKyAgICBwdWJsaWMgdm9pZCBzZXRFbnVtKEVudW08Pz4gdmFsdWUpCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoa2V5LCBMb25nLnRvU3RyaW5nKHZhbHVlKSk7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlLm5hbWUoKSk7CiAgICAgfQogCiAgICAgcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eUNvbnZlcnRlcjxUPgpAQCAtNTMxLDcgKzgxOCw3IEBACiAgICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKICAgICAgICAgewogICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiSW52YWxpZCB2YWx1ZSBmb3Igc3lzdGVtIHByb3BlcnR5OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGludGVnZXIgdmFsdWUgYnV0IGdvdCAnJXMnIiwgdmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGxvbmcgdmFsdWUgYnV0IGdvdCAnJXMnIiwgdmFsdWUpKTsKICAgICAgICAgfQogICAgIH07CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9Db25maWcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9Db25maWcuamF2YQppbmRleCA4YTU5Y2EyLi42ZTVmODczIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvQ29uZmlnLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0NvbmZpZy5qYXZhCkBAIC0yMSwyNyArMjEsMzEgQEAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKLQogaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcjsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7Ci0KIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXVkaXQuQXVkaXRMb2dPcHRpb25zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbnNpc3RlbmN5TGV2ZWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZnFsLkZ1bGxRdWVyeUxvZ2dlck9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0YXJ0dXBDaGVja3MuU3RhcnR1cENoZWNrVHlwZTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkFVVE9DT01QQUNUSU9OX09OX1NUQVJUVVBfRU5BQkxFRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5GSUxFX0NBQ0hFX0VOQUJMRUQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU0tJUF9QQVhPU19SRVBBSVJfT05fVE9QT0xPR1lfQ0hBTkdFOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlNLSVBfUEFYT1NfUkVQQUlSX09OX1RPUE9MT0dZX0NIQU5HRV9LRVlTUEFDRVM7CisKIC8qKgogICogQSBjbGFzcyB0aGF0IGNvbnRhaW5zIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIGNhc3NhbmRyYSBub2RlIGl0IHJ1bnMgd2l0aGluLgogICoKQEAgLTE2MCw2ICsxNjQsOCBAQAogICAgIEBSZXBsYWNlcyhvbGROYW1lID0gInNsb3dfcXVlcnlfbG9nX3RpbWVvdXRfaW5fbXMiLCBjb252ZXJ0ZXIgPSBDb252ZXJ0ZXJzLk1JTExJU19EVVJBVElPTl9MT05HLCBkZXByZWNhdGVkID0gdHJ1ZSkKICAgICBwdWJsaWMgdm9sYXRpbGUgRHVyYXRpb25TcGVjLkxvbmdNaWxsaXNlY29uZHNCb3VuZCBzbG93X3F1ZXJ5X2xvZ190aW1lb3V0ID0gbmV3IER1cmF0aW9uU3BlYy5Mb25nTWlsbGlzZWNvbmRzQm91bmQoIjUwMG1zIik7CiAKKyAgICBwdWJsaWMgdm9sYXRpbGUgRHVyYXRpb25TcGVjLkxvbmdNaWxsaXNlY29uZHNCb3VuZCBzdHJlYW1fdHJhbnNmZXJfdGFza190aW1lb3V0ID0gbmV3IER1cmF0aW9uU3BlYy5Mb25nTWlsbGlzZWNvbmRzQm91bmQoIjEyaCIpOworCiAgICAgcHVibGljIHZvbGF0aWxlIGRvdWJsZSBwaGlfY29udmljdF90aHJlc2hvbGQgPSA4LjA7CiAKICAgICBwdWJsaWMgaW50IGNvbmN1cnJlbnRfcmVhZHMgPSAzMjsKQEAgLTI2Nyw2ICsyNzMsOCBAQAogICAgIHB1YmxpYyBpbnQgbmF0aXZlX3RyYW5zcG9ydF9tYXhfdGhyZWFkcyA9IDEyODsKICAgICBAUmVwbGFjZXMob2xkTmFtZSA9ICJuYXRpdmVfdHJhbnNwb3J0X21heF9mcmFtZV9zaXplX2luX21iIiwgY29udmVydGVyID0gQ29udmVydGVycy5NRUJJQllURVNfREFUQV9TVE9SQUdFX0lOVCwgZGVwcmVjYXRlZCA9IHRydWUpCiAgICAgcHVibGljIERhdGFTdG9yYWdlU3BlYy5JbnRNZWJpYnl0ZXNCb3VuZCBuYXRpdmVfdHJhbnNwb3J0X21heF9mcmFtZV9zaXplID0gbmV3IERhdGFTdG9yYWdlU3BlYy5JbnRNZWJpYnl0ZXNCb3VuZCgiMTZNaUIiKTsKKyAgICAvKiogZG8gYmNyeXB0IGhhc2hpbmcgaW4gYSBsaW1pdGVkIHBvb2wgdG8gcHJldmVudCBjcHUgbG9hZCBzcGlrZXM7IG5vdGU6IGFueSB2YWx1ZSA8IDEgd2lsbCBiZSBzZXQgdG8gMSBvbiBpbml0ICoqLworICAgIHB1YmxpYyBpbnQgbmF0aXZlX3RyYW5zcG9ydF9tYXhfYXV0aF90aHJlYWRzID0gNDsKICAgICBwdWJsaWMgdm9sYXRpbGUgbG9uZyBuYXRpdmVfdHJhbnNwb3J0X21heF9jb25jdXJyZW50X2Nvbm5lY3Rpb25zID0gLTFMOwogICAgIHB1YmxpYyB2b2xhdGlsZSBsb25nIG5hdGl2ZV90cmFuc3BvcnRfbWF4X2NvbmN1cnJlbnRfY29ubmVjdGlvbnNfcGVyX2lwID0gLTFMOwogICAgIHB1YmxpYyBib29sZWFuIG5hdGl2ZV90cmFuc3BvcnRfZmx1c2hfaW5fYmF0Y2hlc19sZWdhY3kgPSBmYWxzZTsKQEAgLTMwNyw3ICszMTUsNyBAQAogCiAgICAgLyogaWYgdGhlIHNpemUgb2YgY29sdW1ucyBvciBzdXBlci1jb2x1bW5zIGFyZSBtb3JlIHRoYW4gdGhpcywgaW5kZXhpbmcgd2lsbCBraWNrIGluICovCiAgICAgQFJlcGxhY2VzKG9sZE5hbWUgPSAiY29sdW1uX2luZGV4X3NpemVfaW5fa2IiLCBjb252ZXJ0ZXIgPSBDb252ZXJ0ZXJzLktJQklCWVRFU19EQVRBU1RPUkFHRSwgZGVwcmVjYXRlZCA9IHRydWUpCi0gICAgcHVibGljIHZvbGF0aWxlIERhdGFTdG9yYWdlU3BlYy5JbnRLaWJpYnl0ZXNCb3VuZCBjb2x1bW5faW5kZXhfc2l6ZSA9IG5ldyBEYXRhU3RvcmFnZVNwZWMuSW50S2liaWJ5dGVzQm91bmQoIjY0S2lCIik7CisgICAgcHVibGljIHZvbGF0aWxlIERhdGFTdG9yYWdlU3BlYy5JbnRLaWJpYnl0ZXNCb3VuZCBjb2x1bW5faW5kZXhfc2l6ZTsKICAgICBAUmVwbGFjZXMob2xkTmFtZSA9ICJjb2x1bW5faW5kZXhfY2FjaGVfc2l6ZV9pbl9rYiIsIGNvbnZlcnRlciA9IENvbnZlcnRlcnMuS0lCSUJZVEVTX0RBVEFTVE9SQUdFLCBkZXByZWNhdGVkID0gdHJ1ZSkKICAgICBwdWJsaWMgdm9sYXRpbGUgRGF0YVN0b3JhZ2VTcGVjLkludEtpYmlieXRlc0JvdW5kIGNvbHVtbl9pbmRleF9jYWNoZV9zaXplID0gbmV3IERhdGFTdG9yYWdlU3BlYy5JbnRLaWJpYnl0ZXNCb3VuZCgiMktpQiIpOwogICAgIEBSZXBsYWNlcyhvbGROYW1lID0gImJhdGNoX3NpemVfd2Fybl90aHJlc2hvbGRfaW5fa2IiLCBjb252ZXJ0ZXIgPSBDb252ZXJ0ZXJzLktJQklCWVRFU19EQVRBU1RPUkFHRSwgZGVwcmVjYXRlZCA9IHRydWUpCkBAIC0zMTksMTUgKzMyNywyMiBAQAogICAgIHB1YmxpYyB2b2xhdGlsZSBJbnRlZ2VyIGNvbmN1cnJlbnRfY29tcGFjdG9yczsKICAgICBAUmVwbGFjZXMob2xkTmFtZSA9ICJjb21wYWN0aW9uX3Rocm91Z2hwdXRfbWJfcGVyX3NlYyIsIGNvbnZlcnRlciA9IENvbnZlcnRlcnMuTUVCSUJZVEVTX1BFUl9TRUNPTkRfREFUQV9SQVRFLCBkZXByZWNhdGVkID0gdHJ1ZSkKICAgICBwdWJsaWMgdm9sYXRpbGUgRGF0YVJhdGVTcGVjLkxvbmdCeXRlc1BlclNlY29uZEJvdW5kIGNvbXBhY3Rpb25fdGhyb3VnaHB1dCA9IG5ldyBEYXRhUmF0ZVNwZWMuTG9uZ0J5dGVzUGVyU2Vjb25kQm91bmQoIjY0TWlCL3MiKTsKKyAgICBARGVwcmVjYXRlZAogICAgIEBSZXBsYWNlcyhvbGROYW1lID0gImNvbXBhY3Rpb25fbGFyZ2VfcGFydGl0aW9uX3dhcm5pbmdfdGhyZXNob2xkX21iIiwgY29udmVydGVyID0gQ29udmVydGVycy5NRUJJQllURVNfREFUQV9TVE9SQUdFX0lOVCwgZGVwcmVjYXRlZCA9IHRydWUpCiAgICAgcHVibGljIHZvbGF0aWxlIERhdGFTdG9yYWdlU3BlYy5JbnRNZWJpYnl0ZXNCb3VuZCBjb21wYWN0aW9uX2xhcmdlX3BhcnRpdGlvbl93YXJuaW5nX3RocmVzaG9sZCA9IG5ldyBEYXRhU3RvcmFnZVNwZWMuSW50TWViaWJ5dGVzQm91bmQoIjEwME1pQiIpOwogICAgIEBSZXBsYWNlcyhvbGROYW1lID0gIm1pbl9mcmVlX3NwYWNlX3Blcl9kcml2ZV9pbl9tYiIsIGNvbnZlcnRlciA9IENvbnZlcnRlcnMuTUVCSUJZVEVTX0RBVEFfU1RPUkFHRV9JTlQsIGRlcHJlY2F0ZWQgPSB0cnVlKQogICAgIHB1YmxpYyBEYXRhU3RvcmFnZVNwZWMuSW50TWViaWJ5dGVzQm91bmQgbWluX2ZyZWVfc3BhY2VfcGVyX2RyaXZlID0gbmV3IERhdGFTdG9yYWdlU3BlYy5JbnRNZWJpYnl0ZXNCb3VuZCgiNTBNaUIiKTsKICAgICBwdWJsaWMgdm9sYXRpbGUgSW50ZWdlciBjb21wYWN0aW9uX3RvbWJzdG9uZV93YXJuaW5nX3RocmVzaG9sZCA9IDEwMDAwMDsKIAorICAgIC8vIGZyYWN0aW9uIG9mIGZyZWUgZGlzayBzcGFjZSBhdmFpbGFibGUgZm9yIGNvbXBhY3Rpb24gYWZ0ZXIgbWluIGZyZWUgc3BhY2UgaXMgc3VidHJhY3RlZAorICAgIHB1YmxpYyB2b2xhdGlsZSBEb3VibGUgbWF4X3NwYWNlX3VzYWJsZV9mb3JfY29tcGFjdGlvbnNfaW5fcGVyY2VudGFnZSA9IC45NTsKKwogICAgIHB1YmxpYyB2b2xhdGlsZSBpbnQgY29uY3VycmVudF9tYXRlcmlhbGl6ZWRfdmlld19idWlsZGVycyA9IDE7CiAgICAgcHVibGljIHZvbGF0aWxlIGludCByZWplY3RfcmVwYWlyX2NvbXBhY3Rpb25fdGhyZXNob2xkID0gSW50ZWdlci5NQVhfVkFMVUU7CiAKKyAgICAvLyBUaGUgbnVtYmVyIG9mIGV4ZWN1dG9ycyB0byB1c2UgZm9yIGJ1aWxkaW5nIHNlY29uZGFyeSBpbmRleGVzCisgICAgcHVibGljIGludCBjb25jdXJyZW50X2luZGV4X2J1aWxkZXJzID0gMjsKKwogICAgIC8qKgogICAgICAqIEBkZXByZWNhdGVkIHJldHJ5IHN1cHBvcnQgcmVtb3ZlZCBvbiBDQVNTQU5EUkEtMTA5OTIKICAgICAgKi8KQEAgLTM0NCw2ICszNTksMTQgQEAKIAogICAgIHB1YmxpYyBTdHJpbmdbXSBkYXRhX2ZpbGVfZGlyZWN0b3JpZXMgPSBuZXcgU3RyaW5nWzBdOwogCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTU1RhYmxlQ29uZmlnCisgICAgeworICAgICAgICBwdWJsaWMgU3RyaW5nIHNlbGVjdGVkX2Zvcm1hdCA9IEJpZ0Zvcm1hdC5OQU1FOworICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgTWFwPFN0cmluZywgU3RyaW5nPj4gZm9ybWF0ID0gbmV3IEhhc2hNYXA8PigpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBTU1RhYmxlQ29uZmlnIHNzdGFibGUgPSBuZXcgU1NUYWJsZUNvbmZpZygpOworCiAgICAgLyoqCiAgICAgICogVGhlIGRpcmVjdG9yeSB0byB1c2UgZm9yIHN0b3JpbmcgdGhlIHN5c3RlbSBrZXlzcGFjZXMgZGF0YS4KICAgICAgKiBJZiB1bnNwZWNpZmllZCB0aGUgZGF0YSB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgZmlyc3Qgb2YgdGhlIGRhdGFfZmlsZV9kaXJlY3Rvcmllcy4KQEAgLTM4Myw2ICs0MDYsOSBAQAogICAgIC8vIFdoZW4gdHJ1ZSwgbmV3IENEQyBtdXRhdGlvbnMgYXJlIHJlamVjdGVkL2Jsb2NrZWQgd2hlbiByZWFjaGluZyBtYXggQ0RDIHN0b3JhZ2UuCiAgICAgLy8gV2hlbiBmYWxzZSwgbmV3IENEQyBtdXRhdGlvbnMgY2FuIGFsd2F5cyBiZSBhZGRlZC4gQnV0IGl0IHdpbGwgcmVtb3ZlIHRoZSBvbGRlc3QgQ0RDIGNvbW1pdCBsb2cgc2VnbWVudCBvbiBmdWxsLgogICAgIHB1YmxpYyB2b2xhdGlsZSBib29sZWFuIGNkY19ibG9ja193cml0ZXMgPSB0cnVlOworICAgIC8vIFdoZW4gdHJ1ZSwgQ0RDIGRhdGEgaW4gU1NUYWJsZSBnbyB0aHJvdWdoIGNvbW1pdCBsb2dzIGR1cmluZyBpbnRlcm5vZGVzIHN0cmVhbWluZywgZS5nLiByZXBhaXIKKyAgICAvLyBXaGVuIGZhbHNlLCBpdCBiZWhhdmVzIHRoZSBzYW1lIGFzIG5vcm1hbCBzdHJlYW1pbmcuCisgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gY2RjX29uX3JlcGFpcl9lbmFibGVkID0gdHJ1ZTsKICAgICBwdWJsaWMgU3RyaW5nIGNkY19yYXdfZGlyZWN0b3J5OwogICAgIEBSZXBsYWNlcyhvbGROYW1lID0gImNkY190b3RhbF9zcGFjZV9pbl9tYiIsIGNvbnZlcnRlciA9IENvbnZlcnRlcnMuTUVCSUJZVEVTX0RBVEFfU1RPUkFHRV9JTlQsIGRlcHJlY2F0ZWQgPSB0cnVlKQogICAgIHB1YmxpYyBEYXRhU3RvcmFnZVNwZWMuSW50TWViaWJ5dGVzQm91bmQgY2RjX3RvdGFsX3NwYWNlID0gbmV3IERhdGFTdG9yYWdlU3BlYy5JbnRNZWJpYnl0ZXNCb3VuZCgiME1pQiIpOwpAQCAtNDIwLDYgKzQ0Niw3IEBACiAKICAgICBwdWJsaWMgUGFyYW1ldGVyaXplZENsYXNzIGhpbnRzX2NvbXByZXNzaW9uOwogICAgIHB1YmxpYyB2b2xhdGlsZSBib29sZWFuIGF1dG9faGludHNfY2xlYW51cF9lbmFibGVkID0gZmFsc2U7CisgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gdHJhbnNmZXJfaGludHNfb25fZGVjb21taXNzaW9uID0gdHJ1ZTsKIAogICAgIHB1YmxpYyB2b2xhdGlsZSBib29sZWFuIGluY3JlbWVudGFsX2JhY2t1cHMgPSBmYWxzZTsKICAgICBwdWJsaWMgYm9vbGVhbiB0cmlja2xlX2ZzeW5jID0gZmFsc2U7CkBAIC00NjQsNyArNDkxLDcgQEAKICAgICBAUmVwbGFjZXMob2xkTmFtZSA9ICJmaWxlX2NhY2hlX3NpemVfaW5fbWIiLCBjb252ZXJ0ZXIgPSBDb252ZXJ0ZXJzLk1FQklCWVRFU19EQVRBX1NUT1JBR0VfSU5ULCBkZXByZWNhdGVkID0gdHJ1ZSkKICAgICBwdWJsaWMgRGF0YVN0b3JhZ2VTcGVjLkludE1lYmlieXRlc0JvdW5kIGZpbGVfY2FjaGVfc2l6ZTsKIAotICAgIHB1YmxpYyBib29sZWFuIGZpbGVfY2FjaGVfZW5hYmxlZCA9IEJvb2xlYW4uZ2V0Qm9vbGVhbigiY2Fzc2FuZHJhLmZpbGVfY2FjaGVfZW5hYmxlZCIpOworICAgIHB1YmxpYyBib29sZWFuIGZpbGVfY2FjaGVfZW5hYmxlZCA9IEZJTEVfQ0FDSEVfRU5BQkxFRC5nZXRCb29sZWFuKCk7CiAKICAgICAvKioKICAgICAgKiBCZWNhdXNlIG9mIHRoZSBjdXJyZW50IHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuQnVmZmVyUG9vbH0gc2xhYiBzaXplcyBvZiA2NCBLaUIsIHdlCkBAIC01NTIsNiArNTc5LDggQEAKIAogICAgIEBSZXBsYWNlcyhvbGROYW1lID0gImVuYWJsZV91c2VyX2RlZmluZWRfZnVuY3Rpb25zIiwgY29udmVydGVyID0gQ29udmVydGVycy5JREVOVElUWSwgZGVwcmVjYXRlZCA9IHRydWUpCiAgICAgcHVibGljIGJvb2xlYW4gdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkID0gZmFsc2U7CisKKyAgICBARGVwcmVjYXRlZAogICAgIEBSZXBsYWNlcyhvbGROYW1lID0gImVuYWJsZV9zY3JpcHRlZF91c2VyX2RlZmluZWRfZnVuY3Rpb25zIiwgY29udmVydGVyID0gQ29udmVydGVycy5JREVOVElUWSwgZGVwcmVjYXRlZCA9IHRydWUpCiAgICAgcHVibGljIGJvb2xlYW4gc2NyaXB0ZWRfdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkID0gZmFsc2U7CiAKQEAgLTU5NSw2ICs2MjQsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGFsbG93X2V4dHJhX2luc2VjdXJlX3VkZnMgPSBmYWxzZTsKIAorICAgIHB1YmxpYyBib29sZWFuIGR5bmFtaWNfZGF0YV9tYXNraW5nX2VuYWJsZWQgPSBmYWxzZTsKKwogICAgIC8qKgogICAgICAqIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIGEgd2FybmluZyB3aWxsIGJlIGVtaXR0ZWQgdG8gdGhlIGxvZyBhbmQgdG8gdGhlIGNsaWVudCB0aGF0IGEgVURGIHJ1bnMgdG9vIGxvbmcuCiAgICAgICogKE9ubHkgdmFsaWQsIGlmIHVzZXJfZGVmaW5lZF9mdW5jdGlvbnNfdGhyZWFkc19lbmFibGVkPT10cnVlKQpAQCAtNjUzLDYgKzY4NCw4IEBACiAgICAgcHVibGljIHZvbGF0aWxlIGludCBtYXhfY29uY3VycmVudF9hdXRvbWF0aWNfc3N0YWJsZV91cGdyYWRlcyA9IDE7CiAgICAgcHVibGljIGJvb2xlYW4gc3RyZWFtX2VudGlyZV9zc3RhYmxlcyA9IHRydWU7CiAKKyAgICBwdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiBza2lwX3N0cmVhbV9kaXNrX3NwYWNlX2NoZWNrID0gZmFsc2U7CisKICAgICBwdWJsaWMgdm9sYXRpbGUgQXVkaXRMb2dPcHRpb25zIGF1ZGl0X2xvZ2dpbmdfb3B0aW9ucyA9IG5ldyBBdWRpdExvZ09wdGlvbnMoKTsKICAgICBwdWJsaWMgdm9sYXRpbGUgRnVsbFF1ZXJ5TG9nZ2VyT3B0aW9ucyBmdWxsX3F1ZXJ5X2xvZ2dpbmdfb3B0aW9ucyA9IG5ldyBGdWxsUXVlcnlMb2dnZXJPcHRpb25zKCk7CiAKQEAgLTc3NCw3ICs4MDcsNyBAQAogICAgIHB1YmxpYyB2b2xhdGlsZSBib29sZWFuIGNoZWNrX2Zvcl9kdXBsaWNhdGVfcm93c19kdXJpbmdfcmVhZHMgPSB0cnVlOwogICAgIHB1YmxpYyB2b2xhdGlsZSBib29sZWFuIGNoZWNrX2Zvcl9kdXBsaWNhdGVfcm93c19kdXJpbmdfY29tcGFjdGlvbiA9IHRydWU7CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBhdXRvY29tcGFjdGlvbl9vbl9zdGFydHVwX2VuYWJsZWQgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5hdXRvY29tcGFjdGlvbl9vbl9zdGFydHVwX2VuYWJsZWQiLCAidHJ1ZSIpKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBhdXRvY29tcGFjdGlvbl9vbl9zdGFydHVwX2VuYWJsZWQgPSBBVVRPQ09NUEFDVElPTl9PTl9TVEFSVFVQX0VOQUJMRUQuZ2V0Qm9vbGVhbigpOwogCiAgICAgLy8gc2VlIENBU1NBTkRSQS0zMjAwIC8gQ0FTU0FORFJBLTE2Mjc0CiAgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gYXV0b19vcHRpbWlzZV9pbmNfcmVwYWlyX3N0cmVhbXMgPSBmYWxzZTsKQEAgLTgzMCwxMyArODYzLDIwIEBACiAgICAgcHVibGljIHZvbGF0aWxlIFNldDxDb25zaXN0ZW5jeUxldmVsPiB3cml0ZV9jb25zaXN0ZW5jeV9sZXZlbHNfd2FybmVkID0gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKICAgICBwdWJsaWMgdm9sYXRpbGUgU2V0PENvbnNpc3RlbmN5TGV2ZWw+IHdyaXRlX2NvbnNpc3RlbmN5X2xldmVsc19kaXNhbGxvd2VkID0gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKICAgICBwdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiB1c2VyX3RpbWVzdGFtcHNfZW5hYmxlZCA9IHRydWU7CisgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gYWx0ZXJfdGFibGVfZW5hYmxlZCA9IHRydWU7CiAgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gZ3JvdXBfYnlfZW5hYmxlZCA9IHRydWU7CiAgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gZHJvcF90cnVuY2F0ZV90YWJsZV9lbmFibGVkID0gdHJ1ZTsKKyAgICBwdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiBkcm9wX2tleXNwYWNlX2VuYWJsZWQgPSB0cnVlOwogICAgIHB1YmxpYyB2b2xhdGlsZSBib29sZWFuIHNlY29uZGFyeV9pbmRleGVzX2VuYWJsZWQgPSB0cnVlOwogICAgIHB1YmxpYyB2b2xhdGlsZSBib29sZWFuIHVuY29tcHJlc3NlZF90YWJsZXNfZW5hYmxlZCA9IHRydWU7CiAgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gY29tcGFjdF90YWJsZXNfZW5hYmxlZCA9IHRydWU7CiAgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gcmVhZF9iZWZvcmVfd3JpdGVfbGlzdF9vcGVyYXRpb25zX2VuYWJsZWQgPSB0cnVlOwogICAgIHB1YmxpYyB2b2xhdGlsZSBib29sZWFuIGFsbG93X2ZpbHRlcmluZ19lbmFibGVkID0gdHJ1ZTsKKyAgICBwdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiBzaW1wbGVzdHJhdGVneV9lbmFibGVkID0gdHJ1ZTsKKyAgICBwdWJsaWMgdm9sYXRpbGUgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kIHBhcnRpdGlvbl9zaXplX3dhcm5fdGhyZXNob2xkID0gbnVsbDsKKyAgICBwdWJsaWMgdm9sYXRpbGUgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kIHBhcnRpdGlvbl9zaXplX2ZhaWxfdGhyZXNob2xkID0gbnVsbDsKKyAgICBwdWJsaWMgdm9sYXRpbGUgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kIGNvbHVtbl92YWx1ZV9zaXplX3dhcm5fdGhyZXNob2xkID0gbnVsbDsKKyAgICBwdWJsaWMgdm9sYXRpbGUgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kIGNvbHVtbl92YWx1ZV9zaXplX2ZhaWxfdGhyZXNob2xkID0gbnVsbDsKICAgICBwdWJsaWMgdm9sYXRpbGUgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kIGNvbGxlY3Rpb25fc2l6ZV93YXJuX3RocmVzaG9sZCA9IG51bGw7CiAgICAgcHVibGljIHZvbGF0aWxlIERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCBjb2xsZWN0aW9uX3NpemVfZmFpbF90aHJlc2hvbGQgPSBudWxsOwogICAgIHB1YmxpYyB2b2xhdGlsZSBpbnQgaXRlbXNfcGVyX2NvbGxlY3Rpb25fd2Fybl90aHJlc2hvbGQgPSAtMTsKQEAgLTg0OCw2ICs4ODgsMTAgQEAKICAgICBwdWJsaWMgdm9sYXRpbGUgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kIGRhdGFfZGlza191c2FnZV9tYXhfZGlza19zaXplID0gbnVsbDsKICAgICBwdWJsaWMgdm9sYXRpbGUgaW50IG1pbmltdW1fcmVwbGljYXRpb25fZmFjdG9yX3dhcm5fdGhyZXNob2xkID0gLTE7CiAgICAgcHVibGljIHZvbGF0aWxlIGludCBtaW5pbXVtX3JlcGxpY2F0aW9uX2ZhY3Rvcl9mYWlsX3RocmVzaG9sZCA9IC0xOworICAgIHB1YmxpYyB2b2xhdGlsZSBpbnQgbWF4aW11bV9yZXBsaWNhdGlvbl9mYWN0b3Jfd2Fybl90aHJlc2hvbGQgPSAtMTsKKyAgICBwdWJsaWMgdm9sYXRpbGUgaW50IG1heGltdW1fcmVwbGljYXRpb25fZmFjdG9yX2ZhaWxfdGhyZXNob2xkID0gLTE7CisgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gemVyb190dGxfb25fdHdjc193YXJuZWQgPSB0cnVlOworICAgIHB1YmxpYyB2b2xhdGlsZSBib29sZWFuIHplcm9fdHRsX29uX3R3Y3NfZW5hYmxlZCA9IHRydWU7CiAKICAgICBwdWJsaWMgdm9sYXRpbGUgRHVyYXRpb25TcGVjLkxvbmdOYW5vc2Vjb25kc0JvdW5kIHN0cmVhbWluZ19zdGF0ZV9leHBpcmVzID0gbmV3IER1cmF0aW9uU3BlYy5Mb25nTmFub3NlY29uZHNCb3VuZCgiM2QiKTsKICAgICBwdWJsaWMgdm9sYXRpbGUgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kIHN0cmVhbWluZ19zdGF0ZV9zaXplID0gbmV3IERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCgiNDBNaUIiKTsKQEAgLTg2MSw2ICs5MDUsMTIgQEAKICAgICBwdWJsaWMgdm9sYXRpbGUgRHVyYXRpb25TcGVjLkxvbmdOYW5vc2Vjb25kc0JvdW5kIHJlcGFpcl9zdGF0ZV9leHBpcmVzID0gbmV3IER1cmF0aW9uU3BlYy5Mb25nTmFub3NlY29uZHNCb3VuZCgiM2QiKTsKICAgICBwdWJsaWMgdm9sYXRpbGUgaW50IHJlcGFpcl9zdGF0ZV9zaXplID0gMTAwXzAwMDsKIAorICAgIC8qKiBUaGUgY29uZmlndXJhdGlvbiBvZiB0aW1lc3RhbXAgYm91bmRzICovCisgICAgcHVibGljIHZvbGF0aWxlIER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQgbWF4aW11bV90aW1lc3RhbXBfd2Fybl90aHJlc2hvbGQgPSBudWxsOworICAgIHB1YmxpYyB2b2xhdGlsZSBEdXJhdGlvblNwZWMuTG9uZ01pY3Jvc2Vjb25kc0JvdW5kIG1heGltdW1fdGltZXN0YW1wX2ZhaWxfdGhyZXNob2xkID0gbnVsbDsKKyAgICBwdWJsaWMgdm9sYXRpbGUgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCBtaW5pbXVtX3RpbWVzdGFtcF93YXJuX3RocmVzaG9sZCA9IG51bGw7CisgICAgcHVibGljIHZvbGF0aWxlIER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQgbWluaW11bV90aW1lc3RhbXBfZmFpbF90aHJlc2hvbGQgPSBudWxsOworCiAgICAgLyoqCiAgICAgICogVGhlIHZhcmlhbnRzIG9mIHBheG9zIGltcGxlbWVudGF0aW9uIGFuZCBzZW1hbnRpY3Mgc3VwcG9ydGVkIGJ5IENhc3NhbmRyYS4KICAgICAgKi8KQEAgLTk1MSw3ICsxMDAxLDcgQEAKICAgICAgKiByYXJlIG9wZXJhdGlvbiBjaXJjdW1zdGFuY2VzIGUuZy4gd2hlcmUgZm9yIHNvbWUgcmVhc29uIHRoZSByZXBhaXIgaXMgaW1wb3NzaWJsZSB0byBwZXJmb3JtIChlLmcuIHRvbyBmZXcgcmVwbGljYXMpCiAgICAgICogYW5kIGFuIHVuc2FmZSB0b3BvbG9neSBjaGFuZ2UgbXVzdCBiZSBtYWRlCiAgICAgICovCi0gICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gc2tpcF9wYXhvc19yZXBhaXJfb25fdG9wb2xvZ3lfY2hhbmdlID0gQm9vbGVhbi5nZXRCb29sZWFuKCJjYXNzYW5kcmEuc2tpcF9wYXhvc19yZXBhaXJfb25fdG9wb2xvZ3lfY2hhbmdlIik7CisgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gc2tpcF9wYXhvc19yZXBhaXJfb25fdG9wb2xvZ3lfY2hhbmdlID0gU0tJUF9QQVhPU19SRVBBSVJfT05fVE9QT0xPR1lfQ0hBTkdFLmdldEJvb2xlYW4oKTsKIAogICAgIC8qKgogICAgICAqIEEgc2FmZXR5IG1hcmdpbiB3aGVuIHB1cmdpbmcgcGF4b3Mgc3RhdGUgaW5mb3JtYXRpb24gdGhhdCBoYXMgYmVlbiBzYWZlbHkgcmVwbGljYXRlZCB0byBhIHF1b3J1bS4KQEAgLTEwMTIsNyArMTA2Miw3IEBACiAgICAgLyoqCiAgICAgICogSWYgbmVjZXNzYXJ5IGZvciBvcGVyYXRpb25hbCBwdXJwb3NlcywgcGVybWl0IGNlcnRhaW4ga2V5c3BhY2VzIHRvIGJlIGlnbm9yZWQgZm9yIHBheG9zIHRvcG9sb2d5IHJlcGFpcnMKICAgICAgKi8KLSAgICBwdWJsaWMgdm9sYXRpbGUgU2V0PFN0cmluZz4gc2tpcF9wYXhvc19yZXBhaXJfb25fdG9wb2xvZ3lfY2hhbmdlX2tleXNwYWNlcyA9IHNwbGl0Q29tbWFEZWxpbWl0ZWQoU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEuc2tpcF9wYXhvc19yZXBhaXJfb25fdG9wb2xvZ3lfY2hhbmdlX2tleXNwYWNlcyIpKTsKKyAgICBwdWJsaWMgdm9sYXRpbGUgU2V0PFN0cmluZz4gc2tpcF9wYXhvc19yZXBhaXJfb25fdG9wb2xvZ3lfY2hhbmdlX2tleXNwYWNlcyA9IHNwbGl0Q29tbWFEZWxpbWl0ZWQoU0tJUF9QQVhPU19SRVBBSVJfT05fVE9QT0xPR1lfQ0hBTkdFX0tFWVNQQUNFUy5nZXRTdHJpbmcoKSk7CiAKICAgICAvKioKICAgICAgKiBTZWUge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UucGF4b3MuQ29udGVudGlvblN0cmF0ZWd5fQpAQCAtMTAzOSw2ICsxMDg5LDEwIEBACiAgICAgICovCiAgICAgcHVibGljIHZvbGF0aWxlIGludCBwYXhvc19yZXBhaXJfcGFyYWxsZWxpc20gPSAtMTsKIAorICAgIHB1YmxpYyB2b2xhdGlsZSBib29sZWFuIHNzdGFibGVfcmVhZF9yYXRlX3BlcnNpc3RlbmNlX2VuYWJsZWQgPSBmYWxzZTsKKworICAgIHB1YmxpYyB2b2xhdGlsZSBib29sZWFuIGNsaWVudF9yZXF1ZXN0X3NpemVfbWV0cmljc19lbmFibGVkID0gdHJ1ZTsKKwogICAgIHB1YmxpYyB2b2xhdGlsZSBpbnQgbWF4X3RvcF9zaXplX3BhcnRpdGlvbl9jb3VudCA9IDEwOwogICAgIHB1YmxpYyB2b2xhdGlsZSBpbnQgbWF4X3RvcF90b21ic3RvbmVfcGFydGl0aW9uX2NvdW50ID0gMTA7CiAgICAgcHVibGljIHZvbGF0aWxlIERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCBtaW5fdHJhY2tlZF9wYXJ0aXRpb25fc2l6ZSA9IG5ldyBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQoIjFNaUIiKTsKQEAgLTExNzAsNCArMTIyNCw5IEBACiAKICAgICAgICAgbG9nZ2VyLmluZm8oIk5vZGUgY29uZmlndXJhdGlvbjpbe31dIiwgSm9pbmVyLm9uKCI7ICIpLmpvaW4oY29uZmlnTWFwLmVudHJ5U2V0KCkpKTsKICAgICB9CisKKyAgICBwdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiBkdW1wX2hlYXBfb25fdW5jYXVnaHRfZXhjZXB0aW9uID0gZmFsc2U7CisgICAgcHVibGljIFN0cmluZyBoZWFwX2R1bXBfcGF0aCA9ICJoZWFwZHVtcCI7CisKKyAgICBwdWJsaWMgZG91YmxlIHNldmVyaXR5X2R1cmluZ19kZWNvbW1pc3Npb24gPSAwOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0RhdGFiYXNlRGVzY3JpcHRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0RhdGFiYXNlRGVzY3JpcHRvci5qYXZhCmluZGV4IGEwNGU4NWMuLjI1MzFlNWMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9EYXRhYmFzZURlc2NyaXB0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvRGF0YWJhc2VEZXNjcmlwdG9yLmphdmEKQEAgLTE4LDYgKzE4LDggQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcubWFuYWdlbWVudC5NYW5hZ2VtZW50RmFjdG9yeTsKK2ltcG9ydCBqYXZhLmxhbmcubWFuYWdlbWVudC5SdW50aW1lTVhCZWFuOwogaW1wb3J0IGphdmEubmV0LkluZXQ0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5JbmV0NkFkZHJlc3M7CiBpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CkBAIC0yNSwyNCArMjcsMzMgQEAKIGltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlU3RvcmU7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbERvdWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU2VydmljZUxvYWRlcjsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5VVUlEOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7Ci0KK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuSW50czsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLkxvbmdzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5SYXRlTGltaXRlcjsKQEAgLTUxLDYgKzYyLDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCitpbXBvcnQgY29tLmdvb2dsZWNvZGUuY29uY3VycmVudHRyZWVzLmNvbW1vbi5JdGVyYWJsZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXVkaXQuQXVkaXRMb2dPcHRpb25zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguQWxsb3dBbGxJbnRlcm5vZGVBdXRoZW50aWNhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguQXV0aENvbmZpZzsKQEAgLTcyLDYgKzg0LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5mcWwuRnVsbFF1ZXJ5TG9nZ2VyT3B0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5nbXMuSUZhaWx1cmVEZXRlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU1dyaXRlRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGlza09wdGltaXphdGlvblN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKQEAgLTkwLDkgKzEwNCwyOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UucGF4b3MuUGF4b3M7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5BTExPQ0FURV9UT0tFTlNfRk9SX0tFWVNQQUNFOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkFMTE9XX1VOTElNSVRFRF9DT05DVVJSRU5UX1ZBTElEQVRJT05TOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkFVVE9fQk9PVFNUUkFQOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNPTkZJR19MT0FERVI7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRElTQUJMRV9TVENTX0lOX0wwOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLklOSVRJQUxfVE9LRU47CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSU9fTkVUVFlfVFJBTlNQT1JUX0VTVElNQVRFX1NJWkVfT05fU1VCTUlUOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk5BVElWRV9UUkFOU1BPUlRfUE9SVDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5PU19BUkNIOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlBBUlRJVElPTkVSOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJFUExBQ0VfQUREUkVTUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5SRVBMQUNFX0FERFJFU1NfRklSU1RfQk9PVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5SRVBMQUNFX05PREU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUkVQTEFDRV9UT0tFTjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TRUFSQ0hfQ09OQ1VSUkVOQ1lfRkFDVE9SOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlNTTF9TVE9SQUdFX1BPUlQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU1RPUkFHRV9ESVI7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU1RPUkFHRV9QT1JUOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfU1RSSUNUX1JVTlRJTUVfQ0hFQ0tTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlNVTl9BUkNIX0RBVEFfTU9ERUw7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9GQUlMX01WX0xPQ0tTX0NPVU5UOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfSlZNX0RURVNUX0RJU0FCTEVfU1NMOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlVOU0FGRV9TWVNURU07CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhUmF0ZVNwZWMuRGF0YVJhdGVVbml0LkJZVEVTX1BFUl9TRUNPTkQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhUmF0ZVNwZWMuRGF0YVJhdGVVbml0Lk1FQklCWVRFU19QRVJfU0VDT05EOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YVN0b3JhZ2VTcGVjLkRhdGFTdG9yYWdlVW5pdC5NRUJJQllURVM7CkBAIC0xMDYsNyArMTQwLDcgQEAKICAgICB7CiAgICAgICAgIC8vIFRoaXMgc3RhdGljIGJsb2NrIGNvdmVycyBtb3N0IHVzYWdlcwogICAgICAgICBGQlV0aWxpdGllcy5wcmV2ZW50SWxsZWdhbEFjY2Vzc1dhcm5pbmdzKCk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiaW8ubmV0dHkudHJhbnNwb3J0LmVzdGltYXRlU2l6ZU9uU3VibWl0IiwgImZhbHNlIik7CisgICAgICAgIElPX05FVFRZX1RSQU5TUE9SVF9FU1RJTUFURV9TSVpFX09OX1NVQk1JVC5zZXRCb29sZWFuKGZhbHNlKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRGF0YWJhc2VEZXNjcmlwdG9yLmNsYXNzKTsKQEAgLTE2NCwyNCArMTk4LDI5IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB0b29sSW5pdGlhbGl6ZWQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkYWVtb25Jbml0aWFsaXplZDsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzZWFyY2hDb25jdXJyZW5jeUZhY3RvciA9IEludGVnZXIucGFyc2VJbnQoU3lzdGVtLmdldFByb3BlcnR5KENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAic2VhcmNoX2NvbmN1cnJlbmN5X2ZhY3RvciIsICIxIikpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzZWFyY2hDb25jdXJyZW5jeUZhY3RvciA9IFNFQVJDSF9DT05DVVJSRU5DWV9GQUNUT1IuZ2V0SW50KCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgRHVyYXRpb25TcGVjLkludFNlY29uZHNCb3VuZCBhdXRvU25hcHNob1R0bDsKIAotICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gZGlzYWJsZVNUQ1NJbkwwID0gQm9vbGVhbi5nZXRCb29sZWFuKENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAiZGlzYWJsZV9zdGNzX2luX2wwIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiB1bnNhZmVTeXN0ZW0gPSBCb29sZWFuLmdldEJvb2xlYW4oQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJ1bnNhZmVzeXN0ZW0iKTsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIGRpc2FibGVTVENTSW5MMCA9IERJU0FCTEVfU1RDU19JTl9MMC5nZXRCb29sZWFuKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiB1bnNhZmVTeXN0ZW0gPSBVTlNBRkVfU1lTVEVNLmdldEJvb2xlYW4oKTsKIAogICAgIC8vIHR1cm5zIHNvbWUgd2FybmluZ3MgaW50byBleGNlcHRpb25zIGZvciB0ZXN0aW5nCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBzdHJpY3RSdW50aW1lQ2hlY2tzID0gQm9vbGVhbi5nZXRCb29sZWFuKCJjYXNzYW5kcmEuc3RyaWN0LnJ1bnRpbWUuY2hlY2tzIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBzdHJpY3RSdW50aW1lQ2hlY2tzID0gVEVTVF9TVFJJQ1RfUlVOVElNRV9DSEVDS1MuZ2V0Qm9vbGVhbigpOwogCi0gICAgcHVibGljIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIGFsbG93VW5saW1pdGVkQ29uY3VycmVudFZhbGlkYXRpb25zID0gQm9vbGVhbi5nZXRCb29sZWFuKCJjYXNzYW5kcmEuYWxsb3dfdW5saW1pdGVkX2NvbmN1cnJlbnRfdmFsaWRhdGlvbnMiKTsKKyAgICBwdWJsaWMgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gYWxsb3dVbmxpbWl0ZWRDb25jdXJyZW50VmFsaWRhdGlvbnMgPSBBTExPV19VTkxJTUlURURfQ09OQ1VSUkVOVF9WQUxJREFUSU9OUy5nZXRCb29sZWFuKCk7CiAKLSAgICAvKiogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIGd1YXJkcmFpbHMuICovCisgICAgLyoqCisgICAgICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIGd1YXJkcmFpbHMuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgR3VhcmRyYWlsc09wdGlvbnMgZ3VhcmRyYWlsczsKICAgICBwcml2YXRlIHN0YXRpYyBTdGFydHVwQ2hlY2tzT3B0aW9ucyBzdGFydHVwQ2hlY2tzT3B0aW9uczsKIAorICAgIHByaXZhdGUgc3RhdGljIEltbXV0YWJsZU1hcDxTdHJpbmcsIFNTVGFibGVGb3JtYXQ8PywgPz4+IHNzdGFibGVGb3JtYXRzOworICAgIHByaXZhdGUgc3RhdGljIFNTVGFibGVGb3JtYXQ8PywgPz4gc2VsZWN0ZWRTU1RhYmxlRm9ybWF0OworCiAgICAgcHJpdmF0ZSBzdGF0aWMgRnVuY3Rpb248Q29tbWl0TG9nLCBBYnN0cmFjdENvbW1pdExvZ1NlZ21lbnRNYW5hZ2VyPiBjb21taXRMb2dTZWdtZW50TWdyUHJvdmlkZXIgPSBjIC0+IERhdGFiYXNlRGVzY3JpcHRvci5pc0NEQ0VuYWJsZWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgQ29tbWl0TG9nU2VnbWVudE1hbmFnZXJDREMoYywgRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbW1pdExvZ0xvY2F0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBDb21taXRMb2dTZWdtZW50TWFuYWdlclN0YW5kYXJkKGMsIERhdGFiYXNlRGVzY3JpcHRvci5nZXRDb21taXRMb2dMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgQ29tbWl0TG9nU2VnbWVudE1hbmFnZXJDREMoYywgRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbW1pdExvZ0xvY2F0aW9uKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IENvbW1pdExvZ1NlZ21lbnRNYW5hZ2VyU3RhbmRhcmQoYywgRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbW1pdExvZ0xvY2F0aW9uKCkpOwogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGRhZW1vbkluaXRpYWxpemF0aW9uKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KICAgICB7CkBAIC0yNDEsNiArMjgwLDggQEAKIAogICAgICAgICBzZXRDb25maWcobG9hZENvbmZpZygpKTsKIAorICAgICAgICBhcHBseVNTVGFibGVGb3JtYXRzKCk7CisKICAgICAgICAgYXBwbHlTaW1wbGVDb25maWcoKTsKIAogICAgICAgICBhcHBseVBhcnRpdGlvbmVyKCk7CkBAIC0yNTksNiArMzAwLDE0IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRXF1aXZhbGVudCB0byB7QGxpbmsgI2NsaWVudEluaXRpYWxpemF0aW9uKGJvb2xlYW4pIGNsaWVudEluaXRpYWxpemF0aW9uKHRydWUsIENvbmZpZzo6bmV3KX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsaWVudEluaXRpYWxpemF0aW9uKGJvb2xlYW4gZmFpbElmRGFlbW9uT3JUb29sKQorICAgIHsKKyAgICAgICAgY2xpZW50SW5pdGlhbGl6YXRpb24oZmFpbElmRGFlbW9uT3JUb29sLCBDb25maWc6Om5ldyk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogSW5pdGlhbGl6ZXMgdGhpcyBjbGFzcyBhcyBhIGNsaWVudCwgd2hpY2ggbWVhbnMgdGhhdCBqdXN0IGFuIGVtcHR5IGNvbmZpZ3VyYXRpb24gd2lsbAogICAgICAqIGJlIHVzZWQuCiAgICAgICoKQEAgLTI2Niw3ICszMTUsNyBAQAogICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rICN0b29sSW5pdGlhbGl6YXRpb24oKX0gaGFzIGJlZW4gcGVyZm9ybWVkIGJlZm9yZSwgYW4KICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBBc3NlcnRpb25FcnJvcn0gd2lsbCBiZSB0aHJvd24uCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNsaWVudEluaXRpYWxpemF0aW9uKGJvb2xlYW4gZmFpbElmRGFlbW9uT3JUb29sKQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGllbnRJbml0aWFsaXphdGlvbihib29sZWFuIGZhaWxJZkRhZW1vbk9yVG9vbCwgU3VwcGxpZXI8Q29uZmlnPiBjb25maWdTdXBwbGllcikKICAgICB7CiAgICAgICAgIGlmICghZmFpbElmRGFlbW9uT3JUb29sICYmIChkYWVtb25Jbml0aWFsaXplZCB8fCB0b29sSW5pdGlhbGl6ZWQpKQogICAgICAgICB7CkBAIC0yODUsOCArMzM0LDkgQEAKICAgICAgICAgY2xpZW50SW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICAgICBzZXREZWZhdWx0RmFpbHVyZURldGVjdG9yKCk7CiAgICAgICAgIENvbmZpZy5zZXRDbGllbnRNb2RlKHRydWUpOwotICAgICAgICBjb25mID0gbmV3IENvbmZpZygpOworICAgICAgICBjb25mID0gY29uZmlnU3VwcGxpZXIuZ2V0KCk7CiAgICAgICAgIGRpc2tPcHRpbWl6YXRpb25TdHJhdGVneSA9IG5ldyBTcGlubmluZ0Rpc2tPcHRpbWl6YXRpb25TdHJhdGVneSgpOworICAgICAgICBhcHBseVNTVGFibGVGb3JtYXRzKCk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2xpZW50SW5pdGlhbGl6ZWQoKQpAQCAtMzIwLDcgKzM3MCw3IEBACiAgICAgICAgIGlmIChDb25maWcuZ2V0T3ZlcnJpZGVMb2FkQ29uZmlnKCkgIT0gbnVsbCkKICAgICAgICAgICAgIHJldHVybiBDb25maWcuZ2V0T3ZlcnJpZGVMb2FkQ29uZmlnKCkuZ2V0KCk7CiAKLSAgICAgICAgU3RyaW5nIGxvYWRlckNsYXNzID0gU3lzdGVtLmdldFByb3BlcnR5KENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAiY29uZmlnLmxvYWRlciIpOworICAgICAgICBTdHJpbmcgbG9hZGVyQ2xhc3MgPSBDT05GSUdfTE9BREVSLmdldFN0cmluZygpOwogICAgICAgICBDb25maWd1cmF0aW9uTG9hZGVyIGxvYWRlciA9IGxvYWRlckNsYXNzID09IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBZYW1sQ29uZmlndXJhdGlvbkxvYWRlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGQlV0aWxpdGllcy5jb25zdHJ1Y3QobG9hZGVyQ2xhc3MsICJjb25maWd1cmF0aW9uIGxvYWRpbmciKTsKQEAgLTM3Myw2ICs0MjMsOCBAQAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXBwbHlBbGwoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgLy9JbmV0QWRkcmVzc0FuZFBvcnQgY2FyZXMgdGhhdCBhcHBseVNpbXBsZUNvbmZpZyBydW5zIGZpcnN0CisgICAgICAgIGFwcGx5U1NUYWJsZUZvcm1hdHMoKTsKKwogICAgICAgICBhcHBseVNpbXBsZUNvbmZpZygpOwogCiAgICAgICAgIGFwcGx5UGFydGl0aW9uZXIoKTsKQEAgLTQ4Myw3ICs1MzUsNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oImNvbmN1cnJlbnRfcmVhZHMgbXVzdCBiZSBhdCBsZWFzdCAyLCBidXQgd2FzICIgKyBjb25mLmNvbmN1cnJlbnRfcmVhZHMsIGZhbHNlKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChjb25mLmNvbmN1cnJlbnRfd3JpdGVzIDwgMiAmJiBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS50ZXN0LmZhaWxfbXZfbG9ja3NfY291bnQiLCAiIikuaXNFbXB0eSgpKQorICAgICAgICBpZiAoY29uZi5jb25jdXJyZW50X3dyaXRlcyA8IDIgJiYgVEVTVF9GQUlMX01WX0xPQ0tTX0NPVU5ULmdldFN0cmluZygiIikuaXNFbXB0eSgpKQogICAgICAgICB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiY29uY3VycmVudF93cml0ZXMgbXVzdCBiZSBhdCBsZWFzdCAyLCBidXQgd2FzICIgKyBjb25mLmNvbmN1cnJlbnRfd3JpdGVzLCBmYWxzZSk7CiAgICAgICAgIH0KQEAgLTU0OSw3ICs2MDEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgICAgICB9CiAKLSAgICAgICAgY2hlY2tWYWxpZEZvckJ5dGVDb252ZXJzaW9uKGNvbmYuY29sdW1uX2luZGV4X3NpemUsICJjb2x1bW5faW5kZXhfc2l6ZSIpOworICAgICAgICBpZiAoY29uZi5jb2x1bW5faW5kZXhfc2l6ZSAhPSBudWxsKQorICAgICAgICAgICAgY2hlY2tWYWxpZEZvckJ5dGVDb252ZXJzaW9uKGNvbmYuY29sdW1uX2luZGV4X3NpemUsICJjb2x1bW5faW5kZXhfc2l6ZSIpOwogICAgICAgICBjaGVja1ZhbGlkRm9yQnl0ZUNvbnZlcnNpb24oY29uZi5jb2x1bW5faW5kZXhfY2FjaGVfc2l6ZSwgImNvbHVtbl9pbmRleF9jYWNoZV9zaXplIik7CiAgICAgICAgIGNoZWNrVmFsaWRGb3JCeXRlQ29udmVyc2lvbihjb25mLmJhdGNoX3NpemVfd2Fybl90aHJlc2hvbGQsICJiYXRjaF9zaXplX3dhcm5fdGhyZXNob2xkIik7CiAKQEAgLTgwOCw3ICs4NjEsOCBAQAogICAgICAgICAgICAgbG9nZ2VyLndhcm4oIkFsbG93aW5nIGphdmEubGFuZy5TeXN0ZW0uKiBhY2Nlc3MgaW4gVURGcyBpcyBkYW5nZXJvdXMgYW5kIG5vdCByZWNvbW1lbmRlZC4gU2V0IGFsbG93X2V4dHJhX2luc2VjdXJlX3VkZnM6IGZhbHNlIHRvIGRpc2FibGUuIik7CiAKICAgICAgICAgaWYoY29uZi5zY3JpcHRlZF91c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQpCi0gICAgICAgICAgICBsb2dnZXIud2FybigiSmF2YVNjcmlwdCB1c2VyLWRlZmluZWQgZnVuY3Rpb25zIGhhdmUgYmVlbiBkZXByZWNhdGVkLiBZb3UgY2FuIHN0aWxsIHVzZSB0aGVtIGJ1dCB0aGUgcGxhbiBpcyB0byByZW1vdmUgdGhlbSBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiAtIENBU1NBTkRSQS0xNzI4MCIpOworICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIkphdmFTY3JpcHQgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucyB3ZXJlIHJlbW92ZWQgaW4gQ0FTU0FORFJBLTE4MjUyLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb29rcyBhcmUgcGxhbm5lZCB0byBiZSBpbnRyb2R1Y2VkIGFzIHBhcnQgb2YgQ0FTU0FORFJBLTE3MjgwIik7CiAKICAgICAgICAgaWYgKGNvbmYuY29tbWl0bG9nX3NlZ21lbnRfc2l6ZS50b01lYmlieXRlcygpID09IDApCiAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiY29tbWl0bG9nX3NlZ21lbnRfc2l6ZSBtdXN0IGJlIHBvc2l0aXZlLCBidXQgd2FzICIKQEAgLTkwNiw2ICs5NjAsMTIgQEAKICAgICAgICAgICAgIGNvbmYucGF4b3Nfc3RhdGVfcHVyZ2luZyA9IFBheG9zU3RhdGVQdXJnaW5nLmxlZ2FjeTsKIAogICAgICAgICBsb2dJbml0aWFsaXphdGlvbk91dGNvbWUobG9nZ2VyKTsKKworICAgICAgICBpZiAoY29uZi5tYXhfc3BhY2VfdXNhYmxlX2Zvcl9jb21wYWN0aW9uc19pbl9wZXJjZW50YWdlIDwgMCB8fCBjb25mLm1heF9zcGFjZV91c2FibGVfZm9yX2NvbXBhY3Rpb25zX2luX3BlcmNlbnRhZ2UgPiAxKQorICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIm1heF9zcGFjZV91c2FibGVfZm9yX2NvbXBhY3Rpb25zX2luX3BlcmNlbnRhZ2UgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEiLCBmYWxzZSk7CisKKyAgICAgICAgaWYgKGNvbmYuZHVtcF9oZWFwX29uX3VuY2F1Z2h0X2V4Y2VwdGlvbiAmJiBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0SGVhcER1bXBQYXRoKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkludmFsaWQgY29uZmlndXJhdGlvbi4gSGVhcCBkdW1wIGlzIGVuYWJsZWQgYnV0IGNhbm5vdCBjcmVhdGUgaGVhcCBkdW1wIG91dHB1dCBwYXRoOiAlcy4iLCBjb25mLmhlYXBfZHVtcF9wYXRoICE9IG51bGwgPyBjb25mLmhlYXBfZHVtcF9wYXRoIDogIm51bGwiKSk7CiAgICAgfQogCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCkBAIC05NDgsNyArMTAwOCw3IEBACiAgICAgICAgIGVsc2UgaWYgKGNvbmZpZy5jb25jdXJyZW50X3ZhbGlkYXRpb25zID4gY29uZmlnLmNvbmN1cnJlbnRfY29tcGFjdG9ycyAmJiAhYWxsb3dVbmxpbWl0ZWRDb25jdXJyZW50VmFsaWRhdGlvbnMpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJUbyBzZXQgY29uY3VycmVudF92YWxpZGF0aW9ucyA+IGNvbmN1cnJlbnRfY29tcGFjdG9ycywgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0IHRoZSBzeXN0ZW0gcHJvcGVydHkgY2Fzc2FuZHJhLmFsbG93X3VubGltaXRlZF9jb25jdXJyZW50X3ZhbGlkYXRpb25zPXRydWUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXQgdGhlIHN5c3RlbSBwcm9wZXJ0eSAtRCIgKyBBTExPV19VTkxJTUlURURfQ09OQ1VSUkVOVF9WQUxJREFUSU9OUy5nZXRLZXkoKSArICI9dHJ1ZSIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDA5LDkgKzEwNjksOSBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0b3JhZ2VkaXIoU3RyaW5nIGVyck1zZ1R5cGUpCiAgICAgewotICAgICAgICBTdHJpbmcgc3RvcmFnZWRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eShDb25maWcuUFJPUEVSVFlfUFJFRklYICsgInN0b3JhZ2VkaXIiLCBudWxsKTsKKyAgICAgICAgU3RyaW5nIHN0b3JhZ2VkaXIgPSBTVE9SQUdFX0RJUi5nZXRTdHJpbmcoKTsKICAgICAgICAgaWYgKHN0b3JhZ2VkaXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKGVyck1zZ1R5cGUgKyAiIGlzIG1pc3NpbmcgYW5kIC1EY2Fzc2FuZHJhLnN0b3JhZ2VkaXIgaXMgbm90IHNldCIsIGZhbHNlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKGVyck1zZ1R5cGUgKyAiIGlzIG1pc3NpbmcgYW5kICIgKyBTVE9SQUdFX0RJUi5nZXRLZXkoKSArICIgc3lzdGVtIHByb3BlcnR5IGlzIG5vdCBzZXQiLCBmYWxzZSk7CiAgICAgICAgIHJldHVybiBzdG9yYWdlZGlyOwogICAgIH0KIApAQCAtMTMwNiw3ICsxMzY2LDcgQEAKICAgICAgICAgU3RyaW5nIG5hbWUgPSBjb25mLnBhcnRpdGlvbmVyOwogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgbmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShDb25maWcuUFJPUEVSVFlfUFJFRklYICsgInBhcnRpdGlvbmVyIiwgY29uZi5wYXJ0aXRpb25lcik7CisgICAgICAgICAgICBuYW1lID0gUEFSVElUSU9ORVIuZ2V0U3RyaW5nKGNvbmYucGFydGl0aW9uZXIpOwogICAgICAgICAgICAgcGFydGl0aW9uZXIgPSBGQlV0aWxpdGllcy5uZXdQYXJ0aXRpb25lcihuYW1lKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCkBAIC0xMzE3LDEwICsxMzc3LDk1IEBACiAgICAgICAgIHBhcml0aW9uZXJOYW1lID0gcGFydGl0aW9uZXIuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZVNTVGFibGVGb3JtYXRGYWN0b3JpZXMoSXRlcmFibGU8U1NUYWJsZUZvcm1hdC5GYWN0b3J5PiBmYWN0b3JpZXMpCisgICAgeworICAgICAgICBNYXA8U3RyaW5nLCBTU1RhYmxlRm9ybWF0LkZhY3Rvcnk+IGZhY3RvcnlCeU5hbWUgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGZvciAoU1NUYWJsZUZvcm1hdC5GYWN0b3J5IGZhY3RvcnkgOiBmYWN0b3JpZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmYWN0b3J5Lm5hbWUoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlNTVGFibGUgZm9ybWF0IG5hbWUgaW4gJXMgY2Fubm90IGJlIG51bGwiLCBmYWN0b3J5LmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7CisKKyAgICAgICAgICAgIGlmICghZmFjdG9yeS5uYW1lKCkubWF0Y2hlcygiXlthLXpdKyQiKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJTU1RhYmxlIGZvcm1hdCBuYW1lIGZvciAlcyBtdXN0IGJlIG5vbi1lbXB0eSwgbG93ZXItY2FzZSBsZXR0ZXJzIG9ubHkgc3RyaW5nIiwgZmFjdG9yeS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSkpOworCisgICAgICAgICAgICBTU1RhYmxlRm9ybWF0LkZhY3RvcnkgcHJldiA9IGZhY3RvcnlCeU5hbWUucHV0KGZhY3RvcnkubmFtZSgpLCBmYWN0b3J5KTsKKyAgICAgICAgICAgIGlmIChwcmV2ICE9IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiTXVsdGlwbGUgc3N0YWJsZSBmb3JtYXQgaW1wbGVtZW50YXRpb25zIHdpdGggdGhlIHNhbWUgbmFtZSAlczogJXMgYW5kICVzIiwgZmFjdG9yeS5uYW1lKCksIGZhY3RvcnkuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCksIHByZXYuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEltbXV0YWJsZU1hcDxTdHJpbmcsIFN1cHBsaWVyPFNTVGFibGVGb3JtYXQ8PywgPz4+PiB2YWxpZGF0ZUFuZE1hdGNoU1NUYWJsZUZvcm1hdE9wdGlvbnMoSXRlcmFibGU8U1NUYWJsZUZvcm1hdC5GYWN0b3J5PiBmYWN0b3JpZXMsIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4+IG9wdGlvbnMpCisgICAgeworICAgICAgICBJbW11dGFibGVNYXAuQnVpbGRlcjxTdHJpbmcsIFN1cHBsaWVyPFNTVGFibGVGb3JtYXQ8PywgPz4+PiBwcm92aWRlcnNCdWlsZGVyID0gSW1tdXRhYmxlTWFwLmJ1aWxkZXIoKTsKKyAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkKKyAgICAgICAgICAgIG9wdGlvbnMgPSBJbW11dGFibGVNYXAub2YoKTsKKyAgICAgICAgZm9yIChTU1RhYmxlRm9ybWF0LkZhY3RvcnkgZmFjdG9yeSA6IGZhY3RvcmllcykKKyAgICAgICAgeworICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBmb3JtYXRPcHRpb25zID0gb3B0aW9ucy5nZXRPckRlZmF1bHQoZmFjdG9yeS5uYW1lKCksIEltbXV0YWJsZU1hcC5vZigpKTsKKyAgICAgICAgICAgIHByb3ZpZGVyc0J1aWxkZXIucHV0KGZhY3RvcnkubmFtZSgpLCAoKSAtPiBmYWN0b3J5LmdldEluc3RhbmNlKEltbXV0YWJsZU1hcC5jb3B5T2YoZm9ybWF0T3B0aW9ucykpKTsKKyAgICAgICAgfQorICAgICAgICBJbW11dGFibGVNYXA8U3RyaW5nLCBTdXBwbGllcjxTU1RhYmxlRm9ybWF0PD8sID8+Pj4gcHJvdmlkZXJzID0gcHJvdmlkZXJzQnVpbGRlci5idWlsZCgpOworICAgICAgICBpZiAob3B0aW9ucyAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBTZXRzLlNldFZpZXc8U3RyaW5nPiB1bmtub3duRm9ybWF0TmFtZXMgPSBTZXRzLmRpZmZlcmVuY2Uob3B0aW9ucy5rZXlTZXQoKSwgcHJvdmlkZXJzLmtleVNldCgpKTsKKyAgICAgICAgICAgIGlmICghdW5rbm93bkZvcm1hdE5hbWVzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJDb25maWd1cmF0aW9uIGNvbnRhaW5zIG9wdGlvbnMgb2YgdW5rbm93biBzc3RhYmxlIGZvcm1hdHM6ICVzIiwgdW5rbm93bkZvcm1hdE5hbWVzKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHByb3ZpZGVyczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTU1RhYmxlRm9ybWF0PD8sID8+IGdldEFuZFZhbGlkYXRlV3JpdGVGb3JtYXQoTWFwPFN0cmluZywgU1NUYWJsZUZvcm1hdDw/LCA/Pj4gc3N0YWJsZUZvcm1hdHMsIFN0cmluZyBzZWxlY3RlZEZvcm1hdE5hbWUpCisgICAgeworICAgICAgICBTU1RhYmxlRm9ybWF0PD8sID8+IHNlbGVjdGVkRm9ybWF0OworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNCbGFuayhzZWxlY3RlZEZvcm1hdE5hbWUpKQorICAgICAgICAgICAgc2VsZWN0ZWRGb3JtYXROYW1lID0gQmlnRm9ybWF0Lk5BTUU7CisgICAgICAgIHNlbGVjdGVkRm9ybWF0ID0gc3N0YWJsZUZvcm1hdHMuZ2V0KHNlbGVjdGVkRm9ybWF0TmFtZSk7CisgICAgICAgIGlmIChzZWxlY3RlZEZvcm1hdCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiU2VsZWN0ZWQgc3N0YWJsZSBmb3JtYXQgJyVzJyBpcyBub3QgYXZhaWxhYmxlLiIsIHNlbGVjdGVkRm9ybWF0TmFtZSkpOworCisgICAgICAgIHJldHVybiBzZWxlY3RlZEZvcm1hdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFwcGx5U1NUYWJsZUZvcm1hdHMoKQorICAgIHsKKyAgICAgICAgU2VydmljZUxvYWRlcjxTU1RhYmxlRm9ybWF0LkZhY3Rvcnk+IGxvYWRlciA9IFNlcnZpY2VMb2FkZXIubG9hZChTU1RhYmxlRm9ybWF0LkZhY3RvcnkuY2xhc3MsIERhdGFiYXNlRGVzY3JpcHRvci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgTGlzdDxTU1RhYmxlRm9ybWF0LkZhY3Rvcnk+IGZhY3RvcmllcyA9IEl0ZXJhYmxlcy50b0xpc3QobG9hZGVyKTsKKyAgICAgICAgaWYgKGZhY3Rvcmllcy5pc0VtcHR5KCkpCisgICAgICAgICAgICBmYWN0b3JpZXMgPSBJbW11dGFibGVMaXN0Lm9mKG5ldyBCaWdGb3JtYXQuQmlnRm9ybWF0RmFjdG9yeSgpKTsKKyAgICAgICAgYXBwbHlTU1RhYmxlRm9ybWF0cyhmYWN0b3JpZXMsIGNvbmYuc3N0YWJsZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBseVNTVGFibGVGb3JtYXRzKEl0ZXJhYmxlPFNTVGFibGVGb3JtYXQuRmFjdG9yeT4gZmFjdG9yaWVzLCBDb25maWcuU1NUYWJsZUNvbmZpZyBzc3RhYmxlRm9ybWF0c0NvbmZpZykKKyAgICB7CisgICAgICAgIGlmIChzc3RhYmxlRm9ybWF0cyAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHZhbGlkYXRlU1NUYWJsZUZvcm1hdEZhY3RvcmllcyhmYWN0b3JpZXMpOworICAgICAgICBJbW11dGFibGVNYXA8U3RyaW5nLCBTdXBwbGllcjxTU1RhYmxlRm9ybWF0PD8sID8+Pj4gcHJvdmlkZXJzID0gdmFsaWRhdGVBbmRNYXRjaFNTVGFibGVGb3JtYXRPcHRpb25zKGZhY3Rvcmllcywgc3N0YWJsZUZvcm1hdHNDb25maWcuZm9ybWF0KTsKKworICAgICAgICBJbW11dGFibGVNYXAuQnVpbGRlcjxTdHJpbmcsIFNTVGFibGVGb3JtYXQ8PywgPz4+IHNzdGFibGVGb3JtYXRzQnVpbGRlciA9IEltbXV0YWJsZU1hcC5idWlsZGVyKCk7CisgICAgICAgIHByb3ZpZGVycy5mb3JFYWNoKChuYW1lLCBwcm92aWRlcikgLT4geworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3N0YWJsZUZvcm1hdHNCdWlsZGVyLnB1dChuYW1lLCBwcm92aWRlci5nZXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB8IEVycm9yIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkZhaWxlZCB0byBpbnN0YW50aWF0ZSBzc3RhYmxlIGZvcm1hdCAnJXMnIiwgbmFtZSksIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHNzdGFibGVGb3JtYXRzID0gc3N0YWJsZUZvcm1hdHNCdWlsZGVyLmJ1aWxkKCk7CisKKyAgICAgICAgc2VsZWN0ZWRTU1RhYmxlRm9ybWF0ID0gZ2V0QW5kVmFsaWRhdGVXcml0ZUZvcm1hdChzc3RhYmxlRm9ybWF0cywgc3N0YWJsZUZvcm1hdHNDb25maWcuc2VsZWN0ZWRfZm9ybWF0KTsKKworICAgICAgICBzc3RhYmxlRm9ybWF0cy52YWx1ZXMoKS5mb3JFYWNoKFNTVGFibGVGb3JtYXQ6OmFsbENvbXBvbmVudHMpOyAvLyBtYWtlIHN1cmUgdG8gcmVhY2ggYWxsIHN1cHBvcnRlZCBjb21wb25lbnRzIGZvciBhIHR5cGUgc28gdGhhdCB3ZSBrbm93IGFsbCBvZiB0aGVtIGFyZSByZWdpc3RlcmVkCisgICAgICAgIGxvZ2dlci5pbmZvKCJTdXBwb3J0ZWQgc3N0YWJsZSBmb3JtYXRzIGFyZToge30iLCBzc3RhYmxlRm9ybWF0cy52YWx1ZXMoKS5zdHJlYW0oKS5tYXAoZiAtPiBmLm5hbWUoKSArICIgLT4gIiArIGYuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHdpdGggc2luZ2xldG9uIGNvbXBvbmVudHM6ICIgKyBmLmFsbENvbXBvbmVudHMoKSkuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwgIikpKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDb21wdXRlcyB0aGUgc3VtIG9mIHRoZSAyIHNwZWNpZmllZCBwb3NpdGl2ZSB2YWx1ZXMgcmV0dXJuaW5nIHtAY29kZSBMb25nLk1BWF9WQUxVRX0gaWYgdGhlIHN1bSBvdmVyZmxvdy4KICAgICAgKgotICAgICAqIEBwYXJhbSBsZWZ0IHRoZSBsZWZ0IG9wZXJhbmQKKyAgICAgKiBAcGFyYW0gbGVmdCAgdGhlIGxlZnQgb3BlcmFuZAogICAgICAqIEBwYXJhbSByaWdodCB0aGUgcmlnaHQgb3BlcmFuZAogICAgICAqIEByZXR1cm4gdGhlIHN1bSBvZiB0aGUgMiBzcGVjaWZpZWQgcG9zaXRpdmUgdmFsdWVzIG9mIHtAY29kZSBMb25nLk1BWF9WQUxVRX0gaWYgdGhlIHN1bSBvdmVyZmxvdy4KICAgICAgKi8KQEAgLTE1ODIsNiArMTcyNywxMyBAQAogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiY2RjX3Jhd19kaXJlY3RvcnkgbXVzdCBiZSBzcGVjaWZpZWQiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNyZWF0ZURpcmVjdG9yeShjb25mLmNkY19yYXdfZGlyZWN0b3J5KTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbGVhbiBjcmVhdGVkID0gbWF5YmVDcmVhdGVIZWFwRHVtcFBhdGgoKTsKKyAgICAgICAgICAgIGlmICghY3JlYXRlZCAmJiBjb25mLmR1bXBfaGVhcF9vbl91bmNhdWdodF9leGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFN0cmluZy5mb3JtYXQoImNhc3NhbmRyYS55YW1sOmR1bXBfaGVhcF9vbl91bmNhdWdodF9leGNlcHRpb24gaXMgZW5hYmxlZCBidXQgdW5hYmxlIHRvIGNyZWF0ZSBoZWFwIGR1bXAgcGF0aCAlcy4gRGlzYWJsaW5nLiIsIGNvbmYuaGVhcF9kdW1wX3BhdGggIT0gbnVsbCA/IGNvbmYuaGVhcF9kdW1wX3BhdGggOiAibnVsbCIpKTsKKyAgICAgICAgICAgICAgICBjb25mLmR1bXBfaGVhcF9vbl91bmNhdWdodF9leGNlcHRpb24gPSBmYWxzZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBjYXRjaCAoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQogICAgICAgICB7CkBAIC0xNjMwLDE5ICsxNzgyLDE5IEBACiAgICAgICAgIG5ld0ZhaWx1cmVEZXRlY3RvciA9ICgpIC0+IGNyZWF0ZUZhaWx1cmVEZXRlY3RvcigiRmFpbHVyZURldGVjdG9yIik7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Q29sdW1uSW5kZXhTaXplKCkKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRDb2x1bW5JbmRleFNpemUoaW50IGRlZmF1bHRWYWx1ZSkKICAgICB7Ci0gICAgICAgIHJldHVybiBjb25mLmNvbHVtbl9pbmRleF9zaXplLnRvQnl0ZXMoKTsKKyAgICAgICAgcmV0dXJuIGNvbmYuY29sdW1uX2luZGV4X3NpemUgIT0gbnVsbCA/IGNvbmYuY29sdW1uX2luZGV4X3NpemUudG9CeXRlcygpIDogZGVmYXVsdFZhbHVlOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldENvbHVtbkluZGV4U2l6ZUluS2lCKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBjb25mLmNvbHVtbl9pbmRleF9zaXplLnRvS2liaWJ5dGVzKCk7CisgICAgICAgIHJldHVybiBjb25mLmNvbHVtbl9pbmRleF9zaXplICE9IG51bGwgPyBjb25mLmNvbHVtbl9pbmRleF9zaXplLnRvS2liaWJ5dGVzKCkgOiAtMTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29sdW1uSW5kZXhTaXplKGludCB2YWwpCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbHVtbkluZGV4U2l6ZUluS2lCKGludCB2YWwpCiAgICAgewotICAgICAgICBjb25mLmNvbHVtbl9pbmRleF9zaXplID0gIGNyZWF0ZUludEtpYmlieXRlQm91bmRBbmRFbnN1cmVJdElzVmFsaWRGb3JCeXRlQ29udmVyc2lvbih2YWwsImNvbHVtbl9pbmRleF9zaXplIik7CisgICAgICAgIGNvbmYuY29sdW1uX2luZGV4X3NpemUgPSB2YWwgIT0gLTEgPyBjcmVhdGVJbnRLaWJpYnl0ZUJvdW5kQW5kRW5zdXJlSXRJc1ZhbGlkRm9yQnl0ZUNvbnZlcnNpb24odmFsLCJjb2x1bW5faW5kZXhfc2l6ZSIpIDogbnVsbDsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRDb2x1bW5JbmRleENhY2hlU2l6ZSgpCkBAIC0xNjk3LDEyICsxODQ5LDEyIEBACiAKICAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRJbml0aWFsVG9rZW5zKCkKICAgICB7Ci0gICAgICAgIHJldHVybiB0b2tlbnNGcm9tU3RyaW5nKFN5c3RlbS5nZXRQcm9wZXJ0eShDb25maWcuUFJPUEVSVFlfUFJFRklYICsgImluaXRpYWxfdG9rZW4iLCBjb25mLmluaXRpYWxfdG9rZW4pKTsKKyAgICAgICAgcmV0dXJuIHRva2Vuc0Zyb21TdHJpbmcoSU5JVElBTF9UT0tFTi5nZXRTdHJpbmcoY29uZi5pbml0aWFsX3Rva2VuKSk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWxsb2NhdGVUb2tlbnNGb3JLZXlzcGFjZSgpCiAgICAgewotICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAiYWxsb2NhdGVfdG9rZW5zX2Zvcl9rZXlzcGFjZSIsIGNvbmYuYWxsb2NhdGVfdG9rZW5zX2Zvcl9rZXlzcGFjZSk7CisgICAgICAgIHJldHVybiBBTExPQ0FURV9UT0tFTlNfRk9SX0tFWVNQQUNFLmdldFN0cmluZyhjb25mLmFsbG9jYXRlX3Rva2Vuc19mb3Jfa2V5c3BhY2UpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgSW50ZWdlciBnZXRBbGxvY2F0ZVRva2Vuc0ZvckxvY2FsUmYoKQpAQCAtMTcyOCwxMCArMTg4MCwxNCBAQAogICAgIHsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJyZXBsYWNlX2FkZHJlc3MiLCBudWxsKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBJbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlOYW1lKFN5c3RlbS5nZXRQcm9wZXJ0eShDb25maWcuUFJPUEVSVFlfUFJFRklYICsgInJlcGxhY2VfYWRkcmVzcyIsIG51bGwpKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eShDb25maWcuUFJPUEVSVFlfUFJFRklYICsgInJlcGxhY2VfYWRkcmVzc19maXJzdF9ib290IiwgbnVsbCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gSW5ldEFkZHJlc3NBbmRQb3J0LmdldEJ5TmFtZShTeXN0ZW0uZ2V0UHJvcGVydHkoQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJyZXBsYWNlX2FkZHJlc3NfZmlyc3RfYm9vdCIsIG51bGwpKTsKKyAgICAgICAgICAgIFN0cmluZyByZXBsYWNlQWRkcmVzcyA9IFJFUExBQ0VfQUREUkVTUy5nZXRTdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChyZXBsYWNlQWRkcmVzcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBJbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlOYW1lKHJlcGxhY2VBZGRyZXNzKTsKKworICAgICAgICAgICAgU3RyaW5nIHJlcGxhY2VBZGRyZXNzRmlyc3N0Qm9vdCA9IFJFUExBQ0VfQUREUkVTU19GSVJTVF9CT09ULmdldFN0cmluZygpOworICAgICAgICAgICAgaWYgKHJlcGxhY2VBZGRyZXNzRmlyc3N0Qm9vdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBJbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlOYW1lKHJlcGxhY2VBZGRyZXNzRmlyc3N0Qm9vdCk7CisKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKQpAQCAtMTc0MiwxNCArMTg5OCwxNCBAQAogCiAgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UmVwbGFjZVRva2VucygpCiAgICAgewotICAgICAgICByZXR1cm4gdG9rZW5zRnJvbVN0cmluZyhTeXN0ZW0uZ2V0UHJvcGVydHkoQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJyZXBsYWNlX3Rva2VuIiwgbnVsbCkpOworICAgICAgICByZXR1cm4gdG9rZW5zRnJvbVN0cmluZyhSRVBMQUNFX1RPS0VOLmdldFN0cmluZygpKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIFVVSUQgZ2V0UmVwbGFjZU5vZGUoKQogICAgIHsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBVVUlELmZyb21TdHJpbmcoU3lzdGVtLmdldFByb3BlcnR5KENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAicmVwbGFjZV9ub2RlIiwgbnVsbCkpOworICAgICAgICAgICAgcmV0dXJuIFVVSUQuZnJvbVN0cmluZyhSRVBMQUNFX05PREUuZ2V0U3RyaW5nKCkpOwogICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTE3NjMsMTIgKzE5MTksMTIgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFN0b3JhZ2VQb3J0KCkKICAgICB7Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KFN5c3RlbS5nZXRQcm9wZXJ0eShDb25maWcuUFJPUEVSVFlfUFJFRklYICsgInN0b3JhZ2VfcG9ydCIsIEludGVnZXIudG9TdHJpbmcoY29uZi5zdG9yYWdlX3BvcnQpKSk7CisgICAgICAgIHJldHVybiBTVE9SQUdFX1BPUlQuZ2V0SW50KGNvbmYuc3RvcmFnZV9wb3J0KTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRTU0xTdG9yYWdlUG9ydCgpCiAgICAgewotICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChTeXN0ZW0uZ2V0UHJvcGVydHkoQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJzc2xfc3RvcmFnZV9wb3J0IiwgSW50ZWdlci50b1N0cmluZyhjb25mLnNzbF9zdG9yYWdlX3BvcnQpKSk7CisgICAgICAgIHJldHVybiBTU0xfU1RPUkFHRV9QT1JULmdldEludChjb25mLnNzbF9zdG9yYWdlX3BvcnQpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBuYXRpdmVUcmFuc3BvcnRJZGxlVGltZW91dCgpCkBAIC0yMDE2LDcgKzIxNzIsMTEgQEAKICAgICAgICAgY29uZi5jb21wYWN0aW9uX3Rocm91Z2hwdXQgPSBuZXcgRGF0YVJhdGVTcGVjLkxvbmdCeXRlc1BlclNlY29uZEJvdW5kKHZhbHVlLCBNRUJJQllURVNfUEVSX1NFQ09ORCk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBsb25nIGdldENvbXBhY3Rpb25MYXJnZVBhcnRpdGlvbldhcm5pbmdUaHJlc2hvbGQoKSB7IHJldHVybiBjb25mLmNvbXBhY3Rpb25fbGFyZ2VfcGFydGl0aW9uX3dhcm5pbmdfdGhyZXNob2xkLnRvQnl0ZXNJbkxvbmcoKTsgfQorICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIHN0YXRpYyBsb25nIGdldENvbXBhY3Rpb25MYXJnZVBhcnRpdGlvbldhcm5pbmdUaHJlc2hvbGQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbmYuY29tcGFjdGlvbl9sYXJnZV9wYXJ0aXRpb25fd2FybmluZ190aHJlc2hvbGQudG9CeXRlc0luTG9uZygpOworICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldENvbXBhY3Rpb25Ub21ic3RvbmVXYXJuaW5nVGhyZXNob2xkKCkKICAgICB7CkBAIC0yMDMzLDYgKzIxOTMsMTEgQEAKICAgICAgICAgcmV0dXJuIGNvbmYuY29uY3VycmVudF92YWxpZGF0aW9uczsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRDb25jdXJyZW50SW5kZXhCdWlsZGVycygpCisgICAgeworICAgICAgICByZXR1cm4gY29uZi5jb25jdXJyZW50X2luZGV4X2J1aWxkZXJzOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb25jdXJyZW50VmFsaWRhdGlvbnMoaW50IHZhbHVlKQogICAgIHsKICAgICAgICAgdmFsdWUgPSB2YWx1ZSA+IDAgPyB2YWx1ZSA6IEludGVnZXIuTUFYX1ZBTFVFOwpAQCAtMjA0OSwxMSArMjIxNCwzMyBAQAogICAgICAgICBjb25mLmNvbmN1cnJlbnRfbWF0ZXJpYWxpemVkX3ZpZXdfYnVpbGRlcnMgPSB2YWx1ZTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0TWluRnJlZVNwYWNlUGVyRHJpdmVJbk1lYmlieXRlcygpCisgICAgeworICAgICAgICByZXR1cm4gY29uZi5taW5fZnJlZV9zcGFjZV9wZXJfZHJpdmUudG9NZWJpYnl0ZXMoKTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0TWluRnJlZVNwYWNlUGVyRHJpdmVJbkJ5dGVzKCkKICAgICB7CiAgICAgICAgIHJldHVybiBjb25mLm1pbl9mcmVlX3NwYWNlX3Blcl9kcml2ZS50b0J5dGVzSW5Mb25nKCk7CiAgICAgfQogCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIHN0YXRpYyBsb25nIHNldE1pbkZyZWVTcGFjZVBlckRyaXZlSW5NZWJpYnl0ZXMobG9uZyBtZWJpQnl0ZXMpCisgICAgeworICAgICAgICBjb25mLm1pbl9mcmVlX3NwYWNlX3Blcl9kcml2ZSA9IG5ldyBEYXRhU3RvcmFnZVNwZWMuSW50TWViaWJ5dGVzQm91bmQobWViaUJ5dGVzKTsKKyAgICAgICAgcmV0dXJuIGdldE1pbkZyZWVTcGFjZVBlckRyaXZlSW5CeXRlcygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIGdldE1heFNwYWNlRm9yQ29tcGFjdGlvbnNQZXJEcml2ZSgpCisgICAgeworICAgICAgICByZXR1cm4gY29uZi5tYXhfc3BhY2VfdXNhYmxlX2Zvcl9jb21wYWN0aW9uc19pbl9wZXJjZW50YWdlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRNYXhTcGFjZUZvckNvbXBhY3Rpb25zUGVyRHJpdmUoZG91YmxlIHBlcmNlbnRhZ2UpCisgICAgeworICAgICAgICBjb25mLm1heF9zcGFjZV91c2FibGVfZm9yX2NvbXBhY3Rpb25zX2luX3BlcmNlbnRhZ2UgPSBwZXJjZW50YWdlOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREaXNhYmxlU1RDU0luTDAoKQogICAgIHsKICAgICAgICAgcmV0dXJuIGRpc2FibGVTVENTSW5MMDsKQEAgLTI1NDgsNyArMjczNSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TmF0aXZlVHJhbnNwb3J0UG9ydCgpCiAgICAgewotICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChTeXN0ZW0uZ2V0UHJvcGVydHkoQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJuYXRpdmVfdHJhbnNwb3J0X3BvcnQiLCBJbnRlZ2VyLnRvU3RyaW5nKGNvbmYubmF0aXZlX3RyYW5zcG9ydF9wb3J0KSkpOworICAgICAgICByZXR1cm4gTkFUSVZFX1RSQU5TUE9SVF9QT1JULmdldEludChjb25mLm5hdGl2ZV90cmFuc3BvcnRfcG9ydCk7CiAgICAgfQogCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCkBAIC0yNTc4LDYgKzI3NjUsMjIgQEAKICAgICAgICAgY29uZi5uYXRpdmVfdHJhbnNwb3J0X21heF90aHJlYWRzID0gbWF4X3RocmVhZHM7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBJbnRlZ2VyIGdldE5hdGl2ZVRyYW5zcG9ydE1heEF1dGhUaHJlYWRzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb25mLm5hdGl2ZV90cmFuc3BvcnRfbWF4X2F1dGhfdGhyZWFkczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIHZhbHVlIGlzIHNldCB0byA8PSAwIGl0IHdpbGwgbW92ZSBhdXRoIHJlcXVlc3RzIHRvIHRoZSBzdGFuZGFyZCByZXF1ZXN0IHBvb2wgcmVnYXJkbGVzcyBvZiB0aGUgY3VycmVudAorICAgICAqIHNpemUgb2YgdGhlIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuRGlzcGF0Y2hlciNhdXRoRXhlY3V0b3J9J3MgYWN0aXZlIHNpemUuCisgICAgICoKKyAgICAgKiBzZWUge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5EaXNwYXRjaGVyI2Rpc3BhdGNofSBmb3IgZXhlY3V0b3Igc2VsZWN0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE5hdGl2ZVRyYW5zcG9ydE1heEF1dGhUaHJlYWRzKGludCB0aHJlYWRzKQorICAgIHsKKyAgICAgICAgY29uZi5uYXRpdmVfdHJhbnNwb3J0X21heF9hdXRoX3RocmVhZHMgPSB0aHJlYWRzOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldE5hdGl2ZVRyYW5zcG9ydE1heEZyYW1lU2l6ZSgpCiAgICAgewogICAgICAgICByZXR1cm4gY29uZi5uYXRpdmVfdHJhbnNwb3J0X21heF9mcmFtZV9zaXplLnRvQnl0ZXMoKTsKQEAgLTI5MzUsNyArMzEzOCw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdXRvQm9vdHN0cmFwKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBCb29sZWFuLnBhcnNlQm9vbGVhbihTeXN0ZW0uZ2V0UHJvcGVydHkoQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJhdXRvX2Jvb3RzdHJhcCIsIEJvb2xlYW4udG9TdHJpbmcoY29uZi5hdXRvX2Jvb3RzdHJhcCkpKTsKKyAgICAgICAgcmV0dXJuIEFVVE9fQk9PVFNUUkFQLmdldEJvb2xlYW4oY29uZi5hdXRvX2Jvb3RzdHJhcCk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEhpbnRlZEhhbmRvZmZFbmFibGVkKGJvb2xlYW4gaGludGVkSGFuZG9mZkVuYWJsZWQpCkBAIC0zMTIwLDYgKzMzMjMsMTYgQEAKICAgICAgICAgY29uZi5hdXRvX2hpbnRzX2NsZWFudXBfZW5hYmxlZCA9IHZhbHVlOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRUcmFuc2ZlckhpbnRzT25EZWNvbW1pc3Npb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbmYudHJhbnNmZXJfaGludHNfb25fZGVjb21taXNzaW9uOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRUcmFuc2ZlckhpbnRzT25EZWNvbW1pc3Npb24oYm9vbGVhbiBlbmFibGVkKQorICAgIHsKKyAgICAgICAgY29uZi50cmFuc2Zlcl9oaW50c19vbl9kZWNvbW1pc3Npb24gPSBlbmFibGVkOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0luY3JlbWVudGFsQmFja3Vwc0VuYWJsZWQoKQogICAgIHsKICAgICAgICAgcmV0dXJuIGNvbmYuaW5jcmVtZW50YWxfYmFja3VwczsKQEAgLTMxMzUsNiArMzM0OCwxMiBAQAogICAgICAgICByZXR1cm4gY29uZi5maWxlX2NhY2hlX2VuYWJsZWQ7CiAgICAgfQogCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZpbGVDYWNoZUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQorICAgIHsKKyAgICAgICAgY29uZi5maWxlX2NhY2hlX2VuYWJsZWQgPSBlbmFibGVkOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEZpbGVDYWNoZVNpemVJbk1pQigpCiAgICAgewogICAgICAgICBpZiAoY29uZi5maWxlX2NhY2hlX3NpemUgPT0gbnVsbCkKQEAgLTMzNDQsNiArMzU2MywyMSBAQAogICAgICAgICByZXR1cm4gY29uZi5zdHJlYW1fZW50aXJlX3NzdGFibGVzOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgRHVyYXRpb25TcGVjLkxvbmdNaWxsaXNlY29uZHNCb3VuZCBnZXRTdHJlYW1UcmFuc2ZlclRhc2tUaW1lb3V0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb25mLnN0cmVhbV90cmFuc2Zlcl90YXNrX3RpbWVvdXQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGdldFNraXBTdHJlYW1EaXNrU3BhY2VDaGVjaygpCisgICAgeworICAgICAgICByZXR1cm4gY29uZi5za2lwX3N0cmVhbV9kaXNrX3NwYWNlX2NoZWNrOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTa2lwU3RyZWFtRGlza1NwYWNlQ2hlY2soYm9vbGVhbiB2YWx1ZSkKKyAgICB7CisgICAgICAgIGNvbmYuc2tpcF9zdHJlYW1fZGlza19zcGFjZV9jaGVjayA9IHZhbHVlOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2FsRGF0YUNlbnRlcigpCiAgICAgewogICAgICAgICByZXR1cm4gbG9jYWxEQzsKQEAgLTM0OTcsMTEgKzM3MzEsNiBAQAogICAgICAgICByZXR1cm4gY29uZi5zY3JpcHRlZF91c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQ7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGVuYWJsZVNjcmlwdGVkVXNlckRlZmluZWRGdW5jdGlvbnMoYm9vbGVhbiBlbmFibGVTY3JpcHRlZFVzZXJEZWZpbmVkRnVuY3Rpb25zKQotICAgIHsKLSAgICAgICAgY29uZi5zY3JpcHRlZF91c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQgPSBlbmFibGVTY3JpcHRlZFVzZXJEZWZpbmVkRnVuY3Rpb25zOwotICAgIH0KLQogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbmFibGVVc2VyRGVmaW5lZEZ1bmN0aW9uc1RocmVhZHMoKQogICAgIHsKICAgICAgICAgcmV0dXJuIGNvbmYudXNlcl9kZWZpbmVkX2Z1bmN0aW9uc190aHJlYWRzX2VuYWJsZWQ7CkBAIC0zNjM0LDYgKzM4NjMsMTYgQEAKICAgICAgICAgY29uZi5jZGNfYmxvY2tfd3JpdGVzID0gdmFsOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NEQ09uUmVwYWlyRW5hYmxlZCgpCisgICAgeworICAgICAgICByZXR1cm4gY29uZi5jZGNfb25fcmVwYWlyX2VuYWJsZWQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENEQ09uUmVwYWlyRW5hYmxlZChib29sZWFuIHZhbCkKKyAgICB7CisgICAgICAgIGNvbmYuY2RjX29uX3JlcGFpcl9lbmFibGVkID0gdmFsOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENEQ0xvZ0xvY2F0aW9uKCkKICAgICB7CiAgICAgICAgIHJldHVybiBjb25mLmNkY19yYXdfZGlyZWN0b3J5OwpAQCAtNDIzOSw2ICs0NDc4LDExIEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoImRlZmF1bHRfa2V5c3BhY2VfcmYgdG8gYmUgc2V0ICglZCkgY2Fubm90IGJlIGxlc3MgdGhhbiBtaW5pbXVtX3JlcGxpY2F0aW9uX2ZhY3Rvcl9mYWlsX3RocmVzaG9sZCAoJWQpIiwgdmFsdWUsIGd1YXJkcmFpbHMuZ2V0TWluaW11bVJlcGxpY2F0aW9uRmFjdG9yRmFpbFRocmVzaG9sZCgpKSk7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoZ3VhcmRyYWlscy5nZXRNYXhpbXVtUmVwbGljYXRpb25GYWN0b3JGYWlsVGhyZXNob2xkKCkgIT0gLTEgJiYgdmFsdWUgPiBndWFyZHJhaWxzLmdldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvckZhaWxUaHJlc2hvbGQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJkZWZhdWx0X2tleXNwYWNlX3JmIHRvIGJlIHNldCAoJWQpIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gbWF4aW11bV9yZXBsaWNhdGlvbl9mYWN0b3JfZmFpbF90aHJlc2hvbGQgKCVkKSIsIHZhbHVlLCBndWFyZHJhaWxzLmdldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvckZhaWxUaHJlc2hvbGQoKSkpOworICAgICAgICB9CisKICAgICAgICAgY29uZi5kZWZhdWx0X2tleXNwYWNlX3JmID0gdmFsdWU7CiAgICAgfQogCkBAIC00NDAzLDQgKzQ2NDcsMTMwIEBACiAgICAgewogICAgICAgICBjb25mLm1pbl90cmFja2VkX3BhcnRpdGlvbl90b21ic3RvbmVfY291bnQgPSB2YWx1ZTsKICAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RHVtcEhlYXBPblVuY2F1Z2h0RXhjZXB0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb25mLmR1bXBfaGVhcF9vbl91bmNhdWdodF9leGNlcHRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBXaGV0aGVyIHRoZSBwYXRoIGV4aXN0cyAoYmUgaXQgY3JlYXRlZCBub3cgb3IgYWxyZWFkeSBwcmlvcikKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1heWJlQ3JlYXRlSGVhcER1bXBQYXRoKCkKKyAgICB7CisgICAgICAgIGlmICghY29uZi5kdW1wX2hlYXBfb25fdW5jYXVnaHRfZXhjZXB0aW9uKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIFBhdGggaGVhcF9kdW1wX3BhdGggPSBnZXRIZWFwRHVtcFBhdGgoKTsKKyAgICAgICAgaWYgKGhlYXBfZHVtcF9wYXRoID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCJOZWl0aGVyIC1YWDpIZWFwRHVtcFBhdGggbm9yIGNhc3NhbmRyYS55YW1sOmhlYXBfZHVtcF9wYXRoIGFyZSBzZXQ7IHVuYWJsZSB0byBjcmVhdGUgYSBkaXJlY3RvcnkgdG8gaG9sZCB0aGUgb3V0cHV0LiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChQYXRoVXRpbHMuZXhpc3RzKEZpbGUuZ2V0UGF0aChjb25mLmhlYXBfZHVtcF9wYXRoKSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFBhdGhVdGlscy5jcmVhdGVEaXJlY3RvcnlJZk5vdEV4aXN0cyhGaWxlLmdldFBhdGgoY29uZi5oZWFwX2R1bXBfcGF0aCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzIHRoaXMgaXMgYXQgaXRzIGhlYXJ0IGEgZGVidWcgb3BlcmF0aW9uIChnZXR0aW5nIGEgb25lLXNob3QgaGVhcGR1bXAgZnJvbSBhbiB1bmNhdWdodCBleGNlcHRpb24pLCB3ZSBzdXBwb3J0CisgICAgICogYm90aCB0aGUgbW9yZSBldm9sdmVkIGNhc3NhbmRyYS55YW1sIGFwcHJvYWNoIGJ1dCBhbHNvIHRoZSAtWFggcGFyYW0gdG8gb3ZlcnJpZGUgaXQgb24gYSBvbmUtb2ZmIGJhc2lzIHNvIHlvdSBkb24ndAorICAgICAqIGhhdmUgdG8gY2hhbmdlIHRoZSBmdWxsIGNvbmZpZyBvZiBhIG5vZGUgb3IgYSBjbHVzdGVyIGluIG9yZGVyIHRvIGdldCBhIGhlYXAgZHVtcCBmcm9tIGEgc2luZ2xlIG5vZGUgdGhhdCdzCisgICAgICogbWlzYmVoYXZpbmcuCisgICAgICogQHJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgLVhYIHBhcmFtIGlmIHByb3ZpZGVkLCBlbHNlIHRoZSBoZWFwX2R1bXBfcGF0aCBpbiBjYXNzYW5kcmEueWFtbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGF0aCBnZXRIZWFwRHVtcFBhdGgoKQorICAgIHsKKyAgICAgICAgUnVudGltZU1YQmVhbiBydW50aW1lTXhCZWFuID0gTWFuYWdlbWVudEZhY3RvcnkuZ2V0UnVudGltZU1YQmVhbigpOworICAgICAgICBPcHRpb25hbDxTdHJpbmc+IHBhdGhBcmcgPSBydW50aW1lTXhCZWFuLmdldElucHV0QXJndW1lbnRzKCkuc3RyZWFtKCkuZmlsdGVyKHMgLT4gcy5zdGFydHNXaXRoKCItWFg6SGVhcER1bXBQYXRoPSIpKS5maW5kRmlyc3QoKTsKKworICAgICAgICBpZiAocGF0aEFyZy5pc1ByZXNlbnQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgUGF0dGVybiBIRUFQX0RVTVBfUEFUSF9TUExJVFRFUiA9IFBhdHRlcm4uY29tcGlsZSgiSGVhcER1bXBQYXRoPSIpOworICAgICAgICAgICAgU3RyaW5nIGZ1bGxIZWFwUGF0aFN0cmluZyA9IEhFQVBfRFVNUF9QQVRIX1NQTElUVEVSLnNwbGl0KHBhdGhBcmcuZ2V0KCkpWzFdOworICAgICAgICAgICAgUGF0aCBhYnNvbHV0ZVBhdGggPSBGaWxlLmdldFBhdGgoZnVsbEhlYXBQYXRoU3RyaW5nKS50b0Fic29sdXRlUGF0aCgpOworICAgICAgICAgICAgUGF0aCBiYXNlUGF0aCA9IGZ1bGxIZWFwUGF0aFN0cmluZy5lbmRzV2l0aCgiLmhwcm9mIikgPyBhYnNvbHV0ZVBhdGguc3VicGF0aCgwLCBhYnNvbHV0ZVBhdGguZ2V0TmFtZUNvdW50KCkgLSAxKSA6IGFic29sdXRlUGF0aDsKKyAgICAgICAgICAgIHJldHVybiBGaWxlLmdldFBhdGgoIi8iKS5yZXNvbHZlKGJhc2VQYXRoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29uZi5oZWFwX2R1bXBfcGF0aCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIkF0dGVtcHRlZCB0byBnZXQgaGVhcCBkdW1wIHBhdGggd2l0aG91dCAtWFg6SGVhcER1bXBQYXRoIG9yIGNhc3NhbmRyYS55YW1sOmhlYXBfZHVtcF9wYXRoIHNldC4iKTsKKyAgICAgICAgcmV0dXJuIEZpbGUuZ2V0UGF0aChjb25mLmhlYXBfZHVtcF9wYXRoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RHVtcEhlYXBPblVuY2F1Z2h0RXhjZXB0aW9uKGJvb2xlYW4gZW5hYmxlZCkKKyAgICB7CisgICAgICAgIGNvbmYuZHVtcF9oZWFwX29uX3VuY2F1Z2h0X2V4Y2VwdGlvbiA9IGVuYWJsZWQ7CisgICAgICAgIGJvb2xlYW4gcGF0aEV4aXN0cyA9IG1heWJlQ3JlYXRlSGVhcER1bXBQYXRoKCk7CisKKyAgICAgICAgaWYgKGVuYWJsZWQgJiYgIXBhdGhFeGlzdHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiQXR0ZW1wdGVkIHRvIGVuYWJsZSBoZWFwIGR1bXAgYnV0IGNhbm5vdCBjcmVhdGUgdGhlIHJlcXVlc3RlZCBwYXRoLiBEaXNhYmxpbmcuIik7CisgICAgICAgICAgICBjb25mLmR1bXBfaGVhcF9vbl91bmNhdWdodF9leGNlcHRpb24gPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBsb2dnZXIuaW5mbygiU2V0dGluZyBkdW1wX2hlYXBfb25fdW5jYXVnaHRfZXhjZXB0aW9uIHRvIHt9IiwgZW5hYmxlZCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGdldFNTdGFibGVSZWFkUmF0ZVBlcnNpc3RlbmNlRW5hYmxlZCgpCisgICAgeworICAgICAgICByZXR1cm4gY29uZi5zc3RhYmxlX3JlYWRfcmF0ZV9wZXJzaXN0ZW5jZV9lbmFibGVkOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTU3RhYmxlUmVhZFJhdGVQZXJzaXN0ZW5jZUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQorICAgIHsKKyAgICAgICAgaWYgKGVuYWJsZWQgIT0gY29uZi5zc3RhYmxlX3JlYWRfcmF0ZV9wZXJzaXN0ZW5jZV9lbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICBsb2dnZXIuaW5mbygiU2V0dGluZyBzc3RhYmxlX3JlYWRfcmF0ZV9wZXJzaXN0ZW5jZV9lbmFibGVkIHRvIHt9IiwgZW5hYmxlZCk7CisgICAgICAgICAgICBjb25mLnNzdGFibGVfcmVhZF9yYXRlX3BlcnNpc3RlbmNlX2VuYWJsZWQgPSBlbmFibGVkOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGdldENsaWVudFJlcXVlc3RTaXplTWV0cmljc0VuYWJsZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbmYuY2xpZW50X3JlcXVlc3Rfc2l6ZV9tZXRyaWNzX2VuYWJsZWQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENsaWVudFJlcXVlc3RTaXplTWV0cmljc0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQorICAgIHsKKyAgICAgICAgY29uZi5jbGllbnRfcmVxdWVzdF9zaXplX21ldHJpY3NfZW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgfQorCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0U1NUYWJsZUZvcm1hdHMoSXRlcmFibGU8U1NUYWJsZUZvcm1hdC5GYWN0b3J5PiBmYWN0b3JpZXMsIENvbmZpZy5TU1RhYmxlQ29uZmlnIGNvbmZpZykKKyAgICB7CisgICAgICAgIHNzdGFibGVGb3JtYXRzID0gbnVsbDsKKyAgICAgICAgc2VsZWN0ZWRTU1RhYmxlRm9ybWF0ID0gbnVsbDsKKyAgICAgICAgYXBwbHlTU1RhYmxlRm9ybWF0cyhmYWN0b3JpZXMsIGNvbmZpZyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBJbW11dGFibGVNYXA8U3RyaW5nLCBTU1RhYmxlRm9ybWF0PD8sID8+PiBnZXRTU1RhYmxlRm9ybWF0cygpCisgICAgeworICAgICAgICByZXR1cm4gT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChzc3RhYmxlRm9ybWF0cywgIkZvcmdvdCB0byBpbml0aWFsaXplIERhdGFiYXNlRGVzY3JpcHRvcj8iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVGb3JtYXQ8PywgPz4gZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBPYmplY3RzLnJlcXVpcmVOb25OdWxsKHNlbGVjdGVkU1NUYWJsZUZvcm1hdCwgIkZvcmdvdCB0byBpbml0aWFsaXplIERhdGFiYXNlRGVzY3JpcHRvcj8iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RHluYW1pY0RhdGFNYXNraW5nRW5hYmxlZCgpCisgICAgeworICAgICAgICByZXR1cm4gY29uZi5keW5hbWljX2RhdGFfbWFza2luZ19lbmFibGVkOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXREeW5hbWljRGF0YU1hc2tpbmdFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkKKyAgICB7CisgICAgICAgIGlmIChlbmFibGVkICE9IGNvbmYuZHluYW1pY19kYXRhX21hc2tpbmdfZW5hYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlNldHRpbmcgZHluYW1pY19kYXRhX21hc2tpbmdfZW5hYmxlZCB0byB7fSIsIGVuYWJsZWQpOworICAgICAgICAgICAgY29uZi5keW5hbWljX2RhdGFfbWFza2luZ19lbmFibGVkID0gZW5hYmxlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxEb3VibGUgZ2V0U2V2ZXJpdHlEdXJpbmdEZWNvbW1pc3Npb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbmYuc2V2ZXJpdHlfZHVyaW5nX2RlY29tbWlzc2lvbiA+IDAgPworICAgICAgICAgICAgICAgT3B0aW9uYWxEb3VibGUub2YoY29uZi5zZXZlcml0eV9kdXJpbmdfZGVjb21taXNzaW9uKSA6CisgICAgICAgICAgICAgICBPcHRpb25hbERvdWJsZS5lbXB0eSgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9EdXJhdGlvblNwZWMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9EdXJhdGlvblNwZWMuamF2YQppbmRleCAxMGQ1NmMyLi4yNTIyZDg2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvRHVyYXRpb25TcGVjLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0R1cmF0aW9uU3BlYy5qYXZhCkBAIC0yNzMsNiArMjczLDY0IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIGR1cmF0aW9uIHVzZWQgZm9yIENhc3NhbmRyYSBjb25maWd1cmF0aW9uLiBUaGUgYm91bmQgaXMgWzAsIExvbmcuTUFYX1ZBTFVFKSBpbiBtaWNyb3NlY29uZHMuCisgICAgICogSWYgdGhlIHVzZXIgc2V0cyBhIGRpZmZlcmVudCB1bml0IC0gd2Ugc3RpbGwgdmFsaWRhdGUgdGhhdCBjb252ZXJ0ZWQgdG8gbWljcm9zZWNvbmRzIHRoZSBxdWFudGl0eSB3aWxsIG5vdCBleGNlZWQKKyAgICAgKiB0aGF0IHVwcGVyIGJvdW5kLiAoQ0FTU0FORFJBLTE3NTcxKQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2xhc3MgTG9uZ01pY3Jvc2Vjb25kc0JvdW5kIGV4dGVuZHMgRHVyYXRpb25TcGVjCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIHtAY29kZSBEdXJhdGlvblNwZWMuTG9uZ01pY3Jvc2Vjb25kc0JvdW5kfSBvZiB0aGUgc3BlY2lmaWVkIGFtb3VudC4KKyAgICAgICAgICogVGhlIGJvdW5kIGlzIFswLCBMb25nLk1BWF9WQUxVRSkgaW4gbWljcm9zZWNvbmRzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGR1cmF0aW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTG9uZ01pY3Jvc2Vjb25kc0JvdW5kKFN0cmluZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIodmFsdWUsIE1JQ1JPU0VDT05EUywgTG9uZy5NQVhfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSB7QGNvZGUgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZH0gb2YgdGhlIHNwZWNpZmllZCBhbW91bnQgaW4gdGhlIHNwZWNpZmllZCB1bml0LgorICAgICAgICAgKiBUaGUgYm91bmQgaXMgWzAsIExvbmcuTUFYX1ZBTFVFKSBpbiBtaWxsaXNlY29uZHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBxdWFudGl0eSB3aGVyZSBxdWFudGl0eSBzaG91bGRuJ3QgYmUgYmlnZ2VyIHRoYW4gTG9uZy5NQVhfVkFMVUUgLSAxIGluIG1pY3Jvc2Vjb25kcworICAgICAgICAgKiBAcGFyYW0gdW5pdCBpbiB3aGljaCB0aGUgcHJvdmlkZWQgcXVhbnRpdHkgaXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBMb25nTWljcm9zZWNvbmRzQm91bmQobG9uZyBxdWFudGl0eSwgVGltZVVuaXQgdW5pdCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIocXVhbnRpdHksIHVuaXQsIE1JQ1JPU0VDT05EUywgTG9uZy5NQVhfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSB7QGNvZGUgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZH0gb2YgdGhlIHNwZWNpZmllZCBhbW91bnQgaW4gbWljcm9zZWNvbmRzLgorICAgICAgICAgKiBUaGUgYm91bmQgaXMgWzAsIExvbmcuTUFYX1ZBTFVFKSBpbiBtaWNyb3NlY29uZHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtaWNyb3NlY29uZHMgd2hlcmUgbWlsbGlzZWNvbmRzIHNob3VsZG4ndCBiZSBiaWdnZXIgdGhhbiBMb25nLk1BWF9WQUxVRS0xCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTG9uZ01pY3Jvc2Vjb25kc0JvdW5kKGxvbmcgbWljcm9zZWNvbmRzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzKG1pY3Jvc2Vjb25kcywgTUlDUk9TRUNPTkRTKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMgZHVyYXRpb24gaW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGxvbmcgdG9NaWNyb3NlY29uZHMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdW5pdCgpLnRvTWljcm9zKHF1YW50aXR5KCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhpcyBkdXJhdGlvbiBpbiBudW1iZXIgb2Ygc2Vjb25kcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGxvbmcgdG9TZWNvbmRzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHVuaXQoKS50b1NlY29uZHMocXVhbnRpdHkoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXByZXNlbnRzIGEgZHVyYXRpb24gdXNlZCBmb3IgQ2Fzc2FuZHJhIGNvbmZpZ3VyYXRpb24uIFRoZSBib3VuZCBpcyBbMCwgTG9uZy5NQVhfVkFMVUUpIGluIG1pbGxpc2Vjb25kcy4KICAgICAgKiBJZiB0aGUgdXNlciBzZXRzIGEgZGlmZmVyZW50IHVuaXQgLSB3ZSBzdGlsbCB2YWxpZGF0ZSB0aGF0IGNvbnZlcnRlZCB0byBtaWxsaXNlY29uZHMgdGhlIHF1YW50aXR5IHdpbGwgbm90IGV4Y2VlZAogICAgICAqIHRoYXQgdXBwZXIgYm91bmQuIChDQVNTQU5EUkEtMTc1NzEpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvRW5jcnlwdGlvbk9wdGlvbnMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9FbmNyeXB0aW9uT3B0aW9ucy5qYXZhCmluZGV4IDI2MTBmZjYuLmFmYTBkNjYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9FbmNyeXB0aW9uT3B0aW9ucy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9FbmNyeXB0aW9uT3B0aW9ucy5qYXZhCkBAIC0zMyw3ICszMyw2IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAotaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25JZ25vcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JRW5kcG9pbnRTbml0Y2g7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VjdXJpdHkuRGlzYWJsZVNzbENvbnRleHRGYWN0b3J5OwpAQCAtMTEwLDYgKzEwOSw4IEBACiAgICAgewogICAgICAgICBLRVlTVE9SRSgia2V5c3RvcmUiKSwKICAgICAgICAgS0VZU1RPUkVfUEFTU1dPUkQoImtleXN0b3JlX3Bhc3N3b3JkIiksCisgICAgICAgIE9VVEJPVU5EX0tFWVNUT1JFKCJvdXRib3VuZF9rZXlzdG9yZSIpLAorICAgICAgICBPVVRCT1VORF9LRVlTVE9SRV9QQVNTV09SRCgib3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQiKSwKICAgICAgICAgVFJVU1RTVE9SRSgidHJ1c3RzdG9yZSIpLAogICAgICAgICBUUlVTVFNUT1JFX1BBU1NXT1JEKCJ0cnVzdHN0b3JlX3Bhc3N3b3JkIiksCiAgICAgICAgIENJUEhFUl9TVUlURVMoImNpcGhlcl9zdWl0ZXMiKSwKQEAgLTI2MiwxMSArMjYzLDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplU3NsQ29udGV4dEZhY3RvcnkoKQorICAgIHByb3RlY3RlZCB2b2lkIGZpbGxTc2xDb250ZXh0UGFyYW1zKE1hcDxTdHJpbmcsIE9iamVjdD4gc3NsQ29udGV4dEZhY3RvcnlQYXJhbWV0ZXJzKQogICAgIHsKLSAgICAgICAgTWFwPFN0cmluZyxPYmplY3Q+IHNzbENvbnRleHRGYWN0b3J5UGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgcHJlcGFyZVNzbENvbnRleHRGYWN0b3J5UGFyYW1ldGVyaXplZEtleXMoc3NsQ29udGV4dEZhY3RvcnlQYXJhbWV0ZXJzKTsKLQogICAgICAgICAvKgogICAgICAgICAgKiBDb3B5IGFsbCBjb25maWdzIHRvIHRoZSBNYXAgdG8gcGFzcyBpdCBvbiB0byB0aGUgSVNzbENvbnRleHRGYWN0b3J5J3MgaW1wbGVtZW50YXRpb24KICAgICAgICAgICovCkBAIC0yODMsNiArMjgxLDEzIEBACiAgICAgICAgIHB1dFNzbENvbnRleHRGYWN0b3J5UGFyYW1ldGVyKHNzbENvbnRleHRGYWN0b3J5UGFyYW1ldGVycywgQ29uZmlnS2V5LlJFUVVJUkVfRU5EUE9JTlRfVkVSSUZJQ0FUSU9OLCB0aGlzLnJlcXVpcmVfZW5kcG9pbnRfdmVyaWZpY2F0aW9uKTsKICAgICAgICAgcHV0U3NsQ29udGV4dEZhY3RvcnlQYXJhbWV0ZXIoc3NsQ29udGV4dEZhY3RvcnlQYXJhbWV0ZXJzLCBDb25maWdLZXkuRU5BQkxFRCwgdGhpcy5lbmFibGVkKTsKICAgICAgICAgcHV0U3NsQ29udGV4dEZhY3RvcnlQYXJhbWV0ZXIoc3NsQ29udGV4dEZhY3RvcnlQYXJhbWV0ZXJzLCBDb25maWdLZXkuT1BUSU9OQUwsIHRoaXMub3B0aW9uYWwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplU3NsQ29udGV4dEZhY3RvcnkoKQorICAgIHsKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBzc2xDb250ZXh0RmFjdG9yeVBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIHByZXBhcmVTc2xDb250ZXh0RmFjdG9yeVBhcmFtZXRlcml6ZWRLZXlzKHNzbENvbnRleHRGYWN0b3J5UGFyYW1ldGVycyk7CisgICAgICAgIGZpbGxTc2xDb250ZXh0UGFyYW1zKHNzbENvbnRleHRGYWN0b3J5UGFyYW1ldGVycyk7CiAKICAgICAgICAgaWYgKENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0pWTV9EVEVTVF9ESVNBQkxFX1NTTC5nZXRCb29sZWFuKCkpCiAgICAgICAgIHsKQEAgLTI5NSw4ICszMDAsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHB1dFNzbENvbnRleHRGYWN0b3J5UGFyYW1ldGVyKE1hcDxTdHJpbmcsT2JqZWN0PiBleGlzdGluZ1BhcmFtZXRlcnMsIENvbmZpZ0tleSBjb25maWdLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSkKKyAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcHV0U3NsQ29udGV4dEZhY3RvcnlQYXJhbWV0ZXIoTWFwPFN0cmluZywgT2JqZWN0PiBleGlzdGluZ1BhcmFtZXRlcnMsIENvbmZpZ0tleSBjb25maWdLZXksIE9iamVjdCB2YWx1ZSkKICAgICB7CiAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBleGlzdGluZ1BhcmFtZXRlcnMucHV0KGNvbmZpZ0tleS5nZXRLZXlOYW1lKCksIHZhbHVlKTsKQEAgLTYwNywxNSArNjExLDIxIEBACiAgICAgICAgIHB1YmxpYyBmaW5hbCBJbnRlcm5vZGVFbmNyeXB0aW9uIGludGVybm9kZV9lbmNyeXB0aW9uOwogICAgICAgICBAUmVwbGFjZXMob2xkTmFtZSA9ICJlbmFibGVfbGVnYWN5X3NzbF9zdG9yYWdlX3BvcnQiLCBkZXByZWNhdGVkID0gdHJ1ZSkKICAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gbGVnYWN5X3NzbF9zdG9yYWdlX3BvcnRfZW5hYmxlZDsKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBvdXRib3VuZF9rZXlzdG9yZTsKKyAgICAgICAgQE51bGxhYmxlCisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgb3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQ7CiAKICAgICAgICAgcHVibGljIFNlcnZlckVuY3J5cHRpb25PcHRpb25zKCkKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy5pbnRlcm5vZGVfZW5jcnlwdGlvbiA9IEludGVybm9kZUVuY3J5cHRpb24ubm9uZTsKICAgICAgICAgICAgIHRoaXMubGVnYWN5X3NzbF9zdG9yYWdlX3BvcnRfZW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgdGhpcy5vdXRib3VuZF9rZXlzdG9yZSA9IG51bGw7CisgICAgICAgICAgICB0aGlzLm91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkID0gbnVsbDsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhQYXJhbWV0ZXJpemVkQ2xhc3Mgc3NsQ29udGV4dEZhY3RvcnlDbGFzcywgU3RyaW5nIGtleXN0b3JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleXN0b3JlX3Bhc3N3b3JkLCBTdHJpbmcgdHJ1c3RzdG9yZSwgU3RyaW5nIHRydXN0c3RvcmVfcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5c3RvcmVfcGFzc3dvcmQsU3RyaW5nIG91dGJvdW5kX2tleXN0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkLCBTdHJpbmcgdHJ1c3RzdG9yZSwgU3RyaW5nIHRydXN0c3RvcmVfcGFzc3dvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gY2lwaGVyX3N1aXRlcywgU3RyaW5nIHByb3RvY29sLCBMaXN0PFN0cmluZz4gYWNjZXB0ZWRfcHJvdG9jb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFsZ29yaXRobSwgU3RyaW5nIHN0b3JlX3R5cGUsIGJvb2xlYW4gcmVxdWlyZV9jbGllbnRfYXV0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24sIEJvb2xlYW4gb3B0aW9uYWwsCkBAIC02MjYsNiArNjM2LDggQEAKICAgICAgICAgICAgIG51bGwsIG9wdGlvbmFsKTsKICAgICAgICAgICAgIHRoaXMuaW50ZXJub2RlX2VuY3J5cHRpb24gPSBpbnRlcm5vZGVfZW5jcnlwdGlvbjsKICAgICAgICAgICAgIHRoaXMubGVnYWN5X3NzbF9zdG9yYWdlX3BvcnRfZW5hYmxlZCA9IGxlZ2FjeV9zc2xfc3RvcmFnZV9wb3J0X2VuYWJsZWQ7CisgICAgICAgICAgICB0aGlzLm91dGJvdW5kX2tleXN0b3JlID0gb3V0Ym91bmRfa2V5c3RvcmU7CisgICAgICAgICAgICB0aGlzLm91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkID0gb3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQ7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgb3B0aW9ucykKQEAgLTYzMyw2ICs2NDUsMTYgQEAKICAgICAgICAgICAgIHN1cGVyKG9wdGlvbnMpOwogICAgICAgICAgICAgdGhpcy5pbnRlcm5vZGVfZW5jcnlwdGlvbiA9IG9wdGlvbnMuaW50ZXJub2RlX2VuY3J5cHRpb247CiAgICAgICAgICAgICB0aGlzLmxlZ2FjeV9zc2xfc3RvcmFnZV9wb3J0X2VuYWJsZWQgPSBvcHRpb25zLmxlZ2FjeV9zc2xfc3RvcmFnZV9wb3J0X2VuYWJsZWQ7CisgICAgICAgICAgICB0aGlzLm91dGJvdW5kX2tleXN0b3JlID0gb3B0aW9ucy5vdXRib3VuZF9rZXlzdG9yZTsKKyAgICAgICAgICAgIHRoaXMub3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQgPSBvcHRpb25zLm91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGZpbGxTc2xDb250ZXh0UGFyYW1zKE1hcDxTdHJpbmcsIE9iamVjdD4gc3NsQ29udGV4dEZhY3RvcnlQYXJhbWV0ZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlci5maWxsU3NsQ29udGV4dFBhcmFtcyhzc2xDb250ZXh0RmFjdG9yeVBhcmFtZXRlcnMpOworICAgICAgICAgICAgcHV0U3NsQ29udGV4dEZhY3RvcnlQYXJhbWV0ZXIoc3NsQ29udGV4dEZhY3RvcnlQYXJhbWV0ZXJzLCBDb25maWdLZXkuT1VUQk9VTkRfS0VZU1RPUkUsIHRoaXMub3V0Ym91bmRfa2V5c3RvcmUpOworICAgICAgICAgICAgcHV0U3NsQ29udGV4dEZhY3RvcnlQYXJhbWV0ZXIoc3NsQ29udGV4dEZhY3RvcnlQYXJhbWV0ZXJzLCBDb25maWdLZXkuT1VUQk9VTkRfS0VZU1RPUkVfUEFTU1dPUkQsIHRoaXMub3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC02OTYsNyArNzE4LDYgQEAKICAgICAgICAgICogdmFsdWVzIG9mICJkYyIgYW5kICJhbGwiLiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBleHBsaWNpdCwgcmF3IHZhbHVlIG9mIHtAbGluayAjb3B0aW9uYWx9CiAgICAgICAgICAqIGFzIHNldCBieSB0aGUgdXNlciAoaWYgc2V0IGF0IGFsbCkuCiAgICAgICAgICAqLwotICAgICAgICBASnNvbklnbm9yZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0V4cGxpY2l0bHlPcHRpb25hbCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBvcHRpb25hbCAhPSBudWxsICYmIG9wdGlvbmFsOwpAQCAtNzA0LDcgKzcyNSw4IEBACiAKICAgICAgICAgcHVibGljIFNlcnZlckVuY3J5cHRpb25PcHRpb25zIHdpdGhTc2xDb250ZXh0RmFjdG9yeShQYXJhbWV0ZXJpemVkQ2xhc3Mgc3NsQ29udGV4dEZhY3RvcnlDbGFzcykKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhzc2xDb250ZXh0RmFjdG9yeUNsYXNzLCBrZXlzdG9yZSwga2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCisgICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbENvbnRleHRGYWN0b3J5Q2xhc3MsIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Ym91bmRfa2V5c3RvcmUsIG91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkLCB0cnVzdHN0b3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdHN0b3JlX3Bhc3N3b3JkLCBjaXBoZXJfc3VpdGVzLCBwcm90b2NvbCwgYWNjZXB0ZWRfcHJvdG9jb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG0sIHN0b3JlX3R5cGUsIHJlcXVpcmVfY2xpZW50X2F1dGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfZW5kcG9pbnRfdmVyaWZpY2F0aW9uLCBvcHRpb25hbCwgaW50ZXJub2RlX2VuY3J5cHRpb24sCkBAIC03MTMsNyArNzM1LDggQEAKIAogICAgICAgICBwdWJsaWMgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgd2l0aEtleVN0b3JlKFN0cmluZyBrZXlzdG9yZSkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhzc2xfY29udGV4dF9mYWN0b3J5LCBrZXlzdG9yZSwga2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCisgICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Ym91bmRfa2V5c3RvcmUsIG91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkLCB0cnVzdHN0b3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdHN0b3JlX3Bhc3N3b3JkLCBjaXBoZXJfc3VpdGVzLCBwcm90b2NvbCwgYWNjZXB0ZWRfcHJvdG9jb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG0sIHN0b3JlX3R5cGUsIHJlcXVpcmVfY2xpZW50X2F1dGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfZW5kcG9pbnRfdmVyaWZpY2F0aW9uLCBvcHRpb25hbCwgaW50ZXJub2RlX2VuY3J5cHRpb24sCkBAIC03MjIsNyArNzQ1LDggQEAKIAogICAgICAgICBwdWJsaWMgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgd2l0aEtleVN0b3JlUGFzc3dvcmQoU3RyaW5nIGtleXN0b3JlX3Bhc3N3b3JkKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwgdHJ1c3RzdG9yZSwKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoc3NsX2NvbnRleHRfZmFjdG9yeSwga2V5c3RvcmUsIGtleXN0b3JlX3Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRib3VuZF9rZXlzdG9yZSwgb3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0c3RvcmVfcGFzc3dvcmQsIGNpcGhlcl9zdWl0ZXMsIHByb3RvY29sLCBhY2NlcHRlZF9wcm90b2NvbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobSwgc3RvcmVfdHlwZSwgcmVxdWlyZV9jbGllbnRfYXV0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24sIG9wdGlvbmFsLCBpbnRlcm5vZGVfZW5jcnlwdGlvbiwKQEAgLTczMSw3ICs3NTUsOCBAQAogCiAgICAgICAgIHB1YmxpYyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyB3aXRoVHJ1c3RTdG9yZShTdHJpbmcgdHJ1c3RzdG9yZSkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhzc2xfY29udGV4dF9mYWN0b3J5LCBrZXlzdG9yZSwga2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCisgICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Ym91bmRfa2V5c3RvcmUsIG91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkLCB0cnVzdHN0b3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdHN0b3JlX3Bhc3N3b3JkLCBjaXBoZXJfc3VpdGVzLCBwcm90b2NvbCwgYWNjZXB0ZWRfcHJvdG9jb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG0sIHN0b3JlX3R5cGUsIHJlcXVpcmVfY2xpZW50X2F1dGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfZW5kcG9pbnRfdmVyaWZpY2F0aW9uLCBvcHRpb25hbCwgaW50ZXJub2RlX2VuY3J5cHRpb24sCkBAIC03NDAsNyArNzY1LDggQEAKIAogICAgICAgICBwdWJsaWMgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgd2l0aFRydXN0U3RvcmVQYXNzd29yZChTdHJpbmcgdHJ1c3RzdG9yZV9wYXNzd29yZCkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhzc2xfY29udGV4dF9mYWN0b3J5LCBrZXlzdG9yZSwga2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCisgICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Ym91bmRfa2V5c3RvcmUsIG91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkLCB0cnVzdHN0b3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdHN0b3JlX3Bhc3N3b3JkLCBjaXBoZXJfc3VpdGVzLCBwcm90b2NvbCwgYWNjZXB0ZWRfcHJvdG9jb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG0sIHN0b3JlX3R5cGUsIHJlcXVpcmVfY2xpZW50X2F1dGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfZW5kcG9pbnRfdmVyaWZpY2F0aW9uLCBvcHRpb25hbCwgaW50ZXJub2RlX2VuY3J5cHRpb24sCkBAIC03NDksMTYgKzc3NSwxOCBAQAogCiAgICAgICAgIHB1YmxpYyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyB3aXRoQ2lwaGVyU3VpdGVzKExpc3Q8U3RyaW5nPiBjaXBoZXJfc3VpdGVzKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwgdHJ1c3RzdG9yZSwKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoc3NsX2NvbnRleHRfZmFjdG9yeSwga2V5c3RvcmUsIGtleXN0b3JlX3Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRib3VuZF9rZXlzdG9yZSwgb3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0c3RvcmVfcGFzc3dvcmQsIGNpcGhlcl9zdWl0ZXMsIHByb3RvY29sLCBhY2NlcHRlZF9wcm90b2NvbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobSwgc3RvcmVfdHlwZSwgcmVxdWlyZV9jbGllbnRfYXV0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24sIG9wdGlvbmFsLCBpbnRlcm5vZGVfZW5jcnlwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5X3NzbF9zdG9yYWdlX3BvcnRfZW5hYmxlZCkuYXBwbHlDb25maWdJbnRlcm5hbCgpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIFNlcnZlckVuY3J5cHRpb25PcHRpb25zIHdpdGhDaXBoZXJTdWl0ZXMoU3RyaW5nIC4uLiBjaXBoZXJfc3VpdGVzKQorICAgICAgICBwdWJsaWMgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgd2l0aENpcGhlclN1aXRlcyhTdHJpbmcuLi4gY2lwaGVyX3N1aXRlcykKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhzc2xfY29udGV4dF9mYWN0b3J5LCBrZXlzdG9yZSwga2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCisgICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Ym91bmRfa2V5c3RvcmUsIG91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkLCB0cnVzdHN0b3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdHN0b3JlX3Bhc3N3b3JkLCBBcnJheXMuYXNMaXN0KGNpcGhlcl9zdWl0ZXMpLCBwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0ZWRfcHJvdG9jb2xzLCBhbGdvcml0aG0sIHN0b3JlX3R5cGUsIHJlcXVpcmVfY2xpZW50X2F1dGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfZW5kcG9pbnRfdmVyaWZpY2F0aW9uLCBvcHRpb25hbCwgaW50ZXJub2RlX2VuY3J5cHRpb24sCkBAIC03NjcsNyArNzk1LDggQEAKIAogICAgICAgICBwdWJsaWMgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgd2l0aFByb3RvY29sKFN0cmluZyBwcm90b2NvbCkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhzc2xfY29udGV4dF9mYWN0b3J5LCBrZXlzdG9yZSwga2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCisgICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Ym91bmRfa2V5c3RvcmUsIG91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkLCB0cnVzdHN0b3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdHN0b3JlX3Bhc3N3b3JkLCBjaXBoZXJfc3VpdGVzLCBwcm90b2NvbCwgYWNjZXB0ZWRfcHJvdG9jb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG0sIHN0b3JlX3R5cGUsIHJlcXVpcmVfY2xpZW50X2F1dGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfZW5kcG9pbnRfdmVyaWZpY2F0aW9uLCBvcHRpb25hbCwgaW50ZXJub2RlX2VuY3J5cHRpb24sCkBAIC03NzYsNyArODA1LDggQEAKIAogICAgICAgICBwdWJsaWMgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgd2l0aEFjY2VwdGVkUHJvdG9jb2xzKExpc3Q8U3RyaW5nPiBhY2NlcHRlZF9wcm90b2NvbHMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoc3NsX2NvbnRleHRfZmFjdG9yeSwga2V5c3RvcmUsIGtleXN0b3JlX3Bhc3N3b3JkLCB0cnVzdHN0b3JlLAorICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhzc2xfY29udGV4dF9mYWN0b3J5LCBrZXlzdG9yZSwga2V5c3RvcmVfcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGJvdW5kX2tleXN0b3JlLCBvdXRib3VuZF9rZXlzdG9yZV9wYXNzd29yZCwgdHJ1c3RzdG9yZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RzdG9yZV9wYXNzd29yZCwgY2lwaGVyX3N1aXRlcywgcHJvdG9jb2wsIGFjY2VwdGVkX3Byb3RvY29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxnb3JpdGhtLCBzdG9yZV90eXBlLCByZXF1aXJlX2NsaWVudF9hdXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlX2VuZHBvaW50X3ZlcmlmaWNhdGlvbiwgb3B0aW9uYWwsIGludGVybm9kZV9lbmNyeXB0aW9uLApAQCAtNzg1LDcgKzgxNSw4IEBACiAKICAgICAgICAgcHVibGljIFNlcnZlckVuY3J5cHRpb25PcHRpb25zIHdpdGhBbGdvcml0aG0oU3RyaW5nIGFsZ29yaXRobSkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhzc2xfY29udGV4dF9mYWN0b3J5LCBrZXlzdG9yZSwga2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCisgICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Ym91bmRfa2V5c3RvcmUsIG91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkLCB0cnVzdHN0b3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdHN0b3JlX3Bhc3N3b3JkLCBjaXBoZXJfc3VpdGVzLCBwcm90b2NvbCwgYWNjZXB0ZWRfcHJvdG9jb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG0sIHN0b3JlX3R5cGUsIHJlcXVpcmVfY2xpZW50X2F1dGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfZW5kcG9pbnRfdmVyaWZpY2F0aW9uLCBvcHRpb25hbCwgaW50ZXJub2RlX2VuY3J5cHRpb24sCkBAIC03OTQsNyArODI1LDggQEAKIAogICAgICAgICBwdWJsaWMgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgd2l0aFN0b3JlVHlwZShTdHJpbmcgc3RvcmVfdHlwZSkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhzc2xfY29udGV4dF9mYWN0b3J5LCBrZXlzdG9yZSwga2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCisgICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Ym91bmRfa2V5c3RvcmUsIG91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkLCB0cnVzdHN0b3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdHN0b3JlX3Bhc3N3b3JkLCBjaXBoZXJfc3VpdGVzLCBwcm90b2NvbCwgYWNjZXB0ZWRfcHJvdG9jb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG0sIHN0b3JlX3R5cGUsIHJlcXVpcmVfY2xpZW50X2F1dGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfZW5kcG9pbnRfdmVyaWZpY2F0aW9uLCBvcHRpb25hbCwgaW50ZXJub2RlX2VuY3J5cHRpb24sCkBAIC04MDMsNyArODM1LDggQEAKIAogICAgICAgICBwdWJsaWMgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgd2l0aFJlcXVpcmVDbGllbnRBdXRoKGJvb2xlYW4gcmVxdWlyZV9jbGllbnRfYXV0aCkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhzc2xfY29udGV4dF9mYWN0b3J5LCBrZXlzdG9yZSwga2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCisgICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Ym91bmRfa2V5c3RvcmUsIG91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkLCB0cnVzdHN0b3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdHN0b3JlX3Bhc3N3b3JkLCBjaXBoZXJfc3VpdGVzLCBwcm90b2NvbCwgYWNjZXB0ZWRfcHJvdG9jb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG0sIHN0b3JlX3R5cGUsIHJlcXVpcmVfY2xpZW50X2F1dGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfZW5kcG9pbnRfdmVyaWZpY2F0aW9uLCBvcHRpb25hbCwgaW50ZXJub2RlX2VuY3J5cHRpb24sCkBAIC04MTIsNyArODQ1LDggQEAKIAogICAgICAgICBwdWJsaWMgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgd2l0aFJlcXVpcmVFbmRwb2ludFZlcmlmaWNhdGlvbihib29sZWFuIHJlcXVpcmVfZW5kcG9pbnRfdmVyaWZpY2F0aW9uKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwgdHJ1c3RzdG9yZSwKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoc3NsX2NvbnRleHRfZmFjdG9yeSwga2V5c3RvcmUsIGtleXN0b3JlX3Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRib3VuZF9rZXlzdG9yZSwgb3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0c3RvcmVfcGFzc3dvcmQsIGNpcGhlcl9zdWl0ZXMsIHByb3RvY29sLCBhY2NlcHRlZF9wcm90b2NvbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobSwgc3RvcmVfdHlwZSwgcmVxdWlyZV9jbGllbnRfYXV0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24sIG9wdGlvbmFsLCBpbnRlcm5vZGVfZW5jcnlwdGlvbiwKQEAgLTgyMSw3ICs4NTUsOCBAQAogCiAgICAgICAgIHB1YmxpYyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyB3aXRoT3B0aW9uYWwoYm9vbGVhbiBvcHRpb25hbCkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhzc2xfY29udGV4dF9mYWN0b3J5LCBrZXlzdG9yZSwga2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCisgICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Ym91bmRfa2V5c3RvcmUsIG91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkLCB0cnVzdHN0b3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdHN0b3JlX3Bhc3N3b3JkLCBjaXBoZXJfc3VpdGVzLCBwcm90b2NvbCwgYWNjZXB0ZWRfcHJvdG9jb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG0sIHN0b3JlX3R5cGUsIHJlcXVpcmVfY2xpZW50X2F1dGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfZW5kcG9pbnRfdmVyaWZpY2F0aW9uLCBvcHRpb25hbCwgaW50ZXJub2RlX2VuY3J5cHRpb24sCkBAIC04MzAsNyArODY1LDggQEAKIAogICAgICAgICBwdWJsaWMgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgd2l0aEludGVybm9kZUVuY3J5cHRpb24oSW50ZXJub2RlRW5jcnlwdGlvbiBpbnRlcm5vZGVfZW5jcnlwdGlvbikKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhzc2xfY29udGV4dF9mYWN0b3J5LCBrZXlzdG9yZSwga2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCisgICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Ym91bmRfa2V5c3RvcmUsIG91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkLCB0cnVzdHN0b3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdHN0b3JlX3Bhc3N3b3JkLCBjaXBoZXJfc3VpdGVzLCBwcm90b2NvbCwgYWNjZXB0ZWRfcHJvdG9jb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG0sIHN0b3JlX3R5cGUsIHJlcXVpcmVfY2xpZW50X2F1dGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfZW5kcG9pbnRfdmVyaWZpY2F0aW9uLCBvcHRpb25hbCwgaW50ZXJub2RlX2VuY3J5cHRpb24sCkBAIC04MzksMTIgKzg3NSwzMiBAQAogCiAgICAgICAgIHB1YmxpYyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyB3aXRoTGVnYWN5U3NsU3RvcmFnZVBvcnQoYm9vbGVhbiBlbmFibGVfbGVnYWN5X3NzbF9zdG9yYWdlX3BvcnQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoc3NsX2NvbnRleHRfZmFjdG9yeSwga2V5c3RvcmUsIGtleXN0b3JlX3Bhc3N3b3JkLCB0cnVzdHN0b3JlLAorICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhzc2xfY29udGV4dF9mYWN0b3J5LCBrZXlzdG9yZSwga2V5c3RvcmVfcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGJvdW5kX2tleXN0b3JlLCBvdXRib3VuZF9rZXlzdG9yZV9wYXNzd29yZCwgdHJ1c3RzdG9yZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RzdG9yZV9wYXNzd29yZCwgY2lwaGVyX3N1aXRlcywgcHJvdG9jb2wsIGFjY2VwdGVkX3Byb3RvY29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxnb3JpdGhtLCBzdG9yZV90eXBlLCByZXF1aXJlX2NsaWVudF9hdXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlX2VuZHBvaW50X3ZlcmlmaWNhdGlvbiwgb3B0aW9uYWwsIGludGVybm9kZV9lbmNyeXB0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVfbGVnYWN5X3NzbF9zdG9yYWdlX3BvcnQpLmFwcGx5Q29uZmlnSW50ZXJuYWwoKTsKICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyB3aXRoT3V0Ym91bmRLZXlzdG9yZShTdHJpbmcgb3V0Ym91bmRLZXlzdG9yZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhzc2xfY29udGV4dF9mYWN0b3J5LCBrZXlzdG9yZSwga2V5c3RvcmVfcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGJvdW5kS2V5c3RvcmUsIG91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkLCB0cnVzdHN0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdHN0b3JlX3Bhc3N3b3JkLCBjaXBoZXJfc3VpdGVzLCBwcm90b2NvbCwgYWNjZXB0ZWRfcHJvdG9jb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG0sIHN0b3JlX3R5cGUsIHJlcXVpcmVfY2xpZW50X2F1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfZW5kcG9pbnRfdmVyaWZpY2F0aW9uLCBvcHRpb25hbCwgaW50ZXJub2RlX2VuY3J5cHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeV9zc2xfc3RvcmFnZV9wb3J0X2VuYWJsZWQpLmFwcGx5Q29uZmlnSW50ZXJuYWwoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyB3aXRoT3V0Ym91bmRLZXlzdG9yZVBhc3N3b3JkKFN0cmluZyBvdXRib3VuZEtleXN0b3JlUGFzc3dvcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoc3NsX2NvbnRleHRfZmFjdG9yeSwga2V5c3RvcmUsIGtleXN0b3JlX3Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRib3VuZF9rZXlzdG9yZSwgb3V0Ym91bmRLZXlzdG9yZVBhc3N3b3JkLCB0cnVzdHN0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdHN0b3JlX3Bhc3N3b3JkLCBjaXBoZXJfc3VpdGVzLCBwcm90b2NvbCwgYWNjZXB0ZWRfcHJvdG9jb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG0sIHN0b3JlX3R5cGUsIHJlcXVpcmVfY2xpZW50X2F1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfZW5kcG9pbnRfdmVyaWZpY2F0aW9uLCBvcHRpb25hbCwgaW50ZXJub2RlX2VuY3J5cHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeV9zc2xfc3RvcmFnZV9wb3J0X2VuYWJsZWQpLmFwcGx5Q29uZmlnSW50ZXJuYWwoKTsKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9HdWFyZHJhaWxzT3B0aW9ucy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0d1YXJkcmFpbHNPcHRpb25zLmphdmEKaW5kZXggZTQ2OTRiOS4uN2FmZmU2ZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0d1YXJkcmFpbHNPcHRpb25zLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0d1YXJkcmFpbHNPcHRpb25zLmphdmEKQEAgLTc2LDEyICs3NiwxNyBAQAogICAgICAgICBjb25maWcucmVhZF9jb25zaXN0ZW5jeV9sZXZlbHNfZGlzYWxsb3dlZCA9IHZhbGlkYXRlQ29uc2lzdGVuY3lMZXZlbHMoY29uZmlnLnJlYWRfY29uc2lzdGVuY3lfbGV2ZWxzX2Rpc2FsbG93ZWQsICJyZWFkX2NvbnNpc3RlbmN5X2xldmVsc19kaXNhbGxvd2VkIik7CiAgICAgICAgIGNvbmZpZy53cml0ZV9jb25zaXN0ZW5jeV9sZXZlbHNfd2FybmVkID0gdmFsaWRhdGVDb25zaXN0ZW5jeUxldmVscyhjb25maWcud3JpdGVfY29uc2lzdGVuY3lfbGV2ZWxzX3dhcm5lZCwgIndyaXRlX2NvbnNpc3RlbmN5X2xldmVsc193YXJuZWQiKTsKICAgICAgICAgY29uZmlnLndyaXRlX2NvbnNpc3RlbmN5X2xldmVsc19kaXNhbGxvd2VkID0gdmFsaWRhdGVDb25zaXN0ZW5jeUxldmVscyhjb25maWcud3JpdGVfY29uc2lzdGVuY3lfbGV2ZWxzX2Rpc2FsbG93ZWQsICJ3cml0ZV9jb25zaXN0ZW5jeV9sZXZlbHNfZGlzYWxsb3dlZCIpOworICAgICAgICB2YWxpZGF0ZVNpemVUaHJlc2hvbGQoY29uZmlnLnBhcnRpdGlvbl9zaXplX3dhcm5fdGhyZXNob2xkLCBjb25maWcucGFydGl0aW9uX3NpemVfZmFpbF90aHJlc2hvbGQsIGZhbHNlLCAicGFydGl0aW9uX3NpemUiKTsKKyAgICAgICAgdmFsaWRhdGVTaXplVGhyZXNob2xkKGNvbmZpZy5jb2x1bW5fdmFsdWVfc2l6ZV93YXJuX3RocmVzaG9sZCwgY29uZmlnLmNvbHVtbl92YWx1ZV9zaXplX2ZhaWxfdGhyZXNob2xkLCBmYWxzZSwgImNvbHVtbl92YWx1ZV9zaXplIik7CiAgICAgICAgIHZhbGlkYXRlU2l6ZVRocmVzaG9sZChjb25maWcuY29sbGVjdGlvbl9zaXplX3dhcm5fdGhyZXNob2xkLCBjb25maWcuY29sbGVjdGlvbl9zaXplX2ZhaWxfdGhyZXNob2xkLCBmYWxzZSwgImNvbGxlY3Rpb25fc2l6ZSIpOwogICAgICAgICB2YWxpZGF0ZU1heEludFRocmVzaG9sZChjb25maWcuaXRlbXNfcGVyX2NvbGxlY3Rpb25fd2Fybl90aHJlc2hvbGQsIGNvbmZpZy5pdGVtc19wZXJfY29sbGVjdGlvbl9mYWlsX3RocmVzaG9sZCwgIml0ZW1zX3Blcl9jb2xsZWN0aW9uIik7CiAgICAgICAgIHZhbGlkYXRlTWF4SW50VGhyZXNob2xkKGNvbmZpZy5maWVsZHNfcGVyX3VkdF93YXJuX3RocmVzaG9sZCwgY29uZmlnLmZpZWxkc19wZXJfdWR0X2ZhaWxfdGhyZXNob2xkLCAiZmllbGRzX3Blcl91ZHQiKTsKICAgICAgICAgdmFsaWRhdGVQZXJjZW50YWdlVGhyZXNob2xkKGNvbmZpZy5kYXRhX2Rpc2tfdXNhZ2VfcGVyY2VudGFnZV93YXJuX3RocmVzaG9sZCwgY29uZmlnLmRhdGFfZGlza191c2FnZV9wZXJjZW50YWdlX2ZhaWxfdGhyZXNob2xkLCAiZGF0YV9kaXNrX3VzYWdlX3BlcmNlbnRhZ2UiKTsKICAgICAgICAgdmFsaWRhdGVEYXRhRGlza1VzYWdlTWF4RGlza1NpemUoY29uZmlnLmRhdGFfZGlza191c2FnZV9tYXhfZGlza19zaXplKTsKLSAgICAgICAgdmFsaWRhdGVNaW5SRlRocmVzaG9sZChjb25maWcubWluaW11bV9yZXBsaWNhdGlvbl9mYWN0b3Jfd2Fybl90aHJlc2hvbGQsIGNvbmZpZy5taW5pbXVtX3JlcGxpY2F0aW9uX2ZhY3Rvcl9mYWlsX3RocmVzaG9sZCwgIm1pbmltdW1fcmVwbGljYXRpb25fZmFjdG9yIik7CisgICAgICAgIHZhbGlkYXRlTWluUkZUaHJlc2hvbGQoY29uZmlnLm1pbmltdW1fcmVwbGljYXRpb25fZmFjdG9yX3dhcm5fdGhyZXNob2xkLCBjb25maWcubWluaW11bV9yZXBsaWNhdGlvbl9mYWN0b3JfZmFpbF90aHJlc2hvbGQpOworICAgICAgICB2YWxpZGF0ZU1heFJGVGhyZXNob2xkKGNvbmZpZy5tYXhpbXVtX3JlcGxpY2F0aW9uX2ZhY3Rvcl93YXJuX3RocmVzaG9sZCwgY29uZmlnLm1heGltdW1fcmVwbGljYXRpb25fZmFjdG9yX2ZhaWxfdGhyZXNob2xkKTsKKyAgICAgICAgdmFsaWRhdGVUaW1lc3RhbXBUaHJlc2hvbGQoY29uZmlnLm1heGltdW1fdGltZXN0YW1wX3dhcm5fdGhyZXNob2xkLCBjb25maWcubWF4aW11bV90aW1lc3RhbXBfZmFpbF90aHJlc2hvbGQsICJtYXhpbXVtX3RpbWVzdGFtcCIpOworICAgICAgICB2YWxpZGF0ZVRpbWVzdGFtcFRocmVzaG9sZChjb25maWcubWluaW11bV90aW1lc3RhbXBfd2Fybl90aHJlc2hvbGQsIGNvbmZpZy5taW5pbXVtX3RpbWVzdGFtcF9mYWlsX3RocmVzaG9sZCwgIm1pbmltdW1fdGltZXN0YW1wIik7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0zNDQsNiArMzQ5LDIwIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RHJvcEtleXNwYWNlRW5hYmxlZCgpCisgICAgeworICAgICAgICByZXR1cm4gY29uZmlnLmRyb3Bfa2V5c3BhY2VfZW5hYmxlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREcm9wS2V5c3BhY2VFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkKKyAgICB7CisgICAgICAgIHVwZGF0ZVByb3BlcnR5V2l0aExvZ2dpbmcoImRyb3Bfa2V5c3BhY2VfZW5hYmxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBjb25maWcuZHJvcF9rZXlzcGFjZV9lbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLT4gY29uZmlnLmRyb3Bfa2V5c3BhY2VfZW5hYmxlZCA9IHgpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGdldFNlY29uZGFyeUluZGV4ZXNFbmFibGVkKCkKICAgICB7CiAgICAgICAgIHJldHVybiBjb25maWcuc2Vjb25kYXJ5X2luZGV4ZXNfZW5hYmxlZDsKQEAgLTM4Niw2ICs0MDUsMjAgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRBbHRlclRhYmxlRW5hYmxlZCgpCisgICAgeworICAgICAgICByZXR1cm4gY29uZmlnLmFsdGVyX3RhYmxlX2VuYWJsZWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWx0ZXJUYWJsZUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQorICAgIHsKKyAgICAgICAgdXBkYXRlUHJvcGVydHlXaXRoTG9nZ2luZygiYWx0ZXJfdGFibGVfZW5hYmxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBjb25maWcuYWx0ZXJfdGFibGVfZW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0+IGNvbmZpZy5hbHRlcl90YWJsZV9lbmFibGVkID0geCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0UmVhZEJlZm9yZVdyaXRlTGlzdE9wZXJhdGlvbnNFbmFibGVkKCkKICAgICB7CiAgICAgICAgIHJldHVybiBjb25maWcucmVhZF9iZWZvcmVfd3JpdGVfbGlzdF9vcGVyYXRpb25zX2VuYWJsZWQ7CkBAIC00MTQsNiArNDQ3LDIwIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U2ltcGxlU3RyYXRlZ3lFbmFibGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb25maWcuc2ltcGxlc3RyYXRlZ3lfZW5hYmxlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTaW1wbGVTdHJhdGVneUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQorICAgIHsKKyAgICAgICAgdXBkYXRlUHJvcGVydHlXaXRoTG9nZ2luZygic2ltcGxlc3RyYXRlZ3lfZW5hYmxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBjb25maWcuc2ltcGxlc3RyYXRlZ3lfZW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0+IGNvbmZpZy5zaW1wbGVzdHJhdGVneV9lbmFibGVkID0geCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRJblNlbGVjdENhcnRlc2lhblByb2R1Y3RXYXJuVGhyZXNob2xkKCkKICAgICB7CiAgICAgICAgIHJldHVybiBjb25maWcuaW5fc2VsZWN0X2NhcnRlc2lhbl9wcm9kdWN0X3dhcm5fdGhyZXNob2xkOwpAQCAtNDk1LDYgKzU0Miw2MCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgQE51bGxhYmxlCisgICAgcHVibGljIERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCBnZXRQYXJ0aXRpb25TaXplV2FyblRocmVzaG9sZCgpCisgICAgeworICAgICAgICByZXR1cm4gY29uZmlnLnBhcnRpdGlvbl9zaXplX3dhcm5fdGhyZXNob2xkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgZ2V0UGFydGl0aW9uU2l6ZUZhaWxUaHJlc2hvbGQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZy5wYXJ0aXRpb25fc2l6ZV9mYWlsX3RocmVzaG9sZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJ0aXRpb25TaXplVGhyZXNob2xkKEBOdWxsYWJsZSBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgd2FybiwgQE51bGxhYmxlIERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCBmYWlsKQorICAgIHsKKyAgICAgICAgdmFsaWRhdGVTaXplVGhyZXNob2xkKHdhcm4sIGZhaWwsIGZhbHNlLCAicGFydGl0aW9uX3NpemUiKTsKKyAgICAgICAgdXBkYXRlUHJvcGVydHlXaXRoTG9nZ2luZygicGFydGl0aW9uX3NpemVfd2Fybl90aHJlc2hvbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gY29uZmlnLnBhcnRpdGlvbl9zaXplX3dhcm5fdGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLT4gY29uZmlnLnBhcnRpdGlvbl9zaXplX3dhcm5fdGhyZXNob2xkID0geCk7CisgICAgICAgIHVwZGF0ZVByb3BlcnR5V2l0aExvZ2dpbmcoInBhcnRpdGlvbl9zaXplX2ZhaWxfdGhyZXNob2xkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IGNvbmZpZy5wYXJ0aXRpb25fc2l6ZV9mYWlsX3RocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0+IGNvbmZpZy5wYXJ0aXRpb25fc2l6ZV9mYWlsX3RocmVzaG9sZCA9IHgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgZ2V0Q29sdW1uVmFsdWVTaXplV2FyblRocmVzaG9sZCgpCisgICAgeworICAgICAgICByZXR1cm4gY29uZmlnLmNvbHVtbl92YWx1ZV9zaXplX3dhcm5fdGhyZXNob2xkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgZ2V0Q29sdW1uVmFsdWVTaXplRmFpbFRocmVzaG9sZCgpCisgICAgeworICAgICAgICByZXR1cm4gY29uZmlnLmNvbHVtbl92YWx1ZV9zaXplX2ZhaWxfdGhyZXNob2xkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbHVtblZhbHVlU2l6ZVRocmVzaG9sZChATnVsbGFibGUgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kIHdhcm4sIEBOdWxsYWJsZSBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgZmFpbCkKKyAgICB7CisgICAgICAgIHZhbGlkYXRlU2l6ZVRocmVzaG9sZCh3YXJuLCBmYWlsLCBmYWxzZSwgImNvbHVtbl92YWx1ZV9zaXplIik7CisgICAgICAgIHVwZGF0ZVByb3BlcnR5V2l0aExvZ2dpbmcoImNvbHVtbl92YWx1ZV9zaXplX3dhcm5fdGhyZXNob2xkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IGNvbmZpZy5jb2x1bW5fdmFsdWVfc2l6ZV93YXJuX3RocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0+IGNvbmZpZy5jb2x1bW5fdmFsdWVfc2l6ZV93YXJuX3RocmVzaG9sZCA9IHgpOworICAgICAgICB1cGRhdGVQcm9wZXJ0eVdpdGhMb2dnaW5nKCJjb2x1bW5fdmFsdWVfc2l6ZV9mYWlsX3RocmVzaG9sZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBjb25maWcuY29sdW1uX3ZhbHVlX3NpemVfZmFpbF90aHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtPiBjb25maWcuY29sdW1uX3ZhbHVlX3NpemVfZmFpbF90aHJlc2hvbGQgPSB4KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBATnVsbGFibGUKICAgICBwdWJsaWMgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kIGdldENvbGxlY3Rpb25TaXplV2FyblRocmVzaG9sZCgpCiAgICAgewogICAgICAgICByZXR1cm4gY29uZmlnLmNvbGxlY3Rpb25fc2l6ZV93YXJuX3RocmVzaG9sZDsKQEAgLTYyMyw3ICs3MjQsNyBAQAogCiAgICAgcHVibGljIHZvaWQgc2V0TWluaW11bVJlcGxpY2F0aW9uRmFjdG9yVGhyZXNob2xkKGludCB3YXJuLCBpbnQgZmFpbCkKICAgICB7Ci0gICAgICAgIHZhbGlkYXRlTWluUkZUaHJlc2hvbGQod2FybiwgZmFpbCwgIm1pbmltdW1fcmVwbGljYXRpb25fZmFjdG9yIik7CisgICAgICAgIHZhbGlkYXRlTWluUkZUaHJlc2hvbGQod2FybiwgZmFpbCk7CiAgICAgICAgIHVwZGF0ZVByb3BlcnR5V2l0aExvZ2dpbmcoIm1pbmltdW1fcmVwbGljYXRpb25fZmFjdG9yX3dhcm5fdGhyZXNob2xkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IGNvbmZpZy5taW5pbXVtX3JlcGxpY2F0aW9uX2ZhY3Rvcl93YXJuX3RocmVzaG9sZCwKQEAgLTYzNCw2ICs3MzUsMTE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtPiBjb25maWcubWluaW11bV9yZXBsaWNhdGlvbl9mYWN0b3JfZmFpbF90aHJlc2hvbGQgPSB4KTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldE1heGltdW1SZXBsaWNhdGlvbkZhY3Rvcldhcm5UaHJlc2hvbGQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZy5tYXhpbXVtX3JlcGxpY2F0aW9uX2ZhY3Rvcl93YXJuX3RocmVzaG9sZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvckZhaWxUaHJlc2hvbGQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZy5tYXhpbXVtX3JlcGxpY2F0aW9uX2ZhY3Rvcl9mYWlsX3RocmVzaG9sZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoaW50IHdhcm4sIGludCBmYWlsKQorICAgIHsKKyAgICAgICAgdmFsaWRhdGVNYXhSRlRocmVzaG9sZCh3YXJuLCBmYWlsKTsKKyAgICAgICAgdXBkYXRlUHJvcGVydHlXaXRoTG9nZ2luZygibWF4aW11bV9yZXBsaWNhdGlvbl9mYWN0b3Jfd2Fybl90aHJlc2hvbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gY29uZmlnLm1heGltdW1fcmVwbGljYXRpb25fZmFjdG9yX3dhcm5fdGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLT4gY29uZmlnLm1heGltdW1fcmVwbGljYXRpb25fZmFjdG9yX3dhcm5fdGhyZXNob2xkID0geCk7CisgICAgICAgIHVwZGF0ZVByb3BlcnR5V2l0aExvZ2dpbmcoIm1heGltdW1fcmVwbGljYXRpb25fZmFjdG9yX2ZhaWxfdGhyZXNob2xkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IGNvbmZpZy5tYXhpbXVtX3JlcGxpY2F0aW9uX2ZhY3Rvcl9mYWlsX3RocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0+IGNvbmZpZy5tYXhpbXVtX3JlcGxpY2F0aW9uX2ZhY3Rvcl9mYWlsX3RocmVzaG9sZCA9IHgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGdldFplcm9UVExPblRXQ1NXYXJuZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZy56ZXJvX3R0bF9vbl90d2NzX3dhcm5lZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRaZXJvVFRMT25UV0NTV2FybmVkKGJvb2xlYW4gdmFsdWUpCisgICAgeworICAgICAgICB1cGRhdGVQcm9wZXJ0eVdpdGhMb2dnaW5nKCJ6ZXJvX3R0bF9vbl90d2NzX3dhcm5lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gY29uZmlnLnplcm9fdHRsX29uX3R3Y3Nfd2FybmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLT4gY29uZmlnLnplcm9fdHRsX29uX3R3Y3Nfd2FybmVkID0geCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZ2V0WmVyb1RUTE9uVFdDU0VuYWJsZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZy56ZXJvX3R0bF9vbl90d2NzX2VuYWJsZWQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0WmVyb1RUTE9uVFdDU0VuYWJsZWQoYm9vbGVhbiB2YWx1ZSkKKyAgICB7CisgICAgICAgIHVwZGF0ZVByb3BlcnR5V2l0aExvZ2dpbmcoInplcm9fdHRsX29uX3R3Y3NfZW5hYmxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gY29uZmlnLnplcm9fdHRsX29uX3R3Y3NfZW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0+IGNvbmZpZy56ZXJvX3R0bF9vbl90d2NzX2VuYWJsZWQgPSB4KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgIER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQgZ2V0TWF4aW11bVRpbWVzdGFtcFdhcm5UaHJlc2hvbGQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZy5tYXhpbXVtX3RpbWVzdGFtcF93YXJuX3RocmVzaG9sZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCBnZXRNYXhpbXVtVGltZXN0YW1wRmFpbFRocmVzaG9sZCgpCisgICAgeworICAgICAgICByZXR1cm4gY29uZmlnLm1heGltdW1fdGltZXN0YW1wX2ZhaWxfdGhyZXNob2xkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE1heGltdW1UaW1lc3RhbXBUaHJlc2hvbGQoQE51bGxhYmxlIER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQgd2FybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBEdXJhdGlvblNwZWMuTG9uZ01pY3Jvc2Vjb25kc0JvdW5kIGZhaWwpCisgICAgeworICAgICAgICB2YWxpZGF0ZVRpbWVzdGFtcFRocmVzaG9sZCh3YXJuLCBmYWlsLCAibWF4aW11bV90aW1lc3RhbXAiKTsKKworICAgICAgICB1cGRhdGVQcm9wZXJ0eVdpdGhMb2dnaW5nKCJtYXhpbXVtX3RpbWVzdGFtcF93YXJuX3RocmVzaG9sZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBjb25maWcubWF4aW11bV90aW1lc3RhbXBfd2Fybl90aHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtPiBjb25maWcubWF4aW11bV90aW1lc3RhbXBfd2Fybl90aHJlc2hvbGQgPSB4KTsKKworICAgICAgICB1cGRhdGVQcm9wZXJ0eVdpdGhMb2dnaW5nKCJtYXhpbXVtX3RpbWVzdGFtcF9mYWlsX3RocmVzaG9sZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBjb25maWcubWF4aW11bV90aW1lc3RhbXBfZmFpbF90aHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtPiBjb25maWcubWF4aW11bV90aW1lc3RhbXBfZmFpbF90aHJlc2hvbGQgPSB4KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgIER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQgZ2V0TWluaW11bVRpbWVzdGFtcFdhcm5UaHJlc2hvbGQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZy5taW5pbXVtX3RpbWVzdGFtcF93YXJuX3RocmVzaG9sZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCBnZXRNaW5pbXVtVGltZXN0YW1wRmFpbFRocmVzaG9sZCgpCisgICAgeworICAgICAgICByZXR1cm4gY29uZmlnLm1pbmltdW1fdGltZXN0YW1wX2ZhaWxfdGhyZXNob2xkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE1pbmltdW1UaW1lc3RhbXBUaHJlc2hvbGQoQE51bGxhYmxlIER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQgd2FybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBEdXJhdGlvblNwZWMuTG9uZ01pY3Jvc2Vjb25kc0JvdW5kIGZhaWwpCisgICAgeworICAgICAgICB2YWxpZGF0ZVRpbWVzdGFtcFRocmVzaG9sZCh3YXJuLCBmYWlsLCAibWluaW11bV90aW1lc3RhbXAiKTsKKworICAgICAgICB1cGRhdGVQcm9wZXJ0eVdpdGhMb2dnaW5nKCJtaW5pbXVtX3RpbWVzdGFtcF93YXJuX3RocmVzaG9sZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBjb25maWcubWluaW11bV90aW1lc3RhbXBfd2Fybl90aHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtPiBjb25maWcubWluaW11bV90aW1lc3RhbXBfd2Fybl90aHJlc2hvbGQgPSB4KTsKKworICAgICAgICB1cGRhdGVQcm9wZXJ0eVdpdGhMb2dnaW5nKCJtaW5pbXVtX3RpbWVzdGFtcF9mYWlsX3RocmVzaG9sZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBjb25maWcubWluaW11bV90aW1lc3RhbXBfZmFpbF90aHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtPiBjb25maWcubWluaW11bV90aW1lc3RhbXBfZmFpbF90aHJlc2hvbGQgPSB4KTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyA8VD4gdm9pZCB1cGRhdGVQcm9wZXJ0eVdpdGhMb2dnaW5nKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFQgbmV3VmFsdWUsIFN1cHBsaWVyPFQ+IGdldHRlciwgQ29uc3VtZXI8VD4gc2V0dGVyKQogICAgIHsKICAgICAgICAgVCBvbGRWYWx1ZSA9IGdldHRlci5nZXQoKTsKQEAgLTY0Niw2ICs4NjAsMTEgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVQb3NpdGl2ZU51bWVyaWMobG9uZyB2YWx1ZSwgbG9uZyBtYXhWYWx1ZSwgU3RyaW5nIG5hbWUpCiAgICAgeworICAgICAgICB2YWxpZGF0ZVBvc2l0aXZlTnVtZXJpYyh2YWx1ZSwgbWF4VmFsdWUsIG5hbWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlUG9zaXRpdmVOdW1lcmljKGxvbmcgdmFsdWUsIGxvbmcgbWF4VmFsdWUsIFN0cmluZyBuYW1lLCBib29sZWFuIGFsbG93WmVybykKKyAgICB7CiAgICAgICAgIGlmICh2YWx1ZSA9PSAtMSkKICAgICAgICAgICAgIHJldHVybjsKIApAQCAtNjUzLDEyICs4NzIsMTIgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZm9ybWF0KCJJbnZhbGlkIHZhbHVlICVkIGZvciAlczogbWF4aW11bSBhbGxvd2VkIHZhbHVlIGlzICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBuYW1lLCBtYXhWYWx1ZSkpOwogCi0gICAgICAgIGlmICh2YWx1ZSA9PSAwKQorICAgICAgICBpZiAoIWFsbG93WmVybyAmJiB2YWx1ZSA9PSAwKQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihmb3JtYXQoIkludmFsaWQgdmFsdWUgZm9yICVzOiAwIGlzIG5vdCBhbGxvd2VkOyAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZiBhdHRlbXB0aW5nIHRvIGRpc2FibGUgdXNlIC0xIiwgbmFtZSkpOwogCiAgICAgICAgIC8vIFdlIGFsbG93IC0xIGFzIGEgZ2VuZXJhbCAiZGlzYWJsaW5nIiBmbGFnLiBCdXQgcmVqZWN0IGFueXRoaW5nIGxvd2VyIHRvIGF2b2lkIG1pc3Rha2VzLgotICAgICAgICBpZiAodmFsdWUgPD0gMCkKKyAgICAgICAgaWYgKHZhbHVlIDwgMCkKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZm9ybWF0KCJJbnZhbGlkIHZhbHVlICVkIGZvciAlczogbmVnYXRpdmUgdmFsdWVzIGFyZSBub3QgYWxsb3dlZCwgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0c2lkZSBvZiAtMSB3aGljaCBkaXNhYmxlcyB0aGUgZ3VhcmRyYWlsIiwgdmFsdWUsIG5hbWUpKTsKICAgICB9CkBAIC02ODIsNiArOTAxLDEzIEBACiAgICAgICAgIHZhbGlkYXRlV2Fybkxvd2VyVGhhbkZhaWwod2FybiwgZmFpbCwgbmFtZSk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZU1heExvbmdUaHJlc2hvbGQobG9uZyB3YXJuLCBsb25nIGZhaWwsIFN0cmluZyBuYW1lLCBib29sZWFuIGFsbG93WmVybykKKyAgICB7CisgICAgICAgIHZhbGlkYXRlUG9zaXRpdmVOdW1lcmljKHdhcm4sIExvbmcuTUFYX1ZBTFVFLCBuYW1lICsgIl93YXJuX3RocmVzaG9sZCIsIGFsbG93WmVybyk7CisgICAgICAgIHZhbGlkYXRlUG9zaXRpdmVOdW1lcmljKGZhaWwsIExvbmcuTUFYX1ZBTFVFLCBuYW1lICsgIl9mYWlsX3RocmVzaG9sZCIsIGFsbG93WmVybyk7CisgICAgICAgIHZhbGlkYXRlV2Fybkxvd2VyVGhhbkZhaWwod2FybiwgZmFpbCwgbmFtZSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZU1pbkludFRocmVzaG9sZChpbnQgd2FybiwgaW50IGZhaWwsIFN0cmluZyBuYW1lKQogICAgIHsKICAgICAgICAgdmFsaWRhdGVQb3NpdGl2ZU51bWVyaWMod2FybiwgSW50ZWdlci5NQVhfVkFMVUUsIG5hbWUgKyAiX3dhcm5fdGhyZXNob2xkIik7CkBAIC02ODksMTAgKzkxNSwzNiBAQAogICAgICAgICB2YWxpZGF0ZVdhcm5HcmVhdGVyVGhhbkZhaWwod2FybiwgZmFpbCwgbmFtZSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZU1pblJGVGhyZXNob2xkKGludCB3YXJuLCBpbnQgZmFpbCwgU3RyaW5nIG5hbWUpCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZU1pblJGVGhyZXNob2xkKGludCB3YXJuLCBpbnQgZmFpbCkKICAgICB7Ci0gICAgICAgIHZhbGlkYXRlTWluSW50VGhyZXNob2xkKHdhcm4sIGZhaWwsIG5hbWUpOwotICAgICAgICB2YWxpZGF0ZU1pblJGVmVyc3VzRGVmYXVsdFJGKGZhaWwsIG5hbWUpOworICAgICAgICB2YWxpZGF0ZU1pbkludFRocmVzaG9sZCh3YXJuLCBmYWlsLCAibWluaW11bV9yZXBsaWNhdGlvbl9mYWN0b3IiKTsKKworICAgICAgICBpZiAoZmFpbCA+IERhdGFiYXNlRGVzY3JpcHRvci5nZXREZWZhdWx0S2V5c3BhY2VSRigpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihmb3JtYXQoIm1pbmltdW1fcmVwbGljYXRpb25fZmFjdG9yX2ZhaWxfdGhyZXNob2xkIHRvIGJlIHNldCAoJWQpICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBiZSBncmVhdGVyIHRoYW4gZGVmYXVsdF9rZXlzcGFjZV9yZiAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwsIERhdGFiYXNlRGVzY3JpcHRvci5nZXREZWZhdWx0S2V5c3BhY2VSRigpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZU1heFJGVGhyZXNob2xkKGludCB3YXJuLCBpbnQgZmFpbCkKKyAgICB7CisgICAgICAgIHZhbGlkYXRlTWF4SW50VGhyZXNob2xkKHdhcm4sIGZhaWwsICJtYXhpbXVtX3JlcGxpY2F0aW9uX2ZhY3RvciIpOworCisgICAgICAgIGlmIChmYWlsICE9IC0xICYmIGZhaWwgPCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0RGVmYXVsdEtleXNwYWNlUkYoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZm9ybWF0KCJtYXhpbXVtX3JlcGxpY2F0aW9uX2ZhY3Rvcl9mYWlsX3RocmVzaG9sZCB0byBiZSBzZXQgKCVkKSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgYmUgbGVzc2VyIHRoYW4gZGVmYXVsdF9rZXlzcGFjZV9yZiAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwsIERhdGFiYXNlRGVzY3JpcHRvci5nZXREZWZhdWx0S2V5c3BhY2VSRigpKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlVGltZXN0YW1wVGhyZXNob2xkKER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQgd2FybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCBmYWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSkKKyAgICB7CisgICAgICAgIC8vIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgYm90aCB1cHBlciBhbmQgbG93ZXIgdGhyZXNob2xkcyBiZWNhdXNlIGxvd2VyIHRocmVzaG9sZCBpcyByZWxhdGl2ZQorICAgICAgICAvLyBkZXNwaXRlIHVzaW5nIE1pblRocmVzaG9sZCB3ZSBzdGlsbCB3YW50IHRoZSB3YXJuIHRocmVzaG9sZCB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KKyAgICAgICAgLy8gdGhlIGZhaWwgdGhyZXNob2xkLgorICAgICAgICB2YWxpZGF0ZU1heExvbmdUaHJlc2hvbGQod2FybiA9PSBudWxsID8gLTEgOiB3YXJuLnRvTWljcm9zZWNvbmRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsID09IG51bGwgPyAtMSA6IGZhaWwudG9NaWNyb3NlY29uZHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHRydWUpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVXYXJuTG93ZXJUaGFuRmFpbChsb25nIHdhcm4sIGxvbmcgZmFpbCwgU3RyaW5nIG5hbWUpCkBAIC03MTUsMTUgKzk2Nyw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhhbiB0aGUgZmFpbCB0aHJlc2hvbGQgJWQiLCB3YXJuLCBuYW1lLCBmYWlsKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZU1pblJGVmVyc3VzRGVmYXVsdFJGKGludCBmYWlsLCBTdHJpbmcgbmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKGZhaWwgPiBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0RGVmYXVsdEtleXNwYWNlUkYoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCIlc19mYWlsX3RocmVzaG9sZCB0byBiZSBzZXQgKCVkKSBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIGRlZmF1bHRfa2V5c3BhY2VfcmYgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGZhaWwsIERhdGFiYXNlRGVzY3JpcHRvci5nZXREZWZhdWx0S2V5c3BhY2VSRigpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlU2l6ZShEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgc2l6ZSwgYm9vbGVhbiBhbGxvd1plcm8sIFN0cmluZyBuYW1lKQogICAgIHsKICAgICAgICAgaWYgKHNpemUgPT0gbnVsbCkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9ZYW1sQ29uZmlndXJhdGlvbkxvYWRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL1lhbWxDb25maWd1cmF0aW9uTG9hZGVyLmphdmEKaW5kZXggNTI4YWNjZC4uZWRmZjdiZSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL1lhbWxDb25maWd1cmF0aW9uTG9hZGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL1lhbWxDb25maWd1cmF0aW9uTG9hZGVyLmphdmEKQEAgLTI5LDcgKzI5LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CkBAIC00Niw4ICs0NSw4IEBACiBpbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLlR5cGVEZXNjcmlwdGlvbjsKIGltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuWWFtbDsKIGltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuY29tcG9zZXIuQ29tcG9zZXI7Ci1pbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLmNvbnN0cnVjdG9yLlNhZmVDb25zdHJ1Y3RvcjsKIGltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuY29uc3RydWN0b3IuQ3VzdG9tQ2xhc3NMb2FkZXJDb25zdHJ1Y3RvcjsKK2ltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuY29uc3RydWN0b3IuU2FmZUNvbnN0cnVjdG9yOwogaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5lcnJvci5ZQU1MRXhjZXB0aW9uOwogaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5pbnRyb3NwZWN0b3IuTWlzc2luZ1Byb3BlcnR5OwogaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5pbnRyb3NwZWN0b3IuUHJvcGVydHk7CkBAIC01NiwxMyArNTUsMTMgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkFMTE9XX0RVUExJQ0FURV9DT05GSUdfS0VZUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5BTExPV19ORVdfT0xEX0NPTkZJR19LRVlTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9DT05GSUc7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5SZXBsYWNlbWVudHMuZ2V0TmFtZVJlcGxhY2VtZW50czsKIAogcHVibGljIGNsYXNzIFlhbWxDb25maWd1cmF0aW9uTG9hZGVyIGltcGxlbWVudHMgQ29uZmlndXJhdGlvbkxvYWRlcgogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihZYW1sQ29uZmlndXJhdGlvbkxvYWRlci5jbGFzcyk7CiAKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9DT05GSUdVUkFUSU9OID0gImNhc3NhbmRyYS55YW1sIjsKICAgICAvKioKICAgICAgKiBUaGlzIGlzIHJlbGF0ZWQgdG8ge0BsaW5rIENvbmZpZyNQUk9QRVJUWV9QUkVGSVh9IGJ1dCBpcyBkaWZmZXJlbnQgdG8gbWFrZSBzdXJlIENvbmZpZyBwcm9wZXJ0aWVzIHVwZGF0ZWQgdmlhCiAgICAgICogc3lzdGVtIHByb3BlcnRpZXMgZG8gbm90IGNvbmZsaWN0IHdpdGggb3RoZXIgc3lzdGVtIHByb3BlcnRpZXM7IHRoZSBuYW1lICJzZXR0aW5ncyIgbWF0Y2hlcyBzeXN0ZW1fdmlld3Muc2V0dGluZ3MuCkBAIC03NCw5ICs3Myw3IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgVVJMIGdldFN0b3JhZ2VDb25maWdVUkwoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3RyaW5nIGNvbmZpZ1VybCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmNvbmZpZyIpOwotICAgICAgICBpZiAoY29uZmlnVXJsID09IG51bGwpCi0gICAgICAgICAgICBjb25maWdVcmwgPSBERUZBVUxUX0NPTkZJR1VSQVRJT047CisgICAgICAgIFN0cmluZyBjb25maWdVcmwgPSBDQVNTQU5EUkFfQ09ORklHLmdldFN0cmluZygpOwogCiAgICAgICAgIFVSTCB1cmw7CiAgICAgICAgIHRyeQpAQCAtMjAzLDYgKzIwMCw4IEBACiAgICAgICAgIFlhbWwgcmF3WWFtbCA9IG5ldyBZYW1sKGxvYWRlck9wdGlvbnMpOwogCiAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmF3Q29uZmlnID0gcmF3WWFtbC5sb2FkKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb25maWdCeXRlcykpOworICAgICAgICBpZiAocmF3Q29uZmlnID09IG51bGwpCisgICAgICAgICAgICByYXdDb25maWcgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgIHZlcmlmeVJlcGxhY2VtZW50cyhyZXBsYWNlbWVudHMsIHJhd0NvbmZpZyk7CiAKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0Fzc2lnbm1lbnRUZXN0YWJsZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9Bc3NpZ25tZW50VGVzdGFibGUuamF2YQppbmRleCA0MWI4MGViLi5mZGYyMWI5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0Fzc2lnbm1lbnRUZXN0YWJsZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQXNzaWdubWVudFRlc3RhYmxlLmphdmEKQEAgLTE5LDYgKzE5LDEwIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIAoraW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKKwogcHVibGljIGludGVyZmFjZSBBc3NpZ25tZW50VGVzdGFibGUKIHsKICAgICAvKioKQEAgLTMyLDYgKzM2LDI1IEBACiAgICAgICovCiAgICAgcHVibGljIFRlc3RSZXN1bHQgdGVzdEFzc2lnbm1lbnQoU3RyaW5nIGtleXNwYWNlLCBDb2x1bW5TcGVjaWZpY2F0aW9uIHJlY2VpdmVyKTsKIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gQSBkYXRhIHR5cGUgdGhhdCBjYW4gcmVwcmVzZW50IHRoaXMsIG9yIHtAY29kZSBudWxsfSBpZiB3ZSBjYW4ndCBkZXRlcm1pbmUgdGhhdCB0eXBlLiBUaGUgcmV0dXJuZWQgdHlwZQorICAgICAqIHdvbid0IG5lY2Vzc2FyZWx5IGJlIHRoZSBleGFjdCB0eXBlLCBidXQgb25lIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIGl0LgorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZ2V0Q29tcGF0aWJsZVR5cGVJZktub3duKFN0cmluZyBrZXlzcGFjZSk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIEEgZGF0YSB0eXBlIHRoYXQgY2FuIHJlcHJlc2VudCBhbGwgdGhlIHNwZWNpZmllZCB0eXBlcywgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZXJlIGlzbid0IG9uZS4KKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBwdWJsaWMgc3RhdGljIEFic3RyYWN0VHlwZTw/PiBnZXRDb21wYXRpYmxlVHlwZUlmS25vd24oQ29sbGVjdGlvbjxBYnN0cmFjdFR5cGU8Pz4+IHR5cGVzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHR5cGVzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIodHlwZSAtPiB0eXBlcy5zdHJlYW0oKS5hbGxNYXRjaCh0IC0+IHQudGVzdEFzc2lnbm1lbnQodHlwZSkuaXNBc3NpZ25hYmxlKCkpKQorICAgICAgICAgICAgICAgICAgICAuZmluZEZpcnN0KCkKKyAgICAgICAgICAgICAgICAgICAgLm9yRWxzZShudWxsKTsKKyAgICB9CisKICAgICBwdWJsaWMgZW51bSBUZXN0UmVzdWx0CiAgICAgewogICAgICAgICBFWEFDVF9NQVRDSCwgV0VBS0xZX0FTU0lHTkFCTEUsIE5PVF9BU1NJR05BQkxFOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9BdHRyaWJ1dGVzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0F0dHJpYnV0ZXMuamF2YQppbmRleCBlODQxODI4Li41NTk4ODJmIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0F0dHJpYnV0ZXMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0F0dHJpYnV0ZXMuamF2YQpAQCAtMTE3LDYgKzExNywxMSBAQAogICAgICAgICBpZiAodHZhbCA9PSBCeXRlQnVmZmVyVXRpbC5VTlNFVF9CWVRFX0JVRkZFUikKICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YS5wYXJhbXMuZGVmYXVsdFRpbWVUb0xpdmU7CiAKKyAgICAgICAgLy8gYnl0ZVswXSBhbmQgbnVsbCBhcmUgdGhlIHNhbWUgZm9yIEludDMyVHlwZS4gIFVOU0VUX0JZVEVfQlVGRkVSIGlzIGFsc28gYnl0ZVswXSBidXQgd2UgcmVseSBvbiBwb2ludGVyCisgICAgICAgIC8vIGlkZW50aXR5LCBzbyBuZWVkIHRvIGNoZWNrIHRoaXMgYWZ0ZXIgY2hlY2tpbmcgdGhhdAorICAgICAgICBpZiAoQnl0ZUJ1ZmZlclV0aWwuRU1QVFlfQllURV9CVUZGRVIuZXF1YWxzKHR2YWwpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKICAgICAgICAgdHJ5CiAgICAgICAgIHsKICAgICAgICAgICAgIEludDMyVHlwZS5pbnN0YW5jZS52YWxpZGF0ZSh0dmFsKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQ1FMM1R5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQ1FMM1R5cGUuamF2YQppbmRleCAxZDc5MmIyLi4xZGQ2NDFhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0NRTDNUeXBlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9DUUwzVHlwZS5qYXZhCkBAIC0yNCwxMyArMjQsMTMgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Db2xsZWN0aW9uVHlwZS5LaW5kOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuU3ludGF4RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlR5cGVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLkNvbGxlY3Rpb25TZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLk1hcnNoYWxFeGNlcHRpb247CkBAIC01NCw3ICs1NCw2IEBACiAgICAgfQogCiAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRUeXBlKCk7Ci0gICAgZGVmYXVsdCBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGdldFVERlR5cGUoKSB7IHJldHVybiBnZXRUeXBlKCk7IH0KIAogICAgIC8qKgogICAgICAqIEdlbmVyYXRlcyBDUUwgbGl0ZXJhbCBmcm9tIGEgYmluYXJ5IHZhbHVlIG9mIHRoaXMgdHlwZS4KQEAgLTEwMSwxMSArMTAwLDYgQEAKICAgICAgICAgICAgIHJldHVybiB0eXBlOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRVREZUeXBlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMgPT0gVElNRVVVSUQgPyBVVUlELnR5cGUgOiB0eXBlOwotICAgICAgICB9Ci0KICAgICAgICAgLyoqCiAgICAgICAgICAqIERlbGVnYXRlIHRvCiAgICAgICAgICAqIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5UeXBlU2VyaWFsaXplciN0b0NRTExpdGVyYWwoQnl0ZUJ1ZmZlcil9CkBAIC0xNzYsMTQgKzE3MCwxNCBAQAogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb2xsZWN0aW9uIGltcGxlbWVudHMgQ1FMM1R5cGUKICAgICB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvblR5cGUgdHlwZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uVHlwZTw/PiB0eXBlOwogCi0gICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uKENvbGxlY3Rpb25UeXBlIHR5cGUpCisgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uKENvbGxlY3Rpb25UeXBlPD8+IHR5cGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGdldFR5cGUoKQorICAgICAgICBwdWJsaWMgQ29sbGVjdGlvblR5cGU8Pz4gZ2V0VHlwZSgpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiB0eXBlOwogICAgICAgICB9CkBAIC0yMDEsMTkgKzE5NSwxOSBAQAogCiAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHRhcmdldCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBidWZmZXIuZHVwbGljYXRlKCk7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRDb2xsZWN0aW9uU2l6ZShidWZmZXIsIHZlcnNpb24pOwotICAgICAgICAgICAgYnVmZmVyLnBvc2l0aW9uKGJ1ZmZlci5wb3NpdGlvbigpICsgQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mQ29sbGVjdGlvblNpemUoc2l6ZSwgdmVyc2lvbikpOworICAgICAgICAgICAgaW50IHNpemUgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkQ29sbGVjdGlvblNpemUoYnVmZmVyLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UpOworICAgICAgICAgICAgYnVmZmVyLnBvc2l0aW9uKGJ1ZmZlci5wb3NpdGlvbigpICsgQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mQ29sbGVjdGlvblNpemUoKSk7CiAKICAgICAgICAgICAgIHN3aXRjaCAodHlwZS5raW5kKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGNhc2UgTElTVDoKLSAgICAgICAgICAgICAgICAgICAgQ1FMM1R5cGUgZWxlbWVudHMgPSAoKExpc3RUeXBlKSB0eXBlKS5nZXRFbGVtZW50c1R5cGUoKS5hc0NRTDNUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIENRTDNUeXBlIGVsZW1lbnRzID0gKChMaXN0VHlwZTw/PikgdHlwZSkuZ2V0RWxlbWVudHNUeXBlKCkuYXNDUUwzVHlwZSgpOwogICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYXBwZW5kKCdbJyk7CiAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlU2V0T3JMaXN0Q1FMTGl0ZXJhbChidWZmZXIsIHZlcnNpb24sIHRhcmdldCwgc2l6ZSwgZWxlbWVudHMpOwogICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYXBwZW5kKCddJyk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0VUOgotICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyA9ICgoU2V0VHlwZSkgdHlwZSkuZ2V0RWxlbWVudHNUeXBlKCkuYXNDUUwzVHlwZSgpOworICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyA9ICgoU2V0VHlwZTw/PikgdHlwZSkuZ2V0RWxlbWVudHNUeXBlKCkuYXNDUUwzVHlwZSgpOwogICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYXBwZW5kKCd7Jyk7CiAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlU2V0T3JMaXN0Q1FMTGl0ZXJhbChidWZmZXIsIHZlcnNpb24sIHRhcmdldCwgc2l6ZSwgZWxlbWVudHMpOwogICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYXBwZW5kKCd9Jyk7CkBAIC0yMjksMTkgKzIyMywxOSBAQAogCiAgICAgICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZU1hcENRTExpdGVyYWwoQnl0ZUJ1ZmZlciBidWZmZXIsIFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uLCBTdHJpbmdCdWlsZGVyIHRhcmdldCwgaW50IHNpemUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIENRTDNUeXBlIGtleXMgPSAoKE1hcFR5cGUpIHR5cGUpLmdldEtleXNUeXBlKCkuYXNDUUwzVHlwZSgpOwotICAgICAgICAgICAgQ1FMM1R5cGUgdmFsdWVzID0gKChNYXBUeXBlKSB0eXBlKS5nZXRWYWx1ZXNUeXBlKCkuYXNDUUwzVHlwZSgpOworICAgICAgICAgICAgQ1FMM1R5cGUga2V5cyA9ICgoTWFwVHlwZTw/LCA/PikgdHlwZSkuZ2V0S2V5c1R5cGUoKS5hc0NRTDNUeXBlKCk7CisgICAgICAgICAgICBDUUwzVHlwZSB2YWx1ZXMgPSAoKE1hcFR5cGU8PywgPz4pIHR5cGUpLmdldFZhbHVlc1R5cGUoKS5hc0NRTDNUeXBlKCk7CiAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChpID4gMCkKICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGVsZW1lbnQgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkVmFsdWUoYnVmZmVyLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIG9mZnNldCwgdmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZlZhbHVlKGVsZW1lbnQsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBlbGVtZW50ID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZFZhbHVlKGJ1ZmZlciwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIG9mZnNldCArPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZWYWx1ZShlbGVtZW50LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgIHRhcmdldC5hcHBlbmQoa2V5cy50b0NRTExpdGVyYWwoZWxlbWVudCwgdmVyc2lvbikpOwogICAgICAgICAgICAgICAgIHRhcmdldC5hcHBlbmQoIjogIik7Ci0gICAgICAgICAgICAgICAgZWxlbWVudCA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRWYWx1ZShidWZmZXIsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgb2Zmc2V0LCB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mVmFsdWUoZWxlbWVudCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBlbGVtZW50ID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZFZhbHVlKGJ1ZmZlciwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIG9mZnNldCArPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZWYWx1ZShlbGVtZW50LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgIHRhcmdldC5hcHBlbmQodmFsdWVzLnRvQ1FMTGl0ZXJhbChlbGVtZW50LCB2ZXJzaW9uKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTI1Myw4ICsyNDcsOCBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChpID4gMCkKICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGVsZW1lbnQgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkVmFsdWUoYnVmZmVyLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIG9mZnNldCwgdmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZlZhbHVlKGVsZW1lbnQsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBlbGVtZW50ID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZFZhbHVlKGJ1ZmZlciwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIG9mZnNldCArPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZWYWx1ZShlbGVtZW50LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgIHRhcmdldC5hcHBlbmQoZWxlbWVudHMudG9DUUxMaXRlcmFsKGVsZW1lbnQsIHZlcnNpb24pKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjgzLDE2ICsyNzcsMTYgQEAKICAgICAgICAgICAgIHN3aXRjaCAodHlwZS5raW5kKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGNhc2UgTElTVDoKLSAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IGxpc3RUeXBlID0gKChMaXN0VHlwZSl0eXBlKS5nZXRFbGVtZW50c1R5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IGxpc3RUeXBlID0gKChMaXN0VHlwZTw/PikgdHlwZSkuZ2V0RWxlbWVudHNUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgibGlzdDwiKS5hcHBlbmQobGlzdFR5cGUuYXNDUUwzVHlwZSgpKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTRVQ6Ci0gICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiBzZXRUeXBlID0gKChTZXRUeXBlKXR5cGUpLmdldEVsZW1lbnRzVHlwZSgpOworICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gc2V0VHlwZSA9ICgoU2V0VHlwZTw/PikgdHlwZSkuZ2V0RWxlbWVudHNUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgic2V0PCIpLmFwcGVuZChzZXRUeXBlLmFzQ1FMM1R5cGUoKSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgTUFQOgotICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4ga2V5c1R5cGUgPSAoKE1hcFR5cGUpdHlwZSkuZ2V0S2V5c1R5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHZhbHVlc1R5cGUgPSAoKE1hcFR5cGUpdHlwZSkuZ2V0VmFsdWVzVHlwZSgpOworICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4ga2V5c1R5cGUgPSAoKE1hcFR5cGU8PywgPz4pIHR5cGUpLmdldEtleXNUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiB2YWx1ZXNUeXBlID0gKChNYXBUeXBlPD8sID8+KSB0eXBlKS5nZXRWYWx1ZXNUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgibWFwPCIpLmFwcGVuZChrZXlzVHlwZS5hc0NRTDNUeXBlKCkpLmFwcGVuZCgiLCAiKS5hcHBlbmQodmFsdWVzVHlwZS5hc0NRTDNUeXBlKCkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtNDE2LDcgKzQxMCw3IEBACiAgICAgICAgICAgICByZXR1cm4gbmV3IFR1cGxlKHR5cGUpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRUeXBlKCkKKyAgICAgICAgcHVibGljIFR1cGxlVHlwZSBnZXRUeXBlKCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQ29uc3RhbnRzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0NvbnN0YW50cy5qYXZhCmluZGV4IDY0ZDlkNjkuLmY0NDE4ZmQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQ29uc3RhbnRzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9Db25zdGFudHMuamF2YQpAQCAtMjAsMTcgKzIwLDE1IEBACiBpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogCi1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLk1hcnNoYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKQEAgLTQxLDE1ICszOSwxNCBAQAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29uc3RhbnRzCiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbnN0YW50cy5jbGFzcyk7Ci0KICAgICBwdWJsaWMgZW51bSBUeXBlCiAgICAgewogICAgICAgICBTVFJJTkcKICAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGdldFByZWZlcmVkVHlwZUZvcihTdHJpbmcgdGV4dCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgaWYoQ2hhcnNldC5mb3JOYW1lKCJVUy1BU0NJSSIpLm5ld0VuY29kZXIoKS5jYW5FbmNvZGUodGV4dCkpCisgICAgICAgICAgICAgICAgIGlmIChTdGFuZGFyZENoYXJzZXRzLlVTX0FTQ0lJLm5ld0VuY29kZXIoKS5jYW5FbmNvZGUodGV4dCkpCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBc2NpaVR5cGUuaW5zdGFuY2U7CiAgICAgICAgICAgICAgICAgIH0KQEAgLTU5LDYgKzU2LDcgQEAKICAgICAgICAgfSwKICAgICAgICAgSU5URUdFUgogICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZ2V0UHJlZmVyZWRUeXBlRm9yKFN0cmluZyB0ZXh0KQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgdHJ5IHRvIGRldGVybWluZSB0aGUgc21hbGxlc3QgcG9zc2libGUgdHlwZSBiZXR3ZWVuIGludCwgbG9uZyBhbmQgQmlnSW50ZWdlcgpAQCAtNzMsOSArNzEsMTkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlclR5cGUuaW5zdGFuY2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0sCi0gICAgICAgIFVVSUQsCisgICAgICAgIFVVSUQKKyAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGdldFByZWZlcmVkVHlwZUZvcihTdHJpbmcgdGV4dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gamF2YS51dGlsLlVVSUQuZnJvbVN0cmluZyh0ZXh0KS52ZXJzaW9uKCkgPT0gMQorICAgICAgICAgICAgICAgICAgICAgICA/IFRpbWVVVUlEVHlwZS5pbnN0YW5jZQorICAgICAgICAgICAgICAgICAgICAgICA6IFVVSURUeXBlLmluc3RhbmNlOworICAgICAgICAgICAgfQorICAgICAgICB9LAogICAgICAgICBGTE9BVAogICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZ2V0UHJlZmVyZWRUeXBlRm9yKFN0cmluZyB0ZXh0KQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmICgiTmFOIi5lcXVhbHModGV4dCkgfHwgIi1OYU4iLmVxdWFscyh0ZXh0KSB8fCAiSW5maW5pdHkiLmVxdWFscyh0ZXh0KSB8fCAiLUluZmluaXR5Ii5lcXVhbHModGV4dCkpCkBAIC05MCw5ICs5OCwzMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBEZWNpbWFsVHlwZS5pbnN0YW5jZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSwKLSAgICAgICAgQk9PTEVBTiwKLSAgICAgICAgSEVYLAotICAgICAgICBEVVJBVElPTjsKKyAgICAgICAgQk9PTEVBTgorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZ2V0UHJlZmVyZWRUeXBlRm9yKFN0cmluZyB0ZXh0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuVHlwZS5pbnN0YW5jZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgSEVYCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRQcmVmZXJlZFR5cGVGb3IoU3RyaW5nIHRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJ5dGVUeXBlLmluc3RhbmNlOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBEVVJBVElPTgorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZ2V0UHJlZmVyZWRUeXBlRm9yKFN0cmluZyB0ZXh0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBEdXJhdGlvblR5cGUuaW5zdGFuY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH07CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFJldHVybnMgdGhlIGV4YWN0IHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgdGV4dApAQCAtMzYyLDYgKzM5MSwxMiBAQAogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRDb21wYXRpYmxlVHlwZUlmS25vd24oU3RyaW5nIGtleXNwYWNlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcHJlZmVyZWRUeXBlOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIFN0cmluZyBnZXRSYXdUZXh0KCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIHRleHQ7CkBAIC0zODUsNyArNDIwLDcgQEAKICAgICAgICAgICAgIHRoaXMuYnl0ZXMgPSBieXRlczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKQorICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXQoUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBieXRlczsKICAgICAgICAgfQpAQCAtNDk0LDEwICs1MjksOSBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYXBwZW5kID0gdC5iaW5kQW5kR2V0KHBhcmFtcy5vcHRpb25zKTsKICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGN1cnJlbnQgPSBnZXRDdXJyZW50Q2VsbEJ1ZmZlcihwYXJ0aXRpb25LZXksIHBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBuZXdWYWx1ZTsKICAgICAgICAgICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsKQogICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgbmV3VmFsdWUgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGN1cnJlbnQucmVtYWluaW5nKCkgKyBhcHBlbmQucmVtYWluaW5nKCkpOworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgbmV3VmFsdWUgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGN1cnJlbnQucmVtYWluaW5nKCkgKyBhcHBlbmQucmVtYWluaW5nKCkpOwogICAgICAgICAgICAgICAgIEZhc3RCeXRlT3BlcmF0aW9ucy5jb3B5KGN1cnJlbnQsIGN1cnJlbnQucG9zaXRpb24oKSwgbmV3VmFsdWUsIG5ld1ZhbHVlLnBvc2l0aW9uKCksIGN1cnJlbnQucmVtYWluaW5nKCkpOwogICAgICAgICAgICAgICAgIEZhc3RCeXRlT3BlcmF0aW9ucy5jb3B5KGFwcGVuZCwgYXBwZW5kLnBvc2l0aW9uKCksIG5ld1ZhbHVlLCBuZXdWYWx1ZS5wb3NpdGlvbigpICsgY3VycmVudC5yZW1haW5pbmcoKSwgYXBwZW5kLnJlbWFpbmluZygpKTsKICAgICAgICAgICAgICAgICBwYXJhbXMuYWRkQ2VsbChjb2x1bW4sIG5ld1ZhbHVlKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQ3VzdG9tUGF5bG9hZE1pcnJvcmluZ1F1ZXJ5SGFuZGxlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9DdXN0b21QYXlsb2FkTWlycm9yaW5nUXVlcnlIYW5kbGVyLmphdmEKaW5kZXggMTNhYTdmNS4uYWY3NjVkMCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9DdXN0b21QYXlsb2FkTWlycm9yaW5nUXVlcnlIYW5kbGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9DdXN0b21QYXlsb2FkTWlycm9yaW5nUXVlcnlIYW5kbGVyLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc3RhdGVtZW50cy5CYXRjaFN0YXRlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNsaWVudFN0YXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuUXVlcnlTdGF0ZTsKQEAgLTI5LDcgKzMwLDcgQEAKIC8qKgogICogQ3VzdG9tIFF1ZXJ5SGFuZGxlciB0aGF0IHNlbmRzIGN1c3RvbSByZXF1ZXN0IHBheWxvYWRzIGJhY2sgd2l0aCB0aGUgcmVzdWx0LgogICogVXNlZCB0byBmYWNpbGl0YXRlIHRlc3RpbmcuCi0gKiBFbmFibGVkIHdpdGggc3lzdGVtIHByb3BlcnR5IGNhc3NhbmRyYS5jdXN0b21fcXVlcnlfaGFuZGxlcl9jbGFzcy4KKyAqIEVuYWJsZWQgd2l0aCBzeXN0ZW0gcHJvcGVydHkge0BsaW5rIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyNDVVNUT01fUVVFUllfSEFORExFUl9DTEFTU30uCiAgKi8KIHB1YmxpYyBjbGFzcyBDdXN0b21QYXlsb2FkTWlycm9yaW5nUXVlcnlIYW5kbGVyIGltcGxlbWVudHMgUXVlcnlIYW5kbGVyCiB7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0pzb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvSnNvbi5qYXZhCmluZGV4IGQwNTA5NmEuLmQ2MGVhYmQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvSnNvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvSnNvbi5qYXZhCkBAIC0xOCw0NCArMTgsMzEgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMzsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAotaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlLnV0aWwuQnVmZmVyUmVjeWNsZXJzOwotaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Kc29uVXRpbHM7CiAKLS8qKiBUZXJtLXJlbGF0ZWQgY2xhc3NlcyBmb3IgSU5TRVJUIEpTT04gc3VwcG9ydC4gKi8KLXB1YmxpYyBjbGFzcyBKc29uCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworCisvKioKKyAqIFRlcm0tcmVsYXRlZCBjbGFzc2VzIGZvciBJTlNFUlQgSlNPTiBzdXBwb3J0LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSnNvbgogewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0TWFwcGVyIEpTT05fT0JKRUNUX01BUFBFUiA9IG5ldyBPYmplY3RNYXBwZXIoKTsKLQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uSWRlbnRpZmllciBKU09OX0NPTFVNTl9JRCA9IG5ldyBDb2x1bW5JZGVudGlmaWVyKCJbanNvbl0iLCB0cnVlKTsKIAotICAgIC8qKgotICAgICAqIFF1b3RlcyBzdHJpbmcgY29udGVudHMgdXNpbmcgc3RhbmRhcmQgSlNPTiBxdW90aW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHF1b3RlQXNKc29uU3RyaW5nKFN0cmluZyBzKQorICAgIHByaXZhdGUgSnNvbigpCiAgICAgewotICAgICAgICAvLyBJbiBmdXR1cmUgc2hvdWxkIHVwZGF0ZSB0byBkaXJlY3RseSB1c2UgYEpzb25TdHJpbmdFbmNvZGVyLmdldEluc3RhbmNlKClgIGJ1dCBmb3Igbm93OgotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhCdWZmZXJSZWN5Y2xlcnMuZ2V0SnNvblN0cmluZ0VuY29kZXIoKS5xdW90ZUFzU3RyaW5nKHMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBkZWNvZGVKc29uKFN0cmluZyBqc29uKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBKU09OX09CSkVDVF9NQVBQRVIucmVhZFZhbHVlKGpzb24sIE9iamVjdC5jbGFzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4YykKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oIkVycm9yIGRlY29kaW5nIEpTT04gc3RyaW5nOiAiICsgZXhjLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgaW50ZXJmYWNlIFJhdwpAQCAtMTMxLDEzICsxMTgsMTMgQEAKICAgICAgICAgewogICAgICAgICAgICAgVGVybSB2YWx1ZSA9IGNvbHVtbk1hcC5nZXQoZGVmLm5hbWUpOwogICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwKLSAgICAgICAgICAgICAgICAgPyAoZGVmYXVsdFVuc2V0ID8gQ29uc3RhbnRzLlVOU0VUX0xJVEVSQUwgOiBDb25zdGFudHMuTlVMTF9MSVRFUkFMKQotICAgICAgICAgICAgICAgICA6IG5ldyBDb2x1bW5WYWx1ZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgPyAoZGVmYXVsdFVuc2V0ID8gQ29uc3RhbnRzLlVOU0VUX0xJVEVSQUwgOiBDb25zdGFudHMuTlVMTF9MSVRFUkFMKQorICAgICAgICAgICAgICAgICAgIDogbmV3IENvbHVtblZhbHVlKHZhbHVlKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqICBBIHByZXBhcmVkIGJpbmQgbWFya2VyIGZvciBhIHNldCBvZiBKU09OIHZhbHVlcworICAgICAqIEEgcHJlcGFyZWQgYmluZCBtYXJrZXIgZm9yIGEgc2V0IG9mIEpTT04gdmFsdWVzCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJlcGFyZWRNYXJrZXIgZXh0ZW5kcyBQcmVwYXJlZAogICAgIHsKQEAgLTE1OCw3ICsxNDUsNyBAQAogCiAgICAgLyoqCiAgICAgICogQSBUZXJtaW5hbCBmb3IgYSBzaW5nbGUgY29sdW1uLgotICAgICAqCisgICAgICogPHA+CiAgICAgICogTm90ZSB0aGF0IHRoaXMgaXMgaW50cmluc2ljYWxseSBhbiBhbHJlYWR5IHByZXBhcmVkIHRlcm0sIGJ1dCB0aGlzIHN0aWxsIGltcGxlbWVudHMgVGVybS5SYXcgc28gdGhhdCB3ZSBjYW4KICAgICAgKiBlYXNpbHkgdXNlIGl0IHRvIGNyZWF0ZSByYXcgb3BlcmF0aW9ucy4KICAgICAgKi8KQEAgLTI2Niw4ICsyNTMsOCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBUZXJtIHRlcm0gPSBvcHRpb25zLmdldEpzb25Db2x1bW5WYWx1ZShtYXJrZXIuYmluZEluZGV4LCBjb2x1bW4ubmFtZSwgbWFya2VyLmNvbHVtbnMpOwogICAgICAgICAgICAgcmV0dXJuIHRlcm0gPT0gbnVsbAotICAgICAgICAgICAgICAgICA/IChkZWZhdWx0VW5zZXQgPyBDb25zdGFudHMuVU5TRVRfVkFMVUUgOiBudWxsKQotICAgICAgICAgICAgICAgICA6IHRlcm0uYmluZChvcHRpb25zKTsKKyAgICAgICAgICAgICAgICAgICA/IChkZWZhdWx0VW5zZXQgPyBDb25zdGFudHMuVU5TRVRfVkFMVUUgOiBudWxsKQorICAgICAgICAgICAgICAgICAgIDogdGVybS5iaW5kKG9wdGlvbnMpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC0yNzksMTYgKzI2NiwxNiBAQAogICAgIC8qKgogICAgICAqIEdpdmVuIGEgSlNPTiBzdHJpbmcsIHJldHVybiBhIG1hcCBvZiBjb2x1bW5zIHRvIHRoZWlyIHZhbHVlcyBmb3IgdGhlIGluc2VydC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1hcDxDb2x1bW5JZGVudGlmaWVyLCBUZXJtPiBwYXJzZUpzb24oU3RyaW5nIGpzb25TdHJpbmcsIENvbGxlY3Rpb248Q29sdW1uTWV0YWRhdGE+IGV4cGVjdGVkUmVjZWl2ZXJzKQorICAgIHN0YXRpYyBNYXA8Q29sdW1uSWRlbnRpZmllciwgVGVybT4gcGFyc2VKc29uKFN0cmluZyBqc29uU3RyaW5nLCBDb2xsZWN0aW9uPENvbHVtbk1ldGFkYXRhPiBleHBlY3RlZFJlY2VpdmVycykKICAgICB7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHZhbHVlTWFwID0gSlNPTl9PQkpFQ1RfTUFQUEVSLnJlYWRWYWx1ZShqc29uU3RyaW5nLCBNYXAuY2xhc3MpOworICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiB2YWx1ZU1hcCA9IEpzb25VdGlscy5KU09OX09CSkVDVF9NQVBQRVIucmVhZFZhbHVlKGpzb25TdHJpbmcsIE1hcC5jbGFzcyk7CiAKICAgICAgICAgICAgIGlmICh2YWx1ZU1hcCA9PSBudWxsKQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbigiR290IG51bGwgZm9yIElOU0VSVCBKU09OIHZhbHVlcyIpOwogCi0gICAgICAgICAgICBoYW5kbGVDYXNlU2Vuc2l0aXZpdHkodmFsdWVNYXApOworICAgICAgICAgICAgSnNvblV0aWxzLmhhbmRsZUNhc2VTZW5zaXRpdml0eSh2YWx1ZU1hcCk7CiAKICAgICAgICAgICAgIE1hcDxDb2x1bW5JZGVudGlmaWVyLCBUZXJtPiBjb2x1bW5NYXAgPSBuZXcgSGFzaE1hcDw+KGV4cGVjdGVkUmVjZWl2ZXJzLnNpemUoKSk7CiAgICAgICAgICAgICBmb3IgKENvbHVtblNwZWNpZmljYXRpb24gc3BlYyA6IGV4cGVjdGVkUmVjZWl2ZXJzKQpAQCAtMzEwLDQ5ICsyOTcsMjggQEAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uTWFwLnB1dChzcGVjLm5hbWUsIHNwZWMudHlwZS5mcm9tSlNPTk9iamVjdChwYXJzZWRKc29uT2JqZWN0KSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2goTWFyc2hhbEV4Y2VwdGlvbiBleGMpCisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChNYXJzaGFsRXhjZXB0aW9uIGV4YykKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkVycm9yIGRlY29kaW5nIEpTT04gdmFsdWUgZm9yICVzOiAlcyIsIHNwZWMubmFtZSwgZXhjLmdldE1lc3NhZ2UoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKGZvcm1hdCgiRXJyb3IgZGVjb2RpbmcgSlNPTiB2YWx1ZSBmb3IgJXM6ICVzIiwgc3BlYy5uYW1lLCBleGMuZ2V0TWVzc2FnZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmICghdmFsdWVNYXAuaXNFbXB0eSgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgIkpTT04gdmFsdWVzIG1hcCBjb250YWlucyB1bnJlY29nbml6ZWQgY29sdW1uOiAlcyIsIHZhbHVlTWFwLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKGZvcm1hdCgiSlNPTiB2YWx1ZXMgbWFwIGNvbnRhaW5zIHVucmVjb2duaXplZCBjb2x1bW46ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlTWFwLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBjb2x1bW5NYXA7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4YykKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkNvdWxkIG5vdCBkZWNvZGUgSlNPTiBzdHJpbmcgYXMgYSBtYXA6ICVzLiAoU3RyaW5nIHdhczogJXMpIiwgZXhjLnRvU3RyaW5nKCksIGpzb25TdHJpbmcpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbihmb3JtYXQoIkNvdWxkIG5vdCBkZWNvZGUgSlNPTiBzdHJpbmcgYXMgYSBtYXA6ICVzLiAoU3RyaW5nIHdhczogJXMpIiwgZXhjLnRvU3RyaW5nKCksIGpzb25TdHJpbmcpKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoTWFyc2hhbEV4Y2VwdGlvbiBleGMpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbihleGMuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgfQogICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgdW5xdW90aW5nIGFuZCBjYXNlLWluc2Vuc2l0aXZpdHkgaW4gbWFwIGtleXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZUNhc2VTZW5zaXRpdml0eShNYXA8U3RyaW5nLCBPYmplY3Q+IHZhbHVlTWFwKQotICAgIHsKLSAgICAgICAgZm9yIChTdHJpbmcgbWFwS2V5IDogbmV3IEFycmF5TGlzdDw+KHZhbHVlTWFwLmtleVNldCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gaWYgaXQncyBzdXJyb3VuZGVkIGJ5IHF1b3RlcywgcmVtb3ZlIHRoZW0gYW5kIHByZXNlcnZlIHRoZSBjYXNlCi0gICAgICAgICAgICBpZiAobWFwS2V5LnN0YXJ0c1dpdGgoIlwiIikgJiYgbWFwS2V5LmVuZHNXaXRoKCJcIiIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbHVlTWFwLnB1dChtYXBLZXkuc3Vic3RyaW5nKDEsIG1hcEtleS5sZW5ndGgoKSAtIDEpLCB2YWx1ZU1hcC5yZW1vdmUobWFwS2V5KSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgbG93ZXJjYXNlIGl0IGlmIG5lZWRlZAotICAgICAgICAgICAgU3RyaW5nIGxvd2VyZWQgPSBtYXBLZXkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKTsKLSAgICAgICAgICAgIGlmICghbWFwS2V5LmVxdWFscyhsb3dlcmVkKSkKLSAgICAgICAgICAgICAgICB2YWx1ZU1hcC5wdXQobG93ZXJlZCwgdmFsdWVNYXAucmVtb3ZlKG1hcEtleSkpOwotICAgICAgICB9Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9MaXN0cy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9MaXN0cy5qYXZhCmluZGV4IGJkYWMwNDYuLjYwNWE4YmUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvTGlzdHMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0xpc3RzLmphdmEKQEAgLTE3LDE1ICsxNywxMiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDM7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Db25zdGFudHMuVU5TRVRfVkFMVUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpczsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQuR2VuZXJhdG9yLmF0VW5peE1pbGxpc0FzQnl0ZXM7Ci0KIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiBpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW1TdXBwb3J0OwpAQCAtNDcsNiArNDQsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ29uc3RhbnRzLlVOU0VUX1ZBTFVFOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwuY3VycmVudFRpbWVNaWxsaXM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlELkdlbmVyYXRvci5hdFVuaXhNaWxsaXNBc0J5dGVzOworCiAvKioKICAqIFN0YXRpYyBoZWxwZXIgbWV0aG9kcyBhbmQgY2xhc3NlcyBmb3IgbGlzdHMuCiAgKi8KQEAgLTcxLDcgKzcyLDcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIEFic3RyYWN0VHlwZTw/PiBlbGVtZW50c1R5cGUoQWJzdHJhY3RUeXBlPD8+IHR5cGUpCiAgICAgewotICAgICAgICByZXR1cm4gKChMaXN0VHlwZSkgdW53cmFwKHR5cGUpKS5nZXRFbGVtZW50c1R5cGUoKTsKKyAgICAgICAgcmV0dXJuICgoTGlzdFR5cGU8Pz4pIHVud3JhcCh0eXBlKSkuZ2V0RWxlbWVudHNUeXBlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTYsNyArMTE3LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIDxUPiBTdHJpbmcgbGlzdFRvU3RyaW5nKEl0ZXJhYmxlPFQ+IGl0ZW1zLCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248VCwgU3RyaW5nPiBtYXBwZXIpCiAgICAgewogICAgICAgICByZXR1cm4gU3RyZWFtU3VwcG9ydC5zdHJlYW0oaXRlbXMuc3BsaXRlcmF0b3IoKSwgZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChlIC0+IG1hcHBlci5hcHBseShlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKG1hcHBlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwgIiwgIlsiLCAiXSIpKTsKICAgICB9CiAKQEAgLTEyNywxMyArMTI4LDIxIEBACiAgICAgICogQHBhcmFtIG1hcHBlciB0aGUgbWFwcGVyIHVzZWQgdG8gcmV0cmlldmUgdGhlIGVsZW1lbnQgdHlwZXMgZnJvbSB0aGUgaXRlbXMKICAgICAgKiBAcmV0dXJuIHRoZSBleGFjdCBMaXN0VHlwZSBmcm9tIHRoZSBpdGVtcyBpZiBpdCBjYW4gYmUga25vd24gb3IgPGNvZGU+bnVsbDwvY29kZT4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxUPiBBYnN0cmFjdFR5cGU8Pz4gZ2V0RXhhY3RMaXN0VHlwZUlmS25vd24oTGlzdDxUPiBpdGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPFQsIEFic3RyYWN0VHlwZTw/Pj4gbWFwcGVyKQorICAgIHB1YmxpYyBzdGF0aWMgPFQ+IExpc3RUeXBlPD8+IGdldEV4YWN0TGlzdFR5cGVJZktub3duKExpc3Q8VD4gaXRlbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPFQsIEFic3RyYWN0VHlwZTw/Pj4gbWFwcGVyKQogICAgIHsKICAgICAgICAgT3B0aW9uYWw8QWJzdHJhY3RUeXBlPD8+PiB0eXBlID0gaXRlbXMuc3RyZWFtKCkubWFwKG1hcHBlcikuZmlsdGVyKE9iamVjdHM6Om5vbk51bGwpLmZpbmRGaXJzdCgpOwogICAgICAgICByZXR1cm4gdHlwZS5pc1ByZXNlbnQoKSA/IExpc3RUeXBlLmdldEluc3RhbmNlKHR5cGUuZ2V0KCksIGZhbHNlKSA6IG51bGw7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyA8VD4gTGlzdFR5cGU8Pz4gZ2V0UHJlZmVycmVkQ29tcGF0aWJsZVR5cGUoTGlzdDxUPiBpdGVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248VCwgQWJzdHJhY3RUeXBlPD8+PiBtYXBwZXIpCisgICAgeworICAgICAgICBTZXQ8QWJzdHJhY3RUeXBlPD8+PiB0eXBlcyA9IGl0ZW1zLnN0cmVhbSgpLm1hcChtYXBwZXIpLmZpbHRlcihPYmplY3RzOjpub25OdWxsKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisgICAgICAgIEFic3RyYWN0VHlwZTw/PiB0eXBlID0gQXNzaWdubWVudFRlc3RhYmxlLmdldENvbXBhdGlibGVUeXBlSWZLbm93bih0eXBlcyk7CisgICAgICAgIHJldHVybiB0eXBlID09IG51bGwgPyBudWxsIDogTGlzdFR5cGUuZ2V0SW5zdGFuY2UodHlwZSwgZmFsc2UpOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGl0ZXJhbCBleHRlbmRzIFRlcm0uUmF3CiAgICAgewogICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8VGVybS5SYXc+IGVsZW1lbnRzOwpAQCAtMTkyLDYgKzIwMSwxMiBAQAogICAgICAgICAgICAgcmV0dXJuIGdldEV4YWN0TGlzdFR5cGVJZktub3duKGVsZW1lbnRzLCBwIC0+IHAuZ2V0RXhhY3RUeXBlSWZLbm93bihrZXlzcGFjZSkpOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZ2V0Q29tcGF0aWJsZVR5cGVJZktub3duKFN0cmluZyBrZXlzcGFjZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIExpc3RzLmdldFByZWZlcnJlZENvbXBhdGlibGVUeXBlKGVsZW1lbnRzLCBwIC0+IHAuZ2V0Q29tcGF0aWJsZVR5cGVJZktub3duKGtleXNwYWNlKSk7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gbGlzdFRvU3RyaW5nKGVsZW1lbnRzLCBUZXJtLlJhdzo6Z2V0VGV4dCk7CkBAIC0yMDcsMTUgKzIyMiwxNSBAQAogICAgICAgICAgICAgdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHN0YXRpYyBWYWx1ZSBmcm9tU2VyaWFsaXplZChCeXRlQnVmZmVyIHZhbHVlLCBMaXN0VHlwZSB0eXBlLCBQcm90b2NvbFZlcnNpb24gdmVyc2lvbikgdGhyb3dzIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uCisgICAgICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFZhbHVlIGZyb21TZXJpYWxpemVkKEJ5dGVCdWZmZXIgdmFsdWUsIExpc3RUeXBlPFQ+IHR5cGUpIHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBDb2xsZWN0aW9ucyBoYXZlIHRoaXMgc21hbGwgaGFjayB0aGF0IHZhbGlkYXRlIGNhbm5vdCBiZSBjYWxsZWQgb24gYSBzZXJpYWxpemVkIG9iamVjdCwKICAgICAgICAgICAgICAgICAvLyBidXQgY29tcG9zZSBkb2VzIHRoZSB2YWxpZGF0aW9uIChzbyB3ZSdyZSBmaW5lKS4KLSAgICAgICAgICAgICAgICBMaXN0PD8+IGwgPSB0eXBlLmdldFNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZUZvck5hdGl2ZVByb3RvY29sKHZhbHVlLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIHZlcnNpb24pOworICAgICAgICAgICAgICAgIExpc3Q8VD4gbCA9IHR5cGUuZ2V0U2VyaWFsaXplcigpLmRlc2VyaWFsaXplKHZhbHVlLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PD4obC5zaXplKCkpOwotICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IGVsZW1lbnQgOiBsKQorICAgICAgICAgICAgICAgIGZvciAoVCBlbGVtZW50IDogbCkKICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgY2FuIGJlIG51bGwgaW4gbGlzdHMgdGhhdCByZXByZXNlbnQgYSBzZXQgb2YgSU4gdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLmFkZChlbGVtZW50ID09IG51bGwgPyBudWxsIDogdHlwZS5nZXRFbGVtZW50c1R5cGUoKS5kZWNvbXBvc2UoZWxlbWVudCkpOwogICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWUoZWxlbWVudHMpOwpAQCAtMjI2LDEyICsyNDEsMTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKQorICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXQoUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKGVsZW1lbnRzLCBlbGVtZW50cy5zaXplKCksIHByb3RvY29sVmVyc2lvbik7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvblNlcmlhbGl6ZXIucGFjayhlbGVtZW50cywgZWxlbWVudHMuc2l6ZSgpKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhMaXN0VHlwZSBsdCwgVmFsdWUgdikKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKExpc3RUeXBlPD8+IGx0LCBWYWx1ZSB2KQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoZWxlbWVudHMuc2l6ZSgpICE9IHYuZWxlbWVudHMuc2l6ZSgpKQogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTMxOCw3ICszMzMsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgaWYgKHZhbHVlID09IEJ5dGVCdWZmZXJVdGlsLlVOU0VUX0JZVEVfQlVGRkVSKQogICAgICAgICAgICAgICAgIHJldHVybiBVTlNFVF9WQUxVRTsKLSAgICAgICAgICAgIHJldHVybiBWYWx1ZS5mcm9tU2VyaWFsaXplZCh2YWx1ZSwgKExpc3RUeXBlKXJlY2VpdmVyLnR5cGUsIG9wdGlvbnMuZ2V0UHJvdG9jb2xWZXJzaW9uKCkpOworICAgICAgICAgICAgcmV0dXJuIFZhbHVlLmZyb21TZXJpYWxpemVkKHZhbHVlLCAoTGlzdFR5cGU8Pz4pIHJlY2VpdmVyLnR5cGUpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL01hcHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvTWFwcy5qYXZhCmluZGV4IGEyZDIzYTYuLjkwNDBkMWEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvTWFwcy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvTWFwcy5qYXZhCkBAIC0xNywyNSArMTcsMzggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzOwogCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ29uc3RhbnRzLlVOU0VUX1ZBTFVFOwotCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzLkd1YXJkcmFpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHMuR3VhcmRyYWlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVCdWZmZXJBY2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLk1hcFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5SZXZlcnNlZFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ2VsbFBhdGg7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuQ29sbGVjdGlvblNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Db25zdGFudHMuVU5TRVRfVkFMVUU7CisKIC8qKgogICogU3RhdGljIGhlbHBlciBtZXRob2RzIGFuZCBjbGFzc2VzIGZvciBtYXBzLgogICovCkBAIC0xMjgsOCArMTQxLDggQEAKICAgICAgKiBAcGFyYW0gbWFwcGVyIHRoZSBtYXBwZXIgdXNlZCB0byByZXRyaWV2ZSB0aGUga2V5IGFuZCB2YWx1ZSB0eXBlcyBmcm9tIHRoZSBlbnRyaWVzCiAgICAgICogQHJldHVybiB0aGUgZXhhY3QgTWFwVHlwZSBmcm9tIHRoZSBlbnRyaWVzIGlmIGl0IGNhbiBiZSBrbm93biBvciA8Y29kZT5udWxsPC9jb2RlPgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IEFic3RyYWN0VHlwZTw/PiBnZXRFeGFjdE1hcFR5cGVJZktub3duKExpc3Q8UGFpcjxULCBUPj4gZW50cmllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248VCwgQWJzdHJhY3RUeXBlPD8+PiBtYXBwZXIpCisgICAgcHVibGljIHN0YXRpYyA8VD4gTWFwVHlwZTw/LCA/PiBnZXRFeGFjdE1hcFR5cGVJZktub3duKExpc3Q8UGFpcjxULCBUPj4gZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPFQsIEFic3RyYWN0VHlwZTw/Pj4gbWFwcGVyKQogICAgIHsKICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IGtleVR5cGUgPSBudWxsOwogICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdmFsdWVUeXBlID0gbnVsbDsKQEAgLTE0NSw2ICsxNTgsMjIgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyA8VD4gTWFwVHlwZTw/LCA/PiBnZXRQcmVmZXJyZWRDb21wYXRpYmxlVHlwZShMaXN0PFBhaXI8VCwgVD4+IGVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248VCwgQWJzdHJhY3RUeXBlPD8+PiBtYXBwZXIpCisgICAgeworICAgICAgICBTZXQ8QWJzdHJhY3RUeXBlPD8+PiBrZXlUeXBlcyA9IGVudHJpZXMuc3RyZWFtKCkubWFwKFBhaXI6OmxlZnQpLm1hcChtYXBwZXIpLmZpbHRlcihPYmplY3RzOjpub25OdWxsKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisgICAgICAgIEFic3RyYWN0VHlwZTw/PiBrZXlUeXBlID0gQXNzaWdubWVudFRlc3RhYmxlLmdldENvbXBhdGlibGVUeXBlSWZLbm93bihrZXlUeXBlcyk7CisgICAgICAgIGlmIChrZXlUeXBlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBTZXQ8QWJzdHJhY3RUeXBlPD8+PiB2YWx1ZVR5cGVzID0gZW50cmllcy5zdHJlYW0oKS5tYXAoUGFpcjo6cmlnaHQpLm1hcChtYXBwZXIpLmZpbHRlcihPYmplY3RzOjpub25OdWxsKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisgICAgICAgIEFic3RyYWN0VHlwZTw/PiB2YWx1ZVR5cGUgPSBBc3NpZ25tZW50VGVzdGFibGUuZ2V0Q29tcGF0aWJsZVR5cGVJZktub3duKHZhbHVlVHlwZXMpOworICAgICAgICBpZiAodmFsdWVUeXBlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICByZXR1cm4gIE1hcFR5cGUuZ2V0SW5zdGFuY2Uoa2V5VHlwZSwgdmFsdWVUeXBlLCBmYWxzZSk7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMaXRlcmFsIGV4dGVuZHMgVGVybS5SYXcKICAgICB7CiAgICAgICAgIHB1YmxpYyBmaW5hbCBMaXN0PFBhaXI8VGVybS5SYXcsIFRlcm0uUmF3Pj4gZW50cmllczsKQEAgLTIwOCw2ICsyMzcsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBnZXRFeGFjdE1hcFR5cGVJZktub3duKGVudHJpZXMsIHAgLT4gcC5nZXRFeGFjdFR5cGVJZktub3duKGtleXNwYWNlKSk7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRDb21wYXRpYmxlVHlwZUlmS25vd24oU3RyaW5nIGtleXNwYWNlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTWFwcy5nZXRQcmVmZXJyZWRDb21wYXRpYmxlVHlwZShlbnRyaWVzLCBwIC0+IHAuZ2V0Q29tcGF0aWJsZVR5cGVJZktub3duKGtleXNwYWNlKSk7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gbWFwVG9TdHJpbmcoZW50cmllcywgVGVybS5SYXc6OmdldFRleHQpOwpAQCAtMjIzLDE2ICsyNTgsMTYgQEAKICAgICAgICAgICAgIHRoaXMubWFwID0gbWFwOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHN0YXRpYyBWYWx1ZSBmcm9tU2VyaWFsaXplZChCeXRlQnVmZmVyIHZhbHVlLCBNYXBUeXBlIHR5cGUsIFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uKSB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KKyAgICAgICAgcHVibGljIHN0YXRpYyA8SywgVj4gVmFsdWUgZnJvbVNlcmlhbGl6ZWQoQnl0ZUJ1ZmZlciB2YWx1ZSwgTWFwVHlwZTxLLCBWPiB0eXBlKSB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy8gQ29sbGVjdGlvbnMgaGF2ZSB0aGlzIHNtYWxsIGhhY2sgdGhhdCB2YWxpZGF0ZSBjYW5ub3QgYmUgY2FsbGVkIG9uIGEgc2VyaWFsaXplZCBvYmplY3QsCiAgICAgICAgICAgICAgICAgLy8gYnV0IGNvbXBvc2UgZG9lcyB0aGUgdmFsaWRhdGlvbiAoc28gd2UncmUgZmluZSkuCi0gICAgICAgICAgICAgICAgTWFwPD8sID8+IG0gPSB0eXBlLmdldFNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZUZvck5hdGl2ZVByb3RvY29sKHZhbHVlLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIHZlcnNpb24pOworICAgICAgICAgICAgICAgIE1hcDxLLCBWPiBtID0gdHlwZS5nZXRTZXJpYWxpemVyKCkuZGVzZXJpYWxpemUodmFsdWUsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgLy8gV2UgZGVwZW5kIG9uIE1hcHMgdG8gYmUgcHJvcGVybHkgc29ydGVkIGJ5IHRoZWlyIGtleXMsIHNvIHVzZSBhIHNvcnRlZCBtYXAgaW1wbGVtZW50YXRpb24gaGVyZS4KICAgICAgICAgICAgICAgICBTb3J0ZWRNYXA8Qnl0ZUJ1ZmZlciwgQnl0ZUJ1ZmZlcj4gbWFwID0gbmV3IFRyZWVNYXA8Pih0eXBlLmdldEtleXNUeXBlKCkpOwotICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PD8sID8+IGVudHJ5IDogbS5lbnRyeVNldCgpKQorICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PEssIFY+IGVudHJ5IDogbS5lbnRyeVNldCgpKQogICAgICAgICAgICAgICAgICAgICBtYXAucHV0KHR5cGUuZ2V0S2V5c1R5cGUoKS5kZWNvbXBvc2UoZW50cnkuZ2V0S2V5KCkpLCB0eXBlLmdldFZhbHVlc1R5cGUoKS5kZWNvbXBvc2UoZW50cnkuZ2V0VmFsdWUoKSkpOwogICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWUobWFwKTsKICAgICAgICAgICAgIH0KQEAgLTI0Myw3ICsyNzgsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKQorICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXQoUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pCiAgICAgICAgIHsKICAgICAgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gYnVmZmVycyA9IG5ldyBBcnJheUxpc3Q8PigyICogbWFwLnNpemUoKSk7CiAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxCeXRlQnVmZmVyLCBCeXRlQnVmZmVyPiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKQpAQCAtMjUxLDEwICsyODYsMTAgQEAKICAgICAgICAgICAgICAgICBidWZmZXJzLmFkZChlbnRyeS5nZXRLZXkoKSk7CiAgICAgICAgICAgICAgICAgYnVmZmVycy5hZGQoZW50cnkuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvblNlcmlhbGl6ZXIucGFjayhidWZmZXJzLCBtYXAuc2l6ZSgpLCBwcm90b2NvbFZlcnNpb24pOworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25TZXJpYWxpemVyLnBhY2soYnVmZmVycywgbWFwLnNpemUoKSk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoTWFwVHlwZSBtdCwgVmFsdWUgdikKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE1hcFR5cGU8PywgPz4gbXQsIFZhbHVlIHYpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChtYXAuc2l6ZSgpICE9IHYubWFwLnNpemUoKSkKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0zNDIsNyArMzc3LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBCeXRlQnVmZmVyVXRpbC5VTlNFVF9CWVRFX0JVRkZFUikKICAgICAgICAgICAgICAgICByZXR1cm4gVU5TRVRfVkFMVUU7Ci0gICAgICAgICAgICByZXR1cm4gVmFsdWUuZnJvbVNlcmlhbGl6ZWQodmFsdWUsIChNYXBUeXBlKXJlY2VpdmVyLnR5cGUsIG9wdGlvbnMuZ2V0UHJvdG9jb2xWZXJzaW9uKCkpOworICAgICAgICAgICAgcmV0dXJuIFZhbHVlLmZyb21TZXJpYWxpemVkKHZhbHVlLCAoTWFwVHlwZTw/LCA/PikgcmVjZWl2ZXIudHlwZSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvUXVlcnlQcm9jZXNzb3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvUXVlcnlQcm9jZXNzb3IuamF2YQppbmRleCAxZTJkMGRiLi5iYTcyYWQ0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1F1ZXJ5UHJvY2Vzc29yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9RdWVyeVByb2Nlc3Nvci5qYXZhCkBAIC03OSw3ICs3OSw3IEBACiAKIHB1YmxpYyBjbGFzcyBRdWVyeVByb2Nlc3NvciBpbXBsZW1lbnRzIFF1ZXJ5SGFuZGxlcgogewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2Fzc2FuZHJhVmVyc2lvbiBDUUxfVkVSU0lPTiA9IG5ldyBDYXNzYW5kcmFWZXJzaW9uKCIzLjQuNiIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2Fzc2FuZHJhVmVyc2lvbiBDUUxfVkVSU0lPTiA9IG5ldyBDYXNzYW5kcmFWZXJzaW9uKCIzLjQuNyIpOwogCiAgICAgLy8gU2VlIGNvbW1lbnRzIG9uIFF1ZXJ5UHJvY2Vzc29yICNwcmVwYXJlCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDYXNzYW5kcmFWZXJzaW9uIE5FV19QUkVQQVJFRF9TVEFURU1FTlRfQkVIQVZJT1VSX1NJTkNFXzMwID0gbmV3IENhc3NhbmRyYVZlcnNpb24oIjMuMC4yNiIpOwpAQCAtMjM3LDcgKzIzNyw3IEBACiAgICAgICAgIGlmIChrZXkgPT0gQnl0ZUJ1ZmZlclV0aWwuVU5TRVRfQllURV9CVUZGRVIpCiAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oIktleSBtYXkgbm90IGJlIHVuc2V0Iik7CiAKLSAgICAgICAgLy8gY2hlY2sgdGhhdCBrZXkgY2FuIGJlIGhhbmRsZWQgYnkgRkJVdGlsaXRpZXMud3JpdGVTaG9ydEJ5dGVBcnJheQorICAgICAgICAvLyBjaGVjayB0aGF0IGtleSBjYW4gYmUgaGFuZGxlZCBieSBCeXRlQXJyYXlVdGlsLndyaXRlV2l0aFNob3J0TGVuZ3RoIGFuZCBCeXRlQnVmZmVyVXRpbC53cml0ZVdpdGhTaG9ydExlbmd0aAogICAgICAgICBpZiAoa2V5LnJlbWFpbmluZygpID4gRkJVdGlsaXRpZXMuTUFYX1VOU0lHTkVEX1NIT1JUKQogICAgICAgICB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oIktleSBsZW5ndGggb2YgIiArIGtleS5yZW1haW5pbmcoKSArCkBAIC00ODMsNyArNDgzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChtIC0+IE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS48UmVhZFJlc3BvbnNlPnNlbmRXaXRoUmVzdWx0KG0sIGFkZHJlc3MpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSk7CiAKLSAgICAgICAgICAgIFJlc3VsdFNldEJ1aWxkZXIgcmVzdWx0ID0gbmV3IFJlc3VsdFNldEJ1aWxkZXIoc2VsZWN0LmdldFJlc3VsdE1ldGFkYXRhKCksIHNlbGVjdC5nZXRTZWxlY3Rpb24oKS5uZXdTZWxlY3RvcnMob3B0aW9ucyksIG51bGwpOworICAgICAgICAgICAgUmVzdWx0U2V0QnVpbGRlciByZXN1bHQgPSBuZXcgUmVzdWx0U2V0QnVpbGRlcihzZWxlY3QuZ2V0UmVzdWx0TWV0YWRhdGEoKSwgc2VsZWN0LmdldFNlbGVjdGlvbigpLm5ld1NlbGVjdG9ycyhvcHRpb25zKSwgZmFsc2UpOwogICAgICAgICAgICAgcmV0dXJuIGZ1dHVyZS5tYXAobGlzdCAtPiB7CiAgICAgICAgICAgICAgICAgaW50IGkgPSAwOwogICAgICAgICAgICAgICAgIGZvciAoTWVzc2FnZTxSZWFkUmVzcG9uc2U+IG0gOiBsaXN0KQpAQCAtNjExLDE3ICs2MTEsMTkgQEAKICAgICAgICAgcmV0dXJuIHNlbGVjdC5leGVjdXRlUmF3SW50ZXJuYWwobWFrZUludGVybmFsT3B0aW9uc1dpdGhOb3dJblNlYyhwcmVwYXJlZC5zdGF0ZW1lbnQsIG5vd0luU2VjLCB2YWx1ZXMpLCBpbnRlcm5hbFF1ZXJ5U3RhdGUoKS5nZXRDbGllbnRTdGF0ZSgpLCBub3dJblNlYyk7CiAgICAgfQogCisgICAgQFZpc2libGVGb3JUZXN0aW5nCiAgICAgcHVibGljIHN0YXRpYyBVbnR5cGVkUmVzdWx0U2V0IHJlc3VsdGlmeShTdHJpbmcgcXVlcnksIFJvd0l0ZXJhdG9yIHBhcnRpdGlvbikKICAgICB7CiAgICAgICAgIHJldHVybiByZXN1bHRpZnkocXVlcnksIFBhcnRpdGlvbkl0ZXJhdG9ycy5zaW5nbGV0b25JdGVyYXRvcihwYXJ0aXRpb24pKTsKICAgICB9CiAKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBwdWJsaWMgc3RhdGljIFVudHlwZWRSZXN1bHRTZXQgcmVzdWx0aWZ5KFN0cmluZyBxdWVyeSwgUGFydGl0aW9uSXRlcmF0b3IgcGFydGl0aW9ucykKICAgICB7CiAgICAgICAgIHRyeSAoUGFydGl0aW9uSXRlcmF0b3IgaXRlciA9IHBhcnRpdGlvbnMpCiAgICAgICAgIHsKICAgICAgICAgICAgIFNlbGVjdFN0YXRlbWVudCBzcyA9IChTZWxlY3RTdGF0ZW1lbnQpIGdldFN0YXRlbWVudChxdWVyeSwgbnVsbCk7Ci0gICAgICAgICAgICBSZXN1bHRTZXQgY3FsUm93cyA9IHNzLnByb2Nlc3MoaXRlciwgRkJVdGlsaXRpZXMubm93SW5TZWNvbmRzKCkpOworICAgICAgICAgICAgUmVzdWx0U2V0IGNxbFJvd3MgPSBzcy5wcm9jZXNzKGl0ZXIsIEZCVXRpbGl0aWVzLm5vd0luU2Vjb25kcygpLCB0cnVlKTsKICAgICAgICAgICAgIHJldHVybiBVbnR5cGVkUmVzdWx0U2V0LmNyZWF0ZShjcWxSb3dzKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwMjIsNyArMTAyNCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIGluIGNhc2UgdGhlcmUgYXJlIG90aGVyIG92ZXJsb2Fkcywgd2UgaGF2ZSB0byByZW1vdmUgYWxsIG92ZXJsb2FkcyBzaW5jZSBhcmd1bWVudCB0eXBlCiAgICAgICAgICAgICAvLyBtYXRjaGluZyBtYXkgY2hhbmdlIChkdWUgdG8gdHlwZSBjYXN0aW5nKQotICAgICAgICAgICAgaWYgKFNjaGVtYS5pbnN0YW5jZS5nZXRLZXlzcGFjZU1ldGFkYXRhKGtzTmFtZSkuZnVuY3Rpb25zLmdldChuZXcgRnVuY3Rpb25OYW1lKGtzTmFtZSwgZnVuY3Rpb25OYW1lKSkuc2l6ZSgpID4gMSkKKyAgICAgICAgICAgIGlmIChTY2hlbWEuaW5zdGFuY2UuZ2V0S2V5c3BhY2VNZXRhZGF0YShrc05hbWUpLnVzZXJGdW5jdGlvbnMuZ2V0KG5ldyBGdW5jdGlvbk5hbWUoa3NOYW1lLCBmdW5jdGlvbk5hbWUpKS5zaXplKCkgPiAxKQogICAgICAgICAgICAgICAgIHJlbW92ZUludmFsaWRQcmVwYXJlZFN0YXRlbWVudHNGb3JGdW5jdGlvbihrc05hbWUsIGZ1bmN0aW9uTmFtZSk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9TZXRzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1NldHMuamF2YQppbmRleCAxMDRhODU3Li4wMGQ2ODcwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1NldHMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1NldHMuamF2YQpAQCAtMjAsMTcgKzIwLDMxIEBACiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ29uc3RhbnRzLlVOU0VUX1ZBTFVFOwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtU3VwcG9ydDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHMuR3VhcmRyYWlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZ3VhcmRyYWlscy5HdWFyZHJhaWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZUJ1ZmZlckFjY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTWFwVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlJldmVyc2VkVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlNldFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ2VsbFBhdGg7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuQ29sbGVjdGlvblNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwpAQCAtNTUsNyArNjksNyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgQWJzdHJhY3RUeXBlPD8+IGVsZW1lbnRzVHlwZShBYnN0cmFjdFR5cGU8Pz4gdHlwZSkKICAgICB7Ci0gICAgICAgIHJldHVybiAoKFNldFR5cGUpIHVud3JhcCh0eXBlKSkuZ2V0RWxlbWVudHNUeXBlKCk7CisgICAgICAgIHJldHVybiAoKFNldFR5cGU8Pz4pIHVud3JhcCh0eXBlKSkuZ2V0RWxlbWVudHNUeXBlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDYsNyArMTIwLDcgQEAKICAgICBwdWJsaWMgc3RhdGljIDxUPiBTdHJpbmcgc2V0VG9TdHJpbmcoSXRlcmFibGU8VD4gaXRlbXMsIGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjxULCBTdHJpbmc+IG1hcHBlcikKICAgICB7CiAgICAgICAgIHJldHVybiBTdHJlYW1TdXBwb3J0LnN0cmVhbShpdGVtcy5zcGxpdGVyYXRvcigpLCBmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGUgLT4gbWFwcGVyLmFwcGx5KGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAobWFwcGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiLCAieyIsICJ9IikpOwogICAgIH0KIApAQCAtMTE3LDEzICsxMzEsMjEgQEAKICAgICAgKiBAcGFyYW0gbWFwcGVyIHRoZSBtYXBwZXIgdXNlZCB0byByZXRyaWV2ZSB0aGUgZWxlbWVudCB0eXBlcyBmcm9tIHRoZSBpdGVtcwogICAgICAqIEByZXR1cm4gdGhlIGV4YWN0IFNldFR5cGUgZnJvbSB0aGUgaXRlbXMgaWYgaXQgY2FuIGJlIGtub3duIG9yIDxjb2RlPm51bGw8L2NvZGU+CiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8VD4gQWJzdHJhY3RUeXBlPD8+IGdldEV4YWN0U2V0VHlwZUlmS25vd24oTGlzdDxUPiBpdGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248VCwgQWJzdHJhY3RUeXBlPD8+PiBtYXBwZXIpCisgICAgcHVibGljIHN0YXRpYyA8VD4gU2V0VHlwZTw/PiBnZXRFeGFjdFNldFR5cGVJZktub3duKExpc3Q8VD4gaXRlbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjxULCBBYnN0cmFjdFR5cGU8Pz4+IG1hcHBlcikKICAgICB7CiAgICAgICAgIE9wdGlvbmFsPEFic3RyYWN0VHlwZTw/Pj4gdHlwZSA9IGl0ZW1zLnN0cmVhbSgpLm1hcChtYXBwZXIpLmZpbHRlcihPYmplY3RzOjpub25OdWxsKS5maW5kRmlyc3QoKTsKICAgICAgICAgcmV0dXJuIHR5cGUuaXNQcmVzZW50KCkgPyBTZXRUeXBlLmdldEluc3RhbmNlKHR5cGUuZ2V0KCksIGZhbHNlKSA6IG51bGw7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyA8VD4gU2V0VHlwZTw/PiBnZXRQcmVmZXJyZWRDb21wYXRpYmxlVHlwZShMaXN0PFQ+IGl0ZW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPFQsIEFic3RyYWN0VHlwZTw/Pj4gbWFwcGVyKQorICAgIHsKKyAgICAgICAgU2V0PEFic3RyYWN0VHlwZTw/Pj4gdHlwZXMgPSBpdGVtcy5zdHJlYW0oKS5tYXAobWFwcGVyKS5maWx0ZXIoT2JqZWN0czo6bm9uTnVsbCkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdHlwZSA9IEFzc2lnbm1lbnRUZXN0YWJsZS5nZXRDb21wYXRpYmxlVHlwZUlmS25vd24odHlwZXMpOworICAgICAgICByZXR1cm4gdHlwZSA9PSBudWxsID8gbnVsbCA6IFNldFR5cGUuZ2V0SW5zdGFuY2UodHlwZSwgZmFsc2UpOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGl0ZXJhbCBleHRlbmRzIFRlcm0uUmF3CiAgICAgewogICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8VGVybS5SYXc+IGVsZW1lbnRzOwpAQCAtMTk0LDYgKzIxNiwxMiBAQAogICAgICAgICAgICAgcmV0dXJuIGdldEV4YWN0U2V0VHlwZUlmS25vd24oZWxlbWVudHMsIHAgLT4gcC5nZXRFeGFjdFR5cGVJZktub3duKGtleXNwYWNlKSk7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRDb21wYXRpYmxlVHlwZUlmS25vd24oU3RyaW5nIGtleXNwYWNlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU2V0cy5nZXRQcmVmZXJyZWRDb21wYXRpYmxlVHlwZShlbGVtZW50cywgcCAtPiBwLmdldENvbXBhdGlibGVUeXBlSWZLbm93bihrZXlzcGFjZSkpOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIHNldFRvU3RyaW5nKGVsZW1lbnRzLCBUZXJtLlJhdzo6Z2V0VGV4dCk7CkBAIC0yMDksMTUgKzIzNywxNSBAQAogICAgICAgICAgICAgdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHN0YXRpYyBWYWx1ZSBmcm9tU2VyaWFsaXplZChCeXRlQnVmZmVyIHZhbHVlLCBTZXRUeXBlIHR5cGUsIFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uKSB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KKyAgICAgICAgcHVibGljIHN0YXRpYyA8VD4gVmFsdWUgZnJvbVNlcmlhbGl6ZWQoQnl0ZUJ1ZmZlciB2YWx1ZSwgU2V0VHlwZTxUPiB0eXBlKSB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy8gQ29sbGVjdGlvbnMgaGF2ZSB0aGlzIHNtYWxsIGhhY2sgdGhhdCB2YWxpZGF0ZSBjYW5ub3QgYmUgY2FsbGVkIG9uIGEgc2VyaWFsaXplZCBvYmplY3QsCiAgICAgICAgICAgICAgICAgLy8gYnV0IGNvbXBvc2UgZG9lcyB0aGUgdmFsaWRhdGlvbiAoc28gd2UncmUgZmluZSkuCi0gICAgICAgICAgICAgICAgU2V0PD8+IHMgPSB0eXBlLmdldFNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZUZvck5hdGl2ZVByb3RvY29sKHZhbHVlLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIHZlcnNpb24pOworICAgICAgICAgICAgICAgIFNldDxUPiBzID0gdHlwZS5nZXRTZXJpYWxpemVyKCkuZGVzZXJpYWxpemUodmFsdWUsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgU29ydGVkU2V0PEJ5dGVCdWZmZXI+IGVsZW1lbnRzID0gbmV3IFRyZWVTZXQ8Pih0eXBlLmdldEVsZW1lbnRzVHlwZSgpKTsKLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBlbGVtZW50IDogcykKKyAgICAgICAgICAgICAgICBmb3IgKFQgZWxlbWVudCA6IHMpCiAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLmFkZCh0eXBlLmdldEVsZW1lbnRzVHlwZSgpLmRlY29tcG9zZVVudHlwZWQoZWxlbWVudCkpOwogICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWUoZWxlbWVudHMpOwogICAgICAgICAgICAgfQpAQCAtMjI3LDE5ICsyNTUsMTkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKQorICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXQoUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKGVsZW1lbnRzLCBlbGVtZW50cy5zaXplKCksIHByb3RvY29sVmVyc2lvbik7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvblNlcmlhbGl6ZXIucGFjayhlbGVtZW50cywgZWxlbWVudHMuc2l6ZSgpKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhTZXRUeXBlIHN0LCBWYWx1ZSB2KQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoU2V0VHlwZTw/PiBzdCwgVmFsdWUgdikKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGVsZW1lbnRzLnNpemUoKSAhPSB2LmVsZW1lbnRzLnNpemUoKSkKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgICAgIEl0ZXJhdG9yPEJ5dGVCdWZmZXI+IHRoaXNJdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsKICAgICAgICAgICAgIEl0ZXJhdG9yPEJ5dGVCdWZmZXI+IHRoYXRJdGVyID0gdi5lbGVtZW50cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgQWJzdHJhY3RUeXBlIGVsZW1lbnRzVHlwZSA9IHN0LmdldEVsZW1lbnRzVHlwZSgpOworICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IGVsZW1lbnRzVHlwZSA9IHN0LmdldEVsZW1lbnRzVHlwZSgpOwogICAgICAgICAgICAgd2hpbGUgKHRoaXNJdGVyLmhhc05leHQoKSkKICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHNUeXBlLmNvbXBhcmUodGhpc0l0ZXIubmV4dCgpLCB0aGF0SXRlci5uZXh0KCkpICE9IDApCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTMwOCw3ICszMzYsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgaWYgKHZhbHVlID09IEJ5dGVCdWZmZXJVdGlsLlVOU0VUX0JZVEVfQlVGRkVSKQogICAgICAgICAgICAgICAgIHJldHVybiBVTlNFVF9WQUxVRTsKLSAgICAgICAgICAgIHJldHVybiBWYWx1ZS5mcm9tU2VyaWFsaXplZCh2YWx1ZSwgKFNldFR5cGUpcmVjZWl2ZXIudHlwZSwgb3B0aW9ucy5nZXRQcm90b2NvbFZlcnNpb24oKSk7CisgICAgICAgICAgICByZXR1cm4gVmFsdWUuZnJvbVNlcmlhbGl6ZWQodmFsdWUsIChTZXRUeXBlPD8+KSByZWNlaXZlci50eXBlKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9UZXJtLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1Rlcm0uamF2YQppbmRleCBmNTM2YmFhLi5jOTRiNjE0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1Rlcm0uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1Rlcm0uamF2YQpAQCAtMTEzLDEzICsxMTMsMTkgQEAKICAgICAgICAgICoKICAgICAgICAgICogQHBhcmFtIGtleXNwYWNlIHRoZSBrZXlzcGFjZSBvbiB3aGljaCB0aGUgc3RhdGVtZW50IGNvbnRhaW5pbmcgdGhpcyB0ZXJtIGlzIG9uLgogICAgICAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMge0Bjb2RlIFRlcm19IGlmIGluZmVycmFibGUsIG9yIHtAY29kZSBudWxsfQotICAgICAgICAgKiBvdGhlcndpc2UgKGZvciBpbnN0YW5jZSwgdGhlIHR5cGUgaXNuJ3QgaW5mZXJhYmxlIGZvciBhIGJpbmQgbWFya2VyLiBFdmVuIGZvcgorICAgICAgICAgKiBvdGhlcndpc2UgKGZvciBpbnN0YW5jZSwgdGhlIHR5cGUgaXNuJ3QgaW5mZXJyYWJsZSBmb3IgYSBiaW5kIG1hcmtlci4gRXZlbiBmb3IKICAgICAgICAgICogbGl0ZXJhbHMsIHRoZSBleGFjdCB0eXBlIGlzIG5vdCBpbmZlcnJhYmxlIHNpbmNlIHRoZXkgYXJlIHZhbGlkIGZvciBtYW55CiAgICAgICAgICAqIGRpZmZlcmVudCB0eXBlcyBhbmQgc28gdGhpcyB3aWxsIHJldHVybiB7QGNvZGUgbnVsbH0gdG9vKS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBBYnN0cmFjdFR5cGU8Pz4gZ2V0RXhhY3RUeXBlSWZLbm93bihTdHJpbmcga2V5c3BhY2UpOwogCiAgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGdldENvbXBhdGlibGVUeXBlSWZLbm93bihTdHJpbmcga2V5c3BhY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRFeGFjdFR5cGVJZktub3duKGtleXNwYWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIGdldFRleHQoKTsKQEAgLTE4MSw5ICsxODcsOCBAQAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBAcmV0dXJuIHRoZSBzZXJpYWxpemVkIHZhbHVlIG9mIHRoaXMgdGVybWluYWwuCi0gICAgICAgICAqIEBwYXJhbSBwcm90b2NvbFZlcnNpb24KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBCeXRlQnVmZmVyIGdldChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKSB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBCeXRlQnVmZmVyIGdldChQcm90b2NvbFZlcnNpb24gdmVyc2lvbikgdGhyb3dzIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOwogCiAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGJpbmRBbmRHZXQoUXVlcnlPcHRpb25zIG9wdGlvbnMpIHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbgogICAgICAgICB7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1Rlcm1zLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1Rlcm1zLmphdmEKaW5kZXggMzNjZTJlOS4uMzFiM2ZkMCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9UZXJtcy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVGVybXMuamF2YQpAQCAtMTQ1LDExICsxNDUsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgoKENvbGxlY3Rpb25UeXBlPD8+KSB0eXBlKS5raW5kKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExJU1Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgLT4gTGlzdHMuVmFsdWUuZnJvbVNlcmlhbGl6ZWQoZSwgKExpc3RUeXBlPD8+KSB0eXBlLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAtPiBMaXN0cy5WYWx1ZS5mcm9tU2VyaWFsaXplZChlLCAoTGlzdFR5cGU8Pz4pIHR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTRVQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgLT4gU2V0cy5WYWx1ZS5mcm9tU2VyaWFsaXplZChlLCAoU2V0VHlwZTw/PikgdHlwZSwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgLT4gU2V0cy5WYWx1ZS5mcm9tU2VyaWFsaXplZChlLCAoU2V0VHlwZTw/PikgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1BUDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAtPiBNYXBzLlZhbHVlLmZyb21TZXJpYWxpemVkKGUsIChNYXBUeXBlPD8sID8+KSB0eXBlLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAtPiBNYXBzLlZhbHVlLmZyb21TZXJpYWxpemVkKGUsIChNYXBUeXBlPD8sID8+KSB0eXBlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1R1cGxlcy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9UdXBsZXMuamF2YQppbmRleCBiOGFjZDU5Li42MGY5NjNjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1R1cGxlcy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVHVwbGVzLmphdmEKQEAgLTI0LDExICsyNCwxMiBAQAogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbVN1cHBvcnQ7CiAKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZUJ1ZmZlckFjY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTGlzdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5SZXZlcnNlZFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5UdXBsZVR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5NYXJzaGFsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CkBAIC00MSw4ICs0Miw2IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBUdXBsZXMKIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVHVwbGVzLmNsYXNzKTsKLQogICAgIHByaXZhdGUgVHVwbGVzKCkge30KIAogICAgIHB1YmxpYyBzdGF0aWMgQ29sdW1uU3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjT2YoQ29sdW1uU3BlY2lmaWNhdGlvbiBjb2x1bW4sIGludCBjb21wb25lbnQpCkBAIC0xNTQsMTcgKzE1MywxNyBAQAogCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgVmFsdWUgZnJvbVNlcmlhbGl6ZWQoQnl0ZUJ1ZmZlciBieXRlcywgVHVwbGVUeXBlIHR5cGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEJ5dGVCdWZmZXJbXSB2YWx1ZXMgPSB0eXBlLnNwbGl0KGJ5dGVzKTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXJbXSB2YWx1ZXMgPSB0eXBlLnNwbGl0KEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgYnl0ZXMpOwogICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiB0eXBlLnNpemUoKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKICAgICAgICAgICAgICAgICAgICAgICAgICJUdXBsZSB2YWx1ZSBjb250YWluZWQgdG9vIG1hbnkgZmllbGRzIChleHBlY3RlZCAlcywgZ290ICVzKSIsIHR5cGUuc2l6ZSgpLCB2YWx1ZXMubGVuZ3RoKSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWUodHlwZS5zcGxpdChieXRlcykpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZSh0eXBlLnNwbGl0KEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgYnl0ZXMpKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKQorICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXQoUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBUdXBsZVR5cGUuYnVpbGRWYWx1ZShlbGVtZW50cyk7CiAgICAgICAgIH0KQEAgLTI1OCwyMSArMjU3LDIxIEBACiAgICAgICAgICAgICB0aGlzLmVsZW1lbnRzID0gaXRlbXM7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgc3RhdGljIEluVmFsdWUgZnJvbVNlcmlhbGl6ZWQoQnl0ZUJ1ZmZlciB2YWx1ZSwgTGlzdFR5cGUgdHlwZSwgUXVlcnlPcHRpb25zIG9wdGlvbnMpIHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbgorICAgICAgICBwdWJsaWMgc3RhdGljIDxUPiBJblZhbHVlIGZyb21TZXJpYWxpemVkKEJ5dGVCdWZmZXIgdmFsdWUsIExpc3RUeXBlPFQ+IHR5cGUpIHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBDb2xsZWN0aW9ucyBoYXZlIHRoaXMgc21hbGwgaGFjayB0aGF0IHZhbGlkYXRlIGNhbm5vdCBiZSBjYWxsZWQgb24gYSBzZXJpYWxpemVkIG9iamVjdCwKICAgICAgICAgICAgICAgICAvLyBidXQgdGhlIGRlc2VyaWFsaXphdGlvbiBkb2VzIHRoZSB2YWxpZGF0aW9uIChzbyB3ZSdyZSBmaW5lKS4KLSAgICAgICAgICAgICAgICBMaXN0PD8+IGwgPSB0eXBlLmdldFNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZUZvck5hdGl2ZVByb3RvY29sKHZhbHVlLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIG9wdGlvbnMuZ2V0UHJvdG9jb2xWZXJzaW9uKCkpOworICAgICAgICAgICAgICAgIExpc3Q8VD4gbCA9IHR5cGUuZ2V0U2VyaWFsaXplcigpLmRlc2VyaWFsaXplKHZhbHVlLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UpOwogCiAgICAgICAgICAgICAgICAgYXNzZXJ0IHR5cGUuZ2V0RWxlbWVudHNUeXBlKCkgaW5zdGFuY2VvZiBUdXBsZVR5cGU7CiAgICAgICAgICAgICAgICAgVHVwbGVUeXBlIHR1cGxlVHlwZSA9IFR1cGxlcy5nZXRUdXBsZVR5cGUodHlwZS5nZXRFbGVtZW50c1R5cGUoKSk7CiAKICAgICAgICAgICAgICAgICAvLyB0eXBlLnNwbGl0KGJ5dGVzKQogICAgICAgICAgICAgICAgIExpc3Q8TGlzdDxCeXRlQnVmZmVyPj4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PD4obC5zaXplKCkpOwotICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IGVsZW1lbnQgOiBsKQotICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5hZGQoQXJyYXlzLmFzTGlzdCh0dXBsZVR5cGUuc3BsaXQodHlwZS5nZXRFbGVtZW50c1R5cGUoKS5kZWNvbXBvc2UoZWxlbWVudCkpKSk7CisgICAgICAgICAgICAgICAgZm9yIChUIGVsZW1lbnQgOiBsKQorICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5hZGQoQXJyYXlzLmFzTGlzdCh0dXBsZVR5cGUuc3BsaXQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCB0eXBlLmdldEVsZW1lbnRzVHlwZSgpLmRlY29tcG9zZShlbGVtZW50KSkpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEluVmFsdWUoZWxlbWVudHMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKE1hcnNoYWxFeGNlcHRpb24gZSkKQEAgLTI4MSw3ICsyODAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0KFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldChQcm90b2NvbFZlcnNpb24gdmVyc2lvbikKICAgICAgICAgewogICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KQEAgLTQxNiw3ICs0MTUsNyBAQAogICAgICAgICAgICAgQnl0ZUJ1ZmZlciB2YWx1ZSA9IG9wdGlvbnMuZ2V0VmFsdWVzKCkuZ2V0KGJpbmRJbmRleCk7CiAgICAgICAgICAgICBpZiAodmFsdWUgPT0gQnl0ZUJ1ZmZlclV0aWwuVU5TRVRfQllURV9CVUZGRVIpCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkludmFsaWQgdW5zZXQgdmFsdWUgZm9yICVzIiwgcmVjZWl2ZXIubmFtZSkpOwotICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyBudWxsIDogSW5WYWx1ZS5mcm9tU2VyaWFsaXplZCh2YWx1ZSwgKExpc3RUeXBlKXJlY2VpdmVyLnR5cGUsIG9wdGlvbnMpOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyBudWxsIDogSW5WYWx1ZS5mcm9tU2VyaWFsaXplZCh2YWx1ZSwgKExpc3RUeXBlPD8+KSByZWNlaXZlci50eXBlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDQyLDcgKzQ0MSw3IEBACiAgICAgcHVibGljIHN0YXRpYyA8VD4gU3RyaW5nIHR1cGxlVG9TdHJpbmcoSXRlcmFibGU8VD4gaXRlbXMsIGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjxULCBTdHJpbmc+IG1hcHBlcikKICAgICB7CiAgICAgICAgIHJldHVybiBTdHJlYW1TdXBwb3J0LnN0cmVhbShpdGVtcy5zcGxpdGVyYXRvcigpLCBmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGUgLT4gbWFwcGVyLmFwcGx5KGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAobWFwcGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiLCAiKCIsICIpIikpOwogICAgIH0KIApAQCAtNDUzLDggKzQ1Miw4IEBACiAgICAgICogQHBhcmFtIG1hcHBlciB0aGUgbWFwcGVyIHVzZWQgdG8gcmV0cmlldmUgdGhlIGVsZW1lbnQgdHlwZXMgZnJvbSB0aGUgIGl0ZW1zCiAgICAgICogQHJldHVybiB0aGUgZXhhY3QgVHVwbGVUeXBlIGZyb20gdGhlIGl0ZW1zIGlmIGl0IGNhbiBiZSBrbm93biBvciA8Y29kZT5udWxsPC9jb2RlPgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IEFic3RyYWN0VHlwZTw/PiBnZXRFeGFjdFR1cGxlVHlwZUlmS25vd24oTGlzdDxUPiBpdGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjxULCBBYnN0cmFjdFR5cGU8Pz4+IG1hcHBlcikKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUdXBsZVR5cGUgZ2V0RXhhY3RUdXBsZVR5cGVJZktub3duKExpc3Q8VD4gaXRlbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248VCwgQWJzdHJhY3RUeXBlPD8+PiBtYXBwZXIpCiAgICAgewogICAgICAgICBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PD4oaXRlbXMuc2l6ZSgpKTsKICAgICAgICAgZm9yIChUIGl0ZW0gOiBpdGVtcykKQEAgLTUyMCwxMiArNTE5LDEyIEBACiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrSWZUdXBsZVR5cGUoQWJzdHJhY3RUeXBlPD8+IHR1cGxlKQogICAgIHsKICAgICAgICAgcmV0dXJuICh0dXBsZSBpbnN0YW5jZW9mIFR1cGxlVHlwZSkgfHwKLSAgICAgICAgICAgICAgICh0dXBsZSBpbnN0YW5jZW9mIFJldmVyc2VkVHlwZSAmJiAoKFJldmVyc2VkVHlwZSkgdHVwbGUpLmJhc2VUeXBlIGluc3RhbmNlb2YgVHVwbGVUeXBlKTsKKyAgICAgICAgICAgICAgICh0dXBsZSBpbnN0YW5jZW9mIFJldmVyc2VkVHlwZSAmJiAoKFJldmVyc2VkVHlwZTw/PikgdHVwbGUpLmJhc2VUeXBlIGluc3RhbmNlb2YgVHVwbGVUeXBlKTsKIAogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgVHVwbGVUeXBlIGdldFR1cGxlVHlwZShBYnN0cmFjdFR5cGU8Pz4gdHVwbGUpCiAgICAgewotICAgICAgICByZXR1cm4gKHR1cGxlIGluc3RhbmNlb2YgUmV2ZXJzZWRUeXBlID8gKChUdXBsZVR5cGUpICgoUmV2ZXJzZWRUeXBlKSB0dXBsZSkuYmFzZVR5cGUpIDogKFR1cGxlVHlwZSl0dXBsZSk7CisgICAgICAgIHJldHVybiAodHVwbGUgaW5zdGFuY2VvZiBSZXZlcnNlZFR5cGUgPyAoKFR1cGxlVHlwZSkgKChSZXZlcnNlZFR5cGU8Pz4pIHR1cGxlKS5iYXNlVHlwZSkgOiAoVHVwbGVUeXBlKXR1cGxlKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1VudHlwZWRSZXN1bHRTZXQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVW50eXBlZFJlc3VsdFNldC5qYXZhCmluZGV4IGYwMGMxMzcuLmNlMmNjMGYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVW50eXBlZFJlc3VsdFNldC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVW50eXBlZFJlc3VsdFNldC5qYXZhCkBAIC0yMCwyMiArMjAsMzIgQEAKIAogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5VVUlEOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiAKIGltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQ29kZWNVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy50eXBlcy5Mb2NhbERhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc3RhdGVtZW50cy5TZWxlY3RTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbnNpc3RlbmN5TGV2ZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJlYWRFeGVjdXRpb25Db250cm9sbGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlBhcnRpdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Db21wbGV4Q29sdW1uRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DbGllbnRTdGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBhZ2VyLlF1ZXJ5UGFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5BYnN0cmFjdEl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwpAQCAtMTEwLDcgKzEyMCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RJdGVyYXRvcjxSb3c+KCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvcjxMaXN0PEJ5dGVCdWZmZXI+PiBpdGVyID0gY3FsUm93cy5yb3dzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8TGlzdDxCeXRlQnVmZmVyPj4gaXRlciA9IGNxbFJvd3Mucm93cy5pdGVyYXRvcigpOwogCiAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIFJvdyBjb21wdXRlTmV4dCgpCiAgICAgICAgICAgICAgICAgewpAQCAtMTUyLDcgKzE2Miw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RJdGVyYXRvcjxSb3c+KCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvcjxNYXA8U3RyaW5nLCBCeXRlQnVmZmVyPj4gaXRlciA9IGNxbFJvd3MuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxNYXA8U3RyaW5nLCBCeXRlQnVmZmVyPj4gaXRlciA9IGNxbFJvd3MuaXRlcmF0b3IoKTsKIAogICAgICAgICAgICAgICAgIHByb3RlY3RlZCBSb3cgY29tcHV0ZU5leHQoKQogICAgICAgICAgICAgICAgIHsKQEAgLTIxMSw3ICsyMjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IChSZWFkRXhlY3V0aW9uQ29udHJvbGxlciBleGVjdXRpb25Db250cm9sbGVyID0gcGFnZXIuZXhlY3V0aW9uQ29udHJvbGxlcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aXRpb25JdGVyYXRvciBpdGVyID0gcGFnZXIuZmV0Y2hQYWdlSW50ZXJuYWwocGFnZVNpemUsIGV4ZWN1dGlvbkNvbnRyb2xsZXIpKQogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYWdlID0gc2VsZWN0LnByb2Nlc3MoaXRlciwgbm93SW5TZWMpLnJvd3MuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFnZSA9IHNlbGVjdC5wcm9jZXNzKGl0ZXIsIG5vd0luU2VjLCB0cnVlKS5yb3dzLml0ZXJhdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSb3cobWV0YWRhdGEsIGN1cnJlbnRQYWdlLm5leHQoKSk7CkBAIC0yNzYsNyArMjg2LDcgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IChQYXJ0aXRpb25JdGVyYXRvciBpdGVyID0gcGFnZXIuZmV0Y2hQYWdlKHBhZ2VTaXplLCBjbCwgY2xpZW50U3RhdGUsIG5hbm9UaW1lKCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYWdlID0gc2VsZWN0LnByb2Nlc3MoaXRlciwgbm93SW5TZWMpLnJvd3MuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFnZSA9IHNlbGVjdC5wcm9jZXNzKGl0ZXIsIG5vd0luU2VjLCB0cnVlKS5yb3dzLml0ZXJhdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSb3cobWV0YWRhdGEsIGN1cnJlbnRQYWdlLm5leHQoKSk7CkBAIC0zMzEsNyArMzQxLDcgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIENvbXBsZXhDb2x1bW5EYXRhIGNvbXBsZXhEYXRhID0gcm93LmdldENvbXBsZXhDb2x1bW5EYXRhKGRlZik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV4RGF0YSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5wdXQoZGVmLm5hbWUudG9TdHJpbmcoKSwgKChDb2xsZWN0aW9uVHlwZSlkZWYudHlwZSkuc2VyaWFsaXplRm9yTmF0aXZlUHJvdG9jb2woY29tcGxleERhdGEuaXRlcmF0b3IoKSwgUHJvdG9jb2xWZXJzaW9uLlYzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnB1dChkZWYubmFtZS50b1N0cmluZygpLCAoKENvbGxlY3Rpb25UeXBlPD8+KSBkZWYudHlwZSkuc2VyaWFsaXplRm9yTmF0aXZlUHJvdG9jb2woY29tcGxleERhdGEuaXRlcmF0b3IoKSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtNDUxLDExICs0NjEsNiBAQAogICAgICAgICAgICAgcmV0dXJuIHJhdyA9PSBudWxsID8gbnVsbCA6IE1hcFR5cGUuZ2V0SW5zdGFuY2Uoa2V5VHlwZSwgdmFsdWVUeXBlLCB0cnVlKS5jb21wb3NlKHJhdyk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRUZXh0TWFwKFN0cmluZyBjb2x1bW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRNYXAoY29sdW1uLCBVVEY4VHlwZS5pbnN0YW5jZSwgVVRGOFR5cGUuaW5zdGFuY2UpOwotICAgICAgICB9Ci0KICAgICAgICAgcHVibGljIDxUPiBTZXQ8VD4gZ2V0RnJvemVuU2V0KFN0cmluZyBjb2x1bW4sIEFic3RyYWN0VHlwZTxUPiB0eXBlKQogICAgICAgICB7CiAgICAgICAgICAgICBCeXRlQnVmZmVyIHJhdyA9IGRhdGEuZ2V0KGNvbHVtbik7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1VwZGF0ZVBhcmFtZXRlcnMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVXBkYXRlUGFyYW1ldGVycy5qYXZhCmluZGV4IDJkNTkzNjYuLmI1MDU0ODAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVXBkYXRlUGFyYW1ldGVycy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVXBkYXRlUGFyYW1ldGVycy5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZ3VhcmRyYWlscy5HdWFyZHJhaWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOwpAQCAtMTQzLDYgKzE0NCwxNSBAQAogCiAgICAgcHVibGljIHZvaWQgYWRkVG9tYnN0b25lKENvbHVtbk1ldGFkYXRhIGNvbHVtbiwgQ2VsbFBhdGggcGF0aCkgdGhyb3dzIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uCiAgICAgeworICAgICAgICAvLyBEZWxldGluZyBpbmRpdmlkdWFsIGVsZW1lbnRzIG9mIG5vbi1mcm96ZW4gc2V0cyBhbmQgbWFwcyBpbnZvbHZlcyBjcmVhdGluZyB0b21ic3RvbmVzIHRoYXQgY29udGFpbiB0aGUgdmFsdWUKKyAgICAgICAgLy8gb2YgdGhlIGRlbGV0ZWQgZWxlbWVudCwgaW5kZXBlbmRlbnRseSBvbiB3aGV0aGVyIHRoZSBlbGVtZW50IGV4aXN0ZWQgb3Igbm90LiBUaGF0IHRvbWJzdG9uZSB2YWx1ZSBpcyBndWFyZGVkCisgICAgICAgIC8vIGJ5IHRoZSBjb2x1bW5WYWx1ZVNpemUgZ3VhcmRyYWlsLCB0byBwcmV2ZW50IHRoZSBpbnNlcnRpb24gb2YgdG9tYnN0b25lcyBvdmVyIHRoZSB0aHJlc2hvbGQuIFRoZSBkb3duc2lkZSBpcworICAgICAgICAvLyB0aGF0IGVuYWJsaW5nIG9yIHJhaXNpbmcgdGhpcyB0aHJlc2hvbGQgY2FuIHByZXZlbnQgdXNlcnMgZnJvbSBkZWxldGluZyBzZXQvbWFwIGVsZW1lbnRzIHRoYXQgd2VyZSB3cml0dGVuCisgICAgICAgIC8vIHdoZW4gdGhlIGd1YXJkcmFpbCB3YXMgZGlzYWJsZWQgb3Igd2l0aCBhIGxvd2VyIHZhbHVlLiBEZWxldGluZyB0aGUgZW50aXJlIGNvbHVtbiwgcm93IG9yIHBhcnRpdGlvbiBpcyBhbHdheXMKKyAgICAgICAgLy8gYWxsb3dlZCwgc2luY2UgdGhlIHRvbWJzdG9uZXMgY3JlYXRlZCBmb3IgdGhvc2Ugb3BlcmF0aW9ucyBkb24ndCBjb250YWluIHRoZSBDUUwgY29sdW1uIHZhbHVlcy4KKyAgICAgICAgaWYgKHBhdGggIT0gbnVsbCAmJiBjb2x1bW4udHlwZS5pc011bHRpQ2VsbCgpKQorICAgICAgICAgICAgR3VhcmRyYWlscy5jb2x1bW5WYWx1ZVNpemUuZ3VhcmQocGF0aC5kYXRhU2l6ZSgpLCBjb2x1bW4ubmFtZS50b1N0cmluZygpLCBmYWxzZSwgY2xpZW50U3RhdGUpOworCiAgICAgICAgIGJ1aWxkZXIuYWRkQ2VsbChCdWZmZXJDZWxsLnRvbWJzdG9uZShjb2x1bW4sIHRpbWVzdGFtcCwgbm93SW5TZWMsIHBhdGgpKTsKICAgICB9CiAKQEAgLTE1Myw2ICsxNjMsMTEgQEAKIAogICAgIHB1YmxpYyBDZWxsPD8+IGFkZENlbGwoQ29sdW1uTWV0YWRhdGEgY29sdW1uLCBDZWxsUGF0aCBwYXRoLCBCeXRlQnVmZmVyIHZhbHVlKSB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KICAgICB7CisgICAgICAgIEd1YXJkcmFpbHMuY29sdW1uVmFsdWVTaXplLmd1YXJkKHZhbHVlLnJlbWFpbmluZygpLCBjb2x1bW4ubmFtZS50b1N0cmluZygpLCBmYWxzZSwgY2xpZW50U3RhdGUpOworCisgICAgICAgIGlmIChwYXRoICE9IG51bGwgJiYgY29sdW1uLnR5cGUuaXNNdWx0aUNlbGwoKSkKKyAgICAgICAgICAgIEd1YXJkcmFpbHMuY29sdW1uVmFsdWVTaXplLmd1YXJkKHBhdGguZGF0YVNpemUoKSwgY29sdW1uLm5hbWUudG9TdHJpbmcoKSwgZmFsc2UsIGNsaWVudFN0YXRlKTsKKwogICAgICAgICBDZWxsPD8+IGNlbGwgPSB0dGwgPT0gTGl2ZW5lc3NJbmZvLk5PX1RUTAogICAgICAgICAgICAgICAgICAgICAgICA/IEJ1ZmZlckNlbGwubGl2ZShjb2x1bW4sIHRpbWVzdGFtcCwgdmFsdWUsIHBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIDogQnVmZmVyQ2VsbC5leHBpcmluZyhjb2x1bW4sIHRpbWVzdGFtcCwgdHRsLCBub3dJblNlYywgdmFsdWUsIHBhdGgpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9Vc2VyVHlwZXMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVXNlclR5cGVzLmphdmEKaW5kZXggYjAyM2E4YS4uNzYyNzZhNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9Vc2VyVHlwZXMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1VzZXJUeXBlcy5qYXZhCkBAIC0yMTcsMTAgKzIxNywxMCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIFZhbHVlIGZyb21TZXJpYWxpemVkKEJ5dGVCdWZmZXIgYnl0ZXMsIFVzZXJUeXBlIHR5cGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHR5cGUudmFsaWRhdGUoYnl0ZXMpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZSh0eXBlLCB0eXBlLnNwbGl0KGJ5dGVzKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlKHR5cGUsIHR5cGUuc3BsaXQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBieXRlcykpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0KFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldChQcm90b2NvbFZlcnNpb24gdmVyc2lvbikKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIFR1cGxlVHlwZS5idWlsZFZhbHVlKGVsZW1lbnRzKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9WYWxpZGF0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1ZhbGlkYXRpb24uamF2YQppbmRleCAzNGE0MDI3Li4yN2ExYjRlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1ZhbGlkYXRpb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1ZhbGlkYXRpb24uamF2YQpAQCAtNDcsNyArNDcsNyBAQAogICAgICAgICBpZiAoa2V5ID09IG51bGwgfHwga2V5LnJlbWFpbmluZygpID09IDApCiAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oIktleSBtYXkgbm90IGJlIGVtcHR5Iik7CiAKLSAgICAgICAgLy8gY2hlY2sgdGhhdCBrZXkgY2FuIGJlIGhhbmRsZWQgYnkgRkJVdGlsaXRpZXMud3JpdGVTaG9ydEJ5dGVBcnJheQorICAgICAgICAvLyBjaGVjayB0aGF0IGtleSBjYW4gYmUgaGFuZGxlZCBieSBCeXRlQXJyYXlVdGlsLndyaXRlV2l0aFNob3J0TGVuZ3RoIGFuZCBCeXRlQnVmZmVyVXRpbC53cml0ZVdpdGhTaG9ydExlbmd0aAogICAgICAgICBpZiAoa2V5LnJlbWFpbmluZygpID4gRkJVdGlsaXRpZXMuTUFYX1VOU0lHTkVEX1NIT1JUKQogICAgICAgICB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oIktleSBsZW5ndGggb2YgIiArIGtleS5yZW1haW5pbmcoKSArCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2NvbmRpdGlvbnMvQ29sdW1uQ29uZGl0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2NvbmRpdGlvbnMvQ29sdW1uQ29uZGl0aW9uLmphdmEKaW5kZXggZTNmNDYzYS4uNjhjZjJkMyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9jb25kaXRpb25zL0NvbHVtbkNvbmRpdGlvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvY29uZGl0aW9ucy9Db2x1bW5Db25kaXRpb24uamF2YQpAQCAtNjUwLDggKzY1MCw4IEBACiAKICAgICAgICAgICAgIENlbGw8Pz4gY2VsbCA9IGdldENlbGwocm93LCBjb2x1bW4pOwogICAgICAgICAgICAgcmV0dXJuIGNlbGwgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgID8gbnVsbAotICAgICAgICAgICAgICAgICAgICAgIDogdXNlclR5cGUuc3BsaXQoY2VsbC5idWZmZXIoKSlbdXNlclR5cGUuZmllbGRQb3NpdGlvbihmaWVsZCldOworICAgICAgICAgICAgICAgICAgID8gbnVsbAorICAgICAgICAgICAgICAgICAgIDogdXNlclR5cGUuc3BsaXQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBjZWxsLmJ1ZmZlcigpKVt1c2VyVHlwZS5maWVsZFBvc2l0aW9uKGZpZWxkKV07CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNTYXRpc2ZpZWRCeShCeXRlQnVmZmVyIHJvd1ZhbHVlKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvQWJzdHJhY3RGdW5jdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvQWJzdHJhY3RGdW5jdGlvbi5qYXZhCmluZGV4IGFhYjIwNDYuLmMzMTgzZjYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0Fic3RyYWN0RnVuY3Rpb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9BYnN0cmFjdEZ1bmN0aW9uLmphdmEKQEAgLTExOCw2ICsxMTgsMTIgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGdldENvbXBhdGlibGVUeXBlSWZLbm93bihTdHJpbmcga2V5c3BhY2UpCisgICAgeworICAgICAgICByZXR1cm4gcmV0dXJuVHlwZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQogICAgIHsKICAgICAgICAgcmV0dXJuIG5ldyBDcWxCdWlsZGVyKCkuYXBwZW5kKG5hbWUpCkBAIC0xNjUsNCArMTcxLDM0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCcpJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpOwogICAgIH0KKworICAgIC8qCisgICAgICogV2UgbmVlZCB0byBjb21wYXJlIHRoZSBDUUwzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0eXBlIGJlY2F1c2UgY29tcGFyaW5nCisgICAgICogdGhlIEFic3RyYWN0VHlwZSB3aWxsIGZhaWwgZm9yIGV4YW1wbGUgaWYgYSBVRFQgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICAgKiBSZWFzb24gaXMgdGhhdCBVc2VyVHlwZS5lcXVhbHMoKSB0YWtlcyB0aGUgZmllbGQgbmFtZXMgYW5kIHR5cGVzIGludG8gYWNjb3VudC4KKyAgICAgKiBFeGFtcGxlIENRTCBzZXF1ZW5jZSB0aGF0IHdvdWxkIGZhaWwgd2hlbiBjb21wYXJpbmcgQWJzdHJhY3RUeXBlOgorICAgICAqICAgIENSRUFURSBUWVBFIGZvbyAuLi4KKyAgICAgKiAgICBDUkVBVEUgRlVOQ1RJT04gYmFyICggcGFyIGZvbyApIFJFVFVSTlMgZm9vIC4uLgorICAgICAqICAgIEFMVEVSIFRZUEUgZm9vIEFERCAuLi4KKyAgICAgKiBvcgorICAgICAqICAgIEFMVEVSIFRZUEUgZm9vIEFMVEVSIC4uLgorICAgICAqIG9yCisgICAgICogICAgQUxURVIgVFlQRSBmb28gUkVOQU1FIC4uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHR5cGVzTWF0Y2goTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IHR5cGVzKQorICAgIHsKKyAgICAgICAgaWYgKGFyZ1R5cGVzKCkuc2l6ZSgpICE9IHR5cGVzLnNpemUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ1R5cGVzKCkuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICBpZiAoIXR5cGVzTWF0Y2goYXJnVHlwZXMoKS5nZXQoaSksIHR5cGVzLmdldChpKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHlwZXNNYXRjaChBYnN0cmFjdFR5cGU8Pz4gdDEsIEFic3RyYWN0VHlwZTw/PiB0MikKKyAgICB7CisgICAgICAgIHJldHVybiB0MS5mcmVlemUoKS5hc0NRTDNUeXBlKCkudG9TdHJpbmcoKS5lcXVhbHModDIuZnJlZXplKCkuYXNDUUwzVHlwZSgpLnRvU3RyaW5nKCkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0FnZ3JlZ2F0ZUZjdHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0FnZ3JlZ2F0ZUZjdHMuamF2YQppbmRleCA1Nzk3ZGU0Li5jZThlOGUxIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9BZ2dyZWdhdGVGY3RzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvQWdncmVnYXRlRmN0cy5qYXZhCkBAIC0yMSwxMyArMjEsOCBAQAogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwogaW1wb3J0IGphdmEubWF0aC5Sb3VuZGluZ01vZGU7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTDNUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CkBAIC0zNywxMCArMzIsOCBAQAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWdncmVnYXRlRmN0cwogewotICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxBZ2dyZWdhdGVGdW5jdGlvbj4gYWxsKCkKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRnVuY3Rpb25zVG8oTmF0aXZlRnVuY3Rpb25zIGZ1bmN0aW9ucykKICAgICB7Ci0gICAgICAgIENvbGxlY3Rpb248QWdncmVnYXRlRnVuY3Rpb24+IGZ1bmN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCiAgICAgICAgIGZ1bmN0aW9ucy5hZGQoY291bnRSb3dzRnVuY3Rpb24pOwogCiAgICAgICAgIC8vIHN1bSBmb3IgcHJpbWl0aXZlcwpAQCAtNjUsNzEgKzU4LDg2IEBACiAgICAgICAgIGZ1bmN0aW9ucy5hZGQoYXZnRnVuY3Rpb25Gb3JWYXJpbnQpOwogICAgICAgICBmdW5jdGlvbnMuYWRkKGF2Z0Z1bmN0aW9uRm9yQ291bnRlcik7CiAKLSAgICAgICAgLy8gY291bnQsIG1heCwgYW5kIG1pbiBmb3IgYWxsIHN0YW5kYXJkIHR5cGVzCi0gICAgICAgIFNldDxBYnN0cmFjdFR5cGU8Pz4+IHR5cGVzID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICBmb3IgKENRTDNUeXBlIHR5cGUgOiBDUUwzVHlwZS5OYXRpdmUudmFsdWVzKCkpCisgICAgICAgIC8vIGNvdW50IGZvciBhbGwgdHlwZXMKKyAgICAgICAgZnVuY3Rpb25zLmFkZChtYWtlQ291bnRGdW5jdGlvbihCeXRlc1R5cGUuaW5zdGFuY2UpKTsKKworICAgICAgICAvLyBtYXggZm9yIGFsbCB0eXBlcworICAgICAgICBmdW5jdGlvbnMuYWRkKG5ldyBGdW5jdGlvbkZhY3RvcnkoIm1heCIsIEZ1bmN0aW9uUGFyYW1ldGVyLmFueVR5cGUodHJ1ZSkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiB1ZGZUeXBlID0gdHlwZS5nZXRUeXBlKCkudWRmVHlwZSgpOwotICAgICAgICAgICAgaWYgKCF0eXBlcy5hZGQodWRmVHlwZSkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIGZ1bmN0aW9ucy5hZGQoQWdncmVnYXRlRmN0cy5tYWtlQ291bnRGdW5jdGlvbih1ZGZUeXBlKSk7Ci0gICAgICAgICAgICBpZiAodHlwZSAhPSBDUUwzVHlwZS5OYXRpdmUuQ09VTlRFUikKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIE5hdGl2ZUZ1bmN0aW9uIGRvR2V0T3JDcmVhdGVGdW5jdGlvbihMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMsIEFic3RyYWN0VHlwZTw/PiByZWNlaXZlclR5cGUpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnVuY3Rpb25zLmFkZChBZ2dyZWdhdGVGY3RzLm1ha2VNYXhGdW5jdGlvbih1ZGZUeXBlKSk7Ci0gICAgICAgICAgICAgICAgZnVuY3Rpb25zLmFkZChBZ2dyZWdhdGVGY3RzLm1ha2VNaW5GdW5jdGlvbih1ZGZUeXBlKSk7CisgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHR5cGUgPSBhcmdUeXBlcy5nZXQoMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuaXNDb3VudGVyKCkgPyBtYXhGdW5jdGlvbkZvckNvdW50ZXIgOiBtYWtlTWF4RnVuY3Rpb24odHlwZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnVuY3Rpb25zLmFkZChBZ2dyZWdhdGVGY3RzLm1heEZ1bmN0aW9uRm9yQ291bnRlcik7Ci0gICAgICAgICAgICAgICAgZnVuY3Rpb25zLmFkZChBZ2dyZWdhdGVGY3RzLm1pbkZ1bmN0aW9uRm9yQ291bnRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgfSk7CiAKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9uczsKKyAgICAgICAgLy8gbWluIGZvciBhbGwgdHlwZXMKKyAgICAgICAgZnVuY3Rpb25zLmFkZChuZXcgRnVuY3Rpb25GYWN0b3J5KCJtaW4iLCBGdW5jdGlvblBhcmFtZXRlci5hbnlUeXBlKHRydWUpKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBOYXRpdmVGdW5jdGlvbiBkb0dldE9yQ3JlYXRlRnVuY3Rpb24oTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzLCBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiB0eXBlID0gYXJnVHlwZXMuZ2V0KDApOworICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLmlzQ291bnRlcigpID8gbWluRnVuY3Rpb25Gb3JDb3VudGVyIDogbWFrZU1pbkZ1bmN0aW9uKHR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBUaGUgZnVuY3Rpb24gdXNlZCB0byBjb3VudCB0aGUgbnVtYmVyIG9mIHJvd3Mgb2YgYSByZXN1bHQgc2V0LiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIENPVU5UKCopIG9yIENPVU5UKDEpCiAgICAgICogaXMgc3BlY2lmaWVkLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWdncmVnYXRlRnVuY3Rpb24gY291bnRSb3dzRnVuY3Rpb24gPQotICAgICAgICAgICAgbmV3IE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uKCJjb3VudFJvd3MiLCBMb25nVHlwZS5pbnN0YW5jZSkKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvdW50Um93c0Z1bmN0aW9uIGNvdW50Um93c0Z1bmN0aW9uID0gbmV3IENvdW50Um93c0Z1bmN0aW9uKGZhbHNlKTsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ291bnRSb3dzRnVuY3Rpb24gZXh0ZW5kcyBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBDb3VudFJvd3NGdW5jdGlvbihib29sZWFuIHVzZUxlZ2FjeU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKHVzZUxlZ2FjeU5hbWUgPyAiY291bnRSb3dzIiA6ICJjb3VudF9yb3dzIiwgTG9uZ1R5cGUuaW5zdGFuY2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBBZ2dyZWdhdGUgbmV3QWdncmVnYXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGUoKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyBBZ2dyZWdhdGUgbmV3QWdncmVnYXRlKCkKKyAgICAgICAgICAgICAgICBwcml2YXRlIGxvbmcgY291bnQ7CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZSgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgbG9uZyBjb3VudDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgY29tcHV0ZShQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBMb25nVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoY291bnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHZhbHVlcykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICBjb3VudCA9IDA7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBjb2x1bW5OYW1lKExpc3Q8U3RyaW5nPiBjb2x1bW5OYW1lcykKKyAgICAgICAgICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBjb21wdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvdW50IjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExvbmdUeXBlLmluc3RhbmNlLmRlY29tcG9zZShjb3VudCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkSW5wdXQoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiB2YWx1ZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBjb2x1bW5OYW1lKExpc3Q8U3RyaW5nPiBjb2x1bW5OYW1lcykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICJjb3VudCI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE5hdGl2ZUZ1bmN0aW9uIHdpdGhMZWdhY3lOYW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb3VudFJvd3NGdW5jdGlvbih0cnVlKTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIC8qKgogICAgICAqIFRoZSBTVU0gZnVuY3Rpb24gZm9yIGRlY2ltYWwgdmFsdWVzLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWdncmVnYXRlRnVuY3Rpb24gc3VtRnVuY3Rpb25Gb3JEZWNpbWFsID0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uIHN1bUZ1bmN0aW9uRm9yRGVjaW1hbCA9CiAgICAgICAgICAgICBuZXcgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24oInN1bSIsIERlY2ltYWxUeXBlLmluc3RhbmNlLCBEZWNpbWFsVHlwZS5pbnN0YW5jZSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKQEAgLTE2NSw4ICsxNzMsMTAgQEAKIAogICAgIC8qKgogICAgICAqIFRoZSBBVkcgZnVuY3Rpb24gZm9yIGRlY2ltYWwgdmFsdWVzLgorICAgICAqIDwvcD4KKyAgICAgKiBUaGUgYXZlcmFnZSBvZiBhbiBlbXB0eSB2YWx1ZSBzZXQgcmV0dXJucyB6ZXJvLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWdncmVnYXRlRnVuY3Rpb24gYXZnRnVuY3Rpb25Gb3JEZWNpbWFsID0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uIGF2Z0Z1bmN0aW9uRm9yRGVjaW1hbCA9CiAgICAgICAgICAgICBuZXcgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24oImF2ZyIsIERlY2ltYWxUeXBlLmluc3RhbmNlLCBEZWNpbWFsVHlwZS5pbnN0YW5jZSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgQWdncmVnYXRlIG5ld0FnZ3JlZ2F0ZSgpCkBAIC0yMDksNyArMjE5LDcgQEAKICAgICAvKioKICAgICAgKiBUaGUgU1VNIGZ1bmN0aW9uIGZvciB2YXJpbnQgdmFsdWVzLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWdncmVnYXRlRnVuY3Rpb24gc3VtRnVuY3Rpb25Gb3JWYXJpbnQgPQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24gc3VtRnVuY3Rpb25Gb3JWYXJpbnQgPQogICAgICAgICAgICAgbmV3IE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uKCJzdW0iLCBJbnRlZ2VyVHlwZS5pbnN0YW5jZSwgSW50ZWdlclR5cGUuaW5zdGFuY2UpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcHVibGljIEFnZ3JlZ2F0ZSBuZXdBZ2dyZWdhdGUoKQpAQCAtMjQ0LDggKzI1NCwxMSBAQAogCiAgICAgLyoqCiAgICAgICogVGhlIEFWRyBmdW5jdGlvbiBmb3IgdmFyaW50IHZhbHVlcy4KKyAgICAgKiA8L3A+CisgICAgICogVGhlIGF2ZXJhZ2Ugb2YgYW4gZW1wdHkgdmFsdWUgc2V0IHJldHVybnMgemVyby4gVGhlIHJldHVybmVkIHZhbHVlIGlzIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGlucHV0IHZhbHVlcywgCisgICAgICogc28gdGhlIHJldHVybmVkIGF2ZXJhZ2Ugd29uJ3QgaGF2ZSBhIGRlY2ltYWwgcGFydC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFnZ3JlZ2F0ZUZ1bmN0aW9uIGF2Z0Z1bmN0aW9uRm9yVmFyaW50ID0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uIGF2Z0Z1bmN0aW9uRm9yVmFyaW50ID0KICAgICAgICAgICAgIG5ldyBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbigiYXZnIiwgSW50ZWdlclR5cGUuaW5zdGFuY2UsIEludGVnZXJUeXBlLmluc3RhbmNlKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHB1YmxpYyBBZ2dyZWdhdGUgbmV3QWdncmVnYXRlKCkKQEAgLTI4Nyw4ICszMDAsMTEgQEAKIAogICAgIC8qKgogICAgICAqIFRoZSBTVU0gZnVuY3Rpb24gZm9yIGJ5dGUgdmFsdWVzICh0aW55aW50KS4KKyAgICAgKiA8L3A+CisgICAgICogVGhlIHJldHVybmVkIHZhbHVlIGlzIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGlucHV0IHZhbHVlcywgc28gdGhlcmUgaXMgYSByaXNrIG9mIG92ZXJmbG93IGlmIHRoZSBzdW0gb2YgdGhlCisgICAgICogdmFsdWVzIGV4Y2VlZHMgdGhlIG1heGltdW0gdmFsdWUgdGhhdCB0aGUgdHlwZSBjYW4gcmVwcmVzZW50LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWdncmVnYXRlRnVuY3Rpb24gc3VtRnVuY3Rpb25Gb3JCeXRlID0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uIHN1bUZ1bmN0aW9uRm9yQnl0ZSA9CiAgICAgICAgICAgICBuZXcgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24oInN1bSIsIEJ5dGVUeXBlLmluc3RhbmNlLCBCeXRlVHlwZS5pbnN0YW5jZSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgQWdncmVnYXRlIG5ld0FnZ3JlZ2F0ZSgpCkBAIC0zMjMsOCArMzM5LDExIEBACiAKICAgICAvKioKICAgICAgKiBBVkcgZnVuY3Rpb24gZm9yIGJ5dGUgdmFsdWVzICh0aW55aW50KS4KKyAgICAgKiA8L3A+CisgICAgICogVGhlIGF2ZXJhZ2Ugb2YgYW4gZW1wdHkgdmFsdWUgc2V0IHJldHVybnMgemVyby4gVGhlIHJldHVybmVkIHZhbHVlIGlzIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGlucHV0IHZhbHVlcywgCisgICAgICogc28gdGhlIHJldHVybmVkIGF2ZXJhZ2Ugd29uJ3QgaGF2ZSBhIGRlY2ltYWwgcGFydC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFnZ3JlZ2F0ZUZ1bmN0aW9uIGF2Z0Z1bmN0aW9uRm9yQnl0ZSA9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbiBhdmdGdW5jdGlvbkZvckJ5dGUgPQogICAgICAgICAgICAgbmV3IE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uKCJhdmciLCBCeXRlVHlwZS5pbnN0YW5jZSwgQnl0ZVR5cGUuaW5zdGFuY2UpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcHVibGljIEFnZ3JlZ2F0ZSBuZXdBZ2dyZWdhdGUoKQpAQCAtMzQxLDggKzM2MCwxMSBAQAogCiAgICAgLyoqCiAgICAgICogVGhlIFNVTSBmdW5jdGlvbiBmb3Igc2hvcnQgdmFsdWVzIChzbWFsbGludCkuCisgICAgICogPC9wPgorICAgICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBpbnB1dCB2YWx1ZXMsIHNvIHRoZXJlIGlzIGEgcmlzayBvZiBvdmVyZmxvdyBpZiB0aGUgc3VtIG9mIHRoZQorICAgICAqIHZhbHVlcyBleGNlZWRzIHRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgdGhlIHR5cGUgY2FuIHJlcHJlc2VudC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFnZ3JlZ2F0ZUZ1bmN0aW9uIHN1bUZ1bmN0aW9uRm9yU2hvcnQgPQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24gc3VtRnVuY3Rpb25Gb3JTaG9ydCA9CiAgICAgICAgICAgICBuZXcgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24oInN1bSIsIFNob3J0VHlwZS5pbnN0YW5jZSwgU2hvcnRUeXBlLmluc3RhbmNlKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHB1YmxpYyBBZ2dyZWdhdGUgbmV3QWdncmVnYXRlKCkKQEAgLTM3Nyw4ICszOTksMTEgQEAKIAogICAgIC8qKgogICAgICAqIEFWRyBmdW5jdGlvbiBmb3IgZm9yIHNob3J0IHZhbHVlcyAoc21hbGxpbnQpLgorICAgICAqIDwvcD4KKyAgICAgKiBUaGUgYXZlcmFnZSBvZiBhbiBlbXB0eSB2YWx1ZSBzZXQgcmV0dXJucyB6ZXJvLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgaW5wdXQgdmFsdWVzLCAKKyAgICAgKiBzbyB0aGUgcmV0dXJuZWQgYXZlcmFnZSB3b24ndCBoYXZlIGEgZGVjaW1hbCBwYXJ0LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWdncmVnYXRlRnVuY3Rpb24gYXZnRnVuY3Rpb25Gb3JTaG9ydCA9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbiBhdmdGdW5jdGlvbkZvclNob3J0ID0KICAgICAgICAgICAgIG5ldyBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbigiYXZnIiwgU2hvcnRUeXBlLmluc3RhbmNlLCBTaG9ydFR5cGUuaW5zdGFuY2UpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcHVibGljIEFnZ3JlZ2F0ZSBuZXdBZ2dyZWdhdGUoKQpAQCAtMzk1LDggKzQyMCwxMSBAQAogCiAgICAgLyoqCiAgICAgICogVGhlIFNVTSBmdW5jdGlvbiBmb3IgaW50MzIgdmFsdWVzLgorICAgICAqIDwvcD4KKyAgICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgaW5wdXQgdmFsdWVzLCBzbyB0aGVyZSBpcyBhIHJpc2sgb2Ygb3ZlcmZsb3cgaWYgdGhlIHN1bSBvZiB0aGUKKyAgICAgKiB2YWx1ZXMgZXhjZWVkcyB0aGUgbWF4aW11bSB2YWx1ZSB0aGF0IHRoZSB0eXBlIGNhbiByZXByZXNlbnQuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBZ2dyZWdhdGVGdW5jdGlvbiBzdW1GdW5jdGlvbkZvckludDMyID0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uIHN1bUZ1bmN0aW9uRm9ySW50MzIgPQogICAgICAgICAgICAgbmV3IE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uKCJzdW0iLCBJbnQzMlR5cGUuaW5zdGFuY2UsIEludDMyVHlwZS5pbnN0YW5jZSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgQWdncmVnYXRlIG5ld0FnZ3JlZ2F0ZSgpCkBAIC00MzEsOCArNDU5LDExIEBACiAKICAgICAvKioKICAgICAgKiBBVkcgZnVuY3Rpb24gZm9yIGludDMyIHZhbHVlcy4KKyAgICAgKiA8L3A+CisgICAgICogVGhlIGF2ZXJhZ2Ugb2YgYW4gZW1wdHkgdmFsdWUgc2V0IHJldHVybnMgemVyby4gVGhlIHJldHVybmVkIHZhbHVlIGlzIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGlucHV0IHZhbHVlcywgCisgICAgICogc28gdGhlIHJldHVybmVkIGF2ZXJhZ2Ugd29uJ3QgaGF2ZSBhIGRlY2ltYWwgcGFydC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFnZ3JlZ2F0ZUZ1bmN0aW9uIGF2Z0Z1bmN0aW9uRm9ySW50MzIgPQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24gYXZnRnVuY3Rpb25Gb3JJbnQzMiA9CiAgICAgICAgICAgICBuZXcgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24oImF2ZyIsIEludDMyVHlwZS5pbnN0YW5jZSwgSW50MzJUeXBlLmluc3RhbmNlKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHB1YmxpYyBBZ2dyZWdhdGUgbmV3QWdncmVnYXRlKCkKQEAgLTQ0OSw4ICs0ODAsMTEgQEAKIAogICAgIC8qKgogICAgICAqIFRoZSBTVU0gZnVuY3Rpb24gZm9yIGxvbmcgdmFsdWVzLgorICAgICAqIDwvcD4KKyAgICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgaW5wdXQgdmFsdWVzLCBzbyB0aGVyZSBpcyBhIHJpc2sgb2Ygb3ZlcmZsb3cgaWYgdGhlIHN1bSBvZiB0aGUKKyAgICAgKiB2YWx1ZXMgZXhjZWVkcyB0aGUgbWF4aW11bSB2YWx1ZSB0aGF0IHRoZSB0eXBlIGNhbiByZXByZXNlbnQuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBZ2dyZWdhdGVGdW5jdGlvbiBzdW1GdW5jdGlvbkZvckxvbmcgPQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24gc3VtRnVuY3Rpb25Gb3JMb25nID0KICAgICAgICAgICAgIG5ldyBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbigic3VtIiwgTG9uZ1R5cGUuaW5zdGFuY2UsIExvbmdUeXBlLmluc3RhbmNlKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHB1YmxpYyBBZ2dyZWdhdGUgbmV3QWdncmVnYXRlKCkKQEAgLTQ2MSw4ICs0OTUsMTEgQEAKIAogICAgIC8qKgogICAgICAqIEFWRyBmdW5jdGlvbiBmb3IgbG9uZyB2YWx1ZXMuCisgICAgICogPC9wPgorICAgICAqIFRoZSBhdmVyYWdlIG9mIGFuIGVtcHR5IHZhbHVlIHNldCByZXR1cm5zIHplcm8uIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBpbnB1dCB2YWx1ZXMsIAorICAgICAqIHNvIHRoZSByZXR1cm5lZCBhdmVyYWdlIHdvbid0IGhhdmUgYSBkZWNpbWFsIHBhcnQuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBZ2dyZWdhdGVGdW5jdGlvbiBhdmdGdW5jdGlvbkZvckxvbmcgPQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24gYXZnRnVuY3Rpb25Gb3JMb25nID0KICAgICAgICAgICAgIG5ldyBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbigiYXZnIiwgTG9uZ1R5cGUuaW5zdGFuY2UsIExvbmdUeXBlLmluc3RhbmNlKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHB1YmxpYyBBZ2dyZWdhdGUgbmV3QWdncmVnYXRlKCkKQEAgLTQ3OSw4ICs1MTYsMTEgQEAKIAogICAgIC8qKgogICAgICAqIFRoZSBTVU0gZnVuY3Rpb24gZm9yIGZsb2F0IHZhbHVlcy4KKyAgICAgKiA8L3A+CisgICAgICogVGhlIHJldHVybmVkIHZhbHVlIGlzIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGlucHV0IHZhbHVlcywgc28gdGhlcmUgaXMgYSByaXNrIG9mIG92ZXJmbG93IGlmIHRoZSBzdW0gb2YgdGhlCisgICAgICogdmFsdWVzIGV4Y2VlZHMgdGhlIG1heGltdW0gdmFsdWUgdGhhdCB0aGUgdHlwZSBjYW4gcmVwcmVzZW50LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWdncmVnYXRlRnVuY3Rpb24gc3VtRnVuY3Rpb25Gb3JGbG9hdCA9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbiBzdW1GdW5jdGlvbkZvckZsb2F0ID0KICAgICAgICAgICAgIG5ldyBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbigic3VtIiwgRmxvYXRUeXBlLmluc3RhbmNlLCBGbG9hdFR5cGUuaW5zdGFuY2UpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcHVibGljIEFnZ3JlZ2F0ZSBuZXdBZ2dyZWdhdGUoKQpAQCAtNDk3LDggKzUzNywxMCBAQAogCiAgICAgLyoqCiAgICAgICogQVZHIGZ1bmN0aW9uIGZvciBmbG9hdCB2YWx1ZXMuCisgICAgICogPC9wPgorICAgICAqIFRoZSBhdmVyYWdlIG9mIGFuIGVtcHR5IHZhbHVlIHNldCByZXR1cm5zIHplcm8uCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBZ2dyZWdhdGVGdW5jdGlvbiBhdmdGdW5jdGlvbkZvckZsb2F0ID0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uIGF2Z0Z1bmN0aW9uRm9yRmxvYXQgPQogICAgICAgICAgICAgbmV3IE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uKCJhdmciLCBGbG9hdFR5cGUuaW5zdGFuY2UsIEZsb2F0VHlwZS5pbnN0YW5jZSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgQWdncmVnYXRlIG5ld0FnZ3JlZ2F0ZSgpCkBAIC01MTUsOCArNTU3LDExIEBACiAKICAgICAvKioKICAgICAgKiBUaGUgU1VNIGZ1bmN0aW9uIGZvciBkb3VibGUgdmFsdWVzLgorICAgICAqIDwvcD4KKyAgICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgaW5wdXQgdmFsdWVzLCBzbyB0aGVyZSBpcyBhIHJpc2sgb2Ygb3ZlcmZsb3cgaWYgdGhlIHN1bSBvZiB0aGUKKyAgICAgKiB2YWx1ZXMgZXhjZWVkcyB0aGUgbWF4aW11bSB2YWx1ZSB0aGF0IHRoZSB0eXBlIGNhbiByZXByZXNlbnQuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBZ2dyZWdhdGVGdW5jdGlvbiBzdW1GdW5jdGlvbkZvckRvdWJsZSA9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbiBzdW1GdW5jdGlvbkZvckRvdWJsZSA9CiAgICAgICAgICAgICBuZXcgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24oInN1bSIsIERvdWJsZVR5cGUuaW5zdGFuY2UsIERvdWJsZVR5cGUuaW5zdGFuY2UpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcHVibGljIEFnZ3JlZ2F0ZSBuZXdBZ2dyZWdhdGUoKQpAQCAtNTQxLDkgKzU4Niw5IEBACiAgICAgICAgIHByaXZhdGUgZG91YmxlIGNvbXBlbnNhdGlvbjsKICAgICAgICAgcHJpdmF0ZSBkb3VibGUgc2ltcGxlU3VtOwogCi0gICAgICAgIHByaXZhdGUgZmluYWwgQWJzdHJhY3RUeXBlIG51bWJlclR5cGU7CisgICAgICAgIHByaXZhdGUgZmluYWwgQWJzdHJhY3RUeXBlPD8+IG51bWJlclR5cGU7CiAKLSAgICAgICAgcHVibGljIEZsb2F0U3VtQWdncmVnYXRlKEFic3RyYWN0VHlwZSBudW1iZXJUeXBlKQorICAgICAgICBwdWJsaWMgRmxvYXRTdW1BZ2dyZWdhdGUoQWJzdHJhY3RUeXBlPD8+IG51bWJlclR5cGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXMubnVtYmVyVHlwZSA9IG51bWJlclR5cGU7CiAgICAgICAgIH0KQEAgLTU5OSw5ICs2NDQsOSBAQAogICAgICAgICBwcml2YXRlIEJpZ0RlY2ltYWwgYmlnU3VtID0gbnVsbDsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG92ZXJmbG93ID0gZmFsc2U7CiAKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdFR5cGUgbnVtYmVyVHlwZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdFR5cGU8Pz4gbnVtYmVyVHlwZTsKIAotICAgICAgICBwdWJsaWMgRmxvYXRBdmdBZ2dyZWdhdGUoQWJzdHJhY3RUeXBlIG51bWJlclR5cGUpCisgICAgICAgIHB1YmxpYyBGbG9hdEF2Z0FnZ3JlZ2F0ZShBYnN0cmFjdFR5cGU8Pz4gbnVtYmVyVHlwZSkKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy5udW1iZXJUeXBlID0gbnVtYmVyVHlwZTsKICAgICAgICAgfQpAQCAtNjc1LDggKzcyMCwxMCBAQAogCiAgICAgLyoqCiAgICAgICogQVZHIGZ1bmN0aW9uIGZvciBkb3VibGUgdmFsdWVzLgorICAgICAqIDwvcD4KKyAgICAgKiBUaGUgYXZlcmFnZSBvZiBhbiBlbXB0eSB2YWx1ZSBzZXQgcmV0dXJucyB6ZXJvLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWdncmVnYXRlRnVuY3Rpb24gYXZnRnVuY3Rpb25Gb3JEb3VibGUgPQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24gYXZnRnVuY3Rpb25Gb3JEb3VibGUgPQogICAgICAgICAgICAgbmV3IE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uKCJhdmciLCBEb3VibGVUeXBlLmluc3RhbmNlLCBEb3VibGVUeXBlLmluc3RhbmNlKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHB1YmxpYyBBZ2dyZWdhdGUgbmV3QWdncmVnYXRlKCkKQEAgLTY5NCw3ICs3NDEsNyBAQAogICAgIC8qKgogICAgICAqIFRoZSBTVU0gZnVuY3Rpb24gZm9yIGNvdW50ZXIgY29sdW1uIHZhbHVlcy4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFnZ3JlZ2F0ZUZ1bmN0aW9uIHN1bUZ1bmN0aW9uRm9yQ291bnRlciA9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbiBzdW1GdW5jdGlvbkZvckNvdW50ZXIgPQogICAgIG5ldyBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbigic3VtIiwgQ291bnRlckNvbHVtblR5cGUuaW5zdGFuY2UsIENvdW50ZXJDb2x1bW5UeXBlLmluc3RhbmNlKQogICAgIHsKICAgICAgICAgcHVibGljIEFnZ3JlZ2F0ZSBuZXdBZ2dyZWdhdGUoKQpAQCAtNzA2LDcgKzc1Myw3IEBACiAgICAgLyoqCiAgICAgICogQVZHIGZ1bmN0aW9uIGZvciBjb3VudGVyIGNvbHVtbiB2YWx1ZXMuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBZ2dyZWdhdGVGdW5jdGlvbiBhdmdGdW5jdGlvbkZvckNvdW50ZXIgPQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24gYXZnRnVuY3Rpb25Gb3JDb3VudGVyID0KICAgICBuZXcgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24oImF2ZyIsIENvdW50ZXJDb2x1bW5UeXBlLmluc3RhbmNlLCBDb3VudGVyQ29sdW1uVHlwZS5pbnN0YW5jZSkKICAgICB7CiAgICAgICAgIHB1YmxpYyBBZ2dyZWdhdGUgbmV3QWdncmVnYXRlKCkKQEAgLTcyNCw3ICs3NzEsNyBAQAogICAgIC8qKgogICAgICAqIFRoZSBNSU4gZnVuY3Rpb24gZm9yIGNvdW50ZXIgY29sdW1uIHZhbHVlcy4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFnZ3JlZ2F0ZUZ1bmN0aW9uIG1pbkZ1bmN0aW9uRm9yQ291bnRlciA9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbiBtaW5GdW5jdGlvbkZvckNvdW50ZXIgPQogICAgIG5ldyBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbigibWluIiwgQ291bnRlckNvbHVtblR5cGUuaW5zdGFuY2UsIENvdW50ZXJDb2x1bW5UeXBlLmluc3RhbmNlKQogICAgIHsKICAgICAgICAgcHVibGljIEFnZ3JlZ2F0ZSBuZXdBZ2dyZWdhdGUoKQpAQCAtNzYyLDcgKzgwOSw3IEBACiAgICAgLyoqCiAgICAgICogTUFYIGZ1bmN0aW9uIGZvciBjb3VudGVyIGNvbHVtbiB2YWx1ZXMuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBZ2dyZWdhdGVGdW5jdGlvbiBtYXhGdW5jdGlvbkZvckNvdW50ZXIgPQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24gbWF4RnVuY3Rpb25Gb3JDb3VudGVyID0KICAgICBuZXcgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24oIm1heCIsIENvdW50ZXJDb2x1bW5UeXBlLmluc3RhbmNlLCBDb3VudGVyQ29sdW1uVHlwZS5pbnN0YW5jZSkKICAgICB7CiAgICAgICAgIHB1YmxpYyBBZ2dyZWdhdGUgbmV3QWdncmVnYXRlKCkKQEAgLTgwMyw3ICs4NTAsNyBAQAogICAgICAqIEBwYXJhbSBpbnB1dFR5cGUgdGhlIGZ1bmN0aW9uIGlucHV0IGFuZCBvdXRwdXQgdHlwZQogICAgICAqIEByZXR1cm4gYSBNQVggZnVuY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgdHlwZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFnZ3JlZ2F0ZUZ1bmN0aW9uIG1ha2VNYXhGdW5jdGlvbihmaW5hbCBBYnN0cmFjdFR5cGU8Pz4gaW5wdXRUeXBlKQorICAgIHB1YmxpYyBzdGF0aWMgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24gbWFrZU1heEZ1bmN0aW9uKGZpbmFsIEFic3RyYWN0VHlwZTw/PiBpbnB1dFR5cGUpCiAgICAgewogICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uKCJtYXgiLCBpbnB1dFR5cGUsIGlucHV0VHlwZSkKICAgICAgICAgewpAQCAtODQ0LDcgKzg5MSw3IEBACiAgICAgICogQHBhcmFtIGlucHV0VHlwZSB0aGUgZnVuY3Rpb24gaW5wdXQgYW5kIG91dHB1dCB0eXBlCiAgICAgICogQHJldHVybiBhIE1JTiBmdW5jdGlvbiBmb3IgdGhlIHNwZWNpZmllZCB0eXBlLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQWdncmVnYXRlRnVuY3Rpb24gbWFrZU1pbkZ1bmN0aW9uKGZpbmFsIEFic3RyYWN0VHlwZTw/PiBpbnB1dFR5cGUpCisgICAgcHVibGljIHN0YXRpYyBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbiBtYWtlTWluRnVuY3Rpb24oZmluYWwgQWJzdHJhY3RUeXBlPD8+IGlucHV0VHlwZSkKICAgICB7CiAgICAgICAgIHJldHVybiBuZXcgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24oIm1pbiIsIGlucHV0VHlwZSwgaW5wdXRUeXBlKQogICAgICAgICB7CkBAIC04ODUsNyArOTMyLDcgQEAKICAgICAgKiBAcGFyYW0gaW5wdXRUeXBlIHRoZSBmdW5jdGlvbiBpbnB1dCB0eXBlCiAgICAgICogQHJldHVybiBhIENPVU5UIGZ1bmN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBZ2dyZWdhdGVGdW5jdGlvbiBtYWtlQ291bnRGdW5jdGlvbihBYnN0cmFjdFR5cGU8Pz4gaW5wdXRUeXBlKQorICAgIHB1YmxpYyBzdGF0aWMgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24gbWFrZUNvdW50RnVuY3Rpb24oQWJzdHJhY3RUeXBlPD8+IGlucHV0VHlwZSkKICAgICB7CiAgICAgICAgIHJldHVybiBuZXcgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24oImNvdW50IiwgTG9uZ1R5cGUuaW5zdGFuY2UsIGlucHV0VHlwZSkKICAgICAgICAgewpAQCAtOTU3LDkgKzEwMDQsOSBAQAogICAgICAgICBwcml2YXRlIEJpZ0ludGVnZXIgYmlnU3VtID0gbnVsbDsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG92ZXJmbG93ID0gZmFsc2U7CiAKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdFR5cGUgbnVtYmVyVHlwZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdFR5cGU8Pz4gbnVtYmVyVHlwZTsKIAotICAgICAgICBwdWJsaWMgQXZnQWdncmVnYXRlKEFic3RyYWN0VHlwZSB0eXBlKQorICAgICAgICBwdWJsaWMgQXZnQWdncmVnYXRlKEFic3RyYWN0VHlwZTw/PiB0eXBlKQogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzLm51bWJlclR5cGUgPSB0eXBlOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9CeXRlc0NvbnZlcnNpb25GY3RzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9CeXRlc0NvbnZlcnNpb25GY3RzLmphdmEKaW5kZXggN2U5NzA4YS4uOGE4ZWI5YyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvQnl0ZXNDb252ZXJzaW9uRmN0cy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0J5dGVzQ29udmVyc2lvbkZjdHMuamF2YQpAQCAtMTgsOTggKzE4LDEwNCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9uczsKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUwzVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVzVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVURjhUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5NYXJzaGFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCeXRlc0NvbnZlcnNpb25GY3RzCiB7Ci0gICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPEZ1bmN0aW9uPiBhbGwoKQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGdW5jdGlvbnNUbyhOYXRpdmVGdW5jdGlvbnMgZnVuY3Rpb25zKQogICAgIHsKLSAgICAgICAgQ29sbGVjdGlvbjxGdW5jdGlvbj4gZnVuY3Rpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICAgICAgLy8gYmVjYXVzZSB0ZXh0IGFuZCB2YXJjaGFyIGVuZHMgdXAgYmVpbmcgc3lub255bW91cywgb3VyIGF1dG9tYXRpYyBtYWtlVG9CbG9iRnVuY3Rpb24gZG9lc24ndCB3b3JrCi0gICAgICAgIC8vIGZvciB2YXJjaGFyLCBzbyB3ZSBzcGVjaWFsIGNhc2UgaXQgYmVsb3cuIFdlIGFsc28gc2tpcCBibG9iIGZvciBvYnZpb3VzIHJlYXNvbnMuCi0gICAgICAgIFNldDxBYnN0cmFjdFR5cGU8Pz4+IHR5cGVzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICBmb3IgKENRTDNUeXBlIHR5cGUgOiBDUUwzVHlwZS5OYXRpdmUudmFsdWVzKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICh0eXBlID09IENRTDNUeXBlLk5hdGl2ZS5CTE9CKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHVkZlR5cGUgPSB0eXBlLmdldFR5cGUoKS51ZGZUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoIXR5cGVzLmFkZCh1ZGZUeXBlKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAgICAgZnVuY3Rpb25zLmFkZChtYWtlVG9CbG9iRnVuY3Rpb24odHlwZS5nZXRUeXBlKCkudWRmVHlwZSgpKSk7Ci0gICAgICAgICAgICBmdW5jdGlvbnMuYWRkKG1ha2VGcm9tQmxvYkZ1bmN0aW9uKHR5cGUuZ2V0VHlwZSgpLnVkZlR5cGUoKSkpOworICAgICAgICAgICAgZnVuY3Rpb25zLmFkZChuZXcgVG9CbG9iRnVuY3Rpb24odHlwZSkpOworICAgICAgICAgICAgZnVuY3Rpb25zLmFkZChuZXcgRnJvbUJsb2JGdW5jdGlvbih0eXBlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBNb3N0IG9mIHRoZSBYX2FzX2Jsb2IgYW5kIGJsb2JfYXNfWCBmdW5jdGlvbnMgYXJlIGJhc2ljYWxseSBuby1vcCBzaW5jZSBldmVyeXRoaW5nIGlzCisgICAgLy8gYnl0ZXMgaW50ZXJuYWxseS4gVGhleSBvbmx5ICJ0cmljayIgdGhlIHR5cGUgc3lzdGVtLgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVG9CbG9iRnVuY3Rpb24gZXh0ZW5kcyBOYXRpdmVTY2FsYXJGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDUUwzVHlwZSBmcm9tVHlwZTsKKworICAgICAgICBwdWJsaWMgVG9CbG9iRnVuY3Rpb24oQ1FMM1R5cGUgZnJvbVR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMoZnJvbVR5cGUsIGZhbHNlKTsKICAgICAgICAgfQogCi0gICAgICAgIGZ1bmN0aW9ucy5hZGQoVmFyY2hhckFzQmxvYkZjdCk7Ci0gICAgICAgIGZ1bmN0aW9ucy5hZGQoQmxvYkFzVmFyY2hhckZjdCk7CisgICAgICAgIHByaXZhdGUgVG9CbG9iRnVuY3Rpb24oQ1FMM1R5cGUgZnJvbVR5cGUsIGJvb2xlYW4gdXNlTGVnYWN5TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZnJvbVR5cGUgKyAodXNlTGVnYWN5TmFtZSA/ICJhc2Jsb2IiIDogIl9hc19ibG9iIiksCisgICAgICAgICAgICAgICAgICBCeXRlc1R5cGUuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICBmcm9tVHlwZS5nZXRUeXBlKCkudWRmVHlwZSgpKTsKKyAgICAgICAgICAgIHRoaXMuZnJvbVR5cGUgPSBmcm9tVHlwZTsKKyAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBmdW5jdGlvbnM7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleGVjdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1ldGVycykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnMuZ2V0KDApOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBOYXRpdmVGdW5jdGlvbiB3aXRoTGVnYWN5TmFtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVG9CbG9iRnVuY3Rpb24oZnJvbVR5cGUsIHRydWUpOworICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gTW9zdCBvZiB0aGUgWEFzQmxvYiBhbmQgYmxvYkFzWCBmdW5jdGlvbnMgYXJlIGJhc2ljYWxseSBuby1vcCBzaW5jZSBldmVyeXRoaW5nIGlzCi0gICAgLy8gYnl0ZXMgaW50ZXJuYWxseS4gVGhleSBvbmx5ICJ0cmljayIgdGhlIHR5cGUgc3lzdGVtLgotICAgIHB1YmxpYyBzdGF0aWMgRnVuY3Rpb24gbWFrZVRvQmxvYkZ1bmN0aW9uKEFic3RyYWN0VHlwZTw/PiBmcm9tVHlwZSkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZyb21CbG9iRnVuY3Rpb24gZXh0ZW5kcyBOYXRpdmVTY2FsYXJGdW5jdGlvbgogICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBmcm9tVHlwZS5hc0NRTDNUeXBlKCkgKyAiYXNibG9iIjsKLSAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVTY2FsYXJGdW5jdGlvbihuYW1lLCBCeXRlc1R5cGUuaW5zdGFuY2UsIGZyb21UeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleGVjdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1ldGVycykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1ldGVycy5nZXQoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQorICAgICAgICBwcml2YXRlIGZpbmFsIENRTDNUeXBlIHRvVHlwZTsKIAotICAgIHB1YmxpYyBzdGF0aWMgRnVuY3Rpb24gbWFrZUZyb21CbG9iRnVuY3Rpb24oZmluYWwgQWJzdHJhY3RUeXBlPD8+IHRvVHlwZSkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gImJsb2JhcyIgKyB0b1R5cGUuYXNDUUwzVHlwZSgpOwotICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZVNjYWxhckZ1bmN0aW9uKG5hbWUsIHRvVHlwZSwgQnl0ZXNUeXBlLmluc3RhbmNlKQorICAgICAgICBwdWJsaWMgRnJvbUJsb2JGdW5jdGlvbihDUUwzVHlwZSB0b1R5cGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKSB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KKyAgICAgICAgICAgIHRoaXModG9UeXBlLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEZyb21CbG9iRnVuY3Rpb24oQ1FMM1R5cGUgdG9UeXBlLCBib29sZWFuIHVzZUxlZ2FjeU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKCh1c2VMZWdhY3lOYW1lID8gImJsb2JhcyIgOiAiYmxvYl9hc18iKSArIHRvVHlwZSwKKyAgICAgICAgICAgICAgICAgIHRvVHlwZS5nZXRUeXBlKCkudWRmVHlwZSgpLAorICAgICAgICAgICAgICAgICAgQnl0ZXNUeXBlLmluc3RhbmNlKTsKKyAgICAgICAgICAgIHRoaXMudG9UeXBlID0gdG9UeXBlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBCeXRlQnVmZmVyIHZhbCA9IHBhcmFtZXRlcnMuZ2V0KDApOworCisgICAgICAgICAgICBpZiAodmFsICE9IG51bGwpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciB2YWwgPSBwYXJhbWV0ZXJzLmdldCgwKTsKICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWwgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvVHlwZS52YWxpZGF0ZSh2YWwpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICAgICAgICAgICAgICB0b1R5cGUuZ2V0VHlwZSgpLnZhbGlkYXRlKHZhbCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhdGNoIChNYXJzaGFsRXhjZXB0aW9uIGUpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiSW4gY2FsbCB0byBmdW5jdGlvbiAlcywgdmFsdWUgMHglcyBpcyBub3QgYSB2YWxpZCBiaW5hcnkgcmVwcmVzZW50YXRpb24gZm9yIHR5cGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KHZhbCksIHRvVHlwZS5hc0NRTDNUeXBlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkluIGNhbGwgdG8gZnVuY3Rpb24gJXMsIHZhbHVlIDB4JXMgaXMgbm90IGEgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZCBiaW5hcnkgcmVwcmVzZW50YXRpb24gZm9yIHR5cGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KHZhbCksIHRvVHlwZSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgfTsKKworICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTmF0aXZlRnVuY3Rpb24gd2l0aExlZ2FjeU5hbWUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZyb21CbG9iRnVuY3Rpb24odG9UeXBlLCB0cnVlKTsKKyAgICAgICAgfQogICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRnVuY3Rpb24gVmFyY2hhckFzQmxvYkZjdCA9IG5ldyBOYXRpdmVTY2FsYXJGdW5jdGlvbigidmFyY2hhcmFzYmxvYiIsIEJ5dGVzVHlwZS5pbnN0YW5jZSwgVVRGOFR5cGUuaW5zdGFuY2UpCi0gICAgewotICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleGVjdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1ldGVycykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnMuZ2V0KDApOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRnVuY3Rpb24gQmxvYkFzVmFyY2hhckZjdCA9IG5ldyBOYXRpdmVTY2FsYXJGdW5jdGlvbigiYmxvYmFzdmFyY2hhciIsIFVURjhUeXBlLmluc3RhbmNlLCBCeXRlc1R5cGUuaW5zdGFuY2UpCi0gICAgewotICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleGVjdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1ldGVycykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnMuZ2V0KDApOwotICAgICAgICB9Ci0gICAgfTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0Nhc3RGY3RzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9DYXN0RmN0cy5qYXZhCmluZGV4IDgxOTg2YzguLjE3NjE3NzggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0Nhc3RGY3RzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvQ2FzdEZjdHMuamF2YQpAQCAtMjAsOCArMjAsNiBAQAogaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGU7CkBAIC00OCw3ICs0Niw3IEBACiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuVGltZUZjdHMuKjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50ZXh0LldvcmRVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHM7CiAKIC8qKgogICogQ2FzdGluZyBmdW5jdGlvbnMKQEAgLTU2LDEyICs1NCwxNCBAQAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgQ2FzdEZjdHMKIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVOQ1RJT05fTkFNRV9QUkVGSVggPSAiY2FzdEFzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVOQ1RJT05fTkFNRV9QUkVGSVggPSAiY2FzdF9hc18iOwogCi0gICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPEZ1bmN0aW9uPiBhbGwoKQorICAgIC8vIFVudGlsIDUuMCB3ZSBoYXZlIHVzZWQgY2FtZWwgY2FzZWQgbmFtZXMgZm9yIGNhc3QgZnVuY3Rpb25zLiBUaGF0IGNoYW5nZWQgd2l0aCBDQVNTQU5EUkEtMTgwMzcsIHdoZXJlIHdlIGRlY2lkZWQKKyAgICAvLyB0byBhZG9wdCBzbmFrZSBjYXNlIGZvciBhbGwgbmF0aXZlIGZ1bmN0aW9uIG5hbWVzLiBIb3dldmVyLCB3ZSBzaG91bGQgc3RpbGwgc3VwcG9ydCB0aGUgb2xkIGNhbWUgY2FzZSBuYW1lcy4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX0ZVTkNUSU9OX05BTUVfUFJFRklYID0gImNhc3RBcyI7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRnVuY3Rpb25zVG8oTmF0aXZlRnVuY3Rpb25zIGZ1bmN0aW9ucykKICAgICB7Ci0gICAgICAgIExpc3Q8RnVuY3Rpb24+IGZ1bmN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCiAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgICAgICBmaW5hbCBBYnN0cmFjdFR5cGU8PyBleHRlbmRzIE51bWJlcj5bXSBudW1lcmljVHlwZXMgPSBuZXcgQWJzdHJhY3RUeXBlW10ge0J5dGVUeXBlLmluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3J0VHlwZS5pbnN0YW5jZSwKQEAgLTExMCw4ICsxMTAsNiBAQAogCiAgICAgICAgIGZ1bmN0aW9ucy5hZGQoQ2FzdEFzVGV4dEZ1bmN0aW9uLmNyZWF0ZShVVUlEVHlwZS5pbnN0YW5jZSwgQXNjaWlUeXBlLmluc3RhbmNlKSk7CiAgICAgICAgIGZ1bmN0aW9ucy5hZGQoQ2FzdEFzVGV4dEZ1bmN0aW9uLmNyZWF0ZShVVUlEVHlwZS5pbnN0YW5jZSwgVVRGOFR5cGUuaW5zdGFuY2UpKTsKLQotICAgICAgICByZXR1cm4gZnVuY3Rpb25zOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTMyLDI1ICsxMzAsMzggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBuYW1lIG9mIHRoZSBjYXN0IGZ1bmN0aW9uIHVzZSB0byBjYXN0IHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgICAgKiBDcmVhdGVzIHRoZSBzbmFrZS1jYXNlZCBuYW1lIG9mIHRoZSBjYXN0IGZ1bmN0aW9uIHVzZWQgdG8gY2FzdCB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCiAgICAgICoKICAgICAgKiBAcGFyYW0gb3V0cHV0VHlwZSB0aGUgb3V0cHV0IHR5cGUKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjYXN0IGZ1bmN0aW9uIHVzZSB0byBjYXN0IHRvIHRoZSBzcGVjaWZpZWQgdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZ1bmN0aW9uTmFtZShBYnN0cmFjdFR5cGU8Pz4gb3V0cHV0VHlwZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRGdW5jdGlvbk5hbWUob3V0cHV0VHlwZS5hc0NRTDNUeXBlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIG5hbWUgb2YgdGhlIGNhc3QgZnVuY3Rpb24gdXNlIHRvIGNhc3QgdG8gdGhlIHNwZWNpZmllZCB0eXBlLgotICAgICAqCi0gICAgICogQHBhcmFtIG91dHB1dFR5cGUgdGhlIG91dHB1dCB0eXBlCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2FzdCBmdW5jdGlvbiB1c2UgdG8gY2FzdCB0byB0aGUgc3BlY2lmaWVkIHR5cGUKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjYXN0IGZ1bmN0aW9uIHVzZWQgdG8gY2FzdCB0byB0aGUgc3BlY2lmaWVkIHR5cGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGdW5jdGlvbk5hbWUoQ1FMM1R5cGUgb3V0cHV0VHlwZSkKICAgICB7Ci0gICAgICAgIHJldHVybiBGVU5DVElPTl9OQU1FX1BSRUZJWCArIFdvcmRVdGlscy5jYXBpdGFsaXplKHRvTG93ZXJDYXNlU3RyaW5nKG91dHB1dFR5cGUpKTsKKyAgICAgICAgcmV0dXJuIEZVTkNUSU9OX05BTUVfUFJFRklYICsgdG9Mb3dlckNhc2VTdHJpbmcob3V0cHV0VHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgbGVnYWN5IGNhbWVsLWNhc2VkIG5hbWUgb2YgdGhlIGNhc3QgZnVuY3Rpb24gdXNlZCB0byBjYXN0IHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXRwdXRUeXBlIHRoZSBvdXRwdXQgdHlwZQorICAgICAqIEByZXR1cm4gdGhlIGxlZ2FjeSBjYW1lbC1jYXNlZCBuYW1lIG9mIHRoZSBjYXN0IGZ1bmN0aW9uIHVzZWQgdG8gY2FzdCB0byB0aGUgc3BlY2lmaWVkIHR5cGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TGVnYWN5RnVuY3Rpb25OYW1lKENRTDNUeXBlIG91dHB1dFR5cGUpCisgICAgeworICAgICAgICByZXR1cm4gTEVHQUNZX0ZVTkNUSU9OX05BTUVfUFJFRklYICsgU3RyaW5nVXRpbHMuY2FwaXRhbGl6ZSh0b0xvd2VyQ2FzZVN0cmluZyhvdXRwdXRUeXBlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgbmFtZSBvZiB0aGUgY2FzdCBmdW5jdGlvbiB1c2VkIHRvIGNhc3QgdG8gdGhlIHNwZWNpZmllZCB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dFR5cGUgdGhlIG91dHB1dCB0eXBlCisgICAgICogQHBhcmFtIGxlZ2FjeSB3aGV0aGVyIHRvIHVzZSB0aGUgb2xkIGNhbWVDYXNlIG5hbWVzLCBpbnN0ZWFkIG9mIHRoZSBuZXcgc25ha2VfY2FzZSBuYW1lcworICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNhc3QgZnVuY3Rpb24gdXNlZCB0byBjYXN0IHRvIHRoZSBzcGVjaWZpZWQgdHlwZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRGdW5jdGlvbk5hbWUoQWJzdHJhY3RUeXBlPD8+IG91dHB1dFR5cGUsIGJvb2xlYW4gbGVnYWN5KQorICAgIHsKKyAgICAgICAgQ1FMM1R5cGUgdHlwZSA9IG91dHB1dFR5cGUuYXNDUUwzVHlwZSgpOworICAgICAgICByZXR1cm4gbGVnYWN5ID8gZ2V0TGVnYWN5RnVuY3Rpb25OYW1lKHR5cGUpIDogZ2V0RnVuY3Rpb25OYW1lKHR5cGUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTYxLDcgKzE3Miw3IEBACiAgICAgICogQHBhcmFtIG91dHB1dFR5cGUgdGhlIG91dHB1dCB0eXBlCiAgICAgICogQHBhcmFtIGNvbnZlcnRlciB0aGUgZnVuY3Rpb24gdXNlIHRvIGNvbnZlcnQgdGhlIGlucHV0IHR5cGUgaW50byB0aGUgb3V0cHV0IHR5cGUKICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyA8SSwgTz4gdm9pZCBhZGRGdW5jdGlvbklmTmVlZGVkKExpc3Q8RnVuY3Rpb24+IGZ1bmN0aW9ucywKKyAgICBwcml2YXRlIHN0YXRpYyA8SSwgTz4gdm9pZCBhZGRGdW5jdGlvbklmTmVlZGVkKE5hdGl2ZUZ1bmN0aW9ucyBmdW5jdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8ST4gaW5wdXRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPE8+IG91dHB1dFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248SSwgTz4gY29udmVydGVyKQpAQCAtMTcxLDkgKzE4Miw5IEBACiAgICAgfQogCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBzdGF0aWMgPE8sIEk+IEZ1bmN0aW9uIHdyYXBKYXZhRnVuY3Rpb24oQWJzdHJhY3RUeXBlPEk+IGlucHV0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Tz4gb3V0cHV0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248SSwgTz4gY29udmVydGVyKQorICAgIHByaXZhdGUgc3RhdGljIDxPLCBJPiBDYXN0RnVuY3Rpb248PywgTz4gd3JhcEphdmFGdW5jdGlvbihBYnN0cmFjdFR5cGU8ST4gaW5wdXRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Tz4gb3V0cHV0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPEksIE8+IGNvbnZlcnRlcikKICAgICB7CiAgICAgICAgIHJldHVybiBpbnB1dFR5cGUuZXF1YWxzKENvdW50ZXJDb2x1bW5UeXBlLmluc3RhbmNlKQogICAgICAgICAgICAgICAgID8gSmF2YUNvdW50ZXJGdW5jdGlvbldyYXBwZXIuY3JlYXRlKG91dHB1dFR5cGUsIChqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248TG9uZywgTz4pIGNvbnZlcnRlcikKQEAgLTE5Myw5ICsyMDQsOSBAQAogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIENhc3RGdW5jdGlvbjxJLCBPPiBleHRlbmRzIE5hdGl2ZVNjYWxhckZ1bmN0aW9uCiAgICAgewotICAgICAgICBwdWJsaWMgQ2FzdEZ1bmN0aW9uKEFic3RyYWN0VHlwZTxJPiBpbnB1dFR5cGUsIEFic3RyYWN0VHlwZTxPPiBvdXRwdXRUeXBlKQorICAgICAgICBwdWJsaWMgQ2FzdEZ1bmN0aW9uKEFic3RyYWN0VHlwZTxJPiBpbnB1dFR5cGUsIEFic3RyYWN0VHlwZTxPPiBvdXRwdXRUeXBlLCBib29sZWFuIHVzZUxlZ2FjeU5hbWUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKGdldEZ1bmN0aW9uTmFtZShvdXRwdXRUeXBlKSwgb3V0cHV0VHlwZSwgaW5wdXRUeXBlKTsKKyAgICAgICAgICAgIHN1cGVyKGdldEZ1bmN0aW9uTmFtZShvdXRwdXRUeXBlLCB1c2VMZWdhY3lOYW1lKSwgb3V0cHV0VHlwZSwgaW5wdXRUeXBlKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpAQCAtMjI4LDIzICsyMzksMzAgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBqYXZhIGZ1bmN0aW9uIHVzZWQgdG8gY29udmVydCB0aGUgaW5wdXQgdHlwZSBpbnRvIHRoZSBvdXRwdXQgb25lLgogICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248SSwgTz4gY29udmVydGVyOworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPEksIE8+IGNvbnZlcnRlcjsKIAogICAgICAgICBwdWJsaWMgc3RhdGljIDxJLCBPPiBKYXZhRnVuY3Rpb25XcmFwcGVyPEksIE8+IGNyZWF0ZShBYnN0cmFjdFR5cGU8ST4gaW5wdXRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Tz4gb3V0cHV0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPEksIE8+IGNvbnZlcnRlcikKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXZhRnVuY3Rpb25XcmFwcGVyPEksIE8+KGlucHV0VHlwZSwgb3V0cHV0VHlwZSwgY29udmVydGVyKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmF2YUZ1bmN0aW9uV3JhcHBlcjw+KGlucHV0VHlwZSwgb3V0cHV0VHlwZSwgY29udmVydGVyLCBmYWxzZSk7CiAgICAgICAgIH0KIAogICAgICAgICBwcm90ZWN0ZWQgSmF2YUZ1bmN0aW9uV3JhcHBlcihBYnN0cmFjdFR5cGU8ST4gaW5wdXRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Tz4gb3V0cHV0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPEksIE8+IGNvbnZlcnRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPEksIE8+IGNvbnZlcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VMZWdhY3lOYW1lKQogICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihpbnB1dFR5cGUsIG91dHB1dFR5cGUpOworICAgICAgICAgICAgc3VwZXIoaW5wdXRUeXBlLCBvdXRwdXRUeXBlLCB1c2VMZWdhY3lOYW1lKTsKICAgICAgICAgICAgIHRoaXMuY29udmVydGVyID0gY29udmVydGVyOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBKYXZhRnVuY3Rpb25XcmFwcGVyPEksIE8+IHdpdGhMZWdhY3lOYW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXZhRnVuY3Rpb25XcmFwcGVyPD4oaW5wdXRUeXBlKCksIG91dHB1dFR5cGUoKSwgY29udmVydGVyLCB0cnVlKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBmaW5hbCBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQogICAgICAgICB7CiAgICAgICAgICAgICBCeXRlQnVmZmVyIGJiID0gcGFyYW1ldGVycy5nZXQoMCk7CkBAIC0yNzMsMTMgKzI5MSwyMCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIDxPPiBKYXZhRnVuY3Rpb25XcmFwcGVyPExvbmcsIE8+IGNyZWF0ZShBYnN0cmFjdFR5cGU8Tz4gb3V0cHV0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPExvbmcsIE8+IGNvbnZlcnRlcikKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXZhQ291bnRlckZ1bmN0aW9uV3JhcHBlcjxPPihvdXRwdXRUeXBlLCBjb252ZXJ0ZXIpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXZhQ291bnRlckZ1bmN0aW9uV3JhcHBlcjw+KG91dHB1dFR5cGUsIGNvbnZlcnRlciwgZmFsc2UpOwogICAgICAgICB9CiAKICAgICAgICAgcHJvdGVjdGVkIEphdmFDb3VudGVyRnVuY3Rpb25XcmFwcGVyKEFic3RyYWN0VHlwZTxPPiBvdXRwdXRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248TG9uZywgTz4gY29udmVydGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPExvbmcsIE8+IGNvbnZlcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlTGVnYWN5TmFtZSkKICAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoQ291bnRlckNvbHVtblR5cGUuaW5zdGFuY2UsIG91dHB1dFR5cGUsIGNvbnZlcnRlcik7CisgICAgICAgICAgICBzdXBlcihDb3VudGVyQ29sdW1uVHlwZS5pbnN0YW5jZSwgb3V0cHV0VHlwZSwgY29udmVydGVyLCB1c2VMZWdhY3lOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSmF2YUNvdW50ZXJGdW5jdGlvbldyYXBwZXI8Tz4gd2l0aExlZ2FjeU5hbWUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEphdmFDb3VudGVyRnVuY3Rpb25XcmFwcGVyPD4ob3V0cHV0VHlwZSgpLCBjb252ZXJ0ZXIsIHRydWUpOwogICAgICAgICB9CiAKICAgICAgICAgcHJvdGVjdGVkIExvbmcgY29tcG9zZShCeXRlQnVmZmVyIGJiKQpAQCAtMzA1LDE5ICszMzAsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Tz4gb3V0cHV0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYXRpdmVTY2FsYXJGdW5jdGlvbiBkZWxlZ2F0ZSkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBDYXNzYW5kcmFGdW5jdGlvbldyYXBwZXI8SSwgTz4oaW5wdXRUeXBlLCBvdXRwdXRUeXBlLCBkZWxlZ2F0ZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IENhc3NhbmRyYUZ1bmN0aW9uV3JhcHBlcjw+KGlucHV0VHlwZSwgb3V0cHV0VHlwZSwgZGVsZWdhdGUsIGZhbHNlKTsKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgQ2Fzc2FuZHJhRnVuY3Rpb25XcmFwcGVyKEFic3RyYWN0VHlwZTxJPiBpbnB1dFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTxPPiBvdXRwdXRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYXRpdmVTY2FsYXJGdW5jdGlvbiBkZWxlZ2F0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF0aXZlU2NhbGFyRnVuY3Rpb24gZGVsZWdhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlTGVnYWN5TmFtZSkKICAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoaW5wdXRUeXBlLCBvdXRwdXRUeXBlKTsKKyAgICAgICAgICAgIHN1cGVyKGlucHV0VHlwZSwgb3V0cHV0VHlwZSwgdXNlTGVnYWN5TmFtZSk7CiAgICAgICAgICAgICBhc3NlcnQgZGVsZWdhdGUuYXJnVHlwZXMoKS5zaXplKCkgPT0gMSAmJiBpbnB1dFR5cGUuZXF1YWxzKGRlbGVnYXRlLmFyZ1R5cGVzKCkuZ2V0KDApKTsKICAgICAgICAgICAgIGFzc2VydCBvdXRwdXRUeXBlLmVxdWFscyhkZWxlZ2F0ZS5yZXR1cm5UeXBlKCkpOwogICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDYXNzYW5kcmFGdW5jdGlvbldyYXBwZXI8SSwgTz4gd2l0aExlZ2FjeU5hbWUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENhc3NhbmRyYUZ1bmN0aW9uV3JhcHBlcjw+KGlucHV0VHlwZSgpLCBvdXRwdXRUeXBlKCksIGRlbGVnYXRlLCB0cnVlKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuZXhlY3V0ZShwcm90b2NvbFZlcnNpb24sIHBhcmFtZXRlcnMpOwpAQCAtMzM1LDEzICszNjcsMTggQEAKICAgICAgICAgcHVibGljIHN0YXRpYyA8ST4gQ2FzdEFzVGV4dEZ1bmN0aW9uPEk+IGNyZWF0ZShBYnN0cmFjdFR5cGU8ST4gaW5wdXRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTxTdHJpbmc+IG91dHB1dFR5cGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ2FzdEFzVGV4dEZ1bmN0aW9uPEk+KGlucHV0VHlwZSwgb3V0cHV0VHlwZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IENhc3RBc1RleHRGdW5jdGlvbjw+KGlucHV0VHlwZSwgb3V0cHV0VHlwZSwgZmFsc2UpOwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSBDYXN0QXNUZXh0RnVuY3Rpb24oQWJzdHJhY3RUeXBlPEk+IGlucHV0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTxTdHJpbmc+IG91dHB1dFR5cGUpCisgICAgICAgIHByaXZhdGUgQ2FzdEFzVGV4dEZ1bmN0aW9uKEFic3RyYWN0VHlwZTxJPiBpbnB1dFR5cGUsIEFic3RyYWN0VHlwZTxTdHJpbmc+IG91dHB1dFR5cGUsIGJvb2xlYW4gdXNlTGVnYWN5TmFtZSkKICAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoaW5wdXRUeXBlLCBvdXRwdXRUeXBlKTsKKyAgICAgICAgICAgIHN1cGVyKGlucHV0VHlwZSwgb3V0cHV0VHlwZSwgdXNlTGVnYWN5TmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENhc3RBc1RleHRGdW5jdGlvbjxJPiB3aXRoTGVnYWN5TmFtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2FzdEFzVGV4dEZ1bmN0aW9uPD4oaW5wdXRUeXBlKCksIG91dHB1dFR5cGUoKSwgdHJ1ZSk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleGVjdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1ldGVycykKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0NvbGxlY3Rpb25GY3RzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9Db2xsZWN0aW9uRmN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYzk2YjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9Db2xsZWN0aW9uRmN0cy5qYXZhCkBAIC0wLDAgKzEsMzcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUwzVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkNvbGxlY3Rpb25UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTGlzdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5NYXBUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuU2V0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOworCisvKioKKyAqIE5hdGl2ZSBDUUwgZnVuY3Rpb25zIGZvciBjb2xsZWN0aW9ucyAoc2V0cywgbGlzdCBhbmQgbWFwcykuCisgKiA8cD4KKyAqIEFsbCB0aGUgZnVuY3Rpb25zIHByb3ZpZGVkIGhlcmUgYXJlIHtAbGluayBOYXRpdmVTY2FsYXJGdW5jdGlvbn0sIGFuZCB0aGV5IGFyZSBtZWFudCB0byBiZSBhcHBsaWVkIHRvIHNpbmdsZQorICogY29sbGVjdGlvbiB2YWx1ZXMgdG8gcGVyZm9ybSBzb21lIGtpbmQgb2YgYWdncmVnYXRpb24gd2l0aCB0aGUgZWxlbWVudHMgb2YgdGhlIGNvbGxlY3Rpb24gYXJndW1lbnQuIFdoZW4gcG9zc2libGUsCisgKiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlc2UgYWdncmVnYXRpb24gZnVuY3Rpb25zIGlzIGJhc2VkIG9uIHRoZSBhY2Nyb3NzLXJvd3MgYWdncmVnYXRpb24gZnVuY3Rpb25zIGF2YWlsYWJsZSBvbgorICoge0BsaW5rIEFnZ3JlZ2F0ZUZjdHN9LCBzbyBib3RoIGFjcm9zcy1yb3dzIGFuZCB3aXRoaW4tY29sbGVjdGlvbiBhZ2dyZWdhdGlvbnMgaGF2ZSB0aGUgc2FtZSBiZWhhdmlvdXIuCisgKi8KK3B1YmxpYyBjbGFzcyBDb2xsZWN0aW9uRmN0cworeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGdW5jdGlvbnNUbyhOYXRpdmVGdW5jdGlvbnMgZnVuY3Rpb25zKQorICAgIHsKKyAgICAgICAgZnVuY3Rpb25zLmFkZChuZXcgRnVuY3Rpb25GYWN0b3J5KCJtYXBfa2V5cyIsIEZ1bmN0aW9uUGFyYW1ldGVyLmFueU1hcCgpKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBOYXRpdmVGdW5jdGlvbiBkb0dldE9yQ3JlYXRlRnVuY3Rpb24oTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzLCBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtYWtlTWFwS2V5c0Z1bmN0aW9uKG5hbWUubmFtZSwgKE1hcFR5cGU8PywgPz4pIGFyZ1R5cGVzLmdldCgwKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGZ1bmN0aW9ucy5hZGQobmV3IEZ1bmN0aW9uRmFjdG9yeSgibWFwX3ZhbHVlcyIsIEZ1bmN0aW9uUGFyYW1ldGVyLmFueU1hcCgpKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBOYXRpdmVGdW5jdGlvbiBkb0dldE9yQ3JlYXRlRnVuY3Rpb24oTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzLCBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtYWtlTWFwVmFsdWVzRnVuY3Rpb24obmFtZS5uYW1lLCAoTWFwVHlwZTw/LCA/PikgYXJnVHlwZXMuZ2V0KDApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgZnVuY3Rpb25zLmFkZChuZXcgRnVuY3Rpb25GYWN0b3J5KCJjb2xsZWN0aW9uX2NvdW50IiwgRnVuY3Rpb25QYXJhbWV0ZXIuYW55Q29sbGVjdGlvbigpKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBOYXRpdmVGdW5jdGlvbiBkb0dldE9yQ3JlYXRlRnVuY3Rpb24oTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzLCBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtYWtlQ29sbGVjdGlvbkNvdW50RnVuY3Rpb24obmFtZS5uYW1lLCAoQ29sbGVjdGlvblR5cGU8Pz4pIGFyZ1R5cGVzLmdldCgwKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGZ1bmN0aW9ucy5hZGQobmV3IEZ1bmN0aW9uRmFjdG9yeSgiY29sbGVjdGlvbl9taW4iLCBGdW5jdGlvblBhcmFtZXRlci5zZXRPckxpc3QoKSkKKyAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgTmF0aXZlRnVuY3Rpb24gZG9HZXRPckNyZWF0ZUZ1bmN0aW9uKExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBhcmdUeXBlcywgQWJzdHJhY3RUeXBlPD8+IHJlY2VpdmVyVHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFrZUNvbGxlY3Rpb25NaW5GdW5jdGlvbihuYW1lLm5hbWUsIChDb2xsZWN0aW9uVHlwZTw/PikgYXJnVHlwZXMuZ2V0KDApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgZnVuY3Rpb25zLmFkZChuZXcgRnVuY3Rpb25GYWN0b3J5KCJjb2xsZWN0aW9uX21heCIsIEZ1bmN0aW9uUGFyYW1ldGVyLnNldE9yTGlzdCgpKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBOYXRpdmVGdW5jdGlvbiBkb0dldE9yQ3JlYXRlRnVuY3Rpb24oTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzLCBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtYWtlQ29sbGVjdGlvbk1heEZ1bmN0aW9uKG5hbWUubmFtZSwgKENvbGxlY3Rpb25UeXBlPD8+KSBhcmdUeXBlcy5nZXQoMCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBmdW5jdGlvbnMuYWRkKG5ldyBGdW5jdGlvbkZhY3RvcnkoImNvbGxlY3Rpb25fc3VtIiwgRnVuY3Rpb25QYXJhbWV0ZXIubnVtZXJpY1NldE9yTGlzdCgpKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBOYXRpdmVGdW5jdGlvbiBkb0dldE9yQ3JlYXRlRnVuY3Rpb24oTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzLCBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtYWtlQ29sbGVjdGlvblN1bUZ1bmN0aW9uKG5hbWUubmFtZSwgKENvbGxlY3Rpb25UeXBlPD8+KSBhcmdUeXBlcy5nZXQoMCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBmdW5jdGlvbnMuYWRkKG5ldyBGdW5jdGlvbkZhY3RvcnkoImNvbGxlY3Rpb25fYXZnIiwgRnVuY3Rpb25QYXJhbWV0ZXIubnVtZXJpY1NldE9yTGlzdCgpKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBOYXRpdmVGdW5jdGlvbiBkb0dldE9yQ3JlYXRlRnVuY3Rpb24oTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzLCBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtYWtlQ29sbGVjdGlvbkF2Z0Z1bmN0aW9uKG5hbWUubmFtZSwgKENvbGxlY3Rpb25UeXBlPD8+KSBhcmdUeXBlcy5nZXQoMCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmF0aXZlIHNjYWxhciBmdW5jdGlvbiBmb3IgZ2V0dGluZyB0aGUga2V5cyBvZiBhIG1hcCBjb2x1bW4sIGFzIGEgc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgICAgICB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24KKyAgICAgKiBAcGFyYW0gaW5wdXRUeXBlIHRoZSB0eXBlIG9mIHRoZSBtYXAgYXJndW1lbnQgYnkgdGhlIHJldHVybmVkIGZ1bmN0aW9uCisgICAgICogQHBhcmFtIDxLPiAgICAgICB0aGUgY2xhc3Mgb2YgdGhlIG1hcCBhcmd1bWVudCBrZXlzCisgICAgICogQHBhcmFtIDxWPiAgICAgICB0aGUgY2xhc3Mgb2YgdGhlIG1hcCBhcmd1bWVudCB2YWx1ZXMKKyAgICAgKiBAcmV0dXJuIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgc2VyaWFsaXplZCBzZXQgY29udGFpbmluZyB0aGUga2V5cyBvZiB0aGUgbWFwIHBhc3NlZCBhcyBhcmd1bWVudAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIDxLLCBWPiBOYXRpdmVTY2FsYXJGdW5jdGlvbiBtYWtlTWFwS2V5c0Z1bmN0aW9uKFN0cmluZyBuYW1lLCBNYXBUeXBlPEssIFY+IGlucHV0VHlwZSkKKyAgICB7CisgICAgICAgIFNldFR5cGU8Sz4gb3V0cHV0VHlwZSA9IFNldFR5cGUuZ2V0SW5zdGFuY2UoaW5wdXRUeXBlLmdldEtleXNUeXBlKCksIGZhbHNlKTsKKworICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZVNjYWxhckZ1bmN0aW9uKG5hbWUsIG91dHB1dFR5cGUsIGlucHV0VHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleGVjdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1ldGVycykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gcGFyYW1ldGVycy5nZXQoMCk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgTWFwPEssIFY+IG1hcCA9IGlucHV0VHlwZS5jb21wb3NlKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBTZXQ8Sz4ga2V5cyA9IG1hcC5rZXlTZXQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0VHlwZS5kZWNvbXBvc2Uoa2V5cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5hdGl2ZSBzY2FsYXIgZnVuY3Rpb24gZm9yIGdldHRpbmcgdGhlIHZhbHVlcyBvZiBhIG1hcCBjb2x1bW4sIGFzIGEgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lICAgICAgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uCisgICAgICogQHBhcmFtIGlucHV0VHlwZSB0aGUgdHlwZSBvZiB0aGUgbWFwIGFyZ3VtZW50IGFjY2VwdGVkIGJ5IHRoZSByZXR1cm5lZCBmdW5jdGlvbgorICAgICAqIEBwYXJhbSA8Sz4gICAgICAgdGhlIGNsYXNzIG9mIHRoZSBtYXAgYXJndW1lbnQga2V5cworICAgICAqIEBwYXJhbSA8Vj4gICAgICAgdGhlIGNsYXNzIG9mIHRoZSBtYXAgYXJndW1lbnQgdmFsdWVzCisgICAgICogQHJldHVybiBhIGZ1bmN0aW9uIHJldHVybmluZyBhIHNlcmlhbGl6ZWQgbGlzdCBjb250YWluaW5nIHRoZSB2YWx1ZXMgb2YgdGhlIG1hcCBwYXNzZWQgYXMgYXJndW1lbnQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyA8SywgVj4gTmF0aXZlU2NhbGFyRnVuY3Rpb24gbWFrZU1hcFZhbHVlc0Z1bmN0aW9uKFN0cmluZyBuYW1lLCBNYXBUeXBlPEssIFY+IGlucHV0VHlwZSkKKyAgICB7CisgICAgICAgIExpc3RUeXBlPFY+IG91dHB1dFR5cGUgPSBMaXN0VHlwZS5nZXRJbnN0YW5jZShpbnB1dFR5cGUuZ2V0VmFsdWVzVHlwZSgpLCBmYWxzZSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVTY2FsYXJGdW5jdGlvbihuYW1lLCBvdXRwdXRUeXBlLCBpbnB1dFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhlY3V0ZShQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciB2YWx1ZSA9IHBhcmFtZXRlcnMuZ2V0KDApOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgIE1hcDxLLCBWPiBtYXAgPSBpbnB1dFR5cGUuY29tcG9zZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgTGlzdDxWPiB2YWx1ZXMgPSBJbW11dGFibGVMaXN0LmNvcHlPZihtYXAudmFsdWVzKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXRUeXBlLmRlY29tcG9zZSh2YWx1ZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuYXRpdmUgc2NhbGFyIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSBjb2xsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgICAgICB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24KKyAgICAgKiBAcGFyYW0gaW5wdXRUeXBlIHRoZSB0eXBlIG9mIHRoZSBjb2xsZWN0aW9uIGFyZ3VtZW50IGFjY2VwdGVkIGJ5IHRoZSByZXR1cm5lZCBmdW5jdGlvbgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBjb2xsZWN0aW9uIGFyZ3VtZW50CisgICAgICogQHJldHVybiBhIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uIHBhc3NlZCBhcyBhcmd1bWVudCwgYXMgYSAzMi1iaXQgaW50ZWdlcgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIDxUPiBOYXRpdmVTY2FsYXJGdW5jdGlvbiBtYWtlQ29sbGVjdGlvbkNvdW50RnVuY3Rpb24oU3RyaW5nIG5hbWUsIENvbGxlY3Rpb25UeXBlPFQ+IGlucHV0VHlwZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgTmF0aXZlU2NhbGFyRnVuY3Rpb24obmFtZSwgSW50MzJUeXBlLmluc3RhbmNlLCBpbnB1dFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhlY3V0ZShQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciB2YWx1ZSA9IHBhcmFtZXRlcnMuZ2V0KDApOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgIGludCBzaXplID0gaW5wdXRUeXBlLnNpemUodmFsdWUpOworICAgICAgICAgICAgICAgIHJldHVybiBJbnQzMlR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKHNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuYXRpdmUgc2NhbGFyIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHRoZSBtaW4gZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSAgICAgIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbgorICAgICAqIEBwYXJhbSBpbnB1dFR5cGUgdGhlIHR5cGUgb2YgdGhlIGNvbGxlY3Rpb24gYXJndW1lbnQgYWNjZXB0ZWQgYnkgdGhlIHJldHVybmVkIGZ1bmN0aW9uCisgICAgICogQHBhcmFtIDxUPiAgICAgICB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGNvbGxlY3Rpb24gYXJndW1lbnQKKyAgICAgKiBAcmV0dXJuIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBtaW4gZWxlbWVudCBpbiB0aGUgY29sbGVjdGlvbiBwYXNzZWQgYXMgYXJndW1lbnQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyA8VD4gTmF0aXZlU2NhbGFyRnVuY3Rpb24gbWFrZUNvbGxlY3Rpb25NaW5GdW5jdGlvbihTdHJpbmcgbmFtZSwgQ29sbGVjdGlvblR5cGU8VD4gaW5wdXRUeXBlKQorICAgIHsKKyAgICAgICAgQWJzdHJhY3RUeXBlPD8+IGVsZW1lbnRzVHlwZSA9IGVsZW1lbnRzVHlwZShpbnB1dFR5cGUpOworICAgICAgICBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbiBmdW5jdGlvbiA9IGVsZW1lbnRzVHlwZS5pc0NvdW50ZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQWdncmVnYXRlRmN0cy5taW5GdW5jdGlvbkZvckNvdW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFnZ3JlZ2F0ZUZjdHMubWFrZU1pbkZ1bmN0aW9uKGVsZW1lbnRzVHlwZSk7CisgICAgICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbkFnZ3JlZ2F0aW9uRnVuY3Rpb24obmFtZSwgaW5wdXRUeXBlLCBmdW5jdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5hdGl2ZSBzY2FsYXIgZnVuY3Rpb24gZm9yIGdldHRpbmcgdGhlIG1heCBlbGVtZW50IGluIGEgY29sbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lICAgICAgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uCisgICAgICogQHBhcmFtIGlucHV0VHlwZSB0aGUgdHlwZSBvZiB0aGUgY29sbGVjdGlvbiBhcmd1bWVudCBhY2NlcHRlZCBieSB0aGUgcmV0dXJuZWQgZnVuY3Rpb24KKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgY29sbGVjdGlvbiBhcmd1bWVudAorICAgICAqIEByZXR1cm4gYSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIG1heCBlbGVtZW50IGluIHRoZSBjb2xsZWN0aW9uIHBhc3NlZCBhcyBhcmd1bWVudAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIDxUPiBOYXRpdmVTY2FsYXJGdW5jdGlvbiBtYWtlQ29sbGVjdGlvbk1heEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBDb2xsZWN0aW9uVHlwZTxUPiBpbnB1dFR5cGUpCisgICAgeworICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gZWxlbWVudHNUeXBlID0gZWxlbWVudHNUeXBlKGlucHV0VHlwZSk7CisgICAgICAgIE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uIGZ1bmN0aW9uID0gZWxlbWVudHNUeXBlLmlzQ291bnRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBZ2dyZWdhdGVGY3RzLm1heEZ1bmN0aW9uRm9yQ291bnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQWdncmVnYXRlRmN0cy5tYWtlTWF4RnVuY3Rpb24oZWxlbWVudHNUeXBlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uQWdncmVnYXRpb25GdW5jdGlvbihuYW1lLCBpbnB1dFR5cGUsIGZ1bmN0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmF0aXZlIHNjYWxhciBmdW5jdGlvbiBmb3IgZ2V0dGluZyB0aGUgc3VtIG9mIHRoZSBlbGVtZW50cyBpbiBhIG51bWVyaWMgY29sbGVjdGlvbi4KKyAgICAgKiA8L3A+CisgICAgICogVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbiBpcyBvZiB0aGUgc2FtZSB0eXBlIGFzIGVsZW1lbnRzIG9mIGl0cyBpbnB1dCBjb2xsZWN0aW9uLCBzbyB0aGVyZSBpcyBhIHJpc2sKKyAgICAgKiBvZiBvdmVyZmxvdyBpZiB0aGUgc3VtIG9mIHRoZSB2YWx1ZXMgZXhjZWVkcyB0aGUgbWF4aW11bSB2YWx1ZSB0aGF0IHRoZSB0eXBlIGNhbiByZXByZXNlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSAgICAgIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbgorICAgICAqIEBwYXJhbSBpbnB1dFR5cGUgdGhlIHR5cGUgb2YgdGhlIGNvbGxlY3Rpb24gYXJndW1lbnQgYWNjZXB0ZWQgYnkgdGhlIHJldHVybmVkIGZ1bmN0aW9uCisgICAgICogQHBhcmFtIDxUPiAgICAgICB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGNvbGxlY3Rpb24gYXJndW1lbnQKKyAgICAgKiBAcmV0dXJuIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzdW0gb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uIHBhc3NlZCBhcyBhcmd1bWVudAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIDxUPiBOYXRpdmVTY2FsYXJGdW5jdGlvbiBtYWtlQ29sbGVjdGlvblN1bUZ1bmN0aW9uKFN0cmluZyBuYW1lLCBDb2xsZWN0aW9uVHlwZTxUPiBpbnB1dFR5cGUpCisgICAgeworICAgICAgICBDUUwzVHlwZSBlbGVtZW50c1R5cGUgPSBlbGVtZW50c1R5cGUoaW5wdXRUeXBlKS5hc0NRTDNUeXBlKCk7CisgICAgICAgIE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uIGZ1bmN0aW9uID0gZ2V0U3VtRnVuY3Rpb24oKENRTDNUeXBlLk5hdGl2ZSkgZWxlbWVudHNUeXBlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uQWdncmVnYXRpb25GdW5jdGlvbihuYW1lLCBpbnB1dFR5cGUsIGZ1bmN0aW9uKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbiBnZXRTdW1GdW5jdGlvbihDUUwzVHlwZS5OYXRpdmUgdHlwZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBUSU5ZSU5UOgorICAgICAgICAgICAgICAgIHJldHVybiBBZ2dyZWdhdGVGY3RzLnN1bUZ1bmN0aW9uRm9yQnl0ZTsKKyAgICAgICAgICAgIGNhc2UgU01BTExJTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFnZ3JlZ2F0ZUZjdHMuc3VtRnVuY3Rpb25Gb3JTaG9ydDsKKyAgICAgICAgICAgIGNhc2UgSU5UOgorICAgICAgICAgICAgICAgIHJldHVybiBBZ2dyZWdhdGVGY3RzLnN1bUZ1bmN0aW9uRm9ySW50MzI7CisgICAgICAgICAgICBjYXNlIEJJR0lOVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQWdncmVnYXRlRmN0cy5zdW1GdW5jdGlvbkZvckxvbmc7CisgICAgICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICAgICAgICAgIHJldHVybiBBZ2dyZWdhdGVGY3RzLnN1bUZ1bmN0aW9uRm9yRmxvYXQ7CisgICAgICAgICAgICBjYXNlIERPVUJMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gQWdncmVnYXRlRmN0cy5zdW1GdW5jdGlvbkZvckRvdWJsZTsKKyAgICAgICAgICAgIGNhc2UgVkFSSU5UOgorICAgICAgICAgICAgICAgIHJldHVybiBBZ2dyZWdhdGVGY3RzLnN1bUZ1bmN0aW9uRm9yVmFyaW50OworICAgICAgICAgICAgY2FzZSBERUNJTUFMOgorICAgICAgICAgICAgICAgIHJldHVybiBBZ2dyZWdhdGVGY3RzLnN1bUZ1bmN0aW9uRm9yRGVjaW1hbDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJFeHBlY3RlZCBudW1lcmljIGNvbGxlY3Rpb24gYnV0IGZvdW5kICIgKyB0eXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuYXRpdmUgc2NhbGFyIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHRoZSBhdmVyYWdlIG9mIHRoZSBlbGVtZW50cyBpbiBhIG51bWVyaWMgY29sbGVjdGlvbi4KKyAgICAgKiA8L3A+CisgICAgICogVGhlIGF2ZXJhZ2Ugb2YgYW4gZW1wdHkgY29sbGVjdGlvbiByZXR1cm5zIHplcm8uIFRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb24gaXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUKKyAgICAgKiBlbGVtZW50cyBvZiBpdHMgaW5wdXQgY29sbGVjdGlvbiwgc28gaWYgdGhvc2UgZG9uJ3QgaGF2ZSBhIGRlY2ltYWwgcGFydCB0aGVuIHRoZSByZXR1cm5lZCBhdmVyYWdlIHdvbid0IGhhdmUgYQorICAgICAqIGRlY2ltYWwgcGFydCBlaXRoZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSAgICAgIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbgorICAgICAqIEBwYXJhbSBpbnB1dFR5cGUgdGhlIHR5cGUgb2YgdGhlIGNvbGxlY3Rpb24gYXJndW1lbnQgYWNjZXB0ZWQgYnkgdGhlIHJldHVybmVkIGZ1bmN0aW9uCisgICAgICogQHBhcmFtIDxUPiAgICAgICB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGNvbGxlY3Rpb24gYXJndW1lbnQKKyAgICAgKiBAcmV0dXJuIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBhdmVyYWdlIHZhbHVlIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgY29sbGVjdGlvbiBwYXNzZWQgYXMgYXJndW1lbnQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyA8VD4gTmF0aXZlU2NhbGFyRnVuY3Rpb24gbWFrZUNvbGxlY3Rpb25BdmdGdW5jdGlvbihTdHJpbmcgbmFtZSwgQ29sbGVjdGlvblR5cGU8VD4gaW5wdXRUeXBlKQorICAgIHsKKyAgICAgICAgQ1FMM1R5cGUgZWxlbWVudHNUeXBlID0gZWxlbWVudHNUeXBlKGlucHV0VHlwZSkuYXNDUUwzVHlwZSgpOworICAgICAgICBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbiBmdW5jdGlvbiA9IGdldEF2Z0Z1bmN0aW9uKChDUUwzVHlwZS5OYXRpdmUpIGVsZW1lbnRzVHlwZSk7CisgICAgICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbkFnZ3JlZ2F0aW9uRnVuY3Rpb24obmFtZSwgaW5wdXRUeXBlLCBmdW5jdGlvbik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24gZ2V0QXZnRnVuY3Rpb24oQ1FMM1R5cGUuTmF0aXZlIHR5cGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgVElOWUlOVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQWdncmVnYXRlRmN0cy5hdmdGdW5jdGlvbkZvckJ5dGU7CisgICAgICAgICAgICBjYXNlIFNNQUxMSU5UOgorICAgICAgICAgICAgICAgIHJldHVybiBBZ2dyZWdhdGVGY3RzLmF2Z0Z1bmN0aW9uRm9yU2hvcnQ7CisgICAgICAgICAgICBjYXNlIElOVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQWdncmVnYXRlRmN0cy5hdmdGdW5jdGlvbkZvckludDMyOworICAgICAgICAgICAgY2FzZSBCSUdJTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFnZ3JlZ2F0ZUZjdHMuYXZnRnVuY3Rpb25Gb3JMb25nOworICAgICAgICAgICAgY2FzZSBGTE9BVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQWdncmVnYXRlRmN0cy5hdmdGdW5jdGlvbkZvckZsb2F0OworICAgICAgICAgICAgY2FzZSBET1VCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFnZ3JlZ2F0ZUZjdHMuYXZnRnVuY3Rpb25Gb3JEb3VibGU7CisgICAgICAgICAgICBjYXNlIFZBUklOVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQWdncmVnYXRlRmN0cy5hdmdGdW5jdGlvbkZvclZhcmludDsKKyAgICAgICAgICAgIGNhc2UgREVDSU1BTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQWdncmVnYXRlRmN0cy5hdmdGdW5jdGlvbkZvckRlY2ltYWw7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiRXhwZWN0ZWQgbnVtZXJpYyBjb2xsZWN0aW9uIGJ1dCBmb3VuZCAiICsgdHlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBBYnN0cmFjdFR5cGU8Pz4gZWxlbWVudHNUeXBlKENvbGxlY3Rpb25UeXBlPD8+IHR5cGUpCisgICAgeworICAgICAgICBpZiAodHlwZS5raW5kID09IENvbGxlY3Rpb25UeXBlLktpbmQuTElTVCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICgoTGlzdFR5cGU8Pz4pIHR5cGUpLmdldEVsZW1lbnRzVHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHR5cGUua2luZCA9PSBDb2xsZWN0aW9uVHlwZS5LaW5kLlNFVCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICgoU2V0VHlwZTw/PikgdHlwZSkuZ2V0RWxlbWVudHNUeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIkNhbm5vdCBnZXQgdGhlIGVsZW1lbnQgdHlwZSBvZjogIiArIHR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEge0BsaW5rIE5hdGl2ZVNjYWxhckZ1bmN0aW9ufSBmb3IgYWdncmVnYXRpbmcgdGhlIGVsZW1lbnRzIG9mIGEgY29sbGVjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGFnZ3JlZ2F0b3Igb2YKKyAgICAgKiBhIGNlcnRhaW4ge0BsaW5rIE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9ufS4KKyAgICAgKiA8cD4KKyAgICAgKiB7QGxpbmsgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb259IGlzIG1lYW50IHRvIGJlIHVzZWQgZm9yIGFnZ3JlZ2F0aW5nIHZhbHVlcyBhY2Nyb3NzIHJvd3MsIGJ1dCBoZXJlIHdlIHVzZSB0aGF0CisgICAgICogZnVuY3Rpb24gdG8gYWdncmVnYXRlIHRoZSBlbGVtZW50cyBvZiBhIHNpbmdsZSBjb2xsZWN0aW9uIHZhbHVlLiBUaGF0IHdheSwgZnVuY3Rpb25zIHN1Y2ggYXMge0Bjb2RlIGF2Z30gYW5kCisgICAgICoge0Bjb2RlIGNvbGxlY3Rpb25fYXZnfSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBiZWhhdmlvdXIgd2hlbiBhcHBsaWVkIHRvIHJvdyBjb2x1bW5zIG9yIGNvbGxlY3Rpb24gZWxlbWVudHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29sbGVjdGlvbkFnZ3JlZ2F0aW9uRnVuY3Rpb24gZXh0ZW5kcyBOYXRpdmVTY2FsYXJGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uVHlwZTw/PiBpbnB1dFR5cGU7CisgICAgICAgIHByaXZhdGUgZmluYWwgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24gYWdncmVnYXRlRnVuY3Rpb247CisKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb25BZ2dyZWdhdGlvbkZ1bmN0aW9uKFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvblR5cGU8Pz4gaW5wdXRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24gYWdncmVnYXRlRnVuY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKG5hbWUsIGFnZ3JlZ2F0ZUZ1bmN0aW9uLnJldHVyblR5cGUsIGlucHV0VHlwZSk7CisgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9IGlucHV0VHlwZTsKKyAgICAgICAgICAgIHRoaXMuYWdncmVnYXRlRnVuY3Rpb24gPSBhZ2dyZWdhdGVGdW5jdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleGVjdXRlKFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgdmFsdWUgPSBwYXJhbWV0ZXJzLmdldCgwKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBBZ2dyZWdhdGVGdW5jdGlvbi5BZ2dyZWdhdGUgYWdncmVnYXRlID0gYWdncmVnYXRlRnVuY3Rpb24ubmV3QWdncmVnYXRlKCk7CisgICAgICAgICAgICBpbnB1dFR5cGUuZm9yRWFjaCh2YWx1ZSwgZWxlbWVudCAtPiBhZ2dyZWdhdGUuYWRkSW5wdXQodmVyc2lvbiwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChlbGVtZW50KSkpOworICAgICAgICAgICAgcmV0dXJuIGFnZ3JlZ2F0ZS5jb21wdXRlKHZlcnNpb24pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvRnJvbUpzb25GY3QuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0Zyb21Kc29uRmN0LmphdmEKaW5kZXggMDFhNmUyMC4uMzRhNzc5OSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvRnJvbUpzb25GY3QuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9Gcm9tSnNvbkZjdC5qYXZhCkBAIC0yMiwzOSArMjIsNDEgQEAKIGltcG9ydCBqYXZhLnV0aWwuKjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuSnNvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTDNUeXBlOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5RdWVyeU9wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuRnVuY3Rpb25FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5NYXJzaGFsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSnNvblV0aWxzOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OwogCiBwdWJsaWMgY2xhc3MgRnJvbUpzb25GY3QgZXh0ZW5kcyBOYXRpdmVTY2FsYXJGdW5jdGlvbgogewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRnVuY3Rpb25OYW1lIE5BTUUgPSBGdW5jdGlvbk5hbWUubmF0aXZlRnVuY3Rpb24oImZyb21qc29uIik7Ci0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8QWJzdHJhY3RUeXBlPD8+LCBGcm9tSnNvbkZjdD4gaW5zdGFuY2VzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgRnJvbUpzb25GY3QgZ2V0SW5zdGFuY2UoQWJzdHJhY3RUeXBlPD8+IHJldHVyblR5cGUpCisgICAgcHVibGljIHN0YXRpYyBGcm9tSnNvbkZjdCBnZXRJbnN0YW5jZShGdW5jdGlvbk5hbWUgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHJldHVyblR5cGUpCiAgICAgewogICAgICAgICBGcm9tSnNvbkZjdCBmdW5jID0gaW5zdGFuY2VzLmdldChyZXR1cm5UeXBlKTsKICAgICAgICAgaWYgKGZ1bmMgPT0gbnVsbCkKICAgICAgICAgewotICAgICAgICAgICAgZnVuYyA9IG5ldyBGcm9tSnNvbkZjdChyZXR1cm5UeXBlKTsKKyAgICAgICAgICAgIGZ1bmMgPSBuZXcgRnJvbUpzb25GY3QobmFtZSwgcmV0dXJuVHlwZSk7CiAgICAgICAgICAgICBpbnN0YW5jZXMucHV0KHJldHVyblR5cGUsIGZ1bmMpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmdW5jOwogICAgIH0KIAotICAgIHByaXZhdGUgRnJvbUpzb25GY3QoQWJzdHJhY3RUeXBlPD8+IHJldHVyblR5cGUpCisgICAgcHJpdmF0ZSBGcm9tSnNvbkZjdChGdW5jdGlvbk5hbWUgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHJldHVyblR5cGUpCiAgICAgewotICAgICAgICBzdXBlcigiZnJvbWpzb24iLCByZXR1cm5UeXBlLCBVVEY4VHlwZS5pbnN0YW5jZSk7CisgICAgICAgIHN1cGVyKG5hbWUubmFtZSwgcmV0dXJuVHlwZSwgVVRGOFR5cGUuaW5zdGFuY2UpOwogICAgIH0KIAogICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IHBhcmFtZXRlcnMuc2l6ZSgpID09IDEgOiAiVW5leHBlY3RlZGx5IGdvdCAiICsgcGFyYW1ldGVycy5zaXplKCkgKyAiIGFyZ3VtZW50cyBmb3IgZnJvbUpzb24oKSI7CisgICAgICAgIGFzc2VydCBwYXJhbWV0ZXJzLnNpemUoKSA9PSAxIDogZm9ybWF0KCJVbmV4cGVjdGVkbHkgZ290ICVkIGFyZ3VtZW50cyBmb3IgJXMoKSIsIHBhcmFtZXRlcnMuc2l6ZSgpLCBuYW1lLm5hbWUpOwogICAgICAgICBCeXRlQnVmZmVyIGFyZ3VtZW50ID0gcGFyYW1ldGVycy5nZXQoMCk7CiAgICAgICAgIGlmIChhcmd1bWVudCA9PSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC02MiwxOCArNjQsNDMgQEAKICAgICAgICAgU3RyaW5nIGpzb25BcmcgPSBVVEY4VHlwZS5pbnN0YW5jZS5nZXRTZXJpYWxpemVyKCkuZGVzZXJpYWxpemUoYXJndW1lbnQpOwogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IEpzb24uSlNPTl9PQkpFQ1RfTUFQUEVSLnJlYWRWYWx1ZShqc29uQXJnLCBPYmplY3QuY2xhc3MpOworICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IEpzb25VdGlscy5KU09OX09CSkVDVF9NQVBQRVIucmVhZFZhbHVlKGpzb25BcmcsIE9iamVjdC5jbGFzcyk7CiAgICAgICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVHlwZS5mcm9tSlNPTk9iamVjdChvYmplY3QpLmJpbmRBbmRHZXQoUXVlcnlPcHRpb25zLmZvclByb3RvY29sVmVyc2lvbihwcm90b2NvbFZlcnNpb24pKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXhjKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBGdW5jdGlvbkV4ZWN1dGlvbkV4Y2VwdGlvbi5jcmVhdGUoTkFNRSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgidGV4dCIpLCBTdHJpbmcuZm9ybWF0KCJDb3VsZCBub3QgZGVjb2RlIEpTT04gc3RyaW5nICclcyc6ICVzIiwganNvbkFyZywgZXhjLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIHRocm93IEZ1bmN0aW9uRXhlY3V0aW9uRXhjZXB0aW9uLmNyZWF0ZShuYW1lKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoInRleHQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIkNvdWxkIG5vdCBkZWNvZGUgSlNPTiBzdHJpbmcgJyVzJzogJXMiLCBqc29uQXJnLCBleGMpKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoTWFyc2hhbEV4Y2VwdGlvbiBleGMpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRocm93IEZ1bmN0aW9uRXhlY3V0aW9uRXhjZXB0aW9uLmNyZWF0ZSh0aGlzLCBleGMpOwogICAgICAgICB9CiAgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEZ1bmN0aW9uc1RvKE5hdGl2ZUZ1bmN0aW9ucyBmdW5jdGlvbnMpCisgICAgeworICAgICAgICBmdW5jdGlvbnMuYWRkKG5ldyBGYWN0b3J5KCJmcm9tX2pzb24iKSk7CisgICAgICAgIGZ1bmN0aW9ucy5hZGQobmV3IEZhY3RvcnkoImZyb21qc29uIikpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGV4dGVuZHMgRnVuY3Rpb25GYWN0b3J5CisgICAgeworICAgICAgICBwcml2YXRlIEZhY3RvcnkoU3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKG5hbWUsIEZ1bmN0aW9uUGFyYW1ldGVyLmZpeGVkKENRTDNUeXBlLk5hdGl2ZS5URVhUKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIE5hdGl2ZUZ1bmN0aW9uIGRvR2V0T3JDcmVhdGVGdW5jdGlvbihMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMsIEFic3RyYWN0VHlwZTw/PiByZWNlaXZlclR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyZWNlaXZlclR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oZm9ybWF0KCIlcygpIGNhbm5vdCBiZSB1c2VkIGluIHRoZSBzZWxlY3Rpb24gY2xhdXNlIG9mIGEgU0VMRUNUIHN0YXRlbWVudCIsIG5hbWUubmFtZSkpOworCisgICAgICAgICAgICByZXR1cm4gRnJvbUpzb25GY3QuZ2V0SW5zdGFuY2UobmFtZSwgcmVjZWl2ZXJUeXBlKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0Z1bmN0aW9uQ2FsbC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvRnVuY3Rpb25DYWxsLmphdmEKaW5kZXggNGZiMWJhMy4uMzM2OTY1NyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvRnVuY3Rpb25DYWxsLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvRnVuY3Rpb25DYWxsLmphdmEKQEAgLTEwNywxNCArMTA3LDE0IEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgaWYgKGZ1bi5yZXR1cm5UeXBlKCkuaXNDb2xsZWN0aW9uKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoKChDb2xsZWN0aW9uVHlwZSkgZnVuLnJldHVyblR5cGUoKSkua2luZCkKKyAgICAgICAgICAgIHN3aXRjaCAoKChDb2xsZWN0aW9uVHlwZTw/PikgZnVuLnJldHVyblR5cGUoKSkua2luZCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBjYXNlIExJU1Q6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBMaXN0cy5WYWx1ZS5mcm9tU2VyaWFsaXplZChyZXN1bHQsIChMaXN0VHlwZSkgZnVuLnJldHVyblR5cGUoKSwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBMaXN0cy5WYWx1ZS5mcm9tU2VyaWFsaXplZChyZXN1bHQsIChMaXN0VHlwZTw/PikgZnVuLnJldHVyblR5cGUoKSk7CiAgICAgICAgICAgICAgICAgY2FzZSBTRVQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTZXRzLlZhbHVlLmZyb21TZXJpYWxpemVkKHJlc3VsdCwgKFNldFR5cGUpIGZ1bi5yZXR1cm5UeXBlKCksIHZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2V0cy5WYWx1ZS5mcm9tU2VyaWFsaXplZChyZXN1bHQsIChTZXRUeXBlPD8+KSBmdW4ucmV0dXJuVHlwZSgpKTsKICAgICAgICAgICAgICAgICBjYXNlIE1BUDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hcHMuVmFsdWUuZnJvbVNlcmlhbGl6ZWQocmVzdWx0LCAoTWFwVHlwZSkgZnVuLnJldHVyblR5cGUoKSwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXBzLlZhbHVlLmZyb21TZXJpYWxpemVkKHJlc3VsdCwgKE1hcFR5cGU8PywgPz4pIGZ1bi5yZXR1cm5UeXBlKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKGZ1bi5yZXR1cm5UeXBlKCkuaXNVRFQoKSkKQEAgLTEyNyw3ICsxMjcsNyBAQAogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSYXcgZXh0ZW5kcyBUZXJtLlJhdwogICAgIHsKLSAgICAgICAgcHJpdmF0ZSBGdW5jdGlvbk5hbWUgbmFtZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBGdW5jdGlvbk5hbWUgbmFtZTsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFRlcm0uUmF3PiB0ZXJtczsKIAogICAgICAgICBwdWJsaWMgUmF3KEZ1bmN0aW9uTmFtZSBuYW1lLCBMaXN0PFRlcm0uUmF3PiB0ZXJtcykKQEAgLTIwMiwxMCArMjAyLDExIEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgRnVuY3Rpb24gZnVuID0gRnVuY3Rpb25SZXNvbHZlci5nZXQoa2V5c3BhY2UsIG5hbWUsIHRlcm1zLCByZWNlaXZlci5rc05hbWUsIHJlY2VpdmVyLmNmTmFtZSwgcmVjZWl2ZXIudHlwZSk7CiAKLSAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIGZyb21Kc29uKCkgY2FuIHJldHVybiB3aGF0ZXZlciB0eXBlIHRoZSByZWNlaXZlciBpcywgd2UnbGwgYWx3YXlzIGdldCBFWEFDVF9NQVRDSC4gIFRvCi0gICAgICAgICAgICAgICAgLy8gaGFuZGxlIHBvdGVudGlhbGx5IGFtYmlndW91cyBmdW5jdGlvbiBjYWxscyB3aXRoIGZyb21Kc29uKCkgYXMgYW4gYXJndW1lbnQsIGFsd2F5cyByZXR1cm4KLSAgICAgICAgICAgICAgICAvLyBXRUFLTFlfQVNTSUdOQUJMRSB0byBmb3JjZSB0aGUgdXNlciB0byB0eXBlY2FzdCBpZiBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICBpZiAoZnVuICE9IG51bGwgJiYgZnVuLm5hbWUoKS5lcXVhbHMoRnJvbUpzb25GY3QuTkFNRSkpCisgICAgICAgICAgICAgICAgLy8gQmVjYXVzZSB0aGUgcmV0dXJuIHR5cGUgb2YgZnVuY3Rpb25zIGJ1aWx0IGJ5IGZhY3RvcmllcyBpcyBub3QgZml4ZWQgYnV0IGRlcGVuZGluZyBvbiB0aGUgdHlwZXMgb2YKKyAgICAgICAgICAgICAgICAvLyB0aGVpciBhcmd1bWVudHMsIHdlJ2xsIGFsd2F5cyBnZXQgRVhBQ1RfTUFUQ0guICBUbyBoYW5kbGUgcG90ZW50aWFsbHkgYW1iaWd1b3VzIGZ1bmN0aW9uIGNhbGxzIHdpdGgKKyAgICAgICAgICAgICAgICAvLyBkeW5hbWljYWxseSBidWlsdCBmdW5jdGlvbnMgYXMgYW4gYXJndW1lbnQsIGFsd2F5cyByZXR1cm4gV0VBS0xZX0FTU0lHTkFCTEUgdG8gZm9yY2UgdGhlIHVzZXIgdG8KKyAgICAgICAgICAgICAgICAvLyB0eXBlY2FzdCBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgICAgICBpZiAoZnVuICE9IG51bGwgJiYgTmF0aXZlRnVuY3Rpb25zLmluc3RhbmNlLmhhc0ZhY3RvcnkoZnVuLm5hbWUoKSkpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXN0UmVzdWx0LldFQUtMWV9BU1NJR05BQkxFOwogCiAgICAgICAgICAgICAgICAgaWYgKGZ1biAhPSBudWxsICYmIHJlY2VpdmVyLnR5cGUudWRmVHlwZSgpLmVxdWFscyhmdW4ucmV0dXJuVHlwZSgpKSkKQEAgLTIyMSwxNCArMjIyLDE4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRFeGFjdFR5cGVJZktub3duKFN0cmluZyBrZXlzcGFjZSkKICAgICAgICAgewotICAgICAgICAgICAgLy8gV2UgY291bGQgaW1wbGVtZW50IHRoaXMsIGJ1dCB0aGUgbWV0aG9kIGlzIG9ubHkgdXNlZCBpbiBzZWxlY3Rpb24gY2xhdXNlLCB3aGVyZSBGdW5jdGlvbkNhbGwgaXMgbm90IHVzZWQgCi0gICAgICAgICAgICAvLyB3ZSB1c2UgYSBTZWxlY3RhYmxlLldpdGhGdW5jdGlvbiBpbnN0ZWFkKS4gQW5kIGlmIHRoYXQgbWV0aG9kIGlzIGxhdGVyIHVzZWQgaW4gb3RoZXIgcGxhY2VzLCBiZXR0ZXIgdG8KLSAgICAgICAgICAgIC8vIGxldCB0aGF0IGZ1dHVyZSBwYXRjaCBtYWtlIHN1cmUgdGhpcyBjYW4gYmUgaW1wbGVtZW50ZWQgcHJvcGVybHkgKG5vdGUgaW4gcGFydGljdWxhciB3ZSBkb24ndCBoYXZlIGFjY2VzcwotICAgICAgICAgICAgLy8gdG8gdGhlIHJlY2VpdmVyIHR5cGUsIHdoaWNoIEZ1bmN0aW9uUmVzb2x2ZXIuZ2V0KCkgdGFrZXMpIHJhdGhlciB0aGFuIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gdGhhdCBtYXkKLSAgICAgICAgICAgIC8vIG5vdCB3b3JrIGluIGFsbCBjYXNlcy4KLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRnVuY3Rpb24gZnVuID0gRnVuY3Rpb25SZXNvbHZlci5nZXQoa2V5c3BhY2UsIG5hbWUsIHRlcm1zLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZnVuID09IG51bGwgPyBudWxsIDogZnVuLnJldHVyblR5cGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0Z1bmN0aW9uRmFjdG9yeS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvRnVuY3Rpb25GYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJkYjlmZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0Z1bmN0aW9uRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkFzc2lnbm1lbnRUZXN0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHM7CisKKy8qKgorICogQ2xhc3MgZm9yIGR5bmFtaWNhbGx5IGJ1aWxkaW5nIGRpZmZlcmVudCBvdmVybG9hZHMgb2YgYSBDUUwge0BsaW5rIEZ1bmN0aW9ufSBhY2NvcmRpbmcgdG8gc3BlY2lmaWMgZnVuY3Rpb24gY2FsbHMuCisgKiA8cD4KKyAqIEZvciBleGFtcGxlLCB0aGUgZmFjdG9yeSBmb3IgdGhlIHtAY29kZSBtYXh9IGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEge0Bjb2RlICh0ZXh0KSAtPiB0ZXh0fSBmdW5jdGlvbiBpZiBpdCdzIGNhbGxlZAorICogd2l0aCBhbiB7QGNvZGUgdGV4dH0gYXJndW1lbnQsIGxpa2UgaW4ge0Bjb2RlIG1heCgnYWJjJyl9LiBJdCBob3dldmVyIHdpbGwgcmV0dXJuIGEge0Bjb2RlIChsaXN0PGludD4pIC0+IGxpc3Q8aW50Pn0KKyAqIGZ1bmN0aW9uIGlmIGl0J3MgY2FsbGVkIHdpdGgge0Bjb2RlIG1heChbMSwyLDNdKX0sIGV0Yy4KKyAqIDxwPgorICogVGhpcyBpcyBtZWFudCB0byBiZSB1c2VkIHRvIGNyZWF0ZSBmdW5jdGlvbnMgdGhhdCByZXF1aXJlIHRvbyBtYW55IG92ZXJsb2FkcyB0byBoYXZlIHRoZW0gcHJlLWNyZWF0ZWQgaW4gbWVtb3J5LiBOb3RlCisgKiB0aGF0IGluIHRoZSBjYXNlIG9mIGZ1bmN0aW9ucyBhY2NlcHRpbmcgY29sbGVjdGlvbnMsIHR1cGxlcyBvciBVRFRzIHRoZSBudW1iZXIgb2Ygb3ZlcmxvYWRzIGlzIHBvdGVudGlhbGx5IGluZmluaXRlLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRnVuY3Rpb25GYWN0b3J5Cit7CisgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBidWlsdCBmdW5jdGlvbnMuICovCisgICAgcHJvdGVjdGVkIGZpbmFsIEZ1bmN0aW9uTmFtZSBuYW1lOworCisgICAgLyoqIFRoZSBhY2NlcHRlZCBwYXJhbWV0ZXJzLiAqLworICAgIHByb3RlY3RlZCBmaW5hbCBMaXN0PEZ1bmN0aW9uUGFyYW1ldGVyPiBwYXJhbWV0ZXJzOworCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbnVtUGFyYW1ldGVyczsKKyAgICBwcml2YXRlIGZpbmFsIGludCBudW1NYW5kYXRvcnlQYXJhbWV0ZXJzOworCisgICAgLyoqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGJ1aWx0IGZ1bmN0aW9ucworICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIHRoZSBhY2NlcHRlZCBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcHVibGljIEZ1bmN0aW9uRmFjdG9yeShTdHJpbmcgbmFtZSwgRnVuY3Rpb25QYXJhbWV0ZXIuLi4gcGFyYW1ldGVycykKKyAgICB7CisgICAgICAgIHRoaXMubmFtZSA9IEZ1bmN0aW9uTmFtZS5uYXRpdmVGdW5jdGlvbihuYW1lKTsKKyAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gQXJyYXlzLmFzTGlzdChwYXJhbWV0ZXJzKTsKKyAgICAgICAgdGhpcy5udW1QYXJhbWV0ZXJzID0gcGFyYW1ldGVycy5sZW5ndGg7CisgICAgICAgIHRoaXMubnVtTWFuZGF0b3J5UGFyYW1ldGVycyA9IChpbnQpIHRoaXMucGFyYW1ldGVycy5zdHJlYW0oKS5maWx0ZXIocCAtPiAhcC5pc09wdGlvbmFsKCkpLmNvdW50KCk7CisgICAgfQorCisgICAgcHVibGljIEZ1bmN0aW9uTmFtZSBuYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBmdW5jdGlvbiB3aXRoIGEgc2lnbmF0dXJlIGNvbXBhdGlibGUgd2l0aCB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGNhbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJncyB0aGUgYXJndW1lbnRzIGluIHRoZSBmdW5jdGlvbiBjYWxsIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gaXMgZ29pbmcgdG8gYmUgYnVpbHQKKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXJUeXBlIHRoZSBleHBlY3RlZCByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24gY2FsbCBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGdvaW5nIHRvIGJlIGJ1aWx0CisgICAgICogQHBhcmFtIHJlY2VpdmVyS2V5c3BhY2UgdGhlIG5hbWUgb2YgdGhlIHJlY2V2aWVyIGtleXNwYWNlCisgICAgICogQHBhcmFtIHJlY2VpdmVyVGFibGUgdGhlIG5hbWUgb2YgdGhlIHJlY2V2aWVyIHRhYmxlCisgICAgICogQHJldHVybiBhIGZ1bmN0aW9uIHdpdGggYSBzaWduYXR1cmUgY29tcGF0aWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gY2FsbCwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBmYWN0b3J5CisgICAgICogY2Fubm90IGNyZWF0ZSBhIGZ1bmN0aW9uIGZvciB0aGUgc3VwcGxpZWQgYXJndW1lbnRzIGJ1dCB0aGVyZSBtaWdodCBiZSBhbm90aGVyIGZhY3Rvcnkgd2l0aCB0aGUgc2FtZQorICAgICAqIHtAbGluayAjbmFtZSgpfSBhYmxlIHRvIGRvIGl0LgorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBOYXRpdmVGdW5jdGlvbiBnZXRPckNyZWF0ZUZ1bmN0aW9uKExpc3Q8PyBleHRlbmRzIEFzc2lnbm1lbnRUZXN0YWJsZT4gYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWNlaXZlcktleXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWNlaXZlclRhYmxlKQorICAgIHsKKyAgICAgICAgLy8gdmFsaWRhdGUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMKKyAgICAgICAgaW50IG51bUFyZ3MgPSBhcmdzLnNpemUoKTsKKyAgICAgICAgaWYgKG51bUFyZ3MgPCBudW1NYW5kYXRvcnlQYXJhbWV0ZXJzIHx8IG51bUFyZ3MgPiBudW1QYXJhbWV0ZXJzKQorICAgICAgICAgICAgdGhyb3cgaW52YWxpZE51bWJlck9mQXJndW1lbnRzRXhjZXB0aW9uKCk7CisKKyAgICAgICAgLy8gdHJ5IHRvIGluZmVyIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzCisgICAgICAgIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8PihhcmdzLnNpemUoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgQXNzaWdubWVudFRlc3RhYmxlIGFyZyA9IGFyZ3MuZ2V0KGkpOworICAgICAgICAgICAgRnVuY3Rpb25QYXJhbWV0ZXIgcGFyYW1ldGVyID0gcGFyYW1ldGVycy5nZXQoaSk7CisgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdHlwZSA9IHBhcmFtZXRlci5pbmZlclR5cGUoU2NoZW1hQ29uc3RhbnRzLlNZU1RFTV9LRVlTUEFDRV9OQU1FLCBhcmcsIHJlY2VpdmVyVHlwZSwgdHlwZXMpOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiQ2Fubm90IGluZmVyIHR5cGUgb2YgYXJndW1lbnQgJXMgaW4gY2FsbCB0byAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnVuY3Rpb24gJXM6IHVzZSB0eXBlIGNhc3RzIHRvIGRpc2FtYmlndWF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCB0aGlzKSk7CisgICAgICAgICAgICBwYXJhbWV0ZXIudmFsaWRhdGVUeXBlKG5hbWUsIGFyZywgdHlwZSk7CisgICAgICAgICAgICB0eXBlID0gdHlwZS51ZGZUeXBlKCk7CisgICAgICAgICAgICB0eXBlcy5hZGQodHlwZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZG9HZXRPckNyZWF0ZUZ1bmN0aW9uKHR5cGVzLCByZWNlaXZlclR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHNFeGNlcHRpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbigiSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBmdW5jdGlvbiAiICsgdGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGZ1bmN0aW9uIGNvbXBhdGlibGUgd2l0aCB0aGUgc3BlY2lmaWVkIHNpZ25hdHVyZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmdUeXBlcyB0aGUgdHlwZXMgb2YgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cworICAgICAqIEBwYXJhbSByZWNlaXZlclR5cGUgdGhlIGV4cGVjdGVkIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbgorICAgICAqIEByZXR1cm4gYSBmdW5jdGlvbiBjb21wYXRpYmxlIHdpdGggdGhlIHNwZWNpZmllZCBzaWduYXR1cmUsIG9yIHtAY29kZSBudWxsfSBpZiB0aGlzIGNhbm5vdCBjcmVhdGUgYSBmdW5jdGlvbiBmb3IKKyAgICAgKiB0aGUgc3VwcGxpZWQgYXJndW1lbnRzIGJ1dCB0aGVyZSBtaWdodCBiZSBhbm90aGVyIGZhY3Rvcnkgd2l0aCB0aGUgc2FtZSB7QGxpbmsgI25hbWUoKX0gYWJsZSB0byBkbyBpdC4KKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTmF0aXZlRnVuY3Rpb24gZG9HZXRPckNyZWF0ZUZ1bmN0aW9uKExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBhcmdUeXBlcywgQWJzdHJhY3RUeXBlPD8+IHJlY2VpdmVyVHlwZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlcyglcykiLCBuYW1lLCBwYXJhbWV0ZXJzLnN0cmVhbSgpLm1hcChPYmplY3Q6OnRvU3RyaW5nKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0Z1bmN0aW9uUGFyYW1ldGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9GdW5jdGlvblBhcmFtZXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4M2IwZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9GdW5jdGlvblBhcmFtZXRlci5qYXZhCkBAIC0wLDAgKzEsMzM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQXNzaWdubWVudFRlc3RhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Db2xsZWN0aW9uVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkxpc3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTWFwVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLk51bWJlclR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5TZXRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQXNzaWdubWVudFRlc3RhYmxlLlRlc3RSZXN1bHQuTk9UX0FTU0lHTkFCTEU7CisKKy8qKgorICogR2VuZXJpYywgbG9vc2UgZGVmaW5pdGlvbiBvZiBhIGZ1bmN0aW9uIHBhcmFtZXRlciwgYWJsZSB0byBpbmZlciB0aGUgc3BlY2lmaWMgZGF0YSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgaW4gdGhlCisgKiBmdW5jdGlvbiBzcGVjaWZpY2FsbHkgYnVpbHQgYnkgYSB7QGxpbmsgRnVuY3Rpb25GYWN0b3J5fSBmb3IgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uIGNhbGwuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRnVuY3Rpb25QYXJhbWV0ZXIKK3sKKyAgICAvKioKKyAgICAgKiBUcmllcyB0byBpbmZlciB0aGUgZGF0YSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgZm9yIGFuIGFyZ3VtZW50IGluIGEgY2FsbCB0byB0aGUgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5c3BhY2UgdGhlIGN1cnJlbnQga2V5c3BhY2UKKyAgICAgKiBAcGFyYW0gYXJnIGEgcGFyYW1ldGVyIHZhbHVlIGluIGEgc3BlY2lmaWMgZnVuY3Rpb24gY2FsbAorICAgICAqIEBwYXJhbSByZWNlaXZlclR5cGUgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisgICAgICogQHJldHVybiB0aGUgaW5mZXJyZWQgZGF0YSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIsIG9yIHtAbGluayBudWxsfSBpdCBpc24ndCBwb3NzaWJsZSB0byBpbmZlciBpdAorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIGRlZmF1bHQgQWJzdHJhY3RUeXBlPD8+IGluZmVyVHlwZShTdHJpbmcga2V5c3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2lnbm1lbnRUZXN0YWJsZSBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gcHJldmlvdXNUeXBlcykKKyAgICB7CisgICAgICAgIHJldHVybiBhcmcuZ2V0Q29tcGF0aWJsZVR5cGVJZktub3duKGtleXNwYWNlKTsKKyAgICB9CisKKyAgICB2b2lkIHZhbGlkYXRlVHlwZShGdW5jdGlvbk5hbWUgbmFtZSwgQXNzaWdubWVudFRlc3RhYmxlIGFyZywgQWJzdHJhY3RUeXBlPD8+IGFyZ1R5cGUpOworCisgICAgLyoqCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgcGFyYW1ldGVyIGlzIG9wdGlvbmFsCisgICAgICovCisgICAgZGVmYXVsdCBib29sZWFuIGlzT3B0aW9uYWwoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB3cmFwcGVkIHRoZSB3cmFwcGVkIHBhcmFtZXRlcgorICAgICAqIEByZXR1cm4gYSBmdW5jdGlvbiBwYXJhbWV0ZXIgZGVmaW5pdGlvbiB0aGF0IGFjY2VwdHMgdGhlIHNwZWNpZmllZCB3cmFwcGVkIHBhcmFtZXRlciwgY29uc2lkZXJpbmcgaXQgb3B0aW9uYWwgYXMKKyAgICAgKiBkZWZpbmVkIGJ5IHtAbGluayAjaXNPcHRpb25hbCgpfS4KKyAgICAgKi8KKyAgICBzdGF0aWMgRnVuY3Rpb25QYXJhbWV0ZXIgb3B0aW9uYWwoRnVuY3Rpb25QYXJhbWV0ZXIgd3JhcHBlZCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25QYXJhbWV0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBATnVsbGFibGUKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBpbmZlclR5cGUoU3RyaW5nIGtleXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzaWdubWVudFRlc3RhYmxlIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IHByZXZpb3VzVHlwZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuaW5mZXJUeXBlKGtleXNwYWNlLCBhcmcsIHJlY2VpdmVyVHlwZSwgcHJldmlvdXNUeXBlcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVUeXBlKEZ1bmN0aW9uTmFtZSBuYW1lLCBBc3NpZ25tZW50VGVzdGFibGUgYXJnLCBBYnN0cmFjdFR5cGU8Pz4gYXJnVHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cmFwcGVkLnZhbGlkYXRlVHlwZShuYW1lLCBhcmcsIGFyZ1R5cGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAnWycgKyB3cmFwcGVkLnRvU3RyaW5nKCkgKyAnXSc7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhIGZ1bmN0aW9uIHBhcmFtZXRlciBkZWZpbml0aW9uIHRoYXQgYWNjZXB0cyB2YWx1ZXMgb2Ygc3RyaW5nLWJhc2VkIGRhdGEgdHlwZXMgKHRleHQsIHZhcmNoYXIgYW5kIGFzY2lpKQorICAgICAqLworICAgIHN0YXRpYyBGdW5jdGlvblBhcmFtZXRlciBzdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZpeGVkKENRTDNUeXBlLk5hdGl2ZS5URVhULCBDUUwzVHlwZS5OYXRpdmUuVkFSQ0hBUiwgQ1FMM1R5cGUuTmF0aXZlLkFTQ0lJKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdHlwZXMgdGhlIGFjY2VwdGVkIGRhdGEgdHlwZXMKKyAgICAgKiBAcmV0dXJuIGEgZnVuY3Rpb24gcGFyYW1ldGVyIGRlZmluaXRpb24gdGhhdCBhY2NlcHRzIHZhbHVlcyBvZiBhIHNwZWNpZmljIGRhdGEgdHlwZQorICAgICAqLworICAgIHN0YXRpYyBGdW5jdGlvblBhcmFtZXRlciBmaXhlZChDUUwzVHlwZS4uLiB0eXBlcykKKyAgICB7CisgICAgICAgIGFzc2VydCB0eXBlcy5sZW5ndGggPiAwOworCisgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25QYXJhbWV0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gaW5mZXJUeXBlKFN0cmluZyBrZXlzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2lnbm1lbnRUZXN0YWJsZSBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgQWJzdHJhY3RUeXBlPD8+IHJlY2VpdmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBwcmV2aW91c1R5cGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiBpbmZlcnJlZCA9IGFyZy5nZXRDb21wYXRpYmxlVHlwZUlmS25vd24oa2V5c3BhY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBpbmZlcnJlZCAhPSBudWxsID8gaW5mZXJyZWQgOiB0eXBlc1swXS5nZXRUeXBlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVUeXBlKEZ1bmN0aW9uTmFtZSBuYW1lLCBBc3NpZ25tZW50VGVzdGFibGUgYXJnLCBBYnN0cmFjdFR5cGU8Pz4gYXJnVHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoQXJyYXlzLnN0cmVhbSh0eXBlcykuYWxsTWF0Y2godCAtPiBhcmdUeXBlLnRlc3RBc3NpZ25tZW50KHQuZ2V0VHlwZSgpKSA9PSBOT1RfQVNTSUdOQUJMRSkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbihmb3JtYXQoIkZ1bmN0aW9uICVzIHJlcXVpcmVzIGFuIGFyZ3VtZW50IG9mIHR5cGUgJXMsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgZm91bmQgYXJndW1lbnQgJXMgb2YgdHlwZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdGhpcywgYXJnLCBhcmdUeXBlLmFzQ1FMM1R5cGUoKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0eXBlcy5sZW5ndGggPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVzWzBdLnRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gJ1snICsgQXJyYXlzLnN0cmVhbSh0eXBlcykubWFwKE9iamVjdDo6dG9TdHJpbmcpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCJ8IikpICsgJ10nOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBpbmZlckZyb21SZWNlaXZlciB3aGV0aGVyIHRoZSBwYXJhbWV0ZXIgc2hvdWxkIHRyeSB0byB1c2UgdGhlIGZ1bmN0aW9uIHJlY2VpdmVyIHRvIGluZmVyIGl0cyBkYXRhIHR5cGUKKyAgICAgKiBAcmV0dXJuIGEgZnVuY3Rpb24gcGFyYW1ldGVyIGRlZmluaXRpb24gdGhhdCBhY2NlcHRzIGNvbHVtbnMgb2YgYW55IGRhdGEgdHlwZQorICAgICAqLworICAgIHN0YXRpYyBGdW5jdGlvblBhcmFtZXRlciBhbnlUeXBlKGJvb2xlYW4gaW5mZXJGcm9tUmVjZWl2ZXIpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uUGFyYW1ldGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGluZmVyVHlwZShTdHJpbmcga2V5c3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3NpZ25tZW50VGVzdGFibGUgYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE51bGxhYmxlIEFic3RyYWN0VHlwZTw/PiByZWNlaXZlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gcHJldmlvdXNUeXBlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdHlwZSA9IGFyZy5nZXRDb21wYXRpYmxlVHlwZUlmS25vd24oa2V5c3BhY2UpOworICAgICAgICAgICAgICAgIHJldHVybiB0eXBlID09IG51bGwgJiYgaW5mZXJGcm9tUmVjZWl2ZXIgPyByZWNlaXZlclR5cGUgOiB0eXBlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlVHlwZShGdW5jdGlvbk5hbWUgbmFtZSwgQXNzaWdubWVudFRlc3RhYmxlIGFyZywgQWJzdHJhY3RUeXBlPD8+IGFyZ1R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlLCBhbGwgdHlwZXMgYXJlIGFjY2VwdGVkCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJhbnkiOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSBmdW5jdGlvbiBwYXJhbWV0ZXIgZGVmaW5pdGlvbiB0aGF0IGFjY2VwdHMgdmFsdWVzIHdpdGggdGhlIHNhbWUgdHlwZSBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyCisgICAgICovCisgICAgc3RhdGljIEZ1bmN0aW9uUGFyYW1ldGVyIHNhbWVBc0ZpcnN0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25QYXJhbWV0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gaW5mZXJUeXBlKFN0cmluZyBrZXlzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2lnbm1lbnRUZXN0YWJsZSBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgQWJzdHJhY3RUeXBlPD8+IHJlY2VpdmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBwcmV2aW91c1R5cGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1R5cGVzLmdldCgwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZVR5cGUoRnVuY3Rpb25OYW1lIG5hbWUsIEFzc2lnbm1lbnRUZXN0YWJsZSBhcmcsIEFic3RyYWN0VHlwZTw/PiBhcmdUeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZSwgYWxsIHR5cGVzIGFyZSBhY2NlcHRlZAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAic2FtZSI7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhIGZ1bmN0aW9uIHBhcmFtZXRlciBkZWZpbml0aW9uIHRoYXQgYWNjZXB0cyB2YWx1ZXMgb2YgdHlwZSB7QGxpbmsgQ29sbGVjdGlvblR5cGV9LCBpbmRlcGVuZGVudGx5IG9mIHRoZQorICAgICAqIHR5cGVzIG9mIGl0cyBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBzdGF0aWMgRnVuY3Rpb25QYXJhbWV0ZXIgYW55Q29sbGVjdGlvbigpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uUGFyYW1ldGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZVR5cGUoRnVuY3Rpb25OYW1lIG5hbWUsIEFzc2lnbm1lbnRUZXN0YWJsZSBhcmcsIEFic3RyYWN0VHlwZTw/PiBhcmdUeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYXJnVHlwZS5pc0NvbGxlY3Rpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKGZvcm1hdCgiRnVuY3Rpb24gJXMgcmVxdWlyZXMgYSBjb2xsZWN0aW9uIGFyZ3VtZW50LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGZvdW5kIGFyZ3VtZW50ICVzIG9mIHR5cGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGFyZywgYXJnVHlwZS5hc0NRTDNUeXBlKCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gImNvbGxlY3Rpb24iOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSBmdW5jdGlvbiBwYXJhbWV0ZXIgZGVmaW5pdGlvbiB0aGF0IGFjY2VwdHMgdmFsdWVzIG9mIHR5cGUge0BsaW5rIFNldFR5cGV9IG9yIHtAbGluayBMaXN0VHlwZX0uCisgICAgICovCisgICAgc3RhdGljIEZ1bmN0aW9uUGFyYW1ldGVyIHNldE9yTGlzdCgpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uUGFyYW1ldGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZVR5cGUoRnVuY3Rpb25OYW1lIG5hbWUsIEFzc2lnbm1lbnRUZXN0YWJsZSBhcmcsIEFic3RyYWN0VHlwZTw/PiBhcmdUeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhcmdUeXBlLmlzQ29sbGVjdGlvbigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvblR5cGUuS2luZCBraW5kID0gKChDb2xsZWN0aW9uVHlwZTw/PikgYXJnVHlwZSkua2luZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPT0gQ29sbGVjdGlvblR5cGUuS2luZC5TRVQgfHwga2luZCA9PSBDb2xsZWN0aW9uVHlwZS5LaW5kLkxJU1QpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKGZvcm1hdCgiRnVuY3Rpb24gJXMgcmVxdWlyZXMgYSBzZXQgb3IgbGlzdCBhcmd1bWVudCwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGZvdW5kIGFyZ3VtZW50ICVzIG9mIHR5cGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgYXJnLCBhcmdUeXBlLmFzQ1FMM1R5cGUoKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAibnVtZXJpY19zZXRfb3JfbGlzdCI7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhIGZ1bmN0aW9uIHBhcmFtZXRlciBkZWZpbml0aW9uIHRoYXQgYWNjZXB0cyB2YWx1ZXMgb2YgdHlwZSB7QGxpbmsgU2V0VHlwZX0gb3Ige0BsaW5rIExpc3RUeXBlfSwKKyAgICAgKiBwcm92aWRlZCB0aGF0IGl0cyBlbGVtZW50cyBhcmUgbnVtZXJpYy4KKyAgICAgKi8KKyAgICBzdGF0aWMgRnVuY3Rpb25QYXJhbWV0ZXIgbnVtZXJpY1NldE9yTGlzdCgpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uUGFyYW1ldGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZVR5cGUoRnVuY3Rpb25OYW1lIG5hbWUsIEFzc2lnbm1lbnRUZXN0YWJsZSBhcmcsIEFic3RyYWN0VHlwZTw/PiBhcmdUeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiBlbGVtZW50VHlwZSA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKGFyZ1R5cGUuaXNDb2xsZWN0aW9uKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uVHlwZTw/PiBjb2xsZWN0aW9uVHlwZSA9IChDb2xsZWN0aW9uVHlwZTw/PikgYXJnVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb25UeXBlLmtpbmQgPT0gQ29sbGVjdGlvblR5cGUuS2luZC5TRVQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlID0gKChTZXRUeXBlPD8+KSBhcmdUeXBlKS5nZXRFbGVtZW50c1R5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2xsZWN0aW9uVHlwZS5raW5kID09IENvbGxlY3Rpb25UeXBlLktpbmQuTElTVCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFR5cGUgPSAoKExpc3RUeXBlPD8+KSBhcmdUeXBlKS5nZXRFbGVtZW50c1R5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghKGVsZW1lbnRUeXBlIGluc3RhbmNlb2YgTnVtYmVyVHlwZSkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbihmb3JtYXQoIkZ1bmN0aW9uICVzIHJlcXVpcmVzIGEgbnVtZXJpYyBzZXQvbGlzdCBhcmd1bWVudCwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBmb3VuZCBhcmd1bWVudCAlcyBvZiB0eXBlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBhcmcsIGFyZ1R5cGUuYXNDUUwzVHlwZSgpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJudW1lcmljX3NldF9vcl9saXN0IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGEgZnVuY3Rpb24gcGFyYW1ldGVyIGRlZmluaXRpb24gdGhhdCBhY2NlcHRzIHZhbHVlcyBvZiB0eXBlIHtAbGluayBNYXBUeXBlfSwgaW5kZXBlbmRlbnRseSBvZiB0aGUgdHlwZXMKKyAgICAgKiBvZiB0aGUgbWFwIGtleXMgYW5kIHZhbHVlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgRnVuY3Rpb25QYXJhbWV0ZXIgYW55TWFwKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25QYXJhbWV0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlVHlwZShGdW5jdGlvbk5hbWUgbmFtZSwgQXNzaWdubWVudFRlc3RhYmxlIGFyZywgQWJzdHJhY3RUeXBlPD8+IGFyZ1R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFhcmdUeXBlLmlzVURUKCkgJiYgIShhcmdUeXBlIGluc3RhbmNlb2YgTWFwVHlwZSkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbihmb3JtYXQoIkZ1bmN0aW9uICVzIHJlcXVpcmVzIGEgbWFwIGFyZ3VtZW50LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGZvdW5kIGFyZ3VtZW50ICVzIG9mIHR5cGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGFyZywgYXJnVHlwZS5hc0NRTDNUeXBlKCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIm1hcCI7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvRnVuY3Rpb25SZXNvbHZlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvRnVuY3Rpb25SZXNvbHZlci5qYXZhCmluZGV4IDc3MTdiZGIuLjgxZTk3YTcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0Z1bmN0aW9uUmVzb2x2ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9GdW5jdGlvblJlc29sdmVyLmphdmEKQEAgLTIwLDYgKzIwLDEwIEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5BYnN0cmFjdE1hcmtlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkFzc2lnbm1lbnRUZXN0YWJsZTsKQEAgLTI4LDYgKzMyLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlVzZXJGdW5jdGlvbnM7CiAKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLmpvaW5pbmc7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc3RhdGVtZW50cy5SZXF1ZXN0VmFsaWRhdGlvbnMuaW52YWxpZFJlcXVlc3Q7CkBAIC0zOCwxNSArNDMsMTAgQEAKICAgICB7CiAgICAgfQogCi0gICAgLy8gV2Ugc3BlY2lhbCBjYXNlIHRoZSB0b2tlbiBmdW5jdGlvbiBiZWNhdXNlIHRoYXQncyB0aGUgb25seSBmdW5jdGlvbiB3aG9zZSBhcmd1bWVudCB0eXBlcyBhY3R1YWxseQotICAgIC8vIGRlcGVuZCBvbiB0aGUgdGFibGUgb24gd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4gQmVjYXVzZSBpdCdzIHRoZSBzb2xlIGV4Y2VwdGlvbiwgaXQncyBlYXNpZXIKLSAgICAvLyB0byBoYW5kbGUgaXQgYXMgYSBzcGVjaWFsIGNhc2UuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRnVuY3Rpb25OYW1lIFRPS0VOX0ZVTkNUSU9OX05BTUUgPSBGdW5jdGlvbk5hbWUubmF0aXZlRnVuY3Rpb24oInRva2VuIik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbHVtblNwZWNpZmljYXRpb24gbWFrZUFyZ1NwZWMoU3RyaW5nIHJlY2VpdmVyS3MsIFN0cmluZyByZWNlaXZlckNmLCBGdW5jdGlvbiBmdW4sIGludCBpKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sdW1uU3BlY2lmaWNhdGlvbiBtYWtlQXJnU3BlYyhTdHJpbmcgcmVjZWl2ZXJLZXlzcGFjZSwgU3RyaW5nIHJlY2VpdmVyVGFibGUsIEZ1bmN0aW9uIGZ1biwgaW50IGkpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IENvbHVtblNwZWNpZmljYXRpb24ocmVjZWl2ZXJLcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyQ2YsCisgICAgICAgIHJldHVybiBuZXcgQ29sdW1uU3BlY2lmaWNhdGlvbihyZWNlaXZlcktleXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXJUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb2x1bW5JZGVudGlmaWVyKCJhcmciICsgaSArICcoJyArIGZ1bi5uYW1lKCkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpICsgJyknLCB0cnVlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bi5hcmdUeXBlcygpLmdldChpKSk7CiAgICAgfQpAQCAtNTUsMjEgKzU1LDQ1IEBACiAgICAgICogQHBhcmFtIGtleXNwYWNlIHRoZSBjdXJyZW50IGtleXNwYWNlCiAgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uCiAgICAgICogQHBhcmFtIHByb3ZpZGVkQXJncyB0aGUgYXJndW1lbnRzIHByb3ZpZGVkIGZvciB0aGUgZnVuY3Rpb24gY2FsbAotICAgICAqIEBwYXJhbSByZWNlaXZlcktzIHRoZSByZWNlaXZlcidzIGtleXNwYWNlCi0gICAgICogQHBhcmFtIHJlY2VpdmVyQ2YgdGhlIHJlY2VpdmVyJ3MgdGFibGUKKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXJLZXlzcGFjZSB0aGUgcmVjZWl2ZXIncyBrZXlzcGFjZQorICAgICAqIEBwYXJhbSByZWNlaXZlclRhYmxlIHRoZSByZWNlaXZlcidzIHRhYmxlCiAgICAgICogQHBhcmFtIHJlY2VpdmVyVHlwZSBpZiB0aGUgcmVjZWl2ZXIgdHlwZSBpcyBrbm93biAoZHVyaW5nIGluc2VydHMsIGZvciBleGFtcGxlKSwgdGhpcyBzaG91bGQgYmUgdGhlIHR5cGUgb2YKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoZSByZWNlaXZlcgotICAgICAqIEB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KICAgICAgKi8KKyAgICBATnVsbGFibGUKICAgICBwdWJsaWMgc3RhdGljIEZ1bmN0aW9uIGdldChTdHJpbmcga2V5c3BhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25OYW1lIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDw/IGV4dGVuZHMgQXNzaWdubWVudFRlc3RhYmxlPiBwcm92aWRlZEFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlY2VpdmVyS3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlY2VpdmVyQ2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlY2VpdmVyS2V5c3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlY2VpdmVyVGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHJlY2VpdmVyVHlwZSkKICAgICB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIENvbGxlY3Rpb248RnVuY3Rpb24+IGNhbmRpZGF0ZXMgPSBjb2xsZWN0Q2FuZGlkYXRlcyhrZXlzcGFjZSwgbmFtZSwgcmVjZWl2ZXJLcywgcmVjZWl2ZXJDZiwgcmVjZWl2ZXJUeXBlKTsKKyAgICAgICAgcmV0dXJuIGdldChrZXlzcGFjZSwgbmFtZSwgcHJvdmlkZWRBcmdzLCByZWNlaXZlcktleXNwYWNlLCByZWNlaXZlclRhYmxlLCByZWNlaXZlclR5cGUsIFVzZXJGdW5jdGlvbnMubm9uZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ga2V5c3BhY2UgdGhlIGN1cnJlbnQga2V5c3BhY2UKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24KKyAgICAgKiBAcGFyYW0gcHJvdmlkZWRBcmdzIHRoZSBhcmd1bWVudHMgcHJvdmlkZWQgZm9yIHRoZSBmdW5jdGlvbiBjYWxsCisgICAgICogQHBhcmFtIHJlY2VpdmVyS2V5c3BhY2UgdGhlIHJlY2VpdmVyJ3Mga2V5c3BhY2UKKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXJUYWJsZSB0aGUgcmVjZWl2ZXIncyB0YWJsZQorICAgICAqIEBwYXJhbSByZWNlaXZlclR5cGUgaWYgdGhlIHJlY2VpdmVyIHR5cGUgaXMga25vd24gKGR1cmluZyBpbnNlcnRzLCBmb3IgZXhhbXBsZSksIHRoaXMgc2hvdWxkIGJlIHRoZSB0eXBlIG9mCisgICAgICogICAgICAgICAgICAgICAgICAgICB0aGUgcmVjZWl2ZXIKKyAgICAgKiBAcGFyYW0gZnVuY3Rpb25zIGEgc2V0IG9mIHVzZXIgZnVuY3Rpb25zIHRoYXQgaXMgbm90IHlldCBhdmFpbGFibGUgaW4gdGhlIHNjaGVtYSwgdXNlZCBkdXJpbmcgc3RhcnR1cCB3aGVuIHRob3NlCisgICAgICogICAgICAgICAgICAgICAgICBmdW5jdGlvbnMgbWlnaHQgbm90IGJlIHlldCBhdmFpbGFibGUKKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBwdWJsaWMgc3RhdGljIEZ1bmN0aW9uIGdldChTdHJpbmcga2V5c3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25OYW1lIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDw/IGV4dGVuZHMgQXNzaWdubWVudFRlc3RhYmxlPiBwcm92aWRlZEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlY2VpdmVyS2V5c3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlY2VpdmVyVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHJlY2VpdmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRnVuY3Rpb25zIGZ1bmN0aW9ucykKKyAgICB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KKyAgICB7CisgICAgICAgIENvbGxlY3Rpb248RnVuY3Rpb24+IGNhbmRpZGF0ZXMgPSBjb2xsZWN0Q2FuZGlkYXRlcyhrZXlzcGFjZSwgbmFtZSwgcmVjZWl2ZXJLZXlzcGFjZSwgcmVjZWl2ZXJUYWJsZSwgcHJvdmlkZWRBcmdzLCByZWNlaXZlclR5cGUsIGZ1bmN0aW9ucyk7CiAKICAgICAgICAgaWYgKGNhbmRpZGF0ZXMuaXNFbXB0eSgpKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC03OCw1MCArMTAyLDQ4IEBACiAgICAgICAgIGlmIChjYW5kaWRhdGVzLnNpemUoKSA9PSAxKQogICAgICAgICB7CiAgICAgICAgICAgICBGdW5jdGlvbiBmdW4gPSBjYW5kaWRhdGVzLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICAgICAgdmFsaWRhdGVUeXBlcyhrZXlzcGFjZSwgZnVuLCBwcm92aWRlZEFyZ3MsIHJlY2VpdmVyS3MsIHJlY2VpdmVyQ2YpOworICAgICAgICAgICAgdmFsaWRhdGVUeXBlcyhrZXlzcGFjZSwgZnVuLCBwcm92aWRlZEFyZ3MsIHJlY2VpdmVyS2V5c3BhY2UsIHJlY2VpdmVyVGFibGUpOwogICAgICAgICAgICAgcmV0dXJuIGZ1bjsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBwaWNrQmVzdE1hdGNoKGtleXNwYWNlLCBuYW1lLCBwcm92aWRlZEFyZ3MsIHJlY2VpdmVyS3MsIHJlY2VpdmVyQ2YsIHJlY2VpdmVyVHlwZSwgY2FuZGlkYXRlcyk7CisgICAgICAgIHJldHVybiBwaWNrQmVzdE1hdGNoKGtleXNwYWNlLCBuYW1lLCBwcm92aWRlZEFyZ3MsIHJlY2VpdmVyS2V5c3BhY2UsIHJlY2VpdmVyVGFibGUsIHJlY2VpdmVyVHlwZSwgY2FuZGlkYXRlcyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxGdW5jdGlvbj4gY29sbGVjdENhbmRpZGF0ZXMoU3RyaW5nIGtleXNwYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uTmFtZSBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWNlaXZlcktzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWNlaXZlckNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiByZWNlaXZlclR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlY2VpdmVyS2V5c3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlY2VpdmVyVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDw/IGV4dGVuZHMgQXNzaWdubWVudFRlc3RhYmxlPiBwcm92aWRlZEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHJlY2VpdmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRnVuY3Rpb25zIGZ1bmN0aW9ucykKICAgICB7CiAgICAgICAgIENvbGxlY3Rpb248RnVuY3Rpb24+IGNhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAotICAgICAgICBpZiAobmFtZS5lcXVhbHNOYXRpdmVGdW5jdGlvbihUT0tFTl9GVU5DVElPTl9OQU1FKSkKLSAgICAgICAgICAgIGNhbmRpZGF0ZXMuYWRkKG5ldyBUb2tlbkZjdChTY2hlbWEuaW5zdGFuY2UuZ2V0VGFibGVNZXRhZGF0YShyZWNlaXZlcktzLCByZWNlaXZlckNmKSkpOwotCi0gICAgICAgIC8vIFRoZSB0b0pzb24oKSBmdW5jdGlvbiBjYW4gYWNjZXB0IGFueSB0eXBlIG9mIGFyZ3VtZW50LCBzbyBpbnN0YW5jZXMgb2YgaXQgYXJlIG5vdCBwcmUtZGVjbGFyZWQuICBJbnN0ZWFkLAotICAgICAgICAvLyB3ZSBjcmVhdGUgbmV3IGluc3RhbmNlcyBhcyBuZWVkZWQgd2hpbGUgaGFuZGxpbmcgc2VsZWN0b3JzICh3aGljaCBpcyB0aGUgb25seSBwbGFjZSB0aGF0IHRvSnNvbigpIGlzIHN1cHBvcnRlZCwKLSAgICAgICAgLy8gZHVlIHRvIG5lZWRpbmcgdG8ga25vdyB0aGUgYXJndW1lbnQgdHlwZXMgaW4gYWR2YW5jZSkuCi0gICAgICAgIGlmIChuYW1lLmVxdWFsc05hdGl2ZUZ1bmN0aW9uKFRvSnNvbkZjdC5OQU1FKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbigidG9Kc29uKCkgbWF5IG9ubHkgYmUgdXNlZCB3aXRoaW4gdGhlIHNlbGVjdGlvbiBjbGF1c2Ugb2YgU0VMRUNUIHN0YXRlbWVudHMiKTsKLQotICAgICAgICAvLyBTaW1pbGFybHksIHdlIGNhbiBvbmx5IHVzZSBmcm9tSnNvbiB3aGVuIHdlIGtub3cgdGhlIHJlY2VpdmVyIHR5cGUgKHN1Y2ggYXMgaW5zZXJ0cykKLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzTmF0aXZlRnVuY3Rpb24oRnJvbUpzb25GY3QuTkFNRSkpCisgICAgICAgIGlmIChuYW1lLmhhc0tleXNwYWNlKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChyZWNlaXZlclR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oImZyb21Kc29uKCkgY2Fubm90IGJlIHVzZWQgaW4gdGhlIHNlbGVjdGlvbiBjbGF1c2Ugb2YgYSBTRUxFQ1Qgc3RhdGVtZW50Iik7Ci0gICAgICAgICAgICBjYW5kaWRhdGVzLmFkZChGcm9tSnNvbkZjdC5nZXRJbnN0YW5jZShyZWNlaXZlclR5cGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbmFtZS5oYXNLZXlzcGFjZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBmdW5jdGlvbiBuYW1lIG5vdCBmdWxseSBxdWFsaWZpZWQKLSAgICAgICAgICAgIC8vIGFkZCAnU1lTVEVNJyAobmF0aXZlKSBjYW5kaWRhdGVzCi0gICAgICAgICAgICBjYW5kaWRhdGVzLmFkZEFsbChTY2hlbWEuaW5zdGFuY2UuZ2V0RnVuY3Rpb25zKG5hbWUuYXNOYXRpdmVGdW5jdGlvbigpKSk7Ci0gICAgICAgICAgICAvLyBhZGQgJ2N1cnJlbnQga2V5c3BhY2UnIGNhbmRpZGF0ZXMKLSAgICAgICAgICAgIGNhbmRpZGF0ZXMuYWRkQWxsKFNjaGVtYS5pbnN0YW5jZS5nZXRGdW5jdGlvbnMobmV3IEZ1bmN0aW9uTmFtZShrZXlzcGFjZSwgbmFtZS5uYW1lKSkpOworICAgICAgICAgICAgLy8gZnVuY3Rpb24gbmFtZSBpcyBmdWxseSBxdWFsaWZpZWQgKGtleXNwYWNlICsgbmFtZSkKKyAgICAgICAgICAgIGNhbmRpZGF0ZXMuYWRkQWxsKGZ1bmN0aW9ucy5nZXQobmFtZSkpOworICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGRBbGwoU2NoZW1hLmluc3RhbmNlLmdldFVzZXJGdW5jdGlvbnMobmFtZSkpOworICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGRBbGwoTmF0aXZlRnVuY3Rpb25zLmluc3RhbmNlLmdldEZ1bmN0aW9ucyhuYW1lKSk7CisgICAgICAgICAgICBjYW5kaWRhdGVzLmFkZEFsbChOYXRpdmVGdW5jdGlvbnMuaW5zdGFuY2UuZ2V0RmFjdG9yaWVzKG5hbWUpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZiAtPiBmLmdldE9yQ3JlYXRlRnVuY3Rpb24ocHJvdmlkZWRBcmdzLCByZWNlaXZlclR5cGUsIHJlY2VpdmVyS2V5c3BhY2UsIHJlY2VpdmVyVGFibGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKE9iamVjdHM6Om5vbk51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIGZ1bmN0aW9uIG5hbWUgaXMgZnVsbHkgcXVhbGlmaWVkIChrZXlzcGFjZSArIG5hbWUpCi0gICAgICAgICAgICBjYW5kaWRhdGVzLmFkZEFsbChTY2hlbWEuaW5zdGFuY2UuZ2V0RnVuY3Rpb25zKG5hbWUpKTsKKyAgICAgICAgICAgIC8vIGZ1bmN0aW9uIG5hbWUgaXMgbm90IGZ1bGx5IHF1YWxpZmllZAorICAgICAgICAgICAgLy8gYWRkICdjdXJyZW50IGtleXNwYWNlJyBjYW5kaWRhdGVzCisgICAgICAgICAgICBGdW5jdGlvbk5hbWUgdXNlck5hbWUgPSBuZXcgRnVuY3Rpb25OYW1lKGtleXNwYWNlLCBuYW1lLm5hbWUpOworICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGRBbGwoZnVuY3Rpb25zLmdldCh1c2VyTmFtZSkpOworICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGRBbGwoU2NoZW1hLmluc3RhbmNlLmdldFVzZXJGdW5jdGlvbnModXNlck5hbWUpKTsKKyAgICAgICAgICAgIC8vIGFkZCAnU1lTVEVNJyAobmF0aXZlKSBjYW5kaWRhdGVzCisgICAgICAgICAgICBGdW5jdGlvbk5hbWUgbmF0aXZlTmFtZSA9IG5hbWUuYXNOYXRpdmVGdW5jdGlvbigpOworICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGRBbGwoTmF0aXZlRnVuY3Rpb25zLmluc3RhbmNlLmdldEZ1bmN0aW9ucyhuYXRpdmVOYW1lKSk7CisgICAgICAgICAgICBjYW5kaWRhdGVzLmFkZEFsbChOYXRpdmVGdW5jdGlvbnMuaW5zdGFuY2UuZ2V0RmFjdG9yaWVzKG5hdGl2ZU5hbWUpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZiAtPiBmLmdldE9yQ3JlYXRlRnVuY3Rpb24ocHJvdmlkZWRBcmdzLCByZWNlaXZlclR5cGUsIHJlY2VpdmVyS2V5c3BhY2UsIHJlY2VpdmVyVGFibGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKE9iamVjdHM6Om5vbk51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBjYW5kaWRhdGVzOwpAQCAtMTMwLDggKzE1Miw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgRnVuY3Rpb24gcGlja0Jlc3RNYXRjaChTdHJpbmcga2V5c3BhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbk5hbWUgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8PyBleHRlbmRzIEFzc2lnbm1lbnRUZXN0YWJsZT4gcHJvdmlkZWRBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlY2VpdmVyS3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVjZWl2ZXJDZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWNlaXZlcktleXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlY2VpdmVyVGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxGdW5jdGlvbj4gY2FuZGlkYXRlcykKICAgICB7CkBAIC0xNDAsNyArMTYyLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgaWYgKG1hdGNoUmV0dXJuVHlwZSh0b1Rlc3QsIHJlY2VpdmVyVHlwZSkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzaWdubWVudFRlc3RhYmxlLlRlc3RSZXN1bHQgciA9IG1hdGNoQWd1bWVudHMoa2V5c3BhY2UsIHRvVGVzdCwgcHJvdmlkZWRBcmdzLCByZWNlaXZlcktzLCByZWNlaXZlckNmKTsKKyAgICAgICAgICAgICAgICBBc3NpZ25tZW50VGVzdGFibGUuVGVzdFJlc3VsdCByID0gbWF0Y2hBZ3VtZW50cyhrZXlzcGFjZSwgdG9UZXN0LCBwcm92aWRlZEFyZ3MsIHJlY2VpdmVyS2V5c3BhY2UsIHJlY2VpdmVyVGFibGUpOwogICAgICAgICAgICAgICAgIHN3aXRjaCAocikKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVhBQ1RfTUFUQ0g6CkBAIC0yMjEsOCArMjQzLDggQEAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlVHlwZXMoU3RyaW5nIGtleXNwYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiBmdW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8PyBleHRlbmRzIEFzc2lnbm1lbnRUZXN0YWJsZT4gcHJvdmlkZWRBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVjZWl2ZXJLcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlY2VpdmVyQ2YpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWNlaXZlcktleXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVjZWl2ZXJUYWJsZSkKICAgICB7CiAgICAgICAgIGlmIChwcm92aWRlZEFyZ3Muc2l6ZSgpICE9IGZ1bi5hcmdUeXBlcygpLnNpemUoKSkKICAgICAgICAgICAgIHRocm93IGludmFsaWRSZXF1ZXN0KCJJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMgaW4gY2FsbCB0byBmdW5jdGlvbiAlczogJWQgcmVxdWlyZWQgYnV0ICVkIHByb3ZpZGVkIiwKQEAgLTIzNyw3ICsyNTksNyBAQAogICAgICAgICAgICAgaWYgKHByb3ZpZGVkID09IG51bGwpCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAKLSAgICAgICAgICAgIENvbHVtblNwZWNpZmljYXRpb24gZXhwZWN0ZWQgPSBtYWtlQXJnU3BlYyhyZWNlaXZlcktzLCByZWNlaXZlckNmLCBmdW4sIGkpOworICAgICAgICAgICAgQ29sdW1uU3BlY2lmaWNhdGlvbiBleHBlY3RlZCA9IG1ha2VBcmdTcGVjKHJlY2VpdmVyS2V5c3BhY2UsIHJlY2VpdmVyVGFibGUsIGZ1biwgaSk7CiAgICAgICAgICAgICBpZiAoIXByb3ZpZGVkLnRlc3RBc3NpZ25tZW50KGtleXNwYWNlLCBleHBlY3RlZCkuaXNBc3NpZ25hYmxlKCkpCiAgICAgICAgICAgICAgICAgdGhyb3cgaW52YWxpZFJlcXVlc3QoIlR5cGUgZXJyb3I6ICVzIGNhbm5vdCBiZSBwYXNzZWQgYXMgYXJndW1lbnQgJWQgb2YgZnVuY3Rpb24gJXMgb2YgdHlwZSAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQsIGksIGZ1bi5uYW1lKCksIGV4cGVjdGVkLnR5cGUuYXNDUUwzVHlwZSgpKTsKQEAgLTI0NywxMyArMjY5LDEzIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgQXNzaWdubWVudFRlc3RhYmxlLlRlc3RSZXN1bHQgbWF0Y2hBZ3VtZW50cyhTdHJpbmcga2V5c3BhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiBmdW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PD8gZXh0ZW5kcyBBc3NpZ25tZW50VGVzdGFibGU+IHByb3ZpZGVkQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWNlaXZlcktzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlY2VpdmVyQ2YpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVjZWl2ZXJLZXlzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWNlaXZlclRhYmxlKQogICAgIHsKICAgICAgICAgaWYgKHByb3ZpZGVkQXJncy5zaXplKCkgIT0gZnVuLmFyZ1R5cGVzKCkuc2l6ZSgpKQogICAgICAgICAgICAgcmV0dXJuIEFzc2lnbm1lbnRUZXN0YWJsZS5UZXN0UmVzdWx0Lk5PVF9BU1NJR05BQkxFOwogCi0gICAgICAgIC8vIEl0J3MgYW4gZXhhY3QgbWF0Y2ggaWYgYWxsIGFyZSBleGFjdCBtYXRjaCwgYnV0IGlzIG5vdCBhc3NpZ25hYmxlIGFzIHNvb24gYXMgYW55IGlzIG5vbiBhc3NpZ25hYmxlLgorICAgICAgICAvLyBJdCdzIGFuIGV4YWN0IG1hdGNoIGlmIGFsbCBhcmUgZXhhY3QgbWF0Y2gsIGJ1dCBpcyBub3QgYXNzaWduYWJsZSBhcyBzb29uIGFzIGFueSBpcyBub3QgYXNzaWduYWJsZS4KICAgICAgICAgQXNzaWdubWVudFRlc3RhYmxlLlRlc3RSZXN1bHQgcmVzID0gQXNzaWdubWVudFRlc3RhYmxlLlRlc3RSZXN1bHQuRVhBQ1RfTUFUQ0g7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdmlkZWRBcmdzLnNpemUoKTsgaSsrKQogICAgICAgICB7CkBAIC0yNjQsNyArMjg2LDcgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQ29sdW1uU3BlY2lmaWNhdGlvbiBleHBlY3RlZCA9IG1ha2VBcmdTcGVjKHJlY2VpdmVyS3MsIHJlY2VpdmVyQ2YsIGZ1biwgaSk7CisgICAgICAgICAgICBDb2x1bW5TcGVjaWZpY2F0aW9uIGV4cGVjdGVkID0gbWFrZUFyZ1NwZWMocmVjZWl2ZXJLZXlzcGFjZSwgcmVjZWl2ZXJUYWJsZSwgZnVuLCBpKTsKICAgICAgICAgICAgIEFzc2lnbm1lbnRUZXN0YWJsZS5UZXN0UmVzdWx0IGFyZ1JlcyA9IHByb3ZpZGVkLnRlc3RBc3NpZ25tZW50KGtleXNwYWNlLCBleHBlY3RlZCk7CiAgICAgICAgICAgICBpZiAoYXJnUmVzID09IEFzc2lnbm1lbnRUZXN0YWJsZS5UZXN0UmVzdWx0Lk5PVF9BU1NJR05BQkxFKQogICAgICAgICAgICAgICAgIHJldHVybiBBc3NpZ25tZW50VGVzdGFibGUuVGVzdFJlc3VsdC5OT1RfQVNTSUdOQUJMRTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL01hdGhGY3RzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9NYXRoRmN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1M2FjNDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9NYXRoRmN0cy5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKKworcHVibGljIGZpbmFsIGNsYXNzIE1hdGhGY3RzCit7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEZ1bmN0aW9uc1RvKE5hdGl2ZUZ1bmN0aW9ucyBmdW5jdGlvbnMpCisgICAgeworICAgICAgICBmaW5hbCBMaXN0PE51bWJlclR5cGU8Pz4+IG51bWVyaWNUeXBlcyA9IEltbXV0YWJsZUxpc3Qub2YoQnl0ZVR5cGUuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG9ydFR5cGUuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQzMlR5cGUuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG9hdFR5cGUuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nVHlwZS5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvdWJsZVR5cGUuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyVHlwZS5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWxUeXBlLmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRlckNvbHVtblR5cGUuaW5zdGFuY2UpOworCisgICAgICAgIG51bWVyaWNUeXBlcy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAubWFwKHQgLT4gSW1tdXRhYmxlTGlzdC5vZihhYnNGY3QodCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cEZjdCh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nRmN0KHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cxMEZjdCh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmRGY3QodCkpKQorICAgICAgICAgICAgICAgICAgICAgLmZsYXRNYXAoQ29sbGVjdGlvbjo6c3RyZWFtKQorICAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goZiAtPiBmdW5jdGlvbnMuYWRkKGYpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE5hdGl2ZUZ1bmN0aW9uIGFic0ZjdChmaW5hbCBOdW1iZXJUeXBlPD8+IHR5cGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZVNjYWxhckZ1bmN0aW9uKCJhYnMiLCB0eXBlLCB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBwYXJhbWV0ZXJzLmdldCgwKTsKKyAgICAgICAgICAgICAgICBpZiAoYmIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuYWJzKGJiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE5hdGl2ZUZ1bmN0aW9uIGV4cEZjdChmaW5hbCBOdW1iZXJUeXBlPD8+IHR5cGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZVNjYWxhckZ1bmN0aW9uKCJleHAiLCB0eXBlLCB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBwYXJhbWV0ZXJzLmdldCgwKTsKKyAgICAgICAgICAgICAgICBpZiAoYmIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuZXhwKGJiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE5hdGl2ZUZ1bmN0aW9uIGxvZ0ZjdChmaW5hbCBOdW1iZXJUeXBlPD8+IHR5cGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZVNjYWxhckZ1bmN0aW9uKCJsb2ciLCB0eXBlLCB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBwYXJhbWV0ZXJzLmdldCgwKTsKKyAgICAgICAgICAgICAgICBpZiAoYmIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUubG9nKGJiKTsKKworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTmF0aXZlRnVuY3Rpb24gbG9nMTBGY3QoZmluYWwgTnVtYmVyVHlwZTw/PiB0eXBlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVTY2FsYXJGdW5jdGlvbigibG9nMTAiLCB0eXBlLCB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBwYXJhbWV0ZXJzLmdldCgwKTsKKyAgICAgICAgICAgICAgICBpZiAoYmIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUubG9nMTAoYmIpOworCisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBOYXRpdmVGdW5jdGlvbiByb3VuZEZjdChmaW5hbCBOdW1iZXJUeXBlPD8+IHR5cGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZVNjYWxhckZ1bmN0aW9uKCJyb3VuZCIsIHR5cGUsIHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhlY3V0ZShQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IHBhcmFtZXRlcnMuZ2V0KDApOworICAgICAgICAgICAgICAgIGlmIChiYiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5yb3VuZChiYik7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIE1hdGhGY3RzKCkKKyAgICB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvTmF0aXZlRnVuY3Rpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL05hdGl2ZUZ1bmN0aW9uLmphdmEKaW5kZXggY2FmZWNhMS4uMjg1Y2Y2MyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvTmF0aXZlRnVuY3Rpb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9OYXRpdmVGdW5jdGlvbi5qYXZhCkBAIC0xOSw2ICsxOSw4IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwogCiAvKioKQEAgLTMyLDcgKzM0LDcgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc05hdGl2ZSgpCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNOYXRpdmUoKQogICAgIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtNDMsNCArNDUsMTggQEAKICAgICAgICAgLy8gTW9zdCBvZiBvdXIgZnVuY3Rpb25zIGFyZSBwdXJlLCB0aGUgb3RoZXIgb25lcyBzaG91bGQgb3ZlcnJpZGUgdGhpcwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIGZ1bmN0aW9uIHVzaW5nIGl0cyBvbGQgcHJlLTUuMCBuYW1lIGJlZm9yZSB0aGUgYWRvcHRpb24gb2Ygc25ha2UtY2FzZWQgZnVuY3Rpb24gbmFtZXMuCisgICAgICogVGhvc2UgbmFtaW5nIGNvbnZlbnRpb25zIHdlcmUgYWRvcHRlZCBpbiA1LjAsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHN1cHBvcnQgdGhlIG9sZCBuYW1lcyBmb3IKKyAgICAgKiBjb21wYXRpYmlsaXR5LiBTZWUgQ0FTU0FORFJBLTE4MDM3IGZvciBmdXJ0aGVyIGRldGFpbHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgY29weSBvZiB0aGlzIGZ1bmN0aW9uIHVzaW5nIGl0cyBvbGQgcHJlLTUuMCBkZXByZWNhdGVkIG5hbWUsIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgcHJlLTUuMCBmdW5jdGlvbgorICAgICAqIG5hbWUgYWxyZWFkeSBzYXRpc2ZpZWQgdGhlIG5hbWluZyBjb252ZW50aW9ucy4KKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBwdWJsaWMgTmF0aXZlRnVuY3Rpb24gd2l0aExlZ2FjeU5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvTmF0aXZlRnVuY3Rpb25zLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9OYXRpdmVGdW5jdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjkzOWU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvTmF0aXZlRnVuY3Rpb25zLmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSGFzaE11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTXVsdGltYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nLk1hc2tpbmdGY3RzOworCisvKioKKyAqIEEgY29udGFpbmVyIG9mIG5hdGl2ZSBmdW5jdGlvbnMuIEl0IHN0b3JlcyBib3RoIHByZS1idWlsdCBmdW5jdGlvbiBvdmVybG9hZHMgKHtAbGluayBOYXRpdmVGdW5jdGlvbn0pIGFuZAorICogZHluYW1pYyBnZW5lcmF0b3JzIG9mIGZ1bmN0aW9ucyAoe0BsaW5rIEZ1bmN0aW9uRmFjdG9yeX0pLgorICovCitwdWJsaWMgY2xhc3MgTmF0aXZlRnVuY3Rpb25zCit7CisgICAgcHVibGljIHN0YXRpYyBOYXRpdmVGdW5jdGlvbnMgaW5zdGFuY2UgPSBuZXcgTmF0aXZlRnVuY3Rpb25zKCkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIFRva2VuRmN0LmFkZEZ1bmN0aW9uc1RvKHRoaXMpOworICAgICAgICAgICAgQ2FzdEZjdHMuYWRkRnVuY3Rpb25zVG8odGhpcyk7CisgICAgICAgICAgICBVdWlkRmN0cy5hZGRGdW5jdGlvbnNUbyh0aGlzKTsKKyAgICAgICAgICAgIFRpbWVGY3RzLmFkZEZ1bmN0aW9uc1RvKHRoaXMpOworICAgICAgICAgICAgVG9Kc29uRmN0LmFkZEZ1bmN0aW9uc1RvKHRoaXMpOworICAgICAgICAgICAgRnJvbUpzb25GY3QuYWRkRnVuY3Rpb25zVG8odGhpcyk7CisgICAgICAgICAgICBPcGVyYXRpb25GY3RzLmFkZEZ1bmN0aW9uc1RvKHRoaXMpOworICAgICAgICAgICAgQWdncmVnYXRlRmN0cy5hZGRGdW5jdGlvbnNUbyh0aGlzKTsKKyAgICAgICAgICAgIENvbGxlY3Rpb25GY3RzLmFkZEZ1bmN0aW9uc1RvKHRoaXMpOworICAgICAgICAgICAgQnl0ZXNDb252ZXJzaW9uRmN0cy5hZGRGdW5jdGlvbnNUbyh0aGlzKTsKKyAgICAgICAgICAgIE1hdGhGY3RzLmFkZEZ1bmN0aW9uc1RvKHRoaXMpOworICAgICAgICAgICAgTWFza2luZ0ZjdHMuYWRkRnVuY3Rpb25zVG8odGhpcyk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqIFByZS1idWlsdCBmdW5jdGlvbiBvdmVybG9hZHMuICovCisgICAgcHJpdmF0ZSBmaW5hbCBNdWx0aW1hcDxGdW5jdGlvbk5hbWUsIE5hdGl2ZUZ1bmN0aW9uPiBmdW5jdGlvbnMgPSBIYXNoTXVsdGltYXAuY3JlYXRlKCk7CisKKyAgICAvKiogRHluYW1pYyBmdW5jdGlvbiBmYWN0b3JpZXMuICovCisgICAgcHJpdmF0ZSBmaW5hbCBNdWx0aW1hcDxGdW5jdGlvbk5hbWUsIEZ1bmN0aW9uRmFjdG9yeT4gZmFjdG9yaWVzID0gSGFzaE11bHRpbWFwLmNyZWF0ZSgpOworCisgICAgcHVibGljIHZvaWQgYWRkKE5hdGl2ZUZ1bmN0aW9uIGZ1bmN0aW9uKQorICAgIHsKKyAgICAgICAgZnVuY3Rpb25zLnB1dChmdW5jdGlvbi5uYW1lKCksIGZ1bmN0aW9uKTsKKyAgICAgICAgTmF0aXZlRnVuY3Rpb24gbGVnYWN5RnVuY3Rpb24gPSBmdW5jdGlvbi53aXRoTGVnYWN5TmFtZSgpOworICAgICAgICBpZiAobGVnYWN5RnVuY3Rpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIGZ1bmN0aW9ucy5wdXQobGVnYWN5RnVuY3Rpb24ubmFtZSgpLCBsZWdhY3lGdW5jdGlvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQWxsKE5hdGl2ZUZ1bmN0aW9uLi4uIGZ1bmN0aW9ucykKKyAgICB7CisgICAgICAgIGZvciAoTmF0aXZlRnVuY3Rpb24gZnVuY3Rpb24gOiBmdW5jdGlvbnMpCisgICAgICAgICAgICBhZGQoZnVuY3Rpb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZChGdW5jdGlvbkZhY3RvcnkgZmFjdG9yeSkKKyAgICB7CisgICAgICAgIGZhY3Rvcmllcy5wdXQoZmFjdG9yeS5uYW1lKCksIGZhY3RvcnkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYWxsIHRoZSByZWdpc3RlcmVkIHByZS1idWlsdCBmdW5jdGlvbnMgb3ZlcmxvYWRzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgYSBmdW5jdGlvbiBuYW1lCisgICAgICogQHJldHVybiB0aGUgcHJlLWJ1aWx0IGZ1bmN0aW9ucyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uPE5hdGl2ZUZ1bmN0aW9uPiBnZXRGdW5jdGlvbnMoRnVuY3Rpb25OYW1lIG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gZnVuY3Rpb25zLmdldChuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGFsbCB0aGUgcmVnaXN0ZXJlZCBwcmUtYnVpbHQgZnVuY3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uPE5hdGl2ZUZ1bmN0aW9uPiBnZXRGdW5jdGlvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy52YWx1ZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFsbCB0aGUgcmVnaXN0ZXJlZCBmdW5jdGlvbnMgZmFjdG9yaWVzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgYSBmdW5jdGlvbiBuYW1lCisgICAgICogQHJldHVybiB0aGUgZnVuY3Rpb24gZmFjdG9yaWVzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb248RnVuY3Rpb25GYWN0b3J5PiBnZXRGYWN0b3JpZXMoRnVuY3Rpb25OYW1lIG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gZmFjdG9yaWVzLmdldChuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGFsbCB0aGUgcmVnaXN0ZXJlZCBmdW5jdGlvbnMgZmFjdG9yaWVzLgorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uPEZ1bmN0aW9uRmFjdG9yeT4gZ2V0RmFjdG9yaWVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWN0b3JpZXMudmFsdWVzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZXJlIGlzIGEgZnVuY3Rpb24gZmFjdG9yeSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIGEgZnVuY3Rpb24gbmFtZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZXJlIGlzIGEgZmFjdG9yeSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNGYWN0b3J5KEZ1bmN0aW9uTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhY3Rvcmllcy5jb250YWluc0tleShuYW1lKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9PcGVyYXRpb25GY3RzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9PcGVyYXRpb25GY3RzLmphdmEKaW5kZXggYjAwY2VkNy4uOWUwZmVmMSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvT3BlcmF0aW9uRmN0cy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL09wZXJhdGlvbkZjdHMuamF2YQpAQCAtMTgsOCArMTgsNiBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9uczsKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHM7CkBAIC0yMTksMTAgKzIxNyw4IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVHQVRJT05fRlVOQ1RJT05fTkFNRSA9ICJfbmVnYXRlIjsKIAotICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxGdW5jdGlvbj4gYWxsKCkKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRnVuY3Rpb25zVG8oTmF0aXZlRnVuY3Rpb25zIGZ1bmN0aW9ucykKICAgICB7Ci0gICAgICAgIExpc3Q8RnVuY3Rpb24+IGZ1bmN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCiAgICAgICAgIGZpbmFsIE51bWJlclR5cGU8Pz5bXSBudW1lcmljVHlwZXMgPSBuZXcgTnVtYmVyVHlwZVtdIHsgQnl0ZVR5cGUuaW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvcnRUeXBlLmluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludDMyVHlwZS5pbnN0YW5jZSwKQEAgLTI1MSwxMSArMjQ3LDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIGFkZFN0cmluZ0NvbmNhdGVuYXRpb25zKGZ1bmN0aW9ucyk7Ci0KLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9uczsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFN0cmluZ0NvbmNhdGVuYXRpb25zKExpc3Q8RnVuY3Rpb24+IGZ1bmN0aW9ucykKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFN0cmluZ0NvbmNhdGVuYXRpb25zKE5hdGl2ZUZ1bmN0aW9ucyBmdW5jdGlvbnMpCiAgICAgewogICAgICAgICBmdW5jdGlvbnMuYWRkKG5ldyBTdHJpbmdPcGVyYXRpb25GdW5jdGlvbihVVEY4VHlwZS5pbnN0YW5jZSwgVVRGOFR5cGUuaW5zdGFuY2UsIE9QRVJBVElPTi5BRERJVElPTiwgVVRGOFR5cGUuaW5zdGFuY2UpKTsKICAgICAgICAgZnVuY3Rpb25zLmFkZChuZXcgU3RyaW5nT3BlcmF0aW9uRnVuY3Rpb24oQXNjaWlUeXBlLmluc3RhbmNlLCBBc2NpaVR5cGUuaW5zdGFuY2UsIE9QRVJBVElPTi5BRERJVElPTiwgQXNjaWlUeXBlLmluc3RhbmNlKSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9TY3JpcHRCYXNlZFVERnVuY3Rpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1NjcmlwdEJhc2VkVURGdW5jdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDJmYmU5Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1NjcmlwdEJhc2VkVURGdW5jdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuKjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnNjcmlwdC4qOwotCi1pbXBvcnQgamRrLm5hc2hvcm4uYXBpLnNjcmlwdGluZy5BYnN0cmFjdEpTT2JqZWN0OwotaW1wb3J0IGpkay5uYXNob3JuLmFwaS5zY3JpcHRpbmcuQ2xhc3NGaWx0ZXI7Ci1pbXBvcnQgamRrLm5hc2hvcm4uYXBpLnNjcmlwdGluZy5OYXNob3JuU2NyaXB0RW5naW5lOwotaW1wb3J0IGpkay5uYXNob3JuLmFwaS5zY3JpcHRpbmcuTmFzaG9yblNjcmlwdEVuZ2luZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5OYW1lZFRocmVhZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Db2x1bW5JZGVudGlmaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VjdXJpdHkuU2VjdXJpdHlUaHJlYWRHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZWN1cml0eS5UaHJlYWRBd2FyZVNlY3VyaXR5TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwotCi1maW5hbCBjbGFzcyBTY3JpcHRCYXNlZFVERnVuY3Rpb24gZXh0ZW5kcyBVREZ1bmN0aW9uCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvdGVjdGlvbkRvbWFpbiBwcm90ZWN0aW9uRG9tYWluOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFjY2Vzc0NvbnRyb2xDb250ZXh0IGFjY2Vzc0NvbnRyb2xDb250ZXh0OwotCi0gICAgLy8KLSAgICAvLyBGb3Igc2NyaXB0ZWQgVURGcyB3ZSBoYXZlIHRvIHJlbHkgb24gdGhlIHNlY3VyaXR5IG1lY2hhbmlzbXMgb2YgdGhlIHNjcmlwdGluZyBlbmdpbmUgYW5kCi0gICAgLy8gU2VjdXJpdHlNYW5hZ2VyIC0gZXNwZWNpYWxseSBTZWN1cml0eU1hbmFnZXIuY2hlY2tQYWNrYWdlQWNjZXNzKCkuIFVubGlrZSBKYXZhLVVERnMsIHN0cmljdCBjaGVja2luZwotICAgIC8vIG9mIGNsYXNzIGFjY2VzcyB2aWEgdGhlIFVERiBjbGFzcyBsb2FkZXIgaXMgbm90IHBvc3NpYmxlLCBzaW5jZSBlLmcuIE5hc2hvcm4gYnVpbGRzIGl0cyBvd24gY2xhc3MgbG9hZGVyCi0gICAgLy8gKGpkay5uYXNob3JuLmludGVybmFsLnJ1bnRpbWUuU2NyaXB0TG9hZGVyIC8gamRrLm5hc2hvcm4uaW50ZXJuYWwucnVudGltZS5OYXNob3JuTG9hZGVyKSBjb25maWd1cmVkIHdpdGgKLSAgICAvLyBhIHN5c3RlbSBjbGFzcyBsb2FkZXIuCi0gICAgLy8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBhbGxvd2VkUGFja2FnZXNBcnJheSA9Ci0gICAgewotICAgIC8vIGZvbGxvd2luZyByZXF1aXJlZCBieSBqZGsubmFzaG9ybi5pbnRlcm5hbC5vYmplY3RzLkdsb2JhbC5pbml0SmF2YUFjY2VzcygpCi0gICAgIiIsCi0gICAgImNvbSIsCi0gICAgImVkdSIsCi0gICAgImphdmEiLAotICAgICJqYXZheCIsCi0gICAgImphdmFmeCIsCi0gICAgIm9yZyIsCi0gICAgLy8gZm9sbG93aW5nIHJlcXVpcmVkIGJ5IE5hc2hvcm4gcnVudGltZQotICAgICJqYXZhLmxhbmciLAotICAgICJqYXZhLmxhbmcuaW52b2tlIiwKLSAgICAiamF2YS5sYW5nLnJlZmxlY3QiLAotICAgICJqYXZhLm5pby5jaGFyc2V0IiwKLSAgICAiamF2YS51dGlsIiwKLSAgICAiamF2YS51dGlsLmNvbmN1cnJlbnQiLAotICAgICJqYXZheC5zY3JpcHQiLAotICAgICJzdW4ucmVmbGVjdCIsCi0gICAgImpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5jb21tb25zIiwKLSAgICAiamRrLm5hc2hvcm4uaW50ZXJuYWwucnVudGltZSIsCi0gICAgImpkay5uYXNob3JuLmludGVybmFsLnJ1bnRpbWUubGlua2VyIiwKLSAgICAvLyBOYXNob3JuIC8gSmF2YSAxMQotICAgICJqYXZhLmxhbmcucmVmIiwKLSAgICAiamF2YS5pbyIsCi0gICAgImphdmEudXRpbC5mdW5jdGlvbiIsCi0gICAgImpkay5keW5hbGluay5saW5rZXIiLAotICAgICJqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20iLAotICAgICJqZGsuaW50ZXJuYWwucmVmbGVjdCIsCi0gICAgImpkay5uYXNob3JuLmludGVybmFsLnNjcmlwdHMiLAotICAgIC8vIGZvbGxvd2luZyByZXF1aXJlZCBieSBKYXZhIERyaXZlcgotICAgICJqYXZhLm1hdGgiLAotICAgICJqYXZhLm5pbyIsCi0gICAgImphdmEudGV4dCIsCi0gICAgImNvbS5nb29nbGUuY29tbW9uLmJhc2UiLAotICAgICJjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0IiwKLSAgICAiY29tLmdvb2dsZS5jb21tb24ucmVmbGVjdCIsCi0gICAgLy8gZm9sbG93aW5nIHJlcXVpcmVkIGJ5IFVERgotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy50eXBlcyIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLnR5cGVzLmV4Y2VwdGlvbnMiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy50eXBlcy51dGlscyIKLSAgICB9OwotCi0gICAgLy8gdXNlIGEgSlZNIHN0YW5kYXJkIEV4ZWN1dG9yU2VydmljZSBhcyBFeGVjdXRvclBsdXMgcmVmZXJlbmNlcyBpbnRlcm5hbAotICAgIC8vIGNsYXNzZXMsIHdoaWNoIHRyaWdnZXJzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gZnJvbSB0aGUgVURGIHNhbmRib3gKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVREZFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPQotICAgICAgICBuZXcgVURGRXhlY3V0b3JTZXJ2aWNlKG5ldyBOYW1lZFRocmVhZEZhY3RvcnkoIlVzZXJEZWZpbmVkU2NyaXB0RnVuY3Rpb25zIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5NSU5fUFJJT1JJVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZGZDbGFzc0xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZWN1cml0eVRocmVhZEdyb3VwKCJVc2VyRGVmaW5lZFNjcmlwdEZ1bmN0aW9ucyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQ8PihBcnJheXMuYXNMaXN0KGFsbG93ZWRQYWNrYWdlc0FycmF5KSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVURGdW5jdGlvbjo6aW5pdGlhbGl6ZVRocmVhZCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Vyc2NyaXB0cyIpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NGaWx0ZXIgY2xhc3NGaWx0ZXIgPSBjbHNOYW1lIC0+IHNlY3VyZVJlc291cmNlKGNsc05hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLmNsYXNzIik7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOYXNob3JuU2NyaXB0RW5naW5lIHNjcmlwdEVuZ2luZTsKLQotCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBTY3JpcHRFbmdpbmVNYW5hZ2VyIHNjcmlwdEVuZ2luZU1hbmFnZXIgPSBuZXcgU2NyaXB0RW5naW5lTWFuYWdlcigpOwotICAgICAgICBTY3JpcHRFbmdpbmUgZW5naW5lID0gc2NyaXB0RW5naW5lTWFuYWdlci5nZXRFbmdpbmVCeU5hbWUoIm5hc2hvcm4iKTsKLSAgICAgICAgTmFzaG9yblNjcmlwdEVuZ2luZUZhY3RvcnkgZmFjdG9yeSA9IGVuZ2luZSAhPSBudWxsID8gKE5hc2hvcm5TY3JpcHRFbmdpbmVGYWN0b3J5KSBlbmdpbmUuZ2V0RmFjdG9yeSgpIDogbnVsbDsKLSAgICAgICAgc2NyaXB0RW5naW5lID0gZmFjdG9yeSAhPSBudWxsID8gKE5hc2hvcm5TY3JpcHRFbmdpbmUpIGZhY3RvcnkuZ2V0U2NyaXB0RW5naW5lKG5ldyBTdHJpbmdbXXt9LCB1ZGZDbGFzc0xvYWRlciwgY2xhc3NGaWx0ZXIpIDogbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvdGVjdGlvbkRvbWFpbiA9IG5ldyBQcm90ZWN0aW9uRG9tYWluKG5ldyBDb2RlU291cmNlKG5ldyBVUkwoInVkZiIsICJsb2NhbGhvc3QiLCAwLCAiL3NjcmlwdCIsIG5ldyBVUkxTdHJlYW1IYW5kbGVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgVVJMQ29ubmVjdGlvbiBvcGVuQ29ubmVjdGlvbihVUkwgdSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pLCAoQ2VydGlmaWNhdGVbXSkgbnVsbCksIFRocmVhZEF3YXJlU2VjdXJpdHlNYW5hZ2VyLm5vUGVybWlzc2lvbnMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYWNjZXNzQ29udHJvbENvbnRleHQgPSBuZXcgQWNjZXNzQ29udHJvbENvbnRleHQobmV3IFByb3RlY3Rpb25Eb21haW5bXXsgcHJvdGVjdGlvbkRvbWFpbiB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbXBpbGVkU2NyaXB0IHNjcmlwdDsKLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCB1ZGZDb250ZXh0QmluZGluZzsKLQotICAgIFNjcmlwdEJhc2VkVURGdW5jdGlvbihGdW5jdGlvbk5hbWUgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDb2x1bW5JZGVudGlmaWVyPiBhcmdOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gcmV0dXJuVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjYWxsZWRPbk51bGxJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhbmd1YWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYm9keSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUsIGFyZ05hbWVzLCBhcmdUeXBlcywgcmV0dXJuVHlwZSwgY2FsbGVkT25OdWxsSW5wdXQsIGxhbmd1YWdlLCBib2R5KTsKLQotICAgICAgICBpZiAoISJKYXZhU2NyaXB0Ii5lcXVhbHNJZ25vcmVDYXNlKGxhbmd1YWdlKSB8fCBzY3JpcHRFbmdpbmUgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJJbnZhbGlkIGxhbmd1YWdlICclcycgZm9yIGZ1bmN0aW9uICclcyciLCBsYW5ndWFnZSwgbmFtZSkpOwotCi0gICAgICAgIC8vIGV4ZWN1dGUgY29tcGlsYXRpb24gd2l0aCBuby1wZXJtaXNzaW9ucyB0byBwcmV2ZW50IGV2aWwgY29kZSBlLmcuIHZpYSAic3RhdGljIGNvZGUgYmxvY2tzIiAvICJjbGFzcyBpbml0aWFsaXphdGlvbiIKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuc2NyaXB0ID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoKFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb248Q29tcGlsZWRTY3JpcHQ+KSAoKSAtPiBzY3JpcHRFbmdpbmUuY29tcGlsZShib2R5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzQ29udHJvbENvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIHgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRocm93YWJsZSBlID0geC5nZXRDYXVzZSgpOwotICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkZhaWxlZCB0byBjb21waWxlIGZ1bmN0aW9uICd7fScgZm9yIGxhbmd1YWdlIHt9OiAiLCBuYW1lLCBsYW5ndWFnZSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJGYWlsZWQgdG8gY29tcGlsZSBmdW5jdGlvbiAnJXMnIGZvciBsYW5ndWFnZSAlczogJXMiLCBuYW1lLCBsYW5ndWFnZSwgZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSXQncyBub3QgYWx3YXlzIHBvc3NpYmxlIHRvIHNpbXBseSBwYXNzIGEgcGxhaW4gSmF2YSBvYmplY3QgYXMgYSBiaW5kaW5nIHRvIE5hc2hvcm4gYW5kCi0gICAgICAgIC8vIGxldCB0aGUgc2NyaXB0IGV4ZWN1dGUgbWV0aG9kcyBvbiBpdC4KLSAgICAgICAgdWRmQ29udGV4dEJpbmRpbmcgPSBuZXcgVURGQ29udGV4dFdyYXBwZXIoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBleGVjdXRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleGVjdXRlVXNlckRlZmluZWQoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQotICAgIHsKLSAgICAgICAgT2JqZWN0W10gcGFyYW1zID0gbmV3IE9iamVjdFthcmdUeXBlcy5zaXplKCldOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHBhcmFtc1tpXSA9IGNvbXBvc2UocHJvdG9jb2xWZXJzaW9uLCBpLCBwYXJhbWV0ZXJzLmdldChpKSk7Ci0KLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGV4ZWN1dGVTY3JpcHRJbnRlcm5hbChwYXJhbXMpOwotCi0gICAgICAgIHJldHVybiBkZWNvbXBvc2UocHJvdG9jb2xWZXJzaW9uLCByZXN1bHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExpa2Uge0BsaW5rIFVERnVuY3Rpb24jZXhlY3V0ZVVzZXJEZWZpbmVkKFByb3RvY29sVmVyc2lvbiwgTGlzdCl9IGJ1dCB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIGFscmVhZHkgaW4gbm9uLXNlcmlhbGl6ZWQgZm9ybS4KLSAgICAgKiBSZW1haW5pbmcgcGFyYW1ldGVycyAoMm5kIHBhcmFtdGVycyBhbmQgYWxsIG90aGVycykgYXJlIGluIHtAY29kZSBwYXJhbWV0ZXJzfS4KLSAgICAgKiBUaGlzIGlzIHVzZWQgdG8gcHJldmVudCBzdXBlcmZsdW91cyAoZGUpc2VyaWFsaXphdGlvbiBvZiB0aGUgc3RhdGUgb2YgYWdncmVnYXRlcy4KLSAgICAgKiBNZWFuczogc2NhbGFyIGZ1bmN0aW9ucyBvZiBhZ2dyZWdhdGVzIGFyZSBjYWxsZWQgdXNpbmcgdGhpcyB2YXJpYW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZXhlY3V0ZUFnZ3JlZ2F0ZVVzZXJEZWZpbmVkKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIE9iamVjdCBmaXJzdFBhcmFtLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCi0gICAgewotICAgICAgICBPYmplY3RbXSBwYXJhbXMgPSBuZXcgT2JqZWN0W2FyZ1R5cGVzLnNpemUoKV07Ci0gICAgICAgIHBhcmFtc1swXSA9IGZpcnN0UGFyYW07Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgcGFyYW1zW2ldID0gY29tcG9zZShwcm90b2NvbFZlcnNpb24sIGksIHBhcmFtZXRlcnMuZ2V0KGkgLSAxKSk7Ci0KLSAgICAgICAgcmV0dXJuIGV4ZWN1dGVTY3JpcHRJbnRlcm5hbChwYXJhbXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgT2JqZWN0IGV4ZWN1dGVTY3JpcHRJbnRlcm5hbChPYmplY3RbXSBwYXJhbXMpCi0gICAgewotICAgICAgICBTY3JpcHRDb250ZXh0IHNjcmlwdENvbnRleHQgPSBuZXcgU2ltcGxlU2NyaXB0Q29udGV4dCgpOwotICAgICAgICBzY3JpcHRDb250ZXh0LnNldEF0dHJpYnV0ZSgiamF2YXguc2NyaXB0LmZpbGVuYW1lIiwgdGhpcy5uYW1lLnRvU3RyaW5nKCksIFNjcmlwdENvbnRleHQuRU5HSU5FX1NDT1BFKTsKLSAgICAgICAgQmluZGluZ3MgYmluZGluZ3MgPSBzY3JpcHRDb250ZXh0LmdldEJpbmRpbmdzKFNjcmlwdENvbnRleHQuRU5HSU5FX1NDT1BFKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBiaW5kaW5ncy5wdXQoYXJnTmFtZXMuZ2V0KGkpLnRvU3RyaW5nKCksIHBhcmFtc1tpXSk7Ci0gICAgICAgIGJpbmRpbmdzLnB1dCgidWRmQ29udGV4dCIsIHVkZkNvbnRleHRCaW5kaW5nKTsKLQotICAgICAgICBPYmplY3QgcmVzdWx0OwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gSG93IHRvIHByZXZlbnQgQ2xhc3MuZm9yTmFtZSgpIF93aXRob3V0XyAiaGVscCIgZnJvbSB0aGUgc2NyaXB0IGVuZ2luZSA/Ci0gICAgICAgICAgICAvLyBOT1RFOiBOYXNob3JuIGVuZm9yY2VzIGEgc3BlY2lhbCBwZXJtaXNzaW9uIHRvIGFsbG93IGNsYXNzLWxvYWRpbmcsIHdoaWNoIGlzIG5vdCBncmFudGVkIC0gc28gaXQncyBmaW5lLgotCi0gICAgICAgICAgICByZXN1bHQgPSBzY3JpcHQuZXZhbChzY3JpcHRDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2NyaXB0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIENsYXNzPD8+IGphdmFSZXR1cm5UeXBlID0gVURIZWxwZXIuYXNKYXZhQ2xhc3MocmV0dXJuQ29kZWMpOwotICAgICAgICBDbGFzczw/PiByZXN1bHRUeXBlID0gcmVzdWx0LmdldENsYXNzKCk7Ci0gICAgICAgIGlmICghamF2YVJldHVyblR5cGUuaXNBc3NpZ25hYmxlRnJvbShyZXN1bHRUeXBlKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE51bWJlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOdW1iZXIgck51bWJlciA9IChOdW1iZXIpIHJlc3VsdDsKLSAgICAgICAgICAgICAgICBpZiAoamF2YVJldHVyblR5cGUgPT0gSW50ZWdlci5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gck51bWJlci5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGphdmFSZXR1cm5UeXBlID09IExvbmcuY2xhc3MpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJOdW1iZXIubG9uZ1ZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoamF2YVJldHVyblR5cGUgPT0gU2hvcnQuY2xhc3MpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJOdW1iZXIuc2hvcnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGphdmFSZXR1cm5UeXBlID09IEJ5dGUuY2xhc3MpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJOdW1iZXIuYnl0ZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoamF2YVJldHVyblR5cGUgPT0gRmxvYXQuY2xhc3MpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJOdW1iZXIuZmxvYXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGphdmFSZXR1cm5UeXBlID09IERvdWJsZS5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gck51bWJlci5kb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGphdmFSZXR1cm5UeXBlID09IEJpZ0ludGVnZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoamF2YVJldHVyblR5cGUgPT0gSW50ZWdlci5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJOdW1iZXIuaW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoamF2YVJldHVyblR5cGUgPT0gU2hvcnQuY2xhc3MpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByTnVtYmVyLnNob3J0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoamF2YVJldHVyblR5cGUgPT0gQnl0ZS5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJOdW1iZXIuYnl0ZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGphdmFSZXR1cm5UeXBlID09IExvbmcuY2xhc3MpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByTnVtYmVyLmxvbmdWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqYXZhUmV0dXJuVHlwZSA9PSBGbG9hdC5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJOdW1iZXIuZmxvYXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqYXZhUmV0dXJuVHlwZSA9PSBEb3VibGUuY2xhc3MpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByTnVtYmVyLmRvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGphdmFSZXR1cm5UeXBlID09IEJpZ0ludGVnZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyTnVtYmVyIGluc3RhbmNlb2YgQmlnRGVjaW1hbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoKEJpZ0RlY2ltYWwpIHJOdW1iZXIpLnRvQmlnSW50ZWdlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAock51bWJlciBpbnN0YW5jZW9mIERvdWJsZSB8fCByTnVtYmVyIGluc3RhbmNlb2YgRmxvYXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEJpZ0RlY2ltYWwock51bWJlci50b1N0cmluZygpKS50b0JpZ0ludGVnZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBCaWdJbnRlZ2VyLnZhbHVlT2Yock51bWJlci5sb25nVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoamF2YVJldHVyblR5cGUgPT0gQmlnRGVjaW1hbC5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0cmluZyBjJ3RvciBvZiBCaWdEZWNpbWFsIGlzIG1vcmUgYWNjdXJhdGUgdGhhbiB2YWx1ZU9mKGRvdWJsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBCaWdEZWNpbWFsKHJOdW1iZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGphdmFSZXR1cm5UeXBlID09IEJpZ0RlY2ltYWwuY2xhc3MpCi0gICAgICAgICAgICAgICAgICAgIC8vIFN0cmluZyBjJ3RvciBvZiBCaWdEZWNpbWFsIGlzIG1vcmUgYWNjdXJhdGUgdGhhbiB2YWx1ZU9mKGRvdWJsZSkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEJpZ0RlY2ltYWwock51bWJlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBVREZDb250ZXh0V3JhcHBlciBleHRlbmRzIEFic3RyYWN0SlNPYmplY3QKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQWJzdHJhY3RKU09iamVjdCBmUmV0VURUOwotICAgICAgICBwcml2YXRlIGZpbmFsIEFic3RyYWN0SlNPYmplY3QgZkFyZ1VEVDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdEpTT2JqZWN0IGZSZXRUdXA7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQWJzdHJhY3RKU09iamVjdCBmQXJnVHVwOwotCi0gICAgICAgIFVERkNvbnRleHRXcmFwcGVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgZlJldFVEVCA9IG5ldyBBYnN0cmFjdEpTT2JqZWN0KCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNhbGwoT2JqZWN0IHRoaXosIE9iamVjdC4uLiBhcmdzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVkZkNvbnRleHQubmV3UmV0dXJuVURUVmFsdWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgZkFyZ1VEVCA9IG5ldyBBYnN0cmFjdEpTT2JqZWN0KCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNhbGwoT2JqZWN0IHRoaXosIE9iamVjdC4uLiBhcmdzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbMF0gaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdWRmQ29udGV4dC5uZXdBcmdVRFRWYWx1ZSgoU3RyaW5nKSBhcmdzWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbMF0gaW5zdGFuY2VvZiBOdW1iZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdWRmQ29udGV4dC5uZXdBcmdVRFRWYWx1ZSgoKE51bWJlcikgYXJnc1swXSkuaW50VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5jYWxsKHRoaXosIGFyZ3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBmUmV0VHVwID0gbmV3IEFic3RyYWN0SlNPYmplY3QoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY2FsbChPYmplY3QgdGhpeiwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdWRmQ29udGV4dC5uZXdSZXR1cm5UdXBsZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIGZBcmdUdXAgPSBuZXcgQWJzdHJhY3RKU09iamVjdCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBjYWxsKE9iamVjdCB0aGl6LCBPYmplY3QuLi4gYXJncykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhcmdzWzBdIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVkZkNvbnRleHQubmV3QXJnVHVwbGVWYWx1ZSgoU3RyaW5nKSBhcmdzWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbMF0gaW5zdGFuY2VvZiBOdW1iZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdWRmQ29udGV4dC5uZXdBcmdUdXBsZVZhbHVlKCgoTnVtYmVyKSBhcmdzWzBdKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNhbGwodGhpeiwgYXJncyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0TWVtYmVyKFN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2gobmFtZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlICJuZXdSZXR1cm5VRFRWYWx1ZSI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmUmV0VURUOwotICAgICAgICAgICAgICAgIGNhc2UgIm5ld0FyZ1VEVFZhbHVlIjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZBcmdVRFQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAibmV3UmV0dXJuVHVwbGVWYWx1ZSI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmUmV0VHVwOwotICAgICAgICAgICAgICAgIGNhc2UgIm5ld0FyZ1R1cGxlVmFsdWUiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZkFyZ1R1cDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRNZW1iZXIobmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9UaW1lRmN0cy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVGltZUZjdHMuamF2YQppbmRleCAyNzU5MjEwLi5lMTU1N2U2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9UaW1lRmN0cy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1RpbWVGY3RzLmphdmEKQEAgLTE4LDEwICsxOCw5IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zOwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHM7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIApAQCAtMzIsNjEgKzMxLDc3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVVVJREdlbjsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSUxMSVNFQ09ORFM7Ci0KIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLlJlcXVlc3RWYWxpZGF0aW9ucy5pbnZhbGlkUmVxdWVzdDsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIFRpbWVGY3RzCiB7CiAgICAgcHVibGljIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVGltZUZjdHMuY2xhc3MpOwogCi0gICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPEZ1bmN0aW9uPiBhbGwoKQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGdW5jdGlvbnNUbyhOYXRpdmVGdW5jdGlvbnMgZnVuY3Rpb25zKQogICAgIHsKLSAgICAgICAgcmV0dXJuIEltbXV0YWJsZUxpc3Qub2Yobm93KCJub3ciLCBUaW1lVVVJRFR5cGUuaW5zdGFuY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3coImN1cnJlbnR0aW1ldXVpZCIsIFRpbWVVVUlEVHlwZS5pbnN0YW5jZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdygiY3VycmVudHRpbWVzdGFtcCIsIFRpbWVzdGFtcFR5cGUuaW5zdGFuY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3coImN1cnJlbnRkYXRlIiwgU2ltcGxlRGF0ZVR5cGUuaW5zdGFuY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3coImN1cnJlbnR0aW1lIiwgVGltZVR5cGUuaW5zdGFuY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5UaW1ldXVpZEZjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGltZXV1aWRGY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVPZkZjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5peFRpbWVzdGFtcE9mRmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0RhdGUoVGltZVVVSURUeXBlLmluc3RhbmNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9UaW1lc3RhbXAoVGltZVVVSURUeXBlLmluc3RhbmNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Vbml4VGltZXN0YW1wKFRpbWVVVUlEVHlwZS5pbnN0YW5jZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvVW5peFRpbWVzdGFtcChUaW1lc3RhbXBUeXBlLmluc3RhbmNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9EYXRlKFRpbWVzdGFtcFR5cGUuaW5zdGFuY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1VuaXhUaW1lc3RhbXAoU2ltcGxlRGF0ZVR5cGUuaW5zdGFuY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1RpbWVzdGFtcChTaW1wbGVEYXRlVHlwZS5pbnN0YW5jZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb29yVGltZXN0YW1wRnVuY3Rpb24ubmV3SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvb3JUaW1lc3RhbXBGdW5jdGlvbi5uZXdJbnN0YW5jZVdpdGhTdGFydFRpbWVBcmd1bWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG9vclRpbWVVdWlkRnVuY3Rpb24ubmV3SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvb3JUaW1lVXVpZEZ1bmN0aW9uLm5ld0luc3RhbmNlV2l0aFN0YXJ0VGltZUFyZ3VtZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb29yRGF0ZUZ1bmN0aW9uLm5ld0luc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb29yRGF0ZUZ1bmN0aW9uLm5ld0luc3RhbmNlV2l0aFN0YXJ0VGltZUFyZ3VtZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yVGltZSk7CisgICAgICAgIGZ1bmN0aW9ucy5hZGRBbGwobmV3IE5vd0Z1bmN0aW9uKCJub3ciLCBUaW1lVVVJRFR5cGUuaW5zdGFuY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3dGdW5jdGlvbigiY3VycmVudF90aW1ldXVpZCIsIFRpbWVVVUlEVHlwZS5pbnN0YW5jZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vd0Z1bmN0aW9uKCJjdXJyZW50X3RpbWVzdGFtcCIsIFRpbWVzdGFtcFR5cGUuaW5zdGFuY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3dGdW5jdGlvbigiY3VycmVudF9kYXRlIiwgU2ltcGxlRGF0ZVR5cGUuaW5zdGFuY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3dGdW5jdGlvbigiY3VycmVudF90aW1lIiwgVGltZVR5cGUuaW5zdGFuY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1pblRpbWV1dWlkRmN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1heFRpbWV1dWlkRmN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvRGF0ZShUaW1lVVVJRFR5cGUuaW5zdGFuY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvVGltZXN0YW1wKFRpbWVVVUlEVHlwZS5pbnN0YW5jZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgdG9Vbml4VGltZXN0YW1wKFRpbWVVVUlEVHlwZS5pbnN0YW5jZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgdG9Vbml4VGltZXN0YW1wKFRpbWVzdGFtcFR5cGUuaW5zdGFuY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvRGF0ZShUaW1lc3RhbXBUeXBlLmluc3RhbmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b1VuaXhUaW1lc3RhbXAoU2ltcGxlRGF0ZVR5cGUuaW5zdGFuY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvVGltZXN0YW1wKFNpbXBsZURhdGVUeXBlLmluc3RhbmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGbG9vclRpbWVzdGFtcEZ1bmN0aW9uLm5ld0luc3RhbmNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgRmxvb3JUaW1lc3RhbXBGdW5jdGlvbi5uZXdJbnN0YW5jZVdpdGhTdGFydFRpbWVBcmd1bWVudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZsb29yVGltZVV1aWRGdW5jdGlvbi5uZXdJbnN0YW5jZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZsb29yVGltZVV1aWRGdW5jdGlvbi5uZXdJbnN0YW5jZVdpdGhTdGFydFRpbWVBcmd1bWVudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZsb29yRGF0ZUZ1bmN0aW9uLm5ld0luc3RhbmNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgRmxvb3JEYXRlRnVuY3Rpb24ubmV3SW5zdGFuY2VXaXRoU3RhcnRUaW1lQXJndW1lbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vclRpbWUpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRnVuY3Rpb24gbm93KGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBUZW1wb3JhbFR5cGU8Pz4gdHlwZSkKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOb3dGdW5jdGlvbiBleHRlbmRzIE5hdGl2ZVNjYWxhckZ1bmN0aW9uCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZVNjYWxhckZ1bmN0aW9uKG5hbWUsIHR5cGUpCisgICAgICAgIHByaXZhdGUgZmluYWwgVGVtcG9yYWxUeXBlPD8+IHR5cGU7CisKKyAgICAgICAgcHVibGljIE5vd0Z1bmN0aW9uKFN0cmluZyBuYW1lLCBUZW1wb3JhbFR5cGU8Pz4gdHlwZSkKICAgICAgICAgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleGVjdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1ldGVycykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5ub3coKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1cGVyKG5hbWUsIHR5cGUpOworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUHVyZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBhcyBpdCByZXR1cm5zIG5vbi1pZGVudGljYWwgcmVzdWx0cyBmb3IgaWRlbnRpY2FsIGFyZ3VtZW50cwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH07CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleGVjdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1ldGVycykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUubm93KCk7CisgICAgICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRnVuY3Rpb24gbWluVGltZXV1aWRGY3QgPSBuZXcgTmF0aXZlU2NhbGFyRnVuY3Rpb24oIm1pbnRpbWV1dWlkIiwgVGltZVVVSURUeXBlLmluc3RhbmNlLCBUaW1lc3RhbXBUeXBlLmluc3RhbmNlKQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQdXJlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBhcyBpdCByZXR1cm5zIG5vbi1pZGVudGljYWwgcmVzdWx0cyBmb3IgaWRlbnRpY2FsIGFyZ3VtZW50cworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBOYXRpdmVGdW5jdGlvbiB3aXRoTGVnYWN5TmFtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbmFtZSgpLm5hbWU7CisgICAgICAgICAgICByZXR1cm4gbmFtZS5jb250YWlucygiY3VycmVudCIpID8gbmV3IE5vd0Z1bmN0aW9uKFN0cmluZ1V0aWxzLnJlbW92ZShuYW1lLCAnXycpLCB0eXBlKSA6IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hdGl2ZUZ1bmN0aW9uIG1pblRpbWV1dWlkRmN0ID0gbmV3IE1pblRpbWV1dWlkRnVuY3Rpb24oZmFsc2UpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTWluVGltZXV1aWRGdW5jdGlvbiBleHRlbmRzIE5hdGl2ZVNjYWxhckZ1bmN0aW9uCiAgICAgeworICAgICAgICBwdWJsaWMgTWluVGltZXV1aWRGdW5jdGlvbihib29sZWFuIGxlZ2FjeSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIobGVnYWN5ID8gIm1pbnRpbWV1dWlkIiA6ICJtaW5fdGltZXV1aWQiLCBUaW1lVVVJRFR5cGUuaW5zdGFuY2UsIFRpbWVzdGFtcFR5cGUuaW5zdGFuY2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQogICAgICAgICB7CiAgICAgICAgICAgICBCeXRlQnVmZmVyIGJiID0gcGFyYW1ldGVycy5nZXQoMCk7CkBAIC05NSwxMCArMTEwLDI0IEBACiAKICAgICAgICAgICAgIHJldHVybiBUaW1lVVVJRC5taW5BdFVuaXhNaWxsaXMoVGltZXN0YW1wVHlwZS5pbnN0YW5jZS5jb21wb3NlKGJiKS5nZXRUaW1lKCkpLnRvQnl0ZXMoKTsKICAgICAgICAgfQotICAgIH07CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEZ1bmN0aW9uIG1heFRpbWV1dWlkRmN0ID0gbmV3IE5hdGl2ZVNjYWxhckZ1bmN0aW9uKCJtYXh0aW1ldXVpZCIsIFRpbWVVVUlEVHlwZS5pbnN0YW5jZSwgVGltZXN0YW1wVHlwZS5pbnN0YW5jZSkKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBOYXRpdmVGdW5jdGlvbiB3aXRoTGVnYWN5TmFtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWluVGltZXV1aWRGdW5jdGlvbih0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmF0aXZlRnVuY3Rpb24gbWF4VGltZXV1aWRGY3QgPSBuZXcgTWF4VGltZXV1aWRGdW5jdGlvbihmYWxzZSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNYXhUaW1ldXVpZEZ1bmN0aW9uIGV4dGVuZHMgTmF0aXZlU2NhbGFyRnVuY3Rpb24KICAgICB7CisgICAgICAgIHB1YmxpYyBNYXhUaW1ldXVpZEZ1bmN0aW9uKGJvb2xlYW4gbGVnYWN5KQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihsZWdhY3kgPyAibWF4dGltZXV1aWQiIDogIm1heF90aW1ldXVpZCIsIFRpbWVVVUlEVHlwZS5pbnN0YW5jZSwgVGltZXN0YW1wVHlwZS5pbnN0YW5jZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhlY3V0ZShQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCiAgICAgICAgIHsKICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBwYXJhbWV0ZXJzLmdldCgwKTsKQEAgLTEwNywxMzcgKzEzNiwxNDYgQEAKIAogICAgICAgICAgICAgcmV0dXJuIFRpbWVVVUlELm1heEF0VW5peE1pbGxpcyhUaW1lc3RhbXBUeXBlLmluc3RhbmNlLmNvbXBvc2UoYmIpLmdldFRpbWUoKSkudG9CeXRlcygpOwogICAgICAgICB9Ci0gICAgfTsKIAotICAgIC8qKgotICAgICAqIEZ1bmN0aW9uIHRoYXQgY29udmVydCBhIHZhbHVlIG9mIDxjb2RlPlRJTUVVVUlEPC9jb2RlPiBpbnRvIGEgdmFsdWUgb2YgdHlwZSA8Y29kZT5USU1FU1RBTVA8L2NvZGU+LgotICAgICAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IHRoZSB7QGxpbmsgI3RvVGltZXN0YW1wfSBmdW5jdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmF0aXZlU2NhbGFyRnVuY3Rpb24gZGF0ZU9mRmN0ID0gbmV3IE5hdGl2ZVNjYWxhckZ1bmN0aW9uKCJkYXRlb2YiLCBUaW1lc3RhbXBUeXBlLmluc3RhbmNlLCBUaW1lVVVJRFR5cGUuaW5zdGFuY2UpCi0gICAgewotICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gaGFzTG9nZ2VkRGVwcmVjYXRpb25XYXJuaW5nOwotCi0gICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE5hdGl2ZUZ1bmN0aW9uIHdpdGhMZWdhY3lOYW1lKCkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKCFoYXNMb2dnZWREZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaGFzTG9nZ2VkRGVwcmVjYXRpb25XYXJuaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiVGhlIGZ1bmN0aW9uICdkYXRlb2YnIGlzIGRlcHJlY2F0ZWQuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBVc2UgdGhlIGZ1bmN0aW9uICd0b1RpbWVzdGFtcCcgaW5zdGVhZC4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IHBhcmFtZXRlcnMuZ2V0KDApOwotICAgICAgICAgICAgaWYgKGJiID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIGxvbmcgdGltZUluTWlsbGlzID0gVGltZVVVSUQuZGVzZXJpYWxpemUoYmIpLnVuaXgoTUlMTElTRUNPTkRTKTsKLSAgICAgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcyh0aW1lSW5NaWxsaXMpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXhUaW1ldXVpZEZ1bmN0aW9uKHRydWUpOwogICAgICAgICB9Ci0gICAgfTsKKyAgICB9CiAKICAgICAvKioKLSAgICAgKiBGdW5jdGlvbiB0aGF0IGNvbnZlcnQgYSB2YWx1ZSBvZiB0eXBlIDxjb2RlPlRJTUVVVUlEPC9jb2RlPiBpbnRvIGFuIFVOSVggdGltZXN0YW1wLgotICAgICAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IHRoZSB7QGxpbmsgI3RvVW5peFRpbWVzdGFtcH0gZnVuY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hdGl2ZVNjYWxhckZ1bmN0aW9uIHVuaXhUaW1lc3RhbXBPZkZjdCA9IG5ldyBOYXRpdmVTY2FsYXJGdW5jdGlvbigidW5peHRpbWVzdGFtcG9mIiwgTG9uZ1R5cGUuaW5zdGFuY2UsIFRpbWVVVUlEVHlwZS5pbnN0YW5jZSkKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBoYXNMb2dnZWREZXByZWNhdGlvbldhcm5pbmc7Ci0KLSAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhlY3V0ZShQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghaGFzTG9nZ2VkRGVwcmVjYXRpb25XYXJuaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhhc0xvZ2dlZERlcHJlY2F0aW9uV2FybmluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIlRoZSBmdW5jdGlvbiAndW5peHRpbWVzdGFtcG9mJyBpcyBkZXByZWNhdGVkLiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVXNlIHRoZSBmdW5jdGlvbiAndG9Vbml4VGltZXN0YW1wJyBpbnN0ZWFkLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBCeXRlQnVmZmVyIGJiID0gcGFyYW1ldGVycy5nZXQoMCk7Ci0gICAgICAgICAgICBpZiAoYmIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKFRpbWVVVUlELmRlc2VyaWFsaXplKGJiKS51bml4KE1JTExJU0VDT05EUykpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgLyoqCi0gICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBjb252ZXJ0IGEgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGludG8gYSA8Y29kZT5EQVRFPC9jb2RlPi4KLSAgICAqIEBwYXJhbSB0eXBlIHRoZSB0ZW1wb3JhbCB0eXBlCi0gICAgKiBAcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjb252ZXJ0IGEgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGludG8gYSA8Y29kZT5EQVRFPC9jb2RlPi4KLSAgICAqLwotICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYXRpdmVTY2FsYXJGdW5jdGlvbiB0b0RhdGUoZmluYWwgVGVtcG9yYWxUeXBlPD8+IHR5cGUpCi0gICB7Ci0gICAgICAgcmV0dXJuIG5ldyBOYXRpdmVTY2FsYXJGdW5jdGlvbigidG9kYXRlIiwgU2ltcGxlRGF0ZVR5cGUuaW5zdGFuY2UsIHR5cGUpCi0gICAgICAgewotICAgICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleGVjdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1ldGVycykKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IHBhcmFtZXRlcnMuZ2V0KDApOwotICAgICAgICAgICAgICAgaWYgKGJiID09IG51bGwgfHwgIWJiLmhhc1JlbWFpbmluZygpKQotICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICAgICBsb25nIG1pbGxpcyA9IHR5cGUudG9UaW1lSW5NaWxsaXMoYmIpOwotICAgICAgICAgICAgICAgcmV0dXJuIFNpbXBsZURhdGVUeXBlLmluc3RhbmNlLmZyb21UaW1lSW5NaWxsaXMobWlsbGlzKTsKLSAgICAgICAgICAgfQotCi0gICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc01vbm90b25pYygpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICB9Ci0gICAgICAgfTsKLSAgIH0KLQotICAgLyoqCi0gICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBjb252ZXJ0IGEgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGludG8gYSA8Y29kZT5USU1FU1RBTVA8L2NvZGU+LgotICAgICogQHBhcmFtIHR5cGUgdGhlIHRlbXBvcmFsIHR5cGUKLSAgICAqIEByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGNvbnZlcnQgYSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgaW50byBhIDxjb2RlPlRJTUVTVEFNUDwvY29kZT4uCi0gICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmF0aXZlU2NhbGFyRnVuY3Rpb24gdG9UaW1lc3RhbXAoZmluYWwgVGVtcG9yYWxUeXBlPD8+IHR5cGUpCi0gICB7Ci0gICAgICAgcmV0dXJuIG5ldyBOYXRpdmVTY2FsYXJGdW5jdGlvbigidG90aW1lc3RhbXAiLCBUaW1lc3RhbXBUeXBlLmluc3RhbmNlLCB0eXBlKQotICAgICAgIHsKLSAgICAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhlY3V0ZShQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBwYXJhbWV0ZXJzLmdldCgwKTsKLSAgICAgICAgICAgICAgIGlmIChiYiA9PSBudWxsIHx8ICFiYi5oYXNSZW1haW5pbmcoKSkKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgICAgbG9uZyBtaWxsaXMgPSB0eXBlLnRvVGltZUluTWlsbGlzKGJiKTsKLSAgICAgICAgICAgICAgIHJldHVybiBUaW1lc3RhbXBUeXBlLmluc3RhbmNlLmZyb21UaW1lSW5NaWxsaXMobWlsbGlzKTsKLSAgICAgICAgICAgfQotCi0gICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc01vbm90b25pYygpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICB9Ci0gICAgICAgfTsKLSAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNvbnZlcnQgYSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgaW50byBhbiBVTklYIHRpbWVzdGFtcC4KKyAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBhIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBpbnRvIGEge0Bjb2RlIERBVEV9LgorICAgICAqCiAgICAgICogQHBhcmFtIHR5cGUgdGhlIHRlbXBvcmFsIHR5cGUKLSAgICAgKiBAcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjb252ZXJ0IGEgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGludG8gYW4gVU5JWCB0aW1lc3RhbXAuCisgICAgICogQHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgY29udmVydCBhIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBpbnRvIGEgPGNvZGU+REFURTwvY29kZT4uCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYXRpdmVTY2FsYXJGdW5jdGlvbiB0b1VuaXhUaW1lc3RhbXAoZmluYWwgVGVtcG9yYWxUeXBlPD8+IHR5cGUpCisgICAgcHVibGljIHN0YXRpYyBOYXRpdmVTY2FsYXJGdW5jdGlvbiB0b0RhdGUoVGVtcG9yYWxUeXBlPD8+IHR5cGUpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZVNjYWxhckZ1bmN0aW9uKCJ0b3VuaXh0aW1lc3RhbXAiLCBMb25nVHlwZS5pbnN0YW5jZSwgdHlwZSkKKyAgICAgICAgcmV0dXJuIG5ldyBUb0RhdGVGdW5jdGlvbih0eXBlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVG9EYXRlRnVuY3Rpb24gZXh0ZW5kcyBOYXRpdmVTY2FsYXJGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUZW1wb3JhbFR5cGU8Pz4gdHlwZTsKKworICAgICAgICBwdWJsaWMgVG9EYXRlRnVuY3Rpb24oVGVtcG9yYWxUeXBlPD8+IHR5cGUsIGJvb2xlYW4gdXNlTGVnYWN5TmFtZSkKICAgICAgICAgewotICAgICAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhlY3V0ZShQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IHBhcmFtZXRlcnMuZ2V0KDApOwotICAgICAgICAgICAgICAgIGlmIChiYiA9PSBudWxsIHx8ICFiYi5oYXNSZW1haW5pbmcoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBzdXBlcih1c2VMZWdhY3lOYW1lID8gInRvZGF0ZSIgOiAidG9fZGF0ZSIsIFNpbXBsZURhdGVUeXBlLmluc3RhbmNlLCB0eXBlKTsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcyh0eXBlLnRvVGltZUluTWlsbGlzKGJiKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleGVjdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1ldGVycykKKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IHBhcmFtZXRlcnMuZ2V0KDApOworICAgICAgICAgICAgaWYgKGJiID09IG51bGwgfHwgIWJiLmhhc1JlbWFpbmluZygpKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTW9ub3RvbmljKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKKyAgICAgICAgICAgIGxvbmcgbWlsbGlzID0gdHlwZS50b1RpbWVJbk1pbGxpcyhiYik7CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlRGF0ZVR5cGUuaW5zdGFuY2UuZnJvbVRpbWVJbk1pbGxpcyhtaWxsaXMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTW9ub3RvbmljKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE5hdGl2ZUZ1bmN0aW9uIHdpdGhMZWdhY3lOYW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUb0RhdGVGdW5jdGlvbih0eXBlLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGEgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGludG8gYSB7QGNvZGUgVElNRVNUQU1QfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0ZW1wb3JhbCB0eXBlCisgICAgICogQHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgY29udmVydCBhIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBpbnRvIGEge0Bjb2RlIFRJTUVTVEFNUH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOYXRpdmVTY2FsYXJGdW5jdGlvbiB0b1RpbWVzdGFtcChUZW1wb3JhbFR5cGU8Pz4gdHlwZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVG9UaW1lc3RhbXBGdW5jdGlvbih0eXBlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVG9UaW1lc3RhbXBGdW5jdGlvbiBleHRlbmRzIE5hdGl2ZVNjYWxhckZ1bmN0aW9uCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIFRlbXBvcmFsVHlwZTw/PiB0eXBlOworCisgICAgICAgIHB1YmxpYyBUb1RpbWVzdGFtcEZ1bmN0aW9uKFRlbXBvcmFsVHlwZTw/PiB0eXBlLCBib29sZWFuIHVzZUxlZ2FjeU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKHVzZUxlZ2FjeU5hbWUgPyAidG90aW1lc3RhbXAiIDogInRvX3RpbWVzdGFtcCIsIFRpbWVzdGFtcFR5cGUuaW5zdGFuY2UsIHR5cGUpOworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleGVjdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1ldGVycykKKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IHBhcmFtZXRlcnMuZ2V0KDApOworICAgICAgICAgICAgaWYgKGJiID09IG51bGwgfHwgIWJiLmhhc1JlbWFpbmluZygpKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBsb25nIG1pbGxpcyA9IHR5cGUudG9UaW1lSW5NaWxsaXMoYmIpOworICAgICAgICAgICAgcmV0dXJuIFRpbWVzdGFtcFR5cGUuaW5zdGFuY2UuZnJvbVRpbWVJbk1pbGxpcyhtaWxsaXMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTW9ub3RvbmljKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE5hdGl2ZUZ1bmN0aW9uIHdpdGhMZWdhY3lOYW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUb1RpbWVzdGFtcEZ1bmN0aW9uKHR5cGUsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgYSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgaW50byBhIFVOSVggdGltZXN0YW1wLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgdGhlIHRlbXBvcmFsIHR5cGUKKyAgICAgKiBAcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjb252ZXJ0IGEgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGludG8gYSBVTklYIHRpbWVzdGFtcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE5hdGl2ZVNjYWxhckZ1bmN0aW9uIHRvVW5peFRpbWVzdGFtcChUZW1wb3JhbFR5cGU8Pz4gdHlwZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVG9Vbml4VGltZXN0YW1wRnVuY3Rpb24odHlwZSwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRvVW5peFRpbWVzdGFtcEZ1bmN0aW9uIGV4dGVuZHMgTmF0aXZlU2NhbGFyRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgVGVtcG9yYWxUeXBlPD8+IHR5cGU7CisKKyAgICAgICAgcHJpdmF0ZSBUb1VuaXhUaW1lc3RhbXBGdW5jdGlvbihUZW1wb3JhbFR5cGU8Pz4gdHlwZSwgYm9vbGVhbiB1c2VMZWdhY3lOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcih1c2VMZWdhY3lOYW1lID8gInRvdW5peHRpbWVzdGFtcCIgOiAidG9fdW5peF90aW1lc3RhbXAiLCBMb25nVHlwZS5pbnN0YW5jZSwgdHlwZSk7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBCeXRlQnVmZmVyIGJiID0gcGFyYW1ldGVycy5nZXQoMCk7CisgICAgICAgICAgICBpZiAoYmIgPT0gbnVsbCB8fCAhYmIuaGFzUmVtYWluaW5nKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcyh0eXBlLnRvVGltZUluTWlsbGlzKGJiKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNNb25vdG9uaWMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTmF0aXZlRnVuY3Rpb24gd2l0aExlZ2FjeU5hbWUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRvVW5peFRpbWVzdGFtcEZ1bmN0aW9uKHR5cGUsIHRydWUpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDUsMTQgKzI4MywxNCBAQAogICAgICAqLwogICAgICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBGbG9vckZ1bmN0aW9uIGV4dGVuZHMgTmF0aXZlU2NhbGFyRnVuY3Rpb24KICAgICAgewotICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9uZyBaRVJPID0gTG9uZy52YWx1ZU9mKDApOworICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9uZyBaRVJPID0gMEw7CiAKICAgICAgICAgIHByb3RlY3RlZCBGbG9vckZ1bmN0aW9uKEFic3RyYWN0VHlwZTw/PiByZXR1cm5UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+Li4uIGFyZ3NUeXBlKQogICAgICAgICAgewogICAgICAgICAgICAgIHN1cGVyKCJmbG9vciIsIHJldHVyblR5cGUsIGFyZ3NUeXBlKTsKICAgICAgICAgICAgICAvLyBUaGUgZnVuY3Rpb24gY2FuIGFjY2VwdCBlaXRoZXIgMiBwYXJhbWV0ZXJzICh0aW1lIGFuZCBkdXJhdGlvbikgb3IgMyBwYXJhbWV0ZXJzICh0aW1lLCBkdXJhdGlvbiBhbmQgc3RhcnRUaW1lKXIKLSAgICAgICAgICAgICBhc3NlcnQgYXJnc1R5cGUubGVuZ3RoID09IDIgfHwgYXJnc1R5cGUubGVuZ3RoID09IDM7IAorICAgICAgICAgICAgIGFzc2VydCBhcmdzVHlwZS5sZW5ndGggPT0gMiB8fCBhcmdzVHlwZS5sZW5ndGggPT0gMzsKICAgICAgICAgIH0KIAogICAgICAgICAgQE92ZXJyaWRlCkBAIC01MDksNCArNTQ3LDMgQEAKICAgICAgICAgIH0KICAgICAgfTsKICB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1RvSnNvbkZjdC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVG9Kc29uRmN0LmphdmEKaW5kZXggZDBmMmIwYi4uOGRkN2ZkNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVG9Kc29uRmN0LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVG9Kc29uRmN0LmphdmEKQEAgLTI4LDM5ICsyOCw1OSBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CiAKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CisKIHB1YmxpYyBjbGFzcyBUb0pzb25GY3QgZXh0ZW5kcyBOYXRpdmVTY2FsYXJGdW5jdGlvbgogewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRnVuY3Rpb25OYW1lIE5BTUUgPSBGdW5jdGlvbk5hbWUubmF0aXZlRnVuY3Rpb24oInRvanNvbiIpOwotCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEFic3RyYWN0VHlwZTw/PiwgVG9Kc29uRmN0PiBpbnN0YW5jZXMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOwogCi0gICAgcHVibGljIHN0YXRpYyBUb0pzb25GY3QgZ2V0SW5zdGFuY2UoTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzKSB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KKyAgICBwdWJsaWMgc3RhdGljIFRvSnNvbkZjdCBnZXRJbnN0YW5jZShTdHJpbmcgbmFtZSwgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzKSB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KICAgICB7CiAgICAgICAgIGlmIChhcmdUeXBlcy5zaXplKCkgIT0gMSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJ0b0pzb24oKSBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50IChnb3QgJWQpIiwgYXJnVHlwZXMuc2l6ZSgpKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oZm9ybWF0KCIlcygpIG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQgKGdvdCAlZCkiLCBuYW1lLCBhcmdUeXBlcy5zaXplKCkpKTsKIAogICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gZnJvbVR5cGUgPSBhcmdUeXBlcy5nZXQoMCk7CiAgICAgICAgIFRvSnNvbkZjdCBmdW5jID0gaW5zdGFuY2VzLmdldChmcm9tVHlwZSk7CiAgICAgICAgIGlmIChmdW5jID09IG51bGwpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZ1bmMgPSBuZXcgVG9Kc29uRmN0KGZyb21UeXBlKTsKKyAgICAgICAgICAgIGZ1bmMgPSBuZXcgVG9Kc29uRmN0KG5hbWUsIGZyb21UeXBlKTsKICAgICAgICAgICAgIGluc3RhbmNlcy5wdXQoZnJvbVR5cGUsIGZ1bmMpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmdW5jOwogICAgIH0KIAotICAgIHByaXZhdGUgVG9Kc29uRmN0KEFic3RyYWN0VHlwZTw/PiBhcmdUeXBlKQorICAgIHByaXZhdGUgVG9Kc29uRmN0KFN0cmluZyBuYW1lLCBBYnN0cmFjdFR5cGU8Pz4gYXJnVHlwZSkKICAgICB7Ci0gICAgICAgIHN1cGVyKCJ0b2pzb24iLCBVVEY4VHlwZS5pbnN0YW5jZSwgYXJnVHlwZSk7CisgICAgICAgIHN1cGVyKG5hbWUsIFVURjhUeXBlLmluc3RhbmNlLCBhcmdUeXBlKTsKICAgICB9CiAKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleGVjdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1ldGVycykgdGhyb3dzIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uCiAgICAgewotICAgICAgICBhc3NlcnQgcGFyYW1ldGVycy5zaXplKCkgPT0gMSA6ICJFeHBlY3RlZCAxIGFyZ3VtZW50IGZvciB0b0pzb24oKSwgYnV0IGdvdCAiICsgcGFyYW1ldGVycy5zaXplKCk7CisgICAgICAgIGFzc2VydCBwYXJhbWV0ZXJzLnNpemUoKSA9PSAxIDogZm9ybWF0KCJFeHBlY3RlZCAxIGFyZ3VtZW50IGZvciAlcygpLCBidXQgZ290ICVkIiwgbmFtZS5uYW1lLCBwYXJhbWV0ZXJzLnNpemUoKSk7CiAgICAgICAgIEJ5dGVCdWZmZXIgcGFyYW1ldGVyID0gcGFyYW1ldGVycy5nZXQoMCk7CiAgICAgICAgIGlmIChwYXJhbWV0ZXIgPT0gbnVsbCkKICAgICAgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcygibnVsbCIpOwogCiAgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcyhhcmdUeXBlcy5nZXQoMCkudG9KU09OU3RyaW5nKHBhcmFtZXRlciwgcHJvdG9jb2xWZXJzaW9uKSk7CiAgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEZ1bmN0aW9uc1RvKE5hdGl2ZUZ1bmN0aW9ucyBmdW5jdGlvbnMpCisgICAgeworICAgICAgICBmdW5jdGlvbnMuYWRkKG5ldyBGYWN0b3J5KCJ0b19qc29uIikpOworICAgICAgICBmdW5jdGlvbnMuYWRkKG5ldyBGYWN0b3J5KCJ0b2pzb24iKSk7IC8vIGRlcHJlY2F0ZWQgcHJlLTUuMCBuYW1lCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmFjdG9yeSBleHRlbmRzIEZ1bmN0aW9uRmFjdG9yeQorICAgIHsKKyAgICAgICAgcHVibGljIEZhY3RvcnkoU3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKG5hbWUsIEZ1bmN0aW9uUGFyYW1ldGVyLmFueVR5cGUoZmFsc2UpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgTmF0aXZlRnVuY3Rpb24gZG9HZXRPckNyZWF0ZUZ1bmN0aW9uKExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBhcmdUeXBlcywgQWJzdHJhY3RUeXBlPD8+IHJlY2VpdmVyVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFRvSnNvbkZjdC5nZXRJbnN0YW5jZShuYW1lLm5hbWUsIGFyZ1R5cGVzKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1Rva2VuRmN0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9Ub2tlbkZjdC5qYXZhCmluZGV4IGU5MzA4NGYuLmZiNjE4NWIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1Rva2VuRmN0LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVG9rZW5GY3QuamF2YQpAQCAtMjAsNyArMjAsOSBAQAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkFzc2lnbm1lbnRUZXN0YWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DQnVpbGRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKQEAgLTM3LDkgKzM5LDkgQEAKICAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIEFic3RyYWN0VHlwZVtdIGdldEtleVR5cGVzKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEpCisgICAgcHJpdmF0ZSBzdGF0aWMgQWJzdHJhY3RUeXBlPD8+W10gZ2V0S2V5VHlwZXMoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSkKICAgICB7Ci0gICAgICAgIEFic3RyYWN0VHlwZVtdIHR5cGVzID0gbmV3IEFic3RyYWN0VHlwZVttZXRhZGF0YS5wYXJ0aXRpb25LZXlDb2x1bW5zKCkuc2l6ZSgpXTsKKyAgICAgICAgQWJzdHJhY3RUeXBlPD8+W10gdHlwZXMgPSBuZXcgQWJzdHJhY3RUeXBlW21ldGFkYXRhLnBhcnRpdGlvbktleUNvbHVtbnMoKS5zaXplKCldOwogICAgICAgICBpbnQgaSA9IDA7CiAgICAgICAgIGZvciAoQ29sdW1uTWV0YWRhdGEgZGVmIDogbWV0YWRhdGEucGFydGl0aW9uS2V5Q29sdW1ucygpKQogICAgICAgICAgICAgdHlwZXNbaSsrXSA9IGRlZi50eXBlOwpAQCAtNTgsNCArNjAsMzcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbWV0YWRhdGEucGFydGl0aW9uZXIuZ2V0VG9rZW5GYWN0b3J5KCkudG9CeXRlQXJyYXkobWV0YWRhdGEucGFydGl0aW9uZXIuZ2V0VG9rZW4oYnVpbGRlci5idWlsZCgpLnNlcmlhbGl6ZUFzUGFydGl0aW9uS2V5KCkpKTsKICAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRnVuY3Rpb25zVG8oTmF0aXZlRnVuY3Rpb25zIGZ1bmN0aW9ucykKKyAgICB7CisgICAgICAgIGZ1bmN0aW9ucy5hZGQobmV3IEZ1bmN0aW9uRmFjdG9yeSgidG9rZW4iKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBOYXRpdmVGdW5jdGlvbiBnZXRPckNyZWF0ZUZ1bmN0aW9uKExpc3Q8PyBleHRlbmRzIEFzc2lnbm1lbnRUZXN0YWJsZT4gYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiByZWNlaXZlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVjZWl2ZXJLZXlzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWNlaXZlclRhYmxlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChyZWNlaXZlcktleXNwYWNlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbigiTm8gcmVjZWl2ZXIga2V5c3BhY2UgaGFzIGJlZW4gc3BlY2lmaWVkIGZvciBmdW5jdGlvbiAiICsgbmFtZSk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVjZWl2ZXJUYWJsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oIk5vIHJlY2VpdmVyIHRhYmxlIGhhcyBiZWVuIHNwZWNpZmllZCBmb3IgZnVuY3Rpb24gIiArIG5hbWUpOworCisgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSA9IFNjaGVtYS5pbnN0YW5jZS5nZXRUYWJsZU1ldGFkYXRhKHJlY2VpdmVyS2V5c3BhY2UsIHJlY2VpdmVyVGFibGUpOworICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiVGhlIHJlY2VpdmVyIHRhYmxlICVzLiVzIHNwZWNpZmllZCBieSBjYWxsIHRvICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnVuY3Rpb24gJXMgaGFzbid0IGJlZW4gZm91bmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlcktleXNwYWNlLCByZWNlaXZlclRhYmxlLCBuYW1lKSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuRmN0KG1ldGFkYXRhKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgTmF0aXZlRnVuY3Rpb24gZG9HZXRPckNyZWF0ZUZ1bmN0aW9uKExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBhcmdUeXBlcywgQWJzdHJhY3RUeXBlPD8+IHJlY2VpdmVyVHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIlNob3VsZCBiZSB1bnJlYWNoYWJsZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9VREFnZ3JlZ2F0ZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVURBZ2dyZWdhdGUuamF2YQppbmRleCBiNjg2MzI4Li42N2U5NmNkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9VREFnZ3JlZ2F0ZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1VEQWdncmVnYXRlLmphdmEKQEAgLTI2LDE0ICsyNiwxMyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DcWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuU2NoZW1hRWxlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy50eXBlcy5UeXBlQ29kZWM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Vc2VyVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuRGlmZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuRnVuY3Rpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Vc2VyRnVuY3Rpb25zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYWNpbmcuVHJhY2luZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogCkBAIC00NCw3ICs0Myw3IEBACiAvKioKICAqIEJhc2UgY2xhc3MgZm9yIHVzZXItZGVmaW5lZC1hZ2dyZWdhdGVzLgogICovCi1wdWJsaWMgY2xhc3MgVURBZ2dyZWdhdGUgZXh0ZW5kcyBBYnN0cmFjdEZ1bmN0aW9uIGltcGxlbWVudHMgQWdncmVnYXRlRnVuY3Rpb24sIFNjaGVtYUVsZW1lbnQKK3B1YmxpYyBjbGFzcyBVREFnZ3JlZ2F0ZSBleHRlbmRzIFVzZXJGdW5jdGlvbiBpbXBsZW1lbnRzIEFnZ3JlZ2F0ZUZ1bmN0aW9uCiB7CiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVURBZ2dyZWdhdGUuY2xhc3MpOwogCkBAIC05NSw3ICs5NCw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgVURGdW5jdGlvbiBmaW5kRnVuY3Rpb24oRnVuY3Rpb25OYW1lIHVkYU5hbWUsIENvbGxlY3Rpb248VURGdW5jdGlvbj4gZnVuY3Rpb25zLCBGdW5jdGlvbk5hbWUgbmFtZSwgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ3VtZW50cykKICAgICB7CiAgICAgICAgIHJldHVybiBmdW5jdGlvbnMuc3RyZWFtKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZiAtPiBmLm5hbWUoKS5lcXVhbHMobmFtZSkgJiYgRnVuY3Rpb25zLnR5cGVzTWF0Y2goZi5hcmdUeXBlcygpLCBhcmd1bWVudHMpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmIC0+IGYubmFtZSgpLmVxdWFscyhuYW1lKSAmJiBmLnR5cGVzTWF0Y2goYXJndW1lbnRzKSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kRmlyc3QoKQogICAgICAgICAgICAgICAgICAgICAgICAgLm9yRWxzZVRocm93KCgpIC0+IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlVuYWJsZSB0byBmaW5kIGZ1bmN0aW9uICVzIHJlZmVyZW5jZWQgYnkgVURBICVzIiwgbmFtZSwgdWRhTmFtZSkpKTsKICAgICB9CkBAIC0xNTAsMTEgKzE0OSw2IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIGlzTmF0aXZlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KICAgICBwdWJsaWMgU2NhbGFyRnVuY3Rpb24gc3RhdGVGdW5jdGlvbigpCiAgICAgewogICAgICAgICByZXR1cm4gc3RhdGVGdW5jdGlvbjsKQEAgLTMyOSw3ICszMjMsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaENvZGUobmFtZSwgRnVuY3Rpb25zLnR5cGVIYXNoQ29kZShhcmdUeXBlcyksIEZ1bmN0aW9ucy50eXBlSGFzaENvZGUocmV0dXJuVHlwZSksIHN0YXRlRnVuY3Rpb24sIGZpbmFsRnVuY3Rpb24sIHN0YXRlVHlwZSwgaW5pdGNvbmQpOworICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoQ29kZShuYW1lLCBVc2VyRnVuY3Rpb25zLnR5cGVIYXNoQ29kZShhcmdUeXBlcyksIFVzZXJGdW5jdGlvbnMudHlwZUhhc2hDb2RlKHJldHVyblR5cGUpLCBzdGF0ZUZ1bmN0aW9uLCBmaW5hbEZ1bmN0aW9uLCBzdGF0ZVR5cGUsIGluaXRjb25kKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1VERkJ5dGVDb2RlVmVyaWZpZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1VERkJ5dGVDb2RlVmVyaWZpZXIuamF2YQppbmRleCBhYjkxM2I0Li5lMGIxODA2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9VREZCeXRlQ29kZVZlcmlmaWVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVURGQnl0ZUNvZGVWZXJpZmllci5qYXZhCkBAIC0zNSw2ICszNSw4IEBACiBpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvcjsKIGltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzLkFTTV9CWVRFQ09ERV9WRVJTSU9OOworCiAvKioKICAqIFZlcmlmaWVzIEphdmEgVURGIGJ5dGUgY29kZS4KICAqIENoZWNrcyBmb3IgZGlzYWxsb3dlZCBtZXRob2QgY2FsbHMgKGUuZy4ge0Bjb2RlIE9iamVjdC5maW5hbGl6ZSgpfSksCkBAIC04NCw3ICs4Niw3IEBACiAgICAgewogICAgICAgICBTdHJpbmcgY2xzTmFtZVNsID0gY2xzTmFtZS5yZXBsYWNlKCcuJywgJy8nKTsKICAgICAgICAgU2V0PFN0cmluZz4gZXJyb3JzID0gbmV3IFRyZWVTZXQ8PigpOyAvLyBpdCdzIGEgVHJlZVNldCBmb3IgdW5pdCB0ZXN0cwotICAgICAgICBDbGFzc1Zpc2l0b3IgY2xhc3NWaXNpdG9yID0gbmV3IENsYXNzVmlzaXRvcihPcGNvZGVzLkFTTTcpCisgICAgICAgIENsYXNzVmlzaXRvciBjbGFzc1Zpc2l0b3IgPSBuZXcgQ2xhc3NWaXNpdG9yKEFTTV9CWVRFQ09ERV9WRVJTSU9OKQogICAgICAgICB7CiAgICAgICAgICAgICBwdWJsaWMgRmllbGRWaXNpdG9yIHZpc2l0RmllbGQoaW50IGFjY2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjLCBTdHJpbmcgc2lnbmF0dXJlLCBPYmplY3QgdmFsdWUpCiAgICAgICAgICAgICB7CkBAIC0xNjAsNyArMTYyLDcgQEAKIAogICAgICAgICBFeGVjdXRlSW1wbFZpc2l0b3IoU2V0PFN0cmluZz4gZXJyb3JzKQogICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihPcGNvZGVzLkFTTTcpOworICAgICAgICAgICAgc3VwZXIoQVNNX0JZVEVDT0RFX1ZFUlNJT04pOwogICAgICAgICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7CiAgICAgICAgIH0KIApAQCAtMjEwLDcgKzIxMiw3IEBACiAKICAgICAgICAgQ29uc3RydWN0b3JWaXNpdG9yKFNldDxTdHJpbmc+IGVycm9ycykKICAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoT3Bjb2Rlcy5BU003KTsKKyAgICAgICAgICAgIHN1cGVyKEFTTV9CWVRFQ09ERV9WRVJTSU9OKTsKICAgICAgICAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1VERkV4ZWN1dG9yU2VydmljZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVURGRXhlY3V0b3JTZXJ2aWNlLmphdmEKaW5kZXggM2I3NjMxZi4uMTk3MDU0NSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVURGRXhlY3V0b3JTZXJ2aWNlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVURGRXhlY3V0b3JTZXJ2aWNlLmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvckJhc2U7CiAKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlMTElTRUNPTkRTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlVERl9FWEVDVVRPUl9USFJFQURfS0VFUEFMSVZFX01TOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllcy5nZXRBdmFpbGFibGVQcm9jZXNzb3JzOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkJsb2NraW5nUXVldWVzLm5ld0Jsb2NraW5nUXVldWU7CiAKQEAgLTMzLDcgKzM0LDcgQEAKICAqLwogZmluYWwgY2xhc3MgVURGRXhlY3V0b3JTZXJ2aWNlIGV4dGVuZHMgVGhyZWFkUG9vbEV4ZWN1dG9yQmFzZQogewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLRUVQQUxJVkUgPSBJbnRlZ2VyLmdldEludGVnZXIoImNhc3NhbmRyYS51ZGZfZXhlY3V0b3JfdGhyZWFkX2tlZXBhbGl2ZV9tcyIsIDMwMDAwKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS0VFUEFMSVZFID0gVURGX0VYRUNVVE9SX1RIUkVBRF9LRUVQQUxJVkVfTVMuZ2V0SW50KCk7CiAKICAgICBwdWJsaWMgVURGRXhlY3V0b3JTZXJ2aWNlKE5hbWVkVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5LCBTdHJpbmcgam14UGF0aCkKICAgICB7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9VREZ1bmN0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9VREZ1bmN0aW9uLmphdmEKaW5kZXggNWVmMDY1Yi4uNTg0NTRhNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVURGdW5jdGlvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1VERnVuY3Rpb24uamF2YQpAQCAtNDYsNyArNDYsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Db2x1bW5JZGVudGlmaWVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ3FsQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlNjaGVtYUVsZW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMudHlwZXMuRGF0YVR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMudHlwZXMuVHlwZUNvZGVjOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwpAQCAtNjcsNyArNjYsNyBAQAogLyoqCiAgKiBCYXNlIGNsYXNzIGZvciBVc2VyIERlZmluZWQgRnVuY3Rpb25zLgogICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVURGdW5jdGlvbiBleHRlbmRzIEFic3RyYWN0RnVuY3Rpb24gaW1wbGVtZW50cyBTY2FsYXJGdW5jdGlvbiwgU2NoZW1hRWxlbWVudAorcHVibGljIGFic3RyYWN0IGNsYXNzIFVERnVuY3Rpb24gZXh0ZW5kcyBVc2VyRnVuY3Rpb24gaW1wbGVtZW50cyBTY2FsYXJGdW5jdGlvbgogewogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFVERnVuY3Rpb24uY2xhc3MpOwogCkBAIC0yNjcsMTMgKzI2Niw3IEBACiAgICAgewogICAgICAgICBhc3NlcnRVZGZzRW5hYmxlZChsYW5ndWFnZSk7CiAKLSAgICAgICAgc3dpdGNoIChsYW5ndWFnZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAiamF2YSI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXZhQmFzZWRVREZ1bmN0aW9uKG5hbWUsIGFyZ05hbWVzLCBhcmdUeXBlcywgcmV0dXJuVHlwZSwgY2FsbGVkT25OdWxsSW5wdXQsIGJvZHkpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdEJhc2VkVURGdW5jdGlvbihuYW1lLCBhcmdOYW1lcywgYXJnVHlwZXMsIHJldHVyblR5cGUsIGNhbGxlZE9uTnVsbElucHV0LCBsYW5ndWFnZSwgYm9keSk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBKYXZhQmFzZWRVREZ1bmN0aW9uKG5hbWUsIGFyZ05hbWVzLCBhcmdUeXBlcywgcmV0dXJuVHlwZSwgY2FsbGVkT25OdWxsSW5wdXQsIGJvZHkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDQ5LDggKzQ0Miw4IEBACiAgICAgewogICAgICAgICBpZiAoIURhdGFiYXNlRGVzY3JpcHRvci5lbmFibGVVc2VyRGVmaW5lZEZ1bmN0aW9ucygpKQogICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKCJVc2VyLWRlZmluZWQgZnVuY3Rpb25zIGFyZSBkaXNhYmxlZCBpbiBjYXNzYW5kcmEueWFtbCAtIHNldCB1c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQ9dHJ1ZSB0byBlbmFibGUiKTsKLSAgICAgICAgaWYgKCEiamF2YSIuZXF1YWxzSWdub3JlQ2FzZShsYW5ndWFnZSkgJiYgIURhdGFiYXNlRGVzY3JpcHRvci5lbmFibGVTY3JpcHRlZFVzZXJEZWZpbmVkRnVuY3Rpb25zKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oIlNjcmlwdGVkIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMgYXJlIGRpc2FibGVkIGluIGNhc3NhbmRyYS55YW1sIC0gc2V0IHNjcmlwdGVkX3VzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZD10cnVlIHRvIGVuYWJsZSBpZiB5b3UgYXJlIGF3YXJlIG9mIHRoZSBzZWN1cml0eSByaXNrcyIpOworICAgICAgICBpZiAoISJqYXZhIi5lcXVhbHNJZ25vcmVDYXNlKGxhbmd1YWdlKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbigiQ3VycmVudGx5IG9ubHkgSmF2YSBVREZzIGFyZSBhdmFpbGFibGUgaW4gQ2Fzc2FuZHJhLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiAtIENBU1NBTkRSQS0xODI1MiBhbmQgQ0FTU0FORFJBLTE3MjgxIik7CiAgICAgfQogCiAgICAgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZVRocmVhZCgpCkBAIC02MTcsMTEgKzYxMCw2IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc05hdGl2ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCiAgICAgcHVibGljIGJvb2xlYW4gaXNDYWxsZWRPbk51bGxJbnB1dCgpCiAgICAgewogICAgICAgICByZXR1cm4gY2FsbGVkT25OdWxsSW5wdXQ7CkBAIC02NDMsOCArNjMxLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBVc2VkIGJ5IFVERiBpbXBsZW1lbnRhdGlvbnMgKGJvdGggSmF2YSBjb2RlIGdlbmVyYXRlZCBieSB7QGxpbmsgSmF2YUJhc2VkVURGdW5jdGlvbn0KLSAgICAgKiBhbmQgc2NyaXB0IGV4ZWN1dG9yIHtAbGluayBTY3JpcHRCYXNlZFVERnVuY3Rpb259KSB0byBjb252ZXJ0IHRoZSBDKgorICAgICAqIFVzZWQgYnkgVURGIGltcGxlbWVudGF0aW9ucyAoYm90aCBKYXZhIGNvZGUgZ2VuZXJhdGVkIGJ5IHtAbGluayBKYXZhQmFzZWRVREZ1bmN0aW9ufSkgdG8gY29udmVydCB0aGUgQyoKICAgICAgKiBzZXJpYWxpemVkIHJlcHJlc2VudGF0aW9uIHRvIHRoZSBKYXZhIG9iamVjdCByZXByZXNlbnRhdGlvbi4KICAgICAgKgogICAgICAqIEBwYXJhbSBwcm90b2NvbFZlcnNpb24gdGhlIG5hdGl2ZSBwcm90b2NvbCB2ZXJzaW9uIHVzZWQgZm9yIHNlcmlhbGl6YXRpb24KQEAgLTY2MSw4ICs2NDgsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFVzZWQgYnkgVURGIGltcGxlbWVudGF0aW9ucyAoYm90aCBKYXZhIGNvZGUgZ2VuZXJhdGVkIGJ5IHtAbGluayBKYXZhQmFzZWRVREZ1bmN0aW9ufQotICAgICAqIGFuZCBzY3JpcHQgZXhlY3V0b3Ige0BsaW5rIFNjcmlwdEJhc2VkVURGdW5jdGlvbn0pIHRvIGNvbnZlcnQgdGhlIEphdmEKKyAgICAgKiBVc2VkIGJ5IFVERiBpbXBsZW1lbnRhdGlvbnMgKGJvdGggSmF2YSBjb2RlIGdlbmVyYXRlZCBieSB7QGxpbmsgSmF2YUJhc2VkVURGdW5jdGlvbn0pIHRvIGNvbnZlcnQgdGhlIEphdmEKICAgICAgKiBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIHRoZSByZXR1cm4gdmFsdWUgdG8gdGhlIEMqIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24uCiAgICAgICoKICAgICAgKiBAcGFyYW0gcHJvdG9jb2xWZXJzaW9uIHRoZSBuYXRpdmUgcHJvdG9jb2wgdmVyc2lvbiB1c2VkIGZvciBzZXJpYWxpemF0aW9uCkBAIC03NjAsNyArNzQ2LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBPYmplY3RzLmhhc2hDb2RlKG5hbWUsIEZ1bmN0aW9ucy50eXBlSGFzaENvZGUoYXJnVHlwZXMpLCBGdW5jdGlvbnMudHlwZUhhc2hDb2RlKHJldHVyblR5cGUpLCByZXR1cm5UeXBlLCBsYW5ndWFnZSwgYm9keSk7CisgICAgICAgIHJldHVybiBPYmplY3RzLmhhc2hDb2RlKG5hbWUsIFVzZXJGdW5jdGlvbnMudHlwZUhhc2hDb2RlKGFyZ1R5cGVzKSwgVXNlckZ1bmN0aW9ucy50eXBlSGFzaENvZGUocmV0dXJuVHlwZSksIHJldHVyblR5cGUsIGxhbmd1YWdlLCBib2R5KTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBVREZDbGFzc0xvYWRlciBleHRlbmRzIENsYXNzTG9hZGVyCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9Vc2VyRnVuY3Rpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1VzZXJGdW5jdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYTEwYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9Vc2VyRnVuY3Rpb24uamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlNjaGVtYUVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CisKKy8qKgorICogQSBub24tbmF0aXZlLCB1c2VyLWRlZmluZWQgZnVuY3Rpb24sIGxpa2UgVURGcyBhbmQgVURBcy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFVzZXJGdW5jdGlvbiBleHRlbmRzIEFic3RyYWN0RnVuY3Rpb24gaW1wbGVtZW50cyBTY2hlbWFFbGVtZW50Cit7CisgICAgcHVibGljIFVzZXJGdW5jdGlvbihGdW5jdGlvbk5hbWUgbmFtZSwgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzLCBBYnN0cmFjdFR5cGU8Pz4gcmV0dXJuVHlwZSkKKyAgICB7CisgICAgICAgIHN1cGVyKG5hbWUsIGFyZ1R5cGVzLCByZXR1cm5UeXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc05hdGl2ZSgpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVXVpZEZjdHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1V1aWRGY3RzLmphdmEKaW5kZXggM2Q4MmVjZS4uMDA4Mzg4MyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVXVpZEZjdHMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9VdWlkRmN0cy5qYXZhCkBAIC0yNiwxMiArMjYsMTIgQEAKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIFV1aWRGY3RzCiB7Ci0gICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPEZ1bmN0aW9uPiBhbGwoKQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGdW5jdGlvbnNUbyhOYXRpdmVGdW5jdGlvbnMgZnVuY3Rpb25zKQogICAgIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbih1dWlkRmN0KTsKKyAgICAgICAgZnVuY3Rpb25zLmFkZCh1dWlkRmN0KTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEZ1bmN0aW9uIHV1aWRGY3QgPSBuZXcgTmF0aXZlU2NhbGFyRnVuY3Rpb24oInV1aWQiLCBVVUlEVHlwZS5pbnN0YW5jZSkKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hdGl2ZUZ1bmN0aW9uIHV1aWRGY3QgPSBuZXcgTmF0aXZlU2NhbGFyRnVuY3Rpb24oInV1aWQiLCBVVUlEVHlwZS5pbnN0YW5jZSkKICAgICB7CiAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQogICAgICAgICB7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2suamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZDIyMjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2suamF2YQpAQCAtMCwwICsxLDMxNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlsczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Bc3NpZ25tZW50VGVzdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUwzVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNvbHVtbklkZW50aWZpZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DcWxCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVGVybTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlRlcm1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvblJlc29sdmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLlNjYWxhckZ1bmN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuUmV2ZXJzZWRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLlJlcXVlc3RWYWxpZGF0aW9ucy5pbnZhbGlkUmVxdWVzdDsKKworLyoqCisgKiBEeW5hbWljIGRhdGEgbWFzayB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgc2NoZW1hIGNvbHVtbi4KKyAqIDxwPgorICogSXQgY29uc2lzdHMgb24gYSBwYXJ0aWFsIGFwcGxpY2F0aW9uIG9mIGEgY2VydGFpbiB7QGxpbmsgTWFza2luZ0Z1bmN0aW9ufSB0byB0aGUgdmFsdWVzIG9mIGEgY29sdW1uLCB3aXRoIHRoZQorICogcHJlY29uZGl0aW9uIHRoYXQgdGhlIHR5cGUgb2YgYW55IG1hc2tlZCBjb2x1bW4gaXMgY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlIG9mIHRoZSBmaXJzdCBhcmd1bWVudCBvZiB0aGUgZnVuY3Rpb24uCisgKiA8cD4KKyAqIFRoaXMgcGFydGlhbCBhcHBsaWNhdGlvbiBpcyBtZWFudCB0byBiZSBhc3NvY2lhdGVkIHRvIHNwZWNpZmljIGNvbHVtbnMgaW4gdGhlIHNjaGVtYSwgYWN0aW5nIGFzIGEgbWFzayBmb3IgdGhlIHZhbHVlcworICogb2YgdGhvc2UgY29sdW1ucy4gSXQncyBhc3NvY2lhdGVkIHRvIHF1ZXJpZXMgc3VjaCBhczoKKyAqIDxwcmU+CisgKiAgICBDUkVBVEUgVEFCTEUgdCAoayBpbnQgUFJJTUFSWSBLRVksIHYgaW50IE1BU0tFRCBXSVRIIG1hc2tfaW5uZXIoMSwgMSkpOworICogICAgQUxURVIgVEFCTEUgdCBBTFRFUiB2IE1BU0tFRCBXSVRIIG1hc2tfaW5uZXIoMiwgMSk7CisgKiAgICBBTFRFUiBUQUJMRSB0IEFMVEVSIHYgRFJPUCBNQVNLRUQ7CisgKiA8L3ByZT4KKyAqIE5vdGUgdGhhdCBpbiB0aGUgZXhhbXBsZSBhYm92ZSB3ZSBhcmUgcmVmZXJlbmNpbmcgdGhlIHtAY29kZSBtYXNrX2lubmVyfSBmdW5jdGlvbiB3aXRoIHR3byBhcmd1bWVudHMuIEhvd2V2ZXIsIHRoYXQKKyAqIENRTCBmdW5jdGlvbiBhY3R1YWxseSBoYXMgdGhyZWUgYXJndW1lbnRzLiBUaGUgZmlyc3QgYXJndW1lbnQgaXMgYWx3YXlzIG9tbWl0dGVkIHdoZW4gYXR0YWNoaW5nIHRoZSBmdW5jdGlvbiB0byBhCisgKiBzY2hlbWEgY29sdW1uLiBUaGUgdmFsdWUgb2YgdGhhdCBmaXJzdCBhcmd1bWVudCBpcyBhbHdheXMgdGhlIHZhbHVlIG9mIHRoZSBtYXNrZWQgY29sdW1uLCBpbiB0aGlzIGNhc2UgYW4gaW50LgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29sdW1uTWFzaworeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0VSUk9SX01FU1NBR0UgPSAiQ2Fubm90IG1hc2sgY29sdW1ucyBiZWNhdXNlIGR5bmFtaWMgZGF0YSBtYXNraW5nIGlzIG5vdCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuYWJsZWQuIFlvdSBjYW4gZW5hYmxlIGl0IHdpdGggdGhlICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHluYW1pY19kYXRhX21hc2tpbmdfZW5hYmxlZCBwcm9wZXJ0eSBvbiBjYXNzYW5kcmEueWFtbCI7CisKKyAgICAvKiogVGhlIENRTCBmdW5jdGlvbiB1c2VkIGZvciBtYXNraW5nLiAqLworICAgIHB1YmxpYyBmaW5hbCBTY2FsYXJGdW5jdGlvbiBmdW5jdGlvbjsKKworICAgIC8qKiBUaGUgdmFsdWVzIG9mIHRoZSBhcmd1bWVudHMgb2YgdGhlIHBhcnRpYWxseSBhcHBsaWVkIG1hc2tpbmcgZnVuY3Rpb24uICovCisgICAgcHJvdGVjdGVkIGZpbmFsIEJ5dGVCdWZmZXJbXSBwYXJ0aWFsQXJndW1lbnRWYWx1ZXM7CisKKyAgICBwcml2YXRlIENvbHVtbk1hc2soU2NhbGFyRnVuY3Rpb24gZnVuY3Rpb24sIEJ5dGVCdWZmZXIuLi4gcGFydGlhbEFyZ3VtZW50VmFsdWVzKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGZ1bmN0aW9uLmFyZ1R5cGVzKCkuc2l6ZSgpID09IHBhcnRpYWxBcmd1bWVudFZhbHVlcy5sZW5ndGggKyAxOworICAgICAgICB0aGlzLmZ1bmN0aW9uID0gZnVuY3Rpb247CisgICAgICAgIHRoaXMucGFydGlhbEFyZ3VtZW50VmFsdWVzID0gcGFydGlhbEFyZ3VtZW50VmFsdWVzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ29sdW1uTWFzayBidWlsZChTY2FsYXJGdW5jdGlvbiBmdW5jdGlvbiwgQnl0ZUJ1ZmZlci4uLiBwYXJ0aWFsQXJndW1lbnRWYWx1ZXMpCisgICAgeworICAgICAgICByZXR1cm4gZnVuY3Rpb24uaXNOYXRpdmUoKQorICAgICAgICAgICAgICAgPyBuZXcgTmF0aXZlKChNYXNraW5nRnVuY3Rpb24pIGZ1bmN0aW9uLCBwYXJ0aWFsQXJndW1lbnRWYWx1ZXMpCisgICAgICAgICAgICAgICA6IG5ldyBDdXN0b20oZnVuY3Rpb24sIHBhcnRpYWxBcmd1bWVudFZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyBvZiB0aGUgcGFydGlhbGx5IGFwcGxpZWQgbWFza2luZyBmdW5jdGlvbiwgYXMgYW4gdW5tb2RpZmlhYmxlIGxpc3QuCisgICAgICovCisgICAgcHVibGljIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBwYXJ0aWFsQXJndW1lbnRUeXBlcygpCisgICAgeworICAgICAgICBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMgPSBmdW5jdGlvbi5hcmdUeXBlcygpOworICAgICAgICByZXR1cm4gYXJnVHlwZXMuc2l6ZSgpID09IDEKKyAgICAgICAgICAgICAgID8gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkKKyAgICAgICAgICAgICAgIDogQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChhcmdUeXBlcy5zdWJMaXN0KDEsIGFyZ1R5cGVzLnNpemUoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIHZhbHVlcyBvZiB0aGUgYXJndW1lbnRzIG9mIHRoZSBwYXJ0aWFsbHkgYXBwbGllZCBtYXNraW5nIGZ1bmN0aW9uLCBhcyBhbiB1bm1vZGlmaWFibGUgbGlzdCB0aGF0IGNhbgorICAgICAqIGNvbnRhaW4gbnVsbHMuCisgICAgICovCisgICAgcHVibGljIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFydGlhbEFyZ3VtZW50VmFsdWVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QocGFydGlhbEFyZ3VtZW50VmFsdWVzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBBIGNvcHkgb2YgdGhpcyBtYXNrIGZvciBhIHZlcnNpb24gb2YgaXRzIG1hc2tlZCBjb2x1bW4gdGhhdCBoYXMgaXRzIHR5cGUgcmV2ZXJzZWQuCisgICAgICovCisgICAgcHVibGljIENvbHVtbk1hc2sgd2l0aFJldmVyc2VkVHlwZSgpCisgICAgeworICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gcmV2ZXJzZWQgPSBSZXZlcnNlZFR5cGUuZ2V0SW5zdGFuY2UoZnVuY3Rpb24uYXJnVHlwZXMoKS5nZXQoMCkpOworICAgICAgICBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJncyA9IEltbXV0YWJsZUxpc3QuPEFic3RyYWN0VHlwZTw/Pj5idWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChyZXZlcnNlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEFsbChwYXJ0aWFsQXJndW1lbnRUeXBlcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgRnVuY3Rpb24gbmV3RnVuY3Rpb24gPSBGdW5jdGlvblJlc29sdmVyLmdldChmdW5jdGlvbi5uYW1lKCkua2V5c3BhY2UsIGZ1bmN0aW9uLm5hbWUoKSwgYXJncywgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIGFzc2VydCBuZXdGdW5jdGlvbiAhPSBudWxsOworICAgICAgICByZXR1cm4gYnVpbGQoKFNjYWxhckZ1bmN0aW9uKSBuZXdGdW5jdGlvbiwgcGFydGlhbEFyZ3VtZW50VmFsdWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcHJvdG9jb2xWZXJzaW9uIHRoZSB1c2VkIHZlcnNpb24gb2YgdGhlIHRyYW5zcG9ydCBwcm90b2NvbAorICAgICAqIEBwYXJhbSB2YWx1ZSBhIGNvbHVtbiB2YWx1ZSB0byBiZSBtYXNrZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBzcGVjaWZpZWQgdmFsdWUgYWZ0ZXIgaGF2aW5nIGJlZW4gbWFza2VkIGJ5IHRoZSBtYXNrZWQgZnVuY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBtYXNrKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIEJ5dGVCdWZmZXIgdmFsdWUpCisgICAgeworICAgICAgICBpZiAoIURhdGFiYXNlRGVzY3JpcHRvci5nZXREeW5hbWljRGF0YU1hc2tpbmdFbmFibGVkKCkpCisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisKKyAgICAgICAgcmV0dXJuIG1hc2tJbnRlcm5hbChwcm90b2NvbFZlcnNpb24sIHZhbHVlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQnl0ZUJ1ZmZlciBtYXNrSW50ZXJuYWwoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgQnl0ZUJ1ZmZlciB2YWx1ZSk7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZW5zdXJlRW5hYmxlZCgpCisgICAgeworICAgICAgICBpZiAoIURhdGFiYXNlRGVzY3JpcHRvci5nZXREeW5hbWljRGF0YU1hc2tpbmdFbmFibGVkKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oRElTQUJMRURfRVJST1JfTUVTU0FHRSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBDb2x1bW5NYXNrIG1hc2sgPSAoQ29sdW1uTWFzaykgbzsKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9uLm5hbWUoKS5lcXVhbHMobWFzay5mdW5jdGlvbi5uYW1lKCkpCisgICAgICAgICAgICAgICAmJiBBcnJheXMuZXF1YWxzKHBhcnRpYWxBcmd1bWVudFZhbHVlcywgbWFzay5wYXJ0aWFsQXJndW1lbnRWYWx1ZXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaChmdW5jdGlvbi5uYW1lKCksIEFycmF5cy5oYXNoQ29kZShwYXJ0aWFsQXJndW1lbnRWYWx1ZXMpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiB0eXBlcyA9IHBhcnRpYWxBcmd1bWVudFR5cGVzKCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBhcmd1bWVudHMgPSBuZXcgQXJyYXlMaXN0PD4odHlwZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5zaXplKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgQ1FMM1R5cGUgdHlwZSA9IHR5cGVzLmdldChpKS5hc0NRTDNUeXBlKCk7CisgICAgICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gcGFydGlhbEFyZ3VtZW50VmFsdWVzW2ldOworICAgICAgICAgICAgYXJndW1lbnRzLmFkZCh0eXBlLnRvQ1FMTGl0ZXJhbCh2YWx1ZSwgUHJvdG9jb2xWZXJzaW9uLkNVUlJFTlQpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZm9ybWF0KCIlcyglcykiLCBmdW5jdGlvbi5uYW1lKCksIFN0cmluZ1V0aWxzLmpvaW4oYXJndW1lbnRzLCAiLCAiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kQ3FsVG8oQ3FsQnVpbGRlciBidWlsZGVyKQorICAgIHsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIiBNQVNLRUQgV0lUSCAiKS5hcHBlbmQodG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0BsaW5rIENvbHVtbk1hc2t9IGZvciBuYXRpdmUgbWFza2luZyBmdW5jdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTmF0aXZlIGV4dGVuZHMgQ29sdW1uTWFzaworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXNraW5nRnVuY3Rpb24uTWFza2VyIG1hc2tlcjsKKworICAgICAgICBwdWJsaWMgTmF0aXZlKE1hc2tpbmdGdW5jdGlvbiBmdW5jdGlvbiwgQnl0ZUJ1ZmZlci4uLiBwYXJ0aWFsQXJndW1lbnRWYWx1ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGZ1bmN0aW9uLCBwYXJ0aWFsQXJndW1lbnRWYWx1ZXMpOworICAgICAgICAgICAgbWFza2VyID0gZnVuY3Rpb24ubWFza2VyKHBhcnRpYWxBcmd1bWVudFZhbHVlcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEJ5dGVCdWZmZXIgbWFza0ludGVybmFsKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIEJ5dGVCdWZmZXIgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtYXNrZXIubWFzayh2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgQ29sdW1uTWFza30gZm9yIHVzZXItZGVmaW5lZCBtYXNraW5nIGZ1bmN0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDdXN0b20gZXh0ZW5kcyBDb2x1bW5NYXNrCisgICAgeworICAgICAgICBwdWJsaWMgQ3VzdG9tKFNjYWxhckZ1bmN0aW9uIGZ1bmN0aW9uLCBCeXRlQnVmZmVyLi4uIHBhcnRpYWxBcmd1bWVudFZhbHVlcykKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZnVuY3Rpb24sIHBhcnRpYWxBcmd1bWVudFZhbHVlcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEJ5dGVCdWZmZXIgbWFza0ludGVybmFsKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIEJ5dGVCdWZmZXIgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gYXJndW1lbnRWYWx1ZXM7CisgICAgICAgICAgICBpbnQgbnVtUGFydGlhbEFyZ3MgPSBwYXJ0aWFsQXJndW1lbnRWYWx1ZXMubGVuZ3RoOworICAgICAgICAgICAgaWYgKG51bVBhcnRpYWxBcmdzID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXJndW1lbnRWYWx1ZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyW10gYXJncyA9IG5ldyBCeXRlQnVmZmVyW251bVBhcnRpYWxBcmdzICsgMV07CisgICAgICAgICAgICAgICAgYXJnc1swXSA9IHZhbHVlOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocGFydGlhbEFyZ3VtZW50VmFsdWVzLCAwLCBhcmdzLCAxLCBudW1QYXJ0aWFsQXJncyk7CisgICAgICAgICAgICAgICAgYXJndW1lbnRWYWx1ZXMgPSBBcnJheXMuYXNMaXN0KGFyZ3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24uZXhlY3V0ZShwcm90b2NvbFZlcnNpb24sIGFyZ3VtZW50VmFsdWVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgcGFyc2VkIGJ1dCBub3QgcHJlcGFyZWQgY29sdW1uIG1hc2suCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBjbGFzcyBSYXcKKyAgICB7CisgICAgICAgIHB1YmxpYyBmaW5hbCBGdW5jdGlvbk5hbWUgbmFtZTsKKyAgICAgICAgcHVibGljIGZpbmFsIExpc3Q8VGVybS5SYXc+IHJhd1BhcnRpYWxBcmd1bWVudHM7CisKKyAgICAgICAgcHVibGljIFJhdyhGdW5jdGlvbk5hbWUgbmFtZSwgTGlzdDxUZXJtLlJhdz4gcmF3UGFydGlhbEFyZ3VtZW50cykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIHRoaXMucmF3UGFydGlhbEFyZ3VtZW50cyA9IHJhd1BhcnRpYWxBcmd1bWVudHM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29sdW1uTWFzayBwcmVwYXJlKFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlLCBDb2x1bW5JZGVudGlmaWVyIGNvbHVtbiwgQWJzdHJhY3RUeXBlPD8+IHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjYWxhckZ1bmN0aW9uIGZ1bmN0aW9uID0gZmluZE1hc2tpbmdGdW5jdGlvbihrZXlzcGFjZSwgdGFibGUsIGNvbHVtbiwgdHlwZSk7CisgICAgICAgICAgICBCeXRlQnVmZmVyW10gcGFydGlhbEFyZ3VtZW50cyA9IHByZXBhcmVQYXJ0aWFsQXJndW1lbnRzKGtleXNwYWNlLCBmdW5jdGlvbik7CisgICAgICAgICAgICByZXR1cm4gQ29sdW1uTWFzay5idWlsZChmdW5jdGlvbiwgcGFydGlhbEFyZ3VtZW50cyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFNjYWxhckZ1bmN0aW9uIGZpbmRNYXNraW5nRnVuY3Rpb24oU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUsIENvbHVtbklkZW50aWZpZXIgY29sdW1uLCBBYnN0cmFjdFR5cGU8Pz4gdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxBc3NpZ25tZW50VGVzdGFibGU+IGFyZ3MgPSBuZXcgQXJyYXlMaXN0PD4ocmF3UGFydGlhbEFyZ3VtZW50cy5zaXplKCkgKyAxKTsKKyAgICAgICAgICAgIGFyZ3MuYWRkKHR5cGUpOworICAgICAgICAgICAgYXJncy5hZGRBbGwocmF3UGFydGlhbEFyZ3VtZW50cyk7CisKKyAgICAgICAgICAgIEZ1bmN0aW9uIGZ1bmN0aW9uID0gRnVuY3Rpb25SZXNvbHZlci5nZXQoa2V5c3BhY2UsIG5hbWUsIGFyZ3MsIGtleXNwYWNlLCB0YWJsZSwgdHlwZSk7CisKKyAgICAgICAgICAgIGlmIChmdW5jdGlvbiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IGludmFsaWRSZXF1ZXN0KCJVbmFibGUgdG8gZmluZCBtYXNraW5nIGZ1bmN0aW9uIGZvciAlcywgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vIGRlY2xhcmVkIGZ1bmN0aW9uIG1hdGNoZXMgdGhlIHNpZ25hdHVyZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLCB0aGlzKTsKKworICAgICAgICAgICAgaWYgKGZ1bmN0aW9uLmlzQWdncmVnYXRlKCkpCisgICAgICAgICAgICAgICAgdGhyb3cgaW52YWxpZFJlcXVlc3QoIkFnZ3JlZ2F0ZSBmdW5jdGlvbiAlcyBjYW5ub3QgYmUgdXNlZCBmb3IgbWFza2luZyB0YWJsZSBjb2x1bW5zIiwgdGhpcyk7CisKKyAgICAgICAgICAgIGlmIChmdW5jdGlvbi5pc05hdGl2ZSgpICYmICEoZnVuY3Rpb24gaW5zdGFuY2VvZiBNYXNraW5nRnVuY3Rpb24pKQorICAgICAgICAgICAgICAgIHRocm93IGludmFsaWRSZXF1ZXN0KCJOb3QtbWFza2luZyBmdW5jdGlvbiAlcyBjYW5ub3QgYmUgdXNlZCBmb3IgbWFza2luZyB0YWJsZSBjb2x1bW5zIiwgdGhpcyk7CisKKyAgICAgICAgICAgIGlmICghZnVuY3Rpb24uaXNOYXRpdmUoKSAmJiAhZnVuY3Rpb24ubmFtZSgpLmtleXNwYWNlLmVxdWFscyhrZXlzcGFjZSkpCisgICAgICAgICAgICAgICAgdGhyb3cgaW52YWxpZFJlcXVlc3QoIk1hc2tpbmcgZnVuY3Rpb24gJXMgZG9lc24ndCBiZWxvbmcgdG8gdGhlIHNhbWUga2V5c3BhY2UgYXMgdGhlIHRhYmxlICVzLiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBrZXlzcGFjZSwgdGFibGUpOworCisgICAgICAgICAgICBDUUwzVHlwZSByZXR1cm5UeXBlID0gZnVuY3Rpb24ucmV0dXJuVHlwZSgpLmFzQ1FMM1R5cGUoKTsKKyAgICAgICAgICAgIENRTDNUeXBlIGV4cGVjdGVkVHlwZSA9IHR5cGUuYXNDUUwzVHlwZSgpOworICAgICAgICAgICAgaWYgKCFyZXR1cm5UeXBlLmVxdWFscyhleHBlY3RlZFR5cGUpKQorICAgICAgICAgICAgICAgIHRocm93IGludmFsaWRSZXF1ZXN0KCJNYXNraW5nIGZ1bmN0aW9uICVzIHJldHVybiB0eXBlIGlzICVzLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyBkaWZmZXJlbnQgdG8gdGhlIHR5cGUgb2YgdGhlIG1hc2tlZCBjb2x1bW4gJXMgb2YgdHlwZSAlcy4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hc2tpbmcgZnVuY3Rpb25zIGNhbiBvbmx5IGJlIGF0dGFjaGVkIHRvIHRhYmxlIGNvbHVtbnMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlmIHRoZXkgcmV0dXJuIHRoZSBzYW1lIGRhdGEgdHlwZSBhcyB0aGUgbWFza2VkIGNvbHVtbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIHJldHVyblR5cGUsIGNvbHVtbiwgZXhwZWN0ZWRUeXBlKTsKKworICAgICAgICAgICAgcmV0dXJuIChTY2FsYXJGdW5jdGlvbikgZnVuY3Rpb247CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEJ5dGVCdWZmZXJbXSBwcmVwYXJlUGFydGlhbEFyZ3VtZW50cyhTdHJpbmcga2V5c3BhY2UsIFNjYWxhckZ1bmN0aW9uIGZ1bmN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlcmUgY291bGQgYmUgbnVsbCBhcmd1bWVudHMKKyAgICAgICAgICAgIEJ5dGVCdWZmZXJbXSBhcmd1bWVudHMgPSBuZXcgQnl0ZUJ1ZmZlcltyYXdQYXJ0aWFsQXJndW1lbnRzLnNpemUoKV07CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmF3UGFydGlhbEFyZ3VtZW50cy5zaXplKCk7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGVybSA9IHJhd1BhcnRpYWxBcmd1bWVudHMuZ2V0KGkpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHR5cGUgPSBmdW5jdGlvbi5hcmdUeXBlcygpLmdldChpICsgMSk7CisgICAgICAgICAgICAgICAgYXJndW1lbnRzW2ldID0gVGVybXMuYXNCeXRlcyhrZXlzcGFjZSwgdGVybSwgdHlwZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBhcmd1bWVudHM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmb3JtYXQoIiVzKCVzKSIsIG5hbWUsIFN0cmluZ1V0aWxzLmpvaW4ocmF3UGFydGlhbEFyZ3VtZW50cywgIiwgIikpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9EZWZhdWx0TWFza2luZ0Z1bmN0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0RlZmF1bHRNYXNraW5nRnVuY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTExNjcxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9EZWZhdWx0TWFza2luZ0Z1bmN0aW9uLmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbk5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb25QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuTmF0aXZlRnVuY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CisKKy8qKgorICogQSB7QGxpbmsgTWFza2luZ0Z1bmN0aW9ufSB0aGF0IHJldHVybnMgYSBmaXhlZCByZXBsYWNlbWVudCB2YWx1ZSBmb3IgdGhlIGRhdGEgdHlwZSBvZiBpdHMgc2luZ2xlIGFyZ3VtZW50LgorICogPHA+CisgKiBUaGUgZGVmYXVsdCB2YWx1ZXMgYXJlIGRlZmluZWQgYnkge0BsaW5rIEFic3RyYWN0VHlwZSNnZXRNYXNrZWRWYWx1ZSgpfSwgYmVpbmcge0Bjb2RlICoqKip9IGZvciB0ZXh0IGZpZWxkcywKKyAqIHtAY29kZSBmYWxzZX0gZm9yIGJvb2xlYW5zLCB6ZXJvIGZvciBudW1lcmljIHR5cGVzLCB7QGNvZGUgMTk3MC0wMS0wMX0gZm9yIGRhdGVzLCBldGMuCisgKiA8cD4KKyAqIEZvciBleGFtcGxlLCBnaXZlbiBhIHRleHQgY29sdW1uIG5hbWVkICJ1c2VybmFtZSIsIHtAY29kZSBtYXNrX2RlZmF1bHQodXNlcm5hbWUpfSB3aWxsIGFsd2F5cyByZXR1cm4ge0Bjb2RlICoqKip9LAorICogaW5kZXBlbmRlbnRseSBvZiB0aGUgYWN0dWFsIHZhbHVlIG9mIHRoYXQgY29sdW1uLgorICovCitwdWJsaWMgY2xhc3MgRGVmYXVsdE1hc2tpbmdGdW5jdGlvbiBleHRlbmRzIE1hc2tpbmdGdW5jdGlvbgoreworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiZGVmYXVsdCI7CisKKyAgICBwcml2YXRlIGZpbmFsIE1hc2tlciBtYXNrZXI7CisKKyAgICBwcml2YXRlIDxUPiBEZWZhdWx0TWFza2luZ0Z1bmN0aW9uKEZ1bmN0aW9uTmFtZSBuYW1lLCBBYnN0cmFjdFR5cGU8VD4gaW5wdXRUeXBlKQorICAgIHsKKyAgICAgICAgc3VwZXIobmFtZSwgaW5wdXRUeXBlLCBpbnB1dFR5cGUpOworICAgICAgICBtYXNrZXIgPSBuZXcgTWFza2VyKGlucHV0VHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1hc2tlciBtYXNrZXIoQnl0ZUJ1ZmZlci4uLiBwYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1hc2tlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNYXNrZXIgaW1wbGVtZW50cyBNYXNraW5nRnVuY3Rpb24uTWFza2VyCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIEJ5dGVCdWZmZXIgZGVmYXVsdFZhbHVlOworCisgICAgICAgIHByaXZhdGUgTWFza2VyKEFic3RyYWN0VHlwZTw/PiBpbnB1dFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGlucHV0VHlwZS5nZXRNYXNrZWRWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIG1hc2soQnl0ZUJ1ZmZlciB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBAcmV0dXJuIGEge0BsaW5rIEZ1bmN0aW9uRmFjdG9yeX0gdG8gYnVpbGQgbmV3IHtAbGluayBEZWZhdWx0TWFza2luZ0Z1bmN0aW9ufXMuICovCisgICAgcHVibGljIHN0YXRpYyBGdW5jdGlvbkZhY3RvcnkgZmFjdG9yeSgpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IE1hc2tpbmdGdW5jdGlvbi5GYWN0b3J5KE5BTUUsIEZ1bmN0aW9uUGFyYW1ldGVyLmFueVR5cGUoZmFsc2UpKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBOYXRpdmVGdW5jdGlvbiBkb0dldE9yQ3JlYXRlRnVuY3Rpb24oTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzLCBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGVmYXVsdE1hc2tpbmdGdW5jdGlvbihuYW1lLCBhcmdUeXBlcy5nZXQoMCkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvSGFzaE1hc2tpbmdGdW5jdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9IYXNoTWFza2luZ0Z1bmN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE1MTVkZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvSGFzaE1hc2tpbmdGdW5jdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmc7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3VwcGxpZXJzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUwzVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb25OYW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uUGFyYW1ldGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLk5hdGl2ZUZ1bmN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZXNUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuU3RyaW5nVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVURjhUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CisKKy8qKgorICogQSB7QGxpbmsgTWFza2luZ0Z1bmN0aW9ufSB0aGF0IHJlcGxhY2VzIHRoZSBzcGVjaWZpZWQgY29sdW1uIHZhbHVlIGJ5IGl0cyBoYXNoIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgKiBhbGdvcml0aG0uIFRoZSBhdmFpbGFibGUgYWxnb3JpdGhtcyBhcmUgdGhvc2UgZGVmaW5lZCBieSB0aGUgcmVnaXN0ZXJlZCBzZWN1cml0eSB7QGxpbmsgamF2YS5zZWN1cml0eS5Qcm92aWRlcn1zLgorICogSWYgbm8gYWxnb3JpdGhtIGlzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24sIHRoZSB7QGxpbmsgI0RFRkFVTFRfQUxHT1JJVEhNfSB3aWxsIGJlIHVzZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBIYXNoTWFza2luZ0Z1bmN0aW9uIGV4dGVuZHMgTWFza2luZ0Z1bmN0aW9uCit7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJoYXNoIjsKKworICAgIC8qKiBUaGUgZGVmYXVsdCBoYXNoaW5nIGFsZ29yaXRobSB0byBiZSB1c2VkIGlmIG5vIG90aGVyIGFsZ29yaXRobSBpcyBzcGVjaWZpZWQgaW4gdGhlIGNhbGwgdG8gdGhlIGZ1bmN0aW9uLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQUxHT1JJVEhNID0gIlNIQS0yNTYiOworCisgICAgLy8gVGhlIGRlZmF1bHQgbWVzc2FnZSBkaWdlc3QgaXMgbGF6aWx5IGJ1aWx0IHRvIHByZXZlbnQgYSBmYWlsdXJlIGR1cmluZyBzZXJ2ZXIgc3RhcnR1cCBpZiB0aGUgYWxnb3JpdGhtIGlzIG5vdAorICAgIC8vIGF2YWlsYWJsZS4gVGhhdCB3YXksIGlmIHRoZSBhbGdvcml0aG0gaXMgbm90IGZvdW5kIG9ubHkgdGhlIGNhbGxzIHRvIHRoZSBmdW5jdGlvbiB3aWxsIGZhaWwuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3VwcGxpZXI8TWVzc2FnZURpZ2VzdD4gREVGQVVMVF9ESUdFU1QgPSBTdXBwbGllcnMubWVtb2l6ZSgoKSAtPiBtZXNzYWdlRGlnZXN0KERFRkFVTFRfQUxHT1JJVEhNKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWJzdHJhY3RUeXBlPD8+W10gREVGQVVMVF9BUkdVTUVOVFMgPSB7fTsKKworICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgc3VwcGxpZWQgYWxnb3JpdGhtIGFyZ3VtZW50LCB7QGNvZGUgbnVsbH0gaWYgdGhhdCBhcmd1bWVudCBpc24ndCBzdXBwbGllZC4gKi8KKyAgICBATnVsbGFibGUKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1R5cGUgYWxnb3JpdGhtQXJndW1lbnRUeXBlOworCisgICAgcHJpdmF0ZSBIYXNoTWFza2luZ0Z1bmN0aW9uKEZ1bmN0aW9uTmFtZSBuYW1lLCBBYnN0cmFjdFR5cGU8Pz4gaW5wdXRUeXBlLCBATnVsbGFibGUgU3RyaW5nVHlwZSBhbGdvcml0aG1Bcmd1bWVudFR5cGUpCisgICAgeworICAgICAgICBzdXBlcihuYW1lLCBCeXRlc1R5cGUuaW5zdGFuY2UsIGlucHV0VHlwZSwgYXJndW1lbnRzVHlwZShhbGdvcml0aG1Bcmd1bWVudFR5cGUpKTsKKyAgICAgICAgdGhpcy5hbGdvcml0aG1Bcmd1bWVudFR5cGUgPSBhbGdvcml0aG1Bcmd1bWVudFR5cGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQWJzdHJhY3RUeXBlPD8+W10gYXJndW1lbnRzVHlwZShATnVsbGFibGUgU3RyaW5nVHlwZSBhbGdvcml0aG1Bcmd1bWVudFR5cGUpCisgICAgeworICAgICAgICAvLyB0aGUgYWxnb3JpdGhtIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBzbyB3ZSB3aWxsIGhhdmUgZGlmZmVyZW50IHNpZ25hdHVyZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhhdCBhcmd1bWVudAorICAgICAgICAvLyBpcyBzdXBwbGllZCBvciBub3QKKyAgICAgICAgcmV0dXJuIGFsZ29yaXRobUFyZ3VtZW50VHlwZSA9PSBudWxsCisgICAgICAgICAgICAgICA/IERFRkFVTFRfQVJHVU1FTlRTCisgICAgICAgICAgICAgICA6IG5ldyBBYnN0cmFjdFR5cGU8Pz5bXXsgYWxnb3JpdGhtQXJndW1lbnRUeXBlIH07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1hc2tlciBtYXNrZXIoQnl0ZUJ1ZmZlci4uLiBwYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNYXNrZXIoYWxnb3JpdGhtQXJndW1lbnRUeXBlLCBwYXJhbWV0ZXJzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNYXNrZXIgaW1wbGVtZW50cyBNYXNraW5nRnVuY3Rpb24uTWFza2VyCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIE1lc3NhZ2VEaWdlc3QgZGlnZXN0OworCisgICAgICAgIHByaXZhdGUgTWFza2VyKFN0cmluZ1R5cGUgYWxnb3JpdGhtQXJndW1lbnRUeXBlLCBCeXRlQnVmZmVyLi4uIHBhcmFtZXRlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhbGdvcml0aG1Bcmd1bWVudFR5cGUgPT0gbnVsbCB8fCBwYXJhbWV0ZXJzWzBdID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGlnZXN0ID0gREVGQVVMVF9ESUdFU1QuZ2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGFsZ29yaXRobSA9IGFsZ29yaXRobUFyZ3VtZW50VHlwZS5jb21wb3NlKHBhcmFtZXRlcnNbMF0pOworICAgICAgICAgICAgICAgIGRpZ2VzdCA9IG1lc3NhZ2VEaWdlc3QoYWxnb3JpdGhtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBtYXNrKEJ5dGVCdWZmZXIgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBIYXNoTWFza2luZ0Z1bmN0aW9uLmhhc2goZGlnZXN0LCB2YWx1ZSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIEBOdWxsYWJsZQorICAgIHN0YXRpYyBCeXRlQnVmZmVyIGhhc2goTWVzc2FnZURpZ2VzdCBkaWdlc3QsIEJ5dGVCdWZmZXIgdmFsdWUpCisgICAgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIGJ5dGVbXSBoYXNoID0gZGlnZXN0LmRpZ2VzdChCeXRlQnVmZmVyVXRpbC5nZXRBcnJheSh2YWx1ZSkpOworICAgICAgICByZXR1cm4gQnl0ZXNUeXBlLmluc3RhbmNlLmNvbXBvc2UoQnl0ZUJ1ZmZlci53cmFwKGhhc2gpKTsKKyAgICB9CisKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBzdGF0aWMgTWVzc2FnZURpZ2VzdCBtZXNzYWdlRGlnZXN0KFN0cmluZyBhbGdvcml0aG0pCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoYWxnb3JpdGhtKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbigiSGFzaCBhbGdvcml0aG0gbm90IGZvdW5kOiAiICsgYWxnb3JpdGhtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBAcmV0dXJuIGEge0BsaW5rIEZ1bmN0aW9uRmFjdG9yeX0gdG8gYnVpbGQgbmV3IHtAbGluayBIYXNoTWFza2luZ0Z1bmN0aW9ufXMuICovCisgICAgcHVibGljIHN0YXRpYyBGdW5jdGlvbkZhY3RvcnkgZmFjdG9yeSgpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IE1hc2tpbmdGdW5jdGlvbi5GYWN0b3J5KE5BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25QYXJhbWV0ZXIuYW55VHlwZShmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25QYXJhbWV0ZXIub3B0aW9uYWwoRnVuY3Rpb25QYXJhbWV0ZXIuZml4ZWQoQ1FMM1R5cGUuTmF0aXZlLlRFWFQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgTmF0aXZlRnVuY3Rpb24gZG9HZXRPckNyZWF0ZUZ1bmN0aW9uKExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBhcmdUeXBlcywgQWJzdHJhY3RUeXBlPD8+IHJlY2VpdmVyVHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFyZ1R5cGVzLnNpemUoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaE1hc2tpbmdGdW5jdGlvbihuYW1lLCBhcmdUeXBlcy5nZXQoMCksIG51bGwpOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXNraW5nRnVuY3Rpb24obmFtZSwgYXJnVHlwZXMuZ2V0KDApLCBVVEY4VHlwZS5pbnN0YW5jZSk7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBpbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHNFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9NYXNraW5nRmN0cy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9NYXNraW5nRmN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYTNiYWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL01hc2tpbmdGY3RzLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuTmF0aXZlRnVuY3Rpb25zOworCisvKioKKyAqIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgTWFza2luZ0Z1bmN0aW9ufXMgZm9yIGR5bmFtaWMgZGF0YSBtYXNraW5nLCBtZWFudCB0byBvYnNjdXJlIHRoZSByZWFsIHZhbHVlIG9mIGEgY29sdW1uLgorICovCitwdWJsaWMgY2xhc3MgTWFza2luZ0ZjdHMKK3sKKyAgICAvKiogQWRkcyBhbGwgdGhlIGF2YWlsYWJsZSBuYXRpdmUgZGF0YSBtYXNraW5nIGZ1bmN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIG5hdGl2ZSBmdW5jdGlvbnMuICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEZ1bmN0aW9uc1RvKE5hdGl2ZUZ1bmN0aW9ucyBmdW5jdGlvbnMpCisgICAgeworICAgICAgICBmdW5jdGlvbnMuYWRkKE51bGxNYXNraW5nRnVuY3Rpb24uZmFjdG9yeSgpKTsKKyAgICAgICAgZnVuY3Rpb25zLmFkZChSZXBsYWNlTWFza2luZ0Z1bmN0aW9uLmZhY3RvcnkoKSk7CisgICAgICAgIGZ1bmN0aW9ucy5hZGQoRGVmYXVsdE1hc2tpbmdGdW5jdGlvbi5mYWN0b3J5KCkpOworICAgICAgICBmdW5jdGlvbnMuYWRkKEhhc2hNYXNraW5nRnVuY3Rpb24uZmFjdG9yeSgpKTsKKyAgICAgICAgUGFydGlhbE1hc2tpbmdGdW5jdGlvbi5mYWN0b3JpZXMoKS5mb3JFYWNoKGZ1bmN0aW9uczo6YWRkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL01hc2tpbmdGdW5jdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9NYXNraW5nRnVuY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWQwMzdkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9NYXNraW5nRnVuY3Rpb24uamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmc7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5PYmplY3RBcnJheXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb25OYW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uUGFyYW1ldGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLk5hdGl2ZVNjYWxhckZ1bmN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CisKKy8qKgorICogQSB7QGxpbmsgTmF0aXZlU2NhbGFyRnVuY3Rpb259IHRoYXQgdG90YWxseSBvciBwYXJ0aWFsbHkgcmVwbGFjZXMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIGEgY29sdW1uIHZhbHVlLAorICogbWVhbnQgdG8gb2JzY3VyZSB0aGUgcmVhbCB2YWx1ZSBvZiB0aGUgY29sdW1uLgorICogPHA+CisgKiBUaGUgbmFtZXMgb2YgYWxsIG1hc2tpbmcgZnVuY3Rpb25zIHNoYXJlIGEgY29tbW9uIHByZWZpeCwge0BsaW5rIE1hc2tpbmdGdW5jdGlvbiNOQU1FX1BSRUZJWH0sIHRvIGVhc2lseSBpZGVudGlmeQorICogdGhlaXIgcHVycG9zZS4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE1hc2tpbmdGdW5jdGlvbiBleHRlbmRzIE5hdGl2ZVNjYWxhckZ1bmN0aW9uCit7CisgICAgLyoqIFRoZSBjb21tb24gcHJlZml4IGZvciB0aGUgbmFtZXMgb2YgYWxsIHRoZSBuYXRpdmUgZGF0YSBtYXNraW5nIGZ1bmN0aW9ucy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BSRUZJWCA9ICJtYXNrXyI7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24KKyAgICAgKiBAcGFyYW0gb3V0cHV0VHlwZSB0aGUgdHlwZSBvZiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAqIEBwYXJhbSBpbnB1dFR5cGUgdGhlIHR5cGUgb2YgdGhlIHZhbHVlcyBhY2NlcHRlZCBieSB0aGUgZnVuY3Rpb24sIGFsd2F5cyBiZSB0aGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlIGZ1bmN0aW9uCisgICAgICogQHBhcmFtIGFyZ3NUeXBlIHRoZSB0eXBlIG9mIHRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBvZiB0aGUgZnVuY3Rpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWFza2luZ0Z1bmN0aW9uKEZ1bmN0aW9uTmFtZSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IG91dHB1dFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gaW5wdXRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+Li4uIGFyZ3NUeXBlKQorICAgIHsKKyAgICAgICAgc3VwZXIobmFtZS5uYW1lLCBvdXRwdXRUeXBlLCBPYmplY3RBcnJheXMuY29uY2F0KGlucHV0VHlwZSwgYXJnc1R5cGUpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgQnl0ZUJ1ZmZlciBleGVjdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1ldGVycykKKyAgICB7CisgICAgICAgIEJ5dGVCdWZmZXJbXSBwYXJ0aWFsUGFyYW1ldGVycyA9IG5ldyBCeXRlQnVmZmVyW3BhcmFtZXRlcnMuc2l6ZSgpIC0gMV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydGlhbFBhcmFtZXRlcnMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBwYXJ0aWFsUGFyYW1ldGVyc1tpXSA9IHBhcmFtZXRlcnMuZ2V0KGkgKyAxKTsKKworICAgICAgICByZXR1cm4gbWFza2VyKHBhcnRpYWxQYXJhbWV0ZXJzKS5tYXNrKHBhcmFtZXRlcnMuZ2V0KDApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IHtAbGluayBNYXNrZXJ9IGZvciB0aGUgc3BlY2lmaWVkIG1hc2tpbmcgcGFyYW1ldGVycy4KKyAgICAgKiBUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgYnkge0BsaW5rIENvbHVtbk1hc2t9LCBzbyBpdCBkb2Vzbid0IG5lZWQgdG8gZXZhbHVhdGUgdGhlIGFyZ3VtZW50cyBvbiBldmVyeSBjYWxsLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgdGhlIG1hc2tpbmcgcGFyYW1ldGVycyBpbiB0aGUgZnVuY3Rpb24gY2FsbC4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IHtAbGluayBNYXNrZXJ9IHVzaW5nIHRoZSBzcGVjaWZpZWQgbWFza2luZyBhcmd1bWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgTWFza2VyIG1hc2tlcihCeXRlQnVmZmVyLi4uIHBhcmFtZXRlcnMpOworCisgICAgLyoqCisgICAgICogQ2xhc3MgdGhhdCBhY3R1YWxseSBtYWtlcyB0aGUgbWFza2luZyBvZiB0aGUgZmlyc3QgZnVuY3Rpb24gcGFyYW1ldGVyIGFjY29yZGluZyB0byB0aGUgbWFza2luZyBhcmd1bWVudHMuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBNYXNrZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIG1hc2soQnl0ZUJ1ZmZlciB2YWx1ZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBGYWN0b3J5IGV4dGVuZHMgRnVuY3Rpb25GYWN0b3J5CisgICAgeworICAgICAgICBwdWJsaWMgRmFjdG9yeShTdHJpbmcgbmFtZSwgRnVuY3Rpb25QYXJhbWV0ZXIuLi4gcGFyYW1ldGVycykKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoTkFNRV9QUkVGSVggKyBuYW1lLnRvTG93ZXJDYXNlKCksIHBhcmFtZXRlcnMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9OdWxsTWFza2luZ0Z1bmN0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL051bGxNYXNraW5nRnVuY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDgyYTc2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9OdWxsTWFza2luZ0Z1bmN0aW9uLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbk5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb25QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuTmF0aXZlRnVuY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CisKKy8qKgorICogQSB7QGxpbmsgTWFza2luZ0Z1bmN0aW9ufSB0aGF0IGFsd2F5cyByZXR1cm5zIGEge0Bjb2RlIG51bGx9IGNvbHVtbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIGFsd2F5cyBhbiBhYnNlbnQgY29sdW1uLAorICogYXMgaXQgZGlkbid0IGV4aXN0LCBhbmQgbm90IGEgbm90LW51bGwgY29sdW1uIHJlcHJlc2VudGluZyBhIHtAY29kZSBudWxsfSB2YWx1ZS4KKyAqIDxwPgorICogRm9yIGV4YW1wbGUsIGdpdmVuIGEgdGV4dCBjb2x1bW4gbmFtZWQgInVzZXJuYW1lIiwge0Bjb2RlIG1hc2tfbnVsbCh1c2VybmFtZSl9IHdpbGwgYWx3YXlzIHJldHVybiB7QGNvZGUgbnVsbH0sCisgKiBpbmRlcGVuZGVudGx5IG9mIHRoZSBhY3R1YWwgdmFsdWUgb2YgdGhhdCBjb2x1bW4uCisgKi8KK3B1YmxpYyBjbGFzcyBOdWxsTWFza2luZ0Z1bmN0aW9uIGV4dGVuZHMgTWFza2luZ0Z1bmN0aW9uCit7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJudWxsIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXNrZXIgTUFTS0VSID0gbmV3IE1hc2tlcigpOworCisgICAgcHJpdmF0ZSBOdWxsTWFza2luZ0Z1bmN0aW9uKEZ1bmN0aW9uTmFtZSBuYW1lLCBBYnN0cmFjdFR5cGU8Pz4gaW5wdXRUeXBlKQorICAgIHsKKyAgICAgICAgc3VwZXIobmFtZSwgaW5wdXRUeXBlLCBpbnB1dFR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNYXNrZXIgbWFza2VyKEJ5dGVCdWZmZXIuLi4gcGFyYW1ldGVycykKKyAgICB7CisgICAgICAgIHJldHVybiBNQVNLRVI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWFza2VyIGltcGxlbWVudHMgTWFza2luZ0Z1bmN0aW9uLk1hc2tlcgorICAgIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIG1hc2soQnl0ZUJ1ZmZlciB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogQHJldHVybiBhIHtAbGluayBGdW5jdGlvbkZhY3Rvcnl9IHRvIGJ1aWxkIG5ldyB7QGxpbmsgTnVsbE1hc2tpbmdGdW5jdGlvbn1zLiAqLworICAgIHB1YmxpYyBzdGF0aWMgRnVuY3Rpb25GYWN0b3J5IGZhY3RvcnkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNYXNraW5nRnVuY3Rpb24uRmFjdG9yeShOQU1FLCBGdW5jdGlvblBhcmFtZXRlci5hbnlUeXBlKGZhbHNlKSkKKyAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgTmF0aXZlRnVuY3Rpb24gZG9HZXRPckNyZWF0ZUZ1bmN0aW9uKExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBhcmdUeXBlcywgQWJzdHJhY3RUeXBlPD8+IHJlY2VpdmVyVHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE51bGxNYXNraW5nRnVuY3Rpb24obmFtZSwgYXJnVHlwZXMuZ2V0KDApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL1BhcnRpYWxNYXNraW5nRnVuY3Rpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvUGFydGlhbE1hc2tpbmdGdW5jdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwODI2YTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL1BhcnRpYWxNYXNraW5nRnVuY3Rpb24uamF2YQpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlsczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb25GYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvblBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5OYXRpdmVGdW5jdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVURjhUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CisKKy8qKgorICogQSB7QGxpbmsgTWFza2luZ0Z1bmN0aW9ufSBhcHBsaWVkIHRvIGEge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuU3RyaW5nVHlwZX0gdmFsdWUgdGhhdCwKKyAqIGRlcGVuZGluZyBvbiB7QGxpbmsgVHlwZX06CisgKiA8dWw+CisgKiA8bGk+UmVwbGFjZXMgZWFjaCBjaGFyYWN0ZXIgYmV0d2VlbiB0aGUgc3VwcGxpZWQgcG9zaXRpb25zIGJ5IHRoZSBzdXBwbGllZCBwYWRkaW5nIGNoYXJhY3Rlci4gSW4gb3RoZXIgd29yZHMsCisgKiBpdCB3aWxsIG1hc2sgYWxsIHRoZSBjaGFyYWN0ZXJzIGV4Y2VwdCB0aGUgZmlyc3QgbSBhbmQgbGFzdCBuLjwvbGk+CisgKiA8bGk+UmVwbGFjZXMgZWFjaCBjaGFyYWN0ZXIgYmVmb3JlIGFuZCBhZnRlciB0aGUgc3VwcGxpZWQgcG9zaXRpb25zIGJ5IHRoZSBzdXBwbGllZCBwYWRkaW5nIGNoYXJhY3Rlci4gSW4gb3RoZXIKKyAqIHdvcmRzLCBpdCB3aWxsIG9ubHkgbWFzayBhbGwgdGhlIGZpcnN0IG0gYW5kIGxhc3QgbiBjaGFyYWN0ZXJzLjwvbGk+CisgKiA8L3VsPgorICogVGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYWxsd2F5cyBiZSBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBmaXJzdCBzdHJpbmctYmFzZWQgYXJndW1lbnQuCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJ0aWFsTWFza2luZ0Z1bmN0aW9uIGV4dGVuZHMgTWFza2luZ0Z1bmN0aW9uCit7CisgICAgLyoqIFRoZSBjaGFyYWN0ZXIgdG8gYmUgdXNlZCBhcyBwYWRkaW5nIGlmIG5vIG90aGVyIGNoYXJhY3RlciBpcyBzdXBwbGllZCB3aGVuIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBERUZBVUxUX1BBRERJTkdfQ0hBUiA9ICcqJzsKKworICAgIC8qKiBUaGUgdHlwZSBvZiBwYXJ0aWFsIG1hc2tpbmcgdG8gcGVyZm9ybSwgaW5uZXIgb3Igb3V0ZXIuICovCisgICAgcHJpdmF0ZSBmaW5hbCBUeXBlIHR5cGU7CisKKyAgICAvKiogVGhlIG9yaWdpbmFsIHR5cGUgb2YgdGhlIG1hc2tlZCB2YWx1ZS4gKi8KKyAgICBwcml2YXRlIGZpbmFsIEFic3RyYWN0VHlwZTxTdHJpbmc+IGlucHV0VHlwZTsKKworICAgIC8qKiBXaGV0aGVyIGEgcGFkZGluZyBhcmd1bWVudCBoYWIgYmVlbiBzdXBwbGllZC4gKi8KKyAgICBATnVsbGFibGUKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaGFzUGFkZGluZ0FyZ3VtZW50OworCisgICAgcHJpdmF0ZSBQYXJ0aWFsTWFza2luZ0Z1bmN0aW9uKEZ1bmN0aW9uTmFtZSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTxTdHJpbmc+IGlucHV0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNQYWRkaW5nQXJndW1lbnQpCisgICAgeworICAgICAgICBzdXBlcihuYW1lLCBpbnB1dFR5cGUsIGlucHV0VHlwZSwgYXJndW1lbnRzVHlwZShoYXNQYWRkaW5nQXJndW1lbnQpKTsKKworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB0aGlzLmlucHV0VHlwZSA9IGlucHV0VHlwZTsKKyAgICAgICAgdGhpcy5oYXNQYWRkaW5nQXJndW1lbnQgPSBoYXNQYWRkaW5nQXJndW1lbnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQWJzdHJhY3RUeXBlPD8+W10gYXJndW1lbnRzVHlwZShib29sZWFuIGhhc1BhZGRpbmdBcmd1bWVudCkKKyAgICB7CisgICAgICAgIC8vIFRoZSBwYWRkaW5nIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBzbyB3ZSBwcm92aWRlIGRpZmZlcmVudCBzaWduYXR1cmVzIGRlcGVuZGluZyBvbiB3aGV0aGVyIGl0J3MgcHJlc2VudCBvciBub3QuCisgICAgICAgIC8vIEFsc28sIHRoZSBwYWRkaW5nIGFyZ3VtZW50IHNob3VsZCBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIsIGJ1dCB3ZSBkb24ndCBoYXZlIGEgZGF0YSB0eXBlIGZvciB0aGF0LCBzbyB3ZSB1c2UKKyAgICAgICAgLy8gYSBzdHJpbmctYmFzZWQgYXJndW1lbnQuIFdlIHdpbGwgbGF0ZXIgdmFsaWRhdGUgb24gZXhlY3V0aW9uIHRoYXQgdGhlIHN0cmluZyBhcmd1bWVudCBpcyBzaW5nbGUtY2hhcmFjdGVyLgorICAgICAgICByZXR1cm4gaGFzUGFkZGluZ0FyZ3VtZW50CisgICAgICAgICAgICAgICA/IG5ldyBBYnN0cmFjdFR5cGU8Pz5bXXsgSW50MzJUeXBlLmluc3RhbmNlLCBJbnQzMlR5cGUuaW5zdGFuY2UsIFVURjhUeXBlLmluc3RhbmNlIH0KKyAgICAgICAgICAgICAgIDogbmV3IEFic3RyYWN0VHlwZTw/PltdeyBJbnQzMlR5cGUuaW5zdGFuY2UsIEludDMyVHlwZS5pbnN0YW5jZSB9OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNYXNrZXIgbWFza2VyKEJ5dGVCdWZmZXIuLi4gcGFyYW1ldGVycykKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgTWFza2VyKHBhcmFtZXRlcnMpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTWFza2VyIGltcGxlbWVudHMgTWFza2luZ0Z1bmN0aW9uLk1hc2tlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgYmVnaW4sIGVuZDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBjaGFyIHBhZGRpbmc7CisKKyAgICAgICAgcHJpdmF0ZSBNYXNrZXIoQnl0ZUJ1ZmZlci4uLiBwYXJhbWV0ZXJzKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBQYXJzZSB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgcG9zaXRpb25zLiBObyB2YWxpZGF0aW9uIGlzIG5lZWRlZCBzaW5jZSB0aGUgbWFza2VyIGFjY2VwdHMgbmVnYXRpdmVzLAorICAgICAgICAgICAgLy8gYnV0IHdlIHNob3VsZCBjb25zaWRlciB0aGF0IHRoZSBhcmd1bWVudHMgbWlnaCBiZSBudWxsLgorICAgICAgICAgICAgYmVnaW4gPSBwYXJhbWV0ZXJzWzBdID09IG51bGwgPyAwIDogSW50MzJUeXBlLmluc3RhbmNlLmNvbXBvc2UocGFyYW1ldGVyc1swXSk7CisgICAgICAgICAgICBlbmQgPSBwYXJhbWV0ZXJzWzFdID09IG51bGwgPyAwIDogSW50MzJUeXBlLmluc3RhbmNlLmNvbXBvc2UocGFyYW1ldGVyc1sxXSk7CisKKyAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBwYWRkaW5nIGNoYXJhY3Rlci4gVGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50IGlzIGEgc3RyaW5nIG9mIGFueSBsZW5ndGggYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGEKKyAgICAgICAgICAgIC8vIGNoYXJhY3RlciB0eXBlIGluIENRTCwgc28gd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IHRoZSBwYXNzZWQgc3RyaW5nIGFyZ3VtZW50IGlzIHNpbmdsZS1jaGFyYWN0ZXIuCisgICAgICAgICAgICBpZiAoaGFzUGFkZGluZ0FyZ3VtZW50ICYmIHBhcmFtZXRlcnNbMl0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyID0gVVRGOFR5cGUuaW5zdGFuY2UuY29tcG9zZShwYXJhbWV0ZXJzWzJdKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyLmxlbmd0aCgpICE9IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiVGhlIHBhZGRpbmcgYXJndW1lbnQgZm9yIGZ1bmN0aW9uICVzIHNob3VsZCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlIHNpbmdsZS1jaGFyYWN0ZXIsIGJ1dCAnJXMnIGhhcyAlZCBjaGFyYWN0ZXJzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUoKSwgcGFyYW1ldGVyLCBwYXJhbWV0ZXIubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGFkZGluZyA9IHBhcmFtZXRlci5jaGFyQXQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFkZGluZyA9IERFRkFVTFRfUEFERElOR19DSEFSOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIG1hc2soQnl0ZUJ1ZmZlciB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTnVsbCBjb2x1bW4gdmFsdWVzIGFyZW4ndCBtYXNrZWQKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBTdHJpbmcgc3RyaW5nVmFsdWUgPSBpbnB1dFR5cGUuY29tcG9zZSh2YWx1ZSk7CisgICAgICAgICAgICBTdHJpbmcgbWFza2VkVmFsdWUgPSB0eXBlLm1hc2soc3RyaW5nVmFsdWUsIGJlZ2luLCBlbmQsIHBhZGRpbmcpOworICAgICAgICAgICAgcmV0dXJuIGlucHV0VHlwZS5kZWNvbXBvc2UobWFza2VkVmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGVudW0gVHlwZQorICAgIHsKKyAgICAgICAgLyoqIE1hc2tzIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBmaXJzdCB7QGNvZGUgYmVnaW59IGFuZCBsYXN0IHtAY29kZSBlbmR9IGNoYXJhY3RlcnMuICovCisgICAgICAgIElOTkVSCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkTWFzayhpbnQgcG9zLCBpbnQgYmVnaW4sIGludCBlbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBvcyA+PSBiZWdpbiAmJiBwb3MgPD0gZW5kOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAvKiogTWFza3Mgb25seSB0aGUgZmlyc3Qge0Bjb2RlIGJlZ2lufSBhbmQgbGFzdCB7QGNvZGUgZW5kfSBjaGFyYWN0ZXJzLiAqLworICAgICAgICBPVVRFUgorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIHNob3VsZE1hc2soaW50IHBvcywgaW50IGJlZ2luLCBpbnQgZW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBwb3MgPCBiZWdpbiB8fCBwb3MgPiBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc2hvdWxkTWFzayhpbnQgcG9zLCBpbnQgYmVnaW4sIGludCBlbmQpOworCisgICAgICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgICAgICBwdWJsaWMgU3RyaW5nIG1hc2soU3RyaW5nIHZhbHVlLCBpbnQgYmVnaW4sIGludCBlbmQsIGNoYXIgcGFkZGluZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkodmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKworICAgICAgICAgICAgaW50IHNpemUgPSB2YWx1ZS5sZW5ndGgoKTsKKyAgICAgICAgICAgIGludCBlbmRJbmRleCA9IHNpemUgLSAxIC0gZW5kOworICAgICAgICAgICAgY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbc2l6ZV07CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXJzW2ldID0gc2hvdWxkTWFzayhpLCBiZWdpbiwgZW5kSW5kZXgpID8gcGFkZGluZyA6IHZhbHVlLmNoYXJBdChpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoY2hhcnMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9uIGZhY3RvcmllcyB0byBidWlsZCBuZXcge0Bjb2RlIFBhcnRpYWxNYXNraW5nRnVuY3Rpb259IGZ1bmN0aW9ucy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248RnVuY3Rpb25GYWN0b3J5PiBmYWN0b3JpZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmVhbS5vZihUeXBlLnZhbHVlcygpKQorICAgICAgICAgICAgICAgICAgICAgLm1hcChQYXJ0aWFsTWFza2luZ0Z1bmN0aW9uOjpmYWN0b3J5KQorICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBGdW5jdGlvbkZhY3RvcnkgZmFjdG9yeShUeXBlIHR5cGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IE1hc2tpbmdGdW5jdGlvbi5GYWN0b3J5KHR5cGUubmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uUGFyYW1ldGVyLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uUGFyYW1ldGVyLmZpeGVkKENRTDNUeXBlLk5hdGl2ZS5JTlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uUGFyYW1ldGVyLmZpeGVkKENRTDNUeXBlLk5hdGl2ZS5JTlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uUGFyYW1ldGVyLm9wdGlvbmFsKEZ1bmN0aW9uUGFyYW1ldGVyLmZpeGVkKENRTDNUeXBlLk5hdGl2ZS5URVhUKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgICAgICBwcm90ZWN0ZWQgTmF0aXZlRnVuY3Rpb24gZG9HZXRPckNyZWF0ZUZ1bmN0aW9uKExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBhcmdUeXBlcywgQWJzdHJhY3RUeXBlPD8+IHJlY2VpdmVyVHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8U3RyaW5nPiBpbnB1dFR5cGUgPSAoQWJzdHJhY3RUeXBlPFN0cmluZz4pIGFyZ1R5cGVzLmdldCgwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBhcnRpYWxNYXNraW5nRnVuY3Rpb24obmFtZSwgdHlwZSwgaW5wdXRUeXBlLCBhcmdUeXBlcy5zaXplKCkgPT0gNCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9SZXBsYWNlTWFza2luZ0Z1bmN0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL1JlcGxhY2VNYXNraW5nRnVuY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTEwNTIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9SZXBsYWNlTWFza2luZ0Z1bmN0aW9uLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbk5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb25QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuTmF0aXZlRnVuY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CisKKy8qKgorICogQSB7QGxpbmsgTWFza2luZ0Z1bmN0aW9ufSB0aGF0IHJlcGxhY2VzIHRoZSBzcGVjaWZpZWQgY29sdW1uIHZhbHVlIGJ5IGEgY2VydGFpbiByZXBsYWNlbWVudCB2YWx1ZS4KKyAqIDxwPgorICogVGhlIHJldHVybmVkIHJlcGxhY2VtZW50IHZhbHVlIG5lZWRzIHRvIGhhdmUgdGhlIHNhbWUgdHlwZSBhcyB0aGUgcmVwbGFjZWQgdmFsdWUuCisgKiA8cD4KKyAqIEZvciBleGFtcGxlLCBnaXZlbiBhIHRleHQgY29sdW1uIG5hbWVkICJ1c2VybmFtZSIsIHtAY29kZSBtYXNrX3JlcGxhY2UodXNlcm5hbWUsICcqKioqJyl9IHdpbGwgcmV0dXJuIHtAY29kZSAqKioqfS4KKyAqLworcHVibGljIGNsYXNzIFJlcGxhY2VNYXNraW5nRnVuY3Rpb24gZXh0ZW5kcyBNYXNraW5nRnVuY3Rpb24KK3sKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gInJlcGxhY2UiOworCisgICAgcHJpdmF0ZSBSZXBsYWNlTWFza2luZ0Z1bmN0aW9uKEZ1bmN0aW9uTmFtZSBuYW1lLCBBYnN0cmFjdFR5cGU8Pz4gcmVwbGFjZWRUeXBlLCBBYnN0cmFjdFR5cGU8Pz4gcmVwbGFjZW1lbnRUeXBlKQorICAgIHsKKyAgICAgICAgc3VwZXIobmFtZSwgcmVwbGFjZW1lbnRUeXBlLCByZXBsYWNlZFR5cGUsIHJlcGxhY2VtZW50VHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1hc2tlciBtYXNrZXIoQnl0ZUJ1ZmZlci4uLiBwYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNYXNrZXIocGFyYW1ldGVyc1swXSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWFza2VyIGltcGxlbWVudHMgTWFza2luZ0Z1bmN0aW9uLk1hc2tlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCeXRlQnVmZmVyIHJlcGxhY2VtZW50OworCisgICAgICAgIHByaXZhdGUgTWFza2VyKEJ5dGVCdWZmZXIgcmVwbGFjZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBtYXNrKEJ5dGVCdWZmZXIgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByZXBsYWNlbWVudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBAcmV0dXJuIGEge0BsaW5rIEZ1bmN0aW9uRmFjdG9yeX0gdG8gYnVpbGQgbmV3IHtAbGluayBSZXBsYWNlTWFza2luZ0Z1bmN0aW9ufXMuICovCisgICAgcHVibGljIHN0YXRpYyBGdW5jdGlvbkZhY3RvcnkgZmFjdG9yeSgpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IE1hc2tpbmdGdW5jdGlvbi5GYWN0b3J5KE5BTUUsIEZ1bmN0aW9uUGFyYW1ldGVyLmFueVR5cGUodHJ1ZSksIEZ1bmN0aW9uUGFyYW1ldGVyLnNhbWVBc0ZpcnN0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIE5hdGl2ZUZ1bmN0aW9uIGRvR2V0T3JDcmVhdGVGdW5jdGlvbihMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMsIEFic3RyYWN0VHlwZTw/PiByZWNlaXZlclR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHJlcGxhY2VkVHlwZSA9IGFyZ1R5cGVzLmdldCgwKTsKKyAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gcmVwbGFjZW1lbnRUeXBlID0gYXJnVHlwZXMuZ2V0KDEpOworCisgICAgICAgICAgICAgICAgYXNzZXJ0IHJlcGxhY2VkVHlwZSA9PSByZXBsYWNlbWVudFR5cGUKKyAgICAgICAgICAgICAgICA6IFN0cmluZy5mb3JtYXQoIkJvdGggYXJndW1lbnRzIHNob3VsZCBoYXZlIHRoZSBzYW1lIHR5cGUsIGJ1dCBmb3VuZCAlcyglcywgJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgcmVwbGFjZWRUeXBlLmFzQ1FMM1R5cGUoKSwgcmVwbGFjZW1lbnRUeXBlLmFzQ1FMM1R5cGUoKSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VNYXNraW5nRnVuY3Rpb24obmFtZSwgcmVwbGFjZWRUeXBlLCByZXBsYWNlbWVudFR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL3R5cGVzL1R5cGVDb2RlYy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvdHlwZXMvVHlwZUNvZGVjLmphdmEKaW5kZXggZGMzNGJjYS4uNTRmZjU0MCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvdHlwZXMvVHlwZUNvZGVjLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvdHlwZXMvVHlwZUNvZGVjLmphdmEKQEAgLTM0LDkgKzM0LDkgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5pby5CeXRlU3RyZWFtczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5yZWZsZWN0LlR5cGVUb2tlbjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMudHlwZXMuZXhjZXB0aW9ucy5JbnZhbGlkVHlwZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy50eXBlcy51dGlscy5CeXRlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnZpbnQuVkludENvZGluZzsKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudDsKQEAgLTMwNDMsMTcgKzMwNDMsOSBAQAogICAgICAgICAgICAgKyBWSW50Q29kaW5nLmNvbXB1dGVWSW50U2l6ZShkYXlzKQogICAgICAgICAgICAgKyBWSW50Q29kaW5nLmNvbXB1dGVWSW50U2l6ZShuYW5vc2Vjb25kcyk7CiAgICAgICAgICAgICBCeXRlQnVmZmVyIGJiID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShzaXplKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZJbnRDb2Rpbmcud3JpdGVWSW50KG1vbnRocywgYmIpOwotICAgICAgICAgICAgICAgIFZJbnRDb2Rpbmcud3JpdGVWSW50KGRheXMsIGJiKTsKLSAgICAgICAgICAgICAgICBWSW50Q29kaW5nLndyaXRlVkludChuYW5vc2Vjb25kcywgYmIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gY2Fubm90IGhhcHBlbgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgVkludENvZGluZy53cml0ZVZJbnQobW9udGhzLCBiYik7CisgICAgICAgICAgICBWSW50Q29kaW5nLndyaXRlVkludChkYXlzLCBiYik7CisgICAgICAgICAgICBWSW50Q29kaW5nLndyaXRlVkludChuYW5vc2Vjb25kcywgYmIpOwogICAgICAgICAgICAgYmIuZmxpcCgpOwogICAgICAgICAgICAgcmV0dXJuIGJiOwogICAgICAgICB9CkBAIC0zMDcxLDggKzMwNjMsOCBAQAogICAgICAgICAgICAgICAgIERhdGFJbnB1dCBpbiA9IEJ5dGVTdHJlYW1zLm5ld0RhdGFJbnB1dChCeXRlcy5nZXRBcnJheShieXRlcykpOwogICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG1vbnRocyA9IChpbnQpIFZJbnRDb2RpbmcucmVhZFZJbnQoaW4pOwotICAgICAgICAgICAgICAgICAgICBpbnQgZGF5cyA9IChpbnQpIFZJbnRDb2RpbmcucmVhZFZJbnQoaW4pOworICAgICAgICAgICAgICAgICAgICBpbnQgbW9udGhzID0gVkludENvZGluZy5yZWFkVkludDMyKGluKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRheXMgPSBWSW50Q29kaW5nLnJlYWRWSW50MzIoaW4pOwogICAgICAgICAgICAgICAgICAgICBsb25nIG5hbm9zZWNvbmRzID0gVkludENvZGluZy5yZWFkVkludChpbik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEdXJhdGlvbi5uZXdJbnN0YW5jZShtb250aHMsIGRheXMsIG5hbm9zZWNvbmRzKTsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9DbHVzdGVyaW5nQ29sdW1uUmVzdHJpY3Rpb25zLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9DbHVzdGVyaW5nQ29sdW1uUmVzdHJpY3Rpb25zLmphdmEKaW5kZXggYzFkMGM1Mi4uMTQ2ZWMyMCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9yZXN0cmljdGlvbnMvQ2x1c3RlcmluZ0NvbHVtblJlc3RyaWN0aW9ucy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvcmVzdHJpY3Rpb25zL0NsdXN0ZXJpbmdDb2x1bW5SZXN0cmljdGlvbnMuamF2YQpAQCAtMjI4LDUgKzIyOCw0IEBACiAgICAgewogICAgICAgICByZXR1cm4gcmVzdHJpY3Rpb24uaXNDb250YWlucygpIHx8IHJlc3RyaWN0aW9uLmlzTElLRSgpIHx8IGluZGV4ICE9IHJlc3RyaWN0aW9uLmdldEZpcnN0Q29sdW1uKCkucG9zaXRpb24oKTsKICAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvcmVzdHJpY3Rpb25zL011bHRpQ29sdW1uUmVzdHJpY3Rpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvcmVzdHJpY3Rpb25zL011bHRpQ29sdW1uUmVzdHJpY3Rpb24uamF2YQppbmRleCBhY2JiNDhlLi4yMmMwMDBlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9NdWx0aUNvbHVtblJlc3RyaWN0aW9uLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9yZXN0cmljdGlvbnMvTXVsdGlDb2x1bW5SZXN0cmljdGlvbi5qYXZhCkBAIC0xOCwxMiArMTgsMjIgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5yZXN0cmljdGlvbnM7CiAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTGlzdFNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuVG9TdHJpbmdCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlRvU3RyaW5nU3R5bGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkFic3RyYWN0TWFya2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuT3BlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5RdWVyeU9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5UZXJtOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVGVybXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5UdXBsZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5UZXJtLlRlcm1pbmFsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc3RhdGVtZW50cy5Cb3VuZDsKQEAgLTMxLDggKzQxLDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuUm93RmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LkluZGV4OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LkluZGV4UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuVG9TdHJpbmdCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlRvU3RyaW5nU3R5bGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLkxpc3RTZXJpYWxpemVyOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc3RhdGVtZW50cy5SZXF1ZXN0VmFsaWRhdGlvbnMuY2hlY2tGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLlJlcXVlc3RWYWxpZGF0aW9ucy5jaGVja05vdE51bGw7CkBAIC0yNTgsNyArMjY4LDcgQEAKICAgICAgICAgICAgICAgICBmb3IgKExpc3Q8Qnl0ZUJ1ZmZlcj4gc3BsaXRWYWx1ZSA6IHNwbGl0VmFsdWVzKQogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKHNwbGl0VmFsdWUuZ2V0KDApKTsKIAotICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gTGlzdFNlcmlhbGl6ZXIucGFjayh2YWx1ZXMsIHZhbHVlcy5zaXplKCksIFByb3RvY29sVmVyc2lvbi5WMyk7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBMaXN0U2VyaWFsaXplci5wYWNrKHZhbHVlcywgdmFsdWVzLnNpemUoKSk7CiAgICAgICAgICAgICAgICAgZmlsdGVyLmFkZChnZXRGaXJzdENvbHVtbigpLCBPcGVyYXRvci5JTiwgYnVmZmVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKQEAgLTM3Niw3ICszODYsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBib29sZWFuIHJldmVyc2VkID0gZ2V0Rmlyc3RDb2x1bW4oKS5pc1JldmVyc2VkVHlwZSgpOwogCi0gICAgICAgICAgICBFbnVtTWFwPEJvdW5kLCBMaXN0PEJ5dGVCdWZmZXI+PiBjb21wb25lbnRCb3VuZHMgPSBuZXcgRW51bU1hcDxCb3VuZCwgTGlzdDxCeXRlQnVmZmVyPj4oQm91bmQuY2xhc3MpOworICAgICAgICAgICAgRW51bU1hcDxCb3VuZCwgTGlzdDxCeXRlQnVmZmVyPj4gY29tcG9uZW50Qm91bmRzID0gbmV3IEVudW1NYXA8PihCb3VuZC5jbGFzcyk7CiAgICAgICAgICAgICBjb21wb25lbnRCb3VuZHMucHV0KEJvdW5kLlNUQVJULCBjb21wb25lbnRCb3VuZHMoQm91bmQuU1RBUlQsIG9wdGlvbnMpKTsKICAgICAgICAgICAgIGNvbXBvbmVudEJvdW5kcy5wdXQoQm91bmQuRU5ELCBjb21wb25lbnRCb3VuZHMoQm91bmQuRU5ELCBvcHRpb25zKSk7CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvcmVzdHJpY3Rpb25zL1Jlc3RyaWN0aW9uU2V0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9SZXN0cmljdGlvblNldC5qYXZhCmluZGV4IDdhNWQ1YjkuLjM0NDQ5OGMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvcmVzdHJpY3Rpb25zL1Jlc3RyaWN0aW9uU2V0LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9yZXN0cmljdGlvbnMvUmVzdHJpY3Rpb25TZXQuamF2YQpAQCAtMTA1LDYgKzEwNSwxNSBAQAogICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDw+KHJlc3RyaWN0aW9ucy5rZXlTZXQoKSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQHJldHVybiBhIGRpcmVjdCByZWZlcmVuY2UgdG8gdGhlIGtleSBzZXQgZnJvbSB7QGxpbmsgI3Jlc3RyaWN0aW9uc30gd2l0aCBubyBkZWZlbnNlaXZlIGNvcHlpbmcKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxDb2x1bW5NZXRhZGF0YT4gZ2V0Q29sdW1uRGVmaW5pdGlvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlc3RyaWN0aW9ucy5rZXlTZXQoKTsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRGdW5jdGlvbnNUbyhMaXN0PEZ1bmN0aW9uPiBmdW5jdGlvbnMpCiAgICAgewpAQCAtMzMyLDcgKzM0MSw2IEBACiAgICAgLyoqCiAgICAgICoge0Bjb2RlIEl0ZXJhdG9yfSBkZWNvcmF0b3IgdGhhdCByZW1vdmVzIGR1cGxpY2F0ZXMgaW4gYW4gb3JkZXJlZCBvbmUuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgdGhlIGRlY29yYXRlZCBpdGVyYXRvcgogICAgICAqIEBwYXJhbSA8RT4gdGhlIGl0ZXJhdG9yIGVsZW1lbnQgdHlwZS4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBEaXN0aW5jdEl0ZXJhdG9yPEU+IGV4dGVuZHMgQWJzdHJhY3RJdGVyYXRvcjxFPgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9yZXN0cmljdGlvbnMvUmVzdHJpY3Rpb25TZXRXcmFwcGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9SZXN0cmljdGlvblNldFdyYXBwZXIuamF2YQppbmRleCA5ODAzYWRjLi44Yzg5YmNhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9SZXN0cmljdGlvblNldFdyYXBwZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9SZXN0cmljdGlvblNldFdyYXBwZXIuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMucmVzdHJpY3Rpb25zOwogCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIApAQCAtNTcsNiArNTgsMTcgQEAKICAgICAgICAgcmV0dXJuIHJlc3RyaWN0aW9ucy5nZXRDb2x1bW5EZWZzKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbGxlY3Rpb248Q29sdW1uTWV0YWRhdGE+IGdldENvbHVtbkRlZmluaXRpb25zKCkKKyAgICB7CisgICAgICAgIHJldHVybiByZXN0cmljdGlvbnMuZ2V0Q29sdW1uRGVmaW5pdGlvbnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzdHJpY3Rpb25TZXQgZ2V0UmVzdHJpY3Rpb25TZXQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlc3RyaWN0aW9uczsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBhZGRGdW5jdGlvbnNUbyhMaXN0PEZ1bmN0aW9uPiBmdW5jdGlvbnMpCiAgICAgewogICAgICAgICByZXN0cmljdGlvbnMuYWRkRnVuY3Rpb25zVG8oZnVuY3Rpb25zKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvcmVzdHJpY3Rpb25zL1Jlc3RyaWN0aW9ucy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9yZXN0cmljdGlvbnMvUmVzdHJpY3Rpb25zLmphdmEKaW5kZXggNzdlMGRkOS4uMGFkNzUzMCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9yZXN0cmljdGlvbnMvUmVzdHJpY3Rpb25zLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9yZXN0cmljdGlvbnMvUmVzdHJpY3Rpb25zLmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnJlc3RyaWN0aW9uczsKIAoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CkBAIC0zNSw2ICszNiwxNSBAQAogICAgIFNldDxSZXN0cmljdGlvbj4gZ2V0UmVzdHJpY3Rpb25zKENvbHVtbk1ldGFkYXRhIGNvbHVtbkRlZik7CiAKICAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBleGlzdHMgaW4gYWRkaXRpb24gdG8ge0BsaW5rICNnZXRDb2x1bW5EZWZzKCl9IGluIGNhc2UgaW1wbGVtZW50YXRpb25zIHdhbnQgdG8KKyAgICAgKiBwcm92aWRlIGNvbHVtbnMgZGVmaW5pdGlvbnMgdGhhdCBhcmUgbm90IHN0cmljdGx5IGluIHBvc2l0aW9uIG9yZGVyLgorICAgICAqLworICAgIGRlZmF1bHQgQ29sbGVjdGlvbjxDb2x1bW5NZXRhZGF0YT4gZ2V0Q29sdW1uRGVmaW5pdGlvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldENvbHVtbkRlZnMoKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhpcyA8Y29kZT5SZXN0cmljdGlvbnM8L2NvZGU+IGlzIGVtcHR5IG9yIG5vdC4KICAgICAgKgogICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyA8Y29kZT5SZXN0cmljdGlvbnM8L2NvZGU+IGlzIGVtcHR5LCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9yZXN0cmljdGlvbnMvU2luZ2xlQ29sdW1uUmVzdHJpY3Rpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvcmVzdHJpY3Rpb25zL1NpbmdsZUNvbHVtblJlc3RyaWN0aW9uLmphdmEKaW5kZXggZTViMjQ2NS4uNWNlNzhhZSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9yZXN0cmljdGlvbnMvU2luZ2xlQ29sdW1uUmVzdHJpY3Rpb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9TaW5nbGVDb2x1bW5SZXN0cmljdGlvbi5qYXZhCkBAIC0yNCw3ICsyNCw2IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTGlzdFNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5UZXJtLlRlcm1pbmFsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uOwpAQCAtMjIxLDcgKzIyMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXJ5T3B0aW9ucyBvcHRpb25zKQogICAgICAgICB7CiAgICAgICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IHZhbHVlcyA9IGdldFZhbHVlcyhvcHRpb25zKTsKLSAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gTGlzdFNlcmlhbGl6ZXIucGFjayh2YWx1ZXMsIHZhbHVlcy5zaXplKCksIFByb3RvY29sVmVyc2lvbi5WMyk7CisgICAgICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IExpc3RTZXJpYWxpemVyLnBhY2sodmFsdWVzLCB2YWx1ZXMuc2l6ZSgpKTsKICAgICAgICAgICAgIGZpbHRlci5hZGQoY29sdW1uRGVmLCBPcGVyYXRvci5JTiwgYnVmZmVyKTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9TaW5nbGVSZXN0cmljdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9yZXN0cmljdGlvbnMvU2luZ2xlUmVzdHJpY3Rpb24uamF2YQppbmRleCA0MmIwYjRlLi45ODlkNWRhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9TaW5nbGVSZXN0cmljdGlvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvcmVzdHJpY3Rpb25zL1NpbmdsZVJlc3RyaWN0aW9uLmphdmEKQEAgLTUxLDYgKzUxLDE0IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcmVzdHJpY3Rpb24gaXMgYmFzZWQgb24gZXF1YWxpdHkgY29tcGFyaXNvbiByYXRoZXIgdGhhbiBhIHJhbmdlIG9yIG5lZ2F0aW9uCisgICAgICovCisgICAgZGVmYXVsdCBib29sZWFuIGlzRXF1YWxpdHlCYXNlZCgpCisgICAgeworICAgICAgICByZXR1cm4gaXNFUSgpIHx8IGlzSU4oKSB8fCBpc0NvbnRhaW5zKCk7CisgICAgfQorCiAgICAgcHVibGljIGRlZmF1bHQgYm9vbGVhbiBpc05vdE51bGwoKQogICAgIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9yZXN0cmljdGlvbnMvU3RhdGVtZW50UmVzdHJpY3Rpb25zLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9TdGF0ZW1lbnRSZXN0cmljdGlvbnMuamF2YQppbmRleCA4ZjhiZTk0Li5kNTIyZjQ2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9TdGF0ZW1lbnRSZXN0cmljdGlvbnMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9TdGF0ZW1lbnRSZXN0cmljdGlvbnMuamF2YQpAQCAtMjgsNyArMjgsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuU3RhdGVtZW50VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Sb3dGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZ3VhcmRyYWlscy5HdWFyZHJhaWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWwuVmlydHVhbEtleXNwYWNlUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbC5WaXJ0dWFsVGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5JbmRleDsKQEAgLTUwLDEwICs1MywxNSBAQAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgU3RhdGVtZW50UmVzdHJpY3Rpb25zCiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRVNfQUxMT1dfRklMVEVSSU5HX01FU1NBR0UgPQotICAgICAgICAgICAgIkNhbm5vdCBleGVjdXRlIHRoaXMgcXVlcnkgYXMgaXQgbWlnaHQgaW52b2x2ZSBkYXRhIGZpbHRlcmluZyBhbmQgIiArCi0gICAgICAgICAgICAidGh1cyBtYXkgaGF2ZSB1bnByZWRpY3RhYmxlIHBlcmZvcm1hbmNlLiBJZiB5b3Ugd2FudCB0byBleGVjdXRlICIgKwotICAgICAgICAgICAgInRoaXMgcXVlcnkgZGVzcGl0ZSB0aGUgcGVyZm9ybWFuY2UgdW5wcmVkaWN0YWJpbGl0eSwgdXNlIEFMTE9XIEZJTFRFUklORyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTE9XX0ZJTFRFUklOR19NRVNTQUdFID0KKyAgICAgICAgICAgICJDYW5ub3QgZXhlY3V0ZSB0aGlzIHF1ZXJ5IGFzIGl0IG1pZ2h0IGludm9sdmUgZGF0YSBmaWx0ZXJpbmcgYW5kIHRodXMgbWF5IGhhdmUgdW5wcmVkaWN0YWJsZSBwZXJmb3JtYW5jZS4gIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVJUkVTX0FMTE9XX0ZJTFRFUklOR19NRVNTQUdFID0gQUxMT1dfRklMVEVSSU5HX01FU1NBR0UgKworICAgICAgICAgICAgIklmIHlvdSB3YW50IHRvIGV4ZWN1dGUgdGhpcyBxdWVyeSBkZXNwaXRlIHRoZSBwZXJmb3JtYW5jZSB1bnByZWRpY3RhYmlsaXR5LCB1c2UgQUxMT1cgRklMVEVSSU5HIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTk5PVF9VU0VfQUxMT1dfRklMVEVSSU5HX01FU1NBR0UgPSBBTExPV19GSUxURVJJTkdfTUVTU0FHRSArCisgICAgICAgICAgICAiRXhlY3V0aW5nIHRoaXMgcXVlcnkgZGVzcGl0ZSB0aGUgcGVyZm9ybWFuY2UgdW5wcmVkaWN0YWJpbGl0eSB3aXRoIEFMTE9XIEZJTFRFUklORyBoYXMgYmVlbiBkaXNhYmxlZCAiICsKKyAgICAgICAgICAgICJieSB0aGUgYWxsb3dfZmlsdGVyaW5nX2VuYWJsZWQgcHJvcGVydHkgaW4gY2Fzc2FuZHJhLnlhbWwiOwogCiAgICAgLyoqCiAgICAgICogVGhlIHR5cGUgb2Ygc3RhdGVtZW50CkBAIC0xMjUsNyArMTMzLDggQEAKICAgICAgICAgdGhpcy5ub3ROdWxsQ29sdW1ucyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RhdGVtZW50UmVzdHJpY3Rpb25zKFN0YXRlbWVudFR5cGUgdHlwZSwKKyAgICBwdWJsaWMgU3RhdGVtZW50UmVzdHJpY3Rpb25zKENsaWVudFN0YXRlIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVtZW50VHlwZSB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YSB0YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoZXJlQ2xhdXNlIHdoZXJlQ2xhdXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFibGVTcGVjaWZpY2F0aW9ucyBib3VuZE5hbWVzLApAQCAtMTMzLDE0ICsxNDIsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWxsb3dGaWx0ZXJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZvclZpZXcpCiAgICAgewotICAgICAgICB0aGlzKHR5cGUsIHRhYmxlLCB3aGVyZUNsYXVzZSwgYm91bmROYW1lcywgc2VsZWN0c09ubHlTdGF0aWNDb2x1bW5zLCB0eXBlLmFsbG93VXNlT2ZTZWNvbmRhcnlJbmRpY2VzKCksIGFsbG93RmlsdGVyaW5nLCBmb3JWaWV3KTsKKyAgICAgICAgdGhpcyhzdGF0ZSwgdHlwZSwgdGFibGUsIHdoZXJlQ2xhdXNlLCBib3VuZE5hbWVzLCBzZWxlY3RzT25seVN0YXRpY0NvbHVtbnMsIHR5cGUuYWxsb3dVc2VPZlNlY29uZGFyeUluZGljZXMoKSwgYWxsb3dGaWx0ZXJpbmcsIGZvclZpZXcpOwogICAgIH0KIAogICAgIC8qCiAgICAgICogV2Ugd2FudCB0byBvdmVycmlkZSBhbGxvd1VzZU9mU2Vjb25kYXJ5SW5kaWNlcyBmbGFnIGZyb20gdGhlIFN0YXRlbWVudFR5cGUgZm9yIE1WIHN0YXRlbWVudHMKICAgICAgKiB0byBhdm9pZCBpbml0aW5nIHRoZSBLZXlzcGFjZSBhbmQgU2Vjb25kYXJ5SW5kZXhNYW5hZ2VyLgogICAgICAqLwotICAgIHB1YmxpYyBTdGF0ZW1lbnRSZXN0cmljdGlvbnMoU3RhdGVtZW50VHlwZSB0eXBlLAorICAgIHB1YmxpYyBTdGF0ZW1lbnRSZXN0cmljdGlvbnMoQ2xpZW50U3RhdGUgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZW1lbnRUeXBlIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhIHRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hlcmVDbGF1c2Ugd2hlcmVDbGF1c2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZVNwZWNpZmljYXRpb25zIGJvdW5kTmFtZXMsCkBAIC0yMTQsNyArMjI0LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSBzZWxlY3Qgc3RhdGVtZW50IGlmIGZ1bGx5IGNvbnN0cnVjdGVkLCBidXQgd2Ugc3RpbGwgaGF2ZSBhIGZldyB0aGluZ3MgdG8gdmFsaWRhdGUKLSAgICAgICAgcHJvY2Vzc1BhcnRpdGlvbktleVJlc3RyaWN0aW9ucyhoYXNRdWVyaWFibGVJbmRleCwgYWxsb3dGaWx0ZXJpbmcsIGZvclZpZXcpOworICAgICAgICBwcm9jZXNzUGFydGl0aW9uS2V5UmVzdHJpY3Rpb25zKHN0YXRlLCBoYXNRdWVyaWFibGVJbmRleCwgYWxsb3dGaWx0ZXJpbmcsIGZvclZpZXcpOwogCiAgICAgICAgIC8vIFNvbWUgYnV0IG5vdCBhbGwgb2YgdGhlIHBhcnRpdGlvbiBrZXkgY29sdW1ucyBoYXZlIGJlZW4gc3BlY2lmaWVkOwogICAgICAgICAvLyBoZW5jZSB3ZSBuZWVkIHR1cm4gdGhlc2UgcmVzdHJpY3Rpb25zIGludG8gYSByb3cgZmlsdGVyLgpAQCAtMjY2LDggKzI3Niw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoaGFzUXVlcmlhYmxlSW5kZXgpCiAgICAgICAgICAgICAgICAgdXNlc1NlY29uZGFyeUluZGV4aW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKCFhbGxvd0ZpbHRlcmluZykKLSAgICAgICAgICAgICAgICB0aHJvdyBpbnZhbGlkUmVxdWVzdChTdGF0ZW1lbnRSZXN0cmljdGlvbnMuUkVRVUlSRVNfQUxMT1dfRklMVEVSSU5HX01FU1NBR0UpOworICAgICAgICAgICAgZWxzZSBpZiAoIWFsbG93RmlsdGVyaW5nICYmIHJlcXVpcmVzQWxsb3dGaWx0ZXJpbmdJZk5vdFNwZWNpZmllZCgpKQorICAgICAgICAgICAgICAgIHRocm93IGludmFsaWRSZXF1ZXN0KGFsbG93RmlsdGVyaW5nTWVzc2FnZShzdGF0ZSkpOwogCiAgICAgICAgICAgICBmaWx0ZXJSZXN0cmljdGlvbnMuYWRkKG5vblByaW1hcnlLZXlSZXN0cmljdGlvbnMpOwogICAgICAgICB9CkBAIC0yNzYsNiArMjg2LDE2IEBACiAgICAgICAgICAgICB2YWxpZGF0ZVNlY29uZGFyeUluZGV4U2VsZWN0aW9ucygpOwogICAgIH0KIAorICAgIHB1YmxpYyBib29sZWFuIHJlcXVpcmVzQWxsb3dGaWx0ZXJpbmdJZk5vdFNwZWNpZmllZCgpCisgICAgeworICAgICAgICBpZiAoIXRhYmxlLmlzVmlydHVhbCgpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgVmlydHVhbFRhYmxlIHRhYmxlTnVsbGFibGUgPSBWaXJ0dWFsS2V5c3BhY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRUYWJsZU51bGxhYmxlKHRhYmxlLmlkKTsKKyAgICAgICAgYXNzZXJ0IHRhYmxlTnVsbGFibGUgIT0gbnVsbDsKKyAgICAgICAgcmV0dXJuICF0YWJsZU51bGxhYmxlLmFsbG93RmlsdGVyaW5nSW1wbGljaXRseSgpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBhZGRSZXN0cmljdGlvbihSZXN0cmljdGlvbiByZXN0cmljdGlvbikKICAgICB7CiAgICAgICAgIENvbHVtbk1ldGFkYXRhIGRlZiA9IHJlc3RyaWN0aW9uLmdldEZpcnN0Q29sdW1uKCk7CkBAIC0zODMsNiArNDAzLDU0IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgZGV0ZXJtaW5lcyB3aGV0aGVyIGEgc3BlY2lmaWVkIGNvbHVtbiBpcyByZXN0cmljdGVkIG9uIGVxdWFsaXR5IG9yIHNvbWV0aGluZyBlcXVpdmFsZW50LCBsaWtlIElOLgorICAgICAqIEl0IGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGNvbHVtbnMgc2VsZWN0ZWQgYnkgYSBxdWVyeSB0byBkZXRlcm1pbmUgd2hpY2ggb2YgdGhvc2UgY29sdW1ucyBpcyAKKyAgICAgKiBhbHJlYWR5IGJvdW5kIGJ5IHRoZSBjbGllbnQgKGFuZCBmcm9tIGl0cyBwZXJzcGVjdGl2ZSwgbm90IHJldHJpZXZlZCBieSB0aGUgZGF0YWJhc2UpLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbHVtbiBhIGNvbHVtbiBmcm9tIHRoZSBzYW1lIHRhYmxlIHRoZXNlIHJlc3RyaWN0aW9ucyBhcmUgYWdhaW5zdAorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gY29sdW1uIGlzIHJlc3RyaWN0ZWQgb24gZXF1YWxpdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VxdWFsaXR5UmVzdHJpY3RlZChDb2x1bW5NZXRhZGF0YSBjb2x1bW4pCisgICAgeworICAgICAgICBpZiAoY29sdW1uLmtpbmQgPT0gQ29sdW1uTWV0YWRhdGEuS2luZC5QQVJUSVRJT05fS0VZKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFydGl0aW9uS2V5UmVzdHJpY3Rpb25zLmhhc09ubHlFcXVhbGl0eVJlc3RyaWN0aW9ucygpKQorICAgICAgICAgICAgICAgIGZvciAoQ29sdW1uTWV0YWRhdGEgcmVzdHJpY3RlZCA6IHBhcnRpdGlvbktleVJlc3RyaWN0aW9ucy5nZXRDb2x1bW5EZWZpbml0aW9ucygpKQorICAgICAgICAgICAgICAgICAgICBpZiAocmVzdHJpY3RlZC5uYW1lLmVxdWFscyhjb2x1bW4ubmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjb2x1bW4ua2luZCA9PSBDb2x1bW5NZXRhZGF0YS5LaW5kLkNMVVNURVJJTkcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChoYXNDbHVzdGVyaW5nQ29sdW1uc1Jlc3RyaWN0aW9ucygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoU2luZ2xlUmVzdHJpY3Rpb24gcmVzdHJpY3Rpb24gOiBjbHVzdGVyaW5nQ29sdW1uc1Jlc3RyaWN0aW9ucy5nZXRSZXN0cmljdGlvblNldCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3RyaWN0aW9uLmlzRXF1YWxpdHlCYXNlZCgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdHJpY3Rpb24uaXNNdWx0aUNvbHVtbigpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQ29sdW1uTWV0YWRhdGEgcmVzdHJpY3RlZCA6IHJlc3RyaWN0aW9uLmdldENvbHVtbkRlZnMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3RyaWN0ZWQubmFtZS5lcXVhbHMoY29sdW1uLm5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN0cmljdGlvbi5nZXRGaXJzdENvbHVtbigpLm5hbWUuZXF1YWxzKGNvbHVtbi5uYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChoYXNOb25QcmltYXJ5S2V5UmVzdHJpY3Rpb25zKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoU2luZ2xlUmVzdHJpY3Rpb24gcmVzdHJpY3Rpb24gOiBub25QcmltYXJ5S2V5UmVzdHJpY3Rpb25zKQorICAgICAgICAgICAgICAgIGlmIChyZXN0cmljdGlvbi5nZXRGaXJzdENvbHVtbigpLm5hbWUuZXF1YWxzKGNvbHVtbi5uYW1lKSAmJiByZXN0cmljdGlvbi5pc0VxdWFsaXR5QmFzZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgPGNvZGU+UmVzdHJpY3Rpb25zPC9jb2RlPiBmb3IgdGhlIHNwZWNpZmllZCB0eXBlIG9mIGNvbHVtbnMuCiAgICAgICoKICAgICAgKiBAcGFyYW0ga2luZCB0aGUgY29sdW1uIHR5cGUKQEAgLTQwOCw3ICs0NzYsNyBAQAogICAgICAgICByZXR1cm4gdGhpcy51c2VzU2Vjb25kYXJ5SW5kZXhpbmc7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NQYXJ0aXRpb25LZXlSZXN0cmljdGlvbnMoYm9vbGVhbiBoYXNRdWVyaWFibGVJbmRleCwgYm9vbGVhbiBhbGxvd0ZpbHRlcmluZywgYm9vbGVhbiBmb3JWaWV3KQorICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUGFydGl0aW9uS2V5UmVzdHJpY3Rpb25zKENsaWVudFN0YXRlIHN0YXRlLCBib29sZWFuIGhhc1F1ZXJpYWJsZUluZGV4LCBib29sZWFuIGFsbG93RmlsdGVyaW5nLCBib29sZWFuIGZvclZpZXcpCiAgICAgewogICAgICAgICBpZiAoIXR5cGUuYWxsb3dQYXJ0aXRpb25LZXlSYW5nZXMoKSkKICAgICAgICAgewpAQCAtNDQ0LDggKzUxMiw4IEBACiAgICAgICAgICAgICAvLyBjb21wb25lbnRzIG11c3QgaGF2ZSBhIEVRLiBPbmx5IHRoZSBsYXN0IHBhcnRpdGlvbiBrZXkgY29tcG9uZW50IGNhbiBiZSBpbiBJTiByZWxhdGlvbi4KICAgICAgICAgICAgIGlmIChwYXJ0aXRpb25LZXlSZXN0cmljdGlvbnMubmVlZEZpbHRlcmluZyh0YWJsZSkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFhbGxvd0ZpbHRlcmluZyAmJiAhZm9yVmlldyAmJiAhaGFzUXVlcmlhYmxlSW5kZXgpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbihSRVFVSVJFU19BTExPV19GSUxURVJJTkdfTUVTU0FHRSk7CisgICAgICAgICAgICAgICAgaWYgKCFhbGxvd0ZpbHRlcmluZyAmJiAhZm9yVmlldyAmJiAhaGFzUXVlcmlhYmxlSW5kZXggJiYgcmVxdWlyZXNBbGxvd0ZpbHRlcmluZ0lmTm90U3BlY2lmaWVkKCkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbihhbGxvd0ZpbHRlcmluZ01lc3NhZ2Uoc3RhdGUpKTsKIAogICAgICAgICAgICAgICAgIGlzS2V5UmFuZ2UgPSB0cnVlOwogICAgICAgICAgICAgICAgIHVzZXNTZWNvbmRhcnlJbmRleGluZyA9IGhhc1F1ZXJpYWJsZUluZGV4OwpAQCAtODc0LDQgKzk0MiwxMSBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIFRvU3RyaW5nQnVpbGRlci5yZWZsZWN0aW9uVG9TdHJpbmcodGhpcywgVG9TdHJpbmdTdHlsZS5TSE9SVF9QUkVGSVhfU1RZTEUpOwogICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhbGxvd0ZpbHRlcmluZ01lc3NhZ2UoQ2xpZW50U3RhdGUgc3RhdGUpCisgICAgeworICAgICAgICByZXR1cm4gR3VhcmRyYWlscy5hbGxvd0ZpbHRlcmluZ0VuYWJsZWQuaXNFbmFibGVkKHN0YXRlKQorICAgICAgICAgICAgICAgPyBSRVFVSVJFU19BTExPV19GSUxURVJJTkdfTUVTU0FHRQorICAgICAgICAgICAgICAgOiBDQU5OT1RfVVNFX0FMTE9XX0ZJTFRFUklOR19NRVNTQUdFOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL0Fic3RyYWN0RnVuY3Rpb25TZWxlY3Rvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vQWJzdHJhY3RGdW5jdGlvblNlbGVjdG9yLmphdmEKaW5kZXggYmYyNTY0ZS4uYjIxYjVmOCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vQWJzdHJhY3RGdW5jdGlvblNlbGVjdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vQWJzdHJhY3RGdW5jdGlvblNlbGVjdG9yLmphdmEKQEAgLTIyLDE0ICsyMiwxNCBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudGV4dC5TdHJCdWlsZGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb25SZXNvbHZlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwpAQCAtNTcsMjggKzU3LDI2IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIEZ1bmN0aW9uTmFtZSBuYW1lID0gbmV3IEZ1bmN0aW9uTmFtZShpbi5yZWFkVVRGKCksIGluLnJlYWRVVEYoKSk7CiAKLSAgICAgICAgICAgIGludCBudW1iZXJPZkFyZ3VtZW50cyA9IChpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgIGludCBudW1iZXJPZkFyZ3VtZW50cyA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogICAgICAgICAgICAgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzID0gbmV3IEFycmF5TGlzdDw+KG51bWJlck9mQXJndW1lbnRzKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZBcmd1bWVudHM7IGkrKykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBhcmdUeXBlcy5hZGQocmVhZFR5cGUobWV0YWRhdGEsIGluKSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIE9wdGlvbmFsPEZ1bmN0aW9uPiBvcHRpb25hbCA9IFNjaGVtYS5pbnN0YW5jZS5maW5kRnVuY3Rpb24obmFtZSwgYXJnVHlwZXMpOworICAgICAgICAgICAgRnVuY3Rpb24gZnVuY3Rpb24gPSBGdW5jdGlvblJlc29sdmVyLmdldChtZXRhZGF0YS5rZXlzcGFjZSwgbmFtZSwgYXJnVHlwZXMsIG1ldGFkYXRhLmtleXNwYWNlLCBtZXRhZGF0YS5uYW1lLCBudWxsKTsKIAotICAgICAgICAgICAgaWYgKCFvcHRpb25hbC5pc1ByZXNlbnQoKSkKKyAgICAgICAgICAgIGlmIChmdW5jdGlvbiA9PSBudWxsKQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJVbmtub3duIHNlcmlhbGl6ZWQgZnVuY3Rpb24gJXMoJXMpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1R5cGVzLnN0cmVhbSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKHAgLT4gcC5hc0NRTDNUeXBlKCkudG9TdHJpbmcoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KGpvaW5pbmcoIiwgIikpKSk7CiAKLSAgICAgICAgICAgIEZ1bmN0aW9uIGZ1bmN0aW9uID0gb3B0aW9uYWwuZ2V0KCk7Ci0KICAgICAgICAgICAgIGJvb2xlYW4gaXNQYXJ0aWFsID0gaW4ucmVhZEJvb2xlYW4oKTsKICAgICAgICAgICAgIGlmIChpc1BhcnRpYWwpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGJpdHNldCA9IChpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgICAgICBpbnQgYml0c2V0ID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgICAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBwYXJ0aWFsUGFyYW1ldGVycyA9IG5ldyBBcnJheUxpc3Q8PihudW1iZXJPZkFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZkFyZ3VtZW50czsgaSsrKQogICAgICAgICAgICAgICAgIHsKQEAgLTkxLDcgKzg5LDcgQEAKICAgICAgICAgICAgICAgICBmdW5jdGlvbiA9ICgoU2NhbGFyRnVuY3Rpb24pIGZ1bmN0aW9uKS5wYXJ0aWFsQXBwbGljYXRpb24oUHJvdG9jb2xWZXJzaW9uLkNVUlJFTlQsIHBhcnRpYWxQYXJhbWV0ZXJzKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaW50IG51bWJlck9mUmVtYWluaW5nQXJndW1lbnRzID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgaW50IG51bWJlck9mUmVtYWluaW5nQXJndW1lbnRzID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgICAgICBMaXN0PFNlbGVjdG9yPiBhcmdTZWxlY3RvcnMgPSBuZXcgQXJyYXlMaXN0PD4obnVtYmVyT2ZSZW1haW5pbmdBcmd1bWVudHMpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZlJlbWFpbmluZ0FyZ3VtZW50czsgaSsrKQogICAgICAgICAgICAgewpAQCAtMTAyLDggKzEwMCw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU2VsZWN0b3IgbmV3RnVuY3Rpb25TZWxlY3RvcihGdW5jdGlvbiBmdW5jdGlvbiwgTGlzdDxTZWxlY3Rvcj4gYXJnU2VsZWN0b3JzKTsKLSAgICB9OwotICAgIAorICAgIH0KKwogICAgIHByb3RlY3RlZCBmaW5hbCBUIGZ1bjsKIAogICAgIC8qKgpAQCAtMzQ2LDcgKzM0NCw3IEBACiAKICAgICAgICAgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzID0gZnVuY3Rpb24uYXJnVHlwZXMoKTsKICAgICAgICAgaW50IG51bWJlck9mQXJndW1lbnRzID0gYXJnVHlwZXMuc2l6ZSgpOwotICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQobnVtYmVyT2ZBcmd1bWVudHMpOworICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihudW1iZXJPZkFyZ3VtZW50cyk7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZkFyZ3VtZW50czsgaSsrKQogICAgICAgICAgICAgd3JpdGVUeXBlKG91dCwgYXJnVHlwZXMuZ2V0KGkpKTsKQEAgLTM1OCw3ICszNTYsNyBAQAogICAgICAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBwYXJ0aWFsUGFyYW1ldGVycyA9ICgoUGFydGlhbFNjYWxhckZ1bmN0aW9uKSBmdW4pLmdldFBhcnRpYWxQYXJhbWV0ZXJzKCk7CiAKICAgICAgICAgICAgIC8vIFdlIHVzZSBhIGJpdHNldCB0byB0cmFjayB0aGUgcG9zaXRpb24gb2YgdGhlIHVucmVzb2x2ZWQgYXJndW1lbnRzCi0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoY29tcHV0ZUJpdFNldChwYXJ0aWFsUGFyYW1ldGVycykpOworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoY29tcHV0ZUJpdFNldChwYXJ0aWFsUGFyYW1ldGVycykpOwogCiAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgbSA9IHBhcnRpYWxQYXJhbWV0ZXJzLnNpemUoKTsgaSA8IG07IGkrKykKICAgICAgICAgICAgIHsKQEAgLTM2OSw3ICszNjcsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaW50IG51bWJlck9mUmVtYWluaW5nQXJndW1lbnRzID0gYXJnU2VsZWN0b3JzLnNpemUoKTsKLSAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KG51bWJlck9mUmVtYWluaW5nQXJndW1lbnRzKTsKKyAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIobnVtYmVyT2ZSZW1haW5pbmdBcmd1bWVudHMpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mUmVtYWluaW5nQXJndW1lbnRzOyBpKyspCiAgICAgICAgICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShhcmdTZWxlY3RvcnMuZ2V0KGkpLCBvdXQsIHZlcnNpb24pOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL0FnZ3JlZ2F0ZUZ1bmN0aW9uU2VsZWN0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL0FnZ3JlZ2F0ZUZ1bmN0aW9uU2VsZWN0b3IuamF2YQppbmRleCA4YzRmNzQ1Li44ZDIxYzFlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9BZ2dyZWdhdGVGdW5jdGlvblNlbGVjdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vQWdncmVnYXRlRnVuY3Rpb25TZWxlY3Rvci5qYXZhCkBAIC00MywxMyArNDMsMTUgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYWRkSW5wdXQoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgSW5wdXRSb3cgaW5wdXQpCisgICAgcHVibGljIHZvaWQgYWRkSW5wdXQoSW5wdXRSb3cgaW5wdXQpCiAgICAgeworICAgICAgICBQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uID0gaW5wdXQuZ2V0UHJvdG9jb2xWZXJzaW9uKCk7CisKICAgICAgICAgLy8gQWdncmVnYXRpb24gb2YgYWdncmVnYXRpb24gaXMgbm90IHN1cHBvcnRlZAogICAgICAgICBmb3IgKGludCBpID0gMCwgbSA9IGFyZ1NlbGVjdG9ycy5zaXplKCk7IGkgPCBtOyBpKyspCiAgICAgICAgIHsKICAgICAgICAgICAgIFNlbGVjdG9yIHMgPSBhcmdTZWxlY3RvcnMuZ2V0KGkpOwotICAgICAgICAgICAgcy5hZGRJbnB1dChwcm90b2NvbFZlcnNpb24sIGlucHV0KTsKKyAgICAgICAgICAgIHMuYWRkSW5wdXQoaW5wdXQpOwogICAgICAgICAgICAgc2V0QXJnKGksIHMuZ2V0T3V0cHV0KHByb3RvY29sVmVyc2lvbikpOwogICAgICAgICAgICAgcy5yZXNldCgpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9Db2x1bW5UaW1lc3RhbXBzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9Db2x1bW5UaW1lc3RhbXBzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhYzkyNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL0NvbHVtblRpbWVzdGFtcHMuamF2YQpAQCAtMCwwICsxLDM5NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnNlbGVjdGlvbjsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkJvdW5kVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlJhbmdlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Vc2VyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuQ29sbGVjdGlvblNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgbGlzdCBvZiB0aW1lc3RhbXBzIGFzc29jaWF0ZWQgdG8gYSBDUUwgY29sdW1uLiBUaG9zZSB0aW1lc3RhbXBzIGNhbiBlaXRoZXIgYmUgd3JpdGV0aW1lcyBvciBUVExzLAorICogYWNjb3JkaW5nIHRvIHtAbGluayBUaW1lc3RhbXBzVHlwZX0uCisgKi8KK2Fic3RyYWN0IGNsYXNzIENvbHVtblRpbWVzdGFtcHMKK3sKKyAgICAvKioKKyAgICAgKiBUaGUgdGltZXN0YW1wcyB0eXBlLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBUaW1lc3RhbXBzVHlwZSB0eXBlOworCisgICAgcHJvdGVjdGVkIENvbHVtblRpbWVzdGFtcHMoVGltZXN0YW1wc1R5cGUgdHlwZSkKKyAgICB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdGltZXN0YW1wcyB0eXBlCisgICAgICovCisgICAgcHVibGljIFRpbWVzdGFtcHNUeXBlIHR5cGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSB0aW1lc3RhbXBzIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5kZXggdGhlIHRpbWVzdGFtcHMgcG9zaXRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSB0aW1lc3RhbXBzIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gb3IgYSB7QGxpbmsgI05PX1RJTUVTVEFNUH0KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQ29sdW1uVGltZXN0YW1wcyBnZXQoaW50IGluZGV4KTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBDb2x1bW5UaW1lc3RhbXBzIG1heCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHZpZXcgb2YgdGhlIHBvcnRpb24gb2YgdGhlIHRpbWVzdGFtcHMgd2l0aGluIHRoZSBzcGVjaWZpZWQgcmFuZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmFuZ2UgdGhlIGluZGV4ZXMgcmFuZ2UKKyAgICAgKiBAcmV0dXJuIGEgdmlldyBvZiB0aGUgc3BlY2lmaWVkIHJhbmdlIHdpdGhpbiB0aGlzIHtAbGluayBDb2x1bW5UaW1lc3RhbXBzfQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBDb2x1bW5UaW1lc3RhbXBzIHNsaWNlKFJhbmdlPEludGVnZXI+IHJhbmdlKTsKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoZSB0aW1lc3RhbXBzIGludG8gdGhlaXIgc2VyaWFsaXplZCBmb3JtLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3RvY29sVmVyc2lvbiB0aGUgcHJvdG9jb2wgdmVyc2lvbiB0byB1c2UgZm9yIHRoZSBzZXJpYWxpemF0aW9uCisgICAgICogQHJldHVybiB0aGUgc2VyaWFsaXplZCB0aW1lc3RhbXBzCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEJ5dGVCdWZmZXIgdG9CeXRlQnVmZmVyKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pOworCisgICAgLyoqCisgICAgICogQXBwZW5kcyBhbiBlbXB0eSB0aW1lc3RhbXAgYXQgdGhlIGVuZCBvZiB0aGlzIGxpc3QuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgYWRkTm9UaW1lc3RhbXAoKTsKKworICAgIC8qKgorICAgICAqIEFwcGVuZHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgc3BlY2lmaWVkIGNlbGwgYXQgdGhlIGVuZCBvZiB0aGlzIGxpc3QuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgYWRkVGltZXN0YW1wRnJvbShDZWxsPD8+IGNlbGwsIGludCBub3dJblNlY29uZCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDb2x1bW5UaW1lc3RhbXBzfSBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4gdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aW1lc3RhbXBUeXBlIHRoZSB0aW1lc3RhbXBzIHR5cGUKKyAgICAgKiBAcGFyYW0gY29sdW1uVHlwZSAgICB0aGUgY29sdW1uIHR5cGUKKyAgICAgKiBAcmV0dXJuIGEge0BsaW5rIENvbHVtblRpbWVzdGFtcHN9IGluc3RhbmNlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbiB0eXBlCisgICAgICovCisgICAgc3RhdGljIENvbHVtblRpbWVzdGFtcHMgbmV3VGltZXN0YW1wcyhUaW1lc3RhbXBzVHlwZSB0aW1lc3RhbXBUeXBlLCBBYnN0cmFjdFR5cGU8Pz4gY29sdW1uVHlwZSkKKyAgICB7CisgICAgICAgIGlmICghY29sdW1uVHlwZS5pc011bHRpQ2VsbCgpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGVUaW1lc3RhbXBzKHRpbWVzdGFtcFR5cGUpOworCisgICAgICAgIC8vIEZvciBVc2VyVHlwZSB3ZSBrbm93IHRoYXQgdGhlIHNpemUgd2lsbCBub3QgY2hhbmdlLCBzbyB3ZSBjYW4gaW5pdGlhbGl6ZSB0aGUgYXJyYXkgd2l0aCB0aGUgcHJvcGVyIGNhcGFjaXR5LgorICAgICAgICBpZiAoY29sdW1uVHlwZSBpbnN0YW5jZW9mIFVzZXJUeXBlKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBNdWx0aXBsZVRpbWVzdGFtcHModGltZXN0YW1wVHlwZSwgKChVc2VyVHlwZSkgY29sdW1uVHlwZSkuc2l6ZSgpKTsKKworICAgICAgICByZXR1cm4gbmV3IE11bHRpcGxlVGltZXN0YW1wcyh0aW1lc3RhbXBUeXBlLCAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiByZXByZXNlbnRlZCB0aW1lc3RhbXBzLgorICAgICAqLworICAgIHB1YmxpYyBlbnVtIFRpbWVzdGFtcHNUeXBlCisgICAgeworICAgICAgICBXUklURVRJTUVTCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgbG9uZyBnZXRUaW1lc3RhbXAoQ2VsbDw/PiBjZWxsLCBpbnQgbm93SW5TZWNvbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNlbGwudGltZXN0YW1wKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgbG9uZyBkZWZhdWx0VmFsdWUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBMb25nLk1JTl9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBCeXRlQnVmZmVyIHRvQnl0ZUJ1ZmZlcihsb25nIHRpbWVzdGFtcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGltZXN0YW1wID09IGRlZmF1bHRWYWx1ZSgpID8gbnVsbCA6IEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKHRpbWVzdGFtcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIFRUTFMKKyAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBsb25nIGdldFRpbWVzdGFtcChDZWxsPD8+IGNlbGwsIGludCBub3dJblNlY29uZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWNlbGwuaXNFeHBpcmluZygpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlKCk7CisKKyAgICAgICAgICAgICAgICBpbnQgcmVtYWluaW5nID0gY2VsbC5sb2NhbERlbGV0aW9uVGltZSgpIC0gbm93SW5TZWNvbmQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlbWFpbmluZyA+PSAwID8gcmVtYWluaW5nIDogZGVmYXVsdFZhbHVlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgbG9uZyBkZWZhdWx0VmFsdWUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBCeXRlQnVmZmVyIHRvQnl0ZUJ1ZmZlcihsb25nIHRpbWVzdGFtcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGltZXN0YW1wID09IGRlZmF1bHRWYWx1ZSgpID8gbnVsbCA6IEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKChpbnQpIHRpbWVzdGFtcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEV4dHJhY3RzIHRoZSB0aW1lc3RhbXAgZnJvbSB0aGUgc3BlY2lmaWVkIGNlbGwuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjZWxsICAgICAgICB0aGUgY2VsbAorICAgICAgICAgKiBAcGFyYW0gbm93SW5TZWNvbmQgdGhlIHF1ZXJ5IHRpbWVzdGFtcCBpbnNlY29uZAorICAgICAgICAgKiBAcmV0dXJuIHRoZSB0aW1lc3RhbXAgY29ycmVzcG9uZGluZyB0byB0aGlzIHR5cGUKKyAgICAgICAgICovCisgICAgICAgIGFic3RyYWN0IGxvbmcgZ2V0VGltZXN0YW1wKENlbGw8Pz4gY2VsbCwgaW50IG5vd0luU2Vjb25kKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlcmUgaXMgbm8gdGltZXN0YW1wLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGVyZSBpcyBubyB0aW1lc3RhbXAKKyAgICAgICAgICovCisgICAgICAgIGFic3RyYWN0IGxvbmcgZGVmYXVsdFZhbHVlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNlcmlhbGl6ZXMgdGhlIHNwZWNpZmllZCB0aW1lc3RhbXAuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0aW1lc3RhbXAgdGhlIHRpbWVzdGFtcCB0byBzZXJpYWxpemUKKyAgICAgICAgICogQHJldHVybiB0aGUgYnl0ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIHRpbWVzdGFtcAorICAgICAgICAgKi8KKyAgICAgICAgYWJzdHJhY3QgQnl0ZUJ1ZmZlciB0b0J5dGVCdWZmZXIobG9uZyB0aW1lc3RhbXApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEge0BsaW5rIENvbHVtblRpbWVzdGFtcHN9IHRoYXQgZG9lc24ndCBjb250YWluIGFueSB0aW1lc3RhbXBzLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBDb2x1bW5UaW1lc3RhbXBzIE5PX1RJTUVTVEFNUCA9IG5ldyBDb2x1bW5UaW1lc3RhbXBzKG51bGwpCisgICAgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbHVtblRpbWVzdGFtcHMgZ2V0KGludCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbHVtblRpbWVzdGFtcHMgbWF4KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbHVtblRpbWVzdGFtcHMgc2xpY2UoUmFuZ2U8SW50ZWdlcj4gcmFuZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIHRvQnl0ZUJ1ZmZlcihQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhZGROb1RpbWVzdGFtcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFRpbWVzdGFtcEZyb20oQ2VsbDw/PiBjZWxsLCBpbnQgbm93SW5TZWNvbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gIm5vIHRpbWVzdGFtcCI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogQSB7QGxpbmsgQ29sdW1uVGltZXN0YW1wc30gdGhhdCBjYW4gY29udGFpbnMgYSBzaW5nbGUgdGltZXN0YW1wIChmb3IgY29sdW1ucyB0aGF0IGFyZW4ndCBtdWx0aWNlbGwpLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNpbmdsZVRpbWVzdGFtcHMgZXh0ZW5kcyBDb2x1bW5UaW1lc3RhbXBzCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgbG9uZyB0aW1lc3RhbXA7CisKKyAgICAgICAgcHVibGljIFNpbmdsZVRpbWVzdGFtcHMoVGltZXN0YW1wc1R5cGUgdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcyh0eXBlLCB0eXBlLmRlZmF1bHRWYWx1ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTaW5nbGVUaW1lc3RhbXBzKFRpbWVzdGFtcHNUeXBlIHR5cGUsIGxvbmcgdGltZXN0YW1wKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcih0eXBlKTsKKyAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZE5vVGltZXN0YW1wKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGltZXN0YW1wID0gdHlwZS5kZWZhdWx0VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhZGRUaW1lc3RhbXBGcm9tKENlbGw8Pz4gY2VsbCwgaW50IG5vd0luU2Vjb25kKQorICAgICAgICB7CisgICAgICAgICAgICB0aW1lc3RhbXAgPSB0eXBlLmdldFRpbWVzdGFtcChjZWxsLCBub3dJblNlY29uZCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbHVtblRpbWVzdGFtcHMgZ2V0KGludCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGl0IG1lYW5zIHRoYXQgaXQgaXMgYW4gZWxlbWVudCBzZWxlY3Rpb24gb24gYSBmcm96ZW4gY29sbGVjdGlvbi9VRFQsCisgICAgICAgICAgICAvLyBzbyB3ZSBjYW4gc2FmZWx5IHJldHVybiB0aGlzIFRpbWVzdGFtcHMgYXMgYWxsIHRoZSBlbGVtZW50cyBhbHNvIHNoYXJlIHRoYXQgdGltZXN0YW1wCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29sdW1uVGltZXN0YW1wcyBtYXgoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29sdW1uVGltZXN0YW1wcyBzbGljZShSYW5nZTxJbnRlZ2VyPiByYW5nZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHJhbmdlLmlzRW1wdHkoKSA/IE5PX1RJTUVTVEFNUCA6IHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgdG9CeXRlQnVmZmVyKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0aW1lc3RhbXAgPT0gdHlwZS5kZWZhdWx0VmFsdWUoKSA/IG51bGwgOiB0eXBlLnRvQnl0ZUJ1ZmZlcih0aW1lc3RhbXApOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSArICI6ICIgKyB0aW1lc3RhbXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHtAbGluayBDb2x1bW5UaW1lc3RhbXBzfSB0aGF0IGNhbiBjb250YWluIG11bHRpcGxlIHRpbWVzdGFtcHMgKGZvciB1bmZyb3plbiBjb2xsZWN0aW9ucyBvciBVRFRzKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNdWx0aXBsZVRpbWVzdGFtcHMgZXh0ZW5kcyBDb2x1bW5UaW1lc3RhbXBzCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8TG9uZz4gdGltZXN0YW1wczsKKworICAgICAgICBwdWJsaWMgTXVsdGlwbGVUaW1lc3RhbXBzKFRpbWVzdGFtcHNUeXBlIHR5cGUsIGludCBpbml0aWFsQ2FwYWNpdHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXModHlwZSwgbmV3IEFycmF5TGlzdDw+KGluaXRpYWxDYXBhY2l0eSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE11bHRpcGxlVGltZXN0YW1wcyhUaW1lc3RhbXBzVHlwZSB0eXBlLCBMaXN0PExvbmc+IHRpbWVzdGFtcHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKHR5cGUpOworICAgICAgICAgICAgdGhpcy50aW1lc3RhbXBzID0gdGltZXN0YW1wczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhZGROb1RpbWVzdGFtcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRpbWVzdGFtcHMuYWRkKHR5cGUuZGVmYXVsdFZhbHVlKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFRpbWVzdGFtcEZyb20oQ2VsbDw/PiBjZWxsLCBpbnQgbm93SW5TZWNvbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRpbWVzdGFtcHMuYWRkKHR5cGUuZ2V0VGltZXN0YW1wKGNlbGwsIG5vd0luU2Vjb25kKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbHVtblRpbWVzdGFtcHMgZ2V0KGludCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRpbWVzdGFtcHMuaXNFbXB0eSgpCisgICAgICAgICAgICAgICAgICAgPyBOT19USU1FU1RBTVAKKyAgICAgICAgICAgICAgICAgICA6IG5ldyBTaW5nbGVUaW1lc3RhbXBzKHR5cGUsIHRpbWVzdGFtcHMuZ2V0KGluZGV4KSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbHVtblRpbWVzdGFtcHMgbWF4KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRpbWVzdGFtcHMuaXNFbXB0eSgpCisgICAgICAgICAgICAgICAgICAgPyBOT19USU1FU1RBTVAKKyAgICAgICAgICAgICAgICAgICA6IG5ldyBTaW5nbGVUaW1lc3RhbXBzKHR5cGUsIENvbGxlY3Rpb25zLm1heCh0aW1lc3RhbXBzKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbHVtblRpbWVzdGFtcHMgc2xpY2UoUmFuZ2U8SW50ZWdlcj4gcmFuZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyYW5nZS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX1RJTUVTVEFNUDsKKworICAgICAgICAgICAgLy8gUHJlcGFyZSB0aGUgImZyb20iIGFyZ3VtZW50IGZvciB0aGUgY2FsbCB0byBMaXN0I3N1Ymxpc3QgYmVsb3cuIFRoYXQgYXJndW1lbnQgaXMgYWx3YXlzIHNwZWNpZmllZCBhbmQKKyAgICAgICAgICAgIC8vIGluY2x1c2l2ZSwgd2hlcmVhcyB0aGUgcmFuZ2UgbG93ZXIgYm91bmQgY2FuIGJlIG9wZW4sIGNsb3NlZCBvciBub3Qgc3BlY2lmaWVkLgorICAgICAgICAgICAgaW50IGZyb20gPSAwOworICAgICAgICAgICAgaWYgKHJhbmdlLmhhc0xvd2VyQm91bmQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcm9tID0gcmFuZ2UubG93ZXJCb3VuZFR5cGUoKSA9PSBCb3VuZFR5cGUuQ0xPU0VECisgICAgICAgICAgICAgICAgICAgICAgID8gcmFuZ2UubG93ZXJFbmRwb2ludCgpIC8vIGluY2x1c2l2ZSByYW5nZSBsb3dlciBib3VuZCwgaW5jbHVzaXZlICJmcm9tIiBpcyB0aGUgc2FtZSBsaXN0IHBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICAgIDogcmFuZ2UubG93ZXJFbmRwb2ludCgpICsgMTsgLy8gZXhjbHVzaXZlIHJhbmdlIGxvd2VyIGJvdW5kLCBpbmNsdXNpdmUgImZyb20iIGlzIHRoZSBuZXh0IGxpc3QgcG9zaXRpb24KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUHJlcGFyZSB0aGUgInRvIiBhcmd1bWVudCBmb3IgdGhlIGNhbGwgdG8gTGlzdCNzdWJsaXN0IGJlbG93LiBUaGF0IGFyZ3VtZW50IGlzIGFsd2F5cyBzcGVjaWZpZWQgYW5kCisgICAgICAgICAgICAvLyBleGNsdXNpdmUsIHdoZXJlYXMgdGhlIHJhbmdlIHVwcGVyIGJvdW5kIGNhbiBiZSBvcGVuLCBjbG9zZWQgb3Igbm90IHNwZWNpZmllZC4KKyAgICAgICAgICAgIGludCB0byA9IHRpbWVzdGFtcHMuc2l6ZSgpOworICAgICAgICAgICAgaWYgKHJhbmdlLmhhc1VwcGVyQm91bmQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0byA9IHJhbmdlLnVwcGVyQm91bmRUeXBlKCkgPT0gQm91bmRUeXBlLkNMT1NFRAorICAgICAgICAgICAgICAgICAgICAgPyByYW5nZS51cHBlckVuZHBvaW50KCkgKyAxIC8vIGluY2x1c2l2ZSByYW5nZSB1cHBlciBib3VuZCwgZXhjbHVzaXZlICJ0byIgaXMgdGhlIG5leHQgbGlzdCBwb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICAgOiByYW5nZS51cHBlckVuZHBvaW50KCk7IC8vIGV4Y2x1c2l2ZSByYW5nZSB1cHBlciBib3VuZCwgZXhjbHVzaXZlICJ0byIgaXMgdGhlIHNhbWUgbGlzdCBwb3NpdGlvbgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IE11bHRpcGxlVGltZXN0YW1wcyh0eXBlLCB0aW1lc3RhbXBzLnN1Ykxpc3QoZnJvbSwgdG8pKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciB0b0J5dGVCdWZmZXIoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRpbWVzdGFtcHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IGJ1ZmZlcnMgPSBuZXcgQXJyYXlMaXN0PD4odGltZXN0YW1wcy5zaXplKCkpOworICAgICAgICAgICAgdGltZXN0YW1wcy5mb3JFYWNoKHRpbWVzdGFtcCAtPiBidWZmZXJzLmFkZCh0eXBlLnRvQnl0ZUJ1ZmZlcih0aW1lc3RhbXApKSk7CisKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKGJ1ZmZlcnMsIHRpbWVzdGFtcHMuc2l6ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgKyAiOiAiICsgdGltZXN0YW1wczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL0VsZW1lbnRzU2VsZWN0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL0VsZW1lbnRzU2VsZWN0b3IuamF2YQppbmRleCBlNTIwZDBmLi40NjQ0YmEyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9FbGVtZW50c1NlbGVjdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vRWxlbWVudHNTZWxlY3Rvci5qYXZhCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlJhbmdlOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Db2x1bW5TcGVjaWZpY2F0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuUXVlcnlPcHRpb25zOwpAQCAtNDMsMTIgKzQ0LDE5IEBACiAgKi8KIGFic3RyYWN0IGNsYXNzIEVsZW1lbnRzU2VsZWN0b3IgZXh0ZW5kcyBTZWxlY3RvcgogeworICAgIC8qKgorICAgICAqIEFuIGVtcHR5IGNvbGxlY3Rpb24gaXMgY29tcG9zZWQgb2YgYW4gaW50IHNpemUgb2YgemVyby4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIEVNUFRZX0ZST1pFTl9DT0xMRUNUSU9OID0gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoMCk7CisKICAgICBwcm90ZWN0ZWQgZmluYWwgU2VsZWN0b3Igc2VsZWN0ZWQ7CisgICAgcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb25UeXBlPD8+IHR5cGU7CiAKICAgICBwcm90ZWN0ZWQgRWxlbWVudHNTZWxlY3RvcihLaW5kIGtpbmQsU2VsZWN0b3Igc2VsZWN0ZWQpCiAgICAgewogICAgICAgICBzdXBlcihraW5kKTsKICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHNlbGVjdGVkOworICAgICAgICB0aGlzLnR5cGUgPSBnZXRDb2xsZWN0aW9uVHlwZShzZWxlY3RlZCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Vuc2V0KEJ5dGVCdWZmZXIgYmIpCkBAIC0yMzcsOSArMjQ1LDE0IEBACiAKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQnl0ZUJ1ZmZlciBleHRyYWN0U2VsZWN0aW9uKEJ5dGVCdWZmZXIgY29sbGVjdGlvbik7CiAKLSAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBJbnB1dFJvdyBpbnB1dCkKKyAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChJbnB1dFJvdyBpbnB1dCkKICAgICB7Ci0gICAgICAgIHNlbGVjdGVkLmFkZElucHV0KHByb3RvY29sVmVyc2lvbiwgaW5wdXQpOworICAgICAgICBzZWxlY3RlZC5hZGRJbnB1dChpbnB1dCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFJhbmdlPEludGVnZXI+IGdldEluZGV4UmFuZ2UoQnl0ZUJ1ZmZlciBvdXRwdXQsIEJ5dGVCdWZmZXIgZnJvbUtleSwgQnl0ZUJ1ZmZlciB0b0tleSkKKyAgICB7CisgICAgICAgIHJldHVybiB0eXBlLmdldFNlcmlhbGl6ZXIoKS5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChvdXRwdXQsIGZyb21LZXksIHRvS2V5LCBrZXlUeXBlKHR5cGUpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZXNldCgpCkBAIC0yNjYsMTMgKzI3OSwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9OwogCi0gICAgICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvblR5cGU8Pz4gdHlwZTsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBCeXRlQnVmZmVyIGtleTsKIAogICAgICAgICBwcml2YXRlIEVsZW1lbnRTZWxlY3RvcihTZWxlY3RvciBzZWxlY3RlZCwgQnl0ZUJ1ZmZlciBrZXkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHN1cGVyKEtpbmQuRUxFTUVOVF9TRUxFQ1RPUiwgc2VsZWN0ZWQpOwotICAgICAgICAgICAgdGhpcy50eXBlID0gZ2V0Q29sbGVjdGlvblR5cGUoc2VsZWN0ZWQpOwogICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7CiAgICAgICAgIH0KIApAQCAtMjk0LDYgKzMwNSwzMSBAQAogICAgICAgICAgICAgcmV0dXJuIHR5cGUuZ2V0U2VyaWFsaXplcigpLmdldFNlcmlhbGl6ZWRWYWx1ZShjb2xsZWN0aW9uLCBrZXksIGtleVR5cGUodHlwZSkpOwogICAgICAgICB9CiAKKyAgICAgICAgcHJvdGVjdGVkIGludCBnZXRFbGVtZW50SW5kZXgoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgQnl0ZUJ1ZmZlciBrZXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgb3V0cHV0ID0gc2VsZWN0ZWQuZ2V0T3V0cHV0KHByb3RvY29sVmVyc2lvbik7CisgICAgICAgICAgICByZXR1cm4gb3V0cHV0ID09IG51bGwgPyAtMSA6IHR5cGUuZ2V0U2VyaWFsaXplcigpLmdldEluZGV4RnJvbVNlcmlhbGl6ZWQob3V0cHV0LCBrZXksIGtleVR5cGUodHlwZSkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDb2x1bW5UaW1lc3RhbXBzIGdldFdyaXRldGltZXMoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRUaW1lc3RhbXBzKHByb3RvY29sVmVyc2lvbiwgc2VsZWN0ZWQuZ2V0V3JpdGV0aW1lcyhwcm90b2NvbFZlcnNpb24pKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQ29sdW1uVGltZXN0YW1wcyBnZXRUVExzKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRFbGVtZW50VGltZXN0YW1wcyhwcm90b2NvbFZlcnNpb24sIHNlbGVjdGVkLmdldFRUTHMocHJvdG9jb2xWZXJzaW9uKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIENvbHVtblRpbWVzdGFtcHMgZ2V0RWxlbWVudFRpbWVzdGFtcHMoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtblRpbWVzdGFtcHMgdGltZXN0YW1wcykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGluZGV4ID0gZ2V0RWxlbWVudEluZGV4KHByb3RvY29sVmVyc2lvbiwga2V5KTsKKyAgICAgICAgICAgIHJldHVybiBpbmRleCA9PSAtMSA/IENvbHVtblRpbWVzdGFtcHMuTk9fVElNRVNUQU1QIDogdGltZXN0YW1wcy5nZXQoaW5kZXgpOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRUeXBlKCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIHZhbHVlVHlwZSh0eXBlKTsKQEAgLTM1OCw4ICszOTQsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9OwogCi0gICAgICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvblR5cGU8Pz4gdHlwZTsKLQogICAgICAgICAvLyBOb3RlIHRoYXQgbmVpdGhlciBmcm9tIG5vciB0byBjYW4gYmUgbnVsbCwgYnV0IHRoZXkgY2FuIGJvdGggYmUgQnl0ZUJ1ZmZlclV0aWwuVU5TRVRfQllURV9CVUZGRVIgdG8gcmVwcmVzZW50IG5vIHBhcnRpY3VsYXIgYm91bmQKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBCeXRlQnVmZmVyIGZyb207CiAgICAgICAgIHByaXZhdGUgZmluYWwgQnl0ZUJ1ZmZlciB0bzsKQEAgLTM2OCw3ICs0MDIsNiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBzdXBlcihLaW5kLlNMSUNFX1NFTEVDVE9SLCBzZWxlY3RlZCk7CiAgICAgICAgICAgICBhc3NlcnQgZnJvbSAhPSBudWxsICYmIHRvICE9IG51bGwgOiAiV2UgY2FuIGhhdmUgdW5zZXQgYnVmZmVycywgYnV0IG5vdCBudWxscyI7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSBnZXRDb2xsZWN0aW9uVHlwZShzZWxlY3RlZCk7CiAgICAgICAgICAgICB0aGlzLmZyb20gPSBmcm9tOwogICAgICAgICAgICAgdGhpcy50byA9IHRvOwogICAgICAgICB9CkBAIC0zOTEsNiArNDI0LDM2IEBACiAgICAgICAgICAgICByZXR1cm4gdHlwZS5nZXRTZXJpYWxpemVyKCkuZ2V0U2xpY2VGcm9tU2VyaWFsaXplZChjb2xsZWN0aW9uLCBmcm9tLCB0bywgdHlwZS5uYW1lQ29tcGFyYXRvcigpLCB0eXBlLmlzRnJvemVuQ29sbGVjdGlvbigpKTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQ29sdW1uVGltZXN0YW1wcyBnZXRXcml0ZXRpbWVzKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRUaW1lc3RhbXBzU2xpY2UocHJvdG9jb2xWZXJzaW9uLCBzZWxlY3RlZC5nZXRXcml0ZXRpbWVzKHByb3RvY29sVmVyc2lvbikpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDb2x1bW5UaW1lc3RhbXBzIGdldFRUTHMoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGdldFRpbWVzdGFtcHNTbGljZShwcm90b2NvbFZlcnNpb24sIHNlbGVjdGVkLmdldFRUTHMocHJvdG9jb2xWZXJzaW9uKSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgQ29sdW1uVGltZXN0YW1wcyBnZXRUaW1lc3RhbXBzU2xpY2UoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgQ29sdW1uVGltZXN0YW1wcyB0aW1lc3RhbXBzKQorICAgICAgICB7CisgICAgICAgICAgICBCeXRlQnVmZmVyIG91dHB1dCA9IHNlbGVjdGVkLmdldE91dHB1dChwcm90b2NvbFZlcnNpb24pOworICAgICAgICAgICAgcmV0dXJuIChvdXRwdXQgPT0gbnVsbCB8fCBpc0NvbGxlY3Rpb25FbXB0eShvdXRwdXQpKQorICAgICAgICAgICAgICAgICAgID8gQ29sdW1uVGltZXN0YW1wcy5OT19USU1FU1RBTVAKKyAgICAgICAgICAgICAgICAgICA6IHRpbWVzdGFtcHMuc2xpY2UoZ2V0SW5kZXhSYW5nZShvdXRwdXQsIGZyb20sIHRvKSApOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiB0aGUgY29sbGVjdGlvbiBpcyBlbXB0eS4gT25seSBmcm96ZW4gY29sbGVjdGlvbiBjYW4gYmUgZW1wdHkuCisgICAgICAgICAqIEBwYXJhbSBvdXRwdXQgdGhlIHNlcmlhbGl6ZWQgY29sbGVjdGlvbgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgY29sbGVjdGlvbiBpcyBlbXB0eSB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbGxlY3Rpb25FbXB0eShCeXRlQnVmZmVyIG91dHB1dCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0ZST1pFTl9DT0xMRUNUSU9OLmVxdWFscyhvdXRwdXQpOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRUeXBlKCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIHR5cGU7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9GaWVsZFNlbGVjdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9GaWVsZFNlbGVjdG9yLmphdmEKaW5kZXggMGM2MjM5Ny4uMjBjMTAyOSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vRmllbGRTZWxlY3Rvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL0ZpZWxkU2VsZWN0b3IuamF2YQpAQCAtMjcsNiArMjcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZUJ1ZmZlckFjY2Vzc29yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVXNlclR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CkBAIC00MSw3ICs0Miw3IEBACiAgICAgICAgIHByb3RlY3RlZCBTZWxlY3RvciBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBpbnQgdmVyc2lvbiwgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIFVzZXJUeXBlIHR5cGUgPSAoVXNlclR5cGUpIHJlYWRUeXBlKG1ldGFkYXRhLCBpbik7Ci0gICAgICAgICAgICBpbnQgZmllbGQgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICBpbnQgZmllbGQgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKICAgICAgICAgICAgIFNlbGVjdG9yIHNlbGVjdGVkID0gU2VsZWN0b3Iuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbiwgdmVyc2lvbiwgbWV0YWRhdGEpOwogCiAgICAgICAgICAgICByZXR1cm4gbmV3IEZpZWxkU2VsZWN0b3IodHlwZSwgZmllbGQsIHNlbGVjdGVkKTsKQEAgLTk4LDkgKzk5LDkgQEAKICAgICAgICAgc2VsZWN0ZWQuYWRkRmV0Y2hlZENvbHVtbnMoYnVpbGRlcik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYWRkSW5wdXQoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgSW5wdXRSb3cgaW5wdXQpCisgICAgcHVibGljIHZvaWQgYWRkSW5wdXQoSW5wdXRSb3cgaW5wdXQpCiAgICAgewotICAgICAgICBzZWxlY3RlZC5hZGRJbnB1dChwcm90b2NvbFZlcnNpb24sIGlucHV0KTsKKyAgICAgICAgc2VsZWN0ZWQuYWRkSW5wdXQoaW5wdXQpOwogICAgIH0KIAogICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE91dHB1dChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKQpAQCAtMTA4LDEwICsxMDksMjYgQEAKICAgICAgICAgQnl0ZUJ1ZmZlciB2YWx1ZSA9IHNlbGVjdGVkLmdldE91dHB1dChwcm90b2NvbFZlcnNpb24pOwogICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBCeXRlQnVmZmVyW10gYnVmZmVycyA9IHR5cGUuc3BsaXQodmFsdWUpOworICAgICAgICBCeXRlQnVmZmVyW10gYnVmZmVycyA9IHR5cGUuc3BsaXQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCB2YWx1ZSk7CiAgICAgICAgIHJldHVybiBmaWVsZCA8IGJ1ZmZlcnMubGVuZ3RoID8gYnVmZmVyc1tmaWVsZF0gOiBudWxsOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBDb2x1bW5UaW1lc3RhbXBzIGdldFdyaXRldGltZXMoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRPdXRwdXQocHJvdG9jb2xWZXJzaW9uKSA9PSBudWxsCisgICAgICAgICAgICAgICA/IENvbHVtblRpbWVzdGFtcHMuTk9fVElNRVNUQU1QCisgICAgICAgICAgICAgICA6IHNlbGVjdGVkLmdldFdyaXRldGltZXMocHJvdG9jb2xWZXJzaW9uKS5nZXQoZmllbGQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBDb2x1bW5UaW1lc3RhbXBzIGdldFRUTHMoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRPdXRwdXQocHJvdG9jb2xWZXJzaW9uKSA9PSBudWxsCisgICAgICAgICAgICAgICA/IENvbHVtblRpbWVzdGFtcHMuTk9fVElNRVNUQU1QCisgICAgICAgICAgICAgICA6IHNlbGVjdGVkLmdldFRUTHMocHJvdG9jb2xWZXJzaW9uKS5nZXQoZmllbGQpOworICAgIH0KKwogICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZ2V0VHlwZSgpCiAgICAgewogICAgICAgICByZXR1cm4gdHlwZS5maWVsZFR5cGUoZmllbGQpOwpAQCAtMTc0LDcgKzE5MSw3IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgc2VyaWFsaXplKERhdGFPdXRwdXRQbHVzIG91dCwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgd3JpdGVUeXBlKG91dCwgdHlwZSk7Ci0gICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChmaWVsZCk7CisgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGZpZWxkKTsKICAgICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUoc2VsZWN0ZWQsIG91dCwgdmVyc2lvbik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vTGlzdFNlbGVjdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9MaXN0U2VsZWN0b3IuamF2YQppbmRleCA5MTM2YWIyLi41ZDA5NWQ1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9MaXN0U2VsZWN0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9MaXN0U2VsZWN0b3IuamF2YQpAQCAtNDcsNyArNDcsNyBAQAogICAgICAgICBwcm90ZWN0ZWQgU2VsZWN0b3IgZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbiwgaW50IHZlcnNpb24sIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICBMaXN0VHlwZTw/PiB0eXBlID0gKExpc3RUeXBlPD8+KSByZWFkVHlwZShtZXRhZGF0YSwgaW4pOwotICAgICAgICAgICAgaW50IHNpemUgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogICAgICAgICAgICAgTGlzdDxTZWxlY3Rvcj4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PD4oc2l6ZSk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKICAgICAgICAgICAgICAgICBlbGVtZW50cy5hZGQoc2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbiwgdmVyc2lvbiwgbWV0YWRhdGEpKTsKQEAgLTg5LDEwICs4OSwxMCBAQAogICAgICAgICAgICAgZWxlbWVudHMuZ2V0KGkpLmFkZEZldGNoZWRDb2x1bW5zKGJ1aWxkZXIpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGFkZElucHV0KFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIElucHV0Um93IGlucHV0KQorICAgIHB1YmxpYyB2b2lkIGFkZElucHV0KElucHV0Um93IGlucHV0KQogICAgIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDAsIG0gPSBlbGVtZW50cy5zaXplKCk7IGkgPCBtOyBpKyspCi0gICAgICAgICAgICBlbGVtZW50cy5nZXQoaSkuYWRkSW5wdXQocHJvdG9jb2xWZXJzaW9uLCBpbnB1dCk7CisgICAgICAgICAgICBlbGVtZW50cy5nZXQoaSkuYWRkSW5wdXQoaW5wdXQpOwogICAgIH0KIAogICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE91dHB1dChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKQpAQCAtMTAyLDcgKzEwMiw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGJ1ZmZlcnMuYWRkKGVsZW1lbnRzLmdldChpKS5nZXRPdXRwdXQocHJvdG9jb2xWZXJzaW9uKSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25TZXJpYWxpemVyLnBhY2soYnVmZmVycywgYnVmZmVycy5zaXplKCksIHByb3RvY29sVmVyc2lvbik7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKGJ1ZmZlcnMsIGJ1ZmZlcnMuc2l6ZSgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZXNldCgpCkBAIC0xNzUsNyArMTc1LDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXJpYWxpemUoRGF0YU91dHB1dFBsdXMgb3V0LCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICB3cml0ZVR5cGUob3V0LCB0eXBlKTsKLSAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGVsZW1lbnRzLnNpemUoKSk7CisgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGVsZW1lbnRzLnNpemUoKSk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwLCBtID0gZWxlbWVudHMuc2l6ZSgpOyBpIDwgbTsgaSsrKQogICAgICAgICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUoZWxlbWVudHMuZ2V0KGkpLCBvdXQsIHZlcnNpb24pOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL01hcFNlbGVjdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9NYXBTZWxlY3Rvci5qYXZhCmluZGV4IGRjODExYzAuLjI2NTgwZTcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL01hcFNlbGVjdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vTWFwU2VsZWN0b3IuamF2YQpAQCAtNTQsNyArNTQsNyBAQAogICAgICAgICBwcm90ZWN0ZWQgU2VsZWN0b3IgZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbiwgaW50IHZlcnNpb24sIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICBNYXBUeXBlPD8sID8+IHR5cGUgPSAoTWFwVHlwZTw/LCA/PikgcmVhZFR5cGUobWV0YWRhdGEsIGluKTsKLSAgICAgICAgICAgIGludCBzaXplID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgaW50IHNpemUgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKICAgICAgICAgICAgIExpc3Q8UGFpcjxTZWxlY3RvciwgU2VsZWN0b3I+PiBlbnRyaWVzID0gbmV3IEFycmF5TGlzdDw+KHNpemUpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCiAgICAgICAgICAgICB7CkBAIC0xOTMsMTMgKzE5MywxMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYWRkSW5wdXQoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgSW5wdXRSb3cgaW5wdXQpCisgICAgcHVibGljIHZvaWQgYWRkSW5wdXQoSW5wdXRSb3cgaW5wdXQpCiAgICAgewogICAgICAgICBmb3IgKGludCBpID0gMCwgbSA9IGVsZW1lbnRzLnNpemUoKTsgaSA8IG07IGkrKykKICAgICAgICAgewogICAgICAgICAgICAgUGFpcjxTZWxlY3RvciwgU2VsZWN0b3I+IHBhaXIgPSBlbGVtZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICBwYWlyLmxlZnQuYWRkSW5wdXQocHJvdG9jb2xWZXJzaW9uLCBpbnB1dCk7Ci0gICAgICAgICAgICBwYWlyLnJpZ2h0LmFkZElucHV0KHByb3RvY29sVmVyc2lvbiwgaW5wdXQpOworICAgICAgICAgICAgcGFpci5sZWZ0LmFkZElucHV0KGlucHV0KTsKKyAgICAgICAgICAgIHBhaXIucmlnaHQuYWRkSW5wdXQoaW5wdXQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMTgsNyArMjE4LDcgQEAKICAgICAgICAgICAgIGJ1ZmZlcnMuYWRkKGVudHJ5LmdldEtleSgpKTsKICAgICAgICAgICAgIGJ1ZmZlcnMuYWRkKGVudHJ5LmdldFZhbHVlKCkpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKGJ1ZmZlcnMsIGVsZW1lbnRzLnNpemUoKSwgcHJvdG9jb2xWZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25TZXJpYWxpemVyLnBhY2soYnVmZmVycywgZWxlbWVudHMuc2l6ZSgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZXNldCgpCkBAIC0zMDEsNyArMzAxLDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXJpYWxpemUoRGF0YU91dHB1dFBsdXMgb3V0LCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICB3cml0ZVR5cGUob3V0LCB0eXBlKTsKLSAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGVsZW1lbnRzLnNpemUoKSk7CisgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGVsZW1lbnRzLnNpemUoKSk7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDAsIG0gPSBlbGVtZW50cy5zaXplKCk7IGkgPCBtOyBpKyspCiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1Jlc3VsdFNldEJ1aWxkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1Jlc3VsdFNldEJ1aWxkZXIuamF2YQppbmRleCAyMjU2NmIyLi4zYWRjZjBkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9SZXN1bHRTZXRCdWlsZGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vUmVzdWx0U2V0QnVpbGRlci5qYXZhCkBAIC0yOCw2ICsyOCw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmFnZ3JlZ2F0aW9uLkdyb3VwTWFrZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ29sdW1uRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIAogcHVibGljIGZpbmFsIGNsYXNzIFJlc3VsdFNldEJ1aWxkZXIKIHsKQEAgLTQ0LDYgKzQ3LDExIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBHcm91cE1ha2VyIGdyb3VwTWFrZXI7CiAKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG1hc2tlZCBjb2x1bW5zIHNob3VsZCBiZSB1bm1hc2tlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gdW5tYXNrOworCiAgICAgLyoKICAgICAgKiBXZSdsbCBidWlsZCBDUUwzIHJvdyBvbmUgYnkgb25lLgogICAgICAqLwpAQCAtNTIsMTYgKzYwLDE3IEBACiAgICAgcHJpdmF0ZSBsb25nIHNpemUgPSAwOwogICAgIHByaXZhdGUgYm9vbGVhbiBzaXplV2FybmluZ0VtaXR0ZWQgPSBmYWxzZTsKIAotICAgIHB1YmxpYyBSZXN1bHRTZXRCdWlsZGVyKFJlc3VsdE1ldGFkYXRhIG1ldGFkYXRhLCBTZWxlY3RvcnMgc2VsZWN0b3JzKQorICAgIHB1YmxpYyBSZXN1bHRTZXRCdWlsZGVyKFJlc3VsdE1ldGFkYXRhIG1ldGFkYXRhLCBTZWxlY3RvcnMgc2VsZWN0b3JzLCBib29sZWFuIHVubWFzaykKICAgICB7Ci0gICAgICAgIHRoaXMobWV0YWRhdGEsIHNlbGVjdG9ycywgbnVsbCk7CisgICAgICAgIHRoaXMobWV0YWRhdGEsIHNlbGVjdG9ycywgdW5tYXNrLCBudWxsKTsKICAgICB9CiAKLSAgICBwdWJsaWMgUmVzdWx0U2V0QnVpbGRlcihSZXN1bHRNZXRhZGF0YSBtZXRhZGF0YSwgU2VsZWN0b3JzIHNlbGVjdG9ycywgR3JvdXBNYWtlciBncm91cE1ha2VyKQorICAgIHB1YmxpYyBSZXN1bHRTZXRCdWlsZGVyKFJlc3VsdE1ldGFkYXRhIG1ldGFkYXRhLCBTZWxlY3RvcnMgc2VsZWN0b3JzLCBib29sZWFuIHVubWFzaywgR3JvdXBNYWtlciBncm91cE1ha2VyKQogICAgIHsKLSAgICAgICAgdGhpcy5yZXN1bHRTZXQgPSBuZXcgUmVzdWx0U2V0KG1ldGFkYXRhLmNvcHkoKSwgbmV3IEFycmF5TGlzdDxMaXN0PEJ5dGVCdWZmZXI+PigpKTsKKyAgICAgICAgdGhpcy5yZXN1bHRTZXQgPSBuZXcgUmVzdWx0U2V0KG1ldGFkYXRhLmNvcHkoKSwgbmV3IEFycmF5TGlzdDw+KCkpOwogICAgICAgICB0aGlzLnNlbGVjdG9ycyA9IHNlbGVjdG9yczsKICAgICAgICAgdGhpcy5ncm91cE1ha2VyID0gZ3JvdXBNYWtlcjsKKyAgICAgICAgdGhpcy51bm1hc2sgPSB1bm1hc2s7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGFkZFNpemUoTGlzdDxCeXRlQnVmZmVyPiByb3cpCkBAIC0xMDMsMTMgKzExMiwxOCBAQAogICAgICAgICBpbnB1dFJvdy5hZGQoYywgbm93SW5TZWMpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIGFkZChDb2x1bW5EYXRhIGNvbHVtbkRhdGEsIGludCBub3dJblNlYykKKyAgICB7CisgICAgICAgIGlucHV0Um93LmFkZChjb2x1bW5EYXRhLCBub3dJblNlYyk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogTm90aWZpZXMgdGhpcyA8Y29kZT5CdWlsZGVyPC9jb2RlPiB0aGF0IGEgbmV3IHJvdyBpcyBiZWluZyBwcm9jZXNzZWQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcGFydGl0aW9uS2V5IHRoZSBwYXJ0aXRpb24ga2V5IG9mIHRoZSBuZXcgcm93CiAgICAgICogQHBhcmFtIGNsdXN0ZXJpbmcgdGhlIGNsdXN0ZXJpbmcgb2YgdGhlIG5ldyByb3cKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBuZXdSb3coRGVjb3JhdGVkS2V5IHBhcnRpdGlvbktleSwgQ2x1c3RlcmluZzw/PiBjbHVzdGVyaW5nKQorICAgIHB1YmxpYyB2b2lkIG5ld1JvdyhQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5LCBDbHVzdGVyaW5nPD8+IGNsdXN0ZXJpbmcsIExpc3Q8Q29sdW1uTWV0YWRhdGE+IGNvbHVtbnMpCiAgICAgewogICAgICAgICAvLyBUaGUgZ3JvdXBNYWtlciBuZWVkcyB0byBiZSBjYWxsZWQgZm9yIGVhY2ggcm93CiAgICAgICAgIGJvb2xlYW4gaXNOZXdBZ2dyZWdhdGUgPSBncm91cE1ha2VyID09IG51bGwgfHwgZ3JvdXBNYWtlci5pc05ld0dyb3VwKHBhcnRpdGlvbktleSwgY2x1c3RlcmluZyk7CkBAIC0xMjksNyArMTQzLDExIEBACiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7Ci0gICAgICAgICAgICBpbnB1dFJvdyA9IG5ldyBTZWxlY3Rvci5JbnB1dFJvdyhzZWxlY3RvcnMubnVtYmVyT2ZGZXRjaGVkQ29sdW1ucygpLCBzZWxlY3RvcnMuY29sbGVjdFRpbWVzdGFtcHMoKSwgc2VsZWN0b3JzLmNvbGxlY3RUVExzKCkpOworICAgICAgICAgICAgaW5wdXRSb3cgPSBuZXcgU2VsZWN0b3IuSW5wdXRSb3cocHJvdG9jb2xWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9ycy5jb2xsZWN0V3JpdGV0aW1lcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JzLmNvbGxlY3RUVExzKCkpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9Sb3dUaW1lc3RhbXBzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9Sb3dUaW1lc3RhbXBzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRkMjNlZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1Jvd1RpbWVzdGFtcHMuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnNlbGVjdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKKworLyoqCisgKiBUaGUge0BsaW5rIENvbHVtblRpbWVzdGFtcHN9IGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIHNldCBvZiBjb2x1bW5zIG9mIGEgcm93LgorICovCitpbnRlcmZhY2UgUm93VGltZXN0YW1wcworeworICAgIC8qKgorICAgICAqIEFkZHMgYW4gZW1wdHkgdGltZXN0YW1wIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRleCB0aGUgY29sdW1uIGluZGV4CisgICAgICovCisgICAgdm9pZCBhZGROb1RpbWVzdGFtcChpbnQgaW5kZXgpOworCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgdGltZXN0YW1wIG9mIHRoZSBzcGVjaWZpZWQgY2VsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRleCB0aGUgY29sdW1uIGluZGV4CisgICAgICogQHBhcmFtIGNlbGwgdGhlIGNlbGwgdG8gZ2V0IHRoZSB0aW1lc3RhbXAgZnJvbQorICAgICAqIEBwYXJhbSBub3dJblNlYyB0aGUgcXVlcnkgdGltZXN0YW1wIGluIHNlY29uZAorICAgICAqLworICAgIHZvaWQgYWRkVGltZXN0YW1wKGludCBpbmRleCwgQ2VsbDw/PiBjZWxsLCBpbnQgbm93SW5TZWMpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGltZXN0YW1wIG9mIHRoZSBzcGVjaWZpZWQgY29sdW1uLgorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4IHRoZSBjb2x1bW4gaW5kZXgKKyAgICAgKiBAcmV0dXJuIHRoZSB0aW1lc3RhbXAgb2YgdGhlIHNwZWNpZmllZCBjb2x1bW4KKyAgICAgKi8KKyAgICBDb2x1bW5UaW1lc3RhbXBzIGdldChpbnQgaW5kZXgpOworCisgICAgLyoqCisgICAgICogQSB7QGNvZGUgUm93VGltZXN0YW1wc30gdGhhdCBkb2VzIG5vdGhpbmcuCisgICAgICovCisgICAgUm93VGltZXN0YW1wcyBOT09QX1JPV19USU1FU1RBTVBTID0gbmV3IFJvd1RpbWVzdGFtcHMoKQorICAgIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZE5vVGltZXN0YW1wKGludCBpbmRleCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFRpbWVzdGFtcChpbnQgaW5kZXgsIENlbGw8Pz4gY2VsbCwgaW50IG5vd0luU2VjKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbHVtblRpbWVzdGFtcHMgZ2V0KGludCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENvbHVtblRpbWVzdGFtcHMuTk9fVElNRVNUQU1QOworICAgICAgICB9CisgICAgfTsKKworICAgIHN0YXRpYyBSb3dUaW1lc3RhbXBzIG5ld0luc3RhbmNlKENvbHVtblRpbWVzdGFtcHMuVGltZXN0YW1wc1R5cGUgdHlwZSwgTGlzdDxDb2x1bW5NZXRhZGF0YT4gY29sdW1ucykKKyAgICB7CisgICAgICAgIGZpbmFsIENvbHVtblRpbWVzdGFtcHNbXSBhcnJheSA9IG5ldyBDb2x1bW5UaW1lc3RhbXBzW2NvbHVtbnMuc2l6ZSgpXTsKKworICAgICAgICBmb3IgKGludCBpID0gMCwgbSA9IGNvbHVtbnMuc2l6ZSgpOyBpIDwgbTsgaSsrKQorICAgICAgICAgICAgYXJyYXlbaV0gPSBDb2x1bW5UaW1lc3RhbXBzLm5ld1RpbWVzdGFtcHModHlwZSwgY29sdW1ucy5nZXQoaSkudHlwZSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSb3dUaW1lc3RhbXBzKCkKKyAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGROb1RpbWVzdGFtcChpbnQgaW5kZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXJyYXlbaW5kZXhdLmFkZE5vVGltZXN0YW1wKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkVGltZXN0YW1wKGludCBpbmRleCwgQ2VsbDw/PiBjZWxsLCBpbnQgbm93SW5TZWMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXJyYXlbaW5kZXhdLmFkZFRpbWVzdGFtcEZyb20oY2VsbCwgbm93SW5TZWMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBDb2x1bW5UaW1lc3RhbXBzIGdldChpbnQgaW5kZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5W2luZGV4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9TY2FsYXJGdW5jdGlvblNlbGVjdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9TY2FsYXJGdW5jdGlvblNlbGVjdG9yLmphdmEKaW5kZXggZWQyYTE0MC4uNWU5NzExYSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2NhbGFyRnVuY3Rpb25TZWxlY3Rvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1NjYWxhckZ1bmN0aW9uU2VsZWN0b3IuamF2YQpAQCAtMzcsMTIgKzM3LDEyIEBACiAgICAgICAgIH0KICAgICB9OwogCi0gICAgcHVibGljIHZvaWQgYWRkSW5wdXQoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgSW5wdXRSb3cgaW5wdXQpCisgICAgcHVibGljIHZvaWQgYWRkSW5wdXQoSW5wdXRSb3cgaW5wdXQpCiAgICAgewogICAgICAgICBmb3IgKGludCBpID0gMCwgbSA9IGFyZ1NlbGVjdG9ycy5zaXplKCk7IGkgPCBtOyBpKyspCiAgICAgICAgIHsKICAgICAgICAgICAgIFNlbGVjdG9yIHMgPSBhcmdTZWxlY3RvcnMuZ2V0KGkpOwotICAgICAgICAgICAgcy5hZGRJbnB1dChwcm90b2NvbFZlcnNpb24sIGlucHV0KTsKKyAgICAgICAgICAgIHMuYWRkSW5wdXQoaW5wdXQpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9TZWxlY3RhYmxlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9TZWxlY3RhYmxlLmphdmEKaW5kZXggNmU2NTNiYS4uOTQ3NmRlYSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2VsZWN0YWJsZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1NlbGVjdGFibGUuamF2YQpAQCAtMjIsOCArMjIsNiBAQAogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnRleHQuU3RyQnVpbGRlcjsKLQogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc2VsZWN0aW9uLlNlbGVjdG9yLkZhY3Rvcnk7CkBAIC04MSw3ICs3OSw3IEBACiAgICAgICovCiAgICAgcHVibGljIGRlZmF1bHQgYm9vbGVhbiBwcm9jZXNzZXNTZWxlY3Rpb24oKQogICAgIHsKLSAgICAgICAgLy8gQ29sdW1uTWV0YWRhdGEgaXMgdGhlIG9ubHkgY2FzZSB0aGF0IHJldHVybnMgZmFsc2UgYW5kIG92ZXJyaWRlIHRoaXMKKyAgICAgICAgLy8gQ29sdW1uTWV0YWRhdGEgaXMgdGhlIG9ubHkgY2FzZSB0aGF0IHJldHVybnMgZmFsc2UgKGlmIHRoZSBjb2x1bW4gaXMgbm90IG1hc2tlZCkgYW5kIG92ZXJyaWRlcyB0aGlzCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtOTIsNiArOTAsMTIgQEAKICAgICAgICAgcmV0dXJuIHR5cGUgPT0gbnVsbCA/IFRlc3RSZXN1bHQuTk9UX0FTU0lHTkFCTEUgOiB0eXBlLnRlc3RBc3NpZ25tZW50KGtleXNwYWNlLCByZWNlaXZlcik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGRlZmF1bHQgQWJzdHJhY3RUeXBlPD8+IGdldENvbXBhdGlibGVUeXBlSWZLbm93bihTdHJpbmcga2V5c3BhY2UpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0RXhhY3RUeXBlSWZLbm93bihrZXlzcGFjZSk7CisgICAgfQorCiAgICAgZGVmYXVsdCBpbnQgYWRkQW5kR2V0SW5kZXgoQ29sdW1uTWV0YWRhdGEgZGVmLCBMaXN0PENvbHVtbk1ldGFkYXRhPiBsKQogICAgIHsKICAgICAgICAgaW50IGlkeCA9IGwuaW5kZXhPZihkZWYpOwpAQCAtMTUyLDcgKzE1Niw3IEBACiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogZXhwZWN0ZWRUeXBlIHdpbGwgYmUgbnVsbCBpZiB3ZSBoYXZlIG5vIGNvbnN0cmFpbnQgb24gd2hhdCB0aGUgdHlwZSBzaG91bGQgYmUuIEZvciBpbnN0YW5jZSwgaWYgdGhpcyB0ZXJtIGlzIGEgYmluZCBtYXJrZXI6CiAgICAgICAgICAgICAgKiAgIC0gaXQgd2lsbCBiZSBudWxsIGlmIHdlIGRvICJTRUxFQ1QgPyBGUk9NIGZvbyIKLSAgICAgICAgICAgICAqICAgLSBpdCB3b24ndCBiZSBudWxsIChhbmQgYmUgTG9uZ1R5cGUpIGlmIHdlIGRvICJTRUxFQ1QgYmlnaW50QXNCbG9iKD8pIEZST00gZm9vIiBiZWNhdXNlIHRoZSBmdW5jdGlvbiBjb25zdHJhaW4gaXQuCisgICAgICAgICAgICAgKiAgIC0gaXQgd29uJ3QgYmUgbnVsbCAoYW5kIGJlIExvbmdUeXBlKSBpZiB3ZSBkbyAiU0VMRUNUIGJpZ2ludF9hc19ibG9iKD8pIEZST00gZm9vIiBiZWNhdXNlIHRoZSBmdW5jdGlvbiBjb25zdHJhaW4gaXQuCiAgICAgICAgICAgICAgKgogICAgICAgICAgICAgICogSW4gdGhlIGZpcnN0IGNhc2UsIHdlIGhhdmUgdG8gZXJyb3Igb3V0OiB3ZSBuZWVkIHRvIGluZmVyIHRoZSB0eXBlIG9mIHRoZSBtZXRhZGF0YSBvZiBhIFNFTEVDVCBhdCBwcmVwYXJhdGlvbiB0aW1lLCB3aGljaCB3ZSBjYW4ndAogICAgICAgICAgICAgICogaGVyZSAodXNlcnMgd2lsbCBoYXZlIHRvIGRvICJTRUxFQ1QgKHZhcmludCk/IEZST00gZm9vIiBmb3IgaW5zdGFuY2UpLgpAQCAtMTkzLDYgKzE5NywxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZ2V0Q29tcGF0aWJsZVR5cGVJZktub3duKFN0cmluZyBrZXlzcGFjZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHJhd1Rlcm0uZ2V0Q29tcGF0aWJsZVR5cGVJZktub3duKGtleXNwYWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3RDb2x1bW5zKFByZWRpY2F0ZTxDb2x1bW5NZXRhZGF0YT4gcHJlZGljYXRlKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0yMjIsMTkgKzIzMiw0OCBAQAogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXcml0ZXRpbWVPclRUTCBpbXBsZW1lbnRzIFNlbGVjdGFibGUKICAgICB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBDb2x1bW5NZXRhZGF0YSBjb2x1bW47Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzV3JpdGV0aW1lOworICAgICAgICAvLyBUaGUgb3JkZXIgb2YgdGhlIHZhcmlhbnRzIGluIHRoZSBLaW5kIGVudW0gbWF0dGVycyBhcyB0aGV5IGFyZSB1c2VkIGluIHNlci9kZXNlcgorICAgICAgICBwdWJsaWMgZW51bSBLaW5kCisgICAgICAgIHsKKyAgICAgICAgICAgIFRUTCgidHRsIiwgSW50MzJUeXBlLmluc3RhbmNlKSwKKyAgICAgICAgICAgIFdSSVRFX1RJTUUoIndyaXRldGltZSIsIExvbmdUeXBlLmluc3RhbmNlKSwKKyAgICAgICAgICAgIE1BWF9XUklURV9USU1FKCJtYXh3cml0ZXRpbWUiLCBMb25nVHlwZS5pbnN0YW5jZSk7IC8vIG1heHdyaXRldGltZSBpcyBhdmFpbGFibGUgYWZ0ZXIgQ2Fzc2FuZHJhIDQuMSAoZXhjbHVzaXZlKQogCi0gICAgICAgIHB1YmxpYyBXcml0ZXRpbWVPclRUTChDb2x1bW5NZXRhZGF0YSBjb2x1bW4sIGJvb2xlYW4gaXNXcml0ZXRpbWUpCisgICAgICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG5hbWU7CisgICAgICAgICAgICBwdWJsaWMgZmluYWwgQWJzdHJhY3RUeXBlPD8+IHJldHVyblR5cGU7CisKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgS2luZCBmcm9tT3JkaW5hbChpbnQgb3JkaW5hbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVzKClbb3JkaW5hbF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEtpbmQoU3RyaW5nIG5hbWUsIEFic3RyYWN0VHlwZTw/PiByZXR1cm5UeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgICAgICAgICAgdGhpcy5yZXR1cm5UeXBlID0gcmV0dXJuVHlwZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWdncmVnYXRlc011bHRpQ2VsbCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMgPT0gTUFYX1dSSVRFX1RJTUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgQ29sdW1uTWV0YWRhdGEgY29sdW1uOworICAgICAgICBwdWJsaWMgZmluYWwgU2VsZWN0YWJsZSBzZWxlY3RhYmxlOworICAgICAgICBwdWJsaWMgZmluYWwgS2luZCBraW5kOworCisgICAgICAgIHB1YmxpYyBXcml0ZXRpbWVPclRUTChDb2x1bW5NZXRhZGF0YSBjb2x1bW4sIFNlbGVjdGFibGUgc2VsZWN0YWJsZSwgS2luZCBraW5kKQogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKLSAgICAgICAgICAgIHRoaXMuaXNXcml0ZXRpbWUgPSBpc1dyaXRldGltZTsKKyAgICAgICAgICAgIHRoaXMuc2VsZWN0YWJsZSA9IHNlbGVjdGFibGU7CisgICAgICAgICAgICB0aGlzLmtpbmQgPSBraW5kOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKGlzV3JpdGV0aW1lID8gIndyaXRldGltZSIgOiAidHRsIikgKyAiKCIgKyBjb2x1bW4ubmFtZSArICIpIjsKKyAgICAgICAgICAgIHJldHVybiBraW5kLm5hbWUgKyAiKCIgKyBzZWxlY3RhYmxlICsgIikiOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFNlbGVjdG9yLkZhY3RvcnkgbmV3U2VsZWN0b3JGYWN0b3J5KFRhYmxlTWV0YWRhdGEgdGFibGUsCkBAIC0yNDUsNDMgKzI4NCw0NSBAQAogICAgICAgICAgICAgaWYgKGNvbHVtbi5pc1ByaW1hcnlLZXlDb2x1bW4oKSkKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJDYW5ub3QgdXNlIHNlbGVjdGlvbiBmdW5jdGlvbiAlcyBvbiBQUklNQVJZIEtFWSBwYXJ0ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNXcml0ZXRpbWUgPyAid3JpdGVUaW1lIiA6ICJ0dGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5uYW1lKSk7Ci0gICAgICAgICAgICBpZiAoY29sdW1uLnR5cGUuaXNNdWx0aUNlbGwoKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiQ2Fubm90IHVzZSBzZWxlY3Rpb24gZnVuY3Rpb24gJXMgb24gbm9uLWZyb3plbiAlcyAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNXcml0ZXRpbWUgPyAid3JpdGVUaW1lIiA6ICJ0dGwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi50eXBlLmlzQ29sbGVjdGlvbigpID8gImNvbGxlY3Rpb24iIDogIlVEVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLm5hbWUpKTsKIAotICAgICAgICAgICAgcmV0dXJuIFdyaXRldGltZU9yVFRMU2VsZWN0b3IubmV3RmFjdG9yeShjb2x1bW4sIGFkZEFuZEdldEluZGV4KGNvbHVtbiwgZGVmcyksIGlzV3JpdGV0aW1lKTsKKyAgICAgICAgICAgIFNlbGVjdG9yLkZhY3RvcnkgZmFjdG9yeSA9IHNlbGVjdGFibGUubmV3U2VsZWN0b3JGYWN0b3J5KHRhYmxlLCBleHBlY3RlZFR5cGUsIGRlZnMsIGJvdW5kTmFtZXMpOworICAgICAgICAgICAgYm9vbGVhbiBpc011bHRpQ2VsbCA9IGZhY3RvcnkuZ2V0Q29sdW1uU3BlY2lmaWNhdGlvbih0YWJsZSkudHlwZS5pc011bHRpQ2VsbCgpOworCisgICAgICAgICAgICByZXR1cm4gV3JpdGV0aW1lT3JUVExTZWxlY3Rvci5uZXdGYWN0b3J5KGZhY3RvcnksIGFkZEFuZEdldEluZGV4KGNvbHVtbiwgZGVmcyksIGtpbmQsIGlzTXVsdGlDZWxsKTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGdldEV4YWN0VHlwZUlmS25vd24oU3RyaW5nIGtleXNwYWNlKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaXNXcml0ZXRpbWUgPyBMb25nVHlwZS5pbnN0YW5jZSA6IEludDMyVHlwZS5pbnN0YW5jZTsKKyAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiB0eXBlID0ga2luZC5yZXR1cm5UeXBlOworICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi50eXBlLmlzTXVsdGlDZWxsKCkgJiYgIWtpbmQuYWdncmVnYXRlc011bHRpQ2VsbCgpID8gTGlzdFR5cGUuZ2V0SW5zdGFuY2UodHlwZSwgZmFsc2UpIDogdHlwZTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3RDb2x1bW5zKFByZWRpY2F0ZTxDb2x1bW5NZXRhZGF0YT4gcHJlZGljYXRlKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcHJlZGljYXRlLnRlc3QoY29sdW1uKTsKKyAgICAgICAgICAgIHJldHVybiBzZWxlY3RhYmxlLnNlbGVjdENvbHVtbnMocHJlZGljYXRlKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmF3IGltcGxlbWVudHMgU2VsZWN0YWJsZS5SYXcKICAgICAgICAgewotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZWxlY3RhYmxlLlJhd0lkZW50aWZpZXIgaWQ7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNXcml0ZXRpbWU7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIFNlbGVjdGFibGUuUmF3SWRlbnRpZmllciBjb2x1bW47CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIFNlbGVjdGFibGUuUmF3IHNlbGVjdGVkOworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBLaW5kIGtpbmQ7CiAKLSAgICAgICAgICAgIHB1YmxpYyBSYXcoU2VsZWN0YWJsZS5SYXdJZGVudGlmaWVyIGlkLCBib29sZWFuIGlzV3JpdGV0aW1lKQorICAgICAgICAgICAgcHVibGljIFJhdyhTZWxlY3RhYmxlLlJhd0lkZW50aWZpZXIgY29sdW1uLCBTZWxlY3RhYmxlLlJhdyBzZWxlY3RlZCwgS2luZCBraW5kKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICAgICAgICAgICAgICB0aGlzLmlzV3JpdGV0aW1lID0gaXNXcml0ZXRpbWU7CisgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47CisgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHNlbGVjdGVkOworICAgICAgICAgICAgICAgIHRoaXMua2luZCA9IGtpbmQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIFdyaXRldGltZU9yVFRMIHByZXBhcmUoVGFibGVNZXRhZGF0YSB0YWJsZSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdyaXRldGltZU9yVFRMKGlkLnByZXBhcmUodGFibGUpLCBpc1dyaXRldGltZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXcml0ZXRpbWVPclRUTCgoQ29sdW1uTWV0YWRhdGEpIGNvbHVtbi5wcmVwYXJlKHRhYmxlKSwgc2VsZWN0ZWQucHJlcGFyZSh0YWJsZSksIGtpbmQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMzU3LDE3ICszOTgsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgcHJlcGFyZWRBcmdzLmFkZChhcmcucHJlcGFyZSh0YWJsZSkpOwogCiAgICAgICAgICAgICAgICAgRnVuY3Rpb25OYW1lIG5hbWUgPSBmdW5jdGlvbk5hbWU7Ci0gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBjaXJjdW12ZW50IHRoZSBub3JtYWwgZnVuY3Rpb24gbG9va3VwIHByb2Nlc3MgZm9yIHRvSnNvbigpIGJlY2F1c2UgaW5zdGFuY2VzIG9mIHRoZSBmdW5jdGlvbgotICAgICAgICAgICAgICAgIC8vIGFyZSBub3QgcHJlLWRlY2xhcmVkIChiZWNhdXNlIGl0IGNhbiBhY2NlcHQgYW55IHR5cGUgb2YgYXJndW1lbnQpLiBXZSBhbHNvIGhhdmUgdG8gd2FpdCB1bnRpbCB3ZSBoYXZlIHRoZQotICAgICAgICAgICAgICAgIC8vIHNlbGVjdG9yIGZhY3RvcmllcyBvZiB0aGUgYXJndW1lbnQgc28gd2UgY2FuIGFjY2VzcyB0aGVpciBmaW5hbCB0eXBlLgotICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbk5hbWUuZXF1YWxzTmF0aXZlRnVuY3Rpb24oVG9Kc29uRmN0Lk5BTUUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXaXRoVG9KU29uRnVuY3Rpb24ocHJlcGFyZWRBcmdzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gQWxzbywgQ09VTlQoeCkgaXMgZXF1aXZhbGVudCB0byBDT1VOVCgqKSBmb3IgYW55IG5vbi1udWxsIHRlcm0geCAoc2luY2UgY291bnQoeCkgZG9uJ3QgY2FyZSBhYm91dCBpdCdzIGFyZ3VtZW50IG91dHNpZGUgb2YgY2hlY2sgZm9yIG51bGxuZXNzKSBhbmQKLSAgICAgICAgICAgICAgICAvLyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbHR5IHdlIHdhbnQgdG8gc3VwcG9ydCBDT1VOVCgxKSwgYnV0IHdlIGFjdHVhbGx5IGhhdmUgQ09VTlQoeCkgbWV0aG9kIGZvciBldmVyeSBleGlzdGluZyAoc2ltcGxlKSBpbnB1dCB0eXBlcyBzbyBjdXJyZW50bHkgQ09VTlQoMSkKLSAgICAgICAgICAgICAgICAvLyB3aWxsIHRocm93IGFzIGFtYmlndW91cyAoc2luY2UgMSB3b3JrcyBmb3IgYW55IHR5cGUpLiBTbyB3ZSBoYXZlIGhhdmUgdG8gc3BlY2lhbCBjYXNlIENPVU5ULgotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZ1bmN0aW9uTmFtZS5lcXVhbHNOYXRpdmVGdW5jdGlvbihGdW5jdGlvbk5hbWUubmF0aXZlRnVuY3Rpb24oImNvdW50IikpCisgICAgICAgICAgICAgICAgLy8gQ09VTlQoeCkgaXMgZXF1aXZhbGVudCB0byBDT1VOVCgqKSBmb3IgYW55IG5vbi1udWxsIHRlcm0geCAoc2luY2UgY291bnQoeCkgZG9uJ3QgY2FyZSBhYm91dCBpdHMKKyAgICAgICAgICAgICAgICAvLyBhcmd1bWVudCBvdXRzaWRlIG9mIGNoZWNrIGZvciBudWxsbmVzcykgYW5kIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsdHkgd2Ugd2FudCB0byBzdXBwb3J0IENPVU5UKDEpLAorICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBhY3R1YWxseSBoYXZlIENPVU5UKHgpIG1ldGhvZCBmb3IgZXZlcnkgZXhpc3RpbmcgKHNpbXBsZSkgaW5wdXQgdHlwZXMgc28gY3VycmVudGx5IENPVU5UKDEpCisgICAgICAgICAgICAgICAgLy8gd2lsbCB0aHJvdyBhcyBhbWJpZ3VvdXMgKHNpbmNlIDEgd29ya3MgZm9yIGFueSB0eXBlKS4gU28gd2UgaGF2ZSB0byBzcGVjaWFsIGNhc2UgQ09VTlQuCisgICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uTmFtZS5lcXVhbHNOYXRpdmVGdW5jdGlvbihGdW5jdGlvbk5hbWUubmF0aXZlRnVuY3Rpb24oImNvdW50IikpCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwcmVwYXJlZEFyZ3Muc2l6ZSgpID09IDEKICAgICAgICAgICAgICAgICAgICAgICAgICYmIChwcmVwYXJlZEFyZ3MuZ2V0KDApIGluc3RhbmNlb2YgV2l0aFRlcm0pCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKChXaXRoVGVybSlwcmVwYXJlZEFyZ3MuZ2V0KDApKS5yYXdUZXJtIGluc3RhbmNlb2YgQ29uc3RhbnRzLkxpdGVyYWwpKQpAQCAtMzkwLDQ0ICs0MjUsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBXaXRoVG9KU29uRnVuY3Rpb24gaW1wbGVtZW50cyBTZWxlY3RhYmxlCi0gICAgewotICAgICAgICBwdWJsaWMgZmluYWwgTGlzdDxTZWxlY3RhYmxlPiBhcmdzOwotCi0gICAgICAgIHByaXZhdGUgV2l0aFRvSlNvbkZ1bmN0aW9uKExpc3Q8U2VsZWN0YWJsZT4gYXJncykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5hcmdzID0gYXJnczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJCdWlsZGVyKCkuYXBwZW5kKFRvSnNvbkZjdC5OQU1FKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIoIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFdpdGhTZXBhcmF0b3JzKGFyZ3MsICIsICIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIikiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTZWxlY3Rvci5GYWN0b3J5IG5ld1NlbGVjdG9yRmFjdG9yeShUYWJsZU1ldGFkYXRhIHRhYmxlLCBBYnN0cmFjdFR5cGU8Pz4gZXhwZWN0ZWRUeXBlLCBMaXN0PENvbHVtbk1ldGFkYXRhPiBkZWZzLCBWYXJpYWJsZVNwZWNpZmljYXRpb25zIGJvdW5kTmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNlbGVjdG9yRmFjdG9yaWVzIGZhY3RvcmllcyA9IFNlbGVjdG9yRmFjdG9yaWVzLmNyZWF0ZUZhY3Rvcmllc0FuZENvbGxlY3RDb2x1bW5EZWZpbml0aW9ucyhhcmdzLCBudWxsLCB0YWJsZSwgZGVmcywgYm91bmROYW1lcyk7Ci0gICAgICAgICAgICBGdW5jdGlvbiBmdW4gPSBUb0pzb25GY3QuZ2V0SW5zdGFuY2UoZmFjdG9yaWVzLmdldFJldHVyblR5cGVzKCkpOwotICAgICAgICAgICAgcmV0dXJuIEFic3RyYWN0RnVuY3Rpb25TZWxlY3Rvci5uZXdGYWN0b3J5KGZ1biwgZmFjdG9yaWVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZ2V0RXhhY3RUeXBlSWZLbm93bihTdHJpbmcga2V5c3BhY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBVVEY4VHlwZS5pbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3RDb2x1bW5zKFByZWRpY2F0ZTxDb2x1bW5NZXRhZGF0YT4gcHJlZGljYXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gU2VsZWN0YWJsZS5zZWxlY3RDb2x1bW5zKGFyZ3MsIHByZWRpY2F0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdpdGhDYXN0IGltcGxlbWVudHMgU2VsZWN0YWJsZQogICAgIHsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDUUwzVHlwZSB0eXBlOwpAQCAtNjgyLDYgKzY3OSwxNyBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZ2V0Q29tcGF0aWJsZVR5cGVJZktub3duKFN0cmluZyBrZXlzcGFjZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgZWxlbWVudCB3ZSBjYW5ub3Qga25vdyBpZiBpdCBpcyBhbiBlbGVtZW50IGJldHdlZW4gcGFyZW50aGVzZXMgb3IgYSB0dXBsZQorICAgICAgICAgICAgLy8gd2l0aCBvbmx5IG9uZSBlbGVtZW50LiBCeSBjb25zZXF1ZW5jZSwgd2UgbmVlZCB0byBmb3JjZSB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSB0eXBlLgorICAgICAgICAgICAgaWYgKHNlbGVjdGFibGVzLnNpemUoKSA9PSAxKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICByZXR1cm4gVHVwbGVzLmdldEV4YWN0VHVwbGVUeXBlSWZLbm93bihzZWxlY3RhYmxlcywgcCAtPiBwLmdldENvbXBhdGlibGVUeXBlSWZLbm93bihrZXlzcGFjZSkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdENvbHVtbnMoUHJlZGljYXRlPENvbHVtbk1ldGFkYXRhPiBwcmVkaWNhdGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBTZWxlY3RhYmxlLnNlbGVjdENvbHVtbnMoc2VsZWN0YWJsZXMsIHByZWRpY2F0ZSk7CkBAIC03NjcsNiArNzc1LDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRDb21wYXRpYmxlVHlwZUlmS25vd24oU3RyaW5nIGtleXNwYWNlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTGlzdHMuZ2V0UHJlZmVycmVkQ29tcGF0aWJsZVR5cGUoc2VsZWN0YWJsZXMsIHAgLT4gcC5nZXRDb21wYXRpYmxlVHlwZUlmS25vd24oa2V5c3BhY2UpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3RDb2x1bW5zKFByZWRpY2F0ZTxDb2x1bW5NZXRhZGF0YT4gcHJlZGljYXRlKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gU2VsZWN0YWJsZS5zZWxlY3RDb2x1bW5zKHNlbGVjdGFibGVzLCBwcmVkaWNhdGUpOwpAQCAtODYwLDYgKzg3NCwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZ2V0Q29tcGF0aWJsZVR5cGVJZktub3duKFN0cmluZyBrZXlzcGFjZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFNldHMuZ2V0UHJlZmVycmVkQ29tcGF0aWJsZVR5cGUoc2VsZWN0YWJsZXMsIHAgLT4gcC5nZXRDb21wYXRpYmxlVHlwZUlmS25vd24oa2V5c3BhY2UpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3RDb2x1bW5zKFByZWRpY2F0ZTxDb2x1bW5NZXRhZGF0YT4gcHJlZGljYXRlKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gU2VsZWN0YWJsZS5zZWxlY3RDb2x1bW5zKHNlbGVjdGFibGVzLCBwcmVkaWNhdGUpOwpAQCAtOTkxLDcgKzEwMTEsMTQgQEAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZ2V0RXhhY3RUeXBlSWZLbm93bihTdHJpbmcga2V5c3BhY2UpCiAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIExldHMgZm9yY2UgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgdHlwZS4KKyAgICAgICAgICAgIC8vIExldCdzIGZvcmNlIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIHR5cGUuCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGdldENvbXBhdGlibGVUeXBlSWZLbm93bihTdHJpbmcga2V5c3BhY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIExldCdzIGZvcmNlIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIHR5cGUuCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogCkBAIC0xMjEzLDEyICsxMjQwLDE3IEBACiAgICAgICAgICAgICB0aGlzLnF1b3RlZCA9IHF1b3RlZDsKICAgICAgICAgfQogCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQ29sdW1uTWV0YWRhdGEgcHJlcGFyZShUYWJsZU1ldGFkYXRhIGNmbSkKKyAgICAgICAgcHVibGljIENvbHVtbk1ldGFkYXRhIGNvbHVtbk1ldGFkYXRhKFRhYmxlTWV0YWRhdGEgY2ZtKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gY2ZtLmdldEV4aXN0aW5nQ29sdW1uKENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQodGV4dCwgcXVvdGVkKSk7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNlbGVjdGFibGUgcHJlcGFyZShUYWJsZU1ldGFkYXRhIGNmbSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNvbHVtbk1ldGFkYXRhKGNmbSk7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgRmllbGRJZGVudGlmaWVyIHRvRmllbGRJZGVudGlmaWVyKCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIHF1b3RlZCA/IEZpZWxkSWRlbnRpZmllci5mb3JRdW90ZWQodGV4dCkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1NlbGVjdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2VsZWN0aW9uLmphdmEKaW5kZXggZjA3MTg0YS4uZGE4N2YyNiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2VsZWN0aW9uLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2VsZWN0aW9uLmphdmEKQEAgLTM1LDYgKzM1LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Kc29uVXRpbHM7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWxlY3Rpb24KIHsKQEAgLTEwMywxNSArMTA0LDIwIEBACiAgICAgICovCiAgICAgcHVibGljIEludGVnZXIgZ2V0T3JkZXJpbmdJbmRleChDb2x1bW5NZXRhZGF0YSBjKQogICAgIHsKLSAgICAgICAgaWYgKCFpc0pzb24pCi0gICAgICAgICAgICByZXR1cm4gZ2V0UmVzdWx0U2V0SW5kZXgoYyk7Ci0KICAgICAgICAgLy8gSWYgd2Ugb3JkZXIgcG9zdC1xdWVyeSBpbiBqc29uLCB0aGUgZmlyc3QgYW5kIG9ubHkgY29sdW1uIHRoYXQgd2Ugc2hpcCB0byB0aGUgY2xpZW50IGlzIHRoZSBqc29uIGNvbHVtbi4KICAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSBzaG91bGQga2VlcCBvcmRlcmluZyBjb2x1bW5zIGFyb3VuZCB0byBwZXJmb3JtIHRoZSBvcmRlcmluZywgdGhlbiB0aGVzZSBjb2x1bW5zIHdpbGwKICAgICAgICAgLy8gYmUgcGxhY2VkIGFmdGVyIHRoZSBqc29uIGNvbHVtbi4gQXMgYSBjb25zZXF1ZW5jZSBvZiB3aGVyZSB0aGUgY29sdW1zIGFyZSBwbGFjZWQsIHdlIHNob3VsZCBnaXZlIHRoZQogICAgICAgICAvLyBvcmRlcmluZyBpbmRleCBhIHZhbHVlIGJhc2VkIG9uIHRoZWlyIHBvc2l0aW9uIGluIHRoZSBqc29uIGVuY29kaW5nIGFuZCBkaXNjYXJkIHRoZSBvcmlnaW5hbCBpbmRleC4KICAgICAgICAgLy8gKENBU1NBTkRSQS0xNDI4NikKLSAgICAgICAgcmV0dXJuIG9yZGVyaW5nQ29sdW1ucy5pbmRleE9mKGMpICsgMTsKKyAgICAgICAgaWYgKGlzSnNvbikKKyAgICAgICAgICAgIHJldHVybiBvcmRlcmluZ0NvbHVtbnMuaW5kZXhPZihjKSArIDE7CisKKyAgICAgICAgLy8gSWYgdGhlIGNvbHVtbiBpcyBtYXNrZWQgaXQgbWlnaHQgYXBwZWFyIHR3aWNlLCBvbmNlIG1hc2tlZCBpbiB0aGUgc2VsZWN0ZWQgY29sdW1uIGFuZCBvbmNlIHVubWFza2VkIGluCisgICAgICAgIC8vIHRoZSBvcmRlcmluZyBjb2x1bW5zLiBGb3Igb3JkZXJpbmcgd2UgYXJlIGludGVyZXN0ZWQgaW4gdGhhdCBzZWNvbmQgdW5tYXNrZWQgdmFsdWUuCisgICAgICAgIGlmIChjLmlzTWFza2VkKCkpCisgICAgICAgICAgICByZXR1cm4gY29sdW1ucy5sYXN0SW5kZXhPZihjKTsKKworICAgICAgICByZXR1cm4gZ2V0UmVzdWx0U2V0SW5kZXgoYyk7CiAgICAgfQogCiAgICAgcHVibGljIFJlc3VsdFNldC5SZXN1bHRNZXRhZGF0YSBnZXRSZXN1bHRNZXRhZGF0YSgpCkBAIC0xMzMsMTUgKzEzOSwxNiBAQAogICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVNlbGVjdGlvbih0YWJsZSwgYWxsLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCB0cnVlLCBpc0pzb24sIHJldHVyblN0YXRpY0NvbnRlbnRPblBhcnRpdGlvbldpdGhOb1Jvd3MpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgU2VsZWN0aW9uIHdpbGRjYXJkV2l0aEdyb3VwQnkoVGFibGVNZXRhZGF0YSB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlU3BlY2lmaWNhdGlvbnMgYm91bmROYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNKc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXR1cm5TdGF0aWNDb250ZW50T25QYXJ0aXRpb25XaXRoTm9Sb3dzKQorICAgIHB1YmxpYyBzdGF0aWMgU2VsZWN0aW9uIHdpbGRjYXJkV2l0aEdyb3VwQnlPck1hc2tlZENvbHVtbnMoVGFibGVNZXRhZGF0YSB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlU3BlY2lmaWNhdGlvbnMgYm91bmROYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxDb2x1bW5NZXRhZGF0YT4gb3JkZXJpbmdDb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0pzb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJldHVyblN0YXRpY0NvbnRlbnRPblBhcnRpdGlvbldpdGhOb1Jvd3MpCiAgICAgewogICAgICAgICByZXR1cm4gZnJvbVNlbGVjdG9ycyh0YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0KHRhYmxlLmFsbENvbHVtbnNJblNlbGVjdE9yZGVyKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZE5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmluZ0NvbHVtbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLmVtcHR5U2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSnNvbiwKQEAgLTIyNSw3ICsyMzIsNyBAQAogICAgICAgICBmb3IgKENvbHVtbk1ldGFkYXRhIG9yZGVyaW5nQ29sdW1uIDogb3JkZXJpbmdDb2x1bW5zKQogICAgICAgICB7CiAgICAgICAgICAgICBpbnQgaW5kZXggPSBzZWxlY3RlZENvbHVtbnMuaW5kZXhPZihvcmRlcmluZ0NvbHVtbik7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBmYWN0b3JpZXMuaW5kZXhPZlNpbXBsZVNlbGVjdG9yRmFjdG9yeShpbmRleCkgPj0gMCkKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmIGZhY3Rvcmllcy5pbmRleE9mU2ltcGxlU2VsZWN0b3JGYWN0b3J5KGluZGV4KSA+PSAwICYmICFvcmRlcmluZ0NvbHVtbi5pc01hc2tlZCgpKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgICAgICBmaWx0ZXJlZE9yZGVyaW5nQ29sdW1ucy5hZGQob3JkZXJpbmdDb2x1bW4pOwpAQCAtMzI0LDcgKzMzMSw3IEBACiAgICAgICAgICAgICAgICAgY29sdW1uTmFtZSA9ICJcIiIgKyBjb2x1bW5OYW1lICsgIlwiIjsKIAogICAgICAgICAgICAgc2IuYXBwZW5kKCciJyk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoSnNvbi5xdW90ZUFzSnNvblN0cmluZyhjb2x1bW5OYW1lKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoSnNvblV0aWxzLnF1b3RlQXNKc29uU3RyaW5nKGNvbHVtbk5hbWUpKTsKICAgICAgICAgICAgIHNiLmFwcGVuZCgiXCI6ICIpOwogICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKQogICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOwpAQCAtMzcxLDEwICszNzgsMTAgQEAKICAgICAgICAgcHVibGljIGJvb2xlYW4gY29sbGVjdFRUTHMoKTsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQ2hlY2tzIGlmIG9uZSBvZiB0aGUgc2VsZWN0b3JzIGNvbGxlY3QgdGltZXN0YW1wcy4KLSAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgb25lIG9mIHRoZSBzZWxlY3RvcnMgY29sbGVjdCB0aW1lc3RhbXBzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICogQ2hlY2tzIGlmIG9uZSBvZiB0aGUgc2VsZWN0b3JzIGNvbGxlY3RzIHdyaXRlIHRpbWVzdGFtcHMuCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIG9uZSBvZiB0aGUgc2VsZWN0b3JzIGNvbGxlY3RzIHdyaXRlIHRpbWVzdGFtcHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gY29sbGVjdFRpbWVzdGFtcHMoKTsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29sbGVjdFdyaXRldGltZXMoKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogQWRkcyB0aGUgY3VycmVudCByb3cgb2YgdGhlIHNwZWNpZmllZCA8Y29kZT5SZXN1bHRTZXRCdWlsZGVyPC9jb2RlPi4KQEAgLTUwMSw3ICs1MDgsNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbGxlY3RUaW1lc3RhbXBzKCkKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb2xsZWN0V3JpdGV0aW1lcygpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQpAQCAtNTIwLDcgKzUyNyw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VsZWN0aW9uV2l0aFByb2Nlc3NpbmcgZXh0ZW5kcyBTZWxlY3Rpb24KICAgICB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgU2VsZWN0b3JGYWN0b3JpZXMgZmFjdG9yaWVzOwotICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY29sbGVjdFRpbWVzdGFtcHM7CisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjb2xsZWN0V3JpdGV0aW1lczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGNvbGxlY3RNYXhXcml0ZXRpbWVzOwogICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY29sbGVjdFRUTHM7CiAKICAgICAgICAgcHVibGljIFNlbGVjdGlvbldpdGhQcm9jZXNzaW5nKFRhYmxlTWV0YWRhdGEgdGFibGUsCkBAIC01NDAsOCArNTQ4LDkgQEAKICAgICAgICAgICAgICAgICAgIGlzSnNvbik7CiAKICAgICAgICAgICAgIHRoaXMuZmFjdG9yaWVzID0gZmFjdG9yaWVzOwotICAgICAgICAgICAgdGhpcy5jb2xsZWN0VGltZXN0YW1wcyA9IGZhY3Rvcmllcy5jb250YWluc1dyaXRldGltZVNlbGVjdG9yRmFjdG9yeSgpOwotICAgICAgICAgICAgdGhpcy5jb2xsZWN0VFRMcyA9IGZhY3Rvcmllcy5jb250YWluc1RUTFNlbGVjdG9yRmFjdG9yeSgpOzsKKyAgICAgICAgICAgIHRoaXMuY29sbGVjdFdyaXRldGltZXMgPSBmYWN0b3JpZXMuY29udGFpbnNXcml0ZXRpbWVTZWxlY3RvckZhY3RvcnkoKTsKKyAgICAgICAgICAgIHRoaXMuY29sbGVjdE1heFdyaXRldGltZXMgPSBmYWN0b3JpZXMuY29udGFpbnNNYXhXcml0ZXRpbWVTZWxlY3RvckZhY3RvcnkoKTsKKyAgICAgICAgICAgIHRoaXMuY29sbGVjdFRUTHMgPSBmYWN0b3JpZXMuY29udGFpbnNUVExTZWxlY3RvckZhY3RvcnkoKTsKIAogICAgICAgICAgICAgZm9yIChDb2x1bW5NZXRhZGF0YSBvcmRlcmluZ0NvbHVtbiA6IG9yZGVyaW5nQ29sdW1ucykKICAgICAgICAgICAgIHsKQEAgLTYwMSw3ICs2MTAsNyBAQAogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZElucHV0Um93KElucHV0Um93IGlucHV0KQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgZm9yIChTZWxlY3RvciBzZWxlY3RvciA6IHNlbGVjdG9ycykKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLmFkZElucHV0KG9wdGlvbnMuZ2V0UHJvdG9jb2xWZXJzaW9uKCksIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLmFkZElucHV0KGlucHV0KTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKQEAgLTYxNyw5ICs2MjYsOSBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbGxlY3RUaW1lc3RhbXBzKCkKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb2xsZWN0V3JpdGV0aW1lcygpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sbGVjdFRpbWVzdGFtcHM7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xsZWN0V3JpdGV0aW1lcyB8fCBjb2xsZWN0TWF4V3JpdGV0aW1lczsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1NlbGVjdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9TZWxlY3Rvci5qYXZhCmluZGV4IDQ2MzM4MmQuLmI1ODU3ZDQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1NlbGVjdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2VsZWN0b3IuamF2YQpAQCAtMjIsMjIgKzIyLDI4IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5DUUxUeXBlUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Db2x1bW5JZGVudGlmaWVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ29sdW1uU3BlY2lmaWNhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5T3B0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnNlbGVjdGlvbi5Db2x1bW5UaW1lc3RhbXBzLlRpbWVzdGFtcHNUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb250ZXh0LkNvdW50ZXJDb250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Db2xsZWN0aW9uVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVzZXJUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ2VsbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNvbHVtbkRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Db21wbGV4Q29sdW1uRGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5DUUxUeXBlUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiAKQEAgLTcxLDcgKzc3LDcgQEAKICAgICAvKioKICAgICAgKiBUaGUgPGNvZGU+U2VsZWN0b3I8L2NvZGU+IGtpbmRzLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZW51bSBLaW5kCisgICAgcHVibGljIGVudW0gS2luZAogICAgIHsKICAgICAgICAgU0lNUExFX1NFTEVDVE9SKFNpbXBsZVNlbGVjdG9yLmRlc2VyaWFsaXplciksCiAgICAgICAgIFRFUk1fU0VMRUNUT1IoVGVybVNlbGVjdG9yLmRlc2VyaWFsaXplciksCkBAIC0xNTIsNiArMTU4LDE3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2tzIGlmIHRoaXMgZmFjdG9yeSBjcmVhdGVzIDxjb2RlPm1heHdyaXRldGltZTwvY29kZT4gc2VsZWN0b3IgaW5zdGFuY2VzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgZmFjdG9yeSBjcmVhdGVzIDxjb2RlPm1heHdyaXRldGltZTwvY29kZT4gc2VsZWN0b3JzIGluc3RhbmNlcywKKyAgICAgICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNNYXhXcml0ZXRpbWVTZWxlY3RvckZhY3RvcnkoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvKioKICAgICAgICAgICogQ2hlY2tzIGlmIHRoaXMgZmFjdG9yeSBjcmVhdGVzIDxjb2RlPlRUTDwvY29kZT4gc2VsZWN0b3JzIGluc3RhbmNlcy4KICAgICAgICAgICoKICAgICAgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGZhY3RvcnkgY3JlYXRlcyA8Y29kZT5UVEw8L2NvZGU+IHNlbGVjdG9ycyBpbnN0YW5jZXMsCkBAIC0xNjUsNyArMTgyLDYgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENoZWNrcyBpZiB0aGlzIGZhY3RvcnkgY3JlYXRlcyA8Y29kZT5TZWxlY3RvcjwvY29kZT5zIHRoYXQgc2ltcGx5IHJldHVybiBhIGNvbHVtbiB2YWx1ZS4KICAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGluZGV4IHRoZSBjb2x1bW4gaW5kZXgKICAgICAgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGZhY3RvcnkgY3JlYXRlcyA8Y29kZT5TZWxlY3RvcjwvY29kZT5zIHRoYXQgc2ltcGx5IHJldHVybiBhIGNvbHVtbiB2YWx1ZSwKICAgICAgICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KICAgICAgICAgICovCkBAIC0yODgsNzcgKzMwNCwxNDMgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIElucHV0Um93CiAgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb247CisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxDb2x1bW5NZXRhZGF0YT4gY29sdW1uczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHVubWFzazsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGNvbGxlY3RXcml0ZXRpbWVzOworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY29sbGVjdFRUTHM7CisKICAgICAgICAgcHJpdmF0ZSBCeXRlQnVmZmVyW10gdmFsdWVzOwotICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmdbXSB0aW1lc3RhbXBzOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludFtdIHR0bHM7CisgICAgICAgIHByaXZhdGUgUm93VGltZXN0YW1wcyB3cml0ZXRpbWVzOworICAgICAgICBwcml2YXRlIFJvd1RpbWVzdGFtcHMgdHRsczsKICAgICAgICAgcHJpdmF0ZSBpbnQgaW5kZXg7CiAKLSAgICAgICAgcHVibGljIElucHV0Um93KGludCBzaXplLCBib29sZWFuIGNvbGxlY3RUaW1lc3RhbXBzLCBib29sZWFuIGNvbGxlY3RUVExzKQorICAgICAgICBwdWJsaWMgSW5wdXRSb3coUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxDb2x1bW5NZXRhZGF0YT4gY29sdW1ucywgYm9vbGVhbiB1bm1hc2spCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMudmFsdWVzID0gbmV3IEJ5dGVCdWZmZXJbc2l6ZV07CisgICAgICAgICAgICB0aGlzKHByb3RvY29sVmVyc2lvbiwgY29sdW1ucywgdW5tYXNrLCBmYWxzZSwgZmFsc2UpOworICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChjb2xsZWN0VGltZXN0YW1wcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLnRpbWVzdGFtcHMgPSBuZXcgbG9uZ1tzaXplXTsKLSAgICAgICAgICAgICAgICAvLyBXZSB1c2UgTUlOX1ZBTFVFIHRvIGluZGljYXRlIG5vIHRpbWVzdGFtcAotICAgICAgICAgICAgICAgIEFycmF5cy5maWxsKHRpbWVzdGFtcHMsIExvbmcuTUlOX1ZBTFVFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aW1lc3RhbXBzID0gbnVsbDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgcHVibGljIElucHV0Um93KFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENvbHVtbk1ldGFkYXRhPiBjb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1bm1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNvbGxlY3RXcml0ZXRpbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjb2xsZWN0VFRMcykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5wcm90b2NvbFZlcnNpb24gPSBwcm90b2NvbFZlcnNpb247CisgICAgICAgICAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zOworICAgICAgICAgICAgdGhpcy51bm1hc2sgPSB1bm1hc2s7CisgICAgICAgICAgICB0aGlzLmNvbGxlY3RXcml0ZXRpbWVzID0gY29sbGVjdFdyaXRldGltZXM7CisgICAgICAgICAgICB0aGlzLmNvbGxlY3RUVExzID0gY29sbGVjdFRUTHM7CiAKLSAgICAgICAgICAgIGlmIChjb2xsZWN0VFRMcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLnR0bHMgPSBuZXcgaW50W3NpemVdOwotICAgICAgICAgICAgICAgIC8vIFdlIHVzZSAtMSB0byBpbmRpY2F0ZSBubyB0dGwKLSAgICAgICAgICAgICAgICBBcnJheXMuZmlsbCh0dGxzLCAtMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHRscyA9IG51bGw7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgQnl0ZUJ1ZmZlcltjb2x1bW5zLnNpemUoKV07CisgICAgICAgICAgICB3cml0ZXRpbWVzID0gaW5pdFRpbWVzdGFtcHMoVGltZXN0YW1wc1R5cGUuV1JJVEVUSU1FUywgY29sbGVjdFdyaXRldGltZXMsIGNvbHVtbnMpOworICAgICAgICAgICAgdHRscyA9IGluaXRUaW1lc3RhbXBzKFRpbWVzdGFtcHNUeXBlLlRUTFMsIGNvbGxlY3RUVExzLCBjb2x1bW5zKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUm93VGltZXN0YW1wcyBpbml0VGltZXN0YW1wcyhUaW1lc3RhbXBzVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjb2xsZWN0V3JpdGV0aW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q29sdW1uTWV0YWRhdGE+IGNvbHVtbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjb2xsZWN0V3JpdGV0aW1lcyA/IFJvd1RpbWVzdGFtcHMubmV3SW5zdGFuY2UodHlwZSwgY29sdW1ucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFJvd1RpbWVzdGFtcHMuTk9PUF9ST1dfVElNRVNUQU1QUzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQcm90b2NvbFZlcnNpb24gZ2V0UHJvdG9jb2xWZXJzaW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sVmVyc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHVubWFzaygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB1bm1hc2s7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBhZGQoQnl0ZUJ1ZmZlciB2KQogICAgICAgICB7CiAgICAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0gdjsKIAotICAgICAgICAgICAgaWYgKHRpbWVzdGFtcHMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aW1lc3RhbXBzW2luZGV4XSA9IExvbmcuTUlOX1ZBTFVFOwotCi0gICAgICAgICAgICBpZiAodHRscyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHR0bHNbaW5kZXhdID0gLTE7Ci0KKyAgICAgICAgICAgIGlmICh2ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd3JpdGV0aW1lcy5hZGROb1RpbWVzdGFtcChpbmRleCk7CisgICAgICAgICAgICAgICAgdHRscy5hZGROb1RpbWVzdGFtcChpbmRleCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbmRleCsrOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgYWRkKENlbGw8Pz4gYywgaW50IG5vd0luU2VjKQorICAgICAgICBwdWJsaWMgdm9pZCBhZGQoQ29sdW1uRGF0YSBjb2x1bW5EYXRhLCBpbnQgbm93SW5TZWMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjID09IG51bGwpCisgICAgICAgICAgICBDb2x1bW5NZXRhZGF0YSBjb2x1bW4gPSBjb2x1bW5zLmdldChpbmRleCk7CisgICAgICAgICAgICBpZiAoY29sdW1uRGF0YSA9PSBudWxsKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGFkZChudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5pc0NvbXBsZXgoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFkZCgoQ29tcGxleENvbHVtbkRhdGEpIGNvbHVtbkRhdGEsIG5vd0luU2VjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkKChDZWxsPD8+KSBjb2x1bW5EYXRhLCBub3dJblNlYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZChDZWxsPD8+IGMsIGludCBub3dJblNlYykKKyAgICAgICAgewogICAgICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHZhbHVlKGMpOwotCi0gICAgICAgICAgICBpZiAodGltZXN0YW1wcyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRpbWVzdGFtcHNbaW5kZXhdID0gYy50aW1lc3RhbXAoKTsKLQotICAgICAgICAgICAgaWYgKHR0bHMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0dGxzW2luZGV4XSA9IHJlbWFpbmluZ1RUTChjLCBub3dJblNlYyk7Ci0KKyAgICAgICAgICAgIHdyaXRldGltZXMuYWRkVGltZXN0YW1wKGluZGV4LCBjLCBub3dJblNlYyk7CisgICAgICAgICAgICB0dGxzLmFkZFRpbWVzdGFtcChpbmRleCwgYywgbm93SW5TZWMpOwogICAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgaW50IHJlbWFpbmluZ1RUTChDZWxsPD8+IGMsIGludCBub3dJblNlYykKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZChDb21wbGV4Q29sdW1uRGF0YSBjY2QsIGludCBub3dJblNlYykKICAgICAgICAgewotICAgICAgICAgICAgaWYgKCFjLmlzRXhwaXJpbmcoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdHlwZSA9IGNvbHVtbnMuZ2V0KGluZGV4KS50eXBlOworICAgICAgICAgICAgaWYgKHR5cGUuaXNDb2xsZWN0aW9uKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsdWVzW2luZGV4XSA9ICgoQ29sbGVjdGlvblR5cGU8Pz4pIHR5cGUpLnNlcmlhbGl6ZUZvck5hdGl2ZVByb3RvY29sKGNjZC5pdGVyYXRvcigpKTsKIAotICAgICAgICAgICAgaW50IHJlbWFpbmluZyA9IGMubG9jYWxEZWxldGlvblRpbWUoKSAtIG5vd0luU2VjOwotICAgICAgICAgICAgcmV0dXJuIHJlbWFpbmluZyA+PSAwID8gcmVtYWluaW5nIDogLTE7CisgICAgICAgICAgICAgICAgZm9yIChDZWxsPD8+IGNlbGwgOiBjY2QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXRpbWVzLmFkZFRpbWVzdGFtcChpbmRleCwgY2VsbCwgbm93SW5TZWMpOworICAgICAgICAgICAgICAgICAgICB0dGxzLmFkZFRpbWVzdGFtcChpbmRleCwgY2VsbCwgbm93SW5TZWMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVc2VyVHlwZSB1ZHQgPSAoVXNlclR5cGUpIHR5cGU7CisgICAgICAgICAgICAgICAgaW50IHNpemUgPSB1ZHQuc2l6ZSgpOworCisgICAgICAgICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHVkdC5zZXJpYWxpemVGb3JOYXRpdmVQcm90b2NvbChjY2QuaXRlcmF0b3IoKSwgcHJvdG9jb2xWZXJzaW9uKTsKKworICAgICAgICAgICAgICAgIHNob3J0IGZpZWxkUG9zaXRpb24gPSAwOworICAgICAgICAgICAgICAgIGZvciAoQ2VsbDw/PiBjZWxsIDogY2NkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIG51bGwgZmllbGRzIHRoYXQgYXJlbid0IGF0IHRoZSBlbmQKKyAgICAgICAgICAgICAgICAgICAgc2hvcnQgZmllbGRQb3NpdGlvbk9mQ2VsbCA9IEJ5dGVCdWZmZXJVdGlsLnRvU2hvcnQoY2VsbC5wYXRoKCkuZ2V0KDApKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGZpZWxkUG9zaXRpb24gPCBmaWVsZFBvc2l0aW9uT2ZDZWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZFBvc2l0aW9uKys7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXRpbWVzLmFkZE5vVGltZXN0YW1wKGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR0bHMuYWRkTm9UaW1lc3RhbXAoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZmllbGRQb3NpdGlvbisrOworICAgICAgICAgICAgICAgICAgICB3cml0ZXRpbWVzLmFkZFRpbWVzdGFtcChpbmRleCwgY2VsbCwgbm93SW5TZWMpOworICAgICAgICAgICAgICAgICAgICB0dGxzLmFkZFRpbWVzdGFtcChpbmRleCwgY2VsbCwgbm93SW5TZWMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGFwcGVuZCBudWxscyBmb3IgbWlzc2luZyBjZWxscworICAgICAgICAgICAgICAgIHdoaWxlIChmaWVsZFBvc2l0aW9uIDwgc2l6ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpZWxkUG9zaXRpb24rKzsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGV0aW1lcy5hZGROb1RpbWVzdGFtcChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIHR0bHMuYWRkTm9UaW1lc3RhbXAoaW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIDxWPiBCeXRlQnVmZmVyIHZhbHVlKENlbGw8Vj4gYykKQEAgLTM5MCwzNSArNDcyLDM4IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KGJvb2xlYW4gZGVlcCkKICAgICAgICAgewogICAgICAgICAgICAgaW5kZXggPSAwOworICAgICAgICAgICAgdGhpcy53cml0ZXRpbWVzID0gaW5pdFRpbWVzdGFtcHMoVGltZXN0YW1wc1R5cGUuV1JJVEVUSU1FUywgY29sbGVjdFdyaXRldGltZXMsIGNvbHVtbnMpOworICAgICAgICAgICAgdGhpcy50dGxzID0gaW5pdFRpbWVzdGFtcHMoVGltZXN0YW1wc1R5cGUuVFRMUywgY29sbGVjdFRUTHMsIGNvbHVtbnMpOworCiAgICAgICAgICAgICBpZiAoZGVlcCkKICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgQnl0ZUJ1ZmZlclt2YWx1ZXMubGVuZ3RoXTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm4gdGhlIHRpbWVzdGFtcCBvZiB0aGUgY29sdW1uIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleC4KKyAgICAgICAgICogUmV0dXJuIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGNvbHVtbiBjb21wb25lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4ZXMuCiAgICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbmRleCB0aGUgY29sdW1uIGluZGV4Ci0gICAgICAgICAqIEByZXR1cm4gdGhlIHRpbWVzdGFtcCBvZiB0aGUgY29sdW1uIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleAorICAgICAgICAgKiBAcmV0dXJuIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGNlbGwgd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4ZXMKICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBsb25nIGdldFRpbWVzdGFtcChpbnQgaW5kZXgpCisgICAgICAgIENvbHVtblRpbWVzdGFtcHMgZ2V0V3JpdGV0aW1lcyhpbnQgY29sdW1uSW5kZXgpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aW1lc3RhbXBzW2luZGV4XTsKKyAgICAgICAgICAgIHJldHVybiB3cml0ZXRpbWVzLmdldChjb2x1bW5JbmRleCk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJuIHRoZSB0dGwgb2YgdGhlIGNvbHVtbiB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXguCisgICAgICAgICAqIFJldHVybiB0aGUgdHRsIG9mIHRoZSBjb2x1bW4gY29tcG9uZW50IHdpdGggdGhlIHNwZWNpZmllZCBjb2x1bW4gYW5kIGNlbGwgaW5kZXhlcy4KICAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGluZGV4IHRoZSBjb2x1bW4gaW5kZXgKLSAgICAgICAgICogQHJldHVybiB0aGUgdHRsIG9mIHRoZSBjb2x1bW4gd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4CisgICAgICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgY29sdW1uIGluZGV4CisgICAgICAgICAqIEByZXR1cm4gdGhlIHR0bCBvZiB0aGUgY29sdW1uIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleGVzCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFR0bChpbnQgaW5kZXgpCisgICAgICAgIENvbHVtblRpbWVzdGFtcHMgZ2V0VHRscyhpbnQgY29sdW1uSW5kZXgpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0dGxzW2luZGV4XTsKKyAgICAgICAgICAgIHJldHVybiB0dGxzLmdldChjb2x1bW5JbmRleCk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogUmV0dXJucyB0aGUgY29sdW1uIHZhbHVlcyBhcyBsaXN0LgogICAgICAgICAgKiA8cD5UaGlzIGNvbnRlbnQgb2YgdGhlIGxpc3Qgd2lsbCBiZSBzaGFyZWQgd2l0aCB0aGUge0Bjb2RlIElucHV0Um93fSB1bmxlc3MgYSBkZWVwIHJlc2V0IGhhcyBiZWVuIGRvbmUuPC9wPgorICAgICAgICAgKgogICAgICAgICAgKiBAcmV0dXJuIHRoZSBjb2x1bW4gdmFsdWVzIGFzIGxpc3QuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgTGlzdDxCeXRlQnVmZmVyPiBnZXRWYWx1ZXMoKQpAQCAtNDMwLDExICs1MTUsMTAgQEAKICAgICAvKioKICAgICAgKiBBZGQgdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGUgc3BlY2lmaWVkIDxjb2RlPlJlc3VsdFNldEJ1aWxkZXI8L2NvZGU+LgogICAgICAqCi0gICAgICogQHBhcmFtIHByb3RvY29sVmVyc2lvbiBwcm90b2NvbCB2ZXJzaW9uIHVzZWQgZm9yIHNlcmlhbGl6YXRpb24KICAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IHJvdwogICAgICAqIEB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaWYgYSBwcm9ibGVtIG9jY3VycyB3aGlsZSBhZGRpbmcgdGhlIGlucHV0IHJvdwogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZElucHV0KFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIElucHV0Um93IGlucHV0KTsKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRJbnB1dChJbnB1dFJvdyBpbnB1dCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBzZWxlY3RvciBvdXRwdXQuCkBAIC00NDUsNiArNTI5LDE2IEBACiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEJ5dGVCdWZmZXIgZ2V0T3V0cHV0KFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pIHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKIAorICAgIHByb3RlY3RlZCBDb2x1bW5UaW1lc3RhbXBzIGdldFdyaXRldGltZXMoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbikKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDb2x1bW5UaW1lc3RhbXBzIGdldFRUTHMoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbikKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIDxjb2RlPlNlbGVjdG9yPC9jb2RlPiBvdXRwdXQgdHlwZS4KICAgICAgKgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2VsZWN0b3JGYWN0b3JpZXMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1NlbGVjdG9yRmFjdG9yaWVzLmphdmEKaW5kZXggN2Y0YmNiMy4uYzVmYmY0NCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2VsZWN0b3JGYWN0b3JpZXMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9TZWxlY3RvckZhY3Rvcmllcy5qYXZhCkBAIC0zMiwyMiArMzIsMjcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOwogCiAvKioKLSAqIEEgc2V0IG9mIDxjb2RlPlNlbGVjdG9yPC9jb2RlPiBmYWN0b3JpZXMuCisgKiBBIHNldCBvZiB7QGNvZGUgU2VsZWN0b3J9IGZhY3Rvcmllcy4KICAqLwogZmluYWwgY2xhc3MgU2VsZWN0b3JGYWN0b3JpZXMgaW1wbGVtZW50cyBJdGVyYWJsZTxTZWxlY3Rvci5GYWN0b3J5PgogewogICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5TZWxlY3RvcjwvY29kZT4gZmFjdG9yaWVzLgorICAgICAqIFRoZSB7QGNvZGUgU2VsZWN0b3J9IGZhY3Rvcmllcy4KICAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIExpc3Q8U2VsZWN0b3IuRmFjdG9yeT4gZmFjdG9yaWVzOwogCiAgICAgLyoqCi0gICAgICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgb25lIG9mIHRoZSBmYWN0b3J5IGNyZWF0ZXMgd3JpdGV0aW1lIHNlbGVjdG9ycy4KKyAgICAgKiB7QGNvZGUgdHJ1ZX0gaWYgb25lIG9mIHRoZSBmYWN0b3JpZXMgY3JlYXRlcyB3cml0ZXRpbWUgc2VsZWN0b3JzLgogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc1dyaXRldGltZUZhY3Rvcnk7CiAKICAgICAvKioKLSAgICAgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiBvbmUgb2YgdGhlIGZhY3RvcnkgY3JlYXRlcyBUVEwgc2VsZWN0b3JzLgorICAgICAqIHtAY29kZSB0cnVlfSBpZiBvbmUgb2YgdGhlIGZhY3RvcmllcyBjcmVhdGVzIG1heFdyaXRldGltZSBzZWxlY3RvcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zTWF4V3JpdGV0aW1lRmFjdG9yeTsKKworICAgIC8qKgorICAgICAqIHtAY29kZSB0cnVlfSBpZiBvbmUgb2YgdGhlIGZhY3RvcmllcyBjcmVhdGVzIFRUTCBzZWxlY3RvcnMuCiAgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zVFRMRmFjdG9yeTsKIApAQCAtOTYsNiArMTAxLDcgQEAKICAgICAgICAgICAgIEZhY3RvcnkgZmFjdG9yeSA9IHNlbGVjdGFibGUubmV3U2VsZWN0b3JGYWN0b3J5KHRhYmxlLCBleHBlY3RlZFR5cGUsIGRlZnMsIGJvdW5kTmFtZXMpOwogICAgICAgICAgICAgY29udGFpbnNXcml0ZXRpbWVGYWN0b3J5IHw9IGZhY3RvcnkuaXNXcml0ZXRpbWVTZWxlY3RvckZhY3RvcnkoKTsKICAgICAgICAgICAgIGNvbnRhaW5zVFRMRmFjdG9yeSB8PSBmYWN0b3J5LmlzVFRMU2VsZWN0b3JGYWN0b3J5KCk7CisgICAgICAgICAgICBjb250YWluc01heFdyaXRldGltZUZhY3RvcnkgfD0gZmFjdG9yeS5pc01heFdyaXRldGltZVNlbGVjdG9yRmFjdG9yeSgpOwogICAgICAgICAgICAgaWYgKGZhY3RvcnkuaXNBZ2dyZWdhdGVTZWxlY3RvckZhY3RvcnkoKSkKICAgICAgICAgICAgICAgICArK251bWJlck9mQWdncmVnYXRlRmFjdG9yaWVzOwogICAgICAgICAgICAgZmFjdG9yaWVzLmFkZChmYWN0b3J5KTsKQEAgLTE0MSw3ICsxNDcsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFNlbGVjdG9yRm9yT3JkZXJpbmcoQ29sdW1uTWV0YWRhdGEgZGVmLCBpbnQgaW5kZXgpCiAgICAgewotICAgICAgICBmYWN0b3JpZXMuYWRkKFNpbXBsZVNlbGVjdG9yLm5ld0ZhY3RvcnkoZGVmLCBpbmRleCkpOworICAgICAgICBmYWN0b3JpZXMuYWRkKFNpbXBsZVNlbGVjdG9yLm5ld0ZhY3RvcnkoZGVmLCBpbmRleCwgdHJ1ZSkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTY2LDYgKzE3MiwxNyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGlzIHtAY29kZSBTZWxlY3RvckZhY3Rvcmllc30gY29udGFpbnMgYXQgbGVhc3Qgb25lIGZhY3RvcnkgZm9yIG1heFdyaXRldGltZSBzZWxlY3RvcnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAbGluayB0cnVlfSBpZiB0aGlzIHtAbGluayBTZWxlY3RvckZhY3Rvcmllc30gY29udGFpbnMgYXQgbGVhc3Qgb25lIGZhY3RvcnkgZm9yIG1heFdyaXRldGltZQorICAgICAqIHNlbGVjdG9ycywge0BsaW5rIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNNYXhXcml0ZXRpbWVTZWxlY3RvckZhY3RvcnkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zTWF4V3JpdGV0aW1lRmFjdG9yeTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhpcyA8Y29kZT5TZWxlY3RvckZhY3RvcmllczwvY29kZT4gY29udGFpbnMgYXQgbGVhc3Qgb25lIGZhY3RvcnkgZm9yIFRUTCBzZWxlY3RvcnMuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgPGNvZGU+U2VsZWN0b3JGYWN0b3JpZXM8L2NvZGU+IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBmYWN0b3J5IGZvciBUVEwKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1NldFNlbGVjdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9TZXRTZWxlY3Rvci5qYXZhCmluZGV4IGI1NGIyZDQuLmM2YWEyMjUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1NldFNlbGVjdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2V0U2VsZWN0b3IuamF2YQpAQCAtNDksNyArNDksNyBAQAogICAgICAgICBwcm90ZWN0ZWQgU2VsZWN0b3IgZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbiwgaW50IHZlcnNpb24sIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICBTZXRUeXBlPD8+IHR5cGUgPSAoU2V0VHlwZTw/PikgcmVhZFR5cGUobWV0YWRhdGEsIGluKTsKLSAgICAgICAgICAgIGludCBzaXplID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgaW50IHNpemUgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKICAgICAgICAgICAgIExpc3Q8U2VsZWN0b3I+IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDw+KHNpemUpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCiAgICAgICAgICAgICAgICAgZWxlbWVudHMuYWRkKHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIHZlcnNpb24sIG1ldGFkYXRhKSk7CkBAIC05MSwxMCArOTEsMTAgQEAKICAgICAgICAgICAgIGVsZW1lbnRzLmdldChpKS5hZGRGZXRjaGVkQ29sdW1ucyhidWlsZGVyKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBJbnB1dFJvdyBpbnB1dCkKKyAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChJbnB1dFJvdyBpbnB1dCkKICAgICB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwLCBtID0gZWxlbWVudHMuc2l6ZSgpOyBpIDwgbTsgaSsrKQotICAgICAgICAgICAgZWxlbWVudHMuZ2V0KGkpLmFkZElucHV0KHByb3RvY29sVmVyc2lvbiwgaW5wdXQpOworICAgICAgICAgICAgZWxlbWVudHMuZ2V0KGkpLmFkZElucHV0KGlucHV0KTsKICAgICB9CiAKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRPdXRwdXQoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbikKQEAgLTEwNCw3ICsxMDQsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBidWZmZXJzLmFkZChlbGVtZW50cy5nZXQoaSkuZ2V0T3V0cHV0KHByb3RvY29sVmVyc2lvbikpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKGJ1ZmZlcnMsIGJ1ZmZlcnMuc2l6ZSgpLCBwcm90b2NvbFZlcnNpb24pOworICAgICAgICByZXR1cm4gQ29sbGVjdGlvblNlcmlhbGl6ZXIucGFjayhidWZmZXJzLCBidWZmZXJzLnNpemUoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgcmVzZXQoKQpAQCAtMTc4LDcgKzE3OCw3IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgc2VyaWFsaXplKERhdGFPdXRwdXRQbHVzIG91dCwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgd3JpdGVUeXBlKG91dCwgdHlwZSk7Ci0gICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChlbGVtZW50cy5zaXplKCkpOworICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihlbGVtZW50cy5zaXplKCkpOwogICAgICAgICBmb3IgKGludCBpID0gMCwgbSA9IGVsZW1lbnRzLnNpemUoKTsgaSA8IG07IGkrKykKICAgICAgICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKGVsZW1lbnRzLmdldChpKSwgb3V0LCB2ZXJzaW9uKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9TaW1wbGVTZWxlY3Rvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2ltcGxlU2VsZWN0b3IuamF2YQppbmRleCBhNmFlNDQ2Li4yMjA0NWViIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9TaW1wbGVTZWxlY3Rvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1NpbXBsZVNlbGVjdG9yLmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmcuQ29sdW1uTWFzazsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Db2x1bW5TcGVjaWZpY2F0aW9uOwpAQCAtNDUsNyArNDYsNyBAQAogICAgICAgICAgICAgQnl0ZUJ1ZmZlciBjb2x1bW5OYW1lID0gQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhWSW50TGVuZ3RoKGluKTsKICAgICAgICAgICAgIENvbHVtbk1ldGFkYXRhIGNvbHVtbiA9IG1ldGFkYXRhLmdldENvbHVtbihjb2x1bW5OYW1lKTsKICAgICAgICAgICAgIGludCBpZHggPSBpbi5yZWFkSW50KCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVNlbGVjdG9yKGNvbHVtbiwgaWR4KTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlU2VsZWN0b3IoY29sdW1uLCBpZHgsIGZhbHNlKTsKICAgICAgICAgfQogICAgIH07CiAKQEAgLTU1LDEzICs1NiwxNCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU2ltcGxlU2VsZWN0b3JGYWN0b3J5IGV4dGVuZHMgRmFjdG9yeQogICAgIHsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaWR4OwotCiAgICAgICAgIHByaXZhdGUgZmluYWwgQ29sdW1uTWV0YWRhdGEgY29sdW1uOworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gdXNlRm9yUG9zdE9yZGVyaW5nOwogCi0gICAgICAgIHByaXZhdGUgU2ltcGxlU2VsZWN0b3JGYWN0b3J5KGludCBpZHgsIENvbHVtbk1ldGFkYXRhIGRlZikKKyAgICAgICAgcHJpdmF0ZSBTaW1wbGVTZWxlY3RvckZhY3RvcnkoaW50IGlkeCwgQ29sdW1uTWV0YWRhdGEgZGVmLCBib29sZWFuIHVzZUZvclBvc3RPcmRlcmluZykKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy5pZHggPSBpZHg7CiAgICAgICAgICAgICB0aGlzLmNvbHVtbiA9IGRlZjsKKyAgICAgICAgICAgIHRoaXMudXNlRm9yUG9zdE9yZGVyaW5nID0gdXNlRm9yUG9zdE9yZGVyaW5nOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC04NCw3ICs4Niw3IEBACiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU2VsZWN0b3IgbmV3SW5zdGFuY2UoUXVlcnlPcHRpb25zIG9wdGlvbnMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlU2VsZWN0b3IoY29sdW1uLCBpZHgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTZWxlY3Rvcihjb2x1bW4sIGlkeCwgdXNlRm9yUG9zdE9yZGVyaW5nKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpAQCAtMTE3LDEyICsxMTksMTUgQEAKIAogICAgIHB1YmxpYyBmaW5hbCBDb2x1bW5NZXRhZGF0YSBjb2x1bW47CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaWR4OworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiB1c2VGb3JQb3N0T3JkZXJpbmc7CiAgICAgcHJpdmF0ZSBCeXRlQnVmZmVyIGN1cnJlbnQ7CisgICAgcHJpdmF0ZSBDb2x1bW5UaW1lc3RhbXBzIHdyaXRldGltZXM7CisgICAgcHJpdmF0ZSBDb2x1bW5UaW1lc3RhbXBzIHR0bHM7CiAgICAgcHJpdmF0ZSBib29sZWFuIGlzU2V0OwogCi0gICAgcHVibGljIHN0YXRpYyBGYWN0b3J5IG5ld0ZhY3RvcnkoZmluYWwgQ29sdW1uTWV0YWRhdGEgZGVmLCBmaW5hbCBpbnQgaWR4KQorICAgIHB1YmxpYyBzdGF0aWMgRmFjdG9yeSBuZXdGYWN0b3J5KGZpbmFsIENvbHVtbk1ldGFkYXRhIGRlZiwgZmluYWwgaW50IGlkeCwgYm9vbGVhbiB1c2VGb3JQb3N0T3JkZXJpbmcpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVNlbGVjdG9yRmFjdG9yeShpZHgsIGRlZik7CisgICAgICAgIHJldHVybiBuZXcgU2ltcGxlU2VsZWN0b3JGYWN0b3J5KGlkeCwgZGVmLCB1c2VGb3JQb3N0T3JkZXJpbmcpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTMyLDEyICsxMzcsMjMgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBJbnB1dFJvdyBpbnB1dCkgdGhyb3dzIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uCisgICAgcHVibGljIHZvaWQgYWRkSW5wdXQoSW5wdXRSb3cgaW5wdXQpIHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgaWYgKCFpc1NldCkKICAgICAgICAgewogICAgICAgICAgICAgaXNTZXQgPSB0cnVlOwotICAgICAgICAgICAgY3VycmVudCA9IGlucHV0LmdldFZhbHVlKGlkeCk7CisgICAgICAgICAgICB3cml0ZXRpbWVzID0gaW5wdXQuZ2V0V3JpdGV0aW1lcyhpZHgpOworICAgICAgICAgICAgdHRscyA9IGlucHV0LmdldFR0bHMoaWR4KTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIFdlIGFwcGx5IHRoZSBjb2x1bW4gbWFzayBvZiB0aGUgY29sdW1uIHVubGVzczoKKyAgICAgICAgICAgIC0gVGhlIGNvbHVtbiBkb2Vzbid0IGhhdmUgYSBtYXNrCisgICAgICAgICAgICAtIFRoaXMgc2VsZWN0b3IgaXMgZm9yIGEgcXVlcnkgd2l0aCBPUkRFUiBCWSBwb3N0LW9yZGVyaW5nLCBpbmRpY2F0ZWQgYnkgdGhpcy51c2VGb3JQb3N0T3JkZXJpbmcKKyAgICAgICAgICAgIC0gVGhlIGlucHV0IHJvdyBpcyBmb3IgYSB1c2VyIHdpdGggVU5NQVNLIHBlcm1pc3Npb24sIGluZGljYXRlZCBieSBpbnB1dC51bm1hc2soKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb2x1bW5NYXNrIG1hc2sgPSB1c2VGb3JQb3N0T3JkZXJpbmcgfHwgaW5wdXQudW5tYXNrKCkgPyBudWxsIDogY29sdW1uLmdldE1hc2soKTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgdmFsdWUgPSBpbnB1dC5nZXRWYWx1ZShpZHgpOworICAgICAgICAgICAgY3VycmVudCA9IG1hc2sgPT0gbnVsbCA/IHZhbHVlIDogbWFzay5tYXNrKGlucHV0LmdldFByb3RvY29sVmVyc2lvbigpLCB2YWx1ZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE0OCwxMCArMTY0LDI0IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIENvbHVtblRpbWVzdGFtcHMgZ2V0V3JpdGV0aW1lcyhQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHdyaXRldGltZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIENvbHVtblRpbWVzdGFtcHMgZ2V0VFRMcyhQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHR0bHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcmVzZXQoKQogICAgIHsKICAgICAgICAgaXNTZXQgPSBmYWxzZTsKICAgICAgICAgY3VycmVudCA9IG51bGw7CisgICAgICAgIHdyaXRldGltZXMgPSBudWxsOworICAgICAgICB0dGxzID0gbnVsbDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE2NiwxMSArMTk2LDEyIEBACiAgICAgICAgIHJldHVybiBjb2x1bW4ubmFtZS50b1N0cmluZygpOwogICAgIH0KIAotICAgIHByaXZhdGUgU2ltcGxlU2VsZWN0b3IoQ29sdW1uTWV0YWRhdGEgY29sdW1uLCBpbnQgaWR4KQorICAgIHByaXZhdGUgU2ltcGxlU2VsZWN0b3IoQ29sdW1uTWV0YWRhdGEgY29sdW1uLCBpbnQgaWR4LCBib29sZWFuIHVzZUZvclBvc3RPcmRlcmluZykKICAgICB7CiAgICAgICAgIHN1cGVyKEtpbmQuU0lNUExFX1NFTEVDVE9SKTsKICAgICAgICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47CiAgICAgICAgIHRoaXMuaWR4ID0gaWR4OworICAgICAgICB0aGlzLnVzZUZvclBvc3RPcmRlcmluZyA9IHVzZUZvclBvc3RPcmRlcmluZzsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTIxMCw2ICsyNDEsNiBAQAogICAgIHByb3RlY3RlZCB2b2lkIHNlcmlhbGl6ZShEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLndyaXRlV2l0aFZJbnRMZW5ndGgoY29sdW1uLm5hbWUuYnl0ZXMsIG91dCk7Ci0gICAgICAgIG91dC53cml0ZUludChpZHgpOzsKKyAgICAgICAgb3V0LndyaXRlSW50KGlkeCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vVGVybVNlbGVjdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9UZXJtU2VsZWN0b3IuamF2YQppbmRleCA2ZjBjODQ0Li4xOWE2MGFjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9UZXJtU2VsZWN0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9UZXJtU2VsZWN0b3IuamF2YQpAQCAtMTAxLDcgKzEwMSw3IEBACiAgICAgewogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGFkZElucHV0KFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIElucHV0Um93IGlucHV0KQorICAgIHB1YmxpYyB2b2lkIGFkZElucHV0KElucHV0Um93IGlucHV0KQogICAgIHsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1R1cGxlU2VsZWN0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1R1cGxlU2VsZWN0b3IuamF2YQppbmRleCAwYzA2YmMyLi4xMTFkNjNjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9UdXBsZVNlbGVjdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vVHVwbGVTZWxlY3Rvci5qYXZhCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgICAgIHByb3RlY3RlZCBTZWxlY3RvciBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBpbnQgdmVyc2lvbiwgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiB0eXBlID0gcmVhZFR5cGUobWV0YWRhdGEsIGluKTsKLSAgICAgICAgICAgIGludCBzaXplID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgaW50IHNpemUgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKICAgICAgICAgICAgIExpc3Q8U2VsZWN0b3I+IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDw+KHNpemUpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCiAgICAgICAgICAgICAgICAgZWxlbWVudHMuYWRkKHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIHZlcnNpb24sIG1ldGFkYXRhKSk7CkBAIC04OSwxMCArODksMTAgQEAKICAgICAgICAgICAgIGVsZW1lbnRzLmdldChpKS5hZGRGZXRjaGVkQ29sdW1ucyhidWlsZGVyKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBJbnB1dFJvdyBpbnB1dCkKKyAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChJbnB1dFJvdyBpbnB1dCkKICAgICB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwLCBtID0gZWxlbWVudHMuc2l6ZSgpOyBpIDwgbTsgaSsrKQotICAgICAgICAgICAgZWxlbWVudHMuZ2V0KGkpLmFkZElucHV0KHByb3RvY29sVmVyc2lvbiwgaW5wdXQpOworICAgICAgICAgICAgZWxlbWVudHMuZ2V0KGkpLmFkZElucHV0KGlucHV0KTsKICAgICB9CiAKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRPdXRwdXQoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbikgdGhyb3dzIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uCkBAIC0xNzYsNyArMTc2LDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXJpYWxpemUoRGF0YU91dHB1dFBsdXMgb3V0LCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICB3cml0ZVR5cGUob3V0LCB0eXBlKTsKLSAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGVsZW1lbnRzLnNpemUoKSk7CisgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGVsZW1lbnRzLnNpemUoKSk7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDAsIG0gPSBlbGVtZW50cy5zaXplKCk7IGkgPCBtOyBpKyspCiAgICAgICAgICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShlbGVtZW50cy5nZXQoaSksIG91dCwgdmVyc2lvbik7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9Vc2VyVHlwZVNlbGVjdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9Vc2VyVHlwZVNlbGVjdG9yLmphdmEKaW5kZXggODAwNzQ2Ny4uYmY3MWM3MyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vVXNlclR5cGVTZWxlY3Rvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1VzZXJUeXBlU2VsZWN0b3IuamF2YQpAQCAtNTUsNyArNTUsNyBAQAogICAgICAgICBwcm90ZWN0ZWQgU2VsZWN0b3IgZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbiwgaW50IHZlcnNpb24sIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICBVc2VyVHlwZSB0eXBlID0gKFVzZXJUeXBlKSByZWFkVHlwZShtZXRhZGF0YSwgaW4pOwotICAgICAgICAgICAgaW50IHNpemUgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogICAgICAgICAgICAgTWFwPEZpZWxkSWRlbnRpZmllciwgU2VsZWN0b3I+IGZpZWxkcyA9IG5ldyBIYXNoTWFwPD4oc2l6ZSk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKICAgICAgICAgICAgIHsKQEAgLTE4MiwxMCArMTgyLDEwIEBACiAgICAgICAgICAgICBmaWVsZC5hZGRGZXRjaGVkQ29sdW1ucyhidWlsZGVyKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBJbnB1dFJvdyBpbnB1dCkKKyAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChJbnB1dFJvdyBpbnB1dCkKICAgICB7CiAgICAgICAgIGZvciAoU2VsZWN0b3IgZmllbGQgOiBmaWVsZHMudmFsdWVzKCkpCi0gICAgICAgICAgICBmaWVsZC5hZGRJbnB1dChwcm90b2NvbFZlcnNpb24sIGlucHV0KTsKKyAgICAgICAgICAgIGZpZWxkLmFkZElucHV0KGlucHV0KTsKICAgICB9CiAKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRPdXRwdXQoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbikKQEAgLTI3Miw3ICsyNzIsNyBAQAogICAgIHByb3RlY3RlZCB2b2lkIHNlcmlhbGl6ZShEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIHdyaXRlVHlwZShvdXQsIHR5cGUpOwotICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoZmllbGRzLnNpemUoKSk7CisgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGZpZWxkcy5zaXplKCkpOwogCiAgICAgICAgIGZvciAoTWFwLkVudHJ5PEZpZWxkSWRlbnRpZmllciwgU2VsZWN0b3I+IGZpZWxkIDogZmllbGRzLmVudHJ5U2V0KCkpCiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1dyaXRldGltZU9yVFRMU2VsZWN0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1dyaXRldGltZU9yVFRMU2VsZWN0b3IuamF2YQppbmRleCAyYzU2ZjVjLi45YmUwYjQ1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9Xcml0ZXRpbWVPclRUTFNlbGVjdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vV3JpdGV0aW1lT3JUVExTZWxlY3Rvci5qYXZhCkBAIC0yMiwxMDcgKzIyLDEyNyBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTGlzdFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5RdWVyeU9wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Db2x1bW5TcGVjaWZpY2F0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTG9uZ1R5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIAogZmluYWwgY2xhc3MgV3JpdGV0aW1lT3JUVExTZWxlY3RvciBleHRlbmRzIFNlbGVjdG9yCiB7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTZWxlY3RvckRlc2VyaWFsaXplciBkZXNlcmlhbGl6ZXIgPSBuZXcgU2VsZWN0b3JEZXNlcmlhbGl6ZXIoKQorICAgIHN0YXRpYyBmaW5hbCBTZWxlY3RvckRlc2VyaWFsaXplciBkZXNlcmlhbGl6ZXIgPSBuZXcgU2VsZWN0b3JEZXNlcmlhbGl6ZXIoKQogICAgIHsKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCBTZWxlY3RvciBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBpbnQgdmVyc2lvbiwgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKLSAgICAgICAgICAgIEJ5dGVCdWZmZXIgY29sdW1uTmFtZSA9IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoVkludExlbmd0aChpbik7Ci0gICAgICAgICAgICBDb2x1bW5NZXRhZGF0YSBjb2x1bW4gPSBtZXRhZGF0YS5nZXRDb2x1bW4oY29sdW1uTmFtZSk7CisgICAgICAgICAgICBTZWxlY3RvciBzZWxlY3RlZCA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIHZlcnNpb24sIG1ldGFkYXRhKTsKICAgICAgICAgICAgIGludCBpZHggPSBpbi5yZWFkSW50KCk7Ci0gICAgICAgICAgICBib29sZWFuIGlzV3JpdGV0aW1lID0gaW4ucmVhZEJvb2xlYW4oKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgV3JpdGV0aW1lT3JUVExTZWxlY3Rvcihjb2x1bW4sIGlkeCwgaXNXcml0ZXRpbWUpOworICAgICAgICAgICAgaW50IG9yZGluYWwgPSBpbi5yZWFkQnl0ZSgpOworICAgICAgICAgICAgU2VsZWN0YWJsZS5Xcml0ZXRpbWVPclRUTC5LaW5kIGtpbmQgPSBTZWxlY3RhYmxlLldyaXRldGltZU9yVFRMLktpbmQuZnJvbU9yZGluYWwob3JkaW5hbCk7CisgICAgICAgICAgICBib29sZWFuIGlzTXVsdGlDZWxsID0gaW4ucmVhZEJvb2xlYW4oKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgV3JpdGV0aW1lT3JUVExTZWxlY3RvcihzZWxlY3RlZCwgaWR4LCBraW5kLCBpc011bHRpQ2VsbCk7CiAgICAgICAgIH0KICAgICB9OwogCi0gICAgcHJpdmF0ZSBmaW5hbCBDb2x1bW5NZXRhZGF0YSBjb2x1bW47Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgaWR4OwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc1dyaXRldGltZTsKKyAgICBwcml2YXRlIGZpbmFsIFNlbGVjdG9yIHNlbGVjdGVkOworICAgIHByaXZhdGUgZmluYWwgaW50IGNvbHVtbkluZGV4OworICAgIHByaXZhdGUgZmluYWwgU2VsZWN0YWJsZS5Xcml0ZXRpbWVPclRUTC5LaW5kIGtpbmQ7CiAgICAgcHJpdmF0ZSBCeXRlQnVmZmVyIGN1cnJlbnQ7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzTXVsdGlDZWxsOwogICAgIHByaXZhdGUgYm9vbGVhbiBpc1NldDsKIAotICAgIHB1YmxpYyBzdGF0aWMgRmFjdG9yeSBuZXdGYWN0b3J5KGZpbmFsIENvbHVtbk1ldGFkYXRhIGRlZiwgZmluYWwgaW50IGlkeCwgZmluYWwgYm9vbGVhbiBpc1dyaXRldGltZSkKKyAgICBwdWJsaWMgc3RhdGljIEZhY3RvcnkgbmV3RmFjdG9yeShmaW5hbCBTZWxlY3Rvci5GYWN0b3J5IGZhY3RvcnksIGZpbmFsIGludCBjb2x1bW5JbmRleCwgZmluYWwgU2VsZWN0YWJsZS5Xcml0ZXRpbWVPclRUTC5LaW5kIGtpbmQsIGJvb2xlYW4gaXNNdWx0aUNlbGwpCiAgICAgewogICAgICAgICByZXR1cm4gbmV3IEZhY3RvcnkoKQogICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29sdW1uTmFtZSgpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzKCVzKSIsIGlzV3JpdGV0aW1lID8gIndyaXRldGltZSIgOiAidHRsIiwgZGVmLm5hbWUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzKCVzKSIsIGtpbmQubmFtZSwgZmFjdG9yeS5nZXRDb2x1bW5OYW1lKCkpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHByb3RlY3RlZCBBYnN0cmFjdFR5cGU8Pz4gZ2V0UmV0dXJuVHlwZSgpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzV3JpdGV0aW1lID8gTG9uZ1R5cGUuaW5zdGFuY2UgOiBJbnQzMlR5cGUuaW5zdGFuY2U7CisgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHR5cGUgPSBraW5kLnJldHVyblR5cGU7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlzTXVsdGlDZWxsICYmICFraW5kLmFnZ3JlZ2F0ZXNNdWx0aUNlbGwoKSA/IExpc3RUeXBlLmdldEluc3RhbmNlKHR5cGUsIGZhbHNlKSA6IHR5cGU7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgYWRkQ29sdW1uTWFwcGluZyhTZWxlY3Rpb25Db2x1bW5NYXBwaW5nIG1hcHBpbmcsIENvbHVtblNwZWNpZmljYXRpb24gcmVzdWx0c0NvbHVtbikKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIG1hcHBpbmcuYWRkTWFwcGluZyhyZXN1bHRzQ29sdW1uLCBkZWYpOworICAgICAgICAgICAgICAgIGZhY3RvcnkuYWRkQ29sdW1uTWFwcGluZyhtYXBwaW5nLCByZXN1bHRzQ29sdW1uKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgU2VsZWN0b3IgbmV3SW5zdGFuY2UoUXVlcnlPcHRpb25zIG9wdGlvbnMpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXcml0ZXRpbWVPclRUTFNlbGVjdG9yKGRlZiwgaWR4LCBpc1dyaXRldGltZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXcml0ZXRpbWVPclRUTFNlbGVjdG9yKGZhY3RvcnkubmV3SW5zdGFuY2Uob3B0aW9ucyksIGNvbHVtbkluZGV4LCBraW5kLCBpc011bHRpQ2VsbCk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZXRpbWVTZWxlY3RvckZhY3RvcnkoKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBpc1dyaXRldGltZTsKKyAgICAgICAgICAgICAgICByZXR1cm4ga2luZCAhPSBTZWxlY3RhYmxlLldyaXRldGltZU9yVFRMLktpbmQuVFRMOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVFRMU2VsZWN0b3JGYWN0b3J5KCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIWlzV3JpdGV0aW1lOworICAgICAgICAgICAgICAgIHJldHVybiBraW5kID09IFNlbGVjdGFibGUuV3JpdGV0aW1lT3JUVEwuS2luZC5UVEw7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNNYXhXcml0ZXRpbWVTZWxlY3RvckZhY3RvcnkoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBraW5kID09IFNlbGVjdGFibGUuV3JpdGV0aW1lT3JUVEwuS2luZC5NQVhfV1JJVEVfVElNRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhcmVBbGxGZXRjaGVkQ29sdW1uc0tub3duKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGRGZXRjaGVkQ29sdW1ucyhDb2x1bW5GaWx0ZXIuQnVpbGRlciBidWlsZGVyKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkKGRlZik7CisgICAgICAgICAgICAgICAgZmFjdG9yeS5hZGRGZXRjaGVkQ29sdW1ucyhidWlsZGVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBhZGRGZXRjaGVkQ29sdW1ucyhDb2x1bW5GaWx0ZXIuQnVpbGRlciBidWlsZGVyKQogICAgIHsKLSAgICAgICAgYnVpbGRlci5hZGQoY29sdW1uKTsKKyAgICAgICAgc2VsZWN0ZWQuYWRkRmV0Y2hlZENvbHVtbnMoYnVpbGRlcik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYWRkSW5wdXQoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgSW5wdXRSb3cgaW5wdXQpCisgICAgcHVibGljIHZvaWQgYWRkSW5wdXQoSW5wdXRSb3cgaW5wdXQpCiAgICAgewogICAgICAgICBpZiAoaXNTZXQpCiAgICAgICAgICAgICByZXR1cm47CiAKICAgICAgICAgaXNTZXQgPSB0cnVlOwogCi0gICAgICAgIGlmIChpc1dyaXRldGltZSkKKyAgICAgICAgc2VsZWN0ZWQuYWRkSW5wdXQoaW5wdXQpOworICAgICAgICBQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uID0gaW5wdXQuZ2V0UHJvdG9jb2xWZXJzaW9uKCk7CisKKyAgICAgICAgc3dpdGNoIChraW5kKQogICAgICAgICB7Ci0gICAgICAgICAgICBsb25nIHRzID0gaW5wdXQuZ2V0VGltZXN0YW1wKGlkeCk7Ci0gICAgICAgICAgICBjdXJyZW50ID0gdHMgIT0gTG9uZy5NSU5fVkFMVUUgPyBCeXRlQnVmZmVyVXRpbC5ieXRlcyh0cykgOiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHR0bCA9IGlucHV0LmdldFR0bChpZHgpOwotICAgICAgICAgICAgY3VycmVudCA9IHR0bCA+IDAgPyBCeXRlQnVmZmVyVXRpbC5ieXRlcyh0dGwpIDogbnVsbDsKKyAgICAgICAgICAgIGNhc2UgV1JJVEVfVElNRToKKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gc2VsZWN0ZWQuZ2V0V3JpdGV0aW1lcyhwcm90b2NvbFZlcnNpb24pLnRvQnl0ZUJ1ZmZlcihwcm90b2NvbFZlcnNpb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNQVhfV1JJVEVfVElNRToKKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gc2VsZWN0ZWQuZ2V0V3JpdGV0aW1lcyhwcm90b2NvbFZlcnNpb24pLm1heCgpLnRvQnl0ZUJ1ZmZlcihwcm90b2NvbFZlcnNpb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUVEw6CisgICAgICAgICAgICAgICAgY3VycmVudCA9IHNlbGVjdGVkLmdldFRUTHMocHJvdG9jb2xWZXJzaW9uKS50b0J5dGVCdWZmZXIocHJvdG9jb2xWZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTMzLDI3ICsxNTMsMzAgQEAKIAogICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKICAgICB7CisgICAgICAgIHNlbGVjdGVkLnJlc2V0KCk7CiAgICAgICAgIGlzU2V0ID0gZmFsc2U7CiAgICAgICAgIGN1cnJlbnQgPSBudWxsOwogICAgIH0KIAogICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZ2V0VHlwZSgpCiAgICAgewotICAgICAgICByZXR1cm4gaXNXcml0ZXRpbWUgPyBMb25nVHlwZS5pbnN0YW5jZSA6IEludDMyVHlwZS5pbnN0YW5jZTsKKyAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHR5cGUgPSBraW5kLnJldHVyblR5cGU7CisgICAgICAgIHJldHVybiBpc011bHRpQ2VsbCA/IExpc3RUeXBlLmdldEluc3RhbmNlKHR5cGUsIGZhbHNlKSA6IHR5cGU7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCiAgICAgewotICAgICAgICByZXR1cm4gY29sdW1uLm5hbWUudG9TdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIHNlbGVjdGVkLnRvU3RyaW5nKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBXcml0ZXRpbWVPclRUTFNlbGVjdG9yKENvbHVtbk1ldGFkYXRhIGNvbHVtbiwgaW50IGlkeCwgYm9vbGVhbiBpc1dyaXRldGltZSkKKyAgICBwcml2YXRlIFdyaXRldGltZU9yVFRMU2VsZWN0b3IoU2VsZWN0b3Igc2VsZWN0ZWQsIGludCBpZHgsIFNlbGVjdGFibGUuV3JpdGV0aW1lT3JUVEwuS2luZCBraW5kLCBib29sZWFuIGlzTXVsdGlDZWxsKQogICAgIHsKICAgICAgICAgc3VwZXIoS2luZC5XUklURVRJTUVfT1JfVFRMX1NFTEVDVE9SKTsKLSAgICAgICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47Ci0gICAgICAgIHRoaXMuaWR4ID0gaWR4OwotICAgICAgICB0aGlzLmlzV3JpdGV0aW1lID0gaXNXcml0ZXRpbWU7CisgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBzZWxlY3RlZDsKKyAgICAgICAgdGhpcy5jb2x1bW5JbmRleCA9IGlkeDsKKyAgICAgICAgdGhpcy5raW5kID0ga2luZDsKKyAgICAgICAgdGhpcy5pc011bHRpQ2VsbCA9IGlzTXVsdGlDZWxsOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTY3LDMwICsxOTAsMzAgQEAKIAogICAgICAgICBXcml0ZXRpbWVPclRUTFNlbGVjdG9yIHMgPSAoV3JpdGV0aW1lT3JUVExTZWxlY3RvcikgbzsKIAotICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbChjb2x1bW4sIHMuY29sdW1uKQotICAgICAgICAgICAgJiYgT2JqZWN0cy5lcXVhbChpZHgsIHMuaWR4KQotICAgICAgICAgICAgJiYgT2JqZWN0cy5lcXVhbChpc1dyaXRldGltZSwgcy5pc1dyaXRldGltZSk7CisgICAgICAgIHJldHVybiBPYmplY3RzLmVxdWFsKHNlbGVjdGVkLCBzLnNlbGVjdGVkKSAmJiBraW5kID09IHMua2luZDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBPYmplY3RzLmhhc2hDb2RlKGNvbHVtbiwgaWR4LCBpc1dyaXRldGltZSk7CisgICAgICAgIHJldHVybiBPYmplY3RzLmhhc2hDb2RlKHNlbGVjdGVkLCBraW5kKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgaW50IHNlcmlhbGl6ZWRTaXplKGludCB2ZXJzaW9uKQogICAgIHsKLSAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLnNlcmlhbGl6ZWRTaXplV2l0aFZJbnRMZW5ndGgoY29sdW1uLm5hbWUuYnl0ZXMpCi0gICAgICAgICAgICAgICAgKyBUeXBlU2l6ZXMuc2l6ZW9mKGlkeCkKLSAgICAgICAgICAgICAgICArIFR5cGVTaXplcy5zaXplb2YoaXNXcml0ZXRpbWUpOworICAgICAgICByZXR1cm4gc2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShzZWxlY3RlZCwgdmVyc2lvbikKKyAgICAgICAgICAgICAgICArIFR5cGVTaXplcy5zaXplb2YoY29sdW1uSW5kZXgpCisgICAgICAgICAgICAgICAgKyBUeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50KGtpbmQub3JkaW5hbCgpKQorICAgICAgICAgICAgICAgICsgVHlwZVNpemVzLnNpemVvZihpc011bHRpQ2VsbCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VyaWFsaXplKERhdGFPdXRwdXRQbHVzIG91dCwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVXaXRoVkludExlbmd0aChjb2x1bW4ubmFtZS5ieXRlcywgb3V0KTsKLSAgICAgICAgb3V0LndyaXRlSW50KGlkeCk7Ci0gICAgICAgIG91dC53cml0ZUJvb2xlYW4oaXNXcml0ZXRpbWUpOworICAgICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShzZWxlY3RlZCwgb3V0LCB2ZXJzaW9uKTsKKyAgICAgICAgb3V0LndyaXRlSW50KGNvbHVtbkluZGV4KTsKKyAgICAgICAgb3V0LndyaXRlQnl0ZShraW5kLm9yZGluYWwoKSk7CisgICAgICAgIG91dC53cml0ZUJvb2xlYW4oaXNNdWx0aUNlbGwpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9CYXRjaFN0YXRlbWVudC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL0JhdGNoU3RhdGVtZW50LmphdmEKaW5kZXggNjFlNDkzNC4uYjAzNGRiNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL0JhdGNoU3RhdGVtZW50LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL0JhdGNoU3RhdGVtZW50LmphdmEKQEAgLTQyLDYgKzQyLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvd0l0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkJhdGNoTWV0cmljczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNsaWVudFJlcXVlc3RTaXplTWV0cmljczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhY2luZy5UcmFjaW5nOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5tZXNzYWdlcy5SZXN1bHRNZXNzYWdlOwpAQCAtNDQyLDYgKzQ0Myw3IEBACiAKICAgICAgICAgYm9vbGVhbiBtdXRhdGVBdG9taWMgPSAoaXNMb2dnZWQoKSAmJiBtdXRhdGlvbnMuc2l6ZSgpID4gMSk7CiAgICAgICAgIFN0b3JhZ2VQcm94eS5tdXRhdGVXaXRoVHJpZ2dlcnMobXV0YXRpb25zLCBjbCwgbXV0YXRlQXRvbWljLCBxdWVyeVN0YXJ0TmFub1RpbWUpOworICAgICAgICBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MucmVjb3JkUm93QW5kQ29sdW1uQ291bnRNZXRyaWNzKG11dGF0aW9ucyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBhcnRpdGlvbnNQZXJCYXRjaE1ldHJpY3MoaW50IHVwZGF0ZWRQYXJ0aXRpb25zKQpAQCAtNjQ3LDcgKzY0OSw3IEBACiAgICAgICAgIHB1YmxpYyBCYXRjaFN0YXRlbWVudCBwcmVwYXJlKENsaWVudFN0YXRlIHN0YXRlKQogICAgICAgICB7CiAgICAgICAgICAgICBMaXN0PE1vZGlmaWNhdGlvblN0YXRlbWVudD4gc3RhdGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8PihwYXJzZWRTdGF0ZW1lbnRzLnNpemUoKSk7Ci0gICAgICAgICAgICBwYXJzZWRTdGF0ZW1lbnRzLmZvckVhY2gocyAtPiBzdGF0ZW1lbnRzLmFkZChzLnByZXBhcmUoYmluZFZhcmlhYmxlcykpKTsKKyAgICAgICAgICAgIHBhcnNlZFN0YXRlbWVudHMuZm9yRWFjaChzIC0+IHN0YXRlbWVudHMuYWRkKHMucHJlcGFyZShzdGF0ZSwgYmluZFZhcmlhYmxlcykpKTsKIAogICAgICAgICAgICAgQXR0cmlidXRlcyBwcmVwQXR0cnMgPSBhdHRycy5wcmVwYXJlKCJbYmF0Y2hdIiwgIltiYXRjaF0iKTsKICAgICAgICAgICAgIHByZXBBdHRycy5jb2xsZWN0TWFya2VyU3BlY2lmaWNhdGlvbihiaW5kVmFyaWFibGVzKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9EZWxldGVTdGF0ZW1lbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9EZWxldGVTdGF0ZW1lbnQuamF2YQppbmRleCBiZTAxNDgxLi5mZmY2ZGQzIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvRGVsZXRlU3RhdGVtZW50LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL0RlbGV0ZVN0YXRlbWVudC5qYXZhCkBAIC0zMSw2ICszMSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DbGllbnRTdGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlRvU3RyaW5nQnVpbGRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5Ub1N0cmluZ1N0eWxlOwpAQCAtMTQwLDcgKzE0MSw4IEBACiAKIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIE1vZGlmaWNhdGlvblN0YXRlbWVudCBwcmVwYXJlSW50ZXJuYWwoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwKKyAgICAgICAgcHJvdGVjdGVkIE1vZGlmaWNhdGlvblN0YXRlbWVudCBwcmVwYXJlSW50ZXJuYWwoQ2xpZW50U3RhdGUgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlU3BlY2lmaWNhdGlvbnMgYmluZFZhcmlhYmxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9ucyBjb25kaXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzKQpAQCAtMTYwLDcgKzE2Miw4IEBACiAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucy5hZGQob3ApOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBTdGF0ZW1lbnRSZXN0cmljdGlvbnMgcmVzdHJpY3Rpb25zID0gbmV3UmVzdHJpY3Rpb25zKG1ldGFkYXRhLAorICAgICAgICAgICAgU3RhdGVtZW50UmVzdHJpY3Rpb25zIHJlc3RyaWN0aW9ucyA9IG5ld1Jlc3RyaWN0aW9ucyhzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRWYXJpYWJsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlQ2xhdXNlLApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL0Rlc2NyaWJlU3RhdGVtZW50LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvRGVzY3JpYmVTdGF0ZW1lbnQuamF2YQppbmRleCBiMWY1NzZlLi45NmEwMjQ3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvRGVzY3JpYmVTdGF0ZW1lbnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvRGVzY3JpYmVTdGF0ZW1lbnQuamF2YQpAQCAtNjcsMTcgKzY3LDE3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENGID0gImRlc2NyaWJlIjsKIAogICAgIC8qKgotICAgICAqIFRoZSBjb2x1bW5zIHJldHVybmVkIGJ5IHRoZSBkZXNjcmliZSBxdWVyaWVzIHRoYXQgb25seSBsaXN0IGVsZW1lbnRzIG5hbWVzIChlLmcuIERFU0NSSUJFIEtFWVNQQUNFUywgREVTQ1JJQkUgVEFCTEVTLi4uKSAKKyAgICAgKiBUaGUgY29sdW1ucyByZXR1cm5lZCBieSB0aGUgZGVzY3JpYmUgcXVlcmllcyB0aGF0IG9ubHkgbGlzdCBlbGVtZW50cyBuYW1lcyAoZS5nLiBERVNDUklCRSBLRVlTUEFDRVMsIERFU0NSSUJFIFRBQkxFUy4uLikKICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PENvbHVtblNwZWNpZmljYXRpb24+IExJU1RfTUVUQURBVEEgPSAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PENvbHVtblNwZWNpZmljYXRpb24+IExJU1RfTUVUQURBVEEgPQogICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihuZXcgQ29sdW1uU3BlY2lmaWNhdGlvbihLUywgQ0YsIG5ldyBDb2x1bW5JZGVudGlmaWVyKCJrZXlzcGFjZV9uYW1lIiwgdHJ1ZSksIFVURjhUeXBlLmluc3RhbmNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbHVtblNwZWNpZmljYXRpb24oS1MsIENGLCBuZXcgQ29sdW1uSWRlbnRpZmllcigidHlwZSIsIHRydWUpLCBVVEY4VHlwZS5pbnN0YW5jZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb2x1bW5TcGVjaWZpY2F0aW9uKEtTLCBDRiwgbmV3IENvbHVtbklkZW50aWZpZXIoIm5hbWUiLCB0cnVlKSwgVVRGOFR5cGUuaW5zdGFuY2UpKTsKIAogICAgIC8qKgotICAgICAqIFRoZSBjb2x1bW5zIHJldHVybmVkIGJ5IHRoZSBkZXNjcmliZSBxdWVyaWVzIHRoYXQgcmV0dXJucyB0aGUgQ1JFQVRFIFNUQVRFTUVOVCBmb3IgdGhlIGRpZmZlcmVudCBlbGVtZW50cyAoZS5nLiBERVNDUklCRSBLRVlTUEFDRSwgREVTQ1JJQkUgVEFCTEUgLi4uKSAKKyAgICAgKiBUaGUgY29sdW1ucyByZXR1cm5lZCBieSB0aGUgZGVzY3JpYmUgcXVlcmllcyB0aGF0IHJldHVybnMgdGhlIENSRUFURSBTVEFURU1FTlQgZm9yIHRoZSBkaWZmZXJlbnQgZWxlbWVudHMgKGUuZy4gREVTQ1JJQkUgS0VZU1BBQ0UsIERFU0NSSUJFIFRBQkxFIC4uLikKICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PENvbHVtblNwZWNpZmljYXRpb24+IEVMRU1FTlRfTUVUQURBVEEgPSAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PENvbHVtblNwZWNpZmljYXRpb24+IEVMRU1FTlRfTUVUQURBVEEgPQogICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC48Q29sdW1uU3BlY2lmaWNhdGlvbj5idWlsZGVyKCkuYWRkQWxsKExJU1RfTUVUQURBVEEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IENvbHVtblNwZWNpZmljYXRpb24oS1MsIENGLCBuZXcgQ29sdW1uSWRlbnRpZmllcigiY3JlYXRlX3N0YXRlbWVudCIsIHRydWUpLCBVVEY4VHlwZS5pbnN0YW5jZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwpAQCAtMzA4LDcgKzMwOCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBEZXNjcmliZVN0YXRlbWVudDxTY2hlbWFFbGVtZW50PiBmdW5jdGlvbnMoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMaXN0aW5nKGtzIC0+IGtzLmZ1bmN0aW9ucy51ZGZzKCkpOworICAgICAgICByZXR1cm4gbmV3IExpc3Rpbmcoa3MgLT4ga3MudXNlckZ1bmN0aW9ucy51ZGZzKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzE2LDcgKzMxNiw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBEZXNjcmliZVN0YXRlbWVudDxTY2hlbWFFbGVtZW50PiBhZ2dyZWdhdGVzKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgTGlzdGluZyhrcyAtPiBrcy5mdW5jdGlvbnMudWRhcygpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBMaXN0aW5nKGtzIC0+IGtzLnVzZXJGdW5jdGlvbnMudWRhcygpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTM4Nyw3ICszODcsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRWxlbWVudCBleHRlbmRzIERlc2NyaWJlU3RhdGVtZW50PFNjaGVtYUVsZW1lbnQ+CiAgICAgewogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGtleXNwYWNlIG5hbWUgCisgICAgICAgICAqIFRoZSBrZXlzcGFjZSBuYW1lCiAgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBrZXlzcGFjZTsKIApAQCAtNDQ1LDggKzQ0NSw4IEBACiAgICAgICAgIGlmICghb25seUtleXNwYWNlKQogICAgICAgICB7CiAgICAgICAgICAgICBzID0gU3RyZWFtLmNvbmNhdChzLCBrcy50eXBlcy5zb3J0ZWRTdHJlYW0oKSk7Ci0gICAgICAgICAgICBzID0gU3RyZWFtLmNvbmNhdChzLCBrcy5mdW5jdGlvbnMudWRmcygpLnNvcnRlZChTY2hlbWFFbGVtZW50Lk5BTUVfQ09NUEFSQVRPUikpOwotICAgICAgICAgICAgcyA9IFN0cmVhbS5jb25jYXQocywga3MuZnVuY3Rpb25zLnVkYXMoKS5zb3J0ZWQoU2NoZW1hRWxlbWVudC5OQU1FX0NPTVBBUkFUT1IpKTsKKyAgICAgICAgICAgIHMgPSBTdHJlYW0uY29uY2F0KHMsIGtzLnVzZXJGdW5jdGlvbnMudWRmcygpLnNvcnRlZChTY2hlbWFFbGVtZW50Lk5BTUVfQ09NUEFSQVRPUikpOworICAgICAgICAgICAgcyA9IFN0cmVhbS5jb25jYXQocywga3MudXNlckZ1bmN0aW9ucy51ZGFzKCkuc29ydGVkKFNjaGVtYUVsZW1lbnQuTkFNRV9DT01QQVJBVE9SKSk7CiAgICAgICAgICAgICBzID0gU3RyZWFtLmNvbmNhdChzLCBrcy50YWJsZXMuc3RyZWFtKCkuc29ydGVkKFNjaGVtYUVsZW1lbnQuTkFNRV9DT01QQVJBVE9SKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZsYXRNYXAodG0gLT4gZ2V0VGFibGVFbGVtZW50cyhrcywgdG0pKSk7CiAgICAgICAgIH0KQEAgLTUzNCw3ICs1MzQsNyBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KGtleXNwYWNlLCBuYW1lLCAoa3MsIG4pIC0+IHsKIAotICAgICAgICAgICAgcmV0dXJuIGNoZWNrTm90RW1wdHkoa3MuZnVuY3Rpb25zLmdldFVkZnMobmV3IEZ1bmN0aW9uTmFtZShrcy5uYW1lLCBuKSksCisgICAgICAgICAgICByZXR1cm4gY2hlY2tOb3RFbXB0eShrcy51c2VyRnVuY3Rpb25zLmdldFVkZnMobmV3IEZ1bmN0aW9uTmFtZShrcy5uYW1lLCBuKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNlciBkZWZpbmVkIGZ1bmN0aW9uICclcycgbm90IGZvdW5kIGluICclcyciLCBuLCBrcy5uYW1lKS5zdHJlYW0oKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnRlZChTY2hlbWFFbGVtZW50Lk5BTUVfQ09NUEFSQVRPUik7CiAgICAgICAgIH0pOwpAQCAtNTQ3LDcgKzU0Nyw3IEBACiAgICAgewogICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQoa2V5c3BhY2UsIG5hbWUsIChrcywgbikgLT4gewogCi0gICAgICAgICAgICByZXR1cm4gY2hlY2tOb3RFbXB0eShrcy5mdW5jdGlvbnMuZ2V0VWRhcyhuZXcgRnVuY3Rpb25OYW1lKGtzLm5hbWUsIG4pKSwKKyAgICAgICAgICAgIHJldHVybiBjaGVja05vdEVtcHR5KGtzLnVzZXJGdW5jdGlvbnMuZ2V0VWRhcyhuZXcgRnVuY3Rpb25OYW1lKGtzLm5hbWUsIG4pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2VyIGRlZmluZWQgYWdncmVnYXRlICclcycgbm90IGZvdW5kIGluICclcyciLCBuLCBrcy5uYW1lKS5zdHJlYW0oKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zb3J0ZWQoU2NoZW1hRWxlbWVudC5OQU1FX0NPTVBBUkFUT1IpOwogICAgICAgICB9KTsKQEAgLTY4MSw3ICs2ODEsNyBAQAogICAgICAgICAgICAgICAgIGxpc3QuYWRkKHRyaW1JZlByZXNlbnQoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFBhcnRpdGlvbmVyTmFtZSgpLCAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LiIpKTsKICAgICAgICAgICAgICAgICBsaXN0LmFkZCh0cmltSWZQcmVzZW50KERhdGFiYXNlRGVzY3JpcHRvci5nZXRFbmRwb2ludFNuaXRjaCgpLmdldENsYXNzKCkuZ2V0TmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci4iKSk7Ci0gCisKICAgICAgICAgICAgICAgICBTdHJpbmcgdXNlS3MgPSBzdGF0ZS5nZXRSYXdLZXlzcGFjZSgpOwogICAgICAgICAgICAgICAgIGlmIChtdXN0UmV0dXJuc1JhbmdlT3duZXJzaGlwcyh1c2VLcykpCiAgICAgICAgICAgICAgICAgewpAQCAtNzIxLDcgKzcyMSw3IEBACiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHByb3RlY3RlZCBMaXN0PEJ5dGVCdWZmZXI+IHRvUm93KExpc3Q8T2JqZWN0PiBlbGVtZW50cywgYm9vbGVhbiB3aXRoSW50ZXJuYWxzKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3QuQnVpbGRlcjxCeXRlQnVmZmVyPiBidWlsZGVyID0gSW1tdXRhYmxlTGlzdC5idWlsZGVyKCk7IAorICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3QuQnVpbGRlcjxCeXRlQnVmZmVyPiBidWlsZGVyID0gSW1tdXRhYmxlTGlzdC5idWlsZGVyKCk7CiAKICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZChVVEY4VHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoKFN0cmluZykgZWxlbWVudHMuZ2V0KENMVVNURVJfTkFNRV9JTkRFWCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURjhUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgoU3RyaW5nKSBlbGVtZW50cy5nZXQoUEFSVElUSU9ORVJfTkFNRV9JTkRFWCkpLApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL01vZGlmaWNhdGlvblN0YXRlbWVudC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL01vZGlmaWNhdGlvblN0YXRlbWVudC5qYXZhCmluZGV4IGFiMzZlYzkuLjBjZjY3NzEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9Nb2RpZmljYXRpb25TdGF0ZW1lbnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvTW9kaWZpY2F0aW9uU3RhdGVtZW50LmphdmEKQEAgLTMzLDYgKzMzLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLlJlcGxpY2FMYXlvdXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVmlld01ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuKjsKQEAgLTUxLDYgKzUyLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvd0l0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpZXcuVmlldzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3M7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DbGllbnRTdGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlF1ZXJ5U3RhdGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlUHJveHk7CkBAIC0zMDAsNiArMzAyLDE2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZVRpbWVzdGFtcChRdWVyeVN0YXRlIHF1ZXJ5U3RhdGUsIFF1ZXJ5T3B0aW9ucyBvcHRpb25zKQorICAgIHsKKyAgICAgICAgaWYgKCFpc1RpbWVzdGFtcFNldCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGxvbmcgdHMgPSBhdHRycy5nZXRUaW1lc3RhbXAob3B0aW9ucy5nZXRUaW1lc3RhbXAocXVlcnlTdGF0ZSksIG9wdGlvbnMpOworICAgICAgICBHdWFyZHJhaWxzLm1heGltdW1BbGxvd2FibGVUaW1lc3RhbXAuZ3VhcmQodHMsIHRhYmxlKCksIGZhbHNlLCBxdWVyeVN0YXRlLmdldENsaWVudFN0YXRlKCkpOworICAgICAgICBHdWFyZHJhaWxzLm1pbmltdW1BbGxvd2FibGVUaW1lc3RhbXAuZ3VhcmQodHMsIHRhYmxlKCksIGZhbHNlLCBxdWVyeVN0YXRlLmdldENsaWVudFN0YXRlKCkpOworICAgIH0KKwogICAgIHB1YmxpYyBSZWd1bGFyQW5kU3RhdGljQ29sdW1ucyB1cGRhdGVkQ29sdW1ucygpCiAgICAgewogICAgICAgICByZXR1cm4gdXBkYXRlZENvbHVtbnM7CkBAIC01MDQsNiArNTE2LDcgQEAKICAgICAgICAgICAgIGNsLnZhbGlkYXRlRm9yV3JpdGUoKTsKIAogICAgICAgICB2YWxpZGF0ZURpc2tVc2FnZShvcHRpb25zLCBxdWVyeVN0YXRlLmdldENsaWVudFN0YXRlKCkpOworICAgICAgICB2YWxpZGF0ZVRpbWVzdGFtcChxdWVyeVN0YXRlLCBvcHRpb25zKTsKIAogICAgICAgICBMaXN0PD8gZXh0ZW5kcyBJTXV0YXRpb24+IG11dGF0aW9ucyA9CiAgICAgICAgICAgICBnZXRNdXRhdGlvbnMocXVlcnlTdGF0ZS5nZXRDbGllbnRTdGF0ZSgpLApAQCAtNTEzLDggKzUyNiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0Tm93SW5TZWNvbmRzKHF1ZXJ5U3RhdGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5U3RhcnROYW5vVGltZSk7CiAgICAgICAgIGlmICghbXV0YXRpb25zLmlzRW1wdHkoKSkKKyAgICAgICAgewogICAgICAgICAgICAgU3RvcmFnZVByb3h5Lm11dGF0ZVdpdGhUcmlnZ2VycyhtdXRhdGlvbnMsIGNsLCBmYWxzZSwgcXVlcnlTdGFydE5hbm9UaW1lKTsKIAorICAgICAgICAgICAgaWYgKCFTY2hlbWFDb25zdGFudHMuaXNTeXN0ZW1LZXlzcGFjZShtZXRhZGF0YS5rZXlzcGFjZSkpCisgICAgICAgICAgICAgICAgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnJlY29yZFJvd0FuZENvbHVtbkNvdW50TWV0cmljcyhtdXRhdGlvbnMpOworICAgICAgICB9CisKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCkBAIC02NTIsNyArNjcwLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIFNlbGVjdG9ycyBzZWxlY3RvcnMgPSBzZWxlY3Rpb24ubmV3U2VsZWN0b3JzKG9wdGlvbnMpOwotICAgICAgICBSZXN1bHRTZXRCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUmVzdWx0U2V0QnVpbGRlcihzZWxlY3Rpb24uZ2V0UmVzdWx0TWV0YWRhdGEoKSwgc2VsZWN0b3JzKTsKKyAgICAgICAgUmVzdWx0U2V0QnVpbGRlciBidWlsZGVyID0gbmV3IFJlc3VsdFNldEJ1aWxkZXIoc2VsZWN0aW9uLmdldFJlc3VsdE1ldGFkYXRhKCksIHNlbGVjdG9ycywgZmFsc2UpOwogICAgICAgICBTZWxlY3RTdGF0ZW1lbnQuZm9yU2VsZWN0aW9uKG1ldGFkYXRhLCBzZWxlY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9jZXNzUGFydGl0aW9uKHBhcnRpdGlvbiwgb3B0aW9ucywgYnVpbGRlciwgbm93SW5TZWNvbmRzKTsKIApAQCAtOTQwLDEwICs5NTgsMTAgQEAKIAogICAgICAgICBwdWJsaWMgTW9kaWZpY2F0aW9uU3RhdGVtZW50IHByZXBhcmUoQ2xpZW50U3RhdGUgc3RhdGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwcmVwYXJlKGJpbmRWYXJpYWJsZXMpOworICAgICAgICAgICAgcmV0dXJuIHByZXBhcmUoc3RhdGUsIGJpbmRWYXJpYWJsZXMpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIE1vZGlmaWNhdGlvblN0YXRlbWVudCBwcmVwYXJlKFZhcmlhYmxlU3BlY2lmaWNhdGlvbnMgYmluZFZhcmlhYmxlcykKKyAgICAgICAgcHVibGljIE1vZGlmaWNhdGlvblN0YXRlbWVudCBwcmVwYXJlKENsaWVudFN0YXRlIHN0YXRlLCBWYXJpYWJsZVNwZWNpZmljYXRpb25zIGJpbmRWYXJpYWJsZXMpCiAgICAgICAgIHsKICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEgPSBTY2hlbWEuaW5zdGFuY2UudmFsaWRhdGVUYWJsZShrZXlzcGFjZSgpLCBuYW1lKCkpOwogCkBAIC05NTIsNyArOTcwLDcgQEAKIAogICAgICAgICAgICAgQ29uZGl0aW9ucyBwcmVwYXJlZENvbmRpdGlvbnMgPSBwcmVwYXJlQ29uZGl0aW9ucyhtZXRhZGF0YSwgYmluZFZhcmlhYmxlcyk7CiAKLSAgICAgICAgICAgIHJldHVybiBwcmVwYXJlSW50ZXJuYWwobWV0YWRhdGEsIGJpbmRWYXJpYWJsZXMsIHByZXBhcmVkQ29uZGl0aW9ucywgcHJlcGFyZWRBdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgIHJldHVybiBwcmVwYXJlSW50ZXJuYWwoc3RhdGUsIG1ldGFkYXRhLCBiaW5kVmFyaWFibGVzLCBwcmVwYXJlZENvbmRpdGlvbnMsIHByZXBhcmVkQXR0cmlidXRlcyk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTEwMTEsNyArMTAyOSw4IEBACiAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwogICAgICAgICB9CiAKLSAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IE1vZGlmaWNhdGlvblN0YXRlbWVudCBwcmVwYXJlSW50ZXJuYWwoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwKKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IE1vZGlmaWNhdGlvblN0YXRlbWVudCBwcmVwYXJlSW50ZXJuYWwoQ2xpZW50U3RhdGUgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlU3BlY2lmaWNhdGlvbnMgYmluZFZhcmlhYmxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9ucyBjb25kaXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzKTsKQEAgLTEwMjYsNyArMTA0NSw4IEBACiAgICAgICAgICAqIEBwYXJhbSBjb25kaXRpb25zIHRoZSBjb25kaXRpb25zCiAgICAgICAgICAqIEByZXR1cm4gdGhlIHJlc3RyaWN0aW9ucwogICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIFN0YXRlbWVudFJlc3RyaWN0aW9ucyBuZXdSZXN0cmljdGlvbnMoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwKKyAgICAgICAgcHJvdGVjdGVkIFN0YXRlbWVudFJlc3RyaWN0aW9ucyBuZXdSZXN0cmljdGlvbnMoQ2xpZW50U3RhdGUgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlU3BlY2lmaWNhdGlvbnMgYm91bmROYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9ucyBvcGVyYXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGVyZUNsYXVzZSB3aGVyZSwKQEAgLTEwMzYsNyArMTA1Niw3IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKENVU1RPTV9FWFBSRVNTSU9OU19OT1RfQUxMT1dFRCk7CiAKICAgICAgICAgICAgIGJvb2xlYW4gYXBwbHlPbmx5VG9TdGF0aWNDb2x1bW5zID0gYXBwbGllc09ubHlUb1N0YXRpY0NvbHVtbnMob3BlcmF0aW9ucywgY29uZGl0aW9ucyk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0YXRlbWVudFJlc3RyaWN0aW9ucyh0eXBlLCBtZXRhZGF0YSwgd2hlcmUsIGJvdW5kTmFtZXMsIGFwcGx5T25seVRvU3RhdGljQ29sdW1ucywgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdGVtZW50UmVzdHJpY3Rpb25zKHN0YXRlLCB0eXBlLCBtZXRhZGF0YSwgd2hlcmUsIGJvdW5kTmFtZXMsIGFwcGx5T25seVRvU3RhdGljQ29sdW1ucywgZmFsc2UsIGZhbHNlKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBMaXN0PFBhaXI8Q29sdW1uSWRlbnRpZmllciwgQ29sdW1uQ29uZGl0aW9uLlJhdz4+IGdldENvbmRpdGlvbnMoKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL1Blcm1pc3Npb25zTWFuYWdlbWVudFN0YXRlbWVudC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL1Blcm1pc3Npb25zTWFuYWdlbWVudFN0YXRlbWVudC5qYXZhCmluZGV4IGFhN2U4NWIuLmU4MDlhMjcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9QZXJtaXNzaW9uc01hbmFnZW1lbnRTdGF0ZW1lbnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvUGVybWlzc2lvbnNNYW5hZ2VtZW50U3RhdGVtZW50LmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Sb2xlTmFtZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuUmVxdWVzdFZhbGlkYXRpb25FeGNlcHRpb247CkBAIC01NSwxMyArNTQsNiBAQAogICAgICAgICAvLyBjYWxsZWQgYm90aCBoZXJlIGFuZCBpbiBhdXRob3JpemUoKSwgYXMgaW4gc29tZSBjYXNlcyB3ZSBkbyBub3QgY2FsbCB0aGUgbGF0dGVyLgogICAgICAgICByZXNvdXJjZSA9IG1heWJlQ29ycmVjdFJlc291cmNlKHJlc291cmNlLCBzdGF0ZSk7CiAKLSAgICAgICAgLy8gYWx0ZXJpbmcgcGVybWlzc2lvbnMgb24gYnVpbHRpbiBmdW5jdGlvbnMgaXMgbm90IHN1cHBvcnRlZAotICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBGdW5jdGlvblJlc291cmNlCi0gICAgICAgICAgICAmJiBTY2hlbWFDb25zdGFudHMuU1lTVEVNX0tFWVNQQUNFX05BTUUuZXF1YWxzKCgoRnVuY3Rpb25SZXNvdXJjZSlyZXNvdXJjZSkuZ2V0S2V5c3BhY2UoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbigiQWx0ZXJpbmcgcGVybWlzc2lvbnMgb24gYnVpbHRpbiBmdW5jdGlvbnMgaXMgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICB9Ci0KICAgICAgICAgaWYgKCFyZXNvdXJjZS5leGlzdHMoKSkKICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJSZXNvdXJjZSAlcyBkb2Vzbid0IGV4aXN0IiwgcmVzb3VyY2UpKTsKICAgICB9CkBAIC03OCw3ICs3MCw3IEBACiAgICAgICAgIGZvciAoUGVybWlzc2lvbiBwIDogcGVybWlzc2lvbnMpCiAgICAgICAgICAgICBzdGF0ZS5lbnN1cmVQZXJtaXNzaW9uKHAsIHJlc291cmNlKTsKICAgICB9Ci0gICAgCisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKICAgICB7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvUHJvcGVydHlEZWZpbml0aW9ucy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL1Byb3BlcnR5RGVmaW5pdGlvbnMuamF2YQppbmRleCBiNjExMmZhLi42NWVjOGZjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvUHJvcGVydHlEZWZpbml0aW9ucy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9Qcm9wZXJ0eURlZmluaXRpb25zLmphdmEKQEAgLTE3LDcgKzE3LDkgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHM7CiAKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwpAQCAtMjUsNiArMjcsOCBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5TeW50YXhFeGNlcHRpb247CiAKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CisKIHB1YmxpYyBjbGFzcyBQcm9wZXJ0eURlZmluaXRpb25zCiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBQT1NJVElWRV9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCIoMXx0cnVlfHllcykiKTsKQEAgLTMyLDE4ICszNiwxOCBAQAogICAgIAogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFByb3BlcnR5RGVmaW5pdGlvbnMuY2xhc3MpOwogCi0gICAgcHJvdGVjdGVkIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgIHByb3RlY3RlZCBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CiAKICAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uCiAgICAgewogICAgICAgICBpZiAocHJvcGVydGllcy5wdXQobmFtZSwgdmFsdWUpICE9IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIk11bHRpcGxlIGRlZmluaXRpb24gZm9yIHByb3BlcnR5ICclcyciLCBuYW1lKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXhjZXB0aW9uKGZvcm1hdCgiTXVsdGlwbGUgZGVmaW5pdGlvbnMgZm9yIHByb3BlcnR5ICclcyciLCBuYW1lKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHkoU3RyaW5nIG5hbWUsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWUpIHRocm93cyBTeW50YXhFeGNlcHRpb24KICAgICB7CiAgICAgICAgIGlmIChwcm9wZXJ0aWVzLnB1dChuYW1lLCB2YWx1ZSkgIT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiTXVsdGlwbGUgZGVmaW5pdGlvbiBmb3IgcHJvcGVydHkgJyVzJyIsIG5hbWUpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFeGNlcHRpb24oZm9ybWF0KCJNdWx0aXBsZSBkZWZpbml0aW9ucyBmb3IgcHJvcGVydHkgJyVzJyIsIG5hbWUpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShTZXQ8U3RyaW5nPiBrZXl3b3JkcywgU2V0PFN0cmluZz4gb2Jzb2xldGUpIHRocm93cyBTeW50YXhFeGNlcHRpb24KQEAgLTU2LDcgKzYwLDcgQEAKICAgICAgICAgICAgIGlmIChvYnNvbGV0ZS5jb250YWlucyhuYW1lKSkKICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiSWdub3Jpbmcgb2Jzb2xldGUgcHJvcGVydHkge30iLCBuYW1lKTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlVua25vd24gcHJvcGVydHkgJyVzJyIsIG5hbWUpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXhjZXB0aW9uKGZvcm1hdCgiVW5rbm93biBwcm9wZXJ0eSAnJXMnIiwgbmFtZSkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC03MywxMyArNzcsMTggQEAKICAgICAgICAgcHJvcGVydGllcy5yZW1vdmUobmFtZSk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTaW1wbGUoU3RyaW5nIG5hbWUpIHRocm93cyBTeW50YXhFeGNlcHRpb24KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcm9wZXJ0eShTdHJpbmcgbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KG5hbWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBuYW1lKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uCiAgICAgewogICAgICAgICBPYmplY3QgdmFsID0gcHJvcGVydGllcy5nZXQobmFtZSk7CiAgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICBpZiAoISh2YWwgaW5zdGFuY2VvZiBTdHJpbmcpKQotICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJJbnZhbGlkIHZhbHVlIGZvciBwcm9wZXJ0eSAnJXMnLiBJdCBzaG91bGQgYmUgYSBzdHJpbmciLCBuYW1lKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXhjZXB0aW9uKGZvcm1hdCgiSW52YWxpZCB2YWx1ZSBmb3IgcHJvcGVydHkgJyVzJy4gSXQgc2hvdWxkIGJlIGEgc3RyaW5nIiwgbmFtZSkpOwogICAgICAgICByZXR1cm4gKFN0cmluZyl2YWw7CiAgICAgfQogCkBAIC04OSwxMyArOTgsMTQgQEAKICAgICAgICAgaWYgKHZhbCA9PSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIGlmICghKHZhbCBpbnN0YW5jZW9mIE1hcCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkludmFsaWQgdmFsdWUgZm9yIHByb3BlcnR5ICclcycuIEl0IHNob3VsZCBiZSBhIG1hcC4iLCBuYW1lKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXhjZXB0aW9uKGZvcm1hdCgiSW52YWxpZCB2YWx1ZSBmb3IgcHJvcGVydHkgJyVzJy4gSXQgc2hvdWxkIGJlIGEgbWFwLiIsIG5hbWUpKTsKICAgICAgICAgcmV0dXJuIChNYXA8U3RyaW5nLCBTdHJpbmc+KXZhbDsKICAgICB9CiAKLSAgICBwdWJsaWMgQm9vbGVhbiBoYXNQcm9wZXJ0eShTdHJpbmcgbmFtZSkKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBrZXksIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uCiAgICAgewotICAgICAgICByZXR1cm4gcHJvcGVydGllcy5jb250YWluc0tleShuYW1lKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0U3RyaW5nKGtleSk7CisgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsID8gcGFyc2VCb29sZWFuKGtleSwgdmFsdWUpIDogZGVmYXVsdFZhbHVlOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwYXJzZUJvb2xlYW4oU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uCkBAIC0xMTAsNjMgKzEyMCw1MSBAQAogICAgICAgICBlbHNlIGlmIChORUdBVElWRV9QQVRURVJOLm1hdGNoZXIobG93ZXJDYXNlZFZhbHVlKS5tYXRjaGVzKCkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgdGhyb3cgbmV3IFN5bnRheEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJJbnZhbGlkIGJvb2xlYW4gdmFsdWUgJXMgZm9yICclcycuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvc2l0aXZlIHZhbHVlcyBjYW4gYmUgJzEnLCAndHJ1ZScgb3IgJ3llcycuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZ2F0aXZlIHZhbHVlcyBjYW4gYmUgJzAnLCAnZmFsc2UnIG9yICdubycuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBrZXkpKTsKKyAgICAgICAgdGhyb3cgbmV3IFN5bnRheEV4Y2VwdGlvbihmb3JtYXQoIkludmFsaWQgYm9vbGVhbiB2YWx1ZSAlcyBmb3IgJyVzJy4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3NpdGl2ZSB2YWx1ZXMgY2FuIGJlICcxJywgJ3RydWUnIG9yICd5ZXMnLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZ2F0aXZlIHZhbHVlcyBjYW4gYmUgJzAnLCAnZmFsc2UnIG9yICdubycuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIGtleSkpOwogICAgIH0KIAotICAgIC8vIFJldHVybiBhIHByb3BlcnR5IHZhbHVlLCB0eXBlZCBhcyBhIEJvb2xlYW4KLSAgICBwdWJsaWMgQm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBrZXksIEJvb2xlYW4gZGVmYXVsdFZhbHVlKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uCisgICAgcHVibGljIGludCBnZXRJbnQoU3RyaW5nIGtleSwgaW50IGRlZmF1bHRWYWx1ZSkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0U2ltcGxlKGtleSk7Ci0gICAgICAgIHJldHVybiAodmFsdWUgPT0gbnVsbCkgPyBkZWZhdWx0VmFsdWUgOiBwYXJzZUJvb2xlYW4oa2V5LCB2YWx1ZSk7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldFN0cmluZyhrZXkpOworICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHBhcnNlSW50KGtleSwgdmFsdWUpIDogZGVmYXVsdFZhbHVlOwogICAgIH0KIAotICAgIC8vIFJldHVybiBhIHByb3BlcnR5IHZhbHVlLCB0eXBlZCBhcyBhIGRvdWJsZQorICAgIHB1YmxpYyBzdGF0aWMgaW50IHBhcnNlSW50KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKG51bGwgPT0gdmFsdWUpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ2YWx1ZSBhcmd1bWVudCBjYW4ndCBiZSBudWxsIik7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFeGNlcHRpb24oZm9ybWF0KCJJbnZhbGlkIGludGVnZXIgdmFsdWUgJXMgZm9yICclcyciLCB2YWx1ZSwga2V5KSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZShTdHJpbmcga2V5LCBkb3VibGUgZGVmYXVsdFZhbHVlKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uCiAgICAgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRTaW1wbGUoa2V5KTsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRG91YmxlLnBhcnNlRG91YmxlKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkludmFsaWQgZG91YmxlIHZhbHVlICVzIGZvciAnJXMnIiwgdmFsdWUsIGtleSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldFN0cmluZyhrZXkpOworICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHBhcnNlRG91YmxlKGtleSwgdmFsdWUpIDogZGVmYXVsdFZhbHVlOwogICAgIH0KIAotICAgIC8vIFJldHVybiBhIHByb3BlcnR5IHZhbHVlLCB0eXBlZCBhcyBhbiBJbnRlZ2VyCi0gICAgcHVibGljIEludGVnZXIgZ2V0SW50KFN0cmluZyBrZXksIEludGVnZXIgZGVmYXVsdFZhbHVlKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uCisgICAgcHVibGljIHN0YXRpYyBkb3VibGUgcGFyc2VEb3VibGUoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uCiAgICAgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRTaW1wbGUoa2V5KTsKLSAgICAgICAgcmV0dXJuIHRvSW50KGtleSwgdmFsdWUsIGRlZmF1bHRWYWx1ZSk7Ci0gICAgfQorICAgICAgICBpZiAobnVsbCA9PSB2YWx1ZSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInZhbHVlIGFyZ3VtZW50IGNhbid0IGJlIG51bGwiKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgSW50ZWdlciB0b0ludChTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUsIEludGVnZXIgZGVmYXVsdFZhbHVlKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICByZXR1cm4gRG91YmxlLnBhcnNlRG91YmxlKHZhbHVlKTsKICAgICAgICAgfQotICAgICAgICBlbHNlCisgICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZih2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJJbnZhbGlkIGludGVnZXIgdmFsdWUgJXMgZm9yICclcyciLCB2YWx1ZSwga2V5KSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXhjZXB0aW9uKGZvcm1hdCgiSW52YWxpZCBkb3VibGUgdmFsdWUgJXMgZm9yICclcyciLCB2YWx1ZSwga2V5KSk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvU2VsZWN0U3RhdGVtZW50LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvU2VsZWN0U3RhdGVtZW50LmphdmEKaW5kZXggOGE0ODkzNS4uNGM0M2NmOCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL1NlbGVjdFN0YXRlbWVudC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9TZWxlY3RTdGF0ZW1lbnQuamF2YQpAQCAtMjIsNiArMjIsOCBAQAogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIAoraW1wb3J0IGphdmF4LmFubm90YXRpb24uY29uY3VycmVudC5UaHJlYWRTYWZlOworCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Nb3JlT2JqZWN0czsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKQEAgLTUzLDE3ICs1NSwxNSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmFnZ3JlZ2F0aW9uLkFnZ3JlZ2F0aW9uU3BlY2lmaWNhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5hZ2dyZWdhdGlvbi5Hcm91cE1ha2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQ29sbGVjdGlvblR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Db21wb3NpdGVUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVXNlclR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5QYXJ0aXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNvbXBsZXhDb2x1bW5EYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlldy5WaWV3OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5BYnN0cmFjdEJvdW5kczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3M7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguSW5kZXhSZWdpc3RyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5NYXJzaGFsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2xpZW50U3RhdGU7CkBAIC04Miw2ICs4Miw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuVG9TdHJpbmdCdWlsZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlRvU3RyaW5nU3R5bGU7CiAKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc3RhdGVtZW50cy5SZXF1ZXN0VmFsaWRhdGlvbnMuY2hlY2tGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLlJlcXVlc3RWYWxpZGF0aW9ucy5jaGVja05vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc3RhdGVtZW50cy5SZXF1ZXN0VmFsaWRhdGlvbnMuY2hlY2tOdWxsOwpAQCAtOTgsNyArOTksMTAgQEAKICAqIG1hbnkgb2YgdGhlc2UgYXJlIG1hZGUgYWNjZXNzaWJsZSBmb3IgdGhlIGJlbmVmaXQgb2YgY3VzdG9tCiAgKiBRdWVyeUhhbmRsZXIgaW1wbGVtZW50YXRpb25zLCBzbyBiZWZvcmUgcmVkdWNpbmcgdGhlaXIgYWNjZXNzaWJpbGl0eQogICogZHVlIGNvbnNpZGVyYXRpb24gc2hvdWxkIGJlIGdpdmVuLgorICoKKyAqIE5vdGUgdGhhdCBzZWxlY3Qgc3RhdGVtZW50cyBjYW4gYmUgYWNjZXNzZWQgYnkgbXVsdGlwbGUgdGhyZWFkcywgc28gd2UgY2Fubm90IHJlbHkgb24gbXV0YWJsZSBhdHRyaWJ1dGVzLgogICovCitAVGhyZWFkU2FmZQogcHVibGljIGNsYXNzIFNlbGVjdFN0YXRlbWVudCBpbXBsZW1lbnRzIENRTFN0YXRlbWVudC5TaW5nbGVLZXlzcGFjZUNxbFN0YXRlbWVudAogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTZWxlY3RTdGF0ZW1lbnQuY2xhc3MpOwpAQCAtMjM4LDYgKzI0MiwyMSBAQAogCiAgICAgICAgIGZvciAoRnVuY3Rpb24gZnVuY3Rpb24gOiBnZXRGdW5jdGlvbnMoKSkKICAgICAgICAgICAgIHN0YXRlLmVuc3VyZVBlcm1pc3Npb24oUGVybWlzc2lvbi5FWEVDVVRFLCBmdW5jdGlvbik7CisKKyAgICAgICAgaWYgKCFzdGF0ZS5oYXNUYWJsZVBlcm1pc3Npb24odGFibGUsIFBlcm1pc3Npb24uVU5NQVNLKSAmJgorICAgICAgICAgICAgIXN0YXRlLmhhc1RhYmxlUGVybWlzc2lvbih0YWJsZSwgUGVybWlzc2lvbi5TRUxFQ1RfTUFTS0VEKSkKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxDb2x1bW5NZXRhZGF0YT4gcXVlcmllZE1hc2tlZENvbHVtbnMgPSB0YWJsZS5jb2x1bW5zKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKENvbHVtbk1ldGFkYXRhOjppc01hc2tlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHJlc3RyaWN0aW9uczo6aXNSZXN0cmljdGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisgICAgICAgICAgICBpZiAoIXF1ZXJpZWRNYXNrZWRDb2x1bW5zLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5hdXRob3JpemVkRXhjZXB0aW9uKGZvcm1hdCgiVXNlciAlcyBoYXMgbm8gVU5NQVNLIG5vciBTRUxFQ1RfTUFTS0VEIHBlcm1pc3Npb24gb24gdGFibGUgJXMuJXMsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgcXVlcnkgbWFza2VkIGNvbHVtbnMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmdldFVzZXIoKS5nZXROYW1lKCksIGtleXNwYWNlKCksIHRhYmxlKCksIHF1ZXJpZWRNYXNrZWRDb2x1bW5zKSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShDbGllbnRTdGF0ZSBzdGF0ZSkgdGhyb3dzIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uCkBAIC0yNTgsNiArMjc3LDcgQEAKICAgICAgICAgaW50IHVzZXJMaW1pdCA9IGdldExpbWl0KG9wdGlvbnMpOwogICAgICAgICBpbnQgdXNlclBlclBhcnRpdGlvbkxpbWl0ID0gZ2V0UGVyUGFydGl0aW9uTGltaXQob3B0aW9ucyk7CiAgICAgICAgIGludCBwYWdlU2l6ZSA9IG9wdGlvbnMuZ2V0UGFnZVNpemUoKTsKKyAgICAgICAgYm9vbGVhbiB1bm1hc2sgPSAhdGFibGUuaGFzTWFza2VkQ29sdW1ucygpIHx8IHN0YXRlLmdldENsaWVudFN0YXRlKCkuaGFzVGFibGVQZXJtaXNzaW9uKHRhYmxlLCBQZXJtaXNzaW9uLlVOTUFTSyk7CiAKICAgICAgICAgU2VsZWN0b3JzIHNlbGVjdG9ycyA9IHNlbGVjdGlvbi5uZXdTZWxlY3RvcnMob3B0aW9ucyk7CiAgICAgICAgIEFnZ3JlZ2F0aW9uU3BlY2lmaWNhdGlvbiBhZ2dyZWdhdGlvblNwZWMgPSBnZXRBZ2dyZWdhdGlvblNwZWMob3B0aW9ucyk7CkBAIC0yNjYsMjEgKzI4NiwzMSBAQAogCiAgICAgICAgIGlmIChvcHRpb25zLmlzUmVhZFRocmVzaG9sZHNFbmFibGVkKCkpCiAgICAgICAgICAgICBxdWVyeS50cmFja1dhcm5pbmdzKCk7CisgICAgICAgIFJlc3VsdE1lc3NhZ2UuUm93cyByb3dzOwogCiAgICAgICAgIGlmIChhZ2dyZWdhdGlvblNwZWMgPT0gbnVsbCAmJiAocGFnZVNpemUgPD0gMCB8fCAocXVlcnkubGltaXRzKCkuY291bnQoKSA8PSBwYWdlU2l6ZSkpKQotICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGUocXVlcnksIG9wdGlvbnMsIHN0YXRlLmdldENsaWVudFN0YXRlKCksIHNlbGVjdG9ycywgbm93SW5TZWMsIHVzZXJMaW1pdCwgbnVsbCwgcXVlcnlTdGFydE5hbm9UaW1lKTsKKyAgICAgICAgeworICAgICAgICAgICAgcm93cyA9IGV4ZWN1dGUocXVlcnksIG9wdGlvbnMsIHN0YXRlLmdldENsaWVudFN0YXRlKCksIHNlbGVjdG9ycywgbm93SW5TZWMsIHVzZXJMaW1pdCwgbnVsbCwgcXVlcnlTdGFydE5hbm9UaW1lLCB1bm1hc2spOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgUXVlcnlQYWdlciBwYWdlciA9IGdldFBhZ2VyKHF1ZXJ5LCBvcHRpb25zKTsKIAotICAgICAgICBRdWVyeVBhZ2VyIHBhZ2VyID0gZ2V0UGFnZXIocXVlcnksIG9wdGlvbnMpOworICAgICAgICAgICAgcm93cyA9IGV4ZWN1dGUoc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWdlci5mb3JEaXN0cmlidXRlZFF1ZXJ5KHBhZ2VyLCBjbCwgc3RhdGUuZ2V0Q2xpZW50U3RhdGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBub3dJblNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJMaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0aW9uU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5U3RhcnROYW5vVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubWFzayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFTY2hlbWFDb25zdGFudHMuaXNTeXN0ZW1LZXlzcGFjZSh0YWJsZS5rZXlzcGFjZSkpCisgICAgICAgICAgICBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MucmVjb3JkUmVhZFJlc3BvbnNlTWV0cmljcyhyb3dzLCByZXN0cmljdGlvbnMsIHNlbGVjdGlvbik7CiAKLSAgICAgICAgcmV0dXJuIGV4ZWN1dGUoc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgIFBhZ2VyLmZvckRpc3RyaWJ1dGVkUXVlcnkocGFnZXIsIGNsLCBzdGF0ZS5nZXRDbGllbnRTdGF0ZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICBwYWdlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgbm93SW5TZWMsCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZXJMaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRpb25TcGVjLAotICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVN0YXJ0TmFub1RpbWUpOworICAgICAgICByZXR1cm4gcm93czsKICAgICB9CiAKIApAQCAtMzI4LDExICszNTgsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3dJblNlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VyTGltaXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2dyZWdhdGlvblNwZWNpZmljYXRpb24gYWdncmVnYXRpb25TcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBxdWVyeVN0YXJ0TmFub1RpbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHF1ZXJ5U3RhcnROYW5vVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdW5tYXNrKQogICAgIHsKICAgICAgICAgdHJ5IChQYXJ0aXRpb25JdGVyYXRvciBkYXRhID0gcXVlcnkuZXhlY3V0ZShvcHRpb25zLmdldENvbnNpc3RlbmN5KCksIHN0YXRlLCBxdWVyeVN0YXJ0TmFub1RpbWUpKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc1Jlc3VsdHMoZGF0YSwgb3B0aW9ucywgc2VsZWN0b3JzLCBub3dJblNlYywgdXNlckxpbWl0LCBhZ2dyZWdhdGlvblNwZWMpOworICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXN1bHRzKGRhdGEsIG9wdGlvbnMsIHNlbGVjdG9ycywgbm93SW5TZWMsIHVzZXJMaW1pdCwgYWdncmVnYXRpb25TcGVjLCB1bm1hc2spOwogICAgICAgICB9CiAgICAgfQogCkBAIC00MTcsNyArNDQ4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3dJblNlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VyTGltaXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2dyZWdhdGlvblNwZWNpZmljYXRpb24gYWdncmVnYXRpb25TcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBxdWVyeVN0YXJ0TmFub1RpbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHF1ZXJ5U3RhcnROYW5vVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdW5tYXNrKQogICAgIHsKICAgICAgICAgR3VhcmRyYWlscy5wYWdlU2l6ZS5ndWFyZChwYWdlU2l6ZSwgdGFibGUoKSwgZmFsc2UsIHN0YXRlLmdldENsaWVudFN0YXRlKCkpOwogCkBAIC00NDYsNyArNDc4LDcgQEAKICAgICAgICAgUmVzdWx0TWVzc2FnZS5Sb3dzIG1zZzsKICAgICAgICAgdHJ5IChQYXJ0aXRpb25JdGVyYXRvciBwYWdlID0gcGFnZXIuZmV0Y2hQYWdlKHBhZ2VTaXplLCBxdWVyeVN0YXJ0TmFub1RpbWUpKQogICAgICAgICB7Ci0gICAgICAgICAgICBtc2cgPSBwcm9jZXNzUmVzdWx0cyhwYWdlLCBvcHRpb25zLCBzZWxlY3RvcnMsIG5vd0luU2VjLCB1c2VyTGltaXQsIGFnZ3JlZ2F0aW9uU3BlYyk7CisgICAgICAgICAgICBtc2cgPSBwcm9jZXNzUmVzdWx0cyhwYWdlLCBvcHRpb25zLCBzZWxlY3RvcnMsIG5vd0luU2VjLCB1c2VyTGltaXQsIGFnZ3JlZ2F0aW9uU3BlYywgdW5tYXNrKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIGlzRXhoYXVzdGVkIHN0YXRlIG9mIHRoZSBwYWdlciBvbmx5IGdldHMgdXBkYXRlZCB3aGVuIHdlJ3ZlIGNsb3NlZCB0aGUgcGFnZSwgc28gdGhpcwpAQCAtNDY4LDkgKzUwMCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9ycyBzZWxlY3RvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vd0luU2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VyTGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdncmVnYXRpb25TcGVjaWZpY2F0aW9uIGFnZ3JlZ2F0aW9uU3BlYykgdGhyb3dzIFJlcXVlc3RWYWxpZGF0aW9uRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdncmVnYXRpb25TcGVjaWZpY2F0aW9uIGFnZ3JlZ2F0aW9uU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVubWFzaykgdGhyb3dzIFJlcXVlc3RWYWxpZGF0aW9uRXhjZXB0aW9uCiAgICAgewotICAgICAgICBSZXN1bHRTZXQgcnNldCA9IHByb2Nlc3MocGFydGl0aW9ucywgb3B0aW9ucywgc2VsZWN0b3JzLCBub3dJblNlYywgdXNlckxpbWl0LCBhZ2dyZWdhdGlvblNwZWMpOworICAgICAgICBSZXN1bHRTZXQgcnNldCA9IHByb2Nlc3MocGFydGl0aW9ucywgb3B0aW9ucywgc2VsZWN0b3JzLCBub3dJblNlYywgdXNlckxpbWl0LCBhZ2dyZWdhdGlvblNwZWMsIHVubWFzayk7CiAgICAgICAgIHJldHVybiBuZXcgUmVzdWx0TWVzc2FnZS5Sb3dzKHJzZXQpOwogICAgIH0KIApAQCAtNDg3LDYgKzUyMCw3IEBACiAgICAgICAgIGludCB1c2VyTGltaXQgPSBnZXRMaW1pdChvcHRpb25zKTsKICAgICAgICAgaW50IHVzZXJQZXJQYXJ0aXRpb25MaW1pdCA9IGdldFBlclBhcnRpdGlvbkxpbWl0KG9wdGlvbnMpOwogICAgICAgICBpbnQgcGFnZVNpemUgPSBvcHRpb25zLmdldFBhZ2VTaXplKCk7CisgICAgICAgIGJvb2xlYW4gdW5tYXNrID0gc3RhdGUuZ2V0Q2xpZW50U3RhdGUoKS5oYXNUYWJsZVBlcm1pc3Npb24odGFibGUsIFBlcm1pc3Npb24uVU5NQVNLKTsKIAogICAgICAgICBTZWxlY3RvcnMgc2VsZWN0b3JzID0gc2VsZWN0aW9uLm5ld1NlbGVjdG9ycyhvcHRpb25zKTsKICAgICAgICAgQWdncmVnYXRpb25TcGVjaWZpY2F0aW9uIGFnZ3JlZ2F0aW9uU3BlYyA9IGdldEFnZ3JlZ2F0aW9uU3BlYyhvcHRpb25zKTsKQEAgLTUwNSw3ICs1MzksNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRyeSAoUGFydGl0aW9uSXRlcmF0b3IgZGF0YSA9IHF1ZXJ5LmV4ZWN1dGVJbnRlcm5hbChleGVjdXRpb25Db250cm9sbGVyKSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzUmVzdWx0cyhkYXRhLCBvcHRpb25zLCBzZWxlY3RvcnMsIG5vd0luU2VjLCB1c2VyTGltaXQsIG51bGwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc1Jlc3VsdHMoZGF0YSwgb3B0aW9ucywgc2VsZWN0b3JzLCBub3dJblNlYywgdXNlckxpbWl0LCBudWxsLCB1bm1hc2spOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtNTE5LDcgKzU1Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3dJblNlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJMaW1pdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0aW9uU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5U3RhcnROYW5vVGltZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVN0YXJ0TmFub1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bm1hc2spOwogICAgICAgICB9CiAgICAgfQogCkBAIC01NzcsMTEgKzYxMiwxMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIFJlc3VsdFNldCBwcm9jZXNzKFBhcnRpdGlvbkl0ZXJhdG9yIHBhcnRpdGlvbnMsIGludCBub3dJblNlYykgdGhyb3dzIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uCisgICAgcHVibGljIFJlc3VsdFNldCBwcm9jZXNzKFBhcnRpdGlvbkl0ZXJhdG9yIHBhcnRpdGlvbnMsIGludCBub3dJblNlYywgYm9vbGVhbiB1bm1hc2spIHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgUXVlcnlPcHRpb25zIG9wdGlvbnMgPSBRdWVyeU9wdGlvbnMuREVGQVVMVDsKICAgICAgICAgU2VsZWN0b3JzIHNlbGVjdG9ycyA9IHNlbGVjdGlvbi5uZXdTZWxlY3RvcnMob3B0aW9ucyk7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzKHBhcnRpdGlvbnMsIG9wdGlvbnMsIHNlbGVjdG9ycywgbm93SW5TZWMsIGdldExpbWl0KG9wdGlvbnMpLCBnZXRBZ2dyZWdhdGlvblNwZWMob3B0aW9ucykpOworICAgICAgICByZXR1cm4gcHJvY2VzcyhwYXJ0aXRpb25zLCBvcHRpb25zLCBzZWxlY3RvcnMsIG5vd0luU2VjLCBnZXRMaW1pdChvcHRpb25zKSwgZ2V0QWdncmVnYXRpb25TcGVjKG9wdGlvbnMpLCB1bm1hc2spOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtODg3LDEwICs5MjIsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9ycyBzZWxlY3RvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm93SW5TZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXNlckxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdncmVnYXRpb25TcGVjaWZpY2F0aW9uIGFnZ3JlZ2F0aW9uU3BlYykgdGhyb3dzIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2dyZWdhdGlvblNwZWNpZmljYXRpb24gYWdncmVnYXRpb25TcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1bm1hc2spIHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgR3JvdXBNYWtlciBncm91cE1ha2VyID0gYWdncmVnYXRpb25TcGVjID09IG51bGwgPyBudWxsIDogYWdncmVnYXRpb25TcGVjLm5ld0dyb3VwTWFrZXIoKTsKLSAgICAgICAgUmVzdWx0U2V0QnVpbGRlciByZXN1bHQgPSBuZXcgUmVzdWx0U2V0QnVpbGRlcihnZXRSZXN1bHRNZXRhZGF0YSgpLCBzZWxlY3RvcnMsIGdyb3VwTWFrZXIpOworICAgICAgICBSZXN1bHRTZXRCdWlsZGVyIHJlc3VsdCA9IG5ldyBSZXN1bHRTZXRCdWlsZGVyKGdldFJlc3VsdE1ldGFkYXRhKCksIHNlbGVjdG9ycywgdW5tYXNrLCBncm91cE1ha2VyKTsKIAogICAgICAgICB3aGlsZSAocGFydGl0aW9ucy5oYXNOZXh0KCkpCiAgICAgICAgIHsKQEAgLTk4Nyw3ICsxMDIzLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgaWYgKCFzdGF0aWNSb3cuaXNFbXB0eSgpICYmIHJlc3RyaWN0aW9ucy5yZXR1cm5TdGF0aWNDb250ZW50T25QYXJ0aXRpb25XaXRoTm9Sb3dzKCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0Lm5ld1JvdyhwYXJ0aXRpb24ucGFydGl0aW9uS2V5KCksIHN0YXRpY1Jvdy5jbHVzdGVyaW5nKCkpOworICAgICAgICAgICAgICAgIHJlc3VsdC5uZXdSb3cocHJvdG9jb2xWZXJzaW9uLCBwYXJ0aXRpb24ucGFydGl0aW9uS2V5KCksIHN0YXRpY1Jvdy5jbHVzdGVyaW5nKCksIHNlbGVjdGlvbi5nZXRDb2x1bW5zKCkpOwogICAgICAgICAgICAgICAgIG1heWJlRmFpbChyZXN1bHQsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgIGZvciAoQ29sdW1uTWV0YWRhdGEgZGVmIDogc2VsZWN0aW9uLmdldENvbHVtbnMoKSkKICAgICAgICAgICAgICAgICB7CkBAIC05OTcsNyArMTAzMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChrZXlDb21wb25lbnRzW2RlZi5wb3NpdGlvbigpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNUQVRJQzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRWYWx1ZShyZXN1bHQsIGRlZiwgc3RhdGljUm93LCBub3dJblNlYywgcHJvdG9jb2xWZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKHBhcnRpdGlvbi5zdGF0aWNSb3coKS5nZXRDb2x1bW5EYXRhKGRlZiksIG5vd0luU2VjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZCgoQnl0ZUJ1ZmZlciludWxsKTsKQEAgLTEwMTAsNyArMTA0Niw3IEBACiAgICAgICAgIHdoaWxlIChwYXJ0aXRpb24uaGFzTmV4dCgpKQogICAgICAgICB7CiAgICAgICAgICAgICBSb3cgcm93ID0gcGFydGl0aW9uLm5leHQoKTsKLSAgICAgICAgICAgIHJlc3VsdC5uZXdSb3coIHBhcnRpdGlvbi5wYXJ0aXRpb25LZXkoKSwgcm93LmNsdXN0ZXJpbmcoKSk7CisgICAgICAgICAgICByZXN1bHQubmV3Um93KHByb3RvY29sVmVyc2lvbiwgcGFydGl0aW9uLnBhcnRpdGlvbktleSgpLCByb3cuY2x1c3RlcmluZygpLCBzZWxlY3Rpb24uZ2V0Q29sdW1ucygpKTsKIAogICAgICAgICAgICAgLy8gcmVhZHMgYXJlbid0IGZhaWxlZCBhcyBzb29uIHRoZSBzaXplIGV4Y2VlZHMgdGhlIGZhaWx1cmUgdGhyZXNob2xkLCB0aGV5J3JlIGZhaWxlZCBvbmNlIHRoZSBmYWlsdXJlCiAgICAgICAgICAgICAvLyB0aHJlc2hvbGQgaGFzIGJlZW4gZXhjZWVkZWQgYW5kIHdlIHN0YXJ0IGFkZGluZyBtb3JlIGRhdGEuIFdlJ3JlIHNsaWdodGx5IG1vcmUgcGVybWlzc2l2ZSB0byBhdm9pZApAQCAtMTAzMCwzNSArMTA2NiwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChyb3cuY2x1c3RlcmluZygpLmJ1ZmZlckF0KGRlZi5wb3NpdGlvbigpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBSRUdVTEFSOgotICAgICAgICAgICAgICAgICAgICAgICAgYWRkVmFsdWUocmVzdWx0LCBkZWYsIHJvdywgbm93SW5TZWMsIHByb3RvY29sVmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKHJvdy5nZXRDb2x1bW5EYXRhKGRlZiksIG5vd0luU2VjKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIFNUQVRJQzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFZhbHVlKHJlc3VsdCwgZGVmLCBzdGF0aWNSb3csIG5vd0luU2VjLCBwcm90b2NvbFZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChzdGF0aWNSb3cuZ2V0Q29sdW1uRGF0YShkZWYpLCBub3dJblNlYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFZhbHVlKFJlc3VsdFNldEJ1aWxkZXIgcmVzdWx0LCBDb2x1bW5NZXRhZGF0YSBkZWYsIFJvdyByb3csIGludCBub3dJblNlYywgUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbikKLSAgICB7Ci0gICAgICAgIGlmIChkZWYuaXNDb21wbGV4KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBkZWYudHlwZS5pc011bHRpQ2VsbCgpOwotICAgICAgICAgICAgQ29tcGxleENvbHVtbkRhdGEgY29tcGxleERhdGEgPSByb3cuZ2V0Q29tcGxleENvbHVtbkRhdGEoZGVmKTsKLSAgICAgICAgICAgIGlmIChjb21wbGV4RGF0YSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobnVsbCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChkZWYudHlwZS5pc0NvbGxlY3Rpb24oKSkKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCgoQ29sbGVjdGlvblR5cGUpIGRlZi50eXBlKS5zZXJpYWxpemVGb3JOYXRpdmVQcm90b2NvbChjb21wbGV4RGF0YS5pdGVyYXRvcigpLCBwcm90b2NvbFZlcnNpb24pKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCgoVXNlclR5cGUpIGRlZi50eXBlKS5zZXJpYWxpemVGb3JOYXRpdmVQcm90b2NvbChjb21wbGV4RGF0YS5pdGVyYXRvcigpLCBwcm90b2NvbFZlcnNpb24pKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hZGQocm93LmdldENlbGwoZGVmKSwgbm93SW5TZWMpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBib29sZWFuIG5lZWRzUG9zdFF1ZXJ5T3JkZXJpbmcoKQogICAgIHsKICAgICAgICAgLy8gV2UgbmVlZCBwb3N0LXF1ZXJ5IG9yZGVyaW5nIG9ubHkgZm9yIHF1ZXJpZXMgd2l0aCBJTiBvbiB0aGUgcGFydGl0aW9uIGtleSBhbmQgYW4gT1JERVIgQlkuCkBAIC0xMTA0LDE3ICsxMTIxLDE3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIENhY2hlIGxvY2FsbHkgZm9yIHVzZSBieSBHdWFyZHJhaWxzCiAgICAgICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICByZXR1cm4gcHJlcGFyZShmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gcHJlcGFyZShzdGF0ZSwgZmFsc2UpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIFNlbGVjdFN0YXRlbWVudCBwcmVwYXJlKGJvb2xlYW4gZm9yVmlldykgdGhyb3dzIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uCisgICAgICAgIHB1YmxpYyBTZWxlY3RTdGF0ZW1lbnQgcHJlcGFyZShDbGllbnRTdGF0ZSBzdGF0ZSwgYm9vbGVhbiBmb3JWaWV3KSB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgVGFibGVNZXRhZGF0YSB0YWJsZSA9IFNjaGVtYS5pbnN0YW5jZS52YWxpZGF0ZVRhYmxlKGtleXNwYWNlKCksIG5hbWUoKSk7CiAKICAgICAgICAgICAgIExpc3Q8U2VsZWN0YWJsZT4gc2VsZWN0YWJsZXMgPSBSYXdTZWxlY3Rvci50b1NlbGVjdGFibGVzKHNlbGVjdENsYXVzZSwgdGFibGUpOwogICAgICAgICAgICAgYm9vbGVhbiBjb250YWluc09ubHlTdGF0aWNDb2x1bW5zID0gc2VsZWN0T25seVN0YXRpY0NvbHVtbnModGFibGUsIHNlbGVjdGFibGVzKTsKIAotICAgICAgICAgICAgU3RhdGVtZW50UmVzdHJpY3Rpb25zIHJlc3RyaWN0aW9ucyA9IHByZXBhcmVSZXN0cmljdGlvbnModGFibGUsIGJpbmRWYXJpYWJsZXMsIGNvbnRhaW5zT25seVN0YXRpY0NvbHVtbnMsIGZvclZpZXcpOworICAgICAgICAgICAgU3RhdGVtZW50UmVzdHJpY3Rpb25zIHJlc3RyaWN0aW9ucyA9IHByZXBhcmVSZXN0cmljdGlvbnMoc3RhdGUsIHRhYmxlLCBiaW5kVmFyaWFibGVzLCBjb250YWluc09ubHlTdGF0aWNDb2x1bW5zLCBmb3JWaWV3KTsKIAogICAgICAgICAgICAgLy8gSWYgd2Ugb3JkZXIgcG9zdC1xdWVyeSwgdGhlIHNvcnRlZCBjb2x1bW4gbmVlZHMgdG8gYmUgaW4gdGhlIFJlc3VsdFNldCBmb3Igc29ydGluZywKICAgICAgICAgICAgIC8vIGV2ZW4gaWYgd2UgZG9uJ3QgdWx0aW1hdGVseSBzaGlwIHRoZW0gdG8gdGhlIGNsaWVudCAoQ0FTU0FORFJBLTQ5MTEpLgpAQCAtMTE4MiwxMCArMTE5OSwxNCBAQAogICAgICAgICAgICAgaWYgKGhhc0dyb3VwQnkpCiAgICAgICAgICAgICAgICAgR3VhcmRyYWlscy5ncm91cEJ5RW5hYmxlZC5lbnN1cmVFbmFibGVkKHN0YXRlKTsKIAorICAgICAgICAgICAgYm9vbGVhbiBpc0pzb24gPSBwYXJhbWV0ZXJzLmlzSnNvbjsKKyAgICAgICAgICAgIGJvb2xlYW4gcmV0dXJuU3RhdGljQ29udGVudE9uUGFydGl0aW9uV2l0aE5vUm93cyA9IHJlc3RyaWN0aW9ucy5yZXR1cm5TdGF0aWNDb250ZW50T25QYXJ0aXRpb25XaXRoTm9Sb3dzKCk7CisKICAgICAgICAgICAgIGlmIChzZWxlY3RhYmxlcy5pc0VtcHR5KCkpIC8vIHdpbGRjYXJkIHF1ZXJ5CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGhhc0dyb3VwQnkgPyBTZWxlY3Rpb24ud2lsZGNhcmRXaXRoR3JvdXBCeSh0YWJsZSwgYm91bmROYW1lcywgcGFyYW1ldGVycy5pc0pzb24sIHJlc3RyaWN0aW9ucy5yZXR1cm5TdGF0aWNDb250ZW50T25QYXJ0aXRpb25XaXRoTm9Sb3dzKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTZWxlY3Rpb24ud2lsZGNhcmQodGFibGUsIHBhcmFtZXRlcnMuaXNKc29uLCByZXN0cmljdGlvbnMucmV0dXJuU3RhdGljQ29udGVudE9uUGFydGl0aW9uV2l0aE5vUm93cygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFzR3JvdXBCeSB8fCB0YWJsZS5oYXNNYXNrZWRDb2x1bW5zKCkKKyAgICAgICAgICAgICAgICAgICAgICAgPyBTZWxlY3Rpb24ud2lsZGNhcmRXaXRoR3JvdXBCeU9yTWFza2VkQ29sdW1ucyh0YWJsZSwgYm91bmROYW1lcywgcmVzdWx0U2V0T3JkZXJpbmdDb2x1bW5zLCBpc0pzb24sIHJldHVyblN0YXRpY0NvbnRlbnRPblBhcnRpdGlvbldpdGhOb1Jvd3MpCisgICAgICAgICAgICAgICAgICAgICAgIDogU2VsZWN0aW9uLndpbGRjYXJkKHRhYmxlLCBpc0pzb24sIHJldHVyblN0YXRpY0NvbnRlbnRPblBhcnRpdGlvbldpdGhOb1Jvd3MpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gU2VsZWN0aW9uLmZyb21TZWxlY3RvcnModGFibGUsCkBAIC0xMTk0LDggKzEyMTUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFNldE9yZGVyaW5nQ29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvbnMubm9uUEtSZXN0cmljdGVkQ29sdW1ucyhmYWxzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzR3JvdXBCeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmlzSnNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvbnMucmV0dXJuU3RhdGljQ29udGVudE9uUGFydGl0aW9uV2l0aE5vUm93cygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0pzb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuU3RhdGljQ29udGVudE9uUGFydGl0aW9uV2l0aE5vUm93cyk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTEyNDQsMTIgKzEyNjUsMTQgQEAKICAgICAgICAgICogQHJldHVybiB0aGUgcmVzdHJpY3Rpb25zCiAgICAgICAgICAqIEB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaWYgYSBwcm9ibGVtIG9jY3VycyB3aGlsZSBidWlsZGluZyB0aGUgcmVzdHJpY3Rpb25zCiAgICAgICAgICAqLwotICAgICAgICBwcml2YXRlIFN0YXRlbWVudFJlc3RyaWN0aW9ucyBwcmVwYXJlUmVzdHJpY3Rpb25zKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsCisgICAgICAgIHByaXZhdGUgU3RhdGVtZW50UmVzdHJpY3Rpb25zIHByZXBhcmVSZXN0cmljdGlvbnMoQ2xpZW50U3RhdGUgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZVNwZWNpZmljYXRpb25zIGJvdW5kTmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZWxlY3RzT25seVN0YXRpY0NvbHVtbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmb3JWaWV3KSB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0ZW1lbnRSZXN0cmljdGlvbnMoU3RhdGVtZW50VHlwZS5TRUxFQ1QsCisgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXRlbWVudFJlc3RyaWN0aW9ucyhzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlbWVudFR5cGUuU0VMRUNULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZUNsYXVzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kTmFtZXMsCkBAIC0xMzIzLDYgKzEzNDYsNyBAQAogICAgICAgICAgICAgaW50IGNsdXN0ZXJpbmdQcmVmaXhTaXplID0gMDsKIAogICAgICAgICAgICAgSXRlcmF0b3I8Q29sdW1uTWV0YWRhdGE+IHBrQ29sdW1ucyA9IG1ldGFkYXRhLnByaW1hcnlLZXlDb2x1bW5zKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIExpc3Q8Q29sdW1uTWV0YWRhdGE+IGNvbHVtbnMgPSBudWxsOwogICAgICAgICAgICAgU2VsZWN0b3IuRmFjdG9yeSBzZWxlY3RvckZhY3RvcnkgPSBudWxsOwogICAgICAgICAgICAgZm9yIChTZWxlY3RhYmxlLlJhdyByYXcgOiBwYXJhbWV0ZXJzLmdyb3VwcykKICAgICAgICAgICAgIHsKQEAgLTEzMzQsNyArMTM1OCw3IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBXaXRoRnVuY3Rpb24gd2l0aEZ1bmN0aW9uID0gKFdpdGhGdW5jdGlvbikgc2VsZWN0YWJsZTsKICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVHcm91cEJ5RnVuY3Rpb24od2l0aEZ1bmN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxDb2x1bW5NZXRhZGF0YT4gY29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8Q29sdW1uTWV0YWRhdGE+KCk7CisgICAgICAgICAgICAgICAgICAgIGNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0PENvbHVtbk1ldGFkYXRhPigpOwogICAgICAgICAgICAgICAgICAgICBzZWxlY3RvckZhY3RvcnkgPSBzZWxlY3RhYmxlLm5ld1NlbGVjdG9yRmFjdG9yeShtZXRhZGF0YSwgbnVsbCwgY29sdW1ucywgYm91bmROYW1lcyk7CiAgICAgICAgICAgICAgICAgICAgIGNoZWNrRmFsc2UoY29sdW1ucy5pc0VtcHR5KCksICJHUk9VUCBCWSBmdW5jdGlvbnMgbXVzdCBoYXZlIG9uZSBjbHVzdGVyaW5nIGNvbHVtbiBuYW1lIGFzIHBhcmFtZXRlciIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1ucy5zaXplKCkgPiAxKQpAQCAtMTM4Miw3ICsxNDA2LDggQEAKICAgICAgICAgICAgIHJldHVybiBzZWxlY3RvckZhY3RvcnkgPT0gbnVsbCA/IEFnZ3JlZ2F0aW9uU3BlY2lmaWNhdGlvbi5hZ2dyZWdhdGVQa1ByZWZpeEZhY3RvcnkobWV0YWRhdGEuY29tcGFyYXRvciwgY2x1c3RlcmluZ1ByZWZpeFNpemUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBZ2dyZWdhdGlvblNwZWNpZmljYXRpb24uYWdncmVnYXRlUGtQcmVmaXhGYWN0b3J5V2l0aFNlbGVjdG9yKG1ldGFkYXRhLmNvbXBhcmF0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJpbmdQcmVmaXhTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvckZhY3RvcnkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnMpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0xNDA1LDggKzE0MzAsOCBAQAogICAgICAgICAgICAgaWYgKCFyZXN0cmljdGlvbnMua2V5SXNJblJlbGF0aW9uKCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAKLSAgICAgICAgICAgIExpc3Q8SW50ZWdlcj4gaWRUb1NvcnQgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KG9yZGVyaW5nQ29sdW1ucy5zaXplKCkpOwotICAgICAgICAgICAgTGlzdDxDb21wYXJhdG9yPEJ5dGVCdWZmZXI+PiBzb3J0ZXJzID0gbmV3IEFycmF5TGlzdDxDb21wYXJhdG9yPEJ5dGVCdWZmZXI+PihvcmRlcmluZ0NvbHVtbnMuc2l6ZSgpKTsKKyAgICAgICAgICAgIExpc3Q8SW50ZWdlcj4gaWRUb1NvcnQgPSBuZXcgQXJyYXlMaXN0PD4ob3JkZXJpbmdDb2x1bW5zLnNpemUoKSk7CisgICAgICAgICAgICBMaXN0PENvbXBhcmF0b3I8Qnl0ZUJ1ZmZlcj4+IHNvcnRlcnMgPSBuZXcgQXJyYXlMaXN0PD4ob3JkZXJpbmdDb2x1bW5zLnNpemUoKSk7CiAKICAgICAgICAgICAgIGZvciAoQ29sdW1uTWV0YWRhdGEgb3JkZXJpbmdDb2x1bW4gOiBvcmRlcmluZ0NvbHVtbnMua2V5U2V0KCkpCiAgICAgICAgICAgICB7CkBAIC0xNDY2LDcgKzE0OTEsOCBAQAogICAgICAgICAgICAgICAgIC8vIFdlIHdpbGwgcG90ZW50aWFsbHkgZmlsdGVyIGRhdGEgaWYgZWl0aGVyOgogICAgICAgICAgICAgICAgIC8vICAtIEhhdmUgbW9yZSB0aGFuIG9uZSBJbmRleEV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAvLyAgLSBIYXZlIG5vIGluZGV4IGV4cHJlc3Npb24gYW5kIHRoZSByb3cgZmlsdGVyIGlzIG5vdCB0aGUgaWRlbnRpdHkKLSAgICAgICAgICAgICAgICBjaGVja0ZhbHNlKHJlc3RyaWN0aW9ucy5uZWVkRmlsdGVyaW5nKCksIFN0YXRlbWVudFJlc3RyaWN0aW9ucy5SRVFVSVJFU19BTExPV19GSUxURVJJTkdfTUVTU0FHRSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3RyaWN0aW9ucy5yZXF1aXJlc0FsbG93RmlsdGVyaW5nSWZOb3RTcGVjaWZpZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tGYWxzZShyZXN0cmljdGlvbnMubmVlZEZpbHRlcmluZygpLCBTdGF0ZW1lbnRSZXN0cmljdGlvbnMuUkVRVUlSRVNfQUxMT1dfRklMVEVSSU5HX01FU1NBR0UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9VcGRhdGVTdGF0ZW1lbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9VcGRhdGVTdGF0ZW1lbnQuamF2YQppbmRleCAyMGRmMTUxLi4yNThmYmYzIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvVXBkYXRlU3RhdGVtZW50LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL1VwZGF0ZVN0YXRlbWVudC5qYXZhCkBAIC0zMiw2ICszMiw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5QYXJ0aXRpb25VcGRhdGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2xpZW50U3RhdGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5Ub1N0cmluZ0J1aWxkZXI7CkBAIC0xMzUsNyArMTM2LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgTW9kaWZpY2F0aW9uU3RhdGVtZW50IHByZXBhcmVJbnRlcm5hbChUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLAorICAgICAgICBwcm90ZWN0ZWQgTW9kaWZpY2F0aW9uU3RhdGVtZW50IHByZXBhcmVJbnRlcm5hbChDbGllbnRTdGF0ZSBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFibGVTcGVjaWZpY2F0aW9ucyBiaW5kVmFyaWFibGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb25zIGNvbmRpdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMpCkBAIC0xNzYsNyArMTc4LDggQEAKIAogICAgICAgICAgICAgYm9vbGVhbiBhcHBseU9ubHlUb1N0YXRpY0NvbHVtbnMgPSAhaGFzQ2x1c3RlcmluZ0NvbHVtbnNTZXQgJiYgYXBwbGllc09ubHlUb1N0YXRpY0NvbHVtbnMob3BlcmF0aW9ucywgY29uZGl0aW9ucyk7CiAKLSAgICAgICAgICAgIFN0YXRlbWVudFJlc3RyaWN0aW9ucyByZXN0cmljdGlvbnMgPSBuZXcgU3RhdGVtZW50UmVzdHJpY3Rpb25zKHR5cGUsCisgICAgICAgICAgICBTdGF0ZW1lbnRSZXN0cmljdGlvbnMgcmVzdHJpY3Rpb25zID0gbmV3IFN0YXRlbWVudFJlc3RyaWN0aW9ucyhzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlQ2xhdXNlLmJ1aWxkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kVmFyaWFibGVzLApAQCAtMjEwLDcgKzIxMyw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIE1vZGlmaWNhdGlvblN0YXRlbWVudCBwcmVwYXJlSW50ZXJuYWwoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwKKyAgICAgICAgcHJvdGVjdGVkIE1vZGlmaWNhdGlvblN0YXRlbWVudCBwcmVwYXJlSW50ZXJuYWwoQ2xpZW50U3RhdGUgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlU3BlY2lmaWNhdGlvbnMgYmluZFZhcmlhYmxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9ucyBjb25kaXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzKQpAQCAtMjQ0LDcgKzI0OCw4IEBACiAKICAgICAgICAgICAgIGJvb2xlYW4gYXBwbHlPbmx5VG9TdGF0aWNDb2x1bW5zID0gIWhhc0NsdXN0ZXJpbmdDb2x1bW5zU2V0ICYmIGFwcGxpZXNPbmx5VG9TdGF0aWNDb2x1bW5zKG9wZXJhdGlvbnMsIGNvbmRpdGlvbnMpOwogCi0gICAgICAgICAgICBTdGF0ZW1lbnRSZXN0cmljdGlvbnMgcmVzdHJpY3Rpb25zID0gbmV3IFN0YXRlbWVudFJlc3RyaWN0aW9ucyh0eXBlLAorICAgICAgICAgICAgU3RhdGVtZW50UmVzdHJpY3Rpb25zIHJlc3RyaWN0aW9ucyA9IG5ldyBTdGF0ZW1lbnRSZXN0cmljdGlvbnMoc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZUNsYXVzZS5idWlsZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZFZhcmlhYmxlcywKQEAgLTI5MSw3ICsyOTYsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBNb2RpZmljYXRpb25TdGF0ZW1lbnQgcHJlcGFyZUludGVybmFsKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsCisgICAgICAgIHByb3RlY3RlZCBNb2RpZmljYXRpb25TdGF0ZW1lbnQgcHJlcGFyZUludGVybmFsKENsaWVudFN0YXRlIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZVNwZWNpZmljYXRpb25zIGJpbmRWYXJpYWJsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmRpdGlvbnMgY29uZGl0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRycykKQEAgLTMwOSw3ICszMTUsOCBAQAogICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMuYWRkKG9wZXJhdGlvbik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIFN0YXRlbWVudFJlc3RyaWN0aW9ucyByZXN0cmljdGlvbnMgPSBuZXdSZXN0cmljdGlvbnMobWV0YWRhdGEsCisgICAgICAgICAgICBTdGF0ZW1lbnRSZXN0cmljdGlvbnMgcmVzdHJpY3Rpb25zID0gbmV3UmVzdHJpY3Rpb25zKHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZFZhcmlhYmxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmVDbGF1c2UsCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0FsdGVyS2V5c3BhY2VTdGF0ZW1lbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQWx0ZXJLZXlzcGFjZVN0YXRlbWVudC5qYXZhCmluZGV4IDg3Mzc3ZDcuLmI4YTI3YWYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQWx0ZXJLZXlzcGFjZVN0YXRlbWVudC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQWx0ZXJLZXlzcGFjZVN0YXRlbWVudC5qYXZhCkBAIC0yNiwxNyArMjYsMTggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdWRpdC5BdWRpdExvZ0NvbnRleHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXVkaXQuQXVkaXRMb2dFbnRyeVR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5QZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFN0YXRlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzLkd1YXJkcmFpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtcy5Hb3NzaXBlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkFic3RyYWN0UmVwbGljYXRpb25TdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkxvY2FsU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SZXBsaWNhdGlvbkZhY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLlNpbXBsZVN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZU1ldGFkYXRhLktleXNwYWNlRGlmZjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VzOwpAQCAtNDYsMTAgKzQ3LDEzIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LkV2ZW50LlNjaGVtYUNoYW5nZS5DaGFuZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5BTExPV19BTFRFUl9SRl9EVVJJTkdfUkFOR0VfTU9WRU1FTlQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQUxMT1dfVU5TQUZFX1RSQU5TSUVOVF9DSEFOR0VTOworCiBwdWJsaWMgZmluYWwgY2xhc3MgQWx0ZXJLZXlzcGFjZVN0YXRlbWVudCBleHRlbmRzIEFsdGVyU2NoZW1hU3RhdGVtZW50CiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBhbGxvd19hbHRlcl9yZl9kdXJpbmdfcmFuZ2VfbW92ZW1lbnQgPSBCb29sZWFuLmdldEJvb2xlYW4oQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJhbGxvd19hbHRlcl9yZl9kdXJpbmdfcmFuZ2VfbW92ZW1lbnQiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGFsbG93X3Vuc2FmZV90cmFuc2llbnRfY2hhbmdlcyA9IEJvb2xlYW4uZ2V0Qm9vbGVhbihDb25maWcuUFJPUEVSVFlfUFJFRklYICsgImFsbG93X3Vuc2FmZV90cmFuc2llbnRfY2hhbmdlcyIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gYWxsb3dfYWx0ZXJfcmZfZHVyaW5nX3JhbmdlX21vdmVtZW50ID0gQUxMT1dfQUxURVJfUkZfRFVSSU5HX1JBTkdFX01PVkVNRU5ULmdldEJvb2xlYW4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGFsbG93X3Vuc2FmZV90cmFuc2llbnRfY2hhbmdlcyA9IEFMTE9XX1VOU0FGRV9UUkFOU0lFTlRfQ0hBTkdFUy5nZXRCb29sZWFuKCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoU2V0PFN0cmluZz4gY2xpZW50V2FybmluZ3MgPSBuZXcgSGFzaFNldDw+KCk7CiAKICAgICBwcml2YXRlIGZpbmFsIEtleXNwYWNlQXR0cmlidXRlcyBhdHRyczsKQEAgLTc2LDYgKzgwLDkgQEAKIAogICAgICAgICBLZXlzcGFjZU1ldGFkYXRhIG5ld0tleXNwYWNlID0ga2V5c3BhY2Uud2l0aFN3YXBwZWQoYXR0cnMuYXNBbHRlcmVkS2V5c3BhY2VQYXJhbXMoa2V5c3BhY2UucGFyYW1zKSk7CiAKKyAgICAgICAgaWYgKGF0dHJzLmdldFJlcGxpY2F0aW9uU3RyYXRlZ3lDbGFzcygpICE9IG51bGwgJiYgYXR0cnMuZ2V0UmVwbGljYXRpb25TdHJhdGVneUNsYXNzKCkuZXF1YWxzKFNpbXBsZVN0cmF0ZWd5LmNsYXNzLmdldFNpbXBsZU5hbWUoKSkpCisgICAgICAgICAgICBHdWFyZHJhaWxzLnNpbXBsZVN0cmF0ZWd5RW5hYmxlZC5lbnN1cmVFbmFibGVkKHN0YXRlKTsKKwogICAgICAgICBpZiAobmV3S2V5c3BhY2UucGFyYW1zLnJlcGxpY2F0aW9uLmtsYXNzLmVxdWFscyhMb2NhbFN0cmF0ZWd5LmNsYXNzKSkKICAgICAgICAgICAgIHRocm93IGlyZSgiVW5hYmxlIHRvIHVzZSBnaXZlbiBzdHJhdGVneSBjbGFzczogTG9jYWxTdHJhdGVneSBpcyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlLiIpOwogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0FsdGVyU2NoZW1hU3RhdGVtZW50LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0FsdGVyU2NoZW1hU3RhdGVtZW50LmphdmEKaW5kZXggZmRjNDkyMS4uYTUzOWVhNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9BbHRlclNjaGVtYVN0YXRlbWVudC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQWx0ZXJTY2hlbWFTdGF0ZW1lbnQuamF2YQpAQCAtMjYsNiArMjYsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxTdGF0ZW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5RdWVyeU9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5UaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHMuR3VhcmRyYWlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZXMuS2V5c3BhY2VzRGlmZjsKQEAgLTE0MCw2ICsxNDIsMTQgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRGVmYXVsdFRpbWVUb0xpdmUoVGFibGVQYXJhbXMgcGFyYW1zKQorICAgIHsKKyAgICAgICAgaWYgKHBhcmFtcy5kZWZhdWx0VGltZVRvTGl2ZSA9PSAwCisgICAgICAgICAgICAmJiAhU2NoZW1hQ29uc3RhbnRzLmlzU3lzdGVtS2V5c3BhY2Uoa2V5c3BhY2VOYW1lKQorICAgICAgICAgICAgJiYgVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHBhcmFtcy5jb21wYWN0aW9uLmtsYXNzKCkpKQorICAgICAgICAgICAgR3VhcmRyYWlscy56ZXJvVFRMT25UV0NTRW5hYmxlZC5lbnN1cmVFbmFibGVkKHN0YXRlKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgZ3JhbnRQZXJtaXNzaW9uc09uUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlLCBBdXRoZW50aWNhdGVkVXNlciB1c2VyKQogICAgIHsKICAgICAgICAgdHJ5CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0FsdGVyVGFibGVTdGF0ZW1lbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQWx0ZXJUYWJsZVN0YXRlbWVudC5qYXZhCmluZGV4IDA4YzVmMDQuLjgxZjA5NmEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQWx0ZXJUYWJsZVN0YXRlbWVudC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQWx0ZXJUYWJsZVN0YXRlbWVudC5qYXZhCkBAIC0yMyw5ICsyMywxMiBAQAogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIAoraW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CisKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlNwbGl0dGVyOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OwogCkBAIC00MCw2ICs0Myw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxTdGF0ZW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Db2x1bW5JZGVudGlmaWVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuUXVhbGlmaWVkTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nLkNvbHVtbk1hc2s7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZ3VhcmRyYWlscy5HdWFyZHJhaWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwpAQCAtNzgsNiArODIsNyBAQAogewogICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgdGFibGVOYW1lOwogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpZkV4aXN0czsKKyAgICBwcm90ZWN0ZWQgQ2xpZW50U3RhdGUgc3RhdGU7CiAKICAgICBwdWJsaWMgQWx0ZXJUYWJsZVN0YXRlbWVudChTdHJpbmcga2V5c3BhY2VOYW1lLCBTdHJpbmcgdGFibGVOYW1lLCBib29sZWFuIGlmRXhpc3RzKQogICAgIHsKQEAgLTg2LDYgKzkxLDE1IEBACiAgICAgICAgIHRoaXMuaWZFeGlzdHMgPSBpZkV4aXN0czsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShDbGllbnRTdGF0ZSBzdGF0ZSkKKyAgICB7CisgICAgICAgIHN1cGVyLnZhbGlkYXRlKHN0YXRlKTsKKworICAgICAgICAvLyBzYXZlIHRoZSBxdWVyeSBzdGF0ZSB0byB1c2UgaXQgZm9yIGd1YXJkcmFpbHMgdmFsaWRhdGlvbiBpbiAjYXBwbHkKKyAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOworICAgIH0KKwogICAgIHB1YmxpYyBLZXlzcGFjZXMgYXBwbHkoS2V5c3BhY2VzIHNjaGVtYSkKICAgICB7CiAgICAgICAgIEtleXNwYWNlTWV0YWRhdGEga2V5c3BhY2UgPSBzY2hlbWEuZ2V0TnVsbGFibGUoa2V5c3BhY2VOYW1lKTsKQEAgLTE0OSw2ICsxNjMsNzggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBBTFRFUiBUQUJMRSBbSUYgRVhJU1RTXSA8dGFibGU+IEFMVEVSIFtJRiBFWElTVFNdIDxjb2x1bW4+ICggTUFTS0VEIFdJVEggPG5ld01hc2s+IHwgRFJPUCBNQVNLRUQgKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFza0NvbHVtbiBleHRlbmRzIEFsdGVyVGFibGVTdGF0ZW1lbnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ29sdW1uSWRlbnRpZmllciBjb2x1bW5OYW1lOworICAgICAgICBATnVsbGFibGUKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2x1bW5NYXNrLlJhdyByYXdNYXNrOworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaWZDb2x1bW5FeGlzdHM7CisKKyAgICAgICAgTWFza0NvbHVtbihTdHJpbmcga2V5c3BhY2VOYW1lLAorICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YWJsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgQ29sdW1uSWRlbnRpZmllciBjb2x1bW5OYW1lLAorICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBDb2x1bW5NYXNrLlJhdyByYXdNYXNrLAorICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaWZUYWJsZUV4aXN0cywKKyAgICAgICAgICAgICAgICAgICBib29sZWFuIGlmQ29sdW1uRXhpc3RzKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZSwgaWZUYWJsZUV4aXN0cyk7CisgICAgICAgICAgICB0aGlzLmNvbHVtbk5hbWUgPSBjb2x1bW5OYW1lOworICAgICAgICAgICAgdGhpcy5yYXdNYXNrID0gcmF3TWFzazsKKyAgICAgICAgICAgIHRoaXMuaWZDb2x1bW5FeGlzdHMgPSBpZkNvbHVtbkV4aXN0czsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShDbGllbnRTdGF0ZSBzdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIudmFsaWRhdGUoc3RhdGUpOworCisgICAgICAgICAgICAvLyB3ZSBkb24ndCBhbGxvdyBjcmVhdGluZyBtYXNrcyBpZiB0aGV5IGFyZSBkaXNhYmxlZCwgYnV0IHdlIHN0aWxsIGFsbG93IGRyb3BwaW5nIHRoZW0KKyAgICAgICAgICAgIGlmIChyYXdNYXNrICE9IG51bGwpCisgICAgICAgICAgICAgICAgQ29sdW1uTWFzay5lbnN1cmVFbmFibGVkKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEtleXNwYWNlTWV0YWRhdGEgYXBwbHkoS2V5c3BhY2VNZXRhZGF0YSBrZXlzcGFjZSwgVGFibGVNZXRhZGF0YSB0YWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEgY29sdW1uID0gdGFibGUuZ2V0Q29sdW1uKGNvbHVtbk5hbWUpOworCisgICAgICAgICAgICBpZiAoY29sdW1uID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFpZkNvbHVtbkV4aXN0cykKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgaXJlKCJDb2x1bW4gd2l0aCBuYW1lICclcycgZG9lc24ndCBleGlzdCBvbiB0YWJsZSAnJXMnIiwgY29sdW1uTmFtZSwgdGFibGVOYW1lKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBrZXlzcGFjZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29sdW1uTWFzayBvbGRNYXNrID0gdGFibGUuZ2V0Q29sdW1uKGNvbHVtbk5hbWUpLmdldE1hc2soKTsKKyAgICAgICAgICAgIENvbHVtbk1hc2sgbmV3TWFzayA9IHJhd01hc2sgPT0gbnVsbCA/IG51bGwgOiByYXdNYXNrLnByZXBhcmUoa2V5c3BhY2UubmFtZSwgdGFibGUubmFtZSwgY29sdW1uTmFtZSwgY29sdW1uLnR5cGUpOworCisgICAgICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbHMob2xkTWFzaywgbmV3TWFzaykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGtleXNwYWNlOworCisgICAgICAgICAgICBUYWJsZU1ldGFkYXRhLkJ1aWxkZXIgdGFibGVCdWlsZGVyID0gdGFibGUudW5idWlsZCgpOworICAgICAgICAgICAgdGFibGVCdWlsZGVyLmFsdGVyQ29sdW1uTWFzayhjb2x1bW5OYW1lLCBuZXdNYXNrKTsKKyAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEgbmV3VGFibGUgPSB0YWJsZUJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgIG5ld1RhYmxlLnZhbGlkYXRlKCk7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBhbnkgcmVmZXJlbmNlIG9uIG1hdGVyaWFsaXplZCB2aWV3cywgc28gdGhlIG1hc2sgaXMgY29uc2lzdGVudCBhbW9uZyB0aGUgYmFzZSB0YWJsZSBhbmQgaXRzIHZpZXdzLgorICAgICAgICAgICAgVmlld3MuQnVpbGRlciB2aWV3c0J1aWxkZXIgPSBrZXlzcGFjZS52aWV3cy51bmJ1aWxkKCk7CisgICAgICAgICAgICBmb3IgKFZpZXdNZXRhZGF0YSB2aWV3IDoga2V5c3BhY2Uudmlld3MuZm9yVGFibGUodGFibGUuaWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2aWV3LmluY2x1ZGVzKGNvbHVtbk5hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmlld3NCdWlsZGVyLnB1dCh2aWV3c0J1aWxkZXIuZ2V0KHZpZXcubmFtZSgpKS53aXRoTmV3Q29sdW1uTWFzayhjb2x1bW5OYW1lLCBuZXdNYXNrKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4ga2V5c3BhY2Uud2l0aFN3YXBwZWQoa2V5c3BhY2UudGFibGVzLndpdGhTd2FwcGVkKG5ld1RhYmxlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU3dhcHBlZCh2aWV3c0J1aWxkZXIuYnVpbGQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBBTFRFUiBUQUJMRSBbSUYgRVhJU1RTXSA8dGFibGU+IEFERCBbSUYgTk9UIEVYSVNUU10gPGNvbHVtbj4gPG5ld3R5cGU+CiAgICAgICogQUxURVIgVEFCTEUgW0lGIEVYSVNUU10gPHRhYmxlPiBBREQgW0lGIE5PVCBFWElTVFNdICg8Y29sdW1uPiA8bmV3dHlwZT4sIDxjb2x1bW4xPiA8bmV3dHlwZTE+LCAuLi4gPGNvbHVtbm4+IDxuZXd0eXBlbj4pCiAgICAgICovCkBAIC0xNTksMTIgKzI0NSwxNSBAQAogICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2x1bW5JZGVudGlmaWVyIG5hbWU7CiAgICAgICAgICAgICBwcml2YXRlIGZpbmFsIENRTDNUeXBlLlJhdyB0eXBlOwogICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzU3RhdGljOworICAgICAgICAgICAgQE51bGxhYmxlCisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIENvbHVtbk1hc2suUmF3IG1hc2s7CiAKLSAgICAgICAgICAgIENvbHVtbihDb2x1bW5JZGVudGlmaWVyIG5hbWUsIENRTDNUeXBlLlJhdyB0eXBlLCBib29sZWFuIGlzU3RhdGljKQorICAgICAgICAgICAgQ29sdW1uKENvbHVtbklkZW50aWZpZXIgbmFtZSwgQ1FMM1R5cGUuUmF3IHR5cGUsIGJvb2xlYW4gaXNTdGF0aWMsIEBOdWxsYWJsZSBDb2x1bW5NYXNrLlJhdyBtYXNrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICAgICAgICAgICAgICB0aGlzLmlzU3RhdGljID0gaXNTdGF0aWM7CisgICAgICAgICAgICAgICAgdGhpcy5tYXNrID0gbWFzazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xNzgsMTQgKzI2Nyw5IEBACiAgICAgICAgICAgICB0aGlzLmlmQ29sdW1uTm90RXhpc3RzID0gaWZDb2x1bW5Ob3RFeGlzdHM7CiAgICAgICAgIH0KIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoQ2xpZW50U3RhdGUgc3RhdGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyLnZhbGlkYXRlKHN0YXRlKTsKLSAgICAgICAgfQotCiAgICAgICAgIHB1YmxpYyBLZXlzcGFjZU1ldGFkYXRhIGFwcGx5KEtleXNwYWNlTWV0YWRhdGEga2V5c3BhY2UsIFRhYmxlTWV0YWRhdGEgdGFibGUpCiAgICAgICAgIHsKKyAgICAgICAgICAgIEd1YXJkcmFpbHMuYWx0ZXJUYWJsZUVuYWJsZWQuZW5zdXJlRW5hYmxlZCgiQUxURVIgVEFCTEUgY2hhbmdpbmcgY29sdW1ucyIsIHN0YXRlKTsKICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEuQnVpbGRlciB0YWJsZUJ1aWxkZXIgPSB0YWJsZS51bmJ1aWxkKCk7CiAgICAgICAgICAgICBWaWV3cy5CdWlsZGVyIHZpZXdzQnVpbGRlciA9IGtleXNwYWNlLnZpZXdzLnVuYnVpbGQoKTsKICAgICAgICAgICAgIG5ld0NvbHVtbnMuZm9yRWFjaChjIC0+IGFkZENvbHVtbihrZXlzcGFjZSwgdGFibGUsIGMsIGlmQ29sdW1uTm90RXhpc3RzLCB0YWJsZUJ1aWxkZXIsIHZpZXdzQnVpbGRlcikpOwpAQCAtMjA5LDYgKzI5Myw3IEBACiAgICAgICAgICAgICBDb2x1bW5JZGVudGlmaWVyIG5hbWUgPSBjb2x1bW4ubmFtZTsKICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiB0eXBlID0gY29sdW1uLnR5cGUucHJlcGFyZShrZXlzcGFjZU5hbWUsIGtleXNwYWNlLnR5cGVzKS5nZXRUeXBlKCk7CiAgICAgICAgICAgICBib29sZWFuIGlzU3RhdGljID0gY29sdW1uLmlzU3RhdGljOworICAgICAgICAgICAgQ29sdW1uTWFzayBtYXNrID0gY29sdW1uLm1hc2sgPT0gbnVsbCA/IG51bGwgOiBjb2x1bW4ubWFzay5wcmVwYXJlKGtleXNwYWNlTmFtZSwgdGFibGVOYW1lLCBuYW1lLCB0eXBlKTsKIAogICAgICAgICAgICAgaWYgKG51bGwgIT0gdGFibGVCdWlsZGVyLmdldENvbHVtbihuYW1lKSkgewogICAgICAgICAgICAgICAgIGlmICghaWZDb2x1bW5Ob3RFeGlzdHMpCkBAIC0yNDksOSArMzM0LDkgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGlzU3RhdGljKQotICAgICAgICAgICAgICAgIHRhYmxlQnVpbGRlci5hZGRTdGF0aWNDb2x1bW4obmFtZSwgdHlwZSk7CisgICAgICAgICAgICAgICAgdGFibGVCdWlsZGVyLmFkZFN0YXRpY0NvbHVtbihuYW1lLCB0eXBlLCBtYXNrKTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0YWJsZUJ1aWxkZXIuYWRkUmVndWxhckNvbHVtbihuYW1lLCB0eXBlKTsKKyAgICAgICAgICAgICAgICB0YWJsZUJ1aWxkZXIuYWRkUmVndWxhckNvbHVtbihuYW1lLCB0eXBlLCBtYXNrKTsKIAogICAgICAgICAgICAgaWYgKCFpc1N0YXRpYykKICAgICAgICAgICAgIHsKQEAgLTI1OSw3ICszNDQsOCBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuaW5jbHVkZUFsbENvbHVtbnMpCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbk1ldGFkYXRhIHZpZXdDb2x1bW4gPSBDb2x1bW5NZXRhZGF0YS5yZWd1bGFyQ29sdW1uKHZpZXcubWV0YWRhdGEsIG5hbWUuYnl0ZXMsIHR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEgdmlld0NvbHVtbiA9IENvbHVtbk1ldGFkYXRhLnJlZ3VsYXJDb2x1bW4odmlldy5tZXRhZGF0YSwgbmFtZS5ieXRlcywgdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoTmV3TWFzayhtYXNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdzQnVpbGRlci5wdXQodmlld3NCdWlsZGVyLmdldCh2aWV3Lm5hbWUoKSkud2l0aEFkZGVkUmVndWxhckNvbHVtbih2aWV3Q29sdW1uKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0yODgsNiArMzc0LDcgQEAKIAogICAgICAgICBwdWJsaWMgS2V5c3BhY2VNZXRhZGF0YSBhcHBseShLZXlzcGFjZU1ldGFkYXRhIGtleXNwYWNlLCBUYWJsZU1ldGFkYXRhIHRhYmxlKQogICAgICAgICB7CisgICAgICAgICAgICBHdWFyZHJhaWxzLmFsdGVyVGFibGVFbmFibGVkLmVuc3VyZUVuYWJsZWQoIkFMVEVSIFRBQkxFIGNoYW5naW5nIGNvbHVtbnMiLCBzdGF0ZSk7CiAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhLkJ1aWxkZXIgYnVpbGRlciA9IHRhYmxlLnVuYnVpbGQoKTsKICAgICAgICAgICAgIHJlbW92ZWRDb2x1bW5zLmZvckVhY2goYyAtPiBkcm9wQ29sdW1uKGtleXNwYWNlLCB0YWJsZSwgYywgaWZDb2x1bW5FeGlzdHMsIGJ1aWxkZXIpKTsKICAgICAgICAgICAgIHJldHVybiBrZXlzcGFjZS53aXRoU3dhcHBlZChrZXlzcGFjZS50YWJsZXMud2l0aFN3YXBwZWQoYnVpbGRlci5idWlsZCgpKSk7CkBAIC0zNTUsNiArNDQyLDcgQEAKIAogICAgICAgICBwdWJsaWMgS2V5c3BhY2VNZXRhZGF0YSBhcHBseShLZXlzcGFjZU1ldGFkYXRhIGtleXNwYWNlLCBUYWJsZU1ldGFkYXRhIHRhYmxlKQogICAgICAgICB7CisgICAgICAgICAgICBHdWFyZHJhaWxzLmFsdGVyVGFibGVFbmFibGVkLmVuc3VyZUVuYWJsZWQoIkFMVEVSIFRBQkxFIGNoYW5naW5nIGNvbHVtbnMiLCBzdGF0ZSk7CiAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhLkJ1aWxkZXIgdGFibGVCdWlsZGVyID0gdGFibGUudW5idWlsZCgpOwogICAgICAgICAgICAgVmlld3MuQnVpbGRlciB2aWV3c0J1aWxkZXIgPSBrZXlzcGFjZS52aWV3cy51bmJ1aWxkKCk7CiAgICAgICAgICAgICByZW5hbWVkQ29sdW1ucy5mb3JFYWNoKChvLCBuKSAtPiByZW5hbWVDb2x1bW4oa2V5c3BhY2UsIHRhYmxlLCBvLCBuLCBpZkNvbHVtbnNFeGlzdHMsIHRhYmxlQnVpbGRlciwgdmlld3NCdWlsZGVyKSk7CkBAIC00MzAsNiArNTE4LDggQEAKICAgICAgICAgICAgIHN1cGVyLnZhbGlkYXRlKHN0YXRlKTsKIAogICAgICAgICAgICAgR3VhcmRyYWlscy50YWJsZVByb3BlcnRpZXMuZ3VhcmQoYXR0cnMudXBkYXRlZFByb3BlcnRpZXMoKSwgYXR0cnM6OnJlbW92ZVByb3BlcnR5LCBzdGF0ZSk7CisKKyAgICAgICAgICAgIHZhbGlkYXRlRGVmYXVsdFRpbWVUb0xpdmUoYXR0cnMuYXNOZXdUYWJsZVBhcmFtcygpKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBLZXlzcGFjZU1ldGFkYXRhIGFwcGx5KEtleXNwYWNlTWV0YWRhdGEga2V5c3BhY2UsIFRhYmxlTWV0YWRhdGEgdGFibGUpCkBAIC01NjcsNyArNjU3LDEzIEBACiAgICAgewogICAgICAgICBwcml2YXRlIGVudW0gS2luZAogICAgICAgICB7Ci0gICAgICAgICAgICBBTFRFUl9DT0xVTU4sIEFERF9DT0xVTU5TLCBEUk9QX0NPTFVNTlMsIFJFTkFNRV9DT0xVTU5TLCBBTFRFUl9PUFRJT05TLCBEUk9QX0NPTVBBQ1RfU1RPUkFHRQorICAgICAgICAgICAgQUxURVJfQ09MVU1OLAorICAgICAgICAgICAgTUFTS19DT0xVTU4sCisgICAgICAgICAgICBBRERfQ09MVU1OUywKKyAgICAgICAgICAgIERST1BfQ09MVU1OUywKKyAgICAgICAgICAgIFJFTkFNRV9DT0xVTU5TLAorICAgICAgICAgICAgQUxURVJfT1BUSU9OUywKKyAgICAgICAgICAgIERST1BfQ09NUEFDVF9TVE9SQUdFCiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIGZpbmFsIFF1YWxpZmllZE5hbWUgbmFtZTsKQEAgLTU4MCw2ICs2NzYsMTAgQEAKICAgICAgICAgLy8gQURECiAgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxBZGRDb2x1bW5zLkNvbHVtbj4gYWRkZWRDb2x1bW5zID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKKyAgICAgICAgLy8gQUxURVIgTUFTSworICAgICAgICBwcml2YXRlIENvbHVtbklkZW50aWZpZXIgbWFza2VkQ29sdW1uID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBDb2x1bW5NYXNrLlJhdyByYXdNYXNrID0gbnVsbDsKKwogICAgICAgICAvLyBEUk9QCiAgICAgICAgIHByaXZhdGUgZmluYWwgU2V0PENvbHVtbklkZW50aWZpZXI+IGRyb3BwZWRDb2x1bW5zID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICBwcml2YXRlIExvbmcgdGltZXN0YW1wID0gbnVsbDsgLy8gd2lsbCB1c2UgZXhlY3V0aW9uIHRpbWVzdGFtcCBpZiBub3QgcHJvdmlkZWQgYnkgcXVlcnkKQEAgLTYwNCw2ICs3MDQsNyBAQAogICAgICAgICAgICAgc3dpdGNoIChraW5kKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGNhc2UgICAgICAgICAgQUxURVJfQ09MVU1OOiByZXR1cm4gbmV3IEFsdGVyQ29sdW1uKGtleXNwYWNlTmFtZSwgdGFibGVOYW1lLCBpZlRhYmxlRXhpc3RzKTsKKyAgICAgICAgICAgICAgICBjYXNlICAgICAgICAgICBNQVNLX0NPTFVNTjogcmV0dXJuIG5ldyBNYXNrQ29sdW1uKGtleXNwYWNlTmFtZSwgdGFibGVOYW1lLCBtYXNrZWRDb2x1bW4sIHJhd01hc2ssIGlmVGFibGVFeGlzdHMsIGlmQ29sdW1uRXhpc3RzKTsKICAgICAgICAgICAgICAgICBjYXNlICAgICAgICAgICBBRERfQ09MVU1OUzogcmV0dXJuIG5ldyBBZGRDb2x1bW5zKGtleXNwYWNlTmFtZSwgdGFibGVOYW1lLCBhZGRlZENvbHVtbnMsIGlmVGFibGVFeGlzdHMsIGlmQ29sdW1uTm90RXhpc3RzKTsKICAgICAgICAgICAgICAgICBjYXNlICAgICAgICAgIERST1BfQ09MVU1OUzogcmV0dXJuIG5ldyBEcm9wQ29sdW1ucyhrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZSwgZHJvcHBlZENvbHVtbnMsIGlmVGFibGVFeGlzdHMsIGlmQ29sdW1uRXhpc3RzLCB0aW1lc3RhbXApOwogICAgICAgICAgICAgICAgIGNhc2UgICAgICAgIFJFTkFNRV9DT0xVTU5TOiByZXR1cm4gbmV3IFJlbmFtZUNvbHVtbnMoa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsIHJlbmFtZWRDb2x1bW5zLCBpZlRhYmxlRXhpc3RzLCBpZkNvbHVtbkV4aXN0cyk7CkBAIC02MTksMTAgKzcyMCwxNyBAQAogICAgICAgICAgICAga2luZCA9IEtpbmQuQUxURVJfQ09MVU1OOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgYWRkKENvbHVtbklkZW50aWZpZXIgbmFtZSwgQ1FMM1R5cGUuUmF3IHR5cGUsIGJvb2xlYW4gaXNTdGF0aWMpCisgICAgICAgIHB1YmxpYyB2b2lkIG1hc2soQ29sdW1uSWRlbnRpZmllciBuYW1lLCBDb2x1bW5NYXNrLlJhdyBtYXNrKQorICAgICAgICB7CisgICAgICAgICAgICBraW5kID0gS2luZC5NQVNLX0NPTFVNTjsKKyAgICAgICAgICAgIG1hc2tlZENvbHVtbiA9IG5hbWU7CisgICAgICAgICAgICByYXdNYXNrID0gbWFzazsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZChDb2x1bW5JZGVudGlmaWVyIG5hbWUsIENRTDNUeXBlLlJhdyB0eXBlLCBib29sZWFuIGlzU3RhdGljLCBATnVsbGFibGUgQ29sdW1uTWFzay5SYXcgbWFzaykKICAgICAgICAgewogICAgICAgICAgICAga2luZCA9IEtpbmQuQUREX0NPTFVNTlM7Ci0gICAgICAgICAgICBhZGRlZENvbHVtbnMuYWRkKG5ldyBBZGRDb2x1bW5zLkNvbHVtbihuYW1lLCB0eXBlLCBpc1N0YXRpYykpOworICAgICAgICAgICAgYWRkZWRDb2x1bW5zLmFkZChuZXcgQWRkQ29sdW1ucy5Db2x1bW4obmFtZSwgdHlwZSwgaXNTdGF0aWMsIG1hc2spKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGRyb3AoQ29sdW1uSWRlbnRpZmllciBuYW1lKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9BbHRlclR5cGVTdGF0ZW1lbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQWx0ZXJUeXBlU3RhdGVtZW50LmphdmEKaW5kZXggOWMzYmUxMS4uODljYjk5MCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9BbHRlclR5cGVTdGF0ZW1lbnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0FsdGVyVHlwZVN0YXRlbWVudC5qYXZhCkBAIC0xNzksNyArMTc5LDcgQEAKICAgICAgICAgVXNlclR5cGUgYXBwbHkoS2V5c3BhY2VNZXRhZGF0YSBrZXlzcGFjZSwgVXNlclR5cGUgdXNlclR5cGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBkZXBlbmRlbnRBZ2dyZWdhdGVzID0KLSAgICAgICAgICAgICAgICBrZXlzcGFjZS5mdW5jdGlvbnMKKyAgICAgICAgICAgICAgICBrZXlzcGFjZS51c2VyRnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAudWRhcygpCiAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHVkYSAtPiBudWxsICE9IHVkYS5pbml0aWFsQ29uZGl0aW9uKCkgJiYgdWRhLnN0YXRlVHlwZSgpLnJlZmVyZW5jZXNVc2VyVHlwZSh1c2VyVHlwZS5uYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAodWRhIC0+IHVkYS5uYW1lKCkudG9TdHJpbmcoKSkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQ3JlYXRlQWdncmVnYXRlU3RhdGVtZW50LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0NyZWF0ZUFnZ3JlZ2F0ZVN0YXRlbWVudC5qYXZhCmluZGV4IDA1NTA1MTUuLjAxMGY0NjQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQ3JlYXRlQWdncmVnYXRlU3RhdGVtZW50LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9DcmVhdGVBZ2dyZWdhdGVTdGF0ZW1lbnQuamF2YQpAQCAtMzEsOSArMzEsMTQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLklSZXNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLlBlcm1pc3Npb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb25OYW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLlNjYWxhckZ1bmN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLlVEQWdncmVnYXRlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLlVERnVuY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuVURIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuVXNlckZ1bmN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5GdW5jdGlvbnMuRnVuY3Rpb25zRGlmZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVXNlckZ1bmN0aW9ucy5GdW5jdGlvbnNEaWZmOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlcy5LZXlzcGFjZXNEaWZmOwpAQCAtMTE3LDggKzEyMiw4IEBACiAgICAgICAgIEFic3RyYWN0VHlwZTw/PiBzdGF0ZVR5cGUgPSByYXdTdGF0ZVR5cGUucHJlcGFyZShrZXlzcGFjZU5hbWUsIGtleXNwYWNlLnR5cGVzKS5nZXRUeXBlKCkudWRmVHlwZSgpOwogICAgICAgICBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gc3RhdGVGdW5jdGlvbkFyZ3VtZW50cyA9IExpc3RzLm5ld0FycmF5TGlzdChjb25jYXQoc2luZ2xldG9uKHN0YXRlVHlwZSksIGFyZ3VtZW50VHlwZXMpKTsKIAotICAgICAgICBGdW5jdGlvbiBzdGF0ZUZ1bmN0aW9uID0KLSAgICAgICAgICAgIGtleXNwYWNlLmZ1bmN0aW9ucworICAgICAgICBVc2VyRnVuY3Rpb24gc3RhdGVGdW5jdGlvbiA9CisgICAgICAgICAgICBrZXlzcGFjZS51c2VyRnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgIC5maW5kKHN0YXRlRnVuY3Rpb25OYW1lLCBzdGF0ZUZ1bmN0aW9uQXJndW1lbnRzKQogICAgICAgICAgICAgICAgICAgICAub3JFbHNlVGhyb3coKCkgLT4gaXJlKCJTdGF0ZSBmdW5jdGlvbiAlcyBkb2Vzbid0IGV4aXN0Iiwgc3RhdGVGdW5jdGlvblN0cmluZygpKSk7CiAKQEAgLTEzNSwxMiArMTQwLDEyIEBACiAgICAgICAgICAqIFJlc29sdmUgdGhlIGZpbmFsIGZ1bmN0aW9uIGFuZCByZXR1cm4gdHlwZQogICAgICAgICAgKi8KIAotICAgICAgICBGdW5jdGlvbiBmaW5hbEZ1bmN0aW9uID0gbnVsbDsKKyAgICAgICAgVXNlckZ1bmN0aW9uIGZpbmFsRnVuY3Rpb24gPSBudWxsOwogICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gcmV0dXJuVHlwZSA9IHN0YXRlRnVuY3Rpb24ucmV0dXJuVHlwZSgpOwogCiAgICAgICAgIGlmIChudWxsICE9IGZpbmFsRnVuY3Rpb25OYW1lKQogICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbEZ1bmN0aW9uID0ga2V5c3BhY2UuZnVuY3Rpb25zLmZpbmQoZmluYWxGdW5jdGlvbk5hbWUsIHNpbmdsZXRvbkxpc3Qoc3RhdGVUeXBlKSkub3JFbHNlKG51bGwpOworICAgICAgICAgICAgZmluYWxGdW5jdGlvbiA9IGtleXNwYWNlLnVzZXJGdW5jdGlvbnMuZmluZChmaW5hbEZ1bmN0aW9uTmFtZSwgc2luZ2xldG9uTGlzdChzdGF0ZVR5cGUpKS5vckVsc2UobnVsbCk7CiAgICAgICAgICAgICBpZiAobnVsbCA9PSBmaW5hbEZ1bmN0aW9uKQogICAgICAgICAgICAgICAgIHRocm93IGlyZSgiRmluYWwgZnVuY3Rpb24gJXMgZG9lc24ndCBleGlzdCIsIGZpbmFsRnVuY3Rpb25TdHJpbmcoKSk7CiAKQEAgLTE5OSw3ICsyMDQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTY2FsYXJGdW5jdGlvbikgZmluYWxGdW5jdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUpOwogCi0gICAgICAgIEZ1bmN0aW9uIGV4aXN0aW5nQWdncmVnYXRlID0ga2V5c3BhY2UuZnVuY3Rpb25zLmZpbmQoYWdncmVnYXRlLm5hbWUoKSwgYXJndW1lbnRUeXBlcykub3JFbHNlKG51bGwpOworICAgICAgICBVc2VyRnVuY3Rpb24gZXhpc3RpbmdBZ2dyZWdhdGUgPSBrZXlzcGFjZS51c2VyRnVuY3Rpb25zLmZpbmQoYWdncmVnYXRlLm5hbWUoKSwgYXJndW1lbnRUeXBlcykub3JFbHNlKG51bGwpOwogICAgICAgICBpZiAobnVsbCAhPSBleGlzdGluZ0FnZ3JlZ2F0ZSkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKCFleGlzdGluZ0FnZ3JlZ2F0ZS5pc0FnZ3JlZ2F0ZSgpKQpAQCAtMjIwLDcgKzIyNSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gc2NoZW1hLndpdGhBZGRlZE9yVXBkYXRlZChrZXlzcGFjZS53aXRoU3dhcHBlZChrZXlzcGFjZS5mdW5jdGlvbnMud2l0aEFkZGVkT3JVcGRhdGVkKGFnZ3JlZ2F0ZSkpKTsKKyAgICAgICAgcmV0dXJuIHNjaGVtYS53aXRoQWRkZWRPclVwZGF0ZWQoa2V5c3BhY2Uud2l0aFN3YXBwZWQoa2V5c3BhY2UudXNlckZ1bmN0aW9ucy53aXRoQWRkZWRPclVwZGF0ZWQoYWdncmVnYXRlKSkpOwogICAgIH0KIAogICAgIFNjaGVtYUNoYW5nZSBzY2hlbWFDaGFuZ2VFdmVudChLZXlzcGFjZXNEaWZmIGRpZmYpCkBAIC0yNDIsNyArMjQ3LDcgQEAKICAgICB7CiAgICAgICAgIEZ1bmN0aW9uTmFtZSBuYW1lID0gbmV3IEZ1bmN0aW9uTmFtZShrZXlzcGFjZU5hbWUsIGFnZ3JlZ2F0ZU5hbWUpOwogCi0gICAgICAgIGlmIChTY2hlbWEuaW5zdGFuY2UuZmluZEZ1bmN0aW9uKG5hbWUsIExpc3RzLnRyYW5zZm9ybShyYXdBcmd1bWVudFR5cGVzLCB0IC0+IHQucHJlcGFyZShrZXlzcGFjZU5hbWUpLmdldFR5cGUoKSkpLmlzUHJlc2VudCgpICYmIG9yUmVwbGFjZSkKKyAgICAgICAgaWYgKFNjaGVtYS5pbnN0YW5jZS5maW5kVXNlckZ1bmN0aW9uKG5hbWUsIExpc3RzLnRyYW5zZm9ybShyYXdBcmd1bWVudFR5cGVzLCB0IC0+IHQucHJlcGFyZShrZXlzcGFjZU5hbWUpLmdldFR5cGUoKSkpLmlzUHJlc2VudCgpICYmIG9yUmVwbGFjZSkKICAgICAgICAgICAgIGNsaWVudC5lbnN1cmVQZXJtaXNzaW9uKFBlcm1pc3Npb24uQUxURVIsIEZ1bmN0aW9uUmVzb3VyY2UuZnVuY3Rpb25Gcm9tQ3FsKGtleXNwYWNlTmFtZSwgYWdncmVnYXRlTmFtZSwgcmF3QXJndW1lbnRUeXBlcykpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBjbGllbnQuZW5zdXJlUGVybWlzc2lvbihQZXJtaXNzaW9uLkNSRUFURSwgRnVuY3Rpb25SZXNvdXJjZS5rZXlzcGFjZShrZXlzcGFjZU5hbWUpKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQ3JlYXRlRnVuY3Rpb25TdGF0ZW1lbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQ3JlYXRlRnVuY3Rpb25TdGF0ZW1lbnQuamF2YQppbmRleCBhZGI4ZjQwLi44ZTNjNzljIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0NyZWF0ZUZ1bmN0aW9uU3RhdGVtZW50LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9DcmVhdGVGdW5jdGlvblN0YXRlbWVudC5qYXZhCkBAIC0zMCwxMSArMzAsMTEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTDNUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMU3RhdGVtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ29sdW1uSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbk5hbWU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuVURGdW5jdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5Vc2VyRnVuY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkZ1bmN0aW9ucy5GdW5jdGlvbnNEaWZmOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Vc2VyRnVuY3Rpb25zLkZ1bmN0aW9uc0RpZmY7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VzLktleXNwYWNlc0RpZmY7CkBAIC0xMjIsNyArMTIyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keSk7CiAKLSAgICAgICAgRnVuY3Rpb24gZXhpc3RpbmdGdW5jdGlvbiA9IGtleXNwYWNlLmZ1bmN0aW9ucy5maW5kKGZ1bmN0aW9uLm5hbWUoKSwgYXJndW1lbnRUeXBlcykub3JFbHNlKG51bGwpOworICAgICAgICBVc2VyRnVuY3Rpb24gZXhpc3RpbmdGdW5jdGlvbiA9IGtleXNwYWNlLnVzZXJGdW5jdGlvbnMuZmluZChmdW5jdGlvbi5uYW1lKCksIGFyZ3VtZW50VHlwZXMpLm9yRWxzZShudWxsKTsKICAgICAgICAgaWYgKG51bGwgIT0gZXhpc3RpbmdGdW5jdGlvbikKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGV4aXN0aW5nRnVuY3Rpb24uaXNBZ2dyZWdhdGUoKSkKQEAgLTE1Miw3ICsxNTIsNyBAQAogICAgICAgICAgICAgLy8gVE9ETzogdXBkYXRlIGRlcGVuZGVudCBhZ2dyZWdhdGVzCiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gc2NoZW1hLndpdGhBZGRlZE9yVXBkYXRlZChrZXlzcGFjZS53aXRoU3dhcHBlZChrZXlzcGFjZS5mdW5jdGlvbnMud2l0aEFkZGVkT3JVcGRhdGVkKGZ1bmN0aW9uKSkpOworICAgICAgICByZXR1cm4gc2NoZW1hLndpdGhBZGRlZE9yVXBkYXRlZChrZXlzcGFjZS53aXRoU3dhcHBlZChrZXlzcGFjZS51c2VyRnVuY3Rpb25zLndpdGhBZGRlZE9yVXBkYXRlZChmdW5jdGlvbikpKTsKICAgICB9CiAKICAgICBTY2hlbWFDaGFuZ2Ugc2NoZW1hQ2hhbmdlRXZlbnQoS2V5c3BhY2VzRGlmZiBkaWZmKQpAQCAtMTc0LDcgKzE3NCw3IEBACiAgICAgewogICAgICAgICBGdW5jdGlvbk5hbWUgbmFtZSA9IG5ldyBGdW5jdGlvbk5hbWUoa2V5c3BhY2VOYW1lLCBmdW5jdGlvbk5hbWUpOwogCi0gICAgICAgIGlmIChTY2hlbWEuaW5zdGFuY2UuZmluZEZ1bmN0aW9uKG5hbWUsIExpc3RzLnRyYW5zZm9ybShyYXdBcmd1bWVudFR5cGVzLCB0IC0+IHQucHJlcGFyZShrZXlzcGFjZU5hbWUpLmdldFR5cGUoKS51ZGZUeXBlKCkpKS5pc1ByZXNlbnQoKSAmJiBvclJlcGxhY2UpCisgICAgICAgIGlmIChTY2hlbWEuaW5zdGFuY2UuZmluZFVzZXJGdW5jdGlvbihuYW1lLCBMaXN0cy50cmFuc2Zvcm0ocmF3QXJndW1lbnRUeXBlcywgdCAtPiB0LnByZXBhcmUoa2V5c3BhY2VOYW1lKS5nZXRUeXBlKCkudWRmVHlwZSgpKSkuaXNQcmVzZW50KCkgJiYgb3JSZXBsYWNlKQogICAgICAgICAgICAgY2xpZW50LmVuc3VyZVBlcm1pc3Npb24oUGVybWlzc2lvbi5BTFRFUiwgRnVuY3Rpb25SZXNvdXJjZS5mdW5jdGlvbkZyb21DcWwoa2V5c3BhY2VOYW1lLCBmdW5jdGlvbk5hbWUsIHJhd0FyZ3VtZW50VHlwZXMpKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgY2xpZW50LmVuc3VyZVBlcm1pc3Npb24oUGVybWlzc2lvbi5DUkVBVEUsIEZ1bmN0aW9uUmVzb3VyY2Uua2V5c3BhY2Uoa2V5c3BhY2VOYW1lKSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0NyZWF0ZUtleXNwYWNlU3RhdGVtZW50LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0NyZWF0ZUtleXNwYWNlU3RhdGVtZW50LmphdmEKaW5kZXggZGM4MmY5My4uYWQ2YmNjNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9DcmVhdGVLZXlzcGFjZVN0YXRlbWVudC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQ3JlYXRlS2V5c3BhY2VTdGF0ZW1lbnQuamF2YQpAQCAtMzYsNiArMzYsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHMuR3VhcmRyYWlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkFscmVhZHlFeGlzdHNFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5Mb2NhbFN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuU2ltcGxlU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zLk9wdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VzOwpAQCAtNjcsNiArNjgsOSBAQAogICAgICAgICBpZiAoIWF0dHJzLmhhc09wdGlvbihPcHRpb24uUkVQTElDQVRJT04pKQogICAgICAgICAgICAgdGhyb3cgaXJlKCJNaXNzaW5nIG1hbmRhdG9yeSBvcHRpb24gJyVzJyIsIE9wdGlvbi5SRVBMSUNBVElPTik7CiAKKyAgICAgICAgaWYgKGF0dHJzLmdldFJlcGxpY2F0aW9uU3RyYXRlZ3lDbGFzcygpICE9IG51bGwgJiYgYXR0cnMuZ2V0UmVwbGljYXRpb25TdHJhdGVneUNsYXNzKCkuZXF1YWxzKFNpbXBsZVN0cmF0ZWd5LmNsYXNzLmdldFNpbXBsZU5hbWUoKSkpCisgICAgICAgICAgICBHdWFyZHJhaWxzLnNpbXBsZVN0cmF0ZWd5RW5hYmxlZC5lbnN1cmVFbmFibGVkKCJTaW1wbGVTdHJhdGVneSIsIHN0YXRlKTsKKwogICAgICAgICBpZiAoc2NoZW1hLmNvbnRhaW5zS2V5c3BhY2Uoa2V5c3BhY2VOYW1lKSkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGlmTm90RXhpc3RzKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9DcmVhdGVUYWJsZVN0YXRlbWVudC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9DcmVhdGVUYWJsZVN0YXRlbWVudC5qYXZhCmluZGV4IDFhNjI1MzguLjQ1ZjIzZTkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQ3JlYXRlVGFibGVTdGF0ZW1lbnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0NyZWF0ZVRhYmxlU3RhdGVtZW50LmphdmEKQEAgLTE5LDYgKzE5LDggQEAKIAogaW1wb3J0IGphdmEudXRpbC4qOwogCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOwpAQCAtMzMsNiArMzUsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguUGVybWlzc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nLkNvbHVtbk1hc2s7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZ3VhcmRyYWlscy5HdWFyZHJhaWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuKjsKQEAgLTU0LDcgKzU3LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ3JlYXRlVGFibGVTdGF0ZW1lbnQuY2xhc3MpOwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHRhYmxlTmFtZTsKIAotICAgIHByaXZhdGUgZmluYWwgTWFwPENvbHVtbklkZW50aWZpZXIsIENRTDNUeXBlLlJhdz4gcmF3Q29sdW1uczsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxDb2x1bW5JZGVudGlmaWVyLCBDb2x1bW5Qcm9wZXJ0aWVzLlJhdz4gcmF3Q29sdW1uczsKICAgICBwcml2YXRlIGZpbmFsIFNldDxDb2x1bW5JZGVudGlmaWVyPiBzdGF0aWNDb2x1bW5zOwogICAgIHByaXZhdGUgZmluYWwgTGlzdDxDb2x1bW5JZGVudGlmaWVyPiBwYXJ0aXRpb25LZXlDb2x1bW5zOwogICAgIHByaXZhdGUgZmluYWwgTGlzdDxDb2x1bW5JZGVudGlmaWVyPiBjbHVzdGVyaW5nQ29sdW1uczsKQEAgLTY3LDE1ICs3MCwxMiBAQAogCiAgICAgcHVibGljIENyZWF0ZVRhYmxlU3RhdGVtZW50KFN0cmluZyBrZXlzcGFjZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YWJsZU5hbWUsCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPENvbHVtbklkZW50aWZpZXIsIENRTDNUeXBlLlJhdz4gcmF3Q29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPENvbHVtbklkZW50aWZpZXIsIENvbHVtblByb3BlcnRpZXMuUmF3PiByYXdDb2x1bW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8Q29sdW1uSWRlbnRpZmllcj4gc3RhdGljQ29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDb2x1bW5JZGVudGlmaWVyPiBwYXJ0aXRpb25LZXlDb2x1bW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENvbHVtbklkZW50aWZpZXI+IGNsdXN0ZXJpbmdDb2x1bW5zLAotCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmtlZEhhc2hNYXA8Q29sdW1uSWRlbnRpZmllciwgQm9vbGVhbj4gY2x1c3RlcmluZ09yZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZUF0dHJpYnV0ZXMgYXR0cnMsCi0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpZk5vdEV4aXN0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VDb21wYWN0U3RvcmFnZSkKICAgICB7CkBAIC0xNDksNiArMTQ5LDE1IEBACiAgICAgICAgIC8vIEd1YXJkcmFpbCB0byBjaGVjayB3aGV0aGVyIGNyZWF0aW9uIG9mIG5ldyBDT01QQUNUIFNUT1JBR0UgdGFibGVzIGlzIGFsbG93ZWQKICAgICAgICAgaWYgKHVzZUNvbXBhY3RTdG9yYWdlKQogICAgICAgICAgICAgR3VhcmRyYWlscy5jb21wYWN0VGFibGVzRW5hYmxlZC5lbnN1cmVFbmFibGVkKHN0YXRlKTsKKworICAgICAgICB2YWxpZGF0ZURlZmF1bHRUaW1lVG9MaXZlKGF0dHJzLmFzTmV3VGFibGVQYXJhbXMoKSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgZHluYW1pYyBkYXRhIG1hc2tpbmcgaXMgZW5hYmxlZCBpZiB0aGVyZSBhcmUgbWFza2VkIGNvbHVtbnMKKyAgICAgICAgZm9yIChDb2x1bW5Qcm9wZXJ0aWVzLlJhdyByYXcgOiByYXdDb2x1bW5zLnZhbHVlcygpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocmF3LnJhd01hc2sgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBDb2x1bW5NYXNrLmVuc3VyZUVuYWJsZWQoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIFNjaGVtYUNoYW5nZSBzY2hlbWFDaGFuZ2VFdmVudChLZXlzcGFjZXNEaWZmIGRpZmYpCkBAIC0xODQsMTUgKzE5MywxNiBAQAogICAgICAgICBUYWJsZVBhcmFtcyBwYXJhbXMgPSBhdHRycy5hc05ld1RhYmxlUGFyYW1zKCk7CiAKICAgICAgICAgLy8gdXNlIGEgVHJlZU1hcCB0byBwcmVzZXJ2ZSBvcmRlcmluZyBhY3Jvc3MgSkRLIHZlcnNpb25zIChzZWUgQ0FTU0FORFJBLTk0OTIpIC0gaW1wb3J0YW50IGZvciBzdGFibGUgdW5pdCB0ZXN0cwotICAgICAgICBNYXA8Q29sdW1uSWRlbnRpZmllciwgQ1FMM1R5cGU+IGNvbHVtbnMgPSBuZXcgVHJlZU1hcDw+KGNvbXBhcmluZyhvIC0+IG8uYnl0ZXMpKTsKLSAgICAgICAgcmF3Q29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIHR5cGUpIC0+IGNvbHVtbnMucHV0KGNvbHVtbiwgdHlwZS5wcmVwYXJlKGtleXNwYWNlTmFtZSwgdHlwZXMpKSk7CisgICAgICAgIE1hcDxDb2x1bW5JZGVudGlmaWVyLCBDb2x1bW5Qcm9wZXJ0aWVzPiBjb2x1bW5zID0gbmV3IFRyZWVNYXA8Pihjb21wYXJpbmcobyAtPiBvLmJ5dGVzKSk7CisgICAgICAgIHJhd0NvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBwcm9wZXJ0aWVzKSAtPiBjb2x1bW5zLnB1dChjb2x1bW4sIHByb3BlcnRpZXMucHJlcGFyZShrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZSwgY29sdW1uLCB0eXBlcykpKTsKIAogICAgICAgICAvLyBjaGVjayBmb3IgbmVzdGVkIG5vbi1mcm96ZW4gVURUcyBvciBjb2xsZWN0aW9ucyBpbiBhIG5vbi1mcm96ZW4gVURUCi0gICAgICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCB0eXBlKSAtPgorICAgICAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgcHJvcGVydGllcykgLT4KICAgICAgICAgewotICAgICAgICAgICAgaWYgKHR5cGUuaXNVRFQoKSAmJiB0eXBlLmdldFR5cGUoKS5pc011bHRpQ2VsbCgpKQorICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHR5cGUgPSBwcm9wZXJ0aWVzLnR5cGU7CisgICAgICAgICAgICBpZiAodHlwZS5pc1VEVCgpICYmIHR5cGUuaXNNdWx0aUNlbGwoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKFVzZXJUeXBlKSB0eXBlLmdldFR5cGUoKSkuZmllbGRUeXBlcygpLmZvckVhY2goZmllbGQgLT4KKyAgICAgICAgICAgICAgICAoKFVzZXJUeXBlKSB0eXBlKS5maWVsZFR5cGVzKCkuZm9yRWFjaChmaWVsZCAtPgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzTXVsdGlDZWxsKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBpcmUoIk5vbi1mcm96ZW4gVURUcyB3aXRoIG5lc3RlZCBub24tZnJvemVuIGNvbGxlY3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkIik7CkBAIC0yMDcsNDUgKzIxNyw0NyBAQAogICAgICAgICBIYXNoU2V0PENvbHVtbklkZW50aWZpZXI+IHByaW1hcnlLZXlDb2x1bW5zID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICBjb25jYXQocGFydGl0aW9uS2V5Q29sdW1ucywgY2x1c3RlcmluZ0NvbHVtbnMpLmZvckVhY2goY29sdW1uIC0+CiAgICAgICAgIHsKLSAgICAgICAgICAgIENRTDNUeXBlIHR5cGUgPSBjb2x1bW5zLmdldChjb2x1bW4pOwotICAgICAgICAgICAgaWYgKG51bGwgPT0gdHlwZSkKKyAgICAgICAgICAgIENvbHVtblByb3BlcnRpZXMgcHJvcGVydGllcyA9IGNvbHVtbnMuZ2V0KGNvbHVtbik7CisgICAgICAgICAgICBpZiAobnVsbCA9PSBwcm9wZXJ0aWVzKQogICAgICAgICAgICAgICAgIHRocm93IGlyZSgiVW5rbm93biBjb2x1bW4gJyVzJyByZWZlcmVuY2VkIGluIFBSSU1BUlkgS0VZIGZvciB0YWJsZSAnJXMnIiwgY29sdW1uLCB0YWJsZU5hbWUpOwogCiAgICAgICAgICAgICBpZiAoIXByaW1hcnlLZXlDb2x1bW5zLmFkZChjb2x1bW4pKQogICAgICAgICAgICAgICAgIHRocm93IGlyZSgiRHVwbGljYXRlIGNvbHVtbiAnJXMnIGluIFBSSU1BUlkgS0VZIGNsYXVzZSBmb3IgdGFibGUgJyVzJyIsIGNvbHVtbiwgdGFibGVOYW1lKTsKIAotICAgICAgICAgICAgaWYgKHR5cGUuZ2V0VHlwZSgpLmlzTXVsdGlDZWxsKCkpCisgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdHlwZSA9IHByb3BlcnRpZXMudHlwZTsKKyAgICAgICAgICAgIGlmICh0eXBlLmlzTXVsdGlDZWxsKCkpCiAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ1FMM1R5cGUgY3FsVHlwZSA9IHByb3BlcnRpZXMuY3FsVHlwZTsKICAgICAgICAgICAgICAgICBpZiAodHlwZS5pc0NvbGxlY3Rpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgaXJlKCJJbnZhbGlkIG5vbi1mcm96ZW4gY29sbGVjdGlvbiB0eXBlICVzIGZvciBQUklNQVJZIEtFWSBjb2x1bW4gJyVzJyIsIHR5cGUsIGNvbHVtbik7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGlyZSgiSW52YWxpZCBub24tZnJvemVuIGNvbGxlY3Rpb24gdHlwZSAlcyBmb3IgUFJJTUFSWSBLRVkgY29sdW1uICclcyciLCBjcWxUeXBlLCBjb2x1bW4pOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgaXJlKCJJbnZhbGlkIG5vbi1mcm96ZW4gdXNlci1kZWZpbmVkIHR5cGUgJXMgZm9yIFBSSU1BUlkgS0VZIGNvbHVtbiAnJXMnIiwgdHlwZSwgY29sdW1uKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgaXJlKCJJbnZhbGlkIG5vbi1mcm96ZW4gdXNlci1kZWZpbmVkIHR5cGUgJXMgZm9yIFBSSU1BUlkgS0VZIGNvbHVtbiAnJXMnIiwgY3FsVHlwZSwgY29sdW1uKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHR5cGUuZ2V0VHlwZSgpLmlzQ291bnRlcigpKQorICAgICAgICAgICAgaWYgKHR5cGUuaXNDb3VudGVyKCkpCiAgICAgICAgICAgICAgICAgdGhyb3cgaXJlKCJjb3VudGVyIHR5cGUgaXMgbm90IHN1cHBvcnRlZCBmb3IgUFJJTUFSWSBLRVkgY29sdW1uICclcyciLCBjb2x1bW4pOwogCi0gICAgICAgICAgICBpZiAodHlwZS5nZXRUeXBlKCkucmVmZXJlbmNlc0R1cmF0aW9uKCkpCisgICAgICAgICAgICBpZiAodHlwZS5yZWZlcmVuY2VzRHVyYXRpb24oKSkKICAgICAgICAgICAgICAgICB0aHJvdyBpcmUoImR1cmF0aW9uIHR5cGUgaXMgbm90IHN1cHBvcnRlZCBmb3IgUFJJTUFSWSBLRVkgY29sdW1uICclcyciLCBjb2x1bW4pOwogCiAgICAgICAgICAgICBpZiAoc3RhdGljQ29sdW1ucy5jb250YWlucyhjb2x1bW4pKQogICAgICAgICAgICAgICAgIHRocm93IGlyZSgiU3RhdGljIGNvbHVtbiAnJXMnIGNhbm5vdCBiZSBwYXJ0IG9mIHRoZSBQUklNQVJZIEtFWSIsIGNvbHVtbik7CiAgICAgICAgIH0pOwogCi0gICAgICAgIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBwYXJ0aXRpb25LZXlUeXBlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gY2x1c3RlcmluZ1R5cGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Q29sdW1uUHJvcGVydGllcz4gcGFydGl0aW9uS2V5Q29sdW1uUHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PENvbHVtblByb3BlcnRpZXM+IGNsdXN0ZXJpbmdDb2x1bW5Qcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKICAgICAgICAgcGFydGl0aW9uS2V5Q29sdW1ucy5mb3JFYWNoKGNvbHVtbiAtPgogICAgICAgICB7Ci0gICAgICAgICAgICBDUUwzVHlwZSB0eXBlID0gY29sdW1ucy5yZW1vdmUoY29sdW1uKTsKLSAgICAgICAgICAgIHBhcnRpdGlvbktleVR5cGVzLmFkZCh0eXBlLmdldFR5cGUoKSk7CisgICAgICAgICAgICBDb2x1bW5Qcm9wZXJ0aWVzIGNvbHVtblByb3BlcnRpZXMgPSBjb2x1bW5zLnJlbW92ZShjb2x1bW4pOworICAgICAgICAgICAgcGFydGl0aW9uS2V5Q29sdW1uUHJvcGVydGllcy5hZGQoY29sdW1uUHJvcGVydGllcyk7CiAgICAgICAgIH0pOwogCiAgICAgICAgIGNsdXN0ZXJpbmdDb2x1bW5zLmZvckVhY2goY29sdW1uIC0+CiAgICAgICAgIHsKLSAgICAgICAgICAgIENRTDNUeXBlIHR5cGUgPSBjb2x1bW5zLnJlbW92ZShjb2x1bW4pOworICAgICAgICAgICAgQ29sdW1uUHJvcGVydGllcyBjb2x1bW5Qcm9wZXJ0aWVzID0gY29sdW1ucy5yZW1vdmUoY29sdW1uKTsKICAgICAgICAgICAgIGJvb2xlYW4gcmV2ZXJzZSA9ICFjbHVzdGVyaW5nT3JkZXIuZ2V0T3JEZWZhdWx0KGNvbHVtbiwgdHJ1ZSk7Ci0gICAgICAgICAgICBjbHVzdGVyaW5nVHlwZXMuYWRkKHJldmVyc2UgPyBSZXZlcnNlZFR5cGUuZ2V0SW5zdGFuY2UodHlwZS5nZXRUeXBlKCkpIDogdHlwZS5nZXRUeXBlKCkpOworICAgICAgICAgICAgY2x1c3RlcmluZ0NvbHVtblByb3BlcnRpZXMuYWRkKHJldmVyc2UgPyBjb2x1bW5Qcm9wZXJ0aWVzLndpdGhSZXZlcnNlZFR5cGUoKSA6IGNvbHVtblByb3BlcnRpZXMpOwogICAgICAgICB9KTsKIAogICAgICAgICBpZiAoY2x1c3RlcmluZ09yZGVyLnNpemUoKSA+IGNsdXN0ZXJpbmdDb2x1bW5zLnNpemUoKSkKQEAgLTI2OCw3ICsyODAsNyBAQAogICAgICAgICAvLyBGb3IgQ09NUEFDVCBTVE9SQUdFLCB3ZSByZWplY3QgYW55ICJmZWF0dXJlIiB0aGF0IHdlIHdvdWxkbid0IGJlIGFibGUgdG8gdHJhbnNsYXRlIGJhY2sgdG8gdGhyaWZ0LgogICAgICAgICBpZiAodXNlQ29tcGFjdFN0b3JhZ2UpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRlQ29tcGFjdFRhYmxlKGNsdXN0ZXJpbmdUeXBlcywgY29sdW1ucyk7CisgICAgICAgICAgICB2YWxpZGF0ZUNvbXBhY3RUYWJsZShjbHVzdGVyaW5nQ29sdW1uUHJvcGVydGllcywgY29sdW1ucyk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CkBAIC0yODEsMTIgKzI5MywxMiBAQAogICAgICAgICAgKiBDb3VudGVyIHRhYmxlIHZhbGlkYXRpb24KICAgICAgICAgICovCiAKLSAgICAgICAgYm9vbGVhbiBoYXNDb3VudGVycyA9IHJhd0NvbHVtbnMudmFsdWVzKCkuc3RyZWFtKCkuYW55TWF0Y2goQ1FMM1R5cGUuUmF3Ojppc0NvdW50ZXIpOworICAgICAgICBib29sZWFuIGhhc0NvdW50ZXJzID0gcmF3Q29sdW1ucy52YWx1ZXMoKS5zdHJlYW0oKS5hbnlNYXRjaChjIC0+IGMucmF3VHlwZS5pc0NvdW50ZXIoKSk7CiAgICAgICAgIGlmIChoYXNDb3VudGVycykKICAgICAgICAgewogICAgICAgICAgICAgLy8gV2UndmUgaGFuZGxlZCBhbnl0aGluZyB0aGF0IGlzIG5vdCBhIFBSSU1BUlkgS0VZIHNvIGNvbHVtbnMgb25seSBjb250YWlucyBOT04tUEsgY29sdW1ucy4gU28KICAgICAgICAgICAgIC8vIGlmIGl0J3MgYSBjb3VudGVyIHRhYmxlLCBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBub24tY291bnRlciB0eXBlcwotICAgICAgICAgICAgaWYgKGNvbHVtbnMudmFsdWVzKCkuc3RyZWFtKCkuYW55TWF0Y2godCAtPiAhdC5nZXRUeXBlKCkuaXNDb3VudGVyKCkpKQorICAgICAgICAgICAgaWYgKGNvbHVtbnMudmFsdWVzKCkuc3RyZWFtKCkuYW55TWF0Y2godCAtPiAhdC50eXBlLmlzQ291bnRlcigpKSkKICAgICAgICAgICAgICAgICB0aHJvdyBpcmUoIkNhbm5vdCBtaXggY291bnRlciBhbmQgbm9uIGNvdW50ZXIgY29sdW1ucyBpbiB0aGUgc2FtZSB0YWJsZSIpOwogCiAgICAgICAgICAgICBpZiAocGFyYW1zLmRlZmF1bHRUaW1lVG9MaXZlID4gMCkKQEAgLTMwNiwzOCArMzE4LDQ0IEBACiAgICAgICAgICAgICAgICAucGFyYW1zKHBhcmFtcyk7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aXRpb25LZXlDb2x1bW5zLnNpemUoKTsgaSsrKQotICAgICAgICAgICAgYnVpbGRlci5hZGRQYXJ0aXRpb25LZXlDb2x1bW4ocGFydGl0aW9uS2V5Q29sdW1ucy5nZXQoaSksIHBhcnRpdGlvbktleVR5cGVzLmdldChpKSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIENvbHVtblByb3BlcnRpZXMgcHJvcGVydGllcyA9IHBhcnRpdGlvbktleUNvbHVtblByb3BlcnRpZXMuZ2V0KGkpOworICAgICAgICAgICAgYnVpbGRlci5hZGRQYXJ0aXRpb25LZXlDb2x1bW4ocGFydGl0aW9uS2V5Q29sdW1ucy5nZXQoaSksIHByb3BlcnRpZXMudHlwZSwgcHJvcGVydGllcy5tYXNrKTsKKyAgICAgICAgfQogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2x1c3RlcmluZ0NvbHVtbnMuc2l6ZSgpOyBpKyspCi0gICAgICAgICAgICBidWlsZGVyLmFkZENsdXN0ZXJpbmdDb2x1bW4oY2x1c3RlcmluZ0NvbHVtbnMuZ2V0KGkpLCBjbHVzdGVyaW5nVHlwZXMuZ2V0KGkpKTsKKyAgICAgICAgeworICAgICAgICAgICAgQ29sdW1uUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gY2x1c3RlcmluZ0NvbHVtblByb3BlcnRpZXMuZ2V0KGkpOworICAgICAgICAgICAgYnVpbGRlci5hZGRDbHVzdGVyaW5nQ29sdW1uKGNsdXN0ZXJpbmdDb2x1bW5zLmdldChpKSwgcHJvcGVydGllcy50eXBlLCBwcm9wZXJ0aWVzLm1hc2spOworICAgICAgICB9CiAKICAgICAgICAgaWYgKHVzZUNvbXBhY3RTdG9yYWdlKQogICAgICAgICB7Ci0gICAgICAgICAgICBmaXh1cENvbXBhY3RUYWJsZShjbHVzdGVyaW5nVHlwZXMsIGNvbHVtbnMsIGhhc0NvdW50ZXJzLCBidWlsZGVyKTsKKyAgICAgICAgICAgIGZpeHVwQ29tcGFjdFRhYmxlKGNsdXN0ZXJpbmdDb2x1bW5Qcm9wZXJ0aWVzLCBjb2x1bW5zLCBoYXNDb3VudGVycywgYnVpbGRlcik7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7Ci0gICAgICAgICAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgdHlwZSkgLT4geworICAgICAgICAgICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIHByb3BlcnRpZXMpIC0+IHsKICAgICAgICAgICAgICAgICBpZiAoc3RhdGljQ29sdW1ucy5jb250YWlucyhjb2x1bW4pKQotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZFN0YXRpY0NvbHVtbihjb2x1bW4sIHR5cGUuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGRTdGF0aWNDb2x1bW4oY29sdW1uLCBwcm9wZXJ0aWVzLnR5cGUsIHByb3BlcnRpZXMubWFzayk7CiAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZFJlZ3VsYXJDb2x1bW4oY29sdW1uLCB0eXBlLmdldFR5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkUmVndWxhckNvbHVtbihjb2x1bW4sIHByb3BlcnRpZXMudHlwZSwgcHJvcGVydGllcy5tYXNrKTsKICAgICAgICAgICAgIH0pOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBidWlsZGVyOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUNvbXBhY3RUYWJsZShMaXN0PEFic3RyYWN0VHlwZTw/Pj4gY2x1c3RlcmluZ1R5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8Q29sdW1uSWRlbnRpZmllciwgQ1FMM1R5cGU+IGNvbHVtbnMpCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ29tcGFjdFRhYmxlKExpc3Q8Q29sdW1uUHJvcGVydGllcz4gY2x1c3RlcmluZ0NvbHVtblByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxDb2x1bW5JZGVudGlmaWVyLCBDb2x1bW5Qcm9wZXJ0aWVzPiBjb2x1bW5zKQogICAgIHsKLSAgICAgICAgYm9vbGVhbiBpc0RlbnNlID0gIWNsdXN0ZXJpbmdUeXBlcy5pc0VtcHR5KCk7CisgICAgICAgIGJvb2xlYW4gaXNEZW5zZSA9ICFjbHVzdGVyaW5nQ29sdW1uUHJvcGVydGllcy5pc0VtcHR5KCk7CiAKLSAgICAgICAgaWYgKGNvbHVtbnMudmFsdWVzKCkuc3RyZWFtKCkuYW55TWF0Y2goYyAtPiBjLmdldFR5cGUoKS5pc011bHRpQ2VsbCgpKSkKKyAgICAgICAgaWYgKGNvbHVtbnMudmFsdWVzKCkuc3RyZWFtKCkuYW55TWF0Y2goYyAtPiBjLnR5cGUuaXNNdWx0aUNlbGwoKSkpCiAgICAgICAgICAgICB0aHJvdyBpcmUoIk5vbi1mcm96ZW4gY29sbGVjdGlvbnMgYW5kIFVEVHMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBDT01QQUNUIFNUT1JBR0UiKTsKICAgICAgICAgaWYgKCFzdGF0aWNDb2x1bW5zLmlzRW1wdHkoKSkKICAgICAgICAgICAgIHRocm93IGlyZSgiU3RhdGljIGNvbHVtbnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gQ09NUEFDVCBTVE9SQUdFIHRhYmxlcyIpOwogCi0gICAgICAgIGlmIChjbHVzdGVyaW5nVHlwZXMuaXNFbXB0eSgpKQorICAgICAgICBpZiAoY2x1c3RlcmluZ0NvbHVtblByb3BlcnRpZXMuaXNFbXB0eSgpKQogICAgICAgICB7CiAgICAgICAgICAgICAvLyBJdCdzIGEgdGhyaWZ0ICJzdGF0aWMgQ0YiIHNvIHRoZXJlIHNob3VsZCBiZSBzb21lIGNvbHVtbnMgZGVmaW5pdGlvbgogICAgICAgICAgICAgaWYgKGNvbHVtbnMuaXNFbXB0eSgpKQpAQCAtMzU5LDggKzM3Nyw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgZml4dXBDb21wYWN0VGFibGUoTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGNsdXN0ZXJpbmdUeXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPENvbHVtbklkZW50aWZpZXIsIENRTDNUeXBlPiBjb2x1bW5zLAorICAgIHByaXZhdGUgdm9pZCBmaXh1cENvbXBhY3RUYWJsZShMaXN0PENvbHVtblByb3BlcnRpZXM+IGNsdXN0ZXJpbmdUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPENvbHVtbklkZW50aWZpZXIsIENvbHVtblByb3BlcnRpZXM+IGNvbHVtbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzQ291bnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEuQnVpbGRlciBidWlsZGVyKQogICAgIHsKQEAgLTM3OSwxMiArMzk3LDEyIEBACiAKICAgICAgICAgYnVpbGRlci5mbGFncyhmbGFncyk7CiAKLSAgICAgICAgY29sdW1ucy5mb3JFYWNoKChuYW1lLCB0eXBlKSAtPiB7CisgICAgICAgIGNvbHVtbnMuZm9yRWFjaCgobmFtZSwgcHJvcGVydGllcykgLT4gewogICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGZvciAic3RhdGljIiBuby1jbHVzdGVyaW5nIGNvbXBhY3Qgc3RvcmFnZSB3ZSB1c2Ugc3RhdGljIGZvciB0aGUgZGVmaW5lZCBjb2x1bW5zCiAgICAgICAgICAgICBpZiAoc3RhdGljQ29sdW1ucy5jb250YWlucyhuYW1lKSB8fCBpc1N0YXRpY0NvbXBhY3QpCi0gICAgICAgICAgICAgICAgYnVpbGRlci5hZGRTdGF0aWNDb2x1bW4obmFtZSwgdHlwZS5nZXRUeXBlKCkpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkU3RhdGljQ29sdW1uKG5hbWUsIHByb3BlcnRpZXMudHlwZSwgcHJvcGVydGllcy5tYXNrKTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFkZFJlZ3VsYXJDb2x1bW4obmFtZSwgdHlwZS5nZXRUeXBlKCkpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkUmVndWxhckNvbHVtbihuYW1lLCBwcm9wZXJ0aWVzLnR5cGUsIHByb3BlcnRpZXMubWFzayk7CiAgICAgICAgIH0pOwogCiAgICAgICAgIERlZmF1bHROYW1lcyBuYW1lcyA9IG5ldyBEZWZhdWx0TmFtZXMoYnVpbGRlci5jb2x1bW5OYW1lcygpKTsKQEAgLTQ2OSw3ICs0ODcsNyBAQAogICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaWZOb3RFeGlzdHM7CiAKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIHVzZUNvbXBhY3RTdG9yYWdlID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWFwPENvbHVtbklkZW50aWZpZXIsIENRTDNUeXBlLlJhdz4gcmF3Q29sdW1ucyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8Q29sdW1uSWRlbnRpZmllciwgQ29sdW1uUHJvcGVydGllcy5SYXc+IHJhd0NvbHVtbnMgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgIHByaXZhdGUgZmluYWwgU2V0PENvbHVtbklkZW50aWZpZXI+IHN0YXRpY0NvbHVtbnMgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxDb2x1bW5JZGVudGlmaWVyPiBjbHVzdGVyaW5nQ29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCkBAIC00OTMsMTUgKzUxMSwxMiBAQAogCiAgICAgICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlU3RhdGVtZW50KGtleXNwYWNlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5nZXROYW1lKCksCi0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Q29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uS2V5Q29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlcmluZ0NvbHVtbnMsCi0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlcmluZ09yZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycywKLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZk5vdEV4aXN0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlQ29tcGFjdFN0b3JhZ2UpOwogICAgICAgICB9CkBAIC01MjIsOSArNTM3LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gbmFtZS5nZXROYW1lKCk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBhZGRDb2x1bW4oQ29sdW1uSWRlbnRpZmllciBjb2x1bW4sIENRTDNUeXBlLlJhdyB0eXBlLCBib29sZWFuIGlzU3RhdGljKQorICAgICAgICBwdWJsaWMgdm9pZCBhZGRDb2x1bW4oQ29sdW1uSWRlbnRpZmllciBjb2x1bW4sIENRTDNUeXBlLlJhdyB0eXBlLCBib29sZWFuIGlzU3RhdGljLCBDb2x1bW5NYXNrLlJhdyBtYXNrKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSByYXdDb2x1bW5zLnB1dChjb2x1bW4sIHR5cGUpKQorCisgICAgICAgICAgICBpZiAobnVsbCAhPSByYXdDb2x1bW5zLnB1dChjb2x1bW4sIG5ldyBDb2x1bW5Qcm9wZXJ0aWVzLlJhdyh0eXBlLCBtYXNrKSkpCiAgICAgICAgICAgICAgICAgdGhyb3cgaXJlKCJEdXBsaWNhdGUgY29sdW1uICclcycgZGVjbGFyYXRpb24gZm9yIHRhYmxlICclcyciLCBjb2x1bW4sIG5hbWUpOwogCiAgICAgICAgICAgICBpZiAoaXNTdGF0aWMpCkBAIC01NjAsNCArNTc2LDUyIEBACiAgICAgICAgICAgICAgICAgdGhyb3cgaXJlKCJEdXBsaWNhdGUgY29sdW1uICclcycgaW4gQ0xVU1RFUklORyBPUkRFUiBCWSBjbGF1c2UgZm9yIHRhYmxlICclcyciLCBjb2x1bW4sIG5hbWUpOwogICAgICAgICB9CiAgICAgfQorCisgICAgLyoqCisgICAgICogQ2xhc3MgZW5jYXBzdWxhdGluZyB0aGUgcHJvcGVydGllcyBvZiBhIGNvbHVtbiwgd2hpY2ggYXJlIGl0cyB0eXBlIGFuZCBtYXNrLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGNsYXNzIENvbHVtblByb3BlcnRpZXMKKyAgICB7CisgICAgICAgIHB1YmxpYyBmaW5hbCBBYnN0cmFjdFR5cGU8Pz4gdHlwZTsKKyAgICAgICAgcHVibGljIGZpbmFsIENRTDNUeXBlIGNxbFR5cGU7IC8vIHdlIGtlZXAgdGhlIG9yaWdpbmFsIENRTCB0eXBlIGZvciBwcmludGluZyBmdWxseSBxdWFsaWZpZWQgdXNlciB0eXBlIG5hbWVzCisKKyAgICAgICAgQE51bGxhYmxlCisgICAgICAgIHB1YmxpYyBmaW5hbCBDb2x1bW5NYXNrIG1hc2s7CisKKyAgICAgICAgcHVibGljIENvbHVtblByb3BlcnRpZXMoQWJzdHJhY3RUeXBlPD8+IHR5cGUsIENRTDNUeXBlIGNxbFR5cGUsIEBOdWxsYWJsZSBDb2x1bW5NYXNrIG1hc2spCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgICAgICB0aGlzLmNxbFR5cGUgPSBjcWxUeXBlOworICAgICAgICAgICAgdGhpcy5tYXNrID0gbWFzazsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb2x1bW5Qcm9wZXJ0aWVzIHdpdGhSZXZlcnNlZFR5cGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbHVtblByb3BlcnRpZXMoUmV2ZXJzZWRUeXBlLmdldEluc3RhbmNlKHR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNxbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzayA9PSBudWxsID8gbnVsbCA6IG1hc2sud2l0aFJldmVyc2VkVHlwZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2xhc3MgUmF3CisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBDUUwzVHlwZS5SYXcgcmF3VHlwZTsKKworICAgICAgICAgICAgQE51bGxhYmxlCisgICAgICAgICAgICBwdWJsaWMgZmluYWwgQ29sdW1uTWFzay5SYXcgcmF3TWFzazsKKworICAgICAgICAgICAgcHVibGljIFJhdyhDUUwzVHlwZS5SYXcgcmF3VHlwZSwgQE51bGxhYmxlIENvbHVtbk1hc2suUmF3IHJhd01hc2spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5yYXdUeXBlID0gcmF3VHlwZTsKKyAgICAgICAgICAgICAgICB0aGlzLnJhd01hc2sgPSByYXdNYXNrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgQ29sdW1uUHJvcGVydGllcyBwcmVwYXJlKFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlLCBDb2x1bW5JZGVudGlmaWVyIGNvbHVtbiwgVHlwZXMgdWR0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDUUwzVHlwZSBjcWxUeXBlID0gcmF3VHlwZS5wcmVwYXJlKGtleXNwYWNlLCB1ZHRzKTsKKyAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdHlwZSA9IGNxbFR5cGUuZ2V0VHlwZSgpOworICAgICAgICAgICAgICAgIENvbHVtbk1hc2sgbWFzayA9IHJhd01hc2sgPT0gbnVsbCA/IG51bGwgOiByYXdNYXNrLnByZXBhcmUoa2V5c3BhY2UsIHRhYmxlLCBjb2x1bW4sIHR5cGUpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29sdW1uUHJvcGVydGllcyh0eXBlLCBjcWxUeXBlLCBtYXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQ3JlYXRlVmlld1N0YXRlbWVudC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9DcmVhdGVWaWV3U3RhdGVtZW50LmphdmEKaW5kZXggMTQ1YzhmYy4uZWQ3YTlhMSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9DcmVhdGVWaWV3U3RhdGVtZW50LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9DcmVhdGVWaWV3U3RhdGVtZW50LmphdmEKQEAgLTUwLDYgKzUwLDcgQEAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXMuY29uY2F0OwogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlcy5maWx0ZXI7CiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLnRyYW5zZm9ybTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5NVl9BTExPV19GSUxURVJJTkdfTk9OS0VZX0NPTFVNTlNfVU5TQUZFOwogCiBwdWJsaWMgZmluYWwgY2xhc3MgQ3JlYXRlVmlld1N0YXRlbWVudCBleHRlbmRzIEFsdGVyU2NoZW1hU3RhdGVtZW50CiB7CkBAIC0xODgsNyArMTg5LDggQEAKICAgICAgICAgICAgICAgICB0aHJvdyBpcmUoIkNhbiBvbmx5IHNlbGVjdCBjb2x1bW5zIGJ5IG5hbWUgd2hlbiBkZWZpbmluZyBhIG1hdGVyaWFsaXplZCB2aWV3IChnb3QgJXMpIiwgc2VsZWN0b3Iuc2VsZWN0YWJsZSk7CiAKICAgICAgICAgICAgIC8vIHdpbGwgdGhyb3cgSVJFIGlmIHRoZSBjb2x1bW4gZG9lc24ndCBleGlzdCBpbiB0aGUgYmFzZSB0YWJsZQotICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEgY29sdW1uID0gKENvbHVtbk1ldGFkYXRhKSBzZWxlY3Rvci5zZWxlY3RhYmxlLnByZXBhcmUodGFibGUpOworICAgICAgICAgICAgU2VsZWN0YWJsZS5SYXdJZGVudGlmaWVyIHJhd0lkZW50aWZpZXIgPSAoU2VsZWN0YWJsZS5SYXdJZGVudGlmaWVyKSBzZWxlY3Rvci5zZWxlY3RhYmxlOworICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEgY29sdW1uID0gcmF3SWRlbnRpZmllci5jb2x1bW5NZXRhZGF0YSh0YWJsZSk7CiAKICAgICAgICAgICAgIHNlbGVjdGVkQ29sdW1ucy5hZGQoY29sdW1uLm5hbWUpOwogICAgICAgICB9KTsKQEAgLTI3Miw3ICsyNzQsOCBAQAogICAgICAgICAgICAgdGhyb3cgaXJlKCJXSEVSRSBjbGF1c2UgZm9yIG1hdGVyaWFsaXplZCB2aWV3ICclcycgY2Fubm90IGNvbnRhaW4gY3VzdG9tIGluZGV4IGV4cHJlc3Npb25zIiwgdmlld05hbWUpOwogCiAgICAgICAgIFN0YXRlbWVudFJlc3RyaWN0aW9ucyByZXN0cmljdGlvbnMgPQotICAgICAgICAgICAgbmV3IFN0YXRlbWVudFJlc3RyaWN0aW9ucyhTdGF0ZW1lbnRUeXBlLlNFTEVDVCwKKyAgICAgICAgICAgIG5ldyBTdGF0ZW1lbnRSZXN0cmljdGlvbnMoc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlbWVudFR5cGUuU0VMRUNULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmVDbGF1c2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlU3BlY2lmaWNhdGlvbnMuZW1wdHkoKSwKQEAgLTI5Miw3ICsyOTUsNyBAQAogCiAgICAgICAgIC8vIFNlZSBDQVNTQU5EUkEtMTM3OTgKICAgICAgICAgU2V0PENvbHVtbk1ldGFkYXRhPiByZXN0cmljdGVkTm9uUHJpbWFyeUtleUNvbHVtbnMgPSByZXN0cmljdGlvbnMubm9uUEtSZXN0cmljdGVkQ29sdW1ucyhmYWxzZSk7Ci0gICAgICAgIGlmICghcmVzdHJpY3RlZE5vblByaW1hcnlLZXlDb2x1bW5zLmlzRW1wdHkoKSAmJiAhQm9vbGVhbi5nZXRCb29sZWFuKCJjYXNzYW5kcmEubXYuYWxsb3dfZmlsdGVyaW5nX25vbmtleV9jb2x1bW5zX3Vuc2FmZSIpKQorICAgICAgICBpZiAoIXJlc3RyaWN0ZWROb25QcmltYXJ5S2V5Q29sdW1ucy5pc0VtcHR5KCkgJiYgIU1WX0FMTE9XX0ZJTFRFUklOR19OT05LRVlfQ09MVU1OU19VTlNBRkUuZ2V0Qm9vbGVhbigpKQogICAgICAgICB7CiAgICAgICAgICAgICB0aHJvdyBpcmUoIk5vbi1wcmltYXJ5IGtleSBjb2x1bW5zIGNhbiBvbmx5IGJlIHJlc3RyaWN0ZWQgd2l0aCAnSVMgTk9UIE5VTEwnIChnb3Q6ICVzIHJlc3RyaWN0ZWQgaWxsZWdhbGx5KSIsCiAgICAgICAgICAgICAgICAgICAgICAgam9pbigiLCIsIHRyYW5zZm9ybShyZXN0cmljdGVkTm9uUHJpbWFyeUtleUNvbHVtbnMsIENvbHVtbk1ldGFkYXRhOjp0b1N0cmluZykpKTsKQEAgLTMyNCwxMiArMzI3LDE4IEBACiAgICAgICAgIGJ1aWxkZXIucGFyYW1zKGF0dHJzLmFzTmV3VGFibGVQYXJhbXMoKSkKICAgICAgICAgICAgICAgIC5raW5kKFRhYmxlTWV0YWRhdGEuS2luZC5WSUVXKTsKIAotICAgICAgICBwYXJ0aXRpb25LZXlDb2x1bW5zLmZvckVhY2gobmFtZSAtPiBidWlsZGVyLmFkZFBhcnRpdGlvbktleUNvbHVtbihuYW1lLCBnZXRUeXBlKHRhYmxlLCBuYW1lKSkpOwotICAgICAgICBjbHVzdGVyaW5nQ29sdW1ucy5mb3JFYWNoKG5hbWUgLT4gYnVpbGRlci5hZGRDbHVzdGVyaW5nQ29sdW1uKG5hbWUsIGdldFR5cGUodGFibGUsIG5hbWUpKSk7CisgICAgICAgIHBhcnRpdGlvbktleUNvbHVtbnMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAodGFibGU6OmdldENvbHVtbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGNvbHVtbiAtPiBidWlsZGVyLmFkZFBhcnRpdGlvbktleUNvbHVtbihjb2x1bW4ubmFtZSwgZ2V0VHlwZShjb2x1bW4pLCBjb2x1bW4uZ2V0TWFzaygpKSk7CisKKyAgICAgICAgY2x1c3RlcmluZ0NvbHVtbnMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKHRhYmxlOjpnZXRDb2x1bW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goY29sdW1uIC0+IGJ1aWxkZXIuYWRkQ2x1c3RlcmluZ0NvbHVtbihjb2x1bW4ubmFtZSwgZ2V0VHlwZShjb2x1bW4pLCBjb2x1bW4uZ2V0TWFzaygpKSk7CiAKICAgICAgICAgc2VsZWN0ZWRDb2x1bW5zLnN0cmVhbSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIobmFtZSAtPiAhcHJpbWFyeUtleUNvbHVtbnMuY29udGFpbnMobmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKG5hbWUgLT4gYnVpbGRlci5hZGRSZWd1bGFyQ29sdW1uKG5hbWUsIGdldFR5cGUodGFibGUsIG5hbWUpKSk7CisgICAgICAgICAgICAgICAgICAgICAgIC5tYXAodGFibGU6OmdldENvbHVtbikKKyAgICAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goY29sdW1uIC0+IGJ1aWxkZXIuYWRkUmVndWxhckNvbHVtbihjb2x1bW4ubmFtZSwgZ2V0VHlwZShjb2x1bW4pLCBjb2x1bW4uZ2V0TWFzaygpKSk7CiAKICAgICAgICAgVmlld01ldGFkYXRhIHZpZXcgPSBuZXcgVmlld01ldGFkYXRhKHRhYmxlLmlkLCB0YWJsZS5uYW1lLCByYXdDb2x1bW5zLmlzRW1wdHkoKSwgd2hlcmVDbGF1c2UsIGJ1aWxkZXIuYnVpbGQoKSk7CiAgICAgICAgIHZpZXcubWV0YWRhdGEudmFsaWRhdGUoKTsKQEAgLTM0NywxNSArMzU2LDE1IEBACiAgICAgICAgIGNsaWVudC5lbnN1cmVUYWJsZVBlcm1pc3Npb24oa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsIFBlcm1pc3Npb24uQUxURVIpOwogICAgIH0KIAotICAgIHByaXZhdGUgQWJzdHJhY3RUeXBlPD8+IGdldFR5cGUoVGFibGVNZXRhZGF0YSB0YWJsZSwgQ29sdW1uSWRlbnRpZmllciBuYW1lKQorICAgIHByaXZhdGUgQWJzdHJhY3RUeXBlPD8+IGdldFR5cGUoQ29sdW1uTWV0YWRhdGEgY29sdW1uKQogICAgIHsKLSAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHR5cGUgPSB0YWJsZS5nZXRDb2x1bW4obmFtZSkudHlwZTsKLSAgICAgICAgaWYgKGNsdXN0ZXJpbmdPcmRlci5jb250YWluc0tleShuYW1lKSkKKyAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHR5cGUgPSBjb2x1bW4udHlwZTsKKyAgICAgICAgaWYgKGNsdXN0ZXJpbmdPcmRlci5jb250YWluc0tleShjb2x1bW4ubmFtZSkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gcmV2ZXJzZSA9ICFjbHVzdGVyaW5nT3JkZXIuZ2V0KG5hbWUpOworICAgICAgICAgICAgYm9vbGVhbiByZXZlcnNlID0gIWNsdXN0ZXJpbmdPcmRlci5nZXQoY29sdW1uLm5hbWUpOwogCiAgICAgICAgICAgICBpZiAodHlwZS5pc1JldmVyc2VkKCkgJiYgIXJldmVyc2UpCi0gICAgICAgICAgICAgICAgcmV0dXJuICgoUmV2ZXJzZWRUeXBlKSB0eXBlKS5iYXNlVHlwZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChSZXZlcnNlZFR5cGU8Pz4pIHR5cGUpLmJhc2VUeXBlOwogCiAgICAgICAgICAgICBpZiAoIXR5cGUuaXNSZXZlcnNlZCgpICYmIHJldmVyc2UpCiAgICAgICAgICAgICAgICAgcmV0dXJuIFJldmVyc2VkVHlwZS5nZXRJbnN0YW5jZSh0eXBlKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvRHJvcEFnZ3JlZ2F0ZVN0YXRlbWVudC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9Ecm9wQWdncmVnYXRlU3RhdGVtZW50LmphdmEKaW5kZXggMGNiMWNiZS4uMTg2ODkxZSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9Ecm9wQWdncmVnYXRlU3RhdGVtZW50LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9Ecm9wQWdncmVnYXRlU3RhdGVtZW50LmphdmEKQEAgLTI4LDkgKzI4LDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLlBlcm1pc3Npb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUwzVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFN0YXRlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbk5hbWU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuVURBZ2dyZWdhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuVXNlckZ1bmN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZXMuS2V5c3BhY2VzRGlmZjsKQEAgLTgwLDcgKzgwLDcgQEAKICAgICAgICAgICAgIHRocm93IGlyZSgiQWdncmVnYXRlICclcycgZG9lc24ndCBleGlzdCIsIG5hbWUpOwogICAgICAgICB9CiAKLSAgICAgICAgQ29sbGVjdGlvbjxGdW5jdGlvbj4gYWdncmVnYXRlcyA9IGtleXNwYWNlLmZ1bmN0aW9ucy5nZXQobmV3IEZ1bmN0aW9uTmFtZShrZXlzcGFjZU5hbWUsIGFnZ3JlZ2F0ZU5hbWUpKTsKKyAgICAgICAgQ29sbGVjdGlvbjxVc2VyRnVuY3Rpb24+IGFnZ3JlZ2F0ZXMgPSBrZXlzcGFjZS51c2VyRnVuY3Rpb25zLmdldChuZXcgRnVuY3Rpb25OYW1lKGtleXNwYWNlTmFtZSwgYWdncmVnYXRlTmFtZSkpOwogICAgICAgICBpZiAoYWdncmVnYXRlcy5zaXplKCkgPiAxICYmICFhcmd1bWVudHNTcGVmaWNpZWQpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRocm93IGlyZSgiJ0RST1AgQUdHUkVHQVRFICVzJyBtYXRjaGVzIG11bHRpcGxlIGZ1bmN0aW9uIGRlZmluaXRpb25zOyAiICsKQEAgLTk3LDExICs5NywxMSBAQAogCiAgICAgICAgIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBhcmd1bWVudFR5cGVzID0gcHJlcGFyZUFyZ3VtZW50VHlwZXMoa2V5c3BhY2UudHlwZXMpOwogCi0gICAgICAgIFByZWRpY2F0ZTxGdW5jdGlvbj4gZmlsdGVyID0gRnVuY3Rpb25zLkZpbHRlci5VREE7CisgICAgICAgIFByZWRpY2F0ZTxVc2VyRnVuY3Rpb24+IGZpbHRlciA9IFVzZXJGdW5jdGlvbnMuRmlsdGVyLlVEQTsKICAgICAgICAgaWYgKGFyZ3VtZW50c1NwZWZpY2llZCkKLSAgICAgICAgICAgIGZpbHRlciA9IGZpbHRlci5hbmQoZiAtPiBGdW5jdGlvbnMudHlwZXNNYXRjaChmLmFyZ1R5cGVzKCksIGFyZ3VtZW50VHlwZXMpKTsKKyAgICAgICAgICAgIGZpbHRlciA9IGZpbHRlci5hbmQoZiAtPiBmLnR5cGVzTWF0Y2goYXJndW1lbnRUeXBlcykpOwogCi0gICAgICAgIEZ1bmN0aW9uIGFnZ3JlZ2F0ZSA9IGFnZ3JlZ2F0ZXMuc3RyZWFtKCkuZmlsdGVyKGZpbHRlcikuZmluZEFueSgpLm9yRWxzZShudWxsKTsKKyAgICAgICAgVXNlckZ1bmN0aW9uIGFnZ3JlZ2F0ZSA9IGFnZ3JlZ2F0ZXMuc3RyZWFtKCkuZmlsdGVyKGZpbHRlcikuZmluZEFueSgpLm9yRWxzZShudWxsKTsKICAgICAgICAgaWYgKG51bGwgPT0gYWdncmVnYXRlKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoaWZFeGlzdHMpCkBAIC0xMTAsMTIgKzExMCwxMiBAQAogICAgICAgICAgICAgdGhyb3cgaXJlKCJBZ2dyZWdhdGUgJyVzJyBkb2Vzbid0IGV4aXN0IiwgbmFtZSk7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gc2NoZW1hLndpdGhBZGRlZE9yVXBkYXRlZChrZXlzcGFjZS53aXRoU3dhcHBlZChrZXlzcGFjZS5mdW5jdGlvbnMud2l0aG91dChhZ2dyZWdhdGUpKSk7CisgICAgICAgIHJldHVybiBzY2hlbWEud2l0aEFkZGVkT3JVcGRhdGVkKGtleXNwYWNlLndpdGhTd2FwcGVkKGtleXNwYWNlLnVzZXJGdW5jdGlvbnMud2l0aG91dChhZ2dyZWdhdGUpKSk7CiAgICAgfQogCiAgICAgU2NoZW1hQ2hhbmdlIHNjaGVtYUNoYW5nZUV2ZW50KEtleXNwYWNlc0RpZmYgZGlmZikKICAgICB7Ci0gICAgICAgIEZ1bmN0aW9ucyBkcm9wcGVkID0gZGlmZi5hbHRlcmVkLmdldCgwKS51ZGFzLmRyb3BwZWQ7CisgICAgICAgIFVzZXJGdW5jdGlvbnMgZHJvcHBlZCA9IGRpZmYuYWx0ZXJlZC5nZXQoMCkudWRhcy5kcm9wcGVkOwogICAgICAgICBhc3NlcnQgZHJvcHBlZC5zaXplKCkgPT0gMTsKICAgICAgICAgcmV0dXJuIFNjaGVtYUNoYW5nZS5mb3JBZ2dyZWdhdGUoQ2hhbmdlLkRST1BQRUQsIChVREFnZ3JlZ2F0ZSkgZHJvcHBlZC5pdGVyYXRvcigpLm5leHQoKSk7CiAgICAgfQpAQCAtMTI2LDkgKzEyNiw5IEBACiAgICAgICAgIGlmIChudWxsID09IGtleXNwYWNlKQogICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIFN0cmVhbTxGdW5jdGlvbj4gZnVuY3Rpb25zID0ga2V5c3BhY2UuZnVuY3Rpb25zLmdldChuZXcgRnVuY3Rpb25OYW1lKGtleXNwYWNlTmFtZSwgYWdncmVnYXRlTmFtZSkpLnN0cmVhbSgpOworICAgICAgICBTdHJlYW08VXNlckZ1bmN0aW9uPiBmdW5jdGlvbnMgPSBrZXlzcGFjZS51c2VyRnVuY3Rpb25zLmdldChuZXcgRnVuY3Rpb25OYW1lKGtleXNwYWNlTmFtZSwgYWdncmVnYXRlTmFtZSkpLnN0cmVhbSgpOwogICAgICAgICBpZiAoYXJndW1lbnRzU3BlZmljaWVkKQotICAgICAgICAgICAgZnVuY3Rpb25zID0gZnVuY3Rpb25zLmZpbHRlcihmIC0+IEZ1bmN0aW9ucy50eXBlc01hdGNoKGYuYXJnVHlwZXMoKSwgcHJlcGFyZUFyZ3VtZW50VHlwZXMoa2V5c3BhY2UudHlwZXMpKSk7CisgICAgICAgICAgICBmdW5jdGlvbnMgPSBmdW5jdGlvbnMuZmlsdGVyKGYgLT4gZi50eXBlc01hdGNoKHByZXBhcmVBcmd1bWVudFR5cGVzKGtleXNwYWNlLnR5cGVzKSkpOwogCiAgICAgICAgIGZ1bmN0aW9ucy5mb3JFYWNoKGYgLT4gY2xpZW50LmVuc3VyZVBlcm1pc3Npb24oUGVybWlzc2lvbi5EUk9QLCBGdW5jdGlvblJlc291cmNlLmZ1bmN0aW9uKGYpKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9Ecm9wRnVuY3Rpb25TdGF0ZW1lbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvRHJvcEZ1bmN0aW9uU3RhdGVtZW50LmphdmEKaW5kZXggZDlkNjM3ZC4uZTc0M2ExYSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9Ecm9wRnVuY3Rpb25TdGF0ZW1lbnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0Ryb3BGdW5jdGlvblN0YXRlbWVudC5qYXZhCkBAIC0yOCw3ICsyOCw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5QZXJtaXNzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbk5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuVURGdW5jdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5Vc2VyRnVuY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlcy5LZXlzcGFjZXNEaWZmOwpAQCAtNzksNyArODEsNyBAQAogICAgICAgICAgICAgdGhyb3cgaXJlKCJGdW5jdGlvbiAnJXMnIGRvZXNuJ3QgZXhpc3QiLCBuYW1lKTsKICAgICAgICAgfQogCi0gICAgICAgIENvbGxlY3Rpb248RnVuY3Rpb24+IGZ1bmN0aW9ucyA9IGtleXNwYWNlLmZ1bmN0aW9ucy5nZXQobmV3IEZ1bmN0aW9uTmFtZShrZXlzcGFjZU5hbWUsIGZ1bmN0aW9uTmFtZSkpOworICAgICAgICBDb2xsZWN0aW9uPFVzZXJGdW5jdGlvbj4gZnVuY3Rpb25zID0ga2V5c3BhY2UudXNlckZ1bmN0aW9ucy5nZXQobmV3IEZ1bmN0aW9uTmFtZShrZXlzcGFjZU5hbWUsIGZ1bmN0aW9uTmFtZSkpOwogICAgICAgICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDEgJiYgIWFyZ3VtZW50c1NwZWZpY2llZCkKICAgICAgICAgewogICAgICAgICAgICAgdGhyb3cgaXJlKCInRFJPUCBGVU5DVElPTiAlcycgbWF0Y2hlcyBtdWx0aXBsZSBmdW5jdGlvbiBkZWZpbml0aW9uczsgIiArCkBAIC05NiwxMSArOTgsMTEgQEAKIAogICAgICAgICBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJndW1lbnRUeXBlcyA9IHByZXBhcmVBcmd1bWVudFR5cGVzKGtleXNwYWNlLnR5cGVzKTsKIAotICAgICAgICBQcmVkaWNhdGU8RnVuY3Rpb24+IGZpbHRlciA9IEZ1bmN0aW9ucy5GaWx0ZXIuVURGOworICAgICAgICBQcmVkaWNhdGU8VXNlckZ1bmN0aW9uPiBmaWx0ZXIgPSBVc2VyRnVuY3Rpb25zLkZpbHRlci5VREY7CiAgICAgICAgIGlmIChhcmd1bWVudHNTcGVmaWNpZWQpCi0gICAgICAgICAgICBmaWx0ZXIgPSBmaWx0ZXIuYW5kKGYgLT4gRnVuY3Rpb25zLnR5cGVzTWF0Y2goZi5hcmdUeXBlcygpLCBhcmd1bWVudFR5cGVzKSk7CisgICAgICAgICAgICBmaWx0ZXIgPSBmaWx0ZXIuYW5kKGYgLT4gZi50eXBlc01hdGNoKGFyZ3VtZW50VHlwZXMpKTsKIAotICAgICAgICBGdW5jdGlvbiBmdW5jdGlvbiA9IGZ1bmN0aW9ucy5zdHJlYW0oKS5maWx0ZXIoZmlsdGVyKS5maW5kQW55KCkub3JFbHNlKG51bGwpOworICAgICAgICBVc2VyRnVuY3Rpb24gZnVuY3Rpb24gPSBmdW5jdGlvbnMuc3RyZWFtKCkuZmlsdGVyKGZpbHRlcikuZmluZEFueSgpLm9yRWxzZShudWxsKTsKICAgICAgICAgaWYgKG51bGwgPT0gZnVuY3Rpb24pCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChpZkV4aXN0cykKQEAgLTExMCw3ICsxMTIsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgU3RyaW5nIGRlcGVuZGVudEFnZ3JlZ2F0ZXMgPQotICAgICAgICAgICAga2V5c3BhY2UuZnVuY3Rpb25zCisgICAgICAgICAgICBrZXlzcGFjZS51c2VyRnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgIC5hZ2dyZWdhdGVzVXNpbmdGdW5jdGlvbihmdW5jdGlvbikKICAgICAgICAgICAgICAgICAgICAgLm1hcChhIC0+IGEubmFtZSgpLnRvU3RyaW5nKCkpCiAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KGpvaW5pbmcoIiwgIikpOwpAQCAtMTE4LDEyICsxMjAsMTkgQEAKICAgICAgICAgaWYgKCFkZXBlbmRlbnRBZ2dyZWdhdGVzLmlzRW1wdHkoKSkKICAgICAgICAgICAgIHRocm93IGlyZSgiRnVuY3Rpb24gJyVzJyBpcyBzdGlsbCByZWZlcmVuY2VkIGJ5IGFnZ3JlZ2F0ZXMgJXMiLCBuYW1lLCBkZXBlbmRlbnRBZ2dyZWdhdGVzKTsKIAotICAgICAgICByZXR1cm4gc2NoZW1hLndpdGhBZGRlZE9yVXBkYXRlZChrZXlzcGFjZS53aXRoU3dhcHBlZChrZXlzcGFjZS5mdW5jdGlvbnMud2l0aG91dChmdW5jdGlvbikpKTsKKyAgICAgICAgU3RyaW5nIGRlcGVuZGVudFRhYmxlcyA9IGtleXNwYWNlLnRhYmxlc1VzaW5nRnVuY3Rpb24oZnVuY3Rpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAodGFibGUgLT4gdGFibGUubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3Qoam9pbmluZygiLCAiKSk7CisKKyAgICAgICAgaWYgKCFkZXBlbmRlbnRUYWJsZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgdGhyb3cgaXJlKCJGdW5jdGlvbiAnJXMnIGlzIHN0aWxsIHJlZmVyZW5jZWQgYnkgY29sdW1uIG1hc2tzIGluIHRhYmxlcyAlcyIsIG5hbWUsIGRlcGVuZGVudFRhYmxlcyk7CisKKyAgICAgICAgcmV0dXJuIHNjaGVtYS53aXRoQWRkZWRPclVwZGF0ZWQoa2V5c3BhY2Uud2l0aFN3YXBwZWQoa2V5c3BhY2UudXNlckZ1bmN0aW9ucy53aXRob3V0KGZ1bmN0aW9uKSkpOwogICAgIH0KIAogICAgIFNjaGVtYUNoYW5nZSBzY2hlbWFDaGFuZ2VFdmVudChLZXlzcGFjZXNEaWZmIGRpZmYpCiAgICAgewotICAgICAgICBGdW5jdGlvbnMgZHJvcHBlZCA9IGRpZmYuYWx0ZXJlZC5nZXQoMCkudWRmcy5kcm9wcGVkOworICAgICAgICBVc2VyRnVuY3Rpb25zIGRyb3BwZWQgPSBkaWZmLmFsdGVyZWQuZ2V0KDApLnVkZnMuZHJvcHBlZDsKICAgICAgICAgYXNzZXJ0IGRyb3BwZWQuc2l6ZSgpID09IDE7CiAgICAgICAgIHJldHVybiBTY2hlbWFDaGFuZ2UuZm9yRnVuY3Rpb24oQ2hhbmdlLkRST1BQRUQsIChVREZ1bmN0aW9uKSBkcm9wcGVkLml0ZXJhdG9yKCkubmV4dCgpKTsKICAgICB9CkBAIC0xMzQsOSArMTQzLDkgQEAKICAgICAgICAgaWYgKG51bGwgPT0ga2V5c3BhY2UpCiAgICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgU3RyZWFtPEZ1bmN0aW9uPiBmdW5jdGlvbnMgPSBrZXlzcGFjZS5mdW5jdGlvbnMuZ2V0KG5ldyBGdW5jdGlvbk5hbWUoa2V5c3BhY2VOYW1lLCBmdW5jdGlvbk5hbWUpKS5zdHJlYW0oKTsKKyAgICAgICAgU3RyZWFtPFVzZXJGdW5jdGlvbj4gZnVuY3Rpb25zID0ga2V5c3BhY2UudXNlckZ1bmN0aW9ucy5nZXQobmV3IEZ1bmN0aW9uTmFtZShrZXlzcGFjZU5hbWUsIGZ1bmN0aW9uTmFtZSkpLnN0cmVhbSgpOwogICAgICAgICBpZiAoYXJndW1lbnRzU3BlZmljaWVkKQotICAgICAgICAgICAgZnVuY3Rpb25zID0gZnVuY3Rpb25zLmZpbHRlcihmIC0+IEZ1bmN0aW9ucy50eXBlc01hdGNoKGYuYXJnVHlwZXMoKSwgcHJlcGFyZUFyZ3VtZW50VHlwZXMoa2V5c3BhY2UudHlwZXMpKSk7CisgICAgICAgICAgICBmdW5jdGlvbnMgPSBmdW5jdGlvbnMuZmlsdGVyKGYgLT4gZi50eXBlc01hdGNoKHByZXBhcmVBcmd1bWVudFR5cGVzKGtleXNwYWNlLnR5cGVzKSkpOwogCiAgICAgICAgIGZ1bmN0aW9ucy5mb3JFYWNoKGYgLT4gY2xpZW50LmVuc3VyZVBlcm1pc3Npb24oUGVybWlzc2lvbi5EUk9QLCBGdW5jdGlvblJlc291cmNlLmZ1bmN0aW9uKGYpKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9Ecm9wS2V5c3BhY2VTdGF0ZW1lbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvRHJvcEtleXNwYWNlU3RhdGVtZW50LmphdmEKaW5kZXggZjJiZDMwYi4uNDdlNTE0YSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9Ecm9wS2V5c3BhY2VTdGF0ZW1lbnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0Ryb3BLZXlzcGFjZVN0YXRlbWVudC5qYXZhCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXVkaXQuQXVkaXRMb2dFbnRyeVR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5QZXJtaXNzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMU3RhdGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHMuR3VhcmRyYWlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZXMuS2V5c3BhY2VzRGlmZjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNsaWVudFN0YXRlOwpAQCAtMzksNiArNDAsOCBAQAogCiAgICAgcHVibGljIEtleXNwYWNlcyBhcHBseShLZXlzcGFjZXMgc2NoZW1hKQogICAgIHsKKyAgICAgICAgR3VhcmRyYWlscy5kcm9wS2V5c3BhY2VFbmFibGVkLmVuc3VyZUVuYWJsZWQoc3RhdGUpOworCiAgICAgICAgIGlmIChzY2hlbWEuY29udGFpbnNLZXlzcGFjZShrZXlzcGFjZU5hbWUpKQogICAgICAgICAgICAgcmV0dXJuIHNjaGVtYS53aXRob3V0KGtleXNwYWNlTmFtZSk7CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvRHJvcFR5cGVTdGF0ZW1lbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvRHJvcFR5cGVTdGF0ZW1lbnQuamF2YQppbmRleCBkMTg4YmRiLi45NzgzMGM4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0Ryb3BUeXBlU3RhdGVtZW50LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9Ecm9wVHlwZVN0YXRlbWVudC5qYXZhCkBAIC0yNCw3ICsyNCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5QZXJtaXNzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMU3RhdGVtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVVROYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLlVzZXJGdW5jdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVzZXJUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZXMuS2V5c3BhY2VzRGlmZjsKQEAgLTgyLDcgKzgyLDcgQEAKICAgICAgICAgICogMikgb3RoZXIgdXNlciB0eXBlIHRoYXQgY2FuIG5lc3QgdGhlIG9uZSB3ZSBkcm9wIGFuZAogICAgICAgICAgKiAzKSBleGlzdGluZyB0YWJsZXMgcmVmZXJlbmNpbmcgdGhlIHR5cGUgKG1heWJlIGluIGEgbmVzdGVkIHdheSkuCiAgICAgICAgICAqLwotICAgICAgICBJdGVyYWJsZTxGdW5jdGlvbj4gZnVuY3Rpb25zID0ga2V5c3BhY2UuZnVuY3Rpb25zLnJlZmVyZW5jaW5nVXNlclR5cGUobmFtZSk7CisgICAgICAgIEl0ZXJhYmxlPFVzZXJGdW5jdGlvbj4gZnVuY3Rpb25zID0ga2V5c3BhY2UudXNlckZ1bmN0aW9ucy5yZWZlcmVuY2luZ1VzZXJUeXBlKG5hbWUpOwogICAgICAgICBpZiAoIWlzRW1wdHkoZnVuY3Rpb25zKSkKICAgICAgICAgewogICAgICAgICAgICAgdGhyb3cgaXJlKCJDYW5ub3QgZHJvcCB1c2VyIHR5cGUgJyVzLiVzJyBhcyBpdCBpcyBzdGlsbCB1c2VkIGJ5IGZ1bmN0aW9ucyAlcyIsCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0tleXNwYWNlQXR0cmlidXRlcy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9LZXlzcGFjZUF0dHJpYnV0ZXMuamF2YQppbmRleCA0MmZjYWY0Li5kNGQ1Yjk4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0tleXNwYWNlQXR0cmlidXRlcy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvS2V5c3BhY2VBdHRyaWJ1dGVzLmphdmEKQEAgLTUwLDcgKzUwLDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJNaXNzaW5nIHJlcGxpY2F0aW9uIHN0cmF0ZWd5IGNsYXNzIik7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UmVwbGljYXRpb25TdHJhdGVneUNsYXNzKCkKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcGxpY2F0aW9uU3RyYXRlZ3lDbGFzcygpCiAgICAgewogICAgICAgICByZXR1cm4gZ2V0QWxsUmVwbGljYXRpb25PcHRpb25zKCkuZ2V0KFJlcGxpY2F0aW9uUGFyYW1zLkNMQVNTKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL1RhYmxlQXR0cmlidXRlcy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9UYWJsZUF0dHJpYnV0ZXMuamF2YQppbmRleCA4MjlhNTNhLi5jNTVkNzllIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL1RhYmxlQXR0cmlidXRlcy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvVGFibGVBdHRyaWJ1dGVzLmphdmEKQEAgLTI1LDcgKzI1LDYgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc3RhdGVtZW50cy5Qcm9wZXJ0eURlZmluaXRpb25zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlN5bnRheEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ2FjaGluZ1BhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29tcGFjdGlvblBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29tcHJlc3Npb25QYXJhbXM7CkBAIC0zNyw2ICszNiw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5yZWFkcy5yZXBhaXIuUmVhZFJlcGFpclN0cmF0ZWd5OwogCiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVQYXJhbXMuT3B0aW9uLio7CiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBUYWJsZUF0dHJpYnV0ZXMgZXh0ZW5kcyBQcm9wZXJ0eURlZmluaXRpb25zCiB7CkBAIC03NCw3ICs3NCw3IEBACiAKICAgICBwdWJsaWMgVGFibGVJZCBnZXRJZCgpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCiAgICAgewotICAgICAgICBTdHJpbmcgaWQgPSBnZXRTaW1wbGUoSUQpOworICAgICAgICBTdHJpbmcgaWQgPSBnZXRTdHJpbmcoSUQpOwogICAgICAgICB0cnkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIGlkICE9IG51bGwgPyBUYWJsZUlkLmZyb21TdHJpbmcoaWQpIDogbnVsbDsKQEAgLTk3LDExMSArOTcsODEgQEAKIAogICAgIHByaXZhdGUgVGFibGVQYXJhbXMgYnVpbGQoVGFibGVQYXJhbXMuQnVpbGRlciBidWlsZGVyKQogICAgIHsKLSAgICAgICAgaWYgKGhhc09wdGlvbihPcHRpb24uQkxPT01fRklMVEVSX0ZQX0NIQU5DRSkpCi0gICAgICAgICAgICBidWlsZGVyLmJsb29tRmlsdGVyRnBDaGFuY2UoZ2V0RG91YmxlKE9wdGlvbi5CTE9PTV9GSUxURVJfRlBfQ0hBTkNFKSk7CisgICAgICAgIGlmIChoYXNPcHRpb24oT3B0aW9uLkFMTE9XX0FVVE9fU05BUFNIT1QpKQorICAgICAgICAgICAgYnVpbGRlci5hbGxvd0F1dG9TbmFwc2hvdChnZXRCb29sZWFuKE9wdGlvbi5BTExPV19BVVRPX1NOQVBTSE9ULnRvU3RyaW5nKCksIHRydWUpKTsKIAotICAgICAgICBpZiAoaGFzT3B0aW9uKE9wdGlvbi5DQUNISU5HKSkKLSAgICAgICAgICAgIGJ1aWxkZXIuY2FjaGluZyhDYWNoaW5nUGFyYW1zLmZyb21NYXAoZ2V0TWFwKE9wdGlvbi5DQUNISU5HKSkpOworICAgICAgICBpZiAoaGFzT3B0aW9uKEJMT09NX0ZJTFRFUl9GUF9DSEFOQ0UpKQorICAgICAgICAgICAgYnVpbGRlci5ibG9vbUZpbHRlckZwQ2hhbmNlKGdldERvdWJsZShCTE9PTV9GSUxURVJfRlBfQ0hBTkNFKSk7CiAKLSAgICAgICAgaWYgKGhhc09wdGlvbihPcHRpb24uQ09NTUVOVCkpCi0gICAgICAgICAgICBidWlsZGVyLmNvbW1lbnQoZ2V0U3RyaW5nKE9wdGlvbi5DT01NRU5UKSk7CisgICAgICAgIGlmIChoYXNPcHRpb24oQ0FDSElORykpCisgICAgICAgICAgICBidWlsZGVyLmNhY2hpbmcoQ2FjaGluZ1BhcmFtcy5mcm9tTWFwKGdldE1hcChDQUNISU5HKSkpOwogCi0gICAgICAgIGlmIChoYXNPcHRpb24oT3B0aW9uLkNPTVBBQ1RJT04pKQotICAgICAgICAgICAgYnVpbGRlci5jb21wYWN0aW9uKENvbXBhY3Rpb25QYXJhbXMuZnJvbU1hcChnZXRNYXAoT3B0aW9uLkNPTVBBQ1RJT04pKSk7CisgICAgICAgIGlmIChoYXNPcHRpb24oQ09NTUVOVCkpCisgICAgICAgICAgICBidWlsZGVyLmNvbW1lbnQoZ2V0U3RyaW5nKENPTU1FTlQpKTsKIAotICAgICAgICBpZiAoaGFzT3B0aW9uKE9wdGlvbi5DT01QUkVTU0lPTikpCisgICAgICAgIGlmIChoYXNPcHRpb24oQ09NUEFDVElPTikpCisgICAgICAgICAgICBidWlsZGVyLmNvbXBhY3Rpb24oQ29tcGFjdGlvblBhcmFtcy5mcm9tTWFwKGdldE1hcChDT01QQUNUSU9OKSkpOworCisgICAgICAgIGlmIChoYXNPcHRpb24oQ09NUFJFU1NJT04pKQogICAgICAgICB7Ci0gICAgICAgICAgICAvL2NyY19jaGVja19jaGFuY2Ugd2FzICJwcm9tb3RlZCIgZnJvbSBhIGNvbXByZXNzaW9uIHByb3BlcnR5IHRvIGEgdG9wLWxldmVsLXByb3BlcnR5IGFmdGVyICM5ODM5CisgICAgICAgICAgICAvL2NyY19jaGVja19jaGFuY2Ugd2FzICJwcm9tb3RlZCIgZnJvbSBhIGNvbXByZXNzaW9uIHByb3BlcnR5IHRvIGEgdG9wLWxldmVsLXByb3BlcnR5IGFmdGVyICM5ODM5LAogICAgICAgICAgICAgLy9zbyB3ZSB0ZW1wb3JhcmlseSBhY2NlcHQgaXQgdG8gYmUgZGVmaW5lZCBhcyBhIGNvbXByZXNzaW9uIG9wdGlvbiwgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gY29tcHJlc3Npb25PcHRzID0gZ2V0TWFwKE9wdGlvbi5DT01QUkVTU0lPTik7Ci0gICAgICAgICAgICBpZiAoY29tcHJlc3Npb25PcHRzLmNvbnRhaW5zS2V5KE9wdGlvbi5DUkNfQ0hFQ0tfQ0hBTkNFLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkpCisgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbXByZXNzaW9uT3B0cyA9IGdldE1hcChDT01QUkVTU0lPTik7CisgICAgICAgICAgICBpZiAoY29tcHJlc3Npb25PcHRzLmNvbnRhaW5zS2V5KENSQ19DSEVDS19DSEFOQ0UudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEb3VibGUgY3JjQ2hlY2tDaGFuY2UgPSBnZXREZXByZWNhdGVkQ3JjQ2hlY2tDaGFuY2UoY29tcHJlc3Npb25PcHRzKTsKKyAgICAgICAgICAgICAgICBkb3VibGUgY3JjQ2hlY2tDaGFuY2UgPSBnZXREZXByZWNhdGVkQ3JjQ2hlY2tDaGFuY2UoY29tcHJlc3Npb25PcHRzKTsKICAgICAgICAgICAgICAgICBidWlsZGVyLmNyY0NoZWNrQ2hhbmNlKGNyY0NoZWNrQ2hhbmNlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuY29tcHJlc3Npb24oQ29tcHJlc3Npb25QYXJhbXMuZnJvbU1hcChnZXRNYXAoT3B0aW9uLkNPTVBSRVNTSU9OKSkpOworICAgICAgICAgICAgYnVpbGRlci5jb21wcmVzc2lvbihDb21wcmVzc2lvblBhcmFtcy5mcm9tTWFwKGdldE1hcChDT01QUkVTU0lPTikpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChoYXNPcHRpb24oT3B0aW9uLk1FTVRBQkxFKSkKICAgICAgICAgICAgIGJ1aWxkZXIubWVtdGFibGUoTWVtdGFibGVQYXJhbXMuZ2V0KGdldFN0cmluZyhPcHRpb24uTUVNVEFCTEUpKSk7CiAKLSAgICAgICAgaWYgKGhhc09wdGlvbihPcHRpb24uREVGQVVMVF9USU1FX1RPX0xJVkUpKQotICAgICAgICAgICAgYnVpbGRlci5kZWZhdWx0VGltZVRvTGl2ZShnZXRJbnQoT3B0aW9uLkRFRkFVTFRfVElNRV9UT19MSVZFKSk7CisgICAgICAgIGlmIChoYXNPcHRpb24oREVGQVVMVF9USU1FX1RPX0xJVkUpKQorICAgICAgICAgICAgYnVpbGRlci5kZWZhdWx0VGltZVRvTGl2ZShnZXRJbnQoREVGQVVMVF9USU1FX1RPX0xJVkUpKTsKIAotICAgICAgICBpZiAoaGFzT3B0aW9uKE9wdGlvbi5HQ19HUkFDRV9TRUNPTkRTKSkKLSAgICAgICAgICAgIGJ1aWxkZXIuZ2NHcmFjZVNlY29uZHMoZ2V0SW50KE9wdGlvbi5HQ19HUkFDRV9TRUNPTkRTKSk7CisgICAgICAgIGlmIChoYXNPcHRpb24oR0NfR1JBQ0VfU0VDT05EUykpCisgICAgICAgICAgICBidWlsZGVyLmdjR3JhY2VTZWNvbmRzKGdldEludChHQ19HUkFDRV9TRUNPTkRTKSk7CisgICAgICAgIAorICAgICAgICBpZiAoaGFzT3B0aW9uKElOQ1JFTUVOVEFMX0JBQ0tVUFMpKQorICAgICAgICAgICAgYnVpbGRlci5pbmNyZW1lbnRhbEJhY2t1cHMoZ2V0Qm9vbGVhbihJTkNSRU1FTlRBTF9CQUNLVVBTLnRvU3RyaW5nKCksIHRydWUpKTsKIAotICAgICAgICBpZiAoaGFzT3B0aW9uKE9wdGlvbi5NQVhfSU5ERVhfSU5URVJWQUwpKQotICAgICAgICAgICAgYnVpbGRlci5tYXhJbmRleEludGVydmFsKGdldEludChPcHRpb24uTUFYX0lOREVYX0lOVEVSVkFMKSk7CisgICAgICAgIGlmIChoYXNPcHRpb24oTUFYX0lOREVYX0lOVEVSVkFMKSkKKyAgICAgICAgICAgIGJ1aWxkZXIubWF4SW5kZXhJbnRlcnZhbChnZXRJbnQoTUFYX0lOREVYX0lOVEVSVkFMKSk7CiAKLSAgICAgICAgaWYgKGhhc09wdGlvbihPcHRpb24uTUVNVEFCTEVfRkxVU0hfUEVSSU9EX0lOX01TKSkKLSAgICAgICAgICAgIGJ1aWxkZXIubWVtdGFibGVGbHVzaFBlcmlvZEluTXMoZ2V0SW50KE9wdGlvbi5NRU1UQUJMRV9GTFVTSF9QRVJJT0RfSU5fTVMpKTsKKyAgICAgICAgaWYgKGhhc09wdGlvbihNRU1UQUJMRV9GTFVTSF9QRVJJT0RfSU5fTVMpKQorICAgICAgICAgICAgYnVpbGRlci5tZW10YWJsZUZsdXNoUGVyaW9kSW5NcyhnZXRJbnQoTUVNVEFCTEVfRkxVU0hfUEVSSU9EX0lOX01TKSk7CiAKLSAgICAgICAgaWYgKGhhc09wdGlvbihPcHRpb24uTUlOX0lOREVYX0lOVEVSVkFMKSkKLSAgICAgICAgICAgIGJ1aWxkZXIubWluSW5kZXhJbnRlcnZhbChnZXRJbnQoT3B0aW9uLk1JTl9JTkRFWF9JTlRFUlZBTCkpOworICAgICAgICBpZiAoaGFzT3B0aW9uKE1JTl9JTkRFWF9JTlRFUlZBTCkpCisgICAgICAgICAgICBidWlsZGVyLm1pbkluZGV4SW50ZXJ2YWwoZ2V0SW50KE1JTl9JTkRFWF9JTlRFUlZBTCkpOwogCi0gICAgICAgIGlmIChoYXNPcHRpb24oT3B0aW9uLlNQRUNVTEFUSVZFX1JFVFJZKSkKLSAgICAgICAgICAgIGJ1aWxkZXIuc3BlY3VsYXRpdmVSZXRyeShTcGVjdWxhdGl2ZVJldHJ5UG9saWN5LmZyb21TdHJpbmcoZ2V0U3RyaW5nKE9wdGlvbi5TUEVDVUxBVElWRV9SRVRSWSkpKTsKKyAgICAgICAgaWYgKGhhc09wdGlvbihTUEVDVUxBVElWRV9SRVRSWSkpCisgICAgICAgICAgICBidWlsZGVyLnNwZWN1bGF0aXZlUmV0cnkoU3BlY3VsYXRpdmVSZXRyeVBvbGljeS5mcm9tU3RyaW5nKGdldFN0cmluZyhTUEVDVUxBVElWRV9SRVRSWSkpKTsKIAotICAgICAgICBpZiAoaGFzT3B0aW9uKE9wdGlvbi5BRERJVElPTkFMX1dSSVRFX1BPTElDWSkpCi0gICAgICAgICAgICBidWlsZGVyLmFkZGl0aW9uYWxXcml0ZVBvbGljeShTcGVjdWxhdGl2ZVJldHJ5UG9saWN5LmZyb21TdHJpbmcoZ2V0U3RyaW5nKE9wdGlvbi5BRERJVElPTkFMX1dSSVRFX1BPTElDWSkpKTsKKyAgICAgICAgaWYgKGhhc09wdGlvbihBRERJVElPTkFMX1dSSVRFX1BPTElDWSkpCisgICAgICAgICAgICBidWlsZGVyLmFkZGl0aW9uYWxXcml0ZVBvbGljeShTcGVjdWxhdGl2ZVJldHJ5UG9saWN5LmZyb21TdHJpbmcoZ2V0U3RyaW5nKEFERElUSU9OQUxfV1JJVEVfUE9MSUNZKSkpOwogCi0gICAgICAgIGlmIChoYXNPcHRpb24oT3B0aW9uLkNSQ19DSEVDS19DSEFOQ0UpKQotICAgICAgICAgICAgYnVpbGRlci5jcmNDaGVja0NoYW5jZShnZXREb3VibGUoT3B0aW9uLkNSQ19DSEVDS19DSEFOQ0UpKTsKKyAgICAgICAgaWYgKGhhc09wdGlvbihDUkNfQ0hFQ0tfQ0hBTkNFKSkKKyAgICAgICAgICAgIGJ1aWxkZXIuY3JjQ2hlY2tDaGFuY2UoZ2V0RG91YmxlKENSQ19DSEVDS19DSEFOQ0UpKTsKIAotICAgICAgICBpZiAoaGFzT3B0aW9uKE9wdGlvbi5DREMpKQotICAgICAgICAgICAgYnVpbGRlci5jZGMoZ2V0Qm9vbGVhbihPcHRpb24uQ0RDLnRvU3RyaW5nKCksIGZhbHNlKSk7CisgICAgICAgIGlmIChoYXNPcHRpb24oQ0RDKSkKKyAgICAgICAgICAgIGJ1aWxkZXIuY2RjKGdldEJvb2xlYW4oQ0RDKSk7CiAKLSAgICAgICAgaWYgKGhhc09wdGlvbihPcHRpb24uUkVBRF9SRVBBSVIpKQotICAgICAgICAgICAgYnVpbGRlci5yZWFkUmVwYWlyKFJlYWRSZXBhaXJTdHJhdGVneS5mcm9tU3RyaW5nKGdldFN0cmluZyhPcHRpb24uUkVBRF9SRVBBSVIpKSk7CisgICAgICAgIGlmIChoYXNPcHRpb24oUkVBRF9SRVBBSVIpKQorICAgICAgICAgICAgYnVpbGRlci5yZWFkUmVwYWlyKFJlYWRSZXBhaXJTdHJhdGVneS5mcm9tU3RyaW5nKGdldFN0cmluZyhSRUFEX1JFUEFJUikpKTsKIAogICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwogICAgIH0KIAotICAgIHByaXZhdGUgRG91YmxlIGdldERlcHJlY2F0ZWRDcmNDaGVja0NoYW5jZShNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbXByZXNzaW9uT3B0cykKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNPcHRpb24oT3B0aW9uIG9wdGlvbikKICAgICB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGNvbXByZXNzaW9uT3B0cy5nZXQoT3B0aW9uLkNSQ19DSEVDS19DSEFOQ0UudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBEb3VibGUudmFsdWVPZih2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkludmFsaWQgZG91YmxlIHZhbHVlICVzIGZvciBjcmNfY2hlY2tfY2hhbmNlLiciLCB2YWx1ZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBkb3VibGUgZ2V0RG91YmxlKE9wdGlvbiBvcHRpb24pCi0gICAgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRTdHJpbmcob3B0aW9uKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIERvdWJsZS5wYXJzZURvdWJsZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXhjZXB0aW9uKGZvcm1hdCgiSW52YWxpZCBkb3VibGUgdmFsdWUgJXMgZm9yICclcyciLCB2YWx1ZSwgb3B0aW9uKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRJbnQoT3B0aW9uIG9wdGlvbikKLSAgICB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldFN0cmluZyhvcHRpb24pOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkludmFsaWQgaW50ZWdlciB2YWx1ZSAlcyBmb3IgJyVzJyIsIHZhbHVlLCBvcHRpb24pKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gaGFzUHJvcGVydHkob3B0aW9uLnRvU3RyaW5nKCkpOwogICAgIH0KIAogICAgIHByaXZhdGUgU3RyaW5nIGdldFN0cmluZyhPcHRpb24gb3B0aW9uKQogICAgIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0U2ltcGxlKG9wdGlvbi50b1N0cmluZygpKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0U3RyaW5nKG9wdGlvbi50b1N0cmluZygpKTsKICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGZvcm1hdCgiT3B0aW9uICclcycgaXMgYWJzZW50Iiwgb3B0aW9uKSk7CiAgICAgICAgIHJldHVybiB2YWx1ZTsKQEAgLTIxNSw4ICsxODUsMjQgQEAKICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIGhhc09wdGlvbihPcHRpb24gb3B0aW9uKQorICAgIHByaXZhdGUgYm9vbGVhbiBnZXRCb29sZWFuKE9wdGlvbiBvcHRpb24pCiAgICAgewotICAgICAgICByZXR1cm4gaGFzUHJvcGVydHkob3B0aW9uLnRvU3RyaW5nKCkpOworICAgICAgICByZXR1cm4gcGFyc2VCb29sZWFuKG9wdGlvbi50b1N0cmluZygpLCBnZXRTdHJpbmcob3B0aW9uKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0SW50KE9wdGlvbiBvcHRpb24pCisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VJbnQob3B0aW9uLnRvU3RyaW5nKCksIGdldFN0cmluZyhvcHRpb24pKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGRvdWJsZSBnZXREb3VibGUoT3B0aW9uIG9wdGlvbikKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZURvdWJsZShvcHRpb24udG9TdHJpbmcoKSwgZ2V0U3RyaW5nKG9wdGlvbikpOworICAgIH0KKworICAgIHByaXZhdGUgZG91YmxlIGdldERlcHJlY2F0ZWRDcmNDaGVja0NoYW5jZShNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbXByZXNzaW9uT3B0cykKKyAgICB7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IGNvbXByZXNzaW9uT3B0cy5nZXQoQ1JDX0NIRUNLX0NIQU5DRS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpOworICAgICAgICByZXR1cm4gcGFyc2VEb3VibGUoQ1JDX0NIRUNLX0NIQU5DRS50b1N0cmluZygpLCB2YWx1ZSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQWJzdHJhY3RBcnJheUNsdXN0ZXJpbmdQcmVmaXguamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0Fic3RyYWN0QXJyYXlDbHVzdGVyaW5nUHJlZml4LmphdmEKaW5kZXggMjExZWViMC4uMTZmYjA4MCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQWJzdHJhY3RBcnJheUNsdXN0ZXJpbmdQcmVmaXguamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9BYnN0cmFjdEFycmF5Q2x1c3RlcmluZ1ByZWZpeC5qYXZhCkBAIC00OSw3ICs0OSw4IEBACiAgICAgICAgIHJldHVybiBvdXQ7CiAgICAgfQogCi0gICAgcHVibGljIENsdXN0ZXJpbmdQcmVmaXg8Ynl0ZVtdPiBtaW5pbWl6ZSgpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsdXN0ZXJpbmdQcmVmaXg8Ynl0ZVtdPiByZXRhaW5hYmxlKCkKICAgICB7CiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0Fic3RyYWN0QnVmZmVyQ2x1c3RlcmluZ1ByZWZpeC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQWJzdHJhY3RCdWZmZXJDbHVzdGVyaW5nUHJlZml4LmphdmEKaW5kZXggNDU3ZDBjNC4uYjQ3YTNhMyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQWJzdHJhY3RCdWZmZXJDbHVzdGVyaW5nUHJlZml4LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQWJzdHJhY3RCdWZmZXJDbHVzdGVyaW5nUHJlZml4LmphdmEKQEAgLTQyLDEwICs0MiwxOSBAQAogICAgICAgICByZXR1cm4gZ2V0UmF3VmFsdWVzKCk7CiAgICAgfQogCi0gICAgcHVibGljIENsdXN0ZXJpbmdQcmVmaXg8Qnl0ZUJ1ZmZlcj4gbWluaW1pemUoKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbHVzdGVyaW5nUHJlZml4PEJ5dGVCdWZmZXI+IHJldGFpbmFibGUoKQogICAgIHsKICAgICAgICAgaWYgKCFCeXRlQnVmZmVyVXRpbC5jYW5NaW5pbWl6ZSh2YWx1ZXMpKQogICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIHJldHVybiBuZXcgQnVmZmVyQ2x1c3RlcmluZyhCeXRlQnVmZmVyVXRpbC5taW5pbWl6ZUJ1ZmZlcnModmFsdWVzKSk7CisKKyAgICAgICAgQnl0ZUJ1ZmZlcltdIG1pbmltaXplZFZhbHVlcyA9IEJ5dGVCdWZmZXJVdGlsLm1pbmltaXplQnVmZmVycyh0aGlzLnZhbHVlcyk7CisgICAgICAgIGlmIChraW5kLmlzQm91bmRhcnkoKSkKKyAgICAgICAgICAgIHJldHVybiBhY2Nlc3NvcigpLmZhY3RvcnkoKS5ib3VuZGFyeShraW5kLCBtaW5pbWl6ZWRWYWx1ZXMpOworICAgICAgICBpZiAoa2luZC5pc0JvdW5kKCkpCisgICAgICAgICAgICByZXR1cm4gYWNjZXNzb3IoKS5mYWN0b3J5KCkuYm91bmQoa2luZCwgbWluaW1pemVkVmFsdWVzKTsKKworICAgICAgICBhc3NlcnQga2luZCgpICE9IEtpbmQuU1RBVElDX0NMVVNURVJJTkc7ICAgIC8vIG5vdCBtaW5pbWl6YWJsZQorICAgICAgICByZXR1cm4gYWNjZXNzb3IoKS5mYWN0b3J5KCkuY2x1c3RlcmluZyhtaW5pbWl6ZWRWYWx1ZXMpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0Fic3RyYWN0UmVhZFF1ZXJ5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9BYnN0cmFjdFJlYWRRdWVyeS5qYXZhCmluZGV4IDM3NGQyYjIuLmMyZTQyNTggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0Fic3RyYWN0UmVhZFF1ZXJ5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQWJzdHJhY3RSZWFkUXVlcnkuamF2YQpAQCAtMTE4LDQgKzExOCw0IEBACiAgICAgfQogCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYXBwZW5kQ1FMV2hlcmVDbGF1c2UoU3RyaW5nQnVpbGRlciBzYik7Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQXJyYXlDbHVzdGVyaW5nLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9BcnJheUNsdXN0ZXJpbmcuamF2YQppbmRleCA1M2Q0NWU3Li5iMDQ5MTBjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9BcnJheUNsdXN0ZXJpbmcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9BcnJheUNsdXN0ZXJpbmcuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiOwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlQXJyYXlBY2Nlc3NvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PYmplY3RTaXplczsKIAogcHVibGljIGNsYXNzIEFycmF5Q2x1c3RlcmluZyBleHRlbmRzIEFic3RyYWN0QXJyYXlDbHVzdGVyaW5nUHJlZml4IGltcGxlbWVudHMgQ2x1c3RlcmluZzxieXRlW10+CkBAIC0zMSw2ICszMiw4IEBACiAKICAgICBwdWJsaWMgbG9uZyB1bnNoYXJlZEhlYXBTaXplKCkKICAgICB7CisgICAgICAgIGlmICh0aGlzID09IEJ5dGVBcnJheUFjY2Vzc29yLmZhY3RvcnkuY2x1c3RlcmluZygpIHx8IHRoaXMgPT0gQnl0ZUFycmF5QWNjZXNzb3IuZmFjdG9yeS5zdGF0aWNDbHVzdGVyaW5nKCkpCisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgbG9uZyBhcnJheVJlZlNpemUgPSBPYmplY3RTaXplcy5zaXplT2ZBcnJheSh2YWx1ZXMpOwogICAgICAgICBsb25nIGVsZW1lbnRzU2l6ZSA9IDA7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQpAQCAtNDAsNiArNDMsOCBAQAogCiAgICAgcHVibGljIGxvbmcgdW5zaGFyZWRIZWFwU2l6ZUV4Y2x1ZGluZ0RhdGEoKQogICAgIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gQnl0ZUFycmF5QWNjZXNzb3IuZmFjdG9yeS5jbHVzdGVyaW5nKCkgfHwgdGhpcyA9PSBCeXRlQXJyYXlBY2Nlc3Nvci5mYWN0b3J5LnN0YXRpY0NsdXN0ZXJpbmcoKSkKKyAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICByZXR1cm4gRU1QVFlfU0laRSArIE9iamVjdFNpemVzLnNpemVPZkFycmF5KHZhbHVlcyk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9CdWZmZXJDbHVzdGVyaW5nLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9CdWZmZXJDbHVzdGVyaW5nLmphdmEKaW5kZXggZTM1OTJlMS4uZWQ2ZDYxYyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQnVmZmVyQ2x1c3RlcmluZy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0J1ZmZlckNsdXN0ZXJpbmcuamF2YQpAQCAtNDMsMTEgKzQzLDE1IEBACiAKICAgICBwdWJsaWMgbG9uZyB1bnNoYXJlZEhlYXBTaXplKCkKICAgICB7CisgICAgICAgIGlmICh0aGlzID09IENsdXN0ZXJpbmcuRU1QVFkgfHwgdGhpcyA9PSBDbHVzdGVyaW5nLlNUQVRJQ19DTFVTVEVSSU5HKQorICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIHJldHVybiBFTVBUWV9TSVpFICsgT2JqZWN0U2l6ZXMuc2l6ZU9uSGVhcE9mKHZhbHVlcyk7CiAgICAgfQogCiAgICAgcHVibGljIGxvbmcgdW5zaGFyZWRIZWFwU2l6ZUV4Y2x1ZGluZ0RhdGEoKQogICAgIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gQ2x1c3RlcmluZy5FTVBUWSB8fCB0aGlzID09IENsdXN0ZXJpbmcuU1RBVElDX0NMVVNURVJJTkcpCisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgcmV0dXJuIEVNUFRZX1NJWkUgKyBPYmplY3RTaXplcy5zaXplT25IZWFwRXhjbHVkaW5nRGF0YSh2YWx1ZXMpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQnVmZmVyRGVjb3JhdGVkS2V5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9CdWZmZXJEZWNvcmF0ZWRLZXkuamF2YQppbmRleCBkMzc1MTYyLi4wN2Y2MTBmIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9CdWZmZXJEZWNvcmF0ZWRLZXkuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9CdWZmZXJEZWNvcmF0ZWRLZXkuamF2YQpAQCAtMTksNyArMTksOSBAQAogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOwogCiBwdWJsaWMgY2xhc3MgQnVmZmVyRGVjb3JhdGVkS2V5IGV4dGVuZHMgRGVjb3JhdGVkS2V5CiB7CkBAIC0zNiw0ICszOCwzNCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIGtleTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldEtleUxlbmd0aCgpCisgICAgeworICAgICAgICByZXR1cm4ga2V5LnJlbWFpbmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgZmFjdG9yeSBtZXRob2QgdGhhdCB0cmFuc2xhdGVzIHRoZSBnaXZlbiBieXRlLWNvbXBhcmFibGUgcmVwcmVzZW50YXRpb24gdG8gYSB7QGxpbmsgQnVmZmVyRGVjb3JhdGVkS2V5fQorICAgICAqIGluc3RhbmNlLiBJZiB0aGUgZ2l2ZW4gYnl0ZSBjb21wYXJhYmxlIGRvZXNuJ3QgcmVwcmVzZW50IHRoZSBlbmNvZGluZyBvZiBhIGJ1ZmZlciBkZWNvcmF0ZWQga2V5LCBhbnl0aGluZyBmcm9tIGEKKyAgICAgKiB3aWRlIHZhcmlldHkgb2YgdGhyb3dhYmxlcyBtYXkgYmUgdGhyb3duIChlLmcuIHtAbGluayBBc3NlcnRpb25FcnJvcn0sIHtAbGluayBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9ufSwKKyAgICAgKiB7QGxpbmsgSWxsZWdhbFN0YXRlRXhjZXB0aW9ufSwgZXRjLikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnl0ZUNvbXBhcmFibGUgQSBieXRlLWNvbXBhcmFibGUgcmVwcmVzZW50YXRpb24gKHByZXN1bWFibHkgb2YgYSB7QGxpbmsgQnVmZmVyRGVjb3JhdGVkS2V5fSBpbnN0YW5jZSkuCisgICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGVuY29kaW5nIHZlcnNpb24gdXNlZCBmb3IgdGhlIGdpdmVuIGJ5dGUgY29tcGFyYWJsZS4KKyAgICAgKiBAcGFyYW0gcGFydGl0aW9uZXIgVGhlIHBhcnRpdGlvbmVyIG9mIHRoZSBlbmNvZGVkIGRlY29yYXRlZCBrZXkuIE5lZWRlZCBpbiBvcmRlciB0byBjb3JyZWN0bHkgZGVjb2RlIHRoZSB0b2tlbgorICAgICAqICAgICAgICAgICAgICAgICAgICBieXRlcyBvZiB0aGUga2V5LgorICAgICAqIEByZXR1cm4gQSBuZXcge0BsaW5rIEJ1ZmZlckRlY29yYXRlZEtleX0gaW5zdGFuY2UsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGJ5dGUtY29tcGFyYWJsZSByZXByZXNlbnRhdGlvbi4gSWYKKyAgICAgKiB3ZSB3ZXJlIHRvIGNhbGwge0BsaW5rICNhc0NvbXBhcmFibGVCeXRlcyhWZXJzaW9uKX0gb24gdGhlIHJldHVybmVkIG9iamVjdCwgd2Ugc2hvdWxkIGdldCBhIHtAbGluayBCeXRlU291cmNlfQorICAgICAqIGVxdWFsIHRvIHRoZSBvbmUgb2YgdGhlIGlucHV0IGJ5dGUgY29tcGFyYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJ1ZmZlckRlY29yYXRlZEtleSBmcm9tQnl0ZUNvbXBhcmFibGUoQnl0ZUNvbXBhcmFibGUgYnl0ZUNvbXBhcmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIERlY29yYXRlZEtleS5mcm9tQnl0ZUNvbXBhcmFibGUoYnl0ZUNvbXBhcmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9rZW4sIGtleUJ5dGVzKSAtPiBuZXcgQnVmZmVyRGVjb3JhdGVkS2V5KHRva2VuLCBCeXRlQnVmZmVyLndyYXAoa2V5Qnl0ZXMpKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZy5qYXZhCmluZGV4IGRkOTFmZWEuLjQyNmQzMjcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NsdXN0ZXJpbmcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9DbHVzdGVyaW5nLmphdmEKQEAgLTU2LDYgKzU2LDE4IEBACiAgICAgICAgIHJldHVybiBuZXcgQnVmZmVyQ2x1c3RlcmluZyhuZXdWYWx1ZXMpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIGRlZmF1bHQgQ2x1c3RlcmluZ0JvdW5kPFY+IGFzU3RhcnRCb3VuZCgpCisgICAgeworICAgICAgICByZXR1cm4gQ2x1c3RlcmluZ0JvdW5kLmluY2x1c2l2ZVN0YXJ0T2YodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgZGVmYXVsdCBDbHVzdGVyaW5nQm91bmQ8Vj4gYXNFbmRCb3VuZCgpCisgICAgeworICAgICAgICByZXR1cm4gQ2x1c3RlcmluZ0JvdW5kLmluY2x1c2l2ZUVuZE9mKHRoaXMpOworICAgIH0KKwogICAgIHB1YmxpYyBkZWZhdWx0IFN0cmluZyB0b1N0cmluZyhUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKQogICAgIHsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CkBAIC0xNzgsNCArMTkwLDQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9DbHVzdGVyaW5nQm91bmQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NsdXN0ZXJpbmdCb3VuZC5qYXZhCmluZGV4IDYwYTFjNmMuLjRhZmRmZTYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NsdXN0ZXJpbmdCb3VuZC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NsdXN0ZXJpbmdCb3VuZC5qYXZhCkBAIC0yMSwyMiArMjEsMjcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGI7CiAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlQnVmZmVyQWNjZXNzb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5LkJ5dGVCdWZmZXJDbG9uZXI7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQWJzdHJhY3RCdWZmZXJDbHVzdGVyaW5nUHJlZml4LkVNUFRZX1ZBTFVFU19BUlJBWTsKKwogLyoqCiAgKiBUaGUgc3RhcnQgb3IgZW5kIG9mIGEgcmFuZ2Ugb2YgY2x1c3RlcmluZ3MsIGVpdGhlciBpbmNsdXNpdmUgb3IgZXhjbHVzaXZlLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIENsdXN0ZXJpbmdCb3VuZDxWPiBleHRlbmRzIENsdXN0ZXJpbmdCb3VuZE9yQm91bmRhcnk8Vj4KIHsKICAgICAvKiogVGhlIHNtYWxsZXN0IHN0YXJ0IGJvdW5kLCBpLmUuIHRoZSBvbmUgdGhhdCBzdGFydHMgYmVmb3JlIGFueSByb3cuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBDbHVzdGVyaW5nQm91bmQ8Pz4gQk9UVE9NID0gbmV3IEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZChDbHVzdGVyaW5nUHJlZml4LktpbmQuSU5DTF9TVEFSVF9CT1VORCwgQnVmZmVyQ2x1c3RlcmluZ0JvdW5kLkVNUFRZX1ZBTFVFU19BUlJBWSk7CisgICAgQ2x1c3RlcmluZ0JvdW5kPD8+IEJPVFRPTSA9IG5ldyBCdWZmZXJDbHVzdGVyaW5nQm91bmQoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLklOQ0xfU1RBUlRfQk9VTkQsIEVNUFRZX1ZBTFVFU19BUlJBWSk7CiAgICAgLyoqIFRoZSBiaWdnZXN0IGVuZCBib3VuZCwgaS5lLiB0aGUgb25lIHRoYXQgZW5kcyBhZnRlciBhbnkgcm93LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2x1c3RlcmluZ0JvdW5kPD8+IFRPUCA9IG5ldyBCdWZmZXJDbHVzdGVyaW5nQm91bmQoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLklOQ0xfRU5EX0JPVU5ELCBCdWZmZXJDbHVzdGVyaW5nQm91bmQuRU1QVFlfVkFMVUVTX0FSUkFZKTsKKyAgICBDbHVzdGVyaW5nQm91bmQ8Pz4gVE9QID0gbmV3IEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZChDbHVzdGVyaW5nUHJlZml4LktpbmQuSU5DTF9FTkRfQk9VTkQsIEVNUFRZX1ZBTFVFU19BUlJBWSk7CiAKLSAgICBwdWJsaWMgc3RhdGljIENsdXN0ZXJpbmdQcmVmaXguS2luZCBib3VuZEtpbmQoYm9vbGVhbiBpc1N0YXJ0LCBib29sZWFuIGlzSW5jbHVzaXZlKQorICAgIC8qKiBUaGUgYmlnZ2VzdCBzdGFydCBib3VuZCwgaS5lLiB0aGUgb25lIHRoYXQgc3RhcnRzIGFmdGVyIGFueSByb3cuICovCisgICAgQ2x1c3RlcmluZ0JvdW5kPD8+IE1BWF9TVEFSVCA9IG5ldyBCdWZmZXJDbHVzdGVyaW5nQm91bmQoS2luZC5FWENMX1NUQVJUX0JPVU5ELCBFTVBUWV9WQUxVRVNfQVJSQVkpOworICAgIC8qKiBUaGUgc21hbGxlc3QgZW5kIGJvdW5kLCBpLmUuIHRoZSBvbmUgdGhhdCBlbmQgYmVmb3JlIGFueSByb3cuICovCisgICAgQ2x1c3RlcmluZ0JvdW5kPD8+IE1JTl9FTkQgPSBuZXcgQnVmZmVyQ2x1c3RlcmluZ0JvdW5kKEtpbmQuRVhDTF9FTkRfQk9VTkQsIEVNUFRZX1ZBTFVFU19BUlJBWSk7CisKKyAgICBzdGF0aWMgQ2x1c3RlcmluZ1ByZWZpeC5LaW5kIGJvdW5kS2luZChib29sZWFuIGlzU3RhcnQsIGJvb2xlYW4gaXNJbmNsdXNpdmUpCiAgICAgewogICAgICAgICByZXR1cm4gaXNTdGFydAogICAgICAgICAgICAgICAgPyAoaXNJbmNsdXNpdmUgPyBDbHVzdGVyaW5nUHJlZml4LktpbmQuSU5DTF9TVEFSVF9CT1VORCA6IENsdXN0ZXJpbmdQcmVmaXguS2luZC5FWENMX1NUQVJUX0JPVU5EKQpAQCAtNjksMzIgKzc0LDE0IEBACiAgICAgICAgIHJldHVybiBraW5kKCkgPT0gS2luZC5FWENMX1NUQVJUX0JPVU5EIHx8IGtpbmQoKSA9PSBLaW5kLkVYQ0xfRU5EX0JPVU5EOwogICAgIH0KIAotICAgIC8vIEZvciB1c2UgYnkgaW50ZXJzZWN0cywgaXQncyBjYWxsZWQgd2l0aCB0aGUgc3N0YWJsZSBib3VuZCBvcHBvc2l0ZSB0byB0aGUgc2xpY2UgYm91bmQKLSAgICAvLyAoc28gaWYgdGhlIHNsaWNlIGJvdW5kIGlzIGEgc3RhcnQsIGl0J3MgY2FsbCB3aXRoIHRoZSBtYXggc3N0YWJsZSBib3VuZCkKLSAgICBkZWZhdWx0IGludCBjb21wYXJlVG8oQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvciwgTGlzdDxCeXRlQnVmZmVyPiBzc3RhYmxlQm91bmQpCisgICAgZGVmYXVsdCBib29sZWFuIGlzQXJ0aWZpY2lhbCgpCiAgICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNzdGFibGVCb3VuZC5zaXplKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLy8gU2F5IHRoZSBzbGljZSBib3VuZCBpcyBhIHN0YXJ0LiBJdCBtZWFucyB3ZSdyZSBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgbWF4Ci0gICAgICAgICAgICAvLyBzc3RhYmxlIGJvdW5kIGlzIHNheSAoMTo1KSB3aGlsZSB0aGUgc2xpY2Ugc3RhcnQgaXMgKDEpLiBTbyB0aGUgc3RhcnQKLSAgICAgICAgICAgIC8vIGRvZXMgc3RhcnQgYmVmb3JlIHRoZSBzc3RhYmxlIGVuZCBib3VuZCAoYW5kIGludGVyc2VjdCBpdCkuIEl0J3MgdGhlIGV4YWN0Ci0gICAgICAgICAgICAvLyBpbnZlcnNlIHdpdGggYSBlbmQgc2xpY2UgYm91bmQuCi0gICAgICAgICAgICBpZiAoaSA+PSBzaXplKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGlzU3RhcnQoKSA/IC0xIDogMTsKKyAgICAgICAgcmV0dXJuIGtpbmQoKSA9PSBLaW5kLlNTVEFCTEVfTE9XRVJfQk9VTkQgfHwga2luZCgpID09IEtpbmQuU1NUQUJMRV9VUFBFUl9CT1VORDsKKyAgICB9CiAKLSAgICAgICAgICAgIGludCBjbXAgPSBjb21wYXJhdG9yLmNvbXBhcmVDb21wb25lbnQoaSwgZ2V0KGkpLCBhY2Nlc3NvcigpLCBzc3RhYmxlQm91bmQuZ2V0KGkpLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UpOwotICAgICAgICAgICAgaWYgKGNtcCAhPSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBjbXA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTYXkgdGhlIHNsaWNlIGJvdW5kIGlzIGEgc3RhcnQuIEkgbWVhbnMgd2UncmUgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIG1heAotICAgICAgICAvLyBzc3RhYmxlIGJvdW5kIGlzIHNheSAoMSksIHdoaWxlIHRoZSBzbGljZSBzdGFydCBpcyAoMTo1KS4gVGhpcyBhZ2FpbiBtZWFucwotICAgICAgICAvLyB0aGF0IHRoZSBzbGljZSBzdGFydCBiZWZvcmUgdGhlIGVuZCBib3VuZC4KLSAgICAgICAgaWYgKHNpemUoKSA+IHNzdGFibGVCb3VuZC5zaXplKCkpCi0gICAgICAgICAgICByZXR1cm4gaXNTdGFydCgpID8gLTEgOiAxOwotCi0gICAgICAgIC8vIFRoZSBzbGljZSBib3VuZCBpcyBlcXVhbCB0byB0aGUgc3N0YWJsZSBib3VuZC4gUmVzdWx0cyBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIHNsaWNlIGlzIGluY2x1c2l2ZSBvciBub3QKLSAgICAgICAgcmV0dXJuIGlzSW5jbHVzaXZlKCkgPyAwIDogKGlzU3RhcnQoKSA/IDEgOiAtMSk7CisgICAgZGVmYXVsdCBDbHVzdGVyaW5nQm91bmQ8Vj4gYXJ0aWZpY2lhbExvd2VyQm91bmQoYm9vbGVhbiBpc1JldmVyc2VkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZSghaXNSZXZlcnNlZCA/IEtpbmQuU1NUQUJMRV9MT1dFUl9CT1VORCA6IEtpbmQuU1NUQUJMRV9VUFBFUl9CT1VORCwgdGhpcyk7CiAgICAgfQogCiAgICAgc3RhdGljIDxWPiBDbHVzdGVyaW5nQm91bmQ8Vj4gY3JlYXRlKENsdXN0ZXJpbmdQcmVmaXguS2luZCBraW5kLCBDbHVzdGVyaW5nUHJlZml4PFY+IGZyb20pCkBAIC0xMDIsMjcgKzg5LDI3IEBACiAgICAgICAgIHJldHVybiBmcm9tLmFjY2Vzc29yKCkuZmFjdG9yeSgpLmJvdW5kKGtpbmQsIGZyb20uZ2V0UmF3VmFsdWVzKCkpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgQ2x1c3RlcmluZ0JvdW5kPD8+IGluY2x1c2l2ZVN0YXJ0T2YoQ2x1c3RlcmluZ1ByZWZpeDw/PiBmcm9tKQorICAgIHN0YXRpYyA8Vj4gQ2x1c3RlcmluZ0JvdW5kPFY+IGluY2x1c2l2ZVN0YXJ0T2YoQ2x1c3RlcmluZ1ByZWZpeDxWPiBmcm9tKQogICAgIHsKICAgICAgICAgcmV0dXJuIGNyZWF0ZShDbHVzdGVyaW5nUHJlZml4LktpbmQuSU5DTF9TVEFSVF9CT1VORCwgZnJvbSk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBDbHVzdGVyaW5nQm91bmQ8Pz4gaW5jbHVzaXZlRW5kT2YoQ2x1c3RlcmluZ1ByZWZpeDw/PiBmcm9tKQorICAgIHN0YXRpYyA8Vj4gQ2x1c3RlcmluZ0JvdW5kPFY+IGluY2x1c2l2ZUVuZE9mKENsdXN0ZXJpbmdQcmVmaXg8Vj4gZnJvbSkKICAgICB7CiAgICAgICAgIHJldHVybiBjcmVhdGUoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLklOQ0xfRU5EX0JPVU5ELCBmcm9tKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIENsdXN0ZXJpbmdCb3VuZDw/PiBleGNsdXNpdmVTdGFydE9mKENsdXN0ZXJpbmdQcmVmaXg8Pz4gZnJvbSkKKyAgICBzdGF0aWMgPFY+IENsdXN0ZXJpbmdCb3VuZDxWPiBleGNsdXNpdmVTdGFydE9mKENsdXN0ZXJpbmdQcmVmaXg8Vj4gZnJvbSkKICAgICB7CiAgICAgICAgIHJldHVybiBjcmVhdGUoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLkVYQ0xfU1RBUlRfQk9VTkQsIGZyb20pOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgQ2x1c3RlcmluZ0JvdW5kPD8+IGV4Y2x1c2l2ZUVuZE9mKENsdXN0ZXJpbmdQcmVmaXg8Pz4gZnJvbSkKKyAgICBzdGF0aWMgPFY+IENsdXN0ZXJpbmdCb3VuZDxWPiBleGNsdXNpdmVFbmRPZihDbHVzdGVyaW5nUHJlZml4PFY+IGZyb20pCiAgICAgewogICAgICAgICByZXR1cm4gY3JlYXRlKENsdXN0ZXJpbmdQcmVmaXguS2luZC5FWENMX0VORF9CT1VORCwgZnJvbSk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBDbHVzdGVyaW5nQm91bmQ8Pz4gY3JlYXRlKENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IsIGJvb2xlYW4gaXNTdGFydCwgYm9vbGVhbiBpc0luY2x1c2l2ZSwgT2JqZWN0Li4uIHZhbHVlcykKKyAgICBzdGF0aWMgQ2x1c3RlcmluZ0JvdW5kPD8+IGNyZWF0ZShDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yLCBib29sZWFuIGlzU3RhcnQsIGJvb2xlYW4gaXNJbmNsdXNpdmUsIE9iamVjdC4uLiB2YWx1ZXMpCiAgICAgewogICAgICAgICBDQnVpbGRlciBidWlsZGVyID0gQ0J1aWxkZXIuY3JlYXRlKGNvbXBhcmF0b3IpOwogICAgICAgICBmb3IgKE9iamVjdCB2YWwgOiB2YWx1ZXMpCkBAIC0xMzQsNCArMTIxLDE4IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGRCb3VuZChpc1N0YXJ0LCBpc0luY2x1c2l2ZSk7CiAgICAgfQotfQorCisgICAgQE92ZXJyaWRlCisgICAgZGVmYXVsdCBDbHVzdGVyaW5nQm91bmQ8Vj4gYXNTdGFydEJvdW5kKCkKKyAgICB7CisgICAgICAgIGFzc2VydCBpc1N0YXJ0KCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIGRlZmF1bHQgQ2x1c3RlcmluZ0JvdW5kPFY+IGFzRW5kQm91bmQoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGlzRW5kKCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9DbHVzdGVyaW5nQm91bmRhcnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NsdXN0ZXJpbmdCb3VuZGFyeS5qYXZhCmluZGV4IDNlNTBmNTIuLjllMGE4N2MgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NsdXN0ZXJpbmdCb3VuZGFyeS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NsdXN0ZXJpbmdCb3VuZGFyeS5qYXZhCkBAIC0zNyw0ICszNywxNiBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIGZyb20uYWNjZXNzb3IoKS5mYWN0b3J5KCkuYm91bmRhcnkoa2luZCwgZnJvbS5nZXRSYXdWYWx1ZXMoKSk7CiAgICAgfQotfQorCisgICAgQE92ZXJyaWRlCisgICAgZGVmYXVsdCBDbHVzdGVyaW5nQm91bmQ8Vj4gYXNTdGFydEJvdW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiBvcGVuQm91bmQoZmFsc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIGRlZmF1bHQgQ2x1c3RlcmluZ0JvdW5kPFY+IGFzRW5kQm91bmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNsb3NlQm91bmQoZmFsc2UpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9DbHVzdGVyaW5nQ29tcGFyYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZ0NvbXBhcmF0b3IuamF2YQppbmRleCBmZGM0NTA4Li5kMDA3YzVkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9DbHVzdGVyaW5nQ29tcGFyYXRvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NsdXN0ZXJpbmdDb21wYXJhdG9yLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGI7CiAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CkBAIC0zMSw2ICszMiwxNSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLk1hcnNoYWxFeGNlcHRpb247CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkluZGV4SW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2UuRVhDTFVERUQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlRfRU1QVFk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlRfRU1QVFlfUkVWRVJTRUQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlRfTlVMTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZS5URVJNSU5BVE9SOwogCiAvKioKICAqIEEgY29tcGFyYXRvciBvZiBjbHVzdGVyaW5nIHByZWZpeGVzIChvciBtb3JlIGdlbmVyYWxseSBvZiB7QGxpbmsgQ2x1c3RlcmFibGV9fS4KQEAgLTIzMyw2ICsyNDMsMjcyIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUHJvZHVjZSBhIHByZWZpeC1mcmVlIGJ5dGUtY29tcGFyYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdmFsdWUsIGkuZS4gc3VjaCBhIHNlcXVlbmNlIG9mIGJ5dGVzIHRoYXQgYW55CisgICAgICogcGFpciB4LCB5IG9mIHZhbGlkIHZhbHVlcyBvZiB0aGlzIHR5cGUKKyAgICAgKiAgIGNvbXBhcmUoeCwgeSkgPT0gY29tcGFyZUxleGljb2dyYXBoaWNhbGx5VW5zaWduZWQoYXNCeXRlQ29tcGFyYWJsZSh4KSwgYXNCeXRlQ29tcGFyYWJsZSh5KSkKKyAgICAgKiBhbmQKKyAgICAgKiAgIGFzQnl0ZUNvbXBhcmFibGUoeCkgaXMgbm90IGEgcHJlZml4IG9mIGFzQnl0ZUNvbXBhcmFibGUoeSkKKyAgICAgKi8KKyAgICBwdWJsaWMgPFY+IEJ5dGVDb21wYXJhYmxlIGFzQnl0ZUNvbXBhcmFibGUoQ2x1c3RlcmluZ1ByZWZpeDxWPiBjbHVzdGVyaW5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCeXRlQ29tcGFyYWJsZUNsdXN0ZXJpbmc8PihjbHVzdGVyaW5nKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHByZWZpeC1mcmVlIGJ5dGUtY29tcGFyYWJsZSByZXByZXNlbnRhdGlvbiBmb3IgYSBjbHVzdGVyaW5nIG9yIHByZWZpeC4KKyAgICAgKgorICAgICAqIEFkZHMgYSBORVhUX0NPTVBPTkVOVCBieXRlIGJlZm9yZSBlYWNoIGNvbXBvbmVudCAoYWxsb3dpbmcgaW5jbHVzaXZlL2V4Y2x1c2l2ZSBib3VuZHMgb3ZlciBpbmNvbXBsZXRlIHByZWZpeGVzCisgICAgICogb2YgdGhhdCBsZW5ndGgpIGFuZCBmaW5pc2hlcyB3aXRoIGEgc3VpdGFibGUgYnl0ZSBmb3IgdGhlIGNsdXN0ZXJpbmcga2luZC4gQWxzbyBkZWFscyB3aXRoIG51bGwgZW50cmllcy4KKyAgICAgKgorICAgICAqIFNpbmNlIGFsbCB0eXBlcycgZW5jb2RpbmdzIGFyZSB3ZWFrbHkgcHJlZml4LWZyZWUsIHRoaXMgaXMgZ3VhcmFudGVlZCB0byBiZSBwcmVmaXgtZnJlZSBhcyBsb25nIGFzIHRoZQorICAgICAqIGJvdW5kL0NsdXN0ZXJpbmdQcmVmaXggdGVybWluYXRvcnMgYXJlIGRpZmZlcmVudCBmcm9tIHRoZSBzZXBhcmF0b3IgYnl0ZS4gSXQgaXMgb2theSBmb3IgdGhlIHRlcm1pbmF0b3IgZm9yCisgICAgICogQ2x1c3RlcmluZyB0byBiZSB0aGUgc2FtZSBhcyB0aGUgc2VwYXJhdG9yLCBhcyBhbGwgQ2x1c3RlcmluZ3MgbXVzdCBiZSBjb21wbGV0ZWx5IHNwZWNpZmllZC4KKyAgICAgKgorICAgICAqIFNlZSBhbHNvIHtAbGluayBBYnN0cmFjdFR5cGUjYXNDb21wYXJhYmxlQnl0ZXN9LgorICAgICAqCisgICAgICogU29tZSBleGFtcGxlczoKKyAgICAgKiAgICAiQSIsIDAwMDUsIENsdXN0ZXJpbmcgICAgIC0+IDQwIDQxMDAgNDAgMDAwNSA0MAorICAgICAqICAgICJCIiwgMDAwNiwgSW5jbHVzaXZlRW5kICAgLT4gNDAgNDIwMCA0MCAwMDA2IDYwCisgICAgICogICAgIkEiLCBFeGNsdXNpdmVTdGFydCAgICAgICAtPiA0MCA0MTAwIDYwCisgICAgICogICAgIiIsIG51bGwsIENsdXN0ZXJpbmcgICAgICAtPiA0MCAwMCAzRiA0MAorICAgICAqICAgICIiLCAwMDAwLCBDbHVzdGVyaW5nICAgICAgLT4gNDAgMDAgNDAgMDAwMCA0MAorICAgICAqICAgIEJPVFRPTSAgICAgICAgICAgICAgICAgICAgLT4gMjAKKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIEJ5dGVDb21wYXJhYmxlQ2x1c3RlcmluZzxWPiBpbXBsZW1lbnRzIEJ5dGVDb21wYXJhYmxlCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIENsdXN0ZXJpbmdQcmVmaXg8Vj4gc3JjOworCisgICAgICAgIEJ5dGVDb21wYXJhYmxlQ2x1c3RlcmluZyhDbHVzdGVyaW5nUHJlZml4PFY+IHNyYykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5zcmMgPSBzcmM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmVyc2lvbiB2ZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVTb3VyY2UoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaXZhdGUgQnl0ZVNvdXJjZSBjdXJyZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBwcml2YXRlIGludCBzcmNudW0gPSAtMTsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgbmV4dCgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYiA9IGN1cnJlbnQubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgPiBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbnQgc3ogPSBzcmMuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3JjbnVtID09IHN6KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVORF9PRl9TVFJFQU07CisKKyAgICAgICAgICAgICAgICAgICAgKytzcmNudW07CisgICAgICAgICAgICAgICAgICAgIGlmIChzcmNudW0gPT0gc3opCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3JjLmtpbmQoKS5hc0J5dGVDb21wYXJhYmxlVmFsdWUodmVyc2lvbik7CisKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgViBuZXh0Q29tcG9uZW50ID0gc3JjLmdldChzcmNudW0pOworICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW4gaGF2ZSBhIG51bGwgYXMgdGhlIGNsdXN0ZXJpbmcgY29tcG9uZW50ICh0aGlzIGlzIGEgcmVsaWMgb2YgQ09NUEFDVCBTVE9SQUdFLCBidXQgYWxzbworICAgICAgICAgICAgICAgICAgICAvLyBjYW4gYXBwZWFyIGluIGluZGV4ZWQgcGFydGl0aW9ucyB3aXRoIG5vIHJvd3MgYnV0IHN0YXRpYyBjb250ZW50KSwKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDb21wb25lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gIT0gVmVyc2lvbi5MRUdBQ1kpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5FWFRfQ09NUE9ORU5UX05VTEw7IC8vIGFsd2F5cyBzb3J0cyBiZWZvcmUgbm9uLW51bGxzLCBpbmNsdWRpbmcgZm9yIHJldmVyc2VkIHR5cGVzCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVnYWN5IHZlcnNpb24gZGlkIG5vdCBwZXJtaXQgbnVsbHMgaW4gY2x1c3RlcmluZyBrZXlzIGFuZCB0cmVhdGVkIHRoZXNlIGFzIG51bGwgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnR5cGUoc3JjbnVtKS5pc1JldmVyc2VkKCkgPyBORVhUX0NPTVBPTkVOVF9FTVBUWV9SRVZFUlNFRCA6IE5FWFRfQ09NUE9ORU5UX0VNUFRZOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHN1YnR5cGUoc3JjbnVtKS5hc0NvbXBhcmFibGVCeXRlcyhzcmMuYWNjZXNzb3IoKSwgbmV4dENvbXBvbmVudCwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBhbHNvIG51bGwgdmFsdWVzIGZvciBzb21lIHR5cGVzIChlLmcuIGludCwgdmFyaW50IGJ1dCBub3QgdGV4dCkgdGhhdCBhcmUgZW5jb2RlZCBhcyBlbXB0eQorICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXJzLgorICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnR5cGUoc3JjbnVtKS5pc1JldmVyc2VkKCkgPyBORVhUX0NPTVBPTkVOVF9FTVBUWV9SRVZFUlNFRCA6IE5FWFRfQ09NUE9ORU5UX0VNUFRZOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBORVhUX0NPTVBPTkVOVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzcmMuY2x1c3RlcmluZ1N0cmluZyhzdWJ0eXBlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2VzIGEgY2x1c3RlcmluZyBmcm9tIHRoZSBnaXZlbiBieXRlLWNvbXBhcmFibGUgdmFsdWUuIFRoZSBtZXRob2Qgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHZhbHVlCisgICAgICogZG9lcyBub3QgY29ycmVjdGx5IGVuY29kZSBhIGNsdXN0ZXJpbmcgb2YgdGhpcyB0eXBlLCBpbmNsdWRpbmcgaWYgaXQgZW5jb2RlcyBhIHBvc2l0aW9uIGJlZm9yZSBvciBhZnRlciBhCisgICAgICogY2x1c3RlcmluZyAoaS5lLiBhIGJvdW5kL2JvdW5kYXJ5KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY2Nlc3NvciBBY2Nlc3NvciB0byB1c2UgdG8gY29uc3RydWN0IGNvbXBvbmVudHMuCisgICAgICogQHBhcmFtIGNvbXBhcmFibGUgVGhlIGNsdXN0ZXJpbmcgZW5jb2RlZCBhcyBhIGJ5dGUtY29tcGFyYWJsZSBzZXF1ZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFY+IENsdXN0ZXJpbmc8Vj4gY2x1c3RlcmluZ0Zyb21CeXRlQ29tcGFyYWJsZShWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBCeXRlQ29tcGFyYWJsZSBjb21wYXJhYmxlKQorICAgIHsKKyAgICAgICAgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uID0gQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5PU1M1MDsKKyAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSBvcmRlcmVkQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKGNvbXBhcmFibGUuYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbikpOworCisgICAgICAgIC8vIEZpcnN0IGNoZWNrIGZvciBzcGVjaWFsIGNhc2VzIChwYXJ0aXRpb24ga2V5IG9ubHksIHN0YXRpYyBjbHVzdGVyaW5nKSB0aGF0IGNhbiBkbyB3aXRob3V0IGJ1ZmZlcnMuCisgICAgICAgIGludCBzZXAgPSBvcmRlcmVkQnl0ZXMubmV4dCgpOworICAgICAgICBzd2l0Y2ggKHNlcCkKKyAgICAgICAgeworICAgICAgICBjYXNlIFRFUk1JTkFUT1I6CisgICAgICAgICAgICBhc3NlcnQgc2l6ZSgpID09IDAgOiAiVGVybWluYXRvciBzaG91bGQgYmUgYWZ0ZXIgIiArIHNpemUoKSArICIgY29tcG9uZW50cywgZ290IDAiOworICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc29yLmZhY3RvcnkoKS5jbHVzdGVyaW5nKCk7CisgICAgICAgIGNhc2UgRVhDTFVERUQ6CisgICAgICAgICAgICByZXR1cm4gYWNjZXNzb3IuZmFjdG9yeSgpLnN0YXRpY0NsdXN0ZXJpbmcoKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggcHJvY2Vzc2luZworICAgICAgICB9CisKKyAgICAgICAgaW50IGNjID0gMDsKKyAgICAgICAgVltdIGNvbXBvbmVudHMgPSBhY2Nlc3Nvci5jcmVhdGVBcnJheShzaXplKCkpOworCisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHNlcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgTkVYVF9DT01QT05FTlRfTlVMTDoKKyAgICAgICAgICAgICAgICBjb21wb25lbnRzW2NjXSA9IG51bGw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5FWFRfQ09NUE9ORU5UX0VNUFRZOgorICAgICAgICAgICAgY2FzZSBORVhUX0NPTVBPTkVOVF9FTVBUWV9SRVZFUlNFRDoKKyAgICAgICAgICAgICAgICBjb21wb25lbnRzW2NjXSA9IHN1YnR5cGUoY2MpLmZyb21Db21wYXJhYmxlQnl0ZXMoYWNjZXNzb3IsIG51bGwsIHZlcnNpb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBORVhUX0NPTVBPTkVOVDoKKyAgICAgICAgICAgICAgICAvLyBEZWNvZGUgdGhlIG5leHQgY29tcG9uZW50LCBjb25zdW1pbmcgYnl0ZXMgZnJvbSBvcmRlcmVkQnl0ZXMuCisgICAgICAgICAgICAgICAgY29tcG9uZW50c1tjY10gPSBzdWJ0eXBlKGNjKS5mcm9tQ29tcGFyYWJsZUJ5dGVzKGFjY2Vzc29yLCBvcmRlcmVkQnl0ZXMsIHZlcnNpb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBURVJNSU5BVE9SOgorICAgICAgICAgICAgICAgIGFzc2VydCBjYyA9PSBzaXplKCkgOiAiVGVybWluYXRvciBzaG91bGQgYmUgYWZ0ZXIgIiArIHNpemUoKSArICIgY29tcG9uZW50cywgZ290ICIgKyBjYzsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWNjZXNzb3IuZmFjdG9yeSgpLmNsdXN0ZXJpbmcoY29tcG9uZW50cyk7CisgICAgICAgICAgICBjYXNlIEVYQ0xVREVEOgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVW5leHBlY3RlZCBzdGF0aWMgdGVybWluYXRvciBhZnRlciB0aGUgZmlyc3QgY29tcG9uZW50Iik7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVW5leHBlY3RlZCBzZXBhcmF0b3IgIiArIEludGVnZXIudG9IZXhTdHJpbmcoc2VwKSArICIgaW4gQ2x1c3RlcmluZyBlbmNvZGluZyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytjYzsKKyAgICAgICAgICAgIHNlcCA9IG9yZGVyZWRCeXRlcy5uZXh0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9kdWNlcyBhIGNsdXN0ZXJpbmcgYm91bmQgZnJvbSB0aGUgZ2l2ZW4gYnl0ZS1jb21wYXJhYmxlIHZhbHVlLiBUaGUgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSB2YWx1ZQorICAgICAqIGRvZXMgbm90IGNvcnJlY3RseSBlbmNvZGUgYSBib3VuZCBwb3NpdGlvbiBvZiB0aGlzIHR5cGUsIGluY2x1ZGluZyBpZiBpdCBlbmNvZGVzIGFuIGV4YWN0IGNsdXN0ZXJpbmcuCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgdGhlIGVuY29kZWQgY2x1c3RlcmluZyBwb3NpdGlvbiBjYW5ub3Qgc3BlY2lmeSB0aGUgdHlwZSBvZiBib3VuZCAoaS5lLiBzdGFydC9lbmQvYm91bmRhcnkpIGJlY2F1c2UgdG8KKyAgICAgKiBjb3JyZWN0bHkgY29tcGFyZSBjbHVzdGVyaW5nIHBvc2l0aW9ucyB0aGUgZW5jb2RpbmcgbXVzdCBiZSB0aGUgc2FtZSBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyAoZS5nLiB0aGUgcG9zaXRpb24KKyAgICAgKiBmb3IgYSBleGNsdXNpdmUgZW5kIGFuZCBhbiBpbmNsdXNpdmUgc3RhcnQgaXMgdGhlIHNhbWUsIGJlZm9yZSB0aGUgZXhhY3QgY2x1c3RlcmluZykuIFRoZSB0eXBlIG11c3QgYmUgc3VwcGxpZWQKKyAgICAgKiBzZXBhcmF0ZWx5IChpbiB0aGUgYm91bmQuLi4gdnMgYm91bmRhcnkuLi4gY2FsbCBhbmQgaXNFbmQgYXJndW1lbnQpLgorICAgICAqCisgICAgICogQHBhcmFtIGFjY2Vzc29yIEFjY2Vzc29yIHRvIHVzZSB0byBjb25zdHJ1Y3QgY29tcG9uZW50cy4KKyAgICAgKiBAcGFyYW0gY29tcGFyYWJsZSBUaGUgY2x1c3RlcmluZyBwb3NpdGlvbiBlbmNvZGVkIGFzIGEgYnl0ZS1jb21wYXJhYmxlIHNlcXVlbmNlLgorICAgICAqIEBwYXJhbSBpc0VuZCB0cnVlIGlmIHRoZSBib3VuZCBtYXJrcyB0aGUgZW5kIG9mIGEgcmFuZ2UsIGZhbHNlIGlzIGl0IG1hcmtzIHRoZSBzdGFydC4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFY+IENsdXN0ZXJpbmdCb3VuZDxWPiBib3VuZEZyb21CeXRlQ29tcGFyYWJsZShWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlIGNvbXBhcmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0VuZCkKKyAgICB7CisgICAgICAgIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbiA9IEJ5dGVDb21wYXJhYmxlLlZlcnNpb24uT1NTNTA7CisgICAgICAgIEJ5dGVTb3VyY2UuUGVla2FibGUgb3JkZXJlZEJ5dGVzID0gQnl0ZVNvdXJjZS5wZWVrYWJsZShjb21wYXJhYmxlLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKworICAgICAgICBpbnQgc2VwID0gb3JkZXJlZEJ5dGVzLm5leHQoKTsKKyAgICAgICAgaW50IGNjID0gMDsKKyAgICAgICAgVltdIGNvbXBvbmVudHMgPSBhY2Nlc3Nvci5jcmVhdGVBcnJheShzaXplKCkpOworCisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHNlcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgTkVYVF9DT01QT05FTlRfTlVMTDoKKyAgICAgICAgICAgICAgICBjb21wb25lbnRzW2NjXSA9IG51bGw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5FWFRfQ09NUE9ORU5UX0VNUFRZOgorICAgICAgICAgICAgY2FzZSBORVhUX0NPTVBPTkVOVF9FTVBUWV9SRVZFUlNFRDoKKyAgICAgICAgICAgICAgICBjb21wb25lbnRzW2NjXSA9IHN1YnR5cGUoY2MpLmZyb21Db21wYXJhYmxlQnl0ZXMoYWNjZXNzb3IsIG51bGwsIHZlcnNpb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBORVhUX0NPTVBPTkVOVDoKKyAgICAgICAgICAgICAgICAvLyBEZWNvZGUgdGhlIG5leHQgY29tcG9uZW50LCBjb25zdW1pbmcgYnl0ZXMgZnJvbSBvcmRlcmVkQnl0ZXMuCisgICAgICAgICAgICAgICAgY29tcG9uZW50c1tjY10gPSBzdWJ0eXBlKGNjKS5mcm9tQ29tcGFyYWJsZUJ5dGVzKGFjY2Vzc29yLCBvcmRlcmVkQnl0ZXMsIHZlcnNpb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCeXRlU291cmNlLkxUX05FWFRfQ09NUE9ORU5UOgorICAgICAgICAgICAgICAgIHJldHVybiBhY2Nlc3Nvci5mYWN0b3J5KCkuYm91bmQoaXNFbmQgPyBDbHVzdGVyaW5nUHJlZml4LktpbmQuRVhDTF9FTkRfQk9VTkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLklOQ0xfU1RBUlRfQk9VTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuY29weU9mKGNvbXBvbmVudHMsIGNjKSk7CisgICAgICAgICAgICBjYXNlIEJ5dGVTb3VyY2UuR1RfTkVYVF9DT01QT05FTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc29yLmZhY3RvcnkoKS5ib3VuZChpc0VuZCA/IENsdXN0ZXJpbmdQcmVmaXguS2luZC5JTkNMX0VORF9CT1VORAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDbHVzdGVyaW5nUHJlZml4LktpbmQuRVhDTF9TVEFSVF9CT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5jb3B5T2YoY29tcG9uZW50cywgY2MpKTsKKworICAgICAgICAgICAgY2FzZSBCeXRlU291cmNlLkxUTFRfTkVYVF9DT01QT05FTlQ6CisgICAgICAgICAgICBjYXNlIEJ5dGVTb3VyY2UuR1RHVF9ORVhUX0NPTVBPTkVOVDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIlVuZXhwZWN0ZWQgc3N0YWJsZSBsb3dlci91cHBlciBib3VuZCAtIGJ5dGUgY29tcGFyYWJsZSByZXByZXNlbnRhdGlvbiBvZiBhcnRpZmljaWFsIHNzdGFibGUgYm91bmRzIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIlVuZXhwZWN0ZWQgc2VwYXJhdG9yICIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHNlcCkgKyAiIGluIENsdXN0ZXJpbmdCb3VuZCBlbmNvZGluZyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytjYzsKKyAgICAgICAgICAgIHNlcCA9IG9yZGVyZWRCeXRlcy5uZXh0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9kdWNlcyBhIGNsdXN0ZXJpbmcgYm91bmRhcnkgZnJvbSB0aGUgZ2l2ZW4gYnl0ZS1jb21wYXJhYmxlIHZhbHVlLiBUaGUgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZQorICAgICAqIHZhbHVlIGRvZXMgbm90IGNvcnJlY3RseSBlbmNvZGUgYSBib3VuZCBwb3NpdGlvbiBvZiB0aGlzIHR5cGUsIGluY2x1ZGluZyBpZiBpdCBlbmNvZGVzIGFuIGV4YWN0IGNsdXN0ZXJpbmcuCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgdGhlIGVuY29kZWQgY2x1c3RlcmluZyBwb3NpdGlvbiBjYW5ub3Qgc3BlY2lmeSB0aGUgdHlwZSBvZiBib3VuZCAoaS5lLiBzdGFydC9lbmQvYm91bmRhcnkpIGJlY2F1c2UgdG8KKyAgICAgKiBjb3JyZWN0bHkgY29tcGFyZSBjbHVzdGVyaW5nIHBvc2l0aW9ucyB0aGUgZW5jb2RpbmcgbXVzdCBiZSB0aGUgc2FtZSBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyAoZS5nLiB0aGUgcG9zaXRpb24KKyAgICAgKiBmb3IgYSBleGNsdXNpdmUgZW5kIGFuZCBhbiBpbmNsdXNpdmUgc3RhcnQgaXMgdGhlIHNhbWUsIGJlZm9yZSB0aGUgZXhhY3QgY2x1c3RlcmluZykuIFRoZSB0eXBlIG11c3QgYmUgc3VwcGxpZWQKKyAgICAgKiBzZXBhcmF0ZWx5IChpbiB0aGUgYm91bmQuLi4gdnMgYm91bmRhcnkuLi4gY2FsbCBhbmQgaXNFbmQgYXJndW1lbnQpLgorICAgICAqCisgICAgICogQHBhcmFtIGFjY2Vzc29yIEFjY2Vzc29yIHRvIHVzZSB0byBjb25zdHJ1Y3QgY29tcG9uZW50cy4KKyAgICAgKiBAcGFyYW0gY29tcGFyYWJsZSBUaGUgY2x1c3RlcmluZyBwb3NpdGlvbiBlbmNvZGVkIGFzIGEgYnl0ZS1jb21wYXJhYmxlIHNlcXVlbmNlLgorICAgICAqLworICAgIHB1YmxpYyA8Vj4gQ2x1c3RlcmluZ0JvdW5kYXJ5PFY+IGJvdW5kYXJ5RnJvbUJ5dGVDb21wYXJhYmxlKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVDb21wYXJhYmxlIGNvbXBhcmFibGUpCisgICAgeworICAgICAgICBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24gPSBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwOworICAgICAgICBCeXRlU291cmNlLlBlZWthYmxlIG9yZGVyZWRCeXRlcyA9IEJ5dGVTb3VyY2UucGVla2FibGUoY29tcGFyYWJsZS5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSk7CisKKyAgICAgICAgaW50IHNlcCA9IG9yZGVyZWRCeXRlcy5uZXh0KCk7CisgICAgICAgIGludCBjYyA9IDA7CisgICAgICAgIFZbXSBjb21wb25lbnRzID0gYWNjZXNzb3IuY3JlYXRlQXJyYXkoc2l6ZSgpKTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChzZXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIE5FWFRfQ09NUE9ORU5UX05VTEw6CisgICAgICAgICAgICAgICAgY29tcG9uZW50c1tjY10gPSBudWxsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBORVhUX0NPTVBPTkVOVF9FTVBUWToKKyAgICAgICAgICAgIGNhc2UgTkVYVF9DT01QT05FTlRfRU1QVFlfUkVWRVJTRUQ6CisgICAgICAgICAgICAgICAgY29tcG9uZW50c1tjY10gPSBzdWJ0eXBlKGNjKS5mcm9tQ29tcGFyYWJsZUJ5dGVzKGFjY2Vzc29yLCBudWxsLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTkVYVF9DT01QT05FTlQ6CisgICAgICAgICAgICAgICAgLy8gRGVjb2RlIHRoZSBuZXh0IGNvbXBvbmVudCwgY29uc3VtaW5nIGJ5dGVzIGZyb20gb3JkZXJlZEJ5dGVzLgorICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbY2NdID0gc3VidHlwZShjYykuZnJvbUNvbXBhcmFibGVCeXRlcyhhY2Nlc3Nvciwgb3JkZXJlZEJ5dGVzLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnl0ZVNvdXJjZS5MVF9ORVhUX0NPTVBPTkVOVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gYWNjZXNzb3IuZmFjdG9yeSgpLmJvdW5kYXJ5KENsdXN0ZXJpbmdQcmVmaXguS2luZC5FWENMX0VORF9JTkNMX1NUQVJUX0JPVU5EQVJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmNvcHlPZihjb21wb25lbnRzLCBjYykpOworICAgICAgICAgICAgY2FzZSBCeXRlU291cmNlLkdUX05FWFRfQ09NUE9ORU5UOgorICAgICAgICAgICAgICAgIHJldHVybiBhY2Nlc3Nvci5mYWN0b3J5KCkuYm91bmRhcnkoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLklOQ0xfRU5EX0VYQ0xfU1RBUlRfQk9VTkRBUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuY29weU9mKGNvbXBvbmVudHMsIGNjKSk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVW5leHBlY3RlZCBzZXBhcmF0b3IgIiArIEludGVnZXIudG9IZXhTdHJpbmcoc2VwKSArICIgaW4gQ2x1c3RlcmluZ0JvdW5kYXJ5IGVuY29kaW5nIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2NjOworICAgICAgICAgICAgc2VwID0gb3JkZXJlZEJ5dGVzLm5leHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIEEgY29tcGFyYXRvciBmb3Igcm93cy4KICAgICAgKgogICAgICAqIEEge0Bjb2RlIFJvd30gaXMgYSB7QGNvZGUgQ2x1c3RlcmFibGV9IHNvIHtAY29kZSBDbHVzdGVyaW5nQ29tcGFyYXRvcn0gY2FuIGJlIHVzZWQKQEAgLTI3OSw0ICs1NTUsNCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaENvZGUoY2x1c3RlcmluZ1R5cGVzKTsKICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZ1ByZWZpeC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZ1ByZWZpeC5qYXZhCmluZGV4IGExMjkxYzguLmJlODFlNWQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NsdXN0ZXJpbmdQcmVmaXguamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9DbHVzdGVyaW5nUHJlZml4LmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlRvSW50RnVuY3Rpb247CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5JTWVhc3VyYWJsZU1lbW9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuKjsKQEAgLTMzLDcgKzM0LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVBcnJheVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGUuVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOwogCiAvKioKICAqIEEgY2x1c3RlcmluZyBwcmVmaXggaXMgdGhlIHVuaXQgb2Ygd2hhdCBhIHtAbGluayBDbHVzdGVyaW5nQ29tcGFyYXRvcn0gY2FuIGNvbXBhcmUuCkBAIC02MiwxNCArNjQsMjAgQEAKICAgICB7CiAgICAgICAgIC8vIFdBUk5JTkc6IHRoZSBvcmRlcmluZyBvZiB0aGF0IGVudW0gbWF0dGVycyBiZWNhdXNlIHdlIHVzZSBvcmRpbmFsKCkgaW4gdGhlIHNlcmlhbGl6YXRpb24KIAotICAgICAgICBFWENMX0VORF9CT1VORCAgICAgICAgICAgICAgKDAsIC0xKSwKLSAgICAgICAgSU5DTF9TVEFSVF9CT1VORCAgICAgICAgICAgICgwLCAtMSksCi0gICAgICAgIEVYQ0xfRU5EX0lOQ0xfU1RBUlRfQk9VTkRBUlkoMCwgLTEpLAotICAgICAgICBTVEFUSUNfQ0xVU1RFUklORyAgICAgICAgICAgKDEsIC0xKSwKLSAgICAgICAgQ0xVU1RFUklORyAgICAgICAgICAgICAgICAgICgyLCAgMCksCi0gICAgICAgIElOQ0xfRU5EX0VYQ0xfU1RBUlRfQk9VTkRBUlkoMywgIDEpLAotICAgICAgICBJTkNMX0VORF9CT1VORCAgICAgICAgICAgICAgKDMsICAxKSwKLSAgICAgICAgRVhDTF9TVEFSVF9CT1VORCAgICAgICAgICAgICgzLCAgMSk7CisgICAgICAgIC8vIEBmb3JtYXR0ZXI6b2ZmCisgICAgICAgIEVYQ0xfRU5EX0JPVU5EICAgICAgICAgICAgICAgKCAwLCAtMSwgdiAtPiBCeXRlU291cmNlLkxUX05FWFRfQ09NUE9ORU5UKSwKKyAgICAgICAgSU5DTF9TVEFSVF9CT1VORCAgICAgICAgICAgICAoIDAsIC0xLCB2IC0+IEJ5dGVTb3VyY2UuTFRfTkVYVF9DT01QT05FTlQpLAorICAgICAgICBFWENMX0VORF9JTkNMX1NUQVJUX0JPVU5EQVJZICggMCwgLTEsIHYgLT4gQnl0ZVNvdXJjZS5MVF9ORVhUX0NPTVBPTkVOVCksCisgICAgICAgIFNUQVRJQ19DTFVTVEVSSU5HICAgICAgICAgICAgKCAxLCAtMSwgdiAtPiB2ID09IFZlcnNpb24uTEVHQUNZID8gQnl0ZVNvdXJjZS5MVF9ORVhUX0NPTVBPTkVOVCArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCeXRlU291cmNlLkVYQ0xVREVEKSwKKyAgICAgICAgQ0xVU1RFUklORyAgICAgICAgICAgICAgICAgICAoIDIsICAwLCB2IC0+IHYgPT0gVmVyc2lvbi5MRUdBQ1kgPyBCeXRlU291cmNlLk5FWFRfQ09NUE9ORU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQnl0ZVNvdXJjZS5URVJNSU5BVE9SKSwKKyAgICAgICAgSU5DTF9FTkRfRVhDTF9TVEFSVF9CT1VOREFSWSAoIDMsICAxLCB2IC0+IEJ5dGVTb3VyY2UuR1RfTkVYVF9DT01QT05FTlQpLAorICAgICAgICBJTkNMX0VORF9CT1VORCAgICAgICAgICAgICAgICggMywgIDEsIHYgLT4gQnl0ZVNvdXJjZS5HVF9ORVhUX0NPTVBPTkVOVCksCisgICAgICAgIEVYQ0xfU1RBUlRfQk9VTkQgICAgICAgICAgICAgKCAzLCAgMSwgdiAtPiBCeXRlU291cmNlLkdUX05FWFRfQ09NUE9ORU5UKSwKKyAgICAgICAgU1NUQUJMRV9MT1dFUl9CT1VORCAgICAgICAgICAoLTEsIC0xLCB2IC0+IEJ5dGVTb3VyY2UuTFRMVF9ORVhUX0NPTVBPTkVOVCksCisgICAgICAgIFNTVEFCTEVfVVBQRVJfQk9VTkQgICAgICAgICAgKCA0LCAgMSwgdiAtPiBCeXRlU291cmNlLkdUR1RfTkVYVF9DT01QT05FTlQpOworICAgICAgICAvLyBAZm9ybWF0dGVyOm9uCiAKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgY29tcGFyaXNvbjsKIApAQCAtNzksMTAgKzg3LDEzIEBACiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVkVG9DbHVzdGVyaW5nOwogCi0gICAgICAgIEtpbmQoaW50IGNvbXBhcmlzb24sIGludCBjb21wYXJlZFRvQ2x1c3RlcmluZykKKyAgICAgICAgcHVibGljIGZpbmFsIFRvSW50RnVuY3Rpb248VmVyc2lvbj4gYXNCeXRlQ29tcGFyYWJsZTsKKworICAgICAgICBLaW5kKGludCBjb21wYXJpc29uLCBpbnQgY29tcGFyZWRUb0NsdXN0ZXJpbmcsIFRvSW50RnVuY3Rpb248VmVyc2lvbj4gYXNCeXRlQ29tcGFyYWJsZSkKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy5jb21wYXJpc29uID0gY29tcGFyaXNvbjsKICAgICAgICAgICAgIHRoaXMuY29tcGFyZWRUb0NsdXN0ZXJpbmcgPSBjb21wYXJlZFRvQ2x1c3RlcmluZzsKKyAgICAgICAgICAgIHRoaXMuYXNCeXRlQ29tcGFyYWJsZSA9IGFzQnl0ZUNvbXBhcmFibGU7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTE5Nyw2ICsyMDgsMTYgQEAKICAgICAgICAgICAgICAgICAgPyAodGhpcyA9PSBJTkNMX0VORF9FWENMX1NUQVJUX0JPVU5EQVJZID8gSU5DTF9FTkRfQk9VTkQgOiBFWENMX0VORF9CT1VORCkKICAgICAgICAgICAgICAgICAgOiAodGhpcyA9PSBJTkNMX0VORF9FWENMX1NUQVJUX0JPVU5EQVJZID8gRVhDTF9TVEFSVF9CT1VORCA6IElOQ0xfU1RBUlRfQk9VTkQpOwogICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogUmV0dXJucyBhIHRlcm1pbmF0b3IgdmFsdWUgZm9yIHRoaXMgY2x1c3RlcmluZyB0eXBlIHRoYXQgaXMgc3VpdGFibGUgZm9yIGJ5dGUgY29tcGFyaXNvbi4KKyAgICAgICAgICogSW5jbHVzaXZlIHN0YXJ0cyAvIGV4Y2x1c2l2ZSBlbmRzIG5lZWQgYSBsb3dlciB2YWx1ZSB0aGFuIEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQgYW5kIHRoZSBjbHVzdGVyaW5nIGJ5dGUsCisgICAgICAgICAqIGV4Y2x1c2l2ZSBzdGFydHMgLyBpbmNsdXNpdmUgZW5kcyAtLSBhIGhpZ2hlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgYXNCeXRlQ29tcGFyYWJsZVZhbHVlKFZlcnNpb24gdmVyc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGFzQnl0ZUNvbXBhcmFibGUuYXBwbHlBc0ludCh2ZXJzaW9uKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGRlZmF1bHQgYm9vbGVhbiBpc0JvdHRvbSgpCkBAIC0yOTIsNiArMzEzLDIyIEBACiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKTsKIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhpcyBwcmVmaXggYXMgYSBzdGFydCBib3VuZC4KKyAgICAgKiBJZiB0aGlzIHByZWZpeCBpcyBhIGJvdW5kLCBqdXN0IHJldHVybnMgaXQgYXNzZXJ0aW5nIHRoYXQgaXQgaXMgYSBzdGFydCBib3VuZC4KKyAgICAgKiBJZiB0aGlzIHByZWZpeCBpcyBhIGNsdXN0ZXJpbmcsIHJldHVybnMgYW4gaW5jbHVkZWQgc3RhcnQgYm91bmQuCisgICAgICogSWYgdGhpcyBwcmVmaXggaXMgYSBib3VuZGFyeSwgcmV0dXJucyBhbiBvcGVuIGJvdW5kIG9mIGl0CisgICAgICovCisgICAgQ2x1c3RlcmluZ0JvdW5kPFY+IGFzU3RhcnRCb3VuZCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGlzIHByZWZpeCBhcyBhbiBlbmQgYm91bmQuCisgICAgICogSWYgdGhpcyBwcmVmaXggaXMgYSBib3VuZCwganVzdCByZXR1cm5zIGl0IGFzc2VydGluZyB0aGF0IGl0IGlzIGFuIGVuZCBib3VuZC4KKyAgICAgKiBJZiB0aGlzIHByZWZpeCBpcyBhIGNsdXN0ZXJpbmcsIHJldHVybnMgYW4gaW5jbHVkZWQgZW5kIGJvdW5kLgorICAgICAqIEluIHRoaXMgcHJlZml4IGlzIGEgYm91bmRhcnksIHJldHVybnMgYSBjbG9zZSBib3VuZCBvZiBpdC4KKyAgICAgKi8KKyAgICBDbHVzdGVyaW5nQm91bmQ8Vj4gYXNFbmRCb3VuZCgpOworCiAgICAgLyoKICAgICAgKiBUT0RPOiB3ZSBzaG91bGQgc3RvcCB1c2luZyBDbHVzdGVyaW5nIGZvciBwYXJ0aXRpb24ga2V5cy4gTWF5YmUgd2UgY2FuIGFkZAogICAgICAqIGEgZmV3IG1ldGhvZHMgdG8gRGVjb3JhdGVkS2V5IHNvIHdlIGRvbid0IGhhdmUgdG8gKG5vdGUgdGhhdCB3aGlsZSB1c2luZyBhIENsdXN0ZXJpbmcKQEAgLTMwOCw2ICszNDUsMjQgQEAKICAgICAgICAgICAgIHZhbHVlc1tpXSA9IGFjY2Vzc29yKCkudG9CdWZmZXIoZ2V0KGkpKTsKICAgICAgICAgcmV0dXJuIENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCB2YWx1ZXMpOwogICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2UgYSBodW1hbi1yZWFkYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2x1c3RlcmluZyBnaXZlbiB0aGUgbGlzdCBvZiB0eXBlcy4KKyAgICAgKiBFYXNpZXIgdG8gYWNjZXNzIHRoYW4gbWV0YWRhdGEgZm9yIGRlYnVnZ2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZGVmYXVsdCBTdHJpbmcgY2x1c3RlcmluZ1N0cmluZyhMaXN0PEFic3RyYWN0VHlwZTw/Pj4gdHlwZXMpCisgICAgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgc2IuYXBwZW5kKGtpbmQoKSkuYXBwZW5kKCcoJyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodHlwZXMuZ2V0KGkpLmdldFN0cmluZyhnZXQoaSksIGFjY2Vzc29yKCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IuYXBwZW5kKCcpJykudG9TdHJpbmcoKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBUaGUgdmFsdWVzIG9mIHRoaXMgcHJlZml4IGFzIGFuIGFycmF5LgogICAgICAqIDxwPgpAQCAtMzIyLDEwICszNzcsMTEgQEAKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlcltdIGdldEJ1ZmZlckFycmF5KCk7CiAKICAgICAvKioKLSAgICAgKiBJZiB0aGUgcHJlZml4IGNvbnRhaW5zIGJ5dGUgYnVmZmVycyB0aGF0IGNhbiBiZSBtaW5pbWl6ZWQgKHNlZSB7QGxpbmsgQnl0ZUJ1ZmZlclV0aWwjbWluaW1hbEJ1ZmZlckZvcihCeXRlQnVmZmVyKX0pLAotICAgICAqIHRoaXMgd2lsbCByZXR1cm4gYSBjb3B5IG9mIHRoZSBwcmVmaXggd2l0aCBtaW5pbWl6ZWQgdmFsdWVzLCBvdGhlcndpc2UgaXQgcmV0dXJucyBpdHNlbGYuCisgICAgICogUmV0dXJuIHRoZSBrZXkgaW4gYSBmb3JtIHRoYXQgY2FuIGJlIHJldGFpbmVkIGZvciBsb25nZXItdGVybSB1c2UuIFRoaXMgbWVhbnMgZXh0cmFjdGluZyBrZXlzIHN0b3JlZCBpbiBzaGFyZWQKKyAgICAgKiBtZW1vcnkgKGkuZS4gaW4gbWVtdGFibGVzKSB0byBtaW5pbWl6ZWQgb24taGVhcCB2ZXJzaW9ucy4KKyAgICAgKiBJZiB0aGUgb2JqZWN0IGlzIGFscmVhZHkgaW4gbWluaW1hbCBmb3JtLCBubyBhY3Rpb24gd2lsbCBiZSB0YWtlbi4KICAgICAgKi8KLSAgICBwdWJsaWMgQ2x1c3RlcmluZ1ByZWZpeDxWPiBtaW5pbWl6ZSgpOworICAgIHB1YmxpYyBDbHVzdGVyaW5nUHJlZml4PFY+IHJldGFpbmFibGUoKTsKIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VyaWFsaXplcgogICAgIHsKQEAgLTY3Niw0ICs3MzIsNCBAQAogICAgICAgICByZXR1cm4gZXF1YWxzKHByZWZpeCwgKENsdXN0ZXJpbmdQcmVmaXg8Pz4pIG8pOwogICAgIH0KIAotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NvbHVtbkZhbWlseVN0b3JlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Db2x1bW5GYW1pbHlTdG9yZS5qYXZhCmluZGV4IDM2MTk1MjAuLjFiZTIwODUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NvbHVtbkZhbWlseVN0b3JlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ29sdW1uRmFtaWx5U3RvcmUuamF2YQpAQCAtMjIsNyArMjIsNiBAQAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEudGltZS5JbnN0YW50OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKQEAgLTM5LDYgKzM4LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CkBAIC04NCwyMCArODQsMjAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZy5Db21taXRMb2dQb3NpdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkFic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkluZm87CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uTWFuYWdlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uVmVyaWZpZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNsdXN0ZXJpbmdJbmRleEZpbHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuRGF0YUxpbWl0czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZS5GbHVzaGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZS5NZW10YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZS5TaGFyZEJvdW5kYXJpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZU5ld1RyYWNrZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5TU1RhYmxlU2V0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5UcmFja2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5WaWV3OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLkZsdXNoaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLk1lbXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLlNoYXJkQm91bmRhcmllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLkNhY2hlZFBhcnRpdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlBhcnRpdGlvblVwZGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yZXBhaXIuQ2Fzc2FuZHJhVGFibGVSZXBhaXJNYW5hZ2VyOwpAQCAtMTE5LDE3ICsxMTksMTkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU1dyaXRlRXJyb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVNjcnViYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVZlcmlmaWVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVJZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVJZEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlTXVsdGlXcml0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0LkNvbXBvbmVudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb2xsZWN0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZU91dHB1dFN0cmVhbVBsdXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5TYW1wbGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuU2FtcGxlci5TYW1wbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5TYW1wbGVyLlNhbXBsZXJUeXBlOwpAQCAtMTU1LDYgKzE1Nyw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy5CYWxsb3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy5QYXhvc1JlcGFpckhpc3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy5UYWJsZVBheG9zUmVwYWlySGlzdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnNuYXBzaG90LlNuYXBzaG90TG9hZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2Uuc25hcHNob3QuU25hcHNob3RNYW5pZmVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnNuYXBzaG90LlRhYmxlU25hcHNob3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlRhYmxlU3RyZWFtTWFuYWdlcjsKQEAgLTE2Myw4ICsxNjYsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5FeGVjdXRvclV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpWTVN0YWJpbGl0eUluc3BlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Kc29uVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTUJlYW5XcmFwcGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk5vU3BhbUxvZ2dlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLldyYXBwZWRSdW5uYWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwpAQCAtMTczLDcgKzE3OCw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWZzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuVW5jaGVja2VkSW50ZXJydXB0ZWRFeGNlcHRpb247CiAKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzLnByb3BhZ2F0ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvckZhY3RvcnkuR2xvYmFsLmV4ZWN1dG9yRmFjdG9yeTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvci5nZXRGbHVzaFdyaXRlcnM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZy5Db21taXRMb2dQb3NpdGlvbi5OT05FOwpAQCAtMTg0LDcgKzE4OCw3IEBACiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRocm93YWJsZXMubWVyZ2U7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2gubmV3Q291bnREb3duTGF0Y2g7CiAKLXB1YmxpYyBjbGFzcyBDb2x1bW5GYW1pbHlTdG9yZSBpbXBsZW1lbnRzIENvbHVtbkZhbWlseVN0b3JlTUJlYW4sIE1lbXRhYmxlLk93bmVyCitwdWJsaWMgY2xhc3MgQ29sdW1uRmFtaWx5U3RvcmUgaW1wbGVtZW50cyBDb2x1bW5GYW1pbHlTdG9yZU1CZWFuLCBNZW10YWJsZS5Pd25lciwgU1NUYWJsZS5Pd25lcgogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDb2x1bW5GYW1pbHlTdG9yZS5jbGFzcyk7CiAKQEAgLTMyMCw2ICszMjQsOSBAQAogCiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGNvbXBhY3Rpb25TcGFjZUNoZWNrID0gdHJ1ZTsKIAorICAgIC8vIFRvbWJ0b25lIHBhcnRpdGlvbnMgdGhhdCBpZ25vcmUgdGhlIGdjX2dyYWNlX3NlY29uZHMgZHVyaW5nIGNvbXBhY3Rpb24KKyAgICBwcml2YXRlIGZpbmFsIFNldDxEZWNvcmF0ZWRLZXk+IHBhcnRpdGlvbktleVNldElnbm9yZUdjR3JhY2UgPSBDb25jdXJyZW50SGFzaE1hcC5uZXdLZXlTZXQoKTsKKwogICAgIEBWaXNpYmxlRm9yVGVzdGluZwogICAgIGZpbmFsIERpc2tCb3VuZGFyeU1hbmFnZXIgZGlza0JvdW5kYXJ5TWFuYWdlciA9IG5ldyBEaXNrQm91bmRhcnlNYW5hZ2VyKCk7CiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBTaGFyZEJvdW5kYXJpZXMgY2FjaGVkU2hhcmRCb3VuZGFyaWVzID0gbnVsbDsKQEAgLTM3OCw3ICszODUsNyBAQAogICAgICAgICAgICAgZm9yIChDb2x1bW5GYW1pbHlTdG9yZSBjZnMgOiBjb25jYXRXaXRoSW5kZXhlcygpKQogICAgICAgICAgICAgICAgIGNmcy5jcmNDaGVja0NoYW5jZSA9IG5ldyBEZWZhdWx0VmFsdWUobWV0YWRhdGEoKS5wYXJhbXMuY3JjQ2hlY2tDaGFuY2UpOwogCi0gICAgICAgIGNvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIubWF5YmVSZWxvYWQobWV0YWRhdGEoKSk7CisgICAgICAgIGNvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIubWF5YmVSZWxvYWRQYXJhbXNGcm9tU2NoZW1hKG1ldGFkYXRhKCkucGFyYW1zLmNvbXBhY3Rpb24pOwogCiAgICAgICAgIGluZGV4TWFuYWdlci5yZWxvYWQoKTsKIApAQCAtNDAyLDcgKzQwOSw3IEBACiAKICAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBhY3Rpb25QYXJhbWV0ZXJzSnNvbigpCiAgICAgewotICAgICAgICByZXR1cm4gRkJVdGlsaXRpZXMuanNvbihnZXRDb21wYWN0aW9uUGFyYW1ldGVycygpKTsKKyAgICAgICAgcmV0dXJuIEpzb25VdGlscy53cml0ZUFzSnNvblN0cmluZyhnZXRDb21wYWN0aW9uUGFyYW1ldGVycygpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRDb21wYWN0aW9uUGFyYW1ldGVycyhNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnMpCkBAIC00MTEsNyArNDE4LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ29tcGFjdGlvblBhcmFtcyBjb21wYWN0aW9uUGFyYW1zID0gQ29tcGFjdGlvblBhcmFtcy5mcm9tTWFwKG9wdGlvbnMpOwogICAgICAgICAgICAgY29tcGFjdGlvblBhcmFtcy52YWxpZGF0ZSgpOwotICAgICAgICAgICAgY29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlci5zZXROZXdMb2NhbENvbXBhY3Rpb25TdHJhdGVneShjb21wYWN0aW9uUGFyYW1zKTsKKyAgICAgICAgICAgIGNvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIub3ZlcnJpZGVMb2NhbFBhcmFtcyhjb21wYWN0aW9uUGFyYW1zKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCiAgICAgICAgIHsKQEAgLTQyMyw3ICs0MzAsNyBAQAogCiAgICAgcHVibGljIHZvaWQgc2V0Q29tcGFjdGlvblBhcmFtZXRlcnNKc29uKFN0cmluZyBvcHRpb25zKQogICAgIHsKLSAgICAgICAgc2V0Q29tcGFjdGlvblBhcmFtZXRlcnMoRkJVdGlsaXRpZXMuZnJvbUpzb25NYXAob3B0aW9ucykpOworICAgICAgICBzZXRDb21wYWN0aW9uUGFyYW1ldGVycyhKc29uVXRpbHMuZnJvbUpzb25NYXAob3B0aW9ucykpOwogICAgIH0KIAogICAgIHB1YmxpYyBNYXA8U3RyaW5nLFN0cmluZz4gZ2V0Q29tcHJlc3Npb25QYXJhbWV0ZXJzKCkKQEAgLTQzMyw3ICs0NDAsNyBAQAogCiAgICAgcHVibGljIFN0cmluZyBnZXRDb21wcmVzc2lvblBhcmFtZXRlcnNKc29uKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBGQlV0aWxpdGllcy5qc29uKGdldENvbXByZXNzaW9uUGFyYW1ldGVycygpKTsKKyAgICAgICAgcmV0dXJuIEpzb25VdGlscy53cml0ZUFzSnNvblN0cmluZyhnZXRDb21wcmVzc2lvblBhcmFtZXRlcnMoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0Q29tcHJlc3Npb25QYXJhbWV0ZXJzKE1hcDxTdHJpbmcsU3RyaW5nPiBvcHRzKQpAQCAtNDUyLDcgKzQ1OSw3IEBACiAKICAgICBwdWJsaWMgdm9pZCBzZXRDb21wcmVzc2lvblBhcmFtZXRlcnNKc29uKFN0cmluZyBvcHRpb25zKQogICAgIHsKLSAgICAgICAgc2V0Q29tcHJlc3Npb25QYXJhbWV0ZXJzKEZCVXRpbGl0aWVzLmZyb21Kc29uTWFwKG9wdGlvbnMpKTsKKyAgICAgICAgc2V0Q29tcHJlc3Npb25QYXJhbWV0ZXJzKEpzb25VdGlscy5mcm9tSnNvbk1hcChvcHRpb25zKSk7CiAgICAgfQogCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCkBAIC01MDIsNyArNTA5LDcgQEAKICAgICAgICAgaWYgKGRhdGEubG9hZHNzdGFibGVzKQogICAgICAgICB7CiAgICAgICAgICAgICBEaXJlY3Rvcmllcy5TU1RhYmxlTGlzdGVyIHNzdGFibGVGaWxlcyA9IGRpcmVjdG9yaWVzLnNzdGFibGVMaXN0ZXIoRGlyZWN0b3JpZXMuT25UeG5FcnIuSUdOT1JFKS5za2lwVGVtcG9yYXJ5KHRydWUpOwotICAgICAgICAgICAgc3N0YWJsZXMgPSBTU1RhYmxlUmVhZGVyLm9wZW5BbGwoc3N0YWJsZUZpbGVzLmxpc3QoKS5lbnRyeVNldCgpLCBtZXRhZGF0YSk7CisgICAgICAgICAgICBzc3RhYmxlcyA9IFNTVGFibGVSZWFkZXIub3BlbkFsbCh0aGlzLCBzc3RhYmxlRmlsZXMubGlzdCgpLmVudHJ5U2V0KCksIG1ldGFkYXRhKTsKICAgICAgICAgICAgIGRhdGEuYWRkSW5pdGlhbFNTVGFibGVzV2l0aG91dFVwZGF0aW5nU2l6ZShzc3RhYmxlcyk7CiAgICAgICAgIH0KIApAQCAtNjA3LDYgKzYxNCw3IEBACiAgICAgICAgIHJldHVybiBkaXJlY3RvcmllczsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldERhdGFQYXRocygpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgTGlzdDxTdHJpbmc+IGRhdGFQYXRocyA9IG5ldyBBcnJheUxpc3Q8PigpOwpAQCAtNzkyLDE5ICs4MDAsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgRmlsZSBkYXRhRmlsZSA9IG5ldyBGaWxlKGRlc2MuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpKTsKLSAgICAgICAgICAgIGlmIChjb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudC5EQVRBKSAmJiBkYXRhRmlsZS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgLy8gZXZlcnl0aGluZyBhcHBlYXJzIHRvIGJlIGluIG9yZGVyLi4uIG1vdmluZyBvbi4KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgLy8gbWlzc2luZyB0aGUgREFUQSBmaWxlISBhbGwgY29tcG9uZW50cyBhcmUgb3JwaGFuZWQKLSAgICAgICAgICAgIGxvZ2dlci53YXJuKCJSZW1vdmluZyBvcnBoYW5zIGZvciB7fToge30iLCBkZXNjLCBjb21wb25lbnRzKTsKLSAgICAgICAgICAgIGZvciAoQ29tcG9uZW50IGNvbXBvbmVudCA6IGNvbXBvbmVudHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGVzYy5maWxlbmFtZUZvcihjb21wb25lbnQpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZVdpdGhDb25maXJtKGRlc2MuZmlsZW5hbWVGb3IoY29tcG9uZW50KSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBkZXNjLmdldEZvcm1hdCgpLmRlbGV0ZU9ycGhhbmVkQ29tcG9uZW50cyhkZXNjLCBjb21wb25lbnRzKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGNsZWFudXAgaW5jb21wbGV0ZSBzYXZlZCBjYWNoZXMKQEAgLTg4MywxMCArODc5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmNmbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmNyZW1lbnQgdGhlIGdlbmVyYXRpb24gdW50aWwgd2UgZmluZCBhIGZpbGVuYW1lIHRoYXQgZG9lc24ndCBleGlzdC4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgbmV3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU1NUYWJsZXMgdGhhdCBhcmUgYmVpbmcgbG9hZGVkIG1pZ2h0IGFscmVhZHkgdXNlIHRoZXNlIGdlbmVyYXRpb24gbnVtYmVycy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlSWRHZW5lcmF0b3IuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5mb3JtYXRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlSWRHZW5lcmF0b3IuZ2V0KCkpOwogICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChuZXdEZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50LkRBVEEpLmV4aXN0cygpKTsKKyAgICAgICAgd2hpbGUgKG5ld0Rlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpLmV4aXN0cygpKTsKICAgICAgICAgcmV0dXJuIG5ld0Rlc2NyaXB0b3I7CiAgICAgfQogCkBAIC05MzAsMjMgKzkyNSwyMiBAQAogCiAgICAgcHVibGljIERlc2NyaXB0b3IgbmV3U1NUYWJsZURlc2NyaXB0b3IoRmlsZSBkaXJlY3RvcnkpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3U1NUYWJsZURlc2NyaXB0b3IoZGlyZWN0b3J5LCBTU1RhYmxlRm9ybWF0LlR5cGUuY3VycmVudCgpLmluZm8uZ2V0TGF0ZXN0VmVyc2lvbigpLCBTU1RhYmxlRm9ybWF0LlR5cGUuY3VycmVudCgpKTsKKyAgICAgICAgcmV0dXJuIG5ld1NTVGFibGVEZXNjcmlwdG9yKGRpcmVjdG9yeSwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpLmdldExhdGVzdFZlcnNpb24oKSk7CiAgICAgfQogCi0gICAgcHVibGljIERlc2NyaXB0b3IgbmV3U1NUYWJsZURlc2NyaXB0b3IoRmlsZSBkaXJlY3RvcnksIFNTVGFibGVGb3JtYXQuVHlwZSBmb3JtYXQpCisgICAgcHVibGljIERlc2NyaXB0b3IgbmV3U1NUYWJsZURlc2NyaXB0b3IoRmlsZSBkaXJlY3RvcnksIFNTVGFibGVGb3JtYXQ8PywgPz4gZm9ybWF0KQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ld1NTVGFibGVEZXNjcmlwdG9yKGRpcmVjdG9yeSwgZm9ybWF0LmluZm8uZ2V0TGF0ZXN0VmVyc2lvbigpLCBmb3JtYXQpOworICAgICAgICByZXR1cm4gbmV3U1NUYWJsZURlc2NyaXB0b3IoZGlyZWN0b3J5LCBmb3JtYXQuZ2V0TGF0ZXN0VmVyc2lvbigpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgRGVzY3JpcHRvciBuZXdTU1RhYmxlRGVzY3JpcHRvcihGaWxlIGRpcmVjdG9yeSwgVmVyc2lvbiB2ZXJzaW9uLCBTU1RhYmxlRm9ybWF0LlR5cGUgZm9ybWF0KQorICAgIHB1YmxpYyBEZXNjcmlwdG9yIG5ld1NTVGFibGVEZXNjcmlwdG9yKEZpbGUgZGlyZWN0b3J5LCBWZXJzaW9uIHZlcnNpb24pCiAgICAgewogICAgICAgICBEZXNjcmlwdG9yIG5ld0Rlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvcih2ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXNwYWNlLmdldE5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZUlkR2VuZXJhdG9yLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQpOwotICAgICAgICBhc3NlcnQgIW5ld0Rlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnQuREFUQSkuZXhpc3RzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGVJZEdlbmVyYXRvci5nZXQoKSk7CisgICAgICAgIGFzc2VydCAhbmV3RGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuREFUQSkuZXhpc3RzKCk7CiAgICAgICAgIHJldHVybiBuZXdEZXNjcmlwdG9yOwogICAgIH0KIApAQCAtMTExMiw3ICsxMTA2LDEwIEBACiAgICAgICAgICAgICBtZXRyaWMucGVuZGluZ0ZsdXNoZXMuZGVjKCk7CiAKICAgICAgICAgICAgIGlmIChmbHVzaEZhaWx1cmUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBwcm9wYWdhdGUoZmx1c2hGYWlsdXJlKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUaHJvd2FibGVzLnRocm93SWZVbmNoZWNrZWQoZmx1c2hGYWlsdXJlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihmbHVzaEZhaWx1cmUpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gY29tbWl0TG9nVXBwZXJCb3VuZDsKICAgICAgICAgfQpAQCAtMTI3Myw3ICsxMjcwLDggQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHQgPSBGbHVzaGluZy5hYm9ydFJ1bm5hYmxlcyhmbHVzaFJ1bm5hYmxlcywgdCk7CiAgICAgICAgICAgICAgICAgICAgIHQgPSB0eG4uYWJvcnQodCk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKHQpOworICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGVzLnRocm93SWZVbmNoZWNrZWQodCk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHQpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIHRyeQpAQCAtMTI5OSw3ICsxMjk3LDggQEAKICAgICAgICAgICAgICAgICAgICAgZm9yIChTU1RhYmxlTXVsdGlXcml0ZXIgd3JpdGVyIDogZmx1c2hSZXN1bHRzKQogICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHdyaXRlci5hYm9ydCh0KTsKICAgICAgICAgICAgICAgICAgICAgdCA9IHR4bi5hYm9ydCh0KTsKLSAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlcy5wcm9wYWdhdGUodCk7CisgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZXMudGhyb3dJZlVuY2hlY2tlZCh0KTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgdHhuLnByZXBhcmVUb0NvbW1pdCgpOwpAQCAtMTQ0OCw0MSArMTQ0Nyw2MyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTaGFyZEJvdW5kYXJpZXMgbG9jYWxSYW5nZVNwbGl0cyhpbnQgc2hhcmRDb3VudCkKICAgICB7Ci0gICAgICAgIGlmIChzaGFyZENvdW50ID09IDEgfHwgIWdldFBhcnRpdGlvbmVyKCkuc3BsaXR0ZXIoKS5pc1ByZXNlbnQoKSB8fCBTY2hlbWFDb25zdGFudHMuaXNMb2NhbFN5c3RlbUtleXNwYWNlKGtleXNwYWNlLmdldE5hbWUoKSkpCisgICAgICAgIGlmIChzaGFyZENvdW50ID09IDEgfHwgIWdldFBhcnRpdGlvbmVyKCkuc3BsaXR0ZXIoKS5pc1ByZXNlbnQoKSkKICAgICAgICAgICAgIHJldHVybiBTaGFyZEJvdW5kYXJpZXMuTk9ORTsKIAogICAgICAgICBTaGFyZEJvdW5kYXJpZXMgc2hhcmRCb3VuZGFyaWVzID0gY2FjaGVkU2hhcmRCb3VuZGFyaWVzOworCiAgICAgICAgIGlmIChzaGFyZEJvdW5kYXJpZXMgPT0gbnVsbCB8fAogICAgICAgICAgICAgc2hhcmRCb3VuZGFyaWVzLnNoYXJkQ291bnQoKSAhPSBzaGFyZENvdW50IHx8Ci0gICAgICAgICAgICBzaGFyZEJvdW5kYXJpZXMucmluZ1ZlcnNpb24gIT0gU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuZ2V0VG9rZW5NZXRhZGF0YSgpLmdldFJpbmdWZXJzaW9uKCkpCisgICAgICAgICAgICBzaGFyZEJvdW5kYXJpZXMucmluZ1ZlcnNpb24gIT0gLTEgJiYgc2hhcmRCb3VuZGFyaWVzLnJpbmdWZXJzaW9uICE9IFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmdldFRva2VuTWV0YWRhdGEoKS5nZXRSaW5nVmVyc2lvbigpKQogICAgICAgICB7Ci0gICAgICAgICAgICBEaXNrQm91bmRhcnlNYW5hZ2VyLlZlcnNpb25lZFJhbmdlc0F0RW5kcG9pbnQgdmVyc2lvbmVkTG9jYWxSYW5nZXMgPSBEaXNrQm91bmRhcnlNYW5hZ2VyLmdldFZlcnNpb25lZExvY2FsUmFuZ2VzKHRoaXMpOwotICAgICAgICAgICAgU2V0PFJhbmdlPFRva2VuPj4gbG9jYWxSYW5nZXMgPSB2ZXJzaW9uZWRMb2NhbFJhbmdlcy5yYW5nZXNBdEVuZHBvaW50LnJhbmdlcygpOwogICAgICAgICAgICAgTGlzdDxTcGxpdHRlci5XZWlnaHRlZFJhbmdlPiB3ZWlnaHRlZFJhbmdlczsKLSAgICAgICAgICAgIGlmIChsb2NhbFJhbmdlcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgd2VpZ2h0ZWRSYW5nZXMgPSBJbW11dGFibGVMaXN0Lm9mKG5ldyBTcGxpdHRlci5XZWlnaHRlZFJhbmdlKDEuMCwgbmV3IFJhbmdlPD4oZ2V0UGFydGl0aW9uZXIoKS5nZXRNaW5pbXVtVG9rZW4oKSwgZ2V0UGFydGl0aW9uZXIoKS5nZXRNYXhpbXVtVG9rZW4oKSkpKTsKKyAgICAgICAgICAgIGxvbmcgcmluZ1ZlcnNpb247CisgICAgICAgICAgICBpZiAoIVNjaGVtYUNvbnN0YW50cy5pc0xvY2FsU3lzdGVtS2V5c3BhY2Uoa2V5c3BhY2UuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgICYmIGdldFBhcnRpdGlvbmVyKCkgPT0gU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuZ2V0VG9rZW5NZXRhZGF0YSgpLnBhcnRpdGlvbmVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERpc2tCb3VuZGFyeU1hbmFnZXIuVmVyc2lvbmVkUmFuZ2VzQXRFbmRwb2ludCB2ZXJzaW9uZWRMb2NhbFJhbmdlcyA9IERpc2tCb3VuZGFyeU1hbmFnZXIuZ2V0VmVyc2lvbmVkTG9jYWxSYW5nZXModGhpcyk7CisgICAgICAgICAgICAgICAgU2V0PFJhbmdlPFRva2VuPj4gbG9jYWxSYW5nZXMgPSB2ZXJzaW9uZWRMb2NhbFJhbmdlcy5yYW5nZXNBdEVuZHBvaW50LnJhbmdlcygpOworICAgICAgICAgICAgICAgIHJpbmdWZXJzaW9uID0gdmVyc2lvbmVkTG9jYWxSYW5nZXMucmluZ1ZlcnNpb247CisKKyAgICAgICAgICAgICAgICBpZiAoIWxvY2FsUmFuZ2VzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdlaWdodGVkUmFuZ2VzID0gbmV3IEFycmF5TGlzdDw+KGxvY2FsUmFuZ2VzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoUmFuZ2U8VG9rZW4+IHIgOiBsb2NhbFJhbmdlcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2VpZ2h0ZWRSYW5nZSBzdXBwb3J0cyBvbmx5IHVud3JhcHBlZCByYW5nZXMgYXMgaXQgcmVsaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiByaWdodCAtIGxlZnQgPT0gbnVtIHRva2VucyBlcXVhbGl0eQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChSYW5nZTxUb2tlbj4gdTogci51bndyYXAoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRlZFJhbmdlcy5hZGQobmV3IFNwbGl0dGVyLldlaWdodGVkUmFuZ2UoMS4wLCB1KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2VpZ2h0ZWRSYW5nZXMuc29ydChDb21wYXJhdG9yLmNvbXBhcmluZyhTcGxpdHRlci5XZWlnaHRlZFJhbmdlOjpsZWZ0KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdlaWdodGVkUmFuZ2VzID0gZnVsbFdlaWdodGVkUmFuZ2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2VpZ2h0ZWRSYW5nZXMgPSBuZXcgQXJyYXlMaXN0PD4obG9jYWxSYW5nZXMuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBmb3IgKFJhbmdlPFRva2VuPiByIDogbG9jYWxSYW5nZXMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBXZWlnaHRlZFJhbmdlIHN1cHBvcnRzIG9ubHkgdW53cmFwcGVkIHJhbmdlcyBhcyBpdCByZWxpZXMKLSAgICAgICAgICAgICAgICAgICAgLy8gb24gcmlnaHQgLSBsZWZ0ID09IG51bSB0b2tlbnMgZXF1YWxpdHkKLSAgICAgICAgICAgICAgICAgICAgZm9yIChSYW5nZTxUb2tlbj4gdTogci51bndyYXAoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodGVkUmFuZ2VzLmFkZChuZXcgU3BsaXR0ZXIuV2VpZ2h0ZWRSYW5nZSgxLjAsIHUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2VpZ2h0ZWRSYW5nZXMuc29ydChDb21wYXJhdG9yLmNvbXBhcmluZyhTcGxpdHRlci5XZWlnaHRlZFJhbmdlOjpsZWZ0KSk7CisgICAgICAgICAgICAgICAgLy8gTG9jYWwgdGFibGVzIG5lZWQgdG8gY292ZXIgdGhlIGZ1bGwgdG9rZW4gcmFuZ2UgYW5kIGRvbid0IGNhcmUgYWJvdXQgcmluZyBjaGFuZ2VzLgorICAgICAgICAgICAgICAgIC8vIFdlIGFsc28gZW5kIHVwIGhlcmUgaWYgdGhlIHRhYmxlJ3MgcGFydGl0aW9uZXIgaXMgbm90IHRoZSBkYXRhYmFzZSdzLCB3aGljaCBjYW4gaGFwcGVuIGluIHRlc3RzLgorICAgICAgICAgICAgICAgIHdlaWdodGVkUmFuZ2VzID0gZnVsbFdlaWdodGVkUmFuZ2UoKTsKKyAgICAgICAgICAgICAgICByaW5nVmVyc2lvbiA9IC0xOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBMaXN0PFRva2VuPiBib3VuZGFyaWVzID0gZ2V0UGFydGl0aW9uZXIoKS5zcGxpdHRlcigpLmdldCgpLnNwbGl0T3duZWRSYW5nZXMoc2hhcmRDb3VudCwgd2VpZ2h0ZWRSYW5nZXMsIGZhbHNlKTsKICAgICAgICAgICAgIHNoYXJkQm91bmRhcmllcyA9IG5ldyBTaGFyZEJvdW5kYXJpZXMoYm91bmRhcmllcy5zdWJMaXN0KDAsIGJvdW5kYXJpZXMuc2l6ZSgpIC0gMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25lZExvY2FsUmFuZ2VzLnJpbmdWZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmluZ1ZlcnNpb24pOwogICAgICAgICAgICAgY2FjaGVkU2hhcmRCb3VuZGFyaWVzID0gc2hhcmRCb3VuZGFyaWVzOwogICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJNZW10YWJsZSBzaGFyZCBib3VuZGFyaWVzIGZvciB7fS57fToge30iLCBrZXlzcGFjZS5nZXROYW1lKCksIGdldFRhYmxlTmFtZSgpLCBib3VuZGFyaWVzKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc2hhcmRCb3VuZGFyaWVzOwogICAgIH0KIAorICAgIHByaXZhdGUgSW1tdXRhYmxlTGlzdDxTcGxpdHRlci5XZWlnaHRlZFJhbmdlPiBmdWxsV2VpZ2h0ZWRSYW5nZSgpCisgICAgeworICAgICAgICByZXR1cm4gSW1tdXRhYmxlTGlzdC5vZihuZXcgU3BsaXR0ZXIuV2VpZ2h0ZWRSYW5nZSgxLjAsIG5ldyBSYW5nZTw+KGdldFBhcnRpdGlvbmVyKCkuZ2V0TWluaW11bVRva2VuKCksIGdldFBhcnRpdGlvbmVyKCkuZ2V0TWF4aW11bVRva2VuKCkpKSk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQHBhcmFtIHNzdGFibGVzCiAgICAgICogQHJldHVybiBzc3RhYmxlcyB3aG9zZSBrZXkgcmFuZ2Ugb3ZlcmxhcHMgd2l0aCB0aGF0IG9mIHRoZSBnaXZlbiBzc3RhYmxlcywgbm90IGluY2x1ZGluZyBpdHNlbGYuCkBAIC0xNTAwLDcgKzE1MjEsNyBAQAogICAgICAgICBWaWV3IHZpZXcgPSBkYXRhLmdldFZpZXcoKTsKIAogICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IHNvcnRlZEJ5Rmlyc3QgPSBMaXN0cy5uZXdBcnJheUxpc3Qoc3N0YWJsZXMpOwotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZEJ5Rmlyc3QsIChvMSwgbzIpIC0+IG8xLmZpcnN0LmNvbXBhcmVUbyhvMi5maXJzdCkpOworICAgICAgICBzb3J0ZWRCeUZpcnN0LnNvcnQoU1NUYWJsZVJlYWRlci5zc3RhYmxlQ29tcGFyYXRvcik7CiAKICAgICAgICAgTGlzdDxBYnN0cmFjdEJvdW5kczxQYXJ0aXRpb25Qb3NpdGlvbj4+IGJvdW5kcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBEZWNvcmF0ZWRLZXkgZmlyc3QgPSBudWxsLCBsYXN0ID0gbnVsbDsKQEAgLTE1MTcsMjEgKzE1MzgsMjEgQEAKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGZpcnN0ID09IG51bGwpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSBzc3RhYmxlLmZpcnN0OwotICAgICAgICAgICAgICAgIGxhc3QgPSBzc3RhYmxlLmxhc3Q7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBzc3RhYmxlLmdldEZpcnN0KCk7CisgICAgICAgICAgICAgICAgbGFzdCA9IHNzdGFibGUuZ2V0TGFzdCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzc3RhYmxlLmZpcnN0LmNvbXBhcmVUbyhsYXN0KSA8PSAwKSAvLyB3ZSBkbyBvdmVybGFwCisgICAgICAgICAgICAgICAgaWYgKHNzdGFibGUuZ2V0Rmlyc3QoKS5jb21wYXJlVG8obGFzdCkgPD0gMCkgLy8gd2UgZG8gb3ZlcmxhcAogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNzdGFibGUubGFzdC5jb21wYXJlVG8obGFzdCkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IHNzdGFibGUubGFzdDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNzdGFibGUuZ2V0TGFzdCgpLmNvbXBhcmVUbyhsYXN0KSA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gc3N0YWJsZS5nZXRMYXN0KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5hZGQoQWJzdHJhY3RCb3VuZHMuYm91bmRzKGZpcnN0LCB0cnVlLCBsYXN0LCB0cnVlKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gc3N0YWJsZS5maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgbGFzdCA9IHNzdGFibGUubGFzdDsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBzc3RhYmxlLmdldEZpcnN0KCk7CisgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBzc3RhYmxlLmdldExhc3QoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE2MzksMTMgKzE2NjAsMTMgQEAKICAgICAgICAgcmV0dXJuIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLnBlcmZvcm1DbGVhbnVwKENvbHVtbkZhbWlseVN0b3JlLnRoaXMsIGpvYnMpOwogICAgIH0KIAotICAgIHB1YmxpYyBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMgc2NydWIoYm9vbGVhbiBkaXNhYmxlU25hcHNob3QsIGJvb2xlYW4gc2tpcENvcnJ1cHRlZCwgYm9vbGVhbiBjaGVja0RhdGEsIGJvb2xlYW4gcmVpbnNlcnRPdmVyZmxvd2VkVFRMLCBpbnQgam9icykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICBwdWJsaWMgQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzIHNjcnViKGJvb2xlYW4gZGlzYWJsZVNuYXBzaG90LCBJU2NydWJiZXIuT3B0aW9ucyBvcHRpb25zLCBpbnQgam9icykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIHJldHVybiBzY3J1YihkaXNhYmxlU25hcHNob3QsIHNraXBDb3JydXB0ZWQsIHJlaW5zZXJ0T3ZlcmZsb3dlZFRUTCwgZmFsc2UsIGNoZWNrRGF0YSwgam9icyk7CisgICAgICAgIHJldHVybiBzY3J1YihkaXNhYmxlU25hcHNob3QsIGZhbHNlLCBvcHRpb25zLCBqb2JzKTsKICAgICB9CiAKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBwdWJsaWMgQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzIHNjcnViKGJvb2xlYW4gZGlzYWJsZVNuYXBzaG90LCBib29sZWFuIHNraXBDb3JydXB0ZWQsIGJvb2xlYW4gcmVpbnNlcnRPdmVyZmxvd2VkVFRMLCBib29sZWFuIGFsd2F5c0ZhaWwsIGJvb2xlYW4gY2hlY2tEYXRhLCBpbnQgam9icykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICBwdWJsaWMgQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzIHNjcnViKGJvb2xlYW4gZGlzYWJsZVNuYXBzaG90LCBib29sZWFuIGFsd2F5c0ZhaWwsIElTY3J1YmJlci5PcHRpb25zIG9wdGlvbnMsIGludCBqb2JzKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgLy8gc2tpcCBzbmFwc2hvdCBjcmVhdGlvbiBkdXJpbmcgc2NydWIsIFNFRSBKSVJBIDU4OTEKICAgICAgICAgaWYoIWRpc2FibGVTbmFwc2hvdCkKQEAgLTE2NTcsNyArMTY3OCw3IEBACiAKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5wZXJmb3JtU2NydWIoQ29sdW1uRmFtaWx5U3RvcmUudGhpcywgc2tpcENvcnJ1cHRlZCwgY2hlY2tEYXRhLCByZWluc2VydE92ZXJmbG93ZWRUVEwsIGpvYnMpOworICAgICAgICAgICAgcmV0dXJuIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLnBlcmZvcm1TY3J1YihDb2x1bW5GYW1pbHlTdG9yZS50aGlzLCBvcHRpb25zLCBqb2JzKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaChUaHJvd2FibGUgdCkKICAgICAgICAgewpAQCAtMTY5Miw3ICsxNzEzLDcgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcHVibGljIENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cyB2ZXJpZnkoVmVyaWZpZXIuT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHB1YmxpYyBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMgdmVyaWZ5KElWZXJpZmllci5PcHRpb25zIG9wdGlvbnMpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCiAgICAgewogICAgICAgICByZXR1cm4gQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UucGVyZm9ybVZlcmlmeShDb2x1bW5GYW1pbHlTdG9yZS50aGlzLCBvcHRpb25zKTsKICAgICB9CkBAIC0xNzAwLDkgKzE3MjEsOSBAQAogICAgIC8qKgogICAgICAqIFJld3JpdGVzIGFsbCBTU1RhYmxlcyBhY2NvcmRpbmcgdG8gc3BlY2lmaWVkIHBhcmFtZXRlcnMKICAgICAgKgotICAgICAqIEBwYXJhbSBza2lwSWZDdXJyZW50VmVyc2lvbiAtIGlmIHtAbGluayB0cnVlfSwgd2lsbCByZXdyaXRlIG9ubHkgU1NUYWJsZXMgdGhhdCBoYXZlIHZlcnNpb24gb2xkZXIgdGhhbiB0aGUgY3VycmVudCBvbmUgKHtAbGluayBCaWdGb3JtYXQjbGF0ZXN0VmVyc2lvbn0pCisgICAgICogQHBhcmFtIHNraXBJZkN1cnJlbnRWZXJzaW9uIC0gaWYge0BsaW5rIHRydWV9LCB3aWxsIHJld3JpdGUgb25seSBTU1RhYmxlcyB0aGF0IGhhdmUgdmVyc2lvbiBvbGRlciB0aGFuIHRoZSBjdXJyZW50IG9uZSAoe0BsaW5rIFNTVGFibGVGb3JtYXQjZ2V0TGF0ZXN0VmVyc2lvbigpfSkKICAgICAgKiBAcGFyYW0gc2tpcElmTmV3ZXJUaGFuVGltZXN0YW1wIC0gbWF4IHRpbWVzdGFtcCAobG9jYWwgY3JlYXRpb24gdGltZSkgZm9yIFNTVGFibGU7IFNTVGFibGVzIGNyZWF0ZWQgX2FmdGVyXyB0aGlzIHRpbWVzdGFtcCB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20gY29tcGFjdGlvbgotICAgICAqIEBwYXJhbSBza2lwSWZDb21wcmVzc2lvbk1hdGNoZXMgLSBpZiB7QGxpbmsgdHJ1ZX0sIHdpbGwgcmV3cml0ZSBvbmx5IFNTVGFibGVzIHdob3NlIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYXJlIGRpZmZlcmVudCBmcm9tIHtAbGluayBDRk1ldGFEYXRhI2NvbXByZXNzaW9uUGFyYW1zKCl9CisgICAgICogQHBhcmFtIHNraXBJZkNvbXByZXNzaW9uTWF0Y2hlcyAtIGlmIHtAbGluayB0cnVlfSwgd2lsbCByZXdyaXRlIG9ubHkgU1NUYWJsZXMgd2hvc2UgY29tcHJlc3Npb24gcGFyYW1ldGVycyBhcmUgZGlmZmVyZW50IGZyb20ge0BsaW5rIFRhYmxlTWV0YWRhdGEjcGFyYW1zI2dldENvbXByZXNzaW9uUGFyYW1ldGVycygpfSAoKX0KICAgICAgKiBAcGFyYW0gam9icyBudW1iZXIgb2Ygam9icyBmb3IgcGFyYWxsZWwgZXhlY3V0aW9uCiAgICAgICovCiAgICAgcHVibGljIENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cyBzc3RhYmxlc1Jld3JpdGUoZmluYWwgYm9vbGVhbiBza2lwSWZDdXJyZW50VmVyc2lvbiwKQEAgLTE4MDIsNyArMTgyMyw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHNlc3Npb24gIT0gbnVsbCAmJiBzZXNzaW9ucy5jb250YWlucyhzZXNzaW9uKTsKICAgICAgICAgICAgIH07CiAgICAgICAgICAgICByZXR1cm4gcnVuV2l0aENvbXBhY3Rpb25zRGlzYWJsZWQoKCkgLT4gY29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlci5yZWxlYXNlUmVwYWlyRGF0YShzZXNzaW9ucyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljYXRlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljYXRlLCBPcGVyYXRpb25UeXBlLlNUUkVBTSwgZmFsc2UsIHRydWUsIHRydWUpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewpAQCAtMTkxMSwyNyArMTkzMiw1MyBAQAogCiAgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRTU1RhYmxlc0ZvcktleShTdHJpbmcga2V5LCBib29sZWFuIGhleEZvcm1hdCkKICAgICB7CisgICAgICAgIHJldHVybiB3aXRoU1NUYWJsZXNGb3JLZXkoa2V5LCBoZXhGb3JtYXQsIFNTVGFibGVSZWFkZXI6OmdldEZpbGVuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFwPEludGVnZXIsIFNldDxTdHJpbmc+PiBnZXRTU1RhYmxlc0ZvcktleVdpdGhMZXZlbChTdHJpbmcga2V5LCBib29sZWFuIGhleEZvcm1hdCkKKyAgICB7CisgICAgICAgIExpc3Q8UGFpcjxJbnRlZ2VyLCBTdHJpbmc+PiBzc3RzID0gd2l0aFNTVGFibGVzRm9yS2V5KGtleSwgaGV4Rm9ybWF0LCBzc3RyIC0+IFBhaXIuY3JlYXRlKHNzdHIuZ2V0U1NUYWJsZUxldmVsKCksIHNzdHIuZ2V0RmlsZW5hbWUoKSkpOworICAgICAgICBIYXNoTWFwPEludGVnZXIsIFNldDxTdHJpbmc+PiByZXN1bHQgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGZvciAoUGFpcjxJbnRlZ2VyLCBTdHJpbmc+IHNzdCA6IHNzdHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldDxTdHJpbmc+IHBlckxldmVsID0gcmVzdWx0LmdldChzc3QubGVmdCk7CisgICAgICAgICAgICBpZiAocGVyTGV2ZWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwZXJMZXZlbCA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgICAgICAgICByZXN1bHQucHV0KHNzdC5sZWZ0LCBwZXJMZXZlbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBlckxldmVsLmFkZChzc3QucmlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQ+IExpc3Q8VD4gd2l0aFNTVGFibGVzRm9yS2V5KFN0cmluZyBrZXksIGJvb2xlYW4gaGV4Rm9ybWF0LCBGdW5jdGlvbjxTU1RhYmxlUmVhZGVyLCBUPiBtYXBwZXIpCisgICAgewogICAgICAgICBCeXRlQnVmZmVyIGtleUJ1ZmZlciA9IGhleEZvcm1hdCA/IEJ5dGVCdWZmZXJVdGlsLmhleFRvQnl0ZXMoa2V5KSA6IG1ldGFkYXRhKCkucGFydGl0aW9uS2V5VHlwZS5mcm9tU3RyaW5nKGtleSk7CiAgICAgICAgIERlY29yYXRlZEtleSBkayA9IGRlY29yYXRlS2V5KGtleUJ1ZmZlcik7CiAgICAgICAgIHRyeSAoT3BPcmRlci5Hcm91cCBvcCA9IHJlYWRPcmRlcmluZy5zdGFydCgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gZmlsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgIExpc3Q8VD4gbWFwcGVkID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0ciA6IHNlbGVjdChWaWV3LnNlbGVjdChTU1RhYmxlU2V0LkxJVkUsIGRrKSkuc3N0YWJsZXMpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGtleSBhY3R1YWxseSBleGlzdHMgaW4gdGhpcyBzc3RhYmxlLCB3aXRob3V0IHVwZGF0aW5nIGNhY2hlIGFuZCBzdGF0cwotICAgICAgICAgICAgICAgIGlmIChzc3RyLmdldFBvc2l0aW9uKGRrLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRLCBmYWxzZSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZmlsZXMuYWRkKHNzdHIuZ2V0RmlsZW5hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKHNzdHIuZ2V0UG9zaXRpb24oZGssIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEsIGZhbHNlKSA+PSAwKQorICAgICAgICAgICAgICAgICAgICBtYXBwZWQuYWRkKG1hcHBlci5hcHBseShzc3RyKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmlsZXM7CisgICAgICAgICAgICByZXR1cm4gbWFwcGVkOwogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYmVnaW5Mb2NhbFNhbXBsaW5nKFN0cmluZyBzYW1wbGVyLCBpbnQgY2FwYWNpdHksIGludCBkdXJhdGlvbk1pbGxpcykKICAgICB7CiAgICAgICAgIG1ldHJpYy5zYW1wbGVycy5nZXQoU2FtcGxlclR5cGUudmFsdWVPZihzYW1wbGVyKSkuYmVnaW5TYW1wbGluZyhjYXBhY2l0eSwgZHVyYXRpb25NaWxsaXMpOwogICAgIH0KIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTGlzdDxDb21wb3NpdGVEYXRhPiBmaW5pc2hMb2NhbFNhbXBsaW5nKFN0cmluZyBzYW1wbGVyLCBpbnQgY291bnQpIHRocm93cyBPcGVuRGF0YUV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgU2FtcGxlciBzYW1wbGVySW1wbCA9IG1ldHJpYy5zYW1wbGVycy5nZXQoU2FtcGxlclR5cGUudmFsdWVPZihzYW1wbGVyKSk7CkBAIC0xOTUwLDExICsxOTk3LDEzIEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNDb21wYWN0aW9uRGlza1NwYWNlQ2hlY2tFbmFibGVkKCkKICAgICB7CiAgICAgICAgIHJldHVybiBjb21wYWN0aW9uU3BhY2VDaGVjazsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjb21wYWN0aW9uRGlza1NwYWNlQ2hlY2soYm9vbGVhbiBlbmFibGUpCiAgICAgewogICAgICAgICBjb21wYWN0aW9uU3BhY2VDaGVjayA9IGVuYWJsZTsKQEAgLTIwMjMsNyArMjA3Miw2IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBGaWxlIHNuYXBzaG90RGlyZWN0b3J5ID0gRGlyZWN0b3JpZXMuZ2V0U25hcHNob3REaXJlY3Rvcnkoc3NUYWJsZS5kZXNjcmlwdG9yLCBzbmFwc2hvdE5hbWUpOwogICAgICAgICAgICAgICAgICAgICBzc1RhYmxlLmNyZWF0ZUxpbmtzKHNuYXBzaG90RGlyZWN0b3J5LnBhdGgoKSwgcmF0ZUxpbWl0ZXIpOyAvLyBoYXJkIGxpbmtzCi0KICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJTbmFwc2hvdCBmb3Ige30ga2V5c3BhY2UgZGF0YSBmaWxlIHt9IGNyZWF0ZWQgaW4ge30iLCBrZXlzcGFjZSwgc3NUYWJsZS5nZXRGaWxlbmFtZSgpLCBzbmFwc2hvdERpcmVjdG9yeSk7CiAgICAgICAgICAgICAgICAgICAgIHNuYXBzaG90dGVkU1NUYWJsZXMuYWRkKHNzVGFibGUpOwpAQCAtMjA0MSw3ICsyMDg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oSGFzaFNldDo6bmV3KSk7CiAKICAgICAgICAgLy8gQ3JlYXRlIGFuZCB3cml0ZSBzbmFwc2hvdCBtYW5pZmVzdAotICAgICAgICBTbmFwc2hvdE1hbmlmZXN0IG1hbmlmZXN0ID0gbmV3IFNuYXBzaG90TWFuaWZlc3QobWFwVG9EYXRhRmlsZW5hbWVzKHNzdGFibGVzKSwgdHRsLCBjcmVhdGlvblRpbWUpOworICAgICAgICBTbmFwc2hvdE1hbmlmZXN0IG1hbmlmZXN0ID0gbmV3IFNuYXBzaG90TWFuaWZlc3QobWFwVG9EYXRhRmlsZW5hbWVzKHNzdGFibGVzKSwgdHRsLCBjcmVhdGlvblRpbWUsIGVwaGVtZXJhbCk7CiAgICAgICAgIEZpbGUgbWFuaWZlc3RGaWxlID0gZ2V0RGlyZWN0b3JpZXMoKS5nZXRTbmFwc2hvdE1hbmlmZXN0RmlsZSh0YWcpOwogICAgICAgICB3cml0ZVNuYXBzaG90TWFuaWZlc3QobWFuaWZlc3QsIG1hbmlmZXN0RmlsZSk7CiAgICAgICAgIHNuYXBzaG90RGlycy5hZGQobWFuaWZlc3RGaWxlLnBhcmVudCgpLnRvQWJzb2x1dGUoKSk7IC8vIG1hbmlmZXN0IG1heSBjcmVhdGUgZW1wdHkgc25hcHNob3QgZGlyCkBAIC0yMDU0LDE2ICsyMTAyLDkgQEAKICAgICAgICAgICAgIHNuYXBzaG90RGlycy5hZGQoc2NoZW1hRmlsZS5wYXJlbnQoKS50b0Fic29sdXRlKCkpOyAvLyBzY2hlbWEgbWF5IGNyZWF0ZSBlbXB0eSBzbmFwc2hvdCBkaXIKICAgICAgICAgfQogCi0gICAgICAgIC8vIE1heWJlIGNyZWF0ZSBlcGhlbWVyYWwgbWFya2VyCi0gICAgICAgIGlmIChlcGhlbWVyYWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGUgZXBoZW1lcmFsU25hcHNob3RNYXJrZXIgPSBnZXREaXJlY3RvcmllcygpLmdldE5ld0VwaGVtZXJhbFNuYXBzaG90TWFya2VyRmlsZSh0YWcpOwotICAgICAgICAgICAgY3JlYXRlRXBoZW1lcmFsU25hcHNob3RNYXJrZXJGaWxlKHRhZywgZXBoZW1lcmFsU25hcHNob3RNYXJrZXIpOwotICAgICAgICAgICAgc25hcHNob3REaXJzLmFkZChlcGhlbWVyYWxTbmFwc2hvdE1hcmtlci5wYXJlbnQoKS50b0Fic29sdXRlKCkpOyAvLyBtYXJrZXIgbWF5IGNyZWF0ZSBlbXB0eSBzbmFwc2hvdCBkaXIKLSAgICAgICAgfQotCi0gICAgICAgIFRhYmxlU25hcHNob3Qgc25hcHNob3QgPSBuZXcgVGFibGVTbmFwc2hvdChtZXRhZGF0YS5rZXlzcGFjZSwgbWV0YWRhdGEubmFtZSwgbWV0YWRhdGEuaWQuYXNVVUlEKCksIHRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0LmNyZWF0ZWRBdCwgbWFuaWZlc3QuZXhwaXJlc0F0LCBzbmFwc2hvdERpcnMpOworICAgICAgICBUYWJsZVNuYXBzaG90IHNuYXBzaG90ID0gbmV3IFRhYmxlU25hcHNob3QobWV0YWRhdGEua2V5c3BhY2UsIG1ldGFkYXRhLm5hbWUsIG1ldGFkYXRhLmlkLmFzVVVJRCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLCBtYW5pZmVzdC5jcmVhdGVkQXQsIG1hbmlmZXN0LmV4cGlyZXNBdCwgc25hcHNob3REaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3QuZXBoZW1lcmFsKTsKIAogICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5hZGRTbmFwc2hvdChzbmFwc2hvdCk7CiAgICAgICAgIHJldHVybiBzbmFwc2hvdDsKQEAgLTIwODUsNyArMjEyNiw3IEBACiAKICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtYXBUb0RhdGFGaWxlbmFtZXMoQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcykKICAgICB7Ci0gICAgICAgIHJldHVybiBzc3RhYmxlcy5zdHJlYW0oKS5tYXAocyAtPiBzLmRlc2NyaXB0b3IucmVsYXRpdmVGaWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIHJldHVybiBzc3RhYmxlcy5zdHJlYW0oKS5tYXAocyAtPiBzLmRlc2NyaXB0b3IucmVsYXRpdmVGaWxlbmFtZUZvcihDb21wb25lbnRzLkRBVEEpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCB3cml0ZVNuYXBzaG90U2NoZW1hKEZpbGUgc2NoZW1hRmlsZSkKQEAgLTIxMDgsMzQgKzIxNDksMTkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVFcGhlbWVyYWxTbmFwc2hvdE1hcmtlckZpbGUoZmluYWwgU3RyaW5nIHNuYXBzaG90LCBGaWxlIGVwaGVtZXJhbFNuYXBzaG90TWFya2VyKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghZXBoZW1lcmFsU25hcHNob3RNYXJrZXIucGFyZW50KCkuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgZXBoZW1lcmFsU25hcHNob3RNYXJrZXIucGFyZW50KCkudHJ5Q3JlYXRlRGlyZWN0b3JpZXMoKTsKLQotICAgICAgICAgICAgRmlsZXMuY3JlYXRlRmlsZShlcGhlbWVyYWxTbmFwc2hvdE1hcmtlci50b1BhdGgoKSk7Ci0gICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJDcmVhdGVkIGVwaGVtZXJhbCBzbmFwc2hvdCBtYXJrZXIgZmlsZSBvbiB7fS4iLCBlcGhlbWVyYWxTbmFwc2hvdE1hcmtlci5hYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci53YXJuKFN0cmluZy5mb3JtYXQoIkNvdWxkIG5vdCBjcmVhdGUgbWFya2VyIGZpbGUgJXMgZm9yIGVwaGVtZXJhbCBzbmFwc2hvdCAlcy4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbiBjYXNlIHRoZXJlIGlzIGEgZmFpbHVyZSBpbiB0aGUgb3BlcmF0aW9uIHRoYXQgY3JlYXRlZCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgc25hcHNob3QsIHlvdSBtYXkgbmVlZCB0byBjbGVhbiBpdCBtYW51YWxseSBhZnRlcndhcmRzLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwaGVtZXJhbFNuYXBzaG90TWFya2VyLmFic29sdXRlUGF0aCgpLCBzbmFwc2hvdCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNsZWFyRXBoZW1lcmFsU25hcHNob3RzKERpcmVjdG9yaWVzIGRpcmVjdG9yaWVzKQogICAgIHsKICAgICAgICAgUmF0ZUxpbWl0ZXIgY2xlYXJTbmFwc2hvdFJhdGVMaW1pdGVyID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNuYXBzaG90UmF0ZUxpbWl0ZXIoKTsKIAotICAgICAgICBmb3IgKFN0cmluZyBlcGhlbWVyYWxTbmFwc2hvdCA6IGRpcmVjdG9yaWVzLmxpc3RFcGhlbWVyYWxTbmFwc2hvdHMoKSkKKyAgICAgICAgTGlzdDxUYWJsZVNuYXBzaG90PiBlcGhlbWVyYWxTbmFwc2hvdHMgPSBuZXcgU25hcHNob3RMb2FkZXIoZGlyZWN0b3JpZXMpLmxvYWRTbmFwc2hvdHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihUYWJsZVNuYXBzaG90Ojppc0VwaGVtZXJhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKyAgICAgICAgZm9yIChUYWJsZVNuYXBzaG90IGVwaGVtZXJhbFNuYXBzaG90IDogZXBoZW1lcmFsU25hcHNob3RzKQogICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoIkNsZWFyaW5nIGVwaGVtZXJhbCBzbmFwc2hvdCB7fSBsZWZ0b3ZlciBmcm9tIHByZXZpb3VzIHNlc3Npb24uIiwgZXBoZW1lcmFsU25hcHNob3QpOwotICAgICAgICAgICAgRGlyZWN0b3JpZXMuY2xlYXJTbmFwc2hvdChlcGhlbWVyYWxTbmFwc2hvdCwgZGlyZWN0b3JpZXMuZ2V0Q0ZEaXJlY3RvcmllcygpLCBjbGVhclNuYXBzaG90UmF0ZUxpbWl0ZXIpOworICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJDbGVhcmluZyBlcGhlbWVyYWwgc25hcHNob3Qge30gbGVmdG92ZXIgZnJvbSBwcmV2aW91cyBzZXNzaW9uLiIsIGVwaGVtZXJhbFNuYXBzaG90LmdldElkKCkpOworICAgICAgICAgICAgRGlyZWN0b3JpZXMuY2xlYXJTbmFwc2hvdChlcGhlbWVyYWxTbmFwc2hvdC5nZXRUYWcoKSwgZGlyZWN0b3JpZXMuZ2V0Q0ZEaXJlY3RvcmllcygpLCBjbGVhclNuYXBzaG90UmF0ZUxpbWl0ZXIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMTU4LDcgKzIxODQsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInVzaW5nIHNuYXBzaG90IHNzdGFibGUge30iLCBlbnRyaWVzLmdldEtleSgpKTsKICAgICAgICAgICAgICAgICAgICAgLy8gb3BlbiBvZmZsaW5lIHNvIHdlIGRvbid0IG1vZGlmeSBjb21wb25lbnRzIG9yIHRyYWNrIGhvdG5lc3MuCi0gICAgICAgICAgICAgICAgICAgIHNzdGFibGUgPSBTU1RhYmxlUmVhZGVyLm9wZW4oZW50cmllcy5nZXRLZXkoKSwgZW50cmllcy5nZXRWYWx1ZSgpLCBtZXRhZGF0YSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHNzdGFibGUgPSBTU1RhYmxlUmVhZGVyLm9wZW4odGhpcywgZW50cmllcy5nZXRLZXkoKSwgZW50cmllcy5nZXRWYWx1ZSgpLCBtZXRhZGF0YSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIHJlZnMudHJ5UmVmKHNzdGFibGUpOwogICAgICAgICAgICAgICAgICAgICAvLyByZWxlYXNlIHRoZSBzZWxmIHJlZiBhcyB3ZSBuZXZlciBhZGQgdGhlIHNuYXBzaG90IHNzdGFibGUgdG8gRGF0YVRyYWNrZXIgd2hlcmUgaXQgaXMgb3RoZXJ3aXNlIHJlbGVhc2VkCiAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuc2VsZlJlZigpLnJlbGVhc2UoKTsKQEAgLTI0MDksNiArMjQzNSwzMSBAQAogICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5mb3JjZUNvbXBhY3Rpb25Gb3JLZXkodGhpcywga2V5KTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBmb3JjZUNvbXBhY3Rpb25LZXlzSWdub3JpbmdHY0dyYWNlKFN0cmluZy4uLiBwYXJ0aXRpb25LZXlzSWdub3JlR2NHcmFjZSkKKyAgICB7CisgICAgICAgIExpc3Q8RGVjb3JhdGVkS2V5PiBkZWNvcmF0ZWRLZXlzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBwYXJ0aXRpb25LZXlTZXRJZ25vcmVHY0dyYWNlLmNsZWFyKCk7CisKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IHBhcnRpdGlvbktleXNJZ25vcmVHY0dyYWNlKSB7CisgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGRrID0gZGVjb3JhdGVLZXkobWV0YWRhdGEoKS5wYXJ0aXRpb25LZXlUeXBlLmZyb21TdHJpbmcoa2V5KSk7CisgICAgICAgICAgICAgICAgcGFydGl0aW9uS2V5U2V0SWdub3JlR2NHcmFjZS5hZGQoZGspOworICAgICAgICAgICAgICAgIGRlY29yYXRlZEtleXMuYWRkKGRrKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZm9yY2VDb21wYWN0aW9uRm9yS2V5cyh0aGlzLCBkZWNvcmF0ZWRLZXlzKTsKKyAgICAgICAgfSBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIHBhcnRpdGlvbktleVNldElnbm9yZUdjR3JhY2UuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHNob3VsZElnbm9yZUdjR3JhY2VGb3JLZXkoRGVjb3JhdGVkS2V5IGRrKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnRpdGlvbktleVNldElnbm9yZUdjR3JhY2UuY29udGFpbnMoZGspOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgSXRlcmFibGU8Q29sdW1uRmFtaWx5U3RvcmU+IGFsbCgpCiAgICAgewogICAgICAgICBMaXN0PEl0ZXJhYmxlPENvbHVtbkZhbWlseVN0b3JlPj4gc3RvcmVzID0gbmV3IEFycmF5TGlzdDw+KFNjaGVtYS5pbnN0YW5jZS5nZXRLZXlzcGFjZXMoKS5zaXplKCkpOwpAQCAtMjQ3NCw3ICsyNTI1LDggQEAKICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBtZW10YWJsZUNvbnRlbnQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBUaHJvd2FibGVzLnByb3BhZ2F0ZSh0KTsKKyAgICAgICAgICAgICAgICBUaHJvd2FibGVzLnRocm93SWZVbmNoZWNrZWQodCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yNTU5LDcgKzI2MTEsNyBAQAogICAgICAgICAgICAgY2ZzLnJ1bldpdGhDb21wYWN0aW9uc0Rpc2FibGVkKChDYWxsYWJsZTxWb2lkPikgKCkgLT4gewogICAgICAgICAgICAgICAgIGNmcy5kYXRhLnJlc2V0KG1lbXRhYmxlRmFjdG9yeS5jcmVhdGUobmV3IEF0b21pY1JlZmVyZW5jZTw+KENvbW1pdExvZ1Bvc2l0aW9uLk5PTkUpLCBjZnMubWV0YWRhdGEsIGNmcykpOwogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgfSwgT3BlcmF0aW9uVHlwZS5QMCwgdHJ1ZSwgZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNjAwLDcgKzI2NTIsNyBAQAogCiAgICAgICAgIGlmICghbm9TbmFwc2hvdCAmJgogICAgICAgICAgICAgICAgKChrZXlzcGFjZS5nZXRNZXRhZGF0YSgpLnBhcmFtcy5kdXJhYmxlV3JpdGVzICYmICFtZW10YWJsZVdyaXRlc0FyZUR1cmFibGUoKSkgIC8vIG5lZWQgdG8gY2xlYXIgZGlydHkgcmVnaW9ucwotICAgICAgICAgICAgICAgfHwgRGF0YWJhc2VEZXNjcmlwdG9yLmlzQXV0b1NuYXBzaG90KCkpKSAvLyBuZWVkIHNzdGFibGUgZm9yIHNuYXBzaG90CisgICAgICAgICAgICAgICB8fCBpc0F1dG9TbmFwc2hvdEVuYWJsZWQoKSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJlcGxheUFmdGVyID0gZm9yY2VCbG9ja2luZ0ZsdXNoKEZsdXNoUmVhc29uLlRSVU5DQVRFKTsKICAgICAgICAgICAgIHZpZXdNYW5hZ2VyLmZvcmNlQmxvY2tpbmdGbHVzaChGbHVzaFJlYXNvbi5UUlVOQ0FURSk7CkBAIC0yNjMzLDcgKzI2ODUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0b3BwaW5nIHBhcmVudCBzZXNzaW9ucyB7fSBkdWUgdG8gdHJ1bmNhdGlvbiBvZiB0YWJsZUlkPSIrbWV0YWRhdGEuaWQpOwogICAgICAgICAgICAgICAgIGRhdGEubm90aWZ5VHJ1bmNhdGVkKHRydW5jYXRlZEF0KTsKIAotICAgICAgICAgICAgaWYgKCFub1NuYXBzaG90ICYmIERhdGFiYXNlRGVzY3JpcHRvci5pc0F1dG9TbmFwc2hvdCgpKQorICAgICAgICAgICAgaWYgKCFub1NuYXBzaG90ICYmIGlzQXV0b1NuYXBzaG90RW5hYmxlZCgpKQogICAgICAgICAgICAgICAgIHNuYXBzaG90KEtleXNwYWNlLmdldFRpbWVzdGFtcGVkU25hcHNob3ROYW1lV2l0aFByZWZpeChuYW1lLCBTTkFQU0hPVF9UUlVOQ0FURV9QUkVGSVgpLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0QXV0b1NuYXBzaG90VHRsKCkpOwogCiAgICAgICAgICAgICBkaXNjYXJkU1NUYWJsZXModHJ1bmNhdGVkQXQpOwpAQCAtMjY0OCw3ICsyNzAwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKIAotICAgICAgICBydW5XaXRoQ29tcGFjdGlvbnNEaXNhYmxlZChGdXR1cmVUYXNrLmNhbGxhYmxlKHRydW5jYXRlUnVubmFibGUpLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgcnVuV2l0aENvbXBhY3Rpb25zRGlzYWJsZWQoRnV0dXJlVGFzay5jYWxsYWJsZSh0cnVuY2F0ZVJ1bm5hYmxlKSwgT3BlcmF0aW9uVHlwZS5QMCwgdHJ1ZSwgdHJ1ZSk7CiAKICAgICAgICAgdmlld01hbmFnZXIuYnVpbGQoKTsKIApAQCAtMjY3OSw5ICsyNzMxLDkgQEAKICAgICAgICAgICAgIEZCVXRpbGl0aWVzLndhaXRPbkZ1dHVyZShkdW1wTWVtdGFibGUoKSk7CiAgICAgfQogCi0gICAgcHVibGljIDxWPiBWIHJ1bldpdGhDb21wYWN0aW9uc0Rpc2FibGVkKENhbGxhYmxlPFY+IGNhbGxhYmxlLCBib29sZWFuIGludGVycnVwdFZhbGlkYXRpb24sIGJvb2xlYW4gaW50ZXJydXB0Vmlld3MpCisgICAgcHVibGljIDxWPiBWIHJ1bldpdGhDb21wYWN0aW9uc0Rpc2FibGVkKENhbGxhYmxlPFY+IGNhbGxhYmxlLCBPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUsIGJvb2xlYW4gaW50ZXJydXB0VmFsaWRhdGlvbiwgYm9vbGVhbiBpbnRlcnJ1cHRWaWV3cykKICAgICB7Ci0gICAgICAgIHJldHVybiBydW5XaXRoQ29tcGFjdGlvbnNEaXNhYmxlZChjYWxsYWJsZSwgKHNzdGFibGUpIC0+IHRydWUsIGludGVycnVwdFZhbGlkYXRpb24sIGludGVycnVwdFZpZXdzLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIHJ1bldpdGhDb21wYWN0aW9uc0Rpc2FibGVkKGNhbGxhYmxlLCAoc3N0YWJsZSkgLT4gdHJ1ZSwgb3BlcmF0aW9uVHlwZSwgaW50ZXJydXB0VmFsaWRhdGlvbiwgaW50ZXJydXB0Vmlld3MsIHRydWUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjY5NCwxMyArMjc0NiwxMyBAQAogICAgICAqIEBwYXJhbSBpbnRlcnJ1cHRJbmRleGVzIGlmIHdlIHNob3VsZCBpbnRlcnJ1cHQgY29tcGFjdGlvbnMgb24gaW5kZXhlcy4gTk9URTogaWYgeW91IHNldCB0aGlzIHRvIHRydWUgeW91ciBzc3RhYmxlUHJlZGljYXRlCiAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBhYmxlIHRvIGhhbmRsZSBMb2NhbFBhcnRpdGlvbmVyIHNzdGFibGVzIQogICAgICAqLwotICAgIHB1YmxpYyA8Vj4gViBydW5XaXRoQ29tcGFjdGlvbnNEaXNhYmxlZChDYWxsYWJsZTxWPiBjYWxsYWJsZSwgUHJlZGljYXRlPFNTVGFibGVSZWFkZXI+IHNzdGFibGVzUHJlZGljYXRlLCBib29sZWFuIGludGVycnVwdFZhbGlkYXRpb24sIGJvb2xlYW4gaW50ZXJydXB0Vmlld3MsIGJvb2xlYW4gaW50ZXJydXB0SW5kZXhlcykKKyAgICBwdWJsaWMgPFY+IFYgcnVuV2l0aENvbXBhY3Rpb25zRGlzYWJsZWQoQ2FsbGFibGU8Vj4gY2FsbGFibGUsIFByZWRpY2F0ZTxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlc1ByZWRpY2F0ZSwgT3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlLCBib29sZWFuIGludGVycnVwdFZhbGlkYXRpb24sIGJvb2xlYW4gaW50ZXJydXB0Vmlld3MsIGJvb2xlYW4gaW50ZXJydXB0SW5kZXhlcykKICAgICB7CiAgICAgICAgIC8vIHN5bmNocm9uaXplIHNvIHRoYXQgY29uY3VycmVudCBpbnZvY2F0aW9ucyBkb24ndCByZS1lbmFibGUgY29tcGFjdGlvbnMgcGFydHdheSB0aHJvdWdoIHVuZXhwZWN0ZWRseSwKICAgICAgICAgLy8gYW5kIHNvIHdlIG9ubHkgcnVuIG9uZSBtYWpvciBjb21wYWN0aW9uIGF0IGEgdGltZQogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiQ2FuY2VsbGluZyBpbi1wcm9ncmVzcyBjb21wYWN0aW9ucyBmb3Ige30iLCBtZXRhZGF0YS5uYW1lKTsKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiQ2FuY2VsbGluZyBpbi1wcm9ncmVzcyBjb21wYWN0aW9ucyBmb3Ige30iLCBtZXRhZGF0YS5uYW1lKTsKICAgICAgICAgICAgIEl0ZXJhYmxlPENvbHVtbkZhbWlseVN0b3JlPiB0b0ludGVycnVwdEZvciA9IGludGVycnVwdEluZGV4ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY29uY2F0V2l0aEluZGV4ZXMoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24odGhpcyk7CkBAIC0yNzA5LDkgKzI3NjEsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBJdGVyYWJsZXMuY29uY2F0KHRvSW50ZXJydXB0Rm9yLCB2aWV3TWFuYWdlci5hbGxWaWV3c0NmcygpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRvSW50ZXJydXB0Rm9yOwogCisgICAgICAgICAgICBJdGVyYWJsZTxUYWJsZU1ldGFkYXRhPiB0b0ludGVycnVwdEZvck1ldGFkYXRhID0gSXRlcmFibGVzLnRyYW5zZm9ybSh0b0ludGVycnVwdEZvciwgQ29sdW1uRmFtaWx5U3RvcmU6Om1ldGFkYXRhKTsKKwogICAgICAgICAgICAgdHJ5IChDb21wYWN0aW9uTWFuYWdlci5Db21wYWN0aW9uUGF1c2VyIHBhdXNlID0gQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UucGF1c2VHbG9iYWxDb21wYWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLkNvbXBhY3Rpb25QYXVzZXIgcGF1c2VkU3RyYXRlZ2llcyA9IHBhdXNlQ29tcGFjdGlvblN0cmF0ZWdpZXModG9JbnRlcnJ1cHRGb3IpKQogICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExpc3Q8Q29tcGFjdGlvbkluZm8uSG9sZGVyPiB1bmludGVycnVwdGlibGVUYXNrcyA9IENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmdldENvbXBhY3Rpb25zTWF0Y2hpbmcodG9JbnRlcnJ1cHRGb3JNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmZvKSAtPiBpbmZvLmdldFRhc2tUeXBlKCkucHJpb3JpdHkgPD0gb3BlcmF0aW9uVHlwZS5wcmlvcml0eSk7CisgICAgICAgICAgICAgICAgaWYgKCF1bmludGVycnVwdGlibGVUYXNrcy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiVW5hYmxlIHRvIGNhbmNlbCBpbi1wcm9ncmVzcyBjb21wYWN0aW9ucywgc2luY2UgdGhleSdyZSBydW5uaW5nIHdpdGggaGlnaGVyIG9yIHNhbWUgcHJpb3JpdHk6IHt9LiBZb3UgY2FuIGFib3J0IHRoZXNlIG9wZXJhdGlvbnMgdXNpbmcgYG5vZGV0b29sIHN0b3BgLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW50ZXJydXB0aWJsZVRhc2tzLnN0cmVhbSgpLm1hcCgoY29tcGFjdGlvbikgLT4gU3RyaW5nLmZvcm1hdCgiJXNAJXMgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYWN0aW9uLmdldENvbXBhY3Rpb25JbmZvKCkuZ2V0VGFza1R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhY3Rpb24uZ2V0Q29tcGFjdGlvbkluZm8oKS5nZXRUYWJsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFjdGlvbi5nZXRDb21wYWN0aW9uSW5mbygpLmdldFRhc2tJZCgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwiKSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAvLyBpbnRlcnJ1cHQgaW4tcHJvZ3Jlc3MgY29tcGFjdGlvbnMKICAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5pbnRlcnJ1cHRDb21wYWN0aW9uRm9yQ0ZzKHRvSW50ZXJydXB0Rm9yLCBzc3RhYmxlc1ByZWRpY2F0ZSwgaW50ZXJydXB0VmFsaWRhdGlvbik7CiAgICAgICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2Uud2FpdEZvckNlc3NhdGlvbih0b0ludGVycnVwdEZvciwgc3N0YWJsZXNQcmVkaWNhdGUpOwpAQCAtMjcyMSw3ICsyNzg4LDkgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjZnMuZ2V0VHJhY2tlcigpLmdldENvbXBhY3RpbmcoKS5zdHJlYW0oKS5hbnlNYXRjaChzc3RhYmxlc1ByZWRpY2F0ZSkpCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJVbmFibGUgdG8gY2FuY2VsIGluLXByb2dyZXNzIGNvbXBhY3Rpb25zIGZvciB7fS4gIFBlcmhhcHMgdGhlcmUgaXMgYW4gdW51c3VhbGx5IGxhcmdlIHJvdyBpbiBwcm9ncmVzcyBzb21ld2hlcmUsIG9yIHRoZSBzeXN0ZW0gaXMgc2ltcGx5IG92ZXJsb2FkZWQuIiwgbWV0YWRhdGEubmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiVW5hYmxlIHRvIGNhbmNlbCBpbi1wcm9ncmVzcyBjb21wYWN0aW9ucyBmb3Ige30uICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBlcmhhcHMgdGhlcmUgaXMgYW4gdW51c3VhbGx5IGxhcmdlIHJvdyBpbiBwcm9ncmVzcyBzb21ld2hlcmUsIG9yIHRoZSBzeXN0ZW0gaXMgc2ltcGx5IG92ZXJsb2FkZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0yNzc2LDcgKzI4NDUsNyBAQAogICAgICAgICByZXR1cm4gYWNjdW11bGF0ZTsKICAgICB9CiAKLSAgICBwdWJsaWMgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gbWFya0FsbENvbXBhY3RpbmcoZmluYWwgT3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlKQorICAgIHB1YmxpYyA8VD4gVCB3aXRoQWxsU1NUYWJsZXMoZmluYWwgT3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlLCBGdW5jdGlvbjxMaWZlY3ljbGVUcmFuc2FjdGlvbiwgVD4gb3ApCiAgICAgewogICAgICAgICBDYWxsYWJsZTxMaWZlY3ljbGVUcmFuc2FjdGlvbj4gY2FsbGFibGUgPSAoKSAtPiB7CiAgICAgICAgICAgICBhc3NlcnQgZGF0YS5nZXRDb21wYWN0aW5nKCkuaXNFbXB0eSgpIDogZGF0YS5nZXRDb21wYWN0aW5nKCk7CkBAIC0yNzg3LDEwICsyODU2LDEyIEBACiAgICAgICAgICAgICByZXR1cm4gbW9kaWZpZXI7CiAgICAgICAgIH07CiAKLSAgICAgICAgcmV0dXJuIHJ1bldpdGhDb21wYWN0aW9uc0Rpc2FibGVkKGNhbGxhYmxlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIGNvbXBhY3RpbmcgPSBydW5XaXRoQ29tcGFjdGlvbnNEaXNhYmxlZChjYWxsYWJsZSwgb3BlcmF0aW9uVHlwZSwgZmFsc2UsIGZhbHNlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG9wLmFwcGx5KGNvbXBhY3RpbmcpOworICAgICAgICB9CiAgICAgfQogCi0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKICAgICB7CkBAIC0yODYzLDYgKzI5MzQsNyBAQAogICAgIH0KIAogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIERvdWJsZSBnZXRDcmNDaGVja0NoYW5jZSgpCiAgICAgewogICAgICAgICByZXR1cm4gY3JjQ2hlY2tDaGFuY2UudmFsdWUoKTsKQEAgLTI5ODcsMjEgKzMwNTksMzcgQEAKICAgICAgICAgcmV0dXJuIGluZGV4TWFuYWdlci5nZXRCdWlsdEluZGV4TmFtZXMoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldFVubGV2ZWxlZFNTVGFibGVzKCkKICAgICB7CiAgICAgICAgIHJldHVybiBjb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyLmdldFVubGV2ZWxlZFNTVGFibGVzKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludFtdIGdldFNTVGFibGVDb3VudFBlckxldmVsKCkKICAgICB7CiAgICAgICAgIHJldHVybiBjb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyLmdldFNTVGFibGVDb3VudFBlckxldmVsKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGxvbmdbXSBnZXRQZXJMZXZlbFNpemVCeXRlcygpCiAgICAgewogICAgICAgICByZXR1cm4gY29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlci5nZXRQZXJMZXZlbFNpemVCeXRlcygpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzTGV2ZWxlZENvbXBhY3Rpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIuaXNMZXZlbGVkQ29tcGFjdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnRbXSBnZXRTU1RhYmxlQ291bnRQZXJUV0NTQnVja2V0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyLmdldFNTVGFibGVDb3VudFBlclRXQ1NCdWNrZXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldExldmVsRmFub3V0U2l6ZSgpCiAgICAgewogICAgICAgICByZXR1cm4gY29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlci5nZXRMZXZlbEZhbm91dFNpemUoKTsKQEAgLTMwNjMsNiArMzE1MSwxNiBAQAogICAgICAgICByZXR1cm4gbWV0YWRhdGEoKS5wYXJhbXMuY2FjaGluZy5jYWNoZUtleXMoKSAmJiBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGUuZ2V0Q2FwYWNpdHkoKSA+IDA7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaXNBdXRvU25hcHNob3RFbmFibGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtZXRhZGF0YSgpLnBhcmFtcy5hbGxvd0F1dG9TbmFwc2hvdCAmJiBEYXRhYmFzZURlc2NyaXB0b3IuaXNBdXRvU25hcHNob3QoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RhYmxlSW5jcmVtZW50YWxCYWNrdXBzRW5hYmxlZCgpCisgICAgeworICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmlzSW5jcmVtZW50YWxCYWNrdXBzRW5hYmxlZCgpICYmIG1ldGFkYXRhKCkucGFyYW1zLmluY3JlbWVudGFsQmFja3VwczsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBEaXNjYXJkIGFsbCBTU1RhYmxlcyB0aGF0IHdlcmUgY3JlYXRlZCBiZWZvcmUgZ2l2ZW4gdGltZXN0YW1wLgogICAgICAqCkBAIC0zMDk3LDYgKzMxOTUsNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGRvdWJsZSBnZXREcm9wcGFibGVUb21ic3RvbmVSYXRpbygpCiAgICAgewogICAgICAgICBkb3VibGUgYWxsRHJvcHBhYmxlID0gMDsKQEAgLTMxMTEsNiArMzIxMCw3IEBACiAgICAgICAgIHJldHVybiBhbGxDb2x1bW5zID4gMCA/IGFsbERyb3BwYWJsZSAvIGFsbENvbHVtbnMgOiAwOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBsb25nIHRydWVTbmFwc2hvdHNTaXplKCkKICAgICB7CiAgICAgICAgIHJldHVybiBnZXREaXJlY3RvcmllcygpLnRydWVTbmFwc2hvdHNTaXplKCk7CkBAIC0zMTYwLDYgKzMyNjAsMzYgQEAKICAgICAgICAgcmV0dXJuIE9iamVjdHMucmVxdWlyZU5vbk51bGwoZ2V0SWZFeGlzdHModGFibGVJZCkpLm1ldHJpYzsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBHcmFicyB0aGUgZ2xvYmFsIGZpcnN0L2xhc3QgdG9rZW5zIGFtb25nIHNzdGFibGVzIGFuZCByZXR1cm5zIHRoZSByYW5nZSBvZiBkYXRhIGRpcmVjdG9yaWVzIHRoYXQgc3RhcnQvZW5kIHdpdGggdGhvc2UgdG9rZW5zLgorICAgICAqCisgICAgICogVGhpcyBpcyBkb25lIHRvIGF2b2lkIGdyYWJiaW5nIHRoZSBkaXNrIGJvdW5kYXJpZXMgZm9yIGV2ZXJ5IHNzdGFibGUgaW4gY2FzZSBvZiBodWdlIGNvbXBhY3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PEZpbGU+IGdldERpcmVjdG9yaWVzRm9yRmlsZXMoU2V0PFNTVGFibGVSZWFkZXI+IHNzdGFibGVzKQorICAgIHsKKyAgICAgICAgRGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeVtdIHdyaXRlYWJsZUxvY2F0aW9ucyA9IGRpcmVjdG9yaWVzLmdldFdyaXRlYWJsZUxvY2F0aW9ucygpOworICAgICAgICBpZiAod3JpdGVhYmxlTG9jYXRpb25zLmxlbmd0aCA9PSAxIHx8IHNzdGFibGVzLmlzRW1wdHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxGaWxlPiByZXQgPSBuZXcgQXJyYXlMaXN0PD4od3JpdGVhYmxlTG9jYXRpb25zLmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnkgZGRpciA6IHdyaXRlYWJsZUxvY2F0aW9ucykKKyAgICAgICAgICAgICAgICByZXQuYWRkKGdldERpcmVjdG9yaWVzKCkuZ2V0TG9jYXRpb25Gb3JEaXNrKGRkaXIpKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBEZWNvcmF0ZWRLZXkgZmlyc3QgPSBudWxsOworICAgICAgICBEZWNvcmF0ZWRLZXkgbGFzdCA9IG51bGw7CisgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCA9PSBudWxsIHx8IGZpcnN0LmNvbXBhcmVUbyhzc3RhYmxlLmdldEZpcnN0KCkpID4gMCkKKyAgICAgICAgICAgICAgICBmaXJzdCA9IHNzdGFibGUuZ2V0Rmlyc3QoKTsKKyAgICAgICAgICAgIGlmIChsYXN0ID09IG51bGwgfHwgbGFzdC5jb21wYXJlVG8oc3N0YWJsZS5nZXRMYXN0KCkpIDwgMCkKKyAgICAgICAgICAgICAgICBsYXN0ID0gc3N0YWJsZS5nZXRMYXN0KCk7CisgICAgICAgIH0KKworICAgICAgICBEaXNrQm91bmRhcmllcyBkaXNrQm91bmRhcmllcyA9IGdldERpc2tCb3VuZGFyaWVzKCk7CisgICAgICAgIHJldHVybiBkaXNrQm91bmRhcmllcy5nZXREaXNrc0luQm91bmRzKGZpcnN0LCBsYXN0KS5zdHJlYW0oKS5tYXAoZGlyZWN0b3JpZXM6OmdldExvY2F0aW9uRm9yRGlzaykuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9CisKICAgICBwdWJsaWMgRGlza0JvdW5kYXJpZXMgZ2V0RGlza0JvdW5kYXJpZXMoKQogICAgIHsKICAgICAgICAgcmV0dXJuIGRpc2tCb3VuZGFyeU1hbmFnZXIuZ2V0RGlza0JvdW5kYXJpZXModGhpcyk7CkBAIC0zMTk1LDcgKzMzMjUsNyBAQAogCiAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmludGVycnVwdENvbXBhY3Rpb25Gb3JDRnMoY29uY2F0V2l0aEluZGV4ZXMoKSwgKHNzdGFibGUpIC0+IHRydWUsIHRydWUpOwogCi0gICAgICAgIGlmIChEYXRhYmFzZURlc2NyaXB0b3IuaXNBdXRvU25hcHNob3QoKSkKKyAgICAgICAgaWYgKGlzQXV0b1NuYXBzaG90RW5hYmxlZCgpKQogICAgICAgICAgICAgc25hcHNob3QoS2V5c3BhY2UuZ2V0VGltZXN0YW1wZWRTbmFwc2hvdE5hbWVXaXRoUHJlZml4KG5hbWUsIENvbHVtbkZhbWlseVN0b3JlLlNOQVBTSE9UX0RST1BfUFJFRklYKSwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldEF1dG9TbmFwc2hvdFR0bCgpKTsKIAogICAgICAgICBDb21taXRMb2cuaW5zdGFuY2UuZm9yY2VSZWN5Y2xlQWxsU2VnbWVudHMoQ29sbGVjdGlvbnMuc2luZ2xldG9uKG1ldGFkYXRhLmlkKSk7CkBAIC0zMzA3LDYgKzM0MzcsMTggQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRNYXhTU1RhYmxlU2l6ZSgpCisgICAgeworICAgICAgICByZXR1cm4gbWV0cmljLm1heFNTVGFibGVTaXplLmdldFZhbHVlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0TWF4U1NUYWJsZUR1cmF0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtZXRyaWMubWF4U1NUYWJsZUR1cmF0aW9uLmdldFZhbHVlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE1hcDxTdHJpbmcsIExvbmc+IGdldFRvcFNpemVQYXJ0aXRpb25zKCkKICAgICB7CiAgICAgICAgIGlmICh0b3BQYXJ0aXRpb25zID09IG51bGwpCkBAIC0zMzM3LDQgKzM0NzksMTYgQEAKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICByZXR1cm4gdG9wUGFydGl0aW9ucy50b3BUb21ic3RvbmVzKCkubGFzdFVwZGF0ZTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT3BPcmRlci5CYXJyaWVyIG5ld1JlYWRPcmRlcmluZ0JhcnJpZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlYWRPcmRlcmluZy5uZXdCYXJyaWVyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRhYmxlTWV0cmljcyBnZXRNZXRyaWNzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtZXRyaWM7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ29sdW1uRmFtaWx5U3RvcmVNQmVhbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ29sdW1uRmFtaWx5U3RvcmVNQmVhbi5qYXZhCmluZGV4IGRlN2M5MzMuLjJhZTc3YjQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NvbHVtbkZhbWlseVN0b3JlTUJlYW4uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Db2x1bW5GYW1pbHlTdG9yZU1CZWFuLmphdmEKQEAgLTE2Miw2ICsxNjIsMTUgQEAKICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFNTVGFibGVzRm9yS2V5KFN0cmluZyBrZXksIGJvb2xlYW4gaGV4Rm9ybWF0KTsKIAogICAgIC8qKgorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGZpbGVuYW1lcyB0aGF0IGNvbnRhaW4gdGhlIGdpdmVuIGtleSBhbmQgd2hpY2ggbGV2ZWwgdGhleSBiZWxvbmcgdG8uCisgICAgICogUmVxdWlyZXMgdGFibGUgdG8gYmUgY29tcGFjdGVkIHdpdGgge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneX0KKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogQHBhcmFtIGhleEZvcm1hdAorICAgICAqIEByZXR1cm4gbGlzdCBvZiBmaWxlbmFtZXMgYW5kIGxldmVscyBjb250YWluaW5nIHRoZSBrZXkKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPEludGVnZXIsIFNldDxTdHJpbmc+PiBnZXRTU1RhYmxlc0ZvcktleVdpdGhMZXZlbChTdHJpbmcga2V5LCBib29sZWFuIGhleEZvcm1hdCk7CisKKyAgICAvKioKICAgICAgKiBMb2FkIG5ldyBzc3RhYmxlcyBmcm9tIHRoZSBnaXZlbiBkaXJlY3RvcnkKICAgICAgKgogICAgICAqIEBwYXJhbSBzcmNQYXRocyB0aGUgcGF0aCB0byB0aGUgbmV3IHNzdGFibGVzIC0gaWYgaXQgaXMgYW4gZW1wdHkgc2V0LCB0aGUgZGF0YSBkaXJlY3RvcmllcyB3aWxsIGJlIHNjYW5uZWQKQEAgLTIyNiw2ICsyMzUsMTcgQEAKICAgICBwdWJsaWMgbG9uZ1tdIGdldFBlckxldmVsU2l6ZUJ5dGVzKCk7CiAKICAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRhYmxlIGlzIHVzaW5nIExldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3kuIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xldmVsZWRDb21wYWN0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHNzdGFibGUgY291bnQgZm9yIGVhY2ggYnVja2V0IGluIFRXQ1MuIG51bGwgdW5sZXNzIHRpbWUgd2luZG93IGNvbXBhY3Rpb24gaXMgdXNlZC4KKyAgICAgKiAgICAgICAgIGFycmF5IGluZGV4IGNvcnJlc3BvbmRzIHRvIGJ1Y2tldChpbnRbMF0gaXMgZm9yIG1vc3QgcmVjZW50LCAuLi4pLgorICAgICAqLworICAgIHB1YmxpYyBpbnRbXSBnZXRTU1RhYmxlQ291bnRQZXJUV0NTQnVja2V0KCk7CisKKyAgICAvKioKICAgICAgKiBAcmV0dXJuIHNzdGFibGUgZmFub3V0IHNpemUgZm9yIGxldmVsIGNvbXBhY3Rpb24gc3RyYXRlZ3kuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRMZXZlbEZhbm91dFNpemUoKTsKQEAgLTI3OSw0ICsyOTksMjMgQEAKICAgICBwdWJsaWMgTG9uZyBnZXRUb3BTaXplUGFydGl0aW9uc0xhc3RVcGRhdGUoKTsKICAgICBwdWJsaWMgTWFwPFN0cmluZywgTG9uZz4gZ2V0VG9wVG9tYnN0b25lUGFydGl0aW9ucygpOwogICAgIHB1YmxpYyBMb25nIGdldFRvcFRvbWJzdG9uZVBhcnRpdGlvbnNMYXN0VXBkYXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBiaWdnZXN0IFNTVGFibGUgb2YgdGhpcyB0YWJsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gKHBoeXNpY2FsKSBzaXplIG9mIHRoZSBiaWdnZXN0IFNTVGFibGUgb2YgdGhpcyB0YWJsZSBvbiBkaXNrIG9yIDAgaWYgbm8gU1NUYWJsZSBpcyBwcmVzZW50CisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TWF4U1NUYWJsZVNpemUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxvbmdlc3QgZHVyYXRpb24gb2YgYW4gU1NUYWJsZSwgaW4gbWlsbGlzZWNvbmRzLCBvZiB0aGlzIHRhYmxlLAorICAgICAqIGNvbXB1dGVkIGFzIHtAY29kZSBtYXhUaW1lc3RhbXAgLSBtaW5UaW1lc3RhbXB9LgorICAgICAqCisgICAgICogSXQgcmV0dXJucyAwIGlmIHRoZXJlIGFyZSBubyBTU1RhYmxlcyBvciBpZiB7QGNvZGUgbWF4VGltZXN0YW1wfSBvciB7QGNvZGUgbWluVGltZXN0YW1wfSBpcworICAgICAqIGVxdWFsIHRvIHtAY29kZSBMb25nLk1BWF9WQUxVRX0uIEVmZmVjdGl2ZWx5IG5vbi16ZXJvIGZvciB0YWJsZXMgb24ge0Bjb2RlIFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3l9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgYmlnZ2VzdCB7QGNvZGUgbWF4VGltZXN0YW1wIC0gbWluVGltZXN0YW1wfSBhbW9uZyBhbGwgU1NUYWJsZXMgb2YgdGhpcyB0YWJsZQorICAgICAqIG9yIDAgaWYgbm8gU1NUYWJsZSBpcyBwcmVzZW50CisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TWF4U1NUYWJsZUR1cmF0aW9uKCk7CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Db2x1bW5JbmRleC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ29sdW1uSW5kZXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc4NjBkZi4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Db2x1bW5JbmRleC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLkludHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5JU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkluZGV4SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRmx1c2hPYnNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0QnVmZmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKLQotLyoqCi0gKiBDb2x1bW4gaW5kZXggYnVpbGRlciB1c2VkIGJ5IHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnVGFibGVXcml0ZXJ9LgotICogRm9yIGluZGV4IGVudHJpZXMgdGhhdCBleGNlZWQge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWcjY29sdW1uX2luZGV4X2NhY2hlX3NpemV9LAotICogdGhpcyB1c2VzIHRoZSBzZXJpYWxpemF0aW9uIGxvZ2ljIGFzIGluIHtAbGluayBSb3dJbmRleEVudHJ5fS4KLSAqLwotcHVibGljIGNsYXNzIENvbHVtbkluZGV4Ci17Ci0gICAgLy8gdXNlZCwgaWYgdGhlIHJvdy1pbmRleC1lbnRyeSByZWFjaGVzIGNvbmZpZyBjb2x1bW5faW5kZXhfY2FjaGVfc2l6ZQotICAgIHByaXZhdGUgRGF0YU91dHB1dEJ1ZmZlciBidWZmZXI7Ci0gICAgLy8gdXNlZCB0byB0cmFjayB0aGUgc2l6ZSBvZiB0aGUgc2VyaWFsaXplZCBzaXplIG9mIHJvdy1pbmRleC1lbnRyeSAodW51c2VkIGZvciBidWZmZXIpCi0gICAgcHJpdmF0ZSBpbnQgaW5kZXhTYW1wbGVzU2VyaWFsaXplZFNpemU7Ci0gICAgLy8gdXNlZCwgdW50aWwgdGhlIHJvdy1pbmRleC1lbnRyeSByZWFjaGVzIGNvbmZpZyBjb2x1bW5faW5kZXhfY2FjaGVfc2l6ZQotICAgIHByaXZhdGUgZmluYWwgTGlzdDxJbmRleEluZm8+IGluZGV4U2FtcGxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCi0gICAgcHJpdmF0ZSBEYXRhT3V0cHV0QnVmZmVyIHJldXNhYmxlQnVmZmVyOwotCi0gICAgcHVibGljIGludCBjb2x1bW5JbmRleENvdW50OwotICAgIHByaXZhdGUgaW50W10gaW5kZXhPZmZzZXRzOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXJpYWxpemF0aW9uSGVscGVyIGhlbHBlcjsKLSAgICBwcml2YXRlIGZpbmFsIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyOwotICAgIHByaXZhdGUgZmluYWwgaW50IHZlcnNpb247Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXF1ZW50aWFsV3JpdGVyIHdyaXRlcjsKLSAgICBwcml2YXRlIGxvbmcgaW5pdGlhbFBvc2l0aW9uOwotICAgIHByaXZhdGUgZmluYWwgIElTZXJpYWxpemVyPEluZGV4SW5mbz4gaWR4U2VyaWFsaXplcjsKLSAgICBwdWJsaWMgbG9uZyBoZWFkZXJMZW5ndGg7Ci0gICAgcHJpdmF0ZSBsb25nIHN0YXJ0UG9zaXRpb247Ci0KLSAgICBwcml2YXRlIGludCB3cml0dGVuOwotICAgIHByaXZhdGUgbG9uZyBwcmV2aW91c1Jvd1N0YXJ0OwotCi0gICAgcHJpdmF0ZSBDbHVzdGVyaW5nUHJlZml4PD8+IGZpcnN0Q2x1c3RlcmluZzsKLSAgICBwcml2YXRlIENsdXN0ZXJpbmdQcmVmaXg8Pz4gbGFzdENsdXN0ZXJpbmc7Ci0KLSAgICBwcml2YXRlIERlbGV0aW9uVGltZSBvcGVuTWFya2VyOwotCi0gICAgcHJpdmF0ZSBpbnQgY2FjaGVTaXplVGhyZXNob2xkOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFNTVGFibGVGbHVzaE9ic2VydmVyPiBvYnNlcnZlcnM7Ci0KLSAgICBwdWJsaWMgQ29sdW1uSW5kZXgoU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW50aWFsV3JpdGVyIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248U1NUYWJsZUZsdXNoT2JzZXJ2ZXI+IG9ic2VydmVycywKLSAgICAgICAgICAgICAgICAgICAgICAgIElTZXJpYWxpemVyPEluZGV4SW5mbz4gaW5kZXhJbmZvU2VyaWFsaXplcikKLSAgICB7Ci0gICAgICAgIHRoaXMuaGVscGVyID0gbmV3IFNlcmlhbGl6YXRpb25IZWxwZXIoaGVhZGVyKTsKLSAgICAgICAgdGhpcy5oZWFkZXIgPSBoZWFkZXI7Ci0gICAgICAgIHRoaXMud3JpdGVyID0gd3JpdGVyOwotICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uLmNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uKCk7Ci0gICAgICAgIHRoaXMub2JzZXJ2ZXJzID0gb2JzZXJ2ZXJzOwotICAgICAgICB0aGlzLmlkeFNlcmlhbGl6ZXIgPSBpbmRleEluZm9TZXJpYWxpemVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKLSAgICB7Ci0gICAgICAgIHRoaXMuaW5pdGlhbFBvc2l0aW9uID0gd3JpdGVyLnBvc2l0aW9uKCk7Ci0gICAgICAgIHRoaXMuaGVhZGVyTGVuZ3RoID0gLTE7Ci0gICAgICAgIHRoaXMuc3RhcnRQb3NpdGlvbiA9IC0xOwotICAgICAgICB0aGlzLnByZXZpb3VzUm93U3RhcnQgPSAwOwotICAgICAgICB0aGlzLmNvbHVtbkluZGV4Q291bnQgPSAwOwotICAgICAgICB0aGlzLndyaXR0ZW4gPSAwOwotICAgICAgICB0aGlzLmluZGV4U2FtcGxlc1NlcmlhbGl6ZWRTaXplID0gMDsKLSAgICAgICAgdGhpcy5pbmRleFNhbXBsZXMuY2xlYXIoKTsKLSAgICAgICAgdGhpcy5maXJzdENsdXN0ZXJpbmcgPSBudWxsOwotICAgICAgICB0aGlzLmxhc3RDbHVzdGVyaW5nID0gbnVsbDsKLSAgICAgICAgdGhpcy5vcGVuTWFya2VyID0gbnVsbDsKLQotICAgICAgICBpbnQgbmV3Q2FjaGVTaXplVGhyZXNob2xkID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbHVtbkluZGV4Q2FjaGVTaXplKCk7Ci0gICAgICAgIGlmICh0aGlzLmJ1ZmZlciAhPSBudWxsICYmIHRoaXMuY2FjaGVTaXplVGhyZXNob2xkID09IG5ld0NhY2hlU2l6ZVRocmVzaG9sZCkKLSAgICAgICAgICAgIHRoaXMucmV1c2FibGVCdWZmZXIgPSB0aGlzLmJ1ZmZlcjsKLSAgICAgICAgdGhpcy5idWZmZXIgPSBudWxsOwotICAgICAgICB0aGlzLmNhY2hlU2l6ZVRocmVzaG9sZCA9IG5ld0NhY2hlU2l6ZVRocmVzaG9sZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBidWlsZFJvd0luZGV4KFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvcikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICB3cml0ZVBhcnRpdGlvbkhlYWRlcihpdGVyYXRvcik7Ci0gICAgICAgIHRoaXMuaGVhZGVyTGVuZ3RoID0gd3JpdGVyLnBvc2l0aW9uKCkgLSBpbml0aWFsUG9zaXRpb247Ci0KLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgVW5maWx0ZXJlZCB1bmZpbHRlcmVkID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgU1NUYWJsZVdyaXRlci5ndWFyZENvbGxlY3Rpb25TaXplKGl0ZXJhdG9yLm1ldGFkYXRhKCksIGl0ZXJhdG9yLnBhcnRpdGlvbktleSgpLCB1bmZpbHRlcmVkKTsKLSAgICAgICAgICAgIGFkZCh1bmZpbHRlcmVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmlzaCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZVBhcnRpdGlvbkhlYWRlcihVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3IpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVXaXRoU2hvcnRMZW5ndGgoaXRlcmF0b3IucGFydGl0aW9uS2V5KCkuZ2V0S2V5KCksIHdyaXRlcik7Ci0gICAgICAgIERlbGV0aW9uVGltZS5zZXJpYWxpemVyLnNlcmlhbGl6ZShpdGVyYXRvci5wYXJ0aXRpb25MZXZlbERlbGV0aW9uKCksIHdyaXRlcik7Ci0gICAgICAgIGlmIChoZWFkZXIuaGFzU3RhdGljKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJvdyBzdGF0aWNSb3cgPSBpdGVyYXRvci5zdGF0aWNSb3coKTsKLQotICAgICAgICAgICAgVW5maWx0ZXJlZFNlcmlhbGl6ZXIuc2VyaWFsaXplci5zZXJpYWxpemVTdGF0aWNSb3coc3RhdGljUm93LCBoZWxwZXIsIHdyaXRlciwgdmVyc2lvbik7Ci0gICAgICAgICAgICBpZiAoIW9ic2VydmVycy5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgb2JzZXJ2ZXJzLmZvckVhY2goKG8pIC0+IG8ubmV4dFVuZmlsdGVyZWRDbHVzdGVyKHN0YXRpY1JvdykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBsb25nIGN1cnJlbnRQb3NpdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gd3JpdGVyLnBvc2l0aW9uKCkgLSBpbml0aWFsUG9zaXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIEJ5dGVCdWZmZXIgYnVmZmVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBidWZmZXIgIT0gbnVsbCA/IGJ1ZmZlci5idWZmZXIoKSA6IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8SW5kZXhJbmZvPiBpbmRleFNhbXBsZXMoKQotICAgIHsKLSAgICAgICAgaWYgKGluZGV4U2FtcGxlc1NlcmlhbGl6ZWRTaXplICsgY29sdW1uSW5kZXhDb3VudCAqIFR5cGVTaXplcy5zaXplb2YoMCkgPD0gY2FjaGVTaXplVGhyZXNob2xkKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW5kZXhTYW1wbGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGludFtdIG9mZnNldHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZGV4T2Zmc2V0cyAhPSBudWxsCi0gICAgICAgICAgICAgICA/IEFycmF5cy5jb3B5T2YoaW5kZXhPZmZzZXRzLCBjb2x1bW5JbmRleENvdW50KQotICAgICAgICAgICAgICAgOiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRJbmRleEJsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBJbmRleEluZm8gY0luZGV4SW5mbyA9IG5ldyBJbmRleEluZm8oZmlyc3RDbHVzdGVyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdENsdXN0ZXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uKCkgLSBzdGFydFBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Blbk1hcmtlcik7Ci0KLSAgICAgICAgLy8gaW5kZXhPZmZzZXRzIGlzIHVzZWQgZm9yIGJvdGggc2hhbGxvdyAoU2hhbGxvd0luZGV4ZWRFbnRyeSkgYW5kIG5vbi1zaGFsbG93IEluZGV4ZWRFbnRyeS4KLSAgICAgICAgLy8gRm9yIHNoYWxsb3cgb25lcywgd2UgbmVlZCBpdCB0byBzZXJpYWxpemUgdGhlIG9mZnN0cyBpbiBmaW5pc2goKS4KLSAgICAgICAgLy8gRm9yIG5vbi1zaGFsbG93IG9uZXMsIHRoZSBvZmZzdHMgYXJlIHBhc3NlZCBpbnRvIEluZGV4ZWRFbnRyeSwgc28gd2UgZG9uJ3QgaGF2ZSB0bwotICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIG9mZnNldHMgYWdhaW4uCi0KLSAgICAgICAgLy8gaW5kZXhPZmZzZXRzIGNvbnRhaW5zIHRoZSBvZmZzZXRzIG9mIHRoZSBzZXJpYWxpemVkIEluZGV4SW5mbyBvYmplY3RzLgotICAgICAgICAvLyBJLmUuIGluZGV4T2Zmc2V0c1swXSBpcyBhbHdheXMgMCBzbyB3ZSBkb24ndCBoYXZlIHRvIGRlYWwgd2l0aCBhIHNwZWNpYWwgaGFuZGxpbmcKLSAgICAgICAgLy8gZm9yIGluZGV4ICMwIGFuZCBhbHdheXMgc3VidHJhY3RpbmcgMSBmb3IgdGhlIGluZGV4ICh3aGljaCBjb3VsZCBiZSBlcnJvci1wcm9uZSkuCi0gICAgICAgIGlmIChpbmRleE9mZnNldHMgPT0gbnVsbCkKLSAgICAgICAgICAgIGluZGV4T2Zmc2V0cyA9IG5ldyBpbnRbMTBdOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleENvdW50ID49IGluZGV4T2Zmc2V0cy5sZW5ndGgpCi0gICAgICAgICAgICAgICAgaW5kZXhPZmZzZXRzID0gQXJyYXlzLmNvcHlPZihpbmRleE9mZnNldHMsIGluZGV4T2Zmc2V0cy5sZW5ndGggKyAxMCk7Ci0KLSAgICAgICAgICAgIC8vdGhlIDB0aCBlbGVtZW50IGlzIGFsd2F5cyAwCi0gICAgICAgICAgICBpZiAoY29sdW1uSW5kZXhDb3VudCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGluZGV4T2Zmc2V0c1tjb2x1bW5JbmRleENvdW50XSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5kZXhPZmZzZXRzW2NvbHVtbkluZGV4Q291bnRdID0KLSAgICAgICAgICAgICAgICBidWZmZXIgIT0gbnVsbAotICAgICAgICAgICAgICAgID8gSW50cy5jaGVja2VkQ2FzdChidWZmZXIucG9zaXRpb24oKSkKLSAgICAgICAgICAgICAgICA6IGluZGV4U2FtcGxlc1NlcmlhbGl6ZWRTaXplOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbHVtbkluZGV4Q291bnQrKzsKLQotICAgICAgICAvLyBGaXJzdCwgd2UgY29sbGVjdCB0aGUgSW5kZXhJbmZvIG9iamVjdHMgdW50aWwgd2UgcmVhY2ggQ29uZmlnLmNvbHVtbl9pbmRleF9jYWNoZV9zaXplIGluIGFuIEFycmF5TGlzdC4KLSAgICAgICAgLy8gV2hlbiBjb2x1bW5faW5kZXhfY2FjaGVfc2l6ZSBpcyByZWFjaGVkLCB3ZSBzd2l0Y2ggdG8gYnl0ZS1idWZmZXIgbW9kZS4KLSAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmRleFNhbXBsZXNTZXJpYWxpemVkU2l6ZSArPSBpZHhTZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKGNJbmRleEluZm8pOwotICAgICAgICAgICAgaWYgKGluZGV4U2FtcGxlc1NlcmlhbGl6ZWRTaXplICsgY29sdW1uSW5kZXhDb3VudCAqIFR5cGVTaXplcy5zaXplb2YoMCkgPiBjYWNoZVNpemVUaHJlc2hvbGQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyID0gcmV1c2VPckFsbG9jYXRlQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJbmRleEluZm8gaW5kZXhTYW1wbGUgOiBpbmRleFNhbXBsZXMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZHhTZXJpYWxpemVyLnNlcmlhbGl6ZShpbmRleFNhbXBsZSwgYnVmZmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5kZXhTYW1wbGVzLmFkZChjSW5kZXhJbmZvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBkb24ndCBwdXQgYW4gZWxzZSBoZXJlIHNpbmNlIGJ1ZmZlciBtYXkgYmUgYWxsb2NhdGVkIGluIHByZWNlZGluZyBpZiBibG9jawotICAgICAgICBpZiAoYnVmZmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlkeFNlcmlhbGl6ZXIuc2VyaWFsaXplKGNJbmRleEluZm8sIGJ1ZmZlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaXJzdENsdXN0ZXJpbmcgPSBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgRGF0YU91dHB1dEJ1ZmZlciByZXVzZU9yQWxsb2NhdGVCdWZmZXIoKQotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBhIHJldXNhYmxlIERhdGFPdXRwdXRCdWZmZXIgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMKLSAgICAgICAgLy8gQ29sdW1uSW5kZXggaW5zdGFuY2UgYW5kIHJldHVybiBpdC4KLSAgICAgICAgaWYgKHJldXNhYmxlQnVmZmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIERhdGFPdXRwdXRCdWZmZXIgYnVmZmVyID0gcmV1c2FibGVCdWZmZXI7Ci0gICAgICAgICAgICBidWZmZXIuY2xlYXIoKTsKLSAgICAgICAgICAgIHJldHVybiBidWZmZXI7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZG9uJ3QgdXNlIHRoZSBzdGFuZGFyZCBSRUNZQ0xFUiBhcyB0aGF0IG9ubHkgcmVjeWNsZXMgdXAgdG8gMU1CIGFuZCByZXF1aXJlcyBwcm9wZXIgY2xlYW51cAotICAgICAgICByZXR1cm4gbmV3IERhdGFPdXRwdXRCdWZmZXIoY2FjaGVTaXplVGhyZXNob2xkICogMik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZChVbmZpbHRlcmVkIHVuZmlsdGVyZWQpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbG9uZyBwb3MgPSBjdXJyZW50UG9zaXRpb24oKTsKLQotICAgICAgICBpZiAoZmlyc3RDbHVzdGVyaW5nID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEJlZ2lubmluZyBvZiBhbiBpbmRleCBibG9jay4gUmVtZW1iZXIgdGhlIHN0YXJ0IGFuZCBwb3NpdGlvbgotICAgICAgICAgICAgZmlyc3RDbHVzdGVyaW5nID0gdW5maWx0ZXJlZC5jbHVzdGVyaW5nKCk7Ci0gICAgICAgICAgICBzdGFydFBvc2l0aW9uID0gcG9zOwotICAgICAgICB9Ci0KLSAgICAgICAgVW5maWx0ZXJlZFNlcmlhbGl6ZXIuc2VyaWFsaXplci5zZXJpYWxpemUodW5maWx0ZXJlZCwgaGVscGVyLCB3cml0ZXIsIHBvcyAtIHByZXZpb3VzUm93U3RhcnQsIHZlcnNpb24pOwotCi0gICAgICAgIC8vIG5vdGlmeSBvYnNlcnZlcnMgYWJvdXQgZWFjaCBuZXcgcm93Ci0gICAgICAgIGlmICghb2JzZXJ2ZXJzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIG9ic2VydmVycy5mb3JFYWNoKChvKSAtPiBvLm5leHRVbmZpbHRlcmVkQ2x1c3Rlcih1bmZpbHRlcmVkKSk7Ci0KLSAgICAgICAgbGFzdENsdXN0ZXJpbmcgPSB1bmZpbHRlcmVkLmNsdXN0ZXJpbmcoKTsKLSAgICAgICAgcHJldmlvdXNSb3dTdGFydCA9IHBvczsKLSAgICAgICAgKyt3cml0dGVuOwotCi0gICAgICAgIGlmICh1bmZpbHRlcmVkLmtpbmQoKSA9PSBVbmZpbHRlcmVkLktpbmQuUkFOR0VfVE9NQlNUT05FX01BUktFUikKLSAgICAgICAgewotICAgICAgICAgICAgUmFuZ2VUb21ic3RvbmVNYXJrZXIgbWFya2VyID0gKFJhbmdlVG9tYnN0b25lTWFya2VyKSB1bmZpbHRlcmVkOwotICAgICAgICAgICAgb3Blbk1hcmtlciA9IG1hcmtlci5pc09wZW4oZmFsc2UpID8gbWFya2VyLm9wZW5EZWxldGlvblRpbWUoZmFsc2UpIDogbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHdlIGhpdCB0aGUgY29sdW1uIGluZGV4IHNpemUgdGhhdCB3ZSBoYXZlIHRvIGluZGV4IGFmdGVyLCBnbyBhaGVhZCBhbmQgaW5kZXggaXQuCi0gICAgICAgIGlmIChjdXJyZW50UG9zaXRpb24oKSAtIHN0YXJ0UG9zaXRpb24gPj0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbHVtbkluZGV4U2l6ZSgpKQotICAgICAgICAgICAgYWRkSW5kZXhCbG9jaygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaW5pc2goKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFVuZmlsdGVyZWRTZXJpYWxpemVyLnNlcmlhbGl6ZXIud3JpdGVFbmRPZlBhcnRpdGlvbih3cml0ZXIpOwotCi0gICAgICAgIC8vIEl0J3MgcG9zc2libGUgd2UgYWRkIG5vIHJvd3MsIGp1c3QgYSB0b3AgbGV2ZWwgZGVsZXRpb24KLSAgICAgICAgaWYgKHdyaXR0ZW4gPT0gMCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvLyB0aGUgbGFzdCBjb2x1bW4gbWF5IGhhdmUgZmFsbGVuIG9uIGFuIGluZGV4IGJvdW5kYXJ5IGFscmVhZHkuICBpZiBub3QsIGluZGV4IGl0IGV4cGxpY2l0bHkuCi0gICAgICAgIGlmIChmaXJzdENsdXN0ZXJpbmcgIT0gbnVsbCkKLSAgICAgICAgICAgIGFkZEluZGV4QmxvY2soKTsKLQotICAgICAgICAvLyBJZiB3ZSBzZXJpYWxpemUgdGhlIEluZGV4SW5mbyBvYmplY3RzIGRpcmVjdGx5IGluIHRoZSBjb2RlIGFib3ZlIGludG8gJ2J1ZmZlcicsCi0gICAgICAgIC8vIHdlIGhhdmUgdG8gd3JpdGUgdGhlIG9mZnN0cyB0byB0aGVzZSBoZXJlLiBUaGUgb2Zmc2V0cyBoYXZlIGFscmVhZHkgYmVlbiBhcmUgY29sbGVjdGVkCi0gICAgICAgIC8vIGluIGluZGV4T2Zmc2V0c1tdLiBidWZmZXIgaXMgIT0gbnVsbCwgaWYgaXQgZXhjZWVkcyBDb25maWcuY29sdW1uX2luZGV4X2NhY2hlX3NpemUuCi0gICAgICAgIC8vIEluIHRoZSBvdGhlciBjYXNlLCB3aGVuIGJ1ZmZlcj09bnVsbCwgdGhlIG9mZnNldHMgYXJlIHNlcmlhbGl6ZWQgaW4gUm93SW5kZXhFbnRyeS5JbmRleGVkRW50cnkuc2VyaWFsaXplKCkuCi0gICAgICAgIGlmIChidWZmZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIFJvd0luZGV4RW50cnkuU2VyaWFsaXplci5zZXJpYWxpemVPZmZzZXRzKGJ1ZmZlciwgaW5kZXhPZmZzZXRzLCBjb2x1bW5JbmRleENvdW50KTsKLQotICAgICAgICAvLyB3ZSBzaG91bGQgYWx3YXlzIGhhdmUgYXQgbGVhc3Qgb25lIGNvbXB1dGVkIGluZGV4IGJsb2NrLCBidXQgd2Ugb25seSB3cml0ZSBpdCBvdXQgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIHRoYXQuCi0gICAgICAgIGFzc2VydCBjb2x1bW5JbmRleENvdW50ID4gMCAmJiBoZWFkZXJMZW5ndGggPj0gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGluZGV4SW5mb1NlcmlhbGl6ZWRTaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBidWZmZXIgIT0gbnVsbAotICAgICAgICAgICAgICAgPyBidWZmZXIuYnVmZmVyKCkubGltaXQoKQotICAgICAgICAgICAgICAgOiBpbmRleFNhbXBsZXNTZXJpYWxpemVkU2l6ZSArIGNvbHVtbkluZGV4Q291bnQgKiBUeXBlU2l6ZXMuc2l6ZW9mKDApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NvbHVtbnMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NvbHVtbnMuamF2YQppbmRleCA4ODE4NWFiLi4yNzVkMDAwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Db2x1bW5zLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ29sdW1ucy5qYXZhCkBAIC0xOCwxNyArMTgsMTUgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGI7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLio7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhdG9yczsKIAogaW1wb3J0IG5ldC5uaWNvdWxhai5jb21waWxlY29tbWFuZC5hbm5vdGF0aW9ucy5Eb250SW5saW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNvbHVtbklkZW50aWZpZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5TZXRUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CkBAIC0zNiwxMiArMzQsMTQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvdzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT2JqZWN0U2l6ZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2VhcmNoSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnRyZWUuQlRyZWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnRyZWUuQlRyZWVTZWFyY2hJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5idHJlZS5CVHJlZVJlbW92YWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnRyZWUuQlRyZWVTZWFyY2hJdGVyYXRvcjsKIAogLyoqCiAgKiBBbiBpbW11dGFibGUgYW5kIHNvcnRlZCBsaXN0IG9mIChub24tUEspIGNvbHVtbnMgZm9yIGEgZ2l2ZW4gdGFibGUuCkBAIC02MSw3ICs2MSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5JZGVudGlmaWVyLmdldEludGVybmVkKEJ5dGVCdWZmZXJVdGlsLkVNUFRZX0JZVEVfQlVGRkVSLCBVVEY4VHlwZS5pbnN0YW5jZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRUeXBlLmdldEluc3RhbmNlKFVURjhUeXBlLmluc3RhbmNlLCB0cnVlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbk1ldGFkYXRhLk5PX1BPU0lUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEuS2luZC5TVEFUSUMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEuS2luZC5TVEFUSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uTWV0YWRhdGEgRklSU1RfQ09NUExFWF9SRUdVTEFSID0KICAgICAgICAgbmV3IENvbHVtbk1ldGFkYXRhKCIiLApAQCAtNjksNyArNzAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uSWRlbnRpZmllci5nZXRJbnRlcm5lZChCeXRlQnVmZmVyVXRpbC5FTVBUWV9CWVRFX0JVRkZFUiwgVVRGOFR5cGUuaW5zdGFuY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0VHlwZS5nZXRJbnN0YW5jZShVVEY4VHlwZS5pbnN0YW5jZSwgdHJ1ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5NZXRhZGF0YS5OT19QT1NJVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbk1ldGFkYXRhLktpbmQuUkVHVUxBUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5NZXRhZGF0YS5LaW5kLlJFR1VMQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKIAogICAgIHByaXZhdGUgZmluYWwgT2JqZWN0W10gY29sdW1uczsKICAgICBwcml2YXRlIGZpbmFsIGludCBjb21wbGV4SWR4OyAvLyBJbmRleCBvZiB0aGUgZmlyc3QgY29tcGxleCBjb2x1bW4KQEAgLTQzNiw3ICs0MzgsNyBAQAogICAgICAgICBpZih0aGlzID09IE5PTkUpCiAgICAgICAgICAgICByZXR1cm4gMDsKIAotICAgICAgICByZXR1cm4gRU1QVFlfU0laRTsKKyAgICAgICAgcmV0dXJuIEVNUFRZX1NJWkUgKyBCVHJlZS5zaXplT2ZTdHJ1Y3R1cmVPbkhlYXAoY29sdW1ucyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC00NTYsNyArNDU4LDcgQEAKICAgICB7CiAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShDb2x1bW5zIGNvbHVtbnMsIERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKLSAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChjb2x1bW5zLnNpemUoKSk7CisgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihjb2x1bW5zLnNpemUoKSk7CiAgICAgICAgICAgICBmb3IgKENvbHVtbk1ldGFkYXRhIGNvbHVtbiA6IGNvbHVtbnMpCiAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVXaXRoVkludExlbmd0aChjb2x1bW4ubmFtZS5ieXRlcywgb3V0KTsKICAgICAgICAgfQpAQCAtNDcxLDcgKzQ3Myw3IEBACiAKICAgICAgICAgcHVibGljIENvbHVtbnMgZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbiwgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSAoaW50KWluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKICAgICAgICAgICAgIHRyeSAoQlRyZWUuRmFzdEJ1aWxkZXI8Q29sdW1uTWV0YWRhdGE+IGJ1aWxkZXIgPSBCVHJlZS5mYXN0QnVpbGRlcigpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCkBAIC01MTYsNyArNTE4LDcgQEAKICAgICAgICAgICAgIGludCBzdXBlcnNldENvdW50ID0gc3VwZXJzZXQuc2l6ZSgpOwogICAgICAgICAgICAgaWYgKGNvbHVtbkNvdW50ID09IHN1cGVyc2V0Q291bnQpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KDApOworICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKDApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSBpZiAoc3VwZXJzZXRDb3VudCA8IDY0KQogICAgICAgICAgICAgewpAQCAtNjA5LDcgKzYxMSw3IEBACiAgICAgICAgIHByaXZhdGUgdm9pZCBzZXJpYWxpemVMYXJnZVN1YnNldChDb2xsZWN0aW9uPENvbHVtbk1ldGFkYXRhPiBjb2x1bW5zLCBpbnQgY29sdW1uQ291bnQsIENvbHVtbnMgc3VwZXJzZXQsIGludCBzdXBlcnNldENvdW50LCBEYXRhT3V0cHV0UGx1cyBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICAvLyB3cml0ZSBmbGFnIGluZGljYXRpbmcgd2UncmUgaW4gbGVuZ3RoeSBtb2RlCi0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoc3VwZXJzZXRDb3VudCAtIGNvbHVtbkNvdW50KTsKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKHN1cGVyc2V0Q291bnQgLSBjb2x1bW5Db3VudCk7CiAgICAgICAgICAgICBCVHJlZVNlYXJjaEl0ZXJhdG9yPENvbHVtbk1ldGFkYXRhLCBDb2x1bW5NZXRhZGF0YT4gaXRlciA9IHN1cGVyc2V0Lml0ZXJhdG9yKCk7CiAgICAgICAgICAgICBpZiAoY29sdW1uQ291bnQgPCBzdXBlcnNldENvdW50IC8gMikKICAgICAgICAgICAgIHsKQEAgLTYxOCw3ICs2MjAsNyBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZXIubmV4dChjb2x1bW4pID09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChpdGVyLmluZGV4T2ZDdXJyZW50KCkpOworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihpdGVyLmluZGV4T2ZDdXJyZW50KCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKQEAgLTYzMSwxMCArNjMzLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgIGludCBjdXIgPSBpdGVyLmluZGV4T2ZDdXJyZW50KCk7CiAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgrK3ByZXYgIT0gY3VyKQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHByZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIocHJldik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHdoaWxlICgrK3ByZXYgIT0gc3VwZXJzZXRDb3VudCkKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHByZXYpOworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihwcmV2KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC02NTAsNyArNjUyLDcgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGNvbHVtbkNvdW50IDsgaSsrKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGQoQlRyZWUuZmluZEJ5SW5kZXgoc3VwZXJzZXQuY29sdW1ucywgaWR4KSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC02NjEsNyArNjYzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaW50IHNraXBwZWQgPSAwOwogICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5leHRNaXNzaW5nSW5kZXggPSBza2lwcGVkIDwgZGVsdGEgPyAoaW50KWluLnJlYWRVbnNpZ25lZFZJbnQoKSA6IHN1cGVyc2V0Q291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV4dE1pc3NpbmdJbmRleCA9IHNraXBwZWQgPCBkZWx0YSA/IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpIDogc3VwZXJzZXRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpZHggPCBuZXh0TWlzc2luZ0luZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbk1ldGFkYXRhIGRlZiA9IGl0ZXIubmV4dCgpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvRGF0YVJhbmdlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9EYXRhUmFuZ2UuamF2YQppbmRleCA1MjE2MmJlLi45OTEyYWM1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9EYXRhUmFuZ2UuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9EYXRhUmFuZ2UuamF2YQpAQCAtMjcsNiArMjcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOwogCiAvKioKICAqIEdyb3VwcyBib3RoIHRoZSByYW5nZSBvZiBwYXJ0aXRpb25zIHRvIHF1ZXJ5LCBhbmQgdGhlIGNsdXN0ZXJpbmcgaW5kZXggZmlsdGVyIHRvCkBAIC0xMzksNiArMTQwLDM0IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogVGhlIHN0YXJ0IG9mIHRoZSBwYXJ0aXRpb24ga2V5IHJhbmdlIHF1ZXJpZWQgYnkgdGhpcyB7QGNvZGUgRGF0YVJhbmdlfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHN0YXJ0IG9mIHRoZSBwYXJ0aXRpb24ga2V5IHJhbmdlIGV4cHJlc3NlZCBhcyBhIEJ5dGVDb21wYXJhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBCeXRlQ29tcGFyYWJsZSBzdGFydEFzQnl0ZUNvbXBhcmFibGUoKQorICAgIHsKKyAgICAgICAgUGFydGl0aW9uUG9zaXRpb24gYm91bmQgPSBrZXlSYW5nZS5sZWZ0OworICAgICAgICBpZiAoYm91bmQuaXNNaW5pbXVtKCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICByZXR1cm4gYm91bmQuYXNDb21wYXJhYmxlQm91bmQoa2V5UmFuZ2UuaW5jbHVzaXZlTGVmdCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZW5kIG9mIHRoZSBwYXJ0aXRpb24ga2V5IHJhbmdlIHF1ZXJpZWQgYnkgdGhpcyB7QGNvZGUgRGF0YVJhbmdlfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGVuZCBvZiB0aGUgcGFydGl0aW9uIGtleSByYW5nZSBleHByZXNzZWQgYXMgYSBCeXRlQ29tcGFyYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnl0ZUNvbXBhcmFibGUgc3RvcEFzQnl0ZUNvbXBhcmFibGUoKQorICAgIHsKKyAgICAgICAgUGFydGl0aW9uUG9zaXRpb24gYm91bmQgPSBrZXlSYW5nZS5yaWdodDsKKyAgICAgICAgaWYgKGJvdW5kLmlzTWluaW11bSgpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgcmV0dXJuIGJvdW5kLmFzQ29tcGFyYWJsZUJvdW5kKCFrZXlSYW5nZS5pbmNsdXNpdmVSaWdodCgpKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBXaGV0aGVyIHRoZSB1bmRlcmx5aW5nIGNsdXN0ZXJpbmcgaW5kZXggZmlsdGVyIGlzIGEgbmFtZXMgZmlsdGVyIG9yIG5vdC4KICAgICAgKgogICAgICAqIEByZXR1cm4gV2hldGhlciB0aGUgdW5kZXJseWluZyBjbHVzdGVyaW5nIGluZGV4IGZpbHRlciBpcyBhIG5hbWVzIGZpbHRlciBvciBub3QuCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9EZWNvcmF0ZWRLZXkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0RlY29yYXRlZEtleS5qYXZhCmluZGV4IDRkZDg3ZDAuLjAzZDYzNzQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0RlY29yYXRlZEtleS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0RlY29yYXRlZEtleS5qYXZhCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlN0cmluZ0pvaW5lcjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlGdW5jdGlvbjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQ29tcG9zaXRlVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyOwpAQCAtMjksOCArMzAsMTIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTXVybXVySGFzaDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5JRmlsdGVyLkZpbHRlcktleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5NdXJtdXJIYXNoOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZUludmVyc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5LkhlYXBDbG9uZXI7CiAKIC8qKgogICogUmVwcmVzZW50cyBhIGRlY29yYXRlZCBrZXksIGhhbmR5IGZvciBjZXJ0YWluIG9wZXJhdGlvbnMKQEAgLTQzLDEzICs0OCw3IEBACiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZWNvcmF0ZWRLZXkgaW1wbGVtZW50cyBQYXJ0aXRpb25Qb3NpdGlvbiwgRmlsdGVyS2V5CiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPERlY29yYXRlZEtleT4gY29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yPERlY29yYXRlZEtleT4oKQotICAgIHsKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKERlY29yYXRlZEtleSBvMSwgRGVjb3JhdGVkS2V5IG8yKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbzEuY29tcGFyZVRvKG8yKTsKLSAgICAgICAgfQotICAgIH07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPERlY29yYXRlZEtleT4gY29tcGFyYXRvciA9IERlY29yYXRlZEtleTo6Y29tcGFyZVRvOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBUb2tlbiB0b2tlbjsKIApAQCAtMTAyLDYgKzEwMSwzNyBAQAogICAgICAgICByZXR1cm4gY21wID09IDAgPyBCeXRlQnVmZmVyVXRpbC5jb21wYXJlVW5zaWduZWQoa2V5LCBvdGhlcktleS5nZXRLZXkoKSkgOiBjbXA7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgLy8gTm90ZTogSW4gdGhlIGxlZ2FjeSB2ZXJzaW9uIG9uZSBlbmNvZGluZyBjb3VsZCBiZSBhIHByZWZpeCBvZiBhbm90aGVyIGFzIHRoZSBlc2NhcGluZyBpcyBvbmx5IHdlYWtseQorICAgICAgICAvLyBwcmVmaXgtZnJlZSAoc2VlIEJ5dGVTb3VyY2VUZXN0LnRlc3REZWNvcmF0ZWRLZXlQcmVmaXhlcygpKS4KKyAgICAgICAgLy8gVGhlIE9TUzUwIHZlcnNpb24gYXZvaWRzIHRoaXMgYnkgYWRkaW5nIGEgdGVybWluYXRvci4KKyAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3JNYXliZUxlZ2FjeSh2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlDb21wYXJhYmxlQnl0ZXModmVyc2lvbikpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQ29tcGFyYWJsZSBhc0NvbXBhcmFibGVCb3VuZChib29sZWFuIGJlZm9yZSkKKyAgICB7CisgICAgICAgIHJldHVybiB2ZXJzaW9uIC0+CisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCAodmVyc2lvbiAhPSBWZXJzaW9uLkxFR0FDWSkgOiAiRGVjb3JhdGVkIGtleSBib3VuZHMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGxlZ2FjeSBlbmNvZGluZy4iOworCisgICAgICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvcigKKyAgICAgICAgICAgICAgICAgICAgYmVmb3JlID8gQnl0ZVNvdXJjZS5MVF9ORVhUX0NPTVBPTkVOVCA6IEJ5dGVTb3VyY2UuR1RfTkVYVF9DT01QT05FTlQsCisgICAgICAgICAgICAgICAgICAgIHRva2VuLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pLAorICAgICAgICAgICAgICAgICAgICBrZXlDb21wYXJhYmxlQnl0ZXModmVyc2lvbikpOworICAgICAgICB9OworICAgIH0KKworICAgIHByb3RlY3RlZCBCeXRlU291cmNlIGtleUNvbXBhcmFibGVCeXRlcyhWZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZS5vZihnZXRLZXkoKSwgdmVyc2lvbik7CisgICAgfQorCiAgICAgcHVibGljIElQYXJ0aXRpb25lciBnZXRQYXJ0aXRpb25lcigpCiAgICAgewogICAgICAgICByZXR1cm4gZ2V0VG9rZW4oKS5nZXRQYXJ0aXRpb25lcigpOwpAQCAtMTYzLDEwICsxOTMsNTcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgYWJzdHJhY3QgQnl0ZUJ1ZmZlciBnZXRLZXkoKTsKKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEtleUxlbmd0aCgpOworCisgICAgLyoqCisgICAgICogSWYgdGhpcyBrZXkgb2NjdXBpZXMgb25seSBwYXJ0IG9mIGEgbGFyZ2VyIGJ1ZmZlciwgYWxsb2NhdGUgYSBuZXcgYnVmZmVyIHRoYXQgaXMgb25seSBhcyBsYXJnZSBhcyBuZWNlc3NhcnkuCisgICAgICogT3RoZXJ3aXNlLCBpdCByZXR1cm5zIHRoaXMga2V5LgorICAgICAqLworICAgIHB1YmxpYyBEZWNvcmF0ZWRLZXkgcmV0YWluYWJsZSgpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuY2FuTWluaW1pemUoZ2V0S2V5KCkpCisgICAgICAgICAgICAgICA/IG5ldyBCdWZmZXJEZWNvcmF0ZWRLZXkoZ2V0VG9rZW4oKSwgSGVhcENsb25lci5pbnN0YW5jZS5jbG9uZShnZXRLZXkoKSkpCisgICAgICAgICAgICAgICA6IHRoaXM7CisgICAgfQogCiAgICAgcHVibGljIHZvaWQgZmlsdGVySGFzaChsb25nW10gZGVzdCkKICAgICB7CiAgICAgICAgIEJ5dGVCdWZmZXIga2V5ID0gZ2V0S2V5KCk7CiAgICAgICAgIE11cm11ckhhc2guaGFzaDNfeDY0XzEyOChrZXksIGtleS5wb3NpdGlvbigpLCBrZXkucmVtYWluaW5nKCksIDAsIGRlc3QpOwogICAgIH0KLX0KKworICAgIC8qKgorICAgICAqIEEgdGVtcGxhdGUgZmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGRlY29yYXRlZCBrZXlzIGZyb20gdGhlaXIgYnl0ZS1jb21wYXJhYmxlIHJlcHJlc2VudGF0aW9uLgorICAgICAqLworICAgIHN0YXRpYyA8VCBleHRlbmRzIERlY29yYXRlZEtleT4gVCBmcm9tQnl0ZUNvbXBhcmFibGUoQnl0ZUNvbXBhcmFibGUgYnl0ZUNvbXBhcmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaUZ1bmN0aW9uPFRva2VuLCBieXRlW10sIFQ+IGRlY29yYXRlZEtleUZhY3RvcnkpCisgICAgeworICAgICAgICBCeXRlU291cmNlLlBlZWthYmxlIHBlZWthYmxlID0gQnl0ZVNvdXJjZS5wZWVrYWJsZShieXRlQ29tcGFyYWJsZS5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSk7CisgICAgICAgIC8vIERlY29kZSB0aGUgdG9rZW4gZnJvbSB0aGUgZmlyc3QgY29tcG9uZW50IG9mIHRoZSBtdWx0aS1jb21wb25lbnQgc2VxdWVuY2UgcmVwcmVzZW50aW5nIHRoZSB3aG9sZSBkZWNvcmF0ZWQga2V5LgorICAgICAgICBUb2tlbiB0b2tlbiA9IHBhcnRpdGlvbmVyLmdldFRva2VuRmFjdG9yeSgpLmZyb21Db21wYXJhYmxlQnl0ZXMoQnl0ZVNvdXJjZUludmVyc2UubmV4dENvbXBvbmVudFNvdXJjZShwZWVrYWJsZSksIHZlcnNpb24pOworICAgICAgICAvLyBEZWNvZGUgdGhlIGtleSBieXRlcyBmcm9tIHRoZSBzZWNvbmQgY29tcG9uZW50LgorICAgICAgICBieXRlW10ga2V5Qnl0ZXMgPSBCeXRlU291cmNlSW52ZXJzZS5nZXRVbmVzY2FwZWRCeXRlcyhCeXRlU291cmNlSW52ZXJzZS5uZXh0Q29tcG9uZW50U291cmNlKHBlZWthYmxlKSk7CisgICAgICAgIC8vIENvbnN1bWUgdGhlIHRlcm1pbmF0b3IgYnl0ZS4KKyAgICAgICAgaW50IHRlcm1pbmF0b3IgPSBwZWVrYWJsZS5uZXh0KCk7CisgICAgICAgIGFzc2VydCB0ZXJtaW5hdG9yID09IEJ5dGVTb3VyY2UuVEVSTUlOQVRPUiA6ICJEZWNvcmF0ZWQga2V5IGVuY29kaW5nIG11c3QgZW5kIGluIHRlcm1pbmF0b3IuIjsKKyAgICAgICAgLy8gSW5zdGFudGlhdGUgYSBkZWNvcmF0ZWQga2V5IGZyb20gdGhlIGRlY29kZWQgdG9rZW4gYW5kIGtleSBieXRlcywgdXNpbmcgdGhlIHByb3ZpZGVkIGZhY3RvcnkgbWV0aG9kLgorICAgICAgICByZXR1cm4gZGVjb3JhdGVkS2V5RmFjdG9yeS5hcHBseSh0b2tlbiwga2V5Qnl0ZXMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGtleUZyb21CeXRlU291cmNlKEJ5dGVTb3VyY2UuUGVla2FibGUgcGVla2FibGVCeXRlU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIpCisgICAgeworICAgICAgICBhc3NlcnQgdmVyc2lvbiAhPSBWZXJzaW9uLkxFR0FDWTsgICAvLyByZXZlcnNlIHRyYW5zbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIExFR0FDWSB2ZXJzaW9uLgorICAgICAgICAvLyBEZWNvZGUgdGhlIHRva2VuIGZyb20gdGhlIGZpcnN0IGNvbXBvbmVudCBvZiB0aGUgbXVsdGktY29tcG9uZW50IHNlcXVlbmNlIHJlcHJlc2VudGluZyB0aGUgd2hvbGUgZGVjb3JhdGVkIGtleS4KKyAgICAgICAgLy8gV2Ugd29uJ3QgdXNlIGl0LCBidXQgdGhlIGRlY29kaW5nIGFsc28gcG9zaXRpb25zIHRoZSBieXRlIHNvdXJjZSBhZnRlciBpdC4KKyAgICAgICAgcGFydGl0aW9uZXIuZ2V0VG9rZW5GYWN0b3J5KCkuZnJvbUNvbXBhcmFibGVCeXRlcyhCeXRlU291cmNlSW52ZXJzZS5uZXh0Q29tcG9uZW50U291cmNlKHBlZWthYmxlQnl0ZVNvdXJjZSksIHZlcnNpb24pOworICAgICAgICAvLyBEZWNvZGUgdGhlIGtleSBieXRlcyBmcm9tIHRoZSBzZWNvbmQgY29tcG9uZW50LgorICAgICAgICBieXRlW10ga2V5Qnl0ZXMgPSBCeXRlU291cmNlSW52ZXJzZS5nZXRVbmVzY2FwZWRCeXRlcyhCeXRlU291cmNlSW52ZXJzZS5uZXh0Q29tcG9uZW50U291cmNlKHBlZWthYmxlQnl0ZVNvdXJjZSkpOworICAgICAgICBpbnQgdGVybWluYXRvciA9IHBlZWthYmxlQnl0ZVNvdXJjZS5uZXh0KCk7CisgICAgICAgIGFzc2VydCB0ZXJtaW5hdG9yID09IEJ5dGVTb3VyY2UuVEVSTUlOQVRPUiA6ICJEZWNvcmF0ZWQga2V5IGVuY29kaW5nIG11c3QgZW5kIGluIHRlcm1pbmF0b3IuIjsKKyAgICAgICAgcmV0dXJuIGtleUJ5dGVzOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9EZWxldGlvblRpbWUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0RlbGV0aW9uVGltZS5qYXZhCmluZGV4IDEwNWUxMGQuLmU2MDgwZjYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0RlbGV0aW9uVGltZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0RlbGV0aW9uVGltZS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOwogCkBAIC0xODAsNiArMTgxLDE1IEBACiAgICAgICAgICAgICAgICAgIDogbmV3IERlbGV0aW9uVGltZShtZmRhLCBsZHQpOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIERlbGV0aW9uVGltZSBkZXNlcmlhbGl6ZShCeXRlQnVmZmVyIGJ1ZiwgaW50IG9mZnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGxkdCA9IGJ1Zi5nZXRJbnQob2Zmc2V0KTsKKyAgICAgICAgICAgIGxvbmcgbWZkYSA9IGJ1Zi5nZXRMb25nKG9mZnNldCArIDQpOworICAgICAgICAgICAgcmV0dXJuIG1mZGEgPT0gTG9uZy5NSU5fVkFMVUUgJiYgbGR0ID09IEludGVnZXIuTUFYX1ZBTFVFCisgICAgICAgICAgICAgICAgICAgPyBMSVZFCisgICAgICAgICAgICAgICAgICAgOiBuZXcgRGVsZXRpb25UaW1lKG1mZGEsIGxkdCk7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgdm9pZCBza2lwKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICBpbi5za2lwQnl0ZXNGdWxseSg0ICsgOCk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9EaXJlY3Rvcmllcy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvRGlyZWN0b3JpZXMuamF2YQppbmRleCBiMTZkZDk3Li40ZTczNDdhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9EaXJlY3Rvcmllcy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0RpcmVjdG9yaWVzLmphdmEKQEAgLTE3LDQzICsxNyw2MCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiOwogCi1pbXBvcnQgamF2YS50aW1lLkluc3RhbnQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkTG9jYWxSYW5kb207Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpUHJlZGljYXRlOwotaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKLWltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKLQogaW1wb3J0IGphdmEuaW8uSU9FcnJvcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVN0b3JlOwogaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEudGltZS5JbnN0YW50OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU3BsaXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkTG9jYWxSYW5kb207CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpUHJlZGljYXRlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtU3VwcG9ydDsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuUmF0ZUxpbWl0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU0Rpc2tGdWxsV3JpdGVFcnJvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU0Vycm9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTTm9EaXNrQXZhaWxhYmxlRm9yV3JpdGVFcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU1JlYWRFcnJvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU1dyaXRlRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVJZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVJZEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVN0b3JlVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5QYXRoVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnNuYXBzaG90LlNuYXBzaG90TWFuaWZlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5zbmFwc2hvdC5UYWJsZVNuYXBzaG90OwpAQCAtMjcyLDcgKzI4OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gU1NUYWJsZS50cnlEZXNjcmlwdG9yRnJvbUZpbGVuYW1lKGZpbGUpOworICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBTU1RhYmxlLnRyeURlc2NyaXB0b3JGcm9tRmlsZShmaWxlKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2MgIT0gbnVsbCAmJiBkZXNjLmtzbmFtZS5lcXVhbHMobWV0YWRhdGEua2V5c3BhY2UpICYmIGRlc2MuY2ZuYW1lLmVxdWFscyhtZXRhZGF0YS5uYW1lKTsKICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICBmb3IgKEZpbGUgaW5kZXhGaWxlIDogaW5kZXhGaWxlcykKQEAgLTMxOSw3ICszMzYsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsIGZpbGVuYW1lKTsKICAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKQotICAgICAgICAgICAgICAgIHJldHVybiBEZXNjcmlwdG9yLmZyb21GaWxlbmFtZShmaWxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRGVzY3JpcHRvci5mcm9tRmlsZVdpdGhDb21wb25lbnQoZmlsZSwgZmFsc2UpLmxlZnQ7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtNDg4LDQ4ICs1MDUsMTA2IEBACiAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoY2FuZGlkYXRlcyk7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQXZhaWxhYmxlRGlza1NwYWNlKGxvbmcgZXN0aW1hdGVkU1NUYWJsZXMsIGxvbmcgZXhwZWN0ZWRUb3RhbFdyaXRlU2l6ZSkKKyAgICAvKioKKyAgICAgKiBTdW1zIHVwIHRoZSBzcGFjZSByZXF1aXJlZCBmb3Igb25nb2luZyBzdHJlYW1zICsgY29tcGFjdGlvbnMgKyBleHBlY3RlZCBuZXcgd3JpdGUgc2l6ZSBwZXIgRmlsZVN0b3JlIGFuZCBjaGVja3MKKyAgICAgKiBpZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIGV4cGVjdGVkTmV3V3JpdGVTaXplcyB3aGVyZSB3ZSBleHBlY3QgdG8gd3JpdGUgdGhlIG5ldyBjb21wYWN0aW9ucworICAgICAqIEBwYXJhbSB0b3RhbENvbXBhY3Rpb25Xcml0ZVJlbWFpbmluZyBhcHByb3hpbWF0ZSBhbW91bnQgb2YgZGF0YSBjdXJyZW50IGNvbXBhY3Rpb25zIGFyZSB3cml0aW5nIC0ga2V5ZWQgYnkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpbGUgc3RvcmUgdGhleSBhcmUgd3JpdGluZyB0byAob3IsIHJlYWRpbmcgZnJvbSBhY3R1YWxseSwgYnV0IHNpbmNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBU1NBTkRSQS02Njk2IHdlIGV4cGVjdCBjb21wYWN0aW9ucyB0byByZWFkIGFuZCB3cml0dGVuIGZyb20gdGhlIHNhbWUgZGlyKQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB3ZSBleHBlY3QgdG8gYmUgYWJsZSB0byB3cml0ZSBleHBlY3RlZE5ld1dyaXRlU2l6ZXMgdG8gdGhlIGF2YWlsYWJsZSBmaWxlIHN0b3JlcworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0Rpc2tTcGFjZUZvckNvbXBhY3Rpb25zQW5kU3RyZWFtcyhNYXA8RmlsZSwgTG9uZz4gZXhwZWN0ZWROZXdXcml0ZVNpemVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8RmlsZSwgTG9uZz4gdG90YWxDb21wYWN0aW9uV3JpdGVSZW1haW5pbmcpCiAgICAgewotICAgICAgICBsb25nIHdyaXRlU2l6ZSA9IGV4cGVjdGVkVG90YWxXcml0ZVNpemUgLyBlc3RpbWF0ZWRTU1RhYmxlczsKLSAgICAgICAgbG9uZyB0b3RhbEF2YWlsYWJsZSA9IDBMOworICAgICAgICByZXR1cm4gaGFzRGlza1NwYWNlRm9yQ29tcGFjdGlvbnNBbmRTdHJlYW1zKGV4cGVjdGVkTmV3V3JpdGVTaXplcywgdG90YWxDb21wYWN0aW9uV3JpdGVSZW1haW5pbmcsIERpcmVjdG9yaWVzOjpnZXRGaWxlU3RvcmUpOworICAgIH0KIAotICAgICAgICBmb3IgKERhdGFEaXJlY3RvcnkgZGF0YURpciA6IHBhdGhzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoRGlzYWxsb3dlZERpcmVjdG9yaWVzLmlzVW53cml0YWJsZShnZXRMb2NhdGlvbkZvckRpc2soZGF0YURpcikpKQotICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBEYXRhRGlyZWN0b3J5Q2FuZGlkYXRlIGNhbmRpZGF0ZSA9IG5ldyBEYXRhRGlyZWN0b3J5Q2FuZGlkYXRlKGRhdGFEaXIpOwotICAgICAgICAgICAgLy8gZXhjbHVkZSBkaXJlY3RvcnkgaWYgaXRzIHRvdGFsIHdyaXRlU2l6ZSBkb2VzIG5vdCBmaXQgdG8gZGF0YSBkaXJlY3RvcnkKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiRGF0YURpcmVjdG9yeSB7fSBoYXMge30gYnl0ZXMgYXZhaWxhYmxlLCBjaGVja2luZyBpZiB3ZSBjYW4gd3JpdGUge30gYnl0ZXMiLCBkYXRhRGlyLmxvY2F0aW9uLCBjYW5kaWRhdGUuYXZhaWxhYmxlU3BhY2UsIHdyaXRlU2l6ZSk7Ci0gICAgICAgICAgICBpZiAoY2FuZGlkYXRlLmF2YWlsYWJsZVNwYWNlIDwgd3JpdGVTaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJEYXRhRGlyZWN0b3J5IHt9IGNhbid0IGJlIHVzZWQgZm9yIGNvbXBhY3Rpb24uIE9ubHkge30gaXMgYXZhaWxhYmxlLCBidXQge30gaXMgdGhlIG1pbmltdW0gd3JpdGUgc2l6ZS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZS5kYXRhRGlyZWN0b3J5LmxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5zdHJpbmdpZnlGaWxlU2l6ZShjYW5kaWRhdGUuYXZhaWxhYmxlU3BhY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5zdHJpbmdpZnlGaWxlU2l6ZSh3cml0ZVNpemUpKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRvdGFsQXZhaWxhYmxlICs9IGNhbmRpZGF0ZS5hdmFpbGFibGVTcGFjZTsKLSAgICAgICAgfQorICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNEaXNrU3BhY2VGb3JDb21wYWN0aW9uc0FuZFN0cmVhbXMoTWFwPEZpbGUsIExvbmc+IGV4cGVjdGVkTmV3V3JpdGVTaXplcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxGaWxlLCBMb25nPiB0b3RhbENvbXBhY3Rpb25Xcml0ZVJlbWFpbmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uPEZpbGUsIEZpbGVTdG9yZT4gZmlsZXN0b3JlTWFwcGVyKQorICAgIHsKKyAgICAgICAgTWFwPEZpbGVTdG9yZSwgTG9uZz4gbmV3V3JpdGVTaXplc1BlckZpbGVTdG9yZSA9IHBlckZpbGVTdG9yZShleHBlY3RlZE5ld1dyaXRlU2l6ZXMsIGZpbGVzdG9yZU1hcHBlcik7CisgICAgICAgIE1hcDxGaWxlU3RvcmUsIExvbmc+IGNvbXBhY3Rpb25zUmVtYWluaW5nUGVyRmlsZVN0b3JlID0gcGVyRmlsZVN0b3JlKHRvdGFsQ29tcGFjdGlvbldyaXRlUmVtYWluaW5nLCBmaWxlc3RvcmVNYXBwZXIpOwogCi0gICAgICAgIGlmICh0b3RhbEF2YWlsYWJsZSA8PSBleHBlY3RlZFRvdGFsV3JpdGVTaXplKQorICAgICAgICBNYXA8RmlsZVN0b3JlLCBMb25nPiB0b3RhbFBlckZpbGVTdG9yZSA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8RmlsZVN0b3JlLCBMb25nPiBlbnRyeSA6IG5ld1dyaXRlU2l6ZXNQZXJGaWxlU3RvcmUuZW50cnlTZXQoKSkKICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nSm9pbmVyIHBhdGhTdHJpbmcgPSBuZXcgU3RyaW5nSm9pbmVyKCIsIiwgIlsiLCAiXSIpOwotICAgICAgICAgICAgZm9yIChEYXRhRGlyZWN0b3J5IHA6IHBhdGhzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBhdGhTdHJpbmcuYWRkKHAubG9jYXRpb24udG9KYXZhSU9GaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9nZ2VyLndhcm4oIkluc3VmZmljaWVudCBkaXNrIHNwYWNlIGZvciBjb21wYWN0aW9uLiBBY3Jvc3Mge30gdGhlcmUncyBvbmx5IHt9IGF2YWlsYWJsZSwgYnV0IHt9IGlzIG5lZWRlZC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFN0cmluZy50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLnN0cmluZ2lmeUZpbGVTaXplKHRvdGFsQXZhaWxhYmxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5zdHJpbmdpZnlGaWxlU2l6ZShleHBlY3RlZFRvdGFsV3JpdGVTaXplKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBsb25nIGFkZGVkRm9yRmlsZXN0b3JlID0gZW50cnkuZ2V0VmFsdWUoKSArIGNvbXBhY3Rpb25zUmVtYWluaW5nUGVyRmlsZVN0b3JlLmdldE9yRGVmYXVsdChlbnRyeS5nZXRLZXkoKSwgMEwpOworICAgICAgICAgICAgdG90YWxQZXJGaWxlU3RvcmUubWVyZ2UoZW50cnkuZ2V0S2V5KCksIGFkZGVkRm9yRmlsZXN0b3JlLCBMb25nOjpzdW0pOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gaGFzRGlza1NwYWNlRm9yQ29tcGFjdGlvbnNBbmRTdHJlYW1zKHRvdGFsUGVyRmlsZVN0b3JlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIG9uIGFsbCBmaWxlIHN0b3JlcyB0byB3cml0ZSB0aGUgZ2l2ZW4gYW1vdW50IG9mIGRhdGEuCisgICAgICogVGhlIGRhdGEgdG8gd3JpdGUgc2hvdWxkIGJlIHRoZSB0b3RhbCBhbW91bnQsIG9uZ29pbmcgd3JpdGVzICsgbmV3IHdyaXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzRGlza1NwYWNlRm9yQ29tcGFjdGlvbnNBbmRTdHJlYW1zKE1hcDxGaWxlU3RvcmUsIExvbmc+IHRvdGFsVG9Xcml0ZSkKKyAgICB7CisgICAgICAgIGJvb2xlYW4gaGFzU3BhY2UgPSB0cnVlOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxGaWxlU3RvcmUsIExvbmc+IHRvV3JpdGUgOiB0b3RhbFRvV3JpdGUuZW50cnlTZXQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBhdmFpbGFibGVGb3JDb21wYWN0aW9uID0gZ2V0QXZhaWxhYmxlU3BhY2VGb3JDb21wYWN0aW9ucyh0b1dyaXRlLmdldEtleSgpKTsKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiRmlsZVN0b3JlIHt9IGhhcyB7fSBieXRlcyBhdmFpbGFibGUsIGNoZWNraW5nIGlmIHdlIGNhbiB3cml0ZSB7fSBieXRlcyIsIHRvV3JpdGUuZ2V0S2V5KCksIGF2YWlsYWJsZUZvckNvbXBhY3Rpb24sIHRvV3JpdGUuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICBpZiAoYXZhaWxhYmxlRm9yQ29tcGFjdGlvbiA8IHRvV3JpdGUuZ2V0VmFsdWUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiRmlsZVN0b3JlIHt9IGhhcyBvbmx5IHt9IGF2YWlsYWJsZSwgYnV0IHt9IGlzIG5lZWRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Xcml0ZS5nZXRLZXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuc3RyaW5naWZ5RmlsZVNpemUoYXZhaWxhYmxlRm9yQ29tcGFjdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLnN0cmluZ2lmeUZpbGVTaXplKChsb25nKSB0b1dyaXRlLmdldFZhbHVlKCkpKTsKKyAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBoYXNTcGFjZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0QXZhaWxhYmxlU3BhY2VGb3JDb21wYWN0aW9ucyhGaWxlU3RvcmUgZmlsZVN0b3JlKQorICAgIHsKKyAgICAgICAgbG9uZyBhdmFpbGFibGVTcGFjZSA9IDA7CisgICAgICAgIGF2YWlsYWJsZVNwYWNlID0gRmlsZVN0b3JlVXRpbHMudHJ5R2V0U3BhY2UoZmlsZVN0b3JlLCBGaWxlU3RvcmU6OmdldFVzYWJsZVNwYWNlLCBlIC0+IHsgdGhyb3cgbmV3IEZTUmVhZEVycm9yKGUsIGZpbGVTdG9yZS5uYW1lKCkpOyB9KQorICAgICAgICAgICAgICAgICAgICAgICAgIC0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldE1pbkZyZWVTcGFjZVBlckRyaXZlSW5CeXRlcygpOworICAgICAgICByZXR1cm4gTWF0aC5tYXgoMEwsIE1hdGgucm91bmQoYXZhaWxhYmxlU3BhY2UgKiBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0TWF4U3BhY2VGb3JDb21wYWN0aW9uc1BlckRyaXZlKCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE1hcDxGaWxlU3RvcmUsIExvbmc+IHBlckZpbGVTdG9yZShNYXA8RmlsZSwgTG9uZz4gcGVyRGlyZWN0b3J5LCBGdW5jdGlvbjxGaWxlLCBGaWxlU3RvcmU+IGZpbGVzdG9yZU1hcHBlcikKKyAgICB7CisgICAgICAgIHJldHVybiBwZXJEaXJlY3RvcnkuZW50cnlTZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKGVudHJ5IC0+IGZpbGVzdG9yZU1hcHBlci5hcHBseShlbnRyeS5nZXRLZXkoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTo6Z2V0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmc6OnN1bSkpOworICAgIH0KKworICAgIHB1YmxpYyBTZXQ8RmlsZVN0b3JlPiBhbGxGaWxlU3RvcmVzKEZ1bmN0aW9uPEZpbGUsIEZpbGVTdG9yZT4gZmlsZXN0b3JlTWFwcGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5zdHJlYW0oZ2V0V3JpdGVhYmxlTG9jYXRpb25zKCkpCisgICAgICAgICAgICAgICAgICAgICAubWFwKHRoaXM6OmdldExvY2F0aW9uRm9yRGlzaykKKyAgICAgICAgICAgICAgICAgICAgIC5tYXAoZmlsZXN0b3JlTWFwcGVyKQorICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBmaWxlc3RvcmUgZm9yIHRoZSBhY3R1YWwgZGlyZWN0b3J5IHdoZXJlIHRoZSBzc3RhYmxlcyBhcmUgc3RvcmVkLgorICAgICAqIEhhbmRsZXMgdGhlIGZhY3QgdGhhdCBhbiBvcGVyYXRvciBjYW4gc3ltbGluayBhIHRhYmxlIGRpcmVjdG9yeSB0byBhIGRpZmZlcmVudCBmaWxlc3RvcmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBGaWxlU3RvcmUgZ2V0RmlsZVN0b3JlKEZpbGUgZGlyZWN0b3J5KQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBGaWxlcy5nZXRGaWxlU3RvcmUoZGlyZWN0b3J5LnRvUGF0aCgpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IEZTUmVhZEVycm9yKGUsIGRpcmVjdG9yeSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgRGF0YURpcmVjdG9yeVtdIGdldFdyaXRlYWJsZUxvY2F0aW9ucygpCiAgICAgewotICAgICAgICBMaXN0PERhdGFEaXJlY3Rvcnk+IGFsbG93ZWREaXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8RGF0YURpcmVjdG9yeT4gYWxsb3dlZERpcnMgPSBuZXcgQXJyYXlMaXN0PD4ocGF0aHMubGVuZ3RoKTsKICAgICAgICAgZm9yIChEYXRhRGlyZWN0b3J5IGRpciA6IHBhdGhzKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIURpc2FsbG93ZWREaXJlY3Rvcmllcy5pc1Vud3JpdGFibGUoZGlyLmxvY2F0aW9uKSkKQEAgLTU5MywxNyArNjY4LDYgQEAKICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHNuYXBzaG90RGlyLCAic2NoZW1hLmNxbCIpOwogICAgIH0KIAotICAgIHB1YmxpYyBGaWxlIGdldE5ld0VwaGVtZXJhbFNuYXBzaG90TWFya2VyRmlsZShTdHJpbmcgc25hcHNob3ROYW1lKQotICAgIHsKLSAgICAgICAgRmlsZSBzbmFwc2hvdERpciA9IG5ldyBGaWxlKGdldFdyaXRlYWJsZUxvY2F0aW9uQXNGaWxlKDFMKSwgam9pbihTTkFQU0hPVF9TVUJESVIsIHNuYXBzaG90TmFtZSkpOwotICAgICAgICByZXR1cm4gZ2V0RXBoZW1lcmFsU25hcHNob3RNYXJrZXJGaWxlKHNuYXBzaG90RGlyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBGaWxlIGdldEVwaGVtZXJhbFNuYXBzaG90TWFya2VyRmlsZShGaWxlIHNuYXBzaG90RGlyZWN0b3J5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHNuYXBzaG90RGlyZWN0b3J5LCAiZXBoZW1lcmFsLnNuYXBzaG90Iik7Ci0gICAgfQotCiAgICAgcHVibGljIHN0YXRpYyBGaWxlIGdldEJhY2t1cHNEaXJlY3RvcnkoRGVzY3JpcHRvciBkZXNjKQogICAgIHsKICAgICAgICAgcmV0dXJuIGdldEJhY2t1cHNEaXJlY3RvcnkoZGVzYy5kaXJlY3RvcnkpOwpAQCAtODEwLDYgKzg3NCwxNiBAQAogICAgICAgICAgICAgLy8gbGFzdCByZXNvcnQKICAgICAgICAgICAgIHJldHVybiBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZSh0aGlzKSAtIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG8pOwogICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gIkRhdGFEaXJlY3RvcnlDYW5kaWRhdGV7IiArCisgICAgICAgICAgICAgICAgICAgImRhdGFEaXJlY3Rvcnk9IiArIGRhdGFEaXJlY3RvcnkgKworICAgICAgICAgICAgICAgICAgICIsIGF2YWlsYWJsZVNwYWNlPSIgKyBhdmFpbGFibGVTcGFjZSArCisgICAgICAgICAgICAgICAgICAgIiwgcGVyYz0iICsgcGVyYyArCisgICAgICAgICAgICAgICAgICAgJ30nOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqIFRoZSB0eXBlIG9mIGZpbGVzIHRoYXQgY2FuIGJlIGxpc3RlZCBieSBTU1RhYmxlTGlzdGVyLCB3ZSBuZXZlciByZXR1cm4gdHhuIGxvZ3MsCkBAIC05MjgsNyArMTAwMiw3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZm9yIChDb21wb25lbnQgYyA6IGVudHJ5LmdldFZhbHVlKCkpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsLmFkZChuZXcgRmlsZShlbnRyeS5nZXRLZXkoKS5maWxlbmFtZUZvcihjKSkpOworICAgICAgICAgICAgICAgICAgICBsLmFkZChlbnRyeS5nZXRLZXkoKS5maWxlRm9yKGMpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gbDsKQEAgLTEwMTYsMTggKzEwOTAsMjUgQEAKICAgICAgICAgcmV0dXJuIHNuYXBzaG90czsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgVGFibGVTbmFwc2hvdCBidWlsZFNuYXBzaG90KFN0cmluZyB0YWcsIFNuYXBzaG90TWFuaWZlc3QgbWFuaWZlc3QsIFNldDxGaWxlPiBzbmFwc2hvdERpcnMpIHsKKyAgICBwcml2YXRlIFRhYmxlU25hcHNob3QgYnVpbGRTbmFwc2hvdChTdHJpbmcgdGFnLCBTbmFwc2hvdE1hbmlmZXN0IG1hbmlmZXN0LCBTZXQ8RmlsZT4gc25hcHNob3REaXJzKQorICAgIHsKKyAgICAgICAgYm9vbGVhbiBlcGhlbWVyYWwgPSBtYW5pZmVzdCAhPSBudWxsID8gbWFuaWZlc3QuaXNFcGhlbWVyYWwoKSA6IGlzTGVnYWN5RXBoZW1lcmFsU25hcHNob3Qoc25hcHNob3REaXJzKTsKICAgICAgICAgSW5zdGFudCBjcmVhdGVkQXQgPSBtYW5pZmVzdCA9PSBudWxsID8gbnVsbCA6IG1hbmlmZXN0LmNyZWF0ZWRBdDsKICAgICAgICAgSW5zdGFudCBleHBpcmVzQXQgPSBtYW5pZmVzdCA9PSBudWxsID8gbnVsbCA6IG1hbmlmZXN0LmV4cGlyZXNBdDsKICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZVNuYXBzaG90KG1ldGFkYXRhLmtleXNwYWNlLCBtZXRhZGF0YS5uYW1lLCBtZXRhZGF0YS5pZC5hc1VVSUQoKSwgdGFnLCBjcmVhdGVkQXQsIGV4cGlyZXNBdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBzaG90RGlycyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdERpcnMsIGVwaGVtZXJhbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xlZ2FjeUVwaGVtZXJhbFNuYXBzaG90KFNldDxGaWxlPiBzbmFwc2hvdERpcnMpCisgICAgeworICAgICAgICByZXR1cm4gc25hcHNob3REaXJzLnN0cmVhbSgpLm1hcChkIC0+IG5ldyBGaWxlKGQsICJlcGhlbWVyYWwuc25hcHNob3QiKSkuYW55TWF0Y2goRmlsZTo6ZXhpc3RzKTsKICAgICB9CiAKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBwcm90ZWN0ZWQgc3RhdGljIFNuYXBzaG90TWFuaWZlc3QgbWF5YmVMb2FkTWFuaWZlc3QoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUsIFN0cmluZyB0YWcsIFNldDxGaWxlPiBzbmFwc2hvdERpcnMpCiAgICAgewogICAgICAgICBMaXN0PEZpbGU+IG1hbmlmZXN0cyA9IHNuYXBzaG90RGlycy5zdHJlYW0oKS5tYXAoZCAtPiBuZXcgRmlsZShkLCAibWFuaWZlc3QuanNvbiIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZCAtPiBkLmV4aXN0cygpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoRmlsZTo6ZXhpc3RzKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOwogCiAgICAgICAgIGlmIChtYW5pZmVzdHMuaXNFbXB0eSgpKQogICAgICAgICB7CkBAIC0xMDUxLDQyICsxMTMyLDYgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBsaXN0RXBoZW1lcmFsU25hcHNob3RzKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBlcGhlbWVyYWxTbmFwc2hvdHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7Ci0gICAgICAgIGZvciAoRmlsZSBzbmFwc2hvdCA6IGxpc3RBbGxTbmFwc2hvdHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGdldEVwaGVtZXJhbFNuYXBzaG90TWFya2VyRmlsZShzbmFwc2hvdCkuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgZXBoZW1lcmFsU25hcHNob3RzLmFkZChzbmFwc2hvdC5uYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcGhlbWVyYWxTbmFwc2hvdHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PEZpbGU+IGxpc3RBbGxTbmFwc2hvdHMoKQotICAgIHsKLSAgICAgICAgZmluYWwgTGlzdDxGaWxlPiBzbmFwc2hvdHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7Ci0gICAgICAgIGZvciAoZmluYWwgRmlsZSBkaXIgOiBkYXRhUGF0aHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGUgc25hcHNob3REaXIgPSBpc1NlY29uZGFyeUluZGV4Rm9sZGVyKGRpcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBGaWxlKGRpci5wYXJlbnRQYXRoKCksIFNOQVBTSE9UX1NVQkRJUikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBGaWxlKGRpciwgU05BUFNIT1RfU1VCRElSKTsKLSAgICAgICAgICAgIGlmIChzbmFwc2hvdERpci5leGlzdHMoKSAmJiBzbmFwc2hvdERpci5pc0RpcmVjdG9yeSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVbXSBzbmFwc2hvdERpcnMgID0gc25hcHNob3REaXIudHJ5TGlzdCgpOwotICAgICAgICAgICAgICAgIGlmIChzbmFwc2hvdERpcnMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoZmluYWwgRmlsZSBzbmFwc2hvdCA6IHNuYXBzaG90RGlycykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNuYXBzaG90LmlzRGlyZWN0b3J5KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHNob3RzLmFkZChzbmFwc2hvdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc25hcHNob3RzOwotICAgIH0KLQogICAgIEBWaXNpYmxlRm9yVGVzdGluZwogICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBTZXQ8RmlsZT4+IGxpc3RTbmFwc2hvdERpcnNCeVRhZygpCiAgICAgewpAQCAtMTI5OCw3ICsxMzQzLDcgQEAKICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBY2NlcHRhYmxlKFBhdGggcGF0aCkKICAgICAgICAgewogICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0gICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBTU1RhYmxlLnRyeURlc2NyaXB0b3JGcm9tRmlsZW5hbWUoZmlsZSk7CisgICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBTU1RhYmxlLnRyeURlc2NyaXB0b3JGcm9tRmlsZShmaWxlKTsKICAgICAgICAgICAgIHJldHVybiBkZXNjICE9IG51bGwKICAgICAgICAgICAgICAgICAmJiBkZXNjLmtzbmFtZS5lcXVhbHMobWV0YWRhdGEua2V5c3BhY2UpCiAgICAgICAgICAgICAgICAgJiYgZGVzYy5jZm5hbWUuZXF1YWxzKG1ldGFkYXRhLm5hbWUpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9EaXNrQm91bmRhcmllcy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvRGlza0JvdW5kYXJpZXMuamF2YQppbmRleCBmMzNiNDNlLi4zMmVkY2FjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9EaXNrQm91bmRhcmllcy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0Rpc2tCb3VuZGFyaWVzLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKQEAgLTE1NCw0ICsxNTUsMjAgQEAKICAgICAgICAgYXNzZXJ0IHBvcyA8IDA7CiAgICAgICAgIHJldHVybiAtcG9zIC0gMTsKICAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxEaXJlY3Rvcmllcy5EYXRhRGlyZWN0b3J5PiBnZXREaXNrc0luQm91bmRzKERlY29yYXRlZEtleSBmaXJzdCwgRGVjb3JhdGVkS2V5IGxhc3QpCisgICAgeworICAgICAgICBpZiAocG9zaXRpb25zID09IG51bGwgfHwgZmlyc3QgPT0gbnVsbCB8fCBsYXN0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZGlyZWN0b3JpZXM7CisgICAgICAgIGludCBmaXJzdEluZGV4ID0gZ2V0RGlza0luZGV4KGZpcnN0KTsKKyAgICAgICAgaW50IGxhc3RJbmRleCA9IGdldERpc2tJbmRleChsYXN0KTsKKyAgICAgICAgcmV0dXJuIGRpcmVjdG9yaWVzLnN1Ykxpc3QoZmlyc3RJbmRleCwgbGFzdEluZGV4ICsgMSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFcXVpdmFsZW50VG8oRGlza0JvdW5kYXJpZXMgb2xkQm91bmRhcmllcykKKyAgICB7CisgICAgICAgIHJldHVybiBvbGRCb3VuZGFyaWVzICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgIE9iamVjdHMuZXF1YWxzKHBvc2l0aW9ucywgb2xkQm91bmRhcmllcy5wb3NpdGlvbnMpICYmCisgICAgICAgICAgICAgICBPYmplY3RzLmVxdWFscyhkaXJlY3Rvcmllcywgb2xkQm91bmRhcmllcy5kaXJlY3Rvcmllcyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvRXhwaXJhdGlvbkRhdGVPdmVyZmxvd0hhbmRsaW5nLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9FeHBpcmF0aW9uRGF0ZU92ZXJmbG93SGFuZGxpbmcuamF2YQppbmRleCA3ZjgxYjVjLi5mOTIwN2NlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9FeHBpcmF0aW9uRGF0ZU92ZXJmbG93SGFuZGxpbmcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9FeHBpcmF0aW9uRGF0ZU92ZXJmbG93SGFuZGxpbmcuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogaW1wb3J0IG9yZy5zbGY0ai5oZWxwZXJzLk1lc3NhZ2VGb3JtYXR0ZXI7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQnVmZmVyQ2VsbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKQEAgLTMyLDEzICszMywxNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2xpZW50V2FybjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Ob1NwYW1Mb2dnZXI7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5FWFBJUkFUSU9OX0RBVEVfT1ZFUkZMT1dfUE9MSUNZOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwuY3VycmVudFRpbWVNaWxsaXM7CiAKIHB1YmxpYyBjbGFzcyBFeHBpcmF0aW9uRGF0ZU92ZXJmbG93SGFuZGxpbmcKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRXhwaXJhdGlvbkRhdGVPdmVyZmxvd0hhbmRsaW5nLmNsYXNzKTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFBJUkFUSU9OX09WRVJGTE9XX1dBUk5JTkdfSU5URVJWQUxfTUlOVVRFUyA9IEludGVnZXIuZ2V0SW50ZWdlcigiY2Fzc2FuZHJhLmV4cGlyYXRpb25fb3ZlcmZsb3dfd2FybmluZ19pbnRlcnZhbF9taW51dGVzIiwgNSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYUElSQVRJT05fT1ZFUkZMT1dfV0FSTklOR19JTlRFUlZBTF9NSU5VVEVTID0gQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkVYUElSQVRJT05fT1ZFUkZMT1dfV0FSTklOR19JTlRFUlZBTF9NSU5VVEVTLmdldEludCgpOwogCiAgICAgcHVibGljIGVudW0gRXhwaXJhdGlvbkRhdGVPdmVyZmxvd1BvbGljeQogICAgIHsKQEAgLTQ5LDE0ICs1MSwxMyBAQAogICAgIHB1YmxpYyBzdGF0aWMgRXhwaXJhdGlvbkRhdGVPdmVyZmxvd1BvbGljeSBwb2xpY3k7CiAKICAgICBzdGF0aWMgewotICAgICAgICBTdHJpbmcgcG9saWN5QXNTdHJpbmcgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5leHBpcmF0aW9uX2RhdGVfb3ZlcmZsb3dfcG9saWN5IiwgRXhwaXJhdGlvbkRhdGVPdmVyZmxvd1BvbGljeS5SRUpFQ1QubmFtZSgpKTsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIHBvbGljeSA9IEV4cGlyYXRpb25EYXRlT3ZlcmZsb3dQb2xpY3kudmFsdWVPZihwb2xpY3lBc1N0cmluZy50b1VwcGVyQ2FzZSgpKTsKKyAgICAgICAgICAgIHBvbGljeSA9IEVYUElSQVRJT05fREFURV9PVkVSRkxPV19QT0xJQ1kuZ2V0RW51bShFeHBpcmF0aW9uRGF0ZU92ZXJmbG93UG9saWN5LlJFSkVDVCk7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLndhcm4oIkludmFsaWQgZXhwaXJhdGlvbiBkYXRlIG92ZXJmbG93IHBvbGljeToge30uIFVzaW5nIGRlZmF1bHQ6IHt9IiwgcG9saWN5QXNTdHJpbmcsIEV4cGlyYXRpb25EYXRlT3ZlcmZsb3dQb2xpY3kuUkVKRUNULm5hbWUoKSk7CisgICAgICAgICAgICBsb2dnZXIud2FybigiSW52YWxpZCBleHBpcmF0aW9uIGRhdGUgb3ZlcmZsb3cgcG9saWN5LiBVc2luZyBkZWZhdWx0OiB7fSIsIEV4cGlyYXRpb25EYXRlT3ZlcmZsb3dQb2xpY3kuUkVKRUNULm5hbWUoKSk7CiAgICAgICAgICAgICBwb2xpY3kgPSBFeHBpcmF0aW9uRGF0ZU92ZXJmbG93UG9saWN5LlJFSkVDVDsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0tleXNwYWNlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9LZXlzcGFjZS5qYXZhCmluZGV4IGQ2ZGI3MDAuLjIyNzIxYmQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0tleXNwYWNlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvS2V5c3BhY2UuamF2YQpAQCAtNDAsNiArNDAsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5TdGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkR1cmF0aW9uU3BlYzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuU1NUYWJsZVNldDsKQEAgLTg3LDkgKzg4LDkgQEAKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoS2V5c3BhY2UuY2xhc3MpOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRkFJTF9XUklURVNfS1MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS50ZXN0LmZhaWxfd3JpdGVzX2tzIiwgIiIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0ZBSUxfV1JJVEVTX0tTID0gQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfRkFJTF9XUklURVNfS1MuZ2V0U3RyaW5nKCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBURVNUX0ZBSUxfV1JJVEVTID0gIVRFU1RfRkFJTF9XUklURVNfS1MuaXNFbXB0eSgpOwotICAgIHByaXZhdGUgc3RhdGljIGludCBURVNUX0ZBSUxfTVZfTE9DS1NfQ09VTlQgPSBJbnRlZ2VyLmdldEludGVnZXIoImNhc3NhbmRyYS50ZXN0LmZhaWxfbXZfbG9ja3NfY291bnQiLCAwKTsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgVEVTVF9GQUlMX01WX0xPQ0tTX0NPVU5UID0gQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfRkFJTF9NVl9MT0NLU19DT1VOVC5nZXRJbnQoKTsKIAogICAgIHB1YmxpYyBmaW5hbCBLZXlzcGFjZU1ldHJpY3MgbWV0cmljOwogCkBAIC0zMDMsMjAgKzMwNCw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xlYXIgYWxsIHRoZSBzbmFwc2hvdHMgZm9yIGEgZ2l2ZW4ga2V5c3BhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc25hcHNob3ROYW1lIHRoZSB1c2VyIHN1cHBsaWVkIHNuYXBzaG90IG5hbWUuIEl0IGVtcHR5IG9yIG51bGwsCi0gICAgICogICAgICAgICAgICAgICAgICAgICBhbGwgdGhlIHNuYXBzaG90cyB3aWxsIGJlIGNsZWFuZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJTbmFwc2hvdChTdHJpbmcgc25hcHNob3ROYW1lLCBTdHJpbmcga2V5c3BhY2UpCi0gICAgewotICAgICAgICBSYXRlTGltaXRlciBjbGVhclNuYXBzaG90UmF0ZUxpbWl0ZXIgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U25hcHNob3RSYXRlTGltaXRlcigpOwotCi0gICAgICAgIExpc3Q8RmlsZT4gdGFibGVEaXJlY3RvcmllcyA9IERpcmVjdG9yaWVzLmdldEtTQ2hpbGREaXJlY3RvcmllcyhrZXlzcGFjZSk7Ci0gICAgICAgIERpcmVjdG9yaWVzLmNsZWFyU25hcHNob3Qoc25hcHNob3ROYW1lLCB0YWJsZURpcmVjdG9yaWVzLCBjbGVhclNuYXBzaG90UmF0ZUxpbWl0ZXIpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIEByZXR1cm4gQSBsaXN0IG9mIG9wZW4gU1NUYWJsZVJlYWRlcnMKICAgICAgKi8KICAgICBwdWJsaWMgTGlzdDxTU1RhYmxlUmVhZGVyPiBnZXRBbGxTU1RhYmxlcyhTU1RhYmxlU2V0IHNzdGFibGVTZXQpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9NdXRhdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvTXV0YXRpb24uamF2YQppbmRleCA3YjZhNjg2Li5hZDQzYjE2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9NdXRhdGlvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL011dGF0aW9uLmphdmEKQEAgLTIzLDI2ICsyMywzMiBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUNvbGxlY3Rpb247CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5TdGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlBhcnRpdGlvblVwZGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkRlc2VyaWFsaXphdGlvbkhlbHBlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5JVmVyc2lvbmVkU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0QnVmZmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5UZWVEYXRhSW5wdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmVwbGljYVBsYW47CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2luZ1NlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkFic3RyYWN0V3JpdGVSZXNwb25zZUhhbmRsZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5GdXR1cmU7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2luZ1NlcnZpY2UuVkVSU0lPTl8zMDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2luZ1NlcnZpY2UuVkVSU0lPTl8zMDE0OwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZS5WRVJTSU9OXzQwOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZS4qOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Nb25vdG9uaWNDbG9jay5HbG9iYWwuYXBwcm94VGltZTsKIAogcHVibGljIGNsYXNzIE11dGF0aW9uIGltcGxlbWVudHMgSU11dGF0aW9uLCBTdXBwbGllcjxNdXRhdGlvbj4KQEAgLTY0LDYgKzcwLDE1IEBACiAKICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY2RjRW5hYmxlZDsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVJJQUxJWkFUSU9OX1ZFUlNJT05fQ09VTlQgPSBNZXNzYWdpbmdTZXJ2aWNlLlZlcnNpb24udmFsdWVzKCkubGVuZ3RoOworICAgIC8vIENvbnRhaW5zIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb25zIG9mIHRoaXMgbXV0YXRpb24uCisgICAgLy8gTm90ZTogdGhlcmUgaXMgbm8gZnVuY3Rpb25hbGl0eSB0byBjbGVhci9yZW1vdmUgc2VyaWFsaXplZCBpbnN0YW5jZXMsIGJlY2F1c2UgYSBtdXRhdGlvbiBtdXN0IG5ldmVyCisgICAgLy8gYmUgbW9kaWZpZWQgKGUuZy4gY2FsbGluZyBhZGQoUGFydGl0aW9uVXBkYXRlKSkgd2hlbiBpdCdzIGJlaW5nIHNlcmlhbGl6ZWQuCisgICAgcHJpdmF0ZSBmaW5hbCBTZXJpYWxpemF0aW9uW10gY2FjaGVkU2VyaWFsaXphdGlvbnMgPSBuZXcgU2VyaWFsaXphdGlvbltTRVJJQUxJWkFUSU9OX1ZFUlNJT05fQ09VTlRdOworCisgICAgLyoqIEBzZWUgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzI0NBQ0hFQUJMRV9NVVRBVElPTl9TSVpFX0xJTUlUICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBDQUNIRUFCTEVfTVVUQVRJT05fU0laRV9MSU1JVCA9IENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQUNIRUFCTEVfTVVUQVRJT05fU0laRV9MSU1JVC5nZXRMb25nKCk7CisKICAgICBwdWJsaWMgTXV0YXRpb24oUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSkKICAgICB7CiAgICAgICAgIHRoaXModXBkYXRlLm1ldGFkYXRhKCkua2V5c3BhY2UsIHVwZGF0ZS5wYXJ0aXRpb25LZXkoKSwgSW1tdXRhYmxlTWFwLm9mKHVwZGF0ZS5tZXRhZGF0YSgpLmlkLCB1cGRhdGUpLCBhcHByb3hUaW1lLm5vdygpLCB1cGRhdGUubWV0YWRhdGEoKS5wYXJhbXMuY2RjKTsKQEAgLTI5OCw2ICszMTMsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBidWZmLmFwcGVuZCgiXSkiKS50b1N0cmluZygpOwogICAgIH0KKwogICAgIHByaXZhdGUgaW50IHNlcmlhbGl6ZWRTaXplMzA7CiAgICAgcHJpdmF0ZSBpbnQgc2VyaWFsaXplZFNpemUzMDE0OwogICAgIHByaXZhdGUgaW50IHNlcmlhbGl6ZWRTaXplNDA7CkBAIC0zOTMsMzQgKzQwOSwxMTUgQEAKICAgICB7CiAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShNdXRhdGlvbiBtdXRhdGlvbiwgRGF0YU91dHB1dFBsdXMgb3V0LCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKKyAgICAgICAgICAgIHNlcmlhbGl6YXRpb24obXV0YXRpb24sIHZlcnNpb24pLnNlcmlhbGl6ZShQYXJ0aXRpb25VcGRhdGUuc2VyaWFsaXplciwgbXV0YXRpb24sIG91dCwgdmVyc2lvbik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIGVhcmx5IGR1cmluZyByZXF1ZXN0IHByb2Nlc3NpbmcgdG8gcHJldmVudCB0aGF0IHtAbGluayAjc2VyaWFsaXphdGlvbihNdXRhdGlvbiwgaW50KX0gaXMKKyAgICAgICAgICogY2FsbGVkIGNvbmN1cnJlbnRseS4KKyAgICAgICAgICogU2VlIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VQcm94eSNzZW5kVG9IaW50ZWRSZXBsaWNhcyhNdXRhdGlvbiwgUmVwbGljYVBsYW4uRm9yV3JpdGUsIEFic3RyYWN0V3JpdGVSZXNwb25zZUhhbmRsZXIsIFN0cmluZywgU3RhZ2UpfQorICAgICAgICAgKi8KKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoIkphdmFkb2NSZWZlcmVuY2UiKQorICAgICAgICBwdWJsaWMgdm9pZCBwcmVwYXJlU2VyaWFsaXplZEJ1ZmZlcihNdXRhdGlvbiBtdXRhdGlvbiwgaW50IHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlcmlhbGl6YXRpb24obXV0YXRpb24sIHZlcnNpb24pOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHJpZXZlIHRoZSBjYWNoZWQgc2VyaWFsaXphdGlvbiBvZiB0aGlzIG11dGF0aW9uLCBvciBjb21wdXRlIGFuZCBjYWNoZSBzYWlkIHNlcmlhbGl6YXRpb24gaWYgaXQgZG9lc24ndAorICAgICAgICAgKiBleGlzdCB5ZXQuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBpcyBfbm90XyBzeW5jaHJvbml6ZWQgZXZlbiB0aG91Z2ggaXQgbWF5IChhbmQgd2lsbCBvZnRlbikgYmUgY2FsbGVkCisgICAgICAgICAqIGNvbmN1cnJlbnRseS4gQ29uY3VycmVudCBjYWxscyBhcmUgc3RpbGwgc2FmZSBob3dldmVyLCB0aGUgb25seSByaXNrIGlzIHRoYXQgdGhlIHZhbHVlIGlzIG5vdCBjYWNoZWQgeWV0LAorICAgICAgICAgKiBtdWx0aXBsZSBjb25jdXJyZW50IGNhbGxzIG1heSBjb21wdXRlIGl0IG11bHRpcGxlIHRpbWVzIGluc3RlYWQgb2YganVzdCBvbmNlLiBUaGlzIGlzIG9rIGFzIGluIHByYWN0aWNlCisgICAgICAgICAqIGFzIHdlIG1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgaGFwcGVuIGluIHRoZSBob3QgcGF0aCBieSBmb3JjaW5nIHRoZSBpbml0aWFsIGNhY2hpbmcgaW4KKyAgICAgICAgICoge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVByb3h5I3NlbmRUb0hpbnRlZFJlcGxpY2FzKE11dGF0aW9uLCBSZXBsaWNhUGxhbi5Gb3JXcml0ZSwgQWJzdHJhY3RXcml0ZVJlc3BvbnNlSGFuZGxlciwgU3RyaW5nLCBTdGFnZSl9CisgICAgICAgICAqIHZpYSB7QGxpbmsgI3ByZXBhcmVTZXJpYWxpemVkQnVmZmVyKE11dGF0aW9uKX0sIHdoaWNoIGlzIHRoZSBvbmx5IGNhbGxlciB0aGF0IHBhc3NlcworICAgICAgICAgKiB7QGNvZGUgaXNQcmVwYXJlPT10cnVlfS4KKyAgICAgICAgICovCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJKYXZhZG9jUmVmZXJlbmNlIikKKyAgICAgICAgcHJpdmF0ZSBTZXJpYWxpemF0aW9uIHNlcmlhbGl6YXRpb24oTXV0YXRpb24gbXV0YXRpb24sIGludCB2ZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdmVyc2lvbk9yZGluYWwgPSBNZXNzYWdpbmdTZXJ2aWNlLmdldFZlcnNpb25PcmRpbmFsKHZlcnNpb24pOworICAgICAgICAgICAgLy8gUmV0cmlldmVzIHRoZSBjYWNoZWQgdmVyc2lvbiwgb3IgYnVpbGQrY2FjaGUgaXQgaWYgaXQncyBub3QgY2FjaGVkIGFscmVhZHkuCisgICAgICAgICAgICBTZXJpYWxpemF0aW9uIHNlcmlhbGl6YXRpb24gPSBtdXRhdGlvbi5jYWNoZWRTZXJpYWxpemF0aW9uc1t2ZXJzaW9uT3JkaW5hbF07CisgICAgICAgICAgICBpZiAoc2VyaWFsaXphdGlvbiA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlcmlhbGl6YXRpb24gPSBuZXcgU2l6ZU9ubHlDYWNoZWFibGVTZXJpYWxpemF0aW9uKCk7CisgICAgICAgICAgICAgICAgbG9uZyBzZXJpYWxpemVkU2l6ZSA9IHNlcmlhbGl6YXRpb24uc2VyaWFsaXplZFNpemUoUGFydGl0aW9uVXBkYXRlLnNlcmlhbGl6ZXIsIG11dGF0aW9uLCB2ZXJzaW9uKTsKKworICAgICAgICAgICAgICAgIC8vIEV4Y2Vzc2l2ZWx5IGxhcmdlIG11dGF0aW9uIG9iamVjdHMgY2F1c2UgR0MgcHJlc3N1cmUgYW5kIGh1Z2UgYWxsb2NhdGlvbnMgd2hlbiBzZXJpYWxpemVkLgorICAgICAgICAgICAgICAgIC8vIHNvIHdlIG9ubHkgY2FjaGUgc2VyaWFsaXplZCBtdXRhdGlvbnMgd2hlbiB0aGV5IGFyZSBiZWxvdyB0aGUgZGVmaW5lZCBsaW1pdC4KKyAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplZFNpemUgPCBDQUNIRUFCTEVfTVVUQVRJT05fU0laRV9MSU1JVCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeSAoRGF0YU91dHB1dEJ1ZmZlciBkb2IgPSBEYXRhT3V0cHV0QnVmZmVyLnNjcmF0Y2hCdWZmZXIuZ2V0KCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUludGVybmFsKFBhcnRpdGlvblVwZGF0ZS5zZXJpYWxpemVyLCBtdXRhdGlvbiwgZG9iLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YXRpb24gPSBuZXcgQ2FjaGVkU2VyaWFsaXphdGlvbihkb2IudG9CeXRlQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG11dGF0aW9uLmNhY2hlZFNlcmlhbGl6YXRpb25zW3ZlcnNpb25PcmRpbmFsXSA9IHNlcmlhbGl6YXRpb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHZvaWQgc2VyaWFsaXplSW50ZXJuYWwoUGFydGl0aW9uVXBkYXRlLlBhcnRpdGlvblVwZGF0ZVNlcmlhbGl6ZXIgc2VyaWFsaXplciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXV0YXRpb24gbXV0YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFPdXRwdXRQbHVzIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBNYXA8VGFibGVJZCwgUGFydGl0aW9uVXBkYXRlPiBtb2RpZmljYXRpb25zID0gbXV0YXRpb24ubW9kaWZpY2F0aW9uczsKKwogICAgICAgICAgICAgLyogc2VyaWFsaXplIHRoZSBtb2RpZmljYXRpb25zIGluIHRoZSBtdXRhdGlvbiAqLwotICAgICAgICAgICAgaW50IHNpemUgPSBtdXRhdGlvbi5tb2RpZmljYXRpb25zLnNpemUoKTsKLSAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChzaXplKTsKKyAgICAgICAgICAgIGludCBzaXplID0gbW9kaWZpY2F0aW9ucy5zaXplKCk7CisgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihzaXplKTsKIAogICAgICAgICAgICAgYXNzZXJ0IHNpemUgPiAwOwotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8VGFibGVJZCwgUGFydGl0aW9uVXBkYXRlPiBlbnRyeSA6IG11dGF0aW9uLm1vZGlmaWNhdGlvbnMuZW50cnlTZXQoKSkKLSAgICAgICAgICAgICAgICBQYXJ0aXRpb25VcGRhdGUuc2VyaWFsaXplci5zZXJpYWxpemUoZW50cnkuZ2V0VmFsdWUoKSwgb3V0LCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIGZvciAoUGFydGl0aW9uVXBkYXRlIHBhcnRpdGlvblVwZGF0ZSA6IG1vZGlmaWNhdGlvbnMudmFsdWVzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUocGFydGl0aW9uVXBkYXRlLCBvdXQsIHZlcnNpb24pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIE11dGF0aW9uIGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4sIGludCB2ZXJzaW9uLCBEZXNlcmlhbGl6YXRpb25IZWxwZXIuRmxhZyBmbGFnKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewotICAgICAgICAgICAgaW50IHNpemUgPSAoaW50KWluLnJlYWRVbnNpZ25lZFZJbnQoKTsKLSAgICAgICAgICAgIGFzc2VydCBzaXplID4gMDsKLQotICAgICAgICAgICAgUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSA9IFBhcnRpdGlvblVwZGF0ZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCB2ZXJzaW9uLCBmbGFnKTsKLSAgICAgICAgICAgIGlmIChzaXplID09IDEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNdXRhdGlvbih1cGRhdGUpOwotCi0gICAgICAgICAgICBJbW11dGFibGVNYXAuQnVpbGRlcjxUYWJsZUlkLCBQYXJ0aXRpb25VcGRhdGU+IG1vZGlmaWNhdGlvbnMgPSBuZXcgSW1tdXRhYmxlTWFwLkJ1aWxkZXI8PigpOwotICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGRrID0gdXBkYXRlLnBhcnRpdGlvbktleSgpOwotCi0gICAgICAgICAgICBtb2RpZmljYXRpb25zLnB1dCh1cGRhdGUubWV0YWRhdGEoKS5pZCwgdXBkYXRlKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2l6ZTsgKytpKQorICAgICAgICAgICAgTXV0YXRpb24gbTsKKyAgICAgICAgICAgIFRlZURhdGFJbnB1dFBsdXMgdGVlSW47CisgICAgICAgICAgICB0cnkgKERhdGFPdXRwdXRCdWZmZXIgZG9iID0gRGF0YU91dHB1dEJ1ZmZlci5zY3JhdGNoQnVmZmVyLmdldCgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVwZGF0ZSA9IFBhcnRpdGlvblVwZGF0ZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCB2ZXJzaW9uLCBmbGFnKTsKLSAgICAgICAgICAgICAgICBtb2RpZmljYXRpb25zLnB1dCh1cGRhdGUubWV0YWRhdGEoKS5pZCwgdXBkYXRlKTsKKyAgICAgICAgICAgICAgICB0ZWVJbiA9IG5ldyBUZWVEYXRhSW5wdXRQbHVzKGluLCBkb2IsIENBQ0hFQUJMRV9NVVRBVElPTl9TSVpFX0xJTUlUKTsKKworICAgICAgICAgICAgICAgIGludCBzaXplID0gdGVlSW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0IHNpemUgPiAwOworCisgICAgICAgICAgICAgICAgUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSA9IFBhcnRpdGlvblVwZGF0ZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHRlZUluLCB2ZXJzaW9uLCBmbGFnKTsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbSA9IG5ldyBNdXRhdGlvbih1cGRhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVNYXAuQnVpbGRlcjxUYWJsZUlkLCBQYXJ0aXRpb25VcGRhdGU+IG1vZGlmaWNhdGlvbnMgPSBuZXcgSW1tdXRhYmxlTWFwLkJ1aWxkZXI8PigpOworICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgZGsgPSB1cGRhdGUucGFydGl0aW9uS2V5KCk7CisKKyAgICAgICAgICAgICAgICAgICAgbW9kaWZpY2F0aW9ucy5wdXQodXBkYXRlLm1ldGFkYXRhKCkuaWQsIHVwZGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2l6ZTsgKytpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUgPSBQYXJ0aXRpb25VcGRhdGUuc2VyaWFsaXplci5kZXNlcmlhbGl6ZSh0ZWVJbiwgdmVyc2lvbiwgZmxhZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmljYXRpb25zLnB1dCh1cGRhdGUubWV0YWRhdGEoKS5pZCwgdXBkYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtID0gbmV3IE11dGF0aW9uKHVwZGF0ZS5tZXRhZGF0YSgpLmtleXNwYWNlLCBkaywgbW9kaWZpY2F0aW9ucy5idWlsZCgpLCBhcHByb3hUaW1lLm5vdygpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL09ubHkgY2FjaGUgc2VyaWFsaXphdGlvbnMgdGhhdCBkb24ndCBoaXQgdGhlIGxpbWl0CisgICAgICAgICAgICAgICAgaWYgKCF0ZWVJbi5pc0xpbWl0UmVhY2hlZCgpKQorICAgICAgICAgICAgICAgICAgICBtLmNhY2hlZFNlcmlhbGl6YXRpb25zW01lc3NhZ2luZ1NlcnZpY2UuZ2V0VmVyc2lvbk9yZGluYWwodmVyc2lvbildID0gbmV3IENhY2hlZFNlcmlhbGl6YXRpb24oZG9iLnRvQnl0ZUFycmF5KCkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIG07CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE11dGF0aW9uKHVwZGF0ZS5tZXRhZGF0YSgpLmtleXNwYWNlLCBkaywgbW9kaWZpY2F0aW9ucy5idWlsZCgpLCBhcHByb3hUaW1lLm5vdygpKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBNdXRhdGlvbiBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCkBAIC00MzAsMTAgKzUyNyw3MSBAQAogCiAgICAgICAgIHB1YmxpYyBsb25nIHNlcmlhbGl6ZWRTaXplKE11dGF0aW9uIG11dGF0aW9uLCBpbnQgdmVyc2lvbikKICAgICAgICAgewotICAgICAgICAgICAgaW50IHNpemUgPSBUeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50KG11dGF0aW9uLm1vZGlmaWNhdGlvbnMuc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFRhYmxlSWQsIFBhcnRpdGlvblVwZGF0ZT4gZW50cnkgOiBtdXRhdGlvbi5tb2RpZmljYXRpb25zLmVudHJ5U2V0KCkpCi0gICAgICAgICAgICAgICAgc2l6ZSArPSBQYXJ0aXRpb25VcGRhdGUuc2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShlbnRyeS5nZXRWYWx1ZSgpLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uKG11dGF0aW9uLCB2ZXJzaW9uKS5zZXJpYWxpemVkU2l6ZShQYXJ0aXRpb25VcGRhdGUuc2VyaWFsaXplciwgbXV0YXRpb24sIHZlcnNpb24pOworICAgICAgICB9CisgICAgfQogCisgICAgLyoqCisgICAgICogVGhlcmUgYXJlIHR3byBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBjbGFzcy4gT25lIHRoYXQga2VlcHMgdGhlIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb24taGVhcCBmb3IgbGF0ZXIKKyAgICAgKiByZXVzZSBhbmQgb25lIHRoYXQgZG9lc24ndC4gS2VlcGluZyBhbGwgc2l6ZWQgbXV0YXRpb25zIGFyb3VuZCBtYXkgbGVhZCB0byAiYmFkIiBHQyBwcmVzc3VyZSAoRzEgR0MpIGR1ZSB0byBodW1vbmdvdXMgb2JqZWN0cy4KKyAgICAgKiBCeSBkZWZhdWx0IHNlcmlhbGl6ZWQgbXV0YXRpb25zIHVwIHRvIDJNQiBhcmUga2VwdCBvbi1oZWFwIC0gc2VlIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzI0NBQ0hFQUJMRV9NVVRBVElPTl9TSVpFX0xJTUlUfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTZXJpYWxpemF0aW9uCisgICAgeworICAgICAgICBhYnN0cmFjdCB2b2lkIHNlcmlhbGl6ZShQYXJ0aXRpb25VcGRhdGUuUGFydGl0aW9uVXBkYXRlU2VyaWFsaXplciBzZXJpYWxpemVyLCBNdXRhdGlvbiBtdXRhdGlvbiwgRGF0YU91dHB1dFBsdXMgb3V0LCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgICAgIGFic3RyYWN0IGxvbmcgc2VyaWFsaXplZFNpemUoUGFydGl0aW9uVXBkYXRlLlBhcnRpdGlvblVwZGF0ZVNlcmlhbGl6ZXIgc2VyaWFsaXplciwgTXV0YXRpb24gbXV0YXRpb24sIGludCB2ZXJzaW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIHRoZSBjYWNoZWQgc2VyaWFsaXphdGlvbiBvZiBhIHtAbGluayBNdXRhdGlvbn0gYXMgYSB7QGNvZGUgYnl0ZVtdfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBDYWNoZWRTZXJpYWxpemF0aW9uIGV4dGVuZHMgU2VyaWFsaXphdGlvbgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gc2VyaWFsaXplZDsKKworICAgICAgICBDYWNoZWRTZXJpYWxpemF0aW9uKGJ5dGVbXSBzZXJpYWxpemVkKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnNlcmlhbGl6ZWQgPSBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChzZXJpYWxpemVkKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIHNlcmlhbGl6ZShQYXJ0aXRpb25VcGRhdGUuUGFydGl0aW9uVXBkYXRlU2VyaWFsaXplciBzZXJpYWxpemVyLCBNdXRhdGlvbiBtdXRhdGlvbiwgRGF0YU91dHB1dFBsdXMgb3V0LCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dC53cml0ZShzZXJpYWxpemVkKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBsb25nIHNlcmlhbGl6ZWRTaXplKFBhcnRpdGlvblVwZGF0ZS5QYXJ0aXRpb25VcGRhdGVTZXJpYWxpemVyIHNlcmlhbGl6ZXIsIE11dGF0aW9uIG11dGF0aW9uLCBpbnQgdmVyc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQubGVuZ3RoOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIG5vbi1jYWNoZWFibGUgc2VyaWFsaXphdGlvbiBvZiBhIHtAbGluayBNdXRhdGlvbn0sIG9ubHkgdGhlIHNpemUgb2YgdGhlIG11dGF0aW9uIGlzIGxhemlseSBjYWNoZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU2l6ZU9ubHlDYWNoZWFibGVTZXJpYWxpemF0aW9uIGV4dGVuZHMgU2VyaWFsaXphdGlvbgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBsb25nIHNpemU7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgc2VyaWFsaXplKFBhcnRpdGlvblVwZGF0ZS5QYXJ0aXRpb25VcGRhdGVTZXJpYWxpemVyIHNlcmlhbGl6ZXIsIE11dGF0aW9uIG11dGF0aW9uLCBEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgTXV0YXRpb25TZXJpYWxpemVyLnNlcmlhbGl6ZUludGVybmFsKHNlcmlhbGl6ZXIsIG11dGF0aW9uLCBvdXQsIHZlcnNpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIGxvbmcgc2VyaWFsaXplZFNpemUoUGFydGl0aW9uVXBkYXRlLlBhcnRpdGlvblVwZGF0ZVNlcmlhbGl6ZXIgc2VyaWFsaXplciwgTXV0YXRpb24gbXV0YXRpb24sIGludCB2ZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIHNpemUgPSB0aGlzLnNpemU7CisgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaXplID0gVHlwZVNpemVzLnNpemVvZlVuc2lnbmVkVkludChtdXRhdGlvbi5tb2RpZmljYXRpb25zLnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChQYXJ0aXRpb25VcGRhdGUgcGFydGl0aW9uVXBkYXRlIDogbXV0YXRpb24ubW9kaWZpY2F0aW9ucy52YWx1ZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSBzZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKHBhcnRpdGlvblVwZGF0ZSwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgdGhpcy5zaXplID0gc2l6ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBzaXplOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvTmF0aXZlQ2x1c3RlcmluZy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvTmF0aXZlQ2x1c3RlcmluZy5qYXZhCmluZGV4IDBlNGMxOWQuLjFiNjc2MWQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL05hdGl2ZUNsdXN0ZXJpbmcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9OYXRpdmVDbHVzdGVyaW5nLmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlZhbHVlQWNjZXNzb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT2JqZWN0U2l6ZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5PcE9yZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5IZWFwQ2xvbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5NZW1vcnlVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5OYXRpdmVBbGxvY2F0b3I7CiAKQEAgLTM2LDExICszNyw2IEBACiAKICAgICBwcml2YXRlIE5hdGl2ZUNsdXN0ZXJpbmcoKSB7IHBlZXIgPSAwOyB9CiAKLSAgICBwdWJsaWMgQ2x1c3RlcmluZ1ByZWZpeDxCeXRlQnVmZmVyPiBtaW5pbWl6ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KICAgICBwdWJsaWMgTmF0aXZlQ2x1c3RlcmluZyhOYXRpdmVBbGxvY2F0b3IgYWxsb2NhdG9yLCBPcE9yZGVyLkdyb3VwIHdyaXRlT3AsIENsdXN0ZXJpbmc8Pz4gY2x1c3RlcmluZykKICAgICB7CiAgICAgICAgIGludCBjb3VudCA9IGNsdXN0ZXJpbmcuc2l6ZSgpOwpAQCAtMTU3LDQgKzE1MywyMCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIENsdXN0ZXJpbmdQcmVmaXguZXF1YWxzKHRoaXMsIG8pOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbHVzdGVyaW5nUHJlZml4PEJ5dGVCdWZmZXI+IHJldGFpbmFibGUoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGtpbmQoKSA9PSBLaW5kLkNMVVNURVJJTkc7IC8vIHRvbWJzdG9uZXMgYXJlIG5ldmVyIHN0b3JlZCBuYXRpdmVseQorCisgICAgICAgIC8vIGFsd2F5cyBleHRyYWN0CisgICAgICAgIEJ5dGVCdWZmZXJbXSB2YWx1ZXMgPSBuZXcgQnl0ZUJ1ZmZlcltzaXplKCldOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlciB2YWx1ZSA9IGdldChpKTsKKyAgICAgICAgICAgIHZhbHVlc1tpXSA9IHZhbHVlICE9IG51bGwgPyBIZWFwQ2xvbmVyLmluc3RhbmNlLmNsb25lKHZhbHVlKSA6IG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYWNjZXNzb3IoKS5mYWN0b3J5KCkuY2x1c3RlcmluZyh2YWx1ZXMpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL05hdGl2ZURlY29yYXRlZEtleS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvTmF0aXZlRGVjb3JhdGVkS2V5LmphdmEKaW5kZXggYWRkNTIxOC4uYmMxNDkwOCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvTmF0aXZlRGVjb3JhdGVkS2V5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvTmF0aXZlRGVjb3JhdGVkS2V5LmphdmEKQEAgLTIwLDcgKzIwLDkgQEAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKIAoraW1wb3J0IG5ldC5uaWNvdWxhai5jb21waWxlY29tbWFuZC5hbm5vdGF0aW9ucy5JbmxpbmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5PcE9yZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5NZW1vcnlVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5OYXRpdmVBbGxvY2F0b3I7CkBAIC00MSw4ICs0Myw0NCBAQAogICAgICAgICBNZW1vcnlVdGlsLnNldEJ5dGVzKHBlZXIgKyA0LCBrZXkpOwogICAgIH0KIAorICAgIHB1YmxpYyBOYXRpdmVEZWNvcmF0ZWRLZXkoVG9rZW4gdG9rZW4sIE5hdGl2ZUFsbG9jYXRvciBhbGxvY2F0b3IsIE9wT3JkZXIuR3JvdXAgd3JpdGVPcCwgYnl0ZVtdIGtleUJ5dGVzKQorICAgIHsKKyAgICAgICAgc3VwZXIodG9rZW4pOworICAgICAgICBhc3NlcnQga2V5Qnl0ZXMgIT0gbnVsbDsKKworICAgICAgICBpbnQgc2l6ZSA9IGtleUJ5dGVzLmxlbmd0aDsKKyAgICAgICAgdGhpcy5wZWVyID0gYWxsb2NhdG9yLmFsbG9jYXRlKDQgKyBzaXplLCB3cml0ZU9wKTsKKyAgICAgICAgTWVtb3J5VXRpbC5zZXRJbnQocGVlciwgc2l6ZSk7CisgICAgICAgIE1lbW9yeVV0aWwuc2V0Qnl0ZXMocGVlciArIDQsIGtleUJ5dGVzLCAwLCBzaXplKTsKKyAgICB9CisKKyAgICBASW5saW5lCisgICAgaW50IGxlbmd0aCgpCisgICAgeworICAgICAgICByZXR1cm4gTWVtb3J5VXRpbC5nZXRJbnQocGVlcik7CisgICAgfQorCisgICAgQElubGluZQorICAgIGxvbmcgYWRkcmVzcygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5wZWVyICsgNDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRLZXkoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIE1lbW9yeVV0aWwuZ2V0Qnl0ZUJ1ZmZlcihwZWVyICsgNCwgTWVtb3J5VXRpbC5nZXRJbnQocGVlciksIEJ5dGVPcmRlci5CSUdfRU5ESUFOKTsKKyAgICAgICAgcmV0dXJuIE1lbW9yeVV0aWwuZ2V0Qnl0ZUJ1ZmZlcihhZGRyZXNzKCksIGxlbmd0aCgpLCBCeXRlT3JkZXIuQklHX0VORElBTik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRLZXlMZW5ndGgoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1lbW9yeVV0aWwuZ2V0SW50KHBlZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBCeXRlU291cmNlIGtleUNvbXBhcmFibGVCeXRlcyhWZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZS5vZk1lbW9yeShhZGRyZXNzKCksIGxlbmd0aCgpLCB2ZXJzaW9uKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9QYXJ0aXRpb25Qb3NpdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvUGFydGl0aW9uUG9zaXRpb24uamF2YQppbmRleCAzYjQ1YzZjLi41ZTFkNjE4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9QYXJ0aXRpb25Qb3NpdGlvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1BhcnRpdGlvblBvc2l0aW9uLmphdmEKQEAgLTI0LDggKzI0LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOwogCi1wdWJsaWMgaW50ZXJmYWNlIFBhcnRpdGlvblBvc2l0aW9uIGV4dGVuZHMgUmluZ1Bvc2l0aW9uPFBhcnRpdGlvblBvc2l0aW9uPgorcHVibGljIGludGVyZmFjZSBQYXJ0aXRpb25Qb3NpdGlvbiBleHRlbmRzIFJpbmdQb3NpdGlvbjxQYXJ0aXRpb25Qb3NpdGlvbj4sIEJ5dGVDb21wYXJhYmxlCiB7CiAgICAgcHVibGljIHN0YXRpYyBlbnVtIEtpbmQKICAgICB7CkBAIC01NCw2ICs1NiwyNyBAQAogICAgIHB1YmxpYyBLaW5kIGtpbmQoKTsKICAgICBwdWJsaWMgYm9vbGVhbiBpc01pbmltdW0oKTsKIAorICAgIC8qKgorICAgICAqIFByb2R1Y2UgYSBwcmVmaXgtZnJlZSBieXRlLWNvbXBhcmFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGtleSwgaS5lLiBzdWNoIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgdGhhdCBhbnkgcGFpciB4LCB5CisgICAgICogb2YgdmFsaWQgcG9zaXRpb25zICh3aXRoIHRoZSBzYW1lIGtleSBjb2x1bW4gdHlwZXMgYW5kIHBhcnRpdGlvbmVyKSwKKyAgICAgKiAgIHguY29tcGFyZVRvKHkpID09IGNvbXBhcmVMZXhpY29ncmFwaGljYWxseVVuc2lnbmVkKHguYXNDb21wYXJhYmxlQnl0ZXMoKSwgeS5hc0NvbXBhcmFibGVCeXRlcygpKQorICAgICAqIGFuZAorICAgICAqICAgeC5hc0NvbXBhcmFibGVCeXRlcygpIGlzIG5vdCBhIHByZWZpeCBvZiB5LmFzQ29tcGFyYWJsZUJ5dGVzKCkKKyAgICAgKgorICAgICAqIFdlIHVzZSBhIHR3by1jb21wb25lbnQgdHVwbGUgZm9yIGRlY29yYXRlZCBrZXlzLCBhbmQgYSBvbmUtY29tcG9uZW50IHR1cGxlIGZvciBrZXkgYm91bmRzLCB3aGVyZSB0aGUgdGVybWluYXRvcgorICAgICAqIGJ5dGUgaXMgY2hvc2VuIHRvIHlpZWxkIHRoZSBjb3JyZWN0IGNvbXBhcmlzb24gcmVzdWx0LiBObyBkZWNvcmF0ZWQga2V5IGNhbiBiZSBhIHByZWZpeCBvZiBhbm90aGVyIChwZXIgdGhlIHR1cGxlCisgICAgICogZW5jb2RpbmcpLCBhbmQgbm8ga2V5IGJvdW5kIGNhbiBiZSBhIHByZWZpeCBvZiBvbmUgYmVjYXVzZSBpdCB1c2VzIGEgdGVybWluYXRvciBieXRlIHRoYXQgaXMgZGlmZmVyZW50IGZyb20gdGhlCisgICAgICogdHVwbGUgc2VwYXJhdG9yLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKFZlcnNpb24gdmVyc2lvbik7CisKKyAgICAvKioKKyAgICAgKiBQcm9kdWNlIGEgYnl0ZS1jb21wYXJhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgcG9zaXRpb24gYmVmb3JlIG9yIGFmdGVyIHRoZSBrZXkuCisgICAgICogVGhpcyBkb2VzIG5vdGhpbmcgZm9yIHRva2VuIGJvdW5kYXJpZXMgKHdoaWNoIGFyZSBhbHJlYWR5IGF0IGEgcG9zaXRpb24gYmV0d2VlbiB2YWxpZCBrZXlzKSwgYW5kIGNoYW5nZXMKKyAgICAgKiB0aGUgdGVybWluYXRvciBieXRlIGZvciBrZXlzLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBCeXRlQ29tcGFyYWJsZSBhc0NvbXBhcmFibGVCb3VuZChib29sZWFuIGJlZm9yZSk7CisKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJvd1Bvc2l0aW9uU2VyaWFsaXplciBpbXBsZW1lbnRzIElQYXJ0aXRpb25lckRlcGVuZGVudFNlcmlhbGl6ZXI8UGFydGl0aW9uUG9zaXRpb24+CiAgICAgewogICAgICAgICAvKgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvUGFydGl0aW9uUmFuZ2VSZWFkQ29tbWFuZC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvUGFydGl0aW9uUmFuZ2VSZWFkQ29tbWFuZC5qYXZhCmluZGV4IGYwMDBkNjMuLjE2NGUwM2MgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1BhcnRpdGlvblJhbmdlUmVhZENvbW1hbmQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9QYXJ0aXRpb25SYW5nZVJlYWRDb21tYW5kLmphdmEKQEAgLTE4LDEyICsxOCwxMSBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWwuVmlydHVhbEtleXNwYWNlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbC5WaXJ0dWFsVGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ2x1c3RlcmluZ0luZGV4RmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CkBAIC0zNiwxNCArMzUsMTcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5CYXNlUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJhbnNmb3JtLlJUQm91bmRWYWxpZGF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJhbnNmb3JtLlRyYW5zZm9ybWF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWwuVmlydHVhbEtleXNwYWNlUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbC5WaXJ0dWFsVGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkFic3RyYWN0Qm91bmRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Cb3VuZHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5SZXF1ZXN0RXhlY3V0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LkluZGV4OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVJlYWRzTGlzdGVuZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlRhYmxlTWV0cmljczsKQEAgLTYyLDYgKzY0LDcgQEAKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFNlbGVjdGlvbkRlc2VyaWFsaXplciBzZWxlY3Rpb25EZXNlcmlhbGl6ZXIgPSBuZXcgRGVzZXJpYWxpemVyKCk7CiAKICAgICBwcm90ZWN0ZWQgZmluYWwgRGF0YVJhbmdlIGRhdGFSYW5nZTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgU2xpY2VzIHJlcXVlc3RlZFNsaWNlczsKIAogICAgIHByaXZhdGUgUGFydGl0aW9uUmFuZ2VSZWFkQ29tbWFuZChib29sZWFuIGlzRGlnZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlnZXN0VmVyc2lvbiwKQEAgLTc3LDYgKzgwLDggQEAKICAgICB7CiAgICAgICAgIHN1cGVyKEtpbmQuUEFSVElUSU9OX1JBTkdFLCBpc0RpZ2VzdCwgZGlnZXN0VmVyc2lvbiwgYWNjZXB0c1RyYW5zaWVudCwgbWV0YWRhdGEsIG5vd0luU2VjLCBjb2x1bW5GaWx0ZXIsIHJvd0ZpbHRlciwgbGltaXRzLCBpbmRleCwgdHJhY2tXYXJuaW5ncyk7CiAgICAgICAgIHRoaXMuZGF0YVJhbmdlID0gZGF0YVJhbmdlOworICAgICAgICB0aGlzLnJlcXVlc3RlZFNsaWNlcyA9IGRhdGFSYW5nZS5jbHVzdGVyaW5nSW5kZXhGaWx0ZXIuZ2V0U2xpY2VzKG1ldGFkYXRhKCkpOworCiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgUGFydGl0aW9uUmFuZ2VSZWFkQ29tbWFuZCBjcmVhdGUoYm9vbGVhbiBpc0RpZ2VzdCwKQEAgLTMxMSw2ICszMTYsNyBAQAogICAgIH0KIAogICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCiAgICAgcHVibGljIFVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvciBxdWVyeVN0b3JhZ2UoZmluYWwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBSZWFkRXhlY3V0aW9uQ29udHJvbGxlciBjb250cm9sbGVyKQogICAgIHsKICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUuVmlld0ZyYWdtZW50IHZpZXcgPSBjZnMuc2VsZWN0KFZpZXcuc2VsZWN0TGl2ZShkYXRhUmFuZ2UoKS5rZXlSYW5nZSgpKSk7CkBAIC0zMjksMjAgKzMzNSw0MyBAQAogICAgICAgICAgICAgICAgIGlucHV0Q29sbGVjdG9yLmFkZE1lbXRhYmxlSXRlcmF0b3IoUlRCb3VuZFZhbGlkYXRvci52YWxpZGF0ZShpdGVyLCBSVEJvdW5kVmFsaWRhdG9yLlN0YWdlLk1FTVRBQkxFLCBmYWxzZSkpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpbnQgc2VsZWN0ZWRTU1RhYmxlc0NudCA9IDA7CiAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHZpZXcuc3N0YWJsZXMpCiAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBpbnRlcnNlY3RzID0gaW50ZXJzZWN0cyhzc3RhYmxlKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25zID0gaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnMoc3N0YWJsZSk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNSZXF1aXJlZFN0YXRpY3MgPSBoYXNSZXF1aXJlZFN0YXRpY3Moc3N0YWJsZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIWludGVyc2VjdHMgJiYgIWhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25zICYmICFoYXNSZXF1aXJlZFN0YXRpY3MpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCiAgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gV2UgY2xvc2Ugb24gZXhjZXB0aW9uIGFuZCBvbiBjbG9zaW5nIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QKICAgICAgICAgICAgICAgICBVbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3IgaXRlciA9IHNzdGFibGUucGFydGl0aW9uSXRlcmF0b3IoY29sdW1uRmlsdGVyKCksIGRhdGFSYW5nZSgpLCByZWFkQ291bnRVcGRhdGVyKTsKICAgICAgICAgICAgICAgICBpbnB1dENvbGxlY3Rvci5hZGRTU1RhYmxlSXRlcmF0b3Ioc3N0YWJsZSwgUlRCb3VuZFZhbGlkYXRvci52YWxpZGF0ZShpdGVyLCBSVEJvdW5kVmFsaWRhdG9yLlN0YWdlLlNTVEFCTEUsIGZhbHNlKSk7CiAKICAgICAgICAgICAgICAgICBpZiAoIXNzdGFibGUuaXNSZXBhaXJlZCgpKQogICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLnVwZGF0ZU1pbk9sZGVzdFVucmVwYWlyZWRUb21ic3RvbmUoc3N0YWJsZS5nZXRNaW5Mb2NhbERlbGV0aW9uVGltZSgpKTsKKworICAgICAgICAgICAgICAgIHNlbGVjdGVkU1NUYWJsZXNDbnQrKzsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IGZpbmFsU2VsZWN0ZWRTU1RhYmxlcyA9IHNlbGVjdGVkU1NUYWJsZXNDbnQ7CisKICAgICAgICAgICAgIC8vIGl0ZXJhdG9ycyBjYW4gYmUgZW1wdHkgZm9yIG9mZmxpbmUgdG9vbHMKICAgICAgICAgICAgIGlmIChpbnB1dENvbGxlY3Rvci5pc0VtcHR5KCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVtcHR5SXRlcmF0b3JzLnVuZmlsdGVyZWRQYXJ0aXRpb24obWV0YWRhdGEoKSk7CiAKLSAgICAgICAgICAgIHJldHVybiBjaGVja0NhY2hlRmlsdGVyKFVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcnMubWVyZ2VMYXppbHkoaW5wdXRDb2xsZWN0b3IuZmluYWxpemVJdGVyYXRvcnMoY2ZzLCBub3dJblNlYygpLCBjb250cm9sbGVyLm9sZGVzdFVucmVwYWlyZWRUb21ic3RvbmUoKSkpLCBjZnMpOworICAgICAgICAgICAgTGlzdDxVbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3I+IGZpbmFsaXplZEl0ZXJhdG9ycyA9IGlucHV0Q29sbGVjdG9yLmZpbmFsaXplSXRlcmF0b3JzKGNmcywgbm93SW5TZWMoKSwgY29udHJvbGxlci5vbGRlc3RVbnJlcGFpcmVkVG9tYnN0b25lKCkpOworICAgICAgICAgICAgVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yIG1lcmdlZCA9IFVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcnMubWVyZ2VMYXppbHkoZmluYWxpemVkSXRlcmF0b3JzKTsKKyAgICAgICAgICAgIHJldHVybiBjaGVja0NhY2hlRmlsdGVyKFRyYW5zZm9ybWF0aW9uLmFwcGx5KG1lcmdlZCwgbmV3IFRyYW5zZm9ybWF0aW9uPFVuZmlsdGVyZWRSb3dJdGVyYXRvcj4oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uQ2xvc2UoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIub25DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBjZnMubWV0cmljLnVwZGF0ZVNTVGFibGVJdGVyYXRlZEluUmFuZ2VSZWFkKGZpbmFsU2VsZWN0ZWRTU1RhYmxlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSksIGNmcyk7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gfCBFcnJvciBlKQogICAgICAgICB7CkBAIC0zNTgsNiArMzg3LDEyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbnRlcnNlY3RzKFNTVGFibGVSZWFkZXIgc3N0YWJsZSkKKyAgICB7CisgICAgICAgIHJldHVybiByZXF1ZXN0ZWRTbGljZXMuaW50ZXJzZWN0cyhzc3RhYmxlLmdldFNTVGFibGVNZXRhZGF0YSgpLmNvdmVyZWRDbHVzdGVyaW5nKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBTU1RhYmxlUmVhZHNMaXN0ZW5lcn0gdG8gdXBkYXRlIHRoZSBTU1RhYmxlcyByZWFkIGNvdW50cy4KICAgICAgKiBAcmV0dXJuIGEgbmV3IHtAY29kZSBTU1RhYmxlUmVhZHNMaXN0ZW5lcn0gdG8gdXBkYXRlIHRoZSBTU1RhYmxlcyByZWFkIGNvdW50cy4KQEAgLTU0NSw0ICs1ODAsNCBAQAogICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGlvbkNvbnRyb2xsZXIoKTsKICAgICAgICAgfQogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9SZWFkQ29tbWFuZC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvUmVhZENvbW1hbmQuamF2YQppbmRleCAzNThkNDA4Li45Y2ZjYjNhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9SZWFkQ29tbWFuZC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1JlYWRDb21tYW5kLmphdmEKQEAgLTM2LDYgKzM2LDcgQEAKIGltcG9ydCBpby5uZXR0eS51dGlsLmNvbmN1cnJlbnQuRmFzdFRocmVhZExvY2FsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuUXVlcnlDYW5jZWxsZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2VGbGFnOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5QYXJhbVR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlZlcmI7CkBAIC04NCw3ICs4NSw3IEBACiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWFkQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0UmVhZFF1ZXJ5CiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFU1RfSVRFUkFUSU9OX0RFTEFZX01JTExJUyA9IEludGVnZXIucGFyc2VJbnQoU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEudGVzdC5yZWFkX2l0ZXJhdGlvbl9kZWxheV9tcyIsICIwIikpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVNUX0lURVJBVElPTl9ERUxBWV9NSUxMSVMgPSBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9SRUFEX0lURVJBVElPTl9ERUxBWV9NUy5nZXRJbnQoKTsKIAogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFJlYWRDb21tYW5kLmNsYXNzKTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElWZXJzaW9uZWRTZXJpYWxpemVyPFJlYWRDb21tYW5kPiBzZXJpYWxpemVyID0gbmV3IFNlcmlhbGl6ZXIoKTsKQEAgLTQyMiw3ICs0MjMsOCBAQAogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaXRlcmF0b3IgPSB3aXRoUXVlcnlTaXplVHJhY2tpbmcoaXRlcmF0b3IpOwotICAgICAgICAgICAgICAgIGl0ZXJhdG9yID0gd2l0aFN0YXRlVHJhY2tpbmcoaXRlcmF0b3IpOworICAgICAgICAgICAgICAgIGl0ZXJhdG9yID0gbWF5YmVTbG93RG93bkZvclRlc3RpbmcoaXRlcmF0b3IpOworICAgICAgICAgICAgICAgIGl0ZXJhdG9yID0gd2l0aFF1ZXJ5Q2FuY2VsbGF0aW9uKGl0ZXJhdG9yKTsKICAgICAgICAgICAgICAgICBpdGVyYXRvciA9IFJUQm91bmRWYWxpZGF0b3IudmFsaWRhdGUod2l0aG91dFB1cmdlYWJsZVRvbWJzdG9uZXMoaXRlcmF0b3IsIGNmcywgZXhlY3V0aW9uQ29udHJvbGxlciksIFN0YWdlLlBVUkdFRCwgZmFsc2UpOwogICAgICAgICAgICAgICAgIGl0ZXJhdG9yID0gd2l0aE1ldHJpY3NSZWNvcmRpbmcoaXRlcmF0b3IsIGNmcy5tZXRyaWMsIHN0YXJ0VGltZU5hbm9zKTsKIApAQCAtNDk5LDcgKzUwMSw5IEBACiAgICAgICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZW5mb3JjZVN0cmljdExpdmVuZXNzID0gbWV0YWRhdGEoKS5lbmZvcmNlU3RyaWN0TGl2ZW5lc3MoKTsKIAogICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbGl2ZVJvd3MgPSAwOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbGFzdFJlcG9ydGVkTGl2ZVJvd3MgPSAwOwogICAgICAgICAgICAgcHJpdmF0ZSBpbnQgdG9tYnN0b25lcyA9IDA7CisgICAgICAgICAgICBwcml2YXRlIGludCBsYXN0UmVwb3J0ZWRUb21ic3RvbmVzID0gMDsKIAogICAgICAgICAgICAgcHJpdmF0ZSBEZWNvcmF0ZWRLZXkgY3VycmVudEtleTsKIApAQCAtNTY3LDYgKzU3MSwyMiBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUGFydGl0aW9uQ2xvc2UoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBsciA9IGxpdmVSb3dzIC0gbGFzdFJlcG9ydGVkTGl2ZVJvd3M7CisgICAgICAgICAgICAgICAgaW50IHRzID0gdG9tYnN0b25lcyAtIGxhc3RSZXBvcnRlZFRvbWJzdG9uZXM7CisKKyAgICAgICAgICAgICAgICBpZiAobHIgPiAwKQorICAgICAgICAgICAgICAgICAgICBtZXRyaWMudG9wUmVhZFBhcnRpdGlvblJvd0NvdW50LmFkZFNhbXBsZShjdXJyZW50S2V5LmdldEtleSgpLCBscik7CisKKyAgICAgICAgICAgICAgICBpZiAodHMgPiAwKQorICAgICAgICAgICAgICAgICAgICBtZXRyaWMudG9wUmVhZFBhcnRpdGlvblRvbWJzdG9uZUNvdW50LmFkZFNhbXBsZShjdXJyZW50S2V5LmdldEtleSgpLCB0cyk7CisKKyAgICAgICAgICAgICAgICBsYXN0UmVwb3J0ZWRMaXZlUm93cyA9IGxpdmVSb3dzOworICAgICAgICAgICAgICAgIGxhc3RSZXBvcnRlZFRvbWJzdG9uZXMgPSB0b21ic3RvbmVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xvc2UoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHJlY29yZExhdGVuY3kobWV0cmljLCBuYW5vVGltZSgpIC0gc3RhcnRUaW1lTmFub3MpOwpAQCAtNjAxLDU4ICs2MjEsNiBAQAogICAgICAgICByZXR1cm4gVHJhbnNmb3JtYXRpb24uYXBwbHkoaXRlciwgbmV3IE1ldHJpY1JlY29yZGluZygpKTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgY2xhc3MgQ2hlY2tGb3JBYm9ydCBleHRlbmRzIFN0b3BwaW5nVHJhbnNmb3JtYXRpb248VW5maWx0ZXJlZFJvd0l0ZXJhdG9yPgotICAgIHsKLSAgICAgICAgbG9uZyBsYXN0Q2hlY2tlZCA9IDA7Ci0KLSAgICAgICAgcHJvdGVjdGVkIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBhcHBseVRvUGFydGl0aW9uKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBwYXJ0aXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtYXliZUFib3J0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGFydGl0aW9uLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBUcmFuc2Zvcm1hdGlvbi5hcHBseShwYXJ0aXRpb24sIHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFJvdyBhcHBseVRvUm93KFJvdyByb3cpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChURVNUX0lURVJBVElPTl9ERUxBWV9NSUxMSVMgPiAwKQotICAgICAgICAgICAgICAgIG1heWJlRGVsYXlGb3JUZXN0aW5nKCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBtYXliZUFib3J0KCkgPyBudWxsIDogcm93OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1heWJlQWJvcnQoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRPRE86IHRoaXMgaXMgbm90IGEgZ3JlYXQgd2F5IHRvIGFib3J0IGVhcmx5OyB3aHkgbm90IGV4cHJlc3NseSBsaW1pdCBjaGVja3MgdG8gMTBtcyBpbnRlcnZhbHM/Ci0gICAgICAgICAgICAgKiBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgYXBwcm94VGltZS5ub3coKSBpcyB1cGRhdGVkIG9ubHkgZXZlcnkKLSAgICAgICAgICAgICAqIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Nb25vdG9uaWNDbG9jay5TYW1wbGVkQ2xvY2suQ0hFQ0tfSU5URVJWQUxfTVN9LCBieSBkZWZhdWx0IDIgbWlsbGlzLiBTaW5jZSBNb25pdG9yYWJsZUltcGwKLSAgICAgICAgICAgICAqIHJlbGllcyBvbiBhcHByb3hUaW1lLCB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIHVubGVzcyB0aGUgYXBwcm94aW1hdGUgdGltZSBoYXMgZWxhcHNlZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKGxhc3RDaGVja2VkID09IGFwcHJveFRpbWUubm93KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBsYXN0Q2hlY2tlZCA9IGFwcHJveFRpbWUubm93KCk7Ci0KLSAgICAgICAgICAgIGlmIChpc0Fib3J0ZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdG9wKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBtYXliZURlbGF5Rm9yVGVzdGluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghbWV0YWRhdGEoKS5rZXlzcGFjZS5zdGFydHNXaXRoKCJzeXN0ZW0iKSkKLSAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5zbGVlcFF1aWV0bHkoVEVTVF9JVEVSQVRJT05fREVMQVlfTUlMTElTKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRUcmFja1NpemUoRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kIHdhcm5UaHJlc2hvbGRCeXRlcywgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kIGFib3J0VGhyZXNob2xkQnl0ZXMpCiAgICAgewogICAgICAgICByZXR1cm4gdHJhY2tXYXJuaW5ncwpAQCAtNzM3LDkgKzcwNSw3NCBAQAogICAgICAgICByZXR1cm4gaXRlcmF0b3I7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvciB3aXRoU3RhdGVUcmFja2luZyhVbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3IgaXRlcikKKyAgICBwcml2YXRlIGNsYXNzIFF1ZXJ5Q2FuY2VsbGF0aW9uQ2hlY2tlciBleHRlbmRzIFN0b3BwaW5nVHJhbnNmb3JtYXRpb248VW5maWx0ZXJlZFJvd0l0ZXJhdG9yPgogICAgIHsKLSAgICAgICAgcmV0dXJuIFRyYW5zZm9ybWF0aW9uLmFwcGx5KGl0ZXIsIG5ldyBDaGVja0ZvckFib3J0KCkpOworICAgICAgICBsb25nIGxhc3RDaGVja2VkQXQgPSAwOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGFwcGx5VG9QYXJ0aXRpb24oVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHBhcnRpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgbWF5YmVDYW5jZWwoKTsKKyAgICAgICAgICAgIHJldHVybiBUcmFuc2Zvcm1hdGlvbi5hcHBseShwYXJ0aXRpb24sIHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBSb3cgYXBwbHlUb1JvdyhSb3cgcm93KQorICAgICAgICB7CisgICAgICAgICAgICBtYXliZUNhbmNlbCgpOworICAgICAgICAgICAgcmV0dXJuIHJvdzsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBtYXliZUNhbmNlbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgYXBwcm94VGltZS5ub3coKSBpcyB1cGRhdGVkIG9ubHkgZXZlcnkKKyAgICAgICAgICAgICAqIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Nb25vdG9uaWNDbG9jay5TYW1wbGVkQ2xvY2suQ0hFQ0tfSU5URVJWQUxfTVN9LCBieSBkZWZhdWx0IDIgbWlsbGlzLgorICAgICAgICAgICAgICogU2luY2UgTW9uaXRvcmFibGVJbXBsIHJlbGllcyBvbiBhcHByb3hUaW1lLCB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIHVubGVzcyB0aGUgYXBwcm94aW1hdGUgdGltZSBoYXMgZWxhcHNlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGxhc3RDaGVja2VkQXQgPT0gYXBwcm94VGltZS5ub3coKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBsYXN0Q2hlY2tlZEF0ID0gYXBwcm94VGltZS5ub3coKTsKKworICAgICAgICAgICAgaWYgKGlzQWJvcnRlZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0b3AoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlDYW5jZWxsZWRFeGNlcHRpb24oUmVhZENvbW1hbmQudGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvciB3aXRoUXVlcnlDYW5jZWxsYXRpb24oVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yIGl0ZXIpCisgICAgeworICAgICAgICByZXR1cm4gVHJhbnNmb3JtYXRpb24uYXBwbHkoaXRlciwgbmV3IFF1ZXJ5Q2FuY2VsbGF0aW9uQ2hlY2tlcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgQSB0cmFuc2Zvcm1hdGlvbiB1c2VkIGZvciBzaW11bGF0aW5nIHNsb3cgcXVlcmllcyBieSB0ZXN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEZWxheUluamVjdG9yIGV4dGVuZHMgVHJhbnNmb3JtYXRpb248VW5maWx0ZXJlZFJvd0l0ZXJhdG9yPgorICAgIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkUm93SXRlcmF0b3IgYXBwbHlUb1BhcnRpdGlvbihVbmZpbHRlcmVkUm93SXRlcmF0b3IgcGFydGl0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBGQlV0aWxpdGllcy5zbGVlcFF1aWV0bHkoVEVTVF9JVEVSQVRJT05fREVMQVlfTUlMTElTKTsKKyAgICAgICAgICAgIHJldHVybiBUcmFuc2Zvcm1hdGlvbi5hcHBseShwYXJ0aXRpb24sIHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBSb3cgYXBwbHlUb1JvdyhSb3cgcm93KQorICAgICAgICB7CisgICAgICAgICAgICBGQlV0aWxpdGllcy5zbGVlcFF1aWV0bHkoVEVTVF9JVEVSQVRJT05fREVMQVlfTUlMTElTKTsKKyAgICAgICAgICAgIHJldHVybiByb3c7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvciBtYXliZVNsb3dEb3duRm9yVGVzdGluZyhVbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3IgaXRlcikKKyAgICB7CisgICAgICAgIGlmIChURVNUX0lURVJBVElPTl9ERUxBWV9NSUxMSVMgPiAwICYmICFTY2hlbWFDb25zdGFudHMuaXNTeXN0ZW1LZXlzcGFjZShtZXRhZGF0YSgpLmtleXNwYWNlKSkKKyAgICAgICAgICAgIHJldHVybiBUcmFuc2Zvcm1hdGlvbi5hcHBseShpdGVyLCBuZXcgRGVsYXlJbmplY3RvcigpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGl0ZXI7CiAgICAgfQogCiAgICAgLyoqCkBAIC03NTUsNiArNzg4LDE5IEBACiAgICAgICAgIHJldHVybiBtc2c7CiAgICAgfQogCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaW50ZXJzZWN0cyhTU1RhYmxlUmVhZGVyIHNzdGFibGUpOworCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzUmVxdWlyZWRTdGF0aWNzKFNTVGFibGVSZWFkZXIgc3N0YWJsZSkgeworICAgICAgICAvLyBJZiBzb21lIHN0YXRpYyBjb2x1bW5zIGFyZSBxdWVyaWVkLCB3ZSBzaG91bGQgYWx3YXlzIGluY2x1ZGUgdGhlIHNzdGFibGU6IHRoZSBjbHVzdGVyaW5nIHZhbHVlcyBzdGF0cyBvZiB0aGUgc3N0YWJsZQorICAgICAgICAvLyBkb24ndCB0ZWxsIHVzIGlmIHRoZSBzc3RhYmxlIGNvbnRhaW5zIHN0YXRpYyB2YWx1ZXMgaW4gcGFydGljdWxhci4KKyAgICAgICAgcmV0dXJuICFjb2x1bW5GaWx0ZXIoKS5mZXRjaGVkQ29sdW1ucygpLnN0YXRpY3MuaXNFbXB0eSgpICYmIHNzdGFibGUuaGVhZGVyLmhhc1N0YXRpYygpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25zKFNTVGFibGVSZWFkZXIgc3N0YWJsZSkKKyAgICB7CisgICAgICAgIHJldHVybiBzc3RhYmxlLmdldFNTVGFibGVNZXRhZGF0YSgpLmhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25zOworICAgIH0KKwogICAgIHB1YmxpYyBhYnN0cmFjdCBWZXJiIHZlcmIoKTsKIAogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFwcGVuZENRTFdoZXJlQ2xhdXNlKFN0cmluZ0J1aWxkZXIgc2IpOwpAQCAtMTAyMiw3ICsxMDY4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfCBhY2NlcHRzVHJhbnNpZW50RmxhZyhjb21tYW5kLmFjY2VwdHNUcmFuc2llbnQoKSkKICAgICAgICAgICAgICk7CiAgICAgICAgICAgICBpZiAoY29tbWFuZC5pc0RpZ2VzdFF1ZXJ5KCkpCi0gICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGNvbW1hbmQuZGlnZXN0VmVyc2lvbigpKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihjb21tYW5kLmRpZ2VzdFZlcnNpb24oKSk7CiAgICAgICAgICAgICBjb21tYW5kLm1ldGFkYXRhKCkuaWQuc2VyaWFsaXplKG91dCk7CiAgICAgICAgICAgICBvdXQud3JpdGVJbnQoY29tbWFuZC5ub3dJblNlYygpKTsKICAgICAgICAgICAgIENvbHVtbkZpbHRlci5zZXJpYWxpemVyLnNlcmlhbGl6ZShjb21tYW5kLmNvbHVtbkZpbHRlcigpLCBvdXQsIHZlcnNpb24pOwpAQCAtMTA0OSw3ICsxMDk1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ1cGdyYWRpbmcgdG8gNC4wIik7CiAKICAgICAgICAgICAgIGJvb2xlYW4gaGFzSW5kZXggPSBoYXNJbmRleChmbGFncyk7Ci0gICAgICAgICAgICBpbnQgZGlnZXN0VmVyc2lvbiA9IGlzRGlnZXN0ID8gKGludClpbi5yZWFkVW5zaWduZWRWSW50KCkgOiAwOworICAgICAgICAgICAgaW50IGRpZ2VzdFZlcnNpb24gPSBpc0RpZ2VzdCA/IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpIDogMDsKICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEgPSBzY2hlbWEuZ2V0RXhpc3RpbmdUYWJsZU1ldGFkYXRhKFRhYmxlSWQuZGVzZXJpYWxpemUoaW4pKTsKICAgICAgICAgICAgIGludCBub3dJblNlYyA9IGluLnJlYWRJbnQoKTsKICAgICAgICAgICAgIENvbHVtbkZpbHRlciBjb2x1bW5GaWx0ZXIgPSBDb2x1bW5GaWx0ZXIuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbiwgdmVyc2lvbiwgbWV0YWRhdGEpOwpAQCAtMTA5MCw0ICsxMTM2LDQgQEAKICAgICAgICAgICAgICAgICAgICArIGNvbW1hbmQuaW5kZXhTZXJpYWxpemVkU2l6ZSh2ZXJzaW9uKTsKICAgICAgICAgfQogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9SZWFkQ29tbWFuZFZlcmJIYW5kbGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9SZWFkQ29tbWFuZFZlcmJIYW5kbGVyLmphdmEKaW5kZXggOTIyNjU2OC4uZjY5M2JiYyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvUmVhZENvbW1hbmRWZXJiSGFuZGxlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1JlYWRDb21tYW5kVmVyYkhhbmRsZXIuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuUXVlcnlDYW5jZWxsZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SZXBsaWNhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5JVmVyYkhhbmRsZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2U7CkBAIC03NywxOCArNzgsMjkgQEAKICAgICAgICAgICAgIE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS5zZW5kKHJlcGx5LCBtZXNzYWdlLmZyb20oKSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEFzc2VydGlvbkVycm9yIHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihTdHJpbmcuZm9ybWF0KCJDYXVnaHQgYW4gZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIHByb2Nlc3MgdGhlIGNvbW1hbmQ6ICVzIiwgY29tbWFuZC50b0NRTFN0cmluZygpKSwgdCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFF1ZXJ5Q2FuY2VsbGVkRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiUXVlcnkgY2FuY2VsbGVkICh0aW1lb3V0KSIsIGUpOworICAgICAgICAgICAgcmVzcG9uc2UgPSBudWxsOworICAgICAgICAgICAgYXNzZXJ0ICFjb21tYW5kLmlzQ29tcGxldGVkKCkgOiAiUmVhZCBtYXJrZWQgYXMgY29tcGxldGVkIGRlc3BpdGUgYmVpbmcgYWJvcnRlZCBieSB0aW1lb3V0IHRvIHRhYmxlICIgKyBjb21tYW5kLm1ldGFkYXRhKCk7CisgICAgICAgIH0KIAotICAgICAgICBpZiAoIWNvbW1hbmQuY29tcGxldGUoKSkKKyAgICAgICAgaWYgKGNvbW1hbmQuY29tcGxldGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgVHJhY2luZy50cmFjZSgiRW5xdWV1aW5nIHJlc3BvbnNlIHRvIHt9IiwgbWVzc2FnZS5mcm9tKCkpOworICAgICAgICAgICAgTWVzc2FnZTxSZWFkUmVzcG9uc2U+IHJlcGx5ID0gbWVzc2FnZS5yZXNwb25zZVdpdGgocmVzcG9uc2UpOworICAgICAgICAgICAgcmVwbHkgPSBNZXNzYWdlUGFyYW1zLmFkZFRvTWVzc2FnZShyZXBseSk7CisgICAgICAgICAgICBNZXNzYWdpbmdTZXJ2aWNlLmluc3RhbmNlKCkuc2VuZChyZXBseSwgbWVzc2FnZS5mcm9tKCkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICAgVHJhY2luZy50cmFjZSgiRGlzY2FyZGluZyBwYXJ0aWFsIHJlc3BvbnNlIHRvIHt9ICh0aW1lZCBvdXQpIiwgbWVzc2FnZS5mcm9tKCkpOwogICAgICAgICAgICAgTWVzc2FnaW5nU2VydmljZS5pbnN0YW5jZSgpLm1ldHJpY3MucmVjb3JkRHJvcHBlZE1lc3NhZ2UobWVzc2FnZSwgbWVzc2FnZS5lbGFwc2VkU2luY2VDcmVhdGVkKE5BTk9TRUNPTkRTKSwgTkFOT1NFQ09ORFMpOwotICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0KLSAgICAgICAgVHJhY2luZy50cmFjZSgiRW5xdWV1aW5nIHJlc3BvbnNlIHRvIHt9IiwgbWVzc2FnZS5mcm9tKCkpOwotICAgICAgICBNZXNzYWdlPFJlYWRSZXNwb25zZT4gcmVwbHkgPSBtZXNzYWdlLnJlc3BvbnNlV2l0aChyZXNwb25zZSk7Ci0gICAgICAgIHJlcGx5ID0gTWVzc2FnZVBhcmFtcy5hZGRUb01lc3NhZ2UocmVwbHkpOwotICAgICAgICBNZXNzYWdpbmdTZXJ2aWNlLmluc3RhbmNlKCkuc2VuZChyZXBseSwgbWVzc2FnZS5mcm9tKCkpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVRyYW5zaWVudFN0YXR1cyhNZXNzYWdlPFJlYWRDb21tYW5kPiBtZXNzYWdlKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvUm93SW5kZXhFbnRyeS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvUm93SW5kZXhFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGY1M2E5Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1Jvd0luZGV4RW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLkhpc3RvZ3JhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5JTWVhc3VyYWJsZU1lbW9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YVN0b3JhZ2VTcGVjOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLlJvd0luZGV4RW50cnlSZWFkU2l6ZVRvb0xhcmdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLklTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSW5kZXhJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dEJ1ZmZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZURhdGFJbnB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SYW5kb21BY2Nlc3NSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5UcmFja2VkRGF0YUlucHV0UGx1czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkRlZmF1bHROYW1lRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLk1ldHJpY05hbWVGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5QYXJhbVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk9iamVjdFNpemVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnZpbnQuVkludENvZGluZzsKLWltcG9ydCBvcmcuZ2l0aHViLmphbW0uVW5tZXRlcmVkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2Fzc2FuZHJhTWV0cmljc1JlZ2lzdHJ5Lk1ldHJpY3M7Ci0KLS8qKgotICogQmluYXJ5IGZvcm1hdCBvZiB7QGNvZGUgUm93SW5kZXhFbnRyeX0gaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgotICoge0Bjb2RlCi0gKiAobG9uZykgcG9zaXRpb24gKDY0IGJpdCBsb25nLCB2aW50IGVuY29kZWQpCi0gKiAgKGludCkgc2VyaWFsaXplZCBzaXplIG9mIGRhdGEgdGhhdCBmb2xsb3dzICgzMiBiaXQgaW50LCB2aW50IGVuY29kZWQpCi0gKiAtLSBmb2xsb3dpbmcgZm9yIGluZGV4ZWQgZW50cmllcyBvbmx5IChzbyBzZXJpYWxpemVkIHNpemUgPiAwKQotICogIChpbnQpIERlbGV0aW9uVGltZS5sb2NhbERlbGV0aW9uVGltZQotICogKGxvbmcpIERlbGV0aW9uVGltZS5tYXJrZWRGb3JEZWxldGlvbkF0Ci0gKiAgKGludCkgbnVtYmVyIG9mIEluZGV4SW5mbyBvYmplY3RzICgzMiBiaXQgaW50LCB2aW50IGVuY29kZWQpCi0gKiAgICAoKikgc2VyaWFsaXplZCBJbmRleEluZm8gb2JqZWN0cywgc2VlIGJlbG93Ci0gKiAgICAoKikgb2Zmc2V0cyBvZiBzZXJpYWxpemVkIEluZGV4SW5mbyBvYmplY3RzLCBzaW5jZSB2ZXJzaW9uICJtYSIgKDMuMCkKLSAqICAgICAgICBFYWNoIEluZGV4SW5mbyBvYmplY3QncyBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlIGZpcnN0IEluZGV4SW5mbyBvYmplY3QuCi0gKiB9Ci0gKiA8cD4KLSAqIFNlZSB7QGxpbmsgSW5kZXhJbmZvfSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc2VyaWFsaXplZCBmb3JtYXQuCi0gKiA8L3A+Ci0gKgotICogPHA+Ci0gKiBGb3IgZWFjaCBwYXJ0aXRpb24sIHRoZSBsYXlvdXQgb2YgdGhlIGluZGV4IGZpbGUgbG9va3MgbGlrZSB0aGlzOgotICogPC9wPgotICogPG9sPgotICogICAgIDxsaT5wYXJ0aXRpb24ga2V5IC0gcHJlZml4ZWQgd2l0aCB7QGNvZGUgc2hvcnR9IGxlbmd0aDwvbGk+Ci0gKiAgICAgPGxpPnNlcmlhbGl6ZWQge0Bjb2RlIFJvd0luZGV4RW50cnl9IG9iamVjdHM8L2xpPgotICogPC9vbD4KLSAqCi0gKiA8cD4KLSAqICAgICBHZW5lcmFsbHksIHdlIGRpc3Rpbmd1aXNoIGJldHdlZW4gaW5kZXggZW50cmllcyB0aGF0IGhhdmUgPGk+aW5kZXgKLSAqICAgICBzYW1wbGVzPC9pPiAobGlzdCBvZiB7QGxpbmsgSW5kZXhJbmZvfSBvYmplY3RzKSBhbmQgdGhvc2Ugd2hvIGRvbid0LgotICogICAgIEZvciBlYWNoIDxpPnBvcnRpb248L2k+IG9mIGRhdGEgZm9yIGEgc2luZ2xlIHBhcnRpdGlvbiBpbiB0aGUgZGF0YSBmaWxlLAotICogICAgIGFuIGluZGV4IHNhbXBsZSBpcyBjcmVhdGVkLiBUaGUgc2l6ZSBvZiB0aGF0IDxpPnBvcnRpb248L2k+IGlzIGRlZmluZWQKLSAqICAgICBieSB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZyNjb2x1bW5faW5kZXhfc2l6ZX0uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqICAgICBJbmRleCBlbnRyaWVzIHdpdGggbGVzcyB0aGFuIDIgaW5kZXggc2FtcGxlcywgd2lsbCBqdXN0IHN0b3JlIHRoZQotICogICAgIHBvc2l0aW9uIGluIHRoZSBkYXRhIGZpbGUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqICAgICBOb3RlOiBsZWdhY3kgc3N0YWJsZXMgZm9yIGluZGV4IGVudHJpZXMgYXJlIHRob3NlIHNzdGFibGUgZm9ybWF0cyB0aGF0Ci0gKiAgICAgZG8gPGk+bm90PC9pPiBoYXZlIGFuIG9mZnNldHMgdGFibGUgdG8gaW5kZXggc2FtcGxlcyAoe0BsaW5rIEluZGV4SW5mb30KLSAqICAgICBvYmplY3RzKS4gVGhlc2UgYXJlIHRob3NlIHNzdGFibGVzIGNyZWF0ZWQgb24gQ2Fzc2FuZHJhIHZlcnNpb25zCi0gKiAgICAgZWFybGllciB0aGFuIDMuMC4KLSAqIDwvcD4KLSAqIDxwPgotICogICAgIEZvciBpbmRleCBlbnRyaWVzIHdpdGggaW5kZXggc2FtcGxlcyB3ZSBzdG9yZSB0aGUgaW5kZXggc2FtcGxlcwotICogICAgICh7QGxpbmsgSW5kZXhJbmZvfSBvYmplY3RzKS4gVGhlIGJpZ2dlciB0aGUgcGFydGl0aW9uLCB0aGUgbW9yZQotICogICAgIGluZGV4IHNhbXBsZXMgYXJlIGNyZWF0ZWQuIFNpbmNlIGEgaHVnZSBhbW91bnQgb2YgaW5kZXggc2FtcGxlcwotICogICAgIHdpbGwgInBvbGx1dGUiIHRoZSBoZWFwIGFuZCBjYXVzZSBodWdlIEdDIHByZXNzdXJlLCBDYXNzYW5kcmEgMy42Ci0gKiAgICAgKENBU1NBTkRSQS0xMTIwNikgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGluZGV4IGVudHJpZXMgd2l0aCBhbgotICogICAgICJhY2NlcHRhYmxlIiBhbW91bnQgb2YgaW5kZXggc2FtcGxlcyBwZXIgcGFydGl0aW9uIGFuZCB0aG9zZQotICogICAgIHdpdGggYW4gImVub3Jtb3VzIiBhbW91bnQgb2YgaW5kZXggc2FtcGxlcy4gVGhlIGJhcnJpZXIKLSAqICAgICBpcyBjb250cm9sbGVkIGJ5IHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcgotICogICAgIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnI2NvbHVtbl9pbmRleF9jYWNoZV9zaXplfS4KLSAqICAgICBJbmRleCBlbnRyaWVzIHdpdGggYSB0b3RhbCBzZXJpYWxpemVkIHNpemUgb2YgaW5kZXggc2FtcGxlcyB1cCB0bwotICogICAgIHtAY29kZSBjb2x1bW5faW5kZXhfY2FjaGVfc2l6ZX0gd2lsbCBiZSBoZWxkIGluIGFuIGFycmF5LgotICogICAgIEluZGV4IGVudHJpZXMgZXhjZWVkaW5nIHRoYXQgdmFsdWUgd2lsbCBhbHdheXMgYmUgYWNjZXNzZWQgZnJvbQotICogICAgIGRpc2suCi0gKiA8L3A+Ci0gKiA8cD4KLSAqICAgICBUaGlzIHJlc3VsdHMgaW4gdGhlc2UgY2xhc3NlczoKLSAqIDwvcD4KLSAqIDx1bD4KLSAqICAgICA8bGk+e0BsaW5rIFJvd0luZGV4RW50cnl9IGp1c3Qgc3RvcmVzIHRoZSBvZmZzZXQgaW4gdGhlIGRhdGEgZmlsZS48L2xpPgotICogICAgIDxsaT57QGxpbmsgSW5kZXhlZEVudHJ5fSBpcyBmb3IgaW5kZXggZW50cmllcyB3aXRoIGluZGV4IHNhbXBsZXMKLSAqICAgICBhbmQgdXNlZCBmb3IgYm90aCBjdXJyZW50IGFuZCBsZWdhY3kgc3N0YWJsZXMsIHdoaWNoIGRvIG5vdCBleGNlZWQKLSAqICAgICB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZyNjb2x1bW5faW5kZXhfY2FjaGVfc2l6ZX0uPC9saT4KLSAqICAgICA8bGk+e0BsaW5rIFNoYWxsb3dJbmRleGVkRW50cnl9IGlzIGZvciBpbmRleCBlbnRyaWVzIHdpdGggaW5kZXggc2FtcGxlcwotICogICAgIHRoYXQgZXhjZWVkIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnI2NvbHVtbl9pbmRleF9jYWNoZV9zaXplfQotICogICAgIGZvciBzc3RhYmxlcyB3aXRoIGFuIG9mZnNldCB0YWJsZSB0byB0aGUgaW5kZXggc2FtcGxlcy48L2xpPgotICogPC91bD4KLSAqIDxwPgotICogICAgIFNpbmNlIGFjY2VzcyB0byBpbmRleCBzYW1wbGVzIG9uIGRpc2sgKG9idmlvdXNseSkgcmVxdWlyZXMgc29tZSBmaWxlCi0gKiAgICAgcmVhZGVyLCB0aGF0IGZ1bmN0aW9uYWxpdHkgaXMgZW5jYXBzdWxhdGVkIGluIGltcGxlbWVudGF0aW9ucyBvZgotICogICAgIHtAbGluayBJbmRleEluZm9SZXRyaWV2ZXJ9LiBUaGVyZSBpcyBhbiBpbXBsZW1lbnRhdGlvbiB0byBhY2Nlc3MKLSAqICAgICBpbmRleCBzYW1wbGVzIG9mIGxlZ2FjeSBzc3RhYmxlcyAod2l0aG91dCB0aGUgb2Zmc2V0cyB0YWJsZSksCi0gKiAgICAgYW4gaW1wbGVtZW50YXRpb24gb2YgYWNjZXNzIHNzdGFibGVzIHdpdGggYW4gb2Zmc2V0cyB0YWJsZS4KLSAqIDwvcD4KLSAqIDxwPgotICogICAgIFVudGlsIG5vdyAoQ2Fzc2FuZHJhIDMueCksIHdlIHN0aWxsIHN1cHBvcnQgcmVhZGluZyBmcm9tIDxpPmxlZ2FjeTwvaT4gc3N0YWJsZXMgLQotICogICAgIGkuZS4gc3N0YWJsZXMgY3JlYXRlZCBieSBDYXNzYW5kcmEgJmx0OyAzLjAgKHNlZSB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdH0uCi0gKiA8L3A+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUm93SW5kZXhFbnRyeTxUPiBpbXBsZW1lbnRzIElNZWFzdXJhYmxlTWVtb3J5Ci17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBFTVBUWV9TSVpFID0gT2JqZWN0U2l6ZXMubWVhc3VyZShuZXcgUm93SW5kZXhFbnRyeSgwKSk7Ci0KLSAgICAvLyBjb25zdGFudHMgZm9yIHR5cGUgb2Ygcm93LWluZGV4LWVudHJ5IGFzIHNlcmlhbGl6ZWQgZm9yIHNhdmVkLWNhY2hlCi0gICAgc3RhdGljIGZpbmFsIGludCBDQUNIRV9OT1RfSU5ERVhFRCA9IDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDQUNIRV9JTkRFWEVEID0gMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IENBQ0hFX0lOREVYRURfU0hBTExPVyA9IDI7Ci0KLSAgICBzdGF0aWMgZmluYWwgSGlzdG9ncmFtIGluZGV4RW50cnlTaXplSGlzdG9ncmFtOwotICAgIHN0YXRpYyBmaW5hbCBIaXN0b2dyYW0gaW5kZXhJbmZvQ291bnRIaXN0b2dyYW07Ci0gICAgc3RhdGljIGZpbmFsIEhpc3RvZ3JhbSBpbmRleEluZm9HZXRzSGlzdG9ncmFtOwotICAgIHN0YXRpYyBmaW5hbCBIaXN0b2dyYW0gaW5kZXhJbmZvUmVhZHNIaXN0b2dyYW07Ci0gICAgc3RhdGljCi0gICAgewotICAgICAgICBNZXRyaWNOYW1lRmFjdG9yeSBmYWN0b3J5ID0gbmV3IERlZmF1bHROYW1lRmFjdG9yeSgiSW5kZXgiLCAiUm93SW5kZXhFbnRyeSIpOwotICAgICAgICBpbmRleEVudHJ5U2l6ZUhpc3RvZ3JhbSA9IE1ldHJpY3MuaGlzdG9ncmFtKGZhY3RvcnkuY3JlYXRlTWV0cmljTmFtZSgiSW5kZXhlZEVudHJ5U2l6ZSIpLCBmYWxzZSk7Ci0gICAgICAgIGluZGV4SW5mb0NvdW50SGlzdG9ncmFtID0gTWV0cmljcy5oaXN0b2dyYW0oZmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKCJJbmRleEluZm9Db3VudCIpLCBmYWxzZSk7Ci0gICAgICAgIGluZGV4SW5mb0dldHNIaXN0b2dyYW0gPSBNZXRyaWNzLmhpc3RvZ3JhbShmYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUoIkluZGV4SW5mb0dldHMiKSwgZmFsc2UpOwotICAgICAgICBpbmRleEluZm9SZWFkc0hpc3RvZ3JhbSA9IE1ldHJpY3MuaGlzdG9ncmFtKGZhY3RvcnkuY3JlYXRlTWV0cmljTmFtZSgiSW5kZXhJbmZvUmVhZHMiKSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBsb25nIHBvc2l0aW9uOwotCi0gICAgcHVibGljIFJvd0luZGV4RW50cnkobG9uZyBwb3NpdGlvbikKLSAgICB7Ci0gICAgICAgIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpbmRleCBlbnRyeSBjb250YWlucyB0aGUgcm93LWxldmVsIHRvbWJzdG9uZSBhbmQgY29sdW1uIHN1bW1hcnkuICBPdGhlcndpc2UsCi0gICAgICogY2FsbGVyIHNob3VsZCBmZXRjaCB0aGVzZSBmcm9tIHRoZSByb3cgaGVhZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSW5kZXhlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gY29sdW1uc0luZGV4Q291bnQoKSA+IDE7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaW5kZXhPbkhlYXAoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lKCkKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgY29sdW1uc0luZGV4Q291bnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgdW5zaGFyZWRIZWFwU2l6ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gRU1QVFlfU0laRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZGF0YUZpbGVQb3NpdGlvbiAgcG9zaXRpb24gb2YgdGhlIHBhcnRpdGlvbiBpbiB0aGUge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50LlR5cGUjREFUQX0gZmlsZQotICAgICAqIEBwYXJhbSBpbmRleEZpbGVQb3NpdGlvbiBwb3NpdGlvbiBpbiB0aGUge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50LlR5cGUjUFJJTUFSWV9JTkRFWH0gb2YgdGhlIHtAbGluayBSb3dJbmRleEVudHJ5fQotICAgICAqIEBwYXJhbSBkZWxldGlvblRpbWUgICAgICBkZWxldGlvbiB0aW1lIG9mIHtAbGluayBSb3dJbmRleEVudHJ5fQotICAgICAqIEBwYXJhbSBoZWFkZXJMZW5ndGggICAgICBkZWxldGlvbiB0aW1lIG9mIHtAbGluayBSb3dJbmRleEVudHJ5fQotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleENvdW50ICBudW1iZXIgb2Yge0BsaW5rIEluZGV4SW5mb30gZW50cmllcyBpbiB0aGUge0BsaW5rIFJvd0luZGV4RW50cnl9Ci0gICAgICogQHBhcmFtIGluZGV4ZWRQYXJ0U2l6ZSAgIHNlcmlhbGl6ZWQgc2l6ZSBvZiBhbGwgc2VyaWFsaXplZCB7QGxpbmsgSW5kZXhJbmZvfSBvYmplY3RzIGFuZCB0aGVpciBvZmZzZXRzCi0gICAgICogQHBhcmFtIGluZGV4U2FtcGxlcyAgICAgIGxpc3Qgd2l0aCBJbmRleEluZm8gb2Zmc2V0cyAoaWYgdG90YWwgc2VyaWFsaXplZCBzaXplIGlzIGxlc3MgdGhhbiB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZyNjb2x1bW5faW5kZXhfY2FjaGVfc2l6ZX0KLSAgICAgKiBAcGFyYW0gb2Zmc2V0cyAgICAgICAgICAgb2Zmc2V0cyBvZiBJbmRleEluZm8gb2Zmc2V0cwotICAgICAqIEBwYXJhbSBpZHhJbmZvU2VyaWFsaXplciB0aGUge0BsaW5rIEluZGV4SW5mb30gc2VyaWFsaXplcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUm93SW5kZXhFbnRyeTxJbmRleEluZm8+IGNyZWF0ZShsb25nIGRhdGFGaWxlUG9zaXRpb24sIGxvbmcgaW5kZXhGaWxlUG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUsIGxvbmcgaGVhZGVyTGVuZ3RoLCBpbnQgY29sdW1uSW5kZXhDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ZWRQYXJ0U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxJbmRleEluZm8+IGluZGV4U2FtcGxlcywgaW50W10gb2Zmc2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNlcmlhbGl6ZXI8SW5kZXhJbmZvPiBpZHhJbmZvU2VyaWFsaXplcikKLSAgICB7Ci0gICAgICAgIC8vIElmIHRoZSAicGFydGl0aW9uIGJ1aWxkaW5nIGNvZGUiIGluIEJpZ1RhYmxlV3JpdGVyLmFwcGVuZCgpIHZpYSBDb2x1bW5JbmRleCByZXR1cm5zIGEgbGlzdAotICAgICAgICAvLyBvZiBJbmRleEluZm8gb2JqZWN0cywgd2hpY2ggaXMgdGhlIGNhc2UgaWYgdGhlIHNlcmlhbGl6ZWQgc2l6ZSBpcyBsZXNzIHRoYW4KLSAgICAgICAgLy8gQ29uZmlnLmNvbHVtbl9pbmRleF9jYWNoZV9zaXplLCBBTkQgd2UgaGF2ZSBtb3JlIHRoYW4gb25lIEluZGV4SW5mbyBvYmplY3QsIHdlCi0gICAgICAgIC8vIGNvbnN0cnVjdCBhbiBJbmRleGVkRW50cnkgb2JqZWN0LiAobm90ZTogaW5kZXhTYW1wbGVzLnNpemUoKSBhbmQgY29sdW1uSW5kZXhDb3VudCBoYXZlIHRoZSBzYW1lIG1lYW5pbmcpCi0gICAgICAgIGlmIChpbmRleFNhbXBsZXMgIT0gbnVsbCAmJiBpbmRleFNhbXBsZXMuc2l6ZSgpID4gMSkKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhlZEVudHJ5KGRhdGFGaWxlUG9zaXRpb24sIGRlbGV0aW9uVGltZSwgaGVhZGVyTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhTYW1wbGVzLnRvQXJyYXkobmV3IEluZGV4SW5mb1tpbmRleFNhbXBsZXMuc2l6ZSgpXSksIG9mZnNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleGVkUGFydFNpemUsIGlkeEluZm9TZXJpYWxpemVyKTsKLSAgICAgICAgLy8gSGVyZSB3ZSBoYXZlIHRvIGRlY2lkZSB3aGV0aGVyIHdlIGhhdmUgc2VyaWFsaXplZCBJbmRleEluZm8gb2JqZWN0cyB0aGF0IGV4Y2VlZHMKLSAgICAgICAgLy8gQ29uZmlnLmNvbHVtbl9pbmRleF9jYWNoZV9zaXplIChub3QgZXhjZWVkaW5nIGNhc2UgY292ZXJlZCBhYm92ZSkuCi0gICAgICAgIC8vIFN1Y2ggYSAiYmlnIiBpbmRleGVkLWVudHJ5IGlzIHJlcHJlc2VudGVkIGFzIGEgc2hhbGxvdyBvbmUuCi0gICAgICAgIGlmIChjb2x1bW5JbmRleENvdW50ID4gMSkKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2hhbGxvd0luZGV4ZWRFbnRyeShkYXRhRmlsZVBvc2l0aW9uLCBpbmRleEZpbGVQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGlvblRpbWUsIGhlYWRlckxlbmd0aCwgY29sdW1uSW5kZXhDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleGVkUGFydFNpemUsIGlkeEluZm9TZXJpYWxpemVyKTsKLSAgICAgICAgLy8gTGFzdCBjYXNlIGlzIHRoYXQgdGhlcmUgYXJlIG5vIGluZGV4IHNhbXBsZXMuCi0gICAgICAgIHJldHVybiBuZXcgUm93SW5kZXhFbnRyeTw+KGRhdGFGaWxlUG9zaXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBJbmRleEluZm9SZXRyaWV2ZXIgb3BlbldpdGhJbmRleChGaWxlSGFuZGxlIGluZGV4RmlsZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnRlcmZhY2UgSW5kZXhTZXJpYWxpemVyPFQ+Ci0gICAgewotICAgICAgICB2b2lkIHNlcmlhbGl6ZShSb3dJbmRleEVudHJ5PFQ+IHJpZSwgRGF0YU91dHB1dFBsdXMgb3V0LCBCeXRlQnVmZmVyIGluZGV4SW5mbykgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgICAgIFJvd0luZGV4RW50cnk8VD4gZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbiwgbG9uZyBpbmRleEZpbGVQb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uOwotICAgICAgICBkZWZhdWx0IFJvd0luZGV4RW50cnk8VD4gZGVzZXJpYWxpemUoUmFuZG9tQWNjZXNzUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZShyZWFkZXIsIHJlYWRlci5nZXRGaWxlUG9pbnRlcigpKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdCBSb3dJbmRleEVudHJ5PFQ+IGRlc2VyaWFsaXplKEZpbGVEYXRhSW5wdXQgaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZGVzZXJpYWxpemUoaW5wdXQsIGlucHV0LmdldEZpbGVQb2ludGVyKCkpOwotCi0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNlcmlhbGl6ZUZvckNhY2hlKFJvd0luZGV4RW50cnk8VD4gcmllLCBEYXRhT3V0cHV0UGx1cyBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLSAgICAgICAgUm93SW5kZXhFbnRyeTxUPiBkZXNlcmlhbGl6ZUZvckNhY2hlKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgICAgICBsb25nIGRlc2VyaWFsaXplUG9zaXRpb25BbmRTa2lwKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgICAgICBJU2VyaWFsaXplcjxUPiBpbmRleEluZm9TZXJpYWxpemVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTZXJpYWxpemVyIGltcGxlbWVudHMgSW5kZXhTZXJpYWxpemVyPEluZGV4SW5mbz4KLSAgICB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSW5kZXhJbmZvLlNlcmlhbGl6ZXIgaWR4SW5mb1NlcmlhbGl6ZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgVmVyc2lvbiB2ZXJzaW9uOwotCi0gICAgICAgIHB1YmxpYyBTZXJpYWxpemVyKFZlcnNpb24gdmVyc2lvbiwgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuaWR4SW5mb1NlcmlhbGl6ZXIgPSBJbmRleEluZm8uc2VyaWFsaXplcih2ZXJzaW9uLCBoZWFkZXIpOwotICAgICAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJbmRleEluZm8uU2VyaWFsaXplciBpbmRleEluZm9TZXJpYWxpemVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGlkeEluZm9TZXJpYWxpemVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFJvd0luZGV4RW50cnk8SW5kZXhJbmZvPiByaWUsIERhdGFPdXRwdXRQbHVzIG91dCwgQnl0ZUJ1ZmZlciBpbmRleEluZm8pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICByaWUuc2VyaWFsaXplKG91dCwgaW5kZXhJbmZvKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZUZvckNhY2hlKFJvd0luZGV4RW50cnk8SW5kZXhJbmZvPiByaWUsIERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJpZS5zZXJpYWxpemVGb3JDYWNoZShvdXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFJvd0luZGV4RW50cnk8SW5kZXhJbmZvPiBkZXNlcmlhbGl6ZUZvckNhY2hlKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nIHBvc2l0aW9uID0gaW4ucmVhZFVuc2lnbmVkVkludCgpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKGluLnJlYWRCeXRlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBDQUNIRV9OT1RfSU5ERVhFRDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSb3dJbmRleEVudHJ5PD4ocG9zaXRpb24pOwotICAgICAgICAgICAgICAgIGNhc2UgQ0FDSEVfSU5ERVhFRDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbmRleGVkRW50cnkocG9zaXRpb24sIGluLCBpZHhJbmZvU2VyaWFsaXplcik7Ci0gICAgICAgICAgICAgICAgY2FzZSBDQUNIRV9JTkRFWEVEX1NIQUxMT1c6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hhbGxvd0luZGV4ZWRFbnRyeShwb3NpdGlvbiwgaW4sIGlkeEluZm9TZXJpYWxpemVyKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBza2lwRm9yQ2FjaGUoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKLSAgICAgICAgICAgIHN3aXRjaCAoaW4ucmVhZEJ5dGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIENBQ0hFX05PVF9JTkRFWEVEOgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIENBQ0hFX0lOREVYRUQ6Ci0gICAgICAgICAgICAgICAgICAgIEluZGV4ZWRFbnRyeS5za2lwRm9yQ2FjaGUoaW4pOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIENBQ0hFX0lOREVYRURfU0hBTExPVzoKLSAgICAgICAgICAgICAgICAgICAgU2hhbGxvd0luZGV4ZWRFbnRyeS5za2lwRm9yQ2FjaGUoaW4pOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUm93SW5kZXhFbnRyeTxJbmRleEluZm8+IGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4sIGxvbmcgaW5kZXhGaWxlUG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nIHBvc2l0aW9uID0gaW4ucmVhZFVuc2lnbmVkVkludCgpOwotCi0gICAgICAgICAgICBpbnQgc2l6ZSA9IChpbnQpaW4ucmVhZFVuc2lnbmVkVkludCgpOwotICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJvd0luZGV4RW50cnk8Pihwb3NpdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZyBoZWFkZXJMZW5ndGggPSBpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0gICAgICAgICAgICAgICAgRGVsZXRpb25UaW1lIGRlbGV0aW9uVGltZSA9IERlbGV0aW9uVGltZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGluKTsKLSAgICAgICAgICAgICAgICBpbnQgY29sdW1uc0luZGV4Q291bnQgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0KLSAgICAgICAgICAgICAgICBjaGVja1NpemUoY29sdW1uc0luZGV4Q291bnQsIHNpemUpOwotCi0gICAgICAgICAgICAgICAgaW50IGluZGV4ZWRQYXJ0U2l6ZSA9IHNpemUgLSBzZXJpYWxpemVkU2l6ZShkZWxldGlvblRpbWUsIGhlYWRlckxlbmd0aCwgY29sdW1uc0luZGV4Q291bnQpOwotCi0gICAgICAgICAgICAgICAgaWYgKHNpemUgPD0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbHVtbkluZGV4Q2FjaGVTaXplKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEluZGV4ZWRFbnRyeShwb3NpdGlvbiwgaW4sIGRlbGV0aW9uVGltZSwgaGVhZGVyTGVuZ3RoLCBjb2x1bW5zSW5kZXhDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4SW5mb1NlcmlhbGl6ZXIsIGluZGV4ZWRQYXJ0U2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGluLnNraXBCeXRlcyhpbmRleGVkUGFydFNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hhbGxvd0luZGV4ZWRFbnRyeShwb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4RmlsZVBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRpb25UaW1lLCBoZWFkZXJMZW5ndGgsIGNvbHVtbnNJbmRleENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhlZFBhcnRTaXplLCBpZHhJbmZvU2VyaWFsaXplcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrU2l6ZShpbnQgZW50cmllcywgaW50IGJ5dGVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZWFkQ29tbWFuZCBjb21tYW5kID0gUmVhZENvbW1hbmQuZ2V0Q29tbWFuZCgpOwotICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCB8fCBTY2hlbWFDb25zdGFudHMuaXNTeXN0ZW1LZXlzcGFjZShjb21tYW5kLm1ldGFkYXRhKCkua2V5c3BhY2UpIHx8ICFEYXRhYmFzZURlc2NyaXB0b3IuZ2V0UmVhZFRocmVzaG9sZHNFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgd2FyblRocmVzaG9sZCA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRSb3dJbmRleFJlYWRTaXplV2FyblRocmVzaG9sZCgpOwotICAgICAgICAgICAgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kIGZhaWxUaHJlc2hvbGQgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Um93SW5kZXhSZWFkU2l6ZUZhaWxUaHJlc2hvbGQoKTsKLSAgICAgICAgICAgIGlmICh3YXJuVGhyZXNob2xkID09IG51bGwgJiYgZmFpbFRocmVzaG9sZCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgbG9uZyBlc3RpbWF0ZWRNZW1vcnkgPSBlc3RpbWF0ZU1hdGVyaWFsaXplZEluZGV4U2l6ZShlbnRyaWVzLCBieXRlcyk7Ci0gICAgICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBTY2hlbWEuaW5zdGFuY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmVJbnN0YW5jZShjb21tYW5kLm1ldGFkYXRhKCkuaWQpOwotICAgICAgICAgICAgaWYgKGNmcyAhPSBudWxsKQotICAgICAgICAgICAgICAgIGNmcy5tZXRyaWMucm93SW5kZXhTaXplLnVwZGF0ZShlc3RpbWF0ZWRNZW1vcnkpOwotCi0gICAgICAgICAgICBpZiAoZmFpbFRocmVzaG9sZCAhPSBudWxsICYmIGVzdGltYXRlZE1lbW9yeSA+IGZhaWxUaHJlc2hvbGQudG9CeXRlcygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KCJRdWVyeSAlcyBhdHRlbXB0ZWQgdG8gYWNjZXNzIGEgbGFyZ2UgUm93SW5kZXhFbnRyeSBlc3RpbWF0ZWQgdG8gYmUgJWQgYnl0ZXMgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluLW1lbW9yeSAodG90YWwgZW50cmllczogJWQsIHRvdGFsIGJ5dGVzOiAlZCkgYnV0IHRoZSBtYXggYWxsb3dlZCBpcyAlczsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHF1ZXJ5IGFib3J0ZWQgIChzZWUgcm93X2luZGV4X3JlYWRfc2l6ZV9mYWlsX3RocmVzaG9sZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQudG9DUUxTdHJpbmcoKSwgZXN0aW1hdGVkTWVtb3J5LCBlbnRyaWVzLCBieXRlcywgZmFpbFRocmVzaG9sZCk7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZVBhcmFtcy5yZW1vdmUoUGFyYW1UeXBlLlJPV19JTkRFWF9SRUFEX1NJWkVfV0FSTik7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZVBhcmFtcy5hZGQoUGFyYW1UeXBlLlJPV19JTkRFWF9SRUFEX1NJWkVfRkFJTCwgZXN0aW1hdGVkTWVtb3J5KTsKLQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSb3dJbmRleEVudHJ5UmVhZFNpemVUb29MYXJnZUV4Y2VwdGlvbihtc2cpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAod2FyblRocmVzaG9sZCAhPSBudWxsICYmIGVzdGltYXRlZE1lbW9yeSA+IHdhcm5UaHJlc2hvbGQudG9CeXRlcygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHVzZSBhZGRJZkxhcmdlciByYXRoZXIgdGhhbiBhZGQgYXMgYSBwcmV2aW91cyBwYXJ0aXRpb24gbWF5IGJlIGxhcmdlciB0aGFuIHRoaXMgb25lCi0gICAgICAgICAgICAgICAgTG9uZyBjdXJyZW50ID0gTWVzc2FnZVBhcmFtcy5nZXQoUGFyYW1UeXBlLlJPV19JTkRFWF9SRUFEX1NJWkVfV0FSTik7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbCB8fCBjdXJyZW50LmNvbXBhcmVUbyhlc3RpbWF0ZWRNZW1vcnkpIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVBhcmFtcy5hZGQoUGFyYW1UeXBlLlJPV19JTkRFWF9SRUFEX1NJWkVfV0FSTiwgZXN0aW1hdGVkTWVtb3J5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGxvbmcgZXN0aW1hdGVNYXRlcmlhbGl6ZWRJbmRleFNpemUoaW50IGVudHJpZXMsIGludCBieXRlcykKLSAgICAgICAgewotICAgICAgICAgICAgbG9uZyBvdmVyaGVhZCA9IEluZGV4SW5mby5FTVBUWV9TSVpFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBcnJheUNsdXN0ZXJpbmcuRU1QVFlfU0laRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRGVsZXRpb25UaW1lLkVNUFRZX1NJWkU7Ci0KLSAgICAgICAgICAgIHJldHVybiAob3ZlcmhlYWQgKiBlbnRyaWVzKSArIGJ5dGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgZGVzZXJpYWxpemVQb3NpdGlvbkFuZFNraXAoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvbmcgcG9zaXRpb24gPSBpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0KLSAgICAgICAgICAgIGludCBzaXplID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOwotICAgICAgICAgICAgaWYgKHNpemUgPiAwKQotICAgICAgICAgICAgICAgIGluLnNraXBCeXRlc0Z1bGx5KHNpemUpOwotCi0gICAgICAgICAgICByZXR1cm4gcG9zaXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZHMgb25seSB0aGUgZGF0YSAncG9zaXRpb24nIG9mIHRoZSBpbmRleCBlbnRyeSBhbmQgcmV0dXJucyBpdC4gTm90ZSB0aGF0IHRoaXMgbGVmdCAnaW4nIGluIHRoZSBtaWRkbGUKLSAgICAgICAgICogb2YgcmVhZGluZyBhbiBlbnRyeSwgc28gdGhpcyBpcyBvbmx5IHVzZWZ1bCBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcgYW5kIGluIG1vc3QgY2FzZSAnZGVzZXJpYWxpemUnCi0gICAgICAgICAqIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGxvbmcgcmVhZFBvc2l0aW9uKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW4ucmVhZFVuc2lnbmVkVkludCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNraXAoRGF0YUlucHV0UGx1cyBpbiwgVmVyc2lvbiB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgcmVhZFBvc2l0aW9uKGluKTsKLSAgICAgICAgICAgIHNraXBQcm9tb3RlZEluZGV4KGluKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2tpcFByb21vdGVkSW5kZXgoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBzaXplID0gKGludClpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA8PSAwKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaW4uc2tpcEJ5dGVzRnVsbHkoc2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VyaWFsaXplT2Zmc2V0cyhEYXRhT3V0cHV0QnVmZmVyIG91dCwgaW50W10gaW5kZXhPZmZzZXRzLCBpbnQgY29sdW1uSW5kZXhDb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uSW5kZXhDb3VudDsgaSsrKQotICAgICAgICAgICAgICAgIG91dC53cml0ZUludChpbmRleE9mZnNldHNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNlcmlhbGl6ZWRTaXplKERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUsIGxvbmcgaGVhZGVyTGVuZ3RoLCBpbnQgY29sdW1uSW5kZXhDb3VudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50KGhlYWRlckxlbmd0aCkKLSAgICAgICAgICAgICAgICsgKGludCkgRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoZGVsZXRpb25UaW1lKQotICAgICAgICAgICAgICAgKyBUeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50KGNvbHVtbkluZGV4Q291bnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShEYXRhT3V0cHV0UGx1cyBvdXQsIEJ5dGVCdWZmZXIgaW5kZXhJbmZvKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChwb3NpdGlvbik7Ci0KLSAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KDApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZUZvckNhY2hlKERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQocG9zaXRpb24pOwotCi0gICAgICAgIG91dC53cml0ZUJ5dGUoQ0FDSEVfTk9UX0lOREVYRUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuIGVudHJ5IGluIHRoZSByb3cgaW5kZXggZm9yIGEgcm93IHdob3NlIGNvbHVtbnMgYXJlIGluZGV4ZWQgLSB1c2VkIGZvciBib3RoIGxlZ2FjeSBhbmQgY3VycmVudCBmb3JtYXRzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEluZGV4ZWRFbnRyeSBleHRlbmRzIFJvd0luZGV4RW50cnk8SW5kZXhJbmZvPgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBCQVNFX1NJWkU7Ci0KLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJBU0VfU0laRSA9IE9iamVjdFNpemVzLm1lYXN1cmUobmV3IEluZGV4ZWRFbnRyeSgwLCBEZWxldGlvblRpbWUuTElWRSwgMCwgbnVsbCwgbnVsbCwgMCwgbnVsbCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lOwotICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgaGVhZGVyTGVuZ3RoOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgSW5kZXhJbmZvW10gY29sdW1uc0luZGV4OwotICAgICAgICBwcml2YXRlIGZpbmFsIGludFtdIG9mZnNldHM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IGluZGV4ZWRQYXJ0U2l6ZTsKLSAgICAgICAgQFVubWV0ZXJlZAotICAgICAgICBwcml2YXRlIGZpbmFsIElTZXJpYWxpemVyPEluZGV4SW5mbz4gaWR4SW5mb1NlcmlhbGl6ZXI7Ci0KLSAgICAgICAgcHJpdmF0ZSBJbmRleGVkRW50cnkobG9uZyBkYXRhRmlsZVBvc2l0aW9uLCBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lLCBsb25nIGhlYWRlckxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhJbmZvW10gY29sdW1uc0luZGV4LCBpbnRbXSBvZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhlZFBhcnRTaXplLCBJU2VyaWFsaXplcjxJbmRleEluZm8+IGlkeEluZm9TZXJpYWxpemVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihkYXRhRmlsZVBvc2l0aW9uKTsKLQotICAgICAgICAgICAgdGhpcy5oZWFkZXJMZW5ndGggPSBoZWFkZXJMZW5ndGg7Ci0gICAgICAgICAgICB0aGlzLmRlbGV0aW9uVGltZSA9IGRlbGV0aW9uVGltZTsKLQotICAgICAgICAgICAgdGhpcy5jb2x1bW5zSW5kZXggPSBjb2x1bW5zSW5kZXg7Ci0gICAgICAgICAgICB0aGlzLm9mZnNldHMgPSBvZmZzZXRzOwotICAgICAgICAgICAgdGhpcy5pbmRleGVkUGFydFNpemUgPSBpbmRleGVkUGFydFNpemU7Ci0gICAgICAgICAgICB0aGlzLmlkeEluZm9TZXJpYWxpemVyID0gaWR4SW5mb1NlcmlhbGl6ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIEluZGV4ZWRFbnRyeShsb25nIGRhdGFGaWxlUG9zaXRpb24sIERhdGFJbnB1dFBsdXMgaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUsIGxvbmcgaGVhZGVyTGVuZ3RoLCBpbnQgY29sdW1uSW5kZXhDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhJbmZvLlNlcmlhbGl6ZXIgaWR4SW5mb1NlcmlhbGl6ZXIsIGludCBpbmRleGVkUGFydFNpemUpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihkYXRhRmlsZVBvc2l0aW9uKTsKLQotICAgICAgICAgICAgdGhpcy5oZWFkZXJMZW5ndGggPSBoZWFkZXJMZW5ndGg7Ci0gICAgICAgICAgICB0aGlzLmRlbGV0aW9uVGltZSA9IGRlbGV0aW9uVGltZTsKLSAgICAgICAgICAgIGludCBjb2x1bW5zSW5kZXhDb3VudCA9IGNvbHVtbkluZGV4Q291bnQ7Ci0KLSAgICAgICAgICAgIHRoaXMuY29sdW1uc0luZGV4ID0gbmV3IEluZGV4SW5mb1tjb2x1bW5zSW5kZXhDb3VudF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnNJbmRleENvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5zSW5kZXhbaV0gPSBpZHhJbmZvU2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbik7Ci0KLSAgICAgICAgICAgIHRoaXMub2Zmc2V0cyA9IG5ldyBpbnRbdGhpcy5jb2x1bW5zSW5kZXgubGVuZ3RoXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2Zmc2V0cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBvZmZzZXRzW2ldID0gaW4ucmVhZEludCgpOwotCi0gICAgICAgICAgICB0aGlzLmluZGV4ZWRQYXJ0U2l6ZSA9IGluZGV4ZWRQYXJ0U2l6ZTsKLQotICAgICAgICAgICAgdGhpcy5pZHhJbmZvU2VyaWFsaXplciA9IGlkeEluZm9TZXJpYWxpemVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yIGNhbGxlZCBmcm9tIHtAbGluayBTZXJpYWxpemVyI2Rlc2VyaWFsaXplRm9yQ2FjaGUob3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzKX0uCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIEluZGV4ZWRFbnRyeShsb25nIGRhdGFGaWxlUG9zaXRpb24sIERhdGFJbnB1dFBsdXMgaW4sIElTZXJpYWxpemVyPEluZGV4SW5mbz4gaWR4SW5mb1NlcmlhbGl6ZXIpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihkYXRhRmlsZVBvc2l0aW9uKTsKLQotICAgICAgICAgICAgdGhpcy5oZWFkZXJMZW5ndGggPSBpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0gICAgICAgICAgICB0aGlzLmRlbGV0aW9uVGltZSA9IERlbGV0aW9uVGltZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGluKTsKLSAgICAgICAgICAgIGludCBjb2x1bW5zSW5kZXhDb3VudCA9IChpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKLQotICAgICAgICAgICAgVHJhY2tlZERhdGFJbnB1dFBsdXMgdHJhY2tlZEluID0gbmV3IFRyYWNrZWREYXRhSW5wdXRQbHVzKGluKTsKLQotICAgICAgICAgICAgdGhpcy5jb2x1bW5zSW5kZXggPSBuZXcgSW5kZXhJbmZvW2NvbHVtbnNJbmRleENvdW50XTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uc0luZGV4Q291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbnNJbmRleFtpXSA9IGlkeEluZm9TZXJpYWxpemVyLmRlc2VyaWFsaXplKHRyYWNrZWRJbik7Ci0KLSAgICAgICAgICAgIHRoaXMub2Zmc2V0cyA9IG51bGw7Ci0KLSAgICAgICAgICAgIHRoaXMuaW5kZXhlZFBhcnRTaXplID0gKGludCkgdHJhY2tlZEluLmdldEJ5dGVzUmVhZCgpOwotCi0gICAgICAgICAgICB0aGlzLmlkeEluZm9TZXJpYWxpemVyID0gaWR4SW5mb1NlcmlhbGl6ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaW5kZXhPbkhlYXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGNvbHVtbnNJbmRleENvdW50KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbHVtbnNJbmRleC5sZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZGVsZXRpb25UaW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBJbmRleEluZm9SZXRyaWV2ZXIgb3BlbldpdGhJbmRleChGaWxlSGFuZGxlIGluZGV4RmlsZSkKLSAgICAgICAgewotICAgICAgICAgICAgaW5kZXhFbnRyeVNpemVIaXN0b2dyYW0udXBkYXRlKHNlcmlhbGl6ZWRTaXplKGRlbGV0aW9uVGltZSwgaGVhZGVyTGVuZ3RoLCBjb2x1bW5zSW5kZXgubGVuZ3RoKSArIGluZGV4ZWRQYXJ0U2l6ZSk7Ci0gICAgICAgICAgICBpbmRleEluZm9Db3VudEhpc3RvZ3JhbS51cGRhdGUoY29sdW1uc0luZGV4Lmxlbmd0aCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEluZGV4SW5mb1JldHJpZXZlcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpdmF0ZSBpbnQgcmV0cmlldmFsczsKLQotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyBJbmRleEluZm8gY29sdW1uc0luZGV4KGludCBpbmRleCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHJpZXZhbHMrKzsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbnNJbmRleFtpbmRleF07Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXhJbmZvR2V0c0hpc3RvZ3JhbS51cGRhdGUocmV0cmlldmFscyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgbG9uZyB1bnNoYXJlZEhlYXBTaXplKCkKLSAgICAgICAgewotICAgICAgICAgICAgbG9uZyBlbnRyeVNpemUgPSAwOwotICAgICAgICAgICAgZm9yIChJbmRleEluZm8gaWR4IDogY29sdW1uc0luZGV4KQotICAgICAgICAgICAgICAgIGVudHJ5U2l6ZSArPSBpZHgudW5zaGFyZWRIZWFwU2l6ZSgpOwotICAgICAgICAgICAgcmV0dXJuIEJBU0VfU0laRQotICAgICAgICAgICAgICAgICsgZW50cnlTaXplCi0gICAgICAgICAgICAgICAgKyBPYmplY3RTaXplcy5zaXplT2ZSZWZlcmVuY2VBcnJheShjb2x1bW5zSW5kZXgubGVuZ3RoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShEYXRhT3V0cHV0UGx1cyBvdXQsIEJ5dGVCdWZmZXIgaW5kZXhJbmZvKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGluZGV4ZWRQYXJ0U2l6ZSAhPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLQotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHBvc2l0aW9uKTsKLQotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHNlcmlhbGl6ZWRTaXplKGRlbGV0aW9uVGltZSwgaGVhZGVyTGVuZ3RoLCBjb2x1bW5zSW5kZXgubGVuZ3RoKSArIGluZGV4ZWRQYXJ0U2l6ZSk7Ci0KLSAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChoZWFkZXJMZW5ndGgpOwotICAgICAgICAgICAgRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGRlbGV0aW9uVGltZSwgb3V0KTsKLSAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChjb2x1bW5zSW5kZXgubGVuZ3RoKTsKLSAgICAgICAgICAgIGZvciAoSW5kZXhJbmZvIGluZm8gOiBjb2x1bW5zSW5kZXgpCi0gICAgICAgICAgICAgICAgaWR4SW5mb1NlcmlhbGl6ZXIuc2VyaWFsaXplKGluZm8sIG91dCk7Ci0gICAgICAgICAgICBmb3IgKGludCBvZmZzZXQgOiBvZmZzZXRzKQotICAgICAgICAgICAgICAgIG91dC53cml0ZUludChvZmZzZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZUZvckNhY2hlKERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChwb3NpdGlvbik7Ci0gICAgICAgICAgICBvdXQud3JpdGVCeXRlKENBQ0hFX0lOREVYRUQpOwotCi0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoaGVhZGVyTGVuZ3RoKTsKLSAgICAgICAgICAgIERlbGV0aW9uVGltZS5zZXJpYWxpemVyLnNlcmlhbGl6ZShkZWxldGlvblRpbWUsIG91dCk7Ci0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoY29sdW1uc0luZGV4Q291bnQoKSk7Ci0KLSAgICAgICAgICAgIGZvciAoSW5kZXhJbmZvIGluZGV4SW5mbyA6IGNvbHVtbnNJbmRleCkKLSAgICAgICAgICAgICAgICBpZHhJbmZvU2VyaWFsaXplci5zZXJpYWxpemUoaW5kZXhJbmZvLCBvdXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIHZvaWQgc2tpcEZvckNhY2hlKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0gICAgICAgICAgICBEZWxldGlvblRpbWUuc2VyaWFsaXplci5za2lwKGluKTsKLSAgICAgICAgICAgIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKLQotICAgICAgICAgICAgaW4ucmVhZFVuc2lnbmVkVkludCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW4gZW50cnkgaW4gdGhlIHJvdyBpbmRleCBmb3IgYSByb3cgd2hvc2UgY29sdW1ucyBhcmUgaW5kZXhlZCBhbmQgdGhlIHtAbGluayBJbmRleEluZm99IG9iamVjdHMKLSAgICAgKiBhcmUgbm90IHJlYWQgaW50byB0aGUga2V5IGNhY2hlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNoYWxsb3dJbmRleGVkRW50cnkgZXh0ZW5kcyBSb3dJbmRleEVudHJ5PEluZGV4SW5mbz4KLSAgICB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQkFTRV9TSVpFOwotCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBCQVNFX1NJWkUgPSBPYmplY3RTaXplcy5tZWFzdXJlKG5ldyBTaGFsbG93SW5kZXhlZEVudHJ5KDAsIDAsIERlbGV0aW9uVGltZS5MSVZFLCAwLCAxMCwgMCwgbnVsbCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGluZGV4RmlsZVBvc2l0aW9uOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgRGVsZXRpb25UaW1lIGRlbGV0aW9uVGltZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGhlYWRlckxlbmd0aDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgY29sdW1uc0luZGV4Q291bnQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXhlZFBhcnRTaXplOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBvZmZzZXRzT2Zmc2V0OwotICAgICAgICBAVW5tZXRlcmVkCi0gICAgICAgIHByaXZhdGUgZmluYWwgSVNlcmlhbGl6ZXI8SW5kZXhJbmZvPiBpZHhJbmZvU2VyaWFsaXplcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgZmllbGRzU2VyaWFsaXplZFNpemU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlZSB7QGxpbmsgI2NyZWF0ZShsb25nLCBsb25nLCBEZWxldGlvblRpbWUsIGxvbmcsIGludCwgaW50LCBMaXN0LCBpbnRbXSwgSVNlcmlhbGl6ZXIpfSBmb3IgYSBkZXNjcmlwdGlvbgotICAgICAgICAgKiBvZiB0aGUgcGFyYW1ldGVycy4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgU2hhbGxvd0luZGV4ZWRFbnRyeShsb25nIGRhdGFGaWxlUG9zaXRpb24sIGxvbmcgaW5kZXhGaWxlUG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lLCBsb25nIGhlYWRlckxlbmd0aCwgaW50IGNvbHVtbkluZGV4Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhlZFBhcnRTaXplLCBJU2VyaWFsaXplcjxJbmRleEluZm8+IGlkeEluZm9TZXJpYWxpemVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihkYXRhRmlsZVBvc2l0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0IGNvbHVtbkluZGV4Q291bnQgPiAxOwotCi0gICAgICAgICAgICB0aGlzLmluZGV4RmlsZVBvc2l0aW9uID0gaW5kZXhGaWxlUG9zaXRpb247Ci0gICAgICAgICAgICB0aGlzLmhlYWRlckxlbmd0aCA9IGhlYWRlckxlbmd0aDsKLSAgICAgICAgICAgIHRoaXMuZGVsZXRpb25UaW1lID0gZGVsZXRpb25UaW1lOwotICAgICAgICAgICAgdGhpcy5jb2x1bW5zSW5kZXhDb3VudCA9IGNvbHVtbkluZGV4Q291bnQ7Ci0KLSAgICAgICAgICAgIHRoaXMuaW5kZXhlZFBhcnRTaXplID0gaW5kZXhlZFBhcnRTaXplOwotICAgICAgICAgICAgdGhpcy5pZHhJbmZvU2VyaWFsaXplciA9IGlkeEluZm9TZXJpYWxpemVyOwotCi0gICAgICAgICAgICB0aGlzLmZpZWxkc1NlcmlhbGl6ZWRTaXplID0gc2VyaWFsaXplZFNpemUoZGVsZXRpb25UaW1lLCBoZWFkZXJMZW5ndGgsIGNvbHVtbkluZGV4Q291bnQpOwotICAgICAgICAgICAgdGhpcy5vZmZzZXRzT2Zmc2V0ID0gaW5kZXhlZFBhcnRTaXplICsgZmllbGRzU2VyaWFsaXplZFNpemUgLSBjb2x1bW5zSW5kZXhDb3VudCAqIFR5cGVTaXplcy5JTlRfU0laRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3Iga2V5LWNhY2hlIGRlc2VyaWFsaXphdGlvbgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBTaGFsbG93SW5kZXhlZEVudHJ5KGxvbmcgZGF0YUZpbGVQb3NpdGlvbiwgRGF0YUlucHV0UGx1cyBpbiwgSW5kZXhJbmZvLlNlcmlhbGl6ZXIgaWR4SW5mb1NlcmlhbGl6ZXIpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihkYXRhRmlsZVBvc2l0aW9uKTsKLQotICAgICAgICAgICAgdGhpcy5pbmRleEZpbGVQb3NpdGlvbiA9IGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKLQotICAgICAgICAgICAgdGhpcy5oZWFkZXJMZW5ndGggPSBpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0gICAgICAgICAgICB0aGlzLmRlbGV0aW9uVGltZSA9IERlbGV0aW9uVGltZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGluKTsKLSAgICAgICAgICAgIHRoaXMuY29sdW1uc0luZGV4Q291bnQgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0KLSAgICAgICAgICAgIHRoaXMuaW5kZXhlZFBhcnRTaXplID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOwotCi0gICAgICAgICAgICB0aGlzLmlkeEluZm9TZXJpYWxpemVyID0gaWR4SW5mb1NlcmlhbGl6ZXI7Ci0KLSAgICAgICAgICAgIHRoaXMuZmllbGRzU2VyaWFsaXplZFNpemUgPSBzZXJpYWxpemVkU2l6ZShkZWxldGlvblRpbWUsIGhlYWRlckxlbmd0aCwgY29sdW1uc0luZGV4Q291bnQpOwotICAgICAgICAgICAgdGhpcy5vZmZzZXRzT2Zmc2V0ID0gaW5kZXhlZFBhcnRTaXplICsgZmllbGRzU2VyaWFsaXplZFNpemUgLSBjb2x1bW5zSW5kZXhDb3VudCAqIFR5cGVTaXplcy5JTlRfU0laRTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGNvbHVtbnNJbmRleENvdW50KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbHVtbnNJbmRleENvdW50OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGRlbGV0aW9uVGltZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgSW5kZXhJbmZvUmV0cmlldmVyIG9wZW5XaXRoSW5kZXgoRmlsZUhhbmRsZSBpbmRleEZpbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluZGV4RW50cnlTaXplSGlzdG9ncmFtLnVwZGF0ZShpbmRleGVkUGFydFNpemUgKyBmaWVsZHNTZXJpYWxpemVkU2l6ZSk7Ci0gICAgICAgICAgICBpbmRleEluZm9Db3VudEhpc3RvZ3JhbS51cGRhdGUoY29sdW1uc0luZGV4Q291bnQpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBTaGFsbG93SW5mb1JldHJpZXZlcihpbmRleEZpbGVQb3NpdGlvbiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZJbnRDb2RpbmcuY29tcHV0ZVVuc2lnbmVkVkludFNpemUocG9zaXRpb24pICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkludENvZGluZy5jb21wdXRlVW5zaWduZWRWSW50U2l6ZShpbmRleGVkUGFydFNpemUgKyBmaWVsZHNTZXJpYWxpemVkU2l6ZSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHNTZXJpYWxpemVkU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0c09mZnNldCAtIGZpZWxkc1NlcmlhbGl6ZWRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEZpbGUuY3JlYXRlUmVhZGVyKCksIGlkeEluZm9TZXJpYWxpemVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgbG9uZyB1bnNoYXJlZEhlYXBTaXplKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEJBU0VfU0laRTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoRGF0YU91dHB1dFBsdXMgb3V0LCBCeXRlQnVmZmVyIGluZGV4SW5mbykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChwb3NpdGlvbik7Ci0KLSAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChmaWVsZHNTZXJpYWxpemVkU2l6ZSArIGluZGV4SW5mby5saW1pdCgpKTsKLQotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGhlYWRlckxlbmd0aCk7Ci0gICAgICAgICAgICBEZWxldGlvblRpbWUuc2VyaWFsaXplci5zZXJpYWxpemUoZGVsZXRpb25UaW1lLCBvdXQpOwotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGNvbHVtbnNJbmRleENvdW50KTsKLQotICAgICAgICAgICAgb3V0LndyaXRlKGluZGV4SW5mbyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplRm9yQ2FjaGUoRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHBvc2l0aW9uKTsKLSAgICAgICAgICAgIG91dC53cml0ZUJ5dGUoQ0FDSEVfSU5ERVhFRF9TSEFMTE9XKTsKLQotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGluZGV4RmlsZVBvc2l0aW9uKTsKLQotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGhlYWRlckxlbmd0aCk7Ci0gICAgICAgICAgICBEZWxldGlvblRpbWUuc2VyaWFsaXplci5zZXJpYWxpemUoZGVsZXRpb25UaW1lLCBvdXQpOwotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGNvbHVtbnNJbmRleENvdW50KTsKLQotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGluZGV4ZWRQYXJ0U2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgdm9pZCBza2lwRm9yQ2FjaGUoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKLQotICAgICAgICAgICAgaW4ucmVhZFVuc2lnbmVkVkludCgpOwotICAgICAgICAgICAgRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuc2tpcChpbik7Ci0gICAgICAgICAgICBpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0KLSAgICAgICAgICAgIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNoYWxsb3dJbmZvUmV0cmlldmVyIGV4dGVuZHMgRmlsZUluZGV4SW5mb1JldHJpZXZlcgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgb2Zmc2V0c09mZnNldDsKLQotICAgICAgICBwcml2YXRlIFNoYWxsb3dJbmZvUmV0cmlldmVyKGxvbmcgaW5kZXhJbmZvRmlsZVBvc2l0aW9uLCBpbnQgb2Zmc2V0c09mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGF0YUlucHV0IGluZGV4UmVhZGVyLCBJU2VyaWFsaXplcjxJbmRleEluZm8+IGlkeEluZm9TZXJpYWxpemVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihpbmRleEluZm9GaWxlUG9zaXRpb24sIGluZGV4UmVhZGVyLCBpZHhJbmZvU2VyaWFsaXplcik7Ci0gICAgICAgICAgICB0aGlzLm9mZnNldHNPZmZzZXQgPSBvZmZzZXRzT2Zmc2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgSW5kZXhJbmZvIGZldGNoSW5kZXgoaW50IGluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgLy8gc2VlayB0byBwb3NpdGlvbiBpbiAib2Zmc2V0cyB0byBJbmRleEluZm8iIHRhYmxlCi0gICAgICAgICAgICBpbmRleFJlYWRlci5zZWVrKGluZGV4SW5mb0ZpbGVQb3NpdGlvbiArIG9mZnNldHNPZmZzZXQgKyBpbmRleCAqIFR5cGVTaXplcy5JTlRfU0laRSk7Ci0KLSAgICAgICAgICAgIC8vIHJlYWQgb2Zmc2V0IG9mIEluZGV4SW5mbwotICAgICAgICAgICAgaW50IGluZGV4SW5mb1BvcyA9IGluZGV4UmVhZGVyLnJlYWRJbnQoKTsKLQotICAgICAgICAgICAgLy8gc2VlayB0byBwb3Npc2lvbiBvZiBJbmRleEluZm8KLSAgICAgICAgICAgIGluZGV4UmVhZGVyLnNlZWsoaW5kZXhJbmZvRmlsZVBvc2l0aW9uICsgaW5kZXhJbmZvUG9zKTsKLQotICAgICAgICAgICAgLy8gZmluYWxseSwgZGVzZXJpYWxpemUgSW5kZXhJbmZvCi0gICAgICAgICAgICByZXR1cm4gaWR4SW5mb1NlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW5kZXhSZWFkZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQmFzZSBjbGFzcyB0byBhY2Nlc3Mge0BsaW5rIEluZGV4SW5mb30gb2JqZWN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEluZGV4SW5mb1JldHJpZXZlciBleHRlbmRzIEF1dG9DbG9zZWFibGUKLSAgICB7Ci0gICAgICAgIEluZGV4SW5mbyBjb2x1bW5zSW5kZXgoaW50IGluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAgICAgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCYXNlIGNsYXNzIHRvIGFjY2VzcyB7QGxpbmsgSW5kZXhJbmZvfSBvYmplY3RzIG9uIGRpc2sgdGhhdCBrZWVwcyBhbHJlYWR5Ci0gICAgICogcmVhZCB7QGxpbmsgSW5kZXhJbmZvfSBvbiBoZWFwLgotICAgICAqLwotICAgIHByaXZhdGUgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEZpbGVJbmRleEluZm9SZXRyaWV2ZXIgaW1wbGVtZW50cyBJbmRleEluZm9SZXRyaWV2ZXIKLSAgICB7Ci0gICAgICAgIGZpbmFsIGxvbmcgaW5kZXhJbmZvRmlsZVBvc2l0aW9uOwotICAgICAgICBmaW5hbCBJU2VyaWFsaXplcjxJbmRleEluZm8+IGlkeEluZm9TZXJpYWxpemVyOwotICAgICAgICBmaW5hbCBGaWxlRGF0YUlucHV0IGluZGV4UmVhZGVyOwotICAgICAgICBpbnQgcmV0cmlldmFsczsKLQotICAgICAgICAvKioKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGluZGV4SW5mb0ZpbGVQb3NpdGlvbiBvZmZzZXQgb2YgZmlyc3Qgc2VyaWFsaXplZCB7QGxpbmsgSW5kZXhJbmZvfSBvYmplY3QKLSAgICAgICAgICogQHBhcmFtIGluZGV4UmVhZGVyIGZpbGUgZGF0YSBpbnB1dCB0byBhY2Nlc3MgdGhlIGluZGV4IGZpbGUsIGNsb3NlZCBieSB0aGlzIGluc3RhbmNlCi0gICAgICAgICAqIEBwYXJhbSBpZHhJbmZvU2VyaWFsaXplciB0aGUgaW5kZXggc2VyaWFsaXplciB0byBkZXNlcmlhbGl6ZSB7QGxpbmsgSW5kZXhJbmZvfSBvYmplY3RzCi0gICAgICAgICAqLwotICAgICAgICBGaWxlSW5kZXhJbmZvUmV0cmlldmVyKGxvbmcgaW5kZXhJbmZvRmlsZVBvc2l0aW9uLCBGaWxlRGF0YUlucHV0IGluZGV4UmVhZGVyLCBJU2VyaWFsaXplcjxJbmRleEluZm8+IGlkeEluZm9TZXJpYWxpemVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmluZGV4SW5mb0ZpbGVQb3NpdGlvbiA9IGluZGV4SW5mb0ZpbGVQb3NpdGlvbjsKLSAgICAgICAgICAgIHRoaXMuaWR4SW5mb1NlcmlhbGl6ZXIgPSBpZHhJbmZvU2VyaWFsaXplcjsKLSAgICAgICAgICAgIHRoaXMuaW5kZXhSZWFkZXIgPSBpbmRleFJlYWRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBJbmRleEluZm8gY29sdW1uc0luZGV4KGludCBpbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHJpZXZhbHMrKzsKLSAgICAgICAgICAgIHJldHVybiBmZXRjaEluZGV4KGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIGFic3RyYWN0IEluZGV4SW5mbyBmZXRjaEluZGV4KGludCBpbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluZGV4UmVhZGVyLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgIGluZGV4SW5mb0dldHNIaXN0b2dyYW0udXBkYXRlKHJldHJpZXZhbHMpOwotICAgICAgICAgICAgaW5kZXhJbmZvUmVhZHNIaXN0b2dyYW0udXBkYXRlKHJldHJpZXZhbHMpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU1NUYWJsZUltcG9ydGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TU1RhYmxlSW1wb3J0ZXIuamF2YQppbmRleCA1OTQ5NTU5Li42NmE1NmRjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TU1RhYmxlSW1wb3J0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TU1RhYmxlSW1wb3J0ZXIuamF2YQpAQCAtMjUsMjEgKzI1LDI0IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5VVUlEOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uVmVyaWZpZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLlNTVGFibGVTZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVZlcmlmaWVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuS2V5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQWN0aXZlUmVwYWlyU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk91dHB1dEhhbmRsZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlJlZnM7CiAKQEAgLTY5LDggKzcyLDggQEAKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBzeW5jaHJvbml6ZWQgTGlzdDxTdHJpbmc+IGltcG9ydE5ld1NTVGFibGVzKE9wdGlvbnMgb3B0aW9ucykKICAgICB7Ci0gICAgICAgIGxvZ2dlci5pbmZvKCJMb2FkaW5nIG5ldyBTU1RhYmxlcyBmb3Ige30ve306IHt9IiwKLSAgICAgICAgICAgICAgICAgICAgY2ZzLmtleXNwYWNlLmdldE5hbWUoKSwgY2ZzLmdldFRhYmxlTmFtZSgpLCBvcHRpb25zKTsKKyAgICAgICAgVVVJRCBpbXBvcnRJRCA9IFVVSUQucmFuZG9tVVVJRCgpOworICAgICAgICBsb2dnZXIuaW5mbygiW3t9XSBMb2FkaW5nIG5ldyBTU1RhYmxlcyBmb3Ige30ve306IHt9IiwgaW1wb3J0SUQsIGNmcy5rZXlzcGFjZS5nZXROYW1lKCksIGNmcy5nZXRUYWJsZU5hbWUoKSwgb3B0aW9ucyk7CiAKICAgICAgICAgTGlzdDxQYWlyPERpcmVjdG9yaWVzLlNTVGFibGVMaXN0ZXIsIFN0cmluZz4+IGxpc3RlcnMgPSBnZXRTU1RhYmxlTGlzdGVycyhvcHRpb25zLnNyY1BhdGhzKTsKIApAQCAtOTMsMTkgKzk2LDIwIEBACiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0SWZEcmFpbmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmlmeVNTVGFibGVGb3JJbXBvcnQoZGVzY3JpcHRvciwgZW50cnkuZ2V0VmFsdWUoKSwgb3B0aW9ucy52ZXJpZnlUb2tlbnMsIG9wdGlvbnMudmVyaWZ5U1NUYWJsZXMsIG9wdGlvbnMuZXh0ZW5kZWRWZXJpZnkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgIT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiRmFpbGVkIHZlcmlmeWluZyBzc3RhYmxlIHt9IGluIGRpcmVjdG9yeSB7fSIsIGRlc2NyaXB0b3IsIGRpciwgdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiW3t9XSBGYWlsZWQgdmVyaWZ5aW5nIFNTVGFibGUge30gaW4gZGlyZWN0b3J5IHt9IiwgaW1wb3J0SUQsIGRlc2NyaXB0b3IsIGRpciwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZERpcmVjdG9yaWVzLmFkZChkaXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkZhaWxlZCB2ZXJpZnlpbmcgc3N0YWJsZSB7fSIsIGRlc2NyaXB0b3IsIHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFpbGVkIHZlcmlmeWluZyBzc3RhYmxlICIrZGVzY3JpcHRvciwgdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiW3t9XSBGYWlsZWQgdmVyaWZ5aW5nIFNTVGFibGUge30iLCBpbXBvcnRJRCwgZGVzY3JpcHRvciwgdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdmVyaWZ5aW5nIFNTVGFibGUgIiArIGRlc2NyaXB0b3IsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTEyOCw2ICsxMzIsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWJvcnRJZkRyYWluaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3Igb2xkRGVzY3JpcHRvciA9IGVudHJ5LmdldEtleSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudERlc2NyaXB0b3JzLmNvbnRhaW5zKG9sZERlc2NyaXB0b3IpKQogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0xNDQsNyArMTQ5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbmV3U1NUYWJsZXNQZXJEaXJlY3RvcnkuZm9yRWFjaChzIC0+IHMuc2VsZlJlZigpLnJlbGVhc2UoKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgIT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJGYWlsZWQgaW1wb3J0aW5nIHNzdGFibGVzIGluIGRpcmVjdG9yeSB7fSIsIGRpciwgdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlt7fV0gRmFpbGVkIGltcG9ydGluZyBzc3RhYmxlcyBpbiBkaXJlY3Rvcnkge30iLCBpbXBvcnRJRCwgZGlyLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZERpcmVjdG9yaWVzLmFkZChkaXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29weURhdGEpCiAgICAgICAgICAgICAgICAgICAgICAgICB7CkBAIC0xNjAsOCArMTY1LDggQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiRmFpbGVkIGltcG9ydGluZyBzc3RhYmxlcyBmcm9tIGRhdGEgZGlyZWN0b3J5IC0gcmVuYW1lZCBzc3RhYmxlcyBhcmU6IHt9IiwgbW92ZWRTU1RhYmxlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFpbGVkIGltcG9ydGluZyBzc3RhYmxlcyIsIHQpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJbe31dIEZhaWxlZCBpbXBvcnRpbmcgc3N0YWJsZXMgZnJvbSBkYXRhIGRpcmVjdG9yeSAtIHJlbmFtZWQgU1NUYWJsZXMgYXJlOiB7fSIsIGltcG9ydElELCBtb3ZlZFNTVGFibGVzLCB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgaW1wb3J0aW5nIFNTVGFibGVzIiwgdCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xNzAsMjggKzE3NSw2OCBAQAogCiAgICAgICAgIGlmIChuZXdTU1RhYmxlcy5pc0VtcHR5KCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJObyBuZXcgU1NUYWJsZXMgd2VyZSBmb3VuZCBmb3Ige30ve30iLCBjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLCBjZnMuZ2V0VGFibGVOYW1lKCkpOworICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlt7fV0gTm8gbmV3IFNTVGFibGVzIHdlcmUgZm91bmQgZm9yIHt9L3t9IiwgaW1wb3J0SUQsIGNmcy5rZXlzcGFjZS5nZXROYW1lKCksIGNmcy5nZXRUYWJsZU5hbWUoKSk7CiAgICAgICAgICAgICByZXR1cm4gZmFpbGVkRGlyZWN0b3JpZXM7CiAgICAgICAgIH0KIAotICAgICAgICBsb2dnZXIuaW5mbygiTG9hZGluZyBuZXcgU1NUYWJsZXMgYW5kIGJ1aWxkaW5nIHNlY29uZGFyeSBpbmRleGVzIGZvciB7fS97fToge30iLCBjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLCBjZnMuZ2V0VGFibGVOYW1lKCksIG5ld1NTVGFibGVzKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oIlt7fV0gTG9hZGluZyBuZXcgU1NUYWJsZXMgYW5kIGJ1aWxkaW5nIHNlY29uZGFyeSBpbmRleGVzIGZvciB7fS97fToge30iLCBpbXBvcnRJRCwgY2ZzLmtleXNwYWNlLmdldE5hbWUoKSwgY2ZzLmdldFRhYmxlTmFtZSgpLCBuZXdTU1RhYmxlcyk7CisgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZ0xldmVsaW5nKGltcG9ydElELCBuZXdTU1RhYmxlcyk7CiAKICAgICAgICAgdHJ5IChSZWZzPFNTVGFibGVSZWFkZXI+IHJlZnMgPSBSZWZzLnJlZihuZXdTU1RhYmxlcykpCiAgICAgICAgIHsKKyAgICAgICAgICAgIGFib3J0SWZEcmFpbmluZygpOwogICAgICAgICAgICAgY2ZzLmdldFRyYWNrZXIoKS5hZGRTU1RhYmxlcyhuZXdTU1RhYmxlcyk7CiAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgcmVhZGVyIDogbmV3U1NUYWJsZXMpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaW52YWxpZGF0ZUNhY2hlcyAmJiBjZnMuaXNSb3dDYWNoZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZUNhY2hlc0ZvclNTVGFibGUocmVhZGVyLmRlc2NyaXB0b3IpOworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlQ2FjaGVzRm9yU1NUYWJsZShyZWFkZXIpOwogICAgICAgICAgICAgfQotCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQorICAgICAgICB7CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlt7fV0gRmFpbGVkIGFkZGluZyBTU1RhYmxlcyIsIGltcG9ydElELCB0KTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgYWRkaW5nIFNTVGFibGVzIiwgdCk7CiAgICAgICAgIH0KIAotICAgICAgICBsb2dnZXIuaW5mbygiRG9uZSBsb2FkaW5nIGxvYWQgbmV3IFNTVGFibGVzIGZvciB7fS97fSIsIGNmcy5rZXlzcGFjZS5nZXROYW1lKCksIGNmcy5nZXRUYWJsZU5hbWUoKSk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJbe31dIERvbmUgbG9hZGluZyBsb2FkIG5ldyBTU1RhYmxlcyBmb3Ige30ve30iLCBpbXBvcnRJRCwgY2ZzLmtleXNwYWNlLmdldE5hbWUoKSwgY2ZzLmdldFRhYmxlTmFtZSgpKTsKICAgICAgICAgcmV0dXJuIGZhaWxlZERpcmVjdG9yaWVzOwogICAgIH0KIAogICAgIC8qKgorICAgICAqIENoZWNrIHRoZSBzdGF0ZSBvZiB0aGlzIG5vZGUgYW5kIHRocm93cyBhbiB7QGxpbmsgSW50ZXJydXB0ZWRFeGNlcHRpb259IGlmIGl0IGlzIGN1cnJlbnRseSBkcmFpbmluZworICAgICAqCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgbm9kZSBpcyBkcmFpbmluZworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWJvcnRJZkRyYWluaW5nKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuaXNEcmFpbmluZygpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCJTU1RhYmxlcyBpbXBvcnQgaGFzIGJlZW4gYWJvcnRlZCIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2dMZXZlbGluZyhVVUlEIGltcG9ydElELCBTZXQ8U1NUYWJsZVJlYWRlcj4gbmV3U1NUYWJsZXMpCisgICAgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBjZnMuZ2V0U1NUYWJsZXMoU1NUYWJsZVNldC5DQU5PTklDQUwpKQorICAgICAgICAgICAgc2IuYXBwZW5kKGZvcm1hdE1ldGFkYXRhKHNzdGFibGUpKTsKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJbe31dIEN1cnJlbnQgc3N0YWJsZXM6IHt9IiwgaW1wb3J0SUQsIHNiKTsKKyAgICAgICAgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IG5ld1NTVGFibGVzKQorICAgICAgICAgICAgc2IuYXBwZW5kKGZvcm1hdE1ldGFkYXRhKHNzdGFibGUpKTsKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJbe31dIE5ldyBzc3RhYmxlczoge30iLCBpbXBvcnRJRCwgc2IpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRNZXRhZGF0YShTU1RhYmxlUmVhZGVyIHNzdGFibGUpCisgICAgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgie1slcywgJXNdLCAlZCwgJXMsICVkfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuZ2V0Rmlyc3QoKS5nZXRUb2tlbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmdldExhc3QoKS5nZXRUb2tlbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmdldFNTVGFibGVMZXZlbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmlzUmVwYWlyZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5vbkRpc2tMZW5ndGgoKSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogT3BlbnMgdGhlIHNzdGFibGVyZWFkZXIgZGVzY3JpYmVkIGJ5IGRlc2NyaXB0b3IgYW5kIGZpZ3VyZXMgb3V0IHRoZSBjb3JyZWN0IGRpcmVjdG9yeSBmb3IgaXQgYmFzZWQKICAgICAgKiBvbiB0aGUgZmlyc3QgdG9rZW4KICAgICAgKgpAQCAtMjA4LDcgKzI1Myw3IEBACiAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IG51bGw7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBzc3RhYmxlID0gU1NUYWJsZVJlYWRlci5vcGVuKGRlc2NyaXB0b3IsIGNvbXBvbmVudHMsIGNmcy5tZXRhZGF0YSk7CisgICAgICAgICAgICBzc3RhYmxlID0gU1NUYWJsZVJlYWRlci5vcGVuKGNmcywgZGVzY3JpcHRvciwgY29tcG9uZW50cywgY2ZzLm1ldGFkYXRhKTsKICAgICAgICAgICAgIHRhcmdldERpcmVjdG9yeSA9IGNmcy5nZXREaXJlY3RvcmllcygpLmdldExvY2F0aW9uRm9yRGlzayhjZnMuZGlza0JvdW5kYXJ5TWFuYWdlci5nZXREaXNrQm91bmRhcmllcyhjZnMpLmdldENvcnJlY3REaXNrRm9yU1NUYWJsZShzc3RhYmxlKSk7CiAgICAgICAgIH0KICAgICAgICAgZmluYWxseQpAQCAtMjE2LDcgKzI2MSw3IEBACiAgICAgICAgICAgICBpZiAoc3N0YWJsZSAhPSBudWxsKQogICAgICAgICAgICAgICAgIHNzdGFibGUuc2VsZlJlZigpLnJlbGVhc2UoKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdGFyZ2V0RGlyZWN0b3J5ID09IG51bGwgPyBjZnMuZ2V0RGlyZWN0b3JpZXMoKS5nZXRXcml0ZWFibGVMb2NhdGlvblRvTG9hZEZpbGUobmV3IEZpbGUoZGVzY3JpcHRvci5iYXNlRmlsZW5hbWUoKSkpIDogdGFyZ2V0RGlyZWN0b3J5OworICAgICAgICByZXR1cm4gdGFyZ2V0RGlyZWN0b3J5ID09IG51bGwgPyBjZnMuZ2V0RGlyZWN0b3JpZXMoKS5nZXRXcml0ZWFibGVMb2NhdGlvblRvTG9hZEZpbGUoZGVzY3JpcHRvci5iYXNlRmlsZSgpKSA6IHRhcmdldERpcmVjdG9yeTsKICAgICB9CiAKICAgICAvKioKQEAgLTI3OSwxMSArMzI0LDExIEBACiAgICAgewogICAgICAgICBmb3IgKE1vdmVkU1NUYWJsZSBtb3ZlZFNTVGFibGUgOiBtb3ZlZFNTVGFibGVzKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobmV3IEZpbGUobW92ZWRTU1RhYmxlLm5ld0Rlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpKS5leGlzdHMoKSkKKyAgICAgICAgICAgIGlmIChtb3ZlZFNTVGFibGUubmV3RGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuREFUQSkuZXhpc3RzKCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJNb3Zpbmcgc3N0YWJsZSB7fSBiYWNrIHRvIHt9IiwgbW92ZWRTU1RhYmxlLm5ld0Rlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBtb3ZlZFNTVGFibGUub2xkRGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpOwotICAgICAgICAgICAgICAgIFNTVGFibGVXcml0ZXIucmVuYW1lKG1vdmVkU1NUYWJsZS5uZXdEZXNjcmlwdG9yLCBtb3ZlZFNTVGFibGUub2xkRGVzY3JpcHRvciwgbW92ZWRTU1RhYmxlLmNvbXBvbmVudHMpOworICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiTW92aW5nIHNzdGFibGUge30gYmFjayB0byB7fSIsIG1vdmVkU1NUYWJsZS5uZXdEZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbW92ZWRTU1RhYmxlLm9sZERlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpKTsKKyAgICAgICAgICAgICAgICBTU1RhYmxlLnJlbmFtZShtb3ZlZFNTVGFibGUubmV3RGVzY3JpcHRvciwgbW92ZWRTU1RhYmxlLm9sZERlc2NyaXB0b3IsIG1vdmVkU1NUYWJsZS5jb21wb25lbnRzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI5OSwxMSArMzQ0LDggQEAKICAgICAgICAgbG9nZ2VyLmRlYnVnKCJSZW1vdmluZyBjb3BpZWQgU1NUYWJsZXMgd2hpY2ggd2VyZSBsZWZ0IGluIGRhdGEgZGlyZWN0b3JpZXMgYWZ0ZXIgZmFpbGVkIFNTVGFibGUgaW1wb3J0LiIpOwogICAgICAgICBmb3IgKE1vdmVkU1NUYWJsZSBtb3ZlZFNTVGFibGUgOiBtb3ZlZFNTVGFibGVzKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobmV3IEZpbGUobW92ZWRTU1RhYmxlLm5ld0Rlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpKS5leGlzdHMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBubyBsb2dnaW5nIGhlcmUgYXMgZm9yIG1vdmVTU1RhYmxlc0JhY2sgY2FzZSBhYm92ZSBhcyBsb2dnaW5nIGlzIGRvbmUgaW4gZGVsZXRlIG1ldGhvZAotICAgICAgICAgICAgICAgIFNTVGFibGVXcml0ZXIuZGVsZXRlKG1vdmVkU1NUYWJsZS5uZXdEZXNjcmlwdG9yLCBtb3ZlZFNTVGFibGUuY29tcG9uZW50cyk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBubyBsb2dnaW5nIGhlcmUgYXMgZm9yIG1vdmVTU1RhYmxlc0JhY2sgY2FzZSBhYm92ZSBhcyBsb2dnaW5nIGlzIGRvbmUgaW4gZGVsZXRlIG1ldGhvZAorICAgICAgICAgICAgbW92ZWRTU1RhYmxlLm5ld0Rlc2NyaXB0b3IuZ2V0Rm9ybWF0KCkuZGVsZXRlKG1vdmVkU1NUYWJsZS5uZXdEZXNjcmlwdG9yKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzExLDkgKzM1Myw5IEBACiAgICAgICogSXRlcmF0ZXMgb3ZlciBhbGwga2V5cyBpbiB0aGUgc3N0YWJsZSBpbmRleCBhbmQgaW52YWxpZGF0ZXMgdGhlIHJvdyBjYWNoZQogICAgICAqLwogICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHZvaWQgaW52YWxpZGF0ZUNhY2hlc0ZvclNTVGFibGUoRGVzY3JpcHRvciBkZXNjKQorICAgIHZvaWQgaW52YWxpZGF0ZUNhY2hlc0ZvclNTVGFibGUoU1NUYWJsZVJlYWRlciByZWFkZXIpCiAgICAgewotICAgICAgICB0cnkgKEtleUl0ZXJhdG9yIGl0ZXIgPSBuZXcgS2V5SXRlcmF0b3IoZGVzYywgY2ZzLm1ldGFkYXRhKCkpKQorICAgICAgICB0cnkgKEtleUl0ZXJhdG9yIGl0ZXIgPSByZWFkZXIua2V5SXRlcmF0b3IoKSkKICAgICAgICAgewogICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQogICAgICAgICAgICAgewpAQCAtMzIxLDYgKzM2MywxMCBAQAogICAgICAgICAgICAgICAgIGNmcy5pbnZhbGlkYXRlQ2FjaGVkUGFydGl0aW9uKGRlY29yYXRlZEtleSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGltcG9ydCBzc3RhYmxlICIgKyByZWFkZXIuZ2V0RmlsZW5hbWUoKSwgZXgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMzUsMTQgKzM4MSwxNSBAQAogICAgICAgICBTU1RhYmxlUmVhZGVyIHJlYWRlciA9IG51bGw7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICByZWFkZXIgPSBTU1RhYmxlUmVhZGVyLm9wZW4oZGVzY3JpcHRvciwgY29tcG9uZW50cywgY2ZzLm1ldGFkYXRhKTsKLSAgICAgICAgICAgIFZlcmlmaWVyLk9wdGlvbnMgdmVyaWZpZXJPcHRpb25zID0gVmVyaWZpZXIub3B0aW9ucygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4dGVuZGVkVmVyaWZpY2F0aW9uKGV4dGVuZGVkVmVyaWZ5KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGVja093bnNUb2tlbnModmVyaWZ5VG9rZW5zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5xdWljayghdmVyaWZ5U1NUYWJsZXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludm9rZURpc2tGYWlsdXJlUG9saWN5KGZhbHNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tdXRhdGVSZXBhaXJTdGF0dXMoZmFsc2UpLmJ1aWxkKCk7Ci0gICAgICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgcmVhZGVyLCBmYWxzZSwgdmVyaWZpZXJPcHRpb25zKSkKKyAgICAgICAgICAgIHJlYWRlciA9IFNTVGFibGVSZWFkZXIub3BlbihjZnMsIGRlc2NyaXB0b3IsIGNvbXBvbmVudHMsIGNmcy5tZXRhZGF0YSk7CisgICAgICAgICAgICBJVmVyaWZpZXIuT3B0aW9ucyB2ZXJpZmllck9wdGlvbnMgPSBJVmVyaWZpZXIub3B0aW9ucygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXh0ZW5kZWRWZXJpZmljYXRpb24oZXh0ZW5kZWRWZXJpZnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hlY2tPd25zVG9rZW5zKHZlcmlmeVRva2VucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5xdWljayghdmVyaWZ5U1NUYWJsZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW52b2tlRGlza0ZhaWx1cmVQb2xpY3koZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubXV0YXRlUmVwYWlyU3RhdHVzKGZhbHNlKS5idWlsZCgpOworCisgICAgICAgICAgICB0cnkgKElWZXJpZmllciB2ZXJpZmllciA9IHJlYWRlci5nZXRWZXJpZmllcihjZnMsIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBmYWxzZSwgdmVyaWZpZXJPcHRpb25zKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKICAgICAgICAgICAgIH0KQEAgLTM2NCw3ICs0MTEsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBtYXliZU11dGF0ZU1ldGFkYXRhKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIGlmIChuZXcgRmlsZShkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5TVEFUUykpLmV4aXN0cygpKQorICAgICAgICBpZiAoZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuU1RBVFMpLmV4aXN0cygpKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAob3B0aW9ucy5yZXNldExldmVsKQogICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU2VyaWFsaXphdGlvbkhlYWRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU2VyaWFsaXphdGlvbkhlYWRlci5qYXZhCmluZGV4IDExMjM5ZDguLmQ3NWFkZmQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NlcmlhbGl6YXRpb25IZWFkZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TZXJpYWxpemF0aW9uSGVhZGVyLmphdmEKQEAgLTI1LDkgKzI1LDggQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5UeXBlUGFyc2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuRW5jb2RpbmdTdGF0czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlVua25vd25Db2x1bW5FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uOwpAQCAtMzgsNiArMzcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLkFic3RyYWN0VHlwZVNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiAKIHB1YmxpYyBjbGFzcyBTZXJpYWxpemF0aW9uSGVhZGVyCkBAIC0xNjksMTIgKzE2OSwxMiBAQAogCiAgICAgcHVibGljIHZvaWQgd3JpdGVMb2NhbERlbGV0aW9uVGltZShpbnQgbG9jYWxEZWxldGlvblRpbWUsIERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQobG9jYWxEZWxldGlvblRpbWUgLSBzdGF0cy5taW5Mb2NhbERlbGV0aW9uVGltZSk7CisgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGxvY2FsRGVsZXRpb25UaW1lIC0gc3RhdHMubWluTG9jYWxEZWxldGlvblRpbWUpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHdyaXRlVFRMKGludCB0dGwsIERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQodHRsIC0gc3RhdHMubWluVFRMKTsKKyAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIodHRsIC0gc3RhdHMubWluVFRMKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB3cml0ZURlbGV0aW9uVGltZShEZWxldGlvblRpbWUgZHQsIERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCkBAIC0xOTAsMTIgKzE5MCwxMiBAQAogCiAgICAgcHVibGljIGludCByZWFkTG9jYWxEZWxldGlvblRpbWUoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICByZXR1cm4gKGludClpbi5yZWFkVW5zaWduZWRWSW50KCkgKyBzdGF0cy5taW5Mb2NhbERlbGV0aW9uVGltZTsKKyAgICAgICAgcmV0dXJuIGluLnJlYWRVbnNpZ25lZFZJbnQzMigpICsgc3RhdHMubWluTG9jYWxEZWxldGlvblRpbWU7CiAgICAgfQogCiAgICAgcHVibGljIGludCByZWFkVFRMKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgcmV0dXJuIChpbnQpaW4ucmVhZFVuc2lnbmVkVkludCgpICsgc3RhdHMubWluVFRMOworICAgICAgICByZXR1cm4gaW4ucmVhZFVuc2lnbmVkVkludDMyKCkgKyBzdGF0cy5taW5UVEw7CiAgICAgfQogCiAgICAgcHVibGljIERlbGV0aW9uVGltZSByZWFkRGVsZXRpb25UaW1lKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgpAQCAtMzk4LDYgKzM5OCw4IEBACiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNlcmlhbGl6ZXIgaW1wbGVtZW50cyBJTWV0YWRhdGFDb21wb25lbnRTZXJpYWxpemVyPENvbXBvbmVudD4KICAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQWJzdHJhY3RUeXBlU2VyaWFsaXplciB0eXBlU2VyaWFsaXplciA9IG5ldyBBYnN0cmFjdFR5cGVTZXJpYWxpemVyKCk7CisKICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplRm9yTWVzc2FnaW5nKFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyLCBDb2x1bW5GaWx0ZXIgc2VsZWN0aW9uLCBEYXRhT3V0cHV0UGx1cyBvdXQsIGJvb2xlYW4gaGFzU3RhdGljKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgRW5jb2RpbmdTdGF0cy5zZXJpYWxpemVyLnNlcmlhbGl6ZShoZWFkZXIuc3RhdHMsIG91dCk7CkBAIC00NjIsMTAgKzQ2NCw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIEVuY29kaW5nU3RhdHMuc2VyaWFsaXplci5zZXJpYWxpemUoaGVhZGVyLnN0YXRzLCBvdXQpOwogCi0gICAgICAgICAgICB3cml0ZVR5cGUoaGVhZGVyLmtleVR5cGUsIG91dCk7Ci0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoaGVhZGVyLmNsdXN0ZXJpbmdUeXBlcy5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChBYnN0cmFjdFR5cGU8Pz4gdHlwZSA6IGhlYWRlci5jbHVzdGVyaW5nVHlwZXMpCi0gICAgICAgICAgICAgICAgd3JpdGVUeXBlKHR5cGUsIG91dCk7CisgICAgICAgICAgICB0eXBlU2VyaWFsaXplci5zZXJpYWxpemUoaGVhZGVyLmtleVR5cGUsIG91dCk7CisgICAgICAgICAgICB0eXBlU2VyaWFsaXplci5zZXJpYWxpemVMaXN0KGhlYWRlci5jbHVzdGVyaW5nVHlwZXMsIG91dCk7CiAKICAgICAgICAgICAgIHdyaXRlQ29sdW1uc1dpdGhUeXBlcyhoZWFkZXIuc3RhdGljQ29sdW1ucywgb3V0KTsKICAgICAgICAgICAgIHdyaXRlQ29sdW1uc1dpdGhUeXBlcyhoZWFkZXIucmVndWxhckNvbHVtbnMsIG91dCk7CkBAIC00NzYsMTcgKzQ3NiwxMSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBFbmNvZGluZ1N0YXRzIHN0YXRzID0gRW5jb2RpbmdTdGF0cy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGluKTsKIAotICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IGtleVR5cGUgPSByZWFkVHlwZShpbik7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IChpbnQpaW4ucmVhZFVuc2lnbmVkVkludCgpOwotICAgICAgICAgICAgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGNsdXN0ZXJpbmdUeXBlcyA9IG5ldyBBcnJheUxpc3Q8PihzaXplKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICAgICAgICAgIGNsdXN0ZXJpbmdUeXBlcy5hZGQocmVhZFR5cGUoaW4pKTsKKyAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiBrZXlUeXBlID0gdHlwZVNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4pOworICAgICAgICAgICAgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGNsdXN0ZXJpbmdUeXBlcyA9IHR5cGVTZXJpYWxpemVyLmRlc2VyaWFsaXplTGlzdChpbik7CiAKLSAgICAgICAgICAgIE1hcDxCeXRlQnVmZmVyLCBBYnN0cmFjdFR5cGU8Pz4+IHN0YXRpY0NvbHVtbnMgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7Ci0gICAgICAgICAgICBNYXA8Qnl0ZUJ1ZmZlciwgQWJzdHJhY3RUeXBlPD8+PiByZWd1bGFyQ29sdW1ucyA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKLQotICAgICAgICAgICAgcmVhZENvbHVtbnNXaXRoVHlwZShpbiwgc3RhdGljQ29sdW1ucyk7Ci0gICAgICAgICAgICByZWFkQ29sdW1uc1dpdGhUeXBlKGluLCByZWd1bGFyQ29sdW1ucyk7CisgICAgICAgICAgICBNYXA8Qnl0ZUJ1ZmZlciwgQWJzdHJhY3RUeXBlPD8+PiBzdGF0aWNDb2x1bW5zID0gcmVhZENvbHVtbnNXaXRoVHlwZShpbik7CisgICAgICAgICAgICBNYXA8Qnl0ZUJ1ZmZlciwgQWJzdHJhY3RUeXBlPD8+PiByZWd1bGFyQ29sdW1ucyA9IHJlYWRDb2x1bW5zV2l0aFR5cGUoaW4pOwogCiAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudChrZXlUeXBlLCBjbHVzdGVyaW5nVHlwZXMsIHN0YXRpY0NvbHVtbnMsIHJlZ3VsYXJDb2x1bW5zLCBzdGF0cyk7CiAgICAgICAgIH0KQEAgLTQ5NiwxMCArNDkwLDggQEAKICAgICAgICAgewogICAgICAgICAgICAgaW50IHNpemUgPSBFbmNvZGluZ1N0YXRzLnNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoaGVhZGVyLnN0YXRzKTsKIAotICAgICAgICAgICAgc2l6ZSArPSBzaXplb2ZUeXBlKGhlYWRlci5rZXlUeXBlKTsKLSAgICAgICAgICAgIHNpemUgKz0gVHlwZVNpemVzLnNpemVvZlVuc2lnbmVkVkludChoZWFkZXIuY2x1c3RlcmluZ1R5cGVzLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKEFic3RyYWN0VHlwZTw/PiB0eXBlIDogaGVhZGVyLmNsdXN0ZXJpbmdUeXBlcykKLSAgICAgICAgICAgICAgICBzaXplICs9IHNpemVvZlR5cGUodHlwZSk7CisgICAgICAgICAgICBzaXplICs9IHR5cGVTZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKGhlYWRlci5rZXlUeXBlKTsKKyAgICAgICAgICAgIHNpemUgKz0gdHlwZVNlcmlhbGl6ZXIuc2VyaWFsaXplZExpc3RTaXplKGhlYWRlci5jbHVzdGVyaW5nVHlwZXMpOwogCiAgICAgICAgICAgICBzaXplICs9IHNpemVvZkNvbHVtbnNXaXRoVHlwZXMoaGVhZGVyLnN0YXRpY0NvbHVtbnMpOwogICAgICAgICAgICAgc2l6ZSArPSBzaXplb2ZDb2x1bW5zV2l0aFR5cGVzKGhlYWRlci5yZWd1bGFyQ29sdW1ucyk7CkBAIC01MDgsMTEgKzUwMCwxMSBAQAogCiAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUNvbHVtbnNXaXRoVHlwZXMoTWFwPEJ5dGVCdWZmZXIsIEFic3RyYWN0VHlwZTw/Pj4gY29sdW1ucywgRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGNvbHVtbnMuc2l6ZSgpKTsKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGNvbHVtbnMuc2l6ZSgpKTsKICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PEJ5dGVCdWZmZXIsIEFic3RyYWN0VHlwZTw/Pj4gZW50cnkgOiBjb2x1bW5zLmVudHJ5U2V0KCkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVXaXRoVkludExlbmd0aChlbnRyeS5nZXRLZXkoKSwgb3V0KTsKLSAgICAgICAgICAgICAgICB3cml0ZVR5cGUoZW50cnkuZ2V0VmFsdWUoKSwgb3V0KTsKKyAgICAgICAgICAgICAgICB0eXBlU2VyaWFsaXplci5zZXJpYWxpemUoZW50cnkuZ2V0VmFsdWUoKSwgb3V0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC01MjIsMzYgKzUxNCwyMSBAQAogICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8Qnl0ZUJ1ZmZlciwgQWJzdHJhY3RUeXBlPD8+PiBlbnRyeSA6IGNvbHVtbnMuZW50cnlTZXQoKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBzaXplICs9IEJ5dGVCdWZmZXJVdGlsLnNlcmlhbGl6ZWRTaXplV2l0aFZJbnRMZW5ndGgoZW50cnkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgIHNpemUgKz0gc2l6ZW9mVHlwZShlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBzaXplICs9IHR5cGVTZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKGVudHJ5LmdldFZhbHVlKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHNpemU7CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgcmVhZENvbHVtbnNXaXRoVHlwZShEYXRhSW5wdXRQbHVzIGluLCBNYXA8Qnl0ZUJ1ZmZlciwgQWJzdHJhY3RUeXBlPD8+PiB0eXBlTWFwKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgcHJpdmF0ZSBNYXA8Qnl0ZUJ1ZmZlciwgQWJzdHJhY3RUeXBlPD8+PiByZWFkQ29sdW1uc1dpdGhUeXBlKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gKGludClpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gIGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOworICAgICAgICAgICAgTWFwPEJ5dGVCdWZmZXIsIEFic3RyYWN0VHlwZTw/Pj4gdHlwZU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4obGVuZ3RoKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBuYW1lID0gQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhWSW50TGVuZ3RoKGluKTsKLSAgICAgICAgICAgICAgICB0eXBlTWFwLnB1dChuYW1lLCByZWFkVHlwZShpbikpOworICAgICAgICAgICAgICAgIHR5cGVNYXAucHV0KG5hbWUsIHR5cGVTZXJpYWxpemVyLmRlc2VyaWFsaXplKGluKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVUeXBlKEFic3RyYWN0VHlwZTw/PiB0eXBlLCBEYXRhT3V0cHV0UGx1cyBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUT0RPOiB3ZSBzaG91bGQgaGF2ZSBhIHRlcnNlciBzZXJpYWxpemFpb24gZm9ybWF0LiBOb3QgYSBiaWcgZGVhbCB0aG91Z2gKLSAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLndyaXRlV2l0aFZJbnRMZW5ndGgoVVRGOFR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKHR5cGUudG9TdHJpbmcoKSksIG91dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIEFic3RyYWN0VHlwZTw/PiByZWFkVHlwZShEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgQnl0ZUJ1ZmZlciByYXcgPSBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFZJbnRMZW5ndGgoaW4pOwotICAgICAgICAgICAgcmV0dXJuIFR5cGVQYXJzZXIucGFyc2UoVVRGOFR5cGUuaW5zdGFuY2UuY29tcG9zZShyYXcpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IHNpemVvZlR5cGUoQWJzdHJhY3RUeXBlPD8+IHR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5zZXJpYWxpemVkU2l6ZVdpdGhWSW50TGVuZ3RoKFVURjhUeXBlLmluc3RhbmNlLmRlY29tcG9zZSh0eXBlLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIHJldHVybiB0eXBlTWFwOwogICAgICAgICB9CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NpbmdsZVBhcnRpdGlvblJlYWRDb21tYW5kLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TaW5nbGVQYXJ0aXRpb25SZWFkQ29tbWFuZC5qYXZhCmluZGV4IDk2M2I5ZmUuLmQ4NWUyZmUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NpbmdsZVBhcnRpdGlvblJlYWRDb21tYW5kLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU2luZ2xlUGFydGl0aW9uUmVhZENvbW1hbmQuamF2YQpAQCAtMTksNyArMTksMTIgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5OYXZpZ2FibGVTZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCkBAIC0zMCwxOCArMzUsMzcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5Sb3dDYWNoZUtleTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5Sb3dDYWNoZVNlbnRpbmVsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNsdXN0ZXJpbmdJbmRleEZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ2x1c3RlcmluZ0luZGV4TmFtZXNGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNsdXN0ZXJpbmdJbmRleFNsaWNlRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkRhdGFMaW1pdHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLlJvd0ZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuU1NUYWJsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuVmlldzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZS5NZW10YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuQ2FjaGVkQlRyZWVQYXJ0aXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5DYWNoZWRQYXJ0aXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5JbW11dGFibGVCVHJlZVBhcnRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlBhcnRpdGlvbkl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uSXRlcmF0b3JzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuU2luZ2xldG9uVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ2VsbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvd3M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yV2l0aExvd2VyQm91bmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3JzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuV3JhcHBpbmdVbmZpbHRlcmVkUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJhbnNmb3JtLlJUQm91bmRWYWxpZGF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJhbnNmb3JtLlRyYW5zZm9ybWF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWwuVmlydHVhbEtleXNwYWNlUmVnaXN0cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbC5WaXJ0dWFsVGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5SZXF1ZXN0RXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVJlYWRzTGlzdGVuZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlRhYmxlTWV0cmljczsKQEAgLTQ5LDcgKzczLDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkluZGV4TWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2FjaGVTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2xpZW50U3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlUHJveHk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhY2luZy5UcmFjaW5nOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ0cmVlLkJUcmVlU2V0OwpAQCAtNTM4LDIwICs1NjQsMjYgQEAKICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBhIGN1c3RvbSBpdGVyYXRvciBpbnN0ZWFkIG9mIERhdGFMaW1pdHMgdG8gYXZvaWQgc3RvcHBpbmcgdGhlIG9yaWdpbmFsIGl0ZXJhdG9yCi0gICAgICAgICAgICAgICAgICAgIFVuZmlsdGVyZWRSb3dJdGVyYXRvciB0b0NhY2hlSXRlcmF0b3IgPSBuZXcgV3JhcHBpbmdVbmZpbHRlcmVkUm93SXRlcmF0b3IoaXRlcikKKyAgICAgICAgICAgICAgICAgICAgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHRvQ2FjaGVJdGVyYXRvciA9IG5ldyBXcmFwcGluZ1VuZmlsdGVyZWRSb3dJdGVyYXRvcigpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgaW50IHJvd3NDb3VudGVkID0gMDsKIAogICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHdyYXBwZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKQogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByb3dzQ291bnRlZCA8IHJvd3NUb0NhY2hlICYmIHN1cGVyLmhhc05leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm93c0NvdW50ZWQgPCByb3dzVG9DYWNoZSAmJiBpdGVyLmhhc05leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVW5maWx0ZXJlZCBuZXh0KCkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmZpbHRlcmVkIHVuZmlsdGVyZWQgPSBzdXBlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5maWx0ZXJlZCB1bmZpbHRlcmVkID0gaXRlci5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuZmlsdGVyZWQuaXNSb3coKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdyByb3cgPSAoUm93KSB1bmZpbHRlcmVkOwpAQCAtNzEzLDE0ICs3NDUsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKHNob3VsZEluY2x1ZGUoc3N0YWJsZSkpCisgICAgICAgICAgICAgICAgYm9vbGVhbiBpbnRlcnNlY3RzID0gaW50ZXJzZWN0cyhzc3RhYmxlKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGhhc1JlcXVpcmVkU3RhdGljcyA9IGhhc1JlcXVpcmVkU3RhdGljcyhzc3RhYmxlKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25zID0gaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnMoc3N0YWJsZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIWludGVyc2VjdHMgJiYgIWhhc1JlcXVpcmVkU3RhdGljcyAmJiAhaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBub25JbnRlcnNlY3RpbmdTU1RhYmxlcysrOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaW50ZXJzZWN0cyB8fCBoYXNSZXF1aXJlZFN0YXRpY3MpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIXNzdGFibGUuaXNSZXBhaXJlZCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci51cGRhdGVNaW5PbGRlc3RVbnJlcGFpcmVkVG9tYnN0b25lKHNzdGFibGUuZ2V0TWluTG9jYWxEZWxldGlvblRpbWUoKSk7CiAKICAgICAgICAgICAgICAgICAgICAgLy8gJ2l0ZXInIGlzIGFkZGVkIHRvIGl0ZXJhdG9ycyB3aGljaCBpcyBjbG9zZWQgb24gZXhjZXB0aW9uLCBvciB0aHJvdWdoIHRoZSBjbG9zaW5nIG9mIHRoZSBmaW5hbCBtZXJnZWQgaXRlcmF0b3IKICAgICAgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKLSAgICAgICAgICAgICAgICAgICAgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yV2l0aExvd2VyQm91bmQgaXRlciA9IG1ha2VJdGVyYXRvcihjZnMsIHNzdGFibGUsIG1ldHJpY3NDb2xsZWN0b3IpOworICAgICAgICAgICAgICAgICAgICBVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlciA9IGludGVyc2VjdHMgPyBtYWtlUm93SXRlcmF0b3JXaXRoTG93ZXJCb3VuZChjZnMsIHNzdGFibGUsIG1ldHJpY3NDb2xsZWN0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1ha2VSb3dJdGVyYXRvcldpdGhTa2lwcGVkTm9uU3RhdGljQ29udGVudChjZnMsIHNzdGFibGUsIG1ldHJpY3NDb2xsZWN0b3IpOworCiAgICAgICAgICAgICAgICAgICAgIGlucHV0Q29sbGVjdG9yLmFkZFNTVGFibGVJdGVyYXRvcihzc3RhYmxlLCBpdGVyKTsKICAgICAgICAgICAgICAgICAgICAgbW9zdFJlY2VudFBhcnRpdGlvblRvbWJzdG9uZSA9IE1hdGgubWF4KG1vc3RSZWNlbnRQYXJ0aXRpb25Ub21ic3RvbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLnBhcnRpdGlvbkxldmVsRGVsZXRpb24oKS5tYXJrZWRGb3JEZWxldGVBdCgpKTsKQEAgLTcyOCwyNyArNzcyLDMwIEBACiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbm9uSW50ZXJzZWN0aW5nU1NUYWJsZXMrKzsKLSAgICAgICAgICAgICAgICAgICAgLy8gc3N0YWJsZSBjb250YWlucyBubyB0b21ic3RvbmUgaWYgbWF4TG9jYWxEZWxldGlvblRpbWUgPT0gSW50ZWdlci5NQVhfVkFMVUUsIHNvIHdlIGNhbiBzYWZlbHkgc2tpcCB0aG9zZSBlbnRpcmVseQotICAgICAgICAgICAgICAgICAgICBpZiAoc3N0YWJsZS5tYXlIYXZlVG9tYnN0b25lcygpKQorCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzc3RhYmxlIGNvbnRhaW5lZCByYW5nZSBvciBjZWxsIHRvbWJzdG9uZXMsIGl0IHdvdWxkIGludGVyc2VjdDsgc2luY2Ugd2UgYXJlIGhlcmUsIGl0IG1lYW5zCisgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlcmUgYXJlIG5vIGNlbGwgb3IgcmFuZ2UgdG9tYnN0b25lcyB3ZSBhcmUgaW50ZXJlc3RlZCBpbiAoZHVlIHRvIHRoZSBmaWx0ZXIpCisgICAgICAgICAgICAgICAgICAgIC8vIGhvd2V2ZXIsIHdlIGtub3cgdGhhdCB0aGVyZSBhcmUgcGFydGl0aW9uIGxldmVsIGRlbGV0aW9ucyBpbiB0aGlzIHNzdGFibGUgYW5kIHdlIG5lZWQgdG8gbWFrZQorICAgICAgICAgICAgICAgICAgICAvLyBhbiBpdGVyYXRvciBmaWd1cmUgb3V0IHRoYXQgKHNlZSBgU3RhdHNNZXRhZGF0YS5oYXNQYXJ0aXRpb25MZXZlbERlbGV0aW9uc2ApCisKKyAgICAgICAgICAgICAgICAgICAgLy8gJ2l0ZXInIGlzIGFkZGVkIHRvIGl0ZXJhdG9ycyB3aGljaCBpcyBjbG9zZWQgb24gZXhjZXB0aW9uLCBvciB0aHJvdWdoIHRoZSBjbG9zaW5nIG9mIHRoZSBmaW5hbCBtZXJnZWQgaXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKKyAgICAgICAgICAgICAgICAgICAgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXIgPSBtYWtlUm93SXRlcmF0b3JXaXRoU2tpcHBlZE5vblN0YXRpY0NvbnRlbnQoY2ZzLCBzc3RhYmxlLCBtZXRyaWNzQ29sbGVjdG9yKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgc3N0YWJsZSBjb250YWlucyBhIHBhcnRpdGlvbiBkZWxldGUsIHRoZW4gd2UgbXVzdCBpbmNsdWRlIGl0IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdAorICAgICAgICAgICAgICAgICAgICAvLyBzaGFkb3dzIGFueSBvdGhlciBkYXRhIHNlZW4gbG9jYWxseSBhcyB3ZSBjYW4ndCBndWFyYW50ZWUgdGhhdCBvdGhlciByZXBsaWNhcyBoYXZlIHNlZW4gaXQKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVyLnBhcnRpdGlvbkxldmVsRGVsZXRpb24oKS5pc0xpdmUoKSkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ2l0ZXInIGlzIGFkZGVkIHRvIGl0ZXJhdG9ycyB3aGljaCBpcyBjbG9zZWQgb24gZXhjZXB0aW9uLCBvciB0aHJvdWdoIHRoZSBjbG9zaW5nIG9mIHRoZSBmaW5hbCBtZXJnZWQgaXRlcmF0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICBVbmZpbHRlcmVkUm93SXRlcmF0b3JXaXRoTG93ZXJCb3VuZCBpdGVyID0gbWFrZUl0ZXJhdG9yKGNmcywgc3N0YWJsZSwgbWV0cmljc0NvbGxlY3Rvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgc3N0YWJsZSBjb250YWlucyBhIHBhcnRpdGlvbiBkZWxldGUsIHRoZW4gd2UgbXVzdCBpbmNsdWRlIGl0IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hhZG93cyBhbnkgb3RoZXIgZGF0YSBzZWVuIGxvY2FsbHkgYXMgd2UgY2FuJ3QgZ3VhcmFudGVlIHRoYXQgb3RoZXIgcmVwbGljYXMgaGF2ZSBzZWVuIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZXIucGFydGl0aW9uTGV2ZWxEZWxldGlvbigpLmlzTGl2ZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3N0YWJsZS5pc1JlcGFpcmVkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIudXBkYXRlTWluT2xkZXN0VW5yZXBhaXJlZFRvbWJzdG9uZShzc3RhYmxlLmdldE1pbkxvY2FsRGVsZXRpb25UaW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Q29sbGVjdG9yLmFkZFNTVGFibGVJdGVyYXRvcihzc3RhYmxlLCBpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZER1ZVRvVG9tYnN0b25lcysrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vc3RSZWNlbnRQYXJ0aXRpb25Ub21ic3RvbmUgPSBNYXRoLm1heChtb3N0UmVjZW50UGFydGl0aW9uVG9tYnN0b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLnBhcnRpdGlvbkxldmVsRGVsZXRpb24oKS5tYXJrZWRGb3JEZWxldGVBdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNzdGFibGUuaXNSZXBhaXJlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIudXBkYXRlTWluT2xkZXN0VW5yZXBhaXJlZFRvbWJzdG9uZShzc3RhYmxlLmdldE1pbkxvY2FsRGVsZXRpb25UaW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRDb2xsZWN0b3IuYWRkU1NUYWJsZUl0ZXJhdG9yKHNzdGFibGUsIGl0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWREdWVUb1RvbWJzdG9uZXMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vc3RSZWNlbnRQYXJ0aXRpb25Ub21ic3RvbmUgPSBNYXRoLm1heChtb3N0UmVjZW50UGFydGl0aW9uVG9tYnN0b25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIucGFydGl0aW9uTGV2ZWxEZWxldGlvbigpLm1hcmtlZEZvckRlbGV0ZUF0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaXRlci5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNzc5LDMwICs4MjYsNTIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRJbmNsdWRlKFNTVGFibGVSZWFkZXIgc3N0YWJsZSkKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbnRlcnNlY3RzKFNTVGFibGVSZWFkZXIgc3N0YWJsZSkKICAgICB7Ci0gICAgICAgIC8vIElmIHNvbWUgc3RhdGljIGNvbHVtbnMgYXJlIHF1ZXJpZWQsIHdlIHNob3VsZCBhbHdheXMgaW5jbHVkZSB0aGUgc3N0YWJsZTogdGhlIGNsdXN0ZXJpbmcgdmFsdWVzIHN0YXRzIG9mIHRoZSBzc3RhYmxlCi0gICAgICAgIC8vIGRvbid0IHRlbGwgdXMgaWYgdGhlIHNzdGFibGUgY29udGFpbnMgc3RhdGljIHZhbHVlcyBpbiBwYXJ0aWN1bGFyLgotICAgICAgICAvLyBUT0RPOiB3ZSBjb3VsZCByZWNvcmQgaWYgYSBzc3RhYmxlIGNvbnRhaW5zIGFueSBzdGF0aWMgdmFsdWUgYXQgYWxsLgotICAgICAgICBpZiAoIWNvbHVtbkZpbHRlcigpLmZldGNoZWRDb2x1bW5zKCkuc3RhdGljcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICByZXR1cm4gY2x1c3RlcmluZ0luZGV4RmlsdGVyKCkuc2hvdWxkSW5jbHVkZShzc3RhYmxlKTsKKyAgICAgICAgcmV0dXJuIGNsdXN0ZXJpbmdJbmRleEZpbHRlcigpLmludGVyc2VjdHMoc3N0YWJsZS5tZXRhZGF0YSgpLmNvbXBhcmF0b3IsIHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuY292ZXJlZENsdXN0ZXJpbmcpOwogICAgIH0KIAotICAgIHByaXZhdGUgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yV2l0aExvd2VyQm91bmQgbWFrZUl0ZXJhdG9yKENvbHVtbkZhbWlseVN0b3JlIGNmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXIpCisgICAgcHJpdmF0ZSBVbmZpbHRlcmVkUm93SXRlcmF0b3JXaXRoTG93ZXJCb3VuZCBtYWtlUm93SXRlcmF0b3JXaXRoTG93ZXJCb3VuZChDb2x1bW5GYW1pbHlTdG9yZSBjZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcikKICAgICB7CiAgICAgICAgIHJldHVybiBTdG9yYWdlSG9vay5pbnN0YW5jZS5tYWtlUm93SXRlcmF0b3JXaXRoTG93ZXJCb3VuZChjZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25LZXkoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25LZXkoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJpbmdJbmRleEZpbHRlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uRmlsdGVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CiAKICAgICB9CiAKKyAgICBwcml2YXRlIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBtYWtlUm93SXRlcmF0b3IoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdJbmRleE5hbWVzRmlsdGVyIGNsdXN0ZXJpbmdJbmRleEZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXIpCisgICAgeworICAgICAgICByZXR1cm4gU3RvcmFnZUhvb2suaW5zdGFuY2UubWFrZVJvd0l0ZXJhdG9yKGNmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbktleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJpbmdJbmRleEZpbHRlci5nZXRTbGljZXMoY2ZzLm1ldGFkYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkZpbHRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJpbmdJbmRleEZpbHRlci5pc1JldmVyc2VkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIpOworICAgIH0KKworICAgIHByaXZhdGUgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIG1ha2VSb3dJdGVyYXRvcldpdGhTa2lwcGVkTm9uU3RhdGljQ29udGVudChDb2x1bW5GYW1pbHlTdG9yZSBjZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXIpCisgICAgeworICAgICAgICByZXR1cm4gU3RvcmFnZUhvb2suaW5zdGFuY2UubWFrZVJvd0l0ZXJhdG9yKGNmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbktleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsaWNlcy5OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkZpbHRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJpbmdJbmRleEZpbHRlcigpLmlzUmV2ZXJzZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIGEgd3JhcHBlZCBpdGVyYXRvciB0aGF0IHdoZW4gY2xvc2VkIHdpbGwgdXBkYXRlIHRoZSBzc3RhYmxlcyBpdGVyYXRlZCBhbmQgUkVBRCBzYW1wbGUgbWV0cmljcy4KICAgICAgKiBOb3RlIHRoYXQgd2UgY2Fubm90IHVzZSB0aGUgVHJhbnNmb3JtYXRpb25zIGZyYW1ld29yayBiZWNhdXNlIHRoZXkgZ3JlZWRpbHkgZ2V0IHRoZSBzdGF0aWMgcm93LCB3aGljaApAQCAtODIwLDYgKzg4OSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBtZXJnZWQucGFydGl0aW9uS2V5KCk7CiAgICAgICAgICAgICBtZXRyaWNzLnRvcFJlYWRQYXJ0aXRpb25GcmVxdWVuY3kuYWRkU2FtcGxlKGtleS5nZXRLZXkoKSwgMSk7CisgICAgICAgICAgICBtZXRyaWNzLnRvcFJlYWRQYXJ0aXRpb25TU1RhYmxlQ291bnQuYWRkU2FtcGxlKGtleS5nZXRLZXkoKSwgbWV0cmljc0NvbGxlY3Rvci5nZXRNZXJnZWRTU1RhYmxlcygpKTsKICAgICAgICAgfQogCiAgICAgICAgIGNsYXNzIFVwZGF0ZVNzdGFibGVzSXRlcmF0ZWQgZXh0ZW5kcyBUcmFuc2Zvcm1hdGlvbjxVbmZpbHRlcmVkUm93SXRlcmF0b3I+CkBAIC04OTQsMjMgKzk2NCwyMSBAQAogICAgICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKQogICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICBpZiAoIXNob3VsZEluY2x1ZGUoc3N0YWJsZSkpCisgICAgICAgICAgICBib29sZWFuIGludGVyc2VjdHMgPSBpbnRlcnNlY3RzKHNzdGFibGUpOworICAgICAgICAgICAgYm9vbGVhbiBoYXNSZXF1aXJlZFN0YXRpY3MgPSBoYXNSZXF1aXJlZFN0YXRpY3Moc3N0YWJsZSk7CisgICAgICAgICAgICBib29sZWFuIGhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25zID0gaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnMoc3N0YWJsZSk7CisKKyAgICAgICAgICAgIGlmICghaW50ZXJzZWN0cyAmJiAhaGFzUmVxdWlyZWRTdGF0aWNzKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8vIFRoaXMgbWVhbiB0aGF0IG5vdGhpbmcgcXVlcmllZCBieSB0aGUgZmlsdGVyIGNhbiBiZSBpbiB0aGUgc3N0YWJsZS4gT25lIGV4Y2VwdGlvbiBpcyB0aGUgdG9wLWxldmVsIHBhcnRpdGlvbiBkZWxldGlvbgogICAgICAgICAgICAgICAgIC8vIGhvd2V2ZXI6IGlmIGl0IGlzIHNldCwgaXQgaW1wYWN0cyBldmVyeXRoaW5nIGFuZCBtdXN0IGJlIGluY2x1ZGVkLiBHZXR0aW5nIHRoYXQgdG9wLWxldmVsIHBhcnRpdGlvbiBkZWxldGlvbiBjb3N0cyB1cwogICAgICAgICAgICAgICAgIC8vIHNvbWUgc2VlayBpbiBnZW5lcmFsIGhvd2V2ZXIgKHVubGVzcyB0aGUgcGFydGl0aW9uIGlzIGluZGV4ZWQgYW5kIGlzIGluIHRoZSBrZXkgY2FjaGUpLCBzbyB3ZSBmaXJzdCBjaGVjayBpZiB0aGUgc3N0YWJsZQogICAgICAgICAgICAgICAgIC8vIGhhcyBhbnkgdG9tYnN0b25lIGF0IGFsbCBhcyBhIHNob3J0Y3V0LgotICAgICAgICAgICAgICAgIGlmICghc3N0YWJsZS5tYXlIYXZlVG9tYnN0b25lcygpKQorICAgICAgICAgICAgICAgIGlmICghaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnMpCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBubyB0b21ic3RvbmUgYXQgYWxsLCB3ZSBjYW4gc2tpcCB0aGF0IHNzdGFibGUKIAogICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZ2V0IHRoZSBwYXJ0aXRpb24gZGVsZXRpb24gYW5kIGluY2x1ZGUgaXQgaWYgaXQncyBsaXZlLiBJbiBhbnkgY2FzZSB0aG91Z2gsIHdlJ3JlIGRvbmUgd2l0aCB0aGF0IHNzdGFibGUuCi0gICAgICAgICAgICAgICAgdHJ5IChVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlciA9IFN0b3JhZ2VIb29rLmluc3RhbmNlLm1ha2VSb3dJdGVyYXRvcihjZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uS2V5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuZ2V0U2xpY2VzKG1ldGFkYXRhKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uRmlsdGVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuaXNSZXZlcnNlZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljc0NvbGxlY3RvcikpCisgICAgICAgICAgICAgICAgdHJ5IChVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlciA9IG1ha2VSb3dJdGVyYXRvcldpdGhTa2lwcGVkTm9uU3RhdGljQ29udGVudChjZnMsIHNzdGFibGUsIG1ldHJpY3NDb2xsZWN0b3IpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVyLnBhcnRpdGlvbkxldmVsRGVsZXRpb24oKS5pc0xpdmUoKSkKICAgICAgICAgICAgICAgICAgICAgewpAQCAtOTM3LDEzICsxMDA1LDcgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgdHJ5IChVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlciA9IFN0b3JhZ2VIb29rLmluc3RhbmNlLm1ha2VSb3dJdGVyYXRvcihjZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbktleSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuZ2V0U2xpY2VzKG1ldGFkYXRhKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5GaWx0ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLmlzUmV2ZXJzZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljc0NvbGxlY3RvcikpCisgICAgICAgICAgICB0cnkgKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyID0gbWFrZVJvd0l0ZXJhdG9yKGNmcywgc3N0YWJsZSwgZmlsdGVyLCBtZXRyaWNzQ29sbGVjdG9yKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoaXRlci5pc0VtcHR5KCkpCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtOTYzLDYgKzEwMjUsNyBAQAogCiAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSByZXN1bHQucGFydGl0aW9uS2V5KCk7CiAgICAgICAgIGNmcy5tZXRyaWMudG9wUmVhZFBhcnRpdGlvbkZyZXF1ZW5jeS5hZGRTYW1wbGUoa2V5LmdldEtleSgpLCAxKTsKKyAgICAgICAgY2ZzLm1ldHJpYy50b3BSZWFkUGFydGl0aW9uU1NUYWJsZUNvdW50LmFkZFNhbXBsZShrZXkuZ2V0S2V5KCksIG1ldHJpY3NDb2xsZWN0b3IuZ2V0TWVyZ2VkU1NUYWJsZXMoKSk7CiAgICAgICAgIFN0b3JhZ2VIb29rLmluc3RhbmNlLnJlcG9ydFJlYWQoY2ZzLm1ldGFkYXRhLmlkLCBwYXJ0aXRpb25LZXkoKSk7CiAKICAgICAgICAgcmV0dXJuIHJlc3VsdC51bmZpbHRlcmVkSXRlcmF0b3IoY29sdW1uRmlsdGVyKCksIFNsaWNlcy5BTEwsIGNsdXN0ZXJpbmdJbmRleEZpbHRlcigpLmlzUmV2ZXJzZWQoKSk7CkBAIC0xMDIzLDcgKzEwODYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgdG9SZW1vdmUgPSBuZXcgVHJlZVNldDw+KHJlc3VsdC5tZXRhZGF0YSgpLmNvbXBhcmF0b3IpOwogICAgICAgICAgICAgICAgICAgICB0b1JlbW92ZS5hZGQoY2x1c3RlcmluZyk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHRyeSAoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yID0gcmVzdWx0LnVuZmlsdGVyZWRJdGVyYXRvcihjb2x1bW5GaWx0ZXIoKSwgY2x1c3RlcmluZ3MsIGZhbHNlKSkKQEAgLTEyNzYsNyArMTMzOSw3IEBACiAgICAgICAgIHByaXZhdGUgaW50IG1lcmdlZFNTVGFibGVzOwogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNTVGFibGVTZWxlY3RlZChTU1RhYmxlUmVhZGVyIHNzdGFibGUsIFJvd0luZGV4RW50cnk8Pz4gaW5kZXhFbnRyeSwgU2VsZWN0aW9uUmVhc29uIHJlYXNvbikKKyAgICAgICAgcHVibGljIHZvaWQgb25TU1RhYmxlU2VsZWN0ZWQoU1NUYWJsZVJlYWRlciBzc3RhYmxlLCBTZWxlY3Rpb25SZWFzb24gcmVhc29uKQogICAgICAgICB7CiAgICAgICAgICAgICBzc3RhYmxlLmluY3JlbWVudFJlYWRDb3VudCgpOwogICAgICAgICAgICAgbWVyZ2VkU1NUYWJsZXMrKzsKQEAgLTEzMzcsNCArMTQwMCw0IEBACiAgICAgICAgICAgICByZXR1cm4gZXhlY3V0aW9uQ29udHJvbGxlcigpOwogICAgICAgICB9CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NsaWNlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TbGljZS5qYXZhCmluZGV4IGUyYzc4N2QuLjFmYzYwYmEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NsaWNlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU2xpY2UuamF2YQpAQCAtMTksMjQgKzE5LDI4IEBACiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Db21wYXJhYmxlczsKIAogLyoqCiAgKiBBIHNsaWNlIHJlcHJlc2VudHMgdGhlIHNlbGVjdGlvbiBvZiBhIHJhbmdlIG9mIHJvd3MuCiAgKiA8cD4KICAqIEEgc2xpY2UgaGFzIGEgc3RhcnQgYW5kIGFuIGVuZCBib3VuZCB0aGF0IGFyZSBib3RoIChwb3RlbnRpYWxseSBmdWxsKSBjbHVzdGVyaW5nIHByZWZpeGVzLgotICogQSBzbGljZSBzZWxlY3RzIGV2ZXJ5IHJvd3Mgd2hvc2UgY2x1c3RlcmluZyBpcyBiaWdnZXIgdGhhbiB0aGUgc2xpY2Ugc3RhcnQgcHJlZml4IGJ1dCBzbWFsbGVyCi0gKiB0aGFuIHRoZSBlbmQgcHJlZml4LiBCb3RoIHN0YXJ0IGFuZCBlbmQgY2FuIGJlIGVpdGhlciBpbmNsdXNpdmUgb3IgZXhjbHVzaXZlLgorICogQSBzbGljZSBzZWxlY3RzIGV2ZXJ5IHJvdyB3aG9zZSBjbHVzdGVyaW5nIGlzIGluY2x1ZGVkIHdpdGhpbiBpdHMgc3RhcnQgYW5kIGVuZCBib3VuZHMuCisgKiBCb3RoIHN0YXJ0IGFuZCBlbmQgY2FuIGJlIGVpdGhlciBpbmNsdXNpdmUgb3IgZXhjbHVzaXZlLgogICovCiBwdWJsaWMgY2xhc3MgU2xpY2UKIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBTZXJpYWxpemVyKCk7CiAKLSAgICAvKiogVGhlIHNsaWNlIHNlbGVjdGluZyBhbGwgcm93cyAob2YgYSBnaXZlbiBwYXJ0aXRpb24pICovCisgICAgLyoqCisgICAgICogVGhlIHNsaWNlIHNlbGVjdGluZyBhbGwgcm93cyAob2YgYSBnaXZlbiBwYXJ0aXRpb24pCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTbGljZSBBTEwgPSBuZXcgU2xpY2UoQnVmZmVyQ2x1c3RlcmluZ0JvdW5kLkJPVFRPTSwgQnVmZmVyQ2x1c3RlcmluZ0JvdW5kLlRPUCkKICAgICB7CiAgICAgICAgIEBPdmVycmlkZQpAQCAtNDYsOSArNTAsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGludGVyc2VjdHMoQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvciwgTGlzdDxCeXRlQnVmZmVyPiBtaW5DbHVzdGVyaW5nVmFsdWVzLCBMaXN0PEJ5dGVCdWZmZXI+IG1heENsdXN0ZXJpbmdWYWx1ZXMpCisgICAgICAgIHB1YmxpYyBib29sZWFuIGludGVyc2VjdHMoQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvciwgU2xpY2Ugb3RoZXIpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuICFvdGhlci5pc0VtcHR5KGNvbXBhcmF0b3IpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC05MSw2ICs5NSw5IEBACiAgICAgICAgIHJldHVybiBuZXcgU2xpY2UoYnVpbGRlci5idWlsZEJvdW5kKHRydWUsIHRydWUpLCBidWlsZGVyLmJ1aWxkQm91bmQoZmFsc2UsIHRydWUpKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBNYWtlcyBhIHNsaWNlIGNvdmVyaW5nIGEgc2luZ2xlIGNsdXN0ZXJpbmcKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFNsaWNlIG1ha2UoQ2x1c3RlcmluZzw/PiBjbHVzdGVyaW5nKQogICAgIHsKICAgICAgICAgLy8gVGhpcyBkb2Vzbid0IGdpdmUgdXMgd2hhdCB3ZSB3YW50IHdpdGggdGhlIGNsdXN0ZXJpbmcgcHJlZml4CkBAIC05OCwxNCArMTA1LDI1IEBACiAgICAgICAgIHJldHVybiBuZXcgU2xpY2UoQ2x1c3RlcmluZ0JvdW5kLmluY2x1c2l2ZVN0YXJ0T2YoY2x1c3RlcmluZyksIENsdXN0ZXJpbmdCb3VuZC5pbmNsdXNpdmVFbmRPZihjbHVzdGVyaW5nKSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogTWFrZXMgYSBzbGljZSBjb3ZlcmluZyBhIHJhbmdlIGZyb20gc3RhcnQgdG8gZW5kIGNsdXN0ZXJpbmdzLCB3aXRoIGJvdGggc3RhcnQgYW5kIGVuZCBpbmNsdWRlZAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU2xpY2UgbWFrZShDbHVzdGVyaW5nPD8+IHN0YXJ0LCBDbHVzdGVyaW5nPD8+IGVuZCkKICAgICB7CiAgICAgICAgIC8vIFRoaXMgZG9lc24ndCBnaXZlIHVzIHdoYXQgd2Ugd2FudCB3aXRoIHRoZSBjbHVzdGVyaW5nIHByZWZpeAogICAgICAgICBhc3NlcnQgc3RhcnQgIT0gQ2x1c3RlcmluZy5TVEFUSUNfQ0xVU1RFUklORyAmJiBlbmQgIT0gQ2x1c3RlcmluZy5TVEFUSUNfQ0xVU1RFUklORzsKLQogICAgICAgICByZXR1cm4gbmV3IFNsaWNlKENsdXN0ZXJpbmdCb3VuZC5pbmNsdXNpdmVTdGFydE9mKHN0YXJ0KSwgQ2x1c3RlcmluZ0JvdW5kLmluY2x1c2l2ZUVuZE9mKGVuZCkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIE1ha2VzIGEgc2xpY2UgZm9yIHRoZSBnaXZlbiBib3VuZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNsaWNlIG1ha2UoQ2x1c3RlcmluZ0JvdW5kT3JCb3VuZGFyeTw/PiBzdGFydCwgQ2x1c3RlcmluZ0JvdW5kT3JCb3VuZGFyeTw/PiBlbmQpCisgICAgeworICAgICAgICAvLyBUaGlzIGRvZXNuJ3QgZ2l2ZSB1cyB3aGF0IHdlIHdhbnQgd2l0aCB0aGUgY2x1c3RlcmluZyBwcmVmaXgKKyAgICAgICAgcmV0dXJuIG1ha2Uoc3RhcnQuYXNTdGFydEJvdW5kKCksIGVuZC5hc0VuZEJvdW5kKCkpOworICAgIH0KKwogICAgIHB1YmxpYyBDbHVzdGVyaW5nQm91bmQ8Pz4gc3RhcnQoKQogICAgIHsKICAgICAgICAgcmV0dXJuIHN0YXJ0OwpAQCAtMTQxLDMxICsxNTksMjMgQEAKICAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgc2xpY2UgZm9ybWVkIGJ5IHRoZSB0d28gcHJvdmlkZWQgYm91bmQgaXMgZW1wdHkgb3Igbm90LgogICAgICAqCiAgICAgICogQHBhcmFtIGNvbXBhcmF0b3IgdGhlIGNvbXBhcmF0b3IgdG8gY29tcGFyZSB0aGUgYm91bmRzLgotICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgZm9yIHRoZSBzbGljZSB0byBjb25zaWRlci4gVGhpcyBtdXN0IGJlIGEgc3RhcnQgYm91bmQuCi0gICAgICogQHBhcmFtIGVuZCB0aGUgZW5kIGZvciB0aGUgc2xpY2UgdG8gY29uc2lkZXIuIFRoaXMgbXVzdCBiZSBhbiBlbmQgYm91bmQuCisgICAgICogQHBhcmFtIHN0YXJ0ICAgICAgdGhlIHN0YXJ0IGZvciB0aGUgc2xpY2UgdG8gY29uc2lkZXIuIFRoaXMgbXVzdCBiZSBhIHN0YXJ0IGJvdW5kLgorICAgICAqIEBwYXJhbSBlbmQgICAgICAgIHRoZSBlbmQgZm9yIHRoZSBzbGljZSB0byBjb25zaWRlci4gVGhpcyBtdXN0IGJlIGFuIGVuZCBib3VuZC4KICAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHNsaWNlIGZvcm1lZCBieSB7QGNvZGUgc3RhcnR9IGFuZCB7QGNvZGUgZW5kfSBpcwogICAgICAqIGVtcHR5IG9yIG5vdC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbXB0eShDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yLCBDbHVzdGVyaW5nQm91bmQ8Pz4gc3RhcnQsIENsdXN0ZXJpbmdCb3VuZDw/PiBlbmQpCiAgICAgewogICAgICAgICBhc3NlcnQgc3RhcnQuaXNTdGFydCgpICYmIGVuZC5pc0VuZCgpOwotCi0gICAgICAgIGludCBjbXAgPSBjb21wYXJhdG9yLmNvbXBhcmUoc3RhcnQsIGVuZCk7Ci0KLSAgICAgICAgaWYgKGNtcCA8IDApCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIHN0YXJ0LmlzRXhjbHVzaXZlKCkgfHwgZW5kLmlzRXhjbHVzaXZlKCk7CisgICAgICAgIC8vIE5vdGU6IHRoZSBjb21wYXJhdG9yIG9yZGVycyBpbmNsdXNpdmUgc3RhcnRzIGFuZCBleGNsdXNpdmUgZW5kcyBhcyBlcXVhbCwgYW5kIGluY2x1c2l2ZSBlbmRzIGFzIGJlaW5nIGdyZWF0ZXIgdGhhbiBzdGFydHMuCisgICAgICAgIHJldHVybiBjb21wYXJhdG9yLmNvbXBhcmUoc3RhcnQsIGVuZCkgPj0gMDsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBnaXZlbiBjbHVzdGVyaW5nIG9yIGJvdW5kIGlzIGluY2x1ZGVkIGluIHRoaXMgc2xpY2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY29tcGFyYXRvciB0aGUgY29tcGFyYXRvciBmb3IgdGhlIHRhYmxlIHRoaXMgaXMgYSBzbGljZSBvZi4KLSAgICAgKiBAcGFyYW0gYm91bmQgdGhlIGJvdW5kIHRvIHRlc3QgaW5jbHVzaW9uIG9mLgotICAgICAqCisgICAgICogQHBhcmFtIGJvdW5kICAgICAgdGhlIGJvdW5kIHRvIHRlc3QgaW5jbHVzaW9uIG9mLgogICAgICAqIEByZXR1cm4gd2hldGhlciB7QGNvZGUgYm91bmR9IGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoaXMgc2xpY2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaW5jbHVkZXMoQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvciwgQ2x1c3RlcmluZ1ByZWZpeDw/PiBib3VuZCkKQEAgLTE3NiwxMyArMTg2LDEyIEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIHNsaWNlIGZvciBjb250aW51aW5nIHBhZ2luZyBmcm9tIHRoZSBsYXN0IHJldHVybmVkIGNsdXN0ZXJpbmcgcHJlZml4LgogICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBhcmF0b3IgdGhlIGNvbXBhcmF0b3IgZm9yIHRoZSB0YWJsZSB0aGlzIGlzIGEgZmlsdGVyIGZvci4KKyAgICAgKiBAcGFyYW0gY29tcGFyYXRvciAgIHRoZSBjb21wYXJhdG9yIGZvciB0aGUgdGFibGUgdGhpcyBpcyBhIGZpbHRlciBmb3IuCiAgICAgICogQHBhcmFtIGxhc3RSZXR1cm5lZCB0aGUgbGFzdCBjbHVzdGVyaW5nIHRoYXQgd2FzIHJldHVybmVkIGZvciB0aGUgcXVlcnkgd2UgYXJlIHBhZ2luZyBmb3IuIFRoZQotICAgICAqIHJlc3VsdGluZyBzbGljZXMgd2lsbCBiZSBzdWNoIHRoYXQgb25seSByZXN1bHRzIGNvbWluZyBzdHJpY2x5IGFmdGVyIHtAY29kZSBsYXN0UmV0dXJuZWR9IGFyZSByZXR1cm5lZAotICAgICAqICh3aGVyZSBjb21pbmcgYWZ0ZXIgbWVhbnMgImdyZWF0ZXIgdGhhbiIgaWYge0Bjb2RlICFyZXZlcnNlZH0gYW5kICJsZXNzZXIgdGhhbiIgb3RoZXJ3aXNlKS4KLSAgICAgKiBAcGFyYW0gaW5jbHVzaXZlIHdoZXRoZXIgb3Igbm90IHdlIHdhbnQgdG8gaW5jbHVkZSB0aGUge0Bjb2RlIGxhc3RSZXR1cm5lZH0gaW4gdGhlIG5ld2x5IHJldHVybmVkIHBhZ2Ugb2YgcmVzdWx0cy4KLSAgICAgKiBAcGFyYW0gcmV2ZXJzZWQgd2hldGhlciB0aGUgcXVlcnkgd2UncmUgcGFnaW5nIGZvciBpcyByZXZlcnNlZCBvciBub3QuCi0gICAgICoKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGluZyBzbGljZXMgd2lsbCBiZSBzdWNoIHRoYXQgb25seSByZXN1bHRzIGNvbWluZyBzdHJpY2x5IGFmdGVyIHtAY29kZSBsYXN0UmV0dXJuZWR9IGFyZSByZXR1cm5lZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgKHdoZXJlIGNvbWluZyBhZnRlciBtZWFucyAiZ3JlYXRlciB0aGFuIiBpZiB7QGNvZGUgIXJldmVyc2VkfSBhbmQgImxlc3NlciB0aGFuIiBvdGhlcndpc2UpLgorICAgICAqIEBwYXJhbSBpbmNsdXNpdmUgICAgd2hldGhlciB3ZSB3YW50IHRvIGluY2x1ZGUgdGhlIHtAY29kZSBsYXN0UmV0dXJuZWR9IGluIHRoZSBuZXdseSByZXR1cm5lZCBwYWdlIG9mIHJlc3VsdHMuCisgICAgICogQHBhcmFtIHJldmVyc2VkICAgICB3aGV0aGVyIHRoZSBxdWVyeSB3ZSdyZSBwYWdpbmcgZm9yIGlzIHJldmVyc2VkIG9yIG5vdC4KICAgICAgKiBAcmV0dXJuIGEgbmV3IHNsaWNlIHRoYXQgc2VsZWN0cyByZXN1bHRzIGNvbWluZyBhZnRlciB7QGNvZGUgbGFzdFJldHVybmVkfSwgb3Ige0Bjb2RlIG51bGx9IGlmIHBhZ2luZwogICAgICAqIHRoZSByZXN1bHRpbmcgc2xpY2Ugc2VsZWN0cyBub3RoaW5nIChpLmUuIGlmIGl0IG9yaWdpbmFsbHkgc2VsZWN0cyBub3RoaW5nIGNvbWluZyBhZnRlciB7QGNvZGUgbGFzdFJldHVybmVkfSkuCiAgICAgICovCkBAIC0yMjksMjAgKzIzOCwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdpdmVuIHRoZSBwZXItY2x1c3RlcmluZyBjb2x1bW4gbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZSBhIHNzdGFibGUgY29udGFpbnMsIHdoZXRoZXIgb3Igbm90IHRoaXMgc2xpY2UgcG90ZW50aWFsbHkKLSAgICAgKiBpbnRlcnNlY3RzIHRoYXQgc3N0YWJsZSBvciBub3QuCisgICAgICogV2hldGhlciB0aGlzIHNsaWNlIGFuZCB0aGUgcHJvdmlkZWQgc2xpY2UgaW50ZXJzZWN0cy4KICAgICAgKgogICAgICAqIEBwYXJhbSBjb21wYXJhdG9yIHRoZSBjb21wYXJhdG9yIGZvciB0aGUgdGFibGUgdGhpcyBpcyBhIHNsaWNlIG9mLgotICAgICAqIEBwYXJhbSBtaW5DbHVzdGVyaW5nVmFsdWVzIHRoZSBzbWFsbGVzdCB2YWx1ZXMgZm9yIGVhY2ggY2x1c3RlcmluZyBjb2x1bW4gdGhhdCBhIHNzdGFibGUgY29udGFpbnMuCi0gICAgICogQHBhcmFtIG1heENsdXN0ZXJpbmdWYWx1ZXMgdGhlIGJpZ2dlc3QgdmFsdWVzIGZvciBlYWNoIGNsdXN0ZXJpbmcgY29sdW1uIHRoYXQgYSBzc3RhYmxlIGNvbnRhaW5zLgotICAgICAqCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBzbGljZSBtaWdodCBpbnRlcnNlY3RzIHdpdGggdGhlIHNzdGFibGUgaGF2aW5nIHtAY29kZSBtaW5DbHVzdGVyaW5nVmFsdWVzfSBhbmQKLSAgICAgKiB7QGNvZGUgbWF4Q2x1c3RlcmluZ1ZhbHVlc30uCisgICAgICogQHBhcmFtIG90aGVyICAgICAgdGhlIG90aGVyIHNsaWNlIHRvIGNoZWNrIGludGVyc2VjdGlvbiB3aXRoLgorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIHNsaWNlIGludGVyc2VjdHMge0Bjb2RlIG90aGVyfS4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpbnRlcnNlY3RzKENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IsIExpc3Q8Qnl0ZUJ1ZmZlcj4gbWluQ2x1c3RlcmluZ1ZhbHVlcywgTGlzdDxCeXRlQnVmZmVyPiBtYXhDbHVzdGVyaW5nVmFsdWVzKQorICAgIHB1YmxpYyBib29sZWFuIGludGVyc2VjdHMoQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvciwgU2xpY2Ugb3RoZXIpCiAgICAgewotICAgICAgICAvLyBJZiB0aGlzIHNsaWNlIHN0YXJ0cyBhZnRlciBtYXggY2x1c3RlcmluZyBvciBlbmRzIGJlZm9yZSBtaW4gY2x1c3RlcmluZywgaXQgY2FuJ3QgaW50ZXJzZWN0Ci0gICAgICAgIHJldHVybiBzdGFydC5jb21wYXJlVG8oY29tcGFyYXRvciwgbWF4Q2x1c3RlcmluZ1ZhbHVlcykgPD0gMCAmJiBlbmQuY29tcGFyZVRvKGNvbXBhcmF0b3IsIG1pbkNsdXN0ZXJpbmdWYWx1ZXMpID49IDA7CisgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gc2xpY2VzIGFuZCBjaGVjayBpZiBpdCBpcyBub24tZW1wdHkuCisgICAgICAgIC8vIFRoaXMgYWxzbyB3b3JrcyBjb3JyZWN0bHkgd2hlbiBvbmUgb3IgbW9yZSBvZiB0aGUgaW5wdXRzIGFyZSBiZSBlbXB0eSAoaS5lLiB3aXRoIGVuZCA8PSBzdGFydCkuCisgICAgICAgIHJldHVybiBjb21wYXJhdG9yLmNvbXBhcmUoQ29tcGFyYWJsZXMubWF4KHN0YXJ0LCBvdGhlci5zdGFydCwgY29tcGFyYXRvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFyYWJsZXMubWluKGVuZCwgb3RoZXIuZW5kLCBjb21wYXJhdG9yKSkgPCAwOwogICAgIH0KIAogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvcikKQEAgLTI2OSwxMiArMjc2LDEyIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikKICAgICB7Ci0gICAgICAgIGlmKCEob3RoZXIgaW5zdGFuY2VvZiBTbGljZSkpCisgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2xpY2UpKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgIFNsaWNlIHRoYXQgPSAoU2xpY2Upb3RoZXI7CisgICAgICAgIFNsaWNlIHRoYXQgPSAoU2xpY2UpIG90aGVyOwogICAgICAgICByZXR1cm4gdGhpcy5zdGFydCgpLmVxdWFscyh0aGF0LnN0YXJ0KCkpCi0gICAgICAgICAgICAmJiB0aGlzLmVuZCgpLmVxdWFscyh0aGF0LmVuZCgpKTsKKyAgICAgICAgICAgICAgICYmIHRoaXMuZW5kKCkuZXF1YWxzKHRoYXQuZW5kKCkpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjk0LDcgKzMwMSw3IEBACiAgICAgICAgIHB1YmxpYyBsb25nIHNlcmlhbGl6ZWRTaXplKFNsaWNlIHNsaWNlLCBpbnQgdmVyc2lvbiwgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IHR5cGVzKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gQ2x1c3RlcmluZ0JvdW5kLnNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoc2xpY2Uuc3RhcnQsIHZlcnNpb24sIHR5cGVzKQotICAgICAgICAgICAgICAgICArIENsdXN0ZXJpbmdCb3VuZC5zZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKHNsaWNlLmVuZCwgdmVyc2lvbiwgdHlwZXMpOworICAgICAgICAgICAgICAgICAgICsgQ2x1c3RlcmluZ0JvdW5kLnNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoc2xpY2UuZW5kLCB2ZXJzaW9uLCB0eXBlcyk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgU2xpY2UgZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbiwgaW50IHZlcnNpb24sIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiB0eXBlcykgdGhyb3dzIElPRXhjZXB0aW9uCkBAIC0zMDQsNCArMzExLDQgQEAKICAgICAgICAgICAgIHJldHVybiBuZXcgU2xpY2Uoc3RhcnQsIGVuZCk7CiAgICAgICAgIH0KICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU2xpY2VzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TbGljZXMuamF2YQppbmRleCBiM2Y1NjgxLi5iYWU4M2Q1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TbGljZXMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TbGljZXMuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYXRvcnM7CkBAIC01NSw3ICs1Niw3IEBACiAgICAgICogQ3JlYXRlcyBhIHtAY29kZSBTbGljZXN9IG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgc2luZ2xlIHNsaWNlLgogICAgICAqCiAgICAgICogQHBhcmFtIGNvbXBhcmF0b3IgdGhlIGNvbXBhcmF0b3IgZm9yIHRoZSB0YWJsZSB7QGNvZGUgc2xpY2V9IGlzIGEgc2xpY2Ugb2YuCi0gICAgICogQHBhcmFtIHNsaWNlIHRoZSBzaW5nbGUgc2xpY2UgdGhhdCB0aGUgcmV0dXJuIG9iamVjdCBzaG91bGQgY29udGFpbnMuCisgICAgICogQHBhcmFtIHNsaWNlIHRoZSBzaW5nbGUgc2xpY2UgdGhhdCB0aGUgcmV0dXJuIG9iamVjdCBzaG91bGQgY29udGFpbi4KICAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQge0Bjb2RlIFNsaWNlc30gb2JqZWN0LgogICAgICAqLwpAQCAtNjksMTYgKzcwLDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV2hldGhlciB0aGUgc2xpY2VzIGhhcyBhIGxvd2VyIGJvdW5kLCB0aGF0IGlzIHdoZXRoZXIgaXQncyBmaXJzdCBzbGljZSBzdGFydCBpcyB7QGNvZGUgU2xpY2UuQk9UVE9NfS4KKyAgICAgKiBXaGV0aGVyIHRoZSBzbGljZXMgaW5zdGFuY2UgaGFzIGEgbG93ZXIgYm91bmQsIHRoYXQgaXMgd2hldGhlciBpdCdzIGZpcnN0IHNsaWNlIHN0YXJ0IGlzIHtAY29kZSBTbGljZS5CT1RUT019LgogICAgICAqCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBzbGljZXMgaGFzIGEgbG93ZXIgYm91bmQuCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgc2xpY2VzIGluc3RhbmNlIGhhcyBhIGxvd2VyIGJvdW5kLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc0xvd2VyQm91bmQoKTsKIAogICAgIC8qKgotICAgICAqIFdoZXRoZXIgdGhlIHNsaWNlcyBoYXMgYW4gdXBwZXIgYm91bmQsIHRoYXQgaXMgd2hldGhlciBpdCdzIGxhc3Qgc2xpY2UgZW5kIGlzIHtAY29kZSBTbGljZS5UT1B9LgorICAgICAqIFdoZXRoZXIgdGhlIHNsaWNlcyBpbnN0YW5jZSBoYXMgYW4gdXBwZXIgYm91bmQsIHRoYXQgaXMgd2hldGhlciBpdCdzIGxhc3Qgc2xpY2UgZW5kIGlzIHtAY29kZSBTbGljZS5UT1B9LgogICAgICAqCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBzbGljZXMgaGFzIGFuIHVwcGVyIGJvdW5kLgorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIHNsaWNlcyBpbnN0YW5jZSBoYXMgYW4gdXBwZXIgYm91bmQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzVXBwZXJCb3VuZCgpOwogCkBAIC05Niw2ICs5NywxNiBAQAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTbGljZSBnZXQoaW50IGkpOwogCisgICAgcHVibGljIENsdXN0ZXJpbmdCb3VuZDw/PiBzdGFydCgpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0KDApLnN0YXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIENsdXN0ZXJpbmdCb3VuZDw/PiBlbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldChzaXplKCkgLSAxKS5lbmQoKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHNsaWNlcyBmb3IgY29udGludWluZyB0aGUgcGFnaW5nIG9mIHRob3NlIHNsaWNlcyBnaXZlbiB0aGUgbGFzdCByZXR1cm5lZCBjbHVzdGVyaW5nIHByZWZpeC4KICAgICAgKgpAQCAtMTAzLDcgKzExNCw3IEBACiAgICAgICogQHBhcmFtIGxhc3RSZXR1cm5lZCB0aGUgbGFzdCBjbHVzdGVyaW5nIHRoYXQgd2FzIHJldHVybmVkIGZvciB0aGUgcXVlcnkgd2UgYXJlIHBhZ2luZyBmb3IuIFRoZQogICAgICAqIHJlc3VsdGluZyBzbGljZXMgd2lsbCBiZSBzdWNoIHRoYXQgb25seSByZXN1bHRzIGNvbWluZyBzdHJpY2x5IGFmdGVyIHtAY29kZSBsYXN0UmV0dXJuZWR9IGFyZSByZXR1cm5lZAogICAgICAqICh3aGVyZSBjb21pbmcgYWZ0ZXIgbWVhbnMgImdyZWF0ZXIgdGhhbiIgaWYge0Bjb2RlICFyZXZlcnNlZH0gYW5kICJsZXNzZXIgdGhhbiIgb3RoZXJ3aXNlKS4KLSAgICAgKiBAcGFyYW0gaW5jbHVzaXZlIHdoZXRoZXIgb3Igbm90IHdlIHdhbnQgdG8gaW5jbHVkZSB0aGUge0Bjb2RlIGxhc3RSZXR1cm5lZH0gaW4gdGhlIG5ld2x5IHJldHVybmVkIHBhZ2Ugb2YgcmVzdWx0cy4KKyAgICAgKiBAcGFyYW0gaW5jbHVzaXZlIHdoZXRoZXIgd2Ugd2FudCB0byBpbmNsdWRlIHRoZSB7QGNvZGUgbGFzdFJldHVybmVkfSBpbiB0aGUgbmV3bHkgcmV0dXJuZWQgcGFnZSBvZiByZXN1bHRzLgogICAgICAqIEBwYXJhbSByZXZlcnNlZCB3aGV0aGVyIHRoZSBxdWVyeSB3ZSdyZSBwYWdpbmcgZm9yIGlzIHJldmVyc2VkIG9yIG5vdC4KICAgICAgKgogICAgICAqIEByZXR1cm4gbmV3IHNsaWNlcyB0aGF0IHNlbGVjdCByZXN1bHRzIGNvbWluZyBhZnRlciB7QGNvZGUgbGFzdFJldHVybmVkfS4KQEAgLTEzMCwxOCArMTQxLDEzIEBACiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc2VsZWN0cyhDbHVzdGVyaW5nPD8+IGNsdXN0ZXJpbmcpOwogCi0KICAgICAvKioKLSAgICAgKiBHaXZlbiB0aGUgcGVyLWNsdXN0ZXJpbmcgY29sdW1uIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWUgYSBzc3RhYmxlIGNvbnRhaW5zLCB3aGV0aGVyIG9yIG5vdCB0aGlzIHNsaWNlcyBwb3RlbnRpYWxseQotICAgICAqIGludGVyc2VjdHMgdGhhdCBzc3RhYmxlIG9yIG5vdC4KKyAgICAgKiBDaGVja3Mgd2hldGhlciBhbnkgb2YgdGhlIHNsaWNlcyBpbnRlcnNlY3RzIHdpdGh0IHRoZSBnaXZlbiBvbmUuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gbWluQ2x1c3RlcmluZ1ZhbHVlcyB0aGUgc21hbGxlc3QgdmFsdWVzIGZvciBlYWNoIGNsdXN0ZXJpbmcgY29sdW1uIHRoYXQgYSBzc3RhYmxlIGNvbnRhaW5zLgotICAgICAqIEBwYXJhbSBtYXhDbHVzdGVyaW5nVmFsdWVzIHRoZSBiaWdnZXN0IHZhbHVlcyBmb3IgZWFjaCBjbHVzdGVyaW5nIGNvbHVtbiB0aGF0IGEgc3N0YWJsZSBjb250YWlucy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgc2xpY2VzIG1pZ2h0IGludGVyc2VjdHMgd2l0aCB0aGUgc3N0YWJsZSBoYXZpbmcge0Bjb2RlIG1pbkNsdXN0ZXJpbmdWYWx1ZXN9IGFuZAotICAgICAqIHtAY29kZSBtYXhDbHVzdGVyaW5nVmFsdWVzfS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGVyZSBleGlzdHMgYSBzbGljZSB3aGljaCAoe0BsaW5rIFNsaWNlI2ludGVyc2VjdHMoQ2x1c3RlcmluZ0NvbXBhcmF0b3IsIFNsaWNlKX0pIHdpdGgKKyAgICAgKiB0aGUgcHJvdmlkZWQgc2xpY2UKICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpbnRlcnNlY3RzKExpc3Q8Qnl0ZUJ1ZmZlcj4gbWluQ2x1c3RlcmluZ1ZhbHVlcywgTGlzdDxCeXRlQnVmZmVyPiBtYXhDbHVzdGVyaW5nVmFsdWVzKTsKKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpbnRlcnNlY3RzKFNsaWNlIHNsaWNlKTsKIAogICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgdG9DUUxTdHJpbmcoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgUm93RmlsdGVyIHJvd0ZpbHRlcik7CiAKQEAgLTE1NywxMiArMTYzLDEyIEBACiAgICAgLyoqCiAgICAgICogSW4gc2ltcGxlIG9iamVjdCB0aGF0IGFsbG93cyB0byB0ZXN0IHRoZSBpbmNsdXNpb24gb2Ygcm93cyBpbiB0aG9zZSBzbGljZXMgYXNzdW1pbmcgdGhvc2Ugcm93cwogICAgICAqIGFyZSBwYXNzZWQgKHRvIHtAbGluayAjaW5jbHVkZXN9KSBpbiBjbHVzdGVyaW5nIG9yZGVyIChvciByZXZlcnNlIGNsdXN0ZXJpbmcgb3JkZXJlZCwgZGVwZW5kaW5nCi0gICAgICogb2YgdGhlIGFyZ3VtZW50IHBhc3NlZCB0byB7QGxpbmsgI2luT3JkZXJUZXN0ZXJ9KS4KKyAgICAgKiBvbiB0aGUgYXJndW1lbnQgcGFzc2VkIHRvIHtAbGluayAjaW5PcmRlclRlc3Rlcn0pLgogICAgICAqLwogICAgIHB1YmxpYyBpbnRlcmZhY2UgSW5PcmRlclRlc3RlcgogICAgIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaW5jbHVkZXMoQ2x1c3RlcmluZzw/PiB2YWx1ZSk7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRG9uZSgpOworICAgICAgICBib29sZWFuIGluY2x1ZGVzKENsdXN0ZXJpbmc8Pz4gdmFsdWUpOworICAgICAgICBib29sZWFuIGlzRG9uZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjQzLDE3ICsyNDksMTIgQEAKICAgICAgICAgICAgIGlmIChzbGljZXMuc2l6ZSgpIDw9IDEpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHNsaWNlczsKIAotICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChzbGljZXMsIG5ldyBDb21wYXJhdG9yPFNsaWNlPigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKFNsaWNlIHMxLCBTbGljZSBzMikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjID0gY29tcGFyYXRvci5jb21wYXJlKHMxLnN0YXJ0KCksIHMyLnN0YXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgICAgICBzbGljZXMuc29ydCgoczEsIHMyKSAtPiB7CisgICAgICAgICAgICAgICAgaW50IGMgPSBjb21wYXJhdG9yLmNvbXBhcmUoczEuc3RhcnQoKSwgczIuc3RhcnQoKSk7CisgICAgICAgICAgICAgICAgaWYgKGMgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IuY29tcGFyZShzMS5lbmQoKSwgczIuZW5kKCkpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyYXRvci5jb21wYXJlKHMyLmVuZCgpLCBzMS5lbmQoKSk7CiAgICAgICAgICAgICB9KTsKIAogICAgICAgICAgICAgTGlzdDxTbGljZT4gc2xpY2VzQ29weSA9IG5ldyBBcnJheUxpc3Q8PihzbGljZXMuc2l6ZSgpKTsKQEAgLTI3OCwxMiArMjc5LDcgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZXNTdGFydCkKLSAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBTbGljZS5tYWtlKGxhc3Quc3RhcnQoKSwgczIuZW5kKCkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnQgIWluY2x1ZGVzRmluaXNoOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzbGljZXNDb3B5LmFkZChsYXN0KTsKQEAgLTI5NiwxMyArMjkyLDEzIEBACiAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShTbGljZXMgc2xpY2VzLCBEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgaW50IHNpemUgPSBzbGljZXMuc2l6ZSgpOwotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHNpemUpOworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoc2l6ZSk7CiAKICAgICAgICAgICAgIGlmIChzaXplID09IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuOwogCiAgICAgICAgICAgICBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gdHlwZXMgPSBzbGljZXMgPT0gQUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDb2xsZWN0aW9ucy48QWJzdHJhY3RUeXBlPD8+PmVtcHR5TGlzdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKChBcnJheUJhY2tlZFNsaWNlcylzbGljZXMpLmNvbXBhcmF0b3Iuc3VidHlwZXMoKTsKIAogICAgICAgICAgICAgZm9yIChTbGljZSBzbGljZSA6IHNsaWNlcykKQEAgLTMxNyw3ICszMTMsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBzaXplOwogCiAgICAgICAgICAgICBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gdHlwZXMgPSBzbGljZXMgaW5zdGFuY2VvZiBTZWxlY3RBbGxTbGljZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IENvbGxlY3Rpb25zLjxBYnN0cmFjdFR5cGU8Pz4+ZW1wdHlMaXN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKEFycmF5QmFja2VkU2xpY2VzKXNsaWNlcykuY29tcGFyYXRvci5zdWJ0eXBlcygpOwogCiAgICAgICAgICAgICBmb3IgKFNsaWNlIHNsaWNlIDogc2xpY2VzKQpAQCAtMzI4LDcgKzMyNCw3IEBACiAKICAgICAgICAgcHVibGljIFNsaWNlcyBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBpbnQgdmVyc2lvbiwgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBzaXplID0gKGludClpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogCiAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKQogICAgICAgICAgICAgICAgIHJldHVybiBOT05FOwpAQCAtNDQxLDExICs0MzcsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBTbGljZXMuTk9ORTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGludGVyc2VjdHMoTGlzdDxCeXRlQnVmZmVyPiBtaW5DbHVzdGVyaW5nVmFsdWVzLCBMaXN0PEJ5dGVCdWZmZXI+IG1heENsdXN0ZXJpbmdWYWx1ZXMpCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbnRlcnNlY3RzKFNsaWNlIHNsaWNlKQogICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKFNsaWNlIHNsaWNlIDogdGhpcykKKyAgICAgICAgICAgIGZvciAoU2xpY2UgcyA6IHRoaXMpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHNsaWNlLmludGVyc2VjdHMoY29tcGFyYXRvciwgbWluQ2x1c3RlcmluZ1ZhbHVlcywgbWF4Q2x1c3RlcmluZ1ZhbHVlcykpCisgICAgICAgICAgICAgICAgaWYgKHMuaW50ZXJzZWN0cyhjb21wYXJhdG9yLCBzbGljZSkpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNTQwLDE1ICs1MzcsNyBAQAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJ7Iik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNsaWNlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc2xpY2VzW2ldLnRvU3RyaW5nKGNvbXBhcmF0b3IpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzYi5hcHBlbmQoIn0iKS50b1N0cmluZygpOworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5zdHJlYW0oc2xpY2VzKS5tYXAocyAtPiBzLnRvU3RyaW5nKGNvbXBhcmF0b3IpKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiLCAieyIsICJ9IikpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC02MzYsNyArNjI1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA9IGZpcnN0LnN0YXJ0SW5jbHVzaXZlID8gT3BlcmF0b3IuTFRFIDogT3BlcmF0b3IuTFQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgPSBmaXJzdC5zdGFydEluY2x1c2l2ZSA/IE9wZXJhdG9yLkdURSA6IE9wZXJhdG9yLkdUOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcgJykuYXBwZW5kKG9wZXJhdG9yLnRvU3RyaW5nKCkpLmFwcGVuZCgnICcpCisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJyAnKS5hcHBlbmQob3BlcmF0b3IpLmFwcGVuZCgnICcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoY29sdW1uLnR5cGUudG9DUUxTdHJpbmcoZmlyc3Quc3RhcnRWYWx1ZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgcm93RmlsdGVyID0gcm93RmlsdGVyLndpdGhvdXQoY29sdW1uLCBvcGVyYXRvciwgZmlyc3Quc3RhcnRWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTY1MCw3ICs2MzksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yID0gZmlyc3QuZW5kSW5jbHVzaXZlID8gT3BlcmF0b3IuR1RFIDogT3BlcmF0b3IuR1Q7CiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgPSBmaXJzdC5lbmRJbmNsdXNpdmUgPyBPcGVyYXRvci5MVEUgOiBPcGVyYXRvci5MVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpLmFwcGVuZChvcGVyYXRvci50b1N0cmluZygpKS5hcHBlbmQoJyAnKQorICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcgJykuYXBwZW5kKG9wZXJhdG9yKS5hcHBlbmQoJyAnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGNvbHVtbi50eXBlLnRvQ1FMU3RyaW5nKGZpcnN0LmVuZFZhbHVlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICByb3dGaWx0ZXIgPSByb3dGaWx0ZXIud2l0aG91dChjb2x1bW4sIG9wZXJhdG9yLCBmaXJzdC5lbmRWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTY2Nyw3ICs2NTYsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBBbiBzb21ld2hhdCBhZGhvYyB1dGlsaXR5IGNsYXNzIG9ubHkgdXNlZCBieSBuYW1lQXNDUUxTdHJpbmcKKyAgICAgICAgLy8gU29tZXdoYXQgYWRob2MgdXRpbGl0eSBjbGFzcyBvbmx5IHVzZWQgYnkgbmFtZUFzQ1FMU3RyaW5nCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbXBvbmVudE9mU2xpY2UKICAgICAgICAgewogICAgICAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3RhcnRJbmNsdXNpdmU7CkBAIC03NjgsNyArNzU3LDggQEAKICAgICAgICAgICAgIHJldHVybiB0cml2aWFsVGVzdGVyOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaW50ZXJzZWN0cyhMaXN0PEJ5dGVCdWZmZXI+IG1pbkNsdXN0ZXJpbmdWYWx1ZXMsIExpc3Q8Qnl0ZUJ1ZmZlcj4gbWF4Q2x1c3RlcmluZ1ZhbHVlcykKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGludGVyc2VjdHMoU2xpY2Ugc2xpY2UpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CkBAIC04NDQsNyArODM0LDggQEAKICAgICAgICAgICAgIHJldHVybiB0cml2aWFsVGVzdGVyOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaW50ZXJzZWN0cyhMaXN0PEJ5dGVCdWZmZXI+IG1pbkNsdXN0ZXJpbmdWYWx1ZXMsIExpc3Q8Qnl0ZUJ1ZmZlcj4gbWF4Q2x1c3RlcmluZ1ZhbHVlcykKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGludGVyc2VjdHMoU2xpY2Ugc2xpY2UpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpAQCAtODY2LDQgKzg1Nyw0IEBACiAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgIH0KICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU25hcHNob3REZXRhaWxzVGFidWxhckRhdGEuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NuYXBzaG90RGV0YWlsc1RhYnVsYXJEYXRhLmphdmEKaW5kZXggNGU2YWIxMS4uYzVkZWJlNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU25hcHNob3REZXRhaWxzVGFidWxhckRhdGEuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TbmFwc2hvdERldGFpbHNUYWJ1bGFyRGF0YS5qYXZhCkBAIC0xOSw3ICsxOSw2IEBACiAKIGltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi4qOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2Uuc25hcHNob3QuVGFibGVTbmFwc2hvdDsKIApAQCAtMzIsNyArMzEsOCBAQAogICAgICAgICAgICAgIlRydWUgc2l6ZSIsCiAgICAgICAgICAgICAiU2l6ZSBvbiBkaXNrIiwKICAgICAgICAgICAgICJDcmVhdGlvbiB0aW1lIiwKLSAgICAgICAgICAgICJFeHBpcmF0aW9uIHRpbWUiLH07CisgICAgICAgICAgICAiRXhwaXJhdGlvbiB0aW1lIiwKKyAgICAgICAgICAgICJFcGhlbWVyYWwifTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIElURU1fREVTQ1MgPSBuZXcgU3RyaW5nW117InNuYXBzaG90X25hbWUiLAogICAgICAgICAgICAgImtleXNwYWNlX25hbWUiLApAQCAtNDAsNyArNDAsOCBAQAogICAgICAgICAgICAgIlRydWVEaXNrU3BhY2VVc2VkIiwKICAgICAgICAgICAgICJUb3RhbERpc2tTcGFjZVVzZWQiLAogICAgICAgICAgICAgImNyZWF0ZWRfYXQiLAotICAgICAgICAgICAgImV4cGlyZXNfYXQiLH07CisgICAgICAgICAgICAiZXhwaXJlc19hdCIsCisgICAgICAgICAgICAiZXBoZW1lcmFsIn07CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9OQU1FID0gIlNuYXBzaG90RGV0YWlscyI7CiAKQEAgLTU2LDcgKzU3LDcgQEAKICAgICB7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBJVEVNX1RZUEVTID0gbmV3IE9wZW5UeXBlW117IFNpbXBsZVR5cGUuU1RSSU5HLCBTaW1wbGVUeXBlLlNUUklORywgU2ltcGxlVHlwZS5TVFJJTkcsIFNpbXBsZVR5cGUuU1RSSU5HLCBTaW1wbGVUeXBlLlNUUklORywgU2ltcGxlVHlwZS5TVFJJTkcsIFNpbXBsZVR5cGUuU1RSSU5HIH07CisgICAgICAgICAgICBJVEVNX1RZUEVTID0gbmV3IE9wZW5UeXBlW117IFNpbXBsZVR5cGUuU1RSSU5HLCBTaW1wbGVUeXBlLlNUUklORywgU2ltcGxlVHlwZS5TVFJJTkcsIFNpbXBsZVR5cGUuU1RSSU5HLCBTaW1wbGVUeXBlLlNUUklORywgU2ltcGxlVHlwZS5TVFJJTkcsIFNpbXBsZVR5cGUuU1RSSU5HLCBTaW1wbGVUeXBlLlNUUklORyB9OwogCiAgICAgICAgICAgICBDT01QT1NJVEVfVFlQRSA9IG5ldyBDb21wb3NpdGVUeXBlKFRZUEVfTkFNRSwgUk9XX0RFU0MsIElURU1fTkFNRVMsIElURU1fREVTQ1MsIElURU1fVFlQRVMpOwogCkBAIC02NCw3ICs2NSw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKE9wZW5EYXRhRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTc3LDggKzc4LDkgQEAKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsaXZlU2l6ZSA9ICBGaWxlVXRpbHMuc3RyaW5naWZ5RmlsZVNpemUoZGV0YWlscy5jb21wdXRlVHJ1ZVNpemVCeXRlcygpKTsKICAgICAgICAgICAgIFN0cmluZyBjcmVhdGVkQXQgPSBzYWZlVG9TdHJpbmcoZGV0YWlscy5nZXRDcmVhdGVkQXQoKSk7CiAgICAgICAgICAgICBTdHJpbmcgZXhwaXJlc0F0ID0gc2FmZVRvU3RyaW5nKGRldGFpbHMuZ2V0RXhwaXJlc0F0KCkpOworICAgICAgICAgICAgU3RyaW5nIGVwaGVtZXJhbCA9IEJvb2xlYW4udG9TdHJpbmcoZGV0YWlscy5pc0VwaGVtZXJhbCgpKTsKICAgICAgICAgICAgIHJlc3VsdC5wdXQobmV3IENvbXBvc2l0ZURhdGFTdXBwb3J0KENPTVBPU0lURV9UWVBFLCBJVEVNX05BTUVTLAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IGRldGFpbHMuZ2V0VGFnKCksIGRldGFpbHMuZ2V0S2V5c3BhY2VOYW1lKCksIGRldGFpbHMuZ2V0VGFibGVOYW1lKCksIGxpdmVTaXplLCB0b3RhbFNpemUsIGNyZWF0ZWRBdCwgZXhwaXJlc0F0IH0pKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBkZXRhaWxzLmdldFRhZygpLCBkZXRhaWxzLmdldEtleXNwYWNlTmFtZSgpLCBkZXRhaWxzLmdldFRhYmxlTmFtZSgpLCBsaXZlU2l6ZSwgdG90YWxTaXplLCBjcmVhdGVkQXQsIGV4cGlyZXNBdCwgZXBoZW1lcmFsIH0pKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoT3BlbkRhdGFFeGNlcHRpb24gZSkKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU3RvcmFnZUhvb2suamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1N0b3JhZ2VIb29rLmphdmEKaW5kZXggYzk5ODMzOC4uZjVmZGVjNiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU3RvcmFnZUhvb2suamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TdG9yYWdlSG9vay5qYXZhCkBAIC0yMywxMSArMjMsMTMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlBhcnRpdGlvblVwZGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcldpdGhMb3dlckJvdW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVJlYWRzTGlzdGVuZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlNUT1JBR0VfSE9PSzsKKwogcHVibGljIGludGVyZmFjZSBTdG9yYWdlSG9vawogewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RvcmFnZUhvb2sgaW5zdGFuY2UgPSBjcmVhdGVIb29rKCk7CkBAIC0zNSwxMSArMzcsMTEgQEAKICAgICBwdWJsaWMgdm9pZCByZXBvcnRXcml0ZShUYWJsZUlkIHRhYmxlSWQsIFBhcnRpdGlvblVwZGF0ZSBwYXJ0aXRpb25VcGRhdGUpOwogICAgIHB1YmxpYyB2b2lkIHJlcG9ydFJlYWQoVGFibGVJZCB0YWJsZUlkLCBEZWNvcmF0ZWRLZXkga2V5KTsKICAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yV2l0aExvd2VyQm91bmQgbWFrZVJvd0l0ZXJhdG9yV2l0aExvd2VyQm91bmQoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBwYXJ0aXRpb25LZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdJbmRleEZpbHRlciBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uRmlsdGVyIHNlbGVjdGVkQ29sdW1ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IHBhcnRpdGlvbktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2x1c3RlcmluZ0luZGV4RmlsdGVyIGZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uRmlsdGVyIHNlbGVjdGVkQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXIpOwogICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3IgbWFrZVJvd0l0ZXJhdG9yKENvbHVtbkZhbWlseVN0b3JlIGNmcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSwKQEAgLTUwLDcgKzUyLDcgQEAKIAogICAgIHN0YXRpYyBTdG9yYWdlSG9vayBjcmVhdGVIb29rKCkKICAgICB7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAgU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEuc3RvcmFnZV9ob29rIik7CisgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBTVE9SQUdFX0hPT0suZ2V0U3RyaW5nKCk7CiAgICAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIEZCVXRpbGl0aWVzLmNvbnN0cnVjdChjbGFzc05hbWUsIFN0b3JhZ2VIb29rLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7CkBAIC02Myw4ICs2NSw3IEBACiAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZXBvcnRSZWFkKFRhYmxlSWQgdGFibGVJZCwgRGVjb3JhdGVkS2V5IGtleSkge30KIAogICAgICAgICAgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvcldpdGhMb3dlckJvdW5kIG1ha2VSb3dJdGVyYXRvcldpdGhMb3dlckJvdW5kKENvbHVtbkZhbWlseVN0b3JlIGNmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUsIERlY29yYXRlZEtleSBwYXJ0aXRpb25LZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2x1c3RlcmluZ0luZGV4RmlsdGVyIGZpbHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5GaWx0ZXIgc2VsZWN0ZWRDb2x1bW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkc0xpc3RlbmVyIGxpc3RlbmVyKQpAQCAtODgsNCArODksNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9OwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TeXN0ZW1LZXlzcGFjZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU3lzdGVtS2V5c3BhY2UuamF2YQppbmRleCBmZDIxNDViLi5lYjBlNTA4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TeXN0ZW1LZXlzcGFjZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1N5c3RlbUtleXNwYWNlLmphdmEKQEAgLTU4LDE2ICs1OCwxMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5RdWVyeVByb2Nlc3NvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlVudHlwZWRSZXN1bHRTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuQWdncmVnYXRlRmN0czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5CeXRlc0NvbnZlcnNpb25GY3RzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkNhc3RGY3RzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLk9wZXJhdGlvbkZjdHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuVGltZUZjdHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuVXVpZEZjdHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLnNjaGVtYS5DcmVhdGVUYWJsZVN0YXRlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZy5Db21taXRMb2dQb3NpdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25IaXN0b3J5VGFidWxhckRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlQnVmZmVyQWNjZXNzb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlc1R5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Mb25nVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlRpbWVVVUlEVHlwZTsKQEAgLTk0LDcgKzg5LDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlRvcFBhcnRpdGlvblRyYWNrZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2luZ1NlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbXBhY3Rpb25QYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkZ1bmN0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKQEAgLTEwMyw2ICs5Nyw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlVzZXJGdW5jdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlZpZXdzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy5CYWxsb3Q7CkBAIC0xNTIsNiArMTQ3LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVRDSEVTID0gImJhdGNoZXMiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBWE9TID0gInBheG9zIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVhPU19SRVBBSVJfSElTVE9SWSA9ICJwYXhvc19yZXBhaXJfaGlzdG9yeSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFYT1NfUkVQQUlSX1NUQVRFID0gIl9wYXhvc19yZXBhaXJfc3RhdGUiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxUX0lOREVYRVMgPSAiSW5kZXhJbmZvIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTCA9ICJsb2NhbCI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVFUlNfVjIgPSAicGVlcnNfdjIiOwpAQCAtMTg3LDYgKzE4MywxNCBAQAogICAgIEBEZXByZWNhdGVkIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFR0FDWV9TSVpFX0VTVElNQVRFUyA9ICJzaXplX2VzdGltYXRlcyI7CiAgICAgQERlcHJlY2F0ZWQgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX1NTVEFCTEVfQUNUSVZJVFkgPSAic3N0YWJsZV9hY3Rpdml0eSI7CiAKKyAgICAvLyBOYW1lcyBvZiBhbGwgdGFibGVzIHRoYXQgY291bGQgaGF2ZSBiZWVuIGEgcGFydCBvZiBhIHN5c3RlbSBrZXlzcGFjZS4gVXNlZnVsIGZvciBwcmUtZmxpZ2h0IGNoZWNrcy4KKyAgICAvLyBGb3IgZGV0YWlscywgc2VlIENBU1NBTkRSQS0xNzc3NworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gQUxMX1RBQkxFX05BTUVTID0gSW1tdXRhYmxlU2V0Lm9mKAorICAgICAgICBCQVRDSEVTLCBQQVhPUywgUEFYT1NfUkVQQUlSX0hJU1RPUlksIFBBWE9TX1JFUEFJUl9TVEFURSwgQlVJTFRfSU5ERVhFUywgTE9DQUwsIFBFRVJTX1YyLCBQRUVSX0VWRU5UU19WMiwKKyAgICAgICAgQ09NUEFDVElPTl9ISVNUT1JZLCBTU1RBQkxFX0FDVElWSVRZX1YyLCBUQUJMRV9FU1RJTUFURVMsIFRBQkxFX0VTVElNQVRFU19UWVBFX1BSSU1BUlksCisgICAgICAgIFRBQkxFX0VTVElNQVRFU19UWVBFX0xPQ0FMX1BSSU1BUlksIEFWQUlMQUJMRV9SQU5HRVNfVjIsIFRSQU5TRkVSUkVEX1JBTkdFU19WMiwgVklFV19CVUlMRFNfSU5fUFJPR1JFU1MsCisgICAgICAgIEJVSUxUX1ZJRVdTLCBQUkVQQVJFRF9TVEFURU1FTlRTLCBSRVBBSVJTLCBUT1BfUEFSVElUSU9OUywgTEVHQUNZX1BFRVJTLCBMRUdBQ1lfUEVFUl9FVkVOVFMsCisgICAgICAgIExFR0FDWV9UUkFOU0ZFUlJFRF9SQU5HRVMsIExFR0FDWV9BVkFJTEFCTEVfUkFOR0VTLCBMRUdBQ1lfU0laRV9FU1RJTUFURVMsIExFR0FDWV9TU1RBQkxFX0FDVElWSVRZKTsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVGFibGVNZXRhZGF0YSBCYXRjaGVzID0KICAgICAgICAgcGFyc2UoQkFUQ0hFUywKQEAgLTMwOCw2ICszMTIsNyBAQAogICAgICAgICAgICAgICAgICsgImNvbXBhY3RlZF9hdCB0aW1lc3RhbXAsIgogICAgICAgICAgICAgICAgICsgImtleXNwYWNlX25hbWUgdGV4dCwiCiAgICAgICAgICAgICAgICAgKyAicm93c19tZXJnZWQgbWFwPGludCwgYmlnaW50PiwiCisgICAgICAgICAgICAgICAgKyAiY29tcGFjdGlvbl9wcm9wZXJ0aWVzIGZyb3plbjxtYXA8dGV4dCwgdGV4dD4+LCIKICAgICAgICAgICAgICAgICArICJQUklNQVJZIEtFWSAoKGlkKSkpIikKICAgICAgICAgICAgICAgICAuZGVmYXVsdFRpbWVUb0xpdmUoKGludCkgVGltZVVuaXQuREFZUy50b1NlY29uZHMoNykpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CkBAIC01MDksNyArNTE0LDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgS2V5c3BhY2VNZXRhZGF0YSBtZXRhZGF0YSgpCiAgICAgewotICAgICAgICByZXR1cm4gS2V5c3BhY2VNZXRhZGF0YS5jcmVhdGUoU2NoZW1hQ29uc3RhbnRzLlNZU1RFTV9LRVlTUEFDRV9OQU1FLCBLZXlzcGFjZVBhcmFtcy5sb2NhbCgpLCB0YWJsZXMoKSwgVmlld3Mubm9uZSgpLCBUeXBlcy5ub25lKCksIGZ1bmN0aW9ucygpKTsKKyAgICAgICAgcmV0dXJuIEtleXNwYWNlTWV0YWRhdGEuY3JlYXRlKFNjaGVtYUNvbnN0YW50cy5TWVNURU1fS0VZU1BBQ0VfTkFNRSwgS2V5c3BhY2VQYXJhbXMubG9jYWwoKSwgdGFibGVzKCksIFZpZXdzLm5vbmUoKSwgVHlwZXMubm9uZSgpLCBVc2VyRnVuY3Rpb25zLm5vbmUoKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgVGFibGVzIHRhYmxlcygpCkBAIC01MzksMTggKzU0NCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgVG9wUGFydGl0aW9ucyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgRnVuY3Rpb25zIGZ1bmN0aW9ucygpCi0gICAgewotICAgICAgICByZXR1cm4gRnVuY3Rpb25zLmJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChVdWlkRmN0cy5hbGwoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoVGltZUZjdHMuYWxsKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkKEJ5dGVzQ29udmVyc2lvbkZjdHMuYWxsKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkKEFnZ3JlZ2F0ZUZjdHMuYWxsKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkKENhc3RGY3RzLmFsbCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChPcGVyYXRpb25GY3RzLmFsbCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgTWFwPFRhYmxlSWQsIFBhaXI8Q29tbWl0TG9nUG9zaXRpb24sIExvbmc+PiB0cnVuY2F0aW9uUmVjb3JkczsKIAogICAgIHB1YmxpYyBlbnVtIEJvb3RzdHJhcFN0YXRlCkBAIC02MTUsMTIgKzYwOCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGNvbXBhY3RlZEF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGJ5dGVzSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgYnl0ZXNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxJbnRlZ2VyLCBMb25nPiByb3dzTWVyZ2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8SW50ZWdlciwgTG9uZz4gcm93c01lcmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBjb21wYWN0aW9uUHJvcGVydGllcykKICAgICB7CiAgICAgICAgIC8vIGRvbid0IHdyaXRlIGFueXRoaW5nIHdoZW4gdGhlIGhpc3RvcnkgdGFibGUgaXRzZWxmIGlzIGNvbXBhY3RlZCwgc2luY2UgdGhhdCB3b3VsZCBpbiB0dXJuIGNhdXNlIG5ldyBjb21wYWN0aW9ucwogICAgICAgICBpZiAoa3NuYW1lLmVxdWFscygic3lzdGVtIikgJiYgY2ZuYW1lLmVxdWFscyhDT01QQUNUSU9OX0hJU1RPUlkpKQogICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBTdHJpbmcgcmVxID0gIklOU0VSVCBJTlRPIHN5c3RlbS4lcyAoaWQsIGtleXNwYWNlX25hbWUsIGNvbHVtbmZhbWlseV9uYW1lLCBjb21wYWN0ZWRfYXQsIGJ5dGVzX2luLCBieXRlc19vdXQsIHJvd3NfbWVyZ2VkKSBWQUxVRVMgKD8sID8sID8sID8sID8sID8sID8pIjsKKyAgICAgICAgU3RyaW5nIHJlcSA9ICJJTlNFUlQgSU5UTyBzeXN0ZW0uJXMgKGlkLCBrZXlzcGFjZV9uYW1lLCBjb2x1bW5mYW1pbHlfbmFtZSwgY29tcGFjdGVkX2F0LCBieXRlc19pbiwgYnl0ZXNfb3V0LCByb3dzX21lcmdlZCwgY29tcGFjdGlvbl9wcm9wZXJ0aWVzKSBWQUxVRVMgKD8sID8sID8sID8sID8sID8sID8sID8pIjsKICAgICAgICAgZXhlY3V0ZUludGVybmFsKGZvcm1hdChyZXEsIENPTVBBQ1RJT05fSElTVE9SWSksCiAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0VGltZVVVSUQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGtzbmFtZSwKQEAgLTYyOCw3ICs2MjIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoY29tcGFjdGVkQXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNJbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgcm93c01lcmdlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByb3dzTWVyZ2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFjdGlvblByb3BlcnRpZXMpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgVGFidWxhckRhdGEgZ2V0Q29tcGFjdGlvbkhpc3RvcnkoKSB0aHJvd3MgT3BlbkRhdGFFeGNlcHRpb24KQEAgLTE0ODcsOCArMTQ4Miw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBSZXN0b3JhYmxlTWV0ZXIgZ2V0U1NUYWJsZVJlYWRNZXRlcihTdHJpbmcga2V5c3BhY2UsIFN0cmluZyB0YWJsZSwgU1NUYWJsZUlkIGlkKQogICAgIHsKLSAgICAgICAgU3RyaW5nIGNxbCA9ICJTRUxFQ1QgKiBGUk9NIHN5c3RlbS4lcyBXSEVSRSBrZXlzcGFjZV9uYW1lPT8gYW5kIHRhYmxlX25hbWU9PyBhbmQgaWQ9PyI7Ci0gICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcmVzdWx0cyA9IGV4ZWN1dGVJbnRlcm5hbChmb3JtYXQoY3FsLCBTU1RBQkxFX0FDVElWSVRZX1YyKSwga2V5c3BhY2UsIHRhYmxlLCBpZC50b1N0cmluZygpKTsKKyAgICAgICAgVW50eXBlZFJlc3VsdFNldCByZXN1bHRzID0gcmVhZFNTVGFibGVBY3Rpdml0eShrZXlzcGFjZSwgdGFibGUsIGlkKTsKIAogICAgICAgICBpZiAocmVzdWx0cy5pc0VtcHR5KCkpCiAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc3RvcmFibGVNZXRlcigpOwpAQCAtMTQ5OSw2ICsxNDkzLDEzIEBACiAgICAgICAgIHJldHVybiBuZXcgUmVzdG9yYWJsZU1ldGVyKG0xNXJhdGUsIG0xMjByYXRlKTsKICAgICB9CiAKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgc3RhdGljIFVudHlwZWRSZXN1bHRTZXQgcmVhZFNTVGFibGVBY3Rpdml0eShTdHJpbmcga2V5c3BhY2UsIFN0cmluZyB0YWJsZSwgU1NUYWJsZUlkIGlkKQorICAgIHsKKyAgICAgICAgU3RyaW5nIGNxbCA9ICJTRUxFQ1QgKiBGUk9NIHN5c3RlbS4lcyBXSEVSRSBrZXlzcGFjZV9uYW1lPT8gYW5kIHRhYmxlX25hbWU9PyBhbmQgaWQ9PyI7CisgICAgICAgIHJldHVybiBleGVjdXRlSW50ZXJuYWwoZm9ybWF0KGNxbCwgU1NUQUJMRV9BQ1RJVklUWV9WMiksIGtleXNwYWNlLCB0YWJsZSwgaWQudG9TdHJpbmcoKSk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogV3JpdGVzIHRoZSBjdXJyZW50IHJlYWQgcmF0ZXMgZm9yIGEgZ2l2ZW4gU1NUYWJsZSB0byBzeXN0ZW0uc3N0YWJsZV9hY3Rpdml0eQogICAgICAqLwpAQCAtMTY2NSwxMiArMTY2NiwxOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0QXZhaWxhYmxlUmFuZ2VzKCkKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRBdmFpbGFibGVTdHJlYW1lZFJhbmdlcygpCiAgICAgewogICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBhdmFpbGFibGVSYW5nZXMgPSBLZXlzcGFjZS5vcGVuKFNjaGVtYUNvbnN0YW50cy5TWVNURU1fS0VZU1BBQ0VfTkFNRSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQVZBSUxBQkxFX1JBTkdFU19WMik7CiAgICAgICAgIGF2YWlsYWJsZVJhbmdlcy50cnVuY2F0ZUJsb2NraW5nV2l0aG91dFNuYXBzaG90KCk7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0QXZhaWxhYmxlU3RyZWFtZWRSYW5nZXNGb3JLZXlzcGFjZShTdHJpbmcga2V5c3BhY2UpCisgICAgeworICAgICAgICBTdHJpbmcgY3FsID0gIkRFTEVURSBGUk9NICVzLiVzIFdIRVJFIGtleXNwYWNlX25hbWUgPSA/IjsKKyAgICAgICAgZXhlY3V0ZUludGVybmFsKGZvcm1hdChjcWwsIFNjaGVtYUNvbnN0YW50cy5TWVNURU1fS0VZU1BBQ0VfTkFNRSwgQVZBSUxBQkxFX1JBTkdFU19WMiksIGtleXNwYWNlKTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHVwZGF0ZVRyYW5zZmVycmVkUmFuZ2VzKFN0cmVhbU9wZXJhdGlvbiBzdHJlYW1PcGVyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzc0FuZFBvcnQgcGVlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXlzcGFjZSwKQEAgLTE3ODAsNyArMTc4Nyw4IEBACiAgICAgICAgIHJldHVybiByYXdSYW5nZXMuc3RyZWFtKCkubWFwKGJ1ZiAtPiBieXRlQnVmZmVyVG9SYW5nZShidWYsIHBhcnRpdGlvbmVyKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOwogICAgIH0KIAotICAgIHN0YXRpYyBCeXRlQnVmZmVyIHJhbmdlVG9CeXRlcyhSYW5nZTxUb2tlbj4gcmFuZ2UpCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyIHJhbmdlVG9CeXRlcyhSYW5nZTxUb2tlbj4gcmFuZ2UpCiAgICAgewogICAgICAgICB0cnkgKERhdGFPdXRwdXRCdWZmZXIgb3V0ID0gbmV3IERhdGFPdXRwdXRCdWZmZXIoKSkKICAgICAgICAgewpAQCAtMTg5OSw3ICsxOTA3LDcgQEAKICAgICAgICAgICAgIFR1cGxlVHlwZSB0dXBsZVR5cGUgPSBuZXcgVHVwbGVUeXBlKExpc3RzLm5ld0FycmF5TGlzdChVVEY4VHlwZS5pbnN0YW5jZSwgTG9uZ1R5cGUuaW5zdGFuY2UpKTsKICAgICAgICAgICAgIGZvciAoQnl0ZUJ1ZmZlciBiYiA6IHRvcCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyW10gY29tcG9uZW50cyA9IHR1cGxlVHlwZS5zcGxpdChiYik7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlcltdIGNvbXBvbmVudHMgPSB0dXBsZVR5cGUuc3BsaXQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBiYik7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGtleVN0ciA9IFVURjhUeXBlLmluc3RhbmNlLmNvbXBvc2UoY29tcG9uZW50c1swXSk7CiAgICAgICAgICAgICAgICAgbG9uZyB2YWx1ZSA9IExvbmdUeXBlLmluc3RhbmNlLmNvbXBvc2UoY29tcG9uZW50c1sxXSk7CiAgICAgICAgICAgICAgICAgdG9wUGFydGl0aW9ucy5hZGQobmV3IFRvcFBhcnRpdGlvblRyYWNrZXIuVG9wUGFydGl0aW9uKG1ldGFkYXRhLnBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KG1ldGFkYXRhLnBhcnRpdGlvbktleVR5cGUuZnJvbVN0cmluZyhrZXlTdHIpKSwgdmFsdWUpKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1N5c3RlbUtleXNwYWNlTWlncmF0b3I0MS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU3lzdGVtS2V5c3BhY2VNaWdyYXRvcjQxLmphdmEKaW5kZXggYmZjZTc4MC4uYWI5ZjAxZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU3lzdGVtS2V5c3BhY2VNaWdyYXRvcjQxLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU3lzdGVtS2V5c3BhY2VNaWdyYXRvcjQxLmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHM7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKQEAgLTMzLDYgKzM0LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlVudHlwZWRSZXN1bHRTZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlc1R5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnQzMlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Mb25nVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlRpbWVVVUlEVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVURjhUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2VxdWVuY2VCYXNlZFNTVGFibGVJZDsKQEAgLTYyLDYgKzY0LDcgQEAKICAgICAgICAgbWlncmF0ZVRyYW5zZmVycmVkUmFuZ2VzKCk7CiAgICAgICAgIG1pZ3JhdGVBdmFpbGFibGVSYW5nZXMoKTsKICAgICAgICAgbWlncmF0ZVNTVGFibGVBY3Rpdml0eSgpOworICAgICAgICBtaWdyYXRlQ29tcGFjdGlvbkhpc3RvcnkoKTsKICAgICB9CiAKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKQEAgLTE1OSwxMiArMTYyLDM4IEBACiAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICApOwogICAgIH0KKyAgICAKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBzdGF0aWMgdm9pZCBtaWdyYXRlQ29tcGFjdGlvbkhpc3RvcnkoKQorICAgIHsKKyAgICAgICAgbWlncmF0ZVRhYmxlKGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgU3lzdGVtS2V5c3BhY2UuQ09NUEFDVElPTl9ISVNUT1JZLAorICAgICAgICAgICAgICAgICAgICAgU3lzdGVtS2V5c3BhY2UuQ09NUEFDVElPTl9ISVNUT1JZLAorICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyAiaWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXNfaW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXNfb3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbHVtbmZhbWlseV9uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBhY3RlZF9hdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrZXlzcGFjZV9uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJvd3NfbWVyZ2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBhY3Rpb25fcHJvcGVydGllcyIgfSwKKyAgICAgICAgICAgICAgICAgICAgIHJvdyAtPiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBPYmplY3RbXXsgcm93LmdldFRpbWVVVUlEKCJpZCIpICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93LmhhcygiYnl0ZXNfaW4iKSA/IHJvdy5nZXRMb25nKCJieXRlc19pbiIpIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93LmhhcygiYnl0ZXNfb3V0IikgPyByb3cuZ2V0TG9uZygiYnl0ZXNfb3V0IikgOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cuaGFzKCJjb2x1bW5mYW1pbHlfbmFtZSIpID8gcm93LmdldFN0cmluZygiY29sdW1uZmFtaWx5X25hbWUiKSA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5oYXMoImNvbXBhY3RlZF9hdCIpID8gcm93LmdldFRpbWVzdGFtcCgiY29tcGFjdGVkX2F0IikgOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cuaGFzKCJrZXlzcGFjZV9uYW1lIikgPyByb3cuZ2V0U3RyaW5nKCJrZXlzcGFjZV9uYW1lIikgOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cuaGFzKCJyb3dzX21lcmdlZCIpID8gcm93LmdldE1hcCgicm93c19tZXJnZWQiLCBJbnQzMlR5cGUuaW5zdGFuY2UsIExvbmdUeXBlLmluc3RhbmNlKSA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5oYXMoImNvbXBhY3Rpb25fcHJvcGVydGllcyIpID8gcm93LmdldE1hcCgiY29tcGFjdGlvbl9wcm9wZXJ0aWVzIiwgVVRGOFR5cGUuaW5zdGFuY2UsIFVURjhUeXBlLmluc3RhbmNlKSA6IEltbXV0YWJsZU1hcC5vZigpIH0pCisgICAgICAgICk7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogUGVyZm9ybSB0YWJsZSBtaWdyYXRpb24gYnkgcmVhZGluZyBkYXRhIGZyb20gdGhlIG9sZCB0YWJsZSwgY29udmVydGluZyBpdCwgYW5kIGFkZGluZyB0byB0aGUgbmV3IHRhYmxlLgotICAgICAqCisgICAgICogSWYgb2xkTmFtZSBhbmQgbmV3TmFtZSBhcmUgc2FtZSwgaXQgbWVhbnMgZGF0YSBpbiB0aGUgdGFibGUgd2lsbCBiZSByZWZyZXNoZWQuCisgICAgICogCiAgICAgICogQHBhcmFtIHRydW5jYXRlSWZFeGlzdHMgdHJ1bmNhdGUgdGhlIGV4aXN0aW5nIHRhYmxlIGlmIGl0IGV4aXN0cyBiZWZvcmUgbWlncmF0aW9uOyBpZiBpdCBpcyBkaXNhYmxlZAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgbmV3IHRhYmxlIGlzIG5vdCBlbXB0eSwgbm8gbWlncmF0aW9uIGlzIHBlcmZvcm1lZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgbmV3IHRhYmxlIGlzIG5vdCBlbXB0eSBhbmQgb2xkTmFtZSBpcyBub3QgZXF1YWwgdG8gbmV3TmFtZSwgbm8gbWlncmF0aW9uIGlzIHBlcmZvcm1lZAogICAgICAqIEBwYXJhbSBvbGROYW1lICAgICAgICAgIG9sZCB0YWJsZSBuYW1lCiAgICAgICogQHBhcmFtIG5ld05hbWUgICAgICAgICAgbmV3IHRhYmxlIG5hbWUKICAgICAgKiBAcGFyYW0gY29sdW1ucyAgICAgICAgICBjb2x1bW5zIHRvIGZpbGwgaW4gdGhlIG5ldyB0YWJsZSBpbiB0aGUgc2FtZSBvcmRlciBhcyByZXR1cm5lZCBieSB0aGUgdHJhbnNmb3JtYXRpb24KQEAgLTE3NSw3ICsyMDQsNyBAQAogICAgIHsKICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgbmV3VGFibGUgPSBLZXlzcGFjZS5vcGVuKFNjaGVtYUNvbnN0YW50cy5TWVNURU1fS0VZU1BBQ0VfTkFNRSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUobmV3TmFtZSk7CiAKLSAgICAgICAgaWYgKCFuZXdUYWJsZS5pc0VtcHR5KCkgJiYgIXRydW5jYXRlSWZFeGlzdHMpCisgICAgICAgIGlmICghbmV3VGFibGUuaXNFbXB0eSgpICYmICF0cnVuY2F0ZUlmRXhpc3RzICYmICFvbGROYW1lLmVxdWFscyhuZXdOYW1lKSkKICAgICAgICAgICAgIHJldHVybjsKIAogICAgICAgICBpZiAodHJ1bmNhdGVJZkV4aXN0cykKQEAgLTE4OSw2ICsyMTgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdVdGlscy5qb2luKGNvbHVtbnMsICIsICIpLCBTdHJpbmdVdGlscy5yZXBlYXQoIj8iLCAiLCAiLCBjb2x1bW5zLmxlbmd0aCkpOwogCiAgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcm93cyA9IFF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVJbnRlcm5hbChxdWVyeSk7CisKKyAgICAgICAgYXNzZXJ0IHJvd3MgIT0gbnVsbCA6IFN0cmluZy5mb3JtYXQoIk1pZ3JhdGluZyByb3dzIGZyb20gbGVnYWN5ICVzIHRvICVzIHdhcyBub3QgZG9uZSBhcyByZXR1cm5lZCByb3dzIGZyb20gJXMgYXJlIG51bGwhIiwgb2xkTmFtZSwgbmV3TmFtZSwgb2xkTmFtZSk7CisgICAgICAgIAogICAgICAgICBpbnQgdHJhbnNmZXJyZWQgPSAwOwogICAgICAgICBsb2dnZXIuaW5mbygiTWlncmF0aW5nIHJvd3MgZnJvbSBsZWdhY3kge30gdG8ge30iLCBvbGROYW1lLCBuZXdOYW1lKTsKICAgICAgICAgZm9yIChVbnR5cGVkUmVzdWx0U2V0LlJvdyByb3cgOiByb3dzKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvYWdncmVnYXRpb24vQWdncmVnYXRpb25TcGVjaWZpY2F0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9hZ2dyZWdhdGlvbi9BZ2dyZWdhdGlvblNwZWNpZmljYXRpb24uamF2YQppbmRleCAwZDZjMGVlLi5hNGExYzU3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9hZ2dyZWdhdGlvbi9BZ2dyZWdhdGlvblNwZWNpZmljYXRpb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9hZ2dyZWdhdGlvbi9BZ2dyZWdhdGlvblNwZWNpZmljYXRpb24uamF2YQpAQCAtMTgsNiArMTgsNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5hZ2dyZWdhdGlvbjsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5RdWVyeU9wdGlvbnM7CkBAIC0yNyw2ICsyOCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIAogLyoqCkBAIC02MSw3ICs2Myw3IEBACiAgICAgLyoqCiAgICAgICogVGhlIDxjb2RlPkFnZ3JlZ2F0aW9uU3BlY2lmaWNhdGlvbjwvY29kZT4ga2luZHMuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBlbnVtIEtpbmQKKyAgICBwdWJsaWMgZW51bSBLaW5kCiAgICAgewogICAgICAgICBBR0dSRUdBVEVfRVZFUllUSElORywgQUdHUkVHQVRFX0JZX1BLX1BSRUZJWCwgQUdHUkVHQVRFX0JZX1BLX1BSRUZJWF9XSVRIX1NFTEVDVE9SCiAgICAgfQpAQCAtMTE1LDcgKzExNyw4IEBACiAKICAgICBwdWJsaWMgc3RhdGljIEFnZ3JlZ2F0aW9uU3BlY2lmaWNhdGlvbi5GYWN0b3J5IGFnZ3JlZ2F0ZVBrUHJlZml4RmFjdG9yeVdpdGhTZWxlY3RvcihmaW5hbCBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjbHVzdGVyaW5nUHJlZml4U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZWxlY3Rvci5GYWN0b3J5IGZhY3RvcnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2VsZWN0b3IuRmFjdG9yeSBmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8Q29sdW1uTWV0YWRhdGE+IGNvbHVtbnMpCiAgICAgewogICAgICAgICByZXR1cm4gbmV3IEZhY3RvcnkoKQogICAgICAgICB7CkBAIC0xMzEsOCArMTM0LDkgQEAKICAgICAgICAgICAgICAgICBTZWxlY3RvciBzZWxlY3RvciA9IGZhY3RvcnkubmV3SW5zdGFuY2Uob3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgc2VsZWN0b3IudmFsaWRhdGVGb3JHcm91cEJ5KCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAgQWdncmVnYXRlQnlQa1ByZWZpeFdpdGhTZWxlY3Rvcihjb21wYXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlcmluZ1ByZWZpeFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyaW5nUHJlZml4U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1ucyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH07CiAgICAgfQpAQCAtMjAwLDE4ICsyMDQsMjUgQEAKICAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgZmluYWwgU2VsZWN0b3Igc2VsZWN0b3I7CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb2x1bW5zIHVzZWQgYnkgdGhlIHNlbGVjdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PENvbHVtbk1ldGFkYXRhPiBjb2x1bW5zOworCiAgICAgICAgIHB1YmxpYyBBZ2dyZWdhdGVCeVBrUHJlZml4V2l0aFNlbGVjdG9yKENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbHVzdGVyaW5nUHJlZml4U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3Igc2VsZWN0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENvbHVtbk1ldGFkYXRhPiBjb2x1bW5zKQogICAgICAgICB7CiAgICAgICAgICAgICBzdXBlcihLaW5kLkFHR1JFR0FURV9CWV9QS19QUkVGSVhfV0lUSF9TRUxFQ1RPUiwgY29tcGFyYXRvciwgY2x1c3RlcmluZ1ByZWZpeFNpemUpOwogICAgICAgICAgICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yOworICAgICAgICAgICAgdGhpcy5jb2x1bW5zID0gY29sdW1uczsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgR3JvdXBNYWtlciBuZXdHcm91cE1ha2VyKEdyb3VwaW5nU3RhdGUgc3RhdGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBHcm91cE1ha2VyLm5ld1NlbGVjdG9yR3JvdXBNYWtlcihjb21wYXJhdG9yLCBjbHVzdGVyaW5nUHJlZml4U2l6ZSwgc2VsZWN0b3IsIHN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBHcm91cE1ha2VyLm5ld1NlbGVjdG9yR3JvdXBNYWtlcihjb21wYXJhdG9yLCBjbHVzdGVyaW5nUHJlZml4U2l6ZSwgc2VsZWN0b3IsIGNvbHVtbnMsIHN0YXRlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjI1LDEyICsyMzYsMTUgQEAKICAgICAgICAgICAgICAgICBjYXNlIEFHR1JFR0FURV9FVkVSWVRISU5HOgogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIEFHR1JFR0FURV9CWV9QS19QUkVGSVg6Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludCgoKEFnZ3JlZ2F0ZUJ5UGtQcmVmaXgpIGFnZ3JlZ2F0aW9uU3BlYykuY2x1c3RlcmluZ1ByZWZpeFNpemUpOworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMigoKEFnZ3JlZ2F0ZUJ5UGtQcmVmaXgpIGFnZ3JlZ2F0aW9uU3BlYykuY2x1c3RlcmluZ1ByZWZpeFNpemUpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIEFHR1JFR0FURV9CWV9QS19QUkVGSVhfV0lUSF9TRUxFQ1RPUjoKICAgICAgICAgICAgICAgICAgICAgQWdncmVnYXRlQnlQa1ByZWZpeFdpdGhTZWxlY3RvciBzcGVjID0gKEFnZ3JlZ2F0ZUJ5UGtQcmVmaXhXaXRoU2VsZWN0b3IpIGFnZ3JlZ2F0aW9uU3BlYzsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHNwZWMuY2x1c3RlcmluZ1ByZWZpeFNpemUpOworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihzcGVjLmNsdXN0ZXJpbmdQcmVmaXhTaXplKTsKICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3Iuc2VyaWFsaXplci5zZXJpYWxpemUoc3BlYy5zZWxlY3Rvciwgb3V0LCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWRlYWxseSB3ZSBzaG91bGQgc2VyaWFsaXplIHRoZSBjb2x1bW5zIGJ1dCB0aGF0IHdpbGwgYnJlYWsgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKyAgICAgICAgICAgICAgICAgICAgLy8gU28gZm9yIHRoZSBtb21lbnQgd2UgY2FuIHJlYnVpbGQgdGhlIGxpc3QgZnJvbSB0aGUgcHJlZml4IHNpemUgYXMgd2Uga25vdyB0aGF0IHRoZXJlIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgLy8gb25seSBvbmUgY29sdW1uIGFuZCB0aGF0IGl0cyBpbmRpY2Ugd2lsbCBiZTogY2x1c3RlcmluZ1ByZWZpeFNpemUgLSAxLgogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIlVua25vdyBhZ2dyZWdhdGlvbiBraW5kOiAiICsgYWdncmVnYXRpb25TcGVjLmtpbmQoKSk7CkBAIC0yNDUsMTMgKzI1OSwxNSBAQAogICAgICAgICAgICAgICAgIGNhc2UgQUdHUkVHQVRFX0VWRVJZVEhJTkc6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBZ2dyZWdhdGlvblNwZWNpZmljYXRpb24uQUdHUkVHQVRFX0VWRVJZVEhJTkc7CiAgICAgICAgICAgICAgICAgY2FzZSBBR0dSRUdBVEVfQllfUEtfUFJFRklYOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZUJ5UGtQcmVmaXgobWV0YWRhdGEuY29tcGFyYXRvciwgKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVCeVBrUHJlZml4KG1ldGFkYXRhLmNvbXBhcmF0b3IsIGluLnJlYWRVbnNpZ25lZFZJbnQzMigpKTsKICAgICAgICAgICAgICAgICBjYXNlIEFHR1JFR0FURV9CWV9QS19QUkVGSVhfV0lUSF9TRUxFQ1RPUjoKLSAgICAgICAgICAgICAgICAgICAgaW50IGNsdXN0ZXJpbmdQcmVmaXhTaXplID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgICAgICAgICBpbnQgY2x1c3RlcmluZ1ByZWZpeFNpemUgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBTZWxlY3Rvci5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCB2ZXJzaW9uLCBtZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIENvbHVtbk1ldGFkYXRhIGZ1bmN0aW9uQXJndW1lbnQgPSBtZXRhZGF0YS5jbHVzdGVyaW5nQ29sdW1ucygpLmdldChjbHVzdGVyaW5nUHJlZml4U2l6ZSAtIDEpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZUJ5UGtQcmVmaXhXaXRoU2VsZWN0b3IobWV0YWRhdGEuY29tcGFyYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJpbmdQcmVmaXhTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGZ1bmN0aW9uQXJndW1lbnQpKTsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIlVua25vdyBhZ2dyZWdhdGlvbiBraW5kOiAiICsga2luZCk7CiAgICAgICAgICAgICB9CkBAIC0yNzAsOSArMjg2LDcgQEAKICAgICAgICAgICAgICAgICBjYXNlIEFHR1JFR0FURV9CWV9QS19QUkVGSVhfV0lUSF9TRUxFQ1RPUjoKICAgICAgICAgICAgICAgICAgICAgQWdncmVnYXRlQnlQa1ByZWZpeFdpdGhTZWxlY3RvciBzcGVjID0gKEFnZ3JlZ2F0ZUJ5UGtQcmVmaXhXaXRoU2VsZWN0b3IpIGFnZ3JlZ2F0aW9uU3BlYzsKICAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSBUeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50KHNwZWMuY2x1c3RlcmluZ1ByZWZpeFNpemUpOwotICAgICAgICAgICAgICAgICAgICBzaXplICs9IFNlbGVjdG9yLnNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoc3BlYy5zZWxlY3RvciwgdmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gU2VsZWN0b3Iuc2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShzcGVjLnNlbGVjdG9yLCB2ZXJzaW9uKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJVbmtub3cgYWdncmVnYXRpb24ga2luZDogIiArIGFnZ3JlZ2F0aW9uU3BlYy5raW5kKCkpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvYWdncmVnYXRpb24vR3JvdXBNYWtlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvYWdncmVnYXRpb24vR3JvdXBNYWtlci5qYXZhCmluZGV4IDk2ODIxOWYuLjIxYmI0MzggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2FnZ3JlZ2F0aW9uL0dyb3VwTWFrZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9hZ2dyZWdhdGlvbi9Hcm91cE1ha2VyLmphdmEKQEAgLTE4LDExICsxOCwxMyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5hZ2dyZWdhdGlvbjsKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnNlbGVjdGlvbi5TZWxlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdDb21wYXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIAogLyoqCkBAIC02MSwxNiArNjMsMTggQEAKICAgICBwdWJsaWMgc3RhdGljIEdyb3VwTWFrZXIgbmV3U2VsZWN0b3JHcm91cE1ha2VyKENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2x1c3RlcmluZ1ByZWZpeFNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RvciBzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q29sdW1uTWV0YWRhdGE+IGNvbHVtbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cGluZ1N0YXRlIHN0YXRlKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rvckdyb3VwTWFrZXIoY29tcGFyYXRvciwgY2x1c3RlcmluZ1ByZWZpeFNpemUsIHNlbGVjdG9yLCBzdGF0ZSk7CisgICAgICAgIHJldHVybiBuZXcgU2VsZWN0b3JHcm91cE1ha2VyKGNvbXBhcmF0b3IsIGNsdXN0ZXJpbmdQcmVmaXhTaXplLCBzZWxlY3RvciwgY29sdW1ucywgc3RhdGUpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgR3JvdXBNYWtlciBuZXdTZWxlY3Rvckdyb3VwTWFrZXIoQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbHVzdGVyaW5nUHJlZml4U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yIHNlbGVjdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENvbHVtbk1ldGFkYXRhPiBjb2x1bW5zKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rvckdyb3VwTWFrZXIoY29tcGFyYXRvciwgY2x1c3RlcmluZ1ByZWZpeFNpemUsIHNlbGVjdG9yKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rvckdyb3VwTWFrZXIoY29tcGFyYXRvciwgY2x1c3RlcmluZ1ByZWZpeFNpemUsIHNlbGVjdG9yLCBjb2x1bW5zKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE1OCwyNSArMTYyLDI5IEBACiAgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIEJ5dGVCdWZmZXIgbGFzdE91dHB1dDsKIAotICAgICAgICBwcml2YXRlIGZpbmFsIFNlbGVjdG9yLklucHV0Um93IGlucHV0ID0gbmV3IFNlbGVjdG9yLklucHV0Um93KDEsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHByaXZhdGUgZmluYWwgU2VsZWN0b3IuSW5wdXRSb3cgaW5wdXQ7CiAKICAgICAgICAgcHVibGljIFNlbGVjdG9yR3JvdXBNYWtlcihDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbHVzdGVyaW5nUHJlZml4U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RvciBzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENvbHVtbk1ldGFkYXRhPiBjb2x1bW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwaW5nU3RhdGUgc3RhdGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHN1cGVyKGNvbXBhcmF0b3IsIGNsdXN0ZXJpbmdQcmVmaXhTaXplLCBzdGF0ZSk7CiAgICAgICAgICAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7CisgICAgICAgICAgICB0aGlzLmlucHV0ID0gbmV3IFNlbGVjdG9yLklucHV0Um93KFByb3RvY29sVmVyc2lvbi5DVVJSRU5ULCBjb2x1bW5zLCBmYWxzZSk7CiAgICAgICAgICAgICB0aGlzLmxhc3RPdXRwdXQgPSBsYXN0Q2x1c3RlcmluZyA9PSBudWxsID8gbnVsbCA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVNlbGVjdG9yKGxhc3RDbHVzdGVyaW5nLmJ1ZmZlckF0KGNsdXN0ZXJpbmdQcmVmaXhTaXplIC0gMSkpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFNlbGVjdG9yR3JvdXBNYWtlcihDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbHVzdGVyaW5nUHJlZml4U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RvciBzZWxlY3RvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RvciBzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENvbHVtbk1ldGFkYXRhPiBjb2x1bW5zKQogICAgICAgICB7CiAgICAgICAgICAgICBzdXBlcihjb21wYXJhdG9yLCBjbHVzdGVyaW5nUHJlZml4U2l6ZSk7CiAgICAgICAgICAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7CisgICAgICAgICAgICB0aGlzLmlucHV0ID0gbmV3IFNlbGVjdG9yLklucHV0Um93KFByb3RvY29sVmVyc2lvbi5DVVJSRU5ULCBjb2x1bW5zLCBmYWxzZSk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKQEAgLTIxNyw3ICsyMjUsNyBAQAogICAgICAgICAgICAgaW5wdXQuYWRkKGFyZ3VtZW50KTsKIAogICAgICAgICAgICAgLy8gRm9yIGNvbXB1dGluZyBncm91cHMgd2UgZG8gbm90IG5lZWQgdG8gdXNlIHRoZSBjbGllbnQgcHJvdG9jb2wgdmVyc2lvbi4KLSAgICAgICAgICAgIHNlbGVjdG9yLmFkZElucHV0KFByb3RvY29sVmVyc2lvbi5DVVJSRU5ULCBpbnB1dCk7CisgICAgICAgICAgICBzZWxlY3Rvci5hZGRJbnB1dChpbnB1dCk7CiAgICAgICAgICAgICBCeXRlQnVmZmVyIG91dHB1dCA9IHNlbGVjdG9yLmdldE91dHB1dChQcm90b2NvbFZlcnNpb24uQ1VSUkVOVCk7CiAgICAgICAgICAgICBzZWxlY3Rvci5yZXNldCgpOwogICAgICAgICAgICAgaW5wdXQucmVzZXQoZmFsc2UpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29sdW1uaXRlcmF0b3IvQWJzdHJhY3RTU1RhYmxlSXRlcmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbHVtbml0ZXJhdG9yL0Fic3RyYWN0U1NUYWJsZUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZTQ1YzIuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29sdW1uaXRlcmF0b3IvQWJzdHJhY3RTU1RhYmxlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb2x1bW5pdGVyYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkluZGV4SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29ycnVwdFNTVGFibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlRGF0YUlucHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YVBvc2l0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U1NUYWJsZUl0ZXJhdG9yIGltcGxlbWVudHMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIFNTVGFibGVSZWFkZXIgc3N0YWJsZTsKLSAgICAvLyBXZSBjb3VsZCB1c2Ugc3N0YWJsZS5tZXRhZGF0YSgpLCBidXQgdGhhdCBjYW4gY2hhbmdlIGR1cmluZyBleGVjdXRpb24gc28gaXQncyBnb29kIGh5Z2llbmUgdG8gZ3JhYiBhbiBpbW11dGFibGUgaW5zdGFuY2UKLSAgICBwcm90ZWN0ZWQgZmluYWwgVGFibGVNZXRhZGF0YSBtZXRhZGF0YTsKLQotICAgIHByb3RlY3RlZCBmaW5hbCBEZWNvcmF0ZWRLZXkga2V5OwotICAgIHByb3RlY3RlZCBmaW5hbCBEZWxldGlvblRpbWUgcGFydGl0aW9uTGV2ZWxEZWxldGlvbjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29sdW1uRmlsdGVyIGNvbHVtbnM7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIERlc2VyaWFsaXphdGlvbkhlbHBlciBoZWxwZXI7Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgUm93IHN0YXRpY1JvdzsKLSAgICBwcm90ZWN0ZWQgZmluYWwgUmVhZGVyIHJlYWRlcjsKLQotICAgIHByb3RlY3RlZCBmaW5hbCBGaWxlSGFuZGxlIGlmaWxlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2xvc2VkOwotCi0gICAgcHJvdGVjdGVkIGZpbmFsIFNsaWNlcyBzbGljZXM7Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBuZWVkIHRoaXMgYmVjYXVzZSB0aGUgYW5hbHlzaXMgaXMgbm90IGFibGUgdG8gZGV0ZXJtaW5lIHRoYXQgd2UgZG8gY2xvc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWxlIG9uIGV2ZXJ5IHBhdGggd2hlcmUgd2UgY3JlYXRlZCBpdC4KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RTU1RhYmxlSXRlcmF0b3IoU1NUYWJsZVJlYWRlciBzc3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGF0YUlucHV0IGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xpY2VzIHNsaWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uRmlsdGVyIGNvbHVtbkZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUhhbmRsZSBpZmlsZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuc3N0YWJsZSA9IHNzdGFibGU7Ci0gICAgICAgIHRoaXMubWV0YWRhdGEgPSBzc3RhYmxlLm1ldGFkYXRhKCk7Ci0gICAgICAgIHRoaXMuaWZpbGUgPSBpZmlsZTsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbkZpbHRlcjsKLSAgICAgICAgdGhpcy5zbGljZXMgPSBzbGljZXM7Ci0gICAgICAgIHRoaXMuaGVscGVyID0gbmV3IERlc2VyaWFsaXphdGlvbkhlbHBlcihtZXRhZGF0YSwgc3N0YWJsZS5kZXNjcmlwdG9yLnZlcnNpb24uY29ycmVzcG9uZGluZ01lc3NhZ2luZ1ZlcnNpb24oKSwgRGVzZXJpYWxpemF0aW9uSGVscGVyLkZsYWcuTE9DQUwsIGNvbHVtbkZpbHRlcik7Ci0KLSAgICAgICAgaWYgKGluZGV4RW50cnkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5wYXJ0aXRpb25MZXZlbERlbGV0aW9uID0gRGVsZXRpb25UaW1lLkxJVkU7Ci0gICAgICAgICAgICB0aGlzLnJlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICB0aGlzLnN0YXRpY1JvdyA9IFJvd3MuRU1QVFlfU1RBVElDX1JPVzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gc2hvdWxkQ2xvc2VGaWxlID0gZmlsZSA9PSBudWxsOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gV2Ugc2VlayB0byB0aGUgYmVnaW5uaW5nIHRvIHRoZSBwYXJ0aXRpb24gaWYgZWl0aGVyOgotICAgICAgICAgICAgICAgIC8vICAgLSB0aGUgcGFydGl0aW9uIGlzIG5vdCBpbmRleGVkOyB3ZSB0aGVuIGhhdmUgYSBzaW5nbGUgYmxvY2sgdG8gcmVhZCBhbnl3YXkKLSAgICAgICAgICAgICAgICAvLyAgICAgKGFuZCB3ZSBuZWVkIHRvIHJlYWQgdGhlIHBhcnRpdGlvbiBkZWxldGlvbiB0aW1lKS4KLSAgICAgICAgICAgICAgICAvLyAgIC0gd2UncmUgcXVlcnlpbmcgc3RhdGljIGNvbHVtbnMuCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBuZWVkU2Vla0F0UGFydGl0aW9uU3RhcnQgPSAhaW5kZXhFbnRyeS5pc0luZGV4ZWQoKSB8fCAhY29sdW1ucy5mZXRjaGVkQ29sdW1ucygpLnN0YXRpY3MuaXNFbXB0eSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKG5lZWRTZWVrQXRQYXJ0aXRpb25TdGFydCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5vdCBpbmRleGVkIChvciBpcyByZWFkaW5nIHN0YXRpYyksIHNldCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXJ0aXRpb24gYW5kIHJlYWQgcGFydGl0aW9uIGxldmVsIGRlbGV0aW9uIHRoZXJlCi0gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gc3N0YWJsZS5nZXRGaWxlRGF0YUlucHV0KGluZGV4RW50cnkucG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnNlZWsoaW5kZXhFbnRyeS5wb3NpdGlvbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuc2tpcFNob3J0TGVuZ3RoKGZpbGUpOyAvLyBTa2lwIHBhcnRpdGlvbiBrZXkKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJ0aXRpb25MZXZlbERlbGV0aW9uID0gRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZmlsZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkIGFmdGVyIGZpbGUgIT0gbnVsbCBhbmQgYWZ0ZXIgdGhlIHBhcnRpdGlvbkRlbGV0aW9uIGhhcyBiZWVuIHNldCwgYnV0IGJlZm9yZSByZWFkU3RhdGljUm93Ci0gICAgICAgICAgICAgICAgICAgIC8vIChzaW5jZSBpdCB1c2VzIGl0KSBzbyB3ZSBjYW4ndCBtb3ZlIHRoYXQgdXAgKGJ1dCB3ZSdsbCBiZSBhYmxlIHRvIHNpbXBsaWZ5IGFzIHNvb24gYXMgd2UgZHJvcCBzdXBwb3J0IGZvciB0aGUgb2xkIGZpbGUgZm9ybWF0KS4KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWFkZXIgPSBjcmVhdGVSZWFkZXIoaW5kZXhFbnRyeSwgZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0aWNSb3cgPSByZWFkU3RhdGljUm93KHNzdGFibGUsIGZpbGUsIGhlbHBlciwgY29sdW1ucy5mZXRjaGVkQ29sdW1ucygpLnN0YXRpY3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnRpdGlvbkxldmVsRGVsZXRpb24gPSBpbmRleEVudHJ5LmRlbGV0aW9uVGltZSgpOwotICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRpY1JvdyA9IFJvd3MuRU1QVFlfU1RBVElDX1JPVzsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWFkZXIgPSBjcmVhdGVSZWFkZXIoaW5kZXhFbnRyeSwgZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFwYXJ0aXRpb25MZXZlbERlbGV0aW9uLnZhbGlkYXRlKCkpCi0gICAgICAgICAgICAgICAgICAgIFVuZmlsdGVyZWRWYWxpZGF0aW9uLmhhbmRsZUludmFsaWQobWV0YWRhdGEoKSwga2V5LCBzc3RhYmxlLCAicGFydGl0aW9uTGV2ZWxEZWxldGlvbj0iK3BhcnRpdGlvbkxldmVsRGVsZXRpb24udG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwgJiYgIXNsaWNlcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5zZXRGb3JTbGljZShuZXh0U2xpY2UoKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyID09IG51bGwgJiYgZmlsZSAhPSBudWxsICYmIHNob3VsZENsb3NlRmlsZSkKLSAgICAgICAgICAgICAgICAgICAgZmlsZS5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3N0YWJsZS5tYXJrU3VzcGVjdCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IGZpbGUuZ2V0UGF0aCgpOwotICAgICAgICAgICAgICAgIGlmIChzaG91bGRDbG9zZUZpbGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBzdXBwcmVzc2VkKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlLmFkZFN1cHByZXNzZWQoc3VwcHJlc3NlZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKGUsIGZpbGVQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU2xpY2UgbmV4dFNsaWNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzbGljZXMuZ2V0KG5leHRTbGljZUluZGV4KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IHNsaWNlIHRvIHByb2Nlc3MuCi0gICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIG5leHQgc2xpY2UgdG8gcHJvY2VzcwotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBpbnQgbmV4dFNsaWNlSW5kZXgoKTsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGVyZSBhcmUgbW9yZSBzbGljZSB0byBwcm9jZXNzLgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZXJlIGFyZSBtb3JlIHNsaWNlIHRvIHByb2Nlc3MsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGhhc01vcmVTbGljZXMoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIFJvdyByZWFkU3RhdGljUm93KFNTVGFibGVSZWFkZXIgc3N0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGF0YUlucHV0IGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzZXJpYWxpemF0aW9uSGVscGVyIGhlbHBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5zIHN0YXRpY3MpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKCFzc3RhYmxlLmhlYWRlci5oYXNTdGF0aWMoKSkKLSAgICAgICAgICAgIHJldHVybiBSb3dzLkVNUFRZX1NUQVRJQ19ST1c7Ci0KLSAgICAgICAgaWYgKHN0YXRpY3MuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBVbmZpbHRlcmVkU2VyaWFsaXplci5zZXJpYWxpemVyLnNraXBTdGF0aWNSb3coZmlsZSwgc3N0YWJsZS5oZWFkZXIsIGhlbHBlcik7Ci0gICAgICAgICAgICByZXR1cm4gUm93cy5FTVBUWV9TVEFUSUNfUk9XOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFVuZmlsdGVyZWRTZXJpYWxpemVyLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVTdGF0aWNSb3coZmlsZSwgc3N0YWJsZS5oZWFkZXIsIGhlbHBlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgUmVhZGVyIGNyZWF0ZVJlYWRlckludGVybmFsKFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSwgRmlsZURhdGFJbnB1dCBmaWxlLCBib29sZWFuIHNob3VsZENsb3NlRmlsZSk7Ci0KLSAgICBwcml2YXRlIFJlYWRlciBjcmVhdGVSZWFkZXIoUm93SW5kZXhFbnRyeSBpbmRleEVudHJ5LCBGaWxlRGF0YUlucHV0IGZpbGUsIGJvb2xlYW4gc2hvdWxkQ2xvc2VGaWxlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNsaWNlcy5pc0VtcHR5KCkgPyBuZXcgTm9Sb3dzUmVhZGVyKGZpbGUsIHNob3VsZENsb3NlRmlsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjcmVhdGVSZWFkZXJJbnRlcm5hbChpbmRleEVudHJ5LCBmaWxlLCBzaG91bGRDbG9zZUZpbGUpOwotICAgIH07Ci0KLSAgICBwdWJsaWMgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSgpCi0gICAgewotICAgICAgICByZXR1cm4gbWV0YWRhdGE7Ci0gICAgfQotCi0gICAgcHVibGljIFJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zIGNvbHVtbnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbHVtbnMuZmV0Y2hlZENvbHVtbnMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGVjb3JhdGVkS2V5IHBhcnRpdGlvbktleSgpCi0gICAgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyBEZWxldGlvblRpbWUgcGFydGl0aW9uTGV2ZWxEZWxldGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gcGFydGl0aW9uTGV2ZWxEZWxldGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUm93IHN0YXRpY1JvdygpCi0gICAgewotICAgICAgICByZXR1cm4gc3RhdGljUm93OwotICAgIH0KLQotICAgIHB1YmxpYyBFbmNvZGluZ1N0YXRzIHN0YXRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzc3RhYmxlLnN0YXRzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi0gICAgewotICAgICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHJlYWRlciA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKHJlYWRlci5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgIGlmICghaGFzTW9yZVNsaWNlcygpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgc2xpY2UobmV4dFNsaWNlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFVuZmlsdGVyZWQgbmV4dCgpCi0gICAgewotICAgICAgICBhc3NlcnQgcmVhZGVyICE9IG51bGw7Ci0gICAgICAgIHJldHVybiByZWFkZXIubmV4dCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzbGljZShTbGljZSBzbGljZSkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmVhZGVyLnNldEZvclNsaWNlKHNsaWNlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2xvc2VJbnRlcm5hbCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIHN1cHByZXNzZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZS5hZGRTdXBwcmVzc2VkKHN1cHByZXNzZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3N0YWJsZS5tYXJrU3VzcGVjdCgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKGUsIHJlYWRlci5maWxlLmdldFBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoKQotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsb3NlSW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIEl0J3MgaW1wb3J0YW50IHRvIG1ha2UgY2xvc2luZyBpZGVtcG90ZW50IHNpbmNlIGl0IHdvdWxkIGJhZCB0byBkb3VibGUtY2xvc2UgJ2ZpbGUnIGFzIGl0cyBhIFJhbmRvbUFjY2Vzc1JlYWRlcgotICAgICAgICAvLyBhbmQgaXRzIGNsb3NlIGlzIG5vdCBpZGVtcHRvdGVudCBpbiB0aGUgY2FzZSB3aGVyZSB3ZSByZWN5Y2xlIGl0LgotICAgICAgICBpZiAoaXNDbG9zZWQpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKQotICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7Ci0KLSAgICAgICAgaXNDbG9zZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBjbG9zZUludGVybmFsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzdGFibGUubWFya1N1c3BlY3QoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihlLCByZWFkZXIuZmlsZS5nZXRQYXRoKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIFJlYWRlciBpbXBsZW1lbnRzIEl0ZXJhdG9yPFVuZmlsdGVyZWQ+Ci0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gc2hvdWxkQ2xvc2VGaWxlOwotICAgICAgICBwdWJsaWMgRmlsZURhdGFJbnB1dCBmaWxlOwotCi0gICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkRGVzZXJpYWxpemVyIGRlc2VyaWFsaXplcjsKLQotICAgICAgICAvLyBSZWNvcmRzIHRoZSBjdXJyZW50bHkgb3BlbiByYW5nZSB0b21ic3RvbmUgKGlmIGFueSkKLSAgICAgICAgcHJvdGVjdGVkIERlbGV0aW9uVGltZSBvcGVuTWFya2VyID0gbnVsbDsKLQotICAgICAgICBwcm90ZWN0ZWQgUmVhZGVyKEZpbGVEYXRhSW5wdXQgZmlsZSwgYm9vbGVhbiBzaG91bGRDbG9zZUZpbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7Ci0gICAgICAgICAgICB0aGlzLnNob3VsZENsb3NlRmlsZSA9IHNob3VsZENsb3NlRmlsZTsKLQotICAgICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjcmVhdGVEZXNlcmlhbGl6ZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBjcmVhdGVEZXNlcmlhbGl6ZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgZmlsZSAhPSBudWxsICYmIGRlc2VyaWFsaXplciA9PSBudWxsOwotICAgICAgICAgICAgZGVzZXJpYWxpemVyID0gVW5maWx0ZXJlZERlc2VyaWFsaXplci5jcmVhdGUobWV0YWRhdGEsIGZpbGUsIHNzdGFibGUuaGVhZGVyLCBoZWxwZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2Vla1RvUG9zaXRpb24obG9uZyBwb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoaXMgbWF5IGJlIHRoZSBmaXJzdCB0aW1lIHdlJ3JlIGFjdHVhbGx5IGxvb2tpbmcgaW50byB0aGUgZmlsZQotICAgICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWxlID0gc3N0YWJsZS5nZXRGaWxlRGF0YUlucHV0KHBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICBjcmVhdGVEZXNlcmlhbGl6ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWxlLnNlZWsocG9zaXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlT3Blbk1hcmtlcihSYW5nZVRvbWJzdG9uZU1hcmtlciBtYXJrZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBhbHdheXMgcmVhZCBpbmRleCBibG9ja3MgaW4gZm9yd2FyZCBvcmRlciBzbyB0aGlzIG1ldGhvZCBpcyBhbHdheXMgY2FsbGVkIGluIGZvcndhcmQgb3JkZXIKLSAgICAgICAgICAgIG9wZW5NYXJrZXIgPSBtYXJrZXIuaXNPcGVuKGZhbHNlKSA/IG1hcmtlci5vcGVuRGVsZXRpb25UaW1lKGZhbHNlKSA6IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGhhc05leHRJbnRlcm5hbCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIHwgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2VJbnRlcm5hbCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gc3VwcHJlc3NlZCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGUuYWRkU3VwcHJlc3NlZChzdXBwcmVzc2VkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3N0YWJsZS5tYXJrU3VzcGVjdCgpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihlLCByZWFkZXIuZmlsZS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFVuZmlsdGVyZWQgbmV4dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXh0SW50ZXJuYWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2VJbnRlcm5hbCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gc3VwcHJlc3NlZCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGUuYWRkU3VwcHJlc3NlZChzdXBwcmVzc2VkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3N0YWJsZS5tYXJrU3VzcGVjdCgpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihlLCByZWFkZXIuZmlsZS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0IHRoZSByZWFkZXIgc28gaXRzIGhhc05leHQvbmV4dCBtZXRob2RzIHJldHVybiB2YWx1ZXMgd2l0aGluIHRoZSBwcm92aWRlZCBzbGljZQotICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRGb3JTbGljZShTbGljZSBzbGljZSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGhhc05leHRJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLSAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFVuZmlsdGVyZWQgbmV4dEludGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzaG91bGRDbG9zZUZpbGUgJiYgZmlsZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGZpbGUuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFJlYWRlciBmb3Igd2hlbiB3ZSBoYXZlIFNsaWNlcy5OT05FIGJ1dCBuZWVkIHRvIHJlYWQgc3RhdGljIHJvdyBvciBwYXJ0aXRpb24gbGV2ZWwgZGVsZXRpb24KLSAgICBwcml2YXRlIGNsYXNzIE5vUm93c1JlYWRlciBleHRlbmRzIEFic3RyYWN0U1NUYWJsZUl0ZXJhdG9yLlJlYWRlcgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBOb1Jvd3NSZWFkZXIoRmlsZURhdGFJbnB1dCBmaWxlLCBib29sZWFuIHNob3VsZENsb3NlRmlsZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEZvclNsaWNlKFNsaWNlIHNsaWNlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzTmV4dEludGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkIG5leHRJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVXNlZCBieSBpbmRleGVkIHJlYWRlcnMgdG8gc3RvcmUgd2hlcmUgdGhleSBhcmUgb2YgdGhlIGluZGV4LgotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5kZXhTdGF0ZSBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUmVhZGVyIHJlYWRlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgUm93SW5kZXhFbnRyeSBpbmRleEVudHJ5OwotICAgICAgICBwcml2YXRlIGZpbmFsIFJvd0luZGV4RW50cnkuSW5kZXhJbmZvUmV0cmlldmVyIGluZGV4SW5mb1JldHJpZXZlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJldmVyc2VkOwotCi0gICAgICAgIHByaXZhdGUgaW50IGN1cnJlbnRJbmRleElkeDsKLQotICAgICAgICAvLyBNYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBibG9jayBjb3JyZXNwb25kaW5nIHRvIGN1cnJlbnRJbmRleElkeC4KLSAgICAgICAgcHJpdmF0ZSBEYXRhUG9zaXRpb24gbWFyazsKLQotICAgICAgICBwdWJsaWMgSW5kZXhTdGF0ZShSZWFkZXIgcmVhZGVyLCBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yLCBSb3dJbmRleEVudHJ5IGluZGV4RW50cnksIGJvb2xlYW4gcmV2ZXJzZWQsIEZpbGVIYW5kbGUgaW5kZXhGaWxlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnJlYWRlciA9IHJlYWRlcjsKLSAgICAgICAgICAgIHRoaXMuY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7Ci0gICAgICAgICAgICB0aGlzLmluZGV4RW50cnkgPSBpbmRleEVudHJ5OwotICAgICAgICAgICAgdGhpcy5pbmRleEluZm9SZXRyaWV2ZXIgPSBpbmRleEVudHJ5Lm9wZW5XaXRoSW5kZXgoaW5kZXhGaWxlKTsKLSAgICAgICAgICAgIHRoaXMucmV2ZXJzZWQgPSByZXZlcnNlZDsKLSAgICAgICAgICAgIHRoaXMuY3VycmVudEluZGV4SWR4ID0gcmV2ZXJzZWQgPyBpbmRleEVudHJ5LmNvbHVtbnNJbmRleENvdW50KCkgOiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRG9uZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZXZlcnNlZCA/IGN1cnJlbnRJbmRleElkeCA8IDAgOiBjdXJyZW50SW5kZXhJZHggPj0gaW5kZXhFbnRyeS5jb2x1bW5zSW5kZXhDb3VudCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0cyB0aGUgcmVhZGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgYmxvY2tJZHguCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFRvQmxvY2soaW50IGJsb2NrSWR4KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGJsb2NrSWR4ID49IDAgJiYgYmxvY2tJZHggPCBpbmRleEVudHJ5LmNvbHVtbnNJbmRleENvdW50KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVhZGVyLnNlZWtUb1Bvc2l0aW9uKGNvbHVtbk9mZnNldChibG9ja0lkeCkpOwotICAgICAgICAgICAgICAgIG1hcmsgPSByZWFkZXIuZmlsZS5tYXJrKCk7Ci0gICAgICAgICAgICAgICAgcmVhZGVyLmRlc2VyaWFsaXplci5jbGVhclN0YXRlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGN1cnJlbnRJbmRleElkeCA9IGJsb2NrSWR4OwotICAgICAgICAgICAgcmVhZGVyLm9wZW5NYXJrZXIgPSBibG9ja0lkeCA+IDAgPyBpbmRleChibG9ja0lkeCAtIDEpLmVuZE9wZW5NYXJrZXIgOiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBsb25nIGNvbHVtbk9mZnNldChpbnQgaSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbmRleEVudHJ5LnBvc2l0aW9uICsgaW5kZXgoaSkub2Zmc2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBibG9ja3NDb3VudCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbmRleEVudHJ5LmNvbHVtbnNJbmRleENvdW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVcGRhdGUgdGhlIGJsb2NrIGlkeCBiYXNlZCBvbiB0aGUgY3VycmVudCByZWFkZXIgcG9zaXRpb24gaWYgd2UncmUgcGFzdCB0aGUgY3VycmVudCBibG9jay4KLSAgICAgICAgLy8gVGhpcyBvbmx5IG1ha2VzIHNlbnNlIGZvciBmb3J3YXJkIGl0ZXJhdGlvbiAoZm9yIHJldmVyc2Ugb25lcywgd2hlbiB3ZSByZWFjaCB0aGUgZW5kIG9mIGEgYmxvY2sgd2UKLSAgICAgICAgLy8gc2hvdWxkIHNlZWsgdG8gdGhlIHByZXZpb3VzIG9uZSwgbm90IHVwZGF0ZSB0aGUgaW5kZXggc3RhdGUgYW5kIGNvbnRpbnVlKS4KLSAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlQmxvY2soKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFyZXZlcnNlZDsKLQotICAgICAgICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUgd2l0aCBjdXJyZW50QmxvY2tJZHggPCAwLCBpdCBtZWFucyBzZXRUb0Jsb2NrKCkgaGFzIG5ldmVyIGJlZW4gY2FsbGVkLCBzbyBpdCBtZWFucwotICAgICAgICAgICAgLy8gd2UncmUgYWJvdXQgdG8gcmVhZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhcnRpdGlvbiwgYnV0IGhhdmVuJ3QgInByZXBhcmVkIiB0aGUgSW5kZXhTdGF0ZSB5ZXQuCi0gICAgICAgICAgICAvLyBEbyBzbyBieSBzZXR0aW5nIHVzIG9uIHRoZSBmaXJzdCBibG9jay4KLSAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXhJZHggPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNldFRvQmxvY2soMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3aGlsZSAoY3VycmVudEluZGV4SWR4ICsgMSA8IGluZGV4RW50cnkuY29sdW1uc0luZGV4Q291bnQoKSAmJiBpc1Bhc3RDdXJyZW50QmxvY2soKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkZXIub3Blbk1hcmtlciA9IGN1cnJlbnRJbmRleCgpLmVuZE9wZW5NYXJrZXI7Ci0gICAgICAgICAgICAgICAgKytjdXJyZW50SW5kZXhJZHg7Ci0KLSAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIHNldCB0aGUgbWFyaywgYW5kIHdlIGhhdmUgdG8gc2V0IGl0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJsb2NrLiBTbyBpZiB3ZSdyZSBub3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYmxvY2ssIHRoaXMgZm9yY2VzIHVzIHRvIGEgd2VpcmQgc2VlayBkYW5jZS4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiB3aGVuIHJlYWRpbmcgb2xkIGZpbGUgaG93ZXZlci4KLSAgICAgICAgICAgICAgICBsb25nIHN0YXJ0T2ZCbG9jayA9IGNvbHVtbk9mZnNldChjdXJyZW50SW5kZXhJZHgpOwotICAgICAgICAgICAgICAgIGxvbmcgY3VycmVudEZpbGVQb2ludGVyID0gcmVhZGVyLmZpbGUuZ2V0RmlsZVBvaW50ZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnRPZkJsb2NrID09IGN1cnJlbnRGaWxlUG9pbnRlcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcmsgPSByZWFkZXIuZmlsZS5tYXJrKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5zZWVrVG9Qb3NpdGlvbihzdGFydE9mQmxvY2spOwotICAgICAgICAgICAgICAgICAgICBtYXJrID0gcmVhZGVyLmZpbGUubWFyaygpOwotICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2Vla1RvUG9zaXRpb24oY3VycmVudEZpbGVQb2ludGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayBpZiB3ZSd2ZSBjcm9zc2VkIGFuIGluZGV4IGJvdW5kYXJ5IChiYXNlZCBvbiB0aGUgbWFyayBvbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbmRleCBibG9jaykuCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUGFzdEN1cnJlbnRCbG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgcmVhZGVyLmRlc2VyaWFsaXplciAhPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5maWxlLmJ5dGVzUGFzdE1hcmsobWFyaykgPj0gY3VycmVudEluZGV4KCkud2lkdGg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGN1cnJlbnRCbG9ja0lkeCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjdXJyZW50SW5kZXhJZHg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSW5kZXhJbmZvIGN1cnJlbnRJbmRleCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW5kZXgoY3VycmVudEluZGV4SWR4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJbmRleEluZm8gaW5kZXgoaW50IGkpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW5kZXhJbmZvUmV0cmlldmVyLmNvbHVtbnNJbmRleChpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZpbmRzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYmxvY2sgY29udGFpbmluZyB0aGUgcHJvdmlkZWQgYm91bmQsIHN0YXJ0aW5nIGF0IHRoZSBwcm92aWRlZCBpbmRleC4KLSAgICAgICAgLy8gV2lsbCBiZSAtMSBpZiB0aGUgYm91bmQgaXMgYmVmb3JlIGFueSBibG9jaywgYW5kIGJsb2Nrc0NvdW50KCkgaWYgaXQgaXMgYWZ0ZXIgZXZlcnkgYmxvY2suCi0gICAgICAgIHB1YmxpYyBpbnQgZmluZEJsb2NrSW5kZXgoQ2x1c3RlcmluZ0JvdW5kPD8+IGJvdW5kLCBpbnQgZnJvbUlkeCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChib3VuZC5pc0JvdHRvbSgpKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIGlmIChib3VuZC5pc1RvcCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBibG9ja3NDb3VudCgpOwotCi0gICAgICAgICAgICByZXR1cm4gaW5kZXhGb3IoYm91bmQsIGZyb21JZHgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBpbmRleEZvcihDbHVzdGVyaW5nUHJlZml4PD8+IG5hbWUsIGludCBsYXN0SW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBJbmRleEluZm8gdGFyZ2V0ID0gbmV3IEluZGV4SW5mbyhuYW1lLCBuYW1lLCAwLCAwLCBudWxsKTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICBUYWtlIHRoZSBleGFtcGxlIGZyb20gdGhlIHVuaXQgdGVzdCwgYW5kIHNheSB5b3VyIGluZGV4IGxvb2tzIGxpa2UgdGhpczoKLSAgICAgICAgICAgIFswLi41XVsxMC4uMTVdWzIwLi4yNV0KLSAgICAgICAgICAgIGFuZCB5b3UgbG9vayBmb3IgdGhlIHNsaWNlIFsxMy4uMTddLgotCi0gICAgICAgICAgICBXaGVuIGRvaW5nIGZvcndhcmQgc2xpY2UsIHdlIGFyZSBkb2luZyBhIGJpbmFyeSBzZWFyY2ggY29tcGFyaW5nIDEzICh0aGUgc3RhcnQgb2YgdGhlIHF1ZXJ5KQotICAgICAgICAgICAgdG8gdGhlIGxhc3ROYW1lIHBhcnQgb2YgdGhlIGluZGV4IHNsb3QuIFlvdSdsbCBlbmQgdXAgd2l0aCB0aGUgImZpcnN0IiBzbG90LCBnb2luZyBmcm9tIGxlZnQgdG8gcmlnaHQsCi0gICAgICAgICAgICB0aGF0IG1heSBjb250YWluIHRoZSBzdGFydC4KLQotICAgICAgICAgICAgV2hlbiBkb2luZyBhIHJldmVyc2Ugc2xpY2UsIHdlIGRvIHRoZSBzYW1lIHRoaW5nLCBvbmx5IHVzaW5nIGFzIGEgc3RhcnQgY29sdW1uIHRoZSBlbmQgb2YgdGhlIHF1ZXJ5LAotICAgICAgICAgICAgaS5lLiAxNyBpbiB0aGlzIGV4YW1wbGUsIGNvbXBhcmVkIHRvIHRoZSBmaXJzdE5hbWUgcGFydCBvZiB0aGUgaW5kZXggc2xvdHMuICBic2VhcmNoIHdpbGwgZ2l2ZSB1cyB0aGUKLSAgICAgICAgICAgIGZpcnN0IHNsb3Qgd2hlcmUgZmlyc3ROYW1lID4gc3RhcnQgKFsyMC4uMjVdIGhlcmUpLCBzbyB3ZSBzdWJ0cmFjdCBhbiBleHRyYSBvbmUgdG8gZ2V0IHRoZSBzbG90IGp1c3QgYmVmb3JlLgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGludCBzdGFydElkeCA9IDA7Ci0gICAgICAgICAgICBpbnQgZW5kSWR4ID0gaW5kZXhFbnRyeS5jb2x1bW5zSW5kZXhDb3VudCgpIC0gMTsKLQotICAgICAgICAgICAgaWYgKHJldmVyc2VkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChsYXN0SW5kZXggPCBlbmRJZHgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbmRJZHggPSBsYXN0SW5kZXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChsYXN0SW5kZXggPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRJZHggPSBsYXN0SW5kZXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgaW5kZXggPSBiaW5hcnlTZWFyY2godGFyZ2V0LCBjb21wYXJhdG9yLmluZGV4Q29tcGFyYXRvcihyZXZlcnNlZCksIHN0YXJ0SWR4LCBlbmRJZHgpOwotICAgICAgICAgICAgcmV0dXJuIChpbmRleCA8IDAgPyAtaW5kZXggLSAocmV2ZXJzZWQgPyAyIDogMSkgOiBpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBiaW5hcnlTZWFyY2goSW5kZXhJbmZvIGtleSwgQ29tcGFyYXRvcjxJbmRleEluZm8+IGMsIGludCBsb3csIGludCBoaWdoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUgKGxvdyA8PSBoaWdoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBtaWQgPSAobG93ICsgaGlnaCkgPj4+IDE7Ci0gICAgICAgICAgICAgICAgSW5kZXhJbmZvIG1pZFZhbCA9IGluZGV4KG1pZCk7Ci0gICAgICAgICAgICAgICAgaW50IGNtcCA9IGMuY29tcGFyZShtaWRWYWwsIGtleSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY21wIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgbG93ID0gbWlkICsgMTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjbXAgPiAwKQotICAgICAgICAgICAgICAgICAgICBoaWdoID0gbWlkIC0gMTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtaWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLShsb3cgKyAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIkluZGV4U3RhdGUoaW5kZXhTaXplPSVkLCBjdXJyZW50QmxvY2s9JWQsIHJldmVyc2VkPSViKSIsIGluZGV4RW50cnkuY29sdW1uc0luZGV4Q291bnQoKSwgY3VycmVudEluZGV4SWR4LCByZXZlcnNlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaW5kZXhJbmZvUmV0cmlldmVyLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb2x1bW5pdGVyYXRvci9TU1RhYmxlSXRlcmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbHVtbml0ZXJhdG9yL1NTVGFibGVJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDM2MmY3Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbHVtbml0ZXJhdG9yL1NTVGFibGVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbHVtbml0ZXJhdG9yOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVEYXRhSW5wdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOwotCi0vKioKLSAqICBBIENlbGwgSXRlcmF0b3Igb3ZlciBTU1RhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBTU1RhYmxlSXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFNTVGFibGVJdGVyYXRvcgotewotICAgIC8qKgotICAgICAqIFRoZSBpbmRleCBvZiB0aGUgc2xpY2UgYmVpbmcgcHJvY2Vzc2VkLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IHNsaWNlOwotCi0gICAgcHVibGljIFNTVGFibGVJdGVyYXRvcihTU1RhYmxlUmVhZGVyIHNzdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGF0YUlucHV0IGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUm93SW5kZXhFbnRyeSBpbmRleEVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xpY2VzIHNsaWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbkZpbHRlciBjb2x1bW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUhhbmRsZSBpZmlsZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKHNzdGFibGUsIGZpbGUsIGtleSwgaW5kZXhFbnRyeSwgc2xpY2VzLCBjb2x1bW5zLCBpZmlsZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFJlYWRlciBjcmVhdGVSZWFkZXJJbnRlcm5hbChSb3dJbmRleEVudHJ5IGluZGV4RW50cnksIEZpbGVEYXRhSW5wdXQgZmlsZSwgYm9vbGVhbiBzaG91bGRDbG9zZUZpbGUpCi0gICAgewotICAgICAgICByZXR1cm4gaW5kZXhFbnRyeS5pc0luZGV4ZWQoKQotICAgICAgICAgICAgID8gbmV3IEZvcndhcmRJbmRleGVkUmVhZGVyKGluZGV4RW50cnksIGZpbGUsIHNob3VsZENsb3NlRmlsZSkKLSAgICAgICAgICAgICA6IG5ldyBGb3J3YXJkUmVhZGVyKGZpbGUsIHNob3VsZENsb3NlRmlsZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCBuZXh0U2xpY2VJbmRleCgpCi0gICAgewotICAgICAgICBpbnQgbmV4dCA9IHNsaWNlOwotICAgICAgICBzbGljZSsrOwotICAgICAgICByZXR1cm4gbmV4dDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNNb3JlU2xpY2VzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzbGljZSA8IHNsaWNlcy5zaXplKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXZlcnNlT3JkZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgRm9yd2FyZFJlYWRlciBleHRlbmRzIFJlYWRlcgotICAgIHsKLSAgICAgICAgLy8gVGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHNsaWNlLiBUaGlzIHdpbGwgYmUgbnVsbCBhcyBzb29uIGFzIHdlIGtub3cgd2UndmUgcGFzc2VkIHRoYXQgYm91bmQuCi0gICAgICAgIHByb3RlY3RlZCBDbHVzdGVyaW5nQm91bmQ8Pz4gc3RhcnQ7Ci0gICAgICAgIC8vIFRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgc2xpY2UuIFdpbGwgbmV2ZXIgYmUgbnVsbC4KLSAgICAgICAgcHJvdGVjdGVkIENsdXN0ZXJpbmdCb3VuZDw/PiBlbmQgPSBCdWZmZXJDbHVzdGVyaW5nQm91bmQuVE9QOwotCi0gICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkIG5leHQ7IC8vIHRoZSBuZXh0IGVsZW1lbnQgdG8gcmV0dXJuOiB0aGlzIGlzIGNvbXB1dGVkIGJ5IGhhc05leHRJbnRlcm5hbCgpLgotCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIHNsaWNlRG9uZTsgLy8gc2V0IHRvIHRydWUgb25jZSB3ZSBrbm93IHdlIGhhdmUgbm8gbW9yZSByZXN1bHQgZm9yIHRoZSBzbGljZS4gVGhpcyBpcyBpbiBwYXJ0aWN1bGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCBieSB0aGUgaW5kZXhlZCByZWFkZXIgd2hlbiB3ZSBrbm93IHdlIGNhbid0IGhhdmUgcmVzdWx0cyBiYXNlZCBvbiB0aGUgaW5kZXguCi0KLSAgICAgICAgcHJpdmF0ZSBGb3J3YXJkUmVhZGVyKEZpbGVEYXRhSW5wdXQgZmlsZSwgYm9vbGVhbiBzaG91bGRDbG9zZUZpbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKGZpbGUsIHNob3VsZENsb3NlRmlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRGb3JTbGljZShTbGljZSBzbGljZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXJ0ID0gc2xpY2Uuc3RhcnQoKS5pc0JvdHRvbSgpID8gbnVsbCA6IHNsaWNlLnN0YXJ0KCk7Ci0gICAgICAgICAgICBlbmQgPSBzbGljZS5lbmQoKTsKLQotICAgICAgICAgICAgc2xpY2VEb25lID0gZmFsc2U7Ci0gICAgICAgICAgICBuZXh0ID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNraXAgYWxsIGRhdGEgdGhhdCBjb21lcyBiZWZvcmUgdGhlIGN1cnJlbnRseSBzZXQgc2xpY2UuCi0gICAgICAgIC8vIFJldHVybiB3aGF0IHNob3VsZCBiZSByZXR1cm5lZCBhdCB0aGUgZW5kIG9mIHRoaXMsIG9yIG51bGwgaWYgbm90aGluZyBzaG91bGQuCi0gICAgICAgIHByaXZhdGUgVW5maWx0ZXJlZCBoYW5kbGVQcmVTbGljZURhdGEoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGRlc2VyaWFsaXplciAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyBjb21wYXJpc29uIGlzIG5vdCBzdHJpY3QuIFRoZSByZWFzb24gaXMgdGhhdCB0aGUgb25seSBjYXNlcwotICAgICAgICAgICAgLy8gd2hlcmUgaXQgY2FuIGJlID09IGlzIGlmIHRoZSAibmV4dCIgaXMgYSBSVCBzdGFydCBtYXJrZXIgKGVpdGhlciBhICdbJyBvZiBhICcpWycgYm91bmRhcnkpLAotICAgICAgICAgICAgLy8gYW5kIGlmIHdlIGhhZCBhIHN0cmljdCBpbmVxdWFsaXR5IGFuZCBhbiBvcGVuIFJUIG1hcmtlciBiZWZvcmUgdGhpcywgd2Ugd291bGQgaXNzdWUKLSAgICAgICAgICAgIC8vIHRoZSBvcGVuIG1hcmtlciBmaXJzdCwgYW5kIHRoZW4gcmV0dXJuIHRoZW4gbmV4dCBsYXRlciwgd2hpY2ggd291bGQgc2VuZCBpbiB0aGUKLSAgICAgICAgICAgIC8vIHN0cmVhbSBib3RoICdbJyAob3IgJygnKSBhbmQgdGhlbiAnKVsnIGZvciB0aGUgc2FtZSBjbHVzdGVyaW5nIHZhbHVlLCB3aGljaCBpcyB3cm9uZy4KLSAgICAgICAgICAgIC8vIEJ5IHVzaW5nIGEgbm9uLXN0cmljdCBpbmVxdWFsaXR5LCB3ZSBhdm9pZCB0aGF0IHByb2JsZW0gKGlmIHdlIGRvIGdldCAnKVsnIGZvciB0aGUgc2FtZQotICAgICAgICAgICAgLy8gY2x1c3RlcmluZyB2YWx1ZSB0aGFuIHRoZSBzbGljZSwgd2UnbGwgc2ltcGx5IHJlY29yZCBpdCBpbiAnb3Blbk1hcmtlcicpLgotICAgICAgICAgICAgd2hpbGUgKGRlc2VyaWFsaXplci5oYXNOZXh0KCkgJiYgZGVzZXJpYWxpemVyLmNvbXBhcmVOZXh0VG8oc3RhcnQpIDw9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc2VyaWFsaXplci5uZXh0SXNSb3coKSkKLSAgICAgICAgICAgICAgICAgICAgZGVzZXJpYWxpemVyLnNraXBOZXh0KCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB1cGRhdGVPcGVuTWFya2VyKChSYW5nZVRvbWJzdG9uZU1hcmtlcilkZXNlcmlhbGl6ZXIucmVhZE5leHQoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENsdXN0ZXJpbmdCb3VuZDw/PiBzbGljZVN0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgICAgICBzdGFydCA9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGJlZ2lubmluZyBvZiBvdXIgcXVlcmllZCBzbGljZS4gSWYgd2UgaGF2ZSBhbiBvcGVuIG1hcmtlcgotICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIHJldHVybiB0aGF0IGZpcnN0LgotICAgICAgICAgICAgaWYgKG9wZW5NYXJrZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlVG9tYnN0b25lQm91bmRNYXJrZXIoc2xpY2VTdGFydCwgb3Blbk1hcmtlcik7Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ29tcHV0ZSB0aGUgbmV4dCBlbGVtZW50IHRvIHJldHVybiwgYXNzdW1pbmcgd2UncmUgaW4gdGhlIG1pZGRsZSB0byB0aGUgc2xpY2UKLSAgICAgICAgLy8gYW5kIHRoZSBuZXh0IGVsZW1lbnQgaXMgZWl0aGVyIGluIHRoZSBzbGljZSwgb3IganVzdCBhZnRlciBpdC4gUmV0dXJucyBudWxsCi0gICAgICAgIC8vIGlmIHdlJ3JlIGRvbmUgd2l0aCB0aGUgc2xpY2UuCi0gICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkIGNvbXB1dGVOZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBkZXNlcmlhbGl6ZXIgIT0gbnVsbDsKLQotICAgICAgICAgICAgd2hpbGUgKHRydWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgdXNlIGEgc2FtZSByZWFzb25pbmcgYXMgaW4gaGFuZGxlUHJlU2xpY2VEYXRhIHJlZ2FyZGluZyB0aGUgc3RyaWN0bmVzcyBvZiB0aGUgaW5lcXVhbGl0eSBiZWxvdy4KLSAgICAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGV4Y2x1ZGUgZGVzZXJpYWxpemVkIHVuZmlsdGVyZWQgZXF1YWwgdG8gZW5kLCBiZWNhdXNlIDEpIHdlIHdvbid0IG1pc3MgYW55IHJvd3Mgc2luY2UgdGhvc2UKLSAgICAgICAgICAgICAgICAvLyB3b3Vkbid0IGJlIGVxdWFsIHRvIGEgc2xpY2UgYm91bmQgYW5kIDIpIGEgZW5kIGJvdW5kIGNhbiBiZSBlcXVhbCB0byBhIHN0YXJ0IGJvdW5kCi0gICAgICAgICAgICAgICAgLy8gKEVYQ0xfRU5EKHgpID09IElOQ0xfU1RBUlQoeCkgZm9yIGluc3RhbmNlKSBhbmQgaW4gdGhhdCBjYXNlIHdlIGRvbid0IHdhbnQgdG8gcmV0dXJuIHN0YXJ0IGJvdW5kIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAvLyBpdCdzIGZ1bmRhbWVudGFsbHkgZXhjbHVkZWQuIEFuZCBpZiB0aGUgYm91bmQgaXMgYSAgZW5kIChmb3IgYSByYW5nZSB0b21ic3RvbmUpLCBpdCBtZWFucyBpdCdzIGV4YWN0bHkKLSAgICAgICAgICAgICAgICAvLyBvdXIgc2xpY2UgZW5kLCBidXQgaW4gdGhhdCAgY2FzZSB3ZSB3aWxsIHByb3Blcmx5IGNsb3NlIHRoZSByYW5nZSB0b21ic3RvbmUgYW55d2F5IGFzIHBhcnQgb2Ygb3VyICJjbG9zZQotICAgICAgICAgICAgICAgIC8vIGFuIG9wZW4gbWFya2VyIiBjb2RlIGluIGhhc05leHRJbnRlcm5hCi0gICAgICAgICAgICAgICAgaWYgKCFkZXNlcmlhbGl6ZXIuaGFzTmV4dCgpIHx8IGRlc2VyaWFsaXplci5jb21wYXJlTmV4dFRvKGVuZCkgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgICAgICBVbmZpbHRlcmVkIG5leHQgPSBkZXNlcmlhbGl6ZXIucmVhZE5leHQoKTsKLSAgICAgICAgICAgICAgICBVbmZpbHRlcmVkVmFsaWRhdGlvbi5tYXliZVZhbGlkYXRlVW5maWx0ZXJlZChuZXh0LCBtZXRhZGF0YSgpLCBrZXksIHNzdGFibGUpOwotICAgICAgICAgICAgICAgIC8vIFdlIG1heSBnZXQgZW1wdHkgcm93IGZvciB0aGUgc2FtZSByZWFzb24gZXhwcmVzc2VkIG9uIFVuZmlsdGVyZWRTZXJpYWxpemVyLmRlc2VyaWFsaXplT25lLgotICAgICAgICAgICAgICAgIGlmIChuZXh0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICBpZiAobmV4dC5raW5kKCkgPT0gVW5maWx0ZXJlZC5LaW5kLlJBTkdFX1RPTUJTVE9ORV9NQVJLRVIpCi0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZU9wZW5NYXJrZXIoKFJhbmdlVG9tYnN0b25lTWFya2VyKSBuZXh0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGhhc05leHRJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobmV4dCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBpZiAoc2xpY2VEb25lKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKHN0YXJ0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVW5maWx0ZXJlZCB1bmZpbHRlcmVkID0gaGFuZGxlUHJlU2xpY2VEYXRhKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHVuZmlsdGVyZWQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5leHQgPSB1bmZpbHRlcmVkOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG5leHQgPSBjb21wdXRlTmV4dCgpOwotICAgICAgICAgICAgaWYgKG5leHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgLy8gZm9yIGN1cnJlbnQgc2xpY2UsIG5vIGRhdGEgcmVhZCBmcm9tIGRlc2VyaWFsaXphdGlvbgotICAgICAgICAgICAgc2xpY2VEb25lID0gdHJ1ZTsKLSAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYW4gb3BlbiBtYXJrZXIsIHdlIHNob3VsZCBub3QgY2xvc2UgaXQsIHRoZXJlIGNvdWxkIGJlIG1vcmUgc2xpY2VzCi0gICAgICAgICAgICBpZiAob3Blbk1hcmtlciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5leHQgPSBuZXcgUmFuZ2VUb21ic3RvbmVCb3VuZE1hcmtlcihlbmQsIG9wZW5NYXJrZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFVuZmlsdGVyZWQgbmV4dEludGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghaGFzTmV4dEludGVybmFsKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgVW5maWx0ZXJlZCB0b1JldHVybiA9IG5leHQ7Ci0gICAgICAgICAgICBuZXh0ID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiB0b1JldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgRm9yd2FyZEluZGV4ZWRSZWFkZXIgZXh0ZW5kcyBGb3J3YXJkUmVhZGVyCi0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIEluZGV4U3RhdGUgaW5kZXhTdGF0ZTsKLQotICAgICAgICBwcml2YXRlIGludCBsYXN0QmxvY2tJZHg7IC8vIHRoZSBsYXN0IGluZGV4IGJsb2NrIHRoYXQgaGFzIGRhdGEgZm9yIHRoZSBjdXJyZW50IHF1ZXJ5Ci0KLSAgICAgICAgcHJpdmF0ZSBGb3J3YXJkSW5kZXhlZFJlYWRlcihSb3dJbmRleEVudHJ5IGluZGV4RW50cnksIEZpbGVEYXRhSW5wdXQgZmlsZSwgYm9vbGVhbiBzaG91bGRDbG9zZUZpbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKGZpbGUsIHNob3VsZENsb3NlRmlsZSk7Ci0gICAgICAgICAgICB0aGlzLmluZGV4U3RhdGUgPSBuZXcgSW5kZXhTdGF0ZSh0aGlzLCBtZXRhZGF0YS5jb21wYXJhdG9yLCBpbmRleEVudHJ5LCBmYWxzZSwgaWZpbGUpOwotICAgICAgICAgICAgdGhpcy5sYXN0QmxvY2tJZHggPSBpbmRleFN0YXRlLmJsb2Nrc0NvdW50KCk7IC8vIGlmIHdlIG5ldmVyIGNhbGwgc2V0Rm9yU2xpY2UsIHRoYXQncyB3aGVyZSB3ZSB3YW50IHRvIHN0b3AKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlci5jbG9zZSgpOwotICAgICAgICAgICAgdGhpcy5pbmRleFN0YXRlLmNsb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Rm9yU2xpY2UoU2xpY2Ugc2xpY2UpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlci5zZXRGb3JTbGljZShzbGljZSk7Ci0KLSAgICAgICAgICAgIC8vIGlmIG91ciBwcmV2aW91cyBzbGljaW5nIGFscmVhZHkgZ290IHVzIHRoZSBiaWdnZXN0IHJvdyBpbiB0aGUgc3N0YWJsZSwgd2UncmUgZG9uZQotICAgICAgICAgICAgaWYgKGluZGV4U3RhdGUuaXNEb25lKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2xpY2VEb25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGluZGV4IGJsb2NrIHdlJ2xsIG5lZWQgdG8gcmVhZCBmb3IgdGhlIHNsaWNlLgotICAgICAgICAgICAgaW50IHN0YXJ0SWR4ID0gaW5kZXhTdGF0ZS5maW5kQmxvY2tJbmRleChzbGljZS5zdGFydCgpLCBpbmRleFN0YXRlLmN1cnJlbnRCbG9ja0lkeCgpKTsKLSAgICAgICAgICAgIGlmIChzdGFydElkeCA+PSBpbmRleFN0YXRlLmJsb2Nrc0NvdW50KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2xpY2VEb25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEZpbmQgdGhlIGxhc3QgaW5kZXggYmxvY2sgd2UnbGwgbmVlZCB0byByZWFkIGZvciB0aGUgc2xpY2UuCi0gICAgICAgICAgICBsYXN0QmxvY2tJZHggPSBpbmRleFN0YXRlLmZpbmRCbG9ja0luZGV4KHNsaWNlLmVuZCgpLCBzdGFydElkeCk7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBzbGljZSBlbmQgaXMgYmVmb3JlIHRoZSB2ZXJ5IGZpcnN0IGJsb2NrLCB3ZSBoYXZlIG5vdGhpbmcgZm9yIHRoYXQgc2xpY2UKLSAgICAgICAgICAgIGlmIChsYXN0QmxvY2tJZHggPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBzdGFydElkeCA8IDA7Ci0gICAgICAgICAgICAgICAgc2xpY2VEb25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElmIHdlIHN0YXJ0IGJlZm9yZSB0aGUgdmVyeSBmaXJzdCBibG9jaywganVzdCByZWFkIGZyb20gdGhlIGZpcnN0IG9uZS4KLSAgICAgICAgICAgIGlmIChzdGFydElkeCA8IDApCi0gICAgICAgICAgICAgICAgc3RhcnRJZHggPSAwOwotCi0gICAgICAgICAgICAvLyBJZiB0aGF0J3MgdGhlIGxhc3QgYmxvY2sgd2Ugd2VyZSByZWFkaW5nLCB3ZSdyZSBhbHJlYWR5IHdoZXJlIHdlIHdhbnQgdG8gYmUuIE90aGVyd2lzZSwKLSAgICAgICAgICAgIC8vIHNlZWsgdG8gdGhhdCBmaXJzdCBibG9jawotICAgICAgICAgICAgaWYgKHN0YXJ0SWR4ICE9IGluZGV4U3RhdGUuY3VycmVudEJsb2NrSWR4KCkpCi0gICAgICAgICAgICAgICAgaW5kZXhTdGF0ZS5zZXRUb0Jsb2NrKHN0YXJ0SWR4KTsKLQotICAgICAgICAgICAgLy8gVGhlIGluZGV4IHNlYXJjaCBpcyBiYXNlZCBvbiB0aGUgbGFzdCBuYW1lIG9mIHRoZSBpbmRleCBibG9ja3MsIHNvIGF0IHRoYXQgcG9pbnQgd2UgaGF2ZSB0aGF0OgotICAgICAgICAgICAgLy8gICAxKSBpbmRleGVzW2N1cnJlbnRJZHggLSAxXS5sYXN0TmFtZSA8IHNsaWNlLnN0YXJ0IDw9IGluZGV4ZXNbY3VycmVudElkeF0ubGFzdE5hbWUKLSAgICAgICAgICAgIC8vICAgMikgaW5kZXhlc1tsYXN0QmxvY2tJZHggLSAxXS5sYXN0TmFtZSA8IHNsaWNlLmVuZCA8PSBpbmRleGVzW2xhc3RCbG9ja0lkeF0ubGFzdE5hbWUKLSAgICAgICAgICAgIC8vIHNvIGlmIGN1cnJlbnRJZHggPT0gbGFzdEJsb2NrSWR4IGFuZCBzbGljZS5lbmQgPCBpbmRleGVzW2N1cnJlbnRJZHhdLmZpcnN0TmFtZSwgd2UncmUgZ3VhcmFudGVlZCB0aGF0IHRoZQotICAgICAgICAgICAgLy8gd2hvbGUgc2xpY2UgaXMgYmV0d2VlbiB0aGUgcHJldmlvdXMgYmxvY2sgZW5kIGFuZCB0aGlzIGJsb2NrIHN0YXJ0LCBhbmQgdGh1cyBoYXMgbm8gY29ycmVzcG9uZGluZwotICAgICAgICAgICAgLy8gZGF0YS4gT25lIGV4Y2VwdGlvbiBpcyBpZiB0aGUgcHJldmlvdXMgYmxvY2sgZW5kcyB3aXRoIGFuIG9wZW5NYXJrZXIgYXMgaXQgd2lsbCBjb3ZlciBvdXIgc2xpY2UKLSAgICAgICAgICAgIC8vIGFuZCB3ZSBuZWVkIHRvIHJldHVybiBpdC4KLSAgICAgICAgICAgIGlmIChpbmRleFN0YXRlLmN1cnJlbnRCbG9ja0lkeCgpID09IGxhc3RCbG9ja0lkeAotICAgICAgICAgICAgICAgICYmIG1ldGFkYXRhKCkuY29tcGFyYXRvci5jb21wYXJlKHNsaWNlLmVuZCgpLCBpbmRleFN0YXRlLmN1cnJlbnRJbmRleCgpLmZpcnN0TmFtZSkgPCAwCi0gICAgICAgICAgICAgICAgJiYgb3Blbk1hcmtlciA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNsaWNlRG9uZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIFVuZmlsdGVyZWQgY29tcHV0ZU5leHQoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUgKHRydWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gT3VyIHByZXZpb3VzIHJlYWQgbWlnaHQgaGF2ZSBtYWRlIHVzIGNyb3NzIGFuIGluZGV4IGJsb2NrIGJvdW5kYXJ5LiBJZiBzbywgdXBkYXRlIG91ciBpbmZvcm1hdGlvbnMuCi0gICAgICAgICAgICAgICAgLy8gSWYgd2UgcmVhZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhcnRpdGlvbiwgdGhpcyBpcyBhbHNvIHdoYXQgd2lsbCBpbml0aWFsaXplIHRoZSBpbmRleCBzdGF0ZS4KLSAgICAgICAgICAgICAgICBpbmRleFN0YXRlLnVwZGF0ZUJsb2NrKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIG5leHQgdW5maWx0ZXJlZCB1bmxlc3Mgd2UndmUgcmVhY2hlZCB0aGUgZW5kLCBvciB3ZSdyZSBiZXlvbmQgb3VyIHNsaWNlCi0gICAgICAgICAgICAgICAgLy8gZW5kIChub3RlIHRoYXQgdW5sZXNzIHdlJ3JlIG9uIHRoZSBsYXN0IGJsb2NrIGZvciB0aGUgc2xpY2UsIHRoZXJlIGlzIG5vIHBvaW50Ci0gICAgICAgICAgICAgICAgLy8gaW4gY2hlY2tpbmcgdGhlIHNsaWNlIGVuZCkuCi0gICAgICAgICAgICAgICAgaWYgKGluZGV4U3RhdGUuaXNEb25lKCkKLSAgICAgICAgICAgICAgICAgICAgfHwgaW5kZXhTdGF0ZS5jdXJyZW50QmxvY2tJZHgoKSA+IGxhc3RCbG9ja0lkeAotICAgICAgICAgICAgICAgICAgICB8fCAhZGVzZXJpYWxpemVyLmhhc05leHQoKQotICAgICAgICAgICAgICAgICAgICB8fCAoaW5kZXhTdGF0ZS5jdXJyZW50QmxvY2tJZHgoKSA9PSBsYXN0QmxvY2tJZHggJiYgZGVzZXJpYWxpemVyLmNvbXBhcmVOZXh0VG8oZW5kKSA+PSAwKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLQotICAgICAgICAgICAgICAgIFVuZmlsdGVyZWQgbmV4dCA9IGRlc2VyaWFsaXplci5yZWFkTmV4dCgpOwotICAgICAgICAgICAgICAgIFVuZmlsdGVyZWRWYWxpZGF0aW9uLm1heWJlVmFsaWRhdGVVbmZpbHRlcmVkKG5leHQsIG1ldGFkYXRhKCksIGtleSwgc3N0YWJsZSk7Ci0gICAgICAgICAgICAgICAgLy8gV2UgbWF5IGdldCBlbXB0eSByb3cgZm9yIHRoZSBzYW1lIHJlYXNvbiBleHByZXNzZWQgb24gVW5maWx0ZXJlZFNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPbmUuCi0gICAgICAgICAgICAgICAgaWYgKG5leHQuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgIGlmIChuZXh0LmtpbmQoKSA9PSBVbmZpbHRlcmVkLktpbmQuUkFOR0VfVE9NQlNUT05FX01BUktFUikKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlT3Blbk1hcmtlcigoUmFuZ2VUb21ic3RvbmVNYXJrZXIpIG5leHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXh0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29sdW1uaXRlcmF0b3IvU1NUYWJsZVJldmVyc2VkSXRlcmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbHVtbml0ZXJhdG9yL1NTVGFibGVSZXZlcnNlZEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MGFhZmEuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29sdW1uaXRlcmF0b3IvU1NUYWJsZVJldmVyc2VkSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb2x1bW5pdGVyYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5JbW11dGFibGVCVHJlZVBhcnRpdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVEYXRhSW5wdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkFic3RyYWN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnRyZWUuQlRyZWU7Ci0KLS8qKgotICogIEEgQ2VsbCBJdGVyYXRvciBpbiByZXZlcnNlZCBjbHVzdGVyaW5nIG9yZGVyIG92ZXIgU1NUYWJsZQotICovCi1wdWJsaWMgY2xhc3MgU1NUYWJsZVJldmVyc2VkSXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFNTVGFibGVJdGVyYXRvcgotewotICAgIC8qKgotICAgICAqIFRoZSBpbmRleCBvZiB0aGUgc2xpY2UgYmVpbmcgcHJvY2Vzc2VkLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IHNsaWNlOwotCi0gICAgcHVibGljIFNTVGFibGVSZXZlcnNlZEl0ZXJhdG9yKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURhdGFJbnB1dCBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3dJbmRleEVudHJ5IGluZGV4RW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsaWNlcyBzbGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbkZpbHRlciBjb2x1bW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSGFuZGxlIGlmaWxlKQotICAgIHsKLSAgICAgICAgc3VwZXIoc3N0YWJsZSwgZmlsZSwga2V5LCBpbmRleEVudHJ5LCBzbGljZXMsIGNvbHVtbnMsIGlmaWxlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUmVhZGVyIGNyZWF0ZVJlYWRlckludGVybmFsKFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSwgRmlsZURhdGFJbnB1dCBmaWxlLCBib29sZWFuIHNob3VsZENsb3NlRmlsZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmRleEVudHJ5LmlzSW5kZXhlZCgpCi0gICAgICAgICAgICAgPyBuZXcgUmV2ZXJzZUluZGV4ZWRSZWFkZXIoaW5kZXhFbnRyeSwgZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKQotICAgICAgICAgICAgIDogbmV3IFJldmVyc2VSZWFkZXIoZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JldmVyc2VPcmRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IG5leHRTbGljZUluZGV4KCkKLSAgICB7Ci0gICAgICAgIGludCBuZXh0ID0gc2xpY2U7Ci0gICAgICAgIHNsaWNlKys7Ci0gICAgICAgIHJldHVybiBzbGljZXMuc2l6ZSgpIC0gKG5leHQgKyAxKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNNb3JlU2xpY2VzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzbGljZSA8IHNsaWNlcy5zaXplKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBSZXZlcnNlUmVhZGVyIGV4dGVuZHMgUmVhZGVyCi0gICAgewotICAgICAgICBwcm90ZWN0ZWQgUmV1c2FibGVQYXJ0aXRpb25EYXRhIGJ1ZmZlcjsKLSAgICAgICAgcHJvdGVjdGVkIEl0ZXJhdG9yPFVuZmlsdGVyZWQ+IGl0ZXJhdG9yOwotCi0gICAgICAgIC8vIFNldCBpbiBsb2FkRnJvbURpc2sgKCkgYW5kIHVzZWQgaW4gc2V0SXRlcmF0b3IgdG8gaGFuZGxlIHJhbmdlIHRvbWJzdG9uZSBleHRlbmRpbmcgb24gbXVsdGlwbGUgaW5kZXggYmxvY2suIFNlZQotICAgICAgICAvLyBsb2FkRnJvbURpc2sgZm9yIGRldGFpbHMuIE5vdGUgdGhhdCB0aG9zZSBhcmUgYWx3YXlzIGZhbHNlIGZvciBub24taW5kZXhlZCByZWFkZXJzLgotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBza2lwRmlyc3RJdGVyYXRlZEl0ZW07Ci0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIHNraXBMYXN0SXRlcmF0ZWRJdGVtOwotCi0gICAgICAgIHByaXZhdGUgUmV2ZXJzZVJlYWRlcihGaWxlRGF0YUlucHV0IGZpbGUsIGJvb2xlYW4gc2hvdWxkQ2xvc2VGaWxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihmaWxlLCBzaG91bGRDbG9zZUZpbGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFJldXNhYmxlUGFydGl0aW9uRGF0YSBjcmVhdGVCdWZmZXIoaW50IGJsb2Nrc0NvdW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgZXN0aW1hdGVkUm93Q291bnQgPSAxNjsKLSAgICAgICAgICAgIGludCBjb2x1bW5Db3VudCA9IG1ldGFkYXRhKCkucmVndWxhckNvbHVtbnMoKS5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoY29sdW1uQ291bnQgPT0gMCB8fCBtZXRhZGF0YSgpLmNsdXN0ZXJpbmdDb2x1bW5zKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVzdGltYXRlZFJvd0NvdW50ID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRvIGF2b2lkIHdhc3RlZCByZXNpemluZyB3ZSBndWVzcy1lc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIHJvd3Mgd2UncmUgbGlrZWx5IHRvIHJlYWQuIEZvciB0aGF0Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlIHVzZSB0aGUgc3RhdHMgb24gdGhlIG51bWJlciBvZiByb3dzIHBlciBwYXJ0aXRpb24gZm9yIHRoYXQgc3N0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IHNvIGZhciB3ZSBvbmx5IGtlZXAgc3RhdHMgb24gY2VsbHMsIHNvIHRvIGdldCBhIHJvdWdoIGVzdGltYXRlIG9uIHRoZSBudW1iZXIgb2Ygcm93cywKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgZGl2aWRlIGJ5IHRoZSBudW1iZXIgb2YgcmVndWxhciBjb2x1bW5zIHRoZSB0YWJsZSBoYXMuIFdlIHNob3VsZCBmaXggb25jZSB3ZSBjb2xsZWN0IHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBzdGF0cyBvbiByb3dzCi0gICAgICAgICAgICAgICAgICAgIGludCBlc3RpbWF0ZWRSb3dzUGVyUGFydGl0aW9uID0gKGludCkoc3N0YWJsZS5nZXRFc3RpbWF0ZWRDZWxsUGVyUGFydGl0aW9uQ291bnQoKS5wZXJjZW50aWxlKDAuNzUpIC8gY29sdW1uQ291bnQpOwotICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZWRSb3dDb3VudCA9IE1hdGgubWF4KGVzdGltYXRlZFJvd3NQZXJQYXJ0aXRpb24gLyBibG9ja3NDb3VudCwgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBFc3RpbWF0ZWRIaXN0b2dyYW0gbWVhbigpIG1ldGhvZCBjYW4gdGhyb3cgdGhpcyAoaWYgaXQgb3ZlcmZsb3dzKS4gV2hpbGUgc3VjaCBvdmVyZmxvdwotICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGRuJ3QgaGFwcGVuLCBpdCdzIG5vdCB3b3J0aCB0YWtpbmcgdGhlIHJpc2sgb2YgbGV0dGluZyB0aGUgZXhjZXB0aW9uIGJ1YmJsZSB1cC4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFJldXNhYmxlUGFydGl0aW9uRGF0YShtZXRhZGF0YSgpLCBwYXJ0aXRpb25LZXkoKSwgY29sdW1ucygpLCBlc3RpbWF0ZWRSb3dDb3VudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRGb3JTbGljZShTbGljZSBzbGljZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgcmVhZCB0aGUgZGF0YSwganVzdCBjcmVhdGUgdGhlIGl0ZXJhdG9yIGZvciB0aGUgc2xpY2UuIE90aGVyd2lzZSwgcmVhZCB0aGUgZGF0YS4KLSAgICAgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWZmZXIgPSBjcmVhdGVCdWZmZXIoMSk7Ci0gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGNhbiByZXVzZSB0aGF0IGJ1ZmZlciBiZXR3ZWVuIHNsaWNlcyAod2UgY291bGQgYWx0ZXJuYXRpdmVseSByZS1yZWFkIGZyb20gZGlzawotICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IHRpbWUsIGJ1dCB0aGF0IGZlZWxzIG1vcmUgd2FzdGVmdWwpIHNvIHdlIHdhbnQgdG8gaW5jbHVkZSBldmVyeXRoaW5nIGZyb20gdGhlIGJlZ2lubmluZy4KLSAgICAgICAgICAgICAgICAvLyBXZSBjYW4gc3RvcCBhdCB0aGUgc2xpY2UgZW5kIGhvd2V2ZXIgc2luY2UgYW55IGZvbGxvd2luZyBzbGljZSB3aWxsIGJlIGJlZm9yZSB0aGF0LgotICAgICAgICAgICAgICAgIGxvYWRGcm9tRGlzayhudWxsLCBzbGljZS5lbmQoKSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldEl0ZXJhdG9yKHNsaWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHNldEl0ZXJhdG9yKFNsaWNlIHNsaWNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgYnVmZmVyICE9IG51bGw7Ci0gICAgICAgICAgICBpdGVyYXRvciA9IGJ1ZmZlci5idWlsdC51bmZpbHRlcmVkSXRlcmF0b3IoY29sdW1ucywgU2xpY2VzLndpdGgobWV0YWRhdGEoKS5jb21wYXJhdG9yLCBzbGljZSksIHRydWUpOwotCi0gICAgICAgICAgICBpZiAoIWl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGlmIChza2lwRmlyc3RJdGVyYXRlZEl0ZW0pCi0gICAgICAgICAgICAgICAgaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAoc2tpcExhc3RJdGVyYXRlZEl0ZW0pCi0gICAgICAgICAgICAgICAgaXRlcmF0b3IgPSBuZXcgU2tpcExhc3RJdGVyYXRvcihpdGVyYXRvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOZXh0SW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgLy8gSWYgd2UndmUgbmV2ZXIgY2FsbGVkIHNldEZvclNsaWNlLCB3ZSdyZSByZWFkaW5nIGV2ZXJ5dGhpbmcKLSAgICAgICAgICAgIGlmIChpdGVyYXRvciA9PSBudWxsKQotICAgICAgICAgICAgICAgIHNldEZvclNsaWNlKFNsaWNlLkFMTCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5oYXNOZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZCBuZXh0SW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFoYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdG9wUmVhZGluZ0Rpc2soKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVhZHMgdGhlIHVuZmlsdGVyZWQgZnJvbSBkaXNrIGFuZCBsb2FkIHRoZW0gaW50byB0aGUgcmVhZGVyIGJ1ZmZlci4gSXQgc3RvcHMgcmVhZGluZyB3aGVuIGVpdGhlciB0aGUgcGFydGl0aW9uCi0gICAgICAgIC8vIGlzIGZ1bGx5IHJlYWQsIG9yIHdoZW4gc3RvcFJlYWRpbmdEaXNrKCkgcmV0dXJucyB0cnVlLgotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBsb2FkRnJvbURpc2soQ2x1c3RlcmluZ0JvdW5kPD8+IHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2x1c3RlcmluZ0JvdW5kPD8+IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzUHJldmlvdXNCbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzTmV4dEJsb2NrKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgLy8gc3RhcnQgIT0gbnVsbCBtZWFucyBpdCdzIHRoZSBibG9jayBjb3ZlcmluZyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzbGljZSwgc28gaXQgaGFzIHRvIGJlIHRoZSBsYXN0IGJsb2NrIGZvciB0aGlzIHNsaWNlLgotICAgICAgICAgICAgYXNzZXJ0IHN0YXJ0ID09IG51bGwgfHwgIWhhc05leHRCbG9jazsKLQotICAgICAgICAgICAgYnVmZmVyLnJlc2V0KCk7Ci0gICAgICAgICAgICBza2lwRmlyc3RJdGVyYXRlZEl0ZW0gPSBmYWxzZTsKLSAgICAgICAgICAgIHNraXBMYXN0SXRlcmF0ZWRJdGVtID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBzdGFydCBtaWdodCBiZSBpbiB0aGlzIGJsb2NrLCBza2lwIGV2ZXJ5dGhpbmcgdGhhdCBjb21lcyBiZWZvcmUgaXQuCi0gICAgICAgICAgICBpZiAoc3RhcnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoZGVzZXJpYWxpemVyLmhhc05leHQoKSAmJiBkZXNlcmlhbGl6ZXIuY29tcGFyZU5leHRUbyhzdGFydCkgPD0gMCAmJiAhc3RvcFJlYWRpbmdEaXNrKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGVzZXJpYWxpemVyLm5leHRJc1JvdygpKQotICAgICAgICAgICAgICAgICAgICAgICAgZGVzZXJpYWxpemVyLnNraXBOZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZU9wZW5NYXJrZXIoKFJhbmdlVG9tYnN0b25lTWFya2VyKWRlc2VyaWFsaXplci5yZWFkTmV4dCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYW4gb3BlbiBtYXJrZXIsIGl0J3MgZWl0aGVyIG9uZSBmcm9tIHdoYXQgd2UganVzdCBza2lwcGVkIG9yIGl0J3Mgb25lIHRoYXQgb3BlbiBpbiB0aGUgbmV4dCAob3IKLSAgICAgICAgICAgIC8vIG9uZSBvZiB0aGUgbmV4dCkgaW5kZXggYmxvY2sgKGlmIG9wZW5NYXJrZXIgPT0gb3Blbk1hcmtlckF0U3RhcnRPZkJsb2NrKS4KLSAgICAgICAgICAgIGlmIChvcGVuTWFya2VyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byBmZWVkIGEgbWFya2VyIHRvIHRoZSBidWZmZXIsIGJlY2F1c2UgdGhhdCBtYXJrZXIgaXMgbGlrZWx5IHRvIGJlIGNsb3NlIGxhdGVyIGFuZCBJbW10YWJsZUJUcmVlUGFydGl0aW9uCi0gICAgICAgICAgICAgICAgLy8gZG9lc24ndCB0YWtlIGtpbmRseSB0byBtYXJrZXIgdGhhdCBjb21lcyB3aXRob3V0IHRoZWlyIGNvdW50ZXJwYXJ0LiBJZiB0aGF0J3MgdGhlIGxhc3QgYmxvY2sgd2UncmUgZ29ubmEgcmVhZCAoZm9yCi0gICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgc2xpY2UgYXQgbGVhc3QpIGl0J3MgZWFzeSBiZWNhdXNlIHdlJ2xsIHdhbnQgdG8gcmV0dXJuIHRoYXQgb3BlbiBtYXJrZXIgYXQgdGhlIGVuZCBvZiB0aGUgZGF0YSBpbiB0aGlzCi0gICAgICAgICAgICAgICAgLy8gYmxvY2sgYW55d2F5LCBzbyB3ZSBoYXZlIG5vdGhpbmcgbW9yZSB0byBkbyB0aGFuIGFkZGluZyBpdCB0byB0aGUgYnVmZmVyLgotICAgICAgICAgICAgICAgIC8vIElmIGl0J3Mgbm90IHRoZSBsYXN0IGJsb2NrIGhvd2V2ZXIsIGluIHdoaWNoIGNhc2Ugd2Uga25vdyB3ZSdsbCBoYXZlIHN0YXJ0ID09IG51bGwsIGl0IG1lYW5zIHRoaXMgbWFya2VyIGlzIHJlYWxseQotICAgICAgICAgICAgICAgIC8vIG9wZW4gaW4gYSBuZXh0IGJsb2NrIGFuZCBzbyB3aGlsZSB3ZSBkbyBuZWVkIHRvIGFkZCBpdCB0aGUgYnVmZmVyIGZvciB0aGUgcmVhc29uIG1lbnRpb25lZCBhYm92ZSwgd2UgZG9uJ3QKLSAgICAgICAgICAgICAgICAvLyB3YW50IHRvICJyZXR1cm4iIGl0IGp1c3QgeWV0LCB3ZSdsbCB3YWl0IHVudGlsIHdlIHJlYWNoIGl0IGluIHRoZSBuZXh0IGJsb2Nrcy4gVGhhdCdzIHdoeSB3ZSB0cmlnZ2VyCi0gICAgICAgICAgICAgICAgLy8gc2tpcExhc3RJdGVyYXRlZEl0ZW0gaW4gdGhhdCBjYXNlICh0aGlzIGlzIGZpcnN0IGl0ZW0gb2YgdGhlIGJsb2NrLCBidXQgd2UncmUgaXRlcmF0aW5nIGluIHJldmVyc2Ugb3JkZXIKLSAgICAgICAgICAgICAgICAvLyBzbyBpdCB3aWxsIGJlIGxhc3QgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yKS4KLSAgICAgICAgICAgICAgICBDbHVzdGVyaW5nQm91bmQ8Pz4gbWFya2VyU3RhcnQgPSBzdGFydCA9PSBudWxsID8gQnVmZmVyQ2x1c3RlcmluZ0JvdW5kLkJPVFRPTSA6IHN0YXJ0OwotICAgICAgICAgICAgICAgIGJ1ZmZlci5hZGQobmV3IFJhbmdlVG9tYnN0b25lQm91bmRNYXJrZXIobWFya2VyU3RhcnQsIG9wZW5NYXJrZXIpKTsKLSAgICAgICAgICAgICAgICBpZiAoaGFzTmV4dEJsb2NrKQotICAgICAgICAgICAgICAgICAgICBza2lwTGFzdEl0ZXJhdGVkSXRlbSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE5vdyBkZXNlcmlhbGl6ZSBldmVyeXRoaW5nIHVudGlsIHdlIHJlYWNoIG91ciByZXF1ZXN0ZWQgZW5kIChpZiB3ZSBoYXZlIG9uZSkKLSAgICAgICAgICAgIC8vIFNlZSBTU1RhYmxlSXRlcmF0b3IuRm9yd2FyZFJlYWQuY29tcHV0ZU5leHQoKSBmb3Igd2h5IHRoaXMgaXMgYSBzdHJpY3QgaW5lcXVhbGl0eSBiZWxvdzogdGhpcyBpcyB0aGUgc2FtZQotICAgICAgICAgICAgLy8gcmVhc29uaW5nIGhlcmUuCi0gICAgICAgICAgICB3aGlsZSAoZGVzZXJpYWxpemVyLmhhc05leHQoKQotICAgICAgICAgICAgICAgICAgICYmIChlbmQgPT0gbnVsbCB8fCBkZXNlcmlhbGl6ZXIuY29tcGFyZU5leHRUbyhlbmQpIDwgMCkKLSAgICAgICAgICAgICAgICAgICAmJiAhc3RvcFJlYWRpbmdEaXNrKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVW5maWx0ZXJlZCB1bmZpbHRlcmVkID0gZGVzZXJpYWxpemVyLnJlYWROZXh0KCk7Ci0gICAgICAgICAgICAgICAgVW5maWx0ZXJlZFZhbGlkYXRpb24ubWF5YmVWYWxpZGF0ZVVuZmlsdGVyZWQodW5maWx0ZXJlZCwgbWV0YWRhdGEoKSwga2V5LCBzc3RhYmxlKTsKLSAgICAgICAgICAgICAgICAvLyBXZSBtYXkgZ2V0IGVtcHR5IHJvdyBmb3IgdGhlIHNhbWUgcmVhc29uIGV4cHJlc3NlZCBvbiBVbmZpbHRlcmVkU2VyaWFsaXplci5kZXNlcmlhbGl6ZU9uZS4KLSAgICAgICAgICAgICAgICBpZiAoIXVuZmlsdGVyZWQuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYWRkKHVuZmlsdGVyZWQpOwotCi0gICAgICAgICAgICAgICAgaWYgKHVuZmlsdGVyZWQuaXNSYW5nZVRvbWJzdG9uZU1hcmtlcigpKQotICAgICAgICAgICAgICAgICAgICB1cGRhdGVPcGVuTWFya2VyKChSYW5nZVRvbWJzdG9uZU1hcmtlcil1bmZpbHRlcmVkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBvcGVuIG1hcmtlciwgd2Ugc2hvdWxkIGNsb3NlIGl0IGJlZm9yZSBmaW5pc2hpbmcKLSAgICAgICAgICAgIGlmIChvcGVuTWFya2VyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgcmV2ZXJzZSBwcm9ibGVtIHRoYW4gdGhlIG9uZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrLiBOYW1lbHksIGlmIGl0J3MgdGhlIGZpcnN0IGJsb2NrCi0gICAgICAgICAgICAgICAgLy8gd2UgZGVzZXJpYWxpemUgZm9yIHRoZSBzbGljZSAodGhlIG9uZSBjb3ZlcmluZyB0aGUgc2xpY2UgZW5kIGJhc2ljYWxseSksIHRoZW4gaXQncyBlYXN5LCB3ZSBqdXN0IHdhbnQKLSAgICAgICAgICAgICAgICAvLyB0byBhZGQgdGhlIGNsb3NlIG1hcmtlciB0byB0aGUgYnVmZmVyIGFuZCByZXR1cm4gaXQgbm9ybWFsbHkuCi0gICAgICAgICAgICAgICAgLy8gSWYgaXQncyBub3RlIG91ciBmaXJzdCBibG9jayAoZm9yIHRoZSBzbGljZSkgaG93ZXZlciwgaXQgbWVhbnMgdGhhdCBtYXJrZXIgY2xvc2VkIGluIGEgcHJldmlvdXNseSByZWFkCi0gICAgICAgICAgICAgICAgLy8gYmxvY2sgYW5kIHdlIGhhdmUgYWxyZWFkeSByZXR1cm5lZCBpdC4gU28gd2hpbGUgd2Ugc2hvdWxkIHN0aWxsIGFkZCBpdCB0byB0aGUgYnVmZmVyIGZvciB0aGUgc2FrZSBvZgotICAgICAgICAgICAgICAgIC8vIG5vdCBicmVha2luZyBJbW11dGFibGVCVHJlZVBhcnRpdGlvbiwgd2Ugc2hvdWxkIHNraXAgaXQgd2hlbiByZXR1cm5pbmcgZnJvbSB0aGUgaXRlcmF0b3IsIGhlbmNlIHRoZQotICAgICAgICAgICAgICAgIC8vIHNraXBGaXJzdEl0ZXJhdGVkSXRlbSAodGhpcyBpcyB0aGUgbGFzdCBpdGVtIG9mIHRoZSBibG9jaywgYnV0IHdlJ3JlIGl0ZXJhdGluZyBpbiByZXZlcnNlIG9yZGVyIHNvIGl0IHdpbGwKLSAgICAgICAgICAgICAgICAvLyBiZSB0aGUgZmlyc3QgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yKS4KLSAgICAgICAgICAgICAgICBDbHVzdGVyaW5nQm91bmQ8Pz4gbWFya2VyRW5kID0gZW5kID09IG51bGwgPyBCdWZmZXJDbHVzdGVyaW5nQm91bmQuVE9QIDogZW5kOwotICAgICAgICAgICAgICAgIGJ1ZmZlci5hZGQobmV3IFJhbmdlVG9tYnN0b25lQm91bmRNYXJrZXIobWFya2VyRW5kLCBvcGVuTWFya2VyKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGhhc1ByZXZpb3VzQmxvY2spCi0gICAgICAgICAgICAgICAgICAgIHNraXBGaXJzdEl0ZXJhdGVkSXRlbSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1ZmZlci5idWlsZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBSZXZlcnNlSW5kZXhlZFJlYWRlciBleHRlbmRzIFJldmVyc2VSZWFkZXIKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSW5kZXhTdGF0ZSBpbmRleFN0YXRlOwotCi0gICAgICAgIC8vIFRoZSBzbGljZSB3ZSdyZSBjdXJyZW50bHkgaXRlcmF0aW5nIG92ZXIKLSAgICAgICAgcHJpdmF0ZSBTbGljZSBzbGljZTsKLSAgICAgICAgLy8gVGhlIGxhc3QgaW5kZXggYmxvY2sgdG8gY29uc2lkZXIgZm9yIHRoZSBzbGljZQotICAgICAgICBwcml2YXRlIGludCBsYXN0QmxvY2tJZHg7Ci0KLSAgICAgICAgcHJpdmF0ZSBSZXZlcnNlSW5kZXhlZFJlYWRlcihSb3dJbmRleEVudHJ5IGluZGV4RW50cnksIEZpbGVEYXRhSW5wdXQgZmlsZSwgYm9vbGVhbiBzaG91bGRDbG9zZUZpbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKGZpbGUsIHNob3VsZENsb3NlRmlsZSk7Ci0gICAgICAgICAgICB0aGlzLmluZGV4U3RhdGUgPSBuZXcgSW5kZXhTdGF0ZSh0aGlzLCBtZXRhZGF0YS5jb21wYXJhdG9yLCBpbmRleEVudHJ5LCB0cnVlLCBpZmlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIHRoaXMuaW5kZXhTdGF0ZS5jbG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEZvclNsaWNlKFNsaWNlIHNsaWNlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5zbGljZSA9IHNsaWNlOwotCi0gICAgICAgICAgICAvLyBpZiBvdXIgcHJldmlvdXMgc2xpY2luZyBhbHJlYWR5IGdvdCB1cyBwYXN0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNzdGFibGUsIHdlJ3JlIGRvbmUKLSAgICAgICAgICAgIGlmIChpbmRleFN0YXRlLmlzRG9uZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGl0ZXJhdG9yID0gQ29sbGVjdGlvbnMuZW1wdHlJdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRmluZCB0aGUgZmlyc3QgaW5kZXggYmxvY2sgd2UnbGwgbmVlZCB0byByZWFkIGZvciB0aGUgc2xpY2UuCi0gICAgICAgICAgICBpbnQgc3RhcnRJZHggPSBpbmRleFN0YXRlLmZpbmRCbG9ja0luZGV4KHNsaWNlLmVuZCgpLCBpbmRleFN0YXRlLmN1cnJlbnRCbG9ja0lkeCgpKTsKLSAgICAgICAgICAgIGlmIChzdGFydElkeCA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaXRlcmF0b3IgPSBDb2xsZWN0aW9ucy5lbXB0eUl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgaW5kZXhTdGF0ZS5zZXRUb0Jsb2NrKHN0YXJ0SWR4KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxhc3RCbG9ja0lkeCA9IGluZGV4U3RhdGUuZmluZEJsb2NrSW5kZXgoc2xpY2Uuc3RhcnQoKSwgc3RhcnRJZHgpOwotCi0gICAgICAgICAgICAvLyBJZiB0aGUgbGFzdCBibG9jayB0byBsb29rIChpbiByZXZlcnNlIG9yZGVyKSBpcyBhZnRlciB0aGUgdmVyeSBsYXN0IGJsb2NrLCB3ZSBoYXZlIG5vdGhpbmcgZm9yIHRoYXQgc2xpY2UKLSAgICAgICAgICAgIGlmIChsYXN0QmxvY2tJZHggPj0gaW5kZXhTdGF0ZS5ibG9ja3NDb3VudCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBzdGFydElkeCA+PSBpbmRleFN0YXRlLmJsb2Nrc0NvdW50KCk7Ci0gICAgICAgICAgICAgICAgaXRlcmF0b3IgPSBDb2xsZWN0aW9ucy5lbXB0eUl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJZiB3ZSBzdGFydCAoaW4gcmV2ZXJzZSBvcmRlcikgYWZ0ZXIgdGhlIHZlcnkgbGFzdCBibG9jaywganVzdCByZWFkIGZyb20gdGhlIGxhc3Qgb25lLgotICAgICAgICAgICAgaWYgKHN0YXJ0SWR4ID49IGluZGV4U3RhdGUuYmxvY2tzQ291bnQoKSkKLSAgICAgICAgICAgICAgICBzdGFydElkeCA9IGluZGV4U3RhdGUuYmxvY2tzQ291bnQoKSAtIDE7Ci0KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBldmVuIGlmIHdlIHdlcmUgYWxyZWFkeSBzZXQgb24gdGhlIHByb3BlciBibG9jayAod2hpY2ggd291bGQgaGFwcGVuIGlmIHRoZSBwcmV2aW91cyBzbGljZQotICAgICAgICAgICAgLy8gcmVxdWVzdGVkIGVuZGVkIG9uIHRoZSBzYW1lIGJsb2NrIHRoaXMgb25lIHN0YXJ0KSwgd2UgY2FuJ3QgcmV1c2UgaXQgYmVjYXVzZSB3aGVuIHJlYWRpbmcgdGhlIHByZXZpb3VzCi0gICAgICAgICAgICAvLyBzbGljZSB3ZSd2ZSBvbmx5IHJlYWQgdGhhdCBibG9jayBmcm9tIHRoZSBwcmV2aW91cyBzbGljZSBzdGFydC4gUmUtcmVhZGluZyBhbHNvIGhhbmRsZXMKLSAgICAgICAgICAgIC8vIHNraXBGaXJzdEl0ZXJhdGVkSXRlbS9za2lwTGFzdEl0ZXJhdGVkSXRlbSB0aGF0IHdlIHdvdWxkIG5lZWQgdG8gaGFuZGxlIG90aGVyd2lzZS4KLSAgICAgICAgICAgIGluZGV4U3RhdGUuc2V0VG9CbG9jayhzdGFydElkeCk7Ci0KLSAgICAgICAgICAgIHJlYWRDdXJyZW50QmxvY2soZmFsc2UsIHN0YXJ0SWR4ICE9IGxhc3RCbG9ja0lkeCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzTmV4dEludGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdXBlci5oYXNOZXh0SW50ZXJuYWwoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgd2hpbGUgKHRydWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBub3RoaW5nIG1vcmUgZm9yIG91ciBjdXJyZW50IGJsb2NrLCBtb3ZlIHRoZSBuZXh0IG9uZSAoc28gdGhlIG9uZSBiZWZvcmUgb24gZGlzaykuCi0gICAgICAgICAgICAgICAgaW50IG5leHRCbG9ja0lkeCA9IGluZGV4U3RhdGUuY3VycmVudEJsb2NrSWR4KCkgLSAxOwotICAgICAgICAgICAgICAgIGlmIChuZXh0QmxvY2tJZHggPCAwIHx8IG5leHRCbG9ja0lkeCA8IGxhc3RCbG9ja0lkeCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICAgICAgLy8gVGhlIHNsaWNlIHN0YXJ0IGNhbiBiZSBpbgotICAgICAgICAgICAgICAgIGluZGV4U3RhdGUuc2V0VG9CbG9jayhuZXh0QmxvY2tJZHgpOwotICAgICAgICAgICAgICAgIHJlYWRDdXJyZW50QmxvY2sodHJ1ZSwgbmV4dEJsb2NrSWR4ICE9IGxhc3RCbG9ja0lkeCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiBhbiBpbmRleGVkIGJsb2NrIG9ubHkgY29udGFpbnMgZGF0YSBmb3IgYSBkcm9wcGVkIGNvbHVtbiwgdGhlIGl0ZXJhdG9yIHdpbGwgYmUgZW1wdHksIGV2ZW4KLSAgICAgICAgICAgICAgICAvLyB0aG91Z2ggd2UgbWF5IHN0aWxsIGhhdmUgZGF0YSB0byByZWFkIGluIHN1YnNlcXVlbnQgYmxvY2tzCi0KLSAgICAgICAgICAgICAgICAvLyBhbHNvLCBmb3IgcHJlLTMuMCBzdG9yYWdlIGZvcm1hdHMsIGluZGV4IGJsb2NrcyB0aGF0IG9ubHkgY29udGFpbiBhIHNpbmdsZSByb3cgYW5kIHRoYXQgcm93IGNyb3NzZXMKLSAgICAgICAgICAgICAgICAvLyBpbmRleCBib3VuZGFyaWVzLCB0aGUgaXRlcmF0b3Igd2lsbCBiZSBlbXB0eSBldmVuIHRob3VnaCB3ZSBoYXZlbid0IHJlYWQgZXZlcnl0aGluZyB3ZSdyZSBpbnRlbmRpbmcKLSAgICAgICAgICAgICAgICAvLyB0byByZWFkLiBJbiB0aGF0IGNhc2UsIHdlIHdhbnQgdG8gcmVhZCB0aGUgbmV4dCBpbmRleCBibG9jay4gVGhpcyBzaG91bGRuJ3QgYmUgcG9zc2libGUgaW4gMy4wKwotICAgICAgICAgICAgICAgIC8vIGZvcm1hdHMgKHNlZSBuZXh0IGNvbW1lbnQpCi0gICAgICAgICAgICAgICAgaWYgKCFpdGVyYXRvci5oYXNOZXh0KCkgJiYgbmV4dEJsb2NrSWR4ID4gbGFzdEJsb2NrSWR4KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkcyB0aGUgY3VycmVudCBibG9jaywgdGhlIGxhc3Qgb25lIHdlJ3ZlIHNldC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGhhc1ByZXZpb3VzQmxvY2sgaXMgd2hldGhlciB3ZSBoYXZlIGFscmVhZHkgcmVhZCBhIHByZXZpb3VzIGJsb2NrIGZvciB0aGUgY3VycmVudCBzbGljZS4KLSAgICAgICAgICogQHBhcmFtIGhhc05leHRCbG9jayBpcyB3aGV0aGVyIHdlIGhhdmUgbW9yZSBibG9ja3MgdG8gcmVhZCBmb3IgdGhlIGN1cnJlbnQgc2xpY2UuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgcmVhZEN1cnJlbnRCbG9jayhib29sZWFuIGhhc1ByZXZpb3VzQmxvY2ssIGJvb2xlYW4gaGFzTmV4dEJsb2NrKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKQotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGNyZWF0ZUJ1ZmZlcihpbmRleFN0YXRlLmJsb2Nrc0NvdW50KCkpOwotCi0gICAgICAgICAgICAvLyBUaGUgc2xpY2Ugc3RhcnQgKHJlc3AuIHNsaWNlIGVuZCkgaXMgb25seSBtZWFuaW5nZnVsIG9uIHRoZSBsYXN0IChyZXNwLiBmaXJzdCkgYmxvY2sgcmVhZCAoc2luY2UgYWdhaW4sCi0gICAgICAgICAgICAvLyB3ZSByZWFkIGJsb2NrcyBpbiByZXZlcnNlIG9yZGVyKS4KLSAgICAgICAgICAgIGJvb2xlYW4gY2FuSW5jbHVkZVNsaWNlU3RhcnQgPSAhaGFzTmV4dEJsb2NrOwotICAgICAgICAgICAgYm9vbGVhbiBjYW5JbmNsdWRlU2xpY2VFbmQgPSAhaGFzUHJldmlvdXNCbG9jazsKLQotICAgICAgICAgICAgbG9hZEZyb21EaXNrKGNhbkluY2x1ZGVTbGljZVN0YXJ0ID8gc2xpY2Uuc3RhcnQoKSA6IG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FuSW5jbHVkZVNsaWNlRW5kID8gc2xpY2UuZW5kKCkgOiBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1ByZXZpb3VzQmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgaGFzTmV4dEJsb2NrKTsKLSAgICAgICAgICAgIHNldEl0ZXJhdG9yKHNsaWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdG9wUmVhZGluZ0Rpc2soKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGluZGV4U3RhdGUuaXNQYXN0Q3VycmVudEJsb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFJldXNhYmxlUGFydGl0aW9uRGF0YQotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhOwotICAgICAgICBwcml2YXRlIGZpbmFsIERlY29yYXRlZEtleSBwYXJ0aXRpb25LZXk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUmVndWxhckFuZFN0YXRpY0NvbHVtbnMgY29sdW1uczsKLQotICAgICAgICBwcml2YXRlIE11dGFibGVEZWxldGlvbkluZm8uQnVpbGRlciBkZWxldGlvbkJ1aWxkZXI7Ci0gICAgICAgIHByaXZhdGUgTXV0YWJsZURlbGV0aW9uSW5mbyBkZWxldGlvbkluZm87Ci0gICAgICAgIHByaXZhdGUgQlRyZWUuQnVpbGRlcjxSb3c+IHJvd0J1aWxkZXI7Ci0gICAgICAgIHByaXZhdGUgSW1tdXRhYmxlQlRyZWVQYXJ0aXRpb24gYnVpbHQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBSZXVzYWJsZVBhcnRpdGlvbkRhdGEoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IHBhcnRpdGlvbktleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVndWxhckFuZFN0YXRpY0NvbHVtbnMgY29sdW1ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluaXRpYWxSb3dDYXBhY2l0eSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICAgICAgdGhpcy5wYXJ0aXRpb25LZXkgPSBwYXJ0aXRpb25LZXk7Ci0gICAgICAgICAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zOwotICAgICAgICAgICAgdGhpcy5yb3dCdWlsZGVyID0gQlRyZWUuYnVpbGRlcihtZXRhZGF0YS5jb21wYXJhdG9yLCBpbml0aWFsUm93Q2FwYWNpdHkpOwotICAgICAgICB9Ci0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGQoVW5maWx0ZXJlZCB1bmZpbHRlcmVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodW5maWx0ZXJlZC5pc1JvdygpKQotICAgICAgICAgICAgICAgIHJvd0J1aWxkZXIuYWRkKChSb3cpdW5maWx0ZXJlZCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZGVsZXRpb25CdWlsZGVyLmFkZCgoUmFuZ2VUb21ic3RvbmVNYXJrZXIpdW5maWx0ZXJlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1aWx0ID0gbnVsbDsKLSAgICAgICAgICAgIHJvd0J1aWxkZXIucmV1c2UoKTsKLSAgICAgICAgICAgIGRlbGV0aW9uQnVpbGRlciA9IE11dGFibGVEZWxldGlvbkluZm8uYnVpbGRlcihwYXJ0aXRpb25MZXZlbERlbGV0aW9uLCBtZXRhZGF0YSgpLmNvbXBhcmF0b3IsIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGJ1aWxkKCkKLSAgICAgICAgewotICAgICAgICAgICAgZGVsZXRpb25JbmZvID0gZGVsZXRpb25CdWlsZGVyLmJ1aWxkKCk7Ci0gICAgICAgICAgICBidWlsdCA9IG5ldyBJbW11dGFibGVCVHJlZVBhcnRpdGlvbihtZXRhZGF0YSwgcGFydGl0aW9uS2V5LCBjb2x1bW5zLCBSb3dzLkVNUFRZX1NUQVRJQ19ST1csIHJvd0J1aWxkZXIuYnVpbGQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0aW9uSW5mbywgRW5jb2RpbmdTdGF0cy5OT19TVEFUUyk7Ci0gICAgICAgICAgICBkZWxldGlvbkJ1aWxkZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2tpcExhc3RJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0SXRlcmF0b3I8VW5maWx0ZXJlZD4KLSAgICB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSXRlcmF0b3I8VW5maWx0ZXJlZD4gaXRlcmF0b3I7Ci0KLSAgICAgICAgcHJpdmF0ZSBTa2lwTGFzdEl0ZXJhdG9yKEl0ZXJhdG9yPFVuZmlsdGVyZWQ+IGl0ZXJhdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZCBjb21wdXRlTmV4dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBlbmRPZkRhdGEoKTsKLQotICAgICAgICAgICAgVW5maWx0ZXJlZCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/IG5leHQgOiBlbmRPZkRhdGEoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9BYnN0cmFjdENvbW1pdExvZ1NlZ21lbnRNYW5hZ2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21taXRsb2cvQWJzdHJhY3RDb21taXRMb2dTZWdtZW50TWFuYWdlci5qYXZhCmluZGV4IGQ4ZWIwZTcuLmU2Y2MyZmEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9BYnN0cmFjdENvbW1pdExvZ1NlZ21lbnRNYW5hZ2VyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0Fic3RyYWN0Q29tbWl0TG9nU2VnbWVudE1hbmFnZXIuamF2YQpAQCAtMTk1LDcgKzE5NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKGludGVycnVwdGVkKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGRpc2NhcmRBdmFpbGFibGVTZWdtZW50KCk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21taXRsb2cvQ29tbWl0TG9nLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21taXRsb2cvQ29tbWl0TG9nLmphdmEKaW5kZXggNjE5NWIxYi4uY2E1MDc3ZSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0NvbW1pdExvZy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2cuamF2YQpAQCAtMzE0LDcgKzMxNCw3IEBACiAgICAgICAgICAgICAgICAgYnVmZmVyLnB1dEludCgoaW50KSBjaGVja3N1bS5nZXRWYWx1ZSgpKTsKIAogICAgICAgICAgICAgICAgIC8vIGNoZWNrc3VtbWVkIG11dGF0aW9uCi0gICAgICAgICAgICAgICAgZG9zLndyaXRlKGRvYi5nZXREYXRhKCksIDAsIHNpemUpOworICAgICAgICAgICAgICAgIGRvcy53cml0ZShkb2IudW5zYWZlR2V0QnVmZmVyQW5kRmxpcCgpKTsKICAgICAgICAgICAgICAgICB1cGRhdGVDaGVja3N1bShjaGVja3N1bSwgYnVmZmVyLCBidWZmZXIucG9zaXRpb24oKSAtIHNpemUsIHNpemUpOwogICAgICAgICAgICAgICAgIGJ1ZmZlci5wdXRJbnQoKGludCkgY2hlY2tzdW0uZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICB9CkBAIC00NTMsMTEgKzQ1Myw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0Q0RDQmxvY2tXcml0ZXMoYm9vbGVhbiB2YWwpCiAgICAgewotICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrU3RhdGUoRGF0YWJhc2VEZXNjcmlwdG9yLmlzQ0RDRW5hYmxlZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBzZXQgYmxvY2tfd3JpdGVzICglcyk6IENEQyBpcyBub3QgZW5hYmxlZC4iLCB2YWwpOwotICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrU3RhdGUoc2VnbWVudE1hbmFnZXIgaW5zdGFuY2VvZiBDb21taXRMb2dTZWdtZW50TWFuYWdlckNEQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDREMgaXMgZW5hYmxlZCBidXQgd2UgaGF2ZSB0aGUgd3JvbmcgQ29tbWl0TG9nU2VnbWVudE1hbmFnZXIgdHlwZTogJXMuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBsZWFzZSByZXBvcnQgdGhpcyBhcyBidWcuIiwgc2VnbWVudE1hbmFnZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICBlbnN1cmVDRENFbmFibGVkKCJVbmFibGUgdG8gc2V0IGJsb2NrX3dyaXRlcy4iKTsKICAgICAgICAgYm9vbGVhbiBvbGRWYWwgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q0RDQmxvY2tXcml0ZXMoKTsKICAgICAgICAgQ29tbWl0TG9nU2VnbWVudCBjdXJyZW50U2VnbWVudCA9IHNlZ21lbnRNYW5hZ2VyLmFsbG9jYXRpbmdGcm9tKCk7CiAgICAgICAgIC8vIFVwZGF0ZSB0aGUgY3VycmVudCBzZWdtZW50IENEQyBzdGF0ZSB0byBQRVJNSVRURUQgaWYgYmxvY2tfd3JpdGVzIGlzIGRpc2FibGVkIG5vdywgYW5kIGl0IHdhcyBpbiBGT1JCSURERU4gc3RhdGUKQEAgLTQ2Nyw2ICs0NjMsMjkgQEAKICAgICAgICAgbG9nZ2VyLmluZm8oIlVwZGF0ZWQgQ0RDIGJsb2NrX3dyaXRlcyBmcm9tIHt9IHRvIHt9Iiwgb2xkVmFsLCB2YWwpOwogICAgIH0KIAorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNDRENPblJlcGFpckVuYWJsZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIERhdGFiYXNlRGVzY3JpcHRvci5pc0NEQ09uUmVwYWlyRW5hYmxlZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldENEQ09uUmVwYWlyRW5hYmxlZChib29sZWFuIHZhbHVlKQorICAgIHsKKyAgICAgICAgZW5zdXJlQ0RDRW5hYmxlZCgiVW5hYmxlIHRvIHNldCBjZGNfb25fcmVwYWlyX2VuYWJsZWQuIik7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDRENPblJlcGFpckVuYWJsZWQodmFsdWUpOworICAgICAgICBsb2dnZXIuaW5mbygiU2V0IGNkY19vbl9yZXBhaXJfZW5hYmxlZCB0byB7fSIsIHZhbHVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlQ0RDRW5hYmxlZChTdHJpbmcgaGludCkKKyAgICB7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZShEYXRhYmFzZURlc2NyaXB0b3IuaXNDRENFbmFibGVkKCksICJDREMgaXMgbm90IGVuYWJsZWQuICVzIiwgaGludCk7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZShzZWdtZW50TWFuYWdlciBpbnN0YW5jZW9mIENvbW1pdExvZ1NlZ21lbnRNYW5hZ2VyQ0RDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEQyBpcyBlbmFibGVkIGJ1dCB3ZSBoYXZlIHRoZSB3cm9uZyBDb21taXRMb2dTZWdtZW50TWFuYWdlciB0eXBlOiAlcy4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIHJlcG9ydCB0aGlzIGFzIGJ1Zy4iLCBzZWdtZW50TWFuYWdlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogU2h1dHMgZG93biB0aGUgdGhyZWFkcyB1c2VkIGJ5IHRoZSBjb21taXQgbG9nLCBibG9ja2luZyB1bnRpbCBjb21wbGV0aW9uLgogICAgICAqIFRPRE8gdGhpcyBzaG91bGQgYWNjZXB0IGEgdGltZW91dCwgYW5kIHRocm93IFRpbWVvdXRFeGNlcHRpb24KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2dEZXNjcmlwdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21taXRsb2cvQ29tbWl0TG9nRGVzY3JpcHRvci5qYXZhCmluZGV4IGVkMmFmMWIuLjRkOTFmNTEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2dEZXNjcmlwdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0NvbW1pdExvZ0Rlc2NyaXB0b3IuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUlucHV0U3RyZWFtUGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZWN1cml0eS5FbmNyeXB0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTlZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpzb25VdGlsczsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllcy51cGRhdGVDaGVja3N1bUludDsKIApAQCAtMTI4LDcgKzEyOCw3IEBACiAgICAgICAgIGlmIChlbmNyeXB0aW9uQ29udGV4dCAhPSBudWxsKQogICAgICAgICAgICAgcGFyYW1zLnB1dEFsbChlbmNyeXB0aW9uQ29udGV4dC50b0hlYWRlclBhcmFtZXRlcnMoKSk7CiAgICAgICAgIHBhcmFtcy5wdXRBbGwoYWRkaXRpb25hbEhlYWRlcnMpOwotICAgICAgICByZXR1cm4gSlNPTlZhbHVlLnRvSlNPTlN0cmluZyhwYXJhbXMpOworICAgICAgICByZXR1cm4gSnNvblV0aWxzLndyaXRlQXNKc29uU3RyaW5nKHBhcmFtcyk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBDb21taXRMb2dEZXNjcmlwdG9yIGZyb21IZWFkZXIoRmlsZSBmaWxlLCBFbmNyeXB0aW9uQ29udGV4dCBlbmNyeXB0aW9uQ29udGV4dCkKQEAgLTE2OSw3ICsxNjksNyBAQAogCiAgICAgICAgIGlmIChjcmMgPT0gKGludCkgY2hlY2tjcmMuZ2V0VmFsdWUoKSkKICAgICAgICAgewotICAgICAgICAgICAgTWFwPD8sID8+IG1hcCA9IChNYXA8PywgPz4pIEpTT05WYWx1ZS5wYXJzZShuZXcgU3RyaW5nKHBhcmFtZXRlcnNCeXRlcywgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworICAgICAgICAgICAgTWFwPD8sID8+IG1hcCA9IChNYXA8PywgPz4pIEpzb25VdGlscy5kZWNvZGVKc29uKHBhcmFtZXRlcnNCeXRlcyk7CiAgICAgICAgICAgICByZXR1cm4gbmV3IENvbW1pdExvZ0Rlc2NyaXB0b3IodmVyc2lvbiwgaWQsIHBhcnNlQ29tcHJlc3Npb24obWFwKSwgRW5jcnlwdGlvbkNvbnRleHQuY3JlYXRlRnJvbU1hcChtYXAsIGVuY3J5cHRpb25Db250ZXh0KSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21taXRsb2cvQ29tbWl0TG9nTUJlYW4uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2dNQmVhbi5qYXZhCmluZGV4IDdlOGRlY2EuLjE4OTkxNmMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2dNQmVhbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2dNQmVhbi5qYXZhCkBAIC04OCw0ICs4OCwxMCBAQAogICAgIHB1YmxpYyBib29sZWFuIGdldENEQ0Jsb2NrV3JpdGVzKCk7CiAKICAgICBwdWJsaWMgdm9pZCBzZXRDRENCbG9ja1dyaXRlcyhib29sZWFuIHZhbCk7CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIGludGVybm9kZXMgc3RyZWFtaW5nIG9mIENEQyBkYXRhIHNob3VsZCBnbyB0aHJvdWdoIHdyaXRlIHBhdGggKi8KKyAgICBib29sZWFuIGlzQ0RDT25SZXBhaXJFbmFibGVkKCk7CisKKyAgICAvKiogU2V0IHdoZXRoZXIgZW5hYmxlIHdyaXRlIHBhdGggZm9yIENEQyBkYXRhIGR1cmluZyBpbnRlcm5vZGVzIHN0cmVhbWluZywgZS5nLiByZXBhaXIgKi8KKyAgICB2b2lkIHNldENEQ09uUmVwYWlyRW5hYmxlZChib29sZWFuIHZhbHVlKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2dSZXBsYXllci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0NvbW1pdExvZ1JlcGxheWVyLmphdmEKaW5kZXggNzRhYTY3ZC4uYTUwMjczYyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0NvbW1pdExvZ1JlcGxheWVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0NvbW1pdExvZ1JlcGxheWVyLmphdmEKQEAgLTM4LDcgKzM4LDYgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuU3RhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwpAQCAtNTUsMTUgKzU0LDIwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuV3JhcHBlZFJ1bm5hYmxlOwogCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNPTU1JVExPR19JR05PUkVfUkVQTEFZX0VSUk9SUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DT01NSVRMT0dfTUFYX09VVFNUQU5ESU5HX1JFUExBWV9CWVRFUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DT01NSVRMT0dfTUFYX09VVFNUQU5ESU5HX1JFUExBWV9DT1VOVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DT01NSVRfTE9HX1JFUExBWV9MSVNUOworCiBwdWJsaWMgY2xhc3MgQ29tbWl0TG9nUmVwbGF5ZXIgaW1wbGVtZW50cyBDb21taXRMb2dSZWFkSGFuZGxlcgogewogICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBNQVhfT1VUU1RBTkRJTkdfUkVQTEFZX0JZVEVTID0gTG9uZy5nZXRMb25nKCJjYXNzYW5kcmEuY29tbWl0bG9nX21heF9vdXRzdGFuZGluZ19yZXBsYXlfYnl0ZXMiLCAxMDI0ICogMTAyNCAqIDY0KTsKKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgTUFYX09VVFNUQU5ESU5HX1JFUExBWV9CWVRFUyA9IENPTU1JVExPR19NQVhfT1VUU1RBTkRJTkdfUkVQTEFZX0JZVEVTLmdldExvbmcoKTsKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBwdWJsaWMgc3RhdGljIE11dGF0aW9uSW5pdGlhdG9yIG11dGF0aW9uSW5pdGlhdG9yID0gbmV3IE11dGF0aW9uSW5pdGlhdG9yKCk7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBJR05PUkVfUkVQTEFZX0VSUk9SU19QUk9QRVJUWSA9IENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAiY29tbWl0bG9nLmlnbm9yZXJlcGxheWVycm9ycyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbW1pdExvZ1JlcGxheWVyLmNsYXNzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX09VVFNUQU5ESU5HX1JFUExBWV9DT1VOVCA9IEludGVnZXIuZ2V0SW50ZWdlcihDb25maWcuUFJPUEVSVFlfUFJFRklYICsgImNvbW1pdGxvZ19tYXhfb3V0c3RhbmRpbmdfcmVwbGF5X2NvdW50IiwgMTAyNCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9PVVRTVEFORElOR19SRVBMQVlfQ09VTlQgPSBDT01NSVRMT0dfTUFYX09VVFNUQU5ESU5HX1JFUExBWV9DT1VOVC5nZXRJbnQoKTsKIAogICAgIHByaXZhdGUgZmluYWwgU2V0PEtleXNwYWNlPiBrZXlzcGFjZXNSZXBsYXllZDsKICAgICBwcml2YXRlIGZpbmFsIFF1ZXVlPEZ1dHVyZTxJbnRlZ2VyPj4gZnV0dXJlczsKQEAgLTM3MywyOCArMzc3LDYwIEBACiAKICAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaW5jbHVkZXMoVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YSk7CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgZmlsdGVyIGZvciBlbnRpdGllcyB0byByZXBsYXkgbXV0YXRpb25zIGZvciB1cG9uIGNvbW1pdCBsb2cgcmVwbGF5LgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMjQ09NTUlUX0xPR19SRVBMQVlfTElTVAorICAgICAgICAgKiAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIFJlcGxheUZpbHRlciBjcmVhdGUoKQogICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZiBubyByZXBsYXlsaXN0IGlzIHN1cHBsaWVkIGFuIGVtcHR5IGFycmF5IG9mIHN0cmluZ3MgaXMgdXNlZCB0byByZXBsYXkgZXZlcnl0aGluZy4KLSAgICAgICAgICAgIGlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5yZXBsYXlMaXN0IikgPT0gbnVsbCkKKyAgICAgICAgICAgIFN0cmluZyByZXBsYXlMaXN0ID0gQ09NTUlUX0xPR19SRVBMQVlfTElTVC5nZXRTdHJpbmcoKTsKKworICAgICAgICAgICAgaWYgKHJlcGxheUxpc3QgPT0gbnVsbCkKICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFsd2F5c1JlcGxheUZpbHRlcigpOwogCiAgICAgICAgICAgICBNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gdG9SZXBsYXkgPSBIYXNoTXVsdGltYXAuY3JlYXRlKCk7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyByYXdQYWlyIDogU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEucmVwbGF5TGlzdCIpLnNwbGl0KCIsIikpCisgICAgICAgICAgICBmb3IgKFN0cmluZyByYXdQYWlyIDogcmVwbGF5TGlzdC5zcGxpdCgiLCIpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhaXIgPSBTdHJpbmdVdGlscy5zcGxpdChyYXdQYWlyLnRyaW0oKSwgJy4nKTsKLSAgICAgICAgICAgICAgICBpZiAocGFpci5sZW5ndGggIT0gMikKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRWFjaCB0YWJsZSB0byBiZSByZXBsYXllZCBtdXN0IGJlIGZ1bGx5IHF1YWxpZmllZCB3aXRoIGtleXNwYWNlIG5hbWUsIGUuZy4sICdzeXN0ZW0ucGVlcnMnIik7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRyaW1tZWRSYXdQYWlyID0gcmF3UGFpci50cmltKCk7CisgICAgICAgICAgICAgICAgaWYgKHRyaW1tZWRSYXdQYWlyLmlzRW1wdHkoKSB8fCB0cmltbWVkUmF3UGFpci5lbmRzV2l0aCgiLiIpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGZvcm1hdCgiSW52YWxpZCBwYWlyOiAnJXMnIiwgdHJpbW1lZFJhd1BhaXIpKTsKIAotICAgICAgICAgICAgICAgIEtleXNwYWNlIGtzID0gU2NoZW1hLmluc3RhbmNlLmdldEtleXNwYWNlSW5zdGFuY2UocGFpclswXSk7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gcGFpciA9IFN0cmluZ1V0aWxzLnNwbGl0KHRyaW1tZWRSYXdQYWlyLCAnLicpOworCisgICAgICAgICAgICAgICAgaWYgKHBhaXIubGVuZ3RoID4gMikKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihmb3JtYXQoIiVzIHByb3BlcnR5IGNvbnRhaW5zIGFuIGl0ZW0gd2hpY2ggIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpcyBub3QgaW4gZm9ybWF0ICdrZXlzcGFjZScgb3IgJ2tleXNwYWNlLnRhYmxlJyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBpdCBpcyAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUlUX0xPR19SRVBMQVlfTElTVC5nZXRLZXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmpvaW4oIi4iLCBwYWlyKSkpOworCisgICAgICAgICAgICAgICAgU3RyaW5nIGtleXNwYWNlTmFtZSA9IHBhaXJbMF07CisKKyAgICAgICAgICAgICAgICBLZXlzcGFjZSBrcyA9IFNjaGVtYS5pbnN0YW5jZS5nZXRLZXlzcGFjZUluc3RhbmNlKGtleXNwYWNlTmFtZSk7CiAgICAgICAgICAgICAgICAgaWYgKGtzID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24ga2V5c3BhY2UgIiArIHBhaXJbMF0pOwotICAgICAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtzLmdldENvbHVtbkZhbWlseVN0b3JlKHBhaXJbMV0pOwotICAgICAgICAgICAgICAgIGlmIChjZnMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJVbmtub3duIHRhYmxlICVzLiVzIiwgcGFpclswXSwgcGFpclsxXSkpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGtleXNwYWNlICIgKyBrZXlzcGFjZU5hbWUpOwogCi0gICAgICAgICAgICAgICAgdG9SZXBsYXkucHV0KHBhaXJbMF0sIHBhaXJbMV0pOworICAgICAgICAgICAgICAgIGlmIChwYWlyLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChDb2x1bW5GYW1pbHlTdG9yZSBjZnMgOiBrcy5nZXRDb2x1bW5GYW1pbHlTdG9yZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvUmVwbGF5LnB1dChrZXlzcGFjZU5hbWUsIGNmcy5uYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga3MuZ2V0Q29sdW1uRmFtaWx5U3RvcmUocGFpclsxXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjZnMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZm9ybWF0KCJVbmtub3duIHRhYmxlICVzLiVzIiwga2V5c3BhY2VOYW1lLCBwYWlyWzFdKSk7CisKKyAgICAgICAgICAgICAgICAgICAgdG9SZXBsYXkucHV0KGtleXNwYWNlTmFtZSwgcGFpclsxXSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodG9SZXBsYXkuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJBbGwgdGFibGVzIHdpbGwgYmUgaW5jbHVkZWQgaW4gY29tbWl0IGxvZyByZXBsYXkuIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlRhYmxlcyB0byBiZSByZXBsYXllZDoge30iLCB0b1JlcGxheS5hc01hcCgpLnRvU3RyaW5nKCkpOworCiAgICAgICAgICAgICByZXR1cm4gbmV3IEN1c3RvbVJlcGxheUZpbHRlcih0b1JlcGxheSk7CiAgICAgICAgIH0KICAgICB9CkBAIC00OTAsMTMgKzUyNiwxMyBAQAogICAgIHsKICAgICAgICAgaWYgKGV4Y2VwdGlvbi5wZXJtaXNzaWJsZSkKICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiSWdub3JpbmcgY29tbWl0IGxvZyByZXBsYXkgZXJyb3IgbGlrZWx5IGR1ZSB0byBpbmNvbXBsZXRlIGZsdXNoIHRvIGRpc2siLCBleGNlcHRpb24pOwotICAgICAgICBlbHNlIGlmIChCb29sZWFuLmdldEJvb2xlYW4oSUdOT1JFX1JFUExBWV9FUlJPUlNfUFJPUEVSVFkpKQorICAgICAgICBlbHNlIGlmIChDT01NSVRMT0dfSUdOT1JFX1JFUExBWV9FUlJPUlMuZ2V0Qm9vbGVhbigpKQogICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJJZ25vcmluZyBjb21taXQgbG9nIHJlcGxheSBlcnJvciIsIGV4Y2VwdGlvbik7CiAgICAgICAgIGVsc2UgaWYgKCFDb21taXRMb2cuaGFuZGxlQ29tbWl0RXJyb3IoIkZhaWxlZCBjb21taXQgbG9nIHJlcGxheSIsIGV4Y2VwdGlvbikpCiAgICAgICAgIHsKICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiUmVwbGF5IHN0b3BwZWQuIElmIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgZXJyb3IgYW5kIGNvbnRpbnVlIHN0YXJ0aW5nIHRoZSBub2RlIGlnbm9yaW5nICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICJjb21taXQgbG9nIHJlcGxheSBwcm9ibGVtcywgc3BlY2lmeSAtRCIgKyBJR05PUkVfUkVQTEFZX0VSUk9SU19QUk9QRVJUWSArICI9dHJ1ZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAib24gdGhlIGNvbW1hbmQgbGluZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICJjb21taXQgbG9nIHJlcGxheSBwcm9ibGVtcywgc3BlY2lmeSAtRHt9PXRydWUgb24gdGhlIGNvbW1hbmQgbGluZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUlUTE9HX0lHTk9SRV9SRVBMQVlfRVJST1JTLmdldEtleSgpKTsKICAgICAgICAgICAgIHRocm93IG5ldyBDb21taXRMb2dSZXBsYXlFeGNlcHRpb24oZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21taXRsb2cvQ29tbWl0TG9nU2VnbWVudFJlYWRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0NvbW1pdExvZ1NlZ21lbnRSZWFkZXIuamF2YQppbmRleCAzM2U3MGMxLi45NjRmZTQ5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21taXRsb2cvQ29tbWl0TG9nU2VnbWVudFJlYWRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2dTZWdtZW50UmVhZGVyLmphdmEKQEAgLTI5LDcgKzI5LDYgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuRW5jcnlwdGVkRmlsZVNlZ21lbnRJbnB1dFN0cmVhbS5DaHVua1Byb3ZpZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZy5Db21taXRMb2dSZWFkSGFuZGxlci4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTUmVhZEVycm9yOwpAQCAtNDIsNiArNDEsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5LkVuY3J5cHRpb25Db250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09NTUlUTE9HX0FMTE9XX0lHTk9SRV9TWU5DX0NSQzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZ1NlZ21lbnQuU1lOQ19NQVJLRVJfU0laRTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXMudXBkYXRlQ2hlY2tzdW1JbnQ7CiAKQEAgLTUwLDggKzUwLDcgQEAKICAqLwogcHVibGljIGNsYXNzIENvbW1pdExvZ1NlZ21lbnRSZWFkZXIgaW1wbGVtZW50cyBJdGVyYWJsZTxDb21taXRMb2dTZWdtZW50UmVhZGVyLlN5bmNTZWdtZW50PgogewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTE9XX0lHTk9SRV9TWU5DX0NSQyA9IENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAiY29tbWl0bG9nLmFsbG93X2lnbm9yZV9zeW5jX2NyYyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBhbGxvd1NraXBTeW5jTWFya2VyQ3JjID0gQm9vbGVhbi5nZXRCb29sZWFuKEFMTE9XX0lHTk9SRV9TWU5DX0NSQyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBhbGxvd1NraXBTeW5jTWFya2VyQ3JjID0gQ09NTUlUTE9HX0FMTE9XX0lHTk9SRV9TWU5DX0NSQy5nZXRCb29sZWFuKCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ29tbWl0TG9nU2VnbWVudFJlYWRlci5jbGFzcyk7CiAgICAgCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0Fic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0Fic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5LmphdmEKaW5kZXggNWZlMWRmNy4uMmViMTE5ZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9BYnN0cmFjdENvbXBhY3Rpb25TdHJhdGVneS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQWJzdHJhY3RDb21wYWN0aW9uU3RyYXRlZ3kuamF2YQpAQCAtMTcsMzQgKzE3LDM5IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbjsKIAotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5JbmRleDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlTmV3VHJhY2tlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlTXVsdGlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TaW1wbGVTU1RhYmxlTXVsdGlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlTmV3VHJhY2tlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguSW5kZXg7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVNTVGFibGVTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZU11bHRpV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2ltcGxlU1NUYWJsZU11bHRpV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbGxlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLlN0YXRzTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbXBhY3Rpb25QYXJhbXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQuREFUQTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLmN1cnJlbnRUaW1lTWlsbGlzOwogCiAvKioKQEAgLTIwNyw2ICsyMTIsMTQgQEAKICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzKCk7CiAKICAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBlc3RpbWF0ZWQgbnVtYmVyIG9mIGJhY2tncm91bmQgdGFza3MgbmVlZGVkLCBhc3N1bWluZyBhbiBhZGRpdGlvbmFsIG51bWJlciBvZiBTU1RhYmxlcworICAgICAqLworICAgIGludCBnZXRFc3RpbWF0ZWRSZW1haW5pbmdUYXNrcyhpbnQgYWRkaXRpb25hbFNTVGFibGVzLCBsb25nIGFkZGl0aW9uYWxCeXRlcykKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRFc3RpbWF0ZWRSZW1haW5pbmdUYXNrcygpICsgKGludClNYXRoLmNlaWwoKGRvdWJsZSlhZGRpdGlvbmFsU1NUYWJsZXMgLyBjZnMuZ2V0TWF4aW11bUNvbXBhY3Rpb25UaHJlc2hvbGQoKSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQHJldHVybiBzaXplIGluIGJ5dGVzIG9mIHRoZSBsYXJnZXN0IHNzdGFibGVzIGZvciB0aGlzIHN0cmF0ZWd5CiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0TWF4U1NUYWJsZUJ5dGVzKCk7CkBAIC0zODYsMTIgKzM5OSwxMiBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIHdvcnRoRHJvcHBpbmdUb21ic3RvbmVzKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgaW50IGdjQmVmb3JlKQogICAgIHsKLSAgICAgICAgaWYgKGRpc2FibGVUb21ic3RvbmVDb21wYWN0aW9ucyB8fCBDb21wYWN0aW9uQ29udHJvbGxlci5ORVZFUl9QVVJHRV9UT01CU1RPTkVTIHx8IGNmcy5nZXROZXZlclB1cmdlVG9tYnN0b25lcygpKQorICAgICAgICBpZiAoZGlzYWJsZVRvbWJzdG9uZUNvbXBhY3Rpb25zIHx8IENvbXBhY3Rpb25Db250cm9sbGVyLk5FVkVSX1BVUkdFX1RPTUJTVE9ORVNfUFJPUEVSVFlfVkFMVUUgfHwgY2ZzLmdldE5ldmVyUHVyZ2VUb21ic3RvbmVzKCkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIC8vIHNpbmNlIHdlIHVzZSBlc3RpbWF0aW9ucyB0byBjYWxjdWxhdGUsIHRoZXJlIGlzIGEgY2hhbmNlIHRoYXQgY29tcGFjdGlvbiB3aWxsIG5vdCBkcm9wIHRvbWJzdG9uZXMgYWN0dWFsbHkuCiAgICAgICAgIC8vIGlmIHRoYXQgaGFwcGVucyB3ZSB3aWxsIGVuZCB1cCBpbiBpbmZpbml0ZSBjb21wYWN0aW9uIGxvb3AsIHNvIGZpcnN0IHdlIGNoZWNrIGVub3VnaCBpZiBlbm91Z2ggdGltZSBoYXMKICAgICAgICAgLy8gZWxhcHNlZCBzaW5jZSBTU1RhYmxlIGNyZWF0ZWQuCi0gICAgICAgIGlmIChjdXJyZW50VGltZU1pbGxpcygpIDwgc3N0YWJsZS5nZXRDcmVhdGlvblRpbWVGb3IoREFUQSkgKyB0b21ic3RvbmVDb21wYWN0aW9uSW50ZXJ2YWwgKiAxMDAwKQorICAgICAgICBpZiAoY3VycmVudFRpbWVNaWxsaXMoKSA8IHNzdGFibGUuZ2V0RGF0YUNyZWF0aW9uVGltZSgpICsgdG9tYnN0b25lQ29tcGFjdGlvbkludGVydmFsICogMTAwMCkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGRvdWJsZSBkcm9wcGFibGVSYXRpbyA9IHNzdGFibGUuZ2V0RXN0aW1hdGVkRHJvcHBhYmxlVG9tYnN0b25lUmF0aW8oZ2NCZWZvcmUpOwpAQCAtNDE1LDE2ICs0MjgsMTYgQEAKICAgICAgICAgZWxzZQogICAgICAgICB7CiAgICAgICAgICAgICAvLyB3aGF0IHBlcmNlbnRhZ2Ugb2YgY29sdW1ucyBkbyB3ZSBleHBlY3QgdG8gY29tcGFjdCBvdXRzaWRlIG9mIG92ZXJsYXA/Ci0gICAgICAgICAgICBpZiAoc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTaXplKCkgPCAyKQorICAgICAgICAgICAgaWYgKCFzc3RhYmxlLmlzRXN0aW1hdGlvbkluZm9ybWF0aXZlKCkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0b28gZmV3IHNhbXBsZXMgdG8gZXN0aW1hdGUgY29ycmVjdCBwZXJjZW50YWdlCiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gZmlyc3QsIGNhbGN1bGF0ZSBlc3RpbWF0ZWQga2V5cyB0aGF0IGRvIG5vdCBvdmVybGFwCiAgICAgICAgICAgICBsb25nIGtleXMgPSBzc3RhYmxlLmVzdGltYXRlZEtleXMoKTsKLSAgICAgICAgICAgIFNldDxSYW5nZTxUb2tlbj4+IHJhbmdlcyA9IG5ldyBIYXNoU2V0PFJhbmdlPFRva2VuPj4ob3ZlcmxhcHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIFNldDxSYW5nZTxUb2tlbj4+IHJhbmdlcyA9IG5ldyBIYXNoU2V0PD4ob3ZlcmxhcHMuc2l6ZSgpKTsKICAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBvdmVybGFwIDogb3ZlcmxhcHMpCi0gICAgICAgICAgICAgICAgcmFuZ2VzLmFkZChuZXcgUmFuZ2U8PihvdmVybGFwLmZpcnN0LmdldFRva2VuKCksIG92ZXJsYXAubGFzdC5nZXRUb2tlbigpKSk7CisgICAgICAgICAgICAgICAgcmFuZ2VzLmFkZChuZXcgUmFuZ2U8PihvdmVybGFwLmdldEZpcnN0KCkuZ2V0VG9rZW4oKSwgb3ZlcmxhcC5nZXRMYXN0KCkuZ2V0VG9rZW4oKSkpOwogICAgICAgICAgICAgbG9uZyByZW1haW5pbmdLZXlzID0ga2V5cyAtIHNzdGFibGUuZXN0aW1hdGVkS2V5c0ZvclJhbmdlcyhyYW5nZXMpOwogICAgICAgICAgICAgLy8gbmV4dCwgY2FsY3VsYXRlIHdoYXQgcGVyY2VudGFnZSBvZiBjb2x1bW5zIHdlIGhhdmUgd2l0aGluIHRob3NlIGtleXMKICAgICAgICAgICAgIGxvbmcgY29sdW1ucyA9IHNzdGFibGUuZ2V0RXN0aW1hdGVkQ2VsbFBlclBhcnRpdGlvbkNvdW50KCkubWVhbigpICogcmVtYWluaW5nS2V5czsKQEAgLTU1Miw3ICs1NjUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248SW5kZXg+IGluZGV4ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlmZWN5Y2xlTmV3VHJhY2tlciBsaWZlY3ljbGVOZXdUcmFja2VyKQogICAgIHsKLSAgICAgICAgcmV0dXJuIFNpbXBsZVNTVGFibGVNdWx0aVdyaXRlci5jcmVhdGUoZGVzY3JpcHRvciwga2V5Q291bnQsIHJlcGFpcmVkQXQsIHBlbmRpbmdSZXBhaXIsIGlzVHJhbnNpZW50LCBjZnMubWV0YWRhdGEsIG1ldGEsIGhlYWRlciwgaW5kZXhlcywgbGlmZWN5Y2xlTmV3VHJhY2tlcik7CisgICAgICAgIHJldHVybiBTaW1wbGVTU1RhYmxlTXVsdGlXcml0ZXIuY3JlYXRlKGRlc2NyaXB0b3IsIGtleUNvdW50LCByZXBhaXJlZEF0LCBwZW5kaW5nUmVwYWlyLCBpc1RyYW5zaWVudCwgY2ZzLm1ldGFkYXRhLCBtZXRhLCBoZWFkZXIsIGluZGV4ZXMsIGxpZmVjeWNsZU5ld1RyYWNrZXIsIGNmcyk7CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNFYXJseU9wZW4oKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9BYnN0cmFjdFN0cmF0ZWd5SG9sZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0Fic3RyYWN0U3RyYXRlZ3lIb2xkZXIuamF2YQppbmRleCBkZTZmZjcxLi4zNDIxMTIzIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0Fic3RyYWN0U3RyYXRlZ3lIb2xkZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0Fic3RyYWN0U3RyYXRlZ3lIb2xkZXIuamF2YQpAQCAtMjA2LDQgKzIwNiw2IEBACiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRTdHJhdGVneUluZGV4KEFic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5IHN0cmF0ZWd5KTsKIAogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNvbnRhaW5zU1NUYWJsZShTU1RhYmxlUmVhZGVyIHNzdGFibGUpOworCisgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRFc3RpbWF0ZWRSZW1haW5pbmdUYXNrcygpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9BY3RpdmVDb21wYWN0aW9ucy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9BY3RpdmVDb21wYWN0aW9ucy5qYXZhCmluZGV4IDdiNmI1YmYuLjRlMjM4YWQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQWN0aXZlQ29tcGFjdGlvbnMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0FjdGl2ZUNvbXBhY3Rpb25zLmphdmEKQEAgLTIxLDExICsyMSwxNCBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiAKIHB1YmxpYyBjbGFzcyBBY3RpdmVDb21wYWN0aW9ucyBpbXBsZW1lbnRzIEFjdGl2ZUNvbXBhY3Rpb25zVHJhY2tlcgogewpAQCAtNTAsNiArNTMsMjggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBHZXQgdGhlIGVzdGltYXRlZCBudW1iZXIgb2YgYnl0ZXMgcmVtYWluaW5nIHRvIHdyaXRlIHBlciBzc3RhYmxlIGRpcmVjdG9yeQorICAgICAqLworICAgIHB1YmxpYyBNYXA8RmlsZSwgTG9uZz4gZXN0aW1hdGVkUmVtYWluaW5nV3JpdGVCeXRlcygpCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKGNvbXBhY3Rpb25zKQorICAgICAgICB7CisgICAgICAgICAgICBNYXA8RmlsZSwgTG9uZz4gd3JpdGVCeXRlc1BlclNTVGFibGVEaXIgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICBmb3IgKENvbXBhY3Rpb25JbmZvLkhvbGRlciBob2xkZXIgOiBjb21wYWN0aW9ucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb21wYWN0aW9uSW5mbyBjb21wYWN0aW9uSW5mbyA9IGhvbGRlci5nZXRDb21wYWN0aW9uSW5mbygpOworICAgICAgICAgICAgICAgIExpc3Q8RmlsZT4gZGlyZWN0b3JpZXMgPSBjb21wYWN0aW9uSW5mby5nZXRUYXJnZXREaXJlY3RvcmllcygpOworICAgICAgICAgICAgICAgIGlmIChkaXJlY3RvcmllcyA9PSBudWxsIHx8IGRpcmVjdG9yaWVzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgbG9uZyByZW1haW5pbmdXcml0ZUJ5dGVzUGVyRGF0YURpciA9IGNvbXBhY3Rpb25JbmZvLmVzdGltYXRlZFJlbWFpbmluZ1dyaXRlQnl0ZXMoKSAvIGRpcmVjdG9yaWVzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKEZpbGUgZGlyZWN0b3J5IDogZGlyZWN0b3JpZXMpCisgICAgICAgICAgICAgICAgICAgIHdyaXRlQnl0ZXNQZXJTU1RhYmxlRGlyLm1lcmdlKGRpcmVjdG9yeSwgcmVtYWluaW5nV3JpdGVCeXRlc1BlckRhdGFEaXIsIExvbmc6OnN1bSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gd3JpdGVCeXRlc1BlclNTVGFibGVEaXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBJdGVyYXRlcyBvdmVyIHRoZSBhY3RpdmUgY29tcGFjdGlvbnMgYW5kIHRyaWVzIHRvIGZpbmQgQ29tcGFjdGlvbkluZm9zIHdpdGggdGhlIGdpdmVuIGNvbXBhY3Rpb25UeXBlIGZvciB0aGUgZ2l2ZW4gc3N0YWJsZQogICAgICAqCiAgICAgICogTnVtYmVyIG9mIGVudHJpZXMgaW4gY29tcGFjdGlvbnMgc2hvdWxkIGJlIHNtYWxsICg8IDEwKSBidXQgYXZvaWQgY2FsbGluZyBpbiBhbnkgdGltZS1zZW5zaXRpdmUgY29udGV4dApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uQ29udHJvbGxlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uQ29udHJvbGxlci5qYXZhCmluZGV4IDY0ODA2MzEuLjExMTdhNWQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbkNvbnRyb2xsZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25Db250cm9sbGVyLmphdmEKQEAgLTE3LDcgKzE3LDE0IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbjsKIAotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkxvbmdQcmVkaWNhdGU7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZXM7CkBAIC0yNiw4ICszMywxMCBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQWJzdHJhY3RDb21wYWN0aW9uQ29udHJvbGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUGFydGl0aW9uUG9zaXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuTWVtdGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKQEAgLTM3LDYgKzQ2LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PdmVybGFwSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWZzOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTkVWRVJfUFVSR0VfVE9NQlNUT05FUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLlNTVGFibGVJbnRlcnZhbFRyZWUuYnVpbGRJbnRlcnZhbHM7CiAKIC8qKgpAQCAtNDUsOCArNTUsNyBAQAogcHVibGljIGNsYXNzIENvbXBhY3Rpb25Db250cm9sbGVyIGV4dGVuZHMgQWJzdHJhY3RDb21wYWN0aW9uQ29udHJvbGxlcgogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDb21wYWN0aW9uQ29udHJvbGxlci5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVkVSX1BVUkdFX1RPTUJTVE9ORVNfUFJPUEVSVFkgPSBDb25maWcuUFJPUEVSVFlfUFJFRklYICsgIm5ldmVyX3B1cmdlX3RvbWJzdG9uZXMiOwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIE5FVkVSX1BVUkdFX1RPTUJTVE9ORVMgPSBCb29sZWFuLmdldEJvb2xlYW4oTkVWRVJfUFVSR0VfVE9NQlNUT05FU19QUk9QRVJUWSk7CisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gTkVWRVJfUFVSR0VfVE9NQlNUT05FU19QUk9QRVJUWV9WQUxVRSA9IE5FVkVSX1BVUkdFX1RPTUJTVE9ORVMuZ2V0Qm9vbGVhbigpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGNvbXBhY3RpbmdSZXBhaXJlZDsKICAgICAvLyBub3RlIHRoYXQgb3ZlcmxhcEl0ZXJhdG9yIGFuZCBvdmVybGFwcGluZ1NTVGFibGVzIHdpbGwgYmUgbnVsbCBpZiBORVZFUl9QVVJHRV9UT01CU1RPTkVTIGlzIHNldCAtIHRoaXMgaXMgYQpAQCAtODAsMTYgKzg5LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY29tcGFjdGluZy5zdHJlYW0oKS5tYXBUb0xvbmcoU1NUYWJsZVJlYWRlcjo6Z2V0TWluVGltZXN0YW1wKS5taW4oKS5nZXRBc0xvbmcoKQogICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7CiAgICAgICAgIHJlZnJlc2hPdmVybGFwcygpOwotICAgICAgICBpZiAoTkVWRVJfUFVSR0VfVE9NQlNUT05FUykKLSAgICAgICAgICAgIGxvZ2dlci53YXJuKCJZb3UgYXJlIHJ1bm5pbmcgd2l0aCAtRGNhc3NhbmRyYS5uZXZlcl9wdXJnZV90b21ic3RvbmVzPXRydWUsIHRoaXMgaXMgZGFuZ2Vyb3VzISIpOworICAgICAgICBpZiAoTkVWRVJfUFVSR0VfVE9NQlNUT05FU19QUk9QRVJUWV9WQUxVRSkKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCJZb3UgYXJlIHJ1bm5pbmcgd2l0aCAtRHt9PXRydWUsIHRoaXMgaXMgZGFuZ2Vyb3VzISIsIE5FVkVSX1BVUkdFX1RPTUJTVE9ORVMuZ2V0S2V5KCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIG1heWJlUmVmcmVzaE92ZXJsYXBzKCkKICAgICB7Ci0gICAgICAgIGlmIChORVZFUl9QVVJHRV9UT01CU1RPTkVTKQorICAgICAgICBpZiAoTkVWRVJfUFVSR0VfVE9NQlNUT05FU19QUk9QRVJUWV9WQUxVRSkKICAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJub3QgcmVmcmVzaGluZyBvdmVybGFwcyAtIHJ1bm5pbmcgd2l0aCAtRHt9PXRydWUiLAotICAgICAgICAgICAgICAgICAgICBORVZFUl9QVVJHRV9UT01CU1RPTkVTX1BST1BFUlRZKTsKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1Zygibm90IHJlZnJlc2hpbmcgb3ZlcmxhcHMgLSBydW5uaW5nIHdpdGggLUR7fT10cnVlIiwgTkVWRVJfUFVSR0VfVE9NQlNUT05FUy5nZXRLZXkoKSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMTA1LDE5ICsxMTMsMTMgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciByZWFkZXIgOiBvdmVybGFwcGluZ1NTVGFibGVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocmVhZGVyLmlzTWFya2VkQ29tcGFjdGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVmcmVzaE92ZXJsYXBzKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGlmIChvdmVybGFwcGluZ1NTVGFibGVzID09IG51bGwgfHwgb3ZlcmxhcHBpbmdTU1RhYmxlcy5zdHJlYW0oKS5hbnlNYXRjaChTU1RhYmxlUmVhZGVyOjppc01hcmtlZENvbXBhY3RlZCkpCisgICAgICAgICAgICByZWZyZXNoT3ZlcmxhcHMoKTsKICAgICB9CiAKICAgICB2b2lkIHJlZnJlc2hPdmVybGFwcygpCiAgICAgewotICAgICAgICBpZiAoTkVWRVJfUFVSR0VfVE9NQlNUT05FUyB8fCBjZnMuZ2V0TmV2ZXJQdXJnZVRvbWJzdG9uZXMoKSkKKyAgICAgICAgaWYgKE5FVkVSX1BVUkdFX1RPTUJTVE9ORVNfUFJPUEVSVFlfVkFMVUUgfHwgY2ZzLmdldE5ldmVyUHVyZ2VUb21ic3RvbmVzKCkpCiAgICAgICAgICAgICByZXR1cm47CiAKICAgICAgICAgaWYgKHRoaXMub3ZlcmxhcHBpbmdTU1RhYmxlcyAhPSBudWxsKQpAQCAtMTYwLDggKzE2Miw4IEBACiAgICAgewogICAgICAgICBsb2dnZXIudHJhY2UoIkNoZWNraW5nIGRyb3BwYWJsZSBzc3RhYmxlcyBpbiB7fSIsIGNmU3RvcmUpOwogCi0gICAgICAgIGlmIChORVZFUl9QVVJHRV9UT01CU1RPTkVTIHx8IGNvbXBhY3RpbmcgPT0gbnVsbCB8fCBjZlN0b3JlLmdldE5ldmVyUHVyZ2VUb21ic3RvbmVzKCkpCi0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuPFNTVGFibGVSZWFkZXI+ZW1wdHlTZXQoKTsKKyAgICAgICAgaWYgKE5FVkVSX1BVUkdFX1RPTUJTVE9ORVNfUFJPUEVSVFlfVkFMVUUgfHwgY29tcGFjdGluZyA9PSBudWxsIHx8IGNmU3RvcmUuZ2V0TmV2ZXJQdXJnZVRvbWJzdG9uZXMoKSB8fCBvdmVybGFwcGluZyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CiAKICAgICAgICAgaWYgKGNmU3RvcmUuZ2V0Q29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlcigpLm9ubHlQdXJnZVJlcGFpcmVkVG9tYnN0b25lcygpICYmICFJdGVyYWJsZXMuYWxsKGNvbXBhY3RpbmcsIFNTVGFibGVSZWFkZXI6OmlzUmVwYWlyZWQpKQogICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CkBAIC0yNDYsNyArMjQ4LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTG9uZ1ByZWRpY2F0ZSBnZXRQdXJnZUV2YWx1YXRvcihEZWNvcmF0ZWRLZXkga2V5KQogICAgIHsKLSAgICAgICAgaWYgKE5FVkVSX1BVUkdFX1RPTUJTVE9ORVMgfHwgIWNvbXBhY3RpbmdSZXBhaXJlZCgpIHx8IGNmcy5nZXROZXZlclB1cmdlVG9tYnN0b25lcygpKQorICAgICAgICBpZiAoTkVWRVJfUFVSR0VfVE9NQlNUT05FU19QUk9QRVJUWV9WQUxVRSB8fCAhY29tcGFjdGluZ1JlcGFpcmVkKCkgfHwgY2ZzLmdldE5ldmVyUHVyZ2VUb21ic3RvbmVzKCkgfHwgb3ZlcmxhcEl0ZXJhdG9yID09IG51bGwpCiAgICAgICAgICAgICByZXR1cm4gdGltZSAtPiBmYWxzZTsKIAogICAgICAgICBvdmVybGFwSXRlcmF0b3IudXBkYXRlKGtleSk7CkBAIC0yNTcsNyArMjU5LDcgQEAKIAogICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZTogZmlsdGVyZWRTU1RhYmxlcykKICAgICAgICAgewotICAgICAgICAgICAgaWYgKHNzdGFibGUubWF5YmVQcmVzZW50KGtleSkpCisgICAgICAgICAgICBpZiAoc3N0YWJsZS5tYXlDb250YWluQXNzdW1pbmdLZXlJc0luUmFuZ2Uoa2V5KSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBtaW5UaW1lc3RhbXBTZWVuID0gTWF0aC5taW4obWluVGltZXN0YW1wU2Vlbiwgc3N0YWJsZS5nZXRNaW5UaW1lc3RhbXAoKSk7CiAgICAgICAgICAgICAgICAgaGFzVGltZXN0YW1wID0gdHJ1ZTsKQEAgLTMwNyw3ICszMDksNyBAQAogICAgIC8vIGNhbGxlciBtdXN0IGNsb3NlIGl0ZXJhdG9ycwogICAgIHB1YmxpYyBJdGVyYWJsZTxVbmZpbHRlcmVkUm93SXRlcmF0b3I+IHNoYWRvd1NvdXJjZXMoRGVjb3JhdGVkS2V5IGtleSwgYm9vbGVhbiB0b21ic3RvbmVPbmx5KQogICAgIHsKLSAgICAgICAgaWYgKCFwcm92aWRlVG9tYnN0b25lU291cmNlcygpIHx8ICFjb21wYWN0aW5nUmVwYWlyZWQoKSB8fCBORVZFUl9QVVJHRV9UT01CU1RPTkVTIHx8IGNmcy5nZXROZXZlclB1cmdlVG9tYnN0b25lcygpKQorICAgICAgICBpZiAoIXByb3ZpZGVUb21ic3RvbmVTb3VyY2VzKCkgfHwgIWNvbXBhY3RpbmdSZXBhaXJlZCgpIHx8IE5FVkVSX1BVUkdFX1RPTUJTVE9ORVNfUFJPUEVSVFlfVkFMVUUgfHwgY2ZzLmdldE5ldmVyUHVyZ2VUb21ic3RvbmVzKCkpCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgb3ZlcmxhcEl0ZXJhdG9yLnVwZGF0ZShrZXkpOwogICAgICAgICByZXR1cm4gSXRlcmFibGVzLmZpbHRlcihJdGVyYWJsZXMudHJhbnNmb3JtKG92ZXJsYXBJdGVyYXRvci5vdmVybGFwcygpLApAQCAtMzIyLDggKzMyNCw4IEBACiAgICAgICAgICAgICByZWFkZXIuZ2V0TWF4VGltZXN0YW1wKCkgPD0gbWluVGltZXN0YW1wIHx8CiAgICAgICAgICAgICB0b21ic3RvbmVPbmx5ICYmICFyZWFkZXIubWF5SGF2ZVRvbWJzdG9uZXMoKSkKICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBSb3dJbmRleEVudHJ5PD8+IHBvc2l0aW9uID0gcmVhZGVyLmdldFBvc2l0aW9uKGtleSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7Ci0gICAgICAgIGlmIChwb3NpdGlvbiA9PSBudWxsKQorICAgICAgICBsb25nIHBvc2l0aW9uID0gcmVhZGVyLmdldFBvc2l0aW9uKGtleSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgIGlmIChwb3NpdGlvbiA8IDApCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgRmlsZURhdGFJbnB1dCBkZmlsZSA9IG9wZW5EYXRhRmlsZXMuY29tcHV0ZUlmQWJzZW50KHJlYWRlciwgdGhpczo6b3BlbkRhdGFGaWxlKTsKICAgICAgICAgcmV0dXJuIHJlYWRlci5zaW1wbGVJdGVyYXRvcihkZmlsZSwga2V5LCBwb3NpdGlvbiwgdG9tYnN0b25lT25seSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25IaXN0b3J5VGFidWxhckRhdGEuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbkhpc3RvcnlUYWJ1bGFyRGF0YS5qYXZhCmluZGV4IDQ4NWYxYTAuLjE4MmYzNDggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbkhpc3RvcnlUYWJ1bGFyRGF0YS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbkhpc3RvcnlUYWJ1bGFyRGF0YS5qYXZhCkBAIC0yMSwyMCArMjEsMjAgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5VVUlEOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVW50eXBlZFJlc3VsdFNldDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkxvbmdUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiAKIHB1YmxpYyBjbGFzcyBDb21wYWN0aW9uSGlzdG9yeVRhYnVsYXJEYXRhCiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gSVRFTV9OQU1FUyA9IG5ldyBTdHJpbmdbXXsgImlkIiwgImtleXNwYWNlX25hbWUiLCAiY29sdW1uZmFtaWx5X25hbWUiLCAiY29tcGFjdGVkX2F0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXNfaW4iLCAiYnl0ZXNfb3V0IiwgInJvd3NfbWVyZ2VkIiB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlc19pbiIsICJieXRlc19vdXQiLCAicm93c19tZXJnZWQiLCAiY29tcGFjdGlvbl9wcm9wZXJ0aWVzIiB9OwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gSVRFTV9ERVNDUyA9IG5ldyBTdHJpbmdbXXsgInRpbWUgdXVpZCIsICJrZXlzcGFjZSBuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sdW1uIGZhbWlseSBuYW1lIiwgImNvbXBhY3Rpb24gZmluaXNoZWQgYXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b3RhbCBieXRlcyBpbiIsICJ0b3RhbCBieXRlcyBvdXQiLCAidG90YWwgcm93cyBtZXJnZWQiIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvdGFsIGJ5dGVzIGluIiwgInRvdGFsIGJ5dGVzIG91dCIsICJ0b3RhbCByb3dzIG1lcmdlZCIsICJjb21wYWN0aW9uIHByb3BlcnRpZXMiIH07CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9OQU1FID0gIkNvbXBhY3Rpb25IaXN0b3J5IjsKIApAQCAtNDUsMTMgKzQ1LDE1IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcG9zaXRlVHlwZSBDT01QT1NJVEVfVFlQRTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRhYnVsYXJUeXBlIFRBQlVMQVJfVFlQRTsKLQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBQ1RJT05fVFlQRV9QUk9QRVJUWSA9ICJjb21wYWN0aW9uX3R5cGUiOworICAgIAogICAgIHN0YXRpYyAKICAgICB7CiAgICAgICAgIHRyeQogICAgICAgICB7CiAgICAgICAgICAgICBJVEVNX1RZUEVTID0gbmV3IE9wZW5UeXBlW117IFNpbXBsZVR5cGUuU1RSSU5HLCBTaW1wbGVUeXBlLlNUUklORywgU2ltcGxlVHlwZS5TVFJJTkcsIFNpbXBsZVR5cGUuTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2ltcGxlVHlwZS5MT05HLCBTaW1wbGVUeXBlLkxPTkcsIFNpbXBsZVR5cGUuU1RSSU5HIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZVR5cGUuTE9ORywgU2ltcGxlVHlwZS5MT05HLCBTaW1wbGVUeXBlLlNUUklORywgU2ltcGxlVHlwZS5TVFJJTkcgfTsKIAogICAgICAgICAgICAgQ09NUE9TSVRFX1RZUEUgPSBuZXcgQ29tcG9zaXRlVHlwZShUWVBFX05BTUUsIFJPV19ERVNDLCBJVEVNX05BTUVTLCBJVEVNX0RFU0NTLCBJVEVNX1RZUEVTKTsKIApAQCAtNTksNyArNjEsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChPcGVuRGF0YUV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC03NSwxMCArNzcsMTEgQEAKICAgICAgICAgICAgIGxvbmcgYnl0ZXNJbiA9IHJvdy5nZXRMb25nKElURU1fTkFNRVNbNF0pOwogICAgICAgICAgICAgbG9uZyBieXRlc091dCA9IHJvdy5nZXRMb25nKElURU1fTkFNRVNbNV0pOwogICAgICAgICAgICAgTWFwPEludGVnZXIsIExvbmc+IHJvd01lcmdlZCA9IHJvdy5nZXRNYXAoSVRFTV9OQU1FU1s2XSwgSW50MzJUeXBlLmluc3RhbmNlLCBMb25nVHlwZS5pbnN0YW5jZSk7Ci0KKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gY29tcGFjdGlvblByb3BlcnRpZXMgPSByb3cuZ2V0TWFwKElURU1fTkFNRVNbN10sIFVURjhUeXBlLmluc3RhbmNlLCBVVEY4VHlwZS5pbnN0YW5jZSk7CiAgICAgICAgICAgICByZXN1bHQucHV0KG5ldyBDb21wb3NpdGVEYXRhU3VwcG9ydChDT01QT1NJVEVfVFlQRSwgSVRFTV9OQU1FUywKICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBpZC50b1N0cmluZygpLCBrc05hbWUsIGNmTmFtZSwgY29tcGFjdGVkQXQsIGJ5dGVzSW4sIGJ5dGVzT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ7IiArIEZCVXRpbGl0aWVzLnRvU3RyaW5nKHJvd01lcmdlZCkgKyAifSIgfSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7JyArIEZCVXRpbGl0aWVzLnRvU3RyaW5nKHJvd01lcmdlZCkgKyAnfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3snICsgRkJVdGlsaXRpZXMudG9TdHJpbmcoY29tcGFjdGlvblByb3BlcnRpZXMpICsgJ30nIH0pKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbkluZm8uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbkluZm8uamF2YQppbmRleCA1MTNhZGZhLi4wYmZjOTI1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25JbmZvLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uSW5mby5qYXZhCkBAIC0xOCw3ICsxOCw5IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb247CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKQEAgLTI3LDcgKzI5LDkgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcjsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogCkBAIC00Miw2ICs0Niw3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5JVCA9ICJ1bml0IjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QQUNUSU9OX0lEID0gImNvbXBhY3Rpb25JZCI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NUQUJMRVMgPSAic3N0YWJsZXMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9ESVJFQ1RPUlkgPSAidGFyZ2V0RGlyZWN0b3J5IjsKIAogICAgIHByaXZhdGUgZmluYWwgVGFibGVNZXRhZGF0YSBtZXRhZGF0YTsKICAgICBwcml2YXRlIGZpbmFsIE9wZXJhdGlvblR5cGUgdGFza3R5cGU7CkBAIC01MCwxMyArNTUsOSBAQAogICAgIHByaXZhdGUgZmluYWwgVW5pdCB1bml0OwogICAgIHByaXZhdGUgZmluYWwgVGltZVVVSUQgY29tcGFjdGlvbklkOwogICAgIHByaXZhdGUgZmluYWwgSW1tdXRhYmxlU2V0PFNTVGFibGVSZWFkZXI+IHNzdGFibGVzOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHRhcmdldERpcmVjdG9yeTsKIAotICAgIHB1YmxpYyBDb21wYWN0aW9uSW5mbyhUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBPcGVyYXRpb25UeXBlIHRhc2t0eXBlLCBsb25nIGJ5dGVzQ29tcGxldGUsIGxvbmcgdG90YWxCeXRlcywgVGltZVVVSUQgY29tcGFjdGlvbklkLCBDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IHNzdGFibGVzKQotICAgIHsKLSAgICAgICAgdGhpcyhtZXRhZGF0YSwgdGFza3R5cGUsIGJ5dGVzQ29tcGxldGUsIHRvdGFsQnl0ZXMsIFVuaXQuQllURVMsIGNvbXBhY3Rpb25JZCwgc3N0YWJsZXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29tcGFjdGlvbkluZm8oVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgT3BlcmF0aW9uVHlwZSB0YXNrdHlwZSwgbG9uZyBjb21wbGV0ZWQsIGxvbmcgdG90YWwsIFVuaXQgdW5pdCwgVGltZVVVSUQgY29tcGFjdGlvbklkLCBDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IHNzdGFibGVzKQorICAgIHB1YmxpYyBDb21wYWN0aW9uSW5mbyhUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBPcGVyYXRpb25UeXBlIHRhc2t0eXBlLCBsb25nIGNvbXBsZXRlZCwgbG9uZyB0b3RhbCwgVW5pdCB1bml0LCBUaW1lVVVJRCBjb21wYWN0aW9uSWQsIENvbGxlY3Rpb248PyBleHRlbmRzIFNTVGFibGVSZWFkZXI+IHNzdGFibGVzLCBTdHJpbmcgdGFyZ2V0RGlyZWN0b3J5KQogICAgIHsKICAgICAgICAgdGhpcy50YXNrdHlwZSA9IHRhc2t0eXBlOwogICAgICAgICB0aGlzLmNvbXBsZXRlZCA9IGNvbXBsZXRlZDsKQEAgLTY1LDIxICs2Niw0MSBAQAogICAgICAgICB0aGlzLnVuaXQgPSB1bml0OwogICAgICAgICB0aGlzLmNvbXBhY3Rpb25JZCA9IGNvbXBhY3Rpb25JZDsKICAgICAgICAgdGhpcy5zc3RhYmxlcyA9IEltbXV0YWJsZVNldC5jb3B5T2Yoc3N0YWJsZXMpOworICAgICAgICB0aGlzLnRhcmdldERpcmVjdG9yeSA9IHRhcmdldERpcmVjdG9yeTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29tcGFjdGlvbkluZm8oVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgT3BlcmF0aW9uVHlwZSB0YXNrdHlwZSwgbG9uZyBjb21wbGV0ZWQsIGxvbmcgdG90YWwsIFRpbWVVVUlEIGNvbXBhY3Rpb25JZCwgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcywgU3RyaW5nIHRhcmdldERpcmVjdG9yeSkKKyAgICB7CisgICAgICAgIHRoaXMobWV0YWRhdGEsIHRhc2t0eXBlLCBjb21wbGV0ZWQsIHRvdGFsLCBVbml0LkJZVEVTLCBjb21wYWN0aW9uSWQsIHNzdGFibGVzLCB0YXJnZXREaXJlY3RvcnkpOworICAgIH0KKworICAgIHB1YmxpYyBDb21wYWN0aW9uSW5mbyhUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBPcGVyYXRpb25UeXBlIHRhc2t0eXBlLCBsb25nIGNvbXBsZXRlZCwgbG9uZyB0b3RhbCwgVGltZVVVSUQgY29tcGFjdGlvbklkLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcykKKyAgICB7CisgICAgICAgIHRoaXMobWV0YWRhdGEsIHRhc2t0eXBlLCBjb21wbGV0ZWQsIHRvdGFsLCBVbml0LkJZVEVTLCBjb21wYWN0aW9uSWQsIHNzdGFibGVzLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTcGVjaWFsIGNvbXBhY3Rpb24gaW5mbyB3aGVyZSB3ZSBhbHdheXMgbmVlZCB0byBjYW5jZWwgdGhlIGNvbXBhY3Rpb24gLSBmb3IgZXhhbXBsZSBWaWV3QnVpbGRlclRhc2sgYW5kIEF1dG9TYXZpbmdDYWNoZSB3aGVyZSB3ZSBkb24ndCBrbm93CisgICAgICogU3BlY2lhbCBjb21wYWN0aW9uIGluZm8gd2hlcmUgd2UgYWx3YXlzIG5lZWQgdG8gY2FuY2VsIHRoZSBjb21wYWN0aW9uIC0gZm9yIGV4YW1wbGUgVmlld0J1aWxkZXJUYXNrIHdoZXJlIHdlIGRvbid0IGtub3cKICAgICAgKiB0aGUgc3N0YWJsZXMgYXQgY29uc3RydWN0aW9uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDb21wYWN0aW9uSW5mbyB3aXRob3V0U1NUYWJsZXMoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgT3BlcmF0aW9uVHlwZSB0YXNrdHlwZSwgbG9uZyBjb21wbGV0ZWQsIGxvbmcgdG90YWwsIFVuaXQgdW5pdCwgVGltZVVVSUQgY29tcGFjdGlvbklkKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb21wYWN0aW9uSW5mbyhtZXRhZGF0YSwgdGFza3R5cGUsIGNvbXBsZXRlZCwgdG90YWwsIHVuaXQsIGNvbXBhY3Rpb25JZCwgSW1tdXRhYmxlU2V0Lm9mKCkpOworICAgICAgICByZXR1cm4gd2l0aG91dFNTVGFibGVzKG1ldGFkYXRhLCB0YXNrdHlwZSwgY29tcGxldGVkLCB0b3RhbCwgdW5pdCwgY29tcGFjdGlvbklkLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsIGNvbXBhY3Rpb24gaW5mbyB3aGVyZSB3ZSBhbHdheXMgbmVlZCB0byBjYW5jZWwgdGhlIGNvbXBhY3Rpb24gLSBmb3IgZXhhbXBsZSBBdXRvU2F2aW5nQ2FjaGUgd2hlcmUgd2UgZG9uJ3Qga25vdworICAgICAqIHRoZSBzc3RhYmxlcyBhdCBjb25zdHJ1Y3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbXBhY3Rpb25JbmZvIHdpdGhvdXRTU1RhYmxlcyhUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBPcGVyYXRpb25UeXBlIHRhc2t0eXBlLCBsb25nIGNvbXBsZXRlZCwgbG9uZyB0b3RhbCwgVW5pdCB1bml0LCBUaW1lVVVJRCBjb21wYWN0aW9uSWQsIFN0cmluZyB0YXJnZXREaXJlY3RvcnkpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25JbmZvKG1ldGFkYXRhLCB0YXNrdHlwZSwgY29tcGxldGVkLCB0b3RhbCwgdW5pdCwgY29tcGFjdGlvbklkLCBJbW11dGFibGVTZXQub2YoKSwgdGFyZ2V0RGlyZWN0b3J5KTsKICAgICB9CiAKICAgICAvKiogQHJldHVybiBBIGNvcHkgb2YgdGhpcyBDb21wYWN0aW9uSW5mbyB3aXRoIHVwZGF0ZWQgcHJvZ3Jlc3MuICovCiAgICAgcHVibGljIENvbXBhY3Rpb25JbmZvIGZvclByb2dyZXNzKGxvbmcgY29tcGxldGUsIGxvbmcgdG90YWwpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25JbmZvKG1ldGFkYXRhLCB0YXNrdHlwZSwgY29tcGxldGUsIHRvdGFsLCB1bml0LCBjb21wYWN0aW9uSWQsIHNzdGFibGVzKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDb21wYWN0aW9uSW5mbyhtZXRhZGF0YSwgdGFza3R5cGUsIGNvbXBsZXRlLCB0b3RhbCwgdW5pdCwgY29tcGFjdGlvbklkLCBzc3RhYmxlcywgdGFyZ2V0RGlyZWN0b3J5KTsKICAgICB9CiAKICAgICBwdWJsaWMgT3B0aW9uYWw8U3RyaW5nPiBnZXRLZXlzcGFjZSgpCkBAIC0xMjcsNiArMTQ4LDUwIEBACiAgICAgICAgIHJldHVybiBzc3RhYmxlczsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGRpcmVjdG9yaWVzIHRoaXMgY29tcGFjdGlvbiBjb3VsZCBwb3NzaWJseSB3cml0ZSB0by4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGRpcmVjdG9yaWVzIHRoYXQgd2UgbWlnaHQgd3JpdGUgdG8sIG9yIGVtcHR5IGxpc3QgaWYgd2UgZG9uJ3Qga25vdyB0aGUgbWV0YWRhdGEKKyAgICAgKiAobGlrZSBmb3IgaW5kZXggc3VtbWFyeSByZWRpc3RyaWJ1dGlvbiksIG9yIG51bGwgaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgZGlzayBib3VuZGFyaWVzCisgICAgICovCisgICAgcHVibGljIExpc3Q8RmlsZT4gZ2V0VGFyZ2V0RGlyZWN0b3JpZXMoKQorICAgIHsKKyAgICAgICAgaWYgKG1ldGFkYXRhICE9IG51bGwgJiYgIW1ldGFkYXRhLmlzSW5kZXgoKSkKKyAgICAgICAgeworICAgICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gQ29sdW1uRmFtaWx5U3RvcmUuZ2V0SWZFeGlzdHMobWV0YWRhdGEuaWQpOworICAgICAgICAgICAgaWYgKGNmcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBjZnMuZ2V0RGlyZWN0b3JpZXNGb3JGaWxlcyhzc3RhYmxlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdGFyZ2V0RGlyZWN0b3J5KCkKKyAgICB7CisgICAgICAgIGlmICh0YXJnZXREaXJlY3RvcnkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAiIjsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHRhcmdldERpcmVjdG9yeSkuY2Fub25pY2FsUGF0aCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byByZXNvbHZlIGNhbm9uaWNhbCBwYXRoIGZvciAiICsgdGFyZ2V0RGlyZWN0b3J5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGUgdGhhdCB0aGlzIGVzdGltYXRlIGlzIGJhc2VkIG9uIHRoZSBhbW91bnQgb2YgZGF0YSB3ZSBoYXZlIGxlZnQgdG8gcmVhZCAtIGl0IGFzc3VtZXMgaW5wdXQKKyAgICAgKiBzaXplID09IG91dHB1dCBzaXplIGZvciBhIGNvbXBhY3Rpb24sIHdoaWNoIGlzIG5vdCByZWFsbHkgdHJ1ZSwgYnV0IHNob3VsZCBtb3N0IG9mdGVuIHByb3ZpZGUgYSB3b3JzdCBjYXNlCisgICAgICogcmVtYWluaW5nIHdyaXRlIHNpemUuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZXN0aW1hdGVkUmVtYWluaW5nV3JpdGVCeXRlcygpCisgICAgeworICAgICAgICBpZiAodW5pdCA9PSBVbml0LkJZVEVTICYmIHRhc2t0eXBlLndyaXRlc0RhdGEpCisgICAgICAgICAgICByZXR1cm4gZ2V0VG90YWwoKSAtIGdldENvbXBsZXRlZCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKICAgICB7CkBAIC0xNTUsNiArMjIwLDcgQEAKICAgICAgICAgcmV0LnB1dChVTklULCB1bml0LnRvU3RyaW5nKCkpOwogICAgICAgICByZXQucHV0KENPTVBBQ1RJT05fSUQsIGNvbXBhY3Rpb25JZCA9PSBudWxsID8gIiIgOiBjb21wYWN0aW9uSWQudG9TdHJpbmcoKSk7CiAgICAgICAgIHJldC5wdXQoU1NUQUJMRVMsIEpvaW5lci5vbignLCcpLmpvaW4oc3N0YWJsZXMpKTsKKyAgICAgICAgcmV0LnB1dChUQVJHRVRfRElSRUNUT1JZLCB0YXJnZXREaXJlY3RvcnkoKSk7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25JdGVyYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uSXRlcmF0b3IuamF2YQppbmRleCBhMGRjMDg3Li41Y2RlNDFlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25JdGVyYXRvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbkl0ZXJhdG9yLmphdmEKQEAgLTE3LDMzICsxNyw1MSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb247CiAKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uTG9uZ1ByZWRpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkxvbmdQcmVkaWNhdGU7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk9yZGVyaW5nOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmFuc2Zvcm0uRHVwbGljYXRlUm93Q2hlY2tlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkFic3RyYWN0Q29tcGFjdGlvbkNvbnRyb2xsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25UaW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkVtcHR5SXRlcmF0b3JzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlN5c3RlbUtleXNwYWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5QdXJnZUZ1bmN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5SYW5nZVRvbWJzdG9uZUJvdW5kTWFya2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUmFuZ2VUb21ic3RvbmVNYXJrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3dzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5XcmFwcGluZ1VuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmFuc2Zvcm0uRHVwbGljYXRlUm93Q2hlY2tlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmFuc2Zvcm0uVHJhbnNmb3JtYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnRyYW5zYWN0aW9ucy5Db21wYWN0aW9uVHJhbnNhY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU1NUYWJsZVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlRvcFBhcnRpdGlvblRyYWNrZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbXBhY3Rpb25QYXJhbXMuVG9tYnN0b25lT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLlBheG9zUmVwYWlySGlzdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLnVuY29tbWl0dGVkLlBheG9zUm93czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKQEAgLTc4LDExICs5NiwxMyBAQAogICAgIHByaXZhdGUgZmluYWwgSW1tdXRhYmxlU2V0PFNTVGFibGVSZWFkZXI+IHNzdGFibGVzOwogICAgIHByaXZhdGUgZmluYWwgaW50IG5vd0luU2VjOwogICAgIHByaXZhdGUgZmluYWwgVGltZVVVSUQgY29tcGFjdGlvbklkOwotCiAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHRvdGFsQnl0ZXM7CiAgICAgcHJpdmF0ZSBsb25nIGJ5dGVzUmVhZDsKICAgICBwcml2YXRlIGxvbmcgdG90YWxTb3VyY2VDUUxSb3dzOwogCisgICAgLy8gS2VlcCB0YXJnZXREaXJlY3RvcnkgZm9yIGNvbXBhY3Rpb25zLCBuZWVkZWQgZm9yIGBub2RldG9vbCBjb21wYWN0aW9uc3RhdHNgCisgICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0RGlyZWN0b3J5OworCiAgICAgLyoKICAgICAgKiBjb3VudGVycyBmb3IgbWVyZ2VkIHJvd3MuCiAgICAgICogYXJyYXkgaW5kZXggcmVwcmVzZW50cyAobnVtYmVyIG9mIG1lcmdlZCByb3dzIC0gMSksIHNvIGluZGV4IDAgaXMgY291bnRlciBmb3Igbm8gbWVyZ2UgKDEgcm93KSwKQEAgLTE1MSw3ICsxNzEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhY3Rpb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RGlyZWN0b3J5KTsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0dsb2JhbCgpCkBAIC0xNTksNiArMTgwLDExIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXREaXJlY3RvcnkoZmluYWwgU3RyaW5nIHRhcmdldERpcmVjdG9yeSkKKyAgICB7CisgICAgICAgIHRoaXMudGFyZ2V0RGlyZWN0b3J5ID0gdGFyZ2V0RGlyZWN0b3J5OworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDb3VudGVyRm9yKGludCByb3dzKQogICAgIHsKICAgICAgICAgYXNzZXJ0IHJvd3MgPiAwICYmIHJvd3MgLSAxIDwgbWVyZ2VDb3VudGVycy5sZW5ndGg7CkBAIC0xOTQsOSArMjIwLDEyIEBACiAKICAgICAgICAgICAgICAgICBDb21wYWN0aW9uSXRlcmF0b3IudGhpcy51cGRhdGVDb3VudGVyRm9yKG1lcmdlZCk7CiAKLSAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBPcGVyYXRpb25UeXBlLkNPTVBBQ1RJT04gfHwgIWNvbnRyb2xsZXIuY2ZzLmluZGV4TWFuYWdlci5oYXNJbmRleGVzKCkpCisgICAgICAgICAgICAgICAgaWYgKCAodHlwZSAhPSBPcGVyYXRpb25UeXBlLkNPTVBBQ1RJT04gJiYgdHlwZSAhPSBPcGVyYXRpb25UeXBlLk1BSk9SX0NPTVBBQ1RJT04pIAorICAgICAgICAgICAgICAgICAgICB8fCAhY29udHJvbGxlci5jZnMuaW5kZXhNYW5hZ2VyLmhhc0luZGV4ZXMoKSApIAorICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgQ29sdW1ucyBzdGF0aWNzID0gQ29sdW1ucy5OT05FOwogICAgICAgICAgICAgICAgIENvbHVtbnMgcmVndWxhcnMgPSBDb2x1bW5zLk5PTkU7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wLCBpc2l6ZT12ZXJzaW9ucy5zaXplKCk7IGk8aXNpemU7IGkrKykKQEAgLTM0Miw2ICszNzEsMTggQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qCisgICAgICAgICAqIENhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbmV3IHBhcnRpdGlvbgorICAgICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgY3VycmVudCBwYXJ0aXRpb25LZXkgaWdub3JlcyB0aGUgZ2NfZ3JhY2Vfc2Vjb25kcyBkdXJpbmcgY29tcGFjdGlvbi4KKyAgICAgICAgICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9uTmV3UGFydGl0aW9uIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiB0aGUgY3VycmVudEtleQorICAgICAgICAgKiB3aGljaCBpcyBzZXQgaW4gdGhlIG9uTmV3UGFydGl0aW9uCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkSWdub3JlR2NHcmFjZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjb250cm9sbGVyLmNmcy5zaG91bGRJZ25vcmVHY0dyYWNlRm9yS2V5KGN1cnJlbnRLZXkpOworICAgICAgICB9CisKKyAgICAgICAgLyoKICAgICAgICAgICogRXZhbHVhdGVzIHdoZXRoZXIgYSB0b21ic3RvbmUgd2l0aCB0aGUgZ2l2ZW4gZGVsZXRpb24gdGltZXN0YW1wIGNhbiBiZSBwdXJnZWQuIFRoaXMgaXMgdGhlIG1pbmltdW0KICAgICAgICAgICogdGltZXN0YW1wIGZvciBhbnkgc3N0YWJsZSBjb250YWluaW5nIGBjdXJyZW50S2V5YCBvdXRzaWRlIG9mIHRoZSBzZXQgb2Ygc3N0YWJsZXMgaW52b2x2ZWQgaW4gdGhpcyBjb21wYWN0aW9uLgogICAgICAgICAgKiBUaGlzIGlzIGNvbXB1dGVkIGxhemlseSBvbiBkZW1hbmQgYXMgd2Ugb25seSBuZWVkIHRoaXMgaWYgdGhlcmUgaXMgdG9tYnN0b25lcyBhbmQgdGhpcyBhIGJpdCBleHBlbnNpdmUKQEAgLTM2Miw4ICs0MDMsMTAgQEAKICAgICAgKiBUaGUgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoaXMgaXRlcmF0b3IgaXMgc3VjaCB0aGF0IHdoZW4gbWVyZ2VkIHdpdGggdG9tYlNvdXJjZSBpdCBwcm9kdWNlcyB0aGUgc2FtZSBvdXRwdXQKICAgICAgKiBhcyB0aGUgbWVyZ2Ugb2YgZGF0YVNvdXJjZSBhbmQgdG9tYlNvdXJjZS4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBHYXJiYWdlU2tpcHBpbmdVbmZpbHRlcmVkUm93SXRlcmF0b3IgZXh0ZW5kcyBXcmFwcGluZ1VuZmlsdGVyZWRSb3dJdGVyYXRvcgorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdhcmJhZ2VTa2lwcGluZ1VuZmlsdGVyZWRSb3dJdGVyYXRvciBpbXBsZW1lbnRzIFdyYXBwaW5nVW5maWx0ZXJlZFJvd0l0ZXJhdG9yCiAgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIFVuZmlsdGVyZWRSb3dJdGVyYXRvciB3cmFwcGVkOworCiAgICAgICAgIGZpbmFsIFVuZmlsdGVyZWRSb3dJdGVyYXRvciB0b21iU291cmNlOwogICAgICAgICBmaW5hbCBEZWxldGlvblRpbWUgcGFydGl0aW9uTGV2ZWxEZWxldGlvbjsKICAgICAgICAgZmluYWwgUm93IHN0YXRpY1JvdzsKQEAgLTM5MCw3ICs0MzMsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgcHJvdGVjdGVkIEdhcmJhZ2VTa2lwcGluZ1VuZmlsdGVyZWRSb3dJdGVyYXRvcihVbmZpbHRlcmVkUm93SXRlcmF0b3IgZGF0YVNvdXJjZSwgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHRvbWJTb3VyY2UsIGJvb2xlYW4gY2VsbExldmVsR0MpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKGRhdGFTb3VyY2UpOworICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gZGF0YVNvdXJjZTsKICAgICAgICAgICAgIHRoaXMudG9tYlNvdXJjZSA9IHRvbWJTb3VyY2U7CiAgICAgICAgICAgICB0aGlzLmNlbGxMZXZlbEdDID0gY2VsbExldmVsR0M7CiAgICAgICAgICAgICBtZXRhZGF0YSA9IGRhdGFTb3VyY2UubWV0YWRhdGEoKTsKQEAgLTQxMCw2ICs0NTMsMTIgQEAKICAgICAgICAgICAgIGRhdGFOZXh0ID0gYWR2YW5jZShkYXRhU291cmNlKTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHdyYXBwZWQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gd3JhcHBlZDsKKyAgICAgICAgfQorCiAgICAgICAgIHByaXZhdGUgc3RhdGljIFVuZmlsdGVyZWQgYWR2YW5jZShVbmZpbHRlcmVkUm93SXRlcmF0b3Igc291cmNlKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gc291cmNlLmhhc05leHQoKSA/IHNvdXJjZS5uZXh0KCkgOiBudWxsOwpAQCAtNDIzLDcgKzQ3Miw3IEBACiAKICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKQogICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlci5jbG9zZSgpOworICAgICAgICAgICAgd3JhcHBlZC5jbG9zZSgpOwogICAgICAgICAgICAgdG9tYlNvdXJjZS5jbG9zZSgpOwogICAgICAgICB9CiAKQEAgLTY5Niw0ICs3NDUsNCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIGNmcy5uYW1lLmVxdWFscyhTeXN0ZW1LZXlzcGFjZS5QQVhPUykgJiYgY2ZzLmtleXNwYWNlLmdldE5hbWUoKS5lcXVhbHMoU2NoZW1hQ29uc3RhbnRzLlNZU1RFTV9LRVlTUEFDRV9OQU1FKTsKICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uTG9nZ2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25Mb2dnZXIuamF2YQppbmRleCA5YmYwNjNiLi44OGE3NzA1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25Mb2dnZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25Mb2dnZXIuamF2YQpAQCAtMjEsMTMgKzIxLDE2IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKIGltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS4qOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuU3RhbmRhcmRPcGVuT3B0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOwpAQCAtNDksNiArNTIsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk5vU3BhbUxvZ2dlcjsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LkV4ZWN1dG9yRmFjdG9yeS5HbG9iYWwuZXhlY3V0b3JGYWN0b3J5OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkxPR19ESVI7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpczsKIAogcHVibGljIGNsYXNzIENvbXBhY3Rpb25Mb2dnZXIKQEAgLTE3Miw3ICsxNzYsNyBAQAogICAgIHsKICAgICAgICAgT2JqZWN0Tm9kZSBub2RlID0ganNvbi5vYmplY3ROb2RlKCk7CiAgICAgICAgIG5vZGUucHV0KCJnZW5lcmF0aW9uIiwgc3N0YWJsZS5kZXNjcmlwdG9yLmlkLnRvU3RyaW5nKCkpOwotICAgICAgICBub2RlLnB1dCgidmVyc2lvbiIsIHNzdGFibGUuZGVzY3JpcHRvci52ZXJzaW9uLmdldFZlcnNpb24oKSk7CisgICAgICAgIG5vZGUucHV0KCJ2ZXJzaW9uIiwgc3N0YWJsZS5kZXNjcmlwdG9yLnZlcnNpb24udmVyc2lvbik7CiAgICAgICAgIG5vZGUucHV0KCJzaXplIiwgc3N0YWJsZS5vbkRpc2tMZW5ndGgoKSk7CiAgICAgICAgIEpzb25Ob2RlIGxvZ1Jlc3VsdCA9IHN0cmF0ZWd5LnN0cmF0ZWd5TG9nZ2VyKCkuc3N0YWJsZShzc3RhYmxlKTsKICAgICAgICAgaWYgKGxvZ1Jlc3VsdCAhPSBudWxsKQpAQCAtMzAwLDcgKzMwNCw3IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb21wYWN0aW9uTG9nU2VyaWFsaXplciBpbXBsZW1lbnRzIFdyaXRlcgogICAgIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGxvZ0RpcmVjdG9yeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmxvZ2RpciIsICIuIik7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBsb2dEaXJlY3RvcnkgPSBMT0dfRElSLmdldFN0cmluZygpOwogICAgICAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yUGx1cyBsb2dnZXJTZXJ2aWNlID0gZXhlY3V0b3JGYWN0b3J5KCkuc2VxdWVudGlhbCgiQ29tcGFjdGlvbkxvZ2dlciIpOwogICAgICAgICAvLyBUaGlzIGlzIG9ubHkgYWNjZXNzZWQgb24gdGhlIGxvZ2dlciBzZXJ2aWNlIHRocmVhZCwgc28gaXQgZG9lcyBub3QgbmVlZCB0byBiZSB0aHJlYWQgc2FmZQogICAgICAgICBwcml2YXRlIGZpbmFsIFNldDxPYmplY3Q+IHJvbGxlZCA9IG5ldyBIYXNoU2V0PD4oKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbk1hbmFnZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbk1hbmFnZXIuamF2YQppbmRleCAzNDdmOWIzLi5hOTcyNDE1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25NYW5hZ2VyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uTWFuYWdlci5qYXZhCkBAIC00Myw2ICs0Myw3IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGVzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuQXJyYXlMaXN0TXVsdGltYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5Db2xsZWN0aW9uczI7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5Db25jdXJyZW50SGFzaE11bHRpc2V0OwpAQCAtNTcsNiArNTgsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBuZXQub3BlbmhmdC5jaHJvbmljbGUuY29yZS51dGlsLlRocm93aW5nU3VwcGxpZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuQXV0b1NhdmluZ0NhY2hlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRXhlY3V0b3JGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuV3JhcHBlZEV4ZWN1dG9yUGx1czsKQEAgLTc4LDE2ICs4MCwxNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpZXcuVmlld0J1aWxkZXJUYXNrOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5BYnN0cmFjdEJvdW5kczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQm91bmRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LlNlY29uZGFyeUluZGV4QnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU1NUYWJsZVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklTY3J1YmJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklWZXJpZmllcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZXdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVdyaXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29sbGVjdG9yOwpAQCAtMTA3LDYgKzEwOSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSlZNU3RhYmlsaXR5SW5zcGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk1CZWFuV3JhcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PdXRwdXRIYW5kbGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRocm93YWJsZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuV3JhcHBlZFJ1bm5hYmxlOwpAQCAtMTU2LDcgKzE1OSwxMyBAQAogICAgIHByaXZhdGUgZmluYWwgQ29tcGFjdGlvbkV4ZWN1dG9yIGNhY2hlQ2xlYW51cEV4ZWN1dG9yID0gbmV3IENhY2hlQ2xlYW51cEV4ZWN1dG9yKCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBDb21wYWN0aW9uRXhlY3V0b3Igdmlld0J1aWxkRXhlY3V0b3IgPSBuZXcgVmlld0J1aWxkRXhlY3V0b3IoKTsKIAotICAgIHByaXZhdGUgZmluYWwgQ29tcGFjdGlvbk1ldHJpY3MgbWV0cmljcyA9IG5ldyBDb21wYWN0aW9uTWV0cmljcyhleGVjdXRvciwgdmFsaWRhdGlvbkV4ZWN1dG9yLCB2aWV3QnVpbGRFeGVjdXRvcik7CisgICAgLy8gV2UgY2FuJ3QgaG91c2UgMmkgYnVpbGRzIGluIFNlY29uZGFyeUluZGV4TWFuYWdlbWVudCBiZWNhdXNlIGl0IGNvdWxkIGNhdXNlIGRlYWRsb2NrcyB3aXRoIGl0c2VsZiwgYW5kIGNhbiBjYXVzZQorICAgIC8vIG1hc3NpdmUgdG8gaW5kZWZpbml0ZSBwYXVzZXMgaWYgcHJpb3JpdGl6ZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciBub3JtYWwgY29tcGFjdGlvbnMgc28gd2UgaW5zdGVhZCBwdXQgaXQgaW4gaXRzCisgICAgLy8gb3duIHBvb2wgdG8gcHJldmVudCBlaXRoZXIgc2NlbmFyaW8uCisgICAgcHJpdmF0ZSBmaW5hbCBTZWNvbmRhcnlJbmRleEV4ZWN1dG9yIHNlY29uZGFyeUluZGV4RXhlY3V0b3IgPSBuZXcgU2Vjb25kYXJ5SW5kZXhFeGVjdXRvcigpOworCisgICAgcHJpdmF0ZSBmaW5hbCBDb21wYWN0aW9uTWV0cmljcyBtZXRyaWNzID0gbmV3IENvbXBhY3Rpb25NZXRyaWNzKGV4ZWN1dG9yLCB2YWxpZGF0aW9uRXhlY3V0b3IsIHZpZXdCdWlsZEV4ZWN1dG9yLCBzZWNvbmRhcnlJbmRleEV4ZWN1dG9yKTsKKwogICAgIEBWaXNpYmxlRm9yVGVzdGluZwogICAgIGZpbmFsIE11bHRpc2V0PENvbHVtbkZhbWlseVN0b3JlPiBjb21wYWN0aW5nQ0YgPSBDb25jdXJyZW50SGFzaE11bHRpc2V0LmNyZWF0ZSgpOwogCkBAIC0yNjksMTQgKzI3OCwxNiBAQAogICAgICAgICBpbnQgcGVuZGluZ1Rhc2tzID0gZXhlY3V0b3IuZ2V0UGVuZGluZ1Rhc2tDb3VudCgpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25FeGVjdXRvci5nZXRQZW5kaW5nVGFza0NvdW50KCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0J1aWxkRXhlY3V0b3IuZ2V0UGVuZGluZ1Rhc2tDb3VudCgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlQ2xlYW51cEV4ZWN1dG9yLmdldFBlbmRpbmdUYXNrQ291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlQ2xlYW51cEV4ZWN1dG9yLmdldFBlbmRpbmdUYXNrQ291bnQoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlJbmRleEV4ZWN1dG9yLmdldFBlbmRpbmdUYXNrQ291bnQoKTsKICAgICAgICAgaWYgKHBlbmRpbmdUYXNrcyA+IDApCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKIAogICAgICAgICBpbnQgYWN0aXZlVGFza3MgPSBleGVjdXRvci5nZXRBY3RpdmVUYXNrQ291bnQoKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25FeGVjdXRvci5nZXRBY3RpdmVUYXNrQ291bnQoKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCdWlsZEV4ZWN1dG9yLmdldEFjdGl2ZVRhc2tDb3VudCgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVDbGVhbnVwRXhlY3V0b3IuZ2V0QWN0aXZlVGFza0NvdW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlQ2xlYW51cEV4ZWN1dG9yLmdldEFjdGl2ZVRhc2tDb3VudCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5SW5kZXhFeGVjdXRvci5nZXRBY3RpdmVUYXNrQ291bnQoKTsKIAogICAgICAgICByZXR1cm4gYWN0aXZlVGFza3MgPiAwOwogICAgIH0KQEAgLTI5Miw2ICszMDMsNyBAQAogICAgICAgICB2YWxpZGF0aW9uRXhlY3V0b3Iuc2h1dGRvd24oKTsKICAgICAgICAgdmlld0J1aWxkRXhlY3V0b3Iuc2h1dGRvd24oKTsKICAgICAgICAgY2FjaGVDbGVhbnVwRXhlY3V0b3Iuc2h1dGRvd24oKTsKKyAgICAgICAgc2Vjb25kYXJ5SW5kZXhFeGVjdXRvci5zaHV0ZG93bigpOwogCiAgICAgICAgIC8vIGludGVycnVwdCBjb21wYWN0aW9ucyBhbmQgdmFsaWRhdGlvbnMKICAgICAgICAgZm9yIChIb2xkZXIgY29tcGFjdGlvbkhvbGRlciA6IGFjdGl2ZS5nZXRDb21wYWN0aW9ucygpKQpAQCAtMzAyLDcgKzMxNCw4IEBACiAgICAgICAgIC8vIHdhaXQgZm9yIHRhc2tzIHRvIHRlcm1pbmF0ZQogICAgICAgICAvLyBjb21wYWN0aW9uIHRhc2tzIGFyZSBpbnRlcnJ1cHRlZCBhYm92ZSwgc28gaXQgc2h1b2xkIGJlIGZhaXJ5IHF1aWNrCiAgICAgICAgIC8vIHVudGlsIG5vdCBpbnRlcnJ1cHRlZCB0YXNrcyB0byBjb21wbGV0ZS4KLSAgICAgICAgZm9yIChFeGVjdXRvclNlcnZpY2UgZXhlYyA6IEFycmF5cy5hc0xpc3QoZXhlY3V0b3IsIHZhbGlkYXRpb25FeGVjdXRvciwgdmlld0J1aWxkRXhlY3V0b3IsIGNhY2hlQ2xlYW51cEV4ZWN1dG9yKSkKKyAgICAgICAgZm9yIChFeGVjdXRvclNlcnZpY2UgZXhlYyA6IEFycmF5cy5hc0xpc3QoZXhlY3V0b3IsIHZhbGlkYXRpb25FeGVjdXRvciwgdmlld0J1aWxkRXhlY3V0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlQ2xlYW51cEV4ZWN1dG9yLCBzZWNvbmRhcnlJbmRleEV4ZWN1dG9yKSkKICAgICAgICAgewogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CkBAIC00MDUsNzIgKzQxOCw3OCBAQAogICAgICAqIEBwYXJhbSBvcGVyYXRpb24gdGhlIG9wZXJhdGlvbiB0byBydW4KICAgICAgKiBAcGFyYW0gam9icyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlIC0gMCBtZWFucyB1c2UgYWxsIGF2YWlsYWJsZS4gSXQgbmV2ZXIgdXNlcyBtb3JlIHRoYW4gY29uY3VycmVudF9jb21wYWN0b3JzIHRocmVhZHMKICAgICAgKiBAcmV0dXJuIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uCi0gICAgICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKLSAgICBwcml2YXRlIEFsbFNTVGFibGVPcFN0YXR1cyBwYXJhbGxlbEFsbFNTVGFibGVPcGVyYXRpb24oZmluYWwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBmaW5hbCBPbmVTU1RhYmxlT3BlcmF0aW9uIG9wZXJhdGlvbiwgaW50IGpvYnMsIE9wZXJhdGlvblR5cGUgb3BlcmF0aW9uVHlwZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICBwcml2YXRlIEFsbFNTVGFibGVPcFN0YXR1cyBwYXJhbGxlbEFsbFNTVGFibGVPcGVyYXRpb24oZmluYWwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPbmVTU1RhYmxlT3BlcmF0aW9uIG9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGpvYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvblR5cGUgb3BlcmF0aW9uVHlwZSkKICAgICB7Ci0gICAgICAgIGxvZ2dlci5pbmZvKCJTdGFydGluZyB7fSBmb3Ige30ue30iLCBvcGVyYXRpb25UeXBlLCBjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLCBjZnMuZ2V0VGFibGVOYW1lKCkpOwotICAgICAgICBMaXN0PExpZmVjeWNsZVRyYW5zYWN0aW9uPiB0cmFuc2FjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgTGlzdDxGdXR1cmU8Pz4+IGZ1dHVyZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiBjb21wYWN0aW5nID0gY2ZzLm1hcmtBbGxDb21wYWN0aW5nKG9wZXJhdGlvblR5cGUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29tcGFjdGluZyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBBbGxTU1RhYmxlT3BTdGF0dXMuVU5BQkxFX1RPX0NBTkNFTDsKLQotICAgICAgICAgICAgSXRlcmFibGU8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMgPSBMaXN0cy5uZXdBcnJheUxpc3Qob3BlcmF0aW9uLmZpbHRlclNTVGFibGVzKGNvbXBhY3RpbmcpKTsKLSAgICAgICAgICAgIGlmIChJdGVyYWJsZXMuaXNFbXB0eShzc3RhYmxlcykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIk5vIHNzdGFibGVzIHRvIHt9IGZvciB7fS57fSIsIG9wZXJhdGlvblR5cGUubmFtZSgpLCBjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLCBjZnMubmFtZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFsbFNTVGFibGVPcFN0YXR1cy5TVUNDRVNTRlVMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGZpbmFsIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNvbXBhY3Rpbmcuc3BsaXQoc2luZ2xldG9uKHNzdGFibGUpKTsKLSAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMuYWRkKHR4bik7Ci0gICAgICAgICAgICAgICAgQ2FsbGFibGU8T2JqZWN0PiBjYWxsYWJsZSA9IG5ldyBDYWxsYWJsZTxPYmplY3Q+KCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5leGVjdXRlKHR4bik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgRnV0dXJlPD8+IGZ1dCA9IGV4ZWN1dG9yLnN1Ym1pdElmUnVubmluZyhjYWxsYWJsZSwgInBhcmFsZWxsIHNzdGFibGUgb3BlcmF0aW9uIik7Ci0gICAgICAgICAgICAgICAgaWYgKCFmdXQuaXNDYW5jZWxsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgZnV0dXJlcy5hZGQoZnV0KTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBbGxTU1RhYmxlT3BTdGF0dXMuQUJPUlRFRDsKLQotICAgICAgICAgICAgICAgIGlmIChqb2JzID4gMCAmJiBmdXR1cmVzLnNpemUoKSA9PSBqb2JzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRnV0dXJlPD8+IGYgPSBGQlV0aWxpdGllcy53YWl0T25GaXJzdEZ1dHVyZShmdXR1cmVzKTsKLSAgICAgICAgICAgICAgICAgICAgZnV0dXJlcy5yZW1vdmUoZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgRkJVdGlsaXRpZXMud2FpdE9uRnV0dXJlcyhmdXR1cmVzKTsKLSAgICAgICAgICAgIGFzc2VydCBjb21wYWN0aW5nLm9yaWdpbmFscygpLmlzRW1wdHkoKTsKLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJGaW5pc2hlZCB7fSBmb3Ige30ue30gc3VjY2Vzc2Z1bGx5Iiwgb3BlcmF0aW9uVHlwZSwgY2ZzLmtleXNwYWNlLmdldE5hbWUoKSwgY2ZzLmdldFRhYmxlTmFtZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBBbGxTU1RhYmxlT3BTdGF0dXMuU1VDQ0VTU0ZVTDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHdhaXQgb24gYW55IHVuZmluaXNoZWQgZnV0dXJlcyB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgY2xvc2UgYW4gb25nb2luZyB0cmFuc2FjdGlvbgorICAgICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IG9wZXJhdGlvblR5cGUubmFtZSgpOworICAgICAgICBTdHJpbmcga2V5c3BhY2UgPSBjZnMua2V5c3BhY2UuZ2V0TmFtZSgpOworICAgICAgICBTdHJpbmcgdGFibGUgPSBjZnMuZ2V0VGFibGVOYW1lKCk7CisgICAgICAgIHJldHVybiBjZnMud2l0aEFsbFNTVGFibGVzKG9wZXJhdGlvblR5cGUsIChjb21wYWN0aW5nKSAtPiB7CisgICAgICAgICAgICBsb2dnZXIuaW5mbygiU3RhcnRpbmcge30gZm9yIHt9Lnt9Iiwgb3BlcmF0aW9uVHlwZSwgY2ZzLmtleXNwYWNlLmdldE5hbWUoKSwgY2ZzLmdldFRhYmxlTmFtZSgpKTsKKyAgICAgICAgICAgIExpc3Q8TGlmZWN5Y2xlVHJhbnNhY3Rpb24+IHRyYW5zYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgTGlzdDxGdXR1cmU8Pz4+IGZ1dHVyZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjb21wYWN0aW5nID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbGxTU1RhYmxlT3BTdGF0dXMuVU5BQkxFX1RPX0NBTkNFTDsKKworICAgICAgICAgICAgICAgIEl0ZXJhYmxlPFNTVGFibGVSZWFkZXI+IHNzdGFibGVzID0gTGlzdHMubmV3QXJyYXlMaXN0KG9wZXJhdGlvbi5maWx0ZXJTU1RhYmxlcyhjb21wYWN0aW5nKSk7CisgICAgICAgICAgICAgICAgaWYgKEl0ZXJhYmxlcy5pc0VtcHR5KHNzdGFibGVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJObyBzc3RhYmxlcyB0byB7fSBmb3Ige30ue30iLCBvcGVyYXRpb25OYW1lLCBrZXlzcGFjZSwgdGFibGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxsU1NUYWJsZU9wU3RhdHVzLlNVQ0NFU1NGVUw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNvbXBhY3Rpbmcuc3BsaXQoc2luZ2xldG9uKHNzdGFibGUpKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zLmFkZCh0eG4pOworICAgICAgICAgICAgICAgICAgICBDYWxsYWJsZTxPYmplY3Q+IGNhbGxhYmxlID0gbmV3IENhbGxhYmxlPE9iamVjdD4oKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY2FsbCgpIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uZXhlY3V0ZSh0eG4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICBGdXR1cmU8Pz4gZnV0ID0gZXhlY3V0b3Iuc3VibWl0SWZSdW5uaW5nKGNhbGxhYmxlLCAicGFyYWxsZWwgU1NUYWJsZSBvcGVyYXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmdXQuaXNDYW5jZWxsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1dHVyZXMuYWRkKGZ1dCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbGxTU1RhYmxlT3BTdGF0dXMuQUJPUlRFRDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoam9icyA+IDAgJiYgZnV0dXJlcy5zaXplKCkgPT0gam9icykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRnV0dXJlPD8+IGYgPSBGQlV0aWxpdGllcy53YWl0T25GaXJzdEZ1dHVyZShmdXR1cmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1dHVyZXMucmVtb3ZlKGYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEZCVXRpbGl0aWVzLndhaXRPbkZ1dHVyZXMoZnV0dXJlcyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGNvbXBhY3Rpbmcub3JpZ2luYWxzKCkuaXNFbXB0eSgpOworICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJGaW5pc2hlZCB7fSBmb3Ige30ue30gc3VjY2Vzc2Z1bGx5Iiwgb3BlcmF0aW9uVHlwZSwga2V5c3BhY2UsIHRhYmxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQWxsU1NUYWJsZU9wU3RhdHVzLlNVQ0NFU1NGVUw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCisgICAgICAgICAgICBmaW5hbGx5CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvLyB0aGVzZSBhcmUgaGFuZGxlZC9sb2dnZWQgaW4gQ29tcGFjdGlvbkV4ZWN1dG9yI2FmdGVyRXhlY3V0ZQorICAgICAgICAgICAgICAgIC8vIHdhaXQgb24gYW55IHVuZmluaXNoZWQgZnV0dXJlcyB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgY2xvc2UgYW4gb25nb2luZyB0cmFuc2FjdGlvbgorICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkJVdGlsaXRpZXMud2FpdE9uRnV0dXJlcyhmdXR1cmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2UgYXJlIGhhbmRsZWQvbG9nZ2VkIGluIENvbXBhY3Rpb25FeGVjdXRvciNhZnRlckV4ZWN1dGUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgVGhyb3dhYmxlIGZhaWwgPSBUaHJvd2FibGVzLmNsb3NlKG51bGwsIHRyYW5zYWN0aW9ucyk7CisgICAgICAgICAgICAgICAgaWYgKGZhaWwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJGYWlsZWQgdG8gY2xlYW51cCBsaWZlY3ljbGUgdHJhbnNhY3Rpb25zICh7fSBmb3Ige30ue30pIiwgb3BlcmF0aW9uVHlwZSwga2V5c3BhY2UsIHRhYmxlLCBmYWlsKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRocm93YWJsZSBmYWlsID0gVGhyb3dhYmxlcy5jbG9zZShudWxsLCB0cmFuc2FjdGlvbnMpOwotICAgICAgICAgICAgaWYgKGZhaWwgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkZhaWxlZCB0byBjbGVhbnVwIGxpZmVjeWNsZSB0cmFuc2FjdGlvbnMgKHt9IGZvciB7fS57fSkiLCBvcGVyYXRpb25UeXBlLCBjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLCBjZnMuZ2V0VGFibGVOYW1lKCksIGZhaWwpOwotICAgICAgICB9CisgICAgICAgIH0pOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGludGVyZmFjZSBPbmVTU1RhYmxlT3BlcmF0aW9uCkBAIC00OTMsMTYgKzUxMiw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgQWxsU1NUYWJsZU9wU3RhdHVzIHBlcmZvcm1TY3J1YihmaW5hbCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIGZpbmFsIGJvb2xlYW4gc2tpcENvcnJ1cHRlZCwgZmluYWwgYm9vbGVhbiBjaGVja0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGpvYnMpCi0gICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBwZXJmb3JtU2NydWIoY2ZzLCBza2lwQ29ycnVwdGVkLCBjaGVja0RhdGEsIGZhbHNlLCBqb2JzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWxsU1NUYWJsZU9wU3RhdHVzIHBlcmZvcm1TY3J1YihmaW5hbCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIGZpbmFsIGJvb2xlYW4gc2tpcENvcnJ1cHRlZCwgZmluYWwgYm9vbGVhbiBjaGVja0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWluc2VydE92ZXJmbG93ZWRUVEwsIGludCBqb2JzKQotICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uCisgICAgcHVibGljIEFsbFNTVGFibGVPcFN0YXR1cyBwZXJmb3JtU2NydWIoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBJU2NydWJiZXIuT3B0aW9ucyBvcHRpb25zLCBpbnQgam9icykKICAgICB7CiAgICAgICAgIHJldHVybiBwYXJhbGxlbEFsbFNTVGFibGVPcGVyYXRpb24oY2ZzLCBuZXcgT25lU1NUYWJsZU9wZXJhdGlvbigpCiAgICAgICAgIHsKQEAgLTUxNSwxMiArNTI1LDEyIEBACiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gaW5wdXQpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2NydWJPbmUoY2ZzLCBpbnB1dCwgc2tpcENvcnJ1cHRlZCwgY2hlY2tEYXRhLCByZWluc2VydE92ZXJmbG93ZWRUVEwsIGFjdGl2ZSk7CisgICAgICAgICAgICAgICAgc2NydWJPbmUoY2ZzLCBpbnB1dCwgb3B0aW9ucywgYWN0aXZlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSwgam9icywgT3BlcmF0aW9uVHlwZS5TQ1JVQik7CiAgICAgfQogCi0gICAgcHVibGljIEFsbFNTVGFibGVPcFN0YXR1cyBwZXJmb3JtVmVyaWZ5KENvbHVtbkZhbWlseVN0b3JlIGNmcywgVmVyaWZpZXIuT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbgorICAgIHB1YmxpYyBBbGxTU1RhYmxlT3BTdGF0dXMgcGVyZm9ybVZlcmlmeShDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIElWZXJpZmllci5PcHRpb25zIG9wdGlvbnMpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uCiAgICAgewogICAgICAgICBhc3NlcnQgIWNmcy5pc0luZGV4KCk7CiAgICAgICAgIHJldHVybiBwYXJhbGxlbEFsbFNTVGFibGVPcGVyYXRpb24oY2ZzLCBuZXcgT25lU1NUYWJsZU9wZXJhdGlvbigpCkBAIC01NTEsNyArNTYxLDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgICAgIC8vIFNraXAgaWYgU1NUYWJsZSBjcmVhdGlvbiB0aW1lIGlzIHBhc3QgZ2l2ZW4gdGltZXN0YW1wCi0gICAgICAgICAgICBpZiAoc3N0YWJsZS5nZXRDcmVhdGlvblRpbWVGb3IoQ29tcG9uZW50LkRBVEEpID4gc2tpcElmT2xkZXJUaGFuVGltZXN0YW1wKQorICAgICAgICAgICAgaWYgKHNzdGFibGUuZ2V0RGF0YUNyZWF0aW9uVGltZSgpID4gc2tpcElmT2xkZXJUaGFuVGltZXN0YW1wKQogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICAgICAgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSA9IGNmcy5tZXRhZGF0YS5nZXQoKTsKQEAgLTYzNiw4ICs2NDYsOCBAQAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIlNraXBwaW5nIHt9IChbe30sIHt9XSkgZm9yIGNsZWFudXA7IGFsbCByb3dzIHNob3VsZCBiZSBrZXB0LiBOZWVkcyBjbGVhbnVwIGZ1bGwgcmFuZ2VzOiB7fSBOZWVkcyBjbGVhbnVwIHRyYW5zaWVudCByYW5nZXM6IHt9IFJlcGFpcmVkOiB7fSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5maXJzdC5nZXRUb2tlbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5sYXN0LmdldFRva2VuKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmdldEZpcnN0KCkuZ2V0VG9rZW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuZ2V0TGFzdCgpLmdldFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkc0NsZWFudXBGdWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZHNDbGVhbnVwVHJhbnNpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5pc1JlcGFpcmVkKCkpOwpAQCAtOTAwLDcgKzkxMCw3IEBACiAgICAgICAgIExpc3Q8UmFuZ2U8VG9rZW4+PiBub3JtYWxpemVkUmFuZ2VzID0gUmFuZ2Uubm9ybWFsaXplKHJhbmdlcy5yYW5nZXMoKSk7CiAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEJvdW5kczxUb2tlbj4gYm91bmRzID0gbmV3IEJvdW5kczw+KHNzdGFibGUuZmlyc3QuZ2V0VG9rZW4oKSwgc3N0YWJsZS5sYXN0LmdldFRva2VuKCkpOworICAgICAgICAgICAgQWJzdHJhY3RCb3VuZHM8VG9rZW4+IGJvdW5kcyA9IHNzdGFibGUuZ2V0Qm91bmRzKCk7CiAKICAgICAgICAgICAgIGlmICghSXRlcmFibGVzLmFueShub3JtYWxpemVkUmFuZ2VzLCByIC0+IChyLmNvbnRhaW5zKGJvdW5kcy5sZWZ0KSAmJiByLmNvbnRhaW5zKGJvdW5kcy5yaWdodCkpIHx8IHIuaW50ZXJzZWN0cyhib3VuZHMpKSkKICAgICAgICAgICAgIHsKQEAgLTkyMiwxMiArOTMyLDEyIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IHNzdGFibGVJdGVyYXRvci5uZXh0KCk7CiAKLSAgICAgICAgICAgIEJvdW5kczxUb2tlbj4gc3N0YWJsZUJvdW5kcyA9IG5ldyBCb3VuZHM8Pihzc3RhYmxlLmZpcnN0LmdldFRva2VuKCksIHNzdGFibGUubGFzdC5nZXRUb2tlbigpKTsKKyAgICAgICAgICAgIEFic3RyYWN0Qm91bmRzPFRva2VuPiBzc3RhYmxlQm91bmRzID0gc3N0YWJsZS5nZXRCb3VuZHMoKTsKIAogICAgICAgICAgICAgZm9yIChSYW5nZTxUb2tlbj4gciA6IG5vcm1hbGl6ZWRSYW5nZXMpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy8gcmFuZ2VzIGFyZSBub3JtYWxpemVkIC0gbm8gd3JhcCBhcm91bmQgLSBpZiBmaXJzdCBhbmQgbGFzdCBhcmUgY29udGFpbmVkIHdlIGtub3cgdGhhdCBhbGwgdG9rZW5zIGFyZSBjb250YWluZWQgaW4gdGhlIHJhbmdlCi0gICAgICAgICAgICAgICAgaWYgKHIuY29udGFpbnMoc3N0YWJsZS5maXJzdC5nZXRUb2tlbigpKSAmJiByLmNvbnRhaW5zKHNzdGFibGUubGFzdC5nZXRUb2tlbigpKSkKKyAgICAgICAgICAgICAgICBpZiAoci5jb250YWlucyhzc3RhYmxlLmdldEZpcnN0KCkuZ2V0VG9rZW4oKSkgJiYgci5jb250YWlucyhzc3RhYmxlLmdldExhc3QoKS5nZXRUb2tlbigpKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJ7fSBTU1RhYmxlIHt9IGZ1bGx5IGNvbnRhaW5lZCBpbiByYW5nZSB7fSwgbXV0YXRpbmcgcmVwYWlyZWRBdCBpbnN0ZWFkIG9mIGFudGljb21wYWN0aW5nIiwgUHJldmlld0tpbmQuTk9ORS5sb2dQcmVmaXgocGFyZW50UmVwYWlyU2Vzc2lvbiksIHNzdGFibGUsIHIpOwogICAgICAgICAgICAgICAgICAgICBmdWxseUNvbnRhaW5lZFNTVGFibGVzLmFkZChzc3RhYmxlKTsKQEAgLTk1MSwxMCArOTYxLDE2IEBACiAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gdGhlIHRhc2tzIGFyZSBleGVjdXRlZCBpbiBwYXJhbGxlbCBvbiB0aGUgZXhlY3V0b3IsIG1ha2luZyBzdXJlIHRoYXQgdGhleSBnZXQgY2xvc2VkCiAgICAgcHVibGljIExpc3Q8RnV0dXJlPD8+PiBzdWJtaXRNYXhpbWFsKGZpbmFsIENvbHVtbkZhbWlseVN0b3JlIGNmU3RvcmUsIGZpbmFsIGludCBnY0JlZm9yZSwgYm9vbGVhbiBzcGxpdE91dHB1dCkKICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3VibWl0TWF4aW1hbChjZlN0b3JlLCBnY0JlZm9yZSwgc3BsaXRPdXRwdXQsIE9wZXJhdGlvblR5cGUuTUFKT1JfQ09NUEFDVElPTik7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKKyAgICBwdWJsaWMgTGlzdDxGdXR1cmU8Pz4+IHN1Ym1pdE1heGltYWwoZmluYWwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZTdG9yZSwgZmluYWwgaW50IGdjQmVmb3JlLCBib29sZWFuIHNwbGl0T3V0cHV0LCBPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUpCisgICAgewogICAgICAgICAvLyBoZXJlIHdlIGNvbXB1dGUgdGhlIHRhc2sgb2ZmIHRoZSBjb21wYWN0aW9uIGV4ZWN1dG9yLCBzbyBoYXZpbmcgdGhhdCBwcmVzZW50IGRvZXNuJ3QKICAgICAgICAgLy8gY29uZnVzZSBydW5XaXRoQ29tcGFjdGlvbnNEaXNhYmxlZCAtLSBpLmUuLCB3ZSBkb24ndCB3YW50IHRvIGRlYWRsb2NrIG91cnNlbHZlcywgd2FpdGluZwogICAgICAgICAvLyBmb3Igb3Vyc2VsdmVzIHRvIGZpbmlzaC9hY2tub3dsZWRnZSBjYW5jZWxsYXRpb24gYmVmb3JlIGNvbnRpbnVpbmcuCi0gICAgICAgIENvbXBhY3Rpb25UYXNrcyB0YXNrcyA9IGNmU3RvcmUuZ2V0Q29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlcigpLmdldE1heGltYWxUYXNrcyhnY0JlZm9yZSwgc3BsaXRPdXRwdXQpOworICAgICAgICBDb21wYWN0aW9uVGFza3MgdGFza3MgPSBjZlN0b3JlLmdldENvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIoKS5nZXRNYXhpbWFsVGFza3MoZ2NCZWZvcmUsIHNwbGl0T3V0cHV0LCBvcGVyYXRpb25UeXBlKTsKIAogICAgICAgICBpZiAodGFza3MuaXNFbXB0eSgpKQogICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwpAQCAtOTk5LDYgKzEwMTUsNyBAQAogCiAgICAgICAgIHRyeSAoQ29tcGFjdGlvblRhc2tzIHRhc2tzID0gY2ZTdG9yZS5ydW5XaXRoQ29tcGFjdGlvbnNEaXNhYmxlZCh0YXNrQ3JlYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGVzUHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uVHlwZS5NQUpPUl9DT01QQUNUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSkKQEAgLTEwMTIsNyArMTAyOSwxMCBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgZm9yIChBYnN0cmFjdENvbXBhY3Rpb25UYXNrIHRhc2sgOiB0YXNrcykKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXNrICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5zZXRDb21wYWN0aW9uVHlwZShPcGVyYXRpb25UeXBlLk1BSk9SX0NPTVBBQ1RJT04pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suZXhlY3V0ZShhY3RpdmUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH07CiAKQEAgLTEwMzMsNyArMTA1Myw3IEBACiAgICAgewogICAgICAgICBmb3JjZUNvbXBhY3Rpb24oY2ZTdG9yZSwKICAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IHNzdGFibGVzSW5Cb3VuZHMoY2ZTdG9yZSwgcmFuZ2VzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUgLT4gbmV3IEJvdW5kczw+KHNzdGFibGUuZmlyc3QuZ2V0VG9rZW4oKSwgc3N0YWJsZS5sYXN0LmdldFRva2VuKCkpLmludGVyc2VjdHMocmFuZ2VzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlIC0+IHNzdGFibGUuZ2V0Qm91bmRzKCkuaW50ZXJzZWN0cyhyYW5nZXMpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwNzEsNyArMTA5MSwxMiBAQAogCiAgICAgcHVibGljIHZvaWQgZm9yY2VDb21wYWN0aW9uRm9yS2V5KENvbHVtbkZhbWlseVN0b3JlIGNmU3RvcmUsIERlY29yYXRlZEtleSBrZXkpCiAgICAgewotICAgICAgICBmb3JjZUNvbXBhY3Rpb24oY2ZTdG9yZSwgKCkgLT4gc3N0YWJsZXNXaXRoS2V5KGNmU3RvcmUsIGtleSksIHNzdGFibGUgLT4gc3N0YWJsZS5tYXliZVByZXNlbnQoa2V5KSk7CisgICAgICAgIGZvcmNlQ29tcGFjdGlvbihjZlN0b3JlLCAoKSAtPiBzc3RhYmxlc1dpdGhLZXkoY2ZTdG9yZSwga2V5KSwgUHJlZGljYXRlcy5hbHdheXNUcnVlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZvcmNlQ29tcGFjdGlvbkZvcktleXMoQ29sdW1uRmFtaWx5U3RvcmUgY2ZTdG9yZSwgQ29sbGVjdGlvbjxEZWNvcmF0ZWRLZXk+IGtleXMpCisgICAgeworICAgICAgICBmb3JjZUNvbXBhY3Rpb24oY2ZTdG9yZSwgKCkgLT4gc3N0YWJsZXNXaXRoS2V5cyhjZlN0b3JlLCBrZXlzKSwgUHJlZGljYXRlcy5hbHdheXNUcnVlKCkpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXNXaXRoS2V5KENvbHVtbkZhbWlseVN0b3JlIGNmcywgRGVjb3JhdGVkS2V5IGtleSkKQEAgLTEwODEsMTIgKzExMDYsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleS5nZXRUb2tlbigpLm1heEtleUJvdW5kKCkpOwogICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGxpdmVUYWJsZXMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzc3RhYmxlLm1heWJlUHJlc2VudChrZXkpKQorICAgICAgICAgICAgaWYgKHNzdGFibGUubWF5Q29udGFpbkFzc3VtaW5nS2V5SXNJblJhbmdlKGtleSkpCiAgICAgICAgICAgICAgICAgc3N0YWJsZXMuYWRkKHNzdGFibGUpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzc3RhYmxlcy5pc0VtcHR5KCkgPyBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSA6IHNzdGFibGVzOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXNXaXRoS2V5cyhDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIENvbGxlY3Rpb248RGVjb3JhdGVkS2V5PiBkZWNvcmF0ZWRLZXlzKQorICAgIHsKKyAgICAgICAgZmluYWwgU2V0PFNTVGFibGVSZWFkZXI+IHNzdGFibGVzID0gbmV3IEhhc2hTZXQ8PigpOworCisgICAgICAgIGZvciAoRGVjb3JhdGVkS2V5IGRlY29yYXRlZEtleSA6IGRlY29yYXRlZEtleXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNzdGFibGVzLmFkZEFsbChzc3RhYmxlc1dpdGhLZXkoY2ZzLCBkZWNvcmF0ZWRLZXkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzc3RhYmxlczsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBmb3JjZVVzZXJEZWZpbmVkQ29tcGFjdGlvbihTdHJpbmcgZGF0YUZpbGVzKQogICAgIHsKICAgICAgICAgU3RyaW5nW10gZmlsZW5hbWVzID0gZGF0YUZpbGVzLnNwbGl0KCIsIik7CkBAIC0xMDk1LDcgKzExMzIsNyBAQAogICAgICAgICBmb3IgKFN0cmluZyBmaWxlbmFtZSA6IGZpbGVuYW1lcykKICAgICAgICAgewogICAgICAgICAgICAgLy8gZXh0cmFjdCBrZXlzcGFjZSBhbmQgY29sdW1uZmFtaWx5IG5hbWUgZnJvbSBmaWxlbmFtZQotICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gRGVzY3JpcHRvci5mcm9tRmlsZW5hbWUoZmlsZW5hbWUudHJpbSgpKTsKKyAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzYyA9IERlc2NyaXB0b3IuZnJvbUZpbGVXaXRoQ29tcG9uZW50KG5ldyBGaWxlKGZpbGVuYW1lLnRyaW0oKSksIGZhbHNlKS5sZWZ0OwogICAgICAgICAgICAgaWYgKFNjaGVtYS5pbnN0YW5jZS5nZXRUYWJsZU1ldGFkYXRhUmVmKGRlc2MpID09IG51bGwpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIlNjaGVtYSBkb2VzIG5vdCBleGlzdCBmb3IgZmlsZSB7fS4gU2tpcHBpbmcuIiwgZmlsZW5hbWUpOwpAQCAtMTEyMSw3ICsxMTU4LDcgQEAKICAgICAgICAgZm9yIChTdHJpbmcgZmlsZW5hbWUgOiBmaWxlbmFtZXMpCiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIGV4dHJhY3Qga2V5c3BhY2UgYW5kIGNvbHVtbmZhbWlseSBuYW1lIGZyb20gZmlsZW5hbWUKLSAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzYyA9IERlc2NyaXB0b3IuZnJvbUZpbGVuYW1lKGZpbGVuYW1lLnRyaW0oKSk7CisgICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBEZXNjcmlwdG9yLmZyb21GaWxlV2l0aENvbXBvbmVudChuZXcgRmlsZShmaWxlbmFtZS50cmltKCkpLCBmYWxzZSkubGVmdDsKICAgICAgICAgICAgIGlmIChTY2hlbWEuaW5zdGFuY2UuZ2V0VGFibGVNZXRhZGF0YVJlZihkZXNjKSA9PSBudWxsKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJTY2hlbWEgZG9lcyBub3QgZXhpc3QgZm9yIGZpbGUge30uIFNraXBwaW5nLiIsIGZpbGVuYW1lKTsKQEAgLTEyNDIsMTEgKzEyNzksMTEgQEAKICAgICB9CiAKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICB2b2lkIHNjcnViT25lKENvbHVtbkZhbWlseVN0b3JlIGNmcywgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gbW9kaWZpZXIsIGJvb2xlYW4gc2tpcENvcnJ1cHRlZCwgYm9vbGVhbiBjaGVja0RhdGEsIGJvb2xlYW4gcmVpbnNlcnRPdmVyZmxvd2VkVFRMLCBBY3RpdmVDb21wYWN0aW9uc1RyYWNrZXIgYWN0aXZlQ29tcGFjdGlvbnMpCisgICAgdm9pZCBzY3J1Yk9uZShDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIExpZmVjeWNsZVRyYW5zYWN0aW9uIG1vZGlmaWVyLCBJU2NydWJiZXIuT3B0aW9ucyBvcHRpb25zLCBBY3RpdmVDb21wYWN0aW9uc1RyYWNrZXIgYWN0aXZlQ29tcGFjdGlvbnMpCiAgICAgewogICAgICAgICBDb21wYWN0aW9uSW5mby5Ib2xkZXIgc2NydWJJbmZvID0gbnVsbDsKLQotICAgICAgICB0cnkgKFNjcnViYmVyIHNjcnViYmVyID0gbmV3IFNjcnViYmVyKGNmcywgbW9kaWZpZXIsIHNraXBDb3JydXB0ZWQsIGNoZWNrRGF0YSwgcmVpbnNlcnRPdmVyZmxvd2VkVFRMKSkKKyAgICAgICAgU1NUYWJsZUZvcm1hdCBmb3JtYXQgPSBtb2RpZmllci5vbmx5T25lKCkuZGVzY3JpcHRvci5nZXRGb3JtYXQoKTsKKyAgICAgICAgdHJ5IChJU2NydWJiZXIgc2NydWJiZXIgPSBmb3JtYXQuZ2V0U2NydWJiZXIoY2ZzLCBtb2RpZmllciwgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIG9wdGlvbnMpKQogICAgICAgICB7CiAgICAgICAgICAgICBzY3J1YkluZm8gPSBzY3J1YmJlci5nZXRTY3J1YkluZm8oKTsKICAgICAgICAgICAgIGFjdGl2ZUNvbXBhY3Rpb25zLmJlZ2luQ29tcGFjdGlvbihzY3J1YkluZm8pOwpAQCAtMTI2MCwxMSArMTI5NywxMCBAQAogICAgIH0KIAogICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHZvaWQgdmVyaWZ5T25lKENvbHVtbkZhbWlseVN0b3JlIGNmcywgU1NUYWJsZVJlYWRlciBzc3RhYmxlLCBWZXJpZmllci5PcHRpb25zIG9wdGlvbnMsIEFjdGl2ZUNvbXBhY3Rpb25zVHJhY2tlciBhY3RpdmVDb21wYWN0aW9ucykKKyAgICB2b2lkIHZlcmlmeU9uZShDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgSVZlcmlmaWVyLk9wdGlvbnMgb3B0aW9ucywgQWN0aXZlQ29tcGFjdGlvbnNUcmFja2VyIGFjdGl2ZUNvbXBhY3Rpb25zKQogICAgIHsKICAgICAgICAgQ29tcGFjdGlvbkluZm8uSG9sZGVyIHZlcmlmeUluZm8gPSBudWxsOwotCi0gICAgICAgIHRyeSAoVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoY2ZzLCBzc3RhYmxlLCBmYWxzZSwgb3B0aW9ucykpCisgICAgICAgIHRyeSAoSVZlcmlmaWVyIHZlcmlmaWVyID0gc3N0YWJsZS5nZXRWZXJpZmllcihjZnMsIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBmYWxzZSwgb3B0aW9ucykpCiAgICAgICAgIHsKICAgICAgICAgICAgIHZlcmlmeUluZm8gPSB2ZXJpZmllci5nZXRWZXJpZnlJbmZvKCk7CiAgICAgICAgICAgICBhY3RpdmVDb21wYWN0aW9ucy5iZWdpbkNvbXBhY3Rpb24odmVyaWZ5SW5mbyk7CkBAIC0xMjk1LDcgKzEzMzEsNyBAQAogICAgICAgICAvLyBzZWUgaWYgdGhlcmUgYXJlIGFueSBrZXlzIExURSB0aGUgdG9rZW4gZm9yIHRoZSBzdGFydCBvZiB0aGUgZmlyc3QgcmFuZ2UKICAgICAgICAgLy8gKHRva2VuIHJhbmdlIG93bmVyc2hpcCBpcyBleGNsdXNpdmUgb24gdGhlIExIUy4pCiAgICAgICAgIFJhbmdlPFRva2VuPiBmaXJzdFJhbmdlID0gc29ydGVkUmFuZ2VzLmdldCgwKTsKLSAgICAgICAgaWYgKHNzdGFibGUuZmlyc3QuZ2V0VG9rZW4oKS5jb21wYXJlVG8oZmlyc3RSYW5nZS5sZWZ0KSA8PSAwKQorICAgICAgICBpZiAoc3N0YWJsZS5nZXRGaXJzdCgpLmdldFRva2VuKCkuY29tcGFyZVRvKGZpcnN0UmFuZ2UubGVmdCkgPD0gMCkKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogCiAgICAgICAgIC8vIHRoZW4sIGl0ZXJhdGUgb3ZlciBhbGwgb3duZWQgcmFuZ2VzIGFuZCBzZWUgaWYgdGhlIG5leHQga2V5IGJleW9uZCB0aGUgZW5kIG9mIHRoZSBvd25lZApAQCAtMTM1MSwxMSArMTM4NywxMSBAQAogICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSB0eG4ub25seU9uZSgpOwogCiAgICAgICAgIC8vIGlmIHJhbmdlcyBpcyBlbXB0eSBhbmQgbm8gaW5kZXgsIGVudGlyZSBzc3RhYmxlIGlzIGRpc2NhcmRlZAotICAgICAgICBpZiAoIWhhc0luZGV4ZXMgJiYgIW5ldyBCb3VuZHM8Pihzc3RhYmxlLmZpcnN0LmdldFRva2VuKCksIHNzdGFibGUubGFzdC5nZXRUb2tlbigpKS5pbnRlcnNlY3RzKGFsbFJhbmdlcykpCisgICAgICAgIGlmICghaGFzSW5kZXhlcyAmJiAhc3N0YWJsZS5nZXRCb3VuZHMoKS5pbnRlcnNlY3RzKGFsbFJhbmdlcykpCiAgICAgICAgIHsKICAgICAgICAgICAgIHR4bi5vYnNvbGV0ZU9yaWdpbmFscygpOwogICAgICAgICAgICAgdHhuLmZpbmlzaCgpOwotICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlNTVGFibGUge30gKFt7fSwge31dKSBkb2VzIG5vdCBpbnRlcnNlY3QgdGhlIG93bmVkIHJhbmdlcyAoe30pLCBkcm9wcGluZyBpdCIsIHNzdGFibGUsIHNzdGFibGUuZmlyc3QuZ2V0VG9rZW4oKSwgc3N0YWJsZS5sYXN0LmdldFRva2VuKCksIGFsbFJhbmdlcyk7CisgICAgICAgICAgICBsb2dnZXIuaW5mbygiU1NUYWJsZSB7fSAoW3t9LCB7fV0pIGRvZXMgbm90IGludGVyc2VjdCB0aGUgb3duZWQgcmFuZ2VzICh7fSksIGRyb3BwaW5nIGl0Iiwgc3N0YWJsZSwgc3N0YWJsZS5nZXRGaXJzdCgpLmdldFRva2VuKCksIHNzdGFibGUuZ2V0TGFzdCgpLmdldFRva2VuKCksIGFsbFJhbmdlcyk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMTM5MSw2ICsxNDI3LDcgQEAKIAogICAgICAgICAgICAgd2hpbGUgKGNpLmhhc05leHQoKSkKICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaS5zZXRUYXJnZXREaXJlY3Rvcnkod3JpdGVyLmN1cnJlbnRXcml0ZXIoKS5nZXRGaWxlbmFtZSgpKTsKICAgICAgICAgICAgICAgICB0cnkgKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBwYXJ0aXRpb24gPSBjaS5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICBVbmZpbHRlcmVkUm93SXRlcmF0b3Igbm90Q2xlYW5lZCA9IGNsZWFudXBTdHJhdGVneS5jbGVhbnVwKHBhcnRpdGlvbikpCiAgICAgICAgICAgICAgICAgewpAQCAtMTU1NCwxNiArMTU5MSwxOCBAQAogICAgIHsKICAgICAgICAgRmlsZVV0aWxzLmNyZWF0ZURpcmVjdG9yeShjb21wYWN0aW9uRmlsZUxvY2F0aW9uKTsKIAotICAgICAgICByZXR1cm4gU1NUYWJsZVdyaXRlci5jcmVhdGUoY2ZzLm1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLm5ld1NTVGFibGVEZXNjcmlwdG9yKGNvbXBhY3Rpb25GaWxlTG9jYXRpb24pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRCbG9vbUZpbHRlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBhaXJlZEF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1JlcGFpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVHJhbnNpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5nZXRTU1RhYmxlTGV2ZWwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuaGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLmluZGV4TWFuYWdlci5saXN0SW5kZXhlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhuKTsKKyAgICAgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gY2ZzLm5ld1NTVGFibGVEZXNjcmlwdG9yKGNvbXBhY3Rpb25GaWxlTG9jYXRpb24pOworICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5nZXRGb3JtYXQoKS5nZXRXcml0ZXJGYWN0b3J5KCkuYnVpbGRlcihkZXNjcmlwdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRLZXlDb3VudChleHBlY3RlZEJsb29tRmlsdGVyU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UmVwYWlyZWRBdChyZXBhaXJlZEF0KQorICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQZW5kaW5nUmVwYWlyKHBlbmRpbmdSZXBhaXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRyYW5zaWVudFNTVGFibGUoaXNUcmFuc2llbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRhYmxlTWV0YWRhdGFSZWYoY2ZzLm1ldGFkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNZXRhZGF0YUNvbGxlY3RvcihuZXcgTWV0YWRhdGFDb2xsZWN0b3IoY2ZzLm1ldGFkYXRhKCkuY29tcGFyYXRvcikuc3N0YWJsZUxldmVsKHNzdGFibGUuZ2V0U1NUYWJsZUxldmVsKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTZXJpYWxpemF0aW9uSGVhZGVyKHNzdGFibGUuaGVhZGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGREZWZhdWx0Q29tcG9uZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEZsdXNoT2JzZXJ2ZXJzRm9yU2Vjb25kYXJ5SW5kZXhlcyhjZnMuaW5kZXhNYW5hZ2VyLmxpc3RJbmRleGVzKCksIHR4bi5vcFR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQodHhuLCBjZnMpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZVdyaXRlciBjcmVhdGVXcml0ZXJGb3JBbnRpQ29tcGFjdGlvbihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsCkBAIC0xNTkxLDE2ICsxNjMwLDE5IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFNTVGFibGVXcml0ZXIuY3JlYXRlKGNmcy5uZXdTU1RhYmxlRGVzY3JpcHRvcihjb21wYWN0aW9uRmlsZUxvY2F0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBleHBlY3RlZEJsb29tRmlsdGVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGFpcmVkQXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nUmVwYWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUcmFuc2llbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMubWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWV0YWRhdGFDb2xsZWN0b3Ioc3N0YWJsZXMsIGNmcy5tZXRhZGF0YSgpLmNvbXBhcmF0b3IsIG1pbkxldmVsKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIubWFrZShjZnMubWV0YWRhdGEoKSwgc3N0YWJsZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLmluZGV4TWFuYWdlci5saXN0SW5kZXhlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhuKTsKKworICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBjZnMubmV3U1NUYWJsZURlc2NyaXB0b3IoY29tcGFjdGlvbkZpbGVMb2NhdGlvbik7CisgICAgICAgIHJldHVybiBkZXNjcmlwdG9yLmdldEZvcm1hdCgpLmdldFdyaXRlckZhY3RvcnkoKS5idWlsZGVyKGRlc2NyaXB0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEtleUNvdW50KGV4cGVjdGVkQmxvb21GaWx0ZXJTaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRSZXBhaXJlZEF0KHJlcGFpcmVkQXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBlbmRpbmdSZXBhaXIocGVuZGluZ1JlcGFpcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VHJhbnNpZW50U1NUYWJsZShpc1RyYW5zaWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGFibGVNZXRhZGF0YVJlZihjZnMubWV0YWRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1ldGFkYXRhQ29sbGVjdG9yKG5ldyBNZXRhZGF0YUNvbGxlY3Rvcihzc3RhYmxlcywgY2ZzLm1ldGFkYXRhKCkuY29tcGFyYXRvciwgbWluTGV2ZWwpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTZXJpYWxpemF0aW9uSGVhZGVyKFNlcmlhbGl6YXRpb25IZWFkZXIubWFrZShjZnMubWV0YWRhdGEoKSwgc3N0YWJsZXMpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGREZWZhdWx0Q29tcG9uZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEZsdXNoT2JzZXJ2ZXJzRm9yU2Vjb25kYXJ5SW5kZXhlcyhjZnMuaW5kZXhNYW5hZ2VyLmxpc3RJbmRleGVzKCksIHR4bi5vcFR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQodHhuLCBjZnMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTc0NSwxNSArMTc4NywxOCBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbENoZWNrZXIudGVzdCh0b2tlbikpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxXcml0ZXIuYXBwZW5kKHBhcnRpdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjaS5zZXRUYXJnZXREaXJlY3RvcnkoZnVsbFdyaXRlci5jdXJyZW50V3JpdGVyKCkuZ2V0RmlsZW5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHJhbnNDaGVja2VyLnRlc3QodG9rZW4pKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1dyaXRlci5hcHBlbmQocGFydGl0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNpLnNldFRhcmdldERpcmVjdG9yeSh0cmFuc1dyaXRlci5jdXJyZW50V3JpdGVyKCkuZ2V0RmlsZW5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGFwcGVuZCBpdCB0byB0aGUgdW5yZXBhaXJlZCBzc3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICB1bnJlcGFpcmVkV3JpdGVyLmFwcGVuZChwYXJ0aXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2kuc2V0VGFyZ2V0RGlyZWN0b3J5KHVucmVwYWlyZWRXcml0ZXIuY3VycmVudFdyaXRlcigpLmdldEZpbGVuYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGxvbmcgYnl0ZXNTY2FubmVkID0gc2Nhbm5lcnMuZ2V0VG90YWxCeXRlc1NjYW5uZWQoKTsKICAgICAgICAgICAgICAgICAgICAgY29tcGFjdGlvblJhdGVMaW1pdGVyQWNxdWlyZShsaW1pdGVyLCBieXRlc1NjYW5uZWQsIGxhc3RCeXRlc1NjYW5uZWQsIGNvbXByZXNzaW9uUmF0aW8pOwpAQCAtMTc4OCwxMCArMTgzMywxNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBDb21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb24gJiYgaXNDYW5jZWxsZWQuZ2V0QXNCb29sZWFuKCkpCisgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIENvbXBhY3Rpb25JbnRlcnJ1cHRlZEV4Y2VwdGlvbikKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiQW50aWNvbXBhY3Rpb24gaGFzIGJlZW4gY2FuY2VsZWQgZm9yIHNlc3Npb24ge30iLCBwZW5kaW5nUmVwYWlyKTsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgICAgIGlmIChpc0NhbmNlbGxlZC5nZXRBc0Jvb2xlYW4oKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJBbnRpY29tcGFjdGlvbiBoYXMgYmVlbiBjYW5jZWxlZCBmb3Igc2Vzc2lvbiB7fSIsIHBlbmRpbmdSZXBhaXIpOworICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiQW50aWNvbXBhY3Rpb24gZm9yIHNlc3Npb24ge30gaGFzIGJlZW4gc3RvcHBlZCBieSByZXF1ZXN0LiIsIHBlbmRpbmdSZXBhaXIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKQEAgLTE4MzMsNyArMTg4NSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH07CiAKLSAgICAgICAgcmV0dXJuIGV4ZWN1dG9yLnN1Ym1pdElmUnVubmluZyhydW5uYWJsZSwgImluZGV4IGJ1aWxkIik7CisgICAgICAgIHJldHVybiBzZWNvbmRhcnlJbmRleEV4ZWN1dG9yLnN1Ym1pdElmUnVubmluZyhydW5uYWJsZSwgImluZGV4IGJ1aWxkIik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xODgyLDIyICsxOTM0LDE2IEBACiAgICAgICAgIHJldHVybiBleGVjdXRvci5zdWJtaXRJZlJ1bm5pbmcocnVubmFibGUsICJjYWNoZSB3cml0ZSIpOwogICAgIH0KIAotICAgIHB1YmxpYyBMaXN0PFNTVGFibGVSZWFkZXI+IHJ1bkluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uKEluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uIHJlZGlzdHJpYnV0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICBwdWJsaWMgPFQsIEUgZXh0ZW5kcyBUaHJvd2FibGU+IFQgcnVuQXNBY3RpdmVDb21wYWN0aW9uKEhvbGRlciBhY3RpdmVDb21wYWN0aW9uSW5mbywgVGhyb3dpbmdTdXBwbGllcjxULCBFPiBjYWxsYWJsZSkgdGhyb3dzIEUKICAgICB7Ci0gICAgICAgIHJldHVybiBydW5JbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvbihyZWRpc3RyaWJ1dGlvbiwgYWN0aXZlKTsKLSAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBMaXN0PFNTVGFibGVSZWFkZXI+IHJ1bkluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uKEluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uIHJlZGlzdHJpYnV0aW9uLCBBY3RpdmVDb21wYWN0aW9uc1RyYWNrZXIgYWN0aXZlQ29tcGFjdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYWN0aXZlQ29tcGFjdGlvbnMuYmVnaW5Db21wYWN0aW9uKHJlZGlzdHJpYnV0aW9uKTsKKyAgICAgICAgYWN0aXZlLmJlZ2luQ29tcGFjdGlvbihhY3RpdmVDb21wYWN0aW9uSW5mbyk7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVkaXN0cmlidXRpb24ucmVkaXN0cmlidXRlU3VtbWFyaWVzKCk7CisgICAgICAgICAgICByZXR1cm4gY2FsbGFibGUuZ2V0KCk7CiAgICAgICAgIH0KICAgICAgICAgZmluYWxseQogICAgICAgICB7Ci0gICAgICAgICAgICBhY3RpdmVDb21wYWN0aW9ucy5maW5pc2hDb21wYWN0aW9uKHJlZGlzdHJpYnV0aW9uKTsKKyAgICAgICAgICAgIGFjdGl2ZS5maW5pc2hDb21wYWN0aW9uKGFjdGl2ZUNvbXBhY3Rpb25JbmZvKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjA3Niw2ICsyMTIyLDEzIEBACiAgICAgICAgIG1ldHJpY3Muc3N0YWJsZXNEcm9wcHBlZEZyb21Db21wYWN0aW9ucy5pbmMobnVtKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZWNvbmRhcnlJbmRleEV4ZWN1dG9yIGV4dGVuZHMgQ29tcGFjdGlvbkV4ZWN1dG9yCisgICAgeworICAgICAgICBwdWJsaWMgU2Vjb25kYXJ5SW5kZXhFeGVjdXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKERhdGFiYXNlRGVzY3JpcHRvci5nZXRDb25jdXJyZW50SW5kZXhCdWlsZGVycygpLCAiU2Vjb25kYXJ5SW5kZXhFeGVjdXRvciIsIEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIHB1YmxpYyBMaXN0PE1hcDxTdHJpbmcsIFN0cmluZz4+IGdldENvbXBhY3Rpb25zKCkKICAgICB7CkBAIC0yMjgzLDYgKzIzMzYsMjQgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyBMaXN0PEhvbGRlcj4gZ2V0Q29tcGFjdGlvbnNNYXRjaGluZyhJdGVyYWJsZTxUYWJsZU1ldGFkYXRhPiBjb2x1bW5GYW1pbGllcywgUHJlZGljYXRlPENvbXBhY3Rpb25JbmZvPiBwcmVkaWNhdGUpCisgICAgeworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQoY29sdW1uRmFtaWxpZXMgIT0gbnVsbCwgIkF0dGVtcHRlZCB0byBnZXRDb21wYWN0aW9uc01hdGNoaW5nIGluIENvbXBhY3Rpb25NYW5hZ2VyIHdpdGggbm8gY29sdW1uRmFtaWxpZXMgc3BlY2lmaWVkLiIpOworCisgICAgICAgIExpc3Q8SG9sZGVyPiBtYXRjaGVkID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIC8vIGNvbnNpZGVyIGFsbCBpbi1wcm9ncmVzcyBjb21wYWN0aW9ucworICAgICAgICBmb3IgKEhvbGRlciBob2xkZXIgOiBhY3RpdmUuZ2V0Q29tcGFjdGlvbnMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgQ29tcGFjdGlvbkluZm8gaW5mbyA9IGhvbGRlci5nZXRDb21wYWN0aW9uSW5mbygpOworICAgICAgICAgICAgaWYgKGluZm8uZ2V0VGFibGVNZXRhZGF0YSgpID09IG51bGwgfHwgSXRlcmFibGVzLmNvbnRhaW5zKGNvbHVtbkZhbWlsaWVzLCBpbmZvLmdldFRhYmxlTWV0YWRhdGEoKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHByZWRpY2F0ZS50ZXN0KGluZm8pKQorICAgICAgICAgICAgICAgICAgICBtYXRjaGVkLmFkZChob2xkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtYXRjaGVkOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFRyeSB0byBzdG9wIGFsbCBvZiB0aGUgY29tcGFjdGlvbnMgZm9yIGdpdmVuIENvbHVtbkZhbWlsaWVzLgogICAgICAqCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25TdHJhdGVneUhvbGRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uU3RyYXRlZ3lIb2xkZXIuamF2YQppbmRleCBjYWIwYWYwLi4yOWU4YzI5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25TdHJhdGVneUhvbGRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvblN0cmF0ZWd5SG9sZGVyLmphdmEKQEAgLTI2MSw0ICsyNjEsMTQgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBJdGVyYWJsZXMuYW55KHN0cmF0ZWdpZXMsIGFjcyAtPiBhY3MuZ2V0U1NUYWJsZXMoKS5jb250YWlucyhzc3RhYmxlKSk7CiAgICAgfQorCisgICAgcHVibGljIGludCBnZXRFc3RpbWF0ZWRSZW1haW5pbmdUYXNrcygpCisgICAgeworICAgICAgICBpbnQgdGFza3MgPSAwOworICAgICAgICBmb3IgKEFic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5IHN0cmF0ZWd5IDogc3RyYXRlZ2llcykKKyAgICAgICAgeworICAgICAgICAgICAgdGFza3MgKz0gc3RyYXRlZ3kuZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGFza3M7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIuamF2YQppbmRleCA1ZTFkNTYxLi5lYTMxMmJjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIuamF2YQpAQCAtMjMsMjEgKzIzLDI1IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbVN1cHBvcnQ7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLkxvbmdzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCkBAIC01NCwxNCArNTgsMTUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LkluZGV4OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklTU1RhYmxlU2Nhbm5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlTXVsdGlXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbGxlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLlN0YXRzTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5vdGlmaWNhdGlvbnMuSU5vdGlmaWNhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLklOb3RpZmljYXRpb25Db25zdW1lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLlNTVGFibGVBZGRlZE5vdGlmaWNhdGlvbjsKQEAgLTcxLDcgKzc2LDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLlNTVGFibGVSZXBhaXJTdGF0dXNDaGFuZ2VkOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnJlcGFpci5jb25zaXN0ZW50LmFkbWluLkNsZWFudXBTdW1tYXJ5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wYWN0aW9uUGFyYW1zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQWN0aXZlUmVwYWlyU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKIApAQCAtMTQxLDYgKzE0NSw4IEBACiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBsb25nIG1heFNTVGFibGVTaXplQnl0ZXM7CiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBTdHJpbmcgbmFtZTsKIAorICAgIHB1YmxpYyBzdGF0aWMgaW50IFRXQ1NfQlVDS0VUX0NPVU5UX01BWCA9IDEyODsKKwogICAgIHB1YmxpYyBDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyKENvbHVtbkZhbWlseVN0b3JlIGNmcykKICAgICB7CiAgICAgICAgIHRoaXMoY2ZzLCBjZnM6OmdldERpc2tCb3VuZGFyaWVzLCBjZnMuZ2V0UGFydGl0aW9uZXIoKS5zcGxpdHRlcigpLmlzUHJlc2VudCgpKTsKQEAgLTE3NCw5ICsxODAsMTIgQEAKICAgICAgICAgdGhpcy5jb21wYWN0aW9uTG9nZ2VyID0gbmV3IENvbXBhY3Rpb25Mb2dnZXIoY2ZzLCB0aGlzKTsKICAgICAgICAgdGhpcy5ib3VuZGFyaWVzU3VwcGxpZXIgPSBib3VuZGFyaWVzU3VwcGxpZXI7CiAgICAgICAgIHRoaXMucGFydGl0aW9uU1NUYWJsZXNCeVRva2VuUmFuZ2UgPSBwYXJ0aXRpb25TU1RhYmxlc0J5VG9rZW5SYW5nZTsKLSAgICAgICAgcGFyYW1zID0gY2ZzLm1ldGFkYXRhKCkucGFyYW1zLmNvbXBhY3Rpb247CisKKyAgICAgICAgY3VycmVudEJvdW5kYXJpZXMgPSBib3VuZGFyaWVzU3VwcGxpZXIuZ2V0KCk7CisgICAgICAgIHBhcmFtcyA9IHNjaGVtYUNvbXBhY3Rpb25QYXJhbXMgPSBjZnMubWV0YWRhdGEoKS5wYXJhbXMuY29tcGFjdGlvbjsKICAgICAgICAgZW5hYmxlZCA9IHBhcmFtcy5pc0VuYWJsZWQoKTsKLSAgICAgICAgcmVsb2FkKGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5jb21wYWN0aW9uKTsKKyAgICAgICAgc2V0U3RyYXRlZ3koc2NoZW1hQ29tcGFjdGlvblBhcmFtcyk7CisgICAgICAgIHN0YXJ0dXAoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI0Myw4ICsyNTIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihzIC0+ICFjb21wYWN0aW5nLmNvbnRhaW5zKHMpICYmICFzLmRlc2NyaXB0b3IudmVyc2lvbi5pc0xhdGVzdFZlcnNpb24oKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnRlZCgobzEsIG8yKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGYxID0gbmV3IEZpbGUobzEuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBmMiA9IG5ldyBGaWxlKG8yLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZjEgPSBvMS5kZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZjIgPSBvMi5kZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBMb25ncy5jb21wYXJlKGYxLmxhc3RNb2RpZmllZCgpLCBmMi5sYXN0TW9kaWZpZWQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CiAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogcG90ZW50aWFsVXBncmFkZSkKQEAgLTQ0OSwxOSArNDU4LDIwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBtYXliZVJlbG9hZChUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKQorICAgIC8qKgorICAgICAqIE1heWJlIHJlbG9hZCB0aGUgY29tcGFjdGlvbiBzdHJhdGVnaWVzLiBDYWxsZWQgYWZ0ZXIgY2hhbmdpbmcgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtYXliZVJlbG9hZFBhcmFtc0Zyb21TY2hlbWEoQ29tcGFjdGlvblBhcmFtcyBwYXJhbXMpCiAgICAgewogICAgICAgICAvLyBjb21wYXJlIHRoZSBvbGQgc2NoZW1hIGNvbmZpZ3VyYXRpb24gdG8gdGhlIG5ldyBvbmUsIGlnbm9yZSBhbnkgbG9jYWxseSBzZXQgY2hhbmdlcy4KLSAgICAgICAgaWYgKG1ldGFkYXRhLnBhcmFtcy5jb21wYWN0aW9uLmVxdWFscyhzY2hlbWFDb21wYWN0aW9uUGFyYW1zKSkKKyAgICAgICAgaWYgKHBhcmFtcy5lcXVhbHMoc2NoZW1hQ29tcGFjdGlvblBhcmFtcykpCiAgICAgICAgICAgICByZXR1cm47CiAKICAgICAgICAgd3JpdGVMb2NrLmxvY2soKTsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIGNvbXBhcmUgdGhlIG9sZCBzY2hlbWEgY29uZmlndXJhdGlvbiB0byB0aGUgbmV3IG9uZSwgaWdub3JlIGFueSBsb2NhbGx5IHNldCBjaGFuZ2VzLgotICAgICAgICAgICAgaWYgKG1ldGFkYXRhLnBhcmFtcy5jb21wYWN0aW9uLmVxdWFscyhzY2hlbWFDb21wYWN0aW9uUGFyYW1zKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICByZWxvYWQobWV0YWRhdGEucGFyYW1zLmNvbXBhY3Rpb24pOworICAgICAgICAgICAgaWYgKCFwYXJhbXMuZXF1YWxzKHNjaGVtYUNvbXBhY3Rpb25QYXJhbXMpKQorICAgICAgICAgICAgICAgIHJlbG9hZFBhcmFtc0Zyb21TY2hlbWEocGFyYW1zKTsKICAgICAgICAgfQogICAgICAgICBmaW5hbGx5CiAgICAgICAgIHsKQEAgLTQ3MCwxNyArNDgwLDg0IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQHBhcmFtIG5ld1BhcmFtcyBuZXcgQ29tcGFjdGlvblBhcmFtcyBzZXQgaW4gdmlhIENRTAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZWxvYWRQYXJhbXNGcm9tU2NoZW1hKENvbXBhY3Rpb25QYXJhbXMgbmV3UGFyYW1zKQorICAgIHsKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJSZWNyZWF0aW5nIGNvbXBhY3Rpb24gc3RyYXRlZ3kgZm9yIHt9Lnt9IC0gY29tcGFjdGlvbiBwYXJhbWV0ZXJzIGNoYW5nZWQgdmlhIENRTCIsCisgICAgICAgICAgICAgICAgICAgICBjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLCBjZnMuZ2V0VGFibGVOYW1lKCkpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEl0J3MgcG9zc2libGUgZm9yIGNvbXBhY3Rpb24gdG8gYmUgZXhwbGljaXRseSBlbmFibGVkL2Rpc2FibGVkCisgICAgICAgICAqIHZpYSBKTVggd2hlbiBhbHJlYWR5IGVuYWJsZWQvZGlzYWJsZWQgdmlhIHBhcmFtcy4gSW4gdGhhdCBjYXNlLAorICAgICAgICAgKiBpZiB3ZSBub3cgdG9nZ2xlIGVuYWJsZWQvZGlzYWJsZWQgdmlhIHBhcmFtcywgd2UnbGwgdGVjaG5pY2FsbHkKKyAgICAgICAgICogYmUgb3ZlcnJpZGluZyBKTVgtc2V0IHZhbHVlIHdpdGggcGFyYW1zLXNldCB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gZW5hYmxlZFdpdGhKTVggPSBlbmFibGVkICYmICFzaG91bGRCZUVuYWJsZWQoKTsKKyAgICAgICAgYm9vbGVhbiBkaXNhYmxlZFdpdGhKTVggPSAhZW5hYmxlZCAmJiBzaG91bGRCZUVuYWJsZWQoKTsKKworICAgICAgICBzY2hlbWFDb21wYWN0aW9uUGFyYW1zID0gbmV3UGFyYW1zOworICAgICAgICBzZXRTdHJhdGVneShuZXdQYXJhbXMpOworCisgICAgICAgIC8vIGVuYWJsZS9kaXNhYmxlIHZpYSBKTVggb3ZlcnJpZGVzIENRTCBwYXJhbXMsIGJ1dCBwbGVhc2Ugc2VlIHRoZSBjb21tZW50IGFib3ZlCisgICAgICAgIGlmIChlbmFibGVkICYmICFzaG91bGRCZUVuYWJsZWQoKSAmJiAhZW5hYmxlZFdpdGhKTVgpCisgICAgICAgICAgICBkaXNhYmxlKCk7CisgICAgICAgIGVsc2UgaWYgKCFlbmFibGVkICYmIHNob3VsZEJlRW5hYmxlZCgpICYmICFkaXNhYmxlZFdpdGhKTVgpCisgICAgICAgICAgICBlbmFibGUoKTsKKworICAgICAgICBzdGFydHVwKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG1heWJlUmVsb2FkUGFyYW1zRnJvbUpNWChDb21wYWN0aW9uUGFyYW1zIHBhcmFtcykKKyAgICB7CisgICAgICAgIC8vIGNvbXBhcmUgdGhlIG9sZCBsb2NhbCBjb25maWd1cmF0aW9uIHRvIHRoZSBuZXcgb25lLCBpZ25vcmluZyBzY2hlbWEKKyAgICAgICAgaWYgKHBhcmFtcy5lcXVhbHModGhpcy5wYXJhbXMpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHdyaXRlTG9jay5sb2NrKCk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXBhcmFtcy5lcXVhbHModGhpcy5wYXJhbXMpKQorICAgICAgICAgICAgICAgIHJlbG9hZFBhcmFtc0Zyb21KTVgocGFyYW1zKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlTG9jay51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBuZXdQYXJhbXMgbmV3IENvbXBhY3Rpb25QYXJhbXMgc2V0IHZpYSBKTVgKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVsb2FkUGFyYW1zRnJvbUpNWChDb21wYWN0aW9uUGFyYW1zIG5ld1BhcmFtcykKKyAgICB7CisgICAgICAgIGxvZ2dlci5kZWJ1ZygiUmVjcmVhdGluZyBjb21wYWN0aW9uIHN0cmF0ZWd5IGZvciB7fS57fSAtIGNvbXBhY3Rpb24gcGFyYW1ldGVycyBjaGFuZ2VkIHZpYSBKTVgiLAorICAgICAgICAgICAgICAgICAgICAgY2ZzLmtleXNwYWNlLmdldE5hbWUoKSwgY2ZzLmdldFRhYmxlTmFtZSgpKTsKKworICAgICAgICBzZXRTdHJhdGVneShuZXdQYXJhbXMpOworCisgICAgICAgIC8vIGNvbXBhY3Rpb24gcGFyYW1zIHNldCB2aWEgSk1YIG92ZXJyaWRlIGVuYWJsZS9kaXNhYmxlIHZpYSBKTVgKKyAgICAgICAgaWYgKGVuYWJsZWQgJiYgIXNob3VsZEJlRW5hYmxlZCgpKQorICAgICAgICAgICAgZGlzYWJsZSgpOworICAgICAgICBlbHNlIGlmICghZW5hYmxlZCAmJiBzaG91bGRCZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGVuYWJsZSgpOworCisgICAgICAgIHN0YXJ0dXAoKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhlIGRpc2sgYm91bmRhcmllcyBjaGFuZ2VkIGFuZCByZWxvYWRzIHRoZSBjb21wYWN0aW9uIHN0cmF0ZWdpZXMKICAgICAgKiB0byByZWZsZWN0IHRoZSBtb3N0IHVwLXRvLWRhdGUgZGlzayBib3VuZGFyaWVzLgotICAgICAqCisgICAgICogPHA+CiAgICAgICogVGhpcyBpcyB0eXBpY2FsbHkgY2FsbGVkIGJlZm9yZSBhY3F1aXJpbmcgdGhlIHtAbGluayB0aGlzI3JlYWRMb2NrfSB0byBlbnN1cmUgdGhlIG1vc3QgdXAtdG8tZGF0ZQogICAgICAqIGRpc2sgbG9jYXRpb25zIGFuZCBib3VuZGFyaWVzIGFyZSB1c2VkLgotICAgICAqCisgICAgICogPHA+CiAgICAgICogVGhpcyBzaG91bGQgKm5ldmVyKiBiZSBjYWxsZWQgaW5zaWRlIGJ5IGEgdGhyZWFkIGhvbGRpbmcgdGhlIHtAbGluayB0aGlzI3JlYWRMb2NrfSwgc2luY2UgaXQKICAgICAgKiB3aWxsIHBvdGVudGlhbGx5IGFjcXVpcmUgdGhlIHtAbGluayB0aGlzI3dyaXRlTG9ja30gdG8gdXBkYXRlIHRoZSBjb21wYWN0aW9uIHN0cmF0ZWdpZXMKICAgICAgKiB3aGF0IGNhbiBjYXVzZSBhIGRlYWRsb2NrLgorICAgICAqIDxwPgorICAgICAqIFRPRE86IGltcHJvdmUgdGhpcyB0byByZWxvYWQgYWZ0ZXIgcmVjZWl2aW5nIGEgbm90aWZpY2F0aW9uIHJhdGhlciB0aGFuIHRyeWluZyB0byByZWxvYWQgb24gZXZlcnkgb3BlcmF0aW9uCiAgICAgICovCi0gICAgLy9UT0RPIGltcHJvdmUgdGhpcyB0byByZWxvYWQgYWZ0ZXIgcmVjZWl2aW5nIGEgbm90aWZpY2F0aW9uIHJhdGhlciB0aGFuIHRyeWluZyB0byByZWxvYWQgb24gZXZlcnkgb3BlcmF0aW9uCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCiAgICAgcHJvdGVjdGVkIHZvaWQgbWF5YmVSZWxvYWREaXNrQm91bmRhcmllcygpCiAgICAgewpAQCAtNDkwLDkgKzU2Nyw4IEBACiAgICAgICAgIHdyaXRlTG9jay5sb2NrKCk7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWN1cnJlbnRCb3VuZGFyaWVzLmlzT3V0T2ZEYXRlKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgcmVsb2FkKHBhcmFtcyk7CisgICAgICAgICAgICBpZiAoY3VycmVudEJvdW5kYXJpZXMuaXNPdXRPZkRhdGUoKSkKKyAgICAgICAgICAgICAgICByZWxvYWREaXNrQm91bmRhcmllcyhib3VuZGFyaWVzU3VwcGxpZXIuZ2V0KCkpOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsbHkKICAgICAgICAgewpAQCAtNTAxLDM0ICs1NzcsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWxvYWQgdGhlIGNvbXBhY3Rpb24gc3RyYXRlZ2llcwotICAgICAqCi0gICAgICogQ2FsbGVkIGFmdGVyIGNoYW5naW5nIGNvbmZpZ3VyYXRpb24gYW5kIGF0IHN0YXJ0dXAuCi0gICAgICogQHBhcmFtIG5ld0NvbXBhY3Rpb25QYXJhbXMKKyAgICAgKiBAcGFyYW0gbmV3Qm91bmRhcmllcyBuZXcgRGlza0JvdW5kYXJpZXMgLSBwb3RlbnRpYWxseSBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBjdXJyZW50IG9uZXMKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVsb2FkKENvbXBhY3Rpb25QYXJhbXMgbmV3Q29tcGFjdGlvblBhcmFtcykKKyAgICBwcml2YXRlIHZvaWQgcmVsb2FkRGlza0JvdW5kYXJpZXMoRGlza0JvdW5kYXJpZXMgbmV3Qm91bmRhcmllcykKICAgICB7Ci0gICAgICAgIGJvb2xlYW4gZW5hYmxlZFdpdGhKTVggPSBlbmFibGVkICYmICFzaG91bGRCZUVuYWJsZWQoKTsKLSAgICAgICAgYm9vbGVhbiBkaXNhYmxlZFdpdGhKTVggPSAhZW5hYmxlZCAmJiBzaG91bGRCZUVuYWJsZWQoKTsKKyAgICAgICAgRGlza0JvdW5kYXJpZXMgb2xkQm91bmRhcmllcyA9IGN1cnJlbnRCb3VuZGFyaWVzOworICAgICAgICBjdXJyZW50Qm91bmRhcmllcyA9IG5ld0JvdW5kYXJpZXM7CiAKLSAgICAgICAgaWYgKGN1cnJlbnRCb3VuZGFyaWVzICE9IG51bGwpCisgICAgICAgIGlmIChuZXdCb3VuZGFyaWVzLmlzRXF1aXZhbGVudFRvKG9sZEJvdW5kYXJpZXMpKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIW5ld0NvbXBhY3Rpb25QYXJhbXMuZXF1YWxzKHNjaGVtYUNvbXBhY3Rpb25QYXJhbXMpKQotICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiUmVjcmVhdGluZyBjb21wYWN0aW9uIHN0cmF0ZWd5IC0gY29tcGFjdGlvbiBwYXJhbWV0ZXJzIGNoYW5nZWQgZm9yIHt9Lnt9IiwgY2ZzLmtleXNwYWNlLmdldE5hbWUoKSwgY2ZzLmdldFRhYmxlTmFtZSgpKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRCb3VuZGFyaWVzLmlzT3V0T2ZEYXRlKCkpCi0gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJSZWNyZWF0aW5nIGNvbXBhY3Rpb24gc3RyYXRlZ3kgLSBkaXNrIGJvdW5kYXJpZXMgYXJlIG91dCBvZiBkYXRlIGZvciB7fS57fS4iLCBjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLCBjZnMuZ2V0VGFibGVOYW1lKCkpOworICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJOb3QgcmVjcmVhdGluZyBjb21wYWN0aW9uIHN0cmF0ZWd5IGZvciB7fS57fSAtIGRpc2sgYm91bmRhcmllcyBhcmUgZXF1aXZhbGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLmtleXNwYWNlLmdldE5hbWUoKSwgY2ZzLmdldFRhYmxlTmFtZSgpKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChjdXJyZW50Qm91bmRhcmllcyA9PSBudWxsIHx8IGN1cnJlbnRCb3VuZGFyaWVzLmlzT3V0T2ZEYXRlKCkpCi0gICAgICAgICAgICBjdXJyZW50Qm91bmRhcmllcyA9IGJvdW5kYXJpZXNTdXBwbGllci5nZXQoKTsKLQotICAgICAgICBzZXRTdHJhdGVneShuZXdDb21wYWN0aW9uUGFyYW1zKTsKLSAgICAgICAgc2NoZW1hQ29tcGFjdGlvblBhcmFtcyA9IGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5jb21wYWN0aW9uOwotCi0gICAgICAgIGlmIChkaXNhYmxlZFdpdGhKTVggfHwgIXNob3VsZEJlRW5hYmxlZCgpICYmICFlbmFibGVkV2l0aEpNWCkKLSAgICAgICAgICAgIGRpc2FibGUoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZW5hYmxlKCk7CisgICAgICAgIGxvZ2dlci5kZWJ1ZygiUmVjcmVhdGluZyBjb21wYWN0aW9uIHN0cmF0ZWd5IGZvciB7fS57fSAtIGRpc2sgYm91bmRhcmllcyBhcmUgb3V0IG9mIGRhdGUiLAorICAgICAgICAgICAgICAgICAgICAgY2ZzLmtleXNwYWNlLmdldE5hbWUoKSwgY2ZzLmdldFRhYmxlTmFtZSgpKTsKKyAgICAgICAgc2V0U3RyYXRlZ3kocGFyYW1zKTsKICAgICAgICAgc3RhcnR1cCgpOwogICAgIH0KIApAQCAtNjEwLDYgKzY3NSw0NCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaXNMZXZlbGVkQ29tcGFjdGlvbigpCisgICAgeworICAgICAgICByZWFkTG9jay5sb2NrKCk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmVwYWlyZWQuZmlyc3QoKSBpbnN0YW5jZW9mIExldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3k7CisgICAgICAgIH0gZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICByZWFkTG9jay51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnRbXSBnZXRTU1RhYmxlQ291bnRQZXJUV0NTQnVja2V0KCkKKyAgICB7CisgICAgICAgIHJlYWRMb2NrLmxvY2soKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIExpc3Q8TWFwPExvbmcsIEludGVnZXI+PiBjb3VudHNCeUJ1Y2tldCA9IFN0cmVhbS5jb25jYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtU3VwcG9ydC5zdHJlYW0ocmVwYWlyZWQuYWxsU3RyYXRlZ2llcygpLnNwbGl0ZXJhdG9yKCksIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1TdXBwb3J0LnN0cmVhbSh1bnJlcGFpcmVkLmFsbFN0cmF0ZWdpZXMoKS5zcGxpdGVyYXRvcigpLCBmYWxzZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzKTo6aXNJbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAocyAtPiAoKFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kpcykuZ2V0U1NUYWJsZUNvdW50QnlCdWNrZXRzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgICAgIHJldHVybiBjb3VudHNCeUJ1Y2tldC5pc0VtcHR5KCkgPyBudWxsIDogc3VtQ291bnRzQnlCdWNrZXQoY291bnRzQnlCdWNrZXQsIFRXQ1NfQlVDS0VUX0NPVU5UX01BWCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICByZWFkTG9jay51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBpbnRbXSBzdW1Db3VudHNCeUJ1Y2tldChMaXN0PE1hcDxMb25nLCBJbnRlZ2VyPj4gY291bnRzQnlCdWNrZXQsIGludCBtYXgpCisgICAgeworICAgICAgICBUcmVlTWFwPExvbmcsIEludGVnZXI+IG1lcmdlZCA9IG5ldyBUcmVlTWFwPD4oQ29tcGFyYXRvci5yZXZlcnNlT3JkZXIoKSk7CisgICAgICAgIGNvdW50c0J5QnVja2V0LnN0cmVhbSgpLmZsYXRNYXAoZSAtPiBlLmVudHJ5U2V0KCkuc3RyZWFtKCkpLmZvckVhY2goZSAtPiBtZXJnZWQubWVyZ2UoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpLCBJbnRlZ2VyOjpzdW0pKTsKKyAgICAgICAgcmV0dXJuIG1lcmdlZC52YWx1ZXMoKS5zdHJlYW0oKS5saW1pdChtYXgpLm1hcFRvSW50KGkgLT4gaSkudG9BcnJheSgpOworICAgIH0KKwogICAgIHN0YXRpYyBpbnRbXSBzdW1BcnJheXMoaW50W10gYSwgaW50W10gYikKICAgICB7CiAgICAgICAgIGludFtdIHJlcyA9IG5ldyBpbnRbTWF0aC5tYXgoYS5sZW5ndGgsIGIubGVuZ3RoKV07CkBAIC05NTcsNyArMTA2MCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgQ29tcGFjdGlvblRhc2tzIGdldE1heGltYWxUYXNrcyhmaW5hbCBpbnQgZ2NCZWZvcmUsIGZpbmFsIGJvb2xlYW4gc3BsaXRPdXRwdXQpCisgICAgcHVibGljIENvbXBhY3Rpb25UYXNrcyBnZXRNYXhpbWFsVGFza3MoZmluYWwgaW50IGdjQmVmb3JlLCBmaW5hbCBib29sZWFuIHNwbGl0T3V0cHV0LCBPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUpCiAgICAgewogICAgICAgICBtYXliZVJlbG9hZERpc2tCb3VuZGFyaWVzKCk7CiAgICAgICAgIC8vIHJ1bldpdGhDb21wYWN0aW9uc0Rpc2FibGVkIGNhbmNlbHMgYWN0aXZlIGNvbXBhY3Rpb25zIGFuZCBkaXNhYmxlcyB0aGVtLCB0aGVuIHdlIGFyZSBhYmxlCkBAIC05NzAsNyArMTA3MywxMCBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZvciAoQWJzdHJhY3RTdHJhdGVneUhvbGRlciBob2xkZXIgOiBob2xkZXJzKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGFza3MuYWRkQWxsKGhvbGRlci5nZXRNYXhpbWFsVGFza3MoZ2NCZWZvcmUsIHNwbGl0T3V0cHV0KSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoQWJzdHJhY3RDb21wYWN0aW9uVGFzayB0YXNrOiBob2xkZXIuZ2V0TWF4aW1hbFRhc2tzKGdjQmVmb3JlLCBzcGxpdE91dHB1dCkpIAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0YXNrcy5hZGQodGFzay5zZXRDb21wYWN0aW9uVHlwZShvcGVyYXRpb25UeXBlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmaW5hbGx5CkBAIC05NzgsNyArMTA4NCw3IEBACiAgICAgICAgICAgICAgICAgcmVhZExvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gQ29tcGFjdGlvblRhc2tzLmNyZWF0ZSh0YXNrcyk7Ci0gICAgICAgIH0sIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIH0sIG9wZXJhdGlvblR5cGUsIGZhbHNlLCBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDI3LDYgKzExMzMsNDYgQEAKICAgICAgICAgcmV0dXJuIHRhc2tzOwogICAgIH0KIAorICAgIHB1YmxpYyBpbnQgZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MoaW50IGFkZGl0aW9uYWxTU1RhYmxlcywgbG9uZyBhZGRpdGlvbmFsQnl0ZXMsIGJvb2xlYW4gaXNJbmNyZW1lbnRhbCkKKyAgICB7CisgICAgICAgIGlmIChhZGRpdGlvbmFsQnl0ZXMgPT0gMCB8fCBhZGRpdGlvbmFsU1NUYWJsZXMgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBnZXRFc3RpbWF0ZWRSZW1haW5pbmdUYXNrcygpOworCisgICAgICAgIG1heWJlUmVsb2FkRGlza0JvdW5kYXJpZXMoKTsKKyAgICAgICAgcmVhZExvY2subG9jaygpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHRhc2tzID0gcGVuZGluZ1JlcGFpcnMuZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MoKTsKKworICAgICAgICAgICAgSXRlcmFibGU8QWJzdHJhY3RDb21wYWN0aW9uU3RyYXRlZ3k+IHN0cmF0ZWdpZXM7CisgICAgICAgICAgICBpZiAoaXNJbmNyZW1lbnRhbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgaXQgaXMgdW5saWtlbHkgdGhhdCB3ZSBhcmUgYmVoaW5kIGluIHRoZSBwZW5kaW5nIHN0cmF0ZWdpZXMgKGFzIHRoZXkgb25seSBoYXZlIGEgc21hbGwgZnJhY3Rpb24KKyAgICAgICAgICAgICAgICAvLyBvZiB0aGUgdG90YWwgZGF0YSksIHNvIHdlIGFzc3VtZSBoZXJlIHRoYXQgYW55IHBlbmRpbmcgc3N0YWJsZXMgZ28gZGlyZWN0bHkgdG8gdGhlIHJlcGFpcmVkIGJ1Y2tldC4KKyAgICAgICAgICAgICAgICBzdHJhdGVnaWVzID0gcmVwYWlyZWQuYWxsU3RyYXRlZ2llcygpOworICAgICAgICAgICAgICAgIHRhc2tzICs9IHVucmVwYWlyZWQuZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBIZXJlIHdlIGFzc3VtZSB0aGF0IGFsbCBzc3RhYmxlcyBnbyB0byB1bnJlcGFpcmVkLCB3aGljaCBjYW4gYmUgd3JvbmcgaWYgd2UgYXJlIHJ1bm5pbmcKKyAgICAgICAgICAgICAgICAvLyBib3RoIGluY3JlbWVudGFsIGFuZCBmdWxsIHJlcGFpcnMuCisgICAgICAgICAgICAgICAgc3RyYXRlZ2llcyA9IHVucmVwYWlyZWQuYWxsU3RyYXRlZ2llcygpOworICAgICAgICAgICAgICAgIHRhc2tzICs9IHJlcGFpcmVkLmdldEVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzKCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBzdHJhdGVneUNvdW50ID0gTWF0aC5tYXgoMSwgSXRlcmFibGVzLnNpemUoc3RyYXRlZ2llcykpOworICAgICAgICAgICAgaW50IHNzdGFibGVzUGVyU3RyYXRlZ3kgPSBhZGRpdGlvbmFsU1NUYWJsZXMgLyBzdHJhdGVneUNvdW50OworICAgICAgICAgICAgbG9uZyBieXRlc1BlclN0cmF0ZWd5ID0gYWRkaXRpb25hbEJ5dGVzIC8gc3RyYXRlZ3lDb3VudDsKKyAgICAgICAgICAgIGZvciAoQWJzdHJhY3RDb21wYWN0aW9uU3RyYXRlZ3kgc3RyYXRlZ3kgOiBzdHJhdGVnaWVzKQorICAgICAgICAgICAgICAgIHRhc2tzICs9IHN0cmF0ZWd5LmdldEVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzKHNzdGFibGVzUGVyU3RyYXRlZ3ksIGJ5dGVzUGVyU3RyYXRlZ3kpOworICAgICAgICAgICAgcmV0dXJuIHRhc2tzOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgcmVhZExvY2sudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRCZUVuYWJsZWQoKQogICAgIHsKICAgICAgICAgcmV0dXJuIHBhcmFtcy5pc0VuYWJsZWQoKTsKQEAgLTEwNTMsMjMgKzExOTksMTAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldE5ld0xvY2FsQ29tcGFjdGlvblN0cmF0ZWd5KENvbXBhY3Rpb25QYXJhbXMgcGFyYW1zKQorICAgIHB1YmxpYyB2b2lkIG92ZXJyaWRlTG9jYWxQYXJhbXMoQ29tcGFjdGlvblBhcmFtcyBwYXJhbXMpCiAgICAgewotICAgICAgICBsb2dnZXIuaW5mbygiU3dpdGNoaW5nIGxvY2FsIGNvbXBhY3Rpb24gc3RyYXRlZ3kgZnJvbSB7fSB0byB7fX0iLCB0aGlzLnBhcmFtcywgcGFyYW1zKTsKLSAgICAgICAgd3JpdGVMb2NrLmxvY2soKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNldFN0cmF0ZWd5KHBhcmFtcyk7Ci0gICAgICAgICAgICBpZiAoc2hvdWxkQmVFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgZW5hYmxlKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZGlzYWJsZSgpOwotICAgICAgICAgICAgc3RhcnR1cCgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVMb2NrLnVubG9jaygpOwotICAgICAgICB9CisgICAgICAgIGxvZ2dlci5pbmZvKCJTd2l0Y2hpbmcgbG9jYWwgY29tcGFjdGlvbiBzdHJhdGVneSBmcm9tIHt9IHRvIHt9IiwgdGhpcy5wYXJhbXMsIHBhcmFtcyk7CisgICAgICAgIG1heWJlUmVsb2FkUGFyYW1zRnJvbUpNWChwYXJhbXMpOwogICAgIH0KIAogICAgIHByaXZhdGUgaW50IGdldE51bVRva2VuUGFydGl0aW9ucygpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25UYXNrLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25UYXNrLmphdmEKaW5kZXggNWZjODAzMS4uYjYyYmFlNSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uVGFzay5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvblRhc2suamF2YQpAQCAtMjEsMTEgKzIxLDEzIEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5SYXRlTGltaXRlcjsKQEAgLTQyLDExICs0NCwxMyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb2xsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQWN0aXZlUmVwYWlyU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlJlZnM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSGlzdG9yeVRhYnVsYXJEYXRhLkNPTVBBQ1RJT05fVFlQRV9QUk9QRVJUWTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLmN1cnJlbnRUaW1lTWlsbGlzOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwubmFub1RpbWU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzLm5vdzsKQEAgLTEzMSw4ICsxMzUsOSBAQAogCiAgICAgICAgICAgICBmaW5hbCBTZXQ8U1NUYWJsZVJlYWRlcj4gZnVsbHlFeHBpcmVkU1NUYWJsZXMgPSBjb250cm9sbGVyLmdldEZ1bGx5RXhwaXJlZFNTVGFibGVzKCk7CiAKKyAgICAgICAgICAgIFRpbWVVVUlEIHRhc2tJZCA9IHRyYW5zYWN0aW9uLm9wSWQoKTsKICAgICAgICAgICAgIC8vIHNlbGVjdCBTU1RhYmxlcyB0byBjb21wYWN0IGJhc2VkIG9uIGF2YWlsYWJsZSBkaXNrIHNwYWNlLgotICAgICAgICAgICAgaWYgKCFidWlsZENvbXBhY3Rpb25DYW5kaWRhdGVzRm9yQXZhaWxhYmxlRGlza1NwYWNlKGZ1bGx5RXhwaXJlZFNTVGFibGVzKSkKKyAgICAgICAgICAgIGlmICghYnVpbGRDb21wYWN0aW9uQ2FuZGlkYXRlc0ZvckF2YWlsYWJsZURpc2tTcGFjZShmdWxseUV4cGlyZWRTU1RhYmxlcywgdGFza0lkKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBUaGUgc2V0IG9mIHNzdGFibGVzIGhhcyBjaGFuZ2VkIChvbmUgb3IgbW9yZSB3ZXJlIGV4Y2x1ZGVkIGR1ZSB0byBsaW1pdGVkIGF2YWlsYWJsZSBkaXNrIHNwYWNlKS4KICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHJlY29tcHV0ZSB0aGUgb3ZlcmxhcHMgYmV0d2VlbiBzc3RhYmxlcy4KQEAgLTE0OSw4ICsxNTQsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pOwogCi0gICAgICAgICAgICBUaW1lVVVJRCB0YXNrSWQgPSB0cmFuc2FjdGlvbi5vcElkKCk7Ci0KICAgICAgICAgICAgIC8vIG5ldyBzc3RhYmxlcyBmcm9tIGZsdXNoIGNhbiBiZSBhZGRlZCBkdXJpbmcgYSBjb21wYWN0aW9uLCBidXQgb25seSB0aGUgY29tcGFjdGlvbiBjYW4gcmVtb3ZlIHRoZW0sCiAgICAgICAgICAgICAvLyBzbyBpbiBvdXIgc2luZ2xlLXRocmVhZGVkIGNvbXBhY3Rpb24gd29ybGQgdGhpcyBpcyBhIHZhbGlkIHdheSBvZiBkZXRlcm1pbmluZyBpZiB3ZSdyZSBjb21wYWN0aW5nCiAgICAgICAgICAgICAvLyBhbGwgdGhlIHNzdGFibGVzICh0aGF0IGV4aXN0ZWQgd2hlbiB3ZSBzdGFydGVkKQpAQCAtMjA1LDYgKzIwOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyLmFwcGVuZChjaS5uZXh0KCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsS2V5c1dyaXR0ZW4rKzsKIAorICAgICAgICAgICAgICAgICAgICAgICAgY2kuc2V0VGFyZ2V0RGlyZWN0b3J5KHdyaXRlci5nZXRTU3RhYmxlRGlyZWN0b3J5KCkucGF0aCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgYnl0ZXNTY2FubmVkID0gc2Nhbm5lcnMuZ2V0VG90YWxCeXRlc1NjYW5uZWQoKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmF0ZSBsaW1pdCB0aGUgc2Nhbm5lcnMsIGFuZCBhY2NvdW50IGZvciBjb21wcmVzc2lvbgpAQCAtMjQzLDEyICsyNDcsMTMgQEAKIAogICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBuZXdTU1RhYmxlTmFtZXMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHJlYWRlciA6IG5ld1NTdGFibGVzKQotICAgICAgICAgICAgICAgIG5ld1NTVGFibGVOYW1lcy5hcHBlbmQocmVhZGVyLmRlc2NyaXB0b3IuYmFzZUZpbGVuYW1lKCkpLmFwcGVuZCgiLCIpOworICAgICAgICAgICAgICAgIG5ld1NTVGFibGVOYW1lcy5hcHBlbmQocmVhZGVyLmRlc2NyaXB0b3IuYmFzZUZpbGUoKSkuYXBwZW5kKCIsIik7CiAgICAgICAgICAgICBsb25nIHRvdGFsU291cmNlUm93cyA9IDA7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lcmdlZFJvd0NvdW50cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICB0b3RhbFNvdXJjZVJvd3MgKz0gbWVyZ2VkUm93Q291bnRzW2ldICogKGkgKyAxKTsKIAotICAgICAgICAgICAgU3RyaW5nIG1lcmdlU3VtbWFyeSA9IHVwZGF0ZUNvbXBhY3Rpb25IaXN0b3J5KGNmcy5rZXlzcGFjZS5nZXROYW1lKCksIGNmcy5nZXRUYWJsZU5hbWUoKSwgbWVyZ2VkUm93Q291bnRzLCBzdGFydHNpemUsIGVuZHNpemUpOworICAgICAgICAgICAgU3RyaW5nIG1lcmdlU3VtbWFyeSA9IHVwZGF0ZUNvbXBhY3Rpb25IaXN0b3J5KGNmcy5rZXlzcGFjZS5nZXROYW1lKCksIGNmcy5nZXRUYWJsZU5hbWUoKSwgbWVyZ2VkUm93Q291bnRzLCBzdGFydHNpemUsIGVuZHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlTWFwLm9mKENPTVBBQ1RJT05fVFlQRV9QUk9QRVJUWSwgY29tcGFjdGlvblR5cGUudHlwZSkpOwogCiAgICAgICAgICAgICBsb2dnZXIuaW5mbyhTdHJpbmcuZm9ybWF0KCJDb21wYWN0ZWQgKCVzKSAlZCBzc3RhYmxlcyB0byBbJXNdIHRvIGxldmVsPSVkLiAgJXMgdG8gJXMgKH4lZCUlIG9mIG9yaWdpbmFsKSBpbiAlLGRtcy4gIFJlYWQgVGhyb3VnaHB1dCA9ICVzLCBXcml0ZSBUaHJvdWdocHV0ID0gJXMsIFJvdyBUaHJvdWdocHV0ID0gfiUsZC9zLiAgJSxkIHRvdGFsIHBhcnRpdGlvbnMgbWVyZ2VkIHRvICUsZC4gIFBhcnRpdGlvbiBtZXJnZSBjb3VudHMgd2VyZSB7JXN9LiBUaW1lIHNwZW50IHdyaXRpbmcga2V5cyA9ICUsZG1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tJZCwKQEAgLTI4Nyw3ICsyOTIsNyBAQAogICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRDb21wYWN0aW9uV3JpdGVyKGNmcywgZGlyZWN0b3JpZXMsIHRyYW5zYWN0aW9uLCBub25FeHBpcmVkU1NUYWJsZXMsIGtlZXBPcmlnaW5hbHMsIGdldExldmVsKCkpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZGF0ZUNvbXBhY3Rpb25IaXN0b3J5KFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZyBjb2x1bW5GYW1pbHlOYW1lLCBsb25nW10gbWVyZ2VkUm93Q291bnRzLCBsb25nIHN0YXJ0U2l6ZSwgbG9uZyBlbmRTaXplKQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZGF0ZUNvbXBhY3Rpb25IaXN0b3J5KFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZyBjb2x1bW5GYW1pbHlOYW1lLCBsb25nW10gbWVyZ2VkUm93Q291bnRzLCBsb25nIHN0YXJ0U2l6ZSwgbG9uZyBlbmRTaXplLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbXBhY3Rpb25Qcm9wZXJ0aWVzKQogICAgIHsKICAgICAgICAgU3RyaW5nQnVpbGRlciBtZXJnZVN1bW1hcnkgPSBuZXcgU3RyaW5nQnVpbGRlcihtZXJnZWRSb3dDb3VudHMubGVuZ3RoICogMTApOwogICAgICAgICBNYXA8SW50ZWdlciwgTG9uZz4gbWVyZ2VkUm93cyA9IG5ldyBIYXNoTWFwPD4oKTsKQEAgLTMwMSw3ICszMDYsNyBAQAogICAgICAgICAgICAgbWVyZ2VTdW1tYXJ5LmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlZDolZCwgIiwgcm93cywgY291bnQpKTsKICAgICAgICAgICAgIG1lcmdlZFJvd3MucHV0KHJvd3MsIGNvdW50KTsKICAgICAgICAgfQotICAgICAgICBTeXN0ZW1LZXlzcGFjZS51cGRhdGVDb21wYWN0aW9uSGlzdG9yeShrZXlzcGFjZU5hbWUsIGNvbHVtbkZhbWlseU5hbWUsIGN1cnJlbnRUaW1lTWlsbGlzKCksIHN0YXJ0U2l6ZSwgZW5kU2l6ZSwgbWVyZ2VkUm93cyk7CisgICAgICAgIFN5c3RlbUtleXNwYWNlLnVwZGF0ZUNvbXBhY3Rpb25IaXN0b3J5KGtleXNwYWNlTmFtZSwgY29sdW1uRmFtaWx5TmFtZSwgY3VycmVudFRpbWVNaWxsaXMoKSwgc3RhcnRTaXplLCBlbmRTaXplLCBtZXJnZWRSb3dzLCBjb21wYWN0aW9uUHJvcGVydGllcyk7CiAgICAgICAgIHJldHVybiBtZXJnZVN1bW1hcnkudG9TdHJpbmcoKTsKICAgICB9CiAKQEAgLTM1NiwxMiArMzYxLDExIEBACiAKICAgICAvKgogICAgICAqIENoZWNrcyBpZiB3ZSBoYXZlIGVub3VnaCBkaXNrIHNwYWNlIHRvIGV4ZWN1dGUgdGhlIGNvbXBhY3Rpb24uICBEcm9wcyB0aGUgbGFyZ2VzdCBzc3RhYmxlIG91dCBvZiB0aGUgVGFzayB1bnRpbAotICAgICAqIHRoZXJlJ3MgZW5vdWdoIHNwYWNlIChpbiB0aGVvcnkpIHRvIGhhbmRsZSB0aGUgY29tcGFjdGlvbi4gIERvZXMgbm90IHRha2UgaW50byBhY2NvdW50IHNwYWNlIHRoYXQgd2lsbCBiZSB0YWtlbiBieQotICAgICAqIG90aGVyIGNvbXBhY3Rpb25zLgorICAgICAqIHRoZXJlJ3MgZW5vdWdoIHNwYWNlIChpbiB0aGVvcnkpIHRvIGhhbmRsZSB0aGUgY29tcGFjdGlvbi4KICAgICAgKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBlbm91Z2ggZGlzayBzcGFjZSB0byBleGVjdXRlIHRoZSBjb21wbGV0ZSBjb21wYWN0aW9uLCBmYWxzZSBpZiBzb21lIHNzdGFibGVzIGFyZSBleGNsdWRlZC4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZENvbXBhY3Rpb25DYW5kaWRhdGVzRm9yQXZhaWxhYmxlRGlza1NwYWNlKGZpbmFsIFNldDxTU1RhYmxlUmVhZGVyPiBmdWxseUV4cGlyZWRTU1RhYmxlcykKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZENvbXBhY3Rpb25DYW5kaWRhdGVzRm9yQXZhaWxhYmxlRGlza1NwYWNlKGZpbmFsIFNldDxTU1RhYmxlUmVhZGVyPiBmdWxseUV4cGlyZWRTU1RhYmxlcywgVGltZVVVSUQgdGFza0lkKQogICAgIHsKICAgICAgICAgaWYoIWNmcy5pc0NvbXBhY3Rpb25EaXNrU3BhY2VDaGVja0VuYWJsZWQoKSAmJiBjb21wYWN0aW9uVHlwZSA9PSBPcGVyYXRpb25UeXBlLkNPTVBBQ1RJT04pCiAgICAgICAgIHsKQEAgLTM3NiwxMyArMzgwLDI5IEBACiAgICAgICAgIHdoaWxlKCFub25FeHBpcmVkU1NUYWJsZXMuaXNFbXB0eSgpKQogICAgICAgICB7CiAgICAgICAgICAgICAvLyBPbmx5IGNvbnNpZGVyIHdyaXRlIHNpemUgb2Ygbm9uIGV4cGlyZWQgU1NUYWJsZXMKLSAgICAgICAgICAgIGxvbmcgZXhwZWN0ZWRXcml0ZVNpemUgPSBjZnMuZ2V0RXhwZWN0ZWRDb21wYWN0ZWRGaWxlU2l6ZShub25FeHBpcmVkU1NUYWJsZXMsIGNvbXBhY3Rpb25UeXBlKTsKLSAgICAgICAgICAgIGxvbmcgZXN0aW1hdGVkU1NUYWJsZXMgPSBNYXRoLm1heCgxLCBleHBlY3RlZFdyaXRlU2l6ZSAvIHN0cmF0ZWd5LmdldE1heFNTVGFibGVCeXRlcygpKTsKKyAgICAgICAgICAgIGxvbmcgd3JpdGVTaXplOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd3JpdGVTaXplID0gY2ZzLmdldEV4cGVjdGVkQ29tcGFjdGVkRmlsZVNpemUobm9uRXhwaXJlZFNTVGFibGVzLCBjb21wYWN0aW9uVHlwZSk7CisgICAgICAgICAgICAgICAgTWFwPEZpbGUsIExvbmc+IGV4cGVjdGVkTmV3V3JpdGVTaXplID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgICAgIExpc3Q8RmlsZT4gbmV3Q29tcGFjdGlvbkRhdGFkaXJzID0gY2ZzLmdldERpcmVjdG9yaWVzRm9yRmlsZXMobm9uRXhwaXJlZFNTVGFibGVzKTsKKyAgICAgICAgICAgICAgICBsb25nIHdyaXRlU2l6ZVBlck91dHB1dERhdGFkaXIgPSB3cml0ZVNpemUgLyBNYXRoLm1heChuZXdDb21wYWN0aW9uRGF0YWRpcnMuc2l6ZSgpLCAxKTsKKyAgICAgICAgICAgICAgICBmb3IgKEZpbGUgZGlyZWN0b3J5IDogbmV3Q29tcGFjdGlvbkRhdGFkaXJzKQorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZE5ld1dyaXRlU2l6ZS5wdXQoZGlyZWN0b3J5LCB3cml0ZVNpemVQZXJPdXRwdXREYXRhZGlyKTsKIAotICAgICAgICAgICAgaWYoY2ZzLmdldERpcmVjdG9yaWVzKCkuaGFzQXZhaWxhYmxlRGlza1NwYWNlKGVzdGltYXRlZFNTVGFibGVzLCBleHBlY3RlZFdyaXRlU2l6ZSkpCisgICAgICAgICAgICAgICAgTWFwPEZpbGUsIExvbmc+IGV4cGVjdGVkV3JpdGVTaXplID0gQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmVzdGltYXRlZFJlbWFpbmluZ1dyaXRlQnl0ZXMoKTsKKworICAgICAgICAgICAgICAgIC8vIHRvZG86IGFib3J0IHN0cmVhbXMgaWYgdGhleSBibG9jayBjb21wYWN0aW9ucworICAgICAgICAgICAgICAgIGlmIChjZnMuZ2V0RGlyZWN0b3JpZXMoKS5oYXNEaXNrU3BhY2VGb3JDb21wYWN0aW9uc0FuZFN0cmVhbXMoZXhwZWN0ZWROZXdXcml0ZVNpemUsIGV4cGVjdGVkV3JpdGVTaXplKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJDb3VsZCBub3QgY2hlY2sgaWYgdGhlcmUgaXMgZW5vdWdoIGRpc2sgc3BhY2UgZm9yIGNvbXBhY3Rpb24ge30iLCB0YXNrSWQsIGUpOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoIXJlZHVjZVNjb3BlRm9yTGltaXRlZFNwYWNlKG5vbkV4cGlyZWRTU1RhYmxlcywgZXhwZWN0ZWRXcml0ZVNpemUpKQorICAgICAgICAgICAgaWYgKCFyZWR1Y2VTY29wZUZvckxpbWl0ZWRTcGFjZShub25FeHBpcmVkU1NUYWJsZXMsIHdyaXRlU2l6ZSkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy8gd2UgZW5kIHVwIGhlcmUgaWYgd2UgY2FuJ3QgdGFrZSBhbnkgbW9yZSBzc3RhYmxlcyBvdXQgb2YgdGhlIGNvbXBhY3Rpb24uCiAgICAgICAgICAgICAgICAgLy8gdXN1YWxseSBtZWFucyB3ZSd2ZSBydW4gb3V0IG9mIGRpc2sgc3BhY2UKQEAgLTM5NSwxNSArNDE1LDIwIEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KCJOb3QgZW5vdWdoIHNwYWNlIGZvciBjb21wYWN0aW9uLCBlc3RpbWF0ZWQgc3N0YWJsZXMgPSAlZCwgZXhwZWN0ZWQgd3JpdGUgc2l6ZSA9ICVkIiwgZXN0aW1hdGVkU1NUYWJsZXMsIGV4cGVjdGVkV3JpdGVTaXplKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgiTm90IGVub3VnaCBzcGFjZSBmb3IgY29tcGFjdGlvbiAoJXMpIG9mICVzLiVzLCBlc3RpbWF0ZWQgc3N0YWJsZXMgPSAlZCwgZXhwZWN0ZWQgd3JpdGUgc2l6ZSA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLmtleXNwYWNlLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1heCgxLCB3cml0ZVNpemUgLyBzdHJhdGVneS5nZXRNYXhTU1RhYmxlQnl0ZXMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTaXplKTsKICAgICAgICAgICAgICAgICBsb2dnZXIud2Fybihtc2cpOwogICAgICAgICAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmluY3JlbWVudEFib3J0ZWQoKTsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtc2cpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzc3RhYmxlc1JlbW92ZWQrKzsKLSAgICAgICAgICAgIGxvZ2dlci53YXJuKCJOb3QgZW5vdWdoIHNwYWNlIGZvciBjb21wYWN0aW9uLCB7fU1pQiBlc3RpbWF0ZWQuICBSZWR1Y2luZyBzY29wZS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KSBleHBlY3RlZFdyaXRlU2l6ZSAvIDEwMjQgLyAxMDI0KTsKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCJOb3QgZW5vdWdoIHNwYWNlIGZvciBjb21wYWN0aW9uIHt9LCB7fU1pQiBlc3RpbWF0ZWQuIFJlZHVjaW5nIHNjb3BlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICB0YXNrSWQsIChmbG9hdCkgd3JpdGVTaXplIC8gMTAyNCAvIDEwMjQpOwogICAgICAgICB9CiAKICAgICAgICAgaWYoc3N0YWJsZXNSZW1vdmVkID4gMCkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9EYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMThiZjkuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9EYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC4qOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLWltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuSnNvbk5vZGU7Ci1pbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLm5vZGUuSnNvbk5vZGVGYWN0b3J5OwotaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5ub2RlLk9iamVjdE5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5TU1RhYmxlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wYWN0aW9uUGFyYW1zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7Ci0KLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXMuZmlsdGVyOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwuY3VycmVudFRpbWVNaWxsaXM7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIHtAbGluayBUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5fQotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGNsYXNzIERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENvbXBhY3Rpb25TdHJhdGVneQotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzKTsKLQotICAgIHByaXZhdGUgZmluYWwgRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMgb3B0aW9uczsKLSAgICBwcm90ZWN0ZWQgdm9sYXRpbGUgaW50IGVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzOwotICAgIHByaXZhdGUgZmluYWwgU2V0PFNTVGFibGVSZWFkZXI+IHNzdGFibGVzID0gbmV3IEhhc2hTZXQ8PigpOwotICAgIHByaXZhdGUgbG9uZyBsYXN0RXhwaXJlZENoZWNrOwotICAgIHByaXZhdGUgZmluYWwgU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMgc3Rjc09wdGlvbnM7Ci0KLSAgICBwdWJsaWMgRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneShDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucykKLSAgICB7Ci0gICAgICAgIHN1cGVyKGNmcywgb3B0aW9ucyk7Ci0gICAgICAgIHRoaXMuZXN0aW1hdGVkUmVtYWluaW5nVGFza3MgPSAwOwotICAgICAgICB0aGlzLm9wdGlvbnMgPSBuZXcgRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIGlmICghb3B0aW9ucy5jb250YWluc0tleShBYnN0cmFjdENvbXBhY3Rpb25TdHJhdGVneS5UT01CU1RPTkVfQ09NUEFDVElPTl9JTlRFUlZBTF9PUFRJT04pICYmICFvcHRpb25zLmNvbnRhaW5zS2V5KEFic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5LlRPTUJTVE9ORV9USFJFU0hPTERfT1BUSU9OKSkKLSAgICAgICAgewotICAgICAgICAgICAgZGlzYWJsZVRvbWJzdG9uZUNvbXBhY3Rpb25zID0gdHJ1ZTsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiRGlzYWJsaW5nIHRvbWJzdG9uZSBjb21wYWN0aW9ucyBmb3IgRFRDUyIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiRW5hYmxpbmcgdG9tYnN0b25lIGNvbXBhY3Rpb25zIGZvciBEVENTIik7Ci0KLSAgICAgICAgdGhpcy5zdGNzT3B0aW9ucyA9IG5ldyBTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucyhvcHRpb25zKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQotICAgIHB1YmxpYyBBYnN0cmFjdENvbXBhY3Rpb25UYXNrIGdldE5leHRCYWNrZ3JvdW5kVGFzayhpbnQgZ2NCZWZvcmUpCi0gICAgewotICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IHByZXZpb3VzQ2FuZGlkYXRlID0gbnVsbDsKLSAgICAgICAgd2hpbGUgKHRydWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gbGF0ZXN0QnVja2V0ID0gZ2V0TmV4dEJhY2tncm91bmRTU1RhYmxlcyhnY0JlZm9yZSk7Ci0KLSAgICAgICAgICAgIGlmIChsYXRlc3RCdWNrZXQuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICAvLyBBbHJlYWR5IHRyaWVkIGFjcXVpcmluZyByZWZlcmVuY2VzIHdpdGhvdXQgc3VjY2Vzcy4gSXQgbWVhbnMgdGhlcmUgaXMgYSByYWNlIHdpdGgKLSAgICAgICAgICAgIC8vIHRoZSB0cmFja2VyIGJ1dCBjYW5kaWRhdGUgU1NUYWJsZXMgd2VyZSBub3QgeWV0IHJlcGxhY2VkIGluIHRoZSBjb21wYWN0aW9uIHN0cmF0ZWd5IG1hbmFnZXIKLSAgICAgICAgICAgIGlmIChsYXRlc3RCdWNrZXQuZXF1YWxzKHByZXZpb3VzQ2FuZGlkYXRlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiQ291bGQgbm90IGFjcXVpcmUgcmVmZXJlbmNlcyBmb3IgY29tcGFjdGluZyBTU1RhYmxlcyB7fSB3aGljaCBpcyBub3QgYSBwcm9ibGVtIHBlciBzZSwiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5sZXNzIGl0IGhhcHBlbnMgZnJlcXVlbnRseSwgaW4gd2hpY2ggY2FzZSBpdCBtdXN0IGJlIHJlcG9ydGVkLiBXaWxsIHJldHJ5IGxhdGVyLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0QnVja2V0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gbW9kaWZpZXIgPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShsYXRlc3RCdWNrZXQsIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTik7Ci0gICAgICAgICAgICBpZiAobW9kaWZpZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25UYXNrKGNmcywgbW9kaWZpZXIsIGdjQmVmb3JlKTsKLSAgICAgICAgICAgIHByZXZpb3VzQ2FuZGlkYXRlID0gbGF0ZXN0QnVja2V0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZ2NCZWZvcmUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgTGlzdDxTU1RhYmxlUmVhZGVyPiBnZXROZXh0QmFja2dyb3VuZFNTVGFibGVzKGZpbmFsIGludCBnY0JlZm9yZSkKLSAgICB7Ci0gICAgICAgIFNldDxTU1RhYmxlUmVhZGVyPiB1bmNvbXBhY3Rpbmc7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoc3N0YWJsZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzc3RhYmxlcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCi0gICAgICAgICAgICB1bmNvbXBhY3RpbmcgPSBJbW11dGFibGVTZXQuY29weU9mKGZpbHRlcihjZnMuZ2V0VW5jb21wYWN0aW5nU1NUYWJsZXMoKSwgc3N0YWJsZXM6OmNvbnRhaW5zKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTZXQ8U1NUYWJsZVJlYWRlcj4gZXhwaXJlZCA9IENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0gICAgICAgIC8vIHdlIG9ubHkgY2hlY2sgZm9yIGV4cGlyZWQgc3N0YWJsZXMgZXZlcnkgMTAgbWludXRlcyAoYnkgZGVmYXVsdCkgZHVlIHRvIGl0IGJlaW5nIGFuIGV4cGVuc2l2ZSBvcGVyYXRpb24KLSAgICAgICAgaWYgKGN1cnJlbnRUaW1lTWlsbGlzKCkgLSBsYXN0RXhwaXJlZENoZWNrID4gb3B0aW9ucy5leHBpcmVkU1NUYWJsZUNoZWNrRnJlcXVlbmN5KQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBGaW5kIGZ1bGx5IGV4cGlyZWQgU1NUYWJsZXMuIFRob3NlIHdpbGwgYmUgaW5jbHVkZWQgbm8gbWF0dGVyIHdoYXQuCi0gICAgICAgICAgICBleHBpcmVkID0gQ29tcGFjdGlvbkNvbnRyb2xsZXIuZ2V0RnVsbHlFeHBpcmVkU1NUYWJsZXMoY2ZzLCB1bmNvbXBhY3RpbmcsIGNmcy5nZXRPdmVybGFwcGluZ0xpdmVTU1RhYmxlcyh1bmNvbXBhY3RpbmcpLCBnY0JlZm9yZSk7Ci0gICAgICAgICAgICBsYXN0RXhwaXJlZENoZWNrID0gY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgfQotICAgICAgICBTZXQ8U1NUYWJsZVJlYWRlcj4gY2FuZGlkYXRlcyA9IFNldHMubmV3SGFzaFNldChmaWx0ZXJTdXNwZWN0U1NUYWJsZXModW5jb21wYWN0aW5nKSk7Ci0KLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBjb21wYWN0aW9uQ2FuZGlkYXRlcyA9IG5ldyBBcnJheUxpc3Q8PihnZXROZXh0Tm9uRXhwaXJlZFNTVGFibGVzKFNldHMuZGlmZmVyZW5jZShjYW5kaWRhdGVzLCBleHBpcmVkKSwgZ2NCZWZvcmUpKTsKLSAgICAgICAgaWYgKCFleHBpcmVkLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJJbmNsdWRpbmcgZXhwaXJlZCBzc3RhYmxlczoge30iLCBleHBpcmVkKTsKLSAgICAgICAgICAgIGNvbXBhY3Rpb25DYW5kaWRhdGVzLmFkZEFsbChleHBpcmVkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29tcGFjdGlvbkNhbmRpZGF0ZXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PFNTVGFibGVSZWFkZXI+IGdldE5leHROb25FeHBpcmVkU1NUYWJsZXMoSXRlcmFibGU8U1NUYWJsZVJlYWRlcj4gbm9uRXhwaXJpbmdTU1RhYmxlcywgZmluYWwgaW50IGdjQmVmb3JlKQotICAgIHsKLSAgICAgICAgaW50IGJhc2UgPSBjZnMuZ2V0TWluaW11bUNvbXBhY3Rpb25UaHJlc2hvbGQoKTsKLSAgICAgICAgbG9uZyBub3cgPSBnZXROb3coKTsKLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBtb3N0SW50ZXJlc3RpbmcgPSBnZXRDb21wYWN0aW9uQ2FuZGlkYXRlcyhub25FeHBpcmluZ1NTVGFibGVzLCBub3csIGJhc2UpOwotICAgICAgICBpZiAobW9zdEludGVyZXN0aW5nICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtb3N0SW50ZXJlc3Rpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBzc3RhYmxlIHRvIGNvbXBhY3QgaW4gc3RhbmRhcmQgd2F5LCB0cnkgY29tcGFjdGluZyBzaW5nbGUgc3N0YWJsZSB3aG9zZSBkcm9wcGFibGUgdG9tYnN0b25lCi0gICAgICAgIC8vIHJhdGlvIGlzIGdyZWF0ZXIgdGhhbiB0aHJlc2hvbGQuCi0gICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXNXaXRoVG9tYnN0b25lcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IG5vbkV4cGlyaW5nU1NUYWJsZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh3b3J0aERyb3BwaW5nVG9tYnN0b25lcyhzc3RhYmxlLCBnY0JlZm9yZSkpCi0gICAgICAgICAgICAgICAgc3N0YWJsZXNXaXRoVG9tYnN0b25lcy5hZGQoc3N0YWJsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNzdGFibGVzV2l0aFRvbWJzdG9uZXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KENvbGxlY3Rpb25zLm1pbihzc3RhYmxlc1dpdGhUb21ic3RvbmVzLCBTU1RhYmxlUmVhZGVyLnNpemVDb21wYXJhdG9yKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PFNTVGFibGVSZWFkZXI+IGdldENvbXBhY3Rpb25DYW5kaWRhdGVzKEl0ZXJhYmxlPFNTVGFibGVSZWFkZXI+IGNhbmRpZGF0ZVNTVGFibGVzLCBsb25nIG5vdywgaW50IGJhc2UpCi0gICAgewotICAgICAgICBJdGVyYWJsZTxTU1RhYmxlUmVhZGVyPiBjYW5kaWRhdGVzID0gZmlsdGVyT2xkU1NUYWJsZXMoTGlzdHMubmV3QXJyYXlMaXN0KGNhbmRpZGF0ZVNTVGFibGVzKSwgb3B0aW9ucy5tYXhTU1RhYmxlQWdlLCBub3cpOwotCi0gICAgICAgIExpc3Q8TGlzdDxTU1RhYmxlUmVhZGVyPj4gYnVja2V0cyA9IGdldEJ1Y2tldHMoY3JlYXRlU1NUYWJsZUFuZE1pblRpbWVzdGFtcFBhaXJzKGNhbmRpZGF0ZXMpLCBvcHRpb25zLmJhc2VUaW1lLCBiYXNlLCBub3csIG9wdGlvbnMubWF4V2luZG93U2l6ZSk7Ci0gICAgICAgIGxvZ2dlci5kZWJ1ZygiQ29tcGFjdGlvbiBidWNrZXRzIGFyZSB7fSIsIGJ1Y2tldHMpOwotICAgICAgICB1cGRhdGVFc3RpbWF0ZWRDb21wYWN0aW9uc0J5VGFza3MoYnVja2V0cyk7Ci0gICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gbW9zdEludGVyZXN0aW5nID0gbmV3ZXN0QnVja2V0KGJ1Y2tldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmcy5nZXRNaW5pbXVtQ29tcGFjdGlvblRocmVzaG9sZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMuZ2V0TWF4aW11bUNvbXBhY3Rpb25UaHJlc2hvbGQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmJhc2VUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm1heFdpbmRvd1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0Y3NPcHRpb25zKTsKLSAgICAgICAgaWYgKCFtb3N0SW50ZXJlc3RpbmcuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIG1vc3RJbnRlcmVzdGluZzsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZXN0YW1wIHRoYXQgRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSBjb25zaWRlcnMgdG8gYmUgdGhlICJjdXJyZW50IHRpbWUiLgotICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gdGltZXN0YW1wIGFjcm9zcyBhbGwgU1NUYWJsZXMuCi0gICAgICogQHRocm93cyBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiB0aGVyZSBhcmUgbm8gU1NUYWJsZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBsb25nIGdldE5vdygpCi0gICAgewotICAgICAgICAvLyBubyBuZWVkIHRvIGNvbnZlcnQgdG8gY29sbGVjdGlvbiBpZiBoYWQgYW4gSXRlcmFibGVzLm1heCgpLCBidXQgbm90IHByZXNlbnQgaW4gc3RhbmRhcmQgdG9vbGtpdCwgYW5kIG5vdCB3b3J0aCBhZGRpbmcKLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIEl0ZXJhYmxlcy5hZGRBbGwobGlzdCwgY2ZzLmdldFNTVGFibGVzKFNTVGFibGVTZXQuTElWRSkpOwotICAgICAgICBpZiAobGlzdC5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLm1heChsaXN0LCAobzEsIG8yKSAtPiBMb25nLmNvbXBhcmUobzEuZ2V0TWF4VGltZXN0YW1wKCksIG8yLmdldE1heFRpbWVzdGFtcCgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1heFRpbWVzdGFtcCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIHNzdGFibGVzIHdpdGggbWF4IHRpbWVzdGFtcCBvbGRlciB0aGFuIG1heFNTVGFibGVBZ2UuCi0gICAgICogQHBhcmFtIHNzdGFibGVzIGFsbCBzc3RhYmxlcyB0byBjb25zaWRlcgotICAgICAqIEBwYXJhbSBtYXhTU1RhYmxlQWdlIHRoZSBhZ2UgaW4gbWlsbGlzZWNvbmRzIHdoZW4gYW4gU1NUYWJsZSBzdG9wcyBwYXJ0aWNpcGF0aW5nIGluIGNvbXBhY3Rpb25zCi0gICAgICogQHBhcmFtIG5vdyBjdXJyZW50IHRpbWUuIFNTVGFibGVzIHdpdGggbWF4IHRpbWVzdGFtcCBsZXNzIHRoYW4gKG5vdyAtIG1heFNTVGFibGVBZ2UpIGFyZSBmaWx0ZXJlZC4KLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBzc3RhYmxlcyB3aXRoIHRoZSBvbGRlc3Qgc3N0YWJsZXMgZXhjbHVkZWQKLSAgICAgKi8KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBzdGF0aWMgSXRlcmFibGU8U1NUYWJsZVJlYWRlcj4gZmlsdGVyT2xkU1NUYWJsZXMoTGlzdDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcywgbG9uZyBtYXhTU1RhYmxlQWdlLCBsb25nIG5vdykKLSAgICB7Ci0gICAgICAgIGlmIChtYXhTU1RhYmxlQWdlID09IDApCi0gICAgICAgICAgICByZXR1cm4gc3N0YWJsZXM7Ci0gICAgICAgIGZpbmFsIGxvbmcgY3V0b2ZmID0gbm93IC0gbWF4U1NUYWJsZUFnZTsKLSAgICAgICAgcmV0dXJuIGZpbHRlcihzc3RhYmxlcywgbmV3IFByZWRpY2F0ZTxTU1RhYmxlUmVhZGVyPigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYXBwbHkoU1NUYWJsZVJlYWRlciBzc3RhYmxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBzc3RhYmxlLmdldE1heFRpbWVzdGFtcCgpID49IGN1dG9mZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFBhaXI8U1NUYWJsZVJlYWRlciwgTG9uZz4+IGNyZWF0ZVNTVGFibGVBbmRNaW5UaW1lc3RhbXBQYWlycyhJdGVyYWJsZTxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcykKLSAgICB7Ci0gICAgICAgIExpc3Q8UGFpcjxTU1RhYmxlUmVhZGVyLCBMb25nPj4gc3N0YWJsZU1pblRpbWVzdGFtcFBhaXJzID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KEl0ZXJhYmxlcy5zaXplKHNzdGFibGVzKSk7Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCi0gICAgICAgICAgICBzc3RhYmxlTWluVGltZXN0YW1wUGFpcnMuYWRkKFBhaXIuY3JlYXRlKHNzdGFibGUsIHNzdGFibGUuZ2V0TWluVGltZXN0YW1wKCkpKTsKLSAgICAgICAgcmV0dXJuIHNzdGFibGVNaW5UaW1lc3RhbXBQYWlyczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkU1NUYWJsZShTU1RhYmxlUmVhZGVyIHNzdGFibGUpCi0gICAgewotICAgICAgICBzc3RhYmxlcy5hZGQoc3N0YWJsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVNTVGFibGUoU1NUYWJsZVJlYWRlciBzc3RhYmxlKQotICAgIHsKLSAgICAgICAgc3N0YWJsZXMucmVtb3ZlKHNzdGFibGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgU2V0PFNTVGFibGVSZWFkZXI+IGdldFNTVGFibGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBJbW11dGFibGVTZXQuY29weU9mKHNzdGFibGVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIHRhcmdldCB0aW1lIHNwYW4gdXNlZCBmb3IgYnVja2V0aW5nIFNTVGFibGVzIGJhc2VkIG9uIHRpbWVzdGFtcHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGFyZ2V0Ci0gICAgewotICAgICAgICAvLyBIb3cgYmlnIGEgcmFuZ2Ugb2YgdGltZXN0YW1wcyBmaXQgaW5zaWRlIHRoZSB0YXJnZXQuCi0gICAgICAgIHB1YmxpYyBmaW5hbCBsb25nIHNpemU7Ci0gICAgICAgIC8vIEEgdGltZXN0YW1wIHQgaGl0cyB0aGUgdGFyZ2V0IGlmZiB0IC8gc2l6ZSA9PSBkaXZQb3NpdGlvbi4KLSAgICAgICAgcHVibGljIGZpbmFsIGxvbmcgZGl2UG9zaXRpb247Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIGxvbmcgbWF4V2luZG93U2l6ZTsKLQotICAgICAgICBwdWJsaWMgVGFyZ2V0KGxvbmcgc2l6ZSwgbG9uZyBkaXZQb3NpdGlvbiwgbG9uZyBtYXhXaW5kb3dTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnNpemUgPSBzaXplOwotICAgICAgICAgICAgdGhpcy5kaXZQb3NpdGlvbiA9IGRpdlBvc2l0aW9uOwotICAgICAgICAgICAgdGhpcy5tYXhXaW5kb3dTaXplID0gbWF4V2luZG93U2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb21wYXJlcyB0aGUgdGFyZ2V0IHRvIGEgdGltZXN0YW1wLgotICAgICAgICAgKiBAcGFyYW0gdGltZXN0YW1wIHRoZSB0aW1lc3RhbXAgdG8gY29tcGFyZS4KLSAgICAgICAgICogQHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIsIHplcm8sIG9yIGEgcG9zaXRpdmUgaW50ZWdlciBhcyB0aGUgdGFyZ2V0IGxpZXMgYmVmb3JlLCBjb3ZlcmluZywgb3IgYWZ0ZXIgdGhhbiB0aGUgdGltZXN0YW1wLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBjb21wYXJlVG9UaW1lc3RhbXAobG9uZyB0aW1lc3RhbXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBMb25nLmNvbXBhcmUoZGl2UG9zaXRpb24sIHRpbWVzdGFtcCAvIHNpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRlbGxzIGlmIHRoZSB0aW1lc3RhbXAgaGl0cyB0aGUgdGFyZ2V0LgotICAgICAgICAgKiBAcGFyYW0gdGltZXN0YW1wIHRoZSB0aW1lc3RhbXAgdG8gdGVzdC4KLSAgICAgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZmYgdGltZXN0YW1wIC8gc2l6ZSA9PSBkaXZQb3NpdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uVGFyZ2V0KGxvbmcgdGltZXN0YW1wKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29tcGFyZVRvVGltZXN0YW1wKHRpbWVzdGFtcCkgPT0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBuZXh0IHRhcmdldCwgd2hpY2ggcmVwcmVzZW50cyBhbiBlYXJsaWVyIHRpbWUgc3Bhbi4KLSAgICAgICAgICogQHBhcmFtIGJhc2UgVGhlIG51bWJlciBvZiBjb250aWd1b3VzIHRhcmdldHMgdGhhdCB3aWxsIGhhdmUgdGhlIHNhbWUgc2l6ZS4gVGFyZ2V0cyBmb2xsb3dpbmcgdGhvc2Ugd2lsbCBiZSA8Y29kZT5iYXNlPC9jb2RlPiB0aW1lcyBhcyBiaWcuCi0gICAgICAgICAqIEByZXR1cm4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBUYXJnZXQgbmV4dFRhcmdldChpbnQgYmFzZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGRpdlBvc2l0aW9uICUgYmFzZSA+IDAgfHwgc2l6ZSAqIGJhc2UgPiBtYXhXaW5kb3dTaXplKQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGFyZ2V0KHNpemUsIGRpdlBvc2l0aW9uIC0gMSwgbWF4V2luZG93U2l6ZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUYXJnZXQoc2l6ZSAqIGJhc2UsIGRpdlBvc2l0aW9uIC8gYmFzZSAtIDEsIG1heFdpbmRvd1NpemUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHcm91cCBmaWxlcyB3aXRoIHNpbWlsYXIgbWluIHRpbWVzdGFtcCBpbnRvIGJ1Y2tldHMuIEZpbGVzIHdpdGggcmVjZW50IG1pbiB0aW1lc3RhbXBzIGFyZSBncm91cGVkIHRvZ2V0aGVyIGludG8KLSAgICAgKiBidWNrZXRzIGRlc2lnbmF0ZWQgdG8gc2hvcnQgdGltZXNwYW5zIHdoaWxlIGZpbGVzIHdpdGggb2xkZXIgdGltZXN0YW1wcyBhcmUgZ3JvdXBlZCBpbnRvIGJ1Y2tldHMgcmVwcmVzZW50aW5nCi0gICAgICogbG9uZ2VyIHRpbWVzcGFucy4KLSAgICAgKiBAcGFyYW0gZmlsZXMgcGFpcnMgY29uc2lzdGluZyBvZiBhIGZpbGUgYW5kIGl0cyBtaW4gdGltZXN0YW1wCi0gICAgICogQHBhcmFtIHRpbWVVbml0Ci0gICAgICogQHBhcmFtIGJhc2UKLSAgICAgKiBAcGFyYW0gbm93Ci0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgYnVja2V0cyBvZiBmaWxlcy4gVGhlIGxpc3QgaXMgb3JkZXJlZCBzdWNoIHRoYXQgdGhlIGZpbGVzIHdpdGggbmV3ZXN0IHRpbWVzdGFtcHMgY29tZSBmaXJzdC4KLSAgICAgKiAgICAgICAgIEVhY2ggYnVja2V0IGlzIGFsc28gYSBsaXN0IG9mIGZpbGVzIG9yZGVyZWQgZnJvbSBuZXdlc3QgdG8gb2xkZXN0LgotICAgICAqLwotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHN0YXRpYyA8VD4gTGlzdDxMaXN0PFQ+PiBnZXRCdWNrZXRzKENvbGxlY3Rpb248UGFpcjxULCBMb25nPj4gZmlsZXMsIGxvbmcgdGltZVVuaXQsIGludCBiYXNlLCBsb25nIG5vdywgbG9uZyBtYXhXaW5kb3dTaXplKQotICAgIHsKLSAgICAgICAgLy8gU29ydCBmaWxlcyBieSBhZ2UuIE5ld2VzdCBmaXJzdC4KLSAgICAgICAgZmluYWwgTGlzdDxQYWlyPFQsIExvbmc+PiBzb3J0ZWRGaWxlcyA9IExpc3RzLm5ld0FycmF5TGlzdChmaWxlcyk7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoc29ydGVkRmlsZXMsIENvbGxlY3Rpb25zLnJldmVyc2VPcmRlcihuZXcgQ29tcGFyYXRvcjxQYWlyPFQsIExvbmc+PigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShQYWlyPFQsIExvbmc+IHAxLCBQYWlyPFQsIExvbmc+IHAyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBwMS5yaWdodC5jb21wYXJlVG8ocDIucmlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KSk7Ci0KLSAgICAgICAgTGlzdDxMaXN0PFQ+PiBidWNrZXRzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7Ci0gICAgICAgIFRhcmdldCB0YXJnZXQgPSBnZXRJbml0aWFsVGFyZ2V0KG5vdywgdGltZVVuaXQsIG1heFdpbmRvd1NpemUpOwotICAgICAgICBQZWVraW5nSXRlcmF0b3I8UGFpcjxULCBMb25nPj4gaXQgPSBJdGVyYXRvcnMucGVla2luZ0l0ZXJhdG9yKHNvcnRlZEZpbGVzLml0ZXJhdG9yKCkpOwotCi0gICAgICAgIG91dGVyTG9vcDoKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUgKCF0YXJnZXQub25UYXJnZXQoaXQucGVlaygpLnJpZ2h0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZmlsZSBpcyB0b28gbmV3IGZvciB0aGUgdGFyZ2V0LCBza2lwIGl0LgotICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY29tcGFyZVRvVGltZXN0YW1wKGl0LnBlZWsoKS5yaWdodCkgPCAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaXQubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghaXQuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXJMb29wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIC8vIElmIHRoZSBmaWxlIGlzIHRvbyBvbGQgZm9yIHRoZSB0YXJnZXQsIHN3aXRjaCB0YXJnZXRzLgotICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQubmV4dFRhcmdldChiYXNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8VD4gYnVja2V0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICB3aGlsZSAodGFyZ2V0Lm9uVGFyZ2V0KGl0LnBlZWsoKS5yaWdodCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnVja2V0LmFkZChpdC5uZXh0KCkubGVmdCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWl0Lmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWNrZXRzLmFkZChidWNrZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1Y2tldHM7Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgc3RhdGljIFRhcmdldCBnZXRJbml0aWFsVGFyZ2V0KGxvbmcgbm93LCBsb25nIHRpbWVVbml0LCBsb25nIG1heFdpbmRvd1NpemUpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRhcmdldCh0aW1lVW5pdCwgbm93IC8gdGltZVVuaXQsIG1heFdpbmRvd1NpemUpOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUVzdGltYXRlZENvbXBhY3Rpb25zQnlUYXNrcyhMaXN0PExpc3Q8U1NUYWJsZVJlYWRlcj4+IHRhc2tzKQotICAgIHsKLSAgICAgICAgaW50IG4gPSAwOwotICAgICAgICBmb3IgKExpc3Q8U1NUYWJsZVJlYWRlcj4gYnVja2V0IDogdGFza3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoTGlzdDxTU1RhYmxlUmVhZGVyPiBzdGNzQnVja2V0IDogZ2V0U1RDU0J1Y2tldHMoYnVja2V0LCBzdGNzT3B0aW9ucykpCi0gICAgICAgICAgICAgICAgaWYgKHN0Y3NCdWNrZXQuc2l6ZSgpID49IGNmcy5nZXRNaW5pbXVtQ29tcGFjdGlvblRocmVzaG9sZCgpKQotICAgICAgICAgICAgICAgICAgICBuICs9IE1hdGguY2VpbCgoZG91YmxlKXN0Y3NCdWNrZXQuc2l6ZSgpIC8gY2ZzLmdldE1heGltdW1Db21wYWN0aW9uVGhyZXNob2xkKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzID0gbjsKLSAgICAgICAgY2ZzLmdldENvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIoKS5jb21wYWN0aW9uTG9nZ2VyLnBlbmRpbmcodGhpcywgbik7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYnVja2V0cyBsaXN0IG9mIGJ1Y2tldHMsIHNvcnRlZCBmcm9tIG5ld2VzdCB0byBvbGRlc3QsIGZyb20gd2hpY2ggdG8gcmV0dXJuIHRoZSBuZXdlc3QgYnVja2V0IHdpdGhpbiB0aHJlc2hvbGRzLgotICAgICAqIEBwYXJhbSBtaW5UaHJlc2hvbGQgbWluaW11bSBudW1iZXIgb2Ygc3N0YWJsZXMgaW4gYSBidWNrZXQgdG8gcXVhbGlmeS4KLSAgICAgKiBAcGFyYW0gbWF4VGhyZXNob2xkIG1heGltdW0gbnVtYmVyIG9mIHNzdGFibGVzIHRvIGNvbXBhY3QgYXQgb25jZSAodGhlIHJldHVybmVkIGJ1Y2tldCB3aWxsIGJlIHRyaW1tZWQgZG93biB0byB0aGlzKS4KLSAgICAgKiBAcmV0dXJuIGEgYnVja2V0IChsaXN0KSBvZiBzc3RhYmxlcyB0byBjb21wYWN0LgotICAgICAqLwotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHN0YXRpYyBMaXN0PFNTVGFibGVSZWFkZXI+IG5ld2VzdEJ1Y2tldChMaXN0PExpc3Q8U1NUYWJsZVJlYWRlcj4+IGJ1Y2tldHMsIGludCBtaW5UaHJlc2hvbGQsIGludCBtYXhUaHJlc2hvbGQsIGxvbmcgbm93LCBsb25nIGJhc2VUaW1lLCBsb25nIG1heFdpbmRvd1NpemUsIFNpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zIHN0Y3NPcHRpb25zKQotICAgIHsKLSAgICAgICAgLy8gSWYgdGhlICJpbmNvbWluZyB3aW5kb3ciIGhhcyBhdCBsZWFzdCBtaW5UaHJlc2hvbGQgU1NUYWJsZXMsIGNob29zZSB0aGF0IG9uZS4KLSAgICAgICAgLy8gRm9yIGFueSBvdGhlciBidWNrZXQsIGF0IGxlYXN0IDIgU1NUYWJsZXMgaXMgZW5vdWdoLgotICAgICAgICAvLyBJbiBhbnkgY2FzZSwgbGltaXQgdG8gbWF4VGhyZXNob2xkIFNTVGFibGVzLgotICAgICAgICBUYXJnZXQgaW5jb21pbmdXaW5kb3cgPSBnZXRJbml0aWFsVGFyZ2V0KG5vdywgYmFzZVRpbWUsIG1heFdpbmRvd1NpemUpOwotICAgICAgICBmb3IgKExpc3Q8U1NUYWJsZVJlYWRlcj4gYnVja2V0IDogYnVja2V0cykKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBpbkZpcnN0V2luZG93ID0gaW5jb21pbmdXaW5kb3cub25UYXJnZXQoYnVja2V0LmdldCgwKS5nZXRNaW5UaW1lc3RhbXAoKSk7Ci0gICAgICAgICAgICBpZiAoYnVja2V0LnNpemUoKSA+PSBtaW5UaHJlc2hvbGQgfHwgKGJ1Y2tldC5zaXplKCkgPj0gMiAmJiAhaW5GaXJzdFdpbmRvdykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBzdGNzU1NUYWJsZXMgPSBnZXRTU1RhYmxlc0ZvclNUQ1MoYnVja2V0LCBpbkZpcnN0V2luZG93ID8gbWluVGhyZXNob2xkIDogMiwgbWF4VGhyZXNob2xkLCBzdGNzT3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdGNzU1NUYWJsZXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3Rjc1NTVGFibGVzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFNTVGFibGVSZWFkZXI+IGdldFNTVGFibGVzRm9yU1RDUyhDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IHNzdGFibGVzLCBpbnQgbWluVGhyZXNob2xkLCBpbnQgbWF4VGhyZXNob2xkLCBTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucyBzdGNzT3B0aW9ucykKLSAgICB7Ci0gICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gcyA9IFNpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kubW9zdEludGVyZXN0aW5nQnVja2V0KGdldFNUQ1NCdWNrZXRzKHNzdGFibGVzLCBzdGNzT3B0aW9ucyksIG1pblRocmVzaG9sZCwgbWF4VGhyZXNob2xkKTsKLSAgICAgICAgbG9nZ2VyLmRlYnVnKCJHb3Qgc3N0YWJsZXMge30gZm9yIFNUQ1MgZnJvbSB7fSIsIHMsIHNzdGFibGVzKTsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxMaXN0PFNTVGFibGVSZWFkZXI+PiBnZXRTVENTQnVja2V0cyhDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IHNzdGFibGVzLCBTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucyBzdGNzT3B0aW9ucykKLSAgICB7Ci0gICAgICAgIExpc3Q8UGFpcjxTU1RhYmxlUmVhZGVyLExvbmc+PiBwYWlycyA9IFNpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kuY3JlYXRlU1NUYWJsZUFuZExlbmd0aFBhaXJzKEFic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5LmZpbHRlclN1c3BlY3RTU1RhYmxlcyhzc3RhYmxlcykpOwotICAgICAgICByZXR1cm4gU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneS5nZXRCdWNrZXRzKHBhaXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0Y3NPcHRpb25zLmJ1Y2tldEhpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rjc09wdGlvbnMuYnVja2V0TG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0Y3NPcHRpb25zLm1pblNTVGFibGVTaXplKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ29sbGVjdGlvbjxBYnN0cmFjdENvbXBhY3Rpb25UYXNrPiBnZXRNYXhpbWFsVGFzayhpbnQgZ2NCZWZvcmUsIGJvb2xlYW4gc3BsaXRPdXRwdXQpCi0gICAgewotICAgICAgICBJdGVyYWJsZTxTU1RhYmxlUmVhZGVyPiBmaWx0ZXJlZFNTVGFibGVzID0gZmlsdGVyU3VzcGVjdFNTVGFibGVzKHNzdGFibGVzKTsKLSAgICAgICAgaWYgKEl0ZXJhYmxlcy5pc0VtcHR5KGZpbHRlcmVkU1NUYWJsZXMpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KGZpbHRlcmVkU1NUYWJsZXMsIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTik7Ci0gICAgICAgIGlmICh0eG4gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuPEFic3RyYWN0Q29tcGFjdGlvblRhc2s+c2luZ2xldG9uKG5ldyBDb21wYWN0aW9uVGFzayhjZnMsIHR4biwgZ2NCZWZvcmUpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQWJzdHJhY3RDb21wYWN0aW9uVGFzayBnZXRVc2VyRGVmaW5lZFRhc2soQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcywgaW50IGdjQmVmb3JlKQotICAgIHsKLSAgICAgICAgYXNzZXJ0ICFzc3RhYmxlcy5pc0VtcHR5KCk7IC8vIGNoZWNrZWQgZm9yIGJ5IENNLnN1Ym1pdFVzZXJEZWZpbmVkCi0KLSAgICAgICAgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gbW9kaWZpZXIgPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlcywgT3BlcmF0aW9uVHlwZS5DT01QQUNUSU9OKTsKLSAgICAgICAgaWYgKG1vZGlmaWVyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiVW5hYmxlIHRvIG1hcmsge30gZm9yIGNvbXBhY3Rpb247IHByb2JhYmx5IGEgYmFja2dyb3VuZCBjb21wYWN0aW9uIGdvdCB0byBpdCBmaXJzdC4gIFlvdSBjYW4gZGlzYWJsZSBiYWNrZ3JvdW5kIGNvbXBhY3Rpb25zIHRlbXBvcmFyaWx5IGlmIHRoaXMgaXMgYSBwcm9ibGVtIiwgc3N0YWJsZXMpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25UYXNrKGNmcywgbW9kaWZpZXIsIGdjQmVmb3JlKS5zZXRVc2VyRGVmaW5lZCh0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlc3RpbWF0ZWRSZW1haW5pbmdUYXNrczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRNYXhTU1RhYmxlQnl0ZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIExvbmcuTUFYX1ZBTFVFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERUQ1Mgc2hvdWxkIG5vdCBncm91cCBzc3RhYmxlcyBmb3IgYW50aWNvbXBhY3Rpb24gLSB0aGlzIGNhbiBtaXggbmV3IGFuZCBvbGQgZGF0YQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb2xsZWN0aW9uPENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4+IGdyb3VwU1NUYWJsZXNGb3JBbnRpQ29tcGFjdGlvbihDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IHNzdGFibGVzVG9Hcm91cCkKLSAgICB7Ci0gICAgICAgIENvbGxlY3Rpb248Q29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPj4gZ3JvdXBzID0gbmV3IEFycmF5TGlzdDw+KHNzdGFibGVzVG9Hcm91cC5zaXplKCkpOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzVG9Hcm91cCkKLSAgICAgICAgewotICAgICAgICAgICAgZ3JvdXBzLmFkZChDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3N0YWJsZSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBncm91cHM7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbGlkYXRlT3B0aW9ucyhNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnMpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHVuY2hlY2tlZE9wdGlvbnMgPSBBYnN0cmFjdENvbXBhY3Rpb25TdHJhdGVneS52YWxpZGF0ZU9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIHVuY2hlY2tlZE9wdGlvbnMgPSBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy52YWxpZGF0ZU9wdGlvbnMob3B0aW9ucywgdW5jaGVja2VkT3B0aW9ucyk7Ci0KLSAgICAgICAgdW5jaGVja2VkT3B0aW9ucy5yZW1vdmUoQ29tcGFjdGlvblBhcmFtcy5PcHRpb24uTUlOX1RIUkVTSE9MRC50b1N0cmluZygpKTsKLSAgICAgICAgdW5jaGVja2VkT3B0aW9ucy5yZW1vdmUoQ29tcGFjdGlvblBhcmFtcy5PcHRpb24uTUFYX1RIUkVTSE9MRC50b1N0cmluZygpKTsKLQotICAgICAgICB1bmNoZWNrZWRPcHRpb25zID0gU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMudmFsaWRhdGVPcHRpb25zKG9wdGlvbnMsIHVuY2hlY2tlZE9wdGlvbnMpOwotCi0gICAgICAgIHJldHVybiB1bmNoZWNrZWRPcHRpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21wYWN0aW9uTG9nZ2VyLlN0cmF0ZWd5IHN0cmF0ZWd5TG9nZ2VyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbkxvZ2dlci5TdHJhdGVneSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBKc29uTm9kZSBzc3RhYmxlKFNTVGFibGVSZWFkZXIgc3N0YWJsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPYmplY3ROb2RlIG5vZGUgPSBKc29uTm9kZUZhY3RvcnkuaW5zdGFuY2Uub2JqZWN0Tm9kZSgpOwotICAgICAgICAgICAgICAgIG5vZGUucHV0KCJtaW5fdGltZXN0YW1wIiwgc3N0YWJsZS5nZXRNaW5UaW1lc3RhbXAoKSk7Ci0gICAgICAgICAgICAgICAgbm9kZS5wdXQoIm1heF90aW1lc3RhbXAiLCBzc3RhYmxlLmdldE1heFRpbWVzdGFtcCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIEpzb25Ob2RlIG9wdGlvbnMoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9iamVjdE5vZGUgbm9kZSA9IEpzb25Ob2RlRmFjdG9yeS5pbnN0YW5jZS5vYmplY3ROb2RlKCk7Ci0gICAgICAgICAgICAgICAgVGltZVVuaXQgcmVzb2x1dGlvbiA9IERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kudGhpcy5vcHRpb25zLnRpbWVzdGFtcFJlc29sdXRpb247Ci0gICAgICAgICAgICAgICAgbm9kZS5wdXQoRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuVElNRVNUQU1QX1JFU09MVVRJT05fS0VZLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgbm9kZS5wdXQoRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuQkFTRV9USU1FX0tFWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnRvU2Vjb25kcyhEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5LnRoaXMub3B0aW9ucy5iYXNlVGltZSkpOwotICAgICAgICAgICAgICAgIG5vZGUucHV0KERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLk1BWF9XSU5ET1dfU0laRV9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi50b1NlY29uZHMoRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneS50aGlzLm9wdGlvbnMubWF4V2luZG93U2l6ZSkpOwotICAgICAgICAgICAgICAgIHJldHVybiBub2RlOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIkRhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lbJXMvJXNdIiwKLSAgICAgICAgICAgICAgICBjZnMuZ2V0TWluaW11bUNvbXBhY3Rpb25UaHJlc2hvbGQoKSwKLSAgICAgICAgICAgICAgICBjZnMuZ2V0TWF4aW11bUNvbXBhY3Rpb25UaHJlc2hvbGQoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9EYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9EYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjA0YmJjLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucwotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5jbGFzcyk7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUaW1lVW5pdCBERUZBVUxUX1RJTUVTVEFNUF9SRVNPTFVUSU9OID0gVGltZVVuaXQuTUlDUk9TRUNPTkRTOwotICAgIEBEZXByZWNhdGVkCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgREVGQVVMVF9NQVhfU1NUQUJMRV9BR0VfREFZUyA9IDM2NSoxMDAwOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX0JBU0VfVElNRV9TRUNPTkRTID0gNjA7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfTUFYX1dJTkRPV19TSVpFX1NFQ09ORFMgPSBUaW1lVW5pdC5TRUNPTkRTLmNvbnZlcnQoMSwgVGltZVVuaXQuREFZUyk7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0VYUElSRURfU1NUQUJMRV9DSEVDS19GUkVRVUVOQ1lfU0VDT05EUyA9IDYwICogMTA7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRVNUQU1QX1JFU09MVVRJT05fS0VZID0gInRpbWVzdGFtcF9yZXNvbHV0aW9uIjsKLSAgICBARGVwcmVjYXRlZAotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9TU1RBQkxFX0FHRV9LRVkgPSAibWF4X3NzdGFibGVfYWdlX2RheXMiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfVElNRV9LRVkgPSAiYmFzZV90aW1lX3NlY29uZHMiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUElSRURfU1NUQUJMRV9DSEVDS19GUkVRVUVOQ1lfU0VDT05EU19LRVkgPSAiZXhwaXJlZF9zc3RhYmxlX2NoZWNrX2ZyZXF1ZW5jeV9zZWNvbmRzIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfV0lORE9XX1NJWkVfS0VZID0gIm1heF93aW5kb3dfc2l6ZV9zZWNvbmRzIjsKLQotICAgIEBEZXByZWNhdGVkCi0gICAgcHJvdGVjdGVkIGZpbmFsIGxvbmcgbWF4U1NUYWJsZUFnZTsKLSAgICBwcm90ZWN0ZWQgZmluYWwgVGltZVVuaXQgdGltZXN0YW1wUmVzb2x1dGlvbjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgbG9uZyBiYXNlVGltZTsKLSAgICBwcm90ZWN0ZWQgZmluYWwgbG9uZyBleHBpcmVkU1NUYWJsZUNoZWNrRnJlcXVlbmN5OwotICAgIHByb3RlY3RlZCBmaW5hbCBsb25nIG1heFdpbmRvd1NpemU7Ci0KLSAgICBwdWJsaWMgRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMoTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zKQotICAgIHsKLSAgICAgICAgU3RyaW5nIG9wdGlvblZhbHVlID0gb3B0aW9ucy5nZXQoVElNRVNUQU1QX1JFU09MVVRJT05fS0VZKTsKLSAgICAgICAgdGltZXN0YW1wUmVzb2x1dGlvbiA9IG9wdGlvblZhbHVlID09IG51bGwgPyBERUZBVUxUX1RJTUVTVEFNUF9SRVNPTFVUSU9OIDogVGltZVVuaXQudmFsdWVPZihvcHRpb25WYWx1ZSk7Ci0gICAgICAgIGlmICh0aW1lc3RhbXBSZXNvbHV0aW9uICE9IERFRkFVTFRfVElNRVNUQU1QX1JFU09MVVRJT04pCi0gICAgICAgICAgICBsb2dnZXIud2FybigiVXNpbmcgYSBub24tZGVmYXVsdCB0aW1lc3RhbXBfcmVzb2x1dGlvbiB7fSAtIGFyZSB5b3UgcmVhbGx5IGRvaW5nIGluc2VydHMgd2l0aCBVU0lORyBUSU1FU1RBTVAgPG5vbl9taWNyb3NlY29uZF90aW1lc3RhbXA+IChvciBkcml2ZXIgZXF1aXZhbGVudCk/IiwgdGltZXN0YW1wUmVzb2x1dGlvbik7Ci0gICAgICAgIG9wdGlvblZhbHVlID0gb3B0aW9ucy5nZXQoTUFYX1NTVEFCTEVfQUdFX0tFWSk7Ci0gICAgICAgIGRvdWJsZSBmcmFjdGlvbmFsRGF5cyA9IG9wdGlvblZhbHVlID09IG51bGwgPyBERUZBVUxUX01BWF9TU1RBQkxFX0FHRV9EQVlTIDogRG91YmxlLnBhcnNlRG91YmxlKG9wdGlvblZhbHVlKTsKLSAgICAgICAgbWF4U1NUYWJsZUFnZSA9IE1hdGgucm91bmQoZnJhY3Rpb25hbERheXMgKiB0aW1lc3RhbXBSZXNvbHV0aW9uLmNvbnZlcnQoMSwgVGltZVVuaXQuREFZUykpOwotICAgICAgICBvcHRpb25WYWx1ZSA9IG9wdGlvbnMuZ2V0KEJBU0VfVElNRV9LRVkpOwotICAgICAgICBiYXNlVGltZSA9IHRpbWVzdGFtcFJlc29sdXRpb24uY29udmVydChvcHRpb25WYWx1ZSA9PSBudWxsID8gREVGQVVMVF9CQVNFX1RJTUVfU0VDT05EUyA6IExvbmcucGFyc2VMb25nKG9wdGlvblZhbHVlKSwgVGltZVVuaXQuU0VDT05EUyk7Ci0gICAgICAgIG9wdGlvblZhbHVlID0gb3B0aW9ucy5nZXQoRVhQSVJFRF9TU1RBQkxFX0NIRUNLX0ZSRVFVRU5DWV9TRUNPTkRTX0tFWSk7Ci0gICAgICAgIGV4cGlyZWRTU1RhYmxlQ2hlY2tGcmVxdWVuY3kgPSBUaW1lVW5pdC5NSUxMSVNFQ09ORFMuY29udmVydChvcHRpb25WYWx1ZSA9PSBudWxsID8gREVGQVVMVF9FWFBJUkVEX1NTVEFCTEVfQ0hFQ0tfRlJFUVVFTkNZX1NFQ09ORFMgOiBMb25nLnBhcnNlTG9uZyhvcHRpb25WYWx1ZSksIFRpbWVVbml0LlNFQ09ORFMpOwotICAgICAgICBvcHRpb25WYWx1ZSA9IG9wdGlvbnMuZ2V0KE1BWF9XSU5ET1dfU0laRV9LRVkpOwotICAgICAgICBtYXhXaW5kb3dTaXplID0gdGltZXN0YW1wUmVzb2x1dGlvbi5jb252ZXJ0KG9wdGlvblZhbHVlID09IG51bGwgPyBERUZBVUxUX01BWF9XSU5ET1dfU0laRV9TRUNPTkRTIDogTG9uZy5wYXJzZUxvbmcob3B0aW9uVmFsdWUpLCBUaW1lVW5pdC5TRUNPTkRTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMoKQotICAgIHsKLSAgICAgICAgbWF4U1NUYWJsZUFnZSA9IE1hdGgucm91bmQoREVGQVVMVF9NQVhfU1NUQUJMRV9BR0VfREFZUyAqIERFRkFVTFRfVElNRVNUQU1QX1JFU09MVVRJT04uY29udmVydCgobG9uZykgREVGQVVMVF9NQVhfU1NUQUJMRV9BR0VfREFZUywgVGltZVVuaXQuREFZUykpOwotICAgICAgICB0aW1lc3RhbXBSZXNvbHV0aW9uID0gREVGQVVMVF9USU1FU1RBTVBfUkVTT0xVVElPTjsKLSAgICAgICAgYmFzZVRpbWUgPSB0aW1lc3RhbXBSZXNvbHV0aW9uLmNvbnZlcnQoREVGQVVMVF9CQVNFX1RJTUVfU0VDT05EUywgVGltZVVuaXQuU0VDT05EUyk7Ci0gICAgICAgIGV4cGlyZWRTU1RhYmxlQ2hlY2tGcmVxdWVuY3kgPSBUaW1lVW5pdC5NSUxMSVNFQ09ORFMuY29udmVydChERUZBVUxUX0VYUElSRURfU1NUQUJMRV9DSEVDS19GUkVRVUVOQ1lfU0VDT05EUywgVGltZVVuaXQuU0VDT05EUyk7Ci0gICAgICAgIG1heFdpbmRvd1NpemUgPSB0aW1lc3RhbXBSZXNvbHV0aW9uLmNvbnZlcnQoMSwgVGltZVVuaXQuREFZUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbGlkYXRlT3B0aW9ucyhNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnMsIE1hcDxTdHJpbmcsIFN0cmluZz4gdW5jaGVja2VkT3B0aW9ucykgdGhyb3dzICBDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgb3B0aW9uVmFsdWUgPSBvcHRpb25zLmdldChUSU1FU1RBTVBfUkVTT0xVVElPTl9LRVkpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG9wdGlvblZhbHVlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgVGltZVVuaXQudmFsdWVPZihvcHRpb25WYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJ0aW1lc3RhbXBfcmVzb2x1dGlvbiAlcyBpcyBub3QgdmFsaWQiLCBvcHRpb25WYWx1ZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3B0aW9uVmFsdWUgPSBvcHRpb25zLmdldChNQVhfU1NUQUJMRV9BR0VfS0VZKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGRvdWJsZSBtYXhTU3RhYmxlQWdlID0gb3B0aW9uVmFsdWUgPT0gbnVsbCA/IERFRkFVTFRfTUFYX1NTVEFCTEVfQUdFX0RBWVMgOiBEb3VibGUucGFyc2VEb3VibGUob3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgaWYgKG1heFNTdGFibGVBZ2UgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIiVzIG11c3QgYmUgbm9uLW5lZ2F0aXZlOiAlLjJmIiwgTUFYX1NTVEFCTEVfQUdFX0tFWSwgbWF4U1N0YWJsZUFnZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiJXMgaXMgbm90IGEgcGFyc2FibGUgaW50IChiYXNlMTApIGZvciAlcyIsIG9wdGlvblZhbHVlLCBNQVhfU1NUQUJMRV9BR0VfS0VZKSwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBvcHRpb25WYWx1ZSA9IG9wdGlvbnMuZ2V0KEJBU0VfVElNRV9LRVkpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgbG9uZyBiYXNlVGltZSA9IG9wdGlvblZhbHVlID09IG51bGwgPyBERUZBVUxUX0JBU0VfVElNRV9TRUNPTkRTIDogTG9uZy5wYXJzZUxvbmcob3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgaWYgKGJhc2VUaW1lIDw9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiJXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCwgYnV0IHdhcyAlZCIsIEJBU0VfVElNRV9LRVksIGJhc2VUaW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCIlcyBpcyBub3QgYSBwYXJzYWJsZSBpbnQgKGJhc2UxMCkgZm9yICVzIiwgb3B0aW9uVmFsdWUsIEJBU0VfVElNRV9LRVkpLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIG9wdGlvblZhbHVlID0gb3B0aW9ucy5nZXQoRVhQSVJFRF9TU1RBQkxFX0NIRUNLX0ZSRVFVRU5DWV9TRUNPTkRTX0tFWSk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nIGV4cGlyZWRDaGVja0ZyZXF1ZW5jeSA9IG9wdGlvblZhbHVlID09IG51bGwgPyBERUZBVUxUX0VYUElSRURfU1NUQUJMRV9DSEVDS19GUkVRVUVOQ1lfU0VDT05EUyA6IExvbmcucGFyc2VMb25nKG9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChleHBpcmVkQ2hlY2tGcmVxdWVuY3kgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIiVzIG11c3Qgbm90IGJlIG5lZ2F0aXZlLCBidXQgd2FzICVkIiwgRVhQSVJFRF9TU1RBQkxFX0NIRUNLX0ZSRVFVRU5DWV9TRUNPTkRTX0tFWSwgZXhwaXJlZENoZWNrRnJlcXVlbmN5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCIlcyBpcyBub3QgYSBwYXJzYWJsZSBpbnQgKGJhc2UxMCkgZm9yICVzIiwgb3B0aW9uVmFsdWUsIEVYUElSRURfU1NUQUJMRV9DSEVDS19GUkVRVUVOQ1lfU0VDT05EU19LRVkpLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIG9wdGlvblZhbHVlID0gb3B0aW9ucy5nZXQoTUFYX1dJTkRPV19TSVpFX0tFWSk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nIG1heFdpbmRvd1NpemUgPSBvcHRpb25WYWx1ZSA9PSBudWxsID8gREVGQVVMVF9NQVhfV0lORE9XX1NJWkVfU0VDT05EUyA6IExvbmcucGFyc2VMb25nKG9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChtYXhXaW5kb3dTaXplIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCIlcyBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwgYnV0IHdhcyAlZCIsIE1BWF9XSU5ET1dfU0laRV9LRVksIG1heFdpbmRvd1NpemUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIiVzIGlzIG5vdCBhIHBhcnNhYmxlIGludCAoYmFzZTEwKSBmb3IgJXMiLCBvcHRpb25WYWx1ZSwgTUFYX1dJTkRPV19TSVpFX0tFWSksIGUpOwotICAgICAgICB9Ci0KLQotICAgICAgICB1bmNoZWNrZWRPcHRpb25zLnJlbW92ZShNQVhfU1NUQUJMRV9BR0VfS0VZKTsKLSAgICAgICAgdW5jaGVja2VkT3B0aW9ucy5yZW1vdmUoQkFTRV9USU1FX0tFWSk7Ci0gICAgICAgIHVuY2hlY2tlZE9wdGlvbnMucmVtb3ZlKFRJTUVTVEFNUF9SRVNPTFVUSU9OX0tFWSk7Ci0gICAgICAgIHVuY2hlY2tlZE9wdGlvbnMucmVtb3ZlKEVYUElSRURfU1NUQUJMRV9DSEVDS19GUkVRVUVOQ1lfU0VDT05EU19LRVkpOwotICAgICAgICB1bmNoZWNrZWRPcHRpb25zLnJlbW92ZShNQVhfV0lORE9XX1NJWkVfS0VZKTsKLQotICAgICAgICByZXR1cm4gdW5jaGVja2VkT3B0aW9uczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0xldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3kuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneS5qYXZhCmluZGV4IDU0OTUzZTQuLmJiZGQxM2MgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneS5qYXZhCkBAIC0zMyw3ICszMyw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5TdGF0c01ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wYWN0aW9uUGFyYW1zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOwpAQCAtNDMsMTEgKzQyLDEzIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU1NUYWJsZVNjYW5uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRPTEVSQVRFX1NTVEFCTEVfU0laRTsKKwogcHVibGljIGNsYXNzIExldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENvbXBhY3Rpb25TdHJhdGVneQogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NUQUJMRV9TSVpFX09QVElPTiA9ICJzc3RhYmxlX3NpemVfaW5fbWIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gdG9sZXJhdGVTc3RhYmxlU2l6ZSA9IEJvb2xlYW4uZ2V0Qm9vbGVhbihDb25maWcuUFJPUEVSVFlfUFJFRklYICsgInRvbGVyYXRlX3NzdGFibGVfc2l6ZSIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gdG9sZXJhdGVTc3RhYmxlU2l6ZSA9IFRPTEVSQVRFX1NTVEFCTEVfU0laRS5nZXRCb29sZWFuKCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExFVkVMX0ZBTk9VVF9TSVpFX09QVElPTiA9ICJmYW5vdXRfc2l6ZSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRV9TU1RBQkxFX1VQTEVWRUxfT1BUSU9OID0gInNpbmdsZV9zc3RhYmxlX3VwbGV2ZWwiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTEVWRUxfRkFOT1VUX1NJWkUgPSAxMDsKQEAgLTI4MCw2ICsyODEsMTIgQEAKICAgICAgICAgcmV0dXJuIG47CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgaW50IGdldEVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzKGludCBhZGRpdGlvbmFsU1NUYWJsZXMsIGxvbmcgYWRkaXRpb25hbEJ5dGVzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1hbmlmZXN0LmdldEVzdGltYXRlZFRhc2tzKGFkZGl0aW9uYWxCeXRlcyk7CisgICAgfQorCiAgICAgcHVibGljIGxvbmcgZ2V0TWF4U1NUYWJsZUJ5dGVzKCkKICAgICB7CiAgICAgICAgIHJldHVybiBtYXhTU1RhYmxlU2l6ZUluTWlCICogMTAyNEwgKiAxMDI0TDsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vTGV2ZWxlZEdlbmVyYXRpb25zLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0xldmVsZWRHZW5lcmF0aW9ucy5qYXZhCmluZGV4IDM2YjU2MDAuLjA4Y2RhODkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vTGV2ZWxlZEdlbmVyYXRpb25zLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9MZXZlbGVkR2VuZXJhdGlvbnMuamF2YQpAQCAtMzcsMTEgKzM3LDExIEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlSWRGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX1NUUklDVF9MQ1NfQ0hFQ0tTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwubmFub1RpbWU7CiAKIC8qKgpAQCAtNTIsNyArNTIsNyBAQAogY2xhc3MgTGV2ZWxlZEdlbmVyYXRpb25zCiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKExldmVsZWRHZW5lcmF0aW9ucy5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHN0cmljdExDU0NoZWNrc1Rlc3QgPSBCb29sZWFuLmdldEJvb2xlYW4oQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJ0ZXN0LnN0cmljdF9sY3NfY2hlY2tzIik7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHN0cmljdExDU0NoZWNrc1Rlc3QgPSBURVNUX1NUUklDVF9MQ1NfQ0hFQ0tTLmdldEJvb2xlYW4oKTsKICAgICAvLyBJdCBpbmNsdWRlcyBMMCwgaS5lLiB3ZSBzdXBwb3J0IFtMMCAtIEw4XSBsZXZlbHMKICAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9MRVZFTF9DT1VOVCA9IDk7CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vTGV2ZWxlZE1hbmlmZXN0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0xldmVsZWRNYW5pZmVzdC5qYXZhCmluZGV4IDI5NzJkN2QuLjQzMzkxODEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vTGV2ZWxlZE1hbmlmZXN0LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9MZXZlbGVkTWFuaWZlc3QuamF2YQpAQCAtMTcsNyArMTcsMTcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uOwogCi1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZXM7CkBAIC0yNiwxOCArMzYsMTYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5JbnRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUGFydGl0aW9uUG9zaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5QYXJ0aXRpb25Qb3NpdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQm91bmRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiAKQEAgLTExNCw3ICsxMjIsNyBAQAogICAgICAgICAgICAgbG9uZyBtYXhNb2RpZmljYXRpb25UaW1lID0gTG9uZy5NSU5fVkFMVUU7CiAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3NUYWJsZVJlYWRlciA6IGxldmVsKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvbmcgbW9kaWZpY2F0aW9uVGltZSA9IHNzVGFibGVSZWFkZXIuZ2V0Q3JlYXRpb25UaW1lRm9yKENvbXBvbmVudC5EQVRBKTsKKyAgICAgICAgICAgICAgICBsb25nIG1vZGlmaWNhdGlvblRpbWUgPSBzc1RhYmxlUmVhZGVyLmdldERhdGFDcmVhdGlvblRpbWUoKTsKICAgICAgICAgICAgICAgICBpZiAobW9kaWZpY2F0aW9uVGltZSA+PSBtYXhNb2RpZmljYXRpb25UaW1lKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZVdpdGhNYXhNb2RpZmljYXRpb25UaW1lID0gc3NUYWJsZVJlYWRlcjsKQEAgLTYyMiwxNiArNjMwLDI1IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldEVzdGltYXRlZFRhc2tzKCkKKyAgICBwdWJsaWMgaW50IGdldEVzdGltYXRlZFRhc2tzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRFc3RpbWF0ZWRUYXNrcygwKTsKKyAgICB9CisKKyAgICBpbnQgZ2V0RXN0aW1hdGVkVGFza3MobG9uZyBhZGRpdGlvbmFsTGV2ZWwwQnl0ZXMpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0RXN0aW1hdGVkVGFza3MoKGxldmVsKSAtPiBTU1RhYmxlUmVhZGVyLmdldFRvdGFsQnl0ZXMoZ2V0TGV2ZWwobGV2ZWwpKSArIChsZXZlbCA9PSAwID8gYWRkaXRpb25hbExldmVsMEJ5dGVzIDogMCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIGludCBnZXRFc3RpbWF0ZWRUYXNrcyhGdW5jdGlvbjxJbnRlZ2VyLExvbmc+IGZuVG90YWxTaXplQnl0ZXNCeUxldmVsKQogICAgIHsKICAgICAgICAgbG9uZyB0YXNrcyA9IDA7CiAgICAgICAgIGxvbmdbXSBlc3RpbWF0ZWQgPSBuZXcgbG9uZ1tnZW5lcmF0aW9ucy5sZXZlbENvdW50KCldOwogCiAgICAgICAgIGZvciAoaW50IGkgPSBnZW5lcmF0aW9ucy5sZXZlbENvdW50KCkgLSAxOyBpID49IDA7IGktLSkKICAgICAgICAgewotICAgICAgICAgICAgU2V0PFNTVGFibGVSZWFkZXI+IHNzdGFibGVzID0gZ2VuZXJhdGlvbnMuZ2V0KGkpOwogICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgMSBieXRlIG92ZXIgVEJMIC0gKE1CTCAqIDEuMDAxKSwgdGhlcmUgaXMgc3RpbGwgYSB0YXNrIGxlZnQsIHNvIHdlIG5lZWQgdG8gcm91bmQgdXAuCi0gICAgICAgICAgICBlc3RpbWF0ZWRbaV0gPSAobG9uZylNYXRoLmNlaWwoKGRvdWJsZSlNYXRoLm1heCgwTCwgU1NUYWJsZVJlYWRlci5nZXRUb3RhbEJ5dGVzKHNzdGFibGVzKSAtIChsb25nKShtYXhCeXRlc0ZvckxldmVsKGksIG1heFNTVGFibGVTaXplSW5CeXRlcykgKiAxLjAwMSkpIC8gKGRvdWJsZSltYXhTU1RhYmxlU2l6ZUluQnl0ZXMpOworICAgICAgICAgICAgZXN0aW1hdGVkW2ldID0gKGxvbmcpTWF0aC5jZWlsKChkb3VibGUpTWF0aC5tYXgoMEwsIGZuVG90YWxTaXplQnl0ZXNCeUxldmVsLmFwcGx5KGkpIC0gKGxvbmcpKG1heEJ5dGVzRm9yTGV2ZWwoaSwgbWF4U1NUYWJsZVNpemVJbkJ5dGVzKSAqIDEuMDAxKSkgLyAoZG91YmxlKW1heFNTVGFibGVTaXplSW5CeXRlcyk7CiAgICAgICAgICAgICB0YXNrcyArPSBlc3RpbWF0ZWRbaV07CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9PcGVyYXRpb25UeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL09wZXJhdGlvblR5cGUuamF2YQppbmRleCBlOTU3ZTQyLi4yYTVmZmM2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL09wZXJhdGlvblR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL09wZXJhdGlvblR5cGUuamF2YQpAQCAtMjAsMzUgKzIwLDU4IEBACiBwdWJsaWMgZW51bSBPcGVyYXRpb25UeXBlCiB7CiAgICAgLyoqIEVhY2ggbW9kaWZpY2F0aW9uIGhlcmUgc2hvdWxkIGJlIGFsc28gYXBwbGllZCB0byB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMubm9kZXRvb2wuU3RvcCNjb21wYWN0aW9uVHlwZX0gKi8KLSAgICBDT01QQUNUSU9OKCJDb21wYWN0aW9uIiksCi0gICAgVkFMSURBVElPTigiVmFsaWRhdGlvbiIpLAotICAgIEtFWV9DQUNIRV9TQVZFKCJLZXkgY2FjaGUgc2F2ZSIpLAotICAgIFJPV19DQUNIRV9TQVZFKCJSb3cgY2FjaGUgc2F2ZSIpLAotICAgIENPVU5URVJfQ0FDSEVfU0FWRSgiQ291bnRlciBjYWNoZSBzYXZlIiksCi0gICAgQ0xFQU5VUCgiQ2xlYW51cCIpLAotICAgIFNDUlVCKCJTY3J1YiIpLAotICAgIFVQR1JBREVfU1NUQUJMRVMoIlVwZ3JhZGUgc3N0YWJsZXMiKSwKLSAgICBJTkRFWF9CVUlMRCgiU2Vjb25kYXJ5IGluZGV4IGJ1aWxkIiksCi0gICAgLyoqIENvbXBhY3Rpb24gZm9yIHRvbWJzdG9uZSByZW1vdmFsICovCi0gICAgVE9NQlNUT05FX0NPTVBBQ1RJT04oIlRvbWJzdG9uZSBDb21wYWN0aW9uIiksCi0gICAgVU5LTk9XTigiVW5rbm93biBjb21wYWN0aW9uIHR5cGUiKSwKLSAgICBBTlRJQ09NUEFDVElPTigiQW50aWNvbXBhY3Rpb24gYWZ0ZXIgcmVwYWlyIiksCi0gICAgVkVSSUZZKCJWZXJpZnkiKSwKLSAgICBGTFVTSCgiRmx1c2giKSwKLSAgICBTVFJFQU0oIlN0cmVhbSIpLAotICAgIFdSSVRFKCJXcml0ZSIpLAotICAgIFZJRVdfQlVJTEQoIlZpZXcgYnVpbGQiKSwKLSAgICBJTkRFWF9TVU1NQVJZKCJJbmRleCBzdW1tYXJ5IHJlZGlzdHJpYnV0aW9uIiksCi0gICAgUkVMT0NBVEUoIlJlbG9jYXRlIHNzdGFibGVzIHRvIGNvcnJlY3QgZGlzayIpLAotICAgIEdBUkJBR0VfQ09MTEVDVCgiUmVtb3ZlIGRlbGV0ZWQgZGF0YSIpOworICAgIFAwKCJDYW5jZWwgYWxsIG9wZXJhdGlvbnMiLCBmYWxzZSwgMCksCisKKyAgICAvLyBBdXRvbWF0aW9uIG9yIG9wZXJhdG9yLWRyaXZlbiB0YXNrcworICAgIENMRUFOVVAoIkNsZWFudXAiLCB0cnVlLCAxKSwKKyAgICBTQ1JVQigiU2NydWIiLCB0cnVlLCAxKSwKKyAgICBVUEdSQURFX1NTVEFCTEVTKCJVcGdyYWRlIHNzdGFibGVzIiwgdHJ1ZSwgMSksCisgICAgVkVSSUZZKCJWZXJpZnkiLCBmYWxzZSwgMSksCisgICAgTUFKT1JfQ09NUEFDVElPTigiTWFqb3IgY29tcGFjdGlvbiIsIHRydWUsIDEpLAorICAgIFJFTE9DQVRFKCJSZWxvY2F0ZSBzc3RhYmxlcyB0byBjb3JyZWN0IGRpc2siLCBmYWxzZSwgMSksCisgICAgR0FSQkFHRV9DT0xMRUNUKCJSZW1vdmUgZGVsZXRlZCBkYXRhIiwgdHJ1ZSwgMSksCisKKyAgICAvLyBJbnRlcm5hbCBTU1RhYmxlIHdyaXRpbmcKKyAgICBGTFVTSCgiRmx1c2giLCB0cnVlLCAxKSwKKyAgICBXUklURSgiV3JpdGUiLCB0cnVlLCAxKSwKKworICAgIEFOVElDT01QQUNUSU9OKCJBbnRpY29tcGFjdGlvbiBhZnRlciByZXBhaXIiLCB0cnVlLCAyKSwKKyAgICBWQUxJREFUSU9OKCJWYWxpZGF0aW9uIiwgZmFsc2UsIDMpLAorCisgICAgSU5ERVhfQlVJTEQoIlNlY29uZGFyeSBpbmRleCBidWlsZCIsIGZhbHNlLCA0KSwKKyAgICBWSUVXX0JVSUxEKCJWaWV3IGJ1aWxkIiwgZmFsc2UsIDQpLAorCisgICAgQ09NUEFDVElPTigiQ29tcGFjdGlvbiIsIHRydWUsIDUpLAorICAgIFRPTUJTVE9ORV9DT01QQUNUSU9OKCJUb21ic3RvbmUgQ29tcGFjdGlvbiIsIHRydWUsIDUpLCAvLyBDb21wYWN0aW9uIGZvciB0b21ic3RvbmUgcmVtb3ZhbAorICAgIFVOS05PV04oIlVua25vd24gY29tcGFjdGlvbiB0eXBlIiwgZmFsc2UsIDUpLAorCisgICAgU1RSRUFNKCJTdHJlYW0iLCB0cnVlLCA2KSwKKyAgICBLRVlfQ0FDSEVfU0FWRSgiS2V5IGNhY2hlIHNhdmUiLCBmYWxzZSwgNiksCisgICAgUk9XX0NBQ0hFX1NBVkUoIlJvdyBjYWNoZSBzYXZlIiwgZmFsc2UsIDYpLAorICAgIENPVU5URVJfQ0FDSEVfU0FWRSgiQ291bnRlciBjYWNoZSBzYXZlIiwgZmFsc2UsIDYpLAorICAgIElOREVYX1NVTU1BUlkoIkluZGV4IHN1bW1hcnkgcmVkaXN0cmlidXRpb24iLCBmYWxzZSwgNik7CiAKICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHR5cGU7CiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBmaWxlTmFtZTsKIAotICAgIE9wZXJhdGlvblR5cGUoU3RyaW5nIHR5cGUpCisgICAgLyoqCisgICAgICogRm9yIHB1cnBvc2VzIG9mIGNhbGN1bGF0aW5nIHNwYWNlIGZvciBpbnRlcmltIGNvbXBhY3Rpb25zIGluIGZsaWdodCwgd2hldGhlciBvciBub3QgdGhpcyBPcGVyYXRpb25UeXBlIGlzIGV4cGVjdGVkCisgICAgICogdG8gd3JpdGUgZGF0YSB0byBkaXNrCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gd3JpdGVzRGF0YTsKKworICAgIC8vIEFzIG9mIG5vdywgcHJpb3JpdHkgdGFrZXMgcGFydCBvbmx5IGZvciBpbnRlcnJ1cHRpbmcgdGFza3MgdG8gZ2l2ZSB3YXkgdG8gb3BlcmF0b3ItZHJpdmVuIHRhc2tzLgorICAgIC8vIE9wZXJhdGlvbiB0eXBlcyB0aGF0IGhhdmUgYSBzbWFsbGVyIG51bWJlciB3aWxsIGJlIGFsbG93ZWQgdG8gY2FuY2VsIG9uZXMgdGhhdCBoYXZlIGxhcmdlciBudW1iZXJzLgorICAgIC8vCisgICAgLy8gU3VibWl0dGVkIHRhc2tzIG1heSBiZSBwcmlvcml0aXNlZCBkaWZmZXJlbnRseSB3aGVuIGZvcm1pbmcgYSBxdWV1ZSwgaWYvd2hlbiBDQVNTQU5EUkEtMTEyMTggaXMgaW1wbGVtZW50ZWQuCisgICAgcHVibGljIGZpbmFsIGludCBwcmlvcml0eTsKKworICAgIE9wZXJhdGlvblR5cGUoU3RyaW5nIHR5cGUsIGJvb2xlYW4gd3JpdGVzRGF0YSwgaW50IHByaW9yaXR5KQogICAgIHsKICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICAgICAgdGhpcy5maWxlTmFtZSA9IHR5cGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCIgIiwgIiIpOworICAgICAgICB0aGlzLndyaXRlc0RhdGEgPSB3cml0ZXNEYXRhOworICAgICAgICB0aGlzLnByaW9yaXR5ID0gcHJpb3JpdHk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBPcGVyYXRpb25UeXBlIGZyb21GaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1BlbmRpbmdSZXBhaXJIb2xkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vUGVuZGluZ1JlcGFpckhvbGRlci5qYXZhCmluZGV4IDMxNGRmOWUuLmJmNmM0OTcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vUGVuZGluZ1JlcGFpckhvbGRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vUGVuZGluZ1JlcGFpckhvbGRlci5qYXZhCkBAIC0yODEsNCArMjgxLDEzIEBACiAgICAgewogICAgICAgICByZXR1cm4gSXRlcmFibGVzLmFueShtYW5hZ2VycywgcHJtIC0+IHBybS5jb250YWluc1NTVGFibGUoc3N0YWJsZSkpOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MoKQorICAgIHsKKyAgICAgICAgaW50IHRhc2tzID0gMDsKKyAgICAgICAgZm9yIChQZW5kaW5nUmVwYWlyTWFuYWdlciBtYW5hZ2VyIDogbWFuYWdlcnMpCisgICAgICAgICAgICB0YXNrcyArPSBtYW5hZ2VyLmdldEVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzKCk7CisgICAgICAgIHJldHVybiB0YXNrczsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1BlbmRpbmdSZXBhaXJNYW5hZ2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1BlbmRpbmdSZXBhaXJNYW5hZ2VyLmphdmEKaW5kZXggMTFkNmZlOC4uODVhNDQ4MyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9QZW5kaW5nUmVwYWlyTWFuYWdlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vUGVuZGluZ1JlcGFpck1hbmFnZXIuamF2YQpAQCAtMjI4LDIyICsyMjgsMjUgQEAKIAogICAgIHByaXZhdGUgaW50IGdldEVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzKFRpbWVVVUlEIHNlc3Npb25JRCwgQWJzdHJhY3RDb21wYWN0aW9uU3RyYXRlZ3kgc3RyYXRlZ3kpCiAgICAgewotICAgICAgICBpZiAoY2FuQ2xlYW51cChzZXNzaW9uSUQpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzdHJhdGVneS5nZXRFc3RpbWF0ZWRSZW1haW5pbmdUYXNrcygpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRFc3RpbWF0ZWRSZW1haW5pbmdUYXNrcyhzZXNzaW9uSUQsIHN0cmF0ZWd5LCAwLCAwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRFc3RpbWF0ZWRSZW1haW5pbmdUYXNrcyhUaW1lVVVJRCBzZXNzaW9uSUQsIEFic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5IHN0cmF0ZWd5LCBpbnQgYWRkaXRpb25hbFNTVGFibGVzLCBsb25nIGFkZGl0aW9uYWxCeXRlcykKKyAgICB7CisgICAgICAgIHJldHVybiBjYW5DbGVhbnVwKHNlc3Npb25JRCkgPyAwIDogc3RyYXRlZ3kuZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MoKTsKICAgICB9CiAKICAgICBpbnQgZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MoKQogICAgIHsKKyAgICAgICAgcmV0dXJuIGdldEVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzKDAsIDApOworICAgIH0KKworICAgIGludCBnZXRFc3RpbWF0ZWRSZW1haW5pbmdUYXNrcyhpbnQgYWRkaXRpb25hbFNTVGFibGVzLCBsb25nIGFkZGl0aW9uYWxCeXRlcykKKyAgICB7CiAgICAgICAgIGludCB0YXNrcyA9IDA7CiAgICAgICAgIGZvciAoTWFwLkVudHJ5PFRpbWVVVUlELCBBYnN0cmFjdENvbXBhY3Rpb25TdHJhdGVneT4gZW50cnkgOiBzdHJhdGVnaWVzLmVudHJ5U2V0KCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRhc2tzICs9IGdldEVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHRhc2tzICs9IGdldEVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpLCBhZGRpdGlvbmFsU1NUYWJsZXMsIGFkZGl0aW9uYWxCeXRlcyk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRhc2tzOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vU2NydWJiZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vU2NydWJiZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4MjVkMC4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1NjcnViYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FcnJvcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Mb2NrOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlYWRXcml0ZUxvY2s7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jazsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlczsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5TdGF0c01ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmFuZG9tQWNjZXNzUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQWN0aXZlUmVwYWlyU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuUmVmczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuSGVhcENsb25lcjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEOwotCi1wdWJsaWMgY2xhc3MgU2NydWJiZXIgaW1wbGVtZW50cyBDbG9zZWFibGUKLXsKLSAgICBwcml2YXRlIGZpbmFsIENvbHVtbkZhbWlseVN0b3JlIGNmczsKLSAgICBwcml2YXRlIGZpbmFsIFNTVGFibGVSZWFkZXIgc3N0YWJsZTsKLSAgICBwcml2YXRlIGZpbmFsIExpZmVjeWNsZVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uOwotICAgIHByaXZhdGUgZmluYWwgRmlsZSBkZXN0aW5hdGlvbjsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gc2tpcENvcnJ1cHRlZDsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVpbnNlcnRPdmVyZmxvd2VkVFRMUm93czsKLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0NvbW11dGF0aXZlOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0luZGV4OwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjaGVja0RhdGE7Ci0gICAgcHJpdmF0ZSBmaW5hbCBsb25nIGV4cGVjdGVkQmxvb21GaWx0ZXJTaXplOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBSZWFkV3JpdGVMb2NrIGZpbGVBY2Nlc3NMb2NrOwotICAgIHByaXZhdGUgZmluYWwgUmFuZG9tQWNjZXNzUmVhZGVyIGRhdGFGaWxlOwotICAgIHByaXZhdGUgZmluYWwgUmFuZG9tQWNjZXNzUmVhZGVyIGluZGV4RmlsZTsKLSAgICBwcml2YXRlIGZpbmFsIFNjcnViSW5mbyBzY3J1YkluZm87Ci0gICAgcHJpdmF0ZSBmaW5hbCBSb3dJbmRleEVudHJ5LkluZGV4U2VyaWFsaXplciByb3dJbmRleEVudHJ5U2VyaWFsaXplcjsKLQotICAgIHByaXZhdGUgaW50IGdvb2RQYXJ0aXRpb25zOwotICAgIHByaXZhdGUgaW50IGJhZFBhcnRpdGlvbnM7Ci0gICAgcHJpdmF0ZSBpbnQgZW1wdHlQYXJ0aXRpb25zOwotCi0gICAgcHJpdmF0ZSBCeXRlQnVmZmVyIGN1cnJlbnRJbmRleEtleTsKLSAgICBwcml2YXRlIEJ5dGVCdWZmZXIgbmV4dEluZGV4S2V5OwotICAgIHByaXZhdGUgbG9uZyBjdXJyZW50UGFydGl0aW9uUG9zaXRpb25Gcm9tSW5kZXg7Ci0gICAgcHJpdmF0ZSBsb25nIG5leHRQYXJ0aXRpb25Qb3NpdGlvbkZyb21JbmRleDsKLQotICAgIHByaXZhdGUgTmVnYXRpdmVMb2NhbERlbGV0aW9uSW5mb01ldHJpY3MgbmVnYXRpdmVMb2NhbERlbGV0aW9uSW5mb01ldHJpY3MgPSBuZXcgTmVnYXRpdmVMb2NhbERlbGV0aW9uSW5mb01ldHJpY3MoKTsKLQotICAgIHByaXZhdGUgZmluYWwgT3V0cHV0SGFuZGxlciBvdXRwdXRIYW5kbGVyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxQYXJ0aXRpb24+IHBhcnRpdGlvbkNvbXBhcmF0b3IgPSBDb21wYXJhdG9yLmNvbXBhcmluZyhQYXJ0aXRpb246OnBhcnRpdGlvbktleSk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTb3J0ZWRTZXQ8UGFydGl0aW9uPiBvdXRPZk9yZGVyID0gbmV3IFRyZWVTZXQ8PihwYXJ0aXRpb25Db21wYXJhdG9yKTsKLQotICAgIHB1YmxpYyBTY3J1YmJlcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIExpZmVjeWNsZVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uLCBib29sZWFuIHNraXBDb3JydXB0ZWQsIGJvb2xlYW4gY2hlY2tEYXRhKQotICAgIHsKLSAgICAgICAgdGhpcyhjZnMsIHRyYW5zYWN0aW9uLCBza2lwQ29ycnVwdGVkLCBjaGVja0RhdGEsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NydWJiZXIoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiwgYm9vbGVhbiBza2lwQ29ycnVwdGVkLCBib29sZWFuIGNoZWNrRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZWluc2VydE92ZXJmbG93ZWRUVExSb3dzKQotICAgIHsKLSAgICAgICAgdGhpcyhjZnMsIHRyYW5zYWN0aW9uLCBza2lwQ29ycnVwdGVkLCBuZXcgT3V0cHV0SGFuZGxlci5Mb2dPdXRwdXQoKSwgY2hlY2tEYXRhLCByZWluc2VydE92ZXJmbG93ZWRUVExSb3dzKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQotICAgIHB1YmxpYyBTY3J1YmJlcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsCi0gICAgICAgICAgICAgICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uLAotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNraXBDb3JydXB0ZWQsCi0gICAgICAgICAgICAgICAgICAgIE91dHB1dEhhbmRsZXIgb3V0cHV0SGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjaGVja0RhdGEsCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVpbnNlcnRPdmVyZmxvd2VkVFRMUm93cykKLSAgICB7Ci0gICAgICAgIHRoaXMuY2ZzID0gY2ZzOwotICAgICAgICB0aGlzLnRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247Ci0gICAgICAgIHRoaXMuc3N0YWJsZSA9IHRyYW5zYWN0aW9uLm9ubHlPbmUoKTsKLSAgICAgICAgdGhpcy5vdXRwdXRIYW5kbGVyID0gb3V0cHV0SGFuZGxlcjsKLSAgICAgICAgdGhpcy5za2lwQ29ycnVwdGVkID0gc2tpcENvcnJ1cHRlZDsKLSAgICAgICAgdGhpcy5yZWluc2VydE92ZXJmbG93ZWRUVExSb3dzID0gcmVpbnNlcnRPdmVyZmxvd2VkVFRMUm93czsKLSAgICAgICAgdGhpcy5yb3dJbmRleEVudHJ5U2VyaWFsaXplciA9IHNzdGFibGUuZGVzY3JpcHRvci52ZXJzaW9uLmdldFNTVGFibGVGb3JtYXQoKS5nZXRJbmRleFNlcmlhbGl6ZXIoY2ZzLm1ldGFkYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuZGVzY3JpcHRvci52ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmhlYWRlcik7Ci0KLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiB0b1NjcnViID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChzc3RhYmxlKTsKLQotICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gY2ZzLmdldERpcmVjdG9yaWVzKCkuZ2V0TG9jYXRpb25Gb3JEaXNrKGNmcy5nZXREaXNrQm91bmRhcmllcygpLmdldENvcnJlY3REaXNrRm9yU1NUYWJsZShzc3RhYmxlKSk7Ci0gICAgICAgIHRoaXMuaXNDb21tdXRhdGl2ZSA9IGNmcy5tZXRhZGF0YSgpLmlzQ291bnRlcigpOwotCi0gICAgICAgIGJvb2xlYW4gaGFzSW5kZXhGaWxlID0gKG5ldyBGaWxlKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuUFJJTUFSWV9JTkRFWCkpKS5leGlzdHMoKTsKLSAgICAgICAgdGhpcy5pc0luZGV4ID0gY2ZzLmlzSW5kZXgoKTsKLSAgICAgICAgaWYgKCFoYXNJbmRleEZpbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGlmIHRoZXJlJ3MgYW55IGNvcnJ1cHRpb24gaW4gdGhlIC1EYXRhLmRiIHRoZW4gcGFydGl0aW9ucyBjYW4ndCBiZSBza2lwcGVkIG92ZXIuIGJ1dCBpdCdzIHdvcnRoIGEgc2hvdC4KLSAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2FybigiTWlzc2luZyBjb21wb25lbnQ6ICIgKyBzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlBSSU1BUllfSU5ERVgpKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmNoZWNrRGF0YSA9IGNoZWNrRGF0YSAmJiAhdGhpcy5pc0luZGV4OyAvL0xvY2FsQnlQYXJ0aXRpb25lclR5cGUgZG9lcyBub3Qgc3VwcG9ydCB2YWxpZGF0aW9uCi0gICAgICAgIHRoaXMuZXhwZWN0ZWRCbG9vbUZpbHRlclNpemUgPSBNYXRoLm1heCgKLSAgICAgICAgICAgIGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsLAotICAgICAgICAgICAgaGFzSW5kZXhGaWxlID8gU1NUYWJsZVJlYWRlci5nZXRBcHByb3hpbWF0ZUtleUNvdW50KHRvU2NydWIpIDogMCk7Ci0KLSAgICAgICAgdGhpcy5maWxlQWNjZXNzTG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7Ci0gICAgICAgIC8vIGxvb3AgdGhyb3VnaCBlYWNoIHBhcnRpdGlvbiwgZGVzZXJpYWxpemluZyB0byBjaGVjayBmb3IgZGFtYWdlLgotICAgICAgICAvLyBXZSdsbCBhbHNvIGxvb3AgdGhyb3VnaCB0aGUgaW5kZXggYXQgdGhlIHNhbWUgdGltZSwgdXNpbmcgdGhlIHBvc2l0aW9uIGZyb20gdGhlIGluZGV4IHRvIHJlY292ZXIgaWYgdGhlCi0gICAgICAgIC8vIHBhcnRpdGlvbiBoZWFkZXIgKGtleSBvciBkYXRhIHNpemUpIGlzIGNvcnJ1cHQuIChUaGlzIG1lYW5zIG91ciBwb3NpdGlvbiBpbiB0aGUgaW5kZXggZmlsZSB3aWxsIGJlIG9uZQotICAgICAgICAvLyBwYXJ0aXRpb24gImFoZWFkIiBvZiB0aGUgZGF0YSBmaWxlLikKLSAgICAgICAgdGhpcy5kYXRhRmlsZSA9IHRyYW5zYWN0aW9uLmlzT2ZmbGluZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICA/IHNzdGFibGUub3BlbkRhdGFSZWFkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgOiBzc3RhYmxlLm9wZW5EYXRhUmVhZGVyKENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmdldFJhdGVMaW1pdGVyKCkpOwotCi0gICAgICAgIHRoaXMuaW5kZXhGaWxlID0gaGFzSW5kZXhGaWxlCi0gICAgICAgICAgICAgICAgPyBSYW5kb21BY2Nlc3NSZWFkZXIub3BlbihuZXcgRmlsZShzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlBSSU1BUllfSU5ERVgpKSkKLSAgICAgICAgICAgICAgICA6IG51bGw7Ci0KLSAgICAgICAgdGhpcy5zY3J1YkluZm8gPSBuZXcgU2NydWJJbmZvKGRhdGFGaWxlLCBzc3RhYmxlLCBmaWxlQWNjZXNzTG9jay5yZWFkTG9jaygpKTsKLQotICAgICAgICB0aGlzLmN1cnJlbnRQYXJ0aXRpb25Qb3NpdGlvbkZyb21JbmRleCA9IDA7Ci0gICAgICAgIHRoaXMubmV4dFBhcnRpdGlvblBvc2l0aW9uRnJvbUluZGV4ID0gMDsKLQotICAgICAgICBpZiAocmVpbnNlcnRPdmVyZmxvd2VkVFRMUm93cykKLSAgICAgICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KCJTdGFydGluZyBzY3J1YiB3aXRoIHJlaW5zZXJ0IG92ZXJmbG93ZWQgVFRMIG9wdGlvbiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHdpdGhWYWxpZGF0aW9uKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyLCBTdHJpbmcgZmlsZW5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gY2hlY2tEYXRhID8gVW5maWx0ZXJlZFJvd0l0ZXJhdG9ycy53aXRoVmFsaWRhdGlvbihpdGVyLCBmaWxlbmFtZSkgOiBpdGVyOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGtleVN0cmluZyhEZWNvcmF0ZWRLZXkga2V5KQotICAgIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICIodW5rbm93bikiOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY2ZzLm1ldGFkYXRhKCkucGFydGl0aW9uS2V5VHlwZS5nZXRTdHJpbmcoa2V5LmdldEtleSgpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIoY29ycnVwdGVkOyBoZXggdmFsdWU6ICVzKSIsIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoa2V5LmdldEtleSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzY3J1YigpCi0gICAgewotICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IGZpbmlzaGVkID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KFN0cmluZy5mb3JtYXQoIlNjcnViYmluZyAlcyAoJXMpIiwgc3N0YWJsZSwgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoZGF0YUZpbGUubGVuZ3RoKCkpKSk7Ci0gICAgICAgIHRyeSAoU1NUYWJsZVJld3JpdGVyIHdyaXRlciA9IFNTVGFibGVSZXdyaXRlci5jb25zdHJ1Y3QoY2ZzLCB0cmFuc2FjdGlvbiwgZmFsc2UsIHNzdGFibGUubWF4RGF0YUFnZSk7Ci0gICAgICAgICAgICAgUmVmczxTU1RhYmxlUmVhZGVyPiByZWZzID0gUmVmcy5yZWYoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHNzdGFibGUpKSkKLSAgICAgICAgewotICAgICAgICAgICAgbmV4dEluZGV4S2V5ID0gaW5kZXhBdmFpbGFibGUoKSA/IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoaW5kZXhGaWxlKSA6IG51bGw7Ci0gICAgICAgICAgICBpZiAoaW5kZXhBdmFpbGFibGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyB0aHJvdyBhd2F5IHZhcmlhYmxlIHNvIHdlIGRvbid0IGhhdmUgYSBzaWRlIGVmZmVjdCBpbiB0aGUgYXNzZXJ0Ci0gICAgICAgICAgICAgICAgbG9uZyBmaXJzdFJvd1Bvc2l0aW9uRnJvbUluZGV4ID0gcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIuZGVzZXJpYWxpemVQb3NpdGlvbkFuZFNraXAoaW5kZXhGaWxlKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQgZmlyc3RSb3dQb3NpdGlvbkZyb21JbmRleCA9PSAwIDogZmlyc3RSb3dQb3NpdGlvbkZyb21JbmRleDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RhdHNNZXRhZGF0YSBtZXRhZGF0YSA9IHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCk7Ci0gICAgICAgICAgICB3cml0ZXIuc3dpdGNoV3JpdGVyKENvbXBhY3Rpb25NYW5hZ2VyLmNyZWF0ZVdyaXRlcihjZnMsIGRlc3RpbmF0aW9uLCBleHBlY3RlZEJsb29tRmlsdGVyU2l6ZSwgbWV0YWRhdGEucmVwYWlyZWRBdCwgbWV0YWRhdGEucGVuZGluZ1JlcGFpciwgbWV0YWRhdGEuaXNUcmFuc2llbnQsIHNzdGFibGUsIHRyYW5zYWN0aW9uKSk7Ci0KLSAgICAgICAgICAgIERlY29yYXRlZEtleSBwcmV2S2V5ID0gbnVsbDsKLQotICAgICAgICAgICAgd2hpbGUgKCFkYXRhRmlsZS5pc0VPRigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzY3J1YkluZm8uaXNTdG9wUmVxdWVzdGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb24oc2NydWJJbmZvLmdldENvbXBhY3Rpb25JbmZvKCkpOwotCi0gICAgICAgICAgICAgICAgbG9uZyBwYXJ0aXRpb25TdGFydCA9IGRhdGFGaWxlLmdldEZpbGVQb2ludGVyKCk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5kZWJ1ZygiUmVhZGluZyByb3cgYXQgIiArIHBhcnRpdGlvblN0YXJ0KTsKLQotICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciByYXcgPSBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGRhdGFGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjZnMubWV0YWRhdGEuZ2V0TG9jYWwoKS5pc0luZGV4KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjZnMubWV0YWRhdGEuZ2V0TG9jYWwoKS5wYXJ0aXRpb25LZXlUeXBlLnZhbGlkYXRlKHJhdyk7Ci0gICAgICAgICAgICAgICAgICAgIGtleSA9IHNzdGFibGUuZGVjb3JhdGVLZXkocmF3KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0aCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93SWZGYXRhbCh0aCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBudWxsIGtleSBiZWxvdwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHVwZGF0ZUluZGV4S2V5KCk7Ci0KLSAgICAgICAgICAgICAgICBsb25nIGRhdGFTdGFydCA9IGRhdGFGaWxlLmdldEZpbGVQb2ludGVyKCk7Ci0KLSAgICAgICAgICAgICAgICBsb25nIGRhdGFTdGFydEZyb21JbmRleCA9IC0xOwotICAgICAgICAgICAgICAgIGxvbmcgZGF0YVNpemVGcm9tSW5kZXggPSAtMTsKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4S2V5ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkYXRhU3RhcnRGcm9tSW5kZXggPSBjdXJyZW50UGFydGl0aW9uUG9zaXRpb25Gcm9tSW5kZXggKyAyICsgY3VycmVudEluZGV4S2V5LnJlbWFpbmluZygpOwotICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZUZyb21JbmRleCA9IG5leHRQYXJ0aXRpb25Qb3NpdGlvbkZyb21JbmRleCAtIGRhdGFTdGFydEZyb21JbmRleDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5TmFtZSA9IGtleSA9PSBudWxsID8gIih1bnJlYWRhYmxlIGtleSkiIDoga2V5U3RyaW5nKGtleSk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5kZWJ1ZyhTdHJpbmcuZm9ybWF0KCJwYXJ0aXRpb24gJXMgaXMgJXMiLCBrZXlOYW1lLCBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShkYXRhU2l6ZUZyb21JbmRleCkpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQgY3VycmVudEluZGV4S2V5ICE9IG51bGwgfHwgIWluZGV4QXZhaWxhYmxlKCk7Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0Vycm9yKG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIHJlYWQgcGFydGl0aW9uIGtleSBmcm9tIGRhdGEgZmlsZSIpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4S2V5ICE9IG51bGwgJiYgIWtleS5nZXRLZXkoKS5lcXVhbHMoY3VycmVudEluZGV4S2V5KSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXJyb3IobmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIktleSBmcm9tIGRhdGEgZmlsZSAoJXMpIGRvZXMgbm90IG1hdGNoIGtleSBmcm9tIGluZGV4IGZpbGUgKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChrZXkuZ2V0S2V5KCkpLCBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KGN1cnJlbnRJbmRleEtleSkpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfdG9vIGJpZ18iLCBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KGN1cnJlbnRJbmRleEtleSkpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXhGaWxlICE9IG51bGwgJiYgZGF0YVNpemVGcm9tSW5kZXggPiBkYXRhRmlsZS5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0Vycm9yKG5ldyBJT0V4Y2VwdGlvbigiSW1wb3NzaWJsZSBwYXJ0aXRpb24gc2l6ZSAoZ3JlYXRlciB0aGFuIGZpbGUgbGVuZ3RoKTogIiArIGRhdGFTaXplRnJvbUluZGV4KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4RmlsZSAhPSBudWxsICYmIGRhdGFTdGFydCAhPSBkYXRhU3RhcnRGcm9tSW5kZXgpCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4oU3RyaW5nLmZvcm1hdCgiRGF0YSBmaWxlIHBhcnRpdGlvbiBwb3NpdGlvbiAlZCBkaWZmZXJzIGZyb20gaW5kZXggZmlsZSByb3cgcG9zaXRpb24gJWQiLCBkYXRhU3RhcnQsIGRhdGFTdGFydEZyb21JbmRleCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICh0cnlBcHBlbmQocHJldktleSwga2V5LCB3cml0ZXIpKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJldktleSA9IGtleTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0aCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93SWZGYXRhbCh0aCk7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2FybihTdHJpbmcuZm9ybWF0KCJFcnJvciByZWFkaW5nIHBhcnRpdGlvbiAlcyAoc3RhY2t0cmFjZSBmb2xsb3dzKToiLCBrZXlOYW1lKSwgdGgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXhLZXkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGtleSA9PSBudWxsIHx8ICFrZXkuZ2V0S2V5KCkuZXF1YWxzKGN1cnJlbnRJbmRleEtleSkgfHwgZGF0YVN0YXJ0ICE9IGRhdGFTdGFydEZyb21JbmRleCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5vdXRwdXQoU3RyaW5nLmZvcm1hdCgiUmV0cnlpbmcgZnJvbSBwYXJ0aXRpb24gaW5kZXg7IGRhdGEgaXMgJXMgYnl0ZXMgc3RhcnRpbmcgYXQgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZUZyb21JbmRleCwgZGF0YVN0YXJ0RnJvbUluZGV4KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBzc3RhYmxlLmRlY29yYXRlS2V5KGN1cnJlbnRJbmRleEtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNmcy5tZXRhZGF0YS5nZXRMb2NhbCgpLmlzSW5kZXgoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLm1ldGFkYXRhLmdldExvY2FsKCkucGFydGl0aW9uS2V5VHlwZS52YWxpZGF0ZShrZXkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFGaWxlLnNlZWsoZGF0YVN0YXJ0RnJvbUluZGV4KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cnlBcHBlbmQocHJldktleSwga2V5LCB3cml0ZXIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2S2V5ID0ga2V5OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0aDIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dJZkZhdGFsKHRoMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dJZkNhbm5vdENvbnRpbnVlKGtleSwgdGgyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2FybigiUmV0cnkgZmFpbGVkIHRvby4gU2tpcHBpbmcgdG8gbmV4dCBwYXJ0aXRpb24gKHJldHJ5J3Mgc3RhY2t0cmFjZSBmb2xsb3dzKSIsIHRoMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFkUGFydGl0aW9ucysrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2Vla1RvTmV4dFBhcnRpdGlvbigpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93SWZDYW5ub3RDb250aW51ZShrZXksIHRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKCJQYXJ0aXRpb24gc3RhcnRpbmcgYXQgcG9zaXRpb24gIiArIGRhdGFTdGFydCArICIgaXMgdW5yZWFkYWJsZTsgc2tpcHBpbmcgdG8gbmV4dCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmFkUGFydGl0aW9ucysrOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleEtleSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2Vla1RvTmV4dFBhcnRpdGlvbigpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFvdXRPZk9yZGVyLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBvdXQgb2Ygb3JkZXIgcGFydGl0aW9ucy9yb3dzLCBidXQgbm8gYmFkIHBhcnRpdGlvbiBmb3VuZCAtIHdlIGNhbiBrZWVwIG91ciByZXBhaXJlZEF0IHRpbWUKLSAgICAgICAgICAgICAgICBsb25nIHJlcGFpcmVkQXQgPSBiYWRQYXJ0aXRpb25zID4gMCA/IEFjdGl2ZVJlcGFpclNlcnZpY2UuVU5SRVBBSVJFRF9TU1RBQkxFIDogc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5yZXBhaXJlZEF0OwotICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgbmV3SW5PcmRlclNzdGFibGU7Ci0gICAgICAgICAgICAgICAgdHJ5IChTU1RhYmxlV3JpdGVyIGluT3JkZXJXcml0ZXIgPSBDb21wYWN0aW9uTWFuYWdlci5jcmVhdGVXcml0ZXIoY2ZzLCBkZXN0aW5hdGlvbiwgZXhwZWN0ZWRCbG9vbUZpbHRlclNpemUsIHJlcGFpcmVkQXQsIG1ldGFkYXRhLnBlbmRpbmdSZXBhaXIsIG1ldGFkYXRhLmlzVHJhbnNpZW50LCBzc3RhYmxlLCB0cmFuc2FjdGlvbikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3IgKFBhcnRpdGlvbiBwYXJ0aXRpb24gOiBvdXRPZk9yZGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5PcmRlcldyaXRlci5hcHBlbmQocGFydGl0aW9uLnVuZmlsdGVyZWRJdGVyYXRvcigpKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3SW5PcmRlclNzdGFibGUgPSBpbk9yZGVyV3JpdGVyLmZpbmlzaCgtMSwgc3N0YWJsZS5tYXhEYXRhQWdlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24udXBkYXRlKG5ld0luT3JkZXJTc3RhYmxlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZmluaXNoZWQuYWRkKG5ld0luT3JkZXJTc3RhYmxlKTsKLSAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4oU3RyaW5nLmZvcm1hdCgiJWQgb3V0IG9mIG9yZGVyIHBhcnRpdGlvbiAob3IgcGFydGl0aW9ucyB3aXRoIG91dCBvZiBvcmRlciByb3dzKSBmb3VuZCB3aGlsZSBzY3J1YmJpbmcgJXM7ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaG9zZSBoYXZlIGJlZW4gd3JpdHRlbiAoaW4gb3JkZXIpIHRvIGEgbmV3IHNzdGFibGUgKCVzKSIsIG91dE9mT3JkZXIuc2l6ZSgpLCBzc3RhYmxlLCBuZXdJbk9yZGVyU3N0YWJsZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBmaW5pc2ggb2Jzb2xldGVzIHRoZSBvbGQgc3N0YWJsZQotICAgICAgICAgICAgZmluaXNoZWQuYWRkQWxsKHdyaXRlci5zZXRSZXBhaXJlZEF0KGJhZFBhcnRpdGlvbnMgPiAwID8gQWN0aXZlUmVwYWlyU2VydmljZS5VTlJFUEFJUkVEX1NTVEFCTEUgOiBzc3RhYmxlLmdldFNTVGFibGVNZXRhZGF0YSgpLnJlcGFpcmVkQXQpLmZpbmlzaCgpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5wcm9wYWdhdGUoZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodHJhbnNhY3Rpb24uaXNPZmZsaW5lKCkpCi0gICAgICAgICAgICAgICAgZmluaXNoZWQuZm9yRWFjaChzc3RhYmxlIC0+IHNzdGFibGUuc2VsZlJlZigpLnJlbGVhc2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWZpbmlzaGVkLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5vdXRwdXQoIlNjcnViIG9mICIgKyBzc3RhYmxlICsgIiBjb21wbGV0ZTogIiArIGdvb2RQYXJ0aXRpb25zICsgIiBwYXJ0aXRpb25zIGluIG5ldyBzc3RhYmxlIGFuZCAiICsgZW1wdHlQYXJ0aXRpb25zICsgIiBlbXB0eSAodG9tYnN0b25lZCkgcGFydGl0aW9ucyBkcm9wcGVkIik7Ci0gICAgICAgICAgICBpZiAobmVnYXRpdmVMb2NhbERlbGV0aW9uSW5mb01ldHJpY3MuZml4ZWRSb3dzID4gMCkKLSAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dCgiRml4ZWQgIiArIG5lZ2F0aXZlTG9jYWxEZWxldGlvbkluZm9NZXRyaWNzLmZpeGVkUm93cyArICIgcm93cyB3aXRoIG92ZXJmbG93ZWQgbG9jYWwgZGVsZXRpb24gdGltZS4iKTsKLSAgICAgICAgICAgIGlmIChiYWRQYXJ0aXRpb25zID4gMCkKLSAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4oIlVuYWJsZSB0byByZWNvdmVyICIgKyBiYWRQYXJ0aXRpb25zICsgIiBwYXJ0aXRpb25zIHRoYXQgd2VyZSBza2lwcGVkLiAgWW91IGNhbiBhdHRlbXB0IG1hbnVhbCByZWNvdmVyeSBmcm9tIHRoZSBwcmUtc2NydWIgc25hcHNob3QuICBZb3UgY2FuIGFsc28gcnVuIG5vZGV0b29sIHJlcGFpciB0byB0cmFuc2ZlciB0aGUgZGF0YSBmcm9tIGEgaGVhbHRoeSByZXBsaWNhLCBpZiBhbnkiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChiYWRQYXJ0aXRpb25zID4gMCkKLSAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4oIk5vIHZhbGlkIHBhcnRpdGlvbnMgZm91bmQgd2hpbGUgc2NydWJiaW5nICIgKyBzc3RhYmxlICsgIjsgaXQgaXMgbWFya2VkIGZvciBkZWxldGlvbiBub3cuIElmIHlvdSB3YW50IHRvIGF0dGVtcHQgbWFudWFsIHJlY292ZXJ5LCB5b3UgY2FuIGZpbmQgYSBjb3B5IGluIHRoZSBwcmUtc2NydWIgc25hcHNob3QiKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dCgiU2NydWIgb2YgIiArIHNzdGFibGUgKyAiIGNvbXBsZXRlOyBsb29rcyBsaWtlIGFsbCAiICsgZW1wdHlQYXJ0aXRpb25zICsgIiBwYXJ0aXRpb25zIHdlcmUgdG9tYnN0b25lZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKLSAgICBwcml2YXRlIGJvb2xlYW4gdHJ5QXBwZW5kKERlY29yYXRlZEtleSBwcmV2S2V5LCBEZWNvcmF0ZWRLZXkga2V5LCBTU1RhYmxlUmV3cml0ZXIgd3JpdGVyKQotICAgIHsKLSAgICAgICAgLy8gT3JkZXJDaGVja2VySXRlcmF0b3Igd2lsbCBjaGVjaywgYXQgaXRlcmF0aW9uIHRpbWUsIHRoYXQgdGhlIHJvd3MgYXJlIGluIHRoZSBwcm9wZXIgb3JkZXIuIElmIGl0IGRldGVjdHMKLSAgICAgICAgLy8gdGhhdCBvbmUgcm93IGlzIG91dCBvZiBvcmRlciwgaXQgd2lsbCBzdG9wIHJldHVybmluZyB0aGVtLiBUaGUgcmVtYWluaW5nIHJvd3Mgd2lsbCBiZSBzb3J0ZWQgYW5kIGFkZGVkCi0gICAgICAgIC8vIHRvIHRoZSBvdXRPZk9yZGVyIHNldCB0aGF0IHdpbGwgYmUgbGF0ZXIgd3JpdHRlbiB0byBhIG5ldyBTU1RhYmxlLgotICAgICAgICBPcmRlckNoZWNrZXJJdGVyYXRvciBzc3RhYmxlSXRlcmF0b3IgPSBuZXcgT3JkZXJDaGVja2VySXRlcmF0b3IoZ2V0SXRlcmF0b3Ioa2V5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmcy5tZXRhZGF0YSgpLmNvbXBhcmF0b3IpOwotCi0gICAgICAgIHRyeSAoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yID0gd2l0aFZhbGlkYXRpb24oc3N0YWJsZUl0ZXJhdG9yLCBkYXRhRmlsZS5nZXRQYXRoKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocHJldktleSAhPSBudWxsICYmIHByZXZLZXkuY29tcGFyZVRvKGtleSkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNhdmVPdXRPZk9yZGVyUGFydGl0aW9uKHByZXZLZXksIGtleSwgaXRlcmF0b3IpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHdyaXRlci50cnlBcHBlbmQoaXRlcmF0b3IpID09IG51bGwpCi0gICAgICAgICAgICAgICAgZW1wdHlQYXJ0aXRpb25zKys7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZ29vZFBhcnRpdGlvbnMrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzc3RhYmxlSXRlcmF0b3IuaGFzUm93c091dE9mT3JkZXIoKSkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKFN0cmluZy5mb3JtYXQoIk91dCBvZiBvcmRlciByb3dzIGZvdW5kIGluIHBhcnRpdGlvbjogJXMiLCBrZXlTdHJpbmcoa2V5KSkpOwotICAgICAgICAgICAgb3V0T2ZPcmRlci5hZGQoc3N0YWJsZUl0ZXJhdG9yLmdldFJvd3NPdXRPZk9yZGVyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT25seSB3cmFwIHdpdGgge0BsaW5rIEZpeE5lZ2F0aXZlTG9jYWxEZWxldGlvblRpbWVJdGVyYXRvcn0gaWYge0BsaW5rICNyZWluc2VydE92ZXJmbG93ZWRUVExSb3dzfSBvcHRpb24KLSAgICAgKiBpcyBzcGVjaWZpZWQKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQotICAgIHByaXZhdGUgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGdldEl0ZXJhdG9yKERlY29yYXRlZEtleSBrZXkpCi0gICAgewotICAgICAgICBSb3dNZXJnaW5nU1NUYWJsZUl0ZXJhdG9yIHJvd01lcmdpbmdJdGVyYXRvciA9IG5ldyBSb3dNZXJnaW5nU1NUYWJsZUl0ZXJhdG9yKFNTVGFibGVJZGVudGl0eUl0ZXJhdG9yLmNyZWF0ZShzc3RhYmxlLCBkYXRhRmlsZSwga2V5KSk7Ci0gICAgICAgIHJldHVybiByZWluc2VydE92ZXJmbG93ZWRUVExSb3dzID8gbmV3IEZpeE5lZ2F0aXZlTG9jYWxEZWxldGlvblRpbWVJdGVyYXRvcihyb3dNZXJnaW5nSXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmVMb2NhbERlbGV0aW9uSW5mb01ldHJpY3MpIDogcm93TWVyZ2luZ0l0ZXJhdG9yOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVJbmRleEtleSgpCi0gICAgewotICAgICAgICBjdXJyZW50SW5kZXhLZXkgPSBuZXh0SW5kZXhLZXk7Ci0gICAgICAgIGN1cnJlbnRQYXJ0aXRpb25Qb3NpdGlvbkZyb21JbmRleCA9IG5leHRQYXJ0aXRpb25Qb3NpdGlvbkZyb21JbmRleDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG5leHRJbmRleEtleSA9ICFpbmRleEF2YWlsYWJsZSgpID8gbnVsbCA6IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoaW5kZXhGaWxlKTsKLQotICAgICAgICAgICAgbmV4dFBhcnRpdGlvblBvc2l0aW9uRnJvbUluZGV4ID0gIWluZGV4QXZhaWxhYmxlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGF0YUZpbGUubGVuZ3RoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIuZGVzZXJpYWxpemVQb3NpdGlvbkFuZFNraXAoaW5kZXhGaWxlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRoKQotICAgICAgICB7Ci0gICAgICAgICAgICBKVk1TdGFiaWxpdHlJbnNwZWN0b3IuaW5zcGVjdFRocm93YWJsZSh0aCk7Ci0gICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4oIkVycm9yIHJlYWRpbmcgaW5kZXggZmlsZSIsIHRoKTsKLSAgICAgICAgICAgIG5leHRJbmRleEtleSA9IG51bGw7Ci0gICAgICAgICAgICBuZXh0UGFydGl0aW9uUG9zaXRpb25Gcm9tSW5kZXggPSBkYXRhRmlsZS5sZW5ndGgoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpbmRleEF2YWlsYWJsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gaW5kZXhGaWxlICE9IG51bGwgJiYgIWluZGV4RmlsZS5pc0VPRigpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBzZWVrVG9OZXh0UGFydGl0aW9uKCkKLSAgICB7Ci0gICAgICAgIHdoaWxlKG5leHRQYXJ0aXRpb25Qb3NpdGlvbkZyb21JbmRleCA8IGRhdGFGaWxlLmxlbmd0aCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkYXRhRmlsZS5zZWVrKG5leHRQYXJ0aXRpb25Qb3NpdGlvbkZyb21JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93SWZGYXRhbCh0aCk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKFN0cmluZy5mb3JtYXQoIkZhaWxlZCB0byBzZWVrIHRvIG5leHQgcGFydGl0aW9uIHBvc2l0aW9uICVkIiwgbmV4dFBhcnRpdGlvblBvc2l0aW9uRnJvbUluZGV4KSwgdGgpOwotICAgICAgICAgICAgICAgIGJhZFBhcnRpdGlvbnMrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXBkYXRlSW5kZXhLZXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2F2ZU91dE9mT3JkZXJQYXJ0aXRpb24oRGVjb3JhdGVkS2V5IHByZXZLZXksIERlY29yYXRlZEtleSBrZXksIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvcikKLSAgICB7Ci0gICAgICAgIC8vIFRPRE8gYml0Y2ggaWYgdGhlIHJvdyBpcyB0b28gbGFyZ2U/ICBpZiBpdCBpcyB0aGVyZSdzIG5vdCBtdWNoIHdlIGNhbiBkbyAuLi4KLSAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKFN0cmluZy5mb3JtYXQoIk91dCBvZiBvcmRlciBwYXJ0aXRpb24gZGV0ZWN0ZWQgKCVzIGZvdW5kIGFmdGVyICVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVN0cmluZyhrZXkpLCBrZXlTdHJpbmcocHJldktleSkpKTsKLSAgICAgICAgb3V0T2ZPcmRlci5hZGQoSW1tdXRhYmxlQlRyZWVQYXJ0aXRpb24uY3JlYXRlKGl0ZXJhdG9yKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRocm93SWZGYXRhbChUaHJvd2FibGUgdGgpCi0gICAgewotICAgICAgICBpZiAodGggaW5zdGFuY2VvZiBFcnJvciAmJiAhKHRoIGluc3RhbmNlb2YgQXNzZXJ0aW9uRXJyb3IgfHwgdGggaW5zdGFuY2VvZiBJT0Vycm9yKSkKLSAgICAgICAgICAgIHRocm93IChFcnJvcikgdGg7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRocm93SWZDYW5ub3RDb250aW51ZShEZWNvcmF0ZWRLZXkga2V5LCBUaHJvd2FibGUgdGgpCi0gICAgewotICAgICAgICBpZiAoaXNJbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKFN0cmluZy5mb3JtYXQoIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNjcnViYmluZyB0aGUgcGFydGl0aW9uIHdpdGgga2V5ICclcycgZm9yIGFuIGluZGV4IHRhYmxlLiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTY3J1YmJpbmcgd2lsbCBhYm9ydCBmb3IgdGhpcyB0YWJsZSBhbmQgdGhlIGluZGV4IHdpbGwgYmUgcmVidWlsdC4iLCBrZXlTdHJpbmcoa2V5KSkpOwotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXJyb3IodGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzQ29tbXV0YXRpdmUgJiYgIXNraXBDb3JydXB0ZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2FybihTdHJpbmcuZm9ybWF0KCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBzY3J1YmJpbmcgdGhlIHBhcnRpdGlvbiB3aXRoIGtleSAnJXMnLiAgU2tpcHBpbmcgY29ycnVwdCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIGluIGNvdW50ZXIgdGFibGVzIHdpbGwgcmVzdWx0IGluIHVuZGVyY291bnRzIGZvciB0aGUgYWZmZWN0ZWQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bnRlcnMgKHNlZSBDQVNTQU5EUkEtMjc1OSBmb3IgbW9yZSBkZXRhaWxzKSwgc28gYnkgZGVmYXVsdCB0aGUgc2NydWIgd2lsbCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdG9wIGF0IHRoaXMgcG9pbnQuICBJZiB5b3Ugd291bGQgbGlrZSB0byBza2lwIHRoZSByb3cgYW55d2F5IGFuZCBjb250aW51ZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY3J1YmJpbmcsIHJlLXJ1biB0aGUgc2NydWIgd2l0aCB0aGUgLS1za2lwLWNvcnJ1cHRlZCBvcHRpb24uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVN0cmluZyhrZXkpKSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FcnJvcih0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCi0gICAgewotICAgICAgICBmaWxlQWNjZXNzTG9jay53cml0ZUxvY2soKS5sb2NrKCk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2VRdWlldGx5KGRhdGFGaWxlKTsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZVF1aWV0bHkoaW5kZXhGaWxlKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbGVBY2Nlc3NMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIENvbXBhY3Rpb25JbmZvLkhvbGRlciBnZXRTY3J1YkluZm8oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNjcnViSW5mbzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTY3J1YkluZm8gZXh0ZW5kcyBDb21wYWN0aW9uSW5mby5Ib2xkZXIKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUmFuZG9tQWNjZXNzUmVhZGVyIGRhdGFGaWxlOwotICAgICAgICBwcml2YXRlIGZpbmFsIFNTVGFibGVSZWFkZXIgc3N0YWJsZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBUaW1lVVVJRCBzY3J1YkNvbXBhY3Rpb25JZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBMb2NrIGZpbGVSZWFkTG9jazsKLQotICAgICAgICBwdWJsaWMgU2NydWJJbmZvKFJhbmRvbUFjY2Vzc1JlYWRlciBkYXRhRmlsZSwgU1NUYWJsZVJlYWRlciBzc3RhYmxlLCBMb2NrIGZpbGVSZWFkTG9jaykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5kYXRhRmlsZSA9IGRhdGFGaWxlOwotICAgICAgICAgICAgdGhpcy5zc3RhYmxlID0gc3N0YWJsZTsKLSAgICAgICAgICAgIHRoaXMuZmlsZVJlYWRMb2NrID0gZmlsZVJlYWRMb2NrOwotICAgICAgICAgICAgc2NydWJDb21wYWN0aW9uSWQgPSBuZXh0VGltZVVVSUQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb21wYWN0aW9uSW5mbyBnZXRDb21wYWN0aW9uSW5mbygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbGVSZWFkTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25JbmZvKHNzdGFibGUubWV0YWRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvblR5cGUuU0NSVUIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhRmlsZS5nZXRGaWxlUG9pbnRlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUZpbGUubGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3J1YkNvbXBhY3Rpb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZVNldC5vZihzc3RhYmxlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmlsZVJlYWRMb2NrLnVubG9jaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBwdWJsaWMgU2NydWJSZXN1bHQgc2NydWJXaXRoUmVzdWx0KCkKLSAgICB7Ci0gICAgICAgIHNjcnViKCk7Ci0gICAgICAgIHJldHVybiBuZXcgU2NydWJSZXN1bHQodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTY3J1YlJlc3VsdAotICAgIHsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCBnb29kUGFydGl0aW9uczsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCBiYWRQYXJ0aXRpb25zOwotICAgICAgICBwdWJsaWMgZmluYWwgaW50IGVtcHR5UGFydGl0aW9uczsKLQotICAgICAgICBwdWJsaWMgU2NydWJSZXN1bHQoU2NydWJiZXIgc2NydWJiZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZ29vZFBhcnRpdGlvbnMgPSBzY3J1YmJlci5nb29kUGFydGl0aW9uczsKLSAgICAgICAgICAgIHRoaXMuYmFkUGFydGl0aW9ucyA9IHNjcnViYmVyLmJhZFBhcnRpdGlvbnM7Ci0gICAgICAgICAgICB0aGlzLmVtcHR5UGFydGl0aW9ucyA9IHNjcnViYmVyLmVtcHR5UGFydGl0aW9uczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBOZWdhdGl2ZUxvY2FsRGVsZXRpb25JbmZvTWV0cmljcwotICAgIHsKLSAgICAgICAgcHVibGljIHZvbGF0aWxlIGludCBmaXhlZFJvd3MgPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIER1cmluZyAyLnggbWlncmF0aW9uLCB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXMgcm93cyBtaWdodCBoYXZlIGdvdHRlbiBkdXBsaWNhdGVkLgotICAgICAqIE1lcmdpbmcgaXRlcmF0b3IgbWVyZ2VzIHJvd3Mgd2l0aCBzYW1lIGNsdXN0ZXJpbmcuCi0gICAgICoKLSAgICAgKiBGb3IgbW9yZSBkZXRhaWxzLCByZWZlciB0byBDQVNTQU5EUkEtMTIxNDQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUm93TWVyZ2luZ1NTVGFibGVJdGVyYXRvciBleHRlbmRzIFdyYXBwaW5nVW5maWx0ZXJlZFJvd0l0ZXJhdG9yCi0gICAgewotICAgICAgICBVbmZpbHRlcmVkIG5leHRUb09mZmVyID0gbnVsbDsKLQotICAgICAgICBSb3dNZXJnaW5nU1NUYWJsZUl0ZXJhdG9yKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBzb3VyY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKHNvdXJjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXh0VG9PZmZlciAhPSBudWxsIHx8IHdyYXBwZWQuaGFzTmV4dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBVbmZpbHRlcmVkIG5leHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBVbmZpbHRlcmVkIG5leHQgPSBuZXh0VG9PZmZlciAhPSBudWxsID8gbmV4dFRvT2ZmZXIgOiB3cmFwcGVkLm5leHQoKTsKLQotICAgICAgICAgICAgaWYgKG5leHQuaXNSb3coKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAod3JhcHBlZC5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBVbmZpbHRlcmVkIHBlZWsgPSB3cmFwcGVkLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwZWVrLmlzUm93KCkgfHwgIW5leHQuY2x1c3RlcmluZygpLmVxdWFscyhwZWVrLmNsdXN0ZXJpbmcoKSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5leHRUb09mZmVyID0gcGVlazsgLy8gT2ZmZXIgcGVlayBpbiBuZXh0IGNhbGwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gRHVwbGljYXRlIHJvdywgbWVyZ2UgaXQuCi0gICAgICAgICAgICAgICAgICAgIG5leHQgPSBSb3dzLm1lcmdlKChSb3cpIG5leHQsIChSb3cpIHBlZWspOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbmV4dFRvT2ZmZXIgPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuIG5leHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbiBzb21lIGNhc2UgbGlrZSBDQVNTQU5EUkEtMTIxMjcgdGhlIGNlbGxzIG1pZ2h0IGhhdmUgYmVlbiBzdG9yZWQgaW4gdGhlIHdyb25nIG9yZGVyLiBUaGlzIGRlY29yYXRvciBjaGVjayB0aGUKLSAgICAgKiBjZWxscyBvcmRlciBhbmQgY29sbGVjdCB0aGUgb3V0IG9mIG9yZGVyIGNlbGxzIHRvIGNvcnJlY3QgdGhlIHByb2JsZW0uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgT3JkZXJDaGVja2VySXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEl0ZXJhdG9yPFVuZmlsdGVyZWQ+IGltcGxlbWVudHMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGRlY29yYXRlZCBpdGVyYXRvci4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgZmluYWwgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvcjsKLQotICAgICAgICBwcml2YXRlIFVuZmlsdGVyZWQgcHJldmlvdXM7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBwYXJ0aXRpb24gY29udGFpbmluZyB0aGUgcm93cyB3aGljaCBhcmUgb3V0IG9mIG9yZGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBQYXJ0aXRpb24gcm93c091dE9mT3JkZXI7Ci0KLSAgICAgICAgcHVibGljIE9yZGVyQ2hlY2tlckl0ZXJhdG9yKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvciwgQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvcikKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotICAgICAgICAgICAgdGhpcy5jb21wYXJhdG9yID0gY29tcGFyYXRvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLm1ldGFkYXRhKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JldmVyc2VPcmRlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5pc1JldmVyc2VPcmRlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zIGNvbHVtbnMoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IuY29sdW1ucygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIERlY29yYXRlZEtleSBwYXJ0aXRpb25LZXkoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IucGFydGl0aW9uS2V5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUm93IHN0YXRpY1JvdygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5zdGF0aWNSb3coKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmlzRW1wdHkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKLSAgICAgICAgewotICAgICAgICAgICAgaXRlcmF0b3IuY2xvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEZWxldGlvblRpbWUgcGFydGl0aW9uTGV2ZWxEZWxldGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5wYXJ0aXRpb25MZXZlbERlbGV0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRW5jb2RpbmdTdGF0cyBzdGF0cygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5zdGF0cygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzUm93c091dE9mT3JkZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93c091dE9mT3JkZXIgIT0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBQYXJ0aXRpb24gZ2V0Um93c091dE9mT3JkZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93c091dE9mT3JkZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZCBjb21wdXRlTmV4dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBlbmRPZkRhdGEoKTsKLQotICAgICAgICAgICAgVW5maWx0ZXJlZCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgICAgICAvLyBJZiB3ZSBkZXRlY3QgdGhhdCBzb21lIHJvd3MgYXJlIG91dCBvZiBvcmRlciB3ZSB3aWxsIHN0b3JlIGFuZCBzb3J0IHRoZSByZW1haW5pbmcgb25lcyB0byBpbnNlcnQgdGhlbQotICAgICAgICAgICAgLy8gaW4gYSBzZXBhcmF0ZSBTU1RhYmxlLgotICAgICAgICAgICAgaWYgKHByZXZpb3VzICE9IG51bGwgJiYgY29tcGFyYXRvci5jb21wYXJlKG5leHQsIHByZXZpb3VzKSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcm93c091dE9mT3JkZXIgPSBJbW11dGFibGVCVHJlZVBhcnRpdGlvbi5jcmVhdGUoVW5maWx0ZXJlZFJvd0l0ZXJhdG9ycy5jb25jYXQobmV4dCwgaXRlcmF0b3IpLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVuZE9mRGF0YSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJldmlvdXMgPSBuZXh0OwotICAgICAgICAgICAgcmV0dXJuIG5leHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGl0ZXJhdG9yIGNvbnZlcnRzIG5lZ2F0aXZlIHtAbGluayBBYnN0cmFjdENlbGwjbG9jYWxEZWxldGlvblRpbWUoKX0gaW50byB7QGxpbmsgQWJzdHJhY3RDZWxsI01BWF9ERUxFVElPTl9USU1FfQotICAgICAqCi0gICAgICogVGhpcyBpcyB0byByZWNvdmVyIGVudHJpZXMgd2l0aCBvdmVyZmxvd2VkIGxvY2FsRXhwaXJhdGlvblRpbWUgZHVlIHRvIENBU1NBTkRSQS0xNDA5MgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEZpeE5lZ2F0aXZlTG9jYWxEZWxldGlvblRpbWVJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0SXRlcmF0b3I8VW5maWx0ZXJlZD4gaW1wbGVtZW50cyBVbmZpbHRlcmVkUm93SXRlcmF0b3IKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZGVjb3JhdGVkIGl0ZXJhdG9yLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3I7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBPdXRwdXRIYW5kbGVyIG91dHB1dEhhbmRsZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTmVnYXRpdmVMb2NhbERlbGV0aW9uSW5mb01ldHJpY3MgbmVnYXRpdmVMb2NhbEV4cGlyYXRpb25UaW1lTWV0cmljczsKLQotICAgICAgICBwdWJsaWMgRml4TmVnYXRpdmVMb2NhbERlbGV0aW9uVGltZUl0ZXJhdG9yKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvciwgT3V0cHV0SGFuZGxlciBvdXRwdXRIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lZ2F0aXZlTG9jYWxEZWxldGlvbkluZm9NZXRyaWNzIG5lZ2F0aXZlTG9jYWxEZWxldGlvbkluZm9NZXRyaWNzKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0gICAgICAgICAgICB0aGlzLm91dHB1dEhhbmRsZXIgPSBvdXRwdXRIYW5kbGVyOwotICAgICAgICAgICAgdGhpcy5uZWdhdGl2ZUxvY2FsRXhwaXJhdGlvblRpbWVNZXRyaWNzID0gbmVnYXRpdmVMb2NhbERlbGV0aW9uSW5mb01ldHJpY3M7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5tZXRhZGF0YSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZXZlcnNlT3JkZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IuaXNSZXZlcnNlT3JkZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBSZWd1bGFyQW5kU3RhdGljQ29sdW1ucyBjb2x1bW5zKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmNvbHVtbnMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLnBhcnRpdGlvbktleSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFJvdyBzdGF0aWNSb3coKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlcmF0b3Iuc3RhdGljUm93KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5pc0VtcHR5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGl0ZXJhdG9yLmNsb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRGVsZXRpb25UaW1lIHBhcnRpdGlvbkxldmVsRGVsZXRpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IucGFydGl0aW9uTGV2ZWxEZWxldGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEVuY29kaW5nU3RhdHMgc3RhdHMoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlcmF0b3Iuc3RhdHMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkIGNvbXB1dGVOZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVuZE9mRGF0YSgpOwotCi0gICAgICAgICAgICBVbmZpbHRlcmVkIG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIW5leHQuaXNSb3coKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDsKLQotICAgICAgICAgICAgaWYgKGhhc05lZ2F0aXZlTG9jYWxFeHBpcmF0aW9uVGltZSgoUm93KSBuZXh0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLmRlYnVnKFN0cmluZy5mb3JtYXQoIkZvdW5kIHJvdyB3aXRoIG5lZ2F0aXZlIGxvY2FsIGV4cGlyYXRpb24gdGltZTogJXMiLCBuZXh0LnRvU3RyaW5nKG1ldGFkYXRhKCksIGZhbHNlKSkpOwotICAgICAgICAgICAgICAgIG5lZ2F0aXZlTG9jYWxFeHBpcmF0aW9uVGltZU1ldHJpY3MuZml4ZWRSb3dzKys7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZpeE5lZ2F0aXZlTG9jYWxFeHBpcmF0aW9uVGltZSgoUm93KSBuZXh0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG5leHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaGFzTmVnYXRpdmVMb2NhbEV4cGlyYXRpb25UaW1lKFJvdyBuZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBSb3cgcm93ID0gbmV4dDsKLSAgICAgICAgICAgIGlmIChyb3cucHJpbWFyeUtleUxpdmVuZXNzSW5mbygpLmlzRXhwaXJpbmcoKSAmJiByb3cucHJpbWFyeUtleUxpdmVuZXNzSW5mbygpLmxvY2FsRXhwaXJhdGlvblRpbWUoKSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoQ29sdW1uRGF0YSBjZCA6IHJvdykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoY2QuY29sdW1uKCkuaXNTaW1wbGUoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENlbGw8Pz4gY2VsbCA9IChDZWxsPD8+KWNkOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbC5pc0V4cGlyaW5nKCkgJiYgY2VsbC5sb2NhbERlbGV0aW9uVGltZSgpIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDb21wbGV4Q29sdW1uRGF0YSBjb21wbGV4RGF0YSA9IChDb21wbGV4Q29sdW1uRGF0YSljZDsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChDZWxsPD8+IGNlbGwgOiBjb21wbGV4RGF0YSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGwuaXNFeHBpcmluZygpICYmIGNlbGwubG9jYWxEZWxldGlvblRpbWUoKSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgVW5maWx0ZXJlZCBmaXhOZWdhdGl2ZUxvY2FsRXhwaXJhdGlvblRpbWUoUm93IHJvdykKLSAgICAgICAgewotICAgICAgICAgICAgTGl2ZW5lc3NJbmZvIGxpdmVuZXNzSW5mbyA9IHJvdy5wcmltYXJ5S2V5TGl2ZW5lc3NJbmZvKCk7Ci0gICAgICAgICAgICBpZiAobGl2ZW5lc3NJbmZvLmlzRXhwaXJpbmcoKSAmJiBsaXZlbmVzc0luZm8ubG9jYWxFeHBpcmF0aW9uVGltZSgpIDwgMCkKLSAgICAgICAgICAgICAgICBsaXZlbmVzc0luZm8gPSBsaXZlbmVzc0luZm8ud2l0aFVwZGF0ZWRUaW1lc3RhbXBBbmRMb2NhbERlbGV0aW9uVGltZShsaXZlbmVzc0luZm8udGltZXN0YW1wKCkgKyAxLCBBYnN0cmFjdENlbGwuTUFYX0RFTEVUSU9OX1RJTUUpOwotCi0gICAgICAgICAgICByZXR1cm4gcm93LnRyYW5zZm9ybUFuZEZpbHRlcihsaXZlbmVzc0luZm8sIHJvdy5kZWxldGlvbigpLCBjZCAtPiB7Ci0gICAgICAgICAgICAgICAgaWYgKGNkLmNvbHVtbigpLmlzU2ltcGxlKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDZWxsIGNlbGwgPSAoQ2VsbCljZDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNlbGwuaXNFeHBpcmluZygpICYmIGNlbGwubG9jYWxEZWxldGlvblRpbWUoKSA8IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY2VsbC53aXRoVXBkYXRlZFRpbWVzdGFtcEFuZExvY2FsRGVsZXRpb25UaW1lKGNlbGwudGltZXN0YW1wKCkgKyAxLCBBYnN0cmFjdENlbGwuTUFYX0RFTEVUSU9OX1RJTUUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNlbGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENvbXBsZXhDb2x1bW5EYXRhIGNvbXBsZXhEYXRhID0gKENvbXBsZXhDb2x1bW5EYXRhKWNkOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGxleERhdGEudHJhbnNmb3JtQW5kRmlsdGVyKGNlbGwgLT4gY2VsbC5pc0V4cGlyaW5nKCkgJiYgY2VsbC5sb2NhbERlbGV0aW9uVGltZSgpIDwgMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjZWxsLndpdGhVcGRhdGVkVGltZXN0YW1wQW5kTG9jYWxEZWxldGlvblRpbWUoY2VsbC50aW1lc3RhbXAoKSArIDEsIEFic3RyYWN0Q2VsbC5NQVhfREVMRVRJT05fVElNRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY2VsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSkuY2xvbmUoSGVhcENsb25lci5pbnN0YW5jZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1NpbmdsZVNTVGFibGVMQ1NUYXNrLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1NpbmdsZVNTVGFibGVMQ1NUYXNrLmphdmEKaW5kZXggMmUxZGZmYy4uMWY3M2M0YyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9TaW5nbGVTU1RhYmxlTENTVGFzay5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vU2luZ2xlU1NUYWJsZUxDU1Rhc2suamF2YQpAQCAtMjcsOCArMjcsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpcmVjdG9yaWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24ud3JpdGVycy5Db21wYWN0aW9uQXdhcmVXcml0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29ycnVwdFNTVGFibGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5TdGF0c01ldGFkYXRhOwogCkBAIC04Miw3ICs4Miw3IEBACiAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24uYWJvcnQoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24odCwgc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKHQsIHNzdGFibGUuZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuREFUQSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2ZzLmdldFRyYWNrZXIoKS5ub3RpZnlTU1RhYmxlTWV0YWRhdGFDaGFuZ2VkKHNzdGFibGUsIG1ldGFkYXRhQmVmb3JlKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9UaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1RpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kuamF2YQppbmRleCA1NTVkODZhLi5jMTBkM2E2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1RpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1RpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kuamF2YQpAQCAtMzAsNiArMzAsOCBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC4qOwpAQCAtNTcsNiArNTksOSBAQAogICAgIHByaXZhdGUgbG9uZyBsYXN0RXhwaXJlZENoZWNrOwogICAgIHByaXZhdGUgbG9uZyBoaWdoZXN0V2luZG93U2VlbjsKIAorICAgIC8vIFRoaXMgaXMgYWNjZXNzZWQgaW4gYm90aCB0aGUgdGhyZWFkaW5nIGNvbnRleHQgb2YgY29tcGFjdGlvbiAvIHJlcGFpciBhbmQgYWxzbyBKTVgKKyAgICBwcml2YXRlIHZvbGF0aWxlIE1hcDxMb25nLCBJbnRlZ2VyPiBzc3RhYmxlQ291bnRCeUJ1Y2tldHMgPSBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOworCiAgICAgcHVibGljIFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3koQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnMpCiAgICAgewogICAgICAgICBzdXBlcihjZnMsIG9wdGlvbnMpOwpAQCAtMTc5LDYgKzE4NCw3IEBACiAgICAgICAgICAgICAgICAgdGhpcy5oaWdoZXN0V2luZG93U2Vlbik7CiAKICAgICAgICAgdGhpcy5lc3RpbWF0ZWRSZW1haW5pbmdUYXNrcyA9IG1vc3RJbnRlcmVzdGluZy5lc3RpbWF0ZWRSZW1haW5pbmdUYXNrczsKKyAgICAgICAgdGhpcy5zc3RhYmxlQ291bnRCeUJ1Y2tldHMgPSBidWNrZXRzLmxlZnQua2V5U2V0KCkuc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKEZ1bmN0aW9uLmlkZW50aXR5KCksIGsgLT4gYnVja2V0cy5sZWZ0LmdldChrKS5zaXplKCkpKTsKICAgICAgICAgaWYgKCFtb3N0SW50ZXJlc3Rpbmcuc3N0YWJsZXMuaXNFbXB0eSgpKQogICAgICAgICAgICAgcmV0dXJuIG1vc3RJbnRlcmVzdGluZy5zc3RhYmxlczsKICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC00MjYsNiArNDMyLDEwIEBACiAgICAgICAgIHJldHVybiBMb25nLk1BWF9WQUxVRTsKICAgICB9CiAKKyAgICBwdWJsaWMgTWFwPExvbmcsIEludGVnZXI+IGdldFNTVGFibGVDb3VudEJ5QnVja2V0cygpCisgICAgeworICAgICAgICByZXR1cm4gc3N0YWJsZUNvdW50QnlCdWNrZXRzOworICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiB2YWxpZGF0ZU9wdGlvbnMoTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgogICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuamF2YQppbmRleCA4YjJiYTIzLi5iOTMxMmEwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1RpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9UaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5qYXZhCkBAIC0yNiw5ICsyNiwxMCBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkFMTE9XX1VOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTjsKKwogcHVibGljIGZpbmFsIGNsYXNzIFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zCiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLmNsYXNzKTsKQEAgLTM5LDEzICs0MCwxMyBAQAogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfRVhQSVJFRF9TU1RBQkxFX0NIRUNLX0ZSRVFVRU5DWV9TRUNPTkRTID0gNjAgKiAxMDsKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9VTlNBRkVfQUdHUkVTU0lWRV9TU1RBQkxFX0VYUElSQVRJT04gPSBmYWxzZTsKIAotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVTVEFNUF9SRVNPTFVUSU9OX0tFWSA9ICJ0aW1lc3RhbXBfcmVzb2x1dGlvbiI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFDVElPTl9XSU5ET1dfVU5JVF9LRVkgPSAiY29tcGFjdGlvbl93aW5kb3dfdW5pdCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFDVElPTl9XSU5ET1dfU0laRV9LRVkgPSAiY29tcGFjdGlvbl93aW5kb3dfc2l6ZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQSVJFRF9TU1RBQkxFX0NIRUNLX0ZSRVFVRU5DWV9TRUNPTkRTX0tFWSA9ICJleHBpcmVkX3NzdGFibGVfY2hlY2tfZnJlcXVlbmN5X3NlY29uZHMiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTl9LRVkgPSAidW5zYWZlX2FnZ3Jlc3NpdmVfc3N0YWJsZV9leHBpcmF0aW9uIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FU1RBTVBfUkVTT0xVVElPTl9LRVkgPSAidGltZXN0YW1wX3Jlc29sdXRpb24iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBQ1RJT05fV0lORE9XX1VOSVRfS0VZID0gImNvbXBhY3Rpb25fd2luZG93X3VuaXQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBQ1RJT05fV0lORE9XX1NJWkVfS0VZID0gImNvbXBhY3Rpb25fd2luZG93X3NpemUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUElSRURfU1NUQUJMRV9DSEVDS19GUkVRVUVOQ1lfU0VDT05EU19LRVkgPSAiZXhwaXJlZF9zc3RhYmxlX2NoZWNrX2ZyZXF1ZW5jeV9zZWNvbmRzIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTlNBRkVfQUdHUkVTU0lWRV9TU1RBQkxFX0VYUElSQVRJT05fS0VZID0gInVuc2FmZV9hZ2dyZXNzaXZlX3NzdGFibGVfZXhwaXJhdGlvbiI7CiAKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFVOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTl9QUk9QRVJUWSA9IENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAiYWxsb3dfdW5zYWZlX2FnZ3Jlc3NpdmVfc3N0YWJsZV9leHBpcmF0aW9uIjsKKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBVTlNBRkVfQUdHUkVTU0lWRV9TU1RBQkxFX0VYUElSQVRJT05fRU5BQkxFRCA9IEFMTE9XX1VOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTi5nZXRCb29sZWFuKCk7CiAKICAgICBwcm90ZWN0ZWQgZmluYWwgaW50IHNzdGFibGVXaW5kb3dTaXplOwogICAgIHByb3RlY3RlZCBmaW5hbCBUaW1lVW5pdCBzc3RhYmxlV2luZG93VW5pdDsKQEAgLTc1LDcgKzc2LDcgQEAKICAgICAgICAgZXhwaXJlZFNTVGFibGVDaGVja0ZyZXF1ZW5jeSA9IFRpbWVVbml0Lk1JTExJU0VDT05EUy5jb252ZXJ0KG9wdGlvblZhbHVlID09IG51bGwgPyBERUZBVUxUX0VYUElSRURfU1NUQUJMRV9DSEVDS19GUkVRVUVOQ1lfU0VDT05EUyA6IExvbmcucGFyc2VMb25nKG9wdGlvblZhbHVlKSwgVGltZVVuaXQuU0VDT05EUyk7CiAKICAgICAgICAgb3B0aW9uVmFsdWUgPSBvcHRpb25zLmdldChVTlNBRkVfQUdHUkVTU0lWRV9TU1RBQkxFX0VYUElSQVRJT05fS0VZKTsKLSAgICAgICAgaWdub3JlT3ZlcmxhcHMgPSBvcHRpb25WYWx1ZSA9PSBudWxsID8gREVGQVVMVF9VTlNBRkVfQUdHUkVTU0lWRV9TU1RBQkxFX0VYUElSQVRJT04gOiAoQm9vbGVhbi5nZXRCb29sZWFuKFVOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTl9QUk9QRVJUWSkgJiYgQm9vbGVhbi5wYXJzZUJvb2xlYW4ob3B0aW9uVmFsdWUpKTsKKyAgICAgICAgaWdub3JlT3ZlcmxhcHMgPSBvcHRpb25WYWx1ZSA9PSBudWxsID8gREVGQVVMVF9VTlNBRkVfQUdHUkVTU0lWRV9TU1RBQkxFX0VYUElSQVRJT04gOiAoVU5TQUZFX0FHR1JFU1NJVkVfU1NUQUJMRV9FWFBJUkFUSU9OX0VOQUJMRUQgJiYgQm9vbGVhbi5wYXJzZUJvb2xlYW4ob3B0aW9uVmFsdWUpKTsKIAogICAgICAgICBzdGNzT3B0aW9ucyA9IG5ldyBTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucyhvcHRpb25zKTsKICAgICB9CkBAIC0xNTMsOCArMTU0LDkgQEAKICAgICAgICAgICAgIGlmICghKG9wdGlvblZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSB8fCBvcHRpb25WYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJmYWxzZSIpKSkKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCIlcyBpcyBub3QgJ3RydWUnIG9yICdmYWxzZScgKCVzKSIsIFVOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTl9LRVksIG9wdGlvblZhbHVlKSk7CiAKLSAgICAgICAgICAgIGlmKG9wdGlvblZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSAmJiAhQm9vbGVhbi5nZXRCb29sZWFuKFVOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTl9QUk9QRVJUWSkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiJXMgaXMgcmVxdWVzdGVkIGJ1dCBub3QgYWxsb3dlZCwgcmVzdGFydCBjYXNzYW5kcmEgd2l0aCAtRCVzPXRydWUgdG8gYWxsb3cgaXQiLCBVTlNBRkVfQUdHUkVTU0lWRV9TU1RBQkxFX0VYUElSQVRJT05fS0VZLCBVTlNBRkVfQUdHUkVTU0lWRV9TU1RBQkxFX0VYUElSQVRJT05fUFJPUEVSVFkpKTsKKyAgICAgICAgICAgIGlmIChvcHRpb25WYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgJiYgIVVOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTl9FTkFCTEVEKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIiVzIGlzIHJlcXVlc3RlZCBidXQgbm90IGFsbG93ZWQsIHJlc3RhcnQgY2Fzc2FuZHJhIHdpdGggLUQlcz10cnVlIHRvIGFsbG93IGl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTl9LRVksIEFMTE9XX1VOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTi5nZXRLZXkoKSkpOwogICAgICAgICB9CiAKICAgICAgICAgdW5jaGVja2VkT3B0aW9ucy5yZW1vdmUoQ09NUEFDVElPTl9XSU5ET1dfU0laRV9LRVkpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9VcGdyYWRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9VcGdyYWRlci5qYXZhCmluZGV4IDg3YmY1YjguLmYxOGNjNDkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vVXBncmFkZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1VwZ3JhZGVyLmphdmEKQEAgLTE3LDcgKzE3LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uOwogCi1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uTG9uZ1ByZWRpY2F0ZTsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlczsKQEAgLTI1LDkgKzI1LDEwIEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmV3cml0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlV3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb2xsZWN0b3I7CkBAIC03MiwxNiArNzMsMTkgQEAKICAgICB7CiAgICAgICAgIE1ldGFkYXRhQ29sbGVjdG9yIHNzdGFibGVNZXRhZGF0YUNvbGxlY3RvciA9IG5ldyBNZXRhZGF0YUNvbGxlY3RvcihjZnMuZ2V0Q29tcGFyYXRvcigpKTsKICAgICAgICAgc3N0YWJsZU1ldGFkYXRhQ29sbGVjdG9yLnNzdGFibGVMZXZlbChzc3RhYmxlLmdldFNTVGFibGVMZXZlbCgpKTsKLSAgICAgICAgcmV0dXJuIFNTVGFibGVXcml0ZXIuY3JlYXRlKGNmcy5uZXdTU1RhYmxlRGVzY3JpcHRvcihkaXJlY3RvcnkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGVkUm93cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnJlcGFpcmVkQXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5wZW5kaW5nUmVwYWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuaXNUcmFuc2llbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMubWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlTWV0YWRhdGFDb2xsZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyLm1ha2UoY2ZzLm1ldGFkYXRhKCksIFNldHMubmV3SGFzaFNldChzc3RhYmxlKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMuaW5kZXhNYW5hZ2VyLmxpc3RJbmRleGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbik7CisKKyAgICAgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gY2ZzLm5ld1NTVGFibGVEZXNjcmlwdG9yKGRpcmVjdG9yeSk7CisgICAgICAgIHJldHVybiBkZXNjcmlwdG9yLmdldEZvcm1hdCgpLmdldFdyaXRlckZhY3RvcnkoKS5idWlsZGVyKGRlc2NyaXB0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEtleUNvdW50KGVzdGltYXRlZFJvd3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFJlcGFpcmVkQXQobWV0YWRhdGEucmVwYWlyZWRBdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UGVuZGluZ1JlcGFpcihtZXRhZGF0YS5wZW5kaW5nUmVwYWlyKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUcmFuc2llbnRTU1RhYmxlKG1ldGFkYXRhLmlzVHJhbnNpZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUYWJsZU1ldGFkYXRhUmVmKGNmcy5tZXRhZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWV0YWRhdGFDb2xsZWN0b3Ioc3N0YWJsZU1ldGFkYXRhQ29sbGVjdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTZXJpYWxpemF0aW9uSGVhZGVyKFNlcmlhbGl6YXRpb25IZWFkZXIubWFrZShjZnMubWV0YWRhdGEoKSwgU2V0cy5uZXdIYXNoU2V0KHNzdGFibGUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRGVmYXVsdENvbXBvbmVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRGbHVzaE9ic2VydmVyc0ZvclNlY29uZGFyeUluZGV4ZXMoY2ZzLmluZGV4TWFuYWdlci5saXN0SW5kZXhlcygpLCB0cmFuc2FjdGlvbi5vcFR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQodHJhbnNhY3Rpb24sIGNmcyk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdXBncmFkZShib29sZWFuIGtlZXBPcmlnaW5hbHMpCkBAIC05Myw2ICs5Nyw3IEBACiAgICAgICAgICAgICAgQ29tcGFjdGlvbkl0ZXJhdG9yIGl0ZXIgPSBuZXcgQ29tcGFjdGlvbkl0ZXJhdG9yKHRyYW5zYWN0aW9uLm9wVHlwZSgpLCBzY2FubmVycy5zY2FubmVycywgY29udHJvbGxlciwgbm93SW5TZWMsIG5leHRUaW1lVVVJRCgpKSkKICAgICAgICAgewogICAgICAgICAgICAgd3JpdGVyLnN3aXRjaFdyaXRlcihjcmVhdGVDb21wYWN0aW9uV3JpdGVyKHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkpKTsKKyAgICAgICAgICAgIGl0ZXIuc2V0VGFyZ2V0RGlyZWN0b3J5KHdyaXRlci5jdXJyZW50V3JpdGVyKCkuZ2V0RmlsZW5hbWUoKSk7CiAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCiAgICAgICAgICAgICAgICAgd3JpdGVyLmFwcGVuZChpdGVyLm5leHQoKSk7CiAKQEAgLTEwMSw3ICsxMDYsOCBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgVGhyb3dhYmxlcy5wcm9wYWdhdGUoZSk7CisgICAgICAgICAgICBUaHJvd2FibGVzLnRocm93SWZVbmNoZWNrZWQoZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgICAgICBmaW5hbGx5CiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vVmVyaWZpZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjllYjI5OS4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1ZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbjsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlczsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTG9jYWxQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29ycnVwdFNTVGFibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JbmRleFN1bW1hcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5LZXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVJZGVudGl0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLlZhbGlkYXRpb25NZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnRlZ3JpdHlNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnRlZ3JpdHlNZXRhZGF0YS5GaWxlRGlnZXN0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUlucHV0U3RyZWFtUGx1czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkFjdGl2ZVJlcGFpclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CbG9vbUZpbHRlclNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSUZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PdXRwdXRIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwotCi1pbXBvcnQgamF2YS5pby5DbG9zZWFibGU7Ci1pbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0Vycm9yOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkxvY2s7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVhZFdyaXRlTG9jazsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrOwotaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uTG9uZ1ByZWRpY2F0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEOwotCi1wdWJsaWMgY2xhc3MgVmVyaWZpZXIgaW1wbGVtZW50cyBDbG9zZWFibGUKLXsKLSAgICBwcml2YXRlIGZpbmFsIENvbHVtbkZhbWlseVN0b3JlIGNmczsKLSAgICBwcml2YXRlIGZpbmFsIFNTVGFibGVSZWFkZXIgc3N0YWJsZTsKLQotICAgIHByaXZhdGUgZmluYWwgQ29tcGFjdGlvbkNvbnRyb2xsZXIgY29udHJvbGxlcjsKLQotICAgIHByaXZhdGUgZmluYWwgUmVhZFdyaXRlTG9jayBmaWxlQWNjZXNzTG9jazsKLSAgICBwcml2YXRlIGZpbmFsIFJhbmRvbUFjY2Vzc1JlYWRlciBkYXRhRmlsZTsKLSAgICBwcml2YXRlIGZpbmFsIFJhbmRvbUFjY2Vzc1JlYWRlciBpbmRleEZpbGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWZXJpZnlJbmZvIHZlcmlmeUluZm87Ci0gICAgcHJpdmF0ZSBmaW5hbCBSb3dJbmRleEVudHJ5LkluZGV4U2VyaWFsaXplciByb3dJbmRleEVudHJ5U2VyaWFsaXplcjsKLSAgICBwcml2YXRlIGZpbmFsIE9wdGlvbnMgb3B0aW9uczsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNPZmZsaW5lOwotICAgIC8qKgotICAgICAqIEdpdmVuIGEga2V5c3BhY2UsIHJldHVybiB0aGUgc2V0IG9mIGxvY2FsIGFuZCBwZW5kaW5nIHRva2VuIHJhbmdlcy4gIEJ5IGRlZmF1bHQge0BsaW5rIFN0b3JhZ2VTZXJ2aWNlI2dldExvY2FsQW5kUGVuZGluZ1JhbmdlcyhTdHJpbmcpfQotICAgICAqIGlzIGV4cGVjdGVkLCBidXQgZm9yIHRoZSBzdGFuZGFsb25lIHZlcmlmaWVyIGNhc2Ugd2UgY2FuJ3QgdXNlIHRoYXQsIHNvIHRoaXMgaXMgaGVyZSB0byBhbGxvdyB0aGUgQ0xJIHRvIHByb3ZpZGUKLSAgICAgKiB0aGUgdG9rZW4gcmFuZ2VzLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgRnVuY3Rpb248U3RyaW5nLCA/IGV4dGVuZHMgQ29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+PiB0b2tlbkxvb2t1cDsKLQotICAgIHByaXZhdGUgaW50IGdvb2RSb3dzOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBPdXRwdXRIYW5kbGVyIG91dHB1dEhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBGaWxlRGlnZXN0VmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAgIHB1YmxpYyBWZXJpZmllcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgYm9vbGVhbiBpc09mZmxpbmUsIE9wdGlvbnMgb3B0aW9ucykKLSAgICB7Ci0gICAgICAgIHRoaXMoY2ZzLCBzc3RhYmxlLCBuZXcgT3V0cHV0SGFuZGxlci5Mb2dPdXRwdXQoKSwgaXNPZmZsaW5lLCBvcHRpb25zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmVyaWZpZXIoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBTU1RhYmxlUmVhZGVyIHNzdGFibGUsIE91dHB1dEhhbmRsZXIgb3V0cHV0SGFuZGxlciwgYm9vbGVhbiBpc09mZmxpbmUsIE9wdGlvbnMgb3B0aW9ucykKLSAgICB7Ci0gICAgICAgIHRoaXMuY2ZzID0gY2ZzOwotICAgICAgICB0aGlzLnNzdGFibGUgPSBzc3RhYmxlOwotICAgICAgICB0aGlzLm91dHB1dEhhbmRsZXIgPSBvdXRwdXRIYW5kbGVyOwotICAgICAgICB0aGlzLnJvd0luZGV4RW50cnlTZXJpYWxpemVyID0gc3N0YWJsZS5kZXNjcmlwdG9yLnZlcnNpb24uZ2V0U1NUYWJsZUZvcm1hdCgpLmdldEluZGV4U2VyaWFsaXplcihjZnMubWV0YWRhdGEoKSwgc3N0YWJsZS5kZXNjcmlwdG9yLnZlcnNpb24sIHNzdGFibGUuaGVhZGVyKTsKLQotICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBuZXcgVmVyaWZ5Q29udHJvbGxlcihjZnMpOwotCi0gICAgICAgIHRoaXMuZmlsZUFjY2Vzc0xvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOwotICAgICAgICB0aGlzLmRhdGFGaWxlID0gaXNPZmZsaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICA/IHNzdGFibGUub3BlbkRhdGFSZWFkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgOiBzc3RhYmxlLm9wZW5EYXRhUmVhZGVyKENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmdldFJhdGVMaW1pdGVyKCkpOwotICAgICAgICB0aGlzLmluZGV4RmlsZSA9IFJhbmRvbUFjY2Vzc1JlYWRlci5vcGVuKG5ldyBGaWxlKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuUFJJTUFSWV9JTkRFWCkpKTsKLSAgICAgICAgdGhpcy52ZXJpZnlJbmZvID0gbmV3IFZlcmlmeUluZm8oZGF0YUZpbGUsIHNzdGFibGUsIGZpbGVBY2Nlc3NMb2NrLnJlYWRMb2NrKCkpOwotICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwotICAgICAgICB0aGlzLmlzT2ZmbGluZSA9IGlzT2ZmbGluZTsKLSAgICAgICAgdGhpcy50b2tlbkxvb2t1cCA9IG9wdGlvbnMudG9rZW5Mb29rdXA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KCkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZXh0ZW5kZWQgPSBvcHRpb25zLmV4dGVuZGVkVmVyaWZpY2F0aW9uOwotICAgICAgICBsb25nIHJvd1N0YXJ0ID0gMDsKLQotICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dChTdHJpbmcuZm9ybWF0KCJWZXJpZnlpbmcgJXMgKCVzKSIsIHNzdGFibGUsIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KGRhdGFGaWxlLmxlbmd0aCgpKSkpOwotICAgICAgICBpZiAob3B0aW9ucy5jaGVja1ZlcnNpb24gJiYgIXNzdGFibGUuZGVzY3JpcHRvci52ZXJzaW9uLmlzTGF0ZXN0VmVyc2lvbigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgiJXMgaXMgbm90IHRoZSBsYXRlc3QgdmVyc2lvbiwgcnVuIHVwZ3JhZGVzc3RhYmxlcyIsIHNzdGFibGUpOwotICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5vdXRwdXQobXNnKTsKLSAgICAgICAgICAgIC8vIGRvbid0IHVzZSBtYXJrQW5kVGhyb3cgaGVyZSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgYSBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBmb3IgdGhpcy4KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dChTdHJpbmcuZm9ybWF0KCJEZXNlcmlhbGl6aW5nIHNzdGFibGUgbWV0YWRhdGEgZm9yICVzICIsIHNzdGFibGUpKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEVudW1TZXQ8TWV0YWRhdGFUeXBlPiB0eXBlcyA9IEVudW1TZXQub2YoTWV0YWRhdGFUeXBlLlZBTElEQVRJT04sIE1ldGFkYXRhVHlwZS5TVEFUUywgTWV0YWRhdGFUeXBlLkhFQURFUik7Ci0gICAgICAgICAgICBNYXA8TWV0YWRhdGFUeXBlLCBNZXRhZGF0YUNvbXBvbmVudD4gc3N0YWJsZU1ldGFkYXRhID0gc3N0YWJsZS5kZXNjcmlwdG9yLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLmRlc2VyaWFsaXplKHNzdGFibGUuZGVzY3JpcHRvciwgdHlwZXMpOwotICAgICAgICAgICAgaWYgKHNzdGFibGVNZXRhZGF0YS5jb250YWluc0tleShNZXRhZGF0YVR5cGUuVkFMSURBVElPTikgJiYKLSAgICAgICAgICAgICAgICAhKChWYWxpZGF0aW9uTWV0YWRhdGEpc3N0YWJsZU1ldGFkYXRhLmdldChNZXRhZGF0YVR5cGUuVkFMSURBVElPTikpLnBhcnRpdGlvbmVyLmVxdWFscyhzc3RhYmxlLmdldFBhcnRpdGlvbmVyKCkuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiUGFydGl0aW9uZXIgZG9lcyBub3QgbWF0Y2ggdmFsaWRhdGlvbiBtZXRhZGF0YSIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKHQpOwotICAgICAgICAgICAgbWFya0FuZFRocm93KHQsIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRIYW5kbGVyLmRlYnVnKCJEZXNlcmlhbGl6aW5nIGluZGV4IGZvciAiK3NzdGFibGUpOwotICAgICAgICAgICAgZGVzZXJpYWxpemVJbmRleChzc3RhYmxlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2Fybih0KTsKLSAgICAgICAgICAgIG1hcmtBbmRUaHJvdyh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRIYW5kbGVyLmRlYnVnKCJEZXNlcmlhbGl6aW5nIGluZGV4IHN1bW1hcnkgZm9yICIrc3N0YWJsZSk7Ci0gICAgICAgICAgICBkZXNlcmlhbGl6ZUluZGV4U3VtbWFyeShzc3RhYmxlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KCJJbmRleCBzdW1tYXJ5IGlzIGNvcnJ1cHQgLSBpZiBpdCBpcyByZW1vdmVkIGl0IHdpbGwgZ2V0IHJlYnVpbHQgb24gc3RhcnR1cCAiK3NzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuU1VNTUFSWSkpOwotICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKHQpOwotICAgICAgICAgICAgbWFya0FuZFRocm93KHQsIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRIYW5kbGVyLmRlYnVnKCJEZXNlcmlhbGl6aW5nIGJsb29tIGZpbHRlciBmb3IgIitzc3RhYmxlKTsKLSAgICAgICAgICAgIGRlc2VyaWFsaXplQmxvb21GaWx0ZXIoc3N0YWJsZSk7Ci0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2Fybih0KTsKLSAgICAgICAgICAgIG1hcmtBbmRUaHJvdyh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvcHRpb25zLmNoZWNrT3duc1Rva2VucyAmJiAhaXNPZmZsaW5lICYmICEoY2ZzLmdldFBhcnRpdGlvbmVyKCkgaW5zdGFuY2VvZiBMb2NhbFBhcnRpdGlvbmVyKSkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5kZWJ1ZygiQ2hlY2tpbmcgdGhhdCBhbGwgdG9rZW5zIGFyZSBvd25lZCBieSB0aGUgY3VycmVudCBub2RlIik7Ci0gICAgICAgICAgICB0cnkgKEtleUl0ZXJhdG9yIGl0ZXIgPSBuZXcgS2V5SXRlcmF0b3Ioc3N0YWJsZS5kZXNjcmlwdG9yLCBzc3RhYmxlLm1ldGFkYXRhKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExpc3Q8UmFuZ2U8VG9rZW4+PiBvd25lZFJhbmdlcyA9IFJhbmdlLm5vcm1hbGl6ZSh0b2tlbkxvb2t1cC5hcHBseShjZnMubWV0YWRhdGEua2V5c3BhY2UpKTsKLSAgICAgICAgICAgICAgICBpZiAob3duZWRSYW5nZXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgUmFuZ2VPd25IZWxwZXIgcmFuZ2VPd25IZWxwZXIgPSBuZXcgUmFuZ2VPd25IZWxwZXIob3duZWRSYW5nZXMpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgcmFuZ2VPd25IZWxwZXIudmFsaWRhdGUoa2V5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKHQpOwotICAgICAgICAgICAgICAgIG1hcmtBbmRUaHJvdyh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvcHRpb25zLnF1aWNrKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8vIFZlcmlmeSB3aWxsIHVzZSB0aGUgRGlnZXN0IGZpbGVzLCB3aGljaCB3b3JrcyBmb3IgYm90aCBjb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgc3N0YWJsZXMKLSAgICAgICAgb3V0cHV0SGFuZGxlci5vdXRwdXQoU3RyaW5nLmZvcm1hdCgiQ2hlY2tpbmcgY29tcHV0ZWQgaGFzaCBvZiAlcyAiLCBzc3RhYmxlKSk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0b3IgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAobmV3IEZpbGUoc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5ESUdFU1QpKS5leGlzdHMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0b3IgPSBEYXRhSW50ZWdyaXR5TWV0YWRhdGEuZmlsZURpZ2VzdFZhbGlkYXRvcihzc3RhYmxlLmRlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KCJEYXRhIGRpZ2VzdCBtaXNzaW5nLCBhc3N1bWluZyBleHRlbmRlZCB2ZXJpZmljYXRpb24gb2YgZGlzayB2YWx1ZXMiKTsKLSAgICAgICAgICAgICAgICBleHRlbmRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2FybihlKTsKLSAgICAgICAgICAgIG1hcmtBbmRUaHJvdyhlKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZVF1aWV0bHkodmFsaWRhdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZXh0ZW5kZWQpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgb3V0cHV0SGFuZGxlci5vdXRwdXQoIkV4dGVuZGVkIFZlcmlmeSByZXF1ZXN0ZWQsIHByb2NlZWRpbmcgdG8gaW5zcGVjdCB2YWx1ZXMiKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgQnl0ZUJ1ZmZlciBuZXh0SW5kZXhLZXkgPSBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGluZGV4RmlsZSk7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZyBmaXJzdFJvd1Bvc2l0aW9uRnJvbUluZGV4ID0gcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIuZGVzZXJpYWxpemVQb3NpdGlvbkFuZFNraXAoaW5kZXhGaWxlKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3RSb3dQb3NpdGlvbkZyb21JbmRleCAhPSAwKQotICAgICAgICAgICAgICAgICAgICBtYXJrQW5kVGhyb3cobmV3IFJ1bnRpbWVFeGNlcHRpb24oImZpcnN0Um93UG9zaXRpb25Gcm9tSW5kZXggIT0gMDogIitmaXJzdFJvd1Bvc2l0aW9uRnJvbUluZGV4KSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8UmFuZ2U8VG9rZW4+PiBvd25lZFJhbmdlcyA9IGlzT2ZmbGluZSA/IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpIDogUmFuZ2Uubm9ybWFsaXplKHRva2VuTG9va3VwLmFwcGx5KGNmcy5tZXRhZGF0YSgpLmtleXNwYWNlKSk7Ci0gICAgICAgICAgICBSYW5nZU93bkhlbHBlciByYW5nZU93bkhlbHBlciA9IG5ldyBSYW5nZU93bkhlbHBlcihvd25lZFJhbmdlcyk7Ci0gICAgICAgICAgICBEZWNvcmF0ZWRLZXkgcHJldktleSA9IG51bGw7Ci0KLSAgICAgICAgICAgIHdoaWxlICghZGF0YUZpbGUuaXNFT0YoKSkKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIGlmICh2ZXJpZnlJbmZvLmlzU3RvcFJlcXVlc3RlZCgpKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29tcGFjdGlvbkludGVycnVwdGVkRXhjZXB0aW9uKHZlcmlmeUluZm8uZ2V0Q29tcGFjdGlvbkluZm8oKSk7Ci0KLSAgICAgICAgICAgICAgICByb3dTdGFydCA9IGRhdGFGaWxlLmdldEZpbGVQb2ludGVyKCk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5kZWJ1ZygiUmVhZGluZyByb3cgYXQgIiArIHJvd1N0YXJ0KTsKLQotICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAga2V5ID0gc3N0YWJsZS5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGRhdGFGaWxlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdGgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvd0lmRmF0YWwodGgpOwotICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgbnVsbCBrZXkgYmVsb3cKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jaGVja093bnNUb2tlbnMgJiYgb3duZWRSYW5nZXMuc2l6ZSgpID4gMCAmJiAhKGNmcy5nZXRQYXJ0aXRpb25lcigpIGluc3RhbmNlb2YgTG9jYWxQYXJ0aXRpb25lcikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VPd25IZWxwZXIudmFsaWRhdGUoa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2FybihTdHJpbmcuZm9ybWF0KCJLZXkgJXMgaW4gc3N0YWJsZSAlcyBub3Qgb3duZWQgYnkgbG9jYWwgcmFuZ2VzICVzIiwga2V5LCBzc3RhYmxlLCBvd25lZFJhbmdlcyksIHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFya0FuZFRocm93KHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBjdXJyZW50SW5kZXhLZXkgPSBuZXh0SW5kZXhLZXk7Ci0gICAgICAgICAgICAgICAgbG9uZyBuZXh0Um93UG9zaXRpb25Gcm9tSW5kZXggPSAwOwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dEluZGV4S2V5ID0gaW5kZXhGaWxlLmlzRU9GKCkgPyBudWxsIDogQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChpbmRleEZpbGUpOwotICAgICAgICAgICAgICAgICAgICBuZXh0Um93UG9zaXRpb25Gcm9tSW5kZXggPSBpbmRleEZpbGUuaXNFT0YoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkYXRhRmlsZS5sZW5ndGgoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByb3dJbmRleEVudHJ5U2VyaWFsaXplci5kZXNlcmlhbGl6ZVBvc2l0aW9uQW5kU2tpcChpbmRleEZpbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWFya0FuZFRocm93KHRoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsb25nIGRhdGFTdGFydCA9IGRhdGFGaWxlLmdldEZpbGVQb2ludGVyKCk7Ci0gICAgICAgICAgICAgICAgbG9uZyBkYXRhU3RhcnRGcm9tSW5kZXggPSBjdXJyZW50SW5kZXhLZXkgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gLTEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJvd1N0YXJ0ICsgMiArIGN1cnJlbnRJbmRleEtleS5yZW1haW5pbmcoKTsKLQotICAgICAgICAgICAgICAgIGxvbmcgZGF0YVNpemUgPSBuZXh0Um93UG9zaXRpb25Gcm9tSW5kZXggLSBkYXRhU3RhcnRGcm9tSW5kZXg7Ci0gICAgICAgICAgICAgICAgLy8gYXZvaWQgYW4gTlBFIGlmIGtleSBpcyBudWxsCi0gICAgICAgICAgICAgICAgU3RyaW5nIGtleU5hbWUgPSBrZXkgPT0gbnVsbCA/ICIodW5yZWFkYWJsZSBrZXkpIiA6IEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoa2V5LmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLmRlYnVnKFN0cmluZy5mb3JtYXQoInJvdyAlcyBpcyAlcyIsIGtleU5hbWUsIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KGRhdGFTaXplKSkpOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0IGN1cnJlbnRJbmRleEtleSAhPSBudWxsIHx8IGluZGV4RmlsZS5pc0VPRigpOwotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09IG51bGwgfHwgZGF0YVNpemUgPiBkYXRhRmlsZS5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtBbmRUaHJvdyhuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJrZXkgPSAlcywgZGF0YVNpemU9JWQsIGRhdGFGaWxlLmxlbmd0aCgpID0gJWQiLCBrZXksIGRhdGFTaXplLCBkYXRhRmlsZS5sZW5ndGgoKSkpKTsKLQotICAgICAgICAgICAgICAgICAgICAvL21pbWljIHRoZSBzY3J1YiByZWFkIHBhdGgsIGludGVudGlvbmFsbHkgdW51c2VkCi0gICAgICAgICAgICAgICAgICAgIHRyeSAoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yID0gU1NUYWJsZUlkZW50aXR5SXRlcmF0b3IuY3JlYXRlKHNzdGFibGUsIGRhdGFGaWxlLCBrZXkpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoIChwcmV2S2V5ICE9IG51bGwgJiYgcHJldktleS5jb21wYXJlVG8oa2V5KSA+IDApIHx8ICFrZXkuZ2V0S2V5KCkuZXF1YWxzKGN1cnJlbnRJbmRleEtleSkgfHwgZGF0YVN0YXJ0ICE9IGRhdGFTdGFydEZyb21JbmRleCApCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXJrQW5kVGhyb3cobmV3IFJ1bnRpbWVFeGNlcHRpb24oIktleSBvdXQgb2Ygb3JkZXI6IHByZXZpb3VzID0gIitwcmV2S2V5ICsgIiA6IGN1cnJlbnQgPSAiICsga2V5KSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBnb29kUm93cysrOwotICAgICAgICAgICAgICAgICAgICBwcmV2S2V5ID0ga2V5OwotCi0KLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5kZWJ1ZyhTdHJpbmcuZm9ybWF0KCJSb3cgJXMgYXQgJXMgdmFsaWQsIG1vdmluZyB0byBuZXh0IHJvdyBhdCAlcyAiLCBnb29kUm93cywgcm93U3RhcnQsIG5leHRSb3dQb3NpdGlvbkZyb21JbmRleCkpOwotICAgICAgICAgICAgICAgICAgICBkYXRhRmlsZS5zZWVrKG5leHRSb3dQb3NpdGlvbkZyb21JbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdGgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtYXJrQW5kVGhyb3codGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKHQpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0cHV0SGFuZGxlci5vdXRwdXQoIlZlcmlmeSBvZiAiICsgc3N0YWJsZSArICIgc3VjY2VlZGVkLiBBbGwgIiArIGdvb2RSb3dzICsgIiByb3dzIHJlYWQgc3VjY2Vzc2Z1bGx5Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlIHRoZSBmYWN0IHRoYXQgY2hlY2soLi4pIGlzIGNhbGxlZCB3aXRoIHNvcnRlZCB0b2tlbnMgLSB3ZSBrZWVwIGEgcG9pbnRlciBpbiB0byB0aGUgbm9ybWFsaXplZCByYW5nZXMKLSAgICAgKiBhbmQgb25seSBidW1wIHRoZSBwb2ludGVyIGlmIHRoZSBrZXkgZ2l2ZW4gaXMgb3V0IG9mIHJhbmdlLiBUaGlzIGlzIGRvbmUgdG8gYXZvaWQgY2FsbGluZyAuY29udGFpbnMoLi4pIG1hbnkKLSAgICAgKiB0aW1lcyBmb3IgZWFjaCBrZXkgKHdpdGggdm5vZGVzIGZvciBleGFtcGxlKQotICAgICAqLwotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmFuZ2VPd25IZWxwZXIKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxSYW5nZTxUb2tlbj4+IG5vcm1hbGl6ZWRSYW5nZXM7Ci0gICAgICAgIHByaXZhdGUgaW50IHJhbmdlSW5kZXggPSAwOwotICAgICAgICBwcml2YXRlIERlY29yYXRlZEtleSBsYXN0S2V5OwotCi0gICAgICAgIHB1YmxpYyBSYW5nZU93bkhlbHBlcihMaXN0PFJhbmdlPFRva2VuPj4gbm9ybWFsaXplZFJhbmdlcykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVkUmFuZ2VzID0gbm9ybWFsaXplZFJhbmdlczsKLSAgICAgICAgICAgIFJhbmdlLmFzc2VydE5vcm1hbGl6ZWQobm9ybWFsaXplZFJhbmdlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogY2hlY2sgaWYgdGhlIGdpdmVuIGtleSBpcyBjb250YWluZWQgaW4gYW55IG9mIHRoZSBnaXZlbiByYW5nZXMKLSAgICAgICAgICoKLSAgICAgICAgICogTXVzdCBiZSBjYWxsZWQgaW4gc29ydGVkIG9yZGVyIC0ga2V5IHNob3VsZCBiZSBpbmNyZWFzaW5nCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleQotICAgICAgICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gaWYgdGhlIGtleSBpcyBub3QgY29udGFpbmVkCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShEZWNvcmF0ZWRLZXkga2V5KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWNoZWNrKGtleSkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIktleSAiICsga2V5ICsgIiBpcyBub3QgY29udGFpbmVkIGluIHRoZSBnaXZlbiByYW5nZXMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBjaGVjayBpZiB0aGUgZ2l2ZW4ga2V5IGlzIGNvbnRhaW5lZCBpbiBhbnkgb2YgdGhlIGdpdmVuIHJhbmdlcwotICAgICAgICAgKgotICAgICAgICAgKiBNdXN0IGJlIGNhbGxlZCBpbiBzb3J0ZWQgb3JkZXIgLSBrZXkgc2hvdWxkIGJlIGluY3JlYXNpbmcKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGtleSB0aGUga2V5Ci0gICAgICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gY2hlY2soRGVjb3JhdGVkS2V5IGtleSkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGxhc3RLZXkgPT0gbnVsbCB8fCBrZXkuY29tcGFyZVRvKGxhc3RLZXkpID4gMDsKLSAgICAgICAgICAgIGxhc3RLZXkgPSBrZXk7Ci0KLSAgICAgICAgICAgIGlmIChub3JtYWxpemVkUmFuZ2VzLmlzRW1wdHkoKSkgLy8gaGFuZGxlIHRlc3RzIGV0YyB3aGVyZSB3ZSBkb24ndCBoYXZlIGFueSByYW5nZXMKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgaWYgKHJhbmdlSW5kZXggPiBub3JtYWxpemVkUmFuZ2VzLnNpemUoKSAtIDEpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmFuZ2VPd25IZWxwZXIgY2FuIG9ubHkgYmUgdXNlZCB0byBmaW5kIHRoZSBmaXJzdCBvdXQtb2YtcmFuZ2UtdG9rZW4iKTsKLQotICAgICAgICAgICAgd2hpbGUgKCFub3JtYWxpemVkUmFuZ2VzLmdldChyYW5nZUluZGV4KS5jb250YWlucyhrZXkuZ2V0VG9rZW4oKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmFuZ2VJbmRleCsrOwotICAgICAgICAgICAgICAgIGlmIChyYW5nZUluZGV4ID4gbm9ybWFsaXplZFJhbmdlcy5zaXplKCkgLSAxKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRlc2VyaWFsaXplSW5kZXgoU1NUYWJsZVJlYWRlciBzc3RhYmxlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzUmVhZGVyIHByaW1hcnlJbmRleCA9IFJhbmRvbUFjY2Vzc1JlYWRlci5vcGVuKG5ldyBGaWxlKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuUFJJTUFSWV9JTkRFWCkpKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9uZyBpbmRleFNpemUgPSBwcmltYXJ5SW5kZXgubGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlICgocHJpbWFyeUluZGV4LmdldEZpbGVQb2ludGVyKCkpICE9IGluZGV4U2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGtleSA9IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgocHJpbWFyeUluZGV4KTsKLSAgICAgICAgICAgICAgICBSb3dJbmRleEVudHJ5LlNlcmlhbGl6ZXIuc2tpcChwcmltYXJ5SW5kZXgsIHNzdGFibGUuZGVzY3JpcHRvci52ZXJzaW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZXNlcmlhbGl6ZUluZGV4U3VtbWFyeShTU1RhYmxlUmVhZGVyIHNzdGFibGUpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5TVU1NQVJZKSk7Ci0gICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEgPSBjZnMubWV0YWRhdGEoKTsKLSAgICAgICAgdHJ5IChEYXRhSW5wdXRTdHJlYW0gaVN0cmVhbSA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oRmlsZXMubmV3SW5wdXRTdHJlYW0oZmlsZS50b1BhdGgoKSkpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkgKEluZGV4U3VtbWFyeSBpbmRleFN1bW1hcnkgPSBJbmRleFN1bW1hcnkuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShpU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLmdldFBhcnRpdGlvbmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnBhcmFtcy5tYXhJbmRleEludGVydmFsKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aExlbmd0aChpU3RyZWFtKTsKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aExlbmd0aChpU3RyZWFtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZXNlcmlhbGl6ZUJsb29tRmlsdGVyKFNTVGFibGVSZWFkZXIgc3N0YWJsZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBGaWxlIGJmUGF0aCA9IG5ldyBGaWxlKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuRklMVEVSKSk7Ci0gICAgICAgIGlmIChiZlBhdGguZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeSAoRmlsZUlucHV0U3RyZWFtUGx1cyBzdHJlYW0gPSBiZlBhdGgubmV3SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgSUZpbHRlciBiZiA9IEJsb29tRmlsdGVyU2VyaWFsaXplci5kZXNlcmlhbGl6ZShzdHJlYW0sIHNzdGFibGUuZGVzY3JpcHRvci52ZXJzaW9uLmhhc09sZEJmRm9ybWF0KCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKQotICAgIHsKLSAgICAgICAgZmlsZUFjY2Vzc0xvY2sud3JpdGVMb2NrKCkubG9jaygpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlUXVpZXRseShkYXRhRmlsZSk7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2VRdWlldGx5KGluZGV4RmlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWxlQWNjZXNzTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0aHJvd0lmRmF0YWwoVGhyb3dhYmxlIHRoKQotICAgIHsKLSAgICAgICAgaWYgKHRoIGluc3RhbmNlb2YgRXJyb3IgJiYgISh0aCBpbnN0YW5jZW9mIEFzc2VydGlvbkVycm9yIHx8IHRoIGluc3RhbmNlb2YgSU9FcnJvcikpCi0gICAgICAgICAgICB0aHJvdyAoRXJyb3IpIHRoOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBtYXJrQW5kVGhyb3coVGhyb3dhYmxlIGNhdXNlKQotICAgIHsKLSAgICAgICAgbWFya0FuZFRocm93KGNhdXNlLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbWFya0FuZFRocm93KFRocm93YWJsZSBjYXVzZSwgYm9vbGVhbiBtdXRhdGVSZXBhaXJlZCkKLSAgICB7Ci0gICAgICAgIGlmIChtdXRhdGVSZXBhaXJlZCAmJiBvcHRpb25zLm11dGF0ZVJlcGFpclN0YXR1cykgLy8gaWYgd2UgYXJlIGFibGUgdG8gbXV0YXRlIHJlcGFpcmVkIGZsYWcsIGFuIGluY3JlbWVudGFsIHJlcGFpciBzaG91bGQgYmUgZW5vdWdoCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNzdGFibGUubXV0YXRlUmVwYWlyZWRBbmRSZWxvYWQoQWN0aXZlUmVwYWlyU2VydmljZS5VTlJFUEFJUkVEX1NTVEFCTEUsIHNzdGFibGUuZ2V0UGVuZGluZ1JlcGFpcigpLCBzc3RhYmxlLmlzVHJhbnNpZW50KCkpOwotICAgICAgICAgICAgICAgIGNmcy5nZXRUcmFja2VyKCkubm90aWZ5U1NUYWJsZVJlcGFpcmVkU3RhdHVzQ2hhbmdlZChDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3N0YWJsZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goSU9FeGNlcHRpb24gaW9lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KCJFcnJvciBtdXRhdGluZyByZXBhaXJlZEF0IGZvciBTU1RhYmxlICIgKyAgc3N0YWJsZS5nZXRGaWxlbmFtZSgpICsgIiwgYXMgcGFydCBvZiBtYXJrQW5kVGhyb3ciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFeGNlcHRpb24gZSA9IG5ldyBFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiSW52YWxpZCBTU1RhYmxlICVzLCBwbGVhc2UgZm9yY2UgJXNyZXBhaXIiLCBzc3RhYmxlLmdldEZpbGVuYW1lKCksIChtdXRhdGVSZXBhaXJlZCAmJiBvcHRpb25zLm11dGF0ZVJlcGFpclN0YXR1cykgPyAiIiA6ICJhIGZ1bGwgIiksIGNhdXNlKTsKLSAgICAgICAgaWYgKG9wdGlvbnMuaW52b2tlRGlza0ZhaWx1cmVQb2xpY3kpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24oZSwgc3N0YWJsZS5nZXRGaWxlbmFtZSgpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbXBhY3Rpb25JbmZvLkhvbGRlciBnZXRWZXJpZnlJbmZvKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2ZXJpZnlJbmZvOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFZlcmlmeUluZm8gZXh0ZW5kcyBDb21wYWN0aW9uSW5mby5Ib2xkZXIKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUmFuZG9tQWNjZXNzUmVhZGVyIGRhdGFGaWxlOwotICAgICAgICBwcml2YXRlIGZpbmFsIFNTVGFibGVSZWFkZXIgc3N0YWJsZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBUaW1lVVVJRCB2ZXJpZmljYXRpb25Db21wYWN0aW9uSWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTG9jayBmaWxlUmVhZExvY2s7Ci0KLSAgICAgICAgcHVibGljIFZlcmlmeUluZm8oUmFuZG9tQWNjZXNzUmVhZGVyIGRhdGFGaWxlLCBTU1RhYmxlUmVhZGVyIHNzdGFibGUsIExvY2sgZmlsZVJlYWRMb2NrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmRhdGFGaWxlID0gZGF0YUZpbGU7Ci0gICAgICAgICAgICB0aGlzLnNzdGFibGUgPSBzc3RhYmxlOwotICAgICAgICAgICAgdGhpcy5maWxlUmVhZExvY2sgPSBmaWxlUmVhZExvY2s7Ci0gICAgICAgICAgICB2ZXJpZmljYXRpb25Db21wYWN0aW9uSWQgPSBuZXh0VGltZVVVSUQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb21wYWN0aW9uSW5mbyBnZXRDb21wYWN0aW9uSW5mbygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbGVSZWFkTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25JbmZvKHNzdGFibGUubWV0YWRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvblR5cGUuVkVSSUZZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUZpbGUuZ2V0RmlsZVBvaW50ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFGaWxlLmxlbmd0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uQ29tcGFjdGlvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlU2V0Lm9mKHNzdGFibGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbGVSZWFkTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmVyaWZ5Q29udHJvbGxlciBleHRlbmRzIENvbXBhY3Rpb25Db250cm9sbGVyCi0gICAgewotICAgICAgICBwdWJsaWMgVmVyaWZ5Q29udHJvbGxlcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKGNmcywgSW50ZWdlci5NQVhfVkFMVUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBMb25nUHJlZGljYXRlIGdldFB1cmdlRXZhbHVhdG9yKERlY29yYXRlZEtleSBrZXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aW1lIC0+IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPcHRpb25zLkJ1aWxkZXIgb3B0aW9ucygpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IE9wdGlvbnMuQnVpbGRlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT3B0aW9ucwotICAgIHsKLSAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaW52b2tlRGlza0ZhaWx1cmVQb2xpY3k7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGV4dGVuZGVkVmVyaWZpY2F0aW9uOwotICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBjaGVja1ZlcnNpb247Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIG11dGF0ZVJlcGFpclN0YXR1czsKLSAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gY2hlY2tPd25zVG9rZW5zOwotICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBxdWljazsKLSAgICAgICAgcHVibGljIGZpbmFsIEZ1bmN0aW9uPFN0cmluZywgPyBleHRlbmRzIENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+Pj4gdG9rZW5Mb29rdXA7Ci0KLSAgICAgICAgcHJpdmF0ZSBPcHRpb25zKGJvb2xlYW4gaW52b2tlRGlza0ZhaWx1cmVQb2xpY3ksIGJvb2xlYW4gZXh0ZW5kZWRWZXJpZmljYXRpb24sIGJvb2xlYW4gY2hlY2tWZXJzaW9uLCBib29sZWFuIG11dGF0ZVJlcGFpclN0YXR1cywgYm9vbGVhbiBjaGVja093bnNUb2tlbnMsIGJvb2xlYW4gcXVpY2ssIEZ1bmN0aW9uPFN0cmluZywgPyBleHRlbmRzIENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+Pj4gdG9rZW5Mb29rdXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuaW52b2tlRGlza0ZhaWx1cmVQb2xpY3kgPSBpbnZva2VEaXNrRmFpbHVyZVBvbGljeTsKLSAgICAgICAgICAgIHRoaXMuZXh0ZW5kZWRWZXJpZmljYXRpb24gPSBleHRlbmRlZFZlcmlmaWNhdGlvbjsKLSAgICAgICAgICAgIHRoaXMuY2hlY2tWZXJzaW9uID0gY2hlY2tWZXJzaW9uOwotICAgICAgICAgICAgdGhpcy5tdXRhdGVSZXBhaXJTdGF0dXMgPSBtdXRhdGVSZXBhaXJTdGF0dXM7Ci0gICAgICAgICAgICB0aGlzLmNoZWNrT3duc1Rva2VucyA9IGNoZWNrT3duc1Rva2VuczsKLSAgICAgICAgICAgIHRoaXMucXVpY2sgPSBxdWljazsKLSAgICAgICAgICAgIHRoaXMudG9rZW5Mb29rdXAgPSB0b2tlbkxvb2t1cDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICJPcHRpb25zeyIgKwotICAgICAgICAgICAgICAgICAgICJpbnZva2VEaXNrRmFpbHVyZVBvbGljeT0iICsgaW52b2tlRGlza0ZhaWx1cmVQb2xpY3kgKwotICAgICAgICAgICAgICAgICAgICIsIGV4dGVuZGVkVmVyaWZpY2F0aW9uPSIgKyBleHRlbmRlZFZlcmlmaWNhdGlvbiArCi0gICAgICAgICAgICAgICAgICAgIiwgY2hlY2tWZXJzaW9uPSIgKyBjaGVja1ZlcnNpb24gKwotICAgICAgICAgICAgICAgICAgICIsIG11dGF0ZVJlcGFpclN0YXR1cz0iICsgbXV0YXRlUmVwYWlyU3RhdHVzICsKLSAgICAgICAgICAgICAgICAgICAiLCBjaGVja093bnNUb2tlbnM9IiArIGNoZWNrT3duc1Rva2VucyArCi0gICAgICAgICAgICAgICAgICAgIiwgcXVpY2s9IiArIHF1aWNrICsKLSAgICAgICAgICAgICAgICAgICAnfSc7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIKLSAgICAgICAgewotICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGludm9rZURpc2tGYWlsdXJlUG9saWN5ID0gZmFsc2U7IC8vIGludm9raW5nIGRpc2sgZmFpbHVyZSBwb2xpY3kgY2FuIHN0b3AgdGhlIG5vZGUgaWYgd2UgZmluZCBhIGNvcnJ1cHQgc3RhYmxlCi0gICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gZXh0ZW5kZWRWZXJpZmljYXRpb24gPSBmYWxzZTsKLSAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja1ZlcnNpb24gPSBmYWxzZTsKLSAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtdXRhdGVSZXBhaXJTdGF0dXMgPSBmYWxzZTsgLy8gbXV0YXRpbmcgcmVwYWlyIHN0YXR1cyBjYW4gYmUgZGFuZ2Vyb3VzCi0gICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tPd25zVG9rZW5zID0gZmFsc2U7Ci0gICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gcXVpY2sgPSBmYWxzZTsKLSAgICAgICAgICAgIHByaXZhdGUgRnVuY3Rpb248U3RyaW5nLCA/IGV4dGVuZHMgQ29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+PiB0b2tlbkxvb2t1cCA9IFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlOjpnZXRMb2NhbEFuZFBlbmRpbmdSYW5nZXM7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIGludm9rZURpc2tGYWlsdXJlUG9saWN5KGJvb2xlYW4gcGFyYW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSA9IHBhcmFtOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBleHRlbmRlZFZlcmlmaWNhdGlvbihib29sZWFuIHBhcmFtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuZXh0ZW5kZWRWZXJpZmljYXRpb24gPSBwYXJhbTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgY2hlY2tWZXJzaW9uKGJvb2xlYW4gcGFyYW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jaGVja1ZlcnNpb24gPSBwYXJhbTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgbXV0YXRlUmVwYWlyU3RhdHVzKGJvb2xlYW4gcGFyYW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tdXRhdGVSZXBhaXJTdGF0dXMgPSBwYXJhbTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgY2hlY2tPd25zVG9rZW5zKGJvb2xlYW4gcGFyYW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jaGVja093bnNUb2tlbnMgPSBwYXJhbTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgcXVpY2soYm9vbGVhbiBwYXJhbSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLnF1aWNrID0gcGFyYW07Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIHRva2VuTG9va3VwKEZ1bmN0aW9uPFN0cmluZywgPyBleHRlbmRzIENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+Pj4gdG9rZW5Mb29rdXApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy50b2tlbkxvb2t1cCA9IHRva2VuTG9va3VwOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgT3B0aW9ucyBidWlsZCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPcHRpb25zKGludm9rZURpc2tGYWlsdXJlUG9saWN5LCBleHRlbmRlZFZlcmlmaWNhdGlvbiwgY2hlY2tWZXJzaW9uLCBtdXRhdGVSZXBhaXJTdGF0dXMsIGNoZWNrT3duc1Rva2VucywgcXVpY2ssIHRva2VuTG9va3VwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi93cml0ZXJzL0NvbXBhY3Rpb25Bd2FyZVdyaXRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi93cml0ZXJzL0NvbXBhY3Rpb25Bd2FyZVdyaXRlci5qYXZhCmluZGV4IDBmNGZlMmQuLjQ1MWE3OGQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vd3JpdGVycy9Db21wYWN0aW9uQXdhcmVXcml0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL3dyaXRlcnMvQ29tcGFjdGlvbkF3YXJlV3JpdGVyLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLndyaXRlcnM7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CkBAIC0zMCwxNiArMzEsMjEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXNrQm91bmRhcmllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5QYXJ0aXRpb25Qb3NpdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvblRhc2s7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZXdyaXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbGxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5UcmFuc2FjdGlvbmFsOwogCisKIC8qKgogICogQ2xhc3MgdGhhdCBhYnN0cmFjdHMgYXdheSB0aGUgYWN0dWFsIHdyaXRpbmcgb2YgZmlsZXMgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byB1c2UgQ29tcGFjdGlvblRhc2sgZm9yIG1vcmUKICAqIHVzZSBjYXNlcy4KQEAgLTYzLDYgKzY5LDkgQEAKICAgICBwcml2YXRlIGZpbmFsIExpc3Q8UGFydGl0aW9uUG9zaXRpb24+IGRpc2tCb3VuZGFyaWVzOwogICAgIHByaXZhdGUgaW50IGxvY2F0aW9uSW5kZXg7CiAKKyAgICAvLyBLZWVwIHRhcmdldERpcmVjdG9yeSBmb3IgY29tcGFjdGlvbnMsIG5lZWRlZCBmb3IgYG5vZGV0b29sIGNvbXBhY3Rpb25zdGF0c2AKKyAgICBwcm90ZWN0ZWQgRGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeSBzc3RhYmxlRGlyZWN0b3J5OworCiAgICAgcHVibGljIENvbXBhY3Rpb25Bd2FyZVdyaXRlcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3RvcmllcyBkaXJlY3RvcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biwKQEAgLTEzNCw2ICsxNDMsMTEgQEAKICAgICAgICAgcmV0dXJuIHJlYWxBcHBlbmQocGFydGl0aW9uKTsKICAgICB9CiAKKyAgICBwdWJsaWMgZmluYWwgRmlsZSBnZXRTU3RhYmxlRGlyZWN0b3J5KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gZ2V0RGlyZWN0b3JpZXMoKS5nZXRMb2NhdGlvbkZvckRpc2soc3N0YWJsZURpcmVjdG9yeSk7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIFRocm93YWJsZSBkb1Bvc3RDbGVhbnVwKFRocm93YWJsZSBhY2N1bXVsYXRlKQogICAgIHsKQEAgLTIzNSw0ICsyNDksMjQgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBjZnMuZ2V0RXhwZWN0ZWRDb21wYWN0ZWRGaWxlU2l6ZShub25FeHBpcmVkU1NUYWJsZXMsIHR4bi5vcFR5cGUoKSk7CiAgICAgfQorCisgICAgLyoqCisgICAgICogSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBzZXQgdGhlIGZvbGxvd2luZyBmaWVsZHM6CisgICAgICogLSB7QGxpbmsgU1NUYWJsZVdyaXRlci5CdWlsZGVyI3NldEtleUNvdW50KGxvbmcpfSwKKyAgICAgKiAtIHtAbGluayBTU1RhYmxlV3JpdGVyLkJ1aWxkZXIjc2V0U2VyaWFsaXphdGlvbkhlYWRlcihTZXJpYWxpemF0aW9uSGVhZGVyKX0gYW5kLAorICAgICAqIC0ge0BsaW5rIFNTVGFibGVXcml0ZXIuQnVpbGRlciNzZXRNZXRhZGF0YUNvbGxlY3RvcihNZXRhZGF0YUNvbGxlY3Rvcil9CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVzY3JpcHRvcgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU1NUYWJsZVdyaXRlci5CdWlsZGVyPD8sID8+IG5ld1dyaXRlckJ1aWxkZXIoRGVzY3JpcHRvciBkZXNjcmlwdG9yKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuZ2V0Rm9ybWF0KCkuZ2V0V3JpdGVyRmFjdG9yeSgpLmJ1aWxkZXIoZGVzY3JpcHRvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGFibGVNZXRhZGF0YVJlZihjZnMubWV0YWRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRyYW5zaWVudFNTVGFibGUoaXNUcmFuc2llbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFJlcGFpcmVkQXQobWluUmVwYWlyZWRBdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UGVuZGluZ1JlcGFpcihwZW5kaW5nUmVwYWlyKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRGbHVzaE9ic2VydmVyc0ZvclNlY29uZGFyeUluZGV4ZXMoY2ZzLmluZGV4TWFuYWdlci5saXN0SW5kZXhlcygpLCB0eG4ub3BUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZERlZmF1bHRDb21wb25lbnRzKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi93cml0ZXJzL0RlZmF1bHRDb21wYWN0aW9uV3JpdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL3dyaXRlcnMvRGVmYXVsdENvbXBhY3Rpb25Xcml0ZXIuamF2YQppbmRleCA2MTgwZjk2Li5mOTg1ODQ3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL3dyaXRlcnMvRGVmYXVsdENvbXBhY3Rpb25Xcml0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL3dyaXRlcnMvRGVmYXVsdENvbXBhY3Rpb25Xcml0ZXIuamF2YQpAQCAtMjYsOCArMjYsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpcmVjdG9yaWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVXcml0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbGxlY3RvcjsKQEAgLTY3LDE3ICs2OCwxNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHN3aXRjaENvbXBhY3Rpb25Mb2NhdGlvbihEaXJlY3Rvcmllcy5EYXRhRGlyZWN0b3J5IGRpcmVjdG9yeSkKICAgICB7CisgICAgICAgIHNzdGFibGVEaXJlY3RvcnkgPSBkaXJlY3Rvcnk7CisKKyAgICAgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gY2ZzLm5ld1NTVGFibGVEZXNjcmlwdG9yKGdldERpcmVjdG9yaWVzKCkuZ2V0TG9jYXRpb25Gb3JEaXNrKGRpcmVjdG9yeSkpOworICAgICAgICBNZXRhZGF0YUNvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgTWV0YWRhdGFDb2xsZWN0b3IodHhuLm9yaWdpbmFscygpLCBjZnMubWV0YWRhdGEoKS5jb21wYXJhdG9yLCBzc3RhYmxlTGV2ZWwpOworICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciA9IFNlcmlhbGl6YXRpb25IZWFkZXIubWFrZShjZnMubWV0YWRhdGEoKSwgbm9uRXhwaXJlZFNTVGFibGVzKTsKKwogICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQotICAgICAgICBTU1RhYmxlV3JpdGVyIHdyaXRlciA9IFNTVGFibGVXcml0ZXIuY3JlYXRlKGNmcy5uZXdTU1RhYmxlRGVzY3JpcHRvcihnZXREaXJlY3RvcmllcygpLmdldExvY2F0aW9uRm9yRGlzayhkaXJlY3RvcnkpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZWRUb3RhbEtleXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluUmVwYWlyZWRBdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nUmVwYWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVHJhbnNpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmcy5tZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWV0YWRhdGFDb2xsZWN0b3IodHhuLm9yaWdpbmFscygpLCBjZnMubWV0YWRhdGEoKS5jb21wYXJhdG9yLCBzc3RhYmxlTGV2ZWwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIubWFrZShjZnMubWV0YWRhdGEoKSwgbm9uRXhwaXJlZFNTVGFibGVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMuaW5kZXhNYW5hZ2VyLmxpc3RJbmRleGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhuKTsKKyAgICAgICAgU1NUYWJsZVdyaXRlciB3cml0ZXIgPSBuZXdXcml0ZXJCdWlsZGVyKGRlc2NyaXB0b3IpLnNldE1ldGFkYXRhQ29sbGVjdG9yKGNvbGxlY3RvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNlcmlhbGl6YXRpb25IZWFkZXIoaGVhZGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0S2V5Q291bnQoZXN0aW1hdGVkVG90YWxLZXlzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQodHhuLCBjZnMpOwogICAgICAgICBzc3RhYmxlV3JpdGVyLnN3aXRjaFdyaXRlcih3cml0ZXIpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi93cml0ZXJzL01ham9yTGV2ZWxlZENvbXBhY3Rpb25Xcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vd3JpdGVycy9NYWpvckxldmVsZWRDb21wYWN0aW9uV3JpdGVyLmphdmEKaW5kZXggYjdmYjg4MS4uMzhlMmQyZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi93cml0ZXJzL01ham9yTGV2ZWxlZENvbXBhY3Rpb25Xcml0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL3dyaXRlcnMvTWFqb3JMZXZlbGVkQ29tcGFjdGlvbldyaXRlci5qYXZhCkBAIC0yMSwxMSArMjEsMTIgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpcmVjdG9yaWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd0luZGV4RW50cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkxldmVsZWRNYW5pZmVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFJvd0luZGV4RW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVdyaXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29sbGVjdG9yOwpAQCAtMzksNyArNDAsNiBAQAogICAgIHByaXZhdGUgbG9uZyB0b3RhbFdyaXR0ZW5JbkxldmVsID0gMDsKICAgICBwcml2YXRlIGludCBzc3RhYmxlc1dyaXR0ZW4gPSAwOwogICAgIHByaXZhdGUgZmluYWwgbG9uZyBrZXlzUGVyU1NUYWJsZTsKLSAgICBwcml2YXRlIERpcmVjdG9yaWVzLkRhdGFEaXJlY3Rvcnkgc3N0YWJsZURpcmVjdG9yeTsKICAgICBwcml2YXRlIGZpbmFsIGludCBsZXZlbEZhbm91dFNpemU7CiAKICAgICBwdWJsaWMgTWFqb3JMZXZlbGVkQ29tcGFjdGlvbldyaXRlcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsCkBAIC03MCw3ICs3MCw3IEBACiAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKICAgICBwdWJsaWMgYm9vbGVhbiByZWFsQXBwZW5kKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBwYXJ0aXRpb24pCiAgICAgewotICAgICAgICBSb3dJbmRleEVudHJ5IHJpZSA9IHNzdGFibGVXcml0ZXIuYXBwZW5kKHBhcnRpdGlvbik7CisgICAgICAgIEFic3RyYWN0Um93SW5kZXhFbnRyeSByaWUgPSBzc3RhYmxlV3JpdGVyLmFwcGVuZChwYXJ0aXRpb24pOwogICAgICAgICBwYXJ0aXRpb25zV3JpdHRlbisrOwogICAgICAgICBsb25nIHRvdGFsV3JpdHRlbkluQ3VycmVudFdyaXRlciA9IHNzdGFibGVXcml0ZXIuY3VycmVudFdyaXRlcigpLmdldEVzdGltYXRlZE9uRGlza0J5dGVzV3JpdHRlbigpOwogICAgICAgICBpZiAodG90YWxXcml0dGVuSW5DdXJyZW50V3JpdGVyID4gbWF4U1NUYWJsZVNpemUpCkBAIC05MCwxOCArOTAsMjAgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzd2l0Y2hDb21wYWN0aW9uTG9jYXRpb24oRGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeSBsb2NhdGlvbikKICAgICB7Ci0gICAgICAgIHRoaXMuc3N0YWJsZURpcmVjdG9yeSA9IGxvY2F0aW9uOworICAgICAgICBzc3RhYmxlRGlyZWN0b3J5ID0gbG9jYXRpb247CiAgICAgICAgIGF2ZXJhZ2VFc3RpbWF0ZWRLZXlzUGVyU1NUYWJsZSA9IE1hdGgucm91bmQoKChkb3VibGUpIGF2ZXJhZ2VFc3RpbWF0ZWRLZXlzUGVyU1NUYWJsZSAqIHNzdGFibGVzV3JpdHRlbiArIHBhcnRpdGlvbnNXcml0dGVuKSAvIChzc3RhYmxlc1dyaXR0ZW4gKyAxKSk7Ci0gICAgICAgIHNzdGFibGVXcml0ZXIuc3dpdGNoV3JpdGVyKFNTVGFibGVXcml0ZXIuY3JlYXRlKGNmcy5uZXdTU1RhYmxlRGVzY3JpcHRvcihnZXREaXJlY3RvcmllcygpLmdldExvY2F0aW9uRm9yRGlzayhzc3RhYmxlRGlyZWN0b3J5KSksCi0gICAgICAgICAgICAgICAga2V5c1BlclNTVGFibGUsCi0gICAgICAgICAgICAgICAgbWluUmVwYWlyZWRBdCwKLSAgICAgICAgICAgICAgICBwZW5kaW5nUmVwYWlyLAotICAgICAgICAgICAgICAgIGlzVHJhbnNpZW50LAotICAgICAgICAgICAgICAgIGNmcy5tZXRhZGF0YSwKLSAgICAgICAgICAgICAgICBuZXcgTWV0YWRhdGFDb2xsZWN0b3IodHhuLm9yaWdpbmFscygpLCBjZnMubWV0YWRhdGEoKS5jb21wYXJhdG9yLCBjdXJyZW50TGV2ZWwpLAotICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIubWFrZShjZnMubWV0YWRhdGEoKSwgdHhuLm9yaWdpbmFscygpKSwKLSAgICAgICAgICAgICAgICBjZnMuaW5kZXhNYW5hZ2VyLmxpc3RJbmRleGVzKCksCi0gICAgICAgICAgICAgICAgdHhuKSk7CisKKyAgICAgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gY2ZzLm5ld1NTVGFibGVEZXNjcmlwdG9yKGdldERpcmVjdG9yaWVzKCkuZ2V0TG9jYXRpb25Gb3JEaXNrKHNzdGFibGVEaXJlY3RvcnkpKTsKKyAgICAgICAgTWV0YWRhdGFDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IE1ldGFkYXRhQ29sbGVjdG9yKHR4bi5vcmlnaW5hbHMoKSwgY2ZzLm1ldGFkYXRhKCkuY29tcGFyYXRvciwgY3VycmVudExldmVsKTsKKyAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBzZXJpYWxpemF0aW9uSGVhZGVyID0gU2VyaWFsaXphdGlvbkhlYWRlci5tYWtlKGNmcy5tZXRhZGF0YSgpLCB0eG4ub3JpZ2luYWxzKCkpOworCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCisgICAgICAgIFNTVGFibGVXcml0ZXIgd3JpdGVyID0gbmV3V3JpdGVyQnVpbGRlcihkZXNjcmlwdG9yKS5zZXRLZXlDb3VudChrZXlzUGVyU1NUYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNlcmlhbGl6YXRpb25IZWFkZXIoc2VyaWFsaXphdGlvbkhlYWRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1ldGFkYXRhQ29sbGVjdG9yKGNvbGxlY3RvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKHR4biwgY2ZzKTsKKworICAgICAgICBzc3RhYmxlV3JpdGVyLnN3aXRjaFdyaXRlcih3cml0ZXIpOwogICAgICAgICBwYXJ0aXRpb25zV3JpdHRlbiA9IDA7CiAgICAgICAgIHNzdGFibGVzV3JpdHRlbiA9IDA7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi93cml0ZXJzL01heFNTVGFibGVTaXplV3JpdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL3dyaXRlcnMvTWF4U1NUYWJsZVNpemVXcml0ZXIuamF2YQppbmRleCBkZjkxOGJjLi44MzRiZGE5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL3dyaXRlcnMvTWF4U1NUYWJsZVNpemVXcml0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL3dyaXRlcnMvTWF4U1NUYWJsZVNpemVXcml0ZXIuamF2YQpAQCAtMjEsMTEgKzIxLDEyIEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dJbmRleEVudHJ5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0Um93SW5kZXhFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlV3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb2xsZWN0b3I7CkBAIC0zNiw3ICszNyw2IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbGV2ZWw7CiAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGVzdGltYXRlZFNTVGFibGVzOwogICAgIHByaXZhdGUgZmluYWwgU2V0PFNTVGFibGVSZWFkZXI+IGFsbFNTVGFibGVzOwotICAgIHByaXZhdGUgRGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeSBzc3RhYmxlRGlyZWN0b3J5OwogCiAgICAgcHVibGljIE1heFNTVGFibGVTaXplV3JpdGVyKENvbHVtbkZhbWlseVN0b3JlIGNmcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3JpZXMgZGlyZWN0b3JpZXMsCkBAIC04MSw3ICs4MSw3IEBACiAKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFsQXBwZW5kKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBwYXJ0aXRpb24pCiAgICAgewotICAgICAgICBSb3dJbmRleEVudHJ5IHJpZSA9IHNzdGFibGVXcml0ZXIuYXBwZW5kKHBhcnRpdGlvbik7CisgICAgICAgIEFic3RyYWN0Um93SW5kZXhFbnRyeSByaWUgPSBzc3RhYmxlV3JpdGVyLmFwcGVuZChwYXJ0aXRpb24pOwogICAgICAgICBpZiAoc3N0YWJsZVdyaXRlci5jdXJyZW50V3JpdGVyKCkuZ2V0RXN0aW1hdGVkT25EaXNrQnl0ZXNXcml0dGVuKCkgPiBtYXhTU1RhYmxlU2l6ZSkKICAgICAgICAgewogICAgICAgICAgICAgc3dpdGNoQ29tcGFjdGlvbkxvY2F0aW9uKHNzdGFibGVEaXJlY3RvcnkpOwpAQCAtOTMsMTggKzkzLDE2IEBACiAgICAgcHVibGljIHZvaWQgc3dpdGNoQ29tcGFjdGlvbkxvY2F0aW9uKERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnkgbG9jYXRpb24pCiAgICAgewogICAgICAgICBzc3RhYmxlRGlyZWN0b3J5ID0gbG9jYXRpb247Ci0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCi0gICAgICAgIFNTVGFibGVXcml0ZXIgd3JpdGVyID0gU1NUYWJsZVdyaXRlci5jcmVhdGUoY2ZzLm5ld1NTVGFibGVEZXNjcmlwdG9yKGdldERpcmVjdG9yaWVzKCkuZ2V0TG9jYXRpb25Gb3JEaXNrKHNzdGFibGVEaXJlY3RvcnkpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZWRUb3RhbEtleXMgLyBlc3RpbWF0ZWRTU1RhYmxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5SZXBhaXJlZEF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdSZXBhaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUcmFuc2llbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLm1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZXRhZGF0YUNvbGxlY3RvcihhbGxTU1RhYmxlcywgY2ZzLm1ldGFkYXRhKCkuY29tcGFyYXRvciwgbGV2ZWwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIubWFrZShjZnMubWV0YWRhdGEoKSwgbm9uRXhwaXJlZFNTVGFibGVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMuaW5kZXhNYW5hZ2VyLmxpc3RJbmRleGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhuKTsKIAorICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBjZnMubmV3U1NUYWJsZURlc2NyaXB0b3IoZ2V0RGlyZWN0b3JpZXMoKS5nZXRMb2NhdGlvbkZvckRpc2soc3N0YWJsZURpcmVjdG9yeSkpOworICAgICAgICBNZXRhZGF0YUNvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgTWV0YWRhdGFDb2xsZWN0b3IoYWxsU1NUYWJsZXMsIGNmcy5tZXRhZGF0YSgpLmNvbXBhcmF0b3IsIGxldmVsKTsKKyAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIgPSBTZXJpYWxpemF0aW9uSGVhZGVyLm1ha2UoY2ZzLm1ldGFkYXRhKCksIG5vbkV4cGlyZWRTU1RhYmxlcyk7CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKKyAgICAgICAgU1NUYWJsZVdyaXRlciB3cml0ZXIgPSBuZXdXcml0ZXJCdWlsZGVyKGRlc2NyaXB0b3IpLnNldEtleUNvdW50KGVzdGltYXRlZFRvdGFsS2V5cyAvIGVzdGltYXRlZFNTVGFibGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWV0YWRhdGFDb2xsZWN0b3IoY29sbGVjdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2VyaWFsaXphdGlvbkhlYWRlcihoZWFkZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCh0eG4sIGNmcyk7CiAgICAgICAgIHNzdGFibGVXcml0ZXIuc3dpdGNoV3JpdGVyKHdyaXRlcik7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL3dyaXRlcnMvU3BsaXR0aW5nU2l6ZVRpZXJlZENvbXBhY3Rpb25Xcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vd3JpdGVycy9TcGxpdHRpbmdTaXplVGllcmVkQ29tcGFjdGlvbldyaXRlci5qYXZhCmluZGV4IDI2NGUxOWMuLjQ1OGQ4MGEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vd3JpdGVycy9TcGxpdHRpbmdTaXplVGllcmVkQ29tcGFjdGlvbldyaXRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vd3JpdGVycy9TcGxpdHRpbmdTaXplVGllcmVkQ29tcGFjdGlvbldyaXRlci5qYXZhCkBAIC0yNSwxMCArMjUsMTEgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpcmVjdG9yaWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd0luZGV4RW50cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFJvd0luZGV4RW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVdyaXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29sbGVjdG9yOwpAQCAtNDksNyArNTAsNiBAQAogICAgIHByaXZhdGUgZmluYWwgU2V0PFNTVGFibGVSZWFkZXI+IGFsbFNTVGFibGVzOwogICAgIHByaXZhdGUgbG9uZyBjdXJyZW50Qnl0ZXNUb1dyaXRlOwogICAgIHByaXZhdGUgaW50IGN1cnJlbnRSYXRpb0luZGV4ID0gMDsKLSAgICBwcml2YXRlIERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnkgbG9jYXRpb247CiAKICAgICBwdWJsaWMgU3BsaXR0aW5nU2l6ZVRpZXJlZENvbXBhY3Rpb25Xcml0ZXIoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBEaXJlY3RvcmllcyBkaXJlY3RvcmllcywgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuLCBTZXQ8U1NUYWJsZVJlYWRlcj4gbm9uRXhwaXJlZFNTVGFibGVzKQogICAgIHsKQEAgLTg2LDEyICs4NiwxMyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHJlYWxBcHBlbmQoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHBhcnRpdGlvbikKICAgICB7Ci0gICAgICAgIFJvd0luZGV4RW50cnkgcmllID0gc3N0YWJsZVdyaXRlci5hcHBlbmQocGFydGl0aW9uKTsKKyAgICAgICAgQWJzdHJhY3RSb3dJbmRleEVudHJ5IHJpZSA9IHNzdGFibGVXcml0ZXIuYXBwZW5kKHBhcnRpdGlvbik7CiAgICAgICAgIGlmIChzc3RhYmxlV3JpdGVyLmN1cnJlbnRXcml0ZXIoKS5nZXRFc3RpbWF0ZWRPbkRpc2tCeXRlc1dyaXR0ZW4oKSA+IGN1cnJlbnRCeXRlc1RvV3JpdGUgJiYgY3VycmVudFJhdGlvSW5kZXggPCByYXRpb3MubGVuZ3RoIC0gMSkgLy8gaWYgd2UgdW5kZXJlc3RpbWF0ZSBob3cgbWFueSBrZXlzIHdlIGhhdmUsIHRoZSBsYXN0IHNzdGFibGUgbWlnaHQgZ2V0IG1vcmUgdGhhbiB3ZSBleHBlY3QKICAgICAgICAgewogICAgICAgICAgICAgY3VycmVudFJhdGlvSW5kZXgrKzsKKwogICAgICAgICAgICAgY3VycmVudEJ5dGVzVG9Xcml0ZSA9IGdldEV4cGVjdGVkV3JpdGVTaXplKCk7Ci0gICAgICAgICAgICBzd2l0Y2hDb21wYWN0aW9uTG9jYXRpb24obG9jYXRpb24pOworICAgICAgICAgICAgc3dpdGNoQ29tcGFjdGlvbkxvY2F0aW9uKHNzdGFibGVEaXJlY3RvcnkpOwogICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJTd2l0Y2hpbmcgd3JpdGVyLCBjdXJyZW50Qnl0ZXNUb1dyaXRlID0ge30iLCBjdXJyZW50Qnl0ZXNUb1dyaXRlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmllICE9IG51bGw7CkBAIC0xMDAsMTkgKzEwMSwxNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHN3aXRjaENvbXBhY3Rpb25Mb2NhdGlvbihEaXJlY3Rvcmllcy5EYXRhRGlyZWN0b3J5IGxvY2F0aW9uKQogICAgIHsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOworICAgICAgICBzc3RhYmxlRGlyZWN0b3J5ID0gbG9jYXRpb247CiAgICAgICAgIGxvbmcgY3VycmVudFBhcnRpdGlvbnNUb1dyaXRlID0gTWF0aC5yb3VuZChyYXRpb3NbY3VycmVudFJhdGlvSW5kZXhdICogZXN0aW1hdGVkVG90YWxLZXlzKTsKKyAgICAgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gY2ZzLm5ld1NTVGFibGVEZXNjcmlwdG9yKGdldERpcmVjdG9yaWVzKCkuZ2V0TG9jYXRpb25Gb3JEaXNrKGxvY2F0aW9uKSk7CisgICAgICAgIE1ldGFkYXRhQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBNZXRhZGF0YUNvbGxlY3RvcihhbGxTU1RhYmxlcywgY2ZzLm1ldGFkYXRhKCkuY29tcGFyYXRvciwgMCk7CisgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyID0gU2VyaWFsaXphdGlvbkhlYWRlci5tYWtlKGNmcy5tZXRhZGF0YSgpLCBub25FeHBpcmVkU1NUYWJsZXMpOworCiAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCi0gICAgICAgIFNTVGFibGVXcml0ZXIgd3JpdGVyID0gU1NUYWJsZVdyaXRlci5jcmVhdGUoY2ZzLm5ld1NTVGFibGVEZXNjcmlwdG9yKGdldERpcmVjdG9yaWVzKCkuZ2V0TG9jYXRpb25Gb3JEaXNrKGxvY2F0aW9uKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhcnRpdGlvbnNUb1dyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblJlcGFpcmVkQXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1JlcGFpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RyYW5zaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMubWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1ldGFkYXRhQ29sbGVjdG9yKGFsbFNTVGFibGVzLCBjZnMubWV0YWRhdGEoKS5jb21wYXJhdG9yLCAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyLm1ha2UoY2ZzLm1ldGFkYXRhKCksIG5vbkV4cGlyZWRTU1RhYmxlcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLmluZGV4TWFuYWdlci5saXN0SW5kZXhlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4bik7CisgICAgICAgIFNTVGFibGVXcml0ZXIgd3JpdGVyID0gbmV3V3JpdGVyQnVpbGRlcihkZXNjcmlwdG9yKS5zZXRLZXlDb3VudChjdXJyZW50UGFydGl0aW9uc1RvV3JpdGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNZXRhZGF0YUNvbGxlY3Rvcihjb2xsZWN0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTZXJpYWxpemF0aW9uSGVhZGVyKGhlYWRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKHR4biwgY2ZzKTsKICAgICAgICAgbG9nZ2VyLnRyYWNlKCJTd2l0Y2hpbmcgd3JpdGVyLCBjdXJyZW50UGFydGl0aW9uc1RvV3JpdGUgPSB7fSIsIGN1cnJlbnRQYXJ0aXRpb25zVG9Xcml0ZSk7CiAgICAgICAgIHNzdGFibGVXcml0ZXIuc3dpdGNoV3JpdGVyKHdyaXRlcik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZmlsdGVyL0NsdXN0ZXJpbmdJbmRleEZpbHRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZmlsdGVyL0NsdXN0ZXJpbmdJbmRleEZpbHRlci5qYXZhCmluZGV4IDkyNGZmMjEuLjU2NGNhMWEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2ZpbHRlci9DbHVzdGVyaW5nSW5kZXhGaWx0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9maWx0ZXIvQ2x1c3RlcmluZ0luZGV4RmlsdGVyLmphdmEKQEAgLTIzLDcgKzIzLDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLkNhY2hlZFBhcnRpdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlBhcnRpdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKQEAgLTE0MiwxMyArMTQxLDE0IEBACiAgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBnZXRVbmZpbHRlcmVkUm93SXRlcmF0b3IoQ29sdW1uRmlsdGVyIGNvbHVtbkZpbHRlciwgUGFydGl0aW9uIHBhcnRpdGlvbik7CiAKICAgICAvKioKLSAgICAgKiBXaGV0aGVyIHRoZSBwcm92aWRlZCBzc3RhYmxlIG1heSBjb250YWluIGRhdGEgdGhhdCBpcyBzZWxlY3RlZCBieSB0aGlzIGZpbHRlciAoYmFzZWQgb24gdGhlIHNzdGFibGUgbWV0YWRhdGEpLgorICAgICAqIFdoZXRoZXIgdGhlIGRhdGEgc2VsZWN0ZWQgYnkgdGhpcyBmaWx0ZXIgaW50ZXJzZWN0cyB3aXRoIHRoZSBwcm92aWRlZCBzbGljZS4KICAgICAgKgotICAgICAqIEBwYXJhbSBzc3RhYmxlIHRoZSBzc3RhYmxlIGZvciB3aGljaCB3ZSB3YW50IHRvIHRlc3QgdGhlIG5lZWQgZm9yIGluY2x1c2lvbi4KKyAgICAgKiBAcGFyYW0gY29tcGFyYXRvciB0aGUgY29tcGFyYXRvciBvZiB0aGUgdGFibGUgdGhpcyBpZiBhIGZpbHRlciBvbi4KKyAgICAgKiBAcGFyYW0gc2xpY2UgdGhlIHNsaWNlIHRvIGNoZWNrIGludGVyc2VjdGlvbiB3aXRoLAogICAgICAqCi0gICAgICogQHJldHVybiB3aGV0aGVyIHtAY29kZSBzc3RhYmxlfSBzaG91bGQgYmUgaW5jbHVkZWQgdG8gYW5zd2VyIHRoaXMgZmlsdGVyLgorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgZGF0YSBzZWxlY3RlZCBieSB0aGlzIGZpbHRlciBpbnRlcnNlY3RzIHdpdGgge0Bjb2RlIHNsaWNlfS4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRJbmNsdWRlKFNTVGFibGVSZWFkZXIgc3N0YWJsZSk7CisgICAgcHVibGljIGJvb2xlYW4gaW50ZXJzZWN0cyhDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yLCBTbGljZSBzbGljZSk7CiAKICAgICBwdWJsaWMgS2luZCBraW5kKCk7CiAKQEAgLTE2MSw0ICsxNjEsNCBAQAogICAgICAgICBwdWJsaWMgQ2x1c3RlcmluZ0luZGV4RmlsdGVyIGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4sIGludCB2ZXJzaW9uLCBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb247CiAgICAgICAgIHB1YmxpYyBsb25nIHNlcmlhbGl6ZWRTaXplKENsdXN0ZXJpbmdJbmRleEZpbHRlciBmaWx0ZXIsIGludCB2ZXJzaW9uKTsKICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZmlsdGVyL0NsdXN0ZXJpbmdJbmRleE5hbWVzRmlsdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9maWx0ZXIvQ2x1c3RlcmluZ0luZGV4TmFtZXNGaWx0ZXIuamF2YQppbmRleCAxOGRjNDcxLi5hOThlM2JkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9maWx0ZXIvQ2x1c3RlcmluZ0luZGV4TmFtZXNGaWx0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9maWx0ZXIvQ2x1c3RlcmluZ0luZGV4TmFtZXNGaWx0ZXIuamF2YQpAQCAtMTgsNyArMTgsNiBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXI7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLio7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLk9wZXJhdG9yOwpAQCAtMjYsNyArMjUsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJhbnNmb3JtLlRyYW5zZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwpAQCAtMTQyLDE2ICsxNDAsMTEgQEAKICAgICAgICAgcmV0dXJuIHBhcnRpdGlvbi51bmZpbHRlcmVkSXRlcmF0b3IoY29sdW1uRmlsdGVyLCBjbHVzdGVyaW5nc0luUXVlcnlPcmRlciwgaXNSZXZlcnNlZCgpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRJbmNsdWRlKFNTVGFibGVSZWFkZXIgc3N0YWJsZSkKKyAgICBwdWJsaWMgYm9vbGVhbiBpbnRlcnNlY3RzKENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IsIFNsaWNlIHNsaWNlKQogICAgIHsKLSAgICAgICAgQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvciA9IHNzdGFibGUubWV0YWRhdGEoKS5jb21wYXJhdG9yOwotICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IG1pbkNsdXN0ZXJpbmdWYWx1ZXMgPSBzc3RhYmxlLmdldFNTVGFibGVNZXRhZGF0YSgpLm1pbkNsdXN0ZXJpbmdWYWx1ZXM7Ci0gICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gbWF4Q2x1c3RlcmluZ1ZhbHVlcyA9IHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkubWF4Q2x1c3RlcmluZ1ZhbHVlczsKLQotICAgICAgICAvLyBJZiBhbnkgb2YgdGhlIHJlcXVlc3RlZCBjbHVzdGVyaW5nIGlzIHdpdGhpbiB0aGUgYm91bmRzIGNvdmVyZWQgYnkgdGhlIHNzdGFibGUsIHdlIG5lZWQgdG8gaW5jbHVkZSB0aGUgc3N0YWJsZQogICAgICAgICBmb3IgKENsdXN0ZXJpbmc8Pz4gY2x1c3RlcmluZyA6IGNsdXN0ZXJpbmdzKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoU2xpY2UubWFrZShjbHVzdGVyaW5nKS5pbnRlcnNlY3RzKGNvbXBhcmF0b3IsIG1pbkNsdXN0ZXJpbmdWYWx1ZXMsIG1heENsdXN0ZXJpbmdWYWx1ZXMpKQorICAgICAgICAgICAgaWYgKHNsaWNlLmluY2x1ZGVzKGNvbXBhcmF0b3IsIGNsdXN0ZXJpbmcpKQogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTIyNiw3ICsyMTksNyBAQAogICAgIHByb3RlY3RlZCB2b2lkIHNlcmlhbGl6ZUludGVybmFsKERhdGFPdXRwdXRQbHVzIG91dCwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvciA9IChDbHVzdGVyaW5nQ29tcGFyYXRvciljbHVzdGVyaW5ncy5jb21wYXJhdG9yKCk7Ci0gICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChjbHVzdGVyaW5ncy5zaXplKCkpOworICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihjbHVzdGVyaW5ncy5zaXplKCkpOwogICAgICAgICBmb3IgKENsdXN0ZXJpbmc8Pz4gY2x1c3RlcmluZyA6IGNsdXN0ZXJpbmdzKQogICAgICAgICAgICAgQ2x1c3RlcmluZy5zZXJpYWxpemVyLnNlcmlhbGl6ZShjbHVzdGVyaW5nLCBvdXQsIHZlcnNpb24sIGNvbXBhcmF0b3Iuc3VidHlwZXMoKSk7CiAgICAgfQpAQCAtMjQ1LDcgKzIzOCw3IEBACiAgICAgICAgIHB1YmxpYyBDbHVzdGVyaW5nSW5kZXhGaWx0ZXIgZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbiwgaW50IHZlcnNpb24sIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsIGJvb2xlYW4gcmV2ZXJzZWQpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbWV0YWRhdGEuY29tcGFyYXRvcjsKLSAgICAgICAgICAgIGludCBzaXplID0gKGludClpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogICAgICAgICAgICAgdHJ5IChCVHJlZS5GYXN0QnVpbGRlcjxDbHVzdGVyaW5nPD8+PiBidWlsZGVyID0gQlRyZWUuZmFzdEJ1aWxkZXIoKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKQEAgLTI1NSw0ICsyNDgsNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2ZpbHRlci9DbHVzdGVyaW5nSW5kZXhTbGljZUZpbHRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZmlsdGVyL0NsdXN0ZXJpbmdJbmRleFNsaWNlRmlsdGVyLmphdmEKaW5kZXggMTc4Yzk2Yi4uNjdhZWViNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZmlsdGVyL0NsdXN0ZXJpbmdJbmRleFNsaWNlRmlsdGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZmlsdGVyL0NsdXN0ZXJpbmdJbmRleFNsaWNlRmlsdGVyLmphdmEKQEAgLTE4LDE4ICsxOCwxNSBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXI7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLkNhY2hlZFBhcnRpdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlBhcnRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJhbnNmb3JtLlRyYW5zZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiAKIC8qKgogICogQSBmaWx0ZXIgb3ZlciBhIHNpbmdsZSBwYXJ0aXRpb24uCkBAIC0xMjYsMTUgKzEyMyw5IEBACiAgICAgICAgIHJldHVybiBwYXJ0aXRpb24udW5maWx0ZXJlZEl0ZXJhdG9yKGNvbHVtbkZpbHRlciwgc2xpY2VzLCByZXZlcnNlZCk7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gc2hvdWxkSW5jbHVkZShTU1RhYmxlUmVhZGVyIHNzdGFibGUpCisgICAgcHVibGljIGJvb2xlYW4gaW50ZXJzZWN0cyhDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yLCBTbGljZSBzbGljZSkKICAgICB7Ci0gICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gbWluQ2x1c3RlcmluZ1ZhbHVlcyA9IHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkubWluQ2x1c3RlcmluZ1ZhbHVlczsKLSAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBtYXhDbHVzdGVyaW5nVmFsdWVzID0gc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5tYXhDbHVzdGVyaW5nVmFsdWVzOwotCi0gICAgICAgIGlmIChtaW5DbHVzdGVyaW5nVmFsdWVzLmlzRW1wdHkoKSB8fCBtYXhDbHVzdGVyaW5nVmFsdWVzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIHJldHVybiBzbGljZXMuaW50ZXJzZWN0cyhtaW5DbHVzdGVyaW5nVmFsdWVzLCBtYXhDbHVzdGVyaW5nVmFsdWVzKTsKKyAgICAgICAgcmV0dXJuIHNsaWNlcy5pbnRlcnNlY3RzKHNsaWNlKTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEpCkBAIC0xNzYsNCArMTY3LDQgQEAKICAgICAgICAgICAgIHJldHVybiBuZXcgQ2x1c3RlcmluZ0luZGV4U2xpY2VGaWx0ZXIoc2xpY2VzLCByZXZlcnNlZCk7CiAgICAgICAgIH0KICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZmlsdGVyL0NvbHVtbkZpbHRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZmlsdGVyL0NvbHVtbkZpbHRlci5qYXZhCmluZGV4IDBlZDYyMzcuLjQ4YmE3MzggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2ZpbHRlci9Db2x1bW5GaWx0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9maWx0ZXIvQ29sdW1uRmlsdGVyLmphdmEKQEAgLTk4OCw3ICs5ODgsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoc3ViU2VsZWN0aW9ucyAhPSBudWxsKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChzdWJTZWxlY3Rpb25zLnNpemUoKSk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoc3ViU2VsZWN0aW9ucy5zaXplKCkpOwogICAgICAgICAgICAgICAgIGZvciAoQ29sdW1uU3Vic2VsZWN0aW9uIHN1YlNlbCA6IHN1YlNlbGVjdGlvbnMudmFsdWVzKCkpCiAgICAgICAgICAgICAgICAgICAgIENvbHVtblN1YnNlbGVjdGlvbi5zZXJpYWxpemVyLnNlcmlhbGl6ZShzdWJTZWwsIG91dCwgdmVyc2lvbik7CiAgICAgICAgICAgICB9CkBAIC0xMDc4LDcgKzEwNzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIFNvcnRlZFNldE11bHRpbWFwPENvbHVtbklkZW50aWZpZXIsIENvbHVtblN1YnNlbGVjdGlvbj4gc3ViU2VsZWN0aW9ucyA9IFRyZWVNdWx0aW1hcC5jcmVhdGUoQ29tcGFyYXRvci5uYXR1cmFsT3JkZXIoKSwgQ29tcGFyYXRvci5uYXR1cmFsT3JkZXIoKSk7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IChpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgIGludCBzaXplID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBDb2x1bW5TdWJzZWxlY3Rpb24gc3ViU2VsID0gQ29sdW1uU3Vic2VsZWN0aW9uLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIHZlcnNpb24sIG1ldGFkYXRhKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2ZpbHRlci9EYXRhTGltaXRzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9maWx0ZXIvRGF0YUxpbWl0cy5qYXZhCmluZGV4IGY5ODhjYjMuLjY0OWRmMjIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2ZpbHRlci9EYXRhTGltaXRzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZmlsdGVyL0RhdGFMaW1pdHMuamF2YQpAQCAtMTE0NCwyMiArMTE0NCwyMiBAQAogICAgICAgICAgICAgICAgIGNhc2UgQ1FMX0xJTUlUOgogICAgICAgICAgICAgICAgIGNhc2UgQ1FMX1BBR0lOR19MSU1JVDoKICAgICAgICAgICAgICAgICAgICAgQ1FMTGltaXRzIGNxbExpbWl0cyA9IChDUUxMaW1pdHMpbGltaXRzOwotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoY3FsTGltaXRzLnJvd0xpbWl0KTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGNxbExpbWl0cy5wZXJQYXJ0aXRpb25MaW1pdCk7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGNxbExpbWl0cy5yb3dMaW1pdCk7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGNxbExpbWl0cy5wZXJQYXJ0aXRpb25MaW1pdCk7CiAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oY3FsTGltaXRzLmlzRGlzdGluY3QpOwogICAgICAgICAgICAgICAgICAgICBpZiAobGltaXRzLmtpbmQoKSA9PSBLaW5kLkNRTF9QQUdJTkdfTElNSVQpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIENRTFBhZ2luZ0xpbWl0cyBwYWdpbmdMaW1pdHMgPSAoQ1FMUGFnaW5nTGltaXRzKWNxbExpbWl0czsKICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLndyaXRlV2l0aFZJbnRMZW5ndGgocGFnaW5nTGltaXRzLmxhc3RSZXR1cm5lZEtleSwgb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChwYWdpbmdMaW1pdHMubGFzdFJldHVybmVkS2V5UmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKHBhZ2luZ0xpbWl0cy5sYXN0UmV0dXJuZWRLZXlSZW1haW5pbmcpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgQ1FMX0dST1VQX0JZX0xJTUlUOgogICAgICAgICAgICAgICAgIGNhc2UgQ1FMX0dST1VQX0JZX1BBR0lOR19MSU1JVDoKICAgICAgICAgICAgICAgICAgICAgQ1FMR3JvdXBCeUxpbWl0cyBncm91cEJ5TGltaXRzID0gKENRTEdyb3VwQnlMaW1pdHMpIGxpbWl0czsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGdyb3VwQnlMaW1pdHMuZ3JvdXBMaW1pdCk7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChncm91cEJ5TGltaXRzLmdyb3VwUGVyUGFydGl0aW9uTGltaXQpOwotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoZ3JvdXBCeUxpbWl0cy5yb3dMaW1pdCk7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGdyb3VwQnlMaW1pdHMuZ3JvdXBMaW1pdCk7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGdyb3VwQnlMaW1pdHMuZ3JvdXBQZXJQYXJ0aXRpb25MaW1pdCk7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGdyb3VwQnlMaW1pdHMucm93TGltaXQpOwogCiAgICAgICAgICAgICAgICAgICAgIEFnZ3JlZ2F0aW9uU3BlY2lmaWNhdGlvbiBncm91cEJ5U3BlYyA9IGdyb3VwQnlMaW1pdHMuZ3JvdXBCeVNwZWM7CiAgICAgICAgICAgICAgICAgICAgIEFnZ3JlZ2F0aW9uU3BlY2lmaWNhdGlvbi5zZXJpYWxpemVyLnNlcmlhbGl6ZShncm91cEJ5U3BlYywgb3V0LCB2ZXJzaW9uKTsKQEAgLTExNzAsNyArMTE3MCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIENRTEdyb3VwQnlQYWdpbmdMaW1pdHMgcGFnaW5nTGltaXRzID0gKENRTEdyb3VwQnlQYWdpbmdMaW1pdHMpIGdyb3VwQnlMaW1pdHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC53cml0ZVdpdGhWSW50TGVuZ3RoKHBhZ2luZ0xpbWl0cy5sYXN0UmV0dXJuZWRLZXksIG91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQocGFnaW5nTGltaXRzLmxhc3RSZXR1cm5lZEtleVJlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihwYWdpbmdMaW1pdHMubGFzdFJldHVybmVkS2V5UmVtYWluaW5nKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTE4NCwyMSArMTE4NCwyMSBAQAogICAgICAgICAgICAgICAgIGNhc2UgQ1FMX0xJTUlUOgogICAgICAgICAgICAgICAgIGNhc2UgQ1FMX1BBR0lOR19MSU1JVDoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByb3dMaW1pdCA9IChpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHBlclBhcnRpdGlvbkxpbWl0ID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgICAgICAgICBpbnQgcm93TGltaXQgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHBlclBhcnRpdGlvbkxpbWl0ID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNEaXN0aW5jdCA9IGluLnJlYWRCb29sZWFuKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID09IEtpbmQuQ1FMX0xJTUlUKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNxbExpbWl0cyhyb3dMaW1pdCwgcGVyUGFydGl0aW9uTGltaXQsIGlzRGlzdGluY3QpOwogICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGxhc3RLZXkgPSBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFZJbnRMZW5ndGgoaW4pOwotICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdFJlbWFpbmluZyA9IChpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxhc3RSZW1haW5pbmcgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDUUxQYWdpbmdMaW1pdHMocm93TGltaXQsIHBlclBhcnRpdGlvbkxpbWl0LCBpc0Rpc3RpbmN0LCBsYXN0S2V5LCBsYXN0UmVtYWluaW5nKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBDUUxfR1JPVVBfQllfTElNSVQ6CiAgICAgICAgICAgICAgICAgY2FzZSBDUUxfR1JPVVBfQllfUEFHSU5HX0xJTUlUOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGdyb3VwTGltaXQgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBncm91cFBlclBhcnRpdGlvbkxpbWl0ID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcm93TGltaXQgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICAgICAgICAgIGludCBncm91cExpbWl0ID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CisgICAgICAgICAgICAgICAgICAgIGludCBncm91cFBlclBhcnRpdGlvbkxpbWl0ID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CisgICAgICAgICAgICAgICAgICAgIGludCByb3dMaW1pdCA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogCiAgICAgICAgICAgICAgICAgICAgIEFnZ3JlZ2F0aW9uU3BlY2lmaWNhdGlvbiBncm91cEJ5U3BlYyA9IEFnZ3JlZ2F0aW9uU3BlY2lmaWNhdGlvbi5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCB2ZXJzaW9uLCBtZXRhZGF0YSk7CiAKQEAgLTEyMTIsNyArMTIxMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpOwogCiAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgbGFzdEtleSA9IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoVkludExlbmd0aChpbik7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsYXN0UmVtYWluaW5nID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdFJlbWFpbmluZyA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENRTEdyb3VwQnlQYWdpbmdMaW1pdHMoZ3JvdXBMaW1pdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwUGVyUGFydGl0aW9uTGltaXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dMaW1pdCwKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2ZpbHRlci9Sb3dGaWx0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2ZpbHRlci9Sb3dGaWx0ZXIuamF2YQppbmRleCA1ZTBmYjUxLi42ZDcxNzAxIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9maWx0ZXIvUm93RmlsdGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZmlsdGVyL1Jvd0ZpbHRlci5qYXZhCkBAIC0xMDM4LDcgKzEwMzgsNyBAQAogICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoUm93RmlsdGVyIGZpbHRlciwgRGF0YU91dHB1dFBsdXMgb3V0LCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oZmFsc2UpOyAvLyBPbGQgImlzIGZvciB0aHJpZnQiIGJvb2xlYW4KLSAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChmaWx0ZXIuZXhwcmVzc2lvbnMuc2l6ZSgpKTsKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGZpbHRlci5leHByZXNzaW9ucy5zaXplKCkpOwogICAgICAgICAgICAgZm9yIChFeHByZXNzaW9uIGV4cHIgOiBmaWx0ZXIuZXhwcmVzc2lvbnMpCiAgICAgICAgICAgICAgICAgRXhwcmVzc2lvbi5zZXJpYWxpemVyLnNlcmlhbGl6ZShleHByLCBvdXQsIHZlcnNpb24pOwogCkBAIC0xMDQ3LDcgKzEwNDcsNyBAQAogICAgICAgICBwdWJsaWMgUm93RmlsdGVyIGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4sIGludCB2ZXJzaW9uLCBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgaW4ucmVhZEJvb2xlYW4oKTsgLy8gVW51c2VkCi0gICAgICAgICAgICBpbnQgc2l6ZSA9IChpbnQpaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgaW50IHNpemUgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKICAgICAgICAgICAgIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPSBuZXcgQXJyYXlMaXN0PD4oc2l6ZSk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKICAgICAgICAgICAgICAgICBleHByZXNzaW9ucy5hZGQoRXhwcmVzc2lvbi5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCB2ZXJzaW9uLCBtZXRhZGF0YSkpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZmlsdGVyL1Jvd0luZGV4RW50cnlSZWFkU2l6ZVRvb0xhcmdlRXhjZXB0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9maWx0ZXIvUm93SW5kZXhFbnRyeVJlYWRTaXplVG9vTGFyZ2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBmM2Y4Zi4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9maWx0ZXIvUm93SW5kZXhFbnRyeVJlYWRTaXplVG9vTGFyZ2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVqZWN0RXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgUm93SW5kZXhFbnRyeVJlYWRTaXplVG9vTGFyZ2VFeGNlcHRpb24gZXh0ZW5kcyBSZWplY3RFeGNlcHRpb24KLXsKLSAgICBwdWJsaWMgUm93SW5kZXhFbnRyeVJlYWRTaXplVG9vTGFyZ2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpCi0gICAgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0Rpc2FibGVGbGFnLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0Rpc2FibGVGbGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYzE5NTEuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9EaXNhYmxlRmxhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DbGllbnRTdGF0ZTsKLQotLyoqCi0gKiBBIGd1YXJkcmFpbCB0aGF0IGNvbXBsZXRlbHkgZGlzYWJsZXMgdGhlIHVzZSBvZiBhIHBhcnRpY3VsYXIgZmVhdHVyZS4KLSAqCi0gKiA8cD5Ob3RlIHRoYXQgdGhpcyBndWFyZHJhaWwgb25seSBhYm9ydHMgb3BlcmF0aW9ucyAoaWYgdGhlIGZlYXR1cmUgaXMgZGlzYWJsZWQpIHNvIGlzIG9ubHkgbWVhbnQgZm9yCi0gKiBxdWVyeS1iYXNlZCBndWFyZHJhaWxzICh3ZSdyZSBoYXBweSB0byByZWplY3QgcXVlcmllcyBkZWVtZWQgZGFuZ2Vyb3VzLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBjcmVhdGUgYSBndWFyZHJhaWwKLSAqIHRoYXQgYnJlYWtzIGNvbXBhY3Rpb24gZm9yIGluc3RhbmNlKS4KLSAqLwotcHVibGljIGNsYXNzIERpc2FibGVGbGFnIGV4dGVuZHMgR3VhcmRyYWlsCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBQcmVkaWNhdGU8Q2xpZW50U3RhdGU+IGRpc2FibGVkOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHdoYXQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBEaXNhYmxlRmxhZ30gZ3VhcmRyYWlsLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgICAgIHRoZSBpZGVudGlmeWluZyBuYW1lIG9mIHRoZSBndWFyZHJhaWwKLSAgICAgKiBAcGFyYW0gZGlzYWJsZWQgYSB7QGxpbmsgQ2xpZW50U3RhdGV9LWJhc2VkIHN1cHBsaWVyIG9mIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmZWF0dXJlIGd1YXJkZWQgYnkgdGhpcwotICAgICAqICAgICAgICAgICAgICAgICBndWFyZHJhaWwgbXVzdCBiZSBkaXNhYmxlZC4KLSAgICAgKiBAcGFyYW0gd2hhdCAgICAgVGhlIGZlYXR1cmUgdGhhdCBpcyBndWFyZGVkIGJ5IHRoaXMgZ3VhcmRyYWlsIChmb3IgcmVwb3J0aW5nIGluIGVycm9yIG1lc3NhZ2VzKSwKLSAgICAgKiAgICAgICAgICAgICAgICAge0BsaW5rIERpc2FibGVGbGFnI2Vuc3VyZUVuYWJsZWQoU3RyaW5nLCBDbGllbnRTdGF0ZSl9IGNhbiBzcGVjaWZ5IGEgZGlmZmVyZW50IHtAY29kZSB3aGF0fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGlzYWJsZUZsYWcoU3RyaW5nIG5hbWUsIFByZWRpY2F0ZTxDbGllbnRTdGF0ZT4gZGlzYWJsZWQsIFN0cmluZyB3aGF0KQotICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDsKLSAgICAgICAgdGhpcy53aGF0ID0gd2hhdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBYm9ydHMgdGhlIG9wZXJhdGlvbiBpZiB0aGlzIGd1YXJkcmFpbCBpcyBkaXNhYmxlZC4KLSAgICAgKgotICAgICAqIDxwPlRoaXMgbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgZmVhdHVyZSBndWFyZGVkIGJ5IHRoaXMgZ3VhcmRyYWlsIGlzIHVzZWQgdG8gZW5zdXJlIHN1Y2ggdXNlIGlzIGluIGZhY3QKLSAgICAgKiBhbGxvd2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0YXRlIFRoZSBjbGllbnQgc3RhdGUsIHVzZWQgdG8gc2tpcCB0aGUgY2hlY2sgaWYgdGhlIHF1ZXJ5IGlzIGludGVybmFsIG9yIGlzIGRvbmUgYnkgYSBzdXBlcnVzZXIuCi0gICAgICogICAgICAgICAgICAgIEEge0Bjb2RlIG51bGx9IHZhbHVlIG1lYW5zIHRoYXQgdGhlIGNoZWNrIHNob3VsZCBiZSBkb25lIHJlZ2FyZGxlc3Mgb2YgdGhlIHF1ZXJ5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuc3VyZUVuYWJsZWQoQE51bGxhYmxlIENsaWVudFN0YXRlIHN0YXRlKQotICAgIHsKLSAgICAgICAgZW5zdXJlRW5hYmxlZCh3aGF0LCBzdGF0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWJvcnRzIHRoZSBvcGVyYXRpb24gaWYgdGhpcyBndWFyZHJhaWwgaXMgZGlzYWJsZWQuCi0gICAgICoKLSAgICAgKiA8cD5UaGlzIG11c3QgYmUgY2FsbGVkIHdoZW4gdGhlIGZlYXR1cmUgZ3VhcmRlZCBieSB0aGlzIGd1YXJkcmFpbCBpcyB1c2VkIHRvIGVuc3VyZSBzdWNoIHVzZSBpcyBpbiBmYWN0Ci0gICAgICogYWxsb3dlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3aGF0ICBUaGUgZmVhdHVyZSB0aGF0IGlzIGd1YXJkZWQgYnkgdGhpcyBndWFyZHJhaWwgKGZvciByZXBvcnRpbmcgaW4gZXJyb3IgbWVzc2FnZXMpLgotICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgY2xpZW50IHN0YXRlLCB1c2VkIHRvIHNraXAgdGhlIGNoZWNrIGlmIHRoZSBxdWVyeSBpcyBpbnRlcm5hbCBvciBpcyBkb25lIGJ5IGEgc3VwZXJ1c2VyLgotICAgICAqICAgICAgICAgICAgICBBIHtAY29kZSBudWxsfSB2YWx1ZSBtZWFucyB0aGF0IHRoZSBjaGVjayBzaG91bGQgYmUgZG9uZSByZWdhcmRsZXNzIG9mIHRoZSBxdWVyeSwgYWx0aG91Z2ggaXQgd29uJ3QKLSAgICAgKiAgICAgICAgICAgICAgdGhyb3cgYW55IGV4Y2VwdGlvbiBpZiB0aGUgZmFpbHVyZSB0aHJlc2hvbGQgaXMgZXhjZWVkZWQuIFRoaXMgaXMgc28gYmVjYXVzZSBjaGVja3Mgd2l0aG91dCBhbgotICAgICAqICAgICAgICAgICAgICBhc3NvY2lhdGVkIGNsaWVudCBjb21lIGZyb20gYXN5bmNocm9ub3VzIHByb2Nlc3NlcyBzdWNoIGFzIGNvbXBhY3Rpb24sIGFuZCB3ZSBkb24ndCB3YW50IHRvCi0gICAgICogICAgICAgICAgICAgIGludGVycnVwdCBzdWNoIHByb2Nlc3Nlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbnN1cmVFbmFibGVkKFN0cmluZyB3aGF0LCBATnVsbGFibGUgQ2xpZW50U3RhdGUgc3RhdGUpCi0gICAgewotICAgICAgICBpZiAoZW5hYmxlZChzdGF0ZSkgJiYgZGlzYWJsZWQudGVzdChzdGF0ZSkpCi0gICAgICAgICAgICBmYWlsKHdoYXQgKyAiIGlzIG5vdCBhbGxvd2VkIiwgc3RhdGUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvRW5hYmxlRmxhZy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9FbmFibGVGbGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRlMDliZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvRW5hYmxlRmxhZy5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNsaWVudFN0YXRlOworCisvKioKKyAqIEEgZ3VhcmRyYWlsIHRoYXQgZW5hYmxlcyB0aGUgdXNlIG9mIGEgcGFydGljdWxhciBmZWF0dXJlLgorICoKKyAqIDxwPk5vdGUgdGhhdCB0aGlzIGd1YXJkcmFpbCBvbmx5IGFib3J0cyBvcGVyYXRpb25zIChpZiB0aGUgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCkgc28gaXMgb25seSBtZWFudCBmb3IgcXVlcnktYmFzZWQKKyAqIGd1YXJkcmFpbHMgKHdlJ3JlIGhhcHB5IHRvIHJlamVjdCBxdWVyaWVzIGRlZW1lZCBkYW5nZXJvdXMsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGNyZWF0ZSBhIGd1YXJkcmFpbCB0aGF0IGJyZWFrcworICogY29tcGFjdGlvbiBmb3IgaW5zdGFuY2UpLgorICovCitwdWJsaWMgY2xhc3MgRW5hYmxlRmxhZyBleHRlbmRzIEd1YXJkcmFpbAoreworICAgIHByaXZhdGUgZmluYWwgUHJlZGljYXRlPENsaWVudFN0YXRlPiB3YXJuZWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBQcmVkaWNhdGU8Q2xpZW50U3RhdGU+IGVuYWJsZWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmVhdHVyZU5hbWU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBFbmFibGVGbGFnfSBndWFyZHJhaWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSAgICAgICAgdGhlIGlkZW50aWZ5aW5nIG5hbWUgb2YgdGhlIGd1YXJkcmFpbAorICAgICAqIEBwYXJhbSByZWFzb24gICAgICB0aGUgb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiBmb3IgZ3VhcmRpbmcgdGhlIG9wZXJhdGlvbgorICAgICAqIEBwYXJhbSBlbmFibGVkICAgICBhIHtAbGluayBDbGllbnRTdGF0ZX0tYmFzZWQgc3VwcGxpZXIgb2YgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZlYXR1cmUgZ3VhcmRlZCBieSB0aGlzCisgICAgICogICAgICAgICAgICAgICAgICAgIGd1YXJkcmFpbCBpcyBlbmFibGVkLgorICAgICAqIEBwYXJhbSBmZWF0dXJlTmFtZSBUaGUgZmVhdHVyZSB0aGF0IGlzIGd1YXJkZWQgYnkgdGhpcyBndWFyZHJhaWwgKGZvciByZXBvcnRpbmcgaW4gZXJyb3IgbWVzc2FnZXMpLCB7QGxpbmsKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgRW5hYmxlRmxhZyNlbnN1cmVFbmFibGVkKFN0cmluZywgQ2xpZW50U3RhdGUpfSBjYW4gc3BlY2lmeSBhIGRpZmZlcmVudCB7QGNvZGUgZmVhdHVyZU5hbWV9LgorICAgICAqLworICAgIHB1YmxpYyBFbmFibGVGbGFnKFN0cmluZyBuYW1lLCBATnVsbGFibGUgU3RyaW5nIHJlYXNvbiwgUHJlZGljYXRlPENsaWVudFN0YXRlPiBlbmFibGVkLCBTdHJpbmcgZmVhdHVyZU5hbWUpCisgICAgeworICAgICAgICB0aGlzKG5hbWUsIHJlYXNvbiwgKHN0YXRlKSAtPiBmYWxzZSwgZW5hYmxlZCwgZmVhdHVyZU5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEVuYWJsZUZsYWd9IGd1YXJkcmFpbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lICAgICAgICB0aGUgaWRlbnRpZnlpbmcgbmFtZSBvZiB0aGUgZ3VhcmRyYWlsCisgICAgICogQHBhcmFtIHJlYXNvbiAgICAgIHRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgcmVhc29uIGZvciBndWFyZGluZyB0aGUgb3BlcmF0aW9uCisgICAgICogQHBhcmFtIHdhcm5lZCAgICAgIGEge0BsaW5rIENsaWVudFN0YXRlfS1iYXNlZCBzdXBwbGllciBvZiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB3YXJuaW5nIHNob3VsZCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICBlbWl0dGVkIGV2ZW4gZ3VhcmRyYWlsIGFzIHN1Y2ggaGFzIHBhc3NlZC4gSWYgZ3VhcmRyYWlsIGZhaWxzLCB0aGUgd2FybmluZyB3aWxsIG5vdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICBlbWl0dGVkLiBUaGlzIG1pZ2h0IGJlIHVzZWQgZm9yIGNhc2VzIHdoZW4gd2Ugd2FudCB0byB3YXJuIGEgdXNlciByZWdhcmRsZXNzIG9mIHN1Y2Nlc3NmdWwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgZ3VhcmRyYWlsIGV4ZWN1dGlvbi4KKyAgICAgKiBAcGFyYW0gZW5hYmxlZCAgICAgYSB7QGxpbmsgQ2xpZW50U3RhdGV9LWJhc2VkIHN1cHBsaWVyIG9mIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmZWF0dXJlIGd1YXJkZWQgYnkgdGhpcworICAgICAqICAgICAgICAgICAgICAgICAgICBndWFyZHJhaWwgaXMgZW5hYmxlZC4KKyAgICAgKiBAcGFyYW0gZmVhdHVyZU5hbWUgVGhlIGZlYXR1cmUgdGhhdCBpcyBndWFyZGVkIGJ5IHRoaXMgZ3VhcmRyYWlsIChmb3IgcmVwb3J0aW5nIGluIGVycm9yIG1lc3NhZ2VzKSwge0BsaW5rCisgICAgICogICAgICAgICAgICAgICAgICAgIEVuYWJsZUZsYWcjZW5zdXJlRW5hYmxlZChTdHJpbmcsIENsaWVudFN0YXRlKX0gY2FuIHNwZWNpZnkgYSBkaWZmZXJlbnQge0Bjb2RlIGZlYXR1cmVOYW1lfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW5hYmxlRmxhZyhTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgU3RyaW5nIHJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICBQcmVkaWNhdGU8Q2xpZW50U3RhdGU+IHdhcm5lZCwKKyAgICAgICAgICAgICAgICAgICAgICBQcmVkaWNhdGU8Q2xpZW50U3RhdGU+IGVuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZlYXR1cmVOYW1lKQorICAgIHsKKyAgICAgICAgc3VwZXIobmFtZSwgcmVhc29uKTsKKyAgICAgICAgdGhpcy53YXJuZWQgPSB3YXJuZWQ7CisgICAgICAgIHRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgICAgIHRoaXMuZmVhdHVyZU5hbWUgPSBmZWF0dXJlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGd1YXJkZWQgZmVhdHVyZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgY2xpZW50IHN0YXRlLCB1c2VkIHRvIHNraXAgdGhlIGNoZWNrIGlmIHRoZSBxdWVyeSBpcyBpbnRlcm5hbCBvciBpcyBkb25lIGJ5IGEgc3VwZXJ1c2VyLgorICAgICAqICAgICAgICAgICAgICBBIHtAY29kZSBudWxsfSB2YWx1ZSBtZWFucyB0aGF0IHRoZSBjaGVjayBzaG91bGQgYmUgZG9uZSByZWdhcmRsZXNzIG9mIHRoZSBxdWVyeS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpcyB0aGUgZmVhdHVyZSBpcyBlbmFibGVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoQE51bGxhYmxlIENsaWVudFN0YXRlIHN0YXRlKQorICAgIHsKKyAgICAgICAgcmV0dXJuICFlbmFibGVkKHN0YXRlKSB8fCBlbmFibGVkLnRlc3Qoc3RhdGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFib3J0cyB0aGUgb3BlcmF0aW9uIGlmIHRoaXMgZ3VhcmRyYWlsIGlzIG5vdCBlbmFibGVkLgorICAgICAqCisgICAgICogPHA+VGhpcyBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBmZWF0dXJlIGd1YXJkZWQgYnkgdGhpcyBndWFyZHJhaWwgaXMgdXNlZCB0byBlbnN1cmUgc3VjaCB1c2UgaXMgaW4gZmFjdAorICAgICAqIGFsbG93ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIGNsaWVudCBzdGF0ZSwgdXNlZCB0byBza2lwIHRoZSBjaGVjayBpZiB0aGUgcXVlcnkgaXMgaW50ZXJuYWwgb3IgaXMgZG9uZSBieSBhIHN1cGVydXNlci4KKyAgICAgKiAgICAgICAgICAgICAgQSB7QGNvZGUgbnVsbH0gdmFsdWUgbWVhbnMgdGhhdCB0aGUgY2hlY2sgc2hvdWxkIGJlIGRvbmUgcmVnYXJkbGVzcyBvZiB0aGUgcXVlcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5zdXJlRW5hYmxlZChATnVsbGFibGUgQ2xpZW50U3RhdGUgc3RhdGUpCisgICAgeworICAgICAgICBlbnN1cmVFbmFibGVkKGZlYXR1cmVOYW1lLCBzdGF0ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWJvcnRzIHRoZSBvcGVyYXRpb24gaWYgdGhpcyBndWFyZHJhaWwgaXMgbm90IGVuYWJsZWQuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG11c3QgYmUgY2FsbGVkIHdoZW4gdGhlIGZlYXR1cmUgZ3VhcmRlZCBieSB0aGlzIGd1YXJkcmFpbCBpcyB1c2VkIHRvIGVuc3VyZSBzdWNoIHVzZSBpcyBpbiBmYWN0CisgICAgICogYWxsb3dlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmZWF0dXJlTmFtZSBUaGUgZmVhdHVyZSB0aGF0IGlzIGd1YXJkZWQgYnkgdGhpcyBndWFyZHJhaWwgKGZvciByZXBvcnRpbmcgaW4gZXJyb3IgbWVzc2FnZXMpLgorICAgICAqIEBwYXJhbSBzdGF0ZSAgICAgICBUaGUgY2xpZW50IHN0YXRlLCB1c2VkIHRvIHNraXAgdGhlIGNoZWNrIGlmIHRoZSBxdWVyeSBpcyBpbnRlcm5hbCBvciBpcyBkb25lIGJ5IGEgc3VwZXJ1c2VyLiBBCisgICAgICogICAgICAgICAgICAgICAgICAgIHtAY29kZSBudWxsfSB2YWx1ZSBtZWFucyB0aGF0IHRoZSBjaGVjayBzaG91bGQgYmUgZG9uZSByZWdhcmRsZXNzIG9mIHRoZSBxdWVyeSwgYWx0aG91Z2ggaXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgd29uJ3QgdGhyb3cgYW55IGV4Y2VwdGlvbiBpZiB0aGUgZmFpbHVyZSB0aHJlc2hvbGQgaXMgZXhjZWVkZWQuIFRoaXMgaXMgc28gYmVjYXVzZSBjaGVja3MKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgd2l0aG91dCBhbiBhc3NvY2lhdGVkIGNsaWVudCBjb21lIGZyb20gYXN5bmNocm9ub3VzIHByb2Nlc3NlcyBzdWNoIGFzIGNvbXBhY3Rpb24sIGFuZCB3ZSBkb24ndAorICAgICAqICAgICAgICAgICAgICAgICAgICB3YW50IHRvIGludGVycnVwdCBzdWNoIHByb2Nlc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbnN1cmVFbmFibGVkKFN0cmluZyBmZWF0dXJlTmFtZSwgQE51bGxhYmxlIENsaWVudFN0YXRlIHN0YXRlKQorICAgIHsKKyAgICAgICAgaWYgKCFlbmFibGVkKHN0YXRlKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoIWVuYWJsZWQudGVzdChzdGF0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZhaWwoZmVhdHVyZU5hbWUgKyAiIGlzIG5vdCBhbGxvd2VkIiwgc3RhdGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdhcm5lZC50ZXN0KHN0YXRlKSkKKyAgICAgICAgICAgIHdhcm4oZmVhdHVyZU5hbWUgKyAiIGlzIG5vdCByZWNvbW1lbmRlZCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbC5qYXZhCmluZGV4IGMwNThmMTAuLmZiZDFhNWIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWwuamF2YQpAQCAtNTEsNiArNTEsMTAgQEAKICAgICAvKiogQSBuYW1lIGlkZW50aWZ5aW5nIHRoZSBndWFyZHJhaWwgKG1haW5seSBmb3Igc2hpcHBpbmcgd2l0aCBkaWFnbm9zdGljIGV2ZW50cykuICovCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBuYW1lOwogCisgICAgLyoqIEFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSByZWFzb24gZm9yIGd1YXJkaW5nIHRoZSBvcGVyYXRpb24uICovCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIGZpbmFsIFN0cmluZyByZWFzb247CisKICAgICAvKiogTWluaW11bSBsb2dnaW5nIGFuZCB0cmlnZ2VyaW5nIGludGVydmFsIHRvIGF2b2lkIHNwYW1taW5nIGRvd25zdHJlYW0uICovCiAgICAgcHJpdmF0ZSBsb25nIG1pbk5vdGlmeUludGVydmFsSW5NcyA9IDA7CiAKQEAgLTYwLDkgKzY0LDEwIEBACiAgICAgLyoqIFRpbWUgb2YgbGFzdCBmYWlsdXJlIGluIG1pbGxpc2Vjb25kcy4gKi8KICAgICBwcml2YXRlIHZvbGF0aWxlIGxvbmcgbGFzdEZhaWxJbk1zID0gMDsKIAotICAgIEd1YXJkcmFpbChTdHJpbmcgbmFtZSkKKyAgICBHdWFyZHJhaWwoU3RyaW5nIG5hbWUsIEBOdWxsYWJsZSBTdHJpbmcgcmVhc29uKQogICAgIHsKICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5yZWFzb24gPSByZWFzb247CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzgsOCArMTQzLDE2IEBACiAgICAgQFZpc2libGVGb3JUZXN0aW5nCiAgICAgU3RyaW5nIGRlY29yYXRlTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkKICAgICB7Ci0gICAgICAgIC8vIEFkZCBhIHByZWZpeCB0byBlcnJvciBtZXNzYWdlIHNvIHVzZXIga25vd3Mgd2hhdCB0aHJldyB0aGUgd2FybmluZyBvciBjYXVzZSB0aGUgZmFpbHVyZQotICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiR3VhcmRyYWlsICVzIHZpb2xhdGVkOiAlcyIsIG5hbWUsIG1lc3NhZ2UpOworICAgICAgICAvLyBBZGQgYSBwcmVmaXggdG8gZXJyb3IgbWVzc2FnZSBzbyB1c2VyIGtub3dzIHdoYXQgdGhyZXcgdGhlIHdhcm5pbmcgb3IgY2F1c2UgdGhlIGZhaWx1cmUuCisgICAgICAgIFN0cmluZyBkZWNvcmF0ZWRNZXNzYWdlID0gU3RyaW5nLmZvcm1hdCgiR3VhcmRyYWlsICVzIHZpb2xhdGVkOiAlcyIsIG5hbWUsIG1lc3NhZ2UpOworCisgICAgICAgIC8vIEFkZCB0aGUgcmVhc29uIGZvciB0aGUgZ3VhcmRyYWlsIHRyaWdnZXJpbmcsIGlmIHRoZXJlIGlzIGFueS4KKyAgICAgICAgaWYgKHJlYXNvbiAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBkZWNvcmF0ZWRNZXNzYWdlICs9IChtZXNzYWdlLmVuZHNXaXRoKCIuIikgPyAnICcgOiAiLiAiKSArIHJlYXNvbjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkZWNvcmF0ZWRNZXNzYWdlOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbHMuamF2YQppbmRleCA5ZDA4YWIwLi5kMjI4OWI0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbHMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbHMuamF2YQpAQCAtMzEsOSArMzEsMTIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhU3RvcmFnZVNwZWM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRHVyYXRpb25TcGVjOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5HdWFyZHJhaWxzT3B0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db25zaXN0ZW5jeUxldmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNsaWVudFN0YXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuZGlzay51c2FnZS5EaXNrVXNhZ2VCcm9hZGNhc3RlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5NQmVhbldyYXBwZXI7CiAKQEAgLTUwLDEzICs1MywxNCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEd1YXJkcmFpbHNPcHRpb25zIERFRkFVTFRfQ09ORklHID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldEd1YXJkcmFpbHNDb25maWcoKTsKIAogICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHN0YXRpYyBmaW5hbCBHdWFyZHJhaWxzIGluc3RhbmNlID0gbmV3IEd1YXJkcmFpbHMoKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEd1YXJkcmFpbHMgaW5zdGFuY2UgPSBuZXcgR3VhcmRyYWlscygpOwogCiAgICAgLyoqCiAgICAgICogR3VhcmRyYWlsIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgdXNlciBrZXlzcGFjZXMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXhUaHJlc2hvbGQga2V5c3BhY2VzID0KICAgICBuZXcgTWF4VGhyZXNob2xkKCJrZXlzcGFjZXMiLAorICAgICAgICAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0S2V5c3BhY2VzV2FyblRocmVzaG9sZCgpLAogICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRLZXlzcGFjZXNGYWlsVGhyZXNob2xkKCksCiAgICAgICAgICAgICAgICAgICAgICAoaXNXYXJuaW5nLCB3aGF0LCB2YWx1ZSwgdGhyZXNob2xkKSAtPgpAQCAtNzAsNiArNzQsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWF4VGhyZXNob2xkIHRhYmxlcyA9CiAgICAgbmV3IE1heFRocmVzaG9sZCgidGFibGVzIiwKKyAgICAgICAgICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldFRhYmxlc1dhcm5UaHJlc2hvbGQoKSwKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0VGFibGVzRmFpbFRocmVzaG9sZCgpLAogICAgICAgICAgICAgICAgICAgICAgKGlzV2FybmluZywgd2hhdCwgdmFsdWUsIHRocmVzaG9sZCkgLT4KQEAgLTgzLDYgKzg4LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1heFRocmVzaG9sZCBjb2x1bW5zUGVyVGFibGUgPQogICAgIG5ldyBNYXhUaHJlc2hvbGQoImNvbHVtbnNfcGVyX3RhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldENvbHVtbnNQZXJUYWJsZVdhcm5UaHJlc2hvbGQoKSwKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0Q29sdW1uc1BlclRhYmxlRmFpbFRocmVzaG9sZCgpLAogICAgICAgICAgICAgICAgICAgICAgKGlzV2FybmluZywgd2hhdCwgdmFsdWUsIHRocmVzaG9sZCkgLT4KQEAgLTkzLDYgKzk5LDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWF4VGhyZXNob2xkIHNlY29uZGFyeUluZGV4ZXNQZXJUYWJsZSA9CiAgICAgbmV3IE1heFRocmVzaG9sZCgic2Vjb25kYXJ5X2luZGV4ZXNfcGVyX3RhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldFNlY29uZGFyeUluZGV4ZXNQZXJUYWJsZVdhcm5UaHJlc2hvbGQoKSwKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0U2Vjb25kYXJ5SW5kZXhlc1BlclRhYmxlRmFpbFRocmVzaG9sZCgpLAogICAgICAgICAgICAgICAgICAgICAgKGlzV2FybmluZywgd2hhdCwgdmFsdWUsIHRocmVzaG9sZCkgLT4KQEAgLTEwNCwxNiArMTExLDE4IEBACiAgICAgLyoqCiAgICAgICogR3VhcmRyYWlsIGRpc2FibGluZyB1c2VyJ3MgYWJpbGl0eSB0byBjcmVhdGUgc2Vjb25kYXJ5IGluZGV4ZXMKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIERpc2FibGVGbGFnIGNyZWF0ZVNlY29uZGFyeUluZGV4ZXNFbmFibGVkID0KLSAgICBuZXcgRGlzYWJsZUZsYWcoInNlY29uZGFyeV9pbmRleGVzIiwKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gIUNPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0U2Vjb25kYXJ5SW5kZXhlc0VuYWJsZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgIlVzZXIgY3JlYXRpb24gb2Ygc2Vjb25kYXJ5IGluZGV4ZXMiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVuYWJsZUZsYWcgY3JlYXRlU2Vjb25kYXJ5SW5kZXhlc0VuYWJsZWQgPQorICAgIG5ldyBFbmFibGVGbGFnKCJzZWNvbmRhcnlfaW5kZXhlcyIsCisgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldFNlY29uZGFyeUluZGV4ZXNFbmFibGVkKCksCisgICAgICAgICAgICAgICAgICAgIlVzZXIgY3JlYXRpb24gb2Ygc2Vjb25kYXJ5IGluZGV4ZXMiKTsKIAogICAgIC8qKgogICAgICAqIEd1YXJkcmFpbCBvbiB0aGUgbnVtYmVyIG9mIG1hdGVyaWFsaXplZCB2aWV3cyBwZXIgdGFibGUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXhUaHJlc2hvbGQgbWF0ZXJpYWxpemVkVmlld3NQZXJUYWJsZSA9CiAgICAgbmV3IE1heFRocmVzaG9sZCgibWF0ZXJpYWxpemVkX3ZpZXdzX3Blcl90YWJsZSIsCisgICAgICAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRNYXRlcmlhbGl6ZWRWaWV3c1BlclRhYmxlV2FyblRocmVzaG9sZCgpLAogICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRNYXRlcmlhbGl6ZWRWaWV3c1BlclRhYmxlRmFpbFRocmVzaG9sZCgpLAogICAgICAgICAgICAgICAgICAgICAgKGlzV2FybmluZywgd2hhdCwgdmFsdWUsIHRocmVzaG9sZCkgLT4KQEAgLTEyNyw2ICsxMzYsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVzPFN0cmluZz4gdGFibGVQcm9wZXJ0aWVzID0KICAgICBuZXcgVmFsdWVzPD4oInRhYmxlX3Byb3BlcnRpZXMiLAorICAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldFRhYmxlUHJvcGVydGllc1dhcm5lZCgpLAogICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldFRhYmxlUHJvcGVydGllc0lnbm9yZWQoKSwKICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRUYWJsZVByb3BlcnRpZXNEaXNhbGxvd2VkKCksCkBAIC0xMzUsNDIgKzE0NSw4MyBAQAogICAgIC8qKgogICAgICAqIEd1YXJkcmFpbCBkaXNhYmxpbmcgdXNlci1wcm92aWRlZCB0aW1lc3RhbXBzLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRGlzYWJsZUZsYWcgdXNlclRpbWVzdGFtcHNFbmFibGVkID0KLSAgICBuZXcgRGlzYWJsZUZsYWcoInVzZXJfdGltZXN0YW1wcyIsCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+ICFDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldFVzZXJUaW1lc3RhbXBzRW5hYmxlZCgpLAotICAgICAgICAgICAgICAgICAgICAiVXNlciBwcm92aWRlZCB0aW1lc3RhbXBzIChVU0lORyBUSU1FU1RBTVApIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbmFibGVGbGFnIHVzZXJUaW1lc3RhbXBzRW5hYmxlZCA9CisgICAgbmV3IEVuYWJsZUZsYWcoInVzZXJfdGltZXN0YW1wcyIsCisgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldFVzZXJUaW1lc3RhbXBzRW5hYmxlZCgpLAorICAgICAgICAgICAgICAgICAgICJVc2VyIHByb3ZpZGVkIHRpbWVzdGFtcHMgKFVTSU5HIFRJTUVTVEFNUCkiKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRGlzYWJsZUZsYWcgZ3JvdXBCeUVuYWJsZWQgPQotICAgIG5ldyBEaXNhYmxlRmxhZygiZ3JvdXBfYnkiLAotICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAhQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRHcm91cEJ5RW5hYmxlZCgpLAotICAgICAgICAgICAgICAgICAgICAiR1JPVVAgQlkgZnVuY3Rpb25hbGl0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW5hYmxlRmxhZyBncm91cEJ5RW5hYmxlZCA9CisgICAgbmV3IEVuYWJsZUZsYWcoImdyb3VwX2J5IiwKKyAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0R3JvdXBCeUVuYWJsZWQoKSwKKyAgICAgICAgICAgICAgICAgICAiR1JPVVAgQlkgZnVuY3Rpb25hbGl0eSIpOwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBEaXNhYmxlRmxhZyBkcm9wVHJ1bmNhdGVUYWJsZUVuYWJsZWQgPQotICAgIG5ldyBEaXNhYmxlRmxhZygiZHJvcF90cnVuY2F0ZV90YWJsZV9lbmFibGVkIiwKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gIUNPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0RHJvcFRydW5jYXRlVGFibGVFbmFibGVkKCksCi0gICAgICAgICAgICAgICAgICAgICJEUk9QIGFuZCBUUlVOQ0FURSBUQUJMRSBmdW5jdGlvbmFsaXR5Iik7CisgICAgLyoqCisgICAgICogR3VhcmRyYWlsIGRpc2FibGluZyBBTFRFUiBUQUJMRSBjb2x1bW4gbXV0YXRpb24gYWNjZXNzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW5hYmxlRmxhZyBhbHRlclRhYmxlRW5hYmxlZCA9CisgICAgbmV3IEVuYWJsZUZsYWcoImFsdGVyX3RhYmxlIiwKKyAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0QWx0ZXJUYWJsZUVuYWJsZWQoKSwKKyAgICAgICAgICAgICAgICAgICAiVXNlciBhY2Nlc3MgdG8gQUxURVIgVEFCTEUgc3RhdGVtZW50IGZvciBjb2x1bW4gbXV0YXRpb24iKTsKKworICAgIC8qKgorICAgICAqIEd1YXJkcmFpbCBkaXNhYmxpbmcgRFJPUCAvIFRSVU5DQVRFIFRBQkxFIGJlaGF2aW9yCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbmFibGVGbGFnIGRyb3BUcnVuY2F0ZVRhYmxlRW5hYmxlZCA9CisgICAgbmV3IEVuYWJsZUZsYWcoImRyb3BfdHJ1bmNhdGVfdGFibGVfZW5hYmxlZCIsCisgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldERyb3BUcnVuY2F0ZVRhYmxlRW5hYmxlZCgpLAorICAgICAgICAgICAgICAgICAgICJEUk9QIGFuZCBUUlVOQ0FURSBUQUJMRSBmdW5jdGlvbmFsaXR5Iik7CisKKyAgICAvKioKKyAgICAgKiBHdWFyZHJhaWwgZGlzYWJsaW5nIERST1AgS0VZU1BBQ0UgYmVoYXZpb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVuYWJsZUZsYWcgZHJvcEtleXNwYWNlRW5hYmxlZCA9CisgICAgbmV3IEVuYWJsZUZsYWcoImRyb3Bfa2V5c3BhY2VfZW5hYmxlZCIsCisgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0RHJvcEtleXNwYWNlRW5hYmxlZCgpLAorICAgICAgICAgICAgICAgICAgICAiRFJPUCBLRVlTUEFDRSBmdW5jdGlvbmFsaXR5Iik7CiAKICAgICAvKioKICAgICAgKiBHdWFyZHJhaWwgZGlzYWJsaW5nIHVzZXIncyBhYmlsaXR5IHRvIHR1cm4gb2ZmIGNvbXByZXNzaW9uCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBEaXNhYmxlRmxhZyB1bmNvbXByZXNzZWRUYWJsZXNFbmFibGVkID0KLSAgICBuZXcgRGlzYWJsZUZsYWcoInVuY29tcHJlc3NlZF90YWJsZXNfZW5hYmxlZCIsCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+ICFDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldFVuY29tcHJlc3NlZFRhYmxlc0VuYWJsZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgIlVuY29tcHJlc3NlZCB0YWJsZSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW5hYmxlRmxhZyB1bmNvbXByZXNzZWRUYWJsZXNFbmFibGVkID0KKyAgICBuZXcgRW5hYmxlRmxhZygidW5jb21wcmVzc2VkX3RhYmxlc19lbmFibGVkIiwKKyAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0VW5jb21wcmVzc2VkVGFibGVzRW5hYmxlZCgpLAorICAgICAgICAgICAgICAgICAgICJVbmNvbXByZXNzZWQgdGFibGUiKTsKIAogICAgIC8qKgogICAgICAqIEd1YXJkcmFpbCBkaXNhYmxpbmcgdGhlIGNyZWF0aW9uIG9mIG5ldyBDT01QQUNUIFNUT1JBR0UgdGFibGVzCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBEaXNhYmxlRmxhZyBjb21wYWN0VGFibGVzRW5hYmxlZCA9Ci0gICAgbmV3IERpc2FibGVGbGFnKCJjb21wYWN0X3RhYmxlcyIsCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+ICFDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldENvbXBhY3RUYWJsZXNFbmFibGVkKCksCi0gICAgICAgICAgICAgICAgICAgICJDcmVhdGlvbiBvZiBuZXcgQ09NUEFDVCBTVE9SQUdFIHRhYmxlcyIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW5hYmxlRmxhZyBjb21wYWN0VGFibGVzRW5hYmxlZCA9CisgICAgbmV3IEVuYWJsZUZsYWcoImNvbXBhY3RfdGFibGVzIiwKKyAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0Q29tcGFjdFRhYmxlc0VuYWJsZWQoKSwKKyAgICAgICAgICAgICAgICAgICAiQ3JlYXRpb24gb2YgbmV3IENPTVBBQ1QgU1RPUkFHRSB0YWJsZXMiKTsKKworICAgIC8qKgorICAgICAqIEd1YXJkcmFpbCB0byB3YXJuIG9yIGZhaWwgYSBDUkVBVEUgb3IgQUxURVIgVEFCTEUgc3RhdGVtZW50IHdoZW4gZGVmYXVsdF90aW1lX3RvX2xpdmUgaXMgc2V0IHRvIDAgYW5kCisgICAgICogdGhlIHRhYmxlIGlzIHVzaW5nIFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kgY29tcGFjdGlvbiBvciBhIHN1YmNsYXNzIG9mIGl0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW5hYmxlRmxhZyB6ZXJvVFRMT25UV0NTRW5hYmxlZCA9CisgICAgbmV3IEVuYWJsZUZsYWcoInplcm9fdHRsX29uX3R3Y3MiLAorICAgICAgICAgICAgICAgICAgICJJdCBpcyBzdXNwaWNpb3VzIHRvIHVzZSBkZWZhdWx0X3RpbWVfdG9fbGl2ZSBzZXQgdG8gMCB3aXRoIHN1Y2ggY29tcGFjdGlvbiBzdHJhdGVneS4gIiArCisgICAgICAgICAgICAgICAgICAgIlBsZWFzZSBrZWVwIGluIG1pbmQgdGhhdCBkYXRhIHdpbGwgbm90IHN0YXJ0IHRvIGF1dG9tYXRpY2FsbHkgZXhwaXJlIGFmdGVyIHRoZXkgYXJlIG9sZGVyICIgKworICAgICAgICAgICAgICAgICAgICJ0aGFuIGEgcmVzcGVjdGl2ZSBjb21wYWN0aW9uIHdpbmRvdyB1bml0IG9mIGEgY2VydGFpbiBzaXplLiBQbGVhc2Ugc2V0IFRUTCBmb3IgeW91ciBJTlNFUlQgb3IgVVBEQVRFICIgKworICAgICAgICAgICAgICAgICAgICJzdGF0ZW1lbnRzIGlmIHlvdSBleHBlY3QgZGF0YSB0byBiZSBleHBpcmVkIGFzIHRhYmxlIHNldHRpbmdzIHdpbGwgbm90IGRvIGl0LiAiLAorICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0WmVyb1RUTE9uVFdDU1dhcm5lZCgpLAorICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0WmVyb1RUTE9uVFdDU0VuYWJsZWQoKSwKKyAgICAgICAgICAgICAgICAgICAiMCBkZWZhdWx0X3RpbWVfdG9fbGl2ZSBvbiBhIHRhYmxlIHdpdGggIiArIFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIiBjb21wYWN0aW9uIHN0cmF0ZWd5Iik7CiAKICAgICAvKioKICAgICAgKiBHdWFyZHJhaWwgb24gdGhlIG51bWJlciBvZiBlbGVtZW50cyByZXR1cm5lZCB3aXRoaW4gcGFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1heFRocmVzaG9sZCBwYWdlU2l6ZSA9CiAgICAgbmV3IE1heFRocmVzaG9sZCgicGFnZV9zaXplIiwKKyAgICAgICAgICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldFBhZ2VTaXplV2FyblRocmVzaG9sZCgpLAogICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRQYWdlU2l6ZUZhaWxUaHJlc2hvbGQoKSwKICAgICAgICAgICAgICAgICAgICAgIChpc1dhcm5pbmcsIHdoYXQsIHZhbHVlLCB0aHJlc2hvbGQpIC0+CkBAIC0xODQsNiArMjM1LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1heFRocmVzaG9sZCBwYXJ0aXRpb25LZXlzSW5TZWxlY3QgPQogICAgIG5ldyBNYXhUaHJlc2hvbGQoInBhcnRpdGlvbl9rZXlzX2luX3NlbGVjdCIsCisgICAgICAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRQYXJ0aXRpb25LZXlzSW5TZWxlY3RXYXJuVGhyZXNob2xkKCksCiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldFBhcnRpdGlvbktleXNJblNlbGVjdEZhaWxUaHJlc2hvbGQoKSwKICAgICAgICAgICAgICAgICAgICAgIChpc1dhcm5pbmcsIHdoYXQsIHZhbHVlLCB0aHJlc2hvbGQpIC0+CkBAIC0xOTcsMjQgKzI0OSwzNiBAQAogICAgIC8qKgogICAgICAqIEd1YXJkcmFpbCBkaXNhYmxpbmcgb3BlcmF0aW9ucyBvbiBsaXN0cyB0aGF0IHJlcXVpcmUgcmVhZCBiZWZvcmUgd3JpdGUuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBEaXNhYmxlRmxhZyByZWFkQmVmb3JlV3JpdGVMaXN0T3BlcmF0aW9uc0VuYWJsZWQgPQotICAgIG5ldyBEaXNhYmxlRmxhZygicmVhZF9iZWZvcmVfd3JpdGVfbGlzdF9vcGVyYXRpb25zIiwKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gIUNPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0UmVhZEJlZm9yZVdyaXRlTGlzdE9wZXJhdGlvbnNFbmFibGVkKCksCi0gICAgICAgICAgICAgICAgICAgICJMaXN0IG9wZXJhdGlvbiByZXF1aXJpbmcgcmVhZCBiZWZvcmUgd3JpdGUiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVuYWJsZUZsYWcgcmVhZEJlZm9yZVdyaXRlTGlzdE9wZXJhdGlvbnNFbmFibGVkID0KKyAgICBuZXcgRW5hYmxlRmxhZygicmVhZF9iZWZvcmVfd3JpdGVfbGlzdF9vcGVyYXRpb25zIiwKKyAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0UmVhZEJlZm9yZVdyaXRlTGlzdE9wZXJhdGlvbnNFbmFibGVkKCksCisgICAgICAgICAgICAgICAgICAgIkxpc3Qgb3BlcmF0aW9uIHJlcXVpcmluZyByZWFkIGJlZm9yZSB3cml0ZSIpOwogCiAgICAgLyoqCiAgICAgICogR3VhcmRyYWlsIGRpc2FibGluZyBBTExPVyBGSUxURVJJTkcgc3RhdGVtZW50IHdpdGhpbiBhIHF1ZXJ5CiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBEaXNhYmxlRmxhZyBhbGxvd0ZpbHRlcmluZ0VuYWJsZWQgPQotICAgIG5ldyBEaXNhYmxlRmxhZygiYWxsb3dfZmlsdGVyaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gIUNPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0QWxsb3dGaWx0ZXJpbmdFbmFibGVkKCksCi0gICAgICAgICAgICAgICAgICAgICJRdWVyeWluZyB3aXRoIEFMTE9XIEZJTFRFUklORyIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW5hYmxlRmxhZyBhbGxvd0ZpbHRlcmluZ0VuYWJsZWQgPQorICAgIG5ldyBFbmFibGVGbGFnKCJhbGxvd19maWx0ZXJpbmciLAorICAgICAgICAgICAgICAgICAgICJBTExPVyBGSUxURVJJTkcgY2FuIHBvdGVudGlhbGx5IHZpc2l0IGFsbCB0aGUgZGF0YSBpbiB0aGUgdGFibGUgYW5kIGhhdmUgdW5wcmVkaWN0YWJsZSBwZXJmb3JtYW5jZS4iLAorICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0QWxsb3dGaWx0ZXJpbmdFbmFibGVkKCksCisgICAgICAgICAgICAgICAgICAgIlF1ZXJ5aW5nIHdpdGggQUxMT1cgRklMVEVSSU5HIik7CisKKyAgICAvKioKKyAgICAgKiBHdWFyZHJhaWwgZGlzYWJsaW5nIHNldHRpbmcgU2ltcGxlU3RyYXRlZ3kgdmlhIGtleXNwYWNlIGNyZWF0aW9uIG9yIGFsdGVyYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVuYWJsZUZsYWcgc2ltcGxlU3RyYXRlZ3lFbmFibGVkID0KKyAgICBuZXcgRW5hYmxlRmxhZygic2ltcGxlc3RyYXRlZ3kiLAorICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRTaW1wbGVTdHJhdGVneUVuYWJsZWQoKSwKKyAgICAgICAgICAgICAgICAgICAiU2ltcGxlU3RyYXRlZ3kiKTsKIAogICAgIC8qKgogICAgICAqIEd1YXJkcmFpbCBvbiB0aGUgbnVtYmVyIG9mIHJlc3RyaWN0aW9ucyBjcmVhdGVkIGJ5IGEgY2FydGVzaWFuIHByb2R1Y3Qgb2YgYSBDUUwncyB7QGNvZGUgSU59IHF1ZXJ5LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWF4VGhyZXNob2xkIGluU2VsZWN0Q2FydGVzaWFuUHJvZHVjdCA9CiAgICAgbmV3IE1heFRocmVzaG9sZCgiaW5fc2VsZWN0X2NhcnRlc2lhbl9wcm9kdWN0IiwKKyAgICAgICAgICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldEluU2VsZWN0Q2FydGVzaWFuUHJvZHVjdFdhcm5UaHJlc2hvbGQoKSwKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0SW5TZWxlY3RDYXJ0ZXNpYW5Qcm9kdWN0RmFpbFRocmVzaG9sZCgpLAogICAgICAgICAgICAgICAgICAgICAgKGlzV2FybmluZywgd2hhdCwgdmFsdWUsIHRocmVzaG9sZCkgLT4KQEAgLTIzMCw2ICsyOTQsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVzPENvbnNpc3RlbmN5TGV2ZWw+IHJlYWRDb25zaXN0ZW5jeUxldmVscyA9CiAgICAgbmV3IFZhbHVlczw+KCJyZWFkX2NvbnNpc3RlbmN5X2xldmVscyIsCisgICAgICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0UmVhZENvbnNpc3RlbmN5TGV2ZWxzV2FybmVkKCksCiAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENvbGxlY3Rpb25zLmVtcHR5U2V0KCksCiAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0UmVhZENvbnNpc3RlbmN5TGV2ZWxzRGlzYWxsb3dlZCgpLApAQCAtMjQwLDQyICszMDUsNjYgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlczxDb25zaXN0ZW5jeUxldmVsPiB3cml0ZUNvbnNpc3RlbmN5TGV2ZWxzID0KICAgICBuZXcgVmFsdWVzPD4oIndyaXRlX2NvbnNpc3RlbmN5X2xldmVscyIsCisgICAgICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0V3JpdGVDb25zaXN0ZW5jeUxldmVsc1dhcm5lZCgpLAogICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLAogICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldFdyaXRlQ29uc2lzdGVuY3lMZXZlbHNEaXNhbGxvd2VkKCksCiAgICAgICAgICAgICAgICAgICJ3cml0ZSBjb25zaXN0ZW5jeSBsZXZlbHMiKTsKIAogICAgIC8qKgorICAgICAqIEd1YXJkcmFpbCBvbiB0aGUgc2l6ZSBvZiBhIHBhcnRpdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1heFRocmVzaG9sZCBwYXJ0aXRpb25TaXplID0KKyAgICBuZXcgTWF4VGhyZXNob2xkKCJwYXJ0aXRpb25fc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAiVG9vIGxhcmdlIHBhcnRpdGlvbnMgY2FuIGNhdXNlIHBlcmZvcm1hbmNlIHByb2JsZW1zLiAiLAorICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gc2l6ZVRvQnl0ZXMoQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRQYXJ0aXRpb25TaXplV2FyblRocmVzaG9sZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IHNpemVUb0J5dGVzKENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0UGFydGl0aW9uU2l6ZUZhaWxUaHJlc2hvbGQoKSksCisgICAgICAgICAgICAgICAgICAgICAoaXNXYXJuaW5nLCB3aGF0LCB2YWx1ZSwgdGhyZXNob2xkKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIlBhcnRpdGlvbiAlcyBoYXMgc2l6ZSAlcywgdGhpcyBleGNlZWRzIHRoZSAlcyB0aHJlc2hvbGQgb2YgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoYXQsIHZhbHVlLCBpc1dhcm5pbmcgPyAid2FybmluZyIgOiAiZmFpbHVyZSIsIHRocmVzaG9sZCkpOworCisgICAgLyoqCisgICAgICogR3VhcmRyYWlsIG9uIHRoZSBzaXplIG9mIGEgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1heFRocmVzaG9sZCBjb2x1bW5WYWx1ZVNpemUgPQorICAgIG5ldyBNYXhUaHJlc2hvbGQoImNvbHVtbl92YWx1ZV9zaXplIiwKKyAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBzaXplVG9CeXRlcyhDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldENvbHVtblZhbHVlU2l6ZVdhcm5UaHJlc2hvbGQoKSksCisgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBzaXplVG9CeXRlcyhDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldENvbHVtblZhbHVlU2l6ZUZhaWxUaHJlc2hvbGQoKSksCisgICAgICAgICAgICAgICAgICAgICAoaXNXYXJuaW5nLCB3aGF0LCB2YWx1ZSwgdGhyZXNob2xkKSAtPgorICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJWYWx1ZSBvZiBjb2x1bW4gJXMgaGFzIHNpemUgJXMsIHRoaXMgZXhjZWVkcyB0aGUgJXMgdGhyZXNob2xkIG9mICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hhdCwgdmFsdWUsIGlzV2FybmluZyA/ICJ3YXJuaW5nIiA6ICJmYWlsdXJlIiwgdGhyZXNob2xkKSk7CisKKyAgICAvKioKICAgICAgKiBHdWFyZHJhaWwgb24gdGhlIHNpemUgb2YgYSBjb2xsZWN0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWF4VGhyZXNob2xkIGNvbGxlY3Rpb25TaXplID0KICAgICBuZXcgTWF4VGhyZXNob2xkKCJjb2xsZWN0aW9uX3NpemUiLAorICAgICAgICAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IHNpemVUb0J5dGVzKENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0Q29sbGVjdGlvblNpemVXYXJuVGhyZXNob2xkKCkpLAogICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gc2l6ZVRvQnl0ZXMoQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRDb2xsZWN0aW9uU2l6ZUZhaWxUaHJlc2hvbGQoKSksCiAgICAgICAgICAgICAgICAgICAgICAoaXNXYXJuaW5nLCB3aGF0LCB2YWx1ZSwgdGhyZXNob2xkKSAtPgotICAgICAgICAgICAgICAgICAgICAgaXNXYXJuaW5nID8gZm9ybWF0KCJEZXRlY3RlZCBjb2xsZWN0aW9uICVzIG9mIHNpemUgJXMsIHRoaXMgZXhjZWVkcyB0aGUgd2FybmluZyB0aHJlc2hvbGQgb2YgJXMuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGF0LCB2YWx1ZSwgdGhyZXNob2xkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZm9ybWF0KCJEZXRlY3RlZCBjb2xsZWN0aW9uICVzIG9mIHNpemUgJXMsIHRoaXMgZXhjZWVkcyB0aGUgZmFpbHVyZSB0aHJlc2hvbGQgb2YgJXMuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGF0LCB2YWx1ZSwgdGhyZXNob2xkKSk7CisgICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIkRldGVjdGVkIGNvbGxlY3Rpb24gJXMgb2Ygc2l6ZSAlcywgdGhpcyBleGNlZWRzIHRoZSAlcyB0aHJlc2hvbGQgb2YgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGF0LCB2YWx1ZSwgaXNXYXJuaW5nID8gIndhcm5pbmciIDogImZhaWx1cmUiLCB0aHJlc2hvbGQpKTsKIAogICAgIC8qKgogICAgICAqIEd1YXJkcmFpbCBvbiB0aGUgbnVtYmVyIG9mIGl0ZW1zIG9mIGEgY29sbGVjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1heFRocmVzaG9sZCBpdGVtc1BlckNvbGxlY3Rpb24gPQogICAgIG5ldyBNYXhUaHJlc2hvbGQoIml0ZW1zX3Blcl9jb2xsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldEl0ZW1zUGVyQ29sbGVjdGlvbldhcm5UaHJlc2hvbGQoKSwKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0SXRlbXNQZXJDb2xsZWN0aW9uRmFpbFRocmVzaG9sZCgpLAogICAgICAgICAgICAgICAgICAgICAgKGlzV2FybmluZywgd2hhdCwgdmFsdWUsIHRocmVzaG9sZCkgLT4KLSAgICAgICAgICAgICAgICAgICAgIGlzV2FybmluZyA/IGZvcm1hdCgiRGV0ZWN0ZWQgY29sbGVjdGlvbiAlcyB3aXRoICVzIGl0ZW1zLCB0aGlzIGV4Y2VlZHMgdGhlIHdhcm5pbmcgdGhyZXNob2xkIG9mICVzLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hhdCwgdmFsdWUsIHRocmVzaG9sZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZvcm1hdCgiRGV0ZWN0ZWQgY29sbGVjdGlvbiAlcyB3aXRoICVzIGl0ZW1zLCB0aGlzIGV4Y2VlZHMgdGhlIGZhaWx1cmUgdGhyZXNob2xkIG9mICVzLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hhdCwgdmFsdWUsIHRocmVzaG9sZCkpOworICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJEZXRlY3RlZCBjb2xsZWN0aW9uICVzIHdpdGggJXMgaXRlbXMsIHRoaXMgZXhjZWVkcyB0aGUgJXMgdGhyZXNob2xkIG9mICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hhdCwgdmFsdWUsIGlzV2FybmluZyA/ICJ3YXJuaW5nIiA6ICJmYWlsdXJlIiwgdGhyZXNob2xkKSk7CiAKICAgICAvKioKICAgICAgKiBHdWFyZHJhaWwgb24gdGhlIG51bWJlciBvZiBmaWVsZHMgb24gZWFjaCBVRFQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXhUaHJlc2hvbGQgZmllbGRzUGVyVURUID0KICAgICBuZXcgTWF4VGhyZXNob2xkKCJmaWVsZHNfcGVyX3VkdCIsCisgICAgICAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRGaWVsZHNQZXJVRFRXYXJuVGhyZXNob2xkKCksCiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldEZpZWxkc1BlclVEVEZhaWxUaHJlc2hvbGQoKSwKICAgICAgICAgICAgICAgICAgICAgIChpc1dhcm5pbmcsIHdoYXQsIHZhbHVlLCB0aHJlc2hvbGQpIC0+CkBAIC0yOTAsNiArMzc5LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBlcmNlbnRhZ2VUaHJlc2hvbGQgbG9jYWxEYXRhRGlza1VzYWdlID0KICAgICBuZXcgUGVyY2VudGFnZVRocmVzaG9sZCgibG9jYWxfZGF0YV9kaXNrX3VzYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0RGF0YURpc2tVc2FnZVBlcmNlbnRhZ2VXYXJuVGhyZXNob2xkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXREYXRhRGlza1VzYWdlUGVyY2VudGFnZUZhaWxUaHJlc2hvbGQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNXYXJuaW5nLCB3aGF0LCB2YWx1ZSwgdGhyZXNob2xkKSAtPgpAQCAtMzA1LDYgKzM5NSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGVzPEluZXRBZGRyZXNzQW5kUG9ydD4gcmVwbGljYURpc2tVc2FnZSA9CiAgICAgbmV3IFByZWRpY2F0ZXM8PigicmVwbGljYV9kaXNrX3VzYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBEaXNrVXNhZ2VCcm9hZGNhc3Rlci5pbnN0YW5jZTo6aXNTdHVmZmVkLAogICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gRGlza1VzYWdlQnJvYWRjYXN0ZXIuaW5zdGFuY2U6OmlzRnVsbCwKICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCB1c2luZyBgdmFsdWVgIGJlY2F1c2UgaXQgcmVwcmVzZW50cyByZXBsaWNhIGFkZHJlc3Mgd2hpY2ggc2hvdWxkIGJlIGhpZGRlbiBmcm9tIGNsaWVudC4KQEAgLTMyNSwxMyArNDE2LDQyIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNaW5UaHJlc2hvbGQgbWluaW11bVJlcGxpY2F0aW9uRmFjdG9yID0KICAgICBuZXcgTWluVGhyZXNob2xkKCJtaW5pbXVtX3JlcGxpY2F0aW9uX2ZhY3RvciIsCisgICAgICAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JXYXJuVGhyZXNob2xkKCksCiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldE1pbmltdW1SZXBsaWNhdGlvbkZhY3RvckZhaWxUaHJlc2hvbGQoKSwKICAgICAgICAgICAgICAgICAgICAgIChpc1dhcm5pbmcsIHdoYXQsIHZhbHVlLCB0aHJlc2hvbGQpIC0+Ci0gICAgICAgICAgICAgICAgICAgICBpc1dhcm5pbmcgPyBmb3JtYXQoIlRoZSBrZXlzcGFjZSAlcyBoYXMgYSByZXBsaWNhdGlvbiBmYWN0b3Igb2YgJXMsIGJlbG93IHRoZSB3YXJuaW5nIHRocmVzaG9sZCBvZiAlcy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoYXQsIHZhbHVlLCB0aHJlc2hvbGQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmb3JtYXQoIlRoZSBrZXlzcGFjZSAlcyBoYXMgYSByZXBsaWNhdGlvbiBmYWN0b3Igb2YgJXMsIGJlbG93IHRoZSBmYWlsdXJlIHRocmVzaG9sZCBvZiAlcy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoYXQsIHZhbHVlLCB0aHJlc2hvbGQpKTsKKyAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiVGhlIGtleXNwYWNlICVzIGhhcyBhIHJlcGxpY2F0aW9uIGZhY3RvciBvZiAlcywgYmVsb3cgdGhlICVzIHRocmVzaG9sZCBvZiAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoYXQsIHZhbHVlLCBpc1dhcm5pbmcgPyAid2FybmluZyIgOiAiZmFpbHVyZSIsIHRocmVzaG9sZCkpOworCisgICAgLyoqCisgICAgICogR3VhcmRyYWlsIG9uIHRoZSBtYXhpbXVtIHJlcGxpY2F0aW9uIGZhY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1heFRocmVzaG9sZCBtYXhpbXVtUmVwbGljYXRpb25GYWN0b3IgPQorICAgIG5ldyBNYXhUaHJlc2hvbGQoIm1heGltdW1fcmVwbGljYXRpb25fZmFjdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldE1heGltdW1SZXBsaWNhdGlvbkZhY3Rvcldhcm5UaHJlc2hvbGQoKSwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yRmFpbFRocmVzaG9sZCgpLAorICAgICAgICAgICAgICAgICAgICAgKGlzV2FybmluZywgd2hhdCwgdmFsdWUsIHRocmVzaG9sZCkgLT4KKyAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiVGhlIGtleXNwYWNlICVzIGhhcyBhIHJlcGxpY2F0aW9uIGZhY3RvciBvZiAlcywgYWJvdmUgdGhlICVzIHRocmVzaG9sZCBvZiAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoYXQsIHZhbHVlLCBpc1dhcm5pbmcgPyAid2FybmluZyIgOiAiZmFpbHVyZSIsIHRocmVzaG9sZCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXhUaHJlc2hvbGQgbWF4aW11bUFsbG93YWJsZVRpbWVzdGFtcCA9CisgICAgbmV3IE1heFRocmVzaG9sZCgibWF4aW11bV90aW1lc3RhbXAiLAorICAgICAgICAgICAgICAgICAgICAgIlRpbWVzdGFtcHMgdG9vIGZhciBpbiB0aGUgZnV0dXJlIGNhbiBsZWFkIHRvIGRhdGEgdGhhdCBjYW4ndCBiZSBlYXNpbHkgb3ZlcndyaXR0ZW4iLAorICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gbWF4aW11bVRpbWVzdGFtcEFzUmVsYXRpdmVNaWNyb3MoQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRNYXhpbXVtVGltZXN0YW1wV2FyblRocmVzaG9sZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IG1heGltdW1UaW1lc3RhbXBBc1JlbGF0aXZlTWljcm9zKENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0TWF4aW11bVRpbWVzdGFtcEZhaWxUaHJlc2hvbGQoKSksCisgICAgICAgICAgICAgICAgICAgICAoaXNXYXJuaW5nLCB3aGF0LCB2YWx1ZSwgdGhyZXNob2xkKSAtPgorICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIlRoZSBtb2RpZmljYXRpb24gdG8gdGFibGUgJXMgaGFzIGEgdGltZXN0YW1wICVzIGFmdGVyIHRoZSBtYXhpbXVtIGFsbG93YWJsZSAlcyB0aHJlc2hvbGQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hhdCwgdmFsdWUsIGlzV2FybmluZyA/ICJ3YXJuaW5nIiA6ICJmYWlsdXJlIiwgdGhyZXNob2xkKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1pblRocmVzaG9sZCBtaW5pbXVtQWxsb3dhYmxlVGltZXN0YW1wID0KKyAgICBuZXcgTWluVGhyZXNob2xkKCJtaW5pbXVtX3RpbWVzdGFtcCIsCisgICAgICAgICAgICAgICAgICAgICAiVGltZXN0YW1wcyB0b28gZmFyIGluIHRoZSBwYXN0IGNhbiBjYXVzZSB3cml0ZXMgY2FuIGJlIHVuZXhwZWN0ZWRseSBsb3N0IiwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IG1pbmltdW1UaW1lc3RhbXBBc1JlbGF0aXZlTWljcm9zKENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0TWluaW11bVRpbWVzdGFtcFdhcm5UaHJlc2hvbGQoKSksCisgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBtaW5pbXVtVGltZXN0YW1wQXNSZWxhdGl2ZU1pY3JvcyhDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldE1pbmltdW1UaW1lc3RhbXBGYWlsVGhyZXNob2xkKCkpLAorICAgICAgICAgICAgICAgICAgICAgKGlzV2FybmluZywgd2hhdCwgdmFsdWUsIHRocmVzaG9sZCkgLT4KKyAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiVGhlIG1vZGlmaWNhdGlvbiB0byB0YWJsZSAlcyBoYXMgYSB0aW1lc3RhbXAgJXMgYmVmb3JlIHRoZSBtaW5pbXVtIGFsbG93YWJsZSAlcyB0aHJlc2hvbGQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoYXQsIHZhbHVlLCBpc1dhcm5pbmcgPyAid2FybmluZyIgOiAiZmFpbHVyZSIsIHRocmVzaG9sZCkpOwogCiAgICAgcHJpdmF0ZSBHdWFyZHJhaWxzKCkKICAgICB7CkBAIC01NDAsNiArNjYwLDE4IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZ2V0QWx0ZXJUYWJsZUVuYWJsZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIERFRkFVTFRfQ09ORklHLmdldEFsdGVyVGFibGVFbmFibGVkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0QWx0ZXJUYWJsZUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQorICAgIHsKKyAgICAgICAgREVGQVVMVF9DT05GSUcuc2V0QWx0ZXJUYWJsZUVuYWJsZWQoZW5hYmxlZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0QWxsb3dGaWx0ZXJpbmdFbmFibGVkKCkKICAgICB7CiAgICAgICAgIHJldHVybiBERUZBVUxUX0NPTkZJRy5nZXRBbGxvd0ZpbHRlcmluZ0VuYWJsZWQoKTsKQEAgLTU1Miw2ICs2ODQsMTggQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTaW1wbGVTdHJhdGVneUVuYWJsZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIERFRkFVTFRfQ09ORklHLmdldFNpbXBsZVN0cmF0ZWd5RW5hYmxlZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFNpbXBsZVN0cmF0ZWd5RW5hYmxlZChib29sZWFuIGVuYWJsZWQpCisgICAgeworICAgICAgICBERUZBVUxUX0NPTkZJRy5zZXRTaW1wbGVTdHJhdGVneUVuYWJsZWQoZW5hYmxlZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0VW5jb21wcmVzc2VkVGFibGVzRW5hYmxlZCgpCiAgICAgewogICAgICAgICByZXR1cm4gREVGQVVMVF9DT05GSUcuZ2V0VW5jb21wcmVzc2VkVGFibGVzRW5hYmxlZCgpOwpAQCAtNjAwLDYgKzc0NCwxOCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGdldERyb3BLZXlzcGFjZUVuYWJsZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIERFRkFVTFRfQ09ORklHLmdldERyb3BLZXlzcGFjZUVuYWJsZWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXREcm9wS2V5c3BhY2VFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkKKyAgICB7CisgICAgICAgIERFRkFVTFRfQ09ORklHLnNldERyb3BLZXlzcGFjZUVuYWJsZWQoZW5hYmxlZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRQYWdlU2l6ZVdhcm5UaHJlc2hvbGQoKQogICAgIHsKICAgICAgICAgcmV0dXJuIERFRkFVTFRfQ09ORklHLmdldFBhZ2VTaXplV2FyblRocmVzaG9sZCgpOwpAQCAtNjQ5LDYgKzgwNSw0NiBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgQE51bGxhYmxlCisgICAgcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25TaXplV2FyblRocmVzaG9sZCgpCisgICAgeworICAgICAgICByZXR1cm4gc2l6ZVRvU3RyaW5nKERFRkFVTFRfQ09ORklHLmdldFBhcnRpdGlvblNpemVXYXJuVGhyZXNob2xkKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uU2l6ZUZhaWxUaHJlc2hvbGQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNpemVUb1N0cmluZyhERUZBVUxUX0NPTkZJRy5nZXRQYXJ0aXRpb25TaXplRmFpbFRocmVzaG9sZCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJ0aXRpb25TaXplVGhyZXNob2xkKEBOdWxsYWJsZSBTdHJpbmcgd2FyblNpemUsIEBOdWxsYWJsZSBTdHJpbmcgZmFpbFNpemUpCisgICAgeworICAgICAgICBERUZBVUxUX0NPTkZJRy5zZXRQYXJ0aXRpb25TaXplVGhyZXNob2xkKHNpemVGcm9tU3RyaW5nKHdhcm5TaXplKSwgc2l6ZUZyb21TdHJpbmcoZmFpbFNpemUpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBATnVsbGFibGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtblZhbHVlU2l6ZVdhcm5UaHJlc2hvbGQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNpemVUb1N0cmluZyhERUZBVUxUX0NPTkZJRy5nZXRDb2x1bW5WYWx1ZVNpemVXYXJuVGhyZXNob2xkKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVmFsdWVTaXplRmFpbFRocmVzaG9sZCgpCisgICAgeworICAgICAgICByZXR1cm4gc2l6ZVRvU3RyaW5nKERFRkFVTFRfQ09ORklHLmdldENvbHVtblZhbHVlU2l6ZUZhaWxUaHJlc2hvbGQoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q29sdW1uVmFsdWVTaXplVGhyZXNob2xkKEBOdWxsYWJsZSBTdHJpbmcgd2FyblNpemUsIEBOdWxsYWJsZSBTdHJpbmcgZmFpbFNpemUpCisgICAgeworICAgICAgICBERUZBVUxUX0NPTkZJRy5zZXRDb2x1bW5WYWx1ZVNpemVUaHJlc2hvbGQoc2l6ZUZyb21TdHJpbmcod2FyblNpemUpLCBzaXplRnJvbVN0cmluZyhmYWlsU2l6ZSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBOdWxsYWJsZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sbGVjdGlvblNpemVXYXJuVGhyZXNob2xkKCkKICAgICB7CiAgICAgICAgIHJldHVybiBzaXplVG9TdHJpbmcoREVGQVVMVF9DT05GSUcuZ2V0Q29sbGVjdGlvblNpemVXYXJuVGhyZXNob2xkKCkpOwpAQCAtODE4LDYgKzEwMTQsMjQgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldE1heGltdW1SZXBsaWNhdGlvbkZhY3Rvcldhcm5UaHJlc2hvbGQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIERFRkFVTFRfQ09ORklHLmdldE1heGltdW1SZXBsaWNhdGlvbkZhY3Rvcldhcm5UaHJlc2hvbGQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvckZhaWxUaHJlc2hvbGQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIERFRkFVTFRfQ09ORklHLmdldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvckZhaWxUaHJlc2hvbGQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQgKGludCB3YXJuLCBpbnQgZmFpbCkKKyAgICB7CisgICAgICAgIERFRkFVTFRfQ09ORklHLnNldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvclRocmVzaG9sZCh3YXJuLCBmYWlsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldERhdGFEaXNrVXNhZ2VQZXJjZW50YWdlV2FyblRocmVzaG9sZCgpCiAgICAgewogICAgICAgICByZXR1cm4gREVGQVVMVF9DT05GSUcuZ2V0RGF0YURpc2tVc2FnZVBlcmNlbnRhZ2VXYXJuVGhyZXNob2xkKCk7CkBAIC04NjYsNiArMTA4MCw2NiBAQAogICAgICAgICBERUZBVUxUX0NPTkZJRy5zZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQod2FybiwgZmFpbCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZ2V0WmVyb1RUTE9uVFdDU0VuYWJsZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIERFRkFVTFRfQ09ORklHLmdldFplcm9UVExPblRXQ1NFbmFibGVkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0WmVyb1RUTE9uVFdDU0VuYWJsZWQoYm9vbGVhbiB2YWx1ZSkKKyAgICB7CisgICAgICAgIERFRkFVTFRfQ09ORklHLnNldFplcm9UVExPblRXQ1NFbmFibGVkKHZhbHVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRaZXJvVFRMT25UV0NTV2FybmVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBERUZBVUxUX0NPTkZJRy5nZXRaZXJvVFRMT25UV0NTV2FybmVkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0WmVyb1RUTE9uVFdDU1dhcm5lZChib29sZWFuIHZhbHVlKQorICAgIHsKKyAgICAgICAgREVGQVVMVF9DT05GSUcuc2V0WmVyb1RUTE9uVFdDU1dhcm5lZCh2YWx1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRNYXhpbXVtVGltZXN0YW1wV2FyblRocmVzaG9sZCgpCisgICAgeworICAgICAgICByZXR1cm4gZHVyYXRpb25Ub1N0cmluZyhERUZBVUxUX0NPTkZJRy5nZXRNYXhpbXVtVGltZXN0YW1wV2FyblRocmVzaG9sZCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1heGltdW1UaW1lc3RhbXBGYWlsVGhyZXNob2xkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkdXJhdGlvblRvU3RyaW5nKERFRkFVTFRfQ09ORklHLmdldE1heGltdW1UaW1lc3RhbXBGYWlsVGhyZXNob2xkKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE1heGltdW1UaW1lc3RhbXBUaHJlc2hvbGQoU3RyaW5nIHdhcm5TZWNvbmRzLCBTdHJpbmcgZmFpbFNlY29uZHMpCisgICAgeworICAgICAgICBERUZBVUxUX0NPTkZJRy5zZXRNYXhpbXVtVGltZXN0YW1wVGhyZXNob2xkKGR1cmF0aW9uRnJvbVN0cmluZyh3YXJuU2Vjb25kcyksIGR1cmF0aW9uRnJvbVN0cmluZyhmYWlsU2Vjb25kcykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWluaW11bVRpbWVzdGFtcFdhcm5UaHJlc2hvbGQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGR1cmF0aW9uVG9TdHJpbmcoREVGQVVMVF9DT05GSUcuZ2V0TWluaW11bVRpbWVzdGFtcFdhcm5UaHJlc2hvbGQoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRNaW5pbXVtVGltZXN0YW1wRmFpbFRocmVzaG9sZCgpCisgICAgeworICAgICAgICByZXR1cm4gZHVyYXRpb25Ub1N0cmluZyhERUZBVUxUX0NPTkZJRy5nZXRNaW5pbXVtVGltZXN0YW1wRmFpbFRocmVzaG9sZCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRNaW5pbXVtVGltZXN0YW1wVGhyZXNob2xkKFN0cmluZyB3YXJuU2Vjb25kcywgU3RyaW5nIGZhaWxTZWNvbmRzKQorICAgIHsKKyAgICAgICAgREVGQVVMVF9DT05GSUcuc2V0TWluaW11bVRpbWVzdGFtcFRocmVzaG9sZChkdXJhdGlvbkZyb21TdHJpbmcod2FyblNlY29uZHMpLCBkdXJhdGlvbkZyb21TdHJpbmcoZmFpbFNlY29uZHMpKTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9DU1YoU2V0PFN0cmluZz4gdmFsdWVzKQogICAgIHsKICAgICAgICAgcmV0dXJuIHZhbHVlcyA9PSBudWxsIHx8IHZhbHVlcy5pc0VtcHR5KCkgPyAiIiA6IFN0cmluZy5qb2luKCIsIiwgdmFsdWVzKTsKQEAgLTkxNCw0ICsxMTg4LDI4IEBACiAgICAgewogICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuaXNFbXB0eShzaXplKSA/IG51bGwgOiBuZXcgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kKHNpemUpOwogICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkdXJhdGlvblRvU3RyaW5nKEBOdWxsYWJsZSBEdXJhdGlvblNwZWMgZHVyYXRpb24pCisgICAgeworICAgICAgICByZXR1cm4gZHVyYXRpb24gPT0gbnVsbCA/IG51bGwgOiBkdXJhdGlvbi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQgZHVyYXRpb25Gcm9tU3RyaW5nKEBOdWxsYWJsZSBTdHJpbmcgZHVyYXRpb24pCisgICAgeworICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuaXNFbXB0eShkdXJhdGlvbikgPyBudWxsIDogbmV3IER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQoZHVyYXRpb24pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgbWF4aW11bVRpbWVzdGFtcEFzUmVsYXRpdmVNaWNyb3MoQE51bGxhYmxlIER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQgZHVyYXRpb24pCisgICAgeworICAgICAgICByZXR1cm4gZHVyYXRpb24gPT0gbnVsbAorICAgICAgICAgICAgICAgPyBMb25nLk1BWF9WQUxVRQorICAgICAgICAgICAgICAgOiAoQ2xpZW50U3RhdGUuZ2V0TGFzdFRpbWVzdGFtcE1pY3JvcygpICsgZHVyYXRpb24udG9NaWNyb3NlY29uZHMoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBtaW5pbXVtVGltZXN0YW1wQXNSZWxhdGl2ZU1pY3JvcyhATnVsbGFibGUgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCBkdXJhdGlvbikKKyAgICB7CisgICAgICAgIHJldHVybiBkdXJhdGlvbiA9PSBudWxsCisgICAgICAgICAgICAgICA/IExvbmcuTUlOX1ZBTFVFCisgICAgICAgICAgICAgICA6IChDbGllbnRTdGF0ZS5nZXRMYXN0VGltZXN0YW1wTWljcm9zKCkgLSBkdXJhdGlvbi50b01pY3Jvc2Vjb25kcygpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbHNDb25maWcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsc0NvbmZpZy5qYXZhCmluZGV4IGE1MmVlYjAuLmFmMWI1YjQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsc0NvbmZpZy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsc0NvbmZpZy5qYXZhCkBAIC0yMyw2ICsyMyw3IEBACiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhU3RvcmFnZVNwZWM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkR1cmF0aW9uU3BlYzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db25zaXN0ZW5jeUxldmVsOwogCiAvKioKQEAgLTEzMyw2ICsxMzQsMTMgQEAKICAgICBib29sZWFuIGdldFVzZXJUaW1lc3RhbXBzRW5hYmxlZCgpOwogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHVzZXJzIGFyZSBhbGxvd2VkIGFjY2VzcyB0byB0aGUgQUxURVIgVEFCTEUgc3RhdGVtZW50IHRvIG11dGF0ZSBjb2x1bW5zIG9yIG5vdAorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgQUxURVIgVEFCTEUgQUREL1JFTU9WRS9SRU5BTUUgaXMgYWxsb3dlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBnZXRBbHRlclRhYmxlRW5hYmxlZCgpOworCisgICAgLyoqCiAgICAgICogUmV0dXJucyB3aGV0aGVyIHRhYmxlcyBjYW4gYmUgdW5jb21wcmVzc2VkCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB1c2VyJ3MgY2FuIGRpc2FibGUgY29tcHJlc3Npb24sIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgpAQCAtMTYxLDYgKzE2OSwxMyBAQAogICAgIGJvb2xlYW4gZ2V0RHJvcFRydW5jYXRlVGFibGVFbmFibGVkKCk7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgRFJPUCBvbiBrZXlzcGFjZXMgaXMgYWxsb3dlZAorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYWxsb3dlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBnZXREcm9wS2V5c3BhY2VFbmFibGVkKCk7CisKKyAgICAvKioKICAgICAgKiBAcmV0dXJuIFRoZSB0aHJlc2hvbGQgdG8gd2FybiB3aGVuIHBhZ2Ugc2l6ZSBleGNlZWRzIGdpdmVuIHNpemUuCiAgICAgICovCiAgICAgaW50IGdldFBhZ2VTaXplV2FyblRocmVzaG9sZCgpOwpAQCAtMTg1LDYgKzIwMCwxMyBAQAogICAgIGJvb2xlYW4gZ2V0QWxsb3dGaWx0ZXJpbmdFbmFibGVkKCk7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgc2V0dGluZyBTaW1wbGVTdHJhdGVneSB2aWEga2V5c3BhY2UgY3JlYXRpb24gb3IgYWx0ZXJhdGlvbiBpcyBlbmFibGVkCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBTaW1wbGVTdHJhdGVneSBpcyBhbGxvd2VkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGdldFNpbXBsZVN0cmF0ZWd5RW5hYmxlZCgpOworCisgICAgLyoqCiAgICAgICogQHJldHVybiBUaGUgdGhyZXNob2xkIHRvIHdhcm4gd2hlbiBhbiBJTiBxdWVyeSBjcmVhdGVzIGEgY2FydGVzaWFuIHByb2R1Y3Qgd2l0aCBhIHNpemUgZXhjZWVkaW5nIHRocmVzaG9sZC4KICAgICAgKiAtMSBtZWFucyBkaXNhYmxlZC4KICAgICAgKi8KQEAgLTIxNyw2ICsyMzksMzAgQEAKICAgICBTZXQ8Q29uc2lzdGVuY3lMZXZlbD4gZ2V0V3JpdGVDb25zaXN0ZW5jeUxldmVsc0Rpc2FsbG93ZWQoKTsKIAogICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIHRocmVzaG9sZCB0byB3YXJuIHdoZW4gd3JpdGluZyBwYXJ0aXRpb25zIGxhcmdlciB0aGFuIHRocmVzaG9sZC4KKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgZ2V0UGFydGl0aW9uU2l6ZVdhcm5UaHJlc2hvbGQoKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIHRocmVzaG9sZCB0byBmYWlsIHdoZW4gd3JpdGluZyBwYXJ0aXRpb25zIGxhcmdlciB0aGFuIHRocmVzaG9sZC4KKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgZ2V0UGFydGl0aW9uU2l6ZUZhaWxUaHJlc2hvbGQoKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIHRocmVzaG9sZCB0byB3YXJuIHdoZW4gd3JpdGluZyBjb2x1bW4gdmFsdWVzIGxhcmdlciB0aGFuIHRocmVzaG9sZC4KKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgZ2V0Q29sdW1uVmFsdWVTaXplV2FyblRocmVzaG9sZCgpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgdGhyZXNob2xkIHRvIHByZXZlbnQgd3JpdGluZyBjb2x1bW4gdmFsdWVzIGxhcmdlciB0aGFuIHRocmVzaG9sZC4KKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgZ2V0Q29sdW1uVmFsdWVTaXplRmFpbFRocmVzaG9sZCgpOworCisgICAgLyoqCiAgICAgICogQHJldHVybiBUaGUgdGhyZXNob2xkIHRvIHdhcm4gd2hlbiBlbmNvdW50ZXJpbmcgYSBjb2xsZWN0aW9uIHdpdGggbGFyZ2VyIGRhdGEgc2l6ZSB0aGFuIHRocmVzaG9sZC4KICAgICAgKi8KICAgICBATnVsbGFibGUKQEAgLTI3Nyw0ICszMjMsOTAgQEAKICAgICAgKi8KICAgICBpbnQgZ2V0TWluaW11bVJlcGxpY2F0aW9uRmFjdG9yRmFpbFRocmVzaG9sZCgpOwogCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgdGhyZXNob2xkIHRvIHdhcm4gd2hlbiByZXBsaWNhdGlvbiBmYWN0b3IgaXMgZ3JlYXRlciB0aGFuIHRocmVzaG9sZC4KKyAgICAgKi8KKyAgICBpbnQgZ2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yV2FyblRocmVzaG9sZCgpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgdGhyZXNob2xkIHRvIGZhaWwgd2hlbiByZXBsaWNhdGlvbiBmYWN0b3IgaXMgZ3JlYXRlciB0aGFuIHRocmVzaG9sZC4KKyAgICAgKi8KKyAgICBpbnQgZ2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yRmFpbFRocmVzaG9sZCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHdhcm5pbmdzIHdpbGwgYmUgZW1pdHRlZCB3aGVuIHVzYWdlIG9mIDAgZGVmYXVsdCBUVEwgb24gYQorICAgICAqIHRhYmxlIHdpdGggVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneSBpcyBkZXRlY3RlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHdhcm5pbmdzIHdpbGwgYmUgZW1pdHRlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBnZXRaZXJvVFRMT25UV0NTV2FybmVkKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgd2FybmluZ3Mgd2lsbCBiZSBlbWl0dGVkIHdoZW4gdXNhZ2Ugb2YgMCBkZWZhdWx0IFRUTCBvbiBhCisgICAgICogdGFibGUgd2l0aCBUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5IGlzIGRldGVjdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHtAY29kZSB0cnVlfSBpZiB3YXJuaW5nIHdpbGwgYmUgZW1pdHRlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgdm9pZCBzZXRaZXJvVFRMT25UV0NTV2FybmVkKGJvb2xlYW4gdmFsdWUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGl0IGlzIGFsbG93ZWQgdG8gY3JlYXRlIG9yIGFsdGVyIHRhYmxlIHRvIHVzZSAwIGRlZmF1bHQgVFRMIHdpdGggVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneS4KKyAgICAgKiBJZiBpdCBpcyBub3QsIHN1Y2ggcXVlcnkgd2lsbCBmYWlsLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgMCBkZWZhdWx0IFRUTCBpcyBhbGxvd2VkIG9uIFRXQ1MgdGFibGUsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gZ2V0WmVyb1RUTE9uVFdDU0VuYWJsZWQoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB1c2VycyBjYW4gdXNlIDAgZGVmYXVsdCBUVEwgb24gYSB0YWJsZSB3aXRoIFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUge0Bjb2RlIHRydWV9IGlmIDAgZGVmYXVsdCBUVEwgb24gVFdDUyB0YWJsZXMgaXMgYWxsb3dlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgdm9pZCBzZXRaZXJvVFRMT25UV0NTRW5hYmxlZChib29sZWFuIHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gQSB0aW1lc3RhbXAgdGhhdCBpZiBhIHVzZXIgc3VwcGxpZWQgdGltZXN0YW1wIGlzIGFmdGVyIHdpbGwgdHJpZ2dlciBhIHdhcm5pbmcKKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBEdXJhdGlvblNwZWMuTG9uZ01pY3Jvc2Vjb25kc0JvdW5kIGdldE1heGltdW1UaW1lc3RhbXBXYXJuVGhyZXNob2xkKCk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIEEgdGltZXN0YW1wIHRoYXQgaWYgYSB1c2VyIHN1cHBsaWVkIHRpbWVzdGFtcCBpcyBhZnRlciB3aWxsIGNhdXNlIGEgZmFpbHVyZQorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQgZ2V0TWF4aW11bVRpbWVzdGFtcEZhaWxUaHJlc2hvbGQoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHdhcm5pbmcgdXBwZXIgYm91bmQgZm9yIHVzZXIgc3VwcGxpZWQgdGltZXN0YW1wcworICAgICAqCisgICAgICogQHBhcmFtIHdhcm4gVGhlIGhpZ2hlc3QgYWNjZXB0YWJsZSBkaWZmZXJlbmNlIGJldHdlZW4gbm93IGFuZCB0aGUgd3JpdHRlbiB2YWx1ZSB0aW1lc3RhbXAgYmVmb3JlIHRyaWdnZXJpbmcgYQorICAgICAqICAgICAgICAgICAgIHdhcm5pbmcuIHtAY29kZSBudWxsfSBtZWFucyBkaXNhYmxlZC4KKyAgICAgKiBAcGFyYW0gZmFpbCBUaGUgaGlnaGVzdCBhY2NlcHRhYmxlIGRpZmZlcmVuY2UgYmV0d2VlbiBub3cgYW5kIHRoZSB3cml0dGVuIHZhbHVlIHRpbWVzdGFtcCBiZWZvcmUgdHJpZ2dlcmluZyBhCisgICAgICogICAgICAgICAgICAgZmFpbHVyZS4ge0Bjb2RlIG51bGx9IG1lYW5zIGRpc2FibGVkLgorICAgICAqLworICAgIHZvaWQgc2V0TWF4aW11bVRpbWVzdGFtcFRocmVzaG9sZChATnVsbGFibGUgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCB3YXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCBmYWlsKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gQSB0aW1lc3RhbXAgdGhhdCBpZiBhIHVzZXIgc3VwcGxpZWQgdGltZXN0YW1wIGlzIGJlZm9yZSB3aWxsIHRyaWdnZXIgYSB3YXJuaW5nCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCBnZXRNaW5pbXVtVGltZXN0YW1wV2FyblRocmVzaG9sZCgpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBBIHRpbWVzdGFtcCB0aGF0IGlmIGEgdXNlciBzdXBwbGllZCB0aW1lc3RhbXAgaXMgYWZ0ZXIgd2lsbCB0cmlnZ2VyIGEgd2FybmluZworICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQgZ2V0TWluaW11bVRpbWVzdGFtcEZhaWxUaHJlc2hvbGQoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHdhcm5pbmcgbG93ZXIgYm91bmQgZm9yIHVzZXIgc3VwcGxpZWQgdGltZXN0YW1wcworICAgICAqCisgICAgICogQHBhcmFtIHdhcm4gVGhlIGxvd2VzdCBhY2NlcHRhYmxlIGRpZmZlcmVuY2UgYmV0d2VlbiBub3cgYW5kIHRoZSB3cml0dGVuIHZhbHVlIHRpbWVzdGFtcCBiZWZvcmUgdHJpZ2dlcmluZyBhCisgICAgICogICAgICAgICAgICAgd2FybmluZy4ge0Bjb2RlIG51bGx9IG1lYW5zIGRpc2FibGVkLgorICAgICAqIEBwYXJhbSBmYWlsIFRoZSBsb3dlc3QgYWNjZXB0YWJsZSBkaWZmZXJlbmNlIGJldHdlZW4gbm93IGFuZCB0aGUgd3JpdHRlbiB2YWx1ZSB0aW1lc3RhbXAgYmVmb3JlIHRyaWdnZXJpbmcgYQorICAgICAqICAgICAgICAgICAgIGZhaWx1cmUuIHtAY29kZSBudWxsfSBtZWFucyBkaXNhYmxlZC4KKyAgICAgKi8KKyAgICB2b2lkIHNldE1pbmltdW1UaW1lc3RhbXBUaHJlc2hvbGQoQE51bGxhYmxlIER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQgd2FybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE51bGxhYmxlIER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQgZmFpbCk7CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbHNDb25maWdQcm92aWRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxzQ29uZmlnUHJvdmlkZXIuamF2YQppbmRleCA2MTI4NzY0Li4yODA0NjdlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbHNDb25maWdQcm92aWRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsc0NvbmZpZ1Byb3ZpZGVyLmphdmEKQEAgLTI0LDYgKzI0LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNsaWVudFN0YXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ1VTVE9NX0dVQVJEUkFJTFNfQ09ORklHX1BST1ZJREVSX0NMQVNTOworCiAvKioKICAqIFByb3ZpZGVyIG9mIHtAbGluayBHdWFyZHJhaWxzQ29uZmlnfXMgZm9yIGEge0BsaW5rIENsaWVudFN0YXRlfS4KICAqIDxwPgpAQCAtMzcsMTEgKzM5LDE0IEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgR3VhcmRyYWlsc0NvbmZpZ1Byb3ZpZGVyCiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0lNUExFTUVOVEFUSU9OX1BST1BFUlRZID0gImNhc3NhbmRyYS5jdXN0b21fZ3VhcmRyYWlsc19jb25maWdfcHJvdmlkZXJfY2xhc3MiOworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIENVU1RPTV9HVUFSRFJBSUxTX0NPTkZJR19QUk9WSURFUl9DTEFTUy5nZXRLZXkoKSBtdXN0IGJlIHVzZWQgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9JTVBMRU1FTlRBVElPTl9QUk9QRVJUWSA9IENVU1RPTV9HVUFSRFJBSUxTX0NPTkZJR19QUk9WSURFUl9DTEFTUy5nZXRLZXkoKTsKIAotICAgIHN0YXRpYyBmaW5hbCBHdWFyZHJhaWxzQ29uZmlnUHJvdmlkZXIgaW5zdGFuY2UgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoQ1VTVE9NX0lNUExFTUVOVEFUSU9OX1BST1BFUlRZKSA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IERlZmF1bHQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGJ1aWxkKFN5c3RlbS5nZXRQcm9wZXJ0eShDVVNUT01fSU1QTEVNRU5UQVRJT05fUFJPUEVSVFkpKTsKKyAgICBHdWFyZHJhaWxzQ29uZmlnUHJvdmlkZXIgaW5zdGFuY2UgPSBDVVNUT01fR1VBUkRSQUlMU19DT05GSUdfUFJPVklERVJfQ0xBU1MuZ2V0U3RyaW5nKCkgPT0gbnVsbCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERlZmF1bHQoKSA6IGJ1aWxkKENVU1RPTV9HVUFSRFJBSUxTX0NPTkZJR19QUk9WSURFUl9DTEFTUy5nZXRTdHJpbmcoKSk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgR3VhcmRyYWlsc0NvbmZpZ30gdG8gYmUgdXNlZCBmb3IgdGhlIHNwZWNpZmllZCB7QGxpbmsgQ2xpZW50U3RhdGV9LgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxzTUJlYW4uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsc01CZWFuLmphdmEKaW5kZXggYWQyZWRkYS4uY2FiYmUwYyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxzTUJlYW4uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbHNNQmVhbi5qYXZhCkBAIC0yMjMsNiArMjIzLDIwIEBACiAgICAgdm9pZCBzZXRBbGxvd0ZpbHRlcmluZ0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKTsKIAogICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBTaW1wbGVTdHJhdGVneSBpcyBhbGxvd2VkIG9uIGtleXNwYWNlIGNyZWF0aW9uIG9yIGFsdGVyYXRpb24KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIFNpbXBsZVN0cmF0ZWd5IGlzIGFsbG93ZWQ7IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbGVhbiBnZXRTaW1wbGVTdHJhdGVneUVuYWJsZWQoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciBTaW1wbGVTdHJhdGVneSBpcyBhbGxvd2VkIG9uIGtleXNwYWNlIGNyZWF0aW9uIG9yIGFsdGVyYXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmFibGVkIHtAY29kZSB0cnVlfSBpZiBTaW1wbGVTdHJhdGVneSBpcyBhbGxvd2VkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldFNpbXBsZVN0cmF0ZWd5RW5hYmxlZChib29sZWFuIGVuYWJsZWQpOworCisgICAgLyoqCiAgICAgICogUmV0dXJucyB3aGV0aGVyIHVzZXJzIGNhbiBkaXNhYmxlIGNvbXByZXNzaW9uIG9uIHRhYmxlcwogICAgICAqCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdXNlcnMgY2FuIGRpc2FibGUgY29tcHJlc3Npb24gb24gYSB0YWJsZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCkBAIC0yNTEsNiArMjY1LDIwIEBACiAgICAgdm9pZCBzZXRDb21wYWN0VGFibGVzRW5hYmxlZChib29sZWFuIGVuYWJsZWQpOwogCiAgICAgLyoqCisgICAgICogR2V0cyB3aGV0aGVyIHVzZXJzIGNhbiB1c2UgdGhlIEFMVEVSIFRBQkxFIHN0YXRlbWVudCB0byBjaGFuZ2UgY29sdW1ucworICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgQUxURVIgVEFCTEUgaXMgYWxsb3dlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBnZXRBbHRlclRhYmxlRW5hYmxlZCgpOworCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHVzZXJzIGNhbiB1c2UgdGhlIEFMVEVSIFRBQkxFIHN0YXRlbWVudCB0byBjaGFuZ2UgY29sdW1ucworICAgICAqCisgICAgICogQHBhcmFtIGVuYWJsZWQge0Bjb2RlIHRydWV9IGlmIGNoYW5naW5nIGNvbHVtbnMgaXMgYWxsb3dlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgdm9pZCBzZXRBbHRlclRhYmxlRW5hYmxlZChib29sZWFuIGVuYWJsZWQpOworCisgICAgLyoqCiAgICAgICogUmV0dXJucyB3aGV0aGVyIEdST1VQIEJZIHF1ZXJpZXMgYXJlIGFsbG93ZWQuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBhbGxvd2VkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KQEAgLTI3Nyw2ICszMDUsMTggQEAKICAgICB2b2lkIHNldERyb3BUcnVuY2F0ZVRhYmxlRW5hYmxlZChib29sZWFuIGVuYWJsZWQpOwogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHVzZXJzIGNhbiBEUk9QIGEga2V5c3BhY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGFsbG93ZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gZ2V0RHJvcEtleXNwYWNlRW5hYmxlZCgpOworCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHVzZXJzIGNhbiBEUk9QIGEga2V5c3BhY2UKKyAgICAgKi8KKyAgICB2b2lkIHNldERyb3BLZXlzcGFjZUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKTsKKworICAgIC8qKgogICAgICAqIEByZXR1cm4gVGhlIHRocmVzaG9sZCB0byB3YXJuIHdoZW4gcmVxdWVzdGVkIHBhZ2Ugc2l6ZSBncmVhdGVyIHRoYW4gdGhyZXNob2xkLgogICAgICAqIC0xIG1lYW5zIGRpc2FibGVkLgogICAgICAqLwpAQCAtNDI5LDYgKzQ2OSw1NyBAQAogICAgIHZvaWQgc2V0V3JpdGVDb25zaXN0ZW5jeUxldmVsc0Rpc2FsbG93ZWRDU1YoU3RyaW5nIGNvbnNpc3RlbmN5TGV2ZWxzKTsKIAogICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIHRocmVzaG9sZCB0byB3YXJuIHdoZW4gZW5jb3VudGVyaW5nIHBhcnRpdGlvbnMgbGFyZ2VyIHRoYW4gdGhyZXNob2xkLCBhcyBhIHN0cmluZyBmb3JtYXR0ZWQgYXMgaW4sCisgICAgICogZm9yIGV4YW1wbGUsIHtAY29kZSAxMEdpQn0sIHtAY29kZSAyME1pQn0sIHtAY29kZSAzMEtpQn0gb3Ige0Bjb2RlIDQwQn0uIEEge0Bjb2RlIG51bGx9IHZhbHVlIG1lYW5zIGRpc2FibGVkLgorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIFN0cmluZyBnZXRQYXJ0aXRpb25TaXplV2FyblRocmVzaG9sZCgpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgdGhyZXNob2xkIHRvIGZhaWwgd2hlbiBlbmNvdW50ZXJpbmcgcGFydGl0aW9ucyBsYXJnZXIgdGhhbiB0aHJlc2hvbGQsIGFzIGEgc3RyaW5nIGZvcm1hdHRlZCBhcyBpbiwKKyAgICAgKiBmb3IgZXhhbXBsZSwge0Bjb2RlIDEwR2lCfSwge0Bjb2RlIDIwTWlCfSwge0Bjb2RlIDMwS2lCfSBvciB7QGNvZGUgNDBCfS4gQSB7QGNvZGUgbnVsbH0gdmFsdWUgbWVhbnMgZGlzYWJsZWQuCisgICAgICogVHJpZ2dlcmluZyBhIGZhaWx1cmUgZW1pdHMgYSBsb2cgbWVzc2FnZSBhbmQgYSBkaWFnbm9zdGljICBldmVudCwgYnV0IGl0IGRvZXNuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uIGludGVycnVwdGluZworICAgICAqIHRoZSBvZmZlbmRpbmcgc3N0YWJsZSB3cml0ZS4KKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBTdHJpbmcgZ2V0UGFydGl0aW9uU2l6ZUZhaWxUaHJlc2hvbGQoKTsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSB3YXJuU2l6ZSBUaGUgdGhyZXNob2xkIHRvIHdhcm4gd2hlbiBlbmNvdW50ZXJpbmcgcGFydGl0aW9ucyBsYXJnZXIgdGhhbiB0aHJlc2hvbGQsIGFzIGEgc3RyaW5nIGZvcm1hdHRlZAorICAgICAqICAgICAgICAgICAgICAgICBhcyBpbiwgZm9yIGV4YW1wbGUsIHtAY29kZSAxMEdpQn0sIHtAY29kZSAyME1pQn0sIHtAY29kZSAzMEtpQn0gb3Ige0Bjb2RlIDQwQn0uCisgICAgICogICAgICAgICAgICAgICAgIEEge0Bjb2RlIG51bGx9IHZhbHVlIG1lYW5zIGRpc2FibGVkLgorICAgICAqIEBwYXJhbSBmYWlsU2l6ZSBUaGUgdGhyZXNob2xkIHRvIGZhaWwgd2hlbiBlbmNvdW50ZXJpbmcgcGFydGl0aW9ucyBsYXJnZXIgdGhhbiB0aHJlc2hvbGQsIGFzIGEgc3RyaW5nIGZvcm1hdHRlZAorICAgICAqICAgICAgICAgICAgICAgICBhcyBpbiwgZm9yIGV4YW1wbGUsIHtAY29kZSAxMEdpQn0sIHtAY29kZSAyME1pQn0sIHtAY29kZSAzMEtpQn0gb3Ige0Bjb2RlIDQwQn0uCisgICAgICogICAgICAgICAgICAgICAgIEEge0Bjb2RlIG51bGx9IHZhbHVlIG1lYW5zIGRpc2FibGVkLiBUcmlnZ2VyaW5nIGEgZmFpbHVyZSBlbWl0cyBhIGxvZyBtZXNzYWdlIGFuZCBhIGRpYWdub3N0aWMKKyAgICAgKiAgICAgICAgICAgICAgICAgZXZlbnQsIGJ1dCBpdCBkZXNuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uIGludGVycnVwdGluZyB0aGUgb2ZmZW5kaW5nIHNzdGFibGUgd3JpdGUuCisgICAgICovCisgICAgdm9pZCBzZXRQYXJ0aXRpb25TaXplVGhyZXNob2xkKEBOdWxsYWJsZSBTdHJpbmcgd2FyblNpemUsIEBOdWxsYWJsZSBTdHJpbmcgZmFpbFNpemUpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgdGhyZXNob2xkIHRvIHdhcm4gd2hlbiBlbmNvdW50ZXJpbmcgY29sdW1uIHZhbHVlcyBsYXJnZXIgdGhhbiB0aHJlc2hvbGQsIGFzIGEgc3RyaW5nICBmb3JtYXR0ZWQgYXMKKyAgICAgKiBpbiwgZm9yIGV4YW1wbGUsIHtAY29kZSAxMEdpQn0sIHtAY29kZSAyME1pQn0sIHtAY29kZSAzMEtpQn0gb3Ige0Bjb2RlIDQwQn0uIEEge0Bjb2RlIG51bGx9IHZhbHVlIG1lYW5zIGRpc2FibGVkLgorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIFN0cmluZyBnZXRDb2x1bW5WYWx1ZVNpemVXYXJuVGhyZXNob2xkKCk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSB0aHJlc2hvbGQgdG8gcHJldmVudCBjb2x1bW4gdmFsdWVzIGxhcmdlciB0aGFuIHRocmVzaG9sZCwgYXMgYSBzdHJpbmcgZm9ybWF0dGVkIGFzIGluLCBmb3IgZXhhbXBsZSwKKyAgICAgKiB7QGNvZGUgMTBHaUJ9LCB7QGNvZGUgMjBNaUJ9LCB7QGNvZGUgMzBLaUJ9IG9yIHtAY29kZSA0MEJ9LiBBIHtAY29kZSBudWxsfSB2YWx1ZSBtZWFucyBkaXNhYmxlZC4KKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBTdHJpbmcgZ2V0Q29sdW1uVmFsdWVTaXplRmFpbFRocmVzaG9sZCgpOworCisgICAgLyoqCisgICAgICogQHBhcmFtIHdhcm5TaXplIFRoZSB0aHJlc2hvbGQgdG8gd2FybiB3aGVuIGVuY291bnRlcmluZyBjb2x1bW4gdmFsdWVzIGxhcmdlciB0aGFuIHRocmVzaG9sZCwgYXMgYSBzdHJpbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgZm9ybWF0dGVkIGFzIGluLCBmb3IgZXhhbXBsZSwge0Bjb2RlIDEwR2lCfSwge0Bjb2RlIDIwTWlCfSwge0Bjb2RlIDMwS2lCfSBvciB7QGNvZGUgNDBCfS4KKyAgICAgKiAgICAgICAgICAgICAgICAgQSB7QGNvZGUgbnVsbH0gdmFsdWUgbWVhbnMgZGlzYWJsZWQuCisgICAgICogQHBhcmFtIGZhaWxTaXplIFRoZSB0aHJlc2hvbGQgdG8gcHJldmVudCBjb2x1bW4gdmFsdWVzIGxhcmdlciB0aGFuIHRocmVzaG9sZCwgYXMgYSBzdHJpbmcgZm9ybWF0dGVkIGFzIGluLCBmb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgZXhhbXBsZSwge0Bjb2RlIDEwR2lCfSwge0Bjb2RlIDIwTWlCfSwge0Bjb2RlIDMwS2lCfSBvciB7QGNvZGUgNDBCfS4KKyAgICAgKiAgICAgICAgICAgICAgICAgQSB7QGNvZGUgbnVsbH0gdmFsdWUgbWVhbnMgZGlzYWJsZWQuCisgICAgICovCisgICAgdm9pZCBzZXRDb2x1bW5WYWx1ZVNpemVUaHJlc2hvbGQoQE51bGxhYmxlIFN0cmluZyB3YXJuU2l6ZSwgQE51bGxhYmxlIFN0cmluZyBmYWlsU2l6ZSk7CisKKyAgICAvKioKICAgICAgKiBAcmV0dXJuIFRoZSB0aHJlc2hvbGQgdG8gd2FybiB3aGVuIGVuY291bnRlcmluZyBsYXJnZXIgc2l6ZSBvZiBjb2xsZWN0aW9uIGRhdGEgdGhhbiB0aHJlc2hvbGQsIGFzIGEgc3RyaW5nCiAgICAgICogZm9ybWF0dGVkIGFzIGluLCBmb3IgZXhhbXBsZSwge0Bjb2RlIDEwR2lCfSwge0Bjb2RlIDIwTWlCfSwge0Bjb2RlIDMwS2lCfSBvciB7QGNvZGUgNDBCfS4gIEEge0Bjb2RlIG51bGx9IHZhbHVlCiAgICAgICogbWVhbnMgdGhhdCB0aGUgdGhyZXNob2xkIGlzIGRpc2FibGVkLgpAQCAtNTIyLDIxICs2MTMsMTI1IEBACiAgICAgdm9pZCBzZXREYXRhRGlza1VzYWdlTWF4RGlza1NpemUoQE51bGxhYmxlIFN0cmluZyBzaXplKTsKIAogICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHRocmVzaG9sZCB0byB3YXJuIHdoZW4gcmVwbGljYXRpb24gZmFjdG9yIGlzIGxlc3NlciB0aHJlc2hvbGQuCisgICAgICogQHJldHVybiBUaGUgdGhyZXNob2xkIHRvIHdhcm4gd2hlbiByZXBsaWNhdGlvbiBmYWN0b3IgaXMgbGVzc2VyIHRoYW4gdGhyZXNob2xkLgogICAgICAqLwogICAgIGludCBnZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JXYXJuVGhyZXNob2xkKCk7CiAKICAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSB0aHJlc2hvbGQgdG8gZmFpbCB3aGVuIHJlcGxpY2F0aW9uIGZhY3RvciBpcyBsZXNzZXIgdGhyZXNob2xkLgorICAgICAqIEByZXR1cm4gVGhlIHRocmVzaG9sZCB0byBmYWlsIHdoZW4gcmVwbGljYXRpb24gZmFjdG9yIGlzIGxlc3NlciB0aGFuIHRocmVzaG9sZC4KICAgICAgKi8KICAgICBpbnQgZ2V0TWluaW11bVJlcGxpY2F0aW9uRmFjdG9yRmFpbFRocmVzaG9sZCgpOwogCiAgICAgLyoqCi0gICAgICogQHBhcmFtIHdhcm4gdGhlIHRocmVzaG9sZCB0byB3YXJuIHdoZW4gdGhlIG1pbmltdW0gcmVwbGljYXRpb24gZmFjdG9yIGlzIGxlc3NlciB0aGFuCi0gICAgICogICAgICAgICAgICAgdGhyZXNob2xkIC0xIG1lYW5zIGRpc2FibGVkLgotICAgICAqIEBwYXJhbSBmYWlsIHRoZSB0aHJlc2hvbGQgdG8gZmFpbCB3aGVuIHRoZSBtaW5pbXVtIHJlcGxpY2F0aW9uIGZhY3RvciBpcyBsZXNzZXIgdGhhbgotICAgICAqICAgICAgICAgICAgIHRocmVzaG9sZCAtMSBtZWFucyBkaXNhYmxlZC4KKyAgICAgKiBAcGFyYW0gd2FybiBUaGUgdGhyZXNob2xkIHRvIHdhcm4gd2hlbiB0aGUgbWluaW11bSByZXBsaWNhdGlvbiBmYWN0b3IgaXMgbGVzc2VyIHRoYW4gdGhyZXNob2xkLgorICAgICAqICAgICAgICAgICAgIC0xIG1lYW5zIGRpc2FibGVkLgorICAgICAqIEBwYXJhbSBmYWlsIFRoZSB0aHJlc2hvbGQgdG8gZmFpbCB3aGVuIHRoZSBtaW5pbXVtIHJlcGxpY2F0aW9uIGZhY3RvciBpcyBsZXNzZXIgdGhhbiB0aHJlc2hvbGQuCisgICAgICogICAgICAgICAgICAtMSBtZWFucyBkaXNhYmxlZC4KICAgICAgKi8KICAgICB2b2lkIHNldE1pbmltdW1SZXBsaWNhdGlvbkZhY3RvclRocmVzaG9sZCAoaW50IHdhcm4sIGludCBmYWlsKTsKIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIHRocmVzaG9sZCB0byBmYWlsIHdoZW4gcmVwbGljYXRpb24gZmFjdG9yIGlzIGdyZWF0ZXIgdGhhbiB0aHJlc2hvbGQuCisgICAgICovCisgICAgaW50IGdldE1heGltdW1SZXBsaWNhdGlvbkZhY3Rvcldhcm5UaHJlc2hvbGQoKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIHRocmVzaG9sZCB0byBmYWlsIHdoZW4gcmVwbGljYXRpb24gZmFjdG9yIGlzIGdyZWF0ZXIgdGhhbiB0aHJlc2hvbGQuCisgICAgICovCisgICAgaW50IGdldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvckZhaWxUaHJlc2hvbGQoKTsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSB3YXJuIFRoZSB0aHJlc2hvbGQgdG8gd2FybiB3aGVuIHRoZSBtYXhpbXVtIHJlcGxpY2F0aW9uIGZhY3RvciBpcyBncmVhdGVyIHRoYW4gdGhyZXNob2xkLgorICAgICAqICAgICAgICAgICAgIC0xIG1lYW5zIGRpc2FibGVkLgorICAgICAqIEBwYXJhbSBmYWlsIFRoZSB0aHJlc2hvbGQgdG8gZmFpbCB3aGVuIHRoZSBtYXhpbXVtIHJlcGxpY2F0aW9uIGZhY3RvciBpcyBncmVhdGVyIHRoYW4gdGhyZXNob2xkLgorICAgICAqICAgICAgICAgICAgIC0xIG1lYW5zIGRpc2FibGVkLgorICAgICAqLworICAgIHZvaWQgc2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yVGhyZXNob2xkIChpbnQgd2FybiwgaW50IGZhaWwpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHdhcm5pbmdzIHdpbGwgYmUgZW1pdHRlZCB3aGVuIHVzYWdlIG9mIDAgZGVmYXVsdCBUVEwgb24gYQorICAgICAqIHRhYmxlIHdpdGggVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneSBpcyBkZXRlY3RlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHdhcm5pbmdzIHdpbGwgYmUgZW1pdHRlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBnZXRaZXJvVFRMT25UV0NTV2FybmVkKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgd2FybmluZ3Mgd2lsbCBiZSBlbWl0dGVkIHdoZW4gdXNhZ2Ugb2YgMCBkZWZhdWx0IFRUTCBvbiBhCisgICAgICogdGFibGUgd2l0aCBUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5IGlzIGRldGVjdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHtAY29kZSB0cnVlfSBpZiB3YXJuaW5nIHdpbGwgYmUgZW1pdHRlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgdm9pZCBzZXRaZXJvVFRMT25UV0NTV2FybmVkKGJvb2xlYW4gdmFsdWUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGl0IGlzIGFsbG93ZWQgdG8gY3JlYXRlIG9yIGFsdGVyIHRhYmxlIHRvIHVzZSAwIGRlZmF1bHQgVFRMIHdpdGggVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneS4KKyAgICAgKiBJZiBpdCBpcyBub3QsIHN1Y2ggcXVlcnkgd2lsbCBmYWlsLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgMCBkZWZhdWx0IFRUTCBpcyBhbGxvd2VkIG9uIFRXQ1MgdGFibGUsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gZ2V0WmVyb1RUTE9uVFdDU0VuYWJsZWQoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB1c2VycyBjYW4gdXNlIDAgZGVmYXVsdCBUVEwgb24gYSB0YWJsZSB3aXRoIFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUge0Bjb2RlIHRydWV9IGlmIDAgZGVmYXVsdCBUVEwgb24gVFdDUyB0YWJsZXMgaXMgYWxsb3dlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgdm9pZCBzZXRaZXJvVFRMT25UV0NTRW5hYmxlZChib29sZWFuIHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIGhpZ2hlc3QgYWNjZXB0YWJsZSBkaWZmZXJlbmNlIGJldHdlZW4gbm93IGFuZCB0aGUgd3JpdHRlbiB2YWx1ZSB0aW1lc3RhbXAgYmVmb3JlIHRyaWdnZXJpbmcgYSB3YXJuaW5nLgorICAgICAqICAgICAgICAgRXhwcmVzc2VkIGFzIGEgc3RyaW5nIGZvcm1hdHRlZCBhcyBpbiwgZm9yIGV4YW1wbGUsIHtAY29kZSAxMHN9IHtAY29kZSAyMG19LCB7QGNvZGUgMzBofSBvciB7QGNvZGUgNDBkfS4KKyAgICAgKiAgICAgICAgIEEge0Bjb2RlIG51bGx9IHZhbHVlIG1lYW5zIGRpc2FibGVkLgorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIFN0cmluZyBnZXRNYXhpbXVtVGltZXN0YW1wV2FyblRocmVzaG9sZCgpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgaGlnaGVzdCBhY2NlcHRhYmxlIGRpZmZlcmVuY2UgYmV0d2VlbiBub3cgYW5kIHRoZSB3cml0dGVuIHZhbHVlIHRpbWVzdGFtcCBiZWZvcmUgdHJpZ2dlcmluZyBhIGZhaWx1cmUuCisgICAgICogICAgICAgICBFeHByZXNzZWQgYXMgYSBzdHJpbmcgZm9ybWF0dGVkIGFzIGluLCBmb3IgZXhhbXBsZSwge0Bjb2RlIDEwc30ge0Bjb2RlIDIwbX0sIHtAY29kZSAzMGh9IG9yIHtAY29kZSA0MGR9LgorICAgICAqICAgICAgICAgQSB7QGNvZGUgbnVsbH0gdmFsdWUgbWVhbnMgZGlzYWJsZWQuCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgU3RyaW5nIGdldE1heGltdW1UaW1lc3RhbXBGYWlsVGhyZXNob2xkKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB3YXJuaW5nIHVwcGVyIGJvdW5kIGZvciB1c2VyIHN1cHBsaWVkIHRpbWVzdGFtcHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2FybkR1cmF0aW9uIFRoZSBoaWdoZXN0IGFjY2VwdGFibGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG5vdyBhbmQgdGhlIHdyaXR0ZW4gdmFsdWUgdGltZXN0YW1wIGJlZm9yZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcmluZyBhIHdhcm5pbmcuIEV4cHJlc3NlZCBhcyBhIHN0cmluZyBmb3JtYXR0ZWQgYXMgaW4sIGZvciBleGFtcGxlLCB7QGNvZGUgMTBzfSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHtAY29kZSAyMG19LCB7QGNvZGUgMzBofSBvciB7QGNvZGUgNDBkfS4gQSB7QGNvZGUgbnVsbH0gdmFsdWUgbWVhbnMgZGlzYWJsZWQuCisgICAgICogQHBhcmFtIGZhaWxEdXJhdGlvbiBUaGUgaGlnaGVzdCBhY2NlcHRhYmxlIGRpZmZlcmVuY2UgYmV0d2VlbiBub3cgYW5kIHRoZSB3cml0dGVuIHZhbHVlIHRpbWVzdGFtcCBiZWZvcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJpbmcgYSBmYWlsdXJlLiBFeHByZXNzZWQgYXMgYSBzdHJpbmcgZm9ybWF0dGVkIGFzIGluLCBmb3IgZXhhbXBsZSwge0Bjb2RlIDEwc30sCisgICAgICogICAgICAgICAgICAgICAgICAgICB7QGNvZGUgMjBtfSwge0Bjb2RlIDMwaH0gb3Ige0Bjb2RlIDQwZH0uIEEge0Bjb2RlIG51bGx9IHZhbHVlIG1lYW5zIGRpc2FibGVkLgorICAgICAqLworICAgIHZvaWQgc2V0TWF4aW11bVRpbWVzdGFtcFRocmVzaG9sZChATnVsbGFibGUgU3RyaW5nIHdhcm5EdXJhdGlvbiwgQE51bGxhYmxlIFN0cmluZyBmYWlsRHVyYXRpb24pOworCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgbG93ZXN0IGFjY2VwdGFibGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG5vdyBhbmQgdGhlIHdyaXR0ZW4gdmFsdWUgdGltZXN0YW1wIGJlZm9yZSB0cmlnZ2VyaW5nIGEgd2FybmluZy4KKyAgICAgKiAgICAgICAgIEV4cHJlc3NlZCBhcyBhIHN0cmluZyBmb3JtYXR0ZWQgYXMgaW4sIGZvciBleGFtcGxlLCB7QGNvZGUgMTBzfSB7QGNvZGUgMjBtfSwge0Bjb2RlIDMwaH0gb3Ige0Bjb2RlIDQwZH0uCisgICAgICogICAgICAgICBBIHtAY29kZSBudWxsfSB2YWx1ZSBtZWFucyBkaXNhYmxlZC4KKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBTdHJpbmcgZ2V0TWluaW11bVRpbWVzdGFtcFdhcm5UaHJlc2hvbGQoKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIGxvd2VzdCBhY2NlcHRhYmxlIGRpZmZlcmVuY2UgYmV0d2VlbiBub3cgYW5kIHRoZSB3cml0dGVuIHZhbHVlIHRpbWVzdGFtcCBiZWZvcmUgdHJpZ2dlcmluZyBhIGZhaWx1cmUuCisgICAgICogICAgICAgICBFeHByZXNzZWQgYXMgYSBzdHJpbmcgZm9ybWF0dGVkIGFzIGluLCBmb3IgZXhhbXBsZSwge0Bjb2RlIDEwc30ge0Bjb2RlIDIwbX0sIHtAY29kZSAzMGh9IG9yIHtAY29kZSA0MGR9LgorICAgICAqICAgICAgICAgQSB7QGNvZGUgbnVsbH0gdmFsdWUgbWVhbnMgZGlzYWJsZWQuCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgU3RyaW5nIGdldE1pbmltdW1UaW1lc3RhbXBGYWlsVGhyZXNob2xkKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB3YXJuaW5nIGxvd2VyIGJvdW5kIGZvciB1c2VyIHN1cHBsaWVkIHRpbWVzdGFtcHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2FybkR1cmF0aW9uIFRoZSBsb3dlc3QgYWNjZXB0YWJsZSBkaWZmZXJlbmNlIGJldHdlZW4gbm93IGFuZCB0aGUgd3JpdHRlbiB2YWx1ZSB0aW1lc3RhbXAgYmVmb3JlCisgICAgICogICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyaW5nIGEgd2FybmluZy4gRXhwcmVzc2VkIGFzIGEgc3RyaW5nIGZvcm1hdHRlZCBhcyBpbiwgZm9yIGV4YW1wbGUsIHtAY29kZSAxMHN9LAorICAgICAqICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIDIwbX0sIHtAY29kZSAzMGh9IG9yIHtAY29kZSA0MGR9LiBBIHtAY29kZSBudWxsfSB2YWx1ZSBtZWFucyBkaXNhYmxlZC4KKyAgICAgKiBAcGFyYW0gZmFpbER1cmF0aW9uIFRoZSBsb3dlc3QgYWNjZXB0YWJsZSBkaWZmZXJlbmNlIGJldHdlZW4gbm93IGFuZCB0aGUgd3JpdHRlbiB2YWx1ZSB0aW1lc3RhbXAgYmVmb3JlCisgICAgICogICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyaW5nIGEgZmFpbHVyZS4gRXhwcmVzc2VkIGFzIGEgc3RyaW5nIGZvcm1hdHRlZCBhcyBpbiwgZm9yIGV4YW1wbGUsIHtAY29kZSAxMHN9LAorICAgICAqICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIDIwbX0sIHtAY29kZSAzMGh9IG9yIHtAY29kZSA0MGR9LiBBIHtAY29kZSBudWxsfSB2YWx1ZSBtZWFucyBkaXNhYmxlZC4KKyAgICAgKi8KKyAgICB2b2lkIHNldE1pbmltdW1UaW1lc3RhbXBUaHJlc2hvbGQoQE51bGxhYmxlIFN0cmluZyB3YXJuRHVyYXRpb24sIEBOdWxsYWJsZSBTdHJpbmcgZmFpbER1cmF0aW9uKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvTWF4VGhyZXNob2xkLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL01heFRocmVzaG9sZC5qYXZhCmluZGV4IGJhZGFmZjcuLjYyMDNlZTIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvTWF4VGhyZXNob2xkLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9NYXhUaHJlc2hvbGQuamF2YQpAQCAtMTksNiArMTksOCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzOwogCiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlRvTG9uZ0Z1bmN0aW9uOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CisKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNsaWVudFN0YXRlOwogCiAvKioKQEAgLTMwLDE2ICszMiwxOCBAQAogICAgICAqIENyZWF0ZXMgYSBuZXcgdGhyZXNob2xkIGd1YXJkcmFpbC4KICAgICAgKgogICAgICAqIEBwYXJhbSBuYW1lICAgICAgICAgICAgdGhlIGlkZW50aWZ5aW5nIG5hbWUgb2YgdGhlIGd1YXJkcmFpbAorICAgICAqIEBwYXJhbSByZWFzb24gICAgICAgICAgdGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSByZWFzb24gZm9yIGd1YXJkaW5nIHRoZSBvcGVyYXRpb24KICAgICAgKiBAcGFyYW0gd2FyblRocmVzaG9sZCAgIGEge0BsaW5rIENsaWVudFN0YXRlfS1iYXNlZCBwcm92aWRlciBvZiB0aGUgdmFsdWUgYWJvdmUgd2hpY2ggYSB3YXJuaW5nIHNob3VsZCBiZSB0cmlnZ2VyZWQuCiAgICAgICogQHBhcmFtIGZhaWxUaHJlc2hvbGQgICBhIHtAbGluayBDbGllbnRTdGF0ZX0tYmFzZWQgcHJvdmlkZXIgb2YgdGhlIHZhbHVlIGFib3ZlIHdoaWNoIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIGFib3J0ZWQuCiAgICAgICogQHBhcmFtIG1lc3NhZ2VQcm92aWRlciBhIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIHRoZSB3YXJuaW5nIG9yIGVycm9yIG1lc3NhZ2UgaWYgdGhlIGd1YXJkcmFpbCBpcyB0cmlnZ2VyZWQKICAgICAgKi8KICAgICBwdWJsaWMgTWF4VGhyZXNob2xkKFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyByZWFzb24sCiAgICAgICAgICAgICAgICAgICAgICAgICBUb0xvbmdGdW5jdGlvbjxDbGllbnRTdGF0ZT4gd2FyblRocmVzaG9sZCwKICAgICAgICAgICAgICAgICAgICAgICAgIFRvTG9uZ0Z1bmN0aW9uPENsaWVudFN0YXRlPiBmYWlsVGhyZXNob2xkLAogICAgICAgICAgICAgICAgICAgICAgICAgVGhyZXNob2xkLkVycm9yTWVzc2FnZVByb3ZpZGVyIG1lc3NhZ2VQcm92aWRlcikKICAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUsIHdhcm5UaHJlc2hvbGQsIGZhaWxUaHJlc2hvbGQsIG1lc3NhZ2VQcm92aWRlcik7CisgICAgICAgIHN1cGVyKG5hbWUsIHJlYXNvbiwgd2FyblRocmVzaG9sZCwgZmFpbFRocmVzaG9sZCwgbWVzc2FnZVByb3ZpZGVyKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvTWluVGhyZXNob2xkLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL01pblRocmVzaG9sZC5qYXZhCmluZGV4IDQyN2YyNzcuLjcyNzA0Y2MgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvTWluVGhyZXNob2xkLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9NaW5UaHJlc2hvbGQuamF2YQpAQCAtMTksNiArMTksOCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzOwogCiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlRvTG9uZ0Z1bmN0aW9uOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CisKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNsaWVudFN0YXRlOwogCiAvKioKQEAgLTMwLDE2ICszMiwxOCBAQAogICAgICAqIENyZWF0ZXMgYSBuZXcgbWluaW11bSB0aHJlc2hvbGQgZ3VhcmRyYWlsLgogICAgICAqCiAgICAgICogQHBhcmFtIG5hbWUgICAgICAgICAgICB0aGUgaWRlbnRpZnlpbmcgbmFtZSBvZiB0aGUgZ3VhcmRyYWlsCisgICAgICogQHBhcmFtIHJlYXNvbiAgICAgICAgICB0aGUgb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiBmb3IgZ3VhcmRpbmcgdGhlIG9wZXJhdGlvbgogICAgICAqIEBwYXJhbSB3YXJuVGhyZXNob2xkICAgYSB7QGxpbmsgQ2xpZW50U3RhdGV9LWJhc2VkIHByb3ZpZGVyIG9mIHRoZSB2YWx1ZSBhYm92ZSB3aGljaCBhIHdhcm5pbmcgc2hvdWxkIGJlIHRyaWdnZXJlZC4KICAgICAgKiBAcGFyYW0gZmFpbFRocmVzaG9sZCAgIGEge0BsaW5rIENsaWVudFN0YXRlfS1iYXNlZCBwcm92aWRlciBvZiB0aGUgdmFsdWUgYWJvdmUgd2hpY2ggdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgYWJvcnRlZC4KICAgICAgKiBAcGFyYW0gbWVzc2FnZVByb3ZpZGVyIGEgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgdGhlIHdhcm5pbmcgb3IgZXJyb3IgbWVzc2FnZSBpZiB0aGUgZ3VhcmRyYWlsIGlzIHRyaWdnZXJlZAogICAgICAqLwogICAgIHB1YmxpYyBNaW5UaHJlc2hvbGQoU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgU3RyaW5nIHJlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgIFRvTG9uZ0Z1bmN0aW9uPENsaWVudFN0YXRlPiB3YXJuVGhyZXNob2xkLAogICAgICAgICAgICAgICAgICAgICAgICAgVG9Mb25nRnVuY3Rpb248Q2xpZW50U3RhdGU+IGZhaWxUaHJlc2hvbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlc2hvbGQuRXJyb3JNZXNzYWdlUHJvdmlkZXIgbWVzc2FnZVByb3ZpZGVyKQogICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSwgd2FyblRocmVzaG9sZCwgZmFpbFRocmVzaG9sZCwgbWVzc2FnZVByb3ZpZGVyKTsKKyAgICAgICAgc3VwZXIobmFtZSwgcmVhc29uLCB3YXJuVGhyZXNob2xkLCBmYWlsVGhyZXNob2xkLCBtZXNzYWdlUHJvdmlkZXIpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9QZXJjZW50YWdlVGhyZXNob2xkLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL1BlcmNlbnRhZ2VUaHJlc2hvbGQuamF2YQppbmRleCA2Zjg2NmM2Li5jMzE2Mjc2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL1BlcmNlbnRhZ2VUaHJlc2hvbGQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL1BlcmNlbnRhZ2VUaHJlc2hvbGQuamF2YQpAQCAtMjAsNiArMjAsOCBAQAogCiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlRvTG9uZ0Z1bmN0aW9uOwogCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2xpZW50U3RhdGU7CiAKIC8qKgpAQCAtMzMsMTYgKzM1LDE4IEBACiAgICAgICogQ3JlYXRlcyBhIG5ldyB0aHJlc2hvbGQgZ3VhcmRyYWlsLgogICAgICAqCiAgICAgICogQHBhcmFtIG5hbWUgICAgICAgICAgICB0aGUgaWRlbnRpZnlpbmcgbmFtZSBvZiB0aGUgZ3VhcmRyYWlsCisgICAgICogQHBhcmFtIHJlYXNvbiAgICAgICAgICB0aGUgb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiBmb3IgZ3VhcmRpbmcgdGhlIG9wZXJhdGlvbgogICAgICAqIEBwYXJhbSB3YXJuVGhyZXNob2xkICAgYSB7QGxpbmsgQ2xpZW50U3RhdGV9LWJhc2VkIHByb3ZpZGVyIG9mIHRoZSB2YWx1ZSBhYm92ZSB3aGljaCBhIHdhcm5pbmcgc2hvdWxkIGJlIHRyaWdnZXJlZC4KICAgICAgKiBAcGFyYW0gZmFpbFRocmVzaG9sZCAgIGEge0BsaW5rIENsaWVudFN0YXRlfS1iYXNlZCBwcm92aWRlciBvZiB0aGUgdmFsdWUgYWJvdmUgd2hpY2ggdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgYWJvcnRlZC4KICAgICAgKiBAcGFyYW0gbWVzc2FnZVByb3ZpZGVyIGEgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgdGhlIHdhcm5pbmcgb3IgZXJyb3IgbWVzc2FnZSBpZiB0aGUgZ3VhcmRyYWlsIGlzIHRyaWdnZXJlZAogICAgICAqLwogICAgIHB1YmxpYyBQZXJjZW50YWdlVGhyZXNob2xkKFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBTdHJpbmcgcmVhc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvTG9uZ0Z1bmN0aW9uPENsaWVudFN0YXRlPiB3YXJuVGhyZXNob2xkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvTG9uZ0Z1bmN0aW9uPENsaWVudFN0YXRlPiBmYWlsVGhyZXNob2xkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZVByb3ZpZGVyIG1lc3NhZ2VQcm92aWRlcikKICAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUsIHdhcm5UaHJlc2hvbGQsIGZhaWxUaHJlc2hvbGQsIG1lc3NhZ2VQcm92aWRlcik7CisgICAgICAgIHN1cGVyKG5hbWUsIHJlYXNvbiwgd2FyblRocmVzaG9sZCwgZmFpbFRocmVzaG9sZCwgbWVzc2FnZVByb3ZpZGVyKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvUHJlZGljYXRlcy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9QcmVkaWNhdGVzLmphdmEKaW5kZXggMTNiZTllOS4uYWIwODU2MCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9QcmVkaWNhdGVzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9QcmVkaWNhdGVzLmphdmEKQEAgLTU2LDE2ICs1NiwxOCBAQAogICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFByZWRpY2F0ZXN9IGd1YXJkcmFpbC4KICAgICAgKgogICAgICAqIEBwYXJhbSBuYW1lICAgICAgICAgICAgIHRoZSBpZGVudGlmeWluZyBuYW1lIG9mIHRoZSBndWFyZHJhaWwKKyAgICAgKiBAcGFyYW0gcmVhc29uICAgICAgICAgICB0aGUgb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiBmb3IgZ3VhcmRpbmcgdGhlIG9wZXJhdGlvbgogICAgICAqIEBwYXJhbSB3YXJuUHJlZGljYXRlICAgIGEge0BsaW5rIENsaWVudFN0YXRlfS1iYXNlZCBwcmVkaWNhdGUgcHJvdmlkZXIgdGhhdCBpcyB1c2VkIHRvIGNoZWNrIGlmIGdpdmVuIHZhbHVlIHNob3VsZCB0cmlnZ2VyIGEgd2FybmluZy4KICAgICAgKiBAcGFyYW0gZmFpbHVyZVByZWRpY2F0ZSBhIHtAbGluayBDbGllbnRTdGF0ZX0tYmFzZWQgcHJlZGljYXRlIHByb3ZpZGVyIHRoYXQgaXMgdXNlZCB0byBjaGVjayBpZiBnaXZlbiB2YWx1ZSBzaG91bGQgdHJpZ2dlciBhIGZhaWx1cmUuCiAgICAgICogQHBhcmFtIG1lc3NhZ2VQcm92aWRlciAgYSBmdW5jdGlvbiB0byBnZW5lcmF0ZSB0aGUgd2FybmluZyBvciBlcnJvciBtZXNzYWdlIGlmIHRoZSBndWFyZHJhaWwgaXMgdHJpZ2dlcmVkCiAgICAgICovCiAgICAgUHJlZGljYXRlcyhTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgIEBOdWxsYWJsZSBTdHJpbmcgcmVhc29uLAogICAgICAgICAgICAgICAgRnVuY3Rpb248Q2xpZW50U3RhdGUsIFByZWRpY2F0ZTxUPj4gd2FyblByZWRpY2F0ZSwKICAgICAgICAgICAgICAgIEZ1bmN0aW9uPENsaWVudFN0YXRlLCBQcmVkaWNhdGU8VD4+IGZhaWx1cmVQcmVkaWNhdGUsCiAgICAgICAgICAgICAgICBNZXNzYWdlUHJvdmlkZXI8VD4gbWVzc2FnZVByb3ZpZGVyKQogICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSk7CisgICAgICAgIHN1cGVyKG5hbWUsIHJlYXNvbik7CiAgICAgICAgIHRoaXMud2FyblByZWRpY2F0ZSA9IHdhcm5QcmVkaWNhdGU7CiAgICAgICAgIHRoaXMuZmFpbHVyZVByZWRpY2F0ZSA9IGZhaWx1cmVQcmVkaWNhdGU7CiAgICAgICAgIHRoaXMubWVzc2FnZVByb3ZpZGVyID0gbWVzc2FnZVByb3ZpZGVyOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9UaHJlc2hvbGQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvVGhyZXNob2xkLmphdmEKaW5kZXggYjY3MTkwNy4uMjU3YWIwMSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9UaHJlc2hvbGQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL1RocmVzaG9sZC5qYXZhCkBAIC00MSwxNiArNDEsMTggQEAKICAgICAgKiBDcmVhdGVzIGEgbmV3IHRocmVzaG9sZCBndWFyZHJhaWwuCiAgICAgICoKICAgICAgKiBAcGFyYW0gbmFtZSAgICAgICAgICAgIHRoZSBpZGVudGlmeWluZyBuYW1lIG9mIHRoZSBndWFyZHJhaWwKKyAgICAgKiBAcGFyYW0gcmVhc29uICAgICAgICAgIHRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgcmVhc29uIGZvciBndWFyZGluZyB0aGUgb3BlcmF0aW9uCiAgICAgICogQHBhcmFtIHdhcm5UaHJlc2hvbGQgICBhIHtAbGluayBDbGllbnRTdGF0ZX0tYmFzZWQgcHJvdmlkZXIgb2YgdGhlIHZhbHVlIGFib3ZlIHdoaWNoIGEgd2FybmluZyBzaG91bGQgYmUgdHJpZ2dlcmVkLgogICAgICAqIEBwYXJhbSBmYWlsVGhyZXNob2xkICAgYSB7QGxpbmsgQ2xpZW50U3RhdGV9LWJhc2VkIHByb3ZpZGVyIG9mIHRoZSB2YWx1ZSBhYm92ZSB3aGljaCB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSBhYm9ydGVkLgogICAgICAqIEBwYXJhbSBtZXNzYWdlUHJvdmlkZXIgYSBmdW5jdGlvbiB0byBnZW5lcmF0ZSB0aGUgd2FybmluZyBvciBlcnJvciBtZXNzYWdlIGlmIHRoZSBndWFyZHJhaWwgaXMgdHJpZ2dlcmVkCiAgICAgICovCiAgICAgcHVibGljIFRocmVzaG9sZChTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBTdHJpbmcgcmVhc29uLAogICAgICAgICAgICAgICAgICAgICAgVG9Mb25nRnVuY3Rpb248Q2xpZW50U3RhdGU+IHdhcm5UaHJlc2hvbGQsCiAgICAgICAgICAgICAgICAgICAgICBUb0xvbmdGdW5jdGlvbjxDbGllbnRTdGF0ZT4gZmFpbFRocmVzaG9sZCwKICAgICAgICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZVByb3ZpZGVyIG1lc3NhZ2VQcm92aWRlcikKICAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOworICAgICAgICBzdXBlcihuYW1lLCByZWFzb24pOwogICAgICAgICB0aGlzLndhcm5UaHJlc2hvbGQgPSB3YXJuVGhyZXNob2xkOwogICAgICAgICB0aGlzLmZhaWxUaHJlc2hvbGQgPSBmYWlsVGhyZXNob2xkOwogICAgICAgICB0aGlzLm1lc3NhZ2VQcm92aWRlciA9IG1lc3NhZ2VQcm92aWRlcjsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvVmFsdWVzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL1ZhbHVlcy5qYXZhCmluZGV4IGY0NmUzYWYuLjk1MDRhM2QgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvVmFsdWVzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9WYWx1ZXMuamF2YQpAQCAtNDcsMTggKzQ3LDIwIEBACiAgICAgICogQ3JlYXRlcyBhIG5ldyB2YWx1ZXMgZ3VhcmRyYWlsLgogICAgICAqCiAgICAgICogQHBhcmFtIG5hbWUgICAgICAgICAgICAgdGhlIGlkZW50aWZ5aW5nIG5hbWUgb2YgdGhlIGd1YXJkcmFpbAorICAgICAqIEBwYXJhbSByZWFzb24gICAgICAgICAgIHRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgcmVhc29uIGZvciBndWFyZGluZyB0aGUgb3BlcmF0aW9uCiAgICAgICogQHBhcmFtIHdhcm5lZFZhbHVlcyAgICAgYSB7QGxpbmsgQ2xpZW50U3RhdGV9LWJhc2VkIHByb3ZpZGVyIG9mIHRoZSB2YWx1ZXMgZm9yIHdoaWNoIGEgd2FybmluZyBpcyB0cmlnZ2VyZWQuCiAgICAgICogQHBhcmFtIGlnbm9yZWRWYWx1ZXMgICAgYSB7QGxpbmsgQ2xpZW50U3RhdGV9LWJhc2VkIHByb3ZpZGVyIG9mIHRoZSB2YWx1ZXMgdGhhdCBhcmUgaWdub3JlZC4KICAgICAgKiBAcGFyYW0gZGlzYWxsb3dlZFZhbHVlcyBhIHtAbGluayBDbGllbnRTdGF0ZX0tYmFzZWQgcHJvdmlkZXIgb2YgdGhlIHZhbHVlcyB0aGF0IGFyZSBkaXNhbGxvd2VkLgogICAgICAqIEBwYXJhbSB3aGF0ICAgICAgICAgICAgIFRoZSBmZWF0dXJlIHRoYXQgaXMgZ3VhcmRlZCBieSB0aGlzIGd1YXJkcmFpbCAoZm9yIHJlcG9ydGluZyBpbiBlcnJvciBtZXNzYWdlcykuCiAgICAgICovCiAgICAgcHVibGljIFZhbHVlcyhTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBTdHJpbmcgcmVhc29uLAogICAgICAgICAgICAgICAgICAgRnVuY3Rpb248Q2xpZW50U3RhdGUsIFNldDxUPj4gd2FybmVkVmFsdWVzLAogICAgICAgICAgICAgICAgICAgRnVuY3Rpb248Q2xpZW50U3RhdGUsIFNldDxUPj4gaWdub3JlZFZhbHVlcywKICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uPENsaWVudFN0YXRlLCBTZXQ8VD4+IGRpc2FsbG93ZWRWYWx1ZXMsCiAgICAgICAgICAgICAgICAgICBTdHJpbmcgd2hhdCkKICAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOworICAgICAgICBzdXBlcihuYW1lLCByZWFzb24pOwogICAgICAgICB0aGlzLndhcm5lZFZhbHVlcyA9IHdhcm5lZFZhbHVlczsKICAgICAgICAgdGhpcy5pZ25vcmVkVmFsdWVzID0gaWdub3JlZFZhbHVlczsKICAgICAgICAgdGhpcy5kaXNhbGxvd2VkVmFsdWVzID0gZGlzYWxsb3dlZFZhbHVlczsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9IZWxwZXJzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvSGVscGVycy5qYXZhCmluZGV4IDhlMGQ1MTQuLjEzNGJlZWMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9IZWxwZXJzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL0hlbHBlcnMuamF2YQpAQCAtMTcsMTYgKzE3LDI3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlOwogCi1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC4qOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKIAotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZXMuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGVzLmFuZDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGVzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlZGljYXRlcy5pbjsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGVzLm5vdDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGVzLm9yOwogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlcy5hbnk7CiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLmNvbmNhdDsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXMuZmlsdGVyOwpAQCAtNTAsNyArNjEsNyBAQAogICAgICAqIHJlYWxseSBwcmVzZW50LCBhbmQgdGhhdCB0aGUgaXRlbXMgdG8gYWRkIGFyZSBub3QgKHVubGVzcyB3ZSdyZSBhbHNvIHJlbW92aW5nIHRoZW0pCiAgICAgICogQHJldHVybiBhIG5ldyBpZGVudGl0eSBtYXAgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIHByb3ZpZGVkIG9uZSBtb2RpZmllZAogICAgICAqLwotICAgIHN0YXRpYyA8VD4gTWFwPFQsIFQ+IHJlcGxhY2UoTWFwPFQsIFQ+IG9yaWdpbmFsLCBTZXQ8VD4gcmVtb3ZlLCBJdGVyYWJsZTxUPiBhZGQpCisgICAgc3RhdGljIDxUPiBNYXA8VCwgVD4gcmVwbGFjZShNYXA8VCwgVD4gb3JpZ2luYWwsIFNldDw/IGV4dGVuZHMgVD4gcmVtb3ZlLCBJdGVyYWJsZTw/IGV4dGVuZHMgVD4gYWRkKQogICAgIHsKICAgICAgICAgLy8gZW5zdXJlIHRoZSBvbmVzIGJlaW5nIHJlbW92ZWQgYXJlIHRoZSBleGFjdCBzYW1lIG9uZXMgcHJlc2VudAogICAgICAgICBmb3IgKFQgcmVhZGVyIDogcmVtb3ZlKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL0xpZmVjeWNsZVRyYW5zYWN0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvTGlmZWN5Y2xlVHJhbnNhY3Rpb24uamF2YQppbmRleCBkM2YzYTFlLi43Y2ZmNTdkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvTGlmZWN5Y2xlVHJhbnNhY3Rpb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvTGlmZWN5Y2xlVHJhbnNhY3Rpb24uamF2YQpAQCAtMTgsMzMgKzE4LDU0IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZTsKIAogaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpUHJlZGljYXRlOworCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlci5VbmlxdWVJZGVudGlmaWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuVHJhbnNhY3Rpb25hbDsKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9ucy5jb21wb3NlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZXMuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGVzLmluOwogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldC5jb3B5T2Y7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLio7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLmNvbmNhdDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXMuZ2V0Rmlyc3Q7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLnRyYW5zZm9ybTsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbGxlY3Rpb25zLnNpbmdsZXRvbjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkhlbHBlcnMuKjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkhlbHBlcnMuYWJvcnRPYnNvbGV0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuSGVscGVycy5jaGVja05vdFJlcGxhY2VkOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuSGVscGVycy5jb25jYXRVbmlxOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuSGVscGVycy5lbXB0eVNldDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkhlbHBlcnMuZmlsdGVySW47CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5IZWxwZXJzLmZpbHRlck91dDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkhlbHBlcnMubWFya09ic29sZXRlOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuSGVscGVycy5vckluOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuSGVscGVycy5wcmVwYXJlRm9yT2Jzb2xldGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkhlbHBlcnMuc2VsZWN0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuSGVscGVycy5zZWxlY3RGaXJzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkhlbHBlcnMuc2V0UmVwbGFjZWQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5WaWV3LnVwZGF0ZUNvbXBhY3Rpbmc7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5WaWV3LnVwZGF0ZUxpdmVTZXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRocm93YWJsZXMubWF5YmVGYWlsOwpAQCAtMTYwLDEyICsxODEsMTIgQEAKICAgICB9CiAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBsb2cgY2xvc2VkIGR1cmluZyBwb3N0Q2xlYW51cAotICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uKFRyYWNrZXIgdHJhY2tlciwgT3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlLCBJdGVyYWJsZTxTU1RhYmxlUmVhZGVyPiByZWFkZXJzKQorICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uKFRyYWNrZXIgdHJhY2tlciwgT3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlLCBJdGVyYWJsZTw/IGV4dGVuZHMgU1NUYWJsZVJlYWRlcj4gcmVhZGVycykKICAgICB7CiAgICAgICAgIHRoaXModHJhY2tlciwgbmV3IExvZ1RyYW5zYWN0aW9uKG9wZXJhdGlvblR5cGUsIHRyYWNrZXIpLCByZWFkZXJzKTsKICAgICB9CiAKLSAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbihUcmFja2VyIHRyYWNrZXIsIExvZ1RyYW5zYWN0aW9uIGxvZywgSXRlcmFibGU8U1NUYWJsZVJlYWRlcj4gcmVhZGVycykKKyAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbihUcmFja2VyIHRyYWNrZXIsIExvZ1RyYW5zYWN0aW9uIGxvZywgSXRlcmFibGU8PyBleHRlbmRzIFNTVGFibGVSZWFkZXI+IHJlYWRlcnMpCiAgICAgewogICAgICAgICB0aGlzLnRyYWNrZXIgPSB0cmFja2VyOwogICAgICAgICB0aGlzLmxvZyA9IGxvZzsKQEAgLTQ1Niw3ICs0NzcsNyBAQAogICAgIHByaXZhdGUgTGlzdDxTU1RhYmxlUmVhZGVyPiByZXN0b3JlVXBkYXRlZE9yaWdpbmFscygpCiAgICAgewogICAgICAgICBJdGVyYWJsZTxTU1RhYmxlUmVhZGVyPiB0b3Jlc3RvcmUgPSBmaWx0ZXJJbihvcmlnaW5hbHMsIGxvZ2dlZC51cGRhdGUsIGxvZ2dlZC5vYnNvbGV0ZSk7Ci0gICAgICAgIHJldHVybiBJbW11dGFibGVMaXN0LmNvcHlPZih0cmFuc2Zvcm0odG9yZXN0b3JlLCAocmVhZGVyKSAtPiBjdXJyZW50KHJlYWRlcikuY2xvbmVXaXRoUmVzdG9yZWRTdGFydChyZWFkZXIuZmlyc3QpKSk7CisgICAgICAgIHJldHVybiBJbW11dGFibGVMaXN0LmNvcHlPZih0cmFuc2Zvcm0odG9yZXN0b3JlLCAocmVhZGVyKSAtPiBjdXJyZW50KHJlYWRlcikuY2xvbmVXaXRoUmVzdG9yZWRTdGFydChyZWFkZXIuZ2V0Rmlyc3QoKSkpKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9Mb2dGaWxlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvTG9nRmlsZS5qYXZhCmluZGV4IDExZTNmZmIuLmFiZmI1NWEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9Mb2dGaWxlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL0xvZ0ZpbGUuamF2YQpAQCAtMjEsMjQgKzIxLDM0IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZTsKIAogaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTmF2aWdhYmxlU2V0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlsczsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxvZ1JlY29yZC5UeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKIApAQCAtNjEsOCArNzEsMTAgQEAKIAogICAgIHN0YXRpYyBTdHJpbmcgRVhUID0gIi5sb2ciOwogICAgIHN0YXRpYyBjaGFyIFNFUCA9ICdfJzsKLSAgICAvLyBjY190eG5fb3BuYW1lX2lkLmxvZyAod2hlcmUgY2MgaXMgb25lIG9mIHRoZSBzc3RhYmxlIHZlcnNpb25zIGRlZmluZWQgaW4gQmlnVmVyc2lvbikKLSAgICBzdGF0aWMgUGF0dGVybiBGSUxFX1JFR0VYID0gUGF0dGVybi5jb21waWxlKFN0cmluZy5mb3JtYXQoIl4oLnsyfSlfdHhuXyguKilfKC4qKSVzJCIsIEVYVCkpOworICAgIC8vIExvZyBmaWxlIG5hbWUgZm9ybWF0OgorICAgIC8vIGxlZ2FjeSBmb3IgQklHIGZvcm1hdDogY2NfdHhuX29wbmFtZV9pZC5sb2cgKHdoZXJlIGNjIGlzIG9uZSBvZiB0aGUgc3N0YWJsZSB2ZXJzaW9ucyBkZWZpbmVkIGluIEJpZ1ZlcnNpb24pCisgICAgLy8gb3RoZXIgZm9ybWF0czogZm10LWNjX3R4bl9vcG5hbWVfaWQubG9nICh3aGVyZSBmbXQgaXMgdGhlIGZvcm1hdCBhbmQgbmFtZSBhbmQgY2MgaXMgb25lIG9mIGl0cyB2ZXJzaW9ucykKKyAgICBzdGF0aWMgUGF0dGVybiBGSUxFX1JFR0VYID0gUGF0dGVybi5jb21waWxlKFN0cmluZy5mb3JtYXQoIl4oKD86W2Etel0rLSk/LnsyfV8pP3R4bl8oLiopXyguKiklcyQiLCBFWFQpKTsKIAogICAgIC8vIEEgc2V0IG9mIHBoeXNpY2FsIGZpbGVzIG9uIGRpc2ssIGVhY2ggZmlsZSBpcyBhbiBpZGVudGljYWwgcmVwbGljYQogICAgIHByaXZhdGUgZmluYWwgTG9nUmVwbGljYVNldCByZXBsaWNhcyA9IG5ldyBMb2dSZXBsaWNhU2V0KCk7CkBAIC03Nyw2ICs4OSw4IEBACiAgICAgLy8gVGhlIHVuaXF1ZSBpZCBvZiB0aGUgdHJhbnNhY3Rpb24KICAgICBwcml2YXRlIGZpbmFsIFRpbWVVVUlEIGlkOwogCisgICAgcHJpdmF0ZSBmaW5hbCBWZXJzaW9uIHZlcnNpb24gPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkuZ2V0TGF0ZXN0VmVyc2lvbigpOworCiAgICAgc3RhdGljIExvZ0ZpbGUgbWFrZShGaWxlIGxvZ1JlcGxpY2EpCiAgICAgewogICAgICAgICByZXR1cm4gbWFrZShsb2dSZXBsaWNhLm5hbWUoKSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChsb2dSZXBsaWNhKSk7CkBAIC00OTYsMTggKzUxMCwxNyBAQAogCiAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZU5hbWUoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLmpvaW4oQmlnRm9ybWF0LmxhdGVzdFZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ0ZpbGUuU0VQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHhuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nRmlsZS5TRVAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ0ZpbGUuU0VQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZC50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dGaWxlLkVYVCk7CisgICAgICAgIC8vIEZvciBwcmUtNS4wIHZlcnNpb25zLCBvbmx5IEJpZ0Zvcm1hdCBpcyBzdXBwb3J0ZWQsIGFuZCB0aGUgZmlsZSBuYW1lIGluY2x1ZGVzIG9ubHkgdGhlIHZlcnNpb24gc3RyaW5nLgorICAgICAgICAvLyBUbyByZXRhaW4gdGhlIGFiaWxpdHkgdG8gZG93bmdyYWRlIHRvIDQueCwgd2Uga2VlcCB0aGUgb2xkIGZpbGUgbmFtaW5nIHNjaGVtZSBmb3IgQmlnRm9ybWF0IHNzdGFibGVzCisgICAgICAgIC8vIGFuZCBhZGQgZm9ybWF0IG5hbWVzIGZvciBvdGhlciBmb3JtYXRzIGFzIHRoZXkgYXJlIHN1cHBvcnRlZCBvbmx5IGluIDUuMCBhbmQgYWJvdmUuCisgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5qb2luKEJpZ0Zvcm1hdC5pcyh2ZXJzaW9uLmZvcm1hdCkgPyB2ZXJzaW9uLnRvU3RyaW5nKCkgOiB2ZXJzaW9uLnRvRm9ybWF0QW5kVmVyc2lvblN0cmluZygpLCBMb2dGaWxlLlNFUCwgLy8gcmVtb3ZlIHZlcnNpb24gYW5kIHNlcGFyYXRvciB3aGVuIGRvd25ncmFkaW5nIHRvIDQueCBpcyBiZWNvbWVzIHVuc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eG4iLCBMb2dGaWxlLlNFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5maWxlTmFtZSwgTG9nRmlsZS5TRVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLnRvU3RyaW5nKCksIExvZ0ZpbGUuRVhUKTsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKICAgICB7CiAgICAgICAgIHJldHVybiByZWNvcmRzLmlzRW1wdHkoKTsKICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL0xvZ1JlY29yZC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL0xvZ1JlY29yZC5qYXZhCmluZGV4IDQ1NjUzYzQuLjM0ZmQwZGEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9Mb2dSZWNvcmQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvTG9nUmVjb3JkLmphdmEKQEAgLTIyLDcgKzIyLDE2IEBACiAKIAogaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpUHJlZGljYXRlOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwpAQCAtMTUyLDcgKzE2MSw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIExvZ1JlY29yZCBtYWtlKFR5cGUgdHlwZSwgU1NUYWJsZSB0YWJsZSkKICAgICB7Ci0gICAgICAgIFN0cmluZyBhYnNvbHV0ZVRhYmxlUGF0aCA9IGFic29sdXRlUGF0aCh0YWJsZS5kZXNjcmlwdG9yLmJhc2VGaWxlbmFtZSgpKTsKKyAgICAgICAgU3RyaW5nIGFic29sdXRlVGFibGVQYXRoID0gYWJzb2x1dGVQYXRoKHRhYmxlLmRlc2NyaXB0b3IuYmFzZUZpbGUoKSk7CiAgICAgICAgIHJldHVybiBtYWtlKHR5cGUsIGdldEV4aXN0aW5nRmlsZXMoYWJzb2x1dGVUYWJsZVBhdGgpLCB0YWJsZS5nZXRBbGxGaWxlUGF0aHMoKS5zaXplKCksIGFic29sdXRlVGFibGVQYXRoKTsKICAgICB9CiAKQEAgLTE2MSw3ICsxNzAsNyBAQAogICAgICAgICAvLyBjb250YWlucyBhIG1hcHBpbmcgZnJvbSBzc3RhYmxlIGFic29sdXRlIHBhdGggKGV2ZXJ5dGhpbmcgdXAgdW50aWwgdGhlICdEYXRhJy8nSW5kZXgnL2V0YyBwYXJ0IG9mIHRoZSBmaWxlbmFtZSkgdG8gdGhlIHNzdGFibGUKICAgICAgICAgTWFwPFN0cmluZywgU1NUYWJsZT4gYWJzb2x1dGVQYXRocyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHRhYmxlIDogdGFibGVzKQotICAgICAgICAgICAgYWJzb2x1dGVQYXRocy5wdXQoYWJzb2x1dGVQYXRoKHRhYmxlLmRlc2NyaXB0b3IuYmFzZUZpbGVuYW1lKCkpLCB0YWJsZSk7CisgICAgICAgICAgICBhYnNvbHV0ZVBhdGhzLnB1dChhYnNvbHV0ZVBhdGgodGFibGUuZGVzY3JpcHRvci5iYXNlRmlsZSgpKSwgdGFibGUpOwogCiAgICAgICAgIC8vIG1hcHMgc3N0YWJsZSBiYXNlIGZpbGUgbmFtZSB0byB0aGUgYWN0dWFsIGZpbGVzIG9uIGRpc2sKICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxGaWxlPj4gZXhpc3RpbmdGaWxlcyA9IGdldEV4aXN0aW5nRmlsZXMoYWJzb2x1dGVQYXRocy5rZXlTZXQoKSk7CkBAIC0xNzYsOSArMTg1LDkgQEAKICAgICAgICAgcmV0dXJuIHJlY29yZHM7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFic29sdXRlUGF0aChTdHJpbmcgYmFzZUZpbGVuYW1lKQorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhYnNvbHV0ZVBhdGgoRmlsZSBiYXNlRmlsZSkKICAgICB7Ci0gICAgICAgIHJldHVybiBGaWxlVXRpbHMuZ2V0Q2Fub25pY2FsUGF0aChiYXNlRmlsZW5hbWUgKyBDb21wb25lbnQuc2VwYXJhdG9yKTsKKyAgICAgICAgcmV0dXJuIGJhc2VGaWxlLndpdGhTdWZmaXgoU3RyaW5nLnZhbHVlT2YoQ29tcG9uZW50LnNlcGFyYXRvcikpLmNhbm9uaWNhbFBhdGgoKTsKICAgICB9CiAKICAgICBwdWJsaWMgTG9nUmVjb3JkIHdpdGhFeGlzdGluZ0ZpbGVzKExpc3Q8RmlsZT4gZXhpc3RpbmdGaWxlcykKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9Mb2dSZXBsaWNhLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvTG9nUmVwbGljYS5qYXZhCmluZGV4IDFlYThiODMuLjA3M2FjN2MgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9Mb2dSZXBsaWNhLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL0xvZ1JlcGxpY2EuamF2YQpAQCAtMjMsNiArMjMsNyBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CkBAIC01OCw3ICs1OSwxNiBAQAogICAgIHsKICAgICAgICAgaW50IGZvbGRlckZEID0gTmF0aXZlTGlicmFyeS50cnlPcGVuRGlyZWN0b3J5KGRpcmVjdG9yeS5wYXRoKCkpOwogICAgICAgICBpZiAoZm9sZGVyRkQgPT0gLTEgICYmIFJFUVVJUkVfRkQpCi0gICAgICAgICAgICB0aHJvdyBuZXcgRlNSZWFkRXJyb3IobmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkludmFsaWQgZm9sZGVyIGRlc2NyaXB0b3IgdHJ5aW5nIHRvIGNyZWF0ZSBsb2cgcmVwbGljYSAlcyIsIGRpcmVjdG9yeS5wYXRoKCkpKSwgZGlyZWN0b3J5LnBhdGgoKSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChEYXRhYmFzZURlc2NyaXB0b3IuaXNDbGllbnRJbml0aWFsaXplZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJJbnZhbGlkIGZvbGRlciBkZXNjcmlwdG9yIHRyeWluZyB0byBjcmVhdGUgbG9nIHJlcGxpY2Ege30uIENvbnRpbnVpbmcgd2l0aG91dCBOYXRpdmUgSS9PIHN1cHBvcnQuIiwgZGlyZWN0b3J5LnBhdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZTUmVhZEVycm9yKG5ldyBJT0V4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJJbnZhbGlkIGZvbGRlciBkZXNjcmlwdG9yIHRyeWluZyB0byBjcmVhdGUgbG9nIHJlcGxpY2EgJXMiLCBkaXJlY3RvcnkucGF0aCgpKSksIGRpcmVjdG9yeS5wYXRoKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIG5ldyBMb2dSZXBsaWNhKG5ldyBGaWxlKGZpbGVOYW1lKSwgZm9sZGVyRkQpOwogICAgIH0KQEAgLTY3LDcgKzc3LDE2IEBACiAgICAgewogICAgICAgICBpbnQgZm9sZGVyRkQgPSBOYXRpdmVMaWJyYXJ5LnRyeU9wZW5EaXJlY3RvcnkoZmlsZS5wYXJlbnQoKS5wYXRoKCkpOwogICAgICAgICBpZiAoZm9sZGVyRkQgPT0gLTEpCi0gICAgICAgICAgICB0aHJvdyBuZXcgRlNSZWFkRXJyb3IobmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkludmFsaWQgZm9sZGVyIGRlc2NyaXB0b3IgdHJ5aW5nIHRvIGNyZWF0ZSBsb2cgcmVwbGljYSAlcyIsIGZpbGUucGFyZW50KCkucGF0aCgpKSksIGZpbGUucGFyZW50KCkucGF0aCgpKTsKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKERhdGFiYXNlRGVzY3JpcHRvci5pc0NsaWVudEluaXRpYWxpemVkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIkludmFsaWQgZm9sZGVyIGRlc2NyaXB0b3IgdHJ5aW5nIHRvIGNyZWF0ZSBsb2cgcmVwbGljYSB7fS4gQ29udGludWluZyB3aXRob3V0IE5hdGl2ZSBJL08gc3VwcG9ydC4iLCBmaWxlLnBhcmVudFBhdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZTUmVhZEVycm9yKG5ldyBJT0V4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJJbnZhbGlkIGZvbGRlciBkZXNjcmlwdG9yIHRyeWluZyB0byBjcmVhdGUgbG9nIHJlcGxpY2EgJXMiLCBmaWxlLnBhcmVudCgpLnBhdGgoKSkpLCBmaWxlLnBhcmVudCgpLnBhdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gbmV3IExvZ1JlcGxpY2EoZmlsZSwgZm9sZGVyRkQpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9Mb2dUcmFuc2FjdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL0xvZ1RyYW5zYWN0aW9uLmphdmEKaW5kZXggZjIwM2JkOC4uNmQyNDg3NCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL0xvZ1RyYW5zYWN0aW9uLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL0xvZ1RyYW5zYWN0aW9uLmphdmEKQEAgLTIyLDE1ICsyMiwyMCBAQAogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLm5pby5maWxlLk5vU3VjaEZpbGVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlF1ZXVlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRMaW5rZWRRdWV1ZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOwogCi1pbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuQ291bnRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuUnVubmFibGVzOwogCitpbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuQ291bnRlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCkBAIC00MSwxNSArNDYsMTcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxvZ1JlY29yZC5UeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTV3JpdGVFcnJvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlJlZjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlJlZkNvdW50ZWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5UcmFuc2FjdGlvbmFsOwpAQCAtMzg3LDE4ICszOTQsMTQgQEAKICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGNhbid0IHN1Y2Nlc3NmdWxseSBkZWxldGUgdGhlIERBVEEgY29tcG9uZW50LCBzZXQgdGhlIHRhc2sgdG8gYmUgcmV0cmllZCBsYXRlcjogc2VlIFRyYW5zYWN0aW9uVGlkaWVyCi0gICAgICAgICAgICAgICAgICAgIEZpbGUgZGF0YWZpbGUgPSBuZXcgRmlsZShkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSk7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJUaWRpZXIgcnVubmluZyBmb3Igb2xkIHNzdGFibGUge30iLCBkZXNjLmJhc2VGaWxlbmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiVGlkaWVyIHJ1bm5pbmcgZm9yIG9sZCBzc3RhYmxlIHt9IiwgZGVzYyk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFmaWxlLmV4aXN0cygpKQotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlKGRhdGFmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXdhc05ldykKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXNjLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKS5leGlzdHMoKSAmJiAhd2FzTmV3KQogICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJTU1RhYmxlVGlkaWVyIHJhbiB3aXRoIG5vIGV4aXN0aW5nIGRhdGEgZmlsZSBmb3IgYW4gc3N0YWJsZSB0aGF0IHdhcyBub3QgbmV3Iik7CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gbGV0IHRoZSByZW1haW5kZXIgYmUgY2xlYW5lZCB1cCBieSBkZWxldGUKLSAgICAgICAgICAgICAgICAgICAgU1NUYWJsZS5kZWxldGUoZGVzYywgU1NUYWJsZS5kaXNjb3ZlckNvbXBvbmVudHNGb3IoZGVzYykpOworICAgICAgICAgICAgICAgICAgICBkZXNjLmdldEZvcm1hdCgpLmRlbGV0ZShkZXNjKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQogICAgICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9UcmFja2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvVHJhY2tlci5qYXZhCmluZGV4IGFiOGE3NGIuLmM1NGVlODMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9UcmFja2VyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL1RyYWNrZXIuamF2YQpAQCAtMTcsNyArMTcsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGU7CiAKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CiAKQEAgLTI1LDIzICsyOSwzNCBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGU7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGVzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuKjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpcmVjdG9yaWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLk1lbXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZy5Db21taXRMb2dQb3NpdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpcmVjdG9yaWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZy5Db21taXRMb2dQb3NpdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuTWVtdGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLlN0YXRzTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuU3RvcmFnZU1ldHJpY3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5vdGlmaWNhdGlvbnMuSU5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLklOb3RpZmljYXRpb25Db25zdW1lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLkluaXRpYWxTU1RhYmxlQWRkZWROb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5NZW10YWJsZURpc2NhcmRlZE5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLk1lbXRhYmxlUmVuZXdlZE5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLk1lbXRhYmxlU3dpdGNoZWROb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5TU1RhYmxlQWRkZWROb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5TU1RhYmxlRGVsZXRpbmdOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5TU1RhYmxlTGlzdENoYW5nZWROb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5TU1RhYmxlTWV0YWRhdGFDaGFuZ2VkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5vdGlmaWNhdGlvbnMuU1NUYWJsZVJlcGFpclN0YXR1c0NoYW5nZWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5UcnVuY2F0aW9uTm90aWZpY2F0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50Lk9wT3JkZXI7CkBAIC01MSw3ICs2NiwxMSBAQAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlcy5maWx0ZXI7CiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5Db2xsZWN0aW9ucy5zaW5nbGV0b247CiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5Db2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0OwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuSGVscGVycy4qOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuSGVscGVycy5hYm9ydE9ic29sZXRpb247CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5IZWxwZXJzLm1hcmtPYnNvbGV0ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkhlbHBlcnMubm90SW47CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5IZWxwZXJzLnByZXBhcmVGb3JPYnNvbGV0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuSGVscGVycy5zZXR1cE9ubGluZTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLlZpZXcucGVybWl0Q29tcGFjdGluZzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLlZpZXcudXBkYXRlQ29tcGFjdGluZzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLlZpZXcudXBkYXRlTGl2ZVNldDsKQEAgLTk5LDcgKzExOCw3IEBACiAgICAgLyoqCiAgICAgICogQHJldHVybiBhIFRyYW5zYWN0aW9uIG92ZXIgdGhlIHByb3ZpZGVkIHNzdGFibGVzIGlmIHdlIGFyZSBhYmxlIHRvIG1hcmsgdGhlIGdpdmVuIEBwYXJhbSBzc3RhYmxlcyBhcyBjb21wYWN0ZWQsIGJlZm9yZSBhbnlvbmUgZWxzZQogICAgICAqLwotICAgIHB1YmxpYyBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0cnlNb2RpZnkoSXRlcmFibGU8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUgb3BlcmF0aW9uVHlwZSkKKyAgICBwdWJsaWMgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHJ5TW9kaWZ5KEl0ZXJhYmxlPD8gZXh0ZW5kcyBTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcywgT3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlKQogICAgIHsKICAgICAgICAgaWYgKEl0ZXJhYmxlcy5pc0VtcHR5KHNzdGFibGVzKSkKICAgICAgICAgICAgIHJldHVybiBuZXcgTGlmZWN5Y2xlVHJhbnNhY3Rpb24odGhpcywgb3BlcmF0aW9uVHlwZSwgc3N0YWJsZXMpOwpAQCAtMTUyLDYgKzE3MSw4IEBACiAgICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0ZTsKIAogICAgICAgICBsb25nIGFkZCA9IDA7CisgICAgICAgIGxvbmcgYWRkVW5jb21wcmVzc2VkID0gMDsKKwogICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IG5ld1NTVGFibGVzKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCkBAIC0xNTksMTMgKzE4MCwxNyBAQAogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYWRkICs9IHNzdGFibGUuYnl0ZXNPbkRpc2soKTsKKyAgICAgICAgICAgICAgICBhZGRVbmNvbXByZXNzZWQgKz0gc3N0YWJsZS5sb2dpY2FsQnl0ZXNPbkRpc2soKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlID0gbWVyZ2UoYWNjdW11bGF0ZSwgdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKwogICAgICAgICBsb25nIHN1YnRyYWN0ID0gMDsKKyAgICAgICAgbG9uZyBzdWJ0cmFjdFVuY29tcHJlc3NlZCA9IDA7CisKICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBvbGRTU1RhYmxlcykKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQpAQCAtMTczLDYgKzE5OCw3IEBACiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBzdWJ0cmFjdCArPSBzc3RhYmxlLmJ5dGVzT25EaXNrKCk7CisgICAgICAgICAgICAgICAgc3VidHJhY3RVbmNvbXByZXNzZWQgKz0gc3N0YWJsZS5sb2dpY2FsQnl0ZXNPbkRpc2soKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKICAgICAgICAgICAgIHsKQEAgLTE4MSw3ICsyMDcsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIFN0b3JhZ2VNZXRyaWNzLmxvYWQuaW5jKGFkZCAtIHN1YnRyYWN0KTsKKyAgICAgICAgU3RvcmFnZU1ldHJpY3MudW5jb21wcmVzc2VkTG9hZC5pbmMoYWRkVW5jb21wcmVzc2VkIC0gc3VidHJhY3RVbmNvbXByZXNzZWQpOworCiAgICAgICAgIGNmc3RvcmUubWV0cmljLmxpdmVEaXNrU3BhY2VVc2VkLmluYyhhZGQgLSBzdWJ0cmFjdCk7CisgICAgICAgIGNmc3RvcmUubWV0cmljLnVuY29tcHJlc3NlZExpdmVEaXNrU3BhY2VVc2VkLmluYyhhZGRVbmNvbXByZXNzZWQgLSBzdWJ0cmFjdFVuY29tcHJlc3NlZCk7CiAKICAgICAgICAgLy8gd2UgZG9uJ3Qgc3VidHJhY3QgZnJvbSB0b3RhbCB1bnRpbCB0aGUgc3N0YWJsZSBpcyBkZWxldGVkLCBzZWUgVHJhbnNhY3Rpb25Mb2dzLlNTVGFibGVUaWRpZXIKICAgICAgICAgY2ZzdG9yZS5tZXRyaWMudG90YWxEaXNrU3BhY2VVc2VkLmluYyhhZGQpOwpAQCAtNDA4LDcgKzQzNyw3IEBACiAKICAgICBwdWJsaWMgdm9pZCBtYXliZUluY3JlbWVudGFsbHlCYWNrdXAoZmluYWwgSXRlcmFibGU8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMpCiAgICAgewotICAgICAgICBpZiAoIURhdGFiYXNlRGVzY3JpcHRvci5pc0luY3JlbWVudGFsQmFja3Vwc0VuYWJsZWQoKSkKKyAgICAgICAgaWYgKCFjZnN0b3JlLmlzVGFibGVJbmNyZW1lbnRhbEJhY2t1cHNFbmFibGVkKCkpCiAgICAgICAgICAgICByZXR1cm47CiAKICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcykKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9WaWV3LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvVmlldy5qYXZhCmluZGV4IDk1OGJjMGQuLmIyMzhkMjQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9WaWV3LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL1ZpZXcuamF2YQpAQCAtMTcsMTcgKzE3LDIyIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlOwogCi1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbnM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC4qOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZS5NZW10YWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5QYXJ0aXRpb25Qb3NpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZS5NZW10YWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQWJzdHJhY3RCb3VuZHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5JbnRlcnZhbDsKQEAgLTEzNiwxMyArMTQxLDMwIEBACiAgICAgICAgICAgICBjYXNlIE5PTkNPTVBBQ1RJTkc6CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlcihzc3RhYmxlcywgKHMpIC0+ICFjb21wYWN0aW5nLmNvbnRhaW5zKHMpKTsKICAgICAgICAgICAgIGNhc2UgQ0FOT05JQ0FMOgorICAgICAgICAgICAgICAgIC8vIFdoZW4gZWFybHkgb3BlbiBpcyBub3QgaW4gcGxheSwgdGhlIExJVkUgYW5kIENBTk9OSUNBTCBzZXRzIGFyZSB0aGUgc2FtZS4KKyAgICAgICAgICAgICAgICAvLyBIb3dldmVyLCB3aGVuIHdlIGRvIGhhdmUgZWFybHktb3BlbiBzc3RhYmxlcywgd2Ugd2lsbCBoYXZlIHNvbWUgdW5maW5pc2hlZCBzb3VyY2VzIGluIHRoZSBsaXZlIHNldC4KKyAgICAgICAgICAgICAgICAvLyBGb3IgdGhlc2Ugc291cmNlcyB3ZSBuZWVkIHRvIGV4dHJhY3QgdGhlIG9yaWdpbmFscywgaW4gdGhlaXIgbm9uLW1vdmVkLXN0YXJ0IHZlcnNpb25zLCBmcm9tIHRoZQorICAgICAgICAgICAgICAgIC8vIGNvbXBhY3Rpbmcgc2V0LgorICAgICAgICAgICAgICAgIC8vIFRoaXMgY3JlYXRlcyBhIHByb2JsZW0gd2hlbiB0aGUgY29tcGFjdGlvbiBjb21wbGV0ZXMsIGFzIHRoZW4gYm90aDoKKyAgICAgICAgICAgICAgICAvLyAtIHRoZSBzb3VyY2UgaXMgaW4gdGhlIGNvbXBhY3Rpbmcgc2V0CisgICAgICAgICAgICAgICAgLy8gLSB0aGUgcmVzdWx0IGlzIGluIHRoZSBsaXZlIHNldAorICAgICAgICAgICAgICAgIC8vIFRoaXMgY3VycmVudGx5IGNhdXNlcyB0aGUgQ0FOT05JQ0FMIHNldCB0byByZXR1cm4gYm90aCBzb3VyY2UgYW5kIHJlc3VsdCB3aGVuIGVhcmx5LW9wZW4gaXMgZGlzYWJsZWQsCisgICAgICAgICAgICAgICAgLy8gYW5kIGlzIG90aGVyd2lzZSB3b3JrZWQgYXJvdW5kIGJ5IG9wZW5pbmcgZWFybHkgdGhlIGxhc3Qgc3N0YWJsZSBpbiB0aGUgcmVzdWx0IHNldCAod2hpY2ggcHVzaGVzIGl0CisgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNvbXBhY3Rpbmcgc2V0IHdpdGggRUFSTFkgb3BlblJlYXNvbikgYW5kIHRoZSAhY29tcGFjdGluZy5jb250YWlucyhzc3RhYmxlKSBjaGVjayBpbiB0aGUKKyAgICAgICAgICAgICAgICAvLyBzZWNvbmQgbG9vcCBiZWxvdy4KKyAgICAgICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IHRoZXJlIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHdheSB0byBhdm9pZCB0aGlzIHdvcmthcm91bmQuIEZpbHRlcmluZyB0aGUgY29tcGFjdGluZworICAgICAgICAgICAgICAgIC8vIHNldCB0aHJvdWdoIGhhdmluZyBhbiBlYXJseS1vcGVuIHZlcnNpb24gaW4gbGl2ZSBkb2VzIG5vdCB3b3JrIGJlY2F1c2Ugc291cmNlcyBhcmUgZnVsbHkgcmVtb3ZlZCBmcm9tCisgICAgICAgICAgICAgICAgLy8gdGhlIGxpdmUgc2V0IHdoZW4gdGhleSBhcmUgY29tcGxldGVseSBleGhhdXN0ZWQuCisKKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGNvbXBhY3RpbmcgdmVyc2lvbnMgZmlyc3QgYmVjYXVzZSB0aGV5IHdpbGwgYmUgdGhlIGNhbm9uaWNhbCB2ZXJzaW9ucyBvZiBjb21wYWN0aW9uIHNvdXJjZXMuCiAgICAgICAgICAgICAgICAgU2V0PFNTVGFibGVSZWFkZXI+IGNhbm9uaWNhbFNTVGFibGVzID0gbmV3IEhhc2hTZXQ8Pihzc3RhYmxlcy5zaXplKCkgKyBjb21wYWN0aW5nLnNpemUoKSk7CiAgICAgICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBjb21wYWN0aW5nKQogICAgICAgICAgICAgICAgICAgICBpZiAoc3N0YWJsZS5vcGVuUmVhc29uICE9IFNTVGFibGVSZWFkZXIuT3BlblJlYXNvbi5FQVJMWSkKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbm9uaWNhbFNTVGFibGVzLmFkZChzc3RhYmxlKTsKLSAgICAgICAgICAgICAgICAvLyByZWFzb24gZm9yIGNoZWNraW5nIGlmIGNvbXBhY3RpbmcgY29udGFpbnMgdGhlIHNzdGFibGUgaXMgdGhhdCBpZiBjb21wYWN0aW5nIGhhcyBhbiBFQVJMWSB2ZXJzaW9uCi0gICAgICAgICAgICAgICAgLy8gb2YgYSBOT1JNQUwgc3N0YWJsZSwgd2Ugc3RpbGwgaGF2ZSB0aGUgY2Fub25pY2FsIHZlcnNpb24gb2YgdGhhdCBzc3RhYmxlIGluIHNzdGFibGVzLgotICAgICAgICAgICAgICAgIC8vIG5vdGUgdGhhdCB0aGUgRUFSTFkgdmVyc2lvbiBpcyBlcXVhbCwgYnV0IG5vdCA9PSBzaW5jZSBpdCBpcyBhIGRpZmZlcmVudCBpbnN0YW5jZSBvZiB0aGUgc2FtZSBzc3RhYmxlLgorICAgICAgICAgICAgICAgIC8vIEFkZCBhbnl0aGluZyB0aGF0IGlzIG5vdCBjb21wYWN0aW5nLCByZW1vdmluZyBhbnkgY29tcGFjdGlvbiByZXN1bHQgd2hlcmUgd2Ugc3RpbGwgaGF2ZSB0aGUKKyAgICAgICAgICAgICAgICAvLyBjb21wYWN0aW9uIHNvdXJjZXMuCisgICAgICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHRoZSBFQVJMWSB2ZXJzaW9uIGlzIGVxdWFsIHRvIHRoZSBvcmlnaW5hbCwgaS5lLiB0aGUgc2V0IGl0c2VsZiBjYW4gZ3VhcmFudGVlIGVhcmx5LW9wZW4KKyAgICAgICAgICAgICAgICAvLyB2ZXJzaW9ucyBvZiBzc3RhYmxlcyBpbiBjb21wYWN0aW5nIHdvbid0IGJlIGFkZGVkLCBidXQgd2UgYWxzbyB3YW50IHRvIHJlbW92ZSB0aGUgcmVzdWx0cy4KICAgICAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzKQogICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbXBhY3RpbmcuY29udGFpbnMoc3N0YWJsZSkgJiYgc3N0YWJsZS5vcGVuUmVhc29uICE9IFNTVGFibGVSZWFkZXIuT3BlblJlYXNvbi5FQVJMWSkKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbm9uaWNhbFNTVGFibGVzLmFkZChzc3RhYmxlKTsKQEAgLTI0MSw3ICsyNjMsNyBAQAogICAgIC8vIE1FVEhPRFMgVE8gQ09OU1RSVUNUIEZVTkNUSU9OUyBGT1IgTU9ESUZZSU5HIEEgVklFVzoKIAogICAgIC8vIHJldHVybiBhIGZ1bmN0aW9uIHRvIHVuL21hcmsgdGhlIHByb3ZpZGVkIHJlYWRlcnMgY29tcGFjdGluZyBpbiBhIHZpZXcKLSAgICBzdGF0aWMgRnVuY3Rpb248VmlldywgVmlldz4gdXBkYXRlQ29tcGFjdGluZyhmaW5hbCBTZXQ8U1NUYWJsZVJlYWRlcj4gdW5tYXJrLCBmaW5hbCBJdGVyYWJsZTxTU1RhYmxlUmVhZGVyPiBtYXJrKQorICAgIHN0YXRpYyBGdW5jdGlvbjxWaWV3LCBWaWV3PiB1cGRhdGVDb21wYWN0aW5nKGZpbmFsIFNldDw/IGV4dGVuZHMgU1NUYWJsZVJlYWRlcj4gdW5tYXJrLCBmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgU1NUYWJsZVJlYWRlcj4gbWFyaykKICAgICB7CiAgICAgICAgIGlmICh1bm1hcmsuaXNFbXB0eSgpICYmIEl0ZXJhYmxlcy5pc0VtcHR5KG1hcmspKQogICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9ucy5pZGVudGl0eSgpOwpAQCAtMjU5LDcgKzI4MSw3IEBACiAKICAgICAvLyBjb25zdHJ1Y3QgYSBwcmVkaWNhdGUgdG8gcmVqZWN0IHZpZXdzIHRoYXQgZG8gbm90IHBlcm1pdCB1cyB0byBtYXJrIHRoZXNlIHJlYWRlcnMgY29tcGFjdGluZzsKICAgICAvLyBpLmUuIG9uZSBvZiB0aGVtIGlzIGVpdGhlciBhbHJlYWR5IGNvbXBhY3RpbmcsIGhhcyBiZWVuIGNvbXBhY3RlZCwgb3IgaGFzIGJlZW4gcmVwbGFjZWQKLSAgICBzdGF0aWMgUHJlZGljYXRlPFZpZXc+IHBlcm1pdENvbXBhY3RpbmcoZmluYWwgSXRlcmFibGU8U1NUYWJsZVJlYWRlcj4gcmVhZGVycykKKyAgICBzdGF0aWMgUHJlZGljYXRlPFZpZXc+IHBlcm1pdENvbXBhY3RpbmcoZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIFNTVGFibGVSZWFkZXI+IHJlYWRlcnMpCiAgICAgewogICAgICAgICByZXR1cm4gbmV3IFByZWRpY2F0ZTxWaWV3PigpCiAgICAgICAgIHsKQEAgLTM1Myw0ICszNzUsNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9OwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0Fic3RyYWN0VGltZVVVSURUeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0Fic3RyYWN0VGltZVVVSURUeXBlLmphdmEKaW5kZXggOTFhNWIyNy4uMzhhZjgxMiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9BYnN0cmFjdFRpbWVVVUlEVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQWJzdHJhY3RUaW1lVVVJRFR5cGUuamF2YQpAQCAtMjYsNiArMjYsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLk1hcnNoYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuVVVJRFNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlSW52ZXJzZTsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSUxMSVNFQ09ORFM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlELkdlbmVyYXRvci5uZXh0VGltZVVVSURBc0J5dGVzOwpAQCAtNDMsNiArNDYsNyBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgPFZMLCBWUj4gaW50IGNvbXBhcmVDdXN0b20oVkwgbGVmdCwgVmFsdWVBY2Nlc3NvcjxWTD4gYWNjZXNzb3JMLCBWUiByaWdodCwgVmFsdWVBY2Nlc3NvcjxWUj4gYWNjZXNzb3JSKQogICAgIHsKICAgICAgICAgLy8gQ29tcGFyZSBmb3IgbGVuZ3RoCkBAIC01NywxMiArNjEsMTIgQEAKIAogICAgICAgICBsb25nIG1zYjEgPSBhY2Nlc3NvckwuZ2V0TG9uZyhsZWZ0LCAwKTsKICAgICAgICAgbG9uZyBtc2IyID0gYWNjZXNzb3JSLmdldExvbmcocmlnaHQsIDApOworICAgICAgICB2ZXJpZnlWZXJzaW9uKG1zYjEpOworICAgICAgICB2ZXJpZnlWZXJzaW9uKG1zYjIpOworCiAgICAgICAgIG1zYjEgPSByZW9yZGVyVGltZXN0YW1wQnl0ZXMobXNiMSk7CiAgICAgICAgIG1zYjIgPSByZW9yZGVyVGltZXN0YW1wQnl0ZXMobXNiMik7CiAKLSAgICAgICAgYXNzZXJ0IChtc2IxICYgdG9wYnl0ZSgweGYwTCkpID09IHRvcGJ5dGUoMHgxMEwpOwotICAgICAgICBhc3NlcnQgKG1zYjIgJiB0b3BieXRlKDB4ZjBMKSkgPT0gdG9wYnl0ZSgweDEwTCk7Ci0KICAgICAgICAgaW50IGMgPSBMb25nLmNvbXBhcmUobXNiMSwgbXNiMik7CiAgICAgICAgIGlmIChjICE9IDApCiAgICAgICAgICAgICByZXR1cm4gYzsKQEAgLTc0LDYgKzc4LDQwIEBACiAgICAgICAgIHJldHVybiBMb25nLmNvbXBhcmUobHNiMSwgbHNiMik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgaWYgKGFjY2Vzc29yLmlzRW1wdHkoZGF0YSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBsb25nIGhpQml0cyA9IGFjY2Vzc29yLmdldExvbmcoZGF0YSwgMCk7CisgICAgICAgIHZlcmlmeVZlcnNpb24oaGlCaXRzKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBzd2l6emxlZCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMTYpOworICAgICAgICBzd2l6emxlZC5wdXRMb25nKDAsIFRpbWVVVUlEVHlwZS5yZW9yZGVyVGltZXN0YW1wQnl0ZXMoaGlCaXRzKSk7CisgICAgICAgIHN3aXp6bGVkLnB1dExvbmcoOCwgYWNjZXNzb3IuZ2V0TG9uZyhkYXRhLCA4KSBeIDB4ODA4MDgwODA4MDgwODA4MEwpOworCisgICAgICAgIHJldHVybiBCeXRlU291cmNlLmZpeGVkTGVuZ3RoKHN3aXp6bGVkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IFYgZnJvbUNvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgLy8gT3B0aW9uYWwtc3R5bGUgZW5jb2Rpbmcgb2YgZW1wdHkgdmFsdWVzIGFzIG51bGwgc291cmNlcworICAgICAgICBpZiAoY29tcGFyYWJsZUJ5dGVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gYWNjZXNzb3IuZW1wdHkoKTsKKworICAgICAgICAvLyBUaGUgbm9uLWxleGljYWwgVVVJRCBiaXRzIGFyZSBzdG9yZWQgYXMgYW4gdW5zaWduZWQgZml4ZWQtbGVuZ3RoIDEyOC1iaXQgaW50ZWdlci4KKyAgICAgICAgbG9uZyBoaUJpdHMgPSBCeXRlU291cmNlSW52ZXJzZS5nZXRVbnNpZ25lZEZpeGVkTGVuZ3RoQXNMb25nKGNvbXBhcmFibGVCeXRlcywgOCk7CisgICAgICAgIGxvbmcgbG9CaXRzID0gQnl0ZVNvdXJjZUludmVyc2UuZ2V0VW5zaWduZWRGaXhlZExlbmd0aEFzTG9uZyhjb21wYXJhYmxlQnl0ZXMsIDgpOworCisgICAgICAgIGhpQml0cyA9IHJlb3JkZXJCYWNrVGltZXN0YW1wQnl0ZXMoaGlCaXRzKTsKKyAgICAgICAgdmVyaWZ5VmVyc2lvbihoaUJpdHMpOworICAgICAgICAvLyBJbiBhZGRpdGlvbiwgVGltZVVVSURUeXBlIGFsc28gdG91Y2hlcyB0aGUgbG93IGJpdHMgb2YgdGhlIFVVSUQgKHNlZSBDQVNTQU5EUkEtODczMCBhbmQgREItMTc1OCkuCisgICAgICAgIGxvQml0cyBePSAweDgwODA4MDgwODA4MDgwODBMOworCisgICAgICAgIHJldHVybiBVVUlEVHlwZS5tYWtlVXVpZEJ5dGVzKGFjY2Vzc29yLCBoaUJpdHMsIGxvQml0cyk7CisgICAgfQorCiAgICAgLy8gdGFrZXMgYXMgaW5wdXQgOCBzaWduZWQgYnl0ZXMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIKICAgICAvLyByZXR1cm5zIHRoZSBmaXJzdCBieXRlIHVuY2hhbmdlZCwgYW5kIHRoZSBmb2xsb3dpbmcgNyBieXRlcyBjb252ZXJ0ZWQgdG8gYW4gdW5zaWduZWQgcmVwcmVzZW50YXRpb24KICAgICAvLyB3aGljaCBpcyB0aGUgc2FtZSBhcyBhIDIncyBjb21wbGVtZW50IGxvbmcgaW4gbmF0aXZlIGZvcm1hdApAQCAtODIsMTYgKzEyMCwzMCBAQAogICAgICAgICByZXR1cm4gc2lnbmVkQnl0ZXMgXiAweDAwODA4MDgwODA4MDgwODBMOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGxvbmcgdG9wYnl0ZShsb25nIHRvcGJ5dGUpCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVZlcnNpb24obG9uZyBoaUJpdHMpCiAgICAgewotICAgICAgICByZXR1cm4gdG9wYnl0ZSA8PCA1NjsKKyAgICAgICAgbG9uZyB2ZXJzaW9uID0gKGhpQml0cyA+Pj4gMTIpICYgMHhGOworICAgICAgICBpZiAodmVyc2lvbiAhPSAxKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiSW52YWxpZCBVVUlEIHZlcnNpb24gJWQgZm9yIHRpbWV1dWlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbikpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCBzdGF0aWMgbG9uZyByZW9yZGVyVGltZXN0YW1wQnl0ZXMobG9uZyBpbnB1dCkKICAgICB7Ci0gICAgICAgIHJldHVybiAgICAoaW5wdXQgPDwgIDQ4KQotICAgICAgICAgICAgICAgICAgfCAoKGlucHV0IDw8ICAxNikgJiAweEZGRkYwMDAwMDAwMEwpCi0gICAgICAgICAgICAgICAgICB8ICAoaW5wdXQgPj4+IDMyKTsKKyAgICAgICAgcmV0dXJuIChpbnB1dCA8PCAgNDgpCisgICAgICAgICAgICAgICB8ICgoaW5wdXQgPDwgIDE2KSAmIDB4RkZGRjAwMDAwMDAwTCkKKyAgICAgICAgICAgICAgIHwgIChpbnB1dCA+Pj4gMzIpOworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgbG9uZyByZW9yZGVyQmFja1RpbWVzdGFtcEJ5dGVzKGxvbmcgaW5wdXQpCisgICAgeworICAgICAgICAvLyBJbiBhIHRpbWUtYmFzZWQgVVVJRCB0aGUgaGlnaCBiaXRzIGFyZSBzaWduaWZpY2FudGx5IG1vcmUgc2h1ZmZsZWQgdGhhbiBpbiBvdGhlciBVVUlEcyAtIGlmIFtYXSByZXByZXNlbnRzIGEKKyAgICAgICAgLy8gMTYtYml0IHR1cGxlLCBbMV1bMl1bM11bNF0gc2hvdWxkIGJlY29tZSBbM11bNF1bMl1bMV0uCisgICAgICAgIC8vIFNlZSB0aGUgVVVJRCBKYXZhZG9jIChhbmQgbW9yZSBzcGVjaWZpY2FsbHkgdGhlIGhpZ2ggYml0cyBsYXlvdXQgb2YgYSBMZWFjaC1TYWx6IFVVSUQpIHRvIHVuZGVyc3RhbmQgdGhlCisgICAgICAgIC8vIHJlYXNvbmluZyBiZWhpbmQgdGhpcyBiaXQgdHdpZGRsaW5nIGluIHRoZSBmaXJzdCBwbGFjZSAoaW4gdGhlIGNvbnRleHQgb2YgY29tcGFyaXNvbnMpLgorICAgICAgICByZXR1cm4gKGlucHV0IDw8IDMyKQorICAgICAgICAgICAgICAgfCAoKGlucHV0ID4+PiAxNikgJiAweEZGRkYwMDAwTCkKKyAgICAgICAgICAgICAgIHwgKGlucHV0ID4+PiA0OCk7CiAgICAgfQogCiAgICAgcHVibGljIEJ5dGVCdWZmZXIgZnJvbVN0cmluZyhTdHJpbmcgc291cmNlKSB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9BYnN0cmFjdFR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQWJzdHJhY3RUeXBlLmphdmEKaW5kZXggNzRkNDAwNi4uYmMzZGQwMSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9BYnN0cmFjdFR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0Fic3RyYWN0VHlwZS5qYXZhCkBAIC00MCw2ICs0MCw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuVHlwZVNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2VJbnZlcnNlOwogaW1wb3J0IG9yZy5naXRodWIuamFtbS5Vbm1ldGVyZWQ7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGUuQ29tcGFyaXNvblR5cGUuQ1VTVE9NOwpAQCAtNTUsNiArNTgsOCBAQAogQFVubWV0ZXJlZAogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHlwZTxUPiBpbXBsZW1lbnRzIENvbXBhcmF0b3I8Qnl0ZUJ1ZmZlcj4sIEFzc2lnbm1lbnRUZXN0YWJsZQogeworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBWQVJJQUJMRV9MRU5HVEggPSAtMTsKKwogICAgIHB1YmxpYyBmaW5hbCBDb21wYXJhdG9yPEJ5dGVCdWZmZXI+IHJldmVyc2VDb21wYXJhdG9yOwogCiAgICAgcHVibGljIGVudW0gQ29tcGFyaXNvblR5cGUKQEAgLTQ0OSwxMSArNDU0LDI4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIGxlbmd0aCBvZiB2YWx1ZXMgZm9yIHRoaXMgdHlwZSBpZiBhbGwgdmFsdWVzIGFyZSBvZiBmaXhlZCBsZW5ndGgsIC0xIG90aGVyd2lzZS4KKyAgICAgKiBUaGUgbGVuZ3RoIG9mIHZhbHVlcyBmb3IgdGhpcyB0eXBlIGlmIGFsbCB2YWx1ZXMgYXJlIG9mIGZpeGVkIGxlbmd0aCwgLTEgb3RoZXJ3aXNlLiBUaGlzIGhhcyBhbiBpbXBhY3Qgb24KKyAgICAgKiBzZXJpYWxpemF0aW9uLgorICAgICAqIDxsdT4KKyAgICAgKiAgPGxpPiBzZWUge0BsaW5rICN3cml0ZVZhbHVlfSA8L2xpPgorICAgICAqICA8bGk+IHNlZSB7QGxpbmsgI3JlYWR9IDwvbGk+CisgICAgICogIDxsaT4gc2VlIHtAbGluayAjd3JpdHRlbkxlbmd0aH0gPC9saT4KKyAgICAgKiAgPGxpPiBzZWUge0BsaW5rICNza2lwVmFsdWV9IDwvbGk+CisgICAgICogPC9sdT4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IHZhbHVlTGVuZ3RoSWZGaXhlZCgpCiAgICAgewotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiBWQVJJQUJMRV9MRU5HVEg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIGFsbCB2YWx1ZXMgYXJlIG9mIGZpeGVkIGxlbmd0aC4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGFsbCB2YWx1ZXMgYXJlIG9mIGZpeGVkIGxlbmd0aCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNWYWx1ZUxlbmd0aEZpeGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiB2YWx1ZUxlbmd0aElmRml4ZWQoKSAhPSBWQVJJQUJMRV9MRU5HVEg7CiAgICAgfQogCiAgICAgLy8gVGhpcyBhc3N1bWVzIHRoYXQgbm8gZW1wdHkgdmFsdWVzIGFyZSBwYXNzZWQKQEAgLTUxOCw3ICs1NDAsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc29yLnJlYWQoaW4sIGxlbmd0aCk7CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgICAgaW50IGwgPSAoaW50KWluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgIGludCBsID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgICAgICBpZiAobCA8IDApCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3JydXB0IChuZWdhdGl2ZSkgdmFsdWUgbGVuZ3RoIGVuY291bnRlcmVkIik7CiAKQEAgLTU5OSw2ICs2MjEsNjkgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBQcm9kdWNlIGEgYnl0ZS1jb21wYXJhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiB2YWx1ZSwgaS5lLiBhIHNlcXVlbmNlIG9mIGJ5dGVzIHRoYXQgY29tcGFyZXMgdGhlIHNhbWUgd2F5CisgICAgICogdXNpbmcgbGV4aWNvZ3JhcGhpY2FsIHVuc2lnbmVkIGJ5dGUgY29tcGFyaXNvbiBhcyB0aGUgb3JpZ2luYWwgdmFsdWUgdXNpbmcgdGhlIHR5cGUncyBjb21wYXJhdG9yLgorICAgICAqCisgICAgICogV2UgdXNlIGEgc2xpZ2h0bHkgc3Ryb25nZXIgcmVxdWlyZW1lbnQgdG8gYmUgYWJsZSB0byB1c2UgdGhlIHR5cGVzIGluIHR1cGxlcy4gUHJlY2lzZWx5LCBmb3IgYW55IHBhaXIgeCwgeSBvZgorICAgICAqIG5vbi1lcXVhbCB2YWxpZCB2YWx1ZXMgb2YgdGhpcyB0eXBlIGFuZCBhbnkgYnl0ZXMgYjEsIGIyIGJldHdlZW4gMHgxMCBhbmQgMHhFRiwKKyAgICAgKiAoKyBzdGFuZHMgZm9yIGNvbmNhdGVuYXRpb24pCisgICAgICogICBjb21wYXJlKHgsIHkpID09IGNvbXBhcmVMZXhpY29ncmFwaGljYWxseVVuc2lnbmVkKGFzQnl0ZUNvbXBhcmFibGUoeCkrYjEsIGFzQnl0ZUNvbXBhcmFibGUoeSkrYjIpCisgICAgICogKGkuZS4gdGhlIHZhbHVlcyBjb21wYXJlIGxpa2UgdGhlIG9yaWdpbmFsIHR5cGUsIGFuZCBhbiBhZGRlZCAweDEwLTB4RUYgYnl0ZSBhdCB0aGUgZW5kIGRvZXMgbm90IGNoYW5nZSB0aGF0KSBhbmQ6CisgICAgICogICBhc0J5dGVDb21wYXJhYmxlKHgpK2IxIGlzIG5vdCBhIHByZWZpeCBvZiBhc0J5dGVDb21wYXJhYmxlKHkpICAgICAgKHdlYWtseSBwcmVmaXggZnJlZSkKKyAgICAgKiAoaS5lLiBhIHZhbGlkIHJlcHJlc2VudGF0aW9uIG9mIGEgdmFsdWUgbWF5IGJlIGEgcHJlZml4IG9mIGFub3RoZXIgdmFsaWQgcmVwcmVzZW50YXRpb24gb2YgYSB2YWx1ZSBvbmx5IGlmIHRoZQorICAgICAqIGZvbGxvd2luZyBieXRlIGluIHRoZSBsYXR0ZXIgaXMgc21hbGxlciB0aGFuIDB4MTAgb3IgbGFyZ2VyIHRoYW4gMHhFRikuIFRoZXNlIHByb3BlcnRpZXMgYXJlIHRyaXZpYWxseSB0cnVlIGlmCisgICAgICogdGhlIGVuY29kaW5nIGNvbXBhcmVzIGNvcnJlY3RseSBhbmQgaXMgcHJlZml4IGZyZWUsIGJ1dCBhbHNvIHBlcm1pdHMgYSBsaXR0bGUgbW9yZSBmcmVlZG9tIHRoYXQgZW5hYmxlcyBzb21ld2hhdAorICAgICAqIG1vcmUgZWZmaWNpZW50IGVuY29kaW5nIG9mIGFyYml0cmFyeS1sZW5ndGggYnl0ZS1jb21wYXJhYmxlIGJsb2JzLgorICAgICAqCisgICAgICogRGVwZW5kaW5nIG9uIHRoZSB0eXBlLCB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGZvciBudWxsIG9yIGVtcHR5IGlucHV0LCBpbiB3aGljaCBjYXNlIHRoZSBvdXRwdXQgaXMgYWxsb3dlZCB0bworICAgICAqIGJlIG51bGwgKHRoZSBjbHVzdGVyaW5nL3R1cGxlIGVuY29kaW5nIHdpbGwgYWNjZXB0IGFuZCBoYW5kbGUgaXQpLgorICAgICAqLworICAgIHB1YmxpYyA8Vj4gQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBWIHZhbHVlLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICBpZiAoaXNCeXRlT3JkZXJDb21wYXJhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXaGVuIGEgdHlwZSBpcyBieXRlLW9yZGVyZWQgb24gaXRzIG93biwgd2Ugb25seSBuZWVkIHRvIGVzY2FwZSBpdCwgc28gdGhhdCB3ZSBjYW4gaW5jbHVkZSBpdCBpbgorICAgICAgICAgICAgLy8gbXVsdGktY29tcG9uZW50IHR5cGVzIGFuZCBtYWtlIHRoZSBlbmNvZGluZyB3ZWFrbHktcHJlZml4LWZyZWUuCisgICAgICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZS5vZihhY2Nlc3NvciwgdmFsdWUsIHZlcnNpb24pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8vIGRlZmF1bHQgaXMgb25seSBnb29kIGZvciBieXRlLWNvbXBhcmFibGVzCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiIGRvZXMgbm90IGltcGxlbWVudCBhc0NvbXBhcmFibGVCeXRlcyIpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFzQ29tcGFyYWJsZUJ5dGVzKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgYnl0ZUJ1ZmZlciwgdmVyc2lvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNsYXRlcyB0aGUgZ2l2ZW4gYnl0ZS1vcmRlcmVkIHJlcHJlc2VudGF0aW9uIHRvIHRoZSBjb21tb24sIG5vbi1ieXRlLW9yZGVyZWQgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIGEKKyAgICAgKiBwYXlsb2FkIGZvciB0aGlzIGFic3RyYWN0IHR5cGUgKHRoZSBsYXR0ZXIsIGNvbW1vbiBiaW5hcnkgcmVwcmVzZW50YXRpb24gaXMgd2hhdCB3ZSBtb3N0bHkgd29yayB3aXRoIGluIHRoZQorICAgICAqIHN0b3JhZ2UgZW5naW5lIGludGVybmFscykuIElmIHRoZSBnaXZlbiBieXRlcyBkb24ndCBjb3JyZXNwb25kIHRvIHRoZSBlbmNvZGluZyBvZiBzb21lIHBheWxvYWQgdmFsdWUgZm9yIHRoaXMKKyAgICAgKiBhYnN0cmFjdCB0eXBlLCBhbiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBtYXkgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFjY2Vzc29yIHZhbHVlIGFjY2Vzc29yIHVzZWQgdG8gY29uc3RydWN0IHRoZSB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gY29tcGFyYWJsZUJ5dGVzIEEgYnl0ZS1vcmRlcmVkIHJlcHJlc2VudGF0aW9uIChwcmVzdW1hYmx5IG9mIGEgcGF5bG9hZCBmb3IgdGhpcyBhYnN0cmFjdCB0eXBlKS4KKyAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgYnl0ZS1jb21wYXJhYmxlIHZlcnNpb24gdXNlZCB0byBjb25zdHJ1Y3QgdGhlIHJlcHJlc2VudGF0aW9uLgorICAgICAqIEByZXR1cm4gQSBvZiBhIHBheWxvYWQgZm9yIHRoaXMgYWJzdHJhY3QgdHlwZSwgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYnl0ZS1vcmRlcmVkIHJlcHJlc2VudGF0aW9uLAorICAgICAqICAgICAgICAgY29uc3RydWN0ZWQgdXNpbmcgdGhlIHN1cHBsaWVkIHZhbHVlIGFjY2Vzc29yLgorICAgICAqCisgICAgICogQHNlZSAjYXNDb21wYXJhYmxlQnl0ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgPFY+IFYgZnJvbUNvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgaWYgKGlzQnl0ZU9yZGVyQ29tcGFyYWJsZSkKKyAgICAgICAgICAgIHJldHVybiBhY2Nlc3Nvci52YWx1ZU9mKEJ5dGVTb3VyY2VJbnZlcnNlLmdldFVuZXNjYXBlZEJ5dGVzKGNvbXBhcmFibGVCeXRlcykpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiIGRvZXMgbm90IGltcGxlbWVudCBmcm9tQ29tcGFyYWJsZUJ5dGVzIik7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIEJ5dGVCdWZmZXIgZnJvbUNvbXBhcmFibGVCeXRlcyhCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZyb21Db21wYXJhYmxlQnl0ZXMoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBjb21wYXJhYmxlQnl0ZXMsIHZlcnNpb24pOworICAgIH0KKworICAgIC8qKgogICAgICAqIFRoaXMgbXVzdCBiZSBvdmVycmlkZW4gYnkgc3ViY2xhc3NlcyBpZiBuZWNlc3Nhcnkgc28gdGhhdCBmb3IgYW55CiAgICAgICogQWJzdHJhY3RUeXBlLCB0aGlzID09IFR5cGVQYXJzZXIucGFyc2UodG9TdHJpbmcoKSkuCiAgICAgICoKQEAgLTYyNCw0ICs3MDksMTggQEAKICAgICB7CiAgICAgICAgIHJldHVybiB0ZXN0QXNzaWdubWVudChyZWNlaXZlci50eXBlKTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGdldENvbXBhdGlibGVUeXBlSWZLbm93bihTdHJpbmcga2V5c3BhY2UpCisgICAgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIEEgZml4ZWQsIHNlcmlhbGl6ZWQgdmFsdWUgdG8gYmUgdXNlZCB3aGVuIHRoZSBjb2x1bW4gaXMgbWFza2VkLCB0byBiZSByZXR1cm5lZCBpbnN0ZWFkIG9mIHRoZSByZWFsIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE1hc2tlZFZhbHVlKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlcmUgaXNuJ3QgYSBkZWZpbmVkIG1hc2tlZCB2YWx1ZSBmb3IgdHlwZSAiICsgYXNDUUwzVHlwZSgpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0FzY2lpVHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9Bc2NpaVR5cGUuamF2YQppbmRleCAyZDc4YzFhLi5hYzU4NWEyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0FzY2lpVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQXNjaWlUeXBlLmphdmEKQEAgLTI1LDcgKzI1LDYgQEAKIAogaW1wb3J0IGlvLm5ldHR5LnV0aWwuY29uY3VycmVudC5GYXN0VGhyZWFkTG9jYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Kc29uOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUwzVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlRlcm07CkBAIC0zNCwxMCArMzMsMTIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5Bc2NpaVNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Kc29uVXRpbHM7CiAKIHB1YmxpYyBjbGFzcyBBc2NpaVR5cGUgZXh0ZW5kcyBTdHJpbmdUeXBlCiB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBc2NpaVR5cGUgaW5zdGFuY2UgPSBuZXcgQXNjaWlUeXBlKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlciBNQVNLRURfVkFMVUUgPSBpbnN0YW5jZS5kZWNvbXBvc2UoIioqKioiKTsKIAogICAgIEFzY2lpVHlwZSgpIHtzdXBlcihDb21wYXJpc29uVHlwZS5CWVRFX09SREVSKTt9IC8vIHNpbmdsZXRvbgogCkBAIC04NSw3ICs4Niw3IEBACiAgICAgewogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICciJyArIEpzb24ucXVvdGVBc0pzb25TdHJpbmcoQnl0ZUJ1ZmZlclV0aWwuc3RyaW5nKGJ1ZmZlciwgU3RhbmRhcmRDaGFyc2V0cy5VU19BU0NJSSkpICsgJyInOworICAgICAgICAgICAgcmV0dXJuICciJyArIEpzb25VdGlscy5xdW90ZUFzSnNvblN0cmluZyhCeXRlQnVmZmVyVXRpbC5zdHJpbmcoYnVmZmVyLCBTdGFuZGFyZENoYXJzZXRzLlVTX0FTQ0lJKSkgKyAnIic7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbiBleGMpCiAgICAgICAgIHsKQEAgLTEwMiw0ICsxMDMsMTAgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBBc2NpaVNlcmlhbGl6ZXIuaW5zdGFuY2U7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0TWFza2VkVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1BU0tFRF9WQUxVRTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0Jvb2xlYW5UeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0Jvb2xlYW5UeXBlLmphdmEKaW5kZXggNGVmNWY5NS4uOTlhMmRhMSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9Cb29sZWFuVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQm9vbGVhblR5cGUuamF2YQpAQCAtMjYsMTYgKzI2LDE1IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuQm9vbGVhblNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwotCi1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOwogCiBwdWJsaWMgY2xhc3MgQm9vbGVhblR5cGUgZXh0ZW5kcyBBYnN0cmFjdFR5cGU8Qm9vbGVhbj4KIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQm9vbGVhblR5cGUuY2xhc3MpOwotCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuVHlwZSBpbnN0YW5jZSA9IG5ldyBCb29sZWFuVHlwZSgpOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlciBNQVNLRURfVkFMVUUgPSBpbnN0YW5jZS5kZWNvbXBvc2UoZmFsc2UpOworCiAgICAgQm9vbGVhblR5cGUoKSB7c3VwZXIoQ29tcGFyaXNvblR5cGUuQ1VTVE9NKTt9IC8vIHNpbmdsZXRvbgogCiAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eVZhbHVlTWVhbmluZ2xlc3MoKQpAQCAtNTQsNiArNTMsMjYgQEAKICAgICAgICAgcmV0dXJuIHYxIC0gdjI7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgaWYgKGFjY2Vzc29yLmlzRW1wdHkoZGF0YSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgYnl0ZSBiID0gYWNjZXNzb3IudG9CeXRlKGRhdGEpOworICAgICAgICBpZiAoYiAhPSAwKQorICAgICAgICAgICAgYiA9IDE7CisgICAgICAgIHJldHVybiBCeXRlU291cmNlLm9uZUJ5dGUoYik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBWIGZyb21Db21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIGlmIChjb21wYXJhYmxlQnl0ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBhY2Nlc3Nvci5lbXB0eSgpOworICAgICAgICBpbnQgYiA9IGNvbXBhcmFibGVCeXRlcy5uZXh0KCk7CisgICAgICAgIHJldHVybiBhY2Nlc3Nvci52YWx1ZU9mKGIgPT0gMSk7CisgICAgfQorCiAgICAgcHVibGljIEJ5dGVCdWZmZXIgZnJvbVN0cmluZyhTdHJpbmcgc291cmNlKSB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbgogICAgIHsKIApAQCAtOTksNCArMTE4LDEwIEBACiAgICAgewogICAgICAgICByZXR1cm4gMTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRNYXNrZWRWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gTUFTS0VEX1ZBTFVFOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQnl0ZUFycmF5QWNjZXNzb3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQnl0ZUFycmF5QWNjZXNzb3IuamF2YQppbmRleCBkZjI0YTYyLi5kNzEwODk5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0J5dGVBcnJheUFjY2Vzc29yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9CeXRlQXJyYXlBY2Nlc3Nvci5qYXZhCkBAIC0yNDksNiArMjQ5LDEzIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBwdXRCeXRlKGJ5dGVbXSBkc3QsIGludCBvZmZzZXQsIGJ5dGUgdmFsdWUpCisgICAgeworICAgICAgICBkc3Rbb2Zmc2V0XSA9IHZhbHVlOworICAgICAgICByZXR1cm4gVHlwZVNpemVzLkJZVEVfU0laRTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHB1dFNob3J0KGJ5dGVbXSBkc3QsIGludCBvZmZzZXQsIHNob3J0IHZhbHVlKQogICAgIHsKICAgICAgICAgQnl0ZUFycmF5VXRpbC5wdXRTaG9ydChkc3QsIG9mZnNldCwgdmFsdWUpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9CeXRlQXJyYXlPYmplY3RGYWN0b3J5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0J5dGVBcnJheU9iamVjdEZhY3RvcnkuamF2YQppbmRleCBlYTliZjExLi5lZDFlNmE2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0J5dGVBcnJheU9iamVjdEZhY3RvcnkuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0J5dGVBcnJheU9iamVjdEZhY3RvcnkuamF2YQpAQCAtMTgsMTMgKzE4LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQXJyYXlDbHVzdGVyaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkFycmF5Q2x1c3RlcmluZ0JvdW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkFycmF5Q2x1c3RlcmluZ0JvdW5kYXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0JvdW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdCb3VuZGFyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nUHJlZml4OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5BcnJheUNlbGw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ2VsbFBhdGg7CkBAIC0zMyw3ICsyNyw3IEBACiAKIGNsYXNzIEJ5dGVBcnJheU9iamVjdEZhY3RvcnkgaW1wbGVtZW50cyBWYWx1ZUFjY2Vzc29yLk9iamVjdEZhY3Rvcnk8Ynl0ZVtdPgogewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsdXN0ZXJpbmc8Ynl0ZVtdPiBFTVBUWV9DTFVTVEVSSU5HID0gbmV3IEFycmF5Q2x1c3RlcmluZygpCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2x1c3RlcmluZzxieXRlW10+IEVNUFRZX0NMVVNURVJJTkcgPSBuZXcgQXJyYXlDbHVzdGVyaW5nKEFic3RyYWN0QXJyYXlDbHVzdGVyaW5nUHJlZml4LkVNUFRZX1ZBTFVFU19BUlJBWSkKICAgICB7CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSkKICAgICAgICAgewpAQCAtNDEsMTQgKzM1LDQ0IEBACiAgICAgICAgIH0KICAgICB9OwogCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDbHVzdGVyaW5nPGJ5dGVbXT4gU1RBVElDX0NMVVNURVJJTkcgPSBuZXcgQXJyYXlDbHVzdGVyaW5nKEFic3RyYWN0QXJyYXlDbHVzdGVyaW5nUHJlZml4LkVNUFRZX1ZBTFVFU19BUlJBWSkKKyAgICB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgS2luZCBraW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEtpbmQuU1RBVElDX0NMVVNURVJJTkc7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAiU1RBVElDIjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0b1N0cmluZygpOworICAgICAgICB9CisgICAgfTsKKwogICAgIHN0YXRpYyBmaW5hbCBWYWx1ZUFjY2Vzc29yLk9iamVjdEZhY3Rvcnk8Ynl0ZVtdPiBpbnN0YW5jZSA9IG5ldyBCeXRlQXJyYXlPYmplY3RGYWN0b3J5KCk7CiAKICAgICBwcml2YXRlIEJ5dGVBcnJheU9iamVjdEZhY3RvcnkoKSB7fQogCiAgICAgLyoqIFRoZSBzbWFsbGVzdCBzdGFydCBib3VuZCwgaS5lLiB0aGUgb25lIHRoYXQgc3RhcnRzIGJlZm9yZSBhbnkgcm93LiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5Q2x1c3RlcmluZ0JvdW5kIEJPVFRPTV9CT1VORCA9IG5ldyBBcnJheUNsdXN0ZXJpbmdCb3VuZChDbHVzdGVyaW5nUHJlZml4LktpbmQuSU5DTF9TVEFSVF9CT1VORCwgbmV3IGJ5dGVbMF1bXSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlDbHVzdGVyaW5nQm91bmQgQk9UVE9NX0JPVU5EID0gbmV3IEFycmF5Q2x1c3RlcmluZ0JvdW5kKENsdXN0ZXJpbmdQcmVmaXguS2luZC5JTkNMX1NUQVJUX0JPVU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdEFycmF5Q2x1c3RlcmluZ1ByZWZpeC5FTVBUWV9WQUxVRVNfQVJSQVkpOwogICAgIC8qKiBUaGUgYmlnZ2VzdCBlbmQgYm91bmQsIGkuZS4gdGhlIG9uZSB0aGF0IGVuZHMgYWZ0ZXIgYW55IHJvdy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUNsdXN0ZXJpbmdCb3VuZCBUT1BfQk9VTkQgPSBuZXcgQXJyYXlDbHVzdGVyaW5nQm91bmQoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLklOQ0xfRU5EX0JPVU5ELCBuZXcgYnl0ZVswXVtdKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUNsdXN0ZXJpbmdCb3VuZCBUT1BfQk9VTkQgPSBuZXcgQXJyYXlDbHVzdGVyaW5nQm91bmQoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLklOQ0xfRU5EX0JPVU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdEFycmF5Q2x1c3RlcmluZ1ByZWZpeC5FTVBUWV9WQUxVRVNfQVJSQVkpOworCisgICAgLyoqIFRoZSBiaWdnZXN0IHN0YXJ0IGJvdW5kLCBpLmUuIHRoZSBvbmUgdGhhdCBzdGFydHMgYWZ0ZXIgYW55IHJvdy4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUNsdXN0ZXJpbmdCb3VuZCBNQVhfU1RBUlRfQk9VTkQgPSBuZXcgQXJyYXlDbHVzdGVyaW5nQm91bmQoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLkVYQ0xfU1RBUlRfQk9VTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0QXJyYXlDbHVzdGVyaW5nUHJlZml4LkVNUFRZX1ZBTFVFU19BUlJBWSk7CisgICAgLyoqIFRoZSBzbWFsbGVzdCBlbmQgYm91bmQsIGkuZS4gdGhlIG9uZSB0aGF0IGVuZCBiZWZvcmUgYW55IHJvdy4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUNsdXN0ZXJpbmdCb3VuZCBNSU5fRU5EX0JPVU5EID0gbmV3IEFycmF5Q2x1c3RlcmluZ0JvdW5kKENsdXN0ZXJpbmdQcmVmaXguS2luZC5FWENMX0VORF9CT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RBcnJheUNsdXN0ZXJpbmdQcmVmaXguRU1QVFlfVkFMVUVTX0FSUkFZKTsKIAogICAgIHB1YmxpYyBDZWxsPGJ5dGVbXT4gY2VsbChDb2x1bW5NZXRhZGF0YSBjb2x1bW4sIGxvbmcgdGltZXN0YW1wLCBpbnQgdHRsLCBpbnQgbG9jYWxEZWxldGlvblRpbWUsIGJ5dGVbXSB2YWx1ZSwgQ2VsbFBhdGggcGF0aCkKICAgICB7CkBAIC02NSw2ICs4OSwxMSBAQAogICAgICAgICByZXR1cm4gRU1QVFlfQ0xVU1RFUklORzsKICAgICB9CiAKKyAgICBwdWJsaWMgQ2x1c3RlcmluZzxieXRlW10+IHN0YXRpY0NsdXN0ZXJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFNUQVRJQ19DTFVTVEVSSU5HOworICAgIH0KKwogICAgIHB1YmxpYyBDbHVzdGVyaW5nQm91bmQ8Ynl0ZVtdPiBib3VuZChDbHVzdGVyaW5nUHJlZml4LktpbmQga2luZCwgYnl0ZVtdLi4uIHZhbHVlcykKICAgICB7CiAgICAgICAgIHJldHVybiBuZXcgQXJyYXlDbHVzdGVyaW5nQm91bmQoa2luZCwgdmFsdWVzKTsKQEAgLTcyLDExICsxMDEsMTkgQEAKIAogICAgIHB1YmxpYyBDbHVzdGVyaW5nQm91bmQ8Ynl0ZVtdPiBib3VuZChDbHVzdGVyaW5nUHJlZml4LktpbmQga2luZCkKICAgICB7Ci0gICAgICAgIHJldHVybiBraW5kLmlzU3RhcnQoKSA/IEJPVFRPTV9CT1VORCA6IFRPUF9CT1VORDsKKyAgICAgICAgc3dpdGNoIChraW5kKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEVYQ0xfRU5EX0JPVU5EOiByZXR1cm4gTUlOX0VORF9CT1VORDsKKyAgICAgICAgICAgIGNhc2UgSU5DTF9TVEFSVF9CT1VORDogcmV0dXJuIEJPVFRPTV9CT1VORDsKKyAgICAgICAgICAgIGNhc2UgSU5DTF9FTkRfQk9VTkQ6IHJldHVybiBUT1BfQk9VTkQ7CisgICAgICAgICAgICBjYXNlIEVYQ0xfU1RBUlRfQk9VTkQ6IHJldHVybiBNQVhfU1RBUlRfQk9VTkQ7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihTdHJpbmcuZm9ybWF0KCJVbmV4cGVjdGVkIGtpbmQgJXMgZm9yIGVtcHR5IGJvdW5kIG9yIGJvdW5kYXJ5Iiwga2luZCkpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIENsdXN0ZXJpbmdCb3VuZGFyeTxieXRlW10+IGJvdW5kYXJ5KENsdXN0ZXJpbmdQcmVmaXguS2luZCBraW5kLCBieXRlW10uLi4gdmFsdWVzKQogICAgIHsKICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUNsdXN0ZXJpbmdCb3VuZGFyeShraW5kLCB2YWx1ZXMpOwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0J5dGVCdWZmZXJBY2Nlc3Nvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9CeXRlQnVmZmVyQWNjZXNzb3IuamF2YQppbmRleCA0MGEzYmY0Li4wNzEyOTMwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0J5dGVCdWZmZXJBY2Nlc3Nvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQnl0ZUJ1ZmZlckFjY2Vzc29yLmphdmEKQEAgLTI1Myw2ICsyNTMsMTMgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHB1dEJ5dGUoQnl0ZUJ1ZmZlciBkc3QsIGludCBvZmZzZXQsIGJ5dGUgdmFsdWUpCisgICAgeworICAgICAgICBkc3QucHV0KGRzdC5wb3NpdGlvbigpICsgb2Zmc2V0LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiBUeXBlU2l6ZXMuQllURV9TSVpFOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgcHV0U2hvcnQoQnl0ZUJ1ZmZlciBkc3QsIGludCBvZmZzZXQsIHNob3J0IHZhbHVlKQogICAgIHsKICAgICAgICAgZHN0LnB1dFNob3J0KGRzdC5wb3NpdGlvbigpICsgb2Zmc2V0LCB2YWx1ZSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0J5dGVCdWZmZXJPYmplY3RGYWN0b3J5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0J5dGVCdWZmZXJPYmplY3RGYWN0b3J5LmphdmEKaW5kZXggMDBmNDY0Ni4uODJlYmEzNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9CeXRlQnVmZmVyT2JqZWN0RmFjdG9yeS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQnl0ZUJ1ZmZlck9iamVjdEZhY3RvcnkuamF2YQpAQCAtMjAsMzUgKzIwLDI3IEBACiAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQnVmZmVyQ2x1c3RlcmluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5CdWZmZXJDbHVzdGVyaW5nQm91bmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQnVmZmVyQ2x1c3RlcmluZ0JvdW5kYXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0JvdW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdCb3VuZGFyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nUHJlZml4OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5CdWZmZXJDZWxsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ2VsbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGxQYXRoOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIAogY2xhc3MgQnl0ZUJ1ZmZlck9iamVjdEZhY3RvcnkgaW1wbGVtZW50cyBWYWx1ZUFjY2Vzc29yLk9iamVjdEZhY3Rvcnk8Qnl0ZUJ1ZmZlcj4KIHsKLSAgICAvKiogRW1wdHkgY2x1c3RlcmluZyBmb3IgdGFibGVzIGhhdmluZyBubyBjbHVzdGVyaW5nIGNvbHVtbnMuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2x1c3RlcmluZzxCeXRlQnVmZmVyPiBFTVBUWV9DTFVTVEVSSU5HID0gbmV3IEJ1ZmZlckNsdXN0ZXJpbmcoKQotICAgIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICJFTVBUWSI7Ci0gICAgICAgIH0KLSAgICB9OwotCiAgICAgLyoqIFRoZSBzbWFsbGVzdCBzdGFydCBib3VuZCwgaS5lLiB0aGUgb25lIHRoYXQgc3RhcnRzIGJlZm9yZSBhbnkgcm93LiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZCBCT1RUT01fQk9VTkQgPSBuZXcgQnVmZmVyQ2x1c3RlcmluZ0JvdW5kKENsdXN0ZXJpbmdQcmVmaXguS2luZC5JTkNMX1NUQVJUX0JPVU5ELCBuZXcgQnl0ZUJ1ZmZlclswXSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnVmZmVyQ2x1c3RlcmluZ0JvdW5kIEJPVFRPTV9CT1VORCA9IG5ldyBCdWZmZXJDbHVzdGVyaW5nQm91bmQoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLklOQ0xfU1RBUlRfQk9VTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RCdWZmZXJDbHVzdGVyaW5nUHJlZml4LkVNUFRZX1ZBTFVFU19BUlJBWSk7CiAgICAgLyoqIFRoZSBiaWdnZXN0IGVuZCBib3VuZCwgaS5lLiB0aGUgb25lIHRoYXQgZW5kcyBhZnRlciBhbnkgcm93LiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZCBUT1BfQk9VTkQgPSBuZXcgQnVmZmVyQ2x1c3RlcmluZ0JvdW5kKENsdXN0ZXJpbmdQcmVmaXguS2luZC5JTkNMX0VORF9CT1VORCwgbmV3IEJ5dGVCdWZmZXJbMF0pOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZCBUT1BfQk9VTkQgPSBuZXcgQnVmZmVyQ2x1c3RlcmluZ0JvdW5kKENsdXN0ZXJpbmdQcmVmaXguS2luZC5JTkNMX0VORF9CT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdEJ1ZmZlckNsdXN0ZXJpbmdQcmVmaXguRU1QVFlfVkFMVUVTX0FSUkFZKTsKKworICAgIC8qKiBUaGUgYmlnZ2VzdCBzdGFydCBib3VuZCwgaS5lLiB0aGUgb25lIHRoYXQgc3RhcnRzIGFmdGVyIGFueSByb3cuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnVmZmVyQ2x1c3RlcmluZ0JvdW5kIE1BWF9TVEFSVF9CT1VORCA9IG5ldyBCdWZmZXJDbHVzdGVyaW5nQm91bmQoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLkVYQ0xfU1RBUlRfQk9VTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0QnVmZmVyQ2x1c3RlcmluZ1ByZWZpeC5FTVBUWV9WQUxVRVNfQVJSQVkpOworICAgIC8qKiBUaGUgc21hbGxlc3QgZW5kIGJvdW5kLCBpLmUuIHRoZSBvbmUgdGhhdCBlbmQgYmVmb3JlIGFueSByb3cuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnVmZmVyQ2x1c3RlcmluZ0JvdW5kIE1JTl9FTkRfQk9VTkQgPSBuZXcgQnVmZmVyQ2x1c3RlcmluZ0JvdW5kKENsdXN0ZXJpbmdQcmVmaXguS2luZC5FWENMX0VORF9CT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0QnVmZmVyQ2x1c3RlcmluZ1ByZWZpeC5FTVBUWV9WQUxVRVNfQVJSQVkpOwogCiAgICAgc3RhdGljIGZpbmFsIFZhbHVlQWNjZXNzb3IuT2JqZWN0RmFjdG9yeTxCeXRlQnVmZmVyPiBpbnN0YW5jZSA9IG5ldyBCeXRlQnVmZmVyT2JqZWN0RmFjdG9yeSgpOwogCkBAIC02Niw3ICs1OCwxMiBAQAogCiAgICAgcHVibGljIENsdXN0ZXJpbmc8Qnl0ZUJ1ZmZlcj4gY2x1c3RlcmluZygpCiAgICAgewotICAgICAgICByZXR1cm4gRU1QVFlfQ0xVU1RFUklORzsKKyAgICAgICAgcmV0dXJuIENsdXN0ZXJpbmcuRU1QVFk7CisgICAgfQorCisgICAgcHVibGljIENsdXN0ZXJpbmc8Qnl0ZUJ1ZmZlcj4gc3RhdGljQ2x1c3RlcmluZygpCisgICAgeworICAgICAgICByZXR1cm4gQ2x1c3RlcmluZy5TVEFUSUNfQ0xVU1RFUklORzsKICAgICB9CiAKICAgICBwdWJsaWMgQ2x1c3RlcmluZ0JvdW5kPEJ5dGVCdWZmZXI+IGJvdW5kKENsdXN0ZXJpbmdQcmVmaXguS2luZCBraW5kLCBCeXRlQnVmZmVyLi4uIHZhbHVlcykKQEAgLTc2LDExICs3MywxOSBAQAogCiAgICAgcHVibGljIENsdXN0ZXJpbmdCb3VuZDxCeXRlQnVmZmVyPiBib3VuZChDbHVzdGVyaW5nUHJlZml4LktpbmQga2luZCkKICAgICB7Ci0gICAgICAgIHJldHVybiBraW5kLmlzU3RhcnQoKSA/IEJPVFRPTV9CT1VORCA6IFRPUF9CT1VORDsKKyAgICAgICAgc3dpdGNoIChraW5kKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEVYQ0xfRU5EX0JPVU5EOiByZXR1cm4gTUlOX0VORF9CT1VORDsKKyAgICAgICAgICAgIGNhc2UgSU5DTF9TVEFSVF9CT1VORDogcmV0dXJuIEJPVFRPTV9CT1VORDsKKyAgICAgICAgICAgIGNhc2UgSU5DTF9FTkRfQk9VTkQ6IHJldHVybiBUT1BfQk9VTkQ7CisgICAgICAgICAgICBjYXNlIEVYQ0xfU1RBUlRfQk9VTkQ6IHJldHVybiBNQVhfU1RBUlRfQk9VTkQ7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihTdHJpbmcuZm9ybWF0KCJVbmV4cGVjdGVkIGtpbmQgJXMgZm9yIGVtcHR5IGJvdW5kIG9yIGJvdW5kYXJ5Iiwga2luZCkpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIENsdXN0ZXJpbmdCb3VuZGFyeTxCeXRlQnVmZmVyPiBib3VuZGFyeShDbHVzdGVyaW5nUHJlZml4LktpbmQga2luZCwgQnl0ZUJ1ZmZlci4uLiB2YWx1ZXMpCiAgICAgewogICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZGFyeShraW5kLCB2YWx1ZXMpOwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0J5dGVUeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0J5dGVUeXBlLmphdmEKaW5kZXggZjk0ZjRiYi4uNWFhODg4MCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9CeXRlVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQnl0ZVR5cGUuamF2YQpAQCAtMjcsMTEgKzI3LDE3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuVHlwZVNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZS5WZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZUludmVyc2U7CiAKIHB1YmxpYyBjbGFzcyBCeXRlVHlwZSBleHRlbmRzIE51bWJlclR5cGU8Qnl0ZT4KIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJ5dGVUeXBlIGluc3RhbmNlID0gbmV3IEJ5dGVUeXBlKCk7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIE1BU0tFRF9WQUxVRSA9IGluc3RhbmNlLmRlY29tcG9zZSgoYnl0ZSkgMCk7CisKICAgICBCeXRlVHlwZSgpCiAgICAgewogICAgICAgICBzdXBlcihDb21wYXJpc29uVHlwZS5DVVNUT00pOwpAQCAtNDIsNiArNDgsMTkgQEAKICAgICAgICAgcmV0dXJuIGFjY2Vzc29yTC5nZXRCeXRlKGxlZnQsIDApIC0gYWNjZXNzb3JSLmdldEJ5dGUocmlnaHQsIDApOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBWIGRhdGEsIFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIC8vIFRoaXMgdHlwZSBkb2VzIG5vdCBhbGxvdyBub24tcHJlc2VudCB2YWx1ZXMsIGJ1dCB3ZSBkbyBqdXN0IHRvIGF2b2lkIGZ1dHVyZSBjb21wbGV4aXR5LgorICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZS5vcHRpb25hbFNpZ25lZEZpeGVkTGVuZ3RoTnVtYmVyKGFjY2Vzc29yLCBkYXRhKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IFYgZnJvbUNvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2VJbnZlcnNlLmdldE9wdGlvbmFsU2lnbmVkRml4ZWRMZW5ndGgoYWNjZXNzb3IsIGNvbXBhcmFibGVCeXRlcywgMSk7CisgICAgfQorCiAgICAgcHVibGljIEJ5dGVCdWZmZXIgZnJvbVN0cmluZyhTdHJpbmcgc291cmNlKSB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgLy8gUmV0dXJuIGFuIGVtcHR5IEJ5dGVCdWZmZXIgZm9yIGFuIGVtcHR5IHN0cmluZy4KQEAgLTEzNiw0ICsxNTUsNDAgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcygoYnl0ZSkgLXRvQnl0ZShpbnB1dCkpOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGFicyhCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKChieXRlKSBNYXRoLmFicyh0b0J5dGUoaW5wdXQpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhwKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoKGJ5dGUpIE1hdGguZXhwKHRvQnl0ZShpbnB1dCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBsb2coQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcygoYnl0ZSkgTWF0aC5sb2codG9CeXRlKGlucHV0KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGxvZzEwKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoKGJ5dGUpIE1hdGgubG9nMTAodG9CeXRlKGlucHV0KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIHJvdW5kKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuY2xvbmUoaW5wdXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE1hc2tlZFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBNQVNLRURfVkFMVUU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9CeXRlc1R5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQnl0ZXNUeXBlLmphdmEKaW5kZXggY2FiZDAwNy4uNWU3NDJlNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9CeXRlc1R5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0J5dGVzVHlwZS5qYXZhCkBAIC0zMyw2ICszMyw4IEBACiB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCeXRlc1R5cGUgaW5zdGFuY2UgPSBuZXcgQnl0ZXNUeXBlKCk7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIE1BU0tFRF9WQUxVRSA9IEJ5dGVCdWZmZXJVdGlsLkVNUFRZX0JZVEVfQlVGRkVSOworCiAgICAgQnl0ZXNUeXBlKCkge3N1cGVyKENvbXBhcmlzb25UeXBlLkJZVEVfT1JERVIpO30gLy8gc2luZ2xldG9uCiAKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBmcm9tU3RyaW5nKFN0cmluZyBzb3VyY2UpCkBAIC05NCw0ICs5NiwxMCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIEJ5dGVzU2VyaWFsaXplci5pbnN0YW5jZTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRNYXNrZWRWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gTUFTS0VEX1ZBTFVFOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQ29sbGVjdGlvblR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQ29sbGVjdGlvblR5cGUuamF2YQppbmRleCBjNTJjZGRjLi5lNDM0NmQ1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0NvbGxlY3Rpb25UeXBlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9Db2xsZWN0aW9uVHlwZS5qYXZhCkBAIC0xOSwxNCArMTksMTcgQEAKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTDNUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ29sdW1uU3BlY2lmaWNhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkxpc3RzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuTWFwczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlNldHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ2VsbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGxQYXRoOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKQEAgLTM1LDYgKzM4LDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5NYXJzaGFsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlSW52ZXJzZTsKIAogLyoqCiAgKiBUaGUgYWJzdHJhY3QgdmFsaWRhdG9yIHRoYXQgaXMgdGhlIGJhc2UgZm9yIG1hcHMsIHNldHMgYW5kIGxpc3RzIChib3RoIGZyb3plbiBhbmQgbm9uLWZyb3plbikuCkBAIC0xNDYsMTIgKzE1MiwxMiBAQAogICAgICAgICByZXR1cm4gdmFsdWVzLnNpemUoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBzZXJpYWxpemVGb3JOYXRpdmVQcm90b2NvbChJdGVyYXRvcjxDZWxsPD8+PiBjZWxscywgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pCisgICAgcHVibGljIEJ5dGVCdWZmZXIgc2VyaWFsaXplRm9yTmF0aXZlUHJvdG9jb2woSXRlcmF0b3I8Q2VsbDw/Pj4gY2VsbHMpCiAgICAgewogICAgICAgICBhc3NlcnQgaXNNdWx0aUNlbGwoKTsKICAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiB2YWx1ZXMgPSBzZXJpYWxpemVkVmFsdWVzKGNlbGxzKTsKICAgICAgICAgaW50IHNpemUgPSBjb2xsZWN0aW9uU2l6ZSh2YWx1ZXMpOwotICAgICAgICByZXR1cm4gQ29sbGVjdGlvblNlcmlhbGl6ZXIucGFjayh2YWx1ZXMsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgc2l6ZSwgdmVyc2lvbik7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKHZhbHVlcywgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBzaXplKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE2Myw3ICsxNjksNyBAQAogICAgICAgICBpZiAoIWdldENsYXNzKCkuZXF1YWxzKHByZXZpb3VzLmdldENsYXNzKCkpKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgIENvbGxlY3Rpb25UeXBlIHRwcmV2ID0gKENvbGxlY3Rpb25UeXBlKSBwcmV2aW91czsKKyAgICAgICAgQ29sbGVjdGlvblR5cGU8Pz4gdHByZXYgPSAoQ29sbGVjdGlvblR5cGU8Pz4pIHByZXZpb3VzOwogICAgICAgICBpZiAodGhpcy5pc011bHRpQ2VsbCgpICE9IHRwcmV2LmlzTXVsdGlDZWxsKCkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKQEAgLTE5MSw3ICsxOTcsNyBAQAogICAgICAgICBpZiAoIWdldENsYXNzKCkuZXF1YWxzKHByZXZpb3VzLmdldENsYXNzKCkpKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgIENvbGxlY3Rpb25UeXBlIHRwcmV2ID0gKENvbGxlY3Rpb25UeXBlKSBwcmV2aW91czsKKyAgICAgICAgQ29sbGVjdGlvblR5cGU8Pz4gdHByZXYgPSAoQ29sbGVjdGlvblR5cGU8Pz4pIHByZXZpb3VzOwogICAgICAgICBpZiAodGhpcy5pc011bHRpQ2VsbCgpICE9IHRwcmV2LmlzTXVsdGlDZWxsKCkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKQEAgLTIyOCw3ICsyMzQsNyBAQAogICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgQ29sbGVjdGlvblR5cGUpKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgIENvbGxlY3Rpb25UeXBlIG90aGVyID0gKENvbGxlY3Rpb25UeXBlKW87CisgICAgICAgIENvbGxlY3Rpb25UeXBlPD8+IG90aGVyID0gKENvbGxlY3Rpb25UeXBlPD8+KSBvOwogCiAgICAgICAgIGlmIChraW5kICE9IG90aGVyLmtpbmQpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0yNDUsNiArMjUxLDkxIEBACiAgICAgICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKGZhbHNlKTsKICAgICB9CiAKKyAgICBzdGF0aWMgPFZMLCBWUj4gaW50IGNvbXBhcmVMaXN0T3JTZXQoQWJzdHJhY3RUeXBlPD8+IGVsZW1lbnRzQ29tcGFyYXRvciwgVkwgbGVmdCwgVmFsdWVBY2Nlc3NvcjxWTD4gYWNjZXNzb3JMLCBWUiByaWdodCwgVmFsdWVBY2Nlc3NvcjxWUj4gYWNjZXNzb3JSKQorICAgIHsKKyAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgaXMgb25seSB1c2VkIGlmIHRoZSBjb2xsZWN0aW9uIGlzIGZyb3plbgorICAgICAgICBpZiAoYWNjZXNzb3JMLmlzRW1wdHkobGVmdCkgfHwgYWNjZXNzb3JSLmlzRW1wdHkocmlnaHQpKQorICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uY29tcGFyZShhY2Nlc3NvclIuaXNFbXB0eShyaWdodCksIGFjY2Vzc29yTC5pc0VtcHR5KGxlZnQpKTsKKworICAgICAgICBpbnQgc2l6ZUwgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkQ29sbGVjdGlvblNpemUobGVmdCwgYWNjZXNzb3JMKTsKKyAgICAgICAgaW50IG9mZnNldEwgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZDb2xsZWN0aW9uU2l6ZSgpOworICAgICAgICBpbnQgc2l6ZVIgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkQ29sbGVjdGlvblNpemUocmlnaHQsIGFjY2Vzc29yUik7CisgICAgICAgIGludCBvZmZzZXRSID0gVHlwZVNpemVzLklOVF9TSVpFOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTWF0aC5taW4oc2l6ZUwsIHNpemVSKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBWTCB2MSA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRWYWx1ZShsZWZ0LCBhY2Nlc3NvckwsIG9mZnNldEwpOworICAgICAgICAgICAgb2Zmc2V0TCArPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZWYWx1ZSh2MSwgYWNjZXNzb3JMKTsKKyAgICAgICAgICAgIFZSIHYyID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZFZhbHVlKHJpZ2h0LCBhY2Nlc3NvclIsIG9mZnNldFIpOworICAgICAgICAgICAgb2Zmc2V0UiArPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZWYWx1ZSh2MiwgYWNjZXNzb3JSKTsKKyAgICAgICAgICAgIGludCBjbXAgPSBlbGVtZW50c0NvbXBhcmF0b3IuY29tcGFyZSh2MSwgYWNjZXNzb3JMLCB2MiwgYWNjZXNzb3JSKTsKKyAgICAgICAgICAgIGlmIChjbXAgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gY21wOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEludGVnZXIuY29tcGFyZShzaXplTCwgc2l6ZVIpOworICAgIH0KKworICAgIHN0YXRpYyA8Vj4gQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlc0xpc3RPclNldChBYnN0cmFjdFR5cGU8Pz4gZWxlbWVudHNDb21wYXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIGlmIChhY2Nlc3Nvci5pc0VtcHR5KGRhdGEpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgaW50IG9mZnNldCA9IDA7CisgICAgICAgIGludCBzaXplID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZENvbGxlY3Rpb25TaXplKGRhdGEsIGFjY2Vzc29yKTsKKyAgICAgICAgb2Zmc2V0ICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZkNvbGxlY3Rpb25TaXplKCk7CisgICAgICAgIEJ5dGVTb3VyY2VbXSBzcmNzID0gbmV3IEJ5dGVTb3VyY2Vbc2l6ZV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBWIHYgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkVmFsdWUoZGF0YSwgYWNjZXNzb3IsIG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mVmFsdWUodiwgYWNjZXNzb3IpOworICAgICAgICAgICAgc3Jjc1tpXSA9IGVsZW1lbnRzQ29tcGFyYXRvci5hc0NvbXBhcmFibGVCeXRlcyhhY2Nlc3NvciwgdiwgdmVyc2lvbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3JNYXliZUxlZ2FjeSh2ZXJzaW9uLCAweDAwLCBzcmNzKTsKKyAgICB9CisKKyAgICBzdGF0aWMgPFY+IFYgZnJvbUNvbXBhcmFibGVCeXRlc0xpc3RPclNldChWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gZWxlbWVudFR5cGUpCisgICAgeworICAgICAgICBpZiAoY29tcGFyYWJsZUJ5dGVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gYWNjZXNzb3IuZW1wdHkoKTsKKyAgICAgICAgYXNzZXJ0IHZlcnNpb24gIT0gQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5MRUdBQ1k7IC8vIGxlZ2FjeSB0cmFuc2xhdGlvbiBpcyBub3QgcmV2ZXJzaWJsZQorCisgICAgICAgIExpc3Q8Vj4gYnVmZmVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBpbnQgc2VwYXJhdG9yID0gY29tcGFyYWJsZUJ5dGVzLm5leHQoKTsKKyAgICAgICAgd2hpbGUgKHNlcGFyYXRvciAhPSBCeXRlU291cmNlLlRFUk1JTkFUT1IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghQnl0ZVNvdXJjZUludmVyc2UubmV4dENvbXBvbmVudE51bGwoc2VwYXJhdG9yKSkKKyAgICAgICAgICAgICAgICBidWZmZXJzLmFkZChlbGVtZW50VHlwZS5mcm9tQ29tcGFyYWJsZUJ5dGVzKGFjY2Vzc29yLCBjb21wYXJhYmxlQnl0ZXMsIHZlcnNpb24pKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBidWZmZXJzLmFkZChudWxsKTsKKyAgICAgICAgICAgIHNlcGFyYXRvciA9IGNvbXBhcmFibGVCeXRlcy5uZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25TZXJpYWxpemVyLnBhY2soYnVmZmVycywgYWNjZXNzb3IsIGJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzZXRPckxpc3RUb0pzb25TdHJpbmcoQnl0ZUJ1ZmZlciBidWZmZXIsIEFic3RyYWN0VHlwZTw/PiBlbGVtZW50c1R5cGUsIFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pCisgICAgeworICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gYnVmZmVyLmR1cGxpY2F0ZSgpOworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIlsiKTsKKyAgICAgICAgaW50IHNpemUgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkQ29sbGVjdGlvblNpemUodmFsdWUsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSk7CisgICAgICAgIGludCBvZmZzZXQgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZDb2xsZWN0aW9uU2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgZWxlbWVudCA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRWYWx1ZSh2YWx1ZSwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBvZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZlZhbHVlKGVsZW1lbnQsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoZWxlbWVudHNUeXBlLnRvSlNPTlN0cmluZyhlbGVtZW50LCBwcm90b2NvbFZlcnNpb24pKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IuYXBwZW5kKCJdIikudG9TdHJpbmcoKTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb2xsZWN0aW9uUGF0aFNlcmlhbGl6ZXIgaW1wbGVtZW50cyBDZWxsUGF0aC5TZXJpYWxpemVyCiAgICAgewogICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoQ2VsbFBhdGggcGF0aCwgRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KQEAgLTI2Nyw0ICszNTgsMTEgQEAKICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLnNraXBXaXRoVkludExlbmd0aChpbik7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwdWJsaWMgaW50IHNpemUoQnl0ZUJ1ZmZlciBidWZmZXIpCisgICAgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZENvbGxlY3Rpb25TaXplKGJ1ZmZlci5kdXBsaWNhdGUoKSwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmb3JFYWNoKEJ5dGVCdWZmZXIgaW5wdXQsIENvbnN1bWVyPEJ5dGVCdWZmZXI+IGFjdGlvbik7CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0NvbXBvc2l0ZVR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQ29tcG9zaXRlVHlwZS5qYXZhCmluZGV4IGJmNWU5MTRhLi4wMGNiZWI1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0NvbXBvc2l0ZVR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0NvbXBvc2l0ZVR5cGUuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRNYXA7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKIApAQCAtMzEsNiArMzIsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuU3ludGF4RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLk1hcnNoYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGUuVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2VJbnZlcnNlOwogCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLmFueTsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXMudHJhbnNmb3JtOwpAQCAtMTY1LDYgKzE2OSw4NiBAQAogICAgICAgICByZXR1cm4gdHlwZXMuZ2V0KGkpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBWIGRhdGEsIFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIGlmIChkYXRhID09IG51bGwgfHwgYWNjZXNzb3IuaXNFbXB0eShkYXRhKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIEJ5dGVTb3VyY2VbXSBzcmNzID0gbmV3IEJ5dGVTb3VyY2VbdHlwZXMuc2l6ZSgpICogMiArIDFdOworICAgICAgICBpbnQgbGVuZ3RoID0gYWNjZXNzb3Iuc2l6ZShkYXRhKTsKKworICAgICAgICAvLyBzdGF0aWNzIGdvIGZpcnN0CisgICAgICAgIGJvb2xlYW4gaXNTdGF0aWMgPSByZWFkSXNTdGF0aWNJbnRlcm5hbChkYXRhLCBhY2Nlc3Nvcik7CisgICAgICAgIGludCBvZmZzZXQgPSBzdGFydGluZ09mZnNldEludGVybmFsKGlzU3RhdGljKTsKKyAgICAgICAgc3Jjc1swXSA9IGlzU3RhdGljID8gbnVsbCA6IEJ5dGVTb3VyY2UuRU1QVFk7CisKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBieXRlIGxhc3RFb2MgPSAwOworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBPbmx5IHRoZSBlbmQtb2YtY29tcG9uZW50IGJ5dGUgb2YgdGhlIGxhc3QgY29tcG9uZW50IG9mIHRoaXMgY29tcG9zaXRlIGNhbiBiZSBub24temVybywgc28gdGhlCisgICAgICAgICAgICAvLyBjb21wb25lbnQgYmVmb3JlIGNhbid0IGhhdmUgYSBub24temVybyBlbmQtb2YtY29tcG9uZW50IGJ5dGUuCisgICAgICAgICAgICBhc3NlcnQgbGFzdEVvYyA9PSAwIDogbGFzdEVvYzsKKworICAgICAgICAgICAgaW50IGNvbXBvbmVudExlbmd0aCA9IGFjY2Vzc29yLmdldFVuc2lnbmVkU2hvcnQoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgc3Jjc1tpICogMiArIDFdID0gdHlwZXMuZ2V0KGkpLmFzQ29tcGFyYWJsZUJ5dGVzKGFjY2Vzc29yLCBhY2Nlc3Nvci5zbGljZShkYXRhLCBvZmZzZXQsIGNvbXBvbmVudExlbmd0aCksIHZlcnNpb24pOworICAgICAgICAgICAgb2Zmc2V0ICs9IGNvbXBvbmVudExlbmd0aDsKKyAgICAgICAgICAgIGxhc3RFb2MgPSBhY2Nlc3Nvci5nZXRCeXRlKGRhdGEsIG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gMTsKKyAgICAgICAgICAgIHNyY3NbaSAqIDIgKyAyXSA9IEJ5dGVTb3VyY2Uub25lQnl0ZShsYXN0RW9jICYgMHhGRiBeIDB4ODApOyAvLyBlbmQtb2YtY29tcG9uZW50IGFsc28gdGFrZXMgcGFydCBpbiBjb21wYXJpc29uIGFzIHNpZ25lZCBieXRlCisgICAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICAgICAgLy8gQSBjb21wb3NpdGUgbWF5IGJlIGxlYXZpbmcgc29tZSB2YWx1ZXMgdW5zcGVjaWZpZWQuIElmIHRoaXMgaXMgdGhlIGNhc2UsIG1ha2Ugc3VyZSB3ZSB0ZXJtaW5hdGUgZWFybHkKKyAgICAgICAgLy8gc28gdGhhdCB0cmFuc2xhdGlvbnMgY3JlYXRlZCBiZWZvcmUgYW4gZXh0cmEgZmllbGQgd2FzIGFkZGVkIG1hdGNoIHRyYW5zbGF0aW9ucyB0aGF0IGhhdmUgdGhlIGZpZWxkIGJ1dCBkb24ndAorICAgICAgICAvLyBzcGVjaWZ5IGEgdmFsdWUgZm9yIGl0LgorICAgICAgICBpZiAoaSAqIDIgKyAxIDwgc3Jjcy5sZW5ndGgpCisgICAgICAgICAgICBzcmNzID0gQXJyYXlzLmNvcHlPZlJhbmdlKHNyY3MsIDAsIGkgKiAyICsgMSk7CisKKyAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3JNYXliZUxlZ2FjeSh2ZXJzaW9uLCBCeXRlU291cmNlLkVORF9PRl9TVFJFQU0sIHNyY3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gViBmcm9tQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBWZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICAvLyBGb3IgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5MRUdBQ1kgdGhlIHRlcm1pbmF0b3IgYnl0ZSBpcyBCeXRlU291cmNlLkVORF9PRl9TVFJFQU0uIFRoZSBsYXR0ZXIgbWVhbnMgdGhhdCBpdCdzCisgICAgICAgIC8vIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhlIEVORF9PRl9TVFJFQU0gYnl0ZSB0aGF0IGdldHMgcmV0dXJuZWQgX2FmdGVyXyB0aGUgdGVybWluYXRvciBieXRlIGhhcyBhbHJlYWR5CisgICAgICAgIC8vIGJlZW4gY29uc3VtZWQsIHdoZW4gdGhlIGNvbXBvc2l0ZSBpcyBwYXJ0IG9mIGEgbXVsdGktY29tcG9uZW50IHNlcXVlbmNlLiBTbyBpZiBpbiBzdWNoIGEgc2NlbmFyaW8gd2UgY29uc3VtZQorICAgICAgICAvLyB0aGUgQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNIHRlcm1pbmF0b3IgaGVyZSwgdGhpcyB3aWxsIHJlc3VsdCBpbiBhY3R1YWxseSBjb25zdW1pbmcgdGhlIG11bHRpLWNvbXBvbmVudAorICAgICAgICAvLyBzZXF1ZW5jZSBzZXBhcmF0b3IgYWZ0ZXIgaXQgYW5kIGp1bXBpbmcgZGlyZWN0bHkgaW50byB0aGUgYnl0ZXMgb2YgdGhlIG5leHQgY29tcG9uZW50LCB3aGVuIHdlIHRyeSB0bworICAgICAgICAvLyBjb25zdW1lIHRoZSAoYWxyZWFkeSBjb25zdW1lZCkgc2VwYXJhdG9yLgorICAgICAgICAvLyBJbnN0ZWFkIG9mIHRyeWluZyB0byBmaW5kIGEgd2F5IGFyb3VuZCB0aGUgc2l0dWF0aW9uLCB3ZSBjYW4ganVzdCB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IHdlIGRvbid0CisgICAgICAgIC8vIG5lZWQgdG8gZGVjb2RlIGZyb20gVmVyc2lvbi5MRUdBQ1ksIGFzc3VtZSB0aGF0IHdlIG5ldmVyIGRvIHRoYXQsIGFuZCBhc3NlcnQgaXQgaGVyZS4KKyAgICAgICAgYXNzZXJ0IHZlcnNpb24gIT0gVmVyc2lvbi5MRUdBQ1k7CisKKyAgICAgICAgaWYgKGNvbXBhcmFibGVCeXRlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc29yLmVtcHR5KCk7CisKKyAgICAgICAgaW50IHNlcGFyYXRvciA9IGNvbXBhcmFibGVCeXRlcy5uZXh0KCk7CisgICAgICAgIGJvb2xlYW4gaXNTdGF0aWMgPSBCeXRlU291cmNlSW52ZXJzZS5uZXh0Q29tcG9uZW50TnVsbChzZXBhcmF0b3IpOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIFZbXSBidWZmZXJzID0gYWNjZXNzb3IuY3JlYXRlQXJyYXkodHlwZXMuc2l6ZSgpKTsKKyAgICAgICAgYnl0ZSBsYXN0RW9jID0gMDsKKworICAgICAgICB3aGlsZSAoKHNlcGFyYXRvciA9IGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpICE9IEJ5dGVTb3VyY2UuVEVSTUlOQVRPUiAmJiBpIDwgdHlwZXMuc2l6ZSgpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBPbmx5IHRoZSBlbmQtb2YtY29tcG9uZW50IGJ5dGUgb2YgdGhlIGxhc3QgY29tcG9uZW50IG9mIHRoaXMgY29tcG9zaXRlIGNhbiBiZSBub24temVybywgc28gdGhlCisgICAgICAgICAgICAvLyBjb21wb25lbnQgYmVmb3JlIGNhbid0IGhhdmUgYSBub24temVybyBlbmQtb2YtY29tcG9uZW50IGJ5dGUuCisgICAgICAgICAgICBhc3NlcnQgbGFzdEVvYyA9PSAwIDogbGFzdEVvYzsKKworICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IHR5cGUgYW5kIGRlY29kZSBpdHMgcGF5bG9hZC4KKyAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiB0eXBlID0gdHlwZXMuZ2V0KGkpOworICAgICAgICAgICAgViBkZWNvZGVkID0gdHlwZS5mcm9tQ29tcGFyYWJsZUJ5dGVzKGFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2VJbnZlcnNlLm5leHRDb21wb25lbnRTb3VyY2UoY29tcGFyYWJsZUJ5dGVzLCBzZXBhcmF0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24pOworICAgICAgICAgICAgYnVmZmVyc1tpKytdID0gZGVjb2RlZDsKKworICAgICAgICAgICAgbGFzdEVvYyA9IEJ5dGVTb3VyY2VJbnZlcnNlLmdldFNpZ25lZEJ5dGUoQnl0ZVNvdXJjZUludmVyc2UubmV4dENvbXBvbmVudFNvdXJjZShjb21wYXJhYmxlQnl0ZXMpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGQoYWNjZXNzb3IsIGlzU3RhdGljLCBBcnJheXMuY29weU9mKGJ1ZmZlcnMsIGkpLCBsYXN0RW9jKTsKKyAgICB9CisKICAgICBwcm90ZWN0ZWQgUGFyc2VkQ29tcGFyYXRvciBwYXJzZUNvbXBhcmF0b3IoaW50IGksIFN0cmluZyBwYXJ0KQogICAgIHsKICAgICAgICAgcmV0dXJuIG5ldyBTdGF0aWNQYXJzZWRDb21wYXJhdG9yKHR5cGVzLmdldChpKSwgcGFydCk7CkBAIC0zNzEsNiArNDU1LDEyIEBACiAgICAgQFNhZmVWYXJhcmdzCiAgICAgcHVibGljIHN0YXRpYyA8Vj4gViBidWlsZChWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBib29sZWFuIGlzU3RhdGljLCBWLi4uIHZhbHVlcykKICAgICB7CisgICAgICAgIHJldHVybiBidWlsZChhY2Nlc3NvciwgaXNTdGF0aWMsIHZhbHVlcywgKGJ5dGUpIDApOworICAgIH0KKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBzdGF0aWMgPFY+IFYgYnVpbGQoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgYm9vbGVhbiBpc1N0YXRpYywgVltdIHZhbHVlcywgYnl0ZSBsYXN0RW9jKQorICAgIHsKICAgICAgICAgaW50IHRvdGFsTGVuZ3RoID0gaXNTdGF0aWMgPyAyIDogMDsKICAgICAgICAgZm9yIChWIHYgOiB2YWx1ZXMpCiAgICAgICAgICAgICB0b3RhbExlbmd0aCArPSAyICsgYWNjZXNzb3Iuc2l6ZSh2KSArIDE7CkBAIC0zODAsMTEgKzQ3MCwxMiBAQAogICAgICAgICBpZiAoaXNTdGF0aWMpCiAgICAgICAgICAgICBvdXQucHV0U2hvcnQoKHNob3J0KVNUQVRJQ19NQVJLRVIpOwogCi0gICAgICAgIGZvciAoViB2IDogdmFsdWVzKQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7ICsraSkKICAgICAgICAgeworICAgICAgICAgICAgViB2ID0gdmFsdWVzW2ldOwogICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVTaG9ydExlbmd0aChvdXQsIGFjY2Vzc29yLnNpemUodikpOwogICAgICAgICAgICAgYWNjZXNzb3Iud3JpdGUodiwgb3V0KTsKLSAgICAgICAgICAgIG91dC5wdXQoKGJ5dGUpIDApOworICAgICAgICAgICAgb3V0LnB1dChpICE9IHZhbHVlcy5sZW5ndGggLSAxID8gKGJ5dGUpIDAgOiBsYXN0RW9jKTsKICAgICAgICAgfQogICAgICAgICBvdXQuZmxpcCgpOwogICAgICAgICByZXR1cm4gYWNjZXNzb3IudmFsdWVPZihvdXQpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9Db3VudGVyQ29sdW1uVHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9Db3VudGVyQ29sdW1uVHlwZS5qYXZhCmluZGV4IDBkYWUwOTIuLmFkMDJiZmIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQ291bnRlckNvbHVtblR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0NvdW50ZXJDb2x1bW5UeXBlLmphdmEKQEAgLTMyLDYgKzMyLDggQEAKIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvdW50ZXJDb2x1bW5UeXBlIGluc3RhbmNlID0gbmV3IENvdW50ZXJDb2x1bW5UeXBlKCk7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIE1BU0tFRF9WQUxVRSA9IGluc3RhbmNlLmRlY29tcG9zZSgwTCk7CisKICAgICBDb3VudGVyQ29sdW1uVHlwZSgpIHtzdXBlcihDb21wYXJpc29uVHlwZS5OT1RfQ09NUEFSQUJMRSk7fSAvLyBzaW5nbGV0b24KIAogICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHlWYWx1ZU1lYW5pbmdsZXNzKCkKQEAgLTEyOCw0ICsxMzAsNDAgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcygtdG9Mb25nKGlucHV0KSk7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgYWJzKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoTWF0aC5hYnModG9Mb25nKGlucHV0KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4cChCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKChsb25nKSBNYXRoLmV4cCh0b0xvbmcoaW5wdXQpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgbG9nKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoKGxvbmcpIE1hdGgubG9nKHRvTG9uZyhpbnB1dCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBsb2cxMChCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKChsb25nKSBNYXRoLmxvZzEwKHRvTG9uZyhpbnB1dCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciByb3VuZChCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmNsb25lKGlucHV0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRNYXNrZWRWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gTUFTS0VEX1ZBTFVFOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvRGF0ZVR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvRGF0ZVR5cGUuamF2YQppbmRleCA0NzNjZWRmLi5mNWY3ODZkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0RhdGVUeXBlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9EYXRlVHlwZS5qYXZhCkBAIC0zMSw2ICszMSw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZUludmVyc2U7CiAKIC8qKgogICogVGhpcyBpcyB0aGUgb2xkIHZlcnNpb24gb2YgVGltZXN0YW1wVHlwZSwgYnV0IGhhcyBiZWVuIHJlcGxhY2VkIGFzIGl0IHdhc24ndCBjb21wYXJpbmcgcHJlLWVwb2NoIHRpbWVzdGFtcHMKQEAgLTQzLDYgKzQ2LDggQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRGF0ZVR5cGUgaW5zdGFuY2UgPSBuZXcgRGF0ZVR5cGUoKTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgTUFTS0VEX1ZBTFVFID0gaW5zdGFuY2UuZGVjb21wb3NlKG5ldyBEYXRlKDApKTsKKwogICAgIERhdGVUeXBlKCkge3N1cGVyKENvbXBhcmlzb25UeXBlLkJZVEVfT1JERVIpO30gLy8gc2luZ2xldG9uCiAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5VmFsdWVNZWFuaW5nbGVzcygpCkBAIC01MCw2ICs1NSwxOSBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICAvLyBXaGlsZSBCWVRFX09SREVSIHdvdWxkIHN0aWxsIHdvcmsgZm9yIHRoaXMgdHlwZSwgbWFraW5nIHVzZSBvZiB0aGUgZml4ZWQgbGVuZ3RoIGlzIG1vcmUgZWZmaWNpZW50LgorICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZS5vcHRpb25hbEZpeGVkTGVuZ3RoKGFjY2Vzc29yLCBkYXRhKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IFYgZnJvbUNvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2VJbnZlcnNlLmdldE9wdGlvbmFsRml4ZWRMZW5ndGgoYWNjZXNzb3IsIGNvbXBhcmFibGVCeXRlcywgOCk7CisgICAgfQorCiAgICAgcHVibGljIEJ5dGVCdWZmZXIgZnJvbVN0cmluZyhTdHJpbmcgc291cmNlKSB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbgogICAgIHsKICAgICAgIC8vIFJldHVybiBhbiBlbXB0eSBCeXRlQnVmZmVyIGZvciBhbiBlbXB0eSBzdHJpbmcuCkBAIC0xMjMsNCArMTQxLDEwIEBACiAgICAgewogICAgICAgICByZXR1cm4gODsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRNYXNrZWRWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gTUFTS0VEX1ZBTFVFOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvRGVjaW1hbFR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvRGVjaW1hbFR5cGUuamF2YQppbmRleCA1NzQwZmRjLi45MmQ2ODhjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0RlY2ltYWxUeXBlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9EZWNpbWFsVHlwZS5qYXZhCkBAIC0yNCw2ICsyNCw4IEBACiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuSW50czsKKwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5UZXJtOwpAQCAtMzIsMTUgKzM0LDMxIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CisKK2ltcG9ydCBjaC5vYmVybXVobG5lci5tYXRoLmJpZy5CaWdEZWNpbWFsTWF0aDsKIAogcHVibGljIGNsYXNzIERlY2ltYWxUeXBlIGV4dGVuZHMgTnVtYmVyVHlwZTxCaWdEZWNpbWFsPgogewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRGVjaW1hbFR5cGUgaW5zdGFuY2UgPSBuZXcgRGVjaW1hbFR5cGUoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgTUFTS0VEX1ZBTFVFID0gaW5zdGFuY2UuZGVjb21wb3NlKEJpZ0RlY2ltYWwuWkVSTyk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9TQ0FMRSA9IDMyOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fU0lHTklGSUNBTlRfRElHSVRTID0gTUlOX1NDQUxFOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfU0NBTEUgPSAxMDAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hdGhDb250ZXh0IE1BWF9QUkVDSVNJT04gPSBuZXcgTWF0aENvbnRleHQoMTAwMDApOwogCisgICAgLy8gQ29uc3RhbnRzIG9yIGVzY2FwaW5nIHZhbHVlcyBuZWVkZWQgdG8gZW5jb2RlL2RlY29kZSB2YXJpYWJsZS1sZW5ndGggZmxvYXRpbmcgcG9pbnQgbnVtYmVycyAoZGVjaW1hbHMpIGluIG91cgorICAgIC8vIGN1c3RvbSBieXRlLW9yZGVyZWQgZW5jb2Rpbmcgc2NoZW1lLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT1NJVElWRV9ERUNJTUFMX0hFQURFUl9NQVNLID0gMHg4MDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTkVHQVRJVkVfREVDSU1BTF9IRUFERVJfTUFTSyA9IDB4MDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFQ0lNQUxfRVhQT05FTlRfTEVOR1RIX0hFQURFUl9NQVNLID0gMHg0MDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIERFQ0lNQUxfTEFTVF9CWVRFID0gKGJ5dGUpIDB4MDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBIVU5EUkVEID0gQmlnSW50ZWdlci52YWx1ZU9mKDEwMCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIFpFUk9fQlVGRkVSID0gaW5zdGFuY2UuZGVjb21wb3NlKEJpZ0RlY2ltYWwuWkVSTyk7CisKICAgICBEZWNpbWFsVHlwZSgpIHtzdXBlcihDb21wYXJpc29uVHlwZS5DVVNUT00pO30gLy8gc2luZ2xldG9uCiAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5VmFsdWVNZWFuaW5nbGVzcygpCkBAIC01OSw2ICs3NywxOTYgQEAKICAgICAgICAgcmV0dXJuIGNvbXBhcmVDb21wb3NlZChsZWZ0LCBhY2Nlc3NvckwsIHJpZ2h0LCBhY2Nlc3NvclIsIHRoaXMpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBieXRlLWNvbXBhcmFibGUgcmVwcmVzZW50YXRpb24uCisgICAgICogVGhpcyBpcyByYXRoZXIgZGlmZmljdWx0IGFuZCBpbnZvbHZlcyByZWNvbnN0cnVjdGluZyB0aGUgZGVjaW1hbC4KKyAgICAgKgorICAgICAqIFRvIGNvbXBhcmUsIHdlIG5lZWQgYSBub3JtYWxpemVkIHZhbHVlLCBpLmUuIG9uZSB3aXRoIGEgc2lnbiwgZXhwb25lbnQgYW5kICgwLDEpIG1hbnRpc3NhLiBUbyBhdm9pZAorICAgICAqIGxvc3Mgb2YgcHJlY2lzaW9uLCBib3RoIGV4cG9uZW50IGFuZCBtYW50aXNzYSBuZWVkIHRvIGJlIGJhc2UtMTAwLiAgV2UgY2FuJ3QgZ2V0IHRoaXMgZGlyZWN0bHkgb2ZmIHRoZSBzZXJpYWxpemVkCisgICAgICogYnl0ZXMsIGFzIHRoZXkgaGF2ZSBiYXNlLTEwIHNjYWxlIGFuZCBiYXNlLTI1NiB1bnNjYWxlZCBwYXJ0LgorICAgICAqCisgICAgICogV2Ugc3RvcmU6CisgICAgICogICAgIC0gc2lnbiBiaXQgaW52ZXJ0ZWQgKiAweDgwICsgMHg0MCArIHNpZ25lZCBleHBvbmVudCBsZW5ndGgsIHdoZXJlIGV4cG9uZW50IGlzIG5lZ2F0ZWQgaWYgdmFsdWUgaXMgbmVnYXRpdmUKKyAgICAgKiAgICAgLSB6ZXJvIG9yIG1vcmUgZXhwb25lbnQgYnl0ZXMgKGFzIGdpdmVuIGJ5IGxlbmd0aCkKKyAgICAgKiAgICAgLSAweDgwICsgZmlyc3QgcGFpciBvZiBkZWNpbWFsIGRpZ2l0cywgbmVnYXRpdmUgaWYgdmFsdWUgaXMgbmVnYXRpdmUsIHJvdW5kZWQgdG8gLWluZgorICAgICAqICAgICAtIHplcm8gb3IgbW9yZSAweDgwICsgcGFpciBvZiBkZWNpbWFsIGRpZ2l0cywgYWx3YXlzIHBvc2l0aXZlCisgICAgICogICAgIC0gdHJhaWxpbmcgMHgwMAorICAgICAqIFplcm8gaXMgc3BlY2lhbC1jYXNlZCBhcyAweDgwLgorICAgICAqCisgICAgICogQmVjYXVzZSB0aGUgdHJhaWxpbmcgMDAgY2Fubm90IGJlIHByb2R1Y2VkIGZyb20gYSBwYWlyIG9mIGRlY2ltYWwgZGlnaXRzIChwb3NpdGl2ZSBvciBub3QpLCBubyB2YWx1ZSBjYW4gYmUKKyAgICAgKiBhIHByZWZpeCBvZiBhbm90aGVyLgorICAgICAqCisgICAgICogRW5jb2RpbmcgZXhhbXBsZXM6CisgICAgICogICAgMS4xICAgIGFzICAgICAgIGMxID0gMHg4MCAocG9zaXRpdmUgbnVtYmVyKSArIDB4NDAgKyAocG9zaXRpdmUgZXhwb25lbnQpIDB4MDEgKGV4cCBsZW5ndGggMSkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgMDEgPSBleHBvbmVudCAxICgxMDBeMSkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgODEgPSAweDgwICsgMDEgKDAuMDEpCisgICAgICogICAgICAgICAgICAgICAgICAgIDhhID0gMHg4MCArIDEwICguLi4uMTApICAgMC4wMTEwZTIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgMDAKKyAgICAgKiAgICAtMSAgICAgYXMgICAgICAgM2YgPSAweDAwIChuZWdhdGl2ZSBudW1iZXIpICsgMHg0MCAtIChuZWdhdGl2ZSBleHBvbmVudCkgMHgwMSAoZXhwIGxlbmd0aCAxKQorICAgICAqICAgICAgICAgICAgICAgICAgICBmZiA9IGV4cG9uZW50IC0xLiBuZWdhdGl2ZSBudW1iZXIsIHRodXMgMTAwXjEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgN2YgPSAweDgwIC0gMDEgKC0wLjAxKSAgICAtMC4wMWUyCisgICAgICogICAgICAgICAgICAgICAgICAgIDAwCisgICAgICogICAgLTk5LjkgIGFzICAgICAgIDNmID0gMHgwMCAobmVnYXRpdmUgbnVtYmVyKSArIDB4NDAgLSAobmVnYXRpdmUgZXhwb25lbnQpIDB4MDEgKGV4cCBsZW5ndGggMSkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgZmYgPSBleHBvbmVudCAtMS4gbmVnYXRpdmUgbnVtYmVyLCB0aHVzIDEwMF4xCisgICAgICogICAgICAgICAgICAgICAgICAgIDFjID0gMHg4MCAtIDEwMCAoLTEuMDApCisgICAgICogICAgICAgICAgICAgICAgICAgIDhhID0gMHg4MCArIDEwICAoKy4uLi4xMCkgLTAuOTk5ZTIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgMDAKKyAgICAgKgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBWIGRhdGEsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIEJpZ0RlY2ltYWwgdmFsdWUgPSBjb21wb3NlKGRhdGEsIGFjY2Vzc29yKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKHZhbHVlLmNvbXBhcmVUbyhCaWdEZWNpbWFsLlpFUk8pID09IDApICAvLyBOb3RlOiAwLmVxdWFscygwLjApIHJldHVybnMgZmFsc2UhCisgICAgICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZS5vbmVCeXRlKFBPU0lUSVZFX0RFQ0lNQUxfSEVBREVSX01BU0spOworCisgICAgICAgIGxvbmcgc2NhbGUgPSAoKChsb25nKSB2YWx1ZS5zY2FsZSgpKSAtIHZhbHVlLnByZWNpc2lvbigpKSAmIH4xOworICAgICAgICBib29sZWFuIG5lZ2F0aXZlID0gdmFsdWUuc2lnbnVtKCkgPCAwOworICAgICAgICAvLyBNYWtlIGEgYmFzZS0xMDAgZXhwb25lbnQgKHRoaXMgd2lsbCBhbHdheXMgZml0IGluIGFuIGludCkuCisgICAgICAgIGludCBleHBvbmVudCA9IE1hdGgudG9JbnRFeGFjdCgtc2NhbGUgPj4gMSk7CisgICAgICAgIC8vIEZsaXAgdGhlIGV4cG9uZW50IHNpZ24gZm9yIG5lZ2F0aXZlIG51bWJlcnMsIHNvIHRoYXQgb25lcyB3aXRoIGxhcmdlciBtYWduaXR1ZGVzIGFyZSBwcm9wZWx5IHRyZWF0ZWQgYXMgc21hbGxlci4KKyAgICAgICAgZmluYWwgaW50IG1vZHVsYXRlZEV4cG9uZW50ID0gbmVnYXRpdmUgPyAtZXhwb25lbnQgOiBleHBvbmVudDsKKyAgICAgICAgLy8gV2Ugc2hvdWxkIG5ldmVyIGhhdmUgc2NhbGUgPiBJbnRlZ2VyLk1BWF9WQUxVRSwgYXMgd2UncmUgYWx3YXlzIHN1YnRyYWN0aW5nIHRoZSBub24tbmVnYXRpdmUgcHJlY2lzaW9uIG9mCisgICAgICAgIC8vIHRoZSBlbmNvZGVkIEJpZ0RlY2ltYWwsIGFuZCBmdXJ0aGVybW9yZSB3ZSdyZSByb3VuZGluZyB0byBuZWdhdGl2ZSBpbmZpbml0eS4KKyAgICAgICAgYXNzZXJ0IHNjYWxlIDw9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAvLyBIb3dldmVyLCB3ZSBtYXkgZW5kIHVwIG92ZXJmbG93aW5nIG9uIHRoZSBuZWdhdGl2ZSBzaWRlLgorICAgICAgICBpZiAoc2NhbGUgPCBJbnRlZ2VyLk1JTl9WQUxVRSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQXMgc2NhbGVCeVBvd2VyT2ZUZW4gbmVlZHMgYW4gaW50IHNjYWxlLCBkbyB0aGUgc2NhbGluZyBpbiB0d28gc3RlcHMuCisgICAgICAgICAgICBpbnQgbXYgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc2NhbGVCeVBvd2VyT2ZUZW4obXYpOworICAgICAgICAgICAgc2NhbGUgLT0gbXY7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQmlnRGVjaW1hbCBtYW50aXNzYSA9IHZhbHVlLnNjYWxlQnlQb3dlck9mVGVuKEludHMuY2hlY2tlZENhc3Qoc2NhbGUpKS5zdHJpcFRyYWlsaW5nWmVyb3MoKTsKKyAgICAgICAgLy8gV2Ugbm93IGhhdmUgYSBzbWFsbGVyLXRoYW4tb25lIHNpZ25lZCBtYW50aXNzYSwgYW5kIGEgc2lnbmVkIGFuZCBtb2R1bGF0ZWQgYmFzZS0xMDAgZXhwb25lbnQuCisgICAgICAgIGFzc2VydCBtYW50aXNzYS5hYnMoKS5jb21wYXJlVG8oQmlnRGVjaW1hbC5PTkUpIDwgMDsKKworICAgICAgICByZXR1cm4gbmV3IEJ5dGVTb3VyY2UoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBTdGFydCB3aXRoIHVwIHRvIDUgYnl0ZXMgZm9yIHNpZ24gKyBleHBvbmVudC4KKyAgICAgICAgICAgIGludCBleHBvbmVudEJ5dGVzTGVmdCA9IDU7CisgICAgICAgICAgICBCaWdEZWNpbWFsIGN1cnJlbnQgPSBtYW50aXNzYTsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IG5leHQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChleHBvbmVudEJ5dGVzTGVmdCA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAtLWV4cG9uZW50Qnl0ZXNMZWZ0OworICAgICAgICAgICAgICAgICAgICBpZiAoZXhwb25lbnRCeXRlc0xlZnQgPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBsZWFkaW5nIHplcm8gYnl0ZXMgaW4gdGhlIG1vZHVsYXRlZEV4cG9uZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgZXhwb25lbnRCeXRlc0xlZnQgLT0gSW50ZWdlci5udW1iZXJPZkxlYWRpbmdaZXJvcyhNYXRoLmFicyhtb2R1bGF0ZWRFeHBvbmVudCkpIC8gODsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdyBwcmVwYXJlIHRoZSBsZWFkaW5nIGJ5dGUgd2hpY2ggaW5jbHVkZXMgdGhlIHNpZ24gb2YgdGhlIG51bWJlciBwbHVzIHRoZSBzaWduIGFuZCBsZW5ndGggb2YgdGhlIG1vZHVsYXRlZEV4cG9uZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4cGxlbiA9IERFQ0lNQUxfRVhQT05FTlRfTEVOR1RIX0hFQURFUl9NQVNLICsgKG1vZHVsYXRlZEV4cG9uZW50IDwgMCA/IC1leHBvbmVudEJ5dGVzTGVmdCA6IGV4cG9uZW50Qnl0ZXNMZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHBsZW4gKyAobmVnYXRpdmUgPyBORUdBVElWRV9ERUNJTUFMX0hFQURFUl9NQVNLIDogUE9TSVRJVkVfREVDSU1BTF9IRUFERVJfTUFTSyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtb2R1bGF0ZWRFeHBvbmVudCA+PiAoZXhwb25lbnRCeXRlc0xlZnQgKiA4KSkgJiAweEZGOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudC5jb21wYXJlVG8oQmlnRGVjaW1hbC5aRVJPKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAweDAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCaWdEZWNpbWFsIHYgPSBjdXJyZW50LnNjYWxlQnlQb3dlck9mVGVuKDIpOworICAgICAgICAgICAgICAgICAgICBCaWdEZWNpbWFsIGZsb29yID0gdi5zZXRTY2FsZSgwLCBSb3VuZGluZ01vZGUuRkxPT1IpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdi5zdWJ0cmFjdChmbG9vcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbG9vci5ieXRlVmFsdWVFeGFjdCgpICsgMHg4MDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBWIGZyb21Db21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIGlmIChjb21wYXJhYmxlQnl0ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBhY2Nlc3Nvci5lbXB0eSgpOworCisgICAgICAgIGludCBoZWFkZXJCaXRzID0gY29tcGFyYWJsZUJ5dGVzLm5leHQoKTsKKyAgICAgICAgaWYgKGhlYWRlckJpdHMgPT0gUE9TSVRJVkVfREVDSU1BTF9IRUFERVJfTUFTSykKKyAgICAgICAgICAgIHJldHVybiBhY2Nlc3Nvci52YWx1ZU9mKFpFUk9fQlVGRkVSKTsKKworICAgICAgICAvLyBJLiBFeHRyYWN0IHRoZSBleHBvbmVudC4KKyAgICAgICAgLy8gVGhlIHNpZ24gb2YgdGhlIGRlY2ltYWwsIGFuZCB0aGUgc2lnbiBhbmQgdGhlIGxlbmd0aCAoaW4gYnl0ZXMpIG9mIHRoZSBkZWNpbWFsIGV4cG9uZW50LCBhcmUgYWxsIGVuY29kZWQgaW4KKyAgICAgICAgLy8gdGhlIGZpcnN0IGJ5dGUuCisgICAgICAgIC8vIEdldCB0aGUgc2lnbiBvZiB0aGUgZGVjaW1hbC4uLgorICAgICAgICBib29sZWFuIGlzTmVnYXRpdmUgPSBoZWFkZXJCaXRzIDwgUE9TSVRJVkVfREVDSU1BTF9IRUFERVJfTUFTSzsKKyAgICAgICAgaGVhZGVyQml0cyAtPSBpc05lZ2F0aXZlID8gTkVHQVRJVkVfREVDSU1BTF9IRUFERVJfTUFTSyA6IFBPU0lUSVZFX0RFQ0lNQUxfSEVBREVSX01BU0s7CisgICAgICAgIGhlYWRlckJpdHMgLT0gREVDSU1BTF9FWFBPTkVOVF9MRU5HVEhfSEVBREVSX01BU0s7CisgICAgICAgIC8vIEdldCB0aGUgc2lnbiBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgZXhwb25lbnQgKHRoZSBsYXR0ZXIgaXMgZW5jb2RlZCBhcyBpdHMgbmVnYXRpdmUgaWYgdGhlIHNpZ24gb2YgdGhlCisgICAgICAgIC8vIGV4cG9uZW50IGlzIG5lZ2F0aXZlKS4uLgorICAgICAgICBib29sZWFuIGlzRXhwb25lbnROZWdhdGl2ZSA9IGhlYWRlckJpdHMgPCAwOworICAgICAgICBoZWFkZXJCaXRzID0gaXNFeHBvbmVudE5lZ2F0aXZlID8gLWhlYWRlckJpdHMgOiBoZWFkZXJCaXRzOworICAgICAgICAvLyBOb3cgY29uc3VtZSB0aGUgZXhwb25lbnQgYnl0ZXMuIElmIHRoZSBleHBvbmVudCBpcyBuZWdhdGl2ZSBhbmQgdXNlcyBsZXNzIHRoYW4gNCBieXRlcywgdGhlIHJlbWFpbmluZyBieXRlcworICAgICAgICAvLyBzaG91bGQgYmUgcGFkZGVkIHdpdGggMXMsIGluIG9yZGVyIGZvciB0aGUgY29uc3RydWN0ZWQgaW50IHRvIGNvbnRhaW4gdGhlIGNvcnJlY3QgKG5lZ2F0aXZlKSBleHBvbmVudCB2YWx1ZS4KKyAgICAgICAgLy8gU28sIGlmIHRoZSBleHBvbmVudCBpcyBuZWdhdGl2ZSwgd2UgY2FuIGp1c3Qgc3RhcnQgd2l0aCBhbGwgYml0cyBzZXQgdG8gMSAoaS5lLiB3ZSBjYW4gc3RhcnQgd2l0aCAtMSkuCisgICAgICAgIGludCBleHBvbmVudCA9IGlzRXhwb25lbnROZWdhdGl2ZSA/IC0xIDogMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXJCaXRzOyArK2kpCisgICAgICAgICAgICBleHBvbmVudCA9IChleHBvbmVudCA8PCA4KSB8IGNvbXBhcmFibGVCeXRlcy5uZXh0KCk7CisgICAgICAgIC8vIFRoZSBlbmNvZGVkIGV4cG9uZW50IGFsc28gY29udGFpbnMgdGhlIGRlY2ltYWwgc2lnbiwgaW4gb3JkZXIgdG8gY29ycmVjdGx5IGNvbXBhcmUgZXhwb25lbnRzIGluIGNhc2Ugb2YKKyAgICAgICAgLy8gbmVnYXRpdmUgZGVjaW1hbHMgKGUuZy4geCAqIDEwXnkgPiB4ICogMTBeeiBpZiB4IDwgMCAmJiB5IDwgeikuIEFmdGVyIHRoZSBkZWNpbWFsIHNpZ24gaXMgInJlbW92ZWQiLCB3aGF0J3MKKyAgICAgICAgLy8gbGVmdCBpcyBhIGJhc2UtMTAwIGV4cG9uZW50IGZvbGxvd2luZyBCaWdEZWNpbWFsJ3MgY29udmVudGlvbiBmb3IgdGhlIGV4cG9uZW50IHNpZ24uCisgICAgICAgIGV4cG9uZW50ID0gaXNOZWdhdGl2ZSA/IC1leHBvbmVudCA6IGV4cG9uZW50OworCisgICAgICAgIC8vIElJLiBFeHRyYWN0IHRoZSBtYW50aXNzYSBhcyBhIEJpZ0ludGVnZXIgdmFsdWUuIEl0IHdhcyBlbmNvZGVkIGFzIGEgQmlnRGVjaW1hbCB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEsIGluCisgICAgICAgIC8vIG9yZGVyIHRvIGJlIHVzZWQgZm9yIGNvbXBhcmlzb24gKGFmdGVyIHRoZSBzaWduIG9mIHRoZSBkZWNpbWFsIGFuZCB0aGUgc2lnbiBhbmQgdGhlIHZhbHVlIG9mIHRoZSBleHBvbmVudCksCisgICAgICAgIC8vIGJ1dCB3aGVuIGRlY29kaW5nIHdlIGRvbid0IG5lZWQgdGhhdCBwcm9wZXJ0eSBvbiB0aGUgdHJhbnNpZW50IG1hbnRpc3NhIHZhbHVlLgorICAgICAgICBCaWdJbnRlZ2VyIG1hbnRpc3NhID0gQmlnSW50ZWdlci5aRVJPOworICAgICAgICBpbnQgY3VyciA9IGNvbXBhcmFibGVCeXRlcy5uZXh0KCk7CisgICAgICAgIHdoaWxlIChjdXJyICE9IERFQ0lNQUxfTEFTVF9CWVRFKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGUgbWFudGlzc2EgdmFsdWUgaXMgY29uc3RydWN0ZWQgYnkgYSBzdGFuZGFyZCBwb3NpdGlvbmFsIG5vdGF0aW9uIHZhbHVlIGNhbGN1bGF0aW9uLgorICAgICAgICAgICAgLy8gVGhlIHZhbHVlIG9mIHRoZSBuZXh0IGRpZ2l0IGlzIHRoZSBuZXh0IG1vc3Qtc2lnbmlmaWNhbnQgbWFudGlzc2EgYnl0ZSBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLAorICAgICAgICAgICAgLy8gb2Zmc2V0IGJ5IGEgcHJlZGV0ZXJtaW5lZCB2YWx1ZSAoaW4gdGhpcyBjYXNlLCAweDgwKS4uLgorICAgICAgICAgICAgaW50IGN1cnJNb2RpZmllZCA9IGN1cnIgLSAweDgwOworICAgICAgICAgICAgLy8gLi4ubXVsdGlwbHkgdGhlIGN1cnJlbnQgdmFsdWUgYnkgdGhlIGJhc2UgKGluIHRoaXMgY2FzZSwgMTAwKS4uLgorICAgICAgICAgICAgbWFudGlzc2EgPSBtYW50aXNzYS5tdWx0aXBseShIVU5EUkVEKTsKKyAgICAgICAgICAgIC8vIC4uLnRoZW4gYWRkIHRoZSBuZXh0IGRpZ2l0IHRvIHRoZSBtb2RpZmllZCBjdXJyZW50IHZhbHVlLi4uCisgICAgICAgICAgICBtYW50aXNzYSA9IG1hbnRpc3NhLmFkZChCaWdJbnRlZ2VyLnZhbHVlT2YoY3Vyck1vZGlmaWVkKSk7CisgICAgICAgICAgICAvLyAuLi5hbmQgZmluYWxseSwgYWRqdXN0IHRoZSBiYXNlLTEwMCwgQmlnRGVjaW1hbCBmb3JtYXQgZXhwb25lbnQgYWNjb3JkaW5nbHkuCisgICAgICAgICAgICAtLWV4cG9uZW50OworICAgICAgICAgICAgY3VyciA9IGNvbXBhcmFibGVCeXRlcy5uZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJSUkuIENvbnN0cnVjdCB0aGUgZmluYWwgQmlnRGVjaW1hbCB2YWx1ZSwgYnkgY29tYmluaW5nIHRoZSBtYW50aXNzYSBhbmQgdGhlIGV4cG9uZW50LCBndWFyZGluZyBhZ2FpbnN0CisgICAgICAgIC8vIHVuZGVyZmxvdyBvciBvdmVyZmxvdyB3aGVuIGV4cG9uZW50cyBhcmUgY2xvc2UgdG8gdGhlaXIgYm91bmRhcnkgdmFsdWVzLgorICAgICAgICBsb25nIGJhc2UxME5vbkJpZ0RlY2ltYWxGb3JtYXRFeHAgPSAyTCAqIGV4cG9uZW50OworICAgICAgICAvLyBXaGVuIGV4cHJlc3NpbmcgYSBzdWZmaWNpZW50bHkgYmlnIGRlY2ltYWwsIEJpZ0RlY2ltYWwncyBpbnRlcm5hbCBzY2FsZSB2YWx1ZSB3aWxsIGJlIG5lZ2F0aXZlIHdpdGggdmVyeQorICAgICAgICAvLyBiaWcgYWJzb2x1dGUgdmFsdWUuIFRvIGNvbXB1dGUgdGhlIGVuY29kZWQgZXhwb25lbnQsIHRoaXMgaW50ZXJuYWwgc2NhbGUgaGFzIHRoZSBudW1iZXIgb2YgZGlnaXRzIG9mIHRoZQorICAgICAgICAvLyB1bnNjYWxlZCB2YWx1ZSBzdWJ0cmFjdGVkIGZyb20gaXQsIGFmdGVyIHdoaWNoIGl0J3MgZGl2aWRlZCBieSAyLCByb3VuZGluZyBkb3duIHRvIG5lZ2F0aXZlIGluZmluaXR5CisgICAgICAgIC8vIChiZWZvcmUgYWNjb3VudGluZyBmb3IgdGhlIGRlY2ltYWwgc2lnbikuIFdoZW4gZGVjb2RpbmcsIHRoaXMgZXhwb25lbnQgaXMgY29udmVydGVkIHRvIGEgYmFzZS0xMCBleHBvbmVudCBpbgorICAgICAgICAvLyBub24tQmlnRGVjaW1hbCBmb3JtYXQsIHdoaWNoIG1lYW5zIHRoYXQgaXQgY2FuIHZlcnkgd2VsbCBvdmVyZmxvdyBJbnRlZ2VyLk1BWF9WQUxVRS4KKyAgICAgICAgLy8gRm9yIGV4YW1wbGUsIHNlZSBob3cgPGNvZGU+bmV3IEJpZ0RlY2ltYWwoQmlnSW50ZWdlci5URU4sIEludGVnZXIuTUlOX1ZBTFVFKTwvY29kZT4gaXMgZW5jb2RlZCBhbmQgZGVjb2RlZC4KKyAgICAgICAgaWYgKGJhc2UxME5vbkJpZ0RlY2ltYWxGb3JtYXRFeHAgPiBJbnRlZ2VyLk1BWF9WQUxVRSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSWYgdGhlIGJhc2UtMTAgZXhwb25lbnQgd2lsbCByZXN1bHQgaW4gYW4gb3ZlcmZsb3csIHNvbWUgb2YgaXRzIHBvd2VycyBvZiAxMCBuZWVkIHRvIGJlIGFic29yYmVkIGJ5IHRoZQorICAgICAgICAgICAgLy8gbWFudGlzc2EuIEhvdyBtdWNoIGV4YWN0bHk/IEFzIGxpdHRsZSBhcyBuZWVkZWQsIGluIG9yZGVyIHRvIGF2b2lkIGNvbXBsZXggQmlnSW50ZWdlciBvcGVyYXRpb25zLCB3aGljaAorICAgICAgICAgICAgLy8gbWVhbnMgZXhhY3RseSBhcyBtdWNoIGFzIHRvIGhhdmUgYSBzY2FsZSBvZiAtSW50ZWdlci5NQVhfVkFMVUUuCisgICAgICAgICAgICBpbnQgZXhwb25lbnRSZWR1Y3Rpb24gPSAoaW50KSAoYmFzZTEwTm9uQmlnRGVjaW1hbEZvcm1hdEV4cCAtIEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgIG1hbnRpc3NhID0gbWFudGlzc2EubXVsdGlwbHkoQmlnSW50ZWdlci5URU4ucG93KGV4cG9uZW50UmVkdWN0aW9uKSk7CisgICAgICAgICAgICBiYXNlMTBOb25CaWdEZWNpbWFsRm9ybWF0RXhwID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IGJhc2UxME5vbkJpZ0RlY2ltYWxGb3JtYXRFeHAgPj0gSW50ZWdlci5NSU5fVkFMVUUgJiYgYmFzZTEwTm9uQmlnRGVjaW1hbEZvcm1hdEV4cCA8PSBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgLy8gSGVyZSB3ZSBuZWdhdGUgdGhlIGV4cG9uZW50LCBhcyB3ZSBhcmUgbm90IHVzaW5nIEJpZ0RlY2ltYWwuc2NhbGVCeVBvd2VyT2ZUZW4sIHdoZXJlIGEgcG9zaXRpdmUgbnVtYmVyIG1lYW5zCisgICAgICAgIC8vICJtdWx0aXBseWluZyBieSBhIHBvc2l0aXZlIHBvd2VyIG9mIDEwIiwgYnV0IHRvIEJpZ0RlY2ltYWwncyBpbnRlcm5hbCBzY2FsZSByZXByZXNlbnRhdGlvbiwgd2hlcmUgYSBwb3NpdGl2ZQorICAgICAgICAvLyBudW1iZXIgbWVhbnMgImRpdmlkaW5nIGJ5IGEgcG9zaXRpdmUgcG93ZXIgb2YgMTAiLgorICAgICAgICBieXRlW10gbWFudGlzc2FCeXRlcyA9IG1hbnRpc3NhLnRvQnl0ZUFycmF5KCk7CisgICAgICAgIFYgcmVzdWx0QnVmID0gYWNjZXNzb3IuYWxsb2NhdGUoNCArIG1hbnRpc3NhQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgYWNjZXNzb3IucHV0SW50KHJlc3VsdEJ1ZiwgMCwgKGludCkgLWJhc2UxME5vbkJpZ0RlY2ltYWxGb3JtYXRFeHApOworICAgICAgICBhY2Nlc3Nvci5jb3B5Qnl0ZUFycmF5VG8obWFudGlzc2FCeXRlcywgMCwgcmVzdWx0QnVmLCA0LCBtYW50aXNzYUJ5dGVzLmxlbmd0aCk7CisgICAgICAgIHJldHVybiByZXN1bHRCdWY7CisgICAgfQorCiAgICAgcHVibGljIEJ5dGVCdWZmZXIgZnJvbVN0cmluZyhTdHJpbmcgc291cmNlKSB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgLy8gUmV0dXJuIGFuIGVtcHR5IEJ5dGVCdWZmZXIgZm9yIGFuIGVtcHR5IHN0cmluZy4KQEAgLTE4Niw0ICszOTQsNjcgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBkZWNvbXBvc2UodG9CaWdEZWNpbWFsKGlucHV0KS5uZWdhdGUoKSk7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgYWJzKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gZGVjb21wb3NlKHRvQmlnRGVjaW1hbChpbnB1dCkuYWJzKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4cChCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlY29tcG9zZShleHAodG9CaWdEZWNpbWFsKGlucHV0KSkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBCaWdEZWNpbWFsIGV4cChCaWdEZWNpbWFsIGlucHV0KQorICAgIHsKKyAgICAgICAgaW50IHByZWNpc2lvbiA9IGlucHV0LnByZWNpc2lvbigpOworICAgICAgICBwcmVjaXNpb24gPSBNYXRoLm1heChNSU5fU0lHTklGSUNBTlRfRElHSVRTLCBwcmVjaXNpb24pOworICAgICAgICBwcmVjaXNpb24gPSBNYXRoLm1pbihNQVhfUFJFQ0lTSU9OLmdldFByZWNpc2lvbigpLCBwcmVjaXNpb24pOworICAgICAgICByZXR1cm4gQmlnRGVjaW1hbE1hdGguZXhwKGlucHV0LCBuZXcgTWF0aENvbnRleHQocHJlY2lzaW9uLCBSb3VuZGluZ01vZGUuSEFMRl9FVkVOKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgbG9nKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gZGVjb21wb3NlKGxvZyh0b0JpZ0RlY2ltYWwoaW5wdXQpKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEJpZ0RlY2ltYWwgbG9nKEJpZ0RlY2ltYWwgaW5wdXQpCisgICAgeworICAgICAgICBpZiAoaW5wdXQuY29tcGFyZVRvKEJpZ0RlY2ltYWwuWkVSTykgPD0gMCkgdGhyb3cgbmV3IEFyaXRobWV0aWNFeGNlcHRpb24oIk5hdHVyYWwgbG9nIG9mIG51bWJlciB6ZXJvIG9yIGxlc3MiKTsKKyAgICAgICAgaW50IHByZWNpc2lvbiA9IGlucHV0LnByZWNpc2lvbigpOworICAgICAgICBwcmVjaXNpb24gPSBNYXRoLm1heChNSU5fU0lHTklGSUNBTlRfRElHSVRTLCBwcmVjaXNpb24pOworICAgICAgICBwcmVjaXNpb24gPSBNYXRoLm1pbihNQVhfUFJFQ0lTSU9OLmdldFByZWNpc2lvbigpLCBwcmVjaXNpb24pOworICAgICAgICByZXR1cm4gQmlnRGVjaW1hbE1hdGgubG9nKGlucHV0LCBuZXcgTWF0aENvbnRleHQocHJlY2lzaW9uLCBSb3VuZGluZ01vZGUuSEFMRl9FVkVOKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgbG9nMTAoQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWNvbXBvc2UobG9nMTAodG9CaWdEZWNpbWFsKGlucHV0KSkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBCaWdEZWNpbWFsIGxvZzEwKEJpZ0RlY2ltYWwgaW5wdXQpCisgICAgeworICAgICAgICBpZiAoaW5wdXQuY29tcGFyZVRvKEJpZ0RlY2ltYWwuWkVSTykgPD0gMCkgdGhyb3cgbmV3IEFyaXRobWV0aWNFeGNlcHRpb24oIkxvZzEwIG9mIG51bWJlciB6ZXJvIG9yIGxlc3MiKTsKKyAgICAgICAgaW50IHByZWNpc2lvbiA9IGlucHV0LnByZWNpc2lvbigpOworICAgICAgICBwcmVjaXNpb24gPSBNYXRoLm1heChNSU5fU0lHTklGSUNBTlRfRElHSVRTLCBwcmVjaXNpb24pOworICAgICAgICBwcmVjaXNpb24gPSBNYXRoLm1pbihNQVhfUFJFQ0lTSU9OLmdldFByZWNpc2lvbigpLCBwcmVjaXNpb24pOworICAgICAgICByZXR1cm4gQmlnRGVjaW1hbE1hdGgubG9nMTAoaW5wdXQsIG5ldyBNYXRoQ29udGV4dChwcmVjaXNpb24sIFJvdW5kaW5nTW9kZS5IQUxGX0VWRU4pKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciByb3VuZChCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIERlY2ltYWxUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgKKyAgICAgICAgdG9CaWdEZWNpbWFsKGlucHV0KS5zZXRTY2FsZSgwLCBSb3VuZGluZ01vZGUuSEFMRl9VUCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE1hc2tlZFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBNQVNLRURfVkFMVUU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9Eb3VibGVUeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0RvdWJsZVR5cGUuamF2YQppbmRleCA1NzBkNDIwLi45NDRiYWIwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0RvdWJsZVR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0RvdWJsZVR5cGUuamF2YQpAQCAtMjcsMTEgKzI3LDE2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZUludmVyc2U7CiAKIHB1YmxpYyBjbGFzcyBEb3VibGVUeXBlIGV4dGVuZHMgTnVtYmVyVHlwZTxEb3VibGU+CiB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBEb3VibGVUeXBlIGluc3RhbmNlID0gbmV3IERvdWJsZVR5cGUoKTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgTUFTS0VEX1ZBTFVFID0gaW5zdGFuY2UuZGVjb21wb3NlKDBkKTsKKwogICAgIERvdWJsZVR5cGUoKSB7c3VwZXIoQ29tcGFyaXNvblR5cGUuQ1VTVE9NKTt9IC8vIHNpbmdsZXRvbgogCiAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eVZhbHVlTWVhbmluZ2xlc3MoKQpAQCAtNTAsNiArNTUsMTggQEAKICAgICAgICAgcmV0dXJuIGNvbXBhcmVDb21wb3NlZChsZWZ0LCBhY2Nlc3NvckwsIHJpZ2h0LCBhY2Nlc3NvclIsIHRoaXMpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBWIGRhdGEsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlU291cmNlLm9wdGlvbmFsU2lnbmVkRml4ZWRMZW5ndGhGbG9hdChhY2Nlc3NvciwgZGF0YSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBWIGZyb21Db21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlU291cmNlSW52ZXJzZS5nZXRPcHRpb25hbFNpZ25lZEZpeGVkTGVuZ3RoRmxvYXQoYWNjZXNzb3IsIGNvbXBhcmFibGVCeXRlcywgOCk7CisgICAgfQorCiAgICAgcHVibGljIEJ5dGVCdWZmZXIgZnJvbVN0cmluZyhTdHJpbmcgc291cmNlKSB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbgogICAgIHsKICAgICAgIC8vIFJldHVybiBhbiBlbXB0eSBCeXRlQnVmZmVyIGZvciBhbiBlbXB0eSBzdHJpbmcuCkBAIC0xNjQsNCArMTgxLDQwIEBACiAgICAgewogICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoLXRvRG91YmxlKGlucHV0KSk7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgYWJzKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoTWF0aC5hYnModG9Eb3VibGUoaW5wdXQpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhwKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoTWF0aC5leHAodG9Eb3VibGUoaW5wdXQpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgbG9nKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoTWF0aC5sb2codG9Eb3VibGUoaW5wdXQpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgbG9nMTAoQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcyhNYXRoLmxvZzEwKHRvRG91YmxlKGlucHV0KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIHJvdW5kKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoKGRvdWJsZSkgTWF0aC5yb3VuZCh0b0RvdWJsZShpbnB1dCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRNYXNrZWRWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gTUFTS0VEX1ZBTFVFOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvRHVyYXRpb25UeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0R1cmF0aW9uVHlwZS5qYXZhCmluZGV4IDJhZmJmYzEuLjFmNGExOTkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvRHVyYXRpb25UeXBlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9EdXJhdGlvblR5cGUuamF2YQpAQCAtMzYsNiArMzYsOCBAQAogewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRHVyYXRpb25UeXBlIGluc3RhbmNlID0gbmV3IER1cmF0aW9uVHlwZSgpOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlciBNQVNLRURfVkFMVUUgPSBpbnN0YW5jZS5kZWNvbXBvc2UoRHVyYXRpb24ubmV3SW5zdGFuY2UoMCwgMCwgMCkpOworCiAgICAgRHVyYXRpb25UeXBlKCkKICAgICB7CiAgICAgICAgIHN1cGVyKENvbXBhcmlzb25UeXBlLkJZVEVfT1JERVIpOwpAQCAtODYsNCArODgsMTAgQEAKICAgICB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE1hc2tlZFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBNQVNLRURfVkFMVUU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9EeW5hbWljQ29tcG9zaXRlVHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9EeW5hbWljQ29tcG9zaXRlVHlwZS5qYXZhCmluZGV4IDVkZjM2MDAuLmU3YTIzNjAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvRHluYW1pY0NvbXBvc2l0ZVR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0R5bmFtaWNDb21wb3NpdGVUeXBlLmphdmEKQEAgLTE5LDkgKzE5LDE2IEBACiAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKQEAgLTM0LDYgKzQxLDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5UeXBlU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlLlZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlSW52ZXJzZTsKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlcy5hbnk7CiAKQEAgLTYwLDcgKzcwLDExIEBACiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKER5bmFtaWNDb21wb3NpdGVUeXBlLmNsYXNzKTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVTb3VyY2VbXSBFTVBUWV9CWVRFX1NPVVJDRV9BUlJBWSA9IG5ldyBCeXRlU291cmNlWzBdOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVZFUlNFRF9UWVBFID0gUmV2ZXJzZWRUeXBlLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKwogICAgIHByaXZhdGUgZmluYWwgTWFwPEJ5dGUsIEFic3RyYWN0VHlwZTw/Pj4gYWxpYXNlczsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxBYnN0cmFjdFR5cGU8Pz4sIEJ5dGU+IGludmVyc2VNYXBwaW5nOwogCiAgICAgLy8gaW50ZXJuaW5nIGluc3RhbmNlcwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwPE1hcDxCeXRlLCBBYnN0cmFjdFR5cGU8Pz4+LCBEeW5hbWljQ29tcG9zaXRlVHlwZT4gaW5zdGFuY2VzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKQEAgLTgxLDYgKzk1LDkgQEAKICAgICBwcml2YXRlIER5bmFtaWNDb21wb3NpdGVUeXBlKE1hcDxCeXRlLCBBYnN0cmFjdFR5cGU8Pz4+IGFsaWFzZXMpCiAgICAgewogICAgICAgICB0aGlzLmFsaWFzZXMgPSBhbGlhc2VzOworICAgICAgICB0aGlzLmludmVyc2VNYXBwaW5nID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxCeXRlLCBBYnN0cmFjdFR5cGU8Pz4+IGVuIDogYWxpYXNlcy5lbnRyeVNldCgpKQorICAgICAgICAgICAgdGhpcy5pbnZlcnNlTWFwcGluZy5wdXQoZW4uZ2V0VmFsdWUoKSwgZW4uZ2V0S2V5KCkpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCA8Vj4gYm9vbGVhbiByZWFkSXNTdGF0aWMoViB2YWx1ZSwgVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvcikKQEAgLTE5Nyw2ICsyMTQsMTk2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhLCBWZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICBMaXN0PEJ5dGVTb3VyY2U+IHNyY3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgaW50IGxlbmd0aCA9IGFjY2Vzc29yLnNpemUoZGF0YSk7CisKKyAgICAgICAgLy8gc3RhdGljcyBnbyBmaXJzdAorICAgICAgICBib29sZWFuIGlzU3RhdGljID0gcmVhZElzU3RhdGljKGRhdGEsIGFjY2Vzc29yKTsKKyAgICAgICAgaW50IG9mZnNldCA9IHN0YXJ0aW5nT2Zmc2V0KGlzU3RhdGljKTsKKyAgICAgICAgc3Jjcy5hZGQoaXNTdGF0aWMgPyBudWxsIDogQnl0ZVNvdXJjZS5FTVBUWSk7CisKKyAgICAgICAgYnl0ZSBsYXN0RW9jID0gMDsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBPbmx5IHRoZSBlbmQtb2YtY29tcG9uZW50IGJ5dGUgb2YgdGhlIGxhc3QgY29tcG9uZW50IG9mIHRoaXMgY29tcG9zaXRlIGNhbiBiZSBub24temVybywgc28gdGhlCisgICAgICAgICAgICAvLyBjb21wb25lbnQgYmVmb3JlIGNhbid0IGhhdmUgYSBub24temVybyBlbmQtb2YtY29tcG9uZW50IGJ5dGUuCisgICAgICAgICAgICBhc3NlcnQgbGFzdEVvYyA9PSAwIDogbGFzdEVvYzsKKworICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IGNvbXAgPSBnZXRDb21wYXJhdG9yKGRhdGEsIGFjY2Vzc29yLCBvZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IGdldENvbXBhcmF0b3JTaXplKGksIGRhdGEsIGFjY2Vzc29yLCBvZmZzZXQpOworICAgICAgICAgICAgLy8gVGhlIGNvbXBhcmFibGUgYnl0ZXMgZm9yIHRoZSBjb21wb25lbnQgbmVlZCB0byBlbnN1cmUgY29tcGFyaXNvbnMgY29uc2lzdGVudCB3aXRoCisgICAgICAgICAgICAvLyBBYnN0cmFjdENvbXBvc2l0ZVR5cGUuY29tcGFyZUN1c3RvbShCeXRlQnVmZmVyLCBCeXRlQnVmZmVyKSBhbmQKKyAgICAgICAgICAgIC8vIER5bmFtaWNDb21wb3NpdGVUeXBlLmdldENvbXBhcmF0b3IoaW50LCBCeXRlQnVmZmVyLCBCeXRlQnVmZmVyKToKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IFZlcnNpb24uTEVHQUNZIHx8ICEoY29tcCBpbnN0YW5jZW9mIFJldmVyc2VkVHlwZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gLi4ubW9zdCBvZnRlbiB0aGF0IG1lYW5zIGp1c3QgYWRkaW5nIHRoZSBzaG9ydCBuYW1lIG9mIHRoZSB0eXBlLCBmb2xsb3dlZCBieSB0aGUgZnVsbCBuYW1lIG9mIHRoZSB0eXBlLgorICAgICAgICAgICAgICAgIHNyY3MuYWRkKEJ5dGVTb3VyY2Uub2YoY29tcC5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwgdmVyc2lvbikpOworICAgICAgICAgICAgICAgIHNyY3MuYWRkKEJ5dGVTb3VyY2Uub2YoY29tcC5nZXRDbGFzcygpLmdldE5hbWUoKSwgdmVyc2lvbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIC4uLmhvd2V2ZXIgc29tZSB0aW1lcyB0aGUgY29tcG9uZW50IHVzZXMgYSBjb21wbGV4IHR5cGUgKGN1cnJlbnRseSB0aGUgb25seSBzdXBwb3J0ZWQgY29tcGxleCB0eXBlCisgICAgICAgICAgICAgICAgLy8gaXMgUmV2ZXJzZWRUeXBlIC0gd2UgY2FuJ3QgaGF2ZSBlbGVtZW50cyB0aGF0IGFyZSBvZiBNYXBUeXBlLCBDb21wb3NpdGVUeXBlLCBUdXBsZVR5cGUsIGV0Yy4pLi4uCisgICAgICAgICAgICAgICAgUmV2ZXJzZWRUeXBlPD8+IHJldmVyc2VkQ29tcCA9IChSZXZlcnNlZFR5cGU8Pz4pIGNvbXA7CisgICAgICAgICAgICAgICAgLy8gLi4uaW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIGFkZCB0aGUgc2hvcnQgbmFtZSBvZiBSZXZlcnNlZFR5cGUgYmVmb3JlIHRoZSBzaG9ydCBuYW1lIG9mIHRoZSBiYXNlCisgICAgICAgICAgICAgICAgLy8gdHlwZSwgdG8gZW5zdXJlIGNvbnNpc3RlbmN5IHdpdGggRHluYW1pY0NvbXBvc2l0ZVR5cGUuZ2V0Q29tcGFyYXRvcihpbnQsIEJ5dGVCdWZmZXIsIEJ5dGVCdWZmZXIpLgorICAgICAgICAgICAgICAgIHNyY3MuYWRkKEJ5dGVTb3VyY2Uub2YoUkVWRVJTRURfVFlQRSwgdmVyc2lvbikpOworICAgICAgICAgICAgICAgIHNyY3MuYWRkKEJ5dGVTb3VyY2Uub2YocmV2ZXJzZWRDb21wLmJhc2VUeXBlLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLCB2ZXJzaW9uKSk7CisgICAgICAgICAgICAgICAgc3Jjcy5hZGQoQnl0ZVNvdXJjZS5vZihyZXZlcnNlZENvbXAuYmFzZVR5cGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIHZlcnNpb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE9ubHkgdGhlbiB0aGUgcGF5bG9hZCBvZiB0aGUgY29tcG9uZW50IGdldHMgZW5jb2RlZC4KKyAgICAgICAgICAgIGludCBjb21wb25lbnRMZW5ndGggPSBhY2Nlc3Nvci5nZXRVbnNpZ25lZFNob3J0KGRhdGEsIG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIHNyY3MuYWRkKGNvbXAuYXNDb21wYXJhYmxlQnl0ZXMoYWNjZXNzb3IsIGFjY2Vzc29yLnNsaWNlKGRhdGEsIG9mZnNldCwgY29tcG9uZW50TGVuZ3RoKSwgdmVyc2lvbikpOworICAgICAgICAgICAgb2Zmc2V0ICs9IGNvbXBvbmVudExlbmd0aDsKKyAgICAgICAgICAgIC8vIFRoZSBlbmQtb2YtY29tcG9uZW50IGJ5dGUgYWxzbyB0YWtlcyBwYXJ0IGluIHRoZSBjb21wYXJpc29uLCBhbmQgdGhlcmVmb3JlIG5lZWRzIHRvIGJlIGVuY29kZWQuCisgICAgICAgICAgICBsYXN0RW9jID0gYWNjZXNzb3IuZ2V0Qnl0ZShkYXRhLCBvZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IDE7CisgICAgICAgICAgICBzcmNzLmFkZChCeXRlU291cmNlLm9uZUJ5dGUodmVyc2lvbiA9PSBWZXJzaW9uLkxFR0FDWSA/IGxhc3RFb2MgOiBsYXN0RW9jICYgMHhGRiBeIDB4ODApKTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBCeXRlU291cmNlLndpdGhUZXJtaW5hdG9yTWF5YmVMZWdhY3kodmVyc2lvbiwgQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNLCBzcmNzLnRvQXJyYXkoRU1QVFlfQllURV9TT1VSQ0VfQVJSQVkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IFYgZnJvbUNvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywgVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgLy8gRm9yIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24uTEVHQUNZIHRoZSB0ZXJtaW5hdG9yIGJ5dGUgaXMgQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNLiBKdXN0IGxpa2Ugd2l0aAorICAgICAgICAvLyBDb21wb3NpdGVUeXBlLCB0aGlzIG1lYW5zIHRoYXQgaW4gbXVsdGktY29tcG9uZW50IHNlcXVlbmNlcyB0aGUgdGVybWluYXRvciBtYXkgYmUgdHJhbnNmb3JtZWQgdG8gYSByZWd1bGFyCisgICAgICAgIC8vIGNvbXBvbmVudCBzZXBhcmF0b3IsIGJ1dCB1bmxpa2UgQ29tcG9zaXRlVHlwZSAod2hlcmUgd2UgaGF2ZSB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIHR5cGVzL2NvbXBvbmVudHMpLAorICAgICAgICAvLyB0aGlzIGNhbiBtYWtlIHRoZSBlbmQgb2YgdGhlIHdob2xlIGR5bmFtaWMgY29tcG9zaXRlIHR5cGUgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgZW5kIG9mIGEgY29tcG9uZW50CisgICAgICAgIC8vIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBkeW5hbWljIGNvbXBvc2l0ZSB0eXBlLiBCZWNhdXNlIG9mIHRoYXQsIER5bmFtaWNDb21wb3NpdGVUeXBlIGVsZW1lbnRzCisgICAgICAgIC8vIGNhbm5vdCBhbHdheXMgYmUgc2FmZWx5IGRlY29kZWQgdXNpbmcgdGhhdCBlbmNvZGluZyB2ZXJzaW9uLgorICAgICAgICAvLyBFdmVuIG1vcmUgc28gdGhhbiB3aXRoIENvbXBvc2l0ZVR5cGUsIHdlIGp1c3QgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGRlY29kZSBmcm9tCisgICAgICAgIC8vIFZlcnNpb24uTEVHQUNZLCBhc3N1bWUgdGhhdCB3ZSBuZXZlciBkbyB0aGF0LCBhbmQgYXNzZXJ0IGl0IGhlcmUuCisgICAgICAgIGFzc2VydCB2ZXJzaW9uICE9IFZlcnNpb24uTEVHQUNZOworCisgICAgICAgIGlmIChjb21wYXJhYmxlQnl0ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBhY2Nlc3Nvci5lbXB0eSgpOworCisgICAgICAgIC8vIFRoZSBmaXJzdCBieXRlIGlzIHRoZSBpc1N0YXRpYyBmbGFnIHdoaWNoIHdlIGRvbid0IG5lZWQgYnV0IG11c3QgY29uc3VtZSB0byBjb250aW51ZSBwYXN0IGl0LgorICAgICAgICBjb21wYXJhYmxlQnl0ZXMubmV4dCgpOworCisgICAgICAgIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFY+IHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBieXRlIGxhc3RFb2MgPSAwOworCisgICAgICAgIGZvciAoaW50IHNlcGFyYXRvciA9IGNvbXBhcmFibGVCeXRlcy5uZXh0KCk7IHNlcGFyYXRvciAhPSBCeXRlU291cmNlLlRFUk1JTkFUT1I7IHNlcGFyYXRvciA9IGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFNvbGVseSB0aGUgZW5kLW9mLWNvbXBvbmVudCBieXRlIG9mIHRoZSBsYXN0IGNvbXBvbmVudCBvZiB0aGlzIGNvbXBvc2l0ZSBjYW4gYmUgbm9uLXplcm8uCisgICAgICAgICAgICBhc3NlcnQgbGFzdEVvYyA9PSAwIDogbGFzdEVvYzsKKworICAgICAgICAgICAgYm9vbGVhbiBpc1JldmVyc2VkID0gZmFsc2U7CisgICAgICAgICAgICAvLyBEZWNvZGUgdGhlIG5leHQgdHlwZSdzIHNpbXBsZSBjbGFzcyBuYW1lIHRoYXQgaXMgZW5jb2RlZCBiZWZvcmUgaXRzIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIChpbiBvcmRlcgorICAgICAgICAgICAgLy8gZm9yIGNvbXBhcmlzb25zIHRvIHdvcmsgY29ycmVjdGx5KS4KKyAgICAgICAgICAgIFN0cmluZyBzaW1wbGVDbGFzc05hbWUgPSBCeXRlU291cmNlSW52ZXJzZS5nZXRTdHJpbmcoQnl0ZVNvdXJjZUludmVyc2UubmV4dENvbXBvbmVudFNvdXJjZShjb21wYXJhYmxlQnl0ZXMsIHNlcGFyYXRvcikpOworICAgICAgICAgICAgaWYgKFJFVkVSU0VEX1RZUEUuZXF1YWxzKHNpbXBsZUNsYXNzTmFtZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gU3BlY2lhbC1oYW5kbGUgaWYgdGhlIHR5cGUgaXMgcmV2ZXJzZWQgKGFuZCBkZWNvZGUgdGhlIGFjdHVhbCBiYXNlIHR5cGUgc2ltcGxlIGNsYXNzIG5hbWUpLgorICAgICAgICAgICAgICAgIGlzUmV2ZXJzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHNpbXBsZUNsYXNzTmFtZSA9IEJ5dGVTb3VyY2VJbnZlcnNlLmdldFN0cmluZyhCeXRlU291cmNlSW52ZXJzZS5uZXh0Q29tcG9uZW50U291cmNlKGNvbXBhcmFibGVCeXRlcykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEZWNvZGUgdGhlIHR5cGUncyBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBhbmQgcGFyc2UgdGhlIGFjdHVhbCB0eXBlIGZyb20gaXQuCisgICAgICAgICAgICBTdHJpbmcgZnVsbENsYXNzTmFtZSA9IEJ5dGVTb3VyY2VJbnZlcnNlLmdldFN0cmluZyhCeXRlU291cmNlSW52ZXJzZS5uZXh0Q29tcG9uZW50U291cmNlKGNvbXBhcmFibGVCeXRlcykpOworICAgICAgICAgICAgYXNzZXJ0IGZ1bGxDbGFzc05hbWUuZW5kc1dpdGgoc2ltcGxlQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgIGlmIChpc1JldmVyc2VkKQorICAgICAgICAgICAgICAgIGZ1bGxDbGFzc05hbWUgPSBSRVZFUlNFRF9UWVBFICsgJygnICsgZnVsbENsYXNzTmFtZSArICcpJzsKKyAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiB0eXBlID0gVHlwZVBhcnNlci5wYXJzZShmdWxsQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgIGFzc2VydCB0eXBlICE9IG51bGw7CisgICAgICAgICAgICB0eXBlcy5hZGQodHlwZSk7CisKKyAgICAgICAgICAgIC8vIERlY29kZSB0aGUgcGF5bG9hZCBmcm9tIHRoaXMgdHlwZS4KKyAgICAgICAgICAgIFYgdmFsdWUgPSB0eXBlLmZyb21Db21wYXJhYmxlQnl0ZXMoYWNjZXNzb3IsIEJ5dGVTb3VyY2VJbnZlcnNlLm5leHRDb21wb25lbnRTb3VyY2UoY29tcGFyYWJsZUJ5dGVzKSwgdmVyc2lvbik7CisgICAgICAgICAgICB2YWx1ZXMuYWRkKHZhbHVlKTsKKworICAgICAgICAgICAgLy8gQWxzbyBkZWNvZGUgdGhlIGNvcnJlc3BvbmRpbmcgZW5kLW9mLWNvbXBvbmVudCBieXRlIC0gdGhlIGxhc3Qgb25lIHdlIGRlY29kZSB3aWxsIGJlIHRha2VuIGludG8KKyAgICAgICAgICAgIC8vIGFjY291bnQgd2hlbiB3ZSBkZXNlcmlhbGl6ZSB0aGUgZGVjb2RlZCBkYXRhIGludG8gYW4gb2JqZWN0LgorICAgICAgICAgICAgbGFzdEVvYyA9IEJ5dGVTb3VyY2VJbnZlcnNlLmdldFNpZ25lZEJ5dGUoQnl0ZVNvdXJjZUludmVyc2UubmV4dENvbXBvbmVudFNvdXJjZShjb21wYXJhYmxlQnl0ZXMpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGQoYWNjZXNzb3IsIHR5cGVzLCBpbnZlcnNlTWFwcGluZywgdmFsdWVzLCBsYXN0RW9jKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXIgYnVpbGQoTGlzdDxTdHJpbmc+IHR5cGVzLCBMaXN0PEJ5dGVCdWZmZXI+IHZhbHVlcykKKyAgICB7CisgICAgICAgIHJldHVybiBidWlsZChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICBMaXN0cy50cmFuc2Zvcm0odHlwZXMsIFR5cGVQYXJzZXI6OnBhcnNlKSwKKyAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLmVtcHR5TWFwKCksCisgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMCk7CisgICAgfQorCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIHN0YXRpYyA8Vj4gViBidWlsZChWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPEFic3RyYWN0VHlwZTw/PiwgQnl0ZT4gaW52ZXJzZU1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFY+IHZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgbGFzdEVvYykKKyAgICB7CisgICAgICAgIGFzc2VydCB0eXBlcy5zaXplKCkgPT0gdmFsdWVzLnNpemUoKTsKKworICAgICAgICBpbnQgbnVtQ29tcG9uZW50cyA9IHR5cGVzLnNpemUoKTsKKyAgICAgICAgLy8gQ29tcHV0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2UnbGwgbmVlZCB0byBzdG9yZSB0aGUgdHlwZXMgYW5kIHRoZWlyIHBheWxvYWRzLgorICAgICAgICBpbnQgdG90YWxMZW5ndGggPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbXBvbmVudHM7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHR5cGUgPSB0eXBlcy5nZXQoaSk7CisgICAgICAgICAgICBCeXRlIGFsaWFzID0gaW52ZXJzZU1hcHBpbmcuZ2V0KHR5cGUpOworICAgICAgICAgICAgaW50IHR5cGVOYW1lTGVuZ3RoID0gYWxpYXMgPT0gbnVsbCA/IHR5cGUudG9TdHJpbmcoKS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KS5sZW5ndGggOiAwOworICAgICAgICAgICAgLy8gVGhlIHR5cGUgZGF0YSB3aWxsIGJlIHN0b3JlZCBieSBtZWFucyBvZiB0aGUgdHlwZSdzIGZ1bGx5IHF1YWxpZmllZCBuYW1lLCBub3QgYnkgYWxpYXNpbmcsIHNvOgorICAgICAgICAgICAgLy8gICAxLiBUaGUgdHlwZSBkYXRhIGhlYWRlciBzaG91bGQgYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGxlbmd0aCBpbiBieXRlcy4KKyAgICAgICAgICAgIC8vICAgMi4gVGhlIGxlbmd0aCBzaG91bGQgYmUgc21hbGwgZW5vdWdoIHNvIHRoYXQgaXQgZml0cyBpbiAxNSBiaXRzICgyIGJ5dGVzIHdpdGggdGhlIGZpcnN0IGJpdCB6ZXJvKS4KKyAgICAgICAgICAgIGFzc2VydCB0eXBlTmFtZUxlbmd0aCA8PSAweDdGRkY7CisgICAgICAgICAgICBpbnQgdmFsdWVMZW5ndGggPSBhY2Nlc3Nvci5zaXplKHZhbHVlcy5nZXQoaSkpOworICAgICAgICAgICAgLy8gVGhlIHZhbHVlIGxlbmd0aCBzaG91bGQgYWxzbyBleHBlY3QgaXRzIGZpcnN0IGJpdCB0byBiZSAwLCBhcyB0aGUgbGVuZ3RoIHNob3VsZCBiZSBzdG9yZWQgYXMgYSBzaWduZWQKKyAgICAgICAgICAgIC8vIDItYnl0ZSB2YWx1ZSAoc2hvcnQpLgorICAgICAgICAgICAgYXNzZXJ0IHZhbHVlTGVuZ3RoIDw9IDB4N0ZGRjsKKyAgICAgICAgICAgIHRvdGFsTGVuZ3RoICs9IDIgKyB0eXBlTmFtZUxlbmd0aCArIDIgKyB2YWx1ZUxlbmd0aCArIDE7CisgICAgICAgIH0KKworICAgICAgICBWIHJlc3VsdCA9IGFjY2Vzc29yLmFsbG9jYXRlKHRvdGFsTGVuZ3RoKTsKKyAgICAgICAgaW50IG9mZnNldCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29tcG9uZW50czsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdHlwZSA9IHR5cGVzLmdldChpKTsKKyAgICAgICAgICAgIEJ5dGUgYWxpYXMgPSBpbnZlcnNlTWFwcGluZy5nZXQodHlwZSk7CisgICAgICAgICAgICBpZiAoYWxpYXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBXcml0ZSB0aGUgdHlwZSBkYXRhICgyLWJ5dGUgbGVuZ3RoIGhlYWRlciArIHRoZSBmdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lIGluIFVURi04KS4KKyAgICAgICAgICAgICAgICBieXRlW10gdHlwZU5hbWVCeXRlcyA9IHR5cGUudG9TdHJpbmcoKS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICAgICAgICAgICAgICBhY2Nlc3Nvci5wdXRTaG9ydChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaG9ydCkgdHlwZU5hbWVCeXRlcy5sZW5ndGgpOyAvLyB0aGlzIHNob3VsZCB3b3JrIGZpbmUgYWxzbyBpZiBsZW5ndGggPj0gMzI3NjgKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgICAgICBhY2Nlc3Nvci5jb3B5Qnl0ZUFycmF5VG8odHlwZU5hbWVCeXRlcywgMCwgcmVzdWx0LCBvZmZzZXQsIHR5cGVOYW1lQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gdHlwZU5hbWVCeXRlcy5sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWNjZXNzb3IucHV0U2hvcnQocmVzdWx0LCBvZmZzZXQsIChzaG9ydCkgKGFsaWFzIHwgMHg4MDAwKSk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFdyaXRlIHRoZSB0eXBlIHBheWxvYWQgZGF0YSAoMi1ieXRlIGxlbmd0aCBoZWFkZXIgKyB0aGUgcGF5bG9hZCkuCisgICAgICAgICAgICBWIHZhbHVlID0gdmFsdWVzLmdldChpKTsKKyAgICAgICAgICAgIGludCBieXRlc1RvQ29weSA9IGFjY2Vzc29yLnNpemUodmFsdWUpOworICAgICAgICAgICAgYWNjZXNzb3IucHV0U2hvcnQocmVzdWx0LCBvZmZzZXQsIChzaG9ydCkgYnl0ZXNUb0NvcHkpOworICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CisgICAgICAgICAgICBhY2Nlc3Nvci5jb3B5VG8odmFsdWUsIDAsIHJlc3VsdCwgYWNjZXNzb3IsIG9mZnNldCwgYnl0ZXNUb0NvcHkpOworICAgICAgICAgICAgb2Zmc2V0ICs9IGJ5dGVzVG9Db3B5OworCisgICAgICAgICAgICAvLyBXcml0ZSB0aGUgZW5kLW9mLWNvbXBvbmVudCBieXRlLgorICAgICAgICAgICAgYWNjZXNzb3IucHV0Qnl0ZShyZXN1bHQsIG9mZnNldCwgaSAhPSBudW1Db21wb25lbnRzIC0gMSA/IChieXRlKSAwIDogbGFzdEVvYyk7CisgICAgICAgICAgICBvZmZzZXQgKz0gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKwogICAgIHByb3RlY3RlZCBQYXJzZWRDb21wYXJhdG9yIHBhcnNlQ29tcGFyYXRvcihpbnQgaSwgU3RyaW5nIHBhcnQpCiAgICAgewogICAgICAgICByZXR1cm4gbmV3IER5bmFtaWNQYXJzZWRDb21wYXJhdG9yKHBhcnQpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9FbXB0eVR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvRW1wdHlUeXBlLmphdmEKaW5kZXggMzU3YjZlOC4uMzNjNDUyNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9FbXB0eVR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0VtcHR5VHlwZS5qYXZhCkBAIC0zMyw4ICszMywxMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLlR5cGVTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Ob1NwYW1Mb2dnZXI7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TRVJJQUxJWkFUSU9OX0VNUFRZX1RZUEVfTk9ORU1QVFlfQkVIQVZJT1I7CisKIC8qKgogICogQSB0eXBlIHRoYXQgb25seSBhY2NlcHQgZW1wdHkgZGF0YS4KICAqIEl0IGlzIG9ubHkgdXNlZnVsIGFzIGEgdmFsdWUgdmFsaWRhdGlvbiB0eXBlLCBub3QgYXMgYSBjb21wYXJhdG9yIHNpbmNlIGNvbHVtbiBuYW1lcyBjYW4ndCBiZSBlbXB0eS4KQEAgLTQ0LDEzICs0OCwxMiBAQAogICAgIHByaXZhdGUgZW51bSBOb25FbXB0eVdyaXRlQmVoYXZpb3IgeyBGQUlMLCBMT0dfREFUQV9MT1NTLCBTSUxFTlRfREFUQV9MT1NTIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihFbXB0eVR5cGUuY2xhc3MpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRU1QVFlUWVBFX05PTkVNUFRZX0JFSEFWSU9SID0gImNhc3NhbmRyYS5zZXJpYWxpemF0aW9uLmVtcHR5dHlwZS5ub25lbXB0eV9iZWhhdmlvciI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTm9TcGFtTG9nZ2VyIE5PTl9FTVBUWV9XUklURV9MT0dHRVIgPSBOb1NwYW1Mb2dnZXIuZ2V0TG9nZ2VyKGxvZ2dlciwgMSwgVGltZVVuaXQuTUlOVVRFUyk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTm9uRW1wdHlXcml0ZUJlaGF2aW9yIE5PTl9FTVBUWV9XUklURV9CRUhBVklPUiA9IHBhcnNlTm9uRW1wdHlXcml0ZUJlaGF2aW9yKCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBOb25FbXB0eVdyaXRlQmVoYXZpb3IgcGFyc2VOb25FbXB0eVdyaXRlQmVoYXZpb3IoKQogICAgIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gU3lzdGVtLmdldFByb3BlcnR5KEtFWV9FTVBUWVRZUEVfTk9ORU1QVFlfQkVIQVZJT1IpOworICAgICAgICBTdHJpbmcgdmFsdWUgPSBTRVJJQUxJWkFUSU9OX0VNUFRZX1RZUEVfTk9ORU1QVFlfQkVIQVZJT1IuZ2V0U3RyaW5nKCk7CiAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIE5vbkVtcHR5V3JpdGVCZWhhdmlvci5GQUlMOwogICAgICAgICB0cnkKQEAgLTU5LDcgKzYyLDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci53YXJuKCJVbmFibGUgdG8gcGFyc2UgcHJvcGVydHkgIiArIEtFWV9FTVBUWVRZUEVfTk9ORU1QVFlfQkVIQVZJT1IgKyAiLCBmYWxsaW5nIGJhY2sgdG8gRkFJTCIsIGUpOworICAgICAgICAgICAgbG9nZ2VyLndhcm4oIlVuYWJsZSB0byBwYXJzZSBwcm9wZXJ0eSAiICsgU0VSSUFMSVpBVElPTl9FTVBUWV9UWVBFX05PTkVNUFRZX0JFSEFWSU9SLmdldEtleSgpICsgIiwgZmFsbGluZyBiYWNrIHRvIEZBSUwiLCBlKTsKICAgICAgICAgICAgIHJldHVybiBOb25FbXB0eVdyaXRlQmVoYXZpb3IuRkFJTDsKICAgICAgICAgfQogICAgIH0KQEAgLTY4LDYgKzcxLDE4IEBACiAKICAgICBwcml2YXRlIEVtcHR5VHlwZSgpIHtzdXBlcihDb21wYXJpc29uVHlwZS5DVVNUT00pO30gLy8gc2luZ2xldG9uCiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IFYgZnJvbUNvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFjY2Vzc29yLmVtcHR5KCk7CisgICAgfQorCiAgICAgcHVibGljIDxWTCwgVlI+IGludCBjb21wYXJlQ3VzdG9tKFZMIGxlZnQsIFZhbHVlQWNjZXNzb3I8Vkw+IGFjY2Vzc29yTCwgVlIgcmlnaHQsIFZhbHVlQWNjZXNzb3I8VlI+IGFjY2Vzc29yUikKICAgICB7CiAgICAgICAgIHJldHVybiAwOwpAQCAtMTY4LDQgKzE4MywxMCBAQAogICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRNYXNrZWRWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuRU1QVFlfQllURV9CVUZGRVI7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9GbG9hdFR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvRmxvYXRUeXBlLmphdmEKaW5kZXggMzVhYmVlMC4uNzQ0MTFkYyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9GbG9hdFR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0Zsb2F0VHlwZS5qYXZhCkBAIC0yNywxMiArMjcsMTcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5NYXJzaGFsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlSW52ZXJzZTsKIAogCiBwdWJsaWMgY2xhc3MgRmxvYXRUeXBlIGV4dGVuZHMgTnVtYmVyVHlwZTxGbG9hdD4KIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEZsb2F0VHlwZSBpbnN0YW5jZSA9IG5ldyBGbG9hdFR5cGUoKTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgTUFTS0VEX1ZBTFVFID0gaW5zdGFuY2UuZGVjb21wb3NlKDBmKTsKKwogICAgIEZsb2F0VHlwZSgpIHtzdXBlcihDb21wYXJpc29uVHlwZS5DVVNUT00pO30gLy8gc2luZ2xldG9uCiAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5VmFsdWVNZWFuaW5nbGVzcygpCkBAIC01MSw2ICs1NiwxOCBAQAogICAgICAgICByZXR1cm4gY29tcGFyZUNvbXBvc2VkKGxlZnQsIGFjY2Vzc29yTCwgcmlnaHQsIGFjY2Vzc29yUiwgdGhpcyk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2Uub3B0aW9uYWxTaWduZWRGaXhlZExlbmd0aEZsb2F0KGFjY2Vzc29yLCBkYXRhKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IFYgZnJvbUNvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2VJbnZlcnNlLmdldE9wdGlvbmFsU2lnbmVkRml4ZWRMZW5ndGhGbG9hdChhY2Nlc3NvciwgY29tcGFyYWJsZUJ5dGVzLCA0KTsKKyAgICB9CisKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBmcm9tU3RyaW5nKFN0cmluZyBzb3VyY2UpIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uCiAgICAgewogICAgICAgLy8gUmV0dXJuIGFuIGVtcHR5IEJ5dGVCdWZmZXIgZm9yIGFuIGVtcHR5IHN0cmluZy4KQEAgLTE1OSw0ICsxNzYsNDAgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcygtdG9GbG9hdChpbnB1dCkpOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGFicyhCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKE1hdGguYWJzKHRvRmxvYXQoaW5wdXQpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhwKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoKGZsb2F0KSBNYXRoLmV4cCh0b0Zsb2F0KGlucHV0KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGxvZyhCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKChmbG9hdCkgTWF0aC5sb2codG9GbG9hdChpbnB1dCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBsb2cxMChCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKChmbG9hdCkgTWF0aC5sb2cxMCh0b0Zsb2F0KGlucHV0KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIHJvdW5kKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoKGZsb2F0KSBNYXRoLnJvdW5kKHRvRmxvYXQoaW5wdXQpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0TWFza2VkVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1BU0tFRF9WQUxVRTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0luZXRBZGRyZXNzVHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9JbmV0QWRkcmVzc1R5cGUuamF2YQppbmRleCA2ODM4YzgzLi43ZTBlNThjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0luZXRBZGRyZXNzVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvSW5ldEFkZHJlc3NUeXBlLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbDsKIAogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTDNUeXBlOwpAQCAtMzMsNiArMzQsOCBAQAogewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSW5ldEFkZHJlc3NUeXBlIGluc3RhbmNlID0gbmV3IEluZXRBZGRyZXNzVHlwZSgpOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlciBNQVNLRURfVkFMVUUgPSBpbnN0YW5jZS5kZWNvbXBvc2UobmV3IEluZXRTb2NrZXRBZGRyZXNzKDApLmdldEFkZHJlc3MoKSk7CisKICAgICBJbmV0QWRkcmVzc1R5cGUoKSB7c3VwZXIoQ29tcGFyaXNvblR5cGUuQllURV9PUkRFUik7fSAvLyBzaW5nbGV0b24KIAogICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHlWYWx1ZU1lYW5pbmdsZXNzKCkKQEAgLTk0LDQgKzk3LDEwIEBACiAgICAgewogICAgICAgICByZXR1cm4gSW5ldEFkZHJlc3NTZXJpYWxpemVyLmluc3RhbmNlOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE1hc2tlZFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBNQVNLRURfVkFMVUU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9JbnQzMlR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvSW50MzJUeXBlLmphdmEKaW5kZXggOThmNGM4My4uMmQ3MGFjNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9JbnQzMlR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0ludDMyVHlwZS5qYXZhCkBAIC0yOCwxMSArMjgsMTYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLlR5cGVTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZUludmVyc2U7CiAKIHB1YmxpYyBjbGFzcyBJbnQzMlR5cGUgZXh0ZW5kcyBOdW1iZXJUeXBlPEludGVnZXI+CiB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbnQzMlR5cGUgaW5zdGFuY2UgPSBuZXcgSW50MzJUeXBlKCk7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIE1BU0tFRF9WQUxVRSA9IGluc3RhbmNlLmRlY29tcG9zZSgwKTsKKwogICAgIEludDMyVHlwZSgpCiAgICAgewogICAgICAgICBzdXBlcihDb21wYXJpc29uVHlwZS5DVVNUT00pOwpAQCAtNTUsNiArNjAsMTggQEAKICAgICAgICAgcmV0dXJuIFZhbHVlQWNjZXNzb3IuY29tcGFyZShsZWZ0LCBhY2Nlc3NvckwsIHJpZ2h0LCBhY2Nlc3NvclIpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBWIGRhdGEsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlU291cmNlLm9wdGlvbmFsU2lnbmVkRml4ZWRMZW5ndGhOdW1iZXIoYWNjZXNzb3IsIGRhdGEpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gViBmcm9tQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZUludmVyc2UuZ2V0T3B0aW9uYWxTaWduZWRGaXhlZExlbmd0aChhY2Nlc3NvciwgY29tcGFyYWJsZUJ5dGVzLCA0KTsKKyAgICB9CisKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBmcm9tU3RyaW5nKFN0cmluZyBzb3VyY2UpIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uCiAgICAgewogICAgICAgICAvLyBSZXR1cm4gYW4gZW1wdHkgQnl0ZUJ1ZmZlciBmb3IgYW4gZW1wdHkgc3RyaW5nLgpAQCAtMTU5LDQgKzE3Niw0MCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKC10b0ludChpbnB1dCkpOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGFicyhCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKE1hdGguYWJzKHRvSW50KGlucHV0KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4cChCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKChpbnQpIE1hdGguZXhwKHRvSW50KGlucHV0KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGxvZyhCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKChpbnQpIE1hdGgubG9nKHRvSW50KGlucHV0KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGxvZzEwKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoKGludCkgTWF0aC5sb2cxMCh0b0ludChpbnB1dCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciByb3VuZChCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmNsb25lKGlucHV0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRNYXNrZWRWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gTUFTS0VEX1ZBTFVFOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvSW50ZWdlclR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvSW50ZWdlclR5cGUuamF2YQppbmRleCA0YzkxM2Q1Li4yOTE4OTUzIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0ludGVnZXJUeXBlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9JbnRlZ2VyVHlwZS5qYXZhCkBAIC0zMCwxMSArMzAsMjUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5NYXJzaGFsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlSW52ZXJzZTsKIAogcHVibGljIGZpbmFsIGNsYXNzIEludGVnZXJUeXBlIGV4dGVuZHMgTnVtYmVyVHlwZTxCaWdJbnRlZ2VyPgogewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlclR5cGUgaW5zdGFuY2UgPSBuZXcgSW50ZWdlclR5cGUoKTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgTUFTS0VEX1ZBTFVFID0gaW5zdGFuY2UuZGVjb21wb3NlKEJpZ0ludGVnZXIuWkVSTyk7CisKKyAgICAvLyBDb25zdGFudHMgb3IgZXNjYXBpbmcgdmFsdWVzIG5lZWRlZCB0byBlbmNvZGUvZGVjb2RlIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VycyBpbiBvdXIgY3VzdG9tIGJ5dGUtb3JkZXJlZAorICAgIC8vIGVuY29kaW5nIHNjaGVtZS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9TSVRJVkVfVkFSSU5UX0hFQURFUiA9IDB4ODA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5FR0FUSVZFX1ZBUklOVF9MRU5HVEhfSEVBREVSID0gMHgwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9TSVRJVkVfVkFSSU5UX0xFTkdUSF9IRUFERVIgPSAweEZGOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgQklHX0lOVEVHRVJfTkVHQVRJVkVfTEVBRElOR19aRVJPID0gKGJ5dGUpIDB4RkY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBCSUdfSU5URUdFUl9QT1NJVElWRV9MRUFESU5HX1pFUk8gPSAoYnl0ZSkgMHgwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGVUxMX0ZPUk1fVEhSRVNIT0xEID0gNzsKKwogICAgIHByaXZhdGUgc3RhdGljIDxWPiBpbnQgZmluZE1vc3RTaWduaWZpY2FudEJ5dGUoViB2YWx1ZSwgVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvcikKICAgICB7CiAgICAgICAgIGludCBsZW4gPSBhY2Nlc3Nvci5zaXplKHZhbHVlKSAtIDE7CkBAIC0xMzEsNiArMTQ1LDMwMSBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgYnl0ZS1jb21wYXJhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBudW1iZXIuCisgICAgICoKKyAgICAgKiBJbiB0aGUgY3VycmVudCBmb3JtYXQgd2UgcmVwcmVzZW50IGl0OgorICAgICAqICAgIGRpcmVjdGx5IGFzIHZhcmludCwgaWYgdGhlIGxlbmd0aCBpcyA2IG9yIHNtYWxsZXIgKHRoZSBlbmNvZGluZyBoYXMgbm9uLTAwL0ZGIGZpcnN0IGJ5dGUpCisgICAgICogICAgPHNpZ25ieXRlPjxsZW5ndGggYXMgdW5zaWduZWQgaW50ZWdlciAtIDc+PDcgb3IgbW9yZSBieXRlcz4sIG90aGVyd2lzZQorICAgICAqIHdoZXJlIDxzaWduYnl0ZT4gaXMgMDAgZm9yIG5lZ2F0aXZlIG51bWJlcnMgYW5kIEZGIGZvciBwb3NpdGl2ZSBvbmVzLCBhbmQgdGhlIGxlbmd0aCdzIGJ5dGVzIGFyZSBpbnZlcnRlZCBpZgorICAgICAqIHRoZSBudW1iZXIgaXMgbmVnYXRpdmUgKHNvIHRoYXQgbG9uZ2VyIGxlbmd0aCBzb3J0cyBzbWFsbGVyKS4KKyAgICAgKgorICAgICAqIEJlY2F1c2Ugd2UgcHJlc2VudCB0aGUgc2lnbiBzZXBhcmF0ZWx5LCB3ZSBkb24ndCBuZWVkIHRvIGluY2x1ZGUgMHgwMCBwcmVmaXggZm9yIHBvc2l0aXZlIGludGVnZXJzIHdob3NlIGZpcnN0CisgICAgICogYnl0ZSBpcyA+PSAweDgwIG9yIDB4RkYgcHJlZml4IGZvciBuZWdhdGl2ZSBpbnRlZ2VycyB3aG9zZSBmaXJzdCBieXRlIGlzIDwgMHg4MC4gTm90ZSB0aGF0IHdlIGRvIHRoaXMgYmVmb3JlCisgICAgICogdGFraW5nIHRoZSBsZW5ndGggZm9yIHRoZSBwdXJwb3NlcyBvZiBjaG9vc2luZyBiZXR3ZWVuIHZhcmludCBhbmQgZnVsbC1mb3JtIGVuY29kaW5nLgorICAgICAqCisgICAgICogVGhlIHJlcHJlc2VudGF0aW9ucyBhcmUgcHJlZml4LWZyZWUsIGJlY2F1c2UgdGhlIGNob2ljZSBiZXR3ZWVuIHZhcmludCBhbmQgZnVsbC1mb3JtIGVuY29kaW5nIGlzIGRldGVybWluZWQgYnkKKyAgICAgKiB0aGUgZmlyc3QgYnl0ZSB3aGVyZSB2YXJpbnRzIGFyZSBwcm9wZXJseSBvcmRlcmVkIGJldHdlZW4gZnVsbC1mb3JtIG5lZ2F0aXZlIGFuZCBmdWxsLWZvcm0gcG9zaXRpdmUsIHZhcmludAorICAgICAqIGVuY29kaW5nIGlzIHByZWZpeC1mcmVlLCBhbmQgZnVsbC1mb3JtIHJlcHJlc2VudGF0aW9ucyBvZiBkaWZmZXJlbnQgbGVuZ3RoIGFsd2F5cyBoYXZlIGxlbmd0aCBieXRlcyB0aGF0IGRpZmZlci4KKyAgICAgKgorICAgICAqIEV4YW1wbGVzOgorICAgICAqICAgIC0xICAgICAgICAgICAgYXMgN0YKKyAgICAgKiAgICAwICAgICAgICAgICAgIGFzIDgwCisgICAgICogICAgMSAgICAgICAgICAgICBhcyA4MQorICAgICAqICAgIDEyNyAgICAgICAgICAgYXMgQzA3RgorICAgICAqICAgIDI1NSAgICAgICAgICAgYXMgQzBGRgorICAgICAqICAgIDJeMzItMSAgICAgICAgYXMgRjhGRkZGRkZGRgorICAgICAqICAgIDJeMzIgICAgICAgICAgYXMgRjkwMDAwMDAwMAorICAgICAqICAgIDJeNTYtMSAgICAgICAgYXMgRkVGRkZGRkZGRkZGRkZGRgorICAgICAqICAgIDJeNTYgICAgICAgICAgYXMgRkYwMDAxMDAwMDAwMDAwMDAwMDAKKyAgICAgKgorICAgICAqIFNlZSB7QGxpbmsgI2FzQ29tcGFyYWJsZUJ5dGVzTGVnYWN5fSBmb3IgZGVzY3JpcHRpb24gb2YgdGhlIGxlZ2FjeSBmb3JtYXQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgZmluYWwgaW50IGxpbWl0ID0gYWNjZXNzb3Iuc2l6ZShkYXRhKTsKKyAgICAgICAgaWYgKGxpbWl0ID09IDApCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAvLyBza2lwIGFueSBsZWFkaW5nIHNpZ24tb25seSBieXRlKHMpCisgICAgICAgIGludCBwID0gMDsKKyAgICAgICAgZmluYWwgYnl0ZSBzaWduYnl0ZSA9IGFjY2Vzc29yLmdldEJ5dGUoZGF0YSwgcCk7CisgICAgICAgIGlmIChzaWduYnl0ZSA9PSBCSUdfSU5URUdFUl9ORUdBVElWRV9MRUFESU5HX1pFUk8gfHwgc2lnbmJ5dGUgPT0gQklHX0lOVEVHRVJfUE9TSVRJVkVfTEVBRElOR19aRVJPKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAocCArIDEgPCBsaW1pdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWNjZXNzb3IuZ2V0Qnl0ZShkYXRhLCArK3ApICE9IHNpZ25ieXRlKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh2ZXJzaW9uICE9IEJ5dGVDb21wYXJhYmxlLlZlcnNpb24uTEVHQUNZKQorICAgICAgICAgICAgcmV0dXJuIChsaW1pdCAtIHAgPCBGVUxMX0ZPUk1fVEhSRVNIT0xEKQorICAgICAgICAgICAgICAgICAgID8gZW5jb2RlQXNWYXJJbnQoYWNjZXNzb3IsIGRhdGEsIGxpbWl0KQorICAgICAgICAgICAgICAgICAgIDogYXNDb21wYXJhYmxlQnl0ZXNDdXJyZW50KGFjY2Vzc29yLCBkYXRhLCBwLCBsaW1pdCwgKHNpZ25ieXRlID4+IDcpICYgMHhGRik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBhc0NvbXBhcmFibGVCeXRlc0xlZ2FjeShhY2Nlc3NvciwgZGF0YSwgcCwgbGltaXQsIHNpZ25ieXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGUgdGhlIEJpZ0ludGVnZXIgc3RvcmVkIGluIHRoZSBnaXZlbiBidWZmZXIgYXMgYSB2YXJpYWJsZS1sZW5ndGggc2lnbmVkIGludGVnZXIuCisgICAgICogVGhlIGxlbmd0aCBvZiB0aGUgbnVtYmVyIGlzIGdpdmVuIGluIHRoZSBsaW1pdCBhcmd1bWVudCwgYW5kIG11c3QgYmUgPD0gOC4KKyAgICAgKi8KKyAgICBwcml2YXRlIDxWPiBCeXRlU291cmNlIGVuY29kZUFzVmFySW50KFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSwgaW50IGxpbWl0KQorICAgIHsKKyAgICAgICAgbG9uZyB2OworICAgICAgICBzd2l0Y2ggKGxpbWl0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgdiA9IGFjY2Vzc29yLmdldEJ5dGUoZGF0YSwgMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgdiA9IGFjY2Vzc29yLmdldFNob3J0KGRhdGEsIDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHYgPSAoYWNjZXNzb3IuZ2V0U2hvcnQoZGF0YSwgMCkgPDwgOCkgfCAoYWNjZXNzb3IuZ2V0Qnl0ZShkYXRhLCAyKSAmIDB4RkYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIHYgPSBhY2Nlc3Nvci5nZXRJbnQoZGF0YSwgMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgdiA9ICgobG9uZykgYWNjZXNzb3IuZ2V0SW50KGRhdGEsIDApIDw8IDgpIHwgKGFjY2Vzc29yLmdldEJ5dGUoZGF0YSwgNCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICB2ID0gKChsb25nKSBhY2Nlc3Nvci5nZXRJbnQoZGF0YSwgMCkgPDwgMTYpIHwgKGFjY2Vzc29yLmdldFNob3J0KGRhdGEsIDQpICYgMHhGRkZGKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICB2ID0gKChsb25nKSBhY2Nlc3Nvci5nZXRJbnQoZGF0YSwgMCkgPDwgMjQpIHwgKChhY2Nlc3Nvci5nZXRTaG9ydChkYXRhLCA0KSAmIDB4RkZGRikgPDwgOCkgfCAoYWNjZXNzb3IuZ2V0Qnl0ZShkYXRhLCA2KSAmIDB4RkYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgbm90IHJlYWNoYWJsZSB3aXRoaW4gdGhlIGVuY29kaW5nOyBhZGRlZCBmb3IgY29tcGxldGVuZXNzLgorICAgICAgICAgICAgICAgIHYgPSBhY2Nlc3Nvci5nZXRMb25nKGRhdGEsIDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZS52YXJpYWJsZUxlbmd0aEludGVnZXIodik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGZ1bGwtZm9ybSBieXRlLWNvbXBhcmFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIG51bWJlciBpbiB0aGUgY3VycmVudCBmb3JtYXQuCisgICAgICoKKyAgICAgKiBUaGlzIGNvbnRhaW5zOgorICAgICAqICAgIDxzaWduYnl0ZT48bGVuZ3RoIGFzIHVuc2lnbmVkIGludGVnZXIgLSA3Pjw3IG9yIG1vcmUgYnl0ZXM+LCBvdGhlcndpc2UKKyAgICAgKiB3aGVyZSA8c2lnbmJ5dGU+IGlzIDAwIGZvciBuZWdhdGl2ZSBudW1iZXJzIGFuZCBGRiBmb3IgcG9zaXRpdmUgb25lcywgYW5kIHRoZSBsZW5ndGgncyBieXRlcyBhcmUgaW52ZXJ0ZWQgaWYKKyAgICAgKiB0aGUgbnVtYmVyIGlzIG5lZ2F0aXZlIChzbyB0aGF0IGxvbmdlciBsZW5ndGggc29ydHMgc21hbGxlcikuCisgICAgICoKKyAgICAgKiBCZWNhdXNlIHdlIHByZXNlbnQgdGhlIHNpZ24gc2VwYXJhdGVseSwgd2UgZG9uJ3QgbmVlZCB0byBpbmNsdWRlIDB4MDAgcHJlZml4IGZvciBwb3NpdGl2ZSBpbnRlZ2VycyB3aG9zZSBmaXJzdAorICAgICAqIGJ5dGUgaXMgPj0gMHg4MCBvciAweEZGIHByZWZpeCBmb3IgbmVnYXRpdmUgaW50ZWdlcnMgd2hvc2UgZmlyc3QgYnl0ZSBpcyA8IDB4ODAuCisgICAgICoKKyAgICAgKiBUaGUgcmVwcmVzZW50YXRpb25zIGFyZSBwcmVmaXgtZnJlZSwgYmVjYXVzZSByZXByZXNlbnRhdGlvbnMgb2YgZGlmZmVyZW50IGxlbmd0aCBhbHdheXMgaGF2ZSBsZW5ndGggYnl0ZXMgdGhhdAorICAgICAqIGRpZmZlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzQ3VycmVudChWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBWIGRhdGEsIGludCBzdGFydHBvcywgaW50IGxpbWl0LCBpbnQgc2lnbmJ5dGUpCisgICAgeworICAgICAgICAvLyBzdGFydCB3aXRoIHNpZ24gYXMgYSBieXRlLCB0aGVuIHZhcmlhYmxlLWxlbmd0aC1lbmNvZGVkIGxlbmd0aCwgdGhlbiBieXRlcyAoc3RyaXBwZWQgbGVhZGluZyBzaWduKQorICAgICAgICByZXR1cm4gbmV3IEJ5dGVTb3VyY2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcG9zID0gLTI7CisgICAgICAgICAgICBCeXRlU291cmNlIGxlbmd0aEVuY29kaW5nID0gbmV3IFZhcmlhYmxlTGVuZ3RoVW5zaWduZWRJbnRlZ2VyKGxpbWl0IC0gc3RhcnRwb3MgLSBGVUxMX0ZPUk1fVEhSRVNIT0xEKTsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IG5leHQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwb3MgPT0gLTIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICArK3BvczsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpZ25ieXRlIF4gMHhGRjsgLy8gMDAgZm9yIG5lZ2F0aXZlL0ZGIGZvciBwb3NpdGl2ZSAoMDEtRkUgZm9yIGRpcmVjdCB2YXJpbnQgZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBvcyA9PSAtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBuZXh0Qnl0ZSA9IGxlbmd0aEVuY29kaW5nLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRCeXRlICE9IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dEJ5dGUgXiBzaWduYnl0ZTsKKyAgICAgICAgICAgICAgICAgICAgcG9zID0gc3RhcnRwb3M7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBvcyA9PSBsaW1pdCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVORF9PRl9TVFJFQU07CisKKyAgICAgICAgICAgICAgICByZXR1cm4gYWNjZXNzb3IuZ2V0Qnl0ZShkYXRhLCBwb3MrKykgJiAweEZGOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBieXRlLWNvbXBhcmFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIG51bWJlciBpbiB0aGUgbGVnYWN5IGZvcm1hdC4KKyAgICAgKiBXZSByZXByZXNlbnQgaXQgYXMKKyAgICAgKiAgICA8emVybyBvciBtb3JlIGxlbmd0aF9ieXRlcyB3aGVyZSBsZW5ndGggPSAxMjg+IDxsZW5ndGhfYnl0ZT4gPGZpcnN0X3NpZ25pZmljYW50X2J5dGU+IDx6ZXJvIG9yIG1vcmUgYnl0ZXM+CisgICAgICogd2hlcmUgYSBsZW5ndGhfYnl0ZSBpczoKKyAgICAgKiAgICAtIDB4ODAgKyAobGVuZ3RoIC0gMSkgZm9yIHBvc2l0aXZlIG51bWJlcnMgKHNvIHRoYXQgbG9uZ2VyIGxlbmd0aCBzb3J0cyBiaWdnZXIpCisgICAgICogICAgLSAweDdGIC0gKGxlbmd0aCAtIDEpIGZvciBuZWdhdGl2ZSBudW1iZXJzIChzbyB0aGF0IGxvbmdlciBsZW5ndGggc29ydHMgc21hbGxlcikKKyAgICAgKgorICAgICAqIEJlY2F1c2Ugd2UgaW5jbHVkZSB0aGUgc2lnbiBpbiB0aGUgbGVuZ3RoIGJ5dGU6CisgICAgICogLSB1bmxpa2UgZml4ZWQtbGVuZ3RoIGludHMsIHdlIGRvbid0IG5lZWQgdG8gc2lnbi1pbnZlcnQgdGhlIGZpcnN0IHNpZ25pZmljYW50IGJ5dGUsCisgICAgICogLSB1bmxpa2UgQmlnSW50ZWdlciwgd2UgZG9uJ3QgbmVlZCB0byBpbmNsdWRlIDB4MDAgcHJlZml4IGZvciBwb3NpdGl2ZSBpbnRlZ2VycyB3aG9zZSBmaXJzdCBieXRlIGlzID49IDB4ODAKKyAgICAgKiAgIG9yIDB4RkYgcHJlZml4IGZvciBuZWdhdGl2ZSBpbnRlZ2VycyB3aG9zZSBmaXJzdCBieXRlIGlzIDwgMHg4MC4KKyAgICAgKgorICAgICAqIFRoZSByZXByZXNlbnRhdGlvbnMgYXJlIHByZWZpeC1mcmVlLCBiZWNhdXNlIHJlcHJlc2VudGF0aW9ucyBvZiBkaWZmZXJlbnQgbGVuZ3RoIGFsd2F5cyBoYXZlIGxlbmd0aCBieXRlcyB0aGF0CisgICAgICogZGlmZmVyLgorICAgICAqCisgICAgICogRXhhbXBsZXM6CisgICAgICogICAgMCAgICAgICAgICAgICBhcyA4MDAwCisgICAgICogICAgMSAgICAgICAgICAgICBhcyA4MDAxCisgICAgICogICAgMTI3ICAgICAgICAgICBhcyA4MDdGCisgICAgICogICAgMjU1ICAgICAgICAgICBhcyA4MEZGCisgICAgICogICAgMl4zMS0xICAgICAgICBhcyA4MzdGRkZGRkZGCisgICAgICogICAgMl4zMSAgICAgICAgICBhcyA4MzgwMDAwMDAwCisgICAgICogICAgMl4zMiAgICAgICAgICBhcyA4NDAxMDAwMDAwMDAKKyAgICAgKi8KKyAgICBwcml2YXRlIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzTGVnYWN5KFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSwgaW50IHN0YXJ0cG9zLCBpbnQgbGltaXQsIGludCBzaWduYnl0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQnl0ZVNvdXJjZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBwb3MgPSBzdGFydHBvczsKKyAgICAgICAgICAgIGludCBzaXplVG9SZXBvcnQgPSBsaW1pdCAtIHN0YXJ0cG9zOworICAgICAgICAgICAgYm9vbGVhbiBzaXplUmVwb3J0ZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgcHVibGljIGludCBuZXh0KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNpemVSZXBvcnRlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzaXplVG9SZXBvcnQgPj0gMTI4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplVG9SZXBvcnQgLT0gMTI4OworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpZ25ieXRlID49IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFBPU0lUSVZFX1ZBUklOVF9MRU5HVEhfSEVBREVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBORUdBVElWRV9WQVJJTlRfTEVOR1RIX0hFQURFUjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVSZXBvcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2lnbmJ5dGUgPj0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUE9TSVRJVkVfVkFSSU5UX0hFQURFUiArIChzaXplVG9SZXBvcnQgLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUE9TSVRJVkVfVkFSSU5UX0hFQURFUiAtIHNpemVUb1JlcG9ydDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwb3MgPT0gbGltaXQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTkRfT0ZfU1RSRUFNOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc29yLmdldEJ5dGUoZGF0YSwgcG9zKyspICYgMHhGRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IFYgZnJvbUNvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHZlcnNpb24gIT0gQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5MRUdBQ1k7CisgICAgICAgIGlmIChjb21wYXJhYmxlQnl0ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBhY2Nlc3Nvci5lbXB0eSgpOworCisgICAgICAgIC8vIENvbnN1bWUgdGhlIGZpcnN0IGJ5dGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGVuY29kZWQgbnVtYmVyIGlzIHBvc2l0aXZlIGFuZAorICAgICAgICAvLyBzdGFydCBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgbGVuZ3RoIGhlYWRlciBieXRlcyBhbmQgY29sbGVjdGluZyB0aGUgbnVtYmVyIG9mIHZhbHVlIGJ5dGVzLgorICAgICAgICBpbnQgc2lnbiA9IGNvbXBhcmFibGVCeXRlcy5wZWVrKCkgXiAweEZGOyAgIC8vIEZGIGlmIG5lZ2F0aXZlLCAwMCBpZiBwb3NpdGl2ZQorICAgICAgICBpZiAoc2lnbiAhPSAweEZGICYmIHNpZ24gIT0gMHgwMCkKKyAgICAgICAgICAgIHJldHVybiBleHRyYWN0VmFySW50Qnl0ZXMoYWNjZXNzb3IsIEJ5dGVTb3VyY2VJbnZlcnNlLmdldFZhcmlhYmxlTGVuZ3RoSW50ZWdlcihjb21wYXJhYmxlQnl0ZXMpKTsKKworICAgICAgICAvLyBjb25zdW1lIHRoZSBzaWduIGJ5dGUKKyAgICAgICAgY29tcGFyYWJsZUJ5dGVzLm5leHQoKTsKKworICAgICAgICAvLyBSZWFkIHRoZSBsZW5ndGggKGludmVydGVkIGlmIHRoZSBudW1iZXIgaXMgbmVnYXRpdmUpCisgICAgICAgIGludCB2YWx1ZUJ5dGVzID0gTWF0aC50b0ludEV4YWN0KEJ5dGVTb3VyY2VJbnZlcnNlLmdldFZhcmlhYmxlTGVuZ3RoVW5zaWduZWRJbnRlZ2VyWG9yaW5nKGNvbXBhcmFibGVCeXRlcywgc2lnbikgKyBGVUxMX0ZPUk1fVEhSRVNIT0xEKTsKKyAgICAgICAgLy8gR2V0IHRoZSBieXRlcy4KKyAgICAgICAgcmV0dXJuIGV4dHJhY3RCeXRlcyhhY2Nlc3NvciwgY29tcGFyYWJsZUJ5dGVzLCBzaWduLCB2YWx1ZUJ5dGVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxWPiBWIGV4dHJhY3RWYXJJbnRCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBsb25nIHZhbHVlKQorICAgIHsKKyAgICAgICAgaW50IGxlbmd0aCA9ICg2NCAtIExvbmcubnVtYmVyT2ZMZWFkaW5nWmVyb3ModmFsdWUgXiAodmFsdWUgPj4gNjMpKSArIDgpIC8gODsgICAvLyBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkOiA3IGJpdHMgLT4gb25lIGJ5dGUsIDggYml0cyAtPiAyIGJ5dGVzCisgICAgICAgIFYgYnVmID0gYWNjZXNzb3IuYWxsb2NhdGUobGVuZ3RoKTsKKyAgICAgICAgc3dpdGNoIChsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBhY2Nlc3Nvci5wdXRCeXRlKGJ1ZiwgMCwgKGJ5dGUpIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBhY2Nlc3Nvci5wdXRTaG9ydChidWYsIDAsIChzaG9ydCkgdmFsdWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGFjY2Vzc29yLnB1dFNob3J0KGJ1ZiwgMCwgKHNob3J0KSAodmFsdWUgPj4gOCkpOworICAgICAgICAgICAgICAgIGFjY2Vzc29yLnB1dEJ5dGUoYnVmLCAyLCAoYnl0ZSkgdmFsdWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIGFjY2Vzc29yLnB1dEludChidWYsIDAsIChpbnQpIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICBhY2Nlc3Nvci5wdXRJbnQoYnVmLCAwLCAoaW50KSAodmFsdWUgPj4gOCkpOworICAgICAgICAgICAgICAgIGFjY2Vzc29yLnB1dEJ5dGUoYnVmLCA0LCAoYnl0ZSkgdmFsdWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgIGFjY2Vzc29yLnB1dEludChidWYsIDAsIChpbnQpICh2YWx1ZSA+PiAxNikpOworICAgICAgICAgICAgICAgIGFjY2Vzc29yLnB1dFNob3J0KGJ1ZiwgNCwgKHNob3J0KSB2YWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgYWNjZXNzb3IucHV0SW50KGJ1ZiwgMCwgKGludCkgKHZhbHVlID4+IDI0KSk7CisgICAgICAgICAgICAgICAgYWNjZXNzb3IucHV0U2hvcnQoYnVmLCA0LCAoc2hvcnQpICh2YWx1ZSA+PiA4KSk7CisgICAgICAgICAgICAgICAgYWNjZXNzb3IucHV0Qnl0ZShidWYsIDYsIChieXRlKSB2YWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgcmVhY2hhYmxlIHdpdGhpbiB0aGUgZW5jb2Rpbmc7IGFkZGVkIGZvciBjb21wbGV0ZW5lc3MuCisgICAgICAgICAgICAgICAgYWNjZXNzb3IucHV0TG9uZyhidWYsIDAsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKKyAgICBwcml2YXRlIDxWPiBWIGV4dHJhY3RCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywgaW50IHNpZ24sIGludCB2YWx1ZUJ5dGVzKQorICAgIHsKKyAgICAgICAgaW50IHdyaXR0ZW5CeXRlcyA9IDA7CisgICAgICAgIFYgYnVmOworICAgICAgICAvLyBBZGQgImxlYWRpbmcgemVybyIgaWYgbmVlZGVkIChpLmUuIGluIGNhc2UgdGhlIGxlYWRpbmcgYnl0ZSBvZiBhIHBvc2l0aXZlIG51bWJlciBjb3JyZXNwb25kcyB0byBhIG5lZ2F0aXZlCisgICAgICAgIC8vIHZhbHVlLCBvciBpbiBjYXNlIHRoZSBsZWFkaW5nIGJ5dGUgb2YgYSBuZWdhdGl2ZSBudW1iZXIgY29ycmVzcG9uZHMgdG8gYSBub24tbmVnYXRpdmUgdmFsdWUpLgorICAgICAgICAvLyBTaXplIHRoZSBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgdmFsdWUgYnl0ZXMgYWNjb3JkaW5nbHkuCisgICAgICAgIGludCBjdXJyID0gY29tcGFyYWJsZUJ5dGVzLm5leHQoKTsKKyAgICAgICAgaWYgKChjdXJyICYgMHg4MCkgIT0gKHNpZ24gJiAweDgwKSkKKyAgICAgICAgeworICAgICAgICAgICAgKyt2YWx1ZUJ5dGVzOworICAgICAgICAgICAgYnVmID0gYWNjZXNzb3IuYWxsb2NhdGUodmFsdWVCeXRlcyk7CisgICAgICAgICAgICBhY2Nlc3Nvci5wdXRCeXRlKGJ1Ziwgd3JpdHRlbkJ5dGVzKyssIChieXRlKSBzaWduKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBidWYgPSBhY2Nlc3Nvci5hbGxvY2F0ZSh2YWx1ZUJ5dGVzKTsKKyAgICAgICAgLy8gRG9uJ3QgZm9yZ2V0IHRvIGFkZCB0aGUgZmlyc3QgY29uc3VtZWQgdmFsdWUgYnl0ZSBhZnRlciBkZXRlcm1pbmluZyB3aGV0aGVyIGxlYWRpbmcgemVybyBzaG91bGQgYmUgYWRkZWQKKyAgICAgICAgLy8gYW5kIHNpemluZyB0aGUgdmFsdWUgYnl0ZXMgYXJyYXkuCisgICAgICAgIGFjY2Vzc29yLnB1dEJ5dGUoYnVmLCB3cml0dGVuQnl0ZXMrKywgKGJ5dGUpIGN1cnIpOworCisgICAgICAgIC8vIENvbnN1bWUgZXhhY3RseSB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIHZhbHVlIGJ5dGVzLgorICAgICAgICB3aGlsZSAod3JpdHRlbkJ5dGVzIDwgdmFsdWVCeXRlcykKKyAgICAgICAgICAgIGFjY2Vzc29yLnB1dEJ5dGUoYnVmLCB3cml0dGVuQnl0ZXMrKywgKGJ5dGUpIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworCisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorCiAgICAgcHVibGljIEJ5dGVCdWZmZXIgZnJvbVN0cmluZyhTdHJpbmcgc291cmNlKSB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgLy8gUmV0dXJuIGFuIGVtcHR5IEJ5dGVCdWZmZXIgZm9yIGFuIGVtcHR5IHN0cmluZy4KQEAgLTI1Miw0ICs1NjEsNTQgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBkZWNvbXBvc2UodG9CaWdJbnRlZ2VyKGlucHV0KS5uZWdhdGUoKSk7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgYWJzKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gZGVjb21wb3NlKHRvQmlnSW50ZWdlcihpbnB1dCkuYWJzKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4cChCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgQmlnSW50ZWdlciBiaSA9IHRvQmlnSW50ZWdlcihpbnB1dCk7CisgICAgICAgIEJpZ0RlY2ltYWwgYmQgPSBuZXcgQmlnRGVjaW1hbChiaSk7CisgICAgICAgIEJpZ0RlY2ltYWwgcmVzdWx0ID0gRGVjaW1hbFR5cGUuaW5zdGFuY2UuZXhwKGJkKTsKKyAgICAgICAgQmlnSW50ZWdlciBvdXQgPSByZXN1bHQudG9CaWdJbnRlZ2VyKCk7CisgICAgICAgIHJldHVybiBJbnRlZ2VyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2Uob3V0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBsb2coQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIEJpZ0ludGVnZXIgYmkgPSB0b0JpZ0ludGVnZXIoaW5wdXQpOworICAgICAgICBpZiAoYmkuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTykgPD0gMCkgdGhyb3cgbmV3IEFyaXRobWV0aWNFeGNlcHRpb24oIk5hdHVyYWwgbG9nIG9mIG51bWJlciB6ZXJvIG9yIGxlc3MiKTsKKyAgICAgICAgQmlnRGVjaW1hbCBiZCA9IG5ldyBCaWdEZWNpbWFsKGJpKTsKKyAgICAgICAgQmlnRGVjaW1hbCByZXN1bHQgPSBEZWNpbWFsVHlwZS5pbnN0YW5jZS5sb2coYmQpOworICAgICAgICBCaWdJbnRlZ2VyIG91dCA9IHJlc3VsdC50b0JpZ0ludGVnZXIoKTsKKyAgICAgICAgcmV0dXJuIEludGVnZXJUeXBlLmluc3RhbmNlLmRlY29tcG9zZShvdXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGxvZzEwKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICBCaWdJbnRlZ2VyIGJpID0gdG9CaWdJbnRlZ2VyKGlucHV0KTsKKyAgICAgICAgaWYgKGJpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pIDw9IDApIHRocm93IG5ldyBBcml0aG1ldGljRXhjZXB0aW9uKCJMb2cxMCBvZiBudW1iZXIgemVybyBvciBsZXNzIik7CisgICAgICAgIEJpZ0RlY2ltYWwgYmQgPSBuZXcgQmlnRGVjaW1hbChiaSk7CisgICAgICAgIEJpZ0RlY2ltYWwgcmVzdWx0ID0gRGVjaW1hbFR5cGUuaW5zdGFuY2UubG9nMTAoYmQpOworICAgICAgICBCaWdJbnRlZ2VyIG91dCA9IHJlc3VsdC50b0JpZ0ludGVnZXIoKTsKKyAgICAgICAgcmV0dXJuIEludGVnZXJUeXBlLmluc3RhbmNlLmRlY29tcG9zZShvdXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIHJvdW5kKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuY2xvbmUoaW5wdXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE1hc2tlZFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBNQVNLRURfVkFMVUU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9MZWdhY3lUaW1lVVVJRFR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvTGVnYWN5VGltZVVVSURUeXBlLmphdmEKaW5kZXggNTI4YTNlOC4uNjIyODBiOSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9MZWdhY3lUaW1lVVVJRFR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0xlZ2FjeVRpbWVVVUlEVHlwZS5qYXZhCkBAIC0xNywxOCArMTcsMjggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsOwogCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLlR5cGVTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLlVVSURTZXJpYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogCiAvLyBGdWxseSBjb21wYXRpYmxlIHdpdGggVVVJRCwgYW5kIGluZGVlZCBpcyBpbnRlcnByZXRlZCBhcyBVVUlEIGZvciBVREYKIHB1YmxpYyBjbGFzcyBMZWdhY3lUaW1lVVVJRFR5cGUgZXh0ZW5kcyBBYnN0cmFjdFRpbWVVVUlEVHlwZTxVVUlEPgogewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTGVnYWN5VGltZVVVSURUeXBlIGluc3RhbmNlID0gbmV3IExlZ2FjeVRpbWVVVUlEVHlwZSgpOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlciBNQVNLRURfVkFMVUUgPSBpbnN0YW5jZS5kZWNvbXBvc2UoVGltZVVVSUQubWluQXRVbml4TWlsbGlzKDApLmFzVVVJRCgpKTsKKwogICAgIHB1YmxpYyBUeXBlU2VyaWFsaXplcjxVVUlEPiBnZXRTZXJpYWxpemVyKCkKICAgICB7CiAgICAgICAgIHJldHVybiBVVUlEU2VyaWFsaXplci5pbnN0YW5jZTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRNYXNrZWRWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gTUFTS0VEX1ZBTFVFOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvTGV4aWNhbFVVSURUeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0xleGljYWxVVUlEVHlwZS5qYXZhCmluZGV4IDZkZDQxNjEuLmVhYzk0YTQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvTGV4aWNhbFVVSURUeXBlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9MZXhpY2FsVVVJRFR5cGUuamF2YQpAQCAtMjYsMTEgKzI2LDE2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5VVUlEU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2VJbnZlcnNlOwogCiBwdWJsaWMgY2xhc3MgTGV4aWNhbFVVSURUeXBlIGV4dGVuZHMgQWJzdHJhY3RUeXBlPFVVSUQ+CiB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMZXhpY2FsVVVJRFR5cGUgaW5zdGFuY2UgPSBuZXcgTGV4aWNhbFVVSURUeXBlKCk7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIE1BU0tFRF9WQUxVRSA9IGluc3RhbmNlLmRlY29tcG9zZShVVUlELmZyb21TdHJpbmcoIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCIpKTsKKwogICAgIExleGljYWxVVUlEVHlwZSgpCiAgICAgewogICAgICAgICBzdXBlcihDb21wYXJpc29uVHlwZS5DVVNUT00pOwpAQCAtNDgsNiArNTMsNDYgQEAKICAgICAgICAgcmV0dXJuIGFjY2Vzc29yTC50b1VVSUQobGVmdCkuY29tcGFyZVRvKGFjY2Vzc29yUi50b1VVSUQocmlnaHQpKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICBpZiAoZGF0YSA9PSBudWxsIHx8IGFjY2Vzc29yLmlzRW1wdHkoZGF0YSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAvLyBmaXhlZC1sZW5ndGggKGhlbmNlIHByZWZpeC1mcmVlKSByZXByZXNlbnRhdGlvbiwgYnV0CisgICAgICAgIC8vIHdlIGhhdmUgdG8gc2lnbi1mbGlwIHRoZSBoaWdoZXN0IGJ5dGVzIG9mIHRoZSB0d28gbG9uZ3MKKyAgICAgICAgcmV0dXJuIG5ldyBCeXRlU291cmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGJ1ZnBvcyA9IDA7CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbmV4dCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZnBvcyA+PSBhY2Nlc3Nvci5zaXplKGRhdGEpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICBpbnQgdiA9IGFjY2Vzc29yLmdldEJ5dGUoZGF0YSwgYnVmcG9zKSAmIDB4RkY7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZnBvcyA9PSAwIHx8IGJ1ZnBvcyA9PSA4KQorICAgICAgICAgICAgICAgICAgICB2IF49IDB4ODA7CisgICAgICAgICAgICAgICAgKytidWZwb3M7CisgICAgICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBWIGZyb21Db21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIC8vIE9wdGlvbmFsLXN0eWxlIGVuY29kaW5nIG9mIGVtcHR5IHZhbHVlcyBhcyBudWxsIHNvdXJjZXMKKyAgICAgICAgaWYgKGNvbXBhcmFibGVCeXRlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc29yLmVtcHR5KCk7CisKKyAgICAgICAgbG9uZyBoaUJpdHMgPSBCeXRlU291cmNlSW52ZXJzZS5nZXRTaWduZWRMb25nKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIGxvbmcgbG9CaXRzID0gQnl0ZVNvdXJjZUludmVyc2UuZ2V0U2lnbmVkTG9uZyhjb21wYXJhYmxlQnl0ZXMpOworCisgICAgICAgIC8vIExleGljYWwgVVVJRHMgYXJlIHN0b3JlZCBhcyBqdXN0IHR3byBzaWduZWQgbG9uZ3MuIFRoZSBkZWNvZGluZyBvZiB0aGVzZSBsb25ncyBmbGlwcyB0aGVpciBzaWduIGJpdCBiYWNrLCBzbworICAgICAgICAvLyB0aGV5IGNhbiBkaXJlY3RseSBiZSB1c2VkIGZvciBjb25zdHJ1Y3RpbmcgdGhlIG9yaWdpbmFsIFVVSUQuCisgICAgICAgIHJldHVybiBVVUlEVHlwZS5tYWtlVXVpZEJ5dGVzKGFjY2Vzc29yLCBoaUJpdHMsIGxvQml0cyk7CisgICAgfQorCiAgICAgcHVibGljIEJ5dGVCdWZmZXIgZnJvbVN0cmluZyhTdHJpbmcgc291cmNlKSB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgLy8gUmV0dXJuIGFuIGVtcHR5IEJ5dGVCdWZmZXIgZm9yIGFuIGVtcHR5IHN0cmluZy4KQEAgLTg4LDQgKzEzMywxMCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIDE2OwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE1hc2tlZFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBNQVNLRURfVkFMVUU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9MaXN0VHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9MaXN0VHlwZS5qYXZhCmluZGV4IDI4MWY3ZWUuLjE1OTY4MGQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvTGlzdFR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0xpc3RUeXBlLmphdmEKQEAgLTE4LDIxICsxOCwyNSBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsOwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Kc29uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuTGlzdHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5UZXJtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLkNvbGxlY3Rpb25TZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLkxpc3RTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLk1hcnNoYWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSnNvblV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGUuVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOwogCiBwdWJsaWMgY2xhc3MgTGlzdFR5cGU8VD4gZXh0ZW5kcyBDb2xsZWN0aW9uVHlwZTxMaXN0PFQ+PgogewpAQCAtMTU2LDE0ICsxNjAsMTQgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBhdGlibGVXaXRoRnJvemVuKENvbGxlY3Rpb25UeXBlPD8+IHByZXZpb3VzKQogICAgIHsKICAgICAgICAgYXNzZXJ0ICFpc011bHRpQ2VsbDsKLSAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHMuaXNDb21wYXRpYmxlV2l0aCgoKExpc3RUeXBlKSBwcmV2aW91cykuZWxlbWVudHMpOworICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5pc0NvbXBhdGlibGVXaXRoKCgoTGlzdFR5cGU8Pz4pIHByZXZpb3VzKS5lbGVtZW50cyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNWYWx1ZUNvbXBhdGlibGVXaXRoRnJvemVuKENvbGxlY3Rpb25UeXBlPD8+IHByZXZpb3VzKQogICAgIHsKICAgICAgICAgYXNzZXJ0ICFpc011bHRpQ2VsbDsKLSAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHMuaXNWYWx1ZUNvbXBhdGlibGVXaXRoSW50ZXJuYWwoKChMaXN0VHlwZSkgcHJldmlvdXMpLmVsZW1lbnRzKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHMuaXNWYWx1ZUNvbXBhdGlibGVXaXRoSW50ZXJuYWwoKChMaXN0VHlwZTw/PikgcHJldmlvdXMpLmVsZW1lbnRzKTsKICAgICB9CiAKICAgICBwdWJsaWMgPFZMLCBWUj4gaW50IGNvbXBhcmVDdXN0b20oVkwgbGVmdCwgVmFsdWVBY2Nlc3NvcjxWTD4gYWNjZXNzb3JMLCBWUiByaWdodCwgVmFsdWVBY2Nlc3NvcjxWUj4gYWNjZXNzb3JSKQpAQCAtMTcxLDI5ICsxNzUsMTYgQEAKICAgICAgICAgcmV0dXJuIGNvbXBhcmVMaXN0T3JTZXQoZWxlbWVudHMsIGxlZnQsIGFjY2Vzc29yTCwgcmlnaHQsIGFjY2Vzc29yUik7CiAgICAgfQogCi0gICAgc3RhdGljIDxWTCwgVlI+IGludCBjb21wYXJlTGlzdE9yU2V0KEFic3RyYWN0VHlwZTw/PiBlbGVtZW50c0NvbXBhcmF0b3IsIFZMIGxlZnQsIFZhbHVlQWNjZXNzb3I8Vkw+IGFjY2Vzc29yTCwgVlIgcmlnaHQsIFZhbHVlQWNjZXNzb3I8VlI+IGFjY2Vzc29yUikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhLCBWZXJzaW9uIHZlcnNpb24pCiAgICAgewotICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IHVzZWQgaWYgdGhlIGNvbGxlY3Rpb24gaXMgZnJvemVuCi0gICAgICAgIGlmIChhY2Nlc3NvckwuaXNFbXB0eShsZWZ0KSB8fCBhY2Nlc3NvclIuaXNFbXB0eShyaWdodCkpCi0gICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5jb21wYXJlKGFjY2Vzc29yUi5pc0VtcHR5KHJpZ2h0KSwgYWNjZXNzb3JMLmlzRW1wdHkobGVmdCkpOworICAgICAgICByZXR1cm4gYXNDb21wYXJhYmxlQnl0ZXNMaXN0T3JTZXQoZ2V0RWxlbWVudHNUeXBlKCksIGFjY2Vzc29yLCBkYXRhLCB2ZXJzaW9uKTsKKyAgICB9CiAKLSAgICAgICAgaW50IHNpemVMID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZENvbGxlY3Rpb25TaXplKGxlZnQsIGFjY2Vzc29yTCwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKLSAgICAgICAgaW50IG9mZnNldEwgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZDb2xsZWN0aW9uU2l6ZShzaXplTCwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKLSAgICAgICAgaW50IHNpemVSID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZENvbGxlY3Rpb25TaXplKHJpZ2h0LCBhY2Nlc3NvclIsIFByb3RvY29sVmVyc2lvbi5WMyk7Ci0gICAgICAgIGludCBvZmZzZXRSID0gVHlwZVNpemVzLklOVF9TSVpFOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTWF0aC5taW4oc2l6ZUwsIHNpemVSKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBWTCB2MSA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRWYWx1ZShsZWZ0LCBhY2Nlc3NvckwsIG9mZnNldEwsIFByb3RvY29sVmVyc2lvbi5WMyk7Ci0gICAgICAgICAgICBvZmZzZXRMICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZlZhbHVlKHYxLCBhY2Nlc3NvckwsIFByb3RvY29sVmVyc2lvbi5WMyk7Ci0gICAgICAgICAgICBWUiB2MiA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRWYWx1ZShyaWdodCwgYWNjZXNzb3JSLCBvZmZzZXRSLCBQcm90b2NvbFZlcnNpb24uVjMpOwotICAgICAgICAgICAgb2Zmc2V0UiArPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZWYWx1ZSh2MiwgYWNjZXNzb3JSLCBQcm90b2NvbFZlcnNpb24uVjMpOwotICAgICAgICAgICAgaW50IGNtcCA9IGVsZW1lbnRzQ29tcGFyYXRvci5jb21wYXJlKHYxLCBhY2Nlc3NvckwsIHYyLCBhY2Nlc3NvclIpOwotICAgICAgICAgICAgaWYgKGNtcCAhPSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBjbXA7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2l6ZUwgPT0gc2l6ZVIgPyAwIDogKHNpemVMIDwgc2l6ZVIgPyAtMSA6IDEpOworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gViBmcm9tQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBWZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gZnJvbUNvbXBhcmFibGVCeXRlc0xpc3RPclNldChhY2Nlc3NvciwgY29tcGFyYWJsZUJ5dGVzLCB2ZXJzaW9uLCBnZXRFbGVtZW50c1R5cGUoKSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0yMjQsMTMgKzIxNSwxMyBAQAogICAgIHB1YmxpYyBUZXJtIGZyb21KU09OT2JqZWN0KE9iamVjdCBwYXJzZWQpIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uCiAgICAgewogICAgICAgICBpZiAocGFyc2VkIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgcGFyc2VkID0gSnNvbi5kZWNvZGVKc29uKChTdHJpbmcpIHBhcnNlZCk7CisgICAgICAgICAgICBwYXJzZWQgPSBKc29uVXRpbHMuZGVjb2RlSnNvbigoU3RyaW5nKSBwYXJzZWQpOwogCiAgICAgICAgIGlmICghKHBhcnNlZCBpbnN0YW5jZW9mIExpc3QpKQogICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGEgbGlzdCwgYnV0IGdvdCBhICVzOiAlcyIsIHBhcnNlZC5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwgcGFyc2VkKSk7CiAKLSAgICAgICAgTGlzdCBsaXN0ID0gKExpc3QpIHBhcnNlZDsKKyAgICAgICAgTGlzdDw/PiBsaXN0ID0gKExpc3Q8Pz4pIHBhcnNlZDsKICAgICAgICAgTGlzdDxUZXJtPiB0ZXJtcyA9IG5ldyBBcnJheUxpc3Q8PihsaXN0LnNpemUoKSk7CiAgICAgICAgIGZvciAoT2JqZWN0IGVsZW1lbnQgOiBsaXN0KQogICAgICAgICB7CkBAIC0yNDIsMjMgKzIzMyw2IEBACiAgICAgICAgIHJldHVybiBuZXcgTGlzdHMuRGVsYXllZFZhbHVlKHRlcm1zKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzZXRPckxpc3RUb0pzb25TdHJpbmcoQnl0ZUJ1ZmZlciBidWZmZXIsIEFic3RyYWN0VHlwZSBlbGVtZW50c1R5cGUsIFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pCi0gICAgewotICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gYnVmZmVyLmR1cGxpY2F0ZSgpOwotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIlsiKTsKLSAgICAgICAgaW50IHNpemUgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkQ29sbGVjdGlvblNpemUodmFsdWUsIHByb3RvY29sVmVyc2lvbik7Ci0gICAgICAgIGludCBvZmZzZXQgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZDb2xsZWN0aW9uU2l6ZShzaXplLCBwcm90b2NvbFZlcnNpb24pOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgIEJ5dGVCdWZmZXIgZWxlbWVudCA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRWYWx1ZSh2YWx1ZSwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBvZmZzZXQsIHByb3RvY29sVmVyc2lvbik7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mVmFsdWUoZWxlbWVudCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBwcm90b2NvbFZlcnNpb24pOwotICAgICAgICAgICAgc2IuYXBwZW5kKGVsZW1lbnRzVHlwZS50b0pTT05TdHJpbmcoZWxlbWVudCwgcHJvdG9jb2xWZXJzaW9uKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNiLmFwcGVuZCgiXSIpLnRvU3RyaW5nKCk7Ci0gICAgfQotCiAgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0U2xpY2VGcm9tU2VyaWFsaXplZChCeXRlQnVmZmVyIGNvbGxlY3Rpb24sIEJ5dGVCdWZmZXIgZnJvbSwgQnl0ZUJ1ZmZlciB0bykKICAgICB7CiAgICAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgc2xpY2luZyBvbiBsaXN0cyBzbyB3ZSBkb24ndCBuZWVkIHRoYXQgZnVuY3Rpb24KQEAgLTI3MCw0ICsyNDQsMTYgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBzZXRPckxpc3RUb0pzb25TdHJpbmcoYnVmZmVyLCBlbGVtZW50cywgcHJvdG9jb2xWZXJzaW9uKTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmb3JFYWNoKEJ5dGVCdWZmZXIgaW5wdXQsIENvbnN1bWVyPEJ5dGVCdWZmZXI+IGFjdGlvbikKKyAgICB7CisgICAgICAgIHNlcmlhbGl6ZXIuZm9yRWFjaChpbnB1dCwgYWN0aW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRNYXNrZWRWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gZGVjb21wb3NlKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0xvbmdUeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0xvbmdUeXBlLmphdmEKaW5kZXggYWQ1MzlmNy4uYzgwOTVmYyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9Mb25nVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvTG9uZ1R5cGUuamF2YQpAQCAtMjgsMTEgKzI4LDE2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZUludmVyc2U7CiAKIHB1YmxpYyBjbGFzcyBMb25nVHlwZSBleHRlbmRzIE51bWJlclR5cGU8TG9uZz4KIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdUeXBlIGluc3RhbmNlID0gbmV3IExvbmdUeXBlKCk7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIE1BU0tFRF9WQUxVRSA9IGluc3RhbmNlLmRlY29tcG9zZSgwTCk7CisKICAgICBMb25nVHlwZSgpIHtzdXBlcihDb21wYXJpc29uVHlwZS5DVVNUT00pO30gLy8gc2luZ2xldG9uCiAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5VmFsdWVNZWFuaW5nbGVzcygpCkBAIC01Nyw2ICs2MiwyOCBAQAogICAgICAgICByZXR1cm4gVmFsdWVBY2Nlc3Nvci5jb21wYXJlKGxlZnQsIGFjY2Vzc29yTCwgcmlnaHQsIGFjY2Vzc29yUik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgaWYgKGFjY2Vzc29yLmlzRW1wdHkoZGF0YSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5MRUdBQ1kpCisgICAgICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZS5zaWduZWRGaXhlZExlbmd0aE51bWJlcihhY2Nlc3NvciwgZGF0YSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBCeXRlU291cmNlLnZhcmlhYmxlTGVuZ3RoSW50ZWdlcihhY2Nlc3Nvci5nZXRMb25nKGRhdGEsIDApKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IFYgZnJvbUNvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgaWYgKGNvbXBhcmFibGVCeXRlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc29yLmVtcHR5KCk7CisgICAgICAgIGlmICh2ZXJzaW9uID09IEJ5dGVDb21wYXJhYmxlLlZlcnNpb24uTEVHQUNZKQorICAgICAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2VJbnZlcnNlLmdldFNpZ25lZEZpeGVkTGVuZ3RoKGFjY2Vzc29yLCBjb21wYXJhYmxlQnl0ZXMsIDgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gYWNjZXNzb3IudmFsdWVPZihCeXRlU291cmNlSW52ZXJzZS5nZXRWYXJpYWJsZUxlbmd0aEludGVnZXIoY29tcGFyYWJsZUJ5dGVzKSk7CisgICAgfQorCiAgICAgcHVibGljIEJ5dGVCdWZmZXIgZnJvbVN0cmluZyhTdHJpbmcgc291cmNlKSB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgLy8gUmV0dXJuIGFuIGVtcHR5IEJ5dGVCdWZmZXIgZm9yIGFuIGVtcHR5IHN0cmluZy4KQEAgLTE3Myw0ICsyMDAsNDAgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcygtdG9Mb25nKGlucHV0KSk7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgYWJzKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoTWF0aC5hYnModG9Mb25nKGlucHV0KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4cChCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKChsb25nKSBNYXRoLmV4cCh0b0xvbmcoaW5wdXQpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgbG9nKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoKGxvbmcpIE1hdGgubG9nKHRvTG9uZyhpbnB1dCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBsb2cxMChCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKChsb25nKSBNYXRoLmxvZzEwKHRvTG9uZyhpbnB1dCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciByb3VuZChCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmNsb25lKGlucHV0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRNYXNrZWRWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gTUFTS0VEX1ZBTFVFOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvTWFwVHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9NYXBUeXBlLmphdmEKaW5kZXggOTQ3M2UyOS4uNDBjZDhiZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9NYXBUeXBlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9NYXBUeXBlLmphdmEKQEAgLTE4LDE5ICsxOCwzMCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsOwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuSnNvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLk1hcHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5UZXJtOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ2VsbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5TeW50YXhFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuQ29sbGVjdGlvblNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5NYXBTZXJpYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLk1hcnNoYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Kc29uVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGUuVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2VJbnZlcnNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiAKIHB1YmxpYyBjbGFzcyBNYXBUeXBlPEssIFY+IGV4dGVuZHMgQ29sbGVjdGlvblR5cGU8TWFwPEssIFY+PgpAQCAtMTY2LDcgKzE3Nyw3IEBACiAgICAgcHVibGljIGJvb2xlYW4gaXNDb21wYXRpYmxlV2l0aEZyb3plbihDb2xsZWN0aW9uVHlwZTw/PiBwcmV2aW91cykKICAgICB7CiAgICAgICAgIGFzc2VydCAhaXNNdWx0aUNlbGw7Ci0gICAgICAgIE1hcFR5cGUgdHByZXYgPSAoTWFwVHlwZSkgcHJldmlvdXM7CisgICAgICAgIE1hcFR5cGU8PywgPz4gdHByZXYgPSAoTWFwVHlwZTw/LCA/PikgcHJldmlvdXM7CiAgICAgICAgIHJldHVybiBrZXlzLmlzQ29tcGF0aWJsZVdpdGgodHByZXYua2V5cykgJiYgdmFsdWVzLmlzQ29tcGF0aWJsZVdpdGgodHByZXYudmFsdWVzKTsKICAgICB9CiAKQEAgLTE3NCw3ICsxODUsNyBAQAogICAgIHB1YmxpYyBib29sZWFuIGlzVmFsdWVDb21wYXRpYmxlV2l0aEZyb3plbihDb2xsZWN0aW9uVHlwZTw/PiBwcmV2aW91cykKICAgICB7CiAgICAgICAgIGFzc2VydCAhaXNNdWx0aUNlbGw7Ci0gICAgICAgIE1hcFR5cGUgdHByZXYgPSAoTWFwVHlwZSkgcHJldmlvdXM7CisgICAgICAgIE1hcFR5cGU8PywgPz4gdHByZXYgPSAoTWFwVHlwZTw/LCA/PikgcHJldmlvdXM7CiAgICAgICAgIHJldHVybiBrZXlzLmlzQ29tcGF0aWJsZVdpdGgodHByZXYua2V5cykgJiYgdmFsdWVzLmlzVmFsdWVDb21wYXRpYmxlV2l0aCh0cHJldi52YWx1ZXMpOwogICAgIH0KIApAQCAtMTg5LDMzICsyMDAsOTUgQEAKICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLmNvbXBhcmUoYWNjZXNzb3JSLmlzRW1wdHkocmlnaHQpLCBhY2Nlc3NvckwuaXNFbXB0eShsZWZ0KSk7CiAKIAotICAgICAgICBQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uID0gUHJvdG9jb2xWZXJzaW9uLlYzOwotICAgICAgICBpbnQgc2l6ZUwgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkQ29sbGVjdGlvblNpemUobGVmdCwgYWNjZXNzb3JMLCBwcm90b2NvbFZlcnNpb24pOwotICAgICAgICBpbnQgc2l6ZVIgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkQ29sbGVjdGlvblNpemUocmlnaHQsIGFjY2Vzc29yUiwgcHJvdG9jb2xWZXJzaW9uKTsKKyAgICAgICAgaW50IHNpemVMID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZENvbGxlY3Rpb25TaXplKGxlZnQsIGFjY2Vzc29yTCk7CisgICAgICAgIGludCBzaXplUiA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRDb2xsZWN0aW9uU2l6ZShyaWdodCwgYWNjZXNzb3JSKTsKIAotICAgICAgICBpbnQgb2Zmc2V0TCA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZkNvbGxlY3Rpb25TaXplKHNpemVMLCBwcm90b2NvbFZlcnNpb24pOwotICAgICAgICBpbnQgb2Zmc2V0UiA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZkNvbGxlY3Rpb25TaXplKHNpemVSLCBwcm90b2NvbFZlcnNpb24pOworICAgICAgICBpbnQgb2Zmc2V0TCA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZkNvbGxlY3Rpb25TaXplKCk7CisgICAgICAgIGludCBvZmZzZXRSID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mQ29sbGVjdGlvblNpemUoKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1hdGgubWluKHNpemVMLCBzaXplUik7IGkrKykKICAgICAgICAgewotICAgICAgICAgICAgVEwgazEgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkVmFsdWUobGVmdCwgYWNjZXNzb3JMLCBvZmZzZXRMLCBwcm90b2NvbFZlcnNpb24pOwotICAgICAgICAgICAgb2Zmc2V0TCArPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZWYWx1ZShrMSwgYWNjZXNzb3JMLCBwcm90b2NvbFZlcnNpb24pOwotICAgICAgICAgICAgVFIgazIgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkVmFsdWUocmlnaHQsIGFjY2Vzc29yUiwgb2Zmc2V0UiwgcHJvdG9jb2xWZXJzaW9uKTsKLSAgICAgICAgICAgIG9mZnNldFIgKz0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mVmFsdWUoazIsIGFjY2Vzc29yUiwgcHJvdG9jb2xWZXJzaW9uKTsKKyAgICAgICAgICAgIFRMIGsxID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZFZhbHVlKGxlZnQsIGFjY2Vzc29yTCwgb2Zmc2V0TCk7CisgICAgICAgICAgICBvZmZzZXRMICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZlZhbHVlKGsxLCBhY2Nlc3NvckwpOworICAgICAgICAgICAgVFIgazIgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkVmFsdWUocmlnaHQsIGFjY2Vzc29yUiwgb2Zmc2V0Uik7CisgICAgICAgICAgICBvZmZzZXRSICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZlZhbHVlKGsyLCBhY2Nlc3NvclIpOwogICAgICAgICAgICAgaW50IGNtcCA9IGtleXNDb21wYXJhdG9yLmNvbXBhcmUoazEsIGFjY2Vzc29yTCwgazIsIGFjY2Vzc29yUik7CiAgICAgICAgICAgICBpZiAoY21wICE9IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIGNtcDsKIAotICAgICAgICAgICAgVEwgdjEgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkVmFsdWUobGVmdCwgYWNjZXNzb3JMLCBvZmZzZXRMLCBwcm90b2NvbFZlcnNpb24pOwotICAgICAgICAgICAgb2Zmc2V0TCArPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZWYWx1ZSh2MSwgYWNjZXNzb3JMLCBwcm90b2NvbFZlcnNpb24pOwotICAgICAgICAgICAgVFIgdjIgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkVmFsdWUocmlnaHQsIGFjY2Vzc29yUiwgb2Zmc2V0UiwgcHJvdG9jb2xWZXJzaW9uKTsKLSAgICAgICAgICAgIG9mZnNldFIgKz0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mVmFsdWUodjIsIGFjY2Vzc29yUiwgcHJvdG9jb2xWZXJzaW9uKTsKKyAgICAgICAgICAgIFRMIHYxID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZFZhbHVlKGxlZnQsIGFjY2Vzc29yTCwgb2Zmc2V0TCk7CisgICAgICAgICAgICBvZmZzZXRMICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZlZhbHVlKHYxLCBhY2Nlc3NvckwpOworICAgICAgICAgICAgVFIgdjIgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkVmFsdWUocmlnaHQsIGFjY2Vzc29yUiwgb2Zmc2V0Uik7CisgICAgICAgICAgICBvZmZzZXRSICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZlZhbHVlKHYyLCBhY2Nlc3NvclIpOwogICAgICAgICAgICAgY21wID0gdmFsdWVzQ29tcGFyYXRvci5jb21wYXJlKHYxLCBhY2Nlc3NvckwsIHYyLCBhY2Nlc3NvclIpOwogICAgICAgICAgICAgaWYgKGNtcCAhPSAwKQogICAgICAgICAgICAgICAgIHJldHVybiBjbXA7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gc2l6ZUwgPT0gc2l6ZVIgPyAwIDogKHNpemVMIDwgc2l6ZVIgPyAtMSA6IDEpOworICAgICAgICByZXR1cm4gSW50ZWdlci5jb21wYXJlKHNpemVMLCBzaXplUik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8VD4gYWNjZXNzb3IsIFQgZGF0YSwgVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFzQ29tcGFyYWJsZUJ5dGVzTWFwKGdldEtleXNUeXBlKCksIGdldFZhbHVlc1R5cGUoKSwgYWNjZXNzb3IsIGRhdGEsIHZlcnNpb24pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gVCBmcm9tQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8VD4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBWZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gZnJvbUNvbXBhcmFibGVCeXRlc01hcChhY2Nlc3NvciwgY29tcGFyYWJsZUJ5dGVzLCB2ZXJzaW9uLCBnZXRLZXlzVHlwZSgpLCBnZXRWYWx1ZXNUeXBlKCkpOworICAgIH0KKworICAgIHN0YXRpYyA8Vj4gQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlc01hcChBYnN0cmFjdFR5cGU8Pz4ga2V5c0NvbXBhcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiB2YWx1ZXNDb21wYXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIGlmIChhY2Nlc3Nvci5pc0VtcHR5KGRhdGEpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgaW50IG9mZnNldCA9IDA7CisgICAgICAgIGludCBzaXplID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZENvbGxlY3Rpb25TaXplKGRhdGEsIGFjY2Vzc29yKTsKKyAgICAgICAgb2Zmc2V0ICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZkNvbGxlY3Rpb25TaXplKCk7CisgICAgICAgIEJ5dGVTb3VyY2VbXSBzcmNzID0gbmV3IEJ5dGVTb3VyY2Vbc2l6ZSAqIDJdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgViBrID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZFZhbHVlKGRhdGEsIGFjY2Vzc29yLCBvZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZlZhbHVlKGssIGFjY2Vzc29yKTsKKyAgICAgICAgICAgIHNyY3NbaSAqIDIgKyAwXSA9IGtleXNDb21wYXJhdG9yLmFzQ29tcGFyYWJsZUJ5dGVzKGFjY2Vzc29yLCBrLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIFYgdiA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRWYWx1ZShkYXRhLCBhY2Nlc3Nvciwgb2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCArPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZWYWx1ZSh2LCBhY2Nlc3Nvcik7CisgICAgICAgICAgICBzcmNzW2kgKiAyICsgMV0gPSB2YWx1ZXNDb21wYXJhdG9yLmFzQ29tcGFyYWJsZUJ5dGVzKGFjY2Vzc29yLCB2LCB2ZXJzaW9uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvck1heWJlTGVnYWN5KHZlcnNpb24sIDB4MDAsIHNyY3MpOworICAgIH0KKworICAgIHN0YXRpYyA8Vj4gViBmcm9tQ29tcGFyYWJsZUJ5dGVzTWFwKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiBrZXlzQ29tcGFyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdmFsdWVzQ29tcGFyYXRvcikKKyAgICB7CisgICAgICAgIGlmIChjb21wYXJhYmxlQnl0ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBhY2Nlc3Nvci5lbXB0eSgpOworICAgICAgICBhc3NlcnQgdmVyc2lvbiAhPSBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLkxFR0FDWTsgLy8gbGVnYWN5IHRyYW5zbGF0aW9uIGlzIG5vdCByZXZlcnNpYmxlCisKKyAgICAgICAgTGlzdDxWPiBidWZmZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGludCBzZXBhcmF0b3IgPSBjb21wYXJhYmxlQnl0ZXMubmV4dCgpOworICAgICAgICB3aGlsZSAoc2VwYXJhdG9yICE9IEJ5dGVTb3VyY2UuVEVSTUlOQVRPUikKKyAgICAgICAgeworICAgICAgICAgICAgYnVmZmVycy5hZGQoQnl0ZVNvdXJjZUludmVyc2UubmV4dENvbXBvbmVudE51bGwoc2VwYXJhdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICA6IGtleXNDb21wYXJhdG9yLmZyb21Db21wYXJhYmxlQnl0ZXMoYWNjZXNzb3IsIGNvbXBhcmFibGVCeXRlcywgdmVyc2lvbikpOworICAgICAgICAgICAgc2VwYXJhdG9yID0gY29tcGFyYWJsZUJ5dGVzLm5leHQoKTsKKyAgICAgICAgICAgIGJ1ZmZlcnMuYWRkKEJ5dGVTb3VyY2VJbnZlcnNlLm5leHRDb21wb25lbnROdWxsKHNlcGFyYXRvcikKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZXNDb21wYXJhdG9yLmZyb21Db21wYXJhYmxlQnl0ZXMoYWNjZXNzb3IsIGNvbXBhcmFibGVCeXRlcywgdmVyc2lvbikpOworICAgICAgICAgICAgc2VwYXJhdG9yID0gY29tcGFyYWJsZUJ5dGVzLm5leHQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQ29sbGVjdGlvblNlcmlhbGl6ZXIucGFjayhidWZmZXJzLCBhY2Nlc3NvcixidWZmZXJzLnNpemUoKSAvIDIpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjYwLDE1ICszMzMsMTUgQEAKICAgICBwdWJsaWMgVGVybSBmcm9tSlNPTk9iamVjdChPYmplY3QgcGFyc2VkKSB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgaWYgKHBhcnNlZCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgICAgIHBhcnNlZCA9IEpzb24uZGVjb2RlSnNvbigoU3RyaW5nKSBwYXJzZWQpOworICAgICAgICAgICAgcGFyc2VkID0gSnNvblV0aWxzLmRlY29kZUpzb24oKFN0cmluZykgcGFyc2VkKTsKIAogICAgICAgICBpZiAoIShwYXJzZWQgaW5zdGFuY2VvZiBNYXApKQogICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGEgbWFwLCBidXQgZ290IGEgJXM6ICVzIiwgcGFyc2VkLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLCBwYXJzZWQpKTsKIAotICAgICAgICBNYXA8T2JqZWN0LCBPYmplY3Q+IG1hcCA9IChNYXA8T2JqZWN0LCBPYmplY3Q+KSBwYXJzZWQ7CisgICAgICAgIE1hcDw/LCA/PiBtYXAgPSAoTWFwPD8sID8+KSBwYXJzZWQ7CiAgICAgICAgIE1hcDxUZXJtLCBUZXJtPiB0ZXJtcyA9IG5ldyBIYXNoTWFwPD4obWFwLnNpemUoKSk7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PE9iamVjdCwgT2JqZWN0PiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKQorICAgICAgICBmb3IgKE1hcC5FbnRyeTw/LCA/PiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoZW50cnkuZ2V0S2V5KCkgPT0gbnVsbCkKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiSW52YWxpZCBudWxsIGtleSBpbiBtYXAiKTsKQEAgLTI4NiwyNyArMzU5LDM5IEBACiAgICAgewogICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gYnVmZmVyLmR1cGxpY2F0ZSgpOwogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoInsiKTsKLSAgICAgICAgaW50IHNpemUgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkQ29sbGVjdGlvblNpemUodmFsdWUsIHByb3RvY29sVmVyc2lvbik7Ci0gICAgICAgIGludCBvZmZzZXQgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZDb2xsZWN0aW9uU2l6ZShzaXplLCBwcm90b2NvbFZlcnNpb24pOworICAgICAgICBpbnQgc2l6ZSA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRDb2xsZWN0aW9uU2l6ZSh2YWx1ZSwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlKTsKKyAgICAgICAgaW50IG9mZnNldCA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZkNvbGxlY3Rpb25TaXplKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoaSA+IDApCiAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOwogCiAgICAgICAgICAgICAvLyBtYXAga2V5cyBtdXN0IGJlIEpTT04gc3RyaW5ncywgc28gY29udmVydCBub24tc3RyaW5nIGtleXMgdG8gc3RyaW5ncwotICAgICAgICAgICAgQnl0ZUJ1ZmZlciBrdiA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRWYWx1ZSh2YWx1ZSwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBvZmZzZXQsIHByb3RvY29sVmVyc2lvbik7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mVmFsdWUoa3YsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgcHJvdG9jb2xWZXJzaW9uKTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIga3YgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkVmFsdWUodmFsdWUsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCArPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZWYWx1ZShrdiwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlKTsKICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBrZXlzLnRvSlNPTlN0cmluZyhrdiwgcHJvdG9jb2xWZXJzaW9uKTsKICAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgiXCIiKSkKICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoa2V5KTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJyInKS5hcHBlbmQoSnNvbi5xdW90ZUFzSnNvblN0cmluZyhrZXkpKS5hcHBlbmQoJyInKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJyInKS5hcHBlbmQoSnNvblV0aWxzLnF1b3RlQXNKc29uU3RyaW5nKGtleSkpLmFwcGVuZCgnIicpOwogCiAgICAgICAgICAgICBzYi5hcHBlbmQoIjogIik7Ci0gICAgICAgICAgICBCeXRlQnVmZmVyIHZ2ID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZFZhbHVlKHZhbHVlLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIG9mZnNldCwgcHJvdG9jb2xWZXJzaW9uKTsKLSAgICAgICAgICAgIG9mZnNldCArPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZWYWx1ZSh2diwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBwcm90b2NvbFZlcnNpb24pOworICAgICAgICAgICAgQnl0ZUJ1ZmZlciB2diA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRWYWx1ZSh2YWx1ZSwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBvZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZlZhbHVlKHZ2LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UpOwogICAgICAgICAgICAgc2IuYXBwZW5kKHZhbHVlcy50b0pTT05TdHJpbmcodnYsIHByb3RvY29sVmVyc2lvbikpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzYi5hcHBlbmQoIn0iKS50b1N0cmluZygpOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZvckVhY2goQnl0ZUJ1ZmZlciBpbnB1dCwgQ29uc3VtZXI8Qnl0ZUJ1ZmZlcj4gYWN0aW9uKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0TWFza2VkVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlY29tcG9zZShDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL051bWJlclR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvTnVtYmVyVHlwZS5qYXZhCmluZGV4IDllNzY5N2YuLjViMTA3MjAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvTnVtYmVyVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvTnVtYmVyVHlwZS5qYXZhCkBAIC0yMjAsNCArMjIwLDUzIEBACiAgICAgICogQHJldHVybiB0aGUgbmVnYXRlZCBhcmd1bWVudAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBCeXRlQnVmZmVyIG5lZ2F0ZShCeXRlQnVmZmVyIGlucHV0KTsKKworICAgIC8qKgorICAgICAqIFRha2VzIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgYXJndW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIGFyZ3VtZW50IHRvIHRha2UgdGhlIGFic29sdXRlIHZhbHVlIG9mCisgICAgICogQHJldHVybiBhIEJ5dGVCdWZmZXIgY29udGFpbmluZyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGFyZ3VtZW50LiBUaGUgdHlwZSBvZiB0aGUgY29udGVudHMgb2YgdGhlIEJ5dGVCdWZmZXIKKyAgICAgKiB3aWxsIG1hdGNoIHRoYXQgb2YgdGhlIGlucHV0LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBCeXRlQnVmZmVyIGFicyhCeXRlQnVmZmVyIGlucHV0KTsKKworICAgIC8qKgorICAgICAqIFJhaXNlcyBlIHRvIHRoZSBwb3dlciBvZiB0aGUgYXJndW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIGFyZ3VtZW50IHRvIHJhaXNlIGUgdG8KKyAgICAgKiBAcmV0dXJuIGEgQnl0ZUJ1ZmZlciBjb250YWluZyB0aGUgdmFsdWUgb2YgZSAodGhlIGJhc2Ugb2YgbmF0dXJhbCBsb2dhcml0aG1zKSByYWlzZWQgdG8gdGhlIHBvd2VyIG9mIHRoZQorICAgICAqIGFyZ3VtZW50LiBUaGUgdHlwZSBvZiB0aGUgY29udGVudHMgb2YgdGhlIEJ5dGVCdWZmZXIgd2lsbCBiZSBhIGRvdWJsZSwgdW5sZXNzIHRoZSBpbnB1dCBpcyBhIERlY2ltYWxUeXBlIG9yCisgICAgICogSW50ZWdlclR5cGUsIGluIHdoaWNoIHRoZSBCeXRlQnVmZmVyIHdpbGwgY29udGFpbiBhIERlY2ltYWxUeXBlLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBCeXRlQnVmZmVyIGV4cChCeXRlQnVmZmVyIGlucHV0KTsKKworICAgIC8qKgorICAgICAqIFRha2VzIHRoZSBuYXR1cmFsIGxvZ3JpdGhtIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgYXJndW1lbnQgdG8gdGFrZSB0aGUgbmF0dXJhbCBsb2cgKGxuKSBvZgorICAgICAqIEByZXR1cm4gYSBCeXRlQnVmZmVyIGNvbnRhaW5nIHRoZSBsb2cgYmFzZSBlIChsbikgb2YgdGhlIGFyZ3VtZW50LiBUaGUgdHlwZSBvZiB0aGUgY29udGVudHMgb2YgdGhlIEJ5dGVCdWZmZXIKKyAgICAgKiB3aWxsIGJlIGEgZG91YmxlLCB1bmxlc3MgdGhlIGlucHV0IGlzIGEgRGVjaW1hbFR5cGUgb3IgSW50ZWdlclR5cGUsIGluIHdoaWNoIHRoZSBCeXRlQnVmZmVyIHdpbGwgY29udGFpbiBhCisgICAgICogRGVjaW1hbFR5cGUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEJ5dGVCdWZmZXIgbG9nKEJ5dGVCdWZmZXIgaW5wdXQpOworCisgICAgLyoqCisgICAgICogVGFrZXMgdGhlIGxvZyBiYXNlIDEwIG9mIHRoZSBhcmd1ZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIGFyZ3VtZW50IHRvIHRha2UgdGhlIGxvZyBiYXNlIHRlbiBvZgorICAgICAqIEByZXR1cm4gYSBCeXRlQnVmZmVyIGNvbnRhaW5nIHRoZSBsb2cgYmFzZSAxMCBvZiB0aGUgYXJndW1lbnQuIFRoZSB0eXBlIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgQnl0ZUJ1ZmZlcgorICAgICAqIHdpbGwgYmUgYSBkb3VibGUsIHVubGVzcyB0aGUgaW5wdXQgaXMgYSBEZWNpbWFsVHlwZSBvciBJbnRlZ2VyVHlwZSwgaW4gd2hpY2ggdGhlIEJ5dGVCdWZmZXIgd2lsbCBjb250YWluIGEKKyAgICAgKiBEZWNpbWFsVHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQnl0ZUJ1ZmZlciBsb2cxMChCeXRlQnVmZmVyIGlucHV0KTsKKworICAgIC8qKgorICAgICAqIFJvdW5kcyB0aGUgYXJndW1lbnQgdG8gdGhlIG5lYXJlc3Qgd2hvbGUgbnVtYmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0IHRoZSBhcmd1bWVudCB0byByb3VuZAorICAgICAqIEByZXR1cm4gYSBCeXRlQnVmZmVyIGNvbnRhaW5nIHRoZSByb3VuZGVkIGFyZ3VtZW50LiBJZiB0aGUgaW5wdXQgaXMgYW4gaW50ZWdyYWwgdHlwZSwgdGhlIEJ5dGVCdWZmZXIgd2lsbCBjb250YWluCisgICAgICogYSBjb3B5IG9mIHRoZSBpbnB1dC4gSWYgdGhlIGlucHV0IGlzIGEgZmxvYXQsIHRoZSBCeXRlQnVmZmVyIHdpbGwgY29udGFpbiBhbiBpbnQzMi4gSWYgdGhlIGlucHV0IGlzIGEgZG91YmxlLCB0aGUKKyAgICAgKiBvdXRwdXQgd2lsbCBjb250YWluIGEgbG9uZy4gSWYgdGhlIGlucHV0IGlzIGEgRGVjaW1hbFR5cGUsIHRoZSBvdXRwdXQgd2lsbCBjb250YWluIGFuIEludGVnZXJUeXBlLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBCeXRlQnVmZmVyIHJvdW5kKEJ5dGVCdWZmZXIgaW5wdXQpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9QYXJ0aXRpb25lckRlZmluZWRPcmRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9QYXJ0aXRpb25lckRlZmluZWRPcmRlci5qYXZhCmluZGV4IDg5MjQxYjQuLjFhZDFhZWEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvUGFydGl0aW9uZXJEZWZpbmVkT3JkZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1BhcnRpdGlvbmVyRGVmaW5lZE9yZGVyLmphdmEKQEAgLTIyLDExICsyMiwxNSBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlRlcm07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlBhcnRpdGlvblBvc2l0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLlR5cGVTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLk1hcnNoYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlLlZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIAogLyoqIGZvciBzb3J0aW5nIGNvbHVtbnMgcmVwcmVzZW50aW5nIHJvdyBrZXlzIGluIHRoZSByb3cgb3JkZXJpbmcgYXMgZGV0ZXJtaW5lZCBieSBhIHBhcnRpdGlvbmVyLgpAQCAtOTQsNiArOTgsMzMgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhLCBWZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICAvLyBQYXJ0aXRpb25lcnMgd29yayB3aXRoIEJ5dGVCdWZmZXJzIG9ubHkuCisgICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLmNvbnZlcnQoZGF0YSwgYWNjZXNzb3IpOworICAgICAgICBpZiAodmVyc2lvbiAhPSBWZXJzaW9uLkxFR0FDWSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRm9yIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24uT1NTNTAgYW5kIGFib3ZlIHdlIGVuY29kZSBhbiBlbXB0eSBrZXkgd2l0aCBhIG51bGwgYnl0ZSBzb3VyY2UuIFRoaXMKKyAgICAgICAgICAgIC8vIHdheSB3ZSBhdm9pZCB0aGUgbmVlZCB0byBzcGVjaWFsLWhhbmRsZSBhIHNlbnRpbmVsIHZhbHVlIHdoZW4gd2UgZGVjb2RlIHRoZSBieXRlIHNvdXJjZSBmb3Igc3VjaCBhIGtleQorICAgICAgICAgICAgLy8gKGUuZy4gZm9yIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24uTGVnYWN5IHdlIHVzZSB0aGUgbWluaW11bSBrZXkgYm91bmQgb2YgdGhlIHBhcnRpdGlvbmVyJ3MgbWluaW11bSB0b2tlbiBhcworICAgICAgICAgICAgLy8gYSBzZW50aW5lbCB2YWx1ZSwgYW5kIHRoYXQgcmVzdWx0cyBpbiB0aGUgbmVlZCB0byBnbyB0d2ljZSB0aHJvdWdoIHRoZSBieXRlIHNvdXJjZSB0aGF0IGlzIGJlaW5nCisgICAgICAgICAgICAvLyBkZWNvZGVkKS4KKyAgICAgICAgICAgIHJldHVybiBidWYuaGFzUmVtYWluaW5nKCkgPyBwYXJ0aXRpb25lci5kZWNvcmF0ZUtleShidWYpLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pIDogbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUGFydGl0aW9uUG9zaXRpb24uRm9yS2V5LmdldChidWYsIHBhcnRpdGlvbmVyKS5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IFYgZnJvbUNvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHZlcnNpb24gIT0gVmVyc2lvbi5MRUdBQ1k7CisgICAgICAgIGlmIChjb21wYXJhYmxlQnl0ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBhY2Nlc3Nvci5lbXB0eSgpOworICAgICAgICBieXRlW10ga2V5Qnl0ZXMgPSBEZWNvcmF0ZWRLZXkua2V5RnJvbUJ5dGVTb3VyY2UoY29tcGFyYWJsZUJ5dGVzLCB2ZXJzaW9uLCBwYXJ0aXRpb25lcik7CisgICAgICAgIHJldHVybiBhY2Nlc3Nvci52YWx1ZU9mKGtleUJ5dGVzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShCeXRlQnVmZmVyIGJ5dGVzKSB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiWW91IHNob3VsZG4ndCBiZSB2YWxpZGF0aW5nIHRoaXMuIik7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1JldmVyc2VkVHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9SZXZlcnNlZFR5cGUuamF2YQppbmRleCBjZWVhODRhLi4wNzk4MzZkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1JldmVyc2VkVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvUmV2ZXJzZWRUeXBlLmphdmEKQEAgLTI4LDYgKzI4LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5NYXJzaGFsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLlR5cGVTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKIAogcHVibGljIGNsYXNzIFJldmVyc2VkVHlwZTxUPiBleHRlbmRzIEFic3RyYWN0VHlwZTxUPgogewpAQCAtNjMsNiArNjUsMzIgQEAKICAgICAgICAgcmV0dXJuIGJhc2VUeXBlLmlzRW1wdHlWYWx1ZU1lYW5pbmdsZXNzKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgQnl0ZVNvdXJjZSBzcmMgPSBiYXNlVHlwZS5hc0NvbXBhcmFibGVCeXRlcyhhY2Nlc3NvciwgZGF0YSwgdmVyc2lvbik7CisgICAgICAgIGlmIChzcmMgPT0gbnVsbCkgICAgLy8gTm90ZTogdGhpcyB3aWxsIG9ubHkgY29tcGFyZSBjb3JyZWN0bHkgaWYgdXNlZCB3aXRoaW4gYSBzZXF1ZW5jZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIC8vIEludmVydCBhbGwgYnl0ZXMuCisgICAgICAgIC8vIFRoZSBjb21wYXJpc29uIHJlcXVpcmVtZW50cyBmb3IgdGhlIG9yaWdpbmFsIHR5cGUgZW5zdXJlIHRoYXQgdGhpcyBlbmNvZGluZyB3aWxsIGNvbXBhcmUgY29ycmVjdGx5IHdpdGgKKyAgICAgICAgLy8gcmVzcGVjdCB0byB0aGUgcmV2ZXJzZWQgY29tcGFyYXRvciBmdW5jdGlvbiAoYW5kLCBzcGVjaWZpY2FsbHksIHByZWZpeGVzIG9mIGVzY2FwZWQgYnl0ZS1vcmRlcmVkIHR5cGVzIHdpbGwKKyAgICAgICAgLy8gY29tcGFyZSBhcyBsYXJnZXIpLiBBZGRpdGlvbmFsbHksIHRoZSB3ZWFrIHByZWZpeC1mcmVlZG9tIHJlcXVpcmVtZW50IGVuc3VyZXMgdGhpcyBlbmNvZGluZyB3aWxsIGFsc28gYmUKKyAgICAgICAgLy8gd2Vha2x5IHByZWZpeC1mcmVlLgorICAgICAgICByZXR1cm4gKCkgLT4KKyAgICAgICAgeworICAgICAgICAgICAgaW50IHYgPSBzcmMubmV4dCgpOworICAgICAgICAgICAgaWYgKHYgPT0gQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICAgICAgcmV0dXJuIHYgXiAweEZGOworICAgICAgICB9OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gViBmcm9tQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gYmFzZVR5cGUuZnJvbUNvbXBhcmFibGVCeXRlcyhhY2Nlc3NvciwgUmV2ZXJzZWRQZWVrYWJsZUJ5dGVTb3VyY2Uub2YoY29tcGFyYWJsZUJ5dGVzKSwgdmVyc2lvbik7CisgICAgfQorCiAgICAgcHVibGljIDxWTCwgVlI+IGludCBjb21wYXJlQ3VzdG9tKFZMIGxlZnQsIFZhbHVlQWNjZXNzb3I8Vkw+IGFjY2Vzc29yTCwgVlIgcmlnaHQsIFZhbHVlQWNjZXNzb3I8VlI+IGFjY2Vzc29yUikKICAgICB7CiAgICAgICAgIHJldHVybiBiYXNlVHlwZS5jb21wYXJlKHJpZ2h0LCBhY2Nlc3NvclIsIGxlZnQsIGFjY2Vzc29yTCk7CkBAIC0xNTYsNCArMTg0LDQ0IEBACiAgICAgewogICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiKCIgKyBiYXNlVHlwZSArICIpIjsKICAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXZlcnNlZFBlZWthYmxlQnl0ZVNvdXJjZSBleHRlbmRzIEJ5dGVTb3VyY2UuUGVla2FibGUKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnl0ZVNvdXJjZS5QZWVrYWJsZSBvcmlnaW5hbDsKKworICAgICAgICBzdGF0aWMgQnl0ZVNvdXJjZS5QZWVrYWJsZSBvZihCeXRlU291cmNlLlBlZWthYmxlIG9yaWdpbmFsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwgIT0gbnVsbCA/IG5ldyBSZXZlcnNlZFBlZWthYmxlQnl0ZVNvdXJjZShvcmlnaW5hbCkgOiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBSZXZlcnNlZFBlZWthYmxlQnl0ZVNvdXJjZShCeXRlU291cmNlLlBlZWthYmxlIG9yaWdpbmFsKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihudWxsKTsKKyAgICAgICAgICAgIHRoaXMub3JpZ2luYWwgPSBvcmlnaW5hbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IG5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdiA9IG9yaWdpbmFsLm5leHQoKTsKKyAgICAgICAgICAgIGlmICh2ICE9IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgcmV0dXJuIHYgXiAweEZGOworICAgICAgICAgICAgcmV0dXJuIEVORF9PRl9TVFJFQU07CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBwZWVrKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHYgPSBvcmlnaW5hbC5wZWVrKCk7CisgICAgICAgICAgICBpZiAodiAhPSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybiB2IF4gMHhGRjsKKyAgICAgICAgICAgIHJldHVybiBFTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0TWFza2VkVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJhc2VUeXBlLmdldE1hc2tlZFZhbHVlKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9TZXRUeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1NldFR5cGUuamF2YQppbmRleCBlNWJkYWRhLi4xYmIxZWQ1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1NldFR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1NldFR5cGUuamF2YQpAQCAtMjAsOCArMjAsOCBAQAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLio7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Kc29uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuU2V0czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlRlcm07CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsOwpAQCAtMzAsNiArMzAsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLk1hcnNoYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuU2V0U2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpzb25VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOwogCiBwdWJsaWMgY2xhc3MgU2V0VHlwZTxUPiBleHRlbmRzIENvbGxlY3Rpb25UeXBlPFNldDxUPj4KIHsKQEAgLTE0Miw3ICsxNDUsNyBAQAogICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGF0aWJsZVdpdGhGcm96ZW4oQ29sbGVjdGlvblR5cGU8Pz4gcHJldmlvdXMpCiAgICAgewogICAgICAgICBhc3NlcnQgIWlzTXVsdGlDZWxsOwotICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5pc0NvbXBhdGlibGVXaXRoKCgoU2V0VHlwZSkgcHJldmlvdXMpLmVsZW1lbnRzKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHMuaXNDb21wYXRpYmxlV2l0aCgoKFNldFR5cGU8Pz4pIHByZXZpb3VzKS5lbGVtZW50cyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNTQsNyArMTU3LDE5IEBACiAKICAgICBwdWJsaWMgPFZMLCBWUj4gaW50IGNvbXBhcmVDdXN0b20oVkwgbGVmdCwgVmFsdWVBY2Nlc3NvcjxWTD4gYWNjZXNzb3JMLCBWUiByaWdodCwgVmFsdWVBY2Nlc3NvcjxWUj4gYWNjZXNzb3JSKQogICAgIHsKLSAgICAgICAgcmV0dXJuIExpc3RUeXBlLmNvbXBhcmVMaXN0T3JTZXQoZWxlbWVudHMsIGxlZnQsIGFjY2Vzc29yTCwgcmlnaHQsIGFjY2Vzc29yUik7CisgICAgICAgIHJldHVybiBjb21wYXJlTGlzdE9yU2V0KGVsZW1lbnRzLCBsZWZ0LCBhY2Nlc3NvckwsIHJpZ2h0LCBhY2Nlc3NvclIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBWIGRhdGEsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBhc0NvbXBhcmFibGVCeXRlc0xpc3RPclNldChnZXRFbGVtZW50c1R5cGUoKSwgYWNjZXNzb3IsIGRhdGEsIHZlcnNpb24pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gViBmcm9tQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gZnJvbUNvbXBhcmFibGVCeXRlc0xpc3RPclNldChhY2Nlc3NvciwgY29tcGFyYWJsZUJ5dGVzLCB2ZXJzaW9uLCBnZXRFbGVtZW50c1R5cGUoKSk7CiAgICAgfQogCiAgICAgcHVibGljIFNldFNlcmlhbGl6ZXI8VD4gZ2V0U2VyaWFsaXplcigpCkBAIC0xNzksNyArMTk0LDcgQEAKIAogICAgIHB1YmxpYyBMaXN0PEJ5dGVCdWZmZXI+IHNlcmlhbGl6ZWRWYWx1ZXMoSXRlcmF0b3I8Q2VsbDw/Pj4gY2VsbHMpCiAgICAgewotICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IGJicyA9IG5ldyBBcnJheUxpc3Q8Qnl0ZUJ1ZmZlcj4oKTsKKyAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBiYnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgd2hpbGUgKGNlbGxzLmhhc05leHQoKSkKICAgICAgICAgICAgIGJicy5hZGQoY2VsbHMubmV4dCgpLnBhdGgoKS5nZXQoMCkpOwogICAgICAgICByZXR1cm4gYmJzOwpAQCAtMTg5LDEzICsyMDQsMTMgQEAKICAgICBwdWJsaWMgVGVybSBmcm9tSlNPTk9iamVjdChPYmplY3QgcGFyc2VkKSB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgaWYgKHBhcnNlZCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgICAgIHBhcnNlZCA9IEpzb24uZGVjb2RlSnNvbigoU3RyaW5nKSBwYXJzZWQpOworICAgICAgICAgICAgcGFyc2VkID0gSnNvblV0aWxzLmRlY29kZUpzb24oKFN0cmluZykgcGFyc2VkKTsKIAogICAgICAgICBpZiAoIShwYXJzZWQgaW5zdGFuY2VvZiBMaXN0KSkKICAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBhIGxpc3QgKHJlcHJlc2VudGluZyBhIHNldCksIGJ1dCBnb3QgYSAlczogJXMiLCBwYXJzZWQuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCksIHBhcnNlZCkpOwogCi0gICAgICAgIExpc3QgbGlzdCA9IChMaXN0KSBwYXJzZWQ7CisgICAgICAgIExpc3Q8Pz4gbGlzdCA9IChMaXN0PD8+KSBwYXJzZWQ7CiAgICAgICAgIFNldDxUZXJtPiB0ZXJtcyA9IG5ldyBIYXNoU2V0PD4obGlzdC5zaXplKCkpOwogICAgICAgICBmb3IgKE9iamVjdCBlbGVtZW50IDogbGlzdCkKICAgICAgICAgewpAQCAtMjEwLDYgKzIyNSwxOCBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9KU09OU3RyaW5nKEJ5dGVCdWZmZXIgYnVmZmVyLCBQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKQogICAgIHsKLSAgICAgICAgcmV0dXJuIExpc3RUeXBlLnNldE9yTGlzdFRvSnNvblN0cmluZyhidWZmZXIsIGVsZW1lbnRzLCBwcm90b2NvbFZlcnNpb24pOworICAgICAgICByZXR1cm4gc2V0T3JMaXN0VG9Kc29uU3RyaW5nKGJ1ZmZlciwgZWxlbWVudHMsIHByb3RvY29sVmVyc2lvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZm9yRWFjaChCeXRlQnVmZmVyIGlucHV0LCBDb25zdW1lcjxCeXRlQnVmZmVyPiBhY3Rpb24pCisgICAgeworICAgICAgICBzZXJpYWxpemVyLmZvckVhY2goaW5wdXQsIGFjdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0TWFza2VkVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlY29tcG9zZShDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1Nob3J0VHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9TaG9ydFR5cGUuamF2YQppbmRleCAwM2RjZjVkLi4yNGQ4ZTkyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1Nob3J0VHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvU2hvcnRUeXBlLmphdmEKQEAgLTI4LDExICsyOCwxNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLlR5cGVTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlSW52ZXJzZTsKIAogcHVibGljIGNsYXNzIFNob3J0VHlwZSBleHRlbmRzIE51bWJlclR5cGU8U2hvcnQ+CiB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTaG9ydFR5cGUgaW5zdGFuY2UgPSBuZXcgU2hvcnRUeXBlKCk7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIE1BU0tFRF9WQUxVRSA9IGluc3RhbmNlLmRlY29tcG9zZSgoc2hvcnQpIDApOworCiAgICAgU2hvcnRUeXBlKCkKICAgICB7CiAgICAgICAgIHN1cGVyKENvbXBhcmlzb25UeXBlLkNVU1RPTSk7CkBAIC00Niw2ICs1MSwxOSBAQAogICAgICAgICByZXR1cm4gVmFsdWVBY2Nlc3Nvci5jb21wYXJlKGxlZnQsIGFjY2Vzc29yTCwgcmlnaHQsIGFjY2Vzc29yUik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgLy8gVGhpcyB0eXBlIGRvZXMgbm90IGFsbG93IG5vbi1wcmVzZW50IHZhbHVlcywgYnV0IHdlIGRvIGp1c3QgdG8gYXZvaWQgZnV0dXJlIGNvbXBsZXhpdHkuCisgICAgICAgIHJldHVybiBCeXRlU291cmNlLm9wdGlvbmFsU2lnbmVkRml4ZWRMZW5ndGhOdW1iZXIoYWNjZXNzb3IsIGRhdGEpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gViBmcm9tQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZUludmVyc2UuZ2V0T3B0aW9uYWxTaWduZWRGaXhlZExlbmd0aChhY2Nlc3NvciwgY29tcGFyYWJsZUJ5dGVzLCAyKTsKKyAgICB9CisKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBmcm9tU3RyaW5nKFN0cmluZyBzb3VyY2UpIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uCiAgICAgewogICAgICAgICAvLyBSZXR1cm4gYW4gZW1wdHkgQnl0ZUJ1ZmZlciBmb3IgYW4gZW1wdHkgc3RyaW5nLgpAQCAtMTM0LDQgKzE1Miw0MCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKChzaG9ydCkgLXRvU2hvcnQoaW5wdXQpKTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBhYnMoQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcygoc2hvcnQpIE1hdGguYWJzKHRvU2hvcnQoaW5wdXQpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhwKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoKHNob3J0KSBNYXRoLmV4cCh0b1Nob3J0KGlucHV0KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGxvZyhCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKChzaG9ydCkgTWF0aC5sb2codG9TaG9ydChpbnB1dCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBsb2cxMChCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKChzaG9ydCkgTWF0aC5sb2cxMCh0b1Nob3J0KGlucHV0KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIHJvdW5kKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuY2xvbmUoaW5wdXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE1hc2tlZFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBNQVNLRURfVkFMVUU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9TaW1wbGVEYXRlVHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9TaW1wbGVEYXRlVHlwZS5qYXZhCmluZGV4IDhmMWQ2NzcuLmE0NzRkMzkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvU2ltcGxlRGF0ZVR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1NpbXBsZURhdGVUeXBlLmphdmEKQEAgLTI4LDYgKzI4LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuVHlwZVNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZS5WZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZUludmVyc2U7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLlJlcXVlc3RWYWxpZGF0aW9ucy5pbnZhbGlkUmVxdWVzdDsKIApAQCAtMzUsOCArMzksMjQgQEAKIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZURhdGVUeXBlIGluc3RhbmNlID0gbmV3IFNpbXBsZURhdGVUeXBlKCk7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIE1BU0tFRF9WQUxVRSA9IGluc3RhbmNlLmRlY29tcG9zZShTaW1wbGVEYXRlU2VyaWFsaXplci50aW1lSW5NaWxsaXNUb0RheSgwKSk7CisKICAgICBTaW1wbGVEYXRlVHlwZSgpIHtzdXBlcihDb21wYXJpc29uVHlwZS5CWVRFX09SREVSKTt9IC8vIHNpbmdsZXRvbgogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSwgVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgLy8gV2hpbGUgQllURV9PUkRFUiB3b3VsZCBzdGlsbCB3b3JrIGZvciB0aGlzIHR5cGUsIG1ha2luZyB1c2Ugb2YgdGhlIGZpeGVkIGxlbmd0aCBpcyBtb3JlIGVmZmljaWVudC4KKyAgICAgICAgLy8gVGhpcyB0eXBlIGRvZXMgbm90IGFsbG93IG5vbi1wcmVzZW50IHZhbHVlcywgYnV0IHdlIGRvIGp1c3QgdG8gYXZvaWQgZnV0dXJlIGNvbXBsZXhpdHkuCisgICAgICAgIHJldHVybiBCeXRlU291cmNlLm9wdGlvbmFsRml4ZWRMZW5ndGgoYWNjZXNzb3IsIGRhdGEpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gViBmcm9tQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZUludmVyc2UuZ2V0T3B0aW9uYWxGaXhlZExlbmd0aChhY2Nlc3NvciwgY29tcGFyYWJsZUJ5dGVzLCA0KTsKKyAgICB9CisKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBmcm9tU3RyaW5nKFN0cmluZyBzb3VyY2UpIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uCiAgICAgewogICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoU2ltcGxlRGF0ZVNlcmlhbGl6ZXIuZGF0ZVN0cmluZ1RvRGF5cyhzb3VyY2UpKTsKQEAgLTk4LDQgKzExOCwxMCBAQAogICAgICAgICBpZiAoIWR1cmF0aW9uLmhhc0RheVByZWNpc2lvbigpKQogICAgICAgICAgICAgdGhyb3cgaW52YWxpZFJlcXVlc3QoIlRoZSBkdXJhdGlvbiBtdXN0IGhhdmUgYSBkYXkgcHJlY2lzaW9uLiBXYXM6ICVzIiwgZHVyYXRpb24pOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE1hc2tlZFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBNQVNLRURfVkFMVUU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9UaW1lVHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9UaW1lVHlwZS5qYXZhCmluZGV4IGZkOGZhYzQuLmQ3NTAwOTUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvVGltZVR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1RpbWVUeXBlLmphdmEKQEAgLTI4LDYgKzI4LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuVHlwZVNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlLlZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlSW52ZXJzZTsKIAogLyoqCiAgKiBOYW5vc2Vjb25kIHJlc29sdXRpb24gdGltZSB2YWx1ZXMKQEAgLTM1LDYgKzM5LDggQEAKIHB1YmxpYyBjbGFzcyBUaW1lVHlwZSBleHRlbmRzIFRlbXBvcmFsVHlwZTxMb25nPgogewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVGltZVR5cGUgaW5zdGFuY2UgPSBuZXcgVGltZVR5cGUoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgREVGQVVMVF9NQVNLRURfVkFMVUUgPSBpbnN0YW5jZS5kZWNvbXBvc2UoMEwpOwogICAgIHByaXZhdGUgVGltZVR5cGUoKSB7c3VwZXIoQ29tcGFyaXNvblR5cGUuQllURV9PUkRFUik7fSAvLyBzaW5nbGV0b24KIAogICAgIHB1YmxpYyBCeXRlQnVmZmVyIGZyb21TdHJpbmcoU3RyaW5nIHNvdXJjZSkgdGhyb3dzIE1hcnNoYWxFeGNlcHRpb24KQEAgLTQzLDYgKzQ5LDIwIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSwgVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgLy8gV2hpbGUgQllURV9PUkRFUiB3b3VsZCBzdGlsbCB3b3JrIGZvciB0aGlzIHR5cGUsIG1ha2luZyB1c2Ugb2YgdGhlIGZpeGVkIGxlbmd0aCBpcyBtb3JlIGVmZmljaWVudC4KKyAgICAgICAgLy8gVGhpcyB0eXBlIGRvZXMgbm90IGFsbG93IG5vbi1wcmVzZW50IHZhbHVlcywgYnV0IHdlIGRvIGp1c3QgdG8gYXZvaWQgZnV0dXJlIGNvbXBsZXhpdHkuCisgICAgICAgIHJldHVybiBCeXRlU291cmNlLm9wdGlvbmFsRml4ZWRMZW5ndGgoYWNjZXNzb3IsIGRhdGEpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gViBmcm9tQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZUludmVyc2UuZ2V0T3B0aW9uYWxGaXhlZExlbmd0aChhY2Nlc3NvciwgY29tcGFyYWJsZUJ5dGVzLCA4KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbHVlQ29tcGF0aWJsZVdpdGhJbnRlcm5hbChBYnN0cmFjdFR5cGU8Pz4gb3RoZXJUeXBlKQogICAgIHsKICAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXJUeXBlIHx8IG90aGVyVHlwZSA9PSBMb25nVHlwZS5pbnN0YW5jZTsKQEAgLTgzLDQgKzEwMywxMCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIGRlY29tcG9zZShMb2NhbFRpbWUubm93KFpvbmVPZmZzZXQuVVRDKS50b05hbm9PZkRheSgpKTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRNYXNrZWRWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gREVGQVVMVF9NQVNLRURfVkFMVUU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9UaW1lVVVJRFR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvVGltZVVVSURUeXBlLmphdmEKaW5kZXggZDNiMGRlYy4uNDBlNTk1NiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9UaW1lVVVJRFR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1RpbWVVVUlEVHlwZS5qYXZhCkBAIC0xNyw2ICsxNyw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbDsKIAoraW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5UeXBlU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKIApAQCAtMjUsNiArMjcsOCBAQAogewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVGltZVVVSURUeXBlIGluc3RhbmNlID0gbmV3IFRpbWVVVUlEVHlwZSgpOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlciBNQVNLRURfVkFMVUUgPSBpbnN0YW5jZS5kZWNvbXBvc2UoVGltZVVVSUQubWluQXRVbml4TWlsbGlzKDApKTsKKwogICAgIHB1YmxpYyBUeXBlU2VyaWFsaXplcjxUaW1lVVVJRD4gZ2V0U2VyaWFsaXplcigpCiAgICAgewogICAgICAgICByZXR1cm4gVGltZVVVSUQuU2VyaWFsaXplci5pbnN0YW5jZTsKQEAgLTM1LDQgKzM5LDEwIEBACiAgICAgewogICAgICAgICByZXR1cm4gTGVnYWN5VGltZVVVSURUeXBlLmluc3RhbmNlOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE1hc2tlZFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBNQVNLRURfVkFMVUU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9UaW1lc3RhbXBUeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1RpbWVzdGFtcFR5cGUuamF2YQppbmRleCBjY2YxZGEzLi42Nzk3Njc2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1RpbWVzdGFtcFR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1RpbWVzdGFtcFR5cGUuamF2YQpAQCAtMzIsNiArMzIsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLlRpbWVzdGFtcFNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2VJbnZlcnNlOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc3RhdGVtZW50cy5SZXF1ZXN0VmFsaWRhdGlvbnMuaW52YWxpZFJlcXVlc3Q7CiAKQEAgLTQ4LDYgKzUxLDggQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVGltZXN0YW1wVHlwZSBpbnN0YW5jZSA9IG5ldyBUaW1lc3RhbXBUeXBlKCk7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIE1BU0tFRF9WQUxVRSA9IGluc3RhbmNlLmRlY29tcG9zZShuZXcgRGF0ZSgwKSk7CisKICAgICBwcml2YXRlIFRpbWVzdGFtcFR5cGUoKSB7c3VwZXIoQ29tcGFyaXNvblR5cGUuQ1VTVE9NKTt9IC8vIHNpbmdsZXRvbgogCiAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eVZhbHVlTWVhbmluZ2xlc3MoKQpAQCAtNjAsNiArNjUsMTggQEAKICAgICAgICAgcmV0dXJuIExvbmdUeXBlLmNvbXBhcmVMb25ncyhsZWZ0LCBhY2Nlc3NvckwsIHJpZ2h0LCBhY2Nlc3NvclIpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBWIGRhdGEsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlU291cmNlLm9wdGlvbmFsU2lnbmVkRml4ZWRMZW5ndGhOdW1iZXIoYWNjZXNzb3IsIGRhdGEpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gViBmcm9tQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZUludmVyc2UuZ2V0T3B0aW9uYWxTaWduZWRGaXhlZExlbmd0aChhY2Nlc3NvciwgY29tcGFyYWJsZUJ5dGVzLCA4KTsKKyAgICB9CisKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBmcm9tU3RyaW5nKFN0cmluZyBzb3VyY2UpIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uCiAgICAgewogICAgICAgLy8gUmV0dXJuIGFuIGVtcHR5IEJ5dGVCdWZmZXIgZm9yIGFuIGVtcHR5IHN0cmluZy4KQEAgLTE1NSw0ICsxNzIsMTAgQEAKICAgICAgICAgaWYgKCFkdXJhdGlvbi5oYXNNaWxsaXNlY29uZFByZWNpc2lvbigpKQogICAgICAgICAgICAgdGhyb3cgaW52YWxpZFJlcXVlc3QoIlRoZSBkdXJhdGlvbiBtdXN0IGhhdmUgYSBtaWxsaXNlY29uZCBwcmVjaXNpb24uIFdhczogJXMiLCBkdXJhdGlvbik7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0TWFza2VkVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1BU0tFRF9WQUxVRTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1R1cGxlVHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9UdXBsZVR5cGUuamF2YQppbmRleCBjYzA4NDg3Li43OWY5MjE5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1R1cGxlVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvVHVwbGVUeXBlLmphdmEKQEAgLTMwLDExICszMCwxMyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5UeXBlU2l6ZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5TeW50YXhFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpzb25VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2VJbnZlcnNlOwogCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLmFueTsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXMudHJhbnNmb3JtOwpAQCAtMjAwLDQ3ICsyMDIsMTM2IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFNwbGl0IGEgdHVwbGUgdmFsdWUgaW50byBpdHMgY29tcG9uZW50IHZhbHVlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnl0ZUJ1ZmZlcltdIHNwbGl0KEJ5dGVCdWZmZXIgdmFsdWUpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQogICAgIHsKLSAgICAgICAgcmV0dXJuIHNwbGl0KHZhbHVlLCBzaXplKCksIHRoaXMpOworICAgICAgICBzd2l0Y2ggKHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgTEVHQUNZOgorICAgICAgICAgICAgICAgIHJldHVybiBhc0NvbXBhcmFibGVCeXRlc0xlZ2FjeShhY2Nlc3NvciwgZGF0YSk7CisgICAgICAgICAgICBjYXNlIE9TUzUwOgorICAgICAgICAgICAgICAgIHJldHVybiBhc0NvbXBhcmFibGVCeXRlc05ldyhhY2Nlc3NvciwgZGF0YSwgdmVyc2lvbik7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSA8Vj4gQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlc0xlZ2FjeShWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBWIGRhdGEpCisgICAgeworICAgICAgICBpZiAoYWNjZXNzb3IuaXNFbXB0eShkYXRhKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFZbXSBidWZzID0gc3BsaXQoYWNjZXNzb3IsIGRhdGEpOyAgLy8gdGhpcyBtYXkgYmUgc2hvcnRlciB0aGFuIHR5cGVzLnNpemUgLS0gb3RoZXIgc3JjcyByZW1haW4gbnVsbCBpbiB0aGF0IGNhc2UKKyAgICAgICAgQnl0ZVNvdXJjZVtdIHNyY3MgPSBuZXcgQnl0ZVNvdXJjZVt0eXBlcy5zaXplKCldOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1ZnMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICBzcmNzW2ldID0gYnVmc1tpXSAhPSBudWxsID8gdHlwZXMuZ2V0KGkpLmFzQ29tcGFyYWJsZUJ5dGVzKGFjY2Vzc29yLCBidWZzW2ldLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLkxFR0FDWSkgOiBudWxsOworCisgICAgICAgIC8vIFdlIGFsd2F5cyBoYXZlIGEgZml4ZWQgbnVtYmVyIG9mIHNvdXJjZXMsIHdpdGggdGhlIHRyYWlsaW5nIG9uZXMgcG9zc2libHkgYmVpbmcgbnVsbHMuCisgICAgICAgIC8vIFRoaXMgY2FuIG9ubHkgcmVzdWx0IGluIGEgcHJlZml4IGlmIHRoZSBsYXN0IHR5cGUgaW4gdGhlIHR1cGxlIGFsbG93cyBwcmVmaXhlcy4gU2luY2UgdGhhdCB0eXBlIGlzIHJlcXVpcmVkCisgICAgICAgIC8vIHRvIGJlIHdlYWtseSBwcmVmaXgtZnJlZSwgc28gaXMgdGhlIHR1cGxlLgorICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvckxlZ2FjeShCeXRlU291cmNlLkVORF9PRl9TVFJFQU0sIHNyY3MpOworICAgIH0KKworICAgIHByaXZhdGUgPFY+IEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXNOZXcoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICBpZiAoYWNjZXNzb3IuaXNFbXB0eShkYXRhKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFZbXSBidWZzID0gc3BsaXQoYWNjZXNzb3IsIGRhdGEpOworICAgICAgICBpbnQgbGVuZ3RoV2l0aG91dFRyYWlsaW5nTnVsbHMgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1ZnMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICBpZiAoYnVmc1tpXSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGxlbmd0aFdpdGhvdXRUcmFpbGluZ051bGxzID0gaSArIDE7CisKKyAgICAgICAgQnl0ZVNvdXJjZVtdIHNyY3MgPSBuZXcgQnl0ZVNvdXJjZVtsZW5ndGhXaXRob3V0VHJhaWxpbmdOdWxsc107CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoV2l0aG91dFRyYWlsaW5nTnVsbHM7ICsraSkKKyAgICAgICAgICAgIHNyY3NbaV0gPSBidWZzW2ldICE9IG51bGwgPyB0eXBlcy5nZXQoaSkuYXNDb21wYXJhYmxlQnl0ZXMoYWNjZXNzb3IsIGJ1ZnNbaV0sIHZlcnNpb24pIDogbnVsbDsKKworICAgICAgICAvLyBCZWNhdXNlIHdlIHN0b3AgZWFybHkgd2hlbiB0aGVyZSBhcmUgdHJhaWxpbmcgbnVsbHMsIHRoZXJlIG5lZWRzIHRvIGJlIGFuIGV4cGxpY2l0IHRlcm1pbmF0b3IgdG8gbWFrZSB0aGUKKyAgICAgICAgLy8gdHlwZSBwcmVmaXgtZnJlZS4KKyAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IoQnl0ZVNvdXJjZS5URVJNSU5BVE9SLCBzcmNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IFYgZnJvbUNvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHZlcnNpb24gPT0gQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5PU1M1MDsgLy8gUmV2ZXJzZSB0cmFuc2xhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgbGVnYWN5IHZlcnNpb24uCisgICAgICAgIGlmIChjb21wYXJhYmxlQnl0ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBhY2Nlc3Nvci5lbXB0eSgpOworCisgICAgICAgIFZbXSBjb21wb25lbnRCdWZmZXJzID0gYWNjZXNzb3IuY3JlYXRlQXJyYXkodHlwZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5zaXplKCk7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbXBhcmFibGVCeXRlcy5wZWVrKCkgPT0gQnl0ZVNvdXJjZS5URVJNSU5BVE9SKQorICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gdGhlIHJlc3Qgb2YgdGhlIGZpZWxkcyByZW1haW4gbnVsbAorICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IGNvbXBvbmVudFR5cGUgPSB0eXBlcy5nZXQoaSk7CisgICAgICAgICAgICBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBvbmVudCA9IEJ5dGVTb3VyY2VJbnZlcnNlLm5leHRDb21wb25lbnRTb3VyY2UoY29tcGFyYWJsZUJ5dGVzKTsKKyAgICAgICAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb21wb25lbnRCdWZmZXJzW2ldID0gY29tcG9uZW50VHlwZS5mcm9tQ29tcGFyYWJsZUJ5dGVzKGFjY2Vzc29yLCBjb21wb25lbnQsIHZlcnNpb24pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvbXBvbmVudEJ1ZmZlcnNbaV0gPSBudWxsOworICAgICAgICB9CisgICAgICAgIC8vIGNvbnN1bWUgdGVybWluYXRvcgorICAgICAgICBpbnQgdGVybWluYXRvciA9IGNvbXBhcmFibGVCeXRlcy5uZXh0KCk7CisgICAgICAgIGFzc2VydCB0ZXJtaW5hdG9yID09IEJ5dGVTb3VyY2UuVEVSTUlOQVRPUiA6IFN0cmluZy5mb3JtYXQoIkV4cGVjdGVkIFRFUk1JTkFUT1IgKDB4JTJ4KSBhZnRlciAlZCBjb21wb25lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU291cmNlLlRFUk1JTkFUT1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXMuc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIGJ1aWxkVmFsdWUoYWNjZXNzb3IsIGNvbXBvbmVudEJ1ZmZlcnMpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFNwbGl0IGEgdHVwbGUgdmFsdWUgaW50byBpdHMgY29tcG9uZW50IHZhbHVlcy4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXJbXSBzcGxpdChCeXRlQnVmZmVyIHZhbHVlLCBpbnQgbnVtYmVyT2ZFbGVtZW50cywgVHVwbGVUeXBlIHR5cGUpCisgICAgcHVibGljIDxWPiBWW10gc3BsaXQoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViB2YWx1ZSkKICAgICB7Ci0gICAgICAgIEJ5dGVCdWZmZXJbXSBjb21wb25lbnRzID0gbmV3IEJ5dGVCdWZmZXJbbnVtYmVyT2ZFbGVtZW50c107Ci0gICAgICAgIEJ5dGVCdWZmZXIgaW5wdXQgPSB2YWx1ZS5kdXBsaWNhdGUoKTsKKyAgICAgICAgcmV0dXJuIHNwbGl0KGFjY2Vzc29yLCB2YWx1ZSwgc2l6ZSgpLCB0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGxpdCBhIHR1cGxlIHZhbHVlIGludG8gaXRzIGNvbXBvbmVudCB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8Vj4gVltdIHNwbGl0KFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgdmFsdWUsIGludCBudW1iZXJPZkVsZW1lbnRzLCBUdXBsZVR5cGUgdHlwZSkKKyAgICB7CisgICAgICAgIFZbXSBjb21wb25lbnRzID0gYWNjZXNzb3IuY3JlYXRlQXJyYXkobnVtYmVyT2ZFbGVtZW50cyk7CisgICAgICAgIGludCBsZW5ndGggPSBhY2Nlc3Nvci5zaXplKHZhbHVlKTsKKyAgICAgICAgaW50IHBvc2l0aW9uID0gMDsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZkVsZW1lbnRzOyBpKyspCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICghaW5wdXQuaGFzUmVtYWluaW5nKCkpCisgICAgICAgICAgICBpZiAocG9zaXRpb24gPT0gbGVuZ3RoKQogICAgICAgICAgICAgICAgIHJldHVybiBBcnJheXMuY29weU9mUmFuZ2UoY29tcG9uZW50cywgMCwgaSk7CiAKLSAgICAgICAgICAgIGludCBzaXplID0gaW5wdXQuZ2V0SW50KCk7Ci0KLSAgICAgICAgICAgIGlmIChpbnB1dC5yZW1haW5pbmcoKSA8IHNpemUpCisgICAgICAgICAgICBpZiAocG9zaXRpb24gKyA0ID4gbGVuZ3RoKQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIk5vdCBlbm91Z2ggYnl0ZXMgdG8gcmVhZCAlZHRoIGNvbXBvbmVudCIsIGkpKTsKIAorICAgICAgICAgICAgaW50IHNpemUgPSBhY2Nlc3Nvci5nZXRJbnQodmFsdWUsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgIHBvc2l0aW9uICs9IDQ7CisKICAgICAgICAgICAgIC8vIHNpemUgPCAwIG1lYW5zIG51bGwgdmFsdWUKLSAgICAgICAgICAgIGNvbXBvbmVudHNbaV0gPSBzaXplIDwgMCA/IG51bGwgOiBCeXRlQnVmZmVyVXRpbC5yZWFkQnl0ZXMoaW5wdXQsIHNpemUpOworICAgICAgICAgICAgaWYgKHNpemUgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gKyBzaXplID4gbGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJOb3QgZW5vdWdoIGJ5dGVzIHRvIHJlYWQgJWR0aCBjb21wb25lbnQiLCBpKSk7CisKKyAgICAgICAgICAgICAgICBjb21wb25lbnRzW2ldID0gYWNjZXNzb3Iuc2xpY2UodmFsdWUsIHBvc2l0aW9uLCBzaXplKTsKKyAgICAgICAgICAgICAgICBwb3NpdGlvbiArPSBzaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbaV0gPSBudWxsOwogICAgICAgICB9CiAKICAgICAgICAgLy8gZXJyb3Igb3V0IGlmIHdlIGdvdCBtb3JlIHZhbHVlcyBpbiB0aGUgdHVwbGUvVURUIHRoYW4gd2UgZXhwZWN0ZWQKLSAgICAgICAgaWYgKGlucHV0Lmhhc1JlbWFpbmluZygpKQorICAgICAgICBpZiAocG9zaXRpb24gPCBsZW5ndGgpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgIkV4cGVjdGVkICVzICVzIGZvciAlcyBjb2x1bW4sIGJ1dCBnb3QgbW9yZSIsCi0gICAgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLCBudW1iZXJPZkVsZW1lbnRzID09IDEgPyAidmFsdWUiIDogInZhbHVlcyIsIHR5cGUuYXNDUUwzVHlwZSgpKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJFeHBlY3RlZCAlcyAlcyBmb3IgJXMgY29sdW1uLCBidXQgZ290IG1vcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLCBudW1iZXJPZkVsZW1lbnRzID09IDEgPyAidmFsdWUiIDogInZhbHVlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuYXNDUUwzVHlwZSgpKSk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gY29tcG9uZW50czsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIDxWPiBWIGJ1aWxkVmFsdWUoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgVltdIGNvbXBvbmVudHMpCisgICAgQFNhZmVWYXJhcmdzCisgICAgcHVibGljIHN0YXRpYyA8Vj4gViBidWlsZFZhbHVlKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYuLi4gY29tcG9uZW50cykKICAgICB7CiAgICAgICAgIGludCB0b3RhbExlbmd0aCA9IDA7CiAgICAgICAgIGZvciAoViBjb21wb25lbnQgOiBjb21wb25lbnRzKQpAQCAtMjY0LDcgKzM1NSw3IEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyIGJ1aWxkVmFsdWUoQnl0ZUJ1ZmZlcltdIGNvbXBvbmVudHMpCisgICAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyIGJ1aWxkVmFsdWUoQnl0ZUJ1ZmZlci4uLiBjb21wb25lbnRzKQogICAgIHsKICAgICAgICAgcmV0dXJuIGJ1aWxkVmFsdWUoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBjb21wb25lbnRzKTsKICAgICB9CkBAIC0zMzMsMTMgKzQyNCwxMyBAQAogICAgIHB1YmxpYyBUZXJtIGZyb21KU09OT2JqZWN0KE9iamVjdCBwYXJzZWQpIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uCiAgICAgewogICAgICAgICBpZiAocGFyc2VkIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgcGFyc2VkID0gSnNvbi5kZWNvZGVKc29uKChTdHJpbmcpIHBhcnNlZCk7CisgICAgICAgICAgICBwYXJzZWQgPSBKc29uVXRpbHMuZGVjb2RlSnNvbigoU3RyaW5nKSBwYXJzZWQpOwogCiAgICAgICAgIGlmICghKHBhcnNlZCBpbnN0YW5jZW9mIExpc3QpKQogICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGEgbGlzdCByZXByZXNlbnRhdGlvbiBvZiBhIHR1cGxlLCBidXQgZ290IGEgJXM6ICVzIiwgcGFyc2VkLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLCBwYXJzZWQpKTsKIAotICAgICAgICBMaXN0IGxpc3QgPSAoTGlzdCkgcGFyc2VkOworICAgICAgICBMaXN0PD8+IGxpc3QgPSAoTGlzdDw/PikgcGFyc2VkOwogCiAgICAgICAgIGlmIChsaXN0LnNpemUoKSA+IHR5cGVzLnNpemUoKSkKICAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlR1cGxlIGNvbnRhaW5zIGV4dHJhIGl0ZW1zIChleHBlY3RlZCAlcyk6ICVzIiwgdHlwZXMuc2l6ZSgpLCBwYXJzZWQpKTsKQEAgLTM3NSw4ICs0NjYsOCBAQAogICAgICAgICAgICAgaWYgKGkgPiAwKQogICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKIAotICAgICAgICAgICAgQnl0ZUJ1ZmZlciB2YWx1ZSA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRWYWx1ZShkdXBsaWNhdGVkLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIG9mZnNldCwgcHJvdG9jb2xWZXJzaW9uKTsKLSAgICAgICAgICAgIG9mZnNldCArPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZWYWx1ZSh2YWx1ZSwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBwcm90b2NvbFZlcnNpb24pOworICAgICAgICAgICAgQnl0ZUJ1ZmZlciB2YWx1ZSA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRWYWx1ZShkdXBsaWNhdGVkLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mVmFsdWUodmFsdWUsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSk7CiAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKICAgICAgICAgICAgIGVsc2UKQEAgLTQ1OSw0ICs1NTAsMTcgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArIFR5cGVQYXJzZXIuc3RyaW5naWZ5VHlwZVBhcmFtZXRlcnModHlwZXMsIHRydWUpOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE1hc2tlZFZhbHVlKCkKKyAgICB7CisgICAgICAgIEJ5dGVCdWZmZXJbXSBidWZmZXJzID0gbmV3IEJ5dGVCdWZmZXJbdHlwZXMuc2l6ZSgpXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5zaXplKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHR5cGUgPSB0eXBlcy5nZXQoaSk7CisgICAgICAgICAgICBidWZmZXJzW2ldID0gdHlwZS5nZXRNYXNrZWRWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZXIuc2VyaWFsaXplKGJ1aWxkVmFsdWUoYnVmZmVycykpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvVVRGOFR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvVVRGOFR5cGUuamF2YQppbmRleCBlMjU2MDcwLi4yMGRlNWZjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1VURjhUeXBlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9VVEY4VHlwZS5qYXZhCkBAIC0yMiw3ICsyMiw2IEBACiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Kc29uOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUwzVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlRlcm07CkBAIC0zMSwxMSArMzAsMTQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5VVEY4U2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpzb25VdGlsczsKIAogcHVibGljIGNsYXNzIFVURjhUeXBlIGV4dGVuZHMgU3RyaW5nVHlwZQogewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVVRGOFR5cGUgaW5zdGFuY2UgPSBuZXcgVVRGOFR5cGUoKTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgTUFTS0VEX1ZBTFVFID0gaW5zdGFuY2UuZGVjb21wb3NlKCIqKioqIik7CisKICAgICBVVEY4VHlwZSgpIHtzdXBlcihDb21wYXJpc29uVHlwZS5CWVRFX09SREVSKTt9IC8vIHNpbmdsZXRvbgogCiAgICAgcHVibGljIEJ5dGVCdWZmZXIgZnJvbVN0cmluZyhTdHJpbmcgc291cmNlKQpAQCAtNjIsNyArNjQsNyBAQAogICAgIHsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAnIicgKyBKc29uLnF1b3RlQXNKc29uU3RyaW5nKEJ5dGVCdWZmZXJVdGlsLnN0cmluZyhidWZmZXIsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKSArICciJzsKKyAgICAgICAgICAgIHJldHVybiAnIicgKyBKc29uVXRpbHMucXVvdGVBc0pzb25TdHJpbmcoQnl0ZUJ1ZmZlclV0aWwuc3RyaW5nKGJ1ZmZlciwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpICsgJyInOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gZXhjKQogICAgICAgICB7CkBAIC04Nyw0ICs4OSwxMCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIFVURjhTZXJpYWxpemVyLmluc3RhbmNlOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE1hc2tlZFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBNQVNLRURfVkFMVUU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9VVUlEVHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9VVUlEVHlwZS5qYXZhCmluZGV4IDU1Y2U1OWQuLjBkZTkwNDEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvVVVJRFR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1VVSURUeXBlLmphdmEKQEAgLTMwLDYgKzMwLDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5NYXJzaGFsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLlVVSURTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZUludmVyc2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVVVJREdlbjsKIAogLyoqCkBAIC00Niw2ICs0OSw4IEBACiB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVVUlEVHlwZSBpbnN0YW5jZSA9IG5ldyBVVUlEVHlwZSgpOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlciBNQVNLRURfVkFMVUUgPSBpbnN0YW5jZS5kZWNvbXBvc2UoVVVJRC5mcm9tU3RyaW5nKCIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAiKSk7CisKICAgICBVVUlEVHlwZSgpCiAgICAgewogICAgICAgICBzdXBlcihDb21wYXJpc29uVHlwZS5DVVNUT00pOwpAQCAtOTYsMTAgKzEwMSw3MiBAQAogICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gQW11c2luZ2x5IChvciBub3Qgc28gbXVjaCksIGFsdGhvdWdoIFVVSURUeXBlIGZyZWVseSB0YWtlcyB0aW1lIFVVSURzIChVVUlEcyB3aXRoIHZlcnNpb24gMSksIGl0IGNvbXBhcmVzCisgICAgICAgIC8vIHRoZW0gZGlmZmVyZW50bHkgdGhhbiBUaW1lVVVJRFR5cGUuIFRoaXMgaXMgZXZpZGVudCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZXMgY29tcGFyaXNvbiAodGhlIGNvZGUKKyAgICAgICAgLy8gYmVsb3cgZm9yIFVVSURUeXBlKSwgd2hlcmUgVVVJRFR5cGUgdHJlYXRzIHRoZW0gYXMgdW5zaWduZWQgYnl0ZXMsIHdoaWxlIFRpbWVVVUlEVHlwZSBjb21wYXJlcyB0aGUgYnl0ZXMKKyAgICAgICAgLy8gc2lnbmVkLiBTZWUgQ0FTU0FORFJBLTg3MzAgZm9yIGRldGFpbHMgYXJvdW5kIHRoaXMgZGlzY3JlcGFuY3kuCiAgICAgICAgIHJldHVybiBVbnNpZ25lZExvbmdzLmNvbXBhcmUoYWNjZXNzb3JMLmdldExvbmcobGVmdCwgOCksIGFjY2Vzc29yUi5nZXRMb25nKHJpZ2h0LCA4KSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2KQorICAgIHsKKyAgICAgICAgaWYgKGFjY2Vzc29yLmlzRW1wdHkoZGF0YSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBsb25nIG1zYiA9IGFjY2Vzc29yLmdldExvbmcoZGF0YSwgMCk7CisgICAgICAgIGxvbmcgdmVyc2lvbiA9ICgobXNiID4+PiAxMikgJiAweGYpOworICAgICAgICBCeXRlQnVmZmVyIHN3aXp6bGVkID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxNik7CisKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gMSkKKyAgICAgICAgICAgIHN3aXp6bGVkLnB1dExvbmcoMCwgVGltZVVVSURUeXBlLnJlb3JkZXJUaW1lc3RhbXBCeXRlcyhtc2IpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3dpenpsZWQucHV0TG9uZygwLCAodmVyc2lvbiA8PCA2MCkgfCAoKG1zYiA+Pj4gNCkgJiAweDBGRkZGRkZGRkZGRkYwMDBMKSB8IChtc2IgJiAweEZGRkwpKTsKKworICAgICAgICBzd2l6emxlZC5wdXRMb25nKDgsIGFjY2Vzc29yLmdldExvbmcoZGF0YSwgOCkpOworCisgICAgICAgIC8vIGZpeGVkLWxlbmd0aCB0aHVzIHByZWZpeC1mcmVlCisgICAgICAgIHJldHVybiBCeXRlU291cmNlLmZpeGVkTGVuZ3RoKHN3aXp6bGVkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IFYgZnJvbUNvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgLy8gT3B0aW9uYWwtc3R5bGUgZW5jb2Rpbmcgb2YgZW1wdHkgdmFsdWVzIGFzIG51bGwgc291cmNlcworICAgICAgICBpZiAoY29tcGFyYWJsZUJ5dGVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gYWNjZXNzb3IuZW1wdHkoKTsKKworICAgICAgICAvLyBUaGUgVVVJRCBiaXRzIGFyZSBzdG9yZWQgYXMgYW4gdW5zaWduZWQgZml4ZWQtbGVuZ3RoIDEyOC1iaXQgaW50ZWdlci4KKyAgICAgICAgbG9uZyBoaUJpdHMgPSBCeXRlU291cmNlSW52ZXJzZS5nZXRVbnNpZ25lZEZpeGVkTGVuZ3RoQXNMb25nKGNvbXBhcmFibGVCeXRlcywgOCk7CisgICAgICAgIGxvbmcgbG9CaXRzID0gQnl0ZVNvdXJjZUludmVyc2UuZ2V0VW5zaWduZWRGaXhlZExlbmd0aEFzTG9uZyhjb21wYXJhYmxlQnl0ZXMsIDgpOworCisgICAgICAgIGxvbmcgdXVpZFZlcnNpb24gPSBoaUJpdHMgPj4+IDYwICYgMHhGOworICAgICAgICBpZiAodXVpZFZlcnNpb24gPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSWYgdGhlIHZlcnNpb24gYml0cyBhcmUgc2V0IHRvIDEsIHRoaXMgaXMgYSB0aW1lLWJhc2VkIFVVSUQsIGFuZCBpdHMgaGlnaCBiaXRzIGFyZSBzaWduaWZpY2FudGx5IG1vcmUKKyAgICAgICAgICAgIC8vIHNodWZmbGVkIHRoYW4gaW4gb3RoZXIgVVVJRHMuIFJldmVydCB0aGUgc2h1ZmZsZS4KKyAgICAgICAgICAgIGhpQml0cyA9IFRpbWVVVUlEVHlwZS5yZW9yZGVyQmFja1RpbWVzdGFtcEJ5dGVzKGhpQml0cyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBGb3Igbm9uLXRpbWUgVVVJRHMsIHRoZSBvbmx5IHRoaW5nIHRoYXQncyBuZWVkZWQgaXMgdG8gcHV0IHRoZSB2ZXJzaW9uIGJpdHMgYmFjayB3aGVyZSB0aGV5IHdlcmUgb3JpZ2luYWxseS4KKyAgICAgICAgICAgIGhpQml0cyA9IGhpQml0cyA8PCA0ICYgMHhGRkZGRkZGRkZGRkYwMDAwTAorICAgICAgICAgICAgICAgICAgICAgfCB1dWlkVmVyc2lvbiA8PCAxMgorICAgICAgICAgICAgICAgICAgICAgfCBoaUJpdHMgJiAweDAwMDAwMDAwMDAwMDBGRkZMOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1ha2VVdWlkQnl0ZXMoYWNjZXNzb3IsIGhpQml0cywgbG9CaXRzKTsKKyAgICB9CisKKyAgICBzdGF0aWMgPFY+IFYgbWFrZVV1aWRCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBsb25nIGhpZ2gsIGxvbmcgbG93KQorICAgIHsKKyAgICAgICAgViBidWZmZXIgPSBhY2Nlc3Nvci5hbGxvY2F0ZSgxNik7CisgICAgICAgIGFjY2Vzc29yLnB1dExvbmcoYnVmZmVyLCAwLCBoaWdoKTsKKyAgICAgICAgYWNjZXNzb3IucHV0TG9uZyhidWZmZXIsIDgsIGxvdyk7CisgICAgICAgIHJldHVybiBidWZmZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNWYWx1ZUNvbXBhdGlibGVXaXRoSW50ZXJuYWwoQWJzdHJhY3RUeXBlPD8+IG90aGVyVHlwZSkKICAgICB7CiAgICAgICAgIHJldHVybiBvdGhlclR5cGUgaW5zdGFuY2VvZiBVVUlEVHlwZSB8fCBvdGhlclR5cGUgaW5zdGFuY2VvZiBUaW1lVVVJRFR5cGU7CkBAIC0xNzMsNCArMjQwLDEwIEBACiAgICAgewogICAgICAgICByZXR1cm4gMTY7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0TWFza2VkVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1BU0tFRF9WQUxVRTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1VzZXJUeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1VzZXJUeXBlLmphdmEKaW5kZXggNjRiZGNkZC4uMjhmNjU0ZSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9Vc2VyVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvVXNlclR5cGUuamF2YQpAQCAtMzYsMTAgKzM2LDEyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuVXNlclR5cGVTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSnNvblV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXMuYW55OwogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlcy50cmFuc2Zvcm07CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVFlQRV9VRFRfQ09ORkxJQ1RfQkVIQVZJT1I7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ29sdW1uSWRlbnRpZmllci5tYXliZVF1b3RlOwogCiAvKioKQEAgLTIxMSw3ICsyMTMsNyBAQAogICAgIHB1YmxpYyBUZXJtIGZyb21KU09OT2JqZWN0KE9iamVjdCBwYXJzZWQpIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uCiAgICAgewogICAgICAgICBpZiAocGFyc2VkIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgcGFyc2VkID0gSnNvbi5kZWNvZGVKc29uKChTdHJpbmcpIHBhcnNlZCk7CisgICAgICAgICAgICBwYXJzZWQgPSBKc29uVXRpbHMuZGVjb2RlSnNvbigoU3RyaW5nKSBwYXJzZWQpOwogCiAgICAgICAgIGlmICghKHBhcnNlZCBpbnN0YW5jZW9mIE1hcCkpCiAgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KApAQCAtMjE5LDcgKzIyMSw3IEBACiAKICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgcGFyc2VkOwogCi0gICAgICAgIEpzb24uaGFuZGxlQ2FzZVNlbnNpdGl2aXR5KG1hcCk7CisgICAgICAgIEpzb25VdGlscy5oYW5kbGVDYXNlU2Vuc2l0aXZpdHkobWFwKTsKIAogICAgICAgICBMaXN0PFRlcm0+IHRlcm1zID0gbmV3IEFycmF5TGlzdDw+KHR5cGVzLnNpemUoKSk7CiAKQEAgLTI1OCw3ICsyNjAsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9KU09OU3RyaW5nKEJ5dGVCdWZmZXIgYnVmZmVyLCBQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKQogICAgIHsKLSAgICAgICAgQnl0ZUJ1ZmZlcltdIGJ1ZmZlcnMgPSBzcGxpdChidWZmZXIpOworICAgICAgICBCeXRlQnVmZmVyW10gYnVmZmVycyA9IHNwbGl0KEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgYnVmZmVyKTsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJ7Iik7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMuc2l6ZSgpOyBpKyspCiAgICAgICAgIHsKQEAgLTI3MCw3ICsyNzIsNyBAQAogICAgICAgICAgICAgICAgIG5hbWUgPSAiXCIiICsgbmFtZSArICJcIiI7CiAKICAgICAgICAgICAgIHNiLmFwcGVuZCgnIicpOwotICAgICAgICAgICAgc2IuYXBwZW5kKEpzb24ucXVvdGVBc0pzb25TdHJpbmcobmFtZSkpOworICAgICAgICAgICAgc2IuYXBwZW5kKEpzb25VdGlscy5xdW90ZUFzSnNvblN0cmluZyhuYW1lKSk7CiAgICAgICAgICAgICBzYi5hcHBlbmQoIlwiOiAiKTsKIAogICAgICAgICAgICAgQnl0ZUJ1ZmZlciB2YWx1ZUJ1ZmZlciA9IChpID49IGJ1ZmZlcnMubGVuZ3RoKSA/IG51bGwgOiBidWZmZXJzW2ldOwpAQCAtNTIyLDE4ICs1MjQsMTYgQEAKICAgICAgICAgICAgIHsKIAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihTdHJpbmcuZm9ybWF0KCJEdXBsaWNhdGUgbmFtZXMgZm91bmQgaW4gVURUICVzLiVzIGZvciBjb2x1bW4gJXM7ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byByZXNvbHZlIHNldCAtRCIgKyBVRFRfQ09ORkxJQ1RfQkVIQVZJT1IgKyAiPUxPRyBvbiBzdGFydHVwIGFuZCByZW1vdmUgdGhlIHR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heWJlUXVvdGUoa2V5c3BhY2UpLCBtYXliZVF1b3RlKG5hbWUpLCBtYXliZVF1b3RlKGZpZWxkTmFtZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gcmVzb2x2ZSBzZXQgLUQlcz1MT0cgb24gc3RhcnR1cCBhbmQgcmVtb3ZlIHRoZSB0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXliZVF1b3RlKGtleXNwYWNlKSwgbWF5YmVRdW90ZShuYW1lKSwgbWF5YmVRdW90ZShmaWVsZE5hbWUpLCBUWVBFX1VEVF9DT05GTElDVF9CRUhBVklPUi5nZXRLZXkoKSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9OwogCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVRFRfQ09ORkxJQ1RfQkVIQVZJT1IgPSAiY2Fzc2FuZHJhLnR5cGUudWR0LmNvbmZsaWN0X2JlaGF2aW9yIjsKLQogICAgICAgICBhYnN0cmFjdCB2b2lkIG9uQ29uZmxpY3QoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGZpZWxkTmFtZSk7CiAKICAgICAgICAgc3RhdGljIENvbmZsaWN0QmVoYXZpb3IgZ2V0KCkKICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gU3lzdGVtLmdldFByb3BlcnR5KFVEVF9DT05GTElDVF9CRUhBVklPUiwgUkVKRUNULm5hbWUoKSk7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBUWVBFX1VEVF9DT05GTElDVF9CRUhBVklPUi5nZXRTdHJpbmcoUkVKRUNULm5hbWUoKSk7CiAgICAgICAgICAgICByZXR1cm4gQ29uZmxpY3RCZWhhdmlvci52YWx1ZU9mKHZhbHVlKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvVmFsdWVBY2Nlc3Nvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9WYWx1ZUFjY2Vzc29yLmphdmEKaW5kZXggYTUxODM2ZS4uMGJiNjY3NyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9WYWx1ZUFjY2Vzc29yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9WYWx1ZUFjY2Vzc29yLmphdmEKQEAgLTY4LDYgKzY4LDcgQEAKICAgICAgICAgQ2VsbDxWPiBjZWxsKENvbHVtbk1ldGFkYXRhIGNvbHVtbiwgbG9uZyB0aW1lc3RhbXAsIGludCB0dGwsIGludCBsb2NhbERlbGV0aW9uVGltZSwgViB2YWx1ZSwgQ2VsbFBhdGggcGF0aCk7CiAgICAgICAgIENsdXN0ZXJpbmc8Vj4gY2x1c3RlcmluZyhWLi4uIHZhbHVlcyk7CiAgICAgICAgIENsdXN0ZXJpbmc8Vj4gY2x1c3RlcmluZygpOworICAgICAgICBDbHVzdGVyaW5nPFY+IHN0YXRpY0NsdXN0ZXJpbmcoKTsKICAgICAgICAgQ2x1c3RlcmluZ0JvdW5kPFY+IGJvdW5kKENsdXN0ZXJpbmdQcmVmaXguS2luZCBraW5kLCBWLi4uIHZhbHVlcyk7CiAgICAgICAgIENsdXN0ZXJpbmdCb3VuZDxWPiBib3VuZChDbHVzdGVyaW5nUHJlZml4LktpbmQga2luZCk7CiAgICAgICAgIENsdXN0ZXJpbmdCb3VuZGFyeTxWPiBib3VuZGFyeShDbHVzdGVyaW5nUHJlZml4LktpbmQga2luZCwgVi4uLiB2YWx1ZXMpOwpAQCAtMTA1LDcgKzEwNiw2IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBib3VuZGFyeShyZXZlcnNlZCA/IElOQ0xfRU5EX0VYQ0xfU1RBUlRfQk9VTkRBUlkgOiBFWENMX0VORF9JTkNMX1NUQVJUX0JPVU5EQVJZLCBib3VuZFZhbHVlcyk7CiAgICAgICAgIH0KLQogICAgIH0KICAgICAvKioKICAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBnaXZlbiB2YWx1ZQpAQCAtMTYyLDcgKzE2Miw3IEBACiAKICAgICBkZWZhdWx0IHZvaWQgd3JpdGVXaXRoVkludExlbmd0aChWIHZhbHVlLCBEYXRhT3V0cHV0UGx1cyBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHNpemUodmFsdWUpKTsKKyAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoc2l6ZSh2YWx1ZSkpOwogICAgICAgICB3cml0ZSh2YWx1ZSwgb3V0KTsKICAgICB9CiAKQEAgLTMzMSw2ICszMzEsMTIgQEAKICAgICBCYWxsb3QgdG9CYWxsb3QoViB2YWx1ZSk7CiAKICAgICAvKioKKyAgICAgKiB3cml0ZXMgdGhlIGJ5dGUgdmFsdWUge0BwYXJhbSB2YWx1ZX0gdG8ge0BwYXJhbSBkc3R9IGF0IG9mZnNldCB7QHBhcmFtIG9mZnNldH0KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byB7QHBhcmFtIHZhbHVlfQorICAgICAqLworICAgIGludCBwdXRCeXRlKFYgZHN0LCBpbnQgb2Zmc2V0LCBieXRlIHZhbHVlKTsKKworICAgIC8qKgogICAgICAqIHdyaXRlcyB0aGUgc2hvcnQgdmFsdWUge0BwYXJhbSB2YWx1ZX0gdG8ge0BwYXJhbSBkc3R9IGF0IG9mZnNldCB7QHBhcmFtIG9mZnNldH0KICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byB7QHBhcmFtIHZhbHVlfQogICAgICAqLwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvQWJzdHJhY3RBbGxvY2F0b3JNZW10YWJsZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvQWJzdHJhY3RBbGxvY2F0b3JNZW10YWJsZS5qYXZhCmluZGV4IGFlMTI1MTYuLjg1MjZkYWMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL0Fic3RyYWN0QWxsb2NhdG9yTWVtdGFibGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9BYnN0cmFjdEFsbG9jYXRvck1lbXRhYmxlLmphdmEKQEAgLTQ2LDYgKzQ2LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuTWVtdGFibGVQb29sOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5OYXRpdmVQb29sOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5TbGFiUG9vbDsKK2ltcG9ydCBvcmcuZ2l0aHViLmphbW0uVW5tZXRlcmVkOwogCiAvKioKICAqIEEgbWVtdGFibGUgdGhhdCB1c2VzIG1lbW9yeSB0cmFja2VkIGFuZCBtYXliZSBhbGxvY2F0ZWQgdmlhIGEgTWVtdGFibGVBbGxvY2F0b3IgZnJvbSBhIE1lbXRhYmxlUG9vbC4KQEAgLTU3LDE3ICs1OCwyNCBAQAogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNZW10YWJsZVBvb2wgTUVNT1JZX1BPT0wgPSBBYnN0cmFjdEFsbG9jYXRvck1lbXRhYmxlLmNyZWF0ZU1lbXRhYmxlQWxsb2NhdG9yUG9vbCgpOwogCisgICAgQFVubWV0ZXJlZAogICAgIHByb3RlY3RlZCBmaW5hbCBPd25lciBvd25lcjsKKyAgICBAVW5tZXRlcmVkICAvLyB0b3RhbCBwb29sIHNpemUgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiBtZW10YWJsZSdzIGRlZXAgc2l6ZQogICAgIHByb3RlY3RlZCBmaW5hbCBNZW10YWJsZUFsbG9jYXRvciBhbGxvY2F0b3I7CiAKICAgICAvLyBSZWNvcmQgdGhlIGNvbXBhcmF0b3Igb2YgdGhlIENGUyBhdCB0aGUgY3JlYXRpb24gb2YgdGhlIG1lbXRhYmxlLiBUaGlzCiAgICAgLy8gaXMgb25seSB1c2VkIHdoZW4gYSB1c2VyIHVwZGF0ZSB0aGUgQ0YgY29tcGFyYXRvciwgdG8ga25vdyBpZiB0aGUKICAgICAvLyBtZW10YWJsZSB3YXMgY3JlYXRlZCB3aXRoIHRoZSBuZXcgb3Igb2xkIGNvbXBhcmF0b3IuCisgICAgQFVubWV0ZXJlZAogICAgIHByb3RlY3RlZCBmaW5hbCBDbHVzdGVyaW5nQ29tcGFyYXRvciBpbml0aWFsQ29tcGFyYXRvcjsKKyAgICAvLyBBcyBhYm92ZSwgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIG1lbXRhYmxlIG5lZWRzIHRvIGJlIGZsdXNoZWQgb24gc2NoZW1hIGNoYW5nZS4KKyAgICBAVW5tZXRlcmVkCisgICAgcHVibGljIGZpbmFsIEZhY3RvcnkgaW5pdGlhbEZhY3Rvcnk7CiAKICAgICBwcml2YXRlIGZpbmFsIGxvbmcgY3JlYXRpb25OYW5vID0gQ2xvY2suR2xvYmFsLm5hbm9UaW1lKCk7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBNZW10YWJsZVBvb2wgY3JlYXRlTWVtdGFibGVBbGxvY2F0b3JQb29sKCkKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBzdGF0aWMgTWVtdGFibGVQb29sIGNyZWF0ZU1lbXRhYmxlQWxsb2NhdG9yUG9vbCgpCiAgICAgewogICAgICAgICBDb25maWcuTWVtdGFibGVBbGxvY2F0aW9uVHlwZSBhbGxvY2F0aW9uVHlwZSA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRNZW10YWJsZUFsbG9jYXRpb25UeXBlKCk7CiAgICAgICAgIGxvbmcgaGVhcExpbWl0ID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldE1lbXRhYmxlSGVhcFNwYWNlSW5NaUIoKSA8PCAyMDsKQEAgLTEwOSw2ICsxMTcsNyBAQAogICAgICAgICBzdXBlcihtZXRhZGF0YVJlZiwgY29tbWl0TG9nTG93ZXJCb3VuZCk7CiAgICAgICAgIHRoaXMuYWxsb2NhdG9yID0gTUVNT1JZX1BPT0wubmV3QWxsb2NhdG9yKG1ldGFkYXRhUmVmLnRvU3RyaW5nKCkpOwogICAgICAgICB0aGlzLmluaXRpYWxDb21wYXJhdG9yID0gbWV0YWRhdGEuZ2V0KCkuY29tcGFyYXRvcjsKKyAgICAgICAgdGhpcy5pbml0aWFsRmFjdG9yeSA9IG1ldGFkYXRhKCkucGFyYW1zLm1lbXRhYmxlLmZhY3RvcnkoKTsKICAgICAgICAgdGhpcy5vd25lciA9IG93bmVyOwogICAgICAgICBzY2hlZHVsZUZsdXNoKCk7CiAgICAgfQpAQCAtMTI1LDcgKzEzNCw3IEBACiAgICAgICAgIHsKICAgICAgICAgY2FzZSBTQ0hFTUFfQ0hBTkdFOgogICAgICAgICAgICAgcmV0dXJuIGluaXRpYWxDb21wYXJhdG9yICE9IG1ldGFkYXRhKCkuY29tcGFyYXRvciAvLyBJZiB0aGUgQ0YgY29tcGFyYXRvciBoYXMgY2hhbmdlZCwgYmVjYXVzZSBvdXIgcGFydGl0aW9ucyByZWZlcmVuY2UgdGhlIG9sZCBvbmUKLSAgICAgICAgICAgICAgICAgICB8fCBtZXRhZGF0YSgpLnBhcmFtcy5tZW10YWJsZS5mYWN0b3J5KCkgIT0gZmFjdG9yeSgpOyAvLyBJZiBhIGRpZmZlcmVudCB0eXBlIG9mIG1lbXRhYmxlIGlzIHJlcXVlc3RlZAorICAgICAgICAgICAgICAgICAgIHx8ICFpbml0aWFsRmFjdG9yeS5lcXVhbHMobWV0YWRhdGEoKS5wYXJhbXMubWVtdGFibGUuZmFjdG9yeSgpKTsgLy8gSWYgYSBkaWZmZXJlbnQgdHlwZSBvZiBtZW10YWJsZSBpcyByZXF1ZXN0ZWQKICAgICAgICAgY2FzZSBPV05FRF9SQU5HRVNfQ0hBTkdFOgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBieSBkZWZhdWx0IHdlIGRvbid0IHVzZSB0aGUgbG9jYWwgcmFuZ2VzLCB0aHVzIHRoaXMgaGFzIG5vIGVmZmVjdAogICAgICAgICBkZWZhdWx0OgpAQCAtMTUwLDggKzE1OSw2IEBACiAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigicGVyZm9ybVNuYXBzaG90IG11c3QgYmUgaW1wbGVtZW50ZWQgaWYgc2hvdWxkU3dpdGNoKFNOQVBTSE9UKSBjYW4gcmV0dXJuIGZhbHNlLiIpOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBGYWN0b3J5IGZhY3RvcnkoKTsKLQogICAgIHB1YmxpYyB2b2lkIHN3aXRjaE91dChPcE9yZGVyLkJhcnJpZXIgd3JpdGVCYXJyaWVyLCBBdG9taWNSZWZlcmVuY2U8Q29tbWl0TG9nUG9zaXRpb24+IGNvbW1pdExvZ1VwcGVyQm91bmQpCiAgICAgewogICAgICAgICBzdXBlci5zd2l0Y2hPdXQod3JpdGVCYXJyaWVyLCBjb21taXRMb2dVcHBlckJvdW5kKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL0Fic3RyYWN0TWVtdGFibGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL0Fic3RyYWN0TWVtdGFibGUuamF2YQppbmRleCBjYTZkYmY2Li44ZTUwNDU2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9BYnN0cmFjdE1lbXRhYmxlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvQWJzdHJhY3RNZW10YWJsZS5qYXZhCkBAIC0zNSw2ICszNSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhUmVmOworaW1wb3J0IG9yZy5naXRodWIuamFtbS5Vbm1ldGVyZWQ7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1lbXRhYmxlIGltcGxlbWVudHMgTWVtdGFibGUKIHsKQEAgLTQ4LDYgKzQ5LDcgQEAKICAgICAvLyBOb3RlOiBzdGF0c0NvbGxlY3RvciBoYXMgY29ycmVzcG9uZGluZyBzdGF0aXN0aWNzIHRvIHRoZSB0d28gYWJvdmUsIGJ1dCBzdGFydHMgd2l0aCBhbiBlcG9jaCB2YWx1ZSB3aGljaCBpcyBub3QKICAgICAvLyBjb3JyZWN0IGZvciB0aGVpciB1c2FnZS4KIAorICAgIEBVbm1ldGVyZWQKICAgICBwcm90ZWN0ZWQgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YTsKIAogICAgIHB1YmxpYyBBYnN0cmFjdE1lbXRhYmxlKFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGFSZWYpCkBAIC03NCwxMyArNzYsNiBAQAogICAgICAgICByZXR1cm4gY3VycmVudE9wZXJhdGlvbnMuZ2V0KCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWluVFMgaWYgb25lIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIE5PX01JTl9USU1FU1RBTVAuCi0gICAgICoKLSAgICAgKiBFbmNvZGluZ1N0YXRzIHVzZXMgYSBzeW50aGV0aWMgZXBvY2ggVFMgYXQgMjAxNS4gV2UgZG9uJ3Qgd2FudCB0byBsZWFrIHRoYXQgKENBU1NBTkRSQS0xODExOCkgc28gd2UgcmV0dXJuIE5PX01JTl9USU1FU1RBTVAgaW5zdGVhZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1pblRTIG9yIE5PX01JTl9USU1FU1RBTVAgaWYgbm9uZSBhdmFpbGFibGUKLSAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBnZXRNaW5UaW1lc3RhbXAoKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1pblRpbWVzdGFtcC5nZXQoKSAhPSBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTLm1pblRpbWVzdGFtcCA/IG1pblRpbWVzdGFtcC5nZXQoKSA6IE5PX01JTl9USU1FU1RBTVA7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9BYnN0cmFjdFNoYXJkZWRNZW10YWJsZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvQWJzdHJhY3RTaGFyZGVkTWVtdGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODE1NzAxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvQWJzdHJhY3RTaGFyZGVkTWVtdGFibGUuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZ1Bvc2l0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhUmVmOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk1CZWFuV3JhcHBlcjsKK2ltcG9ydCBvcmcuZ2l0aHViLmphbW0uVW5tZXRlcmVkOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTUVNVEFCTEVfU0hBUkRfQ09VTlQ7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNoYXJkZWRNZW10YWJsZSBleHRlbmRzIEFic3RyYWN0QWxsb2NhdG9yTWVtdGFibGUKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQWJzdHJhY3RTaGFyZGVkTWVtdGFibGUuY2xhc3MpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hBUkRTX09QVElPTiA9ICJzaGFyZHMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIQVJERURfTUVNVEFCTEVfQ09ORklHX09CSkVDVF9OQU1FID0gIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiOnR5cGU9U2hhcmRlZE1lbXRhYmxlQ29uZmlnIjsKKyAgICBzdGF0aWMKKyAgICB7CisgICAgICAgIE1CZWFuV3JhcHBlci5pbnN0YW5jZS5yZWdpc3Rlck1CZWFuKG5ldyBTaGFyZGVkTWVtdGFibGVDb25maWcoKSwgU0hBUkRFRF9NRU1UQUJMRV9DT05GSUdfT0JKRUNUX05BTUUsIE1CZWFuV3JhcHBlci5PbkV4Y2VwdGlvbi5MT0cpOworICAgIH0KKworICAgIC8vIGRlZmF1bHQgc2hhcmQgY291bnQsIHVzZWQgd2hlbiBhIHNwZWNpZmljIG51bWJlciBvZiBzaGFyZHMgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgb3B0aW9ucworICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGludCBkZWZhdWx0U2hhcmRDb3VudCA9IE1FTVRBQkxFX1NIQVJEX0NPVU5ULmdldEludChGQlV0aWxpdGllcy5nZXRBdmFpbGFibGVQcm9jZXNzb3JzKCkpOworCisgICAgLy8gVGhlIGJvdW5kYXJpZXMgZm9yIHRoZSBrZXlzcGFjZSBhcyB0aGV5IHdlcmUgY2FsY3VsYXRlZCB3aGVuIHRoZSBtZW10YWJsZSBpcyBjcmVhdGVkLgorICAgIC8vIFRoZSBib3VuZGFyaWVzIHdpbGwgYmUgTk9ORSBmb3Igc3lzdGVtIGtleXNwYWNlcyBvciBpZiBTdG9yYWdlU2VydmljZSBpcyBub3QgeWV0IGluaXRpYWxpemVkLgorICAgIC8vIFRoZSBmYWN0IHRoaXMgaXMgZml4ZWQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgbWVtdGFibGUgbGlmZXRpbWUsIGd1YXJhbnRlZXMgd2UnbGwgYWx3YXlzIHBpY2sgdGhlIHNhbWUgc2hhcmQKKyAgICAvLyBmb3IgYSBnaXZlbiBrZXksIGV2ZW4gaWYgd2UgcmFjZSB3aXRoIHRoZSBTdG9yYWdlU2VydmljZSBpbml0aWFsaXphdGlvbiBvciB3aXRoIHRvcG9sb2d5IGNoYW5nZXMuCisgICAgQFVubWV0ZXJlZAorICAgIHByb3RlY3RlZCBmaW5hbCBTaGFyZEJvdW5kYXJpZXMgYm91bmRhcmllczsKKworICAgIEFic3RyYWN0U2hhcmRlZE1lbXRhYmxlKEF0b21pY1JlZmVyZW5jZTxDb21taXRMb2dQb3NpdGlvbj4gY29tbWl0TG9nTG93ZXJCb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE93bmVyIG93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIgc2hhcmRDb3VudE9wdGlvbikKKyAgICB7CisgICAgICAgIHN1cGVyKGNvbW1pdExvZ0xvd2VyQm91bmQsIG1ldGFkYXRhUmVmLCBvd25lcik7CisgICAgICAgIGludCBzaGFyZENvdW50ID0gc2hhcmRDb3VudE9wdGlvbiAhPSBudWxsID8gc2hhcmRDb3VudE9wdGlvbiA6IGRlZmF1bHRTaGFyZENvdW50OworICAgICAgICB0aGlzLmJvdW5kYXJpZXMgPSBvd25lci5sb2NhbFJhbmdlU3BsaXRzKHNoYXJkQ291bnQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNoYXJkZWRNZW10YWJsZUNvbmZpZyBpbXBsZW1lbnRzIFNoYXJkZWRNZW10YWJsZUNvbmZpZ01YQmVhbgorICAgIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRTaGFyZENvdW50KFN0cmluZyBzaGFyZENvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoImF1dG8iLmVxdWFsc0lnbm9yZUNhc2Uoc2hhcmRDb3VudCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGVmYXVsdFNoYXJkQ291bnQgPSBGQlV0aWxpdGllcy5nZXRBdmFpbGFibGVQcm9jZXNzb3JzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0U2hhcmRDb3VudCA9IEludGVnZXIucGFyc2VJbnQoc2hhcmRDb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiVW5hYmxlIHRvIHBhcnNlIHt9IGFzIHZhbGlkIHZhbHVlIGZvciBzaGFyZCBjb3VudCIsIHNoYXJkQ291bnQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlJlcXVlc3RlZCBzZXR0aW5nIHNoYXJkIGNvdW50IHRvIHt9OyBzZXQgdG86IHt9Iiwgc2hhcmRDb3VudCwgZGVmYXVsdFNoYXJkQ291bnQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNoYXJkQ291bnQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhkZWZhdWx0U2hhcmRDb3VudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXREZWZhdWx0U2hhcmRDb3VudCgpCisgICAgeworICAgICAgICByZXR1cm4gZGVmYXVsdFNoYXJkQ291bnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvRmx1c2hpbmcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL0ZsdXNoaW5nLmphdmEKaW5kZXggMWEzMTM3NC4uYWZlN2ExMiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvRmx1c2hpbmcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9GbHVzaGluZy5qYXZhCkBAIC0yNyw2ICsyNyw3IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlza0JvdW5kYXJpZXM7CkBAIC04Miw3ICs4Myw5IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShhYm9ydFJ1bm5hYmxlcyhydW5uYWJsZXMsIGUpKTsKKyAgICAgICAgICAgIFRocm93YWJsZSB0ID0gYWJvcnRSdW5uYWJsZXMocnVubmFibGVzLCBlKTsKKyAgICAgICAgICAgIFRocm93YWJsZXMudGhyb3dJZlVuY2hlY2tlZCh0KTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC05NSwxMiArOTgsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnkgZmx1c2hMb2NhdGlvbikKICAgICB7CiAgICAgICAgIE1lbXRhYmxlLkZsdXNoYWJsZVBhcnRpdGlvblNldDw/PiBmbHVzaFNldCA9IG1lbXRhYmxlLmdldEZsdXNoU2V0KGZyb20sIHRvKTsKLSAgICAgICAgU1NUYWJsZUZvcm1hdC5UeXBlIGZvcm1hdFR5cGUgPSBTU1RhYmxlRm9ybWF0LlR5cGUuY3VycmVudCgpOwotICAgICAgICBsb25nIGVzdGltYXRlZFNpemUgPSBmb3JtYXRUeXBlLmluZm8uZ2V0V3JpdGVyRmFjdG9yeSgpLmVzdGltYXRlU2l6ZShmbHVzaFNldCk7CisgICAgICAgIFNTVGFibGVGb3JtYXQ8PywgPz4gZm9ybWF0ID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpOworICAgICAgICBsb25nIGVzdGltYXRlZFNpemUgPSBmb3JtYXQuZ2V0V3JpdGVyRmFjdG9yeSgpLmVzdGltYXRlU2l6ZShmbHVzaFNldCk7CiAKICAgICAgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZmx1c2hMb2NhdGlvbiA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY2ZzLm5ld1NTVGFibGVEZXNjcmlwdG9yKGNmcy5nZXREaXJlY3RvcmllcygpLmdldFdyaXRlYWJsZUxvY2F0aW9uQXNGaWxlKGVzdGltYXRlZFNpemUpLCBmb3JtYXRUeXBlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNmcy5uZXdTU1RhYmxlRGVzY3JpcHRvcihjZnMuZ2V0RGlyZWN0b3JpZXMoKS5nZXRMb2NhdGlvbkZvckRpc2soZmx1c2hMb2NhdGlvbiksIGZvcm1hdFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNmcy5uZXdTU1RhYmxlRGVzY3JpcHRvcihjZnMuZ2V0RGlyZWN0b3JpZXMoKS5nZXRXcml0ZWFibGVMb2NhdGlvbkFzRmlsZShlc3RpbWF0ZWRTaXplKSwgZm9ybWF0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNmcy5uZXdTU1RhYmxlRGVzY3JpcHRvcihjZnMuZ2V0RGlyZWN0b3JpZXMoKS5nZXRMb2NhdGlvbkZvckRpc2soZmx1c2hMb2NhdGlvbiksIGZvcm1hdCk7CiAKICAgICAgICAgU1NUYWJsZU11bHRpV3JpdGVyIHdyaXRlciA9IGNyZWF0ZUZsdXNoV3JpdGVyKGNmcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoU2V0LApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvTWVtdGFibGVfQVBJLm1kIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvTWVtdGFibGVfQVBJLm1kCmluZGV4IDhhNTgyZTMuLjcwZjhmMGIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL01lbXRhYmxlX0FQSS5tZAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9NZW10YWJsZV9BUEkubWQKQEAgLTQ1LDEzICs0NSwzMiBAQAogICAgICAgICAgIGNsYXNzX25hbWU6IFNraXBMaXN0TWVtdGFibGUKICAgICAgICAgc2hhcmRlZDoKICAgICAgICAgICBjbGFzc19uYW1lOiBTaGFyZGVkU2tpcExpc3RNZW10YWJsZQorICAgICAgICB0cmllOgorICAgICAgICAgIGNsYXNzX25hbWU6IFRyaWVNZW10YWJsZQogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGluaGVyaXRzOiBzaGFyZGVkCisgICAgICAgICAgaW5oZXJpdHM6IHRyaWUKIGBgYAogCiBOb3RlIHRoYXQgdGhlIGRhdGFiYXNlIHdpbGwgb25seSB2YWxpZGF0ZSB0aGUgbWVtdGFibGUgY2xhc3MgYW5kIGl0cyBwYXJhbWV0ZXJzIHdoZW4gYSBjb25maWd1cmF0aW9uIG5lZWRzIHRvIGJlCiBpbnN0YW50aWF0ZWQgZm9yIGEgdGFibGUuCiAKKyMjIEltcGxlbWVudGF0aW9ucyBwcm92aWRlZAorCitDYXNzYW5kcmEgY3VycmVudGx5IGNvbWVzIHdpdGggdGhyZWUgbWVtdGFibGUgaW1wbGVtZW50YXRpb25zOgorCistIGBTa2lwTGlzdE1lbXRhYmxlYCBpcyB0aGUgZGVmYXVsdCBhbmQgbWF0Y2hlcyB0aGUgbWVtdGFibGUgZm9ybWF0IG9mIENhc3NhbmRyYSB2ZXJzaW9ucyB1cCB0byA0LjEuIEl0IG9yZ2FuaXplcworICBwYXJ0aXRpb25zIGludG8gYSBzaW5nbGUgY29uY3VycmVudCBza2lwIGxpc3QuCistIGBTaGFyZGVkU2tpcExpc3RNZW10YWJsZWAgc3BsaXRzIHRoZSBwYXJ0aXRpb24gc2tpcC1saXN0IGludG8gc2V2ZXJhbCBpbmRlcGVuZGVudCBza2lwLWxpc3RzIGVhY2ggY292ZXJpbmcgYSByb3VnaGx5CisgIGVxdWFsIHBhcnQgb2YgdGhlIHRva2VuIHNwYWNlIHNlcnZlZCBieSB0aGlzIG5vZGUuIFRoaXMgcmVkdWNlcyBjb25nZXN0aW9uIG9mIHRoZSBza2lwLWxpc3QgZnJvbSBjb25jdXJyZW50IHdyaXRlcyBhbmQKKyAgY2FuIGxlYWQgdG8gaW1wcm92ZWQgd3JpdGUgdGhyb3VnaHB1dC4gSXRzIGNvbmZpZ3VyYXRpb24gdGFrZXMgdHdvIHBhcmFtZXRlcnM6CisgIC0gYHNoYXJkc2A6IHRoZSBudW1iZXIgb2Ygc2hhcmRzIHRvIHNwbGl0IGludG8sIGRlZmF1bHRpbmcgdG8gdGhlIG51bWJlciBvZiBDUFUgY29yZXMgb24gdGhlIG1hY2hpbmUuCisgIC0gYHNlcmlhbGl6ZV93cml0ZXNgOiBpZiBmYWxzZSAoZGVmYXVsdCksIGVhY2ggc2hhcmQgbWF5IHNlcnZlIG11bHRpcGxlIHdyaXRlcyBpbiBwYXJhbGxlbDsgaWYgdHJ1ZSwgd3JpdGVzIHRvIGVhY2gKKyAgICBzaGFyZCBhcmUgc3luY2hyb25pemVkLgorLSBgVHJpZU1lbXRhYmxlYCBpcyBhIG5vdmVsIHNvbHV0aW9uIHRoYXQgb3JnYW5pemVzIHBhcnRpdGlvbnMgaW50byBhbiBpbi1tZW1vcnkgdHJpZSB3aGljaCBwbGFjZXMgdGhlIHBhcnRpdGlvbgorICBpbmRleGluZyBzdHJ1Y3R1cmUgaW4gYSBidWZmZXIsIG9mZi1oZWFwIGlmIGRlc2lyZWQsIHdoaWNoIHNpZ25pZmljYW50bHkgaW1wcm92ZXMgZ2FyYmFnZSBjb2xsZWN0aW9uIGVmZmljaWVuY3kuIEl0CisgIGFsc28gaW1wcm92ZXMgdGhlIG1lbXRhYmxlJ3Mgc3BhY2UgZWZmaWNpZW5jeSBhbmQgbG9va3VwIHBlcmZvcm1hbmNlLiBJdHMgY29uZmlndXJhdGlvbiBjYW4gdGFrZSBhIHNpbmdsZSBwYXJhbWV0ZXIKKyAgYHNoYXJkc2AgYXMgYWJvdmUuCisKICMjIE1lbXRhYmxlIHNlbGVjdGlvbgogCiBPbmNlIGEgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBkZWZpbmVkLCBpdCBjYW4gYmUgdXNlZCBieSBzcGVjaWZ5aW5nIGl0IGluIHRoZSBgbWVtdGFibGVgIHBhcmFtZXRlciBvZiBhIGBDUkVBVEUgVEFCTEVgCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9TaGFyZEJvdW5kYXJpZXMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL1NoYXJkQm91bmRhcmllcy5qYXZhCmluZGV4IGZiOWNjOTguLjg2NDg5OWYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL1NoYXJkQm91bmRhcmllcy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL1NoYXJkQm91bmRhcmllcy5qYXZhCkBAIC0yMiw3ICsyMiw2IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUGFydGl0aW9uUG9zaXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOwpAQCAtODMsNyArODIsNyBAQAogICAgICAgICBpZiAoYm91bmRhcmllcy5sZW5ndGggPT0gMCkKICAgICAgICAgICAgIHJldHVybiAwOwogCi0gICAgICAgIGFzc2VydCAoa2V5LmdldFBhcnRpdGlvbmVyKCkgPT0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFBhcnRpdGlvbmVyKCkpOworICAgICAgICBhc3NlcnQgKGtleS5nZXRQYXJ0aXRpb25lcigpID09IGJvdW5kYXJpZXNbMF0uZ2V0UGFydGl0aW9uZXIoKSk7CiAgICAgICAgIHJldHVybiBnZXRTaGFyZEZvclRva2VuKGtleS5nZXRUb2tlbigpKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL1NoYXJkZWRNZW10YWJsZUNvbmZpZ01YQmVhbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvU2hhcmRlZE1lbXRhYmxlQ29uZmlnTVhCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBmZjEwZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL1NoYXJkZWRNZW10YWJsZUNvbmZpZ01YQmVhbi5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGU7CisKK3B1YmxpYyBpbnRlcmZhY2UgU2hhcmRlZE1lbXRhYmxlQ29uZmlnTVhCZWFuCit7CisgICAgLyoqCisgICAgICogQWRqdXN0IHRoZSBzaGFyZCBjb3VudCBmb3Igc2hhcmRlZCBtZW10YWJsZXMgdGhhdCBkbyBub3Qgc3BlY2lmeSBpdCBleHBsaWNpdGx5IGluIHRoZSBtZW10YWJsZSBvcHRpb25zLgorICAgICAqIENoYW5nZXMgd2lsbCBhcHBseSBvbiB0aGUgbmV4dCBtZW10YWJsZSBmbHVzaC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0U2hhcmRDb3VudChTdHJpbmcgbnVtU2hhcmRzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNoYXJkIGNvdW50IGZvciBzaGFyZGVkIG1lbXRhYmxlcyB0aGF0IGRvIG5vdCBzcGVjaWZ5IGl0IGV4cGxpY2l0bHkgaW4gdGhlIG1lbXRhYmxlIG9wdGlvbnMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2hhcmRDb3VudCgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvU2hhcmRlZFNraXBMaXN0TWVtdGFibGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL1NoYXJkZWRTa2lwTGlzdE1lbXRhYmxlLmphdmEKaW5kZXggNTFjZDVmMi4uMDM2ZDc0MiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvU2hhcmRlZFNraXBMaXN0TWVtdGFibGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9TaGFyZGVkU2tpcExpc3RNZW10YWJsZS5qYXZhCkBAIC00MSw2ICs0MSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLkFic3RyYWN0VW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuQXRvbWljQlRyZWVQYXJ0aXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5CVHJlZVBhcnRpdGlvblVwZGF0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5QYXJ0aXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5QYXJ0aXRpb25VcGRhdGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5VbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3I7CkBAIC01MSwxMCArNTIsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JbmNsdWRpbmdFeGNsdWRpbmdCb3VuZHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnRyYW5zYWN0aW9ucy5VcGRhdGVUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZWFkc0xpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhUmVmOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuT3BPcmRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuQ2xvbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5NZW10YWJsZUFsbG9jYXRvcjsKQEAgLTcyLDQ2ICs3MiwyNiBAQAogICoKICAqIEFsc28gc2VlIE1lbXRhYmxlX0FQSS5tZC4KICAqLwotcHVibGljIGNsYXNzIFNoYXJkZWRTa2lwTGlzdE1lbXRhYmxlIGV4dGVuZHMgQWJzdHJhY3RBbGxvY2F0b3JNZW10YWJsZQorcHVibGljIGNsYXNzIFNoYXJkZWRTa2lwTGlzdE1lbXRhYmxlIGV4dGVuZHMgQWJzdHJhY3RTaGFyZGVkTWVtdGFibGUKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU2hhcmRlZFNraXBMaXN0TWVtdGFibGUuY2xhc3MpOwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hBUkRTX09QVElPTiA9ICJzaGFyZHMiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0tJTkdfT1BUSU9OID0gInNlcmlhbGl6ZV93cml0ZXMiOwogCi0gICAgLy8gVGhlIGJvdW5kYXJpZXMgZm9yIHRoZSBrZXlzcGFjZSBhcyB0aGV5IHdlcmUgY2FsY3VsYXRlZCB3aGVuIHRoZSBtZW10YWJsZSBpcyBjcmVhdGVkLgotICAgIC8vIFRoZSBib3VuZGFyaWVzIHdpbGwgYmUgTk9ORSBmb3Igc3lzdGVtIGtleXNwYWNlcyBvciBpZiBTdG9yYWdlU2VydmljZSBpcyBub3QgeWV0IGluaXRpYWxpemVkLgotICAgIC8vIFRoZSBmYWN0IHRoaXMgaXMgZml4ZWQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgbWVtdGFibGUgbGlmZXRpbWUsIGd1YXJhbnRlZXMgd2UnbGwgYWx3YXlzIHBpY2sgdGhlIHNhbWUgc2hhcmQKLSAgICAvLyBmb3IgYSBnaXZlbiBrZXksIGV2ZW4gaWYgd2UgcmFjZSB3aXRoIHRoZSBTdG9yYWdlU2VydmljZSBpbml0aWFsaXphdGlvbiBvciB3aXRoIHRvcG9sb2d5IGNoYW5nZXMuCi0gICAgQFVubWV0ZXJlZAotICAgIGZpbmFsIFNoYXJkQm91bmRhcmllcyBib3VuZGFyaWVzOwotCiAgICAgLyoqCi0gICAgICogQ29yZS1zcGVjaWZpYyBtZW10YWJsZSByZWdpb25zLiBBbGwgd3JpdGVzIG11c3QgZ28gdGhyb3VnaCB0aGUgc3BlY2lmaWMgY29yZS4gVGhlIGRhdGEgc3RydWN0dXJlcyB1c2VkCi0gICAgICogYXJlIGNvbmN1cnJlbnQtcmVhZCBzYWZlLCB0aHVzIHJlYWRzIGNhbiBiZSBjYXJyaWVkIG91dCBmcm9tIGFueSB0aHJlYWQuCisgICAgICogU2hhcmRlZCBtZW10YWJsZSBzZWN0aW9ucy4gRWFjaCBpcyByZXNwb25zaWJsZSBmb3IgYSBjb250aWd1b3VzIHJhbmdlIG9mIHRoZSB0b2tlbiBzcGFjZSAoYmV0d2VlbiBib3VuZGFyaWVzW2ldCisgICAgICogYW5kIGJvdW5kYXJpZXNbaSsxXSkgYW5kIGlzIHdyaXR0ZW4gdG8gYnkgb25lIHRocmVhZCBhdCBhIHRpbWUsIHdoaWxlIHJlYWRzIGFyZSBjYXJyaWVkIG91dCBjb25jdXJyZW50bHkKKyAgICAgKiAoaW5jbHVkaW5nIHdpdGggYW55IHdyaXRlKS4KICAgICAgKi8KICAgICBmaW5hbCBNZW10YWJsZVNoYXJkW10gc2hhcmRzOwogCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hBUkRfQ09VTlRfUFJPUEVSVFkgPSAiY2Fzc2FuZHJhLm1lbXRhYmxlLnNoYXJkLmNvdW50IjsKLQotICAgIC8vIGRlZmF1bHQgc2hhcmQgY291bnQsIHVzZWQgd2hlbiBhIHNwZWNpZmljIG51bWJlciBvZiBzaGFyZHMgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgcGFyYW1ldGVycwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSEFSRF9DT1VOVCA9IEludGVnZXIuZ2V0SW50ZWdlcihTSEFSRF9DT1VOVF9QUk9QRVJUWSwgRkJVdGlsaXRpZXMuZ2V0QXZhaWxhYmxlUHJvY2Vzc29ycygpKTsKLQotICAgIHByaXZhdGUgZmluYWwgRmFjdG9yeSBmYWN0b3J5OwotCi0gICAgLy8gb25seSB0byBiZSB1c2VkIGJ5IGluaXQoKSwgdG8gc2V0dXAgdGhlIHZlcnkgZmlyc3QgbWVtdGFibGUgZm9yIHRoZSBjZnMKICAgICBTaGFyZGVkU2tpcExpc3RNZW10YWJsZShBdG9taWNSZWZlcmVuY2U8Q29tbWl0TG9nUG9zaXRpb24+IGNvbW1pdExvZ0xvd2VyQm91bmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YVJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPd25lciBvd25lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIHNoYXJkQ291bnRPcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFjdG9yeSBmYWN0b3J5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIgc2hhcmRDb3VudE9wdGlvbikKICAgICB7Ci0gICAgICAgIHN1cGVyKGNvbW1pdExvZ0xvd2VyQm91bmQsIG1ldGFkYXRhUmVmLCBvd25lcik7Ci0gICAgICAgIGludCBzaGFyZENvdW50ID0gc2hhcmRDb3VudE9wdGlvbiAhPSBudWxsID8gc2hhcmRDb3VudE9wdGlvbiA6IFNIQVJEX0NPVU5UOwotICAgICAgICB0aGlzLmJvdW5kYXJpZXMgPSBvd25lci5sb2NhbFJhbmdlU3BsaXRzKHNoYXJkQ291bnQpOworICAgICAgICBzdXBlcihjb21taXRMb2dMb3dlckJvdW5kLCBtZXRhZGF0YVJlZiwgb3duZXIsIHNoYXJkQ291bnRPcHRpb24pOwogICAgICAgICB0aGlzLnNoYXJkcyA9IGdlbmVyYXRlUGFydGl0aW9uU2hhcmRzKGJvdW5kYXJpZXMuc2hhcmRDb3VudCgpLCBhbGxvY2F0b3IsIG1ldGFkYXRhUmVmKTsKLSAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBNZW10YWJsZVNoYXJkW10gZ2VuZXJhdGVQYXJ0aXRpb25TaGFyZHMoaW50IHNwbGl0cywKQEAgLTEyOCwxNyArMTA4LDExIEBACiAgICAgcHVibGljIGJvb2xlYW4gaXNDbGVhbigpCiAgICAgewogICAgICAgICBmb3IgKE1lbXRhYmxlU2hhcmQgc2hhcmQgOiBzaGFyZHMpCi0gICAgICAgICAgICBpZiAoIXNoYXJkLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGlmICghc2hhcmQuaXNDbGVhbigpKQogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE1lbXRhYmxlLkZhY3RvcnkgZmFjdG9yeSgpCi0gICAgewotICAgICAgICByZXR1cm4gZmFjdG9yeTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBTaG91bGQgb25seSBiZSBjYWxsZWQgYnkgQ29sdW1uRmFtaWx5U3RvcmUuYXBwbHkgdmlhIEtleXNwYWNlLmFwcGx5LCB3aGljaCBzdXBwbGllcyB0aGUgYXBwcm9wcmlhdGUKICAgICAgKiBPcE9yZGVyaW5nLgpAQCAtMzk2LDE0ICszNzAsMTQgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGxvbmdbXSBwYWlyID0gcHJldmlvdXMuYWRkQWxsV2l0aFNpemVEZWx0YSh1cGRhdGUsIGNsb25lciwgb3BHcm91cCwgaW5kZXhlcik7CisgICAgICAgICAgICBCVHJlZVBhcnRpdGlvblVwZGF0ZXIgdXBkYXRlciA9IHByZXZpb3VzLmFkZEFsbCh1cGRhdGUsIGNsb25lciwgb3BHcm91cCwgaW5kZXhlcik7CiAgICAgICAgICAgICB1cGRhdGVNaW4obWluVGltZXN0YW1wLCB1cGRhdGUuc3RhdHMoKS5taW5UaW1lc3RhbXApOwogICAgICAgICAgICAgdXBkYXRlTWluKG1pbkxvY2FsRGVsZXRpb25UaW1lLCB1cGRhdGUuc3RhdHMoKS5taW5Mb2NhbERlbGV0aW9uVGltZSk7Ci0gICAgICAgICAgICBsaXZlRGF0YVNpemUuYWRkQW5kR2V0KGluaXRpYWxTaXplICsgcGFpclswXSk7CisgICAgICAgICAgICBsaXZlRGF0YVNpemUuYWRkQW5kR2V0KGluaXRpYWxTaXplICsgdXBkYXRlci5kYXRhU2l6ZSk7CiAgICAgICAgICAgICBjb2x1bW5zQ29sbGVjdG9yLnVwZGF0ZSh1cGRhdGUuY29sdW1ucygpKTsKICAgICAgICAgICAgIHN0YXRzQ29sbGVjdG9yLnVwZGF0ZSh1cGRhdGUuc3RhdHMoKSk7CiAgICAgICAgICAgICBjdXJyZW50T3BlcmF0aW9ucy5hZGRBbmRHZXQodXBkYXRlLm9wZXJhdGlvbkNvdW50KCkpOwotICAgICAgICAgICAgcmV0dXJuIHBhaXJbMV07CisgICAgICAgICAgICByZXR1cm4gdXBkYXRlci5jb2xVcGRhdGVUaW1lRGVsdGE7CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIE1hcDxQYXJ0aXRpb25Qb3NpdGlvbiwgQXRvbWljQlRyZWVQYXJ0aXRpb24+IGdldFBhcnRpdGlvbnNTdWJNYXAoUGFydGl0aW9uUG9zaXRpb24gbGVmdCwKQEAgLTQzMiw3ICs0MDYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2xlYW4oKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gcGFydGl0aW9ucy5pc0VtcHR5KCk7CiAgICAgICAgIH0KQEAgLTUwMCw5ICs0NzQsOSBAQAogCiAgICAgc3RhdGljIGNsYXNzIExvY2tpbmcgZXh0ZW5kcyBTaGFyZGVkU2tpcExpc3RNZW10YWJsZQogICAgIHsKLSAgICAgICAgTG9ja2luZyhBdG9taWNSZWZlcmVuY2U8Q29tbWl0TG9nUG9zaXRpb24+IGNvbW1pdExvZ0xvd2VyQm91bmQsIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGFSZWYsIE93bmVyIG93bmVyLCBJbnRlZ2VyIHNoYXJkQ291bnRPcHRpb24sIEZhY3RvcnkgZmFjdG9yeSkKKyAgICAgICAgTG9ja2luZyhBdG9taWNSZWZlcmVuY2U8Q29tbWl0TG9nUG9zaXRpb24+IGNvbW1pdExvZ0xvd2VyQm91bmQsIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGFSZWYsIE93bmVyIG93bmVyLCBJbnRlZ2VyIHNoYXJkQ291bnRPcHRpb24pCiAgICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbW1pdExvZ0xvd2VyQm91bmQsIG1ldGFkYXRhUmVmLCBvd25lciwgc2hhcmRDb3VudE9wdGlvbiwgZmFjdG9yeSk7CisgICAgICAgICAgICBzdXBlcihjb21taXRMb2dMb3dlckJvdW5kLCBtZXRhZGF0YVJlZiwgb3duZXIsIHNoYXJkQ291bnRPcHRpb24pOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC01NDcsOCArNTIxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPd25lciBvd25lcikKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIGlzTG9ja2luZwotICAgICAgICAgICAgICAgICAgID8gbmV3IExvY2tpbmcoY29tbWl0TG9nTG93ZXJCb3VuZCwgbWV0YWRhdGFSZWYsIG93bmVyLCBzaGFyZENvdW50LCB0aGlzKQotICAgICAgICAgICAgICAgICAgIDogbmV3IFNoYXJkZWRTa2lwTGlzdE1lbXRhYmxlKGNvbW1pdExvZ0xvd2VyQm91bmQsIG1ldGFkYXRhUmVmLCBvd25lciwgc2hhcmRDb3VudCwgdGhpcyk7CisgICAgICAgICAgICAgICAgICAgPyBuZXcgTG9ja2luZyhjb21taXRMb2dMb3dlckJvdW5kLCBtZXRhZGF0YVJlZiwgb3duZXIsIHNoYXJkQ291bnQpCisgICAgICAgICAgICAgICAgICAgOiBuZXcgU2hhcmRlZFNraXBMaXN0TWVtdGFibGUoY29tbWl0TG9nTG93ZXJCb3VuZCwgbWV0YWRhdGFSZWYsIG93bmVyLCBzaGFyZENvdW50KTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL1NraXBMaXN0TWVtdGFibGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL1NraXBMaXN0TWVtdGFibGUuamF2YQppbmRleCAxN2MwY2NlLi5lNmZlY2VjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9Ta2lwTGlzdE1lbXRhYmxlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvU2tpcExpc3RNZW10YWJsZS5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGU7CiAKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnROYXZpZ2FibGVNYXA7CkBAIC0zNiw5ICszNywxMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZy5Db21taXRMb2dQb3NpdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ2x1c3RlcmluZ0luZGV4RmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5BYnN0cmFjdEJUcmVlUGFydGl0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuQWJzdHJhY3RVbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5BdG9taWNCVHJlZVBhcnRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLkJUcmVlUGFydGl0aW9uRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLkJUcmVlUGFydGl0aW9uVXBkYXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlBhcnRpdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlBhcnRpdGlvblVwZGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcjsKQEAgLTQ5LDE0ICs1MSwxNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5NdXJtdXIzUGFydGl0aW9uZXIuTG9uZ1Rva2VuOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC50cmFuc2FjdGlvbnMuVXBkYXRlVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRzTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PYmplY3RTaXplczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50Lk9wT3JkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5LkNsb25lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuTWVtdGFibGVBbGxvY2F0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5Lk5hdGl2ZUFsbG9jYXRvcjsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk1FTVRBQkxFX09WRVJIRUFEX0NPTVBVVEVfU1RFUFM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTUVNVEFCTEVfT1ZFUkhFQURfU0laRTsKQEAgLTkwLDEyICs5Miw2IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEZhY3RvcnkgZmFjdG9yeSgpCi0gICAgewotICAgICAgICByZXR1cm4gRkFDVE9SWTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc0NsZWFuKCkKICAgICB7CiAgICAgICAgIHJldHVybiBwYXJ0aXRpb25zLmlzRW1wdHkoKTsKQEAgLTEzMSwxNCArMTI3LDE0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBsb25nW10gcGFpciA9IHByZXZpb3VzLmFkZEFsbFdpdGhTaXplRGVsdGEodXBkYXRlLCBjbG9uZXIsIG9wR3JvdXAsIGluZGV4ZXIpOworICAgICAgICBCVHJlZVBhcnRpdGlvblVwZGF0ZXIgdXBkYXRlciA9IHByZXZpb3VzLmFkZEFsbCh1cGRhdGUsIGNsb25lciwgb3BHcm91cCwgaW5kZXhlcik7CiAgICAgICAgIHVwZGF0ZU1pbihtaW5UaW1lc3RhbXAsIHVwZGF0ZS5zdGF0cygpLm1pblRpbWVzdGFtcCk7CiAgICAgICAgIHVwZGF0ZU1pbihtaW5Mb2NhbERlbGV0aW9uVGltZSwgdXBkYXRlLnN0YXRzKCkubWluTG9jYWxEZWxldGlvblRpbWUpOwotICAgICAgICBsaXZlRGF0YVNpemUuYWRkQW5kR2V0KGluaXRpYWxTaXplICsgcGFpclswXSk7CisgICAgICAgIGxpdmVEYXRhU2l6ZS5hZGRBbmRHZXQoaW5pdGlhbFNpemUgKyB1cGRhdGVyLmRhdGFTaXplKTsKICAgICAgICAgY29sdW1uc0NvbGxlY3Rvci51cGRhdGUodXBkYXRlLmNvbHVtbnMoKSk7CiAgICAgICAgIHN0YXRzQ29sbGVjdG9yLnVwZGF0ZSh1cGRhdGUuc3RhdHMoKSk7CiAgICAgICAgIGN1cnJlbnRPcGVyYXRpb25zLmFkZEFuZEdldCh1cGRhdGUub3BlcmF0aW9uQ291bnQoKSk7Ci0gICAgICAgIHJldHVybiBwYWlyWzFdOworICAgICAgICByZXR1cm4gdXBkYXRlci5jb2xVcGRhdGVUaW1lRGVsdGE7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0yMjcsMTMgKzIyMywxOCBAQAogICAgICAgICAgICAgQ2xvbmVyIGNsb25lciA9IGFsbG9jYXRvci5jbG9uZXIoZ3JvdXApOwogICAgICAgICAgICAgQ29uY3VycmVudE5hdmlnYWJsZU1hcDxQYXJ0aXRpb25Qb3NpdGlvbiwgT2JqZWN0PiBwYXJ0aXRpb25zID0gbmV3IENvbmN1cnJlbnRTa2lwTGlzdE1hcDw+KCk7CiAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsID0gbmV3IE9iamVjdCgpOworICAgICAgICAgICAgZmluYWwgaW50IHRlc3RCdWZmZXJTaXplID0gODsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGNvdW50IDsgaSsrKQotICAgICAgICAgICAgICAgIHBhcnRpdGlvbnMucHV0KGNsb25lci5jbG9uZShuZXcgQnVmZmVyRGVjb3JhdGVkS2V5KG5ldyBMb25nVG9rZW4oaSksIEJ5dGVCdWZmZXJVdGlsLkVNUFRZX0JZVEVfQlVGRkVSKSksIHZhbCk7Ci0gICAgICAgICAgICBkb3VibGUgYXZnU2l6ZSA9IE9iamVjdFNpemVzLm1lYXN1cmVEZWVwKHBhcnRpdGlvbnMpIC8gKGRvdWJsZSkgY291bnQ7CisgICAgICAgICAgICAgICAgcGFydGl0aW9ucy5wdXQoY2xvbmVyLmNsb25lKG5ldyBCdWZmZXJEZWNvcmF0ZWRLZXkobmV3IExvbmdUb2tlbihpKSwgQnl0ZUJ1ZmZlci5hbGxvY2F0ZSh0ZXN0QnVmZmVyU2l6ZSkpKSwgdmFsKTsKKyAgICAgICAgICAgIGRvdWJsZSBhdmdTaXplID0gT2JqZWN0U2l6ZXMubWVhc3VyZURlZXBPbWl0U2hhcmVkKHBhcnRpdGlvbnMpIC8gKGRvdWJsZSkgY291bnQ7CiAgICAgICAgICAgICByb3dPdmVyaGVhZCA9IChpbnQpICgoYXZnU2l6ZSAtIE1hdGguZmxvb3IoYXZnU2l6ZSkpIDwgMC4wNSA/IE1hdGguZmxvb3IoYXZnU2l6ZSkgOiBNYXRoLmNlaWwoYXZnU2l6ZSkpOwotICAgICAgICAgICAgcm93T3ZlcmhlYWQgLT0gT2JqZWN0U2l6ZXMubWVhc3VyZURlZXAobmV3IExvbmdUb2tlbigwKSk7CisgICAgICAgICAgICByb3dPdmVyaGVhZCAtPSBuZXcgTG9uZ1Rva2VuKDApLmdldEhlYXBTaXplKCk7CiAgICAgICAgICAgICByb3dPdmVyaGVhZCArPSBBdG9taWNCVHJlZVBhcnRpdGlvbi5FTVBUWV9TSVpFOwotICAgICAgICAgICAgcm93T3ZlcmhlYWQgKz0gQWJzdHJhY3RCVHJlZVBhcnRpdGlvbi5IT0xERVJfVU5TSEFSRURfSEVBUF9TSVpFOworICAgICAgICAgICAgcm93T3ZlcmhlYWQgKz0gQlRyZWVQYXJ0aXRpb25EYXRhLlVOU0hBUkVEX0hFQVBfU0laRTsKKyAgICAgICAgICAgIGlmICghKGFsbG9jYXRvciBpbnN0YW5jZW9mIE5hdGl2ZUFsbG9jYXRvcikpCisgICAgICAgICAgICAgICAgcm93T3ZlcmhlYWQgLT0gdGVzdEJ1ZmZlclNpemU7ICAvLyBtZWFzdXJlRGVlcE9taXRTaGFyZWQgaW5jbHVkZXMgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcyBldmVuIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2ZmLWhlYXAgYnVmZmVycywgYnV0IG5vdCBmb3IgZGlyZWN0IG1lbW9yeS4KKyAgICAgICAgICAgIC8vIERlY29yYXRlZCBrZXkgb3ZlcmhlYWQgd2l0aCBieXRlIGJ1ZmZlciAoaWYgbmVlZGVkKSBpcyBpbmNsdWRlZAogICAgICAgICAgICAgYWxsb2NhdG9yLnNldERpc2NhcmRpbmcoKTsKICAgICAgICAgICAgIGFsbG9jYXRvci5zZXREaXNjYXJkZWQoKTsKICAgICAgICAgICAgIHJldHVybiByb3dPdmVyaGVhZDsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL1RyaWVNZW10YWJsZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvVHJpZU1lbXRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkNTk3OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL1RyaWVNZW10YWJsZS5qYXZhCkBAIC0wLDAgKzEsNzI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk5hdmlnYWJsZVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhdG9yczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5CdWZmZXJEZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EYXRhUmFuZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlbGV0aW9uSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5QYXJ0aXRpb25Qb3NpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWd1bGFyQW5kU3RhdGljQ29sdW1uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbGljZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZ1Bvc2l0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5DbHVzdGVyaW5nSW5kZXhGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLkFic3RyYWN0VW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuQlRyZWVQYXJ0aXRpb25EYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuQlRyZWVQYXJ0aXRpb25VcGRhdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuSW1tdXRhYmxlQlRyZWVQYXJ0aXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5QYXJ0aXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5QYXJ0aXRpb25VcGRhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5VbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5FbmNvZGluZ1N0YXRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzLkluTWVtb3J5VHJpZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllcy5UcmllOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5BYnN0cmFjdEJvdW5kczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQm91bmRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JbmNsdWRpbmdFeGNsdWRpbmdCb3VuZHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnRyYW5zYWN0aW9ucy5VcGRhdGVUcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzcy5CdWZmZXJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVJlYWRzTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5UYWJsZU1ldHJpY3M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5UcmllTWVtdGFibGVNZXRyaWNzVmlldzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jazsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuT3BPcmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuRW5zdXJlT25IZWFwOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5NZW10YWJsZUFsbG9jYXRvcjsKK2ltcG9ydCBvcmcuZ2l0aHViLmphbW0uVW5tZXRlcmVkOworCisvKioKKyAqIFRyaWUgbWVtdGFibGUgaW1wbGVtZW50YXRpb24uIEltcHJvdmVzIG1lbW9yeSB1c2FnZSwgZ2FyYmFnZSBjb2xsZWN0aW9uIGVmZmljaWVuY3kgYW5kIGxvb2t1cCBwZXJmb3JtYW5jZS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBkZXNjcmliZWQgaW4gZGV0YWlsIGluIHRoZSBwYXBlcjoKKyAqICAgICAgIGh0dHBzOi8vd3d3LnZsZGIub3JnL3B2bGRiL3ZvbDE1L3AzMzU5LWxhbWJvdi5wZGYKKyAqCisgKiBUaGUgY29uZmlndXJhdGlvbiB0YWtlcyBhIHNpbmdsZSBwYXJhbWV0ZXI6CisgKiAtIHNoYXJkczogdGhlIG51bWJlciBvZiBzaGFyZHMgdG8gc3BsaXQgaW50bywgZGVmYXVsdGluZyB0byB0aGUgbnVtYmVyIG9mIENQVSBjb3Jlcy4KKyAqCisgKiBBbHNvIHNlZSBNZW10YWJsZV9BUEkubWQuCisgKi8KK3B1YmxpYyBjbGFzcyBUcmllTWVtdGFibGUgZXh0ZW5kcyBBYnN0cmFjdFNoYXJkZWRNZW10YWJsZQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUcmllTWVtdGFibGUuY2xhc3MpOworCisgICAgLyoqIEJ1ZmZlciB0eXBlIHRvIHVzZSBmb3IgbWVtdGFibGUgdHJpZXMgKG9uLSB2cyBvZmYtaGVhcCkgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJ1ZmZlclR5cGUgQlVGRkVSX1RZUEU7CisKKyAgICBzdGF0aWMKKyAgICB7CisgICAgICAgIHN3aXRjaCAoRGF0YWJhc2VEZXNjcmlwdG9yLmdldE1lbXRhYmxlQWxsb2NhdGlvblR5cGUoKSkKKyAgICAgICAgeworICAgICAgICBjYXNlIHVuc2xhYmJlZF9oZWFwX2J1ZmZlcnM6CisgICAgICAgIGNhc2UgaGVhcF9idWZmZXJzOgorICAgICAgICAgICAgQlVGRkVSX1RZUEUgPSBCdWZmZXJUeXBlLk9OX0hFQVA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBvZmZoZWFwX2J1ZmZlcnM6CisgICAgICAgIGNhc2Ugb2ZmaGVhcF9vYmplY3RzOgorICAgICAgICAgICAgQlVGRkVSX1RZUEUgPSBCdWZmZXJUeXBlLk9GRl9IRUFQOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBJZiBrZXlzIGlzIGJlbG93IHRoaXMgbGVuZ3RoLCB3ZSB3aWxsIHVzZSBhIHJlY3Vyc2l2ZSBwcm9jZWR1cmUgZm9yIGluc2VydGluZyBkYXRhIGluIHRoZSBtZW10YWJsZSB0cmllLiAqLworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9SRUNVUlNJVkVfS0VZX0xFTkdUSCA9IDEyODsKKworICAgIC8qKiBUaGUgYnl0ZS1vcmRlcmluZyBjb252ZXJzaW9uIHZlcnNpb24gdG8gdXNlIGZvciBtZW10YWJsZXMuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIEJZVEVfQ09NUEFSQUJMRV9WRVJTSU9OID0gQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5PU1M1MDsKKworICAgIC8vIFNldCB0byB0cnVlIHdoZW4gdGhlIG1lbXRhYmxlIHJlcXVlc3RzIGEgc3dpdGNoIChlLmcuIGZvciB0cmllIHNpemUgbGltaXQgYmVpbmcgcmVhY2hlZCkgdG8gZW5zdXJlIG9ubHkgb25lCisgICAgLy8gdGhyZWFkIGNhbGxzIGNmcy5zd2l0Y2hNZW10YWJsZUlmQ3VycmVudC4KKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY0Jvb2xlYW4gc3dpdGNoUmVxdWVzdGVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworCisgICAgLyoqCisgICAgICogU2hhcmRlZCBtZW10YWJsZSBzZWN0aW9ucy4gRWFjaCBpcyByZXNwb25zaWJsZSBmb3IgYSBjb250aWd1b3VzIHJhbmdlIG9mIHRoZSB0b2tlbiBzcGFjZSAoYmV0d2VlbiBib3VuZGFyaWVzW2ldCisgICAgICogYW5kIGJvdW5kYXJpZXNbaSsxXSkgYW5kIGlzIHdyaXR0ZW4gdG8gYnkgb25lIHRocmVhZCBhdCBhIHRpbWUsIHdoaWxlIHJlYWRzIGFyZSBjYXJyaWVkIG91dCBjb25jdXJyZW50bHkKKyAgICAgKiAoaW5jbHVkaW5nIHdpdGggYW55IHdyaXRlKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIE1lbXRhYmxlU2hhcmRbXSBzaGFyZHM7CisKKyAgICAvKioKKyAgICAgKiBBIG1lcmdlZCB2aWV3IG9mIHRoZSBtZW10YWJsZSBtYXAuIFVzZWQgZm9yIHBhcnRpdGlvbiByYW5nZSBxdWVyaWVzIGFuZCBmbHVzaC4KKyAgICAgKiBGb3IgZWZmaWNpZW5jeSB3ZSBzZXJ2ZSBzaW5nbGUgcGFydGl0aW9uIHJlcXVlc3RzIG9mZiB0aGUgc2hhcmQgd2hpY2ggb2ZmZXJzIG1vcmUgZGlyZWN0IEluTWVtb3J5VHJpZSBtZXRob2RzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgVHJpZTxCVHJlZVBhcnRpdGlvbkRhdGE+IG1lcmdlZFRyaWU7CisKKyAgICBAVW5tZXRlcmVkCisgICAgcHJpdmF0ZSBmaW5hbCBUcmllTWVtdGFibGVNZXRyaWNzVmlldyBtZXRyaWNzOworCisgICAgVHJpZU1lbXRhYmxlKEF0b21pY1JlZmVyZW5jZTxDb21taXRMb2dQb3NpdGlvbj4gY29tbWl0TG9nTG93ZXJCb3VuZCwgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YVJlZiwgT3duZXIgb3duZXIsIEludGVnZXIgc2hhcmRDb3VudE9wdGlvbikKKyAgICB7CisgICAgICAgIHN1cGVyKGNvbW1pdExvZ0xvd2VyQm91bmQsIG1ldGFkYXRhUmVmLCBvd25lciwgc2hhcmRDb3VudE9wdGlvbik7CisgICAgICAgIHRoaXMubWV0cmljcyA9IG5ldyBUcmllTWVtdGFibGVNZXRyaWNzVmlldyhtZXRhZGF0YVJlZi5rZXlzcGFjZSwgbWV0YWRhdGFSZWYubmFtZSk7CisgICAgICAgIHRoaXMuc2hhcmRzID0gZ2VuZXJhdGVQYXJ0aXRpb25TaGFyZHMoYm91bmRhcmllcy5zaGFyZENvdW50KCksIGFsbG9jYXRvciwgbWV0YWRhdGFSZWYsIG1ldHJpY3MpOworICAgICAgICB0aGlzLm1lcmdlZFRyaWUgPSBtYWtlTWVyZ2VkVHJpZShzaGFyZHMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1lbXRhYmxlU2hhcmRbXSBnZW5lcmF0ZVBhcnRpdGlvblNoYXJkcyhpbnQgc3BsaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW10YWJsZUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWVNZW10YWJsZU1ldHJpY3NWaWV3IG1ldHJpY3MpCisgICAgeworICAgICAgICBNZW10YWJsZVNoYXJkW10gcGFydGl0aW9uTWFwQ29udGFpbmVyID0gbmV3IE1lbXRhYmxlU2hhcmRbc3BsaXRzXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGxpdHM7IGkrKykKKyAgICAgICAgICAgIHBhcnRpdGlvbk1hcENvbnRhaW5lcltpXSA9IG5ldyBNZW10YWJsZVNoYXJkKG1ldGFkYXRhLCBhbGxvY2F0b3IsIG1ldHJpY3MpOworCisgICAgICAgIHJldHVybiBwYXJ0aXRpb25NYXBDb250YWluZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgVHJpZTxCVHJlZVBhcnRpdGlvbkRhdGE+IG1ha2VNZXJnZWRUcmllKE1lbXRhYmxlU2hhcmRbXSBzaGFyZHMpCisgICAgeworICAgICAgICBMaXN0PFRyaWU8QlRyZWVQYXJ0aXRpb25EYXRhPj4gdHJpZXMgPSBuZXcgQXJyYXlMaXN0PD4oc2hhcmRzLmxlbmd0aCk7CisgICAgICAgIGZvciAoTWVtdGFibGVTaGFyZCBzaGFyZCA6IHNoYXJkcykKKyAgICAgICAgICAgIHRyaWVzLmFkZChzaGFyZC5kYXRhKTsKKyAgICAgICAgcmV0dXJuIFRyaWUubWVyZ2VEaXN0aW5jdCh0cmllcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNDbGVhbigpCisgICAgeworICAgICAgICBmb3IgKE1lbXRhYmxlU2hhcmQgc2hhcmQgOiBzaGFyZHMpCisgICAgICAgICAgICBpZiAoIXNoYXJkLmlzQ2xlYW4oKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRpc2NhcmQoKQorICAgIHsKKyAgICAgICAgc3VwZXIuZGlzY2FyZCgpOworICAgICAgICAvLyBtZXRyaWNzIGhlcmUgYXJlIG5vdCB0aHJlYWQgc2FmZSwgYnV0IEkgdGhpbmsgd2UgY2FuIGxpdmUgd2l0aCB0aGF0CisgICAgICAgIG1ldHJpY3MubGFzdEZsdXNoU2hhcmREYXRhU2l6ZXMucmVzZXQoKTsKKyAgICAgICAgZm9yIChNZW10YWJsZVNoYXJkIHNoYXJkIDogc2hhcmRzKQorICAgICAgICB7CisgICAgICAgICAgICBtZXRyaWNzLmxhc3RGbHVzaFNoYXJkRGF0YVNpemVzLnVwZGF0ZShzaGFyZC5saXZlRGF0YVNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gdGhlIGJ1ZmZlciByZWxlYXNlIGlzIGEgbG9uZ2VyLXJ1bm5pbmcgcHJvY2VzcywgZG8gaXQgaW4gYSBzZXBhcmF0ZSBsb29wIHRvIG5vdCBtYWtlIHRoZSBtZXRyaWNzIHVwZGF0ZSB3YWl0CisgICAgICAgIGZvciAoTWVtdGFibGVTaGFyZCBzaGFyZCA6IHNoYXJkcykKKyAgICAgICAgeworICAgICAgICAgICAgc2hhcmQuZGF0YS5kaXNjYXJkQnVmZmVycygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IENvbHVtbkZhbWlseVN0b3JlLmFwcGx5IHZpYSBLZXlzcGFjZS5hcHBseSwgd2hpY2ggc3VwcGxpZXMgdGhlIGFwcHJvcHJpYXRlCisgICAgICogT3BPcmRlcmluZy4KKyAgICAgKgorICAgICAqIGNvbW1pdExvZ1NlZ21lbnRQb3NpdGlvbiBzaG91bGQgb25seSBiZSBudWxsIGlmIHRoaXMgaXMgYSBzZWNvbmRhcnkgaW5kZXgsIGluIHdoaWNoIGNhc2UgaXQgaXMgKmV4cGVjdGVkKiB0byBiZSBudWxsCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgcHV0KFBhcnRpdGlvblVwZGF0ZSB1cGRhdGUsIFVwZGF0ZVRyYW5zYWN0aW9uIGluZGV4ZXIsIE9wT3JkZXIuR3JvdXAgb3BHcm91cCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gdXBkYXRlLnBhcnRpdGlvbktleSgpOworICAgICAgICAgICAgTWVtdGFibGVTaGFyZCBzaGFyZCA9IHNoYXJkc1tib3VuZGFyaWVzLmdldFNoYXJkRm9yS2V5KGtleSldOworICAgICAgICAgICAgbG9uZyBjb2xVcGRhdGVUaW1lRGVsdGEgPSBzaGFyZC5wdXQoa2V5LCB1cGRhdGUsIGluZGV4ZXIsIG9wR3JvdXApOworCisgICAgICAgICAgICBpZiAoc2hhcmQuZGF0YS5yZWFjaGVkQWxsb2NhdGVkU2l6ZVRocmVzaG9sZCgpICYmICFzd2l0Y2hSZXF1ZXN0ZWQuZ2V0QW5kU2V0KHRydWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJTY2hlZHVsaW5nIGZsdXNoIGR1ZSB0byB0cmllIHNpemUgbGltaXQgcmVhY2hlZC4iKTsKKyAgICAgICAgICAgICAgICBvd25lci5zaWduYWxGbHVzaFJlcXVpcmVkKHRoaXMsIENvbHVtbkZhbWlseVN0b3JlLkZsdXNoUmVhc29uLk1FTVRBQkxFX0xJTUlUKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGNvbFVwZGF0ZVRpbWVEZWx0YTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW5NZW1vcnlUcmllLlNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBhcyB7QGxpbmsgSW5NZW1vcnlUcmllI3JlYWNoZWRBbGxvY2F0ZWRTaXplVGhyZXNob2xkfSBzaG91bGQgYmVjb21lCisgICAgICAgICAgICAvLyB0cnVlIGFuZCB0cmlnZ2VyIGEgbWVtdGFibGUgc3dpdGNoIGxvbmcgYmVmb3JlIHRoaXMgbGltaXQgaXMgcmVhY2hlZC4KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZWNobmljYWxseSB3ZSBzaG91bGQgc2NhdHRlciBnYXRoZXIgb24gYWxsIHRoZSBjb3JlIHRocmVhZHMgYmVjYXVzZSB0aGUgc2l6ZSBpbiBmb2xsb3dpbmcgY2FsbHMgYXJlIG5vdAorICAgICAqIHVzaW5nIHZvbGF0aWxlIHZhcmlhYmxlcywgYnV0IGZvciBtZXRyaWNzIHB1cnBvc2UgdGhpcyBzaG91bGQgYmUgZ29vZCBlbm91Z2guCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0TGl2ZURhdGFTaXplKCkKKyAgICB7CisgICAgICAgIGxvbmcgdG90YWwgPSAwTDsKKyAgICAgICAgZm9yIChNZW10YWJsZVNoYXJkIHNoYXJkIDogc2hhcmRzKQorICAgICAgICAgICAgdG90YWwgKz0gc2hhcmQubGl2ZURhdGFTaXplKCk7CisgICAgICAgIHJldHVybiB0b3RhbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBvcGVyYXRpb25Db3VudCgpCisgICAgeworICAgICAgICBsb25nIHRvdGFsID0gMEw7CisgICAgICAgIGZvciAoTWVtdGFibGVTaGFyZCBzaGFyZCA6IHNoYXJkcykKKyAgICAgICAgICAgIHRvdGFsICs9IHNoYXJkLmN1cnJlbnRPcGVyYXRpb25zKCk7CisgICAgICAgIHJldHVybiB0b3RhbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBwYXJ0aXRpb25Db3VudCgpCisgICAgeworICAgICAgICBpbnQgdG90YWwgPSAwOworICAgICAgICBmb3IgKE1lbXRhYmxlU2hhcmQgc2hhcmQgOiBzaGFyZHMpCisgICAgICAgICAgICB0b3RhbCArPSBzaGFyZC5zaXplKCk7CisgICAgICAgIHJldHVybiB0b3RhbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtaW5UUyBpZiBvbmUgYXZhaWxhYmxlLCBvdGhlcndpc2UgTk9fTUlOX1RJTUVTVEFNUC4KKyAgICAgKgorICAgICAqIEVuY29kaW5nU3RhdHMgdXNlcyBhIHN5bnRoZXRpYyBlcG9jaCBUUyBhdCAyMDE1LiBXZSBkb24ndCB3YW50IHRvIGxlYWsgdGhhdCAoQ0FTU0FORFJBLTE4MTE4KSBzbyB3ZSByZXR1cm4gTk9fTUlOX1RJTUVTVEFNUCBpbnN0ZWFkLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbWluVFMgb3IgTk9fTUlOX1RJTUVTVEFNUCBpZiBub25lIGF2YWlsYWJsZQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldE1pblRpbWVzdGFtcCgpCisgICAgeworICAgICAgICBsb25nIG1pbiA9IExvbmcuTUFYX1ZBTFVFOworICAgICAgICBmb3IgKE1lbXRhYmxlU2hhcmQgc2hhcmQgOiBzaGFyZHMpCisgICAgICAgICAgICBtaW4gPSAgTG9uZy5taW4obWluLCBzaGFyZC5taW5UaW1lc3RhbXAoKSk7CisgICAgICAgIHJldHVybiBtaW4gIT0gRW5jb2RpbmdTdGF0cy5OT19TVEFUUy5taW5UaW1lc3RhbXAgPyBtaW4gOiBOT19NSU5fVElNRVNUQU1QOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0TWluTG9jYWxEZWxldGlvblRpbWUoKQorICAgIHsKKyAgICAgICAgaW50IG1pbiA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICBmb3IgKE1lbXRhYmxlU2hhcmQgc2hhcmQgOiBzaGFyZHMpCisgICAgICAgICAgICBtaW4gPSAgSW50ZWdlci5taW4obWluLCBzaGFyZC5taW5Mb2NhbERlbGV0aW9uVGltZSgpKTsKKyAgICAgICAgcmV0dXJuIG1pbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBSZWd1bGFyQW5kU3RhdGljQ29sdW1ucyBjb2x1bW5zKCkKKyAgICB7CisgICAgICAgIGZvciAoTWVtdGFibGVTaGFyZCBzaGFyZCA6IHNoYXJkcykKKyAgICAgICAgICAgIGNvbHVtbnNDb2xsZWN0b3IudXBkYXRlKHNoYXJkLmNvbHVtbnNDb2xsZWN0b3IpOworICAgICAgICByZXR1cm4gY29sdW1uc0NvbGxlY3Rvci5nZXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBFbmNvZGluZ1N0YXRzIGVuY29kaW5nU3RhdHMoKQorICAgIHsKKyAgICAgICAgZm9yIChNZW10YWJsZVNoYXJkIHNoYXJkIDogc2hhcmRzKQorICAgICAgICAgICAgc3RhdHNDb2xsZWN0b3IudXBkYXRlKHNoYXJkLnN0YXRzQ29sbGVjdG9yLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIHN0YXRzQ29sbGVjdG9yLmdldCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZW10YWJsZVVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvciBwYXJ0aXRpb25JdGVyYXRvcihmaW5hbCBDb2x1bW5GaWx0ZXIgY29sdW1uRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBEYXRhUmFuZ2UgZGF0YVJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZHNMaXN0ZW5lciByZWFkc0xpc3RlbmVyKQorICAgIHsKKyAgICAgICAgQWJzdHJhY3RCb3VuZHM8UGFydGl0aW9uUG9zaXRpb24+IGtleVJhbmdlID0gZGF0YVJhbmdlLmtleVJhbmdlKCk7CisKKyAgICAgICAgUGFydGl0aW9uUG9zaXRpb24gbGVmdCA9IGtleVJhbmdlLmxlZnQ7CisgICAgICAgIFBhcnRpdGlvblBvc2l0aW9uIHJpZ2h0ID0ga2V5UmFuZ2UucmlnaHQ7CisgICAgICAgIGlmIChsZWZ0LmlzTWluaW11bSgpKQorICAgICAgICAgICAgbGVmdCA9IG51bGw7CisgICAgICAgIGlmIChyaWdodC5pc01pbmltdW0oKSkKKyAgICAgICAgICAgIHJpZ2h0ID0gbnVsbDsKKworICAgICAgICBib29sZWFuIGlzQm91bmQgPSBrZXlSYW5nZSBpbnN0YW5jZW9mIEJvdW5kczsKKyAgICAgICAgYm9vbGVhbiBpbmNsdWRlU3RhcnQgPSBpc0JvdW5kIHx8IGtleVJhbmdlIGluc3RhbmNlb2YgSW5jbHVkaW5nRXhjbHVkaW5nQm91bmRzOworICAgICAgICBib29sZWFuIGluY2x1ZGVTdG9wID0gaXNCb3VuZCB8fCBrZXlSYW5nZSBpbnN0YW5jZW9mIFJhbmdlOworCisgICAgICAgIFRyaWU8QlRyZWVQYXJ0aXRpb25EYXRhPiBzdWJNYXAgPSBtZXJnZWRUcmllLnN1YnRyaWUobGVmdCwgaW5jbHVkZVN0YXJ0LCByaWdodCwgaW5jbHVkZVN0b3ApOworCisgICAgICAgIHJldHVybiBuZXcgTWVtdGFibGVVbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3IobWV0YWRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3IuZW5zdXJlT25IZWFwKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmFuZ2UpOworICAgICAgICAvLyByZWFkc0xpc3RlbmVyIGlzIGlnbm9yZWQgYXMgaXQgb25seSBhY2NlcHRzIHNzdGFibGUgc2lnbmFscworICAgIH0KKworICAgIHByaXZhdGUgUGFydGl0aW9uIGdldFBhcnRpdGlvbihEZWNvcmF0ZWRLZXkga2V5KQorICAgIHsKKyAgICAgICAgaW50IHNoYXJkSW5kZXggPSBib3VuZGFyaWVzLmdldFNoYXJkRm9yS2V5KGtleSk7CisgICAgICAgIEJUcmVlUGFydGl0aW9uRGF0YSBkYXRhID0gc2hhcmRzW3NoYXJkSW5kZXhdLmRhdGEuZ2V0KGtleSk7CisgICAgICAgIGlmIChkYXRhICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gY3JlYXRlUGFydGl0aW9uKG1ldGFkYXRhKCksIGFsbG9jYXRvci5lbnN1cmVPbkhlYXAoKSwga2V5LCBkYXRhKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciByb3dJdGVyYXRvcihEZWNvcmF0ZWRLZXkga2V5LCBTbGljZXMgc2xpY2VzLCBDb2x1bW5GaWx0ZXIgc2VsZWN0ZWRDb2x1bW5zLCBib29sZWFuIHJldmVyc2VkLCBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICB7CisgICAgICAgIFBhcnRpdGlvbiBwID0gZ2V0UGFydGl0aW9uKGtleSk7CisgICAgICAgIGlmIChwID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHAudW5maWx0ZXJlZEl0ZXJhdG9yKHNlbGVjdGVkQ29sdW1ucywgc2xpY2VzLCByZXZlcnNlZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciByb3dJdGVyYXRvcihEZWNvcmF0ZWRLZXkga2V5KQorICAgIHsKKyAgICAgICAgUGFydGl0aW9uIHAgPSBnZXRQYXJ0aXRpb24oa2V5KTsKKyAgICAgICAgcmV0dXJuIHAgIT0gbnVsbCA/IHAudW5maWx0ZXJlZEl0ZXJhdG9yKCkgOiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1lbXRhYmxlUGFydGl0aW9uIGNyZWF0ZVBhcnRpdGlvbihUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBFbnN1cmVPbkhlYXAgZW5zdXJlT25IZWFwLCBEZWNvcmF0ZWRLZXkga2V5LCBCVHJlZVBhcnRpdGlvbkRhdGEgZGF0YSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgTWVtdGFibGVQYXJ0aXRpb24obWV0YWRhdGEsIGVuc3VyZU9uSGVhcCwga2V5LCBkYXRhKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNZW10YWJsZVBhcnRpdGlvbiBnZXRQYXJ0aXRpb25Gcm9tVHJpZUVudHJ5KFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsIEVuc3VyZU9uSGVhcCBlbnN1cmVPbkhlYXAsIE1hcC5FbnRyeTxCeXRlQ29tcGFyYWJsZSwgQlRyZWVQYXJ0aXRpb25EYXRhPiBlbikKKyAgICB7CisgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBCdWZmZXJEZWNvcmF0ZWRLZXkuZnJvbUJ5dGVDb21wYXJhYmxlKGVuLmdldEtleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCWVRFX0NPTVBBUkFCTEVfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEucGFydGl0aW9uZXIpOworICAgICAgICByZXR1cm4gY3JlYXRlUGFydGl0aW9uKG1ldGFkYXRhLCBlbnN1cmVPbkhlYXAsIGtleSwgZW4uZ2V0VmFsdWUoKSk7CisgICAgfQorCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRmx1c2hhYmxlUGFydGl0aW9uU2V0PE1lbXRhYmxlUGFydGl0aW9uPiBnZXRGbHVzaFNldChQYXJ0aXRpb25Qb3NpdGlvbiBmcm9tLCBQYXJ0aXRpb25Qb3NpdGlvbiB0bykKKyAgICB7CisgICAgICAgIFRyaWU8QlRyZWVQYXJ0aXRpb25EYXRhPiB0b0ZsdXNoID0gbWVyZ2VkVHJpZS5zdWJ0cmllKGZyb20sIHRydWUsIHRvLCBmYWxzZSk7CisgICAgICAgIGxvbmcga2V5U2l6ZSA9IDA7CisgICAgICAgIGludCBrZXlDb3VudCA9IDA7CisKKyAgICAgICAgZm9yIChJdGVyYXRvcjxNYXAuRW50cnk8Qnl0ZUNvbXBhcmFibGUsIEJUcmVlUGFydGl0aW9uRGF0YT4+IGl0ID0gdG9GbHVzaC5lbnRyeUl0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBNYXAuRW50cnk8Qnl0ZUNvbXBhcmFibGUsIEJUcmVlUGFydGl0aW9uRGF0YT4gZW4gPSBpdC5uZXh0KCk7CisgICAgICAgICAgICBieXRlW10ga2V5Qnl0ZXMgPSBEZWNvcmF0ZWRLZXkua2V5RnJvbUJ5dGVTb3VyY2UoQnl0ZVNvdXJjZS5wZWVrYWJsZShlbi5nZXRLZXkoKS5hc0NvbXBhcmFibGVCeXRlcyhCWVRFX0NPTVBBUkFCTEVfVkVSU0lPTikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJZVEVfQ09NUEFSQUJMRV9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhKCkucGFydGl0aW9uZXIpOworICAgICAgICAgICAga2V5U2l6ZSArPSBrZXlCeXRlcy5sZW5ndGg7CisgICAgICAgICAgICBrZXlDb3VudCsrOworICAgICAgICB9CisgICAgICAgIGxvbmcgcGFydGl0aW9uS2V5U2l6ZSA9IGtleVNpemU7CisgICAgICAgIGludCBwYXJ0aXRpb25Db3VudCA9IGtleUNvdW50OworCisgICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RGbHVzaGFibGVQYXJ0aXRpb25TZXQ8TWVtdGFibGVQYXJ0aXRpb24+KCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIE1lbXRhYmxlIG1lbXRhYmxlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJpZU1lbXRhYmxlLnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBQYXJ0aXRpb25Qb3NpdGlvbiBmcm9tKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZnJvbTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFBhcnRpdGlvblBvc2l0aW9uIHRvKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIHBhcnRpdGlvbkNvdW50KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFydGl0aW9uQ291bnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxNZW10YWJsZVBhcnRpdGlvbj4gaXRlcmF0b3IoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBJdGVyYXRvcnMudHJhbnNmb3JtKHRvRmx1c2guZW50cnlJdGVyYXRvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIER1cmluZyBmbHVzaGluZyB3ZSBhcmUgY2VydGFpbiB0aGUgbWVtdGFibGUgd2lsbCByZW1haW4gYXQgbGVhc3QgdW50aWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZmx1c2ggY29tcGxldGVzLiBObyBjb3B5aW5nIHRvIGhlYXAgaXMgbmVjZXNzYXJ5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5IC0+IGdldFBhcnRpdGlvbkZyb21UcmllRW50cnkobWV0YWRhdGEoKSwgRW5zdXJlT25IZWFwLk5PT1AsIGVudHJ5KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIHBhcnRpdGlvbktleXNTaXplKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFydGl0aW9uS2V5U2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTWVtdGFibGVTaGFyZAorICAgIHsKKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZvbGF0aWxlIGFzIHdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgd2hlbiB3ZQorICAgICAgICAvLyBjb2xsZWN0IHJlc3VsdHMgZnJvbSBhbGwgc3ViLXJhbmdlcywgdGhlIHRocmVhZCBhY2Nlc3NpbmcgdGhlIHZhbHVlCisgICAgICAgIC8vIGlzIGd1YXJhbnRlZWQgdG8gc2VlIHRoZSBjaGFuZ2VzIHRvIHRoZSB2YWx1ZXMuCisKKyAgICAgICAgLy8gVGhlIHNtYWxsZXN0IHRpbWVzdGFtcCBmb3IgYWxsIHBhcnRpdGlvbnMgc3RvcmVkIGluIHRoaXMgc2hhcmQKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBsb25nIG1pblRpbWVzdGFtcCA9IExvbmcuTUFYX1ZBTFVFOworCisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IG1pbkxvY2FsRGVsZXRpb25UaW1lID0gSW50ZWdlci5NQVhfVkFMVUU7CisKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBsb25nIGxpdmVEYXRhU2l6ZSA9IDA7CisKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBsb25nIGN1cnJlbnRPcGVyYXRpb25zID0gMDsKKworICAgICAgICBAVW5tZXRlcmVkCisgICAgICAgIHByaXZhdGUgZmluYWwgUmVlbnRyYW50TG9jayB3cml0ZUxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOworCisgICAgICAgIC8vIENvbnRlbnQgbWFwIGZvciB0aGUgZ2l2ZW4gc2hhcmQuIFRoaXMgaXMgaW1wbGVtZW50ZWQgYXMgYSBtZW10YWJsZSB0cmllIHdoaWNoIHVzZXMgdGhlIHByZWZpeC1mcmVlCisgICAgICAgIC8vIGJ5dGUtY29tcGFyYWJsZSBCeXRlU291cmNlIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUga2V5cyB0byBhZGRyZXNzIHRoZSBwYXJ0aXRpb25zLgorICAgICAgICAvLworICAgICAgICAvLyBUaGlzIG1hcCBpcyB1c2VkIGluIGEgc2luZ2xlLXByb2R1Y2VyLCBtdWx0aS1jb25zdW1lciBmYXNoaW9uOiBvbmx5IG9uZSB0aHJlYWQgd2lsbCBpbnNlcnQgaXRlbXMgYnV0CisgICAgICAgIC8vIHNldmVyYWwgdGhyZWFkcyBtYXkgcmVhZCBmcm9tIGl0IGFuZCBpdGVyYXRlIG92ZXIgaXQuIEl0ZXJhdG9ycyAoZXNwZWNpYWxseSBwYXJ0aXRpb24gcmFuZ2UgaXRlcmF0b3JzKQorICAgICAgICAvLyBtYXkgb3BlcmF0ZSBmb3IgYSBsb25nIHBlcmlvZCBvZiB0aW1lIGFuZCB0aHVzIGl0ZXJhdG9ycyBzaG91bGQgbm90IHRocm93IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb25zCisgICAgICAgIC8vIGlmIHRoZSB1bmRlcmx5aW5nIG1hcCBpcyBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLCB0aGV5IHNob3VsZCBwcm92aWRlIGEgd2Vha2x5IGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgbWFwCisgICAgICAgIC8vIGluc3RlYWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIEFsc28sIHRoaXMgZGF0YSBpcyBiYWNrZWQgYnkgbWVtdGFibGUgbWVtb3J5LCB3aGVuIGFjY2Vzc2luZyBpdCBjYWxsZXJzIG11c3Qgc3BlY2lmeSBpZiBpdCBjYW4gYmUgYWNjZXNzZWQKKyAgICAgICAgLy8gdW5zYWZlbHksIG1lYW5pbmcgdGhhdCB0aGUgbWVtdGFibGUgd2lsbCBub3QgYmUgZGlzY2FyZGVkIGFzIGxvbmcgYXMgdGhlIGRhdGEgaXMgdXNlZCwgb3Igd2hldGhlciB0aGUgZGF0YQorICAgICAgICAvLyBzaG91bGQgYmUgY29waWVkIG9uIGhlYXAgZm9yIG9mZi1oZWFwIGFsbG9jYXRvcnMuCisgICAgICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgICAgICBmaW5hbCBJbk1lbW9yeVRyaWU8QlRyZWVQYXJ0aXRpb25EYXRhPiBkYXRhOworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ29sdW1uc0NvbGxlY3RvciBjb2x1bW5zQ29sbGVjdG9yOworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RhdHNDb2xsZWN0b3Igc3RhdHNDb2xsZWN0b3I7CisKKyAgICAgICAgQFVubWV0ZXJlZCAgLy8gdG90YWwgcG9vbCBzaXplIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gbWVtdGFibGUncyBkZWVwIHNpemUKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZW10YWJsZUFsbG9jYXRvciBhbGxvY2F0b3I7CisKKyAgICAgICAgQFVubWV0ZXJlZAorICAgICAgICBwcml2YXRlIGZpbmFsIFRyaWVNZW10YWJsZU1ldHJpY3NWaWV3IG1ldHJpY3M7CisKKyAgICAgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgICAgIE1lbXRhYmxlU2hhcmQoVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YSwgTWVtdGFibGVBbGxvY2F0b3IgYWxsb2NhdG9yLCBUcmllTWVtdGFibGVNZXRyaWNzVmlldyBtZXRyaWNzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmRhdGEgPSBuZXcgSW5NZW1vcnlUcmllPD4oQlVGRkVSX1RZUEUpOworICAgICAgICAgICAgdGhpcy5jb2x1bW5zQ29sbGVjdG9yID0gbmV3IEFic3RyYWN0TWVtdGFibGUuQ29sdW1uc0NvbGxlY3RvcihtZXRhZGF0YS5nZXQoKS5yZWd1bGFyQW5kU3RhdGljQ29sdW1ucygpKTsKKyAgICAgICAgICAgIHRoaXMuc3RhdHNDb2xsZWN0b3IgPSBuZXcgQWJzdHJhY3RNZW10YWJsZS5TdGF0c0NvbGxlY3RvcigpOworICAgICAgICAgICAgdGhpcy5hbGxvY2F0b3IgPSBhbGxvY2F0b3I7CisgICAgICAgICAgICB0aGlzLm1ldHJpY3MgPSBtZXRyaWNzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgcHV0KERlY29yYXRlZEtleSBrZXksIFBhcnRpdGlvblVwZGF0ZSB1cGRhdGUsIFVwZGF0ZVRyYW5zYWN0aW9uIGluZGV4ZXIsIE9wT3JkZXIuR3JvdXAgb3BHcm91cCkgdGhyb3dzIEluTWVtb3J5VHJpZS5TcGFjZUV4aGF1c3RlZEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBCVHJlZVBhcnRpdGlvblVwZGF0ZXIgdXBkYXRlciA9IG5ldyBCVHJlZVBhcnRpdGlvblVwZGF0ZXIoYWxsb2NhdG9yLCBhbGxvY2F0b3IuY2xvbmVyKG9wR3JvdXApLCBvcEdyb3VwLCBpbmRleGVyKTsKKyAgICAgICAgICAgIGJvb2xlYW4gbG9ja2VkID0gd3JpdGVMb2NrLnRyeUxvY2soKTsKKyAgICAgICAgICAgIGlmIChsb2NrZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWV0cmljcy51bmNvbnRlbmRlZFB1dHMuaW5jKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWV0cmljcy5jb250ZW5kZWRQdXRzLmluYygpOworICAgICAgICAgICAgICAgIGxvbmcgbG9ja1N0YXJ0VGltZSA9IENsb2NrLkdsb2JhbC5uYW5vVGltZSgpOworICAgICAgICAgICAgICAgIHdyaXRlTG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgbWV0cmljcy5jb250ZW50aW9uVGltZS5hZGROYW5vKENsb2NrLkdsb2JhbC5uYW5vVGltZSgpIC0gbG9ja1N0YXJ0VGltZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgb25IZWFwID0gZGF0YS5zaXplT25IZWFwKCk7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgb2ZmSGVhcCA9IGRhdGEuc2l6ZU9mZkhlYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBmYXN0IHJlY3Vyc2l2ZSBwdXQgaWYgd2Uga25vdyB0aGUga2V5IGlzIHNtYWxsIGVub3VnaCB0byBub3QgY2F1c2UgYSBzdGFjayBvdmVyZmxvdy4KKyAgICAgICAgICAgICAgICAgICAgZGF0YS5wdXRTaW5nbGV0b24oa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZXI6Om1lcmdlUGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LmdldEtleUxlbmd0aCgpIDwgTUFYX1JFQ1VSU0lWRV9LRVlfTEVOR1RIKTsKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yLm9mZkhlYXAoKS5hZGp1c3QoZGF0YS5zaXplT2ZmSGVhcCgpIC0gb2ZmSGVhcCwgb3BHcm91cCk7CisgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvci5vbkhlYXAoKS5hZGp1c3QoZGF0YS5zaXplT25IZWFwKCkgLSBvbkhlYXAsIG9wR3JvdXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtaW5UaW1lc3RhbXAgPSBNYXRoLm1pbihtaW5UaW1lc3RhbXAsIHVwZGF0ZS5zdGF0cygpLm1pblRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgIG1pbkxvY2FsRGVsZXRpb25UaW1lID0gTWF0aC5taW4obWluTG9jYWxEZWxldGlvblRpbWUsIHVwZGF0ZS5zdGF0cygpLm1pbkxvY2FsRGVsZXRpb25UaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbGl2ZURhdGFTaXplICs9IHVwZGF0ZXIuZGF0YVNpemU7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRPcGVyYXRpb25zICs9IHVwZGF0ZS5vcGVyYXRpb25Db3VudCgpOworCisgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNDb2xsZWN0b3IudXBkYXRlKHVwZGF0ZS5jb2x1bW5zKCkpOworICAgICAgICAgICAgICAgICAgICBzdGF0c0NvbGxlY3Rvci51cGRhdGUodXBkYXRlLnN0YXRzKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cml0ZUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdXBkYXRlci5jb2xVcGRhdGVUaW1lRGVsdGE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NsZWFuKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRhdGEuaXNFbXB0eSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBzaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRhdGEudmFsdWVzQ291bnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgbWluVGltZXN0YW1wKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1pblRpbWVzdGFtcDsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgbGl2ZURhdGFTaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGxpdmVEYXRhU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgY3VycmVudE9wZXJhdGlvbnMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY3VycmVudE9wZXJhdGlvbnM7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbWluTG9jYWxEZWxldGlvblRpbWUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbWluTG9jYWxEZWxldGlvblRpbWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTWVtdGFibGVVbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvciBpbXBsZW1lbnRzIFVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhOworICAgICAgICBwcml2YXRlIGZpbmFsIEVuc3VyZU9uSGVhcCBlbnN1cmVPbkhlYXA7CisgICAgICAgIHByaXZhdGUgZmluYWwgSXRlcmF0b3I8TWFwLkVudHJ5PEJ5dGVDb21wYXJhYmxlLCBCVHJlZVBhcnRpdGlvbkRhdGE+PiBpdGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIENvbHVtbkZpbHRlciBjb2x1bW5GaWx0ZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgRGF0YVJhbmdlIGRhdGFSYW5nZTsKKworICAgICAgICBwdWJsaWMgTWVtdGFibGVVbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3IoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuc3VyZU9uSGVhcCBlbnN1cmVPbkhlYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmllPEJUcmVlUGFydGl0aW9uRGF0YT4gc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uRmlsdGVyIGNvbHVtbkZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFSYW5nZSBkYXRhUmFuZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTsKKyAgICAgICAgICAgIHRoaXMuZW5zdXJlT25IZWFwID0gZW5zdXJlT25IZWFwOworICAgICAgICAgICAgdGhpcy5pdGVyID0gc291cmNlLmVudHJ5SXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHRoaXMuY29sdW1uRmlsdGVyID0gY29sdW1uRmlsdGVyOworICAgICAgICAgICAgdGhpcy5kYXRhUmFuZ2UgPSBkYXRhUmFuZ2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaXRlci5oYXNOZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIG5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBQYXJ0aXRpb24gcGFydGl0aW9uID0gZ2V0UGFydGl0aW9uRnJvbVRyaWVFbnRyeShtZXRhZGF0YSgpLCBlbnN1cmVPbkhlYXAsIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBwYXJ0aXRpb24ucGFydGl0aW9uS2V5KCk7CisgICAgICAgICAgICBDbHVzdGVyaW5nSW5kZXhGaWx0ZXIgZmlsdGVyID0gZGF0YVJhbmdlLmNsdXN0ZXJpbmdJbmRleEZpbHRlcihrZXkpOworCisgICAgICAgICAgICByZXR1cm4gZmlsdGVyLmdldFVuZmlsdGVyZWRSb3dJdGVyYXRvcihjb2x1bW5GaWx0ZXIsIHBhcnRpdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTWVtdGFibGVQYXJ0aXRpb24gZXh0ZW5kcyBJbW11dGFibGVCVHJlZVBhcnRpdGlvbgorICAgIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEVuc3VyZU9uSGVhcCBlbnN1cmVPbkhlYXA7CisKKyAgICAgICAgcHJpdmF0ZSBNZW10YWJsZVBhcnRpdGlvbihUYWJsZU1ldGFkYXRhIHRhYmxlLCBFbnN1cmVPbkhlYXAgZW5zdXJlT25IZWFwLCBEZWNvcmF0ZWRLZXkga2V5LCBCVHJlZVBhcnRpdGlvbkRhdGEgZGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIodGFibGUsIGtleSwgZGF0YSk7CisgICAgICAgICAgICB0aGlzLmVuc3VyZU9uSGVhcCA9IGVuc3VyZU9uSGVhcDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5IYXZlU2hhZG93ZWREYXRhKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhlIEJ0cmVlUGFydGl0aW9uRGF0YSB3ZSBzdG9yZSBpbiB0aGUgbWVtdGFibGUgYXJlIGJ1aWxkIGl0ZXJhdGl2ZWx5IGJ5IEJUcmVlUGFydGl0aW9uRGF0YS5hZGQoKSwgd2hpY2gKKyAgICAgICAgICAgIC8vIGRvZXNuJ3QgbWFrZSBzdXJlIHRoZXJlIGlzbid0IHNoYWRvd2VkIGRhdGEsIHNvIHdlJ2xsIG5lZWQgdG8gZWxpbWluYXRlIGFueS4KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIERlbGV0aW9uSW5mbyBkZWxldGlvbkluZm8oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZW5zdXJlT25IZWFwLmFwcGx5VG9EZWxldGlvbkluZm8oc3VwZXIuZGVsZXRpb25JbmZvKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSb3cgc3RhdGljUm93KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVuc3VyZU9uSGVhcC5hcHBseVRvU3RhdGljKHN1cGVyLnN0YXRpY1JvdygpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRGVjb3JhdGVkS2V5IHBhcnRpdGlvbktleSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlbnN1cmVPbkhlYXAuYXBwbHlUb1BhcnRpdGlvbktleShzdXBlci5wYXJ0aXRpb25LZXkoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJvdyBnZXRSb3coQ2x1c3RlcmluZzw/PiBjbHVzdGVyaW5nKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZW5zdXJlT25IZWFwLmFwcGx5VG9Sb3coc3VwZXIuZ2V0Um93KGNsdXN0ZXJpbmcpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUm93IGxhc3RSb3coKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZW5zdXJlT25IZWFwLmFwcGx5VG9Sb3coc3VwZXIubGFzdFJvdygpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHVuZmlsdGVyZWRJdGVyYXRvcihDb2x1bW5GaWx0ZXIgc2VsZWN0aW9uLCBTbGljZXMgc2xpY2VzLCBib29sZWFuIHJldmVyc2VkKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdW5maWx0ZXJlZEl0ZXJhdG9yKGhvbGRlcigpLCBzZWxlY3Rpb24sIHNsaWNlcywgcmV2ZXJzZWQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3IgdW5maWx0ZXJlZEl0ZXJhdG9yKENvbHVtbkZpbHRlciBzZWxlY3Rpb24sIE5hdmlnYWJsZVNldDxDbHVzdGVyaW5nPD8+PiBjbHVzdGVyaW5nc0luUXVlcnlPcmRlciwgYm9vbGVhbiByZXZlcnNlZCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVuc3VyZU9uSGVhcC5hcHBseVRvUGFydGl0aW9uKHN1cGVyLnVuZmlsdGVyZWRJdGVyYXRvcihzZWxlY3Rpb24sIGNsdXN0ZXJpbmdzSW5RdWVyeU9yZGVyLCByZXZlcnNlZCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3IgdW5maWx0ZXJlZEl0ZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHVuZmlsdGVyZWRJdGVyYXRvcihDb2x1bW5GaWx0ZXIuc2VsZWN0aW9uKHN1cGVyLmNvbHVtbnMoKSksIFNsaWNlcy5BTEwsIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHVuZmlsdGVyZWRJdGVyYXRvcihCVHJlZVBhcnRpdGlvbkRhdGEgY3VycmVudCwgQ29sdW1uRmlsdGVyIHNlbGVjdGlvbiwgU2xpY2VzIHNsaWNlcywgYm9vbGVhbiByZXZlcnNlZCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVuc3VyZU9uSGVhcC5hcHBseVRvUGFydGl0aW9uKHN1cGVyLnVuZmlsdGVyZWRJdGVyYXRvcihjdXJyZW50LCBzZWxlY3Rpb24sIHNsaWNlcywgcmV2ZXJzZWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSXRlcmF0b3I8Um93PiBpdGVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlbnN1cmVPbkhlYXAuYXBwbHlUb1BhcnRpdGlvbihzdXBlci5pdGVyYXRvcigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRmFjdG9yeSBmYWN0b3J5KE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9uc0NvcHkpCisgICAgeworICAgICAgICBTdHJpbmcgc2hhcmRzU3RyaW5nID0gb3B0aW9uc0NvcHkucmVtb3ZlKFNIQVJEU19PUFRJT04pOworICAgICAgICBJbnRlZ2VyIHNoYXJkQ291bnQgPSBzaGFyZHNTdHJpbmcgIT0gbnVsbCA/IEludGVnZXIucGFyc2VJbnQoc2hhcmRzU3RyaW5nKSA6IG51bGw7CisgICAgICAgIHJldHVybiBuZXcgRmFjdG9yeShzaGFyZENvdW50KTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIE1lbXRhYmxlLkZhY3RvcnkKKyAgICB7CisgICAgICAgIGZpbmFsIEludGVnZXIgc2hhcmRDb3VudDsKKworICAgICAgICBGYWN0b3J5KEludGVnZXIgc2hhcmRDb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5zaGFyZENvdW50ID0gc2hhcmRDb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNZW10YWJsZSBjcmVhdGUoQXRvbWljUmVmZXJlbmNlPENvbW1pdExvZ1Bvc2l0aW9uPiBjb21taXRMb2dMb3dlckJvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE93bmVyIG93bmVyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRyaWVNZW10YWJsZShjb21taXRMb2dMb3dlckJvdW5kLCBtZXRhZGFSZWYsIG93bmVyLCBzaGFyZENvdW50KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVGFibGVNZXRyaWNzLlJlbGVhc2FibGVNZXRyaWMgY3JlYXRlTWVtdGFibGVNZXRyaWNzKFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGFSZWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyaWVNZW10YWJsZU1ldHJpY3NWaWV3IG1ldHJpY3MgPSBuZXcgVHJpZU1lbXRhYmxlTWV0cmljc1ZpZXcobWV0YWRhdGFSZWYua2V5c3BhY2UsIG1ldGFkYXRhUmVmLm5hbWUpOworICAgICAgICAgICAgcmV0dXJuIG1ldHJpY3M6OnJlbGVhc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IG8pCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIEZhY3RvcnkgZmFjdG9yeSA9IChGYWN0b3J5KSBvOworICAgICAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWxzKHNoYXJkQ291bnQsIGZhY3Rvcnkuc2hhcmRDb3VudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaChzaGFyZENvdW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBsb25nIHVudXNlZFJlc2VydmVkTWVtb3J5KCkKKyAgICB7CisgICAgICAgIGxvbmcgc2l6ZSA9IDA7CisgICAgICAgIGZvciAoTWVtdGFibGVTaGFyZCBzaGFyZCA6IHNoYXJkcykKKyAgICAgICAgICAgIHNpemUgKz0gc2hhcmQuZGF0YS51bnVzZWRSZXNlcnZlZE1lbW9yeSgpOworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tb25pdG9yaW5nL01vbml0b3JpbmdUYXNrLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tb25pdG9yaW5nL01vbml0b3JpbmdUYXNrLmphdmEKaW5kZXggZDY4MWU0Yi4uMjQzNTY5OSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbW9uaXRvcmluZy9Nb25pdG9yaW5nVGFzay5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21vbml0b3JpbmcvTW9uaXRvcmluZ1Rhc2suamF2YQpAQCAtMzMsMTEgKzMzLDEyIEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTm9TcGFtTG9nZ2VyOwogCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5TeXN0ZW0uZ2V0UHJvcGVydHk7CiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk5BTk9TRUNPTkRTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk1PTklUT1JJTkdfTUFYX09QRVJBVElPTlM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTU9OSVRPUklOR19SRVBPUlRfSU5URVJWQUxfTVM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk1vbm90b25pY0Nsb2NrLkdsb2JhbC5hcHByb3hUaW1lOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkJsb2NraW5nUXVldWVzLm5ld0Jsb2NraW5nUXVldWU7CiAKQEAgLTQ4LDIwICs0OSwyMCBAQAogICovCiBjbGFzcyBNb25pdG9yaW5nVGFzawogewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NFUEFSQVRPUiA9IGdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NFUEFSQVRPUiA9IENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5MSU5FX1NFUEFSQVRPUi5nZXRTdHJpbmcoKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTW9uaXRvcmluZ1Rhc2suY2xhc3MpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE5vU3BhbUxvZ2dlciBub1NwYW1Mb2dnZXIgPSBOb1NwYW1Mb2dnZXIuZ2V0TG9nZ2VyKGxvZ2dlciwgNUwsIFRpbWVVbml0Lk1JTlVURVMpOwogCiAgICAgLyoqCiAgICAgICogRGVmaW5lcyB0aGUgaW50ZXJ2YWwgZm9yIHJlcG9ydGluZyBhbnkgb3BlcmF0aW9ucyB0aGF0IGhhdmUgdGltZWQgb3V0LgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVBPUlRfSU5URVJWQUxfTVMgPSBNYXRoLm1heCgwLCBJbnRlZ2VyLnBhcnNlSW50KFN5c3RlbS5nZXRQcm9wZXJ0eShDb25maWcuUFJPUEVSVFlfUFJFRklYICsgIm1vbml0b3JpbmdfcmVwb3J0X2ludGVydmFsX21zIiwgIjUwMDAiKSkpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVBPUlRfSU5URVJWQUxfTVMgPSBNYXRoLm1heCgwLCBNT05JVE9SSU5HX1JFUE9SVF9JTlRFUlZBTF9NUy5nZXRJbnQoKSk7CiAKICAgICAvKioKICAgICAgKiBEZWZpbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB1bmlxdWUgdGltZWQgb3V0IHF1ZXJpZXMgdGhhdCB3aWxsIGJlIHJlcG9ydGVkIGluIHRoZSBsb2dzLgogICAgICAqIFVzZSBhIG5lZ2F0aXZlIG51bWJlciB0byByZW1vdmUgYW55IGxpbWl0LgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfT1BFUkFUSU9OUyA9IEludGVnZXIucGFyc2VJbnQoU3lzdGVtLmdldFByb3BlcnR5KENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAibW9uaXRvcmluZ19tYXhfb3BlcmF0aW9ucyIsICI1MCIpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX09QRVJBVElPTlMgPSBNT05JVE9SSU5HX01BWF9PUEVSQVRJT05TLmdldEludCgpOwogCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCiAgICAgc3RhdGljIE1vbml0b3JpbmdUYXNrIGluc3RhbmNlID0gbWFrZShSRVBPUlRfSU5URVJWQUxfTVMsIE1BWF9PUEVSQVRJT05TKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3BhcnRpdGlvbnMvQWJzdHJhY3RCVHJlZVBhcnRpdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9BYnN0cmFjdEJUcmVlUGFydGl0aW9uLmphdmEKaW5kZXggNTkyNmNlZC4uMzMyNzIzNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9BYnN0cmFjdEJUcmVlUGFydGl0aW9uLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9BYnN0cmFjdEJUcmVlUGFydGl0aW9uLmphdmEKQEAgLTIyLDE0ICsyMiwxMiBAQAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTmF2aWdhYmxlU2V0OwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYXRvcnM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk9iamVjdFNpemVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlNlYXJjaEl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ0cmVlLkJUcmVlOwogCkBAIC0zNywxMiArMzUsOSBAQAogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCVHJlZVBhcnRpdGlvbiBpbXBsZW1lbnRzIFBhcnRpdGlvbiwgSXRlcmFibGU8Um93PgogewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgSG9sZGVyIEVNUFRZID0gbmV3IEhvbGRlcihSZWd1bGFyQW5kU3RhdGljQ29sdW1ucy5OT05FLCBCVHJlZS5lbXB0eSgpLCBEZWxldGlvbkluZm8uTElWRSwgUm93cy5FTVBUWV9TVEFUSUNfUk9XLCBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgSE9MREVSX1VOU0hBUkVEX0hFQVBfU0laRSA9IE9iamVjdFNpemVzLm1lYXN1cmUoRU1QVFkpOwotCiAgICAgcHJvdGVjdGVkIGZpbmFsIERlY29yYXRlZEtleSBwYXJ0aXRpb25LZXk7CiAKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgSG9sZGVyIGhvbGRlcigpOworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBCVHJlZVBhcnRpdGlvbkRhdGEgaG9sZGVyKCk7CiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gY2FuSGF2ZVNoYWRvd2VkRGF0YSgpOwogCiAgICAgcHJvdGVjdGVkIEFic3RyYWN0QlRyZWVQYXJ0aXRpb24oRGVjb3JhdGVkS2V5IHBhcnRpdGlvbktleSkKQEAgLTUwLDMxICs0NSw2IEBACiAgICAgICAgIHRoaXMucGFydGl0aW9uS2V5ID0gcGFydGl0aW9uS2V5OwogICAgIH0KIAotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgSG9sZGVyCi0gICAgewotICAgICAgICBwdWJsaWMgZmluYWwgUmVndWxhckFuZFN0YXRpY0NvbHVtbnMgY29sdW1uczsKLSAgICAgICAgcHVibGljIGZpbmFsIERlbGV0aW9uSW5mbyBkZWxldGlvbkluZm87Ci0gICAgICAgIC8vIHRoZSBidHJlZSBvZiByb3dzCi0gICAgICAgIHB1YmxpYyBmaW5hbCBPYmplY3RbXSB0cmVlOwotICAgICAgICBwdWJsaWMgZmluYWwgUm93IHN0YXRpY1JvdzsKLSAgICAgICAgcHVibGljIGZpbmFsIEVuY29kaW5nU3RhdHMgc3RhdHM7Ci0KLSAgICAgICAgSG9sZGVyKFJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zIGNvbHVtbnMsIE9iamVjdFtdIHRyZWUsIERlbGV0aW9uSW5mbyBkZWxldGlvbkluZm8sIFJvdyBzdGF0aWNSb3csIEVuY29kaW5nU3RhdHMgc3RhdHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7Ci0gICAgICAgICAgICB0aGlzLnRyZWUgPSB0cmVlOwotICAgICAgICAgICAgdGhpcy5kZWxldGlvbkluZm8gPSBkZWxldGlvbkluZm87Ci0gICAgICAgICAgICB0aGlzLnN0YXRpY1JvdyA9IHN0YXRpY1JvdyA9PSBudWxsID8gUm93cy5FTVBUWV9TVEFUSUNfUk9XIDogc3RhdGljUm93OwotICAgICAgICAgICAgdGhpcy5zdGF0cyA9IHN0YXRzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIEhvbGRlciB3aXRoQ29sdW1ucyhSZWd1bGFyQW5kU3RhdGljQ29sdW1ucyBjb2x1bW5zKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEhvbGRlcihjb2x1bW5zLCB0aGlzLnRyZWUsIHRoaXMuZGVsZXRpb25JbmZvLCB0aGlzLnN0YXRpY1JvdywgdGhpcy5zdGF0cyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwdWJsaWMgRGVsZXRpb25JbmZvIGRlbGV0aW9uSW5mbygpCiAgICAgewogICAgICAgICByZXR1cm4gaG9sZGVyKCkuZGVsZXRpb25JbmZvOwpAQCAtODcsMTMgKzU3LDEzIEBACiAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKICAgICB7Ci0gICAgICAgIEhvbGRlciBob2xkZXIgPSBob2xkZXIoKTsKKyAgICAgICAgQlRyZWVQYXJ0aXRpb25EYXRhIGhvbGRlciA9IGhvbGRlcigpOwogICAgICAgICByZXR1cm4gaG9sZGVyLmRlbGV0aW9uSW5mby5pc0xpdmUoKSAmJiBCVHJlZS5pc0VtcHR5KGhvbGRlci50cmVlKSAmJiBob2xkZXIuc3RhdGljUm93LmlzRW1wdHkoKTsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBoYXNSb3dzKCkKICAgICB7Ci0gICAgICAgIEhvbGRlciBob2xkZXIgPSBob2xkZXIoKTsKKyAgICAgICAgQlRyZWVQYXJ0aXRpb25EYXRhIGhvbGRlciA9IGhvbGRlcigpOwogICAgICAgICByZXR1cm4gIUJUcmVlLmlzRW1wdHkoaG9sZGVyLnRyZWUpOwogICAgIH0KIApAQCAtMTIyLDcgKzkyLDcgQEAKICAgICBwdWJsaWMgUm93IGdldFJvdyhDbHVzdGVyaW5nPD8+IGNsdXN0ZXJpbmcpCiAgICAgewogICAgICAgICBDb2x1bW5GaWx0ZXIgY29sdW1ucyA9IENvbHVtbkZpbHRlci5zZWxlY3Rpb24oY29sdW1ucygpKTsKLSAgICAgICAgSG9sZGVyIGhvbGRlciA9IGhvbGRlcigpOworICAgICAgICBCVHJlZVBhcnRpdGlvbkRhdGEgaG9sZGVyID0gaG9sZGVyKCk7CiAKICAgICAgICAgaWYgKGNsdXN0ZXJpbmcgPT0gQ2x1c3RlcmluZy5TVEFUSUNfQ0xVU1RFUklORykKICAgICAgICAgewpAQCAtMTUyLDcgKzEyMiw3IEBACiAgICAgICAgIHJldHVybiByb3cuZmlsdGVyKGNvbHVtbnMsIGFjdGl2ZURlbGV0aW9uLCB0cnVlLCBtZXRhZGF0YSgpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIFJvdyBzdGF0aWNSb3coSG9sZGVyIGN1cnJlbnQsIENvbHVtbkZpbHRlciBjb2x1bW5zLCBib29sZWFuIHNldEFjdGl2ZURlbGV0aW9uVG9Sb3cpCisgICAgcHJpdmF0ZSBSb3cgc3RhdGljUm93KEJUcmVlUGFydGl0aW9uRGF0YSBjdXJyZW50LCBDb2x1bW5GaWx0ZXIgY29sdW1ucywgYm9vbGVhbiBzZXRBY3RpdmVEZWxldGlvblRvUm93KQogICAgIHsKICAgICAgICAgRGVsZXRpb25UaW1lIHBhcnRpdGlvbkRlbGV0aW9uID0gY3VycmVudC5kZWxldGlvbkluZm8uZ2V0UGFydGl0aW9uRGVsZXRpb24oKTsKICAgICAgICAgaWYgKGNvbHVtbnMuZmV0Y2hlZENvbHVtbnMoKS5zdGF0aWNzLmlzRW1wdHkoKSB8fCAoY3VycmVudC5zdGF0aWNSb3cuaXNFbXB0eSgpICYmIHBhcnRpdGlvbkRlbGV0aW9uLmlzTGl2ZSgpKSkKQEAgLTE4NSw3ICsxNTUsNyBAQAogICAgICAgICByZXR1cm4gdW5maWx0ZXJlZEl0ZXJhdG9yKGhvbGRlcigpLCBzZWxlY3Rpb24sIHNsaWNlcywgcmV2ZXJzZWQpOwogICAgIH0KIAotICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3IgdW5maWx0ZXJlZEl0ZXJhdG9yKEhvbGRlciBjdXJyZW50LCBDb2x1bW5GaWx0ZXIgc2VsZWN0aW9uLCBTbGljZXMgc2xpY2VzLCBib29sZWFuIHJldmVyc2VkKQorICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3IgdW5maWx0ZXJlZEl0ZXJhdG9yKEJUcmVlUGFydGl0aW9uRGF0YSBjdXJyZW50LCBDb2x1bW5GaWx0ZXIgc2VsZWN0aW9uLCBTbGljZXMgc2xpY2VzLCBib29sZWFuIHJldmVyc2VkKQogICAgIHsKICAgICAgICAgUm93IHN0YXRpY1JvdyA9IHN0YXRpY1JvdyhjdXJyZW50LCBzZWxlY3Rpb24sIGZhbHNlKTsKICAgICAgICAgaWYgKHNsaWNlcy5zaXplKCkgPT0gMCkKQEAgLTE5OSw3ICsxNjksNyBAQAogICAgICAgICAgICAgICAgOiBuZXcgU2xpY2VzSXRlcmF0b3Ioc2VsZWN0aW9uLCBzbGljZXMsIHJldmVyc2VkLCBjdXJyZW50LCBzdGF0aWNSb3cpOwogICAgIH0KIAotICAgIHByaXZhdGUgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHNsaWNlSXRlcmF0b3IoQ29sdW1uRmlsdGVyIHNlbGVjdGlvbiwgU2xpY2Ugc2xpY2UsIGJvb2xlYW4gcmV2ZXJzZWQsIEhvbGRlciBjdXJyZW50LCBSb3cgc3RhdGljUm93KQorICAgIHByaXZhdGUgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHNsaWNlSXRlcmF0b3IoQ29sdW1uRmlsdGVyIHNlbGVjdGlvbiwgU2xpY2Ugc2xpY2UsIGJvb2xlYW4gcmV2ZXJzZWQsIEJUcmVlUGFydGl0aW9uRGF0YSBjdXJyZW50LCBSb3cgc3RhdGljUm93KQogICAgIHsKICAgICAgICAgQ2x1c3RlcmluZ0JvdW5kPD8+IHN0YXJ0ID0gc2xpY2Uuc3RhcnQoKS5pc0JvdHRvbSgpID8gbnVsbCA6IHNsaWNlLnN0YXJ0KCk7CiAgICAgICAgIENsdXN0ZXJpbmdCb3VuZDw/PiBlbmQgPSBzbGljZS5lbmQoKS5pc1RvcCgpID8gbnVsbCA6IHNsaWNlLmVuZCgpOwpAQCAtMjA5LDcgKzE3OSw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBSb3dBbmREZWxldGlvbk1lcmdlSXRlcmF0b3IgbWVyZ2UoSXRlcmF0b3I8Um93PiByb3dJdGVyLCBJdGVyYXRvcjxSYW5nZVRvbWJzdG9uZT4gZGVsZXRlSXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5GaWx0ZXIgc2VsZWN0aW9uLCBib29sZWFuIHJldmVyc2VkLCBIb2xkZXIgY3VycmVudCwgUm93IHN0YXRpY1JvdykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5GaWx0ZXIgc2VsZWN0aW9uLCBib29sZWFuIHJldmVyc2VkLCBCVHJlZVBhcnRpdGlvbkRhdGEgY3VycmVudCwgUm93IHN0YXRpY1JvdykKICAgICB7CiAgICAgICAgIHJldHVybiBuZXcgUm93QW5kRGVsZXRpb25NZXJnZUl0ZXJhdG9yKG1ldGFkYXRhKCksIHBhcnRpdGlvbktleSgpLCBjdXJyZW50LmRlbGV0aW9uSW5mby5nZXRQYXJ0aXRpb25EZWxldGlvbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24sIHN0YXRpY1JvdywgcmV2ZXJzZWQsIGN1cnJlbnQuc3RhdHMsCkBAIC0yMTksMTAgKzE4OSwxMCBAQAogCiAgICAgcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RVbmZpbHRlcmVkUm93SXRlcmF0b3IKICAgICB7Ci0gICAgICAgIGZpbmFsIEhvbGRlciBjdXJyZW50OworICAgICAgICBmaW5hbCBCVHJlZVBhcnRpdGlvbkRhdGEgY3VycmVudDsKICAgICAgICAgZmluYWwgQ29sdW1uRmlsdGVyIHNlbGVjdGlvbjsKIAotICAgICAgICBwcml2YXRlIEFic3RyYWN0SXRlcmF0b3IoSG9sZGVyIGN1cnJlbnQsIFJvdyBzdGF0aWNSb3csIENvbHVtbkZpbHRlciBzZWxlY3Rpb24sIGJvb2xlYW4gaXNSZXZlcnNlZCkKKyAgICAgICAgcHJpdmF0ZSBBYnN0cmFjdEl0ZXJhdG9yKEJUcmVlUGFydGl0aW9uRGF0YSBjdXJyZW50LCBSb3cgc3RhdGljUm93LCBDb2x1bW5GaWx0ZXIgc2VsZWN0aW9uLCBib29sZWFuIGlzUmV2ZXJzZWQpCiAgICAgICAgIHsKICAgICAgICAgICAgIHN1cGVyKEFic3RyYWN0QlRyZWVQYXJ0aXRpb24udGhpcy5tZXRhZGF0YSgpLAogICAgICAgICAgICAgICAgICAgQWJzdHJhY3RCVHJlZVBhcnRpdGlvbi50aGlzLnBhcnRpdGlvbktleSgpLApAQCAtMjQ1LDcgKzIxNSw3IEBACiAgICAgICAgIHByaXZhdGUgaW50IGlkeDsKICAgICAgICAgcHJpdmF0ZSBJdGVyYXRvcjxVbmZpbHRlcmVkPiBjdXJyZW50U2xpY2U7CiAKLSAgICAgICAgcHJpdmF0ZSBTbGljZXNJdGVyYXRvcihDb2x1bW5GaWx0ZXIgc2VsZWN0aW9uLCBTbGljZXMgc2xpY2VzLCBib29sZWFuIGlzUmV2ZXJzZWQsIEhvbGRlciBjdXJyZW50LCBSb3cgc3RhdGljUm93KQorICAgICAgICBwcml2YXRlIFNsaWNlc0l0ZXJhdG9yKENvbHVtbkZpbHRlciBzZWxlY3Rpb24sIFNsaWNlcyBzbGljZXMsIGJvb2xlYW4gaXNSZXZlcnNlZCwgQlRyZWVQYXJ0aXRpb25EYXRhIGN1cnJlbnQsIFJvdyBzdGF0aWNSb3cpCiAgICAgICAgIHsKICAgICAgICAgICAgIHN1cGVyKGN1cnJlbnQsIHN0YXRpY1Jvdywgc2VsZWN0aW9uLCBpc1JldmVyc2VkKTsKICAgICAgICAgICAgIHRoaXMuc2xpY2VzID0gc2xpY2VzOwpAQCAtMjgzLDcgKzI1Myw3IEBACiAgICAgICAgIHByaXZhdGUgQ2x1c3RlcmluZ3NJdGVyYXRvcihDb2x1bW5GaWx0ZXIgc2VsZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF2aWdhYmxlU2V0PENsdXN0ZXJpbmc8Pz4+IGNsdXN0ZXJpbmdzSW5RdWVyeU9yZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1JldmVyc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9sZGVyIGN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVHJlZVBhcnRpdGlvbkRhdGEgY3VycmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdyBzdGF0aWNSb3cpCiAgICAgICAgIHsKICAgICAgICAgICAgIHN1cGVyKGN1cnJlbnQsIHN0YXRpY1Jvdywgc2VsZWN0aW9uLCBpc1JldmVyc2VkKTsKQEAgLTMyNiwxMiArMjk2LDEyIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIEhvbGRlciBidWlsZChVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3IsIGludCBpbml0aWFsUm93Q2FwYWNpdHkpCisgICAgcHJvdGVjdGVkIHN0YXRpYyBCVHJlZVBhcnRpdGlvbkRhdGEgYnVpbGQoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yLCBpbnQgaW5pdGlhbFJvd0NhcGFjaXR5KQogICAgIHsKICAgICAgICAgcmV0dXJuIGJ1aWxkKGl0ZXJhdG9yLCBpbml0aWFsUm93Q2FwYWNpdHksIHRydWUpOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBzdGF0aWMgSG9sZGVyIGJ1aWxkKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvciwgaW50IGluaXRpYWxSb3dDYXBhY2l0eSwgYm9vbGVhbiBvcmRlcmVkKQorICAgIHByb3RlY3RlZCBzdGF0aWMgQlRyZWVQYXJ0aXRpb25EYXRhIGJ1aWxkKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvciwgaW50IGluaXRpYWxSb3dDYXBhY2l0eSwgYm9vbGVhbiBvcmRlcmVkKQogICAgIHsKICAgICAgICAgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSA9IGl0ZXJhdG9yLm1ldGFkYXRhKCk7CiAgICAgICAgIFJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zIGNvbHVtbnMgPSBpdGVyYXRvci5jb2x1bW5zKCk7CkBAIC0zNTMsMTIgKzMyMywxMiBAQAogICAgICAgICBpZiAocmV2ZXJzZWQpCiAgICAgICAgICAgICBidWlsZGVyLnJldmVyc2UoKTsKIAotICAgICAgICByZXR1cm4gbmV3IEhvbGRlcihjb2x1bW5zLCBidWlsZGVyLmJ1aWxkKCksIGRlbGV0aW9uQnVpbGRlci5idWlsZCgpLCBpdGVyYXRvci5zdGF0aWNSb3coKSwgaXRlcmF0b3Iuc3RhdHMoKSk7CisgICAgICAgIHJldHVybiBuZXcgQlRyZWVQYXJ0aXRpb25EYXRhKGNvbHVtbnMsIGJ1aWxkZXIuYnVpbGQoKSwgZGVsZXRpb25CdWlsZGVyLmJ1aWxkKCksIGl0ZXJhdG9yLnN0YXRpY1JvdygpLCBpdGVyYXRvci5zdGF0cygpKTsKICAgICB9CiAKICAgICAvLyBOb3RlIHRoYXQgd2hlbiBidWlsZGluZyB3aXRoIGEgUm93SXRlcmF0b3IsIGRlbGV0aW9uIHdpbGwgZ2VuZXJhbGx5IGJlIExJVkUsIGJ1dCB3ZSBhbGxvdyB0byBwYXNzIGl0IG5vbmV0aGVsZXNzIGJlY2F1c2UgUGFydGl0aW9uVXBkYXRlCiAgICAgLy8gcGFzc2VzIGEgTXV0YWJsZURlbGV0aW9uSW5mbyB0aGF0IGl0IG11dGF0ZXMgbGF0ZXIuCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBIb2xkZXIgYnVpbGQoUm93SXRlcmF0b3Igcm93cywgRGVsZXRpb25JbmZvIGRlbGV0aW9uLCBib29sZWFuIGJ1aWxkRW5jb2RpbmdTdGF0cykKKyAgICBwcm90ZWN0ZWQgc3RhdGljIEJUcmVlUGFydGl0aW9uRGF0YSBidWlsZChSb3dJdGVyYXRvciByb3dzLCBEZWxldGlvbkluZm8gZGVsZXRpb24sIGJvb2xlYW4gYnVpbGRFbmNvZGluZ1N0YXRzKQogICAgIHsKICAgICAgICAgUmVndWxhckFuZFN0YXRpY0NvbHVtbnMgY29sdW1ucyA9IHJvd3MuY29sdW1ucygpOwogICAgICAgICBib29sZWFuIHJldmVyc2VkID0gcm93cy5pc1JldmVyc2VPcmRlcigpOwpAQCAtMzc1LDcgKzM0NSw3IEBACiAgICAgICAgICAgICBSb3cgc3RhdGljUm93ID0gcm93cy5zdGF0aWNSb3coKTsKICAgICAgICAgICAgIEVuY29kaW5nU3RhdHMgc3RhdHMgPSBidWlsZEVuY29kaW5nU3RhdHMgPyBFbmNvZGluZ1N0YXRzLkNvbGxlY3Rvci5jb2xsZWN0KHN0YXRpY1JvdywgQlRyZWUuaXRlcmF0b3IodHJlZSksIGRlbGV0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEVuY29kaW5nU3RhdHMuTk9fU1RBVFM7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEhvbGRlcihjb2x1bW5zLCB0cmVlLCBkZWxldGlvbiwgc3RhdGljUm93LCBzdGF0cyk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJUcmVlUGFydGl0aW9uRGF0YShjb2x1bW5zLCB0cmVlLCBkZWxldGlvbiwgc3RhdGljUm93LCBzdGF0cyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQyMCw3ICszOTAsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIFBhcnRpdGlvblVwZGF0ZSB0aGF0ID0gKFBhcnRpdGlvblVwZGF0ZSkgb2JqOwotICAgICAgICBIb2xkZXIgYSA9IHRoaXMuaG9sZGVyKCksIGIgPSB0aGF0LmhvbGRlcigpOworICAgICAgICBCVHJlZVBhcnRpdGlvbkRhdGEgYSA9IHRoaXMuaG9sZGVyKCksIGIgPSB0aGF0LmhvbGRlcigpOwogICAgICAgICByZXR1cm4gcGFydGl0aW9uS2V5LmVxdWFscyh0aGF0LnBhcnRpdGlvbktleSkKICAgICAgICAgICAgICAgICYmIG1ldGFkYXRhKCkuaWQuZXF1YWxzKHRoYXQubWV0YWRhdGEoKS5pZCkKICAgICAgICAgICAgICAgICYmIGEuZGVsZXRpb25JbmZvLmVxdWFscyhiLmRlbGV0aW9uSW5mbykKQEAgLTQ0NiwxNiArNDE2LDQgQEAKIAogICAgICAgICByZXR1cm4gQlRyZWUuZmluZEJ5SW5kZXgodHJlZSwgQlRyZWUuc2l6ZSh0cmVlKSAtIDEpOwogICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHB1YmxpYyBzdGF0aWMgSG9sZGVyIHVuc2FmZUdldEVtcHR5SG9sZGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFTVBUWTsKLSAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBwdWJsaWMgc3RhdGljIEhvbGRlciB1bnNhZmVDb25zdHJ1Y3RIb2xkZXIoUmVndWxhckFuZFN0YXRpY0NvbHVtbnMgY29sdW1ucywgT2JqZWN0W10gdHJlZSwgRGVsZXRpb25JbmZvIGRlbGV0aW9uSW5mbywgUm93IHN0YXRpY1JvdywgRW5jb2RpbmdTdGF0cyBzdGF0cykKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgSG9sZGVyKGNvbHVtbnMsIHRyZWUsIGRlbGV0aW9uSW5mbywgc3RhdGljUm93LCBzdGF0cyk7Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9BdG9taWNCVHJlZVBhcnRpdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9BdG9taWNCVHJlZVBhcnRpdGlvbi5qYXZhCmluZGV4IDk4NmU3MDcuLmM5MDM1YmUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3BhcnRpdGlvbnMvQXRvbWljQlRyZWVQYXJ0aXRpb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL0F0b21pY0JUcmVlUGFydGl0aW9uLmphdmEKQEAgLTE4LDI4ICsxOCwyNCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zOwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTmF2aWdhYmxlU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXI7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnRyYW5zYWN0aW9ucy5VcGRhdGVUcmFuc2FjdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXgudHJhbnNhY3Rpb25zLlVwZGF0ZVRyYW5zYWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk9iamVjdFNpemVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ0cmVlLkJUcmVlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ0cmVlLlVwZGF0ZUZ1bmN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuT3BPcmRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuQ2xvbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5IZWFwQ2xvbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5NZW10YWJsZUFsbG9jYXRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBvcmcuZ2l0aHViLmphbW0uVW5tZXRlcmVkOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKIApAQCAtNzEsNyArNjcsNyBAQAogICAgIC8vIENMT0NLX0dSQU5VTEFSSVRZID0gMV45bnMgPj4gQ0xPQ0tfU0hJRlQgPT0gMTMydXMgPT0gKDEvNy42MyltcwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlcjxBdG9taWNCVHJlZVBhcnRpdGlvbj4gd2FzdGVUcmFja2VyVXBkYXRlciA9IEF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXIubmV3VXBkYXRlcihBdG9taWNCVHJlZVBhcnRpdGlvbi5jbGFzcywgIndhc3RlVHJhY2tlciIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlcjxBdG9taWNCVHJlZVBhcnRpdGlvbiwgSG9sZGVyPiByZWZVcGRhdGVyID0gQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyLm5ld1VwZGF0ZXIoQXRvbWljQlRyZWVQYXJ0aXRpb24uY2xhc3MsIEhvbGRlci5jbGFzcywgInJlZiIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlcjxBdG9taWNCVHJlZVBhcnRpdGlvbiwgQlRyZWVQYXJ0aXRpb25EYXRhPiByZWZVcGRhdGVyID0gQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyLm5ld1VwZGF0ZXIoQXRvbWljQlRyZWVQYXJ0aXRpb24uY2xhc3MsIEJUcmVlUGFydGl0aW9uRGF0YS5jbGFzcywgInJlZiIpOwogCiAgICAgLyoqCiAgICAgICogKGNsb2NrICsgYWxsb2NhdGlvbikgZ3JhbnVsYXJpdHkgYXJlIGNvbWJpbmVkIHRvIGdpdmUgdXMgYW4gYWNjZXB0YWJsZSAod2FzdGUpIGFsbG9jYXRpb24gcmF0ZSB0aGF0IGlzIGRlZmluZWQgYnkKQEAgLTgzLDkgKzc5LDEyIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgd2FzdGVUcmFja2VyID0gVFJBQ0tFUl9ORVZFUl9XQVNURUQ7CiAKKyAgICBAVW5tZXRlcmVkCiAgICAgcHJpdmF0ZSBmaW5hbCBNZW10YWJsZUFsbG9jYXRvciBhbGxvY2F0b3I7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBIb2xkZXIgcmVmOwogCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBCVHJlZVBhcnRpdGlvbkRhdGEgcmVmOworCisgICAgQFVubWV0ZXJlZAogICAgIHByaXZhdGUgZmluYWwgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YTsKIAogICAgIHB1YmxpYyBBdG9taWNCVHJlZVBhcnRpdGlvbihUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhLCBEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5LCBNZW10YWJsZUFsbG9jYXRvciBhbGxvY2F0b3IpCkBAIC05NCwxMCArOTMsMTAgQEAKICAgICAgICAgc3VwZXIocGFydGl0aW9uS2V5KTsKICAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhOwogICAgICAgICB0aGlzLmFsbG9jYXRvciA9IGFsbG9jYXRvcjsKLSAgICAgICAgdGhpcy5yZWYgPSBFTVBUWTsKKyAgICAgICAgdGhpcy5yZWYgPSBCVHJlZVBhcnRpdGlvbkRhdGEuRU1QVFk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIEhvbGRlciBob2xkZXIoKQorICAgIHByb3RlY3RlZCBCVHJlZVBhcnRpdGlvbkRhdGEgaG9sZGVyKCkKICAgICB7CiAgICAgICAgIHJldHVybiByZWY7CiAgICAgfQpAQCAtMTEyLDkyICsxMTEsNzggQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBsb25nW10gYWRkQWxsV2l0aFNpemVEZWx0YUludGVybmFsKFJvd1VwZGF0ZXIgdXBkYXRlciwgUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSwgVXBkYXRlVHJhbnNhY3Rpb24gaW5kZXhlcikKLSAgICB7Ci0gICAgICAgIEhvbGRlciBjdXJyZW50ID0gcmVmOwotICAgICAgICB1cGRhdGVyLnJlc2V0KCk7Ci0KLSAgICAgICAgaWYgKCF1cGRhdGUuZGVsZXRpb25JbmZvKCkuZ2V0UGFydGl0aW9uRGVsZXRpb24oKS5pc0xpdmUoKSkKLSAgICAgICAgICAgIGluZGV4ZXIub25QYXJ0aXRpb25EZWxldGlvbih1cGRhdGUuZGVsZXRpb25JbmZvKCkuZ2V0UGFydGl0aW9uRGVsZXRpb24oKSk7Ci0KLSAgICAgICAgaWYgKHVwZGF0ZS5kZWxldGlvbkluZm8oKS5oYXNSYW5nZXMoKSkKLSAgICAgICAgICAgIHVwZGF0ZS5kZWxldGlvbkluZm8oKS5yYW5nZUl0ZXJhdG9yKGZhbHNlKS5mb3JFYWNoUmVtYWluaW5nKGluZGV4ZXI6Om9uUmFuZ2VUb21ic3RvbmUpOwotCi0gICAgICAgIERlbGV0aW9uSW5mbyBkZWxldGlvbkluZm87Ci0gICAgICAgIGlmICh1cGRhdGUuZGVsZXRpb25JbmZvKCkubWF5TW9kaWZ5KGN1cnJlbnQuZGVsZXRpb25JbmZvKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHVwZGF0ZXIuaW5wdXREZWxldGlvbkluZm9Db3B5ID09IG51bGwpCi0gICAgICAgICAgICAgICAgdXBkYXRlci5pbnB1dERlbGV0aW9uSW5mb0NvcHkgPSB1cGRhdGUuZGVsZXRpb25JbmZvKCkuY2xvbmUoSGVhcENsb25lci5pbnN0YW5jZSk7Ci0KLSAgICAgICAgICAgIGRlbGV0aW9uSW5mbyA9IGN1cnJlbnQuZGVsZXRpb25JbmZvLm11dGFibGVDb3B5KCkuYWRkKHVwZGF0ZXIuaW5wdXREZWxldGlvbkluZm9Db3B5KTsKLSAgICAgICAgICAgIHVwZGF0ZXIub25BbGxvY2F0ZWRPbkhlYXAoZGVsZXRpb25JbmZvLnVuc2hhcmVkSGVhcFNpemUoKSAtIGN1cnJlbnQuZGVsZXRpb25JbmZvLnVuc2hhcmVkSGVhcFNpemUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWxldGlvbkluZm8gPSBjdXJyZW50LmRlbGV0aW9uSW5mbzsKLSAgICAgICAgfQotCi0gICAgICAgIFJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zIGNvbHVtbnMgPSB1cGRhdGUuY29sdW1ucygpLm1lcmdlVG8oY3VycmVudC5jb2x1bW5zKTsKLSAgICAgICAgdXBkYXRlci5vbkFsbG9jYXRlZE9uSGVhcChjb2x1bW5zLnVuc2hhcmVkSGVhcFNpemUoKSAtIGN1cnJlbnQuY29sdW1ucy51bnNoYXJlZEhlYXBTaXplKCkpOwotICAgICAgICBSb3cgbmV3U3RhdGljID0gdXBkYXRlLnN0YXRpY1JvdygpOwotICAgICAgICBSb3cgc3RhdGljUm93ID0gbmV3U3RhdGljLmlzRW1wdHkoKQotICAgICAgICAgICAgICAgICAgICAgICAgPyBjdXJyZW50LnN0YXRpY1JvdwotICAgICAgICAgICAgICAgICAgICAgICAgOiAoY3VycmVudC5zdGF0aWNSb3cuaXNFbXB0eSgpID8gdXBkYXRlci5pbnNlcnQobmV3U3RhdGljKSA6IHVwZGF0ZXIubWVyZ2UoY3VycmVudC5zdGF0aWNSb3csIG5ld1N0YXRpYykpOwotICAgICAgICBPYmplY3RbXSB0cmVlID0gQlRyZWUudXBkYXRlKGN1cnJlbnQudHJlZSwgdXBkYXRlLmhvbGRlcigpLnRyZWUsIHVwZGF0ZS5tZXRhZGF0YSgpLmNvbXBhcmF0b3IsIHVwZGF0ZXIpOwotICAgICAgICBFbmNvZGluZ1N0YXRzIG5ld1N0YXRzID0gY3VycmVudC5zdGF0cy5tZXJnZVdpdGgodXBkYXRlLnN0YXRzKCkpOwotICAgICAgICB1cGRhdGVyLm9uQWxsb2NhdGVkT25IZWFwKG5ld1N0YXRzLnVuc2hhcmVkSGVhcFNpemUoKSAtIGN1cnJlbnQuc3RhdHMudW5zaGFyZWRIZWFwU2l6ZSgpKTsKLQotICAgICAgICBpZiAodHJlZSAhPSBudWxsICYmIHJlZlVwZGF0ZXIuY29tcGFyZUFuZFNldCh0aGlzLCBjdXJyZW50LCBuZXcgSG9sZGVyKGNvbHVtbnMsIHRyZWUsIGRlbGV0aW9uSW5mbywgc3RhdGljUm93LCBuZXdTdGF0cykpKQotICAgICAgICB7Ci0gICAgICAgICAgICB1cGRhdGVyLmZpbmlzaCgpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBsb25nW117IHVwZGF0ZXIuZGF0YVNpemUsIHVwZGF0ZXIuY29sVXBkYXRlVGltZURlbHRhIH07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KICAgICAvKioKICAgICAgKiBBZGRzIGEgZ2l2ZW4gdXBkYXRlIHRvIHRoaXMgaW4tbWVtdGFibGUgcGFydGl0aW9uLgogICAgICAqCiAgICAgICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGZpcnN0IHRoZSBkaWZmZXJlbmNlIGluIHNpemUgc2VlbiBhZnRlciBtZXJnaW5nIHRoZSB1cGRhdGVzLCBhbmQgc2Vjb25kIHRoZSBtaW5pbXVtCi0gICAgICogdGltZSBkZXRsYSBiZXR3ZWVuIHVwZGF0ZXMuCisgICAgICogdGltZSBkZWx0YSBiZXR3ZWVuIHVwZGF0ZXMuCiAgICAgICovCi0gICAgcHVibGljIGxvbmdbXSBhZGRBbGxXaXRoU2l6ZURlbHRhKGZpbmFsIFBhcnRpdGlvblVwZGF0ZSB1cGRhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsb25lciBjbG9uZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wT3JkZXIuR3JvdXAgd3JpdGVPcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlVHJhbnNhY3Rpb24gaW5kZXhlcikKKyAgICBwdWJsaWMgQlRyZWVQYXJ0aXRpb25VcGRhdGVyIGFkZEFsbChmaW5hbCBQYXJ0aXRpb25VcGRhdGUgdXBkYXRlLCBDbG9uZXIgY2xvbmVyLCBPcE9yZGVyLkdyb3VwIHdyaXRlT3AsIFVwZGF0ZVRyYW5zYWN0aW9uIGluZGV4ZXIpCiAgICAgewotICAgICAgICBSb3dVcGRhdGVyIHVwZGF0ZXIgPSBuZXcgUm93VXBkYXRlcihhbGxvY2F0b3IsIGNsb25lciwgd3JpdGVPcCwgaW5kZXhlcik7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIHNob3VsZExvY2sgPSBzaG91bGRMb2NrKHdyaXRlT3ApOwotICAgICAgICAgICAgaW5kZXhlci5zdGFydCgpOworICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZXIoYWxsb2NhdG9yLCBjbG9uZXIsIHdyaXRlT3AsIGluZGV4ZXIpLmFkZEFsbCh1cGRhdGUpOworICAgIH0KIAotICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIHZvaWQgdW5zYWZlU2V0SG9sZGVyKEJUcmVlUGFydGl0aW9uRGF0YSBob2xkZXIpCisgICAgeworICAgICAgICByZWYgPSBob2xkZXI7CisgICAgfQorCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIEJUcmVlUGFydGl0aW9uRGF0YSB1bnNhZmVHZXRIb2xkZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlZjsKKyAgICB9CisKKyAgICBjbGFzcyBVcGRhdGVyIGV4dGVuZHMgQlRyZWVQYXJ0aXRpb25VcGRhdGVyCisgICAgeworICAgICAgICBCVHJlZVBhcnRpdGlvbkRhdGEgY3VycmVudDsKKworICAgICAgICBwdWJsaWMgVXBkYXRlcihNZW10YWJsZUFsbG9jYXRvciBhbGxvY2F0b3IsIENsb25lciBjbG9uZXIsIE9wT3JkZXIuR3JvdXAgd3JpdGVPcCwgVXBkYXRlVHJhbnNhY3Rpb24gaW5kZXhlcikKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoYWxsb2NhdG9yLCBjbG9uZXIsIHdyaXRlT3AsIGluZGV4ZXIpOworICAgICAgICB9CisKKyAgICAgICAgVXBkYXRlciBhZGRBbGwoZmluYWwgUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHNob3VsZExvY2spCisgICAgICAgICAgICAgICAgYm9vbGVhbiBzaG91bGRMb2NrID0gc2hvdWxkTG9jayh3cml0ZU9wKTsKKyAgICAgICAgICAgICAgICBpbmRleGVyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZExvY2spCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdbXSByZXN1bHQgPSBhZGRBbGxXaXRoU2l6ZURlbHRhSW50ZXJuYWwodXBkYXRlciwgdXBkYXRlLCBpbmRleGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cnlVcGRhdGVEYXRhKHVwZGF0ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyeVVwZGF0ZURhdGEodXBkYXRlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkTG9jayA9IHNob3VsZExvY2soaGVhcFNpemUsIHdyaXRlT3ApOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmdbXSByZXN1bHQgPSBhZGRBbGxXaXRoU2l6ZURlbHRhSW50ZXJuYWwodXBkYXRlciwgdXBkYXRlLCBpbmRleGVyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLQotICAgICAgICAgICAgICAgICAgICBzaG91bGRMb2NrID0gc2hvdWxkTG9jayh1cGRhdGVyLmhlYXBTaXplLCB3cml0ZU9wKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5kZXhlci5jb21taXQoKTsKKyAgICAgICAgICAgICAgICByZXBvcnRBbGxvY2F0ZWRNZW1vcnkoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBmaW5hbGx5CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHRyeVVwZGF0ZURhdGEoUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSkKICAgICAgICAgewotICAgICAgICAgICAgaW5kZXhlci5jb21taXQoKTsKKyAgICAgICAgICAgIGN1cnJlbnQgPSByZWY7CisgICAgICAgICAgICB0aGlzLmRhdGFTaXplID0gMDsKKyAgICAgICAgICAgIHRoaXMuaGVhcFNpemUgPSAwOworICAgICAgICAgICAgQlRyZWVQYXJ0aXRpb25EYXRhIHJlc3VsdCA9IG1ha2VNZXJnZWRQYXJ0aXRpb24oY3VycmVudCwgdXBkYXRlKTsKKyAgICAgICAgICAgIHJldHVybiByZWZVcGRhdGVyLmNvbXBhcmVBbmRTZXQoQXRvbWljQlRyZWVQYXJ0aXRpb24udGhpcywgY3VycmVudCwgcmVzdWx0KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjMyLDI1ICsyMTcsNyBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3IgdW5maWx0ZXJlZEl0ZXJhdG9yKENvbHVtbkZpbHRlciBzZWxlY3Rpb24sIFNsaWNlcyBzbGljZXMsIGJvb2xlYW4gcmV2ZXJzZWQpCi0gICAgewotICAgICAgICByZXR1cm4gYWxsb2NhdG9yLmVuc3VyZU9uSGVhcCgpLmFwcGx5VG9QYXJ0aXRpb24oc3VwZXIudW5maWx0ZXJlZEl0ZXJhdG9yKHNlbGVjdGlvbiwgc2xpY2VzLCByZXZlcnNlZCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3IgdW5maWx0ZXJlZEl0ZXJhdG9yKENvbHVtbkZpbHRlciBzZWxlY3Rpb24sIE5hdmlnYWJsZVNldDxDbHVzdGVyaW5nPD8+PiBjbHVzdGVyaW5nc0luUXVlcnlPcmRlciwgYm9vbGVhbiByZXZlcnNlZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhbGxvY2F0b3IuZW5zdXJlT25IZWFwKCkuYXBwbHlUb1BhcnRpdGlvbihzdXBlci51bmZpbHRlcmVkSXRlcmF0b3Ioc2VsZWN0aW9uLCBjbHVzdGVyaW5nc0luUXVlcnlPcmRlciwgcmV2ZXJzZWQpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHVuZmlsdGVyZWRJdGVyYXRvcigpCi0gICAgewotICAgICAgICByZXR1cm4gYWxsb2NhdG9yLmVuc3VyZU9uSGVhcCgpLmFwcGx5VG9QYXJ0aXRpb24oc3VwZXIudW5maWx0ZXJlZEl0ZXJhdG9yKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3IgdW5maWx0ZXJlZEl0ZXJhdG9yKEhvbGRlciBjdXJyZW50LCBDb2x1bW5GaWx0ZXIgc2VsZWN0aW9uLCBTbGljZXMgc2xpY2VzLCBib29sZWFuIHJldmVyc2VkKQorICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3IgdW5maWx0ZXJlZEl0ZXJhdG9yKEJUcmVlUGFydGl0aW9uRGF0YSBjdXJyZW50LCBDb2x1bW5GaWx0ZXIgc2VsZWN0aW9uLCBTbGljZXMgc2xpY2VzLCBib29sZWFuIHJldmVyc2VkKQogICAgIHsKICAgICAgICAgcmV0dXJuIGFsbG9jYXRvci5lbnN1cmVPbkhlYXAoKS5hcHBseVRvUGFydGl0aW9uKHN1cGVyLnVuZmlsdGVyZWRJdGVyYXRvcihjdXJyZW50LCBzZWxlY3Rpb24sIHNsaWNlcywgcmV2ZXJzZWQpKTsKICAgICB9CkBAIC0zMzQsMTE4ICszMDEsNCBAQAogICAgICAgICAgICAgcmV0dXJuIHdhc3RlVHJhY2tlciArIDE7CiAgICAgICAgIHJldHVybiB3YXN0ZVRyYWNrZXI7CiAgICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgcHVibGljIHZvaWQgdW5zYWZlU2V0SG9sZGVyKEhvbGRlciBob2xkZXIpCi0gICAgewotICAgICAgICByZWYgPSBob2xkZXI7Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgcHVibGljIEhvbGRlciB1bnNhZmVHZXRIb2xkZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlZjsKLSAgICB9Ci0KLSAgICAvLyB0aGUgZnVuY3Rpb24gd2UgcHJvdmlkZSB0byB0aGUgYnRyZWUgdXRpbGl0aWVzIHRvIHBlcmZvcm0gYW55IGNvbHVtbiByZXBsYWNlbWVudHMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3dVcGRhdGVyIGltcGxlbWVudHMgVXBkYXRlRnVuY3Rpb248Um93LCBSb3c+LCBDb2x1bW5EYXRhLlBvc3RSZWNvbmNpbGlhdGlvbkZ1bmN0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBNZW10YWJsZUFsbG9jYXRvciBhbGxvY2F0b3I7Ci0gICAgICAgIGZpbmFsIE9wT3JkZXIuR3JvdXAgd3JpdGVPcDsKLSAgICAgICAgZmluYWwgVXBkYXRlVHJhbnNhY3Rpb24gaW5kZXhlcjsKLSAgICAgICAgZmluYWwgQ2xvbmVyIGNsb25lcjsKLSAgICAgICAgbG9uZyBkYXRhU2l6ZTsKLSAgICAgICAgbG9uZyBoZWFwU2l6ZTsKLSAgICAgICAgbG9uZyBjb2xVcGRhdGVUaW1lRGVsdGEgPSBMb25nLk1BWF9WQUxVRTsKLSAgICAgICAgTGlzdDxSb3c+IGluc2VydGVkOyAvLyBUT0RPOiByZXBsYWNlIHdpdGggd2FsayBvZiBhYm9ydGVkIEJUcmVlCi0KLSAgICAgICAgRGVsZXRpb25JbmZvIGlucHV0RGVsZXRpb25JbmZvQ29weSA9IG51bGw7Ci0KLSAgICAgICAgcHJpdmF0ZSBSb3dVcGRhdGVyKE1lbXRhYmxlQWxsb2NhdG9yIGFsbG9jYXRvciwgQ2xvbmVyIGNsb25lciwgT3BPcmRlci5Hcm91cCB3cml0ZU9wLCBVcGRhdGVUcmFuc2FjdGlvbiBpbmRleGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmFsbG9jYXRvciA9IGFsbG9jYXRvcjsKLSAgICAgICAgICAgIHRoaXMud3JpdGVPcCA9IHdyaXRlT3A7Ci0gICAgICAgICAgICB0aGlzLmluZGV4ZXIgPSBpbmRleGVyOwotICAgICAgICAgICAgdGhpcy5jbG9uZXIgPSBjbG9uZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFJvdyBpbnNlcnQoUm93IGluc2VydCkKLSAgICAgICAgewotICAgICAgICAgICAgUm93IGRhdGEgPSBpbnNlcnQuY2xvbmUoY2xvbmVyKTsgCi0gICAgICAgICAgICBpbmRleGVyLm9uSW5zZXJ0ZWQoaW5zZXJ0KTsKLQotICAgICAgICAgICAgdGhpcy5kYXRhU2l6ZSArPSBkYXRhLmRhdGFTaXplKCk7Ci0gICAgICAgICAgICB0aGlzLmhlYXBTaXplICs9IGRhdGEudW5zaGFyZWRIZWFwU2l6ZUV4Y2x1ZGluZ0RhdGEoKTsKLSAgICAgICAgICAgIGlmIChpbnNlcnRlZCA9PSBudWxsKQotICAgICAgICAgICAgICAgIGluc2VydGVkID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBpbnNlcnRlZC5hZGQoZGF0YSk7Ci0gICAgICAgICAgICByZXR1cm4gZGF0YTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBSb3cgbWVyZ2UoUm93IGV4aXN0aW5nLCBSb3cgdXBkYXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBSb3cgcmVjb25jaWxlZCA9IFJvd3MubWVyZ2UoZXhpc3RpbmcsIHVwZGF0ZSwgdGhpcyk7Ci0gICAgICAgICAgICBpbmRleGVyLm9uVXBkYXRlZChleGlzdGluZywgcmVjb25jaWxlZCk7Ci0KLSAgICAgICAgICAgIGlmIChpbnNlcnRlZCA9PSBudWxsKQotICAgICAgICAgICAgICAgIGluc2VydGVkID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBpbnNlcnRlZC5hZGQocmVjb25jaWxlZCk7Ci0KLSAgICAgICAgICAgIHJldHVybiByZWNvbmNpbGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFJvdyByZXRhaW4oUm93IGV4aXN0aW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCByZXNldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZGF0YVNpemUgPSAwOwotICAgICAgICAgICAgdGhpcy5oZWFwU2l6ZSA9IDA7Ci0gICAgICAgICAgICBpZiAoaW5zZXJ0ZWQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBpbnNlcnRlZC5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENlbGw8Pz4gbWVyZ2UoQ2VsbDw/PiBwcmV2aW91cywgQ2VsbDw/PiBpbnNlcnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpbnNlcnQgPT0gcHJldmlvdXMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGluc2VydDsKLSAgICAgICAgICAgIGxvbmcgdGltZURlbHRhID0gTWF0aC5hYnMoaW5zZXJ0LnRpbWVzdGFtcCgpIC0gcHJldmlvdXMudGltZXN0YW1wKCkpOwotICAgICAgICAgICAgaWYgKHRpbWVEZWx0YSA8IGNvbFVwZGF0ZVRpbWVEZWx0YSkKLSAgICAgICAgICAgICAgICBjb2xVcGRhdGVUaW1lRGVsdGEgPSB0aW1lRGVsdGE7Ci0gICAgICAgICAgICBpZiAoY2xvbmVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgaW5zZXJ0ID0gY2xvbmVyLmNsb25lKGluc2VydCk7Ci0gICAgICAgICAgICBkYXRhU2l6ZSArPSBpbnNlcnQuZGF0YVNpemUoKSAtIHByZXZpb3VzLmRhdGFTaXplKCk7Ci0gICAgICAgICAgICBoZWFwU2l6ZSArPSBpbnNlcnQudW5zaGFyZWRIZWFwU2l6ZUV4Y2x1ZGluZ0RhdGEoKSAtIHByZXZpb3VzLnVuc2hhcmVkSGVhcFNpemVFeGNsdWRpbmdEYXRhKCk7Ci0gICAgICAgICAgICByZXR1cm4gaW5zZXJ0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbHVtbkRhdGEgaW5zZXJ0KENvbHVtbkRhdGEgaW5zZXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY2xvbmVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgaW5zZXJ0ID0gaW5zZXJ0LmNsb25lKGNsb25lcik7Ci0gICAgICAgICAgICBkYXRhU2l6ZSArPSBpbnNlcnQuZGF0YVNpemUoKTsKLSAgICAgICAgICAgIGhlYXBTaXplICs9IGluc2VydC51bnNoYXJlZEhlYXBTaXplRXhjbHVkaW5nRGF0YSgpOwotICAgICAgICAgICAgcmV0dXJuIGluc2VydDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBkZWxldGUoQ29sdW1uRGF0YSBleGlzdGluZykKLSAgICAgICAgewotICAgICAgICAgICAgZGF0YVNpemUgLT0gZXhpc3RpbmcuZGF0YVNpemUoKTsKLSAgICAgICAgICAgIGhlYXBTaXplIC09IGV4aXN0aW5nLnVuc2hhcmVkSGVhcFNpemVFeGNsdWRpbmdEYXRhKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkFsbG9jYXRlZE9uSGVhcChsb25nIGhlYXBTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmhlYXBTaXplICs9IGhlYXBTaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZmluaXNoKCkKLSAgICAgICAgewotICAgICAgICAgICAgYWxsb2NhdG9yLm9uSGVhcCgpLmFkanVzdChoZWFwU2l6ZSwgd3JpdGVPcCk7Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL0JUcmVlUGFydGl0aW9uRGF0YS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9CVHJlZVBhcnRpdGlvbkRhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWZjZDFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9CVHJlZVBhcnRpdGlvbkRhdGEuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuRW5jb2RpbmdTdGF0czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvd3M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT2JqZWN0U2l6ZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnRyZWUuQlRyZWU7CisKKy8qKgorICogSG9sZGVyIG9mIHRoZSBjb250ZW50IG9mIGEgcGFydGl0aW9uLCBzZWUge0BsaW5rIEFic3RyYWN0QlRyZWVQYXJ0aXRpb259LgorICogV2hlbiB1cGRhdGluZyBhIHBhcnRpdGlvbiBvbmUgaG9sZGVyIGlzIHN3YXBwZWQgZm9yIGFub3RoZXIgYXRvbWljYWxseS4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJUcmVlUGFydGl0aW9uRGF0YQoreworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQlRyZWVQYXJ0aXRpb25EYXRhIEVNUFRZID0gbmV3IEJUcmVlUGFydGl0aW9uRGF0YShSZWd1bGFyQW5kU3RhdGljQ29sdW1ucy5OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVHJlZS5lbXB0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGlvbkluZm8uTElWRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm93cy5FTVBUWV9TVEFUSUNfUk9XLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgVU5TSEFSRURfSEVBUF9TSVpFID0gT2JqZWN0U2l6ZXMubWVhc3VyZShFTVBUWSk7CisKKworICAgIGZpbmFsIFJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zIGNvbHVtbnM7CisgICAgZmluYWwgRGVsZXRpb25JbmZvIGRlbGV0aW9uSW5mbzsKKyAgICAvLyB0aGUgYnRyZWUgb2Ygcm93cworICAgIGZpbmFsIE9iamVjdFtdIHRyZWU7CisgICAgZmluYWwgUm93IHN0YXRpY1JvdzsKKyAgICBwdWJsaWMgZmluYWwgRW5jb2RpbmdTdGF0cyBzdGF0czsKKworICAgIEJUcmVlUGFydGl0aW9uRGF0YShSZWd1bGFyQW5kU3RhdGljQ29sdW1ucyBjb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSB0cmVlLAorICAgICAgICAgICAgICAgICAgICAgICBEZWxldGlvbkluZm8gZGVsZXRpb25JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBSb3cgc3RhdGljUm93LAorICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGluZ1N0YXRzIHN0YXRzKQorICAgIHsKKyAgICAgICAgdGhpcy5jb2x1bW5zID0gY29sdW1uczsKKyAgICAgICAgdGhpcy50cmVlID0gdHJlZTsKKyAgICAgICAgdGhpcy5kZWxldGlvbkluZm8gPSBkZWxldGlvbkluZm87CisgICAgICAgIHRoaXMuc3RhdGljUm93ID0gc3RhdGljUm93ID09IG51bGwgPyBSb3dzLkVNUFRZX1NUQVRJQ19ST1cgOiBzdGF0aWNSb3c7CisgICAgICAgIHRoaXMuc3RhdHMgPSBzdGF0czsKKyAgICB9CisKKyAgICBCVHJlZVBhcnRpdGlvbkRhdGEgd2l0aENvbHVtbnMoUmVndWxhckFuZFN0YXRpY0NvbHVtbnMgY29sdW1ucykKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQlRyZWVQYXJ0aXRpb25EYXRhKGNvbHVtbnMsIHRoaXMudHJlZSwgdGhpcy5kZWxldGlvbkluZm8sIHRoaXMuc3RhdGljUm93LCB0aGlzLnN0YXRzKTsKKyAgICB9CisKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgc3RhdGljIEJUcmVlUGFydGl0aW9uRGF0YSB1bnNhZmVHZXRFbXB0eSgpCisgICAgeworICAgICAgICByZXR1cm4gRU1QVFk7CisgICAgfQorCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIHN0YXRpYyBCVHJlZVBhcnRpdGlvbkRhdGEgdW5zYWZlQ29uc3RydWN0KFJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zIGNvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0aW9uSW5mbyBkZWxldGlvbkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdyBzdGF0aWNSb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY29kaW5nU3RhdHMgc3RhdHMpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEJUcmVlUGFydGl0aW9uRGF0YShjb2x1bW5zLCB0cmVlLCBkZWxldGlvbkluZm8sIHN0YXRpY1Jvdywgc3RhdHMpOworICAgIH0KKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1bnNhZmVJbnZhbGlkYXRlKEF0b21pY0JUcmVlUGFydGl0aW9uIHBhcnRpdGlvbikKKyAgICB7CisgICAgICAgIEJUcmVlUGFydGl0aW9uRGF0YSBob2xkZXIgPSBwYXJ0aXRpb24udW5zYWZlR2V0SG9sZGVyKCk7CisgICAgICAgIGlmICghQlRyZWUuaXNFbXB0eShob2xkZXIudHJlZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhcnRpdGlvbi51bnNhZmVTZXRIb2xkZXIodW5zYWZlQ29uc3RydWN0KGhvbGRlci5jb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmNvcHlPZihob2xkZXIudHJlZSwgaG9sZGVyLnRyZWUubGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlci5kZWxldGlvbkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIuc3RhdGljUm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9sZGVyLnN0YXRzKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL0JUcmVlUGFydGl0aW9uVXBkYXRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9CVHJlZVBhcnRpdGlvblVwZGF0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjMwMTkyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9CVHJlZVBhcnRpdGlvblVwZGF0ZXIuamF2YQpAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ2VsbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNvbHVtbkRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5FbmNvZGluZ1N0YXRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC50cmFuc2FjdGlvbnMuVXBkYXRlVHJhbnNhY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnRyZWUuQlRyZWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnRyZWUuVXBkYXRlRnVuY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5PcE9yZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5DbG9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5LkhlYXBDbG9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5Lk1lbXRhYmxlQWxsb2NhdG9yOworCisvKioKKyAqICB0aGUgZnVuY3Rpb24gd2UgcHJvdmlkZSB0byB0aGUgdHJpZSBhbmQgYnRyZWUgdXRpbGl0aWVzIHRvIHBlcmZvcm0gYW55IHJvdyBhbmQgY29sdW1uIHJlcGxhY2VtZW50cworICovCitwdWJsaWMgY2xhc3MgQlRyZWVQYXJ0aXRpb25VcGRhdGVyIGltcGxlbWVudHMgVXBkYXRlRnVuY3Rpb248Um93LCBSb3c+LCBDb2x1bW5EYXRhLlBvc3RSZWNvbmNpbGlhdGlvbkZ1bmN0aW9uCit7CisgICAgZmluYWwgTWVtdGFibGVBbGxvY2F0b3IgYWxsb2NhdG9yOworICAgIGZpbmFsIE9wT3JkZXIuR3JvdXAgd3JpdGVPcDsKKyAgICBmaW5hbCBDbG9uZXIgY2xvbmVyOworICAgIGZpbmFsIFVwZGF0ZVRyYW5zYWN0aW9uIGluZGV4ZXI7CisgICAgcHVibGljIGxvbmcgZGF0YVNpemU7CisgICAgbG9uZyBoZWFwU2l6ZTsKKyAgICBwdWJsaWMgbG9uZyBjb2xVcGRhdGVUaW1lRGVsdGEgPSBMb25nLk1BWF9WQUxVRTsKKworICAgIHB1YmxpYyBCVHJlZVBhcnRpdGlvblVwZGF0ZXIoTWVtdGFibGVBbGxvY2F0b3IgYWxsb2NhdG9yLCBDbG9uZXIgY2xvbmVyLCBPcE9yZGVyLkdyb3VwIHdyaXRlT3AsIFVwZGF0ZVRyYW5zYWN0aW9uIGluZGV4ZXIpCisgICAgeworICAgICAgICB0aGlzLmFsbG9jYXRvciA9IGFsbG9jYXRvcjsKKyAgICAgICAgdGhpcy5jbG9uZXIgPSBjbG9uZXI7CisgICAgICAgIHRoaXMud3JpdGVPcCA9IHdyaXRlT3A7CisgICAgICAgIHRoaXMuaW5kZXhlciA9IGluZGV4ZXI7CisgICAgICAgIHRoaXMuaGVhcFNpemUgPSAwOworICAgICAgICB0aGlzLmRhdGFTaXplID0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgQlRyZWVQYXJ0aXRpb25EYXRhIG1lcmdlUGFydGl0aW9ucyhCVHJlZVBhcnRpdGlvbkRhdGEgY3VycmVudCwgZmluYWwgUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSkKKyAgICB7CisgICAgICAgIGlmIChjdXJyZW50ID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJlbnQgPSBCVHJlZVBhcnRpdGlvbkRhdGEuRU1QVFk7CisgICAgICAgICAgICBvbkFsbG9jYXRlZE9uSGVhcChCVHJlZVBhcnRpdGlvbkRhdGEuVU5TSEFSRURfSEVBUF9TSVpFKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpbmRleGVyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIHJldHVybiBtYWtlTWVyZ2VkUGFydGl0aW9uKGN1cnJlbnQsIHVwZGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBpbmRleGVyLmNvbW1pdCgpOworICAgICAgICAgICAgcmVwb3J0QWxsb2NhdGVkTWVtb3J5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQlRyZWVQYXJ0aXRpb25EYXRhIG1ha2VNZXJnZWRQYXJ0aXRpb24oQlRyZWVQYXJ0aXRpb25EYXRhIGN1cnJlbnQsIFBhcnRpdGlvblVwZGF0ZSB1cGRhdGUpCisgICAgeworICAgICAgICBEZWxldGlvbkluZm8gbmV3RGVsZXRpb25JbmZvID0gbWVyZ2UoY3VycmVudC5kZWxldGlvbkluZm8sIHVwZGF0ZS5kZWxldGlvbkluZm8oKSk7CisKKyAgICAgICAgUmVndWxhckFuZFN0YXRpY0NvbHVtbnMgY29sdW1ucyA9IGN1cnJlbnQuY29sdW1uczsKKyAgICAgICAgUmVndWxhckFuZFN0YXRpY0NvbHVtbnMgbmV3Q29sdW1ucyA9IHVwZGF0ZS5jb2x1bW5zKCkubWVyZ2VUbyhjb2x1bW5zKTsKKyAgICAgICAgb25BbGxvY2F0ZWRPbkhlYXAobmV3Q29sdW1ucy51bnNoYXJlZEhlYXBTaXplKCkgLSBjb2x1bW5zLnVuc2hhcmVkSGVhcFNpemUoKSk7CisgICAgICAgIFJvdyBuZXdTdGF0aWMgPSBtZXJnZVN0YXRpYyhjdXJyZW50LnN0YXRpY1JvdywgdXBkYXRlLnN0YXRpY1JvdygpKTsKKworICAgICAgICBPYmplY3RbXSB0cmVlID0gQlRyZWUudXBkYXRlKGN1cnJlbnQudHJlZSwgdXBkYXRlLmhvbGRlcigpLnRyZWUsIHVwZGF0ZS5tZXRhZGF0YSgpLmNvbXBhcmF0b3IsIHRoaXMpOworICAgICAgICBFbmNvZGluZ1N0YXRzIG5ld1N0YXRzID0gY3VycmVudC5zdGF0cy5tZXJnZVdpdGgodXBkYXRlLnN0YXRzKCkpOworICAgICAgICBvbkFsbG9jYXRlZE9uSGVhcChuZXdTdGF0cy51bnNoYXJlZEhlYXBTaXplKCkgLSBjdXJyZW50LnN0YXRzLnVuc2hhcmVkSGVhcFNpemUoKSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBCVHJlZVBhcnRpdGlvbkRhdGEobmV3Q29sdW1ucywgdHJlZSwgbmV3RGVsZXRpb25JbmZvLCBuZXdTdGF0aWMsIG5ld1N0YXRzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJvdyBtZXJnZVN0YXRpYyhSb3cgY3VycmVudCwgUm93IHVwZGF0ZSkKKyAgICB7CisgICAgICAgIGlmICh1cGRhdGUuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgIGlmIChjdXJyZW50LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBpbnNlcnQodXBkYXRlKTsKKworICAgICAgICByZXR1cm4gbWVyZ2UoY3VycmVudCwgdXBkYXRlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIERlbGV0aW9uSW5mbyBtZXJnZShEZWxldGlvbkluZm8gZXhpc3RpbmcsIERlbGV0aW9uSW5mbyB1cGRhdGUpCisgICAgeworICAgICAgICBpZiAodXBkYXRlLmlzTGl2ZSgpIHx8ICF1cGRhdGUubWF5TW9kaWZ5KGV4aXN0aW5nKSkKKyAgICAgICAgICAgIHJldHVybiBleGlzdGluZzsKKworICAgICAgICBpZiAoIXVwZGF0ZS5nZXRQYXJ0aXRpb25EZWxldGlvbigpLmlzTGl2ZSgpKQorICAgICAgICAgICAgaW5kZXhlci5vblBhcnRpdGlvbkRlbGV0aW9uKHVwZGF0ZS5nZXRQYXJ0aXRpb25EZWxldGlvbigpKTsKKworICAgICAgICBpZiAodXBkYXRlLmhhc1JhbmdlcygpKQorICAgICAgICAgICAgdXBkYXRlLnJhbmdlSXRlcmF0b3IoZmFsc2UpLmZvckVhY2hSZW1haW5pbmcoaW5kZXhlcjo6b25SYW5nZVRvbWJzdG9uZSk7CisKKyAgICAgICAgLy8gTGlrZSBmb3Igcm93cywgd2UgaGF2ZSB0byBjbG9uZSB0aGUgdXBkYXRlIGluIGNhc2UgaW50ZXJuYWwgYnVmZmVycyAod2hlbiBpdCBoYXMgcmFuZ2UgdG9tYnN0b25lcykgcmVmZXJlbmNlCisgICAgICAgIC8vIG1lbW9yeSB3ZSBzaG91bGRuJ3QgaG9sZCBpbnRvLiBCdXQgd2UgZG9uJ3QgZXZlciBzdG9yZSB0aGlzIG9mZi1oZWFwIGN1cnJlbnRseSBzbyB3ZSBqdXN0IGRlZmF1bHQgdG8gdGhlCisgICAgICAgIC8vIEhlYXBBbGxvY2F0b3IgKHJhdGhlciB0aGFuIHVzaW5nICdhbGxvY2F0b3InKS4KKyAgICAgICAgRGVsZXRpb25JbmZvIG5ld0luZm8gPSBleGlzdGluZy5tdXRhYmxlQ29weSgpLmFkZCh1cGRhdGUuY2xvbmUoSGVhcENsb25lci5pbnN0YW5jZSkpOworICAgICAgICBvbkFsbG9jYXRlZE9uSGVhcChuZXdJbmZvLnVuc2hhcmVkSGVhcFNpemUoKSAtIGV4aXN0aW5nLnVuc2hhcmVkSGVhcFNpemUoKSk7CisgICAgICAgIHJldHVybiBuZXdJbmZvOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSb3cgaW5zZXJ0KFJvdyBpbnNlcnQpCisgICAgeworICAgICAgICBSb3cgZGF0YSA9IGluc2VydC5jbG9uZShjbG9uZXIpOworICAgICAgICBpbmRleGVyLm9uSW5zZXJ0ZWQoaW5zZXJ0KTsKKworICAgICAgICBkYXRhU2l6ZSArPSBkYXRhLmRhdGFTaXplKCk7CisgICAgICAgIGhlYXBTaXplICs9IGRhdGEudW5zaGFyZWRIZWFwU2l6ZUV4Y2x1ZGluZ0RhdGEoKTsKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgICAgcHVibGljIFJvdyBtZXJnZShSb3cgZXhpc3RpbmcsIFJvdyB1cGRhdGUpCisgICAgeworICAgICAgICBSb3cgcmVjb25jaWxlZCA9IFJvd3MubWVyZ2UoZXhpc3RpbmcsIHVwZGF0ZSwgdGhpcyk7CisgICAgICAgIGluZGV4ZXIub25VcGRhdGVkKGV4aXN0aW5nLCByZWNvbmNpbGVkKTsKKworICAgICAgICByZXR1cm4gcmVjb25jaWxlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2VsbDw/PiBtZXJnZShDZWxsPD8+IHByZXZpb3VzLCBDZWxsPD8+IGluc2VydCkKKyAgICB7CisgICAgICAgIGlmIChpbnNlcnQgPT0gcHJldmlvdXMpCisgICAgICAgICAgICByZXR1cm4gaW5zZXJ0OworCisgICAgICAgIGxvbmcgdGltZURlbHRhID0gTWF0aC5hYnMoaW5zZXJ0LnRpbWVzdGFtcCgpIC0gcHJldmlvdXMudGltZXN0YW1wKCkpOworICAgICAgICBpZiAodGltZURlbHRhIDwgY29sVXBkYXRlVGltZURlbHRhKQorICAgICAgICAgICAgY29sVXBkYXRlVGltZURlbHRhID0gdGltZURlbHRhOworICAgICAgICBpZiAoY2xvbmVyICE9IG51bGwpCisgICAgICAgICAgICBpbnNlcnQgPSBjbG9uZXIuY2xvbmUoaW5zZXJ0KTsKKyAgICAgICAgZGF0YVNpemUgKz0gaW5zZXJ0LmRhdGFTaXplKCkgLSBwcmV2aW91cy5kYXRhU2l6ZSgpOworICAgICAgICBoZWFwU2l6ZSArPSBpbnNlcnQudW5zaGFyZWRIZWFwU2l6ZUV4Y2x1ZGluZ0RhdGEoKSAtIHByZXZpb3VzLnVuc2hhcmVkSGVhcFNpemVFeGNsdWRpbmdEYXRhKCk7CisgICAgICAgIHJldHVybiBpbnNlcnQ7CisgICAgfQorCisgICAgcHVibGljIENvbHVtbkRhdGEgaW5zZXJ0KENvbHVtbkRhdGEgaW5zZXJ0KQorICAgIHsKKyAgICAgICAgaWYgKGNsb25lciAhPSBudWxsKQorICAgICAgICAgICAgaW5zZXJ0ID0gaW5zZXJ0LmNsb25lKGNsb25lcik7CisgICAgICAgIGRhdGFTaXplICs9IGluc2VydC5kYXRhU2l6ZSgpOworICAgICAgICBoZWFwU2l6ZSArPSBpbnNlcnQudW5zaGFyZWRIZWFwU2l6ZUV4Y2x1ZGluZ0RhdGEoKTsKKyAgICAgICAgcmV0dXJuIGluc2VydDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZWxldGUoQ29sdW1uRGF0YSBleGlzdGluZykKKyAgICB7CisgICAgICAgIGRhdGFTaXplIC09IGV4aXN0aW5nLmRhdGFTaXplKCk7CisgICAgICAgIGhlYXBTaXplIC09IGV4aXN0aW5nLnVuc2hhcmVkSGVhcFNpemVFeGNsdWRpbmdEYXRhKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25BbGxvY2F0ZWRPbkhlYXAobG9uZyBoZWFwU2l6ZSkKKyAgICB7CisgICAgICAgIHRoaXMuaGVhcFNpemUgKz0gaGVhcFNpemU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVwb3J0QWxsb2NhdGVkTWVtb3J5KCkKKyAgICB7CisgICAgICAgIGFsbG9jYXRvci5vbkhlYXAoKS5hZGp1c3QoaGVhcFNpemUsIHdyaXRlT3ApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3BhcnRpdGlvbnMvQ2FjaGVkQlRyZWVQYXJ0aXRpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3BhcnRpdGlvbnMvQ2FjaGVkQlRyZWVQYXJ0aXRpb24uamF2YQppbmRleCAyMTgzYTk4Li5mMDlmNzVhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL0NhY2hlZEJUcmVlUGFydGl0aW9uLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9DYWNoZWRCVHJlZVBhcnRpdGlvbi5qYXZhCkBAIC00MCw3ICs0MCw3IEBACiAKICAgICBwcml2YXRlIENhY2hlZEJUcmVlUGFydGl0aW9uKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9sZGVyIGhvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUcmVlUGFydGl0aW9uRGF0YSBob2xkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3JlYXRlZEF0SW5TZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FjaGVkTGl2ZVJvd3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93c1dpdGhOb25FeHBpcmluZ0NlbGxzKQpAQCAtODAsNyArODAsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ2FjaGVkQlRyZWVQYXJ0aXRpb24gY3JlYXRlKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvciwgaW50IGluaXRpYWxSb3dDYXBhY2l0eSwgaW50IG5vd0luU2VjKQogICAgIHsKLSAgICAgICAgSG9sZGVyIGhvbGRlciA9IEltbXV0YWJsZUJUcmVlUGFydGl0aW9uLmJ1aWxkKGl0ZXJhdG9yLCBpbml0aWFsUm93Q2FwYWNpdHkpOworICAgICAgICBCVHJlZVBhcnRpdGlvbkRhdGEgaG9sZGVyID0gSW1tdXRhYmxlQlRyZWVQYXJ0aXRpb24uYnVpbGQoaXRlcmF0b3IsIGluaXRpYWxSb3dDYXBhY2l0eSk7CiAKICAgICAgICAgaW50IGNhY2hlZExpdmVSb3dzID0gMDsKICAgICAgICAgaW50IHJvd3NXaXRoTm9uRXhwaXJpbmdDZWxscyA9IDA7CkBAIC0xODAsNyArMTgwLDcgQEAKICAgICAgICAgICAgIFVuZmlsdGVyZWRSb3dJdGVyYXRvclNlcmlhbGl6ZXIuSGVhZGVyIGhlYWRlciA9IFVuZmlsdGVyZWRSb3dJdGVyYXRvclNlcmlhbGl6ZXIuc2VyaWFsaXplci5kZXNlcmlhbGl6ZUhlYWRlcihtZXRhZGF0YSwgbnVsbCwgaW4sIHZlcnNpb24sIERlc2VyaWFsaXphdGlvbkhlbHBlci5GbGFnLkxPQ0FMKTsKICAgICAgICAgICAgIGFzc2VydCAhaGVhZGVyLmlzUmV2ZXJzZWQgJiYgaGVhZGVyLnJvd0VzdGltYXRlID49IDA7CiAKLSAgICAgICAgICAgIEhvbGRlciBob2xkZXI7CisgICAgICAgICAgICBCVHJlZVBhcnRpdGlvbkRhdGEgaG9sZGVyOwogICAgICAgICAgICAgdHJ5IChVbmZpbHRlcmVkUm93SXRlcmF0b3IgcGFydGl0aW9uID0gVW5maWx0ZXJlZFJvd0l0ZXJhdG9yU2VyaWFsaXplci5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCB2ZXJzaW9uLCBtZXRhZGF0YSwgRGVzZXJpYWxpemF0aW9uSGVscGVyLkZsYWcuTE9DQUwsIGhlYWRlcikpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaG9sZGVyID0gSW1tdXRhYmxlQlRyZWVQYXJ0aXRpb24uYnVpbGQocGFydGl0aW9uLCBoZWFkZXIucm93RXN0aW1hdGUpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9JbW11dGFibGVCVHJlZVBhcnRpdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9JbW11dGFibGVCVHJlZVBhcnRpdGlvbi5qYXZhCmluZGV4IDUxMzlkNDAuLjY2MTcyNTUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3BhcnRpdGlvbnMvSW1tdXRhYmxlQlRyZWVQYXJ0aXRpb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL0ltbXV0YWJsZUJUcmVlUGFydGl0aW9uLmphdmEKQEAgLTI3LDcgKzI3LDcgQEAKIHB1YmxpYyBjbGFzcyBJbW11dGFibGVCVHJlZVBhcnRpdGlvbiBleHRlbmRzIEFic3RyYWN0QlRyZWVQYXJ0aXRpb24KIHsKIAotICAgIHByb3RlY3RlZCBmaW5hbCBIb2xkZXIgaG9sZGVyOworICAgIHByb3RlY3RlZCBmaW5hbCBCVHJlZVBhcnRpdGlvbkRhdGEgaG9sZGVyOwogICAgIHByb3RlY3RlZCBmaW5hbCBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhOwogCiAgICAgcHVibGljIEltbXV0YWJsZUJUcmVlUGFydGl0aW9uKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsCkBAIC00MCwxMiArNDAsMTIgQEAKICAgICB7CiAgICAgICAgIHN1cGVyKHBhcnRpdGlvbktleSk7CiAgICAgICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgdGhpcy5ob2xkZXIgPSBuZXcgSG9sZGVyKGNvbHVtbnMsIHRyZWUsIGRlbGV0aW9uSW5mbywgc3RhdGljUm93LCBzdGF0cyk7CisgICAgICAgIHRoaXMuaG9sZGVyID0gbmV3IEJUcmVlUGFydGl0aW9uRGF0YShjb2x1bW5zLCB0cmVlLCBkZWxldGlvbkluZm8sIHN0YXRpY1Jvdywgc3RhdHMpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCBJbW11dGFibGVCVHJlZVBhcnRpdGlvbihUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb2xkZXIgaG9sZGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVHJlZVBhcnRpdGlvbkRhdGEgaG9sZGVyKQogICAgIHsKICAgICAgICAgc3VwZXIocGFydGl0aW9uS2V5KTsKICAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhOwpAQCAtMTE5LDcgKzExOSw3IEBACiAgICAgICAgIHJldHVybiBtZXRhZGF0YTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgSG9sZGVyIGhvbGRlcigpCisgICAgcHJvdGVjdGVkIEJUcmVlUGFydGl0aW9uRGF0YSBob2xkZXIoKQogICAgIHsKICAgICAgICAgcmV0dXJuIGhvbGRlcjsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL1BhcnRpdGlvblN0YXRpc3RpY3NDb2xsZWN0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3BhcnRpdGlvbnMvUGFydGl0aW9uU3RhdGlzdGljc0NvbGxlY3Rvci5qYXZhCmluZGV4IDZkMzc2NDAuLjdjM2JhMTUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3BhcnRpdGlvbnMvUGFydGl0aW9uU3RhdGlzdGljc0NvbGxlY3Rvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3BhcnRpdGlvbnMvUGFydGl0aW9uU3RhdGlzdGljc0NvbGxlY3Rvci5qYXZhCkBAIC0yMiw5ICsyMiwxMCBAQAogCiBwdWJsaWMgaW50ZXJmYWNlIFBhcnRpdGlvblN0YXRpc3RpY3NDb2xsZWN0b3IKIHsKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoTGl2ZW5lc3NJbmZvIGluZm8pOwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lKTsKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoQ2VsbDw/PiBjZWxsKTsKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVDb2x1bW5TZXRQZXJSb3cobG9uZyBjb2x1bW5TZXRJblJvdyk7Ci0gICAgcHVibGljIHZvaWQgdXBkYXRlSGFzTGVnYWN5Q291bnRlclNoYXJkcyhib29sZWFuIGhhc0xlZ2FjeUNvdW50ZXJTaGFyZHMpOwotfQorICAgIHZvaWQgdXBkYXRlKExpdmVuZXNzSW5mbyBpbmZvKTsKKyAgICB2b2lkIHVwZGF0ZVBhcnRpdGlvbkRlbGV0aW9uKERlbGV0aW9uVGltZSBkdCk7CisgICAgdm9pZCB1cGRhdGUoRGVsZXRpb25UaW1lIGRlbGV0aW9uVGltZSk7CisgICAgdm9pZCB1cGRhdGUoQ2VsbDw/PiBjZWxsKTsKKyAgICB2b2lkIHVwZGF0ZUNvbHVtblNldFBlclJvdyhsb25nIGNvbHVtblNldEluUm93KTsKKyAgICB2b2lkIHVwZGF0ZUhhc0xlZ2FjeUNvdW50ZXJTaGFyZHMoYm9vbGVhbiBoYXNMZWdhY3lDb3VudGVyU2hhcmRzKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL1BhcnRpdGlvblVwZGF0ZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9QYXJ0aXRpb25VcGRhdGUuamF2YQppbmRleCA2MDE5ZDU2Li43ZjJjYTdkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL1BhcnRpdGlvblVwZGF0ZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3BhcnRpdGlvbnMvUGFydGl0aW9uVXBkYXRlLmphdmEKQEAgLTM2LDcgKzM2LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguSW5kZXhSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOwpAQCAtNjcsNyArNzAsNyBAQAogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJ0aXRpb25VcGRhdGVTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgUGFydGl0aW9uVXBkYXRlU2VyaWFsaXplcigpOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBIb2xkZXIgaG9sZGVyOworICAgIHByaXZhdGUgZmluYWwgQlRyZWVQYXJ0aXRpb25EYXRhIGhvbGRlcjsKICAgICBwcml2YXRlIGZpbmFsIERlbGV0aW9uSW5mbyBkZWxldGlvbkluZm87CiAgICAgcHJpdmF0ZSBmaW5hbCBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhOwogCkBAIC03NSw3ICs3OCw3IEBACiAKICAgICBwcml2YXRlIFBhcnRpdGlvblVwZGF0ZShUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9sZGVyIGhvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVHJlZVBhcnRpdGlvbkRhdGEgaG9sZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11dGFibGVEZWxldGlvbkluZm8gZGVsZXRpb25JbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY2FuSGF2ZVNoYWRvd2VkRGF0YSkKICAgICB7CkBAIC05Nyw3ICsxMDAsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgUGFydGl0aW9uVXBkYXRlIGVtcHR5VXBkYXRlKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsIERlY29yYXRlZEtleSBrZXkpCiAgICAgewogICAgICAgICBNdXRhYmxlRGVsZXRpb25JbmZvIGRlbGV0aW9uSW5mbyA9IE11dGFibGVEZWxldGlvbkluZm8ubGl2ZSgpOwotICAgICAgICBIb2xkZXIgaG9sZGVyID0gbmV3IEhvbGRlcihSZWd1bGFyQW5kU3RhdGljQ29sdW1ucy5OT05FLCBCVHJlZS5lbXB0eSgpLCBkZWxldGlvbkluZm8sIFJvd3MuRU1QVFlfU1RBVElDX1JPVywgRW5jb2RpbmdTdGF0cy5OT19TVEFUUyk7CisgICAgICAgIEJUcmVlUGFydGl0aW9uRGF0YSBob2xkZXIgPSBuZXcgQlRyZWVQYXJ0aXRpb25EYXRhKFJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zLk5PTkUsIEJUcmVlLmVtcHR5KCksIGRlbGV0aW9uSW5mbywgUm93cy5FTVBUWV9TVEFUSUNfUk9XLCBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTKTsKICAgICAgICAgcmV0dXJuIG5ldyBQYXJ0aXRpb25VcGRhdGUobWV0YWRhdGEsIGtleSwgaG9sZGVyLCBkZWxldGlvbkluZm8sIGZhbHNlKTsKICAgICB9CiAKQEAgLTExNCw3ICsxMTcsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgUGFydGl0aW9uVXBkYXRlIGZ1bGxQYXJ0aXRpb25EZWxldGUoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgRGVjb3JhdGVkS2V5IGtleSwgbG9uZyB0aW1lc3RhbXAsIGludCBub3dJblNlYykKICAgICB7CiAgICAgICAgIE11dGFibGVEZWxldGlvbkluZm8gZGVsZXRpb25JbmZvID0gbmV3IE11dGFibGVEZWxldGlvbkluZm8odGltZXN0YW1wLCBub3dJblNlYyk7Ci0gICAgICAgIEhvbGRlciBob2xkZXIgPSBuZXcgSG9sZGVyKFJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zLk5PTkUsIEJUcmVlLmVtcHR5KCksIGRlbGV0aW9uSW5mbywgUm93cy5FTVBUWV9TVEFUSUNfUk9XLCBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTKTsKKyAgICAgICAgQlRyZWVQYXJ0aXRpb25EYXRhIGhvbGRlciA9IG5ldyBCVHJlZVBhcnRpdGlvbkRhdGEoUmVndWxhckFuZFN0YXRpY0NvbHVtbnMuTk9ORSwgQlRyZWUuZW1wdHkoKSwgZGVsZXRpb25JbmZvLCBSb3dzLkVNUFRZX1NUQVRJQ19ST1csIEVuY29kaW5nU3RhdHMuTk9fU1RBVFMpOwogICAgICAgICByZXR1cm4gbmV3IFBhcnRpdGlvblVwZGF0ZShtZXRhZGF0YSwga2V5LCBob2xkZXIsIGRlbGV0aW9uSW5mbywgZmFsc2UpOwogICAgIH0KIApAQCAtMTMxLDcgKzEzNCw3IEBACiAgICAgcHVibGljIHN0YXRpYyBQYXJ0aXRpb25VcGRhdGUgc2luZ2xlUm93VXBkYXRlKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsIERlY29yYXRlZEtleSBrZXksIFJvdyByb3csIFJvdyBzdGF0aWNSb3cpCiAgICAgewogICAgICAgICBNdXRhYmxlRGVsZXRpb25JbmZvIGRlbGV0aW9uSW5mbyA9IE11dGFibGVEZWxldGlvbkluZm8ubGl2ZSgpOwotICAgICAgICBIb2xkZXIgaG9sZGVyID0gbmV3IEhvbGRlcigKKyAgICAgICAgQlRyZWVQYXJ0aXRpb25EYXRhIGhvbGRlciA9IG5ldyBCVHJlZVBhcnRpdGlvbkRhdGEoCiAgICAgICAgICAgICBuZXcgUmVndWxhckFuZFN0YXRpY0NvbHVtbnMoCiAgICAgICAgICAgICAgICAgc3RhdGljUm93ID09IG51bGwgPyBDb2x1bW5zLk5PTkUgOiBDb2x1bW5zLmZyb20oc3RhdGljUm93KSwKICAgICAgICAgICAgICAgICByb3cgPT0gbnVsbCA/IENvbHVtbnMuTk9ORSA6IENvbHVtbnMuZnJvbShyb3cpCkBAIC0xODcsNyArMTkwLDcgQEAKICAgICBwdWJsaWMgc3RhdGljIFBhcnRpdGlvblVwZGF0ZSBmcm9tSXRlcmF0b3IoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yLCBDb2x1bW5GaWx0ZXIgZmlsdGVyKQogICAgIHsKICAgICAgICAgaXRlcmF0b3IgPSBVbmZpbHRlcmVkUm93SXRlcmF0b3JzLndpdGhPbmx5UXVlcmllZERhdGEoaXRlcmF0b3IsIGZpbHRlcik7Ci0gICAgICAgIEhvbGRlciBob2xkZXIgPSBidWlsZChpdGVyYXRvciwgMTYpOworICAgICAgICBCVHJlZVBhcnRpdGlvbkRhdGEgaG9sZGVyID0gYnVpbGQoaXRlcmF0b3IsIDE2KTsKICAgICAgICAgTXV0YWJsZURlbGV0aW9uSW5mbyBkZWxldGlvbkluZm8gPSAoTXV0YWJsZURlbGV0aW9uSW5mbykgaG9sZGVyLmRlbGV0aW9uSW5mbzsKICAgICAgICAgcmV0dXJuIG5ldyBQYXJ0aXRpb25VcGRhdGUoaXRlcmF0b3IubWV0YWRhdGEoKSwgaXRlcmF0b3IucGFydGl0aW9uS2V5KCksIGhvbGRlciwgZGVsZXRpb25JbmZvLCBmYWxzZSk7CiAgICAgfQpAQCAtMjA4LDcgKzIxMSw3IEBACiAgICAgewogICAgICAgICBpdGVyYXRvciA9IFJvd0l0ZXJhdG9ycy53aXRoT25seVF1ZXJpZWREYXRhKGl0ZXJhdG9yLCBmaWx0ZXIpOwogICAgICAgICBNdXRhYmxlRGVsZXRpb25JbmZvIGRlbGV0aW9uSW5mbyA9IE11dGFibGVEZWxldGlvbkluZm8ubGl2ZSgpOwotICAgICAgICBIb2xkZXIgaG9sZGVyID0gYnVpbGQoaXRlcmF0b3IsIGRlbGV0aW9uSW5mbywgdHJ1ZSk7CisgICAgICAgIEJUcmVlUGFydGl0aW9uRGF0YSBob2xkZXIgPSBidWlsZChpdGVyYXRvciwgZGVsZXRpb25JbmZvLCB0cnVlKTsKICAgICAgICAgcmV0dXJuIG5ldyBQYXJ0aXRpb25VcGRhdGUoaXRlcmF0b3IubWV0YWRhdGEoKSwgaXRlcmF0b3IucGFydGl0aW9uS2V5KCksIGhvbGRlciwgZGVsZXRpb25JbmZvLCBmYWxzZSk7CiAgICAgfQogCkBAIC0zNzMsNyArMzc2LDcgQEAKICAgICAgICAgcmV0dXJuIGhvbGRlci5jb2x1bW5zOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBIb2xkZXIgaG9sZGVyKCkKKyAgICBwcm90ZWN0ZWQgQlRyZWVQYXJ0aXRpb25EYXRhIGhvbGRlcigpCiAgICAgewogICAgICAgICByZXR1cm4gaG9sZGVyOwogICAgIH0KQEAgLTQ2Myw2ICs0NjYsNjIgQEAKICAgICAgICAgcmV0dXJuIG1hcmtzOwogICAgIH0KIAorICAgIC8qKgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZXN0aW1hdGVkIG51bWJlciBvZiByb3dzIGFmZmVjdGVkIGJ5IHRoaXMgbXV0YXRpb24gCisgICAgICovCisgICAgcHVibGljIGludCBhZmZlY3RlZFJvd0NvdW50KCkKKyAgICB7CisgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcGFydGl0aW9uLWxldmVsIGRlbGV0aW9uLCB3ZSBpbnRlbmQgdG8gZGVsZXRlIGF0IGxlYXN0IG9uZSByb3cuCisgICAgICAgIGlmICghcGFydGl0aW9uTGV2ZWxEZWxldGlvbigpLmlzTGl2ZSgpKQorICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKworICAgICAgICAvLyBFYWNoIHJhbmdlIGRlbGV0ZSBzaG91bGQgY29ycmVzcG9uZCB0byBhdCBsZWFzdCBvbmUgaW50ZW5kZWQgcm93IGRlbGV0aW9uLgorICAgICAgICBpZiAoZGVsZXRpb25JbmZvKCkuaGFzUmFuZ2VzKCkpCisgICAgICAgICAgICBjb3VudCArPSBkZWxldGlvbkluZm8oKS5yYW5nZUNvdW50KCk7CisKKyAgICAgICAgY291bnQgKz0gcm93Q291bnQoKTsKKworICAgICAgICBpZiAoIXN0YXRpY1JvdygpLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGNvdW50Kys7CisKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZXN0aW1hdGVkIHRvdGFsIG51bWJlciBvZiBjb2x1bW5zIHRoYXQgZWl0aGVyIGhhdmUgbGl2ZSBkYXRhIG9yIGFyZSBjb3ZlcmVkIGJ5IGEgZGVsZXRlCisgICAgICovCisgICAgcHVibGljIGludCBhZmZlY3RlZENvbHVtbkNvdW50KCkKKyAgICB7CisgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcGFydGl0aW9uLWxldmVsIGRlbGV0aW9uLCB3ZSBpbnRlbmQgdG8gZGVsZXRlIGF0IGxlYXN0IHRoZSBjb2x1bW5zIG9mIG9uZSByb3cuCisgICAgICAgIGlmICghcGFydGl0aW9uTGV2ZWxEZWxldGlvbigpLmlzTGl2ZSgpKQorICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhKCkucmVndWxhckFuZFN0YXRpY0NvbHVtbnMoKS5zaXplKCk7CisKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKworICAgICAgICAvLyBFYWNoIHJhbmdlIGRlbGV0ZSBzaG91bGQgY29ycmVzcG9uZCB0byBhdCBsZWFzdCBvbmUgaW50ZW5kZWQgcm93IGRlbGV0aW9uLCBhbmQgd2l0aCBpdCwgaXRzIHJlZ3VsYXIgY29sdW1ucy4KKyAgICAgICAgaWYgKGRlbGV0aW9uSW5mbygpLmhhc1JhbmdlcygpKQorICAgICAgICAgICAgY291bnQgKz0gZGVsZXRpb25JbmZvKCkucmFuZ2VDb3VudCgpICogbWV0YWRhdGEoKS5yZWd1bGFyQ29sdW1ucygpLnNpemUoKTsKKworICAgICAgICBmb3IgKFJvdyByb3cgOiB0aGlzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocm93LmRlbGV0aW9uKCkuaXNMaXZlKCkpCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJvdyBpcyBsaXZlLCB0aGlzIHdpbGwgaW5jbHVkZSBzaW1wbGUgdG9tYnN0b25lcyBhcyB3ZWxsIGFzIGNlbGxzIHcvIGFjdHVhbCBkYXRhLiAKKyAgICAgICAgICAgICAgICBjb3VudCArPSByb3cuY29sdW1uQ291bnQoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgcm93IGRlbGV0aW9uLCBzbyBhY2NvdW50IGZvciB0aGUgY29sdW1ucyB0aGF0IG1pZ2h0IGJlIGRlbGV0ZWQuCisgICAgICAgICAgICAgICAgY291bnQgKz0gbWV0YWRhdGEoKS5yZWd1bGFyQ29sdW1ucygpLnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc3RhdGljUm93KCkuaXNFbXB0eSgpKQorICAgICAgICAgICAgY291bnQgKz0gc3RhdGljUm93KCkuY29sdW1uQ291bnQoKTsKKworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRNYXJrc0ZvclJvdyhSb3cgcm93LCBMaXN0PENvdW50ZXJNYXJrPiBtYXJrcykKICAgICB7CiAgICAgICAgIGZvciAoQ2VsbDw/PiBjZWxsIDogcm93LmNlbGxzKCkpCkBAIC00OTQsNyArNTUzLDcgQEAKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBwdWJsaWMgc3RhdGljIFBhcnRpdGlvblVwZGF0ZSB1bnNhZmVDb25zdHJ1Y3QoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9sZGVyIGhvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRyZWVQYXJ0aXRpb25EYXRhIGhvbGRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXV0YWJsZURlbGV0aW9uSW5mbyBkZWxldGlvbkluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY2FuSGF2ZVNoYWRvd2VkRGF0YSkKICAgICB7CkBAIC02OTAsNyArNzQ5LDcgQEAKICAgICAgICAgICAgIE11dGFibGVEZWxldGlvbkluZm8gZGVsZXRpb25JbmZvID0gZGVsZXRpb25CdWlsZGVyLmJ1aWxkKCk7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFBhcnRpdGlvblVwZGF0ZShtZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSG9sZGVyKGhlYWRlci5zSGVhZGVyLmNvbHVtbnMoKSwgcm93cywgZGVsZXRpb25JbmZvLCBoZWFkZXIuc3RhdGljUm93LCBoZWFkZXIuc0hlYWRlci5zdGF0cygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCVHJlZVBhcnRpdGlvbkRhdGEoaGVhZGVyLnNIZWFkZXIuY29sdW1ucygpLCByb3dzLCBkZWxldGlvbkluZm8sIGhlYWRlci5zdGF0aWNSb3csIGhlYWRlci5zSGVhZGVyLnN0YXRzKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRpb25JbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgICAgICB9CkBAIC03MDIsNyArNzYxLDcgQEAKICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA+PSBpbi5saW1pdCgpKQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBFT0ZFeGNlcHRpb24oKTsKICAgICAgICAgICAgIC8vIERlY29yYXRlZEtleSBrZXkgPSBtZXRhZGF0YS5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFZJbnRMZW5ndGgoaW4pKTsKLSAgICAgICAgICAgIGludCBrZXlMZW5ndGggPSAoaW50KSBWSW50Q29kaW5nLmdldFVuc2lnbmVkVkludChpbiwgcG9zaXRpb24pOworICAgICAgICAgICAgaW50IGtleUxlbmd0aCA9IFZJbnRDb2RpbmcuZ2V0VW5zaWduZWRWSW50MzIoaW4sIHBvc2l0aW9uKTsKICAgICAgICAgICAgIHBvc2l0aW9uICs9IGtleUxlbmd0aCArIFZJbnRDb2RpbmcuY29tcHV0ZVVuc2lnbmVkVkludFNpemUoa2V5TGVuZ3RoKTsKICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA+PSBpbi5saW1pdCgpKQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBFT0ZFeGNlcHRpb24oKTsKQEAgLTgwMCw3ICs4NTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBSZWd1bGFyQW5kU3RhdGljQ29sdW1ucyBjb2x1bW5zLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5pdGlhbFJvd0NhcGFjaXR5LAogICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNhbkhhdmVTaGFkb3dlZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIEhvbGRlciBob2xkZXIpCisgICAgICAgICAgICAgICAgICAgICAgIEJUcmVlUGFydGl0aW9uRGF0YSBob2xkZXIpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXMobWV0YWRhdGEsIGtleSwgY29sdW1ucywgaW5pdGlhbFJvd0NhcGFjaXR5LCBjYW5IYXZlU2hhZG93ZWREYXRhLCBob2xkZXIuc3RhdGljUm93LCBob2xkZXIuZGVsZXRpb25JbmZvLCBob2xkZXIudHJlZSk7CiAgICAgICAgIH0KQEAgLTkwOSwxMSArOTY4LDExIEBACiAgICAgICAgICAgICBpc0J1aWx0ID0gdHJ1ZTsKICAgICAgICAgICAgIHJldHVybiBuZXcgUGFydGl0aW9uVXBkYXRlKG1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uS2V5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSG9sZGVyKGNvbHVtbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRpb25JbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNSb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCVHJlZVBhcnRpdGlvbkRhdGEoY29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGlvbkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY1JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhdHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRpb25JbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuSGF2ZVNoYWRvd2VkRGF0YSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3BhcnRpdGlvbnMvUHVyZ2VGdW5jdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9QdXJnZUZ1bmN0aW9uLmphdmEKaW5kZXggMDlmM2FlMy4uNWQ5N2ZkMyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9QdXJnZUZ1bmN0aW9uLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9QdXJnZUZ1bmN0aW9uLmphdmEKQEAgLTMxLDEzICszMSwxNSBAQAogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBlbmZvcmNlU3RyaWN0TGl2ZW5lc3M7CiAgICAgcHJpdmF0ZSBib29sZWFuIGlzUmV2ZXJzZU9yZGVyOwogCisgICAgcHJpdmF0ZSBib29sZWFuIGlnbm9yZUdjR3JhY2VTZWNvbmRzOworCiAgICAgcHVibGljIFB1cmdlRnVuY3Rpb24oaW50IG5vd0luU2VjLCBpbnQgZ2NCZWZvcmUsIGludCBvbGRlc3RVbnJlcGFpcmVkVG9tYnN0b25lLCBib29sZWFuIG9ubHlQdXJnZVJlcGFpcmVkVG9tYnN0b25lcywKICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGVuZm9yY2VTdHJpY3RMaXZlbmVzcykKICAgICB7CiAgICAgICAgIHRoaXMubm93SW5TZWMgPSBub3dJblNlYzsKICAgICAgICAgdGhpcy5wdXJnZXIgPSAodGltZXN0YW1wLCBsb2NhbERlbGV0aW9uVGltZSkgLT4KICAgICAgICAgICAgICAgICAgICAgICAhKG9ubHlQdXJnZVJlcGFpcmVkVG9tYnN0b25lcyAmJiBsb2NhbERlbGV0aW9uVGltZSA+PSBvbGRlc3RVbnJlcGFpcmVkVG9tYnN0b25lKQotICAgICAgICAgICAgICAgICAgICAgICYmIGxvY2FsRGVsZXRpb25UaW1lIDwgZ2NCZWZvcmUKKyAgICAgICAgICAgICAgICAgICAgICAmJiAobG9jYWxEZWxldGlvblRpbWUgPCBnY0JlZm9yZSB8fCBpZ25vcmVHY0dyYWNlU2Vjb25kcykKICAgICAgICAgICAgICAgICAgICAgICAmJiBnZXRQdXJnZUV2YWx1YXRvcigpLnRlc3QodGltZXN0YW1wKTsKICAgICAgICAgdGhpcy5lbmZvcmNlU3RyaWN0TGl2ZW5lc3MgPSBlbmZvcmNlU3RyaWN0TGl2ZW5lc3M7CiAgICAgfQpAQCAtNTksNiArNjEsMTMgQEAKICAgICB7CiAgICAgfQogCisgICAgLy8gQ2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBuZXcgcGFydGl0aW9uCisgICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgcGFydGl0aW9uS2V5IGlnbm9yZXMgdGhlIGdjX2dyYWNlX3NlY29uZHMgZHVyaW5nIGNvbXBhY3Rpb24uCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkSWdub3JlR2NHcmFjZSgpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0UmV2ZXJzZU9yZGVyKGJvb2xlYW4gaXNSZXZlcnNlT3JkZXIpCiAgICAgewogICAgICAgICB0aGlzLmlzUmV2ZXJzZU9yZGVyID0gaXNSZXZlcnNlT3JkZXI7CkBAIC03MCw2ICs3OSw4IEBACiAgICAgewogICAgICAgICBvbk5ld1BhcnRpdGlvbihwYXJ0aXRpb24ucGFydGl0aW9uS2V5KCkpOwogCisgICAgICAgIGlnbm9yZUdjR3JhY2VTZWNvbmRzID0gc2hvdWxkSWdub3JlR2NHcmFjZSgpOworCiAgICAgICAgIHNldFJldmVyc2VPcmRlcihwYXJ0aXRpb24uaXNSZXZlcnNlT3JkZXIoKSk7CiAgICAgICAgIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBwdXJnZWQgPSBUcmFuc2Zvcm1hdGlvbi5hcHBseShwYXJ0aXRpb24sIHRoaXMpOwogICAgICAgICBpZiAocHVyZ2VkLmlzRW1wdHkoKSkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3BhcnRpdGlvbnMvVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9ycy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9VbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3JzLmphdmEKaW5kZXggYTA1MWVlMS4uMDJmZGRlMCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9VbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3JzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9VbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3JzLmphdmEKQEAgLTM4Niw0ICszODYsNCBAQAogICAgICAgICAgICAgfTsKICAgICAgICAgfQogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yZXBhaXIvUGVuZGluZ0FudGlDb21wYWN0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yZXBhaXIvUGVuZGluZ0FudGlDb21wYWN0aW9uLmphdmEKaW5kZXggYWY5ODg4YS4uNTUxMzhlOCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcmVwYWlyL1BlbmRpbmdBbnRpQ29tcGFjdGlvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3JlcGFpci9QZW5kaW5nQW50aUNvbXBhY3Rpb24uamF2YQpAQCAtMzUsNiArMzUsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5VbmludGVycnVwdGlibGVzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5GdXR1cmVUYXNrOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5GdXR1cmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5GdXR1cmVDb21iaW5lcjsKQEAgLTY3LDggKzY4LDggQEAKIHB1YmxpYyBjbGFzcyBQZW5kaW5nQW50aUNvbXBhY3Rpb24KIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUGVuZGluZ0FudGlDb21wYWN0aW9uLmNsYXNzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNRVUlSRV9TTEVFUF9NUyA9IEludGVnZXIuZ2V0SW50ZWdlcigiY2Fzc2FuZHJhLmFjcXVpcmVfc2xlZXBfbXMiLCAxMDAwKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNRVUlSRV9SRVRSWV9TRUNPTkRTID0gSW50ZWdlci5nZXRJbnRlZ2VyKCJjYXNzYW5kcmEuYWNxdWlyZV9yZXRyeV9zZWNvbmRzIiwgNjApOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ1FVSVJFX1NMRUVQX01TID0gQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkFDUVVJUkVfU0xFRVBfTVMuZ2V0SW50KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDUVVJUkVfUkVUUllfU0VDT05EUyA9IENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5BQ1FVSVJFX1JFVFJZX1NFQ09ORFMuZ2V0SW50KCk7CiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFjcXVpcmVSZXN1bHQKICAgICB7CkBAIC0yMTQsNiArMjE1LDExIEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogCisgICAgICAgIHByb3RlY3RlZCBBY3F1aXJlUmVzdWx0IGFjcXVpcmVTU1RhYmxlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjZnMucnVuV2l0aENvbXBhY3Rpb25zRGlzYWJsZWQodGhpczo6YWNxdWlyZVR1cGxlLCBwcmVkaWNhdGUsIE9wZXJhdGlvblR5cGUuQU5USUNPTVBBQ1RJT04sIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIEFjcXVpcmVSZXN1bHQgY2FsbCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiYWNxdWlyaW5nIHNzdGFibGVzIGZvciBwZW5kaW5nIGFudGkgY29tcGFjdGlvbiBvbiBzZXNzaW9uIHt9Iiwgc2Vzc2lvbklEKTsKQEAgLTIzMSw3ICsyMzcsNyBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGFudGljb21wYWN0aW9ucyBhcmUgbm90IGRpc2FibGVkIHdoZW4gcnVubmluZyB0aGlzLiBUaGlzIGlzIHNhZmUgc2luY2UgcnVuV2l0aENvbXBhY3Rpb25zRGlzYWJsZWQKICAgICAgICAgICAgICAgICAgICAgLy8gaXMgc3luY2hyb25pemVkIC0gYWNxdWlyZVR1cGxlIGFuZCBwcmVkaWNhdGUgY2FuIG9ubHkgYmUgcnVuIGJ5IGEgc2luZ2xlIHRocmVhZCAoZm9yIHRoZSBnaXZlbiBjZnMpLgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2ZzLnJ1bldpdGhDb21wYWN0aW9uc0Rpc2FibGVkKHRoaXM6OmFjcXVpcmVUdXBsZSwgcHJlZGljYXRlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjcXVpcmVTU1RhYmxlcygpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXRjaCAoU1NUYWJsZUFjcXVpc2l0aW9uRXhjZXB0aW9uIGUpCiAgICAgICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9BcnRpZmljaWFsQm91bmRNYXJrZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvQXJ0aWZpY2lhbEJvdW5kTWFya2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ2ZTM5YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvQXJ0aWZpY2lhbEJvdW5kTWFya2VyLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzOworCitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nQm91bmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25UaW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworCitwdWJsaWMgY2xhc3MgQXJ0aWZpY2lhbEJvdW5kTWFya2VyIGV4dGVuZHMgUmFuZ2VUb21ic3RvbmVCb3VuZE1hcmtlcgoreworICAgIHB1YmxpYyBBcnRpZmljaWFsQm91bmRNYXJrZXIoQ2x1c3RlcmluZ0JvdW5kPD8+IGJvdW5kKQorICAgIHsKKyAgICAgICAgc3VwZXIoYm91bmQsIERlbGV0aW9uVGltZS5MSVZFKTsKKyAgICAgICAgYXNzZXJ0IGJvdW5kLmlzQXJ0aWZpY2lhbCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpCisgICAgeworICAgICAgICBpZiAodGhpcyA9PSBvdGhlcikKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgQXJ0aWZpY2lhbEJvdW5kTWFya2VyKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBBcnRpZmljaWFsQm91bmRNYXJrZXIgdGhhdCA9IChBcnRpZmljaWFsQm91bmRNYXJrZXIpIG90aGVyOworICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHMoYm91bmQsIHRoYXQuYm91bmQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaChib3VuZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIkxvd2VyQm91bmRNYXJrZXIgJXMiLCBib3VuZC50b1N0cmluZyhtZXRhZGF0YSkpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL0VuY29kaW5nU3RhdHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvRW5jb2RpbmdTdGF0cy5qYXZhCmluZGV4IDM3ZGQzNGUuLmEyOWNlOGYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvRW5jb2RpbmdTdGF0cy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvRW5jb2RpbmdTdGF0cy5qYXZhCkBAIC02Nyw3ICs2Nyw3IEBACiAKICAgICAvLyBXZSBzaG91bGQgdXNlIHRoaXMgc3BhcmluZ2x5IG9idmlvdXNseQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW5jb2RpbmdTdGF0cyBOT19TVEFUUyA9IG5ldyBFbmNvZGluZ1N0YXRzKFRJTUVTVEFNUF9FUE9DSCwgREVMRVRJT05fVElNRV9FUE9DSCwgVFRMX0VQT0NIKTsKLSAgICBwdWJsaWMgc3RhdGljIGxvbmcgSEVBUF9TSVpFID0gT2JqZWN0U2l6ZXMubWVhc3VyZShOT19TVEFUUyk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEhFQVBfU0laRSA9IE9iamVjdFNpemVzLm1lYXN1cmUoTk9fU1RBVFMpOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgU2VyaWFsaXplcigpOwogCkBAIC0yMTUsNiArMjE1LDEyIEBACiAgICAgICAgICAgICB1cGRhdGVMb2NhbERlbGV0aW9uVGltZShkZWxldGlvblRpbWUubG9jYWxEZWxldGlvblRpbWUoKSk7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlUGFydGl0aW9uRGVsZXRpb24oRGVsZXRpb25UaW1lIGR0KQorICAgICAgICB7CisgICAgICAgICAgICB1cGRhdGUoZHQpOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlVGltZXN0YW1wKGxvbmcgdGltZXN0YW1wKQogICAgICAgICB7CiAgICAgICAgICAgICBpc1RpbWVzdGFtcFNldCA9IHRydWU7CkBAIC0yNjYsOCArMjcyLDggQEAKICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKEVuY29kaW5nU3RhdHMgc3RhdHMsIERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChzdGF0cy5taW5UaW1lc3RhbXAgLSBUSU1FU1RBTVBfRVBPQ0gpOwotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHN0YXRzLm1pbkxvY2FsRGVsZXRpb25UaW1lIC0gREVMRVRJT05fVElNRV9FUE9DSCk7Ci0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoc3RhdHMubWluVFRMIC0gVFRMX0VQT0NIKTsKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKHN0YXRzLm1pbkxvY2FsRGVsZXRpb25UaW1lIC0gREVMRVRJT05fVElNRV9FUE9DSCk7CisgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihzdGF0cy5taW5UVEwgLSBUVExfRVBPQ0gpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGludCBzZXJpYWxpemVkU2l6ZShFbmNvZGluZ1N0YXRzIHN0YXRzKQpAQCAtMjgwLDkgKzI4Niw5IEBACiAgICAgICAgIHB1YmxpYyBFbmNvZGluZ1N0YXRzIGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICBsb25nIG1pblRpbWVzdGFtcCA9IGluLnJlYWRVbnNpZ25lZFZJbnQoKSArIFRJTUVTVEFNUF9FUE9DSDsKLSAgICAgICAgICAgIGludCBtaW5Mb2NhbERlbGV0aW9uVGltZSA9IChpbnQpaW4ucmVhZFVuc2lnbmVkVkludCgpICsgREVMRVRJT05fVElNRV9FUE9DSDsKLSAgICAgICAgICAgIGludCBtaW5UVEwgPSAoaW50KWluLnJlYWRVbnNpZ25lZFZJbnQoKSArIFRUTF9FUE9DSDsKKyAgICAgICAgICAgIGludCBtaW5Mb2NhbERlbGV0aW9uVGltZSA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpICsgREVMRVRJT05fVElNRV9FUE9DSDsKKyAgICAgICAgICAgIGludCBtaW5UVEwgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKSArIFRUTF9FUE9DSDsKICAgICAgICAgICAgIHJldHVybiBuZXcgRW5jb2RpbmdTdGF0cyhtaW5UaW1lc3RhbXAsIG1pbkxvY2FsRGVsZXRpb25UaW1lLCBtaW5UVEwpOwogICAgICAgICB9CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvTGF6aWx5SW5pdGlhbGl6ZWRVbmZpbHRlcmVkUm93SXRlcmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvTGF6aWx5SW5pdGlhbGl6ZWRVbmZpbHRlcmVkUm93SXRlcmF0b3IuamF2YQppbmRleCBkOGJkMzZmLi44YThiMjI5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL0xhemlseUluaXRpYWxpemVkVW5maWx0ZXJlZFJvd0l0ZXJhdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9MYXppbHlJbml0aWFsaXplZFVuZmlsdGVyZWRSb3dJdGVyYXRvci5qYXZhCkBAIC0xNywxNyArMTcsMTcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzOwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlbGV0aW9uVGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWd1bGFyQW5kU3RhdGljQ29sdW1uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5BYnN0cmFjdEl0ZXJhdG9yOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKLQogLyoqCi0gKiBBYnN0cmFjdCBjbGFzcyB0byBjcmVhdGUgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHRoYXQgbGF6aWx5IGluaXRpYWxpemUgdGhlbXNlbHZlcy4KLSAqCisgKiBBYnN0cmFjdCBjbGFzcyB0byBjcmVhdGUgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHRoYXQgbGF6aWx5IGluaXRpYWxpemVzIGl0c2VsZi4KKyAqIDxwPgogICogVGhpcyBpcyB1c2VkIGR1cmluZyBwYXJ0aXRpb24gcmFuZ2UgcXVlcmllcyB3aGVuIHdlIGtub3cgdGhlIHBhcnRpdGlvbiBrZXkgYnV0IHdhbnQKLSAqIHRvIGRlZmVyIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcmVzdCBvZiB0aGUgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHVudGlsIHdlIG5lZWQgdGhvc2UgaW5mb3JtYXRpb25zLgotICogU2VlIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnVGFibGVTY2FubmVyLktleVNjYW5uaW5nSXRlcmF0b3J9IGZvciBpbnN0YW5jZS4KKyAqIHRvIGRlZmVyIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcmVzdCBvZiB0aGUgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHVudGlsIHdlIG5lZWQgaXQuCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMYXppbHlJbml0aWFsaXplZFVuZmlsdGVyZWRSb3dJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0SXRlcmF0b3I8VW5maWx0ZXJlZD4gaW1wbGVtZW50cyBVbmZpbHRlcmVkUm93SXRlcmF0b3IKIHsKQEAgLTQ4LDExICs0OCw2IEBACiAgICAgICAgICAgICBpdGVyYXRvciA9IGluaXRpYWxpemVJdGVyYXRvcigpOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIGluaXRpYWxpemVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpdGVyYXRvciAhPSBudWxsOwotICAgIH0KLQogICAgIHB1YmxpYyBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKCkKICAgICB7CiAgICAgICAgIG1heWJlSW5pdCgpOwpAQCAtMTAzLDYgKzk4LDE0IEBACiAgICAgcHVibGljIHZvaWQgY2xvc2UoKQogICAgIHsKICAgICAgICAgaWYgKGl0ZXJhdG9yICE9IG51bGwpCisgICAgICAgIHsKICAgICAgICAgICAgIGl0ZXJhdG9yLmNsb3NlKCk7CisgICAgICAgICAgICBpdGVyYXRvciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGl0ZXJhdG9yICE9IG51bGw7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9Sb3cuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvUm93LmphdmEKaW5kZXggYmY4YzA1MS4uOWU4Mjc2YSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9Sb3cuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1Jvdy5qYXZhCkBAIC0xNTAsMTAgKzE1MCwxMCBAQAogICAgIHB1YmxpYyBDb21wbGV4Q29sdW1uRGF0YSBnZXRDb21wbGV4Q29sdW1uRGF0YShDb2x1bW5NZXRhZGF0YSBjKTsKIAogICAgIC8qKgotICAgICAqIFRoZSBkYXRhIGZvciBhIHJlZ3VsYXIgb3IgY29tcGxleCBjb2x1bW4uCisgICAgICogUmV0dXJucyB0aGUge0BsaW5rIENvbHVtbkRhdGF9IGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbi4KICAgICAgKgotICAgICAqIEBwYXJhbSBjIHRoZSBjb2x1bW4gZm9yIHdoaWNoIHRvIHJldHVybiB0aGUgY29tcGxleCBkYXRhLgotICAgICAqIEByZXR1cm4gdGhlIGRhdGEgZm9yIHtAY29kZSBjfSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHJvdyBoYXMgbm8gZGF0YSBmb3IgdGhpcyBjb2x1bW4uCisgICAgICogQHBhcmFtIGMgdGhlIGNvbHVtbiBmb3Igd2hpY2ggdG8gZmV0Y2ggdGhlIGRhdGEuCisgICAgICogQHJldHVybiB0aGUgZGF0YSBmb3IgdGhlIGNvbHVtbiBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHJvdyBoYXMgbm8gZGF0YSBmb3IgdGhpcyBjb2x1bW4uCiAgICAgICovCiAgICAgcHVibGljIENvbHVtbkRhdGEgZ2V0Q29sdW1uRGF0YShDb2x1bW5NZXRhZGF0YSBjKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9UaHJvdHRsZWRVbmZpbHRlcmVkSXRlcmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvVGhyb3R0bGVkVW5maWx0ZXJlZEl0ZXJhdG9yLmphdmEKaW5kZXggY2JiYWM2NC4uMjQ3NDA4NCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9UaHJvdHRsZWRVbmZpbHRlcmVkSXRlcmF0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1Rocm90dGxlZFVuZmlsdGVyZWRJdGVyYXRvci5qYXZhCkBAIC0yMSwxMyArMjEsMTMgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CisKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5VbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQWJzdHJhY3RJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9zZWFibGVJdGVyYXRvcjsKIAotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotCiAvKioKICAqIEEgdXRpbGl0eSBjbGFzcyB0byBzcGxpdCB0aGUgZ2l2ZW4ge0BsaW5rI1VuZmlsdGVyZWRSb3dJdGVyYXRvcn0gaW50byBzbWFsbGVyIGNodW5rcyBlYWNoCiAgKiBoYXZpbmcgYXQgbW9zdCB7QGxpbmsgI3Rocm90dGxlfSArIDEgdW5maWx0ZXJlZHMuCkBAIC04Myw3ICs4Myw3IEBACiAgICAgICAgICAgICByZXR1cm4gdGhyb3R0bGVkSXRyID0gb3JpZ2luOwogICAgICAgICB9CiAKLSAgICAgICAgdGhyb3R0bGVkSXRyID0gbmV3IFdyYXBwaW5nVW5maWx0ZXJlZFJvd0l0ZXJhdG9yKG9yaWdpbikKKyAgICAgICAgdGhyb3R0bGVkSXRyID0gbmV3IFdyYXBwaW5nVW5maWx0ZXJlZFJvd0l0ZXJhdG9yKCkKICAgICAgICAgewogICAgICAgICAgICAgcHJpdmF0ZSBpbnQgY291bnQgPSAwOwogICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzRmlyc3QgPSB0aHJvdHRsZWRJdHIgPT0gbnVsbDsKQEAgLTk3LDkgKzk3LDE1IEBACiAgICAgICAgICAgICBwcml2YXRlIFJhbmdlVG9tYnN0b25lTWFya2VyIGNsb3NlTWFya2VyID0gbnVsbDsKIAogICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHdyYXBwZWQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICh3aXRoaW5MaW1pdCgpICYmIHdyYXBwZWQuaGFzTmV4dCgpKSB8fCBjbG9zZU1hcmtlciAhPSBudWxsOworICAgICAgICAgICAgICAgIHJldHVybiAod2l0aGluTGltaXQoKSAmJiBvcmlnaW4uaGFzTmV4dCgpKSB8fCBjbG9zZU1hcmtlciAhPSBudWxsOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKQEAgLTExOSw3ICsxMjUsNyBAQAogICAgICAgICAgICAgICAgIGlmIChvdmVyZmxvd2VkLmhhc05leHQoKSkKICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IG92ZXJmbG93ZWQubmV4dCgpOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHdyYXBwZWQubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBuZXh0ID0gb3JpZ2luLm5leHQoKTsKICAgICAgICAgICAgICAgICByZWNvcmROZXh0KG5leHQpOwogICAgICAgICAgICAgICAgIHJldHVybiBuZXh0OwogICAgICAgICAgICAgfQpAQCAtMTMyLDggKzEzOCw4IEBACiAgICAgICAgICAgICAgICAgLy8gd2hlbiByZWFjaCB0aHJvdHRsZSB3aXRoIGEgcmVtYWluaW5nIG9wZW5NYXJrZXIsIHdlIG5lZWQgdG8gY3JlYXRlIGNvcnJlc3BvbmRpbmcgY2xvc2VNYXJrZXIuCiAgICAgICAgICAgICAgICAgaWYgKGNvdW50ID09IHRocm90dGxlICYmIG9wZW5NYXJrZXIgIT0gbnVsbCkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCB3cmFwcGVkLmhhc05leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2VPcGVuTWFya2VyKHdyYXBwZWQubmV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG9yaWdpbi5oYXNOZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlT3Blbk1hcmtlcihvcmlnaW4ubmV4dCgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTE5MSwxMyArMTk3LDEzIEBACiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBEZWxldGlvblRpbWUgcGFydGl0aW9uTGV2ZWxEZWxldGlvbigpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzRmlyc3QgPyB3cmFwcGVkLnBhcnRpdGlvbkxldmVsRGVsZXRpb24oKSA6IERlbGV0aW9uVGltZS5MSVZFOworICAgICAgICAgICAgICAgIHJldHVybiBpc0ZpcnN0ID8gb3JpZ2luLnBhcnRpdGlvbkxldmVsRGVsZXRpb24oKSA6IERlbGV0aW9uVGltZS5MSVZFOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBSb3cgc3RhdGljUm93KCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNGaXJzdCA/IHdyYXBwZWQuc3RhdGljUm93KCkgOiBSb3dzLkVNUFRZX1NUQVRJQ19ST1c7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlzRmlyc3QgPyBvcmlnaW4uc3RhdGljUm93KCkgOiBSb3dzLkVNUFRZX1NUQVRJQ19ST1c7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEBPdmVycmlkZQpAQCAtMjU4LDQgKzI2NCw0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH07CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvVW5maWx0ZXJlZFJvd0l0ZXJhdG9yU2VyaWFsaXplci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9VbmZpbHRlcmVkUm93SXRlcmF0b3JTZXJpYWxpemVyLmphdmEKaW5kZXggMTE1NDFlZS4uMWJlM2Q1NCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9VbmZpbHRlcmVkUm93SXRlcmF0b3JTZXJpYWxpemVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9VbmZpbHRlcmVkUm93SXRlcmF0b3JTZXJpYWxpemVyLmphdmEKQEAgLTE3LDE1ICsxNywyMSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3M7CiAKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FcnJvcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uOwogCiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlbGV0aW9uVGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5FbXB0eUl0ZXJhdG9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWd1bGFyQW5kU3RhdGljQ29sdW1uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXRQYXJ0aXRpb25Xcml0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CkBAIC02MCw3ICs2Niw3IEBACiAgKgogICogUGxlYXNlIG5vdGUgdGhhdCB0aGUgZm9ybWF0IGRlc2NyaWJlZCBhYm92ZSBpcyB0aGUgb24td2lyZSBmb3JtYXQuIE9uLWRpc2ssIHRoZSBmb3JtYXQgaXMgYmFzaWNhbGx5IHRoZQogICogc2FtZSwgYnV0IHRoZSBoZWFkZXIgaXMgd3JpdHRlbiBvbmNlIHBlciBzc3RhYmxlLCBub3Qgb25jZSBwZXItcGFydGl0aW9uLiBGdXJ0aGVyLCB0aGUgYWN0dWFsIHJvdyBhbmQKLSAqIHJhbmdlIHRvbWJzdG9uZXMgYXJlIG5vdCB3cml0dGVuIHVzaW5nIHRoaXMgY2xhc3MsIGJ1dCByYXRoZXIgYnkge0BsaW5rIENvbHVtbkluZGV4fS4KKyAqIHJhbmdlIHRvbWJzdG9uZXMgYXJlIG5vdCB3cml0dGVuIHVzaW5nIHRoaXMgY2xhc3MsIGJ1dCByYXRoZXIgYnkge0BsaW5rIEJpZ0Zvcm1hdFBhcnRpdGlvbldyaXRlcn0uCiAgKi8KIHB1YmxpYyBjbGFzcyBVbmZpbHRlcmVkUm93SXRlcmF0b3JTZXJpYWxpemVyCiB7CkBAIC0xNDAsNyArMTQ2LDcgQEAKICAgICAgICAgICAgIFVuZmlsdGVyZWRTZXJpYWxpemVyLnNlcmlhbGl6ZXIuc2VyaWFsaXplKHN0YXRpY1JvdywgaGVscGVyLCBvdXQsIHZlcnNpb24pOwogCiAgICAgICAgIGlmIChyb3dFc3RpbWF0ZSA+PSAwKQotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHJvd0VzdGltYXRlKTsKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKHJvd0VzdGltYXRlKTsKIAogICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQogICAgICAgICAgICAgVW5maWx0ZXJlZFNlcmlhbGl6ZXIuc2VyaWFsaXplci5zZXJpYWxpemUoaXRlcmF0b3IubmV4dCgpLCBoZWxwZXIsIG91dCwgdmVyc2lvbik7CkBAIC0yMTEsNyArMjE3LDcgQEAKICAgICAgICAgaWYgKGhhc1N0YXRpYykKICAgICAgICAgICAgIHN0YXRpY1JvdyA9IFVuZmlsdGVyZWRTZXJpYWxpemVyLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVTdGF0aWNSb3coaW4sIGhlYWRlciwgbmV3IERlc2VyaWFsaXphdGlvbkhlbHBlcihtZXRhZGF0YSwgdmVyc2lvbiwgZmxhZykpOwogCi0gICAgICAgIGludCByb3dFc3RpbWF0ZSA9IGhhc1Jvd0VzdGltYXRlID8gKGludClpbi5yZWFkVW5zaWduZWRWSW50KCkgOiAtMTsKKyAgICAgICAgaW50IHJvd0VzdGltYXRlID0gaGFzUm93RXN0aW1hdGUgPyBpbi5yZWFkVW5zaWduZWRWSW50MzIoKSA6IC0xOwogICAgICAgICByZXR1cm4gbmV3IEhlYWRlcihoZWFkZXIsIGtleSwgaXNSZXZlcnNlZCwgZmFsc2UsIHBhcnRpdGlvbkRlbGV0aW9uLCBzdGF0aWNSb3csIHJvd0VzdGltYXRlKTsKICAgICB9CiAKQEAgLTI4MCw0ICsyODYsNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0hlYWRlciwga2V5LCBpc1JldmVyc2VkLCBpc0VtcHR5LCBwYXJ0aXRpb25EZWxldGlvbiwgc3RhdGljUm93LCByb3dFc3RpbWF0ZSk7CiAgICAgICAgIH0KICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9VbmZpbHRlcmVkUm93SXRlcmF0b3JXaXRoTG93ZXJCb3VuZC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9VbmZpbHRlcmVkUm93SXRlcmF0b3JXaXRoTG93ZXJCb3VuZC5qYXZhCmluZGV4IDRkMWQ3MWIuLmZiYTE2M2YgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvVW5maWx0ZXJlZFJvd0l0ZXJhdG9yV2l0aExvd2VyQm91bmQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1VuZmlsdGVyZWRSb3dJdGVyYXRvcldpdGhMb3dlckJvdW5kLmphdmEKQEAgLTIwLDIxICsyMCwyNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3M7CiAKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlQnVmZmVyQWNjZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdCb3VuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nUHJlZml4OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVndWxhckFuZFN0YXRpY0NvbHVtbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2xpY2VzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5DbHVzdGVyaW5nSW5kZXhGaWx0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmFuc2Zvcm0uUlRCb3VuZFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkluZGV4SW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkc0xpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUua2V5Y2FjaGUuS2V5Q2FjaGVTdXBwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuU3RhdHNNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5JdGVyYXRvcldpdGhMb3dlckJvdW5kOwogCiAvKioKQEAgLTQ4LDEwICs1NCwxMSBAQAogcHVibGljIGNsYXNzIFVuZmlsdGVyZWRSb3dJdGVyYXRvcldpdGhMb3dlckJvdW5kIGV4dGVuZHMgTGF6aWx5SW5pdGlhbGl6ZWRVbmZpbHRlcmVkUm93SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcldpdGhMb3dlckJvdW5kPFVuZmlsdGVyZWQ+CiB7CiAgICAgcHJpdmF0ZSBmaW5hbCBTU1RhYmxlUmVhZGVyIHNzdGFibGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDbHVzdGVyaW5nSW5kZXhGaWx0ZXIgZmlsdGVyOworICAgIHByaXZhdGUgZmluYWwgU2xpY2VzIHNsaWNlczsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNSZXZlcnNlT3JkZXI7CiAgICAgcHJpdmF0ZSBmaW5hbCBDb2x1bW5GaWx0ZXIgc2VsZWN0ZWRDb2x1bW5zOwogICAgIHByaXZhdGUgZmluYWwgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBDbHVzdGVyaW5nQm91bmQ8Pz4gbG93ZXJCb3VuZDsKKyAgICBwcml2YXRlIE9wdGlvbmFsPFVuZmlsdGVyZWQ+IGxvd2VyQm91bmRNYXJrZXI7CiAgICAgcHJpdmF0ZSBib29sZWFuIGZpcnN0SXRlbVJldHJpZXZlZDsKIAogICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3JXaXRoTG93ZXJCb3VuZChEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5LApAQCAtNjAsMjUgKzY3LDQ0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbkZpbHRlciBzZWxlY3RlZENvbHVtbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkc0xpc3RlbmVyIGxpc3RlbmVyKQogICAgIHsKKyAgICAgICAgdGhpcyhwYXJ0aXRpb25LZXksIHNzdGFibGUsIGZpbHRlci5nZXRTbGljZXMoc3N0YWJsZS5tZXRhZGF0YSgpKSwgZmlsdGVyLmlzUmV2ZXJzZWQoKSwgc2VsZWN0ZWRDb2x1bW5zLCBsaXN0ZW5lcik7CisgICAgfQorCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvcldpdGhMb3dlckJvdW5kKERlY29yYXRlZEtleSBwYXJ0aXRpb25LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xpY2VzIHNsaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1JldmVyc2VPcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uRmlsdGVyIHNlbGVjdGVkQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXIpCisgICAgewogICAgICAgICBzdXBlcihwYXJ0aXRpb25LZXkpOwogICAgICAgICB0aGlzLnNzdGFibGUgPSBzc3RhYmxlOwotICAgICAgICB0aGlzLmZpbHRlciA9IGZpbHRlcjsKKyAgICAgICAgdGhpcy5zbGljZXMgPSBzbGljZXM7CisgICAgICAgIHRoaXMuaXNSZXZlcnNlT3JkZXIgPSBpc1JldmVyc2VPcmRlcjsKICAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSBzZWxlY3RlZENvbHVtbnM7CiAgICAgICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICAgICAgdGhpcy5sb3dlckJvdW5kID0gbnVsbDsKICAgICAgICAgdGhpcy5maXJzdEl0ZW1SZXRyaWV2ZWQgPSBmYWxzZTsKICAgICB9CiAKICAgICBwdWJsaWMgVW5maWx0ZXJlZCBsb3dlckJvdW5kKCkKICAgICB7Ci0gICAgICAgIGlmIChsb3dlckJvdW5kICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbWFrZUJvdW5kKGxvd2VyQm91bmQpOworICAgICAgICBpZiAobG93ZXJCb3VuZE1hcmtlciAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGxvd2VyQm91bmRNYXJrZXIub3JFbHNlKG51bGwpOwogCi0gICAgICAgIC8vIFRoZSBwYXJ0aXRpb24gaW5kZXggbG93ZXIgYm91bmQgaXMgbW9yZSBhY2N1cmF0ZSB0aGFuIHRoZSBzc3RhYmxlIG1ldGFkYXRhIGxvd2VyIGJvdW5kIGJ1dCBpdCBpcyBvbmx5Ci0gICAgICAgIC8vIHByZXNlbnQgaWYgdGhlIGl0ZXJhdG9yIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQsIHdoaWNoIHdlIG9ubHkgZG8gd2hlbiB0aGVyZSBhcmUgdG9tYnN0b25lcyBzaW5jZSBpbgotICAgICAgICAvLyB0aGlzIGNhc2Ugd2UgY2Fubm90IHVzZSB0aGUgc3N0YWJsZSBtZXRhZGF0YSBjbHVzdGVyaW5nIHZhbHVlcwotICAgICAgICBDbHVzdGVyaW5nQm91bmQ8Pz4gcmV0ID0gZ2V0UGFydGl0aW9uSW5kZXhMb3dlckJvdW5kKCk7Ci0gICAgICAgIHJldHVybiByZXQgIT0gbnVsbCA/IG1ha2VCb3VuZChyZXQpIDogbWFrZUJvdW5kKGdldE1ldGFkYXRhTG93ZXJCb3VuZCgpKTsKKyAgICAgICAgLy8gbG93ZXIgYm91bmQgZnJvbSBjYWNoZSBtYXkgYmUgbW9yZSBhY2N1cmF0ZSBhcyBpdCBzdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgY2x1c3RlcmluZ3MgcmFuZ2UgZm9yIHRoYXQgZXhhY3QKKyAgICAgICAgLy8gcm93LCBzbyB3ZSB0cnkgaXQgZmlyc3QgKHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0ZXJhdG9yKQorICAgICAgICBDbHVzdGVyaW5nQm91bmQ8Pz4gbG93ZXJCb3VuZCA9IG1heWJlR2V0TG93ZXJCb3VuZEZyb21LZXlDYWNoZSgpOworICAgICAgICBpZiAobG93ZXJCb3VuZCA9PSBudWxsKQorICAgICAgICAgICAgLy8gSWYgd2UgY291bGRuJ3QgZ2V0IHRoZSBsb3dlciBib3VuZCBmcm9tIGNhY2hlLCB3ZSB0cnkgd2l0aCBtZXRhZGF0YQorICAgICAgICAgICAgbG93ZXJCb3VuZCA9IG1heWJlR2V0TG93ZXJCb3VuZEZyb21NZXRhZGF0YSgpOworCisgICAgICAgIGlmIChsb3dlckJvdW5kICE9IG51bGwpCisgICAgICAgICAgICBsb3dlckJvdW5kTWFya2VyID0gT3B0aW9uYWwub2YobWFrZUJvdW5kKGxvd2VyQm91bmQpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbG93ZXJCb3VuZE1hcmtlciA9IE9wdGlvbmFsLmVtcHR5KCk7CisKKyAgICAgICAgcmV0dXJuIGxvd2VyQm91bmRNYXJrZXIub3JFbHNlKG51bGwpOwogICAgIH0KIAogICAgIHByaXZhdGUgVW5maWx0ZXJlZCBtYWtlQm91bmQoQ2x1c3RlcmluZ0JvdW5kPD8+IGJvdW5kKQpAQCAtODYsMjEgKzExMiwxNSBAQAogICAgICAgICBpZiAoYm91bmQgPT0gbnVsbCkKICAgICAgICAgICAgIHJldHVybiBudWxsOwogCi0gICAgICAgIGlmIChsb3dlckJvdW5kICE9IGJvdW5kKQotICAgICAgICAgICAgbG93ZXJCb3VuZCA9IGJvdW5kOwotCi0gICAgICAgIHJldHVybiBuZXcgUmFuZ2VUb21ic3RvbmVCb3VuZE1hcmtlcihsb3dlckJvdW5kLCBEZWxldGlvblRpbWUuTElWRSk7CisgICAgICAgIHJldHVybiBuZXcgQXJ0aWZpY2lhbEJvdW5kTWFya2VyKGJvdW5kKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGluaXRpYWxpemVJdGVyYXRvcigpCiAgICAgewogICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyAnaXRlcicgaXMgYWRkZWQgdG8gaXRlcmF0b3JzIHdoaWNoIGlzIGNsb3NlZCBvbiBleGNlcHRpb24sIG9yIHRocm91Z2ggdGhlIGNsb3Npbmcgb2YgdGhlIGZpbmFsIG1lcmdlZCBpdGVyYXRvcgotICAgICAgICBVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlciA9IFJUQm91bmRWYWxpZGF0b3IudmFsaWRhdGUoCi0gICAgICAgICAgICBzc3RhYmxlLnJvd0l0ZXJhdG9yKHBhcnRpdGlvbktleSgpLCBmaWx0ZXIuZ2V0U2xpY2VzKG1ldGFkYXRhKCkpLCBzZWxlY3RlZENvbHVtbnMsIGZpbHRlci5pc1JldmVyc2VkKCksIGxpc3RlbmVyKSwKLSAgICAgICAgICAgIFJUQm91bmRWYWxpZGF0b3IuU3RhZ2UuU1NUQUJMRSwKLSAgICAgICAgICAgIGZhbHNlCi0gICAgICAgICk7CisgICAgICAgIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyID0gUlRCb3VuZFZhbGlkYXRvci52YWxpZGF0ZShzc3RhYmxlLnJvd0l0ZXJhdG9yKHBhcnRpdGlvbktleSgpLCBzbGljZXMsIHNlbGVjdGVkQ29sdW1ucywgaXNSZXZlcnNlT3JkZXIsIGxpc3RlbmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQm91bmRWYWxpZGF0b3IuU3RhZ2UuU1NUQUJMRSwgZmFsc2UpOwogICAgICAgICByZXR1cm4gaXRlcjsKICAgICB9CiAKQEAgLTExMywxOSArMTMzLDIwIEBACiAKICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgbG93ZXIgYm91bmQgaXMgbm90IGJpZ2dlciB0aGFuIHRoZSBmaXJzdCBpdGVtIHJldHJpZXZlZAogICAgICAgICBmaXJzdEl0ZW1SZXRyaWV2ZWQgPSB0cnVlOworICAgICAgICBVbmZpbHRlcmVkIGxvd2VyQm91bmQgPSBsb3dlckJvdW5kKCk7CiAgICAgICAgIGlmIChsb3dlckJvdW5kICE9IG51bGwgJiYgcmV0ICE9IG51bGwpCi0gICAgICAgICAgICBhc3NlcnQgY29tcGFyYXRvcigpLmNvbXBhcmUobG93ZXJCb3VuZCwgcmV0LmNsdXN0ZXJpbmcoKSkgPD0gMAotICAgICAgICAgICAgICAgIDogU3RyaW5nLmZvcm1hdCgiTG93ZXIgYm91bmQgWyVzIF1pcyBiaWdnZXIgdGhhbiBmaXJzdCByZXR1cm5lZCB2YWx1ZSBbJXNdIGZvciBzc3RhYmxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJCb3VuZC50b1N0cmluZyhtZXRhZGF0YSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnRvU3RyaW5nKG1ldGFkYXRhKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmdldEZpbGVuYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0IGNvbXBhcmF0b3IoKS5jb21wYXJlKGxvd2VyQm91bmQuY2x1c3RlcmluZygpLCByZXQuY2x1c3RlcmluZygpKSA8PSAwCisgICAgICAgICAgICA6IFN0cmluZy5mb3JtYXQoIkxvd2VyIGJvdW5kIFslcyBdaXMgYmlnZ2VyIHRoYW4gZmlyc3QgcmV0dXJuZWQgdmFsdWUgWyVzXSBmb3Igc3N0YWJsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJCb3VuZC5jbHVzdGVyaW5nKCkudG9TdHJpbmcobWV0YWRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnRvU3RyaW5nKG1ldGFkYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuZ2V0RmlsZW5hbWUoKSk7CiAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKICAgICBwcml2YXRlIENvbXBhcmF0b3I8Q2x1c3RlcmFibGU+IGNvbXBhcmF0b3IoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGZpbHRlci5pc1JldmVyc2VkKCkgPyBtZXRhZGF0YSgpLmNvbXBhcmF0b3IucmV2ZXJzZWQoKSA6IG1ldGFkYXRhKCkuY29tcGFyYXRvcjsKKyAgICAgICAgcmV0dXJuIGlzUmV2ZXJzZU9yZGVyID8gbWV0YWRhdGEoKS5jb21wYXJhdG9yLnJldmVyc2VkKCkgOiBtZXRhZGF0YSgpLmNvbXBhcmF0b3I7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMzcsNyArMTU4LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc1JldmVyc2VPcmRlcigpCiAgICAgewotICAgICAgICByZXR1cm4gZmlsdGVyLmlzUmV2ZXJzZWQoKTsKKyAgICAgICAgcmV0dXJuIGlzUmV2ZXJzZU9yZGVyOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTU1LDcgKzE3Niw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIERlbGV0aW9uVGltZSBwYXJ0aXRpb25MZXZlbERlbGV0aW9uKCkKICAgICB7Ci0gICAgICAgIGlmICghc3N0YWJsZS5tYXlIYXZlVG9tYnN0b25lcygpKQorICAgICAgICBpZiAoIXNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnMpCiAgICAgICAgICAgICByZXR1cm4gRGVsZXRpb25UaW1lLkxJVkU7CiAKICAgICAgICAgcmV0dXJuIHN1cGVyLnBhcnRpdGlvbkxldmVsRGVsZXRpb24oKTsKQEAgLTE3MCw5MyArMTkxLDY2IEBACiAgICAgICAgIHJldHVybiBzdXBlci5zdGF0aWNSb3coKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyA8Vj4gQ2x1c3RlcmluZ0JvdW5kPFY+IGNyZWF0ZUluY2x1c2l2ZU9wZW4oYm9vbGVhbiBpc1JldmVyc2VkLCBDbHVzdGVyaW5nUHJlZml4PFY+IGZyb20pCi0gICAgewotICAgICAgICByZXR1cm4gZnJvbS5hY2Nlc3NvcigpLmZhY3RvcnkoKS5pbmNsdXNpdmVPcGVuKGlzUmV2ZXJzZWQsIGZyb20uZ2V0UmF3VmFsdWVzKCkpOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIEByZXR1cm4gdGhlIGxvd2VyIGJvdW5kIHN0b3JlZCBvbiB0aGUgaW5kZXggZW50cnkgZm9yIHRoaXMgcGFydGl0aW9uLCBpZiBhdmFpbGFibGUuCiAgICAgICovCi0gICAgcHJpdmF0ZSBDbHVzdGVyaW5nQm91bmQ8Pz4gZ2V0UGFydGl0aW9uSW5kZXhMb3dlckJvdW5kKCkKKyAgICBwcml2YXRlIENsdXN0ZXJpbmdCb3VuZDw/PiBtYXliZUdldExvd2VyQm91bmRGcm9tS2V5Q2FjaGUoKQogICAgIHsKLSAgICAgICAgLy8gTk9URTogQ0FTU0FORFJBLTExMjA2IHJlbW92ZWQgdGhlIGxvb2t1cCBhZ2FpbnN0IHRoZSBrZXktY2FjaGUgYXMgdGhlIEluZGV4SW5mbyBvYmplY3RzIGFyZSBubyBsb25nZXIKLSAgICAgICAgLy8gaW4gbWVtb3J5IGZvciBub3QgaGVhcCBiYWNrZWQgSW5kZXhJbmZvIG9iamVjdHMgKHNvLCB0aGVzZSBhcmUgb24gZGlzaykuCi0gICAgICAgIC8vIENBU1NBTkRSQS0xMTM2OSBpcyB0aGVyZSB0byBmaXggdGhpcyBhZnRlcndhcmRzLgorICAgICAgICBpZiAoc3N0YWJsZSBpbnN0YW5jZW9mIEtleUNhY2hlU3VwcG9ydDw/PikKKyAgICAgICAgICAgIHJldHVybiAoKEtleUNhY2hlU3VwcG9ydDw/Pikgc3N0YWJsZSkuZ2V0TG93ZXJCb3VuZFByZWZpeEZyb21DYWNoZShwYXJ0aXRpb25LZXkoKSwgaXNSZXZlcnNlT3JkZXIpOwogCi0gICAgICAgIC8vIENyZWF0aW5nIHRoZSBpdGVyYXRvciBlbnN1cmVzIHRoYXQgcm93SW5kZXhFbnRyeSBpcyBsb2FkZWQgaWYgYXZhaWxhYmxlIChwYXJ0aXRpb25zIGJpZ2dlciB0aGFuCi0gICAgICAgIC8vIERhdGFiYXNlRGVzY3JpcHRvci5jb2x1bW5faW5kZXhfc2l6ZSkKLSAgICAgICAgaWYgKCFjYW5Vc2VNZXRhZGF0YUxvd2VyQm91bmQoKSkKLSAgICAgICAgICAgIG1heWJlSW5pdCgpOwotCi0gICAgICAgIFJvd0luZGV4RW50cnkgcm93SW5kZXhFbnRyeSA9IHNzdGFibGUuZ2V0Q2FjaGVkUG9zaXRpb24ocGFydGl0aW9uS2V5KCksIGZhbHNlKTsKLSAgICAgICAgaWYgKHJvd0luZGV4RW50cnkgPT0gbnVsbCB8fCAhcm93SW5kZXhFbnRyeS5pbmRleE9uSGVhcCgpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgdHJ5IChSb3dJbmRleEVudHJ5LkluZGV4SW5mb1JldHJpZXZlciBvbkhlYXBSZXRyaWV2ZXIgPSByb3dJbmRleEVudHJ5Lm9wZW5XaXRoSW5kZXgobnVsbCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEluZGV4SW5mbyBjb2x1bW4gPSBvbkhlYXBSZXRyaWV2ZXIuY29sdW1uc0luZGV4KGZpbHRlci5pc1JldmVyc2VkKCkgPyByb3dJbmRleEVudHJ5LmNvbHVtbnNJbmRleENvdW50KCkgLSAxIDogMCk7Ci0gICAgICAgICAgICBDbHVzdGVyaW5nUHJlZml4PD8+IGxvd2VyQm91bmRQcmVmaXggPSBmaWx0ZXIuaXNSZXZlcnNlZCgpID8gY29sdW1uLmxhc3ROYW1lIDogY29sdW1uLmZpcnN0TmFtZTsKLSAgICAgICAgICAgIGFzc2VydCBsb3dlckJvdW5kUHJlZml4LmdldFJhd1ZhbHVlcygpLmxlbmd0aCA8PSBtZXRhZGF0YSgpLmNvbXBhcmF0b3Iuc2l6ZSgpIDoKLSAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIGNsdXN0ZXJpbmcgdmFsdWVzICVkLCBleHBlY3RlZCAlZCBvciBmZXdlciBmb3IgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlckJvdW5kUHJlZml4LmdldFJhd1ZhbHVlcygpLmxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEoKS5jb21wYXJhdG9yLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5nZXRGaWxlbmFtZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbmNsdXNpdmVPcGVuKGZpbHRlci5pc1JldmVyc2VkKCksIGxvd2VyQm91bmRQcmVmaXgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigic2hvdWxkIG5ldmVyIG9jY3VyIiwgZSk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogV2hldGhlciB3ZSBjYW4gdXNlIHRoZSBjbHVzdGVyaW5nIHZhbHVlcyBpbiB0aGUgc3RhdHMgb2YgdGhlIHNzdGFibGUgdG8gYnVpbGQgdGhlIGxvd2VyIGJvdW5kLgotICAgICAqIDxwPgotICAgICAqIEN1cnJlbnRseSwgdGhlIGNsdXN0ZXJpbmcgdmFsdWVzIG9mIHRoZSBzdGF0cyBmaWxlIHJlY29yZHMgZm9yIGVhY2ggY2x1c3RlcmluZyBjb21wb25lbnQgdGhlIG1pbiBhbmQgbWF4Ci0gICAgICogdmFsdWUgc2VlbiwgbnVsbCBleGNsdWRlZC4gSW4gb3RoZXIgd29yZHMsIGhhdmluZyBhIG5vbi1udWxsIHZhbHVlIGZvciBhIGNvbXBvbmVudCBpbiB0aG9zZSBtaW4vbWF4IGNsdXN0ZXJpbmcKLSAgICAgKiB2YWx1ZXMgZG9lcyBfbm90XyBndWFyYW50ZWUgdGhhdCB0aGVyZSBpc24ndCBhbiB1bmZpbHRlcmVkIGluIHRoZSBzc3RhYmxlIHdob3NlIGNsdXN0ZXJpbmcgaGFzIGVpdGhlciBubyB2YWx1ZSBmb3IKLSAgICAgKiB0aGF0IGNvbXBvbmVudCAoaXQncyBhIHByZWZpeCkgb3IgYSBudWxsIHZhbHVlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaXMgcHJvYmxlbWF0aWMgYXMgdGhpcyBtZWFucyB3ZSBjYW4ndCBpbiBnZW5lcmFsIGJ1aWxkIGEgbG93ZXIgYm91bmQgZnJvbSB0aG9zZSB2YWx1ZXMgc2luY2UgdGhlICJtaW4iCi0gICAgICogdmFsdWVzIGRvZXNuJ3QgYWN0dWFsbHkgZ3VhcmFudGVlIG1pbmltYWxpdHkuCi0gICAgICogPHA+Ci0gICAgICogSG93ZXZlciwgd2UgY2FuIHVzZSB0aG9zZSB2YWx1ZXMgaWYgd2UgY2FuIGd1YXJhbnRlZSB0aGF0IG5vIGNsdXN0ZXJpbmcgaW4gdGhlIHNzdGFibGUgMSkgaXMgYSB0cnVlIHByZWZpeCBhbmQKLSAgICAgKiAyKSB1c2VzIG51bGwgdmFsdWVzLiBOYXQgaGF2aW5nIHRydWUgcHJlZml4ZXMgbWVhbnMgaGF2aW5nIG5vIHJhbmdlIHRvbWJzdG9uZSBtYXJrZXJzIHNpbmNlIHJvd3MgdXNlCi0gICAgICoge0BsaW5rIENsdXN0ZXJpbmd9IHdoaWNoIGlzIGFsd2F5cyAiZnVsbCIgKGFsbCBjb21wb25lbnRzIGFyZSBhbHdheXMgcHJlc2VudCkuIEFzIGZvciBudWxsIHZhbHVlcywgd2UgaGFwcGVuIHRvCi0gICAgICogb25seSBhbGxvdyB0aG9zZSBpbiBjb21wYWN0IHRhYmxlcyAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpLCBzbyB3ZSBjYW4gc2ltcGx5IGV4Y2x1ZGUgdGhvc2UgdGFibGVzLgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgaW5mb3JtYXRpb24gd2UgY3VycmVudGx5IGhhdmUgYXQgb3VyIGRpc3Bvc2FsIG1ha2UgdGhpcyBjb25kaXRpb24gbGVzcyBwcmVjaXNlIHRoYXQgaXQgY291bGQgYmUuCi0gICAgICogSW4gcGFydGljdWxhciwge0BsaW5rIFNTVGFibGVSZWFkZXIjbWF5SGF2ZVRvbWJzdG9uZXN9IGNvdWxkIHJldHVybiB7QGNvZGUgdHJ1ZX0gKG1ha2luZyB1cyBub3QgdXNlIHRoZSBzdGF0cykKLSAgICAgKiBiZWNhdXNlIG9mIGNlbGwgdG9tYnN0b25lIG9yIGV2ZW4gZXhwaXJpbmcgY2VsbHMgZXZlbiBpZiB0aGUgc3N0YWJsZSBoYXMgbm8gcmFuZ2UgdG9tYnN0b25lIG1hcmtlcnMsIGV2ZW4gdGhvdWdoCi0gICAgICogaXQncyByZWFsbHkgb25seSBtYXJrZXJzIHdlIHdhbnQgdG8gZXhjbHVkZSBoZXJlIChtb3JlIHByZWNpc2VseSwgYXMgc2FpZCBhYm92ZSwgd2Ugd2FudCB0byBleGNsdWRlIGFueXRoaW5nCi0gICAgICogd2hvc2UgY2x1c3RlcmluZyBpcyBub3QgImZ1bGwiLCBidXQgdGhhdCdzIG9ubHkgbWFya2VycykuIEl0IHdvdWxkbid0IGJlIHZlcnkgaGFyZCB0byBjb2xsZWN0IHdoZXRoZXIgYSBzc3RhYmxlCi0gICAgICogaGFzIGFueSByYW5nZSB0b21ic3RvbmUgbWFya2VyIGhvd2V2ZXIgc28gaXQncyBhIHBvc3NpYmxlIGltcHJvdmVtZW50LgogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBjYW5Vc2VNZXRhZGF0YUxvd2VyQm91bmQoKQogICAgIHsKLSAgICAgICAgLy8gU2lkZS1ub3RlOiBwcmUtMi4xIHNzdGFibGUgc3RhdCBmaWxlIGhhZCBjbHVzdGVyaW5nIHZhbHVlIGFycmF5cyB3aG9zZSBzaXplIG1heSBub3QgbWF0Y2ggdGhlIGNvbXBhcmF0b3Igc2l6ZQotICAgICAgICAvLyBhbmQgdGhhdCB3b3VsZCBicmVhayBnZXRNZXRhZGF0YUxvd2VyQm91bmQuIFdlIGRvbid0IHN1cHBvcnQgdXBncmFkZSBmcm9tIDIuMCB0byAzLjAgZGlyZWN0bHkgaG93ZXZlciBzbyBpdCdzCi0gICAgICAgIC8vIG5vdCBhIHRydWUgY29uY2Vybi4gQmVzaWRlcywgIXNzdGFibGUubWF5SGF2ZVRvbWJzdG9uZXMgYWxyZWFkeSBlbnN1cmUgdGhpcyBpcyBhIDMuMCBzc3RhYmxlIGFueXdheS4KLSAgICAgICAgcmV0dXJuICFzc3RhYmxlLm1heUhhdmVUb21ic3RvbmVzKCkgJiYgIXNzdGFibGUubWV0YWRhdGEoKS5pc0NvbXBhY3RUYWJsZSgpOworICAgICAgICBpZiAoc3N0YWJsZS5tZXRhZGF0YSgpLmlzQ29tcGFjdFRhYmxlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgU2xpY2VzIHJlcXVlc3RlZFNsaWNlcyA9IHNsaWNlczsKKworICAgICAgICBpZiAocmVxdWVzdGVkU2xpY2VzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIC8vIFNpbXBseSBleGNsdWRlIHRoZSBjYXNlcyB3aGVyZSBsb3dlciBib3VuZCB3b3VsZCBub3QgYmUgdXNlZCBhbnl3YXksIHRoYXQgaXMsIHRoZSBzdGFydCBvZiBjb3ZlcmVkIHJhbmdlIG9mCisgICAgICAgIC8vIGNsdXN0ZXJpbmdzIGluIHNzdGFibGUgaXMgbG93ZXIgdGhhbiB0aGUgcmVxdWVzdGVkIHNsaWNlLiBJbiBzdWNoIGNhc2UsIHdlIG5lZWQgdG8gYWNjZXNzIHRoYXQgc3N0YWJsZSdzCisgICAgICAgIC8vIGl0ZXJhdG9yIGFueXdheSBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBhIGxvd2VyIGJvdW5kIG9wdGltaXphdGlvbiBleHRyYSBjb21wbGV4aXR5LgorICAgICAgICBpZiAoIWlzUmV2ZXJzZU9yZGVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAhcmVxdWVzdGVkU2xpY2VzLmhhc0xvd2VyQm91bmQoKSB8fAorICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhKCkuY29tcGFyYXRvci5jb21wYXJlKHJlcXVlc3RlZFNsaWNlcy5zdGFydCgpLCBzc3RhYmxlLmdldFNTVGFibGVNZXRhZGF0YSgpLmNvdmVyZWRDbHVzdGVyaW5nLnN0YXJ0KCkpIDwgMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAhcmVxdWVzdGVkU2xpY2VzLmhhc1VwcGVyQm91bmQoKSB8fAorICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhKCkuY29tcGFyYXRvci5jb21wYXJlKHJlcXVlc3RlZFNsaWNlcy5lbmQoKSwgc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5jb3ZlcmVkQ2x1c3RlcmluZy5lbmQoKSkgPiAwOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQHJldHVybiBhIGdsb2JhbCBsb3dlciBib3VuZCBtYWRlIGZyb20gdGhlIGNsdXN0ZXJpbmcgdmFsdWVzIHN0b3JlZCBpbiB0aGUgc3N0YWJsZSBtZXRhZGF0YSwgbm90ZSB0aGF0CiAgICAgICogdGhpcyBjdXJyZW50bHkgZG9lcyBub3QgY29ycmVjdGx5IGNvbXBhcmUgdG9tYnN0b25lIGJvdW5kcywgZXNwZWNpYWxseSByYW5nZXMuCiAgICAgICovCi0gICAgcHJpdmF0ZSBDbHVzdGVyaW5nQm91bmQ8Pz4gZ2V0TWV0YWRhdGFMb3dlckJvdW5kKCkKKyAgICBwcml2YXRlIENsdXN0ZXJpbmdCb3VuZDw/PiBtYXliZUdldExvd2VyQm91bmRGcm9tTWV0YWRhdGEoKQogICAgIHsKICAgICAgICAgaWYgKCFjYW5Vc2VNZXRhZGF0YUxvd2VyQm91bmQoKSkKICAgICAgICAgICAgIHJldHVybiBudWxsOwogCiAgICAgICAgIGZpbmFsIFN0YXRzTWV0YWRhdGEgbSA9IHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCk7Ci0gICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gdmFscyA9IGZpbHRlci5pc1JldmVyc2VkKCkgPyBtLm1heENsdXN0ZXJpbmdWYWx1ZXMgOiBtLm1pbkNsdXN0ZXJpbmdWYWx1ZXM7Ci0gICAgICAgIGFzc2VydCB2YWxzLnNpemUoKSA8PSBtZXRhZGF0YSgpLmNvbXBhcmF0b3Iuc2l6ZSgpIDoKLSAgICAgICAgU3RyaW5nLmZvcm1hdCgiVW5leHBlY3RlZCBudW1iZXIgb2YgY2x1c3RlcmluZyB2YWx1ZXMgJWQsIGV4cGVjdGVkICVkIG9yIGZld2VyIGZvciAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgdmFscy5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEoKS5jb21wYXJhdG9yLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmdldEZpbGVuYW1lKCkpOwotICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLmZhY3RvcnkoKS5pbmNsdXNpdmVPcGVuKGZpbHRlci5pc1JldmVyc2VkKCksIHZhbHMudG9BcnJheShuZXcgQnl0ZUJ1ZmZlclt2YWxzLnNpemUoKV0pKTsKKyAgICAgICAgQ2x1c3RlcmluZ0JvdW5kPD8+IGJvdW5kID0gbS5jb3ZlcmVkQ2x1c3RlcmluZy5vcGVuKGlzUmV2ZXJzZU9yZGVyKTsKKyAgICAgICAgYXNzZXJ0Qm91bmRTaXplKGJvdW5kLCBzc3RhYmxlKTsKKyAgICAgICAgcmV0dXJuIGJvdW5kLmFydGlmaWNpYWxMb3dlckJvdW5kKGlzUmV2ZXJzZU9yZGVyKTsKICAgICB9Ci19CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0Qm91bmRTaXplKENsdXN0ZXJpbmdQcmVmaXg8Pz4gbG93ZXJCb3VuZCwgU1NUYWJsZSBzc3RhYmxlKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGxvd2VyQm91bmQuc2l6ZSgpIDw9IHNzdGFibGUubWV0YWRhdGEoKS5jb21wYXJhdG9yLnNpemUoKSA6CisgICAgICAgIFN0cmluZy5mb3JtYXQoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIGNsdXN0ZXJpbmcgdmFsdWVzICVkLCBleHBlY3RlZCAlZCBvciBmZXdlciBmb3IgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGxvd2VyQm91bmQuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUubWV0YWRhdGEoKS5jb21wYXJhdG9yLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmdldEZpbGVuYW1lKCkpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1VuZmlsdGVyZWRSb3dJdGVyYXRvcnMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvVW5maWx0ZXJlZFJvd0l0ZXJhdG9ycy5qYXZhCmluZGV4IDJlYjVkOGYuLjk1Y2YwODAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvVW5maWx0ZXJlZFJvd0l0ZXJhdG9ycy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvVW5maWx0ZXJlZFJvd0l0ZXJhdG9ycy5qYXZhCkBAIC0xNywxMiArMTcsMTcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzOwogCi1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlnZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkVtcHR5SXRlcmF0b3JzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJhbnNmb3JtLkZpbHRlcmVkUm93czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmFuc2Zvcm0uTW9yZVJvd3M7CkBAIC0yNjMsMTYgKzI2OCwyMiBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3IgdGhhdCBjb25jYXRlbmF0ZSB0aGUgc3BlY2lmaWVkIGF0b20gd2l0aCB0aGUgaXRlcmF0b3IuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3IgY29uY2F0KGZpbmFsIFVuZmlsdGVyZWQgZmlyc3QsIGZpbmFsIFVuZmlsdGVyZWRSb3dJdGVyYXRvciByZXN0KQorICAgIHB1YmxpYyBzdGF0aWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGNvbmNhdChmaW5hbCBVbmZpbHRlcmVkIGZpcnN0LCBmaW5hbCBVbmZpbHRlcmVkUm93SXRlcmF0b3Igd3JhcHBlZCkKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgV3JhcHBpbmdVbmZpbHRlcmVkUm93SXRlcmF0b3IocmVzdCkKKyAgICAgICAgcmV0dXJuIG5ldyBXcmFwcGluZ1VuZmlsdGVyZWRSb3dJdGVyYXRvcigpCiAgICAgICAgIHsKICAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYXNSZXR1cm5lZEZpcnN0OwogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3Igd3JhcHBlZCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGhhc1JldHVybmVkRmlyc3QgPyBzdXBlci5oYXNOZXh0KCkgOiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBoYXNSZXR1cm5lZEZpcnN0ID8gd3JhcHBlZC5oYXNOZXh0KCkgOiB0cnVlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKQEAgLTI4Myw3ICsyOTQsNyBAQAogICAgICAgICAgICAgICAgICAgICBoYXNSZXR1cm5lZEZpcnN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0OwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIubmV4dCgpOworICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLm5leHQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKICAgICB9CkBAIC02MDQsNCArNjE1LDQgQEAKICAgICAgICAgfQogICAgIH0KIAotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvVW5maWx0ZXJlZFNlcmlhbGl6ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvVW5maWx0ZXJlZFNlcmlhbGl6ZXIuamF2YQppbmRleCAxYzBkY2Q0Li5kNTI4YTcwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1VuZmlsdGVyZWRTZXJpYWxpemVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9VbmZpbHRlcmVkU2VyaWFsaXplci5qYXZhCkBAIC0yMCwxNCArMjAsMTQgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiBpbXBvcnQgbmV0Lm5pY291bGFqLmNvbXBpbGVjb21tYW5kLmFubm90YXRpb25zLklubGluZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVBcnJheUFjY2Vzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZUFycmF5QWNjZXNzb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3cuRGVsZXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dEJ1ZmZlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZURhdGFJbnB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2VhcmNoSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuV3JhcHBlZEV4Y2VwdGlvbjsKIApAQCAtMTk2LDcgKzE5Niw3IEBACiAgICAgICAgICAgICAgICAgLy8gV2Ugd3JpdGUgdGhlIHNpemUgb2YgdGhlIHByZXZpb3VzIHVuZmlsdGVyZWQgdG8gbWFrZSByZXZlcnNlIHF1ZXJpZXMgbW9yZSBlZmZpY2llbnQgKGFuZCBzaW1wbGVyKS4KICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGN1cnJlbnRseSBub3QgdXNlZCBob3dldmVyIGFuZCB1c2luZyBpdCBpcyB0YmQuCiAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHByZXZpb3VzVW5maWx0ZXJlZFNpemUpOwotICAgICAgICAgICAgICAgIG91dC53cml0ZShkb2IuZ2V0RGF0YSgpLCAwLCBkb2IuZ2V0TGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIG91dC53cml0ZShkb2IudW5zYWZlR2V0QnVmZmVyQW5kRmxpcCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlCkBAIC0yNzAsNyArMjcwLDcgQEAKICAgICAgICAgaWYgKGhhc0NvbXBsZXhEZWxldGlvbikKICAgICAgICAgICAgIGhlYWRlci53cml0ZURlbGV0aW9uVGltZShkYXRhLmNvbXBsZXhEZWxldGlvbigpLCBvdXQpOwogCi0gICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChkYXRhLmNlbGxzQ291bnQoKSk7CisgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGRhdGEuY2VsbHNDb3VudCgpKTsKICAgICAgICAgZm9yIChDZWxsPD8+IGNlbGwgOiBkYXRhKQogICAgICAgICAgICAgQ2VsbC5zZXJpYWxpemVyLnNlcmlhbGl6ZShjZWxsLCBjb2x1bW4sIG91dCwgcm93TGl2ZW5lc3MsIGhlYWRlcik7CiAgICAgfQpAQCAtNjYyLDcgKzY2Miw3IEBACiAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQ29tcGxleERlbGV0aW9uKGNvbHVtbiwgY29tcGxleERlbGV0aW9uKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaW50IGNvdW50ID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgaW50IGNvdW50ID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgICAgICB3aGlsZSAoLS1jb3VudCA+PSAwKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIENlbGw8Ynl0ZVtdPiBjZWxsID0gQ2VsbC5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCByb3dMaXZlbmVzcywgY29sdW1uLCBoZWFkZXIsIGhlbHBlciwgQnl0ZUFycmF5QWNjZXNzb3IuaW5zdGFuY2UpOwpAQCAtNjgwLDcgKzY4MCw3IEBACiAKICAgICBwdWJsaWMgdm9pZCBza2lwUm93Qm9keShEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIGludCByb3dTaXplID0gKGludClpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgIGludCByb3dTaXplID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgIGluLnNraXBCeXRlc0Z1bGx5KHJvd1NpemUpOwogICAgIH0KIApAQCAtNjk1LDcgKzY5NSw3IEBACiAKICAgICBwdWJsaWMgdm9pZCBza2lwTWFya2VyQm9keShEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIGludCBtYXJrZXJTaXplID0gKGludClpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgIGludCBtYXJrZXJTaXplID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgIGluLnNraXBCeXRlc0Z1bGx5KG1hcmtlclNpemUpOwogICAgIH0KIApAQCAtNzA1LDcgKzcwNSw3IEBACiAgICAgICAgIGlmIChoYXNDb21wbGV4RGVsZXRpb24pCiAgICAgICAgICAgICBoZWFkZXIuc2tpcERlbGV0aW9uVGltZShpbik7CiAKLSAgICAgICAgaW50IGNvdW50ID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICBpbnQgY291bnQgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKICAgICAgICAgd2hpbGUgKC0tY291bnQgPj0gMCkKICAgICAgICAgICAgIENlbGwuc2VyaWFsaXplci5za2lwKGluLCBjb2x1bW4sIGhlYWRlcik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9VbmZpbHRlcmVkU291cmNlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1VuZmlsdGVyZWRTb3VyY2UuamF2YQppbmRleCBiOTg0NTIyLi42MmMyMmVkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1VuZmlsdGVyZWRTb3VyY2UuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1VuZmlsdGVyZWRTb3VyY2UuamF2YQpAQCAtMjMsNyArMjMsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNsaWNlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkc0xpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVJlYWRzTGlzdGVuZXI7CiAKIC8qKgogICogQ29tbW9uIGRhdGEgYWNjZXNzIGludGVyZmFjZSBmb3Igc3N0YWJsZXMgYW5kIG1lbXRhYmxlcy4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvV3JhcHBpbmdVbmZpbHRlcmVkUm93SXRlcmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvV3JhcHBpbmdVbmZpbHRlcmVkUm93SXRlcmF0b3IuamF2YQppbmRleCAwMmUxY2VjLi5lMzg3MTM2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1dyYXBwaW5nVW5maWx0ZXJlZFJvd0l0ZXJhdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9XcmFwcGluZ1VuZmlsdGVyZWRSb3dJdGVyYXRvci5qYXZhCkBAIC0xNyw3NiArMTcsNzIgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5Vbm1vZGlmaWFibGVJdGVyYXRvcjsKLQoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVndWxhckFuZFN0YXRpY0NvbHVtbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJhbnNmb3JtLlRyYW5zZm9ybWF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CiAKIC8qKgogICogQWJzdHJhY3QgY2xhc3MgdG8gbWFrZSB3cml0aW5nIHVuZmlsdGVyZWQgaXRlcmF0b3JzIHRoYXQgd3JhcCBhbm90aGVyIGl0ZXJhdG9yCiAgKiBlYXNpZXIuIEJ5IGRlZmF1bHQsIHRoZSB3cmFwcGluZyBpdGVyYXRvciBzaW1wbHkgZGVsZWdhdGUgZXZlcnkgY2FsbCB0bwotICogdGhlIHdyYXBwZWQgaXRlcmF0b3Igc28gY29uY3JldGUgaW1wbGVtZW50YXRpb25zIHdpbGwgaGF2ZSB0byBvdmVycmlkZQotICogc29tZSBvZiB0aGUgbWV0aG9kcy4KKyAqIHRoZSB3cmFwcGVkIGl0ZXJhdG9yIHNvIGNvbmNyZXRlIGltcGxlbWVudGF0aW9ucyB3aWxsIGhhdmUgdG8gb3ZlcnJpZGUgc29tZSBtZXRob2RzLgogICogPHA+CiAgKiBOb3RlIHRoYXQgaWYgbW9zdCBvZiB3aGF0IHlvdSB3YW50IHRvIGRvIGlzIG1vZGlmeWluZy9maWx0ZXJpbmcgdGhlIHJldHVybmVkCi0gKiB7QGNvZGUgVW5maWx0ZXJlZH0sIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmFuc2Zvcm0uVHJhbnNmb3JtYXRpb24jbWVyZ2UoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yLFRyYW5zZm9ybWF0aW9uKX0gY2FuIGJlIGEgc2ltcGxlciBvcHRpb24uCisgKiB7QGNvZGUgVW5maWx0ZXJlZH0sIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmFuc2Zvcm0uVHJhbnNmb3JtYXRpb24jYXBwbHkoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yLCBUcmFuc2Zvcm1hdGlvbil9CisgKiBjYW4gYmUgYSBzaW1wbGVyIG9wdGlvbi4KICAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFdyYXBwaW5nVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGV4dGVuZHMgVW5tb2RpZmlhYmxlSXRlcmF0b3I8VW5maWx0ZXJlZD4gIGltcGxlbWVudHMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yCitwdWJsaWMgaW50ZXJmYWNlIFdyYXBwaW5nVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGV4dGVuZHMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yCiB7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIFVuZmlsdGVyZWRSb3dJdGVyYXRvciB3cmFwcGVkOworICAgIFVuZmlsdGVyZWRSb3dJdGVyYXRvciB3cmFwcGVkKCk7CiAKLSAgICBwcm90ZWN0ZWQgV3JhcHBpbmdVbmZpbHRlcmVkUm93SXRlcmF0b3IoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHdyYXBwZWQpCisgICAgZGVmYXVsdCBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKCkKICAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7CisgICAgICAgIHJldHVybiB3cmFwcGVkKCkubWV0YWRhdGEoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSgpCisgICAgZGVmYXVsdCBSZWd1bGFyQW5kU3RhdGljQ29sdW1ucyBjb2x1bW5zKCkKICAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLm1ldGFkYXRhKCk7CisgICAgICAgIHJldHVybiB3cmFwcGVkKCkuY29sdW1ucygpOwogICAgIH0KIAotICAgIHB1YmxpYyBSZWd1bGFyQW5kU3RhdGljQ29sdW1ucyBjb2x1bW5zKCkKKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNSZXZlcnNlT3JkZXIoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29sdW1ucygpOworICAgICAgICByZXR1cm4gd3JhcHBlZCgpLmlzUmV2ZXJzZU9yZGVyKCk7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXZlcnNlT3JkZXIoKQorICAgIGRlZmF1bHQgRGVjb3JhdGVkS2V5IHBhcnRpdGlvbktleSgpCiAgICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5pc1JldmVyc2VPcmRlcigpOworICAgICAgICByZXR1cm4gd3JhcHBlZCgpLnBhcnRpdGlvbktleSgpOwogICAgIH0KIAotICAgIHB1YmxpYyBEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5KCkKKyAgICBkZWZhdWx0IERlbGV0aW9uVGltZSBwYXJ0aXRpb25MZXZlbERlbGV0aW9uKCkKICAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLnBhcnRpdGlvbktleSgpOworICAgICAgICByZXR1cm4gd3JhcHBlZCgpLnBhcnRpdGlvbkxldmVsRGVsZXRpb24oKTsKICAgICB9CiAKLSAgICBwdWJsaWMgRGVsZXRpb25UaW1lIHBhcnRpdGlvbkxldmVsRGVsZXRpb24oKQorICAgIGRlZmF1bHQgUm93IHN0YXRpY1JvdygpCiAgICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5wYXJ0aXRpb25MZXZlbERlbGV0aW9uKCk7CisgICAgICAgIHJldHVybiB3cmFwcGVkKCkuc3RhdGljUm93KCk7CiAgICAgfQogCi0gICAgcHVibGljIFJvdyBzdGF0aWNSb3coKQorICAgIGRlZmF1bHQgRW5jb2RpbmdTdGF0cyBzdGF0cygpCiAgICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5zdGF0aWNSb3coKTsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQoKS5zdGF0cygpOwogICAgIH0KIAotICAgIHB1YmxpYyBFbmNvZGluZ1N0YXRzIHN0YXRzKCkKKyAgICBkZWZhdWx0IGJvb2xlYW4gaGFzTmV4dCgpCiAgICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5zdGF0cygpOworICAgICAgICByZXR1cm4gd3JhcHBlZCgpLmhhc05leHQoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKKyAgICBkZWZhdWx0IFVuZmlsdGVyZWQgbmV4dCgpCiAgICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5oYXNOZXh0KCk7CisgICAgICAgIHJldHVybiB3cmFwcGVkKCkubmV4dCgpOwogICAgIH0KIAotICAgIHB1YmxpYyBVbmZpbHRlcmVkIG5leHQoKQorICAgIGRlZmF1bHQgdm9pZCBjbG9zZSgpCiAgICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5uZXh0KCk7CisgICAgICAgIHdyYXBwZWQoKS5jbG9zZSgpOwogICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKLSAgICB7Ci0gICAgICAgIHdyYXBwZWQuY2xvc2UoKTsKLSAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYUNvbXByZXNzZWRTdHJlYW1SZWFkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFDb21wcmVzc2VkU3RyZWFtUmVhZGVyLmphdmEKaW5kZXggMDA1YTlhYS4uNWE2ZTcxMCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYUNvbXByZXNzZWRTdHJlYW1SZWFkZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhQ29tcHJlc3NlZFN0cmVhbVJlYWRlci5qYXZhCkBAIC03Niw3ICs3Niw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIFRyYWNrZWREYXRhSW5wdXRQbHVzIGluID0gbmV3IFRyYWNrZWREYXRhSW5wdXRQbHVzKGNpcyk7CiAgICAgICAgICAgICBkZXNlcmlhbGl6ZXIgPSBuZXcgU3RyZWFtRGVzZXJpYWxpemVyKGNmcy5tZXRhZGF0YSgpLCBpbiwgaW5wdXRWZXJzaW9uLCBnZXRIZWFkZXIoY2ZzLm1ldGFkYXRhKCkpKTsKLSAgICAgICAgICAgIHdyaXRlciA9IGNyZWF0ZVdyaXRlcihjZnMsIHRvdGFsU2l6ZSwgcmVwYWlyZWRBdCwgcGVuZGluZ1JlcGFpciwgZm9ybWF0KTsKKyAgICAgICAgICAgIHdyaXRlciA9IGNyZWF0ZVdyaXRlcihjZnMsIHRvdGFsU2l6ZSwgcmVwYWlyZWRBdCwgcGVuZGluZ1JlcGFpciwgaW5wdXRWZXJzaW9uLmZvcm1hdCk7CiAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSB3cml0ZXIuZ2V0RmlsZW5hbWUoKTsKICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uTmFtZSA9IGZpbGVuYW1lICsgJy0nICsgZmlsZVNlcU51bTsKICAgICAgICAgICAgIGludCBzZWN0aW9uSWR4ID0gMDsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFDb21wcmVzc2VkU3RyZWFtV3JpdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhQ29tcHJlc3NlZFN0cmVhbVdyaXRlci5qYXZhCmluZGV4IDQxZmQ5YjEuLjgwNmE3NGEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFDb21wcmVzc2VkU3RyZWFtV3JpdGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYUNvbXByZXNzZWRTdHJlYW1Xcml0ZXIuamF2YQpAQCAtMjcsMTIgKzI3LDEyIEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzcy5Db21wcmVzc2lvbk1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuQ2hhbm5lbFByb3h5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5Qcm9ncmVzc0luZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbWluZ0RhdGFPdXRwdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1pbmdEYXRhT3V0cHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIAogLyoqCkBAIC03MSw3ICs3MSw3IEBACiAgICAgICAgICAgICBpbnQgc2VjdGlvbklkeCA9IDA7CiAKICAgICAgICAgICAgIC8vIHN0cmVhbSBlYWNoIG9mIHRoZSByZXF1aXJlZCBzZWN0aW9ucyBvZiB0aGUgZmlsZQotICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKTsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IHNzdGFibGUuZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuREFUQSkudG9TdHJpbmcoKTsKICAgICAgICAgICAgIGZvciAoU2VjdGlvbiBzZWN0aW9uIDogc2VjdGlvbnMpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy8gbGVuZ3RoIG9mIHRoZSBzZWN0aW9uIHRvIHN0cmVhbQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYUVudGlyZVNTVGFibGVTdHJlYW1SZWFkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFFbnRpcmVTU1RhYmxlU3RyZWFtUmVhZGVyLmphdmEKaW5kZXggNTE1Yzg1ZC4uOWM1ZTA0OCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYUVudGlyZVNTVGFibGVTdHJlYW1SZWFkZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhRW50aXJlU1NUYWJsZVN0cmVhbVJlYWRlci5qYXZhCkBAIC0yNSwxNyArMjUsMjAgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlTmV3VHJhY2tlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzcy5CdWZmZXJUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklPT3B0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVNdWx0aVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdUYWJsZVplcm9Db3B5V3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVplcm9Db3B5V3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuU3RhdHNNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlck9wdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuUHJvZ3Jlc3NJbmZvOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1SZWNlaXZlcjsKQEAgLTYwLDkgKzYzLDYgQEAKIAogICAgIHB1YmxpYyBDYXNzYW5kcmFFbnRpcmVTU1RhYmxlU3RyZWFtUmVhZGVyKFN0cmVhbU1lc3NhZ2VIZWFkZXIgbWVzc2FnZUhlYWRlciwgQ2Fzc2FuZHJhU3RyZWFtSGVhZGVyIHN0cmVhbUhlYWRlciwgU3RyZWFtU2Vzc2lvbiBzZXNzaW9uKQogICAgIHsKLSAgICAgICAgaWYgKHN0cmVhbUhlYWRlci5mb3JtYXQgIT0gU1NUYWJsZUZvcm1hdC5UeXBlLkJJRykKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVW5zdXBwb3J0ZWQgU1NUYWJsZSBmb3JtYXQgIiArIHN0cmVhbUhlYWRlci5mb3JtYXQpOwotCiAgICAgICAgIGlmIChzZXNzaW9uLmdldFBlbmRpbmdSZXBhaXIoKSAhPSBudWxsKQogICAgICAgICB7CiAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgb25seSBldmVyIGJlIHN0cmVhbWluZyBwZW5kaW5nIHJlcGFpciBzc3RhYmxlcyBpZiB0aGUgc2Vzc2lvbiBoYXMgYSBwZW5kaW5nIHJlcGFpciBpZApAQCAtODQsNyArODQsNyBAQAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIGlucHV0IG5lZWRzIHRvIHJlbWFpbiBvcGVuLCBzdHJlYW1zIG9uIHRvcCBvZiBpdCBjYW4ndCBiZSBjbG9zZWQKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU1NUYWJsZU11bHRpV3JpdGVyIHJlYWQoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIFRocm93YWJsZQorICAgIHB1YmxpYyBTU1RhYmxlTXVsdGlXcml0ZXIgcmVhZChEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IENvbHVtbkZhbWlseVN0b3JlLmdldElmRXhpc3RzKHRhYmxlSWQpOwogICAgICAgICBpZiAoY2ZzID09IG51bGwpCkBAIC0xMDMsNyArMTAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgIHByZXR0eVByaW50TWVtb3J5KHRvdGFsU2l6ZSksCiAgICAgICAgICAgICAgICAgICAgICBjZnMubWV0YWRhdGEoKSk7CiAKLSAgICAgICAgQmlnVGFibGVaZXJvQ29weVdyaXRlciB3cml0ZXIgPSBudWxsOworICAgICAgICBTU1RhYmxlWmVyb0NvcHlXcml0ZXIgd3JpdGVyID0gbnVsbDsKIAogICAgICAgICB0cnkKICAgICAgICAgewpAQCAtMTIyLDcgKzEyMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXR0eVByaW50TWVtb3J5KHRvdGFsU2l6ZSkpOwogCiAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQ29tcG9uZW50KGNvbXBvbmVudC50eXBlLCBpbiwgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBzZXNzaW9uLnByb2dyZXNzKHdyaXRlci5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKGNvbXBvbmVudCksIFByb2dyZXNzSW5mby5EaXJlY3Rpb24uSU4sIGxlbmd0aCwgbGVuZ3RoLCBsZW5ndGgpOworICAgICAgICAgICAgICAgIHNlc3Npb24ucHJvZ3Jlc3Mod3JpdGVyLmRlc2NyaXB0b3IuZmlsZUZvcihjb21wb25lbnQpLnRvU3RyaW5nKCksIFByb2dyZXNzSW5mby5EaXJlY3Rpb24uSU4sIGxlbmd0aCwgbGVuZ3RoLCBsZW5ndGgpOwogICAgICAgICAgICAgICAgIGJ5dGVzUmVhZCArPSBsZW5ndGg7CiAKICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIltTdHJlYW0gI3t9XSBGaW5pc2hlZCByZWNlaXZpbmcge30gY29tcG9uZW50IGZyb20ge30sIGNvbXBvbmVudFNpemUgPSB7fSwgcmVhZEJ5dGVzID0ge30sIHRvdGFsU2l6ZSA9IHt9IiwKQEAgLTE0NSw3ICsxNDUsMTEgQEAKICAgICAgICAgewogICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJbU3RyZWFtIHt9XSBFcnJvciB3aGlsZSByZWFkaW5nIHNzdGFibGUgZnJvbSBzdHJlYW0gZm9yIHRhYmxlID0ge30iLCBzZXNzaW9uLnBsYW5JZCgpLCBjZnMubWV0YWRhdGEoKSwgZSk7CiAgICAgICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgZSA9IHdyaXRlci5hYm9ydChlKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUaHJvd2FibGUgZTIgPSB3cml0ZXIuYWJvcnQobnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKGUyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGUuYWRkU3VwcHJlc3NlZChlMik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICB9CiAgICAgfQpAQCAtMTY1LDcgKzE2OSw3IEBACiAgICAgfQogCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKLSAgICBwcm90ZWN0ZWQgQmlnVGFibGVaZXJvQ29weVdyaXRlciBjcmVhdGVXcml0ZXIoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBsb25nIHRvdGFsU2l6ZSwgQ29sbGVjdGlvbjxDb21wb25lbnQ+IGNvbXBvbmVudHMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHByb3RlY3RlZCBTU1RhYmxlWmVyb0NvcHlXcml0ZXIgY3JlYXRlV3JpdGVyKENvbHVtbkZhbWlseVN0b3JlIGNmcywgbG9uZyB0b3RhbFNpemUsIENvbGxlY3Rpb248Q29tcG9uZW50PiBjb21wb25lbnRzKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIEZpbGUgZGF0YURpciA9IGdldERhdGFEaXIoY2ZzLCB0b3RhbFNpemUpOwogCkBAIC0xNzQsMTAgKzE3OCwyNiBAQAogCiAgICAgICAgIExpZmVjeWNsZU5ld1RyYWNrZXIgbGlmZWN5Y2xlTmV3VHJhY2tlciA9IENhc3NhbmRyYVN0cmVhbVJlY2VpdmVyLmZyb21SZWNlaXZlcihzZXNzaW9uLmdldEFnZ3JlZ2F0b3IodGFibGVJZCkpLmNyZWF0ZUxpZmVjeWNsZU5ld1RyYWNrZXIoKTsKIAotICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBjZnMubmV3U1NUYWJsZURlc2NyaXB0b3IoZGF0YURpciwgaGVhZGVyLnZlcnNpb24sIGhlYWRlci5mb3JtYXQpOworICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBjZnMubmV3U1NUYWJsZURlc2NyaXB0b3IoZGF0YURpciwgaGVhZGVyLnZlcnNpb24pOwogCi0gICAgICAgIGxvZ2dlci5kZWJ1ZygiW1RhYmxlICN7fV0ge30gQ29tcG9uZW50cyB0byB3cml0ZToge30iLCBjZnMubWV0YWRhdGEoKSwgZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSksIGNvbXBvbmVudHMpOworICAgICAgICBJT09wdGlvbnMgaW9PcHRpb25zID0gbmV3IElPT3B0aW9ucyhEYXRhYmFzZURlc2NyaXB0b3IuZ2V0RGlza09wdGltaXphdGlvblN0cmF0ZWd5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5nZXREaXNrQWNjZXNzTW9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0SW5kZXhBY2Nlc3NNb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5nZXREaXNrT3B0aW1pemF0aW9uRXN0aW1hdGVQZXJjZW50aWxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbnRpYWxXcml0ZXJPcHRpb24ubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHJpY2tsZUZzeW5jKGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1ZmZlclNpemUoMiA8PCAyMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWZmZXJUeXBlKEJ1ZmZlclR5cGUuT0ZGX0hFQVApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldEZsdXNoQ29tcHJlc3Npb24oKSk7CiAKLSAgICAgICAgcmV0dXJuIG5ldyBCaWdUYWJsZVplcm9Db3B5V3JpdGVyKGRlc2MsIGNmcy5tZXRhZGF0YSwgbGlmZWN5Y2xlTmV3VHJhY2tlciwgY29tcG9uZW50cyk7CisgICAgICAgIGxvZ2dlci5kZWJ1ZygiW1RhYmxlICN7fV0ge30gQ29tcG9uZW50cyB0byB3cml0ZToge30iLCBjZnMubWV0YWRhdGEoKSwgZGVzYywgY29tcG9uZW50cyk7CisgICAgICAgIHJldHVybiBkZXNjLmdldEZvcm1hdCgpCisgICAgICAgICAgICAgICAgICAgLmdldFdyaXRlckZhY3RvcnkoKQorICAgICAgICAgICAgICAgICAgIC5idWlsZGVyKGRlc2MpCisgICAgICAgICAgICAgICAgICAgLnNldENvbXBvbmVudHMoY29tcG9uZW50cykKKyAgICAgICAgICAgICAgICAgICAuc2V0VGFibGVNZXRhZGF0YVJlZihjZnMubWV0YWRhdGEpCisgICAgICAgICAgICAgICAgICAgLnNldElPT3B0aW9ucyhpb09wdGlvbnMpCisgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVplcm9Db3B5V3JpdGVyKGxpZmVjeWNsZU5ld1RyYWNrZXIsIGNmcyk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYUVudGlyZVNTVGFibGVTdHJlYW1Xcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFFbnRpcmVTU1RhYmxlU3RyZWFtV3JpdGVyLmphdmEKaW5kZXggM2Q2NzlhNS4uNTRmZWM0OSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYUVudGlyZVNTVGFibGVTdHJlYW1Xcml0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhRW50aXJlU1NUYWJsZVN0cmVhbVdyaXRlci5qYXZhCkBAIC0yNyw5ICsyNyw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuUHJvZ3Jlc3NJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1pbmdEYXRhT3V0cHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtTWFuYWdlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtaW5nRGF0YU91dHB1dFBsdXM7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbU1hbmFnZXIuU3RyZWFtUmF0ZUxpbWl0ZXI7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5OwpAQCAtOTMsNyArOTMsNyBAQAogICAgICAgICAgICAgbG9uZyBieXRlc1dyaXR0ZW4gPSBvdXQud3JpdGVGaWxlVG9DaGFubmVsKGNoYW5uZWwsIGxpbWl0ZXIpOwogICAgICAgICAgICAgcHJvZ3Jlc3MgKz0gYnl0ZXNXcml0dGVuOwogCi0gICAgICAgICAgICBzZXNzaW9uLnByb2dyZXNzKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihjb21wb25lbnQpLCBQcm9ncmVzc0luZm8uRGlyZWN0aW9uLk9VVCwgYnl0ZXNXcml0dGVuLCBieXRlc1dyaXR0ZW4sIGxlbmd0aCk7CisgICAgICAgICAgICBzZXNzaW9uLnByb2dyZXNzKHNzdGFibGUuZGVzY3JpcHRvci5maWxlRm9yKGNvbXBvbmVudCkudG9TdHJpbmcoKSwgUHJvZ3Jlc3NJbmZvLkRpcmVjdGlvbi5PVVQsIGJ5dGVzV3JpdHRlbiwgYnl0ZXNXcml0dGVuLCBsZW5ndGgpOwogCiAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIltTdHJlYW0gI3t9XSBGaW5pc2hlZCBzdHJlYW1pbmcge30ue30gZ2VuIHt9IGNvbXBvbmVudCB7fSB0byB7fSwgeGZlcmVkID0ge30sIGxlbmd0aCA9IHt9LCB0b3RhbFNpemUgPSB7fSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5wbGFuSWQoKSwKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFPdXRnb2luZ0ZpbGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFPdXRnb2luZ0ZpbGUuamF2YQppbmRleCAzNjdjMzA0Li44OGVjZmY4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhT3V0Z29pbmdGaWxlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYU91dGdvaW5nRmlsZS5qYXZhCkBAIC0zMSw5ICszMSw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuT3V0Z29pbmdTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbWluZ0RhdGFPdXRwdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1PcGVyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbVNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbWluZ0RhdGFPdXRwdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuUmVmOwogCkBAIC03NiwxNiArNzYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNob3VsZFN0cmVhbUVudGlyZVNTVGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50TWFuaWZlc3QgbWFuaWZlc3QpCiAgICAgewotICAgICAgICBib29sZWFuIGtlZXBTU1RhYmxlTGV2ZWwgPSBvcGVyYXRpb24gPT0gU3RyZWFtT3BlcmF0aW9uLkJPT1RTVFJBUCB8fCBvcGVyYXRpb24gPT0gU3RyZWFtT3BlcmF0aW9uLlJFQlVJTEQ7Ci0KICAgICAgICAgQ29tcHJlc3Npb25JbmZvIGNvbXByZXNzaW9uSW5mbyA9IHNzdGFibGUuY29tcHJlc3Npb24KICAgICAgICAgICAgICAgICA/IENvbXByZXNzaW9uSW5mby5uZXdMYXp5SW5zdGFuY2Uoc3N0YWJsZS5nZXRDb21wcmVzc2lvbk1ldGFkYXRhKCksIHNlY3Rpb25zKQogICAgICAgICAgICAgICAgIDogbnVsbDsKIAogICAgICAgICByZXR1cm4gQ2Fzc2FuZHJhU3RyZWFtSGVhZGVyLmJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTU1RhYmxlRm9ybWF0KHNzdGFibGUuZGVzY3JpcHRvci5mb3JtYXRUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTU1RhYmxlVmVyc2lvbihzc3RhYmxlLmRlc2NyaXB0b3IudmVyc2lvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU1NUYWJsZUxldmVsKGtlZXBTU1RhYmxlTGV2ZWwgPyBzc3RhYmxlLmdldFNTVGFibGVMZXZlbCgpIDogMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU1NUYWJsZUxldmVsKG9wZXJhdGlvbi5rZWVwU1NUYWJsZUxldmVsKCkgPyBzc3RhYmxlLmdldFNTVGFibGVMZXZlbCgpIDogMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoRXN0aW1hdGVkS2V5cyhlc3RpbWF0ZWRLZXlzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTZWN0aW9ucyhzZWN0aW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29tcHJlc3Npb25JbmZvKGNvbXByZXNzaW9uSW5mbykKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1IZWFkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1IZWFkZXIuamF2YQppbmRleCBjOWUxMGNmLi4yYjEyMjNiIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhU3RyZWFtSGVhZGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYVN0cmVhbUhlYWRlci5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7CkBAIC00Nyw4ICs0OCw2IEBACiAgICAgLyoqIFNTVGFibGUgdmVyc2lvbiAqLwogICAgIHB1YmxpYyBmaW5hbCBWZXJzaW9uIHZlcnNpb247CiAKLSAgICAvKiogU1NUYWJsZSBmb3JtYXQgKiovCi0gICAgcHVibGljIGZpbmFsIFNTVGFibGVGb3JtYXQuVHlwZSBmb3JtYXQ7CiAgICAgcHVibGljIGZpbmFsIGxvbmcgZXN0aW1hdGVkS2V5czsKICAgICBwdWJsaWMgZmluYWwgTGlzdDxTU1RhYmxlUmVhZGVyLlBhcnRpdGlvblBvc2l0aW9uQm91bmRzPiBzZWN0aW9uczsKICAgICBwdWJsaWMgZmluYWwgQ29tcHJlc3Npb25JbmZvIGNvbXByZXNzaW9uSW5mbzsKQEAgLTY4LDcgKzY3LDYgQEAKICAgICBwcml2YXRlIENhc3NhbmRyYVN0cmVhbUhlYWRlcihCdWlsZGVyIGJ1aWxkZXIpCiAgICAgewogICAgICAgICB2ZXJzaW9uID0gYnVpbGRlci52ZXJzaW9uOwotICAgICAgICBmb3JtYXQgPSBidWlsZGVyLmZvcm1hdDsKICAgICAgICAgZXN0aW1hdGVkS2V5cyA9IGJ1aWxkZXIuZXN0aW1hdGVkS2V5czsKICAgICAgICAgc2VjdGlvbnMgPSBidWlsZGVyLnNlY3Rpb25zOwogICAgICAgICBjb21wcmVzc2lvbkluZm8gPSBidWlsZGVyLmNvbXByZXNzaW9uSW5mbzsKQEAgLTEyNCw3ICsxMjIsNiBAQAogICAgICAgICAgICAgICAgc3N0YWJsZUxldmVsID09IHRoYXQuc3N0YWJsZUxldmVsICYmCiAgICAgICAgICAgICAgICBpc0VudGlyZVNTVGFibGUgPT0gdGhhdC5pc0VudGlyZVNTVGFibGUgJiYKICAgICAgICAgICAgICAgIE9iamVjdHMuZXF1YWxzKHZlcnNpb24sIHRoYXQudmVyc2lvbikgJiYKLSAgICAgICAgICAgICAgIGZvcm1hdCA9PSB0aGF0LmZvcm1hdCAmJgogICAgICAgICAgICAgICAgT2JqZWN0cy5lcXVhbHMoc2VjdGlvbnMsIHRoYXQuc2VjdGlvbnMpICYmCiAgICAgICAgICAgICAgICBPYmplY3RzLmVxdWFscyhjb21wcmVzc2lvbkluZm8sIHRoYXQuY29tcHJlc3Npb25JbmZvKSAmJgogICAgICAgICAgICAgICAgT2JqZWN0cy5lcXVhbHMoc2VyaWFsaXphdGlvbkhlYWRlciwgdGhhdC5zZXJpYWxpemF0aW9uSGVhZGVyKSAmJgpAQCAtMTM2LDcgKzEzMyw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpCiAgICAgewotICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKHZlcnNpb24sIGZvcm1hdCwgZXN0aW1hdGVkS2V5cywgc2VjdGlvbnMsIGNvbXByZXNzaW9uSW5mbywgc3N0YWJsZUxldmVsLCBzZXJpYWxpemF0aW9uSGVhZGVyLCBjb21wb25lbnRNYW5pZmVzdCwKKyAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaCh2ZXJzaW9uLCBlc3RpbWF0ZWRLZXlzLCBzZWN0aW9ucywgY29tcHJlc3Npb25JbmZvLCBzc3RhYmxlTGV2ZWwsIHNlcmlhbGl6YXRpb25IZWFkZXIsIGNvbXBvbmVudE1hbmlmZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRW50aXJlU1NUYWJsZSwgZmlyc3RLZXksIHRhYmxlSWQpOwogICAgIH0KIApAQCAtMTQ1LDcgKzE0Miw3IEBACiAgICAgewogICAgICAgICByZXR1cm4gIkNhc3NhbmRyYVN0cmVhbUhlYWRlcnsiICsKICAgICAgICAgICAgICAgICJ2ZXJzaW9uPSIgKyB2ZXJzaW9uICsKLSAgICAgICAgICAgICAgICIsIGZvcm1hdD0iICsgZm9ybWF0ICsKKyAgICAgICAgICAgICAgICIsIGZvcm1hdD0iICsgdmVyc2lvbi5mb3JtYXQubmFtZSgpICsKICAgICAgICAgICAgICAgICIsIGVzdGltYXRlZEtleXM9IiArIGVzdGltYXRlZEtleXMgKwogICAgICAgICAgICAgICAgIiwgc2VjdGlvbnM9IiArIHNlY3Rpb25zICsKICAgICAgICAgICAgICAgICIsIHNzdGFibGVMZXZlbD0iICsgc3N0YWJsZUxldmVsICsKQEAgLTE2Myw3ICsxNjAsNyBAQAogICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoQ2Fzc2FuZHJhU3RyZWFtSGVhZGVyIGhlYWRlciwgRGF0YU91dHB1dFBsdXMgb3V0LCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIG91dC53cml0ZVVURihoZWFkZXIudmVyc2lvbi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIG91dC53cml0ZVVURihoZWFkZXIuZm9ybWF0Lm5hbWUpOworICAgICAgICAgICAgb3V0LndyaXRlVVRGKGhlYWRlci52ZXJzaW9uLmZvcm1hdC5uYW1lKCkpOwogCiAgICAgICAgICAgICBvdXQud3JpdGVMb25nKGhlYWRlci5lc3RpbWF0ZWRLZXlzKTsKICAgICAgICAgICAgIG91dC53cml0ZUludChoZWFkZXIuc2VjdGlvbnMuc2l6ZSgpKTsKQEAgLTE4Miw3ICsxNzksNyBAQAogCiAgICAgICAgICAgICBpZiAoaGVhZGVyLmlzRW50aXJlU1NUYWJsZSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb21wb25lbnRNYW5pZmVzdC5zZXJpYWxpemVyLnNlcmlhbGl6ZShoZWFkZXIuY29tcG9uZW50TWFuaWZlc3QsIG91dCwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgQ29tcG9uZW50TWFuaWZlc3Quc2VyaWFsaXplcnMuZ2V0KGhlYWRlci52ZXJzaW9uLmZvcm1hdC5uYW1lKCkpLnNlcmlhbGl6ZShoZWFkZXIuY29tcG9uZW50TWFuaWZlc3QsIG91dCwgdmVyc2lvbik7CiAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVXaXRoVkludExlbmd0aChoZWFkZXIuZmlyc3RLZXkuZ2V0S2V5KCksIG91dCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIwMSw4ICsxOTgsMTEgQEAKICAgICAgICAgQFZpc2libGVGb3JUZXN0aW5nCiAgICAgICAgIHB1YmxpYyBDYXNzYW5kcmFTdHJlYW1IZWFkZXIgZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbiwgaW50IHZlcnNpb24sIEZ1bmN0aW9uPFRhYmxlSWQsIElQYXJ0aXRpb25lcj4gcGFydGl0aW9uZXJNYXBwZXIpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7Ci0gICAgICAgICAgICBWZXJzaW9uIHNzdGFibGVWZXJzaW9uID0gU1NUYWJsZUZvcm1hdC5UeXBlLmN1cnJlbnQoKS5pbmZvLmdldFZlcnNpb24oaW4ucmVhZFVURigpKTsKLSAgICAgICAgICAgIFNTVGFibGVGb3JtYXQuVHlwZSBmb3JtYXQgPSBTU1RhYmxlRm9ybWF0LlR5cGUudmFsaWRhdGUoaW4ucmVhZFVURigpKTsKKyAgICAgICAgICAgIFN0cmluZyBzc3RhYmxlVmVyc2lvblN0cmluZyA9IGluLnJlYWRVVEYoKTsKKyAgICAgICAgICAgIFN0cmluZyBmb3JtYXROYW1lID0gaW4ucmVhZFVURigpOworICAgICAgICAgICAgU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXQgPSBPYmplY3RzLnJlcXVpcmVOb25OdWxsKERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU1RhYmxlRm9ybWF0cygpLmdldChmb3JtYXROYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJVbmtub3duIFNTVGFibGUgZm9ybWF0ICclcyciLCBmb3JtYXROYW1lKSk7CisgICAgICAgICAgICBWZXJzaW9uIHNzdGFibGVWZXJzaW9uID0gZm9ybWF0LmdldFZlcnNpb24oc3N0YWJsZVZlcnNpb25TdHJpbmcpOwogCiAgICAgICAgICAgICBsb25nIGVzdGltYXRlZEtleXMgPSBpbi5yZWFkTG9uZygpOwogICAgICAgICAgICAgaW50IGNvdW50ID0gaW4ucmVhZEludCgpOwpAQCAtMjIxLDcgKzIyMSw3IEBACiAKICAgICAgICAgICAgIGlmIChpc0VudGlyZVNTVGFibGUpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWFuaWZlc3QgPSBDb21wb25lbnRNYW5pZmVzdC5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBtYW5pZmVzdCA9IENvbXBvbmVudE1hbmlmZXN0LnNlcmlhbGl6ZXJzLmdldChmb3JtYXQubmFtZSgpKS5kZXNlcmlhbGl6ZShpbiwgdmVyc2lvbik7CiAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBrZXlCdWYgPSBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFZJbnRMZW5ndGgoaW4pOwogICAgICAgICAgICAgICAgIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IHBhcnRpdGlvbmVyTWFwcGVyLmFwcGx5KHRhYmxlSWQpOwogICAgICAgICAgICAgICAgIGlmIChwYXJ0aXRpb25lciA9PSBudWxsKQpAQCAtMjI5LDggKzIyOSw3IEBACiAgICAgICAgICAgICAgICAgZmlyc3RLZXkgPSBwYXJ0aXRpb25lci5kZWNvcmF0ZUtleShrZXlCdWYpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICByZXR1cm4gYnVpbGRlcigpLndpdGhTU1RhYmxlRm9ybWF0KGZvcm1hdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNTVGFibGVWZXJzaW9uKHNzdGFibGVWZXJzaW9uKQorICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIoKS53aXRoU1NUYWJsZVZlcnNpb24oc3N0YWJsZVZlcnNpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTU1RhYmxlTGV2ZWwoc3N0YWJsZUxldmVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoRXN0aW1hdGVkS2V5cyhlc3RpbWF0ZWRLZXlzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU2VjdGlvbnMoc2VjdGlvbnMpCkBAIC0yNDcsNyArMjQ2LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgbG9uZyBzaXplID0gMDsKICAgICAgICAgICAgIHNpemUgKz0gVHlwZVNpemVzLnNpemVvZihoZWFkZXIudmVyc2lvbi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHNpemUgKz0gVHlwZVNpemVzLnNpemVvZihoZWFkZXIuZm9ybWF0Lm5hbWUpOworICAgICAgICAgICAgc2l6ZSArPSBUeXBlU2l6ZXMuc2l6ZW9mKGhlYWRlci52ZXJzaW9uLmZvcm1hdC5uYW1lKCkpOwogICAgICAgICAgICAgc2l6ZSArPSBUeXBlU2l6ZXMuc2l6ZW9mKGhlYWRlci5lc3RpbWF0ZWRLZXlzKTsKIAogICAgICAgICAgICAgc2l6ZSArPSBUeXBlU2l6ZXMuc2l6ZW9mKGhlYWRlci5zZWN0aW9ucy5zaXplKCkpOwpAQCAtMjY3LDcgKzI2Niw3IEBACiAKICAgICAgICAgICAgIGlmIChoZWFkZXIuaXNFbnRpcmVTU1RhYmxlKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNpemUgKz0gQ29tcG9uZW50TWFuaWZlc3Quc2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShoZWFkZXIuY29tcG9uZW50TWFuaWZlc3QsIHZlcnNpb24pOworICAgICAgICAgICAgICAgIHNpemUgKz0gQ29tcG9uZW50TWFuaWZlc3Quc2VyaWFsaXplcnMuZ2V0KGhlYWRlci52ZXJzaW9uLmZvcm1hdC5uYW1lKCkpLnNlcmlhbGl6ZWRTaXplKGhlYWRlci5jb21wb25lbnRNYW5pZmVzdCwgdmVyc2lvbik7CiAgICAgICAgICAgICAgICAgc2l6ZSArPSBCeXRlQnVmZmVyVXRpbC5zZXJpYWxpemVkU2l6ZVdpdGhWSW50TGVuZ3RoKGhlYWRlci5maXJzdEtleS5nZXRLZXkoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gc2l6ZTsKQEAgLTI3Nyw3ICsyNzYsNiBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlcgogICAgIHsKICAgICAgICAgcHJpdmF0ZSBWZXJzaW9uIHZlcnNpb247Ci0gICAgICAgIHByaXZhdGUgU1NUYWJsZUZvcm1hdC5UeXBlIGZvcm1hdDsKICAgICAgICAgcHJpdmF0ZSBsb25nIGVzdGltYXRlZEtleXM7CiAgICAgICAgIHByaXZhdGUgTGlzdDxTU1RhYmxlUmVhZGVyLlBhcnRpdGlvblBvc2l0aW9uQm91bmRzPiBzZWN0aW9uczsKICAgICAgICAgcHJpdmF0ZSBDb21wcmVzc2lvbkluZm8gY29tcHJlc3Npb25JbmZvOwpAQCAtMjg4LDEyICsyODYsNiBAQAogICAgICAgICBwcml2YXRlIERlY29yYXRlZEtleSBmaXJzdEtleTsKICAgICAgICAgcHJpdmF0ZSBUYWJsZUlkIHRhYmxlSWQ7CiAKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgd2l0aFNTVGFibGVGb3JtYXQoU1NUYWJsZUZvcm1hdC5UeXBlIGZvcm1hdCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCiAgICAgICAgIHB1YmxpYyBCdWlsZGVyIHdpdGhTU1RhYmxlVmVyc2lvbihWZXJzaW9uIHZlcnNpb24pCiAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247CkBAIC0zNTcsNyArMzQ5LDYgQEAKICAgICAgICAgcHVibGljIENhc3NhbmRyYVN0cmVhbUhlYWRlciBidWlsZCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNoZWNrTm90TnVsbCh2ZXJzaW9uKTsKLSAgICAgICAgICAgIGNoZWNrTm90TnVsbChmb3JtYXQpOwogICAgICAgICAgICAgY2hlY2tOb3ROdWxsKHNlY3Rpb25zKTsKICAgICAgICAgICAgIGNoZWNrTm90TnVsbChzZXJpYWxpemF0aW9uSGVhZGVyKTsKICAgICAgICAgICAgIGNoZWNrTm90TnVsbCh0YWJsZUlkKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1NYW5hZ2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhU3RyZWFtTWFuYWdlci5qYXZhCmluZGV4IDQ2Y2YyNTMuLjhjYTdhYzUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1NYW5hZ2VyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYVN0cmVhbU1hbmFnZXIuamF2YQpAQCAtMzAsNiArMzAsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLlN0YXRzTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SYW5nZXNBdEVuZHBvaW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmVwbGljYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkFjdGl2ZVJlcGFpclNlcnZpY2U7CkBAIC0xMDUsNyArMTA2LDEwIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWRpY2F0ZSA9IHMgLT4gcy5pc1BlbmRpbmdSZXBhaXIoKSAmJiBzLmdldFNTVGFibGVNZXRhZGF0YSgpLnBlbmRpbmdSZXBhaXIuZXF1YWxzKHBlbmRpbmdSZXBhaXIpOworICAgICAgICAgICAgICAgICAgICBwcmVkaWNhdGUgPSBzIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRzTWV0YWRhdGEgc3N0YWJsZU1ldGFkYXRhID0gcy5nZXRTU1RhYmxlTWV0YWRhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzc3RhYmxlTWV0YWRhdGEucGVuZGluZ1JlcGFpciAhPSBBY3RpdmVSZXBhaXJTZXJ2aWNlLk5PX1BFTkRJTkdfUkVQQUlSICYmIHNzdGFibGVNZXRhZGF0YS5wZW5kaW5nUmVwYWlyLmVxdWFscyhwZW5kaW5nUmVwYWlyKTsKKyAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmb3IgKFJhbmdlPFBhcnRpdGlvblBvc2l0aW9uPiBrZXlSYW5nZSA6IGtleVJhbmdlcykKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1SZWFkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1SZWFkZXIuamF2YQppbmRleCAwNDI2OGYwLi4yMzI1ODI4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhU3RyZWFtUmVhZGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYVN0cmVhbVJlYWRlci5qYXZhCkBAIC0zOSw5ICszOSw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuVW5rbm93bkNvbHVtbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlJhbmdlQXdhcmVTU1RhYmxlV3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZU11bHRpV3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVNpbXBsZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlJhbmdlQXdhcmVTU1RhYmxlV3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uOwpAQCAtNzMsNyArNzMsNiBAQAogICAgIHByb3RlY3RlZCBmaW5hbCBWZXJzaW9uIGlucHV0VmVyc2lvbjsKICAgICBwcm90ZWN0ZWQgZmluYWwgbG9uZyByZXBhaXJlZEF0OwogICAgIHByb3RlY3RlZCBmaW5hbCBUaW1lVVVJRCBwZW5kaW5nUmVwYWlyOwotICAgIHByb3RlY3RlZCBmaW5hbCBTU1RhYmxlRm9ybWF0LlR5cGUgZm9ybWF0OwogICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgc3N0YWJsZUxldmVsOwogICAgIHByb3RlY3RlZCBmaW5hbCBTZXJpYWxpemF0aW9uSGVhZGVyLkNvbXBvbmVudCBoZWFkZXI7CiAgICAgcHJvdGVjdGVkIGZpbmFsIGludCBmaWxlU2VxTnVtOwpAQCAtOTMsNyArOTIsNiBAQAogICAgICAgICB0aGlzLmlucHV0VmVyc2lvbiA9IHN0cmVhbUhlYWRlci52ZXJzaW9uOwogICAgICAgICB0aGlzLnJlcGFpcmVkQXQgPSBoZWFkZXIucmVwYWlyZWRBdDsKICAgICAgICAgdGhpcy5wZW5kaW5nUmVwYWlyID0gaGVhZGVyLnBlbmRpbmdSZXBhaXI7Ci0gICAgICAgIHRoaXMuZm9ybWF0ID0gc3RyZWFtSGVhZGVyLmZvcm1hdDsKICAgICAgICAgdGhpcy5zc3RhYmxlTGV2ZWwgPSBzdHJlYW1IZWFkZXIuc3N0YWJsZUxldmVsOwogICAgICAgICB0aGlzLmhlYWRlciA9IHN0cmVhbUhlYWRlci5zZXJpYWxpemF0aW9uSGVhZGVyOwogICAgICAgICB0aGlzLmZpbGVTZXFOdW0gPSBoZWFkZXIuc2VxdWVuY2VOdW1iZXI7CkBAIC0xMjUsNyArMTIzLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgVHJhY2tlZERhdGFJbnB1dFBsdXMgaW4gPSBuZXcgVHJhY2tlZERhdGFJbnB1dFBsdXMoc3RyZWFtQ29tcHJlc3Npb25JbnB1dFN0cmVhbSk7CiAgICAgICAgICAgICBkZXNlcmlhbGl6ZXIgPSBuZXcgU3RyZWFtRGVzZXJpYWxpemVyKGNmcy5tZXRhZGF0YSgpLCBpbiwgaW5wdXRWZXJzaW9uLCBnZXRIZWFkZXIoY2ZzLm1ldGFkYXRhKCkpKTsKLSAgICAgICAgICAgIHdyaXRlciA9IGNyZWF0ZVdyaXRlcihjZnMsIHRvdGFsU2l6ZSwgcmVwYWlyZWRBdCwgcGVuZGluZ1JlcGFpciwgZm9ybWF0KTsKKyAgICAgICAgICAgIHdyaXRlciA9IGNyZWF0ZVdyaXRlcihjZnMsIHRvdGFsU2l6ZSwgcmVwYWlyZWRBdCwgcGVuZGluZ1JlcGFpciwgaW5wdXRWZXJzaW9uLmZvcm1hdCk7CiAgICAgICAgICAgICBTdHJpbmcgc2VxdWVuY2VOYW1lID0gd3JpdGVyLmdldEZpbGVuYW1lKCkgKyAnLScgKyBmaWxlU2VxTnVtOwogICAgICAgICAgICAgbG9uZyBsYXN0Qnl0ZXNSZWFkID0gMDsKICAgICAgICAgICAgIHdoaWxlIChpbi5nZXRCeXRlc1JlYWQoKSA8IHRvdGFsU2l6ZSkKQEAgLTE1Nyw3ICsxNTUsNyBAQAogICAgICAgICByZXR1cm4gaGVhZGVyICE9IG51bGw/IGhlYWRlci50b0hlYWRlcihtZXRhZGF0YSkgOiBudWxsOyAvL3ByZS0zLjAgc3N0YWJsZSBoYXZlIG5vIFNlcmlhbGl6YXRpb25IZWFkZXIKICAgICB9CiAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKLSAgICBwcm90ZWN0ZWQgU1NUYWJsZU11bHRpV3JpdGVyIGNyZWF0ZVdyaXRlcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIGxvbmcgdG90YWxTaXplLCBsb25nIHJlcGFpcmVkQXQsIFRpbWVVVUlEIHBlbmRpbmdSZXBhaXIsIFNTVGFibGVGb3JtYXQuVHlwZSBmb3JtYXQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHByb3RlY3RlZCBTU1RhYmxlTXVsdGlXcml0ZXIgY3JlYXRlV3JpdGVyKENvbHVtbkZhbWlseVN0b3JlIGNmcywgbG9uZyB0b3RhbFNpemUsIGxvbmcgcmVwYWlyZWRBdCwgVGltZVVVSUQgcGVuZGluZ1JlcGFpciwgU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXQpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgRGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeSBsb2NhbERpciA9IGNmcy5nZXREaXJlY3RvcmllcygpLmdldFdyaXRlYWJsZUxvY2F0aW9uKHRvdGFsU2l6ZSk7CiAgICAgICAgIGlmIChsb2NhbERpciA9PSBudWxsKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYVN0cmVhbVJlY2VpdmVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhU3RyZWFtUmVjZWl2ZXIuamF2YQppbmRleCA0OGRlOGI1Li41MThkNTM3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhU3RyZWFtUmVjZWl2ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhU3RyZWFtUmVjZWl2ZXIuamF2YQpAQCAtMjUsMTggKzI1LDE2IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlTmV3VHJhY2tlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7Ci0KIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5NdXRhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlTmV3VHJhY2tlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5QYXJ0aXRpb25VcGRhdGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5UaHJvdHRsZWRVbmZpbHRlcmVkSXRlcmF0b3I7CkBAIC00NSw2ICs0Myw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJvdW5kczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU1NUYWJsZVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZU11bHRpV3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLkluY29taW5nU3RyZWFtOwpAQCAtNTQsMTEgKzUzLDEzIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlJlZnM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5SRVBBSVJfTVVUQVRJT05fUkVQQUlSX1JPV1NfUEVSX0JBVENIOworCiBwdWJsaWMgY2xhc3MgQ2Fzc2FuZHJhU3RyZWFtUmVjZWl2ZXIgaW1wbGVtZW50cyBTdHJlYW1SZWNlaXZlcgogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDYXNzYW5kcmFTdHJlYW1SZWNlaXZlci5jbGFzcyk7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JPV1NfUEVSX0JBVENIID0gSW50ZWdlci5nZXRJbnRlZ2VyKCJjYXNzYW5kcmEucmVwYWlyLm11dGF0aW9uX3JlcGFpcl9yb3dzX3Blcl9iYXRjaCIsIDEwMCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9ST1dTX1BFUl9CQVRDSCA9IFJFUEFJUl9NVVRBVElPTl9SRVBBSVJfUk9XU19QRVJfQkFUQ0guZ2V0SW50KCk7CiAKICAgICBwcml2YXRlIGZpbmFsIENvbHVtbkZhbWlseVN0b3JlIGNmczsKICAgICBwcml2YXRlIGZpbmFsIFN0cmVhbVNlc3Npb24gc2Vzc2lvbjsKQEAgLTE3MiwyMyArMTczLDMxIEBACiAgICAgICAgIHJldHVybiBjZnMubWV0YWRhdGEoKS5wYXJhbXMuY2RjOwogICAgIH0KIAorICAgIC8vIHJldHVybnMgdHJ1ZSBpaWYgaXQgaXMgYSBjZGMgdGFibGUgYW5kIGNkYyBvbiByZXBhaXIgaXMgZW5hYmxlZC4KKyAgICBwcml2YXRlIGJvb2xlYW4gY2RjUmVxdWlyZXNXcml0ZUNvbW1pdExvZyhDb2x1bW5GYW1pbHlTdG9yZSBjZnMpCisgICAgeworICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmlzQ0RDT25SZXBhaXJFbmFibGVkKCkgJiYgaGFzQ0RDKGNmcyk7CisgICAgfQorCiAgICAgLyoKICAgICAgKiBXZSBoYXZlIGEgc3BlY2lhbCBwYXRoIGZvciB2aWV3cyBhbmQgZm9yIENEQy4KICAgICAgKgogICAgICAqIEZvciB2aWV3cywgc2luY2UgdGhlIHZpZXcgcmVxdWlyZXMgY2xlYW5pbmcgdXAgYW55IHByZS1leGlzdGluZyBzdGF0ZSwgd2UgbXVzdCBwdXQgYWxsIHBhcnRpdGlvbnMKICAgICAgKiB0aHJvdWdoIHRoZSBzYW1lIHdyaXRlIHBhdGggYXMgbm9ybWFsIG11dGF0aW9ucy4gVGhpcyBhbHNvIGVuc3VyZXMgYW55IDJpcyBhcmUgYWxzbyB1cGRhdGVkLgogICAgICAqCi0gICAgICogRm9yIENEQy1lbmFibGVkIHRhYmxlcywgd2Ugd2FudCB0byBlbnN1cmUgdGhhdCB0aGUgbXV0YXRpb25zIGFyZSBydW4gdGhyb3VnaCB0aGUgQ29tbWl0TG9nIHNvIHRoZXkKLSAgICAgKiBjYW4gYmUgYXJjaGl2ZWQgYnkgdGhlIENEQyBwcm9jZXNzIG9uIGRpc2NhcmQuCisgICAgICogRm9yIENEQy1lbmFibGVkIHRhYmxlcyBhbmQgd3JpdGUgcGF0aCBmb3IgQ0RDIGlzIGVuYWJsZWQsIHdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIG11dGF0aW9ucyBhcmUKKyAgICAgKiBydW4gdGhyb3VnaCB0aGUgQ29tbWl0TG9nLCBzbyB0aGV5IGNhbiBiZSBhcmNoaXZlZCBieSB0aGUgQ0RDIHByb2Nlc3Mgb24gZGlzY2FyZC4KICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZXNXcml0ZVBhdGgoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGhhc0NEQyhjZnMpIHx8IGNmcy5zdHJlYW1Ub01lbXRhYmxlKCkgfHwgKHNlc3Npb24uc3RyZWFtT3BlcmF0aW9uKCkucmVxdWlyZXNWaWV3QnVpbGQoKSAmJiBoYXNWaWV3cyhjZnMpKTsKKyAgICAgICAgcmV0dXJuIGNkY1JlcXVpcmVzV3JpdGVDb21taXRMb2coY2ZzKQorICAgICAgICAgICAgICAgfHwgY2ZzLnN0cmVhbVRvTWVtdGFibGUoKQorICAgICAgICAgICAgICAgfHwgKHNlc3Npb24uc3RyZWFtT3BlcmF0aW9uKCkucmVxdWlyZXNWaWV3QnVpbGQoKSAmJiBoYXNWaWV3cyhjZnMpKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgc2VuZFRocm91Z2hXcml0ZVBhdGgoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IHJlYWRlcnMpCiAgICAgewotICAgICAgICBib29sZWFuIGhhc0NkYyA9IGhhc0NEQyhjZnMpOworICAgICAgICBib29sZWFuIHdyaXRlQ0RDQ29tbWl0TG9nID0gY2RjUmVxdWlyZXNXcml0ZUNvbW1pdExvZyhjZnMpOwogICAgICAgICBDb2x1bW5GaWx0ZXIgZmlsdGVyID0gQ29sdW1uRmlsdGVyLmFsbChjZnMubWV0YWRhdGEoKSk7CiAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciByZWFkZXIgOiByZWFkZXJzKQogICAgICAgICB7CkBAIC0yMDYsNyArMjE1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIENGUyBoYXMgQ0RDLCBob3dldmVyLCB0aGVzZSB1cGRhdGVzIG5lZWQgdG8gYmUgd3JpdHRlbiB0byB0aGUgQ29tbWl0TG9nCiAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoZXkgZ2V0IGFyY2hpdmVkIGludG8gdGhlIGNkY19yYXcgZm9sZGVyCiAgICAgICAgICAgICAgICAgICAgIGtzLmFwcGx5KG5ldyBNdXRhdGlvbihQYXJ0aXRpb25VcGRhdGUuZnJvbUl0ZXJhdG9yKHRocm90dGxlZFBhcnRpdGlvbnMubmV4dCgpLCBmaWx0ZXIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ2RjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUNEQ0NvbW1pdExvZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1Xcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1Xcml0ZXIuamF2YQppbmRleCA5ZDllYTNjLi4zZTk4YzdkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhU3RyZWFtV3JpdGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYVN0cmVhbVdyaXRlci5qYXZhCkBAIC0yMSwyMyArMjEsMjEgQEAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBuZXQuanBvdW50ei5sejQuTFo0Q29tcHJlc3NvcjsKIGltcG9ydCBuZXQuanBvdW50ei5sejQuTFo0RmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzcy5CdWZmZXJUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuQ2hhbm5lbFByb3h5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUludGVncml0eU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUludGVncml0eU1ldGFkYXRhLkNoZWNrc3VtVmFsaWRhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5Qcm9ncmVzc0luZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbWluZ0RhdGFPdXRwdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1NYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1NYW5hZ2VyLlN0cmVhbVJhdGVMaW1pdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1pbmdEYXRhT3V0cHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuYXN5bmMuU3RyZWFtQ29tcHJlc3Npb25TZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5CdWZmZXJQb29sczsKQEAgLTg0LDkgKzgyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuZ2V0RmlsZW5hbWUoKSwgc2Vzc2lvbi5wZWVyLCBzc3RhYmxlLmdldFNTVGFibGVNZXRhZGF0YSgpLnJlcGFpcmVkQXQsIHRvdGFsU2l6ZSk7CiAKICAgICAgICAgdHJ5KENoYW5uZWxQcm94eSBwcm94eSA9IHNzdGFibGUuZ2V0RGF0YUNoYW5uZWwoKS5uZXdDaGFubmVsKCk7Ci0gICAgICAgICAgICBDaGVja3N1bVZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgRmlsZShzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkNSQykpLmV4aXN0cygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IERhdGFJbnRlZ3JpdHlNZXRhZGF0YS5jaGVja3N1bVZhbGlkYXRvcihzc3RhYmxlLmRlc2NyaXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGwpCisgICAgICAgICAgICBDaGVja3N1bVZhbGlkYXRvciB2YWxpZGF0b3IgPSBzc3RhYmxlLm1heWJlR2V0Q2hlY2tzdW1WYWxpZGF0b3IoKSkKICAgICAgICAgewogICAgICAgICAgICAgaW50IGJ1ZmZlclNpemUgPSB2YWxpZGF0b3IgPT0gbnVsbCA/IERFRkFVTFRfQ0hVTktfU0laRTogdmFsaWRhdG9yLmNodW5rU2l6ZTsKIApAQCAtOTQsNyArOTAsNyBAQAogICAgICAgICAgICAgbG9uZyBwcm9ncmVzcyA9IDBMOwogCiAgICAgICAgICAgICAvLyBzdHJlYW0gZWFjaCBvZiB0aGUgcmVxdWlyZWQgc2VjdGlvbnMgb2YgdGhlIGZpbGUKLSAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSk7CisgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIuUGFydGl0aW9uUG9zaXRpb25Cb3VuZHMgc2VjdGlvbiA6IHNlY3Rpb25zKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSB2YWxpZGF0b3IgPT0gbnVsbCA/IHNlY3Rpb24ubG93ZXJQb3NpdGlvbiA6IHZhbGlkYXRvci5jaHVua1N0YXJ0KHNlY3Rpb24ubG93ZXJQb3NpdGlvbik7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ29tcG9uZW50Q29udGV4dC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0NvbXBvbmVudENvbnRleHQuamF2YQppbmRleCBjOGMwOGFhLi4xNjRkZDZiIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ29tcG9uZW50Q29udGV4dC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9Db21wb25lbnRDb250ZXh0LmphdmEKQEAgLTE4LDMyICsxOCwyMyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnN0cmVhbWluZzsKIAotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBNdXRhYmxlIFNTVGFibGUgY29tcG9uZW50cyBhbmQgdGhlaXIgaGFyZGxpbmtzIHRvIGF2b2lkIGNvbmN1cnJlbnQgc3N0YWJsZSBjb21wb25lbnQgbW9kaWZpY2F0aW9uCi0gKiBkdXJpbmcgZW50aXJlLXNzdGFibGUtc3RyZWFtaW5nLgotICovCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwogCiBwdWJsaWMgY2xhc3MgQ29tcG9uZW50Q29udGV4dCBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ29tcG9uZW50Q29udGV4dC5jbGFzcyk7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8Q29tcG9uZW50PiBNVVRBQkxFX0NPTVBPTkVOVFMgPSBJbW11dGFibGVTZXQub2YoQ29tcG9uZW50LlNUQVRTLCBDb21wb25lbnQuU1VNTUFSWSk7Ci0KICAgICBwcml2YXRlIGZpbmFsIE1hcDxDb21wb25lbnQsIEZpbGU+IGhhcmRMaW5rczsKICAgICBwcml2YXRlIGZpbmFsIENvbXBvbmVudE1hbmlmZXN0IG1hbmlmZXN0OwogCkBAIC01NywxMyArNDgsMTMgQEAKICAgICB7CiAgICAgICAgIE1hcDxDb21wb25lbnQsIEZpbGU+IGhhcmRMaW5rcyA9IG5ldyBIYXNoTWFwPD4oMSk7CiAKLSAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogTVVUQUJMRV9DT01QT05FTlRTKQorICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBkZXNjcmlwdG9yLmdldEZvcm1hdCgpLm11dGFibGVDb21wb25lbnRzKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoY29tcG9uZW50KSk7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBkZXNjcmlwdG9yLmZpbGVGb3IoY29tcG9uZW50KTsKICAgICAgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAgICAgRmlsZSBoYXJkbGluayA9IG5ldyBGaWxlKGRlc2NyaXB0b3IudG1wRmlsZW5hbWVGb3JTdHJlYW1pbmcoY29tcG9uZW50KSk7CisgICAgICAgICAgICBGaWxlIGhhcmRsaW5rID0gZGVzY3JpcHRvci50bXBGaWxlRm9yU3RyZWFtaW5nKGNvbXBvbmVudCk7CiAgICAgICAgICAgICBGaWxlVXRpbHMuY3JlYXRlSGFyZExpbmsoZmlsZSwgaGFyZGxpbmspOwogICAgICAgICAgICAgaGFyZExpbmtzLnB1dChjb21wb25lbnQsIGhhcmRsaW5rKTsKICAgICAgICAgfQpAQCAtODEsOSArNzIsOSBAQAogICAgICAqLwogICAgIHB1YmxpYyBGaWxlQ2hhbm5lbCBjaGFubmVsKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgQ29tcG9uZW50IGNvbXBvbmVudCwgbG9uZyBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIFN0cmluZyB0b1RyYW5zZmVyID0gaGFyZExpbmtzLmNvbnRhaW5zS2V5KGNvbXBvbmVudCkgPyBoYXJkTGlua3MuZ2V0KGNvbXBvbmVudCkucGF0aCgpIDogZGVzY3JpcHRvci5maWxlbmFtZUZvcihjb21wb25lbnQpOworICAgICAgICBGaWxlIHRvVHJhbnNmZXIgPSBoYXJkTGlua3MuY29udGFpbnNLZXkoY29tcG9uZW50KSA/IGhhcmRMaW5rcy5nZXQoY29tcG9uZW50KSA6IGRlc2NyaXB0b3IuZmlsZUZvcihjb21wb25lbnQpOwogICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBmaWxlIGNoYW5uZWwgd2lsbCBiZSBjbG9zZWQgYnkgQ2FsbGVyCi0gICAgICAgIEZpbGVDaGFubmVsIGNoYW5uZWwgPSBuZXcgRmlsZSh0b1RyYW5zZmVyKS5uZXdSZWFkQ2hhbm5lbCgpOworICAgICAgICBGaWxlQ2hhbm5lbCBjaGFubmVsID0gdG9UcmFuc2Zlci5uZXdSZWFkQ2hhbm5lbCgpOwogCiAgICAgICAgIGFzc2VydCBzaXplID09IGNoYW5uZWwuc2l6ZSgpIDogU3RyaW5nLmZvcm1hdCgiRW50aXJlIHNzdGFibGUgc3RyZWFtaW5nIGV4cGVjdHMgJXMgZmlsZSBzaXplIHRvIGJlICVzIGJ1dCBnb3QgJXMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCwgc2l6ZSwgY2hhbm5lbC5zaXplKCkpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0NvbXBvbmVudE1hbmlmZXN0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ29tcG9uZW50TWFuaWZlc3QuamF2YQppbmRleCBiNzdiNTk0Li41ZTNjYzBjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ29tcG9uZW50TWFuaWZlc3QuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ29tcG9uZW50TWFuaWZlc3QuamF2YQpAQCAtMTgsMzAgKzE4LDMyIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuc3RyZWFtaW5nOwogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmF0b3JzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5UeXBlU2l6ZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uSVZlcnNpb25lZFNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIAogLyoqCiAgKiBTU1RhYmxlIGNvbXBvbmVudHMgYW5kIHRoZWlyIHNpemVzIHRvIGJlIHRyYW5mZXJlZCB2aWEgZW50aXJlLXNzdGFibGUtc3RyZWFtaW5nCiAgKi8KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7Ci0KIHB1YmxpYyBmaW5hbCBjbGFzcyBDb21wb25lbnRNYW5pZmVzdCBpbXBsZW1lbnRzIEl0ZXJhYmxlPENvbXBvbmVudD4KIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PENvbXBvbmVudD4gU1RSRUFNX0NPTVBPTkVOVFMgPSBJbW11dGFibGVMaXN0Lm9mKENvbXBvbmVudC5EQVRBLCBDb21wb25lbnQuUFJJTUFSWV9JTkRFWCwgQ29tcG9uZW50LlNUQVRTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnQuQ09NUFJFU1NJT05fSU5GTywgQ29tcG9uZW50LkZJTFRFUiwgQ29tcG9uZW50LlNVTU1BUlksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudC5ESUdFU1QsIENvbXBvbmVudC5DUkMpOwotCiAgICAgcHJpdmF0ZSBmaW5hbCBMaW5rZWRIYXNoTWFwPENvbXBvbmVudCwgTG9uZz4gY29tcG9uZW50czsKIAogICAgIHB1YmxpYyBDb21wb25lbnRNYW5pZmVzdChNYXA8Q29tcG9uZW50LCBMb25nPiBjb21wb25lbnRzKQpAQCAtNTIsMTEgKzU0LDExIEBACiAgICAgQFZpc2libGVGb3JUZXN0aW5nCiAgICAgcHVibGljIHN0YXRpYyBDb21wb25lbnRNYW5pZmVzdCBjcmVhdGUoRGVzY3JpcHRvciBkZXNjcmlwdG9yKQogICAgIHsKLSAgICAgICAgTGlua2VkSGFzaE1hcDxDb21wb25lbnQsIExvbmc+IGNvbXBvbmVudHMgPSBuZXcgTGlua2VkSGFzaE1hcDw+KFNUUkVBTV9DT01QT05FTlRTLnNpemUoKSk7CisgICAgICAgIExpbmtlZEhhc2hNYXA8Q29tcG9uZW50LCBMb25nPiBjb21wb25lbnRzID0gbmV3IExpbmtlZEhhc2hNYXA8PihkZXNjcmlwdG9yLmdldEZvcm1hdCgpLnN0cmVhbWluZ0NvbXBvbmVudHMoKS5zaXplKCkpOwogCi0gICAgICAgIGZvciAoQ29tcG9uZW50IGNvbXBvbmVudCA6IFNUUkVBTV9DT01QT05FTlRTKQorICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBkZXNjcmlwdG9yLmdldEZvcm1hdCgpLnN0cmVhbWluZ0NvbXBvbmVudHMoKSkKICAgICAgICAgewotICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihjb21wb25lbnQpKTsKKyAgICAgICAgICAgIEZpbGUgZmlsZSA9IGRlc2NyaXB0b3IuZmlsZUZvcihjb21wb25lbnQpOwogICAgICAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCkBAIC0xMTQsNDUgKzExNiw1OCBAQAogICAgICAgICAgICAgICAgJ30nOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSVZlcnNpb25lZFNlcmlhbGl6ZXI8Q29tcG9uZW50TWFuaWZlc3Q+IHNlcmlhbGl6ZXIgPSBuZXcgSVZlcnNpb25lZFNlcmlhbGl6ZXI8Q29tcG9uZW50TWFuaWZlc3Q+KCkKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIElWZXJzaW9uZWRTZXJpYWxpemVyPENvbXBvbmVudE1hbmlmZXN0Pj4gc2VyaWFsaXplcnM7CisKKyAgICBzdGF0aWMKICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShDb21wb25lbnRNYW5pZmVzdCBtYW5pZmVzdCwgRGF0YU91dHB1dFBsdXMgb3V0LCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIEltbXV0YWJsZU1hcC5CdWlsZGVyPFN0cmluZywgSVZlcnNpb25lZFNlcmlhbGl6ZXI8Q29tcG9uZW50TWFuaWZlc3Q+PiBiID0gSW1tdXRhYmxlTWFwLmJ1aWxkZXIoKTsKKyAgICAgICAgZm9yIChTU1RhYmxlRm9ybWF0PD8sID8+IGZvcm1hdCA6IERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU1RhYmxlRm9ybWF0cygpLnZhbHVlcygpKQogICAgICAgICB7Ci0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQobWFuaWZlc3QuY29tcG9uZW50cy5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8Q29tcG9uZW50LCBMb25nPiBlbnRyeSA6IG1hbmlmZXN0LmNvbXBvbmVudHMuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIElWZXJzaW9uZWRTZXJpYWxpemVyPENvbXBvbmVudE1hbmlmZXN0PiBzZXJpYWxpemVyID0gbmV3IElWZXJzaW9uZWRTZXJpYWxpemVyPENvbXBvbmVudE1hbmlmZXN0PigpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlVVRGKGVudHJ5LmdldEtleSgpLm5hbWUpOwotICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShDb21wb25lbnRNYW5pZmVzdCBtYW5pZmVzdCwgRGF0YU91dHB1dFBsdXMgb3V0LCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihtYW5pZmVzdC5jb21wb25lbnRzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PENvbXBvbmVudCwgTG9uZz4gZW50cnkgOiBtYW5pZmVzdC5jb21wb25lbnRzLmVudHJ5U2V0KCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVURihlbnRyeS5nZXRLZXkoKS5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBDb21wb25lbnRNYW5pZmVzdCBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOworCisgICAgICAgICAgICAgICAgICAgIExpbmtlZEhhc2hNYXA8Q29tcG9uZW50LCBMb25nPiBjb21wb25lbnRzID0gbmV3IExpbmtlZEhhc2hNYXA8PihzaXplKTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudC5wYXJzZShpbi5yZWFkVVRGKCksIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxlbmd0aCA9IGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucHV0KGNvbXBvbmVudCwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50TWFuaWZlc3QoY29tcG9uZW50cyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIGxvbmcgc2VyaWFsaXplZFNpemUoQ29tcG9uZW50TWFuaWZlc3QgbWFuaWZlc3QsIGludCB2ZXJzaW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBzaXplID0gVHlwZVNpemVzLnNpemVvZlVuc2lnbmVkVkludChtYW5pZmVzdC5jb21wb25lbnRzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PENvbXBvbmVudCwgTG9uZz4gZW50cnkgOiBtYW5pZmVzdC5jb21wb25lbnRzLmVudHJ5U2V0KCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gVHlwZVNpemVzLnNpemVvZihlbnRyeS5nZXRLZXkoKS5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gVHlwZVNpemVzLnNpemVvZlVuc2lnbmVkVkludChlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBiLnB1dChmb3JtYXQubmFtZSgpLCBzZXJpYWxpemVyKTsKICAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb21wb25lbnRNYW5pZmVzdCBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBzaXplID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOwotCi0gICAgICAgICAgICBMaW5rZWRIYXNoTWFwPENvbXBvbmVudCwgTG9uZz4gY29tcG9uZW50cyA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oc2l6ZSk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnQucGFyc2UoaW4ucmVhZFVURigpKTsKLSAgICAgICAgICAgICAgICBsb25nIGxlbmd0aCA9IGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKLSAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1dChjb21wb25lbnQsIGxlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50TWFuaWZlc3QoY29tcG9uZW50cyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBzZXJpYWxpemVkU2l6ZShDb21wb25lbnRNYW5pZmVzdCBtYW5pZmVzdCwgaW50IHZlcnNpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvbmcgc2l6ZSA9IFR5cGVTaXplcy5zaXplb2ZVbnNpZ25lZFZJbnQobWFuaWZlc3QuY29tcG9uZW50cy5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8Q29tcG9uZW50LCBMb25nPiBlbnRyeSA6IG1hbmlmZXN0LmNvbXBvbmVudHMuZW50cnlTZXQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzaXplICs9IFR5cGVTaXplcy5zaXplb2YoZW50cnkuZ2V0S2V5KCkubmFtZSk7Ci0gICAgICAgICAgICAgICAgc2l6ZSArPSBUeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50KGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgICAgIH0KLSAgICB9OworICAgICAgICBzZXJpYWxpemVycyA9IGIuYnVpbGQoKTsKKyAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgSXRlcmF0b3I8Q29tcG9uZW50PiBpdGVyYXRvcigpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmFuc2Zvcm0vQmFzZVBhcnRpdGlvbnMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyYW5zZm9ybS9CYXNlUGFydGl0aW9ucy5qYXZhCmluZGV4IDQ2NGFlNmYuLjc5ZTg5NTIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyYW5zZm9ybS9CYXNlUGFydGl0aW9ucy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyYW5zZm9ybS9CYXNlUGFydGl0aW9ucy5qYXZhCkBAIC0yMCw4ICsyMCw2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJhbnNmb3JtOwogCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5CYXNlUGFydGl0aW9uSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5CYXNlUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKQEAgLTExMiw3ICsxMTAsNyBAQAogICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChuZXh0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgVGhyb3dhYmxlcy5jbG9zZSh0LCBDb2xsZWN0aW9ucy5zaW5nbGV0b24obmV4dCkpOworICAgICAgICAgICAgICAgIFRocm93YWJsZXMuY2xvc2UodCwgbmV4dCk7CiAgICAgICAgICAgICB0aHJvdyB0OwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJhbnNmb3JtL1JUQm91bmRWYWxpZGF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyYW5zZm9ybS9SVEJvdW5kVmFsaWRhdG9yLmphdmEKaW5kZXggZWIzN2Y0Yi4uZTE5N2NlMiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJhbnNmb3JtL1JUQm91bmRWYWxpZGF0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmFuc2Zvcm0vUlRCb3VuZFZhbGlkYXRvci5qYXZhCkBAIC0xNywxMSArMTcsMTIgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmFuc2Zvcm07CiAKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKKwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlbGV0aW9uVGltZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJhbmdlVG9tYnN0b25lTWFya2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogCiAvKioKICAqIEEgdmFsaWRhdGluZyB0cmFuc2Zvcm1hdGlvbiB0aGF0IHNhbml0eS1jaGVja3MgdGhlIHNlcXVlbmNlIG9mIFJUIGJvdW5kcyBhbmQgYm91bmRhcmllcyBpbiBldmVyeSBwYXJ0aXRpb24uCkBAIC01MSwyOSArNTIsMjcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHZhbGlkYXRlKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBwYXJ0aXRpb24sIFN0YWdlIHN0YWdlLCBib29sZWFuIGVuZm9yY2VJc0Nsb3NlZCkKICAgICB7Ci0gICAgICAgIHJldHVybiBUcmFuc2Zvcm1hdGlvbi5hcHBseShwYXJ0aXRpb24sIG5ldyBSb3dzVHJhbnNmb3JtYXRpb24oc3RhZ2UsIHBhcnRpdGlvbi5tZXRhZGF0YSgpLCBwYXJ0aXRpb24uaXNSZXZlcnNlT3JkZXIoKSwgZW5mb3JjZUlzQ2xvc2VkKSk7CisgICAgICAgIHJldHVybiBUcmFuc2Zvcm1hdGlvbi5hcHBseShwYXJ0aXRpb24sIG5ldyBSb3dzVHJhbnNmb3JtYXRpb24oc3RhZ2UsIHBhcnRpdGlvbiwgZW5mb3JjZUlzQ2xvc2VkKSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBhcHBseVRvUGFydGl0aW9uKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBwYXJ0aXRpb24pCiAgICAgewotICAgICAgICByZXR1cm4gVHJhbnNmb3JtYXRpb24uYXBwbHkocGFydGl0aW9uLCBuZXcgUm93c1RyYW5zZm9ybWF0aW9uKHN0YWdlLCBwYXJ0aXRpb24ubWV0YWRhdGEoKSwgcGFydGl0aW9uLmlzUmV2ZXJzZU9yZGVyKCksIGVuZm9yY2VJc0Nsb3NlZCkpOworICAgICAgICByZXR1cm4gVHJhbnNmb3JtYXRpb24uYXBwbHkocGFydGl0aW9uLCBuZXcgUm93c1RyYW5zZm9ybWF0aW9uKHN0YWdlLCBwYXJ0aXRpb24sIGVuZm9yY2VJc0Nsb3NlZCkpOwogICAgIH0KIAogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGNsYXNzIFJvd3NUcmFuc2Zvcm1hdGlvbiBleHRlbmRzIFRyYW5zZm9ybWF0aW9uCiAgICAgewogICAgICAgICBwcml2YXRlIGZpbmFsIFN0YWdlIHN0YWdlOwotICAgICAgICBwcml2YXRlIGZpbmFsIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGE7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc1JldmVyc2VPcmRlcjsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGVuZm9yY2VJc0Nsb3NlZDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBVbmZpbHRlcmVkUm93SXRlcmF0b3IgcGFydGl0aW9uOwogCiAgICAgICAgIHByaXZhdGUgRGVsZXRpb25UaW1lIG9wZW5NYXJrZXJEZWxldGlvblRpbWU7CiAKLSAgICAgICAgcHJpdmF0ZSBSb3dzVHJhbnNmb3JtYXRpb24oU3RhZ2Ugc3RhZ2UsIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsIGJvb2xlYW4gaXNSZXZlcnNlT3JkZXIsIGJvb2xlYW4gZW5mb3JjZUlzQ2xvc2VkKQorICAgICAgICBwcml2YXRlIFJvd3NUcmFuc2Zvcm1hdGlvbihTdGFnZSBzdGFnZSwgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHBhcnRpdGlvbiwgYm9vbGVhbiBlbmZvcmNlSXNDbG9zZWQpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXMuc3RhZ2UgPSBzdGFnZTsKLSAgICAgICAgICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgICAgIHRoaXMuaXNSZXZlcnNlT3JkZXIgPSBpc1JldmVyc2VPcmRlcjsKKyAgICAgICAgICAgIHRoaXMucGFydGl0aW9uID0gcGFydGl0aW9uOwogICAgICAgICAgICAgdGhpcy5lbmZvcmNlSXNDbG9zZWQgPSBlbmZvcmNlSXNDbG9zZWQ7CiAgICAgICAgIH0KIApAQCAtODMsMjUgKzgyLDI1IEBACiAgICAgICAgICAgICBpZiAobnVsbCA9PSBvcGVuTWFya2VyRGVsZXRpb25UaW1lKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBvcGVuIFJUIGluIHRoZSBzdHJlYW0gLSB3ZSBhcmUgZXhwZWN0aW5nIGEgKl9TVEFSVF9CT1VORAotICAgICAgICAgICAgICAgIGlmIChtYXJrZXIuaXNDbG9zZShpc1JldmVyc2VPcmRlcikpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IGlzZSgidW5leHBlY3RlZCBlbmQgYm91bmQgb3IgYm91bmRhcnkgIiArIG1hcmtlci50b1N0cmluZyhtZXRhZGF0YSkpOworICAgICAgICAgICAgICAgIGlmIChtYXJrZXIuaXNDbG9zZShwYXJ0aXRpb24uaXNSZXZlcnNlT3JkZXIoKSkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IGlzZSgidW5leHBlY3RlZCBlbmQgYm91bmQgb3IgYm91bmRhcnkgIiArIG1hcmtlci50b1N0cmluZyhwYXJ0aXRpb24ubWV0YWRhdGEoKSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGFuIG9wZW4gUlQgaW4gdGhlIHN0cmVhbSAtIHdlIGFyZSBleHBlY3RpbmcgYSAqX0JPVU5EQVJZIG9yIGFuICpfRU5EX0JPVU5ECi0gICAgICAgICAgICAgICAgaWYgKCFtYXJrZXIuaXNDbG9zZShpc1JldmVyc2VPcmRlcikpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IGlzZSgic3RhcnQgYm91bmQgZm9sbG93ZWQgYnkgYW5vdGhlciBzdGFydCBib3VuZCAiICsgbWFya2VyLnRvU3RyaW5nKG1ldGFkYXRhKSk7CisgICAgICAgICAgICAgICAgaWYgKCFtYXJrZXIuaXNDbG9zZShwYXJ0aXRpb24uaXNSZXZlcnNlT3JkZXIoKSkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IGlzZSgic3RhcnQgYm91bmQgZm9sbG93ZWQgYnkgYW5vdGhlciBzdGFydCBib3VuZCAiICsgbWFya2VyLnRvU3RyaW5nKHBhcnRpdGlvbi5tZXRhZGF0YSgpKSk7CiAKICAgICAgICAgICAgICAgICAvLyBkZWxldGlvbiB0aW1lcyBvZiBvcGVuL2Nsb3NlIG1hcmtlcnMgbXVzdCBtYXRjaAotICAgICAgICAgICAgICAgIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUgPSBtYXJrZXIuY2xvc2VEZWxldGlvblRpbWUoaXNSZXZlcnNlT3JkZXIpOworICAgICAgICAgICAgICAgIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUgPSBtYXJrZXIuY2xvc2VEZWxldGlvblRpbWUocGFydGl0aW9uLmlzUmV2ZXJzZU9yZGVyKCkpOwogICAgICAgICAgICAgICAgIGlmICghZGVsZXRpb25UaW1lLmVxdWFscyhvcGVuTWFya2VyRGVsZXRpb25UaW1lKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgaXNlKCJvcGVuIG1hcmtlciBhbmQgY2xvc2UgbWFya2VyIGhhdmUgZGlmZmVyZW50IGRlbGV0aW9uIHRpbWVzIik7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGlzZSgib3BlbiBtYXJrZXIgYW5kIGNsb3NlIG1hcmtlciBoYXZlIGRpZmZlcmVudCBkZWxldGlvbiB0aW1lcywgY2xvc2U9IiArIGRlbGV0aW9uVGltZSk7CiAKICAgICAgICAgICAgICAgICBvcGVuTWFya2VyRGVsZXRpb25UaW1lID0gbnVsbDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG1hcmtlci5pc09wZW4oaXNSZXZlcnNlT3JkZXIpKQotICAgICAgICAgICAgICAgIG9wZW5NYXJrZXJEZWxldGlvblRpbWUgPSBtYXJrZXIub3BlbkRlbGV0aW9uVGltZShpc1JldmVyc2VPcmRlcik7CisgICAgICAgICAgICBpZiAobWFya2VyLmlzT3BlbihwYXJ0aXRpb24uaXNSZXZlcnNlT3JkZXIoKSkpCisgICAgICAgICAgICAgICAgb3Blbk1hcmtlckRlbGV0aW9uVGltZSA9IG1hcmtlci5vcGVuRGVsZXRpb25UaW1lKHBhcnRpdGlvbi5pc1JldmVyc2VPcmRlcigpKTsKIAogICAgICAgICAgICAgcmV0dXJuIG1hcmtlcjsKICAgICAgICAgfQpAQCAtMTE1LDkgKzExNCwxNyBAQAogCiAgICAgICAgIHByaXZhdGUgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzZShTdHJpbmcgd2h5KQogICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9Ci0gICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiJXMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGZvciAlcyBoYXMgYW4gaWxsZWdhbCBSVCBib3VuZHMgc2VxdWVuY2U6ICVzIiwgc3RhZ2UsIG1ldGFkYXRhLCB3aHkpOwotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24obWVzc2FnZSh3aHkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2UoU3RyaW5nIHdoeSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBmb3IgJXMgKGtleTogJXMgb21kdDogWyVzXSkgaGFzIGFuIGlsbGVnYWwgUlQgYm91bmRzIHNlcXVlbmNlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbi5tZXRhZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uLm1ldGFkYXRhKCkucGFydGl0aW9uS2V5VHlwZS5nZXRTdHJpbmcocGFydGl0aW9uLnBhcnRpdGlvbktleSgpLmdldEtleSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdHMudG9TdHJpbmcob3Blbk1hcmtlckRlbGV0aW9uVGltZSwgIm5vdCBwcmVzZW50IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aHkpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvQ29sbGVjdGlvbk1lcmdlVHJpZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvQ29sbGVjdGlvbk1lcmdlVHJpZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMzY5MTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Db2xsZWN0aW9uTWVyZ2VUcmllLmphdmEKQEAgLTAsMCArMSwzNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworCisvKioKKyAqIEEgbWVyZ2VkIHZpZXcgb2YgbXVsdGlwbGUgdHJpZXMuCisgKgorICogVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgd2Fsa2luZyB0aGUgY3Vyc29ycyBpbiBwYXJhbGxlbDsgdGhlIG1lcmdlZCBjdXJzb3IgdGFrZXMgdGhlIHBvc2l0aW9uIGFuZCBmZWF0dXJlcyBvZiB0aGUKKyAqIHNtYWxsZXN0IGFuZCBhZHZhbmNlcyB3aXRoIGl0OyB3aGVuIG11bHRpcGxlIGN1cnNvcnMgYXJlIGVxdWFsLCBhbGwgb2YgdGhlbSBhcmUgYWR2YW5jZWQuIFRoZSBvcmRlcmVkIHZpZXcgb2YgdGhlCisgKiBjdXJzb3JzIGlzIG1haW50YWluZWQgdXNpbmcgYSBjdXN0b20gYmluYXJ5IG1pbi1oZWFwLCBidWlsdCBmb3IgZWZmaWNpZW50bHkgcmVmb3JtaW5nIHRoZSBoZWFwIHdoZW4gdGhlIHRvcCBlbGVtZW50cworICogYXJlIGFkdmFuY2VkIChzZWUge0BsaW5rIENvbGxlY3Rpb25NZXJnZUN1cnNvcn0pLgorICoKKyAqIENydWNpYWwgZm9yIHRoZSBlZmZpY2llbmN5IG9mIHRoaXMgaXMgdGhlIGZhY3QgdGhhdCB3aGVuIHRoZXkgYXJlIGFkdmFuY2VkIGxpa2UgdGhpcywgd2UgY2FuIGNvbXBhcmUgY3Vyc29ycycKKyAqIHBvc2l0aW9ucyBieSB0aGVpciBkZXB0aCBkZXNjZW5kaW5nIGFuZCB0aGVuIGluY29taW5nVHJhbnNpdGlvbiBhc2NlbmRpbmcuCisgKgorICogU2VlIFRyaWUubWQgZm9yIGZ1cnRoZXIgZGV0YWlscy4KKyAqLworY2xhc3MgQ29sbGVjdGlvbk1lcmdlVHJpZTxUPiBleHRlbmRzIFRyaWU8VD4KK3sKKyAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb25NZXJnZVJlc29sdmVyPFQ+IHJlc29sdmVyOyAgLy8gb25seSBjYWxsZWQgb24gbW9yZSB0aGFuIG9uZSBpbnB1dAorICAgIHByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUcmllPFQ+PiBpbnB1dHM7CisKKyAgICBDb2xsZWN0aW9uTWVyZ2VUcmllKENvbGxlY3Rpb248PyBleHRlbmRzIFRyaWU8VD4+IGlucHV0cywgQ29sbGVjdGlvbk1lcmdlUmVzb2x2ZXI8VD4gcmVzb2x2ZXIpCisgICAgeworICAgICAgICB0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXI7CisgICAgICAgIHRoaXMuaW5wdXRzID0gaW5wdXRzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBDdXJzb3I8VD4gY3Vyc29yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbk1lcmdlQ3Vyc29yPD4ocmVzb2x2ZXIsIGlucHV0cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZSB0aGUgcG9zaXRpb25zIG9mIHR3byBjdXJzb3JzLiBPbmUgaXMgYmVmb3JlIHRoZSBvdGhlciB3aGVuCisgICAgICogLSBpdHMgZGVwdGggaXMgZ3JlYXRlciwgb3IKKyAgICAgKiAtIGl0cyBkZXB0aCBpcyBlcXVhbCwgYW5kIHRoZSBpbmNvbWluZyB0cmFuc2l0aW9uIGlzIHNtYWxsZXIuCisgICAgICovCisgICAgc3RhdGljIDxUPiBib29sZWFuIGdyZWF0ZXJDdXJzb3IoQ3Vyc29yPFQ+IGMxLCBDdXJzb3I8VD4gYzIpCisgICAgeworICAgICAgICBpbnQgYzFkZXB0aCA9IGMxLmRlcHRoKCk7CisgICAgICAgIGludCBjMmRlcHRoID0gYzIuZGVwdGgoKTsKKyAgICAgICAgaWYgKGMxZGVwdGggIT0gYzJkZXB0aCkKKyAgICAgICAgICAgIHJldHVybiBjMWRlcHRoIDwgYzJkZXB0aDsKKyAgICAgICAgcmV0dXJuIGMxLmluY29taW5nVHJhbnNpdGlvbigpID4gYzIuaW5jb21pbmdUcmFuc2l0aW9uKCk7CisgICAgfQorCisgICAgc3RhdGljIDxUPiBib29sZWFuIGVxdWFsQ3Vyc29yKEN1cnNvcjxUPiBjMSwgQ3Vyc29yPFQ+IGMyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGMxLmRlcHRoKCkgPT0gYzIuZGVwdGgoKSAmJiBjMS5pbmNvbWluZ1RyYW5zaXRpb24oKSA9PSBjMi5pbmNvbWluZ1RyYW5zaXRpb24oKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRoZSBtZXJnZSBjdXJzb3IgaXMgYSB2YXJpYXRpb24gb2YgdGhlIGlkZWEgb2YgYSBtZXJnZSBpdGVyYXRvciB3aXRoIG9uZSBrZXkgb2JzZXJ2YXRpb246IGJlY2F1c2Ugd2UgYWR2YW5jZQorICAgICAqIHRoZSBzb3VyY2UgaXRlcmF0b3JzIHRvZ2V0aGVyLCB3ZSBjYW4gY29tcGFyZSB0aGVtIGp1c3QgYnkgZGVwdGggYW5kIGluY29taW5nIHRyYW5zaXRpb24uCisgICAgICoKKyAgICAgKiBUaGUgbW9zdCBzdHJhaWdodGZvcndhcmQgd2F5IHRvIGltcGxlbWVudCBtZXJnaW5nIG9mIGl0ZXJhdG9ycyBpcyB0byB1c2UgYSB7QGNvZGUgUHJpb3JpdHlRdWV1ZX0sCisgICAgICoge0Bjb2RlIHBvbGx9IGl0IHRvIGZpbmQgdGhlIG5leHQgaXRlbSB0byBjb25zdW1lLCB0aGVuIHtAY29kZSBhZGR9IHRoZSBpdGVyYXRvciBiYWNrIGFmdGVyIGFkdmFuY2luZy4KKyAgICAgKiBUaGlzIGlzIG5vdCB2ZXJ5IGVmZmljaWVudCBhcyB7QGNvZGUgcG9sbH0gYW5kIHtAY29kZSBhZGR9IGluIGFsbCBjYXNlcyByZXF1aXJlIGF0IGxlYXN0CisgICAgICoge0Bjb2RlIGxvZyhzaXplKX0gY29tcGFyaXNvbnMgYW5kIHN3YXBzICh1c3VhbGx5IG1vcmUgdGhhbiB7QGNvZGUgMipsb2coc2l6ZSl9KSBwZXIgY29uc3VtZWQgaXRlbSwgZXZlbgorICAgICAqIGlmIHRoZSBpbnB1dCBpcyBzdWl0YWJsZSBmb3IgZmFzdCBpdGVyYXRpb24uCisgICAgICoKKyAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gYmVsb3cgbWFrZXMgdXNlIG9mIHRoZSBmYWN0IHRoYXQgcmVwbGFjaW5nIHRoZSB0b3AgZWxlbWVudCBpbiBhIGJpbmFyeSBoZWFwIGNhbiBiZQorICAgICAqIGRvbmUgbXVjaCBtb3JlIGVmZmljaWVudGx5IHRoYW4gc2VwYXJhdGVseSByZW1vdmluZyBpdCBhbmQgcGxhY2luZyBpdCBiYWNrLCBlc3BlY2lhbGx5IGluIHRoZSBjYXNlcyB3aGVyZQorICAgICAqIHRoZSB0b3AgaXRlcmF0b3IgaXMgdG8gYmUgdXNlZCBhZ2FpbiB2ZXJ5IHNvb24gKGUuZy4gd2hlbiB0aGVyZSBhcmUgbGFyZ2Ugc2VjdGlvbnMgb2YgdGhlIG91dHB1dCB3aGVyZQorICAgICAqIG9ubHkgYSBsaW1pdGVkIG51bWJlciBvZiBpbnB1dCBpdGVyYXRvcnMgb3ZlcmxhcCwgd2hpY2ggaXMgbm9ybWFsbHkgdGhlIGNhc2UgaW4gbWFueSBwcmFjdGljYWxseSB1c2VmdWwKKyAgICAgKiBzaXR1YXRpb25zLCBlLmcuIGxldmVsbGVkIGNvbXBhY3Rpb24pLgorICAgICAqCisgICAgICogVGhlIGltcGxlbWVudGF0aW9uIGJ1aWxkcyBhbmQgbWFpbnRhaW5zIGEgYmluYXJ5IGhlYXAgb2Ygc291cmNlcyAoc3RvcmVkIGluIGFuIGFycmF5KSwgd2hlcmUgd2UgZG8gbm90CisgICAgICogYWRkIGl0ZW1zIGFmdGVyIHRoZSBpbml0aWFsIGNvbnN0cnVjdGlvbi4gSW5zdGVhZCB3ZSBhZHZhbmNlIHRoZSBzbWFsbGVzdCBlbGVtZW50ICh3aGljaCBpcyBhdCB0aGUgdG9wCisgICAgICogb2YgdGhlIGhlYXApIGFuZCBwdXNoIGl0IGRvd24gdG8gZmluZCBpdHMgcGxhY2UgZm9yIGl0cyBuZXcgcG9zaXRpb24uIFNob3VsZCB0aGlzIHNvdXJjZSBiZSBleGhhdXN0ZWQsCisgICAgICogd2Ugc3dhcCBpdCB3aXRoIHRoZSBsYXN0IHNvdXJjZSBpbiB0aGUgaGVhcCBhbmQgcHJvY2VlZCBieSBwdXNoaW5nIHRoYXQgZG93biBpbiB0aGUgaGVhcC4KKyAgICAgKgorICAgICAqIEluIHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgbXVsdGlwbGUgc291cmNlcyB3aXRoIG1hdGNoaW5nIHBvc2l0aW9ucywgdGhlIG1lcmdpbmcgYWxnb3JpdGhtCisgICAgICogbXVzdCBiZSBhYmxlIHRvIG1lcmdlIGFsbCBlcXVhbCB2YWx1ZXMuIFRvIGFjaGlldmUgdGhpcyB7QGNvZGUgY29udGVudH0gd2Fsa3MgdGhlIGhlYXAgdG8KKyAgICAgKiBmaW5kIGFsbCBlcXVhbCBjdXJzb3JzIHdpdGhvdXQgYWR2YW5jaW5nIHRoZW0sIGFuZCBzZXBhcmF0ZWx5IHtAY29kZSBhZHZhbmNlfSBhZHZhbmNlcworICAgICAqIGFsbCBlcXVhbCBzb3VyY2VzIGFuZCByZXN0b3JlcyB0aGUgaGVhcCBzdHJ1Y3R1cmUuCisgICAgICoKKyAgICAgKiBUaGUgbGF0dGVyIGlzIGRvbmUgZXF1aXZhbGVudGx5IHRvIHRoZSBwcm9jZXNzIG9mIGluaXRpYWwgY29uc3RydWN0aW9uIG9mIGEgbWluLWhlYXAgdXNpbmcgYmFjay10by1mcm9udAorICAgICAqIGhlYXBpZmljYXRpb24gYXMgZG9uZSBpbiB0aGUgY2xhc3NpYyBoZWFwc29ydCBhbGdvcml0aG0uIEl0IG9ubHkgbmVlZHMgdG8gaGVhcGlmeSBzdWJoZWFwcyB3aG9zZSB0b3AgaXRlbQorICAgICAqIGlzIGFkdmFuY2VkIChpLmUuIG9uZSB3aG9zZSBwb3NpdGlvbiBtYXRjaGVzIHRoZSBjdXJyZW50KSwgYW5kIHdlIGNhbiBkbyB0aGF0IHJlY3Vyc2l2ZWx5IGZyb20KKyAgICAgKiBib3R0b20gdG8gdG9wLiBTaG91bGQgYSBzb3VyY2UgYmUgZXhoYXVzdGVkIHdoZW4gYWR2YW5jaW5nLCBpdCBjYW4gYmUgdGhyb3duIGF3YXkgYnkgc3dhcHBpbmcgaW4gdGhlIGxhc3QKKyAgICAgKiBzb3VyY2UgaW4gdGhlIGhlYXAgKG5vdGU6IHdlIG11c3QgYmUgY2FyZWZ1bCB0byBhZHZhbmNlIHRoYXQgc291cmNlIHRvbyBpZiByZXF1aXJlZCkuCisgICAgICoKKyAgICAgKiBUbyBtYWtlIGl0IGVhc2llciB0byBhZHZhbmNlIGVmZmljaWVudHkgaW4gc2luZ2xlLXNvdXJjZWQgYnJhbmNoZXMgb2YgdHJpZXMsIHdlIGV4dHJhY3QgdGhlIGN1cnJlbnQgc21hbGxlc3QKKyAgICAgKiBjdXJzb3IgKHRoZSBoZWFkKSBzZXBhcmF0ZWx5LCBhbmQgc3RhcnQgYW55IGFkdmFuY2Ugd2l0aCBjb21wYXJpbmcgdGhhdCB0byB0aGUgaGVhcCdzIGZpcnN0LiBXaGVuIHRoZSBzbWFsbGVzdAorICAgICAqIGN1cnNvciByZW1haW5zIHRoZSBzYW1lIChlLmcuIGluIGJyYW5jaGVzIGNvbWluZyBmcm9tIGEgc2luZ2xlIHNvdXJjZSkgdGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBhZHZhbmNlIHdpdGgKKyAgICAgKiBqdXN0IG9uZSBjb21wYXJpc29uIGluc3RlYWQgb2YgdHdvIGF0IHRoZSBleHBlbnNlIG9mIGluY3JlYXNpbmcgdGhlIG51bWJlciBieSBvbmUgaW4gdGhlIGdlbmVyYWwgY2FzZS4KKyAgICAgKgorICAgICAqIE5vdGU6IFRoaXMgaXMgYSBzaW1wbGlmaWNhdGlvbiBvZiB0aGUgTWVyZ2VJdGVyYXRvciBjb2RlIGZyb20gQ0FTU0FORFJBLTg5MTUsIHdpdGhvdXQgdGhlIGxlYWRpbmcgb3JkZXJlZAorICAgICAqIHNlY3Rpb24gYW5kIGVxdWFsUGFyZW50IGZsYWcgc2luY2UgY29tcGFyaXNvbnMgb2YgY3Vyc29yIHBvc2l0aW9ucyBhcmUgY2hlYXAuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIENvbGxlY3Rpb25NZXJnZUN1cnNvcjxUPiBpbXBsZW1lbnRzIEN1cnNvcjxUPgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uTWVyZ2VSZXNvbHZlcjxUPiByZXNvbHZlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHNtYWxsZXN0IGN1cnNvciwgdHJhY2tlZCBzZXBhcmF0ZWx5IHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgaW4gc2luZ2xlLXNvdXJjZSBzZWN0aW9ucyBvZiB0aGUgdHJpZS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgQ3Vyc29yPFQ+IGhlYWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJpbmFyeSBoZWFwIG9mIHRoZSByZW1haW5pbmcgY3Vyc29ycy4gVGhlIHNtYWxsZXN0IGVsZW1lbnQgaXMgYXQgcG9zaXRpb24gMC4KKyAgICAgICAgICogRXZlcnkgZWxlbWVudCBpIGlzIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byBpdHMgdHdvIGNoaWxkcmVuLCBpLmUuCisgICAgICAgICAqICAgICBoZWFwW2ldIDw9IGhlYXBbaSoyICsgMV0gJiYgaGVhcFtpXSA8PSBoZWFwW2kqMiArIDJdCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIEN1cnNvcjxUPltdIGhlYXA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgbGlzdCB1c2VkIHRvIGNvbGxlY3QgY29udGVudHMgZHVyaW5nIGNvbnRlbnQoKSBjYWxscy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxUPiBjb250ZW50czsKKworICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbk1lcmdlQ3Vyc29yKENvbGxlY3Rpb25NZXJnZVJlc29sdmVyPFQ+IHJlc29sdmVyLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUcmllPFQ+PiBpbnB1dHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjsKKyAgICAgICAgICAgIGludCBjb3VudCA9IGlucHV0cy5zaXplKCk7CisgICAgICAgICAgICAvLyBHZXQgY3Vyc29ycyBmb3IgYWxsIGlucHV0cy4gUHV0IG9uZSBvZiB0aGVtIGluIGhlYWQgYW5kIHRoZSByZXN0IGluIHRoZSBoZWFwLgorICAgICAgICAgICAgaGVhcCA9IG5ldyBDdXJzb3JbY291bnQgLSAxXTsKKyAgICAgICAgICAgIGNvbnRlbnRzID0gbmV3IEFycmF5TGlzdDw+KGNvdW50KTsKKyAgICAgICAgICAgIGludCBpID0gLTE7CisgICAgICAgICAgICBmb3IgKFRyaWU8VD4gdHJpZSA6IGlucHV0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdXJzb3I8VD4gY3Vyc29yID0gdHJpZS5jdXJzb3IoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQgY3Vyc29yLmRlcHRoKCkgPT0gMDsKKyAgICAgICAgICAgICAgICBpZiAoaSA+PSAwKQorICAgICAgICAgICAgICAgICAgICBoZWFwW2ldID0gY3Vyc29yOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaGVhZCA9IGN1cnNvcjsKKyAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUaGUgY3Vyc29ycyBhcmUgYWxsIGN1cnJlbnRseSBwb3NpdGlvbmVkIG9uIHRoZSByb290IGFuZCB0aHVzIGluIHZhbGlkIGhlYXAgb3JkZXIuCisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSW50ZXJmYWNlIGZvciBpbnRlcm5hbCBvcGVyYXRpb25zIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gdGhlIGVxdWFsIHRvcCBlbGVtZW50cyBvZiB0aGUgaGVhcC4KKyAgICAgICAgICovCisgICAgICAgIGludGVyZmFjZSBIZWFwT3A8VD4KKyAgICAgICAgeworICAgICAgICAgICAgdm9pZCBhcHBseShDb2xsZWN0aW9uTWVyZ2VDdXJzb3I8VD4gc2VsZiwgQ3Vyc29yPFQ+IGN1cnNvciwgaW50IGluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBcHBseSBhIG5vbi1pbnRlcmZlcmluZyBvcGVyYXRpb24sIGkuZS4gb25lIHRoYXQgZG9lcyBub3QgY2hhbmdlIHRoZSBjdXJzb3Igc3RhdGUsIHRvIGFsbCBpbnB1dHMgaW4gdGhlIGhlYXAKKyAgICAgICAgICogdGhhdCBhcmUgb24gZXF1YWwgcG9zaXRpb24gdG8gdGhlIGhlYWQuCisgICAgICAgICAqIEZvciBpbnRlcmZlcmluZyBvcGVyYXRpb25zIGxpa2UgYWR2YW5jaW5nIHRoZSBjdXJzb3JzLCB1c2Uge0BsaW5rICNhZHZhbmNlRXF1YWxBbmRSZXN0b3JlSGVhcChBZHZhbmNpbmdIZWFwT3ApfS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBhcHBseVRvRXF1YWxPbkhlYXAoSGVhcE9wPFQ+IGFjdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgYXBwbHlUb0VxdWFsRWxlbWVudHNJbkhlYXAoYWN0aW9uLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnRlcmZhY2UgZm9yIGludGVybmFsIGFkdmFuY2luZyBvcGVyYXRpb25zIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gdGhlIGhlYXAgY3Vyc29ycy4gVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMKKyAgICAgICAgICogdGhlIGNvZGUgdG8gcmVzdG9yZSB0aGUgaGVhcCBzdHJ1Y3R1cmUgYWZ0ZXIgYWR2YW5jaW5nIHRoZSBjdXJzb3JzLgorICAgICAgICAgKi8KKyAgICAgICAgaW50ZXJmYWNlIEFkdmFuY2luZ0hlYXBPcDxUPiBleHRlbmRzIEhlYXBPcDxUPgorICAgICAgICB7CisgICAgICAgICAgICB2b2lkIGFwcGx5KEN1cnNvcjxUPiBjdXJzb3IpOworCisgICAgICAgICAgICBkZWZhdWx0IHZvaWQgYXBwbHkoQ29sbGVjdGlvbk1lcmdlQ3Vyc29yPFQ+IHNlbGYsIEN1cnNvcjxUPiBjdXJzb3IsIGludCBpbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBBcHBseSB0aGUgb3BlcmF0aW9uLCB3aGljaCBzaG91bGQgYWR2YW5jZSB0aGUgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQuCisgICAgICAgICAgICAgICAgYXBwbHkoY3Vyc29yKTsKKworICAgICAgICAgICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiB0aGUgYmFjayBwYXRoIG9mIHRoZSByZWN1cnNpb24uIEF0IHRoaXMgcG9pbnQgdGhlIGhlYXBzIGF0IGJvdGggY2hpbGRyZW4gYXJlCisgICAgICAgICAgICAgICAgLy8gYWR2YW5jZWQgYW5kIHdlbGwtZm9ybWVkLgorICAgICAgICAgICAgICAgIC8vIFBsYWNlIGN1cnJlbnQgbm9kZSBpbiBpdHMgcHJvcGVyIHBvc2l0aW9uLgorICAgICAgICAgICAgICAgIHNlbGYuaGVhcGlmeURvd24oY3Vyc29yLCBpbmRleCk7CisgICAgICAgICAgICAgICAgLy8gVGhlIGhlYXAgcm9vdGVkIGF0IGluZGV4IGlzIG5vdyBhZHZhbmNlZCBhbmQgd2VsbC1mb3JtZWQuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZHZhbmNlIHRoZSBzdGF0ZSBvZiBhbGwgaW5wdXRzIGluIHRoZSBoZWFwIHRoYXQgYXJlIG9uIGVxdWFsIHBvc2l0aW9uIGFzIHRoZSBoZWFkIGFuZCByZXN0b3JlIHRoZSBoZWFwCisgICAgICAgICAqIGludmFyaWFudC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBhZHZhbmNlRXF1YWxBbmRSZXN0b3JlSGVhcChBZHZhbmNpbmdIZWFwT3A8VD4gYWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBhcHBseVRvRXF1YWxFbGVtZW50c0luSGVhcChhY3Rpb24sIDApOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFwcGx5IGFuIG9wZXJhdGlvbiB0byBhbGwgZWxlbWVudHMgb24gdGhlIGhlYXAgdGhhdCBhcmUgZXF1YWwgdG8gdGhlIGhlYWQuIERlc2NlbmRzIHJlY3Vyc2l2ZWx5IGluIHRoZSBoZWFwCisgICAgICAgICAqIHN0cnVjdHVyZSB0byBhbGwgZXF1YWwgY2hpbGRyZW4gYW5kIGFwcGxpZXMgdGhlIG9wZXJhdGlvbiBvbiB0aGUgd2F5IGJhY2suCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgb3BlcmF0aW9uIGNhbiBiZSBzb21ldGhpbmcgdGhhdCBkb2VzIG5vdCBjaGFuZ2UgdGhlIGN1cnNvciBzdGF0ZSAoc2VlIHtAbGluayAjY29udGVudH0pIG9yIGFuIG9wZXJhdGlvbgorICAgICAgICAgKiB0aGF0IGFkdmFuY2VzIHRoZSBjdXJzb3IgdG8gYSBuZXcgc3RhdGUsIHdyYXBwZWQgaW4gYSB7QGxpbmsgQWR2YW5jaW5nSGVhcE9wfSAoe0BsaW5rICNhZHZhbmNlfSBvcgorICAgICAgICAgKiB7QGxpbmsgI3NraXBDaGlsZHJlbn0pLiBUaGUgbGF0dGVyIGludGVyZmFjZSB0YWtlcyBjYXJlIG9mIHB1c2hpbmcgZWxlbWVudHMgZG93biBpbiB0aGUgaGVhcCBhZnRlciBhZHZhbmNpbmcKKyAgICAgICAgICogYW5kIHJlc3RvcmVzIHRoZSBzdWJoZWFwIHN0YXRlIG9uIHJldHVybiBmcm9tIGVhY2ggbGV2ZWwgb2YgdGhlIHJlY3Vyc2lvbi4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBhcHBseVRvRXF1YWxFbGVtZW50c0luSGVhcChIZWFwT3A8VD4gYWN0aW9uLCBpbnQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSBoZWFwLmxlbmd0aCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBDdXJzb3I8VD4gaXRlbSA9IGhlYXBbaW5kZXhdOworICAgICAgICAgICAgaWYgKCFlcXVhbEN1cnNvcihpdGVtLCBoZWFkKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIC8vIElmIHRoZSBjaGlsZHJlbiBhcmUgYXQgdGhlIHNhbWUgcG9zaXRpb24sIHRoZXkgYWxzbyBuZWVkIGFkdmFuY2luZyBhbmQgdGhlaXIgc3ViaGVhcAorICAgICAgICAgICAgLy8gaW52YXJpYW50IHRvIGJlIHJlc3RvcmVkLgorICAgICAgICAgICAgYXBwbHlUb0VxdWFsRWxlbWVudHNJbkhlYXAoYWN0aW9uLCBpbmRleCAqIDIgKyAxKTsKKyAgICAgICAgICAgIGFwcGx5VG9FcXVhbEVsZW1lbnRzSW5IZWFwKGFjdGlvbiwgaW5kZXggKiAyICsgMik7CisKKyAgICAgICAgICAgIC8vIEFwcGx5IHRoZSBhY3Rpb24uIFRoaXMgaXMgZG9uZSBvbiB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24gdG8gZ2l2ZSB0aGUgYWN0aW9uIGEgY2hhbmNlIHRvIGZvcm0gcHJvcGVyCisgICAgICAgICAgICAvLyBzdWJoZWFwcyBhbmQgY29tYmluZSB0aGVtIG9uIHByb2Nlc3NpbmcgdGhlIHBhcmVudC4KKyAgICAgICAgICAgIGFjdGlvbi5hcHBseSh0aGlzLCBpdGVtLCBpbmRleCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUHVzaCB0aGUgZ2l2ZW4gc3RhdGUgZG93biBpbiB0aGUgaGVhcCBmcm9tIHRoZSBnaXZlbiBpbmRleCB1bnRpbCBpdCBmaW5kcyBpdHMgcHJvcGVyIHBsYWNlIGFtb25nCisgICAgICAgICAqIHRoZSBzdWJoZWFwIHJvb3RlZCBhdCB0aGF0IHBvc2l0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGhlYXBpZnlEb3duKEN1cnNvcjxUPiBpdGVtLCBpbnQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBuZXh0ID0gaW5kZXggKiAyICsgMTsKKyAgICAgICAgICAgICAgICBpZiAobmV4dCA+PSBoZWFwLmxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLy8gU2VsZWN0IHRoZSBzbWFsbGVyIG9mIHRoZSB0d28gY2hpbGRyZW4gdG8gcHVzaCBkb3duIHRvLgorICAgICAgICAgICAgICAgIGlmIChuZXh0ICsgMSA8IGhlYXAubGVuZ3RoICYmIGdyZWF0ZXJDdXJzb3IoaGVhcFtuZXh0XSwgaGVhcFtuZXh0ICsgMV0pKQorICAgICAgICAgICAgICAgICAgICArK25leHQ7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNoaWxkIGlzIGdyZWF0ZXIgb3IgZXF1YWwsIHRoZSBpbnZhcmlhbnQgaGFzIGJlZW4gcmVzdG9yZWQuCisgICAgICAgICAgICAgICAgaWYgKCFncmVhdGVyQ3Vyc29yKGl0ZW0sIGhlYXBbbmV4dF0pKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBoZWFwW2luZGV4XSA9IGhlYXBbbmV4dF07CisgICAgICAgICAgICAgICAgaW5kZXggPSBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGVhcFtpbmRleF0gPSBpdGVtOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrIGlmIHRoZSBoZWFkIGlzIGdyZWF0ZXIgdGhhbiB0aGUgdG9wIGVsZW1lbnQgaW4gdGhlIGhlYXAsIGFuZCBpZiBzbywgc3dhcCB0aGVtIGFuZCBwdXNoIGRvd24gdGhlIG5ldworICAgICAgICAgKiB0b3AgdW50aWwgaXRzIHByb3BlciBwbGFjZS4KKyAgICAgICAgICogQHBhcmFtIGhlYWREZXB0aCB0aGUgZGVwdGggb2YgdGhlIGhlYWQgY3Vyc29yIChhcyByZXR1cm5lZCBieSBlLmcuIGFkdmFuY2UpLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBuZXcgaGVhZCBlbGVtZW50J3MgZGVwdGgKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgaW50IG1heWJlU3dhcEhlYWQoaW50IGhlYWREZXB0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGhlYXAwRGVwdGggPSBoZWFwWzBdLmRlcHRoKCk7CisgICAgICAgICAgICBpZiAoaGVhZERlcHRoID4gaGVhcDBEZXB0aCB8fAorICAgICAgICAgICAgICAgIChoZWFkRGVwdGggPT0gaGVhcDBEZXB0aCAmJiBoZWFkLmluY29taW5nVHJhbnNpdGlvbigpIDw9IGhlYXBbMF0uaW5jb21pbmdUcmFuc2l0aW9uKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBoZWFkRGVwdGg7ICAgLy8gaGVhZCBpcyBzdGlsbCBzbWFsbGVzdAorCisgICAgICAgICAgICAvLyBvdGhlcndpc2Ugd2UgbmVlZCB0byBzd2FwIGhlYXAgYW5kIGhlYXBbMF0KKyAgICAgICAgICAgIEN1cnNvcjxUPiBuZXdIZWFwMCA9IGhlYWQ7CisgICAgICAgICAgICBoZWFkID0gaGVhcFswXTsKKyAgICAgICAgICAgIGhlYXBpZnlEb3duKG5ld0hlYXAwLCAwKTsKKyAgICAgICAgICAgIHJldHVybiBoZWFwMERlcHRoOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgYWR2YW5jZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkdmFuY2VFcXVhbEFuZFJlc3RvcmVIZWFwKEN1cnNvcjo6YWR2YW5jZSk7CisgICAgICAgICAgICByZXR1cm4gbWF5YmVTd2FwSGVhZChoZWFkLmFkdmFuY2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBhZHZhbmNlTXVsdGlwbGUoVHJhbnNpdGlvbnNSZWNlaXZlciByZWNlaXZlcikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgcHJlc2VudCBpbiBqdXN0IG9uZSBjdXJzb3IsIHdlIGNhbiBzYWZlbHkgZGVzY2VuZCBtdWx0aXBsZSBsZXZlbHMgd2l0aGluCisgICAgICAgICAgICAvLyBpdHMgYnJhbmNoIGFzIG5vIG9uZSBvZiB0aGUgb3RoZXIgdHJpZXMgaGFzIGNvbnRlbnQgZm9yIGl0LgorICAgICAgICAgICAgaWYgKGVxdWFsQ3Vyc29yKGhlYXBbMF0sIGhlYWQpKQorICAgICAgICAgICAgICAgIHJldHVybiBhZHZhbmNlKCk7ICAgLy8gTW9yZSB0aGFuIG9uZSBzb3VyY2UgYXQgY3VycmVudCBwb3NpdGlvbiwgZG8gc2luZ2xlLXN0ZXAgYWR2YW5jZS4KKworICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGNoaWxkcmVuLCBpLmUuIHRoZSBjdXJzb3IgYXNjZW5kcywgd2UgaGF2ZSB0byBjaGVjayBpZiBpdCdzIGJlY29tZSBsYXJnZXIgdGhhbiBzb21lCisgICAgICAgICAgICAvLyBvdGhlciBjYW5kaWRhdGUuCisgICAgICAgICAgICByZXR1cm4gbWF5YmVTd2FwSGVhZChoZWFkLmFkdmFuY2VNdWx0aXBsZShyZWNlaXZlcikpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgc2tpcENoaWxkcmVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgYWR2YW5jZUVxdWFsQW5kUmVzdG9yZUhlYXAoQ3Vyc29yOjpza2lwQ2hpbGRyZW4pOworICAgICAgICAgICAgcmV0dXJuIG1heWJlU3dhcEhlYWQoaGVhZC5za2lwQ2hpbGRyZW4oKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBkZXB0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBoZWFkLmRlcHRoKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBpbmNvbWluZ1RyYW5zaXRpb24oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaGVhZC5pbmNvbWluZ1RyYW5zaXRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVCBjb250ZW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBwbHlUb0VxdWFsT25IZWFwKENvbGxlY3Rpb25NZXJnZUN1cnNvcjo6Y29sbGVjdENvbnRlbnQpOworICAgICAgICAgICAgY29sbGVjdENvbnRlbnQoaGVhZCwgLTEpOworCisgICAgICAgICAgICBUIHRvUmV0dXJuOworICAgICAgICAgICAgc3dpdGNoIChjb250ZW50cy5zaXplKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICB0b1JldHVybiA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgdG9SZXR1cm4gPSBjb250ZW50cy5nZXQoMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRvUmV0dXJuID0gcmVzb2x2ZXIucmVzb2x2ZShjb250ZW50cyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGVudHMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiB0b1JldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjb2xsZWN0Q29udGVudChDdXJzb3I8VD4gaXRlbSwgaW50IGluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBUIGl0ZW1Db250ZW50ID0gaXRlbS5jb250ZW50KCk7CisgICAgICAgICAgICBpZiAoaXRlbUNvbnRlbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250ZW50cy5hZGQoaXRlbUNvbnRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lhbCBpbnN0YW5jZSBmb3Igc291cmNlcyB0aGF0IGFyZSBndWFyYW50ZWVkIGRpc3RpbmN0LiBUaGUgbWFpbiBkaWZmZXJlbmNlIGlzIHRoYXQgd2UgY2FuIGZvcm0gdW5vcmRlcmVkCisgICAgICogdmFsdWUgbGlzdCBieSBjb25jYXRlbmF0aW5nIHNvdXJjZXMuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIERpc3RpbmN0PFQ+IGV4dGVuZHMgQ29sbGVjdGlvbk1lcmdlVHJpZTxUPgorICAgIHsKKyAgICAgICAgRGlzdGluY3QoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVHJpZTxUPj4gaW5wdXRzKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihpbnB1dHMsIHRocm93aW5nUmVzb2x2ZXIoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEl0ZXJhYmxlPFQ+IHZhbHVlc1Vub3JkZXJlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBJdGVyYWJsZXMuY29uY2F0KEl0ZXJhYmxlcy50cmFuc2Zvcm0oaW5wdXRzLCBUcmllOjp2YWx1ZXNVbm9yZGVyZWQpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5UmVhZFRyaWUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5UmVhZFRyaWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGY1OTg3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlSZWFkVHJpZS5qYXZhCkBAIC0wLDAgKzEsOTIwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZUFycmF5OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IG9yZy5hZ3JvbmEuY29uY3VycmVudC5VbnNhZmVCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKKworLyoqCisgKiBJbi1tZW1vcnkgdHJpZSBidWlsdCBmb3IgZmFzdCBtb2RpZmljYXRpb24gYW5kIHJlYWRzIGV4ZWN1dGluZyBjb25jdXJyZW50bHkgd2l0aCB3cml0ZXMgZnJvbSBhIHNpbmdsZSBtdXRhdG9yIHRocmVhZC4KKyAqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSByZWFkLW9ubHkgZnVuY3Rpb25hbGl0eSwgZXhwYW5kZWQgaW4ge0BsaW5rIEluTWVtb3J5VHJpZX0gdG8gd3JpdGVzLgorICovCitwdWJsaWMgY2xhc3MgSW5NZW1vcnlSZWFkVHJpZTxUPiBleHRlbmRzIFRyaWU8VD4KK3sKKyAgICAvKgorICAgIFRSSUUgRk9STUFUIEFORCBOT0RFIFRZUEVTCisKKyAgICBUaGUgbWVtdGFibGUgdHJpZSB1c2VzIGZpdmUgZGlmZmVyZW50IHR5cGVzIG9mIG5vZGVzOgorICAgICAtICJsZWFmIiBub2Rlcywgd2hpY2ggaGF2ZSBjb250ZW50IGFuZCBubyBjaGlsZHJlbjsKKyAgICAgLSBzaW5nbGUtdHJhbnNpdGlvbiAiY2hhaW4iIG5vZGVzLCB3aGljaCBoYXZlIGV4YWN0bHkgb25lIGNoaWxkOyB3aGlsZSBlYWNoIG5vZGUgaXMgYSBzaW5nbGUgdHJhbnNpdGlvbiwgdGhleSBhcmUKKyAgICAgICBjYWxsZWQgImNoYWluIiBiZWNhdXNlIG11bHRpcGxlIHN1Y2ggdHJhbnNpdGlvbiBhcmUgcGFja2VkIGluIGEgYmxvY2suCisgICAgIC0gInNwYXJzZSIgbm9kZXMgd2hpY2ggaGF2ZSBiZXR3ZWVuIHR3byBhbmQgc2l4IGNoaWxkcmVuOworICAgICAtICJzcGxpdCIgbm9kZXMgZm9yIGFueXRoaW5nIGFib3ZlIHNpeCBjaGlsZHJlbjsKKyAgICAgLSAicHJlZml4IiBub2RlcyB0aGF0IGF1Z21lbnQgb25lIG9mIHRoZSBvdGhlciB0eXBlcyAoZXhjZXB0IGxlYWYpIHdpdGggY29udGVudC4KKworICAgIFRoZSBkYXRhIGZvciBhbGwgbm9kZXMgZXhjZXB0IGxlYWYgb25lcyBpcyBzdG9yZWQgaW4gYSBjb250aWd1b3VzICdub2RlIGJ1ZmZlcicgYW5kIGxhaWQgb3V0IGluIGJsb2NrcyBvZiAzMiBieXRlcy4KKyAgICBBIGJsb2NrIG9ubHkgY29udGFpbnMgZGF0YSBmb3IgYSBzaW5nbGUgdHlwZSBvZiBub2RlLCBidXQgdGhlcmUgaXMgbm8gZGlyZWN0IGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gYmxvY2sgYW5kIG5vZGUKKyAgICBpbiB0aGF0OgorICAgICAtIGEgc2luZ2xlIGJsb2NrIGNhbiBjb250YWluIG11bHRpcGxlICJjaGFpbiIgbm9kZXMuCisgICAgIC0gYSBzcGFyc2Ugbm9kZSBvY2N1cGllcyBleGFjdGx5IG9uZSBibG9jay4KKyAgICAgLSBhIHNwbGl0IG5vZGUgb2NjdXBpZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YgYmxvY2tzLgorICAgICAtIGEgcHJlZml4IG5vZGUgY2FuIGJlIHBsYWNlZCBpbiB0aGUgc2FtZSBibG9jayBhcyB0aGUgbm9kZSBpdCBhdWdtZW50cywgb3IgaW4gYSBzZXBhcmF0ZSBibG9jay4KKworICAgIE5vZGVzIGFyZSByZWZlcmVuY2VkIGluIHRoYXQgYnVmZmVyIGJ5IGFuIGludGVnZXIgcG9zaXRpb24vcG9pbnRlciwgdGhlICdub2RlIHBvaW50ZXInLiBOb3RlIHRoYXQgbm9kZSBwb2ludGVycyBhcmUKKyAgICBub3QgcG9pbnRpbmcgYXQgdGhlIGJlZ2lubmluZyBvZiBibG9ja3MsIGFuZCB3ZSBjYWxsICdwb2ludGVyIG9mZnNldCcgdGhlIG9mZnNldCBvZiB0aGUgbm9kZSBwb2ludGVyIHRvIHRoZSBibG9jayBpdAorICAgIHBvaW50cyBpbnRvLiBUaGUgdmFsdWUgb2YgYSAnbm9kZSBwb2ludGVyJyBpcyB1c2VkIHRvIGRlY2lkZSB3aGF0IGtpbmQgb2Ygbm9kZSBpcyBwb2ludGVkOgorCisgICAgIC0gSWYgdGhlIHBvaW50ZXIgaXMgbmVnYXRpdmUsIHdlIGhhdmUgYSBsZWFmIG5vZGUuIFNpbmNlIGEgbGVhZiBoYXMgbm8gY2hpbGRyZW4sIHdlIG5lZWQgbm8gZGF0YSBvdXRzaWRlIG9mIGl0cworICAgICAgIGNvbnRlbnQgdG8gcmVwcmVzZW50IGl0LCBhbmQgdGhhdCBjb250ZW50IGlzIHN0b3JlZCBpbiBhICdjb250ZW50IGxpc3QnLCBub3QgaW4gdGhlIG5vZGVzIGJ1ZmZlci4gVGhlIGNvbnRlbnQKKyAgICAgICBvZiBhIHBhcnRpY3VsYXIgbGVhZiBub2RlIGlzIGxvY2F0ZWQgYXQgdGhlIH5wb2ludGVyIHBvc2l0aW9uIGluIHRoZSBjb250ZW50IGxpc3QgKH4gaW5zdGVhZCBvZiAtIHNvIHRoYXQgLTEgY2FuCisgICAgICAgY29ycmVzcG9uZCB0byBwb3NpdGlvbiAwKS4KKworICAgICAtIElmIHRoZSAncG9pbnRlciBvZmZzZXQnIGlzIHNtYWxsZXIgdGhhbiAyOCwgd2UgaGF2ZSBhIGNoYWluIG5vZGUgd2l0aCBvbmUgdHJhbnNpdGlvbi4gVGhlIHRyYW5zaXRpb24gY2hhcmFjdGVyIGlzCisgICAgICAgdGhlIGJ5dGUgYXQgdGhlIHBvc2l0aW9uIHBvaW50ZWQgaW4gdGhlICdub2RlIGJ1ZmZlcicsIGFuZCB0aGUgY2hpbGQgaXMgcG9pbnRlZCBieToKKyAgICAgICAtIHRoZSBpbnRlZ2VyIHZhbHVlIGF0IG9mZnNldCAyOCBvZiB0aGUgYmxvY2sgcG9pbnRlZCBpZiB0aGUgJ3BvaW50ZXIgb2Zmc2V0JyBpcyAyNworICAgICAgIC0gcG9pbnRlciArIDEgKHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBvZmZzZXQgc21hbGxlciB0aGFuIDI4LCBpLmUuIHRvIGJlIGEgY2hhaW4gbm9kZSksIG90aGVyd2lzZQorICAgICAgIEluIG90aGVyIHdvcmRzLCBhIGNoYWluIGJsb2NrIGNvbnRhaW5zIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB0aGF0IGxlYWRzIHRvIHRoZSBjaGlsZCB3aG9zZSBhZGRyZXNzIGlzIGF0CisgICAgICAgb2Zmc2V0IDI4LiBJdCBtYXkgaGF2ZSBiZXR3ZWVuIDEgYW5kIDI4IGNoYXJhY3RlcnMgZGVwZW5kaW5nIG9uIHRoZSBwb2ludGVyIHdpdGggd2hpY2ggdGhlIGJsb2NrIGlzIGVudGVyZWQuCisKKyAgICAgLSBJZiB0aGUgJ3BvaW50ZXIgb2Zmc2V0JyBpcyAzMCwgd2UgaGF2ZSBhIHNwYXJzZSBub2RlLiBUaGUgZGF0YSBvZiBhIHNwYXJzZSBub2RlIG9jY3VwaWVzIGEgZnVsbCBibG9jayBhbmQgaXMgbGFpZAorICAgICAgIG91dCBhczoKKyAgICAgICAtIHNpeCBwb2ludGVycyB0byBjaGlsZHJlbiBhdCBvZmZzZXRzIDAgdG8gMjQKKyAgICAgICAtIHNpeCB0cmFuc2l0aW9uIGNoYXJhY3RlcnMgYXQgb2Zmc2V0cyAyNCB0byAzMAorICAgICAgIC0gYW4gb3JkZXIgd29yZCBzdG9yZWQgaW4gdGhlIHR3byBieXRlcyBhdCBvZmZzZXQgMzAKKyAgICAgICBUbyBlbmFibGUgaW4tcGxhY2UgYWRkaXRpb24gb2YgY2hpbGRyZW4sIHRoZSBwb2ludGVycyBhbmQgdHJhbnNpdGlvbiBjaGFyYWN0ZXJzIGFyZSBub3Qgc3RvcmVkIG9yZGVyZWQuCisgICAgICAgSW5zdGVhZCwgd2UgdXNlIGFuIG9yZGVyIGVuY29kaW5nIGluIHRoZSBsYXN0IDIgYnl0ZXMgb2YgdGhlIG5vZGUuIFRoZSBlbmNvZGluZyBpcyBhIGJhc2UtNiBudW1iZXIgd2hpY2gKKyAgICAgICBkZXNjcmliZXMgdGhlIG9yZGVyIG9mIHRoZSB0cmFuc2l0aW9ucyAobGVhc3Qgc2lnbmlmaWNhbnQgZGlnaXQgYmVpbmcgdGhlIHNtYWxsZXN0KS4KKyAgICAgICBUaGUgbm9kZSBtdXN0IGhhdmUgYXQgbGVhc3QgdHdvIHRyYW5zaXRpb25zIGFuZCB0aGUgdHJhbnNpdGlvbiBhdCBwb3NpdGlvbiAwIGlzIG5ldmVyIHRoZSBiaWdnZXN0ICh3ZSBjYW4KKyAgICAgICBlbmZvcmNlIHRoaXMgYnkgY2hvb3NpbmcgZm9yIHBvc2l0aW9uIDAgdGhlIHNtYWxsZXIgb2YgdGhlIHR3byB0cmFuc2l0aW9ucyBhIHNwYXJzZSBub2RlIHN0YXJ0cyB3aXRoKS4gVGhpcworICAgICAgIGFsbG93cyBpdGVyYXRpb24gb3ZlciB0aGUgb3JkZXIgd29yZCAod2hpY2ggZGl2aWRlcyBzYWlkIHdvcmQgYnkgNiBlYWNoIHN0ZXApIHRvIGZpbmlzaCB3aGVuIHRoZSByZXN1bHQgYmVjb21lcyAwLgorCisgICAgIC0gSWYgdGhlICdwb2ludGVyIG9mZnNldCcgaXMgMjgsIHRoZSBub2RlIGlzIGEgc3BsaXQgb25lLiBTcGxpdCBub2RlcyBhcmUgZGVuc2UsIG1lYW5pbmcgdGhhdCB0aGVyZSBpcyBhIGRpcmVjdAorICAgICAgIG1hcHBpbmcgYmV0d2VlbiBhIHRyYW5zaXRpb24gY2hhcmFjdGVyIGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUgYXNzb2NpYXRlZCBwb2ludGVyLCBhbmQgbmV3IGNoaWxkcmVuIGNhbiBlYXNpbHkgYmUKKyAgICAgICBhZGRlZCBpbiBwbGFjZS4KKyAgICAgICBTcGxpdCBub2RlcyBvY2N1cHkgbXVsdGlwbGUgYmxvY2tzLCBhbmQgYSBjaGlsZCBpcyBsb2NhdGVkIGJ5IHRyYXZlcnNpbmcgMyBsYXllcnMgb2YgcG9pbnRlcnM6CisgICAgICAgLSB0aGUgZmlyc3QgcG9pbnRlciBpcyB3aXRoaW4gdGhlIHRvcC1sZXZlbCBibG9jayAodGhlIG9uZSBwb2ludGVkIGJ5IHRoZSBwb2ludGVyKSBhbmQgcG9pbnRzIHRvIGEgIm1pZCIgYmxvY2suCisgICAgICAgICBUaGUgdG9wLWxldmVsIGJsb2NrIGhhcyA0IHN1Y2ggcG9pbnRlcnMgdG8gIm1pZCIgYmxvY2ssIGxvY2F0ZWQgYmV0d2VlbiBvZmZzZXQgMTYgYW5kIDMyLgorICAgICAgIC0gdGhlIDJuZCBwb2ludGVyIGlzIHdpdGhpbiB0aGUgIm1pZCIgYmxvY2sgYW5kIHBvaW50cyB0byBhICJ0YWlsIiBibG9jay4gQSAibWlkIiBibG9jayBoYXMgOCBzdWNoIHBvaW50ZXJzCisgICAgICAgICBvY2N1cHlpbmcgdGhlIHdob2xlIGJsb2NrLgorICAgICAgIC0gdGhlIDNyZCBwb2ludGVyIGlzIHdpdGggdGhlICJ0YWlsIiBibG9jayBhbmQgaXMgdGhlIGFjdHVhbCBjaGlsZCBwb2ludGVyLiBMaWtlICJtaWQiIGJsb2NrLCB0aGVyZSBhcmUgOCBzdWNoCisgICAgICAgICBwb2ludGVycyAoc28gd2UgZmluYWxseSBhZGRyZXNzIDQgKiA4ICogOCA9IDI1NiBjaGlsZHJlbikuCisgICAgICAgVG8gZmluZCBhIGNoaWxkLCB3ZSB0aHVzIG5lZWQgdG8ga25vdyB0aGUgaW5kZXggb2YgdGhlIHBvaW50ZXIgdG8gZm9sbG93IHdpdGhpbiB0aGUgdG9wLWxldmVsIGJsb2NrLCB0aGUgaW5kZXgKKyAgICAgICBvZiB0aGUgb25lIGluIHRoZSAibWlkIiBibG9jayBhbmQgdGhlIGluZGV4IGluIHRoZSAidGFpbCIgYmxvY2suIEZvciB0aGF0LCB3ZSBzcGxpdCB0aGUgdHJhbnNpdGlvbiBieXRlIGluIGEKKyAgICAgICBzZXF1ZW5jZSBvZiAyLTMtMyBiaXRzOgorICAgICAgIC0gdGhlIGZpcnN0IDIgYml0cyBhcmUgdGhlIGluZGV4IGluIHRoZSB0b3AtbGV2ZWwgYmxvY2s7CisgICAgICAgLSB0aGUgbmV4dCAzIGJpdHMsIHRoZSBpbmRleCBpbiB0aGUgIm1pZCIgYmxvY2s7CisgICAgICAgLSBhbmQgdGhlIGxhc3QgMyBiaXRzIHRoZSBpbmRleCBpbiB0aGUgInRhaWwiIGJsb2NrLgorICAgICAgIFRoaXMgbGF5b3V0IGFsbG93cyB0aGUgbm9kZSB0byB1c2UgdGhlIHNtYWxsZXIgZml4ZWQtc2l6ZSBibG9ja3MgKGluc3RlYWQgb2YgMjU2KjQgYnl0ZXMgZm9yIHRoZSB3aG9sZSBjaGFyYWN0ZXIKKyAgICAgICBzcGFjZSkgYW5kIGFsc28gbGVhdmVzIHNvbWUgcm9vbSBpbiB0aGUgaGVhZCBibG9jayAodGhlIDE2IGZpcnN0IGJ5dGVzKSBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAod2hpY2ggd2UgY2FuCisgICAgICAgdXNlIHRvIHN0b3JlIHByZWZpeCBub2RlcyBjb250YWluaW5nIHRoaW5ncyBsaWtlIGRlbGV0aW9uIHRpbWVzKS4KKyAgICAgICBPbmUgc3BsaXQgbm9kZSBtYXkgbmVlZCB1cCB0byAxICsgNCArIDQqOCBibG9ja3MgKDExODQgYnl0ZXMpIHRvIHN0b3JlIGFsbCBpdHMgY2hpbGRyZW4uCisKKyAgICAgLSBJZiB0aGUgcG9pbnRlciBvZmZzZXQgaXMgMzEsIHdlIGhhdmUgYSBwcmVmaXggbm9kZS4gVGhlc2UgYXJlIHR3byB0eXBlczoKKyAgICAgICAtLSBFbWJlZGRlZCBwcmVmaXggbm9kZXMgb2NjdXB5IHRoZSBmcmVlIGJ5dGVzIGluIGEgY2hhaW4gb3Igc3BsaXQgbm9kZS4gVGhlIGJ5dGUgYXQgb2Zmc2V0IDQgaGFzIHRoZSBvZmZzZXQKKyAgICAgICAgICB3aXRoaW4gdGhlIDMyLWJ5dGUgYmxvY2sgZm9yIHRoZSBhdWdtZW50ZWQgbm9kZS4KKyAgICAgICAtLSBGdWxsIHByZWZpeCBub2RlcyBoYXZlIDB4RkYgYXQgb2Zmc2V0IDQgYW5kIGEgcG9pbnRlciBhdCAyOCwgcG9pbnRpbmcgdG8gdGhlIGF1Z21lbnRlZCBub2RlLgorICAgICAgIEJvdGggdHlwZXMgY29udGFpbiBhbiBpbmRleCBmb3IgY29udGVudCBhdCBvZmZzZXQgMC4gVGhlIGF1Z21lbnRlZCBub2RlIGNhbm5vdCBiZSBhIGxlYWYgb3IgTk9ORSAtLSBpbiB0aGUgZm9ybWVyCisgICAgICAgY2FzZSB0aGUgbGVhZiBpdHNlbGYgY29udGFpbnMgdGhlIGNvbnRlbnQgaW5kZXgsIGluIHRoZSBsYXR0ZXIgd2UgdXNlIGEgbGVhZiBpbnN0ZWFkLgorICAgICAgIFRoZSB0ZXJtICJub2RlIiB3aGVuIGFwcGxpZWQgdG8gdGhlc2UgaXMgYSBiaXQgb2YgYSBtaXNub21lciBhcyB0aGV5IGFyZSBub3QgcHJlc2VudGVkIGFzIHNlcGFyYXRlIG5vZGVzIGR1cmluZworICAgICAgIHRyYXZlcnNhbHMuIEluc3RlYWQsIHRoZXkgYXVnbWVudCBhIG5vZGUsIGNoYW5naW5nIG9ubHkgaXRzIGNvbnRlbnQuIEludGVybmFsbHkgd2UgY3JlYXRlIGEgTm9kZSBvYmplY3QgZm9yIHRoZQorICAgICAgIGF1Z21lbnRlZCBub2RlIGFuZCB3cmFwIGEgUHJlZml4Tm9kZSBhcm91bmQgaXQsIHdoaWNoIGNoYW5nZXMgdGhlIGBjb250ZW50KClgIG1ldGhvZCBhbmQgcm91dGVzIGFsbCBvdGhlcgorICAgICAgIGNhbGxzIHRvIHRoZSBhdWdtZW50ZWQgbm9kZSdzIG1ldGhvZHMuCisKKyAgICAgV2hlbiBidWlsZGluZyBhIHRyaWUgd2UgZmlyc3QgYWxsb2NhdGUgdGhlIGNvbnRlbnQsIHRoZW4gY3JlYXRlIGEgY2hhaW4gbm9kZSBsZWFkaW5nIHRvIGl0LiBXaGlsZSB3ZSBvbmx5IGhhdmUKKyAgICAgc2luZ2xlIHRyYW5zaXRpb25zIGxlYWRpbmcgdG8gYSBjaGFpbiBub2RlLCB3ZSBjYW4gZXhwYW5kIHRoYXQgbm9kZSAoYXR0YWNoaW5nIGEgY2hhcmFjdGVyIGFuZCB1c2luZyBwb2ludGVyIC0gMSkKKyAgICAgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBvbmUuIFdoZW4gYSBjaGFpbiBub2RlIGFscmVhZHkgaGFzIGEgY2hpbGQgYW5kIG5lZWRzIGEgbmV3IG9uZSBhZGRlZCB3ZSBjaGFuZ2UgdGhlIHR5cGUKKyAgICAgKGkuZS4gY3JlYXRlIGEgbmV3IG5vZGUgYW5kIHJlbWFwIHRoZSBwYXJlbnQpIHRvIHNwYXJzZSB3aXRoIHR3byBjaGlsZHJlbi4gV2hlbiBhIHNpeC1jaGlsZCBzcGFyc2Ugbm9kZSBuZWVkcyBhIG5ldworICAgICBjaGlsZCwgd2Ugc3dpdGNoIHRvIHNwbGl0LgorCisgICAgIEJsb2NrcyBjdXJyZW50bHkgYXJlIG5vdCByZXVzZWQsIGJlY2F1c2Ugd2UgZG8gbm90IHlldCBoYXZlIGEgbWVjaGFuaXNtIHRvIHRlbGwgd2hlbiByZWFkZXJzIGFyZSBkb25lIHdpdGggYmxvY2tzCisgICAgIHRoZXkgYXJlIHJlZmVyZW5jaW5nLiBUaGlzIGN1cnJlbnRseSBjYXVzZXMgYSB2ZXJ5IGxvdyBvdmVyaGVhZCAoYmVjYXVzZSB3ZSBjaGFuZ2UgZGF0YSBpbiBwbGFjZSB3aXRoIHRoZSBvbmx5CisgICAgIGV4Y2VwdGlvbiBvZiBub2RlcyBuZWVkaW5nIHRvIGNoYW5nZSB0eXBlKSBhbmQgaXMgcGxhbm5lZCB0byBiZSBhZGRyZXNzZWQgbGF0ZXIuCisKKyAgICAgRm9yIGZ1cnRoZXIgZGVzY3JpcHRpb25zIGFuZCBleGFtcGxlcyBvZiB0aGUgbWVjaGFuaWNzIG9mIHRoZSB0cmllLCBzZWUgSW5NZW1vcnlUcmllLm1kLgorICAgICAqLworCisgICAgc3RhdGljIGZpbmFsIGludCBCTE9DS19TSVpFID0gMzI7CisKKyAgICAvLyBCaWdnZXN0IGJsb2NrIG9mZnNldCB0aGF0IGNhbiBjb250YWluIGEgcG9pbnRlci4KKyAgICBzdGF0aWMgZmluYWwgaW50IExBU1RfUE9JTlRFUl9PRkZTRVQgPSBCTE9DS19TSVpFIC0gNDsKKworICAgIC8qCisgICAgIEJsb2NrIG9mZnNldHMgdXNlZCB0byBpZGVudGlmeSBub2RlIHR5cGVzIChieSBjb21wYXJpbmcgdGhlbSB0byB0aGUgbm9kZSAncG9pbnRlciBvZmZzZXQnKS4KKyAgICAgKi8KKworICAgIC8vIHNwbGl0IG5vZGUgKGRlbnNlLCAyLTMtMyB0cmFuc2l0aW9ucyksIGxhaWQgb3V0IGFzIDQgcG9pbnRlcnMgdG8gIm1pZCIgYmxvY2ssIHdpdGggaGFzIDggcG9pbnRlcnMgdG8gInRhaWwiIGJsb2NrLAorICAgIC8vIHdoaWNoIGhhcyA4IHBvaW50ZXJzIHRvIGNoaWxkcmVuCisgICAgc3RhdGljIGZpbmFsIGludCBTUExJVF9PRkZTRVQgPSBCTE9DS19TSVpFIC0gNDsKKyAgICAvLyBzcGFyc2Ugbm9kZSwgdW5vcmRlcmVkIGxpc3Qgb2YgdXAgdG8gNiB0cmFuc2l0aW9uLCBsYWlkIG91dCBhcyA2IHRyYW5zaXRpb24gcG9pbnRlcnMgZm9sbG93ZWQgYnkgNiB0cmFuc2l0aW9uCisgICAgLy8gYnl0ZXMuIFRoZSBsYXN0IHR3byBieXRlcyBjb250YWluIGFuIG9yZGVyaW5nIG9mIHRoZSB0cmFuc2l0aW9ucyAoaW4gYmFzZS02KSB3aGljaCBpcyB1c2VkIGZvciBpdGVyYXRpb24uIE9uCisgICAgLy8gdXBkYXRlIHRoZSBwb2ludGVyIGlzIHNldCBsYXN0LCBpLmUuIGR1cmluZyByZWFkcyB0aGUgbm9kZSBtYXkgc2hvdyB0aGF0IGEgdHJhbnNpdGlvbiBleGlzdHMgYW5kIGxpc3QgYSBjaGFyYWN0ZXIKKyAgICAvLyBmb3IgaXQsIGJ1dCBwb2ludGVyIG1heSBzdGlsbCBiZSBudWxsLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgU1BBUlNFX09GRlNFVCA9IEJMT0NLX1NJWkUgLSAyOworICAgIC8vIG1pbiBhbmQgbWF4IG9mZnNldCBmb3IgYSBjaGFpbiBub2RlLiBBIGJsb2NrIG9mIGNoYWluIG5vZGUgaXMgbGFpZCBvdXQgYXMgYSBwb2ludGVyIGF0IExBU1RfUE9JTlRFUl9PRkZTRVQsCisgICAgLy8gcHJlY2VkZWQgYnkgY2hhcmFjdGVycyB0aGF0IGxlYWQgdG8gaXQuIFRodXMgYSBmdWxsIGNoYWluIGJsb2NrIGNvbnRhaW5zIEJMT0NLX1NJWkUtNCB0cmFuc2l0aW9ucy9jaGFpbiBub2Rlcy4KKyAgICBzdGF0aWMgZmluYWwgaW50IENIQUlOX01JTl9PRkZTRVQgPSAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBSU5fTUFYX09GRlNFVCA9IEJMT0NLX1NJWkUgLSA1OworICAgIC8vIFByZWZpeCBub2RlLCBhbiBpbnRlcm1lZGlhdGUgbm9kZSBhdWdtZW50aW5nIGl0cyBjaGlsZCBub2RlIHdpdGggY29udGVudC4KKyAgICBzdGF0aWMgZmluYWwgaW50IFBSRUZJWF9PRkZTRVQgPSBCTE9DS19TSVpFIC0gMTsKKworICAgIC8qCisgICAgIE9mZnNldHMgYW5kIHZhbHVlcyBmb3IgbmF2aWdhdGluZyBpbiBhIGJsb2NrIGZvciBwYXJ0aWN1bGFyIG5vZGUgdHlwZS4gVGhvc2Ugb2Zmc2V0cyBhcmUgJ2Zyb20gdGhlIG5vZGUgcG9pbnRlcicKKyAgICAgKG5vdCB0aGUgYmxvY2sgc3RhcnQpIGFuZCBjYW4gYmUgdGh1cyBuZWdhdGl2ZSBzaW5jZSBub2RlIHBvaW50ZXJzIHBvaW50cyB0b3dhcmRzIHRoZSBlbmQgb2YgYmxvY2tzLgorICAgICAqLworCisgICAgLy8gTGltaXQgZm9yIHRoZSBzdGFydGluZyBjZWxsIC8gc3VibGV2ZWwgKDIgYml0cyAtPiA0IHBvaW50ZXJzKS4KKyAgICBzdGF0aWMgZmluYWwgaW50IFNQTElUX1NUQVJUX0xFVkVMX0xJTUlUID0gNDsKKyAgICAvLyBMaW1pdCBmb3IgdGhlIG90aGVyIHN1YmxldmVscyAoMyBiaXRzIC0+IDggcG9pbnRlcnMpLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgU1BMSVRfT1RIRVJfTEVWRUxfTElNSVQgPSA4OworICAgIC8vIEJpdHNoaWZ0IGJldHdlZW4gbGV2ZWxzLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgU1BMSVRfTEVWRUxfU0hJRlQgPSAzOworCisgICAgc3RhdGljIGZpbmFsIGludCBTUEFSU0VfQ0hJTERfQ09VTlQgPSA2OworICAgIC8vIE9mZnNldCB0byB0aGUgZmlyc3QgY2hpbGQgcG9pbnRlciBvZiBhIHNwYXJlIG5vZGUgKGxhaWQgb3V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBibG9jaykKKyAgICBzdGF0aWMgZmluYWwgaW50IFNQQVJTRV9DSElMRFJFTl9PRkZTRVQgPSAwIC0gU1BBUlNFX09GRlNFVDsKKyAgICAvLyBPZmZzZXQgdG8gdGhlIGZpcnN0IHRyYW5zaXRpb24gYnl0ZSBvZiBhIHNwYXJzZSBub2RlIChsYWlkIG91dCBhZnRlciB0aGUgY2hpbGQgcG9pbnRlcnMpCisgICAgc3RhdGljIGZpbmFsIGludCBTUEFSU0VfQllURVNfT0ZGU0VUID0gU1BBUlNFX0NISUxEX0NPVU5UICogNCAtIFNQQVJTRV9PRkZTRVQ7CisgICAgLy8gT2Zmc2V0IHRvIHRoZSBvcmRlciB3b3JkIG9mIGEgc3BhcnNlIG5vZGUgKGxhaWQgb3V0IGFmdGVyIHRoZSBjaGlsZHJlbiAocG9pbnRlciArIHRyYW5zaXRpb24gYnl0ZSkpCisgICAgc3RhdGljIGZpbmFsIGludCBTUEFSU0VfT1JERVJfT0ZGU0VUID0gU1BBUlNFX0NISUxEX0NPVU5UICogNSAtIFNQQVJTRV9PRkZTRVQ7ICAvLyAwCisKKyAgICAvLyBPZmZzZXQgb2YgdGhlIGZsYWcgYnl0ZSBpbiBhIHByZWZpeCBub2RlLiBJbiBzaGFyZWQgYmxvY2tzLCB0aGlzIGNvbnRhaW5zIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgbm9kZS4KKyAgICBzdGF0aWMgZmluYWwgaW50IFBSRUZJWF9GTEFHU19PRkZTRVQgPSA0IC0gUFJFRklYX09GRlNFVDsKKyAgICAvLyBPZmZzZXQgb2YgdGhlIGNvbnRlbnQgaWQKKyAgICBzdGF0aWMgZmluYWwgaW50IFBSRUZJWF9DT05URU5UX09GRlNFVCA9IDAgLSBQUkVGSVhfT0ZGU0VUOworICAgIC8vIE9mZnNldCBvZiB0aGUgbmV4dCBwb2ludGVyIGluIGEgbm9uLXNoYXJlZCBwcmVmaXggbm9kZQorICAgIHN0YXRpYyBmaW5hbCBpbnQgUFJFRklYX1BPSU5URVJfT0ZGU0VUID0gTEFTVF9QT0lOVEVSX09GRlNFVCAtIFBSRUZJWF9PRkZTRVQ7CisKKyAgICAvKioKKyAgICAgKiBWYWx1ZSB1c2VkIGFzIG51bGwgZm9yIG5vZGUgcG9pbnRlcnMuCisgICAgICogTm8gbm9kZSBjYW4gdXNlIHRoaXMgYWRkcmVzcyAod2UgZW5mb3JjZSB0aGlzIGJ5IG5vdCBhbGxvd2luZyBjaGFpbiBub2RlcyB0byBncm93IHRvIHBvc2l0aW9uIDApLgorICAgICAqIERvIG5vdCBjaGFuZ2UgdGhpcyBhcyB0aGUgY29kZSByZWxpZXMgdGhlcmUgYmVpbmcgYSBOT05FIHBsYWNlZCBpbiBhbGwgYnl0ZXMgb2YgdGhlIGJsb2NrIHRoYXQgYXJlIG5vdCBzZXQuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBOT05FID0gMDsKKworICAgIHZvbGF0aWxlIGludCByb290OworCisgICAgLyoKKyAgICAgRVhQQU5EQUJMRSBEQVRBIFNUT1JBR0UKKworICAgICBUaGUgdHJpZXMgd2lsbCBuZWVkIG1vcmUgYW5kIG1vcmUgc3BhY2UgaW4gYnVmZmVycyBhbmQgY29udGVudCBsaXN0cyBhcyB0aGV5IGdyb3cuIEluc3RlYWQgb2YgdXNpbmcgQXJyYXlMaXN0LWxpa2UKKyAgICAgcmVhbGxvY2F0aW9uIHdpdGggY29weWluZywgd2hpY2ggbWF5IGJlIHByb2hpYml0aXZlbHkgZXhwZW5zaXZlIGZvciBsYXJnZSBidWZmZXJzLCB3ZSB1c2UgYSBzZXF1ZW5jZSBvZgorICAgICBidWZmZXJzL2NvbnRlbnQgYXJyYXlzIHRoYXQgZG91YmxlIGluIHNpemUgb24gZXZlcnkgZXhwYW5zaW9uLgorCisgICAgIEZvciBhIGdpdmVuIGFkZHJlc3MgeCB0aGUgaW5kZXggb2YgdGhlIGJ1ZmZlciBjYW4gYmUgZm91bmQgd2l0aCB0aGUgZm9sbG93aW5nIGNhbGN1bGF0aW9uOgorICAgICAgICBpbmRleF9vZl9tb3N0X3NpZ25pZmljYW50X3NldF9iaXQoeCAvIG1pbl9zaXplICsgMSkKKyAgICAgKHJlbHlpbmcgb24gc3VtICgyXmkpIGZvciBpIGluIFswLCBuLTFdID09IDJebiAtIDEpIHdoaWNoIGNhbiBiZSBwZXJmb3JtZWQgcXVpY2tseSBvbiBtb2Rlcm4gaGFyZHdhcmUuCisKKyAgICAgRmluZGluZyB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgYnVmZmVyIGlzIHRoZW4KKyAgICAgICAgeCArIG1pbiAtIChtaW4gPDwgYnVmZmVyX2luZGV4KQorCisgICAgIFRoZSBhbGxvY2F0ZWQgc3BhY2Ugc3RhcnRzIDI1NiBieXRlcyBmb3IgdGhlIGJ1ZmZlciBhbmQgMTYgZW50cmllcyBmb3IgdGhlIGNvbnRlbnQgbGlzdC4KKworICAgICBOb3RlIHRoYXQgYSBidWZmZXIgaXMgbm90IGFsbG93ZWQgdG8gc3BsaXQgMzItYnl0ZSBibG9ja3MgKGNvZGUgYXNzdW1lcyBzYW1lIGJ1ZmZlciBjYW4gYmUgdXNlZCBmb3IgYWxsIGJ5dGVzCisgICAgIGluc2lkZSB0aGUgYmxvY2spLgorICAgICAqLworCisgICAgc3RhdGljIGZpbmFsIGludCBCVUZfU1RBUlRfU0hJRlQgPSA4OworICAgIHN0YXRpYyBmaW5hbCBpbnQgQlVGX1NUQVJUX1NJWkUgPSAxIDw8IEJVRl9TVEFSVF9TSElGVDsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVFNfU1RBUlRfU0hJRlQgPSA0OworICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVFNfU1RBUlRfU0laRSA9IDEgPDwgQ09OVEVOVFNfU1RBUlRfU0hJRlQ7CisKKyAgICBzdGF0aWMKKyAgICB7CisgICAgICAgIGFzc2VydCBCVUZfU1RBUlRfU0laRSAlIEJMT0NLX1NJWkUgPT0gMCA6ICJJbml0aWFsIGJ1ZmZlciBzaXplIG11c3QgZml0IGEgZnVsbCBibG9jay4iOworICAgIH0KKworICAgIGZpbmFsIFVuc2FmZUJ1ZmZlcltdIGJ1ZmZlcnM7CisgICAgZmluYWwgQXRvbWljUmVmZXJlbmNlQXJyYXk8VD5bXSBjb250ZW50QXJyYXlzOworCisgICAgSW5NZW1vcnlSZWFkVHJpZShVbnNhZmVCdWZmZXJbXSBidWZmZXJzLCBBdG9taWNSZWZlcmVuY2VBcnJheTxUPltdIGNvbnRlbnRBcnJheXMsIGludCByb290KQorICAgIHsKKyAgICAgICAgdGhpcy5idWZmZXJzID0gYnVmZmVyczsKKyAgICAgICAgdGhpcy5jb250ZW50QXJyYXlzID0gY29udGVudEFycmF5czsKKyAgICAgICAgdGhpcy5yb290ID0gcm9vdDsKKyAgICB9CisKKyAgICAvKgorICAgICBCdWZmZXIsIGNvbnRlbnQgbGlzdCBhbmQgYmxvY2sgbWFuYWdlbWVudAorICAgICAqLworICAgIGludCBnZXRDaHVua0lkeChpbnQgcG9zLCBpbnQgbWluQ2h1bmtTaGlmdCwgaW50IG1pbkNodW5rU2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAzMSAtIG1pbkNodW5rU2hpZnQgLSBJbnRlZ2VyLm51bWJlck9mTGVhZGluZ1plcm9zKHBvcyArIG1pbkNodW5rU2l6ZSk7CisgICAgfQorCisgICAgaW50IGluQ2h1bmtQb2ludGVyKGludCBwb3MsIGludCBjaHVua0luZGV4LCBpbnQgbWluQ2h1bmtTaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBvcyArIG1pbkNodW5rU2l6ZSAtIChtaW5DaHVua1NpemUgPDwgY2h1bmtJbmRleCk7CisgICAgfQorCisgICAgVW5zYWZlQnVmZmVyIGdldENodW5rKGludCBwb3MpCisgICAgeworICAgICAgICBpbnQgbGVhZEJpdCA9IGdldENodW5rSWR4KHBvcywgQlVGX1NUQVJUX1NISUZULCBCVUZfU1RBUlRfU0laRSk7CisgICAgICAgIHJldHVybiBidWZmZXJzW2xlYWRCaXRdOworICAgIH0KKworICAgIGludCBpbkNodW5rUG9pbnRlcihpbnQgcG9zKQorICAgIHsKKyAgICAgICAgaW50IGxlYWRCaXQgPSBnZXRDaHVua0lkeChwb3MsIEJVRl9TVEFSVF9TSElGVCwgQlVGX1NUQVJUX1NJWkUpOworICAgICAgICByZXR1cm4gaW5DaHVua1BvaW50ZXIocG9zLCBsZWFkQml0LCBCVUZfU1RBUlRfU0laRSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQb2ludGVyIG9mZnNldCBmb3IgYSBub2RlIHBvaW50ZXIuCisgICAgICovCisgICAgaW50IG9mZnNldChpbnQgcG9zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBvcyAmIChCTE9DS19TSVpFIC0gMSk7CisgICAgfQorCisgICAgZmluYWwgaW50IGdldFVuc2lnbmVkQnl0ZShpbnQgcG9zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldENodW5rKHBvcykuZ2V0Qnl0ZShpbkNodW5rUG9pbnRlcihwb3MpKSAmIDB4RkY7CisgICAgfQorCisgICAgZmluYWwgaW50IGdldFVuc2lnbmVkU2hvcnQoaW50IHBvcykKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRDaHVuayhwb3MpLmdldFNob3J0KGluQ2h1bmtQb2ludGVyKHBvcykpICYgMHhGRkZGOworICAgIH0KKworICAgIGZpbmFsIGludCBnZXRJbnQoaW50IHBvcykKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRDaHVuayhwb3MpLmdldEludChpbkNodW5rUG9pbnRlcihwb3MpKTsKKyAgICB9CisKKyAgICBUIGdldENvbnRlbnQoaW50IGluZGV4KQorICAgIHsKKyAgICAgICAgaW50IGxlYWRCaXQgPSBnZXRDaHVua0lkeChpbmRleCwgQ09OVEVOVFNfU1RBUlRfU0hJRlQsIENPTlRFTlRTX1NUQVJUX1NJWkUpOworICAgICAgICBpbnQgb2ZzID0gaW5DaHVua1BvaW50ZXIoaW5kZXgsIGxlYWRCaXQsIENPTlRFTlRTX1NUQVJUX1NJWkUpOworICAgICAgICBBdG9taWNSZWZlcmVuY2VBcnJheTxUPiBhcnJheSA9IGNvbnRlbnRBcnJheXNbbGVhZEJpdF07CisgICAgICAgIHJldHVybiBhcnJheS5nZXQob2ZzKTsKKyAgICB9CisKKyAgICAvKgorICAgICBSZWFkaW5nIG5vZGUgY29udGVudAorICAgICAqLworCisgICAgYm9vbGVhbiBpc051bGwoaW50IG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbm9kZSA9PSBOT05FOworICAgIH0KKworICAgIGJvb2xlYW4gaXNMZWFmKGludCBub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGUgPCBOT05FOworICAgIH0KKworICAgIGJvb2xlYW4gaXNOdWxsT3JMZWFmKGludCBub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGUgPD0gTk9ORTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdHJhbnNpdGlvbnMgaW4gYSBjaGFpbiBibG9jayBlbnRlcmVkIHdpdGggdGhlIGdpdmVuIHBvaW50ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgY2hhaW5CbG9ja0xlbmd0aChpbnQgbm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBMQVNUX1BPSU5URVJfT0ZGU0VUIC0gb2Zmc2V0KG5vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIG5vZGUncyBjaGlsZCBmb3IgdGhlIGdpdmVuIHRyYW5zaXRpb24gY2hhcmFjdGVyCisgICAgICovCisgICAgaW50IGdldENoaWxkKGludCBub2RlLCBpbnQgdHJhbnMpCisgICAgeworICAgICAgICBpZiAoaXNOdWxsT3JMZWFmKG5vZGUpKQorICAgICAgICAgICAgcmV0dXJuIE5PTkU7CisKKyAgICAgICAgbm9kZSA9IGZvbGxvd0NvbnRlbnRUcmFuc2l0aW9uKG5vZGUpOworCisgICAgICAgIHN3aXRjaCAob2Zmc2V0KG5vZGUpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNQQVJTRV9PRkZTRVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNwYXJzZUNoaWxkKG5vZGUsIHRyYW5zKTsKKyAgICAgICAgICAgIGNhc2UgU1BMSVRfT0ZGU0VUOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRTcGxpdENoaWxkKG5vZGUsIHRyYW5zKTsKKyAgICAgICAgICAgIGNhc2UgQ0hBSU5fTUFYX09GRlNFVDoKKyAgICAgICAgICAgICAgICBpZiAodHJhbnMgIT0gZ2V0VW5zaWduZWRCeXRlKG5vZGUpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9ORTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW50KG5vZGUgKyAxKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKHRyYW5zICE9IGdldFVuc2lnbmVkQnl0ZShub2RlKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PTkU7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUgKyAxOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBmb2xsb3dDb250ZW50VHJhbnNpdGlvbihpbnQgbm9kZSkKKyAgICB7CisgICAgICAgIGlmIChpc051bGxPckxlYWYobm9kZSkpCisgICAgICAgICAgICByZXR1cm4gTk9ORTsKKworICAgICAgICBpZiAob2Zmc2V0KG5vZGUpID09IFBSRUZJWF9PRkZTRVQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBiID0gZ2V0VW5zaWduZWRCeXRlKG5vZGUgKyBQUkVGSVhfRkxBR1NfT0ZGU0VUKTsKKyAgICAgICAgICAgIGlmIChiIDwgQkxPQ0tfU0laRSkKKyAgICAgICAgICAgICAgICBub2RlID0gbm9kZSAtIFBSRUZJWF9PRkZTRVQgKyBiOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG5vZGUgPSBnZXRJbnQobm9kZSArIFBSRUZJWF9QT0lOVEVSX09GRlNFVCk7CisKKyAgICAgICAgICAgIGFzc2VydCBub2RlID49IDAgJiYgb2Zmc2V0KG5vZGUpICE9IFBSRUZJWF9PRkZTRVQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWR2YW5jZSBhcyBsb25nIGFzIHRoZSBjZWxsIHBvaW50ZWQgdG8gYnkgdGhlIGdpdmVuIHBvaW50ZXIgd2lsbCBsZXQgeW91LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaXMgdGhlIHNhbWUgYXMgZ2V0Q2hpbGQobm9kZSwgZmlyc3QpLCBleGNlcHQgZm9yIGNoYWluIG5vZGVzIHdoZXJlIGl0IHdvdWxkIHdhbGsgdGhlIGZpbGwgY2hhaW4gYXMgbG9uZyBhcworICAgICAqIHRoZSBpbnB1dCBzb3VyY2UgbWF0Y2hlcy4KKyAgICAgKi8KKyAgICBpbnQgYWR2YW5jZShpbnQgbm9kZSwgaW50IGZpcnN0LCBCeXRlU291cmNlIHJlc3QpCisgICAgeworICAgICAgICBpZiAoaXNOdWxsT3JMZWFmKG5vZGUpKQorICAgICAgICAgICAgcmV0dXJuIE5PTkU7CisKKyAgICAgICAgbm9kZSA9IGZvbGxvd0NvbnRlbnRUcmFuc2l0aW9uKG5vZGUpOworCisgICAgICAgIHN3aXRjaCAob2Zmc2V0KG5vZGUpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNQQVJTRV9PRkZTRVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNwYXJzZUNoaWxkKG5vZGUsIGZpcnN0KTsKKyAgICAgICAgICAgIGNhc2UgU1BMSVRfT0ZGU0VUOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRTcGxpdENoaWxkKG5vZGUsIGZpcnN0KTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIGZpcnN0IGJ5dGUgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICBpZiAoZ2V0VW5zaWduZWRCeXRlKG5vZGUrKykgIT0gZmlyc3QpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT05FOworICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSByZXN0IG9mIHRoZSBieXRlcyBwcm92aWRlZCBieSB0aGUgY2hhaW4gbm9kZQorICAgICAgICAgICAgICAgIGZvciAoaW50IGxlbmd0aCA9IGNoYWluQmxvY2tMZW5ndGgobm9kZSk7IGxlbmd0aCA+IDA7IC0tbGVuZ3RoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSByZXN0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFVuc2lnbmVkQnl0ZShub2RlKyspICE9IGZpcnN0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PTkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEFsbCBieXRlcyBtYXRjaGVkLCBub2RlIGlzIG5vdyBwb3NpdGlvbmVkIG9uIHRoZSBjaGlsZCBwb2ludGVyLiBGb2xsb3cgaXQuCisgICAgICAgICAgICAgICAgcmV0dXJuIGdldEludChub2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY2hpbGQgZm9yIHRoZSBnaXZlbiB0cmFuc2l0aW9uIGNoYXJhY3Rlciwga25vd2luZyB0aGF0IHRoZSBub2RlIGlzIHNwYXJzZQorICAgICAqLworICAgIGludCBnZXRTcGFyc2VDaGlsZChpbnQgbm9kZSwgaW50IHRyYW5zKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTUEFSU0VfQ0hJTERfQ09VTlQ7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGdldFVuc2lnbmVkQnl0ZShub2RlICsgU1BBUlNFX0JZVEVTX09GRlNFVCArIGkpID09IHRyYW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjaGlsZCA9IGdldEludChub2RlICsgU1BBUlNFX0NISUxEUkVOX09GRlNFVCArIGkgKiA0KTsKKworICAgICAgICAgICAgICAgIC8vIHdlIGNhbid0IHRydXN0IHRoZSB0cmFuc2l0aW9uIGNoYXJhY3RlciByZWFkIGFib3ZlLCBiZWNhdXNlIGl0IG1heSBoYXZlIGJlZW4gZmV0Y2hlZCBiZWZvcmUgYQorICAgICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgdXBkYXRlIGhhcHBlbmVkLCBhbmQgdGhlIHVwZGF0ZSBtYXkgaGF2ZSBtYW5hZ2VkIHRvIG1vZGlmeSB0aGUgcG9pbnRlciBieSBub3cuCisgICAgICAgICAgICAgICAgLy8gSG93ZXZlciwgaWYgd2UgcmVhZCBpdCBub3cgdGhhdCB3ZSBoYXZlIGFjY2Vzc2VkIHRoZSB2b2xhdGlsZSBwb2ludGVyLCBpdCBtdXN0IGhhdmUgdGhlIGNvcnJlY3QKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSBhcyBpdCBpcyBzZXQgYmVmb3JlIHRoZSBwb2ludGVyLgorICAgICAgICAgICAgICAgIGlmIChjaGlsZCAhPSBOT05FICYmIGdldFVuc2lnbmVkQnl0ZShub2RlICsgU1BBUlNFX0JZVEVTX09GRlNFVCArIGkpID09IHRyYW5zKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5PTkU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYSB0cmFuc2l0aW9uLCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGluZGV4ICh3aXRoaW4gdGhlIG5vZGUgYmxvY2spIG9mIHRoZSBwb2ludGVyIHRvIHRoZSBtaWQgYmxvY2sgb2YKKyAgICAgKiBhIHNwbGl0IG5vZGUuCisgICAgICovCisgICAgaW50IHNwbGl0Tm9kZU1pZEluZGV4KGludCB0cmFucykKKyAgICB7CisgICAgICAgIC8vIGZpcnN0IDIgYml0cyBvZiB0aGUgMi0zLTMgc3BsaXQKKyAgICAgICAgcmV0dXJuICh0cmFucyA+PiA2KSAmIDB4MzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIHRyYW5zaXRpb24sIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgaW5kZXggKHdpdGhpbiB0aGUgbWlkIGJsb2NrKSBvZiB0aGUgcG9pbnRlciB0byB0aGUgdGFpbCBibG9jayBvZgorICAgICAqIGEgc3BsaXQgbm9kZS4KKyAgICAgKi8KKyAgICBpbnQgc3BsaXROb2RlVGFpbEluZGV4KGludCB0cmFucykKKyAgICB7CisgICAgICAgIC8vIHNlY29uZCAzIGJpdHMgb2YgdGhlIDItMy0zIHNwbGl0CisgICAgICAgIHJldHVybiAodHJhbnMgPj4gMykgJiAweDc7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYSB0cmFuc2l0aW9uLCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGluZGV4ICh3aXRoaW4gdGhlIHRhaWwgYmxvY2spIG9mIHRoZSBwb2ludGVyIHRvIHRoZSBjaGlsZCBvZgorICAgICAqIGEgc3BsaXQgbm9kZS4KKyAgICAgKi8KKyAgICBpbnQgc3BsaXROb2RlQ2hpbGRJbmRleChpbnQgdHJhbnMpCisgICAgeworICAgICAgICAvLyB0aGlyZCAzIGJpdHMgb2YgdGhlIDItMy0zIHNwbGl0CisgICAgICAgIHJldHVybiB0cmFucyAmIDB4NzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNoaWxkIGZvciB0aGUgZ2l2ZW4gdHJhbnNpdGlvbiBjaGFyYWN0ZXIsIGtub3dpbmcgdGhhdCB0aGUgbm9kZSBpcyBzcGxpdAorICAgICAqLworICAgIGludCBnZXRTcGxpdENoaWxkKGludCBub2RlLCBpbnQgdHJhbnMpCisgICAgeworICAgICAgICBpbnQgbWlkID0gZ2V0U3BsaXRCbG9ja1BvaW50ZXIobm9kZSwgc3BsaXROb2RlTWlkSW5kZXgodHJhbnMpLCBTUExJVF9TVEFSVF9MRVZFTF9MSU1JVCk7CisgICAgICAgIGlmIChpc051bGwobWlkKSkKKyAgICAgICAgICAgIHJldHVybiBOT05FOworCisgICAgICAgIGludCB0YWlsID0gZ2V0U3BsaXRCbG9ja1BvaW50ZXIobWlkLCBzcGxpdE5vZGVUYWlsSW5kZXgodHJhbnMpLCBTUExJVF9PVEhFUl9MRVZFTF9MSU1JVCk7CisgICAgICAgIGlmIChpc051bGwodGFpbCkpCisgICAgICAgICAgICByZXR1cm4gTk9ORTsKKyAgICAgICAgcmV0dXJuIGdldFNwbGl0QmxvY2tQb2ludGVyKHRhaWwsIHNwbGl0Tm9kZUNoaWxkSW5kZXgodHJhbnMpLCBTUExJVF9PVEhFUl9MRVZFTF9MSU1JVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjb250ZW50IGZvciBhIGdpdmVuIG5vZGUKKyAgICAgKi8KKyAgICBUIGdldE5vZGVDb250ZW50KGludCBub2RlKQorICAgIHsKKyAgICAgICAgaWYgKGlzTGVhZihub2RlKSkKKyAgICAgICAgICAgIHJldHVybiBnZXRDb250ZW50KH5ub2RlKTsKKworICAgICAgICBpZiAob2Zmc2V0KG5vZGUpICE9IFBSRUZJWF9PRkZTRVQpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBpbnQgaW5kZXggPSBnZXRJbnQobm9kZSArIFBSRUZJWF9DT05URU5UX09GRlNFVCk7CisgICAgICAgIHJldHVybiAoaW5kZXggPj0gMCkKKyAgICAgICAgICAgICAgID8gZ2V0Q29udGVudChpbmRleCkKKyAgICAgICAgICAgICAgIDogbnVsbDsKKyAgICB9CisKKyAgICBpbnQgc3BsaXRCbG9ja1BvaW50ZXJBZGRyZXNzKGludCBub2RlLCBpbnQgY2hpbGRJbmRleCwgaW50IHN1YkxldmVsTGltaXQpCisgICAgeworICAgICAgICByZXR1cm4gbm9kZSAtIFNQTElUX09GRlNFVCArICg4IC0gc3ViTGV2ZWxMaW1pdCArIGNoaWxkSW5kZXgpICogNDsKKyAgICB9CisKKyAgICBpbnQgZ2V0U3BsaXRCbG9ja1BvaW50ZXIoaW50IG5vZGUsIGludCBjaGlsZEluZGV4LCBpbnQgc3ViTGV2ZWxMaW1pdCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRJbnQoc3BsaXRCbG9ja1BvaW50ZXJBZGRyZXNzKG5vZGUsIGNoaWxkSW5kZXgsIHN1YkxldmVsTGltaXQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCYWNrdHJhY2tpbmcgc3RhdGUgZm9yIGEgY3Vyc29yLgorICAgICAqCisgICAgICogVG8gYXZvaWQgYWxsb2NhdGlvbnMgYW5kIHBvaW50ZXItY2hhc2luZywgdGhlIGJhY2t0cmFja2luZyBkYXRhIGlzIHN0b3JlZCBpbiBhIHNpbXBsZSBpbnQgYXJyYXkgd2l0aAorICAgICAqIEJBQ0tUUkFDS19JTlRTX1BFUl9FTlRSWSBpbnRzIGZvciBlYWNoIGxldmVsLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEN1cnNvckJhY2t0cmFja2luZ1N0YXRlCisgICAgeworICAgICAgICBzdGF0aWMgZmluYWwgaW50IEJBQ0tUUkFDS19JTlRTX1BFUl9FTlRSWSA9IDM7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQkFDS1RSQUNLX0lOSVRJQUxfU0laRSA9IDE2OworICAgICAgICBwcml2YXRlIGludFtdIGJhY2t0cmFjayA9IG5ldyBpbnRbQkFDS1RSQUNLX0lOSVRJQUxfU0laRSAqIEJBQ0tUUkFDS19JTlRTX1BFUl9FTlRSWV07CisgICAgICAgIGludCBiYWNrdHJhY2tEZXB0aCA9IDA7CisKKyAgICAgICAgdm9pZCBhZGRCYWNrdHJhY2soaW50IG5vZGUsIGludCBkYXRhLCBpbnQgZGVwdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiYWNrdHJhY2tEZXB0aCAqIEJBQ0tUUkFDS19JTlRTX1BFUl9FTlRSWSA+PSBiYWNrdHJhY2subGVuZ3RoKQorICAgICAgICAgICAgICAgIGJhY2t0cmFjayA9IEFycmF5cy5jb3B5T2YoYmFja3RyYWNrLCBiYWNrdHJhY2subGVuZ3RoICogMik7CisgICAgICAgICAgICBiYWNrdHJhY2tbYmFja3RyYWNrRGVwdGggKiBCQUNLVFJBQ0tfSU5UU19QRVJfRU5UUlkgKyAwXSA9IG5vZGU7CisgICAgICAgICAgICBiYWNrdHJhY2tbYmFja3RyYWNrRGVwdGggKiBCQUNLVFJBQ0tfSU5UU19QRVJfRU5UUlkgKyAxXSA9IGRhdGE7CisgICAgICAgICAgICBiYWNrdHJhY2tbYmFja3RyYWNrRGVwdGggKiBCQUNLVFJBQ0tfSU5UU19QRVJfRU5UUlkgKyAyXSA9IGRlcHRoOworICAgICAgICAgICAgKytiYWNrdHJhY2tEZXB0aDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBub2RlKGludCBiYWNrdHJhY2tEZXB0aCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGJhY2t0cmFja1tiYWNrdHJhY2tEZXB0aCAqIEJBQ0tUUkFDS19JTlRTX1BFUl9FTlRSWSArIDBdOworICAgICAgICB9CisKKyAgICAgICAgaW50IGRhdGEoaW50IGJhY2t0cmFja0RlcHRoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmFja3RyYWNrW2JhY2t0cmFja0RlcHRoICogQkFDS1RSQUNLX0lOVFNfUEVSX0VOVFJZICsgMV07CisgICAgICAgIH0KKworICAgICAgICBpbnQgZGVwdGgoaW50IGJhY2t0cmFja0RlcHRoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmFja3RyYWNrW2JhY2t0cmFja0RlcHRoICogQkFDS1RSQUNLX0lOVFNfUEVSX0VOVFJZICsgMl07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEN1cnNvciBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEluTWVtb3J5VHJpZSBjdXJzb3JzIG1haW50YWluIHRoZWlyIGJhY2t0cmFja2luZyBzdGF0ZSBpbiBDdXJzb3JCYWNrdHJhY2tpbmdTdGF0ZSB3aGVyZSB0aGV5IHN0b3JlCisgICAgICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5vZGUgdG8gYmFja3RyYWNrIHRvIGFuZCB0aGUgdHJhbnNpdGlvbnMgc3RpbGwgbGVmdCB0byB0YWtlIG9yIGF0dGVtcHQuCisgICAgICoKKyAgICAgKiBUaGlzIGluZm9ybWF0aW9uIGlzIGRpZmZlcmVudCBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBub2RlOgorICAgICAqIC0gZm9yIGxlYWYgYW5kIGNoYWluIG5vIGJhY2t0cmFja2luZyBpcyBzYXZlZCAoYmVjYXVzZSB3ZSBrbm93IHRoZXJlIGFyZSBubyBmdXJ0aGVyIHRyYW5zaXRpb25zKQorICAgICAqIC0gZm9yIHNwYXJzZSB3ZSBzdG9yZSB0aGUgcmVtYWluZGVyIG9mIHRoZSBvcmRlciB3b3JkCisgICAgICogLSBmb3Igc3BsaXQgd2Ugc3RvcmUgb25lIGVudHJ5IHBlciBzdWItbGV2ZWwgb2YgdGhlIDItMy0zIHNwbGl0CisgICAgICoKKyAgICAgKiBXaGVuIHRoZSBjdXJzb3IgaXMgYXNrZWQgdG8gYWR2YW5jZSBpdCBmaXJzdCBjaGVja3MgdGhlIGN1cnJlbnQgbm9kZSBmb3IgY2hpbGRyZW4sIGFuZCBpZiB0aGVyZSBhcmVuJ3QgYW55CisgICAgICogKGkuZS4gaXQgaXMgcG9zaXRpb25lZCBvbiBhIGxlYWYgbm9kZSksIGl0IGdvZXMgb25lIGxldmVsIHVwIHRoZSBiYWNrdHJhY2tpbmcgY2hhaW4sIHdoZXJlIHdlIGFyZSBndWFyYW50ZWVkIHRvCisgICAgICogaGF2ZSBhIHJlbWFpbmluZyBjaGlsZCB0byBhZHZhbmNlIHRvLiBXaGVuIHRoZXJlJ3Mgbm90aGluZyB0byBiYWNrdHJhY2sgdG8sIHRoZSB0cmllIGlzIGV4aGF1c3RlZC4KKyAgICAgKi8KKyAgICBjbGFzcyBNZW10YWJsZUN1cnNvciBleHRlbmRzIEN1cnNvckJhY2t0cmFja2luZ1N0YXRlIGltcGxlbWVudHMgQ3Vyc29yPFQ+CisgICAgeworICAgICAgICBwcml2YXRlIGludCBjdXJyZW50Tm9kZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgaW5jb21pbmdUcmFuc2l0aW9uOworICAgICAgICBwcml2YXRlIFQgY29udGVudDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgZGVwdGggPSAtMTsKKworICAgICAgICBNZW10YWJsZUN1cnNvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlc2NlbmRJbnRvKHJvb3QsIC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGFkdmFuY2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXNOdWxsT3JMZWFmKGN1cnJlbnROb2RlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gYmFja3RyYWNrKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGFkdmFuY2VUb0ZpcnN0Q2hpbGQoY3VycmVudE5vZGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgYWR2YW5jZU11bHRpcGxlKFRyYW5zaXRpb25zUmVjZWl2ZXIgcmVjZWl2ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBub2RlID0gY3VycmVudE5vZGU7CisgICAgICAgICAgICBpZiAoIWlzQ2hhaW5Ob2RlKG5vZGUpKQorICAgICAgICAgICAgICAgIHJldHVybiBhZHZhbmNlKCk7CisKKyAgICAgICAgICAgIC8vIEp1bXAgZGlyZWN0bHkgdG8gdGhlIGNoYWluJ3MgY2hpbGQuCisgICAgICAgICAgICBVbnNhZmVCdWZmZXIgY2h1bmsgPSBnZXRDaHVuayhub2RlKTsKKyAgICAgICAgICAgIGludCBpbkNodW5rTm9kZSA9IGluQ2h1bmtQb2ludGVyKG5vZGUpOworICAgICAgICAgICAgaW50IGJ5dGVzSnVtcGVkID0gY2hhaW5CbG9ja0xlbmd0aChub2RlKSAtIDE7ICAgLy8gbGVhdmUgdGhlIGxhc3QgYnl0ZSBmb3IgaW5jb21pbmdUcmFuc2l0aW9uCisgICAgICAgICAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCAmJiBieXRlc0p1bXBlZCA+IDApCisgICAgICAgICAgICAgICAgcmVjZWl2ZXIuYWRkUGF0aEJ5dGVzKGNodW5rLCBpbkNodW5rTm9kZSwgYnl0ZXNKdW1wZWQpOworICAgICAgICAgICAgZGVwdGggKz0gYnl0ZXNKdW1wZWQ7ICAgIC8vIGRlc2NlbmRJbnRvIHdpbGwgYWRkIG9uZQorICAgICAgICAgICAgaW5DaHVua05vZGUgKz0gYnl0ZXNKdW1wZWQ7CisKKyAgICAgICAgICAgIC8vIGluQ2h1bmtOb2RlIGlzIG5vdyBwb3NpdGlvbmVkIG9uIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIGNoYWluLgorICAgICAgICAgICAgLy8gQ29uc3VtZSBpdCB0byBiZSB0aGUgbmV3IHN0YXRlJ3MgaW5jb21pbmdUcmFuc2l0aW9uLgorICAgICAgICAgICAgaW50IHRyYW5zaXRpb24gPSBjaHVuay5nZXRCeXRlKGluQ2h1bmtOb2RlKyspICYgMHhGRjsKKyAgICAgICAgICAgIC8vIGluQ2h1bmtOb2RlIGlzIG5vdyBwb3NpdGlvbmVkIG9uIHRoZSBjaGlsZCBwb2ludGVyLgorICAgICAgICAgICAgaW50IGNoaWxkID0gY2h1bmsuZ2V0SW50KGluQ2h1bmtOb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBkZXNjZW5kSW50byhjaGlsZCwgdHJhbnNpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBza2lwQ2hpbGRyZW4oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmFja3RyYWNrKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBkZXB0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZXB0aDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVCBjb250ZW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBpbmNvbWluZ1RyYW5zaXRpb24oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaW5jb21pbmdUcmFuc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgYmFja3RyYWNrKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKC0tYmFja3RyYWNrRGVwdGggPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBkZXB0aCA9IC0xOworCisgICAgICAgICAgICBkZXB0aCA9IGRlcHRoKGJhY2t0cmFja0RlcHRoKTsKKyAgICAgICAgICAgIHJldHVybiBhZHZhbmNlVG9OZXh0Q2hpbGQobm9kZShiYWNrdHJhY2tEZXB0aCksIGRhdGEoYmFja3RyYWNrRGVwdGgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IGFkdmFuY2VUb0ZpcnN0Q2hpbGQoaW50IG5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCAoIWlzTnVsbE9yTGVhZihub2RlKSk7CisKKyAgICAgICAgICAgIHN3aXRjaCAob2Zmc2V0KG5vZGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgU1BMSVRfT0ZGU0VUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzY2VuZEluU3BsaXRTdWJsZXZlbChub2RlLCBTUExJVF9TVEFSVF9MRVZFTF9MSU1JVCwgMCwgU1BMSVRfTEVWRUxfU0hJRlQgKiAyKTsKKyAgICAgICAgICAgICAgICBjYXNlIFNQQVJTRV9PRkZTRVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0VmFsaWRTcGFyc2VUcmFuc2l0aW9uKG5vZGUsIGdldFVuc2lnbmVkU2hvcnQobm9kZSArIFNQQVJTRV9PUkRFUl9PRkZTRVQpKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2hhaW5UcmFuc2l0aW9uKG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgYWR2YW5jZVRvTmV4dENoaWxkKGludCBub2RlLCBpbnQgZGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0ICghaXNOdWxsT3JMZWFmKG5vZGUpKTsKKworICAgICAgICAgICAgc3dpdGNoIChvZmZzZXQobm9kZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBTUExJVF9PRkZTRVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0VmFsaWRTcGxpdFRyYW5zaXRpb24obm9kZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgY2FzZSBTUEFSU0VfT0ZGU0VUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFZhbGlkU3BhcnNlVHJhbnNpdGlvbihub2RlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIlVuZXhwZWN0ZWQgbm9kZSB0eXBlIGluIGJhY2t0cmFjayBzdGF0ZS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZXNjZW5kIGludG8gdGhlIHN1Yi1sZXZlbHMgb2YgYSBzcGxpdCBub2RlLiBBZHZhbmNlcyB0byB0aGUgZmlyc3QgY2hpbGQgYW5kIGNyZWF0ZXMgYmFja3RyYWNraW5nIGVudHJpZXMKKyAgICAgICAgICogZm9yIHRoZSBmb2xsb3dpbmcgb25lcy4gV2UgdXNlIHRoZSBiaXRzIG9mIHRyYW5zIChsb3dlc3Qgbm9uLXplcm8gb25lcykgdG8gaWRlbnRpZnkgd2hpY2ggc3ViLWxldmVsIGFuCisgICAgICAgICAqIGVudHJ5IHJlZmVycyB0by4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgb3IgYmxvY2sgaWQsIG11c3QgaGF2ZSBvZmZzZXQgU1BMSVRfT0ZGU0VULgorICAgICAgICAgKiBAcGFyYW0gbGltaXQgVGhlIHRyYW5zaXRpb24gbGltaXQgZm9yIHRoZSBjdXJyZW50IHN1Yi1sZXZlbCAoNCBmb3IgdGhlIHN0YXJ0LCA4IGZvciB0aGUgb3RoZXJzKS4KKyAgICAgICAgICogQHBhcmFtIGNvbGxlY3RlZCBUaGUgdHJhbnNpdGlvbiBiaXRzIGNvbGxlY3RlZCBmcm9tIHRoZSBwYXJlbnQgY2hhaW4gKGUuZy4gMHg0MCBhZnRlciBmb2xsb3dpbmcgMSBvbiB0aGUgdG9wCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgc3ViLWxldmVsKS4KKyAgICAgICAgICogQHBhcmFtIHNoaWZ0IFRoaXMgbGV2ZWwncyBiaXQgc2hpZnQgKDYgZm9yIHN0YXJ0LCAzIGZvciBtaWQgYW5kIDAgZm9yIHRhaWwpLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBkZXB0aCByZWFjaGVkIGFmdGVyIGRlc2NlbmRpbmcuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGludCBkZXNjZW5kSW5TcGxpdFN1YmxldmVsKGludCBub2RlLCBpbnQgbGltaXQsIGludCBjb2xsZWN0ZWQsIGludCBzaGlmdCkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IG9mZnNldChub2RlKSA9PSBTUExJVF9PRkZTRVQ7CisgICAgICAgICAgICAgICAgaW50IGNoaWxkSW5kZXg7CisgICAgICAgICAgICAgICAgaW50IGNoaWxkID0gTk9ORTsKKyAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBmaXJzdCBub24tbnVsbCBjaGlsZAorICAgICAgICAgICAgICAgIGZvciAoY2hpbGRJbmRleCA9IDA7IGNoaWxkSW5kZXggPCBsaW1pdDsgKytjaGlsZEluZGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBnZXRTcGxpdEJsb2NrUG9pbnRlcihub2RlLCBjaGlsZEluZGV4LCBsaW1pdCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNOdWxsKGNoaWxkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBjaGlsZAorICAgICAgICAgICAgICAgIGFzc2VydCBjaGlsZEluZGV4IDwgbGltaXQgJiYgY2hpbGQgIT0gTk9ORTsKKworICAgICAgICAgICAgICAgIC8vIGxvb2sgZm9yIGFueSBtb3JlIHZhbGlkIHRyYW5zaXRpb25zIGFuZCBhZGQgYmFja3RyYWNraW5nIGlmIGZvdW5kCisgICAgICAgICAgICAgICAgbWF5YmVBZGRTcGxpdEJhY2t0cmFjayhub2RlLCBjaGlsZEluZGV4LCBsaW1pdCwgY29sbGVjdGVkLCBzaGlmdCk7CisKKyAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIGJpdHMganVzdCBmb3VuZAorICAgICAgICAgICAgICAgIGNvbGxlY3RlZCB8PSBjaGlsZEluZGV4IDw8IHNoaWZ0OworICAgICAgICAgICAgICAgIC8vIGRlc2NlbmQgdG8gbmV4dCBzdWItbGV2ZWwgb3IgY2hpbGQKKyAgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NlbmRJbnRvKGNoaWxkLCBjb2xsZWN0ZWQpOworICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggbmV4dCBzdWJsZXZlbDsgc2FtZSBhcworICAgICAgICAgICAgICAgIC8vIHJldHVybiBkZXNjZW5kSW5TcGxpdFN1YmxldmVsKGNoaWxkICsgU1BMSVRfT0ZGU0VULCA4LCBjb2xsZWN0ZWQsIHNoaWZ0IC0gMykKKyAgICAgICAgICAgICAgICBub2RlID0gY2hpbGQ7CisgICAgICAgICAgICAgICAgbGltaXQgPSBTUExJVF9PVEhFUl9MRVZFTF9MSU1JVDsKKyAgICAgICAgICAgICAgICBzaGlmdCAtPSBTUExJVF9MRVZFTF9TSElGVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBCYWNrdHJhY2sgdG8gYSBzcGxpdCBzdWItbGV2ZWwuIFRoZSBsZXZlbCBpcyBpZGVudGlmaWVkIGJ5IHRoZSBsb3dlc3Qgbm9uLTAgYml0cyBpbiB0cmFucy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgaW50IG5leHRWYWxpZFNwbGl0VHJhbnNpdGlvbihpbnQgbm9kZSwgaW50IHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgdHJhbnMgPj0gMCAmJiB0cmFucyA8PSAweEZGOworICAgICAgICAgICAgaW50IGNoaWxkSW5kZXggPSBzcGxpdE5vZGVDaGlsZEluZGV4KHRyYW5zKTsKKyAgICAgICAgICAgIGlmIChjaGlsZEluZGV4ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYXliZUFkZFNwbGl0QmFja3RyYWNrKG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BMSVRfT1RIRVJfTEVWRUxfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyAmIC0oMSA8PCAoU1BMSVRfTEVWRUxfU0hJRlQgKiAxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUExJVF9MRVZFTF9TSElGVCAqIDApOworICAgICAgICAgICAgICAgIGludCBjaGlsZCA9IGdldFNwbGl0QmxvY2tQb2ludGVyKG5vZGUsIGNoaWxkSW5kZXgsIFNQTElUX09USEVSX0xFVkVMX0xJTUlUKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVzY2VuZEludG8oY2hpbGQsIHRyYW5zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCB0YWlsSW5kZXggPSBzcGxpdE5vZGVUYWlsSW5kZXgodHJhbnMpOworICAgICAgICAgICAgaWYgKHRhaWxJbmRleCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWF5YmVBZGRTcGxpdEJhY2t0cmFjayhub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFpbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BMSVRfT1RIRVJfTEVWRUxfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyAmIC0oMSA8PCAoU1BMSVRfTEVWRUxfU0hJRlQgKiAyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUExJVF9MRVZFTF9TSElGVCAqIDEpOworICAgICAgICAgICAgICAgIGludCB0YWlsID0gZ2V0U3BsaXRCbG9ja1BvaW50ZXIobm9kZSwgdGFpbEluZGV4LCBTUExJVF9PVEhFUl9MRVZFTF9MSU1JVCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NlbmRJblNwbGl0U3VibGV2ZWwodGFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUExJVF9PVEhFUl9MRVZFTF9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUExJVF9MRVZFTF9TSElGVCAqIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IG1pZEluZGV4ID0gc3BsaXROb2RlTWlkSW5kZXgodHJhbnMpOworICAgICAgICAgICAgYXNzZXJ0IG1pZEluZGV4ID4gMDsKKyAgICAgICAgICAgIG1heWJlQWRkU3BsaXRCYWNrdHJhY2sobm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlkSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQTElUX1NUQVJUX0xFVkVMX0xJTUlULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUExJVF9MRVZFTF9TSElGVCAqIDIpOworICAgICAgICAgICAgaW50IG1pZCA9IGdldFNwbGl0QmxvY2tQb2ludGVyKG5vZGUsIG1pZEluZGV4LCBTUExJVF9TVEFSVF9MRVZFTF9MSU1JVCk7CisgICAgICAgICAgICByZXR1cm4gZGVzY2VuZEluU3BsaXRTdWJsZXZlbChtaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUExJVF9PVEhFUl9MRVZFTF9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BMSVRfTEVWRUxfU0hJRlQgKiAxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBMb29rIGZvciBhbnkgZnVydGhlciBub24tbnVsbCB0cmFuc2l0aW9ucyBvbiB0aGlzIHN1Yi1sZXZlbCBhbmQsIGlmIGZvdW5kLCBhZGQgYSBiYWNrdHJhY2tpbmcgZW50cnkuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgbWF5YmVBZGRTcGxpdEJhY2t0cmFjayhpbnQgbm9kZSwgaW50IHN0YXJ0QWZ0ZXIsIGludCBsaW1pdCwgaW50IGNvbGxlY3RlZCwgaW50IHNoaWZ0KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbmV4dENoaWxkSW5kZXg7CisgICAgICAgICAgICBmb3IgKG5leHRDaGlsZEluZGV4ID0gc3RhcnRBZnRlciArIDE7IG5leHRDaGlsZEluZGV4IDwgbGltaXQ7ICsrbmV4dENoaWxkSW5kZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFpc051bGwoZ2V0U3BsaXRCbG9ja1BvaW50ZXIobm9kZSwgbmV4dENoaWxkSW5kZXgsIGxpbWl0KSkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5leHRDaGlsZEluZGV4IDwgbGltaXQpCisgICAgICAgICAgICAgICAgYWRkQmFja3RyYWNrKG5vZGUsIGNvbGxlY3RlZCB8IChuZXh0Q2hpbGRJbmRleCA8PCBzaGlmdCksIGRlcHRoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IG5leHRWYWxpZFNwYXJzZVRyYW5zaXRpb24oaW50IG5vZGUsIGludCBkYXRhKQorICAgICAgICB7CisgICAgICAgICAgICBVbnNhZmVCdWZmZXIgY2h1bmsgPSBnZXRDaHVuayhub2RlKTsKKyAgICAgICAgICAgIGludCBpbkNodW5rTm9kZSA9IGluQ2h1bmtQb2ludGVyKG5vZGUpOworCisgICAgICAgICAgICAvLyBQZWVsIG9mZiB0aGUgbmV4dCBpbmRleC4KKyAgICAgICAgICAgIGludCBpbmRleCA9IGRhdGEgJSBTUEFSU0VfQ0hJTERfQ09VTlQ7CisgICAgICAgICAgICBkYXRhID0gZGF0YSAvIFNQQVJTRV9DSElMRF9DT1VOVDsKKworICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIHJlbWFpbmluZyB0cmFuc2l0aW9ucywgYWRkIGJhY2t0cmFja2luZyBlbnRyeS4KKyAgICAgICAgICAgIGlmIChkYXRhID4gMCkKKyAgICAgICAgICAgICAgICBhZGRCYWNrdHJhY2sobm9kZSwgZGF0YSwgZGVwdGgpOworCisgICAgICAgICAgICAvLyBGb2xsb3cgdGhlIHRyYW5zaXRpb24uCisgICAgICAgICAgICBpbnQgY2hpbGQgPSBjaHVuay5nZXRJbnQoaW5DaHVua05vZGUgKyBTUEFSU0VfQ0hJTERSRU5fT0ZGU0VUICsgaW5kZXggKiA0KTsKKyAgICAgICAgICAgIGludCB0cmFuc2l0aW9uID0gY2h1bmsuZ2V0Qnl0ZShpbkNodW5rTm9kZSArIFNQQVJTRV9CWVRFU19PRkZTRVQgKyBpbmRleCkgJiAweEZGOworICAgICAgICAgICAgcmV0dXJuIGRlc2NlbmRJbnRvKGNoaWxkLCB0cmFuc2l0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IGdldENoYWluVHJhbnNpdGlvbihpbnQgbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm8gYmFja3RyYWNraW5nIG5lZWRlZC4KKyAgICAgICAgICAgIFVuc2FmZUJ1ZmZlciBjaHVuayA9IGdldENodW5rKG5vZGUpOworICAgICAgICAgICAgaW50IGluQ2h1bmtOb2RlID0gaW5DaHVua1BvaW50ZXIobm9kZSk7CisgICAgICAgICAgICBpbnQgdHJhbnNpdGlvbiA9IGNodW5rLmdldEJ5dGUoaW5DaHVua05vZGUpICYgMHhGRjsKKyAgICAgICAgICAgIGludCBuZXh0ID0gbm9kZSArIDE7CisgICAgICAgICAgICBpZiAob2Zmc2V0KG5leHQpIDw9IENIQUlOX01BWF9PRkZTRVQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NlbmRJbnRvQ2hhaW4obmV4dCwgdHJhbnNpdGlvbik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NlbmRJbnRvKGNodW5rLmdldEludChpbkNodW5rTm9kZSArIDEpLCB0cmFuc2l0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IGRlc2NlbmRJbnRvKGludCBjaGlsZCwgaW50IHRyYW5zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgICsrZGVwdGg7CisgICAgICAgICAgICBpbmNvbWluZ1RyYW5zaXRpb24gPSB0cmFuc2l0aW9uOworICAgICAgICAgICAgY29udGVudCA9IGdldE5vZGVDb250ZW50KGNoaWxkKTsKKyAgICAgICAgICAgIGN1cnJlbnROb2RlID0gZm9sbG93Q29udGVudFRyYW5zaXRpb24oY2hpbGQpOworICAgICAgICAgICAgcmV0dXJuIGRlcHRoOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgZGVzY2VuZEludG9DaGFpbihpbnQgY2hpbGQsIGludCB0cmFuc2l0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICArK2RlcHRoOworICAgICAgICAgICAgaW5jb21pbmdUcmFuc2l0aW9uID0gdHJhbnNpdGlvbjsKKyAgICAgICAgICAgIGNvbnRlbnQgPSBudWxsOworICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjaGlsZDsKKyAgICAgICAgICAgIHJldHVybiBkZXB0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0NoYWluTm9kZShpbnQgbm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiAhaXNOdWxsT3JMZWFmKG5vZGUpICYmIG9mZnNldChub2RlKSA8PSBDSEFJTl9NQVhfT0ZGU0VUOworICAgIH0KKworICAgIHB1YmxpYyBNZW10YWJsZUN1cnNvciBjdXJzb3IoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZW10YWJsZUN1cnNvcigpOworICAgIH0KKworICAgIC8qCisgICAgIERpcmVjdCByZWFkIG1ldGhvZHMKKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY29udGVudCBtYXBwZWQgYnkgdGhlIHNwZWNpZmllZCBrZXkuCisgICAgICogRmFzdCBpbXBsZW1lbnRhdGlvbiB1c2luZyBpbnRlZ2VyIG5vZGUgYWRkcmVzc2VzLgorICAgICAqLworICAgIHB1YmxpYyBUIGdldChCeXRlQ29tcGFyYWJsZSBwYXRoKQorICAgIHsKKyAgICAgICAgaW50IG4gPSByb290OworICAgICAgICBCeXRlU291cmNlIHNvdXJjZSA9IHBhdGguYXNDb21wYXJhYmxlQnl0ZXMoQllURV9DT01QQVJBQkxFX1ZFUlNJT04pOworICAgICAgICB3aGlsZSAoIWlzTnVsbChuKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGMgPSBzb3VyY2UubmV4dCgpOworICAgICAgICAgICAgaWYgKGMgPT0gQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybiBnZXROb2RlQ29udGVudChuKTsKKworICAgICAgICAgICAgbiA9IGFkdmFuY2UobiwgYywgc291cmNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzTnVsbChyb290KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSBvZiBkdW1wIHRvIHByb3ZpZGUgbW9yZSBkZXRhaWxlZCBwcmludG91dCB0aGF0IGluY2x1ZGVzIHRoZSB0eXBlIG9mIGVhY2ggbm9kZSBpbiB0aGUgdHJpZS4KKyAgICAgKiBXZSBkbyB0aGlzIHZpYSBhIHdyYXBwaW5nIGN1cnNvciB0aGF0IHJldHVybnMgYSBjb250ZW50IHN0cmluZyBmb3IgdGhlIHR5cGUgb2Ygbm9kZSBmb3IgZXZlcnkgbm9kZSB3ZSByZXR1cm4uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBkdW1wKEZ1bmN0aW9uPFQsIFN0cmluZz4gY29udGVudFRvU3RyaW5nKQorICAgIHsKKyAgICAgICAgTWVtdGFibGVDdXJzb3Igc291cmNlID0gY3Vyc29yKCk7CisgICAgICAgIGNsYXNzIFR5cGVkTm9kZXNDdXJzb3IgaW1wbGVtZW50cyBDdXJzb3I8U3RyaW5nPgorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgYWR2YW5jZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5hZHZhbmNlKCk7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IGFkdmFuY2VNdWx0aXBsZShUcmFuc2l0aW9uc1JlY2VpdmVyIHJlY2VpdmVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2UuYWR2YW5jZU11bHRpcGxlKHJlY2VpdmVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IHNraXBDaGlsZHJlbigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5za2lwQ2hpbGRyZW4oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IGRlcHRoKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlLmRlcHRoKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGludCBpbmNvbWluZ1RyYW5zaXRpb24oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2UuaW5jb21pbmdUcmFuc2l0aW9uKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBjb250ZW50KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IG51bGw7CisgICAgICAgICAgICAgICAgaW50IG5vZGUgPSBzb3VyY2UuY3VycmVudE5vZGU7CisgICAgICAgICAgICAgICAgaWYgKCFpc051bGxPckxlYWYobm9kZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9mZnNldChub2RlKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTUEFSU0VfT0ZGU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiW1NQQVJTRV0iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTUExJVF9PRkZTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJbU1BMSVRdIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUFJFRklYX09GRlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIlVuZXhwZWN0ZWQgcHJlZml4IGFzIGN1cnNvciBjdXJyZW50Tm9kZS4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJbQ0hBSU5dIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBUIGNvbnRlbnQgPSBzb3VyY2UuY29udGVudCgpOworICAgICAgICAgICAgICAgIGlmIChjb250ZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRUb1N0cmluZy5hcHBseShjb250ZW50KSArICIgLT4gIiArIHR5cGU7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50VG9TdHJpbmcuYXBwbHkoY29udGVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHByb2Nlc3MobmV3IFRyaWVEdW1wZXI8PihGdW5jdGlvbi5pZGVudGl0eSgpKSwgbmV3IFR5cGVkTm9kZXNDdXJzb3IoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWYyOGMzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLmphdmEKQEAgLTAsMCArMSwxMDI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllczsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZUFycmF5OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CisKK2ltcG9ydCBvcmcuYWdyb25hLmNvbmN1cnJlbnQuVW5zYWZlQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQnVmZmVyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk9iamVjdFNpemVzOworaW1wb3J0IG9yZy5naXRodWIuamFtbS5NZW1vcnlMYXlvdXRTcGVjaWZpY2F0aW9uOworCisvKioKKyAqIEluLW1lbW9yeSB0cmllIGJ1aWx0IGZvciBmYXN0IG1vZGlmaWNhdGlvbiBhbmQgcmVhZHMgZXhlY3V0aW5nIGNvbmN1cnJlbnRseSB3aXRoIHdyaXRlcyBmcm9tIGEgc2luZ2xlIG11dGF0b3IgdGhyZWFkLgorICoKKyAqIFRoaXMgY2xhc3MgY2FuIGN1cnJlbnRseSBvbmx5IHByb3ZpZGUgYXRvbWljaXR5IChpLmUuIHJlYWRzIHNlZWluZyBlaXRoZXIgdGhlIGNvbnRlbnQgYmVmb3JlIGEgd3JpdGUsIG9yIHRoZQorICogY29udGVudCBhZnRlciBpdDsgYW55IHJlYWQgc2VlaW5nIHRoZSB3cml0ZSBlbmZvcmNpbmcgYW55IHN1YnNlcXVlbnQgKGkuZS4gc3RhcnRlZCBhZnRlciBpdCBjb21wbGV0ZWQpIHJlYWRzIHRvCisgKiBhbHNvIHNlZSBpdCkgZm9yIHNpbmdsZXRvbiB3cml0ZXMgKGkuZS4gY2FsbHMgdG8ge0BsaW5rICNwdXRSZWN1cnNpdmV9LCB7QGxpbmsgI3B1dFNpbmdsZXRvbn0gb3Ige0BsaW5rICNhcHBseX0KKyAqIHdpdGggYSBzaW5nbGV0b24gdHJpZSBhcyBhcmd1bWVudCkuCisgKgorICogQmVjYXVzZSBpdCB1c2VzIDMyLWJpdCBwb2ludGVycyBpbiBieXRlIGJ1ZmZlcnMsIHRoaXMgdHJpZSBoYXMgYSBmaXhlZCBzaXplIGxpbWl0IG9mIDJHQi4KKyAqLworcHVibGljIGNsYXNzIEluTWVtb3J5VHJpZTxUPiBleHRlbmRzIEluTWVtb3J5UmVhZFRyaWU8VD4KK3sKKyAgICAvLyBTZWUgdGhlIHRyaWUgZm9ybWF0IGRlc2NyaXB0aW9uIGluIEluTWVtb3J5UmVhZFRyaWUuCisKKyAgICAvKioKKyAgICAgKiBUcmllIHNpemUgbGltaXQuIFRoaXMgaXMgbm90IGVuZm9yY2VkLCBidXQgdXNlcnMgbXVzdCBjaGVjayBmcm9tIHRpbWUgdG8gdGltZSB0aGF0IGl0IGlzIG5vdCBleGNlZWRlZCAodXNpbmcKKyAgICAgKiB7QGxpbmsgI3JlYWNoZWRBbGxvY2F0ZWRTaXplVGhyZXNob2xkKCl9KSBhbmQgc3RhcnQgc3dpdGNoaW5nIHRvIGEgbmV3IHRyaWUgaWYgaXQgaXMuCisgICAgICogVGhpcyBtdXN0IGJlIGRvbmUgdG8gYXZvaWQgdHJpZXMgZ3Jvd2luZyBiZXlvbmQgdGhlaXIgaGFyZCAyR0Igc2l6ZSBsaW1pdCAoZHVlIHRvIHRoZSAzMi1iaXQgcG9pbnRlcnMpLgorICAgICAqLworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHN0YXRpYyBmaW5hbCBpbnQgQUxMT0NBVEVEX1NJWkVfVEhSRVNIT0xEOworICAgIHN0YXRpYworICAgIHsKKyAgICAgICAgLy8gRGVmYXVsdCB0aHJlc2hvbGQgKyAxMCUgPT0gMiBHQi4gVGhpcyBzaG91bGQgZ2l2ZSB0aGUgb3duZXIgZW5vdWdoIHRpbWUgdG8gcmVhY3QgdG8gdGhlCisgICAgICAgIC8vIHtAbGluayAjcmVhY2hlZEFsbG9jYXRlZFNpemVUaHJlc2hvbGQoKX0gc2lnbmFsIGFuZCBzd2l0Y2ggdGhpcyB0cmllIG91dCBiZWZvcmUgaXQgZmlsbHMgdXAuCisgICAgICAgIGludCBsaW1pdEluTUIgPSBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTUVNVEFCTEVfT1ZFUkhFQURfU0laRS5nZXRJbnQoMjA0OCAqIDEwIC8gMTEpOworICAgICAgICBpZiAobGltaXRJbk1CIDwgMSB8fCBsaW1pdEluTUIgPiAyMDQ3KQorICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5NRU1UQUJMRV9PVkVSSEVBRF9TSVpFLmdldEtleSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG11c3QgYmUgd2l0aGluIDEgYW5kIDIwNDciKTsKKyAgICAgICAgQUxMT0NBVEVEX1NJWkVfVEhSRVNIT0xEID0gMTAyNCAqIDEwMjQgKiBsaW1pdEluTUI7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgYWxsb2NhdGVkUG9zID0gMDsKKyAgICBwcml2YXRlIGludCBjb250ZW50Q291bnQgPSAwOworCisgICAgcHJpdmF0ZSBmaW5hbCBCdWZmZXJUeXBlIGJ1ZmZlclR5cGU7ICAgIC8vIG9uIG9yIG9mZiBoZWFwCisKKyAgICAvLyBjb25zdGFudHMgZm9yIHNwYWNlIGNhbGN1bGF0aW9ucworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRU1QVFlfU0laRV9PTl9IRUFQOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRU1QVFlfU0laRV9PRkZfSEVBUDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFJFRkVSRU5DRV9BUlJBWV9PTl9IRUFQX1NJWkUgPSBPYmplY3RTaXplcy5tZWFzdXJlRGVlcChuZXcgQXRvbWljUmVmZXJlbmNlQXJyYXk8PigwKSk7CisKKyAgICBzdGF0aWMKKyAgICB7CisgICAgICAgIEluTWVtb3J5VHJpZTxPYmplY3Q+IGVtcHR5ID0gbmV3IEluTWVtb3J5VHJpZTw+KEJ1ZmZlclR5cGUuT05fSEVBUCk7CisgICAgICAgIEVNUFRZX1NJWkVfT05fSEVBUCA9IE9iamVjdFNpemVzLm1lYXN1cmVEZWVwKGVtcHR5KTsKKyAgICAgICAgZW1wdHkgPSBuZXcgSW5NZW1vcnlUcmllPD4oQnVmZmVyVHlwZS5PRkZfSEVBUCk7CisgICAgICAgIEVNUFRZX1NJWkVfT0ZGX0hFQVAgPSBPYmplY3RTaXplcy5tZWFzdXJlRGVlcChlbXB0eSk7CisgICAgfQorCisgICAgcHVibGljIEluTWVtb3J5VHJpZShCdWZmZXJUeXBlIGJ1ZmZlclR5cGUpCisgICAgeworICAgICAgICBzdXBlcihuZXcgVW5zYWZlQnVmZmVyWzMxIC0gQlVGX1NUQVJUX1NISUZUXSwgIC8vIGxhc3Qgb25lIGlzIDFHIGZvciBhIHRvdGFsIG9mIH4yRyBieXRlcworICAgICAgICAgICAgICBuZXcgQXRvbWljUmVmZXJlbmNlQXJyYXlbMjkgLSBDT05URU5UU19TVEFSVF9TSElGVF0sICAvLyB0YWtlcyBhdCBsZWFzdCA0IGJ5dGVzIHRvIHdyaXRlIHBvaW50ZXIgdG8gb25lIGNvbnRlbnQgLT4gNCB0aW1lcyBzbWFsbGVyIHRoYW4gYnVmZmVycworICAgICAgICAgICAgICBOT05FKTsKKyAgICAgICAgdGhpcy5idWZmZXJUeXBlID0gYnVmZmVyVHlwZTsKKyAgICB9CisKKyAgICAvLyBCdWZmZXIsIGNvbnRlbnQgbGlzdCBhbmQgYmxvY2sgbWFuYWdlbWVudAorCisgICAgLyoqCisgICAgICogQmVjYXVzZSB3ZSB1c2UgYnVmZmVycyBhbmQgMzItYml0IHBvaW50ZXJzLCB0aGUgdHJpZSBjYW5ub3QgZ3JvdyBvdmVyIDJHQiBvZiBzaXplLiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYKKyAgICAgKiBhIHRyaWUgb3BlcmF0aW9uIG5lZWRzIGl0IHRvIGdyb3cgb3ZlciB0aGF0IGxpbWl0LgorICAgICAqCisgICAgICogVG8gYXZvaWQgdGhpcyBwcm9ibGVtLCB1c2VycyBzaG91bGQgcXVlcnkge0BsaW5rICNyZWFjaGVkQWxsb2NhdGVkU2l6ZVRocmVzaG9sZH0gZnJvbSB0aW1lIHRvIHRpbWUuIElmIHRoZSBjYWxsCisgICAgICogcmV0dXJucyB0cnVlLCB0aGV5IHNob3VsZCBzd2l0Y2ggdG8gYSBuZXcgdHJpZSAoZS5nLiBieSBmbHVzaGluZyBhIG1lbXRhYmxlKSBhcyBzb29uIGFzIHBvc3NpYmxlLiBUaGUgdGhyZXNob2xkCisgICAgICogaXMgY29uZmlndXJhYmxlLCBhbmQgaXMgc2V0IGJ5IGRlZmF1bHQgdG8gMTAlIHVuZGVyIHRoZSAyR0IgbGltaXQgdG8gZ2l2ZSBhbXBsZSB0aW1lIGZvciB0aGUgc3dpdGNoIHRvIGhhcHBlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcigiVGhlIGhhcmQgMkdCIGxpbWl0IG9uIHRyaWUgc2l6ZSBoYXMgYmVlbiBleGNlZWRlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgZmluYWwgdm9pZCBwdXRJbnQoaW50IHBvcywgaW50IHZhbHVlKQorICAgIHsKKyAgICAgICAgZ2V0Q2h1bmsocG9zKS5wdXRJbnQoaW5DaHVua1BvaW50ZXIocG9zKSwgdmFsdWUpOworICAgIH0KKworICAgIGZpbmFsIHZvaWQgcHV0SW50Vm9sYXRpbGUoaW50IHBvcywgaW50IHZhbHVlKQorICAgIHsKKyAgICAgICAgZ2V0Q2h1bmsocG9zKS5wdXRJbnRWb2xhdGlsZShpbkNodW5rUG9pbnRlcihwb3MpLCB2YWx1ZSk7CisgICAgfQorCisgICAgZmluYWwgdm9pZCBwdXRTaG9ydChpbnQgcG9zLCBzaG9ydCB2YWx1ZSkKKyAgICB7CisgICAgICAgIGdldENodW5rKHBvcykucHV0U2hvcnQoaW5DaHVua1BvaW50ZXIocG9zKSwgdmFsdWUpOworICAgIH0KKworICAgIGZpbmFsIHZvaWQgcHV0U2hvcnRWb2xhdGlsZShpbnQgcG9zLCBzaG9ydCB2YWx1ZSkKKyAgICB7CisgICAgICAgIGdldENodW5rKHBvcykucHV0U2hvcnQoaW5DaHVua1BvaW50ZXIocG9zKSwgdmFsdWUpOworICAgIH0KKworICAgIGZpbmFsIHZvaWQgcHV0Qnl0ZShpbnQgcG9zLCBieXRlIHZhbHVlKQorICAgIHsKKyAgICAgICAgZ2V0Q2h1bmsocG9zKS5wdXRCeXRlKGluQ2h1bmtQb2ludGVyKHBvcyksIHZhbHVlKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgaW50IGFsbG9jYXRlQmxvY2soKSB0aHJvd3MgU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIE5vdGU6IElmIHRoaXMgbWV0aG9kIGlzIG1vZGlmaWVkLCBwbGVhc2UgcnVuIEluTWVtb3J5VHJpZVRlc3QudGVzdE92ZXIxR1NpemUgdG8gdmVyaWZ5IGl0IGFjdHMgY29ycmVjdGx5CisgICAgICAgIC8vIGNsb3NlIHRvIHRoZSAyRyBsaW1pdC4KKyAgICAgICAgaW50IHYgPSBhbGxvY2F0ZWRQb3M7CisgICAgICAgIGlmIChpbkNodW5rUG9pbnRlcih2KSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbGVhZEJpdCA9IGdldENodW5rSWR4KHYsIEJVRl9TVEFSVF9TSElGVCwgQlVGX1NUQVJUX1NJWkUpOworICAgICAgICAgICAgaWYgKGxlYWRCaXQgKyBCVUZfU1RBUlRfU0hJRlQgPT0gMzEpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgbmV3QnVmZmVyID0gYnVmZmVyVHlwZS5hbGxvY2F0ZShCVUZfU1RBUlRfU0laRSA8PCBsZWFkQml0KTsKKyAgICAgICAgICAgIGJ1ZmZlcnNbbGVhZEJpdF0gPSBuZXcgVW5zYWZlQnVmZmVyKG5ld0J1ZmZlcik7CisgICAgICAgICAgICAvLyBOb3RlOiBTaW5jZSB3ZSBhcmUgbm90IG1vdmluZyBleGlzdGluZyBkYXRhIHRvIGEgbmV3IGJ1ZmZlciwgd2UgYXJlIG9rYXkgd2l0aCBubyBoYXBwZW5zLWJlZm9yZSBlbmZvcmNpbmcKKyAgICAgICAgICAgIC8vIHdyaXRlcy4gQW55IHJlYWRlciB0aGF0IHNlZXMgYSBwb2ludGVyIGluIHRoZSBuZXcgYnVmZmVyIG1heSBvbmx5IGRvIHNvIGFmdGVyIHJlYWRpbmcgdGhlIHZvbGF0aWxlIHdyaXRlCisgICAgICAgICAgICAvLyB0aGF0IGF0dGFjaGVkIHRoZSBuZXcgcGF0aC4KKyAgICAgICAgfQorCisgICAgICAgIGFsbG9jYXRlZFBvcyArPSBCTE9DS19TSVpFOworICAgICAgICByZXR1cm4gdjsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBhZGRDb250ZW50KFQgdmFsdWUpCisgICAgeworICAgICAgICBpbnQgaW5kZXggPSBjb250ZW50Q291bnQrKzsKKyAgICAgICAgaW50IGxlYWRCaXQgPSBnZXRDaHVua0lkeChpbmRleCwgQ09OVEVOVFNfU1RBUlRfU0hJRlQsIENPTlRFTlRTX1NUQVJUX1NJWkUpOworICAgICAgICBpbnQgb2ZzID0gaW5DaHVua1BvaW50ZXIoaW5kZXgsIGxlYWRCaXQsIENPTlRFTlRTX1NUQVJUX1NJWkUpOworICAgICAgICBBdG9taWNSZWZlcmVuY2VBcnJheTxUPiBhcnJheSA9IGNvbnRlbnRBcnJheXNbbGVhZEJpdF07CisgICAgICAgIGlmIChhcnJheSA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgb2ZzID09IDAgOiAiRXJyb3IgaW4gY29udGVudCBhcnJheXMgY29uZmlndXJhdGlvbi4iOworICAgICAgICAgICAgY29udGVudEFycmF5c1tsZWFkQml0XSA9IGFycmF5ID0gbmV3IEF0b21pY1JlZmVyZW5jZUFycmF5PD4oQ09OVEVOVFNfU1RBUlRfU0laRSA8PCBsZWFkQml0KTsKKyAgICAgICAgfQorICAgICAgICBhcnJheS5sYXp5U2V0KG9mcywgdmFsdWUpOyAvLyBubyBuZWVkIGZvciBhIHZvbGF0aWxlIHNldCBoZXJlOyBhdCB0aGlzIHBvaW50IHRoZSBpdGVtIGlzIG5vdCByZWZlcmVuY2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IGFueSBub2RlIGluIHRoZSB0cmllLCBhbmQgYSB2b2xhdGlsZSBzZXQgd2lsbCBiZSBtYWRlIHRvIHJlZmVyZW5jZSBpdC4KKyAgICAgICAgcmV0dXJuIGluZGV4OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRDb250ZW50KGludCBpbmRleCwgVCB2YWx1ZSkKKyAgICB7CisgICAgICAgIGludCBsZWFkQml0ID0gZ2V0Q2h1bmtJZHgoaW5kZXgsIENPTlRFTlRTX1NUQVJUX1NISUZULCBDT05URU5UU19TVEFSVF9TSVpFKTsKKyAgICAgICAgaW50IG9mcyA9IGluQ2h1bmtQb2ludGVyKGluZGV4LCBsZWFkQml0LCBDT05URU5UU19TVEFSVF9TSVpFKTsKKyAgICAgICAgQXRvbWljUmVmZXJlbmNlQXJyYXk8VD4gYXJyYXkgPSBjb250ZW50QXJyYXlzW2xlYWRCaXRdOworICAgICAgICBhcnJheS5zZXQob2ZzLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGlzY2FyZEJ1ZmZlcnMoKQorICAgIHsKKyAgICAgICAgaWYgKGJ1ZmZlclR5cGUgPT0gQnVmZmVyVHlwZS5PTl9IRUFQKQorICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBjbGVhbmluZyBuZWVkZWQKKworICAgICAgICBmb3IgKFVuc2FmZUJ1ZmZlciBiIDogYnVmZmVycykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xlYW4oYi5ieXRlQnVmZmVyKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gV3JpdGUgbWV0aG9kcworCisgICAgLy8gV3JpdGUgdmlzaWJpbGl0eSBtb2RlbDogd3JpdGVzIGFyZSBub3Qgdm9sYXRpbGUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgZmluYWwgd3JpdGUgYmVmb3JlIGEgY2FsbCByZXR1cm5zCisgICAgLy8gdGhlIHNhbWUgdmFsdWUgdGhhdCB3YXMgcHJlc2VudCBiZWZvcmUgKGUuZy4gY29udGVudCB3YXMgdXBkYXRlZCBpbi1wbGFjZSAvIGV4aXN0aW5nIG5vZGUgZ290IGEgbmV3IGNoaWxkIG9yIGhhZAorICAgIC8vIGEgY2hpbGQgcG9pbnRlciB1cGRhdGVkKTsgaWYgdGhlIHdob2xlIHBhdGggaW5jbHVkaW5nIHRoZSByb290IG5vZGUgY2hhbmdlZCwgdGhlIHJvb3QgaXRzZWxmIGdldHMgYSB2b2xhdGlsZQorICAgIC8vIHdyaXRlLgorICAgIC8vIFRoaXMgZmluYWwgd3JpdGUgaXMgdGhlIHBvaW50IHdoZXJlIGFueSBuZXcgY2VsbHMgY3JlYXRlZCBkdXJpbmcgdGhlIHdyaXRlIGJlY29tZSB2aXNpYmxlIGZvciByZWFkZXJzIGZvciB0aGUKKyAgICAvLyBmaXJzdCB0aW1lLCBhbmQgc3VjaCByZWFkZXJzIG11c3QgcGFzcyB0aHJvdWdoIHJlYWRpbmcgdGhhdCBwb2ludGVyLCB3aGljaCBmb3JjZXMgYSBoYXBwZW5zLWJlZm9yZSByZWxhdGlvbnNoaXAKKyAgICAvLyB0aGF0IGV4dGVuZHMgdG8gYWxsIHZhbHVlcyB3cml0dGVuIGJ5IHRoaXMgdGhyZWFkIGJlZm9yZSBpdC4KKworICAgIC8qKgorICAgICAqIEF0dGFjaCBhIGNoaWxkIHRvIHRoZSBnaXZlbiBub24tY29udGVudCBub2RlLiBUaGlzIG1heSBiZSBhbiB1cGRhdGUgZm9yIGFuIGV4aXN0aW5nIGJyYW5jaCwgb3IgYSBuZXcgY2hpbGQgZm9yCisgICAgICogdGhlIG5vZGUuIEFuIHVwZGF0ZSBfaXNfIHJlcXVpcmVkIChpLmUuIHRoaXMgaXMgb25seSBjYWxsZWQgd2hlbiB0aGUgbmV3Q2hpbGQgcG9pbnRlciBpcyBub3QgdGhlIHNhbWUgYXMgdGhlCisgICAgICogZXhpc3RpbmcgdmFsdWUpLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGF0dGFjaENoaWxkKGludCBub2RlLCBpbnQgdHJhbnMsIGludCBuZXdDaGlsZCkgdGhyb3dzIFNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBhc3NlcnQgIWlzTGVhZihub2RlKSA6ICJhdHRhY2hDaGlsZCBjYW5ub3QgYmUgdXNlZCBvbiBjb250ZW50IG5vZGVzLiI7CisKKyAgICAgICAgc3dpdGNoIChvZmZzZXQobm9kZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgUFJFRklYX09GRlNFVDoKKyAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiAiYXR0YWNoQ2hpbGQgY2Fubm90IGJlIHVzZWQgb24gY29udGVudCBub2Rlcy4iOworICAgICAgICAgICAgY2FzZSBTUEFSU0VfT0ZGU0VUOgorICAgICAgICAgICAgICAgIHJldHVybiBhdHRhY2hDaGlsZFRvU3BhcnNlKG5vZGUsIHRyYW5zLCBuZXdDaGlsZCk7CisgICAgICAgICAgICBjYXNlIFNQTElUX09GRlNFVDoKKyAgICAgICAgICAgICAgICBhdHRhY2hDaGlsZFRvU3BsaXQobm9kZSwgdHJhbnMsIG5ld0NoaWxkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgICAgIGNhc2UgTEFTVF9QT0lOVEVSX09GRlNFVCAtIDE6CisgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gYSBDaGFpbiBibG9jaywgd2UgY2FuIG1vZGlmeSB0aGUgY2hpbGQgaW4tcGxhY2UKKyAgICAgICAgICAgICAgICBpZiAodHJhbnMgPT0gZ2V0VW5zaWduZWRCeXRlKG5vZGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHV0SW50Vm9sYXRpbGUobm9kZSArIDEsIG5ld0NoaWxkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGVsc2UgcGFzcyB0aHJvdWdoCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBhdHRhY2hDaGlsZFRvQ2hhaW4obm9kZSwgdHJhbnMsIG5ld0NoaWxkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGFjaCBhIGNoaWxkIHRvIHRoZSBnaXZlbiBzcGxpdCBub2RlLiBUaGlzIG1heSBiZSBhbiB1cGRhdGUgZm9yIGFuIGV4aXN0aW5nIGJyYW5jaCwgb3IgYSBuZXcgY2hpbGQgZm9yIHRoZSBub2RlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhdHRhY2hDaGlsZFRvU3BsaXQoaW50IG5vZGUsIGludCB0cmFucywgaW50IG5ld0NoaWxkKSB0aHJvd3MgU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGludCBtaWRQb3MgPSBzcGxpdEJsb2NrUG9pbnRlckFkZHJlc3Mobm9kZSwgc3BsaXROb2RlTWlkSW5kZXgodHJhbnMpLCBTUExJVF9TVEFSVF9MRVZFTF9MSU1JVCk7CisgICAgICAgIGludCBtaWQgPSBnZXRJbnQobWlkUG9zKTsKKyAgICAgICAgaWYgKGlzTnVsbChtaWQpKQorICAgICAgICB7CisgICAgICAgICAgICBtaWQgPSBjcmVhdGVFbXB0eVNwbGl0Tm9kZSgpOworICAgICAgICAgICAgaW50IHRhaWxQb3MgPSBzcGxpdEJsb2NrUG9pbnRlckFkZHJlc3MobWlkLCBzcGxpdE5vZGVUYWlsSW5kZXgodHJhbnMpLCBTUExJVF9PVEhFUl9MRVZFTF9MSU1JVCk7CisgICAgICAgICAgICBpbnQgdGFpbCA9IGNyZWF0ZUVtcHR5U3BsaXROb2RlKCk7CisgICAgICAgICAgICBpbnQgY2hpbGRQb3MgPSBzcGxpdEJsb2NrUG9pbnRlckFkZHJlc3ModGFpbCwgc3BsaXROb2RlQ2hpbGRJbmRleCh0cmFucyksIFNQTElUX09USEVSX0xFVkVMX0xJTUlUKTsKKyAgICAgICAgICAgIHB1dEludChjaGlsZFBvcywgbmV3Q2hpbGQpOworICAgICAgICAgICAgcHV0SW50KHRhaWxQb3MsIHRhaWwpOworICAgICAgICAgICAgcHV0SW50Vm9sYXRpbGUobWlkUG9zLCBtaWQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaW50IHRhaWxQb3MgPSBzcGxpdEJsb2NrUG9pbnRlckFkZHJlc3MobWlkLCBzcGxpdE5vZGVUYWlsSW5kZXgodHJhbnMpLCBTUExJVF9PVEhFUl9MRVZFTF9MSU1JVCk7CisgICAgICAgIGludCB0YWlsID0gZ2V0SW50KHRhaWxQb3MpOworICAgICAgICBpZiAoaXNOdWxsKHRhaWwpKQorICAgICAgICB7CisgICAgICAgICAgICB0YWlsID0gY3JlYXRlRW1wdHlTcGxpdE5vZGUoKTsKKyAgICAgICAgICAgIGludCBjaGlsZFBvcyA9IHNwbGl0QmxvY2tQb2ludGVyQWRkcmVzcyh0YWlsLCBzcGxpdE5vZGVDaGlsZEluZGV4KHRyYW5zKSwgU1BMSVRfT1RIRVJfTEVWRUxfTElNSVQpOworICAgICAgICAgICAgcHV0SW50KGNoaWxkUG9zLCBuZXdDaGlsZCk7CisgICAgICAgICAgICBwdXRJbnRWb2xhdGlsZSh0YWlsUG9zLCB0YWlsKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjaGlsZFBvcyA9IHNwbGl0QmxvY2tQb2ludGVyQWRkcmVzcyh0YWlsLCBzcGxpdE5vZGVDaGlsZEluZGV4KHRyYW5zKSwgU1BMSVRfT1RIRVJfTEVWRUxfTElNSVQpOworICAgICAgICBwdXRJbnRWb2xhdGlsZShjaGlsZFBvcywgbmV3Q2hpbGQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGFjaCBhIGNoaWxkIHRvIHRoZSBnaXZlbiBzcGFyc2Ugbm9kZS4gVGhpcyBtYXkgYmUgYW4gdXBkYXRlIGZvciBhbiBleGlzdGluZyBicmFuY2gsIG9yIGEgbmV3IGNoaWxkIGZvciB0aGUgbm9kZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBhdHRhY2hDaGlsZFRvU3BhcnNlKGludCBub2RlLCBpbnQgdHJhbnMsIGludCBuZXdDaGlsZCkgdGhyb3dzIFNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBpbnQgaW5kZXg7CisgICAgICAgIGludCBzbWFsbGVyQ291bnQgPSAwOworICAgICAgICAvLyBmaXJzdCBjaGVjayBpZiB0aGlzIGlzIGFuIHVwZGF0ZSBhbmQgbW9kaWZ5IGluLXBsYWNlIGlmIHNvCisgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNQQVJTRV9DSElMRF9DT1VOVDsgKytpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlzTnVsbChnZXRJbnQobm9kZSArIFNQQVJTRV9DSElMRFJFTl9PRkZTRVQgKyBpbmRleCAqIDQpKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGZpbmFsIGludCBleGlzdGluZyA9IGdldFVuc2lnbmVkQnl0ZShub2RlICsgU1BBUlNFX0JZVEVTX09GRlNFVCArIGluZGV4KTsKKyAgICAgICAgICAgIGlmIChleGlzdGluZyA9PSB0cmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwdXRJbnRWb2xhdGlsZShub2RlICsgU1BBUlNFX0NISUxEUkVOX09GRlNFVCArIGluZGV4ICogNCwgbmV3Q2hpbGQpOworICAgICAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZXhpc3RpbmcgPCB0cmFucykKKyAgICAgICAgICAgICAgICArK3NtYWxsZXJDb3VudDsKKyAgICAgICAgfQorICAgICAgICBpbnQgY2hpbGRDb3VudCA9IGluZGV4OworCisgICAgICAgIGlmIChjaGlsZENvdW50ID09IFNQQVJTRV9DSElMRF9DT1VOVCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm9kZSBpcyBmdWxsLiBTd2l0Y2ggdG8gc3BsaXQKKyAgICAgICAgICAgIGludCBzcGxpdCA9IGNyZWF0ZUVtcHR5U3BsaXROb2RlKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNQQVJTRV9DSElMRF9DT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB0ID0gZ2V0VW5zaWduZWRCeXRlKG5vZGUgKyBTUEFSU0VfQllURVNfT0ZGU0VUICsgaSk7CisgICAgICAgICAgICAgICAgaW50IHAgPSBnZXRJbnQobm9kZSArIFNQQVJTRV9DSElMRFJFTl9PRkZTRVQgKyBpICogNCk7CisgICAgICAgICAgICAgICAgYXR0YWNoQ2hpbGRUb1NwbGl0Tm9uVm9sYXRpbGUoc3BsaXQsIHQsIHApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXR0YWNoQ2hpbGRUb1NwbGl0Tm9uVm9sYXRpbGUoc3BsaXQsIHRyYW5zLCBuZXdDaGlsZCk7CisgICAgICAgICAgICByZXR1cm4gc3BsaXQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgYSBuZXcgdHJhbnNpdGlvbi4gVGhleSBhcmUgbm90IGtlcHQgaW4gb3JkZXIsIHNvIGFwcGVuZCBpdCBhdCB0aGUgZmlyc3QgZnJlZSBwb3NpdGlvbi4KKyAgICAgICAgcHV0Qnl0ZShub2RlICsgU1BBUlNFX0JZVEVTX09GRlNFVCArIGNoaWxkQ291bnQsIChieXRlKSB0cmFucyk7CisKKyAgICAgICAgLy8gVXBkYXRlIG9yZGVyIHdvcmQuCisgICAgICAgIGludCBvcmRlciA9IGdldFVuc2lnbmVkU2hvcnQobm9kZSArIFNQQVJTRV9PUkRFUl9PRkZTRVQpOworICAgICAgICBpbnQgbmV3T3JkZXIgPSBpbnNlcnRJbk9yZGVyV29yZChvcmRlciwgY2hpbGRDb3VudCwgc21hbGxlckNvdW50KTsKKworICAgICAgICAvLyBTcGFyc2Ugbm9kZXMgaGF2ZSB0d28gYWNjZXNzIG1vZGVzOiB2aWEgdGhlIG9yZGVyIHdvcmQsIHdoZW4gbGlzdGluZyB0cmFuc2l0aW9ucywgb3IgZGlyZWN0bHkgdG8gY2hhcmFjdGVycworICAgICAgICAvLyBhbmQgYWRkcmVzc2VzLgorICAgICAgICAvLyBUbyBzdXBwb3J0IHRoZSBmb3JtZXIsIHdlIHZvbGF0aWxlIHdyaXRlIHRvIHRoZSBvcmRlciB3b3JkIGxhc3QsIGFuZCBldmVyeXRoaW5nIGlzIGNvcnJlY3RseSBzZXQgdXAuCisgICAgICAgIC8vIFRoZSBsYXR0ZXIgZG9lcyBub3QgdG91Y2ggdGhlIG9yZGVyIHdvcmQuIFRvIHN1cHBvcnQgdGhhdCB0b28sIHdlIHZvbGF0aWxlIHdyaXRlIHRoZSBhZGRyZXNzLCBhcyB0aGUgcmVhZGVyCisgICAgICAgIC8vIGNhbid0IGRldGVybWluZSBpZiB0aGUgcG9zaXRpb24gaXMgaW4gdXNlIGJhc2VkIG9uIHRoZSBjaGFyYWN0ZXIgYnl0ZSBhbG9uZSAoMDAgaXMgYWxzbyBhIHZhbGlkIHRyYW5zaXRpb24pLgorICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBtZWFucyB0aGF0IHJlYWRlciBtdXN0IGNoZWNrIHRoZSB0cmFuc2l0aW9uIGJ5dGUgQUZURVIgdGhlIGFkZHJlc3MsIHRvIGVuc3VyZSB0aGV5IGdldCB0aGUKKyAgICAgICAgLy8gY29ycmVjdCB2YWx1ZSAoc2VlIGdldFNwYXJzZUNoaWxkKS4KKworICAgICAgICAvLyBzZXR0aW5nIGNoaWxkIGVuYWJsZXMgcmVhZHMgdG8gc3RhcnQgc2VlaW5nIHRoZSBuZXcgYnJhbmNoCisgICAgICAgIHB1dEludFZvbGF0aWxlKG5vZGUgKyBTUEFSU0VfQ0hJTERSRU5fT0ZGU0VUICsgY2hpbGRDb3VudCAqIDQsIG5ld0NoaWxkKTsKKworICAgICAgICAvLyBzb21lIHJlYWRlcnMgd2lsbCBkZWNpZGUgd2hldGhlciB0byBjaGVjayB0aGUgcG9pbnRlciBiYXNlZCBvbiB0aGUgb3JkZXIgd29yZAorICAgICAgICAvLyB3cml0ZSB0aGF0IHZvbGF0aWxlIHRvIG1ha2Ugc3VyZSB0aGV5IHNlZSB0aGUgbmV3IGNoYW5nZSB0b28KKyAgICAgICAgcHV0U2hvcnRWb2xhdGlsZShub2RlICsgU1BBUlNFX09SREVSX09GRlNFVCwgIChzaG9ydCkgbmV3T3JkZXIpOworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnNlcnQgdGhlIGdpdmVuIG5ld0luZGV4IGluIHRoZSBiYXNlLTYgZW5jb2RlZCBvcmRlciB3b3JkIGluIHRoZSBjb3JyZWN0IHBvc2l0aW9uIHdpdGggcmVzcGVjdCB0byB0aGUgb3JkZXJpbmcuCisgICAgICoKKyAgICAgKiBFLmcuCisgICAgICogICAtIGluc2VydE9yZGVyV29yZCgxMjAsIDMsIDApIG11c3QgcmV0dXJuIDEyMDMgKGRlY2ltYWwgNDgqNiArIDMpCisgICAgICogICAtIGluc2VydE9yZGVyV29yZCgxMjAsIDMsIDEsIHB0cikgbXVzdCByZXR1cm4gMTIzMCAoZGVjaW1hbCA4KjM2ICsgMyo2ICsgMCkKKyAgICAgKiAgIC0gaW5zZXJ0T3JkZXJXb3JkKDEyMCwgMywgMiwgcHRyKSBtdXN0IHJldHVybiAxMzIwIChkZWNpbWFsIDEqMjE2ICsgMyozNiArIDEyKQorICAgICAqICAgLSBpbnNlcnRPcmRlcldvcmQoMTIwLCAzLCAzLCBwdHIpIG11c3QgcmV0dXJuIDMxMjAgKGRlY2ltYWwgMyoyMTYgKyA0OCkKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgaW5zZXJ0SW5PcmRlcldvcmQoaW50IG9yZGVyLCBpbnQgbmV3SW5kZXgsIGludCBzbWFsbGVyQ291bnQpCisgICAgeworICAgICAgICBpbnQgciA9IDE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc21hbGxlckNvdW50OyArK2kpCisgICAgICAgICAgICByICo9IDY7CisgICAgICAgIGludCBoZWFkID0gb3JkZXIgLyByOworICAgICAgICBpbnQgdGFpbCA9IG9yZGVyICUgcjsKKyAgICAgICAgLy8gaW5zZXJ0IG5ld0luZGV4IGFmdGVyIHRoZSBvbmVzIHdlIGhhdmUgcGFzc2VkIChvcmRlciAlIHIpIGFuZCBiZWZvcmUgdGhlIHJlbWFpbmluZyAob3JkZXIgLyByKQorICAgICAgICByZXR1cm4gdGFpbCArIChoZWFkICogNiArIG5ld0luZGV4KSAqIHI7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm9uLXZvbGF0aWxlIHZlcnNpb24gb2YgYXR0YWNoQ2hpbGRUb1NwbGl0LiBVc2VkIHdoZW4gdGhlIHNwbGl0IG5vZGUgaXMgbm90IHJlYWNoYWJsZSB5ZXQgKGR1cmluZyB0aGUgY29udmVyc2lvbgorICAgICAqIGZyb20gc3BhcnNlKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXR0YWNoQ2hpbGRUb1NwbGl0Tm9uVm9sYXRpbGUoaW50IG5vZGUsIGludCB0cmFucywgaW50IG5ld0NoaWxkKSB0aHJvd3MgU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGFzc2VydCBvZmZzZXQobm9kZSkgPT0gU1BMSVRfT0ZGU0VUIDogIkludmFsaWQgc3BsaXQgbm9kZSBpbiB0cmllIjsKKyAgICAgICAgaW50IG1pZFBvcyA9IHNwbGl0QmxvY2tQb2ludGVyQWRkcmVzcyhub2RlLCBzcGxpdE5vZGVNaWRJbmRleCh0cmFucyksIFNQTElUX1NUQVJUX0xFVkVMX0xJTUlUKTsKKyAgICAgICAgaW50IG1pZCA9IGdldEludChtaWRQb3MpOworICAgICAgICBpZiAoaXNOdWxsKG1pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1pZCA9IGNyZWF0ZUVtcHR5U3BsaXROb2RlKCk7CisgICAgICAgICAgICBwdXRJbnQobWlkUG9zLCBtaWQpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IG9mZnNldChtaWQpID09IFNQTElUX09GRlNFVCA6ICJJbnZhbGlkIHNwbGl0IG5vZGUgaW4gdHJpZSI7CisgICAgICAgIGludCB0YWlsUG9zID0gc3BsaXRCbG9ja1BvaW50ZXJBZGRyZXNzKG1pZCwgc3BsaXROb2RlVGFpbEluZGV4KHRyYW5zKSwgU1BMSVRfT1RIRVJfTEVWRUxfTElNSVQpOworICAgICAgICBpbnQgdGFpbCA9IGdldEludCh0YWlsUG9zKTsKKyAgICAgICAgaWYgKGlzTnVsbCh0YWlsKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGFpbCA9IGNyZWF0ZUVtcHR5U3BsaXROb2RlKCk7CisgICAgICAgICAgICBwdXRJbnQodGFpbFBvcywgdGFpbCk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgb2Zmc2V0KHRhaWwpID09IFNQTElUX09GRlNFVCA6ICJJbnZhbGlkIHNwbGl0IG5vZGUgaW4gdHJpZSI7CisgICAgICAgIGludCBjaGlsZFBvcyA9IHNwbGl0QmxvY2tQb2ludGVyQWRkcmVzcyh0YWlsLCBzcGxpdE5vZGVDaGlsZEluZGV4KHRyYW5zKSwgU1BMSVRfT1RIRVJfTEVWRUxfTElNSVQpOworICAgICAgICBwdXRJbnQoY2hpbGRQb3MsIG5ld0NoaWxkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRhY2ggYSBjaGlsZCB0byB0aGUgZ2l2ZW4gY2hhaW4gbm9kZS4gVGhpcyBtYXkgYmUgYW4gdXBkYXRlIGZvciBhbiBleGlzdGluZyBicmFuY2ggd2l0aCBkaWZmZXJlbnQgdGFyZ2V0CisgICAgICogYWRkcmVzcywgb3IgYSBzZWNvbmQgY2hpbGQgZm9yIHRoZSBub2RlLgorICAgICAqIFRoaXMgbWV0aG9kIGFsd2F5cyBjb3BpZXMgdGhlIG5vZGUgLS0gd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHVwZGF0ZXMgdGhhdCBjaGFuZ2UgdGhlIGNoaWxkIG9mIHRoZSBsYXN0IG5vZGUgaW4gYQorICAgICAqIGNoYWluIGJsb2NrIHdpdGggbWF0Y2hpbmcgdHJhbnNpdGlvbiBieXRlICh3aGljaCB0aGlzIG1ldGhvZCBpcyBub3QgdXNlZCBmb3IsIHNlZSBhdHRhY2hDaGlsZCksIG1vZGlmaWNhdGlvbnMgdG8KKyAgICAgKiBjaGFpbiBub2RlcyBjYW5ub3QgYmUgZG9uZSBpbiBwbGFjZSwgZWl0aGVyIGJlY2F1c2Ugd2UgaW50cm9kdWNlIGEgbmV3IHRyYW5zaXRpb24gYnl0ZSBhbmQgaGF2ZSB0byBjb252ZXJ0IGZyb20KKyAgICAgKiB0aGUgc2luZ2xlLXRyYW5zaXRpb24gY2hhaW4gdHlwZSB0byBzcGFyc2UsIG9yIGJlY2F1c2Ugd2UgaGF2ZSB0byByZW1hcCB0aGUgY2hpbGQgZnJvbSB0aGUgaW1wbGljaXQgbm9kZSArIDEgdG8KKyAgICAgKiBzb21ldGhpbmcgZWxzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBhdHRhY2hDaGlsZFRvQ2hhaW4oaW50IG5vZGUsIGludCB0cmFuc2l0aW9uQnl0ZSwgaW50IG5ld0NoaWxkKSB0aHJvd3MgU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGludCBleGlzdGluZ0J5dGUgPSBnZXRVbnNpZ25lZEJ5dGUobm9kZSk7CisgICAgICAgIGlmICh0cmFuc2l0aW9uQnl0ZSA9PSBleGlzdGluZ0J5dGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBvbmx5IGJlIGNhbGxlZCBpZiBuZXcgY2hpbGQgaXMgZGlmZmVyZW50IGZyb20gb2xkLCBhbmQgdGhlIHVwZGF0ZSBpcyBub3Qgb24gdGhlIGZpbmFsIGNoaWxkCisgICAgICAgICAgICAvLyB3aGVyZSB3ZSBjYW4gY2hhbmdlIGl0IGluIHBsYWNlIChzZWUgYXR0YWNoQ2hpbGQpLiBXZSBtdXN0IGFsd2F5cyBjcmVhdGUgc29tZXRoaW5nIG5ldy4KKyAgICAgICAgICAgIC8vIElmIHRoZSBjaGlsZCBpcyBhIGNoYWluLCB3ZSBjYW4gZXhwYW5kIGl0IChzaW5jZSBpdCdzIGEgZGlmZmVyZW50IHZhbHVlLCBpdHMgYnJhbmNoIG11c3QgYmUgbmV3IGFuZAorICAgICAgICAgICAgLy8gbm90aGluZyBjYW4gYWxyZWFkeSByZXNpZGUgaW4gdGhlIHJlc3Qgb2YgdGhlIGJsb2NrKS4KKyAgICAgICAgICAgIHJldHVybiBleHBhbmRPckNyZWF0ZUNoYWluTm9kZSh0cmFuc2l0aW9uQnl0ZSwgbmV3Q2hpbGQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIG5ldyB0cmFuc2l0aW9uIGlzIGRpZmZlcmVudCwgc28gd2Ugbm8gbG9uZ2VyIGhhdmUgb25seSBvbmUgdHJhbnNpdGlvbi4gQ2hhbmdlIHR5cGUuCisgICAgICAgIGludCBleGlzdGluZ0NoaWxkID0gbm9kZSArIDE7CisgICAgICAgIGlmIChvZmZzZXQoZXhpc3RpbmdDaGlsZCkgPT0gTEFTVF9QT0lOVEVSX09GRlNFVCkKKyAgICAgICAgeworICAgICAgICAgICAgZXhpc3RpbmdDaGlsZCA9IGdldEludChleGlzdGluZ0NoaWxkKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3JlYXRlU3BhcnNlTm9kZShleGlzdGluZ0J5dGUsIGV4aXN0aW5nQ2hpbGQsIHRyYW5zaXRpb25CeXRlLCBuZXdDaGlsZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzRXhwYW5kYWJsZUNoYWluKGludCBuZXdDaGlsZCkKKyAgICB7CisgICAgICAgIGludCBuZXdPZmZzZXQgPSBvZmZzZXQobmV3Q2hpbGQpOworICAgICAgICByZXR1cm4gbmV3Q2hpbGQgPiAwICYmIG5ld0NoaWxkIC0gMSA+IE5PTkUgJiYgbmV3T2Zmc2V0ID4gQ0hBSU5fTUlOX09GRlNFVCAmJiBuZXdPZmZzZXQgPD0gQ0hBSU5fTUFYX09GRlNFVDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBzcGFyc2Ugbm9kZSB3aXRoIHR3byBjaGlsZHJlbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBjcmVhdGVTcGFyc2VOb2RlKGludCBieXRlMSwgaW50IGNoaWxkMSwgaW50IGJ5dGUyLCBpbnQgY2hpbGQyKSB0aHJvd3MgU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGFzc2VydCBieXRlMSAhPSBieXRlMiA6ICJBdHRlbXB0ZWQgdG8gY3JlYXRlIGEgc3BhcnNlIG5vZGUgd2l0aCB0d28gb2YgdGhlIHNhbWUgdHJhbnNpdGlvbiI7CisgICAgICAgIGlmIChieXRlMSA+IGJ5dGUyKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBzd2FwIHRoZW0gc28gdGhlIHNtYWxsZXIgaXMgYnl0ZTEsIGkuZS4gdGhlcmUncyBhbHdheXMgc29tZXRoaW5nIGJpZ2dlciB0aGFuIGNoaWxkIDAgc28gMCBuZXZlciBpcworICAgICAgICAgICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgb3JkZXIKKyAgICAgICAgICAgIGludCB0ID0gYnl0ZTE7IGJ5dGUxID0gYnl0ZTI7IGJ5dGUyID0gdDsKKyAgICAgICAgICAgIHQgPSBjaGlsZDE7IGNoaWxkMSA9IGNoaWxkMjsgY2hpbGQyID0gdDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBub2RlID0gYWxsb2NhdGVCbG9jaygpICsgU1BBUlNFX09GRlNFVDsKKyAgICAgICAgcHV0Qnl0ZShub2RlICsgU1BBUlNFX0JZVEVTX09GRlNFVCArIDAsICAoYnl0ZSkgYnl0ZTEpOworICAgICAgICBwdXRCeXRlKG5vZGUgKyBTUEFSU0VfQllURVNfT0ZGU0VUICsgMSwgIChieXRlKSBieXRlMik7CisgICAgICAgIHB1dEludChub2RlICsgU1BBUlNFX0NISUxEUkVOX09GRlNFVCArIDAgKiA0LCBjaGlsZDEpOworICAgICAgICBwdXRJbnQobm9kZSArIFNQQVJTRV9DSElMRFJFTl9PRkZTRVQgKyAxICogNCwgY2hpbGQyKTsKKyAgICAgICAgcHV0U2hvcnQobm9kZSArIFNQQVJTRV9PUkRFUl9PRkZTRVQsICAoc2hvcnQpICgxICogNiArIDApKTsKKyAgICAgICAgLy8gTm90ZTogdGhpcyBkb2VzIG5vdCBuZWVkIGEgdm9sYXRpbGUgd3JpdGUgYXMgaXQgaXMgYSBuZXcgbm9kZSwgcmV0dXJuaW5nIGEgbmV3IHBvaW50ZXIsIHdoaWNoIG5lZWRzIHRvIGJlCisgICAgICAgIC8vIHB1dCBpbiBhbiBleGlzdGluZyBub2RlIG9yIHRoZSByb290LiBUaGF0IGFjdGlvbiBlbmRzIGluIGEgaGFwcGVucy1iZWZvcmUgZW5mb3JjaW5nIHdyaXRlLgorICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY2hhaW4gbm9kZSB3aXRoIHRoZSBzaW5nbGUgcHJvdmlkZWQgdHJhbnNpdGlvbiAocG9pbnRpbmcgdG8gdGhlIHByb3ZpZGVkIGNoaWxkKS4KKyAgICAgKiBOb3RlIHRoYXQgdG8gYXZvaWQgY3JlYXRpbmcgaW5lZmZpY2llbnQgdHJpZXMgd2l0aCB1bmRlci11dGlsaXplZCBjaGFpbiBub2RlcywgdGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbQorICAgICAqIHtAbGluayAjZXhwYW5kT3JDcmVhdGVDaGFpbk5vZGV9IGFuZCBvdGhlciBjYWxsLXNpdGVzIHNob3VsZCBjYWxsIHtAbGluayAjZXhwYW5kT3JDcmVhdGVDaGFpbk5vZGV9LgorICAgICAqLworICAgIHByaXZhdGUgaW50IGNyZWF0ZU5ld0NoYWluTm9kZShpbnQgdHJhbnNpdGlvbkJ5dGUsIGludCBuZXdDaGlsZCkgdGhyb3dzIFNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBpbnQgbmV3Tm9kZSA9IGFsbG9jYXRlQmxvY2soKSArIExBU1RfUE9JTlRFUl9PRkZTRVQgLSAxOworICAgICAgICBwdXRCeXRlKG5ld05vZGUsIChieXRlKSB0cmFuc2l0aW9uQnl0ZSk7CisgICAgICAgIHB1dEludChuZXdOb2RlICsgMSwgbmV3Q2hpbGQpOworICAgICAgICAvLyBOb3RlOiB0aGlzIGRvZXMgbm90IG5lZWQgYSB2b2xhdGlsZSB3cml0ZSBhcyBpdCBpcyBhIG5ldyBub2RlLCByZXR1cm5pbmcgYSBuZXcgcG9pbnRlciwgd2hpY2ggbmVlZHMgdG8gYmUKKyAgICAgICAgLy8gcHV0IGluIGFuIGV4aXN0aW5nIG5vZGUgb3IgdGhlIHJvb3QuIFRoYXQgYWN0aW9uIGVuZHMgaW4gYSBoYXBwZW5zLWJlZm9yZSBlbmZvcmNpbmcgd3JpdGUuCisgICAgICAgIHJldHVybiBuZXdOb2RlOworICAgIH0KKworICAgIC8qKiBMaWtlIHtAbGluayAjY3JlYXRlTmV3Q2hhaW5Ob2RlfSwgYnV0IGlmIHRoZSBuZXcgY2hpbGQgaXMgYWxyZWFkeSBhIGNoYWluIG5vZGUgYW5kIGhhcyByb29tLCBleHBhbmQKKyAgICAgKiBpdCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgYnJhbmQgbmV3IG5vZGUuICovCisgICAgcHJpdmF0ZSBpbnQgZXhwYW5kT3JDcmVhdGVDaGFpbk5vZGUoaW50IHRyYW5zaXRpb25CeXRlLCBpbnQgbmV3Q2hpbGQpIHRocm93cyBTcGFjZUV4aGF1c3RlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKGlzRXhwYW5kYWJsZUNoYWluKG5ld0NoaWxkKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gYXR0YWNoIGFzIGEgbmV3IGNoYXJhY3RlciBpbiBjaGlsZCBub2RlCisgICAgICAgICAgICBpbnQgbmV3Tm9kZSA9IG5ld0NoaWxkIC0gMTsKKyAgICAgICAgICAgIHB1dEJ5dGUobmV3Tm9kZSwgKGJ5dGUpIHRyYW5zaXRpb25CeXRlKTsKKyAgICAgICAgICAgIHJldHVybiBuZXdOb2RlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNyZWF0ZU5ld0NoYWluTm9kZSh0cmFuc2l0aW9uQnl0ZSwgbmV3Q2hpbGQpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGNyZWF0ZUVtcHR5U3BsaXROb2RlKCkgdGhyb3dzIFNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gYWxsb2NhdGVCbG9jaygpICsgU1BMSVRfT0ZGU0VUOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGNyZWF0ZVByZWZpeE5vZGUoaW50IGNvbnRlbnRJbmRleCwgaW50IGNoaWxkLCBib29sZWFuIGlzU2FmZUNoYWluKSB0aHJvd3MgU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGFzc2VydCAhaXNOdWxsT3JMZWFmKGNoaWxkKSA6ICJQcmVmaXggbm9kZSBjYW5ub3QgcmVmZXJlbmNlIGEgY2hpbGRsZXNzIG5vZGUuIjsKKworICAgICAgICBpbnQgb2Zmc2V0ID0gb2Zmc2V0KGNoaWxkKTsKKyAgICAgICAgaW50IG5vZGU7CisgICAgICAgIGlmIChvZmZzZXQgPT0gU1BMSVRfT0ZGU0VUIHx8IGlzU2FmZUNoYWluICYmIG9mZnNldCA+IChQUkVGSVhfRkxBR1NfT0ZGU0VUICsgUFJFRklYX09GRlNFVCkgJiYgb2Zmc2V0IDw9IENIQUlOX01BWF9PRkZTRVQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdlIGNhbiBkbyBhbiBlbWJlZGRlZCBwcmVmaXggbm9kZQorICAgICAgICAgICAgLy8gTm90ZTogZm9yIGNoYWluIG5vZGVzIHdlIGhhdmUgYSByaXNrIHRoYXQgdGhlIG5vZGUgY29udGludWVzIGJleW9uZCB0aGUgY3VycmVudCBwb2ludCwgaW4gd2hpY2ggY2FzZQorICAgICAgICAgICAgLy8gY3JlYXRpbmcgdGhlIGVtYmVkZGVkIG5vZGUgbWF5IG92ZXJ3cml0ZSBpbmZvcm1hdGlvbiB0aGF0IGlzIHN0aWxsIG5lZWRlZCBieSBjb25jdXJyZW50IHJlYWRlcnMgb3IgdGhlCisgICAgICAgICAgICAvLyBtdXRhdGlvbiBwcm9jZXNzIGl0c2VsZi4KKyAgICAgICAgICAgIG5vZGUgPSAoY2hpbGQgJiAtQkxPQ0tfU0laRSkgfCBQUkVGSVhfT0ZGU0VUOworICAgICAgICAgICAgcHV0Qnl0ZShub2RlICsgUFJFRklYX0ZMQUdTX09GRlNFVCwgKGJ5dGUpIG9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBGdWxsIHByZWZpeCBub2RlCisgICAgICAgICAgICBub2RlID0gYWxsb2NhdGVCbG9jaygpICsgUFJFRklYX09GRlNFVDsKKyAgICAgICAgICAgIHB1dEJ5dGUobm9kZSArIFBSRUZJWF9GTEFHU19PRkZTRVQsIChieXRlKSAweEZGKTsKKyAgICAgICAgICAgIHB1dEludChub2RlICsgUFJFRklYX1BPSU5URVJfT0ZGU0VULCBjaGlsZCk7CisgICAgICAgIH0KKworICAgICAgICBwdXRJbnQobm9kZSArIFBSRUZJWF9DT05URU5UX09GRlNFVCwgY29udGVudEluZGV4KTsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgdXBkYXRlUHJlZml4Tm9kZUNoaWxkKGludCBub2RlLCBpbnQgY2hpbGQpIHRocm93cyBTcGFjZUV4aGF1c3RlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgYXNzZXJ0IG9mZnNldChub2RlKSA9PSBQUkVGSVhfT0ZGU0VUIDogInVwZGF0ZVByZWZpeCBjYWxsZWQgb24gbm9uLXByZWZpeCBub2RlIjsKKyAgICAgICAgYXNzZXJ0ICFpc051bGxPckxlYWYoY2hpbGQpIDogIlByZWZpeCBub2RlIGNhbm5vdCByZWZlcmVuY2UgYSBjaGlsZGxlc3Mgbm9kZS4iOworCisgICAgICAgIC8vIFdlIGNhbiBvbmx5IHVwZGF0ZSBpbi1wbGFjZSBpZiB3ZSBoYXZlIGEgZnVsbCBwcmVmaXggbm9kZQorICAgICAgICBpZiAoIWlzRW1iZWRkZWRQcmVmaXhOb2RlKG5vZGUpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGlzIGF0dGFjaGVzIHRoZSBjaGlsZCBicmFuY2ggYW5kIG1ha2VzIGl0IHJlYWNoYWJsZSAtLSB0aGUgd3JpdGUgbXVzdCBiZSB2b2xhdGlsZS4KKyAgICAgICAgICAgIHB1dEludFZvbGF0aWxlKG5vZGUgKyBQUkVGSVhfUE9JTlRFUl9PRkZTRVQsIGNoaWxkKTsKKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNvbnRlbnRJbmRleCA9IGdldEludChub2RlICsgUFJFRklYX0NPTlRFTlRfT0ZGU0VUKTsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVQcmVmaXhOb2RlKGNvbnRlbnRJbmRleCwgY2hpbGQsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzRW1iZWRkZWRQcmVmaXhOb2RlKGludCBub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldFVuc2lnbmVkQnl0ZShub2RlICsgUFJFRklYX0ZMQUdTX09GRlNFVCkgPCBCTE9DS19TSVpFOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIGNvbnRlbnQgZnJvbSBhbiBleGlzdGluZyBub2RlLCBpZiBpdCBoYXMgYW55LCB0byBhIG5ld2x5LXByZXBhcmVkIHVwZGF0ZSBmb3IgaXRzIGNoaWxkLgorICAgICAqCisgICAgICogQHBhcmFtIGV4aXN0aW5nUHJlQ29udGVudE5vZGUgcG9pbnRlciB0byB0aGUgZXhpc3Rpbmcgbm9kZSBiZWZvcmUgc2tpcHBpbmcgb3ZlciBjb250ZW50IG5vZGVzLCBpLmUuIHRoaXMgaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlaXRoZXIgdGhlIHNhbWUgYXMgZXhpc3RpbmdQb3N0Q29udGVudE5vZGUgb3IgYSBwb2ludGVyIHRvIGEgcHJlZml4IG9yIGxlYWYgbm9kZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIGNoaWxkIGlzIGV4aXN0aW5nUG9zdENvbnRlbnROb2RlCisgICAgICogQHBhcmFtIGV4aXN0aW5nUG9zdENvbnRlbnROb2RlIHBvaW50ZXIgdG8gdGhlIGV4aXN0aW5nIG5vZGUgYmVpbmcgdXBkYXRlZCwgYWZ0ZXIgYW55IGNvbnRlbnQgbm9kZXMgaGF2ZSBiZWVuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBwZWQgYW5kIGJlZm9yZSBhbnkgbW9kaWZpY2F0aW9uIGhhdmUgYmVlbiBhcHBsaWVkOyBhbHdheXMgYSBub24tY29udGVudCBub2RlCisgICAgICogQHBhcmFtIHVwZGF0ZWRQb3N0Q29udGVudE5vZGUgaXMgdGhlIHVwZGF0ZWQgbm9kZSwgaS5lLiB0aGUgbm9kZSB0byB3aGljaCBhbGwgcmVsZXZhbnQgbW9kaWZpY2F0aW9ucyBoYXZlIGJlZW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWVkOyBpZiB0aGUgbW9kaWZpY2F0aW9ucyB3ZXJlIGFwcGxpZWQgaW4tcGxhY2UsIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBhcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUG9zdENvbnRlbnROb2RlLCBvdGhlcndpc2UgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBwb2ludGVyOyBhbHdheXMgYSBub24tCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCBub2RlCisgICAgICogQHJldHVybiBhIG5vZGUgd2hpY2ggaGFzIHRoZSBjaGlsZHJlbiBvZiB1cGRhdGVkUG9zdENvbnRlbnROb2RlIGNvbWJpbmVkIHdpdGggdGhlIGNvbnRlbnQgb2YKKyAgICAgKiAgICAgICAgIGV4aXN0aW5nUHJlQ29udGVudE5vZGUKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBwcmVzZXJ2ZUNvbnRlbnQoaW50IGV4aXN0aW5nUHJlQ29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleGlzdGluZ1Bvc3RDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVwZGF0ZWRQb3N0Q29udGVudE5vZGUpIHRocm93cyBTcGFjZUV4aGF1c3RlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKGV4aXN0aW5nUHJlQ29udGVudE5vZGUgPT0gZXhpc3RpbmdQb3N0Q29udGVudE5vZGUpCisgICAgICAgICAgICByZXR1cm4gdXBkYXRlZFBvc3RDb250ZW50Tm9kZTsgICAgIC8vIG5vIGNvbnRlbnQgdG8gcHJlc2VydmUKKworICAgICAgICBpZiAoZXhpc3RpbmdQb3N0Q29udGVudE5vZGUgPT0gdXBkYXRlZFBvc3RDb250ZW50Tm9kZSkKKyAgICAgICAgICAgIHJldHVybiBleGlzdGluZ1ByZUNvbnRlbnROb2RlOyAgICAgLy8gY2hpbGQgZGlkbid0IGNoYW5nZSwgbm8gdXBkYXRlIG5lY2Vzc2FyeQorCisgICAgICAgIC8vIGVsc2Ugd2UgaGF2ZSBleGlzdGluZyBwcmVmaXggbm9kZSwgYW5kIHdlIG5lZWQgdG8gcmVmZXJlbmNlIGEgbmV3IGNoaWxkCisgICAgICAgIGlmIChpc0xlYWYoZXhpc3RpbmdQcmVDb250ZW50Tm9kZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVQcmVmaXhOb2RlKH5leGlzdGluZ1ByZUNvbnRlbnROb2RlLCB1cGRhdGVkUG9zdENvbnRlbnROb2RlLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCBvZmZzZXQoZXhpc3RpbmdQcmVDb250ZW50Tm9kZSkgPT0gUFJFRklYX09GRlNFVCA6ICJVbmV4cGVjdGVkIGNvbnRlbnQgaW4gbm9uLXByZWZpeCBhbmQgbm9uLWxlYWYgbm9kZS4iOworICAgICAgICByZXR1cm4gdXBkYXRlUHJlZml4Tm9kZUNoaWxkKGV4aXN0aW5nUHJlQ29udGVudE5vZGUsIHVwZGF0ZWRQb3N0Q29udGVudE5vZGUpOworICAgIH0KKworICAgIGZpbmFsIEFwcGx5U3RhdGUgYXBwbHlTdGF0ZSA9IG5ldyBBcHBseVN0YXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIHRoZSBzdGF0ZSBmb3IgYW4ge0BsaW5rICNhcHBseX0gb3BlcmF0aW9uLiBDb250YWlucyBhIHN0YWNrIG9mIGFsbCBub2RlcyB3ZSBkZXNjZW5kZWQgdGhyb3VnaAorICAgICAqIGFuZCB1c2VkIHRvIHVwZGF0ZSB0aGUgbm9kZXMgd2l0aCBhbnkgbmV3IGRhdGEgZHVyaW5nIGFzY2VudC4KKyAgICAgKgorICAgICAqIFRvIG1ha2UgdGhpcyBhcyBlZmZpY2llbnQgYW5kIEdDLWZyaWVuZGx5IGFzIHBvc3NpYmxlLCB3ZSB1c2UgYW4gaW50ZWdlciBhcnJheSAoaW5zdGVhZCBvZiBpcyBhbiBvYmplY3Qgc3RhY2spCisgICAgICogYW5kIHdlIHJldXNlIHRoZSBzYW1lIG9iamVjdC4gVGhlIGxhdHRlciBpcyBzYWZlIGJlY2F1c2UgbWVtdGFibGUgdHJpZXMgY2Fubm90IGJlIG11dGF0ZWQgaW4gcGFyYWxsZWwgYnkgbXVsdGlwbGUKKyAgICAgKiB3cml0ZXJzLgorICAgICAqLworICAgIGNsYXNzIEFwcGx5U3RhdGUKKyAgICB7CisgICAgICAgIGludFtdIGRhdGEgPSBuZXcgaW50WzE2ICogNV07CisgICAgICAgIGludCBjdXJyZW50RGVwdGggPSAtMTsKKworICAgICAgICB2b2lkIHJlc2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgY3VycmVudERlcHRoID0gLTE7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUG9pbnRlciB0byB0aGUgZXhpc3Rpbmcgbm9kZSBiZWZvcmUgc2tpcHBpbmcgb3ZlciBjb250ZW50IG5vZGVzLCBpLmUuIHRoaXMgaXMgZWl0aGVyIHRoZSBzYW1lIGFzCisgICAgICAgICAqIGV4aXN0aW5nUG9zdENvbnRlbnROb2RlIG9yIGEgcG9pbnRlciB0byBhIHByZWZpeCBvciBsZWFmIG5vZGUgd2hvc2UgY2hpbGQgaXMgZXhpc3RpbmdQb3N0Q29udGVudE5vZGUuCisgICAgICAgICAqLworICAgICAgICBpbnQgZXhpc3RpbmdQcmVDb250ZW50Tm9kZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkYXRhW2N1cnJlbnREZXB0aCAqIDUgKyAwXTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHNldEV4aXN0aW5nUHJlQ29udGVudE5vZGUoaW50IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBkYXRhW2N1cnJlbnREZXB0aCAqIDUgKyAwXSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBvaW50ZXIgdG8gdGhlIGV4aXN0aW5nIG5vZGUgYmVpbmcgdXBkYXRlZCwgYWZ0ZXIgYW55IGNvbnRlbnQgbm9kZXMgaGF2ZSBiZWVuIHNraXBwZWQgYW5kIGJlZm9yZSBhbnkKKyAgICAgICAgICogbW9kaWZpY2F0aW9uIGhhdmUgYmVlbiBhcHBsaWVkLiBBbHdheXMgYSBub24tY29udGVudCBub2RlLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IGV4aXN0aW5nUG9zdENvbnRlbnROb2RlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRhdGFbY3VycmVudERlcHRoICogNSArIDFdOworICAgICAgICB9CisgICAgICAgIHZvaWQgc2V0RXhpc3RpbmdQb3N0Q29udGVudE5vZGUoaW50IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBkYXRhW2N1cnJlbnREZXB0aCAqIDUgKyAxXSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB1cGRhdGVkIG5vZGUsIGkuZS4gdGhlIG5vZGUgdG8gd2hpY2ggdGhlIHJlbGV2YW50IG1vZGlmaWNhdGlvbnMgYXJlIGJlaW5nIGFwcGxpZWQuIFRoaXMgd2lsbCBjaGFuZ2UgYXMKKyAgICAgICAgICogY2hpbGRyZW4gYXJlIHByb2Nlc3NlZCBhbmQgYXR0YWNoZWQgdG8gdGhlIG5vZGUuIEFmdGVyIGFsbCBjaGlsZHJlbiBoYXZlIGJlZW4gcHJvY2Vzc2VkLCB0aGlzIHdpbGwgY29udGFpbgorICAgICAgICAgKiB0aGUgZnVsbHkgdXBkYXRlZCBub2RlIChpLmUuIHRoZSB1bmlvbiBvZiBleGlzdGluZ1Bvc3RDb250ZW50Tm9kZSBhbmQgbXV0YXRpb25Ob2RlKSB3aXRob3V0IGFueSBjb250ZW50LAorICAgICAgICAgKiB3aGljaCB3aWxsIGJlIHByb2Nlc3NlZCBzZXBhcmF0ZWx5IGFuZCwgaWYgbmVjZXNzYXJ5LCBhdHRhY2hlZCBhaGVhZCBvZiB0aGlzLiBJZiB0aGUgbW9kaWZpY2F0aW9ucyB3ZXJlCisgICAgICAgICAqIGFwcGxpZWQgaW4tcGxhY2UsIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBhcyBleGlzdGluZ1Bvc3RDb250ZW50Tm9kZSwgb3RoZXJ3aXNlIGEgY29tcGxldGVseSBkaWZmZXJlbnQKKyAgICAgICAgICogcG9pbnRlci4gQWx3YXlzIGEgbm9uLWNvbnRlbnQgbm9kZS4KKyAgICAgICAgICovCisgICAgICAgIGludCB1cGRhdGVkUG9zdENvbnRlbnROb2RlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRhdGFbY3VycmVudERlcHRoICogNSArIDJdOworICAgICAgICB9CisgICAgICAgIHZvaWQgc2V0VXBkYXRlZFBvc3RDb250ZW50Tm9kZShpbnQgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGFbY3VycmVudERlcHRoICogNSArIDJdID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHRyYW5zaXRpb24gd2UgdG9vayBvbiB0aGUgd2F5IGRvd24uCisgICAgICAgICAqLworICAgICAgICBpbnQgdHJhbnNpdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkYXRhW2N1cnJlbnREZXB0aCAqIDUgKyAzXTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHNldFRyYW5zaXRpb24oaW50IHRyYW5zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGFbY3VycmVudERlcHRoICogNSArIDNdID0gdHJhbnNpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29tcGlsZWQgY29udGVudCBpbmRleC4gTmVlZGVkIGJlY2F1c2Ugd2UgY2FuIG9ubHkgYWNjZXNzIGEgY3Vyc29yJ3MgY29udGVudCBvbiB0aGUgd2F5IGRvd24gYnV0IHdlIGNhbid0CisgICAgICAgICAqIGF0dGFjaCBpdCB1bnRpbCB3ZSBhc2NlbmQgZnJvbSB0aGUgbm9kZS4KKyAgICAgICAgICovCisgICAgICAgIGludCBjb250ZW50SW5kZXgoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGF0YVtjdXJyZW50RGVwdGggKiA1ICsgNF07CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBzZXRDb250ZW50SW5kZXgoaW50IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBkYXRhW2N1cnJlbnREZXB0aCAqIDUgKyA0XSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERlc2NlbmQgdG8gYSBjaGlsZCBub2RlLiBQcmVwYXJlcyBhIG5ldyBlbnRyeSBpbiB0aGUgc3RhY2sgZm9yIHRoZSBub2RlLgorICAgICAgICAgKi8KKyAgICAgICAgPFU+IHZvaWQgZGVzY2VuZChpbnQgdHJhbnNpdGlvbiwgVSBtdXRhdGlvbkNvbnRlbnQsIGZpbmFsIFVwc2VydFRyYW5zZm9ybWVyPFQsIFU+IHRyYW5zZm9ybWVyKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZXhpc3RpbmdQcmVDb250ZW50Tm9kZTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50RGVwdGggPCAwKQorICAgICAgICAgICAgICAgIGV4aXN0aW5nUHJlQ29udGVudE5vZGUgPSByb290OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNldFRyYW5zaXRpb24odHJhbnNpdGlvbik7CisgICAgICAgICAgICAgICAgZXhpc3RpbmdQcmVDb250ZW50Tm9kZSA9IGlzTnVsbChleGlzdGluZ1Bvc3RDb250ZW50Tm9kZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE5PTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRDaGlsZChleGlzdGluZ1Bvc3RDb250ZW50Tm9kZSgpLCB0cmFuc2l0aW9uKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKytjdXJyZW50RGVwdGg7CisgICAgICAgICAgICBpZiAoY3VycmVudERlcHRoICogNSA+PSBkYXRhLmxlbmd0aCkKKyAgICAgICAgICAgICAgICBkYXRhID0gQXJyYXlzLmNvcHlPZihkYXRhLCBjdXJyZW50RGVwdGggKiA1ICogMik7CisgICAgICAgICAgICBzZXRFeGlzdGluZ1ByZUNvbnRlbnROb2RlKGV4aXN0aW5nUHJlQ29udGVudE5vZGUpOworCisgICAgICAgICAgICBpbnQgZXhpc3RpbmdDb250ZW50SW5kZXggPSAtMTsKKyAgICAgICAgICAgIGludCBleGlzdGluZ1Bvc3RDb250ZW50Tm9kZTsKKyAgICAgICAgICAgIGlmIChpc0xlYWYoZXhpc3RpbmdQcmVDb250ZW50Tm9kZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXhpc3RpbmdDb250ZW50SW5kZXggPSB+ZXhpc3RpbmdQcmVDb250ZW50Tm9kZTsKKyAgICAgICAgICAgICAgICBleGlzdGluZ1Bvc3RDb250ZW50Tm9kZSA9IE5PTkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChvZmZzZXQoZXhpc3RpbmdQcmVDb250ZW50Tm9kZSkgPT0gUFJFRklYX09GRlNFVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBleGlzdGluZ0NvbnRlbnRJbmRleCA9IGdldEludChleGlzdGluZ1ByZUNvbnRlbnROb2RlICsgUFJFRklYX0NPTlRFTlRfT0ZGU0VUKTsKKyAgICAgICAgICAgICAgICBleGlzdGluZ1Bvc3RDb250ZW50Tm9kZSA9IGZvbGxvd0NvbnRlbnRUcmFuc2l0aW9uKGV4aXN0aW5nUHJlQ29udGVudE5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGV4aXN0aW5nUG9zdENvbnRlbnROb2RlID0gZXhpc3RpbmdQcmVDb250ZW50Tm9kZTsKKyAgICAgICAgICAgIHNldEV4aXN0aW5nUG9zdENvbnRlbnROb2RlKGV4aXN0aW5nUG9zdENvbnRlbnROb2RlKTsKKyAgICAgICAgICAgIHNldFVwZGF0ZWRQb3N0Q29udGVudE5vZGUoZXhpc3RpbmdQb3N0Q29udGVudE5vZGUpOworCisgICAgICAgICAgICBpbnQgY29udGVudEluZGV4ID0gdXBkYXRlQ29udGVudEluZGV4KG11dGF0aW9uQ29udGVudCwgZXhpc3RpbmdDb250ZW50SW5kZXgsIHRyYW5zZm9ybWVyKTsKKyAgICAgICAgICAgIHNldENvbnRlbnRJbmRleChjb250ZW50SW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbWJpbmUgZXhpc3RpbmcgYW5kIG5ldyBjb250ZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSA8VT4gaW50IHVwZGF0ZUNvbnRlbnRJbmRleChVIG11dGF0aW9uQ29udGVudCwgaW50IGV4aXN0aW5nQ29udGVudEluZGV4LCBmaW5hbCBVcHNlcnRUcmFuc2Zvcm1lcjxULCBVPiB0cmFuc2Zvcm1lcikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG11dGF0aW9uQ29udGVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ0NvbnRlbnRJbmRleCAhPSAtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFQgZXhpc3RpbmdDb250ZW50ID0gZ2V0Q29udGVudChleGlzdGluZ0NvbnRlbnRJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIFQgY29tYmluZWRDb250ZW50ID0gdHJhbnNmb3JtZXIuYXBwbHkoZXhpc3RpbmdDb250ZW50LCBtdXRhdGlvbkNvbnRlbnQpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgKGNvbWJpbmVkQ29udGVudCAhPSBudWxsKSA6ICJUcmFuc2Zvcm1lciBjYW5ub3QgYmUgdXNlZCB0byByZW1vdmUgY29udGVudC4iOworICAgICAgICAgICAgICAgICAgICBzZXRDb250ZW50KGV4aXN0aW5nQ29udGVudEluZGV4LCBjb21iaW5lZENvbnRlbnQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdDb250ZW50SW5kZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFQgY29tYmluZWRDb250ZW50ID0gdHJhbnNmb3JtZXIuYXBwbHkobnVsbCwgbXV0YXRpb25Db250ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IChjb21iaW5lZENvbnRlbnQgIT0gbnVsbCkgOiAiVHJhbnNmb3JtZXIgY2Fubm90IGJlIHVzZWQgdG8gcmVtb3ZlIGNvbnRlbnQuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkZENvbnRlbnQoY29tYmluZWRDb250ZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ29udGVudEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEF0dGFjaCBhIGNoaWxkIHRvIHRoZSBjdXJyZW50IG5vZGUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgYXR0YWNoQ2hpbGQoaW50IHRyYW5zaXRpb24sIGludCBjaGlsZCkgdGhyb3dzIFNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB1cGRhdGVkUG9zdENvbnRlbnROb2RlID0gdXBkYXRlZFBvc3RDb250ZW50Tm9kZSgpOworICAgICAgICAgICAgaWYgKGlzTnVsbCh1cGRhdGVkUG9zdENvbnRlbnROb2RlKSkKKyAgICAgICAgICAgICAgICBzZXRVcGRhdGVkUG9zdENvbnRlbnROb2RlKGV4cGFuZE9yQ3JlYXRlQ2hhaW5Ob2RlKHRyYW5zaXRpb24sIGNoaWxkKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2V0VXBkYXRlZFBvc3RDb250ZW50Tm9kZShJbk1lbW9yeVRyaWUudGhpcy5hdHRhY2hDaGlsZCh1cGRhdGVkUG9zdENvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQXBwbHkgdGhlIGNvbGxlY3RlZCBjb250ZW50IHRvIGEgbm9kZS4gQ29udmVydHMgTk9ORSB0byBhIGxlYWYgbm9kZSwgYW5kIGFkZHMgb3IgdXBkYXRlcyBhIHByZWZpeCBmb3IgYWxsCisgICAgICAgICAqIG90aGVycy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgaW50IGFwcGx5Q29udGVudCgpIHRocm93cyBTcGFjZUV4aGF1c3RlZEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY29udGVudEluZGV4ID0gY29udGVudEluZGV4KCk7CisgICAgICAgICAgICBpbnQgdXBkYXRlZFBvc3RDb250ZW50Tm9kZSA9IHVwZGF0ZWRQb3N0Q29udGVudE5vZGUoKTsKKyAgICAgICAgICAgIGlmIChjb250ZW50SW5kZXggPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZWRQb3N0Q29udGVudE5vZGU7CisKKyAgICAgICAgICAgIGlmIChpc051bGwodXBkYXRlZFBvc3RDb250ZW50Tm9kZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIH5jb250ZW50SW5kZXg7CisKKyAgICAgICAgICAgIGludCBleGlzdGluZ1ByZUNvbnRlbnROb2RlID0gZXhpc3RpbmdQcmVDb250ZW50Tm9kZSgpOworICAgICAgICAgICAgaW50IGV4aXN0aW5nUG9zdENvbnRlbnROb2RlID0gZXhpc3RpbmdQb3N0Q29udGVudE5vZGUoKTsKKworICAgICAgICAgICAgLy8gV2UgY2FuJ3QgdXBkYXRlIGluLXBsYWNlIGlmIHRoZXJlIHdhcyBubyBwcmVleGlzdGluZyBwcmVmaXgsIG9yIGlmIHRoZSBwcmVmaXggd2FzIGVtYmVkZGVkIGFuZCB0aGUgdGFyZ2V0CisgICAgICAgICAgICAvLyBub2RlIG11c3QgY2hhbmdlLgorICAgICAgICAgICAgaWYgKGV4aXN0aW5nUHJlQ29udGVudE5vZGUgPT0gZXhpc3RpbmdQb3N0Q29udGVudE5vZGUgfHwKKyAgICAgICAgICAgICAgICBpc051bGwoZXhpc3RpbmdQb3N0Q29udGVudE5vZGUpIHx8CisgICAgICAgICAgICAgICAgaXNFbWJlZGRlZFByZWZpeE5vZGUoZXhpc3RpbmdQcmVDb250ZW50Tm9kZSkgJiYgdXBkYXRlZFBvc3RDb250ZW50Tm9kZSAhPSBleGlzdGluZ1Bvc3RDb250ZW50Tm9kZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlUHJlZml4Tm9kZShjb250ZW50SW5kZXgsIHVwZGF0ZWRQb3N0Q29udGVudE5vZGUsIGlzTnVsbChleGlzdGluZ1Bvc3RDb250ZW50Tm9kZSkpOworCisgICAgICAgICAgICAvLyBPdGhlcndpc2UgbW9kaWZ5IGluIHBsYWNlCisgICAgICAgICAgICBpZiAodXBkYXRlZFBvc3RDb250ZW50Tm9kZSAhPSBleGlzdGluZ1Bvc3RDb250ZW50Tm9kZSkgLy8gdG8gdXNlIHZvbGF0aWxlIHdyaXRlIGJ1dCBhbHNvIGVuc3VyZSB3ZSBkb24ndCBjb3JydXB0IGVtYmVkZGVkIG5vZGVzCisgICAgICAgICAgICAgICAgcHV0SW50Vm9sYXRpbGUoZXhpc3RpbmdQcmVDb250ZW50Tm9kZSArIFBSRUZJWF9QT0lOVEVSX09GRlNFVCwgdXBkYXRlZFBvc3RDb250ZW50Tm9kZSk7CisgICAgICAgICAgICBhc3NlcnQgY29udGVudEluZGV4ID09IGdldEludChleGlzdGluZ1ByZUNvbnRlbnROb2RlICsgUFJFRklYX0NPTlRFTlRfT0ZGU0VUKSA6ICJVbmV4cGVjdGVkIGNoYW5nZSBvZiBjb250ZW50IGluZGV4LiI7CisgICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdQcmVDb250ZW50Tm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZnRlciBhIG5vZGUncyBjaGlsZHJlbiBhcmUgcHJvY2Vzc2VkLCB0aGlzIGlzIGNhbGxlZCB0byBhc2NlbmQgZnJvbSBpdC4gVGhpcyBtZWFucyBhcHBseWluZyB0aGUgY29sbGVjdGVkCisgICAgICAgICAqIGNvbnRlbnQgdG8gdGhlIGNvbXBpbGVkIHVwZGF0ZWRQb3N0Q29udGVudE5vZGUgYW5kIGNyZWF0aW5nIGEgbWFwcGluZyBpbiB0aGUgcGFyZW50IHRvIGl0IChvciB1cGRhdGluZyBpZgorICAgICAgICAgKiBvbmUgYWxyZWFkeSBleGlzdHMpLgorICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgc3RpbGwgaGF2ZSB3b3JrIHRvIGRvLCBmYWxzZSBpZiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBhdHRhY2hBbmRNb3ZlVG9QYXJlbnRTdGF0ZSgpIHRocm93cyBTcGFjZUV4aGF1c3RlZEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdXBkYXRlZFByZUNvbnRlbnROb2RlID0gYXBwbHlDb250ZW50KCk7CisgICAgICAgICAgICBpbnQgZXhpc3RpbmdQcmVDb250ZW50Tm9kZSA9IGV4aXN0aW5nUHJlQ29udGVudE5vZGUoKTsKKyAgICAgICAgICAgIC0tY3VycmVudERlcHRoOworICAgICAgICAgICAgaWYgKGN1cnJlbnREZXB0aCA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgcm9vdCA9PSBleGlzdGluZ1ByZUNvbnRlbnROb2RlIDogIlVuZXhwZWN0ZWQgY2hhbmdlIHRvIHJvb3QuIENvbmN1cnJlbnQgdHJpZSBtb2RpZmljYXRpb24/IjsKKyAgICAgICAgICAgICAgICBpZiAodXBkYXRlZFByZUNvbnRlbnROb2RlICE9IGV4aXN0aW5nUHJlQ29udGVudE5vZGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHdyaXRlIHRvIHJvb3QgaWYgdGhleSBhcmUgZGlmZmVyZW50ICh2YWx1ZSBkb2Vzbid0IGNoYW5nZSwgYnV0CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gaW52YWxpZGF0ZSB0aGUgdmFsdWUgaW4gb3RoZXIgY29yZXMnIGNhY2hlcyB1bm5lY2Vzc2FyaWx5KS4KKyAgICAgICAgICAgICAgICAgICAgcm9vdCA9IHVwZGF0ZWRQcmVDb250ZW50Tm9kZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHVwZGF0ZWRQcmVDb250ZW50Tm9kZSAhPSBleGlzdGluZ1ByZUNvbnRlbnROb2RlKQorICAgICAgICAgICAgICAgIGF0dGFjaENoaWxkKHRyYW5zaXRpb24oKSwgdXBkYXRlZFByZUNvbnRlbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU29tZXdoYXQgc2ltaWxhciB0byB7QGxpbmsgTWVyZ2VSZXNvbHZlcn0sIHRoaXMgZW5jYXBzdWxhdGVzIGxvZ2ljIHRvIGJlIGFwcGxpZWQgd2hlbmV2ZXIgbmV3IGNvbnRlbnQgaXMgYmVpbmcKKyAgICAgKiB1cHNlcnRlZCBpbnRvIGEge0BsaW5rIEluTWVtb3J5VHJpZX0uIFVubGlrZSB7QGxpbmsgTWVyZ2VSZXNvbHZlcn0sIHtAbGluayBVcHNlcnRUcmFuc2Zvcm1lcn0gd2lsbCBiZSBhcHBsaWVkIG5vCisgICAgICogbWF0dGVyIGlmIHRoZXJlJ3MgcHJlLWV4aXN0aW5nIGNvbnRlbnQgZm9yIHRoYXQgdHJpZSBrZXkvcGF0aCBvciBub3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+IFRoZSBjb250ZW50IHR5cGUgZm9yIHRoaXMge0BsaW5rIEluTWVtb3J5VHJpZX0uCisgICAgICogQHBhcmFtIDxVPiBUaGUgdHlwZSBvZiB0aGUgbmV3IGNvbnRlbnQgYmVpbmcgYXBwbGllZCB0byB0aGlzIHtAbGluayBJbk1lbW9yeVRyaWV9LgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgVXBzZXJ0VHJhbnNmb3JtZXI8VCwgVT4KKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGVyZSdzIGNvbnRlbnQgaW4gdGhlIHVwZGF0aW5nIHRyaWUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBleGlzdGluZyBFeGlzdGluZyBjb250ZW50IGZvciB0aGlzIGtleSwgb3IgbnVsbCBpZiB0aGVyZSBpc24ndCBhbnkuCisgICAgICAgICAqIEBwYXJhbSB1cGRhdGUgICBUaGUgdXBkYXRlLCBhbHdheXMgbm9uLW51bGwuCisgICAgICAgICAqIEByZXR1cm4gVGhlIGNvbWJpbmVkIHZhbHVlIHRvIHVzZS4gQ2Fubm90IGJlIG51bGwuCisgICAgICAgICAqLworICAgICAgICBUIGFwcGx5KFQgZXhpc3RpbmcsIFUgdXBkYXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNb2RpZnkgdGhpcyB0cmllIHRvIGFwcGx5IHRoZSBtdXRhdGlvbiBnaXZlbiBpbiB0aGUgZm9ybSBvZiBhIHRyaWUuIEFueSBjb250ZW50IGluIHRoZSBtdXRhdGlvbiB3aWxsIGJlIHJlc29sdmVkCisgICAgICogd2l0aCB0aGUgZ2l2ZW4gZnVuY3Rpb24gYmVmb3JlIGJlaW5nIHBsYWNlZCBpbiB0aGlzIHRyaWUgKGV2ZW4gaWYgdGhlcmUncyBubyBwcmUtZXhpc3RpbmcgY29udGVudCBpbiB0aGlzIHRyaWUpLgorICAgICAqIEBwYXJhbSBtdXRhdGlvbiB0aGUgbXV0YXRpb24gdG8gYmUgYXBwbGllZCwgZ2l2ZW4gaW4gdGhlIGZvcm0gb2YgYSB0cmllLiBOb3RlIHRoYXQgaXRzIGNvbnRlbnQgY2FuIGJlIG9mIHR5cGUKKyAgICAgKiBkaWZmZXJlbnQgdGhhbiB0aGUgZWxlbWVudCB0eXBlIGZvciB0aGlzIG1lbXRhYmxlIHRyaWUuCisgICAgICogQHBhcmFtIHRyYW5zZm9ybWVyIGEgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUgcG90ZW50aWFsbHkgcHJlLWV4aXN0aW5nIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5LCBhbmQgdGhlIG5ldworICAgICAqIHZhbHVlLiBBcHBsaWVkIGV2ZW4gaWYgdGhlcmUncyBubyBwcmUtZXhpc3RpbmcgdmFsdWUgaW4gdGhlIG1lbXRhYmxlIHRyaWUuCisgICAgICovCisgICAgcHVibGljIDxVPiB2b2lkIGFwcGx5KFRyaWU8VT4gbXV0YXRpb24sIGZpbmFsIFVwc2VydFRyYW5zZm9ybWVyPFQsIFU+IHRyYW5zZm9ybWVyKSB0aHJvd3MgU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEN1cnNvcjxVPiBtdXRhdGlvbkN1cnNvciA9IG11dGF0aW9uLmN1cnNvcigpOworICAgICAgICBhc3NlcnQgbXV0YXRpb25DdXJzb3IuZGVwdGgoKSA9PSAwIDogIlVuZXhwZWN0ZWQgbm9uLWZyZXNoIGN1cnNvci4iOworICAgICAgICBBcHBseVN0YXRlIHN0YXRlID0gYXBwbHlTdGF0ZTsKKyAgICAgICAgc3RhdGUucmVzZXQoKTsKKyAgICAgICAgc3RhdGUuZGVzY2VuZCgtMSwgbXV0YXRpb25DdXJzb3IuY29udGVudCgpLCB0cmFuc2Zvcm1lcik7CisgICAgICAgIGFzc2VydCBzdGF0ZS5jdXJyZW50RGVwdGggPT0gMCA6ICJVbmV4cGVjdGVkIGNoYW5nZSB0byBhcHBseVN0YXRlLiBDb25jdXJyZW50IHRyaWUgbW9kaWZpY2F0aW9uPyI7CisKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBkZXB0aCA9IG11dGF0aW9uQ3Vyc29yLmFkdmFuY2UoKTsKKyAgICAgICAgICAgIHdoaWxlIChzdGF0ZS5jdXJyZW50RGVwdGggPj0gZGVwdGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gVGhlcmUgYXJlIG5vIG1vcmUgY2hpbGRyZW4uIEFzY2VuZCB0byB0aGUgcGFyZW50IHN0YXRlIHRvIGNvbnRpbnVlIHdhbGsuCisgICAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5hdHRhY2hBbmRNb3ZlVG9QYXJlbnRTdGF0ZSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGRlcHRoID09IC0xIDogIlVuZXhwZWN0ZWQgY2hhbmdlIHRvIGFwcGx5U3RhdGUuIENvbmN1cnJlbnQgdHJpZSBtb2RpZmljYXRpb24/IjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIHRyYW5zaXRpb24sIGdldCBjaGlsZCB0byBkZXNjZW5kIGludG8KKyAgICAgICAgICAgIHN0YXRlLmRlc2NlbmQobXV0YXRpb25DdXJzb3IuaW5jb21pbmdUcmFuc2l0aW9uKCksIG11dGF0aW9uQ3Vyc29yLmNvbnRlbnQoKSwgdHJhbnNmb3JtZXIpOworICAgICAgICAgICAgYXNzZXJ0IHN0YXRlLmN1cnJlbnREZXB0aCA9PSBkZXB0aCA6ICJVbmV4cGVjdGVkIGNoYW5nZSB0byBhcHBseVN0YXRlLiBDb25jdXJyZW50IHRyaWUgbW9kaWZpY2F0aW9uPyI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXAtbGlrZSBwdXQgbWV0aG9kLCB1c2luZyB0aGUgYXBwbHkgbWFjaGluZXJ5IGFib3ZlIHdoaWNoIGNhbm5vdCBydW4gaW50byBzdGFjayBvdmVyZmxvdy4gV2hlbiB0aGUgY29ycmVjdAorICAgICAqIHBvc2l0aW9uIGluIHRoZSB0cmllIGhhcyBiZWVuIHJlYWNoZWQsIHRoZSB2YWx1ZSB3aWxsIGJlIHJlc29sdmVkIHdpdGggdGhlIGdpdmVuIGZ1bmN0aW9uIGJlZm9yZSBiZWluZyBwbGFjZWQgaW4KKyAgICAgKiB0aGUgdHJpZSAoZXZlbiBpZiB0aGVyZSdzIG5vIHByZS1leGlzdGluZyBjb250ZW50IGluIHRoaXMgdHJpZSkuCisgICAgICogQHBhcmFtIGtleSB0aGUgdHJpZSBwYXRoL2tleSBmb3IgdGhlIGdpdmVuIHZhbHVlLgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgYmVpbmcgcHV0IGluIHRoZSBtZW10YWJsZSB0cmllLiBOb3RlIHRoYXQgaXQgY2FuIGJlIG9mIHR5cGUgZGlmZmVyZW50IHRoYW4gdGhlIGVsZW1lbnQKKyAgICAgKiB0eXBlIGZvciB0aGlzIG1lbXRhYmxlIHRyaWUuIEl0J3MgdXAgdG8gdGhlIHtAY29kZSB0cmFuc2Zvcm1lcn0gdG8gcmV0dXJuIHRoZSBmaW5hbCB2YWx1ZSB0aGF0IHdpbGwgc3RheSBpbgorICAgICAqIHRoZSBtZW10YWJsZSB0cmllLgorICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1lciBhIGZ1bmN0aW9uIGFwcGxpZWQgdG8gdGhlIHBvdGVudGlhbGx5IHByZS1leGlzdGluZyB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSwgYW5kIHRoZSBuZXcKKyAgICAgKiB2YWx1ZSAob2YgYSBwb3RlbnRpYWxseSBkaWZmZXJlbnQgdHlwZSksIHJldHVybmluZyB0aGUgZmluYWwgdmFsdWUgdGhhdCB3aWxsIHN0YXkgaW4gdGhlIG1lbXRhYmxlIHRyaWUuIEFwcGxpZWQKKyAgICAgKiBldmVuIGlmIHRoZXJlJ3Mgbm8gcHJlLWV4aXN0aW5nIHZhbHVlIGluIHRoZSBtZW10YWJsZSB0cmllLgorICAgICAqLworICAgIHB1YmxpYyA8Uj4gdm9pZCBwdXRTaW5nbGV0b24oQnl0ZUNvbXBhcmFibGUga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwc2VydFRyYW5zZm9ybWVyPFQsID8gc3VwZXIgUj4gdHJhbnNmb3JtZXIpIHRocm93cyBTcGFjZUV4aGF1c3RlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgYXBwbHkoVHJpZS5zaW5nbGV0b24oa2V5LCB2YWx1ZSksIHRyYW5zZm9ybWVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHZlcnNpb24gb2YgcHV0U2luZ2xldG9uIHdoaWNoIHVzZXMgcmVjdXJzaXZlIHB1dCBpZiB0aGUgbGFzdCBhcmd1bWVudCBpcyB0cnVlLgorICAgICAqLworICAgIHB1YmxpYyA8Uj4gdm9pZCBwdXRTaW5nbGV0b24oQnl0ZUNvbXBhcmFibGUga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwc2VydFRyYW5zZm9ybWVyPFQsID8gc3VwZXIgUj4gdHJhbnNmb3JtZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZVJlY3Vyc2l2ZSkgdGhyb3dzIFNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAodXNlUmVjdXJzaXZlKQorICAgICAgICAgICAgcHV0UmVjdXJzaXZlKGtleSwgdmFsdWUsIHRyYW5zZm9ybWVyKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHV0U2luZ2xldG9uKGtleSwgdmFsdWUsIHRyYW5zZm9ybWVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXAtbGlrZSBwdXQgbWV0aG9kLCB1c2luZyBhIGZhc3QgcmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIHRocm91Z2ggdGhlIGtleSBieXRlcy4gTWF5IHJ1biBpbnRvIHN0YWNrIG92ZXJmbG93IGlmCisgICAgICogdGhlIHRyaWUgYmVjb21lcyB0b28gZGVlcC4gV2hlbiB0aGUgY29ycmVjdCBwb3NpdGlvbiBpbiB0aGUgdHJpZSBoYXMgYmVlbiByZWFjaGVkLCB0aGUgdmFsdWUgd2lsbCBiZSByZXNvbHZlZAorICAgICAqIHdpdGggdGhlIGdpdmVuIGZ1bmN0aW9uIGJlZm9yZSBiZWluZyBwbGFjZWQgaW4gdGhlIHRyaWUgKGV2ZW4gaWYgdGhlcmUncyBubyBwcmUtZXhpc3RpbmcgY29udGVudCBpbiB0aGlzIHRyaWUpLgorICAgICAqIEBwYXJhbSBrZXkgdGhlIHRyaWUgcGF0aC9rZXkgZm9yIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIGJlaW5nIHB1dCBpbiB0aGUgbWVtdGFibGUgdHJpZS4gTm90ZSB0aGF0IGl0IGNhbiBiZSBvZiB0eXBlIGRpZmZlcmVudCB0aGFuIHRoZSBlbGVtZW50CisgICAgICogdHlwZSBmb3IgdGhpcyBtZW10YWJsZSB0cmllLiBJdCdzIHVwIHRvIHRoZSB7QGNvZGUgdHJhbnNmb3JtZXJ9IHRvIHJldHVybiB0aGUgZmluYWwgdmFsdWUgdGhhdCB3aWxsIHN0YXkgaW4KKyAgICAgKiB0aGUgbWVtdGFibGUgdHJpZS4KKyAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgYSBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSBwb3RlbnRpYWxseSBwcmUtZXhpc3RpbmcgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXksIGFuZCB0aGUgbmV3CisgICAgICogdmFsdWUgKG9mIGEgcG90ZW50aWFsbHkgZGlmZmVyZW50IHR5cGUpLCByZXR1cm5pbmcgdGhlIGZpbmFsIHZhbHVlIHRoYXQgd2lsbCBzdGF5IGluIHRoZSBtZW10YWJsZSB0cmllLiBBcHBsaWVkCisgICAgICogZXZlbiBpZiB0aGVyZSdzIG5vIHByZS1leGlzdGluZyB2YWx1ZSBpbiB0aGUgbWVtdGFibGUgdHJpZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFI+IHZvaWQgcHV0UmVjdXJzaXZlKEJ5dGVDb21wYXJhYmxlIGtleSwgUiB2YWx1ZSwgZmluYWwgVXBzZXJ0VHJhbnNmb3JtZXI8VCwgUj4gdHJhbnNmb3JtZXIpIHRocm93cyBTcGFjZUV4aGF1c3RlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaW50IG5ld1Jvb3QgPSBwdXRSZWN1cnNpdmUocm9vdCwga2V5LmFzQ29tcGFyYWJsZUJ5dGVzKEJZVEVfQ09NUEFSQUJMRV9WRVJTSU9OKSwgdmFsdWUsIHRyYW5zZm9ybWVyKTsKKyAgICAgICAgaWYgKG5ld1Jvb3QgIT0gcm9vdCkKKyAgICAgICAgICAgIHJvb3QgPSBuZXdSb290OworICAgIH0KKworICAgIHByaXZhdGUgPFI+IGludCBwdXRSZWN1cnNpdmUoaW50IG5vZGUsIEJ5dGVTb3VyY2Uga2V5LCBSIHZhbHVlLCBmaW5hbCBVcHNlcnRUcmFuc2Zvcm1lcjxULCBSPiB0cmFuc2Zvcm1lcikgdGhyb3dzIFNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBpbnQgdHJhbnNpdGlvbiA9IGtleS5uZXh0KCk7CisgICAgICAgIGlmICh0cmFuc2l0aW9uID09IEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybiBhcHBseUNvbnRlbnQobm9kZSwgdmFsdWUsIHRyYW5zZm9ybWVyKTsKKworICAgICAgICBpbnQgY2hpbGQgPSBnZXRDaGlsZChub2RlLCB0cmFuc2l0aW9uKTsKKworICAgICAgICBpbnQgbmV3Q2hpbGQgPSBwdXRSZWN1cnNpdmUoY2hpbGQsIGtleSwgdmFsdWUsIHRyYW5zZm9ybWVyKTsKKyAgICAgICAgaWYgKG5ld0NoaWxkID09IGNoaWxkKQorICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisKKyAgICAgICAgaW50IHNraXBwZWRDb250ZW50ID0gZm9sbG93Q29udGVudFRyYW5zaXRpb24obm9kZSk7CisgICAgICAgIGludCBhdHRhY2hlZENoaWxkID0gIWlzTnVsbChza2lwcGVkQ29udGVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGF0dGFjaENoaWxkKHNraXBwZWRDb250ZW50LCB0cmFuc2l0aW9uLCBuZXdDaGlsZCkgIC8vIFNpbmdsZSBwYXRoLCBubyBjb3B5aW5nIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBleHBhbmRPckNyZWF0ZUNoYWluTm9kZSh0cmFuc2l0aW9uLCBuZXdDaGlsZCk7CisKKyAgICAgICAgcmV0dXJuIHByZXNlcnZlQ29udGVudChub2RlLCBza2lwcGVkQ29udGVudCwgYXR0YWNoZWRDaGlsZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSA8Uj4gaW50IGFwcGx5Q29udGVudChpbnQgbm9kZSwgUiB2YWx1ZSwgVXBzZXJ0VHJhbnNmb3JtZXI8VCwgUj4gdHJhbnNmb3JtZXIpIHRocm93cyBTcGFjZUV4aGF1c3RlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKGlzTnVsbChub2RlKSkKKyAgICAgICAgICAgIHJldHVybiB+YWRkQ29udGVudCh0cmFuc2Zvcm1lci5hcHBseShudWxsLCB2YWx1ZSkpOworCisgICAgICAgIGlmIChpc0xlYWYobm9kZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjb250ZW50SW5kZXggPSB+bm9kZTsKKyAgICAgICAgICAgIHNldENvbnRlbnQoY29udGVudEluZGV4LCB0cmFuc2Zvcm1lci5hcHBseShnZXRDb250ZW50KGNvbnRlbnRJbmRleCksIHZhbHVlKSk7CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvZmZzZXQobm9kZSkgPT0gUFJFRklYX09GRlNFVCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNvbnRlbnRJbmRleCA9IGdldEludChub2RlICsgUFJFRklYX0NPTlRFTlRfT0ZGU0VUKTsKKyAgICAgICAgICAgIHNldENvbnRlbnQoY29udGVudEluZGV4LCB0cmFuc2Zvcm1lci5hcHBseShnZXRDb250ZW50KGNvbnRlbnRJbmRleCksIHZhbHVlKSk7CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gY3JlYXRlUHJlZml4Tm9kZShhZGRDb250ZW50KHRyYW5zZm9ybWVyLmFwcGx5KG51bGwsIHZhbHVlKSksIG5vZGUsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFsbG9jYXRpb24gdGhyZXNob2xkIGhhcyBiZWVuIHJlYWNoZWQuIFRvIGJlIGNhbGxlZCBieSB0aGUgdGhlIHdyaXRpbmcgdGhyZWFkIChpZGVhbGx5LCBqdXN0CisgICAgICogYWZ0ZXIgdGhlIHdyaXRlIGNvbXBsZXRlcykuIFdoZW4gdGhpcyByZXR1cm5zIHRydWUsIHRoZSB1c2VyIHNob3VsZCBzd2l0Y2ggdG8gYSBuZXcgdHJpZSBhcyBzb29uIGFzIGZlYXNpYmxlLgorICAgICAqCisgICAgICogVGhlIHRyaWUgZXhwZWN0cyB1cCB0byAxMCUgZ3Jvd3RoIGFib3ZlIHRoaXMgdGhyZXNob2xkLiBBbnkgZ3Jvd3RoIGJleW9uZCB0aGF0IG1heSBiZSBkb25lIGluZWZmaWNpZW50bHksIGFuZAorICAgICAqIHRoZSB0cmllIHdpbGwgZmFpbCBhbHRvZ2V0aGVyIHdoZW4gdGhlIHNpemUgZ3Jvd3MgYmV5b25kIDJHIC0gMjU2IGJ5dGVzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlYWNoZWRBbGxvY2F0ZWRTaXplVGhyZXNob2xkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBhbGxvY2F0ZWRQb3MgPj0gQUxMT0NBVEVEX1NJWkVfVEhSRVNIT0xEOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvciB0ZXN0cyBvbmx5ISBBZHZhbmNlIHRoZSBhbGxvY2F0aW9uIHBvaW50ZXIgKGFuZCBhbGxvY2F0ZSBzcGFjZSkgYnkgdGhpcyBtdWNoIHRvIHRlc3QgYmVoYXZpb3VyIGNsb3NlIHRvCisgICAgICogZnVsbC4KKyAgICAgKi8KKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBpbnQgYWR2YW5jZUFsbG9jYXRlZFBvcyhpbnQgd2FudGVkUG9zKSB0aHJvd3MgU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHdoaWxlIChhbGxvY2F0ZWRQb3MgPCB3YW50ZWRQb3MpCisgICAgICAgICAgICBhbGxvY2F0ZUJsb2NrKCk7CisgICAgICAgIHJldHVybiBhbGxvY2F0ZWRQb3M7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdGhlIG9mZiBoZWFwIHNpemUgb2YgdGhlIG1lbXRhYmxlIHRyaWUgaXRzZWxmLCBub3QgY291bnRpbmcgYW55IHNwYWNlIHRha2VuIGJ5IHJlZmVyZW5jZWQgY29udGVudC4gKi8KKyAgICBwdWJsaWMgbG9uZyBzaXplT2ZmSGVhcCgpCisgICAgeworICAgICAgICByZXR1cm4gYnVmZmVyVHlwZSA9PSBCdWZmZXJUeXBlLk9OX0hFQVAgPyAwIDogYWxsb2NhdGVkUG9zOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSBvbiBoZWFwIHNpemUgb2YgdGhlIG1lbXRhYmxlIHRyaWUgaXRzZWxmLCBub3QgY291bnRpbmcgYW55IHNwYWNlIHRha2VuIGJ5IHJlZmVyZW5jZWQgY29udGVudC4gKi8KKyAgICBwdWJsaWMgbG9uZyBzaXplT25IZWFwKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb250ZW50Q291bnQgKiBNZW1vcnlMYXlvdXRTcGVjaWZpY2F0aW9uLlNQRUMuZ2V0UmVmZXJlbmNlU2l6ZSgpICsKKyAgICAgICAgICAgICAgIFJFRkVSRU5DRV9BUlJBWV9PTl9IRUFQX1NJWkUgKiBnZXRDaHVua0lkeChjb250ZW50Q291bnQsIENPTlRFTlRTX1NUQVJUX1NISUZULCBDT05URU5UU19TVEFSVF9TSVpFKSArCisgICAgICAgICAgICAgICAoYnVmZmVyVHlwZSA9PSBCdWZmZXJUeXBlLk9OX0hFQVAgPyBhbGxvY2F0ZWRQb3MgKyBFTVBUWV9TSVpFX09OX0hFQVAgOiBFTVBUWV9TSVpFX09GRl9IRUFQKSArCisgICAgICAgICAgICAgICBSRUZFUkVOQ0VfQVJSQVlfT05fSEVBUF9TSVpFICogZ2V0Q2h1bmtJZHgoYWxsb2NhdGVkUG9zLCBCVUZfU1RBUlRfU0hJRlQsIEJVRl9TVEFSVF9TSVpFKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSXRlcmFibGU8VD4gdmFsdWVzVW5vcmRlcmVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKSAtPiBuZXcgSXRlcmF0b3I8VD4oKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaWR4ID0gMDsKKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlkeCA8IGNvbnRlbnRDb3VudDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFQgbmV4dCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFoYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29udGVudChpZHgrKyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHVibGljIGludCB2YWx1ZXNDb3VudCgpCisgICAgeworICAgICAgICByZXR1cm4gY29udGVudENvdW50OworICAgIH0KKworICAgIHB1YmxpYyBsb25nIHVudXNlZFJlc2VydmVkTWVtb3J5KCkKKyAgICB7CisgICAgICAgIGludCBidWZmZXJPdmVyaGVhZCA9IDA7CisgICAgICAgIGlmIChidWZmZXJUeXBlID09IEJ1ZmZlclR5cGUuT05fSEVBUCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHBvcyA9IHRoaXMuYWxsb2NhdGVkUG9zOworICAgICAgICAgICAgVW5zYWZlQnVmZmVyIGJ1ZmZlciA9IGdldENodW5rKHBvcyk7CisgICAgICAgICAgICBpZiAoYnVmZmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgYnVmZmVyT3ZlcmhlYWQgPSBidWZmZXIuY2FwYWNpdHkoKSAtIGluQ2h1bmtQb2ludGVyKHBvcyk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgaW5kZXggPSBjb250ZW50Q291bnQ7CisgICAgICAgIGludCBsZWFkQml0ID0gZ2V0Q2h1bmtJZHgoaW5kZXgsIENPTlRFTlRTX1NUQVJUX1NISUZULCBDT05URU5UU19TVEFSVF9TSVpFKTsKKyAgICAgICAgaW50IG9mcyA9IGluQ2h1bmtQb2ludGVyKGluZGV4LCBsZWFkQml0LCBDT05URU5UU19TVEFSVF9TSVpFKTsKKyAgICAgICAgQXRvbWljUmVmZXJlbmNlQXJyYXk8VD4gY29udGVudEFycmF5ID0gY29udGVudEFycmF5c1tsZWFkQml0XTsKKyAgICAgICAgaW50IGNvbnRlbnRPdmVyaGVhZCA9ICgoY29udGVudEFycmF5ICE9IG51bGwgPyBjb250ZW50QXJyYXkubGVuZ3RoKCkgOiAwKSAtIG9mcykgKiBNZW1vcnlMYXlvdXRTcGVjaWZpY2F0aW9uLlNQRUMuZ2V0UmVmZXJlbmNlU2l6ZSgpOworCisgICAgICAgIHJldHVybiBidWZmZXJPdmVyaGVhZCArIGNvbnRlbnRPdmVyaGVhZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDljMTQwOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZApAQCAtMCwwICsxLDc1MyBAQAorPCEtLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCisjIEluTWVtb3J5VHJpZSBEZXNpZ24KKworVGhlIGBJbk1lbW9yeVRyaWVgIGlzIG9uZSBvZiB0aGUgbWFpbiBjb21wb25lbnRzIG9mIHRoZSB0cmllIGluZnJhc3RydWN0dXJlLCBhIG11dGFibGUgaW4tbWVtb3J5IHRyaWUgYnVpbHQgZm9yIGZhc3QKK21vZGlmaWNhdGlvbiBhbmQgcmVhZHMgZXhlY3V0aW5nIGNvbmN1cnJlbnRseSB3aXRoIHdyaXRlcyBmcm9tIGEgc2luZ2xlIG11dGF0b3IgdGhyZWFkLgorCitUaGUgbWFpbiBmZWF0dXJlcyBvZiBpdHMgaW1wbGVtZW50YXRpb24gYXJlOgorLSBmdWxsIHN1cHBvcnQgb2YgdGhlIGBUcmllYCBpbnRlcmZhY2UKKy0gdXNpbmcgbm9kZXMgb2Ygc2V2ZXJhbCBkaWZmZXJlbnQgdHlwZXMgZm9yIGVmZmljaWVuY3kKKy0gc3VwcG9ydCBmb3IgY29udGVudCBvbiBhbnkgbm9kZSwgaW5jbHVkaW5nIGludGVybWVkaWF0ZSAocHJlZml4KQorLSBzdXBwb3J0IGZvciB3cml0ZXMgZnJvbSBhIHNpbmdsZSBtdXRhdG9yIHRocmVhZCBjb25jdXJyZW50IHdpdGggbXVsdGlwbGUgcmVhZGVycworLSBtYXhpbXVtIHRyaWUgc2l6ZSBvZiAyR0IKKworCisjIyBNZW1vcnkgbGF5b3V0CisKK09uZSBvZiB0aGUgbWFpbiBkZXNpZ24gZHJpdmVycyBvZiB0aGUgbWVtdGFibGUgdHJpZSBpcyB0aGUgZGVzaXJlIHRvIGF2b2lkIG9uLWhlYXAgc3RvcmFnZSBhbmQgSmF2YSBvYmplY3QgbWFuYWdlbWVudC4KK1RoZSB0cmllIHRodXMgaW1wbGVtZW50cyBpdHMgb3duIG1lbW9yeSBtYW5hZ2VtZW50IGZvciB0aGUgc3RydWN0dXJlIG9mIHRoZSB0cmllIChjb250ZW50IGlzLCBhdCB0aGlzIHRpbWUsIHN0aWxsIGdpdmVuCithcyBKYXZhIG9iamVjdHMgaW4gYSBjb250ZW50IGFycmF5KS4gVGhlIHN0cnVjdHVyZSByZXNpZGVzIGluIG9uZSBgVW5zYWZlQnVmZmVyYCAod2hpY2ggY2FuIGJlIG9uIG9yIG9mZiBoZWFwIGFzCitkZXNpcmVkKSBhbmQgaXMgYnJva2VuIHVwIGluIDMyLWJ5dGUgImNlbGxzIiAoYWxzbyBjYWxsZWQgImJsb2NrcyIgaW4gdGhlIGNvZGUpLCB3aGljaCBhcmUgdGhlIHVuaXQgb2YgYWxsb2NhdGlvbiwKK3VwZGF0ZSBhbmQgcmV1c2UuCisKK0xpa2UgYWxsIHRyaWVzLCBgSW5NZW1vcnlUcmllYCBpcyBidWlsdCBmcm9tIG5vZGVzIGFuZCBoYXMgYSByb290IHBvaW50ZXIuIFRoZSBub2RlcyByZXNpZGUgaW4gY2VsbHMsIGJ1dCB0aGVyZSBpcyBubworMToxIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gbm9kZXMgYW5kIGNlbGxzIC0gc29tZSBub2RlIHR5cGVzIHBhY2sgbXVsdGlwbGUgaW4gb25lIGNlbGwsIHdoaWxlIG90aGVyIHR5cGVzIHJlcXVpcmUKK211bHRpcGxlIGNlbGxzLgorCisjIyMgUG9pbnRlcnMgYW5kIG5vZGUgdHlwZXMKKworQSAicG9pbnRlciIgaXMgYW4gaW50ZWdlciB0aGF0IHBvaW50cyB0byBhIG5vZGUgaW4gdGhlIHRyaWUgYnVmZmVyLiBBIHBvaW50ZXIgc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgbm9kZQorKGl0cyBzdGFydGluZyBjZWxsKSwgYnV0IGFsc28gZGVmaW5lcyB0aGUgdHlwZSBvZiBub2RlIGluIGl0cyA1IGxvd2VzdC1vcmRlciBiaXRzIChpLmUuIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBjZWxsKS4KK0lmIGEgcG9pbnRlciBoYXMgYSBuZWdhdGl2ZSB2YWx1ZSwgaXQgcmVmZXJzIHRvIGEgdmFsdWUgaW4gdGhlIGNvbnRlbnQgYXJyYXksIGFuZCBpbXBsaWVzIGEgbGVhZiBub2RlIHdpdGggdGhlIHNwZWNpZmllZAorY29udGVudC4gQWRkaXRpb25hbGx5LCB0aGUgc3BlY2lhbCBwb2ludGVyIHZhbHVlIGBOT05FYCAoMCkgaXMgdXNlZCB0byBzcGVjaWZ5ICJubyBjaGlsZCIuIFdlIHVzZSAzMi1iaXQgaW50ZWdlcnMgYXMKK3BvaW50ZXJzLCB0aGVyZWZvcmUgdGhlIHNpemUgb2YgdGhlIHRyaWUgc3RydWN0dXJlIGlzIGxpbWl0ZWQgdG8gYSBsaXR0bGUgbGVzcyB0aGFuIDJHQi4KKworRm9yIGV4YW1wbGUsIHRoZSBwb2ludGVyIGAweDAxMDlFYCBzcGVjaWZpZXMgYSBub2RlIHJlc2lkaW5nIGluIHRoZSBjZWxsIGF0IGJ5dGVzIGAweDAxMDgwYC1gMHgwMTA5RmAgaW4gdGhlIGJ1ZmZlcgorKHNwZWNpZmllZCBieSB0aGUgcG9pbnRlcnMnIDI3IGxlYWRpbmcgYml0cyksIHdoZXJlIHRoZSBub2RlIHR5cGUgaXMgYFNwYXJzZWAgKHNwZWNpZmllZCBieSBgMHgxRWAgaW4gdGhlIGxhc3QgNSBiaXRzKS4KKworVGhlIHBvaW50ZXIgYDB4RkZGRkZGRjBgIHNwZWNpZmllcyBhIGxlYWYgbm9kZSAoYmVpbmcgbmVnYXRpdmUpLCB3aGVyZSB0aGUgY29udGVudCdzIGluZGV4IGlzIGAweEZgIChvYnRhaW5lZCBieQorbmVnYXRpbmcgYWxsIGJpdHMgb2YgdGhlIHBvaW50ZXIpLgorCitUbyBzYXZlIHNwYWNlIGFuZCByZWR1Y2UgcG9pbnRlciBjaGFzaW5nLCB3ZSB1c2Ugc2V2ZXJhbCBkaWZmZXJlbnQgdHlwZXMgb2Ygbm9kZXMgdGhhdCBhZGRyZXNzIGRpZmZlcmVudCBjb21tb24gcGF0dGVybnMKK2luIGEgdHJpZS4gSXQgaXMgY29tbW9uIGZvciBhIHRyaWUgdG8gaGF2ZSBvbmUgb3IgYSBjb3VwbGUgb2YgdG9wIGxldmVscyB3aGljaCBoYXZlIG1hbnkgY2hpbGRyZW4sIGFuZCB3aGVyZSBpdCBpcworaW1wb3J0YW50IHRvIG1ha2UgZGVjaXNpb25zIHdpdGggYXMgZmV3IGlmLXRoZW4tZWxzZSBicmFuY2hlcyBhcyBwb3NzaWJsZSAoc2VydmVkIGJ5IHRoZSBgU3BsaXRgIHR5cGUpLCBhbm90aGVyIG9uZSBvcgordHdvIGxldmVscyBvZiBub2RlcyB3aXRoIGEgc21hbGwgbnVtYmVyIG9mIGNoaWxkcmVuLCB3aGVyZSBpdCBpcyBtb3N0IGltcG9ydGFudCB0byBzYXZlIHNwYWNlIGFzIHRoZSBudW1iZXIgb2YgdGhlc2UKK25vZGVzIGlzIGhpZ2ggKHNlcnZlZCBieSB0aGUgYFNwYXJzZWAgdHlwZSksIGFuZCBhIGxvdCBvZiBzZXF1ZW5jZXMgb2Ygc2luZ2xlLWNoaWxkIG5vZGVzIGNvbnRhaW5pbmcgdGhlIHRyYWlsaW5nIGJ5dGVzCitvZiB0aGUga2V5IG9yIG9mIHNvbWUgY29tbW9uIGtleSBwcmVmaXggKHNlcnZlZCBieSB0aGUgYENoYWluYCB0eXBlKS4gTW9zdCBvZiB0aGUgcGF5bG9hZC9jb250ZW50IG9mIHRoZSB0cmllIHJlc2lkZXMKK2F0IHRoZSBsZWF2ZXMsIHdoZXJlIGl0IG1ha2VzIHNlbnNlIHRvIGF2b2lkIHRha2luZyBhbnkgc3BhY2UgZm9yIGEgbm9kZSAodGhlIGBMZWFmYCB0eXBlKSwgYnV0IHdlIG11c3QgYWxzbyBhbGxvdyB0aGUKK3Bvc3NpYmlsaXR5IGZvciB2YWx1ZXMgdG8gYmUgcHJlc2VudCBpbiBpbnRlcm1lZGlhdGUgbm9kZXMgJm1kYXNoOyBiZWNhdXNlIHRoaXMgaXMgcmFyZSwgd2Ugc3VwcG9ydCBpdCB3aXRoIGEgc3BlY2lhbAorYFByZWZpeGAgdHlwZSBpbnN0ZWFkIG9mIHJlc2VydmluZyBhIHNwYWNlIGZvciBwYXlsb2FkIGluIGFsbCBvdGhlciBub2RlIHR5cGVzLgorCitUaGUgU3BsaXQtU3BhcnNlLUNoYWluLUxlYWYvUHJlZml4IHBhdHRlcm4gbWF5IHJlcGVhdCBzZXZlcmFsIHRpbWVzLiBGb3IgZXhhbXBsZSwgd2UgY291bGQgaGF2ZSB0aGVzZSBmb3VyIGxheWVycyBmb3IKK3RoZSBwYXJ0aXRpb24ga2V5IHdpdGggc29tZSBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcnRpdGlvbiwgdGhlbiBmb3IgdGhlIGZpcnN0IGNvbXBvbmVudCBvZiB0aGUgY2x1c3RlcmluZyBrZXksCit0aGVuIGZvciB0aGUgc2Vjb25kIGNvbXBvbmVudCBldGMuCisKK1RoZSBzZWN0aW9ucyBiZWxvdyBzcGVjaWZ5IHRoZSBsYXlvdXQgb2YgZWFjaCBzdXBwb3J0ZWQgbm9kZSB0eXBlLgorCisjIyMjIExlYWYgbm9kZXMKKworTGVhZiBub2RlcyBkbyBub3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgY2VsbCBpbiB0aGUgYnVmZmVyLiBJbnN0ZWFkLCB0aGV5IHJlZmVyZW5jZSBhIHZhbHVlIChpLmUuIGEgUE9KTyBpbiB0aGUKK2BJbk1lbW9yeVRyaWVgJ3MgY29udGVudCB0eXBlKSBpbiB0aGUgY29udGVudCBhcnJheS4gVGhlIGluZGV4IG9mIHRoZSB2YWx1ZSBpcyBzcGVjaWZpZWQgYnkgYH5wb2ludGVyYCAodW5saWtlIGAteGAsCitgfnhgIGFsbG93cyBvbmUgdG8gYWxzbyBlbmNvZGUgMCBpbiBhIG5lZ2F0aXZlIG51bWJlcikuCisKK0xlYWYgbm9kZXMgaGF2ZSBubyBjaGlsZHJlbiwgYW5kIHJldHVybiB0aGUgc3BlY2lmaWVkIHZhbHVlIGZvciBgY29udGVudCgpYC4KKworRXhhbXBsZTogLTEgaXMgYSBsZWFmIGNlbGwgd2l0aCBjb250ZW50IGBjb250ZW50QXJyYXlbMF1gLgorCisjIyMjIGBDaGFpbmAgbm9kZXMgLSBzaW5nbGUgcGF0aCwgbXVsdGlwbGUgdHJhbnNpdGlvbnMgaW4gb25lIGNlbGwKKworQ2hhaW4gbm9kZXMgYXJlIG9uZS1jaGlsZCBub2Rlcy4gTXVsdGlwbGUgY2hhaW4gbm9kZXMsIGZvcm1pbmcgYSBjaGFpbiBvZiB0cmFuc2l0aW9ucyB0byBvbmUgdGFyZ2V0LCBjYW4gcmVzaWRlIGluIGEKK3NpbmdsZSBjZWxsLiBDaGFpbiBub2RlcyBhcmUgaWRlbnRpZmllZCBieSB0aGUgbG93ZXN0IDUgYml0cyBvZiBhIHBvaW50ZXIgYmVpbmcgYmV0d2VlbiBgMHgwMGAgYW5kIGAweDFCYC4gSW4gYWRkaXRpb24KK3RvIHRoZSB0eXBlIG9mIG5vZGUsIGluIHRoaXMgY2FzZSB0aGUgYml0cyBhbHNvIGRlZmluZSB0aGUgbGVuZ3RoIG9mIHRoZSBjaGFpbiAmbWRhc2g7IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KK2AweDFDYCBhbmQgdGhlIHBvaW50ZXIgb2Zmc2V0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGNoYWluLgorCitUaGUgc2ltcGxlc3QgY2hhaW4gbm9kZSBoYXMgb25lIHRyYW5zaXRpb24gbGVhZGluZyB0byBvbmUgY2hpbGQgYW5kIGlzIGxhaWQgb3V0IGxpa2UgdGhpczoKKworb2Zmc2V0fGNvbnRlbnR8ZXhhbXBsZQorLS0tfC0tLXwtLS0KKzAwIC0gMUF8dW51c2VkfAorMUIgICAgIHxjaGFyYWN0ZXJ8NDEgQQorMUMgLSAxRnxjaGlsZCBwb2ludGVyfEZGRkZGRkZGCisKK3doZXJlIHRoZSBwb2ludGVyIHBvaW50cyB0byB0aGUgYDFCYCBsaW5lIGluIHRoZSBjZWxsLgorCitFeGFtcGxlOiBUaGUgY2VsbCBgeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4NDEgRkZGRkZGRkZgIGF0IGJ5dGVzIGAweDEyMGAtYDB4MTNGYCBhbmQKK3BvaW50ZXIgYDB4MTNCYCBwb2ludCB0byBhIG5vZGUgd2l0aCBvbmUgY2hpbGQgd2l0aCB0cmFuc2l0aW9uIGAweDQxYCBgQWAgdG8gYSBsZWFmIG5vZGUgd2l0aCBjb250ZW50IGBjb250ZW50QXJyYXlbMF1gLgorCitBbm90aGVyIGNoYWluIGNlbGwsIHdoaWNoIHBvaW50cyB0byB0aGlzIG9uZSwgY2FuIGJlIGFkZGVkIGluIHRoZSBzYW1lIGNlbGwgYnkgcGxhY2luZyBhIGNoYXJhY3RlciBhdCBvZmZzZXQgYDFBYC4gVGhpcworbmV3IG5vZGUgaXMgZWZmZWN0aXZlbHkgbGFpZCBvdXQgYXMKKworb2Zmc2V0fGNvbnRlbnR8ZXhhbXBsZQorLS0tfC0tLXwtLS0KKzAwIC0gMTl8dW51c2VkfAorMUEgICAgIHxjaGFyYWN0ZXJ8NDggSAorMUIgLSAxRnx1bnVzZWR8CisKK3doZXJlIHRoZSBwb2ludGVyIHBvaW50cyB0byBsaW5lIGAxQWAuIFRoaXMgbm9kZSBoYXMgb25lIHRyYW5zaXRpb24sIGFuZCB0aGUgY2hpbGQgcG9pbnRlciBpcyBpbXBsaWNpdCBhcyB0aGUgbm9kZSdzCitwb2ludGVyIHBsdXMgb25lLgorCitUaGlzIGNhbiBjb250aW51ZSB1bnRpbCBhbGwgdGhlIGJ5dGVzIGluIHRoZSAidW51c2VkIiBhcmVhIGFyZSBmaWxsZWQuCisKK0V4YW1wbGU6IFRoZSBjZWxsIGB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eDQzNDg0MSBGRkZGRkZGRmAgYXQgYnl0ZXMgYDB4MTIwYC1gMHgxM0ZgIGFuZAorcG9pbnRlciBgMHgxMzlgIHBvaW50IHRvIGEgbm9kZSB3aXRoIG9uZSBjaGlsZCB3aXRoIHRyYW5zaXRpb24gYDB4NDNgIGBDYCB0byBhIG5vZGUgd2l0aCBvbmUgY2hpbGQgd2l0aCB0cmFuc2l0aW9uCitgMHg0OGAgYEhgIHRvIGEgbm9kZSB3aXRoIG9uZSBjaGlsZCB3aXRoIHRyYW5zaXRpb24gYDB4NDFgIGBBYCB0byBhIGxlYWYgbm9kZSB3aXRoIGNvbnRlbnQgYGNvbnRlbnRBcnJheVswXWAuCisKK29mZnNldHxjb250ZW50fGV4YW1wbGUKKy0tLXwtLS18LS0tCiswMCAtIDE4fHVudXNlZHwKKzE5ICAgICB8Y2hhcmFjdGVyfDQzIEMKKzFBICAgICB8Y2hhcmFjdGVyfDQ4IEgKKzFCICAgICB8Y2hhcmFjdGVyfDQxIEEKKzFDIC0gMUZ8Y2hpbGQgcG9pbnRlcnxGRkZGRkZGRgorCisKK0luIHRoaXMgZXhhbXBsZSBgMHgxM0FgIGFuZCBgMHgxM0JgIGFyZSBhbHNvIHZhbGlkIHBvaW50ZXJzIHRvIHRoZSByZXNwZWN0aXZlIGNoYWlucyBhbmQgY291bGQgYmUgcmVmZXJlbmNlZCBmcm9tIG90aGVyCitub2RlcyAoYW4gZXhhbXBsZSB3aWxsIGJlIGdpdmVuIGJlbG93KS4gSW4gYW55IGNhc2UsIHRoZSBieXRlIHBvaW50ZWQgZGlyZWN0bHkgYnkgdGhlIG5vZGUgcG9pbnRlciBjb250YWlucyB0aGUKK3RyYW5zaXRpb24gYnl0ZS4gVGhlIGNoaWxkIHBvaW50ZXIgaXMgZWl0aGVyIGBwb2ludGVyICsgMWAgKGlmIHRoZSBsb3dlc3QgNSBwb2ludGVyIGJpdHMgYXJlIGxlc3MgdGhhbiBgMHgxQmApLCBvciB0aGUKK2ludGVnZXIgc3RvcmVkIGF0IGBwb2ludGVyICsgMWAgKGlmIHRoZSBwb2ludGVyJ3MgbGFzdCA1IGJpdHMgYXJlIGAweDFCYCkuCisKKyFbZ3JhcGhdKEluTWVtb3J5VHJpZS5tZC5nMS5zdmcpCisKK05vdGU6IG9mZnNldCBgMHgwMGAgYWxzbyBzcGVjaWZpZXMgYSBjaGFpbiBub2RlLCBidXQgdGhlIHBvaW50ZXIgMCBpcyBhIHNwZWNpYWwgY2FzZSBhbmQgY2FyZSBtdXN0IGJlIHRha2VuIHRvIGVuc3VyZSBubworMjgtYnl0ZSBjaGFpbiBub2RlIGlzIHBsYWNlZCBpbiB0aGUgY2VsbCBhdCBieXRlcyBgMHgwMGAtYDB4MUZgLgorCisjIyMjIGBTcGFyc2VgIG5vZGVzIC0gYmV0d2VlbiAyIGFuZCA2IGNoaWxkcmVuIGluIG9uZSBjZWxsCisKK1NwYXJzZSBub2RlcyBhcmUgdXNlZCB3aGVuIGEgbm9kZSBoYXMgYXQgbGVhc3QgdHdvIGNoaWxkcmVuLCBhbmQgYWxsIHBvaW50ZXJzIGFuZCB0cmFuc2l0aW9uIGNoYXJhY3RlcnMgY2FuIGZpdCBpbiBvbmUKK2NlbGwsIHdoaWNoIGxpbWl0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hpbGRyZW4gdG8gNi4gVGhlaXIgbGF5b3V0IGlzOgorCitvZmZzZXR8Y29udGVudHwKKy0tLXwtLS18CiswMCAtIDAzfGNoaWxkIHBvaW50ZXIgMHwKKzA0IC0gMDd8Y2hpbGQgcG9pbnRlciAxfAorMDggLSAwQnxjaGlsZCBwb2ludGVyIDJ8CiswQyAtIDBGfGNoaWxkIHBvaW50ZXIgM3wKKzEwIC0gMTN8Y2hpbGQgcG9pbnRlciA0fAorMTQgLSAxN3xjaGlsZCBwb2ludGVyIDV8CisxOCAgICAgfGNoYXJhY3RlciAwfAorMTkgICAgIHxjaGFyYWN0ZXIgMXwKKzFBICAgICB8Y2hhcmFjdGVyIDJ8CisxQiAgICAgfGNoYXJhY3RlciAzfAorMUMgICAgIHxjaGFyYWN0ZXIgNHwKKzFEICAgICB8Y2hhcmFjdGVyIDV8CisxRSAtIDFGfG9yZGVyIHdvcmR8CisKK3doZXJlIHRoZSBwb2ludGVyIHBvaW50cyB0byB0aGUgbGluZSBgMUVgIChpLmUuIHRoZSB0eXBlIGlkZW50aWZpZXIgZm9yIGEgc3BhcnNlIG5vZGUgaXMgYDB4MUVgKS4KKworSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgcG9pbnRlcnMgYW5kIGNoYXJhY3RlcnMgYXJlIG5vdCBpbiBvcmRlci4gVGhpcyBpcyBkb25lIHNvIHRoYXQgYW4gdXBkYXRlIHRvIGEgc3BhcnNlCitub2RlIHdoZXJlIGEgbmV3IGNoaWxkIGlzIGluc2VydGVkIGNhbiBiZSBkb25lIHdoaWxlIHRoZSBwcmV2aW91cyBzdGF0ZSBvZiB0aGUgbm9kZSBpcyBzdGlsbCB2YWxpZCBhbmQgcmVhZGFibGUgZm9yCithbnkgY29uY3VycmVudCByZWFkZXJzLiBJbnN0ZWFkLCBuZXcgY2hpbGRyZW4gYXJlIGFwcGVuZGVkLCBhbmQgdGhlIG9yZGVyIGlzIG1haW50YWluZWQgaW4gdGhlICJvcmRlciB3b3JkIi4gVGhpcyB3b3JkCitpcyBhIG51bWJlciB3aG9zZSBkaWdpdHMgc3BlY2lmeSB0aGUgb3JkZXIgb2YgdGhlIGNoaWxkcmVuJ3MgdHJhbnNpdGlvbiBjaGFyYWN0ZXJzICh3aGVyZSBoaWdoZXItb3JkZXIgZGlnaXRzIHNwZWNpZnkKK2JpZ2dlciBjaGFyYWN0ZXJzKSBlbmNvZGVkLCB0byBiZSBhYmxlIHRvIGZpdCBpbnRvIGEgMTYtYml0IHdvcmQsIGluIGJhc2UgNi4gSXRzIG51bWJlciBvZiBkaWdpdHMgYWxzbyBzcGVjaWZpZXMgdGhlCitudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisKK1RvIGV4cGxhaW4gdGhpcyBiZXR0ZXIsIHdlIHdpbGwgZ2l2ZSBhbiBleGFtcGxlIG9mIHRoZSBldm9sdXRpb24gb2YgYSBzcGFyc2Ugbm9kZS4gU3VwcG9zZSB3ZSBoYWQgdGhlIGAweDEzOWAgbm9kZSBmcm9tCit0aGUgcHJldmlvdXMgc2VjdGlvbiwgYW5kIHNvbWUgdXBkYXRlIG5lZWRzIHRvIGF0dGFjaCBhIHNlY29uZCBjaGlsZCB0byB0aGF0LCBlLmcuIHdpdGggdGhlIGNoYXJhY3RlciBgQWAgYW5kIGNoaWxkCitgMHgyMzhgLgorCishW2dyYXBoXShJbk1lbW9yeVRyaWUubWQuZzIuc3ZnKQorCitUbyBkbyB0aGlzLCB0aGUgbXV0YXRpbmcgdGhyZWFkIHdpbGwgaGF2ZSB0byBjb252ZXJ0IHRoZSBjaGFpbiBub2RlIGludG8gYSBzcGFyc2UgYnkgYWxsb2NhdGluZyBhIG5ldyBjZWxsCisoZS5nLiBgMHgyNDBgLWAweDI1RmApIGFuZCBmaWxsaW5nIGluIHRoZSBzcGFyc2Ugbm9kZSBgMDAwMDAyMzggMDAwMDAxM0EgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgNDE0MzAwMDAKKzAwMDAwMDA2YCB3aXRoIHBvaW50ZXIgYDB4MjVFYDoKKworb2Zmc2V0fGNvbnRlbnR8ZXhhbXBsZQorLS0tfC0tLXwtLS0KKzAwIC0gMDN8Y2hpbGQgcG9pbnRlciAwfCAwMDAwMDIzOAorMDQgLSAwN3xjaGlsZCBwb2ludGVyIDF8IDAwMDAwMTNBCiswOCAtIDE3fHVudXNlZHwKKzE4ICAgICB8Y2hhcmFjdGVyIDB8IDQxIEEKKzE5ICAgICB8Y2hhcmFjdGVyIDF8IDQzIEMKKzFBIC0gMUR8dW51c2VkfAorMUUgLSAxRnxvcmRlciB3b3JkLCBhbHdheXMgMTB8IDAwMDYgPSAxMCAoYmFzZSA2KQorCitUaGlzIGlzIHRoZSBzbWFsbGVzdCBraW5kIG9mIHNwYXJzZSBub2RlLCB3aXRoIGp1c3QgdHdvIGNoaWxkcmVuLiBUd28tY2hpbGRyZW4gc3BhcnNlIG5vZGVzIGFsd2F5cworcHV0IHRoZWlyIHR3byBjaGlsZHJlbiBpbiBvcmRlciAod2UgY2FuIGRvIHRoaXMgYXMgdGhpcyBkb2VzIG5vdCBoYXBwZW4gaW4gcmVzcG9uc2UgdG8gYW4gYWRkaXRpb24gb2YgYSBuZXcgY2hpbGQgdG8KK2FuIGV4aXN0aW5nIHNwYXJzZSBub2RlLCBidXQgdGhpcyBpcyBjb25zdHJ1Y3RlZCBkaXJlY3RseSkgYW5kIHRodXMgdGhlaXIgb3JkZXIgd29yZCBpcyBhbHdheXMgMTAgKGlmIHRoZXkgd2VyZQorbm90IGluIG9yZGVyLCB0aGUgb3JkZXIgd29yZCB3b3VsZCBoYXZlIHRvIGJlIDAxLCB3aGljaCB3b3VsZCBiZSBtaXNpbnRlcnByZXRlZCBhcyB0aGUgc2luZ2xlLWRpZ2l0IDEpLgorCitUaGlzIG5vZGUgaGFzIHR3byAodGhlIG51bWJlciBvZiBkaWdpdHMgaW4gdGhlIG9yZGVyIHdvcmQpIGNoaWxkcmVuLiBUaGUgZmlyc3QgY2hpbGQgaXMgYXQgdGhlIHBvc2l0aW9uIHNwZWNpZmllZCBieSB0aGUKK2xlYXN0IHNpZ25pZmljYW50IGRpZ2l0IG9mIHRoZSBvcmRlciB3b3JkLCAwLiBUaGUgc2Vjb25kIGNoaWxkIGlzIHNwZWNpZmllZCBieSB0aGUgc2Vjb25kIGxlYXN0IHNpZ25pZmljYW50IGRpZ2l0LCAxLgorCitTdXBwb3NlIHdlIHRoZW4gbmVlZCB0byBhZGQgYSBuZXcgY2hpbGQsIHVzaW5nIGNoYXJhY3RlciBgMHgzNWAgYDVgIGFuZCBjaGlsZCBgMHgzM0JgLiBUaGUgbm9kZSB3aWxsIGNoYW5nZSB0byBgMDAwMDAyMzgKKzAwMDAwMTNBIDAwMDAwMzNCIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDQxNDMzNTAwIDAwMDAwMDI2YCBhbmQgdGhlIHBvaW50ZXIgdG8gaXQgc3RheXMgdGhlIHNhbWUuCisKK29mZnNldHxjb250ZW50fGV4YW1wbGUKKy0tLXwtLS18LS0tCiswMCAtIDAzfGNoaWxkIHBvaW50ZXIgMHwgMDAwMDAyMzgKKzA0IC0gMDd8Y2hpbGQgcG9pbnRlciAxfCAwMDAwMDEzQQorMDggLSAwQnxjaGlsZCBwb2ludGVyIDJ8IDAwMDAwMzNCCiswQyAtIDE3fHVudXNlZHwKKzE4ICAgICB8Y2hhcmFjdGVyIDB8IDQxIEEKKzE5ICAgICB8Y2hhcmFjdGVyIDF8IDQzIEMKKzFBICAgICB8Y2hhcmFjdGVyIDJ8IDM1IDUKKzFCIC0gMUR8dW51c2VkfAorMUUgLSAxRnxvcmRlciB3b3JkfCAwMDI2ID0gMTAyIChiYXNlIDYpCisKK1RoaXMgbm9kZSBoYXMgdGhyZWUgKHRoZSBudW1iZXIgb2YgZGlnaXRzIGluIHRoZSBvcmRlciB3b3JkKSBjaGlsZHJlbi4gVGhlIGZpcnN0IGNoaWxkIGlzIGF0IHRoZSBwb3NpdGlvbiBzcGVjaWZpZWQgYnkKK3RoZSBsZWFzdCBzaWduaWZpY2FudCBkaWdpdCBvZiB0aGUgb3JkZXIgd29yZCwgMi4gVGhlIHNlY29uZCBjaGlsZCBpcyBzcGVjaWZpZWQgYnkgdGhlIHNlY29uZCBsZWFzdCBzaWduaWZpY2FudCBkaWdpdCwKKzAsIGFuZCB0aGUgbGFzdCBjaGlsZCBpcyBzcGVjaWZpZWQgYnkgdGhlIGxlYWRpbmcgZGlnaXQsIDEuCisKK05vdGUgdGhhdCBiZWNhdXNlIG9mIHRoZSBvcmRlcmluZyBvZiB0aGUgdHdvIGNoaWxkcmVuIGluIHRoZSBzbWFsbGVzdCBzcGFyc2Ugbm9kZSwgdGhlIGRpZ2l0IDAgaXMgYWx3YXlzIHByZWNlZGVkIGJ5IGEKK21vcmUtc2lnbmlmaWNhbnQgMSBpbiB0aGUgb3JkZXIgd29yZCBpbiBiYXNlIDYuIFRoZXJlZm9yZSB0aGUgbGVhZGluZyBkaWdpdCBvZiB0aGUgb3JkZXIgd29yZCBjYW4gbmV2ZXIgYmUgMCBhbmQgdGh1cyB3ZQorY2Fubm90IG1pc2NvdW50IHRoZSBudW1iZXIgb2YgY2hpbGRyZW4uCisKK1RoZSBhZGRpdGlvbiBvZiBjaGlsZHJlbiBjYW4gY29udGludWUgdW50aWwgd2UgaGF2ZSA2LCBmb3IgZXhhbXBsZSBgMDAwMDAyMzggMDAwMDAxM0EgMDAwMDAzM0IgMDAwMDAzNUMgMDAwMDAzN0EKKzAwMDAwNDFCIDQxNDMzNTQyIDUwMzM4MTI5YCAocG9pbnRlciBgMHgyNUVgKSBmb3IKKworb2Zmc2V0fGNvbnRlbnR8ZXhhbXBsZQorLS0tfC0tLXwtLS0KKzAwIC0gMDN8Y2hpbGQgcG9pbnRlciAwfCAwMDAwMDIzOAorMDQgLSAwN3xjaGlsZCBwb2ludGVyIDF8IDAwMDAwMTNBCiswOCAtIDBCfGNoaWxkIHBvaW50ZXIgMnwgMDAwMDAzM0IKKzBDIC0gMEZ8Y2hpbGQgcG9pbnRlciAzfCAwMDAwMDM1QworMTAgLSAxM3xjaGlsZCBwb2ludGVyIDR8IDAwMDAwMzdBCisxNCAtIDE3fGNoaWxkIHBvaW50ZXIgNXwgMDAwMDA0MUIKKzE4ICAgICB8Y2hhcmFjdGVyIDB8IDQxIEEKKzE5ICAgICB8Y2hhcmFjdGVyIDF8IDQzIEMKKzFBICAgICB8Y2hhcmFjdGVyIDJ8IDM1IDUKKzFCICAgICB8Y2hhcmFjdGVyIDN8IDQyIEIKKzFDICAgICB8Y2hhcmFjdGVyIDR8IDUwIFAKKzFEICAgICB8Y2hhcmFjdGVyIDV8IDMzIDMKKzFFIC0gMUZ8b3JkZXIgd29yZHwgODEyOSA9IDQxMzAyNSAoYmFzZSA2KQorCitCZXlvbmQgNiBjaGlsZHJlbiwgYSBub2RlIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byBzcGxpdC4KKworIyMjIyBgU3BsaXRgIG5vZGVzIC0gdXAgdG8gMjU2IGNoaWxkcmVuIGluIG11bHRpcGxlIGNlbGxzCisKK1NwbGl0IG5vZGVzIGFyZSB1c2VkIHRvIGhhbmRsZSB0aGUgbm9kZXMgd2l0aCBhIGxhcmdlIG51bWJlciBvZiBjaGlsZHJlbi4gV2UgY2FuIG9ubHkgYWxsb2NhdGUgY2VsbHMgb2YgMzIgYnl0ZXMsIHRodXMKK3dlIGhhdmUgdG8gZGlzdHJpYnV0ZSB0aGUgY2hpbGQgdHJhbnNpdGlvbnMgYW1vbmcgY2VsbHMgaW4gc29tZSB3YXkgdGhhdCBpcyBlZmZpY2llbnQgZm9yIHJlYWRpbmcgYW5kIHVwZGF0aW5nLiBUaGUKK21ldGhvZCB3ZSBjaG9zZSBpcyB0byBjb25zdHJ1Y3QgYSAibWluaS10cmllIiB3aXRoIDItMy0zIGJpdCB0cmFuc2l0aW9ucy4KKworQSBzcGxpdCBub2RlIGlzIGlkZW50aWZpZWQgYnkgdGhlIGAweDFDYCBvZmZzZXQuIFRoZSBzdGFydGluZyBjZWxsIG9mIGEgc3BsaXQgbm9kZSBoYXMgdGhpcyBsYXlvdXQ6CisKK29mZnNldHxjb250ZW50fAorLS0tfC0tLXwKKzAwIC0gMEZ8dW51c2VkfAorMTAgLSAxM3xtaWQtY2VsbCBmb3IgbGVhZGluZyAwMHwKKzE0IC0gMTd8bWlkLWNlbGwgZm9yIGxlYWRpbmcgMDF8CisxOCAtIDFCfG1pZC1jZWxsIGZvciBsZWFkaW5nIDEwfAorMUMgLSAxRnxtaWQtY2VsbCBmb3IgbGVhZGluZyAxMXwKKworKHBvaW50ZXJzIHRvIHRoaXMgbm9kZSBwb2ludCB0byB0aGUgYDFDYCBsaW5lKSBhbmQgd2hlcmUgZWFjaCBtaWQtY2VsbCBjb250YWluczoKKworb2Zmc2V0fGNvbnRlbnR8CistLS18LS0tfAorMDAgLSAwM3xlbmQtY2VsbCBmb3IgbWlkZGxlIDAwMHwKKzA0IC0gMDd8ZW5kLWNlbGwgZm9yIG1pZGRsZSAwMDF8CiswOCAtIDBCfGVuZC1jZWxsIGZvciBtaWRkbGUgMDEwfAorMEMgLSAwRnxlbmQtY2VsbCBmb3IgbWlkZGxlIDAxMXwKKzEwIC0gMTN8ZW5kLWNlbGwgZm9yIG1pZGRsZSAxMDB8CisxNCAtIDE3fGVuZC1jZWxsIGZvciBtaWRkbGUgMTAxfAorMTggLSAxQnxlbmQtY2VsbCBmb3IgbWlkZGxlIDExMHwKKzFDIC0gMUZ8ZW5kLWNlbGwgZm9yIG1pZGRsZSAxMTF8CisKK2FuZCBlbmQtY2VsbDoKKworb2Zmc2V0fGNvbnRlbnR8CistLS18LS0tfAorMDAgLSAwM3xwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMDAwfAorMDQgLSAwN3xwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMDAxfAorMDggLSAwQnxwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMDEwfAorMEMgLSAwRnxwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMDExfAorMTAgLSAxM3xwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMTAwfAorMTQgLSAxN3xwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMTAxfAorMTggLSAxQnxwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMTEwfAorMUMgLSAxRnxwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMTExfAorCitJbiBhbnkgb2YgdGhlIGNlbGwgb3IgcG9pbnRlciBwb3NpdGlvbnMgd2UgY2FuIGhhdmUgYE5PTkVgLCBtZWFuaW5nIHRoYXQgc3VjaCBhIGNoaWxkIChvciBibG9jayBvZiBjaGlsZHJlbikgZG9lcyBub3QKK2V4aXN0LiBBdCBtaW5pbXVtLCBhIHNwbGl0IG5vZGUgb2NjdXBpZXMgMyBjZWxscyAob25lIGxlYWRpbmcsIG9uZSBtaWQgYW5kIG9uZSBlbmQpLCBhbmQgYXQgbWF4aW11bSAmbWRhc2g7CitgMSArIDQgKyA0KjggPSAzN2AgY2VsbHMgaS5lLiBgMTE4NGAgYnl0ZXMuIElmIHdlIGNvdWxkIGFsbG9jYXRlIGNvbnRpZ3VvdXMgYXJyYXlzLCBhIGZ1bGwgc3BsaXQgbm9kZSB3b3VsZCB1c2UgYDEwMjRgCitieXRlcywgdGh1cyB0aGlzIHNwbGl0dGluZyBjYW4gYWRkIH4xNSUgb3ZlcmhlYWQuIEhvd2V2ZXIsIHJlYWwgZGF0YSBvZnRlbiBoYXMgYWRkaXRpb25hbCBzdHJ1Y3R1cmUgdGhhdCB0aGlzIGNhbiBtYWtlCit1c2Ugb2YgdG8gYXZvaWQgY3JlYXRpbmcgc29tZSBvZiB0aGUgYmxvY2tzLCBlLmcuIGlmIHRoZSB0cmllIGVuY29kZXMgVVMtQVNDSUkgb3IgVVRGLWVuY29kZWQgc3RyaW5ncyB3aGVyZSBzb21lCitjaGFyYWN0ZXIgcmFuZ2VzIGFyZSBub3QgYWxsb3dlZCBhdCBhbGwsIGFuZCBvdGhlcnMgYXJlIHByZXZhbGVudC4gQW5vdGhlciBiZW5lZml0IGlzIHRoYXQgdG8gY2hhbmdlIGEgdHJhbnNpdGlvbiB3aGlsZQorcHJlc2VydmluZyB0aGUgcHJldmlvdXMgc3RhdGUgb2YgdGhlIG5vZGUgZm9yIGNvbmN1cnJlbnQgcmVhZGVycyB3ZSBoYXZlIHRvIG9ubHkgY29weSB0aHJlZSBibG9ja3MgYW5kIG5vdCB0aGUgZW50aXJlCityYW5nZSBvZiBjaGlsZHJlbiAoYXBwbGljYXRpb25zIG9mIHRoaXMgd2lsbCBiZSBnaXZlbiBsYXRlcikuCisKK0FzIGFuIGV4YW1wbGUsIHN1cHBvc2Ugd2UgbmVlZCB0byBhZGQgYSBgMHg1MWAgYFFgIHRyYW5zaXRpb24gdG8gYDB4NDU1YCB0byB0aGUgNi1jaGlsZHJlbiBzcGFyc2Ugbm9kZSBmcm9tIHRoZSBwcmV2aW91cworc2VjdGlvbi4gVGhpcyB3aWxsIGdlbmVyYXRlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorCitMZWFkaW5nIGNlbGwgKGUuZy4gYDB4NTAwYC1gMHg1MUZgIHdpdGggcG9pbnRlciBgMHg1MUNgKQorCitvZmZzZXR8Y29udGVudHxleGFtcGxlCistLS18LS0tfC0tLQorMDAgLSAwRnx1bnVzZWR8CisxMCAtIDEzfG1pZC1jZWxsIGZvciBsZWFkaW5nIDAwfDAwMDAwNTNDCisxNCAtIDE3fG1pZC1jZWxsIGZvciBsZWFkaW5nIDAxfDAwMDAwNTdDCisxOCAtIDFCfG1pZC1jZWxsIGZvciBsZWFkaW5nIDEwfDAwMDAwMDAwIE5PTkUKKzFDIC0gMUZ8bWlkLWNlbGwgZm9yIGxlYWRpbmcgMTF8MDAwMDAwMDAgTk9ORQorCitNaWQgY2VsbCBgMDBgIGF0IGAweDUyMGAtYDB4NTNGYDoKKworb2Zmc2V0fGNvbnRlbnR8ZXhhbXBsZQorLS0tfC0tLXwtLS0KKzAwIC0gMDN8ZW5kLWNlbGwgZm9yIG1pZGRsZSAwMDB8MDAwMDAwMDAgTk9ORQorMDQgLSAwN3xlbmQtY2VsbCBmb3IgbWlkZGxlIDAwMXwwMDAwMDAwMCBOT05FCiswOCAtIDBCfGVuZC1jZWxsIGZvciBtaWRkbGUgMDEwfDAwMDAwMDAwIE5PTkUKKzBDIC0gMEZ8ZW5kLWNlbGwgZm9yIG1pZGRsZSAwMTF8MDAwMDAwMDAgTk9ORQorMTAgLSAxM3xlbmQtY2VsbCBmb3IgbWlkZGxlIDEwMHwwMDAwMDAwMCBOT05FCisxNCAtIDE3fGVuZC1jZWxsIGZvciBtaWRkbGUgMTAxfDAwMDAwMDAwIE5PTkUKKzE4IC0gMUJ8ZW5kLWNlbGwgZm9yIG1pZGRsZSAxMTB8MDAwMDA1NUMKKzFDIC0gMUZ8ZW5kLWNlbGwgZm9yIG1pZGRsZSAxMTF8MDAwMDAwMDAgTk9ORQorCitFbmQgY2VsbCBgMDAgMTEwYCBhdCBgMHg1NDBgLWAweDU1RmA6CisKK29mZnNldHxjb250ZW50fGV4YW1wbGUKKy0tLXwtLS18LS0tCiswMCAtIDAzfHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAwMDB8MDAwMDAwMDAgTk9ORQorMDQgLSAwN3xwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMDAxfDAwMDAwMDAwIE5PTkUKKzA4IC0gMEJ8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDAxMHwwMDAwMDAwMCBOT05FCiswQyAtIDBGfHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAwMTF8MDAwMDA0MUIKKzEwIC0gMTN8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDEwMHwwMDAwMDAwMCBOT05FCisxNCAtIDE3fHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAxMDF8MDAwMDAzM0IKKzE4IC0gMUJ8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDExMHwwMDAwMDAwMCBOT05FCisxQyAtIDFGfHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAxMTF8MDAwMDAwMDAgTk9ORQorCitNaWQgY2VsbCBgMDFgIGF0IGAweDU2MGAtYDB4NTdGYDoKKworb2Zmc2V0fGNvbnRlbnR8ZXhhbXBsZQorLS0tfC0tLXwtLS0KKzAwIC0gMDN8ZW5kLWNlbGwgZm9yIG1pZGRsZSAwMDB8MDAwMDA1OUMKKzA0IC0gMDd8ZW5kLWNlbGwgZm9yIG1pZGRsZSAwMDF8MDAwMDAwMDAgTk9ORQorMDggLSAwQnxlbmQtY2VsbCBmb3IgbWlkZGxlIDAxMHwwMDAwMDVCQworMEMgLSAwRnxlbmQtY2VsbCBmb3IgbWlkZGxlIDAxMXwwMDAwMDAwMCBOT05FCisxMCAtIDEzfGVuZC1jZWxsIGZvciBtaWRkbGUgMTAwfDAwMDAwMDAwIE5PTkUKKzE0IC0gMTd8ZW5kLWNlbGwgZm9yIG1pZGRsZSAxMDF8MDAwMDAwMDAgTk9ORQorMTggLSAxQnxlbmQtY2VsbCBmb3IgbWlkZGxlIDExMHwwMDAwMDAwMCBOT05FCisxQyAtIDFGfGVuZC1jZWxsIGZvciBtaWRkbGUgMTExfDAwMDAwMDAwIE5PTkUKKworRW5kIGNlbGwgYDAxIDAwMGAgYXQgYDB4NTgwYC1gMHg1OUZgOgorCitvZmZzZXR8Y29udGVudHxleGFtcGxlCistLS18LS0tfC0tLQorMDAgLSAwM3xwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMDAwfDAwMDAwMDAwIE5PTkUKKzA0IC0gMDd8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDAwMXwwMDAwMDIzOAorMDggLSAwQnxwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMDEwfDAwMDAwMzVDCiswQyAtIDBGfHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAwMTF8MDAwMDAxM0EKKzEwIC0gMTN8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDEwMHwwMDAwMDAwMCBOT05FCisxNCAtIDE3fHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAxMDF8MDAwMDAwMDAgTk9ORQorMTggLSAxQnxwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMTEwfDAwMDAwMDAwIE5PTkUKKzFDIC0gMUZ8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDExMXwwMDAwMDAwMCBOT05FCisKK0VuZCBjZWxsIGAwMSAwMTBgIGF0IGAweDVBMGAtYDB4NUJGYDoKKworb2Zmc2V0fGNvbnRlbnR8ZXhhbXBsZQorLS0tfC0tLXwtLS0KKzAwIC0gMDN8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDAwMHwwMDAwMDM3QQorMDQgLSAwN3xwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMDAxfDAwMDAwNDU1CiswOCAtIDBCfHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAwMTB8MDAwMDAwMDAgTk9ORQorMEMgLSAwRnxwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMDExfDAwMDAwMDAwIE5PTkUKKzEwIC0gMTN8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDEwMHwwMDAwMDAwMCBOT05FCisxNCAtIDE3fHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAxMDF8MDAwMDAwMDAgTk9ORQorMTggLSAxQnxwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMTEwfDAwMDAwMDAwIE5PTkUKKzFDIC0gMUZ8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDExMXwwMDAwMDAwMCBOT05FCisKK1RvIGZpbmQgYSBjaGlsZCBpbiB0aGlzIHN0cnVjdHVyZSwgd2UgZm9sbG93IHRoZSB0cmFuc2l0aW9ucyBhbG9uZyB0aGUgYml0cyBvZiB0aGUgbWluaS10cmllLiBGb3IgZXhhbXBsZSwgZm9yIGAweDQyYAorYEJgID0gYDBiMDEwMDAwMTBgIHdlIHN0YXJ0IGF0IGAweDUxQ2AsIHRha2UgdGhlIGAwMWAgcG9pbnRlciB0byBgMHg1N0NgLCB0aGVuIHRoZSBgMDAwYCBwb2ludGVyIHRvIGAweDU5Q2AgYW5kIGZpbmFsbHkKK3RoZSBgMDEwYCBpbmRleCB0byByZXRyaWV2ZSB0aGUgbm9kZSBwb2ludGVyIGAweDM1Q2AuIE5vdGUgdGhhdCB0aGUgaW50ZXJtZWRpYXRlIGNlbGxzIChkYXNoZWQgaW4gdGhlIGRpYWdyYW0pIGFyZSBub3QKK3JlYWNoYWJsZSB3aXRoIHBvaW50ZXJzLCB0aGV5IG9ubHkgbWFrZSBzZW5zZSBhcyBzdWJzdHJ1Y3R1cmUgb2YgdGhlIHNwbGl0IG5vZGUuCisKKyFbZ3JhcGhdKEluTWVtb3J5VHJpZS5tZC5nMy5zdmcpCisKKyMjIyMgQ29udGVudCBgUHJlZml4YAorCitQcmVmaXggbm9kZXMgYXJlIG5vdCBub2RlcyBpbiB0aGVtc2VsdmVzLCBidXQgdGhleSBhZGQgaW5mb3JtYXRpb24gdG8gdGhlIG5vZGUgdGhleSBsZWFkIHRvLiBTcGVjaWZpY2FsbHksIHRoZXkKK2VuY29kZSBhbiBpbmRleCBpbiB0aGUgY29udGVudCBhcnJheSwgYW5kIGEgcG9pbnRlciB0byB0aGUgbm9kZSB0byB3aGljaCB0aGlzIGNvbnRlbnQgaXMgYXR0YWNoZWQuIEluIGFueXRoaW5nIG90aGVyCit0aGFuIHRoZSBjb250ZW50LCB0aGV5IGFyZSBlcXVpdmFsZW50IHRvIHRoZSBsaW5rZWQgbm9kZSAmbWRhc2g7IGkuZS4gYSBwcmVmaXggbm9kZSBwb2ludGVyIGhhcyB0aGUgc2FtZSBjaGlsZHJlbiBhcwordGhlIG5vZGUgaXQgbGlua3MgdG8gKGFub3RoZXIgd2F5IHRvIHNlZSB0aGlzIGlzIGFzIGEgY29udGVudC1jYXJyeWluZyBub2RlIGlzIG9uZSB0aGF0IGhhcyBhbiBfzrVfIHRyYW5zaXRpb24gdG8gdGhlCitsaW5rZWQgbm9kZSBhbmQgbm8gb3RoZXIgZmVhdHVyZXMgZXhjZXB0IGFkZGVkIGNvbnRlbnQpLiBXZSBkbyBub3QgYWxsb3cgbW9yZSB0aGFuIG9uZSBwcmVmaXggdG8gYSBub2RlIChpLmUuIHByZWZpeAorY2FuJ3QgcG9pbnQgdG8gYW5vdGhlciBwcmVmaXgpLCBhbmQgdGhlIGNoaWxkIG9mIGEgcHJlZml4IG5vZGUgY2Fubm90IGJlIGEgbGVhZi4KKworVGhlcmUgYXJlIHR3byB0eXBlcyBvZiBwcmVmaXhlczoKKy0gc3RhbmRhbG9uZSwgd2hpY2ggaGFzIGEgZnVsbCAzMi1iaXQgcG9pbnRlciB0byB0aGUgbGlua2VkIG5vZGUKKy0gZW1iZWRkZWQsIHdoaWNoIG9jY3VwaWVzIHVudXNlZCBzcGFjZSBpbiBgQ2hhaW5gIG9yIGBTcGxpdGAgbm9kZXMgYW5kIHNwZWNpZmllcyB0aGUgNS1iaXQgb2Zmc2V0IHdpdGhpbiB0aGUgc2FtZSBjZWxsCitvZiB0aGUgbGlua2VkIG5vZGUKKworU3RhbmRhbG9uZSBwcmVmaXhlcyBoYXZlIHRoaXMgbGF5b3V0OgorCitvZmZzZXR8Y29udGVudHxleGFtcGxlCistLS18LS0tfC0tLQorMDAgLSAwM3xjb250ZW50IGluZGV4fDAwMDAwMDAxCiswNHxzdGFuZGFsb25lIGZsYWcsIDB4RkZ8RkYKKzA1IC0gMUJ8dW51c2VkfAorMUMgLSAxRnxsaW5rZWQgbm9kZSBwb2ludGVyfDAwMDAwMjVFCisKK2FuZCBwb2ludGVyIG9mZnNldCBgMHgxRmAuIFRoZSBzYW1wbGUgdmFsdWVzIGFib3ZlIHdpbGwgYmUgdGhlIG9uZXMgdXNlZCB0byBsaW5rIGEgcHJlZml4IG5vZGUgdG8gb3VyIGBTcGFyc2VgCitleGFtcGxlLCB3aGVyZSBhIHByZWZpeCBjYW5ub3QgYmUgZW1iZWRkZWQgYXMgYWxsIHRoZSBieXRlcyBvZiB0aGUgY2VsbCBhcmUgaW4gdXNlLgorCitJZiB3ZSB3YW50IHRvIGF0dGFjaCB0aGUgc2FtZSBwcmVmaXggdG8gdGhlIGBTcGxpdGAgZXhhbXBsZSwgd2Ugd2lsbCBwbGFjZSB0aGlzCisKK29mZnNldHxjb250ZW50fGV4YW1wbGUKKy0tLXwtLS18LS0tCiswMCAtIDAzfGNvbnRlbnQgaW5kZXh8MDAwMDAwMDEKKzA0fGVtYmVkZGVkIG9mZnNldCB3aXRoaW4gY2VsbHwxQworMDUgLSAxRnx1bnVzZWR8CisKK19pbnNpZGVfIHRoZSBsZWFkaW5nIHNwbGl0IGNlbGwsIHdpdGggcG9pbnRlciBgMHgxRmAuIFNpbmNlIHRoaXMgaXMgYW4gZW1iZWRkZWQgbm9kZSwgdGhlIGF1Z21lbnRlZCBvbmUgcmVzaWRlcyB3aXRoaW4KK3RoZSBzYW1lIGNlbGwsIGFuZCB0aHVzIHdlIG5lZWQgb25seSA1IGJpdHMgdG8gZW5jb2RlIHRoZSBwb2ludGVyICh0aGUgb3RoZXIgMjcgYXJlIHRoZSBzYW1lIGFzIHRoZSBwcmVmaXgncykuCitUaGUgY29tYmluZWQgY29udGVudCBvZiB0aGUgY2VsbCBhdCBgMHg1MDAtMHg1MUZgIHdpbGwgdGhlbiBiZSBgMDAwMDAwMDEgMUMwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDA1MjAgMDAwMDA1NjAKKzAwMDAwMDAwIDAwMDAwMDAwYDoKKworb2Zmc2V0fGNvbnRlbnR8ZXhhbXBsZQorLS0tfC0tLXwtLS0KKzAwIC0gMDN8Y29udGVudCBpbmRleHwwMDAwMDAwMQorMDR8ZW1iZWRkZWQgb2Zmc2V0IHdpdGhpbiBjZWxsfDFDCiswNSAtIDBGfHVudXNlZHwKKzEwIC0gMTN8bWlkLWNlbGwgZm9yIGxlYWRpbmcgMDB8MDAwMDA1MjAKKzE0IC0gMTd8bWlkLWNlbGwgZm9yIGxlYWRpbmcgMDF8MDAwMDA1NjAKKzE4IC0gMUJ8bWlkLWNlbGwgZm9yIGxlYWRpbmcgMTB8MDAwMDAwMDAgTk9ORQorMUMgLSAxRnxtaWQtY2VsbCBmb3IgbGVhZGluZyAxMXwwMDAwMDAwMCBOT05FCisKK0JvdGggYDB4NTFDYCBhbmQgYDB4NTFGYCBhcmUgdmFsaWQgcG9pbnRlcnMgaW4gdGhpcyBjZWxsLiBUaGUgZm9ybWVyIHJlZmVycyB0byB0aGUgcGxhaW4gc3BsaXQgbm9kZSwgdGhlIGxhdHRlciB0byBpdHMKK2NvbnRlbnQtYXVnbWVudGVkIHZlcnNpb24uIFRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIGlzIHRoZSByZXN1bHQgb2YgYSBjYWxsIHRvIGBjb250ZW50KClgLgorCishW2dyYXBoXShJbk1lbW9yeVRyaWUubWQuZzQuc3ZnKQorCisKKyMjIFJlYWRpbmcgYSB0cmllCisKK2BJbk1lbW9yeVRyaWVgIGlzIG1haW5seSBtZWFudCB0byBiZSB1c2VkIGFzIGFuIGltcGxlbWVudGF0aW9uIG9mIGBUcmllYC4gQXMgc3VjaCwgdGhlIG1haW4gbWV0aG9kIG9mIHJldHJpZXZhbCBvZgoraW5mb3JtYXRpb24gaXMgdmlhIHNvbWUgc2VsZWN0aW9uIChpLmUuIGludGVyc2VjdGlvbikgb2YgYSBzdWJ0cmllIGZvbGxvd2VkIGJ5IGEgd2FsayBvdmVyIHRoZSBjb250ZW50IGluIHRoaXMKK3N1YnRyaWUuIFN0cmFpZ2h0Zm9yd2FyZCBtZXRob2RzIGZvciBkaXJlY3QgcmV0cmlldmFsIG9mIGRhdGEgYnkga2V5IGFyZSBhbHNvIHByb3ZpZGVkLCBidXQgdGhleSBhcmUgbWFpbmx5IGZvciB0ZXN0aW5nLgorCitUaGUgbWV0aG9kcyBmb3IgaXRlcmF0aW5nIG92ZXIgYW5kIHRyYW5zZm9ybWluZyB0cmllcyBhcmUgcHJvdmlkZWQgYnkgdGhlIGBUcmllYCBpbnRlcmZhY2UgYW5kIGFyZSBidWlsdCBvbiB0aGUgY3Vyc29yCitpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYEluTWVtb3J5VHJpZWAgKHNlZSBgVHJpZS5tZGAgZm9yIGEgZGVzY3JpcHRpb24gb2YgY3Vyc29ycykuCisKKyFbZ3JhcGhdKEluTWVtb3J5VHJpZS5tZC53YzEuc3ZnKQorCisoRWRnZXMgaW4gYmxhY2sgc2hvdyB0aGUgdHJpZSdzIHN0cnVjdHVyZSwgYW5kIHRoZSBvbmVzIGluIDxzcGFuIHN0eWxlPSJjb2xvcjpsaWdodGJsdWUiPmxpZ2h0IGJsdWU8L3NwYW4+IHRoZSBwYXRoIHRoZSBjdXJzb3Igd2FsayB0YWtlcy4pCisKKyMjIyBDdXJzb3JzIG92ZXIgYEluTWVtb3J5VHJpZWAKKworYEluTWVtb3J5VHJpZWAgaW1wbGVtZW50cyBjdXJzb3JzIHVzaW5nIGFycmF5cyBvZiBpbnRlZ2VycyB0byBzdG9yZSB0aGUgYmFja3RyYWNraW5nIHN0YXRlIChhcyB0aGUgc2ltcGxlc3QKK3Bvc3NpYmxlIHN0cnVjdHVyZSB0aGF0IGNhbiBiZSBlYXNpbHkgd2Fsa2VkIGFuZCBnYXJiYWdlIGNvbGxlY3RlZCkuIE5vIGJhY2t0cmFja2luZyBzdGF0ZSBpcyBhZGRlZCBmb3IgYENoYWluYCBvciAKK2BMZWFmYCBub2RlcyBhbmQgYW55IHByZWZpeC4gRm9yIGBTcGFyc2VgIHdlIHN0b3JlIHRoZSBub2RlIGFkZHJlc3MsIGRlcHRoIGFuZCB0aGUgcmVtYWluZGVyIG9mIHRoZSBzcGFyc2Ugb3JkZXIgd29yZC4KK1RoYXQgaXMsIHdlIHJlYWQgdGhlIHNwYXJzZSBvcmRlciB3b3JkIG9uIGVudHJ5LCBwZWVsIG9mZiB0aGUgbmV4dCBpbmRleCB0byBkZXNjZW5kIGFuZCBzdG9yZSB0aGUgcmVtYWluZGVyLiBXaGVuIHdlIAorYmFja3RyYWNrIHRvIHRoZSBub2RlIHdlIHBlZWwgb2ZmIGFub3RoZXIgaW5kZXggLS0gaWYgdGhlIHJlbWFpbmRlciBiZWNvbWVzIDAsIHRoZXJlIGFyZSBubyBmdXJ0aGVyIGNoaWxkcmVuIGFuZCB0aGUgCitiYWNrdHJhY2tpbmcgZW50cnkgY2FuIGJlIHJlbW92ZWQuCisKK0ZvciBgU3BsaXRgIG5vZGVzIHdlIHN0b3JlIG9uZSBlbnRyeSBwZXIgc3BsaXQgbm9kZSBjZWxsLiBUaGlzIG1lYW5zOgorLSBvbmUgZW50cnkgZm9yIHRoZSBoZWFkIGNlbGwgd2l0aCBhZGRyZXNzLCBkZXB0aCBhbmQgbmV4dCBjaGlsZCBiaXRzIGAwYkhIMDAwMDAwYCB3aGVyZSBISCBpcyBiZXR3ZWVuIDEgYW5kIDMKKy0gb25lIGVudHJ5IGZvciB0aGUgbWlkIGNlbGwgd2l0aCBhZGRyZXNzLCBkZXB0aCBhbmQgbmV4dCBjaGlsZCBiaXRzIGAwYkhITU1NMDAwYCB3aGVyZSBNTU0gaXMgYmV0d2VlbiAxIGFuZCA3CistIG9uZSBlbnRyeSBmb3IgdGhlIHRhaWwgY2VsbCB3aXRoIGFkZHJlc3MsIGRlcHRoIGFuZCBuZXh0IGNoaWxkIGJpdHMgYDBiSEhNTU1UVFRgIHdoZXJlIFRUVCBpcyBiZXR3ZWVuIDEgYW5kIDcKKworT24gYmFja3RyYWNraW5nIHdlIHJlY29nbml6ZSB0aGUgc3VibGV2ZWwgYnkgdGhlIHBvc2l0aW9uIG9mIHRoZSBsb3dlc3Qgbm9uLXplcm8gYml0IHRyaXBsZS4gRm9yIGV4YW1wbGUsIGlmIHRoZSBsYXN0Cit0aHJlZSBhcmUgbm90IGAwYjAwMGAsIHRoaXMgaXMgYSB0YWlsIGNlbGwsIHdlIGNhbiBhZHZhbmNlIGluIGl0IGFuZCB1c2UgdGhlIEhITU1NIGJpdHMgdG8gZm9ybSB0aGUgdHJhbnNpdGlvbiBieXRlLgorCitUaGlzIHN1YnN0cnVjdHVyZSBpcyBhIGxpdHRsZSBtb3JlIGVmZmljaWVudCB0aGFuIHN0b3Jpbmcgb25seSBvbmUgZW50cnkgZm9yIHRoZSBzcGxpdCBub2RlICh0aGUgaGVhZC10by1taWQgYW5kIAorbWlkLXRvLXRhaWwgbGlua3MgZG8gbm90IG5lZWQgdG8gYmUgZm9sbG93ZWQgZm9yIGV2ZXJ5IG5ldyBjaGlsZCkgYW5kIGFsc28gYWxsb3dzIHVzIHRvIGVhc2lseSBnZXQgdGhlIHByZWNpc2UgbmV4dCAKK2NoaWxkIGFuZCByZW1vdmUgdGhlIGJhY2t0cmFja2luZyBlbnRyeSB3aGVuIGEgY2VsbCBoYXMgbm8gZnVydGhlciBjaGlsZHJlbi4KKworYEluTWVtb3J5VHJpZWAgY3Vyc29ycyBhbHNvIGltcGxlbWVudCBgYWR2YW5jZU11bHRpcGxlYCwgd2hpY2gganVtcHMgb3ZlciBpbnRlcm1lZGlhdGUgbm9kZXMgaW4gYENoYWluYCBibG9ja3M6CisKKyFbZ3JhcGhdKEluTWVtb3J5VHJpZS5tZC53YzIuc3ZnKQorCisjIyBNdXRhdGlvbgorCitNdXRhdGlvbiBvZiBgSW5NZW1vcnlUcmllYCBtdXN0IGJlIGRvbmUgYnkgb25lIHRocmVhZCBvbmx5IChmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyB3ZSBkb24ndCBlbmZvcmNlIGl0LCB0aGUgdXNlciBtdXN0CittYWtlIHN1cmUgdGhhdCdzIHRoZSBjYXNlKSwgYnV0IHdyaXRlcyBtYXkgYmUgY29uY3VycmVudCB3aXRoIG11bHRpcGxlIHJlYWRzIG92ZXIgdGhlIGRhdGEgdGhhdCBpcyBiZWluZyBtdXRhdGVkLiBUaGUKK3RyaWUgaXMgYnVpbHQgdG8gc3VwcG9ydCB0aGlzIGJ5IG1ha2luZyBzdXJlIHRoYXQgYW55IG1vZGlmaWNhdGlvbiBvZiBhIG5vZGUgaXMgc2FmZSBmb3IgYW55IHJlYWRlciB0aGF0IGlzIG9wZXJhdGluZworY29uY3VycmVudGx5LgorCitUaGUgbWFpbiBtZXRob2QgZm9yIG11dGF0aW5nIGEgYEluTWVtb3J5VHJpZWAgaXMgYGFwcGx5YCwgd2hpY2ggbWVyZ2VzIHRoZSBzdHJ1Y3R1cmUgb2YgYW5vdGhlciBgVHJpZWAgaW4uIAorYEluTWVtb3J5VHJpZWAgYWxzbyBwcm92aWRlcyBzaW1wbGVyIHJlY3Vyc2l2ZSBtZXRob2Qgb2YgbW9kaWZpY2F0aW9uLCBgcHV0UmVjdXJzaXZlYCwgd2hpY2ggY3JlYXRlcyBhIHNpbmdsZSAKK2BrZXkgLT4gdmFsdWVgIG1hcHBpbmcgaW4gdGhlIHRyaWUuIFdlIHdpbGwgZGVzY3JpYmUgdGhlIG11dGF0aW9uIHByb2Nlc3Mgc3RhcnRpbmcgd2l0aCBhIGBwdXRSZWN1cnNpdmVgIGV4YW1wbGUuCisKKyMjIyBBZGRpbmcgYSBuZXcga2V5IC0+IHZhbHVlIG1hcHBpbmcgdXNpbmcgYHB1dFJlY3Vyc2l2ZWAKKworU3VwcG9zZSB3ZSB3YW50IHRvIGluc2VydCB0aGUgdmFsdWUgYHRyYXZlcnNlYCBpbnRvIHRoZSB0cmllIGRlc2NyaWJlZCBpbiB0aGUgcHJldmlvdXMgcGFyYWdyYXBoLiBUaGUgcmVjdXJzaXZlCitpbnNlcnRpb24gcHJvY2VzcyB3YWxrcyB0aGUgdHJpZSB0byBmaW5kIGNvcnJlc3BvbmRpbmcgZXhpc3Rpbmcgbm9kZXMgZm9yIHRoZSBvbmVzIGluIHRoZSBwYXRoIHRvIGJlIGluc2VydGVkLgorV2hlbiBpdCBoYXMgdG8gbGVhdmUgdGhlIGV4aXN0aW5nIHRyaWUsIGJlY2F1c2UgaXQgaGFzIG5vIGVudHJpZXMgZm9yIHRoZSBwYXRoLCB0aGUgcHJvY2VzcyBjb250aW51ZXMgdXNpbmcgYE5PTkVgIGFzCit0aGUgdHJpZSBub2RlLgorCishW2dyYXBoXShJbk1lbW9yeVRyaWUubWQubTEuc3ZnKQorCitXaGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgcGF0aCwgaXQgbmVlZHMgdG8gYXR0YWNoIHRoZSB2YWx1ZS4gVW5sZXNzIHRoaXMgaXMgYSBwcmVmaXggb2YgYW4gZXhpc3RpbmcgZW50cnksIHRoZSAKK21hdGNoaW5nIHRyaWUgbm9kZSB3aWxsIGVpdGhlciBiZSBgTk9ORWAgb3IgYSBsZWFmIG5vZGUuIEhlcmUgaXQncyBgTk9ORWAsIHNvIHdlIGNyZWF0ZSBhIGl0ZW0gaW4gdGhlCitjb250ZW50IGFycmF5LCBgY29udGVudEFycmF5WzNdYCwgcHV0IHRoZSB2YWx1ZSBpbiBpdCwgYW5kIHRodXMgZm9ybSB0aGUgbGVhZiBub2RlIGB+M2AgKGAweEZGRkZGRkZDYCkuIFRoZSByZWN1cnNpdmUKK3Byb2Nlc3MgcmV0dXJucyB0aGlzIHRvIHRoZSBwcmV2aW91cyBzdGVwLgorCitUaGUgcHJldmlvdXMgc3RlcCBtdXN0IGF0dGFjaCBhIGNoaWxkIHdpdGggdGhlIHRyYW5zaXRpb24gYGVgIHRvIHRoZSBub2RlIGBOT05FYC4gU2luY2UgdGhpcyBpcyBhIG5ldyBub2RlLCB3ZSBkbyB0aGlzCitieSBjcmVhdGluZyBhIG5ldyBgQ2hhaW5gIG5vZGUgYXQgYWRkcmVzcyBgMHgwQkJgIG1hcHBpbmcgYGVgIHRvIGB+M2AgYW5kIHJldHVybiB0aGF0LiBGb3IgdGhlIG5vZGUgYWJvdmUsIHdlIGFnYWluCituZWVkIHRvIGF0dGFjaCBhIGNoaWxkIHRvIGBOT05FYCwgYnV0IHRoaXMgdGltZSB0aGUgY2hpbGQgaXMgYSBgQ2hhaW5gIG5vZGUsIHNvIHdlIGNhbiBkbyB0aGlzIGJ5IGV4cGFuZGluZyBpdCwgaS5lLgord3JpdGluZyB0aGUgbmV3IGNoYXJhY3RlciBhdCB0aGUgYWRkcmVzcyBqdXN0IGJlZm9yZSB0aGUgY2hpbGQgcG9pbnRlciwgYW5kIHJldHVybmluZyB0aGF0IGFkZHJlc3MgKG5vdGUgdGhhdCB0aGUKK2NoaWxkIGNoYWluIG5vZGUgaXMgbmV3bHkgY3JlYXRlZCwgc28gd2UgY2FuJ3QgYmUgb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIGRhdGEgdGhlcmUpLiBXZSBjYW4gZG8gdGhpcyBzZXZlcmFsIG1vcmUKK3RpbWVzLgorCishW2dyYXBoXShJbk1lbW9yeVRyaWUubWQubTIuc3ZnKQorCisoPHNwYW4gc3R5bGU9ImNvbG9yOmxpZ2h0Ymx1ZSI+TGlnaHQgYmx1ZTwvc3Bhbj4gc3BlY2lmaWVzIHRoZSBkZXNjZW50IHBhdGgsIDxzcGFuIHN0eWxlPSJjb2xvcjpwaW5rIj5waW5rPC9zcGFuPgordGhlIHZhbHVlcyByZXR1cm5lZCwgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPmJsdWU8L3NwYW4+IHN0YW5kcyBmb3IgbmV3bHktY3JlYXRlZCBub2RlcyBhbmQgbGlua3MsIGFuZAorPHNwYW4gc3R5bGU9ImNvbG9yOmxpZ2h0Z3JheSI+bGlnaHQgZ3JheTwvc3Bhbj4gZm9yIG9ic29sZXRlZCBub2RlcyBhbmQgbGlua3MuKQorCitJbiB0aGUgbmV4dCBzdGVwIHdlIG11c3QgYXR0YWNoIHRoZSBjaGlsZCBgMHgwQjhgIHdpdGggdHJhbnNpdGlvbiBgdmAgdG8gdGhlIGV4aXN0aW5nIGBDaGFpbmAgbm9kZSBgMHgwMThgLiBUaGlzIGlzIGEKK2RpZmZlcmVudCB0cmFuc2l0aW9uIGZyb20gdGhlIG9uZSB0aGF0IG5vZGUgYWxyZWFkeSBoYXMsIHNvIHRoZSBjaGFuZ2UgY2Fubm90IGJlIGFjY29tbW9kYXRlZCBieSBhIG5vZGUgb2YgdHlwZSBgQ2hhaW5gLAordGh1cyB3ZSBuZWVkIHRvIGNvcHkgdGhpcyBpbnRvIGEgbmV3IGBTcGFyc2VgIG5vZGUgYDB4MERFYCB3aXRoIHR3byBjaGlsZHJlbiwgdGhlIGV4aXN0aW5nIGBjIC0+IDB4MDE5YCBhbmQgdGhlIG5ldworYHYgLT4gMHgwQjhgIGFuZCByZXR1cm4gYDB4MERFYCB0byB0aGUgcGFyZW50IHN0ZXAuCisKK1RoZSBwYXJlbnQgc3RlcCBtdXN0IHRoZW4gY2hhbmdlIGl0cyBleGlzdGluZyBwb2ludGVyIGZvciB0aGUgY2hhcmFjdGVyIGBhYCBmcm9tIGAweDAxOGAgdG8gYDB4MERFYCB3aGljaCBpdCBjYW4gZG8gaW4KK3BsYWNlIGJ5IHdyaXRpbmcgdGhlIG5ldyB2YWx1ZSBpbiBpdHMgcG9pbnRlciBjZWxsIGZvciBgYWAuIFRoaXMgaXMgdGhlIGF0dGFjaG1lbnQgcG9pbnQgZm9yIHRoZSBuZXdseSBjcmVhdGVkCitzdWJzdHJ1Y3R1cmUsIGkuZS4gYmVmb3JlIHRoaXMsIHRoZSBuZXcgbm9kZXMgd2VyZSBub3QgcmVhY2hhYmxlLCBhbmQgbm93IGJlY29tZSByZWFjaGFibGU7IGJlZm9yZSB0aGlzLCB0aGUgbm9kZQorYDB4MDE4IGAgd2FzIHJlYWNoYWJsZSwgYW5kIG5vdyBiZWNvbWVzIHVucmVhY2hhYmxlLiBUaGUgYXR0YWNobWVudCBpcyBkb25lIGJ5IGEgdm9sYXRpbGUgd3JpdGUsIHRvIGVuZm9yY2UgYSAKK2hhcHBlbnMtYmVmb3JlIHJlbGF0aW9uc2hpcCB0aGF0IG1ha2VzIHN1cmUgdGhhdCBhbGwgdGhlIG5ldyBzdWJzdHJ1Y3R1cmUgKGFsbCB3cml0dGVuIGJ5IHRoaXMgdGhyZWFkKSBpcyBmdWxseSByZWFkYWJsZQorYnkgYWxsIHJlYWRlcnMgd2hvIHBhc3MgdGhyb3VnaCB0aGUgbmV3IHBvaW50ZXIgKHdoaWNoIGlzIHRoZSBvbmx5IHdheSB0aGV5IGNhbiByZWFjaCBpdCkuIFRoZSBzYW1lIGhhcHBlbnMtYmVmb3JlIGFsc28gCitlbnN1cmVzIHRoYXQgYW55IG5ldyByZWFkZXJzIGNhbm5vdCByZWFjaCB0aGUgb2Jzb2xldGVkIG5vZGVzICh0aGVyZSBtYXkgYmUgZXhpc3RpbmcgcmVhZGVyIHRocmVhZHMgdGhhdCBhcmUgYWxyZWFkeSBpbiAKK3RoZW0pLgorCitJdCBjYW4gdGhlbiByZXR1cm4gaXRzIGFkZHJlc3MgYDB4MDdFYCB1bmNoYW5nZWQgdXAsIGFuZCBubyBjaGFuZ2VzIG5lZWQgdG8gYmUgZG9uZSBpbiBhbnkgb2YgdGhlIHJlbWFpbmluZyBzdGVwcy4gVGhlCitwcm9jZXNzIGZpbmlzaGVzIGluIGEgbmV3IHZhbHVlIGZvciBgcm9vdGAsIHdoaWNoIGluIHRoaXMgY2FzZSByZW1haW5zIHVuY2hhbmdlZC4KKworIVtncmFwaF0oSW5NZW1vcnlUcmllLm1kLm0zLnN2ZykKKworVGhlIHByb2Nlc3MgY3JlYXRlZCBhIGZldyBuZXcgbm9kZXMgKGluIGJsdWUpLCBhbmQgbWFkZSBvbmUgb2Jzb2xldGUgKGluIGdyZXkpLiBXaGF0IGNvbmN1cnJlbnQgcmVhZGVycyBjYW4gc2VlIGRlcGVuZHMKK29uIHdoZXJlIHRoZXkgYXJlIGF0IHRoZSB0aW1lIHRoZSBhdHRhY2htZW50IHBvaW50IHdyaXRlIGlzIGRvbmUuIEZvcndhcmQgdHJhdmVyc2FscywgaWYgdGhleSBhcmUgaW4gdGhlIHBhdGggYmVsb3cKK2AweDA3RWAsIHdpbGwgY29udGludWUgd29ya2luZyB3aXRoIHRoZSBvYnNvbGV0ZWQgZGF0YSBhbmQgd2lsbCBub3Qgc2VlIGFueSBvZiB0aGUgbmV3IGNoYW5nZXMuIElmIHRoZXkgYXJlIGFib3ZlCitgMHgwN0VgLCB0aGV5IHdpbGwgc2VlIHRoZSB1cGRhdGVkIGNvbnRlbnQuIElmIHRoZXkgYXJlIF9hdF8gdGhlIGAweDA3RWAgbm9kZSwgdGhleSBtYXkgc2VlIGVpdGhlciwgZGVwZW5kaW5nIG9uIHRoZQordGltZSB0aGV5IHJlYWQgdGhlIHBvaW50ZXIgZm9yIGBhYC4gUmV2ZXJzZSB0cmF2ZXJzYWxzIHRoYXQgaGFwcGVuIHRvIGJlIGluIHRoZSByZWdpb24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBuZXcgbm9kZXMKK193aWxsXyBzZWUgdGhlIHVwZGF0ZWQgY29udGVudCwgYXMgdGhleSB3aWxsIHJlYWQgdGhlIHBvaW50ZXIgYWZ0ZXIgaXQgaGFzIGJlZW4gdXBkYXRlZC4KKworSW4gYW55IGNhc2UsIHRoZSBvYnNvbGV0ZSBwYXRocyByZW1haW4gY29ycmVjdCBhbmQgdXNhYmxlIGZvciBhbnkgdGhyZWFkIHRoYXQgaGFzIGFscmVhZHkgcmVhY2hlZCB0aGVtLCBhbmQgdGhlIG5ldworcGF0aHMgYXJlIGNvcnJlY3QgYW5kIHVzYWJsZSBmcm9tIHRoZSBtb21lbnQgdGhleSBiZWNvbWUgcmVhY2hhYmxlLgorCitOb3RlIHRoYXQgaWYgd2UgcGVyZm9ybSBtdWx0aXBsZSBtdXRhdGlvbnMgaW4gc2VxdWVuY2UsIGFuZCBhIHJlYWRlciBoYXBwZW5zIHRvIGJlIHN0YWxsZWQgYmV0d2VlbiB0aGVtIChpbiBpdGVyYXRpb24KK29yZGVyKSwgc3VjaCByZWFkZXIgbWF5IHNlZSBvbmx5IHRoZSBtdXRhdGlvbiB0aGF0IGlzIGFoZWFkIG9mIGl0IF9pbiBpdGVyYXRpb24gb3JkZXJfLCB3aGljaCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlCittdXRhdGlvbiB0aGF0IGhhcHBlbmVkIGZpcnN0LiBGb3IgdGhlIGV4YW1wbGUgYWJvdmUsIGlmIHdlIGFsc28gaW5zZXJ0ZWQgYHRyZXNwYXNzYCwgYSByZWFkZXIgdGhyZWFkIHRoYXQgd2FzIHBhdXNlZAorYXQgYDB4MDE4YCBpbiBhIGZvcndhcmQgdHJhdmVyc2FsIGFuZCB3YWtlcyB1cCBhZnRlciBib3RoIGluc2VydGlvbnMgaGF2ZSBjb21wbGV0ZWQgd2lsbCBzZWUgYHRyZXNwYXNzYCwgYnV0IF93aWxsIG5vdF8KK3NlZSBgdHJhdmVyc2VgIGV2ZW4gdGhvdWdoIGl0IHdhcyBpbnNlcnRlZCBlYXJsaWVyLgorCisjIyMgSW4tcGxhY2UgbW9kaWZpY2F0aW9ucworCitXaGVuIHRoZSBiYWNrdHJhY2tpbmcgcHJvY2VzcyByZXR1cm5zIHdpdGggYSBuZXcgbWFwcGluZywgdGhlcmUgYXJlIHNldmVyYWwgY2FzZXMgd2hlbiB3ZSBjYW4gYXBwbHkgYSBjaGFuZ2UgaW4gcGxhY2UKKyhjcmVhdGluZyBhbiBhdHRhY2htZW50IHBvaW50IGZvciB0aGUgbmV3IHBhdGgpLiBXZSB3aWxsIGV4cGxhaW4gdGhlc2UgaW4gZGV0YWlsLCBhcyBpdCBpcyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCB3aGF0CitleGFjdGx5IGhhcHBlbnMgZnJvbSBjb25jdXJyZW50IHJlYWRlcnMnIHBvaW50IG9mIHZpZXcgaW4gYWxsIG9mIHRoZW0uCisKK05vdGUgdGhhdCBpZiBhIG1vZGlmaWNhdGlvbiBjYW5ub3QgYmUgZG9uZSBpbiBwbGFjZSwgd2UgY29weSB0aGUgY29udGVudCB0byBhIG5ldyBub2RlLiBUaGUgY29waWVkIG5vZGUgaXMgYWx3YXlzCit1bnJlYWNoYWJsZSBhbmQgdGhlcmUgd2lsbCBhbHdheXMgYmUgYW4gYXR0YWNobWVudCBwb2ludCB0aGF0IG1ha2VzIGl0IHJlYWNoYWJsZSBzb21ld2hlcmUgaW4gdGhlIHBhcmVudCBjaGFpbi4KKworIyMjIyBDaGFuZ2luZyB0aGUgY2hpbGQgcG9pbnRlciBvZiB0aGUgbGFzdCBgQ2hhaW5gIG5vZGUgaW4gYSBjaGFpbgorCitUaGlzIGhhcHBlbnMgd2hlbiB0aGUgZXhpc3RpbmcgdHJhbnNpdGlvbiBtYXRjaGVzIHRoZSB0cmFuc2l0aW9uIG9mIHRoZSBuZXcgY2hhcmFjdGVyLCBidXQgdGhlIHBvaW50ZXIgaXMgZGlmZmVyZW50LAorYW5kIG9ubHkgYXBwbGllcyB0byBgQ2hhaW5gIG5vZGVzIHdob3NlIG9mZnNldCBpcyBgMHgxQmAuIEluIHRoaXMgY2FzZSB0aGUgY2hpbGQgcG9pbnRlciBpcyB3cml0dGVuIGF0IG9mZnNldCBgMHgxQ2AsCithbmQgd2UgY2FuIHB1dCBpbiB0aGUgbmV3IHZhbHVlIGJ5IHBlcmZvcm1pbmcgYSB2b2xhdGlsZSB3cml0ZS4KKworRm9yIGV4YW1wbGUsIHVwZGF0aW5nIGBOIC0+IDB4MzlDYCBpcyBhY2NvbXBsaXNoZWQgYnkgbWFraW5nIHRoZSB2b2xhdGlsZSB3cml0ZToKKworb2Zmc2V0fGNvbnRlbnR8YmVmb3JlfGFmdGVyCistLS18LS0tfC0tLXwtLS0KKzAwLTFBfGlycmVsZXZhbnR8fAorMUJ8Y2hhcmFjdGVyfE58TgorMUMtMUZ8cG9pbnRlcnwwMDAwMDMxRXxfKiowMDAwMDM5QyoqXworCisoSGVyZSBhbmQgYmVsb3cgbm9ybWFsIHdyaXRlcyBhcmUgaW4gYm9sZCBhbmQgdm9sYXRpbGUgd3JpdGVzIGluIGJvbGQgaXRhbGljLikKKworUmVhZGVycyBoYXZlIHRvIHJlYWQgdGhlIHBvaW50ZXIgdG8gcmVhY2ggdGhlIGNoaWxkIChvbGQgb3IgbmV3KSwgc28gdGhpcyBhY2hpZXZlcyB0aGUgaGFwcGVucy1iZWZvcmUgZ3VhcmFudGVlcyB3ZQorc2Vlay4gUmVhZGVycyBlaXRoZXIgc2VlIHRoZSBvbGQgdmFsdWUgKHdoZXJlIG5vbmUgb2YgdGhlIGJyYW5jaCdzIGRhdGEgaGFzIGJlZW4gbW9kaWZpZWQgaW4gYW55IHdheSksIG9yIHRoZSBuZXcgdmFsdWUKKyh3aGVyZSB0aGUgaGFwcGVucy1iZWZvcmUgZ3VhcmFudGVlcyBhbGwgd3JpdGVzIGNyZWF0aW5nIHRoZSBhdHRhY2hlZCBzdWJzdHJ1Y3R1cmUgYXJlIGZ1bGx5IHZpc2libGUpLgorCitOb3RlIHRoYXQgaWYgdGhlIG5vZGUgaXMgbm90IHRoZSBsYXN0IGluIHRoZSBjaGFpbiwgdGhlIHBvaW50ZXIgaXMgaW1wbGljaXQgYW5kIHdlIGNhbm5vdCBjaGFuZ2UgaXQuIFRodXMgd2UgaGF2ZQordG8gY29weSwgaS5lLiBjcmVhdGUgYSBuZXcgbm9kZSwgd2hpY2ggaW4gdGhpcyBjYXNlIHdpbGwgYWxzbyBiZSBhIGBDaGFpbmAgbm9kZSwgYmVjYXVzZSB0aGVyZSBpcyBub3RoaW5nIGVsc2UgaW4gdGhlCitvcmlnaW5hbCBub2RlIHRoYXQgbmVlZHMgdG8gYmUgcHJlc2VydmVkICh0aGUgb25seSBleGlzdGluZyB0cmFuc2l0aW9uIGlzIHJlcGxhY2VkIGJ5IHRoZSB1cGRhdGUpLgorCisjIyMjIENoYW5naW5nIHRoZSBjaGlsZCBwb2ludGVyIG9mIGEgYFNwYXJzZWAgb3IgYFNwbGl0YCBub2RlCisKK1NpbWlsYXJseSB0byBhYm92ZSwgaW4gdGhpcyBjYXNlIHRoZSB0cmFuc2l0aW9uIG1hdGNoZXMgYW4gZXhpc3Rpbmcgb25lLCBhbmQgdGh1cyB3ZSBhbHJlYWR5IGhhdmUgYSA0LWJ5dGUgbG9jYXRpb24KK3doZXJlIHRoZSBwb2ludGVyIHRvIHRoZSBvbGQgY2hpbGQgaXMgd3JpdHRlbiwgYW5kIHdlIGNhbiB1cGRhdGUgaXQgYnkgZG9pbmcgYSB2b2xhdGlsZSB3cml0ZS4KKworRm9yIGV4YW1wbGUsIHVwZGF0aW5nIGBDIC0+IDB4NTFFYCBpbiBhIHNwYXJzZSBub2RlIGNhbiBiZToKKworb2Zmc2V0fGNvbnRlbnR8YmVmb3JlfGFmdGVyCistLS18LS0tfC0tLXwtLS0KKzAwIC0gMDN8Y2hpbGQgcG9pbnRlciAwfCAwMDAwMDIzOHwwMDAwMDIzOAorMDQgLSAwN3xjaGlsZCBwb2ludGVyIDF8IDAwMDAwMTNBfF8qKjAwMDAwNTFFKipfCiswOCAtIDBCfGNoaWxkIHBvaW50ZXIgMnwgMDAwMDAzM0J8MDAwMDAzM0IKKzBDIC0gMTd8dW51c2VkfAorMTggICAgIHxjaGFyYWN0ZXIgMHwgNDEgQXw0MSBBCisxOSAgICAgfGNoYXJhY3RlciAxfCA0MyBDfDQzIEMKKzFBICAgICB8Y2hhcmFjdGVyIDJ8IDM1IDV8MzUgNQorMUIgLSAxRHx1bnVzZWR8CisxRSAtIDFGfG9yZGVyIHdvcmR8IDAwMjYgPSAxMDIgKGJhc2UgNikKKworCisjIyMjIEFkZGluZyBhIG5ldyBjaGlsZCB0byBgU3BsaXRgCisKK0lmIHdlIGFscmVhZHkgaGF2ZSB0aGUgc3Vic3RydWN0dXJlIHRoYXQgbGVhZHMgdG8gdGhlIHBvaW50ZXIgZm9yIHRoZSBuZXcgdHJhbnNpdGlvbiAoaS5lLiBhIG1pZC0gYW5kIGVuZC1jZWxsIGZvciB0aGUKK3RyYW5zaXRpb24ncyBmaXJzdCAyLTMgYml0cyBhbHJlYWR5IGV4aXN0cyksIHRoZSBzaXR1YXRpb24gaXMgYXMgYWJvdmUsIHdoZXJlIHRoZSBleGlzdGluZyBwb2ludGVyIGlzIGBOT05FYCwgYW5kIHdlIGNhbgorc2ltcGx5IHBlcmZvcm0gYSB2b2xhdGlsZSB3cml0ZS4KKworSWYgYW4gZW5kLWNlbGwgbWFwcGluZyBkb2VzIG5vdCBleGlzdCwgd2UgYWxsb2NhdGUgYSBuZXcgY2xlYXJlZCBjZWxsIChzbyB0aGF0IGFsbCBwb2ludGVycyBhcmUgYE5PTkVgKSwgd3JpdGUgdGhlIG5ldworcG9pbnRlciBhdCBpdHMgcG9zaXRpb24gdXNpbmcgYSBub24tdm9sYXRpbGUgd3JpdGUsIGFuZCB0aGVuIGNyZWF0ZSBhIG1hcHBpbmcgdG8gdGhpcyBlbmQtY2VsbCBpbiB0aGUgbWlkIGNlbGwgYnkKK3ZvbGF0aWxlIHdyaXRpbmcgaXRzIHBvaW50ZXIgb3ZlciB0aGUgYE5PTkVgIGluIHRoZSBjb3JyZWN0IG9mZnNldC4gU2ltaWxhcmx5LCBpZiB0aGVyZSdzIG5vIG1pZC1jZWxsIGVpdGhlciwgd2UgY3JlYXRlCitlbXB0eSBlbmQtY2VsbCBhbmQgbWlkLWNlbGwsIHdyaXRlIHBvaW50ZXIgaW4gZW5kLWNlbGwgYW5kIG1hcHBpbmcgaW4gbWlkLWNlbGwgbm9uLXZvbGF0aWxlLCBhbmQgd3JpdGUgdGhlIG1hcHBpbmcgaW4KK3RoZSBsZWFkaW5nIGNlbGwgdm9sYXRpbGUuCisKK0luIGFueSBvZiB0aGVzZSBjYXNlcywgcmVhZGVycyBoYXZlIHRvIHBhc3MgdGhyb3VnaCB0aGUgdm9sYXRpbGUgdXBkYXRlIHRvIHJlYWNoIGFueSBvZiB0aGUgbmV3IGNvbnRlbnQuCisKK0ZvciBleGFtcGxlLCB0byBhZGQgYHggLT4gMHg3MUFgIChgeGAgaXMgYDB4NzhgIG9yIGAwYjAxMTExMDAwYCkgdG8gdGhlIHNwbGl0IG5vZGUgZXhhbXBsZSBuZWVkcyBhIG5ldyBlbmQgY2VsbCBmb3IKK2AwMSAxMTFgIChmb3IgZXhhbXBsZSBhdCBgMHg3MjAtMHg3M0ZgKSAodGhlc2Ugd3JpdGVzIGNhbiBiZSBub24tdm9sYXRpbGUpOgorCitvZmZzZXR8Y29udGVudHxiZWZvcmV8YWZ0ZXIKKy0tLXwtLS18LS0tfC0tLQorMDAgLSAwM3xwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMDAwfG4vYXwqKjAwMDAwNzFBKioKKzA0IC0gMDd8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDAwMXxuL2F8KiowMDAwMDAwMCoqIE5PTkUKKzA4IC0gMEJ8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDAxMHxuL2F8KiowMDAwMDAwMCoqIE5PTkUKKzBDIC0gMEZ8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDAxMXxuL2F8KiowMDAwMDAwMCoqIE5PTkUKKzEwIC0gMTN8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDEwMHxuL2F8KiowMDAwMDAwMCoqIE5PTkUKKzE0IC0gMTd8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDEwMXxuL2F8KiowMDAwMDAwMCoqIE5PTkUKKzE4IC0gMUJ8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDExMHxuL2F8KiowMDAwMDAwMCoqIE5PTkUKKzFDIC0gMUZ8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDExMXxuL2F8KiowMDAwMDAwMCoqIE5PTkUKKworYW5kIHRoaXMgdm9sYXRpbGUgd3JpdGUgdG8gdGhlIG1pZCBjZWxsIGAweDUyMGA6CisKK29mZnNldHxjb250ZW50fGJlZm9yZXxhZnRlcgorLS0tfC0tLXwtLS18LS0tCiswMCAtIDAzfGVuZC1jZWxsIGZvciBtaWRkbGUgMDAwfDAwMDAwMDAwIE5PTkV8MDAwMDAwMDAgTk9ORQorMDQgLSAwN3xlbmQtY2VsbCBmb3IgbWlkZGxlIDAwMXwwMDAwMDAwMCBOT05FfDAwMDAwMDAwIE5PTkUKKzA4IC0gMEJ8ZW5kLWNlbGwgZm9yIG1pZGRsZSAwMTB8MDAwMDAwMDAgTk9ORXwwMDAwMDAwMCBOT05FCiswQyAtIDBGfGVuZC1jZWxsIGZvciBtaWRkbGUgMDExfDAwMDAwMDAwIE5PTkV8MDAwMDAwMDAgTk9ORQorMTAgLSAxM3xlbmQtY2VsbCBmb3IgbWlkZGxlIDEwMHwwMDAwMDAwMCBOT05FfDAwMDAwMDAwIE5PTkUKKzE0IC0gMTd8ZW5kLWNlbGwgZm9yIG1pZGRsZSAxMDF8MDAwMDAwMDAgTk9ORXwwMDAwMDAwMCBOT05FCisxOCAtIDFCfGVuZC1jZWxsIGZvciBtaWRkbGUgMTEwfDAwMDAwNTVDfDAwMDAwNTVDCisxQyAtIDFGfGVuZC1jZWxsIGZvciBtaWRkbGUgMTExfDAwMDAwMDAwIE5PTkV8XyoqMDAwMDA3M0MqKl8KKworVGhlIHN0YXJ0IGNlbGwsIGFuZCB0aGUgb3RoZXIgbWlkIGFuZCBlbmQgY2VsbHMgcmVtYWluIHVuY2hhbmdlZC4KKworIyMjIyBBZGRpbmcgYSBuZXcgY2hpbGQgdG8gYFNwYXJzZWAgd2l0aCA1IG9yIGZld2VyIGV4aXN0aW5nIGNoaWxkcmVuCisKK1RoZSBuZWVkIHRvIG1haW50YWluIGEgY29ycmVjdCB2aWV3IGZvciBjb25jdXJyZW50IHJlYWRlcnMgd2l0aG91dCBibG9ja2luZyBpcyB0aGUgcmVhc29uIHdoeSB3ZSBjYW5ub3Qga2VlcCB0aGUKK2NoaWxkcmVuIGluIGEgYFNwYXJzZWAgY2VsbCBvcmRlcmVkIChpZiB3ZSBpbnNlcnQgb3JkZXJlZCwgd2Ugb3BlbiBvdXJzZWx2ZXMgdG8gcmVhZGVycyBwb3NzaWJseSBzZWVpbmcgdGhlIHNhbWUgcG9pbnRlcgorb3IgY2hpbGQgdHdpY2UsIG9yIGV2ZW4gZ29pbmcgYmFjayBpbiB0aGUgaXRlcmF0aW9uIG9yZGVyKS4gSW5zdGVhZCB3ZSBhbHdheXMgYWRkIG5ldyBjaGFyYWN0ZXJzIGFuZCBwb2ludGVycyBhdCB0aGUKK25leHQgZnJlZSBwb3NpdGlvbiBhbmQgdGhlbiB1cGRhdGUgdGhlIG9yZGVyIHdvcmQgdG8gaW5jbHVkZSBpdC4gTW9yZSBwcmVjaXNlbHk6CistIHdlIGZpbmQgdGhlIHNtYWxsZXN0IGluZGV4IGBpIDwgNmAgZm9yIHdoaWNoIHRoZSBwb2ludGVyIGlzIGBOT05FYAorLSB3ZSB3cml0ZSB0aGUgdHJhbnNpdGlvbiBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gYGlgCistIHdlIHdyaXRlIHRoZSBwb2ludGVyIGF0IHBvc2l0aW9uIGBpYCBvdmVyIGBOT05FYCB2b2xhdGlsZQorLSB3ZSBjb21waWxlIGEgbmV3IG9yZGVyIHdvcmQgYnkgaW5zZXJ0aW5nIGBpYCBhZnRlciBhbGwgaW5kZXhlcyB3aXRoIGdyZWF0ZXIgdHJhbnNpdGlvbiBhbmQgYmVmb3JlIGFsbCBpbmRleGVzIHdpdGgKKyAgc21hbGxlciBpbiB0aGUgYmFzZS02IHJlcHJlc2VudGF0aW9uIChlLmcuIHRvIGluc2VydCBgamAgaW4gc3BhcnNlIG5vZGUgdGhhdCBoYXMgYGFANCBmQDAgZ0AyIGtAMSBxQDNgIHdlIGNoYW5nZSB0aGUKKyAgb3JkZXIgd29yZCBgMzEyMDRgIHRvIGAzMTUyMDRgKSBhbmQgd3JpdGUgaXQgdm9sYXRpbGUKKworVGhpcyBlbnN1cmVzIHRoYXQgYW55IHJlYWRlciB0aGF0IGl0ZXJhdGVzIG92ZXIgY2hpbGRyZW4gKGkuZS4gb25lIHRoYXQgbmVlZHMgdGhlIG9yZGVyIHdvcmQpIHdpbGwgaGF2ZSB0byBwYXNzIHRocm91Z2gKK3RoZSB2b2xhdGlsZSBvcmRlciB3b3JkIHVwZGF0ZSBhbmQgd2lsbCBzZWUgdGhlIGNvcnJlY3QgY2hhcmFjdGVyIGFuZCBwb2ludGVyIHZhbHVlcy4gUmVhZGVycyB3aG8gaGF2ZSByZWFkIHRoZSBvcmRlcgord29yZCBhdCBzb21lIGVhcmxpZXIgdGltZSB3aWxsIG5vdCBpbmNsdWRlIHRoZSBuZXcgcG9pbnRlciBvciBjaGFyYWN0ZXIgaW4gdGhlIGl0ZXJhdGlvbi4KKworUmVhZGVycyB0aGF0IGRpcmVjdGx5IHNlbGVjdCB0aGUgY2hpbGQgZm9yIGEgZ2l2ZW4gdHJhbnNpdGlvbiBtdXN0IHJlYWQgdGhlIHBvaW50ZXIgZm9yIGVhY2ggaW5kZXggX2JlZm9yZV8gcmVhZGluZyB0aGUKK2NoYXJhY3RlciB0byBlbnN1cmUgdGhleSBjYW4gc2VlIHRoZSBwcm9wZXJseSB1cGRhdGVkIHZhbHVlIChvdGhlcndpc2UgdGhleSBjb3VsZCBtYXRjaCBlLmcuIGEgYDAwYCB0cmFuc2l0aW9uIHRvIHRoZQorbmV3IGJyYW5jaCBiZWNhdXNlIHRoZSByZWFsIGNoYXJhY3RlciB3YXMgbm90IHdyaXR0ZW4gd2hlbiB0aGV5IHJlYWQgdGhlIGJ5dGUsIGJ1dCB0aGUgcG9pbnRlciB3YXMgd2hlbiB0aGV5IGdvdCB0byBpdCkKK2FuZCBzdG9wIHNlYXJjaGluZyB3aGVuIHRoZXkgZmluZCBhIGBOT05FYCBwb2ludGVyLgorCitGb3IgZXhhbXBsZSwgYWRkaW5nIGB4IC0+IDB4NzFBYCB0byB0aGUgc3BhcnNlIGV4YW1wbGUgYWJvdmUgaXMgZG9uZSBieToKKworb2Zmc2V0fGNvbnRlbnR8YmVmb3JlfGFmdGVyCistLS18LS0tfC0tLXwtLS0KKzAwIC0gMDN8Y2hpbGQgcG9pbnRlciAwfCAwMDAwMDIzOHwwMDAwMDIzOAorMDQgLSAwN3xjaGlsZCBwb2ludGVyIDF8IDAwMDAwNTFFfDAwMDAwNTFFCiswOCAtIDBCfGNoaWxkIHBvaW50ZXIgMnwgMDAwMDAzM0J8MDAwMDAzM0IKKzBDIC0gMEZ8Y2hpbGQgcG9pbnRlciAzfGFueXxfKiowMDAwMDcxQSoqXworMTAgLSAxN3x1bnVzZWR8Tk9ORXxOT05FCisxOCAgICAgfGNoYXJhY3RlciAwfCA0MSBBfDQxIEEKKzE5ICAgICB8Y2hhcmFjdGVyIDF8IDQzIEN8NDMgQworMUEgICAgIHxjaGFyYWN0ZXIgMnwgMzUgNXwzNSA1CisxQiAgICAgfGNoYXJhY3RlciAzfCBhbnkgfCoqNzgqKiB4CisxQyAtIDFEfHVudXNlZHwwMCAwMHwwMCAwMAorMUUgLSAxRnxvcmRlciB3b3JkfDAwMjYgPSAxMDIgKGJhc2UgNil8XyoqMDJBRSoqXyA9IDMxMDIgKGJhc2UgNikKKword2hlcmUgd2UgZmlyc3Qgd3JpdGUgdGhlIGNoYXJhY3RlciwgdGhlbiB2b2xhdGlsZSB3cml0ZSB0aGUgcG9pbnRlciwgYW5kIGZpbmFsbHkgdGhlIG9yZGVyIHdvcmQuCisKKyMjIyMgQ2hhbmdpbmcgdGhlIHJvb3QgcG9pbnRlcgorCitJZiBhbiB1cGRhdGUgcHJvcGFnYXRlcyB3aXRoIGNvcHlpbmcgbW9kaWZpY2F0aW9ucyBhbGwgdGhlIHdheSB0byB0aGUgcm9vdCwgd2UgbXVzdCB1cGRhdGUgdGhlIHJvb3QgcG9pbnRlci4gVGhlIGxhdHRlcgoraXMgYSB2b2xhdGlsZSB2YXJpYWJsZSwgc28gdGhpcyBhbHNvIGVuZm9yY2VzIHRoZSBoYXBwZW5zLWJlZm9yZSByZWxhdGlvbnNoaXAgd2UgbmVlZC4KKworIyMjIE1lcmdpbmcgYSBicmFuY2ggdXNpbmcgYGFwcGx5YAorCitUaGlzIGlzIGEgZ2VuZXJhbGl6YXRpb24gb2YgdGhlIG11dGF0aW9uIHByb2NlZHVyZSBhYm92ZSwgd2hpY2ggYXBwbGllcyB0byBtb3JlIGNvbXBsZXggYnJhbmNoZXMsIHdoZXJlIGVhY2ggbm9kZSBtYXkKK3BvdGVudGlhbGx5IG5lZWQgbXVsdGlwbGUgdXBkYXRlcyB0byBhdHRhY2ggbW9yZSB0aGFuIG9uZSBjaGlsZC4gVGhlIHByb2Nlc3MgcHJvY2VlZHMgZm9sbG93aW5nIHRoZSBub2RlcyB0aGF0IGEgY3Vyc29yCitvZiB0aGUgbXV0YXRpb24gdHJpZSBwcm9kdWNlcyBhbmQgd2UgbWFpbnRhaW4gZnVsbCAoaS5lLiBmb3IgYWxsIG5vZGVzIGluIHRoZSBwYXJlbnQgY2hhaW4pIGJhY2t0cmFja2luZyBpbmZvcm1hdGlvbiBpbgorYW4gYXJyYXkgb2YgaW50ZWdlcnMgdGhhdCBjb250YWlucworLSBgZXhpc3RpbmdOb2RlYCwgdGhlIGNvcnJlc3BvbmRpbmcgcG9pbnRlciBpbiB0aGUgbWVtdGFibGUgdHJpZSwKKy0gYHVwZGF0ZWROb2RlYCwgdGhlIGN1cnJlbnQgY29ycmVzcG9uZGluZyBwb2ludGVyIGluIHRoZSBtZW10YWJsZSB0cmllLCB3aGljaCBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIGFib3ZlIGlmIHRoZQorICBtdXRhdGlvbiBub2RlIGlzIGJyYW5jaGluZyBhbmQgb25lIG9yIG1vcmUgb2YgaXRzIGNoaWxkcmVuIGhhdmUgYmVlbiBhbHJlYWR5IGFkZGVkLAorLSBgdHJhbnNpdGlvbmAsIHRoZSBpbmNvbWluZyBlZGdlIHdlIHRvb2sgdG8gcmVhY2ggdGhlIG5vZGUuCisKK1doZW4gd2UgZGVzY2VuZCwgd2UgZm9sbG93IHRoZSB0cmFuc2l0aW9ucyBpbiB0aGUgbWVtdGFibGUgdHJpZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBvbmVzIGZyb20gYW4gaXRlcmF0aW9uIG92ZXIgdGhlCitzdHJ1Y3R1cmUgb2YgdGhlIG11dGF0aW9uIHRyaWUgdG8gb2J0YWluIHRoZSBgZXhpc3RpbmdOb2RlYCBwb2ludGVycywgYW5kIGluaXRpYWxpemUgYHVwZGF0ZWROb2RlYCB0byB0aGUgc2FtZS4gV2hlbiB0aGUKK2l0ZXJhdGlvbiBwcm9jZXNzZXMgYSBjaGlsZCwgd2UgYXBwbHkgdGhlIHVwZGF0ZSB0byB0aGUgbm9kZSwgd2hpY2ggbWF5IGhhcHBlbiBpbiBwbGFjZSwgb3IgbWF5IHJlcXVpcmUgY29weWluZworJm1kYXNoOyBpbiB0aGUgbGF0dGVyIGNhc2UgYHVwZGF0ZWROb2RlYCB3aWxsIGNoYW5nZSB0byB0aGUgbmV3IHZhbHVlLiBOb3RlIHRoYXQgaWYgYHVwZGF0ZWROb2RlYCB3YXMgZGlmZmVyZW50IGZyb20KK3RoZSBvcmlnaW5hbCBgZXhpc3RpbmdOb2RlYCwgaXQgd2FzIHBvaW50aW5nIHRvIGFuIHVucmVhY2hhYmxlIGNvcGllZCBub2RlIHdoaWNoIHdpbGwgcmVtYWluIHVucmVhY2hhYmxlIGFzIHdlIHdpbGwgb25seQorYXR0YWNoIHRoZSBuZXdlciB2ZXJzaW9uLgorCitBZnRlciBhbGwgbW9kaWZpY2F0aW9ucyBjb21pbmcgYXMgdGhlIHJlc3VsdCBvZiBhcHBsaWNhdGlvbiBvZiBjaGlsZCBicmFuY2hlcyBoYXZlIGJlZW4gYXBwbGllZCwgd2UgaGF2ZSBhbgorYHVwZGF0ZWROb2RlYCB0aGF0IHJlZmxlY3RzIGFsbC4gQXMgd2UgYXNjZW5kIHdlIGFwcGx5IHRoYXQgbmV3IHZhbHVlIHRvIHRoZSBwYXJlbnQncyBgdXBkYXRlZE5vZGVgLgorCitGb3IgZXhhbXBsZSAoYWRkaW5nIGEgdHJpZSBjb250YWluaW5nICJ0cmF2ZXJzZSwgdHJ1Y2siIHRvIHRoZSAidHJhY3RvciwgdHJlZSwgdHJpZSIgb25lKToKKworIVtncmFwaF0oSW5NZW1vcnlUcmllLm1kLmExLnN2ZykKKworSW4gdGhpcyBkaWFncmFtIGBleGlzdGluZ05vZGVgcyBhcmUgdGhlIG9uZXMgcmVhY2hlZCB0aHJvdWdoIHRoZSA8c3BhbiBzdHlsZT0iY29sb3I6bGlnaHRibHVlIj5saWdodCBibHVlPC9zcGFuPiBhcnJvd3MgZHVyaW5nIHRoZSBkZXNjZW50IHBoYXNlIChlLmcuCitgMHgwMThgIGZvciB0aGUgYEFwcGx5U3RhdGVgIGF0IGB0cmFgLCBvciBgTk9ORWAgZm9yIGB0cnVgKSwgYW5kIGB1cGRhdGVkTm9kZWBzIGFyZSB0aGUgb25lcyBhc2NlbnQgKDxzcGFuIHN0eWxlPSJjb2xvcjpwaW5rIj5waW5rPC9zcGFuPiBhcnJvd3MpCityZXR1cm5zIHdpdGggKGUuZyAuIGAweDBERWAgYW5kIGAweDBGQWAgZm9yIHRoZSByZXNwZWN0aXZlIHN0YXRlcykuCisKK0R1cmluZyB0aGlzIHByb2Nlc3MsIHJlYWRlcnMgY2FuIHNlZSBhbnkgbW9kaWZpY2F0aW9ucyBtYWRlIGluIHBsYWNlIChlYWNoIGluLXBsYWNlIG1vZGlmaWNhdGlvbiBpcyBhbiBhdHRhY2htZW50IHBvaW50Cit3aGljaCBtYWtlcyBwYXJ0IG9mIHRoZSBuZXcgbm9kZXMgcmVhY2hhYmxlKS4gVGhlIHVwZGF0ZSBtZWNoYW5pc20gYWJvdmUgbWFrZXMgc3VyZSBib3RoIHRoYXQgdGhlIHN0YXRlIGJlZm9yZSB0aGUKK3VwZGF0ZSBpcyBwcmVzZXJ2ZWQsIGFuZCB0aGF0IHRoZSBzdGF0ZSBhZnRlciB0aGUgdXBkYXRlIGlzIGZ1bGx5IHZpc2libGUgZm9yIHJlYWRlcnMgdGhhdCBjYW4gcmVhY2ggaXQsIGJ1dCBpdCBkb2VzIG5vdAorZ3VhcmFudGVlIHRoYXQgdGhlIG11dGF0aW9uIGlzIHNlZW4gYXRvbWljYWxseSBieSB0aGUgcmVhZGVycyBpZiBpdCBjb250YWlucyBtdWx0aXBsZSBzZXBhcmF0ZSBicmFuY2hlcy4KK0l0IGlzIHBvc3NpYmxlIGZvciBhIHJlYWRlciB0byBzZWUgb25seSBhIHBhcnQgb2YgdGhlIHVwZGF0ZSwgZm9yIGV4YW1wbGU6CistIGEgcmVhZGluZyB0aHJlYWQgcmFjaW5nIHdpdGggdGhlIG11dGF0b3IgY2FuIGl0ZXJhdGUgb3ZlciBgdHJhdmVyc2VgIGJ1dCBmaW5pc2ggaXRlcmF0aW5nIGJlZm9yZSB0aGUgbXV0YXRvcgorbWFuYWdlcyB0byBhdHRhY2ggYHRydWNrYDsKKy0gYSByZWFkaW5nIHRocmVhZCB0aGF0IGl0ZXJhdGVkIHRvIGB0cmVlYCAod2hpbGUgYHRyYXZlcnNlYCB3YXMgbm90IHlldCBhdHRhY2hlZCkgYW5kIHBhdXNlZCwgd2lsbCBzZWUgYHRydWNrYCBpZiB0aGUKK211dGF0aW5nIHRocmVhZCBhcHBsaWVzIHRoZSB1cGRhdGUgZHVyaW5nIHRoZSBwYXVzZS4KKworIyMjIEhhbmRsaW5nIHByZWZpeCBub2RlcworCitUaGUgZGVzY3JpcHRpb25zIGFib3ZlIHdlcmUgZ2l2ZW4gd2l0aG91dCBwcmVmaXggbm9kZXMuIEhhbmRsaW5nIHByZWZpeGVzIGlzIGp1c3QgYSBsaXR0bGUgY29tcGxpY2F0aW9uIG92ZXIgdGhlIHVwZGF0ZQorcHJvY2VzcyB3aGVyZSB3ZSBtdXN0IGF1Z21lbnQgYHVwZGF0ZWROb2RlYCB3aXRoIGFueSBhcHBsaWNhYmxlIGNvbnRlbnQgYmVmb3JlIGFwcGx5aW5nIHRoZSBjaGFuZ2UgdG8gdGhlIHBhcmVudC4KK1RvIGRvIHRoaXMgd2UgZXhwYW5kIHRoZSBzdGF0ZSB0cmFja2VkIHRvOgorLSBgZXhpc3RpbmdQcmVDb250ZW50Tm9kZWAgd2hpY2ggcG9pbnRzIHRvIHRoZSBleGlzdGluZyBub2RlIGluY2x1ZGluZyBhbnkgcHJlZml4LAorLSBgZXhpc3RpbmdQb3N0Q29udGVudE5vZGVgIHdoaWNoIGlzIG9idGFpbmVkIGJ5IHNraXBwaW5nIG92ZXIgdGhlIHByZWZpeCAoZm9yIHNpbXBsaWNpdHkgd2UgYWxzbyB0cmVhdCBsZWFmCisgIG5vZGVzIGxpa2UgYSBwcmVmaXggd2l0aCBubyBjaGlsZCkgYW5kIGlzIHRoZSBiYXNlIGZvciBhbGwgY2hpbGQgdXBkYXRlcyAoaS5lLiBpdCB0YWtlcyB0aGUgcm9sZSBvZgorICBgZXhpc3RpbmdOb2RlYCBpbiB0aGUgZGVzY3JpcHRpb25zIGFib3ZlKSwKKy0gYHVwZGF0ZWRQb3N0Q29udGVudE5vZGVgIHdoaWNoIGlzIHRoZSBub2RlIGFzIGNoYW5nZWQvY29waWVkIGFmdGVyIGNoaWxkcmVuIG1vZGlmaWNhdGlvbnMgYXJlIGFwcGxpZWQsCistIGBjb250ZW50SW5kZXhgIHdoaWNoIGlzIHRoZSBpbmRleCBpbiB0aGUgY29udGVudCBhcnJheSBmb3IgdGhlIHJlc3VsdCBvZiBtZXJnaW5nIGV4aXN0aW5nIGFuZCBuZXdseSBpbnRyb2R1Y2VkIAorICBjb250ZW50LCAoTm90ZTogVGhlIG11dGF0aW9uIGNvbnRlbnQgaXMgb25seSByZWFkYWJsZSB3aGVuIHRoZSBjdXJzb3IgZW50ZXJzIHRoZSBub2RlLCBhbmQgd2UgY2FuIG9ubHkgYXR0YWNoIGl0IHdoZW4KKyAgd2UgYXNjZW5kIGZyb20gaXQuKQorLSBgdHJhbnNpdGlvbmAgcmVtYWlucyBhcyBiZWZvcmUuCisKK2FuZCB3ZSB0aGVuIGF0dGFjaCBgY29udGVudEluZGV4YCB0byBjb21waWxlIGFuIGB1cGRhdGVkUHJlQ29udGVudE5vZGVgIHdoaWNoIHRoZSBwYXJlbnQgaXMgbWFkZSB0byBsaW5rIHRvLiBUaGlzIHdpbGwKK2JlIGVxdWFsIHRvIGB1cGRhdGVkUG9zdENvbnRlbnROb2RlYCBpZiBubyBjb250ZW50IGFwcGxpZXMsIGkuZS4gYGNvbnRlbnRJbmRleCA9PSAtMWAuCisKKygiUHJlLSIgYW5kICJwb3N0LSIgcmVmZXIgdG8gZGVzY2VudC9pdGVyYXRpb24gb3JkZXIsIG5vdCB0byBjb25zdHJ1Y3Rpb24gb3JkZXI7IGUuZy4gYHVwZGF0ZWRQcmVDb250ZW50Tm9kZWAgaXMKK2NvbnN0cnVjdGVkIGFmdGVyIGB1cGRhdGVkUG9zdENvbnRlbnROb2RlYCBidXQgbGlua3MgYWJvdmUgaXQgaW4gdGhlIHRyaWUuKQorCitBcyBhbiBleGFtcGxlLCBjb25zaWRlciB0aGUgcHJvY2VzcyBvZiBhZGRpbmcgYHRyZWVzYCB0byBvdXIgc2FtcGxlIHRyaWU6CisKKyFbZ3JhcGhdKEluTWVtb3J5VHJpZS5tZC5wMS5zdmcpCisKK1doZW4gZGVzY2VuZGluZyBhdCBgdHJlZWAgd2Ugc2V0IGBleGlzdGluZ1ByZUNvbnRlbnROb2RlID0gfjFgLCBgZXhpc3RpbmdQb3N0Q29udGVudE5vZGUgPSBOT05FYCBhbmQgYGNvbnRlbnRJbmRleCA9IDFgLgorQXNjZW5kaW5nIGJhY2sgdG8gYWRkIHRoZSBjaGlsZCBgfjNgLCB3ZSBhZGQgYSBjaGlsZCB0byBgTk9ORWAgYW5kIGdldCBgdXBkYXRlZFBvc3RDb250ZW50Tm9kZSA9IDB4MEJCYC4gVG8gdGhlbiBhcHBseQordGhlIGV4aXN0aW5nIGNvbnRlbnQsIHdlIGNyZWF0ZSB0aGUgZW1iZWRkZWQgcHJlZml4IG5vZGUgYHVwZGF0ZWRQcmVDb250ZW50Tm9kZSA9IDB4MEJGYCB3aXRoIGBjb250ZW50SW5kZXggPSAxYCBhbmQKK3Bhc3MgdGhhdCBvbiB0byB0aGUgcmVjdXJzaW9uLgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLmExLnN2ZyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC5hMS5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIzN2ZiNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC5hMS5zdmcKQEAgLTAsMCArMSw1OTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIgorICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KKzwhLS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gR2VuZXJhdGVkIGJ5IGdyYXBodml6IHZlcnNpb24gMi40MC4xICgyMDE2MTIyNS4wMzA0KQorIyBlbWJlZGRlZCBET1QgKHBsYW50dW1sKSB3b3JrcyBpbiBJREVBIHByZXZpZXcKKyMgYnV0IG5vdCBvbiBHaXRIdWIKK2BgYHBsYW50dW1sCitkaWdyYXBoIEcgeworICAgIHsgcmFuaz1zYW1lIHJvb3QgLT4gc3RhcnQgW3N0eWxlPWludmlzXSB9CisgICAgc3RhcnQgW2xhYmVsPSJzdGFydC9lbmQiXQorCisgICAgdHJhY3RvciBbbGFiZWwgPSAiY29udGVudEFycmF5WzBdIl0KKyAgICB0cmFjdG8gW2xhYmVsID0gIjB4MDFCIl0KKyAgICB0cmFjdCBbbGFiZWwgPSAiMHgwMUEiXQorICAgIHRyYWMgW2xhYmVsID0gIjB4MDE5Il0KKyAgICB0cmEgW2xhYmVsID0gIkNoYWluXG4weDAxOCI7IGNvbG9yID0gImxpZ2h0Z3JleSI7IGZvbnRjb2xvciA9IGxpZ2h0Z3JheV0KKworICAgIHRyZWUgW2xhYmVsID0gImNvbnRlbnRBcnJheVsxXSJdCisgICAgdHJlIFtsYWJlbCA9ICJDaGFpblxuMHgwM0IiXQorICAgIHRyaWUgW2xhYmVsID0gImNvbnRlbnRBcnJheVsyXSJdCisgICAgdHJpIFtsYWJlbCA9ICJDaGFpblxuMHgwNUIiXQorCisgICAgdHIgW2xhYmVsID0gIlNwYXJzZVxuMHgwN0UiXQorCisgICAgdCBbbGFiZWwgPSAiMHgwOUIiXQorICAgIHJvb3QgW2xhYmVsID0gIkNoYWluXG4weDlBIl0KKworICAgIHJvb3QgLT4gdCBbbGFiZWwgPSAiIHQiXQorICAgIHQgLT4gdHIgW2xhYmVsID0gIiByIl0KKyAgICB0cmFjIC0+IHRyYWN0IFtsYWJlbCA9ICIgdCJdCisgICAgdHJhY3QgLT4gdHJhY3RvIFtsYWJlbCA9ICIgbyJdCisgICAgdHJhY3RvIC0+IHRyYWN0b3IgW2xhYmVsID0gIiByIl0KKworICAgIHRyIC0+IHRyYSBbbGFiZWwgPSAiIGEiOyBjb2xvciA9ICJsaWdodGdyZXkiOyBmb250Y29sb3IgPSBsaWdodGdyYXldCisgICAgdHJhIC0+IHRyYWMgW2xhYmVsID0gIiBjIjsgY29sb3IgPSAibGlnaHRncmV5IjsgZm9udGNvbG9yID0gbGlnaHRncmF5XQorCisgICAgdHIgLT4gdHJlIFtsYWJlbCA9ICIgZSJdCisgICAgdHJlIC0+IHRyZWUgW2xhYmVsID0gIiBlIl0KKworICAgIHRyIC0+IHRyaSBbbGFiZWwgPSAiIGkiXQorICAgIHRyaSAtPiB0cmllIFtsYWJlbCA9ICIgZSJdCisKKyAgICBzdWJncmFwaCBwYXRoIHsKKyAgICAgICAgZWRnZSBbY29sb3IgPSAibGlnaHRibHVlIjsgZm9udGNvbG9yPSJibHVlIjsgYXJyb3doZWFkPSJ2ZWUiXQorICAgICAgICBub2RlIFtjb2xvciA9ICJibHVlIjsgZm9udGNvbG9yPSJibHVlIl0KKworICAgICAgICBzdGFydCAtPiByb290CisKKyAgICAgICAgcm9vdCAtPiB0IFtsYWJlbCA9ICIgdCJdCisgICAgICAgIHQgLT4gdHIgW2xhYmVsID0gIiByIl0KKyAgICAgICAgdHIgLT4gdHJhIFtsYWJlbCA9ICIgYSJdCisgICAgICAgIHRyYSAtPiB0cmF2IFtsYWJlbCA9ICIgdiJdCisgICAgICAgIHRyYXYgLT4gdHJhdmUgW2xhYmVsID0gIiBlIl0KKyAgICAgICAgdHJhdmUgLT4gdHJhdmVyIFtsYWJlbCA9ICIgciJdCisgICAgICAgIHRyYXZlciAtPiB0cmF2ZXJzIFtsYWJlbCA9ICIgcyJdCisgICAgICAgIHRyYXZlcnMgLT4gdHJhdmVyc2UgW2xhYmVsID0gIiBlIl0KKworICAgICAgICB0cmEyIFtsYWJlbCA9ICJTcGFyc2VcbjB4MERFIl0KKyAgICAgICAgdHJhdiBbbGFiZWwgPSAiQ2hhaW5cbjB4MEI4Il0KKyAgICAgICAgdHJhdmUgW2xhYmVsID0gIjB4MEI5Il0KKyAgICAgICAgdHJhdmVyIFtsYWJlbCA9ICIweDBCQSJdCisgICAgICAgIHRyYXZlcnMgW2xhYmVsID0gIjB4MEJCIl0KKyAgICAgICAgdHJhdmVyc2UgW2xhYmVsID0gImNvbnRlbnRBcnJheVszXSJdCisKKyAgICAgICAgdHIgLT4gdHJ1IFtsYWJlbCA9ICIgdSJdCisgICAgICAgIHRydSAtPiB0cnVjIFtsYWJlbCA9ICIgYyJdCisgICAgICAgIHRydWMgLT4gdHJ1Y2sgW2xhYmVsID0gIiBrIl0KKworICAgICAgICB0cnUgW2xhYmVsID0gIkNoYWluXG4weDBGQSJdCisgICAgICAgIHRydWMgW2xhYmVsID0gIjB4MEZCIl0KKyAgICAgICAgdHJ1Y2sgW2xhYmVsID0gImNvbnRlbnRBcnJheVs0XSJdCisgICAgfQorCisgICAge3Jhbms9c2FtZSB0cmEgLT4gdHJhMiAtPiB0cmUgLT4gdHJpIC0+IHRydSBbc3R5bGU9aW52aXNdfQorICAgIHtyYW5rPXNhbWUgdHJhYyAtPiB0cmF2IC0+IHRyZWUgLT4gdHJpZSAtPiB0cnVjIFtzdHlsZT1pbnZpc119CisKKyAgICB7CisgICAgICAgIGVkZ2UgW2NvbG9yID0gImJsdWUiXQorICAgICAgICB0ciAtPiB0cmEyIFtsYWJlbCA9ICIgYSJdCisgICAgICAgIHRyYTIgLT4gdHJhYyBbbGFiZWwgPSAiIGMiXQorICAgICAgICB0cmEyIC0+IHRyYXYgW2xhYmVsID0gIiB2Il0KKyAgICAgICAgdHJhdiAtPiB0cmF2ZSBbbGFiZWwgPSAiIGUiXQorICAgICAgICB0cmF2ZSAtPiB0cmF2ZXIgW2xhYmVsID0gIiByIl0KKyAgICAgICAgdHJhdmVyIC0+IHRyYXZlcnMgW2xhYmVsID0gIiBzIl0KKyAgICAgICAgdHJhdmVycyAtPiB0cmF2ZXJzZSBbbGFiZWwgPSAiIGUiXQorICAgICAgICB0ciAtPiB0cnUgW2xhYmVsID0gIiB1Il0KKyAgICAgICAgdHJ1IC0+IHRydWMgW2xhYmVsID0gIiBjIl0KKyAgICAgICAgdHJ1YyAtPiB0cnVjayBbbGFiZWwgPSAiIGsiXQorICAgIH0KKworICAgIHN1YmdyYXBoIGJhY2sgeworICAgICAgICBlZGdlIFtjb2xvciA9ICJwaW5rIjsgZm9udGNvbG9yPSJyZWQiOyBhcnJvd2hlYWQ9InZlZSI7IGNvbnN0cmFpbj0iZmFsc2UiXQorCisgICAgICAgIHRyYXZlcnNlIC0+IHRyYXZlcnMgW2xhYmVsID0gIiB+MyJdCisgICAgICAgIHRyYXZlcnMgLT4gdHJhdmVyIFtsYWJlbCA9ICIweDBCQiJdCisgICAgICAgIHRyYXZlciAtPiB0cmF2ZSBbbGFiZWwgPSAiMHgwQkEiXQorICAgICAgICB0cmF2ZSAtPiB0cmF2IFtsYWJlbCA9ICIweDBCOSJdCisgICAgICAgIHRyYXYgLT4gdHJhMiBbbGFiZWwgPSAiMHgwQjgiXQorICAgICAgICB0cmEyIC0+IHRyIFtsYWJlbCA9ICIweDBERSJdCisgICAgICAgIHRyIC0+IHQgW2xhYmVsID0gIjB4MDdFIl0KKyAgICAgICAgdCAtPiByb290IFtsYWJlbCA9ICIweDA5QiJdCisgICAgICAgIHJvb3QgLT4gc3RhcnQgW2xhYmVsID0gIjB4MDlBIl0KKworICAgICAgICB0cnVjayAtPiB0cnVjIFtsYWJlbCA9ICJ+NCJdCisgICAgICAgIHRydWMgLT4gdHJ1IFtsYWJlbCA9ICIweDBGQiJdCisgICAgICAgIHRydSAtPiB0ciBbbGFiZWwgPSAiMHgwRkEiXQorICAgIH0KK30KK2BgYAorIC0tPgorPCEtLSBUaXRsZTogRyBQYWdlczogMSAtLT4KKzxzdmcgd2lkdGg9Ijc1N3B0IiBoZWlnaHQ9Ijg0NnB0IgorICAgICB2aWV3Qm94PSIwLjAwIDAuMDAgNzU3LjQ3IDg0NS43MyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CisgICAgPGcgaWQ9ImdyYXBoMCIgY2xhc3M9ImdyYXBoIiB0cmFuc2Zvcm09InNjYWxlKDEgMSkgcm90YXRlKDApIHRyYW5zbGF0ZSg0IDg0MS43MjUxKSI+CisgICAgICAgIDx0aXRsZT5HPC90aXRsZT4KKyAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSJ0cmFuc3BhcmVudCIgcG9pbnRzPSItNCw0IC00LC04NDEuNzI1MSA3NTMuNDczOCwtODQxLjcyNTEgNzUzLjQ3MzgsNCAtNCw0Ii8+CisgICAgICAgIDwhLS0gcm9vdCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+cm9vdDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzNTcuMjM2OSIgY3k9Ii04MDguMzA5NSIgcng9IjMzLjEzMzciIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNTcuMjM2OSIgeT0iLTgxMi41MDk1IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzU3LjIzNjkiIHk9Ii03OTUuNzA5NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDlBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gc3RhcnQgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnN0YXJ0PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjQ5MC4yMzY5IiBjeT0iLTgwOC4zMDk1IiByeD0iNDQuMDc3NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0OTAuMjM2OSIgeT0iLTgwNC4xMDk1IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPnN0YXJ0L2VuZDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHJvb3QmIzQ1OyZndDtzdGFydCAtLT4KKyAgICAgICAgPCEtLSByb290JiM0NTsmZ3Q7c3RhcnQgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNTEiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT5yb290JiM0NTsmZ3Q7c3RhcnQ8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMzkwLjc5ODQsLTgwOC4zMDk1QzQwNC4zMDM3LC04MDguMzA5NSA0MjAuMjMzOSwtODA4LjMwOTUgNDM1LjMzOTgsLTgwOC4zMDk1Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iNDQ1LjYyNjEsLTgwOC4zMDk1IDQzNS42MjYyLC04MTIuODA5NiA0NDAuNjI2MSwtODA4LjMwOTUgNDM1LjYyNjEsLTgwOC4zMDk2IDQzNS42MjYxLC04MDguMzA5NiA0MzUuNjI2MSwtODA4LjMwOTYgNDQwLjYyNjEsLTgwOC4zMDk1IDQzNS42MjYxLC04MDMuODA5NiA0NDUuNjI2MSwtODA4LjMwOTUgNDQ1LjYyNjEsLTgwOC4zMDk1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MTguMjUwOSIgeT0iLTgxNS41MDk1IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNmZjAwMDAiPjB4MDlBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnQ8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMzU3LjIzNjkiIGN5PSItNzA4LjA5MzkiIHJ4PSIzNi41ODI0IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM1Ny4yMzY5IiB5PSItNzAzLjg5MzkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwOUI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSByb290JiM0NTsmZ3Q7dCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+cm9vdCYjNDU7Jmd0O3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMzM3Ljk1NjQsLTc4NC4yNjEyQzMzMC43MzkzLC03NzIuMzQ4NSAzMjUuMjc2OCwtNzU3LjY0NjIgMzI5Ljg0NjMsLTc0NC4wOTM5IDMzMS4xNjM2LC03NDAuMTg2OSAzMzMuMDkyNiwtNzM2LjM2ODQgMzM1LjMyNjksLTczMi43NjYzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMzM4LjM4NDQsLTczNC41MDY4IDM0MS4zMzU3LC03MjQuMzMxMyAzMzIuNjgzLC03MzAuNDQ1NCAzMzguMzg0NCwtNzM0LjUwNjgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMzMy45MzIyIiB5PSItNzQ4LjI5MzkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSByb290JiM0NTsmZ3Q7dCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnJvb3QmIzQ1OyZndDt0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTM1Ny4yMzY5LC03NzguNzgzNUMzNTcuMjM2OSwtNzY1LjI5ODQgMzU3LjIzNjksLTc0OS40MDYyIDM1Ny4yMzY5LC03MzYuMTA5MiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjM1Ny4yMzY5LC03MjYuMDk3MiAzNjEuNzM3LC03MzYuMDk3MSAzNTcuMjM2OSwtNzMxLjA5NzIgMzU3LjIzNywtNzM2LjA5NzIgMzU3LjIzNywtNzM2LjA5NzIgMzU3LjIzNywtNzM2LjA5NzIgMzU3LjIzNjksLTczMS4wOTcyIDM1Mi43MzcsLTczNi4wOTcyIDM1Ny4yMzY5LC03MjYuMDk3MiAzNTcuMjM2OSwtNzI2LjA5NzIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM2MC45MzIyIiB5PSItNzQ4LjI5MzkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IHQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSBzdGFydCYjNDU7Jmd0O3Jvb3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT5zdGFydCYjNDU7Jmd0O3Jvb3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNNDQ2LjQwNDIsLTgwNS42MzMzQzQzNC4yOTM4LC04MDUuMTgxOCA0MjEuMTQ3OSwtODA0Ljk1ODQgNDA5LjAxODQsLTgwNS4zMDk1IDQwNi4zMjY0LC04MDUuMzg3NCA0MDMuNTU2OCwtODA1LjQ4ODEgNDAwLjc2NDMsLTgwNS42MDUxIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMzkwLjY1MDQsLTgwNi4wODkgNDAwLjQyMzksLTgwMS4xMTYxIDM5NS42NDQ3LC04MDUuODUgNDAwLjYzOSwtODA1LjYxMSA0MDAuNjM5LC04MDUuNjExIDQwMC42MzksLTgwNS42MTEgMzk1LjY0NDcsLTgwNS44NSA0MDAuODU0MSwtODEwLjEwNTggMzkwLjY1MDQsLTgwNi4wODkgMzkwLjY1MDQsLTgwNi4wODkiLz4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0b3IgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0b3I8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii0xMDYuOCIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzMuMjM2OSIgeT0iLTEwMi42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVswXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0byAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU0IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9Ijc0LjIzNjkiIGN5PSItMTk1LjYiIHJ4PSIzNi41ODI0IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijc0LjIzNjkiIHk9Ii0xOTEuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0byYjNDU7Jmd0O3RyYWN0b3IgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0byYjNDU7Jmd0O3RyYWN0b3I8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNNzQuMDI5NywtMTc3LjIwMDZDNzMuODkzNCwtMTY1LjA5NDkgNzMuNzEyMiwtMTQ5LjAwNzYgNzMuNTU3NSwtMTM1LjI2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI3Ny4wNTI5LC0xMzQuODMxOSA3My40NDA0LC0xMjQuODcyIDcwLjA1MzMsLTEzNC45MTA4IDc3LjA1MjksLTEzNC44MzE5Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3OC4zMTcyIiB5PSItMTQ3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3QgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9Ijc4LjIzNjkiIGN5PSItMjg0LjQiIHJ4PSIzNy4xNDQzIiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijc4LjIzNjkiIHk9Ii0yODAuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxQTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0JiM0NTsmZ3Q7dHJhY3RvIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTUiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdCYjNDU7Jmd0O3RyYWN0bzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik03Ny40MDgxLC0yNjYuMDAwNkM3Ni44NjI4LC0yNTMuODk0OSA3Ni4xMzgxLC0yMzcuODA3NiA3NS41MTkyLC0yMjQuMDY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9Ijc4Ljk5NzUsLTIyMy41MDQ0IDc1LjA1MDksLTIxMy42NzIgNzIuMDA0NiwtMjIzLjgxOTQgNzguOTk3NSwtMjIzLjUwNDQiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjgyLjQ4NjkiIHk9Ii0yMzUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gbzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWMgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWM8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iOTQuMjM2OSIgY3k9Ii0zODQuNjE1NiIgcng9IjM1LjM1ODciIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iOTQuMjM2OSIgeT0iLTM4MC40MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDE5PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhYyYjNDU7Jmd0O3RyYWN0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTQiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjJiM0NTsmZ3Q7dHJhY3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNOTEuMzAyMiwtMzY2LjIzNDVDODguOTExNSwtMzUxLjI2MDMgODUuNDk1NSwtMzI5Ljg2NDMgODIuNzU2LC0zMTIuNzA1NSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9Ijg2LjE4NTgsLTMxMS45ODc3IDgxLjE1MjksLTMwMi42NjQ2IDc5LjI3MzQsLTMxMy4wOTEzIDg2LjE4NTgsLTMxMS45ODc3Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI4OS45MzIyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTE0IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGN4PSIyMDIuMjM2OSIgY3k9Ii0zODQuNjE1NiIgcng9IjM3LjkzMDYiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDIuMjM2OSIgeT0iLTM4OC44MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjAyLjIzNjkiIHk9Ii0zNzIuMDE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4weDBCODwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWMmIzQ1OyZndDt0cmF2IC0tPgorICAgICAgICA8IS0tIHRyYSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU3IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2QzZDNkMyIgY3g9IjEzMy4yMzY5IiBjeT0iLTQ5Ni4yNDY5IiByeD0iMzYuMTI1IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTMzLjIzNjkiIHk9Ii01MDAuNDQ2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZDNkM2QzIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjEzMy4yMzY5IiB5PSItNDgzLjY0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2QzZDNkMyI+MHgwMTg8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmEmIzQ1OyZndDt0cmFjIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTgiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmEmIzQ1OyZndDt0cmFjPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2QzZDNkMyIgZD0iTTExNC41MTg4LC00NzAuNjczOUMxMTAuMzAxNiwtNDYzLjg2MjIgMTA2LjI2NjYsLTQ1Ni4zMDk4IDEwMy41MjIzLC00NDguODMxMyA5OS4zNzU4LC00MzcuNTMxOCA5Ny4wNzMxLC00MjQuNDc3NiA5NS43OTczLC00MTMuMTAyMSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2QzZDNkMyIgc3Ryb2tlPSIjZDNkM2QzIiBwb2ludHM9Ijk5LjI1MzgsLTQxMi40NjM4IDk0Ljg2MjIsLTQwMi44MjIgOTIuMjgyNiwtNDEzLjA5OCA5OS4yNTM4LC00MTIuNDYzOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTA5LjA5NDIiIHk9Ii00MzYuMjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZDNkM2QzIj4gYzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYSYjNDU7Jmd0O3RyYXYgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTciIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmEmIzQ1OyZndDt0cmF2PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTEzMC43NTI3LC00NjYuNjE5N0MxMzEuMDM5OSwtNDU1LjE4ODkgMTMyLjk3MzQsLTQ0Mi4zOTc1IDEzOC43MzY5LC00MzIuMDMxMyAxNDQuMjY1MSwtNDIyLjA4ODEgMTUyLjg0NjksLTQxMy42MjE0IDE2MS45MzMsLTQwNi43MTQ4Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMTcwLjM0NiwtNDAwLjgxMjkgMTY0Ljc0MzksLTQxMC4yMzk4IDE2Ni4yNTI3LC00MDMuNjg0NCAxNjIuMTU5NSwtNDA2LjU1NTkgMTYyLjE1OTUsLTQwNi41NTU5IDE2Mi4xNTk1LC00MDYuNTU1OSAxNjYuMjUyNywtNDAzLjY4NDQgMTU5LjU3NTEsLTQwMi44NzIgMTcwLjM0NiwtNDAwLjgxMjkgMTcwLjM0NiwtNDAwLjgxMjkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE0NC40ODY5IiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IHY8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmEyIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTE5IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhMjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGN4PSIyNDQuMjM2OSIgY3k9Ii00OTYuMjQ2OSIgcng9IjM5LjIxNDUiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNDQuMjM2OSIgeT0iLTUwMC40NDY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPlNwYXJzZTwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI0NC4yMzY5IiB5PSItNDgzLjY0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+MHgwREU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmEmIzQ1OyZndDt0cmEyIC0tPgorICAgICAgICA8IS0tIHRyZWUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlOCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyZWU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMzQ4LjIzNjkiIGN5PSItMzg0LjYxNTYiIHJ4PSI3My40NzQ1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM0OC4yMzY5IiB5PSItMzgwLjQxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzFdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyaWU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNTMwLjIzNjkiIGN5PSItMzg0LjYxNTYiIHJ4PSI3My40NzQ1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjUzMC4yMzY5IiB5PSItMzgwLjQxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzJdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlZSYjNDU7Jmd0O3RyaWUgLS0+CisgICAgICAgIDwhLS0gdHJlIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTkiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMzU3LjIzNjkiIGN5PSItNDk2LjI0NjkiIHJ4PSIzNy45MzA2IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzU3LjIzNjkiIHk9Ii01MDAuNDQ2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM1Ny4yMzY5IiB5PSItNDgzLjY0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwM0I8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmUmIzQ1OyZndDt0cmVlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTEwIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlJiM0NTsmZ3Q7dHJlZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0zNTQuODQ4NywtNDY2LjYyNDlDMzUzLjUwNzMsLTQ0OS45ODczIDM1MS44NDIyLC00MjkuMzM0IDM1MC41MTg2LC00MTIuOTE2MyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjM1My45OTczLC00MTIuNTEwMyAzNDkuNzA0OSwtNDAyLjgyMzkgMzQ3LjAxOTksLTQxMy4wNzI5IDM1My45OTczLC00MTIuNTEwMyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzU5LjA5NDIiIHk9Ii00MzYuMjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyaTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI0NjguMjM2OSIgY3k9Ii00OTYuMjQ2OSIgcng9IjM3LjkzMDYiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0NjguMjM2OSIgeT0iLTUwMC40NDY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDY4LjIzNjkiIHk9Ii00ODMuNjQ2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDA1QjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZSYjNDU7Jmd0O3RyaSAtLT4KKyAgICAgICAgPCEtLSB0cnVjIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTIxIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJ1YzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGN4PSI2NzYuMjM2OSIgY3k9Ii0zODQuNjE1NiIgcng9IjM3LjE2MTYiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNjc2LjIzNjkiIHk9Ii0zODAuNDE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4weDBGQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaWUmIzQ1OyZndDt0cnVjIC0tPgorICAgICAgICA8IS0tIHRyaSYjNDU7Jmd0O3RyaWUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTIiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmkmIzQ1OyZndDt0cmllPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTQ4My4yNDU0LC00NjkuMjI0MUM0OTIuOTIxNiwtNDUxLjgwMTkgNTA1LjQ2MDQsLTQyOS4yMjU4IDUxNS4xNTE3LC00MTEuNzc2NSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjUxOC40MTA5LC00MTMuMTE2OCA1MjAuMjA2NiwtNDAyLjY3NTIgNTEyLjI5MTQsLTQwOS43MTggNTE4LjQxMDksLTQxMy4xMTY4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI1MDcuMDk0MiIgeT0iLTQzNi4yMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJ1IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTIwIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJ1PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgY3g9IjU4MC4yMzY5IiBjeT0iLTQ5Ni4yNDY5IiByeD0iMzguNjI2IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNTgwLjIzNjkiIHk9Ii01MDAuNDQ2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjU4MC4yMzY5IiB5PSItNDgzLjY0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+MHgwRkE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmkmIzQ1OyZndDt0cnUgLS0+CisgICAgICAgIDwhLS0gdHIgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTIiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzNTcuMjM2OSIgY3k9Ii02MDcuODc4MiIgcng9IjM3LjkwMjciIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNTcuMjM2OSIgeT0iLTYxMi4wNzgyIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPlNwYXJzZTwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM1Ny4yMzY5IiB5PSItNTk1LjI3ODIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwN0U8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyYSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U3IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmE8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZDNkM2QzIiBkPSJNMzIxLjg4NzIsLTU5Ny4yMTUzQzI5NS43MTQ0LC01ODguNzM3OSAyNTkuNTQzLC01NzUuNzgxNSAyMjkuNTIyMywtNTYwLjQ2MjYgMjA4LjI5NzEsLTU0OS42MzE4IDE4Ni4wNzM4LC01MzUuMDU0OCAxNjguMzMyMywtNTIyLjUyNjgiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNkM2QzZDMiIHN0cm9rZT0iI2QzZDNkMyIgcG9pbnRzPSIxNzAuMTc1NCwtNTE5LjU0MTggMTYwLjAwNjgsLTUxNi41NjY3IDE2Ni4xMDA3LC01MjUuMjMzNiAxNzAuMTc1NCwtNTE5LjU0MTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIzNS4wOTQyIiB5PSItNTQ3Ljg2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2QzZDNkMyI+IGE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyYSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJhPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTMxOS44MjA4LC02MDMuNzAzNUMyODMuODM1NCwtNTk4LjI5MTkgMjI5LjA3MjUsLTU4Ni4yODE2IDE4OC41MjIzLC01NjAuNDYyNiAxNzYuMzU5NCwtNTUyLjcxODIgMTY1LjQwNTgsLTU0MS40OTA2IDE1Ni41MTg0LC01MzAuNTgyMiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjE1MC4xMzkyLC01MjIuMzY1OCAxNTkuODI2MywtNTI3LjUwNDkgMTUzLjIwNTUsLTUyNi4zMTUyIDE1Ni4yNzE5LC01MzAuMjY0NiAxNTYuMjcxOSwtNTMwLjI2NDYgMTU2LjI3MTksLTUzMC4yNjQ2IDE1My4yMDU1LC01MjYuMzE1MiAxNTIuNzE3NCwtNTMzLjAyNDMgMTUwLjEzOTIsLTUyMi4zNjU4IDE1MC4xMzkyLC01MjIuMzY1OCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTk0LjA5NDIiIHk9Ii01NDcuODYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gYTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTkiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3RyZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0zNTcuMjM2OSwtNTc4LjI1NjJDMzU3LjIzNjksLTU2NS4zODgxIDM1Ny4yMzY5LC01NTAuMTE3OSAzNTcuMjM2OSwtNTM2LjI2MzEiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIzNjAuNzM3LC01MzYuMDA3NCAzNTcuMjM2OSwtNTI2LjAwNzQgMzUzLjczNywtNTM2LjAwNzQgMzYwLjczNywtNTM2LjAwNzQiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM2Mi4wOTQyIiB5PSItNTQ3Ljg2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyaSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJpPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTM4MC41MDYxLC01ODQuNDc2NkMzOTcuMDgyNSwtNTY3LjgwNiA0MTkuNTI5MSwtNTQ1LjIzMTggNDM3LjU2NzQsLTUyNy4wOTA4Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNDQwLjQyOTIsLTUyOS4xNzY3IDQ0NC45OTgzLC01MTkuNjE3NyA0MzUuNDY1NCwtNTI0LjI0MSA0NDAuNDI5MiwtNTI5LjE3NjciLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQyMy45MzIyIiB5PSItNTQ3Ljg2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGk8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNDkiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMzU1LjEzOTksLTYzNy4yODdDMzU0LjYwNSwtNjQ4LjIxNTkgMzU0LjI4MTYsLTY2MC43MjA1IDM1NC42ODQzLC02NzIuMDkzOSAzNTQuNzcwMywtNjc0LjUyNDIgMzU0Ljg4OSwtNjc3LjA0NTEgMzU1LjAyODMsLTY3OS41NzMzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMzU1LjY4NzUsLTY4OS43OTMxIDM1MC41NTMxLC02ODAuMTAzNSAzNTUuMzY1NiwtNjg0LjgwMzQgMzU1LjA0MzgsLTY3OS44MTM4IDM1NS4wNDM4LC02NzkuODEzOCAzNTUuMDQzOCwtNjc5LjgxMzggMzU1LjM2NTYsLTY4NC44MDM0IDM1OS41MzQ0LC02NzkuNTI0MSAzNTUuNjg3NSwtNjg5Ljc5MzEgMzU1LjY4NzUsLTY4OS43OTMxIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNzMuNTEzMiIgeT0iLTY1OS40OTM5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNmZjAwMDAiPjB4MDdFPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0cmEyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTMzIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmEyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgZD0iTTMzMy45MzIzLC01ODQuMjkxM0MzMjEuODQyNywtNTcyLjEwNzEgMzA2LjgwMjksLTU1Ny4wMyAyOTMuMjM2OSwtNTQzLjY2MjYgMjg3LjYwNDUsLTUzOC4xMTI3IDI4MS41NzU0LC01MzIuMjMwOSAyNzUuNzQsLTUyNi41NjgyIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMGZmIiBzdHJva2U9IiMwMDAwZmYiIHBvaW50cz0iMjc4LjExNTMsLTUyMy45OTYyIDI2OC40OTY2LC01MTkuNTU0MSAyNzMuMjQ1OCwtNTI5LjAyNDkgMjc4LjExNTMsLTUyMy45OTYyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMTQuMDk0MiIgeT0iLTU0Ny44NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBhPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0cnUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjIiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3RydTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0zODkuMTg3NCwtNTkxLjg4NDJDNDI4LjQ1NzMsLTU3Mi4yMjYxIDQ5NS4xOTY5LC01MzguODE3IDUzOC40ODk1LC01MTcuMTQ1MiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjU0Ny42MjA1LC01MTIuNTc0MyA1NDAuNjkyNywtNTIxLjA3NDcgNTQzLjE0OTQsLTUxNC44MTI1IDUzOC42NzgzLC01MTcuMDUwNyA1MzguNjc4MywtNTE3LjA1MDcgNTM4LjY3ODMsLTUxNy4wNTA3IDU0My4xNDk0LC01MTQuODEyNSA1MzYuNjY0LC01MTMuMDI2NyA1NDcuNjIwNSwtNTEyLjU3NDMgNTQ3LjYyMDUsLTUxMi41NzQzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0ODYuNDg2OSIgeT0iLTU0Ny44NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiB1PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0cnUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNDAiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3RydTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGQ9Ik0zOTMuMzk2NywtNTk5LjAxNjlDNDIyLjI1MzgsLTU5MS4xMzgzIDQ2My4xNzg4LC01NzguMTI2IDQ5Ni4yMzY5LC01NjAuNDYyNiA1MTQuMjY4OSwtNTUwLjgyNzggNTMyLjUxMDIsLTUzNy40MjE5IDU0Ny4zNjU1LC01MjUuMzQ5OSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDBmZiIgc3Ryb2tlPSIjMDAwMGZmIiBwb2ludHM9IjU0OS43ODQ1LC01MjcuODkwOCA1NTUuMjQ3MywtNTE4LjgxMjggNTQ1LjMxNTgsLTUyMi41MDI4IDU0OS43ODQ1LC01MjcuODkwOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNTI1LjQ4NjkiIHk9Ii01NDcuODYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gdTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHQmIzQ1OyZndDtyb290IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTUwIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dCYjNDU7Jmd0O3Jvb3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMzYyLjA4ODYsLTcyNi4yNzg2QzM2My4zODAyLC03MzEuOTQyNiAzNjQuNTk0MiwtNzM4LjIzODggMzY1LjIzNjksLTc0NC4wOTM5IDM2Ni4xMjQ3LC03NTIuMTgxNyAzNjUuODcsLTc2MC44MzI3IDM2NS4wNDgsLTc2OS4wODEiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIzNjMuNzQ2OSwtNzc5LjI0MDcgMzYwLjU1MzcsLTc2OC43NTAxIDM2NC4zODIxLC03NzQuMjgxMiAzNjUuMDE3MywtNzY5LjMyMTcgMzY1LjAxNzMsLTc2OS4zMjE3IDM2NS4wMTczLC03NjkuMzIxNyAzNjQuMzgyMSwtNzc0LjI4MTIgMzY5LjQ4MDgsLTc2OS44OTM0IDM2My43NDY5LC03NzkuMjQwNyAzNjMuNzQ2OSwtNzc5LjI0MDciLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM4NC45MDUyIiB5PSItNzQ4LjI5MzkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2ZmMDAwMCI+MHgwOUI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0JiM0NTsmZ3Q7dHIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnQmIzQ1OyZndDt0cjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0zNzguNzcyOSwtNjkzLjIzMDhDMzg1LjMyNDQsLTY4Ny40NjgyIDM5MS43MTc5LC02ODAuMjc1MSAzOTUuMjM2OSwtNjcyLjA5MzkgMzk4LjE4NzIsLTY2NS4yMzQ4IDM5Ny43MTE1LC02NjIuMzM4NSAzOTUuMjM2OSwtNjU1LjI5MzkgMzkzLjI2NTksLTY0OS42ODI4IDM5MC4zMjAyLC02NDQuMjQzNiAzODYuOTI0NywtNjM5LjE3MjciLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIzODkuNjQ2OSwtNjM2Ljk2NzcgMzgwLjg3ODIsLTYzMS4wMjExIDM4NC4wMjQ3LC02NDEuMTM4IDM4OS42NDY5LC02MzYuOTY3NyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDAyLjMxNzIiIHk9Ii02NTkuNDkzOSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gcjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHQmIzQ1OyZndDt0ciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnQmIzQ1OyZndDt0cjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0zNDAuMzI0LC02OTIuMDEzOEMzMzUuMzk5NSwtNjg2LjI1NDMgMzMwLjY1NDMsLTY3OS4zNzIyIDMyOC4wNzYzLC02NzIuMDkzOSAzMjQuNDgyNywtNjYxLjk0ODEgMzI2Ljc5NTQsLTY1MS4xOTgzIDMzMS4zODIsLTY0MS40NTU2Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMzM2LjM1NzYsLTYzMi40NzU4IDMzNS40NDcxLC02NDMuNDAzOCAzMzMuOTM0MiwtNjM2Ljg0OTMgMzMxLjUxMDksLTY0MS4yMjI4IDMzMS41MTA5LC02NDEuMjIyOCAzMzEuNTEwOSwtNjQxLjIyMjggMzMzLjkzNDIsLTYzNi44NDkzIDMyNy41NzQ3LC02MzkuMDQxOCAzMzYuMzU3NiwtNjMyLjQ3NTggMzM2LjM1NzYsLTYzMi40NzU4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMzIuMzE3MiIgeT0iLTY1OS40OTM5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdiYjNDU7Jmd0O3RyZWUgLS0+CisgICAgICAgIDwhLS0gdHJhdmUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTUiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGN4PSIyMDIuMjM2OSIgY3k9Ii0yODQuNCIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjAyLjIzNjkiIHk9Ii0yODAuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4weDBCOTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXYmIzQ1OyZndDt0cmF2ZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxOCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXYmIzQ1OyZndDt0cmF2ZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0xODEuNDY5MiwtMzU5LjQ0NzZDMTc2Ljk4MzMsLTM1Mi42MjgxIDE3Mi44ODE1LC0zNDQuOTcwNyAxNzAuNTIyMywtMzM3LjIgMTY4LjM1MzEsLTMzMC4wNTU0IDE2Ny44ODQzLC0zMjcuMzg1MSAxNzAuNTIyMywtMzIwLjQgMTcyLjE1NTUsLTMxNi4wNzUzIDE3NC41NzEyLC0zMTEuOTMzOCAxNzcuMzUzMywtMzA4LjA5OTIiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIxODMuODY3NiwtMzAwLjI0MzEgMTgwLjk0ODUsLTMxMC44MTM0IDE4MC42NzYxLC0zMDQuMDkyMSAxNzcuNDg0NSwtMzA3Ljk0MSAxNzcuNDg0NSwtMzA3Ljk0MSAxNzcuNDg0NSwtMzA3Ljk0MSAxODAuNjc2MSwtMzA0LjA5MjEgMTc0LjAyMDUsLTMwNS4wNjg2IDE4My44Njc2LC0zMDAuMjQzMSAxODMuODY3NiwtMzAwLjI0MzEiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE3Ni4wOTQyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2JiM0NTsmZ3Q7dHJhdmUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMzYiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2JiM0NTsmZ3Q7dHJhdmU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBkPSJNMjAyLjIzNjksLTM1NS4wODk3QzIwMi4yMzY5LC0zNDEuNjA0NiAyMDIuMjM2OSwtMzI1LjcxMjMgMjAyLjIzNjksLTMxMi40MTUzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMGZmIiBzdHJva2U9IiMwMDAwZmYiIHBvaW50cz0iMjA1LjczNywtMzEyLjQwMzMgMjAyLjIzNjksLTMwMi40MDMzIDE5OC43MzcsLTMxMi40MDM0IDIwNS43MzcsLTMxMi40MDMzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDcuMDk0MiIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdiYjNDU7Jmd0O3RyYTIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNDciIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2JiM0NTsmZ3Q7dHJhMjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0yMTMuMDE2MywtNDEyLjkzODhDMjE1LjQwMDIsLTQxOS4yMjI4IDIxNy45MDksLTQyNS44NTE0IDIyMC4yMzY5LC00MzIuMDMxMyAyMjMuNDM3NSwtNDQwLjUyODIgMjI2Ljg2MTksLTQ0OS42NjM2IDIzMC4wOTI0LC00NTguMzAyNSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjIzMy42MzUyLC00NjcuNzg0NSAyMjUuOTE5NywtNDU5Ljk5MiAyMzEuODg1MSwtNDYzLjEwMDcgMjMwLjEzNTEsLTQ1OC40MTcgMjMwLjEzNTEsLTQ1OC40MTcgMjMwLjEzNTEsLTQ1OC40MTcgMjMxLjg4NTEsLTQ2My4xMDA3IDIzNC4zNTA1LC00NTYuODQxOSAyMzMuNjM1MiwtNDY3Ljc4NDUgMjMzLjYzNTIsLTQ2Ny43ODQ1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNDQuOTA1MiIgeT0iLTQzNi4yMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNmZjAwMDAiPjB4MEI4PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmUmIzQ1OyZndDt0cmF2IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTQ2IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmUmIzQ1OyZndDt0cmF2PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTIwOC45MDI0LC0zMDIuNDcyMkMyMTAuNjc4MiwtMzA4LjEzMTcgMjEyLjM0ODcsLTMxNC40NTM1IDIxMy4yMzY5LC0zMjAuNCAyMTQuNDcyNCwtMzI4LjY3MTMgMjE0LjA3NjYsLTMzNy41MjEzIDIxMi44ODg4LC0zNDUuOTI2Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMjExLjEwMzYsLTM1NS44ODggMjA4LjQzODIsLTM0NS4yNTA5IDIxMS45ODU2LC0zNTAuOTY2NCAyMTIuODY3NiwtMzQ2LjA0NDggMjEyLjg2NzYsLTM0Ni4wNDQ4IDIxMi44Njc2LC0zNDYuMDQ0OCAyMTEuOTg1NiwtMzUwLjk2NjQgMjE3LjI5NywtMzQ2LjgzODYgMjExLjEwMzYsLTM1NS44ODggMjExLjEwMzYsLTM1NS44ODgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIzMi45MDUyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2ZmMDAwMCI+MHgwQjk8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZXIgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTYiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXI8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBjeD0iMjAyLjIzNjkiIGN5PSItMTk1LjYiIHJ4PSIzOC44NjcxIiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwMi4yMzY5IiB5PSItMTkxLjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+MHgwQkE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZSYjNDU7Jmd0O3RyYXZlciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxOSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlJiM0NTsmZ3Q7dHJhdmVyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTE4NS4zMjQsLTI2OC4zMkMxODAuMzk5NSwtMjYyLjU2MDUgMTc1LjY1NDMsLTI1NS42Nzg0IDE3My4wNzYzLC0yNDguNCAxNzAuNTgzNCwtMjQxLjM2MTggMTcwLjU4MzQsLTIzOC42MzgyIDE3My4wNzYzLC0yMzEuNiAxNzQuNDk2MiwtMjI3LjU5MTIgMTc2LjU3MzUsLTIyMy43MDI2IDE3OC45NzYyLC0yMjAuMDU1NiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjE4NS4wMTY0LC0yMTIuMDQxNSAxODIuNTkxMSwtMjIyLjczNTggMTgyLjAwNywtMjE2LjAzNDQgMTc4Ljk5NzUsLTIyMC4wMjczIDE3OC45OTc1LC0yMjAuMDI3MyAxNzguOTk3NSwtMjIwLjAyNzMgMTgyLjAwNywtMjE2LjAzNDQgMTc1LjQwMzksLTIxNy4zMTg4IDE4NS4wMTY0LC0yMTIuMDQxNSAxODUuMDE2NCwtMjEyLjA0MTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE3Ny4zMTcyIiB5PSItMjM1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZSYjNDU7Jmd0O3RyYXZlciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UzNyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlJiM0NTsmZ3Q7dHJhdmVyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgZD0iTTIwMi4yMzY5LC0yNjYuMDAwNkMyMDIuMjM2OSwtMjUzLjg5NDkgMjAyLjIzNjksLTIzNy44MDc2IDIwMi4yMzY5LC0yMjQuMDY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDBmZiIgc3Ryb2tlPSIjMDAwMGZmIiBwb2ludHM9IjIwNS43MzcsLTIyMy42NzIgMjAyLjIzNjksLTIxMy42NzIgMTk4LjczNywtMjIzLjY3MjEgMjA1LjczNywtMjIzLjY3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjA2LjMxNzIiIHk9Ii0yMzUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gcjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlciYjNDU7Jmd0O3RyYXZlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTQ1IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVyJiM0NTsmZ3Q7dHJhdmU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMjA3LjY5MzcsLTIxMy43NTA5QzIwOS4xNDY3LC0yMTkuNDEzNiAyMTAuNTEyNywtMjI1LjcxNzQgMjExLjIzNjksLTIzMS42IDIxMi4xNDkyLC0yMzkuMDEwNyAyMTIuMTQ5MiwtMjQwLjk4OTMgMjExLjIzNjksLTI0OC40IDIxMC45MjAxLC0yNTAuOTczNiAyMTAuNDgwNCwtMjUzLjYyNzkgMjA5Ljk2NDMsLTI1Ni4yNzM4Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMjA3LjY5MzcsLTI2Ni4yNDkxIDIwNS41MjU1LC0yNTUuNDk5NyAyMDguODAzNSwtMjYxLjM3MzggMjA5LjkxMzIsLTI1Ni40OTg1IDIwOS45MTMyLC0yNTYuNDk4NSAyMDkuOTEzMiwtMjU2LjQ5ODUgMjA4LjgwMzUsLTI2MS4zNzM4IDIxNC4zMDEsLTI1Ny40OTczIDIwNy42OTM3LC0yNjYuMjQ5MSAyMDcuNjkzNywtMjY2LjI0OTEiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIzMi40NTg1IiB5PSItMjM1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2ZmMDAwMCI+MHgwQkE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZXJzIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTE3IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVyczwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGN4PSIyMDMuMjM2OSIgY3k9Ii0xMDYuOCIgcng9IjM4LjMwNSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDMuMjM2OSIgeT0iLTEwMi42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPjB4MEJCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmVyJiM0NTsmZ3Q7dHJhdmVycyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyMCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlciYjNDU7Jmd0O3RyYXZlcnM8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMTgzLjk4NTQsLTE3OS42NjU4QzE3NC42OTY1LC0xNjkuNTM5NyAxNjYuMzEzNywtMTU1LjkxMTYgMTcxLjI5MjMsLTE0Mi44IDE3Mi45Mzg1LC0xMzguNDY0NSAxNzUuMzcyMywtMTM0LjMxNjkgMTc4LjE3NDksLTEzMC40NzkzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMTg0LjczNjcsLTEyMi42MjEzIDE4MS43ODEyLC0xMzMuMTgxNCAxODEuNTMxOSwtMTI2LjQ1OTIgMTc4LjMyNzEsLTEzMC4yOTcxIDE3OC4zMjcxLC0xMzAuMjk3MSAxNzguMzI3MSwtMTMwLjI5NzEgMTgxLjUzMTksLTEyNi40NTkyIDE3NC44NzMsLTEyNy40MTI4IDE4NC43MzY3LC0xMjIuNjIxMyAxODQuNzM2NywtMTIyLjYyMTMiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE3Ni43MDkyIiB5PSItMTQ3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiBzPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmVyJiM0NTsmZ3Q7dHJhdmVycyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UzOCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlciYjNDU7Jmd0O3RyYXZlcnM8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBkPSJNMjAyLjQ0NDEsLTE3Ny4yMDA2QzIwMi41ODA0LC0xNjUuMDk0OSAyMDIuNzYxNiwtMTQ5LjAwNzYgMjAyLjkxNjMsLTEzNS4yNjc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMGZmIiBzdHJva2U9IiMwMDAwZmYiIHBvaW50cz0iMjA2LjQyMDUsLTEzNC45MTA4IDIwMy4wMzM0LC0xMjQuODcyIDE5OS40MjA5LC0xMzQuODMxOSAyMDYuNDIwNSwtMTM0LjkxMDgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwNy43MDkyIiB5PSItMTQ3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBzPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmVycyYjNDU7Jmd0O3RyYXZlciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U0NCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlcnMmIzQ1OyZndDt0cmF2ZXI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMjA5LjA2NjYsLTEyNC44Mzc2QzIxMS42NjM4LC0xMzUuMDE4NiAyMTMuODE5MywtMTQ3Ljk5MDggMjEyLjIzNjksLTE1OS42IDIxMS44NzE3LC0xNjIuMjc5MyAyMTEuMzYwMiwtMTY1LjA0MDcgMjEwLjc1OTksLTE2Ny43ODYzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMjA4LjI5ODMsLTE3Ny40ODY2IDIwNi4zOTYzLC0xNjYuNjg2OSAyMDkuNTI4MiwtMTcyLjY0MDIgMjEwLjc1OCwtMTY3Ljc5MzggMjEwLjc1OCwtMTY3Ljc5MzggMjEwLjc1OCwtMTY3Ljc5MzggMjA5LjUyODIsLTE3Mi42NDAyIDIxNS4xMTk4LC0xNjguOTAwNyAyMDguMjk4MywtMTc3LjQ4NjYgMjA4LjI5ODMsLTE3Ny40ODY2Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMzMuMDczNSIgeT0iLTE0NyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj4weDBCQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlcnNlIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTE4IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVyc2U8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBjeD0iMjAzLjIzNjkiIGN5PSItMTgiIHJ4PSI3My40NzQ1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwMy4yMzY5IiB5PSItMTMuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj5jb250ZW50QXJyYXlbM108L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZXJzJiM0NTsmZ3Q7dHJhdmVyc2UgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjEiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXJzJiM0NTsmZ3Q7dHJhdmVyc2U8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMTg0Ljg2NzYsLTkwLjk1NjlDMTc5LjUxMzUsLTg1LjIxMzIgMTc0LjM0NzQsLTc4LjI4MDUgMTcxLjUyMjMsLTcwLjggMTY4Ljg4NDMsLTYzLjgxNDkgMTY4Ljg4NDMsLTYwLjk4NTEgMTcxLjUyMjMsLTU0IDE3Mi44NjY4LC01MC40Mzk5IDE3NC43NDE1LC00Ny4wMDQgMTc2LjkxNDQsLTQzLjc2MTIiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIxODMuMjAzLC0zNS42NzYgMTgwLjYxNTUsLTQ2LjMzMjMgMTgwLjEzMzIsLTM5LjYyMjcgMTc3LjA2MzQsLTQzLjU2OTUgMTc3LjA2MzQsLTQzLjU2OTUgMTc3LjA2MzQsLTQzLjU2OTUgMTgwLjEzMzIsLTM5LjYyMjcgMTczLjUxMTQsLTQwLjgwNjcgMTgzLjIwMywtMzUuNjc2IDE4My4yMDMsLTM1LjY3NiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTc3LjA5NDIiIHk9Ii01OC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmVycyYjNDU7Jmd0O3RyYXZlcnNlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTM5IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVycyYjNDU7Jmd0O3RyYXZlcnNlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgZD0iTTIwMy4yMzY5LC04OC40MDA2QzIwMy4yMzY5LC03Ni4yOTQ5IDIwMy4yMzY5LC02MC4yMDc2IDIwMy4yMzY5LC00Ni40Njc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMGZmIiBzdHJva2U9IiMwMDAwZmYiIHBvaW50cz0iMjA2LjczNywtNDYuMDcyIDIwMy4yMzY5LC0zNi4wNzIgMTk5LjczNywtNDYuMDcyMSAyMDYuNzM3LC00Ni4wNzIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwOC4wOTQyIiB5PSItNTguMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlcnNlJiM0NTsmZ3Q7dHJhdmVycyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U0MyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlcnNlJiM0NTsmZ3Q7dHJhdmVyczwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0yMDkuOTAyNCwtMzYuMDcyMkMyMTEuNjc4MiwtNDEuNzMxNyAyMTMuMzQ4NywtNDguMDUzNSAyMTQuMjM2OSwtNTQgMjE1LjMzOTksLTYxLjM4NDcgMjE1LjMzOTksLTYzLjQxNTMgMjE0LjIzNjksLTcwLjggMjEzLjgzNDQsLTczLjQ5NDUgMjEzLjI3MTMsLTc2LjI2NjEgMjEyLjYxMDYsLTc5LjAxODEiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIyMDkuOTAyNCwtODguNzI3OCAyMDguMjU0NiwtNzcuODg2NCAyMTEuMjQ1OCwtODMuOTExNiAyMTIuNTg5MSwtNzkuMDk1NCAyMTIuNTg5MSwtNzkuMDk1NCAyMTIuNTg5MSwtNzkuMDk1NCAyMTEuMjQ1OCwtODMuOTExNiAyMTYuOTIzNywtODAuMzA0NCAyMDkuOTAyNCwtODguNzI3OCAyMDkuOTAyNCwtODguNzI3OCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjI0LjI3MzIiIHk9Ii01OC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNmZjAwMDAiPiB+MzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYTImIzQ1OyZndDt0cmFjIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTM0IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhMiYjNDU7Jmd0O3RyYWM8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBkPSJNMjE2LjAyMywtNDc1LjI0OTlDMTg5LjIyMDcsLTQ1NS4zMDM0IDE0OS4xNDU2LC00MjUuNDc5MiAxMjIuMzY5OSwtNDA1LjU1MjUiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwZmYiIHN0cm9rZT0iIzAwMDBmZiIgcG9pbnRzPSIxMjQuMjg5NCwtNDAyLjYxODEgMTE0LjE3NzUsLTM5OS40NTU2IDEyMC4xMTAyLC00MDguMjMzNyAxMjQuMjg5NCwtNDAyLjYxODEiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE4My4wOTQyIiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmEyJiM0NTsmZ3Q7dHJlIC0tPgorICAgICAgICA8IS0tIHRyYTImIzQ1OyZndDt0ciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U0OCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYTImIzQ1OyZndDt0cjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0yNDAuNDk0NCwtNTI1LjYzMDVDMjQwLjQ3ODksLTUzNy40MTkgMjQyLjQ5OCwtNTUwLjUzNDQgMjQ5LjU3NzcsLTU2MC40NjI2IDI2My43Njc5LC01ODAuMzYyMiAyODguMjE3NiwtNTkyLjAxODYgMzEwLjIzMzgsLTU5OC43ODk5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMzIwLjEzMjYsLTYwMS41Njk0IDMwOS4yODgzLC02MDMuMTk4NCAzMTUuMzE4NywtNjAwLjIxNzcgMzEwLjUwNDksLTU5OC44NjYgMzEwLjUwNDksLTU5OC44NjYgMzEwLjUwNDksLTU5OC44NjYgMzE1LjMxODcsLTYwMC4yMTc3IDMxMS43MjE0LC01OTQuNTMzNSAzMjAuMTMyNiwtNjAxLjU2OTQgMzIwLjEzMjYsLTYwMS41Njk0Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNzAuMDY2NSIgeT0iLTU0Ny44NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNmZjAwMDAiPjB4MERFPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhMiYjNDU7Jmd0O3RyYXYgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMzUiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmEyJiM0NTsmZ3Q7dHJhdjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGQ9Ik0yMjIuNjU5LC00NzEuNTgyM0MyMTcuNjM1LC00NjQuNjM4NyAyMTIuODUwMywtNDU2Ljc5NTkgMjA5LjczNjksLTQ0OC44MzEzIDIwNi43MTU0LC00NDEuMTAxOSAyMDQuODEzNiwtNDMyLjQ4MDYgMjAzLjYzNjgsLTQyNC4xMjc1Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMGZmIiBzdHJva2U9IiMwMDAwZmYiIHBvaW50cz0iMjA3LjExMTUsLTQyMy43MDQ1IDIwMi41MzQ0LC00MTQuMTQ5NCAyMDAuMTUzOCwtNDI0LjQ3MzMgMjA3LjExMTUsLTQyMy43MDQ1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTUuNDg2OSIgeT0iLTQzNi4yMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiB2PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJ1JiM0NTsmZ3Q7dHIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNTQiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cnUmIzQ1OyZndDt0cjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik01NjYuNTg0MiwtNTI0LjA4OEM1NTguOTkzNiwtNTM2Ljg5ODUgNTQ4LjQwNDEsLTU1MS4yNjA4IDUzNS4yMzY5LC01NjAuNDYyNiA0OTYuNjU5OCwtNTg3LjQyMTcgNDQzLjYxMywtNTk5LjA1NDYgNDA1LjQ4MSwtNjA0LjA3MyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjM5NS4xNDU3LC02MDUuMzIwMyA0MDQuNTM0NCwtNTk5LjY1NDUgNDAwLjEwOTcsLTYwNC43MjEyIDQwNS4wNzM2LC02MDQuMTIyMSA0MDUuMDczNiwtNjA0LjEyMjEgNDA1LjA3MzYsLTYwNC4xMjIxIDQwMC4xMDk3LC02MDQuNzIxMiA0MDUuNjEyOCwtNjA4LjU4OTcgMzk1LjE0NTcsLTYwNS4zMjAzIDM5NS4xNDU3LC02MDUuMzIwMyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNTcxLjY4MTUiIHk9Ii01NDcuODYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj4weDBGQTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRydSYjNDU7Jmd0O3RydWMgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cnUmIzQ1OyZndDt0cnVjPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTU4NC45MDYsLTQ2Ny4wMTE3QzU4Ny44ODcyLC00NTUuMjQ3IDU5Mi43MjI1LC00NDIuMTA5NCA2MDAuNTIyMywtNDMyLjAzMTMgNjEwLjU2NzQsLTQxOS4wNTE5IDYyNS4yNDUxLC00MDguNzAxMSA2MzkuMDA5MiwtNDAxLjAyMzUiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSI2NDcuODY0NCwtMzk2LjM2MzUgNjQxLjExMDYsLTQwNS4wMDI4IDY0My40Mzk3LC0zOTguNjkyIDYzOS4wMTQ5LC00MDEuMDIwNSA2MzkuMDE0OSwtNDAxLjAyMDUgNjM5LjAxNDksLTQwMS4wMjA1IDY0My40Mzk3LC0zOTguNjkyIDYzNi45MTkzLC0zOTcuMDM4MyA2NDcuODY0NCwtMzk2LjM2MzUgNjQ3Ljg2NDQsLTM5Ni4zNjM1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2MDUuMDk0MiIgeT0iLTQzNi4yMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiBjPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJ1JiM0NTsmZ3Q7dHJ1YyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U0MSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRydSYjNDU7Jmd0O3RydWM8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBkPSJNNjAxLjU0MjQsLTQ3MS40NzIzQzYxNy41MTc3LC00NTIuODk1OCA2MzkuMjc3NCwtNDI3LjU5MzEgNjU1LjE4OTgsLTQwOS4wODk3Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMGZmIiBzdHJva2U9IiMwMDAwZmYiIHBvaW50cz0iNjU3Ljk2NTYsLTQxMS4yMjk4IDY2MS44MzIzLC00MDEuMzY1NyA2NTIuNjU4MywtNDA2LjY2NTYgNjU3Ljk2NTYsLTQxMS4yMjk4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2MzguMDk0MiIgeT0iLTQzNi4yMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBjPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJ1YyYjNDU7Jmd0O3RydSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U1MyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRydWMmIzQ1OyZndDt0cnU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNNjcwLjk3MzEsLTQwMi42NDYyQzY2Ni4zMjYzLC00MTYuMzYyNSA2NTguNTIxMywtNDM1LjE0NjQgNjQ3LjIzNjksLTQ0OC44MzEzIDYzOS42NjQxLC00NTguMDE1IDYyOS44OTk5LC00NjYuMjUzOCA2MjAuMTgwNiwtNDczLjE4NjUiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSI2MTEuNzA3MSwtNDc4LjkzMzYgNjE3LjQ1NzIsLTQ2OS41OTYyIDYxNS44NDUyLC00NzYuMTI3IDYxOS45ODMyLC00NzMuMzIwNCA2MTkuOTgzMiwtNDczLjMyMDQgNjE5Ljk4MzIsLTQ3My4zMjA0IDYxNS44NDUyLC00NzYuMTI3IDYyMi41MDkxLC00NzcuMDQ0NiA2MTEuNzA3MSwtNDc4LjkzMzYgNjExLjcwNzEsLTQ3OC45MzM2Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2NzYuMjk2NSIgeT0iLTQzNi4yMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNmZjAwMDAiPjB4MEZCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJ1Y2sgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMjIiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cnVjazwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGN4PSI2NzYuMjM2OSIgY3k9Ii0yODQuNCIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNjc2LjIzNjkiIHk9Ii0yODAuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj5jb250ZW50QXJyYXlbNF08L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cnVjJiM0NTsmZ3Q7dHJ1Y2sgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjQiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cnVjJiM0NTsmZ3Q7dHJ1Y2s8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNNjYxLjEyNDcsLTM2Ny45NDE2QzY1NC4zOTkzLC0zNTkuNDAxOCA2NDcuMjIyLC0zNDguNDQ4OSA2NDMuNzM2OSwtMzM3LjIgNjQxLjUyNzIsLTMzMC4wNjc4IDY0MS4wNTY1LC0zMjcuMzY5IDY0My43MzY5LC0zMjAuNCA2NDUuMTU4NSwtMzE2LjcwMzkgNjQ3LjE1NDcsLTMxMy4xNTA3IDY0OS40NjYzLC0zMDkuODEyOSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjY1NS43MTQ4LC0zMDIuMDAwMiA2NTIuOTgzMSwtMzEyLjYyMDQgNjUyLjU5MTgsLTMwNS45MDQ5IDY0OS40Njg5LC0zMDkuODA5NyA2NDkuNDY4OSwtMzA5LjgwOTcgNjQ5LjQ2ODksLTMwOS44MDk3IDY1Mi41OTE4LC0zMDUuOTA0OSA2NDUuOTU0NiwtMzA2Ljk5OSA2NTUuNzE0OCwtMzAyLjAwMDIgNjU1LjcxNDgsLTMwMi4wMDAyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2NDguNDg2OSIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiBrPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJ1YyYjNDU7Jmd0O3RydWNrIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTQyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJ1YyYjNDU7Jmd0O3RydWNrPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgZD0iTTY3Ni4yMzY5LC0zNjYuMjM0NUM2NzYuMjM2OSwtMzUxLjI2MDMgNjc2LjIzNjksLTMyOS44NjQzIDY3Ni4yMzY5LC0zMTIuNzA1NSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDBmZiIgc3Ryb2tlPSIjMDAwMGZmIiBwb2ludHM9IjY3OS43MzcsLTMxMi42NjQ1IDY3Ni4yMzY5LC0zMDIuNjY0NiA2NzIuNzM3LC0zMTIuNjY0NiA2NzkuNzM3LC0zMTIuNjY0NSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNjgxLjQ4NjkiIHk9Ii0zMjQuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gazwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRydWNrJiM0NTsmZ3Q7dHJ1YyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U1MiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRydWNrJiM0NTsmZ3Q7dHJ1YzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik02ODMuNTA2MSwtMzAyLjQyNzVDNjg1LjQ0MzIsLTMwOC4wODUyIDY4Ny4yNjYsLTMxNC40MTcyIDY4OC4yMzY5LC0zMjAuNCA2OTAuMTg0MiwtMzMyLjM5OTcgNjg4LjM5NzEsLTM0NS42MDg2IDY4NS42NjE0LC0zNTYuOTEwMyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjY4Mi45NjIzLC0zNjYuNjYzOSA2ODEuMjkyNCwtMzU1LjgyNTkgNjg0LjI5NTgsLTM2MS44NDUgNjg1LjYyOTQsLTM1Ny4wMjYxIDY4NS42Mjk0LC0zNTcuMDI2MSA2ODUuNjI5NCwtMzU3LjAyNjEgNjg0LjI5NTgsLTM2MS44NDUgNjg5Ljk2NjQsLTM1OC4yMjYzIDY4Mi45NjIzLC0zNjYuNjYzOSA2ODIuOTYyMywtMzY2LjY2MzkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjY5NS41MjMyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2ZmMDAwMCI+fjQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC5nMS5zdmcgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQuZzEuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0M2IzMjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQuZzEuc3ZnCkBAIC0wLDAgKzEsNzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIgorICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KKzwhLS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gR2VuZXJhdGVkIGJ5IGdyYXBodml6IHZlcnNpb24gMi40MC4xICgyMDE2MTIyNS4wMzA0KQorIC0tPgorPCEtLSBUaXRsZTogRyBQYWdlczogMSAtLT4KKzxzdmcgd2lkdGg9IjE1NHB0IiBoZWlnaHQ9IjMxMHB0IgorICAgICB2aWV3Qm94PSIwLjAwIDAuMDAgMTU0LjQ3IDMxMC40MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CisgICAgPGcgaWQ9ImdyYXBoMCIgY2xhc3M9ImdyYXBoIiB0cmFuc2Zvcm09InNjYWxlKDEgMSkgcm90YXRlKDApIHRyYW5zbGF0ZSg0IDMwNi40KSI+CisgICAgICAgIDx0aXRsZT5HPC90aXRsZT4KKyAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSJ0cmFuc3BhcmVudCIgcG9pbnRzPSItNCw0IC00LC0zMDYuNCAxNTAuNDczOCwtMzA2LjQgMTUwLjQ3MzgsNCAtNCw0Ii8+CisgICAgICAgIDwhLS0gMHgxM0IgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4MTNCPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjczLjIzNjkiIGN5PSItMTA2LjgiIHJ4PSIzNi41ODI0IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjczLjIzNjkiIHk9Ii0xMDIuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDEzQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIGNvbnRlbnRBcnJheVswXSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUyIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+Y29udGVudEFycmF5WzBdPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjczLjIzNjkiIGN5PSItMTgiIHJ4PSI3My40NzQ1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjczLjIzNjkiIHk9Ii0xMy44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVswXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4MTNCJiM0NTsmZ3Q7Y29udGVudEFycmF5WzBdIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTEiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDEzQiYjNDU7Jmd0O2NvbnRlbnRBcnJheVswXTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik03My4yMzY5LC04OC40MDA2QzczLjIzNjksLTc2LjI5NDkgNzMuMjM2OSwtNjAuMjA3NiA3My4yMzY5LC00Ni40Njc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNzYuNzM3LC00Ni4wNzIgNzMuMjM2OSwtMzYuMDcyIDY5LjczNywtNDYuMDcyMSA3Ni43MzcsLTQ2LjA3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iODEuNzkwMiIgeT0iLTU4LjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwO0E8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDEzQSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUzIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+MHgxM0E8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii0xOTUuNiIgcng9IjM3LjE0NDMiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzMuMjM2OSIgeT0iLTE5MS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MTNBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHgxM0EmIzQ1OyZndDsweDEzQiAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHgxM0EmIzQ1OyZndDsweDEzQjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik03My4yMzY5LC0xNzcuMjAwNkM3My4yMzY5LC0xNjUuMDk0OSA3My4yMzY5LC0xNDkuMDA3NiA3My4yMzY5LC0xMzUuMjY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9Ijc2LjczNywtMTM0Ljg3MiA3My4yMzY5LC0xMjQuODcyIDY5LjczNywtMTM0Ljg3MjEgNzYuNzM3LC0xMzQuODcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI4MS40MDUyIiB5PSItMTQ3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDtIPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHgxMzkgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4MTM5PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjczLjIzNjkiIGN5PSItMjg0LjQiIHJ4PSIzNS4zNTg3IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjczLjIzNjkiIHk9Ii0yODAuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDEzOTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4MTM5JiM0NTsmZ3Q7MHgxM0EgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4MTM5JiM0NTsmZ3Q7MHgxM0E8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNNzMuMjM2OSwtMjY2LjAwMDZDNzMuMjM2OSwtMjUzLjg5NDkgNzMuMjM2OSwtMjM3LjgwNzYgNzMuMjM2OSwtMjI0LjA2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI3Ni43MzcsLTIyMy42NzIgNzMuMjM2OSwtMjEzLjY3MiA2OS43MzcsLTIyMy42NzIxIDc2LjczNywtMjIzLjY3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iODEuNDA1MiIgeT0iLTIzNS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDtDPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQuZzIuc3ZnIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLmcyLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWM3ZWVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLmcyLnN2ZwpAQCAtMCwwICsxLDExNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iCisgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgorPCEtLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBHZW5lcmF0ZWQgYnkgZ3JhcGh2aXogdmVyc2lvbiAyLjQwLjEgKDIwMTYxMjI1LjAzMDQpCitzdHJpY3QgZGlncmFwaCBHIHsKKyAgIjB4MTM5IiBbY29sb3I9Z3JleSxmb250Y29sb3I9Z3JleV07CisKKyAgIjB4MTNCIiAtPiAiY29udGVudEFycmF5WzBdIiBbbGFiZWw9IiAgQSJdOworICAiMHgxM0EiIC0+ICIweDEzQiIgW2xhYmVsPSIgIEgiXTsKKyAgIjB4MTM5IiAtPiAiMHgxM0EiIFtsYWJlbD0iICBDIixjb2xvcj0iZ3JleSIsZm9udGNvbG9yPSJncmV5Il07CisKKyAgIjB4MjVFIiAtPiAiMHgyMzgiIFtsYWJlbD0iICBBIl07CisgICIweDI1RSIgLT4gIjB4MTNBIiBbbGFiZWw9IiAgQyJdOworLy8gICAiMHgyNUUiIC0+ICIweDMzQiIgW2xhYmVsPSIgIDUiXTsKKy8vICAgIjB4MjVFIiAtPiAiMHgzNUMiIFtsYWJlbD0iICBCIl07CisvLyAgICIweDI1RSIgLT4gIjB4MzdBIiBbbGFiZWw9IiAgUCJdOworLy8gICAiMHgyNUUiIC0+ICIweDQxQiIgW2xhYmVsPSIgIDMiXTsKK30KKyAtLT4KKzwhLS0gVGl0bGU6IEcgUGFnZXM6IDEgLS0+Cis8c3ZnIHdpZHRoPSIyMDdwdCIgaGVpZ2h0PSIzMTBwdCIKKyAgICAgdmlld0JveD0iMC4wMCAwLjAwIDIwNy40OSAzMTAuNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgorICAgIDxnIGlkPSJncmFwaDAiIGNsYXNzPSJncmFwaCIgdHJhbnNmb3JtPSJzY2FsZSgxIDEpIHJvdGF0ZSgwKSB0cmFuc2xhdGUoNCAzMDYuNCkiPgorICAgICAgICA8dGl0bGU+RzwvdGl0bGU+CisgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0idHJhbnNwYXJlbnQiIHBvaW50cz0iLTQsNCAtNCwtMzA2LjQgMjAzLjQ4NjcsLTMwNi40IDIwMy40ODY3LDQgLTQsNCIvPgorICAgICAgICA8IS0tIDB4MTM5IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDEzOTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiNjMGMwYzAiIGN4PSI3My4yMzY5IiBjeT0iLTI4NC40IiByeD0iMzUuMzU4NyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3My4yMzY5IiB5PSItMjgwLjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2MwYzBjMCI+MHgxMzk8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDEzQSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU0IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+MHgxM0E8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii0xOTUuNiIgcng9IjM3LjE0NDMiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzMuMjM2OSIgeT0iLTE5MS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MTNBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHgxMzkmIzQ1OyZndDsweDEzQSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UzIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHgxMzkmIzQ1OyZndDsweDEzQTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNjMGMwYzAiIGQ9Ik03My4yMzY5LC0yNjYuMDAwNkM3My4yMzY5LC0yNTMuODk0OSA3My4yMzY5LC0yMzcuODA3NiA3My4yMzY5LC0yMjQuMDY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2MwYzBjMCIgc3Ryb2tlPSIjYzBjMGMwIiBwb2ludHM9Ijc2LjczNywtMjIzLjY3MiA3My4yMzY5LC0yMTMuNjcyIDY5LjczNywtMjIzLjY3MjEgNzYuNzM3LC0yMjMuNjcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI4MS40MDUyIiB5PSItMjM1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2MwYzBjMCI+ICYjMTYwO0M8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDEzQiAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUyIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+MHgxM0I8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii0xMDYuOCIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzMuMjM2OSIgeT0iLTEwMi42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MTNCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gY29udGVudEFycmF5WzBdIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTMiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT5jb250ZW50QXJyYXlbMF08L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii0xOCIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzMuMjM2OSIgeT0iLTEzLjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzBdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHgxM0ImIzQ1OyZndDtjb250ZW50QXJyYXlbMF0gLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4MTNCJiM0NTsmZ3Q7Y29udGVudEFycmF5WzBdPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTczLjIzNjksLTg4LjQwMDZDNzMuMjM2OSwtNzYuMjk0OSA3My4yMzY5LC02MC4yMDc2IDczLjIzNjksLTQ2LjQ2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI3Ni43MzcsLTQ2LjA3MiA3My4yMzY5LC0zNi4wNzIgNjkuNzM3LC00Ni4wNzIxIDc2LjczNywtNDYuMDcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI4MS43OTAyIiB5PSItNTguMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gJiMxNjA7QTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4MTNBJiM0NTsmZ3Q7MHgxM0IgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4MTNBJiM0NTsmZ3Q7MHgxM0I8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNNzMuMjM2OSwtMTc3LjIwMDZDNzMuMjM2OSwtMTY1LjA5NDkgNzMuMjM2OSwtMTQ5LjAwNzYgNzMuMjM2OSwtMTM1LjI2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI3Ni43MzcsLTEzNC44NzIgNzMuMjM2OSwtMTI0Ljg3MiA2OS43MzcsLTEzNC44NzIxIDc2LjczNywtMTM0Ljg3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iODEuNDA1MiIgeT0iLTE0NyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gJiMxNjA7SDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4MjVFIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTUiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDI1RTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIxNjMuMjM2OSIgY3k9Ii0yODQuNCIgcng9IjM2LjUwMTQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTYzLjIzNjkiIHk9Ii0yODAuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDI1RTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4MjVFJiM0NTsmZ3Q7MHgxM0EgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4MjVFJiM0NTsmZ3Q7MHgxM0E8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMTQ2LjcyOTUsLTI2OC4xMTI3QzEzMi43NzQyLC0yNTQuMzQzNSAxMTIuNjA4MywtMjM0LjQ0NjUgOTYuOTI5MywtMjE4Ljk3NjUiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI5OS4yMTYyLC0yMTYuMzE2MSA4OS42Mzk2LC0yMTEuNzg0IDk0LjI5OTgsLTIyMS4yOTkgOTkuMjE2MiwtMjE2LjMxNjEiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjEzNS40MDUyIiB5PSItMjM1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwO0M8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDIzOCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU2IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+MHgyMzg8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMTY0LjIzNjkiIGN5PSItMTk1LjYiIHJ4PSIzNS4zNTg3IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE2NC4yMzY5IiB5PSItMTkxLjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgyMzg8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDI1RSYjNDU7Jmd0OzB4MjM4IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTQiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDI1RSYjNDU7Jmd0OzB4MjM4PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTE2My40NDQxLC0yNjYuMDAwNkMxNjMuNTgwNCwtMjUzLjg5NDkgMTYzLjc2MTYsLTIzNy44MDc2IDE2My45MTYzLC0yMjQuMDY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjE2Ny40MjA1LC0yMjMuNzEwOCAxNjQuMDMzNCwtMjEzLjY3MiAxNjAuNDIwOSwtMjIzLjYzMTkgMTY3LjQyMDUsLTIyMy43MTA4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNzEuNzkwMiIgeT0iLTIzNS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDtBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQuZzMuc3ZnIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLmczLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDMyNmM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLmczLnN2ZwpAQCAtMCwwICsxLDI1MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iCisgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgorPCEtLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBHZW5lcmF0ZWQgYnkgZ3JhcGh2aXogdmVyc2lvbiAyLjQwLjEgKDIwMTYxMjI1LjAzMDQpCisjIGh0dHA6Ly93d3cuZ3JhcGh2aXoub3JnL2NvbnRlbnQvY2x1c3RlcgorCitzdHJpY3QgZGlncmFwaCBHIHsKKyAgICAiMHg1MUMiOworCisgICAgc3ViZ3JhcGggY2x1c3Rlcl81MUMgeworICAgICAgICBsYWJlbD0gIlNwbGl0IG5vZGUgMHg1MUMiOworICAgICAgICBjb2xvcj1ncmV5OworICAgICAgICBub2RlIFtzdHlsZT1kYXNoZWRdICIweDUzQyIsICIweDU1QyIsICIweDU3QyIsICIweDU5QyIsICIweDVCQyI7CisKKyAgICAgICAgIjB4NTFDIiAtPiAiMHg1M0MiIFtsYWJlbD0iICAwMCJdOworICAgICAgICAiMHg1MUMiIC0+ICIweDU3QyIgW2xhYmVsPSIgIDAxIl07CisgICAgICAgICIweDUzQyIgLT4gIjB4NTVDIiBbbGFiZWw9IiAgMTEwIl07CisgICAgICAgICIweDU3QyIgLT4gIjB4NTlDIiBbbGFiZWw9IiAgMDAwIl07CisgICAgICAgICIweDU3QyIgLT4gIjB4NUJDIiBbbGFiZWw9IiAgMDEwIl07CisgICAgfQorCisgICAgIjB4NTVDIiAtPiAiMHg0MUIiIFtsYWJlbD0iICAwMTEiXTsKKyAgICAiMHg1NUMiIC0+ICIweDMzQiIgW2xhYmVsPSIgIDEwMSJdOworICAgICIweDU5QyIgLT4gIjB4MjM4IiBbbGFiZWw9IiAgMDAxIl07CisgICAgIjB4NTlDIiAtPiAiMHgzNUMiIFtsYWJlbD0iICAwMTAiXTsKKyAgICAiMHg1OUMiIC0+ICIweDEzQSIgW2xhYmVsPSIgIDAxMSJdOworICAgICIweDVCQyIgLT4gIjB4MzdBIiBbbGFiZWw9IiAgMDAwIl07CisgICAgIjB4NUJDIiAtPiAiMHg0NTUiIFtsYWJlbD0iICAwMDEiXTsKKworICAgICIweDEzQiIgLT4gImNvbnRlbnRBcnJheVswXSIgW2xhYmVsPSIgIEEiXTsKKyAgICAiMHgxM0EiIC0+ICIweDEzQiIgW2xhYmVsPSIgIEgiXTsKK30KKworIC0tPgorPCEtLSBUaXRsZTogRyBQYWdlczogMSAtLT4KKzxzdmcgd2lkdGg9IjYyOHB0IiBoZWlnaHQ9IjYwNXB0IgorICAgICB2aWV3Qm94PSIwLjAwIDAuMDAgNjI3Ljk3IDYwNC44MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CisgICAgPGcgaWQ9ImdyYXBoMCIgY2xhc3M9ImdyYXBoIiB0cmFuc2Zvcm09InNjYWxlKDEgMSkgcm90YXRlKDApIHRyYW5zbGF0ZSg0IDYwMC44KSI+CisgICAgICAgIDx0aXRsZT5HPC90aXRsZT4KKyAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSJ0cmFuc3BhcmVudCIgcG9pbnRzPSItNCw0IC00LC02MDAuOCA2MjMuOTY5NSwtNjAwLjggNjIzLjk2OTUsNCAtNCw0Ii8+CisgICAgICAgIDxnIGlkPSJjbHVzdDEiIGNsYXNzPSJjbHVzdGVyIj4KKyAgICAgICAgICAgIDx0aXRsZT5jbHVzdGVyXzUxQzwvdGl0bGU+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSJub25lIiBzdHJva2U9IiNjMGMwYzAiIHBvaW50cz0iMTc3Ljc5MDYsLTI1OC40IDE3Ny43OTA2LC01ODguOCA0NDQuNzkwNiwtNTg4LjggNDQ0Ljc5MDYsLTI1OC40IDE3Ny43OTA2LC0yNTguNCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzExLjI5MDYiIHk9Ii01NzIuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5TcGxpdCBub2RlIDB4NTFDPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1MUMgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4NTFDPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjI2NC43OTA2IiBjeT0iLTUzOCIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjY0Ljc5MDYiIHk9Ii01MzMuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDUxQzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTNDIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTIiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDUzQzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1kYXNoYXJyYXk9IjUsMiIgY3g9IjIyMC43OTA2IiBjeT0iLTQxMS4yIiByeD0iMzUuMzU4NyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMjAuNzkwNiIgeT0iLTQwNyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDUzQzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTFDJiM0NTsmZ3Q7MHg1M0MgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4NTFDJiM0NTsmZ3Q7MHg1M0M8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjU4LjU3OTgsLTUyMC4xMDE2QzI1MS4yMDk1LC00OTguODYxNiAyMzguODQyMSwtNDYzLjIyMTEgMjMwLjI3MjYsLTQzOC41MjU0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjMzLjU1NDcsLTQzNy4zMDczIDIyNi45Njk4LC00MjkuMDA3NCAyMjYuOTQxNiwtNDM5LjYwMjIgMjMzLjU1NDcsLTQzNy4zMDczIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNTYuMjkwNiIgeT0iLTQ3MC40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDswMDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTdDIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTQiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDU3QzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1kYXNoYXJyYXk9IjUsMiIgY3g9IjMwOC43OTA2IiBjeT0iLTQxMS4yIiByeD0iMzUuMzU4NyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMDguNzkwNiIgeT0iLTQwNyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDU3QzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTFDJiM0NTsmZ3Q7MHg1N0MgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4NTFDJiM0NTsmZ3Q7MHg1N0M8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjcxLjAwMTQsLTUyMC4xMDE2QzI3OC4zNzE4LC00OTguODYxNiAyOTAuNzM5MSwtNDYzLjIyMTEgMjk5LjMwODYsLTQzOC41MjU0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMzAyLjYzOTcsLTQzOS42MDIyIDMwMi42MTE0LC00MjkuMDA3NCAyOTYuMDI2NSwtNDM3LjMwNzMgMzAyLjYzOTcsLTQzOS42MDIyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMDAuMjkwNiIgeT0iLTQ3MC40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDswMTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTVDIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTMiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDU1QzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1kYXNoYXJyYXk9IjUsMiIgY3g9IjIyMC43OTA2IiBjeT0iLTI4NC40IiByeD0iMzUuMzU4NyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMjAuNzkwNiIgeT0iLTI4MC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4NTVDPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1M0MmIzQ1OyZndDsweDU1QyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UzIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg1M0MmIzQ1OyZndDsweDU1QzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yMjAuNzkwNiwtMzkzLjAzMjdDMjIwLjc5MDYsLTM3Mi4wMzUyIDIyMC43OTA2LC0zMzcuMjI2MSAyMjAuNzkwNiwtMzEyLjY3OSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjIyNC4yOTA3LC0zMTIuNTMzNiAyMjAuNzkwNiwtMzAyLjUzMzYgMjE3LjI5MDcsLTMxMi41MzM3IDIyNC4yOTA3LC0zMTIuNTMzNiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjM0Ljc5MDYiIHk9Ii0zNDMuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gJiMxNjA7MTEwPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg0MUIgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4NDFCPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjM2Ljc5MDYiIGN5PSItMTk1LjYiIHJ4PSIzNi41ODI0IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM2Ljc5MDYiIHk9Ii0xOTEuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDQxQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTVDJiM0NTsmZ3Q7MHg0MUIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4NTVDJiM0NTsmZ3Q7MHg0MUI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMTkyLjU5OSwtMjczLjQwODdDMTc1LjY2MDYsLTI2Ni42MDUzIDE1My43ODAyLC0yNTcuNDYzNSAxMzQuNzkwNiwtMjQ4LjQgMTEyLjc1NzIsLTIzNy44ODM3IDg4LjYwNTMsLTIyNC44ODkgNjkuNzkxLC0yMTQuNDIyNiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjcxLjQ1MTgsLTIxMS4zNDEyIDYxLjAxNjQsLTIwOS41MDk3IDY4LjAzMTksLTIxNy40NDkgNzEuNDUxOCwtMjExLjM0MTIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE0OC43OTA2IiB5PSItMjM1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwOzAxMTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4MzNCIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTgiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDMzQjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIxMjguNzkwNiIgY3k9Ii0xOTUuNiIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTI4Ljc5MDYiIHk9Ii0xOTEuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDMzQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTVDJiM0NTsmZ3Q7MHgzM0IgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4NTVDJiM0NTsmZ3Q7MHgzM0I8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjAzLjkxNjQsLTI2OC4xMTI3QzE4OS42NTEsLTI1NC4zNDM1IDE2OS4wMzcsLTIzNC40NDY1IDE1My4wMDk1LC0yMTguOTc2NSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjE1NS4xODM3LC0yMTYuMjEwNiAxNDUuNTU3OSwtMjExLjc4NCAxNTAuMzIyMywtMjIxLjI0NzIgMTU1LjE4MzcsLTIxNi4yMTA2Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxOTcuNzkwNiIgeT0iLTIzNS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDsxMDE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDU5QyAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU1IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg1OUM8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtZGFzaGFycmF5PSI1LDIiIGN4PSIzMDguNzkwNiIgY3k9Ii0yODQuNCIgcng9IjM1LjM1ODciIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzA4Ljc5MDYiIHk9Ii0yODAuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDU5QzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTdDJiM0NTsmZ3Q7MHg1OUMgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4NTdDJiM0NTsmZ3Q7MHg1OUM8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMzA4Ljc5MDYsLTM5My4wMzI3QzMwOC43OTA2LC0zNzIuMDM1MiAzMDguNzkwNiwtMzM3LjIyNjEgMzA4Ljc5MDYsLTMxMi42NzkiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIzMTIuMjkwNywtMzEyLjUzMzYgMzA4Ljc5MDYsLTMwMi41MzM2IDMwNS4yOTA3LC0zMTIuNTMzNyAzMTIuMjkwNywtMzEyLjUzMzYiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMyMi43OTA2IiB5PSItMzQzLjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwOzAwMDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NUJDIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTYiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDVCQzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1kYXNoYXJyYXk9IjUsMiIgY3g9IjM5OS43OTA2IiBjeT0iLTI4NC40IiByeD0iMzcuMTQ0MyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzOTkuNzkwNiIgeT0iLTI4MC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4NUJDPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1N0MmIzQ1OyZndDsweDVCQyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U1IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg1N0MmIzQ1OyZndDsweDVCQzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0zMjEuMDYzMywtMzk0LjA5OTJDMzM2LjU5OTUsLTM3Mi40NTEgMzYzLjUwMDIsLTMzNC45Njc0IDM4MS40NzEsLTMwOS45MjY3Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMzg0LjQzNDcsLTMxMS43OTk5IDM4Ny40MjE4LC0zMDEuNjM0OCAzNzguNzQ3NiwtMzA3LjcxODUgMzg0LjQzNDcsLTMxMS43OTk5Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNzMuNzkwNiIgeT0iLTM0My42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDswMTA8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDIzOCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU5IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+MHgyMzg8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjE4Ljc5MDYiIGN5PSItMTk1LjYiIHJ4PSIzNS4zNTg3IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxOC43OTA2IiB5PSItMTkxLjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgyMzg8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDU5QyYjNDU7Jmd0OzB4MjM4IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTgiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDU5QyYjNDU7Jmd0OzB4MjM4PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTI5Mi4yODMyLC0yNjguMTEyN0MyNzguMzI3OSwtMjU0LjM0MzUgMjU4LjE2MiwtMjM0LjQ0NjUgMjQyLjQ4MywtMjE4Ljk3NjUiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIyNDQuNzcsLTIxNi4zMTYxIDIzNS4xOTM0LC0yMTEuNzg0IDIzOS44NTM1LC0yMjEuMjk5IDI0NC43NywtMjE2LjMxNjEiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI4Ni43OTA2IiB5PSItMjM1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwOzAwMTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4MzVDIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEwIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+MHgzNUM8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMzA4Ljc5MDYiIGN5PSItMTk1LjYiIHJ4PSIzNi41ODI0IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMwOC43OTA2IiB5PSItMTkxLjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgzNUM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDU5QyYjNDU7Jmd0OzB4MzVDIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTkiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDU5QyYjNDU7Jmd0OzB4MzVDPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTMwOC43OTA2LC0yNjYuMDAwNkMzMDguNzkwNiwtMjUzLjg5NDkgMzA4Ljc5MDYsLTIzNy44MDc2IDMwOC43OTA2LC0yMjQuMDY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjMxMi4yOTA3LC0yMjMuNjcyIDMwOC43OTA2LC0yMTMuNjcyIDMwNS4yOTA3LC0yMjMuNjcyMSAzMTIuMjkwNywtMjIzLjY3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzIyLjc5MDYiIHk9Ii0yMzUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gJiMxNjA7MDEwPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHgxM0EgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTEiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDEzQTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI0MDAuNzkwNiIgY3k9Ii0xOTUuNiIgcng9IjM3LjE0NDMiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDAwLjc5MDYiIHk9Ii0xOTEuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDEzQTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTlDJiM0NTsmZ3Q7MHgxM0EgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTAiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDU5QyYjNDU7Jmd0OzB4MTNBPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTMyNS42NjQ4LC0yNjguMTEyN0MzMzkuOTMwMywtMjU0LjM0MzUgMzYwLjU0NDMsLTIzNC40NDY1IDM3Ni41NzE3LC0yMTguOTc2NSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjM3OS4yNTksLTIyMS4yNDcyIDM4NC4wMjM0LC0yMTEuNzg0IDM3NC4zOTc2LC0yMTYuMjEwNiAzNzkuMjU5LC0yMjEuMjQ3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzc3Ljc5MDYiIHk9Ii0yMzUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gJiMxNjA7MDExPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHgzN0EgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTIiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDM3QTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI0OTMuNzkwNiIgY3k9Ii0xOTUuNiIgcng9IjM3LjE0NDMiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDkzLjc5MDYiIHk9Ii0xOTEuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDM3QTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NUJDJiM0NTsmZ3Q7MHgzN0EgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTEiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDVCQyYjNDU7Jmd0OzB4MzdBPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTQxNy4wMzE3LC0yNjguMTEyN0M0MzEuNjA3MiwtMjU0LjM0MzUgNDUyLjY2OTMsLTIzNC40NDY1IDQ2OS4wNDUyLC0yMTguOTc2NSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjQ3MS43OTMxLC0yMjEuMTk1NSA0NzYuNjU4OSwtMjExLjc4NCA0NjYuOTg2MSwtMjE2LjEwNyA0NzEuNzkzMSwtMjIxLjE5NTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQ2OS43OTA2IiB5PSItMjM1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwOzAwMDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NDU1IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEzIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg0NTU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNTg0Ljc5MDYiIGN5PSItMTk1LjYiIHJ4PSIzNS4zNTg3IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjU4NC43OTA2IiB5PSItMTkxLjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHg0NTU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDVCQyYjNDU7Jmd0OzB4NDU1IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTEyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg1QkMmIzQ1OyZndDsweDQ1NTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik00MjkuNDc2NSwtMjczLjE5ODNDNDQ2LjcwNTEsLTI2Ni40NjQ1IDQ2OC43MDUxLC0yNTcuNDY0NSA0ODcuNzkwNiwtMjQ4LjQgNTA5LjcxODYsLTIzNy45ODU1IDUzMy42ODI4LC0yMjQuOTU3NyA1NTIuMzA1NSwtMjE0LjQ0ODciLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI1NTQuMjg4LC0yMTcuMzQ3OCA1NjEuMjUxNSwtMjA5LjM2MjcgNTUwLjgyODQsLTIxMS4yNjI1IDU1NC4yODgsLTIxNy4zNDc4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI1MzMuNzkwNiIgeT0iLTIzNS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDswMDE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDEzQiAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxNCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4MTNCPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjQwMC43OTA2IiBjeT0iLTEwNi44IiByeD0iMzYuNTgyNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MDAuNzkwNiIgeT0iLTEwMi42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MTNCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHgxM0EmIzQ1OyZndDsweDEzQiAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4MTNBJiM0NTsmZ3Q7MHgxM0I8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNNDAwLjc5MDYsLTE3Ny4yMDA2QzQwMC43OTA2LC0xNjUuMDk0OSA0MDAuNzkwNiwtMTQ5LjAwNzYgNDAwLjc5MDYsLTEzNS4yNjc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNDA0LjI5MDcsLTEzNC44NzIgNDAwLjc5MDYsLTEyNC44NzIgMzk3LjI5MDcsLTEzNC44NzIxIDQwNC4yOTA3LC0xMzQuODcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MDkuMzQzOSIgeT0iLTE0NyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gJiMxNjA7SDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIGNvbnRlbnRBcnJheVswXSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxNSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPmNvbnRlbnRBcnJheVswXTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI0MDAuNzkwNiIgY3k9Ii0xOCIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDAwLjc5MDYiIHk9Ii0xMy44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVswXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4MTNCJiM0NTsmZ3Q7Y29udGVudEFycmF5WzBdIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTEzIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHgxM0ImIzQ1OyZndDtjb250ZW50QXJyYXlbMF08L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNNDAwLjc5MDYsLTg4LjQwMDZDNDAwLjc5MDYsLTc2LjI5NDkgNDAwLjc5MDYsLTYwLjIwNzYgNDAwLjc5MDYsLTQ2LjQ2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI0MDQuMjkwNywtNDYuMDcyIDQwMC43OTA2LC0zNi4wNzIgMzk3LjI5MDcsLTQ2LjA3MjEgNDA0LjI5MDcsLTQ2LjA3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDA5LjM0MzkiIHk9Ii01OC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDtBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQuZzQuc3ZnIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLmc0LnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTIzNzcyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLmc0LnN2ZwpAQCAtMCwwICsxLDI5MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iCisgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgorPCEtLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBHZW5lcmF0ZWQgYnkgZ3JhcGh2aXogdmVyc2lvbiAyLjQwLjEgKDIwMTYxMjI1LjAzMDQpCisjIGh0dHA6Ly93d3cuZ3JhcGh2aXoub3JnL2NvbnRlbnQvY2x1c3RlcgorCitzdHJpY3QgZGlncmFwaCBHIHsKKy8vICAiMHgxMzkiIFtjb2xvcj1ncmV5LGZvbnRjb2xvcj1ncmV5XTsKKworICAiMHgxM0IiIC0+ICJjb250ZW50QXJyYXlbMF0iIFtsYWJlbD0iICBBIl07CisgICIweDEzQSIgLT4gIjB4MTNCIiBbbGFiZWw9IiAgSCJdOworLy8gICAiMHgxMzkiIC0+ICIweDEzQSIgW2xhYmVsPSIgIEMiXTsKKy8vICAiMHgxMzkiIC0+ICIweDEzQSIgW2xhYmVsPSIgIEMiLGNvbG9yPSJncmV5Iixmb250Y29sb3I9ImdyZXkiXTsKKworLy8gICAiMHgyNUUiIC0+ICIweDIzOCIgW2xhYmVsPSIgIEEiXTsKKy8vICAgIjB4MjVFIiAtPiAiMHgxM0EiIFtsYWJlbD0iICBDIl07CisvLyAgICIweDI1RSIgLT4gIjB4MzNCIiBbbGFiZWw9IiAgNSJdOworLy8gICAiMHgyNUUiIC0+ICIweDM1QyIgW2xhYmVsPSIgIEIiXTsKKy8vICAgIjB4MjVFIiAtPiAiMHgzN0EiIFtsYWJlbD0iICBQIl07CisvLyAgICIweDI1RSIgLT4gIjB4NDFCIiBbbGFiZWw9IiAgMyJdOworCisgIHN1YmdyYXBoIGNsdXN0ZXJfNTFGIHsKKyAgICBsYWJlbCA9ICJOb2RlIDB4NTFGIgorICAgICIweDUxRiIgW2xhYmVsPSJQcmVmaXggMHg1MUZcbmNvbnRlbnRBcnJheVsxXSJdCisgICAgIjB4NTFGIiAtPiAiMHg1MUMiIFtsYWJlbD0izrUiXTsKKworICAgIHN1YmdyYXBoIGNsdXN0ZXJfNTFDIHsKKyAgICAgIGxhYmVsPSAiU3BsaXQgbm9kZSAweDUxQyI7CisgICAgICByYW5rc2VwPTEKKyAgICAgIGNvbG9yPWdyZXk7CisgICAgICBub2RlIFtzdHlsZT1kYXNoZWRdICIweDUzQyIsICIweDU1QyIsICIweDU3QyIsICIweDU5QyIsICIweDVCQyI7CisKKyAgICAgICIweDUxQyIgLT4gIjB4NTNDIiBbbGFiZWw9IiAgMDAiXTsKKyAgICAgICIweDUxQyIgLT4gIjB4NTdDIiBbbGFiZWw9IiAgMDEiXTsKKyAgICAgICIweDUzQyIgLT4gIjB4NTVDIiBbbGFiZWw9IiAgMTEwIl07CisgICAgICAiMHg1N0MiIC0+ICIweDU5QyIgW2xhYmVsPSIgIDAwMCJdOworICAgICAgIjB4NTdDIiAtPiAiMHg1QkMiIFtsYWJlbD0iICAwMTAiXTsKKyAgICB9CisgIH0KKyAgIjB4NTVDIiAtPiAiMHg0MUIiIFtsYWJlbD0iICAwMTEiLG1pbmxlbj0yXTsKKyAgIjB4NTVDIiAtPiAiMHgzM0IiIFtsYWJlbD0iICAxMDEiLG1pbmxlbj0yXTsKKyAgIjB4NTlDIiAtPiAiMHgyMzgiIFtsYWJlbD0iICAwMDEiLG1pbmxlbj0yXTsKKyAgIjB4NTlDIiAtPiAiMHgzNUMiIFtsYWJlbD0iICAwMTAiLG1pbmxlbj0yXTsKKyAgIjB4NTlDIiAtPiAiMHgxM0EiIFtsYWJlbD0iICAwMTEiLG1pbmxlbj0yXTsKKyAgIjB4NUJDIiAtPiAiMHgzN0EiIFtsYWJlbD0iICAwMDAiLG1pbmxlbj0yXTsKKyAgIjB4NUJDIiAtPiAiMHg0NTUiIFtsYWJlbD0iICAwMDEiLG1pbmxlbj0yXTsKKworICB7IHJhbms9c2FtZSAiMHgyMzgiIC0+ICIweDM1QyIgLT4gIjB4MTNBIiBbc3R5bGU9aW52aXMsY29uc3RyYWluPWZhbHNlXX0KK30KKy0tPgorPCEtLSBUaXRsZTogRyBQYWdlczogMSAtLT4KKzxzdmcgd2lkdGg9IjY2M3B0IiBoZWlnaHQ9IjczOXB0IgorICAgICB2aWV3Qm94PSIwLjAwIDAuMDAgNjYyLjk3IDczOS4yMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CisgICAgPGcgaWQ9ImdyYXBoMCIgY2xhc3M9ImdyYXBoIiB0cmFuc2Zvcm09InNjYWxlKDEgMSkgcm90YXRlKDApIHRyYW5zbGF0ZSg0IDczNS4yMzEzKSI+CisgICAgICAgIDx0aXRsZT5HPC90aXRsZT4KKyAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSJ0cmFuc3BhcmVudCIgcG9pbnRzPSItNCw0IC00LC03MzUuMjMxMyA2NTguOTY5NSwtNzM1LjIzMTMgNjU4Ljk2OTUsNCAtNCw0Ii8+CisgICAgICAgIDxnIGlkPSJjbHVzdDEiIGNsYXNzPSJjbHVzdGVyIj4KKyAgICAgICAgICAgIDx0aXRsZT5jbHVzdGVyXzUxRjwvdGl0bGU+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMTg2Ljc5MDYsLTIzMS40IDE4Ni43OTA2LC03MjMuMjMxMyA0NjkuNzkwNiwtNzIzLjIzMTMgNDY5Ljc5MDYsLTIzMS40IDE4Ni43OTA2LC0yMzEuNCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzI4LjI5MDYiIHk9Ii03MDYuNjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5Ob2RlIDB4NTFGPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDxnIGlkPSJjbHVzdDIiIGNsYXNzPSJjbHVzdGVyIj4KKyAgICAgICAgICAgIDx0aXRsZT5jbHVzdGVyXzUxQzwvdGl0bGU+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSJub25lIiBzdHJva2U9IiNjMGMwYzAiIHBvaW50cz0iMTk0Ljc5MDYsLTIzOS40IDE5NC43OTA2LC01NzcuOCA0NjEuNzkwNiwtNTc3LjggNDYxLjc5MDYsLTIzOS40IDE5NC43OTA2LC0yMzkuNCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzI4LjI5MDYiIHk9Ii01NjEuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5TcGxpdCBub2RlIDB4NTFDPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHgxM0IgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4MTNCPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjQzNS43OTA2IiBjeT0iLTg4LjgiIHJ4PSIzNi41ODI0IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQzNS43OTA2IiB5PSItODQuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDEzQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIGNvbnRlbnRBcnJheVswXSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUyIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+Y29udGVudEFycmF5WzBdPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjQzNS43OTA2IiBjeT0iLTE4IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MzUuNzkwNiIgeT0iLTEzLjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzBdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHgxM0ImIzQ1OyZndDtjb250ZW50QXJyYXlbMF0gLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4MTNCJiM0NTsmZ3Q7Y29udGVudEFycmF5WzBdPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTQzNS43OTA2LC03MC41NjcyQzQzNS43OTA2LC02My4yNzQzIDQzNS43OTA2LC01NC42OTg3IDQzNS43OTA2LC00Ni42MTM3Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNDM5LjI5MDcsLTQ2LjQxNyA0MzUuNzkwNiwtMzYuNDE3IDQzMi4yOTA3LC00Ni40MTcxIDQzOS4yOTA3LC00Ni40MTciLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQ0NC4zNDM5IiB5PSItNDkuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gJiMxNjA7QTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4MTNBIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTMiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDEzQTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI0MzUuNzkwNiIgY3k9Ii0xNTkuNiIgcng9IjM3LjE0NDMiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDM1Ljc5MDYiIHk9Ii0xNTUuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDEzQTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4MTNBJiM0NTsmZ3Q7MHgxM0IgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4MTNBJiM0NTsmZ3Q7MHgxM0I8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNNDM1Ljc5MDYsLTE0MS4zNjcyQzQzNS43OTA2LC0xMzQuMDc0MyA0MzUuNzkwNiwtMTI1LjQ5ODcgNDM1Ljc5MDYsLTExNy40MTM3Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNDM5LjI5MDcsLTExNy4yMTcgNDM1Ljc5MDYsLTEwNy4yMTcgNDMyLjI5MDcsLTExNy4yMTcxIDQzOS4yOTA3LC0xMTcuMjE3Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0NDQuMzQzOSIgeT0iLTEyMCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gJiMxNjA7SDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTFGIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTQiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDUxRjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzMTguNzkwNiIgY3k9Ii02NjEuMDE1NiIgcng9IjExNy4yNjI5IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzE4Ljc5MDYiIHk9Ii02NjUuMjE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5QcmVmaXggMHg1MUY8L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMTguNzkwNiIgeT0iLTY0OC40MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVsxXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTFDIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTUiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDUxQzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzMTguNzkwNiIgY3k9Ii01MjciIHJ4PSIzNi41ODI0IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMxOC43OTA2IiB5PSItNTIyLjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHg1MUM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDUxRiYjNDU7Jmd0OzB4NTFDIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDUxRiYjNDU7Jmd0OzB4NTFDPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTMxOC43OTA2LC02MzEuMjczMkMzMTguNzkwNiwtNjA4LjYwOTEgMzE4Ljc5MDYsLTU3Ny42MDUyIDMxOC43OTA2LC01NTUuMzA0NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjMyMi4yOTA3LC01NTUuMTMwNSAzMTguNzkwNiwtNTQ1LjEzMDYgMzE1LjI5MDcsLTU1NS4xMzA2IDMyMi4yOTA3LC01NTUuMTMwNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzIyLjg3MDkiIHk9Ii02MDAiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+zrU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDUzQyAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU2IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg1M0M8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtZGFzaGFycmF5PSI1LDIiIGN4PSIyMzcuNzkwNiIgY3k9Ii0zOTYuMiIgcng9IjM1LjM1ODciIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjM3Ljc5MDYiIHk9Ii0zOTIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHg1M0M8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDUxQyYjNDU7Jmd0OzB4NTNDIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTQiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDUxQyYjNDU7Jmd0OzB4NTNDPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTI4NC4xMTMxLC01MjAuNjgwNEMyNjcuNzY0NywtNTE1LjQ5MzcgMjUxLjc5MDYsLTUwNi4xNjI0IDI1MS43OTA2LC00ODkuNSAyNTEuNzkwNiwtNDg5LjUgMjUxLjc5MDYsLTQ4OS41IDI1MS43OTA2LC00MzMuNyAyNTEuNzkwNiwtNDMwLjI5NDggMjUxLjI3NzcsLTQyNi44MTkzIDI1MC40NDgyLC00MjMuNDI1MiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjI1My42NzM0LC00MjIuMDMwNyAyNDcuMjA2NSwtNDEzLjYzODUgMjQ3LjAyODUsLTQyNC4yMzE4IDI1My42NzM0LC00MjIuMDMwNyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjYyLjI5MDYiIHk9Ii00NTcuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gJiMxNjA7MDA8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDU3QyAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU4IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg1N0M8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtZGFzaGFycmF5PSI1LDIiIGN4PSIzMjUuNzkwNiIgY3k9Ii0zOTYuMiIgcng9IjM1LjM1ODciIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzI1Ljc5MDYiIHk9Ii0zOTIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHg1N0M8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDUxQyYjNDU7Jmd0OzB4NTdDIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTUiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDUxQyYjNDU7Jmd0OzB4NTdDPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTMyMC44NDE0LC01MDguNzEyOUMzMjEuMzY4NywtNTAyLjYxMDkgMzIxLjc5MDYsLTQ5NS43NyAzMjEuNzkwNiwtNDg5LjUgMzIxLjc5MDYsLTQ4OS41IDMyMS43OTA2LC00ODkuNSAzMjEuNzkwNiwtNDMzLjcgMzIxLjc5MDYsLTQzMC43NTM3IDMyMS45MTQyLC00MjcuNjg0NSAzMjIuMTE4LC00MjQuNjI2NiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjMyNS42MjE1LC00MjQuNzQ4NiAzMjMuMDU2MiwtNDE0LjQ2OSAzMTguNjUxMiwtNDI0LjEwNDYgMzI1LjYyMTUsLTQyNC43NDg2Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMzIuMjkwNiIgeT0iLTQ1Ny40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDswMTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTVDIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTciIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDU1QzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1kYXNoYXJyYXk9IjUsMiIgY3g9IjIzNy43OTA2IiBjeT0iLTI2NS40IiByeD0iMzUuMzU4NyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMzcuNzkwNiIgeT0iLTI2MS4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4NTVDPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1M0MmIzQ1OyZndDsweDU1QyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U2IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg1M0MmIzQ1OyZndDsweDU1QzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yMzcuNzkwNiwtMzc3Ljg4OTVDMjM3Ljc5MDYsLTM3MS43ODU5IDIzNy43OTA2LC0zNjQuOTUgMjM3Ljc5MDYsLTM1OC43IDIzNy43OTA2LC0zNTguNyAyMzcuNzkwNiwtMzU4LjcgMjM3Ljc5MDYsLTMwMi45IDIzNy43OTA2LC0yOTkuOTcwMyAyMzcuNzkwNiwtMjk2LjkxMTkgMjM3Ljc5MDYsLTI5My44NjA1Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjQxLjI5MDcsLTI5My43MTA1IDIzNy43OTA2LC0yODMuNzEwNSAyMzQuMjkwNywtMjkzLjcxMDYgMjQxLjI5MDcsLTI5My43MTA1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNTEuNzkwNiIgeT0iLTMyNi42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDsxMTA8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDQxQiAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4NDFCPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjM2Ljc5MDYiIGN5PSItMTU5LjYiIHJ4PSIzNi41ODI0IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM2Ljc5MDYiIHk9Ii0xNTUuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDQxQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTVDJiM0NTsmZ3Q7MHg0MUIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlOSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4NTVDJiM0NTsmZ3Q7MHg0MUI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjEyLjU0NDksLTI1Mi43NjE3QzE5MS44NDQ5LC0yNDIuMzQzNCAxNjEuODIwOCwtMjI3LjEwNSAxMzUuNzkwNiwtMjEzLjQgMTEzLjkyNDUsLTIwMS44ODc0IDg5LjUzMTIsLTE4OC42MzYxIDcwLjQyOTYsLTE3OC4xNjU2Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNzEuOTYxOSwtMTc1LjAxNCA2MS41MTE4LC0xNzMuMjY4NiA2OC41OTI2LC0xODEuMTQ5OCA3MS45NjE5LC0xNzUuMDE0Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNDkuNzkwNiIgeT0iLTIwMC44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDswMTE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDMzQiAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4MzNCPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjEyOC43OTA2IiBjeT0iLTE1OS42IiByeD0iMzYuNTgyNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxMjguNzkwNiIgeT0iLTE1NS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MzNCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1NUMmIzQ1OyZndDsweDMzQiAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4NTVDJiM0NTsmZ3Q7MHgzM0I8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjIxLjIzNTksLTI0OS4zMzEzQzIwMi45ODk1LC0yMzEuNjIwNiAxNzMuNDc4MiwtMjAyLjk3NTcgMTUyLjcxNzEsLTE4Mi44MjQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIxNTUuMTE0NSwtMTgwLjI3MzUgMTQ1LjUwMTIsLTE3NS44MiAxNTAuMjM5MSwtMTg1LjI5NjQgMTU1LjExNDUsLTE4MC4yNzM1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxOTcuNzkwNiIgeT0iLTIwMC44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDsxMDE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDU5QyAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU5IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg1OUM8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtZGFzaGFycmF5PSI1LDIiIGN4PSIzMjUuNzkwNiIgY3k9Ii0yNjUuNCIgcng9IjM1LjM1ODciIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzI1Ljc5MDYiIHk9Ii0yNjEuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDU5QzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTdDJiM0NTsmZ3Q7MHg1OUMgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4NTdDJiM0NTsmZ3Q7MHg1OUM8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMzI1Ljc5MDYsLTM3Ny44ODk1QzMyNS43OTA2LC0zNzEuNzg1OSAzMjUuNzkwNiwtMzY0Ljk1IDMyNS43OTA2LC0zNTguNyAzMjUuNzkwNiwtMzU4LjcgMzI1Ljc5MDYsLTM1OC43IDMyNS43OTA2LC0zMDIuOSAzMjUuNzkwNiwtMjk5Ljk3MDMgMzI1Ljc5MDYsLTI5Ni45MTE5IDMyNS43OTA2LC0yOTMuODYwNSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjMyOS4yOTA3LC0yOTMuNzEwNSAzMjUuNzkwNiwtMjgzLjcxMDUgMzIyLjI5MDcsLTI5My43MTA2IDMyOS4yOTA3LC0yOTMuNzEwNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzM5Ljc5MDYiIHk9Ii0zMjYuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gJiMxNjA7MDAwPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1QkMgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTAiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDVCQzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1kYXNoYXJyYXk9IjUsMiIgY3g9IjQxNi43OTA2IiBjeT0iLTI2NS40IiByeD0iMzcuMTQ0MyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MTYuNzkwNiIgeT0iLTI2MS4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4NUJDPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1N0MmIzQ1OyZndDsweDVCQyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U4IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg1N0MmIzQ1OyZndDsweDVCQzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0zNTYuNjY1OCwtMzg3LjI0MzVDMzc4LjA4NzgsLTM4MC4wNzkgNDAyLjc5MDYsLTM2OS40ODAxIDQwMi43OTA2LC0zNTguNyA0MDIuNzkwNiwtMzU4LjcgNDAyLjc5MDYsLTM1OC43IDQwMi43OTA2LC0zMDIuOSA0MDIuNzkwNiwtMjk5LjQ5NDggNDAzLjMwMzUsLTI5Ni4wMTkzIDQwNC4xMzMsLTI5Mi42MjUyIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNDA3LjU1MjgsLTI5My40MzE4IDQwNy4zNzQ3LC0yODIuODM4NSA0MDAuOTA3OCwtMjkxLjIzMDcgNDA3LjU1MjgsLTI5My40MzE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MTYuNzkwNiIgeT0iLTMyNi42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDswMTA8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDU5QyYjNDU7Jmd0OzB4MTNBIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTEzIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg1OUMmIzQ1OyZndDsweDEzQTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0zNDIuNDk3MiwtMjQ5LjMzMTNDMzYwLjkxMSwtMjMxLjYyMDYgMzkwLjY5MywtMjAyLjk3NTcgNDExLjY0NDcsLTE4Mi44MjQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI0MTQuMTQ1NywtMTg1LjI3NDcgNDE4LjkyNjgsLTE3NS44MiA0MDkuMjkzMSwtMTgwLjIyOTYgNDE0LjE0NTcsLTE4NS4yNzQ3Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MTAuNzkwNiIgeT0iLTIwMC44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDswMTE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDIzOCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4MjM4PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjIxOC43OTA2IiBjeT0iLTE1OS42IiByeD0iMzUuMzU4NyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTguNzkwNiIgeT0iLTE1NS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MjM4PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1OUMmIzQ1OyZndDsweDIzOCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4NTlDJiM0NTsmZ3Q7MHgyMzg8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMzA5LjUzOTYsLTI0OS4zMzEzQzI5MS43MDY3LC0yMzEuNjk4MyAyNjIuOTEyMiwtMjAzLjIyNjcgMjQyLjU0NjcsLTE4My4wODk3Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjQ0Ljc2NjMsLTE4MC4zNjIzIDIzNS4xOTQ1LC0xNzUuODIgMjM5Ljg0NDUsLTE4NS4zMzk5IDI0NC43NjYzLC0xODAuMzYyMyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjg2Ljc5MDYiIHk9Ii0yMDAuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gJiMxNjA7MDAxPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHgzNUMgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTQiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDM1QzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzMjUuNzkwNiIgY3k9Ii0xNTkuNiIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzI1Ljc5MDYiIHk9Ii0xNTUuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDM1QzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTlDJiM0NTsmZ3Q7MHgzNUMgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTIiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDU5QyYjNDU7Jmd0OzB4MzVDPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTMyNS43OTA2LC0yNDYuOTcxQzMyNS43OTA2LC0yMzAuNjYyMiAzMjUuNzkwNiwtMjA2LjYxMTEgMzI1Ljc5MDYsLTE4Ny44Njk4Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMzI5LjI5MDcsLTE4Ny44MTc3IDMyNS43OTA2LC0xNzcuODE3OCAzMjIuMjkwNywtMTg3LjgxNzggMzI5LjI5MDcsLTE4Ny44MTc3Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMzkuNzkwNiIgeT0iLTIwMC44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDswMTA8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDM3QSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxNSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4MzdBPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjUyOC43OTA2IiBjeT0iLTE1OS42IiByeD0iMzcuMTQ0MyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI1MjguNzkwNiIgeT0iLTE1NS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MzdBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1QkMmIzQ1OyZndDsweDM3QSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4NUJDJiM0NTsmZ3Q7MHgzN0E8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNNDMzLjgwMSwtMjQ5LjMzMTNDNDUyLjU0OTUsLTIzMS42MjA2IDQ4Mi44NzMxLC0yMDIuOTc1NyA1MDQuMjA1NywtMTgyLjgyNCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjUwNi43NTQyLC0xODUuMjMxMyA1MTEuNjIwMSwtMTc1LjgyIDUwMS45NDcyLC0xODAuMTQyNyA1MDYuNzU0MiwtMTg1LjIzMTMiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjUwMi43OTA2IiB5PSItMjAwLjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwOzAwMDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NDU1IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTE2IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg0NTU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNjE5Ljc5MDYiIGN5PSItMTU5LjYiIHJ4PSIzNS4zNTg3IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjYxOS43OTA2IiB5PSItMTU1LjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHg0NTU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDVCQyYjNDU7Jmd0OzB4NDU1IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE1IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg1QkMmIzQ1OyZndDsweDQ1NTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik00NDMuNDE5NywtMjUyLjM5N0M0NjQuNTA2NSwtMjQyLjAyNTQgNDk0LjY1ODMsLTIyNy4wMjg2IDUyMC43OTA2LC0yMTMuNCA1NDIuOTk5NiwtMjAxLjgxNzUgNTY3Ljc1OTYsLTE4OC4zNjE5IDU4Ni45NjI0LC0xNzcuODA0NyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjU4OC44MzgsLTE4MC43Njc0IDU5NS45MDcyLC0xNzIuODc1OCA1ODUuNDU5NywtMTc0LjYzNjUgNTg4LjgzOCwtMTgwLjc2NzQiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjU2NC43OTA2IiB5PSItMjAwLjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwOzAwMTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4MjM4JiM0NTsmZ3Q7MHgzNUMgLS0+CisgICAgICAgIDwhLS0gMHgzNUMmIzQ1OyZndDsweDEzQSAtLT4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC5tMS5zdmcgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQubTEuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOTI4YTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQubTEuc3ZnCkBAIC0wLDAgKzEsMzQ5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKKyAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cis8IS0tLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDIuNDAuMSAoMjAxNjEyMjUuMDMwNCkKKyMgZW1iZWRkZWQgRE9UIChwbGFudHVtbCkgd29ya3MgaW4gSURFQSBwcmV2aWV3CisjIGJ1dCBub3Qgb24gR2l0SHViCitgYGBwbGFudHVtbAorZGlncmFwaCBHIHsKKyAgICB7IHJhbms9c2FtZSByb290IC0+IHN0YXJ0IFtzdHlsZT1pbnZpc10gfQorICAgIHN0YXJ0IFtsYWJlbD0ic3RhcnQvZW5kIl0KKworICAgIHRyYWN0b3IgW2xhYmVsID0gImNvbnRlbnRBcnJheVswXSJdCisgICAgdHJhY3RvIFtsYWJlbCA9ICIweDAxQiJdCisgICAgdHJhY3QgW2xhYmVsID0gIjB4MDFBIl0KKyAgICB0cmFjIFtsYWJlbCA9ICIweDAxOSJdCisgICAgdHJhIFtsYWJlbCA9ICJDaGFpblxuMHgwMTgiXQorCisgICAgdHJlZSBbbGFiZWwgPSAiY29udGVudEFycmF5WzFdIl0KKyAgICB0cmUgW2xhYmVsID0gIkNoYWluXG4weDAzQiJdCisgICAgdHJpZSBbbGFiZWwgPSAiY29udGVudEFycmF5WzJdIl0KKyAgICB0cmkgW2xhYmVsID0gIkNoYWluXG4weDA1QiJdCisKKyAgICB0ciBbbGFiZWwgPSAiU3BhcnNlXG4weDA3RSJdCisKKyAgICB0IFtsYWJlbCA9ICIweDA5QiJdCisgICAgcm9vdCBbbGFiZWwgPSAiQ2hhaW5cbjB4OUEiXQorCisgICAgcm9vdCAtPiB0IFtsYWJlbCA9ICIgdCJdCisgICAgdCAtPiB0ciBbbGFiZWwgPSAiIHIiXQorICAgIHRyIC0+IHRyYSBbbGFiZWwgPSAiIGEiXQorICAgIHRyYSAtPiB0cmFjIFtsYWJlbCA9ICIgYyJdCisgICAgdHJhYyAtPiB0cmFjdCBbbGFiZWwgPSAiIHQiXQorICAgIHRyYWN0IC0+IHRyYWN0byBbbGFiZWwgPSAiIG8iXQorICAgIHRyYWN0byAtPiB0cmFjdG9yIFtsYWJlbCA9ICIgciJdCisKKyAgICB0ciAtPiB0cmUgW2xhYmVsID0gIiBlIl0KKyAgICB0cmUgLT4gdHJlZSBbbGFiZWwgPSAiIGUiXQorCisgICAgdHIgLT4gdHJpIFtsYWJlbCA9ICIgaSJdCisgICAgdHJpIC0+IHRyaWUgW2xhYmVsID0gIiBlIl0KKworICAgIC8vIHtyYW5rPXNhbWUgdHJhIC0+IHRyZSAtPiB0cmkgW3N0eWxlPWludmlzXX0KKyAgICB7cmFuaz1zYW1lIHRyYWMgLT4gdHJlZSAtPiB0cmllIFtzdHlsZT1pbnZpc119CisKKyAgICBzdWJncmFwaCBwYXRoIHsKKyAgICAgICAgZWRnZSBbY29sb3IgPSAibGlnaHRibHVlIjsgZm9udGNvbG9yPSJibHVlIjsgYXJyb3doZWFkPSJ2ZWUiXQorICAgICAgICBub2RlIFtjb2xvciA9ICJsaWdodGJsdWUiOyBmb250Y29sb3I9ImJsdWUiXQorCisgICAgICAgIHN0YXJ0IC0+IHJvb3QKKworICAgICAgICByb290IC0+IHQgW2xhYmVsID0gIiB0Il0KKyAgICAgICAgdCAtPiB0ciBbbGFiZWwgPSAiIHIiXQorICAgICAgICB0ciAtPiB0cmEgW2xhYmVsID0gIiBhIl0KKyAgICAgICAgdHJhIC0+IHRyYXYgW2xhYmVsID0gIiB2Il0KKyAgICAgICAgdHJhdiAtPiB0cmF2ZSBbbGFiZWwgPSAiIGUiXQorICAgICAgICB0cmF2ZSAtPiB0cmF2ZXIgW2xhYmVsID0gIiByIl0KKyAgICAgICAgdHJhdmVyIC0+IHRyYXZlcnMgW2xhYmVsID0gIiBzIl0KKyAgICAgICAgdHJhdmVycyAtPiB0cmF2ZXJzZSBbbGFiZWwgPSAiIGUiXQorCisgICAgICAgIHRyYXYgW2xhYmVsID0gIk5PTkUiXQorICAgICAgICB0cmF2ZSBbbGFiZWwgPSAiTk9ORSJdCisgICAgICAgIHRyYXZlciBbbGFiZWwgPSAiTk9ORSJdCisgICAgICAgIHRyYXZlcnMgW2xhYmVsID0gIk5PTkUiXQorICAgICAgICB0cmF2ZXJzZSBbbGFiZWwgPSAiTk9ORSJdCisgICAgfQorfQorYGBgCisgLS0+Cis8IS0tIFRpdGxlOiBHIFBhZ2VzOiAxIC0tPgorPHN2ZyB3aWR0aD0iNTc1cHQiIGhlaWdodD0iODIzcHQiCisgICAgIHZpZXdCb3g9IjAuMDAgMC4wMCA1NzUuNDcgODIyLjg5IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KKyAgICA8ZyBpZD0iZ3JhcGgwIiBjbGFzcz0iZ3JhcGgiIHRyYW5zZm9ybT0ic2NhbGUoMSAxKSByb3RhdGUoMCkgdHJhbnNsYXRlKDQgODE4Ljg5MzkpIj4KKyAgICAgICAgPHRpdGxlPkc8L3RpdGxlPgorICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9InRyYW5zcGFyZW50IiBwb2ludHM9Ii00LDQgLTQsLTgxOC44OTM5IDU3MS40NzM4LC04MTguODkzOSA1NzEuNDczOCw0IC00LDQiLz4KKyAgICAgICAgPCEtLSByb290IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT5yb290PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjI3OS4yMzY5IiBjeT0iLTc4NS40NzgyIiByeD0iMzMuMTMzNyIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI3OS4yMzY5IiB5PSItNzg5LjY3ODIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNzkuMjM2OSIgeT0iLTc3Mi44NzgyIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4OUE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSBzdGFydCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUyIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+c3RhcnQ8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMzkyLjIzNjkiIGN5PSItNzg1LjQ3ODIiIHJ4PSI0NC4wNzc1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM5Mi4yMzY5IiB5PSItNzgxLjI3ODIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+c3RhcnQvZW5kPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gcm9vdCYjNDU7Jmd0O3N0YXJ0IC0tPgorICAgICAgICA8IS0tIHQgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTMiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjI3OS4yMzY5IiBjeT0iLTY4NS4yNjI2IiByeD0iMzYuNTgyNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNzkuMjM2OSIgeT0iLTY4MS4wNjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDlCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gcm9vdCYjNDU7Jmd0O3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnJvb3QmIzQ1OyZndDt0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTI2OS4zMzY4LC03NTcuMDgyNEMyNjYuNjEwNCwtNzQ1LjkzNjggMjY0Ljg3OTQsLTczMy4wMjExIDI2Ni44NDYzLC03MjEuMjYyNiAyNjcuMzI2OCwtNzE4LjM5IDI2OC4wMDksLTcxNS40Mzk4IDI2OC44MDkxLC03MTIuNTIzOCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjI3Mi4xNzMyLC03MTMuNDk0IDI3MS44NjI3LC03MDIuOTAzNyAyNjUuNTAxMiwtNzExLjM3NjIgMjcyLjE3MzIsLTcxMy40OTQiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI3MC45MzIyIiB5PSItNzI1LjQ2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSByb290JiM0NTsmZ3Q7dCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnJvb3QmIzQ1OyZndDt0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTI3OS4yMzY5LC03NTUuOTUyMkMyNzkuMjM2OSwtNzQyLjQ2NzEgMjc5LjIzNjksLTcyNi41NzQ5IDI3OS4yMzY5LC03MTMuMjc3OSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjI3OS4yMzY5LC03MDMuMjY1OSAyODMuNzM3LC03MTMuMjY1OSAyNzkuMjM2OSwtNzA4LjI2NTkgMjc5LjIzNywtNzEzLjI2NTkgMjc5LjIzNywtNzEzLjI2NTkgMjc5LjIzNywtNzEzLjI2NTkgMjc5LjIzNjksLTcwOC4yNjU5IDI3NC43MzcsLTcxMy4yNjU5IDI3OS4yMzY5LC03MDMuMjY1OSAyNzkuMjM2OSwtNzAzLjI2NTkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI4Mi45MzIyIiB5PSItNzI1LjQ2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IHQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSBzdGFydCYjNDU7Jmd0O3Jvb3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTUiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT5zdGFydCYjNDU7Jmd0O3Jvb3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMzY3LjYxMTIsLTgwMC41MTg1QzM1MC43MzQ4LC04MDcuOTUzNyAzMzMuODU4NSwtODA5LjQ4MzkgMzE2Ljk4MjEsLTgwNS4xMDkiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIzMDcuMDQ1NSwtODAxLjg1MDggMzE3Ljk0OTgsLTgwMC42OTA3IDMxMS43OTY2LC04MDMuNDA4NyAzMTYuNTQ3NywtODA0Ljk2NjcgMzE2LjU0NzcsLTgwNC45NjY3IDMxNi41NDc3LC04MDQuOTY2NyAzMTEuNzk2NiwtODAzLjQwODcgMzE1LjE0NTYsLTgwOS4yNDI3IDMwNy4wNDU1LC04MDEuODUwOCAzMDcuMDQ1NSwtODAxLjg1MDgiLz4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0b3IgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0b3I8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii0xMDYuOCIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzMuMjM2OSIgeT0iLTEwMi42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVswXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0byAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU0IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjkxLjIzNjkiIGN5PSItMTk1LjYiIHJ4PSIzNi41ODI0IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjkxLjIzNjkiIHk9Ii0xOTEuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0byYjNDU7Jmd0O3RyYWN0b3IgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlOCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0byYjNDU7Jmd0O3RyYWN0b3I8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNODcuNTk0MywtMTc3LjYzQzg1LjEyMjEsLTE2NS40MzM4IDgxLjgwMiwtMTQ5LjA1NDMgNzguOTc3MiwtMTM1LjExODciLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI4Mi4zNTI4LC0xMzQuMTUzNCA3Ni45MzU4LC0xMjUuMDQ4MSA3NS40OTIzLC0xMzUuNTQ0MSA4Mi4zNTI4LC0xMzQuMTUzNCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iODguMzE3MiIgeT0iLTE0NyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gcjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTUiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI5MS4yMzY5IiBjeT0iLTI4NC40IiByeD0iMzcuMTQ0MyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI5MS4yMzY5IiB5PSItMjgwLjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwMUE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdCYjNDU7Jmd0O3RyYWN0byAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U3IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3QmIzQ1OyZndDt0cmFjdG88L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNOTEuMjM2OSwtMjY2LjAwMDZDOTEuMjM2OSwtMjUzLjg5NDkgOTEuMjM2OSwtMjM3LjgwNzYgOTEuMjM2OSwtMjI0LjA2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI5NC43MzcsLTIyMy42NzIgOTEuMjM2OSwtMjEzLjY3MiA4Ny43MzcsLTIyMy42NzIxIDk0LjczNywtMjIzLjY3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iOTYuNDg2OSIgeT0iLTIzNS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBvPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhYyAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU2IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhYzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI5Mi4yMzY5IiBjeT0iLTM3My4yIiByeD0iMzUuMzU4NyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI5Mi4yMzY5IiB5PSItMzY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDE5PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhYyYjNDU7Jmd0O3RyYWN0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTYiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjJiM0NTsmZ3Q7dHJhY3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNOTIuMDI5NywtMzU0LjgwMDZDOTEuODkzNCwtMzQyLjY5NDkgOTEuNzEyMiwtMzI2LjYwNzYgOTEuNTU3NSwtMzEyLjg2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI5NS4wNTI5LC0zMTIuNDMxOSA5MS40NDA0LC0zMDIuNDcyIDg4LjA1MzMsLTMxMi41MTA4IDk1LjA1MjksLTMxMi40MzE5Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI5NS45MzIyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmVlIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTgiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmVlPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjMxMi4yMzY5IiBjeT0iLTM3My4yIiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMTIuMjM2OSIgeT0iLTM2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5jb250ZW50QXJyYXlbMV08L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjJiM0NTsmZ3Q7dHJlZSAtLT4KKyAgICAgICAgPCEtLSB0cmEgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyMDMuMjM2OSIgY3k9Ii00NzMuNDE1NiIgcng9IjM2LjEyNSIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwMy4yMzY5IiB5PSItNDc3LjYxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDMuMjM2OSIgeT0iLTQ2MC44MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDE4PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhJiM0NTsmZ3Q7dHJhYyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U1IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhJiM0NTsmZ3Q7dHJhYzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0xNzguODc3NSwtNDUxLjQyMjlDMTYwLjU2MTgsLTQzNC44ODY3IDEzNS41NTYxLC00MTIuMzEwNSAxMTcuMTE1NiwtMzk1LjY2MTYiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIxMTkuNDIxLC0zOTMuMDI3NiAxMDkuNjUzMSwtMzg4LjkyNDEgMTE0LjczMDEsLTM5OC4yMjMzIDExOS40MjEsLTM5My4wMjc2Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNTMuMDk0MiIgeT0iLTQxMy40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBjPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdiAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxNCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXY8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBjeD0iMTgzLjIzNjkiIGN5PSItMzczLjIiIHJ4PSIzNy43MDA2IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE4My4yMzY5IiB5PSItMzY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPk5PTkU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmEmIzQ1OyZndDt0cmF2IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE5IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhJiM0NTsmZ3Q7dHJhdjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0xOTcuMzk4MywtNDQ0LjE1OTdDMTk0LjcwNTQsLTQzMC42NjYgMTkxLjUyMjQsLTQxNC43MTY4IDE4OC44NTY4LC00MDEuMzYwNCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjE4Ni44NDkzLC0zOTEuMzAxMSAxOTMuMjE5NSwtNDAwLjIyNyAxODcuODI3OSwtMzk2LjIwNDQgMTg4LjgwNjUsLTQwMS4xMDc4IDE4OC44MDY1LC00MDEuMTA3OCAxODguODA2NSwtNDAxLjEwNzggMTg3LjgyNzksLTM5Ni4yMDQ0IDE4NC4zOTM1LC00MDEuOTg4NSAxODYuODQ5MywtMzkxLjMwMTEgMTg2Ljg0OTMsLTM5MS4zMDExIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxOTguNDg2OSIgeT0iLTQxMy40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiB2PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyaWU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNDk0LjIzNjkiIGN5PSItMzczLjIiIHJ4PSI3My40NzQ1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQ5NC4yMzY5IiB5PSItMzY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVsyXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZWUmIzQ1OyZndDt0cmllIC0tPgorICAgICAgICA8IS0tIHRyZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU5IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjMwNC4yMzY5IiBjeT0iLTQ3My40MTU2IiByeD0iMzcuOTMwNiIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMwNC4yMzY5IiB5PSItNDc3LjYxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMDQuMjM2OSIgeT0iLTQ2MC44MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDNCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlJiM0NTsmZ3Q7dHJlZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyZSYjNDU7Jmd0O3RyZWU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMzA2LjU5MzksLTQ0My44ODk3QzMwNy42NzA0LC00MzAuNDA0NiAzMDguOTM5LC00MTQuNTEyMyAzMTAuMDAwNSwtNDAxLjIxNTMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIzMTMuNDkyOCwtNDAxLjQ1MDIgMzEwLjc5OTcsLTM5MS4yMDMzIDMwNi41MTUsLTQwMC44OTMxIDMxMy40OTI4LC00MDEuNDUwMiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzE0LjA5NDIiIHk9Ii00MTMuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyaTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI0NDYuMjM2OSIgY3k9Ii00NzMuNDE1NiIgcng9IjM3LjkzMDYiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0NDYuMjM2OSIgeT0iLTQ3Ny42MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDQ2LjIzNjkiIHk9Ii00NjAuODE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDA1QjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaSYjNDU7Jmd0O3RyaWUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTIiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmkmIzQ1OyZndDt0cmllPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTQ1OS40ODAyLC00NDUuNzY2QzQ2Ni4yNDQxLC00MzEuNjQ0MSA0NzQuNDQ1MiwtNDE0LjUyMTUgNDgxLjE4MjIsLTQwMC40NTYiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI0ODQuNDEzNCwtNDAxLjgxMiA0ODUuNTc2NiwtMzkxLjI4MTIgNDc4LjEwMDIsLTM5OC43ODgxIDQ4NC40MTM0LC00MDEuODEyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0ODAuMDk0MiIgeT0iLTQxMy40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHIgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTIiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyNzkuMjM2OSIgY3k9Ii01ODUuMDQ2OSIgcng9IjM3LjkwMjciIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNzkuMjM2OSIgeT0iLTU4OS4yNDY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPlNwYXJzZTwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI3OS4yMzY5IiB5PSItNTcyLjQ0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwN0U8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyYSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U0IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmE8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjUyLjQ1NDksLTU2NC4wODQ2QzI0My45Njg2LC01NTYuNDQ5NSAyMzUuMDk1NiwtNTQ3LjMwMDMgMjI4LjUyMjMsLTUzNy42MzEzIDIyMy4xNzk2LC01MjkuNzcyNCAyMTguNzIwNCwtNTIwLjYxOTQgMjE1LjExLC01MTEuNzI4NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjIxOC4zMzgyLC01MTAuMzcgMjExLjUyMzksLTUwMi4yNTczIDIxMS43OTE4LC01MTIuODQ4NyAyMTguMzM4MiwtNTEwLjM3Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMzQuMDk0MiIgeT0iLTUyNS4wMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBhPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0cmEgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTgiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3RyYTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yNjIuODc3LC01NTguNTM5OUMyNTUuNTIzMiwtNTQ2Ljg1ODQgMjQ2LjYyNjgsLTUzMy4wNDA5IDIzOC4yMzY5LC01MjAuODMxMyAyMzUuMTIyMywtNTE2LjI5ODcgMjMxLjc3MjcsLTUxMS41NzkyIDIyOC40MjQsLTUwNi45NTExIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjIyLjQ0ODUsLTQ5OC43NzkzIDIzMS45ODM2LC01MDQuMTk1MiAyMjUuMzk5OCwtNTAyLjgxNTQgMjI4LjM1MTIsLTUwNi44NTE0IDIyOC4zNTEyLC01MDYuODUxNCAyMjguMzUxMiwtNTA2Ljg1MTQgMjI1LjM5OTgsLTUwMi44MTU0IDIyNC43MTg3LC01MDkuNTA3NyAyMjIuNDQ4NSwtNDk4Ljc3OTMgMjIyLjQ0ODUsLTQ5OC43NzkzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNTQuMDk0MiIgeT0iLTUyNS4wMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiBhPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0cmUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlOSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTI4NS43NDAxLC01NTYuMDA4NUMyODguNjk3MSwtNTQyLjgwNDYgMjkyLjI0MDksLTUyNi45ODA3IDI5NS40MzE4LC01MTIuNzMyNyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjI5OC45MDkzLC01MTMuMjE5NiAyOTcuNjc5NCwtNTAyLjY5NjQgMjkyLjA3ODUsLTUxMS42ODk4IDI5OC45MDkzLC01MTMuMjE5NiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjk4LjA5NDIiIHk9Ii01MjUuMDMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJpIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTExIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmk8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMzA3Ljk0NTIsLTU2NS44NTY4QzMzNS43ODU0LC01NDcuMjQ3IDM3OC4xNzUxLC01MTguOTExNiA0MDguNjgyNiwtNDk4LjUxODgiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI0MTAuOTc1NywtNTAxLjE5NiA0MTcuMzQ0MywtNDkyLjcyODkgNDA3LjA4NTYsLTQ5NS4zNzY0IDQxMC45NzU3LC01MDEuMTk2Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNzYuOTMyMiIgeT0iLTUyNS4wMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBpPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdCYjNDU7Jmd0O3RyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50JiM0NTsmZ3Q7dHI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjcxLjQwNjYsLTY2Ny42NTkxQzI2OS4yMzA5LC02NjEuOTExOSAyNjcuMTY2OSwtNjU1LjQyMiAyNjYuMDc2MywtNjQ5LjI2MjYgMjY0LjU5NTIsLTY0MC44OTc1IDI2NS4wOTY5LC02MzEuOTUwNyAyNjYuNTUwOSwtNjIzLjQ3MjgiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIyNzAuMDI4OSwtNjIzLjk0OTMgMjY4LjcyNzcsLTYxMy40MzQ3IDI2My4xODc5LC02MjIuNDY1OCAyNzAuMDI4OSwtNjIzLjk0OTMiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI3MC4zMTcyIiB5PSItNjM2LjY2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0JiM0NTsmZ3Q7dHIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTciIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50JiM0NTsmZ3Q7dHI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMjc5LjIzNjksLTY2Ni44ODE1QzI3OS4yMzY5LC02NTUuMTUwMiAyNzkuMjM2OSwtNjM5LjQ3NzQgMjc5LjIzNjksLTYyNC45ODg1Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjc5LjIzNjksLTYxNC43MjA5IDI4My43MzcsLTYyNC43MjA4IDI3OS4yMzY5LC02MTkuNzIwOSAyNzkuMjM3LC02MjQuNzIwOSAyNzkuMjM3LC02MjQuNzIwOSAyNzkuMjM3LC02MjQuNzIwOSAyNzkuMjM2OSwtNjE5LjcyMDkgMjc0LjczNywtNjI0LjcyMDkgMjc5LjIzNjksLTYxNC43MjA5IDI3OS4yMzY5LC02MTQuNzIwOSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjgzLjMxNzIiIHk9Ii02MzYuNjYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gcjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTE1IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBjeD0iMTg4LjIzNjkiIGN5PSItMjg0LjQiIHJ4PSIzNy43MDA2IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE4OC4yMzY5IiB5PSItMjgwLjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+Tk9ORTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXYmIzQ1OyZndDt0cmF2ZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyMCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXYmIzQ1OyZndDt0cmF2ZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0xODQuMjcyOSwtMzU0LjgwMDZDMTg0Ljk2MTMsLTM0Mi41NzUgMTg1Ljg3ODMsLTMyNi4yODg3IDE4Ni42NTY5LC0zMTIuNDU5OSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjE4Ny4yMTkzLC0zMDIuNDcyIDE5MS4xNDk5LC0zMTIuNzA5MiAxODYuOTM4MiwtMzA3LjQ2NDEgMTg2LjY1NzEsLTMxMi40NTYyIDE4Ni42NTcxLC0zMTIuNDU2MiAxODYuNjU3MSwtMzEyLjQ1NjIgMTg2LjkzODIsLTMwNy40NjQxIDE4Mi4xNjQyLC0zMTIuMjAzMiAxODcuMjE5MywtMzAyLjQ3MiAxODcuMjE5MywtMzAyLjQ3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTkxLjA5NDIiIHk9Ii0zMjQuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlciAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxNiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlcjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGN4PSIxOTMuMjM2OSIgY3k9Ii0xOTUuNiIgcng9IjM3LjcwMDYiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTkzLjIzNjkiIHk9Ii0xOTEuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj5OT05FPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmUmIzQ1OyZndDt0cmF2ZXIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjEiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZSYjNDU7Jmd0O3RyYXZlcjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0xODkuMjcyOSwtMjY2LjAwMDZDMTg5Ljk2MTMsLTI1My43NzUgMTkwLjg3ODMsLTIzNy40ODg3IDE5MS42NTY5LC0yMjMuNjU5OSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjE5Mi4yMTkzLC0yMTMuNjcyIDE5Ni4xNDk5LC0yMjMuOTA5MiAxOTEuOTM4MiwtMjE4LjY2NDEgMTkxLjY1NzEsLTIyMy42NTYyIDE5MS42NTcxLC0yMjMuNjU2MiAxOTEuNjU3MSwtMjIzLjY1NjIgMTkxLjkzODIsLTIxOC42NjQxIDE4Ny4xNjQyLC0yMjMuNDAzMiAxOTIuMjE5MywtMjEzLjY3MiAxOTIuMjE5MywtMjEzLjY3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTk1LjMxNzIiIHk9Ii0yMzUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gcjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlcnMgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTciIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXJzPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgY3g9IjIwMi4yMzY5IiBjeT0iLTEwNi44IiByeD0iMzcuNzAwNiIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDIuMjM2OSIgeT0iLTEwMi42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPk5PTkU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZXImIzQ1OyZndDt0cmF2ZXJzIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVyJiM0NTsmZ3Q7dHJhdmVyczwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0xOTUuMTAxNywtMTc3LjIwMDZDMTk2LjM0MDgsLTE2NC45NzUgMTk3Ljk5MTQsLTE0OC42ODg3IDE5OS4zOTMsLTEzNC44NTk5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjAwLjQwNTMsLTEyNC44NzIgMjAzLjg3MzksLTEzNS4yNzQ4IDE5OS45MDEsLTEyOS44NDY1IDE5OS4zOTY4LC0xMzQuODIxIDE5OS4zOTY4LC0xMzQuODIxIDE5OS4zOTY4LC0xMzQuODIxIDE5OS45MDEsLTEyOS44NDY1IDE5NC45MTk4LC0xMzQuMzY3MyAyMDAuNDA1MywtMTI0Ljg3MiAyMDAuNDA1MywtMTI0Ljg3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjAzLjcwOTIiIHk9Ii0xNDciIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IHM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZXJzZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxOCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlcnNlPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgY3g9IjIwMi4yMzY5IiBjeT0iLTE4IiByeD0iMzcuNzAwNiIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDIuMjM2OSIgeT0iLTEzLjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+Tk9ORTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlcnMmIzQ1OyZndDt0cmF2ZXJzZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyMyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlcnMmIzQ1OyZndDt0cmF2ZXJzZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yMDIuMjM2OSwtODguNDAwNkMyMDIuMjM2OSwtNzYuMjk0OSAyMDIuMjM2OSwtNjAuMjA3NiAyMDIuMjM2OSwtNDYuNDY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjIwMi4yMzY5LC0zNi4wNzIgMjA2LjczNywtNDYuMDcyIDIwMi4yMzY5LC00MS4wNzIgMjAyLjIzNywtNDYuMDcyIDIwMi4yMzcsLTQ2LjA3MiAyMDIuMjM3LC00Ni4wNzIgMjAyLjIzNjksLTQxLjA3MiAxOTcuNzM3LC00Ni4wNzIxIDIwMi4yMzY5LC0zNi4wNzIgMjAyLjIzNjksLTM2LjA3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjA3LjA5NDIiIHk9Ii01OC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQubTIuc3ZnIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLm0yLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTMzZGQxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLm0yLnN2ZwpAQCAtMCwwICsxLDQzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iCisgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgorPCEtLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBHZW5lcmF0ZWQgYnkgZ3JhcGh2aXogdmVyc2lvbiAyLjQwLjEgKDIwMTYxMjI1LjAzMDQpCisjIGVtYmVkZGVkIERPVCAocGxhbnR1bWwpIHdvcmtzIGluIElERUEgcHJldmlldworIyBidXQgbm90IG9uIEdpdEh1YgorYGBgcGxhbnR1bWwKK2RpZ3JhcGggRyB7CisgICAgeyByYW5rPXNhbWUgcm9vdCAtPiBzdGFydCBbc3R5bGU9aW52aXNdIH0KKyAgICBzdGFydCBbbGFiZWw9InN0YXJ0L2VuZCJdCisKKyAgICB0cmFjdG9yIFtsYWJlbCA9ICJjb250ZW50QXJyYXlbMF0iXQorICAgIHRyYWN0byBbbGFiZWwgPSAiMHgwMUIiXQorICAgIHRyYWN0IFtsYWJlbCA9ICIweDAxQSJdCisgICAgdHJhYyBbbGFiZWwgPSAiMHgwMTkiXQorICAgIHRyYSBbbGFiZWwgPSAiQ2hhaW5cbjB4MDE4Il0KKworICAgIHRyZWUgW2xhYmVsID0gImNvbnRlbnRBcnJheVsxXSJdCisgICAgdHJlIFtsYWJlbCA9ICJDaGFpblxuMHgwM0IiXQorICAgIHRyaWUgW2xhYmVsID0gImNvbnRlbnRBcnJheVsyXSJdCisgICAgdHJpIFtsYWJlbCA9ICJDaGFpblxuMHgwNUIiXQorCisgICAgdHIgW2xhYmVsID0gIlNwYXJzZVxuMHgwN0UiXQorCisgICAgdCBbbGFiZWwgPSAiMHgwOUIiXQorICAgIHJvb3QgW2xhYmVsID0gIkNoYWluXG4weDlBIl0KKworICAgIHJvb3QgLT4gdCBbbGFiZWwgPSAiIHQiXQorICAgIHQgLT4gdHIgW2xhYmVsID0gIiByIl0KKyAgICB0ciAtPiB0cmEgW2xhYmVsID0gIiBhIl0KKyAgICB0cmEgLT4gdHJhYyBbbGFiZWwgPSAiIGMiXQorICAgIHRyYWMgLT4gdHJhY3QgW2xhYmVsID0gIiB0Il0KKyAgICB0cmFjdCAtPiB0cmFjdG8gW2xhYmVsID0gIiBvIl0KKyAgICB0cmFjdG8gLT4gdHJhY3RvciBbbGFiZWwgPSAiIHIiXQorCisgICAgdHIgLT4gdHJlIFtsYWJlbCA9ICIgZSJdCisgICAgdHJlIC0+IHRyZWUgW2xhYmVsID0gIiBlIl0KKworICAgIHRyIC0+IHRyaSBbbGFiZWwgPSAiIGkiXQorICAgIHRyaSAtPiB0cmllIFtsYWJlbCA9ICIgZSJdCisKKyAgICAvLyB7cmFuaz1zYW1lIHRyYSAtPiB0cmUgLT4gdHJpIFtzdHlsZT1pbnZpc119CisgICAge3Jhbms9c2FtZSB0cmFjIC0+IHRyZWUgLT4gdHJpZSBbc3R5bGU9aW52aXNdfQorCisgICAgc3ViZ3JhcGggcGF0aCB7CisgICAgICAgIGVkZ2UgW2NvbG9yID0gImxpZ2h0Ymx1ZSI7IGZvbnRjb2xvcj0iYmx1ZSI7IGFycm93aGVhZD0idmVlIl0KKyAgICAgICAgbm9kZSBbY29sb3IgPSAiYmx1ZSI7IGZvbnRjb2xvcj0iYmx1ZSJdCisKKyAgICAgICAgc3RhcnQgLT4gcm9vdAorCisgICAgICAgIHJvb3QgLT4gdCBbbGFiZWwgPSAiIHQiXQorICAgICAgICB0IC0+IHRyIFtsYWJlbCA9ICIgciJdCisgICAgICAgIHRyIC0+IHRyYSBbbGFiZWwgPSAiIGEiXQorICAgICAgICB0cmEgLT4gdHJhdiBbbGFiZWwgPSAiIHYiXQorICAgICAgICB0cmF2IC0+IHRyYXZlIFtsYWJlbCA9ICIgZSJdCisgICAgICAgIHRyYXZlIC0+IHRyYXZlciBbbGFiZWwgPSAiIHIiXQorICAgICAgICB0cmF2ZXIgLT4gdHJhdmVycyBbbGFiZWwgPSAiIHMiXQorICAgICAgICB0cmF2ZXJzIC0+IHRyYXZlcnNlIFtsYWJlbCA9ICIgZSJdCisKKyAgICAgICAgdHJhdiBbbGFiZWwgPSAiMHgwQjgiXQorICAgICAgICB0cmF2ZSBbbGFiZWwgPSAiMHgwQjkiXQorICAgICAgICB0cmF2ZXIgW2xhYmVsID0gIjB4MEJBIl0KKyAgICAgICAgdHJhdmVycyBbbGFiZWwgPSAiMHgwQkIiXQorICAgICAgICB0cmF2ZXJzZSBbbGFiZWwgPSAiY29udGVudEFycmF5WzNdIl0KKyAgICB9CisKKyAgICB7CisgICAgICAgIGVkZ2UgW2NvbG9yID0gImJsdWUiXQorICAgICAgICB0cmF2IC0+IHRyYXZlIFtsYWJlbCA9ICIgZSJdCisgICAgICAgIHRyYXZlIC0+IHRyYXZlciBbbGFiZWwgPSAiIHIiXQorICAgICAgICB0cmF2ZXIgLT4gdHJhdmVycyBbbGFiZWwgPSAiIHMiXQorICAgICAgICB0cmF2ZXJzIC0+IHRyYXZlcnNlIFtsYWJlbCA9ICIgZSJdCisgICAgfQorCisgICAgc3ViZ3JhcGggYmFjayB7CisgICAgICAgIGVkZ2UgW2NvbG9yID0gInBpbmsiOyBmb250Y29sb3I9InJlZCI7IGFycm93aGVhZD0idmVlIjsgY29uc3RyYWluPSJmYWxzZSJdCisKKyAgICAgICAgdHJhdmVyc2UgLT4gdHJhdmVycyBbbGFiZWwgPSAiIH4zIl0KKyAgICAgICAgdHJhdmVycyAtPiB0cmF2ZXIgW2xhYmVsID0gIjB4MEJCIl0KKyAgICAgICAgdHJhdmVyIC0+IHRyYXZlIFtsYWJlbCA9ICIweDBCQSJdCisgICAgICAgIHRyYXZlIC0+IHRyYXYgW2xhYmVsID0gIjB4MEI5Il0KKyAgICAgICAgdHJhdiAtPiB0cmEgW2xhYmVsID0gIjB4MEI4Il0KKyAgICB9Cit9CitgYGAKKyAtLT4KKzwhLS0gVGl0bGU6IEcgUGFnZXM6IDEgLS0+Cis8c3ZnIHdpZHRoPSI1NzRwdCIgaGVpZ2h0PSI4MjNwdCIKKyAgICAgdmlld0JveD0iMC4wMCAwLjAwIDU3NC40NyA4MjIuODkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgorICAgIDxnIGlkPSJncmFwaDAiIGNsYXNzPSJncmFwaCIgdHJhbnNmb3JtPSJzY2FsZSgxIDEpIHJvdGF0ZSgwKSB0cmFuc2xhdGUoNCA4MTguODkzOSkiPgorICAgICAgICA8dGl0bGU+RzwvdGl0bGU+CisgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0idHJhbnNwYXJlbnQiIHBvaW50cz0iLTQsNCAtNCwtODE4Ljg5MzkgNTcwLjQ3MzgsLTgxOC44OTM5IDU3MC40NzM4LDQgLTQsNCIvPgorICAgICAgICA8IS0tIHJvb3QgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnJvb3Q8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjg5LjIzNjkiIGN5PSItNzg1LjQ3ODIiIHJ4PSIzMy4xMzM3IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjg5LjIzNjkiIHk9Ii03ODkuNjc4MiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI4OS4yMzY5IiB5PSItNzcyLjg3ODIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHg5QTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHN0YXJ0IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTIiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT5zdGFydDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI0MDIuMjM2OSIgY3k9Ii03ODUuNDc4MiIgcng9IjQ0LjA3NzUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDAyLjIzNjkiIHk9Ii03ODEuMjc4MiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5zdGFydC9lbmQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSByb290JiM0NTsmZ3Q7c3RhcnQgLS0+CisgICAgICAgIDwhLS0gdCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnQ8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjg5LjIzNjkiIGN5PSItNjg1LjI2MjYiIHJ4PSIzNi41ODI0IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI4OS4yMzY5IiB5PSItNjgxLjA2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwOUI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSByb290JiM0NTsmZ3Q7dCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+cm9vdCYjNDU7Jmd0O3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjc5LjMzNjgsLTc1Ny4wODI0QzI3Ni42MTA0LC03NDUuOTM2OCAyNzQuODc5NCwtNzMzLjAyMTEgMjc2Ljg0NjMsLTcyMS4yNjI2IDI3Ny4zMjY4LC03MTguMzkgMjc4LjAwOSwtNzE1LjQzOTggMjc4LjgwOTEsLTcxMi41MjM4Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjgyLjE3MzIsLTcxMy40OTQgMjgxLjg2MjcsLTcwMi45MDM3IDI3NS41MDEyLC03MTEuMzc2MiAyODIuMTczMiwtNzEzLjQ5NCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjgwLjkzMjIiIHk9Ii03MjUuNDYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gdDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHJvb3QmIzQ1OyZndDt0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE2IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+cm9vdCYjNDU7Jmd0O3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMjg5LjIzNjksLTc1NS45NTIyQzI4OS4yMzY5LC03NDIuNDY3MSAyODkuMjM2OSwtNzI2LjU3NDkgMjg5LjIzNjksLTcxMy4yNzc5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjg5LjIzNjksLTcwMy4yNjU5IDI5My43MzcsLTcxMy4yNjU5IDI4OS4yMzY5LC03MDguMjY1OSAyODkuMjM3LC03MTMuMjY1OSAyODkuMjM3LC03MTMuMjY1OSAyODkuMjM3LC03MTMuMjY1OSAyODkuMjM2OSwtNzA4LjI2NTkgMjg0LjczNywtNzEzLjI2NTkgMjg5LjIzNjksLTcwMy4yNjU5IDI4OS4yMzY5LC03MDMuMjY1OSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjkyLjkzMjIiIHk9Ii03MjUuNDYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gdDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHN0YXJ0JiM0NTsmZ3Q7cm9vdCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnN0YXJ0JiM0NTsmZ3Q7cm9vdDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0zNzcuNjExMiwtODAwLjUxODVDMzYwLjczNDgsLTgwNy45NTM3IDM0My44NTg1LC04MDkuNDgzOSAzMjYuOTgyMSwtODA1LjEwOSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjMxNy4wNDU1LC04MDEuODUwOCAzMjcuOTQ5OCwtODAwLjY5MDcgMzIxLjc5NjYsLTgwMy40MDg3IDMyNi41NDc3LC04MDQuOTY2NyAzMjYuNTQ3NywtODA0Ljk2NjcgMzI2LjU0NzcsLTgwNC45NjY3IDMyMS43OTY2LC04MDMuNDA4NyAzMjUuMTQ1NiwtODA5LjI0MjcgMzE3LjA0NTUsLTgwMS44NTA4IDMxNy4wNDU1LC04MDEuODUwOCIvPgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3RvciAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUzIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvcjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI3My4yMzY5IiBjeT0iLTEwNi44IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3My4yMzY5IiB5PSItMTAyLjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzBdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3RvIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTQiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdG88L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iOTEuMjM2OSIgY3k9Ii0xOTUuNiIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iOTEuMjM2OSIgeT0iLTE5MS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDFCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3RvJiM0NTsmZ3Q7dHJhY3RvciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U4IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvJiM0NTsmZ3Q7dHJhY3RvcjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik04Ny41OTQzLC0xNzcuNjNDODUuMTIyMSwtMTY1LjQzMzggODEuODAyLC0xNDkuMDU0MyA3OC45NzcyLC0xMzUuMTE4NyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjgyLjM1MjgsLTEzNC4xNTM0IDc2LjkzNTgsLTEyNS4wNDgxIDc1LjQ5MjMsLTEzNS41NDQxIDgyLjM1MjgsLTEzNC4xNTM0Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI4OC4zMTcyIiB5PSItMTQ3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3QgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjkyLjIzNjkiIGN5PSItMjg0LjQiIHJ4PSIzNy4xNDQzIiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjkyLjIzNjkiIHk9Ii0yODAuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxQTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0JiM0NTsmZ3Q7dHJhY3RvIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTciIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdCYjNDU7Jmd0O3RyYWN0bzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik05Mi4wMjk3LC0yNjYuMDAwNkM5MS44OTM0LC0yNTMuODk0OSA5MS43MTIyLC0yMzcuODA3NiA5MS41NTc1LC0yMjQuMDY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9Ijk1LjA1MjksLTIyMy42MzE5IDkxLjQ0MDQsLTIxMy42NzIgODguMDUzMywtMjIzLjcxMDggOTUuMDUyOSwtMjIzLjYzMTkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijk3LjQ4NjkiIHk9Ii0yMzUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gbzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWMgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWM8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iOTMuMjM2OSIgY3k9Ii0zNzMuMiIgcng9IjM1LjM1ODciIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iOTMuMjM2OSIgeT0iLTM2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxOTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWMmIzQ1OyZndDt0cmFjdCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U2IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhYyYjNDU7Jmd0O3RyYWN0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTkzLjAyOTcsLTM1NC44MDA2QzkyLjg5MzQsLTM0Mi42OTQ5IDkyLjcxMjIsLTMyNi42MDc2IDkyLjU1NzUsLTMxMi44Njc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iOTYuMDUyOSwtMzEyLjQzMTkgOTIuNDQwNCwtMzAyLjQ3MiA4OS4wNTMzLC0zMTIuNTEwOCA5Ni4wNTI5LC0zMTIuNDMxOSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iOTYuOTMyMiIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiB0PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU4IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzMTEuMjM2OSIgY3k9Ii0zNzMuMiIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzExLjIzNjkiIHk9Ii0zNjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzFdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhYyYjNDU7Jmd0O3RyZWUgLS0+CisgICAgICAgIDwhLS0gdHJhIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTciIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmE8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjE5LjIzNjkiIGN5PSItNDczLjQxNTYiIHJ4PSIzNi4xMjUiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTkuMjM2OSIgeT0iLTQ3Ny42MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE5LjIzNjkiIHk9Ii00NjAuODE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxODwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYSYjNDU7Jmd0O3RyYWMgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYSYjNDU7Jmd0O3RyYWM8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMTkxLjE0NjEsLTQ1NC40NzJDMTc5LjAzOTQsLTQ0Ni4wNDgyIDE2NC44NTg0LC00MzUuODI4NiAxNTIuNTIyMywtNDI2IDE0MC43NTM5LC00MTYuNjIzNyAxMjguMjQxLC00MDUuNjQyMiAxMTcuNzU4OSwtMzk2LjEyOTgiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIxMTkuOTIzNCwtMzkzLjM2NiAxMTAuMTg1LC0zODkuMTkyOCAxMTUuMTk1NCwtMzk4LjUyODEgMTE5LjkyMzQsLTM5My4zNjYiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE1OC4wOTQyIiB5PSItNDEzLjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTE0IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGN4PSIxODMuMjM2OSIgY3k9Ii0zNzMuMiIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTgzLjIzNjkiIHk9Ii0zNjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+MHgwQjg8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmEmIzQ1OyZndDt0cmF2IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE5IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhJiM0NTsmZ3Q7dHJhdjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yMTcuNTY1MiwtNDQzLjg2MThDMjE2LjE4NDgsLTQzMi42ODYyIDIxMy42OTc5LC00MjAuMDUzMiAyMDkuMjM2OSwtNDA5LjIgMjA3LjY5ODEsLTQwNS40NTY0IDIwNS42OTcsLTQwMS43MzQyIDIwMy40ODc5LC0zOTguMTgyIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMTk3LjcxMywtMzg5Ljc4NzMgMjA3LjA4ODEsLTM5NS40NzU3IDIwMC41NDY4LC0zOTMuOTA2NyAyMDMuMzgwNywtMzk4LjAyNjEgMjAzLjM4MDcsLTM5OC4wMjYxIDIwMy4zODA3LC0zOTguMDI2MSAyMDAuNTQ2OCwtMzkzLjkwNjcgMTk5LjY3MzIsLTQwMC41NzY2IDE5Ny43MTMsLTM4OS43ODczIDE5Ny43MTMsLTM4OS43ODczIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTkuNDg2OSIgeT0iLTQxMy40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiB2PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyaWU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNDkzLjIzNjkiIGN5PSItMzczLjIiIHJ4PSI3My40NzQ1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQ5My4yMzY5IiB5PSItMzY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVsyXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZWUmIzQ1OyZndDt0cmllIC0tPgorICAgICAgICA8IS0tIHRyZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU5IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjMxMS4yMzY5IiBjeT0iLTQ3My40MTU2IiByeD0iMzcuOTMwNiIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMxMS4yMzY5IiB5PSItNDc3LjYxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMTEuMjM2OSIgeT0iLTQ2MC44MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDNCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlJiM0NTsmZ3Q7dHJlZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyZSYjNDU7Jmd0O3RyZWU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMzExLjIzNjksLTQ0My44ODk3QzMxMS4yMzY5LC00MzAuNDA0NiAzMTEuMjM2OSwtNDE0LjUxMjMgMzExLjIzNjksLTQwMS4yMTUzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMzE0LjczNywtNDAxLjIwMzMgMzExLjIzNjksLTM5MS4yMDMzIDMwNy43MzcsLTQwMS4yMDM0IDMxNC43MzcsLTQwMS4yMDMzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMTYuMDk0MiIgeT0iLTQxMy40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTExIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjQ0OC4yMzY5IiBjeT0iLTQ3My40MTU2IiByeD0iMzcuOTMwNiIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQ0OC4yMzY5IiB5PSItNDc3LjYxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0NDguMjM2OSIgeT0iLTQ2MC44MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDVCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpJiM0NTsmZ3Q7dHJpZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyaSYjNDU7Jmd0O3RyaWU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNNDYwLjc3MTksLTQ0NS41QzQ2Ny4xMTA5LC00MzEuMzgzIDQ3NC43NzIzLC00MTQuMzIwOSA0ODEuMDYwMywtNDAwLjMxNzUiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI0ODQuMjU3NSwtNDAxLjc0MTUgNDg1LjE2MDksLTM5MS4xODUyIDQ3Ny44NzE3LC0zOTguODc0IDQ4NC4yNTc1LC00MDEuNzQxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDgwLjA5NDIiIHk9Ii00MTMuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEyIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHI8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjg5LjIzNjkiIGN5PSItNTg1LjA0NjkiIHJ4PSIzNy45MDI3IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjg5LjIzNjkiIHk9Ii01ODkuMjQ2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5TcGFyc2U8L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyODkuMjM2OSIgeT0iLTU3Mi40NDY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDdFPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0cmEgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJhPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTI2Mi4zNTE2LC01NjQuMDIwMUMyNTQuMDg2LC01NTYuNDQ0NCAyNDUuNTgwMywtNTQ3LjM0NzUgMjM5LjUyMjMsLTUzNy42MzEzIDIzNC43MTMzLC01MjkuOTE4NCAyMzAuOTU0NCwtNTIwLjk2NzkgMjI4LjA1MTIsLTUxMi4yNDI4Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjMxLjM3LC01MTEuMTI1NiAyMjUuMTI2NywtNTAyLjU2NTcgMjI0LjY2OTIsLTUxMy4xNTA2IDIzMS4zNywtNTExLjEyNTYiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI0NS4wOTQyIiB5PSItNTI1LjAzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyYSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxOCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJhPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTI3Mi43MzY2LC01NTguNDY0M0MyNjUuNTM4NCwtNTQ2Ljg5MTcgMjU2Ljk4ODcsLTUzMy4xNzkgMjQ5LjIzNjksLTUyMC44MzEzIDI0Ni43MTUyLC01MTYuODE0NSAyNDQuMDY3NSwtNTEyLjYxMDUgMjQxLjQzMzEsLTUwOC40MzU5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjM2LjA4ODYsLTQ5OS45NzczIDI0NS4yMzQ0LC01MDYuMDI3NSAyMzguNzU5NCwtNTA0LjIwNDMgMjQxLjQzMDIsLTUwOC40MzEyIDI0MS40MzAyLC01MDguNDMxMiAyNDEuNDMwMiwtNTA4LjQzMTIgMjM4Ljc1OTQsLTUwNC4yMDQzIDIzNy42MjU5LC01MTAuODM0OSAyMzYuMDg4NiwtNDk5Ljk3NzMgMjM2LjA4ODYsLTQ5OS45NzczIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNjQuMDk0MiIgeT0iLTUyNS4wMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiBhPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0cmUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlOSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTI5NS4wMTcxLC01NTUuNzE3MUMyOTcuNjE5MiwtNTQyLjUxMzggMzAwLjcyODYsLTUyNi43MzY0IDMwMy41MjU2LC01MTIuNTQ0MSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjMwNi45OTU1LC01MTMuMDM3NiAzMDUuNDk1MywtNTAyLjU0OTYgMzAwLjEyNzYsLTUxMS42ODQxIDMwNi45OTU1LC01MTMuMDM3NiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzA3LjA5NDIiIHk9Ii01MjUuMDMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJpIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTExIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmk8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMzE3LjI5NjksLTU2NS4zNDY1QzM0My41NTQ5LC01NDYuOTExMSAzODIuOTMzNCwtNTE5LjI2NDIgNDExLjY0NzgsLTQ5OS4xMDQzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNDE0LjAxNzMsLTUwMS43MTcyIDQyMC4xOTA0LC00OTMuMTA2NiA0MDkuOTk1LC00OTUuOTg4MiA0MTQuMDE3MywtNTAxLjcxNzIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM4MS45MzIyIiB5PSItNTI1LjAzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGk8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0JiM0NTsmZ3Q7dHIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnQmIzQ1OyZndDt0cjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yODEuNDA2NiwtNjY3LjY1OTFDMjc5LjIzMDksLTY2MS45MTE5IDI3Ny4xNjY5LC02NTUuNDIyIDI3Ni4wNzYzLC02NDkuMjYyNiAyNzQuNTk1MiwtNjQwLjg5NzUgMjc1LjA5NjksLTYzMS45NTA3IDI3Ni41NTA5LC02MjMuNDcyOCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjI4MC4wMjg5LC02MjMuOTQ5MyAyNzguNzI3NywtNjEzLjQzNDcgMjczLjE4NzksLTYyMi40NjU4IDI4MC4wMjg5LC02MjMuOTQ5MyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjgwLjMxNzIiIHk9Ii02MzYuNjYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gcjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHQmIzQ1OyZndDt0ciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnQmIzQ1OyZndDt0cjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yODkuMjM2OSwtNjY2Ljg4MTVDMjg5LjIzNjksLTY1NS4xNTAyIDI4OS4yMzY5LC02MzkuNDc3NCAyODkuMjM2OSwtNjI0Ljk4ODUiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyODkuMjM2OSwtNjE0LjcyMDkgMjkzLjczNywtNjI0LjcyMDggMjg5LjIzNjksLTYxOS43MjA5IDI4OS4yMzcsLTYyNC43MjA5IDI4OS4yMzcsLTYyNC43MjA5IDI4OS4yMzcsLTYyNC43MjA5IDI4OS4yMzY5LC02MTkuNzIwOSAyODQuNzM3LC02MjQuNzIwOSAyODkuMjM2OSwtNjE0LjcyMDkgMjg5LjIzNjksLTYxNC43MjA5Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyOTMuMzE3MiIgeT0iLTYzNi42NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdiYjNDU7Jmd0O3RyYSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UzMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXYmIzQ1OyZndDt0cmE8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMTcyLjEzMjUsLTM5MC43MTk2QzE2Ni45NTc2LC00MDEuMTkzOCAxNjIuOTI1LC00MTQuNjMxOSAxNjcuOTAwMywtNDI2IDE3MS40MzE1LC00MzQuMDY4NiAxNzcuMDg4MSwtNDQxLjM3MzkgMTgzLjM4MDgsLTQ0Ny43Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMTkwLjk3MDcsLTQ1NC42NjM3IDE4MC41NTk5LC00NTEuMjE5IDE4Ny4yODY0LC00NTEuMjgzNCAxODMuNjAyMSwtNDQ3LjkwMzEgMTgzLjYwMjEsLTQ0Ny45MDMxIDE4My42MDIxLC00NDcuOTAzMSAxODcuMjg2NCwtNDUxLjI4MzQgMTg2LjY0NDQsLTQ0NC41ODczIDE5MC45NzA3LC00NTQuNjYzNyAxOTAuOTcwNywtNDU0LjY2MzciLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE4Ni45MDUyIiB5PSItNDEzLjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2ZmMDAwMCI+MHgwQjg8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxNSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgY3g9IjE4OS4yMzY5IiBjeT0iLTI4NC40IiByeD0iMzYuNTgyNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxODkuMjM2OSIgeT0iLTI4MC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPjB4MEI5PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdiYjNDU7Jmd0O3RyYXZlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIwIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdiYjNDU7Jmd0O3RyYXZlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTIwNi4wMDQsLTM1OS4wMDEyQzIxMy4yMTk0LC0zNTMuMjEwMiAyMjAuMzMwMSwtMzQ1LjgyOTQgMjI0LjIzNjksLTMzNy4yIDIyOC45Mzc4LC0zMjYuODE2NCAyMjQuMDk1OSwtMzE2LjE4NjQgMjE2LjY2NzUsLTMwNy4yMTE0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjA5LjY0ODUsLTI5OS43OTggMjE5Ljc5MTUsLTMwMy45NjU3IDIxMy4wODYxLC0zMDMuNDI4OCAyMTYuNTIzOCwtMzA3LjA1OTYgMjE2LjUyMzgsLTMwNy4wNTk2IDIxNi41MjM4LC0zMDcuMDU5NiAyMTMuMDg2MSwtMzAzLjQyODggMjEzLjI1NjEsLTMxMC4xNTM1IDIwOS42NDg1LC0yOTkuNzk4IDIwOS42NDg1LC0yOTkuNzk4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMzEuMDk0MiIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdiYjNDU7Jmd0O3RyYXZlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTI0IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdiYjNDU7Jmd0O3RyYXZlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgZD0iTTE2NS45MjM5LC0zNTcuMDI3MUMxNTcuMTYyNiwtMzQ2LjgxMTMgMTQ5LjM2NzIsLTMzMy4xNzI1IDE1NC41MjIzLC0zMjAuNCAxNTYuMzc0NiwtMzE1LjgxMDcgMTU5LjEyMywtMzExLjQ4MDMgMTYyLjI3NjcsLTMwNy41MjExIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMGZmIiBzdHJva2U9IiMwMDAwZmYiIHBvaW50cz0iMTY1LjAyMjMsLTMwOS43MDQyIDE2OS4xNjIsLTI5OS45NTE1IDE1OS44NDQsLTMwNC45OTQgMTY1LjAyMjMsLTMwOS43MDQyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNjAuMDk0MiIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmUmIzQ1OyZndDt0cmF2IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTMxIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmUmIzQ1OyZndDt0cmF2PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTE4NS4zOTI2LC0zMDIuNjMyNUMxODQuMzY5NSwtMzA4LjI5ODUgMTgzLjQwODMsLTMxNC41ODM3IDE4Mi45MDAzLC0zMjAuNCAxODIuMjA5NCwtMzI4LjMxMDcgMTgyLjAyNDYsLTMzNi45MTM0IDE4Mi4wODI1LC0zNDQuODMzOSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjE4Mi4yODcyLC0zNTUuMDgyOSAxNzcuNTg4MywtMzQ1LjE3NDggMTgyLjE4NzMsLTM1MC4wODM5IDE4Mi4wODc0LC0zNDUuMDg0OSAxODIuMDg3NCwtMzQ1LjA4NDkgMTgyLjA4NzQsLTM0NS4wODQ5IDE4Mi4xODczLC0zNTAuMDgzOSAxODYuNTg2NSwtMzQ0Ljk5NSAxODIuMjg3MiwtMzU1LjA4MjkgMTgyLjI4NzIsLTM1NS4wODI5Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDEuOTA1MiIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNmZjAwMDAiPjB4MEI5PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmVyIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTE2IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVyPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgY3g9IjE5NC4yMzY5IiBjeT0iLTE5NS42IiByeD0iMzguODY3MSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxOTQuMjM2OSIgeT0iLTE5MS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPjB4MEJBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmUmIzQ1OyZndDt0cmF2ZXIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjEiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZSYjNDU7Jmd0O3RyYXZlcjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yMTMuMDg5OCwtMjcwLjQxNTRDMjIwLjY1NDksLTI2NC42NDQ2IDIyOC4xMTczLC0yNTcuMjIxNyAyMzIuMjM2OSwtMjQ4LjQgMjM3LjI3NjksLTIzNy42MDczIDIzMS43MTQyLC0yMjYuNzQ1NiAyMjMuNDI5NywtMjE3LjcwMzYiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyMTYuMDAzNSwtMjEwLjU3NzggMjI2LjMzNDcsLTIxNC4yNTQ1IDIxOS42MTEzLC0yMTQuMDM5NiAyMjMuMjE5LC0yMTcuNTAxNSAyMjMuMjE5LC0yMTcuNTAxNSAyMjMuMjE5LC0yMTcuNTAxNSAyMTkuNjExMywtMjE0LjAzOTYgMjIwLjEwMzQsLTIyMC43NDg1IDIxNi4wMDM1LC0yMTAuNTc3OCAyMTYuMDAzNSwtMjEwLjU3NzgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIzOC4zMTcyIiB5PSItMjM1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZSYjNDU7Jmd0O3RyYXZlciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyNSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlJiM0NTsmZ3Q7dHJhdmVyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgZD0iTTE3Mi44NzgyLC0yNjguMTg1MUMxNjQuNTk3NiwtMjU3Ljk1MzQgMTU3LjIyNDgsLTI0NC4zMTI4IDE2Mi4wNzYzLC0yMzEuNiAxNjMuNzAwMSwtMjI3LjM0NDkgMTY2LjA4MzgsLTIyMy4yNzQxIDE2OC44MzE1LC0yMTkuNTAxMSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDBmZiIgc3Ryb2tlPSIjMDAwMGZmIiBwb2ludHM9IjE3MS41NjY4LC0yMjEuNjg1OSAxNzUuMjc0NywtMjExLjc2MSAxNjYuMTg2OSwtMjE3LjIwNzQgMTcxLjU2NjgsLTIyMS42ODU5Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNjYuMzE3MiIgeT0iLTIzNS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmVyJiM0NTsmZ3Q7dHJhdmUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMzAiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXImIzQ1OyZndDt0cmF2ZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0xOTAuMzI4LC0yMTMuODI5OEMxODkuMjg3NywtMjE5LjQ5NTcgMTg4LjMxMDMsLTIyNS43ODE1IDE4Ny43OTM3LC0yMzEuNiAxODcuMDkxMiwtMjM5LjUxMjUgMTg3LjAyOTQsLTI0OC4xMTU3IDE4Ny4yNTUxLC0yNTYuMDM2MyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjE4Ny43MDc5LC0yNjYuMjg0OSAxODIuNzcwOCwtMjU2LjQ5MzQgMTg3LjQ4NzEsLTI2MS4yODk4IDE4Ny4yNjY0LC0yNTYuMjk0NyAxODcuMjY2NCwtMjU2LjI5NDcgMTg3LjI2NjQsLTI1Ni4yOTQ3IDE4Ny40ODcxLC0yNjEuMjg5OCAxOTEuNzYyLC0yNTYuMDk2IDE4Ny43MDc5LC0yNjYuMjg0OSAxODcuNzA3OSwtMjY2LjI4NDkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwOC40NTg1IiB5PSItMjM1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2ZmMDAwMCI+MHgwQkE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZXJzIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTE3IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVyczwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGN4PSIyMDMuMjM2OSIgY3k9Ii0xMDYuOCIgcng9IjM4LjMwNSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDMuMjM2OSIgeT0iLTEwMi42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPjB4MEJCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmVyJiM0NTsmZ3Q7dHJhdmVycyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlciYjNDU7Jmd0O3RyYXZlcnM8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMjE5LjY0ODUsLTE4MS40ODY0QzIyNy4zOTk2LC0xNzUuNzgzOSAyMzQuOTg5NiwtMTY4LjQzNzEgMjM5LjIzNjksLTE1OS42IDI0NC4yNjgyLC0xNDkuMTMxNyAyMzkuMTY0NCwtMTM4LjM5NTQgMjMxLjM3MzIsLTEyOS4zNjEiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyMjQuMzYwMSwtMTIyLjIxNTYgMjM0LjU3NjQsLTEyNi4yMDAzIDIyNy44NjI0LC0xMjUuNzg0IDIzMS4zNjQ4LC0xMjkuMzUyNCAyMzEuMzY0OCwtMTI5LjM1MjQgMjMxLjM2NDgsLTEyOS4zNTI0IDIyNy44NjI0LC0xMjUuNzg0IDIyOC4xNTMyLC0xMzIuNTA0NiAyMjQuMzYwMSwtMTIyLjIxNTYgMjI0LjM2MDEsLTEyMi4yMTU2Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNDUuNzA5MiIgeT0iLTE0NyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gczwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlciYjNDU7Jmd0O3RyYXZlcnMgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjYiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXImIzQ1OyZndDt0cmF2ZXJzPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgZD0iTTE3Ny43NDAzLC0xNzkuMjcyMkMxNjkuNDI0NiwtMTY4Ljk5ODEgMTYyLjA5ODYsLTE1NS4zNTI0IDE2Ny4yOTIzLC0xNDIuOCAxNjkuMjY3NywtMTM4LjAyNTggMTcyLjIxNzMsLTEzMy41NTM2IDE3NS41OTI2LC0xMjkuNDk0OCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDBmZiIgc3Ryb2tlPSIjMDAwMGZmIiBwb2ludHM9IjE3OC4xMzY0LC0xMzEuODk4OCAxODIuNDY0MiwtMTIyLjIyODIgMTczLjA1MDMsLTEyNy4wODkyIDE3OC4xMzY0LC0xMzEuODk4OCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTcyLjcwOTIiIHk9Ii0xNDciIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZXJzJiM0NTsmZ3Q7dHJhdmVyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTI5IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVycyYjNDU7Jmd0O3RyYXZlcjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0xOTguNjczNCwtMTI1LjAwNTFDMTk3LjQzODIsLTEzMC42Njk5IDE5Ni4yNTMzLC0xMzYuOTYxNCAxOTUuNTYzNywtMTQyLjggMTk0LjYzMiwtMTUwLjY4ODMgMTk0LjE3ODksLTE1OS4yODM4IDE5My45ODczLC0xNjcuMjA0NiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjE5My44Njc1LC0xNzcuNDU3NyAxODkuNDg0NywtMTY3LjQwNTggMTkzLjkyNTksLTE3Mi40NTgxIDE5My45ODQ0LC0xNjcuNDU4NCAxOTMuOTg0NCwtMTY3LjQ1ODQgMTkzLjk4NDQsLTE2Ny40NTg0IDE5My45MjU5LC0xNzIuNDU4MSAxOTguNDg0MSwtMTY3LjUxMSAxOTMuODY3NSwtMTc3LjQ1NzcgMTkzLjg2NzUsLTE3Ny40NTc3Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTYuMDczNSIgeT0iLTE0NyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj4weDBCQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlcnNlIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTE4IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVyc2U8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBjeD0iMjAzLjIzNjkiIGN5PSItMTgiIHJ4PSI3My40NzQ1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwMy4yMzY5IiB5PSItMTMuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj5jb250ZW50QXJyYXlbM108L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZXJzJiM0NTsmZ3Q7dHJhdmVyc2UgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXJzJiM0NTsmZ3Q7dHJhdmVyc2U8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMTg0Ljg2NzYsLTkwLjk1NjlDMTc5LjUxMzUsLTg1LjIxMzIgMTc0LjM0NzQsLTc4LjI4MDUgMTcxLjUyMjMsLTcwLjggMTY4Ljg4NDMsLTYzLjgxNDkgMTY4Ljg4NDMsLTYwLjk4NTEgMTcxLjUyMjMsLTU0IDE3Mi44NjY4LC01MC40Mzk5IDE3NC43NDE1LC00Ny4wMDQgMTc2LjkxNDQsLTQzLjc2MTIiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIxODMuMjAzLC0zNS42NzYgMTgwLjYxNTUsLTQ2LjMzMjMgMTgwLjEzMzIsLTM5LjYyMjcgMTc3LjA2MzQsLTQzLjU2OTUgMTc3LjA2MzQsLTQzLjU2OTUgMTc3LjA2MzQsLTQzLjU2OTUgMTgwLjEzMzIsLTM5LjYyMjcgMTczLjUxMTQsLTQwLjgwNjcgMTgzLjIwMywtMzUuNjc2IDE4My4yMDMsLTM1LjY3NiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTc3LjA5NDIiIHk9Ii01OC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmVycyYjNDU7Jmd0O3RyYXZlcnNlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTI3IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVycyYjNDU7Jmd0O3RyYXZlcnNlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgZD0iTTIwMy4yMzY5LC04OC40MDA2QzIwMy4yMzY5LC03Ni4yOTQ5IDIwMy4yMzY5LC02MC4yMDc2IDIwMy4yMzY5LC00Ni40Njc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMGZmIiBzdHJva2U9IiMwMDAwZmYiIHBvaW50cz0iMjA2LjczNywtNDYuMDcyIDIwMy4yMzY5LC0zNi4wNzIgMTk5LjczNywtNDYuMDcyMSAyMDYuNzM3LC00Ni4wNzIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwOC4wOTQyIiB5PSItNTguMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlcnNlJiM0NTsmZ3Q7dHJhdmVycyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyOCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlcnNlJiM0NTsmZ3Q7dHJhdmVyczwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0yMDkuOTAyNCwtMzYuMDcyMkMyMTEuNjc4MiwtNDEuNzMxNyAyMTMuMzQ4NywtNDguMDUzNSAyMTQuMjM2OSwtNTQgMjE1LjMzOTksLTYxLjM4NDcgMjE1LjMzOTksLTYzLjQxNTMgMjE0LjIzNjksLTcwLjggMjEzLjgzNDQsLTczLjQ5NDUgMjEzLjI3MTMsLTc2LjI2NjEgMjEyLjYxMDYsLTc5LjAxODEiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIyMDkuOTAyNCwtODguNzI3OCAyMDguMjU0NiwtNzcuODg2NCAyMTEuMjQ1OCwtODMuOTExNiAyMTIuNTg5MSwtNzkuMDk1NCAyMTIuNTg5MSwtNzkuMDk1NCAyMTIuNTg5MSwtNzkuMDk1NCAyMTEuMjQ1OCwtODMuOTExNiAyMTYuOTIzNywtODAuMzA0NCAyMDkuOTAyNCwtODguNzI3OCAyMDkuOTAyNCwtODguNzI3OCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjI0LjI3MzIiIHk9Ii01OC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNmZjAwMDAiPiB+MzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgIDwvZz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLm0zLnN2ZyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC5tMy5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxMTE0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC5tMy5zdmcKQEAgLTAsMCArMSw1MDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIgorICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KKzwhLS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gR2VuZXJhdGVkIGJ5IGdyYXBodml6IHZlcnNpb24gMi40MC4xICgyMDE2MTIyNS4wMzA0KQorIyBlbWJlZGRlZCBET1QgKHBsYW50dW1sKSB3b3JrcyBpbiBJREVBIHByZXZpZXcKKyMgYnV0IG5vdCBvbiBHaXRIdWIKK2BgYHBsYW50dW1sCitkaWdyYXBoIEcgeworICAgIHsgcmFuaz1zYW1lIHJvb3QgLT4gc3RhcnQgW3N0eWxlPWludmlzXSB9CisgICAgc3RhcnQgW2xhYmVsPSJzdGFydC9lbmQiXQorCisgICAgdHJhY3RvciBbbGFiZWwgPSAiY29udGVudEFycmF5WzBdIl0KKyAgICB0cmFjdG8gW2xhYmVsID0gIjB4MDFCIl0KKyAgICB0cmFjdCBbbGFiZWwgPSAiMHgwMUEiXQorICAgIHRyYWMgW2xhYmVsID0gIjB4MDE5Il0KKyAgICB0cmEgW2xhYmVsID0gIkNoYWluXG4weDAxOCI7IGNvbG9yID0gImxpZ2h0Z3JleSI7IGZvbnRjb2xvciA9IGxpZ2h0Z3JheV0KKworICAgIHRyZWUgW2xhYmVsID0gImNvbnRlbnRBcnJheVsxXSJdCisgICAgdHJlIFtsYWJlbCA9ICJDaGFpblxuMHgwM0IiXQorICAgIHRyaWUgW2xhYmVsID0gImNvbnRlbnRBcnJheVsyXSJdCisgICAgdHJpIFtsYWJlbCA9ICJDaGFpblxuMHgwNUIiXQorCisgICAgdHIgW2xhYmVsID0gIlNwYXJzZVxuMHgwN0UiXQorCisgICAgdCBbbGFiZWwgPSAiMHgwOUIiXQorICAgIHJvb3QgW2xhYmVsID0gIkNoYWluXG4weDlBIl0KKworICAgIHJvb3QgLT4gdCBbbGFiZWwgPSAiIHQiXQorICAgIHQgLT4gdHIgW2xhYmVsID0gIiByIl0KKyAgICB0cmFjIC0+IHRyYWN0IFtsYWJlbCA9ICIgdCJdCisgICAgdHJhY3QgLT4gdHJhY3RvIFtsYWJlbCA9ICIgbyJdCisgICAgdHJhY3RvIC0+IHRyYWN0b3IgW2xhYmVsID0gIiByIl0KKworICAgIHRyIC0+IHRyYSBbbGFiZWwgPSAiIGEiOyBjb2xvciA9ICJsaWdodGdyZXkiOyBmb250Y29sb3IgPSBsaWdodGdyYXldCisgICAgdHJhIC0+IHRyYWMgW2xhYmVsID0gIiBjIjsgY29sb3IgPSAibGlnaHRncmV5IjsgZm9udGNvbG9yID0gbGlnaHRncmF5XQorCisgICAgdHIgLT4gdHJlIFtsYWJlbCA9ICIgZSJdCisgICAgdHJlIC0+IHRyZWUgW2xhYmVsID0gIiBlIl0KKworICAgIHRyIC0+IHRyaSBbbGFiZWwgPSAiIGkiXQorICAgIHRyaSAtPiB0cmllIFtsYWJlbCA9ICIgZSJdCisKKyAgICBzdWJncmFwaCBwYXRoIHsKKyAgICAgICAgZWRnZSBbY29sb3IgPSAibGlnaHRibHVlIjsgZm9udGNvbG9yPSJibHVlIjsgYXJyb3doZWFkPSJ2ZWUiXQorICAgICAgICBub2RlIFtjb2xvciA9ICJibHVlIjsgZm9udGNvbG9yPSJibHVlIl0KKworICAgICAgICBzdGFydCAtPiByb290CisKKyAgICAgICAgcm9vdCAtPiB0IFtsYWJlbCA9ICIgdCJdCisgICAgICAgIHQgLT4gdHIgW2xhYmVsID0gIiByIl0KKyAgICAgICAgdHIgLT4gdHJhIFtsYWJlbCA9ICIgYSJdCisgICAgICAgIHRyYSAtPiB0cmF2IFtsYWJlbCA9ICIgdiJdCisgICAgICAgIHRyYXYgLT4gdHJhdmUgW2xhYmVsID0gIiBlIl0KKyAgICAgICAgdHJhdmUgLT4gdHJhdmVyIFtsYWJlbCA9ICIgciJdCisgICAgICAgIHRyYXZlciAtPiB0cmF2ZXJzIFtsYWJlbCA9ICIgcyJdCisgICAgICAgIHRyYXZlcnMgLT4gdHJhdmVyc2UgW2xhYmVsID0gIiBlIl0KKworICAgICAgICB0cmEyIFtsYWJlbCA9ICJTcGFyc2VcbjB4MERFIl0KKyAgICAgICAgdHJhdiBbbGFiZWwgPSAiQ2hhaW5cbjB4MEI4Il0KKyAgICAgICAgdHJhdmUgW2xhYmVsID0gIjB4MEI5Il0KKyAgICAgICAgdHJhdmVyIFtsYWJlbCA9ICIweDBCQSJdCisgICAgICAgIHRyYXZlcnMgW2xhYmVsID0gIjB4MEJCIl0KKyAgICAgICAgdHJhdmVyc2UgW2xhYmVsID0gImNvbnRlbnRBcnJheVszXSJdCisgICAgfQorCisgICAge3Jhbms9c2FtZSB0cmEgLT4gdHJhMiAtPiB0cmUgLT4gdHJpIFtzdHlsZT1pbnZpc119CisgICAge3Jhbms9c2FtZSB0cmFjIC0+IHRyYXYgLT4gdHJlZSAtPiB0cmllIFtzdHlsZT1pbnZpc119CisKKyAgICB7CisgICAgICAgIGVkZ2UgW2NvbG9yID0gImJsdWUiXQorICAgICAgICB0ciAtPiB0cmEyIFtsYWJlbCA9ICIgYSJdCisgICAgICAgIHRyYTIgLT4gdHJhYyBbbGFiZWwgPSAiIGMiXQorICAgICAgICB0cmEyIC0+IHRyYXYgW2xhYmVsID0gIiB2Il0KKyAgICAgICAgdHJhdiAtPiB0cmF2ZSBbbGFiZWwgPSAiIGUiXQorICAgICAgICB0cmF2ZSAtPiB0cmF2ZXIgW2xhYmVsID0gIiByIl0KKyAgICAgICAgdHJhdmVyIC0+IHRyYXZlcnMgW2xhYmVsID0gIiBzIl0KKyAgICAgICAgdHJhdmVycyAtPiB0cmF2ZXJzZSBbbGFiZWwgPSAiIGUiXQorICAgIH0KKworICAgIHN1YmdyYXBoIGJhY2sgeworICAgICAgICBlZGdlIFtjb2xvciA9ICJwaW5rIjsgZm9udGNvbG9yPSJyZWQiOyBhcnJvd2hlYWQ9InZlZSI7IGNvbnN0cmFpbj0iZmFsc2UiXQorCisgICAgICAgIHRyYXZlcnNlIC0+IHRyYXZlcnMgW2xhYmVsID0gIiB+MyJdCisgICAgICAgIHRyYXZlcnMgLT4gdHJhdmVyIFtsYWJlbCA9ICIweDBCQiJdCisgICAgICAgIHRyYXZlciAtPiB0cmF2ZSBbbGFiZWwgPSAiMHgwQkEiXQorICAgICAgICB0cmF2ZSAtPiB0cmF2IFtsYWJlbCA9ICIweDBCOSJdCisgICAgICAgIHRyYXYgLT4gdHJhMiBbbGFiZWwgPSAiMHgwQjgiXQorICAgICAgICB0cmEyIC0+IHRyIFtsYWJlbCA9ICIweDBERSJdCisgICAgICAgIHRyIC0+IHQgW2xhYmVsID0gIjB4MDdFIl0KKyAgICAgICAgdCAtPiByb290IFtsYWJlbCA9ICIweDA5QiJdCisgICAgICAgIHJvb3QgLT4gc3RhcnQgW2xhYmVsID0gIjB4MDlBIl0KKyAgICB9Cit9CitgYGAKKyAtLT4KKzwhLS0gVGl0bGU6IEcgUGFnZXM6IDEgLS0+Cis8c3ZnIHdpZHRoPSI2MTFwdCIgaGVpZ2h0PSI4NDZwdCIKKyAgICAgdmlld0JveD0iMC4wMCAwLjAwIDYxMS40NyA4NDUuNzMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgorICAgIDxnIGlkPSJncmFwaDAiIGNsYXNzPSJncmFwaCIgdHJhbnNmb3JtPSJzY2FsZSgxIDEpIHJvdGF0ZSgwKSB0cmFuc2xhdGUoNCA4NDEuNzI1MSkiPgorICAgICAgICA8dGl0bGU+RzwvdGl0bGU+CisgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0idHJhbnNwYXJlbnQiIHBvaW50cz0iLTQsNCAtNCwtODQxLjcyNTEgNjA3LjQ3MzgsLTg0MS43MjUxIDYwNy40NzM4LDQgLTQsNCIvPgorICAgICAgICA8IS0tIHJvb3QgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnJvb3Q8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjMwLjIzNjkiIGN5PSItODA4LjMwOTUiIHJ4PSIzMy4xMzM3IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjMwLjIzNjkiIHk9Ii04MTIuNTA5NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIzMC4yMzY5IiB5PSItNzk1LjcwOTUiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHg5QTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHN0YXJ0IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTIiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT5zdGFydDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzNjMuMjM2OSIgY3k9Ii04MDguMzA5NSIgcng9IjQ0LjA3NzUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzYzLjIzNjkiIHk9Ii04MDQuMTA5NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5zdGFydC9lbmQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSByb290JiM0NTsmZ3Q7c3RhcnQgLS0+CisgICAgICAgIDwhLS0gcm9vdCYjNDU7Jmd0O3N0YXJ0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTQzIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+cm9vdCYjNDU7Jmd0O3N0YXJ0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTI2My43OTg0LC04MDguMzA5NUMyNzcuMzAzNywtODA4LjMwOTUgMjkzLjIzMzksLTgwOC4zMDk1IDMwOC4zMzk4LC04MDguMzA5NSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjMxOC42MjYxLC04MDguMzA5NSAzMDguNjI2MiwtODEyLjgwOTYgMzEzLjYyNjEsLTgwOC4zMDk1IDMwOC42MjYxLC04MDguMzA5NiAzMDguNjI2MSwtODA4LjMwOTYgMzA4LjYyNjEsLTgwOC4zMDk2IDMxMy42MjYxLC04MDguMzA5NSAzMDguNjI2MSwtODAzLjgwOTYgMzE4LjYyNjEsLTgwOC4zMDk1IDMxOC42MjYxLC04MDguMzA5NSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjkxLjI1MDkiIHk9Ii04MTUuNTA5NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj4weDA5QTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHQgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTMiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjIzMC4yMzY5IiBjeT0iLTcwOC4wOTM5IiByeD0iMzYuNTgyNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMzAuMjM2OSIgeT0iLTcwMy44OTM5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDlCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gcm9vdCYjNDU7Jmd0O3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnJvb3QmIzQ1OyZndDt0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTIxMC45NTY0LC03ODQuMjYxMkMyMDMuNzM5MywtNzcyLjM0ODUgMTk4LjI3NjgsLTc1Ny42NDYyIDIwMi44NDYzLC03NDQuMDkzOSAyMDQuMTYzNiwtNzQwLjE4NjkgMjA2LjA5MjYsLTczNi4zNjg0IDIwOC4zMjY5LC03MzIuNzY2MyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjIxMS4zODQ0LC03MzQuNTA2OCAyMTQuMzM1NywtNzI0LjMzMTMgMjA1LjY4MywtNzMwLjQ0NTQgMjExLjM4NDQsLTczNC41MDY4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDYuOTMyMiIgeT0iLTc0OC4yOTM5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiB0PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gcm9vdCYjNDU7Jmd0O3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTQiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT5yb290JiM0NTsmZ3Q7dDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yMzAuMjM2OSwtNzc4Ljc4MzVDMjMwLjIzNjksLTc2NS4yOTg0IDIzMC4yMzY5LC03NDkuNDA2MiAyMzAuMjM2OSwtNzM2LjEwOTIiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyMzAuMjM2OSwtNzI2LjA5NzIgMjM0LjczNywtNzM2LjA5NzEgMjMwLjIzNjksLTczMS4wOTcyIDIzMC4yMzcsLTczNi4wOTcyIDIzMC4yMzcsLTczNi4wOTcyIDIzMC4yMzcsLTczNi4wOTcyIDIzMC4yMzY5LC03MzEuMDk3MiAyMjUuNzM3LC03MzYuMDk3MiAyMzAuMjM2OSwtNzI2LjA5NzIgMjMwLjIzNjksLTcyNi4wOTcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMzMuOTMyMiIgeT0iLTc0OC4yOTM5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiB0PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gc3RhcnQmIzQ1OyZndDtyb290IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTEzIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+c3RhcnQmIzQ1OyZndDtyb290PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTMxOS40MDQyLC04MDUuNjMzM0MzMDcuMjkzOCwtODA1LjE4MTggMjk0LjE0NzksLTgwNC45NTg0IDI4Mi4wMTg0LC04MDUuMzA5NSAyNzkuMzI2NCwtODA1LjM4NzQgMjc2LjU1NjgsLTgwNS40ODgxIDI3My43NjQzLC04MDUuNjA1MSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjI2My42NTA0LC04MDYuMDg5IDI3My40MjM5LC04MDEuMTE2MSAyNjguNjQ0NywtODA1Ljg1IDI3My42MzksLTgwNS42MTEgMjczLjYzOSwtODA1LjYxMSAyNzMuNjM5LC04MDUuNjExIDI2OC42NDQ3LC04MDUuODUgMjczLjg1NDEsLTgxMC4xMDU4IDI2My42NTA0LC04MDYuMDg5IDI2My42NTA0LC04MDYuMDg5Ii8+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdG9yIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTMiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdG9yPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjczLjIzNjkiIGN5PSItMTA2LjgiIHJ4PSI3My40NzQ1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjczLjIzNjkiIHk9Ii0xMDIuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5jb250ZW50QXJyYXlbMF08L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdG8gLS0+CisgICAgICAgIDxnIGlkPSJub2RlNCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0bzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI3NC4yMzY5IiBjeT0iLTE5NS42IiByeD0iMzYuNTgyNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3NC4yMzY5IiB5PSItMTkxLjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwMUI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdG8mIzQ1OyZndDt0cmFjdG9yIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTYiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdG8mIzQ1OyZndDt0cmFjdG9yPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTc0LjAyOTcsLTE3Ny4yMDA2QzczLjg5MzQsLTE2NS4wOTQ5IDczLjcxMjIsLTE0OS4wMDc2IDczLjU1NzUsLTEzNS4yNjc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNzcuMDUyOSwtMTM0LjgzMTkgNzMuNDQwNCwtMTI0Ljg3MiA3MC4wNTMzLC0xMzQuOTEwOCA3Ny4wNTI5LC0xMzQuODMxOSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzguMzE3MiIgeT0iLTE0NyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gcjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTUiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI3OC4yMzY5IiBjeT0iLTI4NC40IiByeD0iMzcuMTQ0MyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3OC4yMzY5IiB5PSItMjgwLjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwMUE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdCYjNDU7Jmd0O3RyYWN0byAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U1IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3QmIzQ1OyZndDt0cmFjdG88L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNNzcuNDA4MSwtMjY2LjAwMDZDNzYuODYyOCwtMjUzLjg5NDkgNzYuMTM4MSwtMjM3LjgwNzYgNzUuNTE5MiwtMjI0LjA2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI3OC45OTc1LC0yMjMuNTA0NCA3NS4wNTA5LC0yMTMuNjcyIDcyLjAwNDYsLTIyMy44MTk0IDc4Ljk5NzUsLTIyMy41MDQ0Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI4Mi40ODY5IiB5PSItMjM1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IG88L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTYiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9Ijk0LjIzNjkiIGN5PSItMzg0LjYxNTYiIHJ4PSIzNS4zNTg3IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijk0LjIzNjkiIHk9Ii0zODAuNDE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxOTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWMmIzQ1OyZndDt0cmFjdCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U0IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhYyYjNDU7Jmd0O3RyYWN0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTkxLjMwMjIsLTM2Ni4yMzQ1Qzg4LjkxMTUsLTM1MS4yNjAzIDg1LjQ5NTUsLTMyOS44NjQzIDgyLjc1NiwtMzEyLjcwNTUiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI4Ni4xODU4LC0zMTEuOTg3NyA4MS4xNTI5LC0zMDIuNjY0NiA3OS4yNzM0LC0zMTMuMDkxMyA4Ni4xODU4LC0zMTEuOTg3NyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iODkuOTMyMiIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiB0PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdiAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxNCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXY8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBjeD0iMjAyLjIzNjkiIGN5PSItMzg0LjYxNTYiIHJ4PSIzNy45MzA2IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjAyLjIzNjkiIHk9Ii0zODguODE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwMi4yMzY5IiB5PSItMzcyLjAxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+MHgwQjg8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjJiM0NTsmZ3Q7dHJhdiAtLT4KKyAgICAgICAgPCEtLSB0cmEgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiNkM2QzZDMiIGN4PSIxMjQuMjM2OSIgY3k9Ii00OTYuMjQ2OSIgcng9IjM2LjEyNSIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjEyNC4yMzY5IiB5PSItNTAwLjQ0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2QzZDNkMyI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxMjQuMjM2OSIgeT0iLTQ4My42NDY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNkM2QzZDMiPjB4MDE4PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhJiM0NTsmZ3Q7dHJhYyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U4IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhJiM0NTsmZ3Q7dHJhYzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNkM2QzZDMiIGQ9Ik0xMDguNzkyLC00NjkuNjEwNEMxMDUuNTY1NywtNDYzLjAwOCAxMDIuNTM2NCwtNDU1LjgxOCAxMDAuNTIyMywtNDQ4LjgzMTMgOTcuMjA2OCwtNDM3LjMzMDMgOTUuNTY0MSwtNDI0LjI0MjkgOTQuNzc1MiwtNDEyLjg5NjkiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNkM2QzZDMiIHN0cm9rZT0iI2QzZDNkMyIgcG9pbnRzPSI5OC4yNTgxLC00MTIuNDcwMSA5NC4yNTM5LC00MDIuNjYxMSA5MS4yNjcyLC00MTIuODI2MiA5OC4yNTgxLC00MTIuNDcwMSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTA2LjA5NDIiIHk9Ii00MzYuMjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZDNkM2QzIj4gYzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYSYjNDU7Jmd0O3RyYXYgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTciIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmEmIzQ1OyZndDt0cmF2PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTEyNC44MDI0LC00NjYuNzE1MUMxMjYuMTgzMiwtNDU1LjE2OTUgMTI5LjI1NTUsLTQ0Mi4yNzEyIDEzNS43MzY5LC00MzIuMDMxMyAxNDIuMjUzOSwtNDIxLjczNTEgMTUxLjg4OTQsLTQxMy4wMDgzIDE2MS44MTUyLC00MDUuOTU3NiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjE3MC4xNTkxLC00MDAuNDMxNSAxNjQuMzA2NSwtNDA5LjcwNTEgMTY1Ljk5MDQsLTQwMy4xOTI0IDE2MS44MjE4LC00MDUuOTUzMyAxNjEuODIxOCwtNDA1Ljk1MzMgMTYxLjgyMTgsLTQwNS45NTMzIDE2NS45OTA0LC00MDMuMTkyNCAxNTkuMzM3LC00MDIuMjAxNSAxNzAuMTU5MSwtNDAwLjQzMTUgMTcwLjE1OTEsLTQwMC40MzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNDEuNDg2OSIgeT0iLTQzNi4yMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiB2PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhMiAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxOSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYTI8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBjeD0iMjM1LjIzNjkiIGN5PSItNDk2LjI0NjkiIHJ4PSIzOS4yMTQ1IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjM1LjIzNjkiIHk9Ii01MDAuNDQ2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj5TcGFyc2U8L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMzUuMjM2OSIgeT0iLTQ4My42NDY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPjB4MERFPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhJiM0NTsmZ3Q7dHJhMiAtLT4KKyAgICAgICAgPCEtLSB0cmVlIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTgiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmVlPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjM0OC4yMzY5IiBjeT0iLTM4NC42MTU2IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNDguMjM2OSIgeT0iLTM4MC40MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVsxXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaWUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTAiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmllPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjUzMC4yMzY5IiBjeT0iLTM4NC42MTU2IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI1MzAuMjM2OSIgeT0iLTM4MC40MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVsyXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZWUmIzQ1OyZndDt0cmllIC0tPgorICAgICAgICA8IS0tIHRyZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU5IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjM0OC4yMzY5IiBjeT0iLTQ5Ni4yNDY5IiByeD0iMzcuOTMwNiIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM0OC4yMzY5IiB5PSItNTAwLjQ0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNDguMjM2OSIgeT0iLTQ4My42NDY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDNCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlJiM0NTsmZ3Q7dHJlZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyZSYjNDU7Jmd0O3RyZWU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMzQ4LjIzNjksLTQ2Ni42MjQ5QzM0OC4yMzY5LC00NDkuOTg3MyAzNDguMjM2OSwtNDI5LjMzNCAzNDguMjM2OSwtNDEyLjkxNjMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIzNTEuNzM3LC00MTIuODIzOSAzNDguMjM2OSwtNDAyLjgyMzkgMzQ0LjczNywtNDEyLjgyMzkgMzUxLjczNywtNDEyLjgyMzkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM1My4wOTQyIiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmkgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTEiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmk8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNDU5LjIzNjkiIGN5PSItNDk2LjI0NjkiIHJ4PSIzNy45MzA2IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDU5LjIzNjkiIHk9Ii01MDAuNDQ2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQ1OS4yMzY5IiB5PSItNDgzLjY0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwNUI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmUmIzQ1OyZndDt0cmkgLS0+CisgICAgICAgIDwhLS0gdHJpJiM0NTsmZ3Q7dHJpZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyaSYjNDU7Jmd0O3RyaWU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNNDc2LjA2MjksLTQ2OS43OTE5QzQ4Ny4zMDcyLC00NTIuMTEyOCA1MDIuMDQ1NywtNDI4LjkzOTkgNTEzLjMxMDYsLTQxMS4yMjgzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNTE2LjQzNDUsLTQxMi44Mzg0IDUxOC44NDgsLTQwMi41MjIxIDUxMC41Mjc5LC00MDkuMDgxNyA1MTYuNDM0NSwtNDEyLjgzODQiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjUwMy4wOTQyIiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjIzMC4yMzY5IiBjeT0iLTYwNy44NzgyIiByeD0iMzcuOTAyNyIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIzMC4yMzY5IiB5PSItNjEyLjA3ODIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+U3BhcnNlPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjMwLjIzNjkiIHk9Ii01OTUuMjc4MiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDA3RTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJhIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTciIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3RyYTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNkM2QzZDMiIGQ9Ik0xOTUuNzQzOCwtNTk1LjE4MDdDMTc4Ljg3MDgsLTU4Ny40MzA4IDE1OS40NjEsLTU3NS45ODg5IDE0Ni41MjIzLC01NjAuNDYyNiAxNDAuNDE5NSwtNTUzLjEzOTMgMTM1Ljk0OTEsLTU0NC4wNDM2IDEzMi42ODg3LC01MzUuMDIzMyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2QzZDNkMyIgc3Ryb2tlPSIjZDNkM2QzIiBwb2ludHM9IjEzNS45Nzc3LC01MzMuODE2OCAxMjkuNjA1NywtNTI1LjM1MjMgMTI5LjMwODQsLTUzNS45NDMgMTM1Ljk3NzcsLTUzMy44MTY4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNTIuMDk0MiIgeT0iLTU0Ny44NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNkM2QzZDMiPiBhPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0cmEgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTYiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3RyYTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yMDcuNzU3LC01ODQuMjA0MUMxOTEuOTEwNywtNTY3LjUxNTkgMTcwLjU0MjYsLTU0NS4wMTI3IDE1My4zODcsLTUyNi45NDU3Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMTQ2LjMyMDksLTUxOS41MDQxIDE1Ni40Njk5LC01MjMuNjU3MSAxNDkuNzYzOCwtNTIzLjEzIDE1My4yMDY3LC01MjYuNzU1OCAxNTMuMjA2NywtNTI2Ljc1NTggMTUzLjIwNjcsLTUyNi43NTU4IDE0OS43NjM4LC01MjMuMTMgMTQ5Ljk0MzUsLTUyOS44NTQ0IDE0Ni4zMjA5LC01MTkuNTA0MSAxNDYuMzIwOSwtNTE5LjUwNDEiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE4OS4wOTQyIiB5PSItNTQ3Ljg2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IGE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U5IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjU0LjQwMDcsLTU4NS4wMTg2QzI3Mi4zNzczLC01NjguMDEyMiAyOTcuMDc2LC01NDQuNjQ2NSAzMTYuNjIxOCwtNTI2LjE1NTYiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIzMTkuMjQ2MywtNTI4LjQ5MDkgMzI0LjEwNTQsLTUxOS4wNzYgMzE0LjQzNTcsLTUyMy40MDU4IDMxOS4yNDYzLC01MjguNDkwOSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzAyLjA5NDIiIHk9Ii01NDcuODYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJpIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTExIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmk8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjYyLjU2MTMsLTU5Mi4xMjA5QzMwMy4zMDc0LC01NzIuMjU4MyAzNzMuMzk3OCwtNTM4LjA5MTEgNDE3Ljk3MjMsLTUxNi4zNjIzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNDE5LjYyMTcsLTUxOS40NTIgNDI3LjA3NjksLTUxMS45MjQgNDE2LjU1NDQsLTUxMy4xNTk4IDQxOS42MjE3LC01MTkuNDUyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNjEuOTMyMiIgeT0iLTU0Ny44NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBpPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTQxIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTIyOC4xMzk5LC02MzcuMjg3QzIyNy42MDUsLTY0OC4yMTU5IDIyNy4yODE2LC02NjAuNzIwNSAyMjcuNjg0MywtNjcyLjA5MzkgMjI3Ljc3MDMsLTY3NC41MjQyIDIyNy44ODksLTY3Ny4wNDUxIDIyOC4wMjgzLC02NzkuNTczMyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjIyOC42ODc1LC02ODkuNzkzMSAyMjMuNTUzMSwtNjgwLjEwMzUgMjI4LjM2NTYsLTY4NC44MDM0IDIyOC4wNDM4LC02NzkuODEzOCAyMjguMDQzOCwtNjc5LjgxMzggMjI4LjA0MzgsLTY3OS44MTM4IDIyOC4zNjU2LC02ODQuODAzNCAyMzIuNTM0NCwtNjc5LjUyNDEgMjI4LjY4NzUsLTY4OS43OTMxIDIyOC42ODc1LC02ODkuNzkzMSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjQ2LjUxMzIiIHk9Ii02NTkuNDkzOSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj4weDA3RTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJhMiAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyOCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJhMjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGQ9Ik0yMTguNTU3MiwtNTc5LjgxOTZDMjE1LjI2NCwtNTY4LjYwNDkgMjEzLjE0OTEsLTU1NS41NTE4IDIxNS41MjIzLC01NDMuNjYyNiAyMTYuMTk3MSwtNTQwLjI4MTYgMjE3LjExOCwtNTM2Ljg0MDIgMjE4LjE5NTEsLTUzMy40MzM2Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMGZmIiBzdHJva2U9IiMwMDAwZmYiIHBvaW50cz0iMjIxLjQ5NTMsLTUzNC41OTkzIDIyMS41NywtNTI0LjAwNDcgMjE0LjkwNDcsLTUzMi4yNDAzIDIyMS40OTUzLC01MzQuNTk5MyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjIxLjA5NDIiIHk9Ii01NDcuODYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gYTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHQmIzQ1OyZndDtyb290IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTQyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dCYjNDU7Jmd0O3Jvb3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMjM1LjA4ODYsLTcyNi4yNzg2QzIzNi4zODAyLC03MzEuOTQyNiAyMzcuNTk0MiwtNzM4LjIzODggMjM4LjIzNjksLTc0NC4wOTM5IDIzOS4xMjQ3LC03NTIuMTgxNyAyMzguODcsLTc2MC44MzI3IDIzOC4wNDgsLTc2OS4wODEiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIyMzYuNzQ2OSwtNzc5LjI0MDcgMjMzLjU1MzcsLTc2OC43NTAxIDIzNy4zODIxLC03NzQuMjgxMiAyMzguMDE3MywtNzY5LjMyMTcgMjM4LjAxNzMsLTc2OS4zMjE3IDIzOC4wMTczLC03NjkuMzIxNyAyMzcuMzgyMSwtNzc0LjI4MTIgMjQyLjQ4MDgsLTc2OS44OTM0IDIzNi43NDY5LC03NzkuMjQwNyAyMzYuNzQ2OSwtNzc5LjI0MDciLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI1Ny45MDUyIiB5PSItNzQ4LjI5MzkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2ZmMDAwMCI+MHgwOUI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0JiM0NTsmZ3Q7dHIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnQmIzQ1OyZndDt0cjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yNTEuNzcyOSwtNjkzLjIzMDhDMjU4LjMyNDQsLTY4Ny40NjgyIDI2NC43MTc5LC02ODAuMjc1MSAyNjguMjM2OSwtNjcyLjA5MzkgMjcxLjE4NzIsLTY2NS4yMzQ4IDI3MC43MTE1LC02NjIuMzM4NSAyNjguMjM2OSwtNjU1LjI5MzkgMjY2LjI2NTksLTY0OS42ODI4IDI2My4zMjAyLC02NDQuMjQzNiAyNTkuOTI0NywtNjM5LjE3MjciLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIyNjIuNjQ2OSwtNjM2Ljk2NzcgMjUzLjg3ODIsLTYzMS4wMjExIDI1Ny4wMjQ3LC02NDEuMTM4IDI2Mi42NDY5LC02MzYuOTY3NyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjc1LjMxNzIiIHk9Ii02NTkuNDkzOSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gcjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHQmIzQ1OyZndDt0ciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnQmIzQ1OyZndDt0cjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yMTMuMzI0LC02OTIuMDEzOEMyMDguMzk5NSwtNjg2LjI1NDMgMjAzLjY1NDMsLTY3OS4zNzIyIDIwMS4wNzYzLC02NzIuMDkzOSAxOTcuNDgyNywtNjYxLjk0ODEgMTk5Ljc5NTQsLTY1MS4xOTgzIDIwNC4zODIsLTY0MS40NTU2Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjA5LjM1NzYsLTYzMi40NzU4IDIwOC40NDcxLC02NDMuNDAzOCAyMDYuOTM0MiwtNjM2Ljg0OTMgMjA0LjUxMDksLTY0MS4yMjI4IDIwNC41MTA5LC02NDEuMjIyOCAyMDQuNTEwOSwtNjQxLjIyMjggMjA2LjkzNDIsLTYzNi44NDkzIDIwMC41NzQ3LC02MzkuMDQxOCAyMDkuMzU3NiwtNjMyLjQ3NTggMjA5LjM1NzYsLTYzMi40NzU4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDUuMzE3MiIgeT0iLTY1OS40OTM5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdiYjNDU7Jmd0O3RyZWUgLS0+CisgICAgICAgIDwhLS0gdHJhdmUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTUiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGN4PSIyMDIuMjM2OSIgY3k9Ii0yODQuNCIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjAyLjIzNjkiIHk9Ii0yODAuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4weDBCOTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXYmIzQ1OyZndDt0cmF2ZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxOCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXYmIzQ1OyZndDt0cmF2ZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0xODEuNDY5MiwtMzU5LjQ0NzZDMTc2Ljk4MzMsLTM1Mi42MjgxIDE3Mi44ODE1LC0zNDQuOTcwNyAxNzAuNTIyMywtMzM3LjIgMTY4LjM1MzEsLTMzMC4wNTU0IDE2Ny44ODQzLC0zMjcuMzg1MSAxNzAuNTIyMywtMzIwLjQgMTcyLjE1NTUsLTMxNi4wNzUzIDE3NC41NzEyLC0zMTEuOTMzOCAxNzcuMzUzMywtMzA4LjA5OTIiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIxODMuODY3NiwtMzAwLjI0MzEgMTgwLjk0ODUsLTMxMC44MTM0IDE4MC42NzYxLC0zMDQuMDkyMSAxNzcuNDg0NSwtMzA3Ljk0MSAxNzcuNDg0NSwtMzA3Ljk0MSAxNzcuNDg0NSwtMzA3Ljk0MSAxODAuNjc2MSwtMzA0LjA5MjEgMTc0LjAyMDUsLTMwNS4wNjg2IDE4My44Njc2LC0zMDAuMjQzMSAxODMuODY3NiwtMzAwLjI0MzEiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE3Ni4wOTQyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2JiM0NTsmZ3Q7dHJhdmUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMzEiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2JiM0NTsmZ3Q7dHJhdmU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBkPSJNMjAyLjIzNjksLTM1NS4wODk3QzIwMi4yMzY5LC0zNDEuNjA0NiAyMDIuMjM2OSwtMzI1LjcxMjMgMjAyLjIzNjksLTMxMi40MTUzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMGZmIiBzdHJva2U9IiMwMDAwZmYiIHBvaW50cz0iMjA1LjczNywtMzEyLjQwMzMgMjAyLjIzNjksLTMwMi40MDMzIDE5OC43MzcsLTMxMi40MDM0IDIwNS43MzcsLTMxMi40MDMzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDcuMDk0MiIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdiYjNDU7Jmd0O3RyYTIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMzkiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2JiM0NTsmZ3Q7dHJhMjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0yMTAuODIxMSwtNDEzLjY1NEMyMTQuODA1LC00MjcuMTMwNSAyMTkuNTk1NywtNDQzLjMzNjMgMjIzLjg3NDQsLTQ1Ny44MTAyIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMjI2LjczODYsLTQ2Ny40OTkxIDIxOS41ODgyLC00NTkuMTg1MSAyMjUuMzIxMSwtNDYyLjcwNDIgMjIzLjkwMzYsLTQ1Ny45MDkzIDIyMy45MDM2LC00NTcuOTA5MyAyMjMuOTAzNiwtNDU3LjkwOTMgMjI1LjMyMTEsLTQ2Mi43MDQyIDIyOC4yMTksLTQ1Ni42MzM2IDIyNi43Mzg2LC00NjcuNDk5MSAyMjYuNzM4NiwtNDY3LjQ5OTEiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIzOS45MDUyIiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2ZmMDAwMCI+MHgwQjg8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZSYjNDU7Jmd0O3RyYXYgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMzgiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZSYjNDU7Jmd0O3RyYXY8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMjA4LjkwMjQsLTMwMi40NzIyQzIxMC42NzgyLC0zMDguMTMxNyAyMTIuMzQ4NywtMzE0LjQ1MzUgMjEzLjIzNjksLTMyMC40IDIxNC40NzI0LC0zMjguNjcxMyAyMTQuMDc2NiwtMzM3LjUyMTMgMjEyLjg4ODgsLTM0NS45MjYiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIyMTEuMTAzNiwtMzU1Ljg4OCAyMDguNDM4MiwtMzQ1LjI1MDkgMjExLjk4NTYsLTM1MC45NjY0IDIxMi44Njc2LC0zNDYuMDQ0OCAyMTIuODY3NiwtMzQ2LjA0NDggMjEyLjg2NzYsLTM0Ni4wNDQ4IDIxMS45ODU2LC0zNTAuOTY2NCAyMTcuMjk3LC0zNDYuODM4NiAyMTEuMTAzNiwtMzU1Ljg4OCAyMTEuMTAzNiwtMzU1Ljg4OCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjMyLjkwNTIiIHk9Ii0zMjQuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj4weDBCOTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlciAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxNiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlcjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGN4PSIyMDIuMjM2OSIgY3k9Ii0xOTUuNiIgcng9IjM4Ljg2NzEiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjAyLjIzNjkiIHk9Ii0xOTEuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4weDBCQTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlJiM0NTsmZ3Q7dHJhdmVyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE5IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmUmIzQ1OyZndDt0cmF2ZXI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMTg1LjMyNCwtMjY4LjMyQzE4MC4zOTk1LC0yNjIuNTYwNSAxNzUuNjU0MywtMjU1LjY3ODQgMTczLjA3NjMsLTI0OC40IDE3MC41ODM0LC0yNDEuMzYxOCAxNzAuNTgzNCwtMjM4LjYzODIgMTczLjA3NjMsLTIzMS42IDE3NC40OTYyLC0yMjcuNTkxMiAxNzYuNTczNSwtMjIzLjcwMjYgMTc4Ljk3NjIsLTIyMC4wNTU2Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMTg1LjAxNjQsLTIxMi4wNDE1IDE4Mi41OTExLC0yMjIuNzM1OCAxODIuMDA3LC0yMTYuMDM0NCAxNzguOTk3NSwtMjIwLjAyNzMgMTc4Ljk5NzUsLTIyMC4wMjczIDE3OC45OTc1LC0yMjAuMDI3MyAxODIuMDA3LC0yMTYuMDM0NCAxNzUuNDAzOSwtMjE3LjMxODggMTg1LjAxNjQsLTIxMi4wNDE1IDE4NS4wMTY0LC0yMTIuMDQxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTc3LjMxNzIiIHk9Ii0yMzUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gcjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlJiM0NTsmZ3Q7dHJhdmVyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTMyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmUmIzQ1OyZndDt0cmF2ZXI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBkPSJNMjAyLjIzNjksLTI2Ni4wMDA2QzIwMi4yMzY5LC0yNTMuODk0OSAyMDIuMjM2OSwtMjM3LjgwNzYgMjAyLjIzNjksLTIyNC4wNjc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMGZmIiBzdHJva2U9IiMwMDAwZmYiIHBvaW50cz0iMjA1LjczNywtMjIzLjY3MiAyMDIuMjM2OSwtMjEzLjY3MiAxOTguNzM3LC0yMjMuNjcyMSAyMDUuNzM3LC0yMjMuNjcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDYuMzE3MiIgeT0iLTIzNS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmVyJiM0NTsmZ3Q7dHJhdmUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMzciIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXImIzQ1OyZndDt0cmF2ZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0yMDcuNjkzNywtMjEzLjc1MDlDMjA5LjE0NjcsLTIxOS40MTM2IDIxMC41MTI3LC0yMjUuNzE3NCAyMTEuMjM2OSwtMjMxLjYgMjEyLjE0OTIsLTIzOS4wMTA3IDIxMi4xNDkyLC0yNDAuOTg5MyAyMTEuMjM2OSwtMjQ4LjQgMjEwLjkyMDEsLTI1MC45NzM2IDIxMC40ODA0LC0yNTMuNjI3OSAyMDkuOTY0MywtMjU2LjI3MzgiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIyMDcuNjkzNywtMjY2LjI0OTEgMjA1LjUyNTUsLTI1NS40OTk3IDIwOC44MDM1LC0yNjEuMzczOCAyMDkuOTEzMiwtMjU2LjQ5ODUgMjA5LjkxMzIsLTI1Ni40OTg1IDIwOS45MTMyLC0yNTYuNDk4NSAyMDguODAzNSwtMjYxLjM3MzggMjE0LjMwMSwtMjU3LjQ5NzMgMjA3LjY5MzcsLTI2Ni4yNDkxIDIwNy42OTM3LC0yNjYuMjQ5MSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjMyLjQ1ODUiIHk9Ii0yMzUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj4weDBCQTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlcnMgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTciIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXJzPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgY3g9IjIwMy4yMzY5IiBjeT0iLTEwNi44IiByeD0iMzguMzA1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwMy4yMzY5IiB5PSItMTAyLjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+MHgwQkI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZXImIzQ1OyZndDt0cmF2ZXJzIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIwIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVyJiM0NTsmZ3Q7dHJhdmVyczwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0xODMuOTg1NCwtMTc5LjY2NThDMTc0LjY5NjUsLTE2OS41Mzk3IDE2Ni4zMTM3LC0xNTUuOTExNiAxNzEuMjkyMywtMTQyLjggMTcyLjkzODUsLTEzOC40NjQ1IDE3NS4zNzIzLC0xMzQuMzE2OSAxNzguMTc0OSwtMTMwLjQ3OTMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIxODQuNzM2NywtMTIyLjYyMTMgMTgxLjc4MTIsLTEzMy4xODE0IDE4MS41MzE5LC0xMjYuNDU5MiAxNzguMzI3MSwtMTMwLjI5NzEgMTc4LjMyNzEsLTEzMC4yOTcxIDE3OC4zMjcxLC0xMzAuMjk3MSAxODEuNTMxOSwtMTI2LjQ1OTIgMTc0Ljg3MywtMTI3LjQxMjggMTg0LjczNjcsLTEyMi42MjEzIDE4NC43MzY3LC0xMjIuNjIxMyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTc2LjcwOTIiIHk9Ii0xNDciIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IHM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZXImIzQ1OyZndDt0cmF2ZXJzIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTMzIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVyJiM0NTsmZ3Q7dHJhdmVyczwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGQ9Ik0yMDIuNDQ0MSwtMTc3LjIwMDZDMjAyLjU4MDQsLTE2NS4wOTQ5IDIwMi43NjE2LC0xNDkuMDA3NiAyMDIuOTE2MywtMTM1LjI2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwZmYiIHN0cm9rZT0iIzAwMDBmZiIgcG9pbnRzPSIyMDYuNDIwNSwtMTM0LjkxMDggMjAzLjAzMzQsLTEyNC44NzIgMTk5LjQyMDksLTEzNC44MzE5IDIwNi40MjA1LC0xMzQuOTEwOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjA3LjcwOTIiIHk9Ii0xNDciIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZXJzJiM0NTsmZ3Q7dHJhdmVyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTM2IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVycyYjNDU7Jmd0O3RyYXZlcjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0yMDkuMDY2NiwtMTI0LjgzNzZDMjExLjY2MzgsLTEzNS4wMTg2IDIxMy44MTkzLC0xNDcuOTkwOCAyMTIuMjM2OSwtMTU5LjYgMjExLjg3MTcsLTE2Mi4yNzkzIDIxMS4zNjAyLC0xNjUuMDQwNyAyMTAuNzU5OSwtMTY3Ljc4NjMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIyMDguMjk4MywtMTc3LjQ4NjYgMjA2LjM5NjMsLTE2Ni42ODY5IDIwOS41MjgyLC0xNzIuNjQwMiAyMTAuNzU4LC0xNjcuNzkzOCAyMTAuNzU4LC0xNjcuNzkzOCAyMTAuNzU4LC0xNjcuNzkzOCAyMDkuNTI4MiwtMTcyLjY0MDIgMjE1LjExOTgsLTE2OC45MDA3IDIwOC4yOTgzLC0xNzcuNDg2NiAyMDguMjk4MywtMTc3LjQ4NjYiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIzMy4wNzM1IiB5PSItMTQ3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNmZjAwMDAiPjB4MEJCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmVyc2UgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTgiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXJzZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGN4PSIyMDMuMjM2OSIgY3k9Ii0xOCIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjAzLjIzNjkiIHk9Ii0xMy44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPmNvbnRlbnRBcnJheVszXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlcnMmIzQ1OyZndDt0cmF2ZXJzZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyMSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlcnMmIzQ1OyZndDt0cmF2ZXJzZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0xODQuODY3NiwtOTAuOTU2OUMxNzkuNTEzNSwtODUuMjEzMiAxNzQuMzQ3NCwtNzguMjgwNSAxNzEuNTIyMywtNzAuOCAxNjguODg0MywtNjMuODE0OSAxNjguODg0MywtNjAuOTg1MSAxNzEuNTIyMywtNTQgMTcyLjg2NjgsLTUwLjQzOTkgMTc0Ljc0MTUsLTQ3LjAwNCAxNzYuOTE0NCwtNDMuNzYxMiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjE4My4yMDMsLTM1LjY3NiAxODAuNjE1NSwtNDYuMzMyMyAxODAuMTMzMiwtMzkuNjIyNyAxNzcuMDYzNCwtNDMuNTY5NSAxNzcuMDYzNCwtNDMuNTY5NSAxNzcuMDYzNCwtNDMuNTY5NSAxODAuMTMzMiwtMzkuNjIyNyAxNzMuNTExNCwtNDAuODA2NyAxODMuMjAzLC0zNS42NzYgMTgzLjIwMywtMzUuNjc2Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNzcuMDk0MiIgeT0iLTU4LjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZXJzJiM0NTsmZ3Q7dHJhdmVyc2UgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMzQiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXJzJiM0NTsmZ3Q7dHJhdmVyc2U8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBkPSJNMjAzLjIzNjksLTg4LjQwMDZDMjAzLjIzNjksLTc2LjI5NDkgMjAzLjIzNjksLTYwLjIwNzYgMjAzLjIzNjksLTQ2LjQ2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwZmYiIHN0cm9rZT0iIzAwMDBmZiIgcG9pbnRzPSIyMDYuNzM3LC00Ni4wNzIgMjAzLjIzNjksLTM2LjA3MiAxOTkuNzM3LC00Ni4wNzIxIDIwNi43MzcsLTQ2LjA3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjA4LjA5NDIiIHk9Ii01OC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmVyc2UmIzQ1OyZndDt0cmF2ZXJzIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTM1IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVyc2UmIzQ1OyZndDt0cmF2ZXJzPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTIwOS45MDI0LC0zNi4wNzIyQzIxMS42NzgyLC00MS43MzE3IDIxMy4zNDg3LC00OC4wNTM1IDIxNC4yMzY5LC01NCAyMTUuMzM5OSwtNjEuMzg0NyAyMTUuMzM5OSwtNjMuNDE1MyAyMTQuMjM2OSwtNzAuOCAyMTMuODM0NCwtNzMuNDk0NSAyMTMuMjcxMywtNzYuMjY2MSAyMTIuNjEwNiwtNzkuMDE4MSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjIwOS45MDI0LC04OC43Mjc4IDIwOC4yNTQ2LC03Ny44ODY0IDIxMS4yNDU4LC04My45MTE2IDIxMi41ODkxLC03OS4wOTU0IDIxMi41ODkxLC03OS4wOTU0IDIxMi41ODkxLC03OS4wOTU0IDIxMS4yNDU4LC04My45MTE2IDIxNi45MjM3LC04MC4zMDQ0IDIwOS45MDI0LC04OC43Mjc4IDIwOS45MDI0LC04OC43Mjc4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMjQuMjczMiIgeT0iLTU4LjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2ZmMDAwMCI+IH4zPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhMiYjNDU7Jmd0O3RyYWMgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjkiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmEyJiM0NTsmZ3Q7dHJhYzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGQ9Ik0yMDguMDUwNywtNDc0LjcyMzNDMTgzLjE3NDEsLTQ1NS4wMjgyIDE0Ni41NTAxLC00MjYuMDMyNiAxMjEuNjEzNywtNDA2LjI5MDEiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwZmYiIHN0cm9rZT0iIzAwMDBmZiIgcG9pbnRzPSIxMjMuNjUxOCwtNDAzLjQzOTYgMTEzLjYzODksLTM5OS45NzY0IDExOS4zMDY3LC00MDguOTI3OCAxMjMuNjUxOCwtNDAzLjQzOTYiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE3OC4wOTQyIiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmEyJiM0NTsmZ3Q7dHJlIC0tPgorICAgICAgICA8IS0tIHRyYTImIzQ1OyZndDt0ciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U0MCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYTImIzQ1OyZndDt0cjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0yMzMuOTAzOSwtNTI2LjAwNzRDMjMzLjMyNjgsLTUzOC44OTI2IDIzMi42NDI3LC01NTQuMTY2MyAyMzIuMDIyNiwtNTY4LjAxMDkiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIyMzEuNTYzNywtNTc4LjI1NjIgMjI3LjUxNTcsLTU2OC4wNjQ4IDIzMS43ODc0LC01NzMuMjYxMiAyMzIuMDExMiwtNTY4LjI2NjIgMjMyLjAxMTIsLTU2OC4yNjYyIDIzMi4wMTEyLC01NjguMjY2MiAyMzEuNzg3NCwtNTczLjI2MTIgMjM2LjUwNjcsLTU2OC40Njc2IDIzMS41NjM3LC01NzguMjU2MiAyMzEuNTYzNywtNTc4LjI1NjIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI1My4wNjY1IiB5PSItNTQ3Ljg2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2ZmMDAwMCI+MHgwREU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmEyJiM0NTsmZ3Q7dHJhdiAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UzMCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYTImIzQ1OyZndDt0cmF2PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgZD0iTTIxNC43MzM1LC00NzEuMDIyOEMyMTAuMjc1NiwtNDY0LjIwNDQgMjA2LjE2OTUsLTQ1Ni41NjE1IDIwMy43MzY5LC00NDguODMxMyAyMDEuMzEyNywtNDQxLjEyNzUgMjAwLjE0LC00MzIuNjQzMyAxOTkuNzA0OCwtNDI0LjQzNjYiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwZmYiIHN0cm9rZT0iIzAwMDBmZiIgcG9pbnRzPSIyMDMuMjAxLC00MjQuMjAwNSAxOTkuNTA5MiwtNDE0LjI2OTcgMTk2LjIwMjMsLTQyNC4zMzUyIDIwMy4yMDEsLTQyNC4yMDA1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDkuNDg2OSIgeT0iLTQzNi4yMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiB2PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQucDEuc3ZnIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLnAxLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODljMDg1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLnAxLnN2ZwpAQCAtMCwwICsxLDQwNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iCisgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgorPCEtLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBHZW5lcmF0ZWQgYnkgZ3JhcGh2aXogdmVyc2lvbiAyLjQwLjEgKDIwMTYxMjI1LjAzMDQpCitkaWdyYXBoIEcgeworICAgIHsgcmFuaz1zYW1lIHJvb3QgLT4gc3RhcnQgW3N0eWxlPWludmlzXSB9CisgICAgbmV3cmFuayA9IHRydWUKKyAgICBzdGFydCBbbGFiZWw9InN0YXJ0L2VuZCJdCisKKyAgICB0cmFjdG9yIFtsYWJlbCA9ICJjb250ZW50QXJyYXlbMF0iXQorICAgIHRyYWN0byBbbGFiZWwgPSAiMHgwMUIiXQorICAgIHRyYWN0IFtsYWJlbCA9ICIweDAxQSJdCisgICAgdHJhYyBbbGFiZWwgPSAiMHgwMTkiXQorICAgIHRyYSBbbGFiZWwgPSAiQ2hhaW5cbjB4MDE4Il0KKworICAgIHRyZWUgW2xhYmVsID0gImNvbnRlbnRBcnJheVsxXSI7IGNvbG9yID0gImxpZ2h0Z3JleSI7IGZvbnRjb2xvciA9IGxpZ2h0Z3JheV0KKyAgICB0cmUgW2xhYmVsID0gIkNoYWluXG4weDAzQiJdCisgICAgdHJpZSBbbGFiZWwgPSAiY29udGVudEFycmF5WzJdIl0KKyAgICB0cmkgW2xhYmVsID0gIkNoYWluXG4weDA1QiJdCisKKyAgICB0ciBbbGFiZWwgPSAiU3BhcnNlXG4weDA3RSJdCisKKyAgICB0IFtsYWJlbCA9ICIweDA5QiJdCisgICAgcm9vdCBbbGFiZWwgPSAiQ2hhaW5cbjB4OUEiXQorCisgICAgcm9vdCAtPiB0IFtsYWJlbCA9ICIgdCJdCisgICAgdCAtPiB0ciBbbGFiZWwgPSAiIHIiXQorICAgIHRyIC0+IHRyYSBbbGFiZWwgPSAiIGEiXQorICAgIHRyYSAtPiB0cmFjIFtsYWJlbCA9ICIgYyJdCisgICAgdHJhYyAtPiB0cmFjdCBbbGFiZWwgPSAiIHQiXQorICAgIHRyYWN0IC0+IHRyYWN0byBbbGFiZWwgPSAiIG8iXQorICAgIHRyYWN0byAtPiB0cmFjdG9yIFtsYWJlbCA9ICIgciJdCisKKyAgICB0ciAtPiB0cmUgW2xhYmVsID0gIiBlIl0KKyAgICB0cmUgLT4gdHJlZSBbbGFiZWwgPSAiIGUiOyBjb2xvciA9ICJsaWdodGdyZXkiOyBmb250Y29sb3IgPSBsaWdodGdyYXldCisKKyAgICB0ciAtPiB0cmkgW2xhYmVsID0gIiBpIl0KKyAgICB0cmkgLT4gdHJpZSBbbGFiZWwgPSAiIGUiXQorCisgICAgeworICAgICAgICByYW5rc2VwID0gMC4xCisgICAgICAgIHRyZWUyIFtsYWJlbCA9ICJDaGFpblxuMHgwQkIiXQorICAgICAgICB0cmVlMnAgW2xhYmVsID0gIlByZWZpeFxuMHgwQkZcbmNvbnRlbnRBcnJheVsxXSJdCisgICAgICAgIHRyZWUycCAtPiB0cmVlMiBbbGFiZWwgPSAiICZlcHNpbG9uOyJdCisgICAgfQorCisgICAgdHJlIC0+IHRyZWUycCBbbGFiZWwgPSAiIGUiXQorICAgIHRyZWUyIC0+IHRyZWVzIFtsYWJlbCA9ICIgcyJdCisKKyAgICB7cmFuaz1zYW1lIHRyYSAtPiB0cmUgLT4gdHJpIFtzdHlsZT1pbnZpc119CisgICAge3Jhbms9c2FtZSB0cmFjIC0+IHRyZWUgLT4gdHJlZTJwIC0+IHRyaWUgW3N0eWxlPWludmlzXX0KKworICAgIHN1YmdyYXBoIHBhdGggeworICAgICAgICBlZGdlIFtjb2xvciA9ICJsaWdodGJsdWUiOyBmb250Y29sb3I9ImJsdWUiOyBhcnJvd2hlYWQ9InZlZSJdCisgICAgICAgIG5vZGUgW2NvbG9yID0gImxpZ2h0Ymx1ZSI7IGZvbnRjb2xvcj0iYmx1ZSJdCisKKyAgICAgICAgc3RhcnQgLT4gcm9vdAorCisgICAgICAgIHJvb3QgLT4gdCBbbGFiZWwgPSAiIHQiXQorICAgICAgICB0IC0+IHRyIFtsYWJlbCA9ICIgciJdCisgICAgICAgIHRyIC0+IHRyZSBbbGFiZWwgPSAiIGUiXQorICAgICAgICB0cmUgLT4gdHJlZSBbbGFiZWwgPSAiIGUiXQorICAgICAgICB0cmVlIC0+IHRyZWVzIFtsYWJlbCA9ICIgcyJdCisKKyAgICAgICAgdHJlZXMgW2xhYmVsID0gImNvbnRlbnRBcnJheVszXSI7IGNvbnN0cmFpbnQgPSBmYWxzZV0KKyAgICB9CisKKworICAgIHN1YmdyYXBoIGJhY2sgeworICAgICAgICBlZGdlIFtjb2xvciA9ICJwaW5rIjsgZm9udGNvbG9yPSJyZWQiOyBhcnJvd2hlYWQ9InZlZSI7IGNvbnN0cmFpbnQ9ImZhbHNlIl0KKworICAgICAgICB0cmVlcyAtPiB0cmVlMiBbbGFiZWwgPSAiIH4zIl0KKyAgICAgICAgdHJlZTIgLT4gdHJlZTJwIFtsYWJlbCA9ICIweDBCQiJdCisgICAgICAgIHRyZWUycCAtPiB0cmUgW2xhYmVsID0gIjB4MEJGIl0KKyAgICAgICAgdHJlIC0+IHRyIFtsYWJlbCA9ICIweDAzQiJdCisgICAgICAgIHRyIC0+IHQgW2xhYmVsID0gIjB4MDdFIl0KKyAgICAgICAgdCAtPiByb290IFtsYWJlbCA9ICIweDA5QiJdCisgICAgICAgIHJvb3QgLT4gc3RhcnQgW2xhYmVsID0gIjB4MDlBIl0KKyAgICB9Cit9CisgLS0+Cis8IS0tIFRpdGxlOiBHIFBhZ2VzOiAxIC0tPgorPHN2ZyB3aWR0aD0iNjY2cHQiIGhlaWdodD0iNjc4cHQiCisgICAgIHZpZXdCb3g9IjAuMDAgMC4wMCA2NjYuNDcgNjc3LjUyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KKyAgICA8ZyBpZD0iZ3JhcGgwIiBjbGFzcz0iZ3JhcGgiIHRyYW5zZm9ybT0ic2NhbGUoMSAxKSByb3RhdGUoMCkgdHJhbnNsYXRlKDQgNjczLjUxNTIpIj4KKyAgICAgICAgPHRpdGxlPkc8L3RpdGxlPgorICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9InRyYW5zcGFyZW50IiBwb2ludHM9Ii00LDQgLTQsLTY3My41MTUyIDY2Mi40NzM4LC02NzMuNTE1MiA2NjIuNDczOCw0IC00LDQiLz4KKyAgICAgICAgPCEtLSByb290IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT5yb290PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjI2NC4yMzY5IiBjeT0iLTY0MC4wOTk2IiByeD0iMzMuMTMzNyIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI2NC4yMzY5IiB5PSItNjQ0LjI5OTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNjQuMjM2OSIgeT0iLTYyNy40OTk2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4OUE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSBzdGFydCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUyIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+c3RhcnQ8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMzk3LjIzNjkiIGN5PSItNjQwLjA5OTYiIHJ4PSI0NC4wNzc1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM5Ny4yMzY5IiB5PSItNjM1Ljg5OTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+c3RhcnQvZW5kPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gcm9vdCYjNDU7Jmd0O3N0YXJ0IC0tPgorICAgICAgICA8IS0tIHJvb3QmIzQ1OyZndDtzdGFydCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UzMyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnJvb3QmIzQ1OyZndDtzdGFydDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0yOTcuNzk4NCwtNjQwLjA5OTZDMzExLjMwMzcsLTY0MC4wOTk2IDMyNy4yMzM5LC02NDAuMDk5NiAzNDIuMzM5OCwtNjQwLjA5OTYiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIzNTIuNjI2MSwtNjQwLjA5OTYgMzQyLjYyNjIsLTY0NC41OTk3IDM0Ny42MjYxLC02NDAuMDk5NiAzNDIuNjI2MSwtNjQwLjA5OTcgMzQyLjYyNjEsLTY0MC4wOTk3IDM0Mi42MjYxLC02NDAuMDk5NyAzNDcuNjI2MSwtNjQwLjA5OTYgMzQyLjYyNjEsLTYzNS41OTk3IDM1Mi42MjYxLC02NDAuMDk5NiAzNTIuNjI2MSwtNjQwLjA5OTYiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMyNS4yNTA5IiB5PSItNjQ3LjI5OTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2ZmMDAwMCI+MHgwOUE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEzIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyNjQuMjM2OSIgY3k9Ii01NTcuODgzOSIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjY0LjIzNjkiIHk9Ii01NTMuNjgzOSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDA5QjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHJvb3QmIzQ1OyZndDt0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT5yb290JiM0NTsmZ3Q7dDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yNTMuMTkxOCwtNjEyLjMwNjdDMjUxLjQyNjMsLTYwNS4yNTA1IDI1MC4zNjgsLTU5Ny41NzM0IDI1Mi42MDM2LC01ODUuMzEyNSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjI1Ni4wMjU5LC01ODYuMDQ3MyAyNTQuODUwNiwtNTc1LjUxNzkgMjQ5LjIwMzEsLTU4NC40ODIxIDI1Ni4wMjU5LC01ODYuMDQ3MyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjU1LjkzMjIiIHk9Ii01ODkuMDgzOSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gdDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHJvb3QmIzQ1OyZndDt0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+cm9vdCYjNDU7Jmd0O3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMjY0LjIzNjksLTYxMC40MTc4QzI2NC4yMzY5LC02MDIuNTc1NiAyNjQuMjM2OSwtNTk0LjEzMDcgMjY0LjIzNjksLTU4Ni4zNTQyIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjY0LjIzNjksLTU3Ni4yODM1IDI2OC43MzcsLTU4Ni4yODM1IDI2NC4yMzY5LC01ODEuMjgzNSAyNjQuMjM3LC01ODYuMjgzNSAyNjQuMjM3LC01ODYuMjgzNSAyNjQuMjM3LC01ODYuMjgzNSAyNjQuMjM2OSwtNTgxLjI4MzUgMjU5LjczNywtNTg2LjI4MzYgMjY0LjIzNjksLTU3Ni4yODM1IDI2NC4yMzY5LC01NzYuMjgzNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjY3LjkzMjIiIHk9Ii01ODkuMDgzOSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gdDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHN0YXJ0JiM0NTsmZ3Q7cm9vdCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyMSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnN0YXJ0JiM0NTsmZ3Q7cm9vdDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0zNTMuNDA0MiwtNjM3LjQyMzNDMzQxLjI5MzgsLTYzNi45NzE5IDMyOC4xNDc5LC02MzYuNzQ4NSAzMTYuMDE4NCwtNjM3LjA5OTYgMzEzLjMyNjQsLTYzNy4xNzc1IDMxMC41NTY4LC02MzcuMjc4MSAzMDcuNzY0MywtNjM3LjM5NTEiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyOTcuNjUwNCwtNjM3Ljg3OTEgMzA3LjQyMzksLTYzMi45MDYyIDMwMi42NDQ3LC02MzcuNjQwMSAzMDcuNjM5LC02MzcuNDAxIDMwNy42MzksLTYzNy40MDEgMzA3LjYzOSwtNjM3LjQwMSAzMDIuNjQ0NywtNjM3LjY0MDEgMzA3Ljg1NDEsLTY0MS44OTU5IDI5Ny42NTA0LC02MzcuODc5MSAyOTcuNjUwNCwtNjM3Ljg3OTEiLz4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0b3IgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0b3I8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii0xOCIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzMuMjM2OSIgeT0iLTEzLjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzBdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3RvIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTQiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdG88L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii04OC44IiByeD0iMzYuNTgyNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3My4yMzY5IiB5PSItODQuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0byYjNDU7Jmd0O3RyYWN0b3IgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlOCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0byYjNDU7Jmd0O3RyYWN0b3I8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNNzMuMjM2OSwtNzAuNTY3MkM3My4yMzY5LC02My4yNzQzIDczLjIzNjksLTU0LjY5ODcgNzMuMjM2OSwtNDYuNjEzNyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9Ijc2LjczNywtNDYuNDE3IDczLjIzNjksLTM2LjQxNyA2OS43MzcsLTQ2LjQxNzEgNzYuNzM3LC00Ni40MTciLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijc3LjMxNzIiIHk9Ii00OS4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3QgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjczLjIzNjkiIGN5PSItMTcxLjAxNTYiIHJ4PSIzNy4xNDQzIiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjczLjIzNjkiIHk9Ii0xNjYuODE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxQTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0JiM0NTsmZ3Q7dHJhY3RvIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTciIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdCYjNDU7Jmd0O3RyYWN0bzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik03My4yMzY5LC0xNTIuNzY5M0M3My4yMzY5LC0xNDIuMzM4IDczLjIzNjksLTEyOS4wMjcgNzMuMjM2OSwtMTE3LjI1MTQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI3Ni43MzcsLTExNi45OTUzIDczLjIzNjksLTEwNi45OTUzIDY5LjczNywtMTE2Ljk5NTMgNzYuNzM3LC0xMTYuOTk1MyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzguNDg2OSIgeT0iLTEyMCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gbzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWMgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWM8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii0yNzYuNTI2MyIgcng9IjM1LjM1ODciIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzMuMjM2OSIgeT0iLTI3Mi4zMjYzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDE5PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhYyYjNDU7Jmd0O3RyYWN0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTYiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjJiM0NTsmZ3Q7dHJhY3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNNzMuMjM2OSwtMjU4LjE0NzhDNzMuMjM2OSwtMjQxLjg4MzUgNzMuMjM2OSwtMjE3Ljg5ODIgNzMuMjM2OSwtMTk5LjIwODEiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI3Ni43MzcsLTE5OS4xODM2IDczLjIzNjksLTE4OS4xODM2IDY5LjczNywtMTk5LjE4MzYgNzYuNzM3LC0xOTkuMTgzNiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzYuOTMyMiIgeT0iLTIxMy42MzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiB0PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU4IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiNkM2QzZDMiIGN4PSIyMTcuMjM2OSIgY3k9Ii0yNzYuNTI2MyIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii0yNzIuMzI2MyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZDNkM2QzIj5jb250ZW50QXJyYXlbMV08L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjJiM0NTsmZ3Q7dHJlZSAtLT4KKyAgICAgICAgPCEtLSB0cmEgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIxNDEuMjM2OSIgY3k9Ii0zODIuMDM3IiByeD0iMzYuMTI1IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTQxLjIzNjkiIHk9Ii0zODYuMjM3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTQxLjIzNjkiIHk9Ii0zNjkuNDM3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDE4PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhJiM0NTsmZ3Q7dHJhYyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U1IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhJiM0NTsmZ3Q7dHJhYzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0xMjQuNDI3OSwtMzU1Ljk1NTdDMTEzLjg3NTMsLTMzOS41ODIgMTAwLjMyNDQsLTMxOC41NTYxIDg5LjgxNTgsLTMwMi4yNTA2Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iOTIuNjg4MywtMzAwLjI0NjcgODQuMzI5LC0yOTMuNzM3MiA4Ni44MDQ0LC0zMDQuMDM4OCA5Mi42ODgzLC0zMDAuMjQ2NyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTIxLjA5NDIiIHk9Ii0zMzEuMDIxNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gYzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU5IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjI1MC4yMzY5IiBjeT0iLTM4Mi4wMzciIHJ4PSIzNy45MzA2IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjUwLjIzNjkiIHk9Ii0zODYuMjM3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjUwLjIzNjkiIHk9Ii0zNjkuNDM3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDNCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhJiM0NTsmZ3Q7dHJlIC0tPgorICAgICAgICA8IS0tIHRyZWUycCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxNSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyZWUycDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI0MDEuMjM2OSIgY3k9Ii0yNzYuNTI2MyIgcng9Ijc1LjE1MjgiIHJ5PSI0MS4wOTExIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MDEuMjM2OSIgeT0iLTI4OS4xMjYzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPlByZWZpeDwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQwMS4yMzY5IiB5PSItMjcyLjMyNjMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwQkY8L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MDEuMjM2OSIgeT0iLTI1NS41MjYzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVsxXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZWUmIzQ1OyZndDt0cmVlMnAgLS0+CisgICAgICAgIDwhLS0gdHJlZXMgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTYiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmVlczwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyOTUuMjM2OSIgY3k9Ii04OC44IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyOTUuMjM2OSIgeT0iLTg0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzNdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlZSYjNDU7Jmd0O3RyZWVzIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTI2IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlZSYjNDU7Jmd0O3RyZWVzPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTIyNC43MTU5LC0yNTguNTI2M0MyMzguNDAxOCwtMjI1LjU4NzYgMjY3LjU1NjEsLTE1NS40MjA3IDI4My43NjU1LC0xMTYuNDA4OCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjI4Ny43ODA2LC0xMDYuNzQ1NSAyODguMDk5MSwtMTE3LjcwNjggMjg1Ljg2MjEsLTExMS4zNjI4IDI4My45NDM1LC0xMTUuOTgwMSAyODMuOTQzNSwtMTE1Ljk4MDEgMjgzLjk0MzUsLTExNS45ODAxIDI4NS44NjIxLC0xMTEuMzYyOCAyNzkuNzg4LC0xMTQuMjUzNCAyODcuNzgwNiwtMTA2Ljc0NTUgMjg3Ljc4MDYsLTEwNi43NDU1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNzcuNzA5MiIgeT0iLTE2Ni44MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiBzPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlJiM0NTsmZ3Q7dHJlZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyZSYjNDU7Jmd0O3RyZWU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZDNkM2QzIiBkPSJNMjI3LjAzNDksLTM1OC44MTA2QzIyMy41NzI1LC0zNTQuMTIwMyAyMjAuNTA0NCwtMzQ4Ljk3NDIgMjE4LjUyMjMsLTM0My42MjE0IDIxNC4wMTYzLC0zMzEuNDUzIDIxMy4xODc4LC0zMTcuMTczMSAyMTMuNjg5NywtMzA0LjkyMjEiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNkM2QzZDMiIHN0cm9rZT0iI2QzZDNkMyIgcG9pbnRzPSIyMTcuMTkyNSwtMzA1LjAwNjUgMjE0LjQxNDQsLTI5NC43ODI0IDIxMC4yMTA0LC0zMDQuNTA3NCAyMTcuMTkyNSwtMzA1LjAwNjUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIyNC4wOTQyIiB5PSItMzMxLjAyMTQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2QzZDNkMyI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmUmIzQ1OyZndDt0cmVlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTI1IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlJiM0NTsmZ3Q7dHJlZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yNDEuMjE5NSwtMzUzLjIwNTdDMjM2LjQ3NDksLTMzOC4wMzU4IDIzMC42ODMsLTMxOS41MTc2IDIyNS45Nzk4LC0zMDQuNDc5OSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjIyMi45MjM5LC0yOTQuNzA5MyAyMzAuMjAzOCwtMzAyLjkxMDEgMjI0LjQxNjQsLTI5OS40ODEzIDIyNS45MDksLTMwNC4yNTM0IDIyNS45MDksLTMwNC4yNTM0IDIyNS45MDksLTMwNC4yNTM0IDIyNC40MTY0LC0yOTkuNDgxMyAyMjEuNjE0MiwtMzA1LjU5NjcgMjIyLjkyMzksLTI5NC43MDkzIDIyMi45MjM5LC0yOTQuNzA5MyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjQzLjA5NDIiIHk9Ii0zMzEuMDIxNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyaTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzNjEuMjM2OSIgY3k9Ii0zODIuMDM3IiByeD0iMzcuOTMwNiIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM2MS4yMzY5IiB5PSItMzg2LjIzNyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM2MS4yMzY5IiB5PSItMzY5LjQzNyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDA1QjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZSYjNDU7Jmd0O3RyaSAtLT4KKyAgICAgICAgPCEtLSB0ciAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjI2NC4yMzY5IiBjeT0iLTQ3NS42NjgzIiByeD0iMzcuOTAyNyIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI2NC4yMzY5IiB5PSItNDc5Ljg2ODMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+U3BhcnNlPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjY0LjIzNjkiIHk9Ii00NjMuMDY4MyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDA3RTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZSYjNDU7Jmd0O3RyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTMwIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlJiM0NTsmZ3Q7dHI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMjIwLjE0NTEsLTM5OS44MTg1QzIwNi45NjA2LC00MTAuMDIyMiAxOTYuMDEzNSwtNDIzLjUwODcgMjAzLjU3NzcsLTQzNy4yNTI2IDIwNy44NTQ0LC00NDUuMDIzNCAyMTQuNDQwMSwtNDUxLjQ0MjIgMjIxLjcyMDgsLTQ1Ni42NjA0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMjMwLjQ5MDIsLTQ2Mi4yNDM1IDIxOS42MzgsLTQ2MC42Njg5IDIyNi4yNzI1LC00NTkuNTU4MiAyMjIuMDU0NywtNDU2Ljg3MjkgMjIyLjA1NDcsLTQ1Ni44NzI5IDIyMi4wNTQ3LC00NTYuODcyOSAyMjYuMjcyNSwtNDU5LjU1ODIgMjI0LjQ3MTUsLTQ1My4wNzY5IDIzMC40OTAyLC00NjIuMjQzNSAyMzAuNDkwMiwtNDYyLjI0MzUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIyNC4wNjY1IiB5PSItNDI0LjY1MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2ZmMDAwMCI+MHgwM0I8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmUmIzQ1OyZndDt0cmVlMnAgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTQiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmUmIzQ1OyZndDt0cmVlMnA8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjgxLjk0NDEsLTM2NS45MTM1QzI5Mi4wODQyLC0zNjEuMTggMzAzLjQ3MzYsLTM1Ni4yOTM4IDMxNC4yMzY5LC0zNTIuNjIxNCAzMzEuMDcyOCwtMzQ2Ljg3NyAzMzguNDM4NiwtMzUzLjQ5MzMgMzUzLjIzNjksLTM0My42MjE0IDM2MC45MzY3LC0zMzguNDg0OCAzNjcuODA3OCwtMzMxLjY2NTkgMzczLjc3ODEsLTMyNC4zNDEzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMzc2LjY1NywtMzI2LjMzNzEgMzc5Ljg5OTQsLTMxNi4yNTA2IDM3MS4wNzQ2LC0zMjIuMTEzNiAzNzYuNjU3LC0zMjYuMzM3MSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzc3LjA5NDIiIHk9Ii0zMzEuMDIxNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaWUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTAiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmllPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjU4NS4yMzY5IiBjeT0iLTI3Ni41MjYzIiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI1ODUuMjM2OSIgeT0iLTI3Mi4zMjYzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVsyXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaSYjNDU7Jmd0O3RyaWUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTIiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmkmIzQ1OyZndDt0cmllPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTM5My44MDg0LC0zNjYuNjk0OEM0MzIuOTIxOSwtMzQ4LjI3MTIgNDk4LjY2MjgsLTMxNy4zMDUzIDU0MS45OTksLTI5Ni44OTI3Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNTQzLjYwMTksLTMwMC4wMDY1IDU1MS4xNTcxLC0yOTIuNTc4OSA1NDAuNjE5LC0yOTMuNjczOSA1NDMuNjAxOSwtMzAwLjAwNjUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQ3OC4wOTQyIiB5PSItMzMxLjAyMTQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyYSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U0IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmE8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjMwLjM4NjIsLTQ2Mi4zNDczQzIxNi4zNDk4LC00NTUuOTMxOCAyMDAuMzc4LC00NDcuNDEwNiAxODcuNTIyMywtNDM3LjI1MjYgMTc5LjczODEsLTQzMS4xMDIgMTcyLjMzNDYsLTQyMy40NjI2IDE2NS44MjI5LC00MTUuODQ3MyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjE2OC4xNzE0LC00MTMuMTkwMiAxNTkuMTMxNCwtNDA3LjY2NDkgMTYyLjc1MjYsLTQxNy42MjE3IDE2OC4xNzE0LC00MTMuMTkwMiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTkzLjA5NDIiIHk9Ii00MjQuNjUyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gYTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTkiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3RyZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yNjIuMzIzNCwtNDQ2LjA1NzVDMjYxLjczNTQsLTQzOS40OTc5IDI2MC45ODU0LC00MzIuNDk1MSAyNTkuMjA1OSwtNDIxLjI4MyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjI2Mi42NDEsLTQyMC42MDM2IDI1Ny41NDE0LC00MTEuMzE2OCAyNTUuNzM2NiwtNDIxLjc1NjcgMjYyLjY0MSwtNDIwLjYwMzYiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI2Ny4wOTQyIiB5PSItNDI0LjY1MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyNCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTI1MS40MzY4LC00NDcuOTQzOUMyNTAuMjQwNSwtNDQ0LjQwNzYgMjQ5LjIxNzQsLTQ0MC43ODc5IDI0OC41MjIzLC00MzcuMjUyNiAyNDcuNTMsLTQzMi4yMDYzIDI0Ny4wMjg3LC00MjYuODUxMyAyNDYuODU2MiwtNDIxLjUzODMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyNDYuODg3MSwtNDExLjQ2NTQgMjUxLjM1NjMsLTQyMS40NzkyIDI0Ni44NzE3LC00MTYuNDY1NCAyNDYuODU2MywtNDIxLjQ2NTQgMjQ2Ljg1NjMsLTQyMS40NjU0IDI0Ni44NTYzLC00MjEuNDY1NCAyNDYuODcxNywtNDE2LjQ2NTQgMjQyLjM1NjMsLTQyMS40NTE2IDI0Ni44ODcxLC00MTEuNDY1NCAyNDYuODg3MSwtNDExLjQ2NTQiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI1NC4wOTQyIiB5PSItNDI0LjY1MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyaSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJpPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTI4OC4yMTQ0LC00NTIuNTIzNUMzMDAuODA1OSwtNDQwLjM2OTMgMzE2LjM5LC00MjUuMzI2NCAzMjkuOTIzNCwtNDEyLjI2MyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjMzMi40MzQ5LC00MTQuNzAzMyAzMzcuMTk5LC00MDUuMjQwMSAzMjcuNTczMywtNDA5LjY2NjkgMzMyLjQzNDksLTQxNC43MDMzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMjUuOTMyMiIgeT0iLTQyNC42NTI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBpPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTMxIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTI2NC4yMzY5LC01MDUuMTY0OUMyNjQuMjM2OSwtNTEzLjA3OTkgMjY0LjIzNjksLTUyMS42MjA0IDI2NC4yMzY5LC01MjkuNDc1MSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjI2NC4yMzY5LC01MzkuNjM3NiAyNTkuNzM3LC01MjkuNjM3NiAyNjQuMjM2OSwtNTM0LjYzNzYgMjY0LjIzNywtNTI5LjYzNzYgMjY0LjIzNywtNTI5LjYzNzYgMjY0LjIzNywtNTI5LjYzNzYgMjY0LjIzNjksLTUzNC42Mzc2IDI2OC43MzcsLTUyOS42Mzc3IDI2NC4yMzY5LC01MzkuNjM3NiAyNjQuMjM2OSwtNTM5LjYzNzYiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI4Mi41MTMyIiB5PSItNTE4LjI4MzkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2ZmMDAwMCI+MHgwN0U8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0JiM0NTsmZ3Q7cm9vdCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UzMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnQmIzQ1OyZndDtyb290PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTI3Mi41NzQ1LC01NzUuNTk0MkMyNzMuNjc3NCwtNTc4LjYzMjYgMjc0LjYzMzYsLTU4MS44MDQzIDI3NS4yMzY5LC01ODQuODgzOSAyNzYuMzA1NiwtNTkwLjMzOTQgMjc2LjM1NjQsLTU5Ni4wOTYyIDI3NS43ODksLTYwMS43NTEyIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMjc0LjE4NjIsLTYxMS43MzMgMjcxLjMyODYsLTYwMS4xNDYgMjc0Ljk3ODksLTYwNi43OTYyIDI3NS43NzE3LC02MDEuODU5NSAyNzUuNzcxNywtNjAxLjg1OTUgMjc1Ljc3MTcsLTYwMS44NTk1IDI3NC45Nzg5LC02MDYuNzk2MiAyODAuMjE0OCwtNjAyLjU3MyAyNzQuMTg2MiwtNjExLjczMyAyNzQuMTg2MiwtNjExLjczMyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjk0LjkwNTIiIHk9Ii01ODkuMDgzOSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj4weDA5QjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHQmIzQ1OyZndDt0ciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UzIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dCYjNDU7Jmd0O3RyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTI1NC4yNzA1LC01NDAuMjk1NEMyNTIuOTQ5OSwtNTM3LjI0MjMgMjUxLjgwMzIsLTUzNC4wMzQzIDI1MS4wNzYzLC01MzAuODgzOSAyNDkuODAyMywtNTI1LjM2MjYgMjQ5Ljc2NDYsLTUxOS41MzYgMjUwLjQ3MiwtNTEzLjgxOTciLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIyNTMuOTU4OSwtNTE0LjIyNTUgMjUyLjQ0NDEsLTUwMy43Mzk1IDI0Ny4wODkxLC01MTIuODgxNCAyNTMuOTU4OSwtNTE0LjIyNTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI1NS4zMTcyIiB5PSItNTE4LjI4MzkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0JiM0NTsmZ3Q7dHIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50JiM0NTsmZ3Q7dHI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMjk2LjM2ODQsLTU0OC44MDUyQzMwNC45NDk1LC01NDQuNzU0NyAzMTMuMjIyMywtNTM4Ljk5NzYgMzE4LjIzNjksLTUzMC44ODM5IDMyNS44Njk4LC01MTguNTMzNiAzMTcuMzg0NywtNTA2Ljc1MjUgMzA1LjA1MSwtNDk3LjI2ODciLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyOTYuNTIxLC00OTEuMzg1NCAzMDcuMzA3OSwtNDkzLjM1ODggMzAwLjYzNjksLTQ5NC4yMjQzIDMwNC43NTI5LC00OTcuMDYzMSAzMDQuNzUyOSwtNDk3LjA2MzEgMzA0Ljc1MjksLTQ5Ny4wNjMxIDMwMC42MzY5LC00OTQuMjI0MyAzMDIuMTk3OSwtNTAwLjc2NzUgMjk2LjUyMSwtNDkxLjM4NTQgMjk2LjUyMSwtNDkxLjM4NTQiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMyNS4zMTcyIiB5PSItNTE4LjI4MzkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmVlMiAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxNCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyZWUyPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjM1NC4yMzY5IiBjeT0iLTE3MS4wMTU2IiByeD0iMzkuMjM0MiIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM1NC4yMzY5IiB5PSItMTc1LjIxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNTQuMjM2OSIgeT0iLTE1OC40MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MEJCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlZTImIzQ1OyZndDt0cmVlMnAgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjgiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmVlMiYjNDU7Jmd0O3RyZWUycDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0zMzIuNTk5OCwtMTk1LjcyMjVDMzI2LjgwNDQsLTIwNS4zNDM5IDMyMy40MTEyLC0yMTYuMzk5NCAzMjguNTYzNywtMjI2LjIzMTMgMzMxLjM0NjksLTIzMS41NDIyIDMzNC45NzM4LC0yMzYuNDAzNyAzMzkuMTIyLC0yNDAuODI5MiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjM0Ni41MzgzLC0yNDcuODY3NyAzMzYuMTg3MSwtMjQ0LjI0NzggMzQyLjkxMTYsLTI0NC40MjU3IDMzOS4yODQ5LC0yNDAuOTgzOCAzMzkuMjg0OSwtMjQwLjk4MzggMzM5LjI4NDksLTI0MC45ODM4IDM0Mi45MTE2LC0yNDQuNDI1NyAzNDIuMzgyNywtMjM3LjcxOTcgMzQ2LjUzODMsLTI0Ny44Njc3IDM0Ni41MzgzLC0yNDcuODY3NyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzQ5LjA3MzUiIHk9Ii0yMTMuNjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj4weDBCQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZWUyJiM0NTsmZ3Q7dHJlZXMgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTUiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmVlMiYjNDU7Jmd0O3RyZWVzPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTMzNS41Njg5LC0xNDUuMDAyMUMzMjguNjkzNSwtMTM1LjQyMTMgMzIwLjkwNjQsLTEyNC41NzAxIDMxNC4wMjA4LC0xMTQuOTc1MSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjMxNi42NzY2LC0xMTIuNjcyOCAzMDguMDAyNywtMTA2LjU4ODkgMzEwLjk4OTUsLTExNi43NTQxIDMxNi42NzY2LC0xMTIuNjcyOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzMxLjcwOTIiIHk9Ii0xMjAiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmVlMnAmIzQ1OyZndDt0cmUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjkiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmVlMnAmIzQ1OyZndDt0cmU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMzQ2LjE1OSwtMzA0LjY0NDJDMzM0LjI4NjgsLTMxMS40MTk3IDMyMi4wMzI0LC0zMTguOTgyNCAzMTEuMTE3NywtMzI2LjgyMTQgMzAwLjc5NTUsLTMzNC4yMzQ3IDI5MC4yODY5LC0zNDMuMTcyOSAyODAuOTcwOCwtMzUxLjY3NzYiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIyNzMuNDU2MSwtMzU4LjY3NjYgMjc3LjcwNjgsLTM0OC41NjgxIDI3Ny4xMTQ5LC0zNTUuMjY4OSAyODAuNzczOCwtMzUxLjg2MTEgMjgwLjc3MzgsLTM1MS44NjExIDI4MC43NzM4LC0zNTEuODYxMSAyNzcuMTE0OSwtMzU1LjI2ODkgMjgzLjg0MDgsLTM1NS4xNTQxIDI3My40NTYxLC0zNTguNjc2NiAyNzMuNDU2MSwtMzU4LjY3NjYiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMzMC4yOTY1IiB5PSItMzMxLjAyMTQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2ZmMDAwMCI+MHgwQkY8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmVlMnAmIzQ1OyZndDt0cmllIC0tPgorICAgICAgICA8IS0tIHRyZWUycCYjNDU7Jmd0O3RyZWUyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTEzIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlZTJwJiM0NTsmZ3Q7dHJlZTI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMzgzLjMzNDEsLTIzNi4zMzYzQzM3OS4yMTM4LC0yMjcuMDg2NiAzNzQuODQ5OCwtMjE3LjI4OTggMzcwLjc4OTgsLTIwOC4xNzU0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMzczLjk1ODEsLTIwNi42ODYzIDM2Ni42OTE4LC0xOTguOTc1NyAzNjcuNTYzOCwtMjA5LjUzNDYgMzczLjk1ODEsLTIwNi42ODYzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzODMuMDY3MiIgeT0iLTIxMy42MzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiDOtTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZWVzJiM0NTsmZ3Q7dHJlZTIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjciIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmVlcyYjNDU7Jmd0O3RyZWUyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTI5MC44MjM2LC0xMDYuODI2N0MyODkuNzQ5OSwtMTE1LjE0MTkgMjg5LjkyNjksLTEyNC44NjA2IDI5NC4xNjQzLC0xMzIuNiAyOTguMTM1NCwtMTM5Ljg1MzEgMzA0LjEyNCwtMTQ1LjkzNjYgMzEwLjgwNywtMTUwLjk2NzEiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIzMTkuNTQzOCwtMTU2Ljc4NDUgMzA4LjcyNjEsLTE1NC45ODc4IDMxNS4zODIsLTE1NC4wMTMzIDMxMS4yMjAyLC0xNTEuMjQyMSAzMTEuMjIwMiwtMTUxLjI0MjEgMzExLjIyMDIsLTE1MS4yNDIxIDMxNS4zODIsLTE1NC4wMTMzIDMxMy43MTQzLC0xNDcuNDk2NSAzMTkuNTQzOCwtMTU2Ljc4NDUgMzE5LjU0MzgsLTE1Ni43ODQ1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMDMuMjczMiIgeT0iLTEyMCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj4gfjM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC53MS5zdmcgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQudzEuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZTk0YWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQudzEuc3ZnCkBAIC0wLDAgKzEsMjI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKKyAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cis8IS0tLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDIuNDAuMSAoMjAxNjEyMjUuMDMwNCkKKyMgZW1iZWRkZWQgRE9UIChwbGFudHVtbCkgd29ya3MgaW4gSURFQSBwcmV2aWV3CisjIGJ1dCBub3Qgb24gR2l0SHViCitgYGAgcGxhbnR1bWwKK2RpZ3JhcGggRyB7CisgICAgdHJhY3RvciBbbGFiZWwgPSAiY29udGVudEFycmF5WzBdIl0KKyAgICB0cmFjdG8gW2xhYmVsID0gIjB4MDFCIl0KKyAgICB0cmFjdCBbbGFiZWwgPSAiMHgwMUEiXQorICAgIHRyYWMgW2xhYmVsID0gIjB4MDE5Il0KKyAgICB0cmEgW2xhYmVsID0gIkNoYWluXG4weDAxOCJdCisKKyAgICB0cmVlIFtsYWJlbCA9ICJjb250ZW50QXJyYXlbMV0iXQorICAgIHRyZSBbbGFiZWwgPSAiQ2hhaW5cbjB4MDNCIl0KKyAgICB0cmllIFtsYWJlbCA9ICJjb250ZW50QXJyYXlbMl0iXQorICAgIHRyaSBbbGFiZWwgPSAiQ2hhaW5cbjB4MDVCIl0KKworICAgIHRyIFtsYWJlbCA9ICJTcGFyc2VcbjB4MDdFIl0KKworICAgIHQgW2xhYmVsID0gIjB4MDlCIl0KKyAgICByb290IFtsYWJlbCA9ICJDaGFpblxuMHg5QSJdCisKKyAgICAvLyBlZGdlIFtjb2xvcj0ibm9uZSIsIGZvbnRjb2xvcj0ibm9uZSJdCisgICAgcm9vdCAtPiB0IFtsYWJlbCA9ICIgdCJdCisgICAgdCAtPiB0ciBbbGFiZWwgPSAiIHIiXQorICAgIHRyIC0+IHRyYSBbbGFiZWwgPSAiIGEiXQorICAgIHRyYSAtPiB0cmFjIFtsYWJlbCA9ICIgYyJdCisgICAgdHJhYyAtPiB0cmFjdCBbbGFiZWwgPSAiIHQiXQorICAgIHRyYWN0IC0+IHRyYWN0byBbbGFiZWwgPSAiIG8iXQorICAgIHRyYWN0byAtPiB0cmFjdG9yIFtsYWJlbCA9ICIgciJdCisKKyAgICB0ciAtPiB0cmUgW2xhYmVsID0gIiBlIl0KKyAgICB0cmUgLT4gdHJlZSBbbGFiZWwgPSAiIGUiXQorCisgICAgdHIgLT4gdHJpIFtsYWJlbCA9ICIgaSJdCisgICAgdHJpIC0+IHRyaWUgW2xhYmVsID0gIiBlIl0KKworICAgIC8vIHtyYW5rPXNhbWUgdHJhIC0+IHRyZSAtPiB0cmkgW3N0eWxlPWludmlzXX0KKyAgICB7cmFuaz1zYW1lIHRyYWMgLT4gdHJlZSAtPiB0cmllIFtzdHlsZT1pbnZpc119Cit9CitgYGAKKyAtLT4KKzwhLS0gVGl0bGU6IEcgUGFnZXM6IDEgLS0+Cis8c3ZnIHdpZHRoPSI0ODBwdCIgaGVpZ2h0PSI3MzRwdCIKKyAgICAgdmlld0JveD0iMC4wMCAwLjAwIDQ4MC40NyA3MzQuMDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgorICAgIDxnIGlkPSJncmFwaDAiIGNsYXNzPSJncmFwaCIgdHJhbnNmb3JtPSJzY2FsZSgxIDEpIHJvdGF0ZSgwKSB0cmFuc2xhdGUoNCA3MzAuMDkzOSkiPgorICAgICAgICA8dGl0bGU+RzwvdGl0bGU+CisgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0idHJhbnNwYXJlbnQiIHBvaW50cz0iLTQsNCAtNCwtNzMwLjA5MzkgNDc2LjQ3MzgsLTczMC4wOTM5IDQ3Ni40NzM4LDQgLTQsNCIvPgorICAgICAgICA8IS0tIHRyYWN0b3IgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0b3I8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii0xOCIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzMuMjM2OSIgeT0iLTEzLjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzBdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3RvIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTIiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdG88L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii0xMDYuOCIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzMuMjM2OSIgeT0iLTEwMi42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDFCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3RvJiM0NTsmZ3Q7dHJhY3RvciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U3IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvJiM0NTsmZ3Q7dHJhY3RvcjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik03My4yMzY5LC04OC40MDA2QzczLjIzNjksLTc2LjI5NDkgNzMuMjM2OSwtNjAuMjA3NiA3My4yMzY5LC00Ni40Njc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNzYuNzM3LC00Ni4wNzIgNzMuMjM2OSwtMzYuMDcyIDY5LjczNywtNDYuMDcyMSA3Ni43MzcsLTQ2LjA3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzcuMzE3MiIgeT0iLTU4LjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUzIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3Q8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii0xOTUuNiIgcng9IjM3LjE0NDMiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzMuMjM2OSIgeT0iLTE5MS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDFBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3QmIzQ1OyZndDt0cmFjdG8gLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0JiM0NTsmZ3Q7dHJhY3RvPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTczLjIzNjksLTE3Ny4yMDA2QzczLjIzNjksLTE2NS4wOTQ5IDczLjIzNjksLTE0OS4wMDc2IDczLjIzNjksLTEzNS4yNjc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNzYuNzM3LC0xMzQuODcyIDczLjIzNjksLTEyNC44NzIgNjkuNzM3LC0xMzQuODcyMSA3Ni43MzcsLTEzNC44NzIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijc4LjQ4NjkiIHk9Ii0xNDciIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IG88L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTQiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjczLjIzNjkiIGN5PSItMjg0LjQiIHJ4PSIzNS4zNTg3IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjczLjIzNjkiIHk9Ii0yODAuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxOTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWMmIzQ1OyZndDt0cmFjdCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U1IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhYyYjNDU7Jmd0O3RyYWN0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTczLjIzNjksLTI2Ni4wMDA2QzczLjIzNjksLTI1My44OTQ5IDczLjIzNjksLTIzNy44MDc2IDczLjIzNjksLTIyNC4wNjc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNzYuNzM3LC0yMjMuNjcyIDczLjIzNjksLTIxMy42NzIgNjkuNzM3LC0yMjMuNjcyMSA3Ni43MzcsLTIyMy42NzIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijc2LjkzMjIiIHk9Ii0yMzUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gdDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZWUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyZWU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjE3LjIzNjkiIGN5PSItMjg0LjQiIHJ4PSI3My40NzQ1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxNy4yMzY5IiB5PSItMjgwLjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzFdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhYyYjNDU7Jmd0O3RyZWUgLS0+CisgICAgICAgIDwhLS0gdHJhIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTUiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmE8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMTEyLjIzNjkiIGN5PSItMzg0LjYxNTYiIHJ4PSIzNi4xMjUiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxMTIuMjM2OSIgeT0iLTM4OC44MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTEyLjIzNjkiIHk9Ii0zNzIuMDE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxODwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYSYjNDU7Jmd0O3RyYWMgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYSYjNDU7Jmd0O3RyYWM8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMTAxLjI2OTQsLTM1Ni40MzMzQzk1LjgzMDYsLTM0Mi40NTc1IDg5LjI4ODcsLTMyNS42NDcyIDgzLjg5MjksLTMxMS43ODIxIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iODcuMDg3MiwtMzEwLjMzOTMgODAuMTk4OCwtMzAyLjI4OTUgODAuNTYzOCwtMzEyLjg3OCA4Ny4wODcyLC0zMTAuMzM5MyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iOTguMDk0MiIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBjPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU4IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzOTkuMjM2OSIgY3k9Ii0yODQuNCIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzk5LjIzNjkiIHk9Ii0yODAuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5jb250ZW50QXJyYXlbMl08L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmVlJiM0NTsmZ3Q7dHJpZSAtLT4KKyAgICAgICAgPCEtLSB0cmUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyMTcuMjM2OSIgY3k9Ii0zODQuNjE1NiIgcng9IjM3LjkzMDYiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTcuMjM2OSIgeT0iLTM4OC44MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii0zNzIuMDE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAzQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZSYjNDU7Jmd0O3RyZWUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlOSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyZSYjNDU7Jmd0O3RyZWU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjE3LjIzNjksLTM1NS4wODk3QzIxNy4yMzY5LC0zNDEuNjA0NiAyMTcuMjM2OSwtMzI1LjcxMjMgMjE3LjIzNjksLTMxMi40MTUzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjIwLjczNywtMzEyLjQwMzMgMjE3LjIzNjksLTMwMi40MDMzIDIxMy43MzcsLTMxMi40MDM0IDIyMC43MzcsLTMxMi40MDMzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMjIuMDk0MiIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTkiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmk8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMzU0LjIzNjkiIGN5PSItMzg0LjYxNTYiIHJ4PSIzNy45MzA2IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzU0LjIzNjkiIHk9Ii0zODguODE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM1NC4yMzY5IiB5PSItMzcyLjAxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwNUI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmkmIzQ1OyZndDt0cmllIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTExIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpJiM0NTsmZ3Q7dHJpZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0zNjYuNzcxOSwtMzU2LjdDMzczLjExMDksLTM0Mi41ODMgMzgwLjc3MjMsLTMyNS41MjA5IDM4Ny4wNjAzLC0zMTEuNTE3NSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjM5MC4yNTc1LC0zMTIuOTQxNSAzOTEuMTYwOSwtMzAyLjM4NTIgMzgzLjg3MTcsLTMxMC4wNzQgMzkwLjI1NzUsLTMxMi45NDE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzODYuMDk0MiIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHIgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTAiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyMTcuMjM2OSIgY3k9Ii00OTYuMjQ2OSIgcng9IjM3LjkwMjciIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTcuMjM2OSIgeT0iLTUwMC40NDY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPlNwYXJzZTwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxNy4yMzY5IiB5PSItNDgzLjY0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwN0U8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyYSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UzIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmE8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMTk0LjcxMTgsLTQ3Mi4yOTkyQzE3OS4xMDQ3LC00NTUuNzA2NSAxNTguMTgyOCwtNDMzLjQ2MzMgMTQxLjMxNywtNDE1LjUzMjMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIxNDMuNzY1MywtNDEzLjAyNjcgMTM0LjM2NDQsLTQwOC4xNDA2IDEzOC42NjY0LC00MTcuODIyNyAxNDMuNzY1MywtNDEzLjAyNjciLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE3Ni4wOTQyIiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U4IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjE3LjIzNjksLTQ2Ni42MjQ5QzIxNy4yMzY5LC00NTMuNzU2OCAyMTcuMjM2OSwtNDM4LjQ4NjcgMjE3LjIzNjksLTQyNC42MzE5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjIwLjczNywtNDI0LjM3NjEgMjE3LjIzNjksLTQxNC4zNzYxIDIxMy43MzcsLTQyNC4zNzYyIDIyMC43MzcsLTQyNC4zNzYxIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMjIuMDk0MiIgeT0iLTQzNi4yMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0cmkgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTAiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3RyaTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yNDMuMzI4LC00NzQuOTg3MkMyNjQuOTk1NiwtNDU3LjMzMTkgMjk1Ljk5NjMsLTQzMi4wNzE2IDMxOS43MTY5LC00MTIuNzQzNSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjMyMi4yMzQ4LC00MTUuMjA2NiAzMjcuNzc2MywtNDA2LjE3NjUgMzE3LjgxMywtNDA5Ljc4IDMyMi4yMzQ4LC00MTUuMjA2NiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjk2LjkzMjIiIHk9Ii00MzYuMjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gaTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHQgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTEiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjIxNy4yMzY5IiBjeT0iLTU5Ni40NjI2IiByeD0iMzYuNTgyNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTcuMjM2OSIgeT0iLTU5Mi4yNjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDlCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdCYjNDU7Jmd0O3RyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50JiM0NTsmZ3Q7dHI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjE3LjIzNjksLTU3OC4wODE1QzIxNy4yMzY5LC01NjYuMzUwMiAyMTcuMjM2OSwtNTUwLjY3NzQgMjE3LjIzNjksLTUzNi4xODg1Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjIwLjczNywtNTM1LjkyMDggMjE3LjIzNjksLTUyNS45MjA5IDIxMy43MzcsLTUzNS45MjA5IDIyMC43MzcsLTUzNS45MjA4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMjEuMzE3MiIgeT0iLTU0Ny44NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gcm9vdCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnJvb3Q8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjE3LjIzNjkiIGN5PSItNjk2LjY3ODIiIHJ4PSIzMy4xMzM3IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii03MDAuODc4MiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxNy4yMzY5IiB5PSItNjg0LjA3ODIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHg5QTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHJvb3QmIzQ1OyZndDt0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTEiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT5yb290JiM0NTsmZ3Q7dDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yMTcuMjM2OSwtNjY3LjE1MjJDMjE3LjIzNjksLTY1My42NjcxIDIxNy4yMzY5LC02MzcuNzc0OSAyMTcuMjM2OSwtNjI0LjQ3NzkiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIyMjAuNzM3LC02MjQuNDY1OSAyMTcuMjM2OSwtNjE0LjQ2NTkgMjEzLjczNywtNjI0LjQ2NTkgMjIwLjczNywtNjI0LjQ2NTkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIyMC45MzIyIiB5PSItNjM2LjY2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC53Mi5zdmcgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQudzIuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOGFiMjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQudzIuc3ZnCkBAIC0wLDAgKzEsMzI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKKyAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cis8IS0tLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDIuNDAuMSAoMjAxNjEyMjUuMDMwNCkKK2BgYHBsYW50dW1sCitkaWdyYXBoIEcgeworICAgIHsgcmFuaz1zYW1lIHJvb3QgLT4gc3RhcnQgW3N0eWxlPWludmlzXSB9CisgICAgc3RhcnQgW2xhYmVsPSJzdGFydC9lbmQiXQorCisgICAgdHJhY3RvciBbbGFiZWwgPSAiY29udGVudEFycmF5WzBdIl0KKyAgICB0cmFjdG8gW2xhYmVsID0gIjB4MDFCIl0KKyAgICB0cmFjdCBbbGFiZWwgPSAiMHgwMUEiXQorICAgIHRyYWMgW2xhYmVsID0gIjB4MDE5Il0KKyAgICB0cmEgW2xhYmVsID0gIkNoYWluXG4weDAxOCJdCisKKyAgICB0cmVlIFtsYWJlbCA9ICJjb250ZW50QXJyYXlbMV0iXQorICAgIHRyZSBbbGFiZWwgPSAiQ2hhaW5cbjB4MDNCIl0KKyAgICB0cmllIFtsYWJlbCA9ICJjb250ZW50QXJyYXlbMl0iXQorICAgIHRyaSBbbGFiZWwgPSAiQ2hhaW5cbjB4MDVCIl0KKworICAgIHRyIFtsYWJlbCA9ICJTcGFyc2VcbjB4MDdFIl0KKworICAgIHQgW2xhYmVsID0gIjB4MDlCIl0KKyAgICByb290IFtsYWJlbCA9ICJDaGFpblxuMHg5QSJdCisKKyAgICAvLyB7cmFuaz1zYW1lIHRyYSAtPiB0cmUgLT4gdHJpIFtzdHlsZT1pbnZpc119CisgICAge3Jhbms9c2FtZSB0cmFjIC0+IHRyZWUgLT4gdHJpZSBbc3R5bGU9aW52aXNdfQorCisgICAgc3ViZ3JhcGggcGF0aCB7CisgICAgICAgIGVkZ2UgW2NvbG9yID0gImxpZ2h0Ymx1ZSI7IGZvbnRjb2xvcj0iYmx1ZSI7IGFycm93aGVhZD0idmVlIl0KKworICAgICAgICBzdGFydCAtPiByb290CisKKyAgICByb290IC0+IHQgW2xhYmVsID0gIiB0Il0KKyAgICB0IC0+IHRyIFtsYWJlbCA9ICIgciJdCisgICAgdHIgLT4gdHJhIFtsYWJlbCA9ICIgYSJdCisgICAgdHJhIC0+IHRyYWMgW2xhYmVsID0gIiBjIl0KKyAgICB0cmFjIC0+IHRyYWN0IFtsYWJlbCA9ICIgdCJdCisgICAgdHJhY3QgLT4gdHJhY3RvIFtsYWJlbCA9ICIgbyJdCisgICAgdHJhY3RvIC0+IHRyYWN0b3IgW2xhYmVsID0gIiByIl0KKworICAgIHRyIC0+IHRyZSBbbGFiZWwgPSAiIGUiXQorICAgIHRyZSAtPiB0cmVlIFtsYWJlbCA9ICIgZSJdCisKKyAgICB0ciAtPiB0cmkgW2xhYmVsID0gIiBpIl0KKyAgICB0cmkgLT4gdHJpZSBbbGFiZWwgPSAiIGUiXQorICAgIH0KKworICAgIHN1YmdyYXBoIGJhY2sgeworICAgICAgICBlZGdlIFtjb2xvciA9ICJwaW5rIjsgZm9udGNvbG9yPSJibHVlIjsgY29uc3RyYWludD0iZmFsc2UiOyBhcnJvd2hlYWQ9InZlZSJdCisKKyAgICAgICAgdHJhY3RvciAtPiB0cmFjdG8gLT4gdHJhY3QgLT4gdHJhYyAtPiB0cmEgLT4gdHIKKyAgICAgICAgdHJlZSAtPiB0cmUgLT4gdHIKKyAgICAgICAgdHJpZSAtPiB0cmkgLT4gdHIgLT4gdCAtPiByb290IC0+IHN0YXJ0CisgICAgfQorfQorCitgYGAKKyAtLT4KKzwhLS0gVGl0bGU6IEcgUGFnZXM6IDEgLS0+Cis8c3ZnIHdpZHRoPSI0ODBwdCIgaGVpZ2h0PSI3MzRwdCIKKyAgICAgdmlld0JveD0iMC4wMCAwLjAwIDQ4MC40NyA3MzQuMDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgorICAgIDxnIGlkPSJncmFwaDAiIGNsYXNzPSJncmFwaCIgdHJhbnNmb3JtPSJzY2FsZSgxIDEpIHJvdGF0ZSgwKSB0cmFuc2xhdGUoNCA3MzAuMDkzOSkiPgorICAgICAgICA8dGl0bGU+RzwvdGl0bGU+CisgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0idHJhbnNwYXJlbnQiIHBvaW50cz0iLTQsNCAtNCwtNzMwLjA5MzkgNDc2LjQ3MzgsLTczMC4wOTM5IDQ3Ni40NzM4LDQgLTQsNCIvPgorICAgICAgICA8IS0tIHJvb3QgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnJvb3Q8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjE3LjIzNjkiIGN5PSItNjk2LjY3ODIiIHJ4PSIzMy4xMzM3IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii03MDAuODc4MiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxNy4yMzY5IiB5PSItNjg0LjA3ODIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHg5QTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHN0YXJ0IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTIiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT5zdGFydDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzMzAuMjM2OSIgY3k9Ii02OTYuNjc4MiIgcng9IjQ0LjA3NzUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzMwLjIzNjkiIHk9Ii02OTIuNDc4MiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5zdGFydC9lbmQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSByb290JiM0NTsmZ3Q7c3RhcnQgLS0+CisgICAgICAgIDwhLS0gcm9vdCYjNDU7Jmd0O3N0YXJ0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTI3IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+cm9vdCYjNDU7Jmd0O3N0YXJ0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTI0NS4wNDU1LC03MTMuMDUwOEMyNjIuMDc5NiwtNzE5LjgwNjEgMjc5LjExMzcsLTcyMC41NDU1IDI5Ni4xNDc4LC03MTUuMjY4OSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjMwNS42MTEyLC03MTEuNzE4NSAyOTcuODI5MiwtNzE5LjQ0NDQgMzAwLjkyOTksLTcxMy40NzQ4IDI5Ni4yNDg1LC03MTUuMjMxMiAyOTYuMjQ4NSwtNzE1LjIzMTIgMjk2LjI0ODUsLTcxNS4yMzEyIDMwMC45Mjk5LC03MTMuNDc0OCAyOTQuNjY3OCwtNzExLjAxNzkgMzA1LjYxMTIsLTcxMS43MTg1IDMwNS42MTEyLC03MTEuNzE4NSIvPgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnQ8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjE3LjIzNjkiIGN5PSItNTk2LjQ2MjYiIHJ4PSIzNi41ODI0IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxNy4yMzY5IiB5PSItNTkyLjI2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwOUI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSByb290JiM0NTsmZ3Q7dCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U1IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+cm9vdCYjNDU7Jmd0O3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMjE3LjIzNjksLTY2Ny4xNTIyQzIxNy4yMzY5LC02NTMuNjY3MSAyMTcuMjM2OSwtNjM3Ljc3NDkgMjE3LjIzNjksLTYyNC40Nzc5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjE3LjIzNjksLTYxNC40NjU5IDIyMS43MzcsLTYyNC40NjU5IDIxNy4yMzY5LC02MTkuNDY1OSAyMTcuMjM3LC02MjQuNDY1OSAyMTcuMjM3LC02MjQuNDY1OSAyMTcuMjM3LC02MjQuNDY1OSAyMTcuMjM2OSwtNjE5LjQ2NTkgMjEyLjczNywtNjI0LjQ2NTkgMjE3LjIzNjksLTYxNC40NjU5IDIxNy4yMzY5LC02MTQuNDY1OSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjIwLjkzMjIiIHk9Ii02MzYuNjYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gdDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHN0YXJ0JiM0NTsmZ3Q7cm9vdCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U0IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+c3RhcnQmIzQ1OyZndDtyb290PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTI4NS44NTQ5LC02OTYuNjc4MkMyNzcuNTQzNywtNjk2LjY3ODIgMjY5LjIzMjYsLTY5Ni42NzgyIDI2MC45MjE1LC02OTYuNjc4MiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjI1MC43ODM4LC02OTYuNjc4MiAyNjAuNzgzOCwtNjkyLjE3ODMgMjU1Ljc4MzgsLTY5Ni42NzgzIDI2MC43ODM4LC02OTYuNjc4MyAyNjAuNzgzOCwtNjk2LjY3ODMgMjYwLjc4MzgsLTY5Ni42NzgzIDI1NS43ODM4LC02OTYuNjc4MyAyNjAuNzgzNywtNzAxLjE3ODMgMjUwLjc4MzgsLTY5Ni42NzgyIDI1MC43ODM4LC02OTYuNjc4MiIvPgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3RvciAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUzIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvcjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI3My4yMzY5IiBjeT0iLTE4IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3My4yMzY5IiB5PSItMTMuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5jb250ZW50QXJyYXlbMF08L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdG8gLS0+CisgICAgICAgIDxnIGlkPSJub2RlNCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0bzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI3My4yMzY5IiBjeT0iLTEwNi44IiByeD0iMzYuNTgyNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3My4yMzY5IiB5PSItMTAyLjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwMUI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdG9yJiM0NTsmZ3Q7dHJhY3RvIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE2IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvciYjNDU7Jmd0O3RyYWN0bzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik03OC42OTM3LC0zNi4xNTA5QzgwLjE0NjcsLTQxLjgxMzYgODEuNTEyNywtNDguMTE3NCA4Mi4yMzY5LC01NCA4My4xNDkyLC02MS40MTA3IDgzLjE0OTIsLTYzLjM4OTMgODIuMjM2OSwtNzAuOCA4MS45MjAxLC03My4zNzM2IDgxLjQ4MDQsLTc2LjAyNzkgODAuOTY0MywtNzguNjczOCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9Ijc4LjY5MzcsLTg4LjY0OTEgNzYuNTI1NSwtNzcuODk5NyA3OS44MDM1LC04My43NzM4IDgwLjkxMzIsLTc4Ljg5ODUgODAuOTEzMiwtNzguODk4NSA4MC45MTMyLC03OC44OTg1IDc5LjgwMzUsLTgzLjc3MzggODUuMzAxLC03OS44OTczIDc4LjY5MzcsLTg4LjY0OTEgNzguNjkzNywtODguNjQ5MSIvPgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3RvJiM0NTsmZ3Q7dHJhY3RvciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0byYjNDU7Jmd0O3RyYWN0b3I8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNNzMuMjM2OSwtODguNDAwNkM3My4yMzY5LC03Ni4yOTQ5IDczLjIzNjksLTYwLjIwNzYgNzMuMjM2OSwtNDYuNDY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjczLjIzNjksLTM2LjA3MiA3Ny43MzcsLTQ2LjA3MiA3My4yMzY5LC00MS4wNzIgNzMuMjM3LC00Ni4wNzIgNzMuMjM3LC00Ni4wNzIgNzMuMjM3LC00Ni4wNzIgNzMuMjM2OSwtNDEuMDcyIDY4LjczNywtNDYuMDcyMSA3My4yMzY5LC0zNi4wNzIgNzMuMjM2OSwtMzYuMDcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3Ny4zMTcyIiB5PSItNTguMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gcjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTUiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI3My4yMzY5IiBjeT0iLTE5NS42IiByeD0iMzcuMTQ0MyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3My4yMzY5IiB5PSItMTkxLjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwMUE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdG8mIzQ1OyZndDt0cmFjdCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0byYjNDU7Jmd0O3RyYWN0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTgwLjM3OTYsLTEyNC40NTk1QzgyLjM2MzUsLTEzMC4yMDk3IDg0LjI0NDksLTEzNi42ODcyIDg1LjIzNjksLTE0Mi44IDg2LjQzMjksLTE1MC4xNzAzIDg2LjQzMjksLTE1Mi4yMjk3IDg1LjIzNjksLTE1OS42IDg0Ljc5NywtMTYyLjMxMDkgODQuMTgyMSwtMTY1LjA5MzYgODMuNDYxLC0xNjcuODUyNyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjgwLjUwNjEsLTE3Ny41NzI1IDc5LjEwOTMsLTE2Ni42OTU5IDgxLjk2MDQsLTE3Mi43ODg2IDgzLjQxNDgsLTE2OC4wMDQ4IDgzLjQxNDgsLTE2OC4wMDQ4IDgzLjQxNDgsLTE2OC4wMDQ4IDgxLjk2MDQsLTE3Mi43ODg2IDg3LjcyMDIsLTE2OS4zMTM3IDgwLjUwNjEsLTE3Ny41NzI1IDgwLjUwNjEsLTE3Ny41NzI1Ii8+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdCYjNDU7Jmd0O3RyYWN0byAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0JiM0NTsmZ3Q7dHJhY3RvPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTczLjIzNjksLTE3Ny4yMDA2QzczLjIzNjksLTE2NS4wOTQ5IDczLjIzNjksLTE0OS4wMDc2IDczLjIzNjksLTEzNS4yNjc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iNzMuMjM2OSwtMTI0Ljg3MiA3Ny43MzcsLTEzNC44NzIgNzMuMjM2OSwtMTI5Ljg3MiA3My4yMzcsLTEzNC44NzIgNzMuMjM3LC0xMzQuODcyIDczLjIzNywtMTM0Ljg3MiA3My4yMzY5LC0xMjkuODcyIDY4LjczNywtMTM0Ljg3MjEgNzMuMjM2OSwtMTI0Ljg3MiA3My4yMzY5LC0xMjQuODcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3OC40ODY5IiB5PSItMTQ3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiBvPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhYyAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU2IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhYzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI3My4yMzY5IiBjeT0iLTI4NC40IiByeD0iMzUuMzU4NyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3My4yMzY5IiB5PSItMjgwLjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwMTk8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdCYjNDU7Jmd0O3RyYWMgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTgiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdCYjNDU7Jmd0O3RyYWM8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNNzguMDg4NiwtMjEzLjc4NDdDNzkuMzgwMiwtMjE5LjQ0ODcgODAuNTk0MiwtMjI1Ljc0NDkgODEuMjM2OSwtMjMxLjYgODIuMDUxNiwtMjM5LjAyMjEgODIuMDUxNiwtMjQwLjk3NzkgODEuMjM2OSwtMjQ4LjQgODAuOTU1NywtMjUwLjk2MTYgODAuNTY1MiwtMjUzLjYwNzYgODAuMTA2NiwtMjU2LjI0ODIiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSI3OC4wODg2LC0yNjYuMjE1MyA3NS42NjI2LC0yNTUuNTIxMSA3OS4wODA4LC0yNjEuMzE0NyA4MC4wNzMxLC0yNTYuNDE0MiA4MC4wNzMxLC0yNTYuNDE0MiA4MC4wNzMxLC0yNTYuNDE0MiA3OS4wODA4LC0yNjEuMzE0NyA4NC40ODM2LC0yNTcuMzA3MiA3OC4wODg2LC0yNjYuMjE1MyA3OC4wODg2LC0yNjYuMjE1MyIvPgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhYyYjNDU7Jmd0O3RyYWN0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTkiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjJiM0NTsmZ3Q7dHJhY3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNNzMuMjM2OSwtMjY2LjAwMDZDNzMuMjM2OSwtMjUzLjg5NDkgNzMuMjM2OSwtMjM3LjgwNzYgNzMuMjM2OSwtMjI0LjA2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSI3My4yMzY5LC0yMTMuNjcyIDc3LjczNywtMjIzLjY3MiA3My4yMzY5LC0yMTguNjcyIDczLjIzNywtMjIzLjY3MiA3My4yMzcsLTIyMy42NzIgNzMuMjM3LC0yMjMuNjcyIDczLjIzNjksLTIxOC42NzIgNjguNzM3LC0yMjMuNjcyMSA3My4yMzY5LC0yMTMuNjcyIDczLjIzNjksLTIxMy42NzIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijc2LjkzMjIiIHk9Ii0yMzUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gdDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU3IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjExMi4yMzY5IiBjeT0iLTM4NC42MTU2IiByeD0iMzYuMTI1IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTEyLjIzNjkiIHk9Ii0zODguODE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjExMi4yMzY5IiB5PSItMzcyLjAxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwMTg8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjJiM0NTsmZ3Q7dHJhIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE5IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhYyYjNDU7Jmd0O3RyYTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik05Mi4yMDIzLC0yOTkuODEwN0M5OC4wMzk4LC0zMDUuNjE3MiAxMDMuODIyNiwtMzEyLjY5OCAxMDcuMjM2OSwtMzIwLjQgMTEwLjYxOTgsLTMyOC4wMzEyIDExMi40NTUsLTMzNi42NzIxIDExMy4zNTc0LC0zNDUuMDg0OSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjExNC4wMzY5LC0zNTUuMTUwNSAxMDguODczNSwtMzQ1LjQ3NjMgMTEzLjcwMDEsLTM1MC4xNjE4IDExMy4zNjMzLC0zNDUuMTczMiAxMTMuMzYzMywtMzQ1LjE3MzIgMTEzLjM2MzMsLTM0NS4xNzMyIDExMy43MDAxLC0zNTAuMTYxOCAxMTcuODUzLC0zNDQuODcgMTE0LjAzNjksLTM1NS4xNTA1IDExNC4wMzY5LC0zNTUuMTUwNSIvPgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU4IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyMTcuMjM2OSIgY3k9Ii0yODQuNCIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii0yODAuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5jb250ZW50QXJyYXlbMV08L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjJiM0NTsmZ3Q7dHJlZSAtLT4KKyAgICAgICAgPCEtLSB0cmEmIzQ1OyZndDt0cmFjIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTgiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmEmIzQ1OyZndDt0cmFjPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTEwMS4yNjk0LC0zNTYuNDMzM0M5NS44MzA2LC0zNDIuNDU3NSA4OS4yODg3LC0zMjUuNjQ3MiA4My44OTI5LC0zMTEuNzgyMSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjgwLjE5ODgsLTMwMi4yODk1IDg4LjAxOTEsLTMwOS45NzY2IDgyLjAxMjEsLTMwNi45NDkxIDgzLjgyNTUsLTMxMS42MDg3IDgzLjgyNTUsLTMxMS42MDg3IDgzLjgyNTUsLTMxMS42MDg3IDgyLjAxMjEsLTMwNi45NDkxIDc5LjYzMTksLTMxMy4yNDA3IDgwLjE5ODgsLTMwMi4yODk1IDgwLjE5ODgsLTMwMi4yODk1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI5OC4wOTQyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IGM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjIxNy4yMzY5IiBjeT0iLTQ5Ni4yNDY5IiByeD0iMzcuOTAyNyIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxNy4yMzY5IiB5PSItNTAwLjQ0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+U3BhcnNlPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii00ODMuNjQ2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDA3RTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYSYjNDU7Jmd0O3RyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIwIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhJiM0NTsmZ3Q7dHI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMTM0LjgyNDQsLTQwNy42NDY3QzE0Mi4zMTk4LC00MTUuMzU2IDE1MC42NzgyLC00MjQuMDI1MyAxNTguMjM2OSwtNDMyLjAzMTMgMTY4LjA5MjgsLTQ0Mi40NzA0IDE3OC43NDI2LC00NTMuOTg3IDE4OC4yNDU3LC00NjQuMzUwNCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjE5NS4yNTcyLC00NzIuMDEzNiAxODUuMTg2NywtNDY3LjY3MzQgMTkxLjg4MiwtNDY4LjMyNDcgMTg4LjUwNjgsLTQ2NC42MzU3IDE4OC41MDY4LC00NjQuNjM1NyAxODguNTA2OCwtNDY0LjYzNTcgMTkxLjg4MiwtNDY4LjMyNDcgMTkxLjgyNjgsLTQ2MS41OTggMTk1LjI1NzIsLTQ3Mi4wMTM2IDE5NS4yNTcyLC00NzIuMDEzNiIvPgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTkiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjE3LjIzNjkiIGN5PSItMzg0LjYxNTYiIHJ4PSIzNy45MzA2IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii0zODguODE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxNy4yMzY5IiB5PSItMzcyLjAxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwM0I8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmVlJiM0NTsmZ3Q7dHJlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIxIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlZSYjNDU7Jmd0O3RyZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0yMjUuNzExNiwtMzAyLjMyNzlDMjI3Ljk3MTMsLTMwNy45ODE0IDIzMC4wOTkzLC0zMTQuMzM2MyAyMzEuMjM2OSwtMzIwLjQgMjMyLjgyNDcsLTMyOC44NjM3IDIzMi4yNTk2LC0zMzcuOTE3OSAyMzAuNjczLC0zNDYuNDc5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMjI4LjQwOSwtMzU2LjIzNzYgMjI2LjI4NTUsLTM0NS40NzkzIDIyOS41MzkxLC0zNTEuMzY2OSAyMzAuNjY5MSwtMzQ2LjQ5NjMgMjMwLjY2OTEsLTM0Ni40OTYzIDIzMC42NjkxLC0zNDYuNDk2MyAyMjkuNTM5MSwtMzUxLjM2NjkgMjM1LjA1MjcsLTM0Ny41MTMzIDIyOC40MDksLTM1Ni4yMzc2IDIyOC40MDksLTM1Ni4yMzc2Ii8+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmllIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEwIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzOTkuMjM2OSIgY3k9Ii0yODQuNCIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzk5LjIzNjkiIHk9Ii0yODAuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5jb250ZW50QXJyYXlbMl08L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmVlJiM0NTsmZ3Q7dHJpZSAtLT4KKyAgICAgICAgPCEtLSB0cmUmIzQ1OyZndDt0cmVlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTEzIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlJiM0NTsmZ3Q7dHJlZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yMTcuMjM2OSwtMzU1LjA4OTdDMjE3LjIzNjksLTM0MS42MDQ2IDIxNy4yMzY5LC0zMjUuNzEyMyAyMTcuMjM2OSwtMzEyLjQxNTMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyMTcuMjM2OSwtMzAyLjQwMzMgMjIxLjczNywtMzEyLjQwMzMgMjE3LjIzNjksLTMwNy40MDMzIDIxNy4yMzcsLTMxMi40MDMzIDIxNy4yMzcsLTMxMi40MDMzIDIxNy4yMzcsLTMxMi40MDMzIDIxNy4yMzY5LC0zMDcuNDAzMyAyMTIuNzM3LC0zMTIuNDAzNCAyMTcuMjM2OSwtMzAyLjQwMzMgMjE3LjIzNjksLTMwMi40MDMzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMjIuMDk0MiIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlJiM0NTsmZ3Q7dHIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjIiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmUmIzQ1OyZndDt0cjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0yMjcuODkyMywtNDEyLjkwNzlDMjMwLjkwMzcsLTQyNC4wNCAyMzIuOTUwOSwtNDM2Ljk3MzYgMjMxLjIzNjksLTQ0OC44MzEzIDIzMC44MDI3LC00NTEuODM1IDIzMC4yMjE0LC00NTQuOTEzNiAyMjkuNTQxOCwtNDU3Ljk4OSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjIyNy4wOTY4LC00NjcuNzA1NyAyMjUuMTczMiwtNDU2LjkwOTkgMjI4LjMxNywtNDYyLjg1NjkgMjI5LjUzNzEsLTQ1OC4wMDggMjI5LjUzNzEsLTQ1OC4wMDggMjI5LjUzNzEsLTQ1OC4wMDggMjI4LjMxNywtNDYyLjg1NjkgMjMzLjkwMTEsLTQ1OS4xMDYyIDIyNy4wOTY4LC00NjcuNzA1NyAyMjcuMDk2OCwtNDY3LjcwNTciLz4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyaTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzMjYuMjM2OSIgY3k9Ii0zODQuNjE1NiIgcng9IjM3LjkzMDYiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMjYuMjM2OSIgeT0iLTM4OC44MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzI2LjIzNjkiIHk9Ii0zNzIuMDE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDA1QjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaWUmIzQ1OyZndDt0cmkgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmllJiM0NTsmZ3Q7dHJpPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTM5My44NTYzLC0zMDIuNDgyMkMzOTAuMTcyNCwtMzEzLjE1NTggMzg0LjYxNDQsLTMyNi42MDYgMzc3LjIzNjksLTMzNy4yIDM3Mi41MjQ4LC0zNDMuOTY2NSAzNjYuNzAzNiwtMzUwLjQ5MyAzNjAuNjk4NywtMzU2LjQyNzIiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIzNTMuMDYzOCwtMzYzLjYwMDUgMzU3LjI3MDQsLTM1My40NzM2IDM1Ni43MDc4LC0zNjAuMTc2OCAzNjAuMzUxOCwtMzU2Ljc1MzEgMzYwLjM1MTgsLTM1Ni43NTMxIDM2MC4zNTE4LC0zNTYuNzUzMSAzNTYuNzA3OCwtMzYwLjE3NjggMzYzLjQzMzEsLTM2MC4wMzI3IDM1My4wNjM4LC0zNjMuNjAwNSAzNTMuMDYzOCwtMzYzLjYwMDUiLz4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaSYjNDU7Jmd0O3RyaWUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTUiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmkmIzQ1OyZndDt0cmllPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTM0Mi4yMzg2LC0zNTcuNzYzNUMzNDkuNTU2MiwtMzQ2LjAxODIgMzU4LjU3NjcsLTMzMi4yNDYxIDM2Ny41MjIzLC0zMjAuNCAzNzAuMTE5OSwtMzE2Ljk2MDIgMzcyLjk2MzMsLTMxMy40Mzk5IDM3NS44NDY5LC0zMTAuMDEyNCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjM4Mi41NTE4LC0zMDIuMjY0NCAzNzkuNDEwOCwtMzEyLjc3MDggMzc5LjI3OTksLTMwNi4wNDUzIDM3Ni4wMDgxLC0zMDkuODI2MSAzNzYuMDA4MSwtMzA5LjgyNjEgMzc2LjAwODEsLTMwOS44MjYxIDM3OS4yNzk5LC0zMDYuMDQ1MyAzNzIuNjA1MywtMzA2Ljg4MTUgMzgyLjU1MTgsLTMwMi4yNjQ0IDM4Mi41NTE4LC0zMDIuMjY0NCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzcyLjA5NDIiIHk9Ii0zMjQuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaSYjNDU7Jmd0O3RyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTI0IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpJiM0NTsmZ3Q7dHI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMzE0LjE2OTcsLTQxMi43OTY4QzMwOC4xMzgyLC00MjQuNzg4MyAzMDAuMDI0MiwtNDM4LjM4NTMgMjkwLjIzNjksLTQ0OC44MzEzIDI4MC45MzI2LC00NTguNzYxOCAyNjkuMTQxOSwtNDY3LjU3MjggMjU3Ljc2NTEsLTQ3NC44MjMxIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMjQ5LjE5MzksLTQ4MC4wNTYgMjU1LjM4NDEsLTQ3MS4wMDQ0IDI1My40NjE0LC00NzcuNDUwNiAyNTcuNzI5LC00NzQuODQ1MSAyNTcuNzI5LC00NzQuODQ1MSAyNTcuNzI5LC00NzQuODQ1MSAyNTMuNDYxNCwtNDc3LjQ1MDYgMjYwLjA3MzksLTQ3OC42ODU5IDI0OS4xOTM5LC00ODAuMDU2IDI0OS4xOTM5LC00ODAuMDU2Ii8+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyYSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U3IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmE8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMTg2LjE3NjYsLTQ3OS4wNTM5QzE3My40NzksLTQ3MS4wMDgzIDE1OS4yNzk0LC00NjAuNTk5MSAxNDguNTIyMywtNDQ4LjgzMTMgMTQxLjEyMzksLTQ0MC43Mzc3IDEzNC42MTUsLTQzMC44NzM2IDEyOS4yMjgzLC00MjEuMzI5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMTI0LjQxNTMsLTQxMi4zNDQxIDEzMy4xMDQxLC00MTkuMDM0MSAxMjYuNzc2MywtNDE2Ljc1MTYgMTI5LjEzNzMsLTQyMS4xNTkgMTI5LjEzNzMsLTQyMS4xNTkgMTI5LjEzNzMsLTQyMS4xNTkgMTI2Ljc3NjMsLTQxNi43NTE2IDEyNS4xNzA2LC00MjMuMjg0IDEyNC40MTUzLC00MTIuMzQ0MSAxMjQuNDE1MywtNDEyLjM0NDEiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE1NC4wOTQyIiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IGE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTIxNy4yMzY5LC00NjYuNjI0OUMyMTcuMjM2OSwtNDUzLjc1NjggMjE3LjIzNjksLTQzOC40ODY3IDIxNy4yMzY5LC00MjQuNjMxOSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjIxNy4yMzY5LC00MTQuMzc2MSAyMjEuNzM3LC00MjQuMzc2MSAyMTcuMjM2OSwtNDE5LjM3NjEgMjE3LjIzNywtNDI0LjM3NjEgMjE3LjIzNywtNDI0LjM3NjEgMjE3LjIzNywtNDI0LjM3NjEgMjE3LjIzNjksLTQxOS4zNzYxIDIxMi43MzcsLTQyNC4zNzYyIDIxNy4yMzY5LC00MTQuMzc2MSAyMTcuMjM2OSwtNDE0LjM3NjEiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIyMi4wOTQyIiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyaSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJpPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTI0MC4wODY5LC00NzIuODQ1NEMyNTYuMjU1MywtNDU2LjI4NjYgMjc4LjExMTEsLTQzMy45MDMyIDI5NS43NjI4LC00MTUuODI1NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjMwMy4wNDE2LC00MDguMzcwOSAyOTkuMjc1LC00MTguNjY5NiAyOTkuNTQ4NSwtNDExLjk0ODMgMjk2LjA1NTMsLTQxNS41MjU4IDI5Ni4wNTUzLC00MTUuNTI1OCAyOTYuMDU1MywtNDE1LjUyNTggMjk5LjU0ODUsLTQxMS45NDgzIDI5Mi44MzU2LC00MTIuMzgyIDMwMy4wNDE2LC00MDguMzcwOSAzMDMuMDQxNiwtNDA4LjM3MDkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI4Mi45MzIyIiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IGk8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjUiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMjI0LjU1NjYsLTUyNS4zMDk2QzIyNi40NzM0LC01MzYuMzExMiAyMjcuNjUzNiwtNTQ4Ljk1NDIgMjI2LjIzNjksLTU2MC40NjI2IDIyNS45MjAxLC01NjMuMDM2MiAyMjUuNDgwNCwtNTY1LjY5MDUgMjI0Ljk2NDMsLTU2OC4zMzY0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMjIyLjY5MzcsLTU3OC4zMTE3IDIyMC41MjU1LC01NjcuNTYyMyAyMjMuODAzNSwtNTczLjQzNjQgMjI0LjkxMzIsLTU2OC41NjExIDIyNC45MTMyLC01NjguNTYxMSAyMjQuOTEzMiwtNTY4LjU2MTEgMjIzLjgwMzUsLTU3My40MzY0IDIyOS4zMDEsLTU2OS41NTk5IDIyMi42OTM3LC01NzguMzExNyAyMjIuNjkzNywtNTc4LjMxMTciLz4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHQmIzQ1OyZndDtyb290IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTI2IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dCYjNDU7Jmd0O3Jvb3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMjIyLjA4ODYsLTYxNC42NDczQzIyMy4zODAyLC02MjAuMzExMyAyMjQuNTk0MiwtNjI2LjYwNzUgMjI1LjIzNjksLTYzMi40NjI2IDIyNi4xMjQ3LC02NDAuNTUwNCAyMjUuODcsLTY0OS4yMDE0IDIyNS4wNDgsLTY1Ny40NDk3Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMjIzLjc0NjksLTY2Ny42MDk0IDIyMC41NTM3LC02NTcuMTE4OCAyMjQuMzgyMSwtNjYyLjY0OTkgMjI1LjAxNzMsLTY1Ny42OTA0IDIyNS4wMTczLC02NTcuNjkwNCAyMjUuMDE3MywtNjU3LjY5MDQgMjI0LjM4MjEsLTY2Mi42NDk5IDIyOS40ODA4LC02NTguMjYyMSAyMjMuNzQ2OSwtNjY3LjYwOTQgMjIzLjc0NjksLTY2Ny42MDk0Ii8+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0JiM0NTsmZ3Q7dHIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnQmIzQ1OyZndDt0cjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yMTcuMjM2OSwtNTc4LjA4MTVDMjE3LjIzNjksLTU2Ni4zNTAyIDIxNy4yMzY5LC01NTAuNjc3NCAyMTcuMjM2OSwtNTM2LjE4ODUiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyMTcuMjM2OSwtNTI1LjkyMDkgMjIxLjczNywtNTM1LjkyMDggMjE3LjIzNjksLTUzMC45MjA5IDIxNy4yMzcsLTUzNS45MjA5IDIxNy4yMzcsLTUzNS45MjA5IDIxNy4yMzcsLTUzNS45MjA5IDIxNy4yMzY5LC01MzAuOTIwOSAyMTIuNzM3LC01MzUuOTIwOSAyMTcuMjM2OSwtNTI1LjkyMDkgMjE3LjIzNjksLTUyNS45MjA5Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMjEuMzE3MiIgeT0iLTU0Ny44NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQudzMuc3ZnIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLnczLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjAyYWRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLnczLnN2ZwpAQCAtMCwwICsxLDI2OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iCisgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgorPCEtLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBHZW5lcmF0ZWQgYnkgZ3JhcGh2aXogdmVyc2lvbiAyLjQwLjEgKDIwMTYxMjI1LjAzMDQpCisjIGVtYmVkZGVkIERPVCAocGxhbnR1bWwpIHdvcmtzIGluIElERUEgcHJldmlldworIyBidXQgbm90IG9uIEdpdEh1YgorZGlncmFwaCBHIHsKKyAgICB7IHJhbms9c2FtZSByb290IC0+IHN0YXJ0IFtzdHlsZT1pbnZpc10gfQorICAgIHN0YXJ0IFtsYWJlbD0ic3RhcnQvZW5kIl0KKworICAgIHRyYWN0b3IgW2xhYmVsID0gImNvbnRlbnRBcnJheVswXSJdCisgICAgdHJhY3RvIFtsYWJlbCA9ICIweDAxQiJdCisgICAgdHJhY3QgW2xhYmVsID0gIjB4MDFBIl0KKyAgICB0cmFjIFtsYWJlbCA9ICIweDAxOSJdCisgICAgdHJhIFtsYWJlbCA9ICJDaGFpblxuMHgwMTgiXQorCisgICAgdHJlZSBbbGFiZWwgPSAiY29udGVudEFycmF5WzFdIl0KKyAgICB0cmUgW2xhYmVsID0gIkNoYWluXG4weDAzQiJdCisgICAgdHJpZSBbbGFiZWwgPSAiY29udGVudEFycmF5WzJdIl0KKyAgICB0cmkgW2xhYmVsID0gIkNoYWluXG4weDA1QiJdCisKKyAgICB0ciBbbGFiZWwgPSAiU3BhcnNlXG4weDA3RSJdCisKKyAgICB0IFtsYWJlbCA9ICIweDA5QiJdCisgICAgcm9vdCBbbGFiZWwgPSAiQ2hhaW5cbjB4OUEiXQorCisgICAgc3ViZ3JhcGggcGF0aCB7CisgICAgICAgIGVkZ2UgW2NvbG9yID0gImxpZ2h0Ymx1ZSI7IGZvbnRjb2xvcj0iYmx1ZSI7IGFycm93aGVhZD0idmVlIl0KKworICAgICAgICBzdGFydCAtPiByb290CisgICAgICAgIHJvb3QgLT4gdCBbbGFiZWwgPSAiIHQiXQorICAgICAgICB0IC0+IHRyIFtsYWJlbCA9ICIgciJdCisgICAgICAgIHRyIC0+IHRyYSBbbGFiZWwgPSAiIGEiXQorICAgICAgICB0cmEgLT4gdHJhYyBbbGFiZWwgPSAiIGMiXQorICAgICAgICB0cmFjIC0+IHRyYWN0IFtsYWJlbCA9ICIgdCJdCisgICAgICAgIHRyYWN0IC0+IHRyYWN0byBbbGFiZWwgPSAiIG8iXQorICAgICAgICB0cmFjdG8gLT4gdHJhY3RvciBbbGFiZWwgPSAiIHIiXQorCisgICAgICAgIHRyIC0+IHRyZSBbbGFiZWwgPSAiIGUiXQorICAgICAgICB0cmUgLT4gdHJlZSBbbGFiZWwgPSAiIGUiXQorCisgICAgICAgIHRyIC0+IHRyaSBbbGFiZWwgPSAiIGkiXQorICAgICAgICB0cmkgLT4gdHJpZSBbbGFiZWwgPSAiIGUiXQorCisgICAgICAgIC8vIHtyYW5rPXNhbWUgdHJhIC0+IHRyZSAtPiB0cmkgW3N0eWxlPWludmlzXX0KKyAgICAgICAge3Jhbms9c2FtZSB0cmFjIC0+IHRyZWUgLT4gdHJpZSBbc3R5bGU9aW52aXNdfQorICAgIH0KKworICAgIHN1YmdyYXBoIGJhY2sgeworICAgICAgICBlZGdlIFtjb2xvciA9ICJwaW5rIjsgZm9udGNvbG9yPSJibHVlIjsgY29uc3RyYWludD0iZmFsc2UiOyBhcnJvd2hlYWQ9InZlZSJdCisgICAgICAgIHRyYWN0b3IgLT4gdHIKKyAgICAgICAgdHJlZSAtPiB0cgorICAgICAgICB0cmllIC0+IHN0YXJ0CisgICAgfQorfQorIC0tPgorPCEtLSBUaXRsZTogRyBQYWdlczogMSAtLT4KKzxzdmcgd2lkdGg9IjQ4MHB0IiBoZWlnaHQ9IjczNHB0IgorICAgICB2aWV3Qm94PSIwLjAwIDAuMDAgNDgwLjQ3IDczNC4wOSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CisgICAgPGcgaWQ9ImdyYXBoMCIgY2xhc3M9ImdyYXBoIiB0cmFuc2Zvcm09InNjYWxlKDEgMSkgcm90YXRlKDApIHRyYW5zbGF0ZSg0IDczMC4wOTM5KSI+CisgICAgICAgIDx0aXRsZT5HPC90aXRsZT4KKyAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSJ0cmFuc3BhcmVudCIgcG9pbnRzPSItNCw0IC00LC03MzAuMDkzOSA0NzYuNDczOCwtNzMwLjA5MzkgNDc2LjQ3MzgsNCAtNCw0Ii8+CisgICAgICAgIDwhLS0gcm9vdCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+cm9vdDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyMTcuMjM2OSIgY3k9Ii02OTYuNjc4MiIgcng9IjM0LjkyMTMiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTcuMjM2OSIgeT0iLTcwMC44NzgyIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii02ODQuMDc4MiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDlBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gc3RhcnQgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnN0YXJ0PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjMzMi4yMzY5IiBjeT0iLTY5Ni42NzgyIiByeD0iNDQuMDc3NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMzIuMjM2OSIgeT0iLTY5Mi40NzgyIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPnN0YXJ0L2VuZDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHJvb3QmIzQ1OyZndDtzdGFydCAtLT4KKyAgICAgICAgPCEtLSB0IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEzIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyMTcuMjM2OSIgY3k9Ii01OTYuNDYyNiIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii01OTIuMjYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDA5QjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHJvb3QmIzQ1OyZndDt0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT5yb290JiM0NTsmZ3Q7dDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yMTcuMjM2OSwtNjY3LjE1MjJDMjE3LjIzNjksLTY1My42NjcxIDIxNy4yMzY5LC02MzcuNzc0OSAyMTcuMjM2OSwtNjI0LjQ3NzkiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyMTcuMjM2OSwtNjE0LjQ2NTkgMjIxLjczNywtNjI0LjQ2NTkgMjE3LjIzNjksLTYxOS40NjU5IDIxNy4yMzcsLTYyNC40NjU5IDIxNy4yMzcsLTYyNC40NjU5IDIxNy4yMzcsLTYyNC40NjU5IDIxNy4yMzY5LC02MTkuNDY1OSAyMTIuNzM3LC02MjQuNDY1OSAyMTcuMjM2OSwtNjE0LjQ2NTkgMjE3LjIzNjksLTYxNC40NjU5Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMjAuOTMyMiIgeT0iLTYzNi42NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiB0PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gc3RhcnQmIzQ1OyZndDtyb290IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT5zdGFydCYjNDU7Jmd0O3Jvb3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMzA3LjQzNTEsLTcxMS42MDU2QzI5MC40MzgsLTcxOS4wMjI3IDI3My40NDA5LC03MjAuNjU2NSAyNTYuNDQzOCwtNzE2LjUwNyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjI0Ni40MzYxLC03MTMuMzk1NSAyNTcuMzIxMywtNzEyLjA2NzQgMjUxLjIxMDcsLTcxNC44OCAyNTUuOTg1MiwtNzE2LjM2NDUgMjU1Ljk4NTIsLTcxNi4zNjQ1IDI1NS45ODUyLC03MTYuMzY0NSAyNTEuMjEwNywtNzE0Ljg4IDI1NC42NDkyLC03MjAuNjYxNiAyNDYuNDM2MSwtNzEzLjM5NTUgMjQ2LjQzNjEsLTcxMy4zOTU1Ii8+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdG9yIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTMiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdG9yPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjczLjIzNjkiIGN5PSItMTgiIHJ4PSI3My40NzQ1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjczLjIzNjkiIHk9Ii0xMy44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVswXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEyIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHI8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjE3LjIzNjkiIGN5PSItNDk2LjI0NjkiIHJ4PSIzNy45MDI3IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii01MDAuNDQ2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5TcGFyc2U8L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTcuMjM2OSIgeT0iLTQ4My42NDY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDdFPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3RvciYjNDU7Jmd0O3RyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE2IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvciYjNDU7Jmd0O3RyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTU3LjUxMzUsLTM1Ljc0MjhDNDYuNjU3MSwtNDkuMjQyMyAzMy4xNTA3LC02OC44NDMxIDI3LjIzNjksLTg4LjggMjYuMjQyOSwtOTIuMTU0NCAyNC42MTM4LC0yNzcuNDYxMSAyOS4yMzY5LC0zMDIuNCAzMi45MTQzLC0zMjIuMjM3NiA1Ni42MzcsLTQyMC45NTM3IDkwLjIzNjksLTQ0OC44MzEzIDExMy4yNjI2LC00NjcuOTM1NSAxNDQuNzM3NCwtNDc5Ljc1ODUgMTcwLjU5MiwtNDg2LjgyMDciLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIxODAuNTU4LC00ODkuMzg3NCAxNjkuNzUxNywtNDkxLjI1MTEgMTc1LjcxNiwtNDg4LjE0MDMgMTcwLjg3NCwtNDg2Ljg5MzMgMTcwLjg3NCwtNDg2Ljg5MzMgMTcwLjg3NCwtNDg2Ljg5MzMgMTc1LjcxNiwtNDg4LjE0MDMgMTcxLjk5NjMsLTQ4Mi41MzU1IDE4MC41NTgsLTQ4OS4zODc0IDE4MC41NTgsLTQ4OS4zODc0Ii8+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdG8gLS0+CisgICAgICAgIDxnIGlkPSJub2RlNCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0bzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI3My4yMzY5IiBjeT0iLTEwNi44IiByeD0iMzYuNTgyNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3My4yMzY5IiB5PSItMTAyLjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwMUI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdG8mIzQ1OyZndDt0cmFjdG9yIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTkiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdG8mIzQ1OyZndDt0cmFjdG9yPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTczLjIzNjksLTg4LjQwMDZDNzMuMjM2OSwtNzYuMjk0OSA3My4yMzY5LC02MC4yMDc2IDczLjIzNjksLTQ2LjQ2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSI3My4yMzY5LC0zNi4wNzIgNzcuNzM3LC00Ni4wNzIgNzMuMjM2OSwtNDEuMDcyIDczLjIzNywtNDYuMDcyIDczLjIzNywtNDYuMDcyIDczLjIzNywtNDYuMDcyIDczLjIzNjksLTQxLjA3MiA2OC43MzcsLTQ2LjA3MjEgNzMuMjM2OSwtMzYuMDcyIDczLjIzNjksLTM2LjA3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzcuMzE3MiIgeT0iLTU4LjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU1IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3Q8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii0xOTUuNiIgcng9IjM3LjE0NDMiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzMuMjM2OSIgeT0iLTE5MS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDFBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3QmIzQ1OyZndDt0cmFjdG8gLS0+CisgICAgICAgIDxnIGlkPSJlZGdlOCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0JiM0NTsmZ3Q7dHJhY3RvPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTczLjIzNjksLTE3Ny4yMDA2QzczLjIzNjksLTE2NS4wOTQ5IDczLjIzNjksLTE0OS4wMDc2IDczLjIzNjksLTEzNS4yNjc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iNzMuMjM2OSwtMTI0Ljg3MiA3Ny43MzcsLTEzNC44NzIgNzMuMjM2OSwtMTI5Ljg3MiA3My4yMzcsLTEzNC44NzIgNzMuMjM3LC0xMzQuODcyIDczLjIzNywtMTM0Ljg3MiA3My4yMzY5LC0xMjkuODcyIDY4LjczNywtMTM0Ljg3MjEgNzMuMjM2OSwtMTI0Ljg3MiA3My4yMzY5LC0xMjQuODcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3OC40ODY5IiB5PSItMTQ3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiBvPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhYyAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU2IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhYzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI3My4yMzY5IiBjeT0iLTI4NC40IiByeD0iMzUuMzU4NyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3My4yMzY5IiB5PSItMjgwLjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwMTk8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjJiM0NTsmZ3Q7dHJhY3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWMmIzQ1OyZndDt0cmFjdDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik03My4yMzY5LC0yNjYuMDAwNkM3My4yMzY5LC0yNTMuODk0OSA3My4yMzY5LC0yMzcuODA3NiA3My4yMzY5LC0yMjQuMDY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjczLjIzNjksLTIxMy42NzIgNzcuNzM3LC0yMjMuNjcyIDczLjIzNjksLTIxOC42NzIgNzMuMjM3LC0yMjMuNjcyIDczLjIzNywtMjIzLjY3MiA3My4yMzcsLTIyMy42NzIgNzMuMjM2OSwtMjE4LjY3MiA2OC43MzcsLTIyMy42NzIxIDczLjIzNjksLTIxMy42NzIgNzMuMjM2OSwtMjEzLjY3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzYuOTMyMiIgeT0iLTIzNS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiB0PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU4IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyMTcuMjM2OSIgY3k9Ii0yODQuNCIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii0yODAuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5jb250ZW50QXJyYXlbMV08L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjJiM0NTsmZ3Q7dHJlZSAtLT4KKyAgICAgICAgPCEtLSB0cmEgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIxMjQuMjM2OSIgY3k9Ii0zODQuNjE1NiIgcng9IjM2LjEyNSIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjEyNC4yMzY5IiB5PSItMzg4LjgxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxMjQuMjM2OSIgeT0iLTM3Mi4wMTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDE4PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhJiM0NTsmZ3Q7dHJhYyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U2IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhJiM0NTsmZ3Q7dHJhYzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0xMTAuMzAwOSwtMzU3LjIzMTNDMTAzLjAxNjMsLTM0Mi45MTY5IDk0LjEzNDIsLTMyNS40NjM1IDg2Ljg5MTQsLTMxMS4yMzEzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iODIuMTc4OCwtMzAxLjk3MDkgOTAuNzI0OSwtMzA4Ljg0MjIgODQuNDQ2NSwtMzA2LjQyNzEgODYuNzE0MywtMzEwLjg4MzIgODYuNzE0MywtMzEwLjg4MzIgODYuNzE0MywtMzEwLjg4MzIgODQuNDQ2NSwtMzA2LjQyNzEgODIuNzAzOCwtMzEyLjkyNDIgODIuMTc4OCwtMzAxLjk3MDkgODIuMTc4OCwtMzAxLjk3MDkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjEwNC4wOTQyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IGM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmllIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEwIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzOTkuMjM2OSIgY3k9Ii0yODQuNCIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzk5LjIzNjkiIHk9Ii0yODAuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5jb250ZW50QXJyYXlbMl08L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmVlJiM0NTsmZ3Q7dHJpZSAtLT4KKyAgICAgICAgPCEtLSB0cmVlJiM0NTsmZ3Q7dHIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTciIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmVlJiM0NTsmZ3Q7dHI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMTU4LjMzMjcsLTI5NS4xOTQyQzEyOS43MzQyLC0zMDEuNTQ2NiA5OS4zODU4LC0zMTAuMzA4MyA4OS4yMzY5LC0zMjAuNCA3Ny44MjU2LC0zMzEuNzQ3IDgxLjQ4MSwtMzM5LjI2NDcgNzkuMjM2OSwtMzU1LjIgNzUuNTkwNiwtMzgxLjA5MTcgNjYuMzE4NywtMzkxLjI5ODEgNzkuMjM2OSwtNDE0LjAzMTMgOTguOTY1NSwtNDQ4Ljc0OTQgMTM5Ljc5NzQsLTQ3MC4zNTA4IDE3MS45NTMzLC00ODIuNjQ3MiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjE4MS42MjEyLC00ODYuMTY4OCAxNzAuNjg0OSwtNDg2Ljk3NDQgMTc2LjkyMzIsLTQ4NC40NTc0IDE3Mi4yMjUxLC00ODIuNzQ2MSAxNzIuMjI1MSwtNDgyLjc0NjEgMTcyLjIyNTEsLTQ4Mi43NDYxIDE3Ni45MjMyLC00ODQuNDU3NCAxNzMuNzY1MywtNDc4LjUxNzkgMTgxLjYyMTIsLTQ4Ni4xNjg4IDE4MS42MjEyLC00ODYuMTY4OCIvPgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTkiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjE3LjIzNjkiIGN5PSItMzg0LjYxNTYiIHJ4PSIzNy45MzA2IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii0zODguODE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxNy4yMzY5IiB5PSItMzcyLjAxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwM0I8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmUmIzQ1OyZndDt0cmVlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTExIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlJiM0NTsmZ3Q7dHJlZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yMTcuMjM2OSwtMzU1LjA4OTdDMjE3LjIzNjksLTM0MS42MDQ2IDIxNy4yMzY5LC0zMjUuNzEyMyAyMTcuMjM2OSwtMzEyLjQxNTMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyMTcuMjM2OSwtMzAyLjQwMzMgMjIxLjczNywtMzEyLjQwMzMgMjE3LjIzNjksLTMwNy40MDMzIDIxNy4yMzcsLTMxMi40MDMzIDIxNy4yMzcsLTMxMi40MDMzIDIxNy4yMzcsLTMxMi40MDMzIDIxNy4yMzY5LC0zMDcuNDAzMyAyMTIuNzM3LC0zMTIuNDAzNCAyMTcuMjM2OSwtMzAyLjQwMzMgMjE3LjIzNjksLTMwMi40MDMzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMjIuMDk0MiIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpZSYjNDU7Jmd0O3N0YXJ0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE4IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpZSYjNDU7Jmd0O3N0YXJ0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTM5OC41Mzc4LC0zMDIuNTA5N0MzOTcuNDA5MiwtMzI3LjYzNzkgMzk0LjczMjYsLTM3NC40NTgxIDM4OS4yMzY5LC00MTQuMDMxMyAzNzYuMTU0OCwtNTA4LjIzMTYgMzUxLjA5NjUsLTYxOC4yODQ4IDMzOS4wNDMxLC02NjguNzc5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMzM2LjY3NzQsLTY3OC42MjI3IDMzNC42Mzg4LC02NjcuODQ4IDMzNy44NDU4LC02NzMuNzYxMiAzMzkuMDE0MiwtNjY4Ljg5OTYgMzM5LjAxNDIsLTY2OC44OTk2IDMzOS4wMTQyLC02NjguODk5NiAzMzcuODQ1OCwtNjczLjc2MTIgMzQzLjM4OTYsLTY2OS45NTExIDMzNi42Nzc0LC02NzguNjIyNyAzMzYuNjc3NCwtNjc4LjYyMjciLz4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyaTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzNDIuMjM2OSIgY3k9Ii0zODQuNjE1NiIgcng9IjM3LjkzMDYiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNDIuMjM2OSIgeT0iLTM4OC44MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzQyLjIzNjkiIHk9Ii0zNzIuMDE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDA1QjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaSYjNDU7Jmd0O3RyaWUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmkmIzQ1OyZndDt0cmllPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTM1MS4xNjc3LC0zNTUuNzk0QzM1NS4zMjE3LC0zNDQuMzUxNyAzNjAuODM1OSwtMzMxLjMzODcgMzY3LjUyMjMsLTMyMC40IDM2OS43MjE1LC0zMTYuODAyMiAzNzIuMjkxMSwtMzEzLjIxOTQgMzc0Ljk5ODcsLTMwOS43ODY2Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMzgxLjQ1NzMsLTMwMi4xMTE5IDM3OC40NjE1LC0zMTIuNjYwNyAzNzguMjM3OSwtMzA1LjkzNzUgMzc1LjAxODQsLTMwOS43NjMyIDM3NS4wMTg0LC0zMDkuNzYzMiAzNzUuMDE4NCwtMzA5Ljc2MzIgMzc4LjIzNzksLTMwNS45Mzc1IDM3MS41NzU0LC0zMDYuODY1NyAzODEuNDU3MywtMzAyLjExMTkgMzgxLjQ1NzMsLTMwMi4xMTE5Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNzIuMDk0MiIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0cmEgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJhPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTE5Ni41OTcyLC00NzEuNDcyM0MxODMuMjMyNCwtNDU1LjQzIDE2NS42ODg1LC00MzQuMzcxNSAxNTEuMjIyNywtNDE3LjAwNzciLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIxNDQuODE4OSwtNDA5LjMyMSAxNTQuNjc3MSwtNDE0LjEyMzcgMTQ4LjAxOTMsLTQxMy4xNjI1IDE1MS4yMTk3LC00MTcuMDA0MSAxNTEuMjE5NywtNDE3LjAwNDEgMTUxLjIxOTcsLTQxNy4wMDQxIDE0OC4wMTkzLC00MTMuMTYyNSAxNDcuNzYyMywtNDE5Ljg4NDUgMTQ0LjgxODksLTQwOS4zMjEgMTQ0LjgxODksLTQwOS4zMjEiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE4Mi4wOTQyIiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IGE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTIxNy4yMzY5LC00NjYuNjI0OUMyMTcuMjM2OSwtNDUzLjc1NjggMjE3LjIzNjksLTQzOC40ODY3IDIxNy4yMzY5LC00MjQuNjMxOSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjIxNy4yMzY5LC00MTQuMzc2MSAyMjEuNzM3LC00MjQuMzc2MSAyMTcuMjM2OSwtNDE5LjM3NjEgMjE3LjIzNywtNDI0LjM3NjEgMjE3LjIzNywtNDI0LjM3NjEgMjE3LjIzNywtNDI0LjM3NjEgMjE3LjIzNjksLTQxOS4zNzYxIDIxMi43MzcsLTQyNC4zNzYyIDIxNy4yMzY5LC00MTQuMzc2MSAyMTcuMjM2OSwtNDE0LjM3NjEiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIyMi4wOTQyIiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyaSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJpPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTI0MS4wNzk0LC00NzMuMzQzN0MyNTQuMTQzOSwtNDYwLjk0MzcgMjcwLjcxMzksLTQ0NS40NTc5IDI4NS44NDYzLC00MzIuMDMxMyAyOTMuMDEzMSwtNDI1LjY3MjMgMzAwLjgxMzgsLTQxOC45NzUxIDMwOC4yNjM5LC00MTIuNjgyIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMzE2LjE2MzgsLTQwNi4wNDcxIDMxMS40MDA0LC00MTUuOTI0NCAzMTIuMzM1LC00MDkuMjYyOCAzMDguNTA2MiwtNDEyLjQ3ODUgMzA4LjUwNjIsLTQxMi40Nzg1IDMwOC41MDYyLC00MTIuNDc4NSAzMTIuMzM1LC00MDkuMjYyOCAzMDUuNjEyMSwtNDA5LjAzMjYgMzE2LjE2MzgsLTQwNi4wNDcxIDMxNi4xNjM4LC00MDYuMDQ3MSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjg4LjkzMjIiIHk9Ii00MzYuMjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gaTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHQmIzQ1OyZndDt0ciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U0IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dCYjNDU7Jmd0O3RyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTIxNy4yMzY5LC01NzguMDgxNUMyMTcuMjM2OSwtNTY2LjM1MDIgMjE3LjIzNjksLTU1MC42Nzc0IDIxNy4yMzY5LC01MzYuMTg4NSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjIxNy4yMzY5LC01MjUuOTIwOSAyMjEuNzM3LC01MzUuOTIwOCAyMTcuMjM2OSwtNTMwLjkyMDkgMjE3LjIzNywtNTM1LjkyMDkgMjE3LjIzNywtNTM1LjkyMDkgMjE3LjIzNywtNTM1LjkyMDkgMjE3LjIzNjksLTUzMC45MjA5IDIxMi43MzcsLTUzNS45MjA5IDIxNy4yMzY5LC01MjUuOTIwOSAyMTcuMjM2OSwtNTI1LjkyMDkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIyMS4zMTcyIiB5PSItNTQ3Ljg2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQud2MxLnN2ZyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC53YzEuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNTk1ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQud2MxLnN2ZwpAQCAtMCwwICsxLDM0OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8IS0tCisgIC0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICAtIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICAtIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIC0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICAtIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIC0gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAtCisgIC0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAtCisgIC0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAtIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIC0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIC0gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAtIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAtLT4KKworPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIgorICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KKzwhLS0gR2VuZXJhdGVkIGJ5IGdyYXBodml6IHZlcnNpb24gMi40MC4xICgyMDE2MTIyNS4wMzA0KQorZGlncmFwaCBHIHsKKyAgICB7IHJhbms9c2FtZSByb290IC0+IHN0YXJ0IFtzdHlsZT1pbnZpc10gfQorICAgIHN0YXJ0IFtsYWJlbD0ic3RhcnQvZW5kIl0KKworICAgIHRyYWN0b3IgW2xhYmVsID0gImNvbnRlbnRBcnJheVswXSJdCisgICAgdHJhY3RvIFtsYWJlbCA9ICIweDAxQiJdCisgICAgdHJhY3QgW2xhYmVsID0gIjB4MDFBIl0KKyAgICB0cmFjIFtsYWJlbCA9ICIweDAxOSJdCisgICAgdHJhIFtsYWJlbCA9ICJDaGFpblxuMHgwMTgiXQorCisgICAgdHJlZSBbbGFiZWwgPSAiY29udGVudEFycmF5WzFdIl0KKyAgICB0cmUgW2xhYmVsID0gIkNoYWluXG4weDAzQiJdCisgICAgdHJpZSBbbGFiZWwgPSAiY29udGVudEFycmF5WzJdIl0KKyAgICB0cmkgW2xhYmVsID0gIkNoYWluXG4weDA1QiJdCisKKyAgICB0ciBbbGFiZWwgPSAiU3BhcnNlXG4weDA3RSJdCisKKyAgICB0IFtsYWJlbCA9ICIweDA5QiJdCisgICAgcm9vdCBbbGFiZWwgPSAiQ2hhaW5cbjB4OUEiXQorCisgICAgcm9vdCAtPiB0IFtsYWJlbCA9ICIgdCJdCisgICAgdCAtPiB0ciBbbGFiZWwgPSAiIHIiXQorICAgIHRyIC0+IHRyYSBbbGFiZWwgPSAiIGEiXQorICAgIHRyYSAtPiB0cmFjIFtsYWJlbCA9ICIgYyJdCisgICAgdHJhYyAtPiB0cmFjdCBbbGFiZWwgPSAiIHQiXQorICAgIHRyYWN0IC0+IHRyYWN0byBbbGFiZWwgPSAiIG8iXQorICAgIHRyYWN0byAtPiB0cmFjdG9yIFtsYWJlbCA9ICIgciJdCisKKyAgICB0ciAtPiB0cmUgW2xhYmVsID0gIiBlIl0KKyAgICB0cmUgLT4gdHJlZSBbbGFiZWwgPSAiIGUiXQorCisgICAgdHIgLT4gdHJpIFtsYWJlbCA9ICIgaSJdCisgICAgdHJpIC0+IHRyaWUgW2xhYmVsID0gIiBlIl0KKworICAgIC8vIHtyYW5rPXNhbWUgdHJhIC0+IHRyZSAtPiB0cmkgW3N0eWxlPWludmlzXX0KKyAgICB7cmFuaz1zYW1lIHRyYWMgLT4gdHJlZSAtPiB0cmllIFtzdHlsZT1pbnZpc119CisKKyAgIHN1YmdyYXBoIHBhdGggeworICAgICAgICBlZGdlIFtjb2xvciA9ICJsaWdodGJsdWUiOyBmb250Y29sb3I9ImJsdWUiOyBhcnJvd2hlYWQ9InZlZSI7IGNvbnN0cmFpbnQ9ImZhbHNlIl0KKworICAgICAgICBzdGFydCAtPiByb290IFtsYWJlbCA9ICIgMCwgLTEiXQorCisgICAgICAgIHJvb3QgLT4gdCBbbGFiZWwgPSAiIDEsIHQiXQorICAgICAgICB0IC0+IHRyIFtsYWJlbCA9ICIgMiwgciJdCisgICAgICAgIHRyIC0+IHRyYSBbbGFiZWwgPSAiIDMsIGEiXQorICAgICAgICB0cmEgLT4gdHJhYyBbbGFiZWwgPSAiIDQsIGMiXQorICAgICAgICB0cmFjIC0+IHRyYWN0IFtsYWJlbCA9ICIgNSwgdCJdCisgICAgICAgIHRyYWN0IC0+IHRyYWN0byBbbGFiZWwgPSAiIDYsIG8iXQorICAgICAgICB0cmFjdG8gLT4gdHJhY3RvciBbbGFiZWwgPSAiIDcsIHIiXQorCisgICAgICAgIHRyYWN0b3IgLT4gdHJlIFtsYWJlbCA9ICIgMywgZSJdCisKKyAgICAgICAgLy8gdHIgLT4gdHJlIFtsYWJlbCA9ICIgZSJdCisgICAgICAgIHRyZSAtPiB0cmVlIFtsYWJlbCA9ICIgNCwgZSJdCisKKyAgICAgICAgdHJlZSAtPiB0cmkgW2xhYmVsID0gIjMsIGkiOyBdCisKKyAgICAgICAgLy8gdHIgLT4gdHJpIFtsYWJlbCA9ICIgaSJdCisgICAgICAgIHRyaSAtPiB0cmllIFtsYWJlbCA9ICIgNCwgZSJdCisKKyAgICAgICAgdHJpZSAtPiBzdGFydCBbbGFiZWwgPSAiLTEsIC0xIl0KKyAgICB9Cit9CisKKyAtLT4KKzwhLS0gVGl0bGU6IEcgUGFnZXM6IDEgLS0+Cis8c3ZnIHdpZHRoPSI0OTZwdCIgaGVpZ2h0PSI3MzRwdCIKKyAgICAgdmlld0JveD0iMC4wMCAwLjAwIDQ5Ni40NyA3MzQuMDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgorICAgIDxnIGlkPSJncmFwaDAiIGNsYXNzPSJncmFwaCIgdHJhbnNmb3JtPSJzY2FsZSgxIDEpIHJvdGF0ZSgwKSB0cmFuc2xhdGUoNCA3MzAuMDkzOSkiPgorICAgICAgICA8dGl0bGU+RzwvdGl0bGU+CisgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0idHJhbnNwYXJlbnQiIHBvaW50cz0iLTQsNCAtNCwtNzMwLjA5MzkgNDkyLjQ2NzMsLTczMC4wOTM5IDQ5Mi40NjczLDQgLTQsNCIvPgorICAgICAgICA8IS0tIHJvb3QgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnJvb3Q8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjE3LjIzNjkiIGN5PSItNjk2LjY3ODIiIHJ4PSIzNC45MjEzIiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii03MDAuODc4MiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxNy4yMzY5IiB5PSItNjg0LjA3ODIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHg5QTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHN0YXJ0IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTIiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT5zdGFydDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzNDMuMjM2OSIgY3k9Ii02OTYuNjc4MiIgcng9IjQ0LjA3NzUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzQzLjIzNjkiIHk9Ii02OTIuNDc4MiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5zdGFydC9lbmQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSByb290JiM0NTsmZ3Q7c3RhcnQgLS0+CisgICAgICAgIDwhLS0gdCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnQ8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjE3LjIzNjkiIGN5PSItNTk2LjQ2MjYiIHJ4PSIzNi41ODI0IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxNy4yMzY5IiB5PSItNTkyLjI2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwOUI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSByb290JiM0NTsmZ3Q7dCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+cm9vdCYjNDU7Jmd0O3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjE3LjIzNjksLTY2Ny4xNTIyQzIxNy4yMzY5LC02NTMuNjY3MSAyMTcuMjM2OSwtNjM3Ljc3NDkgMjE3LjIzNjksLTYyNC40Nzc5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjIwLjczNywtNjI0LjQ2NTkgMjE3LjIzNjksLTYxNC40NjU5IDIxMy43MzcsLTYyNC40NjU5IDIyMC43MzcsLTYyNC40NjU5Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMjAuOTMyMiIgeT0iLTYzNi42NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiB0PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gcm9vdCYjNDU7Jmd0O3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTYiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT5yb290JiM0NTsmZ3Q7dDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yMjYuMTAzNiwtNjY3Ljk1MDVDMjI4LjQ4NTEsLTY1Ni44NzY0IDIyOS45NzQ3LC02NDQuMDk2OSAyMjguMjM2OSwtNjMyLjQ2MjYgMjI3LjgzNDQsLTYyOS43NjgxIDIyNy4yNzEzLC02MjYuOTk2NSAyMjYuNjEwNiwtNjI0LjI0NDQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyMjMuOTAyNCwtNjE0LjUzNDggMjMwLjkyMzcsLTYyMi45NTgxIDIyNS4yNDU4LC02MTkuMzUxIDIyNi41ODkxLC02MjQuMTY3MiAyMjYuNTg5MSwtNjI0LjE2NzIgMjI2LjU4OTEsLTYyNC4xNjcyIDIyNS4yNDU4LC02MTkuMzUxIDIyMi4yNTQ2LC02MjUuMzc2MiAyMjMuOTAyNCwtNjE0LjUzNDggMjIzLjkwMjQsLTYxNC41MzQ4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMzkuOTMyMiIgeT0iLTYzNi42NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiAxLCB0PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gc3RhcnQmIzQ1OyZndDtyb290IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE1IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+c3RhcnQmIzQ1OyZndDtyb290PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTI5OC44NzIyLC02OTYuNjc4MkMyODcuMDcwNywtNjk2LjY3ODIgMjc0LjMxMDYsLTY5Ni42NzgyIDI2Mi40NjM3LC02OTYuNjc4MiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjI1Mi4zMzQ5LC02OTYuNjc4MiAyNjIuMzM1LC02OTIuMTc4MyAyNTcuMzM0OSwtNjk2LjY3ODMgMjYyLjMzNDksLTY5Ni42NzgzIDI2Mi4zMzQ5LC02OTYuNjc4MyAyNjIuMzM0OSwtNjk2LjY3ODMgMjU3LjMzNDksLTY5Ni42NzgzIDI2Mi4zMzQ5LC03MDEuMTc4MyAyNTIuMzM0OSwtNjk2LjY3ODIgMjUyLjMzNDksLTY5Ni42NzgyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNzUuNTczMSIgeT0iLTcwMy44NzgyIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiAwLCAmIzQ1OzE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdG9yIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTMiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdG9yPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjczLjIzNjkiIGN5PSItMTgiIHJ4PSI3My40NzQ1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjczLjIzNjkiIHk9Ii0xMy44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVswXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU5IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjIxNy4yMzY5IiBjeT0iLTM4NC42MTU2IiByeD0iMzcuOTMwNiIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxNy4yMzY5IiB5PSItMzg4LjgxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTcuMjM2OSIgeT0iLTM3Mi4wMTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDNCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3RvciYjNDU7Jmd0O3RyZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyMyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0b3ImIzQ1OyZndDt0cmU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMTIzLjc4MiwtMzEuMjAzM0MyMTQuNzE3OSwtNTguMDA1MiA0MDMuNjQyNSwtMTI4LjMxNDcgNDgxLjIzNjksLTI2Ni40IDQ4OS4wNzUsLTI4MC4zNDg2IDQ5Mi4xNjQ5LC0yOTAuNzEzNCA0ODEuMjM2OSwtMzAyLjQgNDQwLjQ2ODYsLTM0NS45OTgzIDI1NC4wMDUyLC0yNzYuODAxNyAyMTMuMjM2OSwtMzIwLjQgMjA2Ljc5MzcsLTMyNy4yOTA0IDIwNS4wMzcsLTMzNi42MjMyIDIwNS41NzU5LC0zNDYuMDM3MSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjIwNi45NDg1LC0zNTYuMTcyMiAyMDEuMTQ3MSwtMzQ2Ljg2NjYgMjA2LjI3NzUsLTM1MS4yMTc0IDIwNS42MDY0LC0zNDYuMjYyNyAyMDUuNjA2NCwtMzQ2LjI2MjcgMjA1LjYwNjQsLTM0Ni4yNjI3IDIwNi4yNzc1LC0zNTEuMjE3NCAyMTAuMDY1NywtMzQ1LjY1ODcgMjA2Ljk0ODUsLTM1Ni4xNzIyIDIwNi45NDg1LC0zNTYuMTcyMiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDUzLjA5NDIiIHk9Ii0xOTEuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gMywgZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0byAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU0IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjczLjIzNjkiIGN5PSItMTA2LjgiIHJ4PSIzNi41ODI0IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjczLjIzNjkiIHk9Ii0xMDIuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0byYjNDU7Jmd0O3RyYWN0b3IgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlOCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0byYjNDU7Jmd0O3RyYWN0b3I8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNNzMuMjM2OSwtODguNDAwNkM3My4yMzY5LC03Ni4yOTQ5IDczLjIzNjksLTYwLjIwNzYgNzMuMjM2OSwtNDYuNDY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9Ijc2LjczNywtNDYuMDcyIDczLjIzNjksLTM2LjA3MiA2OS43MzcsLTQ2LjA3MjEgNzYuNzM3LC00Ni4wNzIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijc3LjMxNzIiIHk9Ii01OC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3RvJiM0NTsmZ3Q7dHJhY3RvciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0byYjNDU7Jmd0O3RyYWN0b3I8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNNzguNjkzNywtODguNjQ5MUM4MC4xNDY3LC04Mi45ODY0IDgxLjUxMjcsLTc2LjY4MjYgODIuMjM2OSwtNzAuOCA4My4xNDkyLC02My4zODkzIDgzLjE0OTIsLTYxLjQxMDcgODIuMjM2OSwtNTQgODEuOTIwMSwtNTEuNDI2NCA4MS40ODA0LC00OC43NzIxIDgwLjk2NDMsLTQ2LjEyNjIiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSI3OC42OTM3LC0zNi4xNTA5IDg1LjMwMSwtNDQuOTAyNyA3OS44MDM1LC00MS4wMjYyIDgwLjkxMzIsLTQ1LjkwMTUgODAuOTEzMiwtNDUuOTAxNSA4MC45MTMyLC00NS45MDE1IDc5LjgwMzUsLTQxLjAyNjIgNzYuNTI1NSwtNDYuOTAwMyA3OC42OTM3LC0zNi4xNTA5IDc4LjY5MzcsLTM2LjE1MDkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijk0LjMxNzIiIHk9Ii01OC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiA3LCByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3QgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjczLjIzNjkiIGN5PSItMTk1LjYiIHJ4PSIzNy4xNDQzIiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjczLjIzNjkiIHk9Ii0xOTEuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxQTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0JiM0NTsmZ3Q7dHJhY3RvIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTciIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdCYjNDU7Jmd0O3RyYWN0bzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik03My4yMzY5LC0xNzcuMjAwNkM3My4yMzY5LC0xNjUuMDk0OSA3My4yMzY5LC0xNDkuMDA3NiA3My4yMzY5LC0xMzUuMjY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9Ijc2LjczNywtMTM0Ljg3MiA3My4yMzY5LC0xMjQuODcyIDY5LjczNywtMTM0Ljg3MjEgNzYuNzM3LC0xMzQuODcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3OC40ODY5IiB5PSItMTQ3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBvPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3QmIzQ1OyZndDt0cmFjdG8gLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjEiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdCYjNDU7Jmd0O3RyYWN0bzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik04MC41MDYxLC0xNzcuNTcyNUM4Mi40NDMyLC0xNzEuOTE0OCA4NC4yNjYsLTE2NS41ODI4IDg1LjIzNjksLTE1OS42IDg2LjQzMjksLTE1Mi4yMjk3IDg2LjQzMjksLTE1MC4xNzAzIDg1LjIzNjksLTE0Mi44IDg0Ljc3MTksLTEzOS45MzQ2IDg0LjExMTUsLTEzNi45ODkxIDgzLjMzNjcsLTEzNC4wNzU5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iODAuMzc5NiwtMTI0LjQ1OTUgODcuNjIwMSwtMTMyLjY5NTEgODEuODQ5MiwtMTI5LjIzODcgODMuMzE4OSwtMTM0LjAxNzggODMuMzE4OSwtMTM0LjAxNzggODMuMzE4OSwtMTM0LjAxNzggODEuODQ5MiwtMTI5LjIzODcgNzkuMDE3NiwtMTM1LjM0MDUgODAuMzc5NiwtMTI0LjQ1OTUgODAuMzc5NiwtMTI0LjQ1OTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijk4LjQ4NjkiIHk9Ii0xNDciIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IDYsIG88L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTYiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjczLjIzNjkiIGN5PSItMjg0LjQiIHJ4PSIzNS4zNTg3IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjczLjIzNjkiIHk9Ii0yODAuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxOTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWMmIzQ1OyZndDt0cmFjdCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U2IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhYyYjNDU7Jmd0O3RyYWN0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTczLjIzNjksLTI2Ni4wMDA2QzczLjIzNjksLTI1My44OTQ5IDczLjIzNjksLTIzNy44MDc2IDczLjIzNjksLTIyNC4wNjc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNzYuNzM3LC0yMjMuNjcyIDczLjIzNjksLTIxMy42NzIgNjkuNzM3LC0yMjMuNjcyMSA3Ni43MzcsLTIyMy42NzIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijc2LjkzMjIiIHk9Ii0yMzUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gdDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWMmIzQ1OyZndDt0cmFjdCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyMCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWMmIzQ1OyZndDt0cmFjdDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik03OS43ODY1LC0yNjYuNjk1OUM4MS42MDUyLC0yNjAuOTQzNCA4My4zMjk0LC0yNTQuNDc1NyA4NC4yMzY5LC0yNDguNCA4NS4zMzk5LC0yNDEuMDE1MyA4NS4zMzk5LC0yMzguOTg0NyA4NC4yMzY5LC0yMzEuNiA4My44MzQ0LC0yMjguOTA1NSA4My4yNzEzLC0yMjYuMTMzOSA4Mi42MTA2LC0yMjMuMzgxOSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9Ijc5LjkwMjQsLTIxMy42NzIyIDg2LjkyMzcsLTIyMi4wOTU2IDgxLjI0NTgsLTIxOC40ODg0IDgyLjU4OTEsLTIyMy4zMDQ2IDgyLjU4OTEsLTIyMy4zMDQ2IDgyLjU4OTEsLTIyMy4zMDQ2IDgxLjI0NTgsLTIxOC40ODg0IDc4LjI1NDYsLTIyNC41MTM2IDc5LjkwMjQsLTIxMy42NzIyIDc5LjkwMjQsLTIxMy42NzIyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI5NS45MzIyIiB5PSItMjM1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IDUsIHQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmVlIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTgiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmVlPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjIxNy4yMzY5IiBjeT0iLTI4NC40IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTcuMjM2OSIgeT0iLTI4MC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVsxXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWMmIzQ1OyZndDt0cmVlIC0tPgorICAgICAgICA8IS0tIHRyYSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU3IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjEyMy4yMzY5IiBjeT0iLTM4NC42MTU2IiByeD0iMzYuMTI1IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTIzLjIzNjkiIHk9Ii0zODguODE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjEyMy4yMzY5IiB5PSItMzcyLjAxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwMTg8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmEmIzQ1OyZndDt0cmFjIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTUiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmEmIzQ1OyZndDt0cmFjPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTEwMi43NjM4LC0zNjAuMDc0OEM5Ny41ODA3LC0zNTMuMDA4OCA5Mi4zOTI5LC0zNDUuMDc0IDg4LjUyMjMsLTMzNy4yIDg0LjczMzQsLTMyOS40OTIyIDgxLjcxOTMsLTMyMC42NzggNzkuNDAzNiwtMzEyLjQ4ODEiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI4Mi43MzI3LC0zMTEuMzgxOSA3Ni44MzgxLC0zMDIuNTc4MyA3NS45NTYxLC0zMTMuMTM2NCA4Mi43MzI3LC0zMTEuMzgxOSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iOTQuMDk0MiIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBjPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhJiM0NTsmZ3Q7dHJhYyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxOSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYSYjNDU7Jmd0O3RyYWM8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMTEzLjgwMDksLTM1Ni4xNjEyQzEwOS42MDU3LC0zNDQuNzcyMyAxMDQuMjUxNSwtMzMxLjcwMDEgOTguMjM2OSwtMzIwLjQgOTYuMzU5OSwtMzE2Ljg3MzYgOTQuMjAxMywtMzEzLjI3OTUgOTEuOTU1NiwtMzA5Ljc5MzgiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSI4Ni4zMDQ2LC0zMDEuNDUyNyA5NS42MzkxLC0zMDcuMjA3NiA4OS4xMDkxLC0zMDUuNTkyMiA5MS45MTM2LC0zMDkuNzMxNiA5MS45MTM2LC0zMDkuNzMxNiA5MS45MTM2LC0zMDkuNzMxNiA4OS4xMDkxLC0zMDUuNTkyMiA4OC4xODgxLC0zMTIuMjU1NyA4Ni4zMDQ2LC0zMDEuNDUyNyA4Ni4zMDQ2LC0zMDEuNDUyNyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTE4LjA5NDIiIHk9Ii0zMjQuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gNCwgYzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaWUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTAiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmllPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjM5OS4yMzY5IiBjeT0iLTI4NC40IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzOTkuMjM2OSIgeT0iLTI4MC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVsyXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZWUmIzQ1OyZndDt0cmllIC0tPgorICAgICAgICA8IS0tIHRyaSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyaTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzMzMuMjM2OSIgY3k9Ii0zODQuNjE1NiIgcng9IjM3LjkzMDYiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMzMuMjM2OSIgeT0iLTM4OC44MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzMzLjIzNjkiIHk9Ii0zNzIuMDE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDA1QjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZWUmIzQ1OyZndDt0cmkgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjUiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmVlJiM0NTsmZ3Q7dHJpPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTIzOC4zMTk1LC0zMDEuODc2QzI0NS4zMjQsLTMwNy43Mjg2IDI1My4xNDQxLC0zMTQuMzEyOSAyNjAuMjM2OSwtMzIwLjQgMjczLjYwMjIsLTMzMS44NzAzIDI4OC4xOTk5LC0zNDQuNjU4NSAzMDAuODA1LC0zNTUuNzg0NiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjMwOC4zNjcxLC0zNjIuNDcwNyAyOTcuODk0NywtMzU5LjIxODEgMzA0LjYyMTMsLTM1OS4xNTg4IDMwMC44NzU1LC0zNTUuODQ2OSAzMDAuODc1NSwtMzU1Ljg0NjkgMzAwLjg3NTUsLTM1NS44NDY5IDMwNC42MjEzLC0zNTkuMTU4OCAzMDMuODU2MiwtMzUyLjQ3NTYgMzA4LjM2NzEsLTM2Mi40NzA3IDMwOC4zNjcxLC0zNjIuNDcwNyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjg4LjE4MjIiIHk9Ii0zMjQuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4zLCBpPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlJiM0NTsmZ3Q7dHJlZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyZSYjNDU7Jmd0O3RyZWU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjE3LjIzNjksLTM1NS4wODk3QzIxNy4yMzY5LC0zNDEuNjA0NiAyMTcuMjM2OSwtMzI1LjcxMjMgMjE3LjIzNjksLTMxMi40MTUzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjIwLjczNywtMzEyLjQwMzMgMjE3LjIzNjksLTMwMi40MDMzIDIxMy43MzcsLTMxMi40MDM0IDIyMC43MzcsLTMxMi40MDMzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMjIuMDk0MiIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlJiM0NTsmZ3Q7dHJlZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyNCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyZSYjNDU7Jmd0O3RyZWU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMjI4LjQwOSwtMzU2LjIzNzZDMjMxLjQ4NzcsLTM0NS4wOTQzIDIzMy40NDYsLTMzMi4xNzU1IDIzMS4yMzY5LC0zMjAuNCAyMzAuNzAzNywtMzE3LjU1NzYgMjI5Ljk1MjgsLTMxNC42NTEzIDIyOS4wNzI3LC0zMTEuNzgzMiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjIyNS43MTE2LC0zMDIuMzI3OSAyMzMuMzAxMiwtMzEwLjI0MyAyMjcuMzg2MywtMzA3LjAzOTEgMjI5LjA2MTEsLTMxMS43NTAzIDIyOS4wNjExLC0zMTEuNzUwMyAyMjkuMDYxMSwtMzExLjc1MDMgMjI3LjM4NjMsLTMwNy4wMzkxIDIyNC44MjEsLTMxMy4yNTc1IDIyNS43MTE2LC0zMDIuMzI3OSAyMjUuNzExNiwtMzAyLjMyNzkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI0NC4wOTQyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IDQsIGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmllJiM0NTsmZ3Q7c3RhcnQgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjciIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmllJiM0NTsmZ3Q7c3RhcnQ8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNNDA1LjI5ODMsLTMwMi41MTM0QzQwNi45MTI3LC0zMDguMTc0NSA0MDguNDMwOSwtMzE0LjQ4NyA0MDkuMjM2OSwtMzIwLjQgNDEwLjI0NTMsLTMyNy43OTgzIDQwOS45MTM4LC0zMjkuNzY0MSA0MDkuMjM2OSwtMzM3LjIgMzk3Ljg2NzMsLTQ2Mi4wODcyIDM2NC43MTY5LC02MDguMzk0IDM1MC4xOTE3LC02NjguNjE2MSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjM0Ny43ODU2LC02NzguNTA5MyAzNDUuNzc2MywtNjY3LjcyOSAzNDguOTY3MiwtNjczLjY1MDkgMzUwLjE0ODksLTY2OC43OTI1IDM1MC4xNDg5LC02NjguNzkyNSAzNTAuMTQ4OSwtNjY4Ljc5MjUgMzQ4Ljk2NzIsLTY3My42NTA5IDM1NC41MjE0LC02NjkuODU2IDM0Ny43ODU2LC02NzguNTA5MyAzNDcuNzg1NiwtNjc4LjUwOTMiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQwNi4zOTc1IiB5PSItNDkyLjA0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+JiM0NTsxLCAmIzQ1OzE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmkmIzQ1OyZndDt0cmllIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTEyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpJiM0NTsmZ3Q7dHJpZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0zNDMuNTMwOCwtMzU2LjIyODNDMzQ4LjQwNjgsLTM0NC42MDAyIDM1NC44NTQyLC0zMzEuMzM1MyAzNjIuNTIyMywtMzIwLjQgMzY1LjE4OSwtMzE2LjU5NyAzNjguMjg4NCwtMzEyLjg1MjggMzcxLjUzNDQsLTMwOS4zMDA1Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMzc0LjI5MDksLTMxMS40ODY4IDM3OC43NjM2LC0zMDEuODgyNCAzNjkuMjc3NywtMzA2LjYwMTMgMzc0LjI5MDksLTMxMS40ODY4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNjcuMDk0MiIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpJiM0NTsmZ3Q7dHJpZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyNiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyaSYjNDU7Jmd0O3RyaWU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMzU0LjkzMzYsLTM2MC4yODk4QzM2MC44NzY2LC0zNTMuMDk2OSAzNjcuMDkyNiwtMzQ1LjA0MzEgMzcyLjIzNjksLTMzNy4yIDM3Ny40ODgzLC0zMjkuMTkzNiAzODIuNDg3NSwtMzIwLjAzNjEgMzg2LjcyNDcsLTMxMS42MjA2Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMzkxLjE1NzcsLTMwMi41MzUzIDM5MC44MTY3LC0zMTMuNDk1OSAzODguOTY1MSwtMzA3LjAyODkgMzg2Ljc3MjUsLTMxMS41MjI1IDM4Ni43NzI1LC0zMTEuNTIyNSAzODYuNzcyNSwtMzExLjUyMjUgMzg4Ljk2NTEsLTMwNy4wMjg5IDM4Mi43MjgyLC0zMDkuNTQ5MiAzOTEuMTU3NywtMzAyLjUzNTMgMzkxLjE1NzcsLTMwMi41MzUzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzOTMuMDk0MiIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiA0LCBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHIgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTIiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyMTcuMjM2OSIgY3k9Ii00OTYuMjQ2OSIgcng9IjM3LjkwMjciIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTcuMjM2OSIgeT0iLTUwMC40NDY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPlNwYXJzZTwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxNy4yMzY5IiB5PSItNDgzLjY0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwN0U8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyYSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U0IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmE8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMTgyLjYxMTYsLTQ4NC4xMDA0QzE2NS44ODg5LC00NzYuNDk2MSAxNDcuMDA1NiwtNDY1LjAxOCAxMzUuNTIyMywtNDQ4LjgzMTMgMTMwLjQyNDEsLTQ0MS42NDUgMTI3LjI4ODIsLTQzMi45MTI1IDEyNS4zOTMyLC00MjQuMjMyMyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjEyOC44MDkzLC00MjMuNDQxMyAxMjMuNjk1NCwtNDE0LjE2MjMgMTIxLjkwNjcsLTQyNC42MDUxIDEyOC44MDkzLC00MjMuNDQxMyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTQxLjA5NDIiIHk9Ii00MzYuMjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gYTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJhIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE4IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmE8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMTk2LjM3NTIsLTQ3MS40NzIzQzE4Mi43NzI5LC00NTUuMzE4NiAxNjQuODg3NywtNDM0LjA3ODggMTUwLjIwODcsLTQxNi42NDY1Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMTQzLjcxNjgsLTQwOC45MzY5IDE1My42MDAyLC00MTMuNjg3NyAxNDYuOTM3NCwtNDEyLjc2MTYgMTUwLjE1OCwtNDE2LjU4NjIgMTUwLjE1OCwtNDE2LjU4NjIgMTUwLjE1OCwtNDE2LjU4NjIgMTQ2LjkzNzQsLTQxMi43NjE2IDE0Ni43MTU4LC00MTkuNDg0OCAxNDMuNzE2OCwtNDA4LjkzNjkgMTQzLjcxNjgsLTQwOC45MzY5Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxODguMDk0MiIgeT0iLTQzNi4yMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiAzLCBhPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0cmUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlOSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTIxNy4yMzY5LC00NjYuNjI0OUMyMTcuMjM2OSwtNDUzLjc1NjggMjE3LjIzNjksLTQzOC40ODY3IDIxNy4yMzY5LC00MjQuNjMxOSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjIyMC43MzcsLTQyNC4zNzYxIDIxNy4yMzY5LC00MTQuMzc2MSAyMTMuNzM3LC00MjQuMzc2MiAyMjAuNzM3LC00MjQuMzc2MSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjIyLjA5NDIiIHk9Ii00MzYuMjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJpIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTExIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmk8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjM0LjAwNDksLTQ2OS42ODczQzI0Mi40MjQxLC00NTcuNDY3OCAyNTMuMjgzMywtNDQzLjIzMjggMjY0Ljg0NjMsLTQzMi4wMzEzIDI3My43NjQxLC00MjMuMzkyMiAyODQuNDAxNiwtNDE1LjIxMDEgMjk0LjU5OTEsLTQwOC4xNTE2Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjk2LjY2MzEsLTQxMC45ODE1IDMwMy4wMTQzLC00MDIuNTAxMyAyOTIuNzYxLC00MDUuMTcgMjk2LjY2MzEsLTQxMC45ODE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNjguOTMyMiIgeT0iLTQzNi4yMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBpPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdCYjNDU7Jmd0O3RyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50JiM0NTsmZ3Q7dHI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjE3LjIzNjksLTU3OC4wODE1QzIxNy4yMzY5LC01NjYuMzUwMiAyMTcuMjM2OSwtNTUwLjY3NzQgMjE3LjIzNjksLTUzNi4xODg1Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjIwLjczNywtNTM1LjkyMDggMjE3LjIzNjksLTUyNS45MjA5IDIxMy43MzcsLTUzNS45MjA5IDIyMC43MzcsLTUzNS45MjA4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMjEuMzE3MiIgeT0iLTU0Ny44NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdCYjNDU7Jmd0O3RyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE3IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dCYjNDU7Jmd0O3RyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTIyNC4zNzk2LC01NzguODAzQzIyNi4zNjM1LC01NzMuMDUyOSAyMjguMjQ0OSwtNTY2LjU3NTQgMjI5LjIzNjksLTU2MC40NjI2IDIzMC41ODAxLC01NTIuMTg1MiAyMzAuMTQ2NSwtNTQzLjMzMjUgMjI4Ljg1MDMsLTUzNC45MjczIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjI2LjkwMjksLTUyNC45NjU1IDIzMy4yMzc5LC01MzMuOTE2NCAyMjcuODYyMiwtNTI5Ljg3MjYgMjI4LjgyMTUsLTUzNC43Nzk4IDIyOC44MjE1LC01MzQuNzc5OCAyMjguODIxNSwtNTM0Ljc3OTggMjI3Ljg2MjIsLTUyOS44NzI2IDIyNC40MDUxLC01MzUuNjQzMSAyMjYuOTAyOSwtNTI0Ljk2NTUgMjI2LjkwMjksLTUyNC45NjU1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNDEuMzE3MiIgeT0iLTU0Ny44NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiAyLCByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLndjMi5zdmcgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQud2MyLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjYzNTE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLndjMi5zdmcKQEAgLTAsMCArMSwzMTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPCEtLQorICAtIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAtIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIC0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICAtIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgLQorICAtICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgLQorICAtIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgLSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAtIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAtIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgLSBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgLS0+CisKKzwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKKyAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cis8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDIuNDAuMSAoMjAxNjEyMjUuMDMwNCkKK2RpZ3JhcGggRyB7CisgICAgeyByYW5rPXNhbWUgcm9vdCAtPiBzdGFydCBbc3R5bGU9aW52aXNdIH0KKyAgICBzdGFydCBbbGFiZWw9InN0YXJ0L2VuZCJdCisKKyAgICB0cmFjdG9yIFtsYWJlbCA9ICJjb250ZW50QXJyYXlbMF0iXQorICAgIHRyYWN0byBbbGFiZWwgPSAiMHgwMUIiXQorICAgIHRyYWN0IFtsYWJlbCA9ICIweDAxQSJdCisgICAgdHJhYyBbbGFiZWwgPSAiMHgwMTkiXQorICAgIHRyYSBbbGFiZWwgPSAiQ2hhaW5cbjB4MDE4Il0KKworICAgIHRyZWUgW2xhYmVsID0gImNvbnRlbnRBcnJheVsxXSJdCisgICAgdHJlIFtsYWJlbCA9ICJDaGFpblxuMHgwM0IiXQorICAgIHRyaWUgW2xhYmVsID0gImNvbnRlbnRBcnJheVsyXSJdCisgICAgdHJpIFtsYWJlbCA9ICJDaGFpblxuMHgwNUIiXQorCisgICAgdHIgW2xhYmVsID0gIlNwYXJzZVxuMHgwN0UiXQorCisgICAgdCBbbGFiZWwgPSAiMHgwOUIiXQorICAgIHJvb3QgW2xhYmVsID0gIkNoYWluXG4weDlBIl0KKworICAgIHJvb3QgLT4gdCBbbGFiZWwgPSAiIHQiXQorICAgIHQgLT4gdHIgW2xhYmVsID0gIiByIl0KKyAgICB0ciAtPiB0cmEgW2xhYmVsID0gIiBhIl0KKyAgICB0cmEgLT4gdHJhYyBbbGFiZWwgPSAiIGMiXQorICAgIHRyYWMgLT4gdHJhY3QgW2xhYmVsID0gIiB0Il0KKyAgICB0cmFjdCAtPiB0cmFjdG8gW2xhYmVsID0gIiBvIl0KKyAgICB0cmFjdG8gLT4gdHJhY3RvciBbbGFiZWwgPSAiIHIiXQorCisgICAgdHIgLT4gdHJlIFtsYWJlbCA9ICIgZSJdCisgICAgdHJlIC0+IHRyZWUgW2xhYmVsID0gIiBlIl0KKworICAgIHRyIC0+IHRyaSBbbGFiZWwgPSAiIGkiXQorICAgIHRyaSAtPiB0cmllIFtsYWJlbCA9ICIgZSJdCisKKyAgICAvLyB7cmFuaz1zYW1lIHRyYSAtPiB0cmUgLT4gdHJpIFtzdHlsZT1pbnZpc119CisgICAge3Jhbms9c2FtZSB0cmFjIC0+IHRyZWUgLT4gdHJpZSBbc3R5bGU9aW52aXNdfQorCisgICAgc3ViZ3JhcGggcGF0aCB7CisgICAgICAgIGVkZ2UgW2NvbG9yID0gImxpZ2h0Ymx1ZSI7IGZvbnRjb2xvcj0iYmx1ZSI7IGFycm93aGVhZD0idmVlIjsgY29uc3RyYWludD0iZmFsc2UiXQorCisgICAgICAgIHN0YXJ0IC0+IHJvb3QgW2xhYmVsID0gIiAwLCAtMSJdCisKKyAgICAgICAgcm9vdCAtPiB0ciBbbGFiZWwgPSAidCwgMiwgciAiXQorICAgICAgICB0ciAtPiB0cmEgW2xhYmVsID0gIjMsIGEiXQorICAgICAgICB0cmEgLT4gdHJhY3RvciBbbGFiZWwgPSAiY3RvLCA3LCByIl0KKworICAgICAgICAvLyB0ciAtPiB0cmUgW2xhYmVsID0gIiBlIl0KKyAgICAgICAgdHJlIC0+IHRyZWUgW2xhYmVsID0gIiA0LCBlIl0KKworICAgICAgICAvLyB0ciAtPiB0cmkgW2xhYmVsID0gIiBpIl0KKyAgICAgICAgdHJpIC0+IHRyaWUgW2xhYmVsID0gIiA0LCBlIl0KKworICAgICAgICB0cmFjdG9yIC0+IHRyZSBbbGFiZWwgPSAiIDMsIGUiXQorICAgICAgICB0cmVlIC0+IHRyaSBbbGFiZWwgPSAiMywgaSI7IF0KKyAgICAgICAgdHJpZSAtPiBzdGFydCBbbGFiZWwgPSAiLTEsIC0xIl0KKyAgICB9Cit9CisgLS0+Cis8IS0tIFRpdGxlOiBHIFBhZ2VzOiAxIC0tPgorPHN2ZyB3aWR0aD0iNTE1cHQiIGhlaWdodD0iNzM0cHQiCisgICAgIHZpZXdCb3g9IjAuMDAgMC4wMCA1MTQuOTcgNzM0LjA5IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KKyAgICA8ZyBpZD0iZ3JhcGgwIiBjbGFzcz0iZ3JhcGgiIHRyYW5zZm9ybT0ic2NhbGUoMSAxKSByb3RhdGUoMCkgdHJhbnNsYXRlKDQgNzMwLjA5MzkpIj4KKyAgICAgICAgPHRpdGxlPkc8L3RpdGxlPgorICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9InRyYW5zcGFyZW50IiBwb2ludHM9Ii00LDQgLTQsLTczMC4wOTM5IDUxMC45NzM1LC03MzAuMDkzOSA1MTAuOTczNSw0IC00LDQiLz4KKyAgICAgICAgPCEtLSByb290IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT5yb290PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjIzNS43NDMiIGN5PSItNjk2LjY3ODIiIHJ4PSIzNC45MjEzIiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjM1Ljc0MyIgeT0iLTcwMC44NzgyIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjM1Ljc0MyIgeT0iLTY4NC4wNzgyIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4OUE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSBzdGFydCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUyIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+c3RhcnQ8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMzYxLjc0MyIgY3k9Ii02OTYuNjc4MiIgcng9IjQ0LjA3NzUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzYxLjc0MyIgeT0iLTY5Mi40NzgyIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPnN0YXJ0L2VuZDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHJvb3QmIzQ1OyZndDtzdGFydCAtLT4KKyAgICAgICAgPCEtLSB0ciAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjIzNS43NDMiIGN5PSItNDk2LjI0NjkiIHJ4PSIzNy45MDI3IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjM1Ljc0MyIgeT0iLTUwMC40NDY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPlNwYXJzZTwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIzNS43NDMiIHk9Ii00ODMuNjQ2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDA3RTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHJvb3QmIzQ1OyZndDt0ciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnJvb3QmIzQ1OyZndDt0cjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yMDguOTI1NiwtNjc3LjgwNEMxOTAuMzcsLTY2Mi45ODc1IDE2Ny4xOTY2LC02NDAuNTQ0MiAxNTYuNjkxOCwtNjE0LjQ2MjYgMTQyLjc5NzYsLTU3OS45NjU2IDE3Mi42MjMsLTU0NS4xMzY2IDE5OS41MjksLTUyMi4zMDk3Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjA3LjM2NjcsLTUxNS45MTI1IDIwMi40NjUxLC01MjUuNzIxOSAyMDMuNDkzMSwtNTE5LjA3NDEgMTk5LjYxOTYsLTUyMi4yMzU3IDE5OS42MTk2LC01MjIuMjM1NyAxOTkuNjE5NiwtNTIyLjIzNTcgMjAzLjQ5MzEsLTUxOS4wNzQxIDE5Ni43NzQxLC01MTguNzQ5NSAyMDcuMzY2NywtNTE1LjkxMjUgMjA3LjM2NjcsLTUxNS45MTI1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNzMuMjY4NiIgeT0iLTU5Mi4yNjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPnQsIDIsIHIgPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnQ8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjM1Ljc0MyIgY3k9Ii01OTYuNDYyNiIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjM1Ljc0MyIgeT0iLTU5Mi4yNjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDlCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gcm9vdCYjNDU7Jmd0O3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnJvb3QmIzQ1OyZndDt0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTIzNS43NDMsLTY2Ny4xNTIyQzIzNS43NDMsLTY1My42NjcxIDIzNS43NDMsLTYzNy43NzQ5IDIzNS43NDMsLTYyNC40Nzc5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjM5LjI0MzEsLTYyNC40NjU5IDIzNS43NDMsLTYxNC40NjU5IDIzMi4yNDMxLC02MjQuNDY1OSAyMzkuMjQzMSwtNjI0LjQ2NTkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIzOS40MzgzIiB5PSItNjM2LjY2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSBzdGFydCYjNDU7Jmd0O3Jvb3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTUiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT5zdGFydCYjNDU7Jmd0O3Jvb3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMzE3LjM3ODMsLTY5Ni42NzgyQzMwNS41NzY5LC02OTYuNjc4MiAyOTIuODE2NywtNjk2LjY3ODIgMjgwLjk2OTgsLTY5Ni42NzgyIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjcwLjg0MSwtNjk2LjY3ODIgMjgwLjg0MTEsLTY5Mi4xNzgzIDI3NS44NDEsLTY5Ni42NzgzIDI4MC44NDEsLTY5Ni42NzgzIDI4MC44NDEsLTY5Ni42NzgzIDI4MC44NDEsLTY5Ni42NzgzIDI3NS44NDEsLTY5Ni42NzgzIDI4MC44NDEsLTcwMS4xNzgzIDI3MC44NDEsLTY5Ni42NzgyIDI3MC44NDEsLTY5Ni42NzgyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyOTQuMDc5MiIgeT0iLTcwMy44NzgyIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiAwLCAmIzQ1OzE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdG9yIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTMiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdG9yPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjkxLjc0MyIgY3k9Ii0xOCIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iOTEuNzQzIiB5PSItMTMuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5jb250ZW50QXJyYXlbMF08L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlOSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyMzUuNzQzIiBjeT0iLTM4NC42MTU2IiByeD0iMzcuOTMwNiIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIzNS43NDMiIHk9Ii0zODguODE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIzNS43NDMiIHk9Ii0zNzIuMDE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAzQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0b3ImIzQ1OyZndDt0cmUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjEiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdG9yJiM0NTsmZ3Q7dHJlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTE0Mi4yODgxLC0zMS4yMDMzQzIzMy4yMjQsLTU4LjAwNTIgNDIyLjE0ODYsLTEyOC4zMTQ3IDQ5OS43NDMsLTI2Ni40IDUwNy41ODEyLC0yODAuMzQ4NiA1MTAuNjcxMSwtMjkwLjcxMzQgNDk5Ljc0MywtMzAyLjQgNDU4Ljk3NDcsLTM0NS45OTgzIDI3Mi41MTEzLC0yNzYuODAxNyAyMzEuNzQzLC0zMjAuNCAyMjUuMjk5OSwtMzI3LjI5MDQgMjIzLjU0MzIsLTMzNi42MjMyIDIyNC4wODIxLC0zNDYuMDM3MSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjIyNS40NTQ3LC0zNTYuMTcyMiAyMTkuNjUzMiwtMzQ2Ljg2NjYgMjI0Ljc4MzYsLTM1MS4yMTc0IDIyNC4xMTI1LC0zNDYuMjYyNyAyMjQuMTEyNSwtMzQ2LjI2MjcgMjI0LjExMjUsLTM0Ni4yNjI3IDIyNC43ODM2LC0zNTEuMjE3NCAyMjguNTcxOCwtMzQ1LjY1ODcgMjI1LjQ1NDcsLTM1Ni4xNzIyIDIyNS40NTQ3LC0zNTYuMTcyMiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDcxLjYwMDMiIHk9Ii0xOTEuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gMywgZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0byAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU0IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjkxLjc0MyIgY3k9Ii0xMDYuOCIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iOTEuNzQzIiB5PSItMTAyLjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwMUI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdG8mIzQ1OyZndDt0cmFjdG9yIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTgiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdG8mIzQ1OyZndDt0cmFjdG9yPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTkxLjc0MywtODguNDAwNkM5MS43NDMsLTc2LjI5NDkgOTEuNzQzLC02MC4yMDc2IDkxLjc0MywtNDYuNDY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9Ijk1LjI0MzEsLTQ2LjA3MiA5MS43NDMsLTM2LjA3MiA4OC4yNDMxLC00Ni4wNzIxIDk1LjI0MzEsLTQ2LjA3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iOTUuODIzMyIgeT0iLTU4LjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU1IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3Q8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iOTEuNzQzIiBjeT0iLTE5NS42IiByeD0iMzcuMTQ0MyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI5MS43NDMiIHk9Ii0xOTEuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxQTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0JiM0NTsmZ3Q7dHJhY3RvIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTciIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdCYjNDU7Jmd0O3RyYWN0bzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik05MS43NDMsLTE3Ny4yMDA2QzkxLjc0MywtMTY1LjA5NDkgOTEuNzQzLC0xNDkuMDA3NiA5MS43NDMsLTEzNS4yNjc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iOTUuMjQzMSwtMTM0Ljg3MiA5MS43NDMsLTEyNC44NzIgODguMjQzMSwtMTM0Ljg3MjEgOTUuMjQzMSwtMTM0Ljg3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iOTYuOTkzIiB5PSItMTQ3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBvPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhYyAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU2IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhYzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI5MS43NDMiIGN5PSItMjg0LjQiIHJ4PSIzNS4zNTg3IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjkxLjc0MyIgeT0iLTI4MC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDE5PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhYyYjNDU7Jmd0O3RyYWN0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTYiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjJiM0NTsmZ3Q7dHJhY3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNOTEuNzQzLC0yNjYuMDAwNkM5MS43NDMsLTI1My44OTQ5IDkxLjc0MywtMjM3LjgwNzYgOTEuNzQzLC0yMjQuMDY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9Ijk1LjI0MzEsLTIyMy42NzIgOTEuNzQzLC0yMTMuNjcyIDg4LjI0MzEsLTIyMy42NzIxIDk1LjI0MzEsLTIyMy42NzIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijk1LjQzODMiIHk9Ii0yMzUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gdDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZWUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlOCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyZWU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjM1Ljc0MyIgY3k9Ii0yODQuNCIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjM1Ljc0MyIgeT0iLTI4MC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVsxXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWMmIzQ1OyZndDt0cmVlIC0tPgorICAgICAgICA8IS0tIHRyYSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU3IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjExNy43NDMiIGN5PSItMzg0LjYxNTYiIHJ4PSIzNi4xMjUiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxMTcuNzQzIiB5PSItMzg4LjgxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxMTcuNzQzIiB5PSItMzcyLjAxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwMTg8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmEmIzQ1OyZndDt0cmFjdG9yIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE4IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhJiM0NTsmZ3Q7dHJhY3RvcjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik05NC4zOTE4LC0zNjEuODQ4QzY1LjIxNzIsLTMzMS4zODA1IDE3LjM3MSwtMjc0LjEyNzcgMi45NzcyLC0yMTMuNiAtMTIuMzgyOCwtMTQ5LjAwOTIgMzYuNTUzLC03OS42NTU3IDY3Ljc4NDUsLTQzLjQwMzMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSI3NC41MzE0LC0zNS43NjIzIDcxLjI4NTcsLTQ2LjIzNjkgNzEuMjIxOSwtMzkuNTEwNCA2Ny45MTI1LC00My4yNTg0IDY3LjkxMjUsLTQzLjI1ODQgNjcuOTEyNSwtNDMuMjU4NCA3MS4yMjE5LC0zOS41MTA0IDY0LjUzOTMsLTQwLjI3OTkgNzQuNTMxNCwtMzUuNzYyMyA3NC41MzE0LC0zNS43NjIzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNS4xMjU5IiB5PSItMTkxLjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+Y3RvLCA3LCByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhJiM0NTsmZ3Q7dHJhYyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U1IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhJiM0NTsmZ3Q7dHJhYzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0xMTAuMjIyNywtMzU1LjYyOTFDMTA2LjY2MTMsLTM0MS45MDE2IDEwMi40MjgyLC0zMjUuNTg1NCA5OC45MTI2LC0zMTIuMDM0OCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjEwMi4yODYzLC0zMTEuMTAwOSA5Ni4zODcxLC0zMDIuMzAwMyA5NS41MTA2LC0zMTIuODU4OCAxMDIuMjg2MywtMzExLjEwMDkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjEwOS42MDAzIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmllIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEwIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI0MTcuNzQzIiBjeT0iLTI4NC40IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MTcuNzQzIiB5PSItMjgwLjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzJdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlZSYjNDU7Jmd0O3RyaWUgLS0+CisgICAgICAgIDwhLS0gdHJpIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTExIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjM1MS43NDMiIGN5PSItMzg0LjYxNTYiIHJ4PSIzNy45MzA2IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzUxLjc0MyIgeT0iLTM4OC44MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzUxLjc0MyIgeT0iLTM3Mi4wMTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDVCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlZSYjNDU7Jmd0O3RyaSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyZWUmIzQ1OyZndDt0cmk8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMjU2LjI3MjMsLTMwMS45NTMxQzI2My4xMDk3LC0zMDcuODEwOSAyNzAuNzYxMywtMzE0LjM3ODcgMjc3Ljc0MywtMzIwLjQgMjkxLjE4MzcsLTMzMS45OTE5IDMwNS45NjE1LC0zNDQuODAyNSAzMTguNzUzNSwtMzU1LjkxMjYiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIzMjYuNDMyLC0zNjIuNTg0MyAzMTUuOTMxOCwtMzU5LjQyMjMgMzIyLjY1NzcsLTM1OS4zMDQ4IDMxOC44ODM0LC0zNTYuMDI1NCAzMTguODgzNCwtMzU2LjAyNTQgMzE4Ljg4MzQsLTM1Ni4wMjU0IDMyMi42NTc3LC0zNTkuMzA0OCAzMjEuODM0OSwtMzUyLjYyODUgMzI2LjQzMiwtMzYyLjU4NDMgMzI2LjQzMiwtMzYyLjU4NDMiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMwNC42ODgzIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+MywgaTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZSYjNDU7Jmd0O3RyZWUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTAiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmUmIzQ1OyZndDt0cmVlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTIzNS43NDMsLTM1NS4wODk3QzIzNS43NDMsLTM0MS42MDQ2IDIzNS43NDMsLTMyNS43MTIzIDIzNS43NDMsLTMxMi40MTUzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjM5LjI0MzEsLTMxMi40MDMzIDIzNS43NDMsLTMwMi40MDMzIDIzMi4yNDMxLC0zMTIuNDAzNCAyMzkuMjQzMSwtMzEyLjQwMzMiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI0MC42MDAzIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmUmIzQ1OyZndDt0cmVlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE5IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlJiM0NTsmZ3Q7dHJlZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yNDYuOTE1MiwtMzU2LjIzNzZDMjQ5Ljk5MzksLTM0NS4wOTQzIDI1MS45NTIxLC0zMzIuMTc1NSAyNDkuNzQzLC0zMjAuNCAyNDkuMjA5OCwtMzE3LjU1NzYgMjQ4LjQ1ODksLTMxNC42NTEzIDI0Ny41Nzg5LC0zMTEuNzgzMiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjI0NC4yMTc3LC0zMDIuMzI3OSAyNTEuODA3MywtMzEwLjI0MyAyNDUuODkyNSwtMzA3LjAzOTEgMjQ3LjU2NzIsLTMxMS43NTAzIDI0Ny41NjcyLC0zMTEuNzUwMyAyNDcuNTY3MiwtMzExLjc1MDMgMjQ1Ljg5MjUsLTMwNy4wMzkxIDI0My4zMjcxLC0zMTMuMjU3NSAyNDQuMjE3NywtMzAyLjMyNzkgMjQ0LjIxNzcsLTMwMi4zMjc5Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNjEuNjAwMyIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiA0LCBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpZSYjNDU7Jmd0O3N0YXJ0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIzIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpZSYjNDU7Jmd0O3N0YXJ0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTQyMy44MDQ0LC0zMDIuNTEzNEM0MjUuNDE4OCwtMzA4LjE3NDUgNDI2LjkzNywtMzE0LjQ4NyA0MjcuNzQzLC0zMjAuNCA0MjguNzUxNSwtMzI3Ljc5ODMgNDI4LjQyLC0zMjkuNzY0MSA0MjcuNzQzLC0zMzcuMiA0MTYuMzczNCwtNDYyLjA4NzIgMzgzLjIyMywtNjA4LjM5NCAzNjguNjk3OCwtNjY4LjYxNjEiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIzNjYuMjkxNywtNjc4LjUwOTMgMzY0LjI4MjUsLTY2Ny43MjkgMzY3LjQ3MzQsLTY3My42NTA5IDM2OC42NTUsLTY2OC43OTI1IDM2OC42NTUsLTY2OC43OTI1IDM2OC42NTUsLTY2OC43OTI1IDM2Ny40NzM0LC02NzMuNjUwOSAzNzMuMDI3NSwtNjY5Ljg1NiAzNjYuMjkxNywtNjc4LjUwOTMgMzY2LjI5MTcsLTY3OC41MDkzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MjQuOTAzNiIgeT0iLTQ5Mi4wNDY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiYjNDU7MSwgJiM0NTsxPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpJiM0NTsmZ3Q7dHJpZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyaSYjNDU7Jmd0O3RyaWU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMzYyLjAzNjksLTM1Ni4yMjgzQzM2Ni45MTI5LC0zNDQuNjAwMiAzNzMuMzYwMywtMzMxLjMzNTMgMzgxLjAyODQsLTMyMC40IDM4My42OTUyLC0zMTYuNTk3IDM4Ni43OTQ2LC0zMTIuODUyOCAzOTAuMDQwNiwtMzA5LjMwMDUiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIzOTIuNzk3MSwtMzExLjQ4NjggMzk3LjI2OTgsLTMwMS44ODI0IDM4Ny43ODM5LC0zMDYuNjAxMyAzOTIuNzk3MSwtMzExLjQ4NjgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM4NS42MDAzIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmkmIzQ1OyZndDt0cmllIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIwIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpJiM0NTsmZ3Q7dHJpZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0zNzMuNDM5NywtMzYwLjI4OThDMzc5LjM4MjgsLTM1My4wOTY5IDM4NS41OTg4LC0zNDUuMDQzMSAzOTAuNzQzLC0zMzcuMiAzOTUuOTk0NCwtMzI5LjE5MzYgNDAwLjk5MzYsLTMyMC4wMzYxIDQwNS4yMzA4LC0zMTEuNjIwNiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjQwOS42NjM4LC0zMDIuNTM1MyA0MDkuMzIyOCwtMzEzLjQ5NTkgNDA3LjQ3MTIsLTMwNy4wMjg5IDQwNS4yNzg2LC0zMTEuNTIyNSA0MDUuMjc4NiwtMzExLjUyMjUgNDA1LjI3ODYsLTMxMS41MjI1IDQwNy40NzEyLC0zMDcuMDI4OSA0MDEuMjM0MywtMzA5LjU0OTIgNDA5LjY2MzgsLTMwMi41MzUzIDQwOS42NjM4LC0zMDIuNTM1MyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDExLjYwMDMiIHk9Ii0zMjQuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gNCwgZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJhIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTQiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3RyYTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yMDEuNzUwOSwtNDgyLjgxODNDMTg0LjkxNzUsLTQ3NC44NzUyIDE2NS4yMTYxLC00NjMuNDgxMiAxNTEuMDI4NCwtNDQ4LjgzMTMgMTQzLjY5MDMsLTQ0MS4yNTQxIDEzNy41ODQxLC00MzEuNzM1NiAxMzIuNjkxNSwtNDIyLjM2NTYiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIxMzUuNzE5NiwtNDIwLjU4ODggMTI4LjIwMjcsLTQxMy4xMjI0IDEyOS40MjI4LC00MjMuNjQ2OCAxMzUuNzE5NiwtNDIwLjU4ODgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE1Ni42MDAzIiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyYSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJhPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTIxMS41NzkyLC00NzMuMzg3M0MxOTMuNDgzNiwtNDU2LjI2ODMgMTY4LjU3NjQsLTQzMi43MDU1IDE0OC45NzA0LC00MTQuMTU3NiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjE0MS40NzEzLC00MDcuMDYzMiAxNTEuODI4MiwtNDEwLjY2NjYgMTQ1LjEwMzUsLTQxMC40OTk0IDE0OC43MzU3LC00MTMuOTM1NiAxNDguNzM1NywtNDEzLjkzNTYgMTQ4LjczNTcsLTQxMy45MzU2IDE0NS4xMDM1LC00MTAuNDk5NCAxNDUuNjQzMSwtNDE3LjIwNDYgMTQxLjQ3MTMsLTQwNy4wNjMyIDE0MS40NzEzLC00MDcuMDYzMiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTk0Ljg1MDMiIHk9Ii00MzYuMjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4zLCBhPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0cmUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlOSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTIzNS43NDMsLTQ2Ni42MjQ5QzIzNS43NDMsLTQ1My43NTY4IDIzNS43NDMsLTQzOC40ODY3IDIzNS43NDMsLTQyNC42MzE5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjM5LjI0MzEsLTQyNC4zNzYxIDIzNS43NDMsLTQxNC4zNzYxIDIzMi4yNDMxLC00MjQuMzc2MiAyMzkuMjQzMSwtNDI0LjM3NjEiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI0MC42MDAzIiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyaSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJpPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTI1OS40OTczLC00NzMuMzg3M0MyNzcuMDUyMSwtNDU2LjQ5MzYgMzAxLjEyOCwtNDMzLjMyNDQgMzIwLjI4MTQsLTQxNC44OTI0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMzIyLjg0MzQsLTQxNy4yODQ0IDMyNy42MjE5LC00MDcuODI4MyAzMTcuOTg5NSwtNDEyLjI0MDUgMzIyLjg0MzQsLTQxNy4yODQ0Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMDMuNDM4MyIgeT0iLTQzNi4yMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBpPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdCYjNDU7Jmd0O3RyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50JiM0NTsmZ3Q7dHI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjM1Ljc0MywtNTc4LjA4MTVDMjM1Ljc0MywtNTY2LjM1MDIgMjM1Ljc0MywtNTUwLjY3NzQgMjM1Ljc0MywtNTM2LjE4ODUiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIyMzkuMjQzMSwtNTM1LjkyMDggMjM1Ljc0MywtNTI1LjkyMDkgMjMyLjI0MzEsLTUzNS45MjA5IDIzOS4yNDMxLC01MzUuOTIwOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjM5LjgyMzMiIHk9Ii01NDcuODYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gcjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgIDwvZz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvTWVyZ2VUcmllLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9NZXJnZVRyaWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjgwNzc2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvTWVyZ2VUcmllLmphdmEKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CisKKy8qKgorICogQSBtZXJnZWQgdmlldyBvZiB0d28gdHJpZXMuCisgKgorICogVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgd2Fsa2luZyB0aGUgdHdvIGN1cnNvcnMgaW4gcGFyYWxsZWw7IHRoZSBtZXJnZWQgY3Vyc29yIHRha2VzIHRoZSBwb3NpdGlvbiBhbmQgZmVhdHVyZXMgb2YgdGhlCisgKiBzbWFsbGVyIGFuZCBhZHZhbmNlcyB3aXRoIGl0OyB3aGVuIHRoZSB0d28gY3Vyc29ycyBhcmUgZXF1YWwsIGJvdGggYXJlIGFkdmFuY2VkLgorICoKKyAqIENydWNpYWwgZm9yIHRoZSBlZmZpY2llbmN5IG9mIHRoaXMgaXMgdGhlIGZhY3QgdGhhdCB3aGVuIHRoZXkgYXJlIGFkdmFuY2VkIGxpa2UgdGhpcywgd2UgY2FuIGNvbXBhcmUgY3Vyc29ycycKKyAqIHBvc2l0aW9ucyBieSB0aGVpciBkZXB0aCBkZXNjZW5kaW5nIGFuZCB0aGVuIGluY29taW5nVHJhbnNpdGlvbiBhc2NlbmRpbmcuCisgKgorICogU2VlIFRyaWUubWQgZm9yIGZ1cnRoZXIgZGV0YWlscy4KKyAqLworY2xhc3MgTWVyZ2VUcmllPFQ+IGV4dGVuZHMgVHJpZTxUPgoreworICAgIHByaXZhdGUgZmluYWwgTWVyZ2VSZXNvbHZlcjxUPiByZXNvbHZlcjsKKyAgICBwcm90ZWN0ZWQgZmluYWwgVHJpZTxUPiB0MTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgVHJpZTxUPiB0MjsKKworICAgIE1lcmdlVHJpZShNZXJnZVJlc29sdmVyPFQ+IHJlc29sdmVyLCBUcmllPFQ+IHQxLCBUcmllPFQ+IHQyKQorICAgIHsKKyAgICAgICAgdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyOworICAgICAgICB0aGlzLnQxID0gdDE7CisgICAgICAgIHRoaXMudDIgPSB0MjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQ3Vyc29yPFQ+IGN1cnNvcigpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IE1lcmdlQ3Vyc29yPD4ocmVzb2x2ZXIsIHQxLCB0Mik7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIE1lcmdlQ3Vyc29yPFQ+IGltcGxlbWVudHMgQ3Vyc29yPFQ+CisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIE1lcmdlUmVzb2x2ZXI8VD4gcmVzb2x2ZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ3Vyc29yPFQ+IGMxOworICAgICAgICBwcml2YXRlIGZpbmFsIEN1cnNvcjxUPiBjMjsKKworICAgICAgICBib29sZWFuIGF0QzE7CisgICAgICAgIGJvb2xlYW4gYXRDMjsKKworICAgICAgICBNZXJnZUN1cnNvcihNZXJnZVJlc29sdmVyPFQ+IHJlc29sdmVyLCBUcmllPFQ+IHQxLCBUcmllPFQ+IHQyKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXI7CisgICAgICAgICAgICB0aGlzLmMxID0gdDEuY3Vyc29yKCk7CisgICAgICAgICAgICB0aGlzLmMyID0gdDIuY3Vyc29yKCk7CisgICAgICAgICAgICBhc3NlcnQgYzEuZGVwdGgoKSA9PSAwOworICAgICAgICAgICAgYXNzZXJ0IGMyLmRlcHRoKCkgPT0gMDsKKyAgICAgICAgICAgIGF0QzEgPSBhdEMyID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGFkdmFuY2UoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY2hlY2tPcmRlcihhdEMxID8gYzEuYWR2YW5jZSgpIDogYzEuZGVwdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0QzIgPyBjMi5hZHZhbmNlKCkgOiBjMi5kZXB0aCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHNraXBDaGlsZHJlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjaGVja09yZGVyKGF0QzEgPyBjMS5za2lwQ2hpbGRyZW4oKSA6IGMxLmRlcHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdEMyID8gYzIuc2tpcENoaWxkcmVuKCkgOiBjMi5kZXB0aCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGFkdmFuY2VNdWx0aXBsZShUcmFuc2l0aW9uc1JlY2VpdmVyIHJlY2VpdmVyKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXaGlsZSB3ZSBhcmUgb24gYSBzaGFyZWQgcG9zaXRpb24sIHdlIG11c3QgZGVzY2VuZCBvbmUgYnl0ZSBhdCBhIHRpbWUgdG8gbWFpbnRhaW4gdGhlIGN1cnNvciBvcmRlcmluZy4KKyAgICAgICAgICAgIGlmIChhdEMxICYmIGF0QzIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrT3JkZXIoYzEuYWR2YW5jZSgpLCBjMi5hZHZhbmNlKCkpOworCisgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgaW4gYSBicmFuY2ggdGhhdCdzIG9ubHkgY292ZXJlZCBieSBvbmUgb2YgdGhlIHNvdXJjZXMsIHdlIGNhbiB1c2UgaXRzIGFkdmFuY2VNdWx0aXBsZSBhcyBpdCBpcworICAgICAgICAgICAgLy8gb25seSBkaWZmZXJlbnQgZnJvbSBhZHZhbmNlIGlmIGl0IHRha2VzIG11bHRpcGxlIHN0ZXBzIGRvd24sIHdoaWNoIGRvZXMgbm90IGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhlCisgICAgICAgICAgICAvLyBjdXJzb3JzLgorICAgICAgICAgICAgLy8gU2luY2UgaXQgbWlnaHQgYXNjZW5kLCB3ZSBzdGlsbCBoYXZlIHRvIGNoZWNrIHRoZSBvcmRlciBhZnRlciB0aGUgY2FsbC4KKyAgICAgICAgICAgIGlmIChhdEMxKQorICAgICAgICAgICAgICAgIHJldHVybiBjaGVja09yZGVyKGMxLmFkdmFuY2VNdWx0aXBsZShyZWNlaXZlciksIGMyLmRlcHRoKCkpOworICAgICAgICAgICAgZWxzZSAvLyBhdEMyCisgICAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrT3JkZXIoYzEuZGVwdGgoKSwgYzIuYWR2YW5jZU11bHRpcGxlKHJlY2VpdmVyKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBjaGVja09yZGVyKGludCBjMWRlcHRoLCBpbnQgYzJkZXB0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGMxZGVwdGggPiBjMmRlcHRoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF0QzEgPSB0cnVlOworICAgICAgICAgICAgICAgIGF0QzIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYzFkZXB0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjMWRlcHRoIDwgYzJkZXB0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdEMxID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYXRDMiA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMyZGVwdGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBjMWRlcHRoID09IGMyZGVwdGgKKyAgICAgICAgICAgIGludCBjMXRyYW5zID0gYzEuaW5jb21pbmdUcmFuc2l0aW9uKCk7CisgICAgICAgICAgICBpbnQgYzJ0cmFucyA9IGMyLmluY29taW5nVHJhbnNpdGlvbigpOworICAgICAgICAgICAgYXRDMSA9IGMxdHJhbnMgPD0gYzJ0cmFuczsKKyAgICAgICAgICAgIGF0QzIgPSBjMXRyYW5zID49IGMydHJhbnM7CisgICAgICAgICAgICByZXR1cm4gYzFkZXB0aDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGRlcHRoKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF0QzEgPyBjMS5kZXB0aCgpIDogYzIuZGVwdGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGluY29taW5nVHJhbnNpdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhdEMxID8gYzEuaW5jb21pbmdUcmFuc2l0aW9uKCkgOiBjMi5pbmNvbWluZ1RyYW5zaXRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUIGNvbnRlbnQoKQorICAgICAgICB7CisgICAgICAgICAgICBUIG1jID0gYXRDMiA/IGMyLmNvbnRlbnQoKSA6IG51bGw7CisgICAgICAgICAgICBUIG5jID0gYXRDMSA/IGMxLmNvbnRlbnQoKSA6IG51bGw7CisgICAgICAgICAgICBpZiAobWMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmM7CisgICAgICAgICAgICBlbHNlIGlmIChuYyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBtYzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIucmVzb2x2ZShuYywgbWMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lhbCBpbnN0YW5jZSBmb3Igc291cmNlcyB0aGF0IGFyZSBndWFyYW50ZWVkIChieSB0aGUgY2FsbGVyKSBkaXN0aW5jdC4gVGhlIG1haW4gZGlmZmVyZW5jZSBpcyB0aGF0IHdlIGNhbgorICAgICAqIGZvcm0gdW5vcmRlcmVkIHZhbHVlIGxpc3QgYnkgY29uY2F0ZW5hdGluZyBzb3VyY2VzLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBEaXN0aW5jdDxUPiBleHRlbmRzIE1lcmdlVHJpZTxUPgorICAgIHsKKyAgICAgICAgRGlzdGluY3QoVHJpZTxUPiBpbnB1dDEsIFRyaWU8VD4gaW5wdXQyKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcih0aHJvd2luZ1Jlc29sdmVyKCksIGlucHV0MSwgaW5wdXQyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSXRlcmFibGU8VD4gdmFsdWVzVW5vcmRlcmVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEl0ZXJhYmxlcy5jb25jYXQodDEudmFsdWVzVW5vcmRlcmVkKCksIHQyLnZhbHVlc1Vub3JkZXJlZCgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1NpbmdsZXRvblRyaWUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1NpbmdsZXRvblRyaWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzM2YTg1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvU2luZ2xldG9uVHJpZS5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CisKKy8qKgorICogU2luZ2xldG9uIHRyaWUsIG1hcHBpbmcgdGhlIGdpdmVuIGtleSB0byB2YWx1ZS4KKyAqLworY2xhc3MgU2luZ2xldG9uVHJpZTxUPiBleHRlbmRzIFRyaWU8VD4KK3sKKyAgICBwcml2YXRlIGZpbmFsIEJ5dGVDb21wYXJhYmxlIGtleTsKKyAgICBwcml2YXRlIGZpbmFsIFQgdmFsdWU7CisKKyAgICBTaW5nbGV0b25UcmllKEJ5dGVDb21wYXJhYmxlIGtleSwgVCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHRoaXMua2V5ID0ga2V5OworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIEN1cnNvciBjdXJzb3IoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDdXJzb3IoKTsKKyAgICB9CisKKyAgICBjbGFzcyBDdXJzb3IgaW1wbGVtZW50cyBUcmllLkN1cnNvcjxUPgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCeXRlU291cmNlIHNyYyA9IGtleS5hc0NvbXBhcmFibGVCeXRlcyhCWVRFX0NPTVBBUkFCTEVfVkVSU0lPTik7CisgICAgICAgIHByaXZhdGUgaW50IGN1cnJlbnREZXB0aCA9IDA7CisgICAgICAgIHByaXZhdGUgaW50IGN1cnJlbnRUcmFuc2l0aW9uID0gLTE7CisgICAgICAgIHByaXZhdGUgaW50IG5leHRUcmFuc2l0aW9uID0gc3JjLm5leHQoKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBhZHZhbmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgY3VycmVudFRyYW5zaXRpb24gPSBuZXh0VHJhbnNpdGlvbjsKKyAgICAgICAgICAgIGlmIChjdXJyZW50VHJhbnNpdGlvbiAhPSBCeXRlU291cmNlLkVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV4dFRyYW5zaXRpb24gPSBzcmMubmV4dCgpOworICAgICAgICAgICAgICAgIHJldHVybiArK2N1cnJlbnREZXB0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudERlcHRoID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBhZHZhbmNlTXVsdGlwbGUoVHJhbnNpdGlvbnNSZWNlaXZlciByZWNlaXZlcikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG5leHRUcmFuc2l0aW9uID09IEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudERlcHRoID0gLTE7CisgICAgICAgICAgICBpbnQgY3VycmVudCA9IG5leHRUcmFuc2l0aW9uOworICAgICAgICAgICAgaW50IGRlcHRoID0gY3VycmVudERlcHRoOworICAgICAgICAgICAgaW50IG5leHQgPSBzcmMubmV4dCgpOworICAgICAgICAgICAgd2hpbGUgKG5leHQgIT0gQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChyZWNlaXZlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZWNlaXZlci5hZGRQYXRoQnl0ZShjdXJyZW50KTsKKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gbmV4dDsKKyAgICAgICAgICAgICAgICBuZXh0ID0gc3JjLm5leHQoKTsKKyAgICAgICAgICAgICAgICArK2RlcHRoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VycmVudFRyYW5zaXRpb24gPSBjdXJyZW50OworICAgICAgICAgICAgbmV4dFRyYW5zaXRpb24gPSBuZXh0OworICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREZXB0aCA9ICsrZGVwdGg7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBza2lwQ2hpbGRyZW4oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY3VycmVudERlcHRoID0gLTE7ICAvLyBubyBhbHRlcm5hdGl2ZXMKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGRlcHRoKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREZXB0aDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVCBjb250ZW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5leHRUcmFuc2l0aW9uID09IEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSA/IHZhbHVlIDogbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGluY29taW5nVHJhbnNpdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50VHJhbnNpdGlvbjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1NsaWNlZFRyaWUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1NsaWNlZFRyaWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWFlM2RmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvU2xpY2VkVHJpZS5qYXZhCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgc2xpY2VkIHZpZXcgb2YgYSB0cmllLCBpLmUuIHRoZSBjb250ZW50IHdpdGhpbiB0aGUgZ2l2ZW4gcGFpciBvZiBib3VuZHMuCisgKgorICogQXBwbGllZCBieSBhZHZhbmNpbmcgdGhyZWUgdHJpZXMgaW4gcGFyYWxsZWw6IHRoZSBsZWZ0IGJvdW5kLCB0aGUgc291cmNlIGFuZCB0aGUgcmlnaHQgYm91bmQuIFdoaWxlIHRoZSBzb3VyY2UKKyAqIGJvdW5kIGlzIHNtYWxsZXN0LCB3ZSBkb24ndCBpc3N1ZSBhbnkgY29udGVudCBhbmQgc2tpcCBvdmVyIGFueSBjaGlsZHJlbi4gQXMgc29vbiBhcyB0aGUgbGVmdCBib3VuZCBiZWNvbWVzIHN0cmljdGx5CisgKiBzbWFsbGVyLCB3ZSBzdG9wIHByb2Nlc3NpbmcgaXQgKGFzIGl0J3MgYSBzaW5nbGV0b24gdHJpZSBpdCB3aWxsIHJlbWFpbiBzbWFsbGVyIHVudGlsIGl0J3MgZXhoYXVzdGVkKSBhbmQgc3RhcnQKKyAqIGlzc3VpbmcgdGhlIG5vZGVzIGFuZCBjb250ZW50IGZyb20gdGhlIHNvdXJjZS4gQXMgc29vbiBhcyB0aGUgcmlnaHQgYm91bmQgYmVjb21lcyBzdHJpY3RseSBzbWFsbGVyLCB3ZSBmaW5pc2ggdGhlCisgKiB3YWxrLgorICoKKyAqIFdlIGRvbid0IGV4cGxpY2l0bHkgY29uc3RydWN0IHRyaWVzIGZvciB0aGUgdHdvIGJvdW5kczsgdHJhY2tpbmcgdGhlIGN1cnJlbnQgZGVwdGggKD0gcHJlZml4IGxlbmd0aCkgYW5kIHRyYW5zaXRpb24KKyAqIGFzIGNoYXJhY3RlcnMgYXJlIHJlcXVlc3RlZCBmcm9tIHRoZSBrZXkgaXMgc3VmZmljaWVudCBhcyBpdCBpcyBhIHRyaWUgd2l0aCBqdXN0IGEgc2luZ2xlIGRlc2NlbnQgcGF0aC4gQmVjYXVzZSB3ZQorICogbmVlZCB0aGUgbmV4dCBjaGFyYWN0ZXIgdG8gdGVsbCBpZiBpdCdzIGJlZW4gZXhoYXVzdGVkLCB3ZSBrZWVwIHRoZXNlIG9uZSBwb3NpdGlvbiBhaGVhZC4gVGhlIHNvdXJjZSBpcyBhbHdheXMKKyAqIGFkdmFuY2VkLCB0aHVzIHRoaXMgZ2l2ZXMgdXMgdGhlIHRoaW5nIHRvIGNvbXBhcmUgaXQgYWdhaW5zdCBhZnRlciB0aGUgYWR2YW5jZS4KKyAqCisgKiBXZSBhbHNvIHRyYWNrIHRoZSBjdXJyZW50IHN0YXRlIHRvIG1ha2Ugc29tZSBkZWNpc2lvbnMgYSBsaXR0bGUgc2ltcGxlci4KKyAqCisgKiBTZWUgVHJpZS5tZCBmb3IgZnVydGhlciBkZXRhaWxzLgorICovCitwdWJsaWMgY2xhc3MgU2xpY2VkVHJpZTxUPiBleHRlbmRzIFRyaWU8VD4KK3sKKyAgICBwcml2YXRlIGZpbmFsIFRyaWU8VD4gc291cmNlOworCisgICAgLyoqIExlZnQtc2lkZSBib3VuZGFyeS4gVGhlIGNoYXJhY3RlcnMgb2YgdGhpcyBhcmUgcmVxdWVzdGVkIGFzIHdlIGRlc2NlbmQgYWxvbmcgdGhlIGxlZnQtc2lkZSBib3VuZGFyeS4gKi8KKyAgICBwcml2YXRlIGZpbmFsIEJ5dGVDb21wYXJhYmxlIGxlZnQ7CisKKyAgICAvKiogUmlnaHQtc2lkZSBib3VuZGFyeS4gVGhlIGNoYXJhY3RlcnMgb2YgdGhpcyBhcmUgcmVxdWVzdGVkIGFzIHdlIGRlc2NlbmQgYWxvbmcgdGhlIHJpZ2h0LXNpZGUgYm91bmRhcnkuICovCisgICAgcHJpdmF0ZSBmaW5hbCBCeXRlQ29tcGFyYWJsZSByaWdodDsKKworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpbmNsdWRlTGVmdDsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaW5jbHVkZVJpZ2h0OworCisgICAgcHVibGljIFNsaWNlZFRyaWUoVHJpZTxUPiBzb3VyY2UsIEJ5dGVDb21wYXJhYmxlIGxlZnQsIGJvb2xlYW4gaW5jbHVkZUxlZnQsIEJ5dGVDb21wYXJhYmxlIHJpZ2h0LCBib29sZWFuIGluY2x1ZGVSaWdodCkKKyAgICB7CisgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOworICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0OworICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7CisgICAgICAgIHRoaXMuaW5jbHVkZUxlZnQgPSBpbmNsdWRlTGVmdDsKKyAgICAgICAgdGhpcy5pbmNsdWRlUmlnaHQgPSBpbmNsdWRlUmlnaHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEN1cnNvcjxUPiBjdXJzb3IoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTbGljZWRDdXJzb3I8Pih0aGlzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGVudW0gU3RhdGUKKyAgICB7CisgICAgICAgIC8qKiBUaGUgY3Vyc29yIGlzIHN0aWxsIHBvc2l0aW9uZWQgb24gc29tZSBwcmVmaXggb2YgdGhlIGxlZnQgYm91bmQuIENvbnRlbnQgc2hvdWxkIG5vdCBiZSBwcm9kdWNlZC4gKi8KKyAgICAgICAgQkVGT1JFX0xFRlQsCisgICAgICAgIC8qKiBUaGUgY3Vyc29yIGlzIHBvc2l0aW9uZWQgaW5zaWRlIHRoZSByYW5nZSwgaS5lLiBiZXlvbmQgdGhlIGxlZnQgYm91bmQsIHBvc3NpYmx5IG9uIGEgcHJlZml4IG9mIHRoZSByaWdodC4gKi8KKyAgICAgICAgSU5TSURFLAorICAgICAgICAvKiogVGhlIGN1cnNvciBpcyBwb3NpdGlvbmVkIGJleW9uZCB0aGUgcmlnaHQgYm91bmQuIEV4aGF1c3Rpb24gKGRlcHRoIC0xKSBoYXMgYmVlbiByZXBvcnRlZC4gKi8KKyAgICAgICAgQUZURVJfUklHSFQKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTbGljZWRDdXJzb3I8VD4gaW1wbGVtZW50cyBDdXJzb3I8VD4KKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnl0ZVNvdXJjZSBsZWZ0OworICAgICAgICBwcml2YXRlIGZpbmFsIEJ5dGVTb3VyY2UgcmlnaHQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpbmNsdWRlTGVmdDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGV4Y2x1ZGVSaWdodDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDdXJzb3I8VD4gc291cmNlOworCisgICAgICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7CisgICAgICAgIHByaXZhdGUgaW50IGxlZnROZXh0OworICAgICAgICBwcml2YXRlIGludCBsZWZ0TmV4dERlcHRoOworICAgICAgICBwcml2YXRlIGludCByaWdodE5leHQ7CisgICAgICAgIHByaXZhdGUgaW50IHJpZ2h0TmV4dERlcHRoOworCisgICAgICAgIHB1YmxpYyBTbGljZWRDdXJzb3IoU2xpY2VkVHJpZTxUPiBzbGljZWRUcmllKQorICAgICAgICB7CisgICAgICAgICAgICBzb3VyY2UgPSBzbGljZWRUcmllLnNvdXJjZS5jdXJzb3IoKTsKKyAgICAgICAgICAgIGlmIChzbGljZWRUcmllLmxlZnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZWZ0ID0gc2xpY2VkVHJpZS5sZWZ0LmFzQ29tcGFyYWJsZUJ5dGVzKEJZVEVfQ09NUEFSQUJMRV9WRVJTSU9OKTsKKyAgICAgICAgICAgICAgICBpbmNsdWRlTGVmdCA9IHNsaWNlZFRyaWUuaW5jbHVkZUxlZnQ7CisgICAgICAgICAgICAgICAgbGVmdE5leHQgPSBsZWZ0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICBsZWZ0TmV4dERlcHRoID0gMTsKKyAgICAgICAgICAgICAgICBpZiAobGVmdE5leHQgPT0gQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNICYmIGluY2x1ZGVMZWZ0KQorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFN0YXRlLklOU0lERTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuQkVGT1JFX0xFRlQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGVmdCA9IG51bGw7CisgICAgICAgICAgICAgICAgaW5jbHVkZUxlZnQgPSB0cnVlOworICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuSU5TSURFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2xpY2VkVHJpZS5yaWdodCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJpZ2h0ID0gc2xpY2VkVHJpZS5yaWdodC5hc0NvbXBhcmFibGVCeXRlcyhCWVRFX0NPTVBBUkFCTEVfVkVSU0lPTik7CisgICAgICAgICAgICAgICAgZXhjbHVkZVJpZ2h0ID0gIXNsaWNlZFRyaWUuaW5jbHVkZVJpZ2h0OworICAgICAgICAgICAgICAgIHJpZ2h0TmV4dCA9IHJpZ2h0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICByaWdodE5leHREZXB0aCA9IDE7CisgICAgICAgICAgICAgICAgaWYgKHJpZ2h0TmV4dCA9PSBCeXRlU291cmNlLkVORF9PRl9TVFJFQU0gJiYgZXhjbHVkZVJpZ2h0KQorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFN0YXRlLkJFRk9SRV9MRUZUOyAgLy8gVGhpcyBpcyBhIGhhY2ssIHdlIGFyZSBhZnRlciB0aGUgcmlnaHQgYm91bmQgYnV0IHdlIGRvbid0IHdhbnQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcG9ydCBkZXB0aCAtMSB5ZXQuIFNvIGp1c3QgbWFrZSBzdXJlIHJvb3QncyBjb250ZW50IGlzIG5vdCByZXBvcnRlZC4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByaWdodCA9IG51bGw7CisgICAgICAgICAgICAgICAgZXhjbHVkZVJpZ2h0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByaWdodE5leHREZXB0aCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBhZHZhbmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IChzdGF0ZSAhPSBTdGF0ZS5BRlRFUl9SSUdIVCk7CisKKyAgICAgICAgICAgIGludCBuZXdEZXB0aCA9IHNvdXJjZS5hZHZhbmNlKCk7CisgICAgICAgICAgICBpbnQgdHJhbnNpdGlvbiA9IHNvdXJjZS5pbmNvbWluZ1RyYW5zaXRpb24oKTsKKworICAgICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkJFRk9SRV9MRUZUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFNraXAgYW55IHRyYW5zaXRpb25zIGJlZm9yZSB0aGUgbGVmdCBib3VuZAorICAgICAgICAgICAgICAgIHdoaWxlIChuZXdEZXB0aCA9PSBsZWZ0TmV4dERlcHRoICYmIHRyYW5zaXRpb24gPCBsZWZ0TmV4dCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5ld0RlcHRoID0gc291cmNlLnNraXBDaGlsZHJlbigpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uID0gc291cmNlLmluY29taW5nVHJhbnNpdGlvbigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGFyZSBzdGlsbCBmb2xsb3dpbmcgdGhlIGxlZnQgYm91bmQKKyAgICAgICAgICAgICAgICBpZiAobmV3RGVwdGggPT0gbGVmdE5leHREZXB0aCAmJiB0cmFuc2l0aW9uID09IGxlZnROZXh0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGxlZnROZXh0ICE9IEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICAgICAgbGVmdE5leHQgPSBsZWZ0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgKytsZWZ0TmV4dERlcHRoOworICAgICAgICAgICAgICAgICAgICBpZiAobGVmdE5leHQgPT0gQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNICYmIGluY2x1ZGVMZWZ0KQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5JTlNJREU7IC8vIHJlcG9ydCB0aGUgY29udGVudCBvbiB0aGUgbGVmdCBib3VuZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIC8vIG90aGVyd2lzZSB3ZSBhcmUgYmV5b25kIGl0CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuSU5TSURFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gY2hlY2tSaWdodEJvdW5kKG5ld0RlcHRoLCB0cmFuc2l0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IG1hcmtEb25lKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5BRlRFUl9SSUdIVDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IGNoZWNrUmlnaHRCb3VuZChpbnQgbmV3RGVwdGgsIGludCB0cmFuc2l0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDdXJzb3IgcG9zaXRpb25zIGNvbXBhcmUgYnkgZGVwdGggZGVzY2VuZGluZyBhbmQgdHJhbnNpdGlvbiBhc2NlbmRpbmcuCisgICAgICAgICAgICBpZiAobmV3RGVwdGggPiByaWdodE5leHREZXB0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3RGVwdGg7CisgICAgICAgICAgICBpZiAobmV3RGVwdGggPCByaWdodE5leHREZXB0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFya0RvbmUoKTsKKyAgICAgICAgICAgIC8vIG5ld0RlcHRoID09IHJpZ2h0RGVwdGgKKyAgICAgICAgICAgIGlmICh0cmFuc2l0aW9uIDwgcmlnaHROZXh0KQorICAgICAgICAgICAgICAgIHJldHVybiBuZXdEZXB0aDsKKyAgICAgICAgICAgIGlmICh0cmFuc2l0aW9uID4gcmlnaHROZXh0KQorICAgICAgICAgICAgICAgIHJldHVybiBtYXJrRG9uZSgpOworCisgICAgICAgICAgICAvLyBGb2xsb3dpbmcgcmlnaHQgYm91bmQKKyAgICAgICAgICAgIHJpZ2h0TmV4dCA9IHJpZ2h0Lm5leHQoKTsKKyAgICAgICAgICAgICsrcmlnaHROZXh0RGVwdGg7CisgICAgICAgICAgICBpZiAocmlnaHROZXh0ID09IEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSAmJiBleGNsdWRlUmlnaHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIG1hcmtEb25lKCk7ICAvLyBkbyBub3QgcmVwb3J0IGFueSBjb250ZW50IG9uIHRoZSByaWdodCBib3VuZAorICAgICAgICAgICAgcmV0dXJuIG5ld0RlcHRoOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgYWR2YW5jZU11bHRpcGxlKFRyYW5zaXRpb25zUmVjZWl2ZXIgcmVjZWl2ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCRUZPUkVfTEVGVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkdmFuY2UoKTsgICAvLyBkZXNjZW5kIG9ubHkgb25lIGxldmVsIHRvIGJlIGFibGUgdG8gY29tcGFyZSBjdXJzb3JzIGNvcnJlY3RseQorICAgICAgICAgICAgICAgIGNhc2UgSU5TSURFOgorICAgICAgICAgICAgICAgICAgICBpbnQgZGVwdGggPSBzb3VyY2UuZGVwdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlcHRoID09IHJpZ2h0TmV4dERlcHRoIC0gMSkgIC8vIHRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSByaWdodCBpcyBhbHJlYWR5IGFkdmFuY2VkOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkdmFuY2UoKTsgICAvLyB3ZSBuZWVkIHRvIGNoZWNrIG5leHQgYnl0ZSBhZ2FpbnN0IHJpZ2h0IGJvdW5kYXJ5IGluIHRoaXMgY2FzZQorICAgICAgICAgICAgICAgICAgICBpbnQgbmV3RGVwdGggPSBzb3VyY2UuYWR2YW5jZU11bHRpcGxlKHJlY2VpdmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0RlcHRoID4gZGVwdGgpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3RGVwdGg7ICAgIC8vIHN1Y2Nlc3NmdWxseSBhZHZhbmNlZAorICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhc2NlbmRlZCwgY2hlY2sgaWYgd2UgYXJlIHN0aWxsIHdpdGhpbiBib3VuZGFyaWVzCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGVja1JpZ2h0Qm91bmQobmV3RGVwdGgsIHNvdXJjZS5pbmNvbWluZ1RyYW5zaXRpb24oKSk7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBza2lwQ2hpbGRyZW4oKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgKHN0YXRlICE9IFN0YXRlLkFGVEVSX1JJR0hUKTsKKworICAgICAgICAgICAgLy8gV2UgYXJlIGVpdGhlciBpbnNpZGUgb3IgZm9sbG93aW5nIHRoZSBsZWZ0IGJvdW5kLiBJbiB0aGUgbGF0dGVyIGNhc2UgYXNjZW5kIHRha2VzIHVzIGJleW9uZCBpdC4KKyAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuSU5TSURFOworICAgICAgICAgICAgcmV0dXJuIGNoZWNrUmlnaHRCb3VuZChzb3VyY2Uuc2tpcENoaWxkcmVuKCksIHNvdXJjZS5pbmNvbWluZ1RyYW5zaXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBkZXB0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0ZSA9PSBTdGF0ZS5BRlRFUl9SSUdIVCA/IC0xIDogc291cmNlLmRlcHRoKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBpbmNvbWluZ1RyYW5zaXRpb24oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc291cmNlLmluY29taW5nVHJhbnNpdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBUIGNvbnRlbnQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RhdGUgPT0gU3RhdGUuSU5TSURFID8gc291cmNlLmNvbnRlbnQoKSA6IG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEzOWUwOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWUuamF2YQpAQCAtMCwwICsxLDYyMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlDb25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworCitpbXBvcnQgb3JnLmFncm9uYS5EaXJlY3RCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgdHJpZXMuCisgKgorICogTm9ybWFsIHVzZXJzIG9mIHRyaWVzIHdpbGwgb25seSB1c2UgdGhlIHB1YmxpYyBtZXRob2RzLCB3aGljaCBwcm92aWRlIHZhcmlvdXMgdHJhbnNmb3JtYXRpb25zIG9mIHRoZSB0cmllLCBjb252ZXJzaW9uCisgKiBvZiBpdHMgY29udGVudCB0byBvdGhlciBmb3JtYXRzIChlLmcuIGl0ZXJhYmxlIG9mIHZhbHVlcyksIGFuZCBzZXZlcmFsIGZvcm1zIG9mIHByb2Nlc3NpbmcuCisgKgorICogRm9yIGFueSB1bmltcGxlbWVudGVkIGRhdGEgZXh0cmFjdGlvbiBvcGVyYXRpb25zIG9uZSBjYW4gYnVpbGQgb24gdGhlIHtAbGluayBUcmllRW50cmllc1dhbGtlcn0gKGZvci1lYWNoIHByb2Nlc3NpbmcpCisgKiBhbmQge0BsaW5rIFRyaWVFbnRyaWVzSXRlcmF0b3J9ICh0byBpdGVyYXRvcikgYmFzZSBjbGFzc2VzLCB3aGljaCBwcm92aWRlIHRoZSBuZWNlc3NhcnkgbWVjaGFuaXNtcyB0byBoYW5kbGUgd2Fsa2luZworICogdGhlIHRyaWUuCisgKgorICogVGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRyaWVzIHVzaW5nIHRoaXMgaW50ZXJmYWNlIGlzIGRlZmluZWQgaW4gdGhlIHtAbGluayBDdXJzb3J9IGludGVyZmFjZS4KKyAqCisgKiBDdXJzb3JzIGFyZSBhIG1ldGhvZCBvZiBwcmVzZW50aW5nIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgb2YgYSB0cmllIHdpdGhvdXQgcmVwcmVzZW50aW5nIG5vZGVzIGFzIG9iamVjdHMsIHdoaWNoIGlzCisgKiBzdGlsbCB1c2VmdWwgZm9yIHBlcmZvcm1pbmcgdGhlIGJhc2ljIG9wZXJhdGlvbnMgb24gdHJpZXMgKGl0ZXJhdGlvbiwgc2xpY2luZy9pbnRlcnNlY3Rpb24gYW5kIG1lcmdpbmcpLiBBIGN1cnNvcgorICogd2lsbCBsaXN0IHRoZSBub2RlcyBvZiBhIHRyaWUgaW4gb3JkZXIsIHRvZ2V0aGVyIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhdGggdGhhdCB3YXMgdGFrZW4gdG8gcmVhY2ggdGhlbS4KKyAqCisgKiBUbyBiZWdpbiB0cmF2ZXJzYWwgb3ZlciBhIHRyaWUsIG9uZSBtdXN0IHJldHJpZXZlIGEgY3Vyc29yIGJ5IGNhbGxpbmcge0BsaW5rICNjdXJzb3IoKX0uIEJlY2F1c2UgY3Vyc29ycyBhcmUKKyAqIHN0YXRlZnVsLCB0aGUgdHJhdmVyc2FsIG11c3QgYWx3YXlzIHByb2NlZWQgZnJvbSBvbmUgdGhyZWFkLiBTaG91bGQgY29uY3VycmVudCByZWFkcyBiZSByZXF1aXJlZCwgc2VwYXJhdGUgY2FsbHMgdG8KKyAqIHtAbGluayAjY3Vyc29yKCl9IG11c3QgYmUgbWFkZS4gQW55IG1vZGlmaWNhdGlvbiB0aGF0IGhhcyBjb21wbGV0ZWQgYmVmb3JlIHRoZSBjb25zdHJ1Y3Rpb24gb2YgYSBjdXJzb3IgbXVzdCBiZQorICogdmlzaWJsZSwgYnV0IGFueSBsYXRlciBjb25jdXJyZW50IG1vZGlmaWNhdGlvbnMgbWF5IGJlIHByZXNlbnRlZCBmdWxseSwgcGFydGlhbGx5IG9yIG5vdCBhdCBhbGw7IHRoaXMgYWxzbyBtZWFucyB0aGF0CisgKiBpZiBtdWx0aXBsZSBhcmUgbWFkZSwgdGhlIGN1cnNvciBtYXkgc2VlIGFueSBwYXJ0IG9mIGFueSBzdWJzZXQgb2YgdGhlbS4KKyAqCisgKiBOb3RlOiBUaGlzIG1vZGVsIG9ubHkgc3VwcG9ydHMgZGVwdGgtZmlyc3QgdHJhdmVyc2Fscy4gV2UgZG8gbm90IGN1cnJlbnRseSBoYXZlIGEgbmVlZCBmb3IgYnJlYWR0aC1maXJzdCB3YWxrcy4KKyAqCisgKiBTZWUgVHJpZS5tZCBmb3IgZnVydGhlciBkZXNjcmlwdGlvbiBvZiB0aGUgdHJpZSByZXByZXNlbnRhdGlvbiBtb2RlbC4KKyAqCisgKiBAcGFyYW0gPFQ+IFRoZSBjb250ZW50IHR5cGUgb2YgdGhlIHRyaWUuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmllPFQ+Cit7CisgICAgLyoqCisgICAgICogQSB0cmllIGN1cnNvci4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0cmllLCB3aGljaCBlbmFibGVzIGVmZmljaWVudCB3YWxrcyBhbmQgYmFzaWMgb3BlcmF0aW9ucyAobWVyZ2UsCisgICAgICogc2xpY2UpIG9uIHRyaWVzLgorICAgICAqCisgICAgICogVGhlIGN1cnNvciByZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiBhIHdhbGsgb3ZlciB0aGUgbm9kZXMgb2YgdHJpZS4gSXQgcHJvdmlkZXMgdGhyZWUgbWFpbiBmZWF0dXJlczoKKyAgICAgKiAtIHRoZSBjdXJyZW50ICJkZXB0aCIgb3IgZGVzY2VuZC1kZXB0aCBpbiB0aGUgdHJpZTsKKyAgICAgKiAtIHRoZSAiaW5jb21pbmdUcmFuc2l0aW9uIiwgaS5lLiB0aGUgYnl0ZSB0aGF0IHdhcyB1c2VkIHRvIHJlYWNoIHRoZSBjdXJyZW50IHBvaW50OworICAgICAqIC0gdGhlICJjb250ZW50IiBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgbm9kZSwKKyAgICAgKiBhbmQgcHJvdmlkZXMgbWV0aG9kcyBmb3IgYWR2YW5jaW5nIHRvIHRoZSBuZXh0IHBvc2l0aW9uLiAgVGhpcyBpcyBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZXh0cmFjdCBhbGwgcGF0aHMsIGFuZAorICAgICAqIGFsc28gdG8gZWFzaWx5IGNvbXBhcmUgY3Vyc29ycyBvdmVyIGRpZmZlcmVudCB0cmllcyB0aGF0IGFyZSBhZHZhbmNlZCB0b2dldGhlci4gQWR2YW5jaW5nIGlzIGFsd2F5cyBkb25lIGluCisgICAgICogb3JkZXI7IGlmIG9uZSBpbWFnaW5lcyB0aGUgc2V0IG9mIG5vZGVzIGluIHRoZSB0cmllIHdpdGggdGhlaXIgYXNzb2NpYXRlZCBwYXRocywgYSBjdXJzb3IgbWF5IG9ubHkgYWR2YW5jZSBmcm9tIGEKKyAgICAgKiBub2RlIHdpdGggYSBsZXhpY29ncmFwaGljYWxseSBzbWFsbGVyIHBhdGggdG8gb25lIHdpdGggYmlnZ2VyLiBUaGUgImFkdmFuY2UiIG9wZXJhdGlvbiBtb3ZlcyB0byB0aGUgaW1tZWRpYXRlCisgICAgICogbmV4dCwgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBza2lwIG92ZXIgc29tZSBpdGVtcyBlLmcuIGFsbCBjaGlsZHJlbiBvZiB0aGUgY3VycmVudCBub2RlICgic2tpcENoaWxkcmVuIikuCisgICAgICoKKyAgICAgKiBNb3ZpbmcgdG8gdGhlIGltbWVkaWF0ZSBuZXh0IHBvc2l0aW9uIGluIHRoZSBsZXhpY29ncmFwaGljIG9yZGVyIGlzIGFjY29tcGxpc2hlZCBieToKKyAgICAgKiAtIGlmIHRoZSBjdXJyZW50IG5vZGUgaGFzIGNoaWxkcmVuLCBtb3ZpbmcgdG8gaXRzIGZpcnN0IGNoaWxkOworICAgICAqIC0gb3RoZXJ3aXNlLCBhc2NlbmQgdGhlIHBhcmVudCBjaGFpbiBhbmQgcmV0dXJuIHRoZSBuZXh0IGNoaWxkIG9mIHRoZSBjbG9zZXN0IHBhcmVudCB0aGF0IHN0aWxsIGhhcyBhbnkuCisgICAgICogQXMgbG9uZyBhcyB0aGUgdHJpZSBpcyBub3QgZXhoYXVzdGVkLCBhZHZhbmNpbmcgYWx3YXlzIHRha2VzIG9uZSBzdGVwIGRvd24sIGZyb20gdGhlIGN1cnJlbnQgbm9kZSwgb3IgZnJvbSBhIG5vZGUKKyAgICAgKiBvbiB0aGUgcGFyZW50IGNoYWluLiBCeSBjb21wYXJpbmcgdGhlIG5ldyBkZXB0aCAod2hpY2ggImFkdmFuY2UiIGFsc28gcmV0dXJucykgd2l0aCB0aGUgb25lIGJlZm9yZSB0aGUgYWR2YW5jZSwKKyAgICAgKiBvbmUgY2FuIHRlbGwgaWYgdGhlIGZvcm1lciB3YXMgdGhlIGNhc2UgKGlmIG5ld0RlcHRoID09IG9sZERlcHRoICsgMSkgYW5kIGhvdyBtYW55IHN0ZXBzIHVwIHdlIGhhZCB0byB0YWtlCisgICAgICogKG9sZERlcHRoICsgMSAtIG5ld0RlcHRoKS4gV2hlbiBmb2xsb3dpbmcgYSBwYXRoIGRvd24sIHRoZSBjdXJzb3Igd2lsbCBzdG9wIG9uIGFsbCBwcmVmaXhlcy4KKyAgICAgKgorICAgICAqIFdoZW4gaXQgaXMgY3JlYXRlZCB0aGUgY3Vyc29yIGlzIHBsYWNlZCBvbiB0aGUgcm9vdCBub2RlIHdpdGggZGVwdGgoKSA9IDAsIGluY29taW5nVHJhbnNpdGlvbigpID0gLTEuIFNpbmNlCisgICAgICogdHJpZXMgY2FuIGhhdmUgbWFwcGluZ3MgZm9yIGVtcHR5LCBjb250ZW50KCkgY2FuIHBvc3NpYmx5IGJlIG5vbi1udWxsLiBJdCBpcyBub3QgYWxsb3dlZCBmb3IgYSBjdXJzb3IgdG8gc3RhcnQKKyAgICAgKiBpbiBleGhhdXN0ZWQgc3RhdGUgKGkuZS4gd2l0aCBkZXB0aCgpID0gLTEpLgorICAgICAqCisgICAgICogRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgdHJpZToKKyAgICAgKiAgdAorICAgICAqICAgcgorICAgICAqICAgIGUKKyAgICAgKiAgICAgZSAqCisgICAgICogICAgaQorICAgICAqICAgICBlICoKKyAgICAgKiAgICAgcCAqCisgICAgICogIHcKKyAgICAgKiAgIGkKKyAgICAgKiAgICBuICAqCisgICAgICogaGFzIG5vZGVzIHJlYWNoYWJsZSB3aXRoIHRoZSBwYXRocworICAgICAqICAiIiwgdCwgdHIsIHRyZSwgdHJlZSosIHRyaSwgdHJpZSosIHRyaXAqLCB3LCB3aSwgd2luKgorICAgICAqIGFuZCB0aGUgY3Vyc29yIHdpbGwgbGlzdCB0aGVtIHdpdGggdGhlIGZvbGxvd2luZyAoZGVwdGgsIGluY29taW5nVHJhbnNpdGlvbikgcGFpcnM6CisgICAgICogICgwLCAtMSksICgxLCB0KSwgKDIsIHIpLCAoMywgZSksICg0LCBlKSosICgzLCBpKSwgKDQsIGUpKiwgKDQsIHApKiwgKDEsIHcpLCAoMiwgaSksICgzLCBuKSoKKyAgICAgKgorICAgICAqIEJlY2F1c2Ugd2UgZXhoYXVzdCB0cmFuc2l0aW9ucyBvbiBiaWdnZXIgZGVwdGhzIGJlZm9yZSB3ZSBnbyB0aGUgbmV4dCB0cmFuc2l0aW9uIG9uIHRoZSBzbWFsbGVyIG9uZXMsIHdoZW4KKyAgICAgKiBjdXJzb3JzIGFyZSBhZHZhbmNlZCB0b2dldGhlciB0aGVpciBwb3NpdGlvbnMgY2FuIGJlIGVhc2lseSBjb21wYXJlZCB1c2luZyBvbmx5IHRoZSBkZXB0aCBhbmQgaW5jb21pbmdUcmFuc2l0aW9uOgorICAgICAqIC0gb25lIHRoYXQgaXMgaGlnaGVyIGluIGRlcHRoIGlzIGJlZm9yZSBvbmUgdGhhdCBpcyBsb3dlcjsKKyAgICAgKiAtIGZvciBlcXVhbCBkZXB0aHMsIHRoZSBvbmUgd2l0aCBzbWFsbGVyIGluY29taW5nVHJhbnNpdGlvbiBpcyBmaXJzdC4KKyAgICAgKgorICAgICAqIElmIHdlIGNvbnNpZGVyIHdhbGtpbmcgdGhlIHRyaWUgYWJvdmUgaW4gcGFyYWxsZWwgd2l0aCB0aGlzOgorICAgICAqICB0CisgICAgICogICByCisgICAgICogICAgaQorICAgICAqICAgICBjCisgICAgICogICAgICBrICoKKyAgICAgKiAgdQorICAgICAqICAgcCAqCisgICAgICogdGhlIGNvbWJpbmVkIGl0ZXJhdGlvbiB3aWxsIHByb2NlZWQgYXMgZm9sbG93czoKKyAgICAgKiAgKDAsIC0xKSsgICAgKDAsIC0xKSsgICAgICAgICAgICAgICBjdXJzb3JzIGVxdWFsLCBhZHZhbmNlIGJvdGgKKyAgICAgKiAgKDEsIHQpKyAgICAgKDEsIHQpKyAgICAgICAgdCAgICAgICBjdXJzb3JzIGVxdWFsLCBhZHZhbmNlIGJvdGgKKyAgICAgKiAgKDIsIHIpKyAgICAgKDIsIHIpKyAgICAgICAgdHIgICAgICBjdXJzb3JzIGVxdWFsLCBhZHZhbmNlIGJvdGgKKyAgICAgKiAgKDMsIGUpKyAgPCAgKDMsIGkpICAgICAgICAgdHJlICAgICBjdXJzb3JzIG5vdCBlcXVhbCwgYWR2YW5jZSBzbWFsbGVyICgzID0gMywgZSA8IGkpCisgICAgICogICg0LCBlKSsgIDwgICgzLCBpKSAgICAgICAgIHRyZWUqICAgY3Vyc29ycyBub3QgZXF1YWwsIGFkdmFuY2Ugc21hbGxlciAoNCA+IDMpCisgICAgICogICgzLCBpKSsgICAgICgzLCBpKSsgICAgICAgIHRyaSAgICAgY3Vyc29ycyBlcXVhbCwgYWR2YW5jZSBib3RoCisgICAgICogICg0LCBlKSAgID4gICg0LCBjKSsgICAgICAgIHRyaWMgICAgY3Vyc29ycyBub3QgZXF1YWwsIGFkdmFuY2Ugc21hbGxlciAoNCA9IDQsIGUgPiBjKQorICAgICAqICAoNCwgZSkgICA+ICAoNSwgaykrICAgICAgICB0cmljayogIGN1cnNvcnMgbm90IGVxdWFsLCBhZHZhbmNlIHNtYWxsZXIgKDQgPCA1KQorICAgICAqICAoNCwgZSkrICA8ICAoMSwgdSkgICAgICAgICB0cmllKiAgIGN1cnNvcnMgbm90IGVxdWFsLCBhZHZhbmNlIHNtYWxsZXIgKDQgPiAxKQorICAgICAqICAoNCwgcCkrICA8ICAoMSwgdSkgICAgICAgICB0cmlwKiAgIGN1cnNvcnMgbm90IGVxdWFsLCBhZHZhbmNlIHNtYWxsZXIgKDQgPiAxKQorICAgICAqICAoMSwgdykgICA+ICAoMSwgdSkrICAgICAgICB1ICAgICAgIGN1cnNvcnMgbm90IGVxdWFsLCBhZHZhbmNlIHNtYWxsZXIgKDEgPSAxLCB3ID4gdSkKKyAgICAgKiAgKDEsIHcpICAgPiAgKDIsIHApKyAgICAgICAgdXAqICAgICBjdXJzb3JzIG5vdCBlcXVhbCwgYWR2YW5jZSBzbWFsbGVyICgxIDwgMikKKyAgICAgKiAgKDEsIHcpKyAgPCAgKC0xLCAtMSkgICAgICAgdyAgICAgICBjdXJzb3JzIG5vdCBlcXVhbCwgYWR2YW5jZSBzbWFsbGVyICgxID4gLTEpCisgICAgICogICgyLCBpKSsgIDwgICgtMSwgLTEpICAgICAgIHdpICAgICAgY3Vyc29ycyBub3QgZXF1YWwsIGFkdmFuY2Ugc21hbGxlciAoMiA+IC0xKQorICAgICAqICAoMywgbikrICA8ICAoLTEsIC0xKSAgICAgICB3aW4qICAgIGN1cnNvcnMgbm90IGVxdWFsLCBhZHZhbmNlIHNtYWxsZXIgKDMgPiAtMSkKKyAgICAgKiAgKC0xLCAtMSkgICAgKC0xLCAtMSkgICAgICAgICAgICAgICBib3RoIGV4aGFzdGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIGludGVyZmFjZSBDdXJzb3I8VD4KKyAgICB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgZGVzY2VuZC1kZXB0aDsgMCwgaWYgdGhlIGN1cnNvciBoYXMganVzdCBiZWVuIGNyZWF0ZWQgYW5kIGlzIHBvc2l0aW9uZWQgb24gdGhlIHJvb3QsCisgICAgICAgICAqICAgICAgICAgYW5kIC0xLCBpZiB0aGUgdHJpZSBoYXMgYmVlbiBleGhhdXN0ZWQuCisgICAgICAgICAqLworICAgICAgICBpbnQgZGVwdGgoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgbGFzdCB0cmFuc2l0aW9uIHRha2VuOyBpZiBwb3NpdGlvbmVkIG9uIHRoZSByb290LCByZXR1cm4gLTEKKyAgICAgICAgICovCisgICAgICAgIGludCBpbmNvbWluZ1RyYW5zaXRpb24oKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgY29udGVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgbm9kZS4gVGhpcyBtYXkgYmUgbm9uLW51bGwgZm9yIGFueSBwcmVzZW50ZWQgbm9kZSwgaW5jbHVkaW5nCisgICAgICAgICAqICAgICAgICAgdGhlIHJvb3QuCisgICAgICAgICAqLworICAgICAgICBUIGNvbnRlbnQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWR2YW5jZSBvbmUgcG9zaXRpb24gdG8gdGhlIG5vZGUgd2hvc2UgYXNzb2NpYXRlZCBwYXRoIGlzIG5leHQgbGV4aWNvZ3JhcGhpY2FsbHkuCisgICAgICAgICAqIFRoaXMgY2FuIGJlIGVpdGhlcjoKKyAgICAgICAgICogLSBkZXNjZW5kaW5nIG9uZSBsZXZlbCB0byB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIGN1cnJlbnQgbm9kZSwKKyAgICAgICAgICogLSBhc2NlbmRpbmcgdG8gdGhlIGNsb3Nlc3QgcGFyZW50IHRoYXQgaGFzIHJlbWFpbmluZyBjaGlsZHJlbiwgYW5kIHRoZW4gZGVzY2VuZGluZyBvbmUgbGV2ZWwgdG8gaXRzIG5leHQKKyAgICAgICAgICogICBjaGlsZC4KKyAgICAgICAgICoKKyAgICAgICAgICogSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCB0aGlzIGFmdGVyIHRoZSB0cmllIGhhcyBhbHJlYWR5IGJlZW4gZXhoYXVzdGVkIChpLmUuIHdoZW4gZGVwdGgoKSA9PSAtMSk7CisgICAgICAgICAqIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIHdlIHdvbid0IGFsd2F5cyBjaGVjayB0aGlzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGRlcHRoIChjYW4gYmUgcHJldisxIG9yIDw9cHJldiksIC0xIG1lYW5zIHRoYXQgdGhlIHRyaWUgaXMgZXhoYXVzdGVkCisgICAgICAgICAqLworICAgICAgICBpbnQgYWR2YW5jZSgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZHZhbmNlLCBkZXNjZW5kaW5nIG11bHRpcGxlIGxldmVscyBpZiB0aGUgY3Vyc29yIGNhbiBkbyB0aGlzIGZvciB0aGUgY3VycmVudCBwb3NpdGlvbiB3aXRob3V0IGV4dHJhIHdvcmsKKyAgICAgICAgICogKGUuZy4gd2hlbiBwb3NpdGlvbmVkIG9uIGEgY2hhaW4gbm9kZSBpbiBhIG1lbXRhYmxlIHRyaWUpLiBJZiB0aGUgY3VycmVudCBub2RlIGRvZXMgbm90IGhhdmUgY2hpbGRyZW4gdGhpcworICAgICAgICAgKiBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIGFkdmFuY2UoKSwgb3RoZXJ3aXNlIGl0IG1heSB0YWtlIG11bHRpcGxlIHN0ZXBzIGRvd24gKGJ1dCB3aWxsIG5vdCBuZWNlc3NhcmlseSwgZXZlbgorICAgICAgICAgKiBpZiB0aGV5IGV4aXN0KS4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZSB0aGF0IGlmIGFueSBwb3NpdGlvbnMgYXJlIHNraXBwZWQsIHRoZWlyIGNvbnRlbnQgbXVzdCBiZSBudWxsLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIGlzIGFuIG9wdGlvbmFsIG9wdGltaXphdGlvbjsgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZmFsbHMgYmFjayB0byBjYWxsaW5nIGFkdmFuY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyBhZnRlciB0aGUgdHJpZSBoYXMgYWxyZWFkeSBiZWVuIGV4aGF1c3RlZCAoaS5lLiB3aGVuIGRlcHRoKCkgPT0gLTEpOworICAgICAgICAgKiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyB3ZSB3b24ndCBhbHdheXMgY2hlY2sgdGhpcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJlY2VpdmVyIG9iamVjdCB0aGF0IHdpbGwgcmVjZWl2ZSBhbGwgdHJhbnNpdGlvbnMgdGFrZW4gZXhjZXB0IHRoZSBsYXN0OworICAgICAgICAgKiAgICAgICAgICAgICAgICAgb24gYXNjZW5kLCBvciBpZiBvbmx5IG9uZSBzdGVwIGRvd24gd2FzIHRha2VuLCBpdCB3aWxsIG5vdCByZWNlaXZlIGFueQorICAgICAgICAgKiBAcmV0dXJuIHRoZSBuZXcgZGVwdGgsIC0xIGlmIHRoZSB0cmllIGlzIGV4aGF1c3RlZAorICAgICAgICAgKi8KKyAgICAgICAgZGVmYXVsdCBpbnQgYWR2YW5jZU11bHRpcGxlKFRyYW5zaXRpb25zUmVjZWl2ZXIgcmVjZWl2ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhZHZhbmNlKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWR2YW5jZSBhbGwgdGhlIHdheSB0byB0aGUgbmV4dCBub2RlIHdpdGggbm9uLW51bGwgY29udGVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCB0aGlzIGFmdGVyIHRoZSB0cmllIGhhcyBhbHJlYWR5IGJlZW4gZXhoYXVzdGVkIChpLmUuIHdoZW4gZGVwdGgoKSA9PSAtMSk7CisgICAgICAgICAqIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIHdlIHdvbid0IGFsd2F5cyBjaGVjayB0aGlzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmVjZWl2ZXIgb2JqZWN0IHRoYXQgd2lsbCByZWNlaXZlIGFsbCB0YWtlbiB0cmFuc2l0aW9ucworICAgICAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50LCBudWxsIGlmIHRoZSB0cmllIGlzIGV4aGF1c3RlZAorICAgICAgICAgKi8KKyAgICAgICAgZGVmYXVsdCBUIGFkdmFuY2VUb0NvbnRlbnQoUmVzZXR0aW5nVHJhbnNpdGlvbnNSZWNlaXZlciByZWNlaXZlcikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHByZXZEZXB0aCA9IGRlcHRoKCk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY3VyckRlcHRoID0gYWR2YW5jZU11bHRpcGxlKHJlY2VpdmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VyckRlcHRoIDw9IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIGlmIChyZWNlaXZlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJEZXB0aCA8PSBwcmV2RGVwdGgpCisgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlci5yZXNldFBhdGhMZW5ndGgoY3VyckRlcHRoIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyLmFkZFBhdGhCeXRlKGluY29taW5nVHJhbnNpdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgVCBjb250ZW50ID0gY29udGVudCgpOworICAgICAgICAgICAgICAgIGlmIChjb250ZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50OworICAgICAgICAgICAgICAgIHByZXZEZXB0aCA9IGN1cnJEZXB0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJZ25vcmUgdGhlIGN1cnJlbnQgbm9kZSdzIGNoaWxkcmVuIGFuZCBhZHZhbmNlIHRvIHRoZSBuZXh0IGNoaWxkIG9mIHRoZSBjbG9zZXN0IG5vZGUgb24gdGhlIHBhcmVudCBjaGFpbiB0aGF0CisgICAgICAgICAqIGhhcyBhbnkuCisgICAgICAgICAqCisgICAgICAgICAqIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyBhZnRlciB0aGUgdHJpZSBoYXMgYWxyZWFkeSBiZWVuIGV4aGF1c3RlZCAoaS5lLiB3aGVuIGRlcHRoKCkgPT0gLTEpOworICAgICAgICAgKiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyB3ZSB3b24ndCBhbHdheXMgY2hlY2sgdGhpcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGUgbmV3IGRlcHRoLCBhbHdheXMgPD0gcHJldmlvdXMgZGVwdGg7IC0xIGlmIHRoZSB0cmllIGlzIGV4aGF1c3RlZAorICAgICAgICAgKi8KKyAgICAgICAgaW50IHNraXBDaGlsZHJlbigpOworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBDdXJzb3I8VD4gY3Vyc29yKCk7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGJ5IHtAbGluayBDdXJzb3IjYWR2YW5jZU11bHRpcGxlfSB0byBmZWVkIHRoZSB0cmFuc2l0aW9ucyB0YWtlbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50ZXJmYWNlIFRyYW5zaXRpb25zUmVjZWl2ZXIKKyAgICB7CisgICAgICAgIC8qKiBBZGQgYSBzaW5nbGUgYnl0ZSB0byB0aGUgcGF0aC4gKi8KKyAgICAgICAgdm9pZCBhZGRQYXRoQnl0ZShpbnQgbmV4dEJ5dGUpOworICAgICAgICAvKiogQWRkIHRoZSBjb3VudCBieXRlcyBmcm9tIHBvc2l0aW9uIHBvcyBpbiB0aGUgZ2l2ZW4gYnVmZmVyLiAqLworICAgICAgICB2b2lkIGFkZFBhdGhCeXRlcyhEaXJlY3RCdWZmZXIgYnVmZmVyLCBpbnQgcG9zLCBpbnQgY291bnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgYnkge0BsaW5rIEN1cnNvciNhZHZhbmNlVG9Db250ZW50fSB0byB0cmFjayB0aGUgdHJhbnNpdGlvbnMgYW5kIGJhY2t0cmFja2luZyB0YWtlbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50ZXJmYWNlIFJlc2V0dGluZ1RyYW5zaXRpb25zUmVjZWl2ZXIgZXh0ZW5kcyBUcmFuc2l0aW9uc1JlY2VpdmVyCisgICAgeworICAgICAgICAvKiogRGVsZXRlIGFsbCBieXRlcyBiZXlvbmQgdGhlIGdpdmVuIGxlbmd0aC4gKi8KKyAgICAgICAgdm9pZCByZXNldFBhdGhMZW5ndGgoaW50IG5ld0xlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBwdXNoIGludGVyZmFjZSBmb3Igd2Fsa2luZyBvdmVyIHRoZSB0cmllLiBCdWlsZHMgdXBvbiBUcmFuc2l0aW9uc1JlY2VpdmVyIHRvIGJlIGdpdmVuIHRoZSBieXRlcyBvZiB0aGUKKyAgICAgKiBwYXRoLCBhbmQgYWRkcyBtZXRob2RzIGNhbGxlZCBvbiBlbmNvdW50ZXJpbmcgY29udGVudCBhbmQgY29tcGxldGlvbi4KKyAgICAgKiBTZWUge0BsaW5rIFRyaWVEdW1wZXJ9IGZvciBhbiBleGFtcGxlIG9mIGhvdyB0aGlzIGNhbiBiZSB1c2VkLCBhbmQge0BsaW5rIFRyaWVFbnRyaWVzV2Fsa2VyfSBhcyBhIGJhc2UgY2xhc3MKKyAgICAgKiBmb3Igb3RoZXIgY29tbW9uIHVzYWdlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50ZXJmYWNlIFdhbGtlcjxULCBSPiBleHRlbmRzIFJlc2V0dGluZ1RyYW5zaXRpb25zUmVjZWl2ZXIKKyAgICB7CisgICAgICAgIC8qKiBDYWxsZWQgd2hlbiBjb250ZW50IGlzIGZvdW5kLiAqLworICAgICAgICB2b2lkIGNvbnRlbnQoVCBjb250ZW50KTsKKworICAgICAgICAvKiogQ2FsbGVkIGF0IHRoZSBjb21wbGV0aW9uIG9mIHRoZSB3YWxrLiAqLworICAgICAgICBSIGNvbXBsZXRlKCk7CisgICAgfQorCisgICAgLy8gVmVyc2lvbiBvZiB0aGUgYnl0ZSBjb21wYXJhYmxlIGNvbnZlcnNpb24gdG8gdXNlIGZvciBhbGwgb3BlcmF0aW9ucworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiBCWVRFX0NPTVBBUkFCTEVfVkVSU0lPTiA9IEJ5dGVDb21wYXJhYmxlLlZlcnNpb24uT1NTNTA7CisKKyAgICAvKioKKyAgICAgKiBBZGFwdGVyIGludGVyZmFjZSBwcm92aWRpbmcgdGhlIG1ldGhvZHMgYSB7QGxpbmsgV2Fsa2VyfSB0byBhIHtAbGluayBDb25zdW1lcn0sIHNvIHRoYXQgdGhlIGxhdHRlciBjYW4gYmUgdXNlZAorICAgICAqIHdpdGgge0BsaW5rICNwcm9jZXNzfS4KKyAgICAgKgorICAgICAqIFRoaXMgZW5hYmxlcyBjYWxscyBsaWtlCisgICAgICogICAgIHRyaWUuZm9yRWFjaEVudHJ5KHggLT4gU3lzdGVtLm91dC5wcmludGxuKHgpKTsKKyAgICAgKiB0byBiZSBtYXBwZWQgZGlyZWN0bHkgdG8gYSBzaW5nbGUgY2FsbCB0byB7QGxpbmsgI3Byb2Nlc3N9IHdpdGhvdXQgZXh0cmEgYWxsb2NhdGlvbnMuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBWYWx1ZUNvbnN1bWVyPFQ+IGV4dGVuZHMgQ29uc3VtZXI8VD4sIFdhbGtlcjxULCBWb2lkPgorICAgIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIGRlZmF1bHQgdm9pZCBjb250ZW50KFQgY29udGVudCkKKyAgICAgICAgeworICAgICAgICAgICAgYWNjZXB0KGNvbnRlbnQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIGRlZmF1bHQgVm9pZCBjb21wbGV0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIGRlZmF1bHQgdm9pZCByZXNldFBhdGhMZW5ndGgoaW50IG5ld0RlcHRoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBub3QgdHJhY2tpbmcgcGF0aAorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIGRlZmF1bHQgdm9pZCBhZGRQYXRoQnl0ZShpbnQgbmV4dEJ5dGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdCB0cmFja2luZyBwYXRoCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgZGVmYXVsdCB2b2lkIGFkZFBhdGhCeXRlcyhEaXJlY3RCdWZmZXIgYnVmZmVyLCBpbnQgcG9zLCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdCB0cmFja2luZyBwYXRoCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIHRoZSBnaXZlbiBjb25zdW1lciBvbiBhbGwgY29udGVudCB2YWx1ZXMgaW4gdGhlIHRyaWUgaW4gb3JkZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZm9yRWFjaFZhbHVlKFZhbHVlQ29uc3VtZXI8VD4gY29uc3VtZXIpCisgICAgeworICAgICAgICBwcm9jZXNzKGNvbnN1bWVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIHRoZSBnaXZlbiBjb25zdW1lciBvbiBhbGwgKHBhdGgsIGNvbnRlbnQpIHBhaXJzIHdpdGggbm9uLW51bGwgY29udGVudCBpbiB0aGUgdHJpZSBpbiBvcmRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmb3JFYWNoRW50cnkoQmlDb25zdW1lcjxCeXRlQ29tcGFyYWJsZSwgVD4gY29uc3VtZXIpCisgICAgeworICAgICAgICBwcm9jZXNzKG5ldyBUcmllRW50cmllc1dhbGtlci5XaXRoQ29uc3VtZXI8VD4oY29uc3VtZXIpKTsKKyAgICAgICAgLy8gTm90ZTogd2UgY2FuJ3QgZG8gdGhlIFZhbHVlQ29uc3VtZXIgdHJpY2sgaGVyZSwgYmVjYXVzZSB0aGUgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgc3RhdGUgYW5kIGNhbm5vdCBiZQorICAgICAgICAvLyBpbXBsZW1lbnRlZCB3aXRoIGRlZmF1bHQgbWV0aG9kcyBhbG9uZS4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSB0cmllIHVzaW5nIHRoZSBnaXZlbiBXYWxrZXIuCisgICAgICovCisgICAgcHVibGljIDxSPiBSIHByb2Nlc3MoV2Fsa2VyPFQsIFI+IHdhbGtlcikKKyAgICB7CisgICAgICAgIHJldHVybiBwcm9jZXNzKHdhbGtlciwgY3Vyc29yKCkpOworICAgIH0KKworICAgIHN0YXRpYyA8VCwgUj4gUiBwcm9jZXNzKFdhbGtlcjxULCBSPiB3YWxrZXIsIEN1cnNvcjxUPiBjdXJzb3IpCisgICAgeworICAgICAgICBhc3NlcnQgY3Vyc29yLmRlcHRoKCkgPT0gMCA6ICJUaGUgcHJvdmlkZWQgY3Vyc29yIGhhcyBhbHJlYWR5IGJlZW4gYWR2YW5jZWQuIjsKKyAgICAgICAgVCBjb250ZW50ID0gY3Vyc29yLmNvbnRlbnQoKTsgICAvLyBoYW5kbGUgY29udGVudCBvbiB0aGUgcm9vdCBub2RlCisgICAgICAgIGlmIChjb250ZW50ID09IG51bGwpCisgICAgICAgICAgICBjb250ZW50ID0gY3Vyc29yLmFkdmFuY2VUb0NvbnRlbnQod2Fsa2VyKTsKKworICAgICAgICB3aGlsZSAoY29udGVudCAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICB3YWxrZXIuY29udGVudChjb250ZW50KTsKKyAgICAgICAgICAgIGNvbnRlbnQgPSBjdXJzb3IuYWR2YW5jZVRvQ29udGVudCh3YWxrZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB3YWxrZXIuY29tcGxldGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHVjdCBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRyaWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBkdW1wKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkdW1wKE9iamVjdDo6dG9TdHJpbmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0dWN0IGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHJpZSB1c2luZyB0aGUgZ2l2ZW4gY29udGVudC10by1zdHJpbmcgbWFwcGVyLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZHVtcChGdW5jdGlvbjxULCBTdHJpbmc+IGNvbnRlbnRUb1N0cmluZykKKyAgICB7CisgICAgICAgIHJldHVybiBwcm9jZXNzKG5ldyBUcmllRHVtcGVyPD4oY29udGVudFRvU3RyaW5nKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNpbmdsZXRvbiB0cmllIG1hcHBpbmcgdGhlIGdpdmVuIGJ5dGUgcGF0aCB0byBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFRyaWU8VD4gc2luZ2xldG9uKEJ5dGVDb21wYXJhYmxlIGIsIFQgdikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgU2luZ2xldG9uVHJpZTw+KGIsIHYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB2aWV3IG9mIHRoZSBzdWJ0cmllIGNvbnRhaW5pbmcgZXZlcnl0aGluZyBpbiB0aGlzIHRyaWUgd2hvc2Uga2V5cyBmYWxsIGJldHdlZW4gdGhlIGdpdmVuIGJvdW5kYXJpZXMuCisgICAgICogVGhlIHZpZXcgaXMgbGl2ZSwgaS5lLiBhbnkgd3JpdGUgdG8gdGhlIHNvdXJjZSB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgc3VidHJpZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbm90IGNoZWNrIGl0cyBhcmd1bWVudHMgZm9yIGNvcnJlY3RuZXNzLiBUaGUgcmVzdWx0aW5nIHRyaWUgbWF5IGJlIGVtcHR5IG9yIHRocm93IGFuIGV4Y2VwdGlvbgorICAgICAqIGlmIHRoZSByaWdodCBib3VuZCBpcyBzbWFsbGVyIHRoYW4gdGhlIGxlZnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCB0aGUgbGVmdCBib3VuZCBmb3IgdGhlIHJldHVybmVkIHN1YnRyaWUuIElmIHtAY29kZSBudWxsfSwgdGhlIHJlc3VsdGluZyBzdWJ0cmllIGlzIG5vdCBsZWZ0LWJvdW5kZWQuCisgICAgICogQHBhcmFtIGluY2x1ZGVMZWZ0IHdoZXRoZXIge0Bjb2RlIGxlZnR9IGlzIGFuIGluY2x1c2l2ZSBib3VuZCBvZiBub3QuCisgICAgICogQHBhcmFtIHJpZ2h0IHRoZSByaWdodCBib3VuZCBmb3IgdGhlIHJldHVybmVkIHN1YnRyaWUuIElmIHtAY29kZSBudWxsfSwgdGhlIHJlc3VsdGluZyBzdWJ0cmllIGlzIG5vdCByaWdodC1ib3VuZGVkLgorICAgICAqIEBwYXJhbSBpbmNsdWRlUmlnaHQgd2hldGhlciB7QGNvZGUgcmlnaHR9IGlzIGFuIGluY2x1c2l2ZSBib3VuZCBvZiBub3QuCisgICAgICogQHJldHVybiBhIHZpZXcgb2YgdGhlIHN1YnRyaWUgY29udGFpbmluZyBhbGwgdGhlIGtleXMgb2YgdGhpcyB0cmllIGZhbGxpbmcgYmV0d2VlbiB7QGNvZGUgbGVmdH0gKGluY2x1c2l2ZWx5IGlmCisgICAgICoge0Bjb2RlIGluY2x1ZGVMZWZ0fSkgYW5kIHtAY29kZSByaWdodH0gKGluY2x1c2l2ZWx5IGlmIHtAY29kZSBpbmNsdWRlUmlnaHR9KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVHJpZTxUPiBzdWJ0cmllKEJ5dGVDb21wYXJhYmxlIGxlZnQsIGJvb2xlYW4gaW5jbHVkZUxlZnQsIEJ5dGVDb21wYXJhYmxlIHJpZ2h0LCBib29sZWFuIGluY2x1ZGVSaWdodCkKKyAgICB7CisgICAgICAgIGlmIChsZWZ0ID09IG51bGwgJiYgcmlnaHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICByZXR1cm4gbmV3IFNsaWNlZFRyaWU8Pih0aGlzLCBsZWZ0LCBpbmNsdWRlTGVmdCwgcmlnaHQsIGluY2x1ZGVSaWdodCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHZpZXcgb2YgdGhlIHN1YnRyaWUgY29udGFpbmluZyBldmVyeXRoaW5nIGluIHRoaXMgdHJpZSB3aG9zZSBrZXlzIGZhbGwgYmV0d2VlbiB0aGUgZ2l2ZW4gYm91bmRhcmllcywKKyAgICAgKiBsZWZ0LWluY2x1c2l2ZSBhbmQgcmlnaHQtZXhjbHVzaXZlLgorICAgICAqIFRoZSB2aWV3IGlzIGxpdmUsIGkuZS4gYW55IHdyaXRlIHRvIHRoZSBzb3VyY2Ugd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIHN1YnRyaWUuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCBjaGVjayBpdHMgYXJndW1lbnRzIGZvciBjb3JyZWN0bmVzcy4gVGhlIHJlc3VsdGluZyB0cmllIG1heSBiZSBlbXB0eSBvciB0aHJvdyBhbiBleGNlcHRpb24KKyAgICAgKiBpZiB0aGUgcmlnaHQgYm91bmQgaXMgc21hbGxlciB0aGFuIHRoZSBsZWZ0LgorICAgICAqCisgICAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIHN1YnRyaWUobGVmdCwgdHJ1ZSwgcmlnaHQsIGZhbHNlKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0IHRoZSBsZWZ0IGJvdW5kIGZvciB0aGUgcmV0dXJuZWQgc3VidHJpZS4gSWYge0Bjb2RlIG51bGx9LCB0aGUgcmVzdWx0aW5nIHN1YnRyaWUgaXMgbm90IGxlZnQtYm91bmRlZC4KKyAgICAgKiBAcGFyYW0gcmlnaHQgdGhlIHJpZ2h0IGJvdW5kIGZvciB0aGUgcmV0dXJuZWQgc3VidHJpZS4gSWYge0Bjb2RlIG51bGx9LCB0aGUgcmVzdWx0aW5nIHN1YnRyaWUgaXMgbm90IHJpZ2h0LWJvdW5kZWQuCisgICAgICogQHJldHVybiBhIHZpZXcgb2YgdGhlIHN1YnRyaWUgY29udGFpbmluZyBhbGwgdGhlIGtleXMgb2YgdGhpcyB0cmllIGZhbGxpbmcgYmV0d2VlbiB7QGNvZGUgbGVmdH0gKGluY2x1c2l2ZWx5IGlmCisgICAgICoge0Bjb2RlIGluY2x1ZGVMZWZ0fSkgYW5kIHtAY29kZSByaWdodH0gKGluY2x1c2l2ZWx5IGlmIHtAY29kZSBpbmNsdWRlUmlnaHR9KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVHJpZTxUPiBzdWJ0cmllKEJ5dGVDb21wYXJhYmxlIGxlZnQsIEJ5dGVDb21wYXJhYmxlIHJpZ2h0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN1YnRyaWUobGVmdCwgdHJ1ZSwgcmlnaHQsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBvcmRlcmVkIGVudHJ5IHNldCBvZiB0aGlzIHRyaWUncyBjb250ZW50IGFzIGFuIGl0ZXJhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYWJsZTxNYXAuRW50cnk8Qnl0ZUNvbXBhcmFibGUsIFQ+PiBlbnRyeVNldCgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpczo6ZW50cnlJdGVyYXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBvcmRlcmVkIGVudHJ5IHNldCBvZiB0aGlzIHRyaWUncyBjb250ZW50IGluIGFuIGl0ZXJhdG9yLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvcjxNYXAuRW50cnk8Qnl0ZUNvbXBhcmFibGUsIFQ+PiBlbnRyeUl0ZXJhdG9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVHJpZUVudHJpZXNJdGVyYXRvci5Bc0VudHJpZXM8Pih0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBvcmRlcmVkIHNldCBvZiB2YWx1ZXMgb2YgdGhpcyB0cmllIGFzIGFuIGl0ZXJhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYWJsZTxUPiB2YWx1ZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXM6OnZhbHVlSXRlcmF0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgb3JkZXJlZCBzZXQgb2YgdmFsdWVzIG9mIHRoaXMgdHJpZSBpbiBhbiBpdGVyYXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3I8VD4gdmFsdWVJdGVyYXRvcigpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFRyaWVWYWx1ZXNJdGVyYXRvcjw+KHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlcyBpbiBhbnkgb3JkZXIuIEZvciBzb21lIHRyaWVzIHRoaXMgaXMgbXVjaCBmYXN0ZXIgdGhhbiB0aGUgb3JkZXJlZCBpdGVyYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmFibGU8VD4gdmFsdWVzVW5vcmRlcmVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiB2YWx1ZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlciBvZiBjb250ZW50IG9mIG1lcmdlZCBub2RlcywgdXNlZCBmb3IgdHdvLXNvdXJjZSBtZXJnZXMgKGkuZS4gbWVyZ2VXaXRoKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIE1lcmdlUmVzb2x2ZXI8VD4KKyAgICB7CisgICAgICAgIC8vIE5vdGU6IE5vIGd1YXJhbnRlZXMgYWJvdXQgYXJndW1lbnQgb3JkZXIuCisgICAgICAgIC8vIEUuZy4gZHVyaW5nIHQxLm1lcmdlV2l0aCh0MiwgcmVzb2x2ZXIpLCByZXNvbHZlciBtYXkgYmUgY2FsbGVkIHdpdGggdDEgb3IgdDIncyBpdGVtcyBhcyBmaXJzdCBhcmd1bWVudC4KKyAgICAgICAgVCByZXNvbHZlKFQgYjEsIFQgYjIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSB2aWV3IG9mIHRoZSBtZXJnZSBvZiB0aGlzIHRyaWUgd2l0aCB0aGUgZ2l2ZW4gb25lLiBUaGUgdmlldyBpcyBsaXZlLCBpLmUuIGFueSB3cml0ZSB0byBhbnkgb2YgdGhlCisgICAgICogc291cmNlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgbWVyZ2VkIHZpZXcuCisgICAgICoKKyAgICAgKiBJZiB0aGVyZSBpcyBjb250ZW50IGZvciBhIGdpdmVuIGtleSBpbiBib3RoIHNvdXJjZXMsIHRoZSByZXNvbHZlciB3aWxsIGJlIGNhbGxlZCB0byBvYnRhaW4gdGhlIGNvbWJpbmF0aW9uLgorICAgICAqIChUaGUgcmVzb2x2ZXIgd2lsbCBub3QgYmUgY2FsbGVkIGlmIHRoZXJlJ3MgY29udGVudCBmcm9tIG9ubHkgb25lIHNvdXJjZS4pCisgICAgICovCisgICAgcHVibGljIFRyaWU8VD4gbWVyZ2VXaXRoKFRyaWU8VD4gb3RoZXIsIE1lcmdlUmVzb2x2ZXI8VD4gcmVzb2x2ZXIpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IE1lcmdlVHJpZTw+KHJlc29sdmVyLCB0aGlzLCBvdGhlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzb2x2ZXIgb2YgY29udGVudCBvZiBtZXJnZWQgbm9kZXMuCisgICAgICoKKyAgICAgKiBUaGUgcmVzb2x2ZXIncyBtZXRob2RzIGFyZSBvbmx5IGNhbGxlZCBpZiBtb3JlIHRoYW4gb25lIG9mIHRoZSBtZXJnZWQgbm9kZXMgY29udGFpbiBjb250ZW50LCBhbmQgdGhlCisgICAgICogb3JkZXIgaW4gd2hpY2ggdGhlIGFyZ3VtZW50cyBhcmUgZ2l2ZW4gaXMgbm90IGRlZmluZWQuIE9ubHkgcHJlc2VudCBub24tbnVsbCB2YWx1ZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUKKyAgICAgKiBjb2xsZWN0aW9uIHBhc3NlZCB0byB0aGUgcmVzb2x2aW5nIG1ldGhvZHMuCisgICAgICoKKyAgICAgKiBDYW4gYWxzbyBiZSB1c2VkIGFzIGEgdHdvLXNvdXJjZSByZXNvbHZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIENvbGxlY3Rpb25NZXJnZVJlc29sdmVyPFQ+IGV4dGVuZHMgTWVyZ2VSZXNvbHZlcjxUPgorICAgIHsKKyAgICAgICAgVCByZXNvbHZlKENvbGxlY3Rpb248VD4gY29udGVudHMpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBkZWZhdWx0IFQgcmVzb2x2ZShUIGMxLCBUIGMyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShJbW11dGFibGVMaXN0Lm9mKGMxLCBjMikpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbk1lcmdlUmVzb2x2ZXI8T2JqZWN0PiBUSFJPV0lOR19SRVNPTFZFUiA9IG5ldyBDb2xsZWN0aW9uTWVyZ2VSZXNvbHZlcjxPYmplY3Q+KCkKKyAgICB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IHJlc29sdmUoQ29sbGVjdGlvbjxPYmplY3Q+IGNvbnRlbnRzKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBlcnJvcigpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBBc3NlcnRpb25FcnJvciBlcnJvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiRW50cmllcyBtdXN0IGJlIGRpc3RpbmN0LiIpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSByZXNvbHZlciB0aGF0IHRocm93cyB3aGVuZXZlciBtb3JlIHRoYW4gb25lIG9mIHRoZSBtZXJnZWQgbm9kZXMgY29udGFpbnMgY29udGVudC4KKyAgICAgKiBDYW4gYmUgdXNlZCB0byBtZXJnZSB0cmllcyB0aGF0IGFyZSBrbm93biB0byBoYXZlIGRpc3RpbmN0IGNvbnRlbnQgcGF0aHMuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHN0YXRpYyA8VD4gQ29sbGVjdGlvbk1lcmdlUmVzb2x2ZXI8VD4gdGhyb3dpbmdSZXNvbHZlcigpCisgICAgeworICAgICAgICByZXR1cm4gKENvbGxlY3Rpb25NZXJnZVJlc29sdmVyPFQ+KSBUSFJPV0lOR19SRVNPTFZFUjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdmlldyBvZiB0aGUgbWVyZ2Ugb2YgbXVsdGlwbGUgdHJpZXMuIFRoZSB2aWV3IGlzIGxpdmUsIGkuZS4gYW55IHdyaXRlIHRvIGFueSBvZiB0aGUKKyAgICAgKiBzb3VyY2VzIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBtZXJnZWQgdmlldy4KKyAgICAgKgorICAgICAqIElmIHRoZXJlIGlzIGNvbnRlbnQgZm9yIGEgZ2l2ZW4ga2V5IGluIG1vcmUgdGhhbiBvbmUgc291cmNlcywgdGhlIHJlc29sdmVyIHdpbGwgYmUgY2FsbGVkIHRvIG9idGFpbiB0aGUKKyAgICAgKiBjb21iaW5hdGlvbi4gKFRoZSByZXNvbHZlciB3aWxsIG5vdCBiZSBjYWxsZWQgaWYgdGhlcmUncyBjb250ZW50IGZyb20gb25seSBvbmUgc291cmNlLikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUcmllPFQ+IG1lcmdlKENvbGxlY3Rpb248PyBleHRlbmRzIFRyaWU8VD4+IHNvdXJjZXMsIENvbGxlY3Rpb25NZXJnZVJlc29sdmVyPFQ+IHJlc29sdmVyKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChzb3VyY2VzLnNpemUoKSkKKyAgICAgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICByZXR1cm4gZW1wdHkoKTsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcmV0dXJuIHNvdXJjZXMuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgeworICAgICAgICAgICAgSXRlcmF0b3I8PyBleHRlbmRzIFRyaWU8VD4+IGl0ID0gc291cmNlcy5pdGVyYXRvcigpOworICAgICAgICAgICAgVHJpZTxUPiB0MSA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIFRyaWU8VD4gdDIgPSBpdC5uZXh0KCk7CisgICAgICAgICAgICByZXR1cm4gdDEubWVyZ2VXaXRoKHQyLCByZXNvbHZlcik7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbk1lcmdlVHJpZTw+KHNvdXJjZXMsIHJlc29sdmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSB2aWV3IG9mIHRoZSBtZXJnZSBvZiBtdWx0aXBsZSB0cmllcywgd2hlcmUgZWFjaCBzb3VyY2UgbXVzdCBoYXZlIGRpc3RpbmN0IGtleXMuIFRoZSB2aWV3IGlzIGxpdmUsCisgICAgICogaS5lLiBhbnkgd3JpdGUgdG8gYW55IG9mIHRoZSBzb3VyY2VzIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBtZXJnZWQgdmlldy4KKyAgICAgKgorICAgICAqIElmIHRoZXJlIGlzIGNvbnRlbnQgZm9yIGEgZ2l2ZW4ga2V5IGluIG1vcmUgdGhhbiBvbmUgc291cmNlcywgdGhlIG1lcmdlIHdpbGwgdGhyb3cgYW4gYXNzZXJ0aW9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFRyaWU8VD4gbWVyZ2VEaXN0aW5jdChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUcmllPFQ+PiBzb3VyY2VzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChzb3VyY2VzLnNpemUoKSkKKyAgICAgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICByZXR1cm4gZW1wdHkoKTsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcmV0dXJuIHNvdXJjZXMuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgeworICAgICAgICAgICAgSXRlcmF0b3I8PyBleHRlbmRzIFRyaWU8VD4+IGl0ID0gc291cmNlcy5pdGVyYXRvcigpOworICAgICAgICAgICAgVHJpZTxUPiB0MSA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIFRyaWU8VD4gdDIgPSBpdC5uZXh0KCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1lcmdlVHJpZS5EaXN0aW5jdDw+KHQxLCB0Mik7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbk1lcmdlVHJpZS5EaXN0aW5jdDw+KHNvdXJjZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJpZTxPYmplY3Q+IEVNUFRZID0gbmV3IFRyaWU8T2JqZWN0PigpCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgQ3Vyc29yPE9iamVjdD4gY3Vyc29yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDdXJzb3I8T2JqZWN0PigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGRlcHRoID0gMDsKKworICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgYWR2YW5jZSgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVwdGggPSAtMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgaW50IHNraXBDaGlsZHJlbigpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVwdGggPSAtMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGRlcHRoKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXB0aDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNvbnRlbnQoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIGludCBpbmNvbWluZ1RyYW5zaXRpb24oKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9OworCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHN0YXRpYyA8VD4gVHJpZTxUPiBlbXB0eSgpCisgICAgeworICAgICAgICByZXR1cm4gKFRyaWU8VD4pIEVNUFRZOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWUubWQgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNjU4NzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllLm1kCkBAIC0wLDAgKzEsMjUyIEBACis8IS0tLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKyMgYFRyaWVgIGludGVyZmFjZQorCitUcmllcyBpbiBDYXNzYW5kcmEgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGtleS12YWx1ZSBtYXBwaW5ncyBpbiBhbiBlZmZpY2llbnQgd2F5LCBjdXJyZW50bHkgb25seSBmb3IgdGhlIHBhcnRpdGlvbiBtYXAKK2luIGEgbWVtdGFibGUuIFRoZSBkZXNpZ24gd2UgdXNlIGlzIGZvY3Vzc2VkIG9uIHBlcmZvcm1pbmcgdGhlIGVxdWl2YWxlbnQgb2YgYSByZWFkIHF1ZXJ5LCBiZWluZyBhYmxlIHRvIG1vc3QgZWZmaWNpZW50bHk6CistIGNvbWJpbmUgbXVsdGlwbGUgc291cmNlcyB3aGlsZSBtYWludGFpbmluZyBvcmRlciwKKy0gcmVzdHJpY3QgdGhlIGNvbWJpbmF0aW9uIHRvIGEgcmFuZ2Ugb2Yga2V5cywKKy0gZWZmaWNpZW50bHkgd2FsayB0aGUgcmVzdWx0IGFuZCBleHRyYWN0IGFsbCBjb3ZlcmVkIGtleS12YWx1ZSBjb21iaW5hdGlvbnMuCisKK0ZvciB0aGlzIHRoZSBgVHJpZWAgaW50ZXJmYWNlIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgcHVibGljIG1ldGhvZHM6CistIENvbnN1bWluZyB0aGUgY29udGVudCB1c2luZyBgZm9yRWFjaFZhbHVlYCBvciBgZm9yRWFjaEVudHJ5YC4KKy0gQ29udmVyc2lvbiB0byBpdGVyYWJsZSBhbmQgaXRlcmF0b3IgdXNpbmcgYHZhbHVlcy92YWx1ZXNJdGVyYXRvcmAgYW5kIGBlbnRyeVNldC9lbnRyeUl0ZXJhdG9yYC4KKy0gR2V0dGluZyBhIHZpZXcgb2YgdGhlIHN1YnRyaWUgYmV0d2VlbiBhIGdpdmVuIHBhaXIgb2YgYm91bmRzIHVzaW5nIGBzdWJ0cmllYC4KKy0gTWVyZ2luZyB0d28gb3IgbXVsdGlwbGUgdHJpZXMgdG9nZXRoZXIgdXNpbmcgYG1lcmdlV2l0aGAgYW5kIHRoZSBzdGF0aWMgYG1lcmdlYC4KKy0gQ29uc3RydWN0aW5nIGBzaW5nbGV0b25gIHRyaWVzIHJlcHJlc2VudGluZyBhIHNpbmdsZSBrZXktdG8tdmFsdWUgbWFwcGluZy4KKworVGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgdHJpZSBpcyBnaXZlbiBieSBhIGBDdXJzb3JgLCB3aGljaCBwcm92aWRlcyBhIG1ldGhvZCBvZiB3YWxraW5nIHRoZSBub2RlcyBvZiB0aGUgdHJpZSAKK2luIG9yZGVyLCBhbmQgdG8gd2hpY2ggdmFyaW91cyB0cmFuc2Zvcm1hdGlvbnMgbGlrZSBtZXJnZXMgYW5kIGludGVyc2VjdGlvbnMgY2FuIGJlIGVhc2lseSBhbmQgZWZmaWNpZW50bHkgYXBwbGllZC4KK1RoZSBzZWN0aW9ucyBiZWxvdyBkZXRhaWwgdGhlIG1vdGl2YXRpb24gYmVoaW5kIHRoaXMgZGVzaWduIGFzIHdlbGwgYXMgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYmFzaWMgb3BlcmF0aW9ucy4KKworIyMgV2Fsa2luZyBhIHRyaWUKKworV2Fsa2luZyBhIGBUcmllYCBpcyBhY2hpZXZlZCB1c2luZyBhIGN1cnNvci4gQmVmb3JlIHdlIGRlc2NyaWJlIGl0IGluIGRldGFpbCwgbGV0J3MgZ2l2ZSBhIHF1aWNrIGV4YW1wbGUgb2Ygd2hhdCBhCitjbGFzc2ljIHRyaWUgd2FsayBsb29rcyBsaWtlIGFuZCBob3cgaXQgY2FuIGJlIG9wdGltaXplZC4gU3VwcG9zZSB3ZSB3YW50IHRvIHdhbGsgdGhlIGZvbGxvd2luZyB0cmllOgorCishW2dyYXBoXShJbk1lbW9yeVRyaWUubWQudzEuc3ZnKQorCisoTm90ZTogdGhlIG5vZGUgbGFiZWxzIGFyZSBgSW5NZW1vcnlUcmllYCBub2RlIElEcyB3aGljaCBjYW4gYmUgaWdub3JlZCBoZXJlLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgYGNvbnRlbnRBcnJheVt4XWAgCitvbmVzIHdoaWNoIHNwZWNpZnkgdGhhdCB0aGUgcmVsZXZhbnQgbm9kZSBoYXMgc29tZSBhc3NvY2lhdGVkIGNvbnRlbnQuKQorCitUaGUgY2xhc3NpYyB3YWxrIGRlc2NlbmRzICg8c3BhbiBzdHlsZT0iY29sb3I6bGlnaHRibHVlIj5saWdodCBibHVlPC9zcGFuPikgb24gZXZlcnkgY2hhcmFjdGVyIGFuZCBiYWNrdHJhY2tzIAorKDxzcGFuIHN0eWxlPSJjb2xvcjpwaW5rIj5waW5rPC9zcGFuPikgdG8gdGhlIHBhcmVudCwgcmVzdWx0aW5nIGluIHRoZSBmb2xsb3dpbmcgd2FsazoKKworIVtncmFwaF0oSW5NZW1vcnlUcmllLm1kLncyLnN2ZykKKworT25lIGNhbiBzZWUgZnJvbSB0aGlzIGdyYXBoIHRoYXQgbWFueSBvZiB0aGUgYmFja3RyYWNraW5nIHN0ZXBzIGFyZSBvbmx5IHRha2VuIHNvIHRoYXQgdGhleSBjYW4gaW1tZWRpYXRlbHkgYmUgZm9sbG93ZWQKK2J5IGFub3RoZXIgYmFja3RyYWNraW5nIHN0ZXAuIFdlIG9mdGVuIGFsc28ga25vdyBpbiBhZHZhbmNlIHRoYXQgYSBub2RlIGRvZXMgbm90IG5lZWQgdG8gYmUgZXhhbWluZWQgZnVydGhlciBvbiB0aGUgd2F5CitiYWNrOiBpZiBpdCBvbmx5IGhhcyBvbmUgY2hpbGQgKHdoaWNoIGlzIGFsd2F5cyB0aGUgY2FzZSBmb3IgYWxsIG5vZGVzIGluIGEgYENoYWluYCksIG9yIGlmIHdlIGFyZSBkZXNjZW5kaW5nIGludG8gCitpdHMgbGFzdCBjaGlsZCAod2hpY2ggaXMgZWFzeSB0byBjaGVjayBmb3IgYFNwYXJzZWAgbm9kZXMpLiBUaGlzIHNpbXBsaWZpZXMgdGhlIHdhbGsgdG86CisKKyFbZ3JhcGhdKEluTWVtb3J5VHJpZS5tZC53My5zdmcpCisKK0luIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgd2FsayBzaW1wbGVyLCBzaG9ydGVuaW5nIHRoZSBiYWNrdHJhY2tpbmcgcGF0aHMgbWVhbnMgYSBzbWFsbGVyIHdhbGsgc3RhdGUgcmVwcmVzZW50YXRpb24sCit3aGljaCBpcyBxdWl0ZSBoZWxwZnVsIGluIGtlZXBpbmcgdGhlIGdhcmJhZ2UgY29sbGVjdGlvbiBjb3N0IGRvd24uIEluIHRoaXMgZXhhbXBsZSwgdGhlIGJhY2t0cmFja2luZyBzdGF0ZSBvZiB0aGUgd2FsaworYXQgdGhlICJ0cmFjdG9yIiBub2RlIGlzIG9ubHkgYFsoInRyIiwgY2hpbGQgMildYCwgY2hhbmdlcyB0byBgWygidHIiLCBjaGlsZCAzKV1gIG9uIGRlc2NlbnQgdG8gInRyZSIsIGFuZCBiZWNvbWVzIGVtcHR5CisoYXMgInRyIiBoYXMgbm8gZnVydGhlciBjaGlsZHJlbiBhbmQgY2FuIGJlIHJlbW92ZWQpIG9uIGRlc2NlbnQgdG8gInRyaSIuICAKKworT25lIGZ1cnRoZXIgb3B0aW1pemF0aW9uIG9mIHRoZSB3YWxrIGlzIHRvIGp1bXAgZGlyZWN0bHkgdG8gdGhlIG5leHQgY2hpbGQgd2l0aG91dCBzdG9wcGluZyBhdCBhIGJyYW5jaGluZyBwYXJlbnQgKG5vdGU6Cit0aGUgYmxhY2sgYXJyb3dzIHJlcHJlc2VudCB0aGUgdHJpZSBzdHJ1Y3R1cmUpOgorCishW2dyYXBoXShJbk1lbW9yeVRyaWUubWQud2MxLnN2ZykKKworVGhpcyBncmFwaCBpcyB3aGF0IGEgY3Vyc29yIHdhbGsgb3ZlciB0aGlzIHRyaWUgaXMuIExvb2tpbmcgY2xvc2VseSBhdCB0aGUgZ3JhcGgsIG9uZSBjYW4gc2VlIHRoYXQgaXQgc3RvcHMgZXhhY3RseSBvbmNlCitvbiBlYWNoIG5vZGUsIGFuZCB0aGF0IHRoZSBub2RlcyBhcmUgdmlzaXRlZCBpbiBsZXhpY29ncmFwaGljIG9yZGVyLiBUaGVyZSBpcyBubyBsb25nZXIgYSBuZWVkIGZvciBhIHNlcGFyYXRlIGJhY2t0cmFjaworb3IgYXNjZW5kIG9wZXJhdGlvbiwgYmVjYXVzZSBhbGwgYXJyb3dzIF9hZHZhbmNlXyBpbiB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRyaWUuIEhvd2V2ZXIsIHRvIGJlIGFibGUgdG8gdW5kZXJzdGFuZAord2hlcmUgdGhlIG5leHQgdHJhbnNpdGlvbiBjaGFyYWN0ZXIgc2l0cyBpbiB0aGUgcGF0aCwgZXZlcnkgdHJhbnNpdGlvbiBub3cgYWxzbyBjb21lcyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZQorZGVzY2VuZC1kZXB0aCBpdCBlbmRzIGluLgorCitUbyBzZWUgaG93IHRoaXMgY2FuIGJlIHVzZWQgdG8gbWFwIHRoZSBzdGF0ZSB0byBhIHBhdGgsIHdlIGNhbiBpbWFnaW5lIGFuIGFycmF5IGJlaW5nIGZpbGxlZCBhdCBpdHMgYGRlcHRoLTFgdGgKK3Bvc2l0aW9uIG9uIGV2ZXJ5IHRyYW5zaXRpb24sIGFuZCB0aGUgY3VycmVudCBwYXRoIGJlaW5nIHRoZSBgZGVwdGhgLWxvbmcgc2VxdWVuY2UuIFRoaXMsIGUuZy4gdGhlIGFycmF5IHdvdWxkIGhvbGQKK1t0LCByLCBhLCBjLCB0LCBvLCByXSBhdCB0aGUgInRyYWN0b3IiIG5vZGUgYW5kIGNoYW5nZSB0byBbdCwgciwgZSwgYywgdCwgbywgcl0gZm9yIHRoZSBuZXh0IGFkdmFuY2UsIHdoZXJlIHRoZSBuZXcgCitjdXJyZW50IHBhdGggaXMgdGhlIGZpcnN0IDMgY2hhcmFjdGVycyBvZiB0aGUgYXJyYXkuCisKK0N1cnNvcnMgYXJlIHN0YXRlZnVsIG9iamVjdHMgdGhhdCBzdG9yZSB0aGUgYmFja3RyYWNraW5nIHN0YXRlIG9mIHRoZSB3YWxrLiBUaGF0IGlzLCBhIGxpc3Qgb2YgYWxsIHBhcmVudCBub2RlcyBpbiB0aGUKK3BhdGggdG8gcmVhY2ggdGhlIGN1cnJlbnQgbm9kZSB0aGF0IGhhdmUgZnVydGhlciBjaGlsZHJlbiwgdG9nZXRoZXIgd2l0aCBpbmZvcm1hdGlvbiB3aGljaCBjaGlsZCBiYWNrdHJhY2tpbmcgc2hvdWxkIGdvCit0by4gQ3Vyc29ycyBkbyBub3Qgc3RvcmUgcGF0aHMgYXMgdGhlc2UgYXJlIG9mdGVuIG5vdCBuZWVkZWQgJm1kYXNoOyBmb3IgZXhhbXBsZSwgaW4gYSB3YWxrIG92ZXIgYSBtZXJnZWQgdHJpZSBpdCBtYWtlcyAKK2JldHRlciBzZW5zZSBmb3IgdGhlIGNvbnN1bWVyIHRvIGNvbnN0cnVjdCB0aGUgcGF0aCBpbnN0ZWFkIG9mIGhhdmluZyB0aGVtIGR1cGxpY2F0ZWQgaW4gZXZlcnkgc291cmNlIGN1cnNvci4gTXVsdGlwbGUgCitjdXJzb3JzIGNhbiBiZSBjb25zdHJ1Y3RlZCBhbmQgb3BlcmF0ZWQgaW4gcGFyYWxsZWwgb3ZlciBhIHRyaWUuCisKK0N1cnNvciB3YWxrcyBvZiB0aGlzIHR5cGUgYXJlIHZlcnkgZWZmaWNpZW50IGJ1dCBzdGlsbCBjYXJyeSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gbWFrZSBpdCB2ZXJ5IGVhc3kgYW5kIGVmZmljaWVudCB0bworbWVyZ2UgYW5kIGludGVyc2VjdCB0cmllcy4gSWYgd2UgYXJlIHdhbGtpbmcgYSBzaW5nbGUgdHJpZSAob3IgYSBzaW5nbGUtc291cmNlIGJyYW5jaCBpbiBhIHVuaW9uIHRyaWUpLCB3ZSBjYW4KK2ltcHJvdmUgdGhlIGVmZmljaWVuY3kgZXZlbiBmdXJ0aGVyIGJ5IHRha2luZyBtdWx0aXBsZSBzdGVwcyBkb3duIGluIGBDaGFpbmAgbm9kZXMsIHByb3ZpZGVkIHdlIGhhdmUgYSBzdWl0YWJsZQorbWVjaGFuaXNtIG9mIHBhc3NpbmcgYWRkaXRpb25hbCB0cmFuc2l0aW9uIGNoYXJhY3RlcnM6CisKKyFbZ3JhcGhdKEluTWVtb3J5VHJpZS5tZC53YzIuc3ZnKQorCitUaGlzIGlzIHN1cHBvcnRlZCBieSBgQ3Vyc29yLmFkdmFuY2VNdWx0aXBsZWAuCisKKyMjIyBXaHkgY3Vyc29ycyBpbnN0ZWFkIG9mIG5vZGVzPworCitUaGUgbW9zdCBzdHJhaWdodGZvcndhcmQgcmVwcmVzZW50YXRpb24gb2YgYSB0cmllIGlzIGRvbmUgYnkgZ2l2aW5nIHVzZXJzIGV2ZXJ5IGBOb2RlYCB2aXNpdGVkIGFzIGFuIG9iamVjdC4KK1RoZW4gdGhlIGNvbnN1bWVyIGNhbiBxdWVyeSBpdHMgdHJhbnNpdGlvbnMsIGdldCBpdHMgY2hpbGRyZW4sIGRlY2lkZSB0byB3YWxrIG92ZXIgdGhlbSBpbiBhbnkgb3JkZXIgaXQgc2VlcworZml0LCBhbmQgcmV0YWluIHRob3NlIHRoYXQgaXQgYWN0dWFsbHkgbmVlZHMuIFRoaXMgaXMgYSB2ZXJ5IG5hdHVyYWwgYW5kIGNoZWFwIHJlcHJlc2VudGlvbiBpZiB0aGUgbm9kZXMgYXJlIGFjdHVhbGx5IAordGhlIG9iamVjdHMgaW4gbWVtb3J5IHRoYXQgcmVwcmVzZW50IHRoZSB0cmllLgorCitUaGUgbGF0dGVyIGlzIG5vdCB0aGUgY2FzZSBmb3IgdXM6IHdlIHN0b3JlIHRyaWVzIGluIGludGVnZXIgYmxvYnMgb3IgZmlsZXMgb24gZGlzayBhbmQgd2UgcHJlc2VudCB0cmFuc2Zvcm1lZCB2aWV3cyBvZgordHJpZXMuIFRodXMgZXZlcnkgc3VjaCBgTm9kZWAgb2JqZWN0IHRvIGdpdmUgdG8gY29uc3VtZXJzIG11c3QgYmUgY29uc3RydWN0ZWQuIEFsc28sIHdlIG9ubHkgZG8gZGVwdGgtZmlyc3Qgd2Fsa3MgYW5kIGl0IAorZG9lcyBub3QgbWFrZSB0aGF0IG11Y2ggc2Vuc2UgdG8gcHJvdmlkZSB0aGUgZnVsbCBmbGV4aWJpbGl0eSBvZiB0aGF0IGtpbmQgb2YgaW50ZXJmYWNlLgorCitXaGVuIGRvaW5nIG9ubHkgZGVwdGgtZmlyc3Qgd2Fsa3MsIGEgY3Vyc29yIG5lZWRzIGZhciBmZXdlciBvYmplY3RzIHRvIHJlcHJlc2VudCBpdHMgc3RhdGUgdGhhbiBhIG5vZGUgcmVwcmVzZW50YXRpb24uCitDb25zaWRlciB0aGUgZm9sbG93aW5nIGZvciBhbiBhcHByb2FjaCBwcmVzZW50aW5nIG5vZGVzOgorLSBJbiBhIHByb2Nlc3MgdGhhdCByZXF1aXJlcyBzaW5nbGUtc3RlcCBkZXNjZW5kcyAoaS5lLiBpbiBhIG1lcmdlIG9yIGludGVyc2VjdGlvbikgdGhlIGl0ZXJhdGlvbiBzdGF0ZSBtdXN0IGNyZWF0ZSBhbgorICBvYmplY3QgZm9yIGV2ZXJ5IGludGVybWVkaWF0ZSBub2RlIGV2ZW4gd2hlbiB0aGV5IGFyZSBrbm93biB0byByZXF1aXJlIG5vIGJhY2t0cmFja2luZyBiZWNhdXNlIHRoZXkgaGF2ZSBvbmx5IG9uZQorICBjaGlsZC4gCistIENoaWxkbGVzcyBmaW5hbCBzdGF0ZXMgcmVxdWlyZSBhIG5vZGUuCistIEEgdHJhbnNmb3JtYXRpb24gc3VjaCBhcyBhIG1lcmdlIG11c3QgcHJlc2VudCB0aGUgcmVzdWx0IGFzIGEgdHJhbnNmb3JtZWQgbm9kZSwgYnV0IGl0IGFsc28gcmVxdWlyZXMgYSBub2RlIGZvciBlYWNoCisgIGlucHV0LiBJZiB0aGUgdHJhbnNmb3JtZWQgbm9kZSBpcyByZXRhaW5lZCwgc28gbXVzdCBiZSB0aGUgc291cmNlcy4KKworQ3Vyc29ycyBjYW4gcmVwcmVzZW50IHRoZSBmaXJzdCB0d28gaW4gdGhlaXIgaW50ZXJuYWwgc3RhdGUgd2l0aG91dCBhZGRpdGlvbmFsIGJhY2t0cmFja2luZyBzdGF0ZSwgYW5kIHJlcXVpcmUgb25seSBvbmUKK3RyYW5zZm9ybWVkIGN1cnNvciB0byBiZSBjb25zdHJ1Y3RlZCBmb3IgdGhlIGVudGlyZSB3YWxrLiBBZGRpdGlvbmFsbHksIGN1cnNvcnMnIHJlcHJlc2VudGF0aW9uIG9mIGJhY2t0cmFja2luZyBzdGF0ZSAKK21heSBiZSBjbG9zZWx5IHRpZWQgdG8gdGhlIHNwZWNpZmljIHRyaWUgaW1wbGVtZW50YXRpb24sIHdoaWNoIGFsc28gZ2l2ZXMgZnVydGhlciBpbXByb3ZlbWVudCBvcHBvcnR1bml0aWVzIChlLmcuIHRoZSAKK2BTcGxpdGAgbm9kZSB0cmVhdG1lbnQgaW4gYEluTWVtb3J5VHJpZWApLgorCisjIyMgV2h5IG5vdCB2aXNpdG9ycz8KKworQSB2aXNpdG9yIG9yIGEgcHVzaCBhbHRlcm5hdGl2ZSBpcyBvbmUgd2hlcmUgdGhlIHRyaWUgZHJpdmVzIHRoZSBpdGVyYXRpb24gYW5kIHRoZSBjYWxsZXIgcHJvdmlkZXMgYSB2aXNpdG9yIG9yIGEgCitjb25zdW1lci4gVGhpcyBjYW4gd29yayB3ZWxsIGlmIHRoZSB0cmllIHRvIHdhbGsgaXMgc2luZ2xlLXNvdXJjZSwgYnV0IHJlcXVpcmVzIHNvbWUgZm9ybSBvZiBzdG9wL3Jlc3RhcnQgb3IgcHVsbAorbWVjaGFuaXNtIHRvIGltcGxlbWVudCBvcmRlcmVkIG1lcmdlcy4KKworUHVzaC1zdHlsZSB3YWxrcyBhcmUgc3RpbGwgYSB1c2VmdWwgd2F5IHRvIGNvbnN1bWUgdGhlIGZpbmFsIHRyYW5zZm9ybWVkL21lcmdlZCBjb250ZW50LCB0aHVzIGBUcmllYCBwcm92aWRlcyAKK3RoZSBgV2Fsa2VyYCBpbnRlcmZhY2UgYW5kIGBwcm9jZXNzYCBtZXRob2QuIFRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgYGZvckVhY2hFbnRyeWAgYW5kIGBkdW1wYCBhcmUgc3RyYWlnaHRmb3J3YXJkCithcHBsaWNhdGlvbnMgb2YgdGhpcy4KKworIyMjIFRoZSBgQ3Vyc29yYCBpbnRlcmZhY2UKKworVGhlIGN1cnNvciByZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiBhIHdhbGsgb3ZlciB0aGUgbm9kZXMgb2YgdHJpZS4gSXQgcHJvdmlkZXMgdGhyZWUgbWFpbiBmZWF0dXJlczoKKy0gdGhlIGN1cnJlbnQgYGRlcHRoYCBvciBkZXNjZW5kLWRlcHRoIGluIHRoZSB0cmllOworLSB0aGUgYGluY29taW5nVHJhbnNpdGlvbmAsIGkuZS4gdGhlIGJ5dGUgdGhhdCB3YXMgdXNlZCB0byByZWFjaCB0aGUgY3VycmVudCBwb2ludDsKKy0gdGhlIGBjb250ZW50YCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgbm9kZSwKKworYW5kIHByb3ZpZGVzIG1ldGhvZHMgZm9yIGFkdmFuY2luZyB0byB0aGUgbmV4dCBwb3NpdGlvbi4gIFRoaXMgaXMgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGV4dHJhY3QgYWxsIHBhdGhzLCBhbmQKK2Fsc28gdG8gZWFzaWx5IGNvbXBhcmUgY3Vyc29ycyBvdmVyIGRpZmZlcmVudCB0cmllcyB0aGF0IGFyZSBhZHZhbmNlZCB0b2dldGhlci4gQWR2YW5jaW5nIGlzIGFsd2F5cyBkb25lIGluCitvcmRlcjsgaWYgb25lIGltYWdpbmVzIHRoZSBzZXQgb2Ygbm9kZXMgaW4gdGhlIHRyaWUgd2l0aCB0aGVpciBhc3NvY2lhdGVkIHBhdGhzLCBhIGN1cnNvciBtYXkgb25seSBhZHZhbmNlIGZyb20gYQorbm9kZSB3aXRoIGEgbGV4aWNvZ3JhcGhpY2FsbHkgc21hbGxlciBwYXRoIHRvIG9uZSB3aXRoIGJpZ2dlci4gVGhlIGBhZHZhbmNlYCBvcGVyYXRpb24gbW92ZXMgdG8gdGhlIGltbWVkaWF0ZQorbmV4dCwgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBza2lwIG92ZXIgc29tZSBpdGVtcyBlLmcuIGFsbCBjaGlsZHJlbiBvZiB0aGUgY3VycmVudCBub2RlIChgc2tpcENoaWxkcmVuYCkuCisKK01vdmluZyB0byB0aGUgaW1tZWRpYXRlIG5leHQgcG9zaXRpb24gaW4gdGhlIGxleGljb2dyYXBoaWMgb3JkZXIgaXMgYWNjb21wbGlzaGVkIGJ5OgorLSBpZiB0aGUgY3VycmVudCBub2RlIGhhcyBjaGlsZHJlbiwgbW92aW5nIHRvIGl0cyBmaXJzdCBjaGlsZDsKKy0gb3RoZXJ3aXNlLCBhc2NlbmQgdGhlIHBhcmVudCBjaGFpbiBhbmQgcmV0dXJuIHRoZSBuZXh0IGNoaWxkIG9mIHRoZSBjbG9zZXN0IHBhcmVudCB0aGF0IHN0aWxsIGhhcyBhbnkuCisKK0FzIGxvbmcgYXMgdGhlIHRyaWUgaXMgbm90IGV4aGF1c3RlZCwgYWR2YW5jaW5nIGFsd2F5cyB0YWtlcyBvbmUgc3RlcCBkb3duLCBmcm9tIHRoZSBjdXJyZW50IG5vZGUsIG9yIGZyb20gYSBub2RlCitvbiB0aGUgcGFyZW50IGNoYWluLiBCeSBjb21wYXJpbmcgdGhlIG5ldyBkZXB0aCAod2hpY2ggYGFkdmFuY2VgIGFsc28gcmV0dXJucykgd2l0aCB0aGUgb25lIGJlZm9yZSB0aGUgYWR2YW5jZSwKK29uZSBjYW4gdGVsbCBpZiB0aGUgZm9ybWVyIHdhcyB0aGUgY2FzZSAoaWYgYG5ld0RlcHRoID09IG9sZERlcHRoICsgMWApIGFuZCBob3cgbWFueSBzdGVwcyB1cCB3ZSBoYWQgdG8gdGFrZQorKGBvbGREZXB0aCArIDEgLSBuZXdEZXB0aGApLiBXaGVuIGZvbGxvd2luZyBhIHBhdGggZG93biwgdGhlIGN1cnNvciB3aWxsIHN0b3Agb24gYWxsIHByZWZpeGVzLgorCitJbiBhZGRpdGlvbiB0byB0aGUgc2luZ2xlLXN0ZXAgYGFkdmFuY2VgIG1ldGhvZCwgdGhlIGN1cnNvciBhbHNvIHByb3ZpZGVzIGFuIGBhZHZhbmNlTXVsdGlwbGVgIG1ldGhvZCBmb3IgZGVzY2VuZGluZworbXVsdGlwbGUgc3RlcHMgZG93biB3aGVuIHRoaXMgaXMga25vd24gdG8gYmUgZWZmaWNpZW50LiBJZiBpdCBpcyBub3QgZmVhc2libGUgdG8gZGVzY2VuZCAoZS5nLiBiZWNhdXNlIHRoZXJlIGFyZSBubworY2hpbGRyZW4sIG9yIGJlY2F1c2UgZ2V0dGluZyB0byB0aGUgY2hpbGQgb2YgdGhlIGZpcnN0IGNoaWxkIHJlcXVpcmVzIGEgcGFnZSBmZXRjaCBmcm9tIGRpc2spLCBgYWR2YW5jZU11bHRpcGxlYCB3aWxsCithY3QganVzdCBsaWtlIGBhZHZhbmNlYC4KKworRm9yIGNvbnZlbmllbmNlLCB0aGUgaW50ZXJmYWNlIGFsc28gcHJvdmlkZXMgYW4gYGFkdmFuY2VUb0NvbnRlbnRgIG1ldGhvZCBmb3Igd2Fsa2luZyB0byB0aGUgbmV4dCBub2RlIHdpdGggbm9uLW51bGwKK2NvbnRlbnQuIFRoaXMgaXMgaW1wbGVtZW50ZWQgdmlhIGBhZHZhbmNlTXVsdGlwbGVgLgorCitXaGVuIHRoZSBjdXJzb3IgaXMgY3JlYXRlZCBpdCBpcyBwbGFjZWQgb24gdGhlIHJvb3Qgbm9kZSB3aXRoIGBkZXB0aCgpID0gMGAsIGBpbmNvbWluZ1RyYW5zaXRpb24oKSA9IC0xYC4gU2luY2UKK3RyaWVzIGNhbiBoYXZlIG1hcHBpbmdzIGZvciBlbXB0eSwgYGNvbnRlbnQoKWAgY2FuIHBvc3NpYmx5IGJlIG5vbi1udWxsIGluIHRoZSBzdGFydGluZyBwb3NpdGlvbi4gSXQgaXMgbm90IGFsbG93ZWQKK2ZvciBhIGN1cnNvciB0byBzdGFydCBpbiBleGhhdXN0ZWQgc3RhdGUgKGkuZS4gd2l0aCBgZGVwdGgoKSA9IC0xYCkuCisKKyMjIyBVc2luZyBjdXJzb3JzIGluIHBhcmFsbGVsCisKK09uZSBpbXBvcnRhbnQgZmVhdHVyZSBvZiBjdXJzb3JzIGlzIHRoZSBmYWN0IHRoYXQgd2UgY2FuIGVhc2lseSB3YWxrIHRoZW0gaW4gcGFyYWxsZWwuIE1vcmUgcHJlY2lzZWx5LCB3aGVuIHdlIHVzZSBhIAorcHJvY2VkdXJlIHdoZXJlIHdlIG9ubHkgYWR2YW5jZSB0aGUgc21hbGxlciwgb3IgYm90aCBpZiB0aGV5IGFyZSBlcXVhbCwgd2UgY2FuIGNvbXBhcmUgdGhlIGN1cnNvcnMnIHN0YXRlIGJ5OgorLSB0aGUgcmV2ZXJzZSBvcmRlciBvZiB0aGVpciBjdXJyZW50IGRlcHRoIChpLmUuIGhpZ2hlciBkZXB0aCBmaXJzdCksCistIGlmIGRlcHRocyBhcmUgZXF1YWwsIHRoZSBvcmRlciBvZiB0aGVpciBjdXJyZW50IGluY29taW5nIHRyYW5zaXRpb24gKGxleGljb2dyYXBoaWNhbGx5IHNtYWxsZXIgZmlyc3QpLgorCitXZSBjYW4gcHJvdmUgdGhpcyBieSBpbmR1Y3Rpb24sIHdoZXJlIGZvciB0d28gY3Vyc29ycyBgYWAgYW5kIGBiYCB3ZSBtYWludGFpbiB0aGF0OgorMS4gZm9yIGFueSBkZXB0aCBgaSA8IG1pbmRlcHRoIC0gMWAsIGBwYXRoKGEpW2ldID09IHBhdGgoYilbaV1gCisyLiBpZiBgYS5kZXB0aCA8IGIuZGVwdGhgLCB0aGVuIGBwYXRoKGEpW21pbmRlcHRoIC0gMV0gPiBwYXRoKGIpW21pbmRlcHRoIC0gMV1gCiszLiBpZiBgYS5kZXB0aCA+IGIuZGVwdGhgLCB0aGVuIGBwYXRoKGEpW21pbmRlcHRoIC0gMV0gPCBwYXRoKGIpW21pbmRlcHRoIC0gMV1gCisKK3doZXJlIGBtaW5kZXB0aCA9IG1pbihhLmRlcHRoLCBiLmRlcHRoKWAgYW5kIGBwYXRoKGN1cnNvcilgIGlzIHRoZSBwYXRoIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5vZGUgdGhlIGN1cnNvciBpcworcG9zaXRpb25lZCBhdC4gTm90ZSB0aGF0IGBwYXRoKGN1cnNvcilbY3Vyc29yLmRlcHRoIC0gMV0gPT0gY3Vyc29yLmluY29taW5nVHJhbnNpdGlvbmAuCisKK1RoZXNlIGNvbmRpdGlvbnMgZW5zdXJlIHRoYXQgYHBhdGgoYSkgPCBwYXRoKGIpYCBpZiBhbmQgb25seSBpZiBgYS5kZXB0aCA+IGIuZGVwdGhgIG9yIGBhLmRlcHRoID09IGIuZGVwdGhgIGFuZCAKK2BhLmluY29taW5nVHJhbnNpdGlvbiA8IGIuaW5jb21pbmdUcmFuc2l0aW9uYC4gSW5kZWVkLCBpZiB0aGUgc2Vjb25kIHBhcnQgaXMgdHJ1ZSB0aGVuIDEgYW5kIDMgZW5mb3JjZSB0aGUgZmlyc3QsCithbmQgaWYgdGhlIHNlY29uZCBwYXJ0IGlzIG5vdCB0cnVlLCBpLmUuIGBhLmRlcHRoIDw9IGIuZGVwdGhgIGFuZCAoYGEuZGVwdGggIT0gYi5kZXB0aGAgb3IgCitgYS5pbmNvbWluZ1RyYW5zaXRpb24gPj0gYi5pbmNvbWluZ1RyYW5zaXRpb25gKSwgd2hpY2ggZW50YWlscyBgYS5kZXB0aCA8IGIuZGVwdGhgIG9yIGBhLmRlcHRoID09IGIuZGVwdGhgIGFuZAorYGEuaW5jb21pbmdUcmFuc2l0aW9uID49IGIuaW5jb21pbmdUcmFuc2l0aW9uYCwgdGhlbiBieSAyIGFuZCAxIHdlIGNhbiBjb25jbHVkZSB0aGF0IGBwYXRoKGEpID49IHBhdGgoYilgLCBpLmUuIHRoZQorZmlyc3QgcGFydCBpcyBub3QgdHJ1ZSBlaXRoZXIuCisKK1RoZSBjb25kaXRpb25zIGFyZSB0cml2aWFsbHkgdHJ1ZSBmb3IgdGhlIGluaXRpYWwgc3RhdGUgd2hlcmUgYm90aCBjdXJzb3JzIGFyZSBwb3NpdGlvbmVkIGF0IHRoZSByb290IHdpdGggZGVwdGggMC4KK0Fsc28sIHdoZW4gd2UgYWR2YW5jZSBhIGN1cnNvciwgaXQgaXMgYWx3YXlzIHRoZSBjYXNlIHRoYXQgdGhlIHBhdGggb2YgdGhlIHByZXZpb3VzIHN0YXRlIGFuZCB0aGUgcGF0aCBvZiB0aGUgbmV3IHN0YXRlIAorbXVzdCBiZSB0aGUgc2FtZSBpbiBhbGwgcG9zaXRpb25zIGJlZm9yZSBpdHMgbmV3IGRlcHRoIG1pbnVzIG9uZSd0aC4gVGh1cywgaWYgdGhlIHR3byBjdXJzb3JzIGFyZSBlcXVhbCBiZWZvcmUKK2FkdmFuY2luZywgaS5lLiB0aGV5IGFyZSBwb3NpdGlvbmVkIG9uIGV4YWN0bHkgdGhlIHNhbWUgcGF0aCwgdGhlIHN0YXRlIGFmdGVyIGFkdmFuY2luZyBtdXN0IHNhdGlzZnkgY29uZGl0aW9uIDEgYWJvdmUKK2JlY2F1c2UgdGhlIGVhcmxpZXN0IGJ5dGUgaW4gZWl0aGVyIHBhdGggdGhhdCBjYW4gaGF2ZSBjaGFuZ2VkIGlzIHRoZSBvbmUgYXQgcG9zaXRpb24gYG1pbihhLmRlcHRoLCBiLmRlcHRoKSAtIDFgLgorTW9yZW92ZXIsIGlmIHRoZSBkZXB0aHMgYXJlIGRpZmZlcmVudCwgdGhlIGN1cnNvciB3aXRoIHRoZSBsb3dlciBvbmUgd2lsbCBoYXZlIGFkdmFuY2VkIGl0cyBjaGFyYWN0ZXIgaW4gcG9zaXRpb24KK2BkZXB0aCAtIDFgIHdoaWxlIHRoZSBvdGhlciBjdXJzb3IncyBjaGFyYWN0ZXIgYXQgdGhhdCBwb3NpdGlvbiB3aWxsIGhhdmUgcmVtYWluZWQgdGhlIHNhbWUsIHRodXMgY29uZGl0aW9ucyAyIGFuZCAzIGFyZQorYWxzbyBzYXRpc2ZpZWQuCisKK0lmIGBwYXRoKGEpYCB3YXMgc21hbGxlciBiZWZvcmUgYWR2YW5jaW5nIHdlIGhhdmUgdGhhdCBgYS5kZXB0aCA+PSBiLmRlcHRoYC4gVGhlIHBhcmFsbGVsIHdhbGsgd2lsbCB0aGVuIG9ubHkgYWR2YW5jZQorYGFgLiBJZiB0aGUgbmV3IGRlcHRoIG9mIGBhYCBpcyBoaWdoZXIgdGhhbiBgYmAncywgbm90aGluZyBjaGFuZ2VzIGluIGNvbmRpdGlvbnMgMS0zICh0aGUgYnl0ZXMgYmVmb3JlIGBiLmRlcHRoYCBkbyAKK25vdCBjaGFuZ2UgYXQgYWxsIGluIGVpdGhlciBjdXJzb3IpLiBJZiB0aGUgbmV3IGRlcHRoIG9mIGBhYCBpcyB0aGUgc2FtZSBhcyBgYmAncywgY29uZGl0aW9uIDEgaXMgc3RpbGwgc2F0aXNmaWVkCitiZWNhdXNlIHRoZXNlIGJ5dGVzIGNhbm5vdCBoYXZlIGNoYW5nZWQsIGFuZCB0aGUgcHJlbWlzZXMgaW4gMiBhbmQgMyBhcmUgZmFsc2UuIElmIHRoZSBuZXcgZGVwdGggb2YgYGFgIGlzIGxvd2VyCit0aGFuIGBiYCdzLCBob3dldmVyLCBgYWAgbXVzdCBoYXZlIGFkdmFuY2VkIHRoZSBieXRlIGF0IGluZGV4IGBkZXB0aCAtIDFgLCBhbmQgYmVjYXVzZSAoZHVlIHRvIDEpIGl0IHdhcyBwcmV2aW91c2x5CitlcXVhbCB0byBgYmAncyBhdCB0aGlzIGluZGV4LCBpdCBtdXN0IG5vdyBiZSBoaWdoZXIsIHByb3ZpbmcgMi4gQ29uZGl0aW9uIDEgaXMgc3RpbGwgdHJ1ZSBiZWNhdXNlIHRoZXNlIGJ5dGVzIGNhbm5vdAoraGF2ZSBjaGFuZ2VkLCBhbmQgMyBpcyB0cnVlIGJlY2F1c2UgaXQgaGFzIGEgZmFsc2UgcHJlbWlzZS4KKworVGhlIHNhbWUgYXJndW1lbnQgaG9sZHMgd2hlbiBgYmAgaXMgdGhlIHNtYWxsZXIgY3Vyc29yIHRvIGJlIGFkdmFuY2VkLgorCisjIyBNZXJnaW5nIHR3byB0cmllcworCitUd28gdHJpZXMgY2FuIGJlIG1lcmdlZCB1c2luZyBgVHJpZS5tZXJnZVdpdGhgLCB3aGljaCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgY2xhc3MgYE1lcmdlVHJpZWAuIFRoZSBpbXBsZW1lbnRhdGlvbgoraXMgYSBzdHJhaWdodGZvcndhcmQgYXBwbGljYXRpb24gb2YgdGhlIHBhcmFsbGVsIHdhbGtpbmcgc2NoZW1lIGFib3ZlLCB3aGVyZSB0aGUgbWVyZ2VkIGN1cnNvciBwcmVzZW50cyB0aGUgZGVwdGgKK2FuZCBpbmNvbWluZyB0cmFuc2l0aW9uIG9mIHRoZSBjdXJyZW50bHkgc21hbGxlciBjdXJzb3IsIGFuZCBhZHZhbmNlcyBieSBhZHZhbmNpbmcgdGhlIHNtYWxsZXIgY3Vyc29yLCBvciBib3RoIGlmIHRoZXkKK2FyZSBlcXVhbC4KKworSWYgdGhlIGN1cnNvcnMgYXJlIG5vdCBlcXVhbCwgd2UgY2FuIGFsc28gYXBwbHkgYGFkdmFuY2VNdWx0aXBsZWAsIGJlY2F1c2UgaXQgY2FuIG9ubHkgYmUgZGlmZmVyZW50IGZyb20gYGFkdmFuY2VgCitpZiBpdCBkZXNjZW5kcy4gV2hlbiBhIGN1cnNvciBpcyBrbm93biB0byBiZSBzbWFsbGVyIGl0IGlzIGd1YXJhbnRlZWQgdG8gcmVtYWluIHNtYWxsZXIgd2hlbiBpdCBkZXNjZW5kcyBhcyBpdHMKK25ldyBkZXB0aCB3aWxsIGJlIGxhcmdlciB0aGFuIGJlZm9yZSBhbmQgdGh1cyBsYXJnZXIgdGhhbiB0aGUgb3RoZXIgY3Vyc29yJ3MuIFRoaXMgY2Fubm90IGJlIGRvbmUgdG8gYWR2YW5jZSBib3RoCitjdXJzb3JzIHdoZW4gdGhleSBhcmUgZXF1YWwsIGJlY2F1c2UgdGhhdCBjYW4gdmlvbGF0ZSB0aGUgY29uZGl0aW9ucy4gKFNpbXBsZSBleGFtcGxlOiBvbmUgZGVzY2VuZHMgdGhyb3VnaCAiYSIgYW5kIAordGhlIG90aGVyIHRocm91Z2ggImJiIiAmbWRhc2g7IGNvbmRpdGlvbiAyLiBpcyB2aW9sYXRlZCwgdGhlIGxhdHRlciB3aWxsIGhhdmUgaGlnaGVyIGRlcHRoIGJ1dCB3aWxsIG5vdCBiZSBzbWFsbGVyLikKKworIyMgTWVyZ2luZyBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHRyaWVzCisKK01lcmdpbmcgaXMgZXh0ZW5kZWQgdG8gYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBzb3VyY2VzIGluIGBDb2xsZWN0aW9uTWVyZ2VUcmllYCwgdXNlZCB0aHJvdWdoIHRoZSBzdGF0aWMgYFRyaWUubWVyZ2VgLgorVGhlIHByb2Nlc3MgaXMgYSBnZW5lcmFsaXphdGlvbiBvZiB0aGUgYWJvdmUsIGltcGxlbWVudGVkIHVzaW5nIHRoZSBtaW4taGVhcCBzb2x1dGlvbiBmcm9tIGBNZXJnZUl0ZXJhdG9yYCBhcHBsaWVkCit0byBjdXJzb3JzLgorCitJbiB0aGlzIHNvbHV0aW9uIGFuIGV4dHJhIGhlYWQgZWxlbWVudCBpcyBtYWludGFpbmVkIF9iZWZvcmVfIHRoZSBtaW4taGVhcCB0byBvcHRpbWl6ZSBmb3Igc2luZ2xlLXNvdXJjZSBicmFuY2hlcword2hlcmUgd2UgcHJlZmVyIHRvIGFkdmFuY2UgdXNpbmcganVzdCBvbmUgY29tcGFyaXNvbiAoaGVhZCB0byBoZWFwIHRvcCkgaW5zdGVhZCBvZiB0d28gKGhlYXAgdG9wIHRvIGl0cyB0d28gCitkZXNjZW5kYW50cykgYXQgdGhlIGV4cGVuc2Ugb2YgcG9zc2libHkgYWRkaW5nIG9uZSBhZGRpdGlvbmFsIGNvbXBhcmlzb24gaW4gdGhlIGdlbmVyYWwgY2FzZS4KKworQXMgYWJvdmUsIHdoZW4gd2Uga25vdyB0aGF0IHRoZSBoZWFkIGVsZW1lbnQgaXMgbm90IGVxdWFsIHRvIHRoZSBoZWFwIHRvcCAoaS5lLiBpdCdzIG5lY2Vzc2FyaWx5IHNtYWxsZXIpIHdlIGNhbgordXNlIGl0cyBgYWR2YW5jZU11bHRpcGxlYCBzYWZlbHkuCisKKyMjIFNsaWNpbmcgdHJpZXMKKworU2xpY2luZywgaW1wbGVtZW50ZWQgaW4gYFNsaWNlZFRyaWVgIGFuZCB1c2VkIHZpYSBgVHJpZS5zdWJ0cmllYCwgY2FuIGFsc28gYmUgc2VlbiBhcyBhIHZhcmlhdGlvbiBvZiB0aGUgcGFyYWxsZWwgCit3YWxrLiBJbiB0aGlzIGNhc2Ugd2Ugd2FsayB0aGUgc291cmNlIGFzIHdlbGwgYXMgc2luZ2xldG9ucyBvZiB0aGUgdHdvIGJvdW5kcy4KKworTW9yZSBwcmVjaXNlbHksIHdoaWxlIHRoZSBzb3VyY2UgY3Vyc29yIGlzIHNtYWxsZXIgdGhhbiB0aGUgbGVmdCBib3VuZCwgd2UgZG9uJ3QgcHJvZHVjZSBhbnkgb3V0cHV0LiBUaGF0IGlzLCB3ZQora2VlcCBhZHZhbmNpbmcgaW4gYSBsb29wLCBidXQgdG8gYXZvaWQgd2Fsa2luZyBzdWJ0cmllcyB1bm5lY2Vzc2FyaWx5LCB3ZSB1c2UgYHNraXBDaGlsZHJlbmAgaW5zdGVhZCBvZiBgYWR2YW5jZWAuCitBcyB3ZSBzYXcgYWJvdmUsIGEgc21hbGxlciBjdXJzb3IgdGhhdCBkZXNjZW5kcyByZW1haW5zIHNtYWxsZXIsIHRodXMgdGhlcmUgaXMgbm8gcG9pbnQgdG8gZG8gc28gd2hlbiB3ZSBhcmUKK2FoZWFkIG9mIHRoZSBsZWZ0IGJvdW5kLiBXaGVuIHRoZSBzb3VyY2UgbWF0Y2hlcyBhIG5vZGUgZnJvbSB0aGUgbGVmdCBib3VuZCwgd2UgZGVzY2VuZCBib3RoIGFuZCBwYXNzIHRoZQorc3RhdGUgdG8gdGhlIGNvbnN1bWVyLiBBcyBzb29uIGFzIHRoZSBzb3VyY2UgYmVjb21lcyBrbm93biBncmVhdGVyIHRoYW4gdGhlIGxlZnQgYm91bmQsIHdlIGNhbiBzdG9wIHByb2Nlc3NpbmcgCit0aGUgbGF0dGVyIGFuZCBwYXNzIGFueSBzdGF0ZSB3ZSBzZWUgdG8gdGhlIGNvbnN1bWVyLiAKKworVGhyb3VnaG91dCB0aGlzIHdlIGFsc28gcHJvY2VzcyB0aGUgcmlnaHQgYm91bmQgY3Vyc29yIGFuZCB3ZSBzdG9wIHRoZSBpdGVyYXRpb24gKGJ5IHJldHVybmluZyBgZGVwdGggPSAtMWApIAorYXMgc29vbiBhcyB0aGUgc291cmNlIGJlY29tZXMgbGFyZ2VyIHRoYW4gdGhlIHJpZ2h0IGJvdW5kLgorCitgU2xpY2VkVHJpZWAgZG9lcyBub3QgdXNlIHNpbmdsZXRvbiB0cmllcyBhbmQgY3Vyc29ycyBvdmVyIHRoZW0gYnV0IG9wdHMgdG8gaW1wbGVtZW50IHRoZW0gZGlyZWN0bHksIHVzaW5nIGFuCitpbXBsaWNpdCByZXByZXNlbnRhdGlvbiB1c2luZyBhIHBhaXIgb2YgYGRlcHRoYCBhbmQgYGluY29taW5nVHJhbnNpdGlvbmAgZm9yIGVhY2ggYm91bmQuCisKK0luIHNsaWNlcyB3ZSBjYW4gYWxzbyB1c2UgYGFkdmFuY2VNdWx0aXBsZWAgd2hlbiB3ZSBhcmUgY2VydGFpbiB0byBiZSBzdHJpY3RseSBpbnNpZGUgdGhlIHNsaWNlLCBpLmUuIGJleW9uZCB0aGUKK2xlZnQgYm91bmQgYW5kIGJlZm9yZSBhIHByZWZpeCBvZiB0aGUgcmlnaHQgYm91bmQuIEFzIGFib3ZlLCBkZXNjZW5kaW5nIHRvIGFueSBkZXB0aCBpbiB0aGlzIGNhc2UgaXMgc2FmZSBhcyB0aGUKK3Jlc3VsdCB3aWxsIHJlbWFpbiBzbWFsbGVyIHRoYW4gdGhlIHJpZ2h0IGJvdW5kLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWVEdW1wZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWVEdW1wZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGZiMmMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvVHJpZUR1bXBlci5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzOworCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgb3JnLmFncm9uYS5EaXJlY3RCdWZmZXI7CisKKy8qKgorICogU2ltcGxlIHV0aWxpdHkgY2xhc3MgZm9yIGR1bXBpbmcgdGhlIHN0cnVjdHVyZSBvZiBhIHRyaWUgdG8gc3RyaW5nLgorICovCitjbGFzcyBUcmllRHVtcGVyPFQ+IGltcGxlbWVudHMgVHJpZS5XYWxrZXI8VCwgU3RyaW5nPgoreworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVpbGRlciBiOworICAgIHByaXZhdGUgZmluYWwgRnVuY3Rpb248VCwgU3RyaW5nPiBjb250ZW50VG9TdHJpbmc7CisgICAgaW50IG5lZWRzSW5kZW50ID0gLTE7CisgICAgaW50IGN1cnJlbnRMZW5ndGggPSAwOworCisgICAgcHVibGljIFRyaWVEdW1wZXIoRnVuY3Rpb248VCwgU3RyaW5nPiBjb250ZW50VG9TdHJpbmcpCisgICAgeworICAgICAgICB0aGlzLmNvbnRlbnRUb1N0cmluZyA9IGNvbnRlbnRUb1N0cmluZzsKKyAgICAgICAgdGhpcy5iID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5kTGluZUFuZFNldEluZGVudChpbnQgbmV3SW5kZW50KQorICAgIHsKKyAgICAgICAgbmVlZHNJbmRlbnQgPSBuZXdJbmRlbnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVzZXRQYXRoTGVuZ3RoKGludCBuZXdMZW5ndGgpCisgICAgeworICAgICAgICBjdXJyZW50TGVuZ3RoID0gbmV3TGVuZ3RoOworICAgICAgICBlbmRMaW5lQW5kU2V0SW5kZW50KG5ld0xlbmd0aCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG1heWJlSW5kZW50KCkKKyAgICB7CisgICAgICAgIGlmIChuZWVkc0luZGVudCA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBiLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmVlZHNJbmRlbnQ7ICsraSkKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgiICAiKTsKKyAgICAgICAgICAgIG5lZWRzSW5kZW50ID0gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRQYXRoQnl0ZShpbnQgbmV4dEJ5dGUpCisgICAgeworICAgICAgICBtYXliZUluZGVudCgpOworICAgICAgICArK2N1cnJlbnRMZW5ndGg7CisgICAgICAgIGIuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiUwMngiLCBuZXh0Qnl0ZSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFBhdGhCeXRlcyhEaXJlY3RCdWZmZXIgYnVmZmVyLCBpbnQgcG9zLCBpbnQgY291bnQpCisgICAgeworICAgICAgICBtYXliZUluZGVudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpCisgICAgICAgICAgICBiLmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlMDJ4IiwgYnVmZmVyLmdldEJ5dGUocG9zICsgaSkgJiAweEZGKSk7CisgICAgICAgIGN1cnJlbnRMZW5ndGggKz0gY291bnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29udGVudChUIGNvbnRlbnQpCisgICAgeworICAgICAgICBiLmFwcGVuZCgiIC0+ICIpOworICAgICAgICBiLmFwcGVuZChjb250ZW50VG9TdHJpbmcuYXBwbHkoY29udGVudCkpOworICAgICAgICBlbmRMaW5lQW5kU2V0SW5kZW50KGN1cnJlbnRMZW5ndGgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgY29tcGxldGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGIudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllRW50cmllc0l0ZXJhdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllRW50cmllc0l0ZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiM2U3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWVFbnRyaWVzSXRlcmF0b3IuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllczsKKworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworCisvKioKKyAqIENvbnZlcnRvciBvZiB0cmllIGVudHJpZXMgdG8gaXRlcmF0b3Igd2hlcmUgZWFjaCBlbnRyeSBpcyBwYXNzZWQgdGhyb3VnaCB7QGxpbmsgI21hcENvbnRlbnR9ICh0byBiZSBpbXBsZW1lbnRlZCBieQorICogZGVzY2VuZGFudHMpLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJpZUVudHJpZXNJdGVyYXRvcjxULCBWPiBleHRlbmRzIFRyaWVQYXRoUmVjb25zdHJ1Y3RvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPFY+Cit7CisgICAgcHJpdmF0ZSBmaW5hbCBUcmllLkN1cnNvcjxUPiBjdXJzb3I7CisgICAgVCBuZXh0OworICAgIGJvb2xlYW4gZ290TmV4dDsKKworICAgIHByb3RlY3RlZCBUcmllRW50cmllc0l0ZXJhdG9yKFRyaWU8VD4gdHJpZSkKKyAgICB7CisgICAgICAgIGN1cnNvciA9IHRyaWUuY3Vyc29yKCk7CisgICAgICAgIGFzc2VydCBjdXJzb3IuZGVwdGgoKSA9PSAwOworICAgICAgICBuZXh0ID0gY3Vyc29yLmNvbnRlbnQoKTsKKyAgICAgICAgZ290TmV4dCA9IG5leHQgIT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKKyAgICB7CisgICAgICAgIGlmICghZ290TmV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgbmV4dCA9IGN1cnNvci5hZHZhbmNlVG9Db250ZW50KHRoaXMpOworICAgICAgICAgICAgZ290TmV4dCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV4dCAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBWIG5leHQoKQorICAgIHsKKyAgICAgICAgZ290TmV4dCA9IGZhbHNlOworICAgICAgICBUIHYgPSBuZXh0OworICAgICAgICBuZXh0ID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIG1hcENvbnRlbnQodiwga2V5Qnl0ZXMsIGtleVBvcyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFYgbWFwQ29udGVudChUIGNvbnRlbnQsIGJ5dGVbXSBieXRlcywgaW50IGJ5dGVMZW5ndGgpOworCisgICAgLyoqCisgICAgICogSXRlcmF0b3IgcmVwcmVzZW50aW5nIHRoZSBjb250ZW50IG9mIHRoZSB0cmllIGEgc2VxdWVuY2Ugb2YgKHBhdGgsIGNvbnRlbnQpIHBhaXJzLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBBc0VudHJpZXM8VD4gZXh0ZW5kcyBUcmllRW50cmllc0l0ZXJhdG9yPFQsIE1hcC5FbnRyeTxCeXRlQ29tcGFyYWJsZSwgVD4+CisgICAgeworICAgICAgICBwdWJsaWMgQXNFbnRyaWVzKFRyaWU8VD4gdHJpZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIodHJpZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIE1hcC5FbnRyeTxCeXRlQ29tcGFyYWJsZSwgVD4gbWFwQ29udGVudChUIGNvbnRlbnQsIGJ5dGVbXSBieXRlcywgaW50IGJ5dGVMZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0b0VudHJ5KGNvbnRlbnQsIGJ5dGVzLCBieXRlTGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyA8VD4gamF2YS51dGlsLk1hcC5FbnRyeTxCeXRlQ29tcGFyYWJsZSwgVD4gdG9FbnRyeShUIGNvbnRlbnQsIGJ5dGVbXSBieXRlcywgaW50IGJ5dGVMZW5ndGgpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0TWFwLlNpbXBsZUltbXV0YWJsZUVudHJ5PD4odG9CeXRlQ29tcGFyYWJsZShieXRlcywgYnl0ZUxlbmd0aCksIGNvbnRlbnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWVFbnRyaWVzV2Fsa2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllRW50cmllc1dhbGtlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMDYwMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllRW50cmllc1dhbGtlci5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzOworCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpQ29uc3VtZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKKworLyoqCisgKiBXYWxrZXIgb2YgdHJpZSBlbnRyaWVzLCB1c2VkIHdpdGggVHJpZS5wcm9jZXNzIHRvIHdhbGsgYWxsIGNvbnRlbnQgaW4gb3JkZXIgYW5kIHByb3ZpZGUgdGhlIHBhdGggdGhyb3VnaCB3aGljaCB2YWx1ZXMKKyAqIGFyZSByZWFjaGVkLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJpZUVudHJpZXNXYWxrZXI8VCwgVj4gZXh0ZW5kcyBUcmllUGF0aFJlY29uc3RydWN0b3IgaW1wbGVtZW50cyBUcmllLldhbGtlcjxULCBWPgoreworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbnRlbnQoVCBjb250ZW50KQorICAgIHsKKyAgICAgICAgY29udGVudChjb250ZW50LCBrZXlCeXRlcywga2V5UG9zKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjb250ZW50KFQgY29udGVudCwgYnl0ZVtdIGJ5dGVzLCBpbnQgYnl0ZUxlbmd0aCk7CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRvciByZXByZXNlbnRpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIHRyaWUgYSBzZXF1ZW5jZSBvZiAocGF0aCwgY29udGVudCkgcGFpcnMuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIFdpdGhDb25zdW1lcjxUPiBleHRlbmRzIFRyaWVFbnRyaWVzV2Fsa2VyPFQsIFZvaWQ+CisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIEJpQ29uc3VtZXI8Qnl0ZUNvbXBhcmFibGUsIFQ+IGNvbnN1bWVyOworCisgICAgICAgIHB1YmxpYyBXaXRoQ29uc3VtZXIoQmlDb25zdW1lcjxCeXRlQ29tcGFyYWJsZSwgVD4gY29uc3VtZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuY29uc3VtZXIgPSBjb25zdW1lcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb250ZW50KFQgY29udGVudCwgYnl0ZVtdIGJ5dGVzLCBpbnQgYnl0ZUxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3VtZXIuYWNjZXB0KHRvQnl0ZUNvbXBhcmFibGUoYnl0ZXMsIGJ5dGVMZW5ndGgpLCBjb250ZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVm9pZCBjb21wbGV0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvVHJpZVBhdGhSZWNvbnN0cnVjdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllUGF0aFJlY29uc3RydWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTk4ODNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvVHJpZVBhdGhSZWNvbnN0cnVjdG9yLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBvcmcuYWdyb25hLkRpcmVjdEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKKworcHVibGljIGNsYXNzIFRyaWVQYXRoUmVjb25zdHJ1Y3RvciBpbXBsZW1lbnRzIFRyaWUuUmVzZXR0aW5nVHJhbnNpdGlvbnNSZWNlaXZlcgoreworICAgIHByb3RlY3RlZCBieXRlW10ga2V5Qnl0ZXMgPSBuZXcgYnl0ZVszMl07CisgICAgcHJvdGVjdGVkIGludCBrZXlQb3MgPSAwOworCisgICAgcHVibGljIHZvaWQgYWRkUGF0aEJ5dGUoaW50IG5leHRCeXRlKQorICAgIHsKKyAgICAgICAgaWYgKGtleVBvcyA+PSBrZXlCeXRlcy5sZW5ndGgpCisgICAgICAgICAgICBrZXlCeXRlcyA9IEFycmF5cy5jb3B5T2Yoa2V5Qnl0ZXMsIGtleVBvcyAqIDIpOworICAgICAgICBrZXlCeXRlc1trZXlQb3MrK10gPSAoYnl0ZSkgbmV4dEJ5dGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkUGF0aEJ5dGVzKERpcmVjdEJ1ZmZlciBidWZmZXIsIGludCBwb3MsIGludCBjb3VudCkKKyAgICB7CisgICAgICAgIGludCBuZXdQb3MgPSBrZXlQb3MgKyBjb3VudDsKKyAgICAgICAgaWYgKG5ld1BvcyA+IGtleUJ5dGVzLmxlbmd0aCkKKyAgICAgICAgICAgIGtleUJ5dGVzID0gQXJyYXlzLmNvcHlPZihrZXlCeXRlcywgTWF0aC5tYXgobmV3UG9zICsgMTYsIGtleUJ5dGVzLmxlbmd0aCAqIDIpKTsKKyAgICAgICAgYnVmZmVyLmdldEJ5dGVzKHBvcywga2V5Qnl0ZXMsIGtleVBvcywgY291bnQpOworICAgICAgICBrZXlQb3MgPSBuZXdQb3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXRQYXRoTGVuZ3RoKGludCBuZXdMZW5ndGgpCisgICAgeworICAgICAgICBrZXlQb3MgPSBuZXdMZW5ndGg7CisgICAgfQorCisgICAgc3RhdGljIEJ5dGVDb21wYXJhYmxlIHRvQnl0ZUNvbXBhcmFibGUoYnl0ZVtdIGJ5dGVzLCBpbnQgYnl0ZUxlbmd0aCkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQ29tcGFyYWJsZS5maXhlZExlbmd0aChBcnJheXMuY29weU9mKGJ5dGVzLCBieXRlTGVuZ3RoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvVHJpZVZhbHVlc0l0ZXJhdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllVmFsdWVzSXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWQzNjQyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvVHJpZVZhbHVlc0l0ZXJhdG9yLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8qKgorICogT3JkZXJlZCBpdGVyYXRvciBvZiB0cmllIGNvbnRlbnQuCisgKi8KK2NsYXNzIFRyaWVWYWx1ZXNJdGVyYXRvcjxUPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPFQ+Cit7CisgICAgcHJpdmF0ZSBmaW5hbCBUcmllLkN1cnNvcjxUPiBjdXJzb3I7CisgICAgVCBuZXh0OworICAgIGJvb2xlYW4gZ290TmV4dDsKKworICAgIHByb3RlY3RlZCBUcmllVmFsdWVzSXRlcmF0b3IoVHJpZTxUPiB0cmllKQorICAgIHsKKyAgICAgICAgY3Vyc29yID0gdHJpZS5jdXJzb3IoKTsKKyAgICAgICAgYXNzZXJ0IGN1cnNvci5kZXB0aCgpID09IDA7CisgICAgICAgIG5leHQgPSBjdXJzb3IuY29udGVudCgpOworICAgICAgICBnb3ROZXh0ID0gbmV4dCAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKQorICAgIHsKKyAgICAgICAgaWYgKCFnb3ROZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBuZXh0ID0gY3Vyc29yLmFkdmFuY2VUb0NvbnRlbnQobnVsbCk7CisgICAgICAgICAgICBnb3ROZXh0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXh0ICE9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIFQgbmV4dCgpCisgICAgeworICAgICAgICBnb3ROZXh0ID0gZmFsc2U7CisgICAgICAgIFQgdiA9IG5leHQ7CisgICAgICAgIG5leHQgPSBudWxsOworICAgICAgICByZXR1cm4gdjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aWV3L1ZpZXcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpZXcvVmlldy5qYXZhCmluZGV4IGQ4MTNkMGUuLmEzZWNjMzMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpZXcvVmlldy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpZXcvVmlldy5qYXZhCkBAIC0zNSw2ICszNSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVmlld01ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2xpZW50U3RhdGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKQEAgLTE3Nyw3ICsxNzgsNyBAQAogCiAgICAgICAgICAgICByYXdTZWxlY3Quc2V0QmluZFZhcmlhYmxlcyhDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7CiAKLSAgICAgICAgICAgIHNlbGVjdCA9IHJhd1NlbGVjdC5wcmVwYXJlKHRydWUpOworICAgICAgICAgICAgc2VsZWN0ID0gcmF3U2VsZWN0LnByZXBhcmUoQ2xpZW50U3RhdGUuZm9ySW50ZXJuYWxDYWxscygpLCB0cnVlKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBzZWxlY3Q7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aWV3L1ZpZXdNYW5hZ2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aWV3L1ZpZXdNYW5hZ2VyLmphdmEKaW5kZXggMTExZjk2YS4uMTA2YTE1ZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlldy9WaWV3TWFuYWdlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpZXcvVmlld01hbmFnZXIuamF2YQpAQCAtMzYsNiArMzYsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5WaWV3czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTVZfRU5BQkxFX0NPT1JESU5BVE9SX0JBVENITE9HOworCiAvKioKICAqIE1hbmFnZXMge0BsaW5rIFZpZXd9J3MgZm9yIGEgc2luZ2xlIHtAbGluayBDb2x1bW5GYW1pbHlTdG9yZX0uIEFsbCBvZiB0aGUgdmlld3MgZm9yIHRoYXQgdGFibGUgYXJlIGNyZWF0ZWQgd2hlbiB0aGlzCiAgKiBtYW5hZ2VyIGlzIGluaXRpYWxpemVkLgpAQCAtNTcsNyArNTksNyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaXBlZDxMb2NrPiBMT0NLUyA9IFN0cmlwZWQubGF6eVdlYWtMb2NrKERhdGFiYXNlRGVzY3JpcHRvci5nZXRDb25jdXJyZW50Vmlld1dyaXRlcnMoKSAqIDEwMjQpOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBlbmFibGVDb29yZGluYXRvckJhdGNobG9nID0gQm9vbGVhbi5nZXRCb29sZWFuKCJjYXNzYW5kcmEubXZfZW5hYmxlX2Nvb3JkaW5hdG9yX2JhdGNobG9nIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBlbmFibGVDb29yZGluYXRvckJhdGNobG9nID0gTVZfRU5BQkxFX0NPT1JESU5BVE9SX0JBVENITE9HLmdldEJvb2xlYW4oKTsKIAogICAgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudE1hcDxTdHJpbmcsIFZpZXc+IHZpZXdzQnlOYW1lID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKICAgICBwcml2YXRlIGZpbmFsIENvbmN1cnJlbnRNYXA8VGFibGVJZCwgVGFibGVWaWV3cz4gdmlld3NCeUJhc2VUYWJsZSA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL0NsaWVudHNUYWJsZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9DbGllbnRzVGFibGUuamF2YQppbmRleCBkMzljMjY5Li4wMjdiYjliIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL0NsaWVudHNUYWJsZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvQ2xpZW50c1RhYmxlLmphdmEKQEAgLTQwLDYgKzQwLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NMX0VOQUJMRUQgPSAic3NsX2VuYWJsZWQiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTU0xfUFJPVE9DT0wgPSAic3NsX3Byb3RvY29sIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NMX0NJUEhFUl9TVUlURSA9ICJzc2xfY2lwaGVyX3N1aXRlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0VfTkFNRSA9ICJrZXlzcGFjZV9uYW1lIjsKIAogICAgIENsaWVudHNUYWJsZShTdHJpbmcga2V5c3BhY2UpCiAgICAgewpAQCAtNjAsNiArNjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZ3VsYXJDb2x1bW4oU1NMX0VOQUJMRUQsIEJvb2xlYW5UeXBlLmluc3RhbmNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZ3VsYXJDb2x1bW4oU1NMX1BST1RPQ09MLCBVVEY4VHlwZS5pbnN0YW5jZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWd1bGFyQ29sdW1uKFNTTF9DSVBIRVJfU1VJVEUsIFVURjhUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZ3VsYXJDb2x1bW4oS0VZU1BBQ0VfTkFNRSwgVVRGOFR5cGUuaW5zdGFuY2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CiAgICAgfQogCkBAIC04Myw3ICs4NSw4IEBACiAgICAgICAgICAgICAgICAgICAuY29sdW1uKFJFUVVFU1RfQ09VTlQsIGNsaWVudC5yZXF1ZXN0Q291bnQoKSkKICAgICAgICAgICAgICAgICAgIC5jb2x1bW4oU1NMX0VOQUJMRUQsIGNsaWVudC5zc2xFbmFibGVkKCkpCiAgICAgICAgICAgICAgICAgICAuY29sdW1uKFNTTF9QUk9UT0NPTCwgY2xpZW50LnNzbFByb3RvY29sKCkub3JFbHNlKG51bGwpKQotICAgICAgICAgICAgICAgICAgLmNvbHVtbihTU0xfQ0lQSEVSX1NVSVRFLCBjbGllbnQuc3NsQ2lwaGVyU3VpdGUoKS5vckVsc2UobnVsbCkpOworICAgICAgICAgICAgICAgICAgLmNvbHVtbihTU0xfQ0lQSEVSX1NVSVRFLCBjbGllbnQuc3NsQ2lwaGVyU3VpdGUoKS5vckVsc2UobnVsbCkpCisgICAgICAgICAgICAgICAgICAuY29sdW1uKEtFWVNQQUNFX05BTUUsIGNsaWVudC5rZXlzcGFjZSgpLm9yRWxzZShudWxsKSk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9Mb2dNZXNzYWdlc1RhYmxlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL0xvZ01lc3NhZ2VzVGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTAzYWMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9Mb2dNZXNzYWdlc1RhYmxlLmphdmEKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5zcGkuTG9nZ2luZ0V2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVGltZXN0YW1wVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVURjhUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Mb2NhbFBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworCisvKioKKyAqIFZpcnR1YWwgdGFibGUgZm9yIGhvbGRpbmcgQ2Fzc2FuZHJhIGxvZ3MuIEVudHJpZXMgdG8gdGhpcyB0YWJsZSBhcmUgYWRkZWQgdmlhIGxvZyBhcHBlbmRlci4KKyAqIDxwPgorICogVGhlIHZpcnR1YWwgdGFibGUgaXMgYm91bmRlZCBpbiBpdHMgc2l6ZS4gSWYgYSBuZXcgbG9nIG1lc3NhZ2UgaXMgYXBwZW5kZWQgdG8gdmlydHVhbCB0YWJsZSwKKyAqIHRoZSBvbGRlc3Qgb25lIGlzIHJlbW92ZWQuCisgKiA8cD4KKyAqIFRoaXMgdmlydHVhbCB0YWJsZSBjYW4gYmUgdHJ1bmNhdGVkLgorICogPHA+CisgKiBUaGlzIHRhYmxlIGRvZXMgbm90IGVuYWJsZSB7QGNvZGUgQUxMT1cgRklMVEVSSU5HfSBpbXBsaWNpdGx5LgorICoKKyAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMTgyMzgiPkNBU1NBTkRSQS0xODIzODwvYT4KKyAqIEBzZWUgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubG9nZ2luZy5WaXJ0dWFsVGFibGVBcHBlbmRlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTG9nTWVzc2FnZXNUYWJsZSBleHRlbmRzIEFic3RyYWN0TXV0YWJsZVZpcnR1YWxUYWJsZQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihMb2dNZXNzYWdlc1RhYmxlLmNsYXNzKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPR1NfVklSVFVBTF9UQUJMRV9NSU5fUk9XUyA9IDEwMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9HU19WSVJUVUFMX1RBQkxFX0RFRkFVTFRfUk9XUyA9IDUwXzAwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0dTX1ZJUlRVQUxfVEFCTEVfTUFYX1JPV1MgPSAxMDBfMDAwOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJzeXN0ZW1fbG9ncyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX0NPTU1FTlQgPSAiQ2Fzc2FuZHJhIGxvZ3MiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRVNUQU1QX0NPTFVNTl9OQU1FID0gInRpbWVzdGFtcCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HR0VSX0NPTFVNTl9OQU1FID0gImxvZ2dlciI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JERVJfSU5fTUlMTElTRUNPTkRfQ09MVU1OX05BTUUgPSAib3JkZXJfaW5fbWlsbGlzZWNvbmQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFVkVMX0NPTFVNTl9OQU1FID0gImxldmVsIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0NPTFVNTl9OQU1FID0gIm1lc3NhZ2UiOworCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PExvZ01lc3NhZ2U+IGJ1ZmZlcjsKKworICAgIExvZ01lc3NhZ2VzVGFibGUoU3RyaW5nIGtleXNwYWNlKQorICAgIHsKKyAgICAgICAgdGhpcyhrZXlzcGFjZSwgcmVzb2x2ZUJ1ZmZlclNpemUoKSk7CisgICAgfQorCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgTG9nTWVzc2FnZXNUYWJsZShTdHJpbmcga2V5c3BhY2UsIGludCBzaXplKQorICAgIHsKKyAgICAgICAgc3VwZXIoVGFibGVNZXRhZGF0YS5idWlsZGVyKGtleXNwYWNlLCBUQUJMRV9OQU1FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbW1lbnQoVEFCTEVfQ09NTUVOVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5raW5kKFRhYmxlTWV0YWRhdGEuS2luZC5WSVJUVUFMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhcnRpdGlvbmVyKG5ldyBMb2NhbFBhcnRpdGlvbmVyKFRpbWVzdGFtcFR5cGUuaW5zdGFuY2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFBhcnRpdGlvbktleUNvbHVtbihUSU1FU1RBTVBfQ09MVU1OX05BTUUsIFRpbWVzdGFtcFR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2x1c3RlcmluZ0NvbHVtbihPUkRFUl9JTl9NSUxMSVNFQ09ORF9DT0xVTU5fTkFNRSwgSW50MzJUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZ3VsYXJDb2x1bW4oTE9HR0VSX0NPTFVNTl9OQU1FLCBVVEY4VHlwZS5pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWd1bGFyQ29sdW1uKExFVkVMX0NPTFVNTl9OQU1FLCBVVEY4VHlwZS5pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWd1bGFyQ29sdW1uKE1FU1NBR0VfQ09MVU1OX05BTUUsIFVURjhUeXBlLmluc3RhbmNlKS5idWlsZCgpKTsKKworICAgICAgICBsb2dnZXIuZGVidWcoImNhcGFjaXR5IG9mIHZpcnR1YWwgdGFibGUge30gaXMgc2V0IHRvIGJlIGF0IG1vc3Qge30gcm93cyIsIG1ldGFkYXRhKCkudG9TdHJpbmcoKSwgc2l6ZSk7CisgICAgICAgIGJ1ZmZlciA9IEJvdW5kZWRMaW5rZWRMaXN0LmNyZWF0ZShzaXplKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRGF0YVNldCBkYXRhKCkKKyAgICB7CisgICAgICAgIFNpbXBsZURhdGFTZXQgcmVzdWx0ID0gbmV3IFNpbXBsZURhdGFTZXQobWV0YWRhdGEoKSwgRGVjb3JhdGVkS2V5LmNvbXBhcmF0b3IucmV2ZXJzZWQoKSk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChidWZmZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgbWlsbGlTZWNvbmRzT2ZQcmV2aW91c0xvZyA9IDA7CisgICAgICAgICAgICBsb25nIG1pbGxpU2Vjb25kc09mQ3VycmVudExvZzsKKworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKworICAgICAgICAgICAgSXRlcmF0b3I8TG9nTWVzc2FnZT4gaXRlcmF0b3IgPSBidWZmZXIubGlzdEl0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ01lc3NhZ2UgbG9nID0gaXRlcmF0b3IubmV4dCgpOworCisgICAgICAgICAgICAgICAgbWlsbGlTZWNvbmRzT2ZDdXJyZW50TG9nID0gbG9nLnRpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICBpZiAobWlsbGlTZWNvbmRzT2ZQcmV2aW91c0xvZyA9PSBtaWxsaVNlY29uZHNPZkN1cnJlbnRMb2cpCisgICAgICAgICAgICAgICAgICAgICsraW5kZXg7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpbmRleCA9IDA7CisKKyAgICAgICAgICAgICAgICBtaWxsaVNlY29uZHNPZlByZXZpb3VzTG9nID0gbWlsbGlTZWNvbmRzT2ZDdXJyZW50TG9nOworCisgICAgICAgICAgICAgICAgcmVzdWx0LnJvdyhuZXcgRGF0ZShsb2cudGltZXN0YW1wKSwgaW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgLmNvbHVtbihMT0dHRVJfQ09MVU1OX05BTUUsIGxvZy5sb2dnZXIpCisgICAgICAgICAgICAgICAgICAgICAgLmNvbHVtbihMRVZFTF9DT0xVTU5fTkFNRSwgbG9nLmxldmVsKQorICAgICAgICAgICAgICAgICAgICAgIC5jb2x1bW4oTUVTU0FHRV9DT0xVTU5fTkFNRSwgbG9nLm1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGQoTG9nZ2luZ0V2ZW50IGV2ZW50KQorICAgIHsKKyAgICAgICAgYnVmZmVyLmFkZChuZXcgTG9nTWVzc2FnZShldmVudCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRydW5jYXRlKCkKKyAgICB7CisgICAgICAgIGJ1ZmZlci5jbGVhcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGFsbG93RmlsdGVyaW5nSW1wbGljaXRseSgpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgc3RhdGljIGludCByZXNvbHZlQnVmZmVyU2l6ZSgpCisgICAgeworICAgICAgICBpbnQgc2l6ZSA9IENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5MT0dTX1ZJUlRVQUxfVEFCTEVfTUFYX1JPV1MuZ2V0SW50KCk7CisgICAgICAgIHJldHVybiAoc2l6ZSA8IExPR1NfVklSVFVBTF9UQUJMRV9NSU5fUk9XUyB8fCBzaXplID4gTE9HU19WSVJUVUFMX1RBQkxFX01BWF9ST1dTKQorICAgICAgICAgICAgICAgPyBMT0dTX1ZJUlRVQUxfVEFCTEVfREVGQVVMVF9ST1dTIDogc2l6ZTsKKyAgICB9CisKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExvZ01lc3NhZ2UKKyAgICB7CisgICAgICAgIHB1YmxpYyBmaW5hbCBsb25nIHRpbWVzdGFtcDsKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBsb2dnZXI7CisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbGV2ZWw7CisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKKworICAgICAgICBwdWJsaWMgTG9nTWVzc2FnZShMb2dnaW5nRXZlbnQgZXZlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMoZXZlbnQuZ2V0VGltZVN0YW1wKCksIGV2ZW50LmdldExvZ2dlck5hbWUoKSwgZXZlbnQuZ2V0TGV2ZWwoKS50b1N0cmluZygpLCBldmVudC5nZXRGb3JtYXR0ZWRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExvZ01lc3NhZ2UobG9uZyB0aW1lc3RhbXAsIFN0cmluZyBsb2dnZXIsIFN0cmluZyBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7CisgICAgICAgICAgICB0aGlzLmxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQm91bmRlZExpbmtlZExpc3Q8VD4gZXh0ZW5kcyBMaW5rZWRMaXN0PFQ+CisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtYXhTaXplOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgPFQ+IExpc3Q8VD4gY3JlYXRlKGludCBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChuZXcgQm91bmRlZExpbmtlZExpc3Q8PihzaXplKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEJvdW5kZWRMaW5rZWRMaXN0KGludCBtYXhTaXplKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm1heFNpemUgPSBtYXhTaXplOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGFkZChUIHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzaXplKCkgPT0gbWF4U2l6ZSkKKyAgICAgICAgICAgICAgICByZW1vdmVMYXN0KCk7CisKKyAgICAgICAgICAgIGFkZEZpcnN0KHQpOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvUXVlcmllc1RhYmxlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1F1ZXJpZXNUYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYmE2MWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1F1ZXJpZXNUYWJsZS5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LkRlYnVnZ2FibGVUYXNrOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuU2hhcmVkRXhlY3V0b3JQb29sOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTG9uZ1R5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTG9jYWxQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuTG9uZy5tYXg7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk5BTk9TRUNPTkRTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Nb25vdG9uaWNDbG9jay5HbG9iYWwuYXBwcm94VGltZTsKKworLyoqCisgKiBWaXJ0dWFsIHRhYmxlIHRoYXQgbGlzdHMgY3VycmVudGx5IHJ1bm5pbmcgcXVlcmllcyBvbiB0aGUgTlRSIChjb29yZGluYXRvcikgYW5kIFJlYWQvTXV0YXRpb24gKGxvY2FsKSBzdGFnZXMKKyAqCisgKiBFeGFtcGxlOgorICogPHByZT4KKyAqIGNxbHNoPiBTRUxFQ1QgKiBGUk9NIHN5c3RlbV92aWV3cy5xdWVyaWVzOworICoKKyAqICB0aHJlYWRfaWQgICAgICAgICAgICAgICAgICAgfCBxdWV1ZWRfbWljcm9zIHwgIHJ1bm5pbmdfbWljcm9zIHwgdGFzaworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIE5hdGl2ZS1UcmFuc3BvcnQtUmVxdWVzdHMtNyB8ICAgICAgICAgNzI5MjMgfCAgICAgICAgICAgIDc2MTEgfCAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBzZWxlY3QgKiBmcm9tIHN5c3RlbV92aWV3cy5xdWVyaWVzOyBbcGFnZVNpemUgPSAxMDBdCisgKiAgICAgICAgICAgICAgTXV0YXRpb25TdGFnZS0yIHwgICAgICAgICAxODI0OSB8ICAgICAgICAgICAgMjA4NCB8IE11dGF0aW9uKGtleXNwYWNlPSdkaXN0cmlidXRlZF90ZXN0X2tleXNwYWNlJywga2V5PScwMDAwMDBmOCcsIG1vZGlmaWNhdGlvbnMuLi4KKyAqICAgICAgICAgICAgICAgICAgUmVhZFN0YWdlLTIgfCAgICAgICAgIDcyNDQ3IHwgICAgICAgICAgIDEwMTIxIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAqIEZST00ga2V5c3BhY2UudGFibGUgTElNSVQgNTAwMAorICogPC9wcmU+CisgKi8gICAgCitmaW5hbCBjbGFzcyBRdWVyaWVzVGFibGUgZXh0ZW5kcyBBYnN0cmFjdFZpcnR1YWxUYWJsZQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9OQU1FID0gInF1ZXJpZXMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJ0aHJlYWRfaWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVVRUQgPSAicXVldWVkX21pY3JvcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTk5JTkcgPSAicnVubmluZ19taWNyb3MiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDID0gInRhc2siOworCisgICAgUXVlcmllc1RhYmxlKFN0cmluZyBrZXlzcGFjZSkKKyAgICB7CisgICAgICAgIHN1cGVyKFRhYmxlTWV0YWRhdGEuYnVpbGRlcihrZXlzcGFjZSwgVEFCTEVfTkFNRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb21tZW50KCJMaXN0cyBjdXJyZW50bHkgcnVubmluZyBxdWVyaWVzIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5raW5kKFRhYmxlTWV0YWRhdGEuS2luZC5WSVJUVUFMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhcnRpdGlvbmVyKG5ldyBMb2NhbFBhcnRpdGlvbmVyKFVURjhUeXBlLmluc3RhbmNlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB0aHJlYWQgbmFtZSBpcyB1bmlxdWUgc2luY2UgdGhlIGlkIGdpdmVuIHRvIGVhY2ggU0VQV29ya2VyIGlzIHVuaXF1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFBhcnRpdGlvbktleUNvbHVtbihJRCwgVVRGOFR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVndWxhckNvbHVtbihRVUVVRUQsIExvbmdUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZ3VsYXJDb2x1bW4oUlVOTklORywgTG9uZ1R5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVndWxhckNvbHVtbihERVNDLCBVVEY4VHlwZS5pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWxrcyB0aGUge0BsaW5rIFNoYXJlZEV4ZWN1dG9yUG9vbH0gd29ya2VycyBmb3IgYW55IHtAbGluayBEZWJ1Z2dhYmxlVGFza30gaW5zdGFuY2VzIGFuZCBwb3B1bGF0ZXMgdGhlIHRhYmxlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEYXRhU2V0IGRhdGEoKQorICAgIHsKKyAgICAgICAgU2ltcGxlRGF0YVNldCByZXN1bHQgPSBuZXcgU2ltcGxlRGF0YVNldChtZXRhZGF0YSgpKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoRGVidWdnYWJsZVRhc2suUnVubmluZ0RlYnVnZ2FibGVUYXNrIHRhc2sgOiBTaGFyZWRFeGVjdXRvclBvb2wuU0hBUkVELnJ1bm5pbmdUYXNrcygpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXRhc2suaGFzVGFzaygpKSBjb250aW51ZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbG9uZyBjcmVhdGlvblRpbWVOYW5vcyA9IHRhc2suY3JlYXRpb25UaW1lTmFub3MoKTsKKyAgICAgICAgICAgIGxvbmcgc3RhcnRUaW1lTmFub3MgPSB0YXNrLnN0YXJ0VGltZU5hbm9zKCk7CisgICAgICAgICAgICBsb25nIG5vdyA9IGFwcHJveFRpbWUubm93KCk7CisKKyAgICAgICAgICAgIGxvbmcgcXVldWVkTWljcm9zID0gTkFOT1NFQ09ORFMudG9NaWNyb3MobWF4KChzdGFydFRpbWVOYW5vcyA+IDAgPyBzdGFydFRpbWVOYW5vcyA6IG5vdykgLSBjcmVhdGlvblRpbWVOYW5vcywgMCkpOworICAgICAgICAgICAgbG9uZyBydW5uaW5nTWljcm9zID0gc3RhcnRUaW1lTmFub3MgPiAwID8gTkFOT1NFQ09ORFMudG9NaWNyb3Mobm93IC0gc3RhcnRUaW1lTmFub3MpIDogMDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmVzdWx0LnJvdyh0YXNrLnRocmVhZElkKCkpCisgICAgICAgICAgICAgICAgICAuY29sdW1uKFFVRVVFRCwgcXVldWVkTWljcm9zKQorICAgICAgICAgICAgICAgICAgLmNvbHVtbihSVU5OSU5HLCBydW5uaW5nTWljcm9zKQorICAgICAgICAgICAgICAgICAgLmNvbHVtbihERVNDLCB0YXNrLmRlc2NyaXB0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvU1NUYWJsZVRhc2tzVGFibGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvU1NUYWJsZVRhc2tzVGFibGUuamF2YQppbmRleCA0ODhiNTgwLi5lMmYzOGY4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1NTVGFibGVUYXNrc1RhYmxlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TU1RhYmxlVGFza3NUYWJsZS5qYXZhCkBAIC0zOCw2ICszOCw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNTVEFCTEVTID0gInNzdGFibGVzIjsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVE9UQUwgPSAidG90YWwiOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBVTklUID0gInVuaXQiOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQVJHRVRfRElSRUNUT1JZID0gInRhcmdldF9kaXJlY3RvcnkiOwogCiAgICAgU1NUYWJsZVRhc2tzVGFibGUoU3RyaW5nIGtleXNwYWNlKQogICAgIHsKQEAgLTU0LDYgKzU1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWd1bGFyQ29sdW1uKFNTVEFCTEVTLCBJbnQzMlR5cGUuaW5zdGFuY2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVndWxhckNvbHVtbihUT1RBTCwgTG9uZ1R5cGUuaW5zdGFuY2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVndWxhckNvbHVtbihVTklULCBVVEY4VHlwZS5pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWd1bGFyQ29sdW1uKFRBUkdFVF9ESVJFQ1RPUlksIFVURjhUeXBlLmluc3RhbmNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogICAgIH0KIApAQCAtNzYsNyArNzgsOCBAQAogICAgICAgICAgICAgICAgICAgLmNvbHVtbihQUk9HUkVTUywgY29tcGxldGVkKQogICAgICAgICAgICAgICAgICAgLmNvbHVtbihTU1RBQkxFUywgdGFzay5nZXRTU1RhYmxlcygpLnNpemUoKSkKICAgICAgICAgICAgICAgICAgIC5jb2x1bW4oVE9UQUwsIHRvdGFsKQotICAgICAgICAgICAgICAgICAgLmNvbHVtbihVTklULCB0YXNrLmdldFVuaXQoKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpOworICAgICAgICAgICAgICAgICAgLmNvbHVtbihVTklULCB0YXNrLmdldFVuaXQoKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpCisgICAgICAgICAgICAgICAgICAuY29sdW1uKFRBUkdFVF9ESVJFQ1RPUlksIHRhc2sudGFyZ2V0RGlyZWN0b3J5KCkpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvU2ltcGxlRGF0YVNldC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TaW1wbGVEYXRhU2V0LmphdmEKaW5kZXggNzE1ZjRmOC4uNmYzMDUyZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TaW1wbGVEYXRhU2V0LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TaW1wbGVEYXRhU2V0LmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbDsKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC01NCwxMCArNTUsMTUgQEAKIAogICAgIHByaXZhdGUgUm93IGN1cnJlbnRSb3c7CiAKKyAgICBwdWJsaWMgU2ltcGxlRGF0YVNldChUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBDb21wYXJhdG9yPERlY29yYXRlZEtleT4gY29tcGFyYXRvcikKKyAgICB7CisgICAgICAgIHN1cGVyKG5ldyBUcmVlTWFwPD4oY29tcGFyYXRvcikpOworICAgICAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7CisgICAgfQorCiAgICAgcHVibGljIFNpbXBsZURhdGFTZXQoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSkKICAgICB7Ci0gICAgICAgIHN1cGVyKG5ldyBUcmVlTWFwPD4oRGVjb3JhdGVkS2V5LmNvbXBhcmF0b3IpKTsKLSAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhOworICAgICAgICB0aGlzKG1ldGFkYXRhLCBEZWNvcmF0ZWRLZXkuY29tcGFyYXRvcik7CiAgICAgfQogCiAgICAgcHVibGljIFNpbXBsZURhdGFTZXQgcm93KE9iamVjdC4uLiBwcmltYXJ5S2V5VmFsdWVzKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TbmFwc2hvdHNUYWJsZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TbmFwc2hvdHNUYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZGYyOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1NuYXBzaG90c1RhYmxlLmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJvb2xlYW5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTG9uZ1R5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5UaW1lc3RhbXBUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkxvY2FsUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnNuYXBzaG90LlRhYmxlU25hcHNob3Q7CisKK3B1YmxpYyBjbGFzcyBTbmFwc2hvdHNUYWJsZSBleHRlbmRzIEFic3RyYWN0VmlydHVhbFRhYmxlCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFX05BTUUgPSAia2V5c3BhY2VfbmFtZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX05BTUUgPSAidGFibGVfbmFtZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVUVfU0laRSA9ICJ0cnVlX3NpemUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSVpFX09OX0RJU0sgPSAic2l6ZV9vbl9kaXNrIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFRF9BVCA9ICJjcmVhdGVkX2F0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQSVJFU19BVCA9ICJleHBpcmVzX2F0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVBIRU1FUkFMID0gImVwaGVtZXJhbCI7CisKKyAgICBTbmFwc2hvdHNUYWJsZShTdHJpbmcga2V5c3BhY2UpCisgICAgeworICAgICAgICBzdXBlcihUYWJsZU1ldGFkYXRhLmJ1aWxkZXIoa2V5c3BhY2UsICJzbmFwc2hvdHMiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbW1lbnQoImF2YWlsYWJsZSBzbmFwc2hvdHMiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmtpbmQoVGFibGVNZXRhZGF0YS5LaW5kLlZJUlRVQUwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAucGFydGl0aW9uZXIobmV3IExvY2FsUGFydGl0aW9uZXIoVVRGOFR5cGUuaW5zdGFuY2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFBhcnRpdGlvbktleUNvbHVtbihOQU1FLCBVVEY4VHlwZS5pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbHVzdGVyaW5nQ29sdW1uKEtFWVNQQUNFX05BTUUsIFVURjhUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsdXN0ZXJpbmdDb2x1bW4oVEFCTEVfTkFNRSwgVVRGOFR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVndWxhckNvbHVtbihUUlVFX1NJWkUsIExvbmdUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZ3VsYXJDb2x1bW4oU0laRV9PTl9ESVNLLCBMb25nVHlwZS5pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWd1bGFyQ29sdW1uKENSRUFURURfQVQsIFRpbWVzdGFtcFR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVndWxhckNvbHVtbihFWFBJUkVTX0FULCBUaW1lc3RhbXBUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZ3VsYXJDb2x1bW4oRVBIRU1FUkFMLCBCb29sZWFuVHlwZS5pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRGF0YVNldCBkYXRhKCkKKyAgICB7CisgICAgICAgIFNpbXBsZURhdGFTZXQgcmVzdWx0ID0gbmV3IFNpbXBsZURhdGFTZXQobWV0YWRhdGEoKSk7CisKKyAgICAgICAgZm9yIChUYWJsZVNuYXBzaG90IHRhYmxlU25hcHNob3QgOiBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5zbmFwc2hvdE1hbmFnZXIubG9hZFNuYXBzaG90cygpKQorICAgICAgICB7CisgICAgICAgICAgICBTaW1wbGVEYXRhU2V0IHJvdyA9IHJlc3VsdC5yb3codGFibGVTbmFwc2hvdC5nZXRUYWcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZVNuYXBzaG90LmdldEtleXNwYWNlTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlU25hcHNob3QuZ2V0VGFibGVOYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2x1bW4oVFJVRV9TSVpFLCB0YWJsZVNuYXBzaG90LmNvbXB1dGVUcnVlU2l6ZUJ5dGVzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2x1bW4oU0laRV9PTl9ESVNLLCB0YWJsZVNuYXBzaG90LmNvbXB1dGVTaXplT25EaXNrQnl0ZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbHVtbihDUkVBVEVEX0FULCBuZXcgRGF0ZSh0YWJsZVNuYXBzaG90LmdldENyZWF0ZWRBdCgpLnRvRXBvY2hNaWxsaSgpKSk7CisKKyAgICAgICAgICAgIGlmICh0YWJsZVNuYXBzaG90LmlzRXhwaXJpbmcoKSkKKyAgICAgICAgICAgICAgICByb3cuY29sdW1uKEVYUElSRVNfQVQsIG5ldyBEYXRlKHRhYmxlU25hcHNob3QuZ2V0RXhwaXJlc0F0KCkudG9FcG9jaE1pbGxpKCkpKTsKKworICAgICAgICAgICAgcm93LmNvbHVtbihFUEhFTUVSQUwsIHRhYmxlU25hcHNob3QuaXNFcGhlbWVyYWwoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvU3lzdGVtUHJvcGVydGllc1RhYmxlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1N5c3RlbVByb3BlcnRpZXNUYWJsZS5qYXZhCmluZGV4IGQwOGQ2MTQuLmYxZDBkN2MgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvU3lzdGVtUHJvcGVydGllc1RhYmxlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TeXN0ZW1Qcm9wZXJ0aWVzVGFibGUuamF2YQpAQCAtNDcsMTUgKzQ3LDE1IEBACiAgICAgewogICAgICAgICBTaW1wbGVEYXRhU2V0IHJlc3VsdCA9IG5ldyBTaW1wbGVEYXRhU2V0KG1ldGFkYXRhKCkpOwogCi0gICAgICAgIFN5c3RlbS5nZXRlbnYoKS5rZXlTZXQoKQorICAgICAgICBTeXN0ZW0uZ2V0ZW52KCkua2V5U2V0KCkgLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgbmVhcmJ5ICdibG9ja1N5c3RlbVByb3BlcnR5VXNhZ2UnCiAgICAgICAgICAgICAgIC5zdHJlYW0oKQogICAgICAgICAgICAgICAuZmlsdGVyKFN5c3RlbVByb3BlcnRpZXNUYWJsZTo6aXNDYXNzYW5kcmFSZWxldmFudCkKLSAgICAgICAgICAgICAgLmZvckVhY2gobmFtZSAtPiBhZGRSb3cocmVzdWx0LCBuYW1lLCBTeXN0ZW0uZ2V0ZW52KG5hbWUpKSk7CisgICAgICAgICAgICAgIC5mb3JFYWNoKG5hbWUgLT4gYWRkUm93KHJlc3VsdCwgbmFtZSwgU3lzdGVtLmdldGVudihuYW1lKSkpOyAvLyBjaGVja3N0eWxlOiBzdXBwcmVzcyBuZWFyYnkgJ2Jsb2NrU3lzdGVtUHJvcGVydHlVc2FnZScKIAogICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnN0cmluZ1Byb3BlcnR5TmFtZXMoKQogICAgICAgICAgICAgICAuc3RyZWFtKCkKICAgICAgICAgICAgICAgLmZpbHRlcihTeXN0ZW1Qcm9wZXJ0aWVzVGFibGU6OmlzQ2Fzc2FuZHJhUmVsZXZhbnQpCi0gICAgICAgICAgICAgIC5mb3JFYWNoKG5hbWUgLT4gYWRkUm93KHJlc3VsdCwgbmFtZSwgU3lzdGVtLmdldFByb3BlcnR5KG5hbWUpKSk7CisgICAgICAgICAgICAgIC5mb3JFYWNoKG5hbWUgLT4gYWRkUm93KHJlc3VsdCwgbmFtZSwgU3lzdGVtLmdldFByb3BlcnR5KG5hbWUpKSk7IC8vIGNoZWNrc3R5bGU6IHN1cHByZXNzIG5lYXJieSAnYmxvY2tTeXN0ZW1Qcm9wZXJ0eVVzYWdlJwogCiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtNjYsNyArNjYsNyBAQAogICAgICAgICBTaW1wbGVEYXRhU2V0IHJlc3VsdCA9IG5ldyBTaW1wbGVEYXRhU2V0KG1ldGFkYXRhKCkpOwogICAgICAgICBTdHJpbmcgbmFtZSA9IFVURjhUeXBlLmluc3RhbmNlLmNvbXBvc2UocGFydGl0aW9uS2V5LmdldEtleSgpKTsKICAgICAgICAgaWYgKGlzQ2Fzc2FuZHJhUmVsZXZhbnQobmFtZSkpCi0gICAgICAgICAgICBhZGRSb3cocmVzdWx0LCBuYW1lLCBTeXN0ZW0uZ2V0UHJvcGVydHkobmFtZSwgU3lzdGVtLmdldGVudihuYW1lKSkpOworICAgICAgICAgICAgYWRkUm93KHJlc3VsdCwgbmFtZSwgU3lzdGVtLmdldFByb3BlcnR5KG5hbWUsIFN5c3RlbS5nZXRlbnYobmFtZSkpKTsgLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgbmVhcmJ5ICdibG9ja1N5c3RlbVByb3BlcnR5VXNhZ2UnCiAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1N5c3RlbVZpZXdzS2V5c3BhY2UuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvU3lzdGVtVmlld3NLZXlzcGFjZS5qYXZhCmluZGV4IGYxM2U2MWMuLjEyZGY2YzcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvU3lzdGVtVmlld3NLZXlzcGFjZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvU3lzdGVtVmlld3NLZXlzcGFjZS5qYXZhCkBAIC00Nyw2ICs0Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IEJhdGNoTWV0cmljc1RhYmxlKFZJUlRVQUxfVklFV1MpKQogICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBTdHJlYW1pbmdWaXJ0dWFsVGFibGUoVklSVFVBTF9WSUVXUykpCiAgICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IEdvc3NpcEluZm9UYWJsZShWSVJUVUFMX1ZJRVdTKSkKKyAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgUXVlcmllc1RhYmxlKFZJUlRVQUxfVklFV1MpKQorICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBMb2dNZXNzYWdlc1RhYmxlKFZJUlRVQUxfVklFV1MpKQorICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBTbmFwc2hvdHNUYWJsZShWSVJUVUFMX1ZJRVdTKSkKICAgICAgICAgICAgICAgICAgICAgLmFkZEFsbChMb2NhbFJlcGFpclRhYmxlcy5nZXRBbGwoVklSVFVBTF9WSUVXUykpCiAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1RhYmxlTWV0cmljVGFibGVzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1RhYmxlTWV0cmljVGFibGVzLmphdmEKaW5kZXggOWZmNDIxYy4uODM2OGZkOSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9UYWJsZU1ldHJpY1RhYmxlcy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvVGFibGVNZXRyaWNUYWJsZXMuamF2YQpAQCAtNzcsNyArNzcsOSBAQAogICAgICAgICAgICAgbmV3IEhpc3RvZ3JhbVRhYmxlTWV0cmljKG5hbWUsICJ0b21ic3RvbmVzX3Blcl9yZWFkIiwgdCAtPiB0LnRvbWJzdG9uZVNjYW5uZWRIaXN0b2dyYW0uY2YpLAogICAgICAgICAgICAgbmV3IEhpc3RvZ3JhbVRhYmxlTWV0cmljKG5hbWUsICJyb3dzX3Blcl9yZWFkIiwgdCAtPiB0LmxpdmVTY2FubmVkSGlzdG9ncmFtLmNmKSwKICAgICAgICAgICAgIG5ldyBTdG9yYWdlVGFibGVNZXRyaWMobmFtZSwgImRpc2tfdXNhZ2UiLCAoVGFibGVNZXRyaWNzIHQpIC0+IHQudG90YWxEaXNrU3BhY2VVc2VkKSwKLSAgICAgICAgICAgIG5ldyBTdG9yYWdlVGFibGVNZXRyaWMobmFtZSwgIm1heF9wYXJ0aXRpb25fc2l6ZSIsIChUYWJsZU1ldHJpY3MgdCkgLT4gdC5tYXhQYXJ0aXRpb25TaXplKSk7CisgICAgICAgICAgICBuZXcgU3RvcmFnZVRhYmxlTWV0cmljKG5hbWUsICJtYXhfcGFydGl0aW9uX3NpemUiLCAoVGFibGVNZXRyaWNzIHQpIC0+IHQubWF4UGFydGl0aW9uU2l6ZSksCisgICAgICAgICAgICBuZXcgU3RvcmFnZVRhYmxlTWV0cmljKG5hbWUsICJtYXhfc3N0YWJsZV9zaXplIiwgKFRhYmxlTWV0cmljcyB0KSAtPiB0Lm1heFNTVGFibGVTaXplKSwKKyAgICAgICAgICAgIG5ldyBUYWJsZU1ldHJpY1RhYmxlKG5hbWUsICJtYXhfc3N0YWJsZV9kdXJhdGlvbiIsIHQgLT4gdC5tYXhTU1RhYmxlRHVyYXRpb24sICJtYXhfc3N0YWJsZV9kdXJhdGlvbiIsIExvbmdUeXBlLmluc3RhbmNlLCAiIikpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9WaXJ0dWFsVGFibGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvVmlydHVhbFRhYmxlLmphdmEKaW5kZXggNTM3M2Y0Yy4uNTNhOWYyYSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9WaXJ0dWFsVGFibGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1ZpcnR1YWxUYWJsZS5qYXZhCkBAIC03Niw0ICs3NiwxNSBAQAogICAgICAqIFRydW5jYXRlcyBkYXRhIGZyb20gdGhlIHVuZGVybHlpbmcgc291cmNlLCBpZiBzdXBwb3J0ZWQuCiAgICAgICovCiAgICAgdm9pZCB0cnVuY2F0ZSgpOworCisgICAgLyoqCisgICAgICogVGVsbHMgd2hldGhlciB7QGNvZGUgQUxMT1cgRklMVEVSSU5HfSBpcyBpbXBsaWNpdGx5IGFkZGVkIHRvIHNlbGVjdCBzdGF0ZW1lbnQKKyAgICAgKiB3aGljaCByZXF1aXJlcyBpdC4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB7QGNvZGUgQUxMT1cgRklMVEVSSU5HfSBpcyBpbXBsaWNpdGx5IGFkZGVkIHRvIHNlbGVjdCBzdGF0ZW1lbnRzIHdoZW4gcmVxdWlyZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBkZWZhdWx0IGJvb2xlYW4gYWxsb3dGaWx0ZXJpbmdJbXBsaWNpdGx5KCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RodC9CeXRlT3JkZXJlZFBhcnRpdGlvbmVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvQnl0ZU9yZGVyZWRQYXJ0aXRpb25lci5qYXZhCmluZGV4IDNhNWRiNTIuLmFlOTI5YzggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RodC9CeXRlT3JkZXJlZFBhcnRpdGlvbmVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L0J5dGVPcmRlcmVkUGFydGl0aW9uZXIuamF2YQpAQCAtMjYsNiArMjYsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZUludmVyc2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSGV4OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk9iamVjdFNpemVzOwpAQCAtMTAyLDYgKzEwNSwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2Uub2YodG9rZW4sIHZlcnNpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBJUGFydGl0aW9uZXIgZ2V0UGFydGl0aW9uZXIoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CkBAIC0yMjIsNiArMjMxLDExIEBACiAKICAgICBwcml2YXRlIGZpbmFsIFRva2VuLlRva2VuRmFjdG9yeSB0b2tlbkZhY3RvcnkgPSBuZXcgVG9rZW4uVG9rZW5GYWN0b3J5KCkKICAgICB7CisgICAgICAgIHB1YmxpYyBUb2tlbiBmcm9tQ29tcGFyYWJsZUJ5dGVzKEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZXNUb2tlbihCeXRlU291cmNlSW52ZXJzZS5nZXRVbmVzY2FwZWRCeXRlcyhjb21wYXJhYmxlQnl0ZXMpKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIHRvQnl0ZUFycmF5KFRva2VuIHRva2VuKQogICAgICAgICB7CiAgICAgICAgICAgICBCeXRlc1Rva2VuIGJ5dGVzVG9rZW4gPSAoQnl0ZXNUb2tlbikgdG9rZW47CkBAIC0yODcsNyArMzAxLDcgQEAKICAgICAgICAgVG9rZW4gbGFzdFRva2VuID0gc29ydGVkVG9rZW5zLmdldChzb3J0ZWRUb2tlbnMuc2l6ZSgpIC0gMSk7CiAgICAgICAgIGZvciAoVG9rZW4gbm9kZSA6IHNvcnRlZFRva2VucykKICAgICAgICAgewotICAgICAgICAgICAgYWxsVG9rZW5zLnB1dChub2RlLCBuZXcgRmxvYXQoMC4wKSk7CisgICAgICAgICAgICBhbGxUb2tlbnMucHV0KG5vZGUsIDAuMEYpOwogICAgICAgICAgICAgc29ydGVkUmFuZ2VzLmFkZChuZXcgUmFuZ2U8VG9rZW4+KGxhc3RUb2tlbiwgbm9kZSkpOwogICAgICAgICAgICAgbGFzdFRva2VuID0gbm9kZTsKICAgICAgICAgfQpAQCAtMzA1LDcgKzMxOSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBTdW0gZXZlcnkgY291bnQgdXAgYW5kIGRpdmlkZSBjb3VudC90b3RhbCBmb3IgdGhlIGZyYWN0aW9uYWwgb3duZXJzaGlwLgotICAgICAgICBGbG9hdCB0b3RhbCA9IG5ldyBGbG9hdCgwLjApOworICAgICAgICBGbG9hdCB0b3RhbCA9IDAuMEY7CiAgICAgICAgIGZvciAoRmxvYXQgZiA6IGFsbFRva2Vucy52YWx1ZXMoKSkKICAgICAgICAgICAgIHRvdGFsICs9IGY7CiAgICAgICAgIGZvciAoTWFwLkVudHJ5PFRva2VuLCBGbG9hdD4gcm93IDogYWxsVG9rZW5zLmVudHJ5U2V0KCkpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvTG9jYWxQYXJ0aXRpb25lci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L0xvY2FsUGFydGl0aW9uZXIuamF2YQppbmRleCAwOWNkMmI3Li43NGExMjY0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvTG9jYWxQYXJ0aXRpb25lci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RodC9Mb2NhbFBhcnRpdGlvbmVyLmphdmEKQEAgLTI2LDcgKzI2LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNhY2hlZEhhc2hEZWNvcmF0ZWRLZXk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlQnVmZmVyQWNjZXNzb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PYmplY3RTaXplczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuSGVhcENsb25lcjsKIApAQCAtODMsNiArODYsMTIgQEAKIAogICAgIHByaXZhdGUgZmluYWwgVG9rZW4uVG9rZW5GYWN0b3J5IHRva2VuRmFjdG9yeSA9IG5ldyBUb2tlbi5Ub2tlbkZhY3RvcnkoKQogICAgIHsKKyAgICAgICAgcHVibGljIFRva2VuIGZyb21Db21wYXJhYmxlQnl0ZXMoQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlciB0b2tlbkRhdGEgPSBjb21wYXJhdG9yLmZyb21Db21wYXJhYmxlQnl0ZXMoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBjb21wYXJhYmxlQnl0ZXMsIHZlcnNpb24pOworICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2NhbFRva2VuKHRva2VuRGF0YSk7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciB0b0J5dGVBcnJheShUb2tlbiB0b2tlbikKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuICgoTG9jYWxUb2tlbil0b2tlbikudG9rZW47CkBAIC0xMTYsNyArMTI1LDcgQEAKIAogICAgIHB1YmxpYyBNYXA8VG9rZW4sIEZsb2F0PiBkZXNjcmliZU93bmVyc2hpcChMaXN0PFRva2VuPiBzb3J0ZWRUb2tlbnMpCiAgICAgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKChUb2tlbilnZXRNaW5pbXVtVG9rZW4oKSwgbmV3IEZsb2F0KDEuMCkpOworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKChUb2tlbilnZXRNaW5pbXVtVG9rZW4oKSwgMS4wRik7CiAgICAgfQogCiAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRUb2tlblZhbGlkYXRvcigpCkBAIC0xNzUsNiArMTg0LDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY29tcGFyYXRvci5hc0NvbXBhcmFibGVCeXRlcyhCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIHRva2VuLCB2ZXJzaW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgSVBhcnRpdGlvbmVyIGdldFBhcnRpdGlvbmVyKCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIExvY2FsUGFydGl0aW9uZXIudGhpczsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RodC9NdXJtdXIzUGFydGl0aW9uZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RodC9NdXJtdXIzUGFydGl0aW9uZXIuamF2YQppbmRleCBlMmRhYWM0Li41Nzk5M2E2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvTXVybXVyM1BhcnRpdGlvbmVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L011cm11cjNQYXJ0aXRpb25lci5qYXZhCkBAIC0zMyw2ICszMyw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlSW52ZXJzZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5NdXJtdXJIYXNoOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk9iamVjdFNpemVzOwogCkBAIC0xNzcsNiArMTgwLDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZS5vZih0b2tlbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIElQYXJ0aXRpb25lciBnZXRQYXJ0aXRpb25lcigpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKQEAgLTI5NCw3ICszMDMsNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vIG5vZGVzIHByZXNlbnQgaW4gdGhlIGNsdXN0ZXIuIEhhcyB0aGlzIG5vZGUgZmluaXNoZWQgc3RhcnRpbmcgdXA/Iik7CiAgICAgICAgIC8vIDEtY2FzZQogICAgICAgICBpZiAoc29ydGVkVG9rZW5zLnNpemUoKSA9PSAxKQotICAgICAgICAgICAgb3duZXJzaGlwcy5wdXQoaS5uZXh0KCksIG5ldyBGbG9hdCgxLjApKTsKKyAgICAgICAgICAgIG93bmVyc2hpcHMucHV0KGkubmV4dCgpLCAxLjBGKTsKICAgICAgICAgLy8gbi1jYXNlCiAgICAgICAgIGVsc2UKICAgICAgICAgewpAQCAtMzI2LDYgKzMzNSwxMiBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBUb2tlbi5Ub2tlbkZhY3RvcnkgdG9rZW5GYWN0b3J5ID0gbmV3IFRva2VuLlRva2VuRmFjdG9yeSgpCiAgICAgeworICAgICAgICBwdWJsaWMgVG9rZW4gZnJvbUNvbXBhcmFibGVCeXRlcyhCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIHRva2VuRGF0YSA9IEJ5dGVTb3VyY2VJbnZlcnNlLmdldFNpZ25lZExvbmcoY29tcGFyYWJsZUJ5dGVzKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTG9uZ1Rva2VuKHRva2VuRGF0YSk7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciB0b0J5dGVBcnJheShUb2tlbiB0b2tlbikKICAgICAgICAgewogICAgICAgICAgICAgTG9uZ1Rva2VuIGxvbmdUb2tlbiA9IChMb25nVG9rZW4pIHRva2VuOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L09yZGVyUHJlc2VydmluZ1BhcnRpdGlvbmVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvT3JkZXJQcmVzZXJ2aW5nUGFydGl0aW9uZXIuamF2YQppbmRleCAxNmM1ZGIxLi4yNTY2Y2JmIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvT3JkZXJQcmVzZXJ2aW5nUGFydGl0aW9uZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvT3JkZXJQcmVzZXJ2aW5nUGFydGl0aW9uZXIuamF2YQpAQCAtMzMsNiArMzMsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlSW52ZXJzZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PYmplY3RTaXplczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwpAQCAtMTI4LDYgKzEzMSwxMSBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBUb2tlbi5Ub2tlbkZhY3RvcnkgdG9rZW5GYWN0b3J5ID0gbmV3IFRva2VuLlRva2VuRmFjdG9yeSgpCiAgICAgeworICAgICAgICBwdWJsaWMgVG9rZW4gZnJvbUNvbXBhcmFibGVCeXRlcyhCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1Rva2VuKEJ5dGVTb3VyY2VJbnZlcnNlLmdldFN0cmluZyhjb21wYXJhYmxlQnl0ZXMpKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIHRvQnl0ZUFycmF5KFRva2VuIHRva2VuKQogICAgICAgICB7CiAgICAgICAgICAgICBTdHJpbmdUb2tlbiBzdHJpbmdUb2tlbiA9IChTdHJpbmdUb2tlbikgdG9rZW47CkBAIC0xOTQsNiArMjAyLDEyIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBFTVBUWV9TSVpFICsgT2JqZWN0U2l6ZXMuc2l6ZU9mKHRva2VuKTsKICAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCeXRlU291cmNlLm9mKHRva2VuLCB2ZXJzaW9uKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyBTdHJpbmdUb2tlbiBnZXRUb2tlbihCeXRlQnVmZmVyIGtleSkKQEAgLTIyMCw3ICsyMzQsNyBAQAogICAgICAgICBUb2tlbiBsYXN0VG9rZW4gPSBzb3J0ZWRUb2tlbnMuZ2V0KHNvcnRlZFRva2Vucy5zaXplKCkgLSAxKTsKICAgICAgICAgZm9yIChUb2tlbiBub2RlIDogc29ydGVkVG9rZW5zKQogICAgICAgICB7Ci0gICAgICAgICAgICBhbGxUb2tlbnMucHV0KG5vZGUsIG5ldyBGbG9hdCgwLjApKTsKKyAgICAgICAgICAgIGFsbFRva2Vucy5wdXQobm9kZSwgMC4wRik7CiAgICAgICAgICAgICBzb3J0ZWRSYW5nZXMuYWRkKG5ldyBSYW5nZTxUb2tlbj4obGFzdFRva2VuLCBub2RlKSk7CiAgICAgICAgICAgICBsYXN0VG9rZW4gPSBub2RlOwogICAgICAgICB9CkBAIC0yMzgsNyArMjUyLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFN1bSBldmVyeSBjb3VudCB1cCBhbmQgZGl2aWRlIGNvdW50L3RvdGFsIGZvciB0aGUgZnJhY3Rpb25hbCBvd25lcnNoaXAuCi0gICAgICAgIEZsb2F0IHRvdGFsID0gbmV3IEZsb2F0KDAuMCk7CisgICAgICAgIEZsb2F0IHRvdGFsID0gMC4wRjsKICAgICAgICAgZm9yIChGbG9hdCBmIDogYWxsVG9rZW5zLnZhbHVlcygpKQogICAgICAgICAgICAgdG90YWwgKz0gZjsKICAgICAgICAgZm9yIChNYXAuRW50cnk8VG9rZW4sIEZsb2F0PiByb3cgOiBhbGxUb2tlbnMuZW50cnlTZXQoKSkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RodC9SYW5kb21QYXJ0aXRpb25lci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L1JhbmRvbVBhcnRpdGlvbmVyLmphdmEKaW5kZXggMjQxYjc4NS4uMTU3NDMwMSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L1JhbmRvbVBhcnRpdGlvbmVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L1JhbmRvbVBhcnRpdGlvbmVyLmphdmEKQEAgLTI3LDYgKzI3LDggQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNhY2hlZEhhc2hEZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlQXJyYXlBY2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVCdWZmZXJBY2Nlc3NvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwpAQCAtMzQsNiArMzYsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuUGFydGl0aW9uZXJEZWZpbmVkT3JkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkd1aWRHZW5lcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT2JqZWN0U2l6ZXM7CkBAIC0xNTgsNiArMTYyLDExIEBACiAKICAgICBwcml2YXRlIGZpbmFsIFRva2VuLlRva2VuRmFjdG9yeSB0b2tlbkZhY3RvcnkgPSBuZXcgVG9rZW4uVG9rZW5GYWN0b3J5KCkKICAgICB7CisgICAgICAgIHB1YmxpYyBUb2tlbiBmcm9tQ29tcGFyYWJsZUJ5dGVzKEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmcm9tQnl0ZUFycmF5KEludGVnZXJUeXBlLmluc3RhbmNlLmZyb21Db21wYXJhYmxlQnl0ZXMoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBjb21wYXJhYmxlQnl0ZXMsIHZlcnNpb24pKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIHRvQnl0ZUFycmF5KFRva2VuIHRva2VuKQogICAgICAgICB7CiAgICAgICAgICAgICBCaWdJbnRlZ2VyVG9rZW4gYmlnSW50ZWdlclRva2VuID0gKEJpZ0ludGVnZXJUb2tlbikgdG9rZW47CkBAIC0yNDUsNiArMjU0LDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSW50ZWdlclR5cGUuaW5zdGFuY2UuYXNDb21wYXJhYmxlQnl0ZXMoQnl0ZUFycmF5QWNjZXNzb3IuaW5zdGFuY2UsIHRva2VuLnRvQnl0ZUFycmF5KCksIHZlcnNpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBJUGFydGl0aW9uZXIgZ2V0UGFydGl0aW9uZXIoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CkBAIC0yOTMsNyArMzA4LDcgQEAKICAgICAgICAgLy8gMS1jYXNlCiAgICAgICAgIGlmIChzb3J0ZWRUb2tlbnMuc2l6ZSgpID09IDEpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG93bmVyc2hpcHMucHV0KGkubmV4dCgpLCBuZXcgRmxvYXQoMS4wKSk7CisgICAgICAgICAgICBvd25lcnNoaXBzLnB1dChpLm5leHQoKSwgMS4wRik7CiAgICAgICAgIH0KICAgICAgICAgLy8gbi1jYXNlCiAgICAgICAgIGVsc2UKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RodC9SYW5nZVN0cmVhbWVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvUmFuZ2VTdHJlYW1lci5qYXZhCmluZGV4IGRkYTY4NjMuLjliNzgzM2IgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RodC9SYW5nZVN0cmVhbWVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L1JhbmdlU3RyZWFtZXIuamF2YQpAQCAtNzEsNiArNzEsNyBAQAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZXMubm90OwogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlcy5hbGw7CiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLmFueTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5SRVNFVF9CT09UU1RSQVBfUFJPR1JFU1M7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmVwbGljYS5mdWxsUmVwbGljYTsKIAogLyoqCkBAIC0yMDMsNiArMjA0LDMzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgKiBTb3VyY2UgZmlsdGVyIHdoaWNoIGV4Y2x1ZGVzIG5vZGVzIGZyb20gbG9jYWwgREMuCisgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4Y2x1ZGVMb2NhbERhdGFjZW50ZXJGaWx0ZXIgaW1wbGVtZW50cyBTb3VyY2VGaWx0ZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgSUVuZHBvaW50U25pdGNoIHNuaXRjaDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbG9jYWxEYzsKKworICAgICAgICBwdWJsaWMgRXhjbHVkZUxvY2FsRGF0YWNlbnRlckZpbHRlcihJRW5kcG9pbnRTbml0Y2ggc25pdGNoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnNuaXRjaCA9IHNuaXRjaDsKKyAgICAgICAgICAgIHRoaXMubG9jYWxEYyA9IHNuaXRjaC5nZXRMb2NhbERhdGFjZW50ZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBhcHBseShSZXBsaWNhIHJlcGxpY2EpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAhc25pdGNoLmdldERhdGFjZW50ZXIocmVwbGljYSkuZXF1YWxzKGxvY2FsRGMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbWVzc2FnZShSZXBsaWNhIHJlcGxpY2EpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAiRmlsdGVyZWQgIiArIHJlcGxpY2EgKyAiIG91dCBiZWNhdXNlIGl0IGJlbG9uZ3MgdG8gdGhlIGxvY2FsIGRhdGFjZW50ZXIiOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogU291cmNlIGZpbHRlciB3aGljaCBleGNsdWRlcyB0aGUgY3VycmVudCBub2RlIGZyb20gc291cmNlIGNhbGN1bGF0aW9ucwogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhjbHVkZUxvY2FsTm9kZUZpbHRlciBpbXBsZW1lbnRzIFNvdXJjZUZpbHRlcgpAQCAtNjY3LDMyICs2OTUsNjIgQEAKICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiS2V5c3BhY2Uge30gU291cmNlcyB7fSIsIGtleXNwYWNlLCBzb3VyY2VzKTsKICAgICAgICAgICAgIHNvdXJjZXMuYXNNYXAoKS5mb3JFYWNoKChzb3VyY2UsIGZldGNoUmVwbGljYXMpIC0+IHsKIAotICAgICAgICAgICAgICAgIC8vIGZpbHRlciBvdXQgYWxyZWFkeSBzdHJlYW1lZCByYW5nZXMKLSAgICAgICAgICAgICAgICBTeXN0ZW1LZXlzcGFjZS5BdmFpbGFibGVSYW5nZXMgYXZhaWxhYmxlID0gc3RhdGVTdG9yZS5nZXRBdmFpbGFibGVSYW5nZXMoa2V5c3BhY2UsIG1ldGFkYXRhLnBhcnRpdGlvbmVyKTsKKyAgICAgICAgICAgICAgICBMaXN0PEZldGNoUmVwbGljYT4gcmVtYWluaW5nOwogCi0gICAgICAgICAgICAgICAgUHJlZGljYXRlPEZldGNoUmVwbGljYT4gaXNBdmFpbGFibGUgPSBmZXRjaCAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNJbkZ1bGwgPSBhdmFpbGFibGUuZnVsbC5jb250YWlucyhmZXRjaC5sb2NhbC5yYW5nZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0luVHJhbnMgPSBhdmFpbGFibGUudHJhbnMuY29udGFpbnMoZmV0Y2gubG9jYWwucmFuZ2UoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0luRnVsbCAmJiAhaXNJblRyYW5zKQotICAgICAgICAgICAgICAgICAgICAgICAgLy9SYW5nZSBpcyB1bmF2YWlsYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChmZXRjaC5sb2NhbC5pc0Z1bGwoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vRm9yIGZ1bGwsIHBpY2sgb25seSByZXBsaWNhcyB3aXRoIG1hdGNoaW5nIHRyYW5zaWVudG5lc3MKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0luRnVsbCA9PSBmZXRjaC5yZW1vdGUuaXNGdWxsKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQW55IHRyYW5zaWVudCBvciBmdWxsIHdpbGwgZG8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgICAgIExpc3Q8RmV0Y2hSZXBsaWNhPiByZW1haW5pbmcgPSBmZXRjaFJlcGxpY2FzLnN0cmVhbSgpLmZpbHRlcihub3QoaXNBdmFpbGFibGUpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZy5zaXplKCkgPCBhdmFpbGFibGUuZnVsbC5zaXplKCkgKyBhdmFpbGFibGUudHJhbnMuc2l6ZSgpKQorICAgICAgICAgICAgICAgIC8vIElmIHRoZSBvcGVyYXRvcidzIHNwZWNpZmllZCB0aGV5IHdhbnQgdG8gcmVzZXQgYm9vdHN0cmFwIHByb2dyZXNzLCB3ZSBkb24ndCBjaGVjayBwcmV2aW91cyBhdHRlbXB0ZWQKKyAgICAgICAgICAgICAgICAvLyBib290c3RyYXBzIGFuZCBqdXN0IHJlc3RhcnQgd2l0aCBhbGwuCisgICAgICAgICAgICAgICAgaWYgKFJFU0VUX0JPT1RTVFJBUF9QUk9HUkVTUy5nZXRCb29sZWFuKCkpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBMaXN0PEZldGNoUmVwbGljYT4gc2tpcHBlZCA9IGZldGNoUmVwbGljYXMuc3RyZWFtKCkuZmlsdGVyKGlzQXZhaWxhYmxlKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOwotICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiU29tZSByYW5nZXMgb2Yge30gYXJlIGFscmVhZHkgYXZhaWxhYmxlLiBTa2lwcGluZyBzdHJlYW1pbmcgdGhvc2UgcmFuZ2VzLiBTa2lwcGluZyB7fS4gRnVsbHkgYXZhaWxhYmxlIHt9IFRyYW5zaWVudGx5IGF2YWlsYWJsZSB7fSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoUmVwbGljYXMsIHNraXBwZWQsIGF2YWlsYWJsZS5mdWxsLCBhdmFpbGFibGUudHJhbnMpOworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBBbHNvIHJlbW92ZSB0aGUgZmlsZXMgb24gZGlzay4gU2VlIGRpc2N1c3Npb24gaW4gQ0FTU0FORFJBLTE3Njc5CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbUtleXNwYWNlLnJlc2V0QXZhaWxhYmxlU3RyZWFtZWRSYW5nZXNGb3JLZXlzcGFjZShrZXlzcGFjZSk7CisgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IG5ldyBBcnJheUxpc3Q8PihmZXRjaFJlcGxpY2FzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmlsdGVyIG91dCBhbHJlYWR5IHN0cmVhbWVkIHJhbmdlcworICAgICAgICAgICAgICAgICAgICBTeXN0ZW1LZXlzcGFjZS5BdmFpbGFibGVSYW5nZXMgYXZhaWxhYmxlID0gc3RhdGVTdG9yZS5nZXRBdmFpbGFibGVSYW5nZXMoa2V5c3BhY2UsIG1ldGFkYXRhLnBhcnRpdGlvbmVyKTsKKworICAgICAgICAgICAgICAgICAgICBQcmVkaWNhdGU8RmV0Y2hSZXBsaWNhPiBpc0F2YWlsYWJsZSA9IGZldGNoIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNJbkZ1bGwgPSBhdmFpbGFibGUuZnVsbC5jb250YWlucyhmZXRjaC5sb2NhbC5yYW5nZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNJblRyYW5zID0gYXZhaWxhYmxlLnRyYW5zLmNvbnRhaW5zKGZldGNoLmxvY2FsLnJhbmdlKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSW5GdWxsICYmICFpc0luVHJhbnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmFuZ2UgaXMgdW5hdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmZXRjaC5sb2NhbC5pc0Z1bGwoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZnVsbCwgcGljayBvbmx5IHJlcGxpY2FzIHdpdGggbWF0Y2hpbmcgdHJhbnNpZW50bmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0luRnVsbCA9PSBmZXRjaC5yZW1vdGUuaXNGdWxsKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFueSB0cmFuc2llbnQgb3IgZnVsbCB3aWxsIGRvCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgPSBmZXRjaFJlcGxpY2FzLnN0cmVhbSgpLmZpbHRlcihub3QoaXNBdmFpbGFibGUpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcuc2l6ZSgpIDwgYXZhaWxhYmxlLmZ1bGwuc2l6ZSgpICsgYXZhaWxhYmxlLnRyYW5zLnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIG9wZXJhdG9yIGhhc24ndCBzcGVjaWZpZWQgd2hhdCB0byBkbyB3aGVuIHdlIGRpc2NvdmVyIGEgcHJldmlvdXMgcGFydGlhbGx5IHN1Y2Nlc3NmdWwgYm9vdHN0cmFwLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZXJyb3Igb3V0IGFuZCB0ZWxsIHRoZW0gdG8gbWFudWFsbHkgcmVjb25jaWxlIGl0LiBTZWUgQ0FTU0FORFJBLTE3Njc5LgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSRVNFVF9CT09UU1RSQVBfUFJPR1JFU1MuaXNQcmVzZW50KCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxGZXRjaFJlcGxpY2E+IHNraXBwZWQgPSBmZXRjaFJlcGxpY2FzLnN0cmVhbSgpLmZpbHRlcihpc0F2YWlsYWJsZSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgiRGlzY292ZXJlZCBleGlzdGluZyBib290c3RyYXAgZGF0YSBhbmQgJXMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzIG5vdCBjb25maWd1cmVkOyBhYm9ydGluZyBib290c3RyYXAuIFBsZWFzZSBjbGVhbiB1cCBsb2NhbCBmaWxlcyBtYW51YWxseSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kIHRyeSBhZ2FpbiBvciBzZXQgY2Fzc2FuZHJhLnJlc2V0X2Jvb3RzdHJhcF9wcm9ncmVzcz10cnVlIHRvIGlnbm9yZS4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvdW5kOiAlcy4gRnVsbHkgYXZhaWxhYmxlOiAlcy4gVHJhbnNpZW50bHkgYXZhaWxhYmxlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVTRVRfQk9PVFNUUkFQX1BST0dSRVNTLmdldEtleSgpLCBza2lwcGVkLCBhdmFpbGFibGUuZnVsbCwgYXZhaWxhYmxlLnRyYW5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobXNnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG1zZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUkVTRVRfQk9PVFNUUkFQX1BST0dSRVNTLmdldEJvb2xlYW4oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEZldGNoUmVwbGljYT4gc2tpcHBlZCA9IGZldGNoUmVwbGljYXMuc3RyZWFtKCkuZmlsdGVyKGlzQXZhaWxhYmxlKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJTb21lIHJhbmdlcyBvZiB7fSBhcmUgYWxyZWFkeSBhdmFpbGFibGUuIFNraXBwaW5nIHN0cmVhbWluZyB0aG9zZSByYW5nZXMuIFNraXBwaW5nIHt9LiBGdWxseSBhdmFpbGFibGUge30gVHJhbnNpZW50bHkgYXZhaWxhYmxlIHt9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaFJlcGxpY2FzLCBza2lwcGVkLCBhdmFpbGFibGUuZnVsbCwgYXZhaWxhYmxlLnRyYW5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RodC9Ub2tlbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L1Rva2VuLmphdmEKaW5kZXggZDhlODJmOC4uMzU0M2RhYiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L1Rva2VuLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L1Rva2VuLmphdmEKQEAgLTI2LDYgKzI2LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5UeXBlU2l6ZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIFRva2VuIGltcGxlbWVudHMgUmluZ1Bvc2l0aW9uPFRva2VuPiwgU2VyaWFsaXphYmxlCiB7CkBAIC0zNyw4ICszOSwzMSBAQAogICAgIHsKICAgICAgICAgcHVibGljIGFic3RyYWN0IEJ5dGVCdWZmZXIgdG9CeXRlQXJyYXkoVG9rZW4gdG9rZW4pOwogICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVG9rZW4gZnJvbUJ5dGVBcnJheShCeXRlQnVmZmVyIGJ5dGVzKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvZHVjZSBhIGJ5dGUtY29tcGFyYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdG9rZW4uCisgICAgICAgICAqIFNlZSB7QGxpbmsgVG9rZW4jYXNDb21wYXJhYmxlQnl0ZXN9CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhUb2tlbiB0b2tlbiwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdG9rZW4uYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVHJhbnNsYXRlcyB0aGUgZ2l2ZW4gYnl0ZS1jb21wYXJhYmxlIHJlcHJlc2VudGF0aW9uIHRvIGEgdG9rZW4gaW5zdGFuY2UuIElmIHRoZSBnaXZlbiBieXRlcyBkb24ndCBjb3JyZXNwb25kCisgICAgICAgICAqIHRvIHRoZSBlbmNvZGluZyBvZiBhbiBpbnN0YW5jZSBvZiB0aGUgZXhwZWN0ZWQgdG9rZW4gdHlwZSwgYW4ge0BsaW5rIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0gbWF5IGJlIHRocm93bi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbXBhcmFibGVCeXRlcyBBIGJ5dGUtY29tcGFyYWJsZSByZXByZXNlbnRhdGlvbiAocHJlc3VtYWJseSBvZiBhIHRva2VuIG9mIHNvbWUgZXhwZWN0ZWQgdG9rZW4gdHlwZSkuCisgICAgICAgICAqIEByZXR1cm4gQSBuZXcge0BsaW5rIFRva2VufSBpbnN0YW5jZSwgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYnl0ZS1vcmRlcmVkIHJlcHJlc2VudGF0aW9uLiBJZiB3ZSB3ZXJlCisgICAgICAgICAqIHRvIGNhbGwge0BsaW5rICNhc0NvbXBhcmFibGVCeXRlcyhCeXRlQ29tcGFyYWJsZS5WZXJzaW9uKX0gb24gdGhlIHJldHVybmVkIG9iamVjdCwgd2Ugc2hvdWxkIGdldCBhCisgICAgICAgICAqIHtAbGluayBCeXRlU291cmNlfSBlcXVhbCB0byB0aGUgaW5wdXQgb25lIGFzIGEgcmVzdWx0LgorICAgICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgYnl0ZXMgZG8gbm90IGVuY29kZSBhIHZhbGlkIHRva2VuLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRva2VuIGZyb21Db21wYXJhYmxlQnl0ZXMoQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbik7CisKICAgICAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyB0b1N0cmluZyhUb2tlbiB0b2tlbik7IC8vIHNlcmlhbGl6ZSBhcyBzdHJpbmcsIG5vdCBuZWNlc3NhcmlseSBodW1hbi1yZWFkYWJsZQogICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVG9rZW4gZnJvbVN0cmluZyhTdHJpbmcgc3RyaW5nKTsgLy8gZGVzZXJpYWxpemUKKwogICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB2YWxpZGF0ZShTdHJpbmcgdG9rZW4pIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uOwogCiAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShUb2tlbiB0b2tlbiwgRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KQEAgLTEwMCw2ICsxMjUsMjAgQEAKICAgICBhYnN0cmFjdCBwdWJsaWMgT2JqZWN0IGdldFRva2VuVmFsdWUoKTsKIAogICAgIC8qKgorICAgICAqIFByb2R1Y2UgYSB3ZWFrbHkgcHJlZml4LWZyZWUgYnl0ZS1jb21wYXJhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0b2tlbiwgaS5lLiBzdWNoIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgdGhhdCBhbnkKKyAgICAgKiBwYWlyIHgsIHkgb2YgdmFsaWQgdG9rZW5zIG9mIHRoaXMgdHlwZSBhbmQgYW55IGJ5dGVzIGIxLCBiMiBiZXR3ZWVuIDB4MTAgYW5kIDB4RUYsCisgICAgICogKCsgc3RhbmRzIGZvciBjb25jYXRlbmF0aW9uKQorICAgICAqICAgY29tcGFyZSh4LCB5KSA9PSBjb21wYXJlTGV4aWNvZ3JhcGhpY2FsbHlVbnNpZ25lZChhc0J5dGVDb21wYXJhYmxlKHgpK2IxLCBhc0J5dGVDb21wYXJhYmxlKHkpK2IyKQorICAgICAqIChpLmUuIHRoZSB2YWx1ZXMgY29tcGFyZSBsaWtlIHRoZSBvcmlnaW5hbCB0eXBlLCBhbmQgYW4gYWRkZWQgMHgxMC0weEVGIGJ5dGUgYXQgdGhlIGVuZCBkb2VzIG5vdCBjaGFuZ2UgdGhhdCkgYW5kOgorICAgICAqICAgYXNCeXRlQ29tcGFyYWJsZSh4KStiMSBpcyBub3QgYSBwcmVmaXggb2YgYXNCeXRlQ29tcGFyYWJsZSh5KSAgICAgICh3ZWFrbHkgcHJlZml4IGZyZWUpCisgICAgICogKGkuZS4gYSB2YWxpZCByZXByZXNlbnRhdGlvbiBvZiBhIHZhbHVlIG1heSBiZSBhIHByZWZpeCBvZiBhbm90aGVyIHZhbGlkIHJlcHJlc2VudGF0aW9uIG9mIGEgdmFsdWUgb25seSBpZiB0aGUKKyAgICAgKiBmb2xsb3dpbmcgYnl0ZSBpbiB0aGUgbGF0dGVyIGlzIHNtYWxsZXIgdGhhbiAweDEwIG9yIGxhcmdlciB0aGFuIDB4RUYpLiBUaGVzZSBwcm9wZXJ0aWVzIGFyZSB0cml2aWFsbHkgdHJ1ZSBpZgorICAgICAqIHRoZSBlbmNvZGluZyBjb21wYXJlcyBjb3JyZWN0bHkgYW5kIGlzIHByZWZpeCBmcmVlLCBidXQgYWxzbyBwZXJtaXRzIGEgbGl0dGxlIG1vcmUgZnJlZWRvbSB0aGF0IGVuYWJsZXMgc29tZXdoYXQKKyAgICAgKiBtb3JlIGVmZmljaWVudCBlbmNvZGluZyBvZiBhcmJpdHJhcnktbGVuZ3RoIGJ5dGUtY29tcGFyYWJsZSBibG9icy4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pOworCisgICAgLyoqCiAgICAgICogUmV0dXJucyBhIG1lYXN1cmUgZm9yIHRoZSB0b2tlbiBzcGFjZSBjb3ZlcmVkIGJldHdlZW4gdGhpcyB0b2tlbiBhbmQgbmV4dC4KICAgICAgKiBVc2VkIGJ5IHRoZSB0b2tlbiBhbGxvY2F0aW9uIGFsZ29yaXRobSAoc2VlIENBU1NBTkRSQS03MDMyKS4KICAgICAgKi8KQEAgLTEyOCw3ICsxNjcsNyBAQAogCiAgICAgLyoKICAgICAgKiBBIHRva2VuIGNvcnJlc3BvbmRzIHRvIHRoZSByYW5nZSBvZiBhbGwgdGhlIGtleXMgaGF2aW5nIHRoaXMgdG9rZW4uCi0gICAgICogQSB0b2tlbiBpcyB0aHVzIG5vIGNvbXBhcmFibGUgZGlyZWN0bHkgdG8gYSBrZXkuIEJ1dCB0byBiZSBhYmxlIHRvIHNlbGVjdAorICAgICAqIEEgdG9rZW4gaXMgdGh1cyBub3QgY29tcGFyYWJsZSBkaXJlY3RseSB0byBhIGtleS4gQnV0IHRvIGJlIGFibGUgdG8gc2VsZWN0CiAgICAgICoga2V5cyBnaXZlbiB0b2tlbnMsIHdlIGludHJvZHVjZSB0d28gImZha2UiIGtleXMgZm9yIGVhY2ggdG9rZW4gVDoKICAgICAgKiAgIC0gbG93ZXJCb3VuZEtleTogYSAiZmFrZSIga2V5IHJlcHJlc2VudGluZyB0aGUgbG93ZXIgYm91bmQgVCByZXByZXNlbnRzLgogICAgICAqICAgICAgICAgICAgICAgICAgICBJbiBvdGhlciB3b3JkcywgbG93ZXJCb3VuZEtleSBpcyB0aGUgc21hbGxlc3Qga2V5IHRoYXQKQEAgLTE5MCw2ICsyMjksMjAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gKChwb3MgaW5zdGFuY2VvZiBLZXlCb3VuZCkgJiYgISgoS2V5Qm91bmQpcG9zKS5pc01pbmltdW1Cb3VuZCkgPyAwIDogMTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhWZXJzaW9uIHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB0ZXJtaW5hdG9yID0gaXNNaW5pbXVtQm91bmQgPyBCeXRlU291cmNlLkxUX05FWFRfQ09NUE9ORU5UIDogQnl0ZVNvdXJjZS5HVF9ORVhUX0NPTVBPTkVOVDsKKyAgICAgICAgICAgIHJldHVybiBCeXRlU291cmNlLndpdGhUZXJtaW5hdG9yKHRlcm1pbmF0b3IsIHRva2VuLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnl0ZUNvbXBhcmFibGUgYXNDb21wYXJhYmxlQm91bmQoYm9vbGVhbiBiZWZvcmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoaXMgY2xhc3MgaXMgYWxyZWFkeSBhIGJvdW5kIHRodXMgbm90aGluZyBuZWVkcyB0byBiZSBjaGFuZ2VkIGZyb20gaXRzIHJlcHJlc2VudGF0aW9uCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBJUGFydGl0aW9uZXIgZ2V0UGFydGl0aW9uZXIoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0VG9rZW4oKS5nZXRQYXJ0aXRpb25lcigpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZXhjZXB0aW9ucy9RdWVyeUNhbmNlbGxlZEV4Y2VwdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZXhjZXB0aW9ucy9RdWVyeUNhbmNlbGxlZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YjYzMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9leGNlcHRpb25zL1F1ZXJ5Q2FuY2VsbGVkRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9uczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJlYWRDb21tYW5kOworCitwdWJsaWMgY2xhc3MgUXVlcnlDYW5jZWxsZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCit7CisgICAgcHVibGljIFF1ZXJ5Q2FuY2VsbGVkRXhjZXB0aW9uKFJlYWRDb21tYW5kIGNvbW1hbmQpCisgICAgeworICAgICAgICBzdXBlcigiUXVlcnkgY2FuY2VsbGVkIGZvciB0YWtpbmcgdG9vIGxvbmc6ICIgKyBjb21tYW5kLnRvQ1FMU3RyaW5nKCkpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9leGNlcHRpb25zL1JlcXVlc3RGYWlsdXJlUmVhc29uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9leGNlcHRpb25zL1JlcXVlc3RGYWlsdXJlUmVhc29uLmphdmEKaW5kZXggM2QzNDc2YS4uY2E2NDI5OCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZXhjZXB0aW9ucy9SZXF1ZXN0RmFpbHVyZVJlYXNvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2V4Y2VwdGlvbnMvUmVxdWVzdEZhaWx1cmVSZWFzb24uamF2YQpAQCAtMTksOCArMTksNiBAQAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuSW50czsKLQogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Ub21ic3RvbmVPdmVyd2hlbG1pbmdFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uSVZlcnNpb25lZFNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwpAQCAtMTAxLDEyICs5OSwxMiBAQAogICAgICAgICAgICAgaWYgKHZlcnNpb24gPCBWRVJTSU9OXzQwKQogICAgICAgICAgICAgICAgIG91dC53cml0ZVNob3J0KHJlYXNvbi5jb2RlKTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQocmVhc29uLmNvZGUpOworICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKHJlYXNvbi5jb2RlKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBSZXF1ZXN0RmFpbHVyZVJlYXNvbiBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmcm9tQ29kZSh2ZXJzaW9uIDwgVkVSU0lPTl80MCA/IGluLnJlYWRVbnNpZ25lZFNob3J0KCkgOiBJbnRzLmNoZWNrZWRDYXN0KGluLnJlYWRVbnNpZ25lZFZJbnQoKSkpOworICAgICAgICAgICAgcmV0dXJuIGZyb21Db2RlKHZlcnNpb24gPCBWRVJTSU9OXzQwID8gaW4ucmVhZFVuc2lnbmVkU2hvcnQoKSA6IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBsb25nIHNlcmlhbGl6ZWRTaXplKFJlcXVlc3RGYWlsdXJlUmVhc29uIHJlYXNvbiwgaW50IHZlcnNpb24pCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9nbXMvQXBwbGljYXRpb25TdGF0ZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL0FwcGxpY2F0aW9uU3RhdGUuamF2YQppbmRleCBjNDVkM2MyLi4zZjQ0YmNjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9nbXMvQXBwbGljYXRpb25TdGF0ZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9BcHBsaWNhdGlvblN0YXRlLmphdmEKQEAgLTUyLDcgKzUyLDcgQEAKICAgICAgKiB3aGljaCBuZXcgc3N0YWJsZXMgYXJlIHdyaXR0ZW4pLCBidXQgbWF5IGNvbnRhaW4gbW9yZSBvbiBuZXdseSB1cGdyYWRlZCBub2RlcyBiZWZvcmUgYHVwZ3JhZGVzc3RhYmxlYCBoYXMgYmVlbgogICAgICAqIHJ1bi4KICAgICAgKgotICAgICAqIDxwPlRoZSB2YWx1ZSAoYSBzZXQgb2Ygc3N0YWJsZSB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVmVyc2lvbkFuZFR5cGV9KSBpcyBzZXJpYWxpemVkIGFzCisgICAgICogPHA+VGhlIHZhbHVlIChhIHNldCBvZiBzc3RhYmxlIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9ufSkgaXMgc2VyaWFsaXplZCBhcwogICAgICAqIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QuCiAgICAgICoqLwogICAgIFNTVEFCTEVfVkVSU0lPTlMsCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9nbXMvRW5kcG9pbnRTdGF0ZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL0VuZHBvaW50U3RhdGUuamF2YQppbmRleCBlNzU2NzQ0Li40MjQzYzc1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9nbXMvRW5kcG9pbnRTdGF0ZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9FbmRwb2ludFN0YXRlLmphdmEKQEAgLTI5LDYgKzI5LDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5UeXBlU2l6ZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uSVZlcnNpb25lZFNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwpAQCAtNDYsNiArNDcsOCBAQAogewogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEVuZHBvaW50U3RhdGUuY2xhc3MpOwogCisgICAgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gTE9PU0VfREVGX09GX0VNUFRZX0VOQUJMRUQgPSBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTE9PU0VfREVGX09GX0VNUFRZX0VOQUJMRUQuZ2V0Qm9vbGVhbigpOworCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBJVmVyc2lvbmVkU2VyaWFsaXplcjxFbmRwb2ludFN0YXRlPiBzZXJpYWxpemVyID0gbmV3IEVuZHBvaW50U3RhdGVTZXJpYWxpemVyKCk7CiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBJVmVyc2lvbmVkU2VyaWFsaXplcjxFbmRwb2ludFN0YXRlPiBudWxsYWJsZVNlcmlhbGl6ZXIgPSBOdWxsYWJsZVNlcmlhbGl6ZXIud3JhcChzZXJpYWxpemVyKTsKIApAQCAtMTg2LDE3ICsxODksMjUgQEAKICAgICAgICAgdXBkYXRlVGltZXN0YW1wID0gbmFub1RpbWUoKTsKICAgICB9CiAKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgdm9pZCB1bnNhZmVTZXRVcGRhdGVUaW1lc3RhbXAobG9uZyB2YWx1ZSkKKyAgICB7CisgICAgICAgIHVwZGF0ZVRpbWVzdGFtcCA9IHZhbHVlOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzQWxpdmUoKQogICAgIHsKICAgICAgICAgcmV0dXJuIGlzQWxpdmU7CiAgICAgfQogCi0gICAgdm9pZCBtYXJrQWxpdmUoKQorICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyB2b2lkIG1hcmtBbGl2ZSgpCiAgICAgewogICAgICAgICBpc0FsaXZlID0gdHJ1ZTsKICAgICB9CiAKLSAgICB2b2lkIG1hcmtEZWFkKCkKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgdm9pZCBtYXJrRGVhZCgpCiAgICAgewogICAgICAgICBpc0FsaXZlID0gZmFsc2U7CiAgICAgfQpAQCAtMjA3LDcgKzIxOCwxNyBAQAogICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHlXaXRob3V0U3RhdHVzKCkKICAgICB7CiAgICAgICAgIE1hcDxBcHBsaWNhdGlvblN0YXRlLCBWZXJzaW9uZWRWYWx1ZT4gc3RhdGUgPSBhcHBsaWNhdGlvblN0YXRlLmdldCgpOwotICAgICAgICByZXR1cm4gaGJTdGF0ZS5pc0VtcHR5KCkgJiYgIShzdGF0ZS5jb250YWluc0tleShBcHBsaWNhdGlvblN0YXRlLlNUQVRVU19XSVRIX1BPUlQpIHx8IHN0YXRlLmNvbnRhaW5zS2V5KEFwcGxpY2F0aW9uU3RhdGUuU1RBVFVTKSk7CisgICAgICAgIGJvb2xlYW4gaGFzU3RhdHVzID0gc3RhdGUuY29udGFpbnNLZXkoQXBwbGljYXRpb25TdGF0ZS5TVEFUVVNfV0lUSF9QT1JUKSB8fCBzdGF0ZS5jb250YWluc0tleShBcHBsaWNhdGlvblN0YXRlLlNUQVRVUyk7CisgICAgICAgIHJldHVybiBoYlN0YXRlLmlzRW1wdHkoKSAmJiAhaGFzU3RhdHVzCisgICAgICAgICAgICAgICAvLyBJbiB0aGUgdmVyeSBzcGVjaWZpYyBjYXNlIHdoZXJlIGhiU3RhdGUuaXNFbXB0eSBhbmQgU1RBVFVTIGlzIG1pc3NpbmcsIHRoaXMgaXMga25vd24gdG8gYmUgc2FmZSB0byAiZmFrZSIKKyAgICAgICAgICAgICAgIC8vIHRoZSBkYXRhLCBhcyB0aGlzIGhhcHBlbnMgd2hlbiB0aGUgZ29zc2lwIHN0YXRlIGlzbid0IGNvbWluZyBmcm9tIHRoZSBub2RlIGJ1dCBpbnN0ZWFkIGZyb20gYSBwZWVyIHdobworICAgICAgICAgICAgICAgLy8gcmVzdGFydGVkIGFuZCBpcyBtaXNzaW5nIHRoZSBub2RlJ3Mgc3RhdGUuCisgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgLy8gV2hlbiBoYlN0YXRlIGlzIG5vdCBlbXB0eSwgdGhlbiB0aGUgbm9kZSBnb3NzaXBlZCBhbiBlbXB0eSBTVEFUVVM7IHRoaXMgaGFwcGVucyBkdXJpbmcgYm9vdHN0cmFwIGFuZCBpdCdzIG5vdAorICAgICAgICAgICAgICAgLy8gcG9zc2libGUgdG8gdGVsbCBpZiB0aGlzIGlzIG9rIG9yIG5vdCAod2UgY2FuJ3QgcmVhbGx5IHRlbGwgaWYgdGhlIG5vZGUgaXMgZGVhZCBvciBoYXZpbmcgbmV0d29ya2luZyBpc3N1ZXMpLgorICAgICAgICAgICAgICAgLy8gRm9yIHRoZXNlIGNhc2VzIGFsbG93IGFuIGV4dGVybmFsIGFjdG9yIHRvIHZlcmlmeSBhbmQgaW5mb3JtIENhc3NhbmRyYSB0aGF0IGl0IGlzIHNhZmUgLSB0aGlzIGlzIGRvbmUgYnkKKyAgICAgICAgICAgICAgIC8vIHVwZGF0aW5nIHRoZSBMT09TRV9ERUZfT0ZfRU1QVFlfRU5BQkxFRCBmaWVsZC4KKyAgICAgICAgICAgICAgIHx8IChMT09TRV9ERUZfT0ZfRU1QVFlfRU5BQkxFRCAmJiAhaGFzU3RhdHVzKTsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBpc1JwY1JlYWR5KCkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9GYWlsdXJlRGV0ZWN0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9GYWlsdXJlRGV0ZWN0b3IuamF2YQppbmRleCA1MTc3MTU0Li45Y2Y3YWQwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9nbXMvRmFpbHVyZURldGVjdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL0ZhaWx1cmVEZXRlY3Rvci5qYXZhCkBAIC0xNywyOSArMTcsNDYgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5nbXM7CiAKLWltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwotaW1wb3J0IGphdmEubmlvLmZpbGUuU3RhbmRhcmRPcGVuT3B0aW9uOwotaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKLWltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuU3RhbmRhcmRPcGVuT3B0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uKjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5Db21wb3NpdGVEYXRhOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLkNvbXBvc2l0ZURhdGFTdXBwb3J0OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLkNvbXBvc2l0ZVR5cGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uT3BlbkRhdGFFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uT3BlblR5cGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uU2ltcGxlVHlwZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5UYWJ1bGFyRGF0YTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5UYWJ1bGFyRGF0YVN1cHBvcnQ7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uVGFidWxhclR5cGU7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLlJlcGxpY2E7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNXcml0ZUVycm9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmVwbGljYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5NQmVhbldyYXBwZXI7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5GRF9JTklUSUFMX1ZBTFVFX01TOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkZEX01BWF9JTlRFUlZBTF9NUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5MSU5FX1NFUEFSQVRPUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5NQVhfTE9DQUxfUEFVU0VfSU5fTVM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3IubmV3RmFpbHVyZURldGVjdG9yOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Nb25vdG9uaWNDbG9jay5HbG9iYWwucHJlY2lzZVRpbWU7CiAKQEAgLTU1LDIxICs3MiwxOSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQU1QTEVfU0laRSA9IDEwMDA7CiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBsb25nIElOSVRJQUxfVkFMVUVfTkFOT1MgPSBUaW1lVW5pdC5OQU5PU0VDT05EUy5jb252ZXJ0KGdldEluaXRpYWxWYWx1ZSgpLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUJVR19QRVJDRU5UQUdFID0gODA7IC8vIGlmIHRoZSBwaGkgaXMgbGFyZ2VyIHRoYW4gdGhpcyBwZXJjZW50YWdlIG9mIHRoZSBtYXgsIGxvZyBhIGRlYnVnIG1lc3NhZ2UKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfTUFYX1BBVVNFID0gNTAwMEwgKiAxMDAwMDAwTDsgLy8gNSBzZWNvbmRzCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNQVhfTE9DQUxfUEFVU0VfSU5fTkFOT1MgPSBnZXRNYXhMb2NhbFBhdXNlKCk7CiAgICAgcHJpdmF0ZSBsb25nIGxhc3RJbnRlcnByZXQgPSBwcmVjaXNlVGltZS5ub3coKTsKICAgICBwcml2YXRlIGxvbmcgbGFzdFBhdXNlID0gMEw7CiAKICAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldE1heExvY2FsUGF1c2UoKQogICAgIHsKLSAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLm1heF9sb2NhbF9wYXVzZV9pbl9tcyIpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvbmcgcGF1c2UgPSBMb25nLnBhcnNlTG9uZyhTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5tYXhfbG9jYWxfcGF1c2VfaW5fbXMiKSk7Ci0gICAgICAgICAgICBsb2dnZXIud2FybigiT3ZlcnJpZGluZyBtYXggbG9jYWwgcGF1c2UgdGltZSB0byB7fW1zIiwgcGF1c2UpOwotICAgICAgICAgICAgcmV0dXJuIHBhdXNlICogMTAwMDAwMEw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIERFRkFVTFRfTUFYX1BBVVNFOworICAgICAgICBsb25nIHBhdXNlID0gTUFYX0xPQ0FMX1BBVVNFX0lOX01TLmdldExvbmcoKTsKKworICAgICAgICBpZiAoIVN0cmluZy52YWx1ZU9mKHBhdXNlKS5lcXVhbHMoTUFYX0xPQ0FMX1BBVVNFX0lOX01TLmdldERlZmF1bHRWYWx1ZSgpKSkKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCJPdmVycmlkaW5nIHt9IG1heCBsb2NhbCBwYXVzZSB0aW1lIGZyb20ge31tcyB0byB7fW1zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9MT0NBTF9QQVVTRV9JTl9NUy5nZXRLZXkoKSwgTUFYX0xPQ0FMX1BBVVNFX0lOX01TLmdldERlZmF1bHRWYWx1ZSgpLCBwYXVzZSk7CisKKyAgICAgICAgcmV0dXJuIHBhdXNlICogMTAwMDAwMEw7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJRmFpbHVyZURldGVjdG9yIGluc3RhbmNlID0gbmV3RmFpbHVyZURldGVjdG9yKCk7CkBAIC05MywxNiArMTA4LDEyIEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldEluaXRpYWxWYWx1ZSgpCiAgICAgewotICAgICAgICBTdHJpbmcgbmV3dmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5mZF9pbml0aWFsX3ZhbHVlX21zIik7Ci0gICAgICAgIGlmIChuZXd2YWx1ZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gR29zc2lwZXIuaW50ZXJ2YWxJbk1pbGxpcyAqIDI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuaW5mbygiT3ZlcnJpZGluZyBGRCBJTklUSUFMX1ZBTFVFIHRvIHt9bXMiLCBuZXd2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChuZXd2YWx1ZSk7Ci0gICAgICAgIH0KKyAgICAgICAgbG9uZyBuZXdWYWx1ZSA9IEZEX0lOSVRJQUxfVkFMVUVfTVMuZ2V0TG9uZyhHb3NzaXBlci5pbnRlcnZhbEluTWlsbGlzICogMkwpOworCisgICAgICAgIGlmIChuZXdWYWx1ZSAhPSBHb3NzaXBlci5pbnRlcnZhbEluTWlsbGlzICogMikKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJPdmVycmlkaW5nIHt9IGZyb20ge31tcyB0byB7fW1zIiwgRkRfSU5JVElBTF9WQUxVRV9NUy5nZXRLZXkoKSwgR29zc2lwZXIuaW50ZXJ2YWxJbk1pbGxpcyAqIDIsIG5ld1ZhbHVlKTsKKworICAgICAgICByZXR1cm4gbmV3VmFsdWU7CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyBnZXRBbGxFbmRwb2ludFN0YXRlcygpCkBAIC00NzYsMTYgKzQ4NywxMCBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBnZXRNYXhJbnRlcnZhbCgpCiAgICAgewotICAgICAgICBTdHJpbmcgbmV3dmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5mZF9tYXhfaW50ZXJ2YWxfbXMiKTsKLSAgICAgICAgaWYgKG5ld3ZhbHVlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBGYWlsdXJlRGV0ZWN0b3IuSU5JVElBTF9WQUxVRV9OQU5PUzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJPdmVycmlkaW5nIEZEIE1BWF9JTlRFUlZBTCB0byB7fW1zIiwgbmV3dmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIFRpbWVVbml0Lk5BTk9TRUNPTkRTLmNvbnZlcnQoSW50ZWdlci5wYXJzZUludChuZXd2YWx1ZSksIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7Ci0gICAgICAgIH0KKyAgICAgICAgbG9uZyBuZXdWYWx1ZSA9IEZEX01BWF9JTlRFUlZBTF9NUy5nZXRMb25nKEZhaWx1cmVEZXRlY3Rvci5JTklUSUFMX1ZBTFVFX05BTk9TKTsKKyAgICAgICAgaWYgKG5ld1ZhbHVlICE9IEZhaWx1cmVEZXRlY3Rvci5JTklUSUFMX1ZBTFVFX05BTk9TKQorICAgICAgICAgICAgbG9nZ2VyLmluZm8oIk92ZXJyaWRpbmcge30gZnJvbSB7fW1zIHRvIHt9bXMiLCBGRF9NQVhfSU5URVJWQUxfTVMuZ2V0S2V5KCksIEZhaWx1cmVEZXRlY3Rvci5JTklUSUFMX1ZBTFVFX05BTk9TLCBuZXdWYWx1ZSk7CisgICAgICAgIHJldHVybiBUaW1lVW5pdC5OQU5PU0VDT05EUy5jb252ZXJ0KG5ld1ZhbHVlLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwogICAgIH0KIAogICAgIHN5bmNocm9uaXplZCB2b2lkIGFkZChsb25nIHZhbHVlLCBJbmV0QWRkcmVzc0FuZFBvcnQgZXApCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9nbXMvR29zc2lwZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9Hb3NzaXBlci5qYXZhCmluZGV4IGFlMjEzYzAuLmFkZmYwNDQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9Hb3NzaXBlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9Hb3NzaXBlci5qYXZhCkBAIC0xOCw4ICsxOCwyMSBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5nbXM7CiAKIGltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50U2tpcExpc3RTZXQ7CkBAIC0zMiw1OSArNDUsNjAgQEAKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQm9vbGVhblN1cHBsaWVyOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7Ci0KIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlVuaW50ZXJydXB0aWJsZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5GdXR1cmVUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5Ob1BheWxvYWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlZlcmI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2Fzc2FuZHJhVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5FeGVjdXRvclV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkV4cGlyaW5nTWVtb2l6aW5nU3VwcGxpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTUJlYW5XcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk5vU3BhbUxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LkZ1dHVyZVRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5TdGFnZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlN5c3RlbUtleXNwYWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuUmVxdWVzdENhbGxiYWNrOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5Ob1BheWxvYWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlJlcXVlc3RDYWxsYmFjazsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuVmVyYjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNhc3NhbmRyYVZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRXhlY3V0b3JVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5FeHBpcmluZ01lbW9pemluZ1N1cHBsaWVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpWTVN0YWJpbGl0eUluc3BlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5NQmVhbldyYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTm9TcGFtTG9nZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUmVjb21wdXRpbmdTdXBwbGllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlVuY2hlY2tlZEludGVycnVwdGVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuTm90U2NoZWR1bGVkRnV0dXJlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuVW5jaGVja2VkSW50ZXJydXB0ZWRFeGNlcHRpb247CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvckZhY3RvcnkuR2xvYmFsLmV4ZWN1dG9yRmFjdG9yeTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ESVNBQkxFX0dPU1NJUF9FTkRQT0lOVF9SRU1PVkFMOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkdPU1NJUEVSX1FVQVJBTlRJTkVfREVMQVk7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuR09TU0lQRVJfU0tJUF9XQUlUSU5HX1RPX1NFVFRMRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5HT1NTSVBfRElTQUJMRV9USFJFQURfVkFMSURBVElPTjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TSFVURE9XTl9BTk5PVU5DRV9ERUxBWV9JTl9NUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5WRVJZX0xPTkdfVElNRV9NUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvci5nZXRDbHVzdGVyTmFtZTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvci5nZXRQYXJ0aXRpb25lck5hbWU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtcy5WZXJzaW9uZWRWYWx1ZS5CT09UU1RSQVBQSU5HX1NUQVRVUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk5vUGF5bG9hZC5ub1BheWxvYWQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5WZXJiLkVDSE9fUkVROwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuVmVyYi5HT1NTSVBfRElHRVNUX1NZTjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXMuZ2V0QnJvYWRjYXN0QWRkcmVzc0FuZFBvcnQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpczsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLm5hbm9UaW1lOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllcy5nZXRCcm9hZGNhc3RBZGRyZXNzQW5kUG9ydDsKIAogLyoqCiAgKiBUaGlzIG1vZHVsZSBpcyByZXNwb25zaWJsZSBmb3IgR29zc2lwaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgbG9jYWwgZW5kcG9pbnQuIFRoaXMgYWJzdHJhY3Rpb24KQEAgLTEwNSwxMSArMTE5LDYgQEAKIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQkVBTl9OQU1FID0gIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldDp0eXBlPUdvc3NpcGVyIjsKIAotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvcHMKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfVEhSRUFEX1ZBTElEQVRJT04gPSAiY2Fzc2FuZHJhLmdvc3NpcC5kaXNhYmxlX3RocmVhZF92YWxpZGF0aW9uIjsKLSAgICB9Ci0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTY2hlZHVsZWRFeGVjdXRvclBsdXMgZXhlY3V0b3IgPSBleGVjdXRvckZhY3RvcnkoKS5zY2hlZHVsZWQoIkdvc3NpcFRhc2tzIik7CiAKICAgICBzdGF0aWMgZmluYWwgQXBwbGljYXRpb25TdGF0ZVtdIFNUQVRFUyA9IEFwcGxpY2F0aW9uU3RhdGUudmFsdWVzKCk7CkBAIC0yMDQsMTEgKzIxMywxMyBAQAogICAgICAgICByZXR1cm4gZXBTdGF0ZXMuaXNFbXB0eSgpIHx8IGVwU3RhdGVzLmtleVNldCgpLmVxdWFscyhDb2xsZWN0aW9ucy5zaW5nbGV0b24oRkJVdGlsaXRpZXMuZ2V0QnJvYWRjYXN0QWRkcmVzc0FuZFBvcnQoKSkpOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEV4cGlyaW5nTWVtb2l6aW5nU3VwcGxpZXIuTWVtb2l6ZWQ8Q2Fzc2FuZHJhVmVyc2lvbj4gTk9fVVBHUkFERV9JTl9QUk9HUkVTUyA9IG5ldyBFeHBpcmluZ01lbW9pemluZ1N1cHBsaWVyLk1lbW9pemVkPD4obnVsbCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhwaXJpbmdNZW1vaXppbmdTdXBwbGllci5Ob3RNZW1vaXplZDxDYXNzYW5kcmFWZXJzaW9uPiBDVVJSRU5UX05PREVfVkVSU0lPTiA9IG5ldyBFeHBpcmluZ01lbW9pemluZ1N1cHBsaWVyLk5vdE1lbW9pemVkPD4oU3lzdGVtS2V5c3BhY2UuQ1VSUkVOVF9WRVJTSU9OKTsKICAgICBmaW5hbCBTdXBwbGllcjxFeHBpcmluZ01lbW9pemluZ1N1cHBsaWVyLlJldHVyblZhbHVlPENhc3NhbmRyYVZlcnNpb24+PiB1cGdyYWRlRnJvbVZlcnNpb25TdXBwbGllciA9ICgpIC0+CiAgICAgewogICAgICAgICAvLyBPbmNlIHRoZXJlIGFyZSBubyBwcmlvciB2ZXJzaW9uIG5vZGVzIHdlIGRvbid0IG5lZWQgdG8ga2VlcCByZWNoZWNraW5nCiAgICAgICAgIGlmICghdXBncmFkZUluUHJvZ3Jlc3NQb3NzaWJsZSkKLSAgICAgICAgICAgIHJldHVybiBuZXcgRXhwaXJpbmdNZW1vaXppbmdTdXBwbGllci5NZW1vaXplZDw+KG51bGwpOworICAgICAgICAgICAgcmV0dXJuIE5PX1VQR1JBREVfSU5fUFJPR1JFU1M7CiAKICAgICAgICAgQ2Fzc2FuZHJhVmVyc2lvbiBtaW5WZXJzaW9uID0gU3lzdGVtS2V5c3BhY2UuQ1VSUkVOVF9WRVJTSU9OOwogCkBAIC0yMTcsMTQgKzIyOCwxNSBAQAogICAgICAgICAvLyBJZiB3ZSBkb24ndCBrbm93IGFueSBlcHN0YXRlIHdlIGRvbid0IGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIGNsdXN0ZXIuCiAgICAgICAgIC8vIElmIHdlIG9ubHkga25vdyBhYm91dCBvdXJzZWx2ZXMsIHdlIGNhbiBhc3N1bWUgdGhhdCB2ZXJzaW9uIGlzIENVUlJFTlRfVkVSU0lPTgogICAgICAgICBpZiAoIWlzRW5hYmxlZCgpIHx8IGlzTG9uZU5vZGUoZW5kcG9pbnRTdGF0ZU1hcCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRXhwaXJpbmdNZW1vaXppbmdTdXBwbGllci5Ob3RNZW1vaXplZDw+KG1pblZlcnNpb24pOwotICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQ1VSUkVOVF9OT0RFX1ZFUlNJT047CiAKICAgICAgICAgLy8gQ2hlY2sgdGhlIHJlbGVhc2UgdmVyc2lvbiBvZiBhbGwgdGhlIHBlZXJzIGl0IGhlYXJkIG9mLiBOb3QgbmVjZXNzYXJ5IHRoZSBwZWVyIHRoYXQgaXQgaGFzL2hhZCBjb250YWN0ZWQgd2l0aC4KICAgICAgICAgYm9vbGVhbiBhbGxIb3N0c0hhdmVLbm93blZlcnNpb24gPSB0cnVlOwogICAgICAgICBmb3IgKEluZXRBZGRyZXNzQW5kUG9ydCBob3N0IDogZW5kcG9pbnRTdGF0ZU1hcC5rZXlTZXQoKSkKICAgICAgICAgeworICAgICAgICAgICAgaWYgKGp1c3RSZW1vdmVkRW5kcG9pbnRzLmNvbnRhaW5zS2V5KGhvc3QpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCiAgICAgICAgICAgICBDYXNzYW5kcmFWZXJzaW9uIHZlcnNpb24gPSBnZXRSZWxlYXNlVmVyc2lvbihob3N0KTsKIAogICAgICAgICAgICAgLy9SYWNlZCB3aXRoIGNoYW5nZXMgdG8gZ29zc2lwIHN0YXRlLCB3YWl0IHVudGlsIG5leHQgaXRlcmF0aW9uCkBAIC0yNDEsNyArMjUzLDcgQEAKICAgICAgICAgICAgIHJldHVybiBuZXcgRXhwaXJpbmdNZW1vaXppbmdTdXBwbGllci5Ob3RNZW1vaXplZDw+KG1pblZlcnNpb24pOwogCiAgICAgICAgIHVwZ3JhZGVJblByb2dyZXNzUG9zc2libGUgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHBpcmluZ01lbW9pemluZ1N1cHBsaWVyLk1lbW9pemVkPD4obnVsbCk7CisgICAgICAgIHJldHVybiBOT19VUEdSQURFX0lOX1BST0dSRVNTOwogICAgIH07CiAKICAgICBwcml2YXRlIGZpbmFsIFN1cHBsaWVyPENhc3NhbmRyYVZlcnNpb24+IHVwZ3JhZGVGcm9tVmVyc2lvbk1lbW9pemVkID0gRXhwaXJpbmdNZW1vaXppbmdTdXBwbGllci5tZW1vaXplV2l0aEV4cGlyYXRpb24odXBncmFkZUZyb21WZXJzaW9uU3VwcGxpZXIsIDEsIFRpbWVVbml0Lk1JTlVURVMpOwpAQCAtMjUzLDE4ICsyNjUsMTggQEAKICAgICAgICAgKChFeHBpcmluZ01lbW9pemluZ1N1cHBsaWVyPENhc3NhbmRyYVZlcnNpb24+KSB1cGdyYWRlRnJvbVZlcnNpb25NZW1vaXplZCkuZXhwaXJlKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBkaXNhYmxlVGhyZWFkVmFsaWRhdGlvbiA9IEJvb2xlYW4uZ2V0Qm9vbGVhbihQcm9wcy5ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGRpc2FibGVUaHJlYWRWYWxpZGF0aW9uID0gR09TU0lQX0RJU0FCTEVfVEhSRUFEX1ZBTElEQVRJT04uZ2V0Qm9vbGVhbigpOwogICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gZGlzYWJsZUVuZHBvaW50UmVtb3ZhbCA9IERJU0FCTEVfR09TU0lQX0VORFBPSU5UX1JFTU9WQUwuZ2V0Qm9vbGVhbigpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBnZXRWZXJ5TG9uZ1RpbWUoKQogICAgIHsKLSAgICAgICAgU3RyaW5nIG5ld1ZMVCA9ICBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS52ZXJ5X2xvbmdfdGltZV9tcyIpOwotICAgICAgICBpZiAobmV3VkxUICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJPdmVycmlkaW5nIGFWZXJ5TG9uZ1RpbWUgdG8ge31tcyIsIG5ld1ZMVCk7Ci0gICAgICAgICAgICByZXR1cm4gTG9uZy5wYXJzZUxvbmcobmV3VkxUKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMjU5MjAwICogMTAwMDsgLy8gMyBkYXlzCisgICAgICAgIGxvbmcgdGltZSA9IFZFUllfTE9OR19USU1FX01TLmdldExvbmcoKTsKKyAgICAgICAgU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IFZFUllfTE9OR19USU1FX01TLmdldERlZmF1bHRWYWx1ZSgpOworCisgICAgICAgIGlmICghU3RyaW5nLnZhbHVlT2YodGltZSkuZXF1YWxzKGRlZmF1bHRWYWx1ZSkpCisgICAgICAgICAgICBsb2dnZXIuaW5mbygiT3ZlcnJpZGluZyB7fSBmcm9tIHt9IHRvIHt9bXMiLCBWRVJZX0xPTkdfVElNRV9NUy5nZXRLZXkoKSwgZGVmYXVsdFZhbHVlLCB0aW1lKTsKKworICAgICAgICByZXR1cm4gdGltZTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5Hb3NzaXBTdGFnZSgpCkBAIC0xNTAyLDcgKzE1MTQsNyBAQAogICAgICAgICByZXR1cm4gaXNBZG1pbmlzdHJhdGl2ZWx5SW5hY3RpdmVTdGF0ZShlcFN0YXRlKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0R29zc2lwU3RhdHVzKEVuZHBvaW50U3RhdGUgZXBTdGF0ZSkKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHb3NzaXBTdGF0dXMoRW5kcG9pbnRTdGF0ZSBlcFN0YXRlKQogICAgIHsKICAgICAgICAgaWYgKGVwU3RhdGUgPT0gbnVsbCkKICAgICAgICAgewpAQCAtMTUyNSwxMSArMTUzNyw3OCBAQAogICAgICAgICByZXR1cm4gcGllY2VzWzBdOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEdvc3NpcCBvZmZlcnMgbm8gaGFwcGVucy1iZWZvcmUgcmVsYXRpb25zaGlwLCBidXQgZG93bnN0cmVhbSBzdWJzY3JpYmVycyBhc3N1bWUgYSBoYXBwZW5zLWJlZm9yZSByZWxhdGlvbnNoaXAKKyAgICAgKiBiZWZvcmUgYmVpbmcgbm90aWZpZWQhICBUbyBhdHRlbXB0IHRvIGJlIG5pY2VyIHRvIHN1YnNjcmliZXJzLCB0aGlzIHtAbGluayBDb21wYXJhdG9yfSBhdHRlbXB0cyB0byBvcmRlciBFbmRwb2ludFN0YXRlCisgICAgICogd2l0aGluIGEgbWFwIGJhc2VkIG9mZiBhIGZldyBoZXVyaXN0aWNzOgorICAgICAqIDxvbD4KKyAgICAgKiAgICAgPGxpPlNUQVRVUyAtIHNvbWUgU1RBVFVTIGRlcGVuZHMgb24gb3RoZXIgaW5zdGFuY2UgU1RBVFVTLCBzbyBtYWtlIHN1cmUgdGhleSBhcmUgbGFzdDsgZWcuIEJPT1QsIGFuZCBCT09UX1JFUExBQ0U8L2xpPgorICAgICAqICAgICA8bGk+Z2VuZXJhdGlvbiAtIG5vcm1hbGx5IGRlZmluZWQgYXMgc3lzdGVtIGNsb2NrIG1pbGxpcywgdGhpcyBjYW4gYmUgc2tld2VkIGFuZCBpcyBhIGJlc3QgZWZmb3J0PC9saT4KKyAgICAgKiAgICAgPGxpPmFkZHJlc3MgLSB0aWUgYnJlYWtlciB0byBtYWtlIHN1cmUgb3JkZXIgaXMgY29uc2lzdGVudDwvbGk+CisgICAgICogPC9vbD4KKyAgICAgKiA8cD4KKyAgICAgKiBQcm9ibGVtczoKKyAgICAgKiBHZW5lcmF0aW9uIGlzIG5vcm1hbGx5IGRlZmluZWQgYXMgc3lzdGVtIGNsb2NrIG1pbGxpcywgd2hpY2ggY2FuIGJlIHNrZXdlZCBhbmQgaW4tY29uc2lzdGVudCBjcm9zcyBub2RlcworICAgICAqIChnZW5lcmF0aW9ucyBkbyBub3QgaGF2ZSBhIGhhcHBlbnMtYmVmb3JlIHJlbGF0aW9uc2hpcCwgc28gb3JkZXJpbmcgaXMgc2tldGNoeSBhdCBiZXN0KS4KKyAgICAgKiA8cD4KKyAgICAgKiBNb3RpdmF0aW9uczoKKyAgICAgKiB7QGxpbmsgTWFwI2VudHJ5U2V0KCl9IHJldHVybnMgZGF0YSBpbiBlZmZlY3RpdmxseSByYW5kb20gb3JkZXIsIHNvIGNhbiBnZXQgaW50byBhIHNpdHVhdGlvbiBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgZXhhbXBsZS4KKyAgICAgKiB7QGNvZGUKKyAgICAgKiAzIG5vZGUgY2x1c3RlcjogbjEsIG4yLCBhbmQgbjMKKyAgICAgKiBuMiBnb2VzIGRvd24gYW5kIG40IGRvZXMgaG9zdCByZXBsYWNlbWVudCBhbmQgZmFpbHMgYmVmb3JlIGNvbXBsZXRpb24KKyAgICAgKiBoNSB0cmllcyB0byBkbyBhIGhvc3QgcmVwbGFjZW1lbnQgYWdhaW5zdCBuNCAoaWdub3JlIHRoZSBmYWN0IHRoaXMgZG9lc24ndCBtYWtlIHNlbnNlKQorICAgICAqIH0KKyAgICAgKiBJbiB0aGF0IGNhc2UgYWJvdmUsIHRoZSB7QGxpbmsgTWFwI2VudHJ5U2V0KCl9IG9yZGVyaW5nIGNhbiBiZSByYW5kb20sIGNhdXNpbmcgaDQgdG8gYXBwbHkgYmVmb3JlIGgyLCB3aGljaCB3aWxsCisgICAgICogYmUgcmVqZWN0ZWQgYnkgc3Vic2NyaXBlcnMgKG9ubHkgYWZ0ZXIgdXBkYXRpbmcgZ29zc2lwIGNhdXNpbmcgemVybyByZXRyaWVzKS4KKyAgICAgKi8KKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBzdGF0aWMgQ29tcGFyYXRvcjxFbnRyeTxJbmV0QWRkcmVzc0FuZFBvcnQsIEVuZHBvaW50U3RhdGU+PiBzdGF0ZU9yZGVyTWFwKCkKKyAgICB7CisgICAgICAgIC8vIFRoZXJlIGFwZWFycyB0byBiZSBzb21lIGVkZ2UgY2FzZXMgd2hlcmUgdGhlIHN0YXRlIHdlIGFyZSBvcmRlcmluZyBnZXQgYWRkZWQgdG8gdGhlIGdsb2JhbCBzdGF0ZSBjYXVzaW5nCisgICAgICAgIC8vIG9yZGVyaW5nIHRvIGNoYW5nZS4uLiB0byBhdm9pZCB0aGF0IHJlbHkgb24gYSBjYWNoZQorICAgICAgICAvLyBzZWUgQ0FTU0FORFJBLTE3OTA4CisgICAgICAgIGNsYXNzIENhY2hlIGV4dGVuZHMgSGFzaE1hcDxJbmV0QWRkcmVzc0FuZFBvcnQsIEVuZHBvaW50U3RhdGU+CisgICAgICAgIHsKKyAgICAgICAgICAgIEVuZHBvaW50U3RhdGUgZ2V0KEVudHJ5PEluZXRBZGRyZXNzQW5kUG9ydCwgRW5kcG9pbnRTdGF0ZT4gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNLZXkoZS5nZXRLZXkoKSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQoZS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgcHV0KGUuZ2V0S2V5KCksIG5ldyBFbmRwb2ludFN0YXRlKGUuZ2V0VmFsdWUoKSkpOworICAgICAgICAgICAgICAgIHJldHVybiBnZXQoZS5nZXRLZXkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ2FjaGUgY2FjaGUgPSBuZXcgQ2FjaGUoKTsKKyAgICAgICAgcmV0dXJuICgoQ29tcGFyYXRvcjxFbnRyeTxJbmV0QWRkcmVzc0FuZFBvcnQsIEVuZHBvaW50U3RhdGU+PikgKGUxLCBlMikgLT4geworICAgICAgICAgICAgU3RyaW5nIGUxc3RhdHVzID0gZ2V0R29zc2lwU3RhdHVzKGNhY2hlLmdldChlMSkpOworICAgICAgICAgICAgU3RyaW5nIGUyc3RhdHVzID0gZ2V0R29zc2lwU3RhdHVzKGNhY2hlLmdldChlMikpOworCisgICAgICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbHMoZTFzdGF0dXMsIGUyc3RhdHVzKSB8fCAoQk9PVFNUUkFQUElOR19TVEFUVVMuY29udGFpbnMoZTFzdGF0dXMpICYmIEJPT1RTVFJBUFBJTkdfU1RBVFVTLmNvbnRhaW5zKGUyc3RhdHVzKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIHN0YXR1cyBmaXJzdCwgbWFrZSBzdXJlIGJvb3RzdHJhcCBzdGF0dXMgaGFwcGVucy1hZnRlciBhbGwgb3RoZXJzCisgICAgICAgICAgICBpZiAoQk9PVFNUUkFQUElOR19TVEFUVVMuY29udGFpbnMoZTFzdGF0dXMpKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgaWYgKEJPT1RTVFJBUFBJTkdfU1RBVFVTLmNvbnRhaW5zKGUyc3RhdHVzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSkKKyAgICAgICAgLnRoZW5Db21wYXJpbmdJbnQoKEVudHJ5PEluZXRBZGRyZXNzQW5kUG9ydCwgRW5kcG9pbnRTdGF0ZT4gZSkgLT4gY2FjaGUuZ2V0KGUpLmdldEhlYXJ0QmVhdFN0YXRlKCkuZ2V0R2VuZXJhdGlvbigpKQorICAgICAgICAudGhlbkNvbXBhcmluZyhFbnRyeTo6Z2V0S2V5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBJdGVyYWJsZTxFbnRyeTxJbmV0QWRkcmVzc0FuZFBvcnQsIEVuZHBvaW50U3RhdGU+PiBvcmRlcihNYXA8SW5ldEFkZHJlc3NBbmRQb3J0LCBFbmRwb2ludFN0YXRlPiBlcFN0YXRlTWFwKQorICAgIHsKKyAgICAgICAgTGlzdDxFbnRyeTxJbmV0QWRkcmVzc0FuZFBvcnQsIEVuZHBvaW50U3RhdGU+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KGVwU3RhdGVNYXAuZW50cnlTZXQoKSk7CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobGlzdCwgc3RhdGVPcmRlck1hcCgpKTsKKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCiAgICAgcHVibGljIHZvaWQgYXBwbHlTdGF0ZUxvY2FsbHkoTWFwPEluZXRBZGRyZXNzQW5kUG9ydCwgRW5kcG9pbnRTdGF0ZT4gZXBTdGF0ZU1hcCkKICAgICB7CiAgICAgICAgIGNoZWNrUHJvcGVyVGhyZWFkRm9yU3RhdGVNdXRhdGlvbigpOwotICAgICAgICBmb3IgKEVudHJ5PEluZXRBZGRyZXNzQW5kUG9ydCwgRW5kcG9pbnRTdGF0ZT4gZW50cnkgOiBlcFN0YXRlTWFwLmVudHJ5U2V0KCkpCisgICAgICAgIGJvb2xlYW4gaGFzTWFqb3JWZXJzaW9uM05vZGVzID0gaGFzTWFqb3JWZXJzaW9uM05vZGVzKCk7CisgICAgICAgIGZvciAoRW50cnk8SW5ldEFkZHJlc3NBbmRQb3J0LCBFbmRwb2ludFN0YXRlPiBlbnRyeSA6IG9yZGVyKGVwU3RhdGVNYXApKQogICAgICAgICB7CiAgICAgICAgICAgICBJbmV0QWRkcmVzc0FuZFBvcnQgZXAgPSBlbnRyeS5nZXRLZXkoKTsKICAgICAgICAgICAgIGlmIChlcC5lcXVhbHMoZ2V0QnJvYWRjYXN0QWRkcmVzc0FuZFBvcnQoKSkgJiYgIWlzSW5TaGFkb3dSb3VuZCgpKQpAQCAtMTU0Myw3ICsxNjIyLDcgQEAKIAogICAgICAgICAgICAgRW5kcG9pbnRTdGF0ZSBsb2NhbEVwU3RhdGVQdHIgPSBlbmRwb2ludFN0YXRlTWFwLmdldChlcCk7CiAgICAgICAgICAgICBFbmRwb2ludFN0YXRlIHJlbW90ZVN0YXRlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmICghaGFzTWFqb3JWZXJzaW9uM05vZGVzKCkpCisgICAgICAgICAgICBpZiAoIWhhc01ham9yVmVyc2lvbjNOb2RlcykKICAgICAgICAgICAgICAgICByZW1vdGVTdGF0ZS5yZW1vdmVNYWpvclZlcnNpb24zTGVnYWN5QXBwbGljYXRpb25TdGF0ZXMoKTsKIAogICAgICAgICAgICAgLyoKQEAgLTE1NzksNyArMTY1OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdGVNYXhWZXJzaW9uID4gbG9jYWxNYXhWZXJzaW9uKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSBzdGF0ZXMsIGJ1dCBkbyBub3Qgbm90aWZ5IHNpbmNlIHRoZXJlIGlzIG5vIG1ham9yIGNoYW5nZQotICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlOZXdTdGF0ZXMoZXAsIGxvY2FsRXBTdGF0ZVB0ciwgcmVtb3RlU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlOZXdTdGF0ZXMoZXAsIGxvY2FsRXBTdGF0ZVB0ciwgcmVtb3RlU3RhdGUsIGhhc01ham9yVmVyc2lvbjNOb2Rlcyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJJZ25vcmluZyByZW1vdGUgdmVyc2lvbiB7fSA8PSB7fSBmb3Ige30iLCByZW1vdGVNYXhWZXJzaW9uLCBsb2NhbE1heFZlcnNpb24sIGVwKTsKQEAgLTE2MDIsNyArMTY4MSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgYXBwbHlOZXdTdGF0ZXMoSW5ldEFkZHJlc3NBbmRQb3J0IGFkZHIsIEVuZHBvaW50U3RhdGUgbG9jYWxTdGF0ZSwgRW5kcG9pbnRTdGF0ZSByZW1vdGVTdGF0ZSkKKyAgICBwcml2YXRlIHZvaWQgYXBwbHlOZXdTdGF0ZXMoSW5ldEFkZHJlc3NBbmRQb3J0IGFkZHIsIEVuZHBvaW50U3RhdGUgbG9jYWxTdGF0ZSwgRW5kcG9pbnRTdGF0ZSByZW1vdGVTdGF0ZSwgYm9vbGVhbiBoYXNNYWpvclZlcnNpb24zTm9kZXMpCiAgICAgewogICAgICAgICAvLyBkb24ndCBhc3NlcnQgaGVyZSwgc2luY2UgaWYgdGhlIG5vZGUgcmVzdGFydHMgdGhlIHZlcnNpb24gd2lsbCBnbyBiYWNrIHRvIHplcm8KICAgICAgICAgaW50IG9sZFZlcnNpb24gPSBsb2NhbFN0YXRlLmdldEhlYXJ0QmVhdFN0YXRlKCkuZ2V0SGVhcnRCZWF0VmVyc2lvbigpOwpAQCAtMTYzMSw3ICsxNzEwLDcgQEAKICAgICAgICAgbG9jYWxTdGF0ZS5hZGRBcHBsaWNhdGlvblN0YXRlcyh1cGRhdGVkU3RhdGVzKTsKIAogICAgICAgICAvLyBnZXQgcmlkIG9mIGxlZ2FjeSBmaWVsZHMgb25jZSB0aGUgY2x1c3RlciBpcyBub3QgaW4gbWl4ZWQgbW9kZQotICAgICAgICBpZiAoIWhhc01ham9yVmVyc2lvbjNOb2RlcygpKQorICAgICAgICBpZiAoIWhhc01ham9yVmVyc2lvbjNOb2RlcykKICAgICAgICAgICAgIGxvY2FsU3RhdGUucmVtb3ZlTWFqb3JWZXJzaW9uM0xlZ2FjeUFwcGxpY2F0aW9uU3RhdGVzKCk7CiAKICAgICAgICAgLy8gbmVlZCB0byBydW4gU1RBVFVTIG9yIFNUQVRVU19XSVRIX1BPUlQgZmlyc3QgdG8gaGFuZGxlIEJPT1RfUkVQTEFDRSBjb3JyZWN0bHkgKGVsc2Ugd29uJ3QgYmUgYSBtZW1iZXIsIHNvIFRPS0VOUyB3b24ndCBiZSBwcm9jZXNzZWQpCkBAIC0yNDkwLDYgKzI1NjksMTkgQEAKICAgICAgICAgcmV0dXJuIG1pblZlcnNpb247CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZ2V0TG9vc2VFbXB0eUVuYWJsZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEVuZHBvaW50U3RhdGUuTE9PU0VfREVGX09GX0VNUFRZX0VOQUJMRUQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0TG9vc2VFbXB0eUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQorICAgIHsKKyAgICAgICAgbG9nZ2VyLmluZm8oIlNldHRpbmcgbG9vc2UgZGVmaW5pdGlvbiBvZiBlbXB0eSB0byB7fSIsIGVuYWJsZWQpOworICAgICAgICBFbmRwb2ludFN0YXRlLkxPT1NFX0RFRl9PRl9FTVBUWV9FTkFCTEVEID0gZW5hYmxlZDsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB1bnNhZmVTZXRFbmFibGVkKCkKICAgICB7CiAgICAgICAgIHNjaGVkdWxlZEdvc3NpcFRhc2sgPSBuZXcgTm90U2NoZWR1bGVkRnV0dXJlPD4oKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9Hb3NzaXBlck1CZWFuLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9nbXMvR29zc2lwZXJNQmVhbi5qYXZhCmluZGV4IDQ3ZDcyMDcuLjJkNTllMzcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9Hb3NzaXBlck1CZWFuLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL0dvc3NpcGVyTUJlYW4uamF2YQpAQCAtMzgsNCArMzgsNyBAQAogICAgIC8qKiBSZXR1cm5zIGVhY2ggbm9kZSdzIGRhdGFiYXNlIHJlbGVhc2UgdmVyc2lvbiAqLwogICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGdldFJlbGVhc2VWZXJzaW9uc1dpdGhQb3J0KCk7CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRMb29zZUVtcHR5RW5hYmxlZCgpOworCisgICAgcHVibGljIHZvaWQgc2V0TG9vc2VFbXB0eUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9WZXJzaW9uZWRWYWx1ZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL1ZlcnNpb25lZFZhbHVlLmphdmEKaW5kZXggMjY2NDRlMS4uN2M2NDI3OCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL1ZlcnNpb25lZFZhbHVlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL1ZlcnNpb25lZFZhbHVlLmphdmEKQEAgLTE3LDI5ICsxNywzMiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtczsKIAotaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5VVUlEOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuSVNPXzg4NTlfMTsKLQogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlsczsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5JVmVyc2lvbmVkU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uQW5kVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlsczsKKworaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuSVNPXzg4NTlfMTsKIAogCiAvKioKQEAgLTg0LDYgKzg3LDggQEAKICAgICAvLyB2YWx1ZXMgZm9yIEFwcGxpY2F0aW9uU3RhdGUuUkVNT1ZBTF9DT09SRElOQVRPUgogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTU9WQUxfQ09PUkRJTkFUT1IgPSAiUkVNT1ZFUiI7CiAKKyAgICBwdWJsaWMgc3RhdGljIFNldDxTdHJpbmc+IEJPT1RTVFJBUFBJTkdfU1RBVFVTID0gSW1tdXRhYmxlU2V0Lm9mKFNUQVRVU19CT09UU1RSQVBQSU5HLCBTVEFUVVNfQk9PVFNUUkFQUElOR19SRVBMQUNFKTsKKwogICAgIHB1YmxpYyBmaW5hbCBpbnQgdmVyc2lvbjsKICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHZhbHVlOwogCkBAIC05OSw2ICsxMDQsMTIgQEAKICAgICAgICAgdGhpcyh2YWx1ZSwgVmVyc2lvbkdlbmVyYXRvci5nZXROZXh0VmVyc2lvbigpKTsKICAgICB9CiAKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgVmVyc2lvbmVkVmFsdWUgd2l0aFZlcnNpb24oaW50IHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFZlcnNpb25lZFZhbHVlKHZhbHVlLCB2ZXJzaW9uKTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIFZlcnNpb25lZFZhbHVlIHVuc2FmZU1ha2VWZXJzaW9uZWRWYWx1ZShTdHJpbmcgdmFsdWUsIGludCB2ZXJzaW9uKQogICAgIHsKICAgICAgICAgcmV0dXJuIG5ldyBWZXJzaW9uZWRWYWx1ZSh2YWx1ZSwgdmVyc2lvbik7CkBAIC0zMTUsMTAgKzMyNiwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIG5ldyBWZXJzaW9uZWRWYWx1ZShTdHJpbmcudmFsdWVPZih2YWx1ZSkpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIFZlcnNpb25lZFZhbHVlIHNzdGFibGVWZXJzaW9ucyhTZXQ8VmVyc2lvbkFuZFR5cGU+IHZlcnNpb25zKQorICAgICAgICBwdWJsaWMgVmVyc2lvbmVkVmFsdWUgc3N0YWJsZVZlcnNpb25zKFNldDxWZXJzaW9uPiB2ZXJzaW9ucykKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBWZXJzaW9uZWRWYWx1ZSh2ZXJzaW9ucy5zdHJlYW0oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoVmVyc2lvbkFuZFR5cGU6OnRvU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoVmVyc2lvbjo6dG9Gb3JtYXRBbmRWZXJzaW9uU3RyaW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCIpKSk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvQ29sdW1uRmFtaWx5U3BsaXQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9Db2x1bW5GYW1pbHlTcGxpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjI1Njg1Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9Db2x1bW5GYW1pbHlTcGxpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLldyaXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5JbnB1dFNwbGl0OwotCi1pbXBvcnQgamF2YS5pby5EYXRhSW5wdXQ7Ci1pbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0OwotaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotcHVibGljIGNsYXNzIENvbHVtbkZhbWlseVNwbGl0IGV4dGVuZHMgSW5wdXRTcGxpdCBpbXBsZW1lbnRzIFdyaXRhYmxlLCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuSW5wdXRTcGxpdAotewotICAgIHByaXZhdGUgU3RyaW5nIHN0YXJ0VG9rZW47Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZW5kVG9rZW47Ci0gICAgcHJpdmF0ZSBsb25nIGxlbmd0aDsKLSAgICBwcml2YXRlIFN0cmluZ1tdIGRhdGFOb2RlczsKLQotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIENvbHVtbkZhbWlseVNwbGl0KFN0cmluZyBzdGFydFRva2VuLCBTdHJpbmcgZW5kVG9rZW4sIFN0cmluZ1tdIGRhdGFOb2RlcykKLSAgICB7Ci0gICAgICAgIHRoaXMoc3RhcnRUb2tlbiwgZW5kVG9rZW4sIExvbmcuTUFYX1ZBTFVFLCBkYXRhTm9kZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb2x1bW5GYW1pbHlTcGxpdChTdHJpbmcgc3RhcnRUb2tlbiwgU3RyaW5nIGVuZFRva2VuLCBsb25nIGxlbmd0aCwgU3RyaW5nW10gZGF0YU5vZGVzKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHN0YXJ0VG9rZW4gIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IGVuZFRva2VuICE9IG51bGw7Ci0gICAgICAgIHRoaXMuc3RhcnRUb2tlbiA9IHN0YXJ0VG9rZW47Ci0gICAgICAgIHRoaXMuZW5kVG9rZW4gPSBlbmRUb2tlbjsKLSAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0gICAgICAgIHRoaXMuZGF0YU5vZGVzID0gZGF0YU5vZGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRUb2tlbigpCi0gICAgewotICAgICAgICByZXR1cm4gc3RhcnRUb2tlbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVuZFRva2VuKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlbmRUb2tlbjsKLSAgICB9Ci0KLSAgICAvLyBnZXRMZW5ndGggYW5kIGdldExvY2F0aW9ucyBzYXRpc2Z5IHRoZSBJbnB1dFNwbGl0IGFic3RyYWN0aW9uCi0KLSAgICBwdWJsaWMgbG9uZyBnZXRMZW5ndGgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGxlbmd0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TG9jYXRpb25zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkYXRhTm9kZXM7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IEtleXNwYWNlU3BsaXQucmVhZCgpOwotICAgIHByb3RlY3RlZCBDb2x1bW5GYW1pbHlTcGxpdCgpIHt9Ci0KLSAgICAvLyBUaGVzZSB0aHJlZSBtZXRob2RzIGFyZSBmb3Igc2VyaWFsaXppbmcgYW5kIGRlc2VyaWFsaXppbmcKLSAgICAvLyBLZXlzcGFjZVNwbGl0cyBhcyBuZWVkZWQgYnkgdGhlIFdyaXRhYmxlIGludGVyZmFjZS4KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShEYXRhT3V0cHV0IG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBvdXQud3JpdGVVVEYoc3RhcnRUb2tlbik7Ci0gICAgICAgIG91dC53cml0ZVVURihlbmRUb2tlbik7Ci0gICAgICAgIG91dC53cml0ZUludChkYXRhTm9kZXMubGVuZ3RoKTsKLSAgICAgICAgZm9yIChTdHJpbmcgZW5kcG9pbnQgOiBkYXRhTm9kZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dC53cml0ZVVURihlbmRwb2ludCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LndyaXRlTG9uZyhsZW5ndGgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlYWRGaWVsZHMoRGF0YUlucHV0IGluKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN0YXJ0VG9rZW4gPSBpbi5yZWFkVVRGKCk7Ci0gICAgICAgIGVuZFRva2VuID0gaW4ucmVhZFVURigpOwotICAgICAgICBpbnQgbnVtT2ZFbmRwb2ludHMgPSBpbi5yZWFkSW50KCk7Ci0gICAgICAgIGRhdGFOb2RlcyA9IG5ldyBTdHJpbmdbbnVtT2ZFbmRwb2ludHNdOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtT2ZFbmRwb2ludHM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZGF0YU5vZGVzW2ldID0gaW4ucmVhZFVURigpOwotICAgICAgICB9Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBsZW5ndGggPSBpbi5yZWFkTG9uZygpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFT0ZFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy9XZSBtdXN0IGJlIGRlc2VyaWFsaXppbmcgaW4gYSBtaXhlZC12ZXJzaW9uIGNsdXN0ZXIuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiQ29sdW1uRmFtaWx5U3BsaXQoIiArCi0gICAgICAgICAgICAgICAiKCIgKyBzdGFydFRva2VuCi0gICAgICAgICAgICAgICArICIsICciICsgZW5kVG9rZW4gKyAnXScKLSAgICAgICAgICAgICAgICsgIiBAIiArIChkYXRhTm9kZXMgPT0gbnVsbCA/IG51bGwgOiBBcnJheXMuYXNMaXN0KGRhdGFOb2RlcykpICsgJyknOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29sdW1uRmFtaWx5U3BsaXQgcmVhZChEYXRhSW5wdXQgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3BsaXQgdyA9IG5ldyBDb2x1bW5GYW1pbHlTcGxpdCgpOwotICAgICAgICB3LnJlYWRGaWVsZHMoaW4pOwotICAgICAgICByZXR1cm4gdzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvQ29uZmlnSGVscGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvQ29uZmlnSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNTM5YjEuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGFkb29wL0NvbmZpZ0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA4ICswLDAgQEAKLS8qCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGFkb29wOwotCi0KLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29tcHJlc3Npb25QYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jb25mLkNvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBDb25maWdIZWxwZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfUEFSVElUSU9ORVJfQ09ORklHID0gImNhc3NhbmRyYS5pbnB1dC5wYXJ0aXRpb25lci5jbGFzcyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9QQVJUSVRJT05FUl9DT05GSUcgPSAiY2Fzc2FuZHJhLm91dHB1dC5wYXJ0aXRpb25lci5jbGFzcyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX0tFWVNQQUNFX0NPTkZJRyA9ICJjYXNzYW5kcmEuaW5wdXQua2V5c3BhY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfS0VZU1BBQ0VfQ09ORklHID0gImNhc3NhbmRyYS5vdXRwdXQua2V5c3BhY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9LRVlTUEFDRV9VU0VSTkFNRV9DT05GSUcgPSAiY2Fzc2FuZHJhLmlucHV0LmtleXNwYWNlLnVzZXJuYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfS0VZU1BBQ0VfUEFTU1dEX0NPTkZJRyA9ICJjYXNzYW5kcmEuaW5wdXQua2V5c3BhY2UucGFzc3dkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0tFWVNQQUNFX1VTRVJOQU1FX0NPTkZJRyA9ICJjYXNzYW5kcmEub3V0cHV0LmtleXNwYWNlLnVzZXJuYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0tFWVNQQUNFX1BBU1NXRF9DT05GSUcgPSAiY2Fzc2FuZHJhLm91dHB1dC5rZXlzcGFjZS5wYXNzd2QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9DT0xVTU5GQU1JTFlfQ09ORklHID0gImNhc3NhbmRyYS5pbnB1dC5jb2x1bW5mYW1pbHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfQ09MVU1ORkFNSUxZX0NPTkZJRyA9ICJtYXByZWR1Y2Uub3V0cHV0LmJhc2VuYW1lIjsgLy90aGlzIG11c3QgPT0gT3V0cHV0Rm9ybWF0LkJBU0VfT1VUUFVUX05BTUUKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfUFJFRElDQVRFX0NPTkZJRyA9ICJjYXNzYW5kcmEuaW5wdXQucHJlZGljYXRlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfS0VZUkFOR0VfQ09ORklHID0gImNhc3NhbmRyYS5pbnB1dC5rZXlSYW5nZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX1NQTElUX1NJWkVfQ09ORklHID0gImNhc3NhbmRyYS5pbnB1dC5zcGxpdC5zaXplIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfU1BMSVRfU0laRV9JTl9NSUJfQ09ORklHID0gImNhc3NhbmRyYS5pbnB1dC5zcGxpdC5zaXplX21iIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfV0lERVJPV1NfQ09ORklHID0gImNhc3NhbmRyYS5pbnB1dC53aWRlcm93cyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfU1BMSVRfU0laRSA9IDY0ICogMTAyNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOR0VfQkFUQ0hfU0laRV9DT05GSUcgPSAiY2Fzc2FuZHJhLnJhbmdlLmJhdGNoLnNpemUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1JBTkdFX0JBVENIX1NJWkUgPSA0MDk2OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9JTklUSUFMX0FERFJFU1MgPSAiY2Fzc2FuZHJhLmlucHV0LmFkZHJlc3MiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfSU5JVElBTF9BRERSRVNTID0gImNhc3NhbmRyYS5vdXRwdXQuYWRkcmVzcyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9JTklUSUFMX1BPUlQgPSAiY2Fzc2FuZHJhLm91dHB1dC5wb3J0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9DT05TSVNURU5DWV9MRVZFTCA9ICJjYXNzYW5kcmEuY29uc2lzdGVuY3lsZXZlbC5yZWFkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JJVEVfQ09OU0lTVEVOQ1lfTEVWRUwgPSAiY2Fzc2FuZHJhLmNvbnNpc3RlbmN5bGV2ZWwud3JpdGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfQ09NUFJFU1NJT05fQ0xBU1MgPSAiY2Fzc2FuZHJhLm91dHB1dC5jb21wcmVzc2lvbi5jbGFzcyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9DT01QUkVTU0lPTl9DSFVOS19MRU5HVEggPSAiY2Fzc2FuZHJhLm91dHB1dC5jb21wcmVzc2lvbi5sZW5ndGgiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfTE9DQUxfRENfT05MWSA9ICJjYXNzYW5kcmEub3V0cHV0LmxvY2FsLmRjLm9ubHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NBU1NBTkRSQV9OQVRJVkVfUE9SVCA9ICI3MDAwIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDb25maWdIZWxwZXIuY2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBrZXlzcGFjZSBhbmQgY29sdW1uIGZhbWlseSBmb3IgdGhlIGlucHV0IG9mIHRoaXMgam9iLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmYgICAgICAgICBKb2IgY29uZmlndXJhdGlvbiB5b3UgYXJlIGFib3V0IHRvIHJ1bgotICAgICAqIEBwYXJhbSBrZXlzcGFjZQotICAgICAqIEBwYXJhbSBjb2x1bW5GYW1pbHkKLSAgICAgKiBAcGFyYW0gd2lkZXJvd3MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5wdXRDb2x1bW5GYW1pbHkoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcga2V5c3BhY2UsIFN0cmluZyBjb2x1bW5GYW1pbHksIGJvb2xlYW4gd2lkZXJvd3MpCi0gICAgewotICAgICAgICBpZiAoa2V5c3BhY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigia2V5c3BhY2UgbWF5IG5vdCBiZSBudWxsIik7Ci0KLSAgICAgICAgaWYgKGNvbHVtbkZhbWlseSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ0YWJsZSBtYXkgbm90IGJlIG51bGwiKTsKLQotICAgICAgICBjb25mLnNldChJTlBVVF9LRVlTUEFDRV9DT05GSUcsIGtleXNwYWNlKTsKLSAgICAgICAgY29uZi5zZXQoSU5QVVRfQ09MVU1ORkFNSUxZX0NPTkZJRywgY29sdW1uRmFtaWx5KTsKLSAgICAgICAgY29uZi5zZXQoSU5QVVRfV0lERVJPV1NfQ09ORklHLCBTdHJpbmcudmFsdWVPZih3aWRlcm93cykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUga2V5c3BhY2UgYW5kIGNvbHVtbiBmYW1pbHkgZm9yIHRoZSBpbnB1dCBvZiB0aGlzIGpvYi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25mICAgICAgICAgSm9iIGNvbmZpZ3VyYXRpb24geW91IGFyZSBhYm91dCB0byBydW4KLSAgICAgKiBAcGFyYW0ga2V5c3BhY2UKLSAgICAgKiBAcGFyYW0gY29sdW1uRmFtaWx5Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElucHV0Q29sdW1uRmFtaWx5KENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgY29sdW1uRmFtaWx5KQotICAgIHsKLSAgICAgICAgc2V0SW5wdXRDb2x1bW5GYW1pbHkoY29uZiwga2V5c3BhY2UsIGNvbHVtbkZhbWlseSwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUga2V5c3BhY2UgZm9yIHRoZSBvdXRwdXQgb2YgdGhpcyBqb2IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZiBKb2IgY29uZmlndXJhdGlvbiB5b3UgYXJlIGFib3V0IHRvIHJ1bgotICAgICAqIEBwYXJhbSBrZXlzcGFjZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRPdXRwdXRLZXlzcGFjZShDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBrZXlzcGFjZSkKLSAgICB7Ci0gICAgICAgIGlmIChrZXlzcGFjZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJrZXlzcGFjZSBtYXkgbm90IGJlIG51bGwiKTsKLQotICAgICAgICBjb25mLnNldChPVVRQVVRfS0VZU1BBQ0VfQ09ORklHLCBrZXlzcGFjZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjb2x1bW4gZmFtaWx5IGZvciB0aGUgb3V0cHV0IG9mIHRoaXMgam9iLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmYgICAgICAgICBKb2IgY29uZmlndXJhdGlvbiB5b3UgYXJlIGFib3V0IHRvIHJ1bgotICAgICAqIEBwYXJhbSBjb2x1bW5GYW1pbHkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0T3V0cHV0Q29sdW1uRmFtaWx5KENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGNvbHVtbkZhbWlseSkKLSAgICB7Ci0gICAgCWNvbmYuc2V0KE9VVFBVVF9DT0xVTU5GQU1JTFlfQ09ORklHLCBjb2x1bW5GYW1pbHkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY29sdW1uIGZhbWlseSBmb3IgdGhlIG91dHB1dCBvZiB0aGlzIGpvYi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25mICAgICAgICAgSm9iIGNvbmZpZ3VyYXRpb24geW91IGFyZSBhYm91dCB0byBydW4KLSAgICAgKiBAcGFyYW0ga2V5c3BhY2UKLSAgICAgKiBAcGFyYW0gY29sdW1uRmFtaWx5Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE91dHB1dENvbHVtbkZhbWlseShDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIGNvbHVtbkZhbWlseSkKLSAgICB7Ci0gICAgCXNldE91dHB1dEtleXNwYWNlKGNvbmYsIGtleXNwYWNlKTsKLSAgICAJc2V0T3V0cHV0Q29sdW1uRmFtaWx5KGNvbmYsIGNvbHVtbkZhbWlseSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiByb3dzIHRvIHJlcXVlc3Qgd2l0aCBlYWNoIGdldCByYW5nZSBzbGljZXMgcmVxdWVzdC4KLSAgICAgKiBUb28gYmlnIGFuZCB5b3UgY2FuIGVpdGhlciBnZXQgdGltZW91dHMgd2hlbiBpdCB0YWtlcyBDYXNzYW5kcmEgdG9vCi0gICAgICogbG9uZyB0byBmZXRjaCBhbGwgdGhlIGRhdGEuIFRvbyBzbWFsbCBhbmQgdGhlIHBlcmZvcm1hbmNlCi0gICAgICogd2lsbCBiZSBlYXRlbiB1cCBieSB0aGUgb3ZlcmhlYWQgb2YgZWFjaCByZXF1ZXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmYgICAgICBKb2IgY29uZmlndXJhdGlvbiB5b3UgYXJlIGFib3V0IHRvIHJ1bgotICAgICAqIEBwYXJhbSBiYXRjaHNpemUgTnVtYmVyIG9mIHJvd3MgdG8gcmVxdWVzdCBlYWNoIHRpbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UmFuZ2VCYXRjaFNpemUoQ29uZmlndXJhdGlvbiBjb25mLCBpbnQgYmF0Y2hzaXplKQotICAgIHsKLSAgICAgICAgY29uZi5zZXRJbnQoUkFOR0VfQkFUQ0hfU0laRV9DT05GSUcsIGJhdGNoc2l6ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiByb3dzIHRvIHJlcXVlc3Qgd2l0aCBlYWNoIGdldCByYW5nZSBzbGljZXMgcmVxdWVzdC4KLSAgICAgKiBUb28gYmlnIGFuZCB5b3UgY2FuIGVpdGhlciBnZXQgdGltZW91dHMgd2hlbiBpdCB0YWtlcyBDYXNzYW5kcmEgdG9vCi0gICAgICogbG9uZyB0byBmZXRjaCBhbGwgdGhlIGRhdGEuIFRvbyBzbWFsbCBhbmQgdGhlIHBlcmZvcm1hbmNlCi0gICAgICogd2lsbCBiZSBlYXRlbiB1cCBieSB0aGUgb3ZlcmhlYWQgb2YgZWFjaCByZXF1ZXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmYgSm9iIGNvbmZpZ3VyYXRpb24geW91IGFyZSBhYm91dCB0byBydW4KLSAgICAgKiBAcmV0dXJuIE51bWJlciBvZiByb3dzIHRvIHJlcXVlc3QgZWFjaCB0aW1lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0UmFuZ2VCYXRjaFNpemUoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbmYuZ2V0SW50KFJBTkdFX0JBVENIX1NJWkVfQ09ORklHLCBERUZBVUxUX1JBTkdFX0JBVENIX1NJWkUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgc3BsaXQuCi0gICAgICogVGhpcyBhZmZlY3RzIHRoZSBudW1iZXIgb2YgbWFwcyBjcmVhdGVkLCBpZiB0aGUgbnVtYmVyIGlzIHRvbyBzbWFsbAotICAgICAqIHRoZSBvdmVyaGVhZCBvZiBlYWNoIG1hcCB3aWxsIHRha2UgdXAgdGhlIGJ1bGsgb2YgdGhlIGpvYiB0aW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmYgICAgICBKb2IgY29uZmlndXJhdGlvbiB5b3UgYXJlIGFib3V0IHRvIHJ1bgotICAgICAqIEBwYXJhbSBzcGxpdHNpemUgTnVtYmVyIG9mIHBhcnRpdGlvbnMgaW4gdGhlIGlucHV0IHNwbGl0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElucHV0U3BsaXRTaXplKENvbmZpZ3VyYXRpb24gY29uZiwgaW50IHNwbGl0c2l6ZSkKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0SW50KElOUFVUX1NQTElUX1NJWkVfQ09ORklHLCBzcGxpdHNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldElucHV0U3BsaXRTaXplKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb25mLmdldEludChJTlBVVF9TUExJVF9TSVpFX0NPTkZJRywgREVGQVVMVF9TUExJVF9TSVpFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNpemUgb2YgdGhlIGlucHV0IHNwbGl0LiBzZXRJbnB1dFNwbGl0U2l6ZSB2YWx1ZSBpcyB1c2VkIGlmIHRoaXMgaXMgbm90IHNldC4KLSAgICAgKiBUaGlzIGFmZmVjdHMgdGhlIG51bWJlciBvZiBtYXBzIGNyZWF0ZWQsIGlmIHRoZSBudW1iZXIgaXMgdG9vIHNtYWxsCi0gICAgICogdGhlIG92ZXJoZWFkIG9mIGVhY2ggbWFwIHdpbGwgdGFrZSB1cCB0aGUgYnVsayBvZiB0aGUgam9iIHRpbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZiAgICAgICAgICBKb2IgY29uZmlndXJhdGlvbiB5b3UgYXJlIGFib3V0IHRvIHJ1bgotICAgICAqIEBwYXJhbSBzcGxpdFNpemVNYiAgIElucHV0IHNwbGl0IHNpemUgaW4gTWlCCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElucHV0U3BsaXRTaXplSW5NYihDb25maWd1cmF0aW9uIGNvbmYsIGludCBzcGxpdFNpemVNYikKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0SW50KElOUFVUX1NQTElUX1NJWkVfSU5fTUlCX0NPTkZJRywgc3BsaXRTaXplTWIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNhc3NhbmRyYS5pbnB1dC5zcGxpdC5zaXplIHdpbGwgYmUgdXNlZCBpZiB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkIG9yIG5lZ2F0aXZlLgotICAgICAqIEBwYXJhbSBjb25mICBKb2IgY29uZmlndXJhdGlvbiB5b3UgYXJlIGFib3V0IHRvIHJ1bgotICAgICAqIEByZXR1cm4gICAgICBzcGxpdCBzaXplIGluIE1pQiBvciAtMSBpZiBpdCBpcyB1bmRlZmluZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0SW5wdXRTcGxpdFNpemVJbk1iKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb25mLmdldEludChJTlBVVF9TUExJVF9TSVpFX0lOX01JQl9DT05GSUcsIC0xKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIEtleVJhbmdlIHRvIGxpbWl0IHRoZSByb3dzLgotICAgICAqIEBwYXJhbSBjb25mIEpvYiBjb25maWd1cmF0aW9uIHlvdSBhcmUgYWJvdXQgdG8gcnVuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElucHV0UmFuZ2UoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgc3RhcnRUb2tlbiwgU3RyaW5nIGVuZFRva2VuKQotICAgIHsKLSAgICAgICAgY29uZi5zZXQoSU5QVVRfS0VZUkFOR0VfQ09ORklHLCBzdGFydFRva2VuICsgIiwiICsgZW5kVG9rZW4pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBzdGFydCBhbmQgZW5kIHRva2VuIG9mIHRoZSBpbnB1dCBrZXkgcmFuZ2UgYXMgYSBwYWlyLgotICAgICAqCi0gICAgICogbWF5IGJlIG51bGwgaWYgdW5zZXQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQYWlyPFN0cmluZywgU3RyaW5nPiBnZXRJbnB1dEtleVJhbmdlKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIFN0cmluZyBzdHIgPSBjb25mLmdldChJTlBVVF9LRVlSQU5HRV9DT05GSUcpOwotICAgICAgICBpZiAoc3RyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IHN0ci5zcGxpdCgiLCIpOwotICAgICAgICBhc3NlcnQgcGFydHMubGVuZ3RoID09IDI7Ci0gICAgICAgIHJldHVybiBQYWlyLmNyZWF0ZShwYXJ0c1swXSwgcGFydHNbMV0pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldElucHV0S2V5c3BhY2UoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbmYuZ2V0KElOUFVUX0tFWVNQQUNFX0NPTkZJRyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T3V0cHV0S2V5c3BhY2UoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbmYuZ2V0KE9VVFBVVF9LRVlTUEFDRV9DT05GSUcpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnB1dEtleXNwYWNlVXNlck5hbWVBbmRQYXNzd29yZChDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkKQotICAgIHsKLSAgICAgICAgc2V0SW5wdXRLZXlzcGFjZVVzZXJOYW1lKGNvbmYsIHVzZXJuYW1lKTsKLSAgICAgICAgc2V0SW5wdXRLZXlzcGFjZVBhc3N3b3JkKGNvbmYsIHBhc3N3b3JkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5wdXRLZXlzcGFjZVVzZXJOYW1lKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIHVzZXJuYW1lKQotICAgIHsKLSAgICAgICAgY29uZi5zZXQoSU5QVVRfS0VZU1BBQ0VfVVNFUk5BTUVfQ09ORklHLCB1c2VybmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SW5wdXRLZXlzcGFjZVVzZXJOYW1lKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgCXJldHVybiBjb25mLmdldChJTlBVVF9LRVlTUEFDRV9VU0VSTkFNRV9DT05GSUcpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnB1dEtleXNwYWNlUGFzc3dvcmQoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgcGFzc3dvcmQpCi0gICAgewotICAgICAgICBjb25mLnNldChJTlBVVF9LRVlTUEFDRV9QQVNTV0RfQ09ORklHLCBwYXNzd29yZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SW5wdXRLZXlzcGFjZVBhc3N3b3JkKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgCXJldHVybiBjb25mLmdldChJTlBVVF9LRVlTUEFDRV9QQVNTV0RfQ09ORklHKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0T3V0cHV0S2V5c3BhY2VVc2VyTmFtZUFuZFBhc3N3b3JkKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpCi0gICAgewotICAgICAgICBzZXRPdXRwdXRLZXlzcGFjZVVzZXJOYW1lKGNvbmYsIHVzZXJuYW1lKTsKLSAgICAgICAgc2V0T3V0cHV0S2V5c3BhY2VQYXNzd29yZChjb25mLCBwYXNzd29yZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE91dHB1dEtleXNwYWNlVXNlck5hbWUoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgdXNlcm5hbWUpCi0gICAgewotICAgICAgICBjb25mLnNldChPVVRQVVRfS0VZU1BBQ0VfVVNFUk5BTUVfQ09ORklHLCB1c2VybmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T3V0cHV0S2V5c3BhY2VVc2VyTmFtZShDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgIAlyZXR1cm4gY29uZi5nZXQoT1VUUFVUX0tFWVNQQUNFX1VTRVJOQU1FX0NPTkZJRyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE91dHB1dEtleXNwYWNlUGFzc3dvcmQoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgcGFzc3dvcmQpCi0gICAgewotICAgICAgICBjb25mLnNldChPVVRQVVRfS0VZU1BBQ0VfUEFTU1dEX0NPTkZJRywgcGFzc3dvcmQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE91dHB1dEtleXNwYWNlUGFzc3dvcmQoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAJcmV0dXJuIGNvbmYuZ2V0KE9VVFBVVF9LRVlTUEFDRV9QQVNTV0RfQ09ORklHKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbnB1dENvbHVtbkZhbWlseShDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gY29uZi5nZXQoSU5QVVRfQ09MVU1ORkFNSUxZX0NPTkZJRyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T3V0cHV0Q29sdW1uRmFtaWx5KENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgCWlmIChjb25mLmdldChPVVRQVVRfQ09MVU1ORkFNSUxZX0NPTkZJRykgIT0gbnVsbCkKLSAgICAJCXJldHVybiBjb25mLmdldChPVVRQVVRfQ09MVU1ORkFNSUxZX0NPTkZJRyk7Ci0gICAgCWVsc2UKLSAgICAJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiWW91IG11c3Qgc2V0IHRoZSBvdXRwdXQgY29sdW1uIGZhbWlseSB1c2luZyBlaXRoZXIgc2V0T3V0cHV0Q29sdW1uRmFtaWx5IG9yIGJ5IGFkZGluZyBhIG5hbWVkIG91dHB1dCB3aXRoIE11bHRpcGxlT3V0cHV0cyIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRJbnB1dElzV2lkZShDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gQm9vbGVhbi5wYXJzZUJvb2xlYW4oY29uZi5nZXQoSU5QVVRfV0lERVJPV1NfQ09ORklHKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVhZENvbnNpc3RlbmN5TGV2ZWwoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbmYuZ2V0KFJFQURfQ09OU0lTVEVOQ1lfTEVWRUwsICJMT0NBTF9PTkUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UmVhZENvbnNpc3RlbmN5TGV2ZWwoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgY29uc2lzdGVuY3lMZXZlbCkKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KFJFQURfQ09OU0lTVEVOQ1lfTEVWRUwsIGNvbnNpc3RlbmN5TGV2ZWwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdyaXRlQ29uc2lzdGVuY3lMZXZlbChDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gY29uZi5nZXQoV1JJVEVfQ09OU0lTVEVOQ1lfTEVWRUwsICJMT0NBTF9PTkUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0V3JpdGVDb25zaXN0ZW5jeUxldmVsKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGNvbnNpc3RlbmN5TGV2ZWwpCi0gICAgewotICAgICAgICBjb25mLnNldChXUklURV9DT05TSVNURU5DWV9MRVZFTCwgY29uc2lzdGVuY3lMZXZlbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SW5wdXRJbml0aWFsQWRkcmVzcyhDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gY29uZi5nZXQoSU5QVVRfSU5JVElBTF9BRERSRVNTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5wdXRJbml0aWFsQWRkcmVzcyhDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBhZGRyZXNzKQotICAgIHsKLSAgICAgICAgY29uZi5zZXQoSU5QVVRfSU5JVElBTF9BRERSRVNTLCBhZGRyZXNzKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElucHV0UGFydGl0aW9uZXIoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgY2xhc3NuYW1lKQotICAgIHsKLSAgICAgICAgY29uZi5zZXQoSU5QVVRfUEFSVElUSU9ORVJfQ09ORklHLCBjbGFzc25hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVBhcnRpdGlvbmVyIGdldElucHV0UGFydGl0aW9uZXIoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZCVXRpbGl0aWVzLm5ld1BhcnRpdGlvbmVyKGNvbmYuZ2V0KElOUFVUX1BBUlRJVElPTkVSX0NPTkZJRykpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE91dHB1dEluaXRpYWxBZGRyZXNzKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb25mLmdldChPVVRQVVRfSU5JVElBTF9BRERSRVNTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0T3V0cHV0SW5pdGlhbFBvcnQoQ29uZmlndXJhdGlvbiBjb25mLCBJbnRlZ2VyIHBvcnQpCi0gICAgewotICAgICAgICBjb25mLnNldChPVVRQVVRfSU5JVElBTF9QT1JULCBwb3J0LnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSW50ZWdlciBnZXRPdXRwdXRJbml0aWFsUG9ydChDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKGNvbmYuZ2V0KE9VVFBVVF9JTklUSUFMX1BPUlQsIERFRkFVTFRfQ0FTU0FORFJBX05BVElWRV9QT1JUKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE91dHB1dEluaXRpYWxBZGRyZXNzKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGFkZHJlc3MpCi0gICAgewotICAgICAgICBjb25mLnNldChPVVRQVVRfSU5JVElBTF9BRERSRVNTLCBhZGRyZXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0T3V0cHV0UGFydGl0aW9uZXIoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgY2xhc3NuYW1lKQotICAgIHsKLSAgICAgICAgY29uZi5zZXQoT1VUUFVUX1BBUlRJVElPTkVSX0NPTkZJRywgY2xhc3NuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElQYXJ0aXRpb25lciBnZXRPdXRwdXRQYXJ0aXRpb25lcihDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gRkJVdGlsaXRpZXMubmV3UGFydGl0aW9uZXIoY29uZi5nZXQoT1VUUFVUX1BBUlRJVElPTkVSX0NPTkZJRykpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE91dHB1dENvbXByZXNzaW9uQ2xhc3MoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbmYuZ2V0KE9VVFBVVF9DT01QUkVTU0lPTl9DTEFTUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T3V0cHV0Q29tcHJlc3Npb25DaHVua0xlbmd0aChDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gY29uZi5nZXQoT1VUUFVUX0NPTVBSRVNTSU9OX0NIVU5LX0xFTkdUSCwgU3RyaW5nLnZhbHVlT2YoQ29tcHJlc3Npb25QYXJhbXMuREVGQVVMVF9DSFVOS19MRU5HVEgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0T3V0cHV0Q29tcHJlc3Npb25DbGFzcyhDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBjbGFzc25hbWUpCi0gICAgewotICAgICAgICBjb25mLnNldChPVVRQVVRfQ09NUFJFU1NJT05fQ0xBU1MsIGNsYXNzbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE91dHB1dENvbXByZXNzaW9uQ2h1bmtMZW5ndGgoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgbGVuZ3RoKQotICAgIHsKLSAgICAgICAgY29uZi5zZXQoT1VUUFVUX0NPTVBSRVNTSU9OX0NIVU5LX0xFTkdUSCwgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0T3V0cHV0TG9jYWxEQ09ubHkoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEJvb2xlYW4ucGFyc2VCb29sZWFuKGNvbmYuZ2V0KE9VVFBVVF9MT0NBTF9EQ19PTkxZLCAiZmFsc2UiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE91dHB1dExvY2FsRENPbmx5KENvbmZpZ3VyYXRpb24gY29uZiwgYm9vbGVhbiBsb2NhbERDT25seSkKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KE9VVFBVVF9MT0NBTF9EQ19PTkxZLCBCb29sZWFuLnRvU3RyaW5nKGxvY2FsRENPbmx5KSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGFkb29wL0hhZG9vcENvbXBhdC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGFkb29wL0hhZG9vcENvbXBhdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzlmOTQ4Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9IYWRvb3BDb21wYXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oYWRvb3A7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuQ291bnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuSW5wdXRTcGxpdDsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuSm9iQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuSm9iSUQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLk1hcENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLk91dHB1dENvbW1pdHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuUmVjb3JkUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5SZWNvcmRXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLlN0YXR1c1JlcG9ydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5UYXNrQXR0ZW1wdENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLlRhc2tBdHRlbXB0SUQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLlRhc2tJbnB1dE91dHB1dENvbnRleHQ7Ci0KLS8qCi0gKiBUaGlzIGlzIGJhc2VkIG9uIENvbnRleHRGYWN0b3J5LmphdmEgZnJvbSBoYWRvb3AtMi4wLnggc291cmNlcy4KLSAqLwotCi0vKioKLSAqIFV0aWxpdHkgbWV0aG9kcyB0byBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gZGVhbCB3aXRoIGluY29uc2lzdGVuY2llcyBiZXR3ZWVuCi0gKiBNYXBSZWR1Y2UgQ29udGV4dCBPYmplY3RzIEFQSSBiZXR3ZWVuIEhhZG9vcCAxLnggYW5kIDIueC4KLSAqLwotcHVibGljIGNsYXNzIEhhZG9vcENvbXBhdAotewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiB1c2VWMjE7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25zdHJ1Y3Rvcjw/PiBKT0JfQ09OVEVYVF9DT05TVFJVQ1RPUjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25zdHJ1Y3Rvcjw/PiBUQVNLX0NPTlRFWFRfQ09OU1RSVUNUT1I7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uc3RydWN0b3I8Pz4gTUFQX0NPTlRFWFRfQ09OU1RSVUNUT1I7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uc3RydWN0b3I8Pz4gR0VORVJJQ19DT1VOVEVSX0NPTlNUUlVDVE9SOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmllbGQgUkVBREVSX0ZJRUxEOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpZWxkIFdSSVRFUl9GSUVMRDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBHRVRfQ09ORklHVVJBVElPTl9NRVRIT0Q7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIFNFVF9TVEFUVVNfTUVUSE9EOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBHRVRfQ09VTlRFUl9NRVRIT0Q7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIElOQ1JFTUVOVF9DT1VOVEVSX01FVEhPRDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgR0VUX1RBU0tfQVRURU1QVF9JRDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgUFJPR1JFU1NfTUVUSE9EOwotCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBib29sZWFuIHYyMSA9IHRydWU7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBQQUNLQUdFID0gIm9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZSI7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcy5mb3JOYW1lKFBBQ0tBR0UgKyAiLnRhc2suSm9iQ29udGV4dEltcGwiKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKQotICAgICAgICB7Ci0gICAgICAgICAgICB2MjEgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICB1c2VWMjEgPSB2MjE7Ci0gICAgICAgIENsYXNzPD8+IGpvYkNvbnRleHRDbHM7Ci0gICAgICAgIENsYXNzPD8+IHRhc2tDb250ZXh0Q2xzOwotICAgICAgICBDbGFzczw/PiB0YXNrSU9Db250ZXh0Q2xzOwotICAgICAgICBDbGFzczw/PiBtYXBDb250ZXh0Q2xzOwotICAgICAgICBDbGFzczw/PiBnZW5lcmljQ291bnRlckNsczsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2MjEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgam9iQ29udGV4dENscyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKFBBQ0tBR0UrIi50YXNrLkpvYkNvbnRleHRJbXBsIik7Ci0gICAgICAgICAgICAgICAgdGFza0NvbnRleHRDbHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZShQQUNLQUdFKyIudGFzay5UYXNrQXR0ZW1wdENvbnRleHRJbXBsIik7Ci0gICAgICAgICAgICAgICAgdGFza0lPQ29udGV4dENscyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKFBBQ0tBR0UrIi50YXNrLlRhc2tJbnB1dE91dHB1dENvbnRleHRJbXBsIik7Ci0gICAgICAgICAgICAgICAgbWFwQ29udGV4dENscyA9IENsYXNzLmZvck5hbWUoUEFDS0FHRSArICIudGFzay5NYXBDb250ZXh0SW1wbCIpOwotICAgICAgICAgICAgICAgIGdlbmVyaWNDb3VudGVyQ2xzID0gQ2xhc3MuZm9yTmFtZShQQUNLQUdFKyIuY291bnRlcnMuR2VuZXJpY0NvdW50ZXIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBqb2JDb250ZXh0Q2xzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoUEFDS0FHRSsiLkpvYkNvbnRleHQiKTsKLSAgICAgICAgICAgICAgICB0YXNrQ29udGV4dENscyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKFBBQ0tBR0UrIi5UYXNrQXR0ZW1wdENvbnRleHQiKTsKLSAgICAgICAgICAgICAgICB0YXNrSU9Db250ZXh0Q2xzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoUEFDS0FHRSsiLlRhc2tJbnB1dE91dHB1dENvbnRleHQiKTsKLSAgICAgICAgICAgICAgICBtYXBDb250ZXh0Q2xzID0gQ2xhc3MuZm9yTmFtZShQQUNLQUdFICsgIi5NYXBDb250ZXh0Iik7Ci0gICAgICAgICAgICAgICAgZ2VuZXJpY0NvdW50ZXJDbHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLkNvdW50ZXJzJENvdW50ZXIiKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbid0IGZpbmQgY2xhc3MiLCBlKTsKLSAgICAgICAgfQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgSk9CX0NPTlRFWFRfQ09OU1RSVUNUT1IgPQotICAgICAgICAgICAgICAgICAgICBqb2JDb250ZXh0Q2xzLmdldENvbnN0cnVjdG9yKENvbmZpZ3VyYXRpb24uY2xhc3MsIEpvYklELmNsYXNzKTsKLSAgICAgICAgICAgIEpPQl9DT05URVhUX0NPTlNUUlVDVE9SLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICBUQVNLX0NPTlRFWFRfQ09OU1RSVUNUT1IgPQotICAgICAgICAgICAgICAgICAgICB0YXNrQ29udGV4dENscy5nZXRDb25zdHJ1Y3RvcihDb25maWd1cmF0aW9uLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhc2tBdHRlbXB0SUQuY2xhc3MpOwotICAgICAgICAgICAgVEFTS19DT05URVhUX0NPTlNUUlVDVE9SLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICBHRU5FUklDX0NPVU5URVJfQ09OU1RSVUNUT1IgPQotICAgICAgICAgICAgICAgICAgICBnZW5lcmljQ291bnRlckNscy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKFN0cmluZy5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy5UWVBFKTsKLSAgICAgICAgICAgIEdFTkVSSUNfQ09VTlRFUl9DT05TVFJVQ1RPUi5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCi0gICAgICAgICAgICBpZiAodXNlVjIxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1BUF9DT05URVhUX0NPTlNUUlVDVE9SID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcENvbnRleHRDbHMuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihDb25maWd1cmF0aW9uLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXNrQXR0ZW1wdElELmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmRSZWFkZXIuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZFdyaXRlci5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0Q29tbWl0dGVyLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNSZXBvcnRlci5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTcGxpdC5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgTWV0aG9kIGdldF9jb3VudGVyOwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0X2NvdW50ZXIgPSBDbGFzcy5mb3JOYW1lKFBBQ0tBR0UgKyAiLlRhc2tBdHRlbXB0Q29udGV4dCIpLmdldE1ldGhvZCgiZ2V0Q291bnRlciIsIFN0cmluZy5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBnZXRfY291bnRlciA9IENsYXNzLmZvck5hbWUoUEFDS0FHRSArICIuVGFza0lucHV0T3V0cHV0Q29udGV4dCIpLmdldE1ldGhvZCgiZ2V0Q291bnRlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBHRVRfQ09VTlRFUl9NRVRIT0QgPSBnZXRfY291bnRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNQVBfQ09OVEVYVF9DT05TVFJVQ1RPUiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXBDb250ZXh0Q2xzLmdldENvbnN0cnVjdG9yKENvbmZpZ3VyYXRpb24uY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhc2tBdHRlbXB0SUQuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZFJlYWRlci5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkV3JpdGVyLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRDb21taXR0ZXIuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1c1JlcG9ydGVyLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFNwbGl0LmNsYXNzKTsKLSAgICAgICAgICAgICAgICBHRVRfQ09VTlRFUl9NRVRIT0QgPSBDbGFzcy5mb3JOYW1lKFBBQ0tBR0UrIi5UYXNrSW5wdXRPdXRwdXRDb250ZXh0IikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXRob2QoImdldENvdW50ZXIiLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNQVBfQ09OVEVYVF9DT05TVFJVQ1RPUi5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgUkVBREVSX0ZJRUxEID0gbWFwQ29udGV4dENscy5nZXREZWNsYXJlZEZpZWxkKCJyZWFkZXIiKTsKLSAgICAgICAgICAgIFJFQURFUl9GSUVMRC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgV1JJVEVSX0ZJRUxEID0gdGFza0lPQ29udGV4dENscy5nZXREZWNsYXJlZEZpZWxkKCJvdXRwdXQiKTsKLSAgICAgICAgICAgIFdSSVRFUl9GSUVMRC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgR0VUX0NPTkZJR1VSQVRJT05fTUVUSE9EID0gQ2xhc3MuZm9yTmFtZShQQUNLQUdFKyIuSm9iQ29udGV4dCIpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNZXRob2QoImdldENvbmZpZ3VyYXRpb24iKTsKLSAgICAgICAgICAgIFNFVF9TVEFUVVNfTUVUSE9EID0gQ2xhc3MuZm9yTmFtZShQQUNLQUdFKyIuVGFza0F0dGVtcHRDb250ZXh0IikKLSAgICAgICAgICAgICAgICAgICAgLmdldE1ldGhvZCgic2V0U3RhdHVzIiwgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgICAgIEdFVF9UQVNLX0FUVEVNUFRfSUQgPSBDbGFzcy5mb3JOYW1lKFBBQ0tBR0UrIi5UYXNrQXR0ZW1wdENvbnRleHQiKQotICAgICAgICAgICAgICAgICAgICAuZ2V0TWV0aG9kKCJnZXRUYXNrQXR0ZW1wdElEIik7Ci0gICAgICAgICAgICBJTkNSRU1FTlRfQ09VTlRFUl9NRVRIT0QgPSBDbGFzcy5mb3JOYW1lKFBBQ0tBR0UrIi5Db3VudGVyIikKLSAgICAgICAgICAgICAgICAgICAgLmdldE1ldGhvZCgiaW5jcmVtZW50IiwgTG9uZy5UWVBFKTsKLSAgICAgICAgICAgIFBST0dSRVNTX01FVEhPRCA9IENsYXNzLmZvck5hbWUoUEFDS0FHRSsiLlRhc2tBdHRlbXB0Q29udGV4dCIpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNZXRob2QoInByb2dyZXNzIik7Ci0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3QgcnVuIGNvbnN0cnVjdG9yICIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3QgZmluZCBjb25zdHJ1Y3RvciAiLCBlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3QgZmluZCBmaWVsZCAiLCBlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCBmaW5kIGNsYXNzIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHJ1bnRpbWUgSGFkb29wIHZlcnNpb24gaXMgMi54LCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmVyc2lvbjJ4KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1c2VWMjE7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKENvbnN0cnVjdG9yPD8+IGNvbnN0cnVjdG9yLCBPYmplY3QuLi5hcmdzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCBpbnN0YW50aWF0ZSAiICsgY29uc3RydWN0b3IsIGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbid0IGluc3RhbnRpYXRlICIgKyBjb25zdHJ1Y3RvciwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3QgaW5zdGFudGlhdGUgIiArIGNvbnN0cnVjdG9yLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgSm9iQ29udGV4dCBmcm9tIGEgSm9iQ29uZiBhbmQgam9iSWQgdXNpbmcgdGhlIGNvcnJlY3QgY29uc3RydWN0b3IKLSAgICAgKiBmb3IgYmFzZWQgb24gSGFkb29wIHZlcnNpb24uIDxjb2RlPmpvYklkPC9jb2RlPiBjb3VsZCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSm9iQ29udGV4dCBuZXdKb2JDb250ZXh0KENvbmZpZ3VyYXRpb24gY29uZiwgSm9iSUQgam9iSWQpIHsKLSAgICAgICAgcmV0dXJuIChKb2JDb250ZXh0KSBuZXdJbnN0YW5jZShKT0JfQ09OVEVYVF9DT05TVFJVQ1RPUiwgY29uZiwgam9iSWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgVGFza0F0dGVtcENvbnRleHQgZnJvbSBhIEpvYkNvbmYgYW5kIGpvYklkIHVzaW5nIHRoZSBjb3JyZWN0Ci0gICAgICogY29uc3RydWN0b3IgZm9yIGJhc2VkIG9uIEhhZG9vcCB2ZXJzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGFza0F0dGVtcHRDb250ZXh0IG5ld1Rhc2tBdHRlbXB0Q29udGV4dCgKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZiwgVGFza0F0dGVtcHRJRCB0YXNrQXR0ZW1wdElkKSB7Ci0gICAgICAgIHJldHVybiAoVGFza0F0dGVtcHRDb250ZXh0KQotICAgICAgICAgICAgICAgIG5ld0luc3RhbmNlKFRBU0tfQ09OVEVYVF9DT05TVFJVQ1RPUiwgY29uZiwgdGFza0F0dGVtcHRJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIE1hcENvbnRleHQgdW5kZXIgSGFkb29wIDEgYW5kIE1hcENvbnRleHRJbXBsIHVuZGVyIEhhZG9vcCAyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwQ29udGV4dCBuZXdNYXBDb250ZXh0KENvbmZpZ3VyYXRpb24gY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXNrQXR0ZW1wdElEIHRhc2tBdHRlbXB0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkUmVhZGVyIHJlY29yZFJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmRXcml0ZXIgcmVjb3JkV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dENvbW1pdHRlciBvdXRwdXRDb21taXR0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzUmVwb3J0ZXIgc3RhdHVzUmVwb3J0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTcGxpdCBpbnB1dFNwbGl0KSB7Ci0gICAgICAgIHJldHVybiAoTWFwQ29udGV4dCkgbmV3SW5zdGFuY2UoTUFQX0NPTlRFWFRfQ09OU1RSVUNUT1IsCi0gICAgICAgICAgICAgICAgY29uZiwgdGFza0F0dGVtcHRJRCwgcmVjb3JkUmVhZGVyLCByZWNvcmRXcml0ZXIsIG91dHB1dENvbW1pdHRlciwKLSAgICAgICAgICAgICAgICBzdGF0dXNSZXBvcnRlciwgaW5wdXRTcGxpdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB3aXRoIEhhZG9vcCAyIDogPGNvZGU+bmV3IEdlbmVyaWNDb3VudGVyKGFyZ3MpPC9jb2RlPiw8YnI+Ci0gICAgICogICAgICAgICB3aXRoIEhhZG9vcCAxIDogPGNvZGU+bmV3IENvdW50ZXIoYXJncyk8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb3VudGVyIG5ld0dlbmVyaWNDb3VudGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgZGlzcGxheU5hbWUsIGxvbmcgdmFsdWUpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChDb3VudGVyKQotICAgICAgICAgICAgICAgICAgICBHRU5FUklDX0NPVU5URVJfQ09OU1RSVUNUT1IubmV3SW5zdGFuY2UobmFtZSwgZGlzcGxheU5hbWUsIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB8IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gfCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbid0IGluc3RhbnRpYXRlIENvdW50ZXIiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZXMgYSBtZXRob2QgYW5kIHJldGhyb3dzIGFueSBleGNlcHRpb24gYXMgcnVudGltZSBleGNldHBpb25zLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBpbnZva2UoTWV0aG9kIG1ldGhvZCwgT2JqZWN0IG9iaiwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2Uob2JqLCBhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB8IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3QgaW52b2tlIG1ldGhvZCAiICsgbWV0aG9kLmdldE5hbWUoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2UgZ2V0Q29uZmlndXJhdGlvbigpIG9uIEpvYkNvbnRleHQuIFdvcmtzIHdpdGggYm90aAotICAgICAqIEhhZG9vcCAxIGFuZCAyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKEpvYkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoQ29uZmlndXJhdGlvbikgaW52b2tlKEdFVF9DT05GSUdVUkFUSU9OX01FVEhPRCwgY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlIHNldFN0YXR1cygpIG9uIFRhc2tBdHRlbXB0Q29udGV4dC4gV29ya3Mgd2l0aCBib3RoCi0gICAgICogSGFkb29wIDEgYW5kIDIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFN0YXR1cyhUYXNrQXR0ZW1wdENvbnRleHQgY29udGV4dCwgU3RyaW5nIHN0YXR1cykKLSAgICB7Ci0gICAgICAgIGludm9rZShTRVRfU1RBVFVTX01FVEhPRCwgY29udGV4dCwgc3RhdHVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm5zIFRhc2tBdHRlbXB0Q29udGV4dC5nZXRUYXNrQXR0ZW1wdElEKCkuIFdvcmtzIHdpdGggYm90aAotICAgICAqIEhhZG9vcCAxIGFuZCAyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGFza0F0dGVtcHRJRCBnZXRUYXNrQXR0ZW1wdElEKFRhc2tBdHRlbXB0Q29udGV4dCB0YXNrQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVGFza0F0dGVtcHRJRCkgaW52b2tlKEdFVF9UQVNLX0FUVEVNUFRfSUQsIHRhc2tDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2UgZ2V0Q291bnRlcigpIG9uIFRhc2tJbnB1dE91dHB1dENvbnRleHQuIFdvcmtzIHdpdGggYm90aAotICAgICAqIEhhZG9vcCAxIGFuZCAyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ291bnRlciBnZXRDb3VudGVyKFRhc2tJbnB1dE91dHB1dENvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZ3JvdXBOYW1lLCBTdHJpbmcgY291bnRlck5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKENvdW50ZXIpIGludm9rZShHRVRfQ09VTlRFUl9NRVRIT0QsIGNvbnRleHQsIGdyb3VwTmFtZSwgY291bnRlck5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZSBUYXNrQXR0ZW1wdENvbnRleHQucHJvZ3Jlc3MoKS4gV29ya3Mgd2l0aCBib3RoCi0gICAgICogSGFkb29wIDEgYW5kIDIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByb2dyZXNzKFRhc2tBdHRlbXB0Q29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgaW52b2tlKFBST0dSRVNTX01FVEhPRCwgY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5jcmVtZW50IHRoZSBjb3VudGVyLiBXb3JrcyB3aXRoIGJvdGggSGFkb29wIDEgYW5kIDIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5jcmVtZW50Q291bnRlcihDb3VudGVyIGNvdW50ZXIsIGxvbmcgaW5jcmVtZW50KQotICAgIHsKLSAgICAgICAgLy8gaW5jcmVtZW50aW5nIGEgY291bnQgbWlnaHQgYmUgY2FsbGVkIG9mdGVuLiBNaWdodCBiZSBhZmZlY3RlZCBieQotICAgICAgICAvLyBjb3N0IG9mIGludm9rZSgpLiBtaWdodCBiZSBnb29kIGNhbmRpZGF0ZSB0byBoYW5kbGUgaW4gYSBzaGltLgotICAgICAgICAvLyAoVE9ETyBSYWdodSkgZmlndXJlIG91dCBob3cgYWNoaWV2ZSBzdWNoIGEgYnVpbGQgd2l0aCBtYXZlbgotICAgICAgICBpbnZva2UoSU5DUkVNRU5UX0NPVU5URVJfTUVUSE9ELCBjb3VudGVyLCBpbmNyZW1lbnQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9SZXBvcnRlcldyYXBwZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9SZXBvcnRlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJjYzc2OS4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvUmVwb3J0ZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oYWRvb3A7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuQ291bnRlcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLklucHV0U3BsaXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLlJlcG9ydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5TdGF0dXNSZXBvcnRlcjsKLQotLyoqCi0gKiBBIHJlcG9ydGVyIHRoYXQgd29ya3Mgd2l0aCBib3RoIG1hcHJlZCBhbmQgbWFwcmVkdWNlIEFQSXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvcnRlcldyYXBwZXIgZXh0ZW5kcyBTdGF0dXNSZXBvcnRlciBpbXBsZW1lbnRzIFJlcG9ydGVyCi17Ci0gICAgcHJpdmF0ZSBSZXBvcnRlciB3cmFwcGVkUmVwb3J0ZXI7Ci0KLSAgICBwdWJsaWMgUmVwb3J0ZXJXcmFwcGVyKFJlcG9ydGVyIHJlcG9ydGVyKQotICAgIHsKLSAgICAgICAgd3JhcHBlZFJlcG9ydGVyID0gcmVwb3J0ZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvdW50ZXJzLkNvdW50ZXIgZ2V0Q291bnRlcihFbnVtPD8+IGFuRW51bSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkUmVwb3J0ZXIuZ2V0Q291bnRlcihhbkVudW0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb3VudGVycy5Db3VudGVyIGdldENvdW50ZXIoU3RyaW5nIHMsIFN0cmluZyBzMSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkUmVwb3J0ZXIuZ2V0Q291bnRlcihzLCBzMSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5jckNvdW50ZXIoRW51bTw/PiBhbkVudW0sIGxvbmcgbCkKLSAgICB7Ci0gICAgICAgIHdyYXBwZWRSZXBvcnRlci5pbmNyQ291bnRlcihhbkVudW0sIGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluY3JDb3VudGVyKFN0cmluZyBzLCBTdHJpbmcgczEsIGxvbmcgbCkKLSAgICB7Ci0gICAgICAgIHdyYXBwZWRSZXBvcnRlci5pbmNyQ291bnRlcihzLCBzMSwgbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElucHV0U3BsaXQgZ2V0SW5wdXRTcGxpdCgpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWRSZXBvcnRlci5nZXRJbnB1dFNwbGl0KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvZ3Jlc3MoKQotICAgIHsKLSAgICAgICAgd3JhcHBlZFJlcG9ydGVyLnByb2dyZXNzKCk7Ci0gICAgfQotCi0gICAgLy8gQE92ZXJyaWRlCi0gICAgcHVibGljIGZsb2F0IGdldFByb2dyZXNzKCkKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHdyYXBwZWRSZXBvcnRlci5zZXRTdGF0dXMocyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGFkb29wL2NxbDMvQ3FsQnVsa091dHB1dEZvcm1hdC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGFkb29wL2NxbDMvQ3FsQnVsa091dHB1dEZvcm1hdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmRmODU1Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9jcWwzL0NxbEJ1bGtPdXRwdXRGb3JtYXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oYWRvb3AuY3FsMzsKLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGFkb29wLkNvbmZpZ0hlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oYWRvb3AuSGFkb29wQ29tcGF0OwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GaWxlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5Kb2JDb25mOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5Kb2JDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5PdXRwdXRDb21taXR0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLk91dHB1dEZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuUmVjb3JkV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5UYXNrQXR0ZW1wdENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AudXRpbC5Qcm9ncmVzc2FibGU7Ci0KLS8qKgotICogVGhlIDxjb2RlPkNxbEJ1bGtPdXRwdXRGb3JtYXQ8L2NvZGU+IGFjdHMgYXMgYSBIYWRvb3Atc3BlY2lmaWMKLSAqIE91dHB1dEZvcm1hdCB0aGF0IGFsbG93cyByZWR1Y2UgdGFza3MgdG8gc3RvcmUga2V5cyAoYW5kIGNvcnJlc3BvbmRpbmcKLSAqIGJvdW5kIHZhcmlhYmxlIHZhbHVlcykgYXMgQ1FMIHJvd3MgKGFuZCByZXNwZWN0aXZlIGNvbHVtbnMpIGluIGEgZ2l2ZW4KLSAqIHRhYmxlLgotICoKLSAqIDxwPgotICogQXMgaXMgdGhlIGNhc2Ugd2l0aCB0aGUge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcC5jcWwzLkNxbE91dHB1dEZvcm1hdH0sIAotICogeW91IG5lZWQgdG8gc2V0IHRoZSBwcmVwYXJlZCBzdGF0ZW1lbnQgaW4geW91cgotICogSGFkb29wIGpvYiBDb25maWd1cmF0aW9uLiBUaGUge0BsaW5rIENxbENvbmZpZ0hlbHBlcn0gY2xhc3MsIHRocm91Z2ggaXRzCi0gKiB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGFkb29wLkNvbmZpZ0hlbHBlciNzZXRPdXRwdXRQcmVwYXJlZFN0YXRlbWVudH0gbWV0aG9kLCBpcyBwcm92aWRlZCB0byBtYWtlIHRoaXMKLSAqIHNpbXBsZS4KLSAqIHlvdSBuZWVkIHRvIHNldCB0aGUgS2V5c3BhY2UuIFRoZSB7QGxpbmsgQ29uZmlnSGVscGVyfSBjbGFzcywgdGhyb3VnaCBpdHMKLSAqIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oYWRvb3AuQ29uZmlnSGVscGVyI3NldE91dHB1dENvbHVtbkZhbWlseX0gbWV0aG9kLCBpcyBwcm92aWRlZCB0byBtYWtlIHRoaXMKLSAqIHNpbXBsZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIENxbEJ1bGtPdXRwdXRGb3JtYXQgZXh0ZW5kcyBPdXRwdXRGb3JtYXQ8T2JqZWN0LCBMaXN0PEJ5dGVCdWZmZXI+PgotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5PdXRwdXRGb3JtYXQ8T2JqZWN0LCBMaXN0PEJ5dGVCdWZmZXI+PgoteyAgIAotICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0NRTF9TQ0hFTUFfUFJFRklYID0gImNhc3NhbmRyYS50YWJsZS5zY2hlbWEuIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0NRTF9JTlNFUlRfUFJFRklYID0gImNhc3NhbmRyYS50YWJsZS5pbnNlcnQuIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX1NPVVJDRSA9ICJjYXNzYW5kcmEub3V0cHV0LmRlbGV0ZS5zb3VyY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9BTElBU19QUkVGSVggPSAiY3FsYnVsa291dHB1dGZvcm1hdC50YWJsZS5hbGlhcy4iOwotICAKLSAgICAvKiogRmlsbHMgdGhlIGRlcHJlY2F0ZWQgT3V0cHV0Rm9ybWF0IGludGVyZmFjZSBmb3Igc3RyZWFtaW5nLiAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIENxbEJ1bGtSZWNvcmRXcml0ZXIgZ2V0UmVjb3JkV3JpdGVyKEZpbGVTeXN0ZW0gZmlsZXN5c3RlbSwgSm9iQ29uZiBqb2IsIFN0cmluZyBuYW1lLCBQcm9ncmVzc2FibGUgcHJvZ3Jlc3MpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDcWxCdWxrUmVjb3JkV3JpdGVyKGpvYiwgcHJvZ3Jlc3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUge0BsaW5rIFJlY29yZFdyaXRlcn0gZm9yIHRoZSBnaXZlbiB0YXNrLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCB0YXNrLgotICAgICAqIEByZXR1cm4gYSB7QGxpbmsgUmVjb3JkV3JpdGVyfSB0byB3cml0ZSB0aGUgb3V0cHV0IGZvciB0aGUgam9iLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgQ3FsQnVsa1JlY29yZFdyaXRlciBnZXRSZWNvcmRXcml0ZXIoZmluYWwgVGFza0F0dGVtcHRDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ3FsQnVsa1JlY29yZFdyaXRlcihjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjaGVja091dHB1dFNwZWNzKEpvYkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIGNoZWNrT3V0cHV0U3BlY3MoSGFkb29wQ29tcGF0LmdldENvbmZpZ3VyYXRpb24oY29udGV4dCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja091dHB1dFNwZWNzKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIGlmIChDb25maWdIZWxwZXIuZ2V0T3V0cHV0S2V5c3BhY2UoY29uZikgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ5b3UgbXVzdCBzZXQgdGhlIGtleXNwYWNlIHdpdGggc2V0VGFibGUoKSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIEZpbGxzIHRoZSBkZXByZWNhdGVkIE91dHB1dEZvcm1hdCBpbnRlcmZhY2UgZm9yIHN0cmVhbWluZy4gKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyB2b2lkIGNoZWNrT3V0cHV0U3BlY3Mob3JnLmFwYWNoZS5oYWRvb3AuZnMuRmlsZVN5c3RlbSBmaWxlc3lzdGVtLCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuSm9iQ29uZiBqb2IpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY2hlY2tPdXRwdXRTcGVjcyhqb2IpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPdXRwdXRDb21taXR0ZXIgZ2V0T3V0cHV0Q29tbWl0dGVyKFRhc2tBdHRlbXB0Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IE51bGxPdXRwdXRDb21taXR0ZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFRhYmxlU2NoZW1hKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGNvbHVtbkZhbWlseSwgU3RyaW5nIHNjaGVtYSkKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KE9VVFBVVF9DUUxfU0NIRU1BX1BSRUZJWCArIGNvbHVtbkZhbWlseSwgc2NoZW1hKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VGFibGVJbnNlcnRTdGF0ZW1lbnQoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgY29sdW1uRmFtaWx5LCBTdHJpbmcgaW5zZXJ0U3RhdGVtZW50KQotICAgIHsKLSAgICAgICAgY29uZi5zZXQoT1VUUFVUX0NRTF9JTlNFUlRfUFJFRklYICsgY29sdW1uRmFtaWx5LCBpbnNlcnRTdGF0ZW1lbnQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUYWJsZVNjaGVtYShDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBjb2x1bW5GYW1pbHkpCi0gICAgewotICAgICAgICBTdHJpbmcgc2NoZW1hID0gY29uZi5nZXQoT1VUUFVUX0NRTF9TQ0hFTUFfUFJFRklYICsgY29sdW1uRmFtaWx5KTsKLSAgICAgICAgaWYgKHNjaGVtYSA9PSBudWxsKQotICAgICAgICB7IAotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJZb3UgbXVzdCBzZXQgdGhlIFRhYmxlIHNjaGVtYSB1c2luZyBzZXRUYWJsZVNjaGVtYS4iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2NoZW1hOyAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGFibGVJbnNlcnRTdGF0ZW1lbnQoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgY29sdW1uRmFtaWx5KQotICAgIHsKLSAgICAgICAgU3RyaW5nIGluc2VydCA9IGNvbmYuZ2V0KE9VVFBVVF9DUUxfSU5TRVJUX1BSRUZJWCArIGNvbHVtbkZhbWlseSk7IAotICAgICAgICBpZiAoaW5zZXJ0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiWW91IG11c3Qgc2V0IHRoZSBUYWJsZSBpbnNlcnQgc3RhdGVtZW50IHVzaW5nIHNldFRhYmxlU2NoZW1hLiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnNlcnQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWxldGVTb3VyY2VPblN1Y2Nlc3MoQ29uZmlndXJhdGlvbiBjb25mLCBib29sZWFuIGRlbGV0ZVNyYykKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0Qm9vbGVhbihERUxFVEVfU09VUkNFLCBkZWxldGVTcmMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RGVsZXRlU291cmNlT25TdWNjZXNzKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb25mLmdldEJvb2xlYW4oREVMRVRFX1NPVVJDRSwgZmFsc2UpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VGFibGVBbGlhcyhDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBhbGlhcywgU3RyaW5nIGNvbHVtbkZhbWlseSkKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KFRBQkxFX0FMSUFTX1BSRUZJWCArIGFsaWFzLCBjb2x1bW5GYW1pbHkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUYWJsZUZvckFsaWFzKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGFsaWFzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbmYuZ2V0KFRBQkxFX0FMSUFTX1BSRUZJWCArIGFsaWFzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGhvc3RzIHRvIGlnbm9yZSBhcyBjb21tYSBkZWxpbWl0ZWQgdmFsdWVzLgotICAgICAqIERhdGEgd2lsbCBub3QgYmUgYnVsayBsb2FkZWQgb250byB0aGUgaWdub3JlZCBub2Rlcy4KLSAgICAgKiBAcGFyYW0gY29uZiBqb2IgY29uZmlndXJhdGlvbgotICAgICAqIEBwYXJhbSBpZ25vcmVOb2Rlc0NzdiBhIGNvbW1hIGRlbGltaXRlZCBsaXN0IG9mIG5vZGVzIHRvIGlnbm9yZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJZ25vcmVIb3N0cyhDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBpZ25vcmVOb2Rlc0NzdikKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KENxbEJ1bGtSZWNvcmRXcml0ZXIuSUdOT1JFX0hPU1RTLCBpZ25vcmVOb2Rlc0Nzdik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBob3N0cyB0byBpZ25vcmUuIERhdGEgd2lsbCBub3QgYmUgYnVsayBsb2FkZWQgb250byB0aGUgaWdub3JlZCBub2Rlcy4KLSAgICAgKiBAcGFyYW0gY29uZiBqb2IgY29uZmlndXJhdGlvbgotICAgICAqIEBwYXJhbSBpZ25vcmVOb2RlcyB0aGUgbm9kZXMgdG8gaWdub3JlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElnbm9yZUhvc3RzKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nLi4uIGlnbm9yZU5vZGVzKQotICAgIHsKLSAgICAgICAgY29uZi5zZXRTdHJpbmdzKENxbEJ1bGtSZWNvcmRXcml0ZXIuSUdOT1JFX0hPU1RTLCBpZ25vcmVOb2Rlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBob3N0cyB0byBpZ25vcmUgYXMgYSBjb2xsZWN0aW9uIG9mIHN0cmluZ3MKLSAgICAgKiBAcGFyYW0gY29uZiBqb2IgY29uZmlndXJhdGlvbgotICAgICAqIEByZXR1cm4gdGhlIG5vZGVzIHRvIGlnbm9yZSBhcyBhIGNvbGxlY3Rpb24gb2Ygc3Rpcm5ncwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldElnbm9yZUhvc3RzKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb25mLmdldFN0cmluZ0NvbGxlY3Rpb24oQ3FsQnVsa1JlY29yZFdyaXRlci5JR05PUkVfSE9TVFMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTnVsbE91dHB1dENvbW1pdHRlciBleHRlbmRzIE91dHB1dENvbW1pdHRlcgotICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgYWJvcnRUYXNrKFRhc2tBdHRlbXB0Q29udGV4dCB0YXNrQ29udGV4dCkgeyB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xlYW51cEpvYihKb2JDb250ZXh0IGpvYkNvbnRleHQpIHsgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbW1pdFRhc2soVGFza0F0dGVtcHRDb250ZXh0IHRhc2tDb250ZXh0KSB7IH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBuZWVkc1Rhc2tDb21taXQoVGFza0F0dGVtcHRDb250ZXh0IHRhc2tDb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXR1cEpvYihKb2JDb250ZXh0IGpvYkNvbnRleHQpIHsgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldHVwVGFzayhUYXNrQXR0ZW1wdENvbnRleHQgdGFza0NvbnRleHQpIHsgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9jcWwzL0NxbEJ1bGtSZWNvcmRXcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9jcWwzL0NxbEJ1bGtSZWNvcmRXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJkNWU4YS4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvY3FsMy9DcWxCdWxrUmVjb3JkV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGFkb29wLmNxbDM7Ci0KLWltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuKjsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLm5ldC5Ib3N0QW5kUG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLnNjaGVtYS5DcmVhdGVUYWJsZVN0YXRlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5NdXJtdXIzUGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oYWRvb3AuQ29uZmlnSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcC5IYWRvb3BDb21wYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5DUUxTU1RhYmxlV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTmF0aXZlU1NUYWJsZUxvYWRlckNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PdXRwdXRIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuUmVjb3JkV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5UYXNrQXR0ZW1wdENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AudXRpbC5Qcm9ncmVzc2FibGU7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5KQVZBX0lPX1RNUERJUjsKLQotLyoqCi0gKiBUaGUgPGNvZGU+Q3FsQnVsa1JlY29yZFdyaXRlcjwvY29kZT4gbWFwcyB0aGUgb3V0cHV0ICZsdDtrZXksIHZhbHVlJmd0OwotICogcGFpcnMgdG8gYSBDYXNzYW5kcmEgY29sdW1uIGZhbWlseS4gSW4gcGFydGljdWxhciwgaXQgYXBwbGllcyB0aGUgYmluZGVkIHZhcmlhYmxlcwotICogaW4gdGhlIHZhbHVlIHRvIHRoZSBwcmVwYXJlZCBzdGF0ZW1lbnQsIHdoaWNoIGl0IGFzc29jaWF0ZXMgd2l0aCB0aGUga2V5LCBhbmQgaW4gCi0gKiB0dXJuIHRoZSByZXNwb25zaWJsZSBlbmRwb2ludC4KLSAqCi0gKiA8cD4KLSAqIEZ1cnRoZXJtb3JlLCB0aGlzIHdyaXRlciBncm91cHMgdGhlIGNxbCBxdWVyaWVzIGJ5IHRoZSBlbmRwb2ludCByZXNwb25zaWJsZSBmb3IKLSAqIHRoZSByb3dzIGJlaW5nIGFmZmVjdGVkLiBUaGlzIGFsbG93cyB0aGUgY3FsIHF1ZXJpZXMgdG8gYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwsCi0gKiBkaXJlY3RseSB0byBhIHJlc3BvbnNpYmxlIGVuZHBvaW50LgotICogPC9wPgotICoKLSAqIEBzZWUgQ3FsQnVsa091dHB1dEZvcm1hdAotICovCi1wdWJsaWMgY2xhc3MgQ3FsQnVsa1JlY29yZFdyaXRlciBleHRlbmRzIFJlY29yZFdyaXRlcjxPYmplY3QsIExpc3Q8Qnl0ZUJ1ZmZlcj4+Ci0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLlJlY29yZFdyaXRlcjxPYmplY3QsIExpc3Q8Qnl0ZUJ1ZmZlcj4+Ci17Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgT1VUUFVUX0xPQ0FUSU9OID0gIm1hcHJlZHVjZS5vdXRwdXQuYnVsa291dHB1dGZvcm1hdC5sb2NhbGRpciI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQlVGRkVSX1NJWkVfSU5fTUIgPSAibWFwcmVkdWNlLm91dHB1dC5idWxrb3V0cHV0Zm9ybWF0LmJ1ZmZlcnNpemUiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUUkVBTV9USFJPVFRMRV9NQklUUyA9ICJtYXByZWR1Y2Uub3V0cHV0LmJ1bGtvdXRwdXRmb3JtYXQuc3RyZWFtdGhyb3R0bGVtYml0cyI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUFYX0ZBSUxFRF9IT1NUUyA9ICJtYXByZWR1Y2Uub3V0cHV0LmJ1bGtvdXRwdXRmb3JtYXQubWF4ZmFpbGVkaG9zdHMiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElHTk9SRV9IT1NUUyA9ICJtYXByZWR1Y2Uub3V0cHV0LmJ1bGtvdXRwdXRmb3JtYXQuaWdub3JlaG9zdHMiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ3FsQnVsa1JlY29yZFdyaXRlci5jbGFzcyk7Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29uZmlndXJhdGlvbiBjb25mOwotICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgbWF4RmFpbHVyZXM7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIGludCBidWZmZXJTaXplOwotICAgIHByb3RlY3RlZCBDbG9zZWFibGUgd3JpdGVyOwotICAgIHByb3RlY3RlZCBTU1RhYmxlTG9hZGVyIGxvYWRlcjsKLSAgICBwcm90ZWN0ZWQgUHJvZ3Jlc3NhYmxlIHByb2dyZXNzOwotICAgIHByb3RlY3RlZCBUYXNrQXR0ZW1wdENvbnRleHQgY29udGV4dDsKLSAgICBwcm90ZWN0ZWQgZmluYWwgU2V0PEluZXRBZGRyZXNzQW5kUG9ydD4gaWdub3JlcyA9IG5ldyBIYXNoU2V0PD4oKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGtleXNwYWNlOwotICAgIHByaXZhdGUgU3RyaW5nIHRhYmxlOwotICAgIHByaXZhdGUgU3RyaW5nIHNjaGVtYTsKLSAgICBwcml2YXRlIFN0cmluZyBpbnNlcnRTdGF0ZW1lbnQ7Ci0gICAgcHJpdmF0ZSBGaWxlIG91dHB1dERpcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gZGVsZXRlU3JjOwotICAgIHByaXZhdGUgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyOwotCi0gICAgQ3FsQnVsa1JlY29yZFdyaXRlcihUYXNrQXR0ZW1wdENvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aGlzKEhhZG9vcENvbXBhdC5nZXRDb25maWd1cmF0aW9uKGNvbnRleHQpKTsKLSAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgc2V0Q29uZmlncygpOwotICAgIH0KLQotICAgIENxbEJ1bGtSZWNvcmRXcml0ZXIoQ29uZmlndXJhdGlvbiBjb25mLCBQcm9ncmVzc2FibGUgcHJvZ3Jlc3MpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhpcyhjb25mKTsKLSAgICAgICAgdGhpcy5wcm9ncmVzcyA9IHByb2dyZXNzOwotICAgICAgICBzZXRDb25maWdzKCk7Ci0gICAgfQotCi0gICAgQ3FsQnVsa1JlY29yZFdyaXRlcihDb25maWd1cmF0aW9uIGNvbmYpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhpcy5jb25mID0gY29uZjsKLSAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFN0cmVhbVRocm91Z2hwdXRPdXRib3VuZE1lZ2FiaXRzUGVyU2VjKEludGVnZXIucGFyc2VJbnQoY29uZi5nZXQoU1RSRUFNX1RIUk9UVExFX01CSVRTLCAiMCIpKSk7Ci0gICAgICAgIG1heEZhaWx1cmVzID0gSW50ZWdlci5wYXJzZUludChjb25mLmdldChNQVhfRkFJTEVEX0hPU1RTLCAiMCIpKTsKLSAgICAgICAgYnVmZmVyU2l6ZSA9IEludGVnZXIucGFyc2VJbnQoY29uZi5nZXQoQlVGRkVSX1NJWkVfSU5fTUIsICI2NCIpKTsKLSAgICAgICAgc2V0Q29uZmlncygpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgc2V0Q29uZmlncygpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gaWYgYW55dGhpbmcgaXMgbWlzc2luZywgZXhjZXB0aW9ucyB3aWxsIGJlIHRocm93biBoZXJlLCBpbnN0ZWFkIG9mIG9uIHdyaXRlKCkKLSAgICAgICAga2V5c3BhY2UgPSBDb25maWdIZWxwZXIuZ2V0T3V0cHV0S2V5c3BhY2UoY29uZik7Ci0gICAgICAgIHRhYmxlID0gQ29uZmlnSGVscGVyLmdldE91dHB1dENvbHVtbkZhbWlseShjb25mKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGNoZWNrIGlmIHRhYmxlIGlzIGFsaWFzZWQKLSAgICAgICAgU3RyaW5nIGFsaWFzZWRDZiA9IENxbEJ1bGtPdXRwdXRGb3JtYXQuZ2V0VGFibGVGb3JBbGlhcyhjb25mLCB0YWJsZSk7Ci0gICAgICAgIGlmIChhbGlhc2VkQ2YgIT0gbnVsbCkKLSAgICAgICAgICAgIHRhYmxlID0gYWxpYXNlZENmOwotICAgICAgICAKLSAgICAgICAgc2NoZW1hID0gQ3FsQnVsa091dHB1dEZvcm1hdC5nZXRUYWJsZVNjaGVtYShjb25mLCB0YWJsZSk7Ci0gICAgICAgIGluc2VydFN0YXRlbWVudCA9IENxbEJ1bGtPdXRwdXRGb3JtYXQuZ2V0VGFibGVJbnNlcnRTdGF0ZW1lbnQoY29uZiwgdGFibGUpOwotICAgICAgICBvdXRwdXREaXIgPSBnZXRUYWJsZURpcmVjdG9yeSgpOwotICAgICAgICBkZWxldGVTcmMgPSBDcWxCdWxrT3V0cHV0Rm9ybWF0LmdldERlbGV0ZVNvdXJjZU9uU3VjY2Vzcyhjb25mKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBhcnRpdGlvbmVyID0gQ29uZmlnSGVscGVyLmdldElucHV0UGFydGl0aW9uZXIoY29uZik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBwYXJ0aXRpb25lciA9IE11cm11cjNQYXJ0aXRpb25lci5pbnN0YW5jZTsKLSAgICAgICAgfQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgaG9zdFRvSWdub3JlIDogQ3FsQnVsa091dHB1dEZvcm1hdC5nZXRJZ25vcmVIb3N0cyhjb25mKSkKLSAgICAgICAgICAgICAgICBpZ25vcmVzLmFkZChJbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlOYW1lKGhvc3RUb0lnbm9yZSkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigoIlVua25vd24gaG9zdDogIiArIGUuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE91dHB1dExvY2F0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgZGlyID0gY29uZi5nZXQoT1VUUFVUX0xPQ0FUSU9OLCBKQVZBX0lPX1RNUERJUi5nZXRTdHJpbmcoKSk7Ci0gICAgICAgIGlmIChkaXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiT3V0cHV0IGRpcmVjdG9yeSBub3QgZGVmaW5lZCwgaWYgaGFkb29wIGlzIG5vdCBzZXR0aW5nIGphdmEuaW8udG1wZGlyIHRoZW4gZGVmaW5lICIgKyBPVVRQVVRfTE9DQVRJT04pOwotICAgICAgICByZXR1cm4gZGlyOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcmVwYXJlV3JpdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAod3JpdGVyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlciA9IENRTFNTVGFibGVXcml0ZXIuYnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvclRhYmxlKHNjaGVtYSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudXNpbmcoaW5zZXJ0U3RhdGVtZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoUGFydGl0aW9uZXIoQ29uZmlnSGVscGVyLmdldE91dHB1dFBhcnRpdGlvbmVyKGNvbmYpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbkRpcmVjdG9yeShvdXRwdXREaXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhCdWZmZXJTaXplSW5NaUIoSW50ZWdlci5wYXJzZUludChjb25mLmdldChCVUZGRVJfU0laRV9JTl9NQiwgIjY0IikpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoUGFydGl0aW9uZXIocGFydGl0aW9uZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9hZGVyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4dGVybmFsQ2xpZW50IGV4dGVybmFsQ2xpZW50ID0gbmV3IEV4dGVybmFsQ2xpZW50KGNvbmYpOwotICAgICAgICAgICAgZXh0ZXJuYWxDbGllbnQuc2V0VGFibGVNZXRhZGF0YShUYWJsZU1ldGFkYXRhUmVmLmZvck9mZmxpbmVUb29scyhDcmVhdGVUYWJsZVN0YXRlbWVudC5wYXJzZShzY2hlbWEsIGtleXNwYWNlKS5idWlsZCgpKSk7Ci0KLSAgICAgICAgICAgIGxvYWRlciA9IG5ldyBTU1RhYmxlTG9hZGVyKG91dHB1dERpciwgZXh0ZXJuYWxDbGllbnQsIG5ldyBOdWxsT3V0cHV0SGFuZGxlcigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhTdHJlYW1TdGF0ZSBmaW5hbFN0YXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGV0ZVNyYykKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5kZWxldGVSZWN1cnNpdmUob3V0cHV0RGlyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSBjb2x1bW4gdmFsdWVzIG11c3QgY29ycmVzcG9uZCB0byB0aGUgb3JkZXIgaW4gd2hpY2gKLSAgICAgKiB0aGV5IGFwcGVhciBpbiB0aGUgaW5zZXJ0IHN0b3JlZCBwcm9jZWR1cmUuIAotICAgICAqIAotICAgICAqIEtleSBpcyBub3QgdXNlZCwgc28gaXQgY2FuIGJlIG51bGwgb3IgYW55IG9iamVjdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICBhbnkgb2JqZWN0IG9yIG51bGwuCi0gICAgICogQHBhcmFtIHZhbHVlcwotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlcyB0byB3cml0ZS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGUoT2JqZWN0IGtleSwgTGlzdDxCeXRlQnVmZmVyPiB2YWx1ZXMpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcHJlcGFyZVdyaXRlcigpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgKChDUUxTU1RhYmxlV3JpdGVyKSB3cml0ZXIpLnJhd0FkZFJvdyh2YWx1ZXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobnVsbCAhPSBwcm9ncmVzcykKLSAgICAgICAgICAgICAgICBwcm9ncmVzcy5wcm9ncmVzcygpOwotICAgICAgICAgICAgaWYgKG51bGwgIT0gY29udGV4dCkKLSAgICAgICAgICAgICAgICBIYWRvb3BDb21wYXQucHJvZ3Jlc3MoY29udGV4dCk7Ci0gICAgICAgIH0gCi0gICAgICAgIGNhdGNoIChJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVycm9yIGFkZGluZyByb3cgd2l0aCBrZXk6ICIgKyBrZXksIGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgRmlsZSBnZXRUYWJsZURpcmVjdG9yeSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShTdHJpbmcuZm9ybWF0KCIlcyVzJXMlcyVzLSVzIiwgZ2V0T3V0cHV0TG9jYXRpb24oKSwgRmlsZS5wYXRoU2VwYXJhdG9yKCksIGtleXNwYWNlLCBGaWxlLnBhdGhTZXBhcmF0b3IoKSwgdGFibGUsIFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghZGlyLmV4aXN0cygpICYmICFkaXIudHJ5Q3JlYXRlRGlyZWN0b3JpZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlZCBvdXRwdXQgZGlyZWN0b3J5OiAiICsgZGlyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGRpcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbG9zZShUYXNrQXR0ZW1wdENvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvKiogRmlsbHMgdGhlIGRlcHJlY2F0ZWQgUmVjb3JkV3JpdGVyIGludGVyZmFjZSBmb3Igc3RyZWFtaW5nLiAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHZvaWQgY2xvc2Uob3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLlJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNsb3NlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgRnV0dXJlPFN0cmVhbVN0YXRlPiBmdXR1cmUgPSBsb2FkZXIuc3RyZWFtKGlnbm9yZXMpOwotICAgICAgICAgICAgd2hpbGUgKHRydWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmdXR1cmUuZ2V0KDEwMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIHwgVGltZW91dEV4Y2VwdGlvbiB0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHByb2dyZXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MucHJvZ3Jlc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gY29udGV4dCkKLSAgICAgICAgICAgICAgICAgICAgICAgIEhhZG9vcENvbXBhdC5wcm9ncmVzcyhjb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxvYWRlci5nZXRGYWlsZWRIb3N0cygpLnNpemUoKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvYWRlci5nZXRGYWlsZWRIb3N0cygpLnNpemUoKSA+IG1heEZhaWx1cmVzKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlRvbyBtYW55IGhvc3RzIGZhaWxlZDogIiArIGxvYWRlci5nZXRGYWlsZWRIb3N0cygpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJTb21lIGhvc3RzIGZhaWxlZDoge30iLCBsb2FkZXIuZ2V0RmFpbGVkSG9zdHMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeHRlcm5hbENsaWVudCBleHRlbmRzIE5hdGl2ZVNTVGFibGVMb2FkZXJDbGllbnQKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBFeHRlcm5hbENsaWVudChDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKHJlc29sdmVIb3N0QWRkcmVzc2VzKGNvbmYpLAotICAgICAgICAgICAgICAgICAgQ29uZmlnSGVscGVyLmdldE91dHB1dEluaXRpYWxQb3J0KGNvbmYpLAotICAgICAgICAgICAgICAgICAgQ29uZmlnSGVscGVyLmdldE91dHB1dEtleXNwYWNlVXNlck5hbWUoY29uZiksCi0gICAgICAgICAgICAgICAgICBDb25maWdIZWxwZXIuZ2V0T3V0cHV0S2V5c3BhY2VQYXNzd29yZChjb25mKSwKLSAgICAgICAgICAgICAgICAgIENxbENvbmZpZ0hlbHBlci5nZXRTU0xPcHRpb25zKGNvbmYpLm9yTnVsbCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248SW5ldFNvY2tldEFkZHJlc3M+IHJlc29sdmVIb3N0QWRkcmVzc2VzKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICAgICAgewotICAgICAgICAgICAgU2V0PEluZXRTb2NrZXRBZGRyZXNzPiBhZGRyZXNzZXMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgICAgICBpbnQgcG9ydCA9IENxbENvbmZpZ0hlbHBlci5nZXRPdXRwdXROYXRpdmVQb3J0KGNvbmYpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgaG9zdCA6IENvbmZpZ0hlbHBlci5nZXRPdXRwdXRJbml0aWFsQWRkcmVzcyhjb25mKS5zcGxpdCgiLCIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgSG9zdEFuZFBvcnQgaGFwID0gSG9zdEFuZFBvcnQuZnJvbVN0cmluZyhob3N0KTsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VzLmFkZChuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKGhhcC5nZXRIb3N0KCkpLCBoYXAuZ2V0UG9ydE9yRGVmYXVsdChwb3J0KSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3NlczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTnVsbE91dHB1dEhhbmRsZXIgaW1wbGVtZW50cyBPdXRwdXRIYW5kbGVyCi0gICAgewotICAgICAgICBwdWJsaWMgdm9pZCBvdXRwdXQoU3RyaW5nIG1zZykge30KLSAgICAgICAgcHVibGljIHZvaWQgZGVidWcoU3RyaW5nIG1zZykge30KLSAgICAgICAgcHVibGljIHZvaWQgd2FybihTdHJpbmcgbXNnKSB7fQotICAgICAgICBwdWJsaWMgdm9pZCB3YXJuKFN0cmluZyBtc2csIFRocm93YWJsZSB0aCkge30KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvY3FsMy9DcWxDbGllbnRIZWxwZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9jcWwzL0NxbENsaWVudEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGE2Mzg0Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9jcWwzL0NxbENsaWVudEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGFkb29wLmNxbDM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwotCi1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkhvc3Q7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLk1ldGFkYXRhOwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5Ub2tlbjsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuVG9rZW5SYW5nZTsKLQotcHVibGljIGNsYXNzIENxbENsaWVudEhlbHBlcgotewotICAgIHByaXZhdGUgQ3FsQ2xpZW50SGVscGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNYXA8VG9rZW5SYW5nZSwgTGlzdDxIb3N0Pj4gZ2V0TG9jYWxQcmltYXJ5UmFuZ2VGb3JEQyhTdHJpbmcga2V5c3BhY2UsIE1ldGFkYXRhIG1ldGFkYXRhLCBTdHJpbmcgdGFyZ2V0REMpCi0gICAgewotICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGtleXNwYWNlLCAia2V5c3BhY2UiKTsKLSAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChtZXRhZGF0YSwgIm1ldGFkYXRhIik7Ci0gICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwodGFyZ2V0REMsICJ0YXJnZXREQyIpOwotCi0gICAgICAgIC8vIEluIDIuMSB0aGUgbG9naWMgd2FzIHRvIGhhdmUgYSBzZXQgb2Ygbm9kZXMgdXNlZCBhcyBhIHNlZWQsIHRoZXkgd2VyZSB1c2VkIHRvIHF1ZXJ5Ci0gICAgICAgIC8vIGNsaWVudC5kZXNjcmliZV9sb2NhbF9yaW5nKGtleXNwYWNlKSAtPiBMaXN0PFRva2VuUmFuZ2U+OyB0aGlzIHNob3VsZCBpbmNsdWRlIGFsbCBub2RlcyBpbiB0aGUgbG9jYWwgZGMuCi0gICAgICAgIC8vIFRva2VuUmFuZ2UgY29udGFpbmVkIHRoZSBlbmRwb2ludHMgaW4gb3JkZXIsIHNvIC5lbmRwb2ludHMuZ2V0KDApIGlzIHRoZSBwcmltYXJ5IG93bmVyCi0gICAgICAgIC8vIENsaWVudCBkb2VzIG5vdCBoYXZlIGEgc2ltaWxhciBBUEksIGluc3RlYWQgaXQgcmV0dXJucyBTZXQ8SG9zdD4uICBUbyByZXBsaWNhdGUgdGhpcyB3ZSBmaXJzdCBuZWVkCi0gICAgICAgIC8vIHRvIGNvbXB1dGUgdGhlIHByaW1hcnkgb3duZXJzLCB0aGVuIGFkZCBpbiB0aGUgcmVwbGljYXMKLQotICAgICAgICBMaXN0PFRva2VuPiB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgTWFwPFRva2VuLCBIb3N0PiB0b2tlblRvSG9zdCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgZm9yIChIb3N0IGhvc3QgOiBtZXRhZGF0YS5nZXRBbGxIb3N0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXRhcmdldERDLmVxdWFscyhob3N0LmdldERhdGFjZW50ZXIoKSkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIGZvciAoVG9rZW4gdG9rZW4gOiBob3N0LmdldFRva2VucygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEhvc3QgcHJldmlvdXMgPSB0b2tlblRvSG9zdC5wdXRJZkFic2VudCh0b2tlbiwgaG9zdCk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlR3byBob3N0cyBzaGFyZSB0aGUgc2FtZSB0b2tlbjsgaG9zdHMgIiArIGhvc3QuZ2V0SG9zdElkKCkgKyAiOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGhvc3QuZ2V0VG9rZW5zKCkgKyAiLCAiICsgcHJldmlvdXMuZ2V0SG9zdElkKCkgKyAiOiIgKyBwcmV2aW91cy5nZXRUb2tlbnMoKSk7Ci0gICAgICAgICAgICAgICAgdG9rZW5zLmFkZCh0b2tlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0b2tlbnMpOwotCi0gICAgICAgIE1hcDxUb2tlblJhbmdlLCBMaXN0PEhvc3Q+PiByYW5nZVRvUmVwbGljYXMgPSBuZXcgSGFzaE1hcDw+KCk7Ci0KLSAgICAgICAgLy8gVGhlIGZpcnN0IHRva2VuIGluIHRoZSByaW5nIHVzZXMgdGhlIGxhc3QgdG9rZW4gYXMgaXRzICdzdGFydCcsIGhhbmRsZSB0aGlzIGhlcmUgdG8gc2ltcGxpZnkgdGhlIGxvb3AKLSAgICAgICAgVG9rZW4gc3RhcnQgPSB0b2tlbnMuZ2V0KHRva2Vucy5zaXplKCkgLSAxKTsKLSAgICAgICAgVG9rZW4gZW5kID0gdG9rZW5zLmdldCgwKTsKLQotICAgICAgICBhZGRSYW5nZShrZXlzcGFjZSwgbWV0YWRhdGEsIHRva2VuVG9Ib3N0LCByYW5nZVRvUmVwbGljYXMsIHN0YXJ0LCBlbmQpOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHRva2Vucy5zaXplKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgc3RhcnQgPSB0b2tlbnMuZ2V0KGkgLSAxKTsKLSAgICAgICAgICAgIGVuZCA9IHRva2Vucy5nZXQoaSk7Ci0KLSAgICAgICAgICAgIGFkZFJhbmdlKGtleXNwYWNlLCBtZXRhZGF0YSwgdG9rZW5Ub0hvc3QsIHJhbmdlVG9SZXBsaWNhcywgc3RhcnQsIGVuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmFuZ2VUb1JlcGxpY2FzOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkUmFuZ2UoU3RyaW5nIGtleXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGEgbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8VG9rZW4sIEhvc3Q+IHRva2VuVG9Ib3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFRva2VuUmFuZ2UsIExpc3Q8SG9zdD4+IHJhbmdlVG9SZXBsaWNhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuIHN0YXJ0LCBUb2tlbiBlbmQpCi0gICAgewotICAgICAgICBIb3N0IGhvc3QgPSB0b2tlblRvSG9zdC5nZXQoZW5kKTsKLSAgICAgICAgU3RyaW5nIGRjID0gaG9zdC5nZXREYXRhY2VudGVyKCk7Ci0KLSAgICAgICAgVG9rZW5SYW5nZSByYW5nZSA9IG1ldGFkYXRhLm5ld1Rva2VuUmFuZ2Uoc3RhcnQsIGVuZCk7Ci0gICAgICAgIExpc3Q8SG9zdD4gcmVwbGljYXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgcmVwbGljYXMuYWRkKGhvc3QpOwotICAgICAgICAvLyBnZXQgYWxsIHRoZSByZXBsaWNhcyBmb3IgdGhlIHNwZWNpZmljIERDCi0gICAgICAgIGZvciAoSG9zdCByZXBsaWNhIDogbWV0YWRhdGEuZ2V0UmVwbGljYXMoa2V5c3BhY2UsIHJhbmdlKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGRjLmVxdWFscyhyZXBsaWNhLmdldERhdGFjZW50ZXIoKSkgJiYgIWhvc3QuZXF1YWxzKHJlcGxpY2EpKQotICAgICAgICAgICAgICAgIHJlcGxpY2FzLmFkZChyZXBsaWNhKTsKLSAgICAgICAgfQotICAgICAgICBMaXN0PEhvc3Q+IHByZXZpb3VzID0gcmFuZ2VUb1JlcGxpY2FzLnB1dChyYW5nZSwgcmVwbGljYXMpOwotICAgICAgICBpZiAocHJldmlvdXMgIT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlR3byBob3N0cyAoIiArIGhvc3QgKyAiLCAiICsgcHJldmlvdXMgKyAiKSBtYXAgdG8gdGhlIHNhbWUgdG9rZW4gcmFuZ2U6ICIgKyByYW5nZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGFkb29wL2NxbDMvQ3FsQ29uZmlnSGVscGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvY3FsMy9DcWxDb25maWdIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk4YTc1NC4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvY3FsMy9DcWxDb25maWdIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1NCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcC5jcWwzOwotLyoKLSoKLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0qICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKgotKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0qIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotKiB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSovCi1pbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5LZXlNYW5hZ2VtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmU7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlVucmVjb3ZlcmFibGVLZXlFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBqYXZheC5uZXQuc3NsLktleU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dDsKLWltcG9ydCBqYXZheC5uZXQuc3NsLlRydXN0TWFuYWdlckZhY3Rvcnk7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9wdGlvbmFsOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlsczsKLQotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5BdXRoUHJvdmlkZXI7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkNsdXN0ZXI7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkhvc3REaXN0YW5jZTsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuSmRrU1NMT3B0aW9uczsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuUGxhaW5UZXh0QXV0aFByb3ZpZGVyOwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5Qcm90b2NvbFZlcnNpb247Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLnBvbGljaWVzLkxvYWRCYWxhbmNpbmdQb2xpY3k7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlBvb2xpbmdPcHRpb25zOwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5Qcm90b2NvbE9wdGlvbnM7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlF1ZXJ5T3B0aW9uczsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuU1NMT3B0aW9uczsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuU29ja2V0T3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oYWRvb3AuQ29uZmlnSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jb25mLkNvbmZpZ3VyYXRpb247Ci0KLQotcHVibGljIGNsYXNzIENxbENvbmZpZ0hlbHBlcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9DUUxfQ09MVU1OU19DT05GSUcgPSAiY2Fzc2FuZHJhLmlucHV0LmNvbHVtbmZhbWlseS5jb2x1bW5zIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfQ1FMX1BBR0VfUk9XX1NJWkVfQ09ORklHID0gImNhc3NhbmRyYS5pbnB1dC5wYWdlLnJvdy5zaXplIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfQ1FMX1dIRVJFX0NMQVVTRV9DT05GSUcgPSAiY2Fzc2FuZHJhLmlucHV0LndoZXJlLmNsYXVzZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX0NRTCA9ICJjYXNzYW5kcmEuaW5wdXQuY3FsIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSTkFNRSA9ICJjYXNzYW5kcmEudXNlcm5hbWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRCA9ICJjYXNzYW5kcmEucGFzc3dvcmQiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX05BVElWRV9QT1JUID0gImNhc3NhbmRyYS5pbnB1dC5uYXRpdmUucG9ydCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX05BVElWRV9DT1JFX0NPTk5FQ1RJT05TX1BFUl9IT1NUID0gImNhc3NhbmRyYS5pbnB1dC5uYXRpdmUuY29yZS5jb25uZWN0aW9ucy5wZXIuaG9zdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX05BVElWRV9NQVhfQ09OTkVDVElPTlNfUEVSX0hPU1QgPSAiY2Fzc2FuZHJhLmlucHV0Lm5hdGl2ZS5tYXguY29ubmVjdGlvbnMucGVyLmhvc3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9OQVRJVkVfTUFYX1NJTVVMVF9SRVFfUEVSX0NPTk5FQ1RJT04gPSAiY2Fzc2FuZHJhLmlucHV0Lm5hdGl2ZS5tYXguc2ltdWx0LnJlcXMucGVyLmNvbm5lY3Rpb24iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9OQVRJVkVfQ09OTkVDVElPTl9USU1FT1VUID0gImNhc3NhbmRyYS5pbnB1dC5uYXRpdmUuY29ubmVjdGlvbi50aW1lb3V0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfTkFUSVZFX1JFQURfQ09OTkVDVElPTl9USU1FT1VUID0gImNhc3NhbmRyYS5pbnB1dC5uYXRpdmUucmVhZC5jb25uZWN0aW9uLnRpbWVvdXQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9OQVRJVkVfUkVDRUlWRV9CVUZGRVJfU0laRSA9ICJjYXNzYW5kcmEuaW5wdXQubmF0aXZlLnJlY2VpdmUuYnVmZmVyLnNpemUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9OQVRJVkVfU0VORF9CVUZGRVJfU0laRSA9ICJjYXNzYW5kcmEuaW5wdXQubmF0aXZlLnNlbmQuYnVmZmVyLnNpemUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9OQVRJVkVfU09MSU5HRVIgPSAiY2Fzc2FuZHJhLmlucHV0Lm5hdGl2ZS5zb2xpbmdlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX05BVElWRV9UQ1BfTk9ERUxBWSA9ICJjYXNzYW5kcmEuaW5wdXQubmF0aXZlLnRjcC5ub2RlbGF5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfTkFUSVZFX1JFVVNFX0FERFJFU1MgPSAiY2Fzc2FuZHJhLmlucHV0Lm5hdGl2ZS5yZXVzZS5hZGRyZXNzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfTkFUSVZFX0tFRVBfQUxJVkUgPSAiY2Fzc2FuZHJhLmlucHV0Lm5hdGl2ZS5rZWVwLmFsaXZlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfTkFUSVZFX0FVVEhfUFJPVklERVIgPSAiY2Fzc2FuZHJhLmlucHV0Lm5hdGl2ZS5hdXRoLnByb3ZpZGVyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfTkFUSVZFX1NTTF9UUlVTVF9TVE9SRV9QQVRIID0gImNhc3NhbmRyYS5pbnB1dC5uYXRpdmUuc3NsLnRydXN0LnN0b3JlLnBhdGgiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9OQVRJVkVfU1NMX0tFWV9TVE9SRV9QQVRIID0gImNhc3NhbmRyYS5pbnB1dC5uYXRpdmUuc3NsLmtleS5zdG9yZS5wYXRoIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfTkFUSVZFX1NTTF9UUlVTVF9TVE9SRV9QQVNTV0FSRCA9ICJjYXNzYW5kcmEuaW5wdXQubmF0aXZlLnNzbC50cnVzdC5zdG9yZS5wYXNzd29yZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX05BVElWRV9TU0xfS0VZX1NUT1JFX1BBU1NXQVJEID0gImNhc3NhbmRyYS5pbnB1dC5uYXRpdmUuc3NsLmtleS5zdG9yZS5wYXNzd29yZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX05BVElWRV9TU0xfQ0lQSEVSX1NVSVRFUyA9ICJjYXNzYW5kcmEuaW5wdXQubmF0aXZlLnNzbC5jaXBoZXIuc3VpdGVzIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9OQVRJVkVfUFJPVE9DT0xfVkVSU0lPTiA9ICJjYXNzYW5kcmEuaW5wdXQubmF0aXZlLnByb3RvY29sLnZlcnNpb24iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9DUUwgPSAiY2Fzc2FuZHJhLm91dHB1dC5jcWwiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfTkFUSVZFX1BPUlQgPSAiY2Fzc2FuZHJhLm91dHB1dC5uYXRpdmUucG9ydCI7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIENRTCBjb2x1bW5zIGZvciB0aGUgaW5wdXQgb2YgdGhpcyBqb2IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZiBKb2IgY29uZmlndXJhdGlvbiB5b3UgYXJlIGFib3V0IHRvIHJ1bgotICAgICAqIEBwYXJhbSBjb2x1bW5zCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElucHV0Q29sdW1ucyhDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBjb2x1bW5zKQotICAgIHsKLSAgICAgICAgaWYgKGNvbHVtbnMgPT0gbnVsbCB8fCBjb2x1bW5zLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBjb25mLnNldChJTlBVVF9DUUxfQ09MVU1OU19DT05GSUcsIGNvbHVtbnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgQ1FMIHF1ZXJ5IExpbWl0IGZvciB0aGUgaW5wdXQgb2YgdGhpcyBqb2IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZiBKb2IgY29uZmlndXJhdGlvbiB5b3UgYXJlIGFib3V0IHRvIHJ1bgotICAgICAqIEBwYXJhbSBjcWxQYWdlUm93U2l6ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnB1dENRTFBhZ2VSb3dTaXplKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGNxbFBhZ2VSb3dTaXplKQotICAgIHsKLSAgICAgICAgaWYgKGNxbFBhZ2VSb3dTaXplID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY3FsIHBhZ2Ugcm93IHNpemUgbWF5IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25mLnNldChJTlBVVF9DUUxfUEFHRV9ST1dfU0laRV9DT05GSUcsIGNxbFBhZ2VSb3dTaXplKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIENRTCB1c2VyIGRlZmluZWQgd2hlcmUgY2xhdXNlcyBmb3IgdGhlIGlucHV0IG9mIHRoaXMgam9iLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmYgSm9iIGNvbmZpZ3VyYXRpb24geW91IGFyZSBhYm91dCB0byBydW4KLSAgICAgKiBAcGFyYW0gY2xhdXNlcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnB1dFdoZXJlQ2xhdXNlcyhDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBjbGF1c2VzKQotICAgIHsKLSAgICAgICAgaWYgKGNsYXVzZXMgPT0gbnVsbCB8fCBjbGF1c2VzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBjb25mLnNldChJTlBVVF9DUUxfV0hFUkVfQ0xBVVNFX0NPTkZJRywgY2xhdXNlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBDUUwgcHJlcGFyZWQgc3RhdGVtZW50IGZvciB0aGUgb3V0cHV0IG9mIHRoaXMgam9iLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmYgSm9iIGNvbmZpZ3VyYXRpb24geW91IGFyZSBhYm91dCB0byBydW4KLSAgICAgKiBAcGFyYW0gY3FsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE91dHB1dENxbChDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBjcWwpCi0gICAgewotICAgICAgICBpZiAoY3FsID09IG51bGwgfHwgY3FsLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBjb25mLnNldChPVVRQVVRfQ1FMLCBjcWwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnB1dENxbChDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBjcWwpCi0gICAgewotICAgICAgICBpZiAoY3FsID09IG51bGwgfHwgY3FsLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBjb25mLnNldChJTlBVVF9DUUwsIGNxbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVzZXJOYW1lQW5kUGFzc3dvcmQoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkKLSAgICB7Ci0gICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEJsYW5rKHVzZXJuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgY29uZi5zZXQoSU5QVVRfTkFUSVZFX0FVVEhfUFJPVklERVIsIFBsYWluVGV4dEF1dGhQcm92aWRlci5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgY29uZi5zZXQoVVNFUk5BTUUsIHVzZXJuYW1lKTsKLSAgICAgICAgICAgIGNvbmYuc2V0KFBBU1NXT1JELCBwYXNzd29yZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPEludGVnZXI+IGdldElucHV0Q29yZUNvbm5lY3Rpb25zKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRJbnRTZXR0aW5nKElOUFVUX05BVElWRV9DT1JFX0NPTk5FQ1RJT05TX1BFUl9IT1NULCBjb25mKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPEludGVnZXI+IGdldElucHV0TWF4Q29ubmVjdGlvbnMoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEludFNldHRpbmcoSU5QVVRfTkFUSVZFX01BWF9DT05ORUNUSU9OU19QRVJfSE9TVCwgY29uZik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0SW5wdXROYXRpdmVQb3J0KENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGNvbmYuZ2V0KElOUFVUX05BVElWRV9QT1JULCAiOTA0MiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRPdXRwdXROYXRpdmVQb3J0KENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGNvbmYuZ2V0KE9VVFBVVF9OQVRJVkVfUE9SVCwgIjkwNDIiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPcHRpb25hbDxJbnRlZ2VyPiBnZXRJbnB1dE1heFNpbXVsdFJlcVBlckNvbm5lY3Rpb25zKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRJbnRTZXR0aW5nKElOUFVUX05BVElWRV9NQVhfU0lNVUxUX1JFUV9QRVJfQ09OTkVDVElPTiwgY29uZik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPcHRpb25hbDxJbnRlZ2VyPiBnZXRJbnB1dE5hdGl2ZUNvbm5lY3Rpb25UaW1lb3V0KENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRJbnRTZXR0aW5nKElOUFVUX05BVElWRV9DT05ORUNUSU9OX1RJTUVPVVQsIGNvbmYpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8SW50ZWdlcj4gZ2V0SW5wdXROYXRpdmVSZWFkQ29ubmVjdGlvblRpbWVvdXQoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEludFNldHRpbmcoSU5QVVRfTkFUSVZFX1JFQURfQ09OTkVDVElPTl9USU1FT1VULCBjb25mKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPEludGVnZXI+IGdldElucHV0TmF0aXZlUmVjZWl2ZUJ1ZmZlclNpemUoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEludFNldHRpbmcoSU5QVVRfTkFUSVZFX1JFQ0VJVkVfQlVGRkVSX1NJWkUsIGNvbmYpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8SW50ZWdlcj4gZ2V0SW5wdXROYXRpdmVTZW5kQnVmZmVyU2l6ZShDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0SW50U2V0dGluZyhJTlBVVF9OQVRJVkVfU0VORF9CVUZGRVJfU0laRSwgY29uZik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPcHRpb25hbDxJbnRlZ2VyPiBnZXRJbnB1dE5hdGl2ZVNvbGluZ2VyKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRJbnRTZXR0aW5nKElOUFVUX05BVElWRV9TT0xJTkdFUiwgY29uZik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPcHRpb25hbDxCb29sZWFuPiBnZXRJbnB1dE5hdGl2ZVRjcE5vZGVsYXkoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEJvb2xlYW5TZXR0aW5nKElOUFVUX05BVElWRV9UQ1BfTk9ERUxBWSwgY29uZik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPcHRpb25hbDxCb29sZWFuPiBnZXRJbnB1dE5hdGl2ZVJldXNlQWRkcmVzcyhDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0Qm9vbGVhblNldHRpbmcoSU5QVVRfTkFUSVZFX1JFVVNFX0FERFJFU1MsIGNvbmYpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8U3RyaW5nPiBnZXRJbnB1dE5hdGl2ZUF1dGhQcm92aWRlcihDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0U3RyaW5nU2V0dGluZyhJTlBVVF9OQVRJVkVfQVVUSF9QUk9WSURFUiwgY29uZik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPcHRpb25hbDxTdHJpbmc+IGdldElucHV0TmF0aXZlU1NMVHJ1c3RzdG9yZVBhdGgoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFN0cmluZ1NldHRpbmcoSU5QVVRfTkFUSVZFX1NTTF9UUlVTVF9TVE9SRV9QQVRILCBjb25mKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPFN0cmluZz4gZ2V0SW5wdXROYXRpdmVTU0xLZXlzdG9yZVBhdGgoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFN0cmluZ1NldHRpbmcoSU5QVVRfTkFUSVZFX1NTTF9LRVlfU1RPUkVfUEFUSCwgY29uZik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPcHRpb25hbDxTdHJpbmc+IGdldElucHV0TmF0aXZlU1NMS2V5c3RvcmVQYXNzd29yZChDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0U3RyaW5nU2V0dGluZyhJTlBVVF9OQVRJVkVfU1NMX0tFWV9TVE9SRV9QQVNTV0FSRCwgY29uZik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPcHRpb25hbDxTdHJpbmc+IGdldElucHV0TmF0aXZlU1NMVHJ1c3RzdG9yZVBhc3N3b3JkKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRTdHJpbmdTZXR0aW5nKElOUFVUX05BVElWRV9TU0xfVFJVU1RfU1RPUkVfUEFTU1dBUkQsIGNvbmYpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8U3RyaW5nPiBnZXRJbnB1dE5hdGl2ZVNTTENpcGhlclN1aXRlcyhDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0U3RyaW5nU2V0dGluZyhJTlBVVF9OQVRJVkVfU1NMX0NJUEhFUl9TVUlURVMsIGNvbmYpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8Qm9vbGVhbj4gZ2V0SW5wdXROYXRpdmVLZWVwQWxpdmUoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEJvb2xlYW5TZXR0aW5nKElOUFVUX05BVElWRV9LRUVQX0FMSVZFLCBjb25mKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbnB1dGNvbHVtbnMoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbmYuZ2V0KElOUFVUX0NRTF9DT0xVTU5TX0NPTkZJRyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPcHRpb25hbDxJbnRlZ2VyPiBnZXRJbnB1dFBhZ2VSb3dTaXplKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRJbnRTZXR0aW5nKElOUFVUX0NRTF9QQUdFX1JPV19TSVpFX0NPTkZJRywgY29uZik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SW5wdXRXaGVyZUNsYXVzZXMoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbmYuZ2V0KElOUFVUX0NRTF9XSEVSRV9DTEFVU0VfQ09ORklHKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbnB1dENxbChDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gY29uZi5nZXQoSU5QVVRfQ1FMKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPdXRwdXRDcWwoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbmYuZ2V0KE9VVFBVVF9DUUwpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE9wdGlvbmFsPEludGVnZXI+IGdldFByb3RvY29sVmVyc2lvbihDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0SW50U2V0dGluZyhJTlBVVF9OQVRJVkVfUFJPVE9DT0xfVkVSU0lPTiwgY29uZik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDbHVzdGVyIGdldElucHV0Q2x1c3RlcihTdHJpbmcgaG9zdCwgQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgLy8gdGhpcyBtZXRob2QgaGFzIGJlZW4gbGVmdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotICAgICAgICByZXR1cm4gZ2V0SW5wdXRDbHVzdGVyKG5ldyBTdHJpbmdbXSB7aG9zdH0sIGNvbmYpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ2x1c3RlciBnZXRJbnB1dENsdXN0ZXIoU3RyaW5nW10gaG9zdHMsIENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIGludCBwb3J0ID0gZ2V0SW5wdXROYXRpdmVQb3J0KGNvbmYpOwotICAgICAgICByZXR1cm4gZ2V0Q2x1c3Rlcihob3N0cywgY29uZiwgcG9ydCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDbHVzdGVyIGdldE91dHB1dENsdXN0ZXIoU3RyaW5nIGhvc3QsIENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRPdXRwdXRDbHVzdGVyKG5ldyBTdHJpbmdbXXtob3N0fSwgY29uZik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDbHVzdGVyIGdldE91dHB1dENsdXN0ZXIoU3RyaW5nW10gaG9zdHMsIENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIGludCBwb3J0ID0gZ2V0T3V0cHV0TmF0aXZlUG9ydChjb25mKTsKLSAgICAgICAgcmV0dXJuIGdldENsdXN0ZXIoaG9zdHMsIGNvbmYsIHBvcnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ2x1c3RlciBnZXRDbHVzdGVyKFN0cmluZ1tdIGhvc3RzLCBDb25maWd1cmF0aW9uIGNvbmYsIGludCBwb3J0KQotICAgIHsKLSAgICAgICAgT3B0aW9uYWw8QXV0aFByb3ZpZGVyPiBhdXRoUHJvdmlkZXIgPSBnZXRBdXRoUHJvdmlkZXIoY29uZik7Ci0gICAgICAgIE9wdGlvbmFsPFNTTE9wdGlvbnM+IHNzbE9wdGlvbnMgPSBnZXRTU0xPcHRpb25zKGNvbmYpOwotICAgICAgICBPcHRpb25hbDxJbnRlZ2VyPiBwcm90b2NvbFZlcnNpb24gPSBnZXRQcm90b2NvbFZlcnNpb24oY29uZik7Ci0gICAgICAgIExvYWRCYWxhbmNpbmdQb2xpY3kgbG9hZEJhbGFuY2luZ1BvbGljeSA9IGdldFJlYWRMb2FkQmFsYW5jaW5nUG9saWN5KGhvc3RzKTsKLSAgICAgICAgU29ja2V0T3B0aW9ucyBzb2NrZXRPcHRpb25zID0gZ2V0UmVhZFNvY2tldE9wdGlvbnMoY29uZik7Ci0gICAgICAgIFF1ZXJ5T3B0aW9ucyBxdWVyeU9wdGlvbnMgPSBnZXRSZWFkUXVlcnlPcHRpb25zKGNvbmYpOwotICAgICAgICBQb29saW5nT3B0aW9ucyBwb29saW5nT3B0aW9ucyA9IGdldFJlYWRQb29saW5nT3B0aW9ucyhjb25mKTsKLQotICAgICAgICBDbHVzdGVyLkJ1aWxkZXIgYnVpbGRlciA9IENsdXN0ZXIuYnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLmFkZENvbnRhY3RQb2ludHMoaG9zdHMpCi0gICAgICAgICAgICAgICAgLndpdGhQb3J0KHBvcnQpCi0gICAgICAgICAgICAgICAgLndpdGhDb21wcmVzc2lvbihQcm90b2NvbE9wdGlvbnMuQ29tcHJlc3Npb24uTk9ORSk7Ci0KLSAgICAgICAgaWYgKGF1dGhQcm92aWRlci5pc1ByZXNlbnQoKSkKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aEF1dGhQcm92aWRlcihhdXRoUHJvdmlkZXIuZ2V0KCkpOwotICAgICAgICBpZiAoc3NsT3B0aW9ucy5pc1ByZXNlbnQoKSkKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFNTTChzc2xPcHRpb25zLmdldCgpKTsKLQotICAgICAgICBpZiAocHJvdG9jb2xWZXJzaW9uLmlzUHJlc2VudCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhQcm90b2NvbFZlcnNpb24oUHJvdG9jb2xWZXJzaW9uLmZyb21JbnQocHJvdG9jb2xWZXJzaW9uLmdldCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRlci53aXRoTG9hZEJhbGFuY2luZ1BvbGljeShsb2FkQmFsYW5jaW5nUG9saWN5KQotICAgICAgICAgICAgICAgIC53aXRoU29ja2V0T3B0aW9ucyhzb2NrZXRPcHRpb25zKQotICAgICAgICAgICAgICAgIC53aXRoUXVlcnlPcHRpb25zKHF1ZXJ5T3B0aW9ucykKLSAgICAgICAgICAgICAgICAud2l0aFBvb2xpbmdPcHRpb25zKHBvb2xpbmdPcHRpb25zKTsKLQotICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnB1dENvcmVDb25uZWN0aW9ucyhDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBjb25uZWN0aW9ucykKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KElOUFVUX05BVElWRV9DT1JFX0NPTk5FQ1RJT05TX1BFUl9IT1NULCBjb25uZWN0aW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElucHV0TWF4Q29ubmVjdGlvbnMoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgY29ubmVjdGlvbnMpCi0gICAgewotICAgICAgICBjb25mLnNldChJTlBVVF9OQVRJVkVfTUFYX0NPTk5FQ1RJT05TX1BFUl9IT1NULCBjb25uZWN0aW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElucHV0TWF4U2ltdWx0UmVxUGVyQ29ubmVjdGlvbnMoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgcmVxcykKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KElOUFVUX05BVElWRV9NQVhfU0lNVUxUX1JFUV9QRVJfQ09OTkVDVElPTiwgcmVxcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElucHV0TmF0aXZlQ29ubmVjdGlvblRpbWVvdXQoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgdGltZW91dCkKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KElOUFVUX05BVElWRV9DT05ORUNUSU9OX1RJTUVPVVQsIHRpbWVvdXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnB1dE5hdGl2ZVJlYWRDb25uZWN0aW9uVGltZW91dChDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyB0aW1lb3V0KQotICAgIHsKLSAgICAgICAgY29uZi5zZXQoSU5QVVRfTkFUSVZFX1JFQURfQ09OTkVDVElPTl9USU1FT1VULCB0aW1lb3V0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5wdXROYXRpdmVSZWNlaXZlQnVmZmVyU2l6ZShDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBzaXplKQotICAgIHsKLSAgICAgICAgY29uZi5zZXQoSU5QVVRfTkFUSVZFX1JFQ0VJVkVfQlVGRkVSX1NJWkUsIHNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnB1dE5hdGl2ZVNlbmRCdWZmZXJTaXplKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIHNpemUpCi0gICAgewotICAgICAgICBjb25mLnNldChJTlBVVF9OQVRJVkVfU0VORF9CVUZGRVJfU0laRSwgc2l6ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElucHV0TmF0aXZlU29saW5nZXIoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgc29saW5nZXIpCi0gICAgewotICAgICAgICBjb25mLnNldChJTlBVVF9OQVRJVkVfU09MSU5HRVIsIHNvbGluZ2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5wdXROYXRpdmVUY3BOb2RlbGF5KENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIHRjcE5vZGVsYXkpCi0gICAgewotICAgICAgICBjb25mLnNldChJTlBVVF9OQVRJVkVfVENQX05PREVMQVksIHRjcE5vZGVsYXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnB1dE5hdGl2ZUF1dGhQcm92aWRlcihDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBhdXRoUHJvdmlkZXIpCi0gICAgewotICAgICAgICBjb25mLnNldChJTlBVVF9OQVRJVkVfQVVUSF9QUk9WSURFUiwgYXV0aFByb3ZpZGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5wdXROYXRpdmVTU0xUcnVzdHN0b3JlUGF0aChDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBwYXRoKQotICAgIHsKLSAgICAgICAgY29uZi5zZXQoSU5QVVRfTkFUSVZFX1NTTF9UUlVTVF9TVE9SRV9QQVRILCBwYXRoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5wdXROYXRpdmVTU0xLZXlzdG9yZVBhdGgoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgcGF0aCkKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KElOUFVUX05BVElWRV9TU0xfS0VZX1NUT1JFX1BBVEgsIHBhdGgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnB1dE5hdGl2ZVNTTEtleXN0b3JlUGFzc3dvcmQoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgcGFzcykKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KElOUFVUX05BVElWRV9TU0xfS0VZX1NUT1JFX1BBU1NXQVJELCBwYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5wdXROYXRpdmVTU0xUcnVzdHN0b3JlUGFzc3dvcmQoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgcGFzcykKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KElOUFVUX05BVElWRV9TU0xfVFJVU1RfU1RPUkVfUEFTU1dBUkQsIHBhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnB1dE5hdGl2ZVNTTENpcGhlclN1aXRlcyhDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBzdWl0ZXMpCi0gICAgewotICAgICAgICBjb25mLnNldChJTlBVVF9OQVRJVkVfU1NMX0NJUEhFUl9TVUlURVMsIHN1aXRlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElucHV0TmF0aXZlUmV1c2VBZGRyZXNzKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIHJldXNlQWRkcmVzcykKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KElOUFVUX05BVElWRV9SRVVTRV9BRERSRVNTLCByZXVzZUFkZHJlc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnB1dE5hdGl2ZUtlZXBBbGl2ZShDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBrZWVwQWxpdmUpCi0gICAgewotICAgICAgICBjb25mLnNldChJTlBVVF9OQVRJVkVfS0VFUF9BTElWRSwga2VlcEFsaXZlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5wdXROYXRpdmVQb3J0KENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIHBvcnQpCi0gICAgewotICAgICAgICBjb25mLnNldChJTlBVVF9OQVRJVkVfUE9SVCwgcG9ydCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUG9vbGluZ09wdGlvbnMgZ2V0UmVhZFBvb2xpbmdPcHRpb25zKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIE9wdGlvbmFsPEludGVnZXI+IGNvcmVDb25uZWN0aW9ucyA9IGdldElucHV0Q29yZUNvbm5lY3Rpb25zKGNvbmYpOwotICAgICAgICBPcHRpb25hbDxJbnRlZ2VyPiBtYXhDb25uZWN0aW9ucyA9IGdldElucHV0TWF4Q29ubmVjdGlvbnMoY29uZik7Ci0gICAgICAgIE9wdGlvbmFsPEludGVnZXI+IG1heFNpbXVsdGFuZW91c1JlcXVlc3RzID0gZ2V0SW5wdXRNYXhTaW11bHRSZXFQZXJDb25uZWN0aW9ucyhjb25mKTsKLQotICAgICAgICBQb29saW5nT3B0aW9ucyBwb29saW5nT3B0aW9ucyA9IG5ldyBQb29saW5nT3B0aW9ucygpOwotCi0gICAgICAgIGZvciAoSG9zdERpc3RhbmNlIGhvc3REaXN0YW5jZSA6IEFycmF5cy5hc0xpc3QoSG9zdERpc3RhbmNlLkxPQ0FMLCBIb3N0RGlzdGFuY2UuUkVNT1RFKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvcmVDb25uZWN0aW9ucy5pc1ByZXNlbnQoKSkKLSAgICAgICAgICAgICAgICBwb29saW5nT3B0aW9ucy5zZXRDb3JlQ29ubmVjdGlvbnNQZXJIb3N0KGhvc3REaXN0YW5jZSwgY29yZUNvbm5lY3Rpb25zLmdldCgpKTsKLSAgICAgICAgICAgIGlmIChtYXhDb25uZWN0aW9ucy5pc1ByZXNlbnQoKSkKLSAgICAgICAgICAgICAgICBwb29saW5nT3B0aW9ucy5zZXRNYXhDb25uZWN0aW9uc1Blckhvc3QoaG9zdERpc3RhbmNlLCBtYXhDb25uZWN0aW9ucy5nZXQoKSk7Ci0gICAgICAgICAgICBpZiAobWF4U2ltdWx0YW5lb3VzUmVxdWVzdHMuaXNQcmVzZW50KCkpCi0gICAgICAgICAgICAgICAgcG9vbGluZ09wdGlvbnMuc2V0TmV3Q29ubmVjdGlvblRocmVzaG9sZChob3N0RGlzdGFuY2UsIG1heFNpbXVsdGFuZW91c1JlcXVlc3RzLmdldCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwb29saW5nT3B0aW9uczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBRdWVyeU9wdGlvbnMgZ2V0UmVhZFF1ZXJ5T3B0aW9ucyhDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICBTdHJpbmcgQ0wgPSBDb25maWdIZWxwZXIuZ2V0UmVhZENvbnNpc3RlbmN5TGV2ZWwoY29uZik7Ci0gICAgICAgIE9wdGlvbmFsPEludGVnZXI+IGZldGNoU2l6ZSA9IGdldElucHV0UGFnZVJvd1NpemUoY29uZik7Ci0gICAgICAgIFF1ZXJ5T3B0aW9ucyBxdWVyeU9wdGlvbnMgPSBuZXcgUXVlcnlPcHRpb25zKCk7Ci0gICAgICAgIGlmIChDTCAhPSBudWxsICYmICFDTC5pc0VtcHR5KCkpCi0gICAgICAgICAgICBxdWVyeU9wdGlvbnMuc2V0Q29uc2lzdGVuY3lMZXZlbChjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQ29uc2lzdGVuY3lMZXZlbC52YWx1ZU9mKENMKSk7Ci0KLSAgICAgICAgaWYgKGZldGNoU2l6ZS5pc1ByZXNlbnQoKSkKLSAgICAgICAgICAgIHF1ZXJ5T3B0aW9ucy5zZXRGZXRjaFNpemUoZmV0Y2hTaXplLmdldCgpKTsKLSAgICAgICAgcmV0dXJuIHF1ZXJ5T3B0aW9uczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTb2NrZXRPcHRpb25zIGdldFJlYWRTb2NrZXRPcHRpb25zKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIFNvY2tldE9wdGlvbnMgc29ja2V0T3B0aW9ucyA9IG5ldyBTb2NrZXRPcHRpb25zKCk7Ci0gICAgICAgIE9wdGlvbmFsPEludGVnZXI+IGNvbm5lY3RUaW1lb3V0TWlsbGlzID0gZ2V0SW5wdXROYXRpdmVDb25uZWN0aW9uVGltZW91dChjb25mKTsKLSAgICAgICAgT3B0aW9uYWw8SW50ZWdlcj4gcmVhZFRpbWVvdXRNaWxsaXMgPSBnZXRJbnB1dE5hdGl2ZVJlYWRDb25uZWN0aW9uVGltZW91dChjb25mKTsKLSAgICAgICAgT3B0aW9uYWw8SW50ZWdlcj4gcmVjZWl2ZUJ1ZmZlclNpemUgPSBnZXRJbnB1dE5hdGl2ZVJlY2VpdmVCdWZmZXJTaXplKGNvbmYpOwotICAgICAgICBPcHRpb25hbDxJbnRlZ2VyPiBzZW5kQnVmZmVyU2l6ZSA9IGdldElucHV0TmF0aXZlU2VuZEJ1ZmZlclNpemUoY29uZik7Ci0gICAgICAgIE9wdGlvbmFsPEludGVnZXI+IHNvTGluZ2VyID0gZ2V0SW5wdXROYXRpdmVTb2xpbmdlcihjb25mKTsKLSAgICAgICAgT3B0aW9uYWw8Qm9vbGVhbj4gdGNwTm9EZWxheSA9IGdldElucHV0TmF0aXZlVGNwTm9kZWxheShjb25mKTsKLSAgICAgICAgT3B0aW9uYWw8Qm9vbGVhbj4gcmV1c2VBZGRyZXNzID0gZ2V0SW5wdXROYXRpdmVSZXVzZUFkZHJlc3MoY29uZik7Ci0gICAgICAgIE9wdGlvbmFsPEJvb2xlYW4+IGtlZXBBbGl2ZSA9IGdldElucHV0TmF0aXZlS2VlcEFsaXZlKGNvbmYpOwotCi0gICAgICAgIGlmIChjb25uZWN0VGltZW91dE1pbGxpcy5pc1ByZXNlbnQoKSkKLSAgICAgICAgICAgIHNvY2tldE9wdGlvbnMuc2V0Q29ubmVjdFRpbWVvdXRNaWxsaXMoY29ubmVjdFRpbWVvdXRNaWxsaXMuZ2V0KCkpOwotICAgICAgICBpZiAocmVhZFRpbWVvdXRNaWxsaXMuaXNQcmVzZW50KCkpCi0gICAgICAgICAgICBzb2NrZXRPcHRpb25zLnNldFJlYWRUaW1lb3V0TWlsbGlzKHJlYWRUaW1lb3V0TWlsbGlzLmdldCgpKTsKLSAgICAgICAgaWYgKHJlY2VpdmVCdWZmZXJTaXplLmlzUHJlc2VudCgpKQotICAgICAgICAgICAgc29ja2V0T3B0aW9ucy5zZXRSZWNlaXZlQnVmZmVyU2l6ZShyZWNlaXZlQnVmZmVyU2l6ZS5nZXQoKSk7Ci0gICAgICAgIGlmIChzZW5kQnVmZmVyU2l6ZS5pc1ByZXNlbnQoKSkKLSAgICAgICAgICAgIHNvY2tldE9wdGlvbnMuc2V0U2VuZEJ1ZmZlclNpemUoc2VuZEJ1ZmZlclNpemUuZ2V0KCkpOwotICAgICAgICBpZiAoc29MaW5nZXIuaXNQcmVzZW50KCkpCi0gICAgICAgICAgICBzb2NrZXRPcHRpb25zLnNldFNvTGluZ2VyKHNvTGluZ2VyLmdldCgpKTsKLSAgICAgICAgaWYgKHRjcE5vRGVsYXkuaXNQcmVzZW50KCkpCi0gICAgICAgICAgICBzb2NrZXRPcHRpb25zLnNldFRjcE5vRGVsYXkodGNwTm9EZWxheS5nZXQoKSk7Ci0gICAgICAgIGlmIChyZXVzZUFkZHJlc3MuaXNQcmVzZW50KCkpCi0gICAgICAgICAgICBzb2NrZXRPcHRpb25zLnNldFJldXNlQWRkcmVzcyhyZXVzZUFkZHJlc3MuZ2V0KCkpOwotICAgICAgICBpZiAoa2VlcEFsaXZlLmlzUHJlc2VudCgpKQotICAgICAgICAgICAgc29ja2V0T3B0aW9ucy5zZXRLZWVwQWxpdmUoa2VlcEFsaXZlLmdldCgpKTsKLQotICAgICAgICByZXR1cm4gc29ja2V0T3B0aW9uczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2FkQmFsYW5jaW5nUG9saWN5IGdldFJlYWRMb2FkQmFsYW5jaW5nUG9saWN5KGZpbmFsIFN0cmluZ1tdIHN0aWNrSG9zdHMpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IExpbWl0ZWRMb2NhbE5vZGVGaXJzdExvY2FsQmFsYW5jaW5nUG9saWN5KHN0aWNrSG9zdHMpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE9wdGlvbmFsPEF1dGhQcm92aWRlcj4gZ2V0RGVmYXVsdEF1dGhQcm92aWRlcihDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICBPcHRpb25hbDxTdHJpbmc+IHVzZXJuYW1lID0gZ2V0U3RyaW5nU2V0dGluZyhVU0VSTkFNRSwgY29uZik7Ci0gICAgICAgIE9wdGlvbmFsPFN0cmluZz4gcGFzc3dvcmQgPSBnZXRTdHJpbmdTZXR0aW5nKFBBU1NXT1JELCBjb25mKTsKLQotICAgICAgICBpZiAodXNlcm5hbWUuaXNQcmVzZW50KCkgJiYgcGFzc3dvcmQuaXNQcmVzZW50KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihuZXcgUGxhaW5UZXh0QXV0aFByb3ZpZGVyKHVzZXJuYW1lLmdldCgpLCBwYXNzd29yZC5nZXQoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmFic2VudCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgT3B0aW9uYWw8QXV0aFByb3ZpZGVyPiBnZXRBdXRoUHJvdmlkZXIoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgT3B0aW9uYWw8U3RyaW5nPiBhdXRoUHJvdmlkZXIgPSBnZXRJbnB1dE5hdGl2ZUF1dGhQcm92aWRlcihjb25mKTsKLSAgICAgICAgaWYgKCFhdXRoUHJvdmlkZXIuaXNQcmVzZW50KCkpCi0gICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEF1dGhQcm92aWRlcihjb25mKTsKLQotICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YoZ2V0Q2xpZW50QXV0aFByb3ZpZGVyKGF1dGhQcm92aWRlci5nZXQoKSwgY29uZikpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8U1NMT3B0aW9ucz4gZ2V0U1NMT3B0aW9ucyhDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICBPcHRpb25hbDxTdHJpbmc+IHRydXN0c3RvcmVQYXRoID0gZ2V0SW5wdXROYXRpdmVTU0xUcnVzdHN0b3JlUGF0aChjb25mKTsKLQotICAgICAgICBpZiAodHJ1c3RzdG9yZVBhdGguaXNQcmVzZW50KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9wdGlvbmFsPFN0cmluZz4ga2V5c3RvcmVQYXRoID0gZ2V0SW5wdXROYXRpdmVTU0xLZXlzdG9yZVBhdGgoY29uZik7Ci0gICAgICAgICAgICBPcHRpb25hbDxTdHJpbmc+IHRydXN0c3RvcmVQYXNzd29yZCA9IGdldElucHV0TmF0aXZlU1NMVHJ1c3RzdG9yZVBhc3N3b3JkKGNvbmYpOwotICAgICAgICAgICAgT3B0aW9uYWw8U3RyaW5nPiBrZXlzdG9yZVBhc3N3b3JkID0gZ2V0SW5wdXROYXRpdmVTU0xLZXlzdG9yZVBhc3N3b3JkKGNvbmYpOwotICAgICAgICAgICAgT3B0aW9uYWw8U3RyaW5nPiBjaXBoZXJTdWl0ZXMgPSBnZXRJbnB1dE5hdGl2ZVNTTENpcGhlclN1aXRlcyhjb25mKTsKLQotICAgICAgICAgICAgU1NMQ29udGV4dCBjb250ZXh0OwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dCA9IGdldFNTTENvbnRleHQodHJ1c3RzdG9yZVBhdGgsIHRydXN0c3RvcmVQYXNzd29yZCwga2V5c3RvcmVQYXRoLCBrZXlzdG9yZVBhc3N3b3JkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChVbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uIHwgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiB8Ci0gICAgICAgICAgICAgICAgICAgIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB8IEtleVN0b3JlRXhjZXB0aW9uIHwgQ2VydGlmaWNhdGVFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nW10gY3NzID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChjaXBoZXJTdWl0ZXMuaXNQcmVzZW50KCkpCi0gICAgICAgICAgICAgICAgY3NzID0gY2lwaGVyU3VpdGVzLmdldCgpLnNwbGl0KCIsIik7Ci0gICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YoSmRrU1NMT3B0aW9ucy5idWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTU0xDb250ZXh0KGNvbnRleHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ2lwaGVyU3VpdGVzKGNzcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBPcHRpb25hbC5hYnNlbnQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBPcHRpb25hbDxJbnRlZ2VyPiBnZXRJbnRTZXR0aW5nKFN0cmluZyBwYXJhbWV0ZXIsIENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIFN0cmluZyBzZXR0aW5nID0gY29uZi5nZXQocGFyYW1ldGVyKTsKLSAgICAgICAgaWYgKHNldHRpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5hYnNlbnQoKTsKLSAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKEludGVnZXIudmFsdWVPZihzZXR0aW5nKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgT3B0aW9uYWw8Qm9vbGVhbj4gZ2V0Qm9vbGVhblNldHRpbmcoU3RyaW5nIHBhcmFtZXRlciwgQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHNldHRpbmcgPSBjb25mLmdldChwYXJhbWV0ZXIpOwotICAgICAgICBpZiAoc2V0dGluZyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmFic2VudCgpOwotICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YoQm9vbGVhbi52YWx1ZU9mKHNldHRpbmcpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBPcHRpb25hbDxTdHJpbmc+IGdldFN0cmluZ1NldHRpbmcoU3RyaW5nIHBhcmFtZXRlciwgQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHNldHRpbmcgPSBjb25mLmdldChwYXJhbWV0ZXIpOwotICAgICAgICBpZiAoc2V0dGluZyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmFic2VudCgpOwotICAgICAgICByZXR1cm4gT3B0aW9uYWwub2Yoc2V0dGluZyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQXV0aFByb3ZpZGVyIGdldENsaWVudEF1dGhQcm92aWRlcihTdHJpbmcgZmFjdG9yeUNsYXNzTmFtZSwgQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENsYXNzPD8+IGMgPSBDbGFzcy5mb3JOYW1lKGZhY3RvcnlDbGFzc05hbWUpOwotICAgICAgICAgICAgaWYgKFBsYWluVGV4dEF1dGhQcm92aWRlci5jbGFzcy5lcXVhbHMoYykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHVzZXJuYW1lID0gZ2V0U3RyaW5nU2V0dGluZyhVU0VSTkFNRSwgY29uZikub3IoIiIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCA9IGdldFN0cmluZ1NldHRpbmcoUEFTU1dPUkQsIGNvbmYpLm9yKCIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEF1dGhQcm92aWRlcikgYy5nZXRDb25zdHJ1Y3RvcihTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uZXdJbnN0YW5jZSh1c2VybmFtZSwgcGFzc3dvcmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAoQXV0aFByb3ZpZGVyKSBjLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGluc3RhbnRpYXRlIGF1dGggcHJvdmlkZXI6IiArIGZhY3RvcnlDbGFzc05hbWUsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU1NMQ29udGV4dCBnZXRTU0xDb250ZXh0KE9wdGlvbmFsPFN0cmluZz4gdHJ1c3RzdG9yZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPFN0cmluZz4gdHJ1c3RzdG9yZVBhc3N3b3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxTdHJpbmc+IGtleXN0b3JlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8U3RyaW5nPiBrZXlzdG9yZVBhc3N3b3JkKQotICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCi0gICAgICAgICAgIEtleVN0b3JlRXhjZXB0aW9uLAotICAgICAgICAgICBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwKLSAgICAgICAgICAgSU9FeGNlcHRpb24sCi0gICAgICAgICAgIFVucmVjb3ZlcmFibGVLZXlFeGNlcHRpb24sCi0gICAgICAgICAgIEtleU1hbmFnZW1lbnRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFNTTENvbnRleHQgY3R4ID0gU1NMQ29udGV4dC5nZXRJbnN0YW5jZSgiU1NMIik7Ci0KLSAgICAgICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeSB0bWYgPSBudWxsOwotICAgICAgICBpZiAodHJ1c3RzdG9yZVBhdGguaXNQcmVzZW50KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gdHNmID0gRmlsZXMubmV3SW5wdXRTdHJlYW0oRmlsZS5nZXRQYXRoKHRydXN0c3RvcmVQYXRoLmdldCgpKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgS2V5U3RvcmUgdHMgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZSgiSktTIik7Ci0gICAgICAgICAgICAgICAgdHMubG9hZCh0c2YsIHRydXN0c3RvcmVQYXNzd29yZC5pc1ByZXNlbnQoKSA/IHRydXN0c3RvcmVQYXNzd29yZC5nZXQoKS50b0NoYXJBcnJheSgpIDogbnVsbCk7Ci0gICAgICAgICAgICAgICAgdG1mID0gVHJ1c3RNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZShUcnVzdE1hbmFnZXJGYWN0b3J5LmdldERlZmF1bHRBbGdvcml0aG0oKSk7Ci0gICAgICAgICAgICAgICAgdG1mLmluaXQodHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgS2V5TWFuYWdlckZhY3Rvcnkga21mID0gbnVsbDsKLSAgICAgICAgaWYgKGtleXN0b3JlUGF0aC5pc1ByZXNlbnQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBrc2YgPSBGaWxlcy5uZXdJbnB1dFN0cmVhbShGaWxlLmdldFBhdGgoa2V5c3RvcmVQYXRoLmdldCgpKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgS2V5U3RvcmUga3MgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZSgiSktTIik7Ci0gICAgICAgICAgICAgICAga3MubG9hZChrc2YsIGtleXN0b3JlUGFzc3dvcmQuaXNQcmVzZW50KCkgPyBrZXlzdG9yZVBhc3N3b3JkLmdldCgpLnRvQ2hhckFycmF5KCkgOiBudWxsKTsKLSAgICAgICAgICAgICAgICBrbWYgPSBLZXlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZShLZXlNYW5hZ2VyRmFjdG9yeS5nZXREZWZhdWx0QWxnb3JpdGhtKCkpOwotICAgICAgICAgICAgICAgIGttZi5pbml0KGtzLCBrZXlzdG9yZVBhc3N3b3JkLmlzUHJlc2VudCgpID8ga2V5c3RvcmVQYXNzd29yZC5nZXQoKS50b0NoYXJBcnJheSgpIDogbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjdHguaW5pdChrbWYgIT0gbnVsbCA/IGttZi5nZXRLZXlNYW5hZ2VycygpIDogbnVsbCwKLSAgICAgICAgICAgICAgICAgdG1mICE9IG51bGwgPyB0bWYuZ2V0VHJ1c3RNYW5hZ2VycygpIDogbnVsbCwKLSAgICAgICAgICAgICAgICAgbmV3IFNlY3VyZVJhbmRvbSgpKTsKLSAgICAgICAgcmV0dXJuIGN0eDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvY3FsMy9DcWxJbnB1dEZvcm1hdC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGFkb29wL2NxbDMvQ3FsSW5wdXRGb3JtYXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc1NTY4NC4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvY3FsMy9DcWxJbnB1dEZvcm1hdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcC5jcWwzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC4qOwotCi1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkNsdXN0ZXI7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkhvc3Q7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLk1ldGFkYXRhOwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5SZXN1bHRTZXQ7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlJvdzsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuU2Vzc2lvbjsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuU2ltcGxlU3RhdGVtZW50OwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5TdGF0ZW1lbnQ7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlRva2VuUmFuZ2U7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTXVsdGltYXA7Ci0KLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuZXhjZXB0aW9ucy5JbnZhbGlkUXVlcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jb25mLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLklucHV0U3BsaXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLkpvYkNvbmY7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLlJlY29yZFJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLkpvYkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLlRhc2tBdHRlbXB0Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuVGFza0F0dGVtcHRJRDsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlN5c3RlbUtleXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcC4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLio7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvckZhY3RvcnkuR2xvYmFsLmV4ZWN1dG9yRmFjdG9yeTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLm5hbm9UaW1lOwotCi0vKioKLSAqIEhhZG9vcCBJbnB1dEZvcm1hdCBhbGxvd2luZyBtYXAvcmVkdWNlIGFnYWluc3QgQ2Fzc2FuZHJhIHJvd3Mgd2l0aGluIG9uZSBDb2x1bW5GYW1pbHkuCi0gKgotICogQXQgbWluaW11bSwgeW91IG5lZWQgdG8gc2V0IHRoZSBLUyBhbmQgQ0YgaW4geW91ciBIYWRvb3Agam9iIENvbmZpZ3VyYXRpb24uCi0gKiBUaGUgQ29uZmlnSGVscGVyIGNsYXNzIGlzIHByb3ZpZGVkIHRvIG1ha2UgdGhpcwotICogc2ltcGxlOgotICogICBDb25maWdIZWxwZXIuc2V0SW5wdXRDb2x1bW5GYW1pbHkKLSAqCi0gKiBZb3UgY2FuIGFsc28gY29uZmlndXJlIHRoZSBudW1iZXIgb2Ygcm93cyBwZXIgSW5wdXRTcGxpdCB3aXRoCi0gKiAgIDE6IENvbmZpZ0hlbHBlci5zZXRJbnB1dFNwbGl0U2l6ZS4gVGhlIGRlZmF1bHQgc3BsaXQgc2l6ZSBpcyA2NGsgcm93cy4KLSAqICAgb3IKLSAqICAgMjogQ29uZmlnSGVscGVyLnNldElucHV0U3BsaXRTaXplSW5NYi4gSW5wdXRTcGxpdCBzaXplIGluIE1CIHdpdGggbmV3LCBtb3JlIHByZWNpc2UgbWV0aG9kCi0gKiAgIElmIG5vIHZhbHVlIGlzIHByb3ZpZGVkIGZvciBJbnB1dFNwbGl0U2l6ZUluTWIsIHdlIGRlZmF1bHQgdG8gdXNpbmcgSW5wdXRTcGxpdFNpemUuCi0gKgotICogICBDUUxDb25maWdIZWxwZXIuc2V0SW5wdXRDUUxQYWdlUm93U2l6ZS4gVGhlIGRlZmF1bHQgcGFnZSByb3cgc2l6ZSBpcyAxMDAwLiBZb3UKLSAqICAgc2hvdWxkIHNldCBpdCB0byAiYXMgYmlnIGFzIHBvc3NpYmxlLCBidXQgbm8gYmlnZ2VyLiIgSXQgc2V0IHRoZSBMSU1JVCBmb3IgdGhlIENRTAotICogICBxdWVyeSwgc28geW91IG5lZWQgc2V0IGl0IGJpZyBlbm91Z2ggdG8gbWluaW1pemUgdGhlIG5ldHdvcmsgb3ZlcmhlYWQsIGFuZCBhbHNvCi0gKiAgIG5vdCB0b28gYmlnIHRvIGF2b2lkIG91dCBvZiBtZW1vcnkgaXNzdWUuCi0gKgotICogICBvdGhlciBuYXRpdmUgcHJvdG9jb2wgY29ubmVjdGlvbiBwYXJhbWV0ZXJzIGluIENxbENvbmZpZ0hlbHBlcgotICovCi1wdWJsaWMgY2xhc3MgQ3FsSW5wdXRGb3JtYXQgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuSW5wdXRGb3JtYXQ8TG9uZywgUm93PiBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5JbnB1dEZvcm1hdDxMb25nLCBSb3c+Ci17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUkVEX1RBU0tfSUQgPSAibWFwcmVkLnRhc2suaWQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDcWxJbnB1dEZvcm1hdC5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcga2V5c3BhY2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY2ZOYW1lOwotICAgIHByaXZhdGUgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyOwotCi0gICAgcHVibGljIFJlY29yZFJlYWRlcjxMb25nLCBSb3c+IGdldFJlY29yZFJlYWRlcihJbnB1dFNwbGl0IHNwbGl0LCBKb2JDb25mIGpvYkNvbmYsIGZpbmFsIFJlcG9ydGVyIHJlcG9ydGVyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBUYXNrQXR0ZW1wdENvbnRleHQgdGFjID0gSGFkb29wQ29tcGF0Lm5ld01hcENvbnRleHQoCi0gICAgICAgICAgICAgICAgam9iQ29uZiwKLSAgICAgICAgICAgICAgICBUYXNrQXR0ZW1wdElELmZvck5hbWUoam9iQ29uZi5nZXQoTUFQUkVEX1RBU0tfSUQpKSwKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBuZXcgUmVwb3J0ZXJXcmFwcGVyKHJlcG9ydGVyKSwKLSAgICAgICAgICAgICAgICBudWxsKTsKLQotCi0gICAgICAgIENxbFJlY29yZFJlYWRlciByZWNvcmRSZWFkZXIgPSBuZXcgQ3FsUmVjb3JkUmVhZGVyKCk7Ci0gICAgICAgIHJlY29yZFJlYWRlci5pbml0aWFsaXplKChvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuSW5wdXRTcGxpdClzcGxpdCwgdGFjKTsKLSAgICAgICAgcmV0dXJuIHJlY29yZFJlYWRlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLlJlY29yZFJlYWRlcjxMb25nLCBSb3c+IGNyZWF0ZVJlY29yZFJlYWRlcigKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5JbnB1dFNwbGl0IGFyZzAsIFRhc2tBdHRlbXB0Q29udGV4dCBhcmcxKSB0aHJvd3MgSU9FeGNlcHRpb24sCi0gICAgICAgICAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDcWxSZWNvcmRSZWFkZXIoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbmZpZ3VyYXRpb24oQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgaWYgKENvbmZpZ0hlbHBlci5nZXRJbnB1dEtleXNwYWNlKGNvbmYpID09IG51bGwgfHwgQ29uZmlnSGVscGVyLmdldElucHV0Q29sdW1uRmFtaWx5KGNvbmYpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigieW91IG11c3Qgc2V0IHRoZSBrZXlzcGFjZSBhbmQgdGFibGUgd2l0aCBzZXRJbnB1dENvbHVtbkZhbWlseSgpIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKENvbmZpZ0hlbHBlci5nZXRJbnB1dEluaXRpYWxBZGRyZXNzKGNvbmYpID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIllvdSBtdXN0IHNldCB0aGUgaW5pdGlhbCBvdXRwdXQgYWRkcmVzcyB0byBhIENhc3NhbmRyYSBub2RlIHdpdGggc2V0SW5wdXRJbml0aWFsQWRkcmVzcyIpOwotICAgICAgICBpZiAoQ29uZmlnSGVscGVyLmdldElucHV0UGFydGl0aW9uZXIoY29uZikgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiWW91IG11c3Qgc2V0IHRoZSBDYXNzYW5kcmEgcGFydGl0aW9uZXIgY2xhc3Mgd2l0aCBzZXRJbnB1dFBhcnRpdGlvbmVyIik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8b3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLklucHV0U3BsaXQ+IGdldFNwbGl0cyhKb2JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ29uZmlndXJhdGlvbiBjb25mID0gSGFkb29wQ29tcGF0LmdldENvbmZpZ3VyYXRpb24oY29udGV4dCk7Ci0KLSAgICAgICAgdmFsaWRhdGVDb25maWd1cmF0aW9uKGNvbmYpOwotCi0gICAgICAgIGtleXNwYWNlID0gQ29uZmlnSGVscGVyLmdldElucHV0S2V5c3BhY2UoY29uZik7Ci0gICAgICAgIGNmTmFtZSA9IENvbmZpZ0hlbHBlci5nZXRJbnB1dENvbHVtbkZhbWlseShjb25mKTsKLSAgICAgICAgcGFydGl0aW9uZXIgPSBDb25maWdIZWxwZXIuZ2V0SW5wdXRQYXJ0aXRpb25lcihjb25mKTsKLSAgICAgICAgbG9nZ2VyLnRyYWNlKCJwYXJ0aXRpb25lciBpcyB7fSIsIHBhcnRpdGlvbmVyKTsKLQotICAgICAgICAvLyBjYW5vbmljYWwgcmFuZ2VzLCBzcGxpdCBpbnRvIHBpZWNlcywgZmV0Y2hpbmcgdGhlIHNwbGl0cyBpbiBwYXJhbGxlbAotICAgICAgICBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBleGVjdXRvckZhY3RvcnkoKS5wb29sZWQoIkhhZG9vcElucHV0IiwgMTI4KTsKLSAgICAgICAgTGlzdDxvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuSW5wdXRTcGxpdD4gc3BsaXRzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICAgICAgU3RyaW5nW10gaW5wdXRJbml0aWFsQWRkcmVzcyA9IENvbmZpZ0hlbHBlci5nZXRJbnB1dEluaXRpYWxBZGRyZXNzKGNvbmYpLnNwbGl0KCIsIik7Ci0gICAgICAgIHRyeSAoQ2x1c3RlciBjbHVzdGVyID0gQ3FsQ29uZmlnSGVscGVyLmdldElucHV0Q2x1c3RlcihpbnB1dEluaXRpYWxBZGRyZXNzLCBjb25mKTsKLSAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBjbHVzdGVyLmNvbm5lY3QoKSkKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxTcGxpdEZ1dHVyZT4gc3BsaXRmdXR1cmVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICAvL1RPRE8gaWYgdGhlIGpvYiByYW5nZSBpcyBkZWZpbmVkIGFuZCBkb2VzIHBlcmZlY3RseSBtYXRjaCB0b2tlbnMsIHRoZW4gdGhlIGxvZ2ljIHdpbGwgYmUgdW5hYmxlIHRvIGdldCBlc3RpbWF0ZXMgc2luY2UgdGhleSBhcmUgcHJlLWNvbXB1dGVkCi0gICAgICAgICAgICAvLyB0b2tlbnM6IFswLCAxMCwgMjBdCi0gICAgICAgICAgICAvLyBqb2IgcmFuZ2U6IFswLCAxMCkgLSBhYmxlIHRvIGdldCBlc3RpbWF0ZQotICAgICAgICAgICAgLy8gam9iIHJhbmdlOiBbNSwgMTUpIC0gdW5hYmxlIHRvIGdldCBlc3RpbWF0ZQotICAgICAgICAgICAgUGFpcjxTdHJpbmcsIFN0cmluZz4gam9iS2V5UmFuZ2UgPSBDb25maWdIZWxwZXIuZ2V0SW5wdXRLZXlSYW5nZShjb25mKTsKLSAgICAgICAgICAgIFJhbmdlPFRva2VuPiBqb2JSYW5nZSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoam9iS2V5UmFuZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBqb2JSYW5nZSA9IG5ldyBSYW5nZTw+KHBhcnRpdGlvbmVyLmdldFRva2VuRmFjdG9yeSgpLmZyb21TdHJpbmcoam9iS2V5UmFuZ2UubGVmdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25lci5nZXRUb2tlbkZhY3RvcnkoKS5mcm9tU3RyaW5nKGpvYktleVJhbmdlLnJpZ2h0KSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1ldGFkYXRhIG1ldGFkYXRhID0gY2x1c3Rlci5nZXRNZXRhZGF0YSgpOwotCi0gICAgICAgICAgICAvLyBjYW5vbmljYWwgcmFuZ2VzIGFuZCBub2RlcyBob2xkaW5nIHJlcGxpY2FzCi0gICAgICAgICAgICBNYXA8VG9rZW5SYW5nZSwgTGlzdDxIb3N0Pj4gbWFzdGVyUmFuZ2VOb2RlcyA9IGdldFJhbmdlTWFwKGtleXNwYWNlLCBtZXRhZGF0YSwgZ2V0VGFyZ2V0REMobWV0YWRhdGEsIGlucHV0SW5pdGlhbEFkZHJlc3MpKTsKLSAgICAgICAgICAgIGZvciAoVG9rZW5SYW5nZSByYW5nZSA6IG1hc3RlclJhbmdlTm9kZXMua2V5U2V0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGpvYlJhbmdlID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3IgKFRva2VuUmFuZ2UgdW53cmFwcGVkIDogcmFuZ2UudW53cmFwKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBlYWNoIHRva2VuUmFuZ2UsIHBpY2sgYSBsaXZlIG93bmVyIGFuZCBhc2sgaXQgZm9yIHRoZSBieXRlLXNpemVkIHNwbGl0cwotICAgICAgICAgICAgICAgICAgICAgICAgU3BsaXRGdXR1cmUgdGFzayA9IG5ldyBTcGxpdEZ1dHVyZShuZXcgU3BsaXRDYWxsYWJsZSh1bndyYXBwZWQsIG1hc3RlclJhbmdlTm9kZXMuZ2V0KHJhbmdlKSwgY29uZiwgc2Vzc2lvbikpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3Iuc3VibWl0KHRhc2spOwotICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXRmdXR1cmVzLmFkZCh0YXNrKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBUb2tlblJhbmdlIGpvYlRva2VuUmFuZ2UgPSByYW5nZVRvVG9rZW5SYW5nZShtZXRhZGF0YSwgam9iUmFuZ2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2UuaW50ZXJzZWN0cyhqb2JUb2tlblJhbmdlKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChUb2tlblJhbmdlIGludGVyc2VjdGlvbjogcmFuZ2UuaW50ZXJzZWN0V2l0aChqb2JUb2tlblJhbmdlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFRva2VuUmFuZ2UgdW53cmFwcGVkIDogaW50ZXJzZWN0aW9uLnVud3JhcCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGVhY2ggdG9rZW5SYW5nZSwgcGljayBhIGxpdmUgb3duZXIgYW5kIGFzayBpdCBmb3IgdGhlIGJ5dGUtc2l6ZWQgc3BsaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwbGl0RnV0dXJlIHRhc2sgPSBuZXcgU3BsaXRGdXR1cmUobmV3IFNwbGl0Q2FsbGFibGUodW53cmFwcGVkLCAgbWFzdGVyUmFuZ2VOb2Rlcy5nZXQocmFuZ2UpLCBjb25mLCBzZXNzaW9uKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yLnN1Ym1pdCh0YXNrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXRmdXR1cmVzLmFkZCh0YXNrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHdhaXQgdW50aWwgd2UgaGF2ZSBhbGwgdGhlIHJlc3VsdHMgYmFjawotICAgICAgICAgICAgTGlzdDxTcGxpdEZ1dHVyZT4gZmFpbGVkVGFza3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGludCBtYXhTcGxpdHMgPSAwOwotICAgICAgICAgICAgbG9uZyBleHBlY3RlZFBhcnRpb25zRm9yRmFpbGVkUmFuZ2VzID0gMDsKLSAgICAgICAgICAgIGZvciAoU3BsaXRGdXR1cmUgdGFzayA6IHNwbGl0ZnV0dXJlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8Q29sdW1uRmFtaWx5U3BsaXQ+IHRva2VuUmFuZ2VTcGxpdHMgPSB0YXNrLmdldCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5SYW5nZVNwbGl0cy5zaXplKCkgPiBtYXhTcGxpdHMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heFNwbGl0cyA9IHRva2VuUmFuZ2VTcGxpdHMuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRQYXJ0aW9uc0ZvckZhaWxlZFJhbmdlcyA9IHRva2VuUmFuZ2VTcGxpdHMuZ2V0KDApLmdldExlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNwbGl0cy5hZGRBbGwodG9rZW5SYW5nZVNwbGl0cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWxlZFRhc2tzLmFkZCh0YXNrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUaGUgZXN0aW1hdGUgaXMgb25seSBzdG9yZWQgb24gYSBzaW5nbGUgaG9zdCwgaWYgdGhhdCBob3N0IGlzIGRvd24gdGhlbiBjYW4gbm90IGdldCB0aGUgZXN0aW1hdGUKLSAgICAgICAgICAgIC8vIGl0cyBtb3JlIHRoYW4gbGlrZWx5IHRoYXQgYSBzaW5nbGUgaG9zdCBjb3VsZCBiZSAidG9vIGxhcmdlIiBmb3Igb25lIHNwbGl0IGJ1dCB0aGVyZSBpcyBubyB3YXkgb2YKLSAgICAgICAgICAgIC8vIGtub3duaW5nIQotICAgICAgICAgICAgLy8gVGhpcyBsb2dpYyBhdHRlbXB0cyB0byBndWVzcyB0aGUgZXN0aW1hdGUgZnJvbSBhbGwgdGhlIHN1Y2Nlc3NmdWwgcmFuZ2VzCi0gICAgICAgICAgICBpZiAoIWZhaWxlZFRhc2tzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBpZiBldmVyeSBzcGxpdCBmYWlsZWQgdGhpcyB3aWxsIGJlIDAKLSAgICAgICAgICAgICAgICBpZiAobWF4U3BsaXRzID09IDApCi0gICAgICAgICAgICAgICAgICAgIHRocm93QWxsU3BsaXRzRmFpbGVkKGZhaWxlZFRhc2tzKTsKLSAgICAgICAgICAgICAgICBmb3IgKFNwbGl0RnV0dXJlIHRhc2sgOiBmYWlsZWRUYXNrcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGFzayBmYWlsZWQsIHNvIHRoaXMgc2hvdWxkIHRocm93Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmdldCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gY2F1c2UpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJVbmFibGUgdG8gZ2V0IGVzdGltYXRlIGZvciB7fSwgdGhlIGhvc3Qge30gaGFkIGEgZXhjZXB0aW9uOyBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdCBlc3RpbWF0ZSIsIHRhc2suc3BsaXRDYWxsYWJsZS50b2tlblJhbmdlLCB0YXNrLnNwbGl0Q2FsbGFibGUuaG9zdHMuZ2V0KDApLCBjYXVzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChTcGxpdEZ1dHVyZSB0YXNrIDogZmFpbGVkVGFza3MpCi0gICAgICAgICAgICAgICAgICAgIHNwbGl0cy5hZGRBbGwodG9TcGxpdCh0YXNrLnNwbGl0Q2FsbGFibGUuaG9zdHMsIHNwbGl0VG9rZW5SYW5nZSh0YXNrLnNwbGl0Q2FsbGFibGUudG9rZW5SYW5nZSwgbWF4U3BsaXRzLCBleHBlY3RlZFBhcnRpb25zRm9yRmFpbGVkUmFuZ2VzKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgZXhlY3V0b3Iuc2h1dGRvd25Ob3coKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCBzcGxpdHMuc2l6ZSgpID4gMDsKLSAgICAgICAgQ29sbGVjdGlvbnMuc2h1ZmZsZShzcGxpdHMsIG5ldyBSYW5kb20obmFub1RpbWUoKSkpOwotICAgICAgICByZXR1cm4gc3BsaXRzOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB0aHJvd0FsbFNwbGl0c0ZhaWxlZChMaXN0PFNwbGl0RnV0dXJlPiBmYWlsZWRUYXNrcykKLSAgICB7Ci0gICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleGNlcHRpb24gPSBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBzdWNjZXNzZnVsIHRhc2tzIGZvdW5kIik7Ci0gICAgICAgIGZvciAoU3BsaXRGdXR1cmUgdGFzayA6IGZhaWxlZFRhc2tzKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyB0aGUgdGFzayBmYWlsZWQsIHNvIHRoaXMgc2hvdWxkIHRocm93Ci0gICAgICAgICAgICAgICAgdGFzay5nZXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gY2F1c2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXhjZXB0aW9uLmFkZFN1cHByZXNzZWQoY2F1c2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRocm93IGV4Y2VwdGlvbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VGFyZ2V0REMoTWV0YWRhdGEgbWV0YWRhdGEsIFN0cmluZ1tdIGlucHV0SW5pdGlhbEFkZHJlc3MpCi0gICAgewotICAgICAgICBCaU11bHRpVmFsTWFwPEluZXRBZGRyZXNzLCBTdHJpbmc+IGFkZHJlc3NUb0RjID0gbmV3IEJpTXVsdGlWYWxNYXA8PigpOwotICAgICAgICBNdWx0aW1hcDxTdHJpbmcsIEluZXRBZGRyZXNzPiBkY1RvQWRkcmVzc2VzID0gYWRkcmVzc1RvRGMuaW52ZXJzZSgpOwotCi0gICAgICAgIC8vIG9ubHkgd2F5IHRvIG1hdGNoIGlzIG9mZiB0aGUgYnJvYWRjYXN0IGFkZHJlc3Nlcywgc28gZm9yIGFsbCBob3N0cyBkbyBhIGV4aXN0ZW5jZSBjaGVjawotICAgICAgICBTZXQ8SW5ldEFkZHJlc3M+IGFkZHJlc3NlcyA9IG5ldyBIYXNoU2V0PD4oaW5wdXRJbml0aWFsQWRkcmVzcy5sZW5ndGgpOwotICAgICAgICBmb3IgKFN0cmluZyBpbnB1dEFkZHJlc3MgOiBpbnB1dEluaXRpYWxBZGRyZXNzKQotICAgICAgICAgICAgYWRkcmVzc2VzLmFkZEFsbChwYXJzZUFkZHJlc3MoaW5wdXRBZGRyZXNzKSk7Ci0KLSAgICAgICAgZm9yIChIb3N0IGhvc3QgOiBtZXRhZGF0YS5nZXRBbGxIb3N0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbmV0QWRkcmVzcyBhZGRyZXNzID0gaG9zdC5nZXRCcm9hZGNhc3RBZGRyZXNzKCk7Ci0gICAgICAgICAgICBpZiAoYWRkcmVzc2VzLmNvbnRhaW5zKGFkZHJlc3MpKQotICAgICAgICAgICAgICAgIGFkZHJlc3NUb0RjLnB1dChhZGRyZXNzLCBob3N0LmdldERhdGFjZW50ZXIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKGRjVG9BZGRyZXNzZXMua2V5U2V0KCkuc2l6ZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEl0ZXJhYmxlcy5nZXRPbmx5RWxlbWVudChkY1RvQWRkcmVzc2VzLmtleVNldCgpKTsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnB1dCBhZGRyZXNzZXMgY291bGQgbm90IGJlIHVzZWQgdG8gZmluZCBEQzsgbm9uIG1hdGNoIGNsaWVudCBtZXRhZGF0YSIpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvLyBNdXRsaXBsZSBEQ3MgZm91bmQsIGF0dGVtcHQgdG8gcGljayB0aGUgZmlyc3QgYmFzZWQgb2ZmIGFkZHJlc3MgbGlzdC4gVGhpcyBpcyB0byBtaW1pYyB0aGUgMi4xCi0gICAgICAgICAgICAgICAgLy8gYmVoYXZpb3Igd2hpY2ggd291bGQgY29ubmVjdCBpbiBvcmRlciBhbmQgdGhlIGZpcnN0IG5vZGUgc3VjY2Vzc2Z1bGx5IGFibGUgdG8gY29ubmVjdCB0byB3YXMgdGhlCi0gICAgICAgICAgICAgICAgLy8gbG9jYWwgREMgdG8gdXNlOyBzaW5jZSBjbGllbnQgYWJzdHJhY3RzIHRoaXMsIHdlIHJlbHkgb24gZXhpc3RlbmNlIGFzIGEgcHJveHkgZm9yIGNvbm5lY3QuCi0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgaW5wdXRBZGRyZXNzIDogaW5wdXRJbml0aWFsQWRkcmVzcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoSW5ldEFkZHJlc3MgYWRkIDogcGFyc2VBZGRyZXNzKGlucHV0QWRkcmVzcykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkYyA9IGFkZHJlc3NUb0RjLmdldChhZGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2libGUgdGhlIGFkZHJlc3MgaXNuJ3QgaW4gdGhlIGNsdXN0ZXIgYW5kIHRoZSBjbGllbnQgZHJvcHBlZCwgc28gaWdub3JlIG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBzb21lIGhvdyB3ZSB3ZXJlIGFibGUgdG8gY29ubmVjdCB0byB0aGUgY2x1c3RlciwgZmluZCBtdWx0aXBsZSBEQ3MgdXNpbmcgbWF0Y2hpbmcsIGFuZCB5ZXQgY291bGRuJ3QKLSAgICAgICAgICAgICAgICAvLyBtYXRjaCBhZ2Fpbi4uLgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVW5hYmxlIHRvIGluZmVyIGRhdGFjZW50ZXIgZnJvbSBpbml0aWFsIGFkZHJlc3NlczsgbXVsdGlwbGUgZGF0YWNlbnRlcnMgZm91bmQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRjVG9BZGRyZXNzZXMua2V5U2V0KCkgKyAiLCBzaG91bGQgb25seSB1c2UgYWRkcmVzc2VzIGZyb20gb25lIGRhdGFjZW50ZXIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8SW5ldEFkZHJlc3M+IHBhcnNlQWRkcmVzcyhTdHJpbmcgc3RyKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KEluZXRBZGRyZXNzLmdldEFsbEJ5TmFtZShzdHIpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUb2tlblJhbmdlIHJhbmdlVG9Ub2tlblJhbmdlKE1ldGFkYXRhIG1ldGFkYXRhLCBSYW5nZTxUb2tlbj4gcmFuZ2UpCi0gICAgewotICAgICAgICByZXR1cm4gbWV0YWRhdGEubmV3VG9rZW5SYW5nZShtZXRhZGF0YS5uZXdUb2tlbihwYXJ0aXRpb25lci5nZXRUb2tlbkZhY3RvcnkoKS50b1N0cmluZyhyYW5nZS5sZWZ0KSksCi0gICAgICAgICAgICAgICAgbWV0YWRhdGEubmV3VG9rZW4ocGFydGl0aW9uZXIuZ2V0VG9rZW5GYWN0b3J5KCkudG9TdHJpbmcocmFuZ2UucmlnaHQpKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXA8VG9rZW5SYW5nZSwgTG9uZz4gZ2V0U3ViU3BsaXRzKFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIGNmTmFtZSwgVG9rZW5SYW5nZSByYW5nZSwgSG9zdCBob3N0LCBDb25maWd1cmF0aW9uIGNvbmYsIFNlc3Npb24gc2Vzc2lvbikKLSAgICB7Ci0gICAgICAgIGludCBzcGxpdFNpemUgPSBDb25maWdIZWxwZXIuZ2V0SW5wdXRTcGxpdFNpemUoY29uZik7Ci0gICAgICAgIGludCBzcGxpdFNpemVNaUIgPSBDb25maWdIZWxwZXIuZ2V0SW5wdXRTcGxpdFNpemVJbk1iKGNvbmYpOwotICAgICAgICByZXR1cm4gZGVzY3JpYmVTcGxpdHMoa2V5c3BhY2UsIGNmTmFtZSwgcmFuZ2UsIGhvc3QsIHNwbGl0U2l6ZSwgc3BsaXRTaXplTWlCLCBzZXNzaW9uKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8VG9rZW5SYW5nZSwgTGlzdDxIb3N0Pj4gZ2V0UmFuZ2VNYXAoU3RyaW5nIGtleXNwYWNlLCBNZXRhZGF0YSBtZXRhZGF0YSwgU3RyaW5nIHRhcmdldERDKQotICAgIHsKLSAgICAgICAgcmV0dXJuIENxbENsaWVudEhlbHBlci5nZXRMb2NhbFByaW1hcnlSYW5nZUZvckRDKGtleXNwYWNlLCBtZXRhZGF0YSwgdGFyZ2V0REMpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWFwPFRva2VuUmFuZ2UsIExvbmc+IGRlc2NyaWJlU3BsaXRzKFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlLCBUb2tlblJhbmdlIHRva2VuUmFuZ2UsIEhvc3QgaG9zdCwgaW50IHNwbGl0U2l6ZSwgaW50IHNwbGl0U2l6ZU1iLCBTZXNzaW9uIHNlc3Npb24pCi0gICAgewotICAgICAgICAvLyBJbiAyLjEgdGhlIGhvc3QgbGlzdCB3YXMgd2Fsa2VkIGluLW9yZGVyIChvbmx5IG1vdmUgdG8gbmV4dCBpZiBJT0V4Y2VwdGlvbikgYW5kIGNhbGxzCi0gICAgICAgIC8vIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2UuZ2V0U3BsaXRzKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTxvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW4+LCBpbnQpCi0gICAgICAgIC8vIHRoYXQgY2FsbCBjb21wdXRlcyB0b3RhbFJvd0NvdW50RXN0aW1hdGUgKHVzZWQgdG8gY29tcHV0ZSAjc3BsaXRzKSB0aGVuIHNwbGl0cyB0aGUgcmluZyBiYXNlZCBvZmYgdGhvc2UgZXN0aW1hdGVzCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFRoZSBtYWluIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgZXN0aW1hdGVzIGluIDIuMSB3ZXJlIGNvbXB1dGVkIGJhc2VkIG9mZiB0aGUgZGF0YSwgc28gcmVwbGljYXMgY291bGQgYW5zd2VyIHRoZSBlc3RpbWF0ZXMKLSAgICAgICAgLy8gSW4gMy4wIHdlIHJlbHkgb24gdGhlIGJlbG93IENRTCBxdWVyeSB3aGljaCBpcyBsb2NhbCBhbmQgb25seSBjb21wdXRlcyBlc3RpbWF0ZXMgZm9yIHRoZSBwcmltYXJ5IHJhbmdlOyB0aGlzCi0gICAgICAgIC8vIHB1dHMgdXMgaW4gYSBzdGlja3kgc3BvdCB0byBhbnN3ZXIsIGlmIHRoZSBub2RlIGZhaWxzIHdoYXQgZG8gd2UgZG8/ICAzLjAgYmVoYXZpb3Igb25seSBtYXRjaGVzIDIuMSBJRkYgYWxsCi0gICAgICAgIC8vIG5vZGVzIGFyZSB1cCBhbmQgaGVhbHRoeQotICAgICAgICBSZXN1bHRTZXQgcmVzdWx0U2V0ID0gcXVlcnlUYWJsZUVzdGltYXRlcyhzZXNzaW9uLCBob3N0LCBrZXlzcGFjZSwgdGFibGUsIHRva2VuUmFuZ2UpOwotCi0gICAgICAgIFJvdyByb3cgPSByZXN1bHRTZXQub25lKCk7Ci0KLSAgICAgICAgbG9uZyBtZWFuUGFydGl0aW9uU2l6ZSA9IDA7Ci0gICAgICAgIGxvbmcgcGFydGl0aW9uQ291bnQgPSAwOwotICAgICAgICBpbnQgc3BsaXRDb3VudCA9IDA7Ci0KLSAgICAgICAgaWYgKHJvdyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZWFuUGFydGl0aW9uU2l6ZSA9IHJvdy5nZXRMb25nKCJtZWFuX3BhcnRpdGlvbl9zaXplIik7Ci0gICAgICAgICAgICBwYXJ0aXRpb25Db3VudCA9IHJvdy5nZXRMb25nKCJwYXJ0aXRpb25zX2NvdW50Iik7Ci0KLSAgICAgICAgICAgIHNwbGl0Q291bnQgPSBzcGxpdFNpemVNYiA+IDAKLSAgICAgICAgICAgICAgICA/IChpbnQpKG1lYW5QYXJ0aXRpb25TaXplICogcGFydGl0aW9uQ291bnQgLyBzcGxpdFNpemVNYiAvIDEwMjQgLyAxMDI0KQotICAgICAgICAgICAgICAgIDogKGludCkocGFydGl0aW9uQ291bnQgLyBzcGxpdFNpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgd2UgaGF2ZSBubyBkYXRhIG9uIHRoaXMgc3BsaXQgb3IgdGhlIHNpemUgZXN0aW1hdGUgaXMgMCwKLSAgICAgICAgLy8gcmV0dXJuIHRoZSBmdWxsIHNwbGl0IGkuZS4sIGRvIG5vdCBzdWItc3BsaXQKLSAgICAgICAgLy8gQXNzdW1lIHNtYWxsZXN0IGdyYW51bGFyaXR5IG9mIHBhcnRpdGlvbiBjb3VudCBhdmFpbGFibGUgZnJvbSBDQVNTQU5EUkEtNzY4OAotICAgICAgICBpZiAoc3BsaXRDb3VudCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXA8VG9rZW5SYW5nZSwgTG9uZz4gd3JhcHBlZFRva2VuUmFuZ2UgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgICAgICB3cmFwcGVkVG9rZW5SYW5nZS5wdXQodG9rZW5SYW5nZSwgcGFydGl0aW9uQ291bnQgPT0gMCA/IDEyOEwgOiBwYXJ0aXRpb25Db3VudCk7Ci0gICAgICAgICAgICByZXR1cm4gd3JhcHBlZFRva2VuUmFuZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3BsaXRUb2tlblJhbmdlKHRva2VuUmFuZ2UsIHNwbGl0Q291bnQsIHBhcnRpdGlvbkNvdW50IC8gc3BsaXRDb3VudCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUmVzdWx0U2V0IHF1ZXJ5VGFibGVFc3RpbWF0ZXMoU2Vzc2lvbiBzZXNzaW9uLCBIb3N0IGhvc3QsIFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlLCBUb2tlblJhbmdlIHRva2VuUmFuZ2UpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gU3RyaW5nLmZvcm1hdCgiU0VMRUNUIG1lYW5fcGFydGl0aW9uX3NpemUsIHBhcnRpdGlvbnNfY291bnQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGUk9NICVzLiVzICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0hFUkUga2V5c3BhY2VfbmFtZSA9ID8gQU5EIHRhYmxlX25hbWUgPSA/IEFORCByYW5nZV90eXBlID0gJyVzJyBBTkQgcmFuZ2Vfc3RhcnQgPSA/IEFORCByYW5nZV9lbmQgPSA/IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLlNZU1RFTV9LRVlTUEFDRV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1LZXlzcGFjZS5UQUJMRV9FU1RJTUFURVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbUtleXNwYWNlLlRBQkxFX0VTVElNQVRFU19UWVBFX0xPQ0FMX1BSSU1BUlkpOwotICAgICAgICAgICAgU3RhdGVtZW50IHN0bXQgPSBuZXcgU2ltcGxlU3RhdGVtZW50KHF1ZXJ5LCBrZXlzcGFjZSwgdGFibGUsIHRva2VuUmFuZ2UuZ2V0U3RhcnQoKS50b1N0cmluZygpLCB0b2tlblJhbmdlLmdldEVuZCgpLnRvU3RyaW5nKCkpLnNldEhvc3QoaG9zdCk7Ci0gICAgICAgICAgICByZXR1cm4gc2Vzc2lvbi5leGVjdXRlKHN0bXQpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbnZhbGlkUXVlcnlFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gaWYgdGhlIHRhYmxlIGRvZXNuJ3QgZXhpc3QsIGZhbGwgYmFjayB0byBvbGQgdGFibGUuICBUaGlzIGlzIGxpa2VseSB0byByZXR1cm4gbm8gcmVjb3JkcyBpbiBhIG11bHRpCi0gICAgICAgICAgICAvLyBEQyBzZXR1cCwgYnV0IHNob3VsZCB3b3JrIGZpbmUgaW4gYSBzaW5nbGUgREMgc2V0dXAuCi0gICAgICAgICAgICBTdHJpbmcgcXVlcnkgPSBTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgbWVhbl9wYXJ0aXRpb25fc2l6ZSwgcGFydGl0aW9uc19jb3VudCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZST00gJXMuJXMgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXSEVSRSBrZXlzcGFjZV9uYW1lID0gPyBBTkQgdGFibGVfbmFtZSA9ID8gQU5EIHJhbmdlX3N0YXJ0ID0gPyBBTkQgcmFuZ2VfZW5kID0gPyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5TWVNURU1fS0VZU1BBQ0VfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtS2V5c3BhY2UuTEVHQUNZX1NJWkVfRVNUSU1BVEVTKTsKLQotICAgICAgICAgICAgU3RhdGVtZW50IHN0bXQgPSBuZXcgU2ltcGxlU3RhdGVtZW50KHF1ZXJ5LCBrZXlzcGFjZSwgdGFibGUsIHRva2VuUmFuZ2UuZ2V0U3RhcnQoKS50b1N0cmluZygpLCB0b2tlblJhbmdlLmdldEVuZCgpLnRvU3RyaW5nKCkpLnNldEhvc3QoaG9zdCk7Ci0gICAgICAgICAgICByZXR1cm4gc2Vzc2lvbi5leGVjdXRlKHN0bXQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFRva2VuUmFuZ2UsIExvbmc+IHNwbGl0VG9rZW5SYW5nZShUb2tlblJhbmdlIHRva2VuUmFuZ2UsIGludCBzcGxpdENvdW50LCBsb25nIHBhcnRpdGlvbkNvdW50KQotICAgIHsKLSAgICAgICAgTGlzdDxUb2tlblJhbmdlPiBzcGxpdFJhbmdlcyA9IHRva2VuUmFuZ2Uuc3BsaXRFdmVubHkoc3BsaXRDb3VudCk7Ci0gICAgICAgIE1hcDxUb2tlblJhbmdlLCBMb25nPiByYW5nZXNXaXRoTGVuZ3RoID0gTWFwcy5uZXdIYXNoTWFwV2l0aEV4cGVjdGVkU2l6ZShzcGxpdFJhbmdlcy5zaXplKCkpOwotICAgICAgICBmb3IgKFRva2VuUmFuZ2UgcmFuZ2UgOiBzcGxpdFJhbmdlcykKLSAgICAgICAgICAgIHJhbmdlc1dpdGhMZW5ndGgucHV0KHJhbmdlLCBwYXJ0aXRpb25Db3VudCk7Ci0KLSAgICAgICAgcmV0dXJuIHJhbmdlc1dpdGhMZW5ndGg7Ci0gICAgfQotCi0gICAgLy8gT2xkIEhhZG9vcCBBUEkKLSAgICBwdWJsaWMgSW5wdXRTcGxpdFtdIGdldFNwbGl0cyhKb2JDb25mIGpvYkNvbmYsIGludCBudW1TcGxpdHMpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgVGFza0F0dGVtcHRDb250ZXh0IHRhYyA9IEhhZG9vcENvbXBhdC5uZXdUYXNrQXR0ZW1wdENvbnRleHQoam9iQ29uZiwgbmV3IFRhc2tBdHRlbXB0SUQoKSk7Ci0gICAgICAgIExpc3Q8b3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLklucHV0U3BsaXQ+IG5ld0lucHV0U3BsaXRzID0gdGhpcy5nZXRTcGxpdHModGFjKTsKLSAgICAgICAgSW5wdXRTcGxpdFtdIG9sZElucHV0U3BsaXRzID0gbmV3IElucHV0U3BsaXRbbmV3SW5wdXRTcGxpdHMuc2l6ZSgpXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdJbnB1dFNwbGl0cy5zaXplKCk7IGkrKykKLSAgICAgICAgICAgIG9sZElucHV0U3BsaXRzW2ldID0gKENvbHVtbkZhbWlseVNwbGl0KW5ld0lucHV0U3BsaXRzLmdldChpKTsKLSAgICAgICAgcmV0dXJuIG9sZElucHV0U3BsaXRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSB0b2tlbiB0b2tlblJhbmdlIGFuZCBzcGxpdHMgaXQgdXAgYWNjb3JkaW5nIHRvIHRoZSBzdWdnZXN0ZWQKLSAgICAgKiBzaXplIGludG8gaW5wdXQgc3BsaXRzIHRoYXQgSGFkb29wIGNhbiB1c2UuCi0gICAgICovCi0gICAgY2xhc3MgU3BsaXRDYWxsYWJsZSBpbXBsZW1lbnRzIENhbGxhYmxlPExpc3Q8Q29sdW1uRmFtaWx5U3BsaXQ+PgotICAgIHsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFRva2VuUmFuZ2UgdG9rZW5SYW5nZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEhvc3Q+IGhvc3RzOwotICAgICAgICBwcml2YXRlIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uIHNlc3Npb247Ci0KLSAgICAgICAgcHVibGljIFNwbGl0Q2FsbGFibGUoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBMaXN0PEhvc3Q+IGhvc3RzLCBDb25maWd1cmF0aW9uIGNvbmYsIFNlc3Npb24gc2Vzc2lvbikKLSAgICAgICAgewotICAgICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50KCFob3N0cy5pc0VtcHR5KCksICJob3N0cyBsaXN0IHJlcXVpcmVzIGF0IGxlYXN0IDEgaG9zdCBidXQgd2FzIGVtcHR5Iik7Ci0gICAgICAgICAgICB0aGlzLnRva2VuUmFuZ2UgPSB0b2tlblJhbmdlOwotICAgICAgICAgICAgdGhpcy5ob3N0cyA9IGhvc3RzOwotICAgICAgICAgICAgdGhpcy5jb25mID0gY29uZjsKLSAgICAgICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlzdDxDb2x1bW5GYW1pbHlTcGxpdD4gY2FsbCgpIHRocm93cyBFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgTWFwPFRva2VuUmFuZ2UsIExvbmc+IHN1YlNwbGl0cyA9IGdldFN1YlNwbGl0cyhrZXlzcGFjZSwgY2ZOYW1lLCB0b2tlblJhbmdlLCBob3N0cy5nZXQoMCksIGNvbmYsIHNlc3Npb24pOwotICAgICAgICAgICAgcmV0dXJuIHRvU3BsaXQoaG9zdHMsIHN1YlNwbGl0cyk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNwbGl0RnV0dXJlIGV4dGVuZHMgRnV0dXJlVGFzazxMaXN0PENvbHVtbkZhbWlseVNwbGl0Pj4KLSAgICB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3BsaXRDYWxsYWJsZSBzcGxpdENhbGxhYmxlOwotCi0gICAgICAgIFNwbGl0RnV0dXJlKFNwbGl0Q2FsbGFibGUgc3BsaXRDYWxsYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoc3BsaXRDYWxsYWJsZSk7Ci0gICAgICAgICAgICB0aGlzLnNwbGl0Q2FsbGFibGUgPSBzcGxpdENhbGxhYmxlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PENvbHVtbkZhbWlseVNwbGl0PiB0b1NwbGl0KExpc3Q8SG9zdD4gaG9zdHMsIE1hcDxUb2tlblJhbmdlLCBMb25nPiBzdWJTcGxpdHMpCi0gICAgewotICAgICAgICAvLyB0dXJuIHRoZSBzdWItcmFuZ2VzIGludG8gSW5wdXRTcGxpdHMKLSAgICAgICAgU3RyaW5nW10gZW5kcG9pbnRzID0gbmV3IFN0cmluZ1tob3N0cy5zaXplKCldOwotCi0gICAgICAgIC8vIGhhZG9vcCBuZWVkcyBob3N0bmFtZSwgbm90IGlwCi0gICAgICAgIGludCBlbmRwb2ludEluZGV4ID0gMDsKLSAgICAgICAgZm9yIChIb3N0IGVuZHBvaW50IDogaG9zdHMpCi0gICAgICAgICAgICBlbmRwb2ludHNbZW5kcG9pbnRJbmRleCsrXSA9IGVuZHBvaW50LmdldEFkZHJlc3MoKS5nZXRIb3N0TmFtZSgpOwotCi0gICAgICAgIGJvb2xlYW4gcGFydGl0aW9uZXJJc09wcCA9IHBhcnRpdGlvbmVyIGluc3RhbmNlb2YgT3JkZXJQcmVzZXJ2aW5nUGFydGl0aW9uZXIgfHwgcGFydGl0aW9uZXIgaW5zdGFuY2VvZiBCeXRlT3JkZXJlZFBhcnRpdGlvbmVyOwotCi0gICAgICAgIEFycmF5TGlzdDxDb2x1bW5GYW1pbHlTcGxpdD4gc3BsaXRzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFRva2VuUmFuZ2UsIExvbmc+IHN1YlNwbGl0RW50cnkgOiBzdWJTcGxpdHMuZW50cnlTZXQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgVG9rZW5SYW5nZSBzdWJyYW5nZSA9IHN1YlNwbGl0RW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBDb2x1bW5GYW1pbHlTcGxpdCBzcGxpdCA9Ci0gICAgICAgICAgICAgICAgbmV3IENvbHVtbkZhbWlseVNwbGl0KAotICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25lcklzT3BwID8KLSAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJhbmdlLmdldFN0YXJ0KCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMikgOiBzdWJyYW5nZS5nZXRTdGFydCgpLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbmVySXNPcHAgPwotICAgICAgICAgICAgICAgICAgICAgICAgc3VicmFuZ2UuZ2V0RW5kKCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMikgOiBzdWJyYW5nZS5nZXRFbmQoKS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICBzdWJTcGxpdEVudHJ5LmdldFZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50cyk7Ci0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWRkaW5nIHt9Iiwgc3BsaXQpOwotICAgICAgICAgICAgc3BsaXRzLmFkZChzcGxpdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNwbGl0czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvY3FsMy9DcWxPdXRwdXRGb3JtYXQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9jcWwzL0NxbE91dHB1dEZvcm1hdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzBhNmIxLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9jcWwzL0NxbE91dHB1dEZvcm1hdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcC5jcWwzOwotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcC4qOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuKjsKLQotLyoqCi0gKiBUaGUgPGNvZGU+Q3FsT3V0cHV0Rm9ybWF0PC9jb2RlPiBhY3RzIGFzIGEgSGFkb29wLXNwZWNpZmljCi0gKiBPdXRwdXRGb3JtYXQgdGhhdCBhbGxvd3MgcmVkdWNlIHRhc2tzIHRvIHN0b3JlIGtleXMgKGFuZCBjb3JyZXNwb25kaW5nCi0gKiBib3VuZCB2YXJpYWJsZSB2YWx1ZXMpIGFzIENRTCByb3dzIChhbmQgcmVzcGVjdGl2ZSBjb2x1bW5zKSBpbiBhIGdpdmVuCi0gKiB0YWJsZS4KLSAqCi0gKiA8cD4KLSAqIEFzIGlzIHRoZSBjYXNlIHdpdGggdGhlIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oYWRvb3AuQ29sdW1uRmFtaWx5SW5wdXRGb3JtYXR9LCAKLSAqIHlvdSBuZWVkIHRvIHNldCB0aGUgcHJlcGFyZWQgc3RhdGVtZW50IGluIHlvdXIKLSAqIEhhZG9vcCBqb2IgQ29uZmlndXJhdGlvbi4gVGhlIHtAbGluayBDcWxDb25maWdIZWxwZXJ9IGNsYXNzLCB0aHJvdWdoIGl0cwotICoge0BsaW5rIENxbENvbmZpZ0hlbHBlciNzZXRPdXRwdXRDcWx9IG1ldGhvZCwgaXMgcHJvdmlkZWQgdG8gbWFrZSB0aGlzCi0gKiBzaW1wbGUuCi0gKiB5b3UgbmVlZCB0byBzZXQgdGhlIEtleXNwYWNlLiBUaGUge0BsaW5rIENvbmZpZ0hlbHBlcn0gY2xhc3MsIHRocm91Z2ggaXRzCi0gKiB7QGxpbmsgQ29uZmlnSGVscGVyI3NldE91dHB1dENvbHVtbkZhbWlseX0gbWV0aG9kLCBpcyBwcm92aWRlZCB0byBtYWtlIHRoaXMKLSAqIHNpbXBsZS4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBGb3IgdGhlIHNha2Ugb2YgcGVyZm9ybWFuY2UsIHRoaXMgY2xhc3MgZW1wbG95cyBhIGxhenkgd3JpdGUtYmFjayBjYWNoaW5nCi0gKiBtZWNoYW5pc20sIHdoZXJlIGl0cyByZWNvcmQgd3JpdGVyIHByZXBhcmVkIHN0YXRlbWVudCBiaW5kZWQgdmFyaWFibGUgdmFsdWVzCi0gKiBjcmVhdGVkIGJhc2VkIG9uIHRoZSByZWR1Y2UncyBpbnB1dHMgKGluIGEgdGFzay1zcGVjaWZpYyBtYXApLCBhbmQgcGVyaW9kaWNhbGx5IAotICogbWFrZXMgdGhlIGNoYW5nZXMgb2ZmaWNpYWwgYnkgc2VuZGluZyBhIGV4ZWN1dGlvbiBvZiBwcmVwYXJlZCBzdGF0ZW1lbnQgcmVxdWVzdCAKLSAqIHRvIENhc3NhbmRyYS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIENxbE91dHB1dEZvcm1hdCBleHRlbmRzIE91dHB1dEZvcm1hdDxNYXA8U3RyaW5nLCBCeXRlQnVmZmVyPiwgTGlzdDxCeXRlQnVmZmVyPj4KLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuT3V0cHV0Rm9ybWF0PE1hcDxTdHJpbmcsIEJ5dGVCdWZmZXI+LCBMaXN0PEJ5dGVCdWZmZXI+PgotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBVENIX1RIUkVTSE9MRCA9ICJtYXByZWR1Y2Uub3V0cHV0LmNvbHVtbmZhbWlseW91dHB1dGZvcm1hdC5iYXRjaC50aHJlc2hvbGQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVVFX1NJWkUgPSAibWFwcmVkdWNlLm91dHB1dC5jb2x1bW5mYW1pbHlvdXRwdXRmb3JtYXQucXVldWUuc2l6ZSI7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBmb3IgdmFsaWRpdHkgb2YgdGhlIG91dHB1dC1zcGVjaWZpY2F0aW9uIGZvciB0aGUgam9iLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBqb2IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGVja091dHB1dFNwZWNzKEpvYkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIGNoZWNrT3V0cHV0U3BlY3MoSGFkb29wQ29tcGF0LmdldENvbmZpZ3VyYXRpb24oY29udGV4dCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrT3V0cHV0U3BlY3MoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgaWYgKENvbmZpZ0hlbHBlci5nZXRPdXRwdXRLZXlzcGFjZShjb25mKSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJZb3UgbXVzdCBzZXQgdGhlIGtleXNwYWNlIHdpdGggc2V0T3V0cHV0S2V5c3BhY2UoKSIpOwotICAgICAgICBpZiAoQ29uZmlnSGVscGVyLmdldE91dHB1dFBhcnRpdGlvbmVyKGNvbmYpID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIllvdSBtdXN0IHNldCB0aGUgb3V0cHV0IHBhcnRpdGlvbmVyIHRvIHRoZSBvbmUgdXNlZCBieSB5b3VyIENhc3NhbmRyYSBjbHVzdGVyIik7Ci0gICAgICAgIGlmIChDb25maWdIZWxwZXIuZ2V0T3V0cHV0SW5pdGlhbEFkZHJlc3MoY29uZikgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiWW91IG11c3Qgc2V0IHRoZSBpbml0aWFsIG91dHB1dCBhZGRyZXNzIHRvIGEgQ2Fzc2FuZHJhIG5vZGUiKTsKLSAgICB9Ci0KLSAgICAvKiogRmlsbHMgdGhlIGRlcHJlY2F0ZWQgT3V0cHV0Rm9ybWF0IGludGVyZmFjZSBmb3Igc3RyZWFtaW5nLiAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHZvaWQgY2hlY2tPdXRwdXRTcGVjcyhvcmcuYXBhY2hlLmhhZG9vcC5mcy5GaWxlU3lzdGVtIGZpbGVzeXN0ZW0sIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5Kb2JDb25mIGpvYikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjaGVja091dHB1dFNwZWNzKGpvYik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIE91dHB1dENvbW1pdHRlciBmb3IgdGhpcyBmb3JtYXQgZG9lcyBub3Qgd3JpdGUgYW55IGRhdGEgdG8gdGhlIERGUy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogICAgICAgICAgICB0aGUgdGFzayBjb250ZXh0Ci0gICAgICogQHJldHVybiBhbiBvdXRwdXQgY29tbWl0dGVyCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgT3V0cHV0Q29tbWl0dGVyIGdldE91dHB1dENvbW1pdHRlcihUYXNrQXR0ZW1wdENvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBOdWxsT3V0cHV0Q29tbWl0dGVyKCk7Ci0gICAgfQotCi0gICAgLyoqIEZpbGxzIHRoZSBkZXByZWNhdGVkIE91dHB1dEZvcm1hdCBpbnRlcmZhY2UgZm9yIHN0cmVhbWluZy4gKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBDcWxSZWNvcmRXcml0ZXIgZ2V0UmVjb3JkV3JpdGVyKG9yZy5hcGFjaGUuaGFkb29wLmZzLkZpbGVTeXN0ZW0gZmlsZXN5c3RlbSwgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLkpvYkNvbmYgam9iLCBTdHJpbmcgbmFtZSwgb3JnLmFwYWNoZS5oYWRvb3AudXRpbC5Qcm9ncmVzc2FibGUgcHJvZ3Jlc3MpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDcWxSZWNvcmRXcml0ZXIoam9iLCBwcm9ncmVzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB7QGxpbmsgUmVjb3JkV3JpdGVyfSBmb3IgdGhlIGdpdmVuIHRhc2suCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqICAgICAgICAgICAgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHRhc2suCi0gICAgICogQHJldHVybiBhIHtAbGluayBSZWNvcmRXcml0ZXJ9IHRvIHdyaXRlIHRoZSBvdXRwdXQgZm9yIHRoZSBqb2IuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBDcWxSZWNvcmRXcml0ZXIgZ2V0UmVjb3JkV3JpdGVyKGZpbmFsIFRhc2tBdHRlbXB0Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IENxbFJlY29yZFdyaXRlcihjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbiB7QGxpbmsgT3V0cHV0Q29tbWl0dGVyfSB0aGF0IGRvZXMgbm90aGluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOdWxsT3V0cHV0Q29tbWl0dGVyIGV4dGVuZHMgT3V0cHV0Q29tbWl0dGVyCi0gICAgewotICAgICAgICBwdWJsaWMgdm9pZCBhYm9ydFRhc2soVGFza0F0dGVtcHRDb250ZXh0IHRhc2tDb250ZXh0KSB7IH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhbnVwSm9iKEpvYkNvbnRleHQgam9iQ29udGV4dCkgeyB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY29tbWl0VGFzayhUYXNrQXR0ZW1wdENvbnRleHQgdGFza0NvbnRleHQpIHsgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG5lZWRzVGFza0NvbW1pdChUYXNrQXR0ZW1wdENvbnRleHQgdGFza0NvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldHVwSm9iKEpvYkNvbnRleHQgam9iQ29udGV4dCkgeyB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0dXBUYXNrKFRhc2tBdHRlbXB0Q29udGV4dCB0YXNrQ29udGV4dCkgeyB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGFkb29wL2NxbDMvQ3FsUmVjb3JkUmVhZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvY3FsMy9DcWxSZWNvcmRSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlhYWQxOS4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvY3FsMy9DcWxSZWNvcmRSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oYWRvb3AuY3FsMzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Kb2luZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TcGxpdHRlcjsKLQotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5UeXBlQ29kZWM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQWJzdHJhY3RJdGVyYXRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQ2x1c3RlcjsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQ29sdW1uRGVmaW5pdGlvbnM7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkNvbHVtbk1ldGFkYXRhOwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5Mb2NhbERhdGU7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLk1ldGFkYXRhOwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5SZXN1bHRTZXQ7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlJvdzsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuU2Vzc2lvbjsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuVGFibGVNZXRhZGF0YTsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuVG9rZW47Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlR1cGxlVmFsdWU7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlVEVFZhbHVlOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnJlZmxlY3QuVHlwZVRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGFkb29wLkNvbHVtbkZhbWlseVNwbGl0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcC5Db25maWdIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGFkb29wLkhhZG9vcENvbXBhdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuSW5wdXRTcGxpdDsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuUmVjb3JkUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5UYXNrQXR0ZW1wdENvbnRleHQ7Ci0KLS8qKgotICogPHA+Ci0gKiBDcWxSZWNvcmRSZWFkZXIgcmVhZHMgdGhlIHJvd3MgcmV0dXJuIGZyb20gdGhlIENRTCBxdWVyeQotICogSXQgdXNlcyBDUUwgYXV0by1wYWdpbmcuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFJldHVybiBhIExvbmcgYXMgYSBsb2NhbCBDUUwgcm93IGtleSBzdGFydHMgZnJvbSAwOwotICogPC9wPgotICoge0Bjb2RlCi0gKiBSb3cgYXMgQyogamF2YSBkcml2ZXIgQ1FMIHJlc3VsdCBzZXQgcm93Ci0gKiAxKSBzZWxlY3QgY2xhdXNlIG11c3QgaW5jbHVkZSBwYXJ0aXRpb24ga2V5IGNvbHVtbnMgKHRvIGNhbGN1bGF0ZSB0aGUgcHJvZ3Jlc3MgYmFzZWQgb24gdGhlIGFjdHVhbCBDRiByb3cgcHJvY2Vzc2VkKQotICogMikgd2hlcmUgY2xhdXNlIG11c3QgaW5jbHVkZSB0b2tlbihwYXJ0aXRpb25fa2V5MSwgLi4uICAsIHBhcnRpdGlvbl9rZXluKSA+ID8gYW5kIAotICogICAgICAgdG9rZW4ocGFydGl0aW9uX2tleTEsIC4uLiAsIHBhcnRpdGlvbl9rZXluKSA8PSA/ICAoaW4gdGhlIHJpZ2h0IG9yZGVyKSAKLSAqIH0KLSAqLwotcHVibGljIGNsYXNzIENxbFJlY29yZFJlYWRlciBleHRlbmRzIFJlY29yZFJlYWRlcjxMb25nLCBSb3c+Ci0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLlJlY29yZFJlYWRlcjxMb25nLCBSb3c+LCBBdXRvQ2xvc2VhYmxlCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENxbFJlY29yZFJlYWRlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIENvbHVtbkZhbWlseVNwbGl0IHNwbGl0OwotICAgIHByaXZhdGUgUm93SXRlcmF0b3Igcm93SXRlcmF0b3I7Ci0KLSAgICBwcml2YXRlIFBhaXI8TG9uZywgUm93PiBjdXJyZW50Um93OwotICAgIHByaXZhdGUgaW50IHRvdGFsUm93Q291bnQ7IC8vIHRvdGFsIG51bWJlciBvZiByb3dzIHRvIGZldGNoCi0gICAgcHJpdmF0ZSBTdHJpbmcga2V5c3BhY2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY2ZOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGNxbFF1ZXJ5OwotICAgIHByaXZhdGUgQ2x1c3RlciBjbHVzdGVyOwotICAgIHByaXZhdGUgU2Vzc2lvbiBzZXNzaW9uOwotICAgIHByaXZhdGUgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyOwotICAgIHByaXZhdGUgU3RyaW5nIGlucHV0Q29sdW1uczsKLSAgICBwcml2YXRlIFN0cmluZyB1c2VyRGVmaW5lZFdoZXJlQ2xhdXNlczsKLQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHBhcnRpdGlvbktleXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgIC8vIHBhcnRpdGlvbiBrZXlzIC0tIGtleSBhbGlhc2VzCi0gICAgcHJpdmF0ZSBMaW5rZWRIYXNoTWFwPFN0cmluZywgQm9vbGVhbj4gcGFydGl0aW9uQm91bmRDb2x1bW5zID0gTWFwcy5uZXdMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJvdGVjdGVkIGludCBuYXRpdmVQcm90b2NvbFZlcnNpb24gPSAxOwotCi0gICAgcHVibGljIENxbFJlY29yZFJlYWRlcigpCi0gICAgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoSW5wdXRTcGxpdCBzcGxpdCwgVGFza0F0dGVtcHRDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhpcy5zcGxpdCA9IChDb2x1bW5GYW1pbHlTcGxpdCkgc3BsaXQ7Ci0gICAgICAgIENvbmZpZ3VyYXRpb24gY29uZiA9IEhhZG9vcENvbXBhdC5nZXRDb25maWd1cmF0aW9uKGNvbnRleHQpOwotICAgICAgICB0b3RhbFJvd0NvdW50ID0gKHRoaXMuc3BsaXQuZ2V0TGVuZ3RoKCkgPCBMb25nLk1BWF9WQUxVRSkKLSAgICAgICAgICAgICAgICAgICAgICA/IChpbnQpIHRoaXMuc3BsaXQuZ2V0TGVuZ3RoKCkKLSAgICAgICAgICAgICAgICAgICAgICA6IENvbmZpZ0hlbHBlci5nZXRJbnB1dFNwbGl0U2l6ZShjb25mKTsKLSAgICAgICAgY2ZOYW1lID0gQ29uZmlnSGVscGVyLmdldElucHV0Q29sdW1uRmFtaWx5KGNvbmYpOwotICAgICAgICBrZXlzcGFjZSA9IENvbmZpZ0hlbHBlci5nZXRJbnB1dEtleXNwYWNlKGNvbmYpOwotICAgICAgICBwYXJ0aXRpb25lciA9IENvbmZpZ0hlbHBlci5nZXRJbnB1dFBhcnRpdGlvbmVyKGNvbmYpOwotICAgICAgICBpbnB1dENvbHVtbnMgPSBDcWxDb25maWdIZWxwZXIuZ2V0SW5wdXRjb2x1bW5zKGNvbmYpOwotICAgICAgICB1c2VyRGVmaW5lZFdoZXJlQ2xhdXNlcyA9IENxbENvbmZpZ0hlbHBlci5nZXRJbnB1dFdoZXJlQ2xhdXNlcyhjb25mKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNsdXN0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIENsdXN0ZXIgaW5zdGFuY2UKLSAgICAgICAgICAgIFN0cmluZ1tdIGxvY2F0aW9ucyA9IHNwbGl0LmdldExvY2F0aW9ucygpOwotICAgICAgICAgICAgY2x1c3RlciA9IENxbENvbmZpZ0hlbHBlci5nZXRJbnB1dENsdXN0ZXIobG9jYXRpb25zLCBjb25mKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNsdXN0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHNlc3Npb24gPSBjbHVzdGVyLmNvbm5lY3QocXVvdGUoa2V5c3BhY2UpKTsKLQotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKQotICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW4ndCBjcmVhdGUgY29ubmVjdGlvbiBzZXNzaW9uIik7Ci0KLSAgICAgICAgLy9nZXQgbmVnb3RpYXRlZCBzZXJpYWxpemF0aW9uIHByb3RvY29sCi0gICAgICAgIG5hdGl2ZVByb3RvY29sVmVyc2lvbiA9IGNsdXN0ZXIuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3RvY29sT3B0aW9ucygpLmdldFByb3RvY29sVmVyc2lvbigpLnRvSW50KCk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHVzZXIgcHJvdmlkZXMgYSBDUUwgcXVlcnkgdGhlbiB3ZSB3aWxsIHVzZSBpdCB3aXRob3V0IHZhbGlkYXRpb24KLSAgICAgICAgLy8gb3RoZXJ3aXNlIHdlIHdpbGwgZmFsbCBiYWNrIHRvIGJ1aWxkaW5nIGEgcXVlcnkgdXNpbmcgdGhlOgotICAgICAgICAvLyAgIGlucHV0Q29sdW1ucwotICAgICAgICAvLyAgIHdoZXJlQ2xhdXNlcwotICAgICAgICBjcWxRdWVyeSA9IENxbENvbmZpZ0hlbHBlci5nZXRJbnB1dENxbChjb25mKTsKLSAgICAgICAgLy8gdmFsaWRhdGUgdGhhdCB0aGUgdXNlciBoYXNuJ3QgdHJpZWQgdG8gZ2l2ZSB1cyBhIGN1c3RvbSBxdWVyeSBhbG9uZyB3aXRoIGlucHV0IGNvbHVtbnMKLSAgICAgICAgLy8gYW5kIHdoZXJlIGNsYXVzZXMKLSAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkoY3FsUXVlcnkpICYmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KGlucHV0Q29sdW1ucykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdVdGlscy5pc05vdEVtcHR5KHVzZXJEZWZpbmVkV2hlcmVDbGF1c2VzKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiQ2Fubm90IGRlZmluZSBhIGN1c3RvbSBxdWVyeSB3aXRoIGlucHV0IGNvbHVtbnMgYW5kIC8gb3Igd2hlcmUgY2xhdXNlcyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoY3FsUXVlcnkpKQotICAgICAgICAgICAgY3FsUXVlcnkgPSBidWlsZFF1ZXJ5KCk7Ci0gICAgICAgIGxvZ2dlci50cmFjZSgiY3FsUXVlcnkge30iLCBjcWxRdWVyeSk7Ci0KLSAgICAgICAgcm93SXRlcmF0b3IgPSBuZXcgUm93SXRlcmF0b3IoKTsKLSAgICAgICAgbG9nZ2VyLnRyYWNlKCJjcmVhdGVkIHt9Iiwgcm93SXRlcmF0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKLSAgICB7Ci0gICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpCi0gICAgICAgICAgICBzZXNzaW9uLmNsb3NlKCk7Ci0gICAgICAgIGlmIChjbHVzdGVyICE9IG51bGwpCi0gICAgICAgICAgICBjbHVzdGVyLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExvbmcgZ2V0Q3VycmVudEtleSgpCi0gICAgewotICAgICAgICByZXR1cm4gY3VycmVudFJvdy5sZWZ0OwotICAgIH0KLQotICAgIHB1YmxpYyBSb3cgZ2V0Q3VycmVudFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50Um93LnJpZ2h0OwotICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCBnZXRQcm9ncmVzcygpCi0gICAgewotICAgICAgICBpZiAoIXJvd0l0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgICAgIHJldHVybiAxLjBGOwotCi0gICAgICAgIC8vIHRoZSBwcm9ncmVzcyBpcyBsaWtlbHkgdG8gYmUgcmVwb3J0ZWQgc2xpZ2h0bHkgb2ZmIHRoZSBhY3R1YWwgYnV0IGNsb3NlIGVub3VnaAotICAgICAgICBmbG9hdCBwcm9ncmVzcyA9ICgoZmxvYXQpIHJvd0l0ZXJhdG9yLnRvdGFsUmVhZCAvIHRvdGFsUm93Q291bnQpOwotICAgICAgICByZXR1cm4gcHJvZ3Jlc3MgPiAxLjBGID8gMS4wRiA6IHByb2dyZXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG5leHRLZXlWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKCFyb3dJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiRmluaXNoZWQgc2Nhbm5pbmcge30gcm93cyAoZXN0aW1hdGUgd2FzOiB7fSkiLCByb3dJdGVyYXRvci50b3RhbFJlYWQsIHRvdGFsUm93Q291bnQpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGN1cnJlbnRSb3cgPSByb3dJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyB0aHJvdyBpdCBhcyBJT0V4Y2VwdGlvbiwgc28gY2xpZW50IGNhbiBjYXRjaCBpdCBhbmQgaGFuZGxlIGl0IGF0IGNsaWVudCBzaWRlCi0gICAgICAgICAgICBJT0V4Y2VwdGlvbiBpb2UgPSBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgaW9lLmluaXRDYXVzZShpb2UuZ2V0Q2F1c2UoKSk7Ci0gICAgICAgICAgICB0aHJvdyBpb2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gQmVjYXVzZSB0aGUgb2xkIEhhZG9vcCBBUEkgd2FudHMgdXMgdG8gd3JpdGUgdG8gdGhlIGtleSBhbmQgdmFsdWUKLSAgICAvLyBhbmQgdGhlIG5ldyBhc2tzIGZvciB0aGVtLCB3ZSBuZWVkIHRvIGNvcHkgdGhlIG91dHB1dCBvZiB0aGUgbmV3IEFQSQotICAgIC8vIHRvIHRoZSBvbGQuIFRodXMsIGV4cGVjdCBhIHNtYWxsIHBlcmZvcm1hbmNlIGhpdC4KLSAgICAvLyBBbmQgb2J2aW91c2x5IHRoaXMgd291bGRuJ3Qgd29yayBmb3Igd2lkZSByb3dzLiBCdXQgc2luY2UgQ29sdW1uRmFtaWx5SW5wdXRGb3JtYXQKLSAgICAvLyBhbmQgQ29sdW1uRmFtaWx5UmVjb3JkUmVhZGVyIGRvbid0IHN1cHBvcnQgdGhlbSwgaXQgc2hvdWxkIGJlIGZpbmUgZm9yIG5vdy4KLSAgICBwdWJsaWMgYm9vbGVhbiBuZXh0KExvbmcga2V5LCBSb3cgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKG5leHRLZXlWYWx1ZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKFdyYXBwZWRSb3cpdmFsdWUpLnNldFJvdyhnZXRDdXJyZW50VmFsdWUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0UG9zKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gcm93SXRlcmF0b3IudG90YWxSZWFkOwotICAgIH0KLQotICAgIHB1YmxpYyBMb25nIGNyZWF0ZUtleSgpCi0gICAgewotICAgICAgICByZXR1cm4gTG9uZy52YWx1ZU9mKDBMKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUm93IGNyZWF0ZVZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgV3JhcHBlZFJvdygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBuYXRpdmUgdmVyc2lvbiBwcm90b2NvbCBvZiB0aGUgY2x1c3RlciBjb25uZWN0aW9uCi0gICAgICogQHJldHVybiBzZXJpYWxpemF0aW9uIHByb3RvY29sIHZlcnNpb24uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROYXRpdmVQcm90b2NvbFZlcnNpb24oKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYXRpdmVQcm90b2NvbFZlcnNpb247Ci0gICAgfQotCi0gICAgLyoqIENRTCByb3cgaXRlcmF0b3IgCi0gICAgICogIElucHV0IGNxbCBxdWVyeSAgCi0gICAgICogIDEpIHNlbGVjdCBjbGF1c2UgbXVzdCBpbmNsdWRlIGtleSBjb2x1bW5zIChpZiB3ZSB1c2UgcGFydGl0aW9uIGtleSBiYXNlZCByb3cgY291bnQpCi0gICAgICogIDIpIHdoZXJlIGNsYXVzZSBtdXN0IGluY2x1ZGUgdG9rZW4ocGFydGl0aW9uX2tleTEgLi4uIHBhcnRpdGlvbl9rZXluKSA+ID8gYW5kIAotICAgICAqICAgICB0b2tlbihwYXJ0aXRpb25fa2V5MSAuLi4gcGFydGl0aW9uX2tleW4pIDw9ID8gCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBSb3dJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0SXRlcmF0b3I8UGFpcjxMb25nLCBSb3c+PgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBsb25nIGtleUlkID0gMEw7Ci0gICAgICAgIHByb3RlY3RlZCBpbnQgdG90YWxSZWFkID0gMDsgLy8gdG90YWwgbnVtYmVyIG9mIGNmIHJvd3MgcmVhZAotICAgICAgICBwcm90ZWN0ZWQgSXRlcmF0b3I8Um93PiByb3dzOwotICAgICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEJ5dGVCdWZmZXI+IHByZXZpb3VzUm93S2V5ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCeXRlQnVmZmVyPigpOyAvLyBwcmV2aW91cyBDRiByb3cga2V5Ci0KLSAgICAgICAgcHVibGljIFJvd0l0ZXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgQWJzdHJhY3RUeXBlIHR5cGUgPSBwYXJ0aXRpb25lci5nZXRUb2tlblZhbGlkYXRvcigpOwotICAgICAgICAgICAgUmVzdWx0U2V0IHJzID0gc2Vzc2lvbi5leGVjdXRlKGNxbFF1ZXJ5LCB0eXBlLmNvbXBvc2UodHlwZS5mcm9tU3RyaW5nKHNwbGl0LmdldFN0YXJ0VG9rZW4oKSkpLCB0eXBlLmNvbXBvc2UodHlwZS5mcm9tU3RyaW5nKHNwbGl0LmdldEVuZFRva2VuKCkpKSApOwotICAgICAgICAgICAgZm9yIChDb2x1bW5NZXRhZGF0YSBtZXRhIDogY2x1c3Rlci5nZXRNZXRhZGF0YSgpLmdldEtleXNwYWNlKHF1b3RlKGtleXNwYWNlKSkuZ2V0VGFibGUocXVvdGUoY2ZOYW1lKSkuZ2V0UGFydGl0aW9uS2V5KCkpCi0gICAgICAgICAgICAgICAgcGFydGl0aW9uQm91bmRDb2x1bW5zLnB1dChtZXRhLmdldE5hbWUoKSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgIHJvd3MgPSBycy5pdGVyYXRvcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFBhaXI8TG9uZywgUm93PiBjb21wdXRlTmV4dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChyb3dzID09IG51bGwgfHwgIXJvd3MuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBlbmRPZkRhdGEoKTsKLQotICAgICAgICAgICAgUm93IHJvdyA9IHJvd3MubmV4dCgpOwotICAgICAgICAgICAgTWFwPFN0cmluZywgQnl0ZUJ1ZmZlcj4ga2V5Q29sdW1ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQnl0ZUJ1ZmZlcj4ocGFydGl0aW9uQm91bmRDb2x1bW5zLnNpemUoKSk7IAotICAgICAgICAgICAgZm9yIChTdHJpbmcgY29sdW1uIDogcGFydGl0aW9uQm91bmRDb2x1bW5zLmtleVNldCgpKQotICAgICAgICAgICAgICAgIGtleUNvbHVtbnMucHV0KGNvbHVtbiwgcm93LmdldEJ5dGVzVW5zYWZlKGNvbHVtbikpOwotCi0gICAgICAgICAgICAvLyBpbmNyZWFzZSB0b3RhbCBDRiByb3cgcmVhZAotICAgICAgICAgICAgaWYgKHByZXZpb3VzUm93S2V5LmlzRW1wdHkoKSAmJiAha2V5Q29sdW1ucy5pc0VtcHR5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJldmlvdXNSb3dLZXkgPSBrZXlDb2x1bW5zOwotICAgICAgICAgICAgICAgIHRvdGFsUmVhZCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGNvbHVtbiA6IHBhcnRpdGlvbkJvdW5kQ29sdW1ucy5rZXlTZXQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IGNvcnJlY3QgLSBidXQgd2UgZG9uJ3Qgc2VlbSB0byBoYXZlIGVhc3kgYWNjZXNzIHRvIGJldHRlciB0eXBlIGluZm9ybWF0aW9uIGhlcmUKLSAgICAgICAgICAgICAgICAgICAgaWYgKEJ5dGVCdWZmZXJVdGlsLmNvbXBhcmVVbnNpZ25lZChrZXlDb2x1bW5zLmdldChjb2x1bW4pLCBwcmV2aW91c1Jvd0tleS5nZXQoY29sdW1uKSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNSb3dLZXkgPSBrZXlDb2x1bW5zOwotICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxSZWFkKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGtleUlkICsrOwotICAgICAgICAgICAgcmV0dXJuIFBhaXIuY3JlYXRlKGtleUlkLCByb3cpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV3JhcHBlZFJvdyBpbXBsZW1lbnRzIFJvdwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBSb3cgcm93OwotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFJvdyhSb3cgcm93KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnJvdyA9IHJvdzsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQ29sdW1uRGVmaW5pdGlvbnMgZ2V0Q29sdW1uRGVmaW5pdGlvbnMoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldENvbHVtbkRlZmluaXRpb25zKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmlzTnVsbChpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc051bGwoU3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuaXNOdWxsKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KGludCBpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldE9iamVjdChpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgPFQ+IFQgZ2V0KGludCBpLCBDbGFzczxUPiBhQ2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0KGksIGFDbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIDxUPiBUIGdldChpbnQgaSwgVHlwZVRva2VuPFQ+IHR5cGVUb2tlbikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXQoaSwgdHlwZVRva2VuKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgPFQ+IFQgZ2V0KGludCBpLCBUeXBlQ29kZWM8VD4gdHlwZUNvZGVjKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldChpLCB0eXBlQ29kZWMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KFN0cmluZyBzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldE9iamVjdChzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgPFQ+IFQgZ2V0KFN0cmluZyBzLCBDbGFzczxUPiBhQ2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0KHMsIGFDbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIDxUPiBUIGdldChTdHJpbmcgcywgVHlwZVRva2VuPFQ+IHR5cGVUb2tlbikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXQocywgdHlwZVRva2VuKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgPFQ+IFQgZ2V0KFN0cmluZyBzLCBUeXBlQ29kZWM8VD4gdHlwZUNvZGVjKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldChzLCB0eXBlQ29kZWMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2woaW50IGkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0Qm9vbChpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sKFN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldEJvb2wobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHNob3J0IGdldFNob3J0KGludCBpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldFNob3J0KGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydChTdHJpbmcgcykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRTaG9ydChzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYnl0ZSBnZXRCeXRlKGludCBpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldEJ5dGUoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJ5dGUgZ2V0Qnl0ZShTdHJpbmcgcykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRCeXRlKHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0SW50KGludCBpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldEludChpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldEludChTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRJbnQobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGxvbmcgZ2V0TG9uZyhpbnQgaSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRMb25nKGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBsb25nIGdldExvbmcoU3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0TG9uZyhuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRGF0ZSBnZXRUaW1lc3RhbXAoaW50IGkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0VGltZXN0YW1wKGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBEYXRlIGdldFRpbWVzdGFtcChTdHJpbmcgcykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRUaW1lc3RhbXAocyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIExvY2FsRGF0ZSBnZXREYXRlKGludCBpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldERhdGUoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIExvY2FsRGF0ZSBnZXREYXRlKFN0cmluZyBzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldERhdGUocyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGxvbmcgZ2V0VGltZShpbnQgaSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRUaW1lKGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBsb25nIGdldFRpbWUoU3RyaW5nIHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0VGltZShzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoaW50IGkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0RmxvYXQoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGZsb2F0IGdldEZsb2F0KFN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldEZsb2F0KG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKGludCBpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldERvdWJsZShpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZShTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXREb3VibGUobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0Qnl0ZXNVbnNhZmUoaW50IGkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0Qnl0ZXNVbnNhZmUoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0Qnl0ZXNVbnNhZmUoU3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0Qnl0ZXNVbnNhZmUobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0Qnl0ZXMoaW50IGkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0Qnl0ZXMoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0Qnl0ZXMoU3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0Qnl0ZXMobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IGkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0U3RyaW5nKGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldFN0cmluZyhuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRWYXJpbnQoaW50IGkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0VmFyaW50KGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldFZhcmludChTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRWYXJpbnQobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0RGVjaW1hbChpbnQgaSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXREZWNpbWFsKGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldERlY2ltYWwoU3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0RGVjaW1hbChuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVVVJRCBnZXRVVUlEKGludCBpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldFVVSUQoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFVVSUQgZ2V0VVVJRChTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRVVUlEKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBJbmV0QWRkcmVzcyBnZXRJbmV0KGludCBpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldEluZXQoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEluZXRBZGRyZXNzIGdldEluZXQoU3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0SW5ldChuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgPFQ+IExpc3Q8VD4gZ2V0TGlzdChpbnQgaSwgQ2xhc3M8VD4gZWxlbWVudHNDbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRMaXN0KGksIGVsZW1lbnRzQ2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyA8VD4gTGlzdDxUPiBnZXRMaXN0KGludCBpLCBUeXBlVG9rZW48VD4gdHlwZVRva2VuKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldExpc3QoaSwgdHlwZVRva2VuKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgPFQ+IExpc3Q8VD4gZ2V0TGlzdChTdHJpbmcgbmFtZSwgQ2xhc3M8VD4gZWxlbWVudHNDbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRMaXN0KG5hbWUsIGVsZW1lbnRzQ2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyA8VD4gTGlzdDxUPiBnZXRMaXN0KFN0cmluZyBzLCBUeXBlVG9rZW48VD4gdHlwZVRva2VuKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldExpc3QocywgdHlwZVRva2VuKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgPFQ+IFNldDxUPiBnZXRTZXQoaW50IGksIENsYXNzPFQ+IGVsZW1lbnRzQ2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0U2V0KGksIGVsZW1lbnRzQ2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyA8VD4gU2V0PFQ+IGdldFNldChpbnQgaSwgVHlwZVRva2VuPFQ+IHR5cGVUb2tlbikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRTZXQoaSwgdHlwZVRva2VuKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgPFQ+IFNldDxUPiBnZXRTZXQoU3RyaW5nIG5hbWUsIENsYXNzPFQ+IGVsZW1lbnRzQ2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0U2V0KG5hbWUsIGVsZW1lbnRzQ2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyA8VD4gU2V0PFQ+IGdldFNldChTdHJpbmcgcywgVHlwZVRva2VuPFQ+IHR5cGVUb2tlbikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRTZXQocywgdHlwZVRva2VuKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgPEssIFY+IE1hcDxLLCBWPiBnZXRNYXAoaW50IGksIENsYXNzPEs+IGtleXNDbGFzcywgQ2xhc3M8Vj4gdmFsdWVzQ2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0TWFwKGksIGtleXNDbGFzcywgdmFsdWVzQ2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyA8SywgVj4gTWFwPEssIFY+IGdldE1hcChpbnQgaSwgVHlwZVRva2VuPEs+IHR5cGVUb2tlbiwgVHlwZVRva2VuPFY+IHR5cGVUb2tlbjEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0TWFwKGksIHR5cGVUb2tlbiwgdHlwZVRva2VuMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIDxLLCBWPiBNYXA8SywgVj4gZ2V0TWFwKFN0cmluZyBuYW1lLCBDbGFzczxLPiBrZXlzQ2xhc3MsIENsYXNzPFY+IHZhbHVlc0NsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldE1hcChuYW1lLCBrZXlzQ2xhc3MsIHZhbHVlc0NsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgPEssIFY+IE1hcDxLLCBWPiBnZXRNYXAoU3RyaW5nIHMsIFR5cGVUb2tlbjxLPiB0eXBlVG9rZW4sIFR5cGVUb2tlbjxWPiB0eXBlVG9rZW4xKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldE1hcChzLCB0eXBlVG9rZW4sIHR5cGVUb2tlbjEpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBVRFRWYWx1ZSBnZXRVRFRWYWx1ZShpbnQgaSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRVRFRWYWx1ZShpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVURUVmFsdWUgZ2V0VURUVmFsdWUoU3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0VURUVmFsdWUobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFR1cGxlVmFsdWUgZ2V0VHVwbGVWYWx1ZShpbnQgaSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRUdXBsZVZhbHVlKGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBUdXBsZVZhbHVlIGdldFR1cGxlVmFsdWUoU3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0VHVwbGVWYWx1ZShuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVG9rZW4gZ2V0VG9rZW4oaW50IGkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0VG9rZW4oaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFRva2VuIGdldFRva2VuKFN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldFRva2VuKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBUb2tlbiBnZXRQYXJ0aXRpb25LZXlUb2tlbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0UGFydGl0aW9uS2V5VG9rZW4oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkIGEgcXVlcnkgZm9yIHRoZSByZWFkZXIgb2YgdGhlIGZvcm06Ci0gICAgICoKLSAgICAgKiBTRUxFQ1QgKiBGUk9NIGtzPmNmIHRva2VuKHBrMSwuLi5wa24pPj8gQU5EIHRva2VuKHBrMSwuLi5wa24pPD0/IFtBTkQgdXNlciB3aGVyZSBjbGF1c2VzXSBbQUxMT1cgRklMVEVSSU5HXQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGJ1aWxkUXVlcnkoKQotICAgIHsKLSAgICAgICAgZmV0Y2hLZXlzKCk7Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGNvbHVtbnMgPSBnZXRTZWxlY3RDb2x1bW5zKCk7Ci0gICAgICAgIFN0cmluZyBzZWxlY3RDb2x1bW5MaXN0ID0gY29sdW1ucy5zaXplKCkgPT0gMCA/ICIqIiA6IG1ha2VDb2x1bW5MaXN0KGNvbHVtbnMpOwotICAgICAgICBTdHJpbmcgcGFydGl0aW9uS2V5TGlzdCA9IG1ha2VDb2x1bW5MaXN0KHBhcnRpdGlvbktleXMpOwotCi0gICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgJXMgRlJPTSAlcy4lcyBXSEVSRSB0b2tlbiglcyk+PyBBTkQgdG9rZW4oJXMpPD0/IiArIGdldEFkZGl0aW9uYWxXaGVyZUNsYXVzZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0Q29sdW1uTGlzdCwgcXVvdGUoa2V5c3BhY2UpLCBxdW90ZShjZk5hbWUpLCBwYXJ0aXRpb25LZXlMaXN0LCBwYXJ0aXRpb25LZXlMaXN0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRBZGRpdGlvbmFsV2hlcmVDbGF1c2VzKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyB3aGVyZUNsYXVzZSA9ICIiOwotICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3RFbXB0eSh1c2VyRGVmaW5lZFdoZXJlQ2xhdXNlcykpCi0gICAgICAgICAgICB3aGVyZUNsYXVzZSArPSAiIEFORCAiICsgdXNlckRlZmluZWRXaGVyZUNsYXVzZXM7Ci0gICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KHVzZXJEZWZpbmVkV2hlcmVDbGF1c2VzKSkKLSAgICAgICAgICAgIHdoZXJlQ2xhdXNlICs9ICIgQUxMT1cgRklMVEVSSU5HIjsKLSAgICAgICAgcmV0dXJuIHdoZXJlQ2xhdXNlOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGdldFNlbGVjdENvbHVtbnMoKQotICAgIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHNlbGVjdENvbHVtbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3RFbXB0eShpbnB1dENvbHVtbnMpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBXZSBtdXN0IHNlbGVjdCBhbGwgdGhlIHBhcnRpdGlvbiBrZXlzIHBsdXMgYW55IG90aGVyIGNvbHVtbnMgdGhlIHVzZXIgd2FudHMKLSAgICAgICAgICAgIHNlbGVjdENvbHVtbnMuYWRkQWxsKHBhcnRpdGlvbktleXMpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgY29sdW1uIDogU3BsaXR0ZXIub24oJywnKS5zcGxpdChpbnB1dENvbHVtbnMpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghcGFydGl0aW9uS2V5cy5jb250YWlucyhjb2x1bW4pKQotICAgICAgICAgICAgICAgICAgICBzZWxlY3RDb2x1bW5zLmFkZChjb2x1bW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZWxlY3RDb2x1bW5zOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIG1ha2VDb2x1bW5MaXN0KENvbGxlY3Rpb248U3RyaW5nPiBjb2x1bW5zKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEpvaW5lci5vbignLCcpLmpvaW4oSXRlcmFibGVzLnRyYW5zZm9ybShjb2x1bW5zLCBuZXcgRnVuY3Rpb248U3RyaW5nLCBTdHJpbmc+KCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIFN0cmluZyBhcHBseShTdHJpbmcgY29sdW1uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBxdW90ZShjb2x1bW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9KSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZldGNoS2V5cygpCi0gICAgewotICAgICAgICAvLyBnZXQgQ0YgbWV0YSBkYXRhCi0gICAgICAgIFRhYmxlTWV0YWRhdGEgdGFibGVNZXRhZGF0YSA9IHNlc3Npb24uZ2V0Q2x1c3RlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWV0YWRhdGEoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEtleXNwYWNlKE1ldGFkYXRhLnF1b3RlKGtleXNwYWNlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUYWJsZShNZXRhZGF0YS5xdW90ZShjZk5hbWUpKTsKLSAgICAgICAgaWYgKHRhYmxlTWV0YWRhdGEgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vIHRhYmxlIG1ldGFkYXRhIGZvdW5kIGZvciAiICsga2V5c3BhY2UgKyAiLiIgKyBjZk5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIC8vSGVyZSB3ZSBhc3N1bWUgdGhhdCB0YWJsZU1ldGFkYXRhLmdldFBhcnRpdGlvbktleSgpIGFsd2F5cwotICAgICAgICAvL3JldHVybnMgdGhlIGxpc3Qgb2YgY29sdW1ucyBpbiBvcmRlciBvZiBjb21wb25lbnRfaW5kZXgKLSAgICAgICAgZm9yIChDb2x1bW5NZXRhZGF0YSBwYXJ0aXRpb25LZXkgOiB0YWJsZU1ldGFkYXRhLmdldFBhcnRpdGlvbktleSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwYXJ0aXRpb25LZXlzLmFkZChwYXJ0aXRpb25LZXkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHF1b3RlKFN0cmluZyBpZGVudGlmaWVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJcIiIgKyBpZGVudGlmaWVyLnJlcGxhY2VBbGwoIlwiIiwgIlwiXCIiKSArICJcIiI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGFkb29wL2NxbDMvQ3FsUmVjb3JkV3JpdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvY3FsMy9DcWxSZWNvcmRXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJjZTk4OS4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvY3FsMy9DcWxSZWNvcmRXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oYWRvb3AuY3FsMzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC4qOwotCi1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS4qOwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5leGNlcHRpb25zLio7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVCdWZmZXJBY2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkNvbXBvc2l0ZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGFkb29wLkNvbmZpZ0hlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oYWRvb3AuSGFkb29wQ29tcGF0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuUmVjb3JkV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5UYXNrQXR0ZW1wdENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AudXRpbC5Qcm9ncmVzc2FibGU7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTWFwOwotCi0vKioKLSAqIFRoZSA8Y29kZT5DcWxSZWNvcmRXcml0ZXI8L2NvZGU+IG1hcHMgdGhlIG91dHB1dCAmbHQ7a2V5LCB2YWx1ZSZndDsKLSAqIHBhaXJzIHRvIGEgQ2Fzc2FuZHJhIHRhYmxlLiBJbiBwYXJ0aWN1bGFyLCBpdCBhcHBsaWVzIHRoZSBiaW5kZWQgdmFyaWFibGVzCi0gKiBpbiB0aGUgdmFsdWUgdG8gdGhlIHByZXBhcmVkIHN0YXRlbWVudCwgd2hpY2ggaXQgYXNzb2NpYXRlcyB3aXRoIHRoZSBrZXksIGFuZCBpbgotICogdHVybiB0aGUgcmVzcG9uc2libGUgZW5kcG9pbnQuCi0gKgotICogPHA+Ci0gKiBGdXJ0aGVybW9yZSwgdGhpcyB3cml0ZXIgZ3JvdXBzIHRoZSBjcWwgcXVlcmllcyBieSB0aGUgZW5kcG9pbnQgcmVzcG9uc2libGUgZm9yCi0gKiB0aGUgcm93cyBiZWluZyBhZmZlY3RlZC4gVGhpcyBhbGxvd3MgdGhlIGNxbCBxdWVyaWVzIHRvIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLAotICogZGlyZWN0bHkgdG8gYSByZXNwb25zaWJsZSBlbmRwb2ludC4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIENxbE91dHB1dEZvcm1hdAotICovCi1jbGFzcyBDcWxSZWNvcmRXcml0ZXIgZXh0ZW5kcyBSZWNvcmRXcml0ZXI8TWFwPFN0cmluZywgQnl0ZUJ1ZmZlcj4sIExpc3Q8Qnl0ZUJ1ZmZlcj4+IGltcGxlbWVudHMKLSAgICAgICAgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLlJlY29yZFdyaXRlcjxNYXA8U3RyaW5nLCBCeXRlQnVmZmVyPiwgTGlzdDxCeXRlQnVmZmVyPj4sIEF1dG9DbG9zZWFibGUKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ3FsUmVjb3JkV3JpdGVyLmNsYXNzKTsKLQotICAgIC8vIFRoZSBjb25maWd1cmF0aW9uIHRoaXMgd3JpdGVyIGlzIGFzc29jaWF0ZWQgd2l0aC4KLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29uZmlndXJhdGlvbiBjb25mOwotICAgIC8vIFRoZSBudW1iZXIgb2YgbXV0YXRpb25zIHRvIGJ1ZmZlciBwZXIgZW5kcG9pbnQKLSAgICBwcm90ZWN0ZWQgZmluYWwgaW50IHF1ZXVlU2l6ZTsKLQotICAgIHByb3RlY3RlZCBmaW5hbCBsb25nIGJhdGNoVGhyZXNob2xkOwotCi0gICAgcHJvdGVjdGVkIFByb2dyZXNzYWJsZSBwcm9ncmVzc2FibGU7Ci0gICAgcHJvdGVjdGVkIFRhc2tBdHRlbXB0Q29udGV4dCBjb250ZXh0OwotCi0gICAgLy8gVGhlIHJpbmcgY2FjaGUgdGhhdCBkZXNjcmliZXMgdGhlIHRva2VuIHJhbmdlcyBlYWNoIG5vZGUgaW4gdGhlIHJpbmcgaXMKLSAgICAvLyByZXNwb25zaWJsZSBmb3IuIFRoaXMgaXMgd2hhdCBhbGxvd3MgdXMgdG8gZ3JvdXAgdGhlIG11dGF0aW9ucyBieQotICAgIC8vIHRoZSBlbmRwb2ludHMgdGhleSBzaG91bGQgYmUgdGFyZ2V0ZWQgYXQuIFRoZSB0YXJnZXRlZCBlbmRwb2ludAotICAgIC8vIGVzc2VudGlhbGx5Ci0gICAgLy8gYWN0cyBhcyB0aGUgcHJpbWFyeSByZXBsaWNhIGZvciB0aGUgcm93cyBiZWluZyBhZmZlY3RlZCBieSB0aGUgbXV0YXRpb25zLgotICAgIHByaXZhdGUgZmluYWwgTmF0aXZlUmluZ0NhY2hlIHJpbmdDYWNoZTsKLQotICAgIC8vIGhhbmRsZXMgZm9yIGNsaWVudHMgZm9yIGVhY2ggcmFuZ2UgcnVubmluZyBpbiB0aGUgdGhyZWFkcG9vbAotICAgIHByb3RlY3RlZCBmaW5hbCBNYXA8SW5ldEFkZHJlc3MsIFJhbmdlQ2xpZW50PiBjbGllbnRzOwotCi0gICAgLy8gaG9zdCB0byBwcmVwYXJlZCBzdGF0ZW1lbnQgaWQgbWFwcGluZ3MKLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29uY3VycmVudEhhc2hNYXA8U2Vzc2lvbiwgUHJlcGFyZWRTdGF0ZW1lbnQ+IHByZXBhcmVkU3RhdGVtZW50cyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxTZXNzaW9uLCBQcmVwYXJlZFN0YXRlbWVudD4oKTsKLQotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgY3FsOwotCi0gICAgcHJvdGVjdGVkIExpc3Q8Q29sdW1uTWV0YWRhdGE+IHBhcnRpdGlvbktleUNvbHVtbnM7Ci0gICAgcHJvdGVjdGVkIExpc3Q8Q29sdW1uTWV0YWRhdGE+IGNsdXN0ZXJDb2x1bW5zOwotCi0gICAgLyoqCi0gICAgICogVXBvbiBjb25zdHJ1Y3Rpb24sIG9idGFpbiB0aGUgbWFwIHRoYXQgdGhpcyB3cml0ZXIgd2lsbCB1c2UgdG8gY29sbGVjdAotICAgICAqIG11dGF0aW9ucywgYW5kIHRoZSByaW5nIGNhY2hlIGZvciB0aGUgZ2l2ZW4ga2V5c3BhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgdGFzayBhdHRlbXB0IGNvbnRleHQKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgQ3FsUmVjb3JkV3JpdGVyKFRhc2tBdHRlbXB0Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRoaXMoSGFkb29wQ29tcGF0LmdldENvbmZpZ3VyYXRpb24oY29udGV4dCkpOwotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIENxbFJlY29yZFdyaXRlcihDb25maWd1cmF0aW9uIGNvbmYsIFByb2dyZXNzYWJsZSBwcm9ncmVzc2FibGUpCi0gICAgewotICAgICAgICB0aGlzKGNvbmYpOwotICAgICAgICB0aGlzLnByb2dyZXNzYWJsZSA9IHByb2dyZXNzYWJsZTsKLSAgICB9Ci0KLSAgICBDcWxSZWNvcmRXcml0ZXIoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgdGhpcy5jb25mID0gY29uZjsKLSAgICAgICAgdGhpcy5xdWV1ZVNpemUgPSBjb25mLmdldEludChDcWxPdXRwdXRGb3JtYXQuUVVFVUVfU0laRSwgMzIgKiBGQlV0aWxpdGllcy5nZXRBdmFpbGFibGVQcm9jZXNzb3JzKCkpOwotICAgICAgICBiYXRjaFRocmVzaG9sZCA9IGNvbmYuZ2V0TG9uZyhDcWxPdXRwdXRGb3JtYXQuQkFUQ0hfVEhSRVNIT0xELCAzMik7Ci0gICAgICAgIHRoaXMuY2xpZW50cyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgU3RyaW5nIGtleXNwYWNlID0gQ29uZmlnSGVscGVyLmdldE91dHB1dEtleXNwYWNlKGNvbmYpOwotCi0gICAgICAgIHRyeSAoQ2x1c3RlciBjbHVzdGVyID0gQ3FsQ29uZmlnSGVscGVyLmdldE91dHB1dENsdXN0ZXIoQ29uZmlnSGVscGVyLmdldE91dHB1dEluaXRpYWxBZGRyZXNzKGNvbmYpLCBjb25mKSkKLSAgICAgICAgewotICAgICAgICAgICAgTWV0YWRhdGEgbWV0YWRhdGEgPSBjbHVzdGVyLmdldE1ldGFkYXRhKCk7Ci0gICAgICAgICAgICByaW5nQ2FjaGUgPSBuZXcgTmF0aXZlUmluZ0NhY2hlKGNvbmYsIG1ldGFkYXRhKTsKLSAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEgdGFibGVNZXRhZGF0YSA9IG1ldGFkYXRhLmdldEtleXNwYWNlKE1ldGFkYXRhLnF1b3RlKGtleXNwYWNlKSkuZ2V0VGFibGUoQ29uZmlnSGVscGVyLmdldE91dHB1dENvbHVtbkZhbWlseShjb25mKSk7Ci0gICAgICAgICAgICBjbHVzdGVyQ29sdW1ucyA9IHRhYmxlTWV0YWRhdGEuZ2V0Q2x1c3RlcmluZ0NvbHVtbnMoKTsKLSAgICAgICAgICAgIHBhcnRpdGlvbktleUNvbHVtbnMgPSB0YWJsZU1ldGFkYXRhLmdldFBhcnRpdGlvbktleSgpOwotCi0gICAgICAgICAgICBTdHJpbmcgY3FsUXVlcnkgPSBDcWxDb25maWdIZWxwZXIuZ2V0T3V0cHV0Q3FsKGNvbmYpLnRyaW0oKTsKLSAgICAgICAgICAgIGlmIChjcWxRdWVyeS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkuc3RhcnRzV2l0aCgiaW5zZXJ0IikpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJJTlNFUlQgd2l0aCBDcWxSZWNvcmRXcml0ZXIgaXMgbm90IHN1cHBvcnRlZCwgcGxlYXNlIHVzZSBVUERBVEUvREVMRVRFIHN0YXRlbWVudCIpOwotICAgICAgICAgICAgY3FsID0gYXBwZW5kS2V5V2hlcmVDbGF1c2VzKGNxbFF1ZXJ5KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2UgdGhpcyA8Y29kZT5SZWNvcmRXcml0ZXI8L2NvZGU+IHRvIGZ1dHVyZSBvcGVyYXRpb25zLCBidXQgbm90IGJlZm9yZQotICAgICAqIGZsdXNoaW5nIG91dCB0aGUgYmF0Y2hlZCBtdXRhdGlvbnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBvZiB0aGUgdGFzawotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbG9zZShUYXNrQXR0ZW1wdENvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvKiogRmlsbHMgdGhlIGRlcHJlY2F0ZWQgUmVjb3JkV3JpdGVyIGludGVyZmFjZSBmb3Igc3RyZWFtaW5nLiAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHZvaWQgY2xvc2Uob3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLlJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNsb3NlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIGNsb3NlIGFsbCB0aGUgY2xpZW50cyBiZWZvcmUgdGhyb3dpbmcgYW55dGhpbmcKLSAgICAgICAgSU9FeGNlcHRpb24gY2xpZW50RXhjZXB0aW9uID0gbnVsbDsKLSAgICAgICAgZm9yIChSYW5nZUNsaWVudCBjbGllbnQgOiBjbGllbnRzLnZhbHVlcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbGllbnQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNsaWVudEV4Y2VwdGlvbiA9IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2xpZW50RXhjZXB0aW9uICE9IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBjbGllbnRFeGNlcHRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIGtleSBpcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSB2YWxpZCB2YWx1ZSwgYSBtdXRhdGlvbiBpcyBjcmVhdGVkCi0gICAgICogZm9yIGl0IHdpdGggdGhlIGdpdmVuIHRhYmxlIGFuZCBjb2x1bW5zLiBJbiB0aGUgZXZlbnQgdGhlIHZhbHVlCi0gICAgICogaW4gdGhlIGNvbHVtbiBpcyBtaXNzaW5nIChpLmUuLCBudWxsKSwgdGhlbiBpdCBpcyBtYXJrZWQgZm9yCi0gICAgICoge0BsaW5rIERlbGV0aW9ufS4gU2ltaWxhcmx5LCBpZiB0aGUgZW50aXJlIHZhbHVlIGZvciBhIGtleSBpcyBtaXNzaW5nCi0gICAgICogKGkuZS4sIG51bGwpLCB0aGVuIHRoZSBlbnRpcmUga2V5IGlzIG1hcmtlZCBmb3Ige0BsaW5rIERlbGV0aW9ufS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5Q29sdW1ucwotICAgICAqICAgICAgICAgICAgdGhlIGtleSB0byB3cml0ZS4KLSAgICAgKiBAcGFyYW0gdmFsdWVzCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWVzIHRvIHdyaXRlLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZShNYXA8U3RyaW5nLCBCeXRlQnVmZmVyPiBrZXlDb2x1bW5zLCBMaXN0PEJ5dGVCdWZmZXI+IHZhbHVlcykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBUb2tlblJhbmdlIHJhbmdlID0gcmluZ0NhY2hlLmdldFJhbmdlKGdldFBhcnRpdGlvbktleShrZXlDb2x1bW5zKSk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBjbGllbnQgZm9yIHRoZSBnaXZlbiByYW5nZSwgb3IgY3JlYXRlIGEgbmV3IG9uZQotICAgICAgICBmaW5hbCBJbmV0QWRkcmVzcyBhZGRyZXNzID0gcmluZ0NhY2hlLmdldEVuZHBvaW50cyhyYW5nZSkuZ2V0KDApOwotICAgICAgICBSYW5nZUNsaWVudCBjbGllbnQgPSBjbGllbnRzLmdldChhZGRyZXNzKTsKLSAgICAgICAgaWYgKGNsaWVudCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBoYXZlbid0IHNlZW4ga2V5cyBmb3IgdGhpcyByYW5nZTogY3JlYXRlIG5ldyBjbGllbnQKLSAgICAgICAgICAgIGNsaWVudCA9IG5ldyBSYW5nZUNsaWVudChyaW5nQ2FjaGUuZ2V0RW5kcG9pbnRzKHJhbmdlKSk7Ci0gICAgICAgICAgICBjbGllbnQuc3RhcnQoKTsKLSAgICAgICAgICAgIGNsaWVudHMucHV0KGFkZHJlc3MsIGNsaWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhZGQgcHJpbWFyeSBrZXkgY29sdW1ucyB0byB0aGUgYmluZCB2YXJpYWJsZXMKLSAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBhbGxWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PEJ5dGVCdWZmZXI+KHZhbHVlcyk7Ci0gICAgICAgIGZvciAoQ29sdW1uTWV0YWRhdGEgY29sdW1uIDogcGFydGl0aW9uS2V5Q29sdW1ucykKLSAgICAgICAgICAgIGFsbFZhbHVlcy5hZGQoa2V5Q29sdW1ucy5nZXQoY29sdW1uLmdldE5hbWUoKSkpOwotICAgICAgICBmb3IgKENvbHVtbk1ldGFkYXRhIGNvbHVtbiA6IGNsdXN0ZXJDb2x1bW5zKQotICAgICAgICAgICAgYWxsVmFsdWVzLmFkZChrZXlDb2x1bW5zLmdldChjb2x1bW4uZ2V0TmFtZSgpKSk7Ci0KLSAgICAgICAgY2xpZW50LnB1dChhbGxWYWx1ZXMpOwotCi0gICAgICAgIGlmIChwcm9ncmVzc2FibGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHByb2dyZXNzYWJsZS5wcm9ncmVzcygpOwotICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKQotICAgICAgICAgICAgSGFkb29wQ29tcGF0LnByb2dyZXNzKGNvbnRleHQpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2xvc2VTZXNzaW9uKFNlc3Npb24gc2Vzc2lvbikKLSAgICB7Ci0gICAgICAgIC8vQ2xvc2UgdGhlIHNlc3Npb24gdG8gc2F0aXNmeSB0byBhdm9pZCB3YXJuaW5ncyBmb3IgdGhlIHJlc291cmNlIG5vdCBiZWluZyBjbG9zZWQKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDbHVzdGVyKCkuY2xvc2VBc3luYygpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLndhcm4oIkVycm9yIGNsb3NpbmcgY29ubmVjdGlvbiIsIHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBjbGllbnQgdGhhdCBydW5zIGluIGEgdGhyZWFkcG9vbCBhbmQgY29ubmVjdHMgdG8gdGhlIGxpc3Qgb2YgZW5kcG9pbnRzIGZvciBhIHBhcnRpY3VsYXIKLSAgICAgKiByYW5nZS4gQm91bmQgdmFyaWFibGVzIGZvciBrZXlzIGluIHRoYXQgcmFuZ2UgYXJlIHNlbnQgdG8gdGhpcyBjbGllbnQgdmlhIGEgcXVldWUuCi0gICAgICovCi0gICAgcHVibGljIGNsYXNzIFJhbmdlQ2xpZW50IGV4dGVuZHMgVGhyZWFkCi0gICAgewotICAgICAgICAvLyBUaGUgbGlzdCBvZiBlbmRwb2ludHMgZm9yIHRoaXMgcmFuZ2UKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIExpc3Q8SW5ldEFkZHJlc3M+IGVuZHBvaW50czsKLSAgICAgICAgcHJvdGVjdGVkIENsdXN0ZXIgY2x1c3RlciA9IG51bGw7Ci0gICAgICAgIC8vIEEgYm91bmRlZCBxdWV1ZSBvZiBpbmNvbWluZyBtdXRhdGlvbnMgZm9yIHRoaXMgcmFuZ2UKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEJsb2NraW5nUXVldWU8TGlzdDxCeXRlQnVmZmVyPj4gcXVldWUgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPExpc3Q8Qnl0ZUJ1ZmZlcj4+KHF1ZXVlU2l6ZSk7Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvbGF0aWxlIGJvb2xlYW4gcnVuID0gdHJ1ZTsKLSAgICAgICAgLy8gd2Ugd2FudCB0aGUgY2FsbGVyIHRvIGtub3cgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcsIHNvIHdlIHJlY29yZCBhbnkgdW5yZWNvdmVyYWJsZSBleGNlcHRpb24gd2hpbGUgd3JpdGluZwotICAgICAgICAvLyBzbyB3ZSBjYW4gdGhyb3cgaXQgb24gdGhlIGNhbGxlcidzIHN0YWNrIHdoZW4gaGUgY2FsbHMgcHV0KCkgYWdhaW4sIG9yIGlmIHRoZXJlIGFyZSBubyBtb3JlIHB1dCBjYWxscywKLSAgICAgICAgLy8gd2hlbiB0aGUgY2xpZW50IGlzIGNsb3NlZC4KLSAgICAgICAgcHJvdGVjdGVkIHZvbGF0aWxlIElPRXhjZXB0aW9uIGxhc3RFeGNlcHRpb247Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdHMgYW4ge0BsaW5rIFJhbmdlQ2xpZW50fSBmb3IgdGhlIGdpdmVuIGVuZHBvaW50cy4KLSAgICAgICAgICogQHBhcmFtIGVuZHBvaW50cyB0aGUgcG9zc2libGUgZW5kcG9pbnRzIHRvIGV4ZWN1dGUgdGhlIG11dGF0aW9ucyBvbgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFJhbmdlQ2xpZW50KExpc3Q8SW5ldEFkZHJlc3M+IGVuZHBvaW50cykKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoImNsaWVudC0iICsgZW5kcG9pbnRzKTsKLSAgICAgICAgICAgIHRoaXMuZW5kcG9pbnRzID0gZW5kcG9pbnRzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIGVucXVldWVzIHRoZSBnaXZlbiB2YWx1ZSB0byBDYXNzYW5kcmEKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHB1dChMaXN0PEJ5dGVCdWZmZXI+IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUgKHRydWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGxhc3RFeGNlcHRpb24gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbGFzdEV4Y2VwdGlvbjsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5vZmZlcih2YWx1ZSwgMTAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBMb29wcyBjb2xsZWN0aW5nIGNxbCBiaW5kZWQgdmFyaWFibGUgdmFsdWVzIGZyb20gdGhlIHF1ZXVlIGFuZCBzZW5kaW5nIHRvIENhc3NhbmRyYQotICAgICAgICAgKi8KLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgewotICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0ZXI6Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHJ1biB8fCAhcXVldWUuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBiaW5kVmFyaWFibGVzOwotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYmluZFZhcmlhYmxlcyA9IHF1ZXVlLnRha2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtY2hlY2sgbG9vcCBjb25kaXRpb24gYWZ0ZXIgaW50ZXJydXB0Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIExpc3RJdGVyYXRvcjxJbmV0QWRkcmVzcz4gaXRlciA9IGVuZHBvaW50cy5saXN0SXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgdGhlIG11dGF0aW9uIHRvIHRoZSBsYXN0LXVzZWQgZW5kcG9pbnQuICBmaXJzdCB0aW1lIHRocm91Z2gsIHRoaXMgd2lsbCBOUEUgaGFybWxlc3NseS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0YXRlbWVudCA9IHByZXBhcmVkU3RhdGVtZW50KHNlc3Npb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYmluZFZhcmlhYmxlcyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3VuZFN0YXRlbWVudCBib3VuZFN0YXRlbWVudCA9IG5ldyBCb3VuZFN0YXRlbWVudChzdGF0ZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sdW1uUG9zaXRpb24gPSAwOyBjb2x1bW5Qb3NpdGlvbiA8IGJpbmRWYXJpYWJsZXMuc2l6ZSgpOyBjb2x1bW5Qb3NpdGlvbisrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kU3RhdGVtZW50LnNldEJ5dGVzVW5zYWZlKGNvbHVtblBvc2l0aW9uLCBiaW5kVmFyaWFibGVzLmdldChjb2x1bW5Qb3NpdGlvbikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5leGVjdXRlKGJvdW5kU3RhdGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gYmF0Y2hUaHJlc2hvbGQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kVmFyaWFibGVzID0gcXVldWUucG9sbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZUludGVybmFsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXRlci5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RFeGNlcHRpb24gPSBuZXcgSU9FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdCB0byBjb25uZWN0IHRvIGEgZGlmZmVyZW50IGVuZHBvaW50Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcyBhZGRyZXNzID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3QgPSBhZGRyZXNzLmdldEhvc3ROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlciA9IENxbENvbmZpZ0hlbHBlci5nZXRPdXRwdXRDbHVzdGVyKGhvc3QsIGNvbmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlU2Vzc2lvbihzZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uID0gY2x1c3Rlci5jb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiBjb25uZWN0aW9uIGRpZWQgZHVlIHRvIEludGVycnVwdCwganVzdCB0cnkgY29ubmVjdGluZyB0byB0aGUgZW5kcG9pbnQgYWdhaW4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UaGVyZSBhcmUgdG9vIG1hbnkgd2F5cyBmb3IgdGhlIFRocmVhZC5pbnRlcnJ1cHRlZCgpIHN0YXRlIHRvIGJlIGNsZWFyZWQsIHNvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZSBjYW4ndCByZWx5IG9uIHRoYXQgaGVyZS4gVW50aWwgdGhlIGphdmEgZHJpdmVyIGdpdmVzIHVzIGEgYmV0dGVyIHdheSBvZiBrbm93aW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGF0IHRoaXMgZXhjZXB0aW9uIGNhbWUgZnJvbSBhbiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgdGhpcyBpcyB0aGUgYmVzdCBzb2x1dGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FuUmV0cnlEcml2ZXJDb25uZWN0aW9uKGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlci5wcmV2aW91cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZUludGVybmFsKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNb3N0IGV4Y2VwdGlvbnMgbWVhbiBzb21ldGhpbmcgdW5leHBlY3RlZCB3ZW50IHdyb25nIHRvIHRoYXQgZW5kcG9pbnQsIHNvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIHRyeSBhZ2FpbiB0byBhbm90aGVyLiAgT3RoZXIgZXhjZXB0aW9ucyAoYXV0aCBvciBpbnZhbGlkIHJlcXVlc3QpIGFyZSBmYXRhbC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGUgaW5zdGFuY2VvZiBBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiB8fCBlIGluc3RhbmNlb2YgSW52YWxpZFF1ZXJ5RXhjZXB0aW9uKSB8fCAhaXRlci5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RXhjZXB0aW9uID0gbmV3IElPRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2xvc2VTZXNzaW9uKHNlc3Npb24pOwotICAgICAgICAgICAgICAgIC8vIGNsb3NlIGFsbCBvdXIgY29ubmVjdGlvbnMgb25jZSB3ZSBhcmUgZG9uZS4KLSAgICAgICAgICAgICAgICBjbG9zZUludGVybmFsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogZ2V0IHByZXBhcmVkIHN0YXRlbWVudCBpZCBmcm9tIGNhY2hlLCBvdGhlcndpc2UgcHJlcGFyZSBpdCBmcm9tIENhc3NhbmRyYSBzZXJ2ZXIqLwotICAgICAgICBwcml2YXRlIFByZXBhcmVkU3RhdGVtZW50IHByZXBhcmVkU3RhdGVtZW50KFNlc3Npb24gY2xpZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBwcmVwYXJlZFN0YXRlbWVudHMuZ2V0KGNsaWVudCk7Ci0gICAgICAgICAgICBpZiAoc3RhdGVtZW50ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgcmVzdWx0OwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2xpZW50LnByZXBhcmUoY3FsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKE5vSG9zdEF2YWlsYWJsZUV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImZhaWxlZCB0byBwcmVwYXJlIGNxbCBxdWVyeSAiICsgY3FsLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBwcmV2aW91c0lkID0gcHJlcGFyZWRTdGF0ZW1lbnRzLnB1dElmQWJzZW50KGNsaWVudCwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBwcmV2aW91c0lkID09IG51bGwgPyByZXN1bHQgOiBwcmV2aW91c0lkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN0YXRlbWVudDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHN0b3AgdGhlIHJ1biBsb29wLiAgdGhpcyB3aWxsIHJlc3VsdCBpbiBjbG9zZUludGVybmFsIGJlaW5nIGNhbGxlZCBieSB0aGUgdGltZSBqb2luKCkgZmluaXNoZXMuCi0gICAgICAgICAgICBydW4gPSBmYWxzZTsKLSAgICAgICAgICAgIGludGVycnVwdCgpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5qb2luKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChsYXN0RXhjZXB0aW9uICE9IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbGFzdEV4Y2VwdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGNsb3NlSW50ZXJuYWwoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY2x1c3RlciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNsdXN0ZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBjYW5SZXRyeURyaXZlckNvbm5lY3Rpb24oRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRHJpdmVyRXhjZXB0aW9uICYmIGUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJDb25uZWN0aW9uIHRocmVhZCBpbnRlcnJ1cHRlZCIpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBOb0hvc3RBdmFpbGFibGVFeGNlcHRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCgoTm9Ib3N0QXZhaWxhYmxlRXhjZXB0aW9uKSBlKS5nZXRFcnJvcnMoKS5zaXplKCkgPT0gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9ICgoTm9Ib3N0QXZhaWxhYmxlRXhjZXB0aW9uKSBlKS5nZXRFcnJvcnMoKS52YWx1ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNhdXNlICE9IG51bGwgJiYgY2F1c2UuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBnZXRQYXJ0aXRpb25LZXkoTWFwPFN0cmluZywgQnl0ZUJ1ZmZlcj4ga2V5Q29sdW1ucykKLSAgICB7Ci0gICAgICAgIEJ5dGVCdWZmZXIgcGFydGl0aW9uS2V5OwotICAgICAgICBpZiAocGFydGl0aW9uS2V5Q29sdW1ucy5zaXplKCkgPiAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBCeXRlQnVmZmVyW10ga2V5cyA9IG5ldyBCeXRlQnVmZmVyW3BhcnRpdGlvbktleUNvbHVtbnMuc2l6ZSgpXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpPCBrZXlzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGtleXNbaV0gPSBrZXlDb2x1bW5zLmdldChwYXJ0aXRpb25LZXlDb2x1bW5zLmdldChpKS5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICBwYXJ0aXRpb25LZXkgPSBDb21wb3NpdGVUeXBlLmJ1aWxkKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwga2V5cyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwYXJ0aXRpb25LZXkgPSBrZXlDb2x1bW5zLmdldChwYXJ0aXRpb25LZXlDb2x1bW5zLmdldCgwKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXJ0aXRpb25LZXk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYWRkIHdoZXJlIGNsYXVzZXMgZm9yIHBhcnRpdGlvbiBrZXlzIGFuZCBjbHVzdGVyIGNvbHVtbnMKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBhcHBlbmRLZXlXaGVyZUNsYXVzZXMoU3RyaW5nIGNxbFF1ZXJ5KQotICAgIHsKLSAgICAgICAgU3RyaW5nIGtleVdoZXJlQ2xhdXNlID0gIiI7Ci0KLSAgICAgICAgZm9yIChDb2x1bW5NZXRhZGF0YSBwYXJ0aXRpb25LZXkgOiBwYXJ0aXRpb25LZXlDb2x1bW5zKQotICAgICAgICAgICAga2V5V2hlcmVDbGF1c2UgKz0gU3RyaW5nLmZvcm1hdCgiJXMgPSA/Iiwga2V5V2hlcmVDbGF1c2UuaXNFbXB0eSgpID8gcXVvdGUocGFydGl0aW9uS2V5LmdldE5hbWUoKSkgOiAoIiBBTkQgIiArIHF1b3RlKHBhcnRpdGlvbktleS5nZXROYW1lKCkpKSk7Ci0gICAgICAgIGZvciAoQ29sdW1uTWV0YWRhdGEgY2x1c3RlckNvbHVtbiA6IGNsdXN0ZXJDb2x1bW5zKQotICAgICAgICAgICAga2V5V2hlcmVDbGF1c2UgKz0gIiBBTkQgIiArIHF1b3RlKGNsdXN0ZXJDb2x1bW4uZ2V0TmFtZSgpKSArICIgPSA/IjsKLQotICAgICAgICByZXR1cm4gY3FsUXVlcnkgKyAiIFdIRVJFICIgKyBrZXlXaGVyZUNsYXVzZTsKLSAgICB9Ci0KLSAgICAvKiogUXVvdGluZyBmb3Igd29ya2luZyB3aXRoIHVwcGVyY2FzZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIHF1b3RlKFN0cmluZyBpZGVudGlmaWVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJcIiIgKyBpZGVudGlmaWVyLnJlcGxhY2VBbGwoIlwiIiwgIlwiXCIiKSArICJcIiI7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIE5hdGl2ZVJpbmdDYWNoZQotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8VG9rZW5SYW5nZSwgU2V0PEhvc3Q+PiByYW5nZU1hcDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZXRhZGF0YSBtZXRhZGF0YTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXI7Ci0KLSAgICAgICAgcHVibGljIE5hdGl2ZVJpbmdDYWNoZShDb25maWd1cmF0aW9uIGNvbmYsIE1ldGFkYXRhIG1ldGFkYXRhKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnBhcnRpdGlvbmVyID0gQ29uZmlnSGVscGVyLmdldE91dHB1dFBhcnRpdGlvbmVyKGNvbmYpOwotICAgICAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICAgICAgU3RyaW5nIGtleXNwYWNlID0gQ29uZmlnSGVscGVyLmdldE91dHB1dEtleXNwYWNlKGNvbmYpOwotICAgICAgICAgICAgdGhpcy5yYW5nZU1hcCA9IG1ldGFkYXRhLmdldFRva2VuUmFuZ2VzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QodG9NYXAocCAtPiBwLCBwIC0+IG1ldGFkYXRhLmdldFJlcGxpY2FzKCciJyArIGtleXNwYWNlICsgJyInLCBwKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFRva2VuUmFuZ2UgZ2V0UmFuZ2UoQnl0ZUJ1ZmZlciBrZXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRva2VuIHQgPSBwYXJ0aXRpb25lci5nZXRUb2tlbihrZXkpOwotICAgICAgICAgICAgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlRva2VuIGRyaXZlclRva2VuID0gbWV0YWRhdGEubmV3VG9rZW4ocGFydGl0aW9uZXIuZ2V0VG9rZW5GYWN0b3J5KCkudG9TdHJpbmcodCkpOwotICAgICAgICAgICAgZm9yIChUb2tlblJhbmdlIHJhbmdlIDogcmFuZ2VNYXAua2V5U2V0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHJhbmdlLmNvbnRhaW5zKGRyaXZlclRva2VuKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIHRva2VuIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IGRlc2NyaWJlX3Jpbmc6ICIgKyByYW5nZU1hcCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlzdDxJbmV0QWRkcmVzcz4gZ2V0RW5kcG9pbnRzKFRva2VuUmFuZ2UgcmFuZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNldDxIb3N0PiBob3N0U2V0ID0gcmFuZ2VNYXAuZ2V0KHJhbmdlKTsKLSAgICAgICAgICAgIExpc3Q8SW5ldEFkZHJlc3M+IGFkZHJlc3NlcyA9IG5ldyBBcnJheUxpc3Q8Pihob3N0U2V0LnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKEhvc3QgaG9zdDogaG9zdFNldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGRyZXNzZXMuYWRkKGhvc3QuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBhZGRyZXNzZXM7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvY3FsMy9MaW1pdGVkTG9jYWxOb2RlRmlyc3RMb2NhbEJhbGFuY2luZ1BvbGljeS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGFkb29wL2NxbDMvTGltaXRlZExvY2FsTm9kZUZpcnN0TG9jYWxCYWxhbmNpbmdQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliNGVjYS4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvY3FsMy9MaW1pdGVkTG9jYWxOb2RlRmlyc3RMb2NhbEJhbGFuY2luZ1BvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcC5jcWwzOwotCi1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkNsdXN0ZXI7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkhvc3Q7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkhvc3REaXN0YW5jZTsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuU3RhdGVtZW50OwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5wb2xpY2llcy5Mb2FkQmFsYW5jaW5nUG9saWN5OwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYXRvcnM7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlOwotaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5U2V0OwotCi0vKioKLSAqIFRoaXMgbG9hZCBiYWxhbmNpbmcgcG9saWN5IGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb25seSBmb3IgQ3FsUmVjb3JkUmVhZGVyIHdoZW4gaXQgZmV0Y2hlcyBhIHBhcnRpY3VsYXIgc3BsaXQuCi0gKiA8cC8+Ci0gKiBJdCBjaG9vc2VzIGFsaXZlIGhvc3RzIG9ubHkgZnJvbSB0aGUgc2V0IG9mIHRoZSBnaXZlbiByZXBsaWNhcyAtIGJlY2F1c2UgdGhlIGNvbm5lY3Rpb24gaXMgdXNlZCB0byBsb2FkIHRoZSBkYXRhIGZyb20KLSAqIHRoZSBwYXJ0aWN1bGFyIHNwbGl0LCB3aXRoIGEgc3RyaWN0bHkgZGVmaW5lZCBsaXN0IG9mIHRoZSByZXBsaWNhcywgaXQgaXMgcG9pbnRsZXNzIHRvIHRyeSB0aGUgb3RoZXIgbm9kZXMuCi0gKiBUaGUgcG9saWN5IHRyYWNrcyB3aGljaCBvZiB0aGUgcmVwbGljYXMgYXJlIGFsaXZlLCBhbmQgd2hlbiBhIG5ldyBxdWVyeSBwbGFuIGlzIHJlcXVlc3RlZCwgaXQgcmV0dXJucyB0aG9zZSByZXBsaWNhcwotICogaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKLSAqIDx1bD4KLSAqIDxsaT50aGUgbG9jYWwgbm9kZTwvbGk+Ci0gKiA8bGk+dGhlIGNvbGxlY3Rpb24gb2YgdGhlIHJlbWFpbmluZyBob3N0cyAod2hpY2ggaXMgc2h1ZmZsZWQgb24gZWFjaCByZXF1ZXN0KTwvbGk+Ci0gKiA8L3VsPgotICovCi1jbGFzcyBMaW1pdGVkTG9jYWxOb2RlRmlyc3RMb2NhbEJhbGFuY2luZ1BvbGljeSBpbXBsZW1lbnRzIExvYWRCYWxhbmNpbmdQb2xpY3kKLXsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTGltaXRlZExvY2FsTm9kZUZpcnN0TG9jYWxCYWxhbmNpbmdQb2xpY3kuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU2V0PEluZXRBZGRyZXNzPiBsb2NhbEFkZHJlc3NlcyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChnZXRMb2NhbEluZXRBZGRyZXNzZXMoKSk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvcHlPbldyaXRlQXJyYXlTZXQ8SG9zdD4gbGl2ZVJlcGxpY2FIb3N0cyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5U2V0PD4oKTsKLQotICAgIHByaXZhdGUgZmluYWwgU2V0PEluZXRBZGRyZXNzPiByZXBsaWNhQWRkcmVzc2VzID0gbmV3IEhhc2hTZXQ8PigpOwotICAgIHByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4gYWxsb3dlZERDcyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5U2V0PD4oKTsKLQotICAgIHB1YmxpYyBMaW1pdGVkTG9jYWxOb2RlRmlyc3RMb2NhbEJhbGFuY2luZ1BvbGljeShTdHJpbmdbXSByZXBsaWNhcykKLSAgICB7Ci0gICAgICAgIGZvciAoU3RyaW5nIHJlcGxpY2EgOiByZXBsaWNhcykKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSW5ldEFkZHJlc3NbXSBhZGRyZXNzZXMgPSBJbmV0QWRkcmVzcy5nZXRBbGxCeU5hbWUocmVwbGljYSk7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuYWRkQWxsKHJlcGxpY2FBZGRyZXNzZXMsIGFkZHJlc3Nlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiSW52YWxpZCByZXBsaWNhIGhvc3QgbmFtZToge30sIHNraXBwaW5nIGl0IiwgcmVwbGljYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJDcmVhdGVkIGluc3RhbmNlIHdpdGggdGhlIGZvbGxvd2luZyByZXBsaWNhczoge30iLCBBcnJheXMuYXNMaXN0KHJlcGxpY2FzKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdChDbHVzdGVyIGNsdXN0ZXIsIENvbGxlY3Rpb248SG9zdD4gaG9zdHMpCi0gICAgewotICAgICAgICAvLyBmaXJzdCBmaW5kIHdoaWNoIERDcyB0aGUgdXNlciBkZWZpbmVkCi0gICAgICAgIFNldDxTdHJpbmc+IGRjcyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgZm9yIChIb3N0IGhvc3QgOiBob3N0cykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHJlcGxpY2FBZGRyZXNzZXMuY29udGFpbnMoaG9zdC5nZXRBZGRyZXNzKCkpKQotICAgICAgICAgICAgICAgIGRjcy5hZGQoaG9zdC5nZXREYXRhY2VudGVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGZpbHRlciB0byBhbGwgbm9kZXMgd2l0aGluIHRoZSB0YXJnZXRlZCBEQ3MKLSAgICAgICAgTGlzdDxIb3N0PiByZXBsaWNhSG9zdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZm9yIChIb3N0IGhvc3QgOiBob3N0cykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGRjcy5jb250YWlucyhob3N0LmdldERhdGFjZW50ZXIoKSkpCi0gICAgICAgICAgICAgICAgcmVwbGljYUhvc3RzLmFkZChob3N0KTsKLSAgICAgICAgfQotICAgICAgICBsaXZlUmVwbGljYUhvc3RzLmFkZEFsbChyZXBsaWNhSG9zdHMpOwotICAgICAgICBhbGxvd2VkRENzLmFkZEFsbChkY3MpOwotICAgICAgICBsb2dnZXIudHJhY2UoIkluaXRpYWxpemVkIHdpdGggcmVwbGljYSBob3N0czoge30iLCByZXBsaWNhSG9zdHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKLSAgICB7Ci0gICAgICAgIC8vCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEhvc3REaXN0YW5jZSBkaXN0YW5jZShIb3N0IGhvc3QpCi0gICAgewotICAgICAgICBpZiAoaXNMb2NhbEhvc3QoaG9zdCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBIb3N0RGlzdGFuY2UuTE9DQUw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gSG9zdERpc3RhbmNlLlJFTU9URTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJdGVyYXRvcjxIb3N0PiBuZXdRdWVyeVBsYW4oU3RyaW5nIGtleXNwYWNlLCBTdGF0ZW1lbnQgc3RhdGVtZW50KQotICAgIHsKLSAgICAgICAgTGlzdDxIb3N0PiBsb2NhbCA9IG5ldyBBcnJheUxpc3Q8PigxKTsKLSAgICAgICAgTGlzdDxIb3N0PiByZW1vdGUgPSBuZXcgQXJyYXlMaXN0PD4obGl2ZVJlcGxpY2FIb3N0cy5zaXplKCkpOwotICAgICAgICBmb3IgKEhvc3QgbGl2ZVJlcGxpY2FIb3N0IDogbGl2ZVJlcGxpY2FIb3N0cykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlzTG9jYWxIb3N0KGxpdmVSZXBsaWNhSG9zdCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9jYWwuYWRkKGxpdmVSZXBsaWNhSG9zdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVtb3RlLmFkZChsaXZlUmVwbGljYUhvc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQ29sbGVjdGlvbnMuc2h1ZmZsZShyZW1vdGUpOwotCi0gICAgICAgIGxvZ2dlci50cmFjZSgiVXNpbmcgdGhlIGZvbGxvd2luZyBob3N0cyBvcmRlciBmb3IgdGhlIG5ldyBxdWVyeSBwbGFuOiB7fSB8IHt9IiwgbG9jYWwsIHJlbW90ZSk7Ci0KLSAgICAgICAgcmV0dXJuIEl0ZXJhdG9ycy5jb25jYXQobG9jYWwuaXRlcmF0b3IoKSwgcmVtb3RlLml0ZXJhdG9yKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQWRkKEhvc3QgaG9zdCkKLSAgICB7Ci0gICAgICAgIGlmIChsaXZlUmVwbGljYUhvc3RzLmNvbnRhaW5zKGhvc3QpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsaXZlUmVwbGljYUhvc3RzLmFkZChob3N0KTsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiQWRkZWQgYSBuZXcgaG9zdCB7fSIsIGhvc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25VcChIb3N0IGhvc3QpCi0gICAgewotICAgICAgICBpZiAobGl2ZVJlcGxpY2FIb3N0cy5jb250YWlucyhob3N0KSkKLSAgICAgICAgewotICAgICAgICAgICAgbGl2ZVJlcGxpY2FIb3N0cy5hZGQoaG9zdCk7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoIlRoZSBob3N0IHt9IGlzIG5vdyB1cCIsIGhvc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25Eb3duKEhvc3QgaG9zdCkKLSAgICB7Ci0gICAgICAgIGlmIChsaXZlUmVwbGljYUhvc3RzLnJlbW92ZShob3N0KSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJUaGUgaG9zdCB7fSBpcyBub3cgZG93biIsIGhvc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblJlbW92ZShIb3N0IGhvc3QpCi0gICAgewotICAgICAgICBpZiAobGl2ZVJlcGxpY2FIb3N0cy5yZW1vdmUoaG9zdCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiUmVtb3ZlZCB0aGUgaG9zdCB7fSIsIGhvc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25TdXNwZWN0ZWQoSG9zdCBob3N0KQotICAgIHsKLSAgICAgICAgLy8gbm90IHN1cHBvcnRlZCBieSB0aGlzIGxvYWQgYmFsYW5jaW5nIHBvbGljeQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMb2NhbEhvc3QoSG9zdCBob3N0KQotICAgIHsKLSAgICAgICAgSW5ldEFkZHJlc3MgaG9zdEFkZHJlc3MgPSBob3N0LmdldEFkZHJlc3MoKTsKLSAgICAgICAgcmV0dXJuIGhvc3RBZGRyZXNzLmlzTG9vcGJhY2tBZGRyZXNzKCkgfHwgbG9jYWxBZGRyZXNzZXMuY29udGFpbnMoaG9zdEFkZHJlc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFNldDxJbmV0QWRkcmVzcz4gZ2V0TG9jYWxJbmV0QWRkcmVzc2VzKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gU2V0cy5uZXdIYXNoU2V0KEl0ZXJhdG9ycy5jb25jYXQoCi0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9ycy50cmFuc2Zvcm0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3JzLmZvckVudW1lcmF0aW9uKE5ldHdvcmtJbnRlcmZhY2UuZ2V0TmV0d29ya0ludGVyZmFjZXMoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZ1bmN0aW9uPE5ldHdvcmtJbnRlcmZhY2UsIEl0ZXJhdG9yPEluZXRBZGRyZXNzPj4oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxJbmV0QWRkcmVzcz4gYXBwbHkoTmV0d29ya0ludGVyZmFjZSBuZXRJZmFjZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEl0ZXJhdG9ycy5mb3JFbnVtZXJhdGlvbihuZXRJZmFjZS5nZXRJbmV0QWRkcmVzc2VzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci53YXJuKCJDb3VsZCBub3QgcmV0cmlldmUgbG9jYWwgbmV0d29yayBpbnRlcmZhY2VzLiIsIGUpOwotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvcGFja2FnZS1pbmZvLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvcGFja2FnZS1pbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNTE2NWIuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGFkb29wL3BhY2thZ2UtaW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBUaGlzIHBhY2thZ2Ugd2FzIGRlcHJlY2F0ZWQuIFNlZSBDQVNTQU5EUkEtMTY5ODQuCi0gKi8KLUBEZXByZWNhdGVkCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9IaW50LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9IaW50LmphdmEKaW5kZXggMzA4OTg5NC4uYzY4YzI2NiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvSGludC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0hpbnQuamF2YQpAQCAtMjIsMTIgKzIyLDExIEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7Ci0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwotCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5JbnRzOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLk11dGF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlN5c3RlbUtleXNwYWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLklWZXJzaW9uZWRTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0QnVmZmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKQEAgLTM4LDYgKzM3LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy52aW50LlZJbnRDb2Rpbmc7CiBpbXBvcnQgb3JnLmFzc2VydGouY29yZS51dGlsLlZpc2libGVGb3JUZXN0aW5nOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX01BWF9ISU5UX1RUTDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzLnNpemVvZjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzLnNpemVvZlVuc2lnbmVkVkludDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLmN1cnJlbnRUaW1lTWlsbGlzOwpAQCAtNjAsNyArNjAsNyBAQAogcHVibGljIGZpbmFsIGNsYXNzIEhpbnQKIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBTZXJpYWxpemVyKCk7Ci0gICAgc3RhdGljIGZpbmFsIGludCBtYXhIaW50VFRMID0gSW50ZWdlci5nZXRJbnRlZ2VyKCJjYXNzYW5kcmEubWF4SGludFRUTCIsIEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICBzdGF0aWMgZmluYWwgaW50IG1heEhpbnRUVEwgPSBDQVNTQU5EUkFfTUFYX0hJTlRfVFRMLmdldEludCgpOwogCiAgICAgZmluYWwgTXV0YXRpb24gbXV0YXRpb247CiAgICAgZmluYWwgbG9uZyBjcmVhdGlvblRpbWU7ICAvLyB0aW1lIG9mIGhpbnQgY3JlYXRpb24gKGluIG1pbGxpc2Vjb25kcykKQEAgLTEyMCw3ICsxMjAsOCBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5wcm9wYWdhdGUoZS5nZXRDYXVzZSgpKTsKKyAgICAgICAgICAgIFRocm93YWJsZXMudGhyb3dJZlVuY2hlY2tlZChlLmdldENhdXNlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRDYXVzZSgpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTcwLDE0ICsxNzEsMTQgQEAKICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKEhpbnQgaGludCwgRGF0YU91dHB1dFBsdXMgb3V0LCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIG91dC53cml0ZUxvbmcoaGludC5jcmVhdGlvblRpbWUpOwotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGhpbnQuZ2Nncyk7CisgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihoaW50LmdjZ3MpOwogICAgICAgICAgICAgTXV0YXRpb24uc2VyaWFsaXplci5zZXJpYWxpemUoaGludC5tdXRhdGlvbiwgb3V0LCB2ZXJzaW9uKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBIaW50IGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4sIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgbG9uZyBjcmVhdGlvblRpbWUgPSBpbi5yZWFkTG9uZygpOwotICAgICAgICAgICAgaW50IGdjZ3MgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICBpbnQgZ2NncyA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogICAgICAgICAgICAgcmV0dXJuIG5ldyBIaW50KE11dGF0aW9uLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIHZlcnNpb24pLCBjcmVhdGlvblRpbWUsIGdjZ3MpOwogICAgICAgICB9CiAKQEAgLTE5OCw3ICsxOTksNyBAQAogICAgICAgICBIaW50IGRlc2VyaWFsaXplSWZMaXZlKERhdGFJbnB1dFBsdXMgaW4sIGxvbmcgbm93LCBsb25nIHNpemUsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgbG9uZyBjcmVhdGlvblRpbWUgPSBpbi5yZWFkTG9uZygpOwotICAgICAgICAgICAgaW50IGdjZ3MgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICBpbnQgZ2NncyA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogICAgICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IHNpemVvZihjcmVhdGlvblRpbWUpICsgc2l6ZW9mVW5zaWduZWRWSW50KGdjZ3MpOwogCiAgICAgICAgICAgICBpZiAoaXNMaXZlKGNyZWF0aW9uVGltZSwgbm93LCBnY2dzKSkKQEAgLTIyNiw3ICsyMjcsNyBAQAogICAgICAgICAgICAgdHJ5IChEYXRhSW5wdXRCdWZmZXIgaW5wdXQgPSBuZXcgRGF0YUlucHV0QnVmZmVyKGhlYWRlcikpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbG9uZyBjcmVhdGlvblRpbWUgPSBpbnB1dC5yZWFkTG9uZygpOwotICAgICAgICAgICAgICAgIGludCBnY2dzID0gKGludCkgaW5wdXQucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgICAgIGludCBnY2dzID0gaW5wdXQucmVhZFVuc2lnbmVkVkludDMyKCk7CiAKICAgICAgICAgICAgICAgICBpZiAoIWlzTGl2ZShjcmVhdGlvblRpbWUsIG5vdywgZ2NncykpCiAgICAgICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvSGludE1lc3NhZ2UuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0hpbnRNZXNzYWdlLmphdmEKaW5kZXggNjBkNzY0MS4uOTc4YWI0MSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvSGludE1lc3NhZ2UuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9IaW50TWVzc2FnZS5qYXZhCkBAIC0yMiwxMCArMjIsMTAgQEAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5VVUlEOwotaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLkludHM7CiAKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlVua25vd25UYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5JVmVyc2lvbmVkQXN5bW1ldHJpY1NlcmlhbGl6ZXI7CkBAIC0xMzUsNyArMTM1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VyaWFsaXplKCkgY2FsbGVkIHdpdGggbm9uLW1hdGNoaW5nIHZlcnNpb24gIiArIHZlcnNpb24pOwogCiAgICAgICAgICAgICAgICAgVVVJRFNlcmlhbGl6ZXIuc2VyaWFsaXplci5zZXJpYWxpemUobWVzc2FnZS5ob3N0SWQsIG91dCwgdmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KG1lc3NhZ2UuaGludC5yZW1haW5pbmcoKSk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIobWVzc2FnZS5oaW50LnJlbWFpbmluZygpKTsKICAgICAgICAgICAgICAgICBvdXQud3JpdGUobWVzc2FnZS5oaW50KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0hpbnRzQnVmZmVyUG9vbC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvSGludHNCdWZmZXJQb29sLmphdmEKaW5kZXggNzhmMDdkZC4uZGQ1ODI5ZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvSGludHNCdWZmZXJQb29sLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvSGludHNCdWZmZXJQb29sLmphdmEKQEAgLTIyLDEwICsyMiwxMCBAQAogaW1wb3J0IGphdmEudXRpbC5VVUlEOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWU7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuVW5jaGVja2VkSW50ZXJydXB0ZWRFeGNlcHRpb247CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5NQVhfSElOVF9CVUZGRVJTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkJsb2NraW5nUXVldWVzLm5ld0Jsb2NraW5nUXVldWU7CiAKIC8qKgpAQCAtMzksNyArMzksNyBAQAogICAgICAgICB2b2lkIGZsdXNoKEhpbnRzQnVmZmVyIGJ1ZmZlciwgSGludHNCdWZmZXJQb29sIHBvb2wpOwogICAgIH0KIAotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0FMTE9DQVRFRF9CVUZGRVJTID0gSW50ZWdlci5nZXRJbnRlZ2VyKENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAiTUFYX0hJTlRfQlVGRkVSUyIsIDMpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0FMTE9DQVRFRF9CVUZGRVJTID0gTUFYX0hJTlRfQlVGRkVSUy5nZXRJbnQoKTsKICAgICBwcml2YXRlIHZvbGF0aWxlIEhpbnRzQnVmZmVyIGN1cnJlbnRCdWZmZXI7CiAgICAgcHJpdmF0ZSBmaW5hbCBCbG9ja2luZ1F1ZXVlPEhpbnRzQnVmZmVyPiByZXNlcnZlQnVmZmVyczsKICAgICBwcml2YXRlIGZpbmFsIGludCBidWZmZXJTaXplOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvSGludHNDYXRhbG9nLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9IaW50c0NhdGFsb2cuamF2YQppbmRleCA4NTkyNTJmLi42YmMwMDMwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9IaW50c0NhdGFsb2cuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9IaW50c0NhdGFsb2cuamF2YQpAQCAtMjYsMTAgKzI2LDExIEBACiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNFcnJvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU1JlYWRFcnJvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU1dyaXRlRXJyb3I7CkBAIC0xNjEsOCArMTYyLDE0IEBACiAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmhhbmRsZUZTRXJyb3JBbmRQcm9wYWdhdGUoZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoRGF0YWJhc2VEZXNjcmlwdG9yLmlzQ2xpZW50SW5pdGlhbGl6ZWQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nZ2VyLndhcm4oIlVuYWJsZSB0byBvcGVuIGhpbnQgZGlyZWN0b3J5IHVzaW5nIE5hdGl2ZSBsaWJyYXJ5LiBTa2lwcGluZyBzeW5jLiIpOworICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgeworICAgICAgICAgICAgaWYgKFN5bmNVdGlsLlNLSVBfU1lOQykKKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlVuYWJsZSB0byBvcGVuIGRpcmVjdG9yeSB7fSIsIGhpbnRzRGlyZWN0b3J5LmFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgIEZpbGVVdGlscy5oYW5kbGVGU0Vycm9yQW5kUHJvcGFnYXRlKG5ldyBGU1dyaXRlRXJyb3IobmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlVuYWJsZSB0byBvcGVuIGhpbnQgZGlyZWN0b3J5ICVzIiwgaGludHNEaXJlY3RvcnkuYWJzb2x1dGVQYXRoKCkpKSwgaGludHNEaXJlY3RvcnkuYWJzb2x1dGVQYXRoKCkpKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvSGludHNEZXNjcmlwdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9IaW50c0Rlc2NyaXB0b3IuamF2YQppbmRleCA4ZTFmNzgyLi44YWE4YjdiIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9IaW50c0Rlc2NyaXB0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9IaW50c0Rlc2NyaXB0b3IuamF2YQpAQCAtMTksNyArMTksNiBAQAogCiBpbXBvcnQgamF2YS5pby5EYXRhSW5wdXQ7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CkBAIC0zNyw2ICszNiw4IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSW5wdXRTdHJlYW1QbHVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkJ5dGVTdHJlYW1zOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkNvdW50aW5nT3V0cHV0U3RyZWFtOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKQEAgLTQ5LDggKzUwLDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29tcHJlc3Npb25QYXJhbXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VjdXJpdHkuRW5jcnlwdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5IZXg7Ci1pbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05WYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Kc29uVXRpbHM7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXMudXBkYXRlQ2hlY2tzdW1JbnQ7CiAKQEAgLTM2OCw3ICszNzAsNyBAQAogICAgICAgICBvdXQud3JpdGVMb25nKGhvc3RJZC5nZXRMZWFzdFNpZ25pZmljYW50Qml0cygpKTsKICAgICAgICAgdXBkYXRlQ2hlY2tzdW1Mb25nKGNyYywgaG9zdElkLmdldExlYXN0U2lnbmlmaWNhbnRCaXRzKCkpOwogCi0gICAgICAgIGJ5dGVbXSBwYXJhbXNCeXRlcyA9IEpTT05WYWx1ZS50b0pTT05TdHJpbmcocGFyYW1ldGVycykuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgICAgIGJ5dGVbXSBwYXJhbXNCeXRlcyA9IEpzb25VdGlscy53cml0ZUFzSnNvbkJ5dGVzKHBhcmFtZXRlcnMpOwogICAgICAgICBvdXQud3JpdGVJbnQocGFyYW1zQnl0ZXMubGVuZ3RoKTsKICAgICAgICAgdXBkYXRlQ2hlY2tzdW1JbnQoY3JjLCBwYXJhbXNCeXRlcy5sZW5ndGgpOwogICAgICAgICBvdXQud3JpdGVJbnQoKGludCkgY3JjLmdldFZhbHVlKCkpOwpAQCAtMzg3LDEwICszODksMjAgQEAKICAgICAgICAgc2l6ZSArPSBUeXBlU2l6ZXMuc2l6ZW9mKGhvc3RJZC5nZXRNb3N0U2lnbmlmaWNhbnRCaXRzKCkpOwogICAgICAgICBzaXplICs9IFR5cGVTaXplcy5zaXplb2YoaG9zdElkLmdldExlYXN0U2lnbmlmaWNhbnRCaXRzKCkpOwogCi0gICAgICAgIGJ5dGVbXSBwYXJhbXNCeXRlcyA9IEpTT05WYWx1ZS50b0pTT05TdHJpbmcocGFyYW1ldGVycykuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7Ci0gICAgICAgIHNpemUgKz0gVHlwZVNpemVzLnNpemVvZihwYXJhbXNCeXRlcy5sZW5ndGgpOworICAgICAgICAvLyBMZXQncyBhdm9pZCBhbGxvY2F0aW9uIG9mIHNlcmlhbGl6ZWQgb3V0cHV0LCB1c2UgY291bnRpbmcgb3V0cHV0IHN0cmVhbQorICAgICAgICBpbnQgc2VyaWFsaXplZFBhcmFtc0xlbmd0aDsKKyAgICAgICAgdHJ5IChDb3VudGluZ091dHB1dFN0cmVhbSBvdXQgPSBuZXcgQ291bnRpbmdPdXRwdXRTdHJlYW0oQnl0ZVN0cmVhbXMubnVsbE91dHB1dFN0cmVhbSgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSnNvblV0aWxzLkpTT05fT0JKRUNUX01BUFBFUi53cml0ZVZhbHVlKG91dCwgcGFyYW1ldGVycyk7CisgICAgICAgICAgICBzZXJpYWxpemVkUGFyYW1zTGVuZ3RoID0gKGludCkgb3V0LmdldENvdW50KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOyAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgIH0KKyAgICAgICAgc2l6ZSArPSBUeXBlU2l6ZXMuc2l6ZW9mKHNlcmlhbGl6ZWRQYXJhbXNMZW5ndGgpOwogICAgICAgICBzaXplICs9IDQ7IC8vIHNpemUgY2hlY2tzdW0KLSAgICAgICAgc2l6ZSArPSBwYXJhbXNCeXRlcy5sZW5ndGg7CisgICAgICAgIHNpemUgKz0gc2VyaWFsaXplZFBhcmFtc0xlbmd0aDsKICAgICAgICAgc2l6ZSArPSA0OyAvLyB0b3RhbCBjaGVja3N1bQogCiAgICAgICAgIHJldHVybiBzaXplOwpAQCAtNDI4LDcgKzQ0MCwxOCBAQAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHByaXZhdGUgc3RhdGljIEltbXV0YWJsZU1hcDxTdHJpbmcsIE9iamVjdD4gZGVjb2RlSlNPTkJ5dGVzKGJ5dGVbXSBieXRlcykKICAgICB7Ci0gICAgICAgIHJldHVybiBJbW11dGFibGVNYXAuY29weU9mKChNYXA8U3RyaW5nLCBPYmplY3Q+KSBKU09OVmFsdWUucGFyc2UobmV3IFN0cmluZyhieXRlcywgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpKTsKKyAgICAgICAgLy8gbm90ZTogVGhlcmUgaXMgYSBKYWNrc29uIG1vZHVsZSAoZGF0YXR5cGUtZ3VhdmEpIGZvciBkaXJlY3RseSByZWFkaW5nIGludG8gSW1tdXRhYmxlTWFwLAorICAgICAgICAvLyBidXQgd291bGQgcmVxdWlyZSBhZGRpbmcgZGVwZW5kZW5jeSB0byB0aGF0CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSW1tdXRhYmxlTWFwLmNvcHlPZihKc29uVXRpbHMuZnJvbUpzb25NYXAoYnl0ZXMpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTWFyc2hhbEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDb3VwbGUgb2Ygb3B0aW9ucyBoZXJlOiB1cCB0byA0LjAgc2ltcGx5IHJldHVybmVkIG51bGwgYW5kIGNhbGxlciBmYWlsZWQgd2l0aCBOUEUuCisgICAgICAgICAgICAvLyBTZWVtcyBjbGVhbmVyIHRvIHRocm93IGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oIkNvcnJ1cHQgSGludHNEZXNjcmlwdG9yIHNlcmlhbGl6YXRpb24sIHByb2JsZW06ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZUNoZWNrc3VtTG9uZyhDUkMzMiBjcmMsIGxvbmcgdmFsdWUpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9IaW50c0Rpc3BhdGNoRXhlY3V0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0hpbnRzRGlzcGF0Y2hFeGVjdXRvci5qYXZhCmluZGV4IDBmMzRkYjYuLjU0MGY1YmQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0hpbnRzRGlzcGF0Y2hFeGVjdXRvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0hpbnRzRGlzcGF0Y2hFeGVjdXRvci5qYXZhCkBAIC0xOTIsNyArMTkyLDcgQEAKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIHRyYW5zZmVyKFVVSUQgaG9zdElkKQogICAgICAgICB7CiAgICAgICAgICAgICBjYXRhbG9nLnN0b3JlcygpCi0gICAgICAgICAgICAgICAgICAgLm1hcChzdG9yZSAtPiBuZXcgRGlzcGF0Y2hIaW50c1Rhc2soc3RvcmUsIGhvc3RJZCkpCisgICAgICAgICAgICAgICAgICAgLm1hcChzdG9yZSAtPiBuZXcgRGlzcGF0Y2hIaW50c1Rhc2soc3RvcmUsIGhvc3RJZCwgdHJ1ZSkpCiAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goUnVubmFibGU6OnJ1bik7CiAKICAgICAgICAgICAgIHJldHVybiAhY2F0YWxvZy5oYXNGaWxlcygpOwpAQCAtMjA1LDIxICsyMDUsMjcgQEAKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBVVUlEIGhvc3RJZDsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBSYXRlTGltaXRlciByYXRlTGltaXRlcjsKIAotICAgICAgICBEaXNwYXRjaEhpbnRzVGFzayhIaW50c1N0b3JlIHN0b3JlLCBVVUlEIGhvc3RJZCkKKyAgICAgICAgRGlzcGF0Y2hIaW50c1Rhc2soSGludHNTdG9yZSBzdG9yZSwgVVVJRCBob3N0SWQsIGJvb2xlYW4gaXNUcmFuc2ZlcikKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgICAgICAgdGhpcy5ob3N0SWQgPSBob3N0SWQ7CiAKLSAgICAgICAgICAgIC8vIHJhdGUgbGltaXQgaXMgaW4gYnl0ZXMgcGVyIHNlY29uZC4gVXNlcyBEb3VibGUuTUFYX1ZBTFVFIGlmIGRpc2FibGVkIChzZXQgdG8gMCBpbiBjYXNzYW5kcmEueWFtbCkuCi0gICAgICAgICAgICAvLyBtYXggcmF0ZSBpcyBzY2FsZWQgYnkgdGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgY2x1c3RlciAoQ0FTU0FORFJBLTUyNzIpLgotICAgICAgICAgICAgLy8gdGhlIGdvYWwgaXMgdG8gYm91bmQgbWF4aW11bSBoaW50cyB0cmFmZmljIGdvaW5nIHRvd2FyZHMgYSBwYXJ0aWN1bGFyIG5vZGUgZnJvbSB0aGUgcmVzdCBvZiB0aGUgY2x1c3RlciwKLSAgICAgICAgICAgIC8vIG5vdCB0b3RhbCBvdXRnb2luZyBoaW50cyB0cmFmZmljIGZyb20gdGhpcyBub2RlIC0gdGhpcyBpcyB3aHkgdGhlIHJhdGUgbGltaXRlciBpcyBub3Qgc2hhcmVkIGJldHdlZW4KKyAgICAgICAgICAgIC8vIFJhdGUgbGltaXQgaXMgaW4gYnl0ZXMgcGVyIHNlY29uZC4gVXNlcyBEb3VibGUuTUFYX1ZBTFVFIGlmIGRpc2FibGVkIChzZXQgdG8gMCBpbiBjYXNzYW5kcmEueWFtbCkuCisgICAgICAgICAgICAvLyBNYXggcmF0ZSBpcyBzY2FsZWQgYnkgdGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgY2x1c3RlciAoQ0FTU0FORFJBLTUyNzIpLCB1bmxlc3Mgd2UgYXJlIHRyYW5zZmVycmluZworICAgICAgICAgICAgLy8gaGludHMgZHVyaW5nIGRlY29taXNzaW9uIHJhdGhlciB0aGFuIGRpc3BhdGNoaW5nIHRoZW0gdG8gdGhlaXIgZmluYWwgZGVzdGluYXRpb24uCisgICAgICAgICAgICAvLyBUaGUgZ29hbCBpcyB0byBib3VuZCBtYXhpbXVtIGhpbnRzIHRyYWZmaWMgZ29pbmcgdG93YXJkcyBhIHBhcnRpY3VsYXIgbm9kZSBmcm9tIHRoZSByZXN0IG9mIHRoZSBjbHVzdGVyLAorICAgICAgICAgICAgLy8gbm90IHRvdGFsIG91dGdvaW5nIGhpbnRzIHRyYWZmaWMgZnJvbSB0aGlzIG5vZGUuIFRoaXMgaXMgd2h5IHRoZSByYXRlIGxpbWl0ZXIgaXMgbm90IHNoYXJlZCBiZXR3ZWVuCiAgICAgICAgICAgICAvLyBhbGwgdGhlIGRpc3BhdGNoIHRhc2tzIChhcyB0aGVyZSB3aWxsIGJlIGF0IG1vc3Qgb25lIGRpc3BhdGNoIHRhc2sgZm9yIGEgcGFydGljdWxhciBob3N0IGlkIGF0IGEgdGltZSkuCi0gICAgICAgICAgICBpbnQgbm9kZXNDb3VudCA9IE1hdGgubWF4KDEsIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmdldFRva2VuTWV0YWRhdGEoKS5nZXRBbGxFbmRwb2ludHMoKS5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgIGludCBub2Rlc0NvdW50ID0gaXNUcmFuc2ZlciA/IDEgOiBNYXRoLm1heCgxLCBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5nZXRUb2tlbk1ldGFkYXRhKCkuZ2V0QWxsRW5kcG9pbnRzKCkuc2l6ZSgpIC0gMSk7CiAgICAgICAgICAgICBkb3VibGUgdGhyb3R0bGVJbkJ5dGVzID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldEhpbnRlZEhhbmRvZmZUaHJvdHRsZUluS2lCKCkgKiAxMDI0LjAgLyBub2Rlc0NvdW50OwogICAgICAgICAgICAgdGhpcy5yYXRlTGltaXRlciA9IFJhdGVMaW1pdGVyLmNyZWF0ZSh0aHJvdHRsZUluQnl0ZXMgPT0gMCA/IERvdWJsZS5NQVhfVkFMVUUgOiB0aHJvdHRsZUluQnl0ZXMpOwogICAgICAgICB9CiAKKyAgICAgICAgRGlzcGF0Y2hIaW50c1Rhc2soSGludHNTdG9yZSBzdG9yZSwgVVVJRCBob3N0SWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMoc3RvcmUsIGhvc3RJZCwgZmFsc2UpOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKICAgICAgICAgewogICAgICAgICAgICAgdHJ5CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9IaW50c1dyaXRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvSGludHNXcml0ZXIuamF2YQppbmRleCA2NjM0MjdhLi41OTFlMDNkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9IaW50c1dyaXRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0hpbnRzV3JpdGVyLmphdmEKQEAgLTM3LDYgKzM3LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5TeW5jVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOwogCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllcy51cGRhdGVDaGVja3N1bTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXMudXBkYXRlQ2hlY2tzdW1JbnQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRocm93YWJsZXMucGVyZm9ybTsKQEAgLTc4LDcgKzc5LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgLy8gd3JpdGUgdGhlIGRlc2NyaXB0b3IKICAgICAgICAgICAgIGRlc2NyaXB0b3Iuc2VyaWFsaXplKGRvYik7Ci0gICAgICAgICAgICBCeXRlQnVmZmVyIGRlc2NyaXB0b3JCeXRlcyA9IGRvYi5idWZmZXIoKTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgZGVzY3JpcHRvckJ5dGVzID0gZG9iLnVuc2FmZUdldEJ1ZmZlckFuZEZsaXAoKTsKICAgICAgICAgICAgIHVwZGF0ZUNoZWNrc3VtKGNyYywgZGVzY3JpcHRvckJ5dGVzKTsKICAgICAgICAgICAgIGNoYW5uZWwud3JpdGUoZGVzY3JpcHRvckJ5dGVzKTsKIApAQCAtMjQ4LDcgKzI0OSwxMCBAQAogICAgICAgICAgICAgICAgIHVwZGF0ZUNoZWNrc3VtSW50KGNyYywgaGludFNpemUpOwogICAgICAgICAgICAgICAgIG91dC53cml0ZUludCgoaW50KSBjcmMuZ2V0VmFsdWUoKSk7CiAKKyAgICAgICAgICAgICAgICBsb25nIHN0YXJ0UG9zaXRpb24gPSBvdXQucG9zaXRpb24oKTsKICAgICAgICAgICAgICAgICBIaW50LnNlcmlhbGl6ZXIuc2VyaWFsaXplKGhpbnQsIG91dCwgZGVzY3JpcHRvci5tZXNzYWdpbmdWZXJzaW9uKCkpOworICAgICAgICAgICAgICAgIGxvbmcgYWN0dWFsU2l6ZSA9IG91dC5wb3NpdGlvbigpIC0gc3RhcnRQb3NpdGlvbjsKKyAgICAgICAgICAgICAgICBjaGVja1N0YXRlKGFjdHVhbFNpemUgPT0gaGludFNpemUsICJTZXJpYWxpemVkIGhpbnQgc2l6ZSBkb2Vzbid0IG1hdGNoIGNhbGN1bGF0ZWQgaGludCBzaXplIik7CiAgICAgICAgICAgICAgICAgdXBkYXRlQ2hlY2tzdW0oY3JjLCBoaW50QnVmZmVyLCBoaW50QnVmZmVyLnBvc2l0aW9uKCkgLSBoaW50U2l6ZSwgaGludFNpemUpOwogICAgICAgICAgICAgICAgIG91dC53cml0ZUludCgoaW50KSBjcmMuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9JbmRleC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvSW5kZXguamF2YQppbmRleCA5ZjUxYjE2Li5mMjMwN2I5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9JbmRleC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L0luZGV4LmphdmEKQEAgLTI2LDEzICsyNiwxOSBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaUZ1bmN0aW9uOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuTWVtdGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuT3BlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25UaW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJhbmdlVG9tYnN0b25lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJlYWRDb21tYW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJlYWRFeGVjdXRpb25Db250cm9sbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLldyaXRlQ29udGV4dDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLlJvd0ZpbHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZS5NZW10YWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlBhcnRpdGlvbkl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uVXBkYXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yOwpAQCAtNDIsOCArNDgsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnRyYW5zYWN0aW9ucy5JbmRleFRyYW5zYWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlJlZHVjaW5nS2V5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZsdXNoT2JzZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlRmx1c2hPYnNlcnZlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuSW5kZXhNZXRhZGF0YTsKIAogLyoqCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9TZWNvbmRhcnlJbmRleE1hbmFnZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L1NlY29uZGFyeUluZGV4TWFuYWdlci5qYXZhCmluZGV4IDkzZWNkNTkuLjRjNDEyYTIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L1NlY29uZGFyeUluZGV4TWFuYWdlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L1NlY29uZGFyeUluZGV4TWFuYWdlci5qYXZhCkBAIC03Myw2ICs3Myw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC4qOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRXhlY3V0b3JGYWN0b3J5Lkdsb2JhbC5leGVjdXRvckZhY3Rvcnk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRk9SQ0VfREVGQVVMVF9JTkRFWElOR19QQUdFX1NJWkU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkV4ZWN1dG9yVXRpbHMuYXdhaXRUZXJtaW5hdGlvbjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRXhlY3V0b3JVdGlscy5zaHV0ZG93bjsKIApAQCAtOTkxLDcgKzk5Miw3IEBACiAgICAgICovCiAgICAgcHVibGljIGludCBjYWxjdWxhdGVJbmRleGluZ1BhZ2VTaXplKCkKICAgICB7Ci0gICAgICAgIGlmIChCb29sZWFuLmdldEJvb2xlYW4oImNhc3NhbmRyYS5mb3JjZV9kZWZhdWx0X2luZGV4aW5nX3BhZ2Vfc2l6ZSIpKQorICAgICAgICBpZiAoRk9SQ0VfREVGQVVMVF9JTkRFWElOR19QQUdFX1NJWkUuZ2V0Qm9vbGVhbigpKQogICAgICAgICAgICAgcmV0dXJuIERFRkFVTFRfUEFHRV9TSVpFOwogCiAgICAgICAgIGRvdWJsZSB0YXJnZXRQYWdlU2l6ZUluQnl0ZXMgPSAzMiAqIDEwMjQgKiAxMDI0OwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9TQVNJSW5kZXguamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L3Nhc2kvU0FTSUluZGV4LmphdmEKaW5kZXggMWU4NmJjNi4uMzg1ODhkMyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9TQVNJSW5kZXguamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL1NBU0lJbmRleC5qYXZhCkBAIC0xNywxNiArMTcsMzAgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpOwogCi1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk5hdmlnYWJsZU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaUZ1bmN0aW9uOwogCiBpbXBvcnQgY29tLmdvb2dsZWNvZGUuY29uY3VycmVudHRyZWVzLmNvbW1vbi5JdGVyYWJsZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuT3BlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLnNjaGVtYS5JbmRleFRhcmdldDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNhc3NhbmRyYVdyaXRlQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25UaW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJhbmdlVG9tYnN0b25lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJlYWRDb21tYW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLldyaXRlQ29udGV4dDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuUm93RmlsdGVyOwpAQCAtNDksOSArNjMsMTUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpLnBsYW4uUXVlcnlQbGFuOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnRyYW5zYWN0aW9ucy5JbmRleFRyYW5zYWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRmx1c2hPYnNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVGbHVzaE9ic2VydmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5vdGlmaWNhdGlvbnMuSU5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLklOb3RpZmljYXRpb25Db25zdW1lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLk1lbXRhYmxlRGlzY2FyZGVkTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5vdGlmaWNhdGlvbnMuTWVtdGFibGVSZW5ld2VkTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5vdGlmaWNhdGlvbnMuTWVtdGFibGVTd2l0Y2hlZE5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLlNTVGFibGVBZGRlZE5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLlNTVGFibGVMaXN0Q2hhbmdlZE5vdGlmaWNhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkluZGV4TWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L3Nhc2kvU0FTSUluZGV4QnVpbGRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9TQVNJSW5kZXhCdWlsZGVyLmphdmEKaW5kZXggNTdhM2Y1MS4uNTU1YmNlMSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9TQVNJSW5kZXhCdWlsZGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9TQVNJSW5kZXhCdWlsZGVyLmphdmEKQEAgLTIxLDEzICsyMSwxMyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93SW5kZXhFbnRyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25JbmZvOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkludGVycnVwdGVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKQEAgLTM2LDExICszNiwxMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kuY29uZi5Db2x1bW5JbmRleDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpLmRpc2suUGVyU1NUYWJsZUluZGV4V3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTUmVhZEVycm9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuS2V5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuS2V5UmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZUlkZW50aXR5SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SYW5kb21BY2Nlc3NSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogCkBAIC01MSwyNSArNTIsMjkgQEAKICAgICBwcml2YXRlIGZpbmFsIENvbHVtbkZhbWlseVN0b3JlIGNmczsKICAgICBwcml2YXRlIGZpbmFsIFRpbWVVVUlEIGNvbXBhY3Rpb25JZCA9IG5leHRUaW1lVVVJRCgpOwogCisgICAgLy8gS2VlcCB0YXJnZXREaXJlY3RvcnkgZm9yIGNvbXBhY3Rpb25zLCBuZWVkZWQgZm9yIGBub2RldG9vbCBjb21wYWN0aW9uc3RhdHNgCisgICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0RGlyZWN0b3J5OworCiAgICAgcHJpdmF0ZSBmaW5hbCBTb3J0ZWRNYXA8U1NUYWJsZVJlYWRlciwgTWFwPENvbHVtbk1ldGFkYXRhLCBDb2x1bW5JbmRleD4+IHNzdGFibGVzOwogCiAgICAgcHJpdmF0ZSBsb25nIGJ5dGVzUHJvY2Vzc2VkID0gMDsKLSAgICBwcml2YXRlIGZpbmFsIGxvbmcgdG90YWxTaXplSW5CeXRlczsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgdG90YWxCeXRlc1RvUHJvY2VzczsKIAogICAgIHB1YmxpYyBTQVNJSW5kZXhCdWlsZGVyKENvbHVtbkZhbWlseVN0b3JlIGNmcywgU29ydGVkTWFwPFNTVGFibGVSZWFkZXIsIE1hcDxDb2x1bW5NZXRhZGF0YSwgQ29sdW1uSW5kZXg+PiBzc3RhYmxlcykKICAgICB7Ci0gICAgICAgIGxvbmcgdG90YWxJbmRleEJ5dGVzID0gMDsKKyAgICAgICAgbG9uZyB0b3RhbEJ5dGVzVG9Qcm9jZXNzID0gMDsKICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcy5rZXlTZXQoKSkKLSAgICAgICAgICAgIHRvdGFsSW5kZXhCeXRlcyArPSBnZXRQcmltYXJ5SW5kZXhMZW5ndGgoc3N0YWJsZSk7CisgICAgICAgICAgICB0b3RhbEJ5dGVzVG9Qcm9jZXNzICs9IHNzdGFibGUudW5jb21wcmVzc2VkTGVuZ3RoKCk7CiAKICAgICAgICAgdGhpcy5jZnMgPSBjZnM7CiAgICAgICAgIHRoaXMuc3N0YWJsZXMgPSBzc3RhYmxlczsKLSAgICAgICAgdGhpcy50b3RhbFNpemVJbkJ5dGVzID0gdG90YWxJbmRleEJ5dGVzOworICAgICAgICB0aGlzLnRvdGFsQnl0ZXNUb1Byb2Nlc3MgPSB0b3RhbEJ5dGVzVG9Qcm9jZXNzOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGJ1aWxkKCkKICAgICB7CiAgICAgICAgIEFic3RyYWN0VHlwZTw/PiBrZXlWYWxpZGF0b3IgPSBjZnMubWV0YWRhdGEoKS5wYXJ0aXRpb25LZXlUeXBlOworICAgICAgICBsb25nIHByb2Nlc3NlZEJ5dGVzSW5GaW5pc2hlZFNTVGFibGVzID0gMDsKICAgICAgICAgZm9yIChNYXAuRW50cnk8U1NUYWJsZVJlYWRlciwgTWFwPENvbHVtbk1ldGFkYXRhLCBDb2x1bW5JbmRleD4+IGUgOiBzc3RhYmxlcy5lbnRyeVNldCgpKQogICAgICAgICB7CiAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBlLmdldEtleSgpOwpAQCAtNzgsNDcgKzgzLDQ3IEBACiAgICAgICAgICAgICB0cnkgKFJhbmRvbUFjY2Vzc1JlYWRlciBkYXRhRmlsZSA9IHNzdGFibGUub3BlbkRhdGFSZWFkZXIoKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBQZXJTU1RhYmxlSW5kZXhXcml0ZXIgaW5kZXhXcml0ZXIgPSBTQVNJSW5kZXgubmV3V3JpdGVyKGtleVZhbGlkYXRvciwgc3N0YWJsZS5kZXNjcmlwdG9yLCBpbmRleGVzLCBPcGVyYXRpb25UeXBlLkNPTVBBQ1RJT04pOworICAgICAgICAgICAgICAgIHRhcmdldERpcmVjdG9yeSA9IGluZGV4V3JpdGVyLmdldERlc2NyaXB0b3IoKS5kaXJlY3RvcnkucGF0aCgpOwogCi0gICAgICAgICAgICAgICAgbG9uZyBwcmV2aW91c0tleVBvc2l0aW9uID0gMDsKLSAgICAgICAgICAgICAgICB0cnkgKEtleUl0ZXJhdG9yIGtleXMgPSBuZXcgS2V5SXRlcmF0b3Ioc3N0YWJsZS5kZXNjcmlwdG9yLCBjZnMubWV0YWRhdGEoKSkpCisgICAgICAgICAgICAgICAgdHJ5IChLZXlSZWFkZXIga2V5cyA9IHNzdGFibGUua2V5UmVhZGVyKCkpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgha2V5cy5pc0V4aGF1c3RlZCgpKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdG9wUmVxdWVzdGVkKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbXBhY3Rpb25JbnRlcnJ1cHRlZEV4Y2VwdGlvbihnZXRDb21wYWN0aW9uSW5mbygpKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRGVjb3JhdGVkS2V5IGtleSA9IGtleXMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBrZXlQb3NpdGlvbiA9IGtleXMuZ2V0S2V5UG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERlY29yYXRlZEtleSBrZXkgPSBzc3RhYmxlLmRlY29yYXRlS2V5KGtleXMua2V5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBrZXlQb3NpdGlvbiA9IGtleXMua2V5UG9zaXRpb25Gb3JTZWNvbmRhcnlJbmRleCgpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleFdyaXRlci5zdGFydFBhcnRpdGlvbihrZXksIGtleVBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4V3JpdGVyLnN0YXJ0UGFydGl0aW9uKGtleSwga2V5cy5kYXRhUG9zaXRpb24oKSwga2V5UG9zaXRpb24pOwogCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFGaWxlLnNlZWsoa2V5cy5kYXRhUG9zaXRpb24oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGRhdGFGaWxlKTsgLy8ga2V5CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSAoU1NUYWJsZUlkZW50aXR5SXRlcmF0b3IgcGFydGl0aW9uID0gU1NUYWJsZUlkZW50aXR5SXRlcmF0b3IuY3JlYXRlKHNzdGFibGUsIGRhdGFGaWxlLCBrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSA9IHNzdGFibGUuZ2V0UG9zaXRpb24oa2V5LCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhRmlsZS5zZWVrKGluZGV4RW50cnkucG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoZGF0YUZpbGUpOyAvLyBrZXkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSAoU1NUYWJsZUlkZW50aXR5SXRlcmF0b3IgcGFydGl0aW9uID0gU1NUYWJsZUlkZW50aXR5SXRlcmF0b3IuY3JlYXRlKHNzdGFibGUsIGRhdGFGaWxlLCBrZXkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSByb3cgaGFzIHN0YXRpY3MgYXR0YWNoZWQsIGl0IGhhcyB0byBiZSBpbmRleGVkIHNlcGFyYXRlbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ZzLm1ldGFkYXRhKCkuaGFzU3RhdGljQ29sdW1ucygpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHJvdyBoYXMgc3RhdGljcyBhdHRhY2hlZCwgaXQgaGFzIHRvIGJlIGluZGV4ZWQgc2VwYXJhdGVseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ZzLm1ldGFkYXRhKCkuaGFzU3RhdGljQ29sdW1ucygpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhXcml0ZXIubmV4dFVuZmlsdGVyZWRDbHVzdGVyKHBhcnRpdGlvbi5zdGF0aWNSb3coKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBhcnRpdGlvbi5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFdyaXRlci5uZXh0VW5maWx0ZXJlZENsdXN0ZXIocGFydGl0aW9uLm5leHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4V3JpdGVyLm5leHRVbmZpbHRlcmVkQ2x1c3RlcihwYXJ0aXRpb24uc3RhdGljUm93KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRlNSZWFkRXJyb3IoZXgsIHNzdGFibGUuZ2V0RmlsZW5hbWUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGFydGl0aW9uLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhXcml0ZXIubmV4dFVuZmlsdGVyZWRDbHVzdGVyKHBhcnRpdGlvbi5uZXh0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICBieXRlc1Byb2Nlc3NlZCArPSBrZXlQb3NpdGlvbiAtIHByZXZpb3VzS2V5UG9zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0tleVBvc2l0aW9uID0ga2V5UG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgICAgICBrZXlzLmFkdmFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZGF0YVBvc2l0aW9uID0ga2V5cy5pc0V4aGF1c3RlZCgpID8gc3N0YWJsZS51bmNvbXByZXNzZWRMZW5ndGgoKSA6IGtleXMuZGF0YVBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1Byb2Nlc3NlZCA9IHByb2Nlc3NlZEJ5dGVzSW5GaW5pc2hlZFNTVGFibGVzICsgZGF0YVBvc2l0aW9uOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVTU1RhYmxlKGluZGV4V3JpdGVyLCBzc3RhYmxlLCBpbmRleGVzLnZhbHVlcygpKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZTUmVhZEVycm9yKGV4LCBzc3RhYmxlLmdldEZpbGVuYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcm9jZXNzZWRCeXRlc0luRmluaXNoZWRTU1RhYmxlcyArPSBzc3RhYmxlLnVuY29tcHJlc3NlZExlbmd0aCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTI4LDE1ICsxMzMsMTAgQEAKICAgICAgICAgcmV0dXJuIG5ldyBDb21wYWN0aW9uSW5mbyhjZnMubWV0YWRhdGEoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25UeXBlLklOREVYX0JVSUxELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU2l6ZUluQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxCeXRlc1RvUHJvY2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYWN0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZXMua2V5U2V0KCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgbG9uZyBnZXRQcmltYXJ5SW5kZXhMZW5ndGgoU1NUYWJsZSBzc3RhYmxlKQotICAgIHsKLSAgICAgICAgRmlsZSBwcmltYXJ5SW5kZXggPSBuZXcgRmlsZShzc3RhYmxlLmdldEluZGV4RmlsZW5hbWUoKSk7Ci0gICAgICAgIHJldHVybiBwcmltYXJ5SW5kZXguZXhpc3RzKCkgPyBwcmltYXJ5SW5kZXgubGVuZ3RoKCkgOiAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGVzLmtleVNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldERpcmVjdG9yeSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGNvbXBsZXRlU1NUYWJsZShQZXJTU1RhYmxlSW5kZXhXcml0ZXIgaW5kZXhXcml0ZXIsIFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgQ29sbGVjdGlvbjxDb2x1bW5JbmRleD4gaW5kZXhlcykKQEAgLTE0NSw3ICsxNDUsNyBAQAogCiAgICAgICAgIGZvciAoQ29sdW1uSW5kZXggaW5kZXggOiBpbmRleGVzKQogICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIHRtcEluZGV4ID0gbmV3IEZpbGUoc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKGluZGV4LmdldENvbXBvbmVudCgpKSk7CisgICAgICAgICAgICBGaWxlIHRtcEluZGV4ID0gc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVGb3IoaW5kZXguZ2V0Q29tcG9uZW50KCkpOwogICAgICAgICAgICAgaWYgKCF0bXBJbmRleC5leGlzdHMoKSkgLy8gbm8gZGF0YSB3YXMgaW5zZXJ0ZWQgaW50byB0aGUgaW5kZXggZm9yIGdpdmVuIHNzdGFibGUKICAgICAgICAgICAgICAgICBjb250aW51ZTsKIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9TU1RhYmxlSW5kZXguamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L3Nhc2kvU1NUYWJsZUluZGV4LmphdmEKaW5kZXggZDc1NjczNy4uZGU5YzBjMiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9TU1RhYmxlSW5kZXguamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL1NTVGFibGVJbmRleC5qYXZhCkBAIC0yMiw2ICsyMiw5IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLkhhc2hDb2RlQnVpbGRlcjsKKwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpLmNvbmYuQ29sdW1uSW5kZXg7CkBAIC0zNiwxMCArMzksNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuUmVmOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuSGFzaENvZGVCdWlsZGVyOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKLQogcHVibGljIGNsYXNzIFNTVGFibGVJbmRleAogewogICAgIHByaXZhdGUgZmluYWwgQ29sdW1uSW5kZXggY29sdW1uSW5kZXg7CkBAIC0xNzYsNyArMTc1LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNzdGFibGUua2V5QXQob2Zmc2V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3N0YWJsZS5rZXlBdFBvc2l0aW9uRnJvbVNlY29uZGFyeUluZGV4KG9mZnNldCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L3Nhc2kvY29uZi9Db2x1bW5JbmRleC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9jb25mL0NvbHVtbkluZGV4LmphdmEKaW5kZXggODFiNzc2ZC4uN2Q4Mjg3OCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9jb25mL0NvbHVtbkluZGV4LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9jb25mL0NvbHVtbkluZGV4LmphdmEKQEAgLTI4LDEzICsyOCwxMiBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5PcGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuTWVtdGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Bc2NpaVR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZS5NZW10YWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3c7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguc2FzaS5hbmFseXplci5BYnN0cmFjdEFuYWx5emVyOwpAQCAtNDcsNyArNDYsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kudXRpbHMuUmFuZ2VJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpLnV0aWxzLlJhbmdlVW5pb25JdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0LkNvbXBvbmVudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkluZGV4TWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiAKQEAgLTc4LDcgKzc5LDcgQEAKICAgICAgICAgdGhpcy5tb2RlID0gSW5kZXhNb2RlLmdldE1vZGUoY29sdW1uLCBjb25maWcpOwogICAgICAgICB0aGlzLm1lbXRhYmxlID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KG5ldyBJbmRleE1lbXRhYmxlKHRoaXMpKTsKICAgICAgICAgdGhpcy50cmFja2VyID0gbmV3IERhdGFUcmFja2VyKGtleVZhbGlkYXRvciwgdGhpcyk7Ci0gICAgICAgIHRoaXMuY29tcG9uZW50ID0gbmV3IENvbXBvbmVudChDb21wb25lbnQuVHlwZS5TRUNPTkRBUllfSU5ERVgsIFN0cmluZy5mb3JtYXQoRklMRV9OQU1FX0ZPUk1BVCwgZ2V0SW5kZXhOYW1lKCkpKTsKKyAgICAgICAgdGhpcy5jb21wb25lbnQgPSBDb21wb25lbnRzLlR5cGVzLlNFQ09OREFSWV9JTkRFWC5jcmVhdGVDb21wb25lbnQoU3RyaW5nLmZvcm1hdChGSUxFX05BTUVfRk9STUFULCBnZXRJbmRleE5hbWUoKSkpOwogICAgICAgICB0aGlzLmlzVG9rZW5pemVkID0gZ2V0QW5hbHl6ZXIoKS5pc1Rva2VuaXppbmcoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L3Nhc2kvY29uZi9EYXRhVHJhY2tlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9jb25mL0RhdGFUcmFja2VyLmphdmEKaW5kZXggYmYyMjkzZi4uOWIzZTlhYiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9jb25mL0RhdGFUcmFja2VyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9jb25mL0RhdGFUcmFja2VyLmphdmEKQEAgLTI0LDYgKzI0LDkgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAoraW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpLlNTVGFibGVJbmRleDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpLmNvbmYudmlldy5WaWV3OwpAQCAtMzEsOSArMzQsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogCi1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQogLyoqIGEgcGFyZWQtZG93biB2ZXJzaW9uIG9mIERhdGFUcmFja2VyIGFuZCBEVC5WaWV3LiBuZWVkIG9uZSBmb3IgZWFjaCBpbmRleCBvZiBlYWNoIGNvbHVtbiBmYW1pbHkgKi8KIHB1YmxpYyBjbGFzcyBEYXRhVHJhY2tlcgogewpAQCAtMTQ1LDcgKzE0NSw3IEBACiAgICAgICAgICAgICBpZiAoc3N0YWJsZS5pc01hcmtlZENvbXBhY3RlZCgpKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgICAgICBGaWxlIGluZGV4RmlsZSA9IG5ldyBGaWxlKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihjb2x1bW5JbmRleC5nZXRDb21wb25lbnQoKSkpOworICAgICAgICAgICAgRmlsZSBpbmRleEZpbGUgPSBzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZUZvcihjb2x1bW5JbmRleC5nZXRDb21wb25lbnQoKSk7CiAgICAgICAgICAgICBpZiAoIWluZGV4RmlsZS5leGlzdHMoKSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9kaXNrL09uRGlza0luZGV4LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL2Rpc2svT25EaXNrSW5kZXguamF2YQppbmRleCBlNDM4MDc5Li44OGIyNzJhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL2Rpc2svT25EaXNrSW5kZXguamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL2Rpc2svT25EaXNrSW5kZXguamF2YQpAQCAtMTcsMjEgKzE3LDMzIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguc2FzaS5kaXNrOwogCi1pbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTmF2aWdhYmxlTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYXRvcnM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5QZWVraW5nSXRlcmF0b3I7CisKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguc2FzaS5UZXJtOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kucGxhbi5FeHByZXNzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kucGxhbi5FeHByZXNzaW9uLk9wOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kudXRpbHMuTWFwcGVkQnVmZmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kudXRpbHMuUmFuZ2VVbmlvbkl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kudXRpbHMuQWJzdHJhY3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpLnV0aWxzLk1hcHBlZEJ1ZmZlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpLnV0aWxzLlJhbmdlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguc2FzaS51dGlscy5SYW5nZVVuaW9uSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNSZWFkRXJyb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5DaGFubmVsUHJveHk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwpAQCAtNDAsMTEgKzUyLDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIAotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYXRvcnM7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5QZWVraW5nSXRlcmF0b3I7Ci0KIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguc2FzaS5kaXNrLk9uRGlza0Jsb2NrLlNlYXJjaFJlc3VsdDsKIAogcHVibGljIGNsYXNzIE9uRGlza0luZGV4IGltcGxlbWVudHMgSXRlcmFibGU8T25EaXNrSW5kZXguRGF0YVRlcm0+LCBDbG9zZWFibGUKQEAgLTE0NCw3ICsxNTEsNyBAQAogCiAgICAgICAgICAgICBGaWxlQ2hhbm5lbCBjaGFubmVsID0gaW5kZXgubmV3UmVhZENoYW5uZWwoKTsKICAgICAgICAgICAgIGluZGV4U2l6ZSA9IGNoYW5uZWwuc2l6ZSgpOwotICAgICAgICAgICAgaW5kZXhGaWxlID0gbmV3IE1hcHBlZEJ1ZmZlcihuZXcgQ2hhbm5lbFByb3h5KGluZGV4UGF0aCwgY2hhbm5lbCkpOworICAgICAgICAgICAgaW5kZXhGaWxlID0gbmV3IE1hcHBlZEJ1ZmZlcihuZXcgQ2hhbm5lbFByb3h5KGluZGV4LCBjaGFubmVsKSk7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L3Nhc2kvZGlzay9QZXJTU1RhYmxlSW5kZXhXcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L3Nhc2kvZGlzay9QZXJTU1RhYmxlSW5kZXhXcml0ZXIuamF2YQppbmRleCBmYjVlOWI5Li5mODlmZjYyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL2Rpc2svUGVyU1NUYWJsZUluZGV4V3JpdGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9kaXNrL1BlclNTVGFibGVJbmRleFdyaXRlci5qYXZhCkBAIC0yMSwzNSArMjEsMzcgQEAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvclBsdXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3c7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kuYW5hbHl6ZXIuQWJzdHJhY3RBbmFseXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpLmNvbmYuQ29sdW1uSW5kZXg7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguc2FzaS51dGlscy5Db21iaW5lZFRlcm1JdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpLnV0aWxzLlR5cGVVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTRXJyb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGbHVzaE9ic2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZUZsdXNoT2JzZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5JbW1lZGlhdGVGdXR1cmU7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7Ci0KLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRXhlY3V0b3JGYWN0b3J5Lkdsb2JhbC5leGVjdXRvckZhY3Rvcnk7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5Db3VudERvd25MYXRjaC5uZXdDb3VudERvd25MYXRjaDsKQEAgLTk4LDE1ICsxMDAsMjQgQEAKICAgICAgICAgICAgIGluZGV4ZXMucHV0KGVudHJ5LmdldEtleSgpLCBuZXdJbmRleChlbnRyeS5nZXRWYWx1ZSgpKSk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYmVnaW4oKQogICAgIHt9CiAKLSAgICBwdWJsaWMgdm9pZCBzdGFydFBhcnRpdGlvbihEZWNvcmF0ZWRLZXkga2V5LCBsb25nIGN1clBvc2l0aW9uKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0UGFydGl0aW9uKERlY29yYXRlZEtleSBrZXksIGxvbmcga2V5UG9zaXRpb24sIGxvbmcgS2V5UG9zaXRpb25Gb3JTQVNJKQogICAgIHsKICAgICAgICAgY3VycmVudEtleSA9IGtleTsKLSAgICAgICAgY3VycmVudEtleVBvc2l0aW9uID0gY3VyUG9zaXRpb247CisgICAgICAgIGN1cnJlbnRLZXlQb3NpdGlvbiA9IEtleVBvc2l0aW9uRm9yU0FTSTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdGF0aWNSb3coUm93IHN0YXRpY1JvdykKKyAgICB7CisgICAgICAgIG5leHRVbmZpbHRlcmVkQ2x1c3RlcihzdGF0aWNSb3cpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG5leHRVbmZpbHRlcmVkQ2x1c3RlcihVbmZpbHRlcmVkIHVuZmlsdGVyZWQpCiAgICAgewogICAgICAgICBpZiAoIXVuZmlsdGVyZWQuaXNSb3coKSkKQEAgLTEyNiw2ICsxMzcsNyBAQAogICAgICAgICB9KTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZSgpCiAgICAgewogICAgICAgICBpZiAoaXNDb21wbGV0ZSkKQEAgLTE2OCw3ICsxODAsNyBAQAogICAgIHByb3RlY3RlZCBjbGFzcyBJbmRleAogICAgIHsKICAgICAgICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgb3V0cHV0RmlsZTsKKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEZpbGUgb3V0cHV0RmlsZTsKIAogICAgICAgICBwcml2YXRlIGZpbmFsIENvbHVtbkluZGV4IGNvbHVtbkluZGV4OwogICAgICAgICBwcml2YXRlIGZpbmFsIEFic3RyYWN0QW5hbHl6ZXIgYW5hbHl6ZXI7CkBAIC0xODMsNyArMTk1LDcgQEAKICAgICAgICAgcHVibGljIEluZGV4KENvbHVtbkluZGV4IGNvbHVtbkluZGV4KQogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzLmNvbHVtbkluZGV4ID0gY29sdW1uSW5kZXg7Ci0gICAgICAgICAgICB0aGlzLm91dHB1dEZpbGUgPSBkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKGNvbHVtbkluZGV4LmdldENvbXBvbmVudCgpKTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0RmlsZSA9IGRlc2NyaXB0b3IuZmlsZUZvcihjb2x1bW5JbmRleC5nZXRDb21wb25lbnQoKSk7CiAgICAgICAgICAgICB0aGlzLmFuYWx5emVyID0gY29sdW1uSW5kZXguZ2V0QW5hbHl6ZXIoKTsKICAgICAgICAgICAgIHRoaXMuc2VnbWVudHMgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgICAgICAgICB0aGlzLm1heE1lbW9yeVNpemUgPSBtYXhNZW1vcnlTaXplKGNvbHVtbkluZGV4KTsKQEAgLTI0NCwxNSArMjU2LDE0IEBACiAgICAgICAgICAgICBmaW5hbCBPbkRpc2tJbmRleEJ1aWxkZXIgYnVpbGRlciA9IGN1cnJlbnRCdWlsZGVyOwogICAgICAgICAgICAgY3VycmVudEJ1aWxkZXIgPSBuZXdJbmRleEJ1aWxkZXIoKTsKIAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNlZ21lbnRGaWxlID0gZmlsZW5hbWUoaXNGaW5hbCk7CisgICAgICAgICAgICBmaW5hbCBGaWxlIHNlZ21lbnRGaWxlID0gZmlsZShpc0ZpbmFsKTsKIAogICAgICAgICAgICAgcmV0dXJuICgpIC0+IHsKICAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gbmFub1RpbWUoKTsKIAogICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBpbmRleCA9IG5ldyBGaWxlKHNlZ21lbnRGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoKGluZGV4KSA/IG5ldyBPbkRpc2tJbmRleChpbmRleCwgY29sdW1uSW5kZXguZ2V0VmFsaWRhdG9yKCksIG51bGwpIDogbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoKHNlZ21lbnRGaWxlKSA/IG5ldyBPbkRpc2tJbmRleChzZWdtZW50RmlsZSwgY29sdW1uSW5kZXguZ2V0VmFsaWRhdG9yKCksIG51bGwpIDogbnVsbDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB8IEZTRXJyb3IgZSkKICAgICAgICAgICAgICAgICB7CkBAIC0zMTAsMTMgKzMyMSwxMyBAQAogCiAgICAgICAgICAgICAgICAgICAgIE9uRGlza0luZGV4QnVpbGRlciBidWlsZGVyID0gbmV3SW5kZXhCdWlsZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuZmluaXNoKFBhaXIuY3JlYXRlKGNvbWJpbmVkTWluLCBjb21iaW5lZE1heCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKG91dHB1dEZpbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tYmluZWRUZXJtSXRlcmF0b3IocGFydHMpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB8IEZTRXJyb3IgZSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiRmFpbGVkIHRvIGZsdXNoIGluZGV4IHt9LiIsIG91dHB1dEZpbGUsIGUpOwotICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuZGVsZXRlKG91dHB1dEZpbGUpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRGaWxlLnRyeURlbGV0ZSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmaW5hbGx5CiAgICAgICAgICAgICAgICAgewpAQCAtMzMwLDcgKzM0MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydCAhPSBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZVF1aWV0bHkocGFydCk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5kZWxldGUob3V0cHV0RmlsZSArICJfIiArIHNlZ21lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZS53aXRoU3VmZml4KCJfIiArIHNlZ21lbnQpLnRyeURlbGV0ZSgpOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgbGF0Y2guZGVjcmVtZW50KCk7CkBAIC0zNDgsOSArMzU5LDkgQEAKICAgICAgICAgICAgIHJldHVybiBuZXcgT25EaXNrSW5kZXhCdWlsZGVyKGtleVZhbGlkYXRvciwgY29sdW1uSW5kZXguZ2V0VmFsaWRhdG9yKCksIGNvbHVtbkluZGV4LmdldE1vZGUoKS5tb2RlKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZmlsZW5hbWUoYm9vbGVhbiBpc0ZpbmFsKQorICAgICAgICBwdWJsaWMgRmlsZSBmaWxlKGJvb2xlYW4gaXNGaW5hbCkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG91dHB1dEZpbGUgKyAoaXNGaW5hbCA/ICIiIDogIl8iICsgc2VnbWVudE51bWJlcisrKTsKKyAgICAgICAgICAgIHJldHVybiBpc0ZpbmFsID8gb3V0cHV0RmlsZSA6IG91dHB1dEZpbGUud2l0aFN1ZmZpeCgiXyIgKyBzZWdtZW50TnVtYmVyKyspOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9JR2VuZXJpY1NlcmlhbGl6ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL0lHZW5lcmljU2VyaWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZTIxY2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9JR2VuZXJpY1NlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvOworCitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXQ7CitpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0OworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBpbnRlcmZhY2UgSUdlbmVyaWNTZXJpYWxpemVyPFQsIEkgZXh0ZW5kcyBEYXRhSW5wdXQsIE8gZXh0ZW5kcyBEYXRhT3V0cHV0PgoreworICAgIHZvaWQgc2VyaWFsaXplKFQgdCwgTyBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIFQgZGVzZXJpYWxpemUoSSBpbikgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgbG9uZyBzZXJpYWxpemVkU2l6ZShUIHQpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vSVNlcmlhbGl6ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL0lTZXJpYWxpemVyLmphdmEKaW5kZXggNjM3YTFjNy4uZGE5MDQ5ZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vSVNlcmlhbGl6ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9JU2VyaWFsaXplci5qYXZhCkBAIC0yMiw3ICsyMiw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CiAKLXB1YmxpYyBpbnRlcmZhY2UgSVNlcmlhbGl6ZXI8VD4KK3B1YmxpYyBpbnRlcmZhY2UgSVNlcmlhbGl6ZXI8VD4gZXh0ZW5kcyBJR2VuZXJpY1NlcmlhbGl6ZXI8VCwgRGF0YUlucHV0UGx1cywgRGF0YU91dHB1dFBsdXM+CiB7CiAgICAgLyoqCiAgICAgICogU2VyaWFsaXplIHRoZSBzcGVjaWZpZWQgdHlwZSBpbnRvIHRoZSBzcGVjaWZpZWQgRGF0YU91dHB1dCBpbnN0YW5jZS4KQEAgLTMyLDcgKzMyLDggQEAKICAgICAgKiBAcGFyYW0gb3V0IERhdGFPdXRwdXQgaW50byB3aGljaCBzZXJpYWxpemF0aW9uIG5lZWRzIHRvIGhhcHBlbi4KICAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoVCB0LCBEYXRhT3V0cHV0UGx1cyBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIHNlcmlhbGl6ZShUIHQsIERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogRGVzZXJpYWxpemUgZnJvbSB0aGUgc3BlY2lmaWVkIERhdGFJbnB1dCBpbnN0YW5jZS4KQEAgLTQwLDExICs0MSwxMyBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIHRoYXQgd2FzIGRlc2VyaWFsaXplZAogICAgICAqLwotICAgIHB1YmxpYyBUIGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICBAT3ZlcnJpZGUKKyAgICBUIGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbjsKIAotICAgIHB1YmxpYyBsb25nIHNlcmlhbGl6ZWRTaXplKFQgdCk7CisgICAgQE92ZXJyaWRlCisgICAgbG9uZyBzZXJpYWxpemVkU2l6ZShUIHQpOwogCi0gICAgcHVibGljIGRlZmF1bHQgdm9pZCBza2lwKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIGRlZmF1bHQgdm9pZCBza2lwKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgZGVzZXJpYWxpemUoaW4pOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2NvbXByZXNzL0NvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9jb21wcmVzcy9Db21wcmVzc2VkU2VxdWVudGlhbFdyaXRlci5qYXZhCmluZGV4IDAyNGU0ZWYuLjdkNTRlMDkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2NvbXByZXNzL0NvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vY29tcHJlc3MvQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIuamF2YQpAQCAtMjksNyArMjksMTIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU1dyaXRlRXJyb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db3JydXB0U1NUYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkNoZWNrc3VtV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YVBvc2l0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNlcXVlbnRpYWxXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyT3B0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wcmVzc2lvblBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIApAQCAtNjYsMTQgKzcxLDE0IEBACiAgICAgICogQ3JlYXRlIENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyIHdpdGhvdXQgZGlnZXN0IGZpbGUuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZmlsZSBGaWxlIHRvIHdyaXRlCi0gICAgICogQHBhcmFtIG9mZnNldHNQYXRoIEZpbGUgbmFtZSB0byB3cml0ZSBjb21wcmVzc2lvbiBtZXRhZGF0YQorICAgICAqIEBwYXJhbSBvZmZzZXRzRmlsZSBGaWxlIHRvIHdyaXRlIGNvbXByZXNzaW9uIG1ldGFkYXRhCiAgICAgICogQHBhcmFtIGRpZ2VzdEZpbGUgRmlsZSB0byB3cml0ZSBkaWdlc3QKICAgICAgKiBAcGFyYW0gb3B0aW9uIFdyaXRlIG9wdGlvbiAoYnVmZmVyIHNpemUgYW5kIHR5cGUgd2lsbCBiZSBzZXQgdGhlIHNhbWUgYXMgY29tcHJlc3Npb24gcGFyYW1zKQogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbXByZXNzaW9uIG1wYXJhbWV0ZXJzCiAgICAgICogQHBhcmFtIHNzdGFibGVNZXRhZGF0YUNvbGxlY3RvciBNZXRhZGF0YSBjb2xsZWN0b3IKICAgICAgKi8KICAgICBwdWJsaWMgQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIoRmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb2Zmc2V0c1BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgb2Zmc2V0c0ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZGlnZXN0RmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVudGlhbFdyaXRlck9wdGlvbiBvcHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uUGFyYW1zIHBhcmFtZXRlcnMsCkBAIC05NSw3ICsxMDAsNyBAQAogICAgICAgICBtYXhDb21wcmVzc2VkTGVuZ3RoID0gcGFyYW1ldGVycy5tYXhDb21wcmVzc2VkTGVuZ3RoKCk7CiAKICAgICAgICAgLyogSW5kZXggRmlsZSAoLUNvbXByZXNzaW9uSW5mby5kYiBjb21wb25lbnQpIGFuZCBpdCdzIGhlYWRlciAqLwotICAgICAgICBtZXRhZGF0YVdyaXRlciA9IENvbXByZXNzaW9uTWV0YWRhdGEuV3JpdGVyLm9wZW4ocGFyYW1ldGVycywgb2Zmc2V0c1BhdGgpOworICAgICAgICBtZXRhZGF0YVdyaXRlciA9IENvbXByZXNzaW9uTWV0YWRhdGEuV3JpdGVyLm9wZW4ocGFyYW1ldGVycywgb2Zmc2V0c0ZpbGUpOwogCiAgICAgICAgIHRoaXMuc3N0YWJsZU1ldGFkYXRhQ29sbGVjdG9yID0gc3N0YWJsZU1ldGFkYXRhQ29sbGVjdG9yOwogICAgICAgICBjcmNNZXRhZGF0YSA9IG5ldyBDaGVja3N1bVdyaXRlcihuZXcgRGF0YU91dHB1dFN0cmVhbShDaGFubmVscy5uZXdPdXRwdXRTdHJlYW0oY2hhbm5lbCkpKTsKQEAgLTM5Nyw0ICs0MDIsNCBAQAogICAgICAgICAgICAgdGhpcy5uZXh0Q2h1bmtJbmRleCA9IG5leHRDaHVua0luZGV4OwogICAgICAgICB9CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2NvbXByZXNzL0NvbXByZXNzaW9uTWV0YWRhdGEuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2NvbXByZXNzL0NvbXByZXNzaW9uTWV0YWRhdGEuamF2YQppbmRleCA1YWY5YzkyLi5kMmZhYjMwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9jb21wcmVzcy9Db21wcmVzc2lvbk1ldGFkYXRhLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vY29tcHJlc3MvQ29tcHJlc3Npb25NZXRhZGF0YS5qYXZhCkBAIC0xNywxNCArMTcsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzczsKIAotaW1wb3J0IGphdmEubmlvLmZpbGUuTm9TdWNoRmlsZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dDsKIGltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXQ7CiBpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLio7CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLk5vU3VjaEZpbGVFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKQEAgLTMyLDcgKzI5LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLkxvbmdzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzOwpAQCAtNDAsMTggKzM2LDI1IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNSZWFkRXJyb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNXcml0ZUVycm9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLklWZXJzaW9uZWRTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29ycnVwdFNTVGFibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUlucHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVPdXRwdXRTdHJlYW1QbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuTWVtb3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2FmZU1lbW9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29tcHJlc3Npb25QYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5UcmFuc2FjdGlvbmFsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuUmVmOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuVHJhbnNhY3Rpb25hbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LldyYXBwZWRTaGFyZWRDbG9zZWFibGU7CiAKIC8qKgogICogSG9sZHMgbWV0YWRhdGEgYWJvdXQgY29tcHJlc3NlZCBmaWxlCisgKiBUT0RPIGV4dHJhY3QgaW50ZXJmYWNlIElDb21wcmVzc2lvbk1ldGFkYXRhIHdoaWNoIHdpbGwganVzdCBwcm92aWRlIG5vbi1yZXNvdXJjZSBwcm9wZXJ0aWVzCiAgKi8KLXB1YmxpYyBjbGFzcyBDb21wcmVzc2lvbk1ldGFkYXRhCitwdWJsaWMgY2xhc3MgQ29tcHJlc3Npb25NZXRhZGF0YSBleHRlbmRzIFdyYXBwZWRTaGFyZWRDbG9zZWFibGUKIHsKICAgICAvLyBkYXRhTGVuZ3RoIGNhbiByZXByZXNlbnQgZWl0aGVyIHRoZSB0cnVlIGxlbmd0aCBvZiB0aGUgZmlsZQogICAgIC8vIG9yIHNvbWUgc2hvcnRlciB2YWx1ZSwgaW4gdGhlIGNhc2Ugd2Ugd2FudCB0byBpbXBvc2UgYSBzaG9ydGVyIGxpbWl0IG9uIHJlYWRlcnMKQEAgLTYwLDQyICs2MywxOCBAQAogICAgIHB1YmxpYyBmaW5hbCBsb25nIGNvbXByZXNzZWRGaWxlTGVuZ3RoOwogICAgIHByaXZhdGUgZmluYWwgTWVtb3J5IGNodW5rT2Zmc2V0czsKICAgICBwcml2YXRlIGZpbmFsIGxvbmcgY2h1bmtPZmZzZXRzU2l6ZTsKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGluZGV4RmlsZVBhdGg7CisgICAgcHVibGljIGZpbmFsIEZpbGUgY2h1bmtzSW5kZXhGaWxlOwogICAgIHB1YmxpYyBmaW5hbCBDb21wcmVzc2lvblBhcmFtcyBwYXJhbWV0ZXJzOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIG1ldGFkYXRhIGFib3V0IGdpdmVuIGNvbXByZXNzZWQgZmlsZSBpbmNsdWRpbmcgdW5jb21wcmVzc2VkIGRhdGEgbGVuZ3RoLCBjaHVuayBzaXplCi0gICAgICogYW5kIGxpc3Qgb2YgdGhlIGNodW5rIG9mZnNldHMgb2YgdGhlIGNvbXByZXNzZWQgZGF0YS4KLSAgICAgKgotICAgICAqIFRoaXMgaXMgYW4gZXhwZW5zaXZlIG9wZXJhdGlvbiEgRG9uJ3QgY3JlYXRlIG1vcmUgdGhhbiBvbmUgZm9yIGVhY2gKLSAgICAgKiBzc3RhYmxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGRhdGFGaWxlUGF0aCBQYXRoIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUKLSAgICAgKgotICAgICAqIEByZXR1cm4gbWV0YWRhdGEgYWJvdXQgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29tcHJlc3Npb25NZXRhZGF0YSBjcmVhdGUoU3RyaW5nIGRhdGFGaWxlUGF0aCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVXaXRoTGVuZ3RoKGRhdGFGaWxlUGF0aCwgbmV3IEZpbGUoZGF0YUZpbGVQYXRoKS5sZW5ndGgoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb21wcmVzc2lvbk1ldGFkYXRhIGNyZWF0ZVdpdGhMZW5ndGgoU3RyaW5nIGRhdGFGaWxlUGF0aCwgbG9uZyBjb21wcmVzc2VkTGVuZ3RoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb21wcmVzc2lvbk1ldGFkYXRhKERlc2NyaXB0b3IuZnJvbUZpbGVuYW1lKGRhdGFGaWxlUGF0aCksIGNvbXByZXNzZWRMZW5ndGgpOwotICAgIH0KLQogICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHB1YmxpYyBDb21wcmVzc2lvbk1ldGFkYXRhKERlc2NyaXB0b3IgZGVzYywgbG9uZyBjb21wcmVzc2VkTGVuZ3RoKQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBDb21wcmVzc2lvbk1ldGFkYXRhIG9wZW4oRmlsZSBjaHVua3NJbmRleEZpbGUsIGxvbmcgY29tcHJlc3NlZExlbmd0aCwgYm9vbGVhbiBoYXNNYXhDb21wcmVzc2VkU2l6ZSkKICAgICB7Ci0gICAgICAgIHRoaXMoZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuQ09NUFJFU1NJT05fSU5GTyksIGNvbXByZXNzZWRMZW5ndGgsIGRlc2MudmVyc2lvbi5oYXNNYXhDb21wcmVzc2VkTGVuZ3RoKCkpOwotICAgIH0KKyAgICAgICAgQ29tcHJlc3Npb25QYXJhbXMgcGFyYW1ldGVyczsKKyAgICAgICAgbG9uZyBkYXRhTGVuZ3RoOworICAgICAgICBNZW1vcnkgY2h1bmtPZmZzZXRzOwogCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgcHVibGljIENvbXByZXNzaW9uTWV0YWRhdGEoU3RyaW5nIGluZGV4RmlsZVBhdGgsIGxvbmcgY29tcHJlc3NlZExlbmd0aCwgYm9vbGVhbiBoYXNNYXhDb21wcmVzc2VkU2l6ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuaW5kZXhGaWxlUGF0aCA9IGluZGV4RmlsZVBhdGg7Ci0KLSAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW1QbHVzIHN0cmVhbSA9IG5ldyBGaWxlKGluZGV4RmlsZVBhdGgpLm5ld0lucHV0U3RyZWFtKCkpCisgICAgICAgIHRyeSAoRmlsZUlucHV0U3RyZWFtUGx1cyBzdHJlYW0gPSBjaHVua3NJbmRleEZpbGUubmV3SW5wdXRTdHJlYW0oKSkKICAgICAgICAgewogICAgICAgICAgICAgU3RyaW5nIGNvbXByZXNzb3JOYW1lID0gc3RyZWFtLnJlYWRVVEYoKTsKICAgICAgICAgICAgIGludCBvcHRpb25Db3VudCA9IHN0cmVhbS5yZWFkSW50KCk7CkBAIC0xMjAsNyArOTksNiBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBkYXRhTGVuZ3RoID0gc3RyZWFtLnJlYWRMb25nKCk7Ci0gICAgICAgICAgICBjb21wcmVzc2VkRmlsZUxlbmd0aCA9IGNvbXByZXNzZWRMZW5ndGg7CiAgICAgICAgICAgICBjaHVua09mZnNldHMgPSByZWFkQ2h1bmtPZmZzZXRzKHN0cmVhbSk7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB8IE5vU3VjaEZpbGVFeGNlcHRpb24gZSkKQEAgLTEyOSwyMiArMTA3LDM5IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihlLCBpbmRleEZpbGVQYXRoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihlLCBjaHVua3NJbmRleEZpbGUpOwogICAgICAgICB9CiAKLSAgICAgICAgdGhpcy5jaHVua09mZnNldHNTaXplID0gY2h1bmtPZmZzZXRzLnNpemUoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDb21wcmVzc2lvbk1ldGFkYXRhKGNodW5rc0luZGV4RmlsZSwgcGFyYW1ldGVycywgY2h1bmtPZmZzZXRzLCBjaHVua09mZnNldHMuc2l6ZSgpLCBkYXRhTGVuZ3RoLCBjb21wcmVzc2VkTGVuZ3RoKTsKICAgICB9CiAKICAgICAvLyBkbyBub3QgY2FsbCB0aGlzIGNvbnN0cnVjdG9yIGRpcmVjdGx5LCB1bmxlc3MgdXNlZCBpbiB0ZXN0aW5nCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgcHVibGljIENvbXByZXNzaW9uTWV0YWRhdGEoU3RyaW5nIGZpbGVQYXRoLCBDb21wcmVzc2lvblBhcmFtcyBwYXJhbWV0ZXJzLCBNZW1vcnkgb2Zmc2V0cywgbG9uZyBvZmZzZXRzU2l6ZSwgbG9uZyBkYXRhTGVuZ3RoLCBsb25nIGNvbXByZXNzZWRMZW5ndGgpCisgICAgcHVibGljIENvbXByZXNzaW9uTWV0YWRhdGEoRmlsZSBjaHVua3NJbmRleEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb25QYXJhbXMgcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1vcnkgY2h1bmtPZmZzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgY2h1bmtPZmZzZXRzU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRhdGFMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBjb21wcmVzc2VkRmlsZUxlbmd0aCkKICAgICB7Ci0gICAgICAgIHRoaXMuaW5kZXhGaWxlUGF0aCA9IGZpbGVQYXRoOworICAgICAgICBzdXBlcihjaHVua09mZnNldHMpOworICAgICAgICB0aGlzLmNodW5rc0luZGV4RmlsZSA9IGNodW5rc0luZGV4RmlsZTsKICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKICAgICAgICAgdGhpcy5kYXRhTGVuZ3RoID0gZGF0YUxlbmd0aDsKLSAgICAgICAgdGhpcy5jb21wcmVzc2VkRmlsZUxlbmd0aCA9IGNvbXByZXNzZWRMZW5ndGg7Ci0gICAgICAgIHRoaXMuY2h1bmtPZmZzZXRzID0gb2Zmc2V0czsKLSAgICAgICAgdGhpcy5jaHVua09mZnNldHNTaXplID0gb2Zmc2V0c1NpemU7CisgICAgICAgIHRoaXMuY29tcHJlc3NlZEZpbGVMZW5ndGggPSBjb21wcmVzc2VkRmlsZUxlbmd0aDsKKyAgICAgICAgdGhpcy5jaHVua09mZnNldHMgPSBjaHVua09mZnNldHM7CisgICAgICAgIHRoaXMuY2h1bmtPZmZzZXRzU2l6ZSA9IGNodW5rT2Zmc2V0c1NpemU7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb21wcmVzc2lvbk1ldGFkYXRhKENvbXByZXNzaW9uTWV0YWRhdGEgY29weSkKKyAgICB7CisgICAgICAgIHN1cGVyKGNvcHkpOworICAgICAgICB0aGlzLmNodW5rc0luZGV4RmlsZSA9IGNvcHkuY2h1bmtzSW5kZXhGaWxlOworICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBjb3B5LnBhcmFtZXRlcnM7CisgICAgICAgIHRoaXMuZGF0YUxlbmd0aCA9IGNvcHkuZGF0YUxlbmd0aDsKKyAgICAgICAgdGhpcy5jb21wcmVzc2VkRmlsZUxlbmd0aCA9IGNvcHkuY29tcHJlc3NlZEZpbGVMZW5ndGg7CisgICAgICAgIHRoaXMuY2h1bmtPZmZzZXRzID0gY29weS5jaHVua09mZnNldHM7CisgICAgICAgIHRoaXMuY2h1bmtPZmZzZXRzU2l6ZSA9IGNvcHkuY2h1bmtPZmZzZXRzU2l6ZTsKICAgICB9CiAKICAgICBwdWJsaWMgSUNvbXByZXNzb3IgY29tcHJlc3NvcigpCkBAIC0xNzEsMTEgKzE2NiwxOSBAQAogICAgICAgICByZXR1cm4gY2h1bmtPZmZzZXRzLnNpemUoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRUbyhSZWYuSWRlbnRpdHlDb2xsZWN0aW9uIGlkZW50aXRpZXMpCiAgICAgeworICAgICAgICBzdXBlci5hZGRUbyhpZGVudGl0aWVzKTsKICAgICAgICAgaWRlbnRpdGllcy5hZGQoY2h1bmtPZmZzZXRzKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29tcHJlc3Npb25NZXRhZGF0YSBzaGFyZWRDb3B5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQ29tcHJlc3Npb25NZXRhZGF0YSh0aGlzKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZWFkIG9mZnNldHMgb2YgdGhlIGluZGl2aWR1YWwgY2h1bmtzIGZyb20gdGhlIGdpdmVuIGlucHV0LgogICAgICAqCkBAIC0xODMsNyArMTg2LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gY29sbGVjdGlvbiBvZiB0aGUgY2h1bmsgb2Zmc2V0cy4KICAgICAgKi8KLSAgICBwcml2YXRlIE1lbW9yeSByZWFkQ2h1bmtPZmZzZXRzKERhdGFJbnB1dCBpbnB1dCkKKyAgICBwcml2YXRlIHN0YXRpYyBNZW1vcnkgcmVhZENodW5rT2Zmc2V0cyhGaWxlSW5wdXRTdHJlYW1QbHVzIGlucHV0KQogICAgIHsKICAgICAgICAgZmluYWwgaW50IGNodW5rQ291bnQ7CiAgICAgICAgIHRyeQpAQCAtMTk0LDcgKzE5Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBGU1JlYWRFcnJvcihlLCBpbmRleEZpbGVQYXRoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBGU1JlYWRFcnJvcihlLCBpbnB1dC5maWxlKTsKICAgICAgICAgfQogCiAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCkBAIC0yMTgsMTAgKzIyMSwxMCBAQAogICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFT0ZFeGNlcHRpb24pCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoIkNvcnJ1cHRlZCBJbmRleCBGaWxlICVzOiByZWFkICVkIGJ1dCBleHBlY3RlZCAlZCBjaHVua3MuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEZpbGVQYXRoLCBpLCBjaHVua0NvdW50KTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24obmV3IElPRXhjZXB0aW9uKG1zZywgZSksIGluZGV4RmlsZVBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmZpbGUucGF0aCgpLCBpLCBjaHVua0NvdW50KTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24obmV3IElPRXhjZXB0aW9uKG1zZywgZSksIGlucHV0LmZpbGUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IEZTUmVhZEVycm9yKGUsIGluZGV4RmlsZVBhdGgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEZTUmVhZEVycm9yKGUsIGlucHV0LmZpbGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMzcsMTEgKzI0MCwxMSBAQAogICAgICAgICBsb25nIGlkeCA9IDggKiAocG9zaXRpb24gLyBwYXJhbWV0ZXJzLmNodW5rTGVuZ3RoKCkpOwogCiAgICAgICAgIGlmIChpZHggPj0gY2h1bmtPZmZzZXRzU2l6ZSkKLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihuZXcgRU9GRXhjZXB0aW9uKCksIGluZGV4RmlsZVBhdGgpOworICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKG5ldyBFT0ZFeGNlcHRpb24oKSwgY2h1bmtzSW5kZXhGaWxlKTsKIAogICAgICAgICBpZiAoaWR4IDwgMCkKICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkludmFsaWQgbmVnYXRpdmUgY2h1bmsgaW5kZXggJWQgd2l0aCBwb3NpdGlvbiAlZCIsIGlkeCwgcG9zaXRpb24pKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEZpbGVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua3NJbmRleEZpbGUpOwogCiAgICAgICAgIGxvbmcgY2h1bmtPZmZzZXQgPSBjaHVua09mZnNldHMuZ2V0TG9uZyhpZHgpOwogICAgICAgICBsb25nIG5leHRDaHVua09mZnNldCA9IChpZHggKyA4ID09IGNodW5rT2Zmc2V0c1NpemUpCkBAIC0yNTEsNiArMjU0LDI4IEBACiAgICAgICAgIHJldHVybiBuZXcgQ2h1bmsoY2h1bmtPZmZzZXQsIChpbnQpIChuZXh0Q2h1bmtPZmZzZXQgLSBjaHVua09mZnNldCAtIDQpKTsgLy8gIjQiIGJ5dGVzIHJlc2VydmVkIGZvciBjaGVja3N1bQogICAgIH0KIAorICAgIHB1YmxpYyBsb25nIGdldERhdGFPZmZzZXRGb3JDaHVua09mZnNldChsb25nIGNodW5rT2Zmc2V0KQorICAgIHsKKyAgICAgICAgbG9uZyBsID0gMDsKKyAgICAgICAgbG9uZyBoID0gKGNodW5rT2Zmc2V0c1NpemUgPj4gMykgLSAxOworICAgICAgICBsb25nIGlkeCwgb2Zmc2V0OworCisgICAgICAgIHdoaWxlIChsIDw9IGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlkeCA9IChsICsgaCkgPj4+IDE7CisgICAgICAgICAgICBvZmZzZXQgPSBjaHVua09mZnNldHMuZ2V0TG9uZyhpZHggPDwgMyk7CisKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPCBjaHVua09mZnNldCkKKyAgICAgICAgICAgICAgICBsID0gaWR4ICsgMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKG9mZnNldCA+IGNodW5rT2Zmc2V0KQorICAgICAgICAgICAgICAgIGggPSBpZHggLSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBpZHggKiBwYXJhbWV0ZXJzLmNodW5rTGVuZ3RoKCk7CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJObyBjaHVuayB3aXRoIG9mZnNldCAiICsgY2h1bmtPZmZzZXQpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEBwYXJhbSBzZWN0aW9ucyBDb2xsZWN0aW9uIG9mIHNlY3Rpb25zIGluIHVuY29tcHJlc3NlZCBmaWxlLiBTaG91bGQgbm90IGNvbnRhaW4gc2VjdGlvbnMgdGhhdCBvdmVybGFwIGVhY2ggb3RoZXIuCiAgICAgICogQHJldHVybiBUb3RhbCBjaHVuayBzaXplIGluIGJ5dGVzIGZvciBnaXZlbiBzZWN0aW9ucyBpbmNsdWRpbmcgY2hlY2tzdW0uCkBAIC0zMTUsMTYgKzM0MCwxMSBAQAogICAgICAgICByZXR1cm4gb2Zmc2V0cy50b0FycmF5KG5ldyBDaHVua1tvZmZzZXRzLnNpemUoKV0pOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKLSAgICB7Ci0gICAgICAgIGNodW5rT2Zmc2V0cy5jbG9zZSgpOwotICAgIH0KLQogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV3JpdGVyIGV4dGVuZHMgVHJhbnNhY3Rpb25hbC5BYnN0cmFjdFRyYW5zYWN0aW9uYWwgaW1wbGVtZW50cyBUcmFuc2FjdGlvbmFsCiAgICAgewogICAgICAgICAvLyBwYXRoIHRvIHRoZSBmaWxlCiAgICAgICAgIHByaXZhdGUgZmluYWwgQ29tcHJlc3Npb25QYXJhbXMgcGFyYW1ldGVyczsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmlsZVBhdGg7CisgICAgICAgIHByaXZhdGUgZmluYWwgRmlsZSBmaWxlOwogICAgICAgICBwcml2YXRlIGludCBtYXhDb3VudCA9IDEwMDsKICAgICAgICAgcHJpdmF0ZSBTYWZlTWVtb3J5IG9mZnNldHMgPSBuZXcgU2FmZU1lbW9yeShtYXhDb3VudCAqIDhMKTsKICAgICAgICAgcHJpdmF0ZSBpbnQgY291bnQgPSAwOwpAQCAtMzMyLDE1ICszNTIsMTUgQEAKICAgICAgICAgLy8gcHJvdmlkZWQgYnkgdXNlciB3aGVuIHNldERlc2NyaXB0b3IKICAgICAgICAgcHJpdmF0ZSBsb25nIGRhdGFMZW5ndGgsIGNodW5rQ291bnQ7CiAKLSAgICAgICAgcHJpdmF0ZSBXcml0ZXIoQ29tcHJlc3Npb25QYXJhbXMgcGFyYW1ldGVycywgU3RyaW5nIHBhdGgpCisgICAgICAgIHByaXZhdGUgV3JpdGVyKENvbXByZXNzaW9uUGFyYW1zIHBhcmFtZXRlcnMsIEZpbGUgZmlsZSkKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKLSAgICAgICAgICAgIGZpbGVQYXRoID0gcGF0aDsKKyAgICAgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgc3RhdGljIFdyaXRlciBvcGVuKENvbXByZXNzaW9uUGFyYW1zIHBhcmFtZXRlcnMsIFN0cmluZyBwYXRoKQorICAgICAgICBwdWJsaWMgc3RhdGljIFdyaXRlciBvcGVuKENvbXByZXNzaW9uUGFyYW1zIHBhcmFtZXRlcnMsIEZpbGUgZmlsZSkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBXcml0ZXIocGFyYW1ldGVycywgcGF0aCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFdyaXRlcihwYXJhbWV0ZXJzLCBmaWxlKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGFkZE9mZnNldChsb25nIG9mZnNldCkKQEAgLTM3NSw3ICszOTUsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZTV3JpdGVFcnJvcihlLCBmaWxlUGF0aCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZTV3JpdGVFcnJvcihlLCBmaWxlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0zODcsNiArNDA3LDcgQEAKICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGRvUHJlcGFyZSgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGFzc2VydCBjaHVua0NvdW50ID09IGNvdW50OwpAQCAtNDAxLDcgKzQyMiw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGZsdXNoIHRoZSBkYXRhIHRvIGRpc2sKLSAgICAgICAgICAgIHRyeSAoRmlsZU91dHB1dFN0cmVhbVBsdXMgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW1QbHVzKGZpbGVQYXRoKSkKKyAgICAgICAgICAgIHRyeSAoRmlsZU91dHB1dFN0cmVhbVBsdXMgb3V0ID0gZmlsZS5uZXdPdXRwdXRTdHJlYW0oRmlsZS5Xcml0ZU1vZGUuT1ZFUldSSVRFKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB3cml0ZUhlYWRlcihvdXQsIGRhdGFMZW5ndGgsIGNvdW50KTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCkBAIC00MTIsMTEgKzQzMywxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB8IE5vU3VjaEZpbGVFeGNlcHRpb24gZm5mZSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShmbmZlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihmbmZlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGU1dyaXRlRXJyb3IoZSwgZmlsZVBhdGgpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBGU1dyaXRlRXJyb3IoZSwgZmlsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNDM1LDcgKzQ1Niw3IEBACiAgICAgICAgICAgICBpZiAodENvdW50IDwgdGhpcy5jb3VudCkKICAgICAgICAgICAgICAgICBjb21wcmVzc2VkTGVuZ3RoID0gdE9mZnNldHMuZ2V0TG9uZyh0Q291bnQgKiA4TCk7CiAKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcHJlc3Npb25NZXRhZGF0YShmaWxlUGF0aCwgcGFyYW1ldGVycywgdE9mZnNldHMsIHRDb3VudCAqIDhMLCBkYXRhTGVuZ3RoLCBjb21wcmVzc2VkTGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcHJlc3Npb25NZXRhZGF0YShmaWxlLCBwYXJhbWV0ZXJzLCB0T2Zmc2V0cywgdENvdW50ICogOEwsIGRhdGFMZW5ndGgsIGNvbXByZXNzZWRMZW5ndGgpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC00NjEsMTYgKzQ4MiwxOSBAQAogICAgICAgICAgICAgY291bnQgPSBjaHVua0luZGV4OwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCBUaHJvd2FibGUgZG9Qb3N0Q2xlYW51cChUaHJvd2FibGUgZmFpbGVkKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0cy5jbG9zZShmYWlsZWQpOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCBUaHJvd2FibGUgZG9Db21taXQoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCBUaHJvd2FibGUgZG9BYm9ydChUaHJvd2FibGUgYWNjdW11bGF0ZSkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGU7CkBAIC00OTUsNiArNTE5LDcgQEAKICAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykKICAgICAgICAgewogICAgICAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CkBAIC01MDQsNiArNTI5LDcgQEAKICAgICAgICAgICAgIHJldHVybiBsZW5ndGggPT0gY2h1bmsubGVuZ3RoICYmIG9mZnNldCA9PSBjaHVuay5vZmZzZXQ7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGludCByZXN1bHQgPSAoaW50KSAob2Zmc2V0IF4gKG9mZnNldCA+Pj4gMzIpKTsKQEAgLTUxMSw2ICs1MzcsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIkNodW5rPG9mZnNldDogJWQsIGxlbmd0aDogJWQ+Iiwgb2Zmc2V0LCBsZW5ndGgpOwpAQCAtNTE5LDE3ICs1NDYsMjAgQEAKIAogICAgIHN0YXRpYyBjbGFzcyBDaHVua1NlcmlhbGl6ZXIgaW1wbGVtZW50cyBJVmVyc2lvbmVkU2VyaWFsaXplcjxDaHVuaz4KICAgICB7CisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoQ2h1bmsgY2h1bmssIERhdGFPdXRwdXRQbHVzIG91dCwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICBvdXQud3JpdGVMb25nKGNodW5rLm9mZnNldCk7CiAgICAgICAgICAgICBvdXQud3JpdGVJbnQoY2h1bmsubGVuZ3RoKTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgQ2h1bmsgZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbiwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IENodW5rKGluLnJlYWRMb25nKCksIGluLnJlYWRJbnQoKSk7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGxvbmcgc2VyaWFsaXplZFNpemUoQ2h1bmsgY2h1bmssIGludCB2ZXJzaW9uKQogICAgICAgICB7CiAgICAgICAgICAgICBsb25nIHNpemUgPSBUeXBlU2l6ZXMuc2l6ZW9mKGNodW5rLm9mZnNldCk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0Fic3RyYWN0TWV0cmljc1Byb3ZpZGVycy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9BYnN0cmFjdE1ldHJpY3NQcm92aWRlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWIxMTYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9BYnN0cmFjdE1ldHJpY3NQcm92aWRlcnMuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlGdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZXRyaWNzUHJvdmlkZXJzPFIgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyPiBpbXBsZW1lbnRzIE1ldHJpY3NQcm92aWRlcnMKK3sKKyAgICBwcm90ZWN0ZWQgZmluYWwgPFQgZXh0ZW5kcyBOdW1iZXI+IEdhdWdlUHJvdmlkZXI8VD4gbmV3R2F1Z2VQcm92aWRlcihTdHJpbmcgbmFtZSwgRnVuY3Rpb248SXRlcmFibGU8Uj4sIFQ+IGNvbWJpbmVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVHYXVnZVByb3ZpZGVyPD4odGhpczo6bWFwLCBuYW1lLCBjb21iaW5lcik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIDxUIGV4dGVuZHMgTnVtYmVyPiBHYXVnZVByb3ZpZGVyPFQ+IG5ld0dhdWdlUHJvdmlkZXIoU3RyaW5nIG5hbWUsIFQgbmV1dHJhbFZhbHVlLCBGdW5jdGlvbjxSLCBUPiBleHRyYWN0b3IsIEJpRnVuY3Rpb248VCwgVCwgVD4gY29tYmluZXIpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFNpbXBsZUdhdWdlUHJvdmlkZXI8Pih0aGlzOjptYXAsIG5hbWUsIHJlYWRlcnMgLT4geworICAgICAgICAgICAgVCB0b3RhbCA9IG5ldXRyYWxWYWx1ZTsKKyAgICAgICAgICAgIGZvciAoUiByZWFkZXIgOiByZWFkZXJzKQorICAgICAgICAgICAgICAgIHRvdGFsID0gY29tYmluZXIuYXBwbHkodG90YWwsIGV4dHJhY3Rvci5hcHBseShyZWFkZXIpKTsKKyAgICAgICAgICAgIHJldHVybiB0b3RhbDsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFIgbWFwKFNTVGFibGVSZWFkZXIgcik7Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0Fic3RyYWN0Um93SW5kZXhFbnRyeS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9BYnN0cmFjdFJvd0luZGV4RW50cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmNmYmUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9BYnN0cmFjdFJvd0luZGV4RW50cnkuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuSU1lYXN1cmFibGVNZW1vcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25UaW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKKworLyoqCisgKiBUaGUgYmFzZSBSb3dJbmRleEVudHJ5IGlzIG5vdCBzdG9yZWQgb24gZGlzaywgb25seSBzcGVjaWZpZXMgYSBwb3NpdGlvbiBpbiB0aGUgZGF0YSBmaWxlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJvd0luZGV4RW50cnkgaW1wbGVtZW50cyBJTWVhc3VyYWJsZU1lbW9yeQoreworICAgIHB1YmxpYyBmaW5hbCBsb25nIHBvc2l0aW9uOworCisgICAgcHVibGljIEFic3RyYWN0Um93SW5kZXhFbnRyeShsb25nIHBvc2l0aW9uKQorICAgIHsKKyAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJvdyBwb3NpdGlvbiBpbiBhIGRhdGEgZmlsZQorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFBvc2l0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwb3NpdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpbmRleCBlbnRyeSBjb250YWlucyB0aGUgcm93LWxldmVsIHRvbWJzdG9uZSBhbmQgY29sdW1uIHN1bW1hcnkuIE90aGVyd2lzZSwKKyAgICAgKiBjYWxsZXIgc2hvdWxkIGZldGNoIHRoZXNlIGZyb20gdGhlIHJvdyBoZWFkZXIuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJbmRleGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBibG9ja0NvdW50KCkgPiAxOworICAgIH0KKworICAgIHB1YmxpYyBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYmxvY2tDb3VudCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgU1NUYWJsZUZvcm1hdDw/LCA/PiBnZXRTU1RhYmxlRm9ybWF0KCk7CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemUgdGhpcyBlbnRyeSBmb3Iga2V5IGNhY2hlCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0IHRoZSBvdXRwdXQgc3RyZWFtIGZvciBzZXJpYWxpemVkIGVudHJ5CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2VyaWFsaXplRm9yQ2FjaGUoRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0Fic3RyYWN0U1NUYWJsZUl0ZXJhdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0Fic3RyYWN0U1NUYWJsZUl0ZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZjMjEyOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvQWJzdHJhY3RTU1RhYmxlSXRlcmF0b3IuamF2YQpAQCAtMCwwICsxLDU4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKKworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQnVmZmVyQ2x1c3RlcmluZ0JvdW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdCb3VuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVndWxhckFuZFN0YXRpY0NvbHVtbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2xpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2xpY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlVuZmlsdGVyZWREZXNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVW5maWx0ZXJlZFZhbGlkYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkRlc2VyaWFsaXphdGlvbkhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkVuY29kaW5nU3RhdHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5SYW5nZVRvbWJzdG9uZUJvdW5kTWFya2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUmFuZ2VUb21ic3RvbmVNYXJrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3dzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRTZXJpYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlRGF0YUlucHV0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy52aW50LlZJbnRDb2RpbmcuVkludE91dE9mUmFuZ2VFeGNlcHRpb247CisKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U1NUYWJsZUl0ZXJhdG9yPFJJRSBleHRlbmRzIEFic3RyYWN0Um93SW5kZXhFbnRyeT4gaW1wbGVtZW50cyBVbmZpbHRlcmVkUm93SXRlcmF0b3IKK3sKKyAgICBwcm90ZWN0ZWQgZmluYWwgU1NUYWJsZVJlYWRlciBzc3RhYmxlOworICAgIC8vIFdlIGNvdWxkIHVzZSBzc3RhYmxlLm1ldGFkYXRhKCksIGJ1dCB0aGF0IGNhbiBjaGFuZ2UgZHVyaW5nIGV4ZWN1dGlvbiBzbyBpdCdzIGdvb2QgaHlnaWVuZSB0byBncmFiIGFuIGltbXV0YWJsZSBpbnN0YW5jZQorICAgIHByb3RlY3RlZCBmaW5hbCBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhOworCisgICAgcHJvdGVjdGVkIGZpbmFsIERlY29yYXRlZEtleSBrZXk7CisgICAgcHJvdGVjdGVkIGZpbmFsIERlbGV0aW9uVGltZSBwYXJ0aXRpb25MZXZlbERlbGV0aW9uOworICAgIHByb3RlY3RlZCBmaW5hbCBDb2x1bW5GaWx0ZXIgY29sdW1uczsKKyAgICBwcm90ZWN0ZWQgZmluYWwgRGVzZXJpYWxpemF0aW9uSGVscGVyIGhlbHBlcjsKKworICAgIHByb3RlY3RlZCBmaW5hbCBSb3cgc3RhdGljUm93OworICAgIHByb3RlY3RlZCBmaW5hbCBSZWFkZXIgcmVhZGVyOworCisgICAgcHJvdGVjdGVkIGZpbmFsIEZpbGVIYW5kbGUgaWZpbGU7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNDbG9zZWQ7CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgU2xpY2VzIHNsaWNlczsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFdlIG5lZWQgdGhpcyBiZWNhdXNlIHRoZSBhbmFseXNpcyBpcyBub3QgYWJsZSB0byBkZXRlcm1pbmUgdGhhdCB3ZSBkbyBjbG9zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbGUgb24gZXZlcnkgcGF0aCB3aGVyZSB3ZSBjcmVhdGVkIGl0LgorICAgIHByb3RlY3RlZCBBYnN0cmFjdFNTVGFibGVJdGVyYXRvcihTU1RhYmxlUmVhZGVyIHNzdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEYXRhSW5wdXQgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUklFIGluZGV4RW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsaWNlcyBzbGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbkZpbHRlciBjb2x1bW5GaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVIYW5kbGUgaWZpbGUpCisgICAgeworICAgICAgICB0aGlzLnNzdGFibGUgPSBzc3RhYmxlOworICAgICAgICB0aGlzLm1ldGFkYXRhID0gc3N0YWJsZS5tZXRhZGF0YSgpOworICAgICAgICB0aGlzLmlmaWxlID0gaWZpbGU7CisgICAgICAgIHRoaXMua2V5ID0ga2V5OworICAgICAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5GaWx0ZXI7CisgICAgICAgIHRoaXMuc2xpY2VzID0gc2xpY2VzOworICAgICAgICB0aGlzLmhlbHBlciA9IG5ldyBEZXNlcmlhbGl6YXRpb25IZWxwZXIobWV0YWRhdGEsIHNzdGFibGUuZGVzY3JpcHRvci52ZXJzaW9uLmNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uKCksIERlc2VyaWFsaXphdGlvbkhlbHBlci5GbGFnLkxPQ0FMLCBjb2x1bW5GaWx0ZXIpOworCisgICAgICAgIGlmIChpbmRleEVudHJ5ID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucGFydGl0aW9uTGV2ZWxEZWxldGlvbiA9IERlbGV0aW9uVGltZS5MSVZFOworICAgICAgICAgICAgdGhpcy5yZWFkZXIgPSBudWxsOworICAgICAgICAgICAgdGhpcy5zdGF0aWNSb3cgPSBSb3dzLkVNUFRZX1NUQVRJQ19ST1c7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBib29sZWFuIHNob3VsZENsb3NlRmlsZSA9IGZpbGUgPT0gbnVsbDsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFdlIHNlZWsgdG8gdGhlIGJlZ2lubmluZyB0byB0aGUgcGFydGl0aW9uIGlmIGVpdGhlcjoKKyAgICAgICAgICAgICAgICAvLyAgIC0gdGhlIHBhcnRpdGlvbiBpcyBub3QgaW5kZXhlZDsgd2UgdGhlbiBoYXZlIGEgc2luZ2xlIGJsb2NrIHRvIHJlYWQgYW55d2F5CisgICAgICAgICAgICAgICAgLy8gICAgIChhbmQgd2UgbmVlZCB0byByZWFkIHRoZSBwYXJ0aXRpb24gZGVsZXRpb24gdGltZSkuCisgICAgICAgICAgICAgICAgLy8gICAtIHdlJ3JlIHF1ZXJ5aW5nIHN0YXRpYyBjb2x1bW5zLgorICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZFNlZWtBdFBhcnRpdGlvblN0YXJ0ID0gIWluZGV4RW50cnkuaXNJbmRleGVkKCkgfHwgIWNvbHVtbnMuZmV0Y2hlZENvbHVtbnMoKS5zdGF0aWNzLmlzRW1wdHkoKTsKKworICAgICAgICAgICAgICAgIGlmIChuZWVkU2Vla0F0UGFydGl0aW9uU3RhcnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBOb3QgaW5kZXhlZCAob3IgaXMgcmVhZGluZyBzdGF0aWMpLCBzZXQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFydGl0aW9uIGFuZCByZWFkIHBhcnRpdGlvbiBsZXZlbCBkZWxldGlvbiB0aGVyZQorICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IHNzdGFibGUuZ2V0RmlsZURhdGFJbnB1dChpbmRleEVudHJ5LnBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5zZWVrKGluZGV4RW50cnkucG9zaXRpb24pOworCisgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLnNraXBTaG9ydExlbmd0aChmaWxlKTsgLy8gU2tpcCBwYXJ0aXRpb24ga2V5CisgICAgICAgICAgICAgICAgICAgIHRoaXMucGFydGl0aW9uTGV2ZWxEZWxldGlvbiA9IERlbGV0aW9uVGltZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGZpbGUpOworCisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIG5lZWRzIHRvIGJlIGNhbGxlZCBhZnRlciBmaWxlICE9IG51bGwgYW5kIGFmdGVyIHRoZSBwYXJ0aXRpb25EZWxldGlvbiBoYXMgYmVlbiBzZXQsIGJ1dCBiZWZvcmUgcmVhZFN0YXRpY1JvdworICAgICAgICAgICAgICAgICAgICAvLyAoc2luY2UgaXQgdXNlcyBpdCkgc28gd2UgY2FuJ3QgbW92ZSB0aGF0IHVwIChidXQgd2UnbGwgYmUgYWJsZSB0byBzaW1wbGlmeSBhcyBzb29uIGFzIHdlIGRyb3Agc3VwcG9ydCBmb3IgdGhlIG9sZCBmaWxlIGZvcm1hdCkuCisgICAgICAgICAgICAgICAgICAgIHRoaXMucmVhZGVyID0gY3JlYXRlUmVhZGVyKGluZGV4RW50cnksIGZpbGUsIHNob3VsZENsb3NlRmlsZSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGljUm93ID0gcmVhZFN0YXRpY1Jvdyhzc3RhYmxlLCBmaWxlLCBoZWxwZXIsIGNvbHVtbnMuZmV0Y2hlZENvbHVtbnMoKS5zdGF0aWNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJ0aXRpb25MZXZlbERlbGV0aW9uID0gaW5kZXhFbnRyeS5kZWxldGlvblRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0aWNSb3cgPSBSb3dzLkVNUFRZX1NUQVRJQ19ST1c7CisgICAgICAgICAgICAgICAgICAgIHRoaXMucmVhZGVyID0gY3JlYXRlUmVhZGVyKGluZGV4RW50cnksIGZpbGUsIHNob3VsZENsb3NlRmlsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghcGFydGl0aW9uTGV2ZWxEZWxldGlvbi52YWxpZGF0ZSgpKQorICAgICAgICAgICAgICAgICAgICBVbmZpbHRlcmVkVmFsaWRhdGlvbi5oYW5kbGVJbnZhbGlkKG1ldGFkYXRhKCksIGtleSwgc3N0YWJsZSwgInBhcnRpdGlvbkxldmVsRGVsZXRpb249IitwYXJ0aXRpb25MZXZlbERlbGV0aW9uLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsICYmICFzbGljZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2V0Rm9yU2xpY2UobmV4dFNsaWNlKCkpOworCisgICAgICAgICAgICAgICAgaWYgKHJlYWRlciA9PSBudWxsICYmIGZpbGUgIT0gbnVsbCAmJiBzaG91bGRDbG9zZUZpbGUpCisgICAgICAgICAgICAgICAgICAgIGZpbGUuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNzdGFibGUubWFya1N1c3BlY3QoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZVBhdGggPSBmaWxlLmdldFBhdGgoKTsKKyAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQ2xvc2VGaWxlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gc3VwcHJlc3NlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZS5hZGRTdXBwcmVzc2VkKHN1cHByZXNzZWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihlLCBmaWxlUGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFNsaWNlIG5leHRTbGljZSgpCisgICAgeworICAgICAgICByZXR1cm4gc2xpY2VzLmdldChuZXh0U2xpY2VJbmRleCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBzbGljZSB0byBwcm9jZXNzLgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBuZXh0IHNsaWNlIHRvIHByb2Nlc3MKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IG5leHRTbGljZUluZGV4KCk7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlcmUgYXJlIG1vcmUgc2xpY2UgdG8gcHJvY2Vzcy4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGVyZSBhcmUgbW9yZSBzbGljZSB0byBwcm9jZXNzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBoYXNNb3JlU2xpY2VzKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBSb3cgcmVhZFN0YXRpY1JvdyhTU1RhYmxlUmVhZGVyIHNzdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURhdGFJbnB1dCBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2VyaWFsaXphdGlvbkhlbHBlciBoZWxwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1ucyBzdGF0aWNzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmICghc3N0YWJsZS5oZWFkZXIuaGFzU3RhdGljKCkpCisgICAgICAgICAgICByZXR1cm4gUm93cy5FTVBUWV9TVEFUSUNfUk9XOworCisgICAgICAgIGlmIChzdGF0aWNzLmlzRW1wdHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgVW5maWx0ZXJlZFNlcmlhbGl6ZXIuc2VyaWFsaXplci5za2lwU3RhdGljUm93KGZpbGUsIHNzdGFibGUuaGVhZGVyLCBoZWxwZXIpOworICAgICAgICAgICAgcmV0dXJuIFJvd3MuRU1QVFlfU1RBVElDX1JPVzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBVbmZpbHRlcmVkU2VyaWFsaXplci5zZXJpYWxpemVyLmRlc2VyaWFsaXplU3RhdGljUm93KGZpbGUsIHNzdGFibGUuaGVhZGVyLCBoZWxwZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFJlYWRlciBjcmVhdGVSZWFkZXJJbnRlcm5hbChSSUUgaW5kZXhFbnRyeSwgRmlsZURhdGFJbnB1dCBmaWxlLCBib29sZWFuIHNob3VsZENsb3NlRmlsZSk7CisKKyAgICBwcml2YXRlIFJlYWRlciBjcmVhdGVSZWFkZXIoUklFIGluZGV4RW50cnksIEZpbGVEYXRhSW5wdXQgZmlsZSwgYm9vbGVhbiBzaG91bGRDbG9zZUZpbGUpCisgICAgeworICAgICAgICByZXR1cm4gc2xpY2VzLmlzRW1wdHkoKSA/IG5ldyBOb1Jvd3NSZWFkZXIoZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNyZWF0ZVJlYWRlckludGVybmFsKGluZGV4RW50cnksIGZpbGUsIHNob3VsZENsb3NlRmlsZSk7CisgICAgfTsKKworICAgIHB1YmxpYyBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtZXRhZGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVndWxhckFuZFN0YXRpY0NvbHVtbnMgY29sdW1ucygpCisgICAgeworICAgICAgICByZXR1cm4gY29sdW1ucy5mZXRjaGVkQ29sdW1ucygpOworICAgIH0KKworICAgIHB1YmxpYyBEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBrZXk7CisgICAgfQorCisgICAgcHVibGljIERlbGV0aW9uVGltZSBwYXJ0aXRpb25MZXZlbERlbGV0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJ0aXRpb25MZXZlbERlbGV0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBSb3cgc3RhdGljUm93KCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0aWNSb3c7CisgICAgfQorCisgICAgcHVibGljIEVuY29kaW5nU3RhdHMgc3RhdHMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNzdGFibGUuc3RhdHMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKKyAgICB7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocmVhZGVyID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBpZiAocmVhZGVyLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKCFoYXNNb3JlU2xpY2VzKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBzbGljZShuZXh0U2xpY2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgVW5maWx0ZXJlZCBuZXh0KCkKKyAgICB7CisgICAgICAgIGFzc2VydCByZWFkZXIgIT0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHJlYWRlci5uZXh0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNsaWNlKFNsaWNlIHNsaWNlKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZWFkZXIuc2V0Rm9yU2xpY2Uoc2xpY2UpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbG9zZUludGVybmFsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gc3VwcHJlc3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlLmFkZFN1cHByZXNzZWQoc3VwcHJlc3NlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzc3RhYmxlLm1hcmtTdXNwZWN0KCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24oZSwgcmVhZGVyLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjbG9zZUludGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBJdCdzIGltcG9ydGFudCB0byBtYWtlIGNsb3NpbmcgaWRlbXBvdGVudCBzaW5jZSBpdCB3b3VsZCBiYWQgdG8gZG91YmxlLWNsb3NlICdmaWxlJyBhcyBpdHMgYSBSYW5kb21BY2Nlc3NSZWFkZXIKKyAgICAgICAgLy8gYW5kIGl0cyBjbG9zZSBpcyBub3QgaWRlbXB0b3RlbnQgaW4gdGhlIGNhc2Ugd2hlcmUgd2UgcmVjeWNsZSBpdC4KKyAgICAgICAgaWYgKGlzQ2xvc2VkKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworCisgICAgICAgIGlzQ2xvc2VkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgY2xvc2VJbnRlcm5hbCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBzc3RhYmxlLm1hcmtTdXNwZWN0KCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24oZSwgcmVhZGVyLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBSZWFkZXIgZXh0ZW5kcyBJdGVyYXRvcjxVbmZpbHRlcmVkPiwgQ2xvc2VhYmxlIHsKKworICAgICAgICB2b2lkIHNldEZvclNsaWNlKFNsaWNlIHNsaWNlKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAgICAgdm9pZCBzZWVrVG9Qb3NpdGlvbihsb25nIGNvbHVtbk9mZnNldCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlYWRlciBpbXBsZW1lbnRzIFJlYWRlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHNob3VsZENsb3NlRmlsZTsKKyAgICAgICAgcHVibGljIEZpbGVEYXRhSW5wdXQgZmlsZTsKKworICAgICAgICBwdWJsaWMgVW5maWx0ZXJlZERlc2VyaWFsaXplciBkZXNlcmlhbGl6ZXI7CisKKyAgICAgICAgLy8gUmVjb3JkcyB0aGUgY3VycmVudGx5IG9wZW4gcmFuZ2UgdG9tYnN0b25lIChpZiBhbnkpCisgICAgICAgIHB1YmxpYyBEZWxldGlvblRpbWUgb3Blbk1hcmtlcjsKKworICAgICAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZWFkZXIoRmlsZURhdGFJbnB1dCBmaWxlLCBib29sZWFuIHNob3VsZENsb3NlRmlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICAgICAgICAgIHRoaXMuc2hvdWxkQ2xvc2VGaWxlID0gc2hvdWxkQ2xvc2VGaWxlOworCisgICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGNyZWF0ZURlc2VyaWFsaXplcigpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZURlc2VyaWFsaXplcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBmaWxlICE9IG51bGwgJiYgZGVzZXJpYWxpemVyID09IG51bGw7CisgICAgICAgICAgICBkZXNlcmlhbGl6ZXIgPSBVbmZpbHRlcmVkRGVzZXJpYWxpemVyLmNyZWF0ZShtZXRhZGF0YSwgZmlsZSwgc3N0YWJsZS5oZWFkZXIsIGhlbHBlcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZWVrVG9Qb3NpdGlvbihsb25nIHBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhpcyBtYXkgYmUgdGhlIGZpcnN0IHRpbWUgd2UncmUgYWN0dWFsbHkgbG9va2luZyBpbnRvIHRoZSBmaWxlCisgICAgICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpbGUgPSBzc3RhYmxlLmdldEZpbGVEYXRhSW5wdXQocG9zaXRpb24pOworICAgICAgICAgICAgICAgIGNyZWF0ZURlc2VyaWFsaXplcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpbGUuc2Vlayhwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgZGVzZXJpYWxpemVyLmNsZWFyU3RhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZU9wZW5NYXJrZXIoUmFuZ2VUb21ic3RvbmVNYXJrZXIgbWFya2VyKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgYWx3YXlzIHJlYWQgaW5kZXggYmxvY2tzIGluIGZvcndhcmQgb3JkZXIgc28gdGhpcyBtZXRob2QgaXMgYWx3YXlzIGNhbGxlZCBpbiBmb3J3YXJkIG9yZGVyCisgICAgICAgICAgICBvcGVuTWFya2VyID0gbWFya2VyLmlzT3BlbihmYWxzZSkgPyBtYXJrZXIub3BlbkRlbGV0aW9uVGltZShmYWxzZSkgOiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBoYXNOZXh0SW50ZXJuYWwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiB8IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gfCBWSW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2VJbnRlcm5hbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gc3VwcHJlc3NlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGUuYWRkU3VwcHJlc3NlZChzdXBwcmVzc2VkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3N0YWJsZS5tYXJrU3VzcGVjdCgpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihlLCB0b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBVbmZpbHRlcmVkIG5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV4dEludGVybmFsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlSW50ZXJuYWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIHN1cHByZXNzZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlLmFkZFN1cHByZXNzZWQoc3VwcHJlc3NlZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNzdGFibGUubWFya1N1c3BlY3QoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24oZSwgdG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXQgdGhlIHJlYWRlciBzbyBpdHMgaGFzTmV4dC9uZXh0IG1ldGhvZHMgcmV0dXJuIHZhbHVlcyB3aXRoaW4gdGhlIHByb3ZpZGVkIHNsaWNlCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEZvclNsaWNlKFNsaWNlIHNsaWNlKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaGFzTmV4dEludGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVW5maWx0ZXJlZCBuZXh0SW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzaG91bGRDbG9zZUZpbGUgJiYgZmlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZpbGUuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZpbGUgIT0gbnVsbCA/IGZpbGUudG9TdHJpbmcoKSA6ICJudWxsIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBjbGFzcyBGb3J3YXJkUmVhZGVyIGV4dGVuZHMgQWJzdHJhY3RSZWFkZXIKKyAgICB7CisgICAgICAgIC8vIFRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBzbGljZS4gVGhpcyB3aWxsIGJlIG51bGwgYXMgc29vbiBhcyB3ZSBrbm93IHdlJ3ZlIHBhc3NlZCB0aGF0IGJvdW5kLgorICAgICAgICBwcm90ZWN0ZWQgQ2x1c3RlcmluZ0JvdW5kPD8+IHN0YXJ0OworICAgICAgICAvLyBUaGUgZW5kIG9mIHRoZSBjdXJyZW50IHNsaWNlLiBXaWxsIG5ldmVyIGJlIG51bGwuCisgICAgICAgIHByb3RlY3RlZCBDbHVzdGVyaW5nQm91bmQ8Pz4gZW5kID0gQnVmZmVyQ2x1c3RlcmluZ0JvdW5kLlRPUDsKKworICAgICAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZCBuZXh0OyAvLyB0aGUgbmV4dCBlbGVtZW50IHRvIHJldHVybjogdGhpcyBpcyBjb21wdXRlZCBieSBoYXNOZXh0SW50ZXJuYWwoKS4KKworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzbGljZURvbmU7IC8vIHNldCB0byB0cnVlIG9uY2Ugd2Uga25vdyB3ZSBoYXZlIG5vIG1vcmUgcmVzdWx0IGZvciB0aGUgc2xpY2UuIFRoaXMgaXMgaW4gcGFydGljdWxhcgorICAgICAgICAvLyB1c2VkIGJ5IHRoZSBpbmRleGVkIHJlYWRlciB3aGVuIHdlIGtub3cgd2UgY2FuJ3QgaGF2ZSByZXN1bHRzIGJhc2VkIG9uIHRoZSBpbmRleC4KKworICAgICAgICBwdWJsaWMgRm9yd2FyZFJlYWRlcihGaWxlRGF0YUlucHV0IGZpbGUsIGJvb2xlYW4gc2hvdWxkQ2xvc2VGaWxlKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihmaWxlLCBzaG91bGRDbG9zZUZpbGUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Rm9yU2xpY2UoU2xpY2Ugc2xpY2UpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBzdGFydCA9IHNsaWNlLnN0YXJ0KCkuaXNCb3R0b20oKSA/IG51bGwgOiBzbGljZS5zdGFydCgpOworICAgICAgICAgICAgZW5kID0gc2xpY2UuZW5kKCk7CisKKyAgICAgICAgICAgIHNsaWNlRG9uZSA9IGZhbHNlOworICAgICAgICAgICAgbmV4dCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvLyBTa2lwIGFsbCBkYXRhIHRoYXQgY29tZXMgYmVmb3JlIHRoZSBjdXJyZW50bHkgc2V0IHNsaWNlLgorICAgICAgICAvLyBSZXR1cm4gd2hhdCBzaG91bGQgYmUgcmV0dXJuZWQgYXQgdGhlIGVuZCBvZiB0aGlzLCBvciBudWxsIGlmIG5vdGhpbmcgc2hvdWxkLgorICAgICAgICBwcml2YXRlIFVuZmlsdGVyZWQgaGFuZGxlUHJlU2xpY2VEYXRhKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBkZXNlcmlhbGl6ZXIgIT0gbnVsbDsKKworICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgY29tcGFyaXNvbiBpcyBub3Qgc3RyaWN0LiBUaGUgcmVhc29uIGlzIHRoYXQgdGhlIG9ubHkgY2FzZXMKKyAgICAgICAgICAgIC8vIHdoZXJlIGl0IGNhbiBiZSA9PSBpcyBpZiB0aGUgIm5leHQiIGlzIGEgUlQgc3RhcnQgbWFya2VyIChlaXRoZXIgYSAnWycgb2YgYSAnKVsnIGJvdW5kYXJ5KSwKKyAgICAgICAgICAgIC8vIGFuZCBpZiB3ZSBoYWQgYSBzdHJpY3QgaW5lcXVhbGl0eSBhbmQgYW4gb3BlbiBSVCBtYXJrZXIgYmVmb3JlIHRoaXMsIHdlIHdvdWxkIGlzc3VlCisgICAgICAgICAgICAvLyB0aGUgb3BlbiBtYXJrZXIgZmlyc3QsIGFuZCB0aGVuIHJldHVybiB0aGVuIG5leHQgbGF0ZXIsIHdoaWNoIHdvdWxkIHNlbmQgaW4gdGhlCisgICAgICAgICAgICAvLyBzdHJlYW0gYm90aCAnWycgKG9yICcoJykgYW5kIHRoZW4gJylbJyBmb3IgdGhlIHNhbWUgY2x1c3RlcmluZyB2YWx1ZSwgd2hpY2ggaXMgd3JvbmcuCisgICAgICAgICAgICAvLyBCeSB1c2luZyBhIG5vbi1zdHJpY3QgaW5lcXVhbGl0eSwgd2UgYXZvaWQgdGhhdCBwcm9ibGVtIChpZiB3ZSBkbyBnZXQgJylbJyBmb3IgdGhlIHNhbWUKKyAgICAgICAgICAgIC8vIGNsdXN0ZXJpbmcgdmFsdWUgdGhhbiB0aGUgc2xpY2UsIHdlJ2xsIHNpbXBseSByZWNvcmQgaXQgaW4gJ29wZW5NYXJrZXInKS4KKyAgICAgICAgICAgIHdoaWxlIChkZXNlcmlhbGl6ZXIuaGFzTmV4dCgpICYmIGRlc2VyaWFsaXplci5jb21wYXJlTmV4dFRvKHN0YXJ0KSA8PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkZXNlcmlhbGl6ZXIubmV4dElzUm93KCkpCisgICAgICAgICAgICAgICAgICAgIGRlc2VyaWFsaXplci5za2lwTmV4dCgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlT3Blbk1hcmtlcigoUmFuZ2VUb21ic3RvbmVNYXJrZXIpZGVzZXJpYWxpemVyLnJlYWROZXh0KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDbHVzdGVyaW5nQm91bmQ8Pz4gc2xpY2VTdGFydCA9IHN0YXJ0OworICAgICAgICAgICAgc3RhcnQgPSBudWxsOworCisgICAgICAgICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBiZWdpbm5pbmcgb2Ygb3VyIHF1ZXJpZWQgc2xpY2UuIElmIHdlIGhhdmUgYW4gb3BlbiBtYXJrZXIKKyAgICAgICAgICAgIC8vIHdlIHNob3VsZCByZXR1cm4gdGhhdCBmaXJzdC4KKyAgICAgICAgICAgIGlmIChvcGVuTWFya2VyICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZVRvbWJzdG9uZUJvdW5kTWFya2VyKHNsaWNlU3RhcnQsIG9wZW5NYXJrZXIpOworCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbXB1dGUgdGhlIG5leHQgZWxlbWVudCB0byByZXR1cm4sIGFzc3VtaW5nIHdlJ3JlIGluIHRoZSBtaWRkbGUgdG8gdGhlIHNsaWNlCisgICAgICAgIC8vIGFuZCB0aGUgbmV4dCBlbGVtZW50IGlzIGVpdGhlciBpbiB0aGUgc2xpY2UsIG9yIGp1c3QgYWZ0ZXIgaXQuIFJldHVybnMgbnVsbAorICAgICAgICAvLyBpZiB3ZSdyZSBkb25lIHdpdGggdGhlIHNsaWNlLgorICAgICAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZCBjb21wdXRlTmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgZGVzZXJpYWxpemVyICE9IG51bGw7CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFdlIHVzZSBhIHNhbWUgcmVhc29uaW5nIGFzIGluIGhhbmRsZVByZVNsaWNlRGF0YSByZWdhcmRpbmcgdGhlIHN0cmljdG5lc3Mgb2YgdGhlIGluZXF1YWxpdHkgYmVsb3cuCisgICAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBleGNsdWRlIGRlc2VyaWFsaXplZCB1bmZpbHRlcmVkIGVxdWFsIHRvIGVuZCwgYmVjYXVzZSAxKSB3ZSB3b24ndCBtaXNzIGFueSByb3dzIHNpbmNlIHRob3NlCisgICAgICAgICAgICAgICAgLy8gd291ZG4ndCBiZSBlcXVhbCB0byBhIHNsaWNlIGJvdW5kIGFuZCAyKSBhIGVuZCBib3VuZCBjYW4gYmUgZXF1YWwgdG8gYSBzdGFydCBib3VuZAorICAgICAgICAgICAgICAgIC8vIChFWENMX0VORCh4KSA9PSBJTkNMX1NUQVJUKHgpIGZvciBpbnN0YW5jZSkgYW5kIGluIHRoYXQgY2FzZSB3ZSBkb24ndCB3YW50IHRvIHJldHVybiBzdGFydCBib3VuZCBiZWNhdXNlCisgICAgICAgICAgICAgICAgLy8gaXQncyBmdW5kYW1lbnRhbGx5IGV4Y2x1ZGVkLiBBbmQgaWYgdGhlIGJvdW5kIGlzIGEgIGVuZCAoZm9yIGEgcmFuZ2UgdG9tYnN0b25lKSwgaXQgbWVhbnMgaXQncyBleGFjdGx5CisgICAgICAgICAgICAgICAgLy8gb3VyIHNsaWNlIGVuZCwgYnV0IGluIHRoYXQgIGNhc2Ugd2Ugd2lsbCBwcm9wZXJseSBjbG9zZSB0aGUgcmFuZ2UgdG9tYnN0b25lIGFueXdheSBhcyBwYXJ0IG9mIG91ciAiY2xvc2UKKyAgICAgICAgICAgICAgICAvLyBhbiBvcGVuIG1hcmtlciIgY29kZSBpbiBoYXNOZXh0SW50ZXJuYQorICAgICAgICAgICAgICAgIGlmICghZGVzZXJpYWxpemVyLmhhc05leHQoKSB8fCBkZXNlcmlhbGl6ZXIuY29tcGFyZU5leHRUbyhlbmQpID49IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgVW5maWx0ZXJlZCBuZXh0ID0gZGVzZXJpYWxpemVyLnJlYWROZXh0KCk7CisgICAgICAgICAgICAgICAgVW5maWx0ZXJlZFZhbGlkYXRpb24ubWF5YmVWYWxpZGF0ZVVuZmlsdGVyZWQobmV4dCwgbWV0YWRhdGEoKSwga2V5LCBzc3RhYmxlKTsKKyAgICAgICAgICAgICAgICAvLyBXZSBtYXkgZ2V0IGVtcHR5IHJvdyBmb3IgdGhlIHNhbWUgcmVhc29uIGV4cHJlc3NlZCBvbiBVbmZpbHRlcmVkU2VyaWFsaXplci5kZXNlcmlhbGl6ZU9uZS4KKyAgICAgICAgICAgICAgICBpZiAobmV4dC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgaWYgKG5leHQua2luZCgpID09IFVuZmlsdGVyZWQuS2luZC5SQU5HRV9UT01CU1RPTkVfTUFSS0VSKQorICAgICAgICAgICAgICAgICAgICB1cGRhdGVPcGVuTWFya2VyKChSYW5nZVRvbWJzdG9uZU1hcmtlcikgbmV4dCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOZXh0SW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG5leHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKHNsaWNlRG9uZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIGlmIChzdGFydCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVuZmlsdGVyZWQgdW5maWx0ZXJlZCA9IGhhbmRsZVByZVNsaWNlRGF0YSgpOworICAgICAgICAgICAgICAgIGlmICh1bmZpbHRlcmVkICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXh0ID0gdW5maWx0ZXJlZDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZXh0ID0gY29tcHV0ZU5leHQoKTsKKyAgICAgICAgICAgIGlmIChuZXh0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAgIC8vIGZvciBjdXJyZW50IHNsaWNlLCBubyBkYXRhIHJlYWQgZnJvbSBkZXNlcmlhbGl6YXRpb24KKyAgICAgICAgICAgIHNsaWNlRG9uZSA9IHRydWU7CisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIG9wZW4gbWFya2VyLCB3ZSBzaG91bGQgbm90IGNsb3NlIGl0LCB0aGVyZSBjb3VsZCBiZSBtb3JlIHNsaWNlcworICAgICAgICAgICAgaWYgKG9wZW5NYXJrZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXh0ID0gbmV3IFJhbmdlVG9tYnN0b25lQm91bmRNYXJrZXIoZW5kLCBvcGVuTWFya2VyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkIG5leHRJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWhhc05leHRJbnRlcm5hbCgpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgIFVuZmlsdGVyZWQgdG9SZXR1cm4gPSBuZXh0OworICAgICAgICAgICAgbmV4dCA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gdG9SZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIFJlYWRlciBmb3Igd2hlbiB3ZSBoYXZlIFNsaWNlcy5OT05FIGJ1dCBuZWVkIHRvIHJlYWQgc3RhdGljIHJvdyBvciBwYXJ0aXRpb24gbGV2ZWwgZGVsZXRpb24KKyAgICBwcml2YXRlIGNsYXNzIE5vUm93c1JlYWRlciBleHRlbmRzIEFic3RyYWN0UmVhZGVyCisgICAgeworICAgICAgICBwcml2YXRlIE5vUm93c1JlYWRlcihGaWxlRGF0YUlucHV0IGZpbGUsIGJvb2xlYW4gc2hvdWxkQ2xvc2VGaWxlKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihmaWxlLCBzaG91bGRDbG9zZUZpbGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZvclNsaWNlKFNsaWNlIHNsaWNlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBuby1vcAorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHRJbnRlcm5hbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZCBuZXh0SW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvQWJzdHJhY3RTU1RhYmxlU2ltcGxlV3JpdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0Fic3RyYWN0U1NUYWJsZVNpbXBsZVdyaXRlci5qYXZhCmluZGV4IDQ5Y2ViNzYuLjQyOTk5NWMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvQWJzdHJhY3RTU1RhYmxlU2ltcGxlV3JpdGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9BYnN0cmFjdFNTVGFibGVTaW1wbGVXcml0ZXIuamF2YQpAQCAtMTgsOCArMTgsOCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOwogCiAKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKQEAgLTI3LDcgKzI3LDEwIEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVndWxhckFuZFN0YXRpY0NvbHVtbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlBhcnRpdGlvblVwZGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkVuY29kaW5nU3RhdHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKQEAgLTQzLDcgKzQ2LDcgQEAKICAgICBwcm90ZWN0ZWQgZmluYWwgRmlsZSBkaXJlY3Rvcnk7CiAgICAgcHJvdGVjdGVkIGZpbmFsIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGE7CiAgICAgcHJvdGVjdGVkIGZpbmFsIFJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zIGNvbHVtbnM7Ci0gICAgcHJvdGVjdGVkIFNTVGFibGVGb3JtYXQuVHlwZSBmb3JtYXRUeXBlID0gU1NUYWJsZUZvcm1hdC5UeXBlLmN1cnJlbnQoKTsKKyAgICBwcm90ZWN0ZWQgU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXQgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCk7CiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBBdG9taWNSZWZlcmVuY2U8U1NUYWJsZUlkPiBpZCA9IG5ldyBBdG9taWNSZWZlcmVuY2U8PihTU1RhYmxlSWRGYWN0b3J5Lmluc3RhbmNlLmRlZmF1bHRCdWlsZGVyKCkuZ2VuZXJhdG9yKFN0cmVhbS5lbXB0eSgpKS5nZXQoKSk7CiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbWFrZVJhbmdlQXdhcmUgPSBmYWxzZTsKIApAQCAtNTQsOSArNTcsOSBAQAogICAgICAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zOwogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIHNldFNTVGFibGVGb3JtYXRUeXBlKFNTVGFibGVGb3JtYXQuVHlwZSB0eXBlKQorICAgIHByb3RlY3RlZCB2b2lkIHNldFNTVGFibGVGb3JtYXRUeXBlKFNTVGFibGVGb3JtYXQ8PywgPz4gdHlwZSkKICAgICB7Ci0gICAgICAgIHRoaXMuZm9ybWF0VHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMuZm9ybWF0ID0gdHlwZTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRSYW5nZUF3YXJlV3JpdGluZyhib29sZWFuIG1ha2VSYW5nZUF3YXJlKQpAQCAtNjQsMjUgKzY3LDI2IEBACiAgICAgICAgIHRoaXMubWFrZVJhbmdlQXdhcmUgPSBtYWtlUmFuZ2VBd2FyZTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgU1NUYWJsZVR4bldyaXRlciBjcmVhdGVXcml0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICBwcm90ZWN0ZWQgU1NUYWJsZVR4bldyaXRlciBjcmVhdGVXcml0ZXIoU1NUYWJsZS5Pd25lciBvd25lcikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciA9IG5ldyBTZXJpYWxpemF0aW9uSGVhZGVyKHRydWUsIG1ldGFkYXRhLmdldCgpLCBjb2x1bW5zLCBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTKTsKIAogICAgICAgICBpZiAobWFrZVJhbmdlQXdhcmUpCi0gICAgICAgICAgICByZXR1cm4gU1NUYWJsZVR4bldyaXRlci5jcmVhdGVSYW5nZUF3YXJlKG1ldGFkYXRhLCAwLCAgQWN0aXZlUmVwYWlyU2VydmljZS5VTlJFUEFJUkVEX1NTVEFCTEUsIEFjdGl2ZVJlcGFpclNlcnZpY2UuTk9fUEVORElOR19SRVBBSVIsIGZhbHNlLCBmb3JtYXRUeXBlLCAwLCBoZWFkZXIpOworICAgICAgICAgICAgcmV0dXJuIFNTVGFibGVUeG5Xcml0ZXIuY3JlYXRlUmFuZ2VBd2FyZShtZXRhZGF0YSwgMCwgQWN0aXZlUmVwYWlyU2VydmljZS5VTlJFUEFJUkVEX1NTVEFCTEUsIEFjdGl2ZVJlcGFpclNlcnZpY2UuTk9fUEVORElOR19SRVBBSVIsIGZhbHNlLCBmb3JtYXQsIDAsIGhlYWRlcik7CiAKICAgICAgICAgcmV0dXJuIFNTVGFibGVUeG5Xcml0ZXIuY3JlYXRlKG1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVzY3JpcHRvcihkaXJlY3RvcnksIG1ldGFkYXRhLmtleXNwYWNlLCBtZXRhZGF0YS5uYW1lLCBmb3JtYXRUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZURlc2NyaXB0b3IoZGlyZWN0b3J5LCBtZXRhZGF0YS5rZXlzcGFjZSwgbWV0YWRhdGEubmFtZSwgZm9ybWF0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3RpdmVSZXBhaXJTZXJ2aWNlLlVOUkVQQUlSRURfU1NUQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2ZVJlcGFpclNlcnZpY2UuTk9fUEVORElOR19SRVBBSVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLmVtcHR5U2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcik7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgRGVzY3JpcHRvciBjcmVhdGVEZXNjcmlwdG9yKEZpbGUgZGlyZWN0b3J5LCBmaW5hbCBTdHJpbmcga2V5c3BhY2UsIGZpbmFsIFN0cmluZyBjb2x1bW5GYW1pbHksIGZpbmFsIFNTVGFibGVGb3JtYXQuVHlwZSBmbXQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHByaXZhdGUgc3RhdGljIERlc2NyaXB0b3IgY3JlYXRlRGVzY3JpcHRvcihGaWxlIGRpcmVjdG9yeSwgZmluYWwgU3RyaW5nIGtleXNwYWNlLCBmaW5hbCBTdHJpbmcgY29sdW1uRmFtaWx5LCBmaW5hbCBTU1RhYmxlRm9ybWF0PD8sID8+IGZtdCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBTU1RhYmxlSWQgbmV4dEdlbiA9IGdldE5leHRJZChkaXJlY3RvcnksIGNvbHVtbkZhbWlseSk7CiAgICAgICAgIHJldHVybiBuZXcgRGVzY3JpcHRvcihkaXJlY3RvcnksIGtleXNwYWNlLCBjb2x1bW5GYW1pbHksIG5leHRHZW4sIGZtdCk7CkBAIC05NSw3ICs5OSw3IEBACiAgICAgICAgICAgICB0cnkgKFN0cmVhbTxQYXRoPiBleGlzdGluZ1BhdGhzID0gRmlsZXMubGlzdChkaXJlY3RvcnkudG9QYXRoKCkpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIFN0cmVhbTxTU1RhYmxlSWQ+IGV4aXN0aW5nSWRzID0gZXhpc3RpbmdQYXRocy5tYXAoRmlsZTo6bmV3KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoU1NUYWJsZTo6dHJ5RGVzY3JpcHRvckZyb21GaWxlbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKFNTVGFibGU6OnRyeURlc2NyaXB0b3JGcm9tRmlsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGQgLT4gZCAhPSBudWxsICYmIGQuY2ZuYW1lLmVxdWFscyhjb2x1bW5GYW1pbHkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZCAtPiBkLmlkKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9CbG9vbUZpbHRlclRyYWNrZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvQmxvb21GaWx0ZXJUcmFja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NTIzYTAuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9CbG9vbUZpbHRlclRyYWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKLQotcHVibGljIGNsYXNzIEJsb29tRmlsdGVyVHJhY2tlcgotewotICAgIHByaXZhdGUgZmluYWwgQXRvbWljTG9uZyBmYWxzZVBvc2l0aXZlQ291bnQgPSBuZXcgQXRvbWljTG9uZygwKTsKLSAgICBwcml2YXRlIGZpbmFsIEF0b21pY0xvbmcgdHJ1ZVBvc2l0aXZlQ291bnQgPSBuZXcgQXRvbWljTG9uZygwKTsKLSAgICBwcml2YXRlIGZpbmFsIEF0b21pY0xvbmcgdHJ1ZU5lZ2F0aXZlQ291bnQgPSBuZXcgQXRvbWljTG9uZygwKTsKLSAgICBwcml2YXRlIGxvbmcgbGFzdEZhbHNlUG9zaXRpdmVDb3VudCA9IDBMOwotICAgIHByaXZhdGUgbG9uZyBsYXN0VHJ1ZVBvc2l0aXZlQ291bnQgPSAwTDsKLSAgICBwcml2YXRlIGxvbmcgbGFzdFRydWVOZWdhdGl2ZUNvdW50ID0gMEw7Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRGYWxzZVBvc2l0aXZlKCkKLSAgICB7Ci0gICAgICAgIGZhbHNlUG9zaXRpdmVDb3VudC5pbmNyZW1lbnRBbmRHZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRUcnVlUG9zaXRpdmUoKQotICAgIHsKLSAgICAgICAgdHJ1ZVBvc2l0aXZlQ291bnQuaW5jcmVtZW50QW5kR2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVHJ1ZU5lZ2F0aXZlKCkKLSAgICB7Ci0gICAgICAgIHRydWVOZWdhdGl2ZUNvdW50LmluY3JlbWVudEFuZEdldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldEZhbHNlUG9zaXRpdmVDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2VQb3NpdGl2ZUNvdW50LmdldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldFJlY2VudEZhbHNlUG9zaXRpdmVDb3VudCgpCi0gICAgewotICAgICAgICBsb25nIGZwYyA9IGdldEZhbHNlUG9zaXRpdmVDb3VudCgpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChmcGMgLSBsYXN0RmFsc2VQb3NpdGl2ZUNvdW50KTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGxhc3RGYWxzZVBvc2l0aXZlQ291bnQgPSBmcGM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRUcnVlUG9zaXRpdmVDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZVBvc2l0aXZlQ291bnQuZ2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0UmVjZW50VHJ1ZVBvc2l0aXZlQ291bnQoKQotICAgIHsKLSAgICAgICAgbG9uZyB0cGMgPSBnZXRUcnVlUG9zaXRpdmVDb3VudCgpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICh0cGMgLSBsYXN0VHJ1ZVBvc2l0aXZlQ291bnQpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgbGFzdFRydWVQb3NpdGl2ZUNvdW50ID0gdHBjOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0VHJ1ZU5lZ2F0aXZlQ291bnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWVOZWdhdGl2ZUNvdW50LmdldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldFJlY2VudFRydWVOZWdhdGl2ZUNvdW50KCkKLSAgICB7Ci0gICAgICAgIGxvbmcgdG5jID0gZ2V0VHJ1ZU5lZ2F0aXZlQ291bnQoKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAodG5jIC0gbGFzdFRydWVOZWdhdGl2ZUNvdW50KTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGxhc3RUcnVlTmVnYXRpdmVDb3VudCA9IHRuYzsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvQ1FMU1NUYWJsZVdyaXRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9DUUxTU1RhYmxlV3JpdGVyLmphdmEKaW5kZXggNmQ1NDU2MS4uZDBiY2FmZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9DUUxTU1RhYmxlV3JpdGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9DUUxTU1RhYmxlV3JpdGVyLmphdmEKQEAgLTM0LDggKzM0LDYgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkNyZWF0ZVRhYmxlU3RhdGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc3RhdGVtZW50cy5zY2hlbWEuQ3JlYXRlVHlwZVN0YXRlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNvbHVtblNwZWNpZmljYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5RdWVyeU9wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5RdWVyeVByb2Nlc3NvcjsKQEAgLTQ0LDYgKzQyLDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy50eXBlcy5UeXBlQ29kZWM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMudHlwZXMuVXNlclR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLk1vZGlmaWNhdGlvblN0YXRlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkNyZWF0ZVRhYmxlU3RhdGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc3RhdGVtZW50cy5zY2hlbWEuQ3JlYXRlVHlwZVN0YXRlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNsaWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNsaWNlczsKQEAgLTU0LDcgKzU0LDE3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5TeW50YXhFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hVHJhbnNmb3JtYXRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhUmVmOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Vc2VyRnVuY3Rpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5WaWV3czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNsaWVudFN0YXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CkBAIC0zNjYsNyArMzc2LDcgQEAKICAgICB7CiAgICAgICAgIHByaXZhdGUgRmlsZSBkaXJlY3Rvcnk7CiAKLSAgICAgICAgcHJvdGVjdGVkIFNTVGFibGVGb3JtYXQuVHlwZSBmb3JtYXRUeXBlID0gbnVsbDsKKyAgICAgICAgcHJvdGVjdGVkIFNTVGFibGVGb3JtYXQ8PywgPz4gZm9ybWF0ID0gbnVsbDsKIAogICAgICAgICBwcml2YXRlIENyZWF0ZVRhYmxlU3RhdGVtZW50LlJhdyBzY2hlbWFTdGF0ZW1lbnQ7CiAgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxDcmVhdGVUeXBlU3RhdGVtZW50LlJhdz4gdHlwZVN0YXRlbWVudHM7CkBAIC01NjMsMTEgKzU3MywxMSBAQAogICAgICAgICAgICAgICAgIFN0cmluZyBrZXlzcGFjZU5hbWUgPSBzY2hlbWFTdGF0ZW1lbnQua2V5c3BhY2UoKTsKIAogICAgICAgICAgICAgICAgIFNjaGVtYS5pbnN0YW5jZS50cmFuc2Zvcm0oU2NoZW1hVHJhbnNmb3JtYXRpb25zLmFkZEtleXNwYWNlKEtleXNwYWNlTWV0YWRhdGEuY3JlYXRlKGtleXNwYWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5c3BhY2VQYXJhbXMuc2ltcGxlKDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZXMubm9uZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3cy5ub25lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVzLm5vbmUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25zLm5vbmUoKSksIHRydWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVzLm5vbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3cy5ub25lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZXMubm9uZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJGdW5jdGlvbnMubm9uZSgpKSwgdHJ1ZSkpOwogCiAgICAgICAgICAgICAgICAgS2V5c3BhY2VNZXRhZGF0YSBrc20gPSBTY2hlbWEuaW5zdGFuY2UuZ2V0S2V5c3BhY2VNZXRhZGF0YShrZXlzcGFjZU5hbWUpOwogCkBAIC01ODcsOCArNTk3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgU1NUYWJsZVNpbXBsZVdyaXRlcihkaXJlY3RvcnksIHJlZiwgcHJlcGFyZWRNb2RpZmljYXRpb25TdGF0ZW1lbnQudXBkYXRlZENvbHVtbnMoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgU1NUYWJsZVNpbXBsZVVuc29ydGVkV3JpdGVyKGRpcmVjdG9yeSwgcmVmLCBwcmVwYXJlZE1vZGlmaWNhdGlvblN0YXRlbWVudC51cGRhdGVkQ29sdW1ucygpLCBidWZmZXJTaXplSW5NaUIpOwogCi0gICAgICAgICAgICAgICAgaWYgKGZvcm1hdFR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnNldFNTVGFibGVGb3JtYXRUeXBlKGZvcm1hdFR5cGUpOworICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnNldFNTVGFibGVGb3JtYXRUeXBlKGZvcm1hdCk7CiAKICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENRTFNTVGFibGVXcml0ZXIod3JpdGVyLCBwcmVwYXJlZE1vZGlmaWNhdGlvblN0YXRlbWVudCwgcHJlcGFyZWRNb2RpZmljYXRpb25TdGF0ZW1lbnQuZ2V0QmluZFZhcmlhYmxlcygpKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvQ29tcG9uZW50LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0NvbXBvbmVudC5qYXZhCmluZGV4IGQ4N2Q4YjcuLmYyZWVhOTkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvQ29tcG9uZW50LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9Db21wb25lbnQuamF2YQpAQCAtMTcsMTEgKzE3LDE4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKIAotaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50cy5UeXBlczsKIAogLyoqCiAgKiBTU1RhYmxlcyBhcmUgbWFkZSB1cCBvZiBtdWx0aXBsZSBjb21wb25lbnRzIGluIHNlcGFyYXRlIGZpbGVzLiBDb21wb25lbnRzIGFyZQpAQCAtMzIsODQgKzM5LDE0OSBAQAogewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBzZXBhcmF0b3IgPSAnLSc7CiAKLSAgICBmaW5hbCBzdGF0aWMgRW51bVNldDxUeXBlPiBUWVBFUyA9IEVudW1TZXQuYWxsT2YoVHlwZS5jbGFzcyk7Ci0KICAgICAvKioKICAgICAgKiBXQVJOSU5HOiBCZSBjYXJlZnVsIHdoaWxlIGNoYW5naW5nIHRoZSBuYW1lcyBvciBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVudW0KICAgICAgKiBtZW1iZXJzLiBTdHJlYW1pbmcgY29kZSBkZXBlbmRzIG9uIHRoZSBuYW1lcyBkdXJpbmcgc3RyZWFtaW5nIChSZWY6IENBU1NBTkRSQS0xNDU1NikuCiAgICAgICovCi0gICAgcHVibGljIGVudW0gVHlwZQorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2xhc3MgVHlwZQogICAgIHsKLSAgICAgICAgLy8gdGhlIGJhc2UgZGF0YSBmb3IgYW4gc3N0YWJsZTogdGhlIHJlbWFpbmluZyBjb21wb25lbnRzIGNhbiBiZSByZWdlbmVyYXRlZAotICAgICAgICAvLyBiYXNlZCBvbiB0aGUgZGF0YSBjb21wb25lbnQKLSAgICAgICAgREFUQSgiRGF0YS5kYiIpLAotICAgICAgICAvLyBpbmRleCBvZiB0aGUgcm93IGtleXMgd2l0aCBwb2ludGVycyB0byB0aGVpciBwb3NpdGlvbnMgaW4gdGhlIGRhdGEgZmlsZQotICAgICAgICBQUklNQVJZX0lOREVYKCJJbmRleC5kYiIpLAotICAgICAgICAvLyBzZXJpYWxpemVkIGJsb29tIGZpbHRlciBmb3IgdGhlIHJvdyBrZXlzIGluIHRoZSBzc3RhYmxlCi0gICAgICAgIEZJTFRFUigiRmlsdGVyLmRiIiksCi0gICAgICAgIC8vIGZpbGUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCB1bmNvbXByZXNzZWQgZGF0YSBsZW5ndGgsIGNodW5rIG9mZnNldHMgZXRjLgotICAgICAgICBDT01QUkVTU0lPTl9JTkZPKCJDb21wcmVzc2lvbkluZm8uZGIiKSwKLSAgICAgICAgLy8gc3RhdGlzdGljYWwgbWV0YWRhdGEgYWJvdXQgdGhlIGNvbnRlbnQgb2YgdGhlIHNzdGFibGUKLSAgICAgICAgU1RBVFMoIlN0YXRpc3RpY3MuZGIiKSwKLSAgICAgICAgLy8gaG9sZHMgQ1JDMzIgY2hlY2tzdW0gb2YgdGhlIGRhdGEgZmlsZQotICAgICAgICBESUdFU1QoIkRpZ2VzdC5jcmMzMiIpLAotICAgICAgICAvLyBob2xkcyB0aGUgQ1JDMzIgZm9yIGNodW5rcyBpbiBhbiBhIHVuY29tcHJlc3NlZCBmaWxlLgotICAgICAgICBDUkMoIkNSQy5kYiIpLAotICAgICAgICAvLyBob2xkcyBTU1RhYmxlIEluZGV4IFN1bW1hcnkgKHNhbXBsaW5nIG9mIEluZGV4IGNvbXBvbmVudCkKLSAgICAgICAgU1VNTUFSWSgiU3VtbWFyeS5kYiIpLAotICAgICAgICAvLyB0YWJsZSBvZiBjb250ZW50cywgc3RvcmVzIHRoZSBsaXN0IG9mIGFsbCBjb21wb25lbnRzIGZvciB0aGUgc3N0YWJsZQotICAgICAgICBUT0MoIlRPQy50eHQiKSwKLSAgICAgICAgLy8gYnVpbHQtaW4gc2Vjb25kYXJ5IGluZGV4IChtYXkgYmUgbXVsdGlwbGUgcGVyIHNzdGFibGUpCi0gICAgICAgIFNFQ09OREFSWV9JTkRFWCgiU0lfLiouZGIiKSwKLSAgICAgICAgLy8gY3VzdG9tIGNvbXBvbmVudCwgdXNlZCBieSBlLmcuIGN1c3RvbSBjb21wYWN0aW9uIHN0cmF0ZWd5Ci0gICAgICAgIENVU1RPTShudWxsKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQ29weU9uV3JpdGVBcnJheUxpc3Q8VHlwZT4gdHlwZXNDb2xsZWN0b3IgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8PigpOwogCi0gICAgICAgIGZpbmFsIFN0cmluZyByZXByOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8VHlwZT4gYWxsID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh0eXBlc0NvbGxlY3Rvcik7CiAKLSAgICAgICAgVHlwZShTdHJpbmcgcmVwcikKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBpZDsKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBuYW1lOworICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHJlcHI7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ29tcG9uZW50IHNpbmdsZXRvbjsKKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQorICAgICAgICBwdWJsaWMgZmluYWwgQ2xhc3M8PyBleHRlbmRzIFNTVGFibGVGb3JtYXQ+IGZvcm1hdENsYXNzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IG5vbi1zaW5nbGV0b24gdHlwZSBhbmQgcmVnaXN0ZXJzIGl0IGEgZ2xvYmFsIHR5cGUgcmVnaXN0cnkgLSBzZWUge0BsaW5rICNyZWdpc3RlclR5cGUoVHlwZSl9LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSAgICAgICAgdHlwZSBuYW1lLCBtdXN0IGJlIHVuaXF1ZSBmb3IgdGhpcyBhbmQgYWxsIHBhcmVudCBmb3JtYXRzCisgICAgICAgICAqIEBwYXJhbSByZXByICAgICAgICB0aGUgcmVndWxhciBleHByZXNzaW9uIHRvIGJlIHVzZWQgdG8gcmVjb2duaXplIGEgbmFtZSByZXByZXNlbnRzIHRoaXMgdHlwZQorICAgICAgICAgKiBAcGFyYW0gZm9ybWF0Q2xhc3MgZm9ybWF0IGNsYXNzIGZvciB3aGljaCB0aGlzIHR5cGUgaXMgZGVmaW5lZCBmb3IKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVHlwZSBjcmVhdGUoU3RyaW5nIG5hbWUsIFN0cmluZyByZXByLCBDbGFzczw/IGV4dGVuZHMgU1NUYWJsZUZvcm1hdDw/LCA/Pj4gZm9ybWF0Q2xhc3MpCiAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVHlwZShuYW1lLCByZXByLCBmYWxzZSwgZm9ybWF0Q2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgc2luZ2xldG9uIHR5cGUgYW5kIHJlZ2lzdGVycyBpdCBpbiBhIGdsb2JhbCB0eXBlIHJlZ2lzdHJ5IC0gc2VlIHtAbGluayAjcmVnaXN0ZXJUeXBlKFR5cGUpfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUgICAgICAgIHR5cGUgbmFtZSwgbXVzdCBiZSB1bmlxdWUgZm9yIHRoaXMgYW5kIGFsbCBwYXJlbnQgZm9ybWF0cworICAgICAgICAgKiBAcGFyYW0gcmVwciAgICAgICAgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSB1c2VkIHRvIHJlY29nbml6ZSBhIG5hbWUgcmVwcmVzZW50cyB0aGlzIHR5cGUKKyAgICAgICAgICogQHBhcmFtIGZvcm1hdENsYXNzIGZvcm1hdCBjbGFzcyBmb3Igd2hpY2ggdGhpcyB0eXBlIGlzIGRlZmluZWQgZm9yCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFR5cGUgY3JlYXRlU2luZ2xldG9uKFN0cmluZyBuYW1lLCBTdHJpbmcgcmVwciwgQ2xhc3M8PyBleHRlbmRzIFNTVGFibGVGb3JtYXQ8PywgPz4+IGZvcm1hdENsYXNzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFR5cGUobmFtZSwgcmVwciwgdHJ1ZSwgZm9ybWF0Q2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBUeXBlKFN0cmluZyBuYW1lLCBTdHJpbmcgcmVwciwgYm9vbGVhbiBpc1NpbmdsZXRvbiwgQ2xhc3M8PyBleHRlbmRzIFNTVGFibGVGb3JtYXQ8PywgPz4+IGZvcm1hdENsYXNzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBPYmplY3RzLnJlcXVpcmVOb25OdWxsKG5hbWUpOwogICAgICAgICAgICAgdGhpcy5yZXByID0gcmVwcjsKKyAgICAgICAgICAgIHRoaXMuaWQgPSB0eXBlc0NvbGxlY3Rvci5zaXplKCk7CisgICAgICAgICAgICB0aGlzLmZvcm1hdENsYXNzID0gZm9ybWF0Q2xhc3MgPT0gbnVsbCA/IFNTVGFibGVGb3JtYXQuY2xhc3MgOiBmb3JtYXRDbGFzczsKKyAgICAgICAgICAgIHRoaXMuc2luZ2xldG9uID0gaXNTaW5nbGV0b24gPyBuZXcgQ29tcG9uZW50KHRoaXMpIDogbnVsbDsKKworICAgICAgICAgICAgcmVnaXN0ZXJUeXBlKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElmIHlvdSBoYXZlIHR3byBmb3JtYXRzIHJlZ2lzdGVyZWQsIHRoZXkgbWF5IGJvdGggZGVmaW5lIGEgdHlwZSBzYXkgYElOREVYYC4gSXQgaXMgYWxsb3dlZCBldmVuIHRob3VnaAorICAgICAgICAgKiB0aGV5IGhhdmUgdGhlIHNhbWUgbmFtZSBiZWNhdXNlIHRoZXkgYXJlIG5vdCBpbiB0aGUgc2FtZSBicmFuY2guIFRob3VnaCwgd2UgY2Fubm90IGxldCBhIGN1c3RvbSB0eXBlCisgICAgICAgICAqIGRlZmluZSBhIHR5cGUgYFRPQ2Agd2hpY2ggaXMgZGVjbGFyZWQgb24gdGhlIHRvcCBsZXZlbC4KKyAgICAgICAgICogU28sIGUuZy4gZ2l2ZW4gd2UgaGF2ZSBgVE9DQFNTVGFibGVGb3JtYXRgLCBhbmQgYEJpZ0Zvcm1hdGAgdHJpZXMgdG8gZGVmaW5lIGBUT0NAQmlnRm9ybWF0YCwgd2Ugc2hvdWxkCisgICAgICAgICAqIGZvcmJpZCB0aGF0OyBidXQsIGdpdmVuIHdlIGhhdmUgYElOREVYQEJpZ0Zvcm1hdGAsIHdlIHNob3VsZCBhbGxvdyB0byBkZWZpbmUgYElOREVYQFRyaWVGb3JtYXRgIGFzIHRob3NlCisgICAgICAgICAqIHR5cGVzIGFyZSBiZSBkaXN0aW5ndWlzaGFibGUgdmlhIGZvcm1hdCB0eXBlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdHlwZSBhIHR5cGUgdG8gYmUgcmVnaXN0ZXJlZAorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWdpc3RlclR5cGUoVHlwZSB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHR5cGVzQ29sbGVjdG9yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0eXBlc0NvbGxlY3Rvci5zdHJlYW0oKS5hbnlNYXRjaCh0IC0+IChPYmplY3RzLmVxdWFscyh0Lm5hbWUsIHR5cGUubmFtZSkgfHwgT2JqZWN0cy5lcXVhbHModC5yZXByLCB0eXBlLnJlcHIpKSAmJiAodC5mb3JtYXRDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUuZm9ybWF0Q2xhc3MpKSkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVHlwZSBuYW1lZCAiICsgdHlwZS5uYW1lICsgIiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQiKTsKKworICAgICAgICAgICAgICAgIHR5cGVzQ29sbGVjdG9yLmFkZCh0eXBlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgICAgICBwdWJsaWMgc3RhdGljIFR5cGUgZnJvbVJlcHJlc2VudGF0aW9uKFN0cmluZyByZXByKQorICAgICAgICBwdWJsaWMgc3RhdGljIFR5cGUgZnJvbVJlcHJlc2VudGF0aW9uKFN0cmluZyByZXByLCBTU1RhYmxlRm9ybWF0PD8sID8+IGZvcm1hdCkKICAgICAgICAgewotICAgICAgICAgICAgZm9yIChUeXBlIHR5cGUgOiBUWVBFUykKKyAgICAgICAgICAgIGZvciAoVHlwZSB0eXBlIDogVHlwZS5hbGwpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUucmVwciAhPSBudWxsICYmIFBhdHRlcm4ubWF0Y2hlcyh0eXBlLnJlcHIsIHJlcHIpKQorICAgICAgICAgICAgICAgIGlmICh0eXBlLnJlcHIgIT0gbnVsbCAmJiBQYXR0ZXJuLm1hdGNoZXModHlwZS5yZXByLCByZXByKSAmJiB0eXBlLmZvcm1hdENsYXNzLmlzQXNzaWduYWJsZUZyb20oZm9ybWF0LmdldENsYXNzKCkpKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDVVNUT007CisgICAgICAgICAgICByZXR1cm4gVHlwZXMuQ1VTVE9NOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBDb21wb25lbnQgY3JlYXRlQ29tcG9uZW50KFN0cmluZyByZXByLCBTU1RhYmxlRm9ybWF0PD8sID8+IGZvcm1hdCkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZSB0eXBlID0gZnJvbVJlcHJlc2VudGF0aW9uKHJlcHIsIGZvcm1hdCk7CisgICAgICAgICAgICBpZiAodHlwZS5zaW5nbGV0b24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5zaW5nbGV0b247CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnQodHlwZSwgcmVwcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIFR5cGUgdHlwZSA9IChUeXBlKSBvOworICAgICAgICAgICAgcmV0dXJuIGlkID09IHR5cGUuaWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29tcG9uZW50IGdldFNpbmdsZXRvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBPYmplY3RzLnJlcXVpcmVOb25OdWxsKHNpbmdsZXRvbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29tcG9uZW50IGNyZWF0ZUNvbXBvbmVudChTdHJpbmcgcmVwcikKKyAgICAgICAgeworICAgICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50KHNpbmdsZXRvbiA9PSBudWxsKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50KHRoaXMsIHJlcHIpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gc2luZ2xldG9uIGNvbXBvbmVudHMgZm9yIHR5cGVzIHRoYXQgZG9uJ3QgbmVlZCBpZHMKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIENvbXBvbmVudCBEQVRBID0gbmV3IENvbXBvbmVudChUeXBlLkRBVEEpOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29tcG9uZW50IFBSSU1BUllfSU5ERVggPSBuZXcgQ29tcG9uZW50KFR5cGUuUFJJTUFSWV9JTkRFWCk7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBDb21wb25lbnQgRklMVEVSID0gbmV3IENvbXBvbmVudChUeXBlLkZJTFRFUik7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBDb21wb25lbnQgQ09NUFJFU1NJT05fSU5GTyA9IG5ldyBDb21wb25lbnQoVHlwZS5DT01QUkVTU0lPTl9JTkZPKTsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIENvbXBvbmVudCBTVEFUUyA9IG5ldyBDb21wb25lbnQoVHlwZS5TVEFUUyk7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBDb21wb25lbnQgRElHRVNUID0gbmV3IENvbXBvbmVudChUeXBlLkRJR0VTVCk7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBDb21wb25lbnQgQ1JDID0gbmV3IENvbXBvbmVudChUeXBlLkNSQyk7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBDb21wb25lbnQgU1VNTUFSWSA9IG5ldyBDb21wb25lbnQoVHlwZS5TVU1NQVJZKTsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIENvbXBvbmVudCBUT0MgPSBuZXcgQ29tcG9uZW50KFR5cGUuVE9DKTsKLQogICAgIHB1YmxpYyBmaW5hbCBUeXBlIHR5cGU7CiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBuYW1lOwogICAgIHB1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGU7CiAKLSAgICBwdWJsaWMgQ29tcG9uZW50KFR5cGUgdHlwZSkKKyAgICBwcml2YXRlIENvbXBvbmVudChUeXBlIHR5cGUpCiAgICAgewogICAgICAgICB0aGlzKHR5cGUsIHR5cGUucmVwcik7Ci0gICAgICAgIGFzc2VydCB0eXBlICE9IFR5cGUuQ1VTVE9NOwogICAgIH0KIAotICAgIHB1YmxpYyBDb21wb25lbnQoVHlwZSB0eXBlLCBTdHJpbmcgbmFtZSkKKyAgICBwcml2YXRlIENvbXBvbmVudChUeXBlIHR5cGUsIFN0cmluZyBuYW1lKQogICAgIHsKICAgICAgICAgYXNzZXJ0IG5hbWUgIT0gbnVsbCA6ICJDb21wb25lbnQgbmFtZSBjYW5ub3QgYmUgbnVsbCI7CisKICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy5oYXNoQ29kZSA9IE9iamVjdHMuaGFzaENvZGUodHlwZSwgbmFtZSk7CisgICAgICAgIHRoaXMuaGFzaENvZGUgPSBPYmplY3RzLmhhc2godHlwZSwgbmFtZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjcsMjYgKzE5OSwyNCBAQAogICAgICAqIEByZXR1cm4gdGhlIGNvbXBvbmVudCBjb3JyZXNwb25kaW5nIHRvIHtAY29kZSBuYW1lfS4gTm90ZSB0aGF0IHRoaXMgYWx3YXlzIHJldHVybiBhIGNvbXBvbmVudCBhcyBhbiB1bnJlY29nbml6ZWQKICAgICAgKiBuYW1lIGlzIHBhcnNlZCBpbnRvIGEgQ1VTVE9NIGNvbXBvbmVudC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENvbXBvbmVudCBwYXJzZShTdHJpbmcgbmFtZSkKKyAgICBwdWJsaWMgc3RhdGljIENvbXBvbmVudCBwYXJzZShTdHJpbmcgbmFtZSwgU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXQpCiAgICAgewotICAgICAgICBUeXBlIHR5cGUgPSBUeXBlLmZyb21SZXByZXNlbnRhdGlvbihuYW1lKTsKKyAgICAgICAgcmV0dXJuIFR5cGUuY3JlYXRlQ29tcG9uZW50KG5hbWUsIGZvcm1hdCk7CisgICAgfQogCi0gICAgICAgIC8vIEJ1aWxkIChvciByZXRyaWV2ZSBzaW5nbGV0b24gZm9yKSB0aGUgY29tcG9uZW50IG9iamVjdAotICAgICAgICBzd2l0Y2ggKHR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgREFUQTogICAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudC5EQVRBOwotICAgICAgICAgICAgY2FzZSBQUklNQVJZX0lOREVYOiAgICByZXR1cm4gQ29tcG9uZW50LlBSSU1BUllfSU5ERVg7Ci0gICAgICAgICAgICBjYXNlIEZJTFRFUjogICAgICAgICAgIHJldHVybiBDb21wb25lbnQuRklMVEVSOwotICAgICAgICAgICAgY2FzZSBDT01QUkVTU0lPTl9JTkZPOiByZXR1cm4gQ29tcG9uZW50LkNPTVBSRVNTSU9OX0lORk87Ci0gICAgICAgICAgICBjYXNlIFNUQVRTOiAgICAgICAgICAgIHJldHVybiBDb21wb25lbnQuU1RBVFM7Ci0gICAgICAgICAgICBjYXNlIERJR0VTVDogICAgICAgICAgIHJldHVybiBDb21wb25lbnQuRElHRVNUOwotICAgICAgICAgICAgY2FzZSBDUkM6ICAgICAgICAgICAgICByZXR1cm4gQ29tcG9uZW50LkNSQzsKLSAgICAgICAgICAgIGNhc2UgU1VNTUFSWTogICAgICAgICAgcmV0dXJuIENvbXBvbmVudC5TVU1NQVJZOwotICAgICAgICAgICAgY2FzZSBUT0M6ICAgICAgICAgICAgICByZXR1cm4gQ29tcG9uZW50LlRPQzsKLSAgICAgICAgICAgIGNhc2UgU0VDT05EQVJZX0lOREVYOiAgcmV0dXJuIG5ldyBDb21wb25lbnQoVHlwZS5TRUNPTkRBUllfSU5ERVgsIG5hbWUpOwotICAgICAgICAgICAgY2FzZSBDVVNUT006ICAgICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudChUeXBlLkNVU1RPTSwgbmFtZSk7Ci0gICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOwotICAgICAgICB9CisgICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxDb21wb25lbnQ+IGdldFNpbmdsZXRvbnNGb3IoU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXQpCisgICAgeworICAgICAgICByZXR1cm4gSXRlcmFibGVzLnRyYW5zZm9ybShJdGVyYWJsZXMuZmlsdGVyKFR5cGUuYWxsLCB0IC0+IHQuc2luZ2xldG9uICE9IG51bGwgJiYgdC5mb3JtYXRDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGZvcm1hdC5nZXRDbGFzcygpKSksIHQgLT4gdC5zaW5nbGV0b24pOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgSXRlcmFibGU8Q29tcG9uZW50PiBnZXRTaW5nbGV0b25zRm9yKENsYXNzPD8gZXh0ZW5kcyBTU1RhYmxlRm9ybWF0PD8sID8+PiBmb3JtYXRDbGFzcykKKyAgICB7CisgICAgICAgIHJldHVybiBJdGVyYWJsZXMudHJhbnNmb3JtKEl0ZXJhYmxlcy5maWx0ZXIoVHlwZS5hbGwsIHQgLT4gdC5zaW5nbGV0b24gIT0gbnVsbCAmJiB0LmZvcm1hdENsYXNzLmlzQXNzaWduYWJsZUZyb20oZm9ybWF0Q2xhc3MpKSwgdCAtPiB0LnNpbmdsZXRvbik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZEZvcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCisgICAgeworICAgICAgICByZXR1cm4gdHlwZS5mb3JtYXRDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGRlc2NyaXB0b3IudmVyc2lvbi5mb3JtYXQuZ2V0Q2xhc3MoKSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNjIsOCArMjMyLDggQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgQ29tcG9uZW50KSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgQ29tcG9uZW50IHRoYXQgPSAoQ29tcG9uZW50KW87Ci0gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT0gdGhhdC50eXBlICYmIHRoaXMubmFtZS5lcXVhbHModGhhdC5uYW1lKTsKKyAgICAgICAgQ29tcG9uZW50IHRoYXQgPSAoQ29tcG9uZW50KSBvOworICAgICAgICByZXR1cm4gdGhpcy5oYXNoQ29kZSA9PSB0aGF0Lmhhc2hDb2RlICYmIHRoaXMudHlwZSA9PSB0aGF0LnR5cGUgJiYgdGhpcy5uYW1lLmVxdWFscyh0aGF0Lm5hbWUpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9EZXNjcmlwdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0Rlc2NyaXB0b3IuamF2YQppbmRleCA3NWQ1MTg1Li5kNzdkMWYxIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0Rlc2NyaXB0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0Rlc2NyaXB0b3IuamF2YQpAQCAtMTcsMTMgKzE3LDIxIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKIAotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlNwbGl0dGVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb247CkBAIC0zMiw2ICs0MCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiAKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQuc2VwYXJhdG9yOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEOwogCkBAIC00NCw2ICs1MywyNCBAQAogICovCiBwdWJsaWMgY2xhc3MgRGVzY3JpcHRvcgogeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihEZXNjcmlwdG9yLmNsYXNzKTsKKworICAgIC8vIEN1cnJlbnQgU1NUYWJsZSBkaXJlY3RvcnkgZm9ybWF0IGlzIHtrZXlzcGFjZX0ve3RhYmxlTmFtZX0te3RhYmxlSWR9Wy9iYWNrdXBzfC9zbmFwc2hvdHMve3RhZ31dWy8ue2luZGV4TmFtZX1dL3tjb21wb25lbnR9LmRiCisgICAgLy8gKiB7dmFyfSBhcmUgbWFuZGF0b3J5IGNvbXBvbmVudHMKKyAgICAvLyAqIFt2YXJdIGFyZSBvcHRpb25hbCBjb21wb25lbnRzCisgICAgc3RhdGljIGZpbmFsIFBhdHRlcm4gU1NUQUJMRV9ESVJfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiLiovKD88a2V5c3BhY2U+XFx3KykvIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKD88dGFibGVOYW1lPlxcdyspLSg/PHRhYmxlSWQ+WzAtOWEtZl17MzJ9KS8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoYmFja3Vwcy98c25hcHNob3RzLyg/PHRhZz5bXFx3LV0rKS8pPyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihcXC4oPzxpbmRleE5hbWU+W1xcdy1dKykvKT8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoPzxjb21wb25lbnQ+W1xcdy1dKylcXC4oPzxleHQ+W1xcd10rKSQiKTsKKworICAgIC8vIFByZSAyLjEgU1NUYWJsZSBkaXJlY3RvcnkgZm9ybWF0IGlzIHtrZXlzcGFjZX0ve3RhYmxlTmFtZX0te3RhYmxlSWR9Wy9iYWNrdXBzfC9zbmFwc2hvdHMve3RhZ31dWy8ue2luZGV4TmFtZX1dL3tjb21wb25lbnR9LmRiCisgICAgc3RhdGljIGZpbmFsIFBhdHRlcm4gTEVHQUNZX1NTVEFCTEVfRElSX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIi4qLyg/PGtleXNwYWNlPlxcdyspLyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoPzx0YWJsZU5hbWU+XFx3KykvIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihiYWNrdXBzL3xzbmFwc2hvdHMvKD88dGFnPltcXHctXSspLyk/IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihcXC4oPzxpbmRleE5hbWU+W1xcdy1dKykvKT8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKD88Y29tcG9uZW50PltcXHctXSspXFwuKD88ZXh0PltcXHddKykkIik7CisKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTEVHQUNZX1RNUF9SRUdFWF9TVFIgPSAiXigoLiopXFwtKC4qKVxcLSk/dG1wKGxpbmspP1xcLSgoPzpsfGspLilcXC0oXFxkKSpcXC0oLiopJCI7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUGF0dGVybiBMRUdBQ1lfVE1QX1JFR0VYID0gUGF0dGVybi5jb21waWxlKExFR0FDWV9UTVBfUkVHRVhfU1RSKTsKIApAQCAtNjAsOCArODcsOSBAQAogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcga3NuYW1lOwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY2ZuYW1lOwogICAgIHB1YmxpYyBmaW5hbCBTU1RhYmxlSWQgaWQ7Ci0gICAgcHVibGljIGZpbmFsIFNTVGFibGVGb3JtYXQuVHlwZSBmb3JtYXRUeXBlOwogICAgIHByaXZhdGUgZmluYWwgaW50IGhhc2hDb2RlOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHByZWZpeDsKKyAgICBwcml2YXRlIGZpbmFsIEZpbGUgYmFzZUZpbGU7CiAKICAgICAvKioKICAgICAgKiBBIGRlc2NyaXB0b3IgdGhhdCBhc3N1bWVzIENVUlJFTlRfVkVSU0lPTi4KQEAgLTY5LDc1ICs5Nyw5MCBAQAogICAgIEBWaXNpYmxlRm9yVGVzdGluZwogICAgIHB1YmxpYyBEZXNjcmlwdG9yKEZpbGUgZGlyZWN0b3J5LCBTdHJpbmcga3NuYW1lLCBTdHJpbmcgY2ZuYW1lLCBTU1RhYmxlSWQgaWQpCiAgICAgewotICAgICAgICB0aGlzKFNTVGFibGVGb3JtYXQuVHlwZS5jdXJyZW50KCkuaW5mby5nZXRMYXRlc3RWZXJzaW9uKCksIGRpcmVjdG9yeSwga3NuYW1lLCBjZm5hbWUsIGlkLCBTU1RhYmxlRm9ybWF0LlR5cGUuY3VycmVudCgpKTsKKyAgICAgICAgdGhpcyhEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkuZ2V0TGF0ZXN0VmVyc2lvbigpLCBkaXJlY3RvcnksIGtzbmFtZSwgY2ZuYW1lLCBpZCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0b3IgZm9yIHNzdGFibGUgd3JpdGVycyBvbmx5LgogICAgICAqLwotICAgIHB1YmxpYyBEZXNjcmlwdG9yKEZpbGUgZGlyZWN0b3J5LCBTdHJpbmcga3NuYW1lLCBTdHJpbmcgY2ZuYW1lLCBTU1RhYmxlSWQgaWQsIFNTVGFibGVGb3JtYXQuVHlwZSBmb3JtYXRUeXBlKQorICAgIHB1YmxpYyBEZXNjcmlwdG9yKEZpbGUgZGlyZWN0b3J5LCBTdHJpbmcga3NuYW1lLCBTdHJpbmcgY2ZuYW1lLCBTU1RhYmxlSWQgaWQsIFNTVGFibGVGb3JtYXQ8PywgPz4gZm9ybWF0KQogICAgIHsKLSAgICAgICAgdGhpcyhmb3JtYXRUeXBlLmluZm8uZ2V0TGF0ZXN0VmVyc2lvbigpLCBkaXJlY3RvcnksIGtzbmFtZSwgY2ZuYW1lLCBpZCwgZm9ybWF0VHlwZSk7CisgICAgICAgIHRoaXMoZm9ybWF0LmdldExhdGVzdFZlcnNpb24oKSwgZGlyZWN0b3J5LCBrc25hbWUsIGNmbmFtZSwgaWQpOwogICAgIH0KIAogICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHB1YmxpYyBEZXNjcmlwdG9yKFN0cmluZyB2ZXJzaW9uLCBGaWxlIGRpcmVjdG9yeSwgU3RyaW5nIGtzbmFtZSwgU3RyaW5nIGNmbmFtZSwgU1NUYWJsZUlkIGlkLCBTU1RhYmxlRm9ybWF0LlR5cGUgZm9ybWF0VHlwZSkKKyAgICBwdWJsaWMgRGVzY3JpcHRvcihTdHJpbmcgdmVyc2lvbiwgRmlsZSBkaXJlY3RvcnksIFN0cmluZyBrc25hbWUsIFN0cmluZyBjZm5hbWUsIFNTVGFibGVJZCBpZCwgU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXQpCiAgICAgewotICAgICAgICB0aGlzKGZvcm1hdFR5cGUuaW5mby5nZXRWZXJzaW9uKHZlcnNpb24pLCBkaXJlY3RvcnksIGtzbmFtZSwgY2ZuYW1lLCBpZCwgZm9ybWF0VHlwZSk7CisgICAgICAgIHRoaXMoZm9ybWF0LmdldFZlcnNpb24odmVyc2lvbiksIGRpcmVjdG9yeSwga3NuYW1lLCBjZm5hbWUsIGlkKTsKICAgICB9CiAKLSAgICBwdWJsaWMgRGVzY3JpcHRvcihWZXJzaW9uIHZlcnNpb24sIEZpbGUgZGlyZWN0b3J5LCBTdHJpbmcga3NuYW1lLCBTdHJpbmcgY2ZuYW1lLCBTU1RhYmxlSWQgaWQsIFNTVGFibGVGb3JtYXQuVHlwZSBmb3JtYXRUeXBlKQorICAgIHB1YmxpYyBEZXNjcmlwdG9yKFZlcnNpb24gdmVyc2lvbiwgRmlsZSBkaXJlY3RvcnksIFN0cmluZyBrc25hbWUsIFN0cmluZyBjZm5hbWUsIFNTVGFibGVJZCBpZCkKICAgICB7Ci0gICAgICAgIGFzc2VydCB2ZXJzaW9uICE9IG51bGwgJiYgZGlyZWN0b3J5ICE9IG51bGwgJiYga3NuYW1lICE9IG51bGwgJiYgY2ZuYW1lICE9IG51bGwgJiYgZm9ybWF0VHlwZS5pbmZvLmdldExhdGVzdFZlcnNpb24oKS5nZXRDbGFzcygpLmVxdWFscyh2ZXJzaW9uLmdldENsYXNzKCkpOworICAgICAgICBjaGVja05vdE51bGwodmVyc2lvbik7CisgICAgICAgIGNoZWNrTm90TnVsbChkaXJlY3RvcnkpOworICAgICAgICBjaGVja05vdE51bGwoa3NuYW1lKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGNmbmFtZSk7CisKICAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKICAgICAgICAgdGhpcy5kaXJlY3RvcnkgPSBkaXJlY3RvcnkudG9DYW5vbmljYWwoKTsKICAgICAgICAgdGhpcy5rc25hbWUgPSBrc25hbWU7CiAgICAgICAgIHRoaXMuY2ZuYW1lID0gY2ZuYW1lOwogICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgICAgIHRoaXMuZm9ybWF0VHlwZSA9IGZvcm1hdFR5cGU7CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBhcHBlbmRGaWxlTmFtZShidWYpOworICAgICAgICB0aGlzLnByZWZpeCA9IGJ1Zi50b1N0cmluZygpOworICAgICAgICB0aGlzLmJhc2VGaWxlID0gbmV3IEZpbGUoZGlyZWN0b3J5LnRvUGF0aCgpLnJlc29sdmUocHJlZml4KSk7CiAKICAgICAgICAgLy8gZGlyZWN0b3J5IGlzIHVubmVjZXNzYXJ5IGZvciBoYXNoQ29kZSwgYW5kIGZvciBzaW11bGF0b3IgY29uc2lzdGVuY3kgd2UgZG8gbm90IGluY2x1ZGUgaXQKLSAgICAgICAgaGFzaENvZGUgPSBPYmplY3RzLmhhc2hDb2RlKHZlcnNpb24sIGlkLCBrc25hbWUsIGNmbmFtZSwgZm9ybWF0VHlwZSk7CisgICAgICAgIGhhc2hDb2RlID0gT2JqZWN0cy5oYXNoQ29kZSh2ZXJzaW9uLCBpZCwga3NuYW1lLCBjZm5hbWUpOwogICAgIH0KIAotICAgIHB1YmxpYyBTdHJpbmcgdG1wRmlsZW5hbWVGb3IoQ29tcG9uZW50IGNvbXBvbmVudCkKKyAgICBwcml2YXRlIFN0cmluZyB0bXBGaWxlbmFtZUZvcihDb21wb25lbnQgY29tcG9uZW50KQogICAgIHsKLSAgICAgICAgcmV0dXJuIGZpbGVuYW1lRm9yKGNvbXBvbmVudCkgKyBUTVBfRVhUOworICAgICAgICByZXR1cm4gZmlsZUZvcihjb21wb25lbnQpICsgVE1QX0VYVDsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGEgdW5pcXVlIHRlbXBvcmFyeSBmaWxlIG5hbWUgZm9yIGdpdmVuIGNvbXBvbmVudCBkdXJpbmcgZW50aXJlLXNzdGFibGUtc3RyZWFtaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG1wRmlsZW5hbWVGb3JTdHJlYW1pbmcoQ29tcG9uZW50IGNvbXBvbmVudCkKKyAgICBwdWJsaWMgRmlsZSB0bXBGaWxlRm9yKENvbXBvbmVudCBjb21wb25lbnQpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEZpbGUoZGlyZWN0b3J5LnRvUGF0aCgpLnJlc29sdmUodG1wRmlsZW5hbWVGb3IoY29tcG9uZW50KSkpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHRtcEZpbGVuYW1lRm9yU3RyZWFtaW5nKENvbXBvbmVudCBjb21wb25lbnQpCiAgICAgewogICAgICAgICAvLyBVc2UgVVVJRCB0byBoYW5kbGUgY29uY3VycmVudCBzdHJlYW1pbmdzIG9uIHRoZSBzYW1lIHNzdGFibGUuCiAgICAgICAgIC8vIFRNUF9FWFQgYWxsb3dzIHRlbXAgZmlsZSB0byBiZSByZW1vdmVkIGJ5IHtAbGluayBDb2x1bW5GYW1pbHlTdG9yZSNzY3J1YkRhdGFEaXJlY3Rvcmllc30KICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzLiVzJXMiLCBmaWxlbmFtZUZvcihjb21wb25lbnQpLCBuZXh0VGltZVVVSUQoKSwgVE1QX0VYVCk7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyBmaWxlbmFtZUZvcihDb21wb25lbnQgY29tcG9uZW50KQorICAgIC8qKgorICAgICAqIEByZXR1cm4gYSB1bmlxdWUgdGVtcG9yYXJ5IGZpbGUgbmFtZSBmb3IgZ2l2ZW4gY29tcG9uZW50IGR1cmluZyBlbnRpcmUtc3N0YWJsZS1zdHJlYW1pbmcuCisgICAgICovCisgICAgcHVibGljIEZpbGUgdG1wRmlsZUZvclN0cmVhbWluZyhDb21wb25lbnQgY29tcG9uZW50KQogICAgIHsKLSAgICAgICAgcmV0dXJuIGJhc2VGaWxlbmFtZSgpICsgc2VwYXJhdG9yICsgY29tcG9uZW50Lm5hbWUoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGRpcmVjdG9yeS50b1BhdGgoKS5yZXNvbHZlKHRtcEZpbGVuYW1lRm9yU3RyZWFtaW5nKGNvbXBvbmVudCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBmaWxlbmFtZUZvcihDb21wb25lbnQgY29tcG9uZW50KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHByZWZpeCArIHNlcGFyYXRvciArIGNvbXBvbmVudC5uYW1lKCk7CiAgICAgfQogCiAgICAgcHVibGljIEZpbGUgZmlsZUZvcihDb21wb25lbnQgY29tcG9uZW50KQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGZpbGVuYW1lRm9yKGNvbXBvbmVudCkpOworICAgICAgICByZXR1cm4gbmV3IEZpbGUoZGlyZWN0b3J5LnRvUGF0aCgpLnJlc29sdmUoZmlsZW5hbWVGb3IoY29tcG9uZW50KSkpOwogICAgIH0KIAotICAgIHB1YmxpYyBTdHJpbmcgYmFzZUZpbGVuYW1lKCkKKyAgICBwdWJsaWMgRmlsZSBiYXNlRmlsZSgpCiAgICAgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBidWZmLmFwcGVuZChkaXJlY3RvcnkpLmFwcGVuZChGaWxlLnBhdGhTZXBhcmF0b3IoKSk7Ci0gICAgICAgIGFwcGVuZEZpbGVOYW1lKGJ1ZmYpOwotICAgICAgICByZXR1cm4gYnVmZi50b1N0cmluZygpOworICAgICAgICByZXR1cm4gYmFzZUZpbGU7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZEZpbGVOYW1lKFN0cmluZ0J1aWxkZXIgYnVmZikKICAgICB7CiAgICAgICAgIGJ1ZmYuYXBwZW5kKHZlcnNpb24pLmFwcGVuZChzZXBhcmF0b3IpOwogICAgICAgICBidWZmLmFwcGVuZChpZC50b1N0cmluZygpKTsKLSAgICAgICAgYnVmZi5hcHBlbmQoc2VwYXJhdG9yKS5hcHBlbmQoZm9ybWF0VHlwZS5uYW1lKTsKKyAgICAgICAgYnVmZi5hcHBlbmQoc2VwYXJhdG9yKS5hcHBlbmQodmVyc2lvbi5mb3JtYXQubmFtZSgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIHJlbGF0aXZlRmlsZW5hbWVGb3IoQ29tcG9uZW50IGNvbXBvbmVudCkKQEAgLTE1Myw5ICsxOTYsOSBAQAogICAgICAgICByZXR1cm4gYnVmZi50b1N0cmluZygpOwogICAgIH0KIAotICAgIHB1YmxpYyBTU1RhYmxlRm9ybWF0IGdldEZvcm1hdCgpCisgICAgcHVibGljIFNTVGFibGVGb3JtYXQ8PywgPz4gZ2V0Rm9ybWF0KCkKICAgICB7Ci0gICAgICAgIHJldHVybiBmb3JtYXRUeXBlLmluZm87CisgICAgICAgIHJldHVybiB2ZXJzaW9uLmZvcm1hdDsKICAgICB9CiAKICAgICAvKiogUmV0dXJuIGFueSB0ZW1wb3JhcnkgZmlsZXMgZm91bmQgaW4gdGhlIGRpcmVjdG9yeSAqLwpAQCAtMTcxLDYgKzIxNCwyMiBAQAogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBjb21wb25lbnRzIGNvbnNpc3Rpbmcgb2YgdGhlIHByb3ZpZGVkIG1hbmRhdG9yeSBjb21wb25lbnRzIGFuZCB0aG9zZSBvcHRpb25hbCBjb21wb25lbnRzCisgICAgICogZm9yIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIGZpbGUgZXhpc3RzLgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8Q29tcG9uZW50PiBnZXRDb21wb25lbnRzKFNldDxDb21wb25lbnQ+IG1hbmRhdG9yeSwgU2V0PENvbXBvbmVudD4gb3B0aW9uYWwpCisgICAgeworICAgICAgICBJbW11dGFibGVTZXQuQnVpbGRlcjxDb21wb25lbnQ+IGJ1aWxkZXIgPSBJbW11dGFibGVTZXQuYnVpbGRlcigpOworICAgICAgICBidWlsZGVyLmFkZEFsbChtYW5kYXRvcnkpOworICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBvcHRpb25hbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpbGVGb3IoY29tcG9uZW50KS5leGlzdHMoKSkKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFkZChjb21wb25lbnQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRGaWxlKEZpbGUgZmlsZSkKICAgICB7CiAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGZpbGUubmFtZSgpOwpAQCAtMTgwLDIzICsyMzksNiBAQAogICAgIC8qKgogICAgICAqIFBhcnNlIGEgc3N0YWJsZSBmaWxlbmFtZSBpbnRvIGEgRGVzY3JpcHRvci4KICAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgZm9yIHtAY29kZSBmcm9tRmlsZW5hbWUobmV3IEZpbGUoZmlsZW5hbWUpKX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lIHRvIGEgc3N0YWJsZSBjb21wb25lbnQuCi0gICAgICogQHJldHVybiB0aGUgZGVzY3JpcHRvciBmb3IgdGhlIHBhcnNlZCBmaWxlLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHByb3ZpZGVkIHtAY29kZSBmaWxlfSBkb2VzIHBvaW50IHRvIGEgdmFsaWQgc3N0YWJsZSBmaWxlbmFtZS4gVGhpcyBjb3VsZAotICAgICAqIG1lYW4gZWl0aGVyIHRoYXQgdGhlIGZpbGVuYW1lIGRvZXNuJ3QgbG9vayBsaWtlIGEgc3N0YWJsZSBmaWxlLCBvciB0aGF0IGl0IGlzIGZvciBhbiBvbGQgYW5kIHVuc3VwcG9ydGVkCi0gICAgICogdmVyc2lvbnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEZXNjcmlwdG9yIGZyb21GaWxlbmFtZShTdHJpbmcgZmlsZW5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gZnJvbUZpbGVuYW1lKG5ldyBGaWxlKGZpbGVuYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgYSBzc3RhYmxlIGZpbGVuYW1lIGludG8gYSBEZXNjcmlwdG9yLgotICAgICAqIDxwPgogICAgICAqIFNTVGFibGVzIGZpbGVzIGFyZSBhbGwgbG9jYXRlZCB3aXRoaW4gc3ViZGlyZWN0b3JpZXMgb2YgdGhlIGZvcm0ge0Bjb2RlIDxrZXlzcGFjZT4vPHRhYmxlPi99LiBOb3JtYWwgc3N0YWJsZXMgYXJlCiAgICAgICogYXJlIGRpcmVjdGx5IHdpdGhpbiB0aGF0IHN1YmRpcmVjdG9yeSBzdHJ1Y3R1cmUgd2hpbGUgMm5kYXJ5IGluZGV4LCBiYWNrdXBzIGFuZCBzbmFwc2hvdCBhcmUgZWFjaCBpbnNpZGUgYW4KICAgICAgKiBhZGRpdGlvbmFsIHN1YmRpcmVjdG9yeS4gVGhlIGZpbGUgdGhlbXNlbHZlcyBoYXZlIHRoZSBmb3JtOgpAQCAtMjExLDEzICsyNTMsMzEgQEAKICAgICAgKiBtZWFuIGVpdGhlciB0aGF0IHRoZSBmaWxlbmFtZSBkb2Vzbid0IGxvb2sgbGlrZSBhIHNzdGFibGUgZmlsZSwgb3IgdGhhdCBpdCBpcyBmb3IgYW4gb2xkIGFuZCB1bnN1cHBvcnRlZAogICAgICAqIHZlcnNpb25zLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRGVzY3JpcHRvciBmcm9tRmlsZW5hbWUoRmlsZSBmaWxlKQorICAgIHB1YmxpYyBzdGF0aWMgRGVzY3JpcHRvciBmcm9tRmlsZShGaWxlIGZpbGUpCiAgICAgewotICAgICAgICByZXR1cm4gZnJvbUZpbGVuYW1lV2l0aENvbXBvbmVudChmaWxlKS5sZWZ0OworICAgICAgICByZXR1cm4gZnJvbUZpbGVXaXRoQ29tcG9uZW50KGZpbGUpLmxlZnQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBDb21wb25lbnQgY29tcG9uZW50RnJvbUZpbGUoRmlsZSBmaWxlKQorICAgIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWxlLm5hbWUoKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHRva2VucyA9IGZpbGVuYW1lVG9rZW5zKG5hbWUpOworCisgICAgICAgIHJldHVybiBDb21wb25lbnQucGFyc2UodG9rZW5zLmdldCgzKSwgZm9ybWF0RnJvbU5hbWUobmFtZSwgdG9rZW5zKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXRGcm9tTmFtZShTdHJpbmcgZmlsZU5hbWUsIExpc3Q8U3RyaW5nPiB0b2tlbnMpCisgICAgeworICAgICAgICBTdHJpbmcgZm9ybWF0U3RyaW5nID0gdG9rZW5zLmdldCgyKTsKKyAgICAgICAgU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXQgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U1NUYWJsZUZvcm1hdHMoKS5nZXQoZm9ybWF0U3RyaW5nKTsKKyAgICAgICAgaWYgKGZvcm1hdCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgaW52YWxpZFNTVGFibGUoZmlsZU5hbWUsICJ1bmtub3duICdmb3JtYXQnIHBhcnQgKCVzKSIsIGZvcm1hdFN0cmluZyk7CisgICAgICAgIHJldHVybiBmb3JtYXQ7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUGFyc2UgYSBzc3RhYmxlIGZpbGVuYW1lLCBleHRyYWN0aW5nIGJvdGggdGhlIHtAY29kZSBEZXNjcmlwdG9yfSBhbmQge0Bjb2RlIENvbXBvbmVudH0gcGFydC4KKyAgICAgKiBUaGUga2V5c3BhY2UvdGFibGUgbmFtZSB3aWxsIGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBkaXJlY3RvcnkgcGF0aC4KICAgICAgKgogICAgICAqIEBwYXJhbSBmaWxlIHRoZSB7QGNvZGUgRmlsZX0gb2JqZWN0IGZvciB0aGUgZmlsZW5hbWUgdG8gcGFyc2UuCiAgICAgICogQHJldHVybiBhIHBhaXIgb2YgdGhlIGRlc2NyaXB0b3IgYW5kIGNvbXBvbmVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCB7QGNvZGUgZmlsZX0uCkBAIC0yMjYsMTQgKzI4Niw3NyBAQAogICAgICAqIG1lYW4gZWl0aGVyIHRoYXQgdGhlIGZpbGVuYW1lIGRvZXNuJ3QgbG9vayBsaWtlIGEgc3N0YWJsZSBmaWxlLCBvciB0aGF0IGl0IGlzIGZvciBhbiBvbGQgYW5kIHVuc3VwcG9ydGVkCiAgICAgICogdmVyc2lvbnMuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQYWlyPERlc2NyaXB0b3IsIENvbXBvbmVudD4gZnJvbUZpbGVuYW1lV2l0aENvbXBvbmVudChGaWxlIGZpbGUpCisgICAgcHVibGljIHN0YXRpYyBQYWlyPERlc2NyaXB0b3IsIENvbXBvbmVudD4gZnJvbUZpbGVXaXRoQ29tcG9uZW50KEZpbGUgZmlsZSkKKyAgICB7CisgICAgICAgIHJldHVybiBmcm9tRmlsZVdpdGhDb21wb25lbnQoZmlsZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQYWlyPERlc2NyaXB0b3IsIENvbXBvbmVudD4gZnJvbUZpbGVXaXRoQ29tcG9uZW50KEZpbGUgZmlsZSwgYm9vbGVhbiB2YWxpZGF0ZURpcnMpCiAgICAgewogICAgICAgICAvLyBXZSBuZWVkIHRvIGV4dHJhY3QgdGhlIGtleXNwYWNlIGFuZCB0YWJsZSBuYW1lcyBmcm9tIHRoZSBwYXJlbnQgZGlyZWN0b3JpZXMsIHNvIG1ha2Ugc3VyZSB3ZSBkZWFsIHdpdGggdGhlCiAgICAgICAgIC8vIGFic29sdXRlIHBhdGguCiAgICAgICAgIGlmICghZmlsZS5pc0Fic29sdXRlKCkpCiAgICAgICAgICAgICBmaWxlID0gZmlsZS50b0Fic29sdXRlKCk7CiAKKyAgICAgICAgU1NUYWJsZUluZm8gaW5mbyA9IHZhbGlkYXRlQW5kRXh0cmFjdEluZm8oZmlsZSk7CiAgICAgICAgIFN0cmluZyBuYW1lID0gZmlsZS5uYW1lKCk7CisKKyAgICAgICAgU3RyaW5nIGtleXNwYWNlTmFtZSA9ICIiOworICAgICAgICBTdHJpbmcgdGFibGVOYW1lID0gIiI7CisKKyAgICAgICAgTWF0Y2hlciBzc3RhYmxlRGlyTWF0Y2hlciA9IFNTVEFCTEVfRElSX1BBVFRFUk4ubWF0Y2hlcihmaWxlLnRvU3RyaW5nKCkpOworCisgICAgICAgIC8vIFVzZSBwcmUtMi4xIFNTVGFibGUgZm9ybWF0IGlmIGN1cnJlbnQgb25lIGRvZXMgbm90IG1hdGNoIGl0CisgICAgICAgIGlmICghc3N0YWJsZURpck1hdGNoZXIuZmluZCgwKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3N0YWJsZURpck1hdGNoZXIgPSBMRUdBQ1lfU1NUQUJMRV9ESVJfUEFUVEVSTi5tYXRjaGVyKGZpbGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3N0YWJsZURpck1hdGNoZXIuZmluZCgwKSkKKyAgICAgICAgeworICAgICAgICAgICAga2V5c3BhY2VOYW1lID0gc3N0YWJsZURpck1hdGNoZXIuZ3JvdXAoImtleXNwYWNlIik7CisgICAgICAgICAgICB0YWJsZU5hbWUgPSBzc3RhYmxlRGlyTWF0Y2hlci5ncm91cCgidGFibGVOYW1lIik7CisgICAgICAgICAgICBTdHJpbmcgaW5kZXhOYW1lID0gc3N0YWJsZURpck1hdGNoZXIuZ3JvdXAoImluZGV4TmFtZSIpOworICAgICAgICAgICAgaWYgKGluZGV4TmFtZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRhYmxlTmFtZSA9IFN0cmluZy5mb3JtYXQoIiVzLiVzIiwgdGFibGVOYW1lLCBpbmRleE5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHZhbGlkYXRlRGlycykKKyAgICAgICAgeworICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJDb3VsZCBub3QgZXh0cmFjdCBrZXlzcGFjZS90YWJsZSBpbmZvIGZyb20gc3N0YWJsZSBkaXJlY3Rvcnkge30iLCBmaWxlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgdGhyb3cgaW52YWxpZFNTVGFibGUobmFtZSwgU3RyaW5nLmZvcm1hdCgiY2Fubm90IGV4dHJhY3Qga2V5c3BhY2UgYW5kIHRhYmxlIG5hbWUgZnJvbSAlczsgbWFrZSBzdXJlIHRoZSBzc3RhYmxlIGlzIGluIHRoZSBwcm9wZXIgc3ViLWRpcmVjdG9yaWVzIiwgZmlsZSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFBhaXIuY3JlYXRlKG5ldyBEZXNjcmlwdG9yKGluZm8udmVyc2lvbiwgcGFyZW50T2YobmFtZSwgZmlsZSksIGtleXNwYWNlTmFtZSwgdGFibGVOYW1lLCBpbmZvLmlkKSwgaW5mby5jb21wb25lbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGEgc3N0YWJsZSBmaWxlbmFtZSwgZXh0cmFjdGluZyBib3RoIHRoZSB7QGNvZGUgRGVzY3JpcHRvcn0gYW5kIHtAY29kZSBDb21wb25lbnR9IHBhcnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSAgICAgdGhlIHtAY29kZSBGaWxlfSBvYmplY3QgZm9yIHRoZSBmaWxlbmFtZSB0byBwYXJzZS4KKyAgICAgKiBAcGFyYW0ga2V5c3BhY2UgVGhlIGtleXNwYWNlIG5hbWUgb2YgdGhlIGZpbGUuIElmIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHRoZSBrZXlzcGFjZSBuYW1lIHdpbGwgYmUgZXh0cmFjdGVkCisgICAgICogICAgICAgICAgICAgICAgIGZyb20gdGhlIGRpcmVjdG9yeSBwYXRoLgorICAgICAqIEBwYXJhbSB0YWJsZSAgICBUaGUgdGFibGUgbmFtZSBvZiB0aGUgZmlsZS4gSWYgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gdGhlIHRhYmxlIG5hbWUgd2lsbCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgZGlyZWN0b3J5IHBhdGguCisgICAgICogQHJldHVybiBhIHBhaXIgb2YgdGhlIGRlc2NyaXB0b3IgYW5kIGNvbXBvbmVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCB7QGNvZGUgZmlsZX0uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHByb3ZpZGVkIHtAY29kZSBmaWxlfSBkb2VzIHBvaW50IHRvIGEgdmFsaWQgc3N0YWJsZSBmaWxlbmFtZS4gVGhpcyBjb3VsZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4gZWl0aGVyIHRoYXQgdGhlIGZpbGVuYW1lIGRvZXNuJ3QgbG9vayBsaWtlIGEgc3N0YWJsZSBmaWxlLCBvciB0aGF0IGl0IGlzIGZvciBhbiBvbGQgYW5kIHVuc3VwcG9ydGVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQYWlyPERlc2NyaXB0b3IsIENvbXBvbmVudD4gZnJvbUZpbGVXaXRoQ29tcG9uZW50KEZpbGUgZmlsZSwgU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUpCisgICAgeworICAgICAgICBpZiAobnVsbCA9PSBrZXlzcGFjZSB8fCBudWxsID09IHRhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZnJvbUZpbGVXaXRoQ29tcG9uZW50KGZpbGUpOworICAgICAgICB9CisKKyAgICAgICAgU1NUYWJsZUluZm8gaW5mbyA9IHZhbGlkYXRlQW5kRXh0cmFjdEluZm8oZmlsZSk7CisgICAgICAgIHJldHVybiBQYWlyLmNyZWF0ZShuZXcgRGVzY3JpcHRvcihpbmZvLnZlcnNpb24sIHBhcmVudE9mKGZpbGUubmFtZSgpLCBmaWxlKSwga2V5c3BhY2UsIHRhYmxlLCBpbmZvLmlkKSwgaW5mby5jb21wb25lbnQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBmaWxlbmFtZVRva2VucyhTdHJpbmcgbmFtZSkKKyAgICB7CiAgICAgICAgIExpc3Q8U3RyaW5nPiB0b2tlbnMgPSBmaWxlbmFtZVNwbGl0dGVyLnNwbGl0VG9MaXN0KG5hbWUpOwogICAgICAgICBpbnQgc2l6ZSA9IHRva2Vucy5zaXplKCk7CiAKQEAgLTI0NSwxMSArMzY4LDE2IEBACiAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgYXNzdW1lIGl0J3MgYW4gb2xkIGZvcm1hdCBzc3RhYmxlIGlmIGl0IGhhcyB0aGUgcmlnaHQgbnVtYmVyIG9mIHRva2VuczogdGhpcyBpcyBub3QgcGVyZmVjdAogICAgICAgICAgICAgLy8gYnV0IHdlJ3JlIGp1c3QgdHJ5aW5nIHRvIGJlIGhlbHBmdWwsIG5vdCBwZXJmZWN0LgogICAgICAgICAgICAgaWYgKHNpemUgPT0gNSB8fCBzaXplID09IDYpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCIlcyBpcyBvZiB2ZXJzaW9uICVzIHdoaWNoIGlzIG5vdyB1bnN1cHBvcnRlZCBhbmQgY2Fubm90IGJlIHJlYWQuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zLmdldChzaXplIC0gMykpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIiVzIGlzIG9mIHZlcnNpb24gJXMgd2hpY2ggaXMgbm93IHVuc3VwcG9ydGVkIGFuZCBjYW5ub3QgYmUgcmVhZC4iLCBuYW1lLCB0b2tlbnMuZ2V0KHNpemUgLSAzKSkpOwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJJbnZhbGlkIHNzdGFibGUgZmlsZSAlczogdGhlIG5hbWUgZG9lc24ndCBsb29rIGxpa2UgYSBzdXBwb3J0ZWQgc3N0YWJsZSBmaWxlIG5hbWUiLCBuYW1lKSk7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRva2VuczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTU1RhYmxlSW5mbyB2YWxpZGF0ZUFuZEV4dHJhY3RJbmZvKEZpbGUgZmlsZSkKKyAgICB7CisgICAgICAgIFN0cmluZyBuYW1lID0gZmlsZS5uYW1lKCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiB0b2tlbnMgPSBmaWxlbmFtZVRva2VucyhuYW1lKTsKIAogICAgICAgICBTdHJpbmcgdmVyc2lvblN0cmluZyA9IHRva2Vucy5nZXQoMCk7CiAgICAgICAgIGlmICghVmVyc2lvbi52YWxpZGF0ZSh2ZXJzaW9uU3RyaW5nKSkKQEAgLTI2NSw0OSArMzkzLDI4IEBACiAgICAgICAgICAgICB0aHJvdyBpbnZhbGlkU1NUYWJsZShuYW1lLCAidGhlICdpZCcgcGFydCAoJXMpIG9mIHRoZSBuYW1lIGRvZXNuJ3QgcGFyc2UgYXMgYSB2YWxpZCB1bmlxdWUgaWRlbnRpZmllciIsIHRva2Vucy5nZXQoMSkpOwogICAgICAgICB9CiAKLSAgICAgICAgU3RyaW5nIGZvcm1hdFN0cmluZyA9IHRva2Vucy5nZXQoMik7Ci0gICAgICAgIFNTVGFibGVGb3JtYXQuVHlwZSBmb3JtYXQ7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3JtYXQgPSBTU1RhYmxlRm9ybWF0LlR5cGUudmFsaWRhdGUoZm9ybWF0U3RyaW5nKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBpbnZhbGlkU1NUYWJsZShuYW1lLCAidW5rbm93biAnZm9ybWF0JyBwYXJ0ICglcykiLCBmb3JtYXRTdHJpbmcpOwotICAgICAgICB9CisgICAgICAgIFNTVGFibGVGb3JtYXQ8PywgPz4gZm9ybWF0ID0gZm9ybWF0RnJvbU5hbWUobmFtZSwgdG9rZW5zKTsKKyAgICAgICAgQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudC5wYXJzZSh0b2tlbnMuZ2V0KDMpLCBmb3JtYXQpOwogCi0gICAgICAgIENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnQucGFyc2UodG9rZW5zLmdldCgzKSk7Ci0KLSAgICAgICAgVmVyc2lvbiB2ZXJzaW9uID0gZm9ybWF0LmluZm8uZ2V0VmVyc2lvbih2ZXJzaW9uU3RyaW5nKTsKKyAgICAgICAgVmVyc2lvbiB2ZXJzaW9uID0gZm9ybWF0LmdldFZlcnNpb24odmVyc2lvblN0cmluZyk7CiAgICAgICAgIGlmICghdmVyc2lvbi5pc0NvbXBhdGlibGUoKSkKICAgICAgICAgICAgIHRocm93IGludmFsaWRTU1RhYmxlKG5hbWUsICJpbmNvbXBhdGlibGUgc3N0YWJsZSB2ZXJzaW9uICglcyk7IHlvdSBzaG91bGQgaGF2ZSBydW4gdXBncmFkZXNzdGFibGVzIGJlZm9yZSB1cGdyYWRpbmciLCB2ZXJzaW9uU3RyaW5nKTsKIAotICAgICAgICBGaWxlIGRpcmVjdG9yeSA9IHBhcmVudE9mKG5hbWUsIGZpbGUpOwotICAgICAgICBGaWxlIHRhYmxlRGlyID0gZGlyZWN0b3J5OworICAgICAgICByZXR1cm4gbmV3IFNTVGFibGVJbmZvKHZlcnNpb24sIGlkLCBjb21wb25lbnQpOworICAgIH0KIAotICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGEgMm5kYXJ5IGluZGV4IGRpcmVjdG9yeSAobm90IHRoYXQgaXQgZG9lc24ndCBleGNsdWRlIGl0IHRvIGJlIGFsc28gYSBiYWNrdXAgb3Igc25hcHNob3QpCi0gICAgICAgIFN0cmluZyBpbmRleE5hbWUgPSAiIjsKLSAgICAgICAgaWYgKERpcmVjdG9yaWVzLmlzU2Vjb25kYXJ5SW5kZXhGb2xkZXIodGFibGVEaXIpKQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNTVGFibGVJbmZvCisgICAgeworICAgICAgICBmaW5hbCBWZXJzaW9uIHZlcnNpb247CisgICAgICAgIGZpbmFsIFNTVGFibGVJZCBpZDsKKyAgICAgICAgZmluYWwgQ29tcG9uZW50IGNvbXBvbmVudDsKKworICAgICAgICBTU1RhYmxlSW5mbyhWZXJzaW9uIHZlcnNpb24sIFNTVGFibGVJZCBpZCwgQ29tcG9uZW50IGNvbXBvbmVudCkKICAgICAgICAgewotICAgICAgICAgICAgaW5kZXhOYW1lID0gdGFibGVEaXIubmFtZSgpOwotICAgICAgICAgICAgdGFibGVEaXIgPSBwYXJlbnRPZihuYW1lLCB0YWJsZURpcik7CisgICAgICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworICAgICAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7CiAgICAgICAgIH0KLQotICAgICAgICAvLyBUaGVuIGl0IGNhbiBiZSBhIGJhY2t1cCBvciBhIHNuYXBzaG90Ci0gICAgICAgIGlmICh0YWJsZURpci5uYW1lKCkuZXF1YWxzKERpcmVjdG9yaWVzLkJBQ0tVUFNfU1VCRElSKSAmJiB0YWJsZURpci5wYXJlbnQoKS5uYW1lKCkuY29udGFpbnMoIi0iKSkKLSAgICAgICAgICAgIHRhYmxlRGlyID0gdGFibGVEaXIucGFyZW50KCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBrZXlzcGFjZU9yU25hcHNob3REaXIgPSBwYXJlbnRPZihuYW1lLCB0YWJsZURpcik7Ci0gICAgICAgICAgICBpZiAoa2V5c3BhY2VPclNuYXBzaG90RGlyLm5hbWUoKS5lcXVhbHMoRGlyZWN0b3JpZXMuU05BUFNIT1RfU1VCRElSKQotICAgICAgICAgICAgICAgICYmIHBhcmVudE9mKG5hbWUsIGtleXNwYWNlT3JTbmFwc2hvdERpcikubmFtZSgpLmNvbnRhaW5zKCItIikpCi0gICAgICAgICAgICAgICAgdGFibGVEaXIgPSBwYXJlbnRPZihuYW1lLCBrZXlzcGFjZU9yU25hcHNob3REaXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHRhYmxlID0gdGFibGVEaXIubmFtZSgpLnNwbGl0KCItIilbMF0gKyBpbmRleE5hbWU7Ci0gICAgICAgIFN0cmluZyBrZXlzcGFjZSA9IHBhcmVudE9mKG5hbWUsIHRhYmxlRGlyKS5uYW1lKCk7Ci0KLSAgICAgICAgcmV0dXJuIFBhaXIuY3JlYXRlKG5ldyBEZXNjcmlwdG9yKHZlcnNpb24sIGRpcmVjdG9yeSwga2V5c3BhY2UsIHRhYmxlLCBpZCwgZm9ybWF0KSwgY29tcG9uZW50KTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBGaWxlIHBhcmVudE9mKFN0cmluZyBuYW1lLCBGaWxlIGZpbGUpCkBAIC0zMzYsMTAgKzQ0MywyMSBAQAogICAgICAgICByZXR1cm4gdmVyc2lvbi5pc0NvbXBhdGlibGUoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgU2V0PENvbXBvbmVudD4gZGlzY292ZXJDb21wb25lbnRzKCkKKyAgICB7CisgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBTZXRzLm5ld0hhc2hTZXRXaXRoRXhwZWN0ZWRTaXplKENvbXBvbmVudC5UeXBlLmFsbC5zaXplKCkpOworICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBDb21wb25lbnQuZ2V0U2luZ2xldG9uc0Zvcih2ZXJzaW9uLmZvcm1hdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaWxlRm9yKGNvbXBvbmVudCkuZXhpc3RzKCkpCisgICAgICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoY29tcG9uZW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29tcG9uZW50czsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBiYXNlRmlsZW5hbWUoKTsKKyAgICAgICAgcmV0dXJuIGJhc2VGaWxlKCkuYWJzb2x1dGVQYXRoKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0zNTAsMTIgKzQ2OCwxMyBAQAogICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgRGVzY3JpcHRvcikpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIERlc2NyaXB0b3IgdGhhdCA9IChEZXNjcmlwdG9yKW87CisgICAgICAgIGlmICh0aGlzLmhhc2hDb2RlICE9IHRoYXQuaGFzaENvZGUpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIHJldHVybiB0aGF0LmRpcmVjdG9yeS5lcXVhbHModGhpcy5kaXJlY3RvcnkpCiAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoYXQuaWQuZXF1YWxzKHRoaXMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoYXQua3NuYW1lLmVxdWFscyh0aGlzLmtzbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhhdC5jZm5hbWUuZXF1YWxzKHRoaXMuY2ZuYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGF0LnZlcnNpb24uZXF1YWxzKHRoaXMudmVyc2lvbikKLSAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhhdC5mb3JtYXRUeXBlID09IHRoaXMuZm9ybWF0VHlwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhhdC52ZXJzaW9uLmVxdWFscyh0aGlzLnZlcnNpb24pOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9FbXB0eVNTVGFibGVTY2FubmVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0VtcHR5U1NUYWJsZVNjYW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTc2ZWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9FbXB0eVNTVGFibGVTY2FubmVyLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5BYnN0cmFjdFVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworCitwdWJsaWMgY2xhc3MgRW1wdHlTU1RhYmxlU2Nhbm5lciBleHRlbmRzIEFic3RyYWN0VW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yIGltcGxlbWVudHMgSVNTVGFibGVTY2FubmVyCit7CisgICAgcHJpdmF0ZSBmaW5hbCBTU1RhYmxlUmVhZGVyIHNzdGFibGU7CisKKyAgICBwdWJsaWMgRW1wdHlTU1RhYmxlU2Nhbm5lcihTU1RhYmxlUmVhZGVyIHNzdGFibGUpCisgICAgeworICAgICAgICB0aGlzLnNzdGFibGUgPSBzc3RhYmxlOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldEJ5dGVzU2Nhbm5lZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRMZW5ndGhJbkJ5dGVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldENvbXByZXNzZWRMZW5ndGhJbkJ5dGVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBTZXQ8U1NUYWJsZVJlYWRlcj4gZ2V0QmFja2luZ1NTVGFibGVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBJbW11dGFibGVTZXQub2Yoc3N0YWJsZSk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFBvc2l0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzc3RhYmxlLm1ldGFkYXRhKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBuZXh0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0dhdWdlUHJvdmlkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvR2F1Z2VQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNjgwYmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0dhdWdlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7CisKK2ltcG9ydCBjb20uY29kYWhhbGUubWV0cmljcy5HYXVnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEdhdWdlUHJvdmlkZXI8VCBleHRlbmRzIE51bWJlcj4KK3sKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgICBwdWJsaWMgR2F1Z2VQcm92aWRlcihTdHJpbmcgbmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IEdhdWdlPFQ+IGdldFRhYmxlR2F1Z2UoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBHYXVnZTxUPiBnZXRLZXlzcGFjZUdhdWdlKEtleXNwYWNlIGtleXNwYWNlKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBHYXVnZTxUPiBnZXRHbG9iYWxHYXVnZSgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JT09wdGlvbnMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSU9PcHRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYzOTVhNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSU9PcHRpb25zLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGlza09wdGltaXphdGlvblN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlck9wdGlvbjsKKworcHVibGljIGNsYXNzIElPT3B0aW9ucworeworICAgIHB1YmxpYyBzdGF0aWMgSU9PcHRpb25zIGZyb21EYXRhYmFzZURlc2NyaXB0b3IoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJT09wdGlvbnMoRGF0YWJhc2VEZXNjcmlwdG9yLmdldERpc2tPcHRpbWl6YXRpb25TdHJhdGVneSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0RGlza0FjY2Vzc01vZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldEluZGV4QWNjZXNzTW9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0RGlza09wdGltaXphdGlvbkVzdGltYXRlUGVyY2VudGlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW50aWFsV3JpdGVyT3B0aW9uLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRyaWNrbGVGc3luYyhEYXRhYmFzZURlc2NyaXB0b3IuZ2V0VHJpY2tsZUZzeW5jKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHJpY2tsZUZzeW5jQnl0ZUludGVydmFsKERhdGFiYXNlRGVzY3JpcHRvci5nZXRUcmlja2xlRnN5bmNJbnRlcnZhbEluS2lCKCkgKiAxMDI0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5nZXRGbHVzaENvbXByZXNzaW9uKCkpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBEaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3kgZGlza09wdGltaXphdGlvblN0cmF0ZWd5OworICAgIHB1YmxpYyBmaW5hbCBDb25maWcuRGlza0FjY2Vzc01vZGUgZGVmYXVsdERpc2tBY2Nlc3NNb2RlOworICAgIHB1YmxpYyBmaW5hbCBDb25maWcuRGlza0FjY2Vzc01vZGUgaW5kZXhEaXNrQWNjZXNzTW9kZTsKKyAgICBwdWJsaWMgZmluYWwgZG91YmxlIGRpc2tPcHRpbWl6YXRpb25Fc3RpbWF0ZVBlcmNlbnRpbGU7CisgICAgcHVibGljIGZpbmFsIFNlcXVlbnRpYWxXcml0ZXJPcHRpb24gd3JpdGVyT3B0aW9uczsKKyAgICBwdWJsaWMgZmluYWwgQ29uZmlnLkZsdXNoQ29tcHJlc3Npb24gZmx1c2hDb21wcmVzc2lvbjsKKworICAgIHB1YmxpYyBJT09wdGlvbnMoRGlza09wdGltaXphdGlvblN0cmF0ZWd5IGRpc2tPcHRpbWl6YXRpb25TdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5EaXNrQWNjZXNzTW9kZSBkZWZhdWx0RGlza0FjY2Vzc01vZGUsCisgICAgICAgICAgICAgICAgICAgICBDb25maWcuRGlza0FjY2Vzc01vZGUgaW5kZXhEaXNrQWNjZXNzTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkaXNrT3B0aW1pemF0aW9uRXN0aW1hdGVQZXJjZW50aWxlLAorICAgICAgICAgICAgICAgICAgICAgU2VxdWVudGlhbFdyaXRlck9wdGlvbiB3cml0ZXJPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgQ29uZmlnLkZsdXNoQ29tcHJlc3Npb24gZmx1c2hDb21wcmVzc2lvbikKKyAgICB7CisgICAgICAgIHRoaXMuZGlza09wdGltaXphdGlvblN0cmF0ZWd5ID0gZGlza09wdGltaXphdGlvblN0cmF0ZWd5OworICAgICAgICB0aGlzLmRlZmF1bHREaXNrQWNjZXNzTW9kZSA9IGRlZmF1bHREaXNrQWNjZXNzTW9kZTsKKyAgICAgICAgdGhpcy5pbmRleERpc2tBY2Nlc3NNb2RlID0gaW5kZXhEaXNrQWNjZXNzTW9kZTsKKyAgICAgICAgdGhpcy5kaXNrT3B0aW1pemF0aW9uRXN0aW1hdGVQZXJjZW50aWxlID0gZGlza09wdGltaXphdGlvbkVzdGltYXRlUGVyY2VudGlsZTsKKyAgICAgICAgdGhpcy53cml0ZXJPcHRpb25zID0gd3JpdGVyT3B0aW9uczsKKyAgICAgICAgdGhpcy5mbHVzaENvbXByZXNzaW9uID0gZmx1c2hDb21wcmVzc2lvbjsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JU1NUYWJsZVNjYW5uZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSVNTVGFibGVTY2FubmVyLmphdmEKaW5kZXggYWY2NjFiNy4uNjcxYmNjYiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JU1NUYWJsZVNjYW5uZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0lTU1RhYmxlU2Nhbm5lci5qYXZhCkBAIC02NCw3ICs2NCw4IEBACiAKICAgICAgICAgaWYgKHRocm93YWJsZSAhPSBudWxsKQogICAgICAgICB7Ci0gICAgICAgICAgICBUaHJvd2FibGVzLnByb3BhZ2F0ZSh0aHJvd2FibGUpOworICAgICAgICAgICAgVGhyb3dhYmxlcy50aHJvd0lmVW5jaGVja2VkKHRocm93YWJsZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0aHJvd2FibGUpOwogICAgICAgICB9CiAKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0lTY3J1YmJlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JU2NydWJiZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGM2ZWIzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JU2NydWJiZXIuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOworCitpbXBvcnQgamF2YS51dGlsLlN0cmluZ0pvaW5lcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9zZWFibGU7CisKK3B1YmxpYyBpbnRlcmZhY2UgSVNjcnViYmVyIGV4dGVuZHMgQ2xvc2VhYmxlCit7CisgICAgdm9pZCBzY3J1YigpOworCisgICAgdm9pZCBjbG9zZSgpOworCisgICAgQ29tcGFjdGlvbkluZm8uSG9sZGVyIGdldFNjcnViSW5mbygpOworCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgU2NydWJSZXN1bHQgc2NydWJXaXRoUmVzdWx0KCk7CisKKyAgICBzdGF0aWMgT3B0aW9ucy5CdWlsZGVyIG9wdGlvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPcHRpb25zLkJ1aWxkZXIoKTsKKyAgICB9CisKKyAgICBmaW5hbCBjbGFzcyBTY3J1YlJlc3VsdAorICAgIHsKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBnb29kUGFydGl0aW9uczsKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBiYWRQYXJ0aXRpb25zOworICAgICAgICBwdWJsaWMgZmluYWwgaW50IGVtcHR5UGFydGl0aW9uczsKKworICAgICAgICBwdWJsaWMgU2NydWJSZXN1bHQoaW50IGdvb2RQYXJ0aXRpb25zLCBpbnQgYmFkUGFydGl0aW9ucywgaW50IGVtcHR5UGFydGl0aW9ucykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5nb29kUGFydGl0aW9ucyA9IGdvb2RQYXJ0aXRpb25zOworICAgICAgICAgICAgdGhpcy5iYWRQYXJ0aXRpb25zID0gYmFkUGFydGl0aW9uczsKKyAgICAgICAgICAgIHRoaXMuZW1wdHlQYXJ0aXRpb25zID0gZW1wdHlQYXJ0aXRpb25zOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgT3B0aW9ucworICAgIHsKKyAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gY2hlY2tEYXRhOworICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiByZWluc2VydE92ZXJmbG93ZWRUVExSb3dzOworICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBza2lwQ29ycnVwdGVkOworCisgICAgICAgIHByaXZhdGUgT3B0aW9ucyhib29sZWFuIGNoZWNrRGF0YSwgYm9vbGVhbiByZWluc2VydE92ZXJmbG93ZWRUVExSb3dzLCBib29sZWFuIHNraXBDb3JydXB0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuY2hlY2tEYXRhID0gY2hlY2tEYXRhOworICAgICAgICAgICAgdGhpcy5yZWluc2VydE92ZXJmbG93ZWRUVExSb3dzID0gcmVpbnNlcnRPdmVyZmxvd2VkVFRMUm93czsKKyAgICAgICAgICAgIHRoaXMuc2tpcENvcnJ1cHRlZCA9IHNraXBDb3JydXB0ZWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nSm9pbmVyKCIsICIsIE9wdGlvbnMuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIlsiLCAiXSIpCisgICAgICAgICAgICAgICAgICAgLmFkZCgiY2hlY2tEYXRhPSIgKyBjaGVja0RhdGEpCisgICAgICAgICAgICAgICAgICAgLmFkZCgicmVpbnNlcnRPdmVyZmxvd2VkVFRMUm93cz0iICsgcmVpbnNlcnRPdmVyZmxvd2VkVFRMUm93cykKKyAgICAgICAgICAgICAgICAgICAuYWRkKCJza2lwQ29ycnVwdGVkPSIgKyBza2lwQ29ycnVwdGVkKQorICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0RhdGEgPSBmYWxzZTsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiByZWluc2VydE92ZXJmbG93ZWRUVExSb3dzID0gZmFsc2U7CisgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2tpcENvcnJ1cHRlZCA9IGZhbHNlOworCisgICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBjaGVja0RhdGEoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tEYXRhID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgY2hlY2tEYXRhKGJvb2xlYW4gY2hlY2tEYXRhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tEYXRhID0gY2hlY2tEYXRhOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgQnVpbGRlciByZWluc2VydE92ZXJmbG93ZWRUVExSb3dzKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnJlaW5zZXJ0T3ZlcmZsb3dlZFRUTFJvd3MgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgQnVpbGRlciByZWluc2VydE92ZXJmbG93ZWRUVExSb3dzKGJvb2xlYW4gcmVpbnNlcnRPdmVyZmxvd2VkVFRMUm93cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnJlaW5zZXJ0T3ZlcmZsb3dlZFRUTFJvd3MgPSByZWluc2VydE92ZXJmbG93ZWRUVExSb3dzOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBza2lwQ29ycnVwdGVkKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnNraXBDb3JydXB0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBza2lwQ29ycnVwdGVkKGJvb2xlYW4gc2tpcENvcnJ1cHRlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnNraXBDb3JydXB0ZWQgPSBza2lwQ29ycnVwdGVkOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgT3B0aW9ucyBidWlsZCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPcHRpb25zKGNoZWNrRGF0YSwgcmVpbnNlcnRPdmVyZmxvd2VkVFRMUm93cywgc2tpcENvcnJ1cHRlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JVmVyaWZpZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSVZlcmlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJlYzA2NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSVZlcmlmaWVyLmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKKworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOworCitwdWJsaWMgaW50ZXJmYWNlIElWZXJpZmllciBleHRlbmRzIENsb3NlYWJsZQoreworICAgIHN0YXRpYyBPcHRpb25zLkJ1aWxkZXIgb3B0aW9ucygpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IE9wdGlvbnMuQnVpbGRlcigpOworICAgIH0KKworICAgIHZvaWQgdmVyaWZ5KCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIGNsb3NlKCk7CisKKyAgICBDb21wYWN0aW9uSW5mby5Ib2xkZXIgZ2V0VmVyaWZ5SW5mbygpOworCisgICAgY2xhc3MgT3B0aW9ucworICAgIHsKKyAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaW52b2tlRGlza0ZhaWx1cmVQb2xpY3k7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZvcmNlIGV4dGVuZGVkIHZlcmlmaWNhdGlvbiAtIHVubGVzcyBpdCBpcyBlbmFibGVkLCBleHRlbmRlZCB2ZXJpZmljaWF0aW9uIHdpbGwgYmUgZG9uZSBvbmx5CisgICAgICAgICAqIGlmIHRoZXJlIGlzIG5vIGRpZ2VzdCBwcmVzZW50LiBTZXR0aW5nIGl0IGFsb25nIHdpdGggcXVpY2sgbWFrZXMgbm8gc2Vuc2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBleHRlbmRlZFZlcmlmaWNhdGlvbjsKKworICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBjaGVja1ZlcnNpb247CisgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIG11dGF0ZVJlcGFpclN0YXR1czsKKyAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gY2hlY2tPd25zVG9rZW5zOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBRdWljayBjaGVjayB3aGljaCBkb2VzIG5vdCBpbmNsdWRlIHNzdGFibGUgZGF0YSB2ZXJpZmljYXRpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBxdWljazsKKworICAgICAgICBwdWJsaWMgZmluYWwgRnVuY3Rpb248U3RyaW5nLCA/IGV4dGVuZHMgQ29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+PiB0b2tlbkxvb2t1cDsKKworICAgICAgICBwcml2YXRlIE9wdGlvbnMoYm9vbGVhbiBpbnZva2VEaXNrRmFpbHVyZVBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXh0ZW5kZWRWZXJpZmljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNoZWNrVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbXV0YXRlUmVwYWlyU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjaGVja093bnNUb2tlbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHF1aWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb248U3RyaW5nLCA/IGV4dGVuZHMgQ29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+PiB0b2tlbkxvb2t1cCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSA9IGludm9rZURpc2tGYWlsdXJlUG9saWN5OworICAgICAgICAgICAgdGhpcy5leHRlbmRlZFZlcmlmaWNhdGlvbiA9IGV4dGVuZGVkVmVyaWZpY2F0aW9uOworICAgICAgICAgICAgdGhpcy5jaGVja1ZlcnNpb24gPSBjaGVja1ZlcnNpb247CisgICAgICAgICAgICB0aGlzLm11dGF0ZVJlcGFpclN0YXR1cyA9IG11dGF0ZVJlcGFpclN0YXR1czsKKyAgICAgICAgICAgIHRoaXMuY2hlY2tPd25zVG9rZW5zID0gY2hlY2tPd25zVG9rZW5zOworICAgICAgICAgICAgdGhpcy5xdWljayA9IHF1aWNrOworICAgICAgICAgICAgdGhpcy50b2tlbkxvb2t1cCA9IHRva2VuTG9va3VwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gIk9wdGlvbnN7IiArCisgICAgICAgICAgICAgICAgICAgImludm9rZURpc2tGYWlsdXJlUG9saWN5PSIgKyBpbnZva2VEaXNrRmFpbHVyZVBvbGljeSArCisgICAgICAgICAgICAgICAgICAgIiwgZXh0ZW5kZWRWZXJpZmljYXRpb249IiArIGV4dGVuZGVkVmVyaWZpY2F0aW9uICsKKyAgICAgICAgICAgICAgICAgICAiLCBjaGVja1ZlcnNpb249IiArIGNoZWNrVmVyc2lvbiArCisgICAgICAgICAgICAgICAgICAgIiwgbXV0YXRlUmVwYWlyU3RhdHVzPSIgKyBtdXRhdGVSZXBhaXJTdGF0dXMgKworICAgICAgICAgICAgICAgICAgICIsIGNoZWNrT3duc1Rva2Vucz0iICsgY2hlY2tPd25zVG9rZW5zICsKKyAgICAgICAgICAgICAgICAgICAiLCBxdWljaz0iICsgcXVpY2sgKworICAgICAgICAgICAgICAgICAgICd9JzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlcgorICAgICAgICB7CisgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gaW52b2tlRGlza0ZhaWx1cmVQb2xpY3kgPSBmYWxzZTsgLy8gaW52b2tpbmcgZGlzayBmYWlsdXJlIHBvbGljeSBjYW4gc3RvcCB0aGUgbm9kZSBpZiB3ZSBmaW5kIGEgY29ycnVwdCBzdGFibGUKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBleHRlbmRlZFZlcmlmaWNhdGlvbiA9IGZhbHNlOworICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrVmVyc2lvbiA9IGZhbHNlOworICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG11dGF0ZVJlcGFpclN0YXR1cyA9IGZhbHNlOyAvLyBtdXRhdGluZyByZXBhaXIgc3RhdHVzIGNhbiBiZSBkYW5nZXJvdXMKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja093bnNUb2tlbnMgPSBmYWxzZTsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBxdWljayA9IGZhbHNlOworICAgICAgICAgICAgcHJpdmF0ZSBGdW5jdGlvbjxTdHJpbmcsID8gZXh0ZW5kcyBDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4+IHRva2VuTG9va3VwID0gU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2U6OmdldExvY2FsQW5kUGVuZGluZ1JhbmdlczsKKworICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgaW52b2tlRGlza0ZhaWx1cmVQb2xpY3koYm9vbGVhbiBwYXJhbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLmludm9rZURpc2tGYWlsdXJlUG9saWN5ID0gcGFyYW07CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIGV4dGVuZGVkVmVyaWZpY2F0aW9uKGJvb2xlYW4gcGFyYW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5leHRlbmRlZFZlcmlmaWNhdGlvbiA9IHBhcmFtOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBjaGVja1ZlcnNpb24oYm9vbGVhbiBwYXJhbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNoZWNrVmVyc2lvbiA9IHBhcmFtOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBtdXRhdGVSZXBhaXJTdGF0dXMoYm9vbGVhbiBwYXJhbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLm11dGF0ZVJlcGFpclN0YXR1cyA9IHBhcmFtOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBjaGVja093bnNUb2tlbnMoYm9vbGVhbiBwYXJhbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNoZWNrT3duc1Rva2VucyA9IHBhcmFtOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBxdWljayhib29sZWFuIHBhcmFtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMucXVpY2sgPSBwYXJhbTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgdG9rZW5Mb29rdXAoRnVuY3Rpb248U3RyaW5nLCA/IGV4dGVuZHMgQ29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+PiB0b2tlbkxvb2t1cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnRva2VuTG9va3VwID0gdG9rZW5Mb29rdXA7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBPcHRpb25zIGJ1aWxkKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9wdGlvbnMoaW52b2tlRGlza0ZhaWx1cmVQb2xpY3ksIGV4dGVuZGVkVmVyaWZpY2F0aW9uLCBjaGVja1ZlcnNpb24sIG11dGF0ZVJlcGFpclN0YXR1cywgY2hlY2tPd25zVG9rZW5zLCBxdWljaywgdG9rZW5Mb29rdXApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSW5kZXhJbmZvLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0luZGV4SW5mby5qYXZhCmluZGV4IGZhMGZiMmMuLmRiY2U0MTYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSW5kZXhJbmZvLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JbmRleEluZm8uamF2YQpAQCAtMjMsMTIgKzIzLDEyIEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nUHJlZml4OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlbGV0aW9uVGltZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dJbmRleEVudHJ5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLklTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLlJvd0luZGV4RW50cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT2JqZWN0U2l6ZXM7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0luZGV4U3VtbWFyeS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JbmRleFN1bW1hcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzYWRmZC4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0luZGV4U3VtbWFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7Ci0KLWltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOwotCi1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5QYXJ0aXRpb25Qb3NpdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuUmVmOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuV3JhcHBlZFNoYXJlZENsb3NlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuTWVtb3J5VXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRvd25zYW1wbGluZy5CQVNFX1NBTVBMSU5HX0xFVkVMOwotCi0vKgotICogTGF5b3V0IG9mIE1lbW9yeSBmb3IgaW5kZXggc3VtbWFyaWVzOgotICoKLSAqIFRoZXJlIGFyZSB0d28gc2VjdGlvbnM6Ci0gKiAgMS4gQSAiaGVhZGVyIiBjb250YWluaW5nIHRoZSBvZmZzZXQgaW50byBgYnl0ZXNgIG9mIGVudHJpZXMgaW4gdGhlIHN1bW1hcnkgc3VtbWFyeSBkYXRhLCBjb25zaXN0aW5nIG9mCi0gKiAgICAgb25lIGZvdXIgYnl0ZSBwb3NpdGlvbiBmb3IgZWFjaCBlbnRyeSBpbiB0aGUgc3VtbWFyeS4gIFRoaXMgYWxsb3dzIHVzIGRvIHNpbXBsZSBtYXRoIGluIGdldEluZGV4KCkKLSAqICAgICB0byBmaW5kIHRoZSBwb3NpdGlvbiBpbiB0aGUgTWVtb3J5IHRvIHN0YXJ0IHJlYWRpbmcgdGhlIGFjdHVhbCBpbmRleCBzdW1tYXJ5IGVudHJ5LgotICogICAgIChUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGtleXMgY2FuIGhhdmUgZGlmZmVyZW50IGxlbmd0aHMuKQotICogIDIuICBBIHNlcXVlbmNlIG9mIChEZWNvcmF0ZWRLZXksIHBvc2l0aW9uKSBwYWlycywgd2hlcmUgcG9zaXRpb24gaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBhY3R1YWwgaW5kZXggZmlsZS4KLSAqLwotcHVibGljIGNsYXNzIEluZGV4U3VtbWFyeSBleHRlbmRzIFdyYXBwZWRTaGFyZWRDbG9zZWFibGUKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSW5kZXhTdW1tYXJ5LmNsYXNzKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEluZGV4U3VtbWFyeVNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBJbmRleFN1bW1hcnlTZXJpYWxpemVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBIGxvd2VyIGJvdW5kIGZvciB0aGUgYXZlcmFnZSBudW1iZXIgb2YgcGFydGl0aW9ucyBpbiBiZXR3ZWVuIGVhY2ggaW5kZXggc3VtbWFyeSBlbnRyeS4gQSBsb3dlciB2YWx1ZSBtZWFucwotICAgICAqIHRoYXQgbW9yZSBwYXJ0aXRpb25zIHdpbGwgaGF2ZSBhbiBlbnRyeSBpbiB0aGUgaW5kZXggc3VtbWFyeSB3aGVuIGF0IHRoZSBmdWxsIHNhbXBsaW5nIGxldmVsLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgaW50IG1pbkluZGV4SW50ZXJ2YWw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lcjsKLSAgICBwcml2YXRlIGZpbmFsIGludCBzaXplQXRGdWxsU2FtcGxpbmc7Ci0gICAgLy8gd2UgcGVybWl0IHRoZSBtZW1vcnkgdG8gc3BhbiBhIHJhbmdlIGxhcmdlciB0aGFuIHdlIHVzZSwKLSAgICAvLyBzbyB3ZSBoYXZlIGFuIGFjY29tcGFueWluZyBjb3VudCBhbmQgbGVuZ3RoIGZvciBlYWNoIHBhcnQKLSAgICAvLyB3ZSBzcGxpdCBvdXIgZGF0YSBpbnRvIHR3byByYW5nZXM6IG9mZnNldHMgKGluZGV4aW5nIGludG8gZW50cmllcyksCi0gICAgLy8gYW5kIGVudHJpZXMgY29udGFpbmluZyB0aGUgc3VtbWFyeSBkYXRhCi0gICAgcHJpdmF0ZSBmaW5hbCBNZW1vcnkgb2Zmc2V0czsKLSAgICBwcml2YXRlIGZpbmFsIGludCBvZmZzZXRDb3VudDsKLSAgICAvLyBlbnRyaWVzIGlzIGEgbGlzdCBvZiAocGFydGl0aW9uIGtleSwgaW5kZXggZmlsZSBvZmZzZXQpIHBhaXJzCi0gICAgcHJpdmF0ZSBmaW5hbCBNZW1vcnkgZW50cmllczsKLSAgICBwcml2YXRlIGZpbmFsIGxvbmcgZW50cmllc0xlbmd0aDsKLQotICAgIC8qKgotICAgICAqIEEgdmFsdWUgYmV0d2VlbiAxIGFuZCBCQVNFX1NBTVBMSU5HX0xFVkVMIHRoYXQgcmVwcmVzZW50cyBob3cgbWFueSBvZiB0aGUgb3JpZ2luYWwKLSAgICAgKiBpbmRleCBzdW1tYXJ5IGVudHJpZXMgKCgxIC8gaW5kZXhJbnRlcnZhbCkgKiBudW1LZXlzKSBoYXZlIGJlZW4gcmV0YWluZWQuCi0gICAgICoKLSAgICAgKiBUaHVzLCB0aGlzIHN1bW1hcnkgY29udGFpbnMgKHNhbXBsaW5nTGV2ZWwgLyBCQVNFX1NBTVBMSU5HX0xFVkVMKSAqICgoMSAvIGluZGV4SW50ZXJ2YWwpICogbnVtS2V5cykpIGVudHJpZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgc2FtcGxpbmdMZXZlbDsKLQotICAgIHB1YmxpYyBJbmRleFN1bW1hcnkoSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyLCBNZW1vcnkgb2Zmc2V0cywgaW50IG9mZnNldENvdW50LCBNZW1vcnkgZW50cmllcywgbG9uZyBlbnRyaWVzTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVBdEZ1bGxTYW1wbGluZywgaW50IG1pbkluZGV4SW50ZXJ2YWwsIGludCBzYW1wbGluZ0xldmVsKQotICAgIHsKLSAgICAgICAgc3VwZXIobmV3IE1lbW9yeVtdIHsgb2Zmc2V0cywgZW50cmllcyB9KTsKLSAgICAgICAgYXNzZXJ0IG9mZnNldHMuZ2V0SW50KDApID09IDA7Ci0gICAgICAgIHRoaXMucGFydGl0aW9uZXIgPSBwYXJ0aXRpb25lcjsKLSAgICAgICAgdGhpcy5taW5JbmRleEludGVydmFsID0gbWluSW5kZXhJbnRlcnZhbDsKLSAgICAgICAgdGhpcy5vZmZzZXRDb3VudCA9IG9mZnNldENvdW50OwotICAgICAgICB0aGlzLmVudHJpZXNMZW5ndGggPSBlbnRyaWVzTGVuZ3RoOwotICAgICAgICB0aGlzLnNpemVBdEZ1bGxTYW1wbGluZyA9IHNpemVBdEZ1bGxTYW1wbGluZzsKLSAgICAgICAgdGhpcy5vZmZzZXRzID0gb2Zmc2V0czsKLSAgICAgICAgdGhpcy5lbnRyaWVzID0gZW50cmllczsKLSAgICAgICAgdGhpcy5zYW1wbGluZ0xldmVsID0gc2FtcGxpbmdMZXZlbDsKLSAgICAgICAgYXNzZXJ0IHNhbXBsaW5nTGV2ZWwgPiAwOwotICAgIH0KLQotICAgIHByaXZhdGUgSW5kZXhTdW1tYXJ5KEluZGV4U3VtbWFyeSBjb3B5KQotICAgIHsKLSAgICAgICAgc3VwZXIoY29weSk7Ci0gICAgICAgIHRoaXMucGFydGl0aW9uZXIgPSBjb3B5LnBhcnRpdGlvbmVyOwotICAgICAgICB0aGlzLm1pbkluZGV4SW50ZXJ2YWwgPSBjb3B5Lm1pbkluZGV4SW50ZXJ2YWw7Ci0gICAgICAgIHRoaXMub2Zmc2V0Q291bnQgPSBjb3B5Lm9mZnNldENvdW50OwotICAgICAgICB0aGlzLmVudHJpZXNMZW5ndGggPSBjb3B5LmVudHJpZXNMZW5ndGg7Ci0gICAgICAgIHRoaXMuc2l6ZUF0RnVsbFNhbXBsaW5nID0gY29weS5zaXplQXRGdWxsU2FtcGxpbmc7Ci0gICAgICAgIHRoaXMub2Zmc2V0cyA9IGNvcHkub2Zmc2V0czsKLSAgICAgICAgdGhpcy5lbnRyaWVzID0gY29weS5lbnRyaWVzOwotICAgICAgICB0aGlzLnNhbXBsaW5nTGV2ZWwgPSBjb3B5LnNhbXBsaW5nTGV2ZWw7Ci0gICAgfQotCi0gICAgLy8gYmluYXJ5IHNlYXJjaCBpcyBub3RvcmlvdXNseSBtb3JlIGRpZmZpY3VsdCB0byBnZXQgcmlnaHQgdGhhbiBpdCBsb29rczsgdGhpcyBpcyBsaWZ0ZWQgZnJvbQotICAgIC8vIEhhcm1vbnkncyBDb2xsZWN0aW9ucyBpbXBsZW1lbnRhdGlvbgotICAgIHB1YmxpYyBpbnQgYmluYXJ5U2VhcmNoKFBhcnRpdGlvblBvc2l0aW9uIGtleSkKLSAgICB7Ci0gICAgICAgIC8vIFdlIHdpbGwgYmUgY29tcGFyaW5nIG5vbi1uYXRpdmUgS2V5cywgc28gdXNlIGEgYnVmZmVyIHdpdGggYXBwcm9wcmlhdGUgYnl0ZSBvcmRlcgotICAgICAgICBCeXRlQnVmZmVyIGhvbGxvdyA9IE1lbW9yeVV0aWwuZ2V0SG9sbG93RGlyZWN0Qnl0ZUJ1ZmZlcigpLm9yZGVyKEJ5dGVPcmRlci5CSUdfRU5ESUFOKTsKLSAgICAgICAgaW50IGxvdyA9IDAsIG1pZCA9IG9mZnNldENvdW50LCBoaWdoID0gbWlkIC0gMSwgcmVzdWx0ID0gLTE7Ci0gICAgICAgIHdoaWxlIChsb3cgPD0gaGlnaCkKLSAgICAgICAgewotICAgICAgICAgICAgbWlkID0gKGxvdyArIGhpZ2gpID4+IDE7Ci0gICAgICAgICAgICBmaWxsVGVtcG9yYXJ5S2V5KG1pZCwgaG9sbG93KTsKLSAgICAgICAgICAgIHJlc3VsdCA9IC1EZWNvcmF0ZWRLZXkuY29tcGFyZVRvKHBhcnRpdGlvbmVyLCBob2xsb3csIGtleSk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb3cgPSBtaWQgKyAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1pZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBoaWdoID0gbWlkIC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAtbWlkIC0gKHJlc3VsdCA8IDAgPyAxIDogMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcG9zaXRpb24gb2YgdGhlIGFjdHVhbCBpbmRleCBzdW1tYXJ5IGVudHJ5IGluIG91ciBNZW1vcnkgYXR0cmlidXRlLCAnYnl0ZXMnLgotICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGVudHJ5IG9yIGtleSB0byBnZXQgdGhlIHBvc2l0aW9uIGZvcgotICAgICAqIEByZXR1cm4gYW4gb2Zmc2V0IGludG8gb3VyIE1lbW9yeSBhdHRyaWJ1dGUgd2hlcmUgdGhlIGFjdHVhbCBlbnRyeSByZXNpZGVzCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQb3NpdGlvbkluU3VtbWFyeShpbnQgaW5kZXgpCi0gICAgewotICAgICAgICAvLyBUaGUgZmlyc3Qgc2VjdGlvbiBvZiBieXRlcyBob2xkcyBhIGZvdXItYnl0ZSBwb3NpdGlvbiBmb3IgZWFjaCBlbnRyeSBpbiB0aGUgc3VtbWFyeSwgc28ganVzdCBtdWx0aXBseSBieSA0LgotICAgICAgICByZXR1cm4gb2Zmc2V0cy5nZXRJbnQoaW5kZXggPDwgMik7Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGVbXSBnZXRLZXkoaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgbG9uZyBzdGFydCA9IGdldFBvc2l0aW9uSW5TdW1tYXJ5KGluZGV4KTsKLSAgICAgICAgaW50IGtleVNpemUgPSAoaW50KSAoY2FsY3VsYXRlRW5kKGluZGV4KSAtIHN0YXJ0IC0gOEwpOwotICAgICAgICBieXRlW10ga2V5ID0gbmV3IGJ5dGVba2V5U2l6ZV07Ci0gICAgICAgIGVudHJpZXMuZ2V0Qnl0ZXMoc3RhcnQsIGtleSwgMCwga2V5U2l6ZSk7Ci0gICAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpbGxUZW1wb3JhcnlLZXkoaW50IGluZGV4LCBCeXRlQnVmZmVyIGJ1ZmZlcikKLSAgICB7Ci0gICAgICAgIGxvbmcgc3RhcnQgPSBnZXRQb3NpdGlvbkluU3VtbWFyeShpbmRleCk7Ci0gICAgICAgIGludCBrZXlTaXplID0gKGludCkgKGNhbGN1bGF0ZUVuZChpbmRleCkgLSBzdGFydCAtIDhMKTsKLSAgICAgICAgZW50cmllcy5zZXRCeXRlQnVmZmVyKGJ1ZmZlciwgc3RhcnQsIGtleVNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFRvKFJlZi5JZGVudGl0eUNvbGxlY3Rpb24gaWRlbnRpdGllcykKLSAgICB7Ci0gICAgICAgIHN1cGVyLmFkZFRvKGlkZW50aXRpZXMpOwotICAgICAgICBpZGVudGl0aWVzLmFkZChvZmZzZXRzKTsKLSAgICAgICAgaWRlbnRpdGllcy5hZGQoZW50cmllcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0UG9zaXRpb24oaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVudHJpZXMuZ2V0TG9uZyhjYWxjdWxhdGVFbmQoaW5kZXgpIC0gOCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0RW5kSW5TdW1tYXJ5KGludCBpbmRleCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjYWxjdWxhdGVFbmQoaW5kZXgpOwotICAgIH0KLQotICAgIHByaXZhdGUgbG9uZyBjYWxjdWxhdGVFbmQoaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZGV4ID09IChvZmZzZXRDb3VudCAtIDEpID8gZW50cmllc0xlbmd0aCA6IGdldFBvc2l0aW9uSW5TdW1tYXJ5KGluZGV4ICsgMSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRNaW5JbmRleEludGVydmFsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtaW5JbmRleEludGVydmFsOwotICAgIH0KLQotICAgIHB1YmxpYyBkb3VibGUgZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEJBU0VfU0FNUExJTkdfTEVWRUwgLyAoZG91YmxlKSBzYW1wbGluZ0xldmVsKSAqIG1pbkluZGV4SW50ZXJ2YWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBlc3RpbWF0ZSBvZiB0aGUgdG90YWwgbnVtYmVyIG9mIGtleXMgaW4gdGhlIFNTVGFibGUuCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0RXN0aW1hdGVkS2V5Q291bnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgobG9uZykgZ2V0TWF4TnVtYmVyT2ZFbnRyaWVzKCkgKyAxKSAqIG1pbkluZGV4SW50ZXJ2YWw7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBzaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBvZmZzZXRDb3VudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFNhbXBsaW5nTGV2ZWwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNhbXBsaW5nTGV2ZWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgdGhpcyBzdW1tYXJ5IHdvdWxkIGhhdmUgaWYgaXQgd2VyZSBhdCB0aGUgZnVsbCBzYW1wbGluZyBsZXZlbCwgd2hpY2ggaXMgZXF1YWwKLSAgICAgKiB0byB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHByaW1hcnkgb24tZGlzayBpbmRleCBkaXZpZGVkIGJ5IHRoZSBtaW4gaW5kZXggaW50ZXJ2YWwuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNYXhOdW1iZXJPZkVudHJpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNpemVBdEZ1bGxTYW1wbGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhbW91bnQgb2Ygb2ZmLWhlYXAgbWVtb3J5IHVzZWQgZm9yIHRoZSBlbnRyaWVzIHBvcnRpb24gb2YgdGhpcyBzdW1tYXJ5LgotICAgICAqIEByZXR1cm4gc2l6ZSBpbiBieXRlcwotICAgICAqLwotICAgIGxvbmcgZ2V0RW50cmllc0xlbmd0aCgpCi0gICAgewotICAgICAgICByZXR1cm4gZW50cmllc0xlbmd0aDsKLSAgICB9Ci0KLSAgICBNZW1vcnkgZ2V0T2Zmc2V0cygpCi0gICAgewotICAgICAgICByZXR1cm4gb2Zmc2V0czsKLSAgICB9Ci0KLSAgICBNZW1vcnkgZ2V0RW50cmllcygpCi0gICAgewotICAgICAgICByZXR1cm4gZW50cmllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRPZmZIZWFwU2l6ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gb2Zmc2V0Q291bnQgKiA0ICsgZW50cmllc0xlbmd0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcHJpbWFyeSAob24tZGlzaykgaW5kZXggZW50cmllcyBiZXR3ZWVuIHRoZSBpbmRleCBzdW1tYXJ5IGVudHJ5IGF0IGBpbmRleGAgYW5kIHRoZSBuZXh0Ci0gICAgICogaW5kZXggc3VtbWFyeSBlbnRyeSAoYXNzdW1pbmcgdGhlcmUgaXMgb25lKS4gIFdpdGhvdXQgYW55IGRvd25zYW1wbGluZywgdGhpcyB3aWxsIGFsd2F5cyBiZSBlcXVpdmFsZW50IHRvCi0gICAgICogdGhlIGluZGV4IGludGVydmFsLgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiBhbiBpbmRleCBzdW1tYXJ5IGVudHJ5IChiZXR3ZWVuIHplcm8gYW5kIHRoZSBpbmRleCBlbnRyeSBzaXplKQotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHBhcnRpdGlvbnMgYWZ0ZXIgYGluZGV4YCB1bnRpbCB0aGUgbmV4dCBwYXJ0aXRpb24gd2l0aCBhIHN1bW1hcnkgZW50cnkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWxBZnRlckluZGV4KGludCBpbmRleCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBEb3duc2FtcGxpbmcuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbEFmdGVySW5kZXgoaW5kZXgsIHNhbXBsaW5nTGV2ZWwsIG1pbkluZGV4SW50ZXJ2YWwpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbmRleFN1bW1hcnkgc2hhcmVkQ29weSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEluZGV4U3VtbWFyeSh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEluZGV4U3VtbWFyeVNlcmlhbGl6ZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShJbmRleFN1bW1hcnkgdCwgRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgb3V0LndyaXRlSW50KHQubWluSW5kZXhJbnRlcnZhbCk7Ci0gICAgICAgICAgICBvdXQud3JpdGVJbnQodC5vZmZzZXRDb3VudCk7Ci0gICAgICAgICAgICBvdXQud3JpdGVMb25nKHQuZ2V0T2ZmSGVhcFNpemUoKSk7Ci0gICAgICAgICAgICBvdXQud3JpdGVJbnQodC5zYW1wbGluZ0xldmVsKTsKLSAgICAgICAgICAgIG91dC53cml0ZUludCh0LnNpemVBdEZ1bGxTYW1wbGluZyk7Ci0gICAgICAgICAgICAvLyBvdXIgb24tZGlzayByZXByZXNlbnRhdGlvbiB0cmVhdHMgdGhlIG9mZnNldHMgYW5kIHRoZSBzdW1tYXJ5IGRhdGEgYXMgb25lIGNvbnRpZ3VvdXMgc3RydWN0dXJlLAotICAgICAgICAgICAgLy8gaW4gd2hpY2ggdGhlIG9mZnNldHMgYXJlIGJhc2VkIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzdHJ1Y3R1cmUuIGkuZS4sIGlmIHRoZSBvZmZzZXRzIG9jY3VweQotICAgICAgICAgICAgLy8gWCBieXRlcywgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBvZmZzZXQgd2lsbCBiZSBYLiBJbiBtZW1vcnkgd2Ugc3BsaXQgdGhlIHR3byByZWdpb25zIHVwLCBzbyB0aGF0Ci0gICAgICAgICAgICAvLyB0aGUgc3VtbWFyeSB2YWx1ZXMgYXJlIGluZGV4ZWQgZnJvbSB6ZXJvLCBzbyB3ZSBhcHBseSBhIGNvcnJlY3Rpb24gdG8gdGhlIG9mZnNldHMgd2hlbiBkZS9zZXJpYWxpemluZy4KLSAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSBhZGRpbmcgWCB0byBlYWNoIG9mIHRoZSBvZmZzZXRzLgotICAgICAgICAgICAgaW50IGJhc2VPZmZzZXQgPSB0Lm9mZnNldENvdW50ICogNDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHQub2Zmc2V0Q291bnQgOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IHQub2Zmc2V0cy5nZXRJbnQoaSAqIDQpICsgYmFzZU9mZnNldDsKLSAgICAgICAgICAgICAgICAvLyBvdXIgc2VyaWFsaXphdGlvbiBmb3JtYXQgZm9yIHRoaXMgZmlsZSB1c2VzIG5hdGl2ZSBieXRlIG9yZGVyLCBzbyBpZiB0aGlzIGlzIGRpZmZlcmVudCB0byB0aGUKLSAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IEphdmEgc2VyaWFsaXphdGlvbiBvcmRlciAoQklHX0VORElBTikgd2UgaGF2ZSB0byByZXZlcnNlIG91ciBieXRlcwotICAgICAgICAgICAgICAgIGlmIChCeXRlT3JkZXIubmF0aXZlT3JkZXIoKSAhPSBCeXRlT3JkZXIuQklHX0VORElBTikKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gSW50ZWdlci5yZXZlcnNlQnl0ZXMob2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGVJbnQob2Zmc2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dC53cml0ZSh0LmVudHJpZXMsIDAsIHQuZW50cmllc0xlbmd0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQotICAgICAgICBwdWJsaWMgSW5kZXhTdW1tYXJ5IGRlc2VyaWFsaXplKERhdGFJbnB1dFN0cmVhbSBpbiwgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyLCBpbnQgZXhwZWN0ZWRNaW5JbmRleEludGVydmFsLCBpbnQgbWF4SW5kZXhJbnRlcnZhbCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBtaW5JbmRleEludGVydmFsID0gaW4ucmVhZEludCgpOwotICAgICAgICAgICAgaWYgKG1pbkluZGV4SW50ZXJ2YWwgIT0gZXhwZWN0ZWRNaW5JbmRleEludGVydmFsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJDYW5ub3QgcmVhZCBpbmRleCBzdW1tYXJ5IGJlY2F1c2UgbWluX2luZGV4X2ludGVydmFsIGNoYW5nZWQgZnJvbSAlZCB0byAlZC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkluZGV4SW50ZXJ2YWwsIGV4cGVjdGVkTWluSW5kZXhJbnRlcnZhbCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgb2Zmc2V0Q291bnQgPSBpbi5yZWFkSW50KCk7Ci0gICAgICAgICAgICBsb25nIG9mZmhlYXBTaXplID0gaW4ucmVhZExvbmcoKTsKLSAgICAgICAgICAgIGludCBzYW1wbGluZ0xldmVsID0gaW4ucmVhZEludCgpOwotICAgICAgICAgICAgaW50IGZ1bGxTYW1wbGluZ1N1bW1hcnlTaXplID0gaW4ucmVhZEludCgpOwotCi0gICAgICAgICAgICBpbnQgZWZmZWN0aXZlSW5kZXhJbnRlcnZhbCA9IChpbnQpIE1hdGguY2VpbCgoQkFTRV9TQU1QTElOR19MRVZFTCAvIChkb3VibGUpIHNhbXBsaW5nTGV2ZWwpICogbWluSW5kZXhJbnRlcnZhbCk7Ci0gICAgICAgICAgICBpZiAoZWZmZWN0aXZlSW5kZXhJbnRlcnZhbCA+IG1heEluZGV4SW50ZXJ2YWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlJlYnVpbGRpbmcgaW5kZXggc3VtbWFyeSBiZWNhdXNlIHRoZSBlZmZlY3RpdmUgaW5kZXggaW50ZXJ2YWwgKCVkKSBpcyBoaWdoZXIgdGhhbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdGhlIGN1cnJlbnQgbWF4IGluZGV4IGludGVydmFsICglZCkiLCBlZmZlY3RpdmVJbmRleEludGVydmFsLCBtYXhJbmRleEludGVydmFsKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1lbW9yeSBvZmZzZXRzID0gTWVtb3J5LmFsbG9jYXRlKG9mZnNldENvdW50ICogNCk7Ci0gICAgICAgICAgICBNZW1vcnkgZW50cmllcyA9IE1lbW9yeS5hbGxvY2F0ZShvZmZoZWFwU2l6ZSAtIG9mZnNldHMuc2l6ZSgpKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZCVXRpbGl0aWVzLmNvcHkoaW4sIG5ldyBNZW1vcnlPdXRwdXRTdHJlYW0ob2Zmc2V0cyksIG9mZnNldHMuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5jb3B5KGluLCBuZXcgTWVtb3J5T3V0cHV0U3RyZWFtKGVudHJpZXMpLCBlbnRyaWVzLnNpemUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9mZnNldHMuZnJlZSgpOwotICAgICAgICAgICAgICAgIGVudHJpZXMuZnJlZSgpOwotICAgICAgICAgICAgICAgIHRocm93IGlvZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIG91ciBvbi1kaXNrIHJlcHJlc2VudGF0aW9uIHRyZWF0cyB0aGUgb2Zmc2V0cyBhbmQgdGhlIHN1bW1hcnkgZGF0YSBhcyBvbmUgY29udGlndW91cyBzdHJ1Y3R1cmUsCi0gICAgICAgICAgICAvLyBpbiB3aGljaCB0aGUgb2Zmc2V0cyBhcmUgYmFzZWQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHN0cnVjdHVyZS4gaS5lLiwgaWYgdGhlIG9mZnNldHMgb2NjdXB5Ci0gICAgICAgICAgICAvLyBYIGJ5dGVzLCB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IG9mZnNldCB3aWxsIGJlIFguIEluIG1lbW9yeSB3ZSBzcGxpdCB0aGUgdHdvIHJlZ2lvbnMgdXAsIHNvIHRoYXQKLSAgICAgICAgICAgIC8vIHRoZSBzdW1tYXJ5IHZhbHVlcyBhcmUgaW5kZXhlZCBmcm9tIHplcm8sIHNvIHdlIGFwcGx5IGEgY29ycmVjdGlvbiB0byB0aGUgb2Zmc2V0cyB3aGVuIGRlL3NlcmlhbGl6aW5nLgotICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHN1YnRyYWN0aW5nIFggZnJvbSBlYWNoIG9mIHRoZSBvZmZzZXRzLgotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgb2Zmc2V0cy5zaXplKCkgOyBpICs9IDQpCi0gICAgICAgICAgICAgICAgb2Zmc2V0cy5zZXRJbnQoaSwgKGludCkgKG9mZnNldHMuZ2V0SW50KGkpIC0gb2Zmc2V0cy5zaXplKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhTdW1tYXJ5KHBhcnRpdGlvbmVyLCBvZmZzZXRzLCBvZmZzZXRDb3VudCwgZW50cmllcywgZW50cmllcy5zaXplKCksIGZ1bGxTYW1wbGluZ1N1bW1hcnlTaXplLCBtaW5JbmRleEludGVydmFsLCBzYW1wbGluZ0xldmVsKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGZpcnN0IGFuZCBsYXN0IGtleSBzdG9yZWQgaW4gdGhlIHN1bW1hcnkKLSAgICAgICAgICoKLSAgICAgICAgICogT25seSBmb3IgdXNlIGJ5IG9mZmxpbmUgdG9vbHMgbGlrZSBTU1RhYmxlTWV0YWRhdGFWaWV3ZXIsIG90aGVyd2lzZSBTU1RhYmxlLmZpcnN0L2xhc3Qgc2hvdWxkIGJlIHVzZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgUGFpcjxEZWNvcmF0ZWRLZXksIERlY29yYXRlZEtleT4gZGVzZXJpYWxpemVGaXJzdExhc3RLZXkoRGF0YUlucHV0U3RyZWFtIGluLCBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBpbi5za2lwQnl0ZXMoNCk7IC8vIG1pbkluZGV4SW50ZXJ2YWwKLSAgICAgICAgICAgIGludCBvZmZzZXRDb3VudCA9IGluLnJlYWRJbnQoKTsKLSAgICAgICAgICAgIGxvbmcgb2ZmaGVhcFNpemUgPSBpbi5yZWFkTG9uZygpOwotICAgICAgICAgICAgaW4uc2tpcEJ5dGVzKDgpOyAvLyBzYW1wbGluZ0xldmVsLCBmdWxsU2FtcGxpbmdTdW1tYXJ5U2l6ZQotCi0gICAgICAgICAgICBpbi5za2lwKG9mZnNldENvdW50ICogNCk7Ci0gICAgICAgICAgICBpbi5za2lwKG9mZmhlYXBTaXplIC0gb2Zmc2V0Q291bnQgKiA0KTsKLQotICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGZpcnN0ID0gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhMZW5ndGgoaW4pKTsKLSAgICAgICAgICAgIERlY29yYXRlZEtleSBsYXN0ID0gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhMZW5ndGgoaW4pKTsKLSAgICAgICAgICAgIHJldHVybiBQYWlyLmNyZWF0ZShmaXJzdCwgbGFzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0luZGV4U3VtbWFyeUJ1aWxkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSW5kZXhTdW1tYXJ5QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWNjYTg0Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSW5kZXhTdW1tYXJ5QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuTWVtb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2FmZU1lbW9yeVdyaXRlcjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRvd25zYW1wbGluZy5CQVNFX1NBTVBMSU5HX0xFVkVMOwotCi1wdWJsaWMgY2xhc3MgSW5kZXhTdW1tYXJ5QnVpbGRlciBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSW5kZXhTdW1tYXJ5QnVpbGRlci5jbGFzcyk7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRFeHBlY3RlZEtleVNpemVOYW1lID0gQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJpbmRleF9zdW1tYXJ5X2V4cGVjdGVkX2tleV9zaXplIjsKLSAgICBzdGF0aWMgbG9uZyBkZWZhdWx0RXhwZWN0ZWRLZXlTaXplID0gTG9uZy52YWx1ZU9mKFN5c3RlbS5nZXRQcm9wZXJ0eShkZWZhdWx0RXhwZWN0ZWRLZXlTaXplTmFtZSwgIjY0IikpOwotCi0gICAgLy8gdGhlIG9mZnNldCBpbiB0aGUga2V5cyBtZW1vcnkgcmVnaW9uIHRvIGxvb2sgZm9yIGEgZ2l2ZW4gc3VtbWFyeSBib3VuZGFyeQotICAgIHByaXZhdGUgZmluYWwgU2FmZU1lbW9yeVdyaXRlciBvZmZzZXRzOwotICAgIHByaXZhdGUgZmluYWwgU2FmZU1lbW9yeVdyaXRlciBlbnRyaWVzOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbWluSW5kZXhJbnRlcnZhbDsKLSAgICBwcml2YXRlIGZpbmFsIGludCBzYW1wbGluZ0xldmVsOwotICAgIHByaXZhdGUgZmluYWwgaW50W10gc3RhcnRQb2ludHM7Ci0gICAgcHJpdmF0ZSBsb25nIGtleXNXcml0dGVuID0gMDsKLSAgICBwcml2YXRlIGxvbmcgaW5kZXhJbnRlcnZhbE1hdGNoZXMgPSAwOwotICAgIHByaXZhdGUgbG9uZyBuZXh0U2FtcGxlUG9zaXRpb247Ci0KLSAgICAvLyBmb3IgZWFjaCBSZWFkYWJsZUJvdW5kYXJ5LCB3ZSBtYXAgaXRzIGRhdGFMZW5ndGggcHJvcGVydHkgdG8gaXRzZWxmLCBwZXJtaXR0aW5nIHVzIHRvIGxvb2t1cCB0aGUKLSAgICAvLyBsYXN0IHJlYWRhYmxlIGJvdW5kYXJ5IGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBkYXRhIGZpbGUKLSAgICAvLyBbZGF0YSBmaWxlIHBvc2l0aW9uIGxpbWl0XSA9PiBbUmVhZGFibGVCb3VuZGFyeV0KLSAgICBwcml2YXRlIFRyZWVNYXA8TG9uZywgUmVhZGFibGVCb3VuZGFyeT4gbGFzdFJlYWRhYmxlQnlEYXRhID0gbmV3IFRyZWVNYXA8PigpOwotICAgIC8vIGZvciBlYWNoIFJlYWRhYmxlQm91bmRhcnksIHdlIG1hcCBpdHMgaW5kZXhMZW5ndGggcHJvcGVydHkgdG8gaXRzZWxmLCBwZXJtaXR0aW5nIHVzIHRvIGxvb2t1cCB0aGUKLSAgICAvLyBsYXN0IHJlYWRhYmxlIGJvdW5kYXJ5IGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBpbmRleCBmaWxlCi0gICAgLy8gW2luZGV4IGZpbGUgcG9zaXRpb24gbGltaXRdID0+IFtSZWFkYWJsZUJvdW5kYXJ5XQotICAgIHByaXZhdGUgVHJlZU1hcDxMb25nLCBSZWFkYWJsZUJvdW5kYXJ5PiBsYXN0UmVhZGFibGVCeUluZGV4ID0gbmV3IFRyZWVNYXA8PigpOwotICAgIC8vIHRoZSBsYXN0IHN5bmNlZCBkYXRhIGZpbGUgcG9zaXRpb24KLSAgICBwcml2YXRlIGxvbmcgZGF0YVN5bmNQb3NpdGlvbjsKLSAgICAvLyB0aGUgbGFzdCBzeW5jZWQgaW5kZXggZmlsZSBwb3NpdGlvbgotICAgIHByaXZhdGUgbG9uZyBpbmRleFN5bmNQb3NpdGlvbjsKLQotICAgIC8vIHRoZSBsYXN0IHN1bW1hcnkgaW50ZXJ2YWwgYm91bmRhcnkgdGhhdCBpcyBmdWxseSByZWFkYWJsZSBpbiBib3RoIGRhdGEgYW5kIGluZGV4IGZpbGVzCi0gICAgcHJpdmF0ZSBSZWFkYWJsZUJvdW5kYXJ5IGxhc3RSZWFkYWJsZUJvdW5kYXJ5OwotCi0gICAgLyoqCi0gICAgICogUmVwcmVzZW50cyBhIGJvdW5kYXJ5IHRoYXQgaXMgZ3VhcmFudGVlZCBmdWxseSByZWFkYWJsZSBpbiB0aGUgc3VtbWFyeSwgaW5kZXggZmlsZSBhbmQgZGF0YSBmaWxlLgotICAgICAqIFRoZSBrZXkgY29udGFpbmVkIGlzIHRoZSBsYXN0IGtleSByZWFkYWJsZSBpZiB0aGUgaW5kZXggYW5kIGRhdGEgZmlsZXMgaGF2ZSBiZWVuIGZsdXNoZWQgdG8gdGhlCi0gICAgICogc3RvcmVkIGxlbmd0aHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWFkYWJsZUJvdW5kYXJ5Ci0gICAgewotICAgICAgICBwdWJsaWMgZmluYWwgRGVjb3JhdGVkS2V5IGxhc3RLZXk7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBsb25nIGluZGV4TGVuZ3RoOwotICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyBkYXRhTGVuZ3RoOwotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHN1bW1hcnlDb3VudDsKLSAgICAgICAgcHVibGljIGZpbmFsIGxvbmcgZW50cmllc0xlbmd0aDsKLSAgICAgICAgcHVibGljIFJlYWRhYmxlQm91bmRhcnkoRGVjb3JhdGVkS2V5IGxhc3RLZXksIGxvbmcgaW5kZXhMZW5ndGgsIGxvbmcgZGF0YUxlbmd0aCwgaW50IHN1bW1hcnlDb3VudCwgbG9uZyBlbnRyaWVzTGVuZ3RoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxhc3RLZXkgPSBsYXN0S2V5OwotICAgICAgICAgICAgdGhpcy5pbmRleExlbmd0aCA9IGluZGV4TGVuZ3RoOwotICAgICAgICAgICAgdGhpcy5kYXRhTGVuZ3RoID0gZGF0YUxlbmd0aDsKLSAgICAgICAgICAgIHRoaXMuc3VtbWFyeUNvdW50ID0gc3VtbWFyeUNvdW50OwotICAgICAgICAgICAgdGhpcy5lbnRyaWVzTGVuZ3RoID0gZW50cmllc0xlbmd0aDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkIGFuIGluZGV4IHN1bW1hcnkgYnVpbGRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHBlY3RlZEtleXMgLSB0aGUgbnVtYmVyIG9mIGtleXMgd2UgZXhwZWN0IGluIHRoZSBzc3RhYmxlCi0gICAgICogQHBhcmFtIG1pbkluZGV4SW50ZXJ2YWwgLSB0aGUgbWluaW11bSBpbnRlcnZhbCBiZXR3ZWVuIGVudHJpZXMgc2VsZWN0ZWQgZm9yIHNhbXBsaW5nCi0gICAgICogQHBhcmFtIHNhbXBsaW5nTGV2ZWwgLSB0aGUgbGV2ZWwgYXQgd2hpY2ggZW50cmllcyBhcmUgc2FtcGxlZAotICAgICAqLwotICAgIHB1YmxpYyBJbmRleFN1bW1hcnlCdWlsZGVyKGxvbmcgZXhwZWN0ZWRLZXlzLCBpbnQgbWluSW5kZXhJbnRlcnZhbCwgaW50IHNhbXBsaW5nTGV2ZWwpCi0gICAgewotICAgICAgICB0aGlzLnNhbXBsaW5nTGV2ZWwgPSBzYW1wbGluZ0xldmVsOwotICAgICAgICB0aGlzLnN0YXJ0UG9pbnRzID0gRG93bnNhbXBsaW5nLmdldFN0YXJ0UG9pbnRzKEJBU0VfU0FNUExJTkdfTEVWRUwsIHNhbXBsaW5nTGV2ZWwpOwotCi0gICAgICAgIGxvbmcgZXhwZWN0ZWRFbnRyeVNpemUgPSBnZXRFbnRyeVNpemUoZGVmYXVsdEV4cGVjdGVkS2V5U2l6ZSk7Ci0gICAgICAgIGxvbmcgbWF4RXhwZWN0ZWRFbnRyaWVzID0gZXhwZWN0ZWRLZXlzIC8gbWluSW5kZXhJbnRlcnZhbDsKLSAgICAgICAgbG9uZyBtYXhFeHBlY3RlZEVudHJpZXNTaXplID0gbWF4RXhwZWN0ZWRFbnRyaWVzICogZXhwZWN0ZWRFbnRyeVNpemU7Ci0gICAgICAgIGlmIChtYXhFeHBlY3RlZEVudHJpZXNTaXplID4gSW50ZWdlci5NQVhfVkFMVUUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHRoYXQncyBhIF9sb3RfIG9mIGtleXMsIGFuZCBhIHZlcnkgbG93IG1pbiBpbmRleCBpbnRlcnZhbAotICAgICAgICAgICAgaW50IGVmZmVjdGl2ZU1pbkludGVydmFsID0gKGludCkgTWF0aC5jZWlsKChkb3VibGUpKGV4cGVjdGVkS2V5cyAqIGV4cGVjdGVkRW50cnlTaXplKSAvIEludGVnZXIuTUFYX1ZBTFVFKTsKLSAgICAgICAgICAgIG1heEV4cGVjdGVkRW50cmllcyA9IGV4cGVjdGVkS2V5cyAvIGVmZmVjdGl2ZU1pbkludGVydmFsOwotICAgICAgICAgICAgbWF4RXhwZWN0ZWRFbnRyaWVzU2l6ZSA9IG1heEV4cGVjdGVkRW50cmllcyAqIGV4cGVjdGVkRW50cnlTaXplOwotICAgICAgICAgICAgYXNzZXJ0IG1heEV4cGVjdGVkRW50cmllc1NpemUgPD0gSW50ZWdlci5NQVhfVkFMVUUgOiBtYXhFeHBlY3RlZEVudHJpZXNTaXplOwotICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm1pbl9pbmRleF9pbnRlcnZhbCBvZiB7fSBpcyB0b28gbG93IGZvciB7fSBleHBlY3RlZCBrZXlzIG9mIGF2ZyBzaXplIHt9OyB1c2luZyBpbnRlcnZhbCBvZiB7fSBpbnN0ZWFkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbkluZGV4SW50ZXJ2YWwsIGV4cGVjdGVkS2V5cywgZGVmYXVsdEV4cGVjdGVkS2V5U2l6ZSwgZWZmZWN0aXZlTWluSW50ZXJ2YWwpOwotICAgICAgICAgICAgdGhpcy5taW5JbmRleEludGVydmFsID0gZWZmZWN0aXZlTWluSW50ZXJ2YWw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm1pbkluZGV4SW50ZXJ2YWwgPSBtaW5JbmRleEludGVydmFsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZm9yIGluaXRpYWxpemluZyBkYXRhIHN0cnVjdHVyZXMsIGFkanVzdCBvdXIgZXN0aW1hdGVzIGJhc2VkIG9uIHRoZSBzYW1wbGluZyBsZXZlbAotICAgICAgICBtYXhFeHBlY3RlZEVudHJpZXMgPSBNYXRoLm1heCgxLCAobWF4RXhwZWN0ZWRFbnRyaWVzICogc2FtcGxpbmdMZXZlbCkgLyBCQVNFX1NBTVBMSU5HX0xFVkVMKTsKLSAgICAgICAgb2Zmc2V0cyA9IG5ldyBTYWZlTWVtb3J5V3JpdGVyKDQgKiBtYXhFeHBlY3RlZEVudHJpZXMpLm9yZGVyKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpKTsKLSAgICAgICAgZW50cmllcyA9IG5ldyBTYWZlTWVtb3J5V3JpdGVyKGV4cGVjdGVkRW50cnlTaXplICogbWF4RXhwZWN0ZWRFbnRyaWVzKS5vcmRlcihCeXRlT3JkZXIubmF0aXZlT3JkZXIoKSk7Ci0KLSAgICAgICAgLy8gdGhlIHN1bW1hcnkgd2lsbCBhbHdheXMgY29udGFpbiB0aGUgZmlyc3QgaW5kZXggZW50cnkgKGRvd25zYW1wbGluZyB3aWxsIG5ldmVyIHJlbW92ZSBpdCkKLSAgICAgICAgbmV4dFNhbXBsZVBvc2l0aW9uID0gMDsKLSAgICAgICAgaW5kZXhJbnRlcnZhbE1hdGNoZXMrKzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlbiBhIGtleSwgcmV0dXJuIGhvdyBsb25nIHRoZSBzZXJpYWxpemVkIGluZGV4IHN1bW1hcnkgZW50cnkgd2lsbCBiZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldEVudHJ5U2l6ZShEZWNvcmF0ZWRLZXkga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEVudHJ5U2l6ZShrZXkuZ2V0S2V5KCkucmVtYWluaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVuIGEga2V5IHNpemUsIHJldHVybiBob3cgbG9uZyB0aGUgc2VyaWFsaXplZCBpbmRleCBzdW1tYXJ5IGVudHJ5IHdpbGwgYmUsIHRoYXQgaXMgYWRkIDggYnl0ZXMgdG8KLSAgICAgKiBhY2NvbW9kYXRlIGZvciB0aGUgc2l6ZSBvZiB0aGUgcG9zaXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBnZXRFbnRyeVNpemUobG9uZyBrZXlTaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGtleVNpemUgKyBUeXBlU2l6ZXMuc2l6ZW9mKDBMKTsKLSAgICB9Ci0KLSAgICAvLyB0aGUgaW5kZXggZmlsZSBoYXMgYmVlbiBmbHVzaGVkIHRvIHRoZSBwcm92aWRlZCBwb3NpdGlvbjsgc3Rhc2ggaXQgYW5kIHVzZSB0aGF0IHRvIHJlY2FsY3VsYXRlIG91ciBtYXggcmVhZGFibGUgYm91bmRhcnkKLSAgICBwdWJsaWMgdm9pZCBtYXJrSW5kZXhTeW5jZWQobG9uZyB1cFRvUG9zaXRpb24pCi0gICAgewotICAgICAgICBpbmRleFN5bmNQb3NpdGlvbiA9IHVwVG9Qb3NpdGlvbjsKLSAgICAgICAgcmVmcmVzaFJlYWRhYmxlQm91bmRhcnkoKTsKLSAgICB9Ci0KLSAgICAvLyB0aGUgZGF0YSBmaWxlIGhhcyBiZWVuIGZsdXNoZWQgdG8gdGhlIHByb3ZpZGVkIHBvc2l0aW9uOyBzdGFzaCBpdCBhbmQgdXNlIHRoYXQgdG8gcmVjYWxjdWxhdGUgb3VyIG1heCByZWFkYWJsZSBib3VuZGFyeQotICAgIHB1YmxpYyB2b2lkIG1hcmtEYXRhU3luY2VkKGxvbmcgdXBUb1Bvc2l0aW9uKQotICAgIHsKLSAgICAgICAgZGF0YVN5bmNQb3NpdGlvbiA9IHVwVG9Qb3NpdGlvbjsKLSAgICAgICAgcmVmcmVzaFJlYWRhYmxlQm91bmRhcnkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVmcmVzaFJlYWRhYmxlQm91bmRhcnkoKQotICAgIHsKLSAgICAgICAgLy8gZ3JhYiB0aGUgcmVhZGFibGUgYm91bmRhcnkgcHJpb3IgdG8gdGhlIGdpdmVuIHBvc2l0aW9uIGluIGVpdGhlciB0aGUgZGF0YSBvciBpbmRleCBmaWxlCi0gICAgICAgIE1hcC5FbnRyeTw/LCBSZWFkYWJsZUJvdW5kYXJ5PiBieURhdGEgPSBsYXN0UmVhZGFibGVCeURhdGEuZmxvb3JFbnRyeShkYXRhU3luY1Bvc2l0aW9uKTsKLSAgICAgICAgTWFwLkVudHJ5PD8sIFJlYWRhYmxlQm91bmRhcnk+IGJ5SW5kZXggPSBsYXN0UmVhZGFibGVCeUluZGV4LmZsb29yRW50cnkoaW5kZXhTeW5jUG9zaXRpb24pOwotICAgICAgICBpZiAoYnlEYXRhID09IG51bGwgfHwgYnlJbmRleCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8vIHRha2UgdGhlIGxvd2VzdCBvZiB0aGUgdHdvLCBhbmQgc3Rhc2ggaXQKLSAgICAgICAgbGFzdFJlYWRhYmxlQm91bmRhcnkgPSBieUluZGV4LmdldFZhbHVlKCkuaW5kZXhMZW5ndGggPCBieURhdGEuZ2V0VmFsdWUoKS5pbmRleExlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYnlJbmRleC5nZXRWYWx1ZSgpIDogYnlEYXRhLmdldFZhbHVlKCk7Ci0KLSAgICAgICAgLy8gY2xlYXIgb3VyIGRhdGEgcHJpb3IgdG8gdGhpcywgc2luY2Ugd2Ugbm8gbG9uZ2VyIG5lZWQgaXQKLSAgICAgICAgbGFzdFJlYWRhYmxlQnlEYXRhLmhlYWRNYXAobGFzdFJlYWRhYmxlQm91bmRhcnkuZGF0YUxlbmd0aCwgZmFsc2UpLmNsZWFyKCk7Ci0gICAgICAgIGxhc3RSZWFkYWJsZUJ5SW5kZXguaGVhZE1hcChsYXN0UmVhZGFibGVCb3VuZGFyeS5pbmRleExlbmd0aCwgZmFsc2UpLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlYWRhYmxlQm91bmRhcnkgZ2V0TGFzdFJlYWRhYmxlQm91bmRhcnkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGxhc3RSZWFkYWJsZUJvdW5kYXJ5OwotICAgIH0KLQotICAgIHB1YmxpYyBJbmRleFN1bW1hcnlCdWlsZGVyIG1heWJlQWRkRW50cnkoRGVjb3JhdGVkS2V5IGRlY29yYXRlZEtleSwgbG9uZyBpbmRleFN0YXJ0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBtYXliZUFkZEVudHJ5KGRlY29yYXRlZEtleSwgaW5kZXhTdGFydCwgMCwgMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVjb3JhdGVkS2V5IHRoZSBrZXkgZm9yIHRoaXMgcmVjb3JkCi0gICAgICogQHBhcmFtIGluZGV4U3RhcnQgdGhlIHBvc2l0aW9uIGluIHRoZSBpbmRleCBmaWxlIHRoaXMgcmVjb3JkIGJlZ2lucwotICAgICAqIEBwYXJhbSBpbmRleEVuZCB0aGUgcG9zaXRpb24gaW4gdGhlIGluZGV4IGZpbGUgd2UgbmVlZCB0byBiZSBhYmxlIHRvIHJlYWQgdG8gKGV4Y2x1c2l2ZSkgdG8gcmVhZCB0aGlzIHJlY29yZAotICAgICAqIEBwYXJhbSBkYXRhRW5kIHRoZSBwb3NpdGlvbiBpbiB0aGUgZGF0YSBmaWxlIHdlIG5lZWQgdG8gYmUgYWJsZSB0byByZWFkIHRvIChleGNsdXNpdmUpIHRvIHJlYWQgdGhpcyByZWNvcmQKLSAgICAgKiAgICAgICAgICAgICAgICBhIHZhbHVlIG9mIDAgaW5kaWNhdGVzIHdlIGFyZSBub3QgdHJhY2tpbmcgcmVhZGFibGUgYm91bmRhcmllcwotICAgICAqLwotICAgIHB1YmxpYyBJbmRleFN1bW1hcnlCdWlsZGVyIG1heWJlQWRkRW50cnkoRGVjb3JhdGVkS2V5IGRlY29yYXRlZEtleSwgbG9uZyBpbmRleFN0YXJ0LCBsb25nIGluZGV4RW5kLCBsb25nIGRhdGFFbmQpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKGtleXNXcml0dGVuID09IG5leHRTYW1wbGVQb3NpdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChlbnRyaWVzLmxlbmd0aCgpICsgZ2V0RW50cnlTaXplKGRlY29yYXRlZEtleSkpIDw9IEludGVnZXIuTUFYX1ZBTFVFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9mZnNldHMud3JpdGVJbnQoKGludCkgZW50cmllcy5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgZW50cmllcy53cml0ZShkZWNvcmF0ZWRLZXkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgIGVudHJpZXMud3JpdGVMb25nKGluZGV4U3RhcnQpOwotICAgICAgICAgICAgICAgIHNldE5leHRTYW1wbGVQb3NpdGlvbihrZXlzV3JpdHRlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgY2Fubm90IGZ1bGx5IHNhbXBsZSB0aGlzIHNzdGFibGUgZHVlIHRvIHRvbyBtdWNoIG1lbW9yeSBpbiB0aGUgaW5kZXggc3VtbWFyeSwgc28gbGV0J3MgdGVsbCB0aGUgdXNlcgotICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiTWVtb3J5IGNhcGFjaXR5IG9mIGluZGV4IHN1bW1hcnkgZXhjZWVkZWQgKDJHaUIpLCBpbmRleCBzdW1tYXJ5IHdpbGwgbm90IGNvdmVyIGZ1bGwgc3N0YWJsZSwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5b3Ugc2hvdWxkIGluY3JlYXNlIG1pbl9zYW1wbGluZ19sZXZlbCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGRhdGFFbmQgIT0gMCAmJiBrZXlzV3JpdHRlbiArIDEgPT0gbmV4dFNhbXBsZVBvc2l0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBsYXN0IGtleSBpbiB0aGlzIHN1bW1hcnkgaW50ZXJ2YWwsIHNvIHN0YXNoIGl0Ci0gICAgICAgICAgICBSZWFkYWJsZUJvdW5kYXJ5IGJvdW5kYXJ5ID0gbmV3IFJlYWRhYmxlQm91bmRhcnkoZGVjb3JhdGVkS2V5LCBpbmRleEVuZCwgZGF0YUVuZCwgKGludCkgKG9mZnNldHMubGVuZ3RoKCkgLyA0KSwgZW50cmllcy5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBsYXN0UmVhZGFibGVCeURhdGEucHV0KGRhdGFFbmQsIGJvdW5kYXJ5KTsKLSAgICAgICAgICAgIGxhc3RSZWFkYWJsZUJ5SW5kZXgucHV0KGluZGV4RW5kLCBib3VuZGFyeSk7Ci0gICAgICAgIH0KLQotICAgICAgICBrZXlzV3JpdHRlbisrOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvLyBjYWxjdWxhdGUgdGhlIG5leHQga2V5IHdlIHdpbGwgc3RvcmUgdG8gb3VyIHN1bW1hcnkKLSAgICBwcml2YXRlIHZvaWQgc2V0TmV4dFNhbXBsZVBvc2l0aW9uKGxvbmcgcG9zaXRpb24pCi0gICAgewotICAgICAgICB0cnlBZ2Fpbjogd2hpbGUgKHRydWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBvc2l0aW9uICs9IG1pbkluZGV4SW50ZXJ2YWw7Ci0gICAgICAgICAgICBsb25nIHRlc3QgPSBpbmRleEludGVydmFsTWF0Y2hlcysrOwotICAgICAgICAgICAgZm9yIChpbnQgc3RhcnQgOiBzdGFydFBvaW50cykKLSAgICAgICAgICAgICAgICBpZiAoKHRlc3QgLSBzdGFydCkgJSBCQVNFX1NBTVBMSU5HX0xFVkVMID09IDApCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRyeUFnYWluOwotCi0gICAgICAgICAgICBuZXh0U2FtcGxlUG9zaXRpb24gPSBwb3NpdGlvbjsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVUb0NvbW1pdCgpCi0gICAgewotICAgICAgICAvLyB0aGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiB3ZSd2ZSBmaW5pc2hlZCBhcHBlbmRpbmcgcmVjb3Jkcywgc28gd2UgdHJ1bmNhdGUgdGhlCi0gICAgICAgIC8vIG1lbW9yeSB3ZSdyZSB1c2luZyB0byB0aGUgZXhhY3QgYW1vdW50IHJlcXVpcmVkIHRvIHJlcHJlc2VudCBpdCBiZWZvcmUgYnVpbGRpbmcgb3VyIHN1bW1hcnkKLSAgICAgICAgZW50cmllcy50cmltKCk7Ci0gICAgICAgIG9mZnNldHMudHJpbSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbmRleFN1bW1hcnkgYnVpbGQoSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJ1aWxkKHBhcnRpdGlvbmVyLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvLyBidWlsZCB0aGUgc3VtbWFyeSB1cCB0byB0aGUgcHJvdmlkZWQgYm91bmRhcnk7IHRoaXMgaXMgYmFja2VkIGJ5IHNoYXJlZCBtZW1vcnkgYmV0d2VlbgotICAgIC8vIG11bHRpcGxlIGludm9jYXRpb25zIG9mIHRoaXMgYnVpbGQgbWV0aG9kCi0gICAgcHVibGljIEluZGV4U3VtbWFyeSBidWlsZChJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIsIFJlYWRhYmxlQm91bmRhcnkgYm91bmRhcnkpCi0gICAgewotICAgICAgICBhc3NlcnQgZW50cmllcy5sZW5ndGgoKSA+IDA7Ci0KLSAgICAgICAgaW50IGNvdW50ID0gKGludCkgKG9mZnNldHMubGVuZ3RoKCkgLyA0KTsKLSAgICAgICAgbG9uZyBlbnRyaWVzTGVuZ3RoID0gZW50cmllcy5sZW5ndGgoKTsKLSAgICAgICAgaWYgKGJvdW5kYXJ5ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvdW50ID0gYm91bmRhcnkuc3VtbWFyeUNvdW50OwotICAgICAgICAgICAgZW50cmllc0xlbmd0aCA9IGJvdW5kYXJ5LmVudHJpZXNMZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc2l6ZUF0RnVsbFNhbXBsaW5nID0gKGludCkgTWF0aC5jZWlsKGtleXNXcml0dGVuIC8gKGRvdWJsZSkgbWluSW5kZXhJbnRlcnZhbCk7Ci0gICAgICAgIGFzc2VydCBjb3VudCA+IDA7Ci0gICAgICAgIHJldHVybiBuZXcgSW5kZXhTdW1tYXJ5KHBhcnRpdGlvbmVyLCBvZmZzZXRzLmN1cnJlbnRCdWZmZXIoKS5zaGFyZWRDb3B5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LCBlbnRyaWVzLmN1cnJlbnRCdWZmZXIoKS5zaGFyZWRDb3B5KCksIGVudHJpZXNMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVBdEZ1bGxTYW1wbGluZywgbWluSW5kZXhJbnRlcnZhbCwgc2FtcGxpbmdMZXZlbCk7Ci0gICAgfQotCi0gICAgLy8gY2xvc2UgdGhlIGJ1aWxkZXIgYW5kIHJlbGVhc2UgYW55IGFzc29jaWF0ZWQgbWVtb3J5Ci0gICAgcHVibGljIHZvaWQgY2xvc2UoKQotICAgIHsKLSAgICAgICAgZW50cmllcy5jbG9zZSgpOwotICAgICAgICBvZmZzZXRzLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFRocm93YWJsZSBjbG9zZShUaHJvd2FibGUgYWNjdW11bGF0ZSkKLSAgICB7Ci0gICAgICAgIGFjY3VtdWxhdGUgPSBlbnRyaWVzLmNsb3NlKGFjY3VtdWxhdGUpOwotICAgICAgICBhY2N1bXVsYXRlID0gb2Zmc2V0cy5jbG9zZShhY2N1bXVsYXRlKTsKLSAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGU7Ci0gICAgfQotCi0gICAgc3RhdGljIGludCBlbnRyaWVzQXRTYW1wbGluZ0xldmVsKGludCBzYW1wbGluZ0xldmVsLCBpbnQgbWF4U3VtbWFyeVNpemUpCi0gICAgewotICAgICAgICByZXR1cm4gKGludCkgTWF0aC5jZWlsKChzYW1wbGluZ0xldmVsICogbWF4U3VtbWFyeVNpemUpIC8gKGRvdWJsZSkgQkFTRV9TQU1QTElOR19MRVZFTCk7Ci0gICAgfQotCi0gICAgc3RhdGljIGludCBjYWxjdWxhdGVTYW1wbGluZ0xldmVsKGludCBjdXJyZW50U2FtcGxpbmdMZXZlbCwgaW50IGN1cnJlbnROdW1FbnRyaWVzLCBsb25nIHRhcmdldE51bUVudHJpZXMsIGludCBtaW5JbmRleEludGVydmFsLCBpbnQgbWF4SW5kZXhJbnRlcnZhbCkKLSAgICB7Ci0gICAgICAgIC8vIGVmZmVjdGl2ZSBpbmRleCBpbnRlcnZhbCA9PSAoQkFTRV9TQU1QTElOR19MRVZFTCAvIHNhbXBsaW5nTGV2ZWwpICogbWluSW5kZXhJbnRlcnZhbAotICAgICAgICAvLyBzbyB3ZSBjYW4ganVzdCBzb2x2ZSBmb3IgbWluU2FtcGxpbmdMZXZlbCBoZXJlOgotICAgICAgICAvLyBtYXhJbmRleEludGVydmFsID09IChCQVNFX1NBTVBMSU5HX0xFVkVMIC8gbWluU2FtcGxpbmdMZXZlbCkgKiBtaW5JbmRleEludGVydmFsCi0gICAgICAgIGludCBlZmZlY3RpdmVNaW5TYW1wbGluZ0xldmVsID0gTWF0aC5tYXgoMSwgKGludCkgTWF0aC5jZWlsKChCQVNFX1NBTVBMSU5HX0xFVkVMICogbWluSW5kZXhJbnRlcnZhbCkgLyAoZG91YmxlKSBtYXhJbmRleEludGVydmFsKSk7Ci0KLSAgICAgICAgLy8gQWxnZWJyYWljIGV4cGxhbmF0aW9uIGZvciBjYWxjdWxhdGluZyB0aGUgbmV3IHNhbXBsaW5nIGxldmVsIChzb2x2ZSBmb3IgbmV3U2FtcGxpbmdMZXZlbCk6Ci0gICAgICAgIC8vIG9yaWdpbmFsTnVtRW50cmllcyA9IChiYXNlU2FtcGxpbmdMZXZlbCAvIGN1cnJlbnRTYW1wbGluZ0xldmVsKSAqIGN1cnJlbnROdW1FbnRyaWVzCi0gICAgICAgIC8vIG5ld1NwYWNlVXNlZCA9IChuZXdTYW1wbGluZ0xldmVsIC8gYmFzZVNhbXBsaW5nTGV2ZWwpICogb3JpZ2luYWxOdW1FbnRyaWVzCi0gICAgICAgIC8vIG5ld1NwYWNlVXNlZCA9IChuZXdTYW1wbGluZ0xldmVsIC8gYmFzZVNhbXBsaW5nTGV2ZWwpICogKGJhc2VTYW1wbGluZ0xldmVsIC8gY3VycmVudFNhbXBsaW5nTGV2ZWwpICogY3VycmVudE51bUVudHJpZXMKLSAgICAgICAgLy8gbmV3U3BhY2VVc2VkID0gKG5ld1NhbXBsaW5nTGV2ZWwgLyBjdXJyZW50U2FtcGxpbmdMZXZlbCkgKiBjdXJyZW50TnVtRW50cmllcwotICAgICAgICAvLyAobmV3U3BhY2VVc2VkICogY3VycmVudFNhbXBsaW5nTGV2ZWwpIC8gY3VycmVudE51bUVudHJpZXMgPSBuZXdTYW1wbGluZ0xldmVsCi0gICAgICAgIGludCBuZXdTYW1wbGluZ0xldmVsID0gKGludCkgKHRhcmdldE51bUVudHJpZXMgKiBjdXJyZW50U2FtcGxpbmdMZXZlbCkgLyBjdXJyZW50TnVtRW50cmllczsKLSAgICAgICAgcmV0dXJuIE1hdGgubWluKEJBU0VfU0FNUExJTkdfTEVWRUwsIE1hdGgubWF4KGVmZmVjdGl2ZU1pblNhbXBsaW5nTGV2ZWwsIG5ld1NhbXBsaW5nTGV2ZWwpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEb3duc2FtcGxlcyBhbiBleGlzdGluZyBpbmRleCBzdW1tYXJ5IHRvIGEgbmV3IHNhbXBsaW5nIGxldmVsLgotICAgICAqIEBwYXJhbSBleGlzdGluZyBhbiBleGlzdGluZyBJbmRleFN1bW1hcnkKLSAgICAgKiBAcGFyYW0gbmV3U2FtcGxpbmdMZXZlbCB0aGUgdGFyZ2V0IGxldmVsIGZvciB0aGUgbmV3IEluZGV4U3VtbWFyeS4gIFRoaXMgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgc2FtcGxpbmcKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCBmb3IgYGV4aXN0aW5nYC4KLSAgICAgKiBAcGFyYW0gcGFydGl0aW9uZXIgdGhlIHBhcnRpdGlvbmVyIHVzZWQgZm9yIHRoZSBpbmRleCBzdW1tYXJ5Ci0gICAgICogQHJldHVybiBhIG5ldyBJbmRleFN1bW1hcnkKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQotICAgIHB1YmxpYyBzdGF0aWMgSW5kZXhTdW1tYXJ5IGRvd25zYW1wbGUoSW5kZXhTdW1tYXJ5IGV4aXN0aW5nLCBpbnQgbmV3U2FtcGxpbmdMZXZlbCwgaW50IG1pbkluZGV4SW50ZXJ2YWwsIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lcikKLSAgICB7Ci0gICAgICAgIC8vIFRvIGRvd25zYW1wbGUgdGhlIG9sZCBpbmRleCBzdW1tYXJ5LCB3ZSdsbCBnbyB0aHJvdWdoIChwb3RlbnRpYWxseSkgc2V2ZXJhbCByb3VuZHMgb2YgZG93bnNhbXBsaW5nLgotICAgICAgICAvLyBDb25jZXB0dWFsbHksIGVhY2ggcm91bmQgc3RhcnRzIGF0IHBvc2l0aW9uIFggYW5kIHRoZW4gcmVtb3ZlcyBldmVyeSBOdGggaXRlbS4gIFRoZSB2YWx1ZSBvZiBYIGZvbGxvd3MKLSAgICAgICAgLy8gYSBwYXJ0aWN1bGFyIHBhdHRlcm4gdG8gZXZlbmx5IHNwYWNlIG91dCB0aGUgaXRlbXMgdGhhdCB3ZSByZW1vdmUuICBUaGUgdmFsdWUgb2YgTiBkZWNyZWFzZXMgYnkgb25lIGVhY2gKLSAgICAgICAgLy8gcm91bmQuCi0KLSAgICAgICAgaW50IGN1cnJlbnRTYW1wbGluZ0xldmVsID0gZXhpc3RpbmcuZ2V0U2FtcGxpbmdMZXZlbCgpOwotICAgICAgICBhc3NlcnQgY3VycmVudFNhbXBsaW5nTGV2ZWwgPiBuZXdTYW1wbGluZ0xldmVsOwotICAgICAgICBhc3NlcnQgbWluSW5kZXhJbnRlcnZhbCA9PSBleGlzdGluZy5nZXRNaW5JbmRleEludGVydmFsKCk7Ci0KLSAgICAgICAgLy8gY2FsY3VsYXRlIHN0YXJ0aW5nIGluZGV4ZXMgZm9yIGRvd25zYW1wbGluZyByb3VuZHMKLSAgICAgICAgaW50W10gc3RhcnRQb2ludHMgPSBEb3duc2FtcGxpbmcuZ2V0U3RhcnRQb2ludHMoY3VycmVudFNhbXBsaW5nTGV2ZWwsIG5ld1NhbXBsaW5nTGV2ZWwpOwotCi0gICAgICAgIC8vIGNhbGN1bGF0ZSBuZXcgb2ZmLWhlYXAgc2l6ZQotICAgICAgICBpbnQgbmV3S2V5Q291bnQgPSBleGlzdGluZy5zaXplKCk7Ci0gICAgICAgIGxvbmcgbmV3RW50cmllc0xlbmd0aCA9IGV4aXN0aW5nLmdldEVudHJpZXNMZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgc3RhcnQgOiBzdGFydFBvaW50cykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IHN0YXJ0OyBqIDwgZXhpc3Rpbmcuc2l6ZSgpOyBqICs9IGN1cnJlbnRTYW1wbGluZ0xldmVsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5ld0tleUNvdW50LS07Ci0gICAgICAgICAgICAgICAgbG9uZyBsZW5ndGggPSBleGlzdGluZy5nZXRFbmRJblN1bW1hcnkoaikgLSBleGlzdGluZy5nZXRQb3NpdGlvbkluU3VtbWFyeShqKTsKLSAgICAgICAgICAgICAgICBuZXdFbnRyaWVzTGVuZ3RoIC09IGxlbmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIE1lbW9yeSBvbGRFbnRyaWVzID0gZXhpc3RpbmcuZ2V0RW50cmllcygpOwotICAgICAgICBNZW1vcnkgbmV3T2Zmc2V0cyA9IE1lbW9yeS5hbGxvY2F0ZShuZXdLZXlDb3VudCAqIDQpOwotICAgICAgICBNZW1vcnkgbmV3RW50cmllcyA9IE1lbW9yeS5hbGxvY2F0ZShuZXdFbnRyaWVzTGVuZ3RoKTsKLQotICAgICAgICAvLyBDb3B5IG9sZCBlbnRyaWVzIHRvIG91ciBuZXcgTWVtb3J5LgotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGludCBuZXdFbnRyaWVzT2Zmc2V0ID0gMDsKLSAgICAgICAgb3V0ZXI6Ci0gICAgICAgIGZvciAoaW50IG9sZFN1bW1hcnlJbmRleCA9IDA7IG9sZFN1bW1hcnlJbmRleCA8IGV4aXN0aW5nLnNpemUoKTsgb2xkU3VtbWFyeUluZGV4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSBpZiB3ZSBjYW4gc2tpcCB0aGlzIGVudHJ5LCBnbyB0aHJvdWdoIHRoZSBzdGFydGluZyBwb2ludHMgZm9yIG91ciBkb3duc2FtcGxpbmcgcm91bmRzCi0gICAgICAgICAgICAvLyBhbmQgc2VlIGlmIHRoZSBlbnRyeSdzIGluZGV4IGlzIGNvdmVyZWQgYnkgdGhhdCByb3VuZAotICAgICAgICAgICAgZm9yIChpbnQgc3RhcnQgOiBzdGFydFBvaW50cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKG9sZFN1bW1hcnlJbmRleCAtIHN0YXJ0KSAlIGN1cnJlbnRTYW1wbGluZ0xldmVsID09IDApCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB3cml0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGFjdHVhbCBlbnRyeSBpbiB0aGUgaW5kZXggc3VtbWFyeSAoNCBieXRlcykKLSAgICAgICAgICAgIG5ld09mZnNldHMuc2V0SW50KGkgKiA0LCBuZXdFbnRyaWVzT2Zmc2V0KTsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBleGlzdGluZy5nZXRQb3NpdGlvbkluU3VtbWFyeShvbGRTdW1tYXJ5SW5kZXgpOwotICAgICAgICAgICAgbG9uZyBsZW5ndGggPSBleGlzdGluZy5nZXRFbmRJblN1bW1hcnkob2xkU3VtbWFyeUluZGV4KSAtIHN0YXJ0OwotICAgICAgICAgICAgbmV3RW50cmllcy5wdXQobmV3RW50cmllc09mZnNldCwgb2xkRW50cmllcywgc3RhcnQsIGxlbmd0aCk7Ci0gICAgICAgICAgICBuZXdFbnRyaWVzT2Zmc2V0ICs9IGxlbmd0aDsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnQgbmV3RW50cmllc09mZnNldCA9PSBuZXdFbnRyaWVzTGVuZ3RoOwotICAgICAgICByZXR1cm4gbmV3IEluZGV4U3VtbWFyeShwYXJ0aXRpb25lciwgbmV3T2Zmc2V0cywgbmV3S2V5Q291bnQsIG5ld0VudHJpZXMsIG5ld0VudHJpZXNMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmdldE1heE51bWJlck9mRW50cmllcygpLCBtaW5JbmRleEludGVydmFsLCBuZXdTYW1wbGluZ0xldmVsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0luZGV4U3VtbWFyeU1hbmFnZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSW5kZXhTdW1tYXJ5TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTFhZDJiLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSW5kZXhTdW1tYXJ5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEZ1dHVyZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwotCi1pbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuVGltZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclBsdXM7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5TU1RhYmxlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5WaWV3OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRXhlY3V0b3JVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5NQmVhbldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5XcmFwcGVkUnVubmFibGU7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvckZhY3RvcnkuR2xvYmFsLmV4ZWN1dG9yRmFjdG9yeTsKLS8qKgotICogTWFuYWdlcyB0aGUgZml4ZWQtc2l6ZSBtZW1vcnkgcG9vbCBmb3IgaW5kZXggc3VtbWFyaWVzLCBwZXJpb2RpY2FsbHkgcmVzaXppbmcgdGhlbQotICogaW4gb3JkZXIgdG8gZ2l2ZSBtb3JlIG1lbW9yeSB0byBob3Qgc3N0YWJsZXMgYW5kIGxlc3MgbWVtb3J5IHRvIGNvbGQgc3N0YWJsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmRleFN1bW1hcnlNYW5hZ2VyIGltcGxlbWVudHMgSW5kZXhTdW1tYXJ5TWFuYWdlck1CZWFuCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEluZGV4U3VtbWFyeU1hbmFnZXIuY2xhc3MpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1CRUFOX05BTUUgPSAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGI6dHlwZT1JbmRleFN1bW1hcmllcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbmRleFN1bW1hcnlNYW5hZ2VyIGluc3RhbmNlOwotCi0gICAgcHJpdmF0ZSBsb25nIG1lbW9yeVBvb2xCeXRlczsKLQotICAgIHByaXZhdGUgZmluYWwgU2NoZWR1bGVkRXhlY3V0b3JQbHVzIGV4ZWN1dG9yOwotCi0gICAgLy8gb3VyIG5leHQgc2NoZWR1bGVkIHJlc2l6aW5nIHJ1bgotICAgIHByaXZhdGUgU2NoZWR1bGVkRnV0dXJlIGZ1dHVyZTsKLQotICAgIHN0YXRpYwotICAgIHsKLSAgICAgICAgaW5zdGFuY2UgPSBuZXcgSW5kZXhTdW1tYXJ5TWFuYWdlcigpOwotICAgICAgICBNQmVhbldyYXBwZXIuaW5zdGFuY2UucmVnaXN0ZXJNQmVhbihpbnN0YW5jZSwgTUJFQU5fTkFNRSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJbmRleFN1bW1hcnlNYW5hZ2VyKCkKLSAgICB7Ci0gICAgICAgIGV4ZWN1dG9yID0gZXhlY3V0b3JGYWN0b3J5KCkuc2NoZWR1bGVkKGZhbHNlLCAiSW5kZXhTdW1tYXJ5TWFuYWdlciIsIFRocmVhZC5NSU5fUFJJT1JJVFkpOwotCi0gICAgICAgIGxvbmcgaW5kZXhTdW1tYXJ5U2l6ZUluTUIgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0SW5kZXhTdW1tYXJ5Q2FwYWNpdHlJbk1pQigpOwotICAgICAgICBpbnQgaW50ZXJ2YWwgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0SW5kZXhTdW1tYXJ5UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoKTsKLSAgICAgICAgbG9nZ2VyLmluZm8oIkluaXRpYWxpemluZyBpbmRleCBzdW1tYXJ5IG1hbmFnZXIgd2l0aCBhIG1lbW9yeSBwb29sIHNpemUgb2Yge30gTUIgYW5kIGEgcmVzaXplIGludGVydmFsIG9mIHt9IG1pbnV0ZXMiLAotICAgICAgICAgICAgICAgICAgICBpbmRleFN1bW1hcnlTaXplSW5NQiwgaW50ZXJ2YWwpOwotCi0gICAgICAgIHNldE1lbW9yeVBvb2xDYXBhY2l0eUluTUIoRGF0YWJhc2VEZXNjcmlwdG9yLmdldEluZGV4U3VtbWFyeUNhcGFjaXR5SW5NaUIoKSk7Ci0gICAgICAgIHNldFJlc2l6ZUludGVydmFsSW5NaW51dGVzKERhdGFiYXNlRGVzY3JpcHRvci5nZXRJbmRleFN1bW1hcnlSZXNpemVJbnRlcnZhbEluTWludXRlcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFJlc2l6ZUludGVydmFsSW5NaW51dGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0SW5kZXhTdW1tYXJ5UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNpemVJbnRlcnZhbEluTWludXRlcyhpbnQgcmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMpCi0gICAgewotICAgICAgICBpbnQgb2xkSW50ZXJ2YWwgPSBnZXRSZXNpemVJbnRlcnZhbEluTWludXRlcygpOwotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0SW5kZXhTdW1tYXJ5UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMocmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMpOwotCi0gICAgICAgIGxvbmcgaW5pdGlhbERlbGF5OwotICAgICAgICBpZiAoZnV0dXJlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxEZWxheSA9IG9sZEludGVydmFsIDwgMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgPyByZXNpemVJbnRlcnZhbEluTWludXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBNYXRoLm1heCgwLCByZXNpemVJbnRlcnZhbEluTWludXRlcyAtIChvbGRJbnRlcnZhbCAtIGZ1dHVyZS5nZXREZWxheShUaW1lVW5pdC5NSU5VVEVTKSkpOwotICAgICAgICAgICAgZnV0dXJlLmNhbmNlbChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsRGVsYXkgPSByZXNpemVJbnRlcnZhbEluTWludXRlczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXNpemVJbnRlcnZhbEluTWludXRlcyA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZ1dHVyZSA9IG51bGw7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmdXR1cmUgPSBleGVjdXRvci5zY2hlZHVsZVdpdGhGaXhlZERlbGF5KG5ldyBXcmFwcGVkUnVubmFibGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5NYXlUaHJvdygpIHRocm93cyBFeGNlcHRpb24KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgaW5pdGlhbERlbGF5LCByZXNpemVJbnRlcnZhbEluTWludXRlcywgVGltZVVuaXQuTUlOVVRFUyk7Ci0gICAgfQotCi0gICAgLy8gZm9yIHRlc3Rpbmcgb25seQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIExvbmcgZ2V0VGltZVRvTmV4dFJlc2l6ZShUaW1lVW5pdCB0aW1lVW5pdCkKLSAgICB7Ci0gICAgICAgIGlmIChmdXR1cmUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiBmdXR1cmUuZ2V0RGVsYXkodGltZVVuaXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldE1lbW9yeVBvb2xDYXBhY2l0eUluTUIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1lbW9yeVBvb2xCeXRlcyAvIDEwMjRMIC8gMTAyNEw7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIEludGVnZXI+IGdldEluZGV4SW50ZXJ2YWxzKCkKLSAgICB7Ci0gICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMgPSBnZXRBbGxTU1RhYmxlcygpOwotICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBpbnRlcnZhbHMgPSBuZXcgSGFzaE1hcDw+KHNzdGFibGVzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCi0gICAgICAgICAgICBpbnRlcnZhbHMucHV0KHNzdGFibGUuZ2V0RmlsZW5hbWUoKSwgKGludCkgTWF0aC5yb3VuZChzc3RhYmxlLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKSkpOwotCi0gICAgICAgIHJldHVybiBpbnRlcnZhbHM7Ci0gICAgfQotCi0gICAgcHVibGljIGRvdWJsZSBnZXRBdmVyYWdlSW5kZXhJbnRlcnZhbCgpCi0gICAgewotICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IHNzdGFibGVzID0gZ2V0QWxsU1NUYWJsZXMoKTsKLSAgICAgICAgZG91YmxlIHRvdGFsID0gMC4wOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzKQotICAgICAgICAgICAgdG90YWwgKz0gc3N0YWJsZS5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCk7Ci0gICAgICAgIHJldHVybiB0b3RhbCAvIHNzdGFibGVzLnNpemUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZW1vcnlQb29sQ2FwYWNpdHlJbk1CKGxvbmcgbWVtb3J5UG9vbENhcGFjaXR5SW5NQikKLSAgICB7Ci0gICAgICAgIHRoaXMubWVtb3J5UG9vbEJ5dGVzID0gbWVtb3J5UG9vbENhcGFjaXR5SW5NQiAqIDEwMjRMICogMTAyNEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0dWFsIHNwYWNlIGNvbnN1bWVkIGJ5IGluZGV4IHN1bW1hcmllcyBmb3IgYWxsIHNzdGFibGVzLgotICAgICAqIEByZXR1cm4gc3BhY2UgY3VycmVudGx5IHVzZWQgaW4gTUIKLSAgICAgKi8KLSAgICBwdWJsaWMgZG91YmxlIGdldE1lbW9yeVBvb2xTaXplSW5NQigpCi0gICAgewotICAgICAgICBsb25nIHRvdGFsID0gMDsKLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBnZXRBbGxTU1RhYmxlcygpKQotICAgICAgICAgICAgdG90YWwgKz0gc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlPZmZIZWFwU2l6ZSgpOwotICAgICAgICByZXR1cm4gdG90YWwgLyAxMDI0LjAgLyAxMDI0LjA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PFNTVGFibGVSZWFkZXI+IGdldEFsbFNTVGFibGVzKCkKLSAgICB7Ci0gICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGZvciAoS2V5c3BhY2Uga3MgOiBLZXlzcGFjZS5hbGwoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChDb2x1bW5GYW1pbHlTdG9yZSBjZlN0b3JlOiBrcy5nZXRDb2x1bW5GYW1pbHlTdG9yZXMoKSkKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKGNmU3RvcmUuZ2V0TGl2ZVNTVGFibGVzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXJrcyB0aGUgbm9uLWNvbXBhY3Rpbmcgc3N0YWJsZXMgYXMgY29tcGFjdGluZyBmb3IgaW5kZXggc3VtbWFyeSByZWRpc3RyaWJ1dGlvbiBmb3IgYWxsIGtleXNwYWNlcy90YWJsZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFBhaXIgY29udGFpbmluZzoKLSAgICAgKiAgICAgICAgICBsZWZ0OiB0b3RhbCBzaXplIG9mIHRoZSBvZmYgaGVhcCBpbmRleCBzdW1tYXJpZXMgZm9yIHRoZSBzc3RhYmxlcyB3ZSB3ZXJlIHVuYWJsZSB0byBtYXJrIGNvbXBhY3RpbmcgKHRoZXkgd2VyZSBpbnZvbHZlZCBpbiBvdGhlciBjb21wYWN0aW9ucykKLSAgICAgKiAgICAgICAgICByaWdodDogdGhlIHRyYW5zYWN0aW9ucywga2V5ZWQgYnkgdGFibGUgaWQuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKLSAgICBwcml2YXRlIFBhaXI8TG9uZywgTWFwPFRhYmxlSWQsIExpZmVjeWNsZVRyYW5zYWN0aW9uPj4gZ2V0UmVzdHJpYnV0aW9uVHJhbnNhY3Rpb25zKCkKLSAgICB7Ci0gICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gYWxsQ29tcGFjdGluZyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBNYXA8VGFibGVJZCwgTGlmZWN5Y2xlVHJhbnNhY3Rpb24+IGFsbE5vbkNvbXBhY3RpbmcgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIGZvciAoS2V5c3BhY2Uga3MgOiBLZXlzcGFjZS5hbGwoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChDb2x1bW5GYW1pbHlTdG9yZSBjZlN0b3JlOiBrcy5nZXRDb2x1bW5GYW1pbHlTdG9yZXMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXQ8U1NUYWJsZVJlYWRlcj4gbm9uQ29tcGFjdGluZywgYWxsU1NUYWJsZXM7Ci0gICAgICAgICAgICAgICAgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuOwotICAgICAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBWaWV3IHZpZXcgPSBjZlN0b3JlLmdldFRyYWNrZXIoKS5nZXRWaWV3KCk7Ci0gICAgICAgICAgICAgICAgICAgIGFsbFNTVGFibGVzID0gSW1tdXRhYmxlU2V0LmNvcHlPZih2aWV3LnNlbGVjdChTU1RhYmxlU2V0LkNBTk9OSUNBTCkpOwotICAgICAgICAgICAgICAgICAgICBub25Db21wYWN0aW5nID0gSW1tdXRhYmxlU2V0LmNvcHlPZih2aWV3LmdldFVuY29tcGFjdGluZyhhbGxTU1RhYmxlcykpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3aGlsZSAobnVsbCA9PSAodHhuID0gY2ZTdG9yZS5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KG5vbkNvbXBhY3RpbmcsIE9wZXJhdGlvblR5cGUuSU5ERVhfU1VNTUFSWSkpKTsKLQotICAgICAgICAgICAgICAgIGFsbE5vbkNvbXBhY3RpbmcucHV0KGNmU3RvcmUubWV0YWRhdGEuaWQsIHR4bik7Ci0gICAgICAgICAgICAgICAgYWxsQ29tcGFjdGluZy5hZGRBbGwoU2V0cy5kaWZmZXJlbmNlKGFsbFNTVGFibGVzLCBub25Db21wYWN0aW5nKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyBub25SZWRpc3RyaWJ1dGluZ09mZkhlYXBTaXplID0gYWxsQ29tcGFjdGluZy5zdHJlYW0oKS5tYXBUb0xvbmcoU1NUYWJsZVJlYWRlcjo6Z2V0SW5kZXhTdW1tYXJ5T2ZmSGVhcFNpemUpLnN1bSgpOwotICAgICAgICByZXR1cm4gUGFpci5jcmVhdGUobm9uUmVkaXN0cmlidXRpbmdPZmZIZWFwU2l6ZSwgYWxsTm9uQ29tcGFjdGluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVkaXN0cmlidXRlU3VtbWFyaWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuaXNHbG9iYWxDb21wYWN0aW9uUGF1c2VkKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIFBhaXI8TG9uZywgTWFwPFRhYmxlSWQsIExpZmVjeWNsZVRyYW5zYWN0aW9uPj4gcmVkaXN0cmlidXRpb25UcmFuc2FjdGlvbkluZm8gPSBnZXRSZXN0cmlidXRpb25UcmFuc2FjdGlvbnMoKTsKLSAgICAgICAgTWFwPFRhYmxlSWQsIExpZmVjeWNsZVRyYW5zYWN0aW9uPiB0cmFuc2FjdGlvbnMgPSByZWRpc3RyaWJ1dGlvblRyYW5zYWN0aW9uSW5mby5yaWdodDsKLSAgICAgICAgbG9uZyBub25SZWRpc3RyaWJ1dGluZ09mZkhlYXBTaXplID0gcmVkaXN0cmlidXRpb25UcmFuc2FjdGlvbkluZm8ubGVmdDsKLSAgICAgICAgdHJ5IChUaW1lci5Db250ZXh0IGN0eCA9IENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmdldE1ldHJpY3MoKS5pbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvblRpbWUudGltZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWRpc3RyaWJ1dGVTdW1tYXJpZXMobmV3IEluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uKHRyYW5zYWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uUmVkaXN0cmlidXRpbmdPZmZIZWFwU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW1vcnlQb29sQnl0ZXMpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgQ29tcGFjdGlvbkludGVycnVwdGVkRXhjZXB0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJJbmRleCBzdW1tYXJ5IGludGVycnVwdGVkOiB7fSIsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkdvdCBleGNlcHRpb24gZHVyaW5nIGluZGV4IHN1bW1hcnkgcmVkaXN0cmlidXRpb24iLCBlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRkJVdGlsaXRpZXMuY2xvc2VBbGwodHJhbnNhY3Rpb25zLnZhbHVlcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF0dGVtcHRzIHRvIGZhaXJseSBkaXN0cmlidXRlIGEgZml4ZWQgcG9vbCBvZiBtZW1vcnkgZm9yIGluZGV4IHN1bW1hcmllcyBhY3Jvc3MgYSBzZXQgb2YgU1NUYWJsZXMgYmFzZWQgb24KLSAgICAgKiB0aGVpciByZWNlbnQgcmVhZCByYXRlcy4KLSAgICAgKiBAcGFyYW0gcmVkaXN0cmlidXRpb24gZW5jYXBzdWxhdGluZyB0aGUgdHJhbnNhY3Rpb25zIGNvbnRhaW5pbmcgdGhlIHNzdGFibGVzIHdlIGFyZSB0byByZWRpc3RyaWJ1dGUgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBwb29sIGFjcm9zcyBhbmQgYSBzaXplIChpbiBieXRlcykgdGhhdCB0aGUgdG90YWwgaW5kZXggc3VtbWFyeSBzcGFjZSB1c2FnZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgc3RheSBjbG9zZSB0byBvciB1bmRlciwgaWYgcG9zc2libGUKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBuZXcgU1NUYWJsZVJlYWRlciBpbnN0YW5jZXMKLSAgICAgKi8KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8U1NUYWJsZVJlYWRlcj4gcmVkaXN0cmlidXRlU3VtbWFyaWVzKEluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uIHJlZGlzdHJpYnV0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5ydW5JbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvbihyZWRpc3RyaWJ1dGlvbik7Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgcHVibGljIHZvaWQgc2h1dGRvd25BbmRXYWl0KGxvbmcgdGltZW91dCwgVGltZVVuaXQgdW5pdCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoZnV0dXJlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZ1dHVyZS5jYW5jZWwoZmFsc2UpOwotICAgICAgICAgICAgZnV0dXJlID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBFeGVjdXRvclV0aWxzLnNodXRkb3duQW5kV2FpdCh0aW1lb3V0LCB1bml0LCBleGVjdXRvcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JbmRleFN1bW1hcnlNYW5hZ2VyTUJlYW4uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSW5kZXhTdW1tYXJ5TWFuYWdlck1CZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYTNkNDAuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JbmRleFN1bW1hcnlNYW5hZ2VyTUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSW5kZXhTdW1tYXJ5TWFuYWdlck1CZWFuCi17Ci0gICAgcHVibGljIGxvbmcgZ2V0TWVtb3J5UG9vbENhcGFjaXR5SW5NQigpOwotICAgIHB1YmxpYyB2b2lkIHNldE1lbW9yeVBvb2xDYXBhY2l0eUluTUIobG9uZyBtZW1vcnlQb29sQ2FwYWNpdHlJbk1CKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgYWN0dWFsIG9mZi1oZWFwIG1lbW9yeSB1c2FnZSBvZiB0aGUgaW5kZXggc3VtbWFyaWVzIGZvciBhbGwgbm9uLWNvbXBhY3Rpbmcgc3N0YWJsZXMuCi0gICAgICogQHJldHVybiBUaGUgYW1vdW50IG9mIG1lbW9yeSB1c2VkIGluIE1pQi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZG91YmxlIGdldE1lbW9yeVBvb2xTaXplSW5NQigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG1hcCBvZiBTU1RhYmxlIGZpbGVuYW1lcyB0byB0aGVpciBjdXJyZW50IGVmZmVjdGl2ZSBpbmRleCBpbnRlcnZhbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgSW50ZWdlcj4gZ2V0SW5kZXhJbnRlcnZhbHMoKTsKLQotICAgIHB1YmxpYyBkb3VibGUgZ2V0QXZlcmFnZUluZGV4SW50ZXJ2YWwoKTsKLQotICAgIHB1YmxpYyB2b2lkIHJlZGlzdHJpYnV0ZVN1bW1hcmllcygpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyBpbnQgZ2V0UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoKTsKLQotICAgIC8qKgotICAgICAqIFNldCByZXNpemVJbnRlcnZhbEluTWludXRlcyA9IC0xIGZvciBkaXNhYmxlZDsgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiBpbmRleF9zdW1tYXJ5X3Jlc2l6ZV9pbnRlcnZhbCBiZWluZwotICAgICAqIHNldCB0byBudWxsIGluIGNhc3NhbmRyYS55YW1sCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoaW50IHJlc2l6ZUludGVydmFsSW5NaW51dGVzKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJiZTcwOS4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0luZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7Ci0KLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkluZm8uVW5pdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlN0b3JhZ2VNZXRyaWNzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWZzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRG93bnNhbXBsaW5nLkJBU0VfU0FNUExJTkdfTEVWRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJRDsKLQotcHVibGljIGNsYXNzIEluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uIGV4dGVuZHMgQ29tcGFjdGlvbkluZm8uSG9sZGVyCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uLmNsYXNzKTsKLQotICAgIC8vIFRoZSB0YXJnZXQgKG9yIGlkZWFsKSBudW1iZXIgb2YgaW5kZXggc3VtbWFyeSBlbnRyaWVzIG11c3QgZGlmZmVyIGZyb20gdGhlIGFjdHVhbCBudW1iZXIgb2YKLSAgICAvLyBlbnRyaWVzIGJ5IHRoaXMgcmF0aW8gaW4gb3JkZXIgdG8gdHJpZ2dlciBhbiB1cHNhbXBsZSBvciBkb3duc2FtcGxlIG9mIHRoZSBzdW1tYXJ5LiAgQmVjYXVzZQotICAgIC8vIHVwc2FtcGxpbmcgcmVxdWlyZXMgcmVhZGluZyB0aGUgcHJpbWFyeSBpbmRleCBpbiBvcmRlciB0byByZWJ1aWxkIHRoZSBzdW1tYXJ5LCB0aGUgdGhyZXNob2xkCi0gICAgLy8gZm9yIHVwc2FtcGxpbmcgaXMgaXMgaGlnaGVyLgotICAgIHN0YXRpYyBmaW5hbCBkb3VibGUgVVBTQU1QTEVfVEhSRVNIT0xEID0gMS41OwotICAgIHN0YXRpYyBmaW5hbCBkb3VibGUgRE9XTlNBTVBMRV9USEVTSE9MRCA9IDAuNzU7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxUYWJsZUlkLCBMaWZlY3ljbGVUcmFuc2FjdGlvbj4gdHJhbnNhY3Rpb25zOwotICAgIHByaXZhdGUgZmluYWwgbG9uZyBub25SZWRpc3RyaWJ1dGluZ09mZkhlYXBTaXplOwotICAgIHByaXZhdGUgZmluYWwgbG9uZyBtZW1vcnlQb29sQnl0ZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUaW1lVVVJRCBjb21wYWN0aW9uSWQ7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBsb25nIHJlbWFpbmluZ1NwYWNlOwotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25zIHRoZSB0cmFuc2FjdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQga2V5c3BhY2VzL3RhYmxlcyB3ZSBhcmUgdG8gcmVkaXN0cmlidXRlCi0gICAgICogQHBhcmFtIG5vblJlZGlzdHJpYnV0aW5nT2ZmSGVhcFNpemUgdGhlIHRvdGFsIGluZGV4IHN1bW1hcnkgb2ZmIGhlYXAgc2l6ZSBmb3IgYWxsIHNzdGFibGVzIHdlIHdlcmUgbm90IGFibGUgdG8gbWFyayBjb21wYWN0aW5nIChkdWUgdG8gdGhlbSBiZWluZyBpbnZvbHZlZCBpbiBvdGhlciBjb21wYWN0aW9ucykKLSAgICAgKiBAcGFyYW0gbWVtb3J5UG9vbEJ5dGVzIHNpemUgb2YgdGhlIG1lbW9yeSBwb29sCi0gICAgICovCi0gICAgcHVibGljIEluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uKE1hcDxUYWJsZUlkLCBMaWZlY3ljbGVUcmFuc2FjdGlvbj4gdHJhbnNhY3Rpb25zLCBsb25nIG5vblJlZGlzdHJpYnV0aW5nT2ZmSGVhcFNpemUsIGxvbmcgbWVtb3J5UG9vbEJ5dGVzKQotICAgIHsKLSAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMgPSB0cmFuc2FjdGlvbnM7Ci0gICAgICAgIHRoaXMubm9uUmVkaXN0cmlidXRpbmdPZmZIZWFwU2l6ZSA9IG5vblJlZGlzdHJpYnV0aW5nT2ZmSGVhcFNpemU7Ci0gICAgICAgIHRoaXMubWVtb3J5UG9vbEJ5dGVzID0gbWVtb3J5UG9vbEJ5dGVzOwotICAgICAgICB0aGlzLmNvbXBhY3Rpb25JZCA9IG5leHRUaW1lVVVJRCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFNTVGFibGVSZWFkZXI+IHJlZGlzdHJpYnV0ZVN1bW1hcmllcygpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbG9uZyBzdGFydCA9IG5hbm9UaW1lKCk7Ci0gICAgICAgIGxvZ2dlci5pbmZvKCJSZWRpc3RyaWJ1dGluZyBpbmRleCBzdW1tYXJpZXMiKTsKLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiByZWRpc3RyaWJ1dGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZm9yIChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gOiB0cmFuc2FjdGlvbnMudmFsdWVzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlZGlzdHJpYnV0ZS5hZGRBbGwodHhuLm9yaWdpbmFscygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgdG90YWwgPSBub25SZWRpc3RyaWJ1dGluZ09mZkhlYXBTaXplOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHJlZGlzdHJpYnV0ZSkKLSAgICAgICAgICAgIHRvdGFsICs9IHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5T2ZmSGVhcFNpemUoKTsKLQotICAgICAgICBsb2dnZXIuaW5mbygiQmVnaW5uaW5nIHJlZGlzdHJpYnV0aW9uIG9mIGluZGV4IHN1bW1hcmllcyBmb3Ige30gc3N0YWJsZXMgd2l0aCBtZW1vcnkgcG9vbCBzaXplIHt9IE1pQjsgY3VycmVudCBzcGFjZWQgdXNlZCBpcyB7fSBNaUIiLAotICAgICAgICAgICAgICAgICAgICAgcmVkaXN0cmlidXRlLnNpemUoKSwgbWVtb3J5UG9vbEJ5dGVzIC8gMTAyNEwgLyAxMDI0TCwgdG90YWwgLyAxMDI0LjAgLyAxMDI0LjApOwotCi0gICAgICAgIGZpbmFsIE1hcDxTU1RhYmxlUmVhZGVyLCBEb3VibGU+IHJlYWRSYXRlcyA9IG5ldyBIYXNoTWFwPD4ocmVkaXN0cmlidXRlLnNpemUoKSk7Ci0gICAgICAgIGRvdWJsZSB0b3RhbFJlYWRzUGVyU2VjID0gMC4wOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHJlZGlzdHJpYnV0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlzU3RvcFJlcXVlc3RlZCgpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb24oZ2V0Q29tcGFjdGlvbkluZm8oKSk7Ci0KLSAgICAgICAgICAgIGlmIChzc3RhYmxlLmdldFJlYWRNZXRlcigpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRG91YmxlIHJlYWRSYXRlID0gc3N0YWJsZS5nZXRSZWFkTWV0ZXIoKS5maWZ0ZWVuTWludXRlUmF0ZSgpOwotICAgICAgICAgICAgICAgIHRvdGFsUmVhZHNQZXJTZWMgKz0gcmVhZFJhdGU7Ci0gICAgICAgICAgICAgICAgcmVhZFJhdGVzLnB1dChzc3RhYmxlLCByZWFkUmF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbG9nZ2VyLnRyYWNlKCJUb3RhbCByZWFkcy9zZWMgYWNyb3NzIGFsbCBzc3RhYmxlcyBpbiBpbmRleCBzdW1tYXJ5IHJlc2l6ZSBwcm9jZXNzOiB7fSIsIHRvdGFsUmVhZHNQZXJTZWMpOwotCi0gICAgICAgIC8vIGNvcHkgYW5kIHNvcnQgYnkgcmVhZCByYXRlcyAoYXNjZW5kaW5nKQotICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IHNzdGFibGVzQnlIb3RuZXNzID0gbmV3IEFycmF5TGlzdDw+KHJlZGlzdHJpYnV0ZSk7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoc3N0YWJsZXNCeUhvdG5lc3MsIG5ldyBSZWFkUmF0ZUNvbXBhcmF0b3IocmVhZFJhdGVzKSk7Ci0KLSAgICAgICAgbG9uZyByZW1haW5pbmdCeXRlcyA9IG1lbW9yeVBvb2xCeXRlcyAtIG5vblJlZGlzdHJpYnV0aW5nT2ZmSGVhcFNpemU7Ci0KLSAgICAgICAgbG9nZ2VyLnRyYWNlKCJJbmRleCBzdW1tYXJpZXMgZm9yIGNvbXBhY3RpbmcgU1NUYWJsZXMgYXJlIHVzaW5nIHt9IE1pQiBvZiBzcGFjZSIsCi0gICAgICAgICAgICAgICAgICAgICAobWVtb3J5UG9vbEJ5dGVzIC0gcmVtYWluaW5nQnl0ZXMpIC8gMTAyNC4wIC8gMTAyNC4wKTsKLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBuZXdTU1RhYmxlczsKLSAgICAgICAgdHJ5IChSZWZzPFNTVGFibGVSZWFkZXI+IHJlZnMgPSBSZWZzLnJlZihzc3RhYmxlc0J5SG90bmVzcykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5ld1NTVGFibGVzID0gYWRqdXN0U2FtcGxpbmdMZXZlbHMoc3N0YWJsZXNCeUhvdG5lc3MsIHRyYW5zYWN0aW9ucywgdG90YWxSZWFkc1BlclNlYywgcmVtYWluaW5nQnl0ZXMpOwotCi0gICAgICAgICAgICBmb3IgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA6IHRyYW5zYWN0aW9ucy52YWx1ZXMoKSkKLSAgICAgICAgICAgICAgICB0eG4uZmluaXNoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdG90YWwgPSBub25SZWRpc3RyaWJ1dGluZ09mZkhlYXBTaXplOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IG5ld1NTVGFibGVzKQotICAgICAgICAgICAgdG90YWwgKz0gc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlPZmZIZWFwU2l6ZSgpOwotCi0gICAgICAgIGxvZ2dlci5pbmZvKCJDb21wbGV0ZWQgcmVzaXppbmcgb2YgaW5kZXggc3VtbWFyaWVzOyBjdXJyZW50IGFwcHJveGltYXRlIG1lbW9yeSB1c2VkOiB7fSBNaUIsIHRpbWUgc3BlbnQ6IHt9bXMiLAotICAgICAgICAgICAgICAgICAgICB0b3RhbCAvIDEwMjQuMCAvIDEwMjQuMCwgVGltZVVuaXQuTkFOT1NFQ09ORFMudG9NaWxsaXMobmFub1RpbWUoKSAtIHN0YXJ0KSk7Ci0KLSAgICAgICAgcmV0dXJuIG5ld1NTVGFibGVzOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdDxTU1RhYmxlUmVhZGVyPiBhZGp1c3RTYW1wbGluZ0xldmVscyhMaXN0PFNTVGFibGVSZWFkZXI+IHNzdGFibGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8VGFibGVJZCwgTGlmZWN5Y2xlVHJhbnNhY3Rpb24+IHRyYW5zYWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRvdGFsUmVhZHNQZXJTZWMsIGxvbmcgbWVtb3J5UG9vbENhcGFjaXR5KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIExpc3Q8UmVzYW1wbGVFbnRyeT4gdG9Eb3duc2FtcGxlID0gbmV3IEFycmF5TGlzdDw+KHNzdGFibGVzLnNpemUoKSAvIDQpOwotICAgICAgICBMaXN0PFJlc2FtcGxlRW50cnk+IHRvVXBzYW1wbGUgPSBuZXcgQXJyYXlMaXN0PD4oc3N0YWJsZXMuc2l6ZSgpIC8gNCk7Ci0gICAgICAgIExpc3Q8UmVzYW1wbGVFbnRyeT4gZm9yY2VSZXNhbXBsZSA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBMaXN0PFJlc2FtcGxlRW50cnk+IGZvcmNlVXBzYW1wbGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBuZXdTU1RhYmxlcyA9IG5ldyBBcnJheUxpc3Q8Pihzc3RhYmxlcy5zaXplKCkpOwotCi0gICAgICAgIC8vIEdvaW5nIGZyb20gdGhlIGNvbGRlc3QgdG8gdGhlIGhvdHRlc3Qgc3N0YWJsZXMsIHRyeSB0byBnaXZlIGVhY2ggc3N0YWJsZSBhbiBhbW91bnQgb2Ygc3BhY2UgcHJvcG9ydGlvbmFsCi0gICAgICAgIC8vIHRvIHRoZSBudW1iZXIgb2YgdG90YWwgcmVhZHMvc2VjIGl0IGhhbmRsZXMuCi0gICAgICAgIHJlbWFpbmluZ1NwYWNlID0gbWVtb3J5UG9vbENhcGFjaXR5OwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaXNTdG9wUmVxdWVzdGVkKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbXBhY3Rpb25JbnRlcnJ1cHRlZEV4Y2VwdGlvbihnZXRDb21wYWN0aW9uSW5mbygpKTsKLQotICAgICAgICAgICAgaW50IG1pbkluZGV4SW50ZXJ2YWwgPSBzc3RhYmxlLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWw7Ci0gICAgICAgICAgICBpbnQgbWF4SW5kZXhJbnRlcnZhbCA9IHNzdGFibGUubWV0YWRhdGEoKS5wYXJhbXMubWF4SW5kZXhJbnRlcnZhbDsKLQotICAgICAgICAgICAgZG91YmxlIHJlYWRzUGVyU2VjID0gc3N0YWJsZS5nZXRSZWFkTWV0ZXIoKSA9PSBudWxsID8gMC4wIDogc3N0YWJsZS5nZXRSZWFkTWV0ZXIoKS5maWZ0ZWVuTWludXRlUmF0ZSgpOwotICAgICAgICAgICAgbG9uZyBpZGVhbFNwYWNlID0gTWF0aC5yb3VuZChyZW1haW5pbmdTcGFjZSAqIChyZWFkc1BlclNlYyAvIHRvdGFsUmVhZHNQZXJTZWMpKTsKLQotICAgICAgICAgICAgLy8gZmlndXJlIG91dCBob3cgbWFueSBlbnRyaWVzIG91ciBpZGVhbFNwYWNlIHdvdWxkIGJ1eSB1cywgYW5kIHBpY2sgYSBuZXcgc2FtcGxpbmcgbGV2ZWwgYmFzZWQgb24gdGhhdAotICAgICAgICAgICAgaW50IGN1cnJlbnROdW1FbnRyaWVzID0gc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTaXplKCk7Ci0gICAgICAgICAgICBkb3VibGUgYXZnRW50cnlTaXplID0gc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlPZmZIZWFwU2l6ZSgpIC8gKGRvdWJsZSkgY3VycmVudE51bUVudHJpZXM7Ci0gICAgICAgICAgICBsb25nIHRhcmdldE51bUVudHJpZXMgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGlkZWFsU3BhY2UgLyBhdmdFbnRyeVNpemUpKTsKLSAgICAgICAgICAgIGludCBjdXJyZW50U2FtcGxpbmdMZXZlbCA9IHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5U2FtcGxpbmdMZXZlbCgpOwotICAgICAgICAgICAgaW50IG1heFN1bW1hcnlTaXplID0gc3N0YWJsZS5nZXRNYXhJbmRleFN1bW1hcnlTaXplKCk7Ci0KLSAgICAgICAgICAgIC8vIGlmIHRoZSBtaW5faW5kZXhfaW50ZXJ2YWwgY2hhbmdlZCwgY2FsY3VsYXRlIHdoYXQgb3VyIGN1cnJlbnQgc2FtcGxpbmcgbGV2ZWwgd291bGQgYmUgdW5kZXIgdGhlIG5ldyBtaW4KLSAgICAgICAgICAgIGlmIChzc3RhYmxlLmdldE1pbkluZGV4SW50ZXJ2YWwoKSAhPSBtaW5JbmRleEludGVydmFsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBlZmZlY3RpdmVTYW1wbGluZ0xldmVsID0gKGludCkgTWF0aC5yb3VuZChjdXJyZW50U2FtcGxpbmdMZXZlbCAqIChtaW5JbmRleEludGVydmFsIC8gKGRvdWJsZSkgc3N0YWJsZS5nZXRNaW5JbmRleEludGVydmFsKCkpKTsKLSAgICAgICAgICAgICAgICBtYXhTdW1tYXJ5U2l6ZSA9IChpbnQpIE1hdGgucm91bmQobWF4U3VtbWFyeVNpemUgKiAoc3N0YWJsZS5nZXRNaW5JbmRleEludGVydmFsKCkgLyAoZG91YmxlKSBtaW5JbmRleEludGVydmFsKSk7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJtaW5faW5kZXhfaW50ZXJ2YWwgY2hhbmdlZCBmcm9tIHt9IHRvIHt9LCBzbyB0aGUgY3VycmVudCBzYW1wbGluZyBsZXZlbCBmb3Ige30gaXMgZWZmZWN0aXZlbHkgbm93IHt9ICh3YXMge30pIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5nZXRNaW5JbmRleEludGVydmFsKCksIG1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUsIGVmZmVjdGl2ZVNhbXBsaW5nTGV2ZWwsIGN1cnJlbnRTYW1wbGluZ0xldmVsKTsKLSAgICAgICAgICAgICAgICBjdXJyZW50U2FtcGxpbmdMZXZlbCA9IGVmZmVjdGl2ZVNhbXBsaW5nTGV2ZWw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBuZXdTYW1wbGluZ0xldmVsID0gSW5kZXhTdW1tYXJ5QnVpbGRlci5jYWxjdWxhdGVTYW1wbGluZ0xldmVsKGN1cnJlbnRTYW1wbGluZ0xldmVsLCBjdXJyZW50TnVtRW50cmllcywgdGFyZ2V0TnVtRW50cmllcywKLSAgICAgICAgICAgICAgICAgICAgbWluSW5kZXhJbnRlcnZhbCwgbWF4SW5kZXhJbnRlcnZhbCk7Ci0gICAgICAgICAgICBpbnQgbnVtRW50cmllc0F0TmV3U2FtcGxpbmdMZXZlbCA9IEluZGV4U3VtbWFyeUJ1aWxkZXIuZW50cmllc0F0U2FtcGxpbmdMZXZlbChuZXdTYW1wbGluZ0xldmVsLCBtYXhTdW1tYXJ5U2l6ZSk7Ci0gICAgICAgICAgICBkb3VibGUgZWZmZWN0aXZlSW5kZXhJbnRlcnZhbCA9IHNzdGFibGUuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbCgpOwotCi0gICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJ7fSBoYXMge30gcmVhZHMvc2VjOyBpZGVhbCBzcGFjZSBmb3IgaW5kZXggc3VtbWFyeToge30gKHt9IGVudHJpZXMpOyBjb25zaWRlcmluZyBtb3ZpbmcgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcm9tIGxldmVsIHt9ICh7fSBlbnRyaWVzLCB7fSkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byBsZXZlbCB7fSAoe30gZW50cmllcywge30pIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5nZXRGaWxlbmFtZSgpLCByZWFkc1BlclNlYywgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoaWRlYWxTcGFjZSksIHRhcmdldE51bUVudHJpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTYW1wbGluZ0xldmVsLCBjdXJyZW50TnVtRW50cmllcywgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoKGxvbmcpIChjdXJyZW50TnVtRW50cmllcyAqIGF2Z0VudHJ5U2l6ZSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTYW1wbGluZ0xldmVsLCBudW1FbnRyaWVzQXROZXdTYW1wbGluZ0xldmVsLCBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeSgobG9uZykgKG51bUVudHJpZXNBdE5ld1NhbXBsaW5nTGV2ZWwgKiBhdmdFbnRyeVNpemUpKSk7Ci0KLSAgICAgICAgICAgIGlmIChlZmZlY3RpdmVJbmRleEludGVydmFsIDwgbWluSW5kZXhJbnRlcnZhbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgbWluX2luZGV4X2ludGVydmFsIHdhcyBjaGFuZ2VkOyByZS1zYW1wbGUgdG8gbWF0Y2ggaXQuCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJGb3JjaW5nIHJlc2FtcGxlIG9mIHt9IGJlY2F1c2UgdGhlIGN1cnJlbnQgaW5kZXggaW50ZXJ2YWwgKHt9KSBpcyBiZWxvdyBtaW5faW5kZXhfaW50ZXJ2YWwgKHt9KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLCBlZmZlY3RpdmVJbmRleEludGVydmFsLCBtaW5JbmRleEludGVydmFsKTsKLSAgICAgICAgICAgICAgICBsb25nIHNwYWNlVXNlZCA9IChsb25nKSBNYXRoLmNlaWwoYXZnRW50cnlTaXplICogbnVtRW50cmllc0F0TmV3U2FtcGxpbmdMZXZlbCk7Ci0gICAgICAgICAgICAgICAgZm9yY2VSZXNhbXBsZS5hZGQobmV3IFJlc2FtcGxlRW50cnkoc3N0YWJsZSwgc3BhY2VVc2VkLCBuZXdTYW1wbGluZ0xldmVsKSk7Ci0gICAgICAgICAgICAgICAgcmVtYWluaW5nU3BhY2UgLT0gc3BhY2VVc2VkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoZWZmZWN0aXZlSW5kZXhJbnRlcnZhbCA+IG1heEluZGV4SW50ZXJ2YWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIG1heF9pbmRleF9pbnRlcnZhbCB3YXMgbG93ZXJlZDsgZm9yY2UgYW4gdXBzYW1wbGUgdG8gdGhlIGVmZmVjdGl2ZSBtaW5pbXVtIHNhbXBsaW5nIGxldmVsCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJGb3JjaW5nIHVwc2FtcGxlIG9mIHt9IGJlY2F1c2UgdGhlIGN1cnJlbnQgaW5kZXggaW50ZXJ2YWwgKHt9KSBpcyBhYm92ZSBtYXhfaW5kZXhfaW50ZXJ2YWwgKHt9KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLCBlZmZlY3RpdmVJbmRleEludGVydmFsLCBtYXhJbmRleEludGVydmFsKTsKLSAgICAgICAgICAgICAgICBuZXdTYW1wbGluZ0xldmVsID0gTWF0aC5tYXgoMSwgKEJBU0VfU0FNUExJTkdfTEVWRUwgKiBtaW5JbmRleEludGVydmFsKSAvIG1heEluZGV4SW50ZXJ2YWwpOwotICAgICAgICAgICAgICAgIG51bUVudHJpZXNBdE5ld1NhbXBsaW5nTGV2ZWwgPSBJbmRleFN1bW1hcnlCdWlsZGVyLmVudHJpZXNBdFNhbXBsaW5nTGV2ZWwobmV3U2FtcGxpbmdMZXZlbCwgc3N0YWJsZS5nZXRNYXhJbmRleFN1bW1hcnlTaXplKCkpOwotICAgICAgICAgICAgICAgIGxvbmcgc3BhY2VVc2VkID0gKGxvbmcpIE1hdGguY2VpbChhdmdFbnRyeVNpemUgKiBudW1FbnRyaWVzQXROZXdTYW1wbGluZ0xldmVsKTsKLSAgICAgICAgICAgICAgICBmb3JjZVVwc2FtcGxlLmFkZChuZXcgUmVzYW1wbGVFbnRyeShzc3RhYmxlLCBzcGFjZVVzZWQsIG5ld1NhbXBsaW5nTGV2ZWwpKTsKLSAgICAgICAgICAgICAgICByZW1haW5pbmdTcGFjZSAtPSBhdmdFbnRyeVNpemUgKiBudW1FbnRyaWVzQXROZXdTYW1wbGluZ0xldmVsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodGFyZ2V0TnVtRW50cmllcyA+PSBjdXJyZW50TnVtRW50cmllcyAqIFVQU0FNUExFX1RIUkVTSE9MRCAmJiBuZXdTYW1wbGluZ0xldmVsID4gY3VycmVudFNhbXBsaW5nTGV2ZWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZyBzcGFjZVVzZWQgPSAobG9uZykgTWF0aC5jZWlsKGF2Z0VudHJ5U2l6ZSAqIG51bUVudHJpZXNBdE5ld1NhbXBsaW5nTGV2ZWwpOwotICAgICAgICAgICAgICAgIHRvVXBzYW1wbGUuYWRkKG5ldyBSZXNhbXBsZUVudHJ5KHNzdGFibGUsIHNwYWNlVXNlZCwgbmV3U2FtcGxpbmdMZXZlbCkpOwotICAgICAgICAgICAgICAgIHJlbWFpbmluZ1NwYWNlIC09IGF2Z0VudHJ5U2l6ZSAqIG51bUVudHJpZXNBdE5ld1NhbXBsaW5nTGV2ZWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0YXJnZXROdW1FbnRyaWVzIDwgY3VycmVudE51bUVudHJpZXMgKiBET1dOU0FNUExFX1RIRVNIT0xEICYmIG5ld1NhbXBsaW5nTGV2ZWwgPCBjdXJyZW50U2FtcGxpbmdMZXZlbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25nIHNwYWNlVXNlZCA9IChsb25nKSBNYXRoLmNlaWwoYXZnRW50cnlTaXplICogbnVtRW50cmllc0F0TmV3U2FtcGxpbmdMZXZlbCk7Ci0gICAgICAgICAgICAgICAgdG9Eb3duc2FtcGxlLmFkZChuZXcgUmVzYW1wbGVFbnRyeShzc3RhYmxlLCBzcGFjZVVzZWQsIG5ld1NhbXBsaW5nTGV2ZWwpKTsKLSAgICAgICAgICAgICAgICByZW1haW5pbmdTcGFjZSAtPSBzcGFjZVVzZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8ga2VlcCB0aGUgc2FtZSBzYW1wbGluZyBsZXZlbAotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiU1NUYWJsZSB7fSBpcyB3aXRoaW4gdGhyZXNob2xkcyBvZiBpZGVhbCBzYW1wbGluZyIsIHNzdGFibGUpOwotICAgICAgICAgICAgICAgIHJlbWFpbmluZ1NwYWNlIC09IHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5T2ZmSGVhcFNpemUoKTsKLSAgICAgICAgICAgICAgICBuZXdTU1RhYmxlcy5hZGQoc3N0YWJsZSk7Ci0gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zLmdldChzc3RhYmxlLm1ldGFkYXRhKCkuaWQpLmNhbmNlbChzc3RhYmxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRvdGFsUmVhZHNQZXJTZWMgLT0gcmVhZHNQZXJTZWM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVtYWluaW5nU3BhY2UgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBQYWlyPExpc3Q8U1NUYWJsZVJlYWRlcj4sIExpc3Q8UmVzYW1wbGVFbnRyeT4+IHJlc3VsdCA9IGRpc3RyaWJ1dGVSZW1haW5pbmdTcGFjZSh0b0Rvd25zYW1wbGUsIHJlbWFpbmluZ1NwYWNlKTsKLSAgICAgICAgICAgIHRvRG93bnNhbXBsZSA9IHJlc3VsdC5yaWdodDsKLSAgICAgICAgICAgIG5ld1NTVGFibGVzLmFkZEFsbChyZXN1bHQubGVmdCk7Ci0gICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHJlc3VsdC5sZWZ0KQotICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9ucy5nZXQoc3N0YWJsZS5tZXRhZGF0YSgpLmlkKS5jYW5jZWwoc3N0YWJsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkb3duc2FtcGxlIGZpcnN0LCB0aGVuIHVwc2FtcGxlCi0gICAgICAgIGxvZ2dlci5pbmZvKCJpbmRleCBzdW1tYXJpZXM6IGRvd25zYW1wbGU6IHt9LCBmb3JjZSByZXNhbXBsZToge30sIHVwc2FtcGxlOiB7fSwgZm9yY2UgdXBzYW1wbGU6IHt9IiwgdG9Eb3duc2FtcGxlLnNpemUoKSwgZm9yY2VSZXNhbXBsZS5zaXplKCksIHRvVXBzYW1wbGUuc2l6ZSgpLCBmb3JjZVVwc2FtcGxlLnNpemUoKSk7Ci0gICAgICAgIHRvRG93bnNhbXBsZS5hZGRBbGwoZm9yY2VSZXNhbXBsZSk7Ci0gICAgICAgIHRvRG93bnNhbXBsZS5hZGRBbGwodG9VcHNhbXBsZSk7Ci0gICAgICAgIHRvRG93bnNhbXBsZS5hZGRBbGwoZm9yY2VVcHNhbXBsZSk7Ci0gICAgICAgIGZvciAoUmVzYW1wbGVFbnRyeSBlbnRyeSA6IHRvRG93bnNhbXBsZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlzU3RvcFJlcXVlc3RlZCgpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb24oZ2V0Q29tcGFjdGlvbkluZm8oKSk7Ci0KLSAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGVudHJ5LnNzdGFibGU7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoIlJlLXNhbXBsaW5nIGluZGV4IHN1bW1hcnkgZm9yIHt9IGZyb20ge30ve30gdG8ge30ve30gb2YgdGhlIG9yaWdpbmFsIG51bWJlciBvZiBlbnRyaWVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeVNhbXBsaW5nTGV2ZWwoKSwgRG93bnNhbXBsaW5nLkJBU0VfU0FNUExJTkdfTEVWRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkubmV3U2FtcGxpbmdMZXZlbCwgRG93bnNhbXBsaW5nLkJBU0VfU0FNUExJTkdfTEVWRUwpOwotICAgICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gS2V5c3BhY2Uub3Blbihzc3RhYmxlLm1ldGFkYXRhKCkua2V5c3BhY2UpLmdldENvbHVtbkZhbWlseVN0b3JlKHNzdGFibGUubWV0YWRhdGEoKS5pZCk7Ci0gICAgICAgICAgICBsb25nIG9sZFNpemUgPSBzc3RhYmxlLmJ5dGVzT25EaXNrKCk7Ci0gICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHJlcGxhY2VtZW50ID0gc3N0YWJsZS5jbG9uZVdpdGhOZXdTdW1tYXJ5U2FtcGxpbmdMZXZlbChjZnMsIGVudHJ5Lm5ld1NhbXBsaW5nTGV2ZWwpOwotICAgICAgICAgICAgbG9uZyBuZXdTaXplID0gcmVwbGFjZW1lbnQuYnl0ZXNPbkRpc2soKTsKLSAgICAgICAgICAgIG5ld1NTVGFibGVzLmFkZChyZXBsYWNlbWVudCk7Ci0gICAgICAgICAgICB0cmFuc2FjdGlvbnMuZ2V0KHNzdGFibGUubWV0YWRhdGEoKS5pZCkudXBkYXRlKHJlcGxhY2VtZW50LCB0cnVlKTsKLSAgICAgICAgICAgIGFkZEhvb2tzKGNmcywgdHJhbnNhY3Rpb25zLCBvbGRTaXplLCBuZXdTaXplKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXdTU1RhYmxlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgaG9va3MgdG8gY29ycmVjdGx5IHVwZGF0ZSB0aGUgc3RvcmFnZSBsb2FkIG1ldHJpY3Mgb25jZSB0aGUgdHJhbnNhY3Rpb24gaXMgY2xvc2VkL2Fib3J0ZWQKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBUcmFuc2FjdGlvbnMgYXJlIGNsb3NlZCBpbiBmaW5hbGx5IG91dHNpZGUgb2YgdGhpcyBtZXRob2QKLSAgICBwcml2YXRlIHZvaWQgYWRkSG9va3MoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBNYXA8VGFibGVJZCwgTGlmZWN5Y2xlVHJhbnNhY3Rpb24+IHRyYW5zYWN0aW9ucywgbG9uZyBvbGRTaXplLCBsb25nIG5ld1NpemUpCi0gICAgewotICAgICAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSB0cmFuc2FjdGlvbnMuZ2V0KGNmcy5tZXRhZGF0YS5pZCk7Ci0gICAgICAgIHR4bi5ydW5PbkNvbW1pdCgoKSAtPiB7Ci0gICAgICAgICAgICAvLyBUaGUgbmV3IHNpemUgd2lsbCBiZSBhZGRlZCBpbiBUcmFuc2FjdGlvbmFsLmNvbW1pdCgpIGFzIGFuIHVwZGF0ZWQgU1NUYWJsZSwgbW9yZSBkZXRhaWxzOiBDQVNTQU5EUkEtMTM3MzgKLSAgICAgICAgICAgIFN0b3JhZ2VNZXRyaWNzLmxvYWQuZGVjKG9sZFNpemUpOwotICAgICAgICAgICAgY2ZzLm1ldHJpYy5saXZlRGlza1NwYWNlVXNlZC5kZWMob2xkU2l6ZSk7Ci0gICAgICAgICAgICBjZnMubWV0cmljLnRvdGFsRGlza1NwYWNlVXNlZC5kZWMob2xkU2l6ZSk7Ci0gICAgICAgIH0pOwotICAgICAgICB0eG4ucnVuT25BYm9ydCgoKSAtPiB7Ci0gICAgICAgICAgICAvLyB0aGUgbG9jYWwgZGlzayB3YXMgbW9kaWZpZWQgYnV0IGJvb2sga2VlcGluZyBjb3VsZG4ndCBiZSBjb21taXRlZCwgYXBwbHkgdGhlIGRlbHRhCi0gICAgICAgICAgICBsb25nIGRlbHRhID0gb2xkU2l6ZSAtIG5ld1NpemU7IC8vIGlmIG5ldyBpcyBsYXJnZXIgdGhpcyB3aWxsIGJlIG5lZ2F0aXZlLCBzbyBkZWMgd2lsbCBiZWNvbWUgYSBpbmMKLSAgICAgICAgICAgIFN0b3JhZ2VNZXRyaWNzLmxvYWQuZGVjKGRlbHRhKTsKLSAgICAgICAgICAgIGNmcy5tZXRyaWMubGl2ZURpc2tTcGFjZVVzZWQuZGVjKGRlbHRhKTsKLSAgICAgICAgICAgIGNmcy5tZXRyaWMudG90YWxEaXNrU3BhY2VVc2VkLmRlYyhkZWx0YSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHN0YXRpYyBQYWlyPExpc3Q8U1NUYWJsZVJlYWRlcj4sIExpc3Q8UmVzYW1wbGVFbnRyeT4+IGRpc3RyaWJ1dGVSZW1haW5pbmdTcGFjZShMaXN0PFJlc2FtcGxlRW50cnk+IHRvRG93bnNhbXBsZSwgbG9uZyByZW1haW5pbmdTcGFjZSkKLSAgICB7Ci0gICAgICAgIC8vIHNvcnQgYnkgdGhlIGFtb3VudCBvZiBzcGFjZSByZWdhaW5lZCBieSBkb2luZyB0aGUgZG93bnNhbXBsZSBvcGVyYXRpb247IHdlIHdhbnQgdG8gdHJ5IHRvIGF2b2lkIG9wZXJhdGlvbnMKLSAgICAgICAgLy8gdGhhdCB3aWxsIG1ha2UgbGl0dGxlIGRpZmZlcmVuY2UuCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQodG9Eb3duc2FtcGxlLCBuZXcgQ29tcGFyYXRvcjxSZXNhbXBsZUVudHJ5PigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShSZXNhbXBsZUVudHJ5IG8xLCBSZXNhbXBsZUVudHJ5IG8yKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBEb3VibGUuY29tcGFyZShvMS5zc3RhYmxlLmdldEluZGV4U3VtbWFyeU9mZkhlYXBTaXplKCkgLSBvMS5uZXdTcGFjZVVzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8yLnNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5T2ZmSGVhcFNpemUoKSAtIG8yLm5ld1NwYWNlVXNlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGludCBub0Rvd25zYW1wbGVDdXRvZmYgPSAwOwotICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IHdpbGxOb3REb3duc2FtcGxlID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIHdoaWxlIChyZW1haW5pbmdTcGFjZSA+IDAgJiYgbm9Eb3duc2FtcGxlQ3V0b2ZmIDwgdG9Eb3duc2FtcGxlLnNpemUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgUmVzYW1wbGVFbnRyeSBlbnRyeSA9IHRvRG93bnNhbXBsZS5nZXQobm9Eb3duc2FtcGxlQ3V0b2ZmKTsKLQotICAgICAgICAgICAgbG9uZyBleHRyYVNwYWNlUmVxdWlyZWQgPSBlbnRyeS5zc3RhYmxlLmdldEluZGV4U3VtbWFyeU9mZkhlYXBTaXplKCkgLSBlbnRyeS5uZXdTcGFjZVVzZWQ7Ci0gICAgICAgICAgICAvLyBzZWUgaWYgd2UgaGF2ZSBlbm91Z2ggbGVmdG92ZXIgc3BhY2UgdG8ga2VlcCB0aGUgY3VycmVudCBzYW1wbGluZyBsZXZlbAotICAgICAgICAgICAgaWYgKGV4dHJhU3BhY2VSZXF1aXJlZCA8PSByZW1haW5pbmdTcGFjZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIlVzaW5nIGxlZnRvdmVyIHNwYWNlIHRvIGtlZXAge30gYXQgdGhlIGN1cnJlbnQgc2FtcGxpbmcgbGV2ZWwgKHt9KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnNzdGFibGUsIGVudHJ5LnNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5U2FtcGxpbmdMZXZlbCgpKTsKLSAgICAgICAgICAgICAgICB3aWxsTm90RG93bnNhbXBsZS5hZGQoZW50cnkuc3N0YWJsZSk7Ci0gICAgICAgICAgICAgICAgcmVtYWluaW5nU3BhY2UgLT0gZXh0cmFTcGFjZVJlcXVpcmVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBub0Rvd25zYW1wbGVDdXRvZmYrKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUGFpci5jcmVhdGUod2lsbE5vdERvd25zYW1wbGUsIHRvRG93bnNhbXBsZS5zdWJMaXN0KG5vRG93bnNhbXBsZUN1dG9mZiwgdG9Eb3duc2FtcGxlLnNpemUoKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21wYWN0aW9uSW5mbyBnZXRDb21wYWN0aW9uSW5mbygpCi0gICAgewotICAgICAgICByZXR1cm4gQ29tcGFjdGlvbkluZm8ud2l0aG91dFNTVGFibGVzKG51bGwsIE9wZXJhdGlvblR5cGUuSU5ERVhfU1VNTUFSWSwgKG1lbW9yeVBvb2xCeXRlcyAtIHJlbWFpbmluZ1NwYWNlKSwgbWVtb3J5UG9vbEJ5dGVzLCBVbml0LkJZVEVTLCBjb21wYWN0aW9uSWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKiBVdGlsaXR5IGNsYXNzIGZvciBzb3J0aW5nIHNzdGFibGVzIGJ5IHRoZWlyIHJlYWQgcmF0ZXMuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVhZFJhdGVDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxTU1RhYmxlUmVhZGVyPgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U1NUYWJsZVJlYWRlciwgRG91YmxlPiByZWFkUmF0ZXM7Ci0KLSAgICAgICAgUmVhZFJhdGVDb21wYXJhdG9yKE1hcDxTU1RhYmxlUmVhZGVyLCBEb3VibGU+IHJlYWRSYXRlcykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5yZWFkUmF0ZXMgPSByZWFkUmF0ZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKFNTVGFibGVSZWFkZXIgbzEsIFNTVGFibGVSZWFkZXIgbzIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERvdWJsZSByZWFkUmF0ZTEgPSByZWFkUmF0ZXMuZ2V0KG8xKTsKLSAgICAgICAgICAgIERvdWJsZSByZWFkUmF0ZTIgPSByZWFkUmF0ZXMuZ2V0KG8yKTsKLSAgICAgICAgICAgIGlmIChyZWFkUmF0ZTEgPT0gbnVsbCAmJiByZWFkUmF0ZTIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlYWRSYXRlMSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlYWRSYXRlMiA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBEb3VibGUuY29tcGFyZShyZWFkUmF0ZTEsIHJlYWRSYXRlMik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXNhbXBsZUVudHJ5Ci0gICAgewotICAgICAgICBwdWJsaWMgZmluYWwgU1NUYWJsZVJlYWRlciBzc3RhYmxlOwotICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyBuZXdTcGFjZVVzZWQ7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbmV3U2FtcGxpbmdMZXZlbDsKLQotICAgICAgICBSZXNhbXBsZUVudHJ5KFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgbG9uZyBuZXdTcGFjZVVzZWQsIGludCBuZXdTYW1wbGluZ0xldmVsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnNzdGFibGUgPSBzc3RhYmxlOwotICAgICAgICAgICAgdGhpcy5uZXdTcGFjZVVzZWQgPSBuZXdTcGFjZVVzZWQ7Ci0gICAgICAgICAgICB0aGlzLm5ld1NhbXBsaW5nTGV2ZWwgPSBuZXdTYW1wbGluZ0xldmVsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9LZXlJdGVyYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9LZXlJdGVyYXRvci5qYXZhCmluZGV4IGNlYWNmODcuLmRiZTUwMWYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvS2V5SXRlcmF0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0tleUl0ZXJhdG9yLmphdmEKQEAgLTE5LDEwMyArMTksNDggQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVhZFdyaXRlTG9jazsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd0luZGV4RW50cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmFuZG9tQWNjZXNzUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkFic3RyYWN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvc2VhYmxlSXRlcmF0b3I7CiAKIHB1YmxpYyBjbGFzcyBLZXlJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0SXRlcmF0b3I8RGVjb3JhdGVkS2V5PiBpbXBsZW1lbnRzIENsb3NlYWJsZUl0ZXJhdG9yPERlY29yYXRlZEtleT4KIHsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBjbGFzcyBJbgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIHBhdGg7Ci0gICAgICAgIHByaXZhdGUgdm9sYXRpbGUgUmFuZG9tQWNjZXNzUmVhZGVyIGluOwotCi0gICAgICAgIHB1YmxpYyBJbihGaWxlIHBhdGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgbWF5YmVJbml0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGluICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGluID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbiA9IFJhbmRvbUFjY2Vzc1JlYWRlci5vcGVuKHBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEYXRhSW5wdXRQbHVzIGdldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heWJlSW5pdCgpOwotICAgICAgICAgICAgcmV0dXJuIGluOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFT0YoKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXliZUluaXQoKTsKLSAgICAgICAgICAgIHJldHVybiBpbi5pc0VPRigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgZ2V0RmlsZVBvaW50ZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXliZUluaXQoKTsKLSAgICAgICAgICAgIHJldHVybiBpbi5nZXRGaWxlUG9pbnRlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgbGVuZ3RoKCkKLSAgICAgICAgewotICAgICAgICAgICAgbWF5YmVJbml0KCk7Ci0gICAgICAgICAgICByZXR1cm4gaW4ubGVuZ3RoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3IgZGVzYzsKLSAgICBwcml2YXRlIGZpbmFsIEluIGluOwogICAgIHByaXZhdGUgZmluYWwgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyOworICAgIHByaXZhdGUgZmluYWwgS2V5UmVhZGVyIGl0OwogICAgIHByaXZhdGUgZmluYWwgUmVhZFdyaXRlTG9jayBmaWxlQWNjZXNzTG9jazsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgdG90YWxCeXRlczsKIAotICAgIHByaXZhdGUgbG9uZyBrZXlQb3NpdGlvbjsKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKIAotICAgIHB1YmxpYyBLZXlJdGVyYXRvcihEZXNjcmlwdG9yIGRlc2MsIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEpCisgICAgcHVibGljIEtleUl0ZXJhdG9yKEtleVJlYWRlciBpdCwgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyLCBsb25nIHRvdGFsQnl0ZXMsIFJlYWRXcml0ZUxvY2sgZmlsZUFjY2Vzc0xvY2spCiAgICAgewotICAgICAgICB0aGlzLmRlc2MgPSBkZXNjOwotICAgICAgICBpbiA9IG5ldyBJbihuZXcgRmlsZShkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5QUklNQVJZX0lOREVYKSkpOwotICAgICAgICBwYXJ0aXRpb25lciA9IG1ldGFkYXRhLnBhcnRpdGlvbmVyOwotICAgICAgICBmaWxlQWNjZXNzTG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgICAgIHRoaXMuaXQgPSBpdDsKKyAgICAgICAgdGhpcy5wYXJ0aXRpb25lciA9IHBhcnRpdGlvbmVyOworICAgICAgICB0aGlzLnRvdGFsQnl0ZXMgPSB0b3RhbEJ5dGVzOworICAgICAgICB0aGlzLmZpbGVBY2Nlc3NMb2NrID0gZmlsZUFjY2Vzc0xvY2s7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIERlY29yYXRlZEtleSBjb21wdXRlTmV4dCgpCiAgICAgewotICAgICAgICBmaWxlQWNjZXNzTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgaWYgKGZpbGVBY2Nlc3NMb2NrICE9IG51bGwpCisgICAgICAgICAgICBmaWxlQWNjZXNzTG9jay5yZWFkTG9jaygpLmxvY2soKTsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpbi5pc0VPRigpKQotICAgICAgICAgICAgICAgIHJldHVybiBlbmRPZkRhdGEoKTsKLQotICAgICAgICAgICAga2V5UG9zaXRpb24gPSBpbi5nZXRGaWxlUG9pbnRlcigpOwotICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IHBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoaW4uZ2V0KCkpKTsKLSAgICAgICAgICAgIFJvd0luZGV4RW50cnkuU2VyaWFsaXplci5za2lwKGluLmdldCgpLCBkZXNjLnZlcnNpb24pOyAvLyBza2lwIHJlbWFpbmRlciBvZiB0aGUgZW50cnkKLSAgICAgICAgICAgIHJldHVybiBrZXk7CisgICAgICAgICAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXQuaXNFeGhhdXN0ZWQoKQorICAgICAgICAgICAgICAgICAgICAgICA/IGVuZE9mRGF0YSgpCisgICAgICAgICAgICAgICAgICAgICAgIDogcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoaXQua2V5KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBpdC5hZHZhbmNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgPyBwYXJ0aXRpb25lci5kZWNvcmF0ZUtleShpdC5rZXkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgOiBlbmRPZkRhdGEoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKICAgICAgICAgewpAQCAtMTIzLDQ1ICs2OCw0NCBAQAogICAgICAgICB9CiAgICAgICAgIGZpbmFsbHkKICAgICAgICAgewotICAgICAgICAgICAgZmlsZUFjY2Vzc0xvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgIGlmIChmaWxlQWNjZXNzTG9jayAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZpbGVBY2Nlc3NMb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCiAgICAgewotICAgICAgICBmaWxlQWNjZXNzTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgIGlmIChmaWxlQWNjZXNzTG9jayAhPSBudWxsKQorICAgICAgICAgICAgZmlsZUFjY2Vzc0xvY2sud3JpdGVMb2NrKCkubG9jaygpOwogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgIGl0LmNsb3NlKCk7CiAgICAgICAgIH0KICAgICAgICAgZmluYWxseQogICAgICAgICB7Ci0gICAgICAgICAgICBmaWxlQWNjZXNzTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgIGlmIChmaWxlQWNjZXNzTG9jayAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZpbGVBY2Nlc3NMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIGxvbmcgZ2V0Qnl0ZXNSZWFkKCkKICAgICB7Ci0gICAgICAgIGZpbGVBY2Nlc3NMb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgICBpZiAoZmlsZUFjY2Vzc0xvY2sgIT0gbnVsbCkKKyAgICAgICAgICAgIGZpbGVBY2Nlc3NMb2NrLnJlYWRMb2NrKCkubG9jaygpOwogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGluLmdldEZpbGVQb2ludGVyKCk7CisgICAgICAgICAgICByZXR1cm4gaXQuaXNFeGhhdXN0ZWQoKSA/IHRvdGFsQnl0ZXMgOiBpdC5kYXRhUG9zaXRpb24oKTsKICAgICAgICAgfQogICAgICAgICBmaW5hbGx5CiAgICAgICAgIHsKLSAgICAgICAgICAgIGZpbGVBY2Nlc3NMb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgICAgICAgICBpZiAoZmlsZUFjY2Vzc0xvY2sgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmaWxlQWNjZXNzTG9jay5yZWFkTG9jaygpLnVubG9jaygpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIGxvbmcgZ2V0VG90YWxCeXRlcygpCiAgICAgewotICAgICAgICAvLyBsZW5ndGggaXMgZmluYWwgaW4gdGhlIHJlZmVyZW5jZWQgb2JqZWN0LgotICAgICAgICAvLyBubyBuZWVkIHRvIGFjcXVpcmUgdGhlIGxvY2sKLSAgICAgICAgcmV0dXJuIGluLmxlbmd0aCgpOworICAgICAgICByZXR1cm4gdG90YWxCeXRlczsKICAgICB9CiAKLSAgICBwdWJsaWMgbG9uZyBnZXRLZXlQb3NpdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4ga2V5UG9zaXRpb247Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9LZXlSZWFkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvS2V5UmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhlZTE0NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvS2V5UmVhZGVyLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKKworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworLyoqCisgKiBSZWFkcyBrZXlzIGZyb20gYW4gU1NUYWJsZS4KKyAqIDxwLz4KKyAqIEl0IGlzIHNwZWNpZmljIHRvIFNTVGFibGUgZm9ybWF0IGhvdyB0aGUga2V5cyBhcmUgcmVhZCBidXQgaW4gZ2VuZXJhbCB0aGUgYXNzdW1wdGlvbiBpcyB0aGF0IGl0IHdpbGwgcmVhZCBhbGwgdGhlCisgKiBrZXlzIGluIHRoZSBvcmRlciBhcyB0aGV5IGFyZSBwbGFjZWQgaW4gZGF0YSBmaWxlLgorICogPHAvPgorICogQWZ0ZXIgY3JlYXRpbmcgaXQsIGl0IHNob3VsZCBiZSBhdCB0aGUgZmlyc3Qga2V5LiBVbmxlc3MgdGhlIFNTVGFibGUgaXMgZW1wdHksIHtAbGluayAja2V5KCl9LAorICoge0BsaW5rICNrZXlQb3NpdGlvbkZvclNlY29uZGFyeUluZGV4KCl9IGFuZCB7QGxpbmsgI2RhdGFQb3NpdGlvbigpfSBzaG91bGQgcmV0dXJuIGFwcHJvcmlhdGUgdmFsdWVzLiBJZiB0aGVyZSBpcworICogbm8gZGF0YSwge0BsaW5rICNpc0V4aGF1c3RlZCgpfSByZXR1cm5zIHtAY29kZSB0cnVlfS4gSW4gb3JkZXIgdG8gbW92ZSB0byB0aGUgbmV4dCBrZXksIHtAbGluayAjYWR2YW5jZSgpfSBzaG91bGQgYmUKKyAqIGNhbGxlZC4gSXQgcmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHJlYWRlciBtb3ZlZCB0byB0aGUgbmV4dCBrZXk7IG90aGVyd2lzZSwgdGhlcmUgaXMgbm8gbW9yZSBkYXRhIHRvIHJlYWQgYW5kCisgKiB0aGUgcmVhZGVyIGlzIGV4aGF1c3RlZC4gV2hlbiB0aGUgcmVhZGVyIGlzIGV4aGF1c3RlZCwgcmV0dXJuIHZhbHVlcyBvZiB7QGxpbmsgI2tleSgpfSwKKyAqIHtAbGluayAja2V5UG9zaXRpb25Gb3JTZWNvbmRhcnlJbmRleCgpfSBhbmQge0BsaW5rICNkYXRhUG9zaXRpb24oKX0gYXJlIHVuZGVmaW5lZC4KKyAqLworcHVibGljIGludGVyZmFjZSBLZXlSZWFkZXIgZXh0ZW5kcyBDbG9zZWFibGUKK3sKKyAgICAvKioKKyAgICAgKiBDdXJyZW50IGtleQorICAgICAqLworICAgIEJ5dGVCdWZmZXIga2V5KCk7CisKKyAgICAvKioKKyAgICAgKiBQb3NpdGlvbiBpbiB0aGUgY29tcG9uZW50IHByZWZlcnJlZCBmb3IgcmVhZGluZyBrZXlzLiBUaGlzIGlzIHNwZWNpZmljIHRvIFNTVGFibGUgaW1wbGVtZW50YXRpb24KKyAgICAgKi8KKyAgICBsb25nIGtleVBvc2l0aW9uRm9yU2Vjb25kYXJ5SW5kZXgoKTsKKworICAgIC8qKgorICAgICAqIFBvc2l0aW9uIGluIHRoZSBkYXRhIGZpbGUgd2hlcmUgdGhlIGFzc29jaWF0ZWQgY29udGVudCByZXNpZGVzCisgICAgICovCisgICAgbG9uZyBkYXRhUG9zaXRpb24oKTsKKworICAgIC8qKgorICAgICAqIE1vdmVzIHRoZSBpdGVyYXRvciBmb3J3YXJkLiBSZXR1cm5zIGZhbHNlIGlmIHdlIHJlYWNoIEVPRiBhbmQgdGhlcmUgbm90aGluZyBtb3JlIHRvIHJlYWQKKyAgICAgKi8KKyAgICBib29sZWFuIGFkdmFuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgd2UgcmVhY2ggRU9GCisgICAgICovCisgICAgYm9vbGVhbiBpc0V4aGF1c3RlZCgpOworCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSBpdGVyYXRvciB0byB0aGUgaW5pdGlhbCBwb3NpdGlvbgorICAgICAqLworICAgIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIGl0ZXJhdG9yIHF1aWV0bHkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIGNsb3NlKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9NZXRyaWNzUHJvdmlkZXJzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL01ldHJpY3NQcm92aWRlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzUyYjYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9NZXRyaWNzUHJvdmlkZXJzLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOworCitwdWJsaWMgaW50ZXJmYWNlIE1ldHJpY3NQcm92aWRlcnMKK3sKKyAgICBJdGVyYWJsZTxHYXVnZVByb3ZpZGVyPD8+PiBnZXRHYXVnZVByb3ZpZGVycygpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9SYW5nZUF3YXJlU1NUYWJsZVdyaXRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9SYW5nZUF3YXJlU1NUYWJsZVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYWVmMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1JhbmdlQXdhcmVTU1RhYmxlV3JpdGVyLmphdmEKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlza0JvdW5kYXJpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUGFydGl0aW9uUG9zaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlTmV3VHJhY2tlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CisKK3B1YmxpYyBjbGFzcyBSYW5nZUF3YXJlU1NUYWJsZVdyaXRlciBpbXBsZW1lbnRzIFNTVGFibGVNdWx0aVdyaXRlcgoreworICAgIHByaXZhdGUgZmluYWwgTGlzdDxQYXJ0aXRpb25Qb3NpdGlvbj4gYm91bmRhcmllczsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8RGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeT4gZGlyZWN0b3JpZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgc3N0YWJsZUxldmVsOworICAgIHByaXZhdGUgZmluYWwgbG9uZyBlc3RpbWF0ZWRLZXlzOworICAgIHByaXZhdGUgZmluYWwgbG9uZyByZXBhaXJlZEF0OworICAgIHByaXZhdGUgZmluYWwgVGltZVVVSUQgcGVuZGluZ1JlcGFpcjsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNUcmFuc2llbnQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTU1RhYmxlRm9ybWF0PD8sID8+IGZvcm1hdDsKKyAgICBwcml2YXRlIGZpbmFsIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyOworICAgIHByaXZhdGUgZmluYWwgTGlmZWN5Y2xlTmV3VHJhY2tlciBsaWZlY3ljbGVOZXdUcmFja2VyOworICAgIHByaXZhdGUgaW50IGN1cnJlbnRJbmRleCA9IC0xOworICAgIHB1YmxpYyBmaW5hbCBDb2x1bW5GYW1pbHlTdG9yZSBjZnM7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFNTVGFibGVNdWx0aVdyaXRlcj4gZmluaXNoZWRXcml0ZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFNTVGFibGVSZWFkZXI+IGZpbmlzaGVkUmVhZGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgU1NUYWJsZU11bHRpV3JpdGVyIGN1cnJlbnRXcml0ZXIgPSBudWxsOworCisgICAgcHVibGljIFJhbmdlQXdhcmVTU1RhYmxlV3JpdGVyKENvbHVtbkZhbWlseVN0b3JlIGNmcywgbG9uZyBlc3RpbWF0ZWRLZXlzLCBsb25nIHJlcGFpcmVkQXQsIFRpbWVVVUlEIHBlbmRpbmdSZXBhaXIsIGJvb2xlYW4gaXNUcmFuc2llbnQsIFNTVGFibGVGb3JtYXQ8PywgPz4gZm9ybWF0LCBpbnQgc3N0YWJsZUxldmVsLCBsb25nIHRvdGFsU2l6ZSwgTGlmZWN5Y2xlTmV3VHJhY2tlciBsaWZlY3ljbGVOZXdUcmFja2VyLCBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBEaXNrQm91bmRhcmllcyBkYiA9IGNmcy5nZXREaXNrQm91bmRhcmllcygpOworICAgICAgICBkaXJlY3RvcmllcyA9IGRiLmRpcmVjdG9yaWVzOworICAgICAgICB0aGlzLnNzdGFibGVMZXZlbCA9IHNzdGFibGVMZXZlbDsKKyAgICAgICAgdGhpcy5jZnMgPSBjZnM7CisgICAgICAgIHRoaXMuZXN0aW1hdGVkS2V5cyA9IGVzdGltYXRlZEtleXMgLyBkaXJlY3Rvcmllcy5zaXplKCk7CisgICAgICAgIHRoaXMucmVwYWlyZWRBdCA9IHJlcGFpcmVkQXQ7CisgICAgICAgIHRoaXMucGVuZGluZ1JlcGFpciA9IHBlbmRpbmdSZXBhaXI7CisgICAgICAgIHRoaXMuaXNUcmFuc2llbnQgPSBpc1RyYW5zaWVudDsKKyAgICAgICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgIHRoaXMubGlmZWN5Y2xlTmV3VHJhY2tlciA9IGxpZmVjeWNsZU5ld1RyYWNrZXI7CisgICAgICAgIHRoaXMuaGVhZGVyID0gaGVhZGVyOworICAgICAgICBib3VuZGFyaWVzID0gZGIucG9zaXRpb25zOworICAgICAgICBpZiAoYm91bmRhcmllcyA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBEaXJlY3Rvcmllcy5EYXRhRGlyZWN0b3J5IGxvY2FsRGlyID0gY2ZzLmdldERpcmVjdG9yaWVzKCkuZ2V0V3JpdGVhYmxlTG9jYXRpb24odG90YWxTaXplKTsKKyAgICAgICAgICAgIGlmIChsb2NhbERpciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJJbnN1ZmZpY2llbnQgZGlzayBzcGFjZSB0byBzdG9yZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkodG90YWxTaXplKSkpOworICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gY2ZzLm5ld1NTVGFibGVEZXNjcmlwdG9yKGNmcy5nZXREaXJlY3RvcmllcygpLmdldExvY2F0aW9uRm9yRGlzayhsb2NhbERpciksIGZvcm1hdCk7CisgICAgICAgICAgICBjdXJyZW50V3JpdGVyID0gY2ZzLmNyZWF0ZVNTVGFibGVNdWx0aVdyaXRlcihkZXNjLCBlc3RpbWF0ZWRLZXlzLCByZXBhaXJlZEF0LCBwZW5kaW5nUmVwYWlyLCBpc1RyYW5zaWVudCwgc3N0YWJsZUxldmVsLCBoZWFkZXIsIGxpZmVjeWNsZU5ld1RyYWNrZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG1heWJlU3dpdGNoV3JpdGVyKERlY29yYXRlZEtleSBrZXkpCisgICAgeworICAgICAgICBpZiAoYm91bmRhcmllcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGJvb2xlYW4gc3dpdGNoZWQgPSBmYWxzZTsKKyAgICAgICAgd2hpbGUgKGN1cnJlbnRJbmRleCA8IDAgfHwga2V5LmNvbXBhcmVUbyhib3VuZGFyaWVzLmdldChjdXJyZW50SW5kZXgpKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGN1cnJlbnRJbmRleCsrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN3aXRjaGVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3VycmVudFdyaXRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZpbmlzaGVkV3JpdGVycy5hZGQoY3VycmVudFdyaXRlcik7CisKKyAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzYyA9IGNmcy5uZXdTU1RhYmxlRGVzY3JpcHRvcihjZnMuZ2V0RGlyZWN0b3JpZXMoKS5nZXRMb2NhdGlvbkZvckRpc2soZGlyZWN0b3JpZXMuZ2V0KGN1cnJlbnRJbmRleCkpLCBmb3JtYXQpOworICAgICAgICAgICAgY3VycmVudFdyaXRlciA9IGNmcy5jcmVhdGVTU1RhYmxlTXVsdGlXcml0ZXIoZGVzYywgZXN0aW1hdGVkS2V5cywgcmVwYWlyZWRBdCwgcGVuZGluZ1JlcGFpciwgaXNUcmFuc2llbnQsIHNzdGFibGVMZXZlbCwgaGVhZGVyLCBsaWZlY3ljbGVOZXdUcmFja2VyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFwcGVuZChVbmZpbHRlcmVkUm93SXRlcmF0b3IgcGFydGl0aW9uKQorICAgIHsKKyAgICAgICAgbWF5YmVTd2l0Y2hXcml0ZXIocGFydGl0aW9uLnBhcnRpdGlvbktleSgpKTsKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRXcml0ZXIuYXBwZW5kKHBhcnRpdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gZmluaXNoKGxvbmcgcmVwYWlyZWRBdCwgbG9uZyBtYXhEYXRhQWdlLCBib29sZWFuIG9wZW5SZXN1bHQpCisgICAgeworICAgICAgICBpZiAoY3VycmVudFdyaXRlciAhPSBudWxsKQorICAgICAgICAgICAgZmluaXNoZWRXcml0ZXJzLmFkZChjdXJyZW50V3JpdGVyKTsKKyAgICAgICAgY3VycmVudFdyaXRlciA9IG51bGw7CisgICAgICAgIGZvciAoU1NUYWJsZU11bHRpV3JpdGVyIHdyaXRlciA6IGZpbmlzaGVkV3JpdGVycykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdyaXRlci5nZXRGaWxlUG9pbnRlcigpID4gMCkKKyAgICAgICAgICAgICAgICBmaW5pc2hlZFJlYWRlcnMuYWRkQWxsKHdyaXRlci5maW5pc2gocmVwYWlyZWRBdCwgbWF4RGF0YUFnZSwgb3BlblJlc3VsdCkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFNTVGFibGVNdWx0aVdyaXRlci5hYm9ydE9yRGllKHdyaXRlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbmlzaGVkUmVhZGVyczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBmaW5pc2goYm9vbGVhbiBvcGVuUmVzdWx0KQorICAgIHsKKyAgICAgICAgaWYgKGN1cnJlbnRXcml0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIGZpbmlzaGVkV3JpdGVycy5hZGQoY3VycmVudFdyaXRlcik7CisgICAgICAgIGN1cnJlbnRXcml0ZXIgPSBudWxsOworICAgICAgICBmb3IgKFNTVGFibGVNdWx0aVdyaXRlciB3cml0ZXIgOiBmaW5pc2hlZFdyaXRlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3cml0ZXIuZ2V0RmlsZVBvaW50ZXIoKSA+IDApCisgICAgICAgICAgICAgICAgZmluaXNoZWRSZWFkZXJzLmFkZEFsbCh3cml0ZXIuZmluaXNoKG9wZW5SZXN1bHQpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBTU1RhYmxlTXVsdGlXcml0ZXIuYWJvcnRPckRpZSh3cml0ZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaW5pc2hlZFJlYWRlcnM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gZmluaXNoZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZpbmlzaGVkUmVhZGVyczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1NUYWJsZU11bHRpV3JpdGVyIHNldE9wZW5SZXN1bHQoYm9vbGVhbiBvcGVuUmVzdWx0KQorICAgIHsKKyAgICAgICAgZmluaXNoZWRXcml0ZXJzLmZvckVhY2goKHcpIC0+IHcuc2V0T3BlblJlc3VsdChvcGVuUmVzdWx0KSk7CisgICAgICAgIGN1cnJlbnRXcml0ZXIuc2V0T3BlblJlc3VsdChvcGVuUmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRGaWxlbmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gU3RyaW5nLmpvaW4oIi8iLCBjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLCBjZnMuZ2V0VGFibGVOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldEZpbGVQb2ludGVyKCkKKyAgICB7CisgICAgICAgcmV0dXJuIGN1cnJlbnRXcml0ZXIgIT0gbnVsbCA/IGN1cnJlbnRXcml0ZXIuZ2V0RmlsZVBvaW50ZXIoKSA6IDBMOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUYWJsZUlkIGdldFRhYmxlSWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNmcy5tZXRhZGF0YS5pZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGhyb3dhYmxlIGNvbW1pdChUaHJvd2FibGUgYWNjdW11bGF0ZSkKKyAgICB7CisgICAgICAgIGlmIChjdXJyZW50V3JpdGVyICE9IG51bGwpCisgICAgICAgICAgICBmaW5pc2hlZFdyaXRlcnMuYWRkKGN1cnJlbnRXcml0ZXIpOworICAgICAgICBjdXJyZW50V3JpdGVyID0gbnVsbDsKKyAgICAgICAgZm9yIChTU1RhYmxlTXVsdGlXcml0ZXIgd3JpdGVyIDogZmluaXNoZWRXcml0ZXJzKQorICAgICAgICAgICAgYWNjdW11bGF0ZSA9IHdyaXRlci5jb21taXQoYWNjdW11bGF0ZSk7CisgICAgICAgIHJldHVybiBhY2N1bXVsYXRlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUaHJvd2FibGUgYWJvcnQoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCisgICAgeworICAgICAgICBpZiAoY3VycmVudFdyaXRlciAhPSBudWxsKQorICAgICAgICAgICAgZmluaXNoZWRXcml0ZXJzLmFkZChjdXJyZW50V3JpdGVyKTsKKyAgICAgICAgY3VycmVudFdyaXRlciA9IG51bGw7CisgICAgICAgIGZvciAoU1NUYWJsZU11bHRpV3JpdGVyIGZpbmlzaGVkV3JpdGVyIDogZmluaXNoZWRXcml0ZXJzKQorICAgICAgICAgICAgYWNjdW11bGF0ZSA9IGZpbmlzaGVkV3JpdGVyLmFib3J0KGFjY3VtdWxhdGUpOworCisgICAgICAgIHJldHVybiBhY2N1bXVsYXRlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByZXBhcmVUb0NvbW1pdCgpCisgICAgeworICAgICAgICBpZiAoY3VycmVudFdyaXRlciAhPSBudWxsKQorICAgICAgICAgICAgZmluaXNoZWRXcml0ZXJzLmFkZChjdXJyZW50V3JpdGVyKTsKKyAgICAgICAgY3VycmVudFdyaXRlciA9IG51bGw7CisgICAgICAgIGZpbmlzaGVkV3JpdGVycy5mb3JFYWNoKFNTVGFibGVNdWx0aVdyaXRlcjo6cHJlcGFyZVRvQ29tbWl0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgeworICAgICAgICBpZiAoY3VycmVudFdyaXRlciAhPSBudWxsKQorICAgICAgICAgICAgZmluaXNoZWRXcml0ZXJzLmFkZChjdXJyZW50V3JpdGVyKTsKKyAgICAgICAgY3VycmVudFdyaXRlciA9IG51bGw7CisgICAgICAgIGZpbmlzaGVkV3JpdGVycy5mb3JFYWNoKFNTVGFibGVNdWx0aVdyaXRlcjo6Y2xvc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvUmVkdWNpbmdLZXlJdGVyYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9SZWR1Y2luZ0tleUl0ZXJhdG9yLmphdmEKaW5kZXggODI2YjkxZC4uMWNkNzgwZSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9SZWR1Y2luZ0tleUl0ZXJhdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9SZWR1Y2luZ0tleUl0ZXJhdG9yLmphdmEKQEAgLTE3LDE1ICsxNywxOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvc2VhYmxlSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSU1lcmdlSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTWVyZ2VJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOwogCiAvKioKICAqIENhbGxlciBtdXN0IGFjcXVpcmUgYW5kIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgc3N0YWJsZXMgdXNlZCBoZXJlLgpAQCAtMzksNyArNDIsMTcgQEAKICAgICB7CiAgICAgICAgIGl0ZXJzID0gbmV3IEFycmF5TGlzdDw+KHNzdGFibGVzLnNpemUoKSk7CiAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCi0gICAgICAgICAgICBpdGVycy5hZGQobmV3IEtleUl0ZXJhdG9yKHNzdGFibGUuZGVzY3JpcHRvciwgc3N0YWJsZS5tZXRhZGF0YSgpKSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGl0ZXJzLmFkZChzc3RhYmxlLmtleUl0ZXJhdG9yKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGl0ZXJzLmZvckVhY2goRmlsZVV0aWxzOjpjbG9zZVF1aWV0bHkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIGEga2V5IGl0ZXJhdG9yIGZvciBzc3RhYmxlICIgKyBzc3RhYmxlLmdldEZpbGVuYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIG1heWJlSW5pdCgpCkBAIC03OCw3ICs5MSwxNyBAQAogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKICAgICB7CiAgICAgICAgIGlmIChtaSAhPSBudWxsKQorICAgICAgICB7CiAgICAgICAgICAgICBtaS5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaWYgbWVyZ2luZyBpdGVyYXRvciB3YXMgbm90IGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIHJlZHVjaW5nIGl0ZXJhdG9yIGlzIGNsb3NlZCwgd2UgbmVlZCB0byBjbG9zZSB0aGUKKyAgICAgICAgICAgIC8vIHVuZGVybHlpbmcgaXRlcmF0b3JzIG1hbnVhbGx5CisgICAgICAgICAgICBUaHJvd2FibGUgZXJyID0gVGhyb3dhYmxlcy5jbG9zZShudWxsLCBpdGVycyk7CisgICAgICAgICAgICBpZiAoZXJyICE9IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy51bmNoZWNrZWQoZXJyKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyBsb25nIGdldFRvdGFsQnl0ZXMoKQpAQCAtMTIxLDQgKzE0NCw0IEBACiAgICAgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGUuamF2YQppbmRleCA4MTAzMGMyLi41MTU2YWRjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGUuamF2YQpAQCAtMTcsMTYgKzE3LDE1IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKIAotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0Vycm9yOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwotaW1wb3J0IGphdmEubmlvLmZpbGUuTm9TdWNoRmlsZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlTZXQ7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKQEAgLTM0LDQzICszMywzNSBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuQ29sbGVjdGlvbnMyOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkJ1ZmZlckRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5DaHVua0NhY2hlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd0luZGV4RW50cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkFic3RyYWN0Qm91bmRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTV3JpdGVFcnJvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRpc2tPcHRpbWl6YXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVPdXRwdXRTdHJlYW1QbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlRPQ0NvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SYW5kb21BY2Nlc3NSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5UYWJsZU1ldHJpY3M7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuSGVhcENsb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50Lk9wT3JkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5TaGFyZWRDbG9zZWFibGU7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlLldyaXRlTW9kZS5BUFBFTkQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQWN0aXZlUmVwYWlyU2VydmljZS5OT19QRU5ESU5HX1JFUEFJUjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5BY3RpdmVSZXBhaXJTZXJ2aWNlLlVOUkVQQUlSRURfU1NUQUJMRTsKIAogLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGJ1aWx0IG9uIHRvcCBvZiB0aGUgU2VxdWVuY2VGaWxlLiBJdCBzdG9yZXMKLSAqIGRhdGEgb24gZGlzayBpbiBzb3J0ZWQgZmFzaGlvbi4gSG93ZXZlciB0aGUgc29ydGluZyBpcyB1cHRvCi0gKiB0aGUgYXBwbGljYXRpb24uIFRoaXMgY2xhc3MgZXhwZWN0cyBrZXlzIHRvIGJlIGhhbmRlZCB0byBpdAotICogaW4gc29ydGVkIG9yZGVyLgotICoKLSAqIEEgc2VwYXJhdGUgaW5kZXggZmlsZSBpcyBtYWludGFpbmVkIGFzIHdlbGwsIGNvbnRhaW5pbmcgdGhlCi0gKiBTU1RhYmxlIGtleXMgYW5kIHRoZSBvZmZzZXQgaW50byB0aGUgU1NUYWJsZSBhdCB3aGljaCB0aGV5IGFyZSBmb3VuZC4KLSAqIEV2ZXJ5IDEvaW5kZXhJbnRlcnZhbCBrZXkgaXMgcmVhZCBpbnRvIG1lbW9yeSB3aGVuIHRoZSBTU1RhYmxlIGlzIG9wZW5lZC4KLSAqCi0gKiBGaW5hbGx5LCBhIGJsb29tIGZpbHRlciBmaWxlIGlzIGFsc28ga2VwdCBmb3IgdGhlIGtleXMgaW4gZWFjaCBTU1RhYmxlLgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGFic3RyYWN0IHNzdGFibGUgb24gZGlzayB3aG9zZSBrZXlzIGFuZCBjb3JyZXNwb25kaW5nIHBhcnRpdGlvbnMgYXJlIHN0b3JlZCBpbgorICogYSB7QGxpbmsgU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzI0RBVEF9IGZpbGUgaW4gb3JkZXIgYXMgaW1wb3NlZCBieSB7QGxpbmsgRGVjb3JhdGVkS2V5I2NvbXBhcmF0b3J9LgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU1NUYWJsZQogewpAQCAtNzgsNzAgKzY5LDEwMSBAQAogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9NQlNUT05FX0hJU1RPR1JBTV9CSU5fU0laRSA9IDEwMDsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT01CU1RPTkVfSElTVE9HUkFNX1NQT09MX1NJWkUgPSAxMDAwMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9NQlNUT05FX0hJU1RPR1JBTV9UVExfUk9VTkRfU0VDT05EUyA9IEludGVnZXIudmFsdWVPZihTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5zdHJlYW1pbmdoaXN0b2dyYW0ucm91bmRzZWNvbmRzIiwgIjYwIikpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPTUJTVE9ORV9ISVNUT0dSQU1fVFRMX1JPVU5EX1NFQ09ORFMgPSBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU1RSRUFNSU5HX0hJU1RPR1JBTV9ST1VORF9TRUNPTkRTLmdldEludCgpOwogCiAgICAgcHVibGljIGZpbmFsIERlc2NyaXB0b3IgZGVzY3JpcHRvcjsKICAgICBwcm90ZWN0ZWQgZmluYWwgU2V0PENvbXBvbmVudD4gY29tcG9uZW50czsKICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBjb21wcmVzc2lvbjsKIAotICAgIHB1YmxpYyBEZWNvcmF0ZWRLZXkgZmlyc3Q7Ci0gICAgcHVibGljIERlY29yYXRlZEtleSBsYXN0OwotCi0gICAgcHJvdGVjdGVkIGZpbmFsIERpc2tPcHRpbWl6YXRpb25TdHJhdGVneSBvcHRpbWl6YXRpb25TdHJhdGVneTsKICAgICBwcm90ZWN0ZWQgZmluYWwgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YTsKIAotICAgIHByb3RlY3RlZCBTU1RhYmxlKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cywgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YSwgRGlza09wdGltaXphdGlvblN0cmF0ZWd5IG9wdGltaXphdGlvblN0cmF0ZWd5KQotICAgIHsKLSAgICAgICAgLy8gSW4gYWxtb3N0IGFsbCBjYXNlcywgbWV0YWRhdGEgc2hvdWxkbid0IGJlIG51bGwsIGJ1dCBhbGxvd2luZyBudWxsIGFsbG93cyB0byBjcmVhdGUgYSBtb3N0bHkgZnVuY3Rpb25hbCBTU1RhYmxlIHdpdGhvdXQKLSAgICAgICAgLy8gZnVsbCBzY2hlbWEgZGVmaW5pdGlvbi4gU1NUYWJsZUxvYWRlciB1c2UgdGhhdCBhYmlsaXR5Ci0gICAgICAgIGFzc2VydCBkZXNjcmlwdG9yICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCBjb21wb25lbnRzICE9IG51bGw7CisgICAgcHVibGljIGZpbmFsIENodW5rQ2FjaGUgY2h1bmtDYWNoZTsKKyAgICBwdWJsaWMgZmluYWwgSU9PcHRpb25zIGlvT3B0aW9uczsKIAotICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgICAgICBTZXQ8Q29tcG9uZW50PiBkYXRhQ29tcG9uZW50cyA9IG5ldyBIYXNoU2V0PD4oY29tcG9uZW50cyk7Ci0gICAgICAgIHRoaXMuY29tcHJlc3Npb24gPSBkYXRhQ29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnQuQ09NUFJFU1NJT05fSU5GTyk7Ci0gICAgICAgIHRoaXMuY29tcG9uZW50cyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5U2V0PD4oZGF0YUNvbXBvbmVudHMpOwotICAgICAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgIHRoaXMub3B0aW1pemF0aW9uU3RyYXRlZ3kgPSBPYmplY3RzLnJlcXVpcmVOb25OdWxsKG9wdGltaXphdGlvblN0cmF0ZWd5KTsKKyAgICBATnVsbGFibGUKKyAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8T3duZXI+IG93bmVyOworCisgICAgcHVibGljIFNTVGFibGUoQnVpbGRlcjw/LCA/PiBidWlsZGVyLCBPd25lciBvd25lcikKKyAgICB7CisgICAgICAgIHRoaXMub3duZXIgPSBuZXcgV2Vha1JlZmVyZW5jZTw+KG93bmVyKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGJ1aWxkZXIuZGVzY3JpcHRvcik7CisgICAgICAgIGNoZWNrTm90TnVsbChidWlsZGVyLmdldENvbXBvbmVudHMoKSk7CisKKyAgICAgICAgdGhpcy5kZXNjcmlwdG9yID0gYnVpbGRlci5kZXNjcmlwdG9yOworICAgICAgICB0aGlzLmlvT3B0aW9ucyA9IGJ1aWxkZXIuZ2V0SU9PcHRpb25zKCk7CisgICAgICAgIHRoaXMuY29tcG9uZW50cyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5U2V0PD4oYnVpbGRlci5nZXRDb21wb25lbnRzKCkpOworICAgICAgICB0aGlzLmNvbXByZXNzaW9uID0gY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnRzLkNPTVBSRVNTSU9OX0lORk8pOworICAgICAgICB0aGlzLm1ldGFkYXRhID0gYnVpbGRlci5nZXRUYWJsZU1ldGFkYXRhUmVmKCk7CisgICAgICAgIHRoaXMuY2h1bmtDYWNoZSA9IGJ1aWxkZXIuZ2V0Q2h1bmtDYWNoZSgpOwogICAgIH0KIAorICAgIHB1YmxpYyBmaW5hbCBPcHRpb25hbDxPd25lcj4gb3duZXIoKQorICAgIHsKKyAgICAgICAgaWYgKG93bmVyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUob3duZXIuZ2V0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW5hbWUoRGVzY3JpcHRvciB0bXBkZXNjLCBEZXNjcmlwdG9yIG5ld2Rlc2MsIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMpCisgICAgeworICAgICAgICBjb21wb25lbnRzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAuZmlsdGVyKGMgLT4gIW5ld2Rlc2MuZ2V0Rm9ybWF0KCkuZ2VuZXJhdGVkT25Mb2FkQ29tcG9uZW50cygpLmNvbnRhaW5zKGMpKQorICAgICAgICAgICAgICAgICAgLmZpbHRlcihjIC0+ICFjLmVxdWFscyhDb21wb25lbnRzLkRBVEEpKQorICAgICAgICAgICAgICAgICAgLmZvckVhY2goYyAtPiB0bXBkZXNjLmZpbGVGb3IoYykubW92ZShuZXdkZXNjLmZpbGVGb3IoYykpKTsKKworICAgICAgICAvLyBkbyAtRGF0YSBsYXN0IGJlY2F1c2UgLURhdGEgcHJlc2VudCBzaG91bGQgbWVhbiB0aGUgc3N0YWJsZSB3YXMgY29tcGxldGVseSByZW5hbWVkIGJlZm9yZSBjcmFzaAorICAgICAgICB0bXBkZXNjLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKS5tb3ZlKG5ld2Rlc2MuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpKTsKKworICAgICAgICAvLyByZW5hbWUgaXQgd2l0aG91dCBjb25maXJtYXRpb24gYmVjYXVzZSBzdW1tYXJ5IGNhbiBiZSBhdmFpbGFibGUgZm9yIGxvYWROZXdTU1RhYmxlcyBidXQgbm90IGZvciBjbG9zZUFuZE9wZW5SZWFkZXIKKyAgICAgICAgY29tcG9uZW50cy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgLmZpbHRlcihjIC0+IG5ld2Rlc2MuZ2V0Rm9ybWF0KCkuZ2VuZXJhdGVkT25Mb2FkQ29tcG9uZW50cygpLmNvbnRhaW5zKGMpKQorICAgICAgICAgICAgICAgICAgLmZvckVhY2goYyAtPiB0bXBkZXNjLmZpbGVGb3IoYykudHJ5TW92ZShuZXdkZXNjLmZpbGVGb3IoYykpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weShEZXNjcmlwdG9yIHRtcGRlc2MsIERlc2NyaXB0b3IgbmV3ZGVzYywgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cykKKyAgICB7CisgICAgICAgIGNvbXBvbmVudHMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgIC5maWx0ZXIoYyAtPiAhbmV3ZGVzYy5nZXRGb3JtYXQoKS5nZW5lcmF0ZWRPbkxvYWRDb21wb25lbnRzKCkuY29udGFpbnMoYykpCisgICAgICAgICAgICAgICAgICAuZmlsdGVyKGMgLT4gIWMuZXF1YWxzKENvbXBvbmVudHMuREFUQSkpCisgICAgICAgICAgICAgICAgICAuZm9yRWFjaChjIC0+IEZpbGVVdGlscy5jb3B5V2l0aENvbmZpcm0odG1wZGVzYy5maWxlRm9yKGMpLCBuZXdkZXNjLmZpbGVGb3IoYykpKTsKKworICAgICAgICAvLyBkbyAtRGF0YSBsYXN0IGJlY2F1c2UgLURhdGEgcHJlc2VudCBzaG91bGQgbWVhbiB0aGUgc3N0YWJsZSB3YXMgY29tcGxldGVseSBjb3BpZWQgYmVmb3JlIGNyYXNoCisgICAgICAgIEZpbGVVdGlscy5jb3B5V2l0aENvbmZpcm0odG1wZGVzYy5maWxlRm9yKENvbXBvbmVudHMuREFUQSksIG5ld2Rlc2MuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpKTsKKworICAgICAgICAvLyBjb3B5IGl0IHdpdGhvdXQgY29uZmlybWF0aW9uIGJlY2F1c2Ugc3VtbWFyeSBjYW4gYmUgYXZhaWxhYmxlIGZvciBsb2FkTmV3U1NUYWJsZXMgYnV0IG5vdCBmb3IgY2xvc2VBbmRPcGVuUmVhZGVyCisgICAgICAgIGNvbXBvbmVudHMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgIC5maWx0ZXIoYyAtPiBuZXdkZXNjLmdldEZvcm1hdCgpLmdlbmVyYXRlZE9uTG9hZENvbXBvbmVudHMoKS5jb250YWlucyhjKSkKKyAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGMgLT4gRmlsZVV0aWxzLmNvcHlXaXRoT3V0Q29uZmlybSh0bXBkZXNjLmZpbGVGb3IoYyksIG5ld2Rlc2MuZmlsZUZvcihjKSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBoYXJkbGluayhEZXNjcmlwdG9yIHRtcGRlc2MsIERlc2NyaXB0b3IgbmV3ZGVzYywgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cykKKyAgICB7CisgICAgICAgIGNvbXBvbmVudHMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgIC5maWx0ZXIoYyAtPiAhbmV3ZGVzYy5nZXRGb3JtYXQoKS5nZW5lcmF0ZWRPbkxvYWRDb21wb25lbnRzKCkuY29udGFpbnMoYykpCisgICAgICAgICAgICAgICAgICAuZmlsdGVyKGMgLT4gIWMuZXF1YWxzKENvbXBvbmVudHMuREFUQSkpCisgICAgICAgICAgICAgICAgICAuZm9yRWFjaChjIC0+IEZpbGVVdGlscy5jcmVhdGVIYXJkTGlua1dpdGhDb25maXJtKHRtcGRlc2MuZmlsZUZvcihjKSwgbmV3ZGVzYy5maWxlRm9yKGMpKSk7CisKKyAgICAgICAgLy8gZG8gLURhdGEgbGFzdCBiZWNhdXNlIC1EYXRhIHByZXNlbnQgc2hvdWxkIG1lYW4gdGhlIHNzdGFibGUgd2FzIGNvbXBsZXRlbHkgY29waWVkIGJlZm9yZSBjcmFzaAorICAgICAgICBGaWxlVXRpbHMuY3JlYXRlSGFyZExpbmtXaXRoQ29uZmlybSh0bXBkZXNjLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKSwgbmV3ZGVzYy5maWxlRm9yKENvbXBvbmVudHMuREFUQSkpOworCisgICAgICAgIC8vIGNvcHkgaXQgd2l0aG91dCBjb25maXJtYXRpb24gYmVjYXVzZSBzdW1tYXJ5IGNhbiBiZSBhdmFpbGFibGUgZm9yIGxvYWROZXdTU1RhYmxlcyBidXQgbm90IGZvciBjbG9zZUFuZE9wZW5SZWFkZXIKKyAgICAgICAgY29tcG9uZW50cy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgLmZpbHRlcihjIC0+IG5ld2Rlc2MuZ2V0Rm9ybWF0KCkuZ2VuZXJhdGVkT25Mb2FkQ29tcG9uZW50cygpLmNvbnRhaW5zKGMpKQorICAgICAgICAgICAgICAgICAgLmZvckVhY2goYyAtPiBGaWxlVXRpbHMuY3JlYXRlSGFyZExpbmtXaXRob3V0Q29uZmlybSh0bXBkZXNjLmZpbGVGb3IoYyksIG5ld2Rlc2MuZmlsZUZvcihjKSkpOworICAgIH0KKworICAgIHB1YmxpYyBhYnN0cmFjdCBEZWNvcmF0ZWRLZXkgZ2V0Rmlyc3QoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBEZWNvcmF0ZWRLZXkgZ2V0TGFzdCgpOworCisgICAgcHVibGljIGFic3RyYWN0IEFic3RyYWN0Qm91bmRzPFRva2VuPiBnZXRCb3VuZHMoKTsKKwogICAgIEBWaXNpYmxlRm9yVGVzdGluZwogICAgIHB1YmxpYyBTZXQ8Q29tcG9uZW50PiBnZXRDb21wb25lbnRzKCkKICAgICB7CiAgICAgICAgIHJldHVybiBJbW11dGFibGVTZXQuY29weU9mKGNvbXBvbmVudHMpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFdlIHVzZSBhIFJlZmVyZW5jZVF1ZXVlIHRvIG1hbmFnZSBkZWxldGluZyBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjb21wYWN0ZWQKLSAgICAgKiBhbmQgZm9yIHdoaWNoIG5vIG1vcmUgU1NUYWJsZSByZWZlcmVuY2VzIGV4aXN0LiAgQnV0IHRoaXMgaXMgbm90IGd1YXJhbnRlZWQKLSAgICAgKiB0byBydW4gZm9yIGVhY2ggc3VjaCBmaWxlIGJlY2F1c2Ugb2YgdGhlIHNlbWFudGljcyBvZiB0aGUgSlZNIGdjLiAgU28sCi0gICAgICogd2Ugd3JpdGUgYSBtYXJrZXIgdG8gYGNvbXBhY3RlZEZpbGVuYW1lYCB3aGVuIGEgZmlsZSBpcyBjb21wYWN0ZWQ7Ci0gICAgICogaWYgc3VjaCBhIG1hcmtlciBleGlzdHMgb24gc3RhcnR1cCwgdGhlIGZpbGUgc2hvdWxkIGJlIHJlbW92ZWQuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGFsc28gcmVtb3ZlIFNTVGFibGVzIHRoYXQgYXJlIG1hcmtlZCBhcyB0ZW1wb3JhcnkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgd2FzIGRlbGV0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlKERlc2NyaXB0b3IgZGVzYywgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cykKLSAgICB7Ci0gICAgICAgIGxvZ2dlci5pbmZvKCJEZWxldGluZyBzc3RhYmxlOiB7fSIsIGRlc2MpOwotICAgICAgICAvLyByZW1vdmUgdGhlIERBVEEgY29tcG9uZW50IGZpcnN0IGlmIGl0IGV4aXN0cwotICAgICAgICBpZiAoY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnQuREFUQSkpCi0gICAgICAgICAgICBGaWxlVXRpbHMuZGVsZXRlV2l0aENvbmZpcm0oZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpOwotICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBjb21wb25lbnRzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29tcG9uZW50LmVxdWFscyhDb21wb25lbnQuREFUQSkgfHwgY29tcG9uZW50LmVxdWFscyhDb21wb25lbnQuU1VNTUFSWSkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIEZpbGVVdGlscy5kZWxldGVXaXRoQ29uZmlybShkZXNjLmZpbGVuYW1lRm9yKGNvbXBvbmVudCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50LlNVTU1BUlkpKQotICAgICAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZShkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5TVU1NQVJZKSk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCiAgICAgcHVibGljIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEoKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLmdldCgpOwpAQCAtMTU3LDI1ICsxNzksOSBAQAogICAgICAgICByZXR1cm4gZ2V0UGFydGl0aW9uZXIoKS5kZWNvcmF0ZUtleShrZXkpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIElmIHRoZSBnaXZlbiBAcGFyYW0ga2V5IG9jY3VwaWVzIG9ubHkgcGFydCBvZiBhIGxhcmdlciBidWZmZXIsIGFsbG9jYXRlIGEgbmV3IGJ1ZmZlciB0aGF0IGlzIG9ubHkKLSAgICAgKiBhcyBsYXJnZSBhcyBuZWNlc3NhcnkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEZWNvcmF0ZWRLZXkgZ2V0TWluaW1hbEtleShEZWNvcmF0ZWRLZXkga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGtleS5nZXRLZXkoKS5wb3NpdGlvbigpID4gMCB8fCBrZXkuZ2V0S2V5KCkuaGFzUmVtYWluaW5nKCkgfHwgIWtleS5nZXRLZXkoKS5oYXNBcnJheSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBCdWZmZXJEZWNvcmF0ZWRLZXkoa2V5LmdldFRva2VuKCksIEhlYXBDbG9uZXIuaW5zdGFuY2UuY2xvbmUoa2V5LmdldEtleSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoga2V5OwotICAgIH0KLQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZW5hbWUoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5kZXhGaWxlbmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuUFJJTUFSWV9JTkRFWCk7CisgICAgICAgIHJldHVybiBkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKS5hYnNvbHV0ZVBhdGgoKTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtbkZhbWlseU5hbWUoKQpAQCAtMTkyLDExICsxOTgsMzIgQEAKICAgICB7CiAgICAgICAgIExpc3Q8U3RyaW5nPiByZXQgPSBuZXcgQXJyYXlMaXN0PD4oY29tcG9uZW50cy5zaXplKCkpOwogICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBjb21wb25lbnRzKQotICAgICAgICAgICAgcmV0LmFkZChkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKGNvbXBvbmVudCkpOworICAgICAgICAgICAgcmV0LmFkZChkZXNjcmlwdG9yLmZpbGVGb3IoY29tcG9uZW50KS5hYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogVGhlIG1ldGhvZCBzZXRzIGZpZWxkcyBmb3IgdGhpcyBzc3RhYmxlIHJlcHJlc2VudGF0aW9uIG9uIHRoZSBwcm92aWRlZCB7QGxpbmsgQnVpbGRlcn0uIFRoZSBtZXRob2QgaXMgaW50ZW5kZWQKKyAgICAgKiB0byBiZSBjYWxsZWQgZnJvbSB0aGUgb3ZlcmxvYWRlZCB7QGNvZGUgdW5idWlsZFRvfSBtZXRob2QgaW4gc3ViY2xhc3Nlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWlsZGVyICAgIHRoZSBidWlsZGVyIG9uIHdoaWNoIHRoZSBmaWVsZHMgc2hvdWxkIGJlIHNldAorICAgICAqIEBwYXJhbSBzaGFyZWRDb3B5IHdoZXRoZXIgdGhlIHtAbGluayBTaGFyZWRDbG9zZWFibGV9IHJlc291cmNlcyBzaG91bGQgYmUgcGFzc2VkIGFzIHNoYXJlZCBjb3BpZXMgb3IgZGlyZWN0bHk7CisgICAgICogICAgICAgICAgICAgICAgICAgbm90ZSB0aGF0IHRoZSBtZXRob2Qgd2lsbCBvdmVyd3JpdGUgdGhlIGZpZWxkcyByZXByZXNlbnRpbmcge0BsaW5rIFNoYXJlZENsb3NlYWJsZX0gb25seSBpZgorICAgICAqICAgICAgICAgICAgICAgICAgIHRoZXkgYXJlIG5vdCBzZXQgaW4gdGhlIGJ1aWxkZXIgeWV0ICh0aGUgcmVsZXZhbnQgZmllbGRzIGluIHRoZSBidWlsZGVyIGFyZSB7QGNvZGUgbnVsbH0pLgorICAgICAqICAgICAgICAgICAgICAgICAgIEFsdGhvdWdoIHtAbGluayBTU1RhYmxlfSBkb2VzIG5vdCBrZWVwIGFueSByZWZlcmVuY2VzIHRvIHJlc291cmNlcywgdGhlIHBhcmFtZXRlcnMgaXMgYWRkZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICBmb3IgdGhlIHBvc3NpYmxlIGZ1dHVyZSBmaWVsZHMgYW5kIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBvdmVybG9hZGVkIGltcGxlbWVudGF0aW9ucyBpbgorICAgICAqICAgICAgICAgICAgICAgICAgIHN1YmNsYXNzZXMKKyAgICAgKiBAcmV0dXJuIHRoZSBzYW1lIGluc3RhbmNlIG9mIGJ1aWxkZXIgYXMgcHJvdmlkZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgPEIgZXh0ZW5kcyBCdWlsZGVyPD8sIEI+PiBCIHVuYnVpbGRUbyhCIGJ1aWxkZXIsIGJvb2xlYW4gc2hhcmVkQ29weSkKKyAgICB7CisgICAgICAgIHJldHVybiBidWlsZGVyLnNldFRhYmxlTWV0YWRhdGFSZWYobWV0YWRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgLnNldENvbXBvbmVudHMoY29tcG9uZW50cykKKyAgICAgICAgICAgICAgICAgICAgICAuc2V0Q2h1bmtDYWNoZShjaHVua0NhY2hlKQorICAgICAgICAgICAgICAgICAgICAgIC5zZXRJT09wdGlvbnMoaW9PcHRpb25zKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBQYXJzZSBhIHNzdGFibGUgZmlsZW5hbWUgaW50byBib3RoIGEge0BsaW5rIERlc2NyaXB0b3J9IGFuZCB7QGNvZGUgQ29tcG9uZW50fSBvYmplY3QuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZW5hbWUgdG8gcGFyc2UuCkBAIC0yMDgsNyArMjM1LDI5IEBACiAgICAgewogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIERlc2NyaXB0b3IuZnJvbUZpbGVuYW1lV2l0aENvbXBvbmVudChmaWxlKTsKKyAgICAgICAgICAgIHJldHVybiBEZXNjcmlwdG9yLmZyb21GaWxlV2l0aENvbXBvbmVudChmaWxlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgYSBzc3RhYmxlIGZpbGVuYW1lIGludG8gYm90aCBhIHtAbGluayBEZXNjcmlwdG9yfSBhbmQge0Bjb2RlIENvbXBvbmVudH0gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgICAgIHRoZSBmaWxlbmFtZSB0byBwYXJzZS4KKyAgICAgKiBAcGFyYW0ga2V5c3BhY2UgVGhlIGtleXNwYWNlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICogQHBhcmFtIHRhYmxlICAgIFRoZSB0YWJsZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAqIEByZXR1cm4gYSBwYWlyIG9mIHRoZSB7QGNvZGUgRGVzY3JpcHRvcn0gYW5kIHtAY29kZSBDb21wb25lbnR9IGNvcnJlc3BvbmRpbmcgdG8ge0Bjb2RlIGZpbGV9IGlmIGl0IGNvcnJlc3BvbmRzIHRvCisgICAgICogYSB2YWxpZCBhbmQgc3VwcG9ydGVkIHNzdGFibGUgZmlsZW5hbWUsIHtAY29kZSBudWxsfSBvdGhlcndpc2UuIE5vdGUgdGhhdCBjb21wb25lbnRzIG9mIGFuIHVua25vd24gdHlwZSB3aWxsIGJlCisgICAgICogcmV0dXJuZWQgYXMgQ1VTVE9NIG9uZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQYWlyPERlc2NyaXB0b3IsIENvbXBvbmVudD4gdHJ5Q29tcG9uZW50RnJvbUZpbGVuYW1lKEZpbGUgZmlsZSwgU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIERlc2NyaXB0b3IuZnJvbUZpbGVXaXRoQ29tcG9uZW50KGZpbGUsIGtleXNwYWNlLCB0YWJsZSk7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQogICAgICAgICB7CkBAIC0yMjYsMTEgKzI3NSwxMSBAQAogICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBEZXNjcmlwdG9yfSBjb3JyZXNwb25kaW5nIHRvIHtAY29kZSBmaWxlfSBpZiBpdCBjb3JyZXNwb25kcyB0byBhIHZhbGlkIGFuZCBzdXBwb3J0ZWQgc3N0YWJsZQogICAgICAqIGZpbGVuYW1lLCB7QGNvZGUgbnVsbH0gb3RoZXJ3aXNlLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRGVzY3JpcHRvciB0cnlEZXNjcmlwdG9yRnJvbUZpbGVuYW1lKEZpbGUgZmlsZSkKKyAgICBwdWJsaWMgc3RhdGljIERlc2NyaXB0b3IgdHJ5RGVzY3JpcHRvckZyb21GaWxlKEZpbGUgZmlsZSkKICAgICB7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gRGVzY3JpcHRvci5mcm9tRmlsZW5hbWUoZmlsZSk7CisgICAgICAgICAgICByZXR1cm4gRGVzY3JpcHRvci5mcm9tRmlsZShmaWxlKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCiAgICAgICAgIHsKQEAgLTIzOCwxNTAgKzI4NywxMCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogRGlzY292ZXJzIGV4aXN0aW5nIGNvbXBvbmVudHMgZm9yIHRoZSBkZXNjcmlwdG9yLiBTbG93OiBvbmx5IGludGVuZGVkIGZvciB1c2Ugb3V0c2lkZSB0aGUgY3JpdGljYWwgcGF0aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHNGb3IoZmluYWwgRGVzY3JpcHRvciBkZXNjKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiByZWFkVE9DKGRlc2MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB8IE5vU3VjaEZpbGVFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gZGlzY292ZXJDb21wb25lbnRzRm9yKGRlc2MpOwotICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7IC8vIHNzdGFibGUgZG9lc24ndCBleGlzdCB5ZXQKLQotICAgICAgICAgICAgICAgIGlmICghY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnQuVE9DKSkKLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoQ29tcG9uZW50LlRPQyk7Ci0gICAgICAgICAgICAgICAgYXBwZW5kVE9DKGRlc2MsIGNvbXBvbmVudHMpOwotICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FcnJvcihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU2V0PENvbXBvbmVudD4gZGlzY292ZXJDb21wb25lbnRzRm9yKERlc2NyaXB0b3IgZGVzYykKLSAgICB7Ci0gICAgICAgIFNldDxDb21wb25lbnQuVHlwZT4ga25vd25UeXBlcyA9IFNldHMuZGlmZmVyZW5jZShDb21wb25lbnQuVFlQRVMsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihDb21wb25lbnQuVHlwZS5DVVNUT00pKTsKLSAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IFNldHMubmV3SGFzaFNldFdpdGhFeHBlY3RlZFNpemUoa25vd25UeXBlcy5zaXplKCkpOwotICAgICAgICBmb3IgKENvbXBvbmVudC5UeXBlIGNvbXBvbmVudFR5cGUgOiBrbm93blR5cGVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb21wb25lbnQgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudChjb21wb25lbnRUeXBlKTsKLSAgICAgICAgICAgIGlmIChuZXcgRmlsZShkZXNjLmZpbGVuYW1lRm9yKGNvbXBvbmVudCkpLmV4aXN0cygpKQotICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKGNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gQW4gZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBrZXlzIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gaW5kZXggZmlsZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGxvbmcgZXN0aW1hdGVSb3dzRnJvbUluZGV4KFJhbmRvbUFjY2Vzc1JlYWRlciBpZmlsZSwgRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIGNvbGxlY3Qgc2l6ZXMgZm9yIHRoZSBmaXJzdCAxMDAwMCBrZXlzLCBvciBmaXJzdCAxMCBtZWJpYnl0ZXMgb2YgZGF0YQotICAgICAgICBmaW5hbCBpbnQgU0FNUExFU19DQVAgPSAxMDAwMCwgQllURVNfQ0FQID0gKGludClNYXRoLm1pbigxMDAwMDAwMCwgaWZpbGUubGVuZ3RoKCkpOwotICAgICAgICBpbnQga2V5cyA9IDA7Ci0gICAgICAgIHdoaWxlIChpZmlsZS5nZXRGaWxlUG9pbnRlcigpIDwgQllURVNfQ0FQICYmIGtleXMgPCBTQU1QTEVTX0NBUCkKLSAgICAgICAgewotICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuc2tpcFNob3J0TGVuZ3RoKGlmaWxlKTsKLSAgICAgICAgICAgIFJvd0luZGV4RW50cnkuU2VyaWFsaXplci5za2lwKGlmaWxlLCBkZXNjcmlwdG9yLnZlcnNpb24pOwotICAgICAgICAgICAga2V5cysrOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydCBrZXlzID4gMCAmJiBpZmlsZS5nZXRGaWxlUG9pbnRlcigpID4gMCAmJiBpZmlsZS5sZW5ndGgoKSA+IDAgOiAiVW5leHBlY3RlZCBlbXB0eSBpbmRleCBmaWxlOiAiICsgaWZpbGU7Ci0gICAgICAgIGxvbmcgZXN0aW1hdGVkUm93cyA9IGlmaWxlLmxlbmd0aCgpIC8gKGlmaWxlLmdldEZpbGVQb2ludGVyKCkgLyBrZXlzKTsKLSAgICAgICAgaWZpbGUuc2VlaygwKTsKLSAgICAgICAgcmV0dXJuIGVzdGltYXRlZFJvd3M7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgYnl0ZXNPbkRpc2soKQotICAgIHsKLSAgICAgICAgbG9uZyBieXRlcyA9IDA7Ci0gICAgICAgIGZvciAoQ29tcG9uZW50IGNvbXBvbmVudCA6IGNvbXBvbmVudHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVzICs9IG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoY29tcG9uZW50KSkubGVuZ3RoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ5dGVzOwotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIigiICsKLSAgICAgICAgICAgICAgICJwYXRoPSciICsgZ2V0RmlsZW5hbWUoKSArICdcJycgKwotICAgICAgICAgICAgICAgJyknOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBsaXN0IG9mIGNvbXBvbmVudHMgZnJvbSB0aGUgVE9DIGNvbXBvbmVudC4KLSAgICAgKiBAcmV0dXJuIHNldCBvZiBjb21wb25lbnRzIGZvdW5kIGluIHRoZSBUT0MKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFNldDxDb21wb25lbnQ+IHJlYWRUT0MoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiByZWFkVE9DKGRlc2NyaXB0b3IsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBsaXN0IG9mIGNvbXBvbmVudHMgZnJvbSB0aGUgVE9DIGNvbXBvbmVudC4KLSAgICAgKiBAcGFyYW0gc2tpcE1pc3NpbmcsIHNraXAgYWRkaW5nIHRoZSBjb21wb25lbnQgdG8gdGhlIHJldHVybmVkIHNldCBpZiB0aGUgY29ycmVzcG9uZGluZyBmaWxlIGlzIG1pc3NpbmcuCi0gICAgICogQHJldHVybiBzZXQgb2YgY29tcG9uZW50cyBmb3VuZCBpbiB0aGUgVE9DCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBTZXQ8Q29tcG9uZW50PiByZWFkVE9DKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgYm9vbGVhbiBza2lwTWlzc2luZykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBGaWxlIHRvY0ZpbGUgPSBuZXcgRmlsZShkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5UT0MpKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGNvbXBvbmVudE5hbWVzID0gRmlsZXMucmVhZEFsbExpbmVzKHRvY0ZpbGUudG9QYXRoKCkpOwotICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gU2V0cy5uZXdIYXNoU2V0V2l0aEV4cGVjdGVkU2l6ZShjb21wb25lbnROYW1lcy5zaXplKCkpOwotICAgICAgICBmb3IgKFN0cmluZyBjb21wb25lbnROYW1lIDogY29tcG9uZW50TmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbXBvbmVudCBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KENvbXBvbmVudC5UeXBlLmZyb21SZXByZXNlbnRhdGlvbihjb21wb25lbnROYW1lKSwgY29tcG9uZW50TmFtZSk7Ci0gICAgICAgICAgICBpZiAoc2tpcE1pc3NpbmcgJiYgIW5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoY29tcG9uZW50KSkuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJNaXNzaW5nIGNvbXBvbmVudDoge30iLCBkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKGNvbXBvbmVudCkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKGNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwZW5kcyBuZXcgY29tcG9uZW50IG5hbWVzIHRvIHRoZSBUT0MgY29tcG9uZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBhcHBlbmRUT0MoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBDb2xsZWN0aW9uPENvbXBvbmVudD4gY29tcG9uZW50cykKLSAgICB7Ci0gICAgICAgIEZpbGUgdG9jRmlsZSA9IG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlRPQykpOwotICAgICAgICB0cnkgKEZpbGVPdXRwdXRTdHJlYW1QbHVzIG91dCA9IHRvY0ZpbGUubmV3T3V0cHV0U3RyZWFtKEFQUEVORCk7Ci0gICAgICAgICAgICAgUHJpbnRXcml0ZXIgdyA9IG5ldyBQcmludFdyaXRlcihvdXQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBjb21wb25lbnRzKQotICAgICAgICAgICAgICAgIHcucHJpbnRsbihjb21wb25lbnQubmFtZSk7Ci0gICAgICAgICAgICB3LmZsdXNoKCk7Ci0gICAgICAgICAgICBvdXQuc3luYygpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRlNXcml0ZUVycm9yKGUsIHRvY0ZpbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIG5ldyBjdXN0b20gY29tcG9uZW50cy4gVXNlZCBieSBjdXN0b20gY29tcGFjdGlvbiBzdHJhdGVnaWVzLgotICAgICAqIEFkZGluZyBhIGNvbXBvbmVudCBmb3IgdGhlIHNlY29uZCB0aW1lIGlzIGEgbm8tb3AuCi0gICAgICogRG9uJ3QgcmVtb3ZlIHRoaXMgLSB0aGlzIG1ldGhvZCBpcyBhIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEksIGludGVuZGVkIGZvciB1c2UgYnkgY3VzdG9tIGNvbXBhY3Rpb24gc3RyYXRlZ2llcy4KLSAgICAgKiBAcGFyYW0gbmV3Q29tcG9uZW50cyBjb2xsZWN0aW9uIG9mIGNvbXBvbmVudHMgdG8gYmUgYWRkZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQ29tcG9uZW50cyhDb2xsZWN0aW9uPENvbXBvbmVudD4gbmV3Q29tcG9uZW50cykKLSAgICB7Ci0gICAgICAgIENvbGxlY3Rpb248Q29tcG9uZW50PiBjb21wb25lbnRzVG9BZGQgPSBDb2xsZWN0aW9uczIuZmlsdGVyKG5ld0NvbXBvbmVudHMsIFByZWRpY2F0ZXMubm90KFByZWRpY2F0ZXMuaW4oY29tcG9uZW50cykpKTsKLSAgICAgICAgYXBwZW5kVE9DKGRlc2NyaXB0b3IsIGNvbXBvbmVudHNUb0FkZCk7Ci0gICAgICAgIGNvbXBvbmVudHMuYWRkQWxsKGNvbXBvbmVudHNUb0FkZCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFic3RyYWN0Qm91bmRzPFRva2VuPiBnZXRCb3VuZHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEFic3RyYWN0Qm91bmRzLmJvdW5kcyhmaXJzdC5nZXRUb2tlbigpLCB0cnVlLCBsYXN0LmdldFRva2VuKCksIHRydWUpOworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXM6JXMocGF0aD0nJXMnKSIsIGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLCBkZXNjcmlwdG9yLnZlcnNpb24uZm9ybWF0Lm5hbWUoKSwgZ2V0RmlsZW5hbWUoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlUmVwYWlyZWRNZXRhZGF0YShsb25nIHJlcGFpcmVkQXQsIFRpbWVVVUlEIHBlbmRpbmdSZXBhaXIsIGJvb2xlYW4gaXNUcmFuc2llbnQpCkBAIC0zOTAsNiArMjk5LDExOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBlbmRpbmdSZXBhaXIgY2Fubm90IGJlIHNldCBvbiBhIHJlcGFpcmVkIHNzdGFibGUiKTsKICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50KCFpc1RyYW5zaWVudCB8fCAocGVuZGluZ1JlcGFpciAhPSBOT19QRU5ESU5HX1JFUEFJUiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXNUcmFuc2llbnQgY2FuIG9ubHkgYmUgdHJ1ZSBmb3Igc3N0YWJsZXMgcGVuZGluZyByZXBhaXIiKTsKKyAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgbmV3IGN1c3RvbSBjb21wb25lbnRzLiBVc2VkIGJ5IGN1c3RvbSBjb21wYWN0aW9uIHN0cmF0ZWdpZXMuCisgICAgICogQWRkaW5nIGEgY29tcG9uZW50IGZvciB0aGUgc2Vjb25kIHRpbWUgaXMgYSBuby1vcC4KKyAgICAgKiBEb24ndCByZW1vdmUgdGhpcyAtIHRoaXMgbWV0aG9kIGlzIGEgcGFydCBvZiB0aGUgcHVibGljIEFQSSwgaW50ZW5kZWQgZm9yIHVzZSBieSBjdXN0b20gY29tcGFjdGlvbiBzdHJhdGVnaWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG5ld0NvbXBvbmVudHMgY29sbGVjdGlvbiBvZiBjb21wb25lbnRzIHRvIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZENvbXBvbmVudHMoQ29sbGVjdGlvbjxDb21wb25lbnQ+IG5ld0NvbXBvbmVudHMpCisgICAgeworICAgICAgICBDb2xsZWN0aW9uPENvbXBvbmVudD4gY29tcG9uZW50c1RvQWRkID0gQ29sbGVjdGlvbnMyLmZpbHRlcihuZXdDb21wb25lbnRzLCBQcmVkaWNhdGVzLm5vdChQcmVkaWNhdGVzLmluKGNvbXBvbmVudHMpKSk7CisgICAgICAgIFRPQ0NvbXBvbmVudC5hcHBlbmRUT0MoZGVzY3JpcHRvciwgY29tcG9uZW50c1RvQWRkKTsKKyAgICAgICAgY29tcG9uZW50cy5hZGRBbGwoY29tcG9uZW50c1RvQWRkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIE93bmVyCisgICAgeworICAgICAgICBEb3VibGUgZ2V0Q3JjQ2hlY2tDaGFuY2UoKTsKKworICAgICAgICBPcE9yZGVyLkJhcnJpZXIgbmV3UmVhZE9yZGVyaW5nQmFycmllcigpOworCisgICAgICAgIFRhYmxlTWV0cmljcyBnZXRNZXRyaWNzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBidWlsZGVyIG9mIHRoaXMgc3N0YWJsZSByZXByZXNlbnRhdGlvbi4gSXQgc2hvdWxkIGJlIGV4dGVuZGVkIGZvciBlYWNoIGltcGxlbWVudGF0aW9uIHdpdGggdGhlIHNwZWNpZmljIGZpZWxkcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8Uz4gdHlwZSBvZiB0aGUgc3N0YWJsZSByZXByZXNlbnRhdGlvbiB0byBiZSBidWlsZCB3aXRoIHRoaXMgYnVpbGRlcgorICAgICAqIEBwYXJhbSA8Qj4gdHlwZSBvZiB0aGlzIGJ1aWxkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXI8UyBleHRlbmRzIFNTVGFibGUsIEIgZXh0ZW5kcyBCdWlsZGVyPFMsIEI+PgorICAgIHsKKyAgICAgICAgcHVibGljIGZpbmFsIERlc2NyaXB0b3IgZGVzY3JpcHRvcjsKKworICAgICAgICBwcml2YXRlIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHM7CisgICAgICAgIHByaXZhdGUgVGFibGVNZXRhZGF0YVJlZiB0YWJsZU1ldGFkYXRhUmVmOworICAgICAgICBwcml2YXRlIENodW5rQ2FjaGUgY2h1bmtDYWNoZSA9IENodW5rQ2FjaGUuaW5zdGFuY2U7CisgICAgICAgIHByaXZhdGUgSU9PcHRpb25zIGlvT3B0aW9ucyA9IElPT3B0aW9ucy5mcm9tRGF0YWJhc2VEZXNjcmlwdG9yKCk7CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIoRGVzY3JpcHRvciBkZXNjcmlwdG9yKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja05vdE51bGwoZGVzY3JpcHRvcik7CisgICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEIgc2V0Q29tcG9uZW50cyhDb2xsZWN0aW9uPENvbXBvbmVudD4gY29tcG9uZW50cykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbXBvbmVudHMgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb21wb25lbnRzLmZvckVhY2goYyAtPiBQcmVjb25kaXRpb25zLmNoZWNrU3RhdGUoYy5pc1ZhbGlkRm9yKGRlc2NyaXB0b3IpLCAiSW52YWxpZCBjb21wb25lbnQgdHlwZSBmb3Igc3N0YWJsZSBmb3JtYXQgIiArIGRlc2NyaXB0b3IudmVyc2lvbi5mb3JtYXQubmFtZSgpKSk7CisgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzID0gSW1tdXRhYmxlU2V0LmNvcHlPZihjb21wb25lbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChCKSB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEIgYWRkQ29tcG9uZW50cyhDb2xsZWN0aW9uPENvbXBvbmVudD4gY29tcG9uZW50cykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbXBvbmVudHMgPT0gbnVsbCB8fCBjb21wb25lbnRzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKEIpIHRoaXM7CisKKyAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2V0Q29tcG9uZW50cyhjb21wb25lbnRzKTsKKworICAgICAgICAgICAgcmV0dXJuIHNldENvbXBvbmVudHMoU2V0cy51bmlvbih0aGlzLmNvbXBvbmVudHMsIEltbXV0YWJsZVNldC5jb3B5T2YoY29tcG9uZW50cykpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCIHNldFRhYmxlTWV0YWRhdGFSZWYoVGFibGVNZXRhZGF0YVJlZiByZWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudGFibGVNZXRhZGF0YVJlZiA9IHJlZjsKKyAgICAgICAgICAgIHJldHVybiAoQikgdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCIHNldENodW5rQ2FjaGUoQ2h1bmtDYWNoZSBjaHVua0NhY2hlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmNodW5rQ2FjaGUgPSBjaHVua0NhY2hlOworICAgICAgICAgICAgcmV0dXJuIChCKSB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEIgc2V0SU9PcHRpb25zKElPT3B0aW9ucyBpb09wdGlvbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaW9PcHRpb25zID0gaW9PcHRpb25zOworICAgICAgICAgICAgcmV0dXJuIChCKSB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNldDxDb21wb25lbnQ+IGdldENvbXBvbmVudHMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50czsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUYWJsZU1ldGFkYXRhUmVmIGdldFRhYmxlTWV0YWRhdGFSZWYoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGFibGVNZXRhZGF0YVJlZjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDaHVua0NhY2hlIGdldENodW5rQ2FjaGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY2h1bmtDYWNoZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJT09wdGlvbnMgZ2V0SU9PcHRpb25zKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGlvT3B0aW9uczsKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZUZsdXNoT2JzZXJ2ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZUZsdXNoT2JzZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjVkOGNiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlRmx1c2hPYnNlcnZlci5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CisKKy8qKgorICogT2JzZXJ2ZXIgZm9yIGV2ZW50cyBpbiB0aGUgbGlmZWN5Y2xlIG9mIHdyaXRpbmcgb3V0IGFuIHNzdGFibGUuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU1NUYWJsZUZsdXNoT2JzZXJ2ZXIKK3sKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYmVmb3JlIHdyaXRpbmcgYW55IGRhdGEgdG8gdGhlIHNzdGFibGUuCisgICAgICovCisgICAgdm9pZCBiZWdpbigpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gYSBuZXcgcGFydGl0aW9uIGluIGJlaW5nIHdyaXR0ZW4gdG8gdGhlIHNzdGFibGUsCisgICAgICogYnV0IGJlZm9yZSBhbnkgY2VsbHMgYXJlIHByb2Nlc3NlZCAoc2VlIHtAbGluayAjbmV4dFVuZmlsdGVyZWRDbHVzdGVyKFVuZmlsdGVyZWQpfSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5ICAgICAgICAgICAgICAgIHRoZSBrZXkgYmVpbmcgYXBwZW5kZWQgdG8gU1NUYWJsZS4KKyAgICAgKiBAcGFyYW0ga2V5UG9zaXRpb24gICAgICAgIHRoZSBwb3NpdGlvbiBvZiB0aGUga2V5IGluIHRoZSBTU1RhYmxlIGRhdGEgZmlsZQorICAgICAqIEBwYXJhbSBLZXlQb3NpdGlvbkZvclNBU0kgU1NUYWJsZSBmb3JtYXQgc3BlY2lmaWMga2V5IHBvc2l0aW9uIGZvciBzdG9yYWdlIGF0dGFjaGVkIGluZGV4ZXMsIGl0IGNhbiBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gZGF0YSBmaWxlIG9yIGluIHNvbWUgaW5kZXggZmlsZS4gSXQgaXMgdGhlIHNhbWUgcG9zaXRpb24gYXMgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBLZXlSZWFkZXIja2V5UG9zaXRpb25Gb3JTZWNvbmRhcnlJbmRleCgpfSBmb3IgdGhlIHNhbWUgZm9ybWF0LCBhbmQgdGhlIHNhbWUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGFzIGV4cGVjdGVkIGJ5IHtAbGluayBTU1RhYmxlUmVhZGVyI2tleUF0UG9zaXRpb25Gcm9tU2Vjb25kYXJ5SW5kZXgobG9uZyl9LgorICAgICAqLworICAgIHZvaWQgc3RhcnRQYXJ0aXRpb24oRGVjb3JhdGVkS2V5IGtleSwgbG9uZyBrZXlQb3NpdGlvbiwgbG9uZyBLZXlQb3NpdGlvbkZvclNBU0kpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gYSBzdGF0aWMgcm93IGlzIGJlaW5nIHdyaXR0ZW4gdG8gdGhlIHNzdGFibGUuIElmIHN0YXRpYyBjb2x1bW5zIGFyZSBwcmVzZW50IGluIHRoZSB0YWJsZSwgaXQgaXMgY2FsbGVkCisgICAgICogYWZ0ZXIge0BsaW5rICNzdGFydFBhcnRpdGlvbihEZWNvcmF0ZWRLZXksIGxvbmcsIGxvbmcpfSBhbmQgYmVmb3JlIGFueSBjYWxscyB0byB7QGxpbmsgI25leHRVbmZpbHRlcmVkQ2x1c3RlcihVbmZpbHRlcmVkKX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdGljUm93IHN0YXRpYyByb3cgYXBwZW5kZWQgdG8gdGhlIHNzdGFibGUsIGNhbiBiZSBlbXB0eSwgbWF5IG5vdCBiZSB7QGNvZGUgbnVsbH0KKyAgICAgKi8KKyAgICB2b2lkIHN0YXRpY1JvdyhSb3cgc3RhdGljUm93KTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCBhZnRlciB0aGUgdW5maWx0ZXJlZCBjbHVzdGVyIGlzIHdyaXR0ZW4gdG8gdGhlIHNzdGFibGUuCisgICAgICogV2lsbCBiZSBwcmVjZWRlZCBieSBhIGNhbGwgdG8ge0Bjb2RlIHN0YXJ0UGFydGl0aW9uKERlY29yYXRlZEtleSwgbG9uZyl9LAorICAgICAqIGFuZCB0aGUgY2x1c3RlciBzaG91bGQgYmUgYXNzdW1lZCB0byBiZWxvbmcgdG8gdGhhdCBwYXJ0aXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdW5maWx0ZXJlZENsdXN0ZXIgVGhlIHVuZmlsdGVyZWQgY2x1c3RlciBiZWluZyBhZGRlZCB0byBTU1RhYmxlLgorICAgICAqLworICAgIHZvaWQgbmV4dFVuZmlsdGVyZWRDbHVzdGVyKFVuZmlsdGVyZWQgdW5maWx0ZXJlZENsdXN0ZXIpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gYWxsIGRhdGEgaXMgd3JpdHRlbiB0byB0aGUgZmlsZSBhbmQgaXQncyByZWFkeSB0byBiZSBmaW5pc2hlZCB1cC4KKyAgICAgKi8KKyAgICB2b2lkIGNvbXBsZXRlKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlSGVhZGVyRml4LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVIZWFkZXJGaXguamF2YQppbmRleCBmNzgyMDBhLi5lNzg1MTk2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVIZWFkZXJGaXguamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVIZWFkZXJGaXguamF2YQpAQCAtMzUsNyArMzUsNiBAQAogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCkBAIC01NCw4ICs1MywxMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuU2V0VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlR1cGxlVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVzZXJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0LkNvbXBvbmVudHMuVHlwZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5JbmRleE1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7CkBAIC02NiwxNSArNjgsMTUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX1NLSVBfQVVUT01BVElDX1VEVF9GSVg7CisKIC8qKgogICogVmFsaWRhdGVzIGFuZCBmaXhlcyB0eXBlIGlzc3VlcyBpbiB0aGUgc2VyaWFsaXphdGlvbi1oZWFkZXIgb2Ygc3N0YWJsZXMuCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTU1RhYmxlSGVhZGVyRml4CiB7CiAgICAgLy8gQyogMy4wIHVwZ3JhZGUgY29kZQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSVBBVVRPTUFUSUNVRFRGSVggPSAiY2Fzc2FuZHJhLnNraXBhdXRvbWF0aWN1ZHRmaXgiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0tJUF9BVVRPTUFUSUNfRklYX09OX1VQR1JBREUgPSBCb29sZWFuLmdldEJvb2xlYW4oU0tJUEFVVE9NQVRJQ1VEVEZJWCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBTS0lQX0FVVE9NQVRJQ19GSVhfT05fVVBHUkFERSA9IENBU1NBTkRSQV9TS0lQX0FVVE9NQVRJQ19VRFRfRklYLmdldEJvb2xlYW4oKTsKIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaXhOb25Gcm96ZW5VRFRJZlVwZ3JhZGVGcm9tMzAoKQogICAgIHsKQEAgLTk0LDcgKzk2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJzc3RhYmxlIG1ldGFkYXRhIHNlcmlhbGl6YXRpb24taGVhZGVycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1ZlcnNpb25TdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5nZXRSZWxlYXNlVmVyc2lvblN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgU0tJUEFVVE9NQVRJQ1VEVEZJWCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDQVNTQU5EUkFfU0tJUF9BVVRPTUFUSUNfVURUX0ZJWC5nZXRLZXkoKSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMzAxLDcgKzMwMyw3IEBACiAgICAgICAgICAgICAgIC5maWx0ZXIocCAtPiB7CiAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGVzY3JpcHRvci5mcm9tRmlsZW5hbWVXaXRoQ29tcG9uZW50KG5ldyBGaWxlKHApKS5yaWdodC50eXBlID09IENvbXBvbmVudC5UeXBlLkRBVEE7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERlc2NyaXB0b3IuZnJvbUZpbGVXaXRoQ29tcG9uZW50KG5ldyBGaWxlKHApKS5yaWdodC50eXBlID09IFR5cGVzLkRBVEE7CiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHQpCiAgICAgICAgICAgICAgICAgICB7CkBAIC0zMDksOCArMzExLDggQEAKICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0pCi0gICAgICAgICAgICAgIC5tYXAoUGF0aDo6dG9TdHJpbmcpCi0gICAgICAgICAgICAgIC5tYXAoRGVzY3JpcHRvcjo6ZnJvbUZpbGVuYW1lKQorICAgICAgICAgICAgICAubWFwKEZpbGU6Om5ldykKKyAgICAgICAgICAgICAgLm1hcChmaWxlIC0+IERlc2NyaXB0b3IuZnJvbUZpbGVXaXRoQ29tcG9uZW50KGZpbGUsIGZhbHNlKS5sZWZ0KQogICAgICAgICAgICAgICAuZm9yRWFjaChkZXNjcmlwdG9yczo6YWRkKTsKICAgICB9CiAKQEAgLTM0Miw4ICszNDQsOCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IFNTVGFibGUuZGlzY292ZXJDb21wb25lbnRzRm9yKGRlc2MpOwotICAgICAgICBpZiAoY29tcG9uZW50cy5zdHJlYW0oKS5ub25lTWF0Y2goYyAtPiBjLnR5cGUgPT0gQ29tcG9uZW50LlR5cGUuU1RBVFMpKQorICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gZGVzYy5kaXNjb3ZlckNvbXBvbmVudHMoKTsKKyAgICAgICAgaWYgKGNvbXBvbmVudHMuc3RyZWFtKCkubm9uZU1hdGNoKGMgLT4gYy50eXBlID09IFR5cGVzLlNUQVRTKSkKICAgICAgICAgewogICAgICAgICAgICAgZXJyb3IoInNzdGFibGUgJXMgaGFzIG5vIC1TdGF0aXN0aWNzLmRiIGNvbXBvbmVudC4iLCBkZXNjKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTg0NSw3ICs4NDcsNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlTmV3TWV0YWRhdGEoRGVzY3JpcHRvciBkZXNjLCBNYXA8TWV0YWRhdGFUeXBlLCBNZXRhZGF0YUNvbXBvbmVudD4gbmV3TWV0YWRhdGEpCiAgICAgewotICAgICAgICBTdHJpbmcgZmlsZSA9IGRlc2MuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlNUQVRTKTsKKyAgICAgICAgRmlsZSBmaWxlID0gZGVzYy5maWxlRm9yKENvbXBvbmVudHMuU1RBVFMpOwogICAgICAgICBpbmZvLmFjY2VwdChTdHJpbmcuZm9ybWF0KCIgIFdyaXRpbmcgbmV3IG1ldGFkYXRhIGZpbGUgJXMiLCBmaWxlKSk7CiAgICAgICAgIHRyeQogICAgICAgICB7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVJZC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlSWQuamF2YQppbmRleCBhM2Q5NWRkLi43YTIyMzViIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVJZC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZUlkLmphdmEKQEAgLTMzLDcgKzMzLDcgQEAKICAqIEEgbmV3IGltcGxlbWVudGF0aW9uIG11c3QgYWRoZXJlIHRvIHRoZSBmb2xsb3dpbmcgaW52YXJpYW50czoKICAqIC0gTXVzdCBiZSBsb2NhbGx5IHNvcnRhYmxlIC0gdGhhdCBpcywgdGhlIGNvbXBhcmlzb24gbXVzdCByZWZsZWN0IHRoZSBjb21wYXJpc29uIG9mIGdlbmVyYXRpb24gdGltZXMgb2YgaWRlbnRpZmllcnMKICAqIGdlbmVyYXRlZCBvbiB0aGUgc2FtZSBub2RlCi0gKiAtIFN0cmluZyByZXByZXNlbnRhdGlvbiBtdXN0ICpub3QqIGluY2x1ZGUgdGhlIHtAbGluayBEZXNjcmlwdG9yI0ZJTEVOQU1FX1NFUEFSQVRPUn0gY2hhcmFjdGVyLCBzZWUge0BsaW5rIERlc2NyaXB0b3IjZnJvbUZpbGVuYW1lV2l0aENvbXBvbmVudChGaWxlKX0KKyAqIC0gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG11c3QgKm5vdCogaW5jbHVkZSB0aGUge0BsaW5rIERlc2NyaXB0b3IjRklMRU5BTUVfU0VQQVJBVE9SfSBjaGFyYWN0ZXIsIHNlZSB7QGxpbmsgRGVzY3JpcHRvciNmcm9tRmlsZVdpdGhDb21wb25lbnQoRmlsZSl9CiAgKiAtIG11c3QgYmUgY2FzZS1pbnNlbnNpdGl2ZSBiZWNhdXNlIHRoZSBzc3RhYmxlcyBjYW4gYmUgc3RvcmVkIG9uIGNhc2UtaW5zZW5zaXRpdmUgZmlsZSBzeXN0ZW0KICAqIDxwPgogICovCkBAIC01MCw3ICs1MCw3IEBACiAgICAgICoge0BsaW5rIEJ1aWxkZXIjZnJvbVN0cmluZyhTdHJpbmcpfQogICAgICAqIDxwPgogICAgICAqIE11c3Qgbm90IGNvbnRhaW4gYW55IHtAbGluayBEZXNjcmlwdG9yI0ZJTEVOQU1FX1NFUEFSQVRPUn0gY2hhcmFjdGVyIGFzIGl0IGlzIHVzZWQgaW4gdGhlIERlc2NyaXB0b3IKLSAgICAgKiBzZWUge0BsaW5rIERlc2NyaXB0b3IjZnJvbUZpbGVuYW1lV2l0aENvbXBvbmVudChGaWxlKX0KKyAgICAgKiBzZWUge0BsaW5rIERlc2NyaXB0b3IjZnJvbUZpbGVXaXRoQ29tcG9uZW50KEZpbGUpfQogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIFN0cmluZyB0b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlSWRlbnRpdHlJdGVyYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlSWRlbnRpdHlJdGVyYXRvci5qYXZhCmluZGV4IDc2ZTEyYzguLmIwNWIzYzMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZUlkZW50aXR5SXRlcmF0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVJZGVudGl0eUl0ZXJhdG9yLmphdmEKQEAgLTE3LDE2ICsxNywyNiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7CiAKLWltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5pby5JT0Vycm9yOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25UaW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlVuZmlsdGVyZWRWYWxpZGF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuRGVzZXJpYWxpemF0aW9uSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuRW5jb2RpbmdTdGF0czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVEYXRhSW5wdXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SYW5kb21BY2Nlc3NSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMudmludC5WSW50Q29kaW5nLlZJbnRPdXRPZlJhbmdlRXhjZXB0aW9uOworCiBwdWJsaWMgY2xhc3MgU1NUYWJsZUlkZW50aXR5SXRlcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhYmxlPFNTVGFibGVJZGVudGl0eUl0ZXJhdG9yPiwgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yCiB7CiAgICAgcHJpdmF0ZSBmaW5hbCBTU1RhYmxlUmVhZGVyIHNzdGFibGU7CkBAIC02OSwxMyArNzksMTYgQEAKICAgICB9CiAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQotICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZUlkZW50aXR5SXRlcmF0b3IgY3JlYXRlKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgRmlsZURhdGFJbnB1dCBkZmlsZSwgUm93SW5kZXhFbnRyeTw/PiBpbmRleEVudHJ5LCBEZWNvcmF0ZWRLZXkga2V5LCBib29sZWFuIHRvbWJzdG9uZU9ubHkpCisgICAgcHVibGljIHN0YXRpYyBTU1RhYmxlSWRlbnRpdHlJdGVyYXRvciBjcmVhdGUoU1NUYWJsZVJlYWRlciBzc3RhYmxlLCBGaWxlRGF0YUlucHV0IGRmaWxlLCBsb25nIGRhdGFQb3NpdGlvbiwgRGVjb3JhdGVkS2V5IGtleSwgYm9vbGVhbiB0b21ic3RvbmVPbmx5KQogICAgIHsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIGRmaWxlLnNlZWsoaW5kZXhFbnRyeS5wb3NpdGlvbik7CisgICAgICAgICAgICBkZmlsZS5zZWVrKGRhdGFQb3NpdGlvbik7CiAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5za2lwU2hvcnRMZW5ndGgoZGZpbGUpOyAvLyBTa2lwIHBhcnRpdGlvbiBrZXkKICAgICAgICAgICAgIERlbGV0aW9uVGltZSBwYXJ0aXRpb25MZXZlbERlbGV0aW9uID0gRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGZpbGUpOworICAgICAgICAgICAgaWYgKCFwYXJ0aXRpb25MZXZlbERlbGV0aW9uLnZhbGlkYXRlKCkpCisgICAgICAgICAgICAgICAgVW5maWx0ZXJlZFZhbGlkYXRpb24uaGFuZGxlSW52YWxpZChzc3RhYmxlLm1ldGFkYXRhKCksIGtleSwgc3N0YWJsZSwgInBhcnRpdGlvbkxldmVsRGVsZXRpb249IitwYXJ0aXRpb25MZXZlbERlbGV0aW9uLnRvU3RyaW5nKCkpOworCiAgICAgICAgICAgICBEZXNlcmlhbGl6YXRpb25IZWxwZXIgaGVscGVyID0gbmV3IERlc2VyaWFsaXphdGlvbkhlbHBlcihzc3RhYmxlLm1ldGFkYXRhKCksIHNzdGFibGUuZGVzY3JpcHRvci52ZXJzaW9uLmNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uKCksIERlc2VyaWFsaXphdGlvbkhlbHBlci5GbGFnLkxPQ0FMKTsKICAgICAgICAgICAgIFNTVGFibGVTaW1wbGVJdGVyYXRvciBpdGVyYXRvciA9IHRvbWJzdG9uZU9ubHkKICAgICAgICAgICAgICAgICAgICAgPyBTU1RhYmxlU2ltcGxlSXRlcmF0b3IuY3JlYXRlVG9tYnN0b25lT25seShzc3RhYmxlLm1ldGFkYXRhKCksIGRmaWxlLCBzc3RhYmxlLmhlYWRlciwgaGVscGVyLCBwYXJ0aXRpb25MZXZlbERlbGV0aW9uKQpAQCAtMTI1LDcgKzEzOCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5oYXNOZXh0KCk7CiAgICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkKKyAgICAgICAgY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gfCBWSW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKQogICAgICAgICB7CiAgICAgICAgICAgICBzc3RhYmxlLm1hcmtTdXNwZWN0KCk7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24oZSwgZmlsZW5hbWUpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlTG9hZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVMb2FkZXIuamF2YQppbmRleCA3ZGRiZTcyLi4xODdkNmNlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVMb2FkZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVMb2FkZXIuamF2YQpAQCAtMTcsMjUgKzE3LDQzIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKIAotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5IYXNoTXVsdGltYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aW1hcDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnN0cmVhbWluZy5DYXNzYW5kcmFPdXRnb2luZ0ZpbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnN0cmVhbWluZy5DYXNzYW5kcmFPdXRnb2luZ0ZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU0Vycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuT3V0Z29pbmdTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlByZXZpZXdLaW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1FdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtRXZlbnRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1PcGVyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbVBsYW47CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbVJlc3VsdEZ1dHVyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtU3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbWluZ0NoYW5uZWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT3V0cHV0SGFuZGxlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWY7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbWluZ0NoYW5uZWwuRmFjdG9yeS5HbG9iYWwuc3RyZWFtaW5nRmFjdG9yeTsKQEAgLTQ4LDEzICs2NiwxMyBAQAogewogICAgIHByaXZhdGUgZmluYWwgRmlsZSBkaXJlY3Rvcnk7CiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcga2V5c3BhY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGFibGU7CiAgICAgcHJpdmF0ZSBmaW5hbCBDbGllbnQgY2xpZW50OwogICAgIHByaXZhdGUgZmluYWwgaW50IGNvbm5lY3Rpb25zUGVySG9zdDsKICAgICBwcml2YXRlIGZpbmFsIE91dHB1dEhhbmRsZXIgb3V0cHV0SGFuZGxlcjsKICAgICBwcml2YXRlIGZpbmFsIFNldDxJbmV0QWRkcmVzc0FuZFBvcnQ+IGZhaWxlZEhvc3RzID0gbmV3IEhhc2hTZXQ8PigpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFNTVGFibGVSZWFkZXI+IHNzdGFibGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNdWx0aW1hcDxJbmV0QWRkcmVzc0FuZFBvcnQsIE91dGdvaW5nU3RyZWFtPiBzdHJlYW1pbmdEZXRhaWxzID0gSGFzaE11bHRpbWFwLmNyZWF0ZSgpOwogCiAgICAgcHVibGljIFNTVGFibGVMb2FkZXIoRmlsZSBkaXJlY3RvcnksIENsaWVudCBjbGllbnQsIE91dHB1dEhhbmRsZXIgb3V0cHV0SGFuZGxlcikKICAgICB7CkBAIC02MywxOCArODEsMjUgQEAKIAogICAgIHB1YmxpYyBTU1RhYmxlTG9hZGVyKEZpbGUgZGlyZWN0b3J5LCBDbGllbnQgY2xpZW50LCBPdXRwdXRIYW5kbGVyIG91dHB1dEhhbmRsZXIsIGludCBjb25uZWN0aW9uc1Blckhvc3QsIFN0cmluZyB0YXJnZXRLZXlzcGFjZSkKICAgICB7CisgICAgICAgIHRoaXMoZGlyZWN0b3J5LCBjbGllbnQsIG91dHB1dEhhbmRsZXIsIGNvbm5lY3Rpb25zUGVySG9zdCwgdGFyZ2V0S2V5c3BhY2UsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBTU1RhYmxlTG9hZGVyKEZpbGUgZGlyZWN0b3J5LCBDbGllbnQgY2xpZW50LCBPdXRwdXRIYW5kbGVyIG91dHB1dEhhbmRsZXIsIGludCBjb25uZWN0aW9uc1Blckhvc3QsIFN0cmluZyB0YXJnZXRLZXlzcGFjZSwgU3RyaW5nIHRhcmdldFRhYmxlKQorICAgIHsKICAgICAgICAgdGhpcy5kaXJlY3RvcnkgPSBkaXJlY3Rvcnk7CiAgICAgICAgIHRoaXMua2V5c3BhY2UgPSB0YXJnZXRLZXlzcGFjZSAhPSBudWxsID8gdGFyZ2V0S2V5c3BhY2UgOiBkaXJlY3RvcnkucGFyZW50KCkubmFtZSgpOworICAgICAgICB0aGlzLnRhYmxlID0gdGFyZ2V0VGFibGU7CiAgICAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50OwogICAgICAgICB0aGlzLm91dHB1dEhhbmRsZXIgPSBvdXRwdXRIYW5kbGVyOwogICAgICAgICB0aGlzLmNvbm5lY3Rpb25zUGVySG9zdCA9IGNvbm5lY3Rpb25zUGVySG9zdDsKICAgICB9CiAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQotICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IG9wZW5TU1RhYmxlcyhmaW5hbCBNYXA8SW5ldEFkZHJlc3NBbmRQb3J0LCBDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4+IHJhbmdlcykKKyAgICBwcml2YXRlIE11bHRpbWFwPEluZXRBZGRyZXNzQW5kUG9ydCwgQ2Fzc2FuZHJhT3V0Z29pbmdGaWxlPiBvcGVuU1NUYWJsZXMoZmluYWwgTWFwPEluZXRBZGRyZXNzQW5kUG9ydCwgQ29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+PiByYW5nZXMpCiAgICAgewogICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dCgiT3BlbmluZyBzc3RhYmxlcyBhbmQgY2FsY3VsYXRpbmcgc2VjdGlvbnMgdG8gc3RyZWFtIik7CiAKKyAgICAgICAgTXVsdGltYXA8SW5ldEFkZHJlc3NBbmRQb3J0LCBDYXNzYW5kcmFPdXRnb2luZ0ZpbGU+IHN0cmVhbWluZ0RldGFpbHMgPSBIYXNoTXVsdGltYXAuY3JlYXRlKCk7CiAgICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uLmdldEZpbGVzKGRpcmVjdG9yeS50b1BhdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGUsIHR5cGUpIC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKQEAgLTg3LDE1ICsxMTIsMjcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaXI8RGVzY3JpcHRvciwgQ29tcG9uZW50PiBwID0gU1NUYWJsZS50cnlDb21wb25lbnRGcm9tRmlsZW5hbWUoZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWlyPERlc2NyaXB0b3IsIENvbXBvbmVudD4gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IGtleXNwYWNlICYmIG51bGwgIT0gdGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IFNTVGFibGUudHJ5Q29tcG9uZW50RnJvbUZpbGVuYW1lKGZpbGUsIGtleXNwYWNlLCB0YWJsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IFNTVGFibGUudHJ5Q29tcG9uZW50RnJvbUZpbGVuYW1lKGZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBwID09IG51bGwgPyBudWxsIDogcC5sZWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT0gbnVsbCB8fCAhcC5yaWdodC5lcXVhbHMoQ29tcG9uZW50LkRBVEEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT0gbnVsbCB8fCAhcC5yaWdodC5lcXVhbHMoQ29tcG9uZW50cy5EQVRBKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmV3IEZpbGUoZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuUFJJTUFSWV9JTkRFWCkpLmV4aXN0cygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChDb21wb25lbnQgYyA6IGRlc2MuZ2V0Rm9ybWF0KCkucHJpbWFyeUNvbXBvbmVudHMoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dChTdHJpbmcuZm9ybWF0KCJTa2lwcGluZyBmaWxlICVzIGJlY2F1c2UgaW5kZXggaXMgbWlzc2luZyIsIG5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXNjLmZpbGVGb3IoYykuZXhpc3RzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dChTdHJpbmcuZm9ybWF0KCJTa2lwcGluZyBmaWxlICVzIGJlY2F1c2UgJXMgaXMgbWlzc2luZyIsIG5hbWUsIGMubmFtZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhID0gY2xpZW50LmdldFRhYmxlTWV0YWRhdGEoZGVzYy5jZm5hbWUpOwpAQCAtMTA1LDIyICsxNDIsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnQuREFUQSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnQuUFJJTUFSWV9JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3IEZpbGUoZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuU1VNTUFSWSkpLmV4aXN0cygpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudC5TVU1NQVJZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXcgRmlsZShkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5DT01QUkVTU0lPTl9JTkZPKSkuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoQ29tcG9uZW50LkNPTVBSRVNTSU9OX0lORk8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ldyBGaWxlKGRlc2MuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlNUQVRTKSkuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoQ29tcG9uZW50LlNUQVRTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBkZXNjLmdldENvbXBvbmVudHMoZGVzYy5nZXRGb3JtYXQoKS5wcmltYXJ5Q29tcG9uZW50cygpLCBkZXNjLmdldEZvcm1hdCgpLnVwbG9hZENvbXBvbmVudHMoKSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvIGNvbnNlcnZlIG1lbW9yeSwgb3BlbiBTU1RhYmxlUmVhZGVycyB3aXRob3V0IGJsb29tIGZpbHRlcnMgYW5kIGRpc2NhcmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5kZXggc3VtbWFyeSBhZnRlciBjYWxjdWxhdGluZyB0aGUgZmlsZSBzZWN0aW9ucyB0byBzdHJlYW0gYW5kIHRoZSBlc3RpbWF0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2Yga2V5cyBmb3IgZWFjaCBlbmRwb2ludC4gU2VlIENBU1NBTkRSQS01NTU1IGZvciBkZXRhaWxzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IFNTVGFibGVSZWFkZXIub3BlbkZvckJhdGNoKGRlc2MsIGNvbXBvbmVudHMsIG1ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBTU1RhYmxlUmVhZGVyLm9wZW5Gb3JCYXRjaChudWxsLCBkZXNjLCBjb21wb25lbnRzLCBtZXRhZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZXMuYWRkKHNzdGFibGUpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBzc3RhYmxlIHNlY3Rpb25zIHRvIHN0cmVhbSBhcyB3ZWxsIGFzIHRoZSBlc3RpbWF0ZWQgbnVtYmVyIG9mCkBAIC0xMzgsMTIgKzE2NywxMiBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZXN0aW1hdGVkS2V5cyA9IHNzdGFibGUuZXN0aW1hdGVkS2V5c0ZvclJhbmdlcyh0b2tlblJhbmdlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZjxTU1RhYmxlUmVhZGVyPiByZWYgPSBzc3RhYmxlLnJlZigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRnb2luZ1N0cmVhbSBzdHJlYW0gPSBuZXcgQ2Fzc2FuZHJhT3V0Z29pbmdGaWxlKFN0cmVhbU9wZXJhdGlvbi5CVUxLX0xPQUQsIHJlZiwgc3N0YWJsZVNlY3Rpb25zLCB0b2tlblJhbmdlcywgZXN0aW1hdGVkS2V5cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc3NhbmRyYU91dGdvaW5nRmlsZSBzdHJlYW0gPSBuZXcgQ2Fzc2FuZHJhT3V0Z29pbmdGaWxlKFN0cmVhbU9wZXJhdGlvbi5CVUxLX0xPQUQsIHJlZiwgc3N0YWJsZVNlY3Rpb25zLCB0b2tlblJhbmdlcywgZXN0aW1hdGVkS2V5cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbWluZ0RldGFpbHMucHV0KGVuZHBvaW50LCBzdHJlYW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGNvbnNlcnZlIGhlYXAgc3BhY2Ugd2hlbiBidWxrIGxvYWRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLnJlbGVhc2VTdW1tYXJ5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5yZWxlYXNlSW5NZW1vcnlDb21wb25lbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRlNFcnJvciBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewpAQCAtMTU0LDcgKzE4Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdG9yaWVzLk9uVHhuRXJyLklHTk9SRSk7CiAKLSAgICAgICAgcmV0dXJuIHNzdGFibGVzOworICAgICAgICByZXR1cm4gc3RyZWFtaW5nRGV0YWlsczsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyZWFtUmVzdWx0RnV0dXJlIHN0cmVhbSgpCkBAIC0xNzAsMTQgKzE5OSwxNCBAQAogICAgICAgICBTdHJlYW1QbGFuIHBsYW4gPSBuZXcgU3RyZWFtUGxhbihTdHJlYW1PcGVyYXRpb24uQlVMS19MT0FELCBjb25uZWN0aW9uc1Blckhvc3QsIGZhbHNlLCBudWxsLCBQcmV2aWV3S2luZC5OT05FKS5jb25uZWN0aW9uRmFjdG9yeShjbGllbnQuZ2V0Q29ubmVjdGlvbkZhY3RvcnkoKSk7CiAKICAgICAgICAgTWFwPEluZXRBZGRyZXNzQW5kUG9ydCwgQ29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+PiBlbmRwb2ludFRvUmFuZ2VzID0gY2xpZW50LmdldEVuZHBvaW50VG9SYW5nZXNNYXAoKTsKLSAgICAgICAgb3BlblNTVGFibGVzKGVuZHBvaW50VG9SYW5nZXMpOwotICAgICAgICBpZiAoc3N0YWJsZXMuaXNFbXB0eSgpKQorICAgICAgICBNdWx0aW1hcDxJbmV0QWRkcmVzc0FuZFBvcnQsIENhc3NhbmRyYU91dGdvaW5nRmlsZT4gc3RyZWFtaW5nRGV0YWlscyA9IG9wZW5TU1RhYmxlcyhlbmRwb2ludFRvUmFuZ2VzKTsKKyAgICAgICAgaWYgKHN0cmVhbWluZ0RldGFpbHMuaXNFbXB0eSgpKQogICAgICAgICB7CiAgICAgICAgICAgICAvLyByZXR1cm4gZW1wdHkgcmVzdWx0CiAgICAgICAgICAgICByZXR1cm4gcGxhbi5leGVjdXRlKCk7CiAgICAgICAgIH0KIAotICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dChTdHJpbmcuZm9ybWF0KCJTdHJlYW1pbmcgcmVsZXZhbnQgcGFydCBvZiAlcyB0byAlcyIsIG5hbWVzKHNzdGFibGVzKSwgZW5kcG9pbnRUb1Jhbmdlcy5rZXlTZXQoKSkpOworICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dChTdHJpbmcuZm9ybWF0KCJTdHJlYW1pbmcgcmVsZXZhbnQgcGFydCBvZiAlcyB0byAlcyIsIG5hbWVzKHN0cmVhbWluZ0RldGFpbHMudmFsdWVzKCkpLCBlbmRwb2ludFRvUmFuZ2VzLmtleVNldCgpKSk7CiAKICAgICAgICAgZm9yIChNYXAuRW50cnk8SW5ldEFkZHJlc3NBbmRQb3J0LCBDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4+IGVudHJ5IDogZW5kcG9pbnRUb1Jhbmdlcy5lbnRyeVNldCgpKQogICAgICAgICB7CkBAIC0xODUsMTMgKzIxNCw4IEBACiAgICAgICAgICAgICBpZiAodG9JZ25vcmUuY29udGFpbnMocmVtb3RlKSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAgICAgTGlzdDxPdXRnb2luZ1N0cmVhbT4gc3RyZWFtcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKLQogICAgICAgICAgICAgLy8gcmVmZXJlbmNlcyBhcmUgYWNxdWlyZWQgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIFNTVGFibGVTdHJlYW1pbmdTZWN0aW9ucyBhYm92ZQotICAgICAgICAgICAgZm9yIChPdXRnb2luZ1N0cmVhbSBzdHJlYW0gOiBzdHJlYW1pbmdEZXRhaWxzLmdldChyZW1vdGUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmVhbXMuYWRkKHN0cmVhbSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBMaXN0PE91dGdvaW5nU3RyZWFtPiBzdHJlYW1zID0gbmV3IExpbmtlZExpc3Q8PihzdHJlYW1pbmdEZXRhaWxzLmdldChyZW1vdGUpKTsKIAogICAgICAgICAgICAgcGxhbi50cmFuc2ZlclN0cmVhbXMocmVtb3RlLCBzdHJlYW1zKTsKICAgICAgICAgfQpAQCAtMjEzLDEwICsyMzcsMTMgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcmVsZWFzZVJlZmVyZW5jZXMoKQogICAgIHsKLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcykKKyAgICAgICAgSXRlcmF0b3I8U1NUYWJsZVJlYWRlcj4gaXQgPSBzc3RhYmxlcy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQogICAgICAgICB7CisgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBpdC5uZXh0KCk7CiAgICAgICAgICAgICBzc3RhYmxlLnNlbGZSZWYoKS5yZWxlYXNlKCk7CiAgICAgICAgICAgICBhc3NlcnQgc3N0YWJsZS5zZWxmUmVmKCkuZ2xvYmFsQ291bnQoKSA9PSAwIDogU3RyaW5nLmZvcm1hdCgiZm9yIHNzdGFibGUgPSAlcywgcmVmIGNvdW50ID0gJWQiLCBzc3RhYmxlLCBzc3RhYmxlLnNlbGZSZWYoKS5nbG9iYWxDb3VudCgpKTsKKyAgICAgICAgICAgIGl0LnJlbW92ZSgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMzAsMTIgKzI1Nyw5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lcyhDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IHNzdGFibGVzKQorICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzKENvbGxlY3Rpb248Q2Fzc2FuZHJhT3V0Z29pbmdGaWxlPiBzc3RhYmxlcykKICAgICB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCi0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpKS5hcHBlbmQoIiAiKTsKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIHNzdGFibGVzLnN0cmVhbSgpLm1hcChDYXNzYW5kcmFPdXRnb2luZ0ZpbGU6OmdldE5hbWUpLmRpc3RpbmN0KCkuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiAiKSk7CiAgICAgfQogCiAgICAgcHVibGljIFNldDxJbmV0QWRkcmVzc0FuZFBvcnQ+IGdldEZhaWxlZEhvc3RzKCkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVJlYWRzTGlzdGVuZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVJlYWRzTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjQ5NGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlUmVhZHNMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFjaW5nLlRyYWNpbmc7CisKKy8qKgorICogTGlzdGVuZXIgZm9yIHJlY2VpdmluZyBub3RpZmljYXRpb25zIGFzc29jaWF0ZWQgd2l0aCByZWFkaW5nIFNTVGFibGVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFNTVGFibGVSZWFkc0xpc3RlbmVyCit7CisgICAgLyoqCisgICAgICogVGhlIHJlYXNvbnMgZm9yIHNraXBwaW5nIGFuIFNTVGFibGUKKyAgICAgKi8KKyAgICBlbnVtIFNraXBwaW5nUmVhc29uCisgICAgeworICAgICAgICBCTE9PTV9GSUxURVIoIkJsb29tIGZpbHRlciBhbGxvd3Mgc2tpcHBpbmcgc3N0YWJsZSB7fSIpLAorICAgICAgICBNSU5fTUFYX0tFWVMoIkNoZWNrIGFnYWluc3QgbWluIGFuZCBtYXgga2V5cyBhbGxvd3Mgc2tpcHBpbmcgc3N0YWJsZSB7fSIpLAorICAgICAgICBQQVJUSVRJT05fSU5ERVhfTE9PS1VQKCJQYXJ0aXRpb24gaW5kZXggbG9va3VwIGFsbG93cyBza2lwcGluZyBzc3RhYmxlIHt9IiksCisgICAgICAgIElOREVYX0VOVFJZX05PVF9GT1VORCgiUGFydGl0aW9uIGluZGV4IGxvb2t1cCBjb21wbGV0ZSAoYmxvb20gZmlsdGVyIGZhbHNlIHBvc2l0aXZlKSBmb3Igc3N0YWJsZSB7fSIpOworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CisKKyAgICAgICAgU2tpcHBpbmdSZWFzb24oU3RyaW5nIG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB0cmFjZShEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYWNpbmcudHJhY2UobWVzc2FnZSwgZGVzY3JpcHRvci5pZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVhc29ucyBmb3Igc2VsZWN0aW5nIGFuIFNTVGFibGUKKyAgICAgKi8KKyAgICBlbnVtIFNlbGVjdGlvblJlYXNvbgorICAgIHsKKyAgICAgICAgS0VZX0NBQ0hFX0hJVCgiS2V5IGNhY2hlIGhpdCBmb3Igc3N0YWJsZSB7fSwgc2l6ZSA9IHt9IiksCisgICAgICAgIElOREVYX0VOVFJZX0ZPVU5EKCJQYXJ0aXRpb24gaW5kZXggZm91bmQgZm9yIHNzdGFibGUge30sIHNpemUgPSB7fSIpOworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CisKKyAgICAgICAgU2VsZWN0aW9uUmVhc29uKFN0cmluZyBtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdHJhY2UoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBBYnN0cmFjdFJvd0luZGV4RW50cnkgZW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYWNpbmcudHJhY2UobWVzc2FnZSwgZGVzY3JpcHRvci5pZCwgZW50cnkuYmxvY2tDb3VudCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIExpc3RlbmVyIHRoYXQgZG9lcyBub3RoaW5nLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBTU1RhYmxlUmVhZHNMaXN0ZW5lciBOT09QX0xJU1RFTkVSID0gbmV3IFNTVGFibGVSZWFkc0xpc3RlbmVyKCkge307CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVzIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzcGVjaWZpZWQgU1NUYWJsZSBoYXMgYmVlbiBza2lwcGVkIGR1cmluZyBhIHNpbmdsZSBwYXJ0aXRpb24gcXVlcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3N0YWJsZSB0aGUgU1NUYWJsZSByZWFkZXIKKyAgICAgKiBAcGFyYW0gcmVhc29uIHRoZSByZWFzb24gZm9yIHdoaWNoIHRoZSBTU1RhYmxlIGhhcyBiZWVuIHNraXBwZWQKKyAgICAgKi8KKyAgICBkZWZhdWx0IHZvaWQgb25TU1RhYmxlU2tpcHBlZChTU1RhYmxlUmVhZGVyIHNzdGFibGUsIFNraXBwaW5nUmVhc29uIHJlYXNvbikKKyAgICB7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFuZGxlcyBub3RpZmljYXRpb24gdGhhdCB0aGUgc3BlY2lmaWVkIFNTVGFibGUgaGFzIGJlZW4gc2VsZWN0ZWQgZHVyaW5nIGEgc2luZ2xlIHBhcnRpdGlvbiBxdWVyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzc3RhYmxlIHRoZSBTU1RhYmxlIHJlYWRlcgorICAgICAqIEBwYXJhbSBpbmRleEVudHJ5IHRoZSBpbmRleCBlbnRyeQorICAgICAqIEBwYXJhbSByZWFzb24gdGhlIHJlYXNvbiBmb3Igd2hpY2ggdGhlIFNTVGFibGUgaGFzIGJlZW4gc2VsZWN0ZWQKKyAgICAgKi8KKyAgICBkZWZhdWx0IHZvaWQgb25TU1RhYmxlU2VsZWN0ZWQoU1NUYWJsZVJlYWRlciBzc3RhYmxlLCBTZWxlY3Rpb25SZWFzb24gcmVhc29uKQorICAgIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVzIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzcGVjaWZpZWQgU1NUYWJsZSBpcyBiZWluZyBzY2FubmVkIGR1cmluZyBhIHBhcnRpdGlvbiByYW5nZSBxdWVyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzc3RhYmxlIHRoZSBTU1RhYmxlIHJlYWRlciBvZiB0aGUgU1NUYWJsZSBiZWluZyBzY2FubmVkLgorICAgICAqLworICAgIGRlZmF1bHQgdm9pZCBvblNjYW5uaW5nU3RhcnRlZChTU1RhYmxlUmVhZGVyIHNzdGFibGUpCisgICAgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVJld3JpdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVSZXdyaXRlci5qYXZhCmluZGV4IGUzOTRiYmQuLjgyYWU0ZGMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVJld3JpdGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlUmV3cml0ZXIuamF2YQpAQCAtMTcsMjIgKzE3LDE4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKIAotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5JbnN0cnVtZW50aW5nQ2FjaGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuS2V5Q2FjaGVLZXk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93SW5kZXhFbnRyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuSUxpZmVjeWNsZVRyYW5zYWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5OYXRpdmVMaWJyYXJ5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuVHJhbnNhY3Rpb25hbDsKIAogLyoqCkBAIC00MywxMiArMzksMTIgQEAKICAqIGZvciBvbi1jbG9zZSAoaS5lLiB3aGVuIGFsbCByZWZlcmVuY2VzIGV4cGlyZSkgdGhhdCBkcm9wcyB0aGUgcGFnZSBjYWNoZSBwcmlvciB0byB0aGF0IGtleSBwb3NpdGlvbgogICoKICAqIGhhcmQtbGlua3MgYXJlIGNyZWF0ZWQgZm9yIGVhY2ggcGFydGlhbGx5IHdyaXR0ZW4gc3N0YWJsZSBzbyB0aGF0IHJlYWRlcnMgb3BlbmVkIGFnYWluc3QgdGhlbSBjb250aW51ZSB0byB3b3JrIHBhc3QKLSAqIHRoZSByZW5hbWUgb2YgdGhlIHRlbXBvcmFyeSBmaWxlLCB3aGljaCBpcyBkZWxldGVkIG9uY2UgYWxsIHJlYWRlcnMgYWdhaW5zdCB0aGUgaGFyZC1saW5rIGhhdmUgYmVlbiBjbG9zZWQuCisgKiByZW5hbWluZyBvZiB0aGUgdGVtcG9yYXJ5IGZpbGUsIHdoaWNoIGlzIGRlbGV0ZWQgb25jZSBhbGwgcmVhZGVycyBhZ2FpbnN0IHRoZSBoYXJkLWxpbmsgaGF2ZSBiZWVuIGNsb3NlZC4KICAqIElmIGZvciBhbnkgcmVhc29uIHRoZSB3cml0ZXIgaXMgcm9sbGVkIG92ZXIsIHdlIGltbWVkaWF0ZWx5IHJlbmFtZSBhbmQgZnVsbHkgZXhwb3NlIHRoZSBjb21wbGV0ZWQgZmlsZSBpbiB0aGUgVHJhY2tlci4KICAqCi0gKiBPbiBhYm9ydCB3ZSByZXN0b3JlIHRoZSBvcmlnaW5hbCBsb3dlciBib3VuZHMgdG8gdGhlIGV4aXN0aW5nIHJlYWRlcnMgYW5kIGRlbGV0ZSBhbnkgdGVtcG9yYXJ5IGZpbGVzIHdlIGhhZCBpbiBwcm9ncmVzcywKLSAqIGJ1dCBsZWF2ZSBhbnkgaGFyZC1saW5rcyBpbiBwbGFjZSBmb3IgdGhlIHJlYWRlcnMgd2Ugb3BlbmVkIHRvIGNsZWFudXAgd2hlbiB0aGV5J3JlIGZpbmlzaGVkIGFzIHdlIHdvdWxkIGhhZCB3ZSBmaW5pc2hlZAotICogc3VjY2Vzc2Z1bGx5LgorICogT24gYWJvcnQsIHdlIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGxvd2VyIGJvdW5kcyB0byB0aGUgZXhpc3RpbmcgcmVhZGVycyBhbmQgZGVsZXRlIGFueSB0ZW1wb3JhcnkgZmlsZXMgd2UgaGFkIGluIHByb2dyZXNzLAorICogYnV0IGxlYXZlIGFueSBoYXJkLWxpbmtzIGluIHBsYWNlIGZvciB0aGUgcmVhZGVycyB3ZSBvcGVuZWQsIGFuZCBjbGVhbi11cCB3aGVuIHRoZSByZWFkZXJzIGZpbmlzaCBhcyB3ZSB3b3VsZCBkbworICogaWYgd2UgaGFkIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseS4KICAqLwogcHVibGljIGNsYXNzIFNTVGFibGVSZXdyaXRlciBleHRlbmRzIFRyYW5zYWN0aW9uYWwuQWJzdHJhY3RUcmFuc2FjdGlvbmFsIGltcGxlbWVudHMgVHJhbnNhY3Rpb25hbAogewpAQCAtNjksNyArNjUsNiBAQAogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBlYWdlcldyaXRlck1ldGFSZWxlYXNlOyAvLyB0cnVlIGlmIHRoZSB3cml0ZXIgbWV0YWRhdGEgc2hvdWxkIGJlIHJlbGVhc2VkIHdoZW4gc3dpdGNoIGlzIGNhbGxlZAogCiAgICAgcHJpdmF0ZSBTU1RhYmxlV3JpdGVyIHdyaXRlcjsKLSAgICBwcml2YXRlIE1hcDxEZWNvcmF0ZWRLZXksIFJvd0luZGV4RW50cnk+IGNhY2hlZEtleXMgPSBuZXcgSGFzaE1hcDw+KCk7CiAKICAgICAvLyBmb3IgdGVzdGluZyAoVE9ETzogcmVtb3ZlIHdoZW4gaGF2ZSBieXRlbWFuIHNldHVwKQogICAgIHByaXZhdGUgYm9vbGVhbiB0aHJvd0Vhcmx5LCB0aHJvd0xhdGU7CkBAIC0xMTcsMzEgKzExMiwxNiBAQAogICAgICAgICByZXR1cm4gd3JpdGVyOwogICAgIH0KIAotICAgIHB1YmxpYyBSb3dJbmRleEVudHJ5IGFwcGVuZChVbmZpbHRlcmVkUm93SXRlcmF0b3IgcGFydGl0aW9uKQorICAgIHB1YmxpYyBBYnN0cmFjdFJvd0luZGV4RW50cnkgYXBwZW5kKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBwYXJ0aXRpb24pCiAgICAgewotICAgICAgICAvLyB3ZSBkbyB0aGlzIGJlZm9yZSBhcHBlbmRpbmcgdG8gZW5zdXJlIHdlIGNhbiByZXNldEFuZFRydW5jYXRlKCkgc2FmZWx5IGlmIHRoZSBhcHBlbmQgZmFpbHMKKyAgICAgICAgLy8gd2UgZG8gdGhpcyBiZWZvcmUgYXBwZW5kaW5nIHRvIGVuc3VyZSB3ZSBjYW4gcmVzZXRBbmRUcnVuY2F0ZSgpIHNhZmVseSBpZiBhcHBlbmRpbmcgZmFpbHMKICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IHBhcnRpdGlvbi5wYXJ0aXRpb25LZXkoKTsKICAgICAgICAgbWF5YmVSZW9wZW5FYXJseShrZXkpOwotICAgICAgICBSb3dJbmRleEVudHJ5IGluZGV4ID0gd3JpdGVyLmFwcGVuZChwYXJ0aXRpb24pOwotICAgICAgICBpZiAoRGF0YWJhc2VEZXNjcmlwdG9yLnNob3VsZE1pZ3JhdGVLZXljYWNoZU9uQ29tcGFjdGlvbigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXRyYW5zYWN0aW9uLmlzT2ZmbGluZSgpICYmIGluZGV4ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHJlYWRlciA6IHRyYW5zYWN0aW9uLm9yaWdpbmFscygpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRDYWNoZWRQb3NpdGlvbihrZXksIGZhbHNlKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRLZXlzLnB1dChrZXksIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgcmV0dXJuIHdyaXRlci5hcHBlbmQocGFydGl0aW9uKTsKICAgICB9CiAKICAgICAvLyBhdHRlbXB0cyB0byBhcHBlbmQgdGhlIHJvdywgaWYgZmFpbHMgcmVzZXRzIHRoZSB3cml0ZXIgcG9zaXRpb24KLSAgICBwdWJsaWMgUm93SW5kZXhFbnRyeSB0cnlBcHBlbmQoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHBhcnRpdGlvbikKKyAgICBwdWJsaWMgQWJzdHJhY3RSb3dJbmRleEVudHJ5IHRyeUFwcGVuZChVbmZpbHRlcmVkUm93SXRlcmF0b3IgcGFydGl0aW9uKQogICAgIHsKICAgICAgICAgd3JpdGVyLm1hcmsoKTsKICAgICAgICAgdHJ5CkBAIC0xNjMsMjAgKzE0MywxOCBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciByZWFkZXIgOiB0cmFuc2FjdGlvbi5vcmlnaW5hbHMoKSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFJvd0luZGV4RW50cnkgaW5kZXggPSByZWFkZXIuZ2V0UG9zaXRpb24oa2V5LCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkdFKTsKLSAgICAgICAgICAgICAgICAgICAgTmF0aXZlTGlicmFyeS50cnlTa2lwQ2FjaGUocmVhZGVyLmdldEZpbGVuYW1lKCksIDAsIGluZGV4ID09IG51bGwgPyAwIDogaW5kZXgucG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICByZWFkZXIudHJ5U2tpcEZpbGVDYWNoZUJlZm9yZShrZXkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHJlYWRlciA9IHdyaXRlci5zZXRNYXhEYXRhQWdlKG1heEFnZSkub3BlbkVhcmx5KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIuc2V0TWF4RGF0YUFnZShtYXhBZ2UpOworICAgICAgICAgICAgICAgIHdyaXRlci5vcGVuRWFybHkocmVhZGVyIC0+IHsKICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24udXBkYXRlKHJlYWRlciwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHlPcGVuZWRFYXJseUF0ID0gd3JpdGVyLmdldEZpbGVQb2ludGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1vdmVTdGFydHMocmVhZGVyLCByZWFkZXIubGFzdCk7CisgICAgICAgICAgICAgICAgICAgIG1vdmVTdGFydHMocmVhZGVyLmxhc3QpOwogICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbi5jaGVja3BvaW50KCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjEwLDI3ICsxODgsMTMgQEAKICAgICAgKiBvbmUsIHRoZSBvbGQgKmluc3RhbmNlKiB3aWxsIGhhdmUgcmVmZXJlbmNlIGNvdW50ID09IDAgYW5kIGlmIHdlIHdlcmUgdG8gc3RhcnQgYSBuZXcgY29tcGFjdGlvbiB3aXRoIHRoYXQgb2xkCiAgICAgICogaW5zdGFuY2UsIHdlIHdvdWxkIGdldCBleGNlcHRpb25zLgogICAgICAqCi0gICAgICogQHBhcmFtIG5ld1JlYWRlciB0aGUgcmV3cml0dGVuIHJlYWRlciB0aGF0IHJlcGxhY2VzIHRoZW0gZm9yIHRoaXMgcmVnaW9uCiAgICAgICogQHBhcmFtIGxvd2VyYm91bmQgaWYgIXJlc2V0LCBtdXN0IGJlIG5vbi1udWxsLCBhbmQgbWFya3MgdGhlIGV4Y2x1c2l2ZSBsb3dlcmJvdW5kIG9mIHRoZSBzdGFydCBmb3IgZWFjaCBzc3RhYmxlCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG1vdmVTdGFydHMoU1NUYWJsZVJlYWRlciBuZXdSZWFkZXIsIERlY29yYXRlZEtleSBsb3dlcmJvdW5kKQorICAgIHByaXZhdGUgdm9pZCBtb3ZlU3RhcnRzKERlY29yYXRlZEtleSBsb3dlcmJvdW5kKQogICAgIHsKICAgICAgICAgaWYgKHRyYW5zYWN0aW9uLmlzT2ZmbGluZSgpIHx8IHByZWVtcHRpdmVPcGVuSW50ZXJ2YWwgPT0gTG9uZy5NQVhfVkFMVUUpCiAgICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgbmV3UmVhZGVyLnNldHVwT25saW5lKCk7Ci0gICAgICAgIExpc3Q8RGVjb3JhdGVkS2V5PiBpbnZhbGlkYXRlS2V5cyA9IG51bGw7Ci0gICAgICAgIGlmICghY2FjaGVkS2V5cy5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludmFsaWRhdGVLZXlzID0gbmV3IEFycmF5TGlzdDw+KGNhY2hlZEtleXMuc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PERlY29yYXRlZEtleSwgUm93SW5kZXhFbnRyeT4gY2FjaGVLZXkgOiBjYWNoZWRLZXlzLmVudHJ5U2V0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZUtleXMuYWRkKGNhY2hlS2V5LmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICBuZXdSZWFkZXIuY2FjaGVLZXkoY2FjaGVLZXkuZ2V0S2V5KCksIGNhY2hlS2V5LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY2FjaGVkS2V5cy5jbGVhcigpOwogICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHRyYW5zYWN0aW9uLm9yaWdpbmFscygpKQogICAgICAgICB7CiAgICAgICAgICAgICAvLyB3ZSBjYWxsIGdldEN1cnJlbnRSZXBsYWNlbWVudCgpIHRvIHN1cHBvcnQgbXVsdGlwbGUgcmV3cml0ZXJzIG9wZXJhdGluZyBvdmVyIHRoZSBzYW1lIHNvdXJjZSByZWFkZXJzIGF0IG9uY2UuCkBAIC0yNDEsNDkgKzIwNSwxOSBAQAogICAgICAgICAgICAgaWYgKGxhdGVzdC5maXJzdC5jb21wYXJlVG8obG93ZXJib3VuZCkgPiAwKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgICAgICBSdW5uYWJsZSBydW5PbkNsb3NlID0gaW52YWxpZGF0ZUtleXMgIT0gbnVsbCA/IG5ldyBJbnZhbGlkYXRlS2V5cyhsYXRlc3QsIGludmFsaWRhdGVLZXlzKSA6IG51bGw7CiAgICAgICAgICAgICBpZiAobG93ZXJib3VuZC5jb21wYXJlVG8obGF0ZXN0Lmxhc3QpID49IDApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc2FjdGlvbi5pc09ic29sZXRlKGxhdGVzdCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAocnVuT25DbG9zZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3QucnVuT25DbG9zZShydW5PbkNsb3NlKTsKLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbi5vYnNvbGV0ZShsYXRlc3QpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgRGVjb3JhdGVkS2V5IG5ld1N0YXJ0ID0gbGF0ZXN0LmZpcnN0S2V5QmV5b25kKGxvd2VyYm91bmQpOwotICAgICAgICAgICAgYXNzZXJ0IG5ld1N0YXJ0ICE9IG51bGw7Ci0gICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHJlcGxhY2VtZW50ID0gbGF0ZXN0LmNsb25lV2l0aE5ld1N0YXJ0KG5ld1N0YXJ0LCBydW5PbkNsb3NlKTsKLSAgICAgICAgICAgIHRyYW5zYWN0aW9uLnVwZGF0ZShyZXBsYWNlbWVudCwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBJbnZhbGlkYXRlS2V5cyBpbXBsZW1lbnRzIFJ1bm5hYmxlCi0gICAgewotICAgICAgICBmaW5hbCBMaXN0PEtleUNhY2hlS2V5PiBjYWNoZUtleXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZmluYWwgV2Vha1JlZmVyZW5jZTxJbnN0cnVtZW50aW5nQ2FjaGU8S2V5Q2FjaGVLZXksID8+PiBjYWNoZVJlZjsKLQotICAgICAgICBwcml2YXRlIEludmFsaWRhdGVLZXlzKFNTVGFibGVSZWFkZXIgcmVhZGVyLCBDb2xsZWN0aW9uPERlY29yYXRlZEtleT4gaW52YWxpZGF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5jYWNoZVJlZiA9IG5ldyBXZWFrUmVmZXJlbmNlPD4ocmVhZGVyLmdldEtleUNhY2hlKCkpOwotICAgICAgICAgICAgaWYgKGNhY2hlUmVmLmdldCgpICE9IG51bGwpCisgICAgICAgICAgICBpZiAoIXRyYW5zYWN0aW9uLmlzT2Jzb2xldGUobGF0ZXN0KSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKERlY29yYXRlZEtleSBrZXkgOiBpbnZhbGlkYXRlKQotICAgICAgICAgICAgICAgICAgICBjYWNoZUtleXMuYWRkKHJlYWRlci5nZXRDYWNoZUtleShrZXkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoS2V5Q2FjaGVLZXkga2V5IDogY2FjaGVLZXlzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEluc3RydW1lbnRpbmdDYWNoZTxLZXlDYWNoZUtleSwgPz4gY2FjaGUgPSBjYWNoZVJlZi5nZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoY2FjaGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY2FjaGUucmVtb3ZlKGtleSk7CisgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IG5ld1N0YXJ0ID0gbGF0ZXN0LmZpcnN0S2V5QmV5b25kKGxvd2VyYm91bmQpOworICAgICAgICAgICAgICAgIGFzc2VydCBuZXdTdGFydCAhPSBudWxsOworICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgcmVwbGFjZW1lbnQgPSBsYXRlc3QuY2xvbmVXaXRoTmV3U3RhcnQobmV3U3RhcnQpOworICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLnVwZGF0ZShyZXBsYWNlbWVudCwgdHJ1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yOTEsNyArMjI1LDEwIEBACiAgICAgcHVibGljIHZvaWQgc3dpdGNoV3JpdGVyKFNTVGFibGVXcml0ZXIgbmV3V3JpdGVyKQogICAgIHsKICAgICAgICAgaWYgKG5ld1dyaXRlciAhPSBudWxsKQotICAgICAgICAgICAgd3JpdGVycy5hZGQobmV3V3JpdGVyLnNldE1heERhdGFBZ2UobWF4QWdlKSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIG5ld1dyaXRlci5zZXRNYXhEYXRhQWdlKG1heEFnZSk7CisgICAgICAgICAgICB3cml0ZXJzLmFkZChuZXdXcml0ZXIpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKGVhZ2VyV3JpdGVyTWV0YVJlbGVhc2UgJiYgd3JpdGVyICE9IG51bGwpCiAgICAgICAgICAgICB3cml0ZXIucmVsZWFzZU1ldGFkYXRhT3ZlcmhlYWQoKTsKQEAgLTMxMCwxMiArMjQ3LDE1IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAorICAgICAgICAvLyBPcGVuIGZ1bGx5IGNvbXBsZXRlZCBzc3RhYmxlcyBlYXJseS4gVGhpcyBpcyBhbHNvIHJlcXVpcmVkIGZvciB0aGUgZmluYWwgc3N0YWJsZSBpbiBhIHNldCAod2hlcmUgbmV3V3JpdGVyCisgICAgICAgIC8vIGlzIG51bGwpIHRvIHBlcm1pdCB0aGUgY29tcGlsYXRpb24gb2YgYSBjYW5vbmljYWwgc2V0IG9mIHNzdGFibGVzIChzZWUgVmlldy5zZWxlY3QpLgogICAgICAgICBpZiAocHJlZW1wdGl2ZU9wZW5JbnRlcnZhbCAhPSBMb25nLk1BWF9WQUxVRSkKICAgICAgICAgewogICAgICAgICAgICAgLy8gd2UgbGVhdmUgaXQgYXMgYSB0bXAgZmlsZSwgYnV0IHdlIG9wZW4gaXQgYW5kIGFkZCBpdCB0byB0aGUgVHJhY2tlcgotICAgICAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXIgPSB3cml0ZXIuc2V0TWF4RGF0YUFnZShtYXhBZ2UpLm9wZW5GaW5hbEVhcmx5KCk7CisgICAgICAgICAgICB3cml0ZXIuc2V0TWF4RGF0YUFnZShtYXhBZ2UpOworICAgICAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXIgPSB3cml0ZXIub3BlbkZpbmFsRWFybHkoKTsKICAgICAgICAgICAgIHRyYW5zYWN0aW9uLnVwZGF0ZShyZWFkZXIsIGZhbHNlKTsKLSAgICAgICAgICAgIG1vdmVTdGFydHMocmVhZGVyLCByZWFkZXIubGFzdCk7CisgICAgICAgICAgICBtb3ZlU3RhcnRzKHJlYWRlci5sYXN0KTsKICAgICAgICAgICAgIHRyYW5zYWN0aW9uLmNoZWNrcG9pbnQoKTsKICAgICAgICAgfQogCkBAIC0zNzAsNyArMzEwLDkgQEAKICAgICAgICAgZm9yIChTU1RhYmxlV3JpdGVyIHdyaXRlciA6IHdyaXRlcnMpCiAgICAgICAgIHsKICAgICAgICAgICAgIGFzc2VydCB3cml0ZXIuZ2V0RmlsZVBvaW50ZXIoKSA+IDA7Ci0gICAgICAgICAgICB3cml0ZXIuc2V0UmVwYWlyZWRBdChyZXBhaXJlZEF0KS5zZXRPcGVuUmVzdWx0KHRydWUpLnByZXBhcmVUb0NvbW1pdCgpOworICAgICAgICAgICAgd3JpdGVyLnNldFJlcGFpcmVkQXQocmVwYWlyZWRBdCk7CisgICAgICAgICAgICB3cml0ZXIuc2V0T3BlblJlc3VsdCh0cnVlKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmVwYXJlVG9Db21taXQoKTsKICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgcmVhZGVyID0gd3JpdGVyLmZpbmlzaGVkKCk7CiAgICAgICAgICAgICB0cmFuc2FjdGlvbi51cGRhdGUocmVhZGVyLCBmYWxzZSk7CiAgICAgICAgICAgICBwcmVwYXJlZEZvckNvbW1pdC5hZGQocmVhZGVyKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVNpbXBsZVVuc29ydGVkV3JpdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVTaW1wbGVVbnNvcnRlZFdyaXRlci5qYXZhCmluZGV4IDNiMWVkMWIuLjA4NTE1NzQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVNpbXBsZVVuc29ydGVkV3JpdGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlU2ltcGxlVW5zb3J0ZWRXcml0ZXIuamF2YQpAQCAtODMsNyArODMsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICAvLyB0b2RvOiBpbmVmZmljaWVudCAtIHdlIGNyZWF0ZSBhbmQgc2VyaWFsaXplIGEgUFUganVzdCB0byBnZXQgaXRzIHNpemUsIHRoZW4gcmVjcmVhdGUgaXQKICAgICAgICAgICAgIC8vIHRvZG86IGVpdGhlciBhbGxvdyBQYXJ0aXRpb25VcGRhdGVCdWlsZGVyIHRvIGhhdmUgLmJ1aWxkKCkgY2FsbGVkIHNldmVyYWwgdGltZXMgb3IgcHJlLWNhbGN1bGF0ZSB0aGUgc2l6ZQotICAgICAgICAgICAgY3VycmVudFNpemUgKz0gUGFydGl0aW9uVXBkYXRlLnNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoY3JlYXRlUGFydGl0aW9uVXBkYXRlQnVpbGRlcihrZXkpLmJ1aWxkKCksIGZvcm1hdFR5cGUuaW5mby5nZXRMYXRlc3RWZXJzaW9uKCkuY29ycmVzcG9uZGluZ01lc3NhZ2luZ1ZlcnNpb24oKSk7CisgICAgICAgICAgICBjdXJyZW50U2l6ZSArPSBQYXJ0aXRpb25VcGRhdGUuc2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShjcmVhdGVQYXJ0aXRpb25VcGRhdGVCdWlsZGVyKGtleSkuYnVpbGQoKSwgZm9ybWF0LmdldExhdGVzdFZlcnNpb24oKS5jb3JyZXNwb25kaW5nTWVzc2FnaW5nVmVyc2lvbigpKTsKICAgICAgICAgICAgIHByZXZpb3VzID0gY3JlYXRlUGFydGl0aW9uVXBkYXRlQnVpbGRlcihrZXkpOwogICAgICAgICAgICAgYnVmZmVyLnB1dChrZXksIHByZXZpb3VzKTsKICAgICAgICAgfQpAQCAtOTcsNyArOTcsNyBAQAogICAgICAgICAvLyBpbXByb3ZlIHRoYXQuIEluIHBhcnRpY3VsYXIsIHdoYXQgd2UgY291bnQgaXMgY2xvc2VyIHRvIHRoZSBzZXJpYWxpemVkIHZhbHVlLCBidXQgaXQncyBkZWJhdGFibGUgdGhhdCBpdCdzIHRoZSByaWdodCB0aGluZwogICAgICAgICAvLyB0byBjb3VudCBzaW5jZSBpdCB3aWxsIHRha2UgYSBsb3QgbW9yZSBzcGFjZSBpbiBtZW1vcnkgYW5kIHRoZSBidWZmZXJTaXplIGlmIGZpcnN0IGFuZCBmb3JlbW9zdCB1c2VkIHRvIGF2b2lkIE9PTSB3aGVuCiAgICAgICAgIC8vIHVzaW5nIHRoaXMgd3JpdGVyLgotICAgICAgICBjdXJyZW50U2l6ZSArPSBVbmZpbHRlcmVkU2VyaWFsaXplci5zZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKHJvdywgaGVscGVyLCAwLCBmb3JtYXRUeXBlLmluZm8uZ2V0TGF0ZXN0VmVyc2lvbigpLmNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uKCkpOworICAgICAgICBjdXJyZW50U2l6ZSArPSBVbmZpbHRlcmVkU2VyaWFsaXplci5zZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKHJvdywgaGVscGVyLCAwLCBmb3JtYXQuZ2V0TGF0ZXN0VmVyc2lvbigpLmNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uKCkpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBtYXliZVN5bmMoKSB0aHJvd3MgU3luY0V4Y2VwdGlvbgpAQCAtMTgyLDcgKzE4MiwxMCBAQAogICAgICAgICAgICAgaWYgKGRpc2tXcml0ZXIuZXhjZXB0aW9uIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pCiAgICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKSBkaXNrV3JpdGVyLmV4Y2VwdGlvbjsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShkaXNrV3JpdGVyLmV4Y2VwdGlvbik7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGhyb3dhYmxlcy50aHJvd0lmVW5jaGVja2VkKGRpc2tXcml0ZXIuZXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihkaXNrV3JpdGVyLmV4Y2VwdGlvbik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIxMSw3ICsyMTQsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoYiA9PSBTRU5USU5FTCkKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IChTU1RhYmxlVHhuV3JpdGVyIHdyaXRlciA9IGNyZWF0ZVdyaXRlcigpKQorICAgICAgICAgICAgICAgICAgICB0cnkgKFNTVGFibGVUeG5Xcml0ZXIgd3JpdGVyID0gY3JlYXRlV3JpdGVyKG51bGwpKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxEZWNvcmF0ZWRLZXksIFBhcnRpdGlvblVwZGF0ZS5CdWlsZGVyPiBlbnRyeSA6IGIuZW50cnlTZXQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKGVudHJ5LmdldFZhbHVlKCkuYnVpbGQoKS51bmZpbHRlcmVkSXRlcmF0b3IoKSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVTaW1wbGVXcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVNpbXBsZVdyaXRlci5qYXZhCmluZGV4IGM5MzU2YTMuLjc0NGYzNWEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVNpbXBsZVdyaXRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVNpbXBsZVdyaXRlci5qYXZhCkBAIC0yMSw3ICsyMSw4IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWd1bGFyQW5kU3RhdGljQ29sdW1uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlBhcnRpdGlvblVwZGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7CkBAIC01MSw3ICs1Miw3IEBACiAgICAgcHJpdmF0ZSBTU1RhYmxlVHhuV3JpdGVyIGdldE9yQ3JlYXRlV3JpdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBpZiAod3JpdGVyID09IG51bGwpCi0gICAgICAgICAgICB3cml0ZXIgPSBjcmVhdGVXcml0ZXIoKTsKKyAgICAgICAgICAgIHdyaXRlciA9IGNyZWF0ZVdyaXRlcihudWxsKTsKIAogICAgICAgICByZXR1cm4gd3JpdGVyOwogICAgIH0KQEAgLTg1LDcgKzg2LDkgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKHdyaXRlciA9PSBudWxsID8gdCA6IHdyaXRlci5hYm9ydCh0KSk7CisgICAgICAgICAgICBUaHJvd2FibGUgZSA9IHdyaXRlciA9PSBudWxsID8gdCA6IHdyaXRlci5hYm9ydCh0KTsKKyAgICAgICAgICAgIFRocm93YWJsZXMudGhyb3dJZlVuY2hlY2tlZChlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVUeG5Xcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVR4bldyaXRlci5qYXZhCmluZGV4IDgzYzU1NDIuLmZhZDdkNTQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVR4bldyaXRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVR4bldyaXRlci5qYXZhCkBAIC0yOCw3ICsyOCw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LkluZGV4OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlJhbmdlQXdhcmVTU1RhYmxlV3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29sbGVjdG9yOwpAQCAtMTEzLDcgKzExMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyByZXBhaXJlZEF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVVUlEIHBlbmRpbmdSZXBhaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1RyYW5zaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlRm9ybWF0LlR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlRm9ybWF0PD8sID8+IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNzdGFibGVMZXZlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlcikKICAgICB7CkBAIC0xNDQsMTIgKzE0MywxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1RyYW5zaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzc3RhYmxlTGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248SW5kZXg+IGluZGV4ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPEluZGV4PiBpbmRleGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZS5Pd25lciBvd25lcikKICAgICB7CiAgICAgICAgIC8vIGlmIHRoZSBjb2x1bW4gZmFtaWx5IHN0b3JlIGRvZXMgbm90IGV4aXN0LCB3ZSBjcmVhdGUgYSBuZXcgZGVmYXVsdCBTU1RhYmxlTXVsdGlXcml0ZXIgdG8gdXNlOgogICAgICAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBMaWZlY3ljbGVUcmFuc2FjdGlvbi5vZmZsaW5lKE9wZXJhdGlvblR5cGUuV1JJVEUpOwogICAgICAgICBNZXRhZGF0YUNvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgTWV0YWRhdGFDb2xsZWN0b3IobWV0YWRhdGEuZ2V0KCkuY29tcGFyYXRvcikuc3N0YWJsZUxldmVsKHNzdGFibGVMZXZlbCk7Ci0gICAgICAgIFNTVGFibGVNdWx0aVdyaXRlciB3cml0ZXIgPSBTaW1wbGVTU1RhYmxlTXVsdGlXcml0ZXIuY3JlYXRlKGRlc2NyaXB0b3IsIGtleUNvdW50LCByZXBhaXJlZEF0LCBwZW5kaW5nUmVwYWlyLCBpc1RyYW5zaWVudCwgbWV0YWRhdGEsIGNvbGxlY3RvciwgaGVhZGVyLCBpbmRleGVzLCB0eG4pOworICAgICAgICBTU1RhYmxlTXVsdGlXcml0ZXIgd3JpdGVyID0gU2ltcGxlU1NUYWJsZU11bHRpV3JpdGVyLmNyZWF0ZShkZXNjcmlwdG9yLCBrZXlDb3VudCwgcmVwYWlyZWRBdCwgcGVuZGluZ1JlcGFpciwgaXNUcmFuc2llbnQsIG1ldGFkYXRhLCBjb2xsZWN0b3IsIGhlYWRlciwgaW5kZXhlcywgdHhuLCBvd25lcik7CiAgICAgICAgIHJldHVybiBuZXcgU1NUYWJsZVR4bldyaXRlcih0eG4sIHdyaXRlcik7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVaZXJvQ29weVdyaXRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlWmVyb0NvcHlXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWU2NDkwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlWmVyb0NvcHlXcml0ZXIuamF2YQpAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKKworaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVOZXdUcmFja2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5BYnN0cmFjdEJvdW5kczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNXcml0ZUVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuQXN5bmNTdHJlYW1pbmdJbnB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlSWQ7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5OworCitwdWJsaWMgY2xhc3MgU1NUYWJsZVplcm9Db3B5V3JpdGVyIGV4dGVuZHMgU1NUYWJsZSBpbXBsZW1lbnRzIFNTVGFibGVNdWx0aVdyaXRlcgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTU1RhYmxlWmVyb0NvcHlXcml0ZXIuY2xhc3MpOworCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBTU1RhYmxlUmVhZGVyIGZpbmFsUmVhZGVyOworICAgIHByaXZhdGUgZmluYWwgTWFwPENvbXBvbmVudC5UeXBlLCBTZXF1ZW50aWFsV3JpdGVyPiBjb21wb25lbnRXcml0ZXJzOworCisgICAgcHVibGljIFNTVGFibGVaZXJvQ29weVdyaXRlcihCdWlsZGVyPD8sID8+IGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWZlY3ljbGVOZXdUcmFja2VyIGxpZmVjeWNsZU5ld1RyYWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlLk93bmVyIG93bmVyKQorICAgIHsKKyAgICAgICAgc3VwZXIoYnVpbGRlciwgb3duZXIpOworCisgICAgICAgIGxpZmVjeWNsZU5ld1RyYWNrZXIudHJhY2tOZXcodGhpcyk7CisgICAgICAgIHRoaXMuY29tcG9uZW50V3JpdGVycyA9IG5ldyBIYXNoTWFwPD4oKTsKKworICAgICAgICBpZiAoIWRlc2NyaXB0b3IuZ2V0Rm9ybWF0KCkuc3RyZWFtaW5nQ29tcG9uZW50cygpLmNvbnRhaW5zQWxsKGNvbXBvbmVudHMpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGZvcm1hdCgiVW5zdXBwb3J0ZWQgc3RyZWFtaW5nIGNvbXBvbmVudCBkZXRlY3RlZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHMuZGlmZmVyZW5jZShJbW11dGFibGVTZXQuY29weU9mKGNvbXBvbmVudHMpLCBkZXNjcmlwdG9yLmdldEZvcm1hdCgpLnN0cmVhbWluZ0NvbXBvbmVudHMoKSkpKTsKKworICAgICAgICBmb3IgKENvbXBvbmVudCBjIDogY29tcG9uZW50cykKKyAgICAgICAgICAgIGNvbXBvbmVudFdyaXRlcnMucHV0KGMudHlwZSwgbWFrZVdyaXRlcihkZXNjcmlwdG9yLCBjKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIERlY29yYXRlZEtleSBnZXRGaXJzdCgpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRGVjb3JhdGVkS2V5IGdldExhc3QoKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFic3RyYWN0Qm91bmRzPFRva2VuPiBnZXRCb3VuZHMoKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTZXF1ZW50aWFsV3JpdGVyIG1ha2VXcml0ZXIoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBDb21wb25lbnQgY29tcG9uZW50KQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTZXF1ZW50aWFsV3JpdGVyKGRlc2NyaXB0b3IuZmlsZUZvcihjb21wb25lbnQpLCBpb09wdGlvbnMud3JpdGVyT3B0aW9ucywgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZShEYXRhSW5wdXRQbHVzIGluLCBsb25nIHNpemUsIFNlcXVlbnRpYWxXcml0ZXIgb3V0KSB0aHJvd3MgRlNXcml0ZUVycm9yCisgICAgeworICAgICAgICBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSAxIDw8IDIwOworICAgICAgICBsb25nIGJ5dGVzUmVhZCA9IDA7CisgICAgICAgIGJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKGJ5dGVzUmVhZCA8IHNpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHRvUmVhZCA9IChpbnQpIE1hdGgubWluKHNpemUgLSBieXRlc1JlYWQsIEJVRkZFUl9TSVpFKTsKKyAgICAgICAgICAgICAgICBpbi5yZWFkRnVsbHkoYnVmZiwgMCwgdG9SZWFkKTsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBNYXRoLm1pbih0b1JlYWQsIEJVRkZFUl9TSVpFKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmZiwgMCwgY291bnQpOworICAgICAgICAgICAgICAgIGJ5dGVzUmVhZCArPSBjb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5zeW5jKCk7IC8vIGZpbmlzaCB3aWxsIGFsc28gY2FsbCBzeW5jKCkuIExlYXZpbmcgaGVyZSB0byBnZXQgc3R1ZmYgZmx1c2hlZCBhcyBlYXJseSBhcyBwb3NzaWJsZQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRlNXcml0ZUVycm9yKGUsIG91dC5nZXRGaWxlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gYXBwZW5kKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBwYXJ0aXRpb24pCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBmaW5pc2gobG9uZyByZXBhaXJlZEF0LCBsb25nIG1heERhdGFBZ2UsIGJvb2xlYW4gb3BlblJlc3VsdCkKKyAgICB7CisgICAgICAgIHJldHVybiBmaW5pc2gob3BlblJlc3VsdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gZmluaXNoKGJvb2xlYW4gb3BlblJlc3VsdCkKKyAgICB7CisgICAgICAgIHNldE9wZW5SZXN1bHQob3BlblJlc3VsdCk7CisKKyAgICAgICAgZm9yIChTZXF1ZW50aWFsV3JpdGVyIHdyaXRlciA6IGNvbXBvbmVudFdyaXRlcnMudmFsdWVzKCkpCisgICAgICAgICAgICB3cml0ZXIuZmluaXNoKCk7CisKKyAgICAgICAgcmV0dXJuIGZpbmlzaGVkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gZmluaXNoZWQoKQorICAgIHsKKyAgICAgICAgaWYgKGZpbmFsUmVhZGVyID09IG51bGwpCisgICAgICAgICAgICBmaW5hbFJlYWRlciA9IFNTVGFibGVSZWFkZXIub3Blbihvd25lcigpLm9yRWxzZShudWxsKSwgZGVzY3JpcHRvciwgY29tcG9uZW50cywgbWV0YWRhdGEpOworCisgICAgICAgIHJldHVybiBJbW11dGFibGVMaXN0Lm9mKGZpbmFsUmVhZGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1NUYWJsZU11bHRpV3JpdGVyIHNldE9wZW5SZXN1bHQoYm9vbGVhbiBvcGVuUmVzdWx0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0RmlsZVBvaW50ZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRhYmxlSWQgZ2V0VGFibGVJZCgpCisgICAgeworICAgICAgICByZXR1cm4gbWV0YWRhdGEuaWQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRocm93YWJsZSBjb21taXQoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCisgICAgeworICAgICAgICBmb3IgKFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyIDogY29tcG9uZW50V3JpdGVycy52YWx1ZXMoKSkKKyAgICAgICAgICAgIGFjY3VtdWxhdGUgPSB3cml0ZXIuY29tbWl0KGFjY3VtdWxhdGUpOworICAgICAgICByZXR1cm4gYWNjdW11bGF0ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGhyb3dhYmxlIGFib3J0KFRocm93YWJsZSBhY2N1bXVsYXRlKQorICAgIHsKKyAgICAgICAgZm9yIChTZXF1ZW50aWFsV3JpdGVyIHdyaXRlciA6IGNvbXBvbmVudFdyaXRlcnMudmFsdWVzKCkpCisgICAgICAgICAgICBhY2N1bXVsYXRlID0gd3JpdGVyLmFib3J0KGFjY3VtdWxhdGUpOworICAgICAgICByZXR1cm4gYWNjdW11bGF0ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcmVwYXJlVG9Db21taXQoKQorICAgIHsKKyAgICAgICAgZm9yIChTZXF1ZW50aWFsV3JpdGVyIHdyaXRlciA6IGNvbXBvbmVudFdyaXRlcnMudmFsdWVzKCkpCisgICAgICAgICAgICB3cml0ZXIucHJlcGFyZVRvQ29tbWl0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgIHsKKyAgICAgICAgZm9yIChTZXF1ZW50aWFsV3JpdGVyIHdyaXRlciA6IGNvbXBvbmVudFdyaXRlcnMudmFsdWVzKCkpCisgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUNvbXBvbmVudChDb21wb25lbnQuVHlwZSB0eXBlLCBEYXRhSW5wdXRQbHVzIGluLCBsb25nIHNpemUpIHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCisgICAgeworICAgICAgICBsb2dnZXIuaW5mbygiV3JpdGluZyBjb21wb25lbnQge30gdG8ge30gbGVuZ3RoIHt9IiwgdHlwZSwgY29tcG9uZW50V3JpdGVycy5nZXQodHlwZSkuZ2V0UGF0aCgpLCBwcmV0dHlQcmludE1lbW9yeShzaXplKSk7CisKKyAgICAgICAgaWYgKGluIGluc3RhbmNlb2YgQXN5bmNTdHJlYW1pbmdJbnB1dFBsdXMpCisgICAgICAgICAgICB3cml0ZSgoQXN5bmNTdHJlYW1pbmdJbnB1dFBsdXMpIGluLCBzaXplLCBjb21wb25lbnRXcml0ZXJzLmdldCh0eXBlKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdyaXRlKGluLCBzaXplLCBjb21wb25lbnRXcml0ZXJzLmdldCh0eXBlKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlKEFzeW5jU3RyZWFtaW5nSW5wdXRQbHVzIGluLCBsb25nIHNpemUsIFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyKSB0aHJvd3MgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbG9nZ2VyLmluZm8oIkJsb2NrIFdyaXRpbmcgY29tcG9uZW50IHRvIHt9IGxlbmd0aCB7fSIsIHdyaXRlci5nZXRQYXRoKCksIHByZXR0eVByaW50TWVtb3J5KHNpemUpKTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgaW4uY29uc3VtZSh3cml0ZXI6OndyaXRlRGlyZWN0bHlUb0NoYW5uZWwsIHNpemUpOworICAgICAgICAgICAgd3JpdGVyLnN5bmMoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRU9GRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENsb3NlZENoYW5uZWxFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRlNXcml0ZUVycm9yIHRyaWdnZXJzIGRpc2sgZmFpbHVyZSBwb2xpY3ksIGJ1dCBpZiB3ZSBnZXQgYSBjb25uZWN0aW9uIGlzc3VlIHdlIGRvIG5vdCB3YW50IHRvIGRvIHRoYXQKKyAgICAgICAgICAgIC8vIHNvIHJldGhyb3cgc28gdGhlIGVycm9yIGhhbmRsaW5nIGxvZ2ljIGhpZ2hlciB1cCBpcyBhYmxlIHRvIGRlYWwgd2l0aCB0aGlzCisgICAgICAgICAgICAvLyBzZWUgQ0FTU0FORFJBLTE3MTE2CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRlNXcml0ZUVycm9yKGUsIHdyaXRlci5nZXRQYXRoKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlX0FQSS5tZCBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZV9BUEkubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEwNDQwNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZV9BUEkubWQKQEAgLTAsMCArMSwyNjIgQEAKKyMgU1NUYWJsZSBBUEkKKworW0NFUC0xN10oaHR0cHM6Ly9jd2lraS5hcGFjaGUub3JnL2NvbmZsdWVuY2UvZGlzcGxheS9DQVNTQU5EUkEvQ0VQLTE3JTNBK1NTVGFibGUrZm9ybWF0K0FQSSkgCisvIFtDQVNTQU5EUkEtMTcwNTZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTE3MDU2KQorCisjIyBTU1RhYmxlIGZvcm1hdAorCitTU1RhYmxlIGZvcm1hdCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYFNTVGFibGVGb3JtYXRgIGludGVyZmFjZS4gSXQgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHJlYWRlcnMsIHdyaXRlcnMsCitzY3J1YmJlcnMsIHZlcmlmaWVycywgYW5kIG90aGVyIGNvbXBvbmVudHMgZm9yIHByb2Nlc3NpbmcgdGhlIHNzdGFibGVzLiBBbiBTU1RhYmxlIGZvcm1hdCBpbXBsZW1lbnRhdGlvbiBjb21lcyB3aXRoIAorYSBmYWN0b3J5IGNsYXNzIGltcGxlbWVudGluZyB0aGUgYFNTVGFibGVGb3JtYXQuRmFjdG9yeWAgaW50ZXJmYWNlLiBUaGUgZmFjdG9yeSBpcyByZXF1aXJlZCB0byBwcm92aWRlIGEgdW5pcXVlIG5hbWUgCitvZiB0aGUgaW1wbGVtZW50YXRpb24gYW5kIGEgbWV0aG9kIGZvciBjcmVhdGluZyB0aGUgZm9ybWF0IGluc3RhbmNlLgorCisjIyBDb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb24KKworU1NUYWJsZSBmb3JtYXQgZmFjdG9yaWVzIGFyZSBkaXNjb3ZlcmVkIHVzaW5nIAorW0phdmEgU2VydmljZSBMb2FkZXJdKGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvYXBpL2phdmEvdXRpbC9TZXJ2aWNlTG9hZGVyLmh0bWwpIG1lY2hhbmlzbS4gVGhlIGxvYWRlZCAKK2Zvcm1hdCBpbXBsZW1lbnRhdGlvbnMgY2FuIGJlIHVzZWQgdG8gcmVhZCB0aGUgZXhpc3Rpbmcgc3N0YWJsZXMuIFRoZSB3cml0ZSBmb3JtYXQgaXMgY2hvc2VuIGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uLiAKK0lmIGl0IGlzIG5vdCBzcGVjaWZpZWQsIGBCaWdGb3JtYXRgIGltcGxlbWVudGF0aW9uIGlzIGFzc3VtZWQuIAorCitPcHRpb25hbCBTU1RhYmxlIGZvcm1hdHMgY29uZmlndXJhdGlvbiBjYW4gYmUgc3VwcGxpZWQgaW4gdGhlIF9jYXNzYW5kcmEueWFtbF8gZmlsZSB1bmRlciB0aGUgYHNzdGFibGVgIGtleS4gCisKK2BgYHlhbWwKK3NzdGFibGU6CisgIHNlbGVjdGVkX2Zvcm1hdDog4oypbmFtZSBvZiB0aGUgZGVmYXVsdCBTU1RhYmxlRm9ybWF0IGltcGxlbWVudGF0aW9u4oyqCisgIGZvcm1hdDoKKyAgICDijKlmb3JtYXQxIG5hbWXijKo6CisgICAgICBwYXJhbTE6IOKMqWZvcm1hdCBzcGVjaWZpYyBwYXJhbWV0ZXIgMeKMqgorICAgICAgcGFyYW0yOiDijKlmb3JtYXQgc3BlY2lmaWMgcGFyYW1ldGVyIDLijKoKKyAgICAgICMgLi4uCisgICAg4oypZm9ybWF0MiBuYW1l4oyqOgorICAgICAgcGFyYW0xOiDijKlmb3JtYXQgc3BlY2lmaWMgcGFyYW1ldGVyIDHijKoKKyAgICAgIHBhcmFtMjog4oypZm9ybWF0IHNwZWNpZmljIHBhcmFtZXRlciAy4oyqCisgICAgICAjIC4uLgorICAgICMgLi4uICAgICAgCitgYGAKKworRWFjaCBpbXBsZW1lbnRhdGlvbiBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZSB0aGF0IGlzIHVzZWQgdG8gdW5hbm9uaW1vdXNseSBpZGVudGlmeSB0aGUgZm9ybWF0LiBUaGUgbmFtZSBtdXN0IGJlIAorY29uc2lzdGVudGx5IHJldHVybmVkIGJ5IGBuYW1lKClgIG1ldGhvZHMgaW4gdGhlIGBTU1RhYmxlRm9ybWF0YCBhbmQgYFNTVGFibGVGb3JtYXQuRmFjdG9yeWAgaW1wbGVtZW50YXRpb25zLiBJdCBtdXN0IAoraW5jbHVkZSBvbmx5IGxvd2VyY2FzZSBBU0NJSSBsZXR0ZXJzLgorCitQYXJhbWV0ZXJzIHNwZWNpZmllZCB1bmRlciB0aGUga2V5IG5hbWVkIGFmdGVyIHRoZSBmb3JtYXQgbmFtZSBhcmUgcGFzc2VkIHRvIHRoZSBmYWN0b3J5IG1ldGhvZCBvZiB0aGUgY29ycmVzcG9uZGluZworaW1wbGVtZW50YXRpb24uIEFsbCBvZiB0aG9zZSBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCBhbmQgZGVwZW5kIG9uIHRoZSBpbXBsZW1lbnRhdGlvbi4KKworVGhlIGFzc3VtZWQgZGVmYXVsdCBjb25maWd1cmF0aW9uIC0gd2hpY2ggaXMgZXF1aXZhbGVudCB0byBlbXB0eSBjb25maWd1cmF0aW9uOgorYGBgeWFtbAorc3N0YWJsZToKKyAgc2VsZWN0ZWRfZm9ybWF0OiBiaWcKK2BgYAorCitFeGFtcGxlIGNvbmZpZ3VyYXRpb24gd2hpY2ggdXNlcyBgYnRpYCBhcyB0aGUgZGVmYXVsdDoKK2BgYHlhbWwKK3NzdGFibGU6CisgIHNlbGVjdGVkX2Zvcm1hdDogYnRpCisgIGZvcm1hdDoKKyAgICBiaWc6CisgICAgICBwYXJhbTE6IHZhbHVlMQorICAgICAgcGFyYW0yOiB2YWx1ZTIKKyAgICBidGk6CisgICAgICBwYXJhbTE6IHZhbHVlMQorICAgICAgcGFyYW0yOiB2YWx1ZTIKKworYGBgCisKKyMjIENvbXBvbmVudHMKKworRWFjaCBzc3RhYmxlIGNvbnNpc3RzIG9mIGEgc2V0IG9mIGNvbXBvbmVudHMgLSByZXF1aXJlZCBhbmQgb3B0aW9uYWwuIEEgY29tcG9uZW50IGNvbnN0aXR1dGVzIGFuIGlkZW50aWZpZXIgcmVxdWlyZWQgCit0byBvYnRhaW4gdGhlIGV4YWN0IGZpbGUgd2l0aCBhbiBzc3RhYmxlIGRlc2NyaXB0b3IuIENvbXBvbmVudHMgYXJlIGdyb3VwZWQgYnkgdHlwZS4gQSB0eXBlIG1heSBkZWZpbmUgZWl0aGVyIAorYSBzaW5nbGV0b24gY29tcG9uZW50IChmb3IgZXhhbXBsZSwgX3N0YXRzXyBjb21wb25lbnQpIG9yIGEgbm9uLXNpbmdsZXRvbiBjb21wb25lbnQgKGZvciBleGFtcGxlLCBfc2Vjb25kYXJ5IGluZGV4XyAKK2NvbXBvbmVudCkuCisKK0Egc2V0IG9mIGdlbmVyaWMgdHlwZXMgb2YgY29tcG9uZW50cyB0aGF0IGFyZSB0aG91Z2h0IG9mIGFzIGNvbW1vbiB0byBhbGwgdGhlIHNzdGFibGUgaW1wbGVtZW50YXRpb25zIGlzIGRlZmluZWQgaW4gdGhlIAorW2BTU1RhYmxlRm9ybWF0LkNvbXBvbmVudHNgXShmb3JtYXQvU1NUYWJsZUZvcm1hdC5qYXZhKSBjbGFzcy4gVGhleSBpbmNsdWRlIHNpbmdsZXRvbiB0eXBlcyBsaWtlIGBEQVRBYCwgCitgQ09NUFJFU1NJT05fSU5GT2AsIGBTVEFUU2AsIGBGSUxURVJgLCBgRElHRVNUYCwgYENSQ2AsIGFuZCBgVE9DYCwgd2hpY2ggY29tZXMgd2l0aCBwcmVkZWZpbmVkIHNpbmdsZXRvbiBjb21wb25lbnQgCitpbnN0YW5jZXMsIGFzIHdlbGwgYXMgbm9uLXNpbmdsZXRvbiB0eXBlcyBsaWtlIGBTRUNPTkRBUllfSU5ERVhgIGFuZCBgQ1VTVE9NYC4KKworQXBhcnQgZnJvbSB0aGUgZ2VuZXJpYyBjb21wb25lbnRzLCBlYWNoIHNzdGFibGUgZm9ybWF0IGltcGxlbWVudGF0aW9uIG1heSBkZXNjcmliZSBpdHMgc3BlY2lmaWMgY29tcG9uZW50IHR5cGVzLgorRm9yIGV4YW1wbGUsIHRoZSBfYmlnIHRhYmxlXyBmb3JtYXQgZGVzY3JpYmVzIGFkZGl0aW9uYWxseSBgUFJJTUFSWV9JTkRFWGAgYW5kIGBTVU1NQVJZYCBzaW5nbGV0b24gdHlwZXMgYW5kIAordGhlIGNvcnJlc3BvbmRpbmcgc2luZ2xldG9uIGNvbXBvbmVudHMgKHNlZSBbYEJpZ0Zvcm1hdC5Db21wb25lbnRzYF0oZm9ybWF0L2JpZy9CaWdGb3JtYXQuamF2YSkpLgorCitDdXN0b20gdHlwZXMgY2FuIGJlIGNyZWF0ZWQgd2l0aCBvbmUgb2YgdGhlIGBDb21wb25lbnQuVHlwZS5jcmVhdGUobmFtZSwgcmVwciwgZm9ybWF0Q2xhc3MpYCwKK2BDb21wb25lbnQuVHlwZS5jcmVhdGVTaW5nbGV0b24obmFtZSwgcmVwciwgZm9ybWF0Q2xhc3MpYCBtZXRob2RzLiBFYWNoIGNyZWF0ZWQgdHlwZSBpcyByZWdpc3RlcmVkIGluIGEgZ2xvYmFsIHR5cGVzJworcmVnaXN0cnkuIFR5cGVzIHJlZ2lzdHJ5IGlzIGhpZXJhcmNoaWNhbCB3aGljaCBtZWFucyB0aGF0IGFuIHNzdGFibGUgaW1wbGVtZW50YXRpb24gbWF5IHVzZSB0eXBlcyBkZWZpbmVkIGZvciBpdHMKK2Zvcm1hdCBjbGFzcyBhbmQgZm9yIGFsbCBwYXJlbnQgZm9ybWF0IGNsYXNzZXMgKGZvciBleGFtcGxlLCB0aGUgdHlwZXMgZGVmaW5lZCBmb3IgdGhlIGBCaWdGb3JtYXRgIGNsYXNzIGV4dGVuZCB0aGUgc2V0CitvZiB0eXBlcyBkZWZpbmVkIGZvciB0aGUgYFNTVGFibGVGb3JtYXRgIGludGVyZmFjZSkuCisKK0ZvciBleGFtcGxlLCB0eXBlcyBkZWZpbmVkIGZvciBgQmlnRm9ybWF0YDoKKworYGBgamF2YQorcHVibGljIHN0YXRpYyBjbGFzcyBUeXBlcyBleHRlbmRzIFNTVGFibGVGb3JtYXQuQ29tcG9uZW50cy5UeXBlcworeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50LlR5cGUgUFJJTUFSWV9JTkRFWCA9IENvbXBvbmVudC5UeXBlLmNyZWF0ZVNpbmdsZXRvbigiUFJJTUFSWV9JTkRFWCIsICJJbmRleC5kYiIsIEJpZ0Zvcm1hdC5jbGFzcyk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnQuVHlwZSBTVU1NQVJZID0gQ29tcG9uZW50LlR5cGUuY3JlYXRlU2luZ2xldG9uKCJTVU1NQVJZIiwgIlN1bW1hcnkuZGIiLCBCaWdGb3JtYXQuY2xhc3MpOworfQorYGBgCisKK1NpbmdsZXRvbiBjb21wb25lbnRzIGFyZSBpbW1lZGlhdGVseSBhc3NvY2lhdGVkIHdpdGggdGhlIHNpbmdsZXRvbiB0eXBlcyBhbmQgcmV0cmlldmVkIHdpdGggdGhlIGA8dHlwZT4uZ2V0U2luZ2xldG9uKClgIAorbWV0aG9kOgorCitgYGBqYXZhCitwdWJsaWMgc3RhdGljIGNsYXNzIENvbXBvbmVudHMgZXh0ZW5kcyBBYnN0cmFjdFNTVGFibGVGb3JtYXQuQ29tcG9uZW50cworeworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29tcG9uZW50IFBSSU1BUllfSU5ERVggPSBUeXBlcy5QUklNQVJZX0lOREVYLmdldFNpbmdsZXRvbigpOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29tcG9uZW50IFNVTU1BUlkgPSBUeXBlcy5TVU1NQVJZLmdldFNpbmdsZXRvbigpOworfQorYGBgCisKK05vbi1zaW5nbGV0b24gY29tcG9uZW50cyBhcmUgY3JlYXRlZCBleHBsaWNpdGx5IGFzIGZvbGxvd3M6CisKK2BgYGphdmEKK0NvbXBvbmVudCBpZHgxID0gVHlwZXMuU0VDT05EQVJZX0lOREVYLmNyZWF0ZUNvbXBvbmVudCgiU0lfaWR4MS5kYiIpOworYGBgCisKKyMjIEltcGxlbWVudGF0aW9uCisKK1dlIHN0cm9uZ2x5IHN1Z2dlc3QgdGhlIG1haW4gZm9ybWF0IGNsYXNzIHRvIGV4dGVuZCBbYEFic3RyYWN0U1NUYWJsZUZvcm1hdGBdKGZvcm1hdC9BYnN0cmFjdFNTVGFibGVGb3JtYXQuamF2YSkgYmVjYXVzZSAKK2l0IGluY2x1ZGVzIHRoZSBleHBlY3RlZCBpbXBsZW1lbnRhdGlvbiBvZiBhIGNvdXBsZSBvZiBtZXRob2RzIHRoYXQgc2hvdWxkIG5vdCBiZSByZWltcGxlbWVudGVkIGRpZmZlcmVudGx5LgorCisjIyMgSW5pdGlhbGl6YXRpb24gCisKK0Nhc3NhbmRyYSBlaXRoZXIgaW5pdGlhbGl6ZXMgdGhlIHNzdGFibGUgZm9ybWF0IGNsYXNzIGFzIGEgc2luZ2xldG9uIGJ5IGNhbGxpbmcgaXRzIGNvbnN0cnVjdG9yIG9yIG9idGFpbnMgdGhlIGluc3RhbmNlIAorYnkgYWNjZXNzaW5nIGEgc3RhdGljIGZpZWxkIGNhbGxlZCBgaW5zdGFuY2VgIGluIHRoZSBjbGFzcy4gQXMgYSBwYXJ0IG9mIHRoZSBpbml0aWFsaXphdGlvbiwgQ2Fzc2FuZHJhIGNhbGxzIHRoZSBgc2V0dXBgIAorbWV0aG9kIGFuZCBwcm92aWRlcyB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLiBSaWdodCBhZnRlciBpbml0aWFsaXphdGlvbiwgQ2Fzc2FuZHJhIGNhbGxzIHRoZSBgYWxsQ29tcG9uZW50c2AgbWV0aG9kIAordG8gY29uZmlybSBhbGwgdGhlIGNvbXBvbmVudHMgZGVmaW5lZCBmb3IgdGhlIGZvcm1hdCBhcmUgaW5pdGlhbGl6ZWQgYW5kIHVzYWJsZS4KKworIyMjIFByZWRlZmluZWQgc2V0cyBvZiBjb21wb25lbnRzCisKK1NTVGFibGUgZm9ybWF0IGRlZmluZXMgYSBjb3VwbGUgb2YgY29sbGVjdGlvbnMgb2YgY29tcG9uZW50cy4gWW91IHNob3VsZCBkZWNsYXJlIHRob3NlIGNvbGxlY3Rpb25zIGFzIGNvbnN0YW50IGFuZCAKK2ltbXV0YWJsZSBzZXRzLgorCisjIyMgUmVhZGVyCisKKyMjIyMgQ29uc3RydWN0aW9uCisKK0FuIHNzdGFibGUgcmVhZGVyIChbYFNTVGFibGVSZWFkZXJgXShmb3JtYXQvU1NUYWJsZVJlYWRlci5qYXZhKSkgaXMgcmVzcG9uc2libGUgZm9yIHJlYWRpbmcgdGhlIGRhdGEgZnJvbSBhbiBzc3RhYmxlLiAKK0l0IGlzIGNyZWF0ZWQgYnkgYSBfc2ltcGxlIGJ1aWxkZXJfIChbYFNTVGFibGVSZWFkZXIuQnVpbGRlcmBdKGZvcm1hdC9TU1RhYmxlUmVhZGVyLmphdmEpKSBvciBhIF9sb2FkaW5nIAorYnVpbGRlcl8gKFtgU1NUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyYF0oZm9ybWF0L1NTVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlci5qYXZhKSkuIFRoZSBidWlsZGVycyBhcmUgc3VwcGxpZWQgYnkgCithIF9yZWFkZXIgZmFjdG9yeV8gKFtgU1NUYWJsZUZvcm1hdC5TU1RhYmxlUmVhZGVyRmFjdG9yeWBdKGZvcm1hdC9TU1RhYmxlRm9ybWF0LmphdmEpKS4KKworVGhlIGNvbnN0cnVjdG9yIG9mIGEgcGFydGljdWxhciBgU1NUYWJsZVJlYWRlcmAgaW1wbGVtZW50YXRpb24gc2hvdWxkIGFjY2VwdCB0d28gcGFyYW1ldGVycyAtIG9uZSBpcyB0aGUgZm9ybWF0LXNwZWNpZmljCitfc2ltcGxlIGJ1aWxkZXJfIGFuZCB0aGUgb3RoZXIgb25lIGlzIGFuIHNzdGFibGUgb3duZXIgKHVzdWFsbHkgYSBgQ29sdW1uRmFtaWx5U3RvcmVgIGluc3RhbmNlLCBidXQgaXQgY2FuIGJlIG51bGwgCitlaXRoZXIpLiBUaGUgY29uc3RydWN0b3Igc2hvdWxkIGJlIHNpbXBsZSBhbmQgbm90IGRvIGFueXRoaW5nIGJ1dCBhc3NpZ24gaW50ZXJuYWwgZmllbGRzIHdpdGggdmFsdWVzIGZyb20gdGhlIGJ1aWxkZXIuCisKK0Egc2ltcGxlIGJ1aWxkZXIgZG9lcyBub3QgcGVyZm9ybSBhbnkgbG9naWMgZXhjZXB0IGJhc2ljIHZhbGlkYXRpb24gLSBpdCBvbmx5IHN0b3JlcyB0aGUgcHJvdmlkZWQgdmFsdWVzIHRoZSByZWFkZXIgCitjb25zdHJ1Y3RvciBjYW4gYWNjZXNzLiBBIG5ldyByZWFkZXIgaW1wbGVtZW50YXRpb24gc2hvdWxkIGluY2x1ZGUgYSBwdWJsaWMgc3RhdGljIHNpbXBsZSBidWlsZGVyIGlubmVyIGNsYXNzIHRoYXQgCitleHRlbmRzIHRoZSBgU1NUYWJsZVJlYWRlci5CdWlsZGVyYCBnZW5lcmljIHJlYWRlciBidWlsZGVyIChvciBgU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIuQnVpbGRlcmAsIHNlZSBbYmVsb3ddKCNmaWx0ZXIpKS4KKworSW4gY29udHJhc3QgdG8gdGhlIHNpbXBsZSBidWlsZGVyLCBhIGxvYWRpbmcgYnVpbGRlciBjYW4gcGVyZm9ybSBhZGRpdGlvbmFsIG9wZXJhdGlvbnMgbGlrZSBtb3JlIGNvbXBsZXggdmFsaWRhdGlvbiwgCitvcGVuaW5nIHJlc291cmNlcywgbG9hZGluZyBjYWNoZXMsIGluZGV4ZXMsIGZpbHRlcnMsIGV0Yy4gSXQgaW50ZXJuYWxseSBjcmVhdGVzIGEgc2ltcGxlIGJ1aWxkZXIgYW5kIGV2ZW50dWFsbHkgCitpbnN0YW50aWF0ZXMgYSByZWFkZXIuCisKKyMjIyMgR2VuZXJhbCBub3RlcworCitOb3RlIHRoYXQgaWYgdGhlIGJ1aWxkZXIgY2FycmllcyBzb21lIGNsb3NlYWJsZSByZXNvdXJjZXMgdG8gdGhlIHJlYWRlciwgdGhleSBzaG91bGQgYmUgcmV0dXJuZWQgYnkgdGhlIGBzZXR1cEluc3RhbmNlYCAKK21ldGhvZC4KKworWW91IHdpbGwgZmluZCBzb21lIGBjbG9uZVhYWGAgbWV0aG9kcyB0byBpbXBsZW1lbnQgLSByZW1lbWJlciB0byBjcmVhdGUgYSByZWFkZXIgY2xvbmUgaW4gYSBsYW1iZGEgcGFzc2VkIHRvIAordGhlIGBydW5XaXRoTG9jaygpYCBtZXRob2QuCisKKyMjIyMgVW5idWlsZGluZworSXQgaXMgY29udmVuaWVudCB0byBpbXBsZW1lbnQgdGhlIGB1bmJ1aWxkVG9gIG1ldGhvZCwgd2hpY2ggdGFrZXMgYSBfc2ltcGxlIGJ1aWxkZXJfIGFuZCBpbml0aWFsaXplcyBpdCBzbyB0aGF0Cit0aGUgYnVpbGRlciBjYW4gcHJvZHVjZSB0aGUgc2FtZSByZWFkZXIuIFRoZSBtZXRob2Qgc2hvdWxkIGFsc28gdGFrZSB0aGUgYHNoYXJlZENvcHlgIGJvb2xlYW4gYXJndW1lbnQgZGVub3Rpbmcgd2hldGhlcgoraXQgc2hvdWxkIGNvcHkgdGhlIGZpZWxkcyByZWZlcmVuY2luZyBjbG9zZWFibGUgcmVzb3VyY2VzIHRvIHRoZSBidWlsZGVyIGRpcmVjdGx5IG9yIGFzIChzaGFyZWQpIGNvcGllcy4gVGhlIGNvbnZlbnRpb24KK2Fsc28gcmVxdWlyZXMgY29weWluZyB0aGUgcmVzb3VyY2VzIG9ubHkgaWYgdGhleSBhcmUgdW5zZXQgaW4gdGhlIGJ1aWxkZXIgKHRoZSBmaWVsZCBpcyBudWxsKS4gVGhlIG1ldGhvZCBzaG91bGQgY2FsbAordGhlIGBzdXBlci51bmJ1aWxkVG9gIG1ldGhvZCBhcyBhIGZpcnN0IHN0ZXAgc28gdGhhdCBhbGwgdGhlIGZpZWxkcyBtYW5hZ2VkIGJ5IHRoZSBwYXJlbnQgY2xhc3MgYXJlIGNvcGllZCBhbmQgaW4KK3RoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb25seSB0aGUgZmllbGRzIHNwZWNpZmljIHRvIHRoaXMgZm9ybWF0IGhhdmUgdG8gYmUgYXNzaWduZWQuCisKK0ZvciBleGFtcGxlLCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhhdCBtZXRob2QgaW4gYSByZWFkZXIgZm9yIHRoZSBfYmlnIHRhYmxlXyBmb3JtYXQgaXMgYXMgZm9sbG93czoKKworYGBgamF2YQorcHJvdGVjdGVkIGZpbmFsIEJ1aWxkZXIgdW5idWlsZFRvKEJ1aWxkZXIgYnVpbGRlciwgYm9vbGVhbiBzaGFyZWRDb3B5KQoreworICAgIEJ1aWxkZXIgYiA9IHN1cGVyLnVuYnVpbGRUbyhidWlsZGVyLCBzaGFyZWRDb3B5KTsKKyAgICBpZiAoYnVpbGRlci5nZXRJbmRleEZpbGUoKSA9PSBudWxsKQorICAgICAgICBiLnNldEluZGV4RmlsZShzaGFyZWRDb3B5ID8gc2hhcmVkQ29weU9yTnVsbChpZmlsZSkgOiBpZmlsZSk7CisgICAgaWYgKGJ1aWxkZXIuZ2V0SW5kZXhTdW1tYXJ5KCkgPT0gbnVsbCkKKyAgICAgICAgYi5zZXRJbmRleFN1bW1hcnkoc2hhcmVkQ29weSA/IHNoYXJlZENvcHlPck51bGwoaW5kZXhTdW1tYXJ5KSA6IGluZGV4U3VtbWFyeSk7CisKKyAgICBiLnNldEtleUNhY2hlKGtleUNhY2hlKTsKKworICAgIHJldHVybiBiOworfQorYGBgCisKKyMjIyMgRmlsdGVyCisKK0lmIHRoZSBzc3RhYmxlIGluY2x1ZGVzIGEgX2ZpbHRlcl8sIHRoZSByZWFkZXIgY2xhc3Mgc2hvdWxkIGV4dGVuZCAKK3RoZSBbYFNTVGFibGVSZWFkZXJXaXRoRmlsdGVyYF0oZm9ybWF0L1NTVGFibGVSZWFkZXJXaXRoRmlsdGVyLmphdmEpIGFic3RyYWN0IHJlYWRlciAoYW5kIGl0cyBfc2ltcGxlIGJ1aWxkZXJfIHNob3VsZCAKK2V4dGVuZCB0aGUgYFNTVGFibGVSZWFkZXJXaXRoRmlsdGVyLlNTVGFibGVSZWFkZXJXaXRoRmlsdGVyQnVpbGRlcmAgYnVpbGRlcikuCisKK1RoZSByZWFkZXIgd2l0aCBmaWx0ZXIgcHJvdmlkZXMgdGhlIGBpc1ByZXNlbnRJbkZpbHRlcmAgbWV0aG9kIGZvciBleHRlbmRpbmcgaW1wbGVtZW50YXRpb24uIEl0IGFsc28gaW1wbGVtZW50cyBvdGhlciAKK2ZpbHRlci1zcGVjaWZpYyBtZXRob2RzIHRoZSBzeXN0ZW0gcmVsaWVzIG9uIGlmIHRoZSBpbXBsZW1lbnRlZCByZWFkZXIgZXh0ZW5kcyB0aGF0IGNsYXNzLgorCitOb3RlIHRoYXQgaWYgdGhlIGltcGxlbWVudGVkIHJlYWRlciBleHRlbmRzIHRoZSBgU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXJgIGNsYXNzLCBpdCBzaG91bGQgaW5jbHVkZSB0aGUgYEZJTFRFUmAgCitjb21wb25lbnQgaW4gdGhlIGFwcHJvcHJpYXRlIGNvbXBvbmVudCBzZXRzLgorCitUaGUgcmVhZGVyIHdpdGggZmlsdGVyIGltcGxlbWVudGF0aW9uIGNvbWVzIHdpdGggYWRkaXRpb25hbCBbbWV0cmljc10oZmlsdGVyL0Jsb29tRmlsdGVyTWV0cmljcy5qYXZhKSAtIHJlYWQgbW9yZSBhYm91dCBjdXN0b20KK21ldHJpY3Mgc3VwcG9ydCBbaGVyZV0oI21ldHJpY3MpLgorCisjIyMjIEluZGV4IHN1bW1hcnkKKworU29tZSBzc3RhYmxlIGZvcm1hdCBpbXBsZW1lbnRhdGlvbnMsIHN1Y2ggYXMgX2JpZyB0YWJsZV8gZm9ybWF0LCBtYXkgdXNlIF9pbmRleCBzdW1tYXJpZXNfLiBJZiBhIHJlYWRlciB1c2VzIF9pbmRleCAKK3N1bW1hcmllc18gaXQgc2hvdWxkIGltcGxlbWVudCB0aGUgW2BJbmRleFN1bW1hcnlTdXBwb3J0YF0oaW5kZXhzdW1tYXJ5L0luZGV4U3VtbWFyeVN1cHBvcnQuamF2YSkgaW50ZXJmYWNlLiAKKworVGhlIHN1cHBvcnQgZm9yIF9pbmRleCBzdW1tYXJpZXNfIGNvbWVzIHdpdGggYWRkaXRpb25hbCBbbWV0cmljc10oaW5kZXhzdW1tYXJ5L0luZGV4U3VtbWFyeU1ldHJpY3MuamF2YSkgLSByZWFkIG1vcmUgCithYm91dCBjdXN0b20gbWV0cmljcyBzdXBwb3J0IFtoZXJlXSgjbWV0cmljcykuCisKKyMjIyMgS2V5IGNhY2hlCisKK0lmIGFuIHNzdGFibGUgZm9ybWF0IGltcGxlbWVudGF0aW9uIHVzZXMgcm93IGtleSBjYWNoZSwgaXQgc2hvdWxkIGltcGxlbWVudCAKK3RoZVtgS2V5Q2FjaGVTdXBwb3J0YF0oa2V5Y2FjaGUvS2V5Q2FjaGVTdXBwb3J0LmphdmEpIGludGVyZmFjZS4gSW4gcGFydGljdWxhciwgaXQgc2hvdWxkIHN0b3JlIGEgYEtleUNhY2hlYCBpbnN0YW5jZSAKK2FuZCByZXR1cm4gaXQgd2l0aCB0aGUgYGdldEtleUNhY2hlKClgIG1ldGhvZC4gVGhlIGludGVyZmFjZSBoYXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIHNldmVyYWwgbWV0aG9kcyAKK3RoZSBzeXN0ZW0gcmVsaWVzIG9uIGlmIHRoZSByZWFkZXIgaW1wbGVtZW50cyB0aGUgYEtleUNhY2hlU3VwcG9ydGAgaW50ZXJmYWNlLgorCitUaGUgaW50ZXJmYWNlIGNvbWVzIHdpdGggYWRkaXRpb25hbCBbbWV0cmljc10oa2V5Y2FjaGUvS2V5Q2FjaGVNZXRyaWNzLmphdmEpIC0gcmVhZCBtb3JlIGFib3V0IGN1c3RvbSBtZXRyaWNzIHN1cHBvcnQgCitbaGVyZV0oI21ldHJpY3MpLgorCisjIyMjIE1ldHJpY3MKKworQSBjdXN0b20gc3N0YWJsZSBmb3JtYXQgaW1wbGVtZW50YXRpb24gbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBtZXRyaWNzIG9uIGEgdGFibGUsIGtleXNwYWNlLCBhbmQgZ2xvYmFsIGxldmVsLiBUaG9zZSAKK21ldHJpY3MgYXJlIGFjY2Vzc2libGUgdmlhIEpNWC4gVGhlIGBTU1RhYmxlRm9ybWF0YCBpbXBsZW1lbnRhdGlvbiBleHBvc2VzIHRoZSBhZGRpdGlvbmFsIG1ldHJpY3MgYnkgaW1wbGVtZW50aW5nIHRoZQorYFNTVGFibGVGb3JtYXQuZ2V0Rm9ybWF0U3BlY2lmaWNNZXRyaWNzUHJvdmlkZXJzYCBtZXRob2QuIFRoZSBtZXRob2Qgc2hvdWxkIHJldHVybiBhIHNpbmdsZXRvbiBvYmplY3QgaW1wbGVtZW50aW5nIHRoZQorW2BNZXRyaWNzUHJvdmlkZXJzYF0oTWV0cmljc1Byb3ZpZGVycy5qYXZhKSBpbnRlcmZhY2UuIEN1cnJlbnRseSwgdGhlcmUgaXMgb25seSBzdXBwb3J0IGZvciBjdXN0b20gZ2F1Z2VzLCBidXQgaXQgY2FuIGJlCitleHRlbmRlZCB3aGVuIG5lZWRlZC4KKworRWFjaCBjdXN0b20gbWV0cmljIChnYXVnZSkgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFtHYXVnZVByb3ZpZGVyXShHYXVnZVByb3ZpZGVyLmphdmEpIGFic3RyYWN0IGNsYXNzLiBBbHRob3VnaCB0aGUKK2NsYXNzIGV4cGVjdHMgdGhlIGltcGxlbWVudGF0aW9uIHRvIHByb3ZpZGUgYSBnYXVnZSBmb3IgZWFjaCBsZXZlbCBvZiBhZ2dyZWdhdGlvbiwgdGhlcmUgaXMgYSBoZWxwZXIgY2xhc3MgLQorW1NpbXBsZUdhdWdlUHJvdmlkZXJdKFNpbXBsZUdhdWdlUHJvdmlkZXIuamF2YSkgLSB3aGljaCBkb2VzIHRoYXQgYXV0b21hdGljYWxseSB3aXRoIGEgc3VwcGxpZWQgcmVkdWN0aW9uIGxhbWJkYS4gVGhlcmUgCitpcyBbYEFic3RyYWN0TWV0cmljc1Byb3ZpZGVyc2BdKEFic3RyYWN0TWV0cmljc1Byb3ZpZGVycy5qYXZhKSBjbGFzcyB3aGljaCBpcyBhIHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlCitgTWV0cmljc1Byb3ZpZGVyc2AgaW50ZXJmYWNlIGFuZCBsZXZlcmFnZXMgYFNpbXBsZUdhdWdlUHJvdmlkZXJgIGluIHRoZSBvZmZlcmVkIG1ldGhvZHMuCisKK0V4YW1wbGUgLSBhZGRpdGlvbmFsIG1ldHJpY3MgZm9yIHNzdGFibGVzIHN1cHBvcnRpbmcgaW5kZXggc3VtbWFyaWVzIChzZWUgCitbYEluZGV4U3VtbWFyeU1ldHJpY3NgXShpbmRleHN1bW1hcnkvSW5kZXhTdW1tYXJ5TWV0cmljcy5qYXZhKSBmb3IgYSBmdWxsIGV4YW1wbGUpOgorYGBgamF2YQorcHJpdmF0ZSBmaW5hbCBHYXVnZVByb3ZpZGVyPExvbmc+IGluZGV4U3VtbWFyeU9mZkhlYXBNZW1vcnlVc2VkID0gbmV3R2F1Z2VQcm92aWRlcigiSW5kZXhTdW1tYXJ5T2ZmSGVhcE1lbW9yeVVzZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAtPiByLmdldEluZGV4U3VtbWFyeSgpLmdldE9mZkhlYXBTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmc6OnN1bSk7CitgYGAKKworIyMjIFdyaXRlcgorCisjIyMjIENvbnN0cnVjdGlvbgorCitBbiBzc3RhYmxlIHdyaXRlciAoW2BTU1RhYmxlV3JpdGVyYF0oZm9ybWF0L1NTVGFibGVXcml0ZXIuamF2YSkpIGlzIHJlc3BvbnNpYmxlIGZvciB3cml0aW5nIHRoZSBkYXRhIHRvIHNzdGFibGUgZmlsZXMuCitJdCBpcyBjcmVhdGVkIGJ5IGEgX2J1aWxkZXJfIChbYFNTVGFibGVXcml0ZXIuQnVpbGRlcmBdKGZvcm1hdC9TU1RhYmxlV3JpdGVyLmphdmEpKS4gVGhlIGJ1aWxkZXIgaXMgc3VwcGxpZWQgYnkKK2EgX3dyaXRlciBmYWN0b3J5XyAoW2BTU1RhYmxlRm9ybWF0LlNTVGFibGVXcml0ZXJGYWN0b3J5YF0oZm9ybWF0L1NTVGFibGVGb3JtYXQuamF2YSkpLgorCisjIyMjIFNvcnRlZFRhYmxlV3JpdGVyCisKK1RoZXJlIGFyZSBub3QgbWFueSBtZXRob2RzIHRvIGJlIGltcGxlbWVudGVkIGluIHRoZSB3cml0ZXIuIFRoZSBtb3N0IG5vdGFibGUgb25lIGlzIGBhcHBlbmRgIHdoaWNoIHNob3VsZCB3cml0ZSAKK3RoZSBwcm92aWRlZCBwYXJ0aXRpb24gdG8gZGlzay4gSG93ZXZlciwgdGhlcmUgaXMgYSBnZW5lcmljIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gCitbYFNvcnRlZFRhYmxlV3JpdGVyYF0oZm9ybWF0L1NvcnRlZFRhYmxlV3JpdGVyLmphdmEpIHdoaWNoIGhhbmRsZXMgdGhpbmdzIGxpa2Ugd3JpdGluZyB0byB0aGUgZGF0YSBmaWxlIHVzaW5nIAordGhlIGRlZmF1bHQgc2VyaWFsaXplcnMsIGdlbmVyaWMgc3VwcG9ydCBmb3IgYSBwYXJ0aXRpb24gaW5kZXgsIG5vdGlmaWNhdGlvbnMsIG1ldGFkYXRhIGNvbGxlY3Rpb24sIGFuZCBidWlsZGluZyAKK2EgZmlsdGVyLiBUaGUgd3JpdGVyIHRyaWdnZXJzIGZpbmUtZ3JhaW5lZCBldmVudHMgd2hlbiBkYXRhIGFyZSBhZGRlZCBhbmQgdGhvc2UgbWV0aG9kcyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiAKK3RoZSBzdWJjbGFzc2VzIHRvIGFwcGx5IHNwZWNpZmljIGJlaGF2aW91cnMgKGZvciBleGFtcGxlLCBgb25QYXJ0aXRpb25TdGFydGAsIGBvblJvd2AsIGBvblN0YXRpY1Jvd2AsIGV0Yy4pLgorRXZlbnR1YWxseSBpdCBjYWxscyBhbiBhYnN0cmFjdCBgY3JlYXRlUm93SW5kZXhFbnRyeWAgbWV0aG9kIHdoaWNoIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgc3ViY2xhc3MuIAorCisjIyMgU2NydWJiZXIgYW5kIHZlcmlmaWVyCisKK0EgY3VzdG9tIHNzdGFibGUgZm9ybWF0IHNob3VsZCBhbHNvIGNvbWUgd2l0aCBpdHMgb3duIHZlcmlmaWVyIGFuZCBzY3J1YmJlciBpbXBsZW1lbnRpbmcgW2BJVmVyaWZpZXJgXShJVmVyaWZpZXIuamF2YSkKK2FuZCBbYElTY3J1YmJlcmBdKElTY3J1YmJlci5qYXZhKSBpbnRlcmZhY2VzIGNvcnJlc3BvbmRpbmdseS4gQSBnZW5lcmljIHBhcnRpYWwgaW1wbGVtZW50YXRpb24gaXMgcHJvdmlkZWQgaW4gCitbYFNvcnRlZFRhYmxlVmVyaWZpZXJgXShmb3JtYXQvU29ydGVkVGFibGVWZXJpZmllci5qYXZhKSBhbmQgW2BTb3J0ZWRUYWJsZVNjcnViYmVyYF0oZm9ybWF0L1NvcnRlZFRhYmxlU2NydWJiZXIuamF2YSkuCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NpbXBsZUdhdWdlUHJvdmlkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU2ltcGxlR2F1Z2VQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MjkwOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NpbXBsZUdhdWdlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKKworaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLkdhdWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CisKK3B1YmxpYyBjbGFzcyBTaW1wbGVHYXVnZVByb3ZpZGVyPFQgZXh0ZW5kcyBOdW1iZXIsIFIgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyPiBleHRlbmRzIEdhdWdlUHJvdmlkZXI8VD4KK3sKKyAgICBwcml2YXRlIGZpbmFsIEZ1bmN0aW9uPFNTVGFibGVSZWFkZXIsIFI+IG1hcHBlcjsKKyAgICBwcml2YXRlIGZpbmFsIEZ1bmN0aW9uPEl0ZXJhYmxlPFI+LCBUPiBjb21iaW5lcjsKKworICAgIHB1YmxpYyBTaW1wbGVHYXVnZVByb3ZpZGVyKEZ1bmN0aW9uPFNTVGFibGVSZWFkZXIsIFI+IG1hcHBlciwgU3RyaW5nIG5hbWUsIEZ1bmN0aW9uPEl0ZXJhYmxlPFI+LCBUPiBjb21iaW5lcikKKyAgICB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgICAgICB0aGlzLm1hcHBlciA9IG1hcHBlcjsKKyAgICAgICAgdGhpcy5jb21iaW5lciA9IGNvbWJpbmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBHYXVnZTxUPiBnZXRUYWJsZUdhdWdlKENvbHVtbkZhbWlseVN0b3JlIGNmcykKKyAgICB7CisgICAgICAgIHJldHVybiAoKSAtPiBjb21iaW5lKGNmcy5nZXRMaXZlU1NUYWJsZXMoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEdhdWdlPFQ+IGdldEtleXNwYWNlR2F1Z2UoS2V5c3BhY2Uga2V5c3BhY2UpCisgICAgeworICAgICAgICByZXR1cm4gKCkgLT4gY29tYmluZShnZXRBbGxSZWFkZXJzKGtleXNwYWNlKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEdhdWdlPFQ+IGdldEdsb2JhbEdhdWdlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKSAtPiBjb21iaW5lKEl0ZXJhYmxlcy5jb25jYXQoSXRlcmFibGVzLnRyYW5zZm9ybShLZXlzcGFjZS5hbGwoKSwgU2ltcGxlR2F1Z2VQcm92aWRlcjo6Z2V0QWxsUmVhZGVycykpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFQgY29tYmluZShJdGVyYWJsZTxTU1RhYmxlUmVhZGVyPiBhbGxSZWFkZXJzKQorICAgIHsKKyAgICAgICAgSXRlcmFibGU8Uj4gcmVhZGVycyA9IEl0ZXJhYmxlcy5maWx0ZXIoSXRlcmFibGVzLnRyYW5zZm9ybShhbGxSZWFkZXJzLCBtYXBwZXI6OmFwcGx5KSwgT2JqZWN0czo6bm9uTnVsbCk7CisgICAgICAgIHJldHVybiBjb21iaW5lci5hcHBseShyZWFkZXJzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBJdGVyYWJsZTxTU1RhYmxlUmVhZGVyPiBnZXRBbGxSZWFkZXJzKEtleXNwYWNlIGtleXNwYWNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEl0ZXJhYmxlcy5jb25jYXQoSXRlcmFibGVzLnRyYW5zZm9ybShrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZXMoKSwgQ29sdW1uRmFtaWx5U3RvcmU6OmdldExpdmVTU1RhYmxlcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU2ltcGxlU1NUYWJsZU11bHRpV3JpdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NpbXBsZVNTVGFibGVNdWx0aVdyaXRlci5qYXZhCmluZGV4IGVjMjg1MjguLjM4MWM1ZWIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU2ltcGxlU1NUYWJsZU11bHRpV3JpdGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TaW1wbGVTU1RhYmxlTXVsdGlXcml0ZXIuamF2YQpAQCAtMjAsNyArMjAsNiBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd0luZGV4RW50cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlTmV3VHJhY2tlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKQEAgLTQ1LDEzICs0NCwxNSBAQAogCiAgICAgcHVibGljIGJvb2xlYW4gYXBwZW5kKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBwYXJ0aXRpb24pCiAgICAgewotICAgICAgICBSb3dJbmRleEVudHJ5PD8+IGluZGV4RW50cnkgPSB3cml0ZXIuYXBwZW5kKHBhcnRpdGlvbik7CisgICAgICAgIEFic3RyYWN0Um93SW5kZXhFbnRyeSBpbmRleEVudHJ5ID0gd3JpdGVyLmFwcGVuZChwYXJ0aXRpb24pOwogICAgICAgICByZXR1cm4gaW5kZXhFbnRyeSAhPSBudWxsOwogICAgIH0KIAogICAgIHB1YmxpYyBDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IGZpbmlzaChsb25nIHJlcGFpcmVkQXQsIGxvbmcgbWF4RGF0YUFnZSwgYm9vbGVhbiBvcGVuUmVzdWx0KQogICAgIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbih3cml0ZXIuZmluaXNoKHJlcGFpcmVkQXQsIG1heERhdGFBZ2UsIG9wZW5SZXN1bHQpKTsKKyAgICAgICAgd3JpdGVyLnNldFJlcGFpcmVkQXQocmVwYWlyZWRBdCk7CisgICAgICAgIHdyaXRlci5zZXRNYXhEYXRhQWdlKG1heERhdGFBZ2UpOworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKHdyaXRlci5maW5pc2gob3BlblJlc3VsdCkpOwogICAgIH0KIAogICAgIHB1YmxpYyBDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IGZpbmlzaChib29sZWFuIG9wZW5SZXN1bHQpCkBAIC0xMTYsOSArMTE3LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhQ29sbGVjdG9yIG1ldGFkYXRhQ29sbGVjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxJbmRleD4gaW5kZXhlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlmZWN5Y2xlTmV3VHJhY2tlciBsaWZlY3ljbGVOZXdUcmFja2VyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWZlY3ljbGVOZXdUcmFja2VyIGxpZmVjeWNsZU5ld1RyYWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGUuT3duZXIgb3duZXIpCiAgICAgewotICAgICAgICBTU1RhYmxlV3JpdGVyIHdyaXRlciA9IFNTVGFibGVXcml0ZXIuY3JlYXRlKGRlc2NyaXB0b3IsIGtleUNvdW50LCByZXBhaXJlZEF0LCBwZW5kaW5nUmVwYWlyLCBpc1RyYW5zaWVudCwgbWV0YWRhdGEsIG1ldGFkYXRhQ29sbGVjdG9yLCBoZWFkZXIsIGluZGV4ZXMsIGxpZmVjeWNsZU5ld1RyYWNrZXIpOworICAgICAgICBTU1RhYmxlV3JpdGVyIHdyaXRlciA9IGRlc2NyaXB0b3IuZ2V0Rm9ybWF0KCkuZ2V0V3JpdGVyRmFjdG9yeSgpLmJ1aWxkZXIoZGVzY3JpcHRvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEtleUNvdW50KGtleUNvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UmVwYWlyZWRBdChyZXBhaXJlZEF0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UGVuZGluZ1JlcGFpcihwZW5kaW5nUmVwYWlyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VHJhbnNpZW50U1NUYWJsZShpc1RyYW5zaWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRhYmxlTWV0YWRhdGFSZWYobWV0YWRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNZXRhZGF0YUNvbGxlY3RvcihtZXRhZGF0YUNvbGxlY3RvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNlcmlhbGl6YXRpb25IZWFkZXIoaGVhZGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRGVmYXVsdENvbXBvbmVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRmx1c2hPYnNlcnZlcnNGb3JTZWNvbmRhcnlJbmRleGVzKGluZGV4ZXMsIGxpZmVjeWNsZU5ld1RyYWNrZXIub3BUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZChsaWZlY3ljbGVOZXdUcmFja2VyLCBvd25lcik7CiAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlU1NUYWJsZU11bHRpV3JpdGVyKHdyaXRlciwgbGlmZWN5Y2xlTmV3VHJhY2tlcik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9maWx0ZXIvQmxvb21GaWx0ZXJNZXRyaWNzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2ZpbHRlci9CbG9vbUZpbHRlck1ldHJpY3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTVmYzNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9maWx0ZXIvQmxvb21GaWx0ZXJNZXRyaWNzLmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5maWx0ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdE1ldHJpY3NQcm92aWRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5HYXVnZVByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXI7CisKK3B1YmxpYyBjbGFzcyBCbG9vbUZpbHRlck1ldHJpY3M8UiBleHRlbmRzIFNTVGFibGVSZWFkZXJXaXRoRmlsdGVyPiBleHRlbmRzIEFic3RyYWN0TWV0cmljc1Byb3ZpZGVyczxSPgoreworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgQmxvb21GaWx0ZXJNZXRyaWNzPD8+IGluc3RhbmNlID0gbmV3IEJsb29tRmlsdGVyTWV0cmljczw+KCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUiBtYXAoU1NUYWJsZVJlYWRlciByKQorICAgIHsKKyAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBTU1RhYmxlUmVhZGVyV2l0aEZpbHRlcikKKyAgICAgICAgICAgIHJldHVybiAoUikgcjsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGZhbHNlIHBvc2l0aXZlcyBpbiBibG9vbSBmaWx0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgR2F1Z2VQcm92aWRlcjxMb25nPiBibG9vbUZpbHRlckZhbHNlUG9zaXRpdmVzID0gbmV3R2F1Z2VQcm92aWRlcigiQmxvb21GaWx0ZXJGYWxzZVBvc2l0aXZlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAtPiByLmdldEZpbHRlclRyYWNrZXIoKS5nZXRGYWxzZVBvc2l0aXZlQ291bnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nOjpzdW0pOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGZhbHNlIHBvc2l0aXZlcyBpbiBibG9vbSBmaWx0ZXIgZnJvbSBsYXN0IHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgR2F1Z2VQcm92aWRlcjxMb25nPiByZWNlbnRCbG9vbUZpbHRlckZhbHNlUG9zaXRpdmVzID0gbmV3R2F1Z2VQcm92aWRlcigiUmVjZW50Qmxvb21GaWx0ZXJGYWxzZVBvc2l0aXZlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAtPiByLmdldEZpbHRlclRyYWNrZXIoKS5nZXRSZWNlbnRGYWxzZVBvc2l0aXZlQ291bnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nOjpzdW0pOworCisgICAgLyoqCisgICAgICogRGlzayBzcGFjZSB1c2VkIGJ5IGJsb29tIGZpbHRlcgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBHYXVnZVByb3ZpZGVyPExvbmc+IGJsb29tRmlsdGVyRGlza1NwYWNlVXNlZCA9IG5ld0dhdWdlUHJvdmlkZXIoIkJsb29tRmlsdGVyRGlza1NwYWNlVXNlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXJXaXRoRmlsdGVyOjpnZXRGaWx0ZXJTZXJpYWxpemVkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmc6OnN1bSk7CisKKyAgICAvKioKKyAgICAgKiBPZmYgaGVhcCBtZW1vcnkgdXNlZCBieSBibG9vbSBmaWx0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgR2F1Z2VQcm92aWRlcjxMb25nPiBibG9vbUZpbHRlck9mZkhlYXBNZW1vcnlVc2VkID0gbmV3R2F1Z2VQcm92aWRlcigiQmxvb21GaWx0ZXJPZmZIZWFwTWVtb3J5VXNlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXI6OmdldEZpbHRlck9mZkhlYXBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmc6OnN1bSk7CisKKyAgICAvKioKKyAgICAgKiBGYWxzZSBwb3NpdGl2ZSByYXRpbyBvZiBibG9vbSBmaWx0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgR2F1Z2VQcm92aWRlcjxEb3VibGU+IGJsb29tRmlsdGVyRmFsc2VSYXRpbyA9IG5ld0dhdWdlUHJvdmlkZXIoIkJsb29tRmlsdGVyRmFsc2VSYXRpbyIsIHJlYWRlcnMgLT4geworICAgICAgICBsb25nIGZhbHNlUG9zaXRpdmVDb3VudCA9IDBMOworICAgICAgICBsb25nIHRydWVQb3NpdGl2ZUNvdW50ID0gMEw7CisgICAgICAgIGxvbmcgdHJ1ZU5lZ2F0aXZlQ291bnQgPSAwTDsKKyAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyV2l0aEZpbHRlciBzc3RhYmxlIDogcmVhZGVycykKKyAgICAgICAgeworICAgICAgICAgICAgZmFsc2VQb3NpdGl2ZUNvdW50ICs9IHNzdGFibGUuZ2V0RmlsdGVyVHJhY2tlcigpLmdldEZhbHNlUG9zaXRpdmVDb3VudCgpOworICAgICAgICAgICAgdHJ1ZVBvc2l0aXZlQ291bnQgKz0gc3N0YWJsZS5nZXRGaWx0ZXJUcmFja2VyKCkuZ2V0VHJ1ZVBvc2l0aXZlQ291bnQoKTsKKyAgICAgICAgICAgIHRydWVOZWdhdGl2ZUNvdW50ICs9IHNzdGFibGUuZ2V0RmlsdGVyVHJhY2tlcigpLmdldFRydWVOZWdhdGl2ZUNvdW50KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZhbHNlUG9zaXRpdmVDb3VudCA9PSAwTCAmJiB0cnVlUG9zaXRpdmVDb3VudCA9PSAwTCkKKyAgICAgICAgICAgIHJldHVybiAwZDsKKyAgICAgICAgcmV0dXJuIChkb3VibGUpIGZhbHNlUG9zaXRpdmVDb3VudCAvICh0cnVlUG9zaXRpdmVDb3VudCArIGZhbHNlUG9zaXRpdmVDb3VudCArIHRydWVOZWdhdGl2ZUNvdW50KTsKKyAgICB9KTsKKworICAgIC8qKgorICAgICAqIEZhbHNlIHBvc2l0aXZlIHJhdGlvIG9mIGJsb29tIGZpbHRlciBmcm9tIGxhc3QgcmVhZAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBHYXVnZVByb3ZpZGVyPERvdWJsZT4gcmVjZW50Qmxvb21GaWx0ZXJGYWxzZVJhdGlvID0gbmV3R2F1Z2VQcm92aWRlcigiUmVjZW50Qmxvb21GaWx0ZXJGYWxzZVJhdGlvIiwgcmVhZGVycyAtPiB7CisgICAgICAgIGxvbmcgZmFsc2VQb3NpdGl2ZUNvdW50ID0gMEw7CisgICAgICAgIGxvbmcgdHJ1ZVBvc2l0aXZlQ291bnQgPSAwTDsKKyAgICAgICAgbG9uZyB0cnVlTmVnYXRpdmVDb3VudCA9IDBMOworICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXJXaXRoRmlsdGVyIHNzdGFibGUgOiByZWFkZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBmYWxzZVBvc2l0aXZlQ291bnQgKz0gc3N0YWJsZS5nZXRGaWx0ZXJUcmFja2VyKCkuZ2V0UmVjZW50RmFsc2VQb3NpdGl2ZUNvdW50KCk7CisgICAgICAgICAgICB0cnVlUG9zaXRpdmVDb3VudCArPSBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRSZWNlbnRUcnVlUG9zaXRpdmVDb3VudCgpOworICAgICAgICAgICAgdHJ1ZU5lZ2F0aXZlQ291bnQgKz0gc3N0YWJsZS5nZXRGaWx0ZXJUcmFja2VyKCkuZ2V0UmVjZW50VHJ1ZU5lZ2F0aXZlQ291bnQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmFsc2VQb3NpdGl2ZUNvdW50ID09IDBMICYmIHRydWVQb3NpdGl2ZUNvdW50ID09IDBMKQorICAgICAgICAgICAgcmV0dXJuIDBkOworICAgICAgICByZXR1cm4gKGRvdWJsZSkgZmFsc2VQb3NpdGl2ZUNvdW50IC8gKHRydWVQb3NpdGl2ZUNvdW50ICsgZmFsc2VQb3NpdGl2ZUNvdW50ICsgdHJ1ZU5lZ2F0aXZlQ291bnQpOworICAgIH0pOworCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEdhdWdlUHJvdmlkZXI8Pz4+IGdhdWdlUHJvdmlkZXJzID0gQXJyYXlzLmFzTGlzdChibG9vbUZpbHRlckZhbHNlUG9zaXRpdmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZW50Qmxvb21GaWx0ZXJGYWxzZVBvc2l0aXZlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29tRmlsdGVyRGlza1NwYWNlVXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29tRmlsdGVyT2ZmSGVhcE1lbW9yeVVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vbUZpbHRlckZhbHNlUmF0aW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlbnRCbG9vbUZpbHRlckZhbHNlUmF0aW8pOworCisgICAgcHVibGljIExpc3Q8R2F1Z2VQcm92aWRlcjw/Pj4gZ2V0R2F1Z2VQcm92aWRlcnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdhdWdlUHJvdmlkZXJzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZmlsdGVyL0Jsb29tRmlsdGVyVHJhY2tlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9maWx0ZXIvQmxvb21GaWx0ZXJUcmFja2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYyOTI2MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZmlsdGVyL0Jsb29tRmlsdGVyVHJhY2tlci5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZmlsdGVyOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkxvbmdBZGRlcjsKKworcHVibGljIGNsYXNzIEJsb29tRmlsdGVyVHJhY2tlcgoreworICAgIHByaXZhdGUgZmluYWwgTG9uZ0FkZGVyIGZhbHNlUG9zaXRpdmVDb3VudCA9IG5ldyBMb25nQWRkZXIoKTsKKyAgICBwcml2YXRlIGZpbmFsIExvbmdBZGRlciB0cnVlUG9zaXRpdmVDb3VudCA9IG5ldyBMb25nQWRkZXIoKTsKKyAgICBwcml2YXRlIGZpbmFsIExvbmdBZGRlciB0cnVlTmVnYXRpdmVDb3VudCA9IG5ldyBMb25nQWRkZXIoKTsKKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY0xvbmcgbGFzdEZhbHNlUG9zaXRpdmVDb3VudCA9IG5ldyBBdG9taWNMb25nKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNMb25nIGxhc3RUcnVlUG9zaXRpdmVDb3VudCA9IG5ldyBBdG9taWNMb25nKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNMb25nIGxhc3RUcnVlTmVnYXRpdmVDb3VudCA9IG5ldyBBdG9taWNMb25nKCk7CisKKyAgICBwdWJsaWMgdm9pZCBhZGRGYWxzZVBvc2l0aXZlKCkKKyAgICB7CisgICAgICAgIGZhbHNlUG9zaXRpdmVDb3VudC5pbmNyZW1lbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRUcnVlUG9zaXRpdmUoKQorICAgIHsKKyAgICAgICAgdHJ1ZVBvc2l0aXZlQ291bnQuaW5jcmVtZW50KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVHJ1ZU5lZ2F0aXZlKCkKKyAgICB7CisgICAgICAgIHRydWVOZWdhdGl2ZUNvdW50LmluY3JlbWVudCgpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldEZhbHNlUG9zaXRpdmVDb3VudCgpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2VQb3NpdGl2ZUNvdW50LnN1bSgpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldFJlY2VudEZhbHNlUG9zaXRpdmVDb3VudCgpCisgICAgeworICAgICAgICBsb25nIGZwYyA9IGdldEZhbHNlUG9zaXRpdmVDb3VudCgpOworICAgICAgICBsb25nIGxhc3QgPSBsYXN0RmFsc2VQb3NpdGl2ZUNvdW50LmdldEFuZFNldChmcGMpOworICAgICAgICByZXR1cm4gZnBjIC0gbGFzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRUcnVlUG9zaXRpdmVDb3VudCgpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZVBvc2l0aXZlQ291bnQuc3VtKCk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0UmVjZW50VHJ1ZVBvc2l0aXZlQ291bnQoKQorICAgIHsKKyAgICAgICAgbG9uZyB0cGMgPSBnZXRUcnVlUG9zaXRpdmVDb3VudCgpOworICAgICAgICBsb25nIGxhc3QgPSBsYXN0VHJ1ZVBvc2l0aXZlQ291bnQuZ2V0QW5kU2V0KHRwYyk7CisgICAgICAgIHJldHVybiB0cGMgLSBsYXN0OworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldFRydWVOZWdhdGl2ZUNvdW50KCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlTmVnYXRpdmVDb3VudC5zdW0oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRSZWNlbnRUcnVlTmVnYXRpdmVDb3VudCgpCisgICAgeworICAgICAgICBsb25nIHRuYyA9IGdldFRydWVOZWdhdGl2ZUNvdW50KCk7CisgICAgICAgIGxvbmcgbGFzdCA9IGxhc3RUcnVlTmVnYXRpdmVDb3VudC5nZXRBbmRTZXQodG5jKTsKKyAgICAgICAgcmV0dXJuIHRuYyAtIGxhc3Q7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvQWJzdHJhY3RTU1RhYmxlRm9ybWF0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9BYnN0cmFjdFNTVGFibGVGb3JtYXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmMxOTg1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvQWJzdHJhY3RTU1RhYmxlRm9ybWF0LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNTVGFibGVGb3JtYXQ8UiBleHRlbmRzIFNTVGFibGVSZWFkZXIsIFcgZXh0ZW5kcyBTU1RhYmxlV3JpdGVyPiBpbXBsZW1lbnRzIFNTVGFibGVGb3JtYXQ8UiwgVz4KK3sKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG5hbWU7CisgICAgcHJvdGVjdGVkIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9uczsKKworICAgIHByb3RlY3RlZCBBYnN0cmFjdFNTVGFibGVGb3JtYXQoU3RyaW5nIG5hbWUsIE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucykKKyAgICB7CisgICAgICAgIHRoaXMubmFtZSA9IE9iamVjdHMucmVxdWlyZU5vbk51bGwobmFtZSk7CisgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBuYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhPYmplY3QgbykKKyAgICB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIEFic3RyYWN0U1NUYWJsZUZvcm1hdDw/LCA/PiB0aGF0ID0gKEFic3RyYWN0U1NUYWJsZUZvcm1hdDw/LCA/PikgbzsKKyAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWxzKG5hbWUsIHRoYXQubmFtZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpCisgICAgeworICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKG5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L0NvbXByZXNzaW9uSW5mb0NvbXBvbmVudC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvQ29tcHJlc3Npb25JbmZvQ29tcG9uZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJjMTBiZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L0NvbXByZXNzaW9uSW5mb0NvbXBvbmVudC5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuTm9TdWNoRmlsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNSZWFkRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQ29tcHJlc3Npb25NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0LkNvbXBvbmVudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworCitwdWJsaWMgY2xhc3MgQ29tcHJlc3Npb25JbmZvQ29tcG9uZW50Cit7CisgICAgcHVibGljIHN0YXRpYyBDb21wcmVzc2lvbk1ldGFkYXRhIG1heWJlTG9hZChEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMpCisgICAgeworICAgICAgICBpZiAoY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnRzLkNPTVBSRVNTSU9OX0lORk8pKQorICAgICAgICAgICAgcmV0dXJuIGxvYWQoZGVzY3JpcHRvcik7CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBDb21wcmVzc2lvbk1ldGFkYXRhIGxvYWRJZkV4aXN0cyhEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCisgICAgeworICAgICAgICBpZiAoZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuQ09NUFJFU1NJT05fSU5GTykuZXhpc3RzKCkpCisgICAgICAgICAgICByZXR1cm4gbG9hZChkZXNjcmlwdG9yKTsKKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIENvbXByZXNzaW9uTWV0YWRhdGEgbG9hZChEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCisgICAgeworICAgICAgICByZXR1cm4gQ29tcHJlc3Npb25NZXRhZGF0YS5vcGVuKGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkNPTVBSRVNTSU9OX0lORk8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IudmVyc2lvbi5oYXNNYXhDb21wcmVzc2VkTGVuZ3RoKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJlc3QtZWZmb3J0IGNoZWNraW5nIHRvIHZlcmlmeSB0aGUgZXhwZWN0ZWQgY29tcHJlc3Npb24gaW5mbyBjb21wb25lbnQgZXhpc3RzLCBhY2NvcmRpbmcgdG8gdGhlIFRPQyBmaWxlLgorICAgICAqIFRoZSB2ZXJpZmljYXRpb24gZGVwZW5kcyBvbiB0aGUgZXhpc3RlbmNlIG9mIFRPQyBmaWxlLiBJZiBhYnNlbnQsIHRoZSB2ZXJpZmljYXRpb24gaXMgc2tpcHBlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yCisgICAgICogQHBhcmFtIGFjdHVhbENvbXBvbmVudHMsIGFjdHVhbCBjb21wb25lbnRzIGxpc3RlZCBmcm9tIHRoZSBmaWxlIHN5c3RlbS4KKyAgICAgKiBAdGhyb3dzIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uLCBpZiBUT0MgZXhwZWN0cyBjb21wcmVzc2lvbiBpbmZvIGJ1dCBub3QgZm91bmQgZnJvbSBkaXNrLgorICAgICAqIEB0aHJvd3MgRlNSZWFkRXJyb3IsICAgICAgICAgICAgIGlmIHVuYWJsZSB0byByZWFkIGZyb20gVE9DIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeUNvbXByZXNzaW9uSW5mb0V4aXN0ZW5jZUlmQXBwbGljYWJsZShEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFNldDxDb21wb25lbnQ+IGFjdHVhbENvbXBvbmVudHMpIHRocm93cyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiwgRlNSZWFkRXJyb3IKKyAgICB7CisgICAgICAgIEZpbGUgdG9jRmlsZSA9IGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlRPQyk7CisgICAgICAgIGlmICh0b2NGaWxlLmV4aXN0cygpKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXQ8Q29tcG9uZW50PiBleHBlY3RlZENvbXBvbmVudHMgPSBUT0NDb21wb25lbnQubG9hZFRPQyhkZXNjcmlwdG9yLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkQ29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnRzLkNPTVBSRVNTSU9OX0lORk8pICYmICFhY3R1YWxDb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudHMuQ09NUFJFU1NJT05fSU5GTykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGNvbXByZXNzaW9uSW5mb0ZpbGUgPSBkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5DT01QUkVTU0lPTl9JTkZPKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKG5ldyBOb1N1Y2hGaWxlRXhjZXB0aW9uKGNvbXByZXNzaW9uSW5mb0ZpbGUuYWJzb2x1dGVQYXRoKCkpLCBjb21wcmVzc2lvbkluZm9GaWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRlNSZWFkRXJyb3IoZSwgdG9jRmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9EYXRhQ29tcG9uZW50LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9EYXRhQ29tcG9uZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM2N2NiNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L0RhdGFDb21wb25lbnQuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWcuRmx1c2hDb21wcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuSUNvbXByZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29sbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuQ2hlY2tzdW1tZWRTZXF1ZW50aWFsV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNlcXVlbnRpYWxXcml0ZXJPcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbXByZXNzaW9uUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworCitwdWJsaWMgY2xhc3MgRGF0YUNvbXBvbmVudAoreworICAgIHB1YmxpYyBzdGF0aWMgU2VxdWVudGlhbFdyaXRlciBidWlsZFdyaXRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbnRpYWxXcml0ZXJPcHRpb24gb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGFDb2xsZWN0b3IgbWV0YWRhdGFDb2xsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvblR5cGUgb3BlcmF0aW9uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmx1c2hDb21wcmVzc2lvbiBmbHVzaENvbXByZXNzaW9uKQorICAgIHsKKyAgICAgICAgaWYgKG1ldGFkYXRhLnBhcmFtcy5jb21wcmVzc2lvbi5pc0VuYWJsZWQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgQ29tcHJlc3Npb25QYXJhbXMgY29tcHJlc3Npb25QYXJhbXMgPSBidWlsZENvbXByZXNzaW9uUGFyYW1zKG1ldGFkYXRhLCBvcGVyYXRpb25UeXBlLCBmbHVzaENvbXByZXNzaW9uKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlcihkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuQ09NUFJFU1NJT05fSU5GTyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRJR0VTVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUNvbGxlY3Rvcik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENoZWNrc3VtbWVkU2VxdWVudGlhbFdyaXRlcihkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkNSQyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5ESUdFU1QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhbiBPcFR5cGUsIGRldGVybWluZSB0aGUgY29ycmVjdCBDb21wcmVzc2lvbiBQYXJhbWV0ZXJzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAbGluayBDb21wcmVzc2lvblBhcmFtc30KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBDb21wcmVzc2lvblBhcmFtcyBidWlsZENvbXByZXNzaW9uUGFyYW1zKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsIE9wZXJhdGlvblR5cGUgb3BlcmF0aW9uVHlwZSwgRmx1c2hDb21wcmVzc2lvbiBmbHVzaENvbXByZXNzaW9uKQorICAgIHsKKyAgICAgICAgQ29tcHJlc3Npb25QYXJhbXMgY29tcHJlc3Npb25QYXJhbXMgPSBtZXRhZGF0YS5wYXJhbXMuY29tcHJlc3Npb247CisgICAgICAgIGZpbmFsIElDb21wcmVzc29yIGNvbXByZXNzb3IgPSBjb21wcmVzc2lvblBhcmFtcy5nZXRTc3RhYmxlQ29tcHJlc3NvcigpOworCisgICAgICAgIGlmIChudWxsICE9IGNvbXByZXNzb3IgJiYgb3BlcmF0aW9uVHlwZSA9PSBPcGVyYXRpb25UeXBlLkZMVVNIKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBmbHVzaGluZyBvdXQgb2YgdGhlIG1lbXRhYmxlIHRocm91Z2hwdXQgb2YgdGhlIGNvbXByZXNzb3IgaXMgY3JpdGljYWwgYXMgZmx1c2hlcywKKyAgICAgICAgICAgIC8vIGVzcGVjaWFsbHkgb2YgbGFyZ2UgdGFibGVzLCBjYW4gcXVldWUgdXAgYW5kIHBvdGVudGlhbGx5IGJsb2NrIHdyaXRlcy4KKyAgICAgICAgICAgIC8vIFRoaXMgb3B0aW1pemF0aW9uIGFsbG93cyB1cyB0byBmYWxsIGJhY2sgdG8gYSBmYXN0ZXIgY29tcHJlc3NvciBpZiBhIHBhcnRpY3VsYXIKKyAgICAgICAgICAgIC8vIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpbmRpY2F0ZXMgd2Ugc2hvdWxkLiBTZWUgQ0FTU0FORFJBLTE1Mzc5IGZvciBtb3JlIGRldGFpbHMuCisgICAgICAgICAgICBzd2l0Y2ggKGZsdXNoQ29tcHJlc3Npb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gSXQgaXMgcmVsYXRpdmVseSBlYXNpZXIgdG8gaW5zZXJ0IGEgTm9vcCBjb21wcmVzc29yIHRoYW4gdG8gZGlzYWJsZSBjb21wcmVzc2VkIHdyaXRpbmcKKyAgICAgICAgICAgICAgICAvLyBlbnRpcmVseSBhcyB0aGUgImNvbXByZXNzaW9uIiBtZW1iZXIgZmllbGQgaXMgcHJvdmlkZWQgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBjbGFzcy4KKyAgICAgICAgICAgICAgICAvLyBJdCBtYXkgbWFrZSBzZW5zZSBpbiB0aGUgZnV0dXJlIHRvIHJlZmFjdG9yIHRoZSBvd25lcnNoaXAgb2YgdGhlIGNvbXByZXNzaW9uIGZsYWcgc28gdGhhdAorICAgICAgICAgICAgICAgIC8vIFdlIGNhbiBieXBhc3MgdGhlIENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyIGluIHRoaXMgY2FzZSBlbnRpcmVseS4KKyAgICAgICAgICAgICAgICBjYXNlIG5vbmU6CisgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uUGFyYW1zID0gQ29tcHJlc3Npb25QYXJhbXMuTk9PUDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBmYXN0OgorICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbXByZXNzb3IucmVjb21tZW5kZWRVc2VzKCkuY29udGFpbnMoSUNvbXByZXNzb3IuVXNlcy5GQVNUX0NPTVBSRVNTSU9OKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGRlZmF1bHQgY29tcHJlc3NvciBpcyBnZW5lcmFsbHkgZmFzdCAoTFo0IHdpdGggMTZLaUIgYmxvY2sgc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uUGFyYW1zID0gQ29tcHJlc3Npb25QYXJhbXMuREVGQVVMVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGVsc2UgZmFsbCB0aHJvdWdoCisgICAgICAgICAgICAgICAgY2FzZSB0YWJsZToKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29tcHJlc3Npb25QYXJhbXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvRmlsdGVyQ29tcG9uZW50LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9GaWx0ZXJDb21wb25lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjk5ZDdkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvRmlsdGVyQ29tcG9uZW50LmphdmEKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLlZhbGlkYXRpb25NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSW5wdXRTdHJlYW1QbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZU91dHB1dFN0cmVhbVBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQmxvb21GaWx0ZXJTZXJpYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZpbHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSUZpbHRlcjsKKworcHVibGljIGNsYXNzIEZpbHRlckNvbXBvbmVudAoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihGaWx0ZXJDb21wb25lbnQuY2xhc3MpOworCisgICAgZmluYWwgc3RhdGljIGJvb2xlYW4gcmVidWlsZEZpbHRlck9uRlBDaGFuY2VDaGFuZ2UgPSBmYWxzZTsKKyAgICBmaW5hbCBzdGF0aWMgZG91YmxlIGZpbHRlckZQQ2hhbmNlVG9sZXJhbmNlID0gMGQ7CisKKyAgICBwcml2YXRlIEZpbHRlckNvbXBvbmVudCgpCisgICAgeworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWQgYmxvb20gZmlsdGVyIGZyb20gRmlsdGVyLmRiIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBJRmlsdGVyIGxvYWQoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIEZpbGUgZmlsdGVyRmlsZSA9IGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkZJTFRFUik7CisKKyAgICAgICAgaWYgKCFmaWx0ZXJGaWxlLmV4aXN0cygpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgaWYgKGZpbHRlckZpbGUubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBGaWx0ZXJGYWN0b3J5LkFsd2F5c1ByZXNlbnQ7CisKKyAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW1QbHVzIHN0cmVhbSA9IGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkZJTFRFUikubmV3SW5wdXRTdHJlYW0oKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJsb29tRmlsdGVyU2VyaWFsaXplci5mb3JWZXJzaW9uKGRlc2NyaXB0b3IudmVyc2lvbi5oYXNPbGRCZkZvcm1hdCgpKS5kZXNlcmlhbGl6ZShzdHJlYW0pOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJGYWlsZWQgdG8gbG9hZCBCbG9vbSBmaWx0ZXIgZm9yIFNTVGFibGU6ICIgKyBkZXNjcmlwdG9yLmJhc2VGaWxlKCksIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlKElGaWx0ZXIgZmlsdGVyLCBEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGJvb2xlYW4gZGVsZXRlT25GYWlsdXJlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIEZpbGUgZmlsdGVyRmlsZSA9IGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkZJTFRFUik7CisgICAgICAgIHRyeSAoRmlsZU91dHB1dFN0cmVhbVBsdXMgc3RyZWFtID0gZmlsdGVyRmlsZS5uZXdPdXRwdXRTdHJlYW0oRmlsZS5Xcml0ZU1vZGUuT1ZFUldSSVRFKSkKKyAgICAgICAgeworICAgICAgICAgICAgZmlsdGVyLnNlcmlhbGl6ZShzdHJlYW0sIGRlc2NyaXB0b3IudmVyc2lvbi5oYXNPbGRCZkZvcm1hdCgpKTsKKyAgICAgICAgICAgIHN0cmVhbS5mbHVzaCgpOworICAgICAgICAgICAgc3RyZWFtLnN5bmMoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkZWxldGVPbkZhaWx1cmUpCisgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuRklMVEVSKS5kZWxldGVJZkV4aXN0cygpOworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJGYWlsZWQgdG8gc2F2ZSBCbG9vbSBmaWx0ZXIgZm9yIFNTVGFibGU6ICIgKyBkZXNjcmlwdG9yLmJhc2VGaWxlKCksIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE9wdGlvbmFsbHkgbG9hZHMgYSBCbG9vbSBmaWx0ZXIuCisgICAgICogSWYgdGhlIGZpbHRlciBpcyBub3QgbmVlZGVkIChGUCBjaGFuY2UgaXMgbmVnbGVjdGFibGUpLCBpdCByZXR1cm5zIHtAbGluayBGaWx0ZXJGYWN0b3J5I0Fsd2F5c1ByZXNlbnR9LgorICAgICAqIElmIHRoZSBmaWx0ZXIgaXMgZXhwZWN0ZWQgdG8gYmUgcmVjcmVhdGVkIGZvciB2YXJpb3VzIHJlYXNvbnMgdGhlIG1ldGhvZCByZXR1cm5zIHtAY29kZSBudWxsfS4KKyAgICAgKiBPdGhlcndpc2UsIGFuIGF0dGVtcHQgdG8gbG9hZCB0aGUgZmlsdGVyIGlzIG1hZGUgYW5kIGlmIGl0IHN1Y2NlZWRzLCB0aGUgbG9hZGVkIGZpbHRlciBpcyByZXR1cm5lZC4KKyAgICAgKiBJZiBsb2FkaW5nIGZhaWxzLCB0aGUgbWV0aG9kIHJldHVybnMge0Bjb2RlIG51bGx9LgorICAgICAqCisgICAgICogQHJldHVybiB7QGxpbmsgRmlsdGVyRmFjdG9yeSNBbHdheXNQcmVzZW50fSwgbG9hZGVkIGZpbHRlciBvciB7QGNvZGUgbnVsbH0gKHdoaWNoIG1lYW5zIHRoYXQgdGhlIGZpbHRlciBzaG91bGQgYmUgcmVidWlsdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIElGaWx0ZXIgbWF5YmVMb2FkQmxvb21GaWx0ZXIoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzLCBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBWYWxpZGF0aW9uTWV0YWRhdGEgdmFsaWRhdGlvbk1ldGFkYXRhKQorICAgIHsKKyAgICAgICAgZG91YmxlIGN1cnJlbnRGUENoYW5jZSA9IHZhbGlkYXRpb25NZXRhZGF0YSAhPSBudWxsID8gdmFsaWRhdGlvbk1ldGFkYXRhLmJsb29tRmlsdGVyRlBDaGFuY2UgOiBEb3VibGUuTmFOOworICAgICAgICBkb3VibGUgZGVzaXJlZEZQQ2hhbmNlID0gbWV0YWRhdGEucGFyYW1zLmJsb29tRmlsdGVyRnBDaGFuY2U7CisKKyAgICAgICAgSUZpbHRlciBmaWx0ZXIgPSBudWxsOworICAgICAgICBpZiAoIXNob3VsZFVzZUJsb29tRmlsdGVyKGRlc2lyZWRGUENoYW5jZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIkJsb29tIGZpbHRlciBmb3Ige30gd2lsbCBub3QgYmUgbG9hZGVkIGJlY2F1c2UgZnBDaGFuY2U9e30gaXMgbmVnbGlnaWJsZSIsIGRlc2NyaXB0b3IsIGRlc2lyZWRGUENoYW5jZSk7CisKKyAgICAgICAgICAgIHJldHVybiBGaWx0ZXJGYWN0b3J5LkFsd2F5c1ByZXNlbnQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIWNvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50cy5GSUxURVIpIHx8IERvdWJsZS5pc05hTihjdXJyZW50RlBDaGFuY2UpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJCbG9vbSBmaWx0ZXIgZm9yIHt9IHdpbGwgbm90IGJlIGxvYWRlZCBiZWNhdXNlIHRoZSBmaWx0ZXIgY29tcG9uZW50IGlzIG1pc3Npbmcgb3Igc3N0YWJsZSBsYWNrcyB2YWxpZGF0aW9uIG1ldGFkYXRhIiwgZGVzY3JpcHRvcik7CisKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFpc0ZQQ2hhbmNlRGlmZk5lZ2xpZ2libGUoZGVzaXJlZEZQQ2hhbmNlLCBjdXJyZW50RlBDaGFuY2UpICYmIHJlYnVpbGRGaWx0ZXJPbkZQQ2hhbmNlQ2hhbmdlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJCbG9vbSBmaWx0ZXIgZm9yIHt9IHdpbGwgbm90IGJlIGxvYWRlZCBiZWNhdXNlIGZwQ2hhbmNlIGhhcyBjaGFuZ2VkIGZyb20ge30gdG8ge30gYW5kIHRoZSBmaWx0ZXIgc2hvdWxkIGJlIHJlY3JlYXRlZCIsIGRlc2NyaXB0b3IsIGN1cnJlbnRGUENoYW5jZSwgZGVzaXJlZEZQQ2hhbmNlKTsKKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgZmlsdGVyID0gbG9hZChkZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIGlmIChmaWx0ZXIgPT0gbnVsbCB8fCAhZmlsdGVyLmlzSW5mb3JtYXRpdmUoKSkKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiQmxvb20gZmlsdGVyIGZvciB7fSBpcyBtaXNzaW5nIG9yIGludmFsaWQiLCBkZXNjcmlwdG9yKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJCbG9vbSBmaWx0ZXIgZm9yICIgKyBkZXNjcmlwdG9yICsgIiBjb3VsZCBub3QgYmUgZGVzZXJpYWxpemVkIiwgZXgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZpbHRlcjsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbGVhbiBzaG91bGRVc2VCbG9vbUZpbHRlcihkb3VibGUgZnBDaGFuY2UpCisgICAgeworICAgICAgICByZXR1cm4gIShNYXRoLmFicygxIC0gZnBDaGFuY2UpIDw9IGZpbHRlckZQQ2hhbmNlVG9sZXJhbmNlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbGVhbiBpc0ZQQ2hhbmNlRGlmZk5lZ2xpZ2libGUoZG91YmxlIGZwQ2hhbmNlMSwgZG91YmxlIGZwQ2hhbmNlMikKKyAgICB7CisgICAgICAgIHJldHVybiBNYXRoLmFicyhmcENoYW5jZTEgLSBmcENoYW5jZTIpIDw9IGZpbHRlckZQQ2hhbmNlVG9sZXJhbmNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L0luZGV4Q29tcG9uZW50LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9JbmRleENvbXBvbmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZGZjNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9JbmRleENvbXBvbmVudC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5DaHVua0NhY2hlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSU9PcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworCitwdWJsaWMgY2xhc3MgSW5kZXhDb21wb25lbnQKK3sKKyAgICBwdWJsaWMgc3RhdGljIEZpbGVIYW5kbGUuQnVpbGRlciBmaWxlQnVpbGRlcihGaWxlIGZpbGUsIElPT3B0aW9ucyBpb09wdGlvbnMsIENodW5rQ2FjaGUgY2h1bmtDYWNoZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKGZpbGUpLndpdGhDaHVua0NhY2hlKGNodW5rQ2FjaGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1tYXBwZWQoaW9PcHRpb25zLmluZGV4RGlza0FjY2Vzc01vZGUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRmlsZUhhbmRsZS5CdWlsZGVyIGZpbGVCdWlsZGVyKENvbXBvbmVudCBjb21wb25lbnQsIFNTVGFibGUgc3NUYWJsZSkKKyAgICB7CisgICAgICAgIHJldHVybiBmaWxlQnVpbGRlcihzc1RhYmxlLmRlc2NyaXB0b3IuZmlsZUZvcihjb21wb25lbnQpLCBzc1RhYmxlLmlvT3B0aW9ucywgc3NUYWJsZS5jaHVua0NhY2hlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEZpbGVIYW5kbGUuQnVpbGRlciBmaWxlQnVpbGRlcihDb21wb25lbnQgY29tcG9uZW50LCBTU1RhYmxlLkJ1aWxkZXI8PywgPz4gYnVpbGRlcikKKyAgICB7CisgICAgICAgIHJldHVybiBmaWxlQnVpbGRlcihidWlsZGVyLmRlc2NyaXB0b3IuZmlsZUZvcihjb21wb25lbnQpLCBidWlsZGVyLmdldElPT3B0aW9ucygpLCBidWlsZGVyLmdldENodW5rQ2FjaGUoKSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1JhbmdlQXdhcmVTU1RhYmxlV3JpdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9SYW5nZUF3YXJlU1NUYWJsZVdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWIxNWIxLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1JhbmdlQXdhcmVTU1RhYmxlV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlza0JvdW5kYXJpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUGFydGl0aW9uUG9zaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlTmV3VHJhY2tlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlTXVsdGlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7Ci0KLXB1YmxpYyBjbGFzcyBSYW5nZUF3YXJlU1NUYWJsZVdyaXRlciBpbXBsZW1lbnRzIFNTVGFibGVNdWx0aVdyaXRlcgotewotICAgIHByaXZhdGUgZmluYWwgTGlzdDxQYXJ0aXRpb25Qb3NpdGlvbj4gYm91bmRhcmllczsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8RGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeT4gZGlyZWN0b3JpZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgc3N0YWJsZUxldmVsOwotICAgIHByaXZhdGUgZmluYWwgbG9uZyBlc3RpbWF0ZWRLZXlzOwotICAgIHByaXZhdGUgZmluYWwgbG9uZyByZXBhaXJlZEF0OwotICAgIHByaXZhdGUgZmluYWwgVGltZVVVSUQgcGVuZGluZ1JlcGFpcjsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNUcmFuc2llbnQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTU1RhYmxlRm9ybWF0LlR5cGUgZm9ybWF0OwotICAgIHByaXZhdGUgZmluYWwgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaWZlY3ljbGVOZXdUcmFja2VyIGxpZmVjeWNsZU5ld1RyYWNrZXI7Ci0gICAgcHJpdmF0ZSBpbnQgY3VycmVudEluZGV4ID0gLTE7Ci0gICAgcHVibGljIGZpbmFsIENvbHVtbkZhbWlseVN0b3JlIGNmczsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8U1NUYWJsZU11bHRpV3JpdGVyPiBmaW5pc2hlZFdyaXRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8U1NUYWJsZVJlYWRlcj4gZmluaXNoZWRSZWFkZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgcHJpdmF0ZSBTU1RhYmxlTXVsdGlXcml0ZXIgY3VycmVudFdyaXRlciA9IG51bGw7Ci0KLSAgICBwdWJsaWMgUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXIoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBsb25nIGVzdGltYXRlZEtleXMsIGxvbmcgcmVwYWlyZWRBdCwgVGltZVVVSUQgcGVuZGluZ1JlcGFpciwgYm9vbGVhbiBpc1RyYW5zaWVudCwgU1NUYWJsZUZvcm1hdC5UeXBlIGZvcm1hdCwgaW50IHNzdGFibGVMZXZlbCwgbG9uZyB0b3RhbFNpemUsIExpZmVjeWNsZU5ld1RyYWNrZXIgbGlmZWN5Y2xlTmV3VHJhY2tlciwgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRGlza0JvdW5kYXJpZXMgZGIgPSBjZnMuZ2V0RGlza0JvdW5kYXJpZXMoKTsKLSAgICAgICAgZGlyZWN0b3JpZXMgPSBkYi5kaXJlY3RvcmllczsKLSAgICAgICAgdGhpcy5zc3RhYmxlTGV2ZWwgPSBzc3RhYmxlTGV2ZWw7Ci0gICAgICAgIHRoaXMuY2ZzID0gY2ZzOwotICAgICAgICB0aGlzLmVzdGltYXRlZEtleXMgPSBlc3RpbWF0ZWRLZXlzIC8gZGlyZWN0b3JpZXMuc2l6ZSgpOwotICAgICAgICB0aGlzLnJlcGFpcmVkQXQgPSByZXBhaXJlZEF0OwotICAgICAgICB0aGlzLnBlbmRpbmdSZXBhaXIgPSBwZW5kaW5nUmVwYWlyOwotICAgICAgICB0aGlzLmlzVHJhbnNpZW50ID0gaXNUcmFuc2llbnQ7Ci0gICAgICAgIHRoaXMuZm9ybWF0ID0gZm9ybWF0OwotICAgICAgICB0aGlzLmxpZmVjeWNsZU5ld1RyYWNrZXIgPSBsaWZlY3ljbGVOZXdUcmFja2VyOwotICAgICAgICB0aGlzLmhlYWRlciA9IGhlYWRlcjsKLSAgICAgICAgYm91bmRhcmllcyA9IGRiLnBvc2l0aW9uczsKLSAgICAgICAgaWYgKGJvdW5kYXJpZXMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgRGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeSBsb2NhbERpciA9IGNmcy5nZXREaXJlY3RvcmllcygpLmdldFdyaXRlYWJsZUxvY2F0aW9uKHRvdGFsU2l6ZSk7Ci0gICAgICAgICAgICBpZiAobG9jYWxEaXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiSW5zdWZmaWNpZW50IGRpc2sgc3BhY2UgdG8gc3RvcmUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KHRvdGFsU2l6ZSkpKTsKLSAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzYyA9IGNmcy5uZXdTU1RhYmxlRGVzY3JpcHRvcihjZnMuZ2V0RGlyZWN0b3JpZXMoKS5nZXRMb2NhdGlvbkZvckRpc2sobG9jYWxEaXIpLCBmb3JtYXQpOwotICAgICAgICAgICAgY3VycmVudFdyaXRlciA9IGNmcy5jcmVhdGVTU1RhYmxlTXVsdGlXcml0ZXIoZGVzYywgZXN0aW1hdGVkS2V5cywgcmVwYWlyZWRBdCwgcGVuZGluZ1JlcGFpciwgaXNUcmFuc2llbnQsIHNzdGFibGVMZXZlbCwgaGVhZGVyLCBsaWZlY3ljbGVOZXdUcmFja2VyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBtYXliZVN3aXRjaFdyaXRlcihEZWNvcmF0ZWRLZXkga2V5KQotICAgIHsKLSAgICAgICAgaWYgKGJvdW5kYXJpZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBib29sZWFuIHN3aXRjaGVkID0gZmFsc2U7Ci0gICAgICAgIHdoaWxlIChjdXJyZW50SW5kZXggPCAwIHx8IGtleS5jb21wYXJlVG8oYm91bmRhcmllcy5nZXQoY3VycmVudEluZGV4KSkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2hlZCA9IHRydWU7Ci0gICAgICAgICAgICBjdXJyZW50SW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzd2l0Y2hlZCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGN1cnJlbnRXcml0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBmaW5pc2hlZFdyaXRlcnMuYWRkKGN1cnJlbnRXcml0ZXIpOwotCi0gICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBjZnMubmV3U1NUYWJsZURlc2NyaXB0b3IoY2ZzLmdldERpcmVjdG9yaWVzKCkuZ2V0TG9jYXRpb25Gb3JEaXNrKGRpcmVjdG9yaWVzLmdldChjdXJyZW50SW5kZXgpKSwgZm9ybWF0KTsKLSAgICAgICAgICAgIGN1cnJlbnRXcml0ZXIgPSBjZnMuY3JlYXRlU1NUYWJsZU11bHRpV3JpdGVyKGRlc2MsIGVzdGltYXRlZEtleXMsIHJlcGFpcmVkQXQsIHBlbmRpbmdSZXBhaXIsIGlzVHJhbnNpZW50LCBzc3RhYmxlTGV2ZWwsIGhlYWRlciwgbGlmZWN5Y2xlTmV3VHJhY2tlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhcHBlbmQoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHBhcnRpdGlvbikKLSAgICB7Ci0gICAgICAgIG1heWJlU3dpdGNoV3JpdGVyKHBhcnRpdGlvbi5wYXJ0aXRpb25LZXkoKSk7Ci0gICAgICAgIHJldHVybiBjdXJyZW50V3JpdGVyLmFwcGVuZChwYXJ0aXRpb24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IGZpbmlzaChsb25nIHJlcGFpcmVkQXQsIGxvbmcgbWF4RGF0YUFnZSwgYm9vbGVhbiBvcGVuUmVzdWx0KQotICAgIHsKLSAgICAgICAgaWYgKGN1cnJlbnRXcml0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIGZpbmlzaGVkV3JpdGVycy5hZGQoY3VycmVudFdyaXRlcik7Ci0gICAgICAgIGN1cnJlbnRXcml0ZXIgPSBudWxsOwotICAgICAgICBmb3IgKFNTVGFibGVNdWx0aVdyaXRlciB3cml0ZXIgOiBmaW5pc2hlZFdyaXRlcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh3cml0ZXIuZ2V0RmlsZVBvaW50ZXIoKSA+IDApCi0gICAgICAgICAgICAgICAgZmluaXNoZWRSZWFkZXJzLmFkZEFsbCh3cml0ZXIuZmluaXNoKHJlcGFpcmVkQXQsIG1heERhdGFBZ2UsIG9wZW5SZXN1bHQpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBTU1RhYmxlTXVsdGlXcml0ZXIuYWJvcnRPckRpZSh3cml0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmaW5pc2hlZFJlYWRlcnM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gZmluaXNoKGJvb2xlYW4gb3BlblJlc3VsdCkKLSAgICB7Ci0gICAgICAgIGlmIChjdXJyZW50V3JpdGVyICE9IG51bGwpCi0gICAgICAgICAgICBmaW5pc2hlZFdyaXRlcnMuYWRkKGN1cnJlbnRXcml0ZXIpOwotICAgICAgICBjdXJyZW50V3JpdGVyID0gbnVsbDsKLSAgICAgICAgZm9yIChTU1RhYmxlTXVsdGlXcml0ZXIgd3JpdGVyIDogZmluaXNoZWRXcml0ZXJzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAod3JpdGVyLmdldEZpbGVQb2ludGVyKCkgPiAwKQotICAgICAgICAgICAgICAgIGZpbmlzaGVkUmVhZGVycy5hZGRBbGwod3JpdGVyLmZpbmlzaChvcGVuUmVzdWx0KSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgU1NUYWJsZU11bHRpV3JpdGVyLmFib3J0T3JEaWUod3JpdGVyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmluaXNoZWRSZWFkZXJzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IGZpbmlzaGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaW5pc2hlZFJlYWRlcnM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNTVGFibGVNdWx0aVdyaXRlciBzZXRPcGVuUmVzdWx0KGJvb2xlYW4gb3BlblJlc3VsdCkKLSAgICB7Ci0gICAgICAgIGZpbmlzaGVkV3JpdGVycy5mb3JFYWNoKCh3KSAtPiB3LnNldE9wZW5SZXN1bHQob3BlblJlc3VsdCkpOwotICAgICAgICBjdXJyZW50V3JpdGVyLnNldE9wZW5SZXN1bHQob3BlblJlc3VsdCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZW5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZy5qb2luKCIvIiwgY2ZzLmtleXNwYWNlLmdldE5hbWUoKSwgY2ZzLmdldFRhYmxlTmFtZSgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRGaWxlUG9pbnRlcigpCi0gICAgewotICAgICAgIHJldHVybiBjdXJyZW50V3JpdGVyICE9IG51bGwgPyBjdXJyZW50V3JpdGVyLmdldEZpbGVQb2ludGVyKCkgOiAwTDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVGFibGVJZCBnZXRUYWJsZUlkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjZnMubWV0YWRhdGEuaWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFRocm93YWJsZSBjb21taXQoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCi0gICAgewotICAgICAgICBpZiAoY3VycmVudFdyaXRlciAhPSBudWxsKQotICAgICAgICAgICAgZmluaXNoZWRXcml0ZXJzLmFkZChjdXJyZW50V3JpdGVyKTsKLSAgICAgICAgY3VycmVudFdyaXRlciA9IG51bGw7Ci0gICAgICAgIGZvciAoU1NUYWJsZU11bHRpV3JpdGVyIHdyaXRlciA6IGZpbmlzaGVkV3JpdGVycykKLSAgICAgICAgICAgIGFjY3VtdWxhdGUgPSB3cml0ZXIuY29tbWl0KGFjY3VtdWxhdGUpOwotICAgICAgICByZXR1cm4gYWNjdW11bGF0ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVGhyb3dhYmxlIGFib3J0KFRocm93YWJsZSBhY2N1bXVsYXRlKQotICAgIHsKLSAgICAgICAgaWYgKGN1cnJlbnRXcml0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIGZpbmlzaGVkV3JpdGVycy5hZGQoY3VycmVudFdyaXRlcik7Ci0gICAgICAgIGN1cnJlbnRXcml0ZXIgPSBudWxsOwotICAgICAgICBmb3IgKFNTVGFibGVNdWx0aVdyaXRlciBmaW5pc2hlZFdyaXRlciA6IGZpbmlzaGVkV3JpdGVycykKLSAgICAgICAgICAgIGFjY3VtdWxhdGUgPSBmaW5pc2hlZFdyaXRlci5hYm9ydChhY2N1bXVsYXRlKTsKLQotICAgICAgICByZXR1cm4gYWNjdW11bGF0ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlVG9Db21taXQoKQotICAgIHsKLSAgICAgICAgaWYgKGN1cnJlbnRXcml0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIGZpbmlzaGVkV3JpdGVycy5hZGQoY3VycmVudFdyaXRlcik7Ci0gICAgICAgIGN1cnJlbnRXcml0ZXIgPSBudWxsOwotICAgICAgICBmaW5pc2hlZFdyaXRlcnMuZm9yRWFjaChTU1RhYmxlTXVsdGlXcml0ZXI6OnByZXBhcmVUb0NvbW1pdCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKQotICAgIHsKLSAgICAgICAgaWYgKGN1cnJlbnRXcml0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIGZpbmlzaGVkV3JpdGVycy5hZGQoY3VycmVudFdyaXRlcik7Ci0gICAgICAgIGN1cnJlbnRXcml0ZXIgPSBudWxsOwotICAgICAgICBmaW5pc2hlZFdyaXRlcnMuZm9yRWFjaChTU1RhYmxlTXVsdGlXcml0ZXI6OmNsb3NlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TU1RhYmxlRmx1c2hPYnNlcnZlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU1NUYWJsZUZsdXNoT2JzZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5OTI1ZS4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TU1RhYmxlRmx1c2hPYnNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkOwotCi0vKioKLSAqIE9ic2VydmVyIGZvciBldmVudHMgaW4gdGhlIGxpZmVjeWNsZSBvZiB3cml0aW5nIG91dCBhbiBzc3RhYmxlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNTVGFibGVGbHVzaE9ic2VydmVyCi17Ci0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJlZm9yZSB3cml0aW5nIGFueSBkYXRhIHRvIHRoZSBzc3RhYmxlLgotICAgICAqLwotICAgIHZvaWQgYmVnaW4oKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIGEgbmV3IHBhcnRpdGlvbiBpbiBiZWluZyB3cml0dGVuIHRvIHRoZSBzc3RhYmxlLAotICAgICAqIGJ1dCBiZWZvcmUgYW55IGNlbGxzIGFyZSBwcm9jZXNzZWQgKHNlZSB7QGxpbmsgI25leHRVbmZpbHRlcmVkQ2x1c3RlcihVbmZpbHRlcmVkKX0pLgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBUaGUga2V5IGJlaW5nIGFwcGVuZGVkIHRvIFNTVGFibGUuCi0gICAgICogQHBhcmFtIGluZGV4UG9zaXRpb24gVGhlIHBvc2l0aW9uIG9mIHRoZSBrZXkgaW4gdGhlIFNTVGFibGUgUFJJTUFSWV9JTkRFWCBmaWxlLgotICAgICAqLwotICAgIHZvaWQgc3RhcnRQYXJ0aXRpb24oRGVjb3JhdGVkS2V5IGtleSwgbG9uZyBpbmRleFBvc2l0aW9uKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCBhZnRlciB0aGUgdW5maWx0ZXJlZCBjbHVzdGVyIGlzIHdyaXR0ZW4gdG8gdGhlIHNzdGFibGUuCi0gICAgICogV2lsbCBiZSBwcmVjZWRlZCBieSBhIGNhbGwgdG8ge0Bjb2RlIHN0YXJ0UGFydGl0aW9uKERlY29yYXRlZEtleSwgbG9uZyl9LAotICAgICAqIGFuZCB0aGUgY2x1c3RlciBzaG91bGQgYmUgYXNzdW1lZCB0byBiZWxvbmcgdG8gdGhhdCBwYXJ0aXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdW5maWx0ZXJlZENsdXN0ZXIgVGhlIHVuZmlsdGVyZWQgY2x1c3RlciBiZWluZyBhZGRlZCB0byBTU1RhYmxlLgotICAgICAqLwotICAgIHZvaWQgbmV4dFVuZmlsdGVyZWRDbHVzdGVyKFVuZmlsdGVyZWQgdW5maWx0ZXJlZENsdXN0ZXIpOwotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gYWxsIGRhdGEgaXMgd3JpdHRlbiB0byB0aGUgZmlsZSBhbmQgaXQncyByZWFkeSB0byBiZSBmaW5pc2hlZCB1cC4KLSAgICAgKi8KLSAgICB2b2lkIGNvbXBsZXRlKCk7Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TU1RhYmxlRm9ybWF0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TU1RhYmxlRm9ybWF0LmphdmEKaW5kZXggMTRmNjYwMi4uMWNhYTg3YiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU1NUYWJsZUZvcm1hdC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NTVGFibGVGb3JtYXQuamF2YQpAQCAtMTcsNjEgKzE3LDE5OCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0OwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5DaGFyTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk5vbm51bGw7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dJbmRleEVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZU5ld1RyYWNrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFJvd0luZGV4RW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVNjcnViYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuTWV0cmljc1Byb3ZpZGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT3V0cHV0SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogCiAvKioKICAqIFByb3ZpZGVzIHRoZSBhY2Nlc3NvcnMgdG8gZGF0YSBvbiBkaXNrLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIFNTVGFibGVGb3JtYXQKK3B1YmxpYyBpbnRlcmZhY2UgU1NUYWJsZUZvcm1hdDxSIGV4dGVuZHMgU1NUYWJsZVJlYWRlciwgVyBleHRlbmRzIFNTVGFibGVXcml0ZXI+CiB7Ci0gICAgc3RhdGljIGJvb2xlYW4gZW5hYmxlU1NUYWJsZURldmVsb3BtZW50VGVzdE1vZGUgPSBCb29sZWFuLmdldEJvb2xlYW4oImNhc3NhbmRyYS50ZXN0LnNzdGFibGVmb3JtYXRkZXZlbG9wbWVudCIpOwotCisgICAgU3RyaW5nIG5hbWUoKTsKIAogICAgIFZlcnNpb24gZ2V0TGF0ZXN0VmVyc2lvbigpOwogICAgIFZlcnNpb24gZ2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbik7CiAKLSAgICBTU1RhYmxlV3JpdGVyLkZhY3RvcnkgZ2V0V3JpdGVyRmFjdG9yeSgpOwotICAgIFNTVGFibGVSZWFkZXIuRmFjdG9yeSBnZXRSZWFkZXJGYWN0b3J5KCk7CisgICAgU1NUYWJsZVdyaXRlckZhY3Rvcnk8VywgPz4gZ2V0V3JpdGVyRmFjdG9yeSgpOwogCi0gICAgUm93SW5kZXhFbnRyeS5JbmRleFNlcmlhbGl6ZXI8Pz4gZ2V0SW5kZXhTZXJpYWxpemVyKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsIFZlcnNpb24gdmVyc2lvbiwgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIpOworICAgIFNTVGFibGVSZWFkZXJGYWN0b3J5PFIsID8+IGdldFJlYWRlckZhY3RvcnkoKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgZW51bSBUeXBlCisgICAgLyoqCisgICAgICogQWxsIHRoZSBjb21wb25lbnRzIHRoYXQgdGhlIHdyaXR0ZXIgY2FuIHByb2R1Y2Ugd2hlbiBzYXZpbmcgYW4gc3N0YWJsZSwgYXMgd2VsbCBhcyBhbGwgdGhlIGNvbXBvbmVudHMKKyAgICAgKiB0aGF0IHRoZSByZWFkZXIgY2FuIHJlYWQuCisgICAgICovCisgICAgU2V0PENvbXBvbmVudD4gYWxsQ29tcG9uZW50cygpOworCisgICAgU2V0PENvbXBvbmVudD4gc3RyZWFtaW5nQ29tcG9uZW50cygpOworCisgICAgU2V0PENvbXBvbmVudD4gcHJpbWFyeUNvbXBvbmVudHMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgY29tcG9uZW50cyByZXF1aXJlZCBieSBvZmZsaW5lIGNvbXBhY3Rpb24gdGFza3MgLSBsaWtlIHNwbGl0dGluZyBzc3RhYmxlcy4KKyAgICAgKi8KKyAgICBTZXQ8Q29tcG9uZW50PiBiYXRjaENvbXBvbmVudHMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbXBvbmVudHMgd2hpY2ggc2hvdWxkIGJlIHNlbGVjdGVkIGZvciB1cGxvYWQgYnkgdGhlIHNzdGFibGUgbG9hZGVyLgorICAgICAqLworICAgIFNldDxDb21wb25lbnQ+IHVwbG9hZENvbXBvbmVudHMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzZXQgb2YgdGhlIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgY2hhbmdlZCBhZnRlciBhbiBzc3RhYmxlIHdhcyB3cml0dGVuLgorICAgICAqLworICAgIFNldDxDb21wb25lbnQ+IG11dGFibGVDb21wb25lbnRzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc2V0IG9mIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgd2hlbiBsb2FkaW5nIHNzdGFibGUgYW5kIHRodXMgYXJlIG5vdCBtYW5kYXRvcnkuCisgICAgICovCisgICAgU2V0PENvbXBvbmVudD4gZ2VuZXJhdGVkT25Mb2FkQ29tcG9uZW50cygpOworCisgICAgS2V5Q2FjaGVWYWx1ZVNlcmlhbGl6ZXI8UiwgPz4gZ2V0S2V5Q2FjaGVWYWx1ZVNlcmlhbGl6ZXIoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgc2NydWJiZXIgZm9yIGFuIHNzdGFibGUuIE5vdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gbXVzdCBjb250YWluIG9ubHkgb25lIHJlYWRlcgorICAgICAqIGFuZCB0aGUgcmVhZGVyIG11c3QgbWF0Y2ggdGhlIHByb3ZpZGVkIGNmcy4KKyAgICAgKi8KKyAgICBJU2NydWJiZXIgZ2V0U2NydWJiZXIoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0SGFuZGxlciBvdXRwdXRIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJU2NydWJiZXIuT3B0aW9ucyBvcHRpb25zKTsKKworICAgIE1ldHJpY3NQcm92aWRlcnMgZ2V0Rm9ybWF0U3BlY2lmaWNNZXRyaWNzUHJvdmlkZXJzKCk7CisKKyAgICB2b2lkIGRlbGV0ZU9ycGhhbmVkQ29tcG9uZW50cyhEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMpOworCisgICAgLyoqCisgICAgICogRGVsZXRlcyB0aGUgZXhpc3RpbmcgY29tcG9uZW50cyBvZiB0aGUgc3N0YWJsZXMgcmVwcmVzZW50ZWQgYnkgdGhlIHByb3ZpZGVkIGRlc2NyaXB0b3IuCisgICAgICogVGhlIG1ldGhvZCBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBjbGVhbmluZyB1cCB0aGUgaW4tbWVtb3J5IHJlc291cmNlcyBvY2N1cGllZCBieSB0aGUgc3R1ZmYgcmVsYXRlZCB0byB0aGF0CisgICAgICogc3N0YWJsZXMsIHN1Y2ggYXMgcm93IGtleSBjYWNoZSBlbnRyaWVzLgorICAgICAqLworICAgIHZvaWQgZGVsZXRlKERlc2NyaXB0b3IgZGVzY3JpcHRvcik7CisKKyAgICBpbnRlcmZhY2UgU1NUYWJsZVJlYWRlckZhY3Rvcnk8UiBleHRlbmRzIFNTVGFibGVSZWFkZXIsIEIgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyLkJ1aWxkZXI8UiwgQj4+CiAgICAgewotICAgICAgICAvL1RoZSBvcmlnaW5hbCBzc3RhYmxlIGZvcm1hdAotICAgICAgICBCSUcoImJpZyIsIEJpZ0Zvcm1hdC5pbnN0YW5jZSk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBIHNpbXBsZSBidWlsZGVyIHdoaWNoIGNyZWF0ZXMgYW4gaW5zdG5hY2Ugb2Yge0BsaW5rIFNTVGFibGVSZWFkZXJ9IHdpdGggdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuCisgICAgICAgICAqIEl0IGV4cGVjdHMgdGhhdCBhbGwgdGhlIHJlcXVpcmVkIHJlc291cmNlcyB0byBiZSBvcGVuZWQvbG9hZGVkIGV4dGVybmFsbHkgYnkgdGhlIGNhbGxlci4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBidWlsZGVyIGlzIGV4cGVjdGVkIHRvIHBlcmZvcm0gYmFzaWMgdmFsaWRhdGlvbiBvZiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy4KKyAgICAgICAgICovCisgICAgICAgIFNTVGFibGVSZWFkZXIuQnVpbGRlcjxSLCBCPiBidWlsZGVyKERlc2NyaXB0b3IgZGVzY3JpcHRvcik7CiAKLSAgICAgICAgcHVibGljIGZpbmFsIFNTVGFibGVGb3JtYXQgaW5mbzsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBuYW1lOworICAgICAgICAvKioKKyAgICAgICAgICogQSBidWlsZGVyIHdoaWNoIG9wZW5zL2xvYWRzIGFsbCB0aGUgcmVxdWlyZWQgcmVzb3VyY2VzIHVwb24gZXhlY3V0aW9uIG9mCisgICAgICAgICAqIHtAbGluayBTU1RhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXIjYnVpbGQoU1NUYWJsZS5Pd25lciwgYm9vbGVhbiwgYm9vbGVhbil9IGFuZCBwYXNzZWQgdGhlbSB0byB0aGUgY3JlYXRlZAorICAgICAgICAgKiByZWFkZXIgaW5zdGFuY2UuIElmIHRoZSBjcmVhdGlvbiBvZiB7QGxpbmsgU1NUYWJsZVJlYWRlcn0gZmFpbHMsIG5vIHJlc291cmNlcyBzaG91bGQgYmUgbGVmdCBvcGVuZWQuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgYnVpbGRlciBpcyBleHBlY3RlZCB0byBwZXJmb3JtIGJhc2ljIHZhbGlkYXRpb24gb2YgdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuCisgICAgICAgICAqLworICAgICAgICBTU1RhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXI8UiwgQj4gbG9hZGluZ0J1aWxkZXIoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBUYWJsZU1ldGFkYXRhUmVmIHRhYmxlTWV0YWRhdGFSZWYsIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMpOwogCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgVHlwZSBjdXJyZW50KCkKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHJpZXZlcyBhIGtleSByYW5nZSBmb3IgdGhlIGdpdmVuIHNzdGFibGUgYXQgdGhlIGxvd2VzdCBjb3N0IC0gdGhhdCBpcywgd2l0aG91dCBvcGVuaW5nIGFsbCBzc3RhYmxlcyBmaWxlcworICAgICAgICAgKiBpZiBwb3NzaWJsZS4KKyAgICAgICAgICovCisgICAgICAgIFBhaXI8RGVjb3JhdGVkS2V5LCBEZWNvcmF0ZWRLZXk+IHJlYWRLZXlSYW5nZShEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lcikgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgICAgIENsYXNzPFI+IGdldFJlYWRlckNsYXNzKCk7CisgICAgfQorCisgICAgaW50ZXJmYWNlIFNTVGFibGVXcml0ZXJGYWN0b3J5PFcgZXh0ZW5kcyBTU1RhYmxlV3JpdGVyLCBCIGV4dGVuZHMgU1NUYWJsZVdyaXRlci5CdWlsZGVyPFcsIEI+PgorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgYSBuZXcgYnVpbGRlciB3aGljaCBjYW4gY3JlYXRlIGluc3RhbmNlIG9mIHtAbGluayBTU1RhYmxlV3JpdGVyfSB3aXRoIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLgorICAgICAgICAgKiBTaW1pbGFybHkgdG8gdGhlIGxvYWRpbmcgYnVpbGRlciwgaXQgc2hvdWxkIG9wZW4gdGhlIHJlcXVpcmVkIHJlc291cmNlcyB3aGVuCisgICAgICAgICAqIHRoZSB7QGxpbmsgU1NUYWJsZVdyaXRlci5CdWlsZGVyI2J1aWxkKExpZmVjeWNsZU5ld1RyYWNrZXIsIFNTVGFibGUuT3duZXIpfSBtZXRob2QgaXMgY2FsbGVkLgorICAgICAgICAgKiBJdCBzaG91bGQgbm90IGxldCB0aGUgY2FsbGVyIHBhc3NpbmcgYW55IGNsb3NlYWJsZSByZXNvdXJjZXMgZGlyZWN0bHksIHRoYXQgaXMsIHZpYSBzZXR0ZXJzLgorICAgICAgICAgKiBJZiBidWlsZGluZyBmYWlscywgYWxsIHRoZSBvcGVuZWQgcmVzb3VyY2VzIHNob3VsZCBiZSByZWxlYXNlZC4KKyAgICAgICAgICovCisgICAgICAgIEIgYnVpbGRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUcmllcyB0byBlc3RpbWF0ZSB0aGUgc2l6ZSBvZiBhbGwgdGhlIHNzdGFibGUgZmlsZXMgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy4KKyAgICAgICAgICovCisgICAgICAgIGxvbmcgZXN0aW1hdGVTaXplKFNTVGFibGVXcml0ZXIuU1NUYWJsZVNpemVQYXJhbWV0ZXJzIHBhcmFtZXRlcnMpOworICAgIH0KKworICAgIGNsYXNzIENvbXBvbmVudHMKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHlwZXMKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEJJRzsKKyAgICAgICAgICAgIC8vIHRoZSBiYXNlIGRhdGEgZm9yIGFuIHNzdGFibGU6IHRoZSByZW1haW5pbmcgY29tcG9uZW50cyBjYW4gYmUgcmVnZW5lcmF0ZWQKKyAgICAgICAgICAgIC8vIGJhc2VkIG9uIHRoZSBkYXRhIGNvbXBvbmVudAorICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnQuVHlwZSBEQVRBID0gQ29tcG9uZW50LlR5cGUuY3JlYXRlU2luZ2xldG9uKCJEQVRBIiwgIkRhdGEuZGIiLCBudWxsKTsKKyAgICAgICAgICAgIC8vIGZpbGUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCB1bmNvbXByZXNzZWQgZGF0YSBsZW5ndGgsIGNodW5rIG9mZnNldHMgZXRjLgorICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnQuVHlwZSBDT01QUkVTU0lPTl9JTkZPID0gQ29tcG9uZW50LlR5cGUuY3JlYXRlU2luZ2xldG9uKCJDT01QUkVTU0lPTl9JTkZPIiwgIkNvbXByZXNzaW9uSW5mby5kYiIsIG51bGwpOworICAgICAgICAgICAgLy8gc3RhdGlzdGljYWwgbWV0YWRhdGEgYWJvdXQgdGhlIGNvbnRlbnQgb2YgdGhlIHNzdGFibGUKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50LlR5cGUgU1RBVFMgPSBDb21wb25lbnQuVHlwZS5jcmVhdGVTaW5nbGV0b24oIlNUQVRTIiwgIlN0YXRpc3RpY3MuZGIiLCBudWxsKTsKKyAgICAgICAgICAgIC8vIHNlcmlhbGl6ZWQgYmxvb20gZmlsdGVyIGZvciB0aGUgcm93IGtleXMgaW4gdGhlIHNzdGFibGUKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50LlR5cGUgRklMVEVSID0gQ29tcG9uZW50LlR5cGUuY3JlYXRlU2luZ2xldG9uKCJGSUxURVIiLCAiRmlsdGVyLmRiIiwgbnVsbCk7CisgICAgICAgICAgICAvLyBob2xkcyBDUkMzMiBjaGVja3N1bSBvZiB0aGUgZGF0YSBmaWxlCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudC5UeXBlIERJR0VTVCA9IENvbXBvbmVudC5UeXBlLmNyZWF0ZVNpbmdsZXRvbigiRElHRVNUIiwgIkRpZ2VzdC5jcmMzMiIsIG51bGwpOworICAgICAgICAgICAgLy8gaG9sZHMgdGhlIENSQzMyIGZvciBjaHVua3MgaW4gYW4gdW5jb21wcmVzc2VkIGZpbGUuCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudC5UeXBlIENSQyA9IENvbXBvbmVudC5UeXBlLmNyZWF0ZVNpbmdsZXRvbigiQ1JDIiwgIkNSQy5kYiIsIG51bGwpOworICAgICAgICAgICAgLy8gdGFibGUgb2YgY29udGVudHMsIHN0b3JlcyB0aGUgbGlzdCBvZiBhbGwgY29tcG9uZW50cyBmb3IgdGhlIHNzdGFibGUKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50LlR5cGUgVE9DID0gQ29tcG9uZW50LlR5cGUuY3JlYXRlU2luZ2xldG9uKCJUT0MiLCAiVE9DLnR4dCIsIG51bGwpOworICAgICAgICAgICAgLy8gYnVpbHQtaW4gc2Vjb25kYXJ5IGluZGV4IChtYXkgZXhpc3QgbXVsdGlwbGUgcGVyIHNzdGFibGUpCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudC5UeXBlIFNFQ09OREFSWV9JTkRFWCA9IENvbXBvbmVudC5UeXBlLmNyZWF0ZSgiU0VDT05EQVJZX0lOREVYIiwgIlNJXy4qLmRiIiwgbnVsbCk7CisgICAgICAgICAgICAvLyBjdXN0b20gY29tcG9uZW50LCB1c2VkIGJ5IGUuZy4gY3VzdG9tIGNvbXBhY3Rpb24gc3RyYXRlZ3kKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50LlR5cGUgQ1VTVE9NID0gQ29tcG9uZW50LlR5cGUuY3JlYXRlKCJDVVNUT00iLCBudWxsLCBudWxsKTsKICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgVHlwZShTdHJpbmcgbmFtZSwgU1NUYWJsZUZvcm1hdCBpbmZvKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL1NpbmNlIGZvcm1hdCBjb21lcyByaWdodCBhZnRlciBnZW5lcmF0aW9uCi0gICAgICAgICAgICAvL3dlIGRpc2FsbG93IGZvcm1hdHMgd2l0aCBudW1lcmljIG5hbWVzCi0gICAgICAgICAgICBhc3NlcnQgIUNoYXJNYXRjaGVyLmRpZ2l0KCkubWF0Y2hlc0FsbE9mKG5hbWUpOworICAgICAgICAvLyBzaW5nbGV0b24gY29tcG9uZW50cyBmb3IgdHlwZXMgdGhhdCBkb24ndCBuZWVkIGlkcworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIENvbXBvbmVudCBEQVRBID0gVHlwZXMuREFUQS5nZXRTaW5nbGV0b24oKTsKKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBDb21wb25lbnQgQ09NUFJFU1NJT05fSU5GTyA9IFR5cGVzLkNPTVBSRVNTSU9OX0lORk8uZ2V0U2luZ2xldG9uKCk7CisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29tcG9uZW50IFNUQVRTID0gVHlwZXMuU1RBVFMuZ2V0U2luZ2xldG9uKCk7CisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29tcG9uZW50IEZJTFRFUiA9IFR5cGVzLkZJTFRFUi5nZXRTaW5nbGV0b24oKTsKKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBDb21wb25lbnQgRElHRVNUID0gVHlwZXMuRElHRVNULmdldFNpbmdsZXRvbigpOworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIENvbXBvbmVudCBDUkMgPSBUeXBlcy5DUkMuZ2V0U2luZ2xldG9uKCk7CisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29tcG9uZW50IFRPQyA9IFR5cGVzLlRPQy5nZXRTaW5nbGV0b24oKTsKKyAgICB9CiAKLSAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICB0aGlzLmluZm8gPSBpbmZvOwotICAgICAgICB9CisgICAgaW50ZXJmYWNlIEtleUNhY2hlVmFsdWVTZXJpYWxpemVyPFIgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyLCBUIGV4dGVuZHMgQWJzdHJhY3RSb3dJbmRleEVudHJ5PgorICAgIHsKKyAgICAgICAgdm9pZCBza2lwKERhdGFJbnB1dFBsdXMgaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAotICAgICAgICBwdWJsaWMgc3RhdGljIFR5cGUgdmFsaWRhdGUoU3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoVHlwZSB2YWxpZCA6IFR5cGUudmFsdWVzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbGlkLm5hbWUuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwotICAgICAgICAgICAgfQorICAgICAgICBUIGRlc2VyaWFsaXplKFIgcmVhZGVyLCBEYXRhSW5wdXRQbHVzIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb247CiAKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIFR5cGUgY29uc3RhbnQgIiArIG5hbWUpOwotICAgICAgICB9CisgICAgICAgIHZvaWQgc2VyaWFsaXplKFQgZW50cnksIERhdGFPdXRwdXRQbHVzIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIH0KKworICAgIGludGVyZmFjZSBGYWN0b3J5CisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBhIG5hbWUgb2YgdGhlIGZvcm1hdC4gRm9ybWF0IG5hbWUgbXVzdCBub3QgYmUgZW1wdHksIG11c3QgYmUgdW5pcXVlIGFuZCBtdXN0IGNvbnNpc3Qgb25seSBvZiBsb3dlcmNhc2UgbGV0dGVycy4KKyAgICAgICAgICovCisgICAgICAgIFN0cmluZyBuYW1lKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNzdGFibGUgZm9ybWF0IGNvbmZpZ3VyZWQgd2l0aCB0aGUgcHJvdmlkZWQgb3B0aW9ucy4KKyAgICAgICAgICogPHAvPgorICAgICAgICAgKiBUaGUgbWV0aG9kIGlzIGV4cGVjdGVkIHRvIHZhbGlkYXRlIHRoZSBvcHRpb25zLCBhbmQgdGhyb3cKKyAgICAgICAgICoge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbn0gaWYgdGhlIHZhbGlkYXRpb24gZmFpbHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvcHRpb25zICAgIG92ZXJyaWRlcyBmb3IgdGhlIGRlZmF1bHQgb3B0aW9ucywgY2FuIGJlIGVtcHR5LCBjYW5ub3QgYmUgbnVsbAorICAgICAgICAgKi8KKyAgICAgICAgU1NUYWJsZUZvcm1hdDw/LCA/PiBnZXRJbnN0YW5jZShATm9ubnVsbCBNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnMpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NTVGFibGVSZWFkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NTVGFibGVSZWFkZXIuamF2YQppbmRleCBmMjZjZjY1Li5mZDM0YzAyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TU1RhYmxlUmVhZGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU1NUYWJsZVJlYWRlci5qYXZhCkBAIC0yMCwxMjMgKzIwLDEzMyBAQAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5maWxlLk5vU3VjaEZpbGVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5PcmRlcmluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLkxvbmdzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5SYXRlTGltaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRXhlY3V0b3JQbHVzOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBjb20uY2xlYXJzcHJpbmcuYW5hbHl0aWNzLnN0cmVhbS5jYXJkaW5hbGl0eS5DYXJkaW5hbGl0eU1lcmdlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5jbGVhcnNwcmluZy5hbmFseXRpY3Muc3RyZWFtLmNhcmRpbmFsaXR5Lkh5cGVyTG9nTG9nUGx1czsKIGltcG9ydCBjb20uY2xlYXJzcHJpbmcuYW5hbHl0aWNzLnN0cmVhbS5jYXJkaW5hbGl0eS5JQ2FyZGluYWxpdHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5JbnN0cnVtZW50aW5nQ2FjaGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuS2V5Q2FjaGVLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvclBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUGFydGl0aW9uUG9zaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TeXN0ZW1LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5FbmNvZGluZ1N0YXRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQWJzdHJhY3RCb3VuZHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJvdW5kczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuVW5rbm93bkNvbHVtbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU0Vycm9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTUmVhZEVycm9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTV3JpdGVFcnJvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzcy5Db21wcmVzc2lvbk1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQWJzdHJhY3RSb3dJbmRleEVudHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29ycnVwdFNTVGFibGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVNTVGFibGVTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVZlcmlmaWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuS2V5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5LZXlSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZUlkRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVJZGVudGl0eUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVJlYWRzTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuQ29tcGFjdGlvbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuU3RhdHNNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkNoYW5uZWxQcm94eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkNoZWNrZWRGdW5jdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnRlZ3JpdHlNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlRGF0YUlucHV0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlJlc3RvcmFibGVNZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ2FjaGluZ1BhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlSWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5BY3RpdmVSZXBhaXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2FjaGVTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkVzdGltYXRlZEhpc3RvZ3JhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5FeGVjdXRvclV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpWTVN0YWJpbGl0eUluc3BlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5OYXRpdmVMaWJyYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk91dHB1dEhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50Lk9wT3JkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5TZWxmUmVmQ291bnRlZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlNoYXJlZENsb3NlYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlVuY2hlY2tlZEludGVycnVwdGVkRXhjZXB0aW9uOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRXhlY3V0b3JGYWN0b3J5Lkdsb2JhbC5leGVjdXRvckZhY3Rvcnk7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpcmVjdG9yaWVzLlNFQ09OREFSWV9JTkRFWF9OQU1FX1NFUEFSQVRPUjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlcy5uZXdCbG9ja2luZ1F1ZXVlOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlNoYXJlZENsb3NlYWJsZS5zaGFyZWRDb3B5T3JOdWxsOwogCiAvKioKLSAqIEFuIFNTVGFibGVSZWFkZXIgY2FuIGJlIGNvbnN0cnVjdGVkIGluIGEgbnVtYmVyIG9mIHBsYWNlcywgYnV0IHR5cGljYWxseSBpcyBlaXRoZXIKLSAqIHJlYWQgZnJvbSBkaXNrIGF0IHN0YXJ0dXAsIG9yIGNvbnN0cnVjdGVkIGZyb20gYSBmbHVzaGVkIG1lbXRhYmxlLCBvciBhZnRlciBjb21wYWN0aW9uCi0gKiB0byByZXBsYWNlIHNvbWUgZXhpc3Rpbmcgc3N0YWJsZXMuIEhvd2V2ZXIgb25jZSBjcmVhdGVkLCBhbiBzc3RhYmxlcmVhZGVyIG1heSBhbHNvIGJlIG1vZGlmaWVkLgotICoKLSAqIEEgcmVhZGVyJ3MgT3BlblJlYXNvbiBkZXNjcmliZXMgaXRzIGN1cnJlbnQgc3RhZ2UgaW4gaXRzIGxpZmVjeWNsZSwgYXMgZm9sbG93czoKLSAqCi0gKgotICogPHByZT4ge0Bjb2RlCi0gKiBOT1JNQUwKLSAqIEZyb206ICAgICAgIE5vbmUgICAgICAgID0+IFJlYWRlciBoYXMgYmVlbiByZWFkIGZyb20gZGlzaywgZWl0aGVyIGF0IHN0YXJ0dXAgb3IgZnJvbSBhIGZsdXNoZWQgbWVtdGFibGUKLSAqICAgICAgICAgICAgIEVBUkxZICAgICAgID0+IFJlYWRlciBpcyB0aGUgZmluYWwgcmVzdWx0IG9mIGEgY29tcGFjdGlvbgotICogICAgICAgICAgICAgTU9WRURfU1RBUlQgPT4gUmVhZGVyIFdBUyBiZWluZyBjb21wYWN0ZWQsIGJ1dCB0aGlzIGZhaWxlZCBhbmQgaXQgaGFzIGJlZW4gcmVzdG9yZWQgdG8gTk9STUFMIHN0YXR1cwotICoKLSAqIEVBUkxZCi0gKiBGcm9tOiAgICAgICBOb25lICAgICAgICA9PiBSZWFkZXIgaXMgYSBjb21wYWN0aW9uIHJlcGxhY2VtZW50IHRoYXQgaXMgZWl0aGVyIGluY29tcGxldGUgYW5kIGhhcyBiZWVuIG9wZW5lZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVwcmVzZW50IGl0cyBwYXJ0aWFsIHJlc3VsdCBzdGF0dXMsIG9yIGhhcyBiZWVuIGZpbmlzaGVkIGJ1dCB0aGUgY29tcGFjdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgYSBwYXJ0IG9mIGhhcyBub3QgeWV0IGNvbXBsZXRlZCBmdWxseQotICogICAgICAgICAgICAgRUFSTFkgICAgICAgPT4gU2FtZSBhcyBmcm9tIE5vbmUsIG9ubHkgaXQgaXMgbm90IHRoZSBmaXJzdCB0aW1lIGl0IGhhcyBiZWVuCi0gKgotICogTU9WRURfU1RBUlQKLSAqIEZyb206ICAgICAgIE5PUk1BTCAgICAgID0+IFJlYWRlciBpcyBiZWluZyBjb21wYWN0ZWQuIFRoaXMgY29tcGFjdGlvbiBoYXMgbm90IGZpbmlzaGVkLCBidXQgdGhlIGNvbXBhY3Rpb24gcmVzdWx0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBlaXRoZXIgcGFydGlhbGx5IG9yIGZ1bGx5IG9wZW5lZCwgdG8gZWl0aGVyIHBhcnRpYWxseSBvciBmdWxseSByZXBsYWNlIHRoaXMgcmVhZGVyLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyByZWFkZXIncyBzdGFydCBrZXkgaGFzIGJlZW4gdXBkYXRlZCB0byByZXByZXNlbnQgdGhpcywgc28gdGhhdCByZWFkcyBvbmx5IGhpdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIG9yIHRoZSBvdGhlciByZWFkZXIuCi0gKgotICogTUVUQURBVEFfQ0hBTkdFCi0gKiBGcm9tOiAgICAgICBOT1JNQUwgICAgICA9PiBSZWFkZXIgaGFzIHNlZW4gbG93IHRyYWZmaWMgYW5kIHRoZSBhbW91bnQgb2YgbWVtb3J5IGF2YWlsYWJsZSBmb3IgaW5kZXggc3VtbWFyaWVzIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW5lZCwgc28gaXRzIGluZGV4IHN1bW1hcnkgaGFzIGJlZW4gZG93bnNhbXBsZWQuCi0gKiAgICAgICAgIE1FVEFEQVRBX0NIQU5HRSA9PiBTYW1lCi0gKiB9IDwvcHJlPgotICoKLSAqIE5vdGUgdGhhdCBpbiBwYXJhbGxlbCB0byB0aGlzLCB0aGVyZSBhcmUgdHdvIGRpZmZlcmVudCBEZXNjcmlwdG9yIHR5cGVzOyBUTVBMSU5LIGFuZCBGSU5BTDsgdGhlIGxhdHRlciBjb3JyZXNwb25kcwotICogdG8gTk9STUFMIHN0YXRlIHJlYWRlcnMgYW5kIGFsbCByZWFkZXJzIHRoYXQgcmVwbGFjZSBhIE5PUk1BTCBvbmUuIFRNUExJTksgaXMgdXNlZCBmb3IgRUFSTFkgc3RhdGUgcmVhZGVycyBhbmQKLSAqIG5vIG90aGVycy4KLSAqCi0gKiBXaGVuIGEgcmVhZGVyIGlzIGJlaW5nIGNvbXBhY3RlZCwgaWYgdGhlIHJlc3VsdCBpcyBsYXJnZSBpdHMgcmVwbGFjZW1lbnQgbWF5IGJlIG9wZW5lZCBhcyBFQVJMWSBiZWZvcmUgY29tcGFjdGlvbgotICogY29tcGxldGVzIGluIG9yZGVyIHRvIHByZXNlbnQgdGhlIHJlc3VsdCB0byBjb25zdW1lcnMgZWFybGllci4gSW4gdGhpcyBjYXNlIHRoZSByZWFkZXIgd2lsbCBpdHNlbGYgYmUgY2hhbmdlZCB0bwotICogYSBNT1ZFRF9TVEFSVCBzdGF0ZSwgd2hlcmUgaXRzIHN0YXJ0IG5vIGxvbmdlciByZXByZXNlbnRzIGl0cyBvbi1kaXNrIG1pbmltdW0ga2V5LiBUaGlzIGlzIHRvIHBlcm1pdCByZWFkcyB0byBiZQotICogZGlyZWN0ZWQgdG8gb25seSBvbmUgcmVhZGVyIHdoZW4gdGhlIHR3byByZXByZXNlbnQgdGhlIHNhbWUgZGF0YS4gVGhlIEVBUkxZIGZpbGUgY2FuIHJlcHJlc2VudCBhIGNvbXBhY3Rpb24gcmVzdWx0Ci0gKiB0aGF0IGlzIGVpdGhlciBwYXJ0aWFsbHkgY29tcGxldGUgYW5kIHN0aWxsIGluLXByb2dyZXNzLCBvciBhIGNvbXBsZXRlIGFuZCBpbW11dGFibGUgc3N0YWJsZSB0aGF0IGlzIHBhcnQgb2YgYSBsYXJnZXIKLSAqIG1hY3JvIGNvbXBhY3Rpb24gYWN0aW9uIHRoYXQgaGFzIG5vdCB5ZXQgZnVsbHkgY29tcGxldGVkLgotICoKLSAqIEN1cnJlbnRseSBBTEwgY29tcGFjdGlvbiByZXN1bHRzIGF0IGxlYXN0IGJyaWVmbHkgZ28gdGhyb3VnaCBhbiBFQVJMWSBvcGVuIHN0YXRlIHByaW9yIHRvIGNvbXBsZXRpb24sIHJlZ2FyZGxlc3MKLSAqIG9mIGlmIGVhcmx5IG9wZW5pbmcgaXMgZW5hYmxlZC4KLSAqCi0gKiBTaW5jZSBhIHJlYWRlciBjYW4gYmUgY3JlYXRlZCBtdWx0aXBsZSB0aW1lcyBvdmVyIHRoZSBzYW1lIHNoYXJlZCB1bmRlcmx5aW5nIHJlc291cmNlcywgYW5kIHRoZSBleGFjdCByZXNvdXJjZXMKLSAqIGl0IHNoYXJlcyBiZXR3ZWVuIGVhY2ggaW5zdGFuY2UgZGlmZmVyIHN1YnRseSwgd2UgdHJhY2sgdGhlIGxpZmV0aW1lIG9mIGFueSB1bmRlcmx5aW5nIHJlc291cmNlIHdpdGggaXRzIG93bgotICogcmVmZXJlbmNlIGNvdW50LCB3aGljaCBlYWNoIGluc3RhbmNlIHRha2VzIGEgUmVmIHRvLiBFYWNoIGluc3RhbmNlIHRoZW4gdHJhY2tzIHJlZmVyZW5jZXMgdG8gaXRzZWxmLCBhbmQgb25jZSB0aGVzZQotICogYWxsIGV4cGlyZSBpdCByZWxlYXNlcyBpdHMgUmVmcyB0byB0aGVzZSB1bmRlcmx5aW5nIHJlc291cmNlcy4KLSAqCi0gKiBUaGVyZSBpcyBzb21lIHNoYXJlZCBjbGVhbnVwIGJlaGF2aW91ciBuZWVkZWQgb25seSBvbmNlIGFsbCBzc3RhYmxlcmVhZGVycyBpbiBhIGNlcnRhaW4gc3RhZ2Ugb2YgdGhlaXIgbGlmZWN5Y2xlCi0gKiAoaS5lLiBFQVJMWSBvciBOT1JNQUwgb3BlbmluZyksIGFuZCBzb21lIHRoYXQgbXVzdCBvbmx5IG9jY3VyIG9uY2UgYWxsIHJlYWRlcnMgb2YgYW55IGtpbmQgb3ZlciBhIHNpbmdsZSBsb2dpY2FsCi0gKiBzc3RhYmxlIGhhdmUgZXhwaXJlZC4gVGhlc2UgYXJlIG1hbmFnZWQgYnkgdGhlIFR5cGVUaWR5IGFuZCBHbG9iYWxUaWR5IGNsYXNzZXMgYXQgdGhlIGJvdHRvbSwgYW5kIGFyZSBlZmZlY3RpdmVseQotICogbWFuYWdlZCBhcyBhbm90aGVyIHJlc291cmNlIGVhY2ggaW5zdGFuY2UgdHJhY2tzIGl0cyBvd24gUmVmIGluc3RhbmNlIHRvLCB0byBlbnN1cmUgYWxsIG9mIHRoZXNlIHJlc291cmNlcyBhcmUKLSAqIGNsZWFuZWQgdXAgc2FmZWx5IGFuZCBjYW4gYmUgZGVidWdnZWQgb3RoZXJ3aXNlLgotICoKKyAqIEFuIFNTVGFibGVSZWFkZXIgY2FuIGJlIGNvbnN0cnVjdGVkIGluIGEgbnVtYmVyIG9mIHBsYWNlcywgYnV0IHR5cGljYWxseSBpcyBlaXRoZXIgcmVhZCBmcm9tIGRpc2sgYXQgc3RhcnR1cCwgb3IKKyAqIGNvbnN0cnVjdGVkIGZyb20gYSBmbHVzaGVkIG1lbXRhYmxlLCBvciBhZnRlciBjb21wYWN0aW9uIHRvIHJlcGxhY2Ugc29tZSBleGlzdGluZyBzc3RhYmxlcy4gSG93ZXZlciBvbmNlIGNyZWF0ZWQsCisgKiBhbiBzc3RhYmxlcmVhZGVyIG1heSBhbHNvIGJlIG1vZGlmaWVkLgorICogPHA+CisgKiBBIHJlYWRlcidzIHtAbGluayBPcGVuUmVhc29ufSBkZXNjcmliZXMgaXRzIGN1cnJlbnQgc3RhZ2UgaW4gaXRzIGxpZmVjeWNsZS4gTm90ZSB0aGF0IGluIHBhcmFsbGVsIHRvIHRoaXMsIHRoZXJlIGFyZQorICogdHdvIGRpZmZlcmVudCBEZXNjcmlwdG9yIHR5cGVzOyBUTVBMSU5LIGFuZCBGSU5BTDsgdGhlIGxhdHRlciBjb3JyZXNwb25kcyB0byB7QGxpbmsgT3BlblJlYXNvbiNOT1JNQUx9IHN0YXRlIHJlYWRlcnMKKyAqIGFuZCBhbGwgcmVhZGVycyB0aGF0IHJlcGxhY2UgYSB7QGxpbmsgT3BlblJlYXNvbiNOT1JNQUx9IG9uZS4gVE1QTElOSyBpcyB1c2VkIGZvciB7QGxpbmsgT3BlblJlYXNvbiNFQVJMWX0gc3RhdGUKKyAqIHJlYWRlcnMgYW5kIG5vIG90aGVycy4KKyAqIDxwPgorICogV2hlbiBhIHJlYWRlciBpcyBiZWluZyBjb21wYWN0ZWQsIGlmIHRoZSByZXN1bHQgaXMgbGFyZ2UgaXRzIHJlcGxhY2VtZW50IG1heSBiZSBvcGVuZWQgYXMge0BsaW5rIE9wZW5SZWFzb24jRUFSTFl9CisgKiBiZWZvcmUgY29tcGFjdGlvbiBjb21wbGV0ZXMgaW4gb3JkZXIgdG8gcHJlc2VudCB0aGUgcmVzdWx0IHRvIGNvbnN1bWVycyBlYXJsaWVyLiBJbiB0aGlzIGNhc2UgdGhlIHJlYWRlciB3aWxsIGl0c2VsZgorICogYmUgY2hhbmdlZCB0byBhIHtAbGluayBPcGVuUmVhc29uI01PVkVEX1NUQVJUfSBzdGF0ZSwgd2hlcmUgaXRzIHN0YXJ0IG5vIGxvbmdlciByZXByZXNlbnRzIGl0cyBvbi1kaXNrIG1pbmltdW0ga2V5LgorICogVGhpcyBpcyB0byBwZXJtaXQgcmVhZHMgdG8gYmUgZGlyZWN0ZWQgdG8gb25seSBvbmUgcmVhZGVyIHdoZW4gdGhlIHR3byByZXByZXNlbnQgdGhlIHNhbWUgZGF0YS4KKyAqIFRoZSB7QGxpbmsgT3BlblJlYXNvbiNFQVJMWX0gZmlsZSBjYW4gcmVwcmVzZW50IGEgY29tcGFjdGlvbiByZXN1bHQgdGhhdCBpcyBlaXRoZXIgcGFydGlhbGx5IGNvbXBsZXRlIGFuZCBzdGlsbAorICogaW4tcHJvZ3Jlc3MsIG9yIGEgY29tcGxldGUgYW5kIGltbXV0YWJsZSBzc3RhYmxlIHRoYXQgaXMgcGFydCBvZiBhIGxhcmdlciBtYWNybyBjb21wYWN0aW9uIGFjdGlvbiB0aGF0IGhhcyBub3QgeWV0CisgKiBmdWxseSBjb21wbGV0ZWQuCisgKiA8cD4KKyAqIEN1cnJlbnRseSBBTEwgY29tcGFjdGlvbiByZXN1bHRzIGF0IGxlYXN0IGJyaWVmbHkgZ28gdGhyb3VnaCBhbiB7QGxpbmsgT3BlblJlYXNvbiNFQVJMWX0gb3BlbiBzdGF0ZSBwcmlvciB0byBjb21wbGV0aW9uLAorICogcmVnYXJkbGVzcyBvZiBpZiBlYXJseSBvcGVuaW5nIGlzIGVuYWJsZWQuCisgKiA8cD4KKyAqIFNpbmNlIGEgcmVhZGVyIGNhbiBiZSBjcmVhdGVkIG11bHRpcGxlIHRpbWVzIG92ZXIgdGhlIHNhbWUgc2hhcmVkIHVuZGVybHlpbmcgcmVzb3VyY2VzLCBhbmQgdGhlIGV4YWN0IHJlc291cmNlcyBpdAorICogc2hhcmVzIGJldHdlZW4gZWFjaCBpbnN0YW5jZSBkaWZmZXIgc3VidGx5LCB3ZSB0cmFjayB0aGUgbGlmZXRpbWUgb2YgYW55IHVuZGVybHlpbmcgcmVzb3VyY2Ugd2l0aCBpdHMgb3duIHJlZmVyZW5jZQorICogY291bnQsIHdoaWNoIGVhY2ggaW5zdGFuY2UgdGFrZXMgYSB7QGxpbmsgUmVmfSB0by4gRWFjaCBpbnN0YW5jZSB0aGVuIHRyYWNrcyByZWZlcmVuY2VzIHRvIGl0c2VsZiwgYW5kIG9uY2UgdGhlc2UKKyAqIGFsbCBleHBpcmUgaXQgcmVsZWFzZXMgYWxsIGl0cyB7QGxpbmsgUmVmfSB0byB0aGVzZSB1bmRlcmx5aW5nIHJlc291cmNlcy4KKyAqIDxwPgorICogVGhlcmUgaXMgc29tZSBzaGFyZWQgY2xlYW51cCBiZWhhdmlvdXIgbmVlZGVkIG9ubHkgb25jZSBhbGwgcmVhZGVycyBpbiBhIGNlcnRhaW4gc3RhZ2Ugb2YgdGhlaXIgbGlmZWN5Y2xlCisgKiAoaS5lLiB7QGxpbmsgT3BlblJlYXNvbiNFQVJMWX0gb3Ige0BsaW5rIE9wZW5SZWFzb24jTk9STUFMfSBvcGVuaW5nKSwgYW5kIHNvbWUgdGhhdCBtdXN0IG9ubHkgb2NjdXIgb25jZSBhbGwgcmVhZGVycworICogb2YgYW55IGtpbmQgb3ZlciBhIHNpbmdsZSBsb2dpY2FsIHNzdGFibGUgaGF2ZSBleHBpcmVkLiBUaGVzZSBhcmUgbWFuYWdlZCBieSB0aGUge0BsaW5rIEluc3RhbmNlVGlkaWVyfSBhbmQKKyAqIHtAbGluayBHbG9iYWxUaWR5fSBjbGFzc2VzIGF0IHRoZSBib3R0b20sIGFuZCBhcmUgZWZmZWN0aXZlbHkgbWFuYWdlZCBhcyBhbm90aGVyIHJlc291cmNlIGVhY2ggaW5zdGFuY2UgdHJhY2tzIGl0cworICogb3duIHtAbGluayBSZWZ9IGluc3RhbmNlIHRvLCB0byBlbnN1cmUgYWxsIG9mIHRoZXNlIHJlc291cmNlcyBhcmUgY2xlYW5lZCB1cCBzYWZlbHkgYW5kIGNhbiBiZSBkZWJ1Z2dlZCBvdGhlcndpc2UuCisgKiA8cD4KICAqIFRPRE86IGZpbGwgaW4gZGV0YWlscyBhYm91dCBUcmFja2VyIGFuZCBsaWZlY3ljbGUgaW50ZXJhY3Rpb25zIGZvciB0b29scywgYW5kIGZvciBjb21wYWN0aW9uIHN0cmF0ZWdpZXMKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFNTVGFibGVSZWFkZXIgZXh0ZW5kcyBTU1RhYmxlIGltcGxlbWVudHMgVW5maWx0ZXJlZFNvdXJjZSwgU2VsZlJlZkNvdW50ZWQ8U1NUYWJsZVJlYWRlcj4KQEAgLTE0Niw2ICsxNTYsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVFJBQ0tfQUNUSVZJVFkgPSBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRElTQUJMRV9TU1RBQkxFX0FDVElWSVRZX1RSQUNLSU5HLmdldEJvb2xlYW4oKTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNjaGVkdWxlZEV4ZWN1dG9yUGx1cyBzeW5jRXhlY3V0b3IgPSBpbml0U3luY0V4ZWN1dG9yKCk7CisKICAgICBwcml2YXRlIHN0YXRpYyBTY2hlZHVsZWRFeGVjdXRvclBsdXMgaW5pdFN5bmNFeGVjdXRvcigpCiAgICAgewogICAgICAgICBpZiAoRGF0YWJhc2VEZXNjcmlwdG9yLmlzQ2xpZW50T3JUb29sSW5pdGlhbGl6ZWQoKSkKQEAgLTE1Nyw4MSArMTY4LDk4IEBACiAgICAgICAgIC8vIEltbWVkaWF0ZWx5IHJlbW92ZSByZWFkTWV0ZXIgc3luYyB0YXNrIHdoZW4gY2FuY2VsbGVkLgogICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2Ugc2V0IHRoaXMgYnkgZGVmYXVsdCBvbiBhbGwgc2NoZWR1bGVkIGV4ZWN1dG9ycz8KICAgICAgICAgaWYgKHN5bmNFeGVjdXRvciBpbnN0YW5jZW9mIFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcikKLSAgICAgICAgICAgICgoU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKXN5bmNFeGVjdXRvcikuc2V0UmVtb3ZlT25DYW5jZWxQb2xpY3kodHJ1ZSk7CisgICAgICAgICAgICAoKFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcikgc3luY0V4ZWN1dG9yKS5zZXRSZW1vdmVPbkNhbmNlbFBvbGljeSh0cnVlKTsKICAgICAgICAgcmV0dXJuIHN5bmNFeGVjdXRvcjsKICAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSYXRlTGltaXRlciBtZXRlclN5bmNUaHJvdHRsZSA9IFJhdGVMaW1pdGVyLmNyZWF0ZSgxMDAuMCk7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8U1NUYWJsZVJlYWRlcj4gbWF4VGltZXN0YW1wRGVzY2VuZGluZyA9IChvMSwgbzIpIC0+IExvbmcuY29tcGFyZShvMi5nZXRNYXhUaW1lc3RhbXAoKSwgbzEuZ2V0TWF4VGltZXN0YW1wKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxTU1RhYmxlUmVhZGVyPiBtYXhUaW1lc3RhbXBBc2NlbmRpbmcgPSAobzEsIG8yKSAtPiBMb25nLmNvbXBhcmUobzEuZ2V0TWF4VGltZXN0YW1wKCksIG8yLmdldE1heFRpbWVzdGFtcCgpKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8U1NUYWJsZVJlYWRlcj4gbWF4VGltZXN0YW1wQXNjZW5kaW5nID0gQ29tcGFyYXRvci5jb21wYXJpbmdMb25nKFNTVGFibGVSZWFkZXI6OmdldE1heFRpbWVzdGFtcCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPFNTVGFibGVSZWFkZXI+IG1heFRpbWVzdGFtcERlc2NlbmRpbmcgPSBtYXhUaW1lc3RhbXBBc2NlbmRpbmcucmV2ZXJzZWQoKTsKIAogICAgIC8vIGl0J3MganVzdCBhbiBvYmplY3QsIHdoaWNoIHdlIHVzZSByZWd1bGFyIE9iamVjdCBlcXVhbGl0eSBvbjsgd2UgaW50cm9kdWNlIGEgc3BlY2lhbCBjbGFzcyBqdXN0IGZvciBlYXN5IHJlY29nbml0aW9uCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBVbmlxdWVJZGVudGlmaWVyIHt9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBVbmlxdWVJZGVudGlmaWVyCisgICAgeworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgVW5pcXVlSWRlbnRpZmllciBpbnN0YW5jZUlkID0gbmV3IFVuaXF1ZUlkZW50aWZpZXIoKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlQ29tcGFyYXRvciA9IChvMSwgbzIpIC0+IG8xLmZpcnN0LmNvbXBhcmVUbyhvMi5maXJzdCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPFNTVGFibGVSZWFkZXI+IHNzdGFibGVDb21wYXJhdG9yID0gQ29tcGFyYXRvci5jb21wYXJpbmcobyAtPiBvLmZpcnN0KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9yZGVyaW5nPFNTVGFibGVSZWFkZXI+IHNzdGFibGVPcmRlcmluZyA9IE9yZGVyaW5nLmZyb20oc3N0YWJsZUNvbXBhcmF0b3IpOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPFNTVGFibGVSZWFkZXI+IGlkQ29tcGFyYXRvciA9IENvbXBhcmF0b3IuY29tcGFyaW5nKHQgLT4gdC5kZXNjcmlwdG9yLmlkLCBTU1RhYmxlSWRGYWN0b3J5LkNPTVBBUkFUT1IpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxTU1RhYmxlUmVhZGVyPiBpZFJldmVyc2VDb21wYXJhdG9yID0gaWRDb21wYXJhdG9yLnJldmVyc2VkKCk7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9yZGVyaW5nPFNTVGFibGVSZWFkZXI+IHNzdGFibGVPcmRlcmluZyA9IE9yZGVyaW5nLmZyb20oc3N0YWJsZUNvbXBhcmF0b3IpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPFNTVGFibGVSZWFkZXI+IHNpemVDb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3I8U1NUYWJsZVJlYWRlcj4oKQotICAgIHsKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKFNTVGFibGVSZWFkZXIgbzEsIFNTVGFibGVSZWFkZXIgbzIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBMb25ncy5jb21wYXJlKG8xLm9uRGlza0xlbmd0aCgpLCBvMi5vbkRpc2tMZW5ndGgoKSk7Ci0gICAgICAgIH0KLSAgICB9OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxTU1RhYmxlUmVhZGVyPiBzaXplQ29tcGFyYXRvciA9IChvMSwgbzIpIC0+IExvbmdzLmNvbXBhcmUobzEub25EaXNrTGVuZ3RoKCksIG8yLm9uRGlza0xlbmd0aCgpKTsKIAogICAgIC8qKgogICAgICAqIG1heERhdGFBZ2UgaXMgYSB0aW1lc3RhbXAgaW4gbG9jYWwgc2VydmVyIHRpbWUgKGUuZy4gR2xvYmFsLmN1cnJlbnRUaW1lTWlsbGkpIHdoaWNoIHJlcHJlc2VudHMgYW4gdXBwZXIgYm91bmQKICAgICAgKiB0byB0aGUgbmV3ZXN0IHBpZWNlIG9mIGRhdGEgc3RvcmVkIGluIHRoZSBzc3RhYmxlLiBJbiBvdGhlciB3b3JkcywgdGhpcyBzc3RhYmxlIGRvZXMgbm90IGNvbnRhaW4gaXRlbXMgY3JlYXRlZAogICAgICAqIGxhdGVyIHRoYW4gbWF4RGF0YUFnZS4KLSAgICAgKgorICAgICAqIDxwPgogICAgICAqIFRoZSBmaWVsZCBpcyBub3Qgc2VyaWFsaXplZCB0byBkaXNrLCBzbyByZWx5aW5nIG9uIGl0IGZvciBtb3JlIHRoYW4gd2hhdCB0cnVuY2F0ZSBkb2VzIGlzIG5vdCBhZHZpc2VkLgotICAgICAqCisgICAgICogPHA+CiAgICAgICogV2hlbiBhIG5ldyBzc3RhYmxlIGlzIGZsdXNoZWQsIG1heERhdGFBZ2UgaXMgc2V0IHRvIHRoZSB0aW1lIG9mIGNyZWF0aW9uLgogICAgICAqIFdoZW4gYSBzc3RhYmxlIGlzIGNyZWF0ZWQgZnJvbSBjb21wYWN0aW9uLCBtYXhEYXRhQWdlIGlzIHNldCB0byBtYXggb2YgYWxsIG1lcmdlZCBzc3RhYmxlcy4KLSAgICAgKgorICAgICAqIDxwPgogICAgICAqIFRoZSBhZ2UgaXMgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIGVwb2MgYW5kIGlzIGxvY2FsIHRvIHRoaXMgaG9zdC4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgbG9uZyBtYXhEYXRhQWdlOwogCiAgICAgcHVibGljIGVudW0gT3BlblJlYXNvbgogICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPkZyb20ge0Bjb2RlIE5vbmV9IC0gUmVhZGVyIGhhcyBiZWVuIHJlYWQgZnJvbSBkaXNrLCBlaXRoZXIgYXQgc3RhcnR1cCBvciBmcm9tIGEgZmx1c2hlZCBtZW10YWJsZTwvbGk+CisgICAgICAgICAqIDxsaT5Gcm9tIHtAbGluayAjRUFSTFl9IC0gUmVhZGVyIGlzIHRoZSBmaW5hbCByZXN1bHQgb2YgYSBjb21wYWN0aW9uPC9saT4KKyAgICAgICAgICogPGxpPkZyb20ge0BsaW5rICNNT1ZFRF9TVEFSVH0gLSBSZWFkZXIgV0FTIGJlaW5nIGNvbXBhY3RlZCwgYnV0IHRoaXMgZmFpbGVkIGFuZCBpdCBoYXMgYmVlbiByZXN0b3JlZAorICAgICAgICAgKiAgICAgdG8ge2NvZGUgTk9STUFMfXN0YXR1czwvbGk+CisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqLwogICAgICAgICBOT1JNQUwsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPkZyb20ge0Bjb2RlIE5vbmV9IC0gUmVhZGVyIGlzIGEgY29tcGFjdGlvbiByZXBsYWNlbWVudCB0aGF0IGlzIGVpdGhlciBpbmNvbXBsZXRlIGFuZCBoYXMgYmVlbiBvcGVuZWQKKyAgICAgICAgICogICAgIHRvIHJlcHJlc2VudCBpdHMgcGFydGlhbCByZXN1bHQgc3RhdHVzLCBvciBoYXMgYmVlbiBmaW5pc2hlZCBidXQgdGhlIGNvbXBhY3Rpb24gaXQgaXMgYSBwYXJ0IG9mIGhhcyBub3QKKyAgICAgICAgICogICAgIHlldCBjb21wbGV0ZWQgZnVsbHk8L2xpPgorICAgICAgICAgKiA8bGk+RnJvbSB7QGxpbmsgI0VBUkxZfSAtIFNhbWUgYXMgZnJvbSB7QGNvZGUgTm9uZX0sIG9ubHkgaXQgaXMgbm90IHRoZSBmaXJzdCB0aW1lIGl0IGhhcyBiZWVuCisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqLwogICAgICAgICBFQVJMWSwKKworICAgICAgICAvKioKKyAgICAgICAgICogRnJvbToKKyAgICAgICAgICogPHVsPgorICAgICAgICAgKiA8bGk+RnJvbSB7QGxpbmsgI05PUk1BTH0gLSBSZWFkZXIgaGFzIHNlZW4gbG93IHRyYWZmaWMgYW5kIHRoZSBhbW91bnQgb2YgbWVtb3J5IGF2YWlsYWJsZSBmb3IgaW5kZXggc3VtbWFyaWVzCisgICAgICAgICAqICAgICBpcyBjb25zdHJhaW5lZCwgc28gaXRzIGluZGV4IHN1bW1hcnkgaGFzIGJlZW4gZG93bnNhbXBsZWQ8L2xpPgorICAgICAgICAgKiA8bGk+RnJvbSB7QGxpbmsgI01FVEFEQVRBX0NIQU5HRX0gLSBTYW1lCisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqLwogICAgICAgICBNRVRBREFUQV9DSEFOR0UsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPkZyb20ge0BsaW5rICNOT1JNQUx9IC0gUmVhZGVyIGlzIGJlaW5nIGNvbXBhY3RlZC4gVGhpcyBjb21wYWN0aW9uIGhhcyBub3QgZmluaXNoZWQsIGJ1dCB0aGUgY29tcGFjdGlvbgorICAgICAgICAgKiAgICAgcmVzdWx0IGlzIGVpdGhlciBwYXJ0aWFsbHkgb3IgZnVsbHkgb3BlbmVkLCB0byBlaXRoZXIgcGFydGlhbGx5IG9yIGZ1bGx5IHJlcGxhY2UgdGhpcyByZWFkZXIuIFRoaXMgcmVhZGVyJ3MKKyAgICAgICAgICogICAgIHN0YXJ0IGtleSBoYXMgYmVlbiB1cGRhdGVkIHRvIHJlcHJlc2VudCB0aGlzLCBzbyB0aGF0IHJlYWRzIG9ubHkgaGl0IG9uZSBvciB0aGUgb3RoZXIgcmVhZGVyLjwvbGk+CisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqLwogICAgICAgICBNT1ZFRF9TVEFSVAogICAgIH0KIAogICAgIHB1YmxpYyBmaW5hbCBPcGVuUmVhc29uIG9wZW5SZWFzb247Ci0gICAgcHVibGljIGZpbmFsIFVuaXF1ZUlkZW50aWZpZXIgaW5zdGFuY2VJZCA9IG5ldyBVbmlxdWVJZGVudGlmaWVyKCk7CiAKLSAgICAvLyBpbmRleGZpbGUgYW5kIGRhdGFmaWxlOiBtaWdodCBiZSBudWxsIGJlZm9yZSBhIGNhbGwgdG8gbG9hZCgpCi0gICAgcHJvdGVjdGVkIGZpbmFsIEZpbGVIYW5kbGUgaWZpbGU7CiAgICAgcHJvdGVjdGVkIGZpbmFsIEZpbGVIYW5kbGUgZGZpbGU7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIElGaWx0ZXIgYmY7Ci0gICAgcHVibGljIGZpbmFsIEluZGV4U3VtbWFyeSBpbmRleFN1bW1hcnk7Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgUm93SW5kZXhFbnRyeS5JbmRleFNlcmlhbGl6ZXI8Pz4gcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXI7Ci0KLSAgICBwcm90ZWN0ZWQgSW5zdHJ1bWVudGluZ0NhY2hlPEtleUNhY2hlS2V5LCBSb3dJbmRleEVudHJ5PiBrZXlDYWNoZTsKLQotICAgIHByb3RlY3RlZCBmaW5hbCBCbG9vbUZpbHRlclRyYWNrZXIgYmxvb21GaWx0ZXJUcmFja2VyID0gbmV3IEJsb29tRmlsdGVyVHJhY2tlcigpOwogCiAgICAgLy8gdGVjaG5pY2FsbHkgaXNDb21wYWN0ZWQgaXMgbm90IG5lY2Vzc2FyeSBzaW5jZSBpdCBzaG91bGQgbmV2ZXIgYmUgdW5yZWZlcmVuY2VkIHVubGVzcyBpdCBpcyBhbHNvIGNvbXBhY3RlZCwKICAgICAvLyBidXQgaXQgc2VlbXMgbGlrZSBhIGdvb2QgZXh0cmEgbGF5ZXIgb2YgcHJvdGVjdGlvbiBhZ2FpbnN0IHJlZmVyZW5jZSBjb3VudGluZyBidWdzIHRvIG5vdCBkZWxldGUgZGF0YSBiYXNlZCBvbiB0aGF0IGFsb25lCi0gICAgcHJvdGVjdGVkIGZpbmFsIEF0b21pY0Jvb2xlYW4gaXNTdXNwZWN0ID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgIHB1YmxpYyBmaW5hbCBBdG9taWNCb29sZWFuIGlzU3VzcGVjdCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKIAogICAgIC8vIG5vdCBmaW5hbCBzaW5jZSB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gY2hhbmdlIGxldmVsIG9uIGEgZmlsZS4KICAgICBwcm90ZWN0ZWQgdm9sYXRpbGUgU3RhdHNNZXRhZGF0YSBzc3RhYmxlTWV0YWRhdGE7CiAKICAgICBwdWJsaWMgZmluYWwgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXI7CiAKLSAgICBwcm90ZWN0ZWQgZmluYWwgQXRvbWljTG9uZyBrZXlDYWNoZUhpdCA9IG5ldyBBdG9taWNMb25nKDApOwotICAgIHByb3RlY3RlZCBmaW5hbCBBdG9taWNMb25nIGtleUNhY2hlUmVxdWVzdCA9IG5ldyBBdG9taWNMb25nKDApOwotCiAgICAgcHJpdmF0ZSBmaW5hbCBJbnN0YW5jZVRpZGllciB0aWR5OwogICAgIHByaXZhdGUgZmluYWwgUmVmPFNTVGFibGVSZWFkZXI+IHNlbGZSZWY7CiAKQEAgLTIzOSw2ICsyNjcsMTAgQEAKIAogICAgIHByaXZhdGUgdm9sYXRpbGUgZG91YmxlIGNyY0NoZWNrQ2hhbmNlOwogCisgICAgcHVibGljIGZpbmFsIERlY29yYXRlZEtleSBmaXJzdDsKKyAgICBwdWJsaWMgZmluYWwgRGVjb3JhdGVkS2V5IGxhc3Q7CisgICAgcHVibGljIGZpbmFsIEFic3RyYWN0Qm91bmRzPFRva2VuPiBib3VuZHM7CisKICAgICAvKioKICAgICAgKiBDYWxjdWxhdGUgYXBwcm94aW1hdGUga2V5IGNvdW50LgogICAgICAqIElmIGNhcmRpbmFsaXR5IGVzdGltYXRvciBpcyBhdmFpbGFibGUgb24gYWxsIGdpdmVuIHNzdGFibGVzLCB0aGVuIHRoaXMgbWV0aG9kIHVzZSB0aGVtIHRvIGVzdGltYXRlCkBAIC0yNjQsNyArMjk2LDcgQEAKIAogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29tcGFjdGlvbk1ldGFkYXRhIG1ldGFkYXRhID0gKENvbXBhY3Rpb25NZXRhZGF0YSkgc3N0YWJsZS5kZXNjcmlwdG9yLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLmRlc2VyaWFsaXplKHNzdGFibGUuZGVzY3JpcHRvciwgTWV0YWRhdGFUeXBlLkNPTVBBQ1RJT04pOworICAgICAgICAgICAgICAgIENvbXBhY3Rpb25NZXRhZGF0YSBtZXRhZGF0YSA9IFN0YXRzQ29tcG9uZW50LmxvYWQoc3N0YWJsZS5kZXNjcmlwdG9yKS5jb21wYWN0aW9uTWV0YWRhdGEoKTsKICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBjYW4ndCBsb2FkIHRoZSBDb21wYWN0aW9uTWV0YWRhdGEsIHdlIGFyZSBmb3JjZWQgdG8gZXN0aW1hdGUgdGhlIGtleXMgdXNpbmcgdGhlIGluZGV4CiAgICAgICAgICAgICAgICAgLy8gc3VtbWFyeS4gKENBU1NBTkRSQS0xMDY3NikKICAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGEgPT0gbnVsbCkKQEAgLTMwNSwyMzMgKzMzNyw2NiBAQAogICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogRXN0aW1hdGVzIGhvdyBtdWNoIG9mIHRoZSBrZXlzIHdlIHdvdWxkIGtlZXAgaWYgdGhlIHNzdGFibGVzIHdlcmUgY29tcGFjdGVkIHRvZ2V0aGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBkb3VibGUgZXN0aW1hdGVDb21wYWN0aW9uR2FpbihTZXQ8U1NUYWJsZVJlYWRlcj4gb3ZlcmxhcHBpbmcpCisgICAgcHVibGljIHN0YXRpYyBTU1RhYmxlUmVhZGVyIG9wZW4oU1NUYWJsZS5Pd25lciBvd25lciwgRGVzY3JpcHRvciBkZXNjcmlwdG9yKQogICAgIHsKLSAgICAgICAgU2V0PElDYXJkaW5hbGl0eT4gY2FyZGluYWxpdGllcyA9IG5ldyBIYXNoU2V0PD4ob3ZlcmxhcHBpbmcuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBvdmVybGFwcGluZykKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSUNhcmRpbmFsaXR5IGNhcmRpbmFsaXR5ID0gKChDb21wYWN0aW9uTWV0YWRhdGEpIHNzdGFibGUuZGVzY3JpcHRvci5nZXRNZXRhZGF0YVNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZShzc3RhYmxlLmRlc2NyaXB0b3IsIE1ldGFkYXRhVHlwZS5DT01QQUNUSU9OKSkuY2FyZGluYWxpdHlFc3RpbWF0b3I7Ci0gICAgICAgICAgICAgICAgaWYgKGNhcmRpbmFsaXR5ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGNhcmRpbmFsaXRpZXMuYWRkKGNhcmRpbmFsaXR5KTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiR290IGEgbnVsbCBjYXJkaW5hbGl0eSBlc3RpbWF0b3IgaW46IHt9Iiwgc3N0YWJsZS5nZXRGaWxlbmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJDb3VsZCBub3QgcmVhZCB1cCBjb21wYWN0aW9uIG1ldGFkYXRhIGZvciB7fSIsIHNzdGFibGUsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGxvbmcgdG90YWxLZXlDb3VudEJlZm9yZSA9IDA7Ci0gICAgICAgIGZvciAoSUNhcmRpbmFsaXR5IGNhcmRpbmFsaXR5IDogY2FyZGluYWxpdGllcykKLSAgICAgICAgewotICAgICAgICAgICAgdG90YWxLZXlDb3VudEJlZm9yZSArPSBjYXJkaW5hbGl0eS5jYXJkaW5hbGl0eSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0b3RhbEtleUNvdW50QmVmb3JlID09IDApCi0gICAgICAgICAgICByZXR1cm4gMTsKLQotICAgICAgICBsb25nIHRvdGFsS2V5Q291bnRBZnRlciA9IG1lcmdlQ2FyZGluYWxpdGllcyhjYXJkaW5hbGl0aWVzKS5jYXJkaW5hbGl0eSgpOwotICAgICAgICBsb2dnZXIudHJhY2UoIkVzdGltYXRlZCBjb21wYWN0aW9uIGdhaW46IHt9L3t9PXt9IiwgdG90YWxLZXlDb3VudEFmdGVyLCB0b3RhbEtleUNvdW50QmVmb3JlLCAoKGRvdWJsZSl0b3RhbEtleUNvdW50QWZ0ZXIpL3RvdGFsS2V5Q291bnRCZWZvcmUpOwotICAgICAgICByZXR1cm4gKChkb3VibGUpdG90YWxLZXlDb3VudEFmdGVyKS90b3RhbEtleUNvdW50QmVmb3JlOworICAgICAgICByZXR1cm4gb3Blbihvd25lciwgZGVzY3JpcHRvciwgbnVsbCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgSUNhcmRpbmFsaXR5IG1lcmdlQ2FyZGluYWxpdGllcyhDb2xsZWN0aW9uPElDYXJkaW5hbGl0eT4gY2FyZGluYWxpdGllcykKKyAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVSZWFkZXIgb3BlbihTU1RhYmxlLk93bmVyIG93bmVyLCBEZXNjcmlwdG9yIGRlc2MsIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGEpCiAgICAgewotICAgICAgICBJQ2FyZGluYWxpdHkgYmFzZSA9IG5ldyBIeXBlckxvZ0xvZ1BsdXMoMTMsIDI1KTsgLy8gc2VlIE1ldGFkYXRhQ29sbGVjdG9yLmNhcmRpbmFsaXR5Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBiYXNlID0gYmFzZS5tZXJnZShjYXJkaW5hbGl0aWVzLnRvQXJyYXkobmV3IElDYXJkaW5hbGl0eVtjYXJkaW5hbGl0aWVzLnNpemUoKV0pKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ2FyZGluYWxpdHlNZXJnZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIud2FybigiQ291bGQgbm90IG1lcmdlIGNhcmRpbmFsaXRpZXMiLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmFzZTsKKyAgICAgICAgcmV0dXJuIG9wZW4ob3duZXIsIGRlc2MsIG51bGwsIG1ldGFkYXRhKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVSZWFkZXIgb3BlbihEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCisgICAgcHVibGljIHN0YXRpYyBTU1RhYmxlUmVhZGVyIG9wZW4oU1NUYWJsZS5Pd25lciBvd25lciwgRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzLCBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhKQogICAgIHsKLSAgICAgICAgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YTsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IuY2ZuYW1lLmNvbnRhaW5zKFNFQ09OREFSWV9JTkRFWF9OQU1FX1NFUEFSQVRPUikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBpID0gZGVzY3JpcHRvci5jZm5hbWUuaW5kZXhPZihTRUNPTkRBUllfSU5ERVhfTkFNRV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgU3RyaW5nIGluZGV4TmFtZSA9IGRlc2NyaXB0b3IuY2ZuYW1lLnN1YnN0cmluZyhpICsgMSk7Ci0gICAgICAgICAgICBtZXRhZGF0YSA9IFNjaGVtYS5pbnN0YW5jZS5nZXRJbmRleFRhYmxlTWV0YWRhdGFSZWYoZGVzY3JpcHRvci5rc25hbWUsIGluZGV4TmFtZSk7Ci0gICAgICAgICAgICBpZiAobWV0YWRhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIkNvdWxkIG5vdCBmaW5kIGluZGV4IG1ldGFkYXRhIGZvciBpbmRleCBjZiAiICsgaSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YSA9IFNjaGVtYS5pbnN0YW5jZS5nZXRUYWJsZU1ldGFkYXRhUmVmKGRlc2NyaXB0b3Iua3NuYW1lLCBkZXNjcmlwdG9yLmNmbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9wZW4oZGVzY3JpcHRvciwgbWV0YWRhdGEpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZVJlYWRlciBvcGVuKERlc2NyaXB0b3IgZGVzYywgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBvcGVuKGRlc2MsIGNvbXBvbmVudHNGb3IoZGVzYyksIG1ldGFkYXRhKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVSZWFkZXIgb3BlbihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMsIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGEpCi0gICAgewotICAgICAgICByZXR1cm4gb3BlbihkZXNjcmlwdG9yLCBjb21wb25lbnRzLCBtZXRhZGF0YSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICByZXR1cm4gb3Blbihvd25lciwgZGVzY3JpcHRvciwgY29tcG9uZW50cywgbWV0YWRhdGEsIHRydWUsIGZhbHNlKTsKICAgICB9CiAKICAgICAvLyB1c2Ugb25seSBmb3Igb2ZmbGluZSBvciAiU3RhbmRhbG9uZSIgb3BlcmF0aW9ucwogICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZVJlYWRlciBvcGVuTm9WYWxpZGF0aW9uKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cywgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG9wZW4oZGVzY3JpcHRvciwgY29tcG9uZW50cywgY2ZzLm1ldGFkYXRhLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBvcGVuKGNmcywgZGVzY3JpcHRvciwgY29tcG9uZW50cywgY2ZzLm1ldGFkYXRhLCBmYWxzZSwgdHJ1ZSk7CiAgICAgfQogCiAgICAgLy8gdXNlIG9ubHkgZm9yIG9mZmxpbmUgb3IgIlN0YW5kYWxvbmUiIG9wZXJhdGlvbnMKLSAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVSZWFkZXIgb3Blbk5vVmFsaWRhdGlvbihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGEpCisgICAgcHVibGljIHN0YXRpYyBTU1RhYmxlUmVhZGVyIG9wZW5Ob1ZhbGlkYXRpb24oU1NUYWJsZS5Pd25lciBvd25lciwgRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG9wZW4oZGVzY3JpcHRvciwgY29tcG9uZW50c0ZvcihkZXNjcmlwdG9yKSwgbWV0YWRhdGEsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG9wZW4ob3duZXIsIGRlc2NyaXB0b3IsIG51bGwsIG1ldGFkYXRhLCBmYWxzZSwgdHJ1ZSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogT3BlbiBTU1RhYmxlIHJlYWRlciB0byBiZSB1c2VkIGluIGJhdGNoIG1vZGUoc3VjaCBhcyBzc3RhYmxlbG9hZGVyKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yCi0gICAgICogQHBhcmFtIGNvbXBvbmVudHMKLSAgICAgKiBAcGFyYW0gbWV0YWRhdGEKLSAgICAgKiBAcmV0dXJuIG9wZW5lZCBTU1RhYmxlUmVhZGVyCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZVJlYWRlciBvcGVuRm9yQmF0Y2goRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzLCBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhKQorICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZVJlYWRlciBvcGVuRm9yQmF0Y2goU1NUYWJsZS5Pd25lciBvd25lciwgRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzLCBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhKQogICAgIHsKLSAgICAgICAgLy8gTWluaW11bSBjb21wb25lbnRzIHdpdGhvdXQgd2hpY2ggd2UgY2FuJ3QgZG8gYW55dGhpbmcKLSAgICAgICAgYXNzZXJ0IGNvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50LkRBVEEpIDogIkRhdGEgY29tcG9uZW50IGlzIG1pc3NpbmcgZm9yIHNzdGFibGUgIiArIGRlc2NyaXB0b3I7Ci0gICAgICAgIGFzc2VydCBjb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudC5QUklNQVJZX0lOREVYKSA6ICJQcmltYXJ5IGluZGV4IGNvbXBvbmVudCBpcyBtaXNzaW5nIGZvciBzc3RhYmxlICIgKyBkZXNjcmlwdG9yOwotICAgICAgICB2ZXJpZnlDb21wcmVzc2lvbkluZm9FeGlzdGVuY2VJZkFwcGxpY2FibGUoZGVzY3JpcHRvciwgY29tcG9uZW50cyk7Ci0KLSAgICAgICAgRW51bVNldDxNZXRhZGF0YVR5cGU+IHR5cGVzID0gRW51bVNldC5vZihNZXRhZGF0YVR5cGUuVkFMSURBVElPTiwgTWV0YWRhdGFUeXBlLlNUQVRTLCBNZXRhZGF0YVR5cGUuSEVBREVSKTsKLSAgICAgICAgTWFwPE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFDb21wb25lbnQ+IHNzdGFibGVNZXRhZGF0YTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgICBzc3RhYmxlTWV0YWRhdGEgPSBkZXNjcmlwdG9yLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLmRlc2VyaWFsaXplKGRlc2NyaXB0b3IsIHR5cGVzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKGUsIGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlNUQVRTKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBWYWxpZGF0aW9uTWV0YWRhdGEgdmFsaWRhdGlvbk1ldGFkYXRhID0gKFZhbGlkYXRpb25NZXRhZGF0YSkgc3N0YWJsZU1ldGFkYXRhLmdldChNZXRhZGF0YVR5cGUuVkFMSURBVElPTik7Ci0gICAgICAgIFN0YXRzTWV0YWRhdGEgc3RhdHNNZXRhZGF0YSA9IChTdGF0c01ldGFkYXRhKSBzc3RhYmxlTWV0YWRhdGEuZ2V0KE1ldGFkYXRhVHlwZS5TVEFUUyk7Ci0gICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIuQ29tcG9uZW50IGhlYWRlciA9IChTZXJpYWxpemF0aW9uSGVhZGVyLkNvbXBvbmVudCkgc3N0YWJsZU1ldGFkYXRhLmdldChNZXRhZGF0YVR5cGUuSEVBREVSKTsKLQotICAgICAgICAvLyBDaGVjayBpZiBzc3RhYmxlIGlzIGNyZWF0ZWQgdXNpbmcgc2FtZSBwYXJ0aXRpb25lci4KLSAgICAgICAgLy8gUGFydGl0aW9uZXIgY2FuIGJlIG51bGwsIHdoaWNoIGluZGljYXRlcyBvbGRlciB2ZXJzaW9uIG9mIHNzdGFibGUgb3Igbm8gc3RhdHMgYXZhaWxhYmxlLgotICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIHNraXAgdGhlIGNoZWNrLgotICAgICAgICBTdHJpbmcgcGFydGl0aW9uZXJOYW1lID0gbWV0YWRhdGEuZ2V0KCkucGFydGl0aW9uZXIuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCk7Ci0gICAgICAgIGlmICh2YWxpZGF0aW9uTWV0YWRhdGEgIT0gbnVsbCAmJiAhcGFydGl0aW9uZXJOYW1lLmVxdWFscyh2YWxpZGF0aW9uTWV0YWRhdGEucGFydGl0aW9uZXIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkNhbm5vdCBvcGVuIHt9OyBwYXJ0aXRpb25lciB7fSBkb2VzIG5vdCBtYXRjaCBzeXN0ZW0gcGFydGl0aW9uZXIge30uICBOb3RlIHRoYXQgdGhlIGRlZmF1bHQgcGFydGl0aW9uZXIgc3RhcnRpbmcgd2l0aCBDYXNzYW5kcmEgMS4yIGlzIE11cm11cjNQYXJ0aXRpb25lciwgc28geW91IHdpbGwgbmVlZCB0byBlZGl0IHRoYXQgdG8gbWF0Y2ggeW91ciBvbGQgcGFydGl0aW9uZXIgaWYgdXBncmFkaW5nLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciwgdmFsaWRhdGlvbk1ldGFkYXRhLnBhcnRpdGlvbmVyLCBwYXJ0aXRpb25lck5hbWUpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTU1RhYmxlUmVhZGVyQnVpbGRlci5Gb3JCYXRjaChkZXNjcmlwdG9yLCBtZXRhZGF0YSwgY29tcG9uZW50cywgc3RhdHNNZXRhZGF0YSwgaGVhZGVyLnRvSGVhZGVyKG1ldGFkYXRhLmdldCgpKSkuYnVpbGQoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVW5rbm93bkNvbHVtbkV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBvcGVuKG93bmVyLCBkZXNjcmlwdG9yLCBjb21wb25lbnRzLCBtZXRhZGF0YSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogT3BlbiBhbiBTU1RhYmxlIGZvciByZWFkaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3duZXIgICAgICBvd25pbmcgZW50aXR5CiAgICAgICogQHBhcmFtIGRlc2NyaXB0b3IgU1NUYWJsZSB0byBvcGVuCiAgICAgICogQHBhcmFtIGNvbXBvbmVudHMgQ29tcG9uZW50cyBpbmNsdWRlZCB3aXRoIHRoaXMgU1NUYWJsZQotICAgICAqIEBwYXJhbSBtZXRhZGF0YSBmb3IgdGhpcyBTU1RhYmxlcyBDRgotICAgICAqIEBwYXJhbSB2YWxpZGF0ZSBDaGVjayBTU1RhYmxlIGZvciBjb3JydXB0aW9uIChsaW1pdGVkKQotICAgICAqIEBwYXJhbSBpc09mZmxpbmUgV2hldGhlciB3ZSBhcmUgb3BlbmluZyB0aGlzIFNTVGFibGUgIm9mZmxpbmUiLCBmb3IgZXhhbXBsZSBmcm9tIGFuIGV4dGVybmFsIHRvb2wgb3Igbm90IGZvciBpbmNsdXNpb24gaW4gcXVlcmllcyAodmFsaWRhdGlvbnMpCi0gICAgICogICAgICAgICAgICAgICAgICBUaGlzIHN0b3BzIHJlZ2VuZXJhdGluZyBCRiArIFN1bW1hcmllcyBhbmQgYWxzbyBkaXNhYmxlcyB0cmFja2luZyBvZiBob3RuZXNzIGZvciB0aGUgU1NUYWJsZS4KKyAgICAgKiBAcGFyYW0gbWV0YWRhdGEgICBmb3IgdGhpcyBTU1RhYmxlcyBDRgorICAgICAqIEBwYXJhbSB2YWxpZGF0ZSAgIENoZWNrIFNTVGFibGUgZm9yIGNvcnJ1cHRpb24gKGxpbWl0ZWQpCisgICAgICogQHBhcmFtIGlzT2ZmbGluZSAgV2hldGhlciB3ZSBhcmUgb3BlbmluZyB0aGlzIFNTVGFibGUgIm9mZmxpbmUiLCBmb3IgZXhhbXBsZSBmcm9tIGFuIGV4dGVybmFsIHRvb2wgb3Igbm90IGZvciBpbmNsdXNpb24gaW4gcXVlcmllcyAodmFsaWRhdGlvbnMpCisgICAgICogICAgICAgICAgICAgICAgICAgVGhpcyBzdG9wcyByZWdlbmVyYXRpbmcgQkYgKyBTdW1tYXJpZXMgYW5kIGFsc28gZGlzYWJsZXMgdHJhY2tpbmcgb2YgaG90bmVzcyBmb3IgdGhlIFNTVGFibGUuCiAgICAgICogQHJldHVybiB7QGxpbmsgU1NUYWJsZVJlYWRlcn0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTU1RhYmxlUmVhZGVyIG9wZW4oRGVzY3JpcHRvciBkZXNjcmlwdG9yLAorICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZVJlYWRlciBvcGVuKE93bmVyIG93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB2YWxpZGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzT2ZmbGluZSkKICAgICB7Ci0gICAgICAgIC8vIE1pbmltdW0gY29tcG9uZW50cyB3aXRob3V0IHdoaWNoIHdlIGNhbid0IGRvIGFueXRoaW5nCi0gICAgICAgIGFzc2VydCBjb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudC5EQVRBKSA6ICJEYXRhIGNvbXBvbmVudCBpcyBtaXNzaW5nIGZvciBzc3RhYmxlICIgKyBkZXNjcmlwdG9yOwotICAgICAgICBhc3NlcnQgIXZhbGlkYXRlIHx8IGNvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50LlBSSU1BUllfSU5ERVgpIDogIlByaW1hcnkgaW5kZXggY29tcG9uZW50IGlzIG1pc3NpbmcgZm9yIHNzdGFibGUgIiArIGRlc2NyaXB0b3I7CisgICAgICAgIFNTVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlcjw/LCA/PiBidWlsZGVyID0gZGVzY3JpcHRvci5nZXRGb3JtYXQoKS5nZXRSZWFkZXJGYWN0b3J5KCkubG9hZGluZ0J1aWxkZXIoZGVzY3JpcHRvciwgbWV0YWRhdGEsIGNvbXBvbmVudHMpOwogCi0gICAgICAgIC8vIEZvciB0aGUgMy4wKyBzc3RhYmxlIGZvcm1hdCwgdGhlIChtaXNub21lZCkgc3RhdHMgY29tcG9uZW50IGhvbGQgdGhlIHNlcmlhbGl6YXRpb24gaGVhZGVyIHdoaWNoIHdlIG5lZWQgdG8gZGVzZXJpYWxpemUgdGhlIHNzdGFibGUgY29udGVudAotICAgICAgICBhc3NlcnQgY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnQuU1RBVFMpIDogIlN0YXRzIGNvbXBvbmVudCBpcyBtaXNzaW5nIGZvciBzc3RhYmxlICIgKyBkZXNjcmlwdG9yOwotCi0gICAgICAgIHZlcmlmeUNvbXByZXNzaW9uSW5mb0V4aXN0ZW5jZUlmQXBwbGljYWJsZShkZXNjcmlwdG9yLCBjb21wb25lbnRzKTsKLQotICAgICAgICBFbnVtU2V0PE1ldGFkYXRhVHlwZT4gdHlwZXMgPSBFbnVtU2V0Lm9mKE1ldGFkYXRhVHlwZS5WQUxJREFUSU9OLCBNZXRhZGF0YVR5cGUuU1RBVFMsIE1ldGFkYXRhVHlwZS5IRUFERVIpOwotCi0gICAgICAgIE1hcDxNZXRhZGF0YVR5cGUsIE1ldGFkYXRhQ29tcG9uZW50PiBzc3RhYmxlTWV0YWRhdGE7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzc3RhYmxlTWV0YWRhdGEgPSBkZXNjcmlwdG9yLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLmRlc2VyaWFsaXplKGRlc2NyaXB0b3IsIHR5cGVzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbih0LCBkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5TVEFUUykpOwotICAgICAgICB9Ci0gICAgICAgIFZhbGlkYXRpb25NZXRhZGF0YSB2YWxpZGF0aW9uTWV0YWRhdGEgPSAoVmFsaWRhdGlvbk1ldGFkYXRhKSBzc3RhYmxlTWV0YWRhdGEuZ2V0KE1ldGFkYXRhVHlwZS5WQUxJREFUSU9OKTsKLSAgICAgICAgU3RhdHNNZXRhZGF0YSBzdGF0c01ldGFkYXRhID0gKFN0YXRzTWV0YWRhdGEpIHNzdGFibGVNZXRhZGF0YS5nZXQoTWV0YWRhdGFUeXBlLlNUQVRTKTsKLSAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlci5Db21wb25lbnQgaGVhZGVyID0gKFNlcmlhbGl6YXRpb25IZWFkZXIuQ29tcG9uZW50KSBzc3RhYmxlTWV0YWRhdGEuZ2V0KE1ldGFkYXRhVHlwZS5IRUFERVIpOwotICAgICAgICBhc3NlcnQgaGVhZGVyICE9IG51bGw7Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYgc3N0YWJsZSBpcyBjcmVhdGVkIHVzaW5nIHNhbWUgcGFydGl0aW9uZXIuCi0gICAgICAgIC8vIFBhcnRpdGlvbmVyIGNhbiBiZSBudWxsLCB3aGljaCBpbmRpY2F0ZXMgb2xkZXIgdmVyc2lvbiBvZiBzc3RhYmxlIG9yIG5vIHN0YXRzIGF2YWlsYWJsZS4KLSAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSBza2lwIHRoZSBjaGVjay4KLSAgICAgICAgU3RyaW5nIHBhcnRpdGlvbmVyTmFtZSA9IG1ldGFkYXRhLmdldCgpLnBhcnRpdGlvbmVyLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpOwotICAgICAgICBpZiAodmFsaWRhdGlvbk1ldGFkYXRhICE9IG51bGwgJiYgIXBhcnRpdGlvbmVyTmFtZS5lcXVhbHModmFsaWRhdGlvbk1ldGFkYXRhLnBhcnRpdGlvbmVyKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJDYW5ub3Qgb3BlbiB7fTsgcGFydGl0aW9uZXIge30gZG9lcyBub3QgbWF0Y2ggc3lzdGVtIHBhcnRpdGlvbmVyIHt9LiAgTm90ZSB0aGF0IHRoZSBkZWZhdWx0IHBhcnRpdGlvbmVyIHN0YXJ0aW5nIHdpdGggQ2Fzc2FuZHJhIDEuMiBpcyBNdXJtdXIzUGFydGl0aW9uZXIsIHNvIHlvdSB3aWxsIG5lZWQgdG8gZWRpdCB0aGF0IHRvIG1hdGNoIHlvdXIgb2xkIHBhcnRpdGlvbmVyIGlmIHVwZ3JhZGluZy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IsIHZhbGlkYXRpb25NZXRhZGF0YS5wYXJ0aXRpb25lciwgcGFydGl0aW9uZXJOYW1lKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgc3N0YWJsZSA9IG5ldyBTU1RhYmxlUmVhZGVyQnVpbGRlci5Gb3JSZWFkKGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbk1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT2ZmbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzTWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnRvSGVhZGVyKG1ldGFkYXRhLmdldCgpKSkuYnVpbGQoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVW5rbm93bkNvbHVtbkV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZSkKLSAgICAgICAgICAgICAgICBzc3RhYmxlLnZhbGlkYXRlKCk7Ci0KLSAgICAgICAgICAgIGlmIChzc3RhYmxlLmdldEtleUNhY2hlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImtleSBjYWNoZSBjb250YWlucyB7fS97fSBrZXlzIiwgc3N0YWJsZS5nZXRLZXlDYWNoZSgpLnNpemUoKSwgc3N0YWJsZS5nZXRLZXlDYWNoZSgpLmdldENhcGFjaXR5KCkpOwotCi0gICAgICAgICAgICByZXR1cm4gc3N0YWJsZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzdGFibGUuc2VsZlJlZigpLnJlbGVhc2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbih0LCBzc3RhYmxlLmdldEZpbGVuYW1lKCkpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKG93bmVyLCB2YWxpZGF0ZSwgIWlzT2ZmbGluZSk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IG9wZW5BbGwoU2V0PE1hcC5FbnRyeTxEZXNjcmlwdG9yLCBTZXQ8Q29tcG9uZW50Pj4+IGVudHJpZXMsCisgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IG9wZW5BbGwoU1NUYWJsZS5Pd25lciBvd25lciwgU2V0PE1hcC5FbnRyeTxEZXNjcmlwdG9yLCBTZXQ8Q29tcG9uZW50Pj4+IGVudHJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YSkKICAgICB7CiAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMgPSBuZXdCbG9ja2luZ1F1ZXVlKCk7CkBAIC01NDEsMjkgKzQwNiwyNSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxEZXNjcmlwdG9yLCBTZXQ8Q29tcG9uZW50Pj4gZW50cnkgOiBlbnRyaWVzKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCisgICAgICAgICAgICAgICAgUnVubmFibGUgcnVubmFibGUgPSAoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUgPSBvcGVuKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpLCBtZXRhZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSlZNU3RhYmlsaXR5SW5zcGVjdG9yLmluc3BlY3RUaHJvd2FibGUoZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiQ29ycnVwdCBzc3RhYmxlIHt9OyBza2lwcGluZyB0YWJsZSIsIGVudHJ5LCBleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEZTRXJyb3IgZXgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSlZNU3RhYmlsaXR5SW5zcGVjdG9yLmluc3BlY3RUaHJvd2FibGUoZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiQ2Fubm90IHJlYWQgc3N0YWJsZSB7fTsgZmlsZSBzeXN0ZW0gZXJyb3IsIHNraXBwaW5nIHRhYmxlIiwgZW50cnksIGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlcy5hZGQoc3N0YWJsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlID0gb3Blbihvd25lciwgZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCksIG1ldGFkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEpWTVN0YWJpbGl0eUluc3BlY3Rvci5pbnNwZWN0VGhyb3dhYmxlKGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiQ29ycnVwdCBzc3RhYmxlIHt9OyBza2lwcGluZyB0YWJsZSIsIGVudHJ5LCBleCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEZTRXJyb3IgZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEpWTVN0YWJpbGl0eUluc3BlY3Rvci5pbnNwZWN0VGhyb3dhYmxlKGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiQ2Fubm90IHJlYWQgc3N0YWJsZSB7fTsgZmlsZSBzeXN0ZW0gZXJyb3IsIHNraXBwaW5nIHRhYmxlIiwgZW50cnksIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzc3RhYmxlcy5hZGQoc3N0YWJsZSk7CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICBleGVjdXRvci5zdWJtaXQocnVubmFibGUpOwogICAgICAgICAgICAgfQpAQCAtNTgzLDEwMiArNDQ0LDYyIEBACiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gc3N0YWJsZXM7Ci0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBPcGVuIGEgUm93SW5kZXhlZFJlYWRlciB3aGljaCBhbHJlYWR5IGhhcyBpdHMgc3RhdGUgaW5pdGlhbGl6ZWQgKGJ5IFNTVGFibGVXcml0ZXIpLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZVJlYWRlciBpbnRlcm5hbE9wZW4oRGVzY3JpcHRvciBkZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSGFuZGxlIGlmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUhhbmRsZSBkZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4U3VtbWFyeSBzdW1tYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZpbHRlciBiZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbWF4RGF0YUFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRzTWV0YWRhdGEgc3N0YWJsZU1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlblJlYXNvbiBvcGVuUmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIpCisgICAgcHJvdGVjdGVkIFNTVGFibGVSZWFkZXIoQnVpbGRlcjw/LCA/PiBidWlsZGVyLCBPd25lciBvd25lcikKICAgICB7Ci0gICAgICAgIGFzc2VydCBkZXNjICE9IG51bGwgJiYgaWZpbGUgIT0gbnVsbCAmJiBkZmlsZSAhPSBudWxsICYmIHN1bW1hcnkgIT0gbnVsbCAmJiBiZiAhPSBudWxsICYmIHNzdGFibGVNZXRhZGF0YSAhPSBudWxsOworICAgICAgICBzdXBlcihidWlsZGVyLCBvd25lcik7CiAKLSAgICAgICAgcmV0dXJuIG5ldyBTU1RhYmxlUmVhZGVyQnVpbGRlci5Gb3JXcml0ZXIoZGVzYywgbWV0YWRhdGEsIG1heERhdGFBZ2UsIGNvbXBvbmVudHMsIHNzdGFibGVNZXRhZGF0YSwgb3BlblJlYXNvbiwgaGVhZGVyKQotICAgICAgICAgICAgICAgIC5iZihiZikuaWZpbGUoaWZpbGUpLmRmaWxlKGRmaWxlKS5zdW1tYXJ5KHN1bW1hcnkpLmJ1aWxkKCk7Ci0gICAgfQorICAgICAgICB0aGlzLnNzdGFibGVNZXRhZGF0YSA9IGJ1aWxkZXIuZ2V0U3RhdHNNZXRhZGF0YSgpOworICAgICAgICB0aGlzLmhlYWRlciA9IGJ1aWxkZXIuZ2V0U2VyaWFsaXphdGlvbkhlYWRlcigpOworICAgICAgICB0aGlzLmRmaWxlID0gYnVpbGRlci5nZXREYXRhRmlsZSgpOworICAgICAgICB0aGlzLm1heERhdGFBZ2UgPSBidWlsZGVyLmdldE1heERhdGFBZ2UoKTsKKyAgICAgICAgdGhpcy5vcGVuUmVhc29uID0gYnVpbGRlci5nZXRPcGVuUmVhc29uKCk7CisgICAgICAgIHRoaXMuZmlyc3QgPSBidWlsZGVyLmdldEZpcnN0KCk7CisgICAgICAgIHRoaXMubGFzdCA9IGJ1aWxkZXIuZ2V0TGFzdCgpOworICAgICAgICB0aGlzLmJvdW5kcyA9IEFic3RyYWN0Qm91bmRzLnN0cmljdGx5V3JhcHNBcm91bmQoZmlyc3QuZ2V0VG9rZW4oKSwgbGFzdC5nZXRUb2tlbigpKQorICAgICAgICAgICAgICAgICAgICAgID8gbnVsbCAvLyB0aGlzIHdpbGwgY2F1c2UgdGhlIHZhbGlkYXRpb24gdG8gZmFpbCwgYnV0IHRoZSByZWFkZXIgaXMgb3BlbmVkIHdpdGggbm8gdmFsaWRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZS5nLiBmb3Igc2NydWJiaW5nLCB3ZSBzaG91bGQgYWNjZXB0IHNjcmV3ZWQgYm91bmRzCisgICAgICAgICAgICAgICAgICAgICAgOiBBYnN0cmFjdEJvdW5kcy5ib3VuZHMoZmlyc3QuZ2V0VG9rZW4oKSwgdHJ1ZSwgbGFzdC5nZXRUb2tlbigpLCB0cnVlKTsKIAotICAgIC8qKgotICAgICAqIEJlc3QtZWZmb3J0IGNoZWNraW5nIHRvIHZlcmlmeSB0aGUgZXhwZWN0ZWQgY29tcHJlc3Npb24gaW5mbyBjb21wb25lbnQgZXhpc3RzLCBhY2NvcmRpbmcgdG8gdGhlIFRPQyBmaWxlLgotICAgICAqIFRoZSB2ZXJpZmljYXRpb24gZGVwZW5kcyBvbiB0aGUgZXhpc3RlbmNlIG9mIFRPQyBmaWxlLiBJZiBhYnNlbnQsIHRoZSB2ZXJpZmljYXRpb24gaXMgc2tpcHBlZC4KLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRvcgotICAgICAqIEBwYXJhbSBhY3R1YWxDb21wb25lbnRzLCBhY3R1YWwgY29tcG9uZW50cyBsaXN0ZWQgZnJvbSB0aGUgZmlsZSBzeXN0ZW0uCi0gICAgICogQHRocm93cyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiwgaWYgVE9DIGV4cGVjdHMgY29tcHJlc3Npb24gaW5mbyBidXQgbm90IGZvdW5kIGZyb20gZGlzay4KLSAgICAgKiBAdGhyb3dzIEZTUmVhZEVycm9yLCBpZiB1bmFibGUgdG8gcmVhZCBmcm9tIFRPQyBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlDb21wcmVzc2lvbkluZm9FeGlzdGVuY2VJZkFwcGxpY2FibGUoRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENvbXBvbmVudD4gYWN0dWFsQ29tcG9uZW50cykKLSAgICB0aHJvd3MgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24sIEZTUmVhZEVycm9yCi0gICAgewotICAgICAgICBGaWxlIHRvY0ZpbGUgPSBuZXcgRmlsZShkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5UT0MpKTsKLSAgICAgICAgaWYgKHRvY0ZpbGUuZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldDxDb21wb25lbnQ+IGV4cGVjdGVkQ29tcG9uZW50cyA9IHJlYWRUT0MoZGVzY3JpcHRvciwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZENvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50LkNPTVBSRVNTSU9OX0lORk8pICYmICFhY3R1YWxDb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudC5DT01QUkVTU0lPTl9JTkZPKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb21wcmVzc2lvbkluZm9GaWxlTmFtZSA9IGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkNPTVBSRVNTSU9OX0lORk8pOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24obmV3IE5vU3VjaEZpbGVFeGNlcHRpb24oY29tcHJlc3Npb25JbmZvRmlsZU5hbWUpLCBjb21wcmVzc2lvbkluZm9GaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZTUmVhZEVycm9yKGUsIHRvY0ZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNTVGFibGVSZWFkZXIoU1NUYWJsZVJlYWRlckJ1aWxkZXIgYnVpbGRlcikKLSAgICB7Ci0gICAgICAgIHRoaXMoYnVpbGRlci5kZXNjcmlwdG9yLAotICAgICAgICAgICAgIGJ1aWxkZXIuY29tcG9uZW50cywKLSAgICAgICAgICAgICBidWlsZGVyLm1ldGFkYXRhUmVmLAotICAgICAgICAgICAgIGJ1aWxkZXIubWF4RGF0YUFnZSwKLSAgICAgICAgICAgICBidWlsZGVyLnN0YXRzTWV0YWRhdGEsCi0gICAgICAgICAgICAgYnVpbGRlci5vcGVuUmVhc29uLAotICAgICAgICAgICAgIGJ1aWxkZXIuaGVhZGVyLAotICAgICAgICAgICAgIGJ1aWxkZXIuc3VtbWFyeSwKLSAgICAgICAgICAgICBidWlsZGVyLmRmaWxlLAotICAgICAgICAgICAgIGJ1aWxkZXIuaWZpbGUsCi0gICAgICAgICAgICAgYnVpbGRlci5iZik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNTVGFibGVSZWFkZXIoZmluYWwgRGVzY3JpcHRvciBkZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIG1heERhdGFBZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHNNZXRhZGF0YSBzc3RhYmxlTWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlblJlYXNvbiBvcGVuUmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4U3VtbWFyeSBzdW1tYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVIYW5kbGUgZGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUhhbmRsZSBpZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRmlsdGVyIGJmKQotICAgIHsKLSAgICAgICAgc3VwZXIoZGVzYywgY29tcG9uZW50cywgbWV0YWRhdGEsIERhdGFiYXNlRGVzY3JpcHRvci5nZXREaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3koKSk7Ci0gICAgICAgIHRoaXMuc3N0YWJsZU1ldGFkYXRhID0gc3N0YWJsZU1ldGFkYXRhOwotICAgICAgICB0aGlzLmhlYWRlciA9IGhlYWRlcjsKLSAgICAgICAgdGhpcy5pbmRleFN1bW1hcnkgPSBzdW1tYXJ5OwotICAgICAgICB0aGlzLmRmaWxlID0gZGZpbGU7Ci0gICAgICAgIHRoaXMuaWZpbGUgPSBpZmlsZTsKLSAgICAgICAgdGhpcy5iZiA9IGJmOwotICAgICAgICB0aGlzLm1heERhdGFBZ2UgPSBtYXhEYXRhQWdlOwotICAgICAgICB0aGlzLm9wZW5SZWFzb24gPSBvcGVuUmVhc29uOwotICAgICAgICB0aGlzLnJvd0luZGV4RW50cnlTZXJpYWxpemVyID0gZGVzY3JpcHRvci52ZXJzaW9uLmdldFNTVGFibGVGb3JtYXQoKS5nZXRJbmRleFNlcmlhbGl6ZXIobWV0YWRhdGEuZ2V0KCksIGRlc2MudmVyc2lvbiwgaGVhZGVyKTsKLSAgICAgICAgdGlkeSA9IG5ldyBJbnN0YW5jZVRpZGllcihkZXNjcmlwdG9yLCBtZXRhZGF0YS5pZCk7CisgICAgICAgIHRpZHkgPSBuZXcgSW5zdGFuY2VUaWRpZXIoZGVzY3JpcHRvciwgb3duZXIpOwogICAgICAgICBzZWxmUmVmID0gbmV3IFJlZjw+KHRoaXMsIHRpZHkpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEZWNvcmF0ZWRLZXkgZ2V0Rmlyc3QoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZpcnN0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEZWNvcmF0ZWRLZXkgZ2V0TGFzdCgpCisgICAgeworICAgICAgICByZXR1cm4gbGFzdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWJzdHJhY3RCb3VuZHM8VG9rZW4+IGdldEJvdW5kcygpCisgICAgeworICAgICAgICByZXR1cm4gT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChib3VuZHMsICJCb3VuZHMgd2VyZSBub3QgY3JlYXRlZCBiZWNhdXNlIHRoZSBzc3RhYmxlIGlzIG91dCBvZiBvcmRlciIpOworICAgIH0KKworICAgIHB1YmxpYyBEYXRhSW50ZWdyaXR5TWV0YWRhdGEuQ2hlY2tzdW1WYWxpZGF0b3IgbWF5YmVHZXRDaGVja3N1bVZhbGlkYXRvcigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkNSQykuZXhpc3RzKCkpCisgICAgICAgICAgICByZXR1cm4gbmV3IERhdGFJbnRlZ3JpdHlNZXRhZGF0YS5DaGVja3N1bVZhbGlkYXRvcihkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKSwgZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuQ1JDKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBEYXRhSW50ZWdyaXR5TWV0YWRhdGEuRmlsZURpZ2VzdFZhbGlkYXRvciBtYXliZUdldERpZ2VzdFZhbGlkYXRvcigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRJR0VTVCkuZXhpc3RzKCkpCisgICAgICAgICAgICByZXR1cm4gbmV3IERhdGFJbnRlZ3JpdHlNZXRhZGF0YS5GaWxlRGlnZXN0VmFsaWRhdG9yKGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpLCBkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5ESUdFU1QpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBsb25nIGdldFRvdGFsQnl0ZXMoSXRlcmFibGU8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMpCiAgICAgewogICAgICAgICBsb25nIHN1bSA9IDA7CkBAIC03MTMsNjAgKzUzNCw3IEBACiAKICAgICBwdWJsaWMgdm9pZCBzZXR1cE9ubGluZSgpCiAgICAgewotICAgICAgICAvLyB1bmRlciBub3JtYWwgb3BlcmF0aW9uIHdlIGNhbiBkbyB0aGlzIGF0IGFueSB0aW1lLCBidXQgU1NUUiBpcyBhbHNvIHVzZWQgb3V0c2lkZSBDKiBwcm9wZXIsCi0gICAgICAgIC8vIGUuZy4gYnkgQnVsa0xvYWRlciwgd2hpY2ggZG9lcyBub3QgaW5pdGlhbGl6ZSB0aGUgY2FjaGUuICBBcyBhIGtsdWRnZSwgd2Ugc2V0IHVwIHRoZSBjYWNoZQotICAgICAgICAvLyBoZXJlIHdoZW4gd2Uga25vdyB3ZSdyZSBiZWluZyB3aXJlZCBpbnRvIHRoZSByZXN0IG9mIHRoZSBzZXJ2ZXIgaW5mcmFzdHJ1Y3R1cmUuCi0gICAgICAgIEluc3RydW1lbnRpbmdDYWNoZTxLZXlDYWNoZUtleSwgUm93SW5kZXhFbnRyeT4gbWF5YmVLZXlDYWNoZSA9IENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZTsKLSAgICAgICAgaWYgKG1heWJlS2V5Q2FjaGUuZ2V0Q2FwYWNpdHkoKSA+IDApCi0gICAgICAgICAgICBrZXlDYWNoZSA9IG1heWJlS2V5Q2FjaGU7Ci0KLSAgICAgICAgZmluYWwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gU2NoZW1hLmluc3RhbmNlLmdldENvbHVtbkZhbWlseVN0b3JlSW5zdGFuY2UobWV0YWRhdGEoKS5pZCk7Ci0gICAgICAgIGlmIChjZnMgIT0gbnVsbCkKLSAgICAgICAgICAgIHNldENyY0NoZWNrQ2hhbmNlKGNmcy5nZXRDcmNDaGVja0NoYW5jZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIGluZGV4IHN1bW1hcnkgdG8gU3VtbWFyeS5kYiBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlU3VtbWFyeShEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIERlY29yYXRlZEtleSBmaXJzdCwgRGVjb3JhdGVkS2V5IGxhc3QsIEluZGV4U3VtbWFyeSBzdW1tYXJ5KQotICAgIHsKLSAgICAgICAgRmlsZSBzdW1tYXJpZXNGaWxlID0gbmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuU1VNTUFSWSkpOwotICAgICAgICBpZiAoc3VtbWFyaWVzRmlsZS5leGlzdHMoKSkKLSAgICAgICAgICAgIEZpbGVVdGlscy5kZWxldGVXaXRoQ29uZmlybShzdW1tYXJpZXNGaWxlKTsKLQotICAgICAgICB0cnkgKERhdGFPdXRwdXRTdHJlYW1QbHVzIG9TdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbVBsdXMoc3VtbWFyaWVzRmlsZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEluZGV4U3VtbWFyeS5zZXJpYWxpemVyLnNlcmlhbGl6ZShzdW1tYXJ5LCBvU3RyZWFtKTsKLSAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLndyaXRlV2l0aExlbmd0aChmaXJzdC5nZXRLZXkoKSwgb1N0cmVhbSk7Ci0gICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC53cml0ZVdpdGhMZW5ndGgobGFzdC5nZXRLZXkoKSwgb1N0cmVhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiQ2Fubm90IHNhdmUgU1NUYWJsZSBTdW1tYXJ5OiAiLCBlKTsKLQotICAgICAgICAgICAgLy8gY29ycnVwdGVkIGhlbmNlIGRlbGV0ZSBpdCBhbmQgbGV0IGl0IGxvYWQgaXQgbm93LgotICAgICAgICAgICAgaWYgKHN1bW1hcmllc0ZpbGUuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZVdpdGhDb25maXJtKHN1bW1hcmllc0ZpbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNhdmVCbG9vbUZpbHRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIElGaWx0ZXIgZmlsdGVyKQotICAgIHsKLSAgICAgICAgRmlsZSBmaWx0ZXJGaWxlID0gbmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuRklMVEVSKSk7Ci0gICAgICAgIHRyeSAoRGF0YU91dHB1dFN0cmVhbVBsdXMgc3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW1QbHVzKGZpbHRlckZpbGUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBCbG9vbUZpbHRlclNlcmlhbGl6ZXIuc2VyaWFsaXplKChCbG9vbUZpbHRlcikgZmlsdGVyLCBzdHJlYW0pOwotICAgICAgICAgICAgc3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiQ2Fubm90IHNhdmUgU1NUYWJsZSBibG9vbWZpbHRlcjogIiwgZSk7Ci0KLSAgICAgICAgICAgIC8vIGNvcnJ1cHRlZCBoZW5jZSBkZWxldGUgaXQgYW5kIGxldCBpdCBsb2FkIGl0IG5vdy4KLSAgICAgICAgICAgIGlmIChmaWx0ZXJGaWxlLmV4aXN0cygpKQotICAgICAgICAgICAgICAgIEZpbGVVdGlscy5kZWxldGVXaXRoQ29uZmlybShmaWx0ZXJGaWxlKTsKLSAgICAgICAgfQotCisgICAgICAgICBvd25lcigpLmlmUHJlc2VudChvIC0+IHNldENyY0NoZWNrQ2hhbmNlKG8uZ2V0Q3JjQ2hlY2tDaGFuY2UoKSkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzc0LDcgKzU0Miw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gdGFzayB0byBiZSBndWFyZGVkIGJ5IHNzdGFibGUgbG9jawogICAgICAqLwotICAgIHB1YmxpYyA8Uj4gUiBydW5XaXRoTG9jayhDaGVja2VkRnVuY3Rpb248RGVzY3JpcHRvciwgUiwgSU9FeGNlcHRpb24+IHRhc2spIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHB1YmxpYyA8UiwgRSBleHRlbmRzIEV4Y2VwdGlvbj4gUiBydW5XaXRoTG9jayhDaGVja2VkRnVuY3Rpb248RGVzY3JpcHRvciwgUiwgRT4gdGFzaykgdGhyb3dzIEUKICAgICB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGlkeS5nbG9iYWwpCiAgICAgICAgIHsKQEAgLTc5OSwzMTcgKzU2NywxMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIFRoZXNlIHJ1bm5hYmxlcyBtdXN0IE5PVCBiZSBhbiBhbm9ueW1vdXMgb3Igbm9uLXN0YXRpYyBpbm5lciBjbGFzcywgbm9yIG11c3QgaXQgcmV0YWluIGEgcmVmZXJlbmNlIGNoYWluIHRvIHRoaXMgcmVhZGVyCisgICAgLyoqCisgICAgICogVGhlIHJ1bm5hYmxlIHBhc3NlZCB0byB0aGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBhbiBhbm9ueW1vdXMgb3Igbm9uLXN0YXRpYyBpbm5lciBjbGFzcy4gSXQgY2FuIGJlIGEgbGFtYmRhIG9yIGEKKyAgICAgKiBtZXRob2QgcmVmZXJlbmNlIHByb3ZpZGVkIHRoYXQgaXQgZG9lcyBub3QgcmV0YWluIGEgcmVmZXJlbmNlIGNoYWluIHRvIHRoaXMgcmVhZGVyLgorICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJ1bk9uQ2xvc2UoZmluYWwgUnVubmFibGUgcnVuT25DbG9zZSkKICAgICB7CisgICAgICAgIGlmIChydW5PbkNsb3NlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKICAgICAgICAgc3luY2hyb25pemVkICh0aWR5Lmdsb2JhbCkKICAgICAgICAgewogICAgICAgICAgICAgZmluYWwgUnVubmFibGUgZXhpc3RpbmcgPSB0aWR5LnJ1bk9uQ2xvc2U7Ci0gICAgICAgICAgICB0aWR5LnJ1bk9uQ2xvc2UgPSBBbmRUaGVuLmdldChleGlzdGluZywgcnVuT25DbG9zZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBbmRUaGVuIGltcGxlbWVudHMgUnVubmFibGUKLSAgICB7Ci0gICAgICAgIGZpbmFsIFJ1bm5hYmxlIHJ1bkZpcnN0OwotICAgICAgICBmaW5hbCBSdW5uYWJsZSBydW5TZWNvbmQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBBbmRUaGVuKFJ1bm5hYmxlIHJ1bkZpcnN0LCBSdW5uYWJsZSBydW5TZWNvbmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucnVuRmlyc3QgPSBydW5GaXJzdDsKLSAgICAgICAgICAgIHRoaXMucnVuU2Vjb25kID0gcnVuU2Vjb25kOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgewotICAgICAgICAgICAgcnVuRmlyc3QucnVuKCk7Ci0gICAgICAgICAgICBydW5TZWNvbmQucnVuKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgUnVubmFibGUgZ2V0KFJ1bm5hYmxlIHJ1bkZpcnN0LCBSdW5uYWJsZSBydW5TZWNvbmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChydW5GaXJzdCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBydW5TZWNvbmQ7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFuZFRoZW4ocnVuRmlyc3QsIHJ1blNlY29uZCk7CisgICAgICAgICAgICBpZiAoZXhpc3RpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aWR5LnJ1bk9uQ2xvc2UgPSBydW5PbkNsb3NlOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRpZHkucnVuT25DbG9zZSA9ICgpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcucnVuKCk7CisgICAgICAgICAgICAgICAgICAgIHJ1bk9uQ2xvc2UucnVuKCk7CisgICAgICAgICAgICAgICAgfTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsb25lIHRoaXMgcmVhZGVyIHdpdGggdGhlIHByb3ZpZGVkIHN0YXJ0IGFuZCBvcGVuIHJlYXNvbiwgYW5kIHNldCB0aGUgY2xvbmUgYXMgcmVwbGFjZW1lbnQuCisgICAgICogVGhlIG1ldGhvZCBzZXRzIGZpZWxkcyBzcGVjaWZpYyB0byB0aGlzIHtAbGluayBTU1RhYmxlUmVhZGVyfSBhbmQgdGhlIHBhcmVudCB7QGxpbmsgU1NUYWJsZX0gb24gdGhlIHByb3ZpZGVkCisgICAgICoge0BsaW5rIEJ1aWxkZXJ9LiBUaGUgbWV0aG9kIGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBmcm9tIHRoZSBvdmVybG9hZGVkIHtAY29kZSB1bmJ1aWxkVG99IG1ldGhvZCBpbiBzdWJjbGFzc2VzLgogICAgICAqCi0gICAgICogQHBhcmFtIG5ld0ZpcnN0IHRoZSBmaXJzdCBrZXkgZm9yIHRoZSByZXBsYWNlbWVudCAod2hpY2ggY2FuIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBkdWUgdG8gdGhlIHByZS1lbXB0aXZlCi0gICAgICogb3BlbmluZyBvZiBjb21wYWN0aW9uIHJlc3VsdHMpLgotICAgICAqIEBwYXJhbSByZWFzb24gdGhlIHtAY29kZSBPcGVuUmVhc29ufSBmb3IgdGhlIHJlcGxhY2VtZW50LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY2xvbmVkIHJlYWRlci4gVGhhdCByZWFkZXIgaXMgc2V0IGFzIGEgcmVwbGFjZW1lbnQgYnkgdGhlIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gYnVpbGRlciAgICB0aGUgYnVpbGRlciBvbiB3aGljaCB0aGUgZmllbGRzIHNob3VsZCBiZSBzZXQKKyAgICAgKiBAcGFyYW0gc2hhcmVkQ29weSB3aGV0aGVyIHRoZSB7QGxpbmsgU2hhcmVkQ2xvc2VhYmxlfSByZXNvdXJjZXMgc2hvdWxkIGJlIHBhc3NlZCBhcyBzaGFyZWQgY29waWVzIG9yIGRpcmVjdGx5OworICAgICAqICAgICAgICAgICAgICAgICAgIG5vdGUgdGhhdCB0aGUgbWV0aG9kIHdpbGwgb3ZlcndyaXRlIHRoZSBmaWVsZHMgcmVwcmVzZW50aW5nIHtAbGluayBTaGFyZWRDbG9zZWFibGV9IG9ubHkgaWYKKyAgICAgKiAgICAgICAgICAgICAgICAgICB0aGV5IGFyZSBub3Qgc2V0IGluIHRoZSBidWlsZGVyIHlldCAodGhlIHJlbGV2YW50IGZpZWxkcyBpbiB0aGUgYnVpbGRlciBhcmUge0Bjb2RlIG51bGx9KS4KKyAgICAgKiBAcmV0dXJuIHRoZSBzYW1lIGluc3RhbmNlIG9mIGJ1aWxkZXIgYXMgcHJvdmlkZWQKICAgICAgKi8KLSAgICBwcml2YXRlIFNTVGFibGVSZWFkZXIgY2xvbmVBbmRSZXBsYWNlKERlY29yYXRlZEtleSBuZXdGaXJzdCwgT3BlblJlYXNvbiByZWFzb24pCisgICAgcHJvdGVjdGVkIGZpbmFsIDxCIGV4dGVuZHMgQnVpbGRlcjw/LCBCPj4gQiB1bmJ1aWxkVG8oQiBidWlsZGVyLCBib29sZWFuIHNoYXJlZENvcHkpCiAgICAgewotICAgICAgICByZXR1cm4gY2xvbmVBbmRSZXBsYWNlKG5ld0ZpcnN0LCByZWFzb24sIGluZGV4U3VtbWFyeS5zaGFyZWRDb3B5KCkpOworICAgICAgICBCIGIgPSBzdXBlci51bmJ1aWxkVG8oYnVpbGRlciwgc2hhcmVkQ29weSk7CisgICAgICAgIGlmIChidWlsZGVyLmdldERhdGFGaWxlKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIGIuc2V0RGF0YUZpbGUoc2hhcmVkQ29weSA/IHNoYXJlZENvcHlPck51bGwoZGZpbGUpIDogZGZpbGUpOworCisgICAgICAgIGIuc2V0U3RhdHNNZXRhZGF0YShzc3RhYmxlTWV0YWRhdGEpOworICAgICAgICBiLnNldFNlcmlhbGl6YXRpb25IZWFkZXIoaGVhZGVyKTsKKyAgICAgICAgYi5zZXRNYXhEYXRhQWdlKG1heERhdGFBZ2UpOworICAgICAgICBiLnNldE9wZW5SZWFzb24ob3BlblJlYXNvbik7CisgICAgICAgIGIuc2V0Rmlyc3QoZmlyc3QpOworICAgICAgICBiLnNldExhc3QobGFzdCk7CisgICAgICAgIGIuc2V0U3VzcGVjdGVkKGlzU3VzcGVjdC5nZXQoKSk7CisgICAgICAgIHJldHVybiBiOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIENsb25lIHRoaXMgcmVhZGVyIHdpdGggdGhlIG5ldyB2YWx1ZXMgYW5kIHNldCB0aGUgY2xvbmUgYXMgcmVwbGFjZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV3Rmlyc3QgdGhlIGZpcnN0IGtleSBmb3IgdGhlIHJlcGxhY2VtZW50ICh3aGljaCBjYW4gYmUgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIGR1ZSB0byB0aGUgcHJlLWVtcHRpdmUKLSAgICAgKiBvcGVuaW5nIG9mIGNvbXBhY3Rpb24gcmVzdWx0cykuCi0gICAgICogQHBhcmFtIHJlYXNvbiB0aGUge0Bjb2RlIE9wZW5SZWFzb259IGZvciB0aGUgcmVwbGFjZW1lbnQuCi0gICAgICogQHBhcmFtIG5ld1N1bW1hcnkgdGhlIGluZGV4IHN1bW1hcnkgZm9yIHRoZSByZXBsYWNlbWVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGNsb25lZCByZWFkZXIuIFRoYXQgcmVhZGVyIGlzIHNldCBhcyBhIHJlcGxhY2VtZW50IGJ5IHRoZSBtZXRob2QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTU1RhYmxlUmVhZGVyIGNsb25lQW5kUmVwbGFjZShEZWNvcmF0ZWRLZXkgbmV3Rmlyc3QsIE9wZW5SZWFzb24gcmVhc29uLCBJbmRleFN1bW1hcnkgbmV3U3VtbWFyeSkKLSAgICB7Ci0gICAgICAgIFNTVGFibGVSZWFkZXIgcmVwbGFjZW1lbnQgPSBpbnRlcm5hbE9wZW4oZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmaWxlICE9IG51bGwgPyBpZmlsZS5zaGFyZWRDb3B5KCkgOiBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmaWxlLnNoYXJlZENvcHkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdW1tYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmLnNoYXJlZENvcHkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEYXRhQWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGVNZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyKTsKKyAgICBwdWJsaWMgYWJzdHJhY3QgU1NUYWJsZVJlYWRlciBjbG9uZVdpdGhSZXN0b3JlZFN0YXJ0KERlY29yYXRlZEtleSByZXN0b3JlZFN0YXJ0KTsKIAotICAgICAgICByZXBsYWNlbWVudC5maXJzdCA9IG5ld0ZpcnN0OwotICAgICAgICByZXBsYWNlbWVudC5sYXN0ID0gbGFzdDsKLSAgICAgICAgcmVwbGFjZW1lbnQuaXNTdXNwZWN0LnNldChpc1N1c3BlY3QuZ2V0KCkpOwotICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvbmUgdGhpcyByZWFkZXIgd2l0aCB0aGUgbmV3IHZhbHVlcyBhbmQgc2V0IHRoZSBjbG9uZSBhcyByZXBsYWNlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXdCbG9vbUZpbHRlciBmb3IgdGhlIHJlcGxhY2VtZW50Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjbG9uZWQgcmVhZGVyLiBUaGF0IHJlYWRlciBpcyBzZXQgYXMgYSByZXBsYWNlbWVudCBieSB0aGUgbWV0aG9kLgotICAgICAqLwotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyIGNsb25lQW5kUmVwbGFjZShJRmlsdGVyIG5ld0Jsb29tRmlsdGVyKQotICAgIHsKLSAgICAgICAgU1NUYWJsZVJlYWRlciByZXBsYWNlbWVudCA9IGludGVybmFsT3BlbihkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZpbGUuc2hhcmVkQ29weSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmaWxlLnNoYXJlZENvcHkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFN1bW1hcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qmxvb21GaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RGF0YUFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlTWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlblJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIpOwotCi0gICAgICAgIHJlcGxhY2VtZW50LmZpcnN0ID0gZmlyc3Q7Ci0gICAgICAgIHJlcGxhY2VtZW50Lmxhc3QgPSBsYXN0OwotICAgICAgICByZXBsYWNlbWVudC5pc1N1c3BlY3Quc2V0KGlzU3VzcGVjdC5nZXQoKSk7Ci0gICAgICAgIHJldHVybiByZXBsYWNlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU1NUYWJsZVJlYWRlciBjbG9uZVdpdGhSZXN0b3JlZFN0YXJ0KERlY29yYXRlZEtleSByZXN0b3JlZFN0YXJ0KQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICh0aWR5Lmdsb2JhbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNsb25lQW5kUmVwbGFjZShyZXN0b3JlZFN0YXJ0LCBPcGVuUmVhc29uLk5PUk1BTCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBydW5PbkNsb3NlIG11c3QgTk9UIGJlIGFuIGFub255bW91cyBvciBub24tc3RhdGljIGlubmVyIGNsYXNzLCBub3IgbXVzdCBpdCByZXRhaW4gYSByZWZlcmVuY2UgY2hhaW4gdG8gdGhpcyByZWFkZXIKLSAgICBwdWJsaWMgU1NUYWJsZVJlYWRlciBjbG9uZVdpdGhOZXdTdGFydChEZWNvcmF0ZWRLZXkgbmV3U3RhcnQsIGZpbmFsIFJ1bm5hYmxlIHJ1bk9uQ2xvc2UpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHRpZHkuZ2xvYmFsKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgb3BlblJlYXNvbiAhPSBPcGVuUmVhc29uLkVBUkxZOwotICAgICAgICAgICAgLy8gVE9ETzogbWVyZ2Ugd2l0aCBjYWxsZXIncyBmaXJzdEtleUJleW9uZCgpIHdvcmssdG8gc2F2ZSB0aW1lCi0gICAgICAgICAgICBpZiAobmV3U3RhcnQuY29tcGFyZVRvKGZpcnN0KSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBkYXRhU3RhcnQgPSBnZXRQb3NpdGlvbihuZXdTdGFydCwgT3BlcmF0b3IuRVEpLnBvc2l0aW9uOwotICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgaW5kZXhTdGFydCA9IGdldEluZGV4U2NhblBvc2l0aW9uKG5ld1N0YXJ0KTsKLSAgICAgICAgICAgICAgICB0aGlzLnRpZHkucnVuT25DbG9zZSA9IG5ldyBEcm9wUGFnZUNhY2hlKGRmaWxlLCBkYXRhU3RhcnQsIGlmaWxlLCBpbmRleFN0YXJ0LCBydW5PbkNsb3NlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGNsb25lQW5kUmVwbGFjZShuZXdTdGFydCwgT3BlblJlYXNvbi5NT1ZFRF9TVEFSVCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEcm9wUGFnZUNhY2hlIGltcGxlbWVudHMgUnVubmFibGUKLSAgICB7Ci0gICAgICAgIGZpbmFsIEZpbGVIYW5kbGUgZGZpbGU7Ci0gICAgICAgIGZpbmFsIGxvbmcgZGZpbGVQb3NpdGlvbjsKLSAgICAgICAgZmluYWwgRmlsZUhhbmRsZSBpZmlsZTsKLSAgICAgICAgZmluYWwgbG9uZyBpZmlsZVBvc2l0aW9uOwotICAgICAgICBmaW5hbCBSdW5uYWJsZSBhbmRUaGVuOwotCi0gICAgICAgIHByaXZhdGUgRHJvcFBhZ2VDYWNoZShGaWxlSGFuZGxlIGRmaWxlLCBsb25nIGRmaWxlUG9zaXRpb24sIEZpbGVIYW5kbGUgaWZpbGUsIGxvbmcgaWZpbGVQb3NpdGlvbiwgUnVubmFibGUgYW5kVGhlbikKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5kZmlsZSA9IGRmaWxlOwotICAgICAgICAgICAgdGhpcy5kZmlsZVBvc2l0aW9uID0gZGZpbGVQb3NpdGlvbjsKLSAgICAgICAgICAgIHRoaXMuaWZpbGUgPSBpZmlsZTsKLSAgICAgICAgICAgIHRoaXMuaWZpbGVQb3NpdGlvbiA9IGlmaWxlUG9zaXRpb247Ci0gICAgICAgICAgICB0aGlzLmFuZFRoZW4gPSBhbmRUaGVuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgewotICAgICAgICAgICAgZGZpbGUuZHJvcFBhZ2VDYWNoZShkZmlsZVBvc2l0aW9uKTsKLQotICAgICAgICAgICAgaWYgKGlmaWxlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgaWZpbGUuZHJvcFBhZ2VDYWNoZShpZmlsZVBvc2l0aW9uKTsKLSAgICAgICAgICAgIGlmIChhbmRUaGVuICE9IG51bGwpCi0gICAgICAgICAgICAgICAgYW5kVGhlbi5ydW4oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgU1NUYWJsZVJlYWRlciB3aXRoIHRoZSBzYW1lIHByb3BlcnRpZXMgYXMgdGhpcyBTU1RhYmxlUmVhZGVyIGV4Y2VwdCB0aGF0IGEgbmV3IEluZGV4U3VtbWFyeSB3aWxsCi0gICAgICogYmUgYnVpbHQgYXQgdGhlIHRhcmdldCBzYW1wbGluZ0xldmVsLiAgVGhpcyAob3JpZ2luYWwpIFNTVGFibGVSZWFkZXIgaW5zdGFuY2Ugd2lsbCBiZSBtYXJrZWQgYXMgcmVwbGFjZWQsIGhhdmUKLSAgICAgKiBpdHMgRGVsZXRpbmdUYXNrIHJlbW92ZWQsIGFuZCBoYXZlIGl0cyBwZXJpb2RpYyByZWFkLW1ldGVyIHN5bmMgdGFzayBjYW5jZWxsZWQuCi0gICAgICogQHBhcmFtIHNhbXBsaW5nTGV2ZWwgdGhlIGRlc2lyZWQgc2FtcGxpbmcgbGV2ZWwgZm9yIHRoZSBpbmRleCBzdW1tYXJ5IG9uIHRoZSBuZXcgU1NUYWJsZVJlYWRlcgotICAgICAqIEByZXR1cm4gYSBuZXcgU1NUYWJsZVJlYWRlcgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQotICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyIGNsb25lV2l0aE5ld1N1bW1hcnlTYW1wbGluZ0xldmVsKENvbHVtbkZhbWlseVN0b3JlIHBhcmVudCwgaW50IHNhbXBsaW5nTGV2ZWwpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYXNzZXJ0IG9wZW5SZWFzb24gIT0gT3BlblJlYXNvbi5FQVJMWTsKLQotICAgICAgICBpbnQgbWluSW5kZXhJbnRlcnZhbCA9IG1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWw7Ci0gICAgICAgIGludCBtYXhJbmRleEludGVydmFsID0gbWV0YWRhdGEoKS5wYXJhbXMubWF4SW5kZXhJbnRlcnZhbDsKLSAgICAgICAgZG91YmxlIGVmZmVjdGl2ZUludGVydmFsID0gaW5kZXhTdW1tYXJ5LmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKTsKLQotICAgICAgICBJbmRleFN1bW1hcnkgbmV3U3VtbWFyeTsKLQotICAgICAgICAvLyBXZSBoYXZlIHRvIHJlYnVpbGQgdGhlIHN1bW1hcnkgZnJvbSB0aGUgb24tZGlzayBwcmltYXJ5IGluZGV4IGluIHRocmVlIGNhc2VzOgotICAgICAgICAvLyAxLiBUaGUgc2FtcGxpbmcgbGV2ZWwgd2VudCB1cCwgc28gd2UgbmVlZCB0byByZWFkIG1vcmUgZW50cmllcyBvZmYgZGlzawotICAgICAgICAvLyAyLiBUaGUgbWluX2luZGV4X2ludGVydmFsIGNoYW5nZWQgKGluIGVpdGhlciBkaXJlY3Rpb24pOyB0aGlzIGNoYW5nZXMgd2hhdCBlbnRyaWVzIHdvdWxkIGJlIGluIHRoZSBzdW1tYXJ5Ci0gICAgICAgIC8vICAgIGF0IGZ1bGwgc2FtcGxpbmcgKGFuZCBjb25zZXF1ZW50bHkgYXQgYW55IG90aGVyIHNhbXBsaW5nIGxldmVsKQotICAgICAgICAvLyAzLiBUaGUgbWF4X2luZGV4X2ludGVydmFsIHdhcyBsb3dlcmVkLCBmb3JjaW5nIHVzIHRvIHJhaXNlIHRoZSBzYW1wbGluZyBsZXZlbAotICAgICAgICBpZiAoc2FtcGxpbmdMZXZlbCA+IGluZGV4U3VtbWFyeS5nZXRTYW1wbGluZ0xldmVsKCkgfHwgaW5kZXhTdW1tYXJ5LmdldE1pbkluZGV4SW50ZXJ2YWwoKSAhPSBtaW5JbmRleEludGVydmFsIHx8IGVmZmVjdGl2ZUludGVydmFsID4gbWF4SW5kZXhJbnRlcnZhbCkKLSAgICAgICAgewotICAgICAgICAgICAgbmV3U3VtbWFyeSA9IGJ1aWxkU3VtbWFyeUF0TGV2ZWwoc2FtcGxpbmdMZXZlbCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2FtcGxpbmdMZXZlbCA8IGluZGV4U3VtbWFyeS5nZXRTYW1wbGluZ0xldmVsKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHdlIGNhbiB1c2UgdGhlIGV4aXN0aW5nIGluZGV4IHN1bW1hcnkgdG8gbWFrZSBhIHNtYWxsZXIgb25lCi0gICAgICAgICAgICBuZXdTdW1tYXJ5ID0gSW5kZXhTdW1tYXJ5QnVpbGRlci5kb3duc2FtcGxlKGluZGV4U3VtbWFyeSwgc2FtcGxpbmdMZXZlbCwgbWluSW5kZXhJbnRlcnZhbCwgZ2V0UGFydGl0aW9uZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIkF0dGVtcHRlZCB0byBjbG9uZSBTU1RhYmxlUmVhZGVyIHdpdGggdGhlIHNhbWUgaW5kZXggc3VtbWFyeSBzYW1wbGluZyBsZXZlbCBhbmQgIiArCi0gICAgICAgICAgICAgICAgICAgICJubyBhZGp1c3RtZW50cyB0byBtaW4vbWF4X2luZGV4X2ludGVydmFsIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBbHdheXMgc2F2ZSB0aGUgcmVzYW1wbGVkIGluZGV4IHdpdGggbG9jayB0byBhdm9pZCByYWNpbmcgd2l0aCBlbnRpcmUtc3N0YWJsZSBzdHJlYW1pbmcKLSAgICAgICAgc3luY2hyb25pemVkICh0aWR5Lmdsb2JhbCkKLSAgICAgICAgewotICAgICAgICAgICAgc2F2ZVN1bW1hcnkoZGVzY3JpcHRvciwgZmlyc3QsIGxhc3QsIG5ld1N1bW1hcnkpOwotICAgICAgICAgICAgcmV0dXJuIGNsb25lQW5kUmVwbGFjZShmaXJzdCwgT3BlblJlYXNvbi5NRVRBREFUQV9DSEFOR0UsIG5ld1N1bW1hcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJbmRleFN1bW1hcnkgYnVpbGRTdW1tYXJ5QXRMZXZlbChpbnQgbmV3U2FtcGxpbmdMZXZlbCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyB3ZSByZWFkIHRoZSBwb3NpdGlvbnMgaW4gYSBCUkFGIHNvIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgYW4gZW50cnkgc3Bhbm5pbmcgYSBtbWFwIGJvdW5kYXJ5LgotICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgcHJpbWFyeUluZGV4ID0gUmFuZG9tQWNjZXNzUmVhZGVyLm9wZW4obmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuUFJJTUFSWV9JTkRFWCkpKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGxvbmcgaW5kZXhTaXplID0gcHJpbWFyeUluZGV4Lmxlbmd0aCgpOwotICAgICAgICAgICAgdHJ5IChJbmRleFN1bW1hcnlCdWlsZGVyIHN1bW1hcnlCdWlsZGVyID0gbmV3IEluZGV4U3VtbWFyeUJ1aWxkZXIoZXN0aW1hdGVkS2V5cygpLCBtZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsLCBuZXdTYW1wbGluZ0xldmVsKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25nIGluZGV4UG9zaXRpb247Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChpbmRleFBvc2l0aW9uID0gcHJpbWFyeUluZGV4LmdldEZpbGVQb2ludGVyKCkpICE9IGluZGV4U2l6ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN1bW1hcnlCdWlsZGVyLm1heWJlQWRkRW50cnkoZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChwcmltYXJ5SW5kZXgpKSwgaW5kZXhQb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIFJvd0luZGV4RW50cnkuU2VyaWFsaXplci5za2lwKHByaW1hcnlJbmRleCwgZGVzY3JpcHRvci52ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gc3VtbWFyeUJ1aWxkZXIuYnVpbGQoZ2V0UGFydGl0aW9uZXIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2VRdWlldGx5KHByaW1hcnlJbmRleCk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgcHVibGljIGFic3RyYWN0IFNTVGFibGVSZWFkZXIgY2xvbmVXaXRoTmV3U3RhcnQoRGVjb3JhdGVkS2V5IG5ld1N0YXJ0KTsKIAogICAgIHB1YmxpYyBSZXN0b3JhYmxlTWV0ZXIgZ2V0UmVhZE1ldGVyKCkKICAgICB7CiAgICAgICAgIHJldHVybiByZWFkTWV0ZXI7CiAgICAgfQogCi0gICAgcHVibGljIGludCBnZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkKKyAgICAvKioKKyAgICAgKiBBbGwgdGhlIHJlc291cmNlcyB3aGljaCBzaG91bGQgYmUgcmVsZWFzZWQgdXBvbiBjbG9zaW5nIHRoaXMgc3N0YWJsZSByZWFkZXIgYXJlIHJlZ2lzdGVyZWQgd2l0aCBpbgorICAgICAqIHtAbGluayBHbG9iYWxUaWR5fS4gVGhpcyBtZXRob2QgbGV0cyBjbG9zZSBhIHByb3ZpZGVkIHJlc291cmNlIGV4cGxpY2l0bHkgYW55IHRpbWUgYW5kIHVucmVnaXN0ZXIgaXQgZnJvbQorICAgICAqIHtAbGluayBHbG9iYWxUaWR5fSBzbyB0aGF0IGl0IGlzIG5vdCB0cmllZCB0byBiZSByZWxlYXNlZCB0d2ljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbG9zZWFibGUgYSByZXNvdXJjZSB0byBiZSBjbG9zZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjbG9zZUludGVybmFsQ29tcG9uZW50KEF1dG9DbG9zZWFibGUgY2xvc2VhYmxlKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGluZGV4U3VtbWFyeS5nZXRTYW1wbGluZ0xldmVsKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGlkeS5nbG9iYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVtb3ZlZCA9IHRpZHkuY2xvc2VhYmxlcy5yZW1vdmUoY2xvc2VhYmxlKTsKKyAgICAgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZShyZW1vdmVkKTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsb3NlYWJsZS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGNsb3NlICIgKyBjbG9zZWFibGUsIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBsb25nIGdldEluZGV4U3VtbWFyeU9mZkhlYXBTaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmRleFN1bW1hcnkuZ2V0T2ZmSGVhcFNpemUoKTsKLSAgICB9CisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgZXhwZWN0ZWQgdG8gY2xvc2UgdGhlIGNvbXBvbmVudHMgd2hpY2ggb2NjdXB5IG1lbW9yeSBidXQgYXJlIG5vdCBuZWVkZWQgd2hlbiB3ZSBqdXN0IHdhbnQgdG8KKyAgICAgKiBzdHJlYW0gdGhlIGNvbXBvbmVudHMgKGZvciBleGFtcGxlLCB3aGVuIFNTVGFibGUgaXMgb3BlbmVkIHdpdGggU1NUYWJsZUxvYWRlcikuIFRoZSBtZXRob2Qgc2hvdWxkIGNhbGwKKyAgICAgKiB7QGxpbmsgI2Nsb3NlSW50ZXJuYWxDb21wb25lbnQoQXV0b0Nsb3NlYWJsZSl9IGZvciBlYWNoIHN1Y2ggY29tcG9uZW50LiBMZWF2aW5nIHRoZSBpbXBsZW1lbnRhdGlvbiBlbXB0eSBpcworICAgICAqIHZhbGlkIGdpdmVuIHRoZXJlIGFyZSBub3Qgc3VjaCByZXNvdXJjZXMgdG8gcmVsZWFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWxlYXNlSW5NZW1vcnlDb21wb25lbnRzKCk7CiAKLSAgICBwdWJsaWMgaW50IGdldE1pbkluZGV4SW50ZXJ2YWwoKQorICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW55IHZhbGlkYXRpb24gbmVlZGVkIGZvciB0aGUgcmVhZGVyIHVwb24gY3JlYXRpb24gYmVmb3JlIHJldHVybmluZyBpdCBmcm9tIHRoZSB7QGxpbmsgQnVpbGRlcn0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGluZGV4U3VtbWFyeS5nZXRNaW5JbmRleEludGVydmFsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGRvdWJsZSBnZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmRleFN1bW1hcnkuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VTdW1tYXJ5KCkKLSAgICB7Ci0gICAgICAgIHRpZHkucmVsZWFzZVN1bW1hcnkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMuZmlyc3QuY29tcGFyZVRvKHRoaXMubGFzdCkgPiAwKQorICAgICAgICBpZiAodGhpcy5maXJzdC5jb21wYXJlVG8odGhpcy5sYXN0KSA+IDAgfHwgYm91bmRzID09IG51bGwpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlNTVGFibGUgZmlyc3Qga2V5ICVzID4gbGFzdCBrZXkgJXMiLCB0aGlzLmZpcnN0LCB0aGlzLmxhc3QpKSwgZ2V0RmlsZW5hbWUoKSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwb3NpdGlvbiBpbiB0aGUgaW5kZXggZmlsZSB0byBzdGFydCBzY2FubmluZyB0byBmaW5kIHRoZSBnaXZlbiBrZXkgKGF0IG1vc3QgaW5kZXhJbnRlcnZhbCBrZXlzIGF3YXksCi0gICAgICogbW9kdWxvIGRvd25zYW1wbGluZyBvZiB0aGUgaW5kZXggc3VtbWFyeSkuIEFsd2F5cyByZXR1cm5zIGEge0Bjb2RlIHZhbHVlID49IDB9Ci0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0SW5kZXhTY2FuUG9zaXRpb24oUGFydGl0aW9uUG9zaXRpb24ga2V5KQotICAgIHsKLSAgICAgICAgaWYgKG9wZW5SZWFzb24gPT0gT3BlblJlYXNvbi5NT1ZFRF9TVEFSVCAmJiBrZXkuY29tcGFyZVRvKGZpcnN0KSA8IDApCi0gICAgICAgICAgICBrZXkgPSBmaXJzdDsKLQotICAgICAgICByZXR1cm4gZ2V0SW5kZXhTY2FuUG9zaXRpb25Gcm9tQmluYXJ5U2VhcmNoUmVzdWx0KGluZGV4U3VtbWFyeS5iaW5hcnlTZWFyY2goa2V5KSwgaW5kZXhTdW1tYXJ5KTsKLSAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0SW5kZXhTY2FuUG9zaXRpb25Gcm9tQmluYXJ5U2VhcmNoUmVzdWx0KGludCBiaW5hcnlTZWFyY2hSZXN1bHQsIEluZGV4U3VtbWFyeSByZWZlcmVuY2VkSW5kZXhTdW1tYXJ5KQotICAgIHsKLSAgICAgICAgaWYgKGJpbmFyeVNlYXJjaFJlc3VsdCA9PSAtMSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlZEluZGV4U3VtbWFyeS5nZXRQb3NpdGlvbihnZXRJbmRleFN1bW1hcnlJbmRleEZyb21CaW5hcnlTZWFyY2hSZXN1bHQoYmluYXJ5U2VhcmNoUmVzdWx0KSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0SW5kZXhTdW1tYXJ5SW5kZXhGcm9tQmluYXJ5U2VhcmNoUmVzdWx0KGludCBiaW5hcnlTZWFyY2hSZXN1bHQpCi0gICAgewotICAgICAgICBpZiAoYmluYXJ5U2VhcmNoUmVzdWx0IDwgMCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gYmluYXJ5IHNlYXJjaCBnaXZlcyB1cyB0aGUgZmlyc3QgaW5kZXggX2dyZWF0ZXJfIHRoYW4gdGhlIGtleSBzZWFyY2hlZCBmb3IsCi0gICAgICAgICAgICAvLyBpLmUuLCBpdHMgaW5zZXJ0aW9uIHBvc2l0aW9uCi0gICAgICAgICAgICBpbnQgZ3JlYXRlclRoYW4gPSAoYmluYXJ5U2VhcmNoUmVzdWx0ICsgMSkgKiAtMTsKLSAgICAgICAgICAgIGlmIChncmVhdGVyVGhhbiA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIHJldHVybiBncmVhdGVyVGhhbiAtIDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYmluYXJ5U2VhcmNoUmVzdWx0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29tcHJlc3Npb24gbWV0YWRhdGEgZm9yIHRoaXMgc3N0YWJsZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBjb21wcmVzc2lvbiBtZXRhZGF0YSBmb3IgdGhpcyBzc3RhYmxlLiBOb3RlIHRoYXQgdGhlIGNvbXByZXNzaW9uIG1ldGRhdGEgaXMgYSByZXNvdXJjZSBhbmQgc2hvdWxkIG5vdAorICAgICAqIGJlIGNsb3NlZCBieSB0aGUgY2FsbGVyLgorICAgICAqIFRPRE8gZG8gbm90IHJldHVybiBhIGNsb3NlYWJsZSByZXNvdXJjZSBvciByZXR1cm4gYSBzaGFyZWQgY29weQorICAgICAqCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIHNzdGFibGUgaXMgbm90IGNvbXByZXNzZWQKICAgICAgKi8KICAgICBwdWJsaWMgQ29tcHJlc3Npb25NZXRhZGF0YSBnZXRDb21wcmVzc2lvbk1ldGFkYXRhKCkKQEAgLTExMjIsNiArNjg0LDcgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGFtb3VudCBvZiBtZW1vcnkgaW4gYnl0ZXMgdXNlZCBvZmYgaGVhcCBieSB0aGUgY29tcHJlc3Npb24gbWV0YS1kYXRhLgorICAgICAqCiAgICAgICogQHJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSBpbiBieXRlcyB1c2VkIG9mZiBoZWFwIGJ5IHRoZSBjb21wcmVzc2lvbiBtZXRhLWRhdGEKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBnZXRDb21wcmVzc2lvbk1ldGFkYXRhT2ZmSGVhcFNpemUoKQpAQCAtMTEzMiwxNjYgKzY5NSwzMCBAQAogICAgICAgICByZXR1cm4gZ2V0Q29tcHJlc3Npb25NZXRhZGF0YSgpLm9mZkhlYXBTaXplKCk7CiAgICAgfQogCi0gICAgcHVibGljIElGaWx0ZXIgZ2V0Qmxvb21GaWx0ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJmOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldEJsb29tRmlsdGVyU2VyaWFsaXplZFNpemUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJmLnNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgfQorICAgIC8qKgorICAgICAqIENhbGN1bGF0ZXMgYW4gZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBrZXlzIGluIHRoZSBzc3RhYmxlIHJlcHJlc2VudGVkIGJ5IHRoaXMgcmVhZGVyLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBsb25nIGVzdGltYXRlZEtleXMoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFtb3VudCBvZiBtZW1vcnkgaW4gYnl0ZXMgdXNlZCBvZmYgaGVhcCBieSB0aGUgYmxvb20gZmlsdGVyLgotICAgICAqIEByZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgaW4gYnl0ZXMgdXNlZCBvZmYgaGVhcCBieSB0aGUgYmxvb20gZmlsdGVyCisgICAgICogQ2FsY3VsYXRlcyBhbiBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mIGtleXMgZm9yIHRoZSBnaXZlbiByYW5nZXMgaW4gdGhlIHNzdGFibGUgcmVwcmVzZW50ZWQgYnkgdGhpcyByZWFkZXIuCiAgICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0Qmxvb21GaWx0ZXJPZmZIZWFwU2l6ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gYmYub2ZmSGVhcFNpemUoKTsKLSAgICB9CisgICAgcHVibGljIGFic3RyYWN0IGxvbmcgZXN0aW1hdGVkS2V5c0ZvclJhbmdlcyhDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4gcmFuZ2VzKTsKIAogICAgIC8qKgotICAgICAqIEByZXR1cm4gQW4gZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBrZXlzIGluIHRoaXMgU1NUYWJsZSBiYXNlZCBvbiB0aGUgaW5kZXggc3VtbWFyeS4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgbWV0aG9kcyBsaWtlIHtAbGluayAjZXN0aW1hdGVkS2V5cygpfSBvciB7QGxpbmsgI2VzdGltYXRlZEtleXNGb3JSYW5nZXMoQ29sbGVjdGlvbil9IGNhbiByZXR1cm4KKyAgICAgKiBzZW5zaWJsZSBlc3RpbWF0aW9ucy4KICAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBlc3RpbWF0ZWRLZXlzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmRleFN1bW1hcnkuZ2V0RXN0aW1hdGVkS2V5Q291bnQoKTsKLSAgICB9CisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNFc3RpbWF0aW9uSW5mb3JtYXRpdmUoKTsKIAogICAgIC8qKgotICAgICAqIEBwYXJhbSByYW5nZXMKLSAgICAgKiBAcmV0dXJuIEFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2Yga2V5cyBmb3IgZ2l2ZW4gcmFuZ2VzIGluIHRoaXMgU1NUYWJsZS4KKyAgICAgKiBSZXR1cm5zIHNhbXBsZSBrZXlzIGZvciB0aGUgcHJvdmlkZWQgdG9rZW4gcmFuZ2UuCiAgICAgICovCi0gICAgcHVibGljIGxvbmcgZXN0aW1hdGVkS2V5c0ZvclJhbmdlcyhDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4gcmFuZ2VzKQotICAgIHsKLSAgICAgICAgbG9uZyBzYW1wbGVLZXlDb3VudCA9IDA7Ci0gICAgICAgIExpc3Q8SW5kZXhlc0JvdW5kcz4gc2FtcGxlSW5kZXhlcyA9IGdldFNhbXBsZUluZGV4ZXNGb3JSYW5nZXMoaW5kZXhTdW1tYXJ5LCByYW5nZXMpOwotICAgICAgICBmb3IgKEluZGV4ZXNCb3VuZHMgc2FtcGxlSW5kZXhSYW5nZSA6IHNhbXBsZUluZGV4ZXMpCi0gICAgICAgICAgICBzYW1wbGVLZXlDb3VudCArPSAoc2FtcGxlSW5kZXhSYW5nZS51cHBlclBvc2l0aW9uIC0gc2FtcGxlSW5kZXhSYW5nZS5sb3dlclBvc2l0aW9uICsgMSk7Ci0KLSAgICAgICAgLy8gYWRqdXN0IGZvciB0aGUgY3VycmVudCBzYW1wbGluZyBsZXZlbDogKEJTTCAvIFNMKSAqIGluZGV4X2ludGVydmFsX2F0X2Z1bGxfc2FtcGxpbmcKLSAgICAgICAgbG9uZyBlc3RpbWF0ZWRLZXlzID0gc2FtcGxlS2V5Q291bnQgKiAoKGxvbmcpIERvd25zYW1wbGluZy5CQVNFX1NBTVBMSU5HX0xFVkVMICogaW5kZXhTdW1tYXJ5LmdldE1pbkluZGV4SW50ZXJ2YWwoKSkgLyBpbmRleFN1bW1hcnkuZ2V0U2FtcGxpbmdMZXZlbCgpOwotICAgICAgICByZXR1cm4gTWF0aC5tYXgoMSwgZXN0aW1hdGVkS2V5cyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIEluZGV4U3VtbWFyeS4gIEF0IGZ1bGwgc2FtcGxpbmcsIHRoaXMgaXMgYXBwcm94aW1hdGVseSAxL0lOREVYX0lOVEVSVkFMdGggb2YKLSAgICAgKiB0aGUga2V5cyBpbiB0aGlzIFNTVGFibGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRJbmRleFN1bW1hcnlTaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmRleFN1bW1hcnkuc2l6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFwcHJveGltYXRlIG51bWJlciBvZiBlbnRyaWVzIHRoZSBJbmRleFN1bW1hcnkgd291bGQgY29udGFpbiBpZiBpdCB3ZXJlIGF0IGZ1bGwgc2FtcGxpbmcuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNYXhJbmRleFN1bW1hcnlTaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmRleFN1bW1hcnkuZ2V0TWF4TnVtYmVyT2ZFbnRyaWVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUga2V5IGZvciB0aGUgaW5kZXggc3VtbWFyeSBlbnRyeSBhdCBgaW5kZXhgLgotICAgICAqLwotICAgIHB1YmxpYyBieXRlW10gZ2V0SW5kZXhTdW1tYXJ5S2V5KGludCBpbmRleCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmRleFN1bW1hcnkuZ2V0S2V5KGluZGV4KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEluZGV4ZXNCb3VuZHM+IGdldFNhbXBsZUluZGV4ZXNGb3JSYW5nZXMoSW5kZXhTdW1tYXJ5IHN1bW1hcnksIENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+PiByYW5nZXMpCi0gICAgewotICAgICAgICAvLyB1c2UgdGhlIGluZGV4IHRvIGRldGVybWluZSBhIG1pbmltYWwgc2VjdGlvbiBmb3IgZWFjaCByYW5nZQotICAgICAgICBMaXN0PEluZGV4ZXNCb3VuZHM+IHBvc2l0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCi0gICAgICAgIGZvciAoUmFuZ2U8VG9rZW4+IHJhbmdlIDogUmFuZ2Uubm9ybWFsaXplKHJhbmdlcykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFBhcnRpdGlvblBvc2l0aW9uIGxlZnRQb3NpdGlvbiA9IHJhbmdlLmxlZnQubWF4S2V5Qm91bmQoKTsKLSAgICAgICAgICAgIFBhcnRpdGlvblBvc2l0aW9uIHJpZ2h0UG9zaXRpb24gPSByYW5nZS5yaWdodC5tYXhLZXlCb3VuZCgpOwotCi0gICAgICAgICAgICBpbnQgbGVmdCA9IHN1bW1hcnkuYmluYXJ5U2VhcmNoKGxlZnRQb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAobGVmdCA8IDApCi0gICAgICAgICAgICAgICAgbGVmdCA9IChsZWZ0ICsgMSkgKiAtMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAvLyBsZWZ0IHJhbmdlIGFyZSBzdGFydCBleGNsdXNpdmUKLSAgICAgICAgICAgICAgICBsZWZ0ID0gbGVmdCArIDE7Ci0gICAgICAgICAgICBpZiAobGVmdCA9PSBzdW1tYXJ5LnNpemUoKSkKLSAgICAgICAgICAgICAgICAvLyBsZWZ0IGlzIHBhc3QgdGhlIGVuZCBvZiB0aGUgc2FtcGxpbmcKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgaW50IHJpZ2h0ID0gUmFuZ2UuaXNXcmFwQXJvdW5kKHJhbmdlLmxlZnQsIHJhbmdlLnJpZ2h0KQotICAgICAgICAgICAgICAgICAgICA/IHN1bW1hcnkuc2l6ZSgpIC0gMQotICAgICAgICAgICAgICAgICAgICA6IHN1bW1hcnkuYmluYXJ5U2VhcmNoKHJpZ2h0UG9zaXRpb24pOwotICAgICAgICAgICAgaWYgKHJpZ2h0IDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyByYW5nZSBhcmUgZW5kIGluY2x1c2l2ZSBzbyB3ZSB1c2UgdGhlIHByZXZpb3VzIGluZGV4IGZyb20gd2hhdCBiaW5hcnlTZWFyY2ggZ2l2ZSB1cwotICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoYXQgd2lsbCBiZSB0aGUgbGFzdCBpbmRleCB3ZSB3aWxsIHJldHVybgotICAgICAgICAgICAgICAgIHJpZ2h0ID0gKHJpZ2h0ICsgMSkgKiAtMTsKLSAgICAgICAgICAgICAgICBpZiAocmlnaHQgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgLy8gTWVhbnMgdGhlIGZpcnN0IGtleSBpcyBhbHJlYWR5IHN0cmljbHkgZ3JlYXRlciB0aGF0IHRoZSByaWdodCBib3VuZAotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICByaWdodC0tOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobGVmdCA+IHJpZ2h0KQotICAgICAgICAgICAgICAgIC8vIGVtcHR5IHJhbmdlCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBwb3NpdGlvbnMuYWRkKG5ldyBJbmRleGVzQm91bmRzKGxlZnQsIHJpZ2h0KSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBvc2l0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmFibGU8RGVjb3JhdGVkS2V5PiBnZXRLZXlTYW1wbGVzKGZpbmFsIFJhbmdlPFRva2VuPiByYW5nZSkKLSAgICB7Ci0gICAgICAgIGZpbmFsIExpc3Q8SW5kZXhlc0JvdW5kcz4gaW5kZXhSYW5nZXMgPSBnZXRTYW1wbGVJbmRleGVzRm9yUmFuZ2VzKGluZGV4U3VtbWFyeSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChyYW5nZSkpOwotCi0gICAgICAgIGlmIChpbmRleFJhbmdlcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBJdGVyYWJsZTxEZWNvcmF0ZWRLZXk+KCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIEl0ZXJhdG9yPERlY29yYXRlZEtleT4gaXRlcmF0b3IoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3I8RGVjb3JhdGVkS2V5PigpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwcml2YXRlIEl0ZXJhdG9yPEluZGV4ZXNCb3VuZHM+IHJhbmdlSXRlciA9IGluZGV4UmFuZ2VzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHByaXZhdGUgSW5kZXhlc0JvdW5kcyBjdXJyZW50OwotICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGludCBpZHg7Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50ID09IG51bGwgfHwgaWR4ID4gY3VycmVudC51cHBlclBvc2l0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZUl0ZXIuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHJhbmdlSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IGN1cnJlbnQubG93ZXJQb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgRGVjb3JhdGVkS2V5IG5leHQoKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBpbmRleFN1bW1hcnkuZ2V0S2V5KGlkeCsrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWNvcmF0ZUtleShCeXRlQnVmZmVyLndyYXAoYnl0ZXMpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9CisgICAgcHVibGljIGFic3RyYWN0IEl0ZXJhYmxlPERlY29yYXRlZEtleT4gZ2V0S2V5U2FtcGxlcyhmaW5hbCBSYW5nZTxUb2tlbj4gcmFuZ2UpOwogCiAgICAgLyoqCiAgICAgICogRGV0ZXJtaW5lIHRoZSBtaW5pbWFsIHNldCBvZiBzZWN0aW9ucyB0aGF0IGNhbiBiZSBleHRyYWN0ZWQgZnJvbSB0aGlzIFNTVGFibGUgdG8gY292ZXIgdGhlIGdpdmVuIHJhbmdlcy4KKyAgICAgKgogICAgICAqIEByZXR1cm4gQSBzb3J0ZWQgbGlzdCBvZiAob2Zmc2V0LGVuZCkgcGFpcnMgdGhhdCBjb3ZlciB0aGUgZ2l2ZW4gcmFuZ2VzIGluIHRoZSBkYXRhZmlsZSBmb3IgdGhpcyBTU1RhYmxlLgogICAgICAqLwogICAgIHB1YmxpYyBMaXN0PFBhcnRpdGlvblBvc2l0aW9uQm91bmRzPiBnZXRQb3NpdGlvbnNGb3JSYW5nZXMoQ29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+IHJhbmdlcykKQEAgLTEzMDksMTAgKzczNiwxMCBAQAogICAgICAgICAgICAgaWYgKGxlZnRCb3VuZC5jb21wYXJlVG8obGFzdCkgPiAwIHx8IHJpZ2h0Qm91bmQuY29tcGFyZVRvKGZpcnN0KSA8IDApCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAKLSAgICAgICAgICAgIGxvbmcgbGVmdCA9IGdldFBvc2l0aW9uKGxlZnRCb3VuZCwgT3BlcmF0b3IuR1QpLnBvc2l0aW9uOworICAgICAgICAgICAgbG9uZyBsZWZ0ID0gZ2V0UG9zaXRpb24obGVmdEJvdW5kLCBPcGVyYXRvci5HVCk7CiAgICAgICAgICAgICBsb25nIHJpZ2h0ID0gKHJpZ2h0Qm91bmQuY29tcGFyZVRvKGxhc3QpID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICA/IHVuY29tcHJlc3NlZExlbmd0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRQb3NpdGlvbihyaWdodEJvdW5kLCBPcGVyYXRvci5HVCkucG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRQb3NpdGlvbihyaWdodEJvdW5kLCBPcGVyYXRvci5HVCk7CiAKICAgICAgICAgICAgIGlmIChsZWZ0ID09IHJpZ2h0KQogICAgICAgICAgICAgICAgIC8vIGVtcHR5IHJhbmdlCkBAIC0xMzI0LDE0NiArNzUxLDkxIEBACiAgICAgICAgIHJldHVybiBwb3NpdGlvbnM7CiAgICAgfQogCi0gICAgcHVibGljIEtleUNhY2hlS2V5IGdldENhY2hlS2V5KERlY29yYXRlZEtleSBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEtleUNhY2hlS2V5KG1ldGFkYXRhKCksIGRlc2NyaXB0b3IsIGtleS5nZXRLZXkoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2FjaGVLZXkoRGVjb3JhdGVkS2V5IGtleSwgUm93SW5kZXhFbnRyeSBpbmZvKQotICAgIHsKLSAgICAgICAgQ2FjaGluZ1BhcmFtcyBjYWNoaW5nID0gbWV0YWRhdGEoKS5wYXJhbXMuY2FjaGluZzsKLQotICAgICAgICBpZiAoIWNhY2hpbmcuY2FjaGVLZXlzKCkgfHwga2V5Q2FjaGUgPT0gbnVsbCB8fCBrZXlDYWNoZS5nZXRDYXBhY2l0eSgpID09IDApCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgS2V5Q2FjaGVLZXkgY2FjaGVLZXkgPSBuZXcgS2V5Q2FjaGVLZXkobWV0YWRhdGEoKSwgZGVzY3JpcHRvciwga2V5LmdldEtleSgpKTsKLSAgICAgICAgbG9nZ2VyLnRyYWNlKCJBZGRpbmcgY2FjaGUgZW50cnkgZm9yIHt9IC0+IHt9IiwgY2FjaGVLZXksIGluZm8pOwotICAgICAgICBrZXlDYWNoZS5wdXQoY2FjaGVLZXksIGluZm8pOwotICAgIH0KLQotICAgIHB1YmxpYyBSb3dJbmRleEVudHJ5IGdldENhY2hlZFBvc2l0aW9uKERlY29yYXRlZEtleSBrZXksIGJvb2xlYW4gdXBkYXRlU3RhdHMpCi0gICAgewotICAgICAgICBpZiAoaXNLZXlDYWNoZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRDYWNoZWRQb3NpdGlvbihuZXcgS2V5Q2FjaGVLZXkobWV0YWRhdGEoKSwgZGVzY3JpcHRvciwga2V5LmdldEtleSgpKSwgdXBkYXRlU3RhdHMpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUm93SW5kZXhFbnRyeSBnZXRDYWNoZWRQb3NpdGlvbihLZXlDYWNoZUtleSB1bmlmaWVkS2V5LCBib29sZWFuIHVwZGF0ZVN0YXRzKQotICAgIHsKLSAgICAgICAgaWYgKGlzS2V5Q2FjaGVFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh1cGRhdGVTdGF0cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSb3dJbmRleEVudHJ5IGNhY2hlZEVudHJ5ID0ga2V5Q2FjaGUuZ2V0KHVuaWZpZWRLZXkpOwotICAgICAgICAgICAgICAgIGtleUNhY2hlUmVxdWVzdC5pbmNyZW1lbnRBbmRHZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoY2FjaGVkRW50cnkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGtleUNhY2hlSGl0LmluY3JlbWVudEFuZEdldCgpOwotICAgICAgICAgICAgICAgICAgICBibG9vbUZpbHRlclRyYWNrZXIuYWRkVHJ1ZVBvc2l0aXZlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWRFbnRyeTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4ga2V5Q2FjaGUuZ2V0SW50ZXJuYWwodW5pZmllZEtleSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNLZXlDYWNoZUVuYWJsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGtleUNhY2hlICE9IG51bGwgJiYgbWV0YWRhdGEoKS5wYXJhbXMuY2FjaGluZy5jYWNoZUtleXMoKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBSZXRyaWV2ZXMgdGhlIHBvc2l0aW9uIHdoaWxlIHVwZGF0aW5nIHRoZSBrZXkgY2FjaGUgYW5kIHRoZSBzdGF0cy4KKyAgICAgKgogICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byBhcHBseSBhcyB0aGUgcmhzIHRvIHRoZSBnaXZlbiBPcGVyYXRvci4gQSAnZmFrZScga2V5IGlzIGFsbG93ZWQgdG8KLSAgICAgKiBhbGxvdyBrZXkgc2VsZWN0aW9uIGJ5IHRva2VuIGJvdW5kcyBidXQgb25seSBpZiBvcCAhPSAqIEVRCi0gICAgICogQHBhcmFtIG9wIFRoZSBPcGVyYXRvciBkZWZpbmluZyBtYXRjaGluZyBrZXlzOiB0aGUgbmVhcmVzdCBrZXkgdG8gdGhlIHRhcmdldCBtYXRjaGluZyB0aGUgb3BlcmF0b3Igd2lucy4KKyAgICAgKiAgICAgICAgICAgIGFsbG93IGtleSBzZWxlY3Rpb24gYnkgdG9rZW4gYm91bmRzIGJ1dCBvbmx5IGlmIG9wICE9ICogRVEKKyAgICAgKiBAcGFyYW0gb3AgIFRoZSBPcGVyYXRvciBkZWZpbmluZyBtYXRjaGluZyBrZXlzOiB0aGUgbmVhcmVzdCBrZXkgdG8gdGhlIHRhcmdldCBtYXRjaGluZyB0aGUgb3BlcmF0b3Igd2lucy4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgUm93SW5kZXhFbnRyeSBnZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbiBrZXksIE9wZXJhdG9yIG9wKQorICAgIHB1YmxpYyBmaW5hbCBsb25nIGdldFBvc2l0aW9uKFBhcnRpdGlvblBvc2l0aW9uIGtleSwgT3BlcmF0b3Igb3ApCiAgICAgewogICAgICAgICByZXR1cm4gZ2V0UG9zaXRpb24oa2V5LCBvcCwgU1NUYWJsZVJlYWRzTGlzdGVuZXIuTk9PUF9MSVNURU5FUik7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSBwb3NpdGlvbiB3aGlsZSB1cGRhdGluZyB0aGUga2V5IGNhY2hlIGFuZCB0aGUgc3RhdHMuCi0gICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGFwcGx5IGFzIHRoZSByaHMgdG8gdGhlIGdpdmVuIE9wZXJhdG9yLiBBICdmYWtlJyBrZXkgaXMgYWxsb3dlZCB0bwotICAgICAqIGFsbG93IGtleSBzZWxlY3Rpb24gYnkgdG9rZW4gYm91bmRzIGJ1dCBvbmx5IGlmIG9wICE9ICogRVEKLSAgICAgKiBAcGFyYW0gb3AgVGhlIE9wZXJhdG9yIGRlZmluaW5nIG1hdGNoaW5nIGtleXM6IHRoZSBuZWFyZXN0IGtleSB0byB0aGUgdGFyZ2V0IG1hdGNoaW5nIHRoZSBvcGVyYXRvciB3aW5zLgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUge0Bjb2RlIFNTVGFibGVSZWFkZXJMaXN0ZW5lcn0gdGhhdCBtdXN0IGhhbmRsZSB0aGUgbm90aWZpY2F0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgUm93SW5kZXhFbnRyeSBnZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbiBrZXksIE9wZXJhdG9yIG9wLCBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICBwdWJsaWMgZmluYWwgbG9uZyBnZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbiBrZXksIE9wZXJhdG9yIG9wLCBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcikKICAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQb3NpdGlvbihrZXksIG9wLCB0cnVlLCBmYWxzZSwgbGlzdGVuZXIpOworICAgICAgICByZXR1cm4gZ2V0UG9zaXRpb24oa2V5LCBvcCwgdHJ1ZSwgbGlzdGVuZXIpOwogICAgIH0KIAotICAgIHB1YmxpYyBmaW5hbCBSb3dJbmRleEVudHJ5IGdldFBvc2l0aW9uKFBhcnRpdGlvblBvc2l0aW9uIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRvciBvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVwZGF0ZUNhY2hlQW5kU3RhdHMpCisgICAgcHVibGljIGZpbmFsIGxvbmcgZ2V0UG9zaXRpb24oUGFydGl0aW9uUG9zaXRpb24ga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXBkYXRlU3RhdHMpCiAgICAgewotICAgICAgICByZXR1cm4gZ2V0UG9zaXRpb24oa2V5LCBvcCwgdXBkYXRlQ2FjaGVBbmRTdGF0cywgZmFsc2UsIFNTVGFibGVSZWFkc0xpc3RlbmVyLk5PT1BfTElTVEVORVIpOworICAgICAgICByZXR1cm4gZ2V0UG9zaXRpb24oa2V5LCBvcCwgdXBkYXRlU3RhdHMsIFNTVGFibGVSZWFkc0xpc3RlbmVyLk5PT1BfTElTVEVORVIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byBhcHBseSBhcyB0aGUgcmhzIHRvIHRoZSBnaXZlbiBPcGVyYXRvci4gQSAnZmFrZScga2V5IGlzIGFsbG93ZWQgdG8KLSAgICAgKiBhbGxvdyBrZXkgc2VsZWN0aW9uIGJ5IHRva2VuIGJvdW5kcyBidXQgb25seSBpZiBvcCAhPSAqIEVRCi0gICAgICogQHBhcmFtIG9wIFRoZSBPcGVyYXRvciBkZWZpbmluZyBtYXRjaGluZyBrZXlzOiB0aGUgbmVhcmVzdCBrZXkgdG8gdGhlIHRhcmdldCBtYXRjaGluZyB0aGUgb3BlcmF0b3Igd2lucy4KLSAgICAgKiBAcGFyYW0gdXBkYXRlQ2FjaGVBbmRTdGF0cyB0cnVlIGlmIHVwZGF0aW5nIHN0YXRzIGFuZCBjYWNoZQotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBhIGxpc3RlbmVyIHVzZWQgdG8gaGFuZGxlIGludGVybmFsIGV2ZW50cworICAgICAqIFJldHJpZXZlIGEgcG9zaXRpb24gaW4gZGF0YSBmaWxlIGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQga2V5IGFuZCBvcGVyYXRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgICAgICAgICBUaGUga2V5IHRvIGFwcGx5IGFzIHRoZSByaHMgdG8gdGhlIGdpdmVuIE9wZXJhdG9yLiBBICdmYWtlJyBrZXkgaXMgYWxsb3dlZCB0bworICAgICAqICAgICAgICAgICAgICAgICAgICBhbGxvdyBrZXkgc2VsZWN0aW9uIGJ5IHRva2VuIGJvdW5kcyBidXQgb25seSBpZiBvcCAhPSAqIEVRCisgICAgICogQHBhcmFtIG9wICAgICAgICAgIFRoZSBPcGVyYXRvciBkZWZpbmluZyBtYXRjaGluZyBrZXlzOiB0aGUgbmVhcmVzdCBrZXkgdG8gdGhlIHRhcmdldCBtYXRjaGluZyB0aGUgb3BlcmF0b3Igd2lucy4KKyAgICAgKiBAcGFyYW0gdXBkYXRlU3RhdHMgdHJ1ZSBpZiB1cGRhdGluZyBzdGF0cyBhbmQgY2FjaGUKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgICAgYSBsaXN0ZW5lciB1c2VkIHRvIGhhbmRsZSBpbnRlcm5hbCBldmVudHMKICAgICAgKiBAcmV0dXJuIFRoZSBpbmRleCBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBrZXksIG9yIG51bGwgaWYgdGhlIGtleSBpcyBub3QgcHJlc2VudAogICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBSb3dJbmRleEVudHJ5IGdldFBvc2l0aW9uKFBhcnRpdGlvblBvc2l0aW9uIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRvciBvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVwZGF0ZUNhY2hlQW5kU3RhdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwZXJtaXRNYXRjaFBhc3RMYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkc0xpc3RlbmVyIGxpc3RlbmVyKTsKKyAgICBwcm90ZWN0ZWQgbG9uZyBnZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3Igb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1cGRhdGVTdGF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICB7CisgICAgICAgIEFic3RyYWN0Um93SW5kZXhFbnRyeSByaWUgPSBnZXRSb3dJbmRleEVudHJ5KGtleSwgb3AsIHVwZGF0ZVN0YXRzLCBsaXN0ZW5lcik7CisgICAgICAgIHJldHVybiByaWUgIT0gbnVsbCA/IHJpZS5wb3NpdGlvbiA6IC0xOworICAgIH0KIAotICAgIHB1YmxpYyBhYnN0cmFjdCBVbmZpbHRlcmVkUm93SXRlcmF0b3Igcm93SXRlcmF0b3IoRmlsZURhdGFJbnB1dCBmaWxlLCBEZWNvcmF0ZWRLZXkga2V5LCBSb3dJbmRleEVudHJ5IGluZGV4RW50cnksIFNsaWNlcyBzbGljZXMsIENvbHVtbkZpbHRlciBzZWxlY3RlZENvbHVtbnMsIGJvb2xlYW4gcmV2ZXJzZWQpOworICAgIC8qKgorICAgICAqIFJldHJpZXZlIGFuIGluZGV4IGVudHJ5IGZvciB0aGUgcGFydGl0aW9uIGZvdW5kIGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQga2V5IGFuZCBvcGVyYXRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgICAgICAgICBUaGUga2V5IHRvIGFwcGx5IGFzIHRoZSByaHMgdG8gdGhlIGdpdmVuIE9wZXJhdG9yLiBBICdmYWtlJyBrZXkgaXMgYWxsb3dlZCB0bworICAgICAqICAgICAgICAgICAgICAgICAgICBhbGxvdyBrZXkgc2VsZWN0aW9uIGJ5IHRva2VuIGJvdW5kcyBidXQgb25seSBpZiBvcCAhPSAqIEVRCisgICAgICogQHBhcmFtIG9wICAgICAgICAgIFRoZSBPcGVyYXRvciBkZWZpbmluZyBtYXRjaGluZyBrZXlzOiB0aGUgbmVhcmVzdCBrZXkgdG8gdGhlIHRhcmdldCBtYXRjaGluZyB0aGUgb3BlcmF0b3Igd2lucy4KKyAgICAgKiBAcGFyYW0gdXBkYXRlU3RhdHMgdHJ1ZSBpZiB1cGRhdGluZyBzdGF0cyBhbmQgY2FjaGUKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgICAgYSBsaXN0ZW5lciB1c2VkIHRvIGhhbmRsZSBpbnRlcm5hbCBldmVudHMKKyAgICAgKiBAcmV0dXJuIFRoZSBpbmRleCBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBrZXksIG9yIG51bGwgaWYgdGhlIGtleSBpcyBub3QgcHJlc2VudAorICAgICAqLworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBBYnN0cmFjdFJvd0luZGV4RW50cnkgZ2V0Um93SW5kZXhFbnRyeShQYXJ0aXRpb25Qb3NpdGlvbiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVwZGF0ZVN0YXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcik7CiAKLSAgICBwdWJsaWMgYWJzdHJhY3QgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHNpbXBsZUl0ZXJhdG9yKEZpbGVEYXRhSW5wdXQgZmlsZSwgRGVjb3JhdGVkS2V5IGtleSwgUm93SW5kZXhFbnRyeSBpbmRleEVudHJ5LCBib29sZWFuIHRvbWJzdG9uZU9ubHkpOworICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3Igc2ltcGxlSXRlcmF0b3IoRmlsZURhdGFJbnB1dCBmaWxlLCBEZWNvcmF0ZWRLZXkga2V5LCBsb25nIGRhdGFQb3NpdGlvbiwgYm9vbGVhbiB0b21ic3RvbmVPbmx5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIFNTVGFibGVJZGVudGl0eUl0ZXJhdG9yLmNyZWF0ZSh0aGlzLCBmaWxlLCBkYXRhUG9zaXRpb24sIGtleSwgdG9tYnN0b25lT25seSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHtAbGluayBLZXlSZWFkZXJ9IG92ZXIgYWxsIGtleXMgaW4gdGhlIHNzdGFibGUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEtleVJlYWRlciBrZXlSZWFkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIEtleUl0ZXJhdG9yfSBvdmVyIGFsbCBrZXlzIGluIHRoZSBzc3RhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBLZXlJdGVyYXRvciBrZXlJdGVyYXRvcigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBLZXlJdGVyYXRvcihrZXlSZWFkZXIoKSwgZ2V0UGFydGl0aW9uZXIoKSwgdW5jb21wcmVzc2VkTGVuZ3RoKCksIG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCkpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIEZpbmRzIGFuZCByZXR1cm5zIHRoZSBmaXJzdCBrZXkgYmV5b25kIGEgZ2l2ZW4gdG9rZW4gaW4gdGhpcyBTU1RhYmxlIG9yIG51bGwgaWYgbm8gc3VjaCBrZXkgZXhpc3RzLgogICAgICAqLwotICAgIHB1YmxpYyBEZWNvcmF0ZWRLZXkgZmlyc3RLZXlCZXlvbmQoUGFydGl0aW9uUG9zaXRpb24gdG9rZW4pCi0gICAgewotICAgICAgICBpZiAodG9rZW4uY29tcGFyZVRvKGZpcnN0KSA8IDApCi0gICAgICAgICAgICByZXR1cm4gZmlyc3Q7Ci0KLSAgICAgICAgbG9uZyBzYW1wbGVkUG9zaXRpb24gPSBnZXRJbmRleFNjYW5Qb3NpdGlvbih0b2tlbik7Ci0KLSAgICAgICAgaWYgKGlmaWxlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBTdHJpbmcgcGF0aCA9IG51bGw7Ci0gICAgICAgIHRyeSAoRmlsZURhdGFJbnB1dCBpbiA9IGlmaWxlLmNyZWF0ZVJlYWRlcihzYW1wbGVkUG9zaXRpb24pKQotICAgICAgICB7Ci0gICAgICAgICAgICBwYXRoID0gaW4uZ2V0UGF0aCgpOwotICAgICAgICAgICAgd2hpbGUgKCFpbi5pc0VPRigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgaW5kZXhLZXkgPSBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGluKTsKLSAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgaW5kZXhEZWNvcmF0ZWRLZXkgPSBkZWNvcmF0ZUtleShpbmRleEtleSk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4RGVjb3JhdGVkS2V5LmNvbXBhcmVUbyh0b2tlbikgPiAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhEZWNvcmF0ZWRLZXk7Ci0KLSAgICAgICAgICAgICAgICBSb3dJbmRleEVudHJ5LlNlcmlhbGl6ZXIuc2tpcChpbiwgZGVzY3JpcHRvci52ZXJzaW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgbWFya1N1c3BlY3QoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihlLCBwYXRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKyAgICBwdWJsaWMgYWJzdHJhY3QgRGVjb3JhdGVkS2V5IGZpcnN0S2V5QmV5b25kKFBhcnRpdGlvblBvc2l0aW9uIHRva2VuKTsKIAogICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgZGF0YSBmb3IgdGhpcyBTU1RhYmxlLiBGb3IKLSAgICAgKiBjb21wcmVzc2VkIGZpbGVzLCB0aGlzIGlzIG5vdCB0aGUgc2FtZSB0aGluZyBhcyB0aGUgb24gZGlzayBzaXplIChzZWUKLSAgICAgKiBvbkRpc2tMZW5ndGgoKSkKKyAgICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlICh1bmNvbXByZXNzZWQpIGRhdGEgZm9yIHRoaXMgU1NUYWJsZS4gRm9yIGNvbXByZXNzZWQgZmlsZXMsIHRoaXMgaXMgbm90CisgICAgICogdGhlIHNhbWUgdGhpbmcgYXMgdGhlIG9uIGRpc2sgc2l6ZSAoc2VlIHtAbGluayAjb25EaXNrTGVuZ3RoKCl9KS4KICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyB1bmNvbXByZXNzZWRMZW5ndGgoKQogICAgIHsKQEAgLTE0NzEsOSArODQzLDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIG9uIGRpc2sgc2l6ZSBmb3IgdGhpcyBTU1RhYmxlLiBGb3IKLSAgICAgKiBjb21wcmVzc2VkIGZpbGVzLCB0aGlzIGlzIG5vdCB0aGUgc2FtZSB0aGluZyBhcyB0aGUgZGF0YSBsZW5ndGggKHNlZQotICAgICAqIGxlbmd0aCgpKQorICAgICAqIFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIG9uIGRpc2sgc2l6ZSBmb3IgdGhpcyBTU1RhYmxlLiBGb3IgY29tcHJlc3NlZCBmaWxlcywgdGhpcyBpcyBub3QgdGhlIHNhbWUgdGhpbmcKKyAgICAgKiBhcyB0aGUgZGF0YSBsZW5ndGggKHNlZSB7QGxpbmsgI3VuY29tcHJlc3NlZExlbmd0aCgpfSkuCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgb25EaXNrTGVuZ3RoKCkKICAgICB7CkBAIC0xNDg3LDEwICs4NTgsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgdmFsdWUgb2YgQ1JDIGNoZWNrIGNoYW5jZS4gVGhlIGFyZ3VtZW50IHN1cHBsaWVkIGlzIG9idGFpbmVkCi0gICAgICogZnJvbSB0aGUgdGhlIHByb3BlcnR5IG9mIHRoZSBvd25pbmcgQ0ZTLiBDYWxsZWQgd2hlbiBlaXRoZXIgdGhlIFNTVFIKLSAgICAgKiBpcyBpbml0aWFsaXplZCwgb3IgdGhlIENGUydzIHByb3BlcnR5IGlzIHVwZGF0ZWQgdmlhIEpNWAotICAgICAqIEBwYXJhbSBjcmNDaGVja0NoYW5jZQorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgQ1JDIGNoZWNrIGNoYW5jZS4gVGhlIGFyZ3VtZW50IHN1cHBsaWVkIGlzIG9idGFpbmVkIGZyb20gdGhlIHByb3BlcnR5IG9mIHRoZSBvd25pbmcgQ0ZTLgorICAgICAqIENhbGxlZCB3aGVuIGVpdGhlciB0aGUgU1NUUiBpcyBpbml0aWFsaXplZCwgb3IgdGhlIENGUydzIHByb3BlcnR5IGlzIHVwZGF0ZWQgdmlhIEpNWAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENyY0NoZWNrQ2hhbmNlKGRvdWJsZSBjcmNDaGVja0NoYW5jZSkKICAgICB7CkBAIC0xNTAwLDExICs4NjksMTEgQEAKIAogICAgIC8qKgogICAgICAqIE1hcmsgdGhlIHNzdGFibGUgYXMgb2Jzb2xldGUsIGkuZS4sIGNvbXBhY3RlZCBpbnRvIG5ld2VyIHNzdGFibGVzLgotICAgICAqCi0gICAgICogV2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIHRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCB0aGUgU1NUYWJsZVJlYWRlciBpcyBub3QgcmVmZXJlbmNlZCBhbnl3aGVyZQotICAgICAqIGV4Y2VwdCBmb3IgdGhyZWFkcyBob2xkaW5nIGEgcmVmZXJlbmNlLgotICAgICAqCi0gICAgICogbXVsdGlwbGUgdGltZXMgaXMgdXN1YWxseSBidWdneSAoc2VlIGV4Y2VwdGlvbnMgaW4gVHJhY2tlci51bm1hcmtDb21wYWN0aW5nIGFuZCByZW1vdmVPbGRTU1RhYmxlc1NpemUpLgorICAgICAqIDxwPgorICAgICAqIFdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCB0aGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgdGhlIFNTVGFibGVSZWFkZXIgaXMgbm90IHJlZmVyZW5jZWQgYW55d2hlcmUgZXhjZXB0IGZvcgorICAgICAqIHRocmVhZHMgaG9sZGluZyBhIHJlZmVyZW5jZS4KKyAgICAgKiA8cD4KKyAgICAgKiBDYWxsaW5nIGl0IG11bHRpcGxlIHRpbWVzIGlzIHVzdWFsbHkgYnVnZ3kuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbWFya09ic29sZXRlKFJ1bm5hYmxlIHRpZGllcikKICAgICB7CkBAIC0xNTE0LDcgKzg4Myw3IEBACiAgICAgICAgIHN5bmNocm9uaXplZCAodGlkeS5nbG9iYWwpCiAgICAgICAgIHsKICAgICAgICAgICAgIGFzc2VydCAhdGlkeS5pc1JlcGxhY2VkOwotICAgICAgICAgICAgYXNzZXJ0IHRpZHkuZ2xvYmFsLm9ic29sZXRpb24gPT0gbnVsbDogdGhpcyArICIgd2FzIGFscmVhZHkgbWFya2VkIGNvbXBhY3RlZCI7CisgICAgICAgICAgICBhc3NlcnQgdGlkeS5nbG9iYWwub2Jzb2xldGlvbiA9PSBudWxsIDogdGhpcyArICIgd2FzIGFscmVhZHkgbWFya2VkIGNvbXBhY3RlZCI7CiAKICAgICAgICAgICAgIHRpZHkuZ2xvYmFsLm9ic29sZXRpb24gPSB0aWRpZXI7CiAgICAgICAgICAgICB0aWR5Lmdsb2JhbC5zdG9wUmVhZE1ldGVyUGVyc2lzdGVuY2UoKTsKQEAgLTE1ODEsMjAgKzk1MCwyNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBJU1NUYWJsZVNjYW5uZXIgZ2V0U2Nhbm5lcihJdGVyYXRvcjxBYnN0cmFjdEJvdW5kczxQYXJ0aXRpb25Qb3NpdGlvbj4+IHJhbmdlSXRlcmF0b3IpOwogCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEge0BsaW5rIEZpbGVEYXRhSW5wdXR9IGZvciB0aGUgZGF0YSBmaWxlIG9mIHRoZSBzc3RhYmxlIHJlcHJlc2VudGVkIGJ5IHRoaXMgcmVhZGVyLiBUaGlzIG1ldGhvZCByZXR1cm5zCisgICAgICogYSBuZXdseSBvcGVuZWQgcmVzb3VyY2Ugd2hpY2ggbXVzdCBiZSBjbG9zZWQgYnkgdGhlIGNhbGxlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgZGF0YSBpbnB1dCB3aWxsIGJlIG9wZW5lZCBhbmQgc2VlayB0byB0aGlzIHBvc2l0aW9uCisgICAgICovCiAgICAgcHVibGljIEZpbGVEYXRhSW5wdXQgZ2V0RmlsZURhdGFJbnB1dChsb25nIHBvc2l0aW9uKQogICAgIHsKICAgICAgICAgcmV0dXJuIGRmaWxlLmNyZWF0ZVJlYWRlcihwb3NpdGlvbik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGVzdHMgaWYgdGhlIHNzdGFibGUgY29udGFpbnMgZGF0YSBuZXdlciB0aGFuIHRoZSBnaXZlbiBhZ2UgcGFyYW0gKGluIGxvY2FsaG9zdCBjdXJyZW50TWlsbGkgdGltZSkuCi0gICAgICogVGhpcyB3b3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIG1heERhdGFBZ2Ugd2hpY2ggaXMgYW4gdXBwZXIgYm91bmQgb24gdGhlIGNyZWF0ZSBvZiBkYXRhIGluIHRoaXMgc3N0YWJsZS4KLSAgICAgKiBAcGFyYW0gYWdlIFRoZSBhZ2UgdG8gY29tcGFyZSB0aGUgbWF4RGF0YUFyZSBvZiB0aGlzIHNzdGFibGUuIE1lYXN1cmVkIGluIG1pbGxpc2VjIHNpbmNlIGVwb2Mgb24gdGhpcyBob3N0Ci0gICAgICogQHJldHVybiBUcnVlIGlmZiB0aGlzIHNzdGFibGUgY29udGFpbnMgZGF0YSB0aGF0J3MgbmV3ZXIgdGhhbiB0aGUgZ2l2ZW4gYWdlIHBhcmFtZXRlci4KKyAgICAgKiBUZXN0cyBpZiB0aGUgc3N0YWJsZSBjb250YWlucyBkYXRhIG5ld2VyIHRoYW4gdGhlIGdpdmVuIGFnZSBwYXJhbSAoaW4gbG9jYWxob3N0IGN1cnJlbnRNaWxsaXMgdGltZSkuCisgICAgICogVGhpcyB3b3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIG1heERhdGFBZ2Ugd2hpY2ggaXMgYW4gdXBwZXIgYm91bmQgb24gdGhlIGRhdGEgaW4gdGhlIHNzdGFibGUgcmVwcmVzZW50ZWQKKyAgICAgKiBieSB0aGlzIHJlYWRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmZiB0aGlzIHNzdGFibGUgY29udGFpbnMgZGF0YSB0aGF0J3MgbmV3ZXIgdGhhbiB0aGUgZ2l2ZW4gdGltZXN0YW1wCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbmV3U2luY2UobG9uZyBhZ2UpCisgICAgcHVibGljIGJvb2xlYW4gbmV3U2luY2UobG9uZyB0aW1lc3RhbXBNaWxsaXMpCiAgICAgewotICAgICAgICByZXR1cm4gbWF4RGF0YUFnZSA+IGFnZTsKKyAgICAgICAgcmV0dXJuIG1heERhdGFBZ2UgPiB0aW1lc3RhbXBNaWxsaXM7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgY3JlYXRlTGlua3MoU3RyaW5nIHNuYXBzaG90RGlyZWN0b3J5UGF0aCkKQEAgLTE2MTYsNyArOTkyLDcgQEAKICAgICB7CiAgICAgICAgIGZvciAoQ29tcG9uZW50IGNvbXBvbmVudCA6IGNvbXBvbmVudHMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZpbGUgc291cmNlRmlsZSA9IG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoY29tcG9uZW50KSk7CisgICAgICAgICAgICBGaWxlIHNvdXJjZUZpbGUgPSBkZXNjcmlwdG9yLmZpbGVGb3IoY29tcG9uZW50KTsKICAgICAgICAgICAgIGlmICghc291cmNlRmlsZS5leGlzdHMoKSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIGlmIChudWxsICE9IGxpbWl0ZXIpCkBAIC0xNjMxLDI1ICsxMDA3LDE3IEBACiAgICAgICAgIHJldHVybiBzc3RhYmxlTWV0YWRhdGEucmVwYWlyZWRBdCAhPSBBY3RpdmVSZXBhaXJTZXJ2aWNlLlVOUkVQQUlSRURfU1NUQUJMRTsKICAgICB9CiAKLSAgICBwdWJsaWMgRGVjb3JhdGVkS2V5IGtleUF0KGxvbmcgaW5kZXhQb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBEZWNvcmF0ZWRLZXkga2V5OwotICAgICAgICB0cnkgKEZpbGVEYXRhSW5wdXQgaW4gPSBpZmlsZS5jcmVhdGVSZWFkZXIoaW5kZXhQb3NpdGlvbikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpbi5pc0VPRigpKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICBrZXkgPSBkZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGluKSk7Ci0KLSAgICAgICAgICAgIC8vIGhpbnQgcmVhZCBwYXRoIGFib3V0IGtleSBsb2NhdGlvbiBpZiBjYWNoaW5nIGlzIGVuYWJsZWQKLSAgICAgICAgICAgIC8vIHRoaXMgc2F2ZXMgaW5kZXggc3VtbWFyeSBsb29rdXAgYW5kIGluZGV4IGZpbGUgaXRlcmF0aW9uIHdoaWNoIHdob3VsZCBiZSBwcmV0dHkgY29zdGx5Ci0gICAgICAgICAgICAvLyBlc3BlY2lhbGx5IGluIHByZXNlbmNlIG9mIHByb21vdGVkIGNvbHVtbiBpbmRleGVzCi0gICAgICAgICAgICBpZiAoaXNLZXlDYWNoZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBjYWNoZUtleShrZXksIHJvd0luZGV4RW50cnlTZXJpYWxpemVyLmRlc2VyaWFsaXplKGluKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUga2V5IHN0b3JlZCBhdCB0aGUgcG9zaXRpb24gc2F2ZWQgaW4gU0FTSS4KKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIFNBU0kgaXMgY3JlYXRlZCwgaXQgdXNlcyBrZXkgbG9jYXRpb25zIHJldHJpZXZlZCBmcm9tIHtAbGluayBLZXlSZWFkZXIja2V5UG9zaXRpb25Gb3JTZWNvbmRhcnlJbmRleCgpfS4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB0byByZWFkIHRoZSBrZXkgc3RvcmVkIGF0IHN1Y2ggcG9zaXRpb24uIEl0IGlzIHVwIHRvIHRoZSBjb25jcmV0ZSBTU1RhYmxlIGZvcm1hdCBpbXBsZW1lbnRhdGlvbgorICAgICAqIHdoYXQgdGhhdCBwb3NpdGlvbiBtZWFucyBhbmQgd2hpY2ggZmlsZSBpdCByZWZlcnMuIFRoZSBvbmx5IHJlcXVpcmVtZW50IGlzIHRoYXQgaXQgaXMgY29uc2lzdGVudCB3aXRoIHdoYXQKKyAgICAgKiB7QGxpbmsgS2V5UmVhZGVyI2tleVBvc2l0aW9uRm9yU2Vjb25kYXJ5SW5kZXgoKX0gcmV0dXJucy4KKyAgICAgKgorICAgICAqIEByZXR1cm4ga2V5IGlmIGZvdW5kLCB7QGNvZGUgbnVsbH0gb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IERlY29yYXRlZEtleSBrZXlBdFBvc2l0aW9uRnJvbVNlY29uZGFyeUluZGV4KGxvbmcga2V5UG9zaXRpb25Gcm9tU2Vjb25kYXJ5SW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIHB1YmxpYyBib29sZWFuIGlzUGVuZGluZ1JlcGFpcigpCiAgICAgewpAQCAtMTY5NCw1NSArMTA2MiwyOSBAQAogCiAgICAgICAgIGZpbmFsIHN0YXRpYyBjbGFzcyBFcXVhbHMgZXh0ZW5kcyBPcGVyYXRvcgogICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGFwcGx5KGludCBjb21wYXJpc29uKSB7IHJldHVybiAtY29tcGFyaXNvbjsgfQorICAgICAgICAgICAgcHVibGljIGludCBhcHBseShpbnQgY29tcGFyaXNvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLWNvbXBhcmlzb247CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBmaW5hbCBzdGF0aWMgY2xhc3MgR3JlYXRlclRoYW5PckVxdWFsVG8gZXh0ZW5kcyBPcGVyYXRvcgogICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGFwcGx5KGludCBjb21wYXJpc29uKSB7IHJldHVybiBjb21wYXJpc29uID49IDAgPyAwIDogMTsgfQorICAgICAgICAgICAgcHVibGljIGludCBhcHBseShpbnQgY29tcGFyaXNvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyaXNvbiA+PSAwID8gMCA6IDE7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBmaW5hbCBzdGF0aWMgY2xhc3MgR3JlYXRlclRoYW4gZXh0ZW5kcyBPcGVyYXRvcgogICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGFwcGx5KGludCBjb21wYXJpc29uKSB7IHJldHVybiBjb21wYXJpc29uID4gMCA/IDAgOiAxOyB9CisgICAgICAgICAgICBwdWJsaWMgaW50IGFwcGx5KGludCBjb21wYXJpc29uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJpc29uID4gMCA/IDAgOiAxOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIGxvbmcgZ2V0Qmxvb21GaWx0ZXJGYWxzZVBvc2l0aXZlQ291bnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJsb29tRmlsdGVyVHJhY2tlci5nZXRGYWxzZVBvc2l0aXZlQ291bnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRSZWNlbnRCbG9vbUZpbHRlckZhbHNlUG9zaXRpdmVDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gYmxvb21GaWx0ZXJUcmFja2VyLmdldFJlY2VudEZhbHNlUG9zaXRpdmVDb3VudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldEJsb29tRmlsdGVyVHJ1ZVBvc2l0aXZlQ291bnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJsb29tRmlsdGVyVHJhY2tlci5nZXRUcnVlUG9zaXRpdmVDb3VudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldFJlY2VudEJsb29tRmlsdGVyVHJ1ZVBvc2l0aXZlQ291bnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJsb29tRmlsdGVyVHJhY2tlci5nZXRSZWNlbnRUcnVlUG9zaXRpdmVDb3VudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldEJsb29tRmlsdGVyVHJ1ZU5lZ2F0aXZlQ291bnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJsb29tRmlsdGVyVHJhY2tlci5nZXRUcnVlTmVnYXRpdmVDb3VudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldFJlY2VudEJsb29tRmlsdGVyVHJ1ZU5lZ2F0aXZlQ291bnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJsb29tRmlsdGVyVHJhY2tlci5nZXRSZWNlbnRUcnVlTmVnYXRpdmVDb3VudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnN0cnVtZW50aW5nQ2FjaGU8S2V5Q2FjaGVLZXksIFJvd0luZGV4RW50cnk+IGdldEtleUNhY2hlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBrZXlDYWNoZTsKLSAgICB9Ci0KICAgICBwdWJsaWMgRXN0aW1hdGVkSGlzdG9ncmFtIGdldEVzdGltYXRlZFBhcnRpdGlvblNpemUoKQogICAgIHsKICAgICAgICAgcmV0dXJuIHNzdGFibGVNZXRhZGF0YS5lc3RpbWF0ZWRQYXJ0aXRpb25TaXplOwpAQCAtMTgyNSw4ICsxMTY3LDggQEAKICAgICBwdWJsaWMgaW50IGdldEF2Z0NvbHVtblNldFBlclJvdygpCiAgICAgewogICAgICAgICByZXR1cm4gc3N0YWJsZU1ldGFkYXRhLnRvdGFsUm93cyA8IDAKLSAgICAgICAgICAgICA/IC0xCi0gICAgICAgICAgICAgOiAoc3N0YWJsZU1ldGFkYXRhLnRvdGFsUm93cyA9PSAwID8gMCA6IChpbnQpKHNzdGFibGVNZXRhZGF0YS50b3RhbENvbHVtbnNTZXQgLyBzc3RhYmxlTWV0YWRhdGEudG90YWxSb3dzKSk7CisgICAgICAgICAgICAgICA/IC0xCisgICAgICAgICAgICAgICA6IChzc3RhYmxlTWV0YWRhdGEudG90YWxSb3dzID09IDAgPyAwIDogKGludCkgKHNzdGFibGVNZXRhZGF0YS50b3RhbENvbHVtbnNTZXQgLyBzc3RhYmxlTWV0YWRhdGEudG90YWxSb3dzKSk7CiAgICAgfQogCiAgICAgcHVibGljIGludCBnZXRTU1RhYmxlTGV2ZWwoKQpAQCAtMTg2MCwxNiArMTIwMiwxNiBAQAogCiAgICAgLyoqCiAgICAgICogUmVsb2FkcyB0aGUgc3N0YWJsZSBtZXRhZGF0YSBmcm9tIGRpc2suCi0gICAgICoKKyAgICAgKiA8cD4KICAgICAgKiBDYWxsZWQgYWZ0ZXIgbGV2ZWwgaXMgY2hhbmdlZCBvbiBzc3RhYmxlLCBmb3IgZXhhbXBsZSBpZiB0aGUgc3N0YWJsZSBpcyBkcm9wcGVkIHRvIEwwCi0gICAgICoKKyAgICAgKiA8cD4KICAgICAgKiBNaWdodCBiZSBwb3NzaWJsZSB0byByZW1vdmUgaW4gZnV0dXJlIHZlcnNpb25zCiAgICAgICoKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVsb2FkU1NUYWJsZU1ldGFkYXRhKCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICB0aGlzLnNzdGFibGVNZXRhZGF0YSA9IChTdGF0c01ldGFkYXRhKSBkZXNjcmlwdG9yLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLmRlc2VyaWFsaXplKGRlc2NyaXB0b3IsIE1ldGFkYXRhVHlwZS5TVEFUUyk7CisgICAgICAgIHRoaXMuc3N0YWJsZU1ldGFkYXRhID0gU3RhdHNDb21wb25lbnQubG9hZChkZXNjcmlwdG9yKS5zdGF0c01ldGFkYXRhKCk7CiAgICAgfQogCiAgICAgcHVibGljIFN0YXRzTWV0YWRhdGEgZ2V0U1NUYWJsZU1ldGFkYXRhKCkKQEAgLTE4ODgsMTEgKzEyMzAsMTAgQEAKICAgICAgICAgcmV0dXJuIGRmaWxlLmNyZWF0ZVJlYWRlcigpOwogICAgIH0KIAotICAgIHB1YmxpYyBSYW5kb21BY2Nlc3NSZWFkZXIgb3BlbkluZGV4UmVhZGVyKCkKKyAgICBwdWJsaWMgdm9pZCB0cnlTa2lwRmlsZUNhY2hlQmVmb3JlKERlY29yYXRlZEtleSBrZXkpCiAgICAgewotICAgICAgICBpZiAoaWZpbGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBpZmlsZS5jcmVhdGVSZWFkZXIoKTsKLSAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGxvbmcgcG9zaXRpb24gPSBnZXRQb3NpdGlvbihrZXksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuR0UpOworICAgICAgICBOYXRpdmVMaWJyYXJ5LnRyeVNraXBDYWNoZShkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKS5hYnNvbHV0ZVBhdGgoKSwgMCwgcG9zaXRpb24gPCAwID8gMCA6IHBvc2l0aW9uKTsKICAgICB9CiAKICAgICBwdWJsaWMgQ2hhbm5lbFByb3h5IGdldERhdGFDaGFubmVsKCkKQEAgLTE5MDAsMzkgKzEyNDEsMTIgQEAKICAgICAgICAgcmV0dXJuIGRmaWxlLmNoYW5uZWw7CiAgICAgfQogCi0gICAgcHVibGljIENoYW5uZWxQcm94eSBnZXRJbmRleENoYW5uZWwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlmaWxlLmNoYW5uZWw7Ci0gICAgfQotCi0gICAgcHVibGljIEZpbGVIYW5kbGUgZ2V0SW5kZXhGaWxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpZmlsZTsKLSAgICB9Ci0KICAgICAvKioKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50IGNvbXBvbmVudCB0byBnZXQgdGltZXN0YW1wLgotICAgICAqIEByZXR1cm4gbGFzdCBtb2RpZmllZCB0aW1lIGZvciBnaXZlbiBjb21wb25lbnQuIDAgaWYgZ2l2ZW4gY29tcG9uZW50IGRvZXMgbm90IGV4aXN0IG9yIElPIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAcmV0dXJuIGxhc3QgbW9kaWZpZWQgdGltZSBmb3IgZGF0YSBjb21wb25lbnQuIDAgaWYgZ2l2ZW4gY29tcG9uZW50IGRvZXMgbm90IGV4aXN0IG9yIElPIGVycm9yIG9jY3Vycy4KICAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRDcmVhdGlvblRpbWVGb3IoQ29tcG9uZW50IGNvbXBvbmVudCkKKyAgICBwdWJsaWMgbG9uZyBnZXREYXRhQ3JlYXRpb25UaW1lKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZShkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKGNvbXBvbmVudCkpLmxhc3RNb2RpZmllZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGtleSBjYWNoZSBoaXQKLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRLZXlDYWNoZUhpdCgpCi0gICAgewotICAgICAgICByZXR1cm4ga2V5Q2FjaGVIaXQuZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBOdW1iZXIgb2Yga2V5IGNhY2hlIHJlcXVlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRLZXlDYWNoZVJlcXVlc3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGtleUNhY2hlUmVxdWVzdC5nZXQoKTsKKyAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpLmxhc3RNb2RpZmllZCgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTk2Nyw5ICsxMjgxLDE2IEBACiAgICAgICAgIHJldHVybiBzZWxmUmVmLnJlZigpOwogICAgIH0KIAotICAgIHZvaWQgc2V0dXAoYm9vbGVhbiB0cmFja0hvdG5lc3MpCisgICAgcHJvdGVjdGVkIExpc3Q8QXV0b0Nsb3NlYWJsZT4gc2V0dXBJbnN0YW5jZShib29sZWFuIHRyYWNrSG90bmVzcykKICAgICB7Ci0gICAgICAgIHRpZHkuc2V0dXAodGhpcywgVFJBQ0tfQUNUSVZJVFkgJiYgdHJhY2tIb3RuZXNzKTsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZGZpbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldHVwKGJvb2xlYW4gdHJhY2tIb3RuZXNzKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHRpZHkuY2xvc2VhYmxlcyA9PSBudWxsOworICAgICAgICB0cmFja0hvdG5lc3MgJj0gVFJBQ0tfQUNUSVZJVFk7CisgICAgICAgIHRpZHkuc2V0dXAodGhpcywgdHJhY2tIb3RuZXNzLCBzZXR1cEluc3RhbmNlKHRyYWNrSG90bmVzcykpOwogICAgICAgICB0aGlzLnJlYWRNZXRlciA9IHRpZHkuZ2xvYmFsLnJlYWRNZXRlcjsKICAgICB9CiAKQEAgLTE5ODMsMzkgKzEzMDQsMzUgQEAKICAgICB7CiAgICAgICAgIGlkZW50aXRpZXMuYWRkKHRoaXMpOwogICAgICAgICBpZGVudGl0aWVzLmFkZCh0aWR5Lmdsb2JhbFJlZik7Ci0gICAgICAgIGRmaWxlLmFkZFRvKGlkZW50aXRpZXMpOwotICAgICAgICBpZmlsZS5hZGRUbyhpZGVudGl0aWVzKTsKLSAgICAgICAgYmYuYWRkVG8oaWRlbnRpdGllcyk7Ci0gICAgICAgIGluZGV4U3VtbWFyeS5hZGRUbyhpZGVudGl0aWVzKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG1heWJlUHJlc2VudChEZWNvcmF0ZWRLZXkga2V5KQotICAgIHsKLSAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBibG9vbSBmaWx0ZXIoYmZfZnBfY2hhbmNlPTEuMCBvciBmaWx0ZXIgZmlsZSBpcyBtaXNzaW5nKSwKLSAgICAgICAgLy8gd2UgY2hlY2sgaW5kZXggZmlsZSBpbnN0ZWFkLgotICAgICAgICByZXR1cm4gYmYgaW5zdGFuY2VvZiBBbHdheXNQcmVzZW50RmlsdGVyICYmIGdldFBvc2l0aW9uKGtleSwgT3BlcmF0b3IuRVEsIGZhbHNlKSAhPSBudWxsIHx8IGJmLmlzUHJlc2VudChrZXkpOworICAgICAgICB0aWR5LmNsb3NlYWJsZXMuZm9yRWFjaChjIC0+IHsKKyAgICAgICAgICAgIGlmIChjIGluc3RhbmNlb2YgU2hhcmVkQ2xvc2VhYmxlKQorICAgICAgICAgICAgICAgICgoU2hhcmVkQ2xvc2VhYmxlKSBjKS5hZGRUbyhpZGVudGl0aWVzKTsKKyAgICAgICAgfSk7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogVGhlIG1ldGhvZCB2ZXJpZmllcyB3aGV0aGVyIHRoZSBzc3RhYmxlIG1heSBjb250YWluIHRoZSBwcm92aWRlZCBrZXkuIFRoZSBtZXRob2QgZG9lcyBhcHByb3hpbWF0aW9uIHVzaW5nCisgICAgICogQmxvb20gZmlsdGVyIGlmIGl0IGlzIHByZXNlbnQgYW5kIGlmIGl0IGlzIG5vdCwgcGVyZm9ybXMgYWNjdXJhdGUgY2hlY2sgaW4gdGhlIGluZGV4LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG1heUNvbnRhaW5Bc3N1bWluZ0tleUlzSW5SYW5nZShEZWNvcmF0ZWRLZXkga2V5KTsKKworICAgIC8qKgogICAgICAqIE9uZSBpbnN0YW5jZSBwZXIgU1NUYWJsZVJlYWRlciB3ZSBjcmVhdGUuCi0gICAgICoKKyAgICAgKiA8cD4KICAgICAgKiBXZSBjYW4gY3JlYXRlIG1hbnkgSW5zdGFuY2VUaWRpZXJzIChvbmUgZm9yIGV2ZXJ5IHRpbWUgd2UgcmVvcGVuIGFuIHNzdGFibGUgd2l0aCBNT1ZFRF9TVEFSVCBmb3IgZXhhbXBsZSksCiAgICAgICogYnV0IHRoZXJlIGNhbiBvbmx5IGJlIG9uZSBHbG9iYWxUaWR5IGZvciBvbmUgc2luZ2xlIGxvZ2ljYWwgc3N0YWJsZS4KLSAgICAgKgorICAgICAqIDxwPgogICAgICAqIFdoZW4gdGhlIEluc3RhbmNlVGlkaWVyIGNsZWFuc3VwLCBpdCByZWxlYXNlcyBpdHMgcmVmZXJlbmNlIHRvIGl0cyBHbG9iYWxUaWR5OyB3aGVuIGFsbCBJbnN0YW5jZVRpZGllcnMKICAgICAgKiBmb3IgdGhhdCB0eXBlIGhhdmUgcnVuLCB0aGUgR2xvYmFsVGlkeSBjbGVhbnMgdXAuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgSW5zdGFuY2VUaWRpZXIgaW1wbGVtZW50cyBUaWR5CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBJbnN0YW5jZVRpZGllciBpbXBsZW1lbnRzIFRpZHkKICAgICB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotICAgICAgICBwcml2YXRlIGZpbmFsIFRhYmxlSWQgdGFibGVJZDsKLSAgICAgICAgcHJpdmF0ZSBJRmlsdGVyIGJmOwotICAgICAgICBwcml2YXRlIEluZGV4U3VtbWFyeSBzdW1tYXJ5OworICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8T3duZXI+IG93bmVyOwogCi0gICAgICAgIHByaXZhdGUgRmlsZUhhbmRsZSBkZmlsZTsKLSAgICAgICAgcHJpdmF0ZSBGaWxlSGFuZGxlIGlmaWxlOworICAgICAgICBwcml2YXRlIExpc3Q8PyBleHRlbmRzIEF1dG9DbG9zZWFibGU+IGNsb3NlYWJsZXM7CiAgICAgICAgIHByaXZhdGUgUnVubmFibGUgcnVuT25DbG9zZTsKKwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNSZXBsYWNlZCA9IGZhbHNlOwogCiAgICAgICAgIC8vIGEgcmVmZXJlbmNlIHRvIG91ciBzaGFyZWQgdGlkeSBpbnN0YW5jZSwgdGhhdApAQCAtMjAyNSwyNiArMTM0MiwyNSBAQAogCiAgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBzZXR1cDsKIAotICAgICAgICB2b2lkIHNldHVwKFNTVGFibGVSZWFkZXIgcmVhZGVyLCBib29sZWFuIHRyYWNrSG90bmVzcykKKyAgICAgICAgcHVibGljIHZvaWQgc2V0dXAoU1NUYWJsZVJlYWRlciByZWFkZXIsIGJvb2xlYW4gdHJhY2tIb3RuZXNzLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBdXRvQ2xvc2VhYmxlPiBjbG9zZWFibGVzKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnNldHVwID0gdHJ1ZTsKLSAgICAgICAgICAgIHRoaXMuYmYgPSByZWFkZXIuYmY7Ci0gICAgICAgICAgICB0aGlzLnN1bW1hcnkgPSByZWFkZXIuaW5kZXhTdW1tYXJ5OwotICAgICAgICAgICAgdGhpcy5kZmlsZSA9IHJlYWRlci5kZmlsZTsKLSAgICAgICAgICAgIHRoaXMuaWZpbGUgPSByZWFkZXIuaWZpbGU7CiAgICAgICAgICAgICAvLyBnZXQgYSBuZXcgcmVmZXJlbmNlIHRvIHRoZSBzaGFyZWQgZGVzY3JpcHRvci10eXBlIHRpZHkKICAgICAgICAgICAgIHRoaXMuZ2xvYmFsUmVmID0gR2xvYmFsVGlkeS5nZXQocmVhZGVyKTsKICAgICAgICAgICAgIHRoaXMuZ2xvYmFsID0gZ2xvYmFsUmVmLmdldCgpOwogICAgICAgICAgICAgaWYgKHRyYWNrSG90bmVzcykKICAgICAgICAgICAgICAgICBnbG9iYWwuZW5zdXJlUmVhZE1ldGVyKCk7CisgICAgICAgICAgICB0aGlzLmNsb3NlYWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oY2xvc2VhYmxlcyk7CisgICAgICAgICAgICAvLyB0byBhdm9pZCB0aWR5IHNlZWluZyBwYXJ0aWFsIHN0YXRlLCBzZXQgc2V0dXA9dHJ1ZSBhdCB0aGUgZW5kCisgICAgICAgICAgICB0aGlzLnNldHVwID0gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIEluc3RhbmNlVGlkaWVyKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgVGFibGVJZCB0YWJsZUlkKQorICAgICAgICBwcml2YXRlIEluc3RhbmNlVGlkaWVyKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgT3duZXIgb3duZXIpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICB0aGlzLnRhYmxlSWQgPSB0YWJsZUlkOworICAgICAgICAgICAgdGhpcy5vd25lciA9IG5ldyBXZWFrUmVmZXJlbmNlPD4ob3duZXIpOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHRpZHkoKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCkBAIC0yMDU0LDE1ICsxMzcwLDE3IEBACiAgICAgICAgICAgICBpZiAoIXNldHVwKQogICAgICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICAgICAgZmluYWwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gU2NoZW1hLmluc3RhbmNlLmdldENvbHVtbkZhbWlseVN0b3JlSW5zdGFuY2UodGFibGVJZCk7CiAgICAgICAgICAgICBmaW5hbCBPcE9yZGVyLkJhcnJpZXIgYmFycmllcjsKLSAgICAgICAgICAgIGlmIChjZnMgIT0gbnVsbCkKKyAgICAgICAgICAgIE93bmVyIG93bmVyID0gdGhpcy5vd25lci5nZXQoKTsKKyAgICAgICAgICAgIGlmIChvd25lciAhPSBudWxsKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJhcnJpZXIgPSBjZnMucmVhZE9yZGVyaW5nLm5ld0JhcnJpZXIoKTsKKyAgICAgICAgICAgICAgICBiYXJyaWVyID0gb3duZXIubmV3UmVhZE9yZGVyaW5nQmFycmllcigpOwogICAgICAgICAgICAgICAgIGJhcnJpZXIuaXNzdWUoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBiYXJyaWVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgU2NoZWR1bGVkRXhlY3V0b3JzLm5vblBlcmlvZGljVGFza3MuZXhlY3V0ZShuZXcgUnVubmFibGUoKQogICAgICAgICAgICAgewpAQCAtMjA3NywxNyArMTM5NSwzNiBAQAogICAgICAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIkFzeW5jIGluc3RhbmNlIHRpZGllciBmb3Ige30sIGFmdGVyIGJhcnJpZXIiLCBkZXNjcmlwdG9yKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoYmYgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJmLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdW1tYXJ5ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChydW5PbkNsb3NlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSBleGNlcHRpb25zID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bk9uQ2xvc2UgIT0gbnVsbCkgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bk9uQ2xvc2UucnVuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZmlsZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgZGZpbGUuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlmaWxlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBpZmlsZS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICBnbG9iYWxSZWYucmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHwgRXJyb3IgZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiRmFpbGVkIHRvIHJ1biBvbi1jbG9zZSBsaXN0ZW5lcnMgZm9yIHNzdGFibGUgIiArIGRlc2NyaXB0b3IuYmFzZUZpbGUoKSwgZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9ucyA9IGV4OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIGNsb3NlRXhjZXB0aW9ucyA9IFRocm93YWJsZXMuY2xvc2UobnVsbCwgSXRlcmFibGVzLmZpbHRlcihjbG9zZWFibGVzLCBPYmplY3RzOjpub25OdWxsKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbG9zZUV4Y2VwdGlvbnMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJGYWlsZWQgdG8gY2xvc2Ugc29tZSBzc3RhYmxlIGNvbXBvbmVudHMgb2YgIiArIGRlc2NyaXB0b3IuYmFzZUZpbGUoKSwgY2xvc2VFeGNlcHRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnMgPSBUaHJvd2FibGVzLm1lcmdlKGV4Y2VwdGlvbnMsIGNsb3NlRXhjZXB0aW9ucyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsUmVmLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB8IEVycm9yIGV4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkZhaWxlZCB0byByZWxlYXNlIHRoZSBnbG9iYWwgcmVmIG9mICIgKyBkZXNjcmlwdG9yLmJhc2VGaWxlKCksIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnMgPSBUaHJvd2FibGVzLm1lcmdlKGV4Y2VwdGlvbnMsIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb25zICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBKVk1TdGFiaWxpdHlJbnNwZWN0b3IuaW5zcGVjdFRocm93YWJsZShleGNlcHRpb25zKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIkFzeW5jIGluc3RhbmNlIHRpZGllciBmb3Ige30sIGNvbXBsZXRlZCIsIGRlc2NyaXB0b3IpOwpAQCAtMjEwMSwyMyArMTQzOCwxNyBAQAogICAgICAgICAgICAgfSk7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZyBuYW1lKCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IudG9TdHJpbmcoKTsKICAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcmVsZWFzZVN1bW1hcnkoKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdW1tYXJ5LmNsb3NlKCk7Ci0gICAgICAgICAgICBhc3NlcnQgc3VtbWFyeS5pc0NsZWFuZWRVcCgpOwotICAgICAgICAgICAgc3VtbWFyeSA9IG51bGw7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICAvKioKICAgICAgKiBPbmUgaW5zdGFuY2UgcGVyIGxvZ2ljYWwgc3N0YWJsZS4gVGhpcyBib3RoIHRyYWNrcyBzaGFyZWQgY2xlYW51cCBhbmQgc29tZSBzaGFyZWQgc3RhdGUgcmVsYXRlZAogICAgICAqIHRvIHRoZSBzc3RhYmxlJ3MgbGlmZWN5Y2xlLgotICAgICAqCisgICAgICogPHA+CiAgICAgICogQWxsIEluc3RhbmNlVGlkaWVycywgb24gc2V0dXAoKSwgYXNrIHRoZSBzdGF0aWMgZ2V0KCkgbWV0aG9kIGZvciB0aGVpciBzaGFyZWQgc3RhdGUsCiAgICAgICogYW5kIHN0YXNoIGEgcmVmZXJlbmNlIHRvIGl0IHRvIGJlIHJlbGVhc2VkIHdoZW4gdGhleSBhcmUuIE9uY2UgYWxsIHN1Y2ggcmVmZXJlbmNlcyBhcmUKICAgICAgKiByZWxlYXNlZCwgdGhpcyBzaGFyZWQgdGlkeSB3aWxsIGJlIHBlcmZvcm1lZC4KQEAgLTIxNjAsMTcgKzE0OTEsMTYgQEAKIAogICAgICAgICAgICAgcmVhZE1ldGVyID0gU3lzdGVtS2V5c3BhY2UuZ2V0U1NUYWJsZVJlYWRNZXRlcihkZXNjLmtzbmFtZSwgZGVzYy5jZm5hbWUsIGRlc2MuaWQpOwogICAgICAgICAgICAgLy8gc3luYyB0aGUgYXZlcmFnZSByZWFkIHJhdGUgdG8gc3lzdGVtLnNzdGFibGVfYWN0aXZpdHkgZXZlcnkgZml2ZSBtaW51dGVzLCBzdGFydGluZyBvbmUgbWludXRlIGZyb20gbm93Ci0gICAgICAgICAgICByZWFkTWV0ZXJTeW5jRnV0dXJlID0gbmV3IFdlYWtSZWZlcmVuY2U8PihzeW5jRXhlY3V0b3Iuc2NoZWR1bGVBdEZpeGVkUmF0ZShuZXcgUnVubmFibGUoKQorICAgICAgICAgICAgcmVhZE1ldGVyU3luY0Z1dHVyZSA9IG5ldyBXZWFrUmVmZXJlbmNlPD4oc3luY0V4ZWN1dG9yLnNjaGVkdWxlQXRGaXhlZFJhdGUodGhpczo6bWF5YmVQZXJzaXN0U1NUYWJsZVJlYWRNZXRlciwgMSwgNSwgVGltZVVuaXQuTUlOVVRFUykpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBtYXliZVBlcnNpc3RTU1RhYmxlUmVhZE1ldGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG9ic29sZXRpb24gPT0gbnVsbCAmJiBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U1N0YWJsZVJlYWRSYXRlUGVyc2lzdGVuY2VFbmFibGVkKCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYnNvbGV0aW9uID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGVyU3luY1Rocm90dGxlLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbUtleXNwYWNlLnBlcnNpc3RTU1RhYmxlUmVhZE1ldGVyKGRlc2Mua3NuYW1lLCBkZXNjLmNmbmFtZSwgZGVzYy5pZCwgcmVhZE1ldGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sIDEsIDUsIFRpbWVVbml0Lk1JTlVURVMpKTsKKyAgICAgICAgICAgICAgICBtZXRlclN5bmNUaHJvdHRsZS5hY3F1aXJlKCk7CisgICAgICAgICAgICAgICAgU3lzdGVtS2V5c3BhY2UucGVyc2lzdFNTVGFibGVSZWFkTWV0ZXIoZGVzYy5rc25hbWUsIGRlc2MuY2ZuYW1lLCBkZXNjLmlkLCByZWFkTWV0ZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIHN0b3BSZWFkTWV0ZXJQZXJzaXN0ZW5jZSgpCkBAIC0yMTkxLDggKzE1MjEsOCBAQAogICAgICAgICAgICAgICAgIG9ic29sZXRpb24ucnVuKCk7CiAKICAgICAgICAgICAgIC8vIGRvbid0IGlkZWFsbHkgd2FudCB0byBkcm9wUGFnZUNhY2hlIGZvciB0aGUgZmlsZSB1bnRpbCBhbGwgaW5zdGFuY2VzIGhhdmUgYmVlbiByZWxlYXNlZAotICAgICAgICAgICAgTmF0aXZlTGlicmFyeS50cnlTa2lwQ2FjaGUoZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSksIDAsIDApOwotICAgICAgICAgICAgTmF0aXZlTGlicmFyeS50cnlTa2lwQ2FjaGUoZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuUFJJTUFSWV9JTkRFWCksIDAsIDApOworICAgICAgICAgICAgZm9yIChDb21wb25lbnQgYyA6IGRlc2MuZGlzY292ZXJDb21wb25lbnRzKCkpCisgICAgICAgICAgICAgICAgTmF0aXZlTGlicmFyeS50cnlTa2lwQ2FjaGUoZGVzYy5maWxlRm9yKGMpLmFic29sdXRlUGF0aCgpLCAwLCAwKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpCkBAIC0yMjM1LDExICsxNTY1LDYgQEAKICAgICAgICAgR2xvYmFsVGlkeS5sb29rdXAuY2xlYXIoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBTU1RhYmxlUmVhZGVyIG9wZW4oU1NUYWJsZVJlYWRlckJ1aWxkZXIgYnVpbGRlcik7Ci0gICAgfQotCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJ0aXRpb25Qb3NpdGlvbkJvdW5kcwogICAgIHsKICAgICAgICAgcHVibGljIGZpbmFsIGxvbmcgbG93ZXJQb3NpdGlvbjsKQEAgLTIyNTUsMTUgKzE1ODAsMTUgQEAKICAgICAgICAgcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGludCBoYXNoQ29kZSA9IChpbnQpIGxvd2VyUG9zaXRpb24gXiAoaW50KSAobG93ZXJQb3NpdGlvbiA+Pj4gMzIpOwotICAgICAgICAgICAgcmV0dXJuIDMxICogKGhhc2hDb2RlIF4gKGludCkgKChpbnQpIHVwcGVyUG9zaXRpb24gXiAgKHVwcGVyUG9zaXRpb24gPj4+IDMyKSkpOworICAgICAgICAgICAgcmV0dXJuIDMxICogKGhhc2hDb2RlIF4gKGludCkgKChpbnQpIHVwcGVyUG9zaXRpb24gXiAodXBwZXJQb3NpdGlvbiA+Pj4gMzIpKSk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZighKG8gaW5zdGFuY2VvZiBQYXJ0aXRpb25Qb3NpdGlvbkJvdW5kcykpCisgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgUGFydGl0aW9uUG9zaXRpb25Cb3VuZHMpKQogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIFBhcnRpdGlvblBvc2l0aW9uQm91bmRzIHRoYXQgPSAoUGFydGl0aW9uUG9zaXRpb25Cb3VuZHMpbzsKKyAgICAgICAgICAgIFBhcnRpdGlvblBvc2l0aW9uQm91bmRzIHRoYXQgPSAoUGFydGl0aW9uUG9zaXRpb25Cb3VuZHMpIG87CiAgICAgICAgICAgICByZXR1cm4gbG93ZXJQb3NpdGlvbiA9PSB0aGF0Lmxvd2VyUG9zaXRpb24gJiYgdXBwZXJQb3NpdGlvbiA9PSB0aGF0LnVwcGVyUG9zaXRpb247CiAgICAgICAgIH0KICAgICB9CkBAIC0yMjk3LDcgKzE2MjIsNyBAQAogCiAgICAgLyoqCiAgICAgICogTW92ZXMgdGhlIHNzdGFibGUgaW4gb2xkRGVzY3JpcHRvciB0byBhIG5ldyBwbGFjZSAod2l0aCBnZW5lcmF0aW9uIGV0YykgaW4gbmV3RGVzY3JpcHRvci4KLSAgICAgKgorICAgICAqIDxwPgogICAgICAqIEFsbCBjb21wb25lbnRzIGdpdmVuIHdpbGwgYmUgbW92ZWQvcmVuYW1lZAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZVJlYWRlciBtb3ZlQW5kT3BlblNTVGFibGUoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBEZXNjcmlwdG9yIG9sZERlc2NyaXB0b3IsIERlc2NyaXB0b3IgbmV3RGVzY3JpcHRvciwgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cywgYm9vbGVhbiBjb3B5RGF0YSkKQEAgLTIzMTUsOSArMTY0MCw5IEBACiAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobWVzc2FnZSk7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtZXNzYWdlKTsKICAgICAgICAgfQotICAgICAgICBpZiAobmV3IEZpbGUobmV3RGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpLmV4aXN0cygpKQorICAgICAgICBpZiAobmV3RGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuREFUQSkuZXhpc3RzKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KCJGaWxlICVzIGFscmVhZHkgZXhpc3RzLCBjYW4ndCBtb3ZlIHRoZSBmaWxlIHRoZXJlIiwgbmV3RGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpOworICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoIkZpbGUgJXMgYWxyZWFkeSBleGlzdHMsIGNhbid0IG1vdmUgdGhlIGZpbGUgdGhlcmUiLCBuZXdEZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKSk7CiAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobXNnKTsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1zZyk7CiAgICAgICAgIH0KQEAgLTIzMjcsMjQgKzE2NTIsMjQgQEAKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJIYXJkbGlua2luZyBuZXcgU1NUYWJsZSB7fSB0byB7fSIsIG9sZERlc2NyaXB0b3IsIG5ld0Rlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIFNTVGFibGVXcml0ZXIuaGFyZGxpbmsob2xkRGVzY3JpcHRvciwgbmV3RGVzY3JpcHRvciwgY29tcG9uZW50cyk7CisgICAgICAgICAgICAgICAgaGFyZGxpbmsob2xkRGVzY3JpcHRvciwgbmV3RGVzY3JpcHRvciwgY29tcG9uZW50cyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoRlNXcml0ZUVycm9yIGV4KQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJVbmFibGUgdG8gaGFyZGxpbmsgbmV3IFNTVGFibGUge30gdG8ge30sIGZhbGxpbmcgYmFjayB0byBjb3B5aW5nIiwgb2xkRGVzY3JpcHRvciwgbmV3RGVzY3JpcHRvciwgZXgpOwotICAgICAgICAgICAgICAgIFNTVGFibGVXcml0ZXIuY29weShvbGREZXNjcmlwdG9yLCBuZXdEZXNjcmlwdG9yLCBjb21wb25lbnRzKTsKKyAgICAgICAgICAgICAgICBjb3B5KG9sZERlc2NyaXB0b3IsIG5ld0Rlc2NyaXB0b3IsIGNvbXBvbmVudHMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICAgbG9nZ2VyLmluZm8oIk1vdmluZyBuZXcgU1NUYWJsZSB7fSB0byB7fSIsIG9sZERlc2NyaXB0b3IsIG5ld0Rlc2NyaXB0b3IpOwotICAgICAgICAgICAgU1NUYWJsZVdyaXRlci5yZW5hbWUob2xkRGVzY3JpcHRvciwgbmV3RGVzY3JpcHRvciwgY29tcG9uZW50cyk7CisgICAgICAgICAgICByZW5hbWUob2xkRGVzY3JpcHRvciwgbmV3RGVzY3JpcHRvciwgY29tcG9uZW50cyk7CiAgICAgICAgIH0KIAogICAgICAgICBTU1RhYmxlUmVhZGVyIHJlYWRlcjsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIHJlYWRlciA9IFNTVGFibGVSZWFkZXIub3BlbihuZXdEZXNjcmlwdG9yLCBjb21wb25lbnRzLCBjZnMubWV0YWRhdGEpOworICAgICAgICAgICAgcmVhZGVyID0gb3BlbihjZnMsIG5ld0Rlc2NyaXB0b3IsIGNvbXBvbmVudHMsIGNmcy5tZXRhZGF0YSk7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQogICAgICAgICB7CkBAIC0yMzYwLDQgKzE2ODUsMjE0IEBACiAgICAgICAgIEV4ZWN1dG9yVXRpbHMuc2h1dGRvd25Ob3dBbmRXYWl0KHRpbWVvdXQsIHVuaXQsIHN5bmNFeGVjdXRvcik7CiAgICAgICAgIHJlc2V0VGlkeWluZygpOwogICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHBoeXNpY2FsIHNpemUgb24gZGlzayBvZiBhbGwgY29tcG9uZW50cyBmb3IgdGhpcyBTU1RhYmxlIGluIGJ5dGVzCisgICAgICovCisgICAgcHVibGljIGxvbmcgYnl0ZXNPbkRpc2soKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJ5dGVzT25EaXNrKGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBsb2dpY2FsL3VuY29tcHJlc3NlZCBzaXplIGluIGJ5dGVzIG9mIGFsbCBjb21wb25lbnRzIGZvciB0aGlzIFNTVGFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBsb2dpY2FsQnl0ZXNPbkRpc2soKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJ5dGVzT25EaXNrKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgbG9uZyBieXRlc09uRGlzayhib29sZWFuIGxvZ2ljYWwpCisgICAgeworICAgICAgICBsb25nIGJ5dGVzID0gMDsKKyAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogY29tcG9uZW50cykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gT25seSB0aGUgZGF0YSBmaWxlIGlzIGNvbXByZXNzYWJsZS4KKyAgICAgICAgICAgIGJ5dGVzICs9IGxvZ2ljYWwgJiYgY29tcG9uZW50ID09IENvbXBvbmVudHMuREFUQSAmJiBjb21wcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgPyBnZXRDb21wcmVzc2lvbk1ldGFkYXRhKCkuZGF0YUxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgOiBkZXNjcmlwdG9yLmZpbGVGb3IoY29tcG9uZW50KS5sZW5ndGgoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnl0ZXM7CisgICAgfQorCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIHZvaWQgbWF5YmVQZXJzaXN0U1NUYWJsZVJlYWRNZXRlcigpCisgICAgeworICAgICAgICB0aWR5Lmdsb2JhbC5tYXliZVBlcnNpc3RTU1RhYmxlUmVhZE1ldGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyB2ZXJpZmllciBmb3IgdGhpcyBzc3RhYmxlLiBOb3RlIHRoYXQgdGhlIHJlYWRlciBtdXN0IG1hdGNoIHRoZSBwcm92aWRlZCBjZnMuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IElWZXJpZmllciBnZXRWZXJpZmllcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRIYW5kbGVyIG91dHB1dEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzT2ZmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElWZXJpZmllci5PcHRpb25zIG9wdGlvbnMpOworCisgICAgLyoqCisgICAgICogQSBtZXRob2QgdG8gYmUgY2FsbGVkIGJ5IHtAbGluayAjZ2V0UG9zaXRpb24oUGFydGl0aW9uUG9zaXRpb24sIE9wZXJhdG9yLCBib29sZWFuLCBTU1RhYmxlUmVhZHNMaXN0ZW5lcil9CisgICAgICogYW5kIHtAbGluayAjZ2V0Um93SW5kZXhFbnRyeShQYXJ0aXRpb25Qb3NpdGlvbiwgT3BlcmF0b3IsIGJvb2xlYW4sIFNTVGFibGVSZWFkc0xpc3RlbmVyKX0gbWV0aG9kcyB3aGVuCisgICAgICogYSBzZWFyY2hlZCBrZXkgaXMgZm91bmQuIEl0IGFkZHMgYSB0cmFjZSBtZXNzYWdlIGFuZCBub3RpZnkgdGhlIHByb3ZpZGVkIGxpc3RlbmVyLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeVNlbGVjdGVkKFNTVGFibGVSZWFkc0xpc3RlbmVyLlNlbGVjdGlvblJlYXNvbiByZWFzb24sIFNTVGFibGVSZWFkc0xpc3RlbmVyIGxvY2FsTGlzdGVuZXIsIE9wZXJhdG9yIG9wLCBib29sZWFuIHVwZGF0ZVN0YXRzLCBBYnN0cmFjdFJvd0luZGV4RW50cnkgZW50cnkpCisgICAgeworICAgICAgICByZWFzb24udHJhY2UoZGVzY3JpcHRvciwgZW50cnkpOworCisgICAgICAgIGlmIChsb2NhbExpc3RlbmVyICE9IG51bGwpCisgICAgICAgICAgICBsb2NhbExpc3RlbmVyLm9uU1NUYWJsZVNlbGVjdGVkKHRoaXMsIHJlYXNvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBtZXRob2QgdG8gYmUgY2FsbGVkIGJ5IHtAbGluayAjZ2V0UG9zaXRpb24oUGFydGl0aW9uUG9zaXRpb24sIE9wZXJhdG9yLCBib29sZWFuLCBTU1RhYmxlUmVhZHNMaXN0ZW5lcil9CisgICAgICogYW5kIHtAbGluayAjZ2V0Um93SW5kZXhFbnRyeShQYXJ0aXRpb25Qb3NpdGlvbiwgT3BlcmF0b3IsIGJvb2xlYW4sIFNTVGFibGVSZWFkc0xpc3RlbmVyKX0gbWV0aG9kcyB3aGVuCisgICAgICogYSBzZWFyY2hlZCBrZXkgaXMgbm90IGZvdW5kLiBJdCBhZGRzIGEgdHJhY2UgbWVzc2FnZSBhbmQgbm90aWZ5IHRoZSBwcm92aWRlZCBsaXN0ZW5lci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlTa2lwcGVkKFNTVGFibGVSZWFkc0xpc3RlbmVyLlNraXBwaW5nUmVhc29uIHJlYXNvbiwgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbG9jYWxMaXN0ZW5lciwgT3BlcmF0b3Igb3AsIGJvb2xlYW4gdXBkYXRlU3RhdHMpCisgICAgeworICAgICAgICByZWFzb24udHJhY2UoZGVzY3JpcHRvcik7CisKKyAgICAgICAgaWYgKGxvY2FsTGlzdGVuZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIGxvY2FsTGlzdGVuZXIub25TU1RhYmxlU2tpcHBlZCh0aGlzLCByZWFzb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgYnVpbGRlciBvZiB0aGlzIHNzdGFibGUgcmVhZGVyLiBJdCBzaG91bGQgYmUgZXh0ZW5kZWQgZm9yIGVhY2ggaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFNTVGFibGVSZWFkZXJ9IHdpdGgKKyAgICAgKiB0aGUgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgZmllbGRzLgorICAgICAqCisgICAgICogQHBhcmFtIDxSPiB0eXBlIG9mIHRoZSByZWFkZXIgdGhlIGJ1aWxkZXIgY3JlYXRlcworICAgICAqIEBwYXJhbSA8Qj4gdHlwZSBvZiB0aGlzIGJ1aWxkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEJ1aWxkZXI8UiBleHRlbmRzIFNTVGFibGVSZWFkZXIsIEIgZXh0ZW5kcyBCdWlsZGVyPFIsIEI+PiBleHRlbmRzIFNTVGFibGUuQnVpbGRlcjxSLCBCPgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBsb25nIG1heERhdGFBZ2U7CisgICAgICAgIHByaXZhdGUgU3RhdHNNZXRhZGF0YSBzdGF0c01ldGFkYXRhOworICAgICAgICBwcml2YXRlIE9wZW5SZWFzb24gb3BlblJlYXNvbjsKKyAgICAgICAgcHJpdmF0ZSBTZXJpYWxpemF0aW9uSGVhZGVyIHNlcmlhbGl6YXRpb25IZWFkZXI7CisgICAgICAgIHByaXZhdGUgRmlsZUhhbmRsZSBkYXRhRmlsZTsKKyAgICAgICAgcHJpdmF0ZSBEZWNvcmF0ZWRLZXkgZmlyc3Q7CisgICAgICAgIHByaXZhdGUgRGVjb3JhdGVkS2V5IGxhc3Q7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBzdXNwZWN0ZWQ7CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIoRGVzY3JpcHRvciBkZXNjcmlwdG9yKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihkZXNjcmlwdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCIHNldE1heERhdGFBZ2UobG9uZyBtYXhEYXRhQWdlKQorICAgICAgICB7CisgICAgICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQobWF4RGF0YUFnZSA+PSAwKTsKKyAgICAgICAgICAgIHRoaXMubWF4RGF0YUFnZSA9IG1heERhdGFBZ2U7CisgICAgICAgICAgICByZXR1cm4gKEIpIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQiBzZXRTdGF0c01ldGFkYXRhKFN0YXRzTWV0YWRhdGEgc3RhdHNNZXRhZGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwoc3RhdHNNZXRhZGF0YSk7CisgICAgICAgICAgICB0aGlzLnN0YXRzTWV0YWRhdGEgPSBzdGF0c01ldGFkYXRhOworICAgICAgICAgICAgcmV0dXJuIChCKSB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEIgc2V0T3BlblJlYXNvbihPcGVuUmVhc29uIG9wZW5SZWFzb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKG9wZW5SZWFzb24pOworICAgICAgICAgICAgdGhpcy5vcGVuUmVhc29uID0gb3BlblJlYXNvbjsKKyAgICAgICAgICAgIHJldHVybiAoQikgdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCIHNldFNlcmlhbGl6YXRpb25IZWFkZXIoU2VyaWFsaXphdGlvbkhlYWRlciBzZXJpYWxpemF0aW9uSGVhZGVyKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnNlcmlhbGl6YXRpb25IZWFkZXIgPSBzZXJpYWxpemF0aW9uSGVhZGVyOworICAgICAgICAgICAgcmV0dXJuIChCKSB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEIgc2V0RGF0YUZpbGUoRmlsZUhhbmRsZSBkYXRhRmlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5kYXRhRmlsZSA9IGRhdGFGaWxlOworICAgICAgICAgICAgcmV0dXJuIChCKSB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEIgc2V0Rmlyc3QoRGVjb3JhdGVkS2V5IGZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmZpcnN0ID0gZmlyc3QgIT0gbnVsbCA/IGZpcnN0LnJldGFpbmFibGUoKSA6IG51bGw7CisgICAgICAgICAgICByZXR1cm4gKEIpIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQiBzZXRMYXN0KERlY29yYXRlZEtleSBsYXN0KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmxhc3QgPSBsYXN0ICE9IG51bGwgPyBsYXN0LnJldGFpbmFibGUoKSA6IG51bGw7CisgICAgICAgICAgICByZXR1cm4gKEIpIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQiBzZXRTdXNwZWN0ZWQoYm9vbGVhbiBzdXNwZWN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuc3VzcGVjdGVkID0gc3VzcGVjdGVkOworICAgICAgICAgICAgcmV0dXJuIChCKSB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0TWF4RGF0YUFnZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtYXhEYXRhQWdlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0YXRzTWV0YWRhdGEgZ2V0U3RhdHNNZXRhZGF0YSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0c01ldGFkYXRhOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9wZW5SZWFzb24gZ2V0T3BlblJlYXNvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBvcGVuUmVhc29uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNlcmlhbGl6YXRpb25IZWFkZXIgZ2V0U2VyaWFsaXphdGlvbkhlYWRlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uSGVhZGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEZpbGVIYW5kbGUgZ2V0RGF0YUZpbGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGF0YUZpbGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRGVjb3JhdGVkS2V5IGdldEZpcnN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZpcnN0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIERlY29yYXRlZEtleSBnZXRMYXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGxhc3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1N1c3BlY3RlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdXNwZWN0ZWQ7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgUiBidWlsZEludGVybmFsKE93bmVyIG93bmVyKTsKKworICAgICAgICBwdWJsaWMgUiBidWlsZChPd25lciBvd25lciwgYm9vbGVhbiB2YWxpZGF0ZSwgYm9vbGVhbiBvbmxpbmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFIgcmVhZGVyID0gYnVpbGRJbnRlcm5hbChvd25lcik7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpc1N1c3BlY3RlZCgpKQorICAgICAgICAgICAgICAgICAgICByZWFkZXIubWFya1N1c3BlY3QoKTsKKworICAgICAgICAgICAgICAgIHJlYWRlci5zZXR1cChvbmxpbmUpOworCisgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlKQorICAgICAgICAgICAgICAgICAgICByZWFkZXIudmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHwgRXJyb3IgZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSlZNU3RhYmlsaXR5SW5zcGVjdG9yLmluc3BlY3RUaHJvd2FibGUoZXgpOworICAgICAgICAgICAgICAgIHJlYWRlci5zZWxmUmVmKCkucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcmVhZGVyOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU1NUYWJsZVJlYWRlckJ1aWxkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NTVGFibGVSZWFkZXJCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYTc0ZjAuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU1NUYWJsZVJlYWRlckJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuQ2h1bmtDYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd0luZGV4RW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5TdGF0c01ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuVmFsaWRhdGlvbk1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGlza09wdGltaXphdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSW5wdXRTdHJlYW1QbHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmFuZG9tQWNjZXNzUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhUmVmOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLio7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlci5PcGVuUmVhc29uLk5PUk1BTDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLmN1cnJlbnRUaW1lTWlsbGlzOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwubmFub1RpbWU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTU1RhYmxlUmVhZGVyQnVpbGRlcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTU1RhYmxlUmVhZGVyQnVpbGRlci5jbGFzcyk7Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgU1NUYWJsZVJlYWRlci5GYWN0b3J5IHJlYWRlckZhY3Rvcnk7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIERlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YVJlZjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgVGFibGVNZXRhZGF0YSBtZXRhZGF0YTsKLSAgICBwcm90ZWN0ZWQgZmluYWwgbG9uZyBtYXhEYXRhQWdlOwotICAgIHByb3RlY3RlZCBmaW5hbCBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzOwotICAgIHByb3RlY3RlZCBmaW5hbCBTdGF0c01ldGFkYXRhIHN0YXRzTWV0YWRhdGE7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIFNTVGFibGVSZWFkZXIuT3BlblJlYXNvbiBvcGVuUmVhc29uOwotICAgIHByb3RlY3RlZCBmaW5hbCBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlcjsKLQotICAgIHByb3RlY3RlZCBJbmRleFN1bW1hcnkgc3VtbWFyeTsKLSAgICBwcm90ZWN0ZWQgRGVjb3JhdGVkS2V5IGZpcnN0OwotICAgIHByb3RlY3RlZCBEZWNvcmF0ZWRLZXkgbGFzdDsKLSAgICBwcm90ZWN0ZWQgSUZpbHRlciBiZjsKLSAgICBwcm90ZWN0ZWQgRmlsZUhhbmRsZSBpZmlsZTsKLSAgICBwcm90ZWN0ZWQgRmlsZUhhbmRsZSBkZmlsZTsKLQotICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyQnVpbGRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGFSZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbWF4RGF0YUFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHNNZXRhZGF0YSBzdGF0c01ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyLk9wZW5SZWFzb24gb3BlblJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIpCi0gICAgewotICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgICAgICB0aGlzLm1ldGFkYXRhUmVmID0gbWV0YWRhdGFSZWY7Ci0gICAgICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YVJlZi5nZXQoKTsKLSAgICAgICAgdGhpcy5tYXhEYXRhQWdlID0gbWF4RGF0YUFnZTsKLSAgICAgICAgdGhpcy5jb21wb25lbnRzID0gY29tcG9uZW50czsKLSAgICAgICAgdGhpcy5zdGF0c01ldGFkYXRhID0gc3RhdHNNZXRhZGF0YTsKLSAgICAgICAgdGhpcy5vcGVuUmVhc29uID0gb3BlblJlYXNvbjsKLSAgICAgICAgdGhpcy5oZWFkZXIgPSBoZWFkZXI7Ci0gICAgICAgIHRoaXMucmVhZGVyRmFjdG9yeSA9IGRlc2NyaXB0b3IuZ2V0Rm9ybWF0KCkuZ2V0UmVhZGVyRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBTU1RhYmxlUmVhZGVyIGJ1aWxkKCk7Ci0KLSAgICBwdWJsaWMgU1NUYWJsZVJlYWRlckJ1aWxkZXIgZGZpbGUoRmlsZUhhbmRsZSBkZmlsZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuZGZpbGUgPSBkZmlsZTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFNTVGFibGVSZWFkZXJCdWlsZGVyIGlmaWxlKEZpbGVIYW5kbGUgaWZpbGUpCi0gICAgewotICAgICAgICB0aGlzLmlmaWxlID0gaWZpbGU7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyQnVpbGRlciBiZihJRmlsdGVyIGJmKQotICAgIHsKLSAgICAgICAgdGhpcy5iZiA9IGJmOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU1NUYWJsZVJlYWRlckJ1aWxkZXIgc3VtbWFyeShJbmRleFN1bW1hcnkgc3VtbWFyeSkKLSAgICB7Ci0gICAgICAgIHRoaXMuc3VtbWFyeSA9IHN1bW1hcnk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWQgaW5kZXggc3VtbWFyeSwgZmlyc3Qga2V5IGFuZCBsYXN0IGtleSBmcm9tIFN1bW1hcnkuZGIgZmlsZSBpZiBpdCBleGlzdHMuCi0gICAgICoKLSAgICAgKiBpZiBsb2FkZWQgaW5kZXggc3VtbWFyeSBoYXMgZGlmZmVyZW50IGluZGV4IGludGVydmFsIGZyb20gY3VycmVudCB2YWx1ZSBzdG9yZWQgaW4gc2NoZW1hLAotICAgICAqIHRoZW4gU3VtbWFyeS5kYiBmaWxlIHdpbGwgYmUgZGVsZXRlZCBhbmQgbmVlZCB0byBiZSByZWJ1aWx0LgotICAgICAqLwotICAgIHZvaWQgbG9hZFN1bW1hcnkoKQotICAgIHsKLSAgICAgICAgRmlsZSBzdW1tYXJpZXNGaWxlID0gbmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuU1VNTUFSWSkpOwotICAgICAgICBpZiAoIXN1bW1hcmllc0ZpbGUuZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIlNTVGFibGUgU3VtbWFyeSBGaWxlIHt9IGRvZXMgbm90IGV4aXN0Iiwgc3VtbWFyaWVzRmlsZS5hYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBEYXRhSW5wdXRTdHJlYW0gaVN0cmVhbSA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpU3RyZWFtID0gbmV3IERhdGFJbnB1dFN0cmVhbShGaWxlcy5uZXdJbnB1dFN0cmVhbShzdW1tYXJpZXNGaWxlLnRvUGF0aCgpKSk7Ci0gICAgICAgICAgICBzdW1tYXJ5ID0gSW5kZXhTdW1tYXJ5LnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaVN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5wYXJ0aXRpb25lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5wYXJhbXMubWF4SW5kZXhJbnRlcnZhbCk7Ci0gICAgICAgICAgICBmaXJzdCA9IG1ldGFkYXRhLnBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoTGVuZ3RoKGlTdHJlYW0pKTsKLSAgICAgICAgICAgIGxhc3QgPSBtZXRhZGF0YS5wYXJ0aXRpb25lci5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aExlbmd0aChpU3RyZWFtKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdW1tYXJ5ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc3VtbWFyeS5jbG9zZSgpOwotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJDYW5ub3QgZGVzZXJpYWxpemUgU1NUYWJsZSBTdW1tYXJ5IEZpbGUge306IHt9Iiwgc3VtbWFyaWVzRmlsZS5wYXRoKCksIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIC8vIGNvcnJ1cHRlZDsgZGVsZXRlIGl0IGFuZCBmYWxsIGJhY2sgdG8gY3JlYXRpbmcgYSBuZXcgc3VtbWFyeQotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlUXVpZXRseShpU3RyZWFtKTsKLSAgICAgICAgICAgIC8vIGRlbGV0ZSBpdCBhbmQgZmFsbCBiYWNrIHRvIGNyZWF0aW5nIGEgbmV3IHN1bW1hcnkKLSAgICAgICAgICAgIEZpbGVVdGlscy5kZWxldGVXaXRoQ29uZmlybShzdW1tYXJpZXNGaWxlKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZVF1aWV0bHkoaVN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZCBpbmRleCBzdW1tYXJ5LCBmaXJzdCBrZXksIGxhc3Qga2V5IGlmIHtAY29kZSBzdW1tYXJ5TG9hZGVkfSBpcyBmYWxzZSBhbmQgcmVjcmVhdGUgYmxvb20gZmlsdGVyIGlmCi0gICAgICoge0Bjb2RlIHJlY3JldGVCbG9vbUZpbHRlcn0gaXMgdHJ1ZSBieSByZWFkaW5nIHRocm91Z2ggSW5kZXguZGIgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZWNyZWF0ZUJsb29tRmlsdGVyIHRydWUgaWYgcmVjcmVhdGUgYmxvb20gZmlsdGVyCi0gICAgICogQHBhcmFtIHN1bW1hcnlMb2FkZWQgdHJ1ZSBpZiBpbmRleCBzdW1tYXJ5LCBmaXJzdCBrZXkgYW5kIGxhc3Qga2V5IGFyZSBhbHJlYWR5IGxvYWRlZCBhbmQgbm90IG5lZWQgdG8gYnVpbGQgYWdhaW4KLSAgICAgKi8KLSAgICB2b2lkIGJ1aWxkU3VtbWFyeUFuZEJsb29tRmlsdGVyKGJvb2xlYW4gcmVjcmVhdGVCbG9vbUZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VtbWFyeUxvYWRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0c01ldGFkYXRhIHN0YXRzTWV0YWRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKCFjb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudC5QUklNQVJZX0lOREVYKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoIkF0dGVtcHRpbmcgdG8gYnVpbGQgc3VtbWFyeSBmb3Ige30iLCBkZXNjcmlwdG9yKTsKLQotCi0gICAgICAgIC8vIHdlIHJlYWQgdGhlIHBvc2l0aW9ucyBpbiBhIEJSQUYgc28gd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBhbiBlbnRyeSBzcGFubmluZyBhIG1tYXAgYm91bmRhcnkuCi0gICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzUmVhZGVyIHByaW1hcnlJbmRleCA9IFJhbmRvbUFjY2Vzc1JlYWRlci5vcGVuKG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlBSSU1BUllfSU5ERVgpKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvbmcgaW5kZXhTaXplID0gcHJpbWFyeUluZGV4Lmxlbmd0aCgpOwotICAgICAgICAgICAgbG9uZyBoaXN0b2dyYW1Db3VudCA9IHN0YXRzTWV0YWRhdGEuZXN0aW1hdGVkUGFydGl0aW9uU2l6ZS5jb3VudCgpOwotICAgICAgICAgICAgbG9uZyBlc3RpbWF0ZWRLZXlzID0gaGlzdG9ncmFtQ291bnQgPiAwICYmICFzdGF0c01ldGFkYXRhLmVzdGltYXRlZFBhcnRpdGlvblNpemUuaXNPdmVyZmxvd2VkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaGlzdG9ncmFtQ291bnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU1NUYWJsZS5lc3RpbWF0ZVJvd3NGcm9tSW5kZXgocHJpbWFyeUluZGV4LCBkZXNjcmlwdG9yKTsgLy8gc3RhdGlzdGljcyBpcyBzdXBwb3NlZCB0byBiZSBvcHRpb25hbAotCi0gICAgICAgICAgICBpZiAocmVjcmVhdGVCbG9vbUZpbHRlcikKLSAgICAgICAgICAgICAgICBiZiA9IEZpbHRlckZhY3RvcnkuZ2V0RmlsdGVyKGVzdGltYXRlZEtleXMsIG1ldGFkYXRhLnBhcmFtcy5ibG9vbUZpbHRlckZwQ2hhbmNlKTsKLQotICAgICAgICAgICAgdHJ5IChJbmRleFN1bW1hcnlCdWlsZGVyIHN1bW1hcnlCdWlsZGVyID0gc3VtbWFyeUxvYWRlZCA/IG51bGwgOiBuZXcgSW5kZXhTdW1tYXJ5QnVpbGRlcihlc3RpbWF0ZWRLZXlzLCBtZXRhZGF0YS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbCwgRG93bnNhbXBsaW5nLkJBU0VfU0FNUExJTkdfTEVWRUwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvbmcgaW5kZXhQb3NpdGlvbjsKLQotICAgICAgICAgICAgICAgIHdoaWxlICgoaW5kZXhQb3NpdGlvbiA9IHByaW1hcnlJbmRleC5nZXRGaWxlUG9pbnRlcigpKSAhPSBpbmRleFNpemUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGtleSA9IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgocHJpbWFyeUluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgUm93SW5kZXhFbnRyeS5TZXJpYWxpemVyLnNraXAocHJpbWFyeUluZGV4LCBkZXNjcmlwdG9yLnZlcnNpb24pOwotICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgZGVjb3JhdGVkS2V5ID0gbWV0YWRhdGEucGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoa2V5KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIXN1bW1hcnlMb2FkZWQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZGVjb3JhdGVkS2V5OwotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGRlY29yYXRlZEtleTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZWNyZWF0ZUJsb29tRmlsdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgYmYuYWRkKGRlY29yYXRlZEtleSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgc3VtbWFyeSB3YXMgYWxyZWFkeSByZWFkIGZyb20gZGlzayB3ZSBkb24ndCB3YW50IHRvIHJlLXBvcHVsYXRlIGl0IHVzaW5nIHByaW1hcnkgaW5kZXgKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzdW1tYXJ5TG9hZGVkKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5QnVpbGRlci5tYXliZUFkZEVudHJ5KGRlY29yYXRlZEtleSwgaW5kZXhQb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXN1bW1hcnlMb2FkZWQpCi0gICAgICAgICAgICAgICAgICAgIHN1bW1hcnkgPSBzdW1tYXJ5QnVpbGRlci5idWlsZChtZXRhZGF0YS5wYXJ0aXRpb25lcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXN1bW1hcnlMb2FkZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpcnN0ID0gU1NUYWJsZS5nZXRNaW5pbWFsS2V5KGZpcnN0KTsKLSAgICAgICAgICAgIGxhc3QgPSBTU1RhYmxlLmdldE1pbmltYWxLZXkobGFzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkIGJsb29tIGZpbHRlciBmcm9tIEZpbHRlci5kYiBmaWxlLgotICAgICAqCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIElGaWx0ZXIgbG9hZEJsb29tRmlsdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkgKEZpbGVJbnB1dFN0cmVhbVBsdXMgc3RyZWFtID0gbmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuRklMVEVSKSkubmV3SW5wdXRTdHJlYW0oKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEJsb29tRmlsdGVyU2VyaWFsaXplci5kZXNlcmlhbGl6ZShzdHJlYW0sIGRlc2NyaXB0b3IudmVyc2lvbi5oYXNPbGRCZkZvcm1hdCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRm9yV3JpdGVyIGV4dGVuZHMgU1NUYWJsZVJlYWRlckJ1aWxkZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBGb3JXcml0ZXIoRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGFSZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBtYXhEYXRhQWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHNNZXRhZGF0YSBzdGF0c01ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIuT3BlblJlYXNvbiBvcGVuUmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihkZXNjcmlwdG9yLCBtZXRhZGF0YVJlZiwgbWF4RGF0YUFnZSwgY29tcG9uZW50cywgc3RhdHNNZXRhZGF0YSwgb3BlblJlYXNvbiwgaGVhZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU1NUYWJsZVJlYWRlciBidWlsZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgcmVhZGVyID0gcmVhZGVyRmFjdG9yeS5vcGVuKHRoaXMpOwotCi0gICAgICAgICAgICByZWFkZXIuc2V0dXAodHJ1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVhZGVyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb3JCYXRjaCBleHRlbmRzIFNTVGFibGVSZWFkZXJCdWlsZGVyCi0gICAgewotICAgICAgICBwdWJsaWMgRm9yQmF0Y2goRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YVJlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBTdGF0c01ldGFkYXRhIHN0YXRzTWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlcikKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoZGVzY3JpcHRvciwgbWV0YWRhdGFSZWYsIGN1cnJlbnRUaW1lTWlsbGlzKCksIGNvbXBvbmVudHMsIHN0YXRzTWV0YWRhdGEsIE5PUk1BTCwgaGVhZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU1NUYWJsZVJlYWRlciBidWlsZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBkYXRhRmlsZVBhdGggPSBkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKTsKLSAgICAgICAgICAgIGxvbmcgZmlsZUxlbmd0aCA9IG5ldyBGaWxlKGRhdGFGaWxlUGF0aCkubGVuZ3RoKCk7Ci0gICAgICAgICAgICBsb2dnZXIuaW5mbygiT3BlbmluZyB7fSAoe30pIiwgZGVzY3JpcHRvciwgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoZmlsZUxlbmd0aCkpOwotCi0gICAgICAgICAgICBpbml0U3VtbWFyeShkYXRhRmlsZVBhdGgsIGNvbXBvbmVudHMsIHN0YXRzTWV0YWRhdGEpOwotCi0gICAgICAgICAgICBib29sZWFuIGNvbXByZXNzaW9uID0gY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnQuQ09NUFJFU1NJT05fSU5GTyk7Ci0gICAgICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBpYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuUFJJTUFSWV9JTkRFWCkpCi0gICAgICAgICAgICAgICAgICAgIC5tbWFwcGVkKERhdGFiYXNlRGVzY3JpcHRvci5nZXRJbmRleEFjY2Vzc01vZGUoKSA9PSBDb25maWcuRGlza0FjY2Vzc01vZGUubW1hcCkKLSAgICAgICAgICAgICAgICAgICAgLndpdGhDaHVua0NhY2hlKENodW5rQ2FjaGUuaW5zdGFuY2UpOwotICAgICAgICAgICAgICAgICAgICBGaWxlSGFuZGxlLkJ1aWxkZXIgZGJ1aWxkZXIgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpKS5jb21wcmVzc2VkKGNvbXByZXNzaW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tbWFwcGVkKERhdGFiYXNlRGVzY3JpcHRvci5nZXREaXNrQWNjZXNzTW9kZSgpID09IENvbmZpZy5EaXNrQWNjZXNzTW9kZS5tbWFwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ2h1bmtDYWNoZShDaHVua0NhY2hlLmluc3RhbmNlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25nIGluZGV4RmlsZUxlbmd0aCA9IG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlBSSU1BUllfSU5ERVgpKS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBEaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3kgb3B0aW1pemF0aW9uU3RyYXRlZ3kgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0RGlza09wdGltaXphdGlvblN0cmF0ZWd5KCk7Ci0gICAgICAgICAgICAgICAgaW50IGRhdGFCdWZmZXJTaXplID0gb3B0aW1pemF0aW9uU3RyYXRlZ3kuYnVmZmVyU2l6ZShzdGF0c01ldGFkYXRhLmVzdGltYXRlZFBhcnRpdGlvblNpemUucGVyY2VudGlsZShEYXRhYmFzZURlc2NyaXB0b3IuZ2V0RGlza09wdGltaXphdGlvbkVzdGltYXRlUGVyY2VudGlsZSgpKSk7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4QnVmZmVyU2l6ZSA9IG9wdGltaXphdGlvblN0cmF0ZWd5LmJ1ZmZlclNpemUoaW5kZXhGaWxlTGVuZ3RoIC8gc3VtbWFyeS5zaXplKCkpOwotICAgICAgICAgICAgICAgIGlmaWxlID0gaWJ1aWxkZXIuYnVmZmVyU2l6ZShpbmRleEJ1ZmZlclNpemUpLmNvbXBsZXRlKCk7Ci0gICAgICAgICAgICAgICAgZGZpbGUgPSBkYnVpbGRlci5idWZmZXJTaXplKGRhdGFCdWZmZXJTaXplKS5jb21wbGV0ZSgpOwotICAgICAgICAgICAgICAgIGJmID0gRmlsdGVyRmFjdG9yeS5BbHdheXNQcmVzZW50OwotCi0gICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gcmVhZGVyRmFjdG9yeS5vcGVuKHRoaXMpOwotCi0gICAgICAgICAgICAgICAgc3N0YWJsZS5maXJzdCA9IGZpcnN0OwotICAgICAgICAgICAgICAgIHNzdGFibGUubGFzdCA9IGxhc3Q7Ci0KLSAgICAgICAgICAgICAgICBzc3RhYmxlLnNldHVwKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3N0YWJsZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgaW5pdFN1bW1hcnkoU3RyaW5nIGRhdGFGaWxlUGF0aCwgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cywgU3RhdHNNZXRhZGF0YSBzdGF0c01ldGFkYXRhKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2FkU3VtbWFyeSgpOwotICAgICAgICAgICAgaWYgKHN1bW1hcnkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkU3VtbWFyeUFuZEJsb29tRmlsdGVyKGZhbHNlLCBmYWxzZSwgY29tcG9uZW50cywgc3RhdHNNZXRhZGF0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKGUsIGRhdGFGaWxlUGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb3JSZWFkIGV4dGVuZHMgU1NUYWJsZVJlYWRlckJ1aWxkZXIKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgVmFsaWRhdGlvbk1ldGFkYXRhIHZhbGlkYXRpb25NZXRhZGF0YTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzT2ZmbGluZTsKLQotICAgICAgICBwdWJsaWMgRm9yUmVhZChEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGFSZWYsCi0gICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25NZXRhZGF0YSB2YWxpZGF0aW9uTWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNPZmZsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICBTdGF0c01ldGFkYXRhIHN0YXRzTWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihkZXNjcmlwdG9yLCBtZXRhZGF0YVJlZiwgY3VycmVudFRpbWVNaWxsaXMoKSwgY29tcG9uZW50cywgc3RhdHNNZXRhZGF0YSwgTk9STUFMLCBoZWFkZXIpOwotICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWV0YWRhdGEgPSB2YWxpZGF0aW9uTWV0YWRhdGE7Ci0gICAgICAgICAgICB0aGlzLmlzT2ZmbGluZSA9IGlzT2ZmbGluZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU1NUYWJsZVJlYWRlciBidWlsZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBkYXRhRmlsZVBhdGggPSBkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKTsKLSAgICAgICAgICAgIGxvbmcgZmlsZUxlbmd0aCA9IG5ldyBGaWxlKGRhdGFGaWxlUGF0aCkubGVuZ3RoKCk7Ci0gICAgICAgICAgICBsb2dnZXIuaW5mbygiT3BlbmluZyB7fSAoe30pIiwgZGVzY3JpcHRvciwgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoZmlsZUxlbmd0aCkpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBsb2FkIGluZGV4IGFuZCBmaWx0ZXIKLSAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gbmFub1RpbWUoKTsKLSAgICAgICAgICAgICAgICBsb2FkKHZhbGlkYXRpb25NZXRhZGF0YSwgaXNPZmZsaW5lLCBjb21wb25lbnRzLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0RGlza09wdGltaXphdGlvblN0cmF0ZWd5KCksIHN0YXRzTWV0YWRhdGEpOwotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiSU5ERVggTE9BRCBUSU1FIGZvciB7fToge30gbXMuIiwgZGVzY3JpcHRvciwgVGltZVVuaXQuTkFOT1NFQ09ORFMudG9NaWxsaXMobmFub1RpbWUoKSAtIHN0YXJ0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24odCwgZGF0YUZpbGVQYXRoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gcmVhZGVyRmFjdG9yeS5vcGVuKHRoaXMpOwotCi0gICAgICAgICAgICBzc3RhYmxlLmZpcnN0ID0gZmlyc3Q7Ci0gICAgICAgICAgICBzc3RhYmxlLmxhc3QgPSBsYXN0OwotCi0gICAgICAgICAgICBzc3RhYmxlLnNldHVwKCFpc09mZmxpbmUpOyAvLyBEb24ndCB0cmFjayBob3RuZXNzIGlmIHdlJ3JlIG9mZmxpbmUuCi0gICAgICAgICAgICByZXR1cm4gc3N0YWJsZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcGFyYW0gdmFsaWRhdGlvbiBNZXRhZGF0YSBmb3IgU1NUYWJsZSBiZWluZyBsb2FkZWQKLSAgICAgICAgICogQHBhcmFtIGlzT2ZmbGluZSBXaGV0aGVyIHRoZSBTU1RhYmxlIGlzIGJlaW5nIGxvYWRlZCBieSBhbiBvZmZsaW5lIHRvb2wgKHNzdGFibGVkdW1wLCBzY3J1YiwgZXRjKQotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGxvYWQoVmFsaWRhdGlvbk1ldGFkYXRhIHZhbGlkYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNPZmZsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3kgb3B0aW1pemF0aW9uU3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRzTWV0YWRhdGEgc3RhdHNNZXRhZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtZXRhZGF0YS5wYXJhbXMuYmxvb21GaWx0ZXJGcENoYW5jZSA9PSAxLjApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gYmYgaXMgZGlzYWJsZWQuCi0gICAgICAgICAgICAgICAgbG9hZChmYWxzZSwgIWlzT2ZmbGluZSwgb3B0aW1pemF0aW9uU3RyYXRlZ3ksIHN0YXRzTWV0YWRhdGEsIGNvbXBvbmVudHMpOwotICAgICAgICAgICAgICAgIGJmID0gRmlsdGVyRmFjdG9yeS5BbHdheXNQcmVzZW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIWNvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50LlBSSU1BUllfSU5ERVgpKSAvLyBXaGF0IGhhcHBlbnMgaWYgZmlsdGVyIGNvbXBvbmVudCBhbmQgcHJpbWFyeSBpbmRleCBpcyBtaXNzaW5nPwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGF2b2lkIGFueSByZWFkaW5nIG9mIHRoZSBtaXNzaW5nIHByaW1hcnkgaW5kZXggY29tcG9uZW50LgotICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGR1cmluZyBTdGFuZGFsb25lU2NydWJiZXIKLSAgICAgICAgICAgICAgICBsb2FkKGZhbHNlLCAhaXNPZmZsaW5lLCBvcHRpbWl6YXRpb25TdHJhdGVneSwgc3RhdHNNZXRhZGF0YSwgY29tcG9uZW50cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnQuRklMVEVSKSB8fCB2YWxpZGF0aW9uID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gYmYgaXMgZW5hYmxlZCwgYnV0IGZpbHRlciBjb21wb25lbnQgaXMgbWlzc2luZy4KLSAgICAgICAgICAgICAgICBsb2FkKCFpc09mZmxpbmUsICFpc09mZmxpbmUsIG9wdGltaXphdGlvblN0cmF0ZWd5LCBzdGF0c01ldGFkYXRhLCBjb21wb25lbnRzKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNPZmZsaW5lKQotICAgICAgICAgICAgICAgICAgICBiZiA9IEZpbHRlckZhY3RvcnkuQWx3YXlzUHJlc2VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBiZiBpcyBlbmFibGVkIGFuZCBmcCBjaGFuY2UgbWF0Y2hlcyB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQgdmFsdWUuCi0gICAgICAgICAgICAgICAgbG9hZChmYWxzZSwgIWlzT2ZmbGluZSwgb3B0aW1pemF0aW9uU3RyYXRlZ3ksIHN0YXRzTWV0YWRhdGEsIGNvbXBvbmVudHMpOwotICAgICAgICAgICAgICAgIGJmID0gbG9hZEJsb29tRmlsdGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTG9hZHMgaWZpbGUsIGRmaWxlIGFuZCBpbmRleFN1bW1hcnksIGFuZCBvcHRpb25hbGx5IHJlY3JlYXRlcyBhbmQgcGVyc2lzdHMgdGhlIGJsb29tIGZpbHRlci4KLSAgICAgICAgICogQHBhcmFtIHJlY3JlYXRlQmxvb21GaWx0ZXIgUmVjcmVhdGUgdGhlIGJsb29tZmlsdGVyLgotICAgICAgICAgKiBAcGFyYW0gc2F2ZVN1bW1hcnlJZkNyZWF0ZWQgZm9yIGJ1bGsgbG9hZGluZyBwdXJwb3NlcywgaWYgdGhlIHN1bW1hcnkgd2FzIGFic2VudCBhbmQgbmVlZGVkIHRvIGJlIGJ1aWx0LCB5b3UgY2FuCi0gICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdm9pZCBwZXJzaXN0aW5nIGl0IHRvIGRpc2sgYnkgc2V0dGluZyB0aGlzIHRvIGZhbHNlCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIGxvYWQoYm9vbGVhbiByZWNyZWF0ZUJsb29tRmlsdGVyLAotICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzYXZlU3VtbWFyeUlmQ3JlYXRlZCwKLSAgICAgICAgICAgICAgICAgIERpc2tPcHRpbWl6YXRpb25TdHJhdGVneSBvcHRpbWl6YXRpb25TdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgIFN0YXRzTWV0YWRhdGEgc3RhdHNNZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkoRmlsZUhhbmRsZS5CdWlsZGVyIGlidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5QUklNQVJZX0lOREVYKSkKLSAgICAgICAgICAgICAgICAgICAgLm1tYXBwZWQoRGF0YWJhc2VEZXNjcmlwdG9yLmdldEluZGV4QWNjZXNzTW9kZSgpID09IENvbmZpZy5EaXNrQWNjZXNzTW9kZS5tbWFwKQotICAgICAgICAgICAgICAgICAgICAud2l0aENodW5rQ2FjaGUoQ2h1bmtDYWNoZS5pbnN0YW5jZSk7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVIYW5kbGUuQnVpbGRlciBkYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpLmNvbXByZXNzZWQoY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnQuQ09NUFJFU1NJT05fSU5GTykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1tYXBwZWQoRGF0YWJhc2VEZXNjcmlwdG9yLmdldERpc2tBY2Nlc3NNb2RlKCkgPT0gQ29uZmlnLkRpc2tBY2Nlc3NNb2RlLm1tYXApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDaHVua0NhY2hlKENodW5rQ2FjaGUuaW5zdGFuY2UpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvYWRTdW1tYXJ5KCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBidWlsZFN1bW1hcnkgPSBzdW1tYXJ5ID09IG51bGwgfHwgcmVjcmVhdGVCbG9vbUZpbHRlcjsKLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRTdW1tYXJ5KQotICAgICAgICAgICAgICAgICAgICBidWlsZFN1bW1hcnlBbmRCbG9vbUZpbHRlcihyZWNyZWF0ZUJsb29tRmlsdGVyLCBzdW1tYXJ5ICE9IG51bGwsIGNvbXBvbmVudHMsIHN0YXRzTWV0YWRhdGEpOwotCi0gICAgICAgICAgICAgICAgaW50IGRhdGFCdWZmZXJTaXplID0gb3B0aW1pemF0aW9uU3RyYXRlZ3kuYnVmZmVyU2l6ZShzdGF0c01ldGFkYXRhLmVzdGltYXRlZFBhcnRpdGlvblNpemUucGVyY2VudGlsZShEYXRhYmFzZURlc2NyaXB0b3IuZ2V0RGlza09wdGltaXphdGlvbkVzdGltYXRlUGVyY2VudGlsZSgpKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnQuUFJJTUFSWV9JTkRFWCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb25nIGluZGV4RmlsZUxlbmd0aCA9IG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlBSSU1BUllfSU5ERVgpKS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4QnVmZmVyU2l6ZSA9IG9wdGltaXphdGlvblN0cmF0ZWd5LmJ1ZmZlclNpemUoaW5kZXhGaWxlTGVuZ3RoIC8gc3VtbWFyeS5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICBpZmlsZSA9IGlidWlsZGVyLmJ1ZmZlclNpemUoaW5kZXhCdWZmZXJTaXplKS5jb21wbGV0ZSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRmaWxlID0gZGJ1aWxkZXIuYnVmZmVyU2l6ZShkYXRhQnVmZmVyU2l6ZSkuY29tcGxldGUoKTsKLQotICAgICAgICAgICAgICAgIGlmIChidWlsZFN1bW1hcnkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2F2ZVN1bW1hcnlJZkNyZWF0ZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyLnNhdmVTdW1tYXJ5KGRlc2NyaXB0b3IsIGZpcnN0LCBsYXN0LCBzdW1tYXJ5KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3JlYXRlQmxvb21GaWx0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyLnNhdmVCbG9vbUZpbHRlcihkZXNjcmlwdG9yLCBiZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgeyAvLyBCZWNhdXNlIHRoZSB0aWRpZXIgaGFzIG5vdCBiZWVuIHNldC11cCB5ZXQgaW4gU1NUYWJsZVJlYWRlci5vcGVuKCksIHdlIG11c3QgcmVsZWFzZSB0aGUgZmlsZXMgaW4gY2FzZSBvZiBlcnJvcgotICAgICAgICAgICAgICAgIGlmIChpZmlsZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWZpbGUuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZGZpbGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRmaWxlLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHN1bW1hcnkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN1bW1hcnkuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0aHJvdyB0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU1NUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TU1RhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWRkODYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU1NUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLkNodW5rQ2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db3JydXB0U1NUYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JT09wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5LZXlSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLlZhbGlkYXRpb25NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlRhYmxlTWV0cmljczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhUmVmOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpWTVN0YWJpbGl0eUluc3BlY3RvcjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXMuU0VDT05EQVJZX0lOREVYX05BTUVfU0VQQVJBVE9SOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyLk9wZW5SZWFzb24uTk9STUFMOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU1NUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyPFIgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyLCBCIGV4dGVuZHMgU1NUYWJsZVJlYWRlci5CdWlsZGVyPFIsIEI+PgoreworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTU1RhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXIuY2xhc3MpOworCisgICAgcHJvdGVjdGVkIGZpbmFsIERlc2NyaXB0b3IgZGVzY3JpcHRvcjsKKyAgICBwcm90ZWN0ZWQgZmluYWwgU2V0PENvbXBvbmVudD4gY29tcG9uZW50czsKKyAgICBwcm90ZWN0ZWQgZmluYWwgVGFibGVNZXRhZGF0YVJlZiB0YWJsZU1ldGFkYXRhUmVmOworICAgIHByb3RlY3RlZCBmaW5hbCBJT09wdGlvbnMgaW9PcHRpb25zOworICAgIHByb3RlY3RlZCBmaW5hbCBDaHVua0NhY2hlIGNodW5rQ2FjaGU7CisKKyAgICBwdWJsaWMgU1NUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyKFNTVGFibGUuQnVpbGRlcjw/LCA/PiBidWlsZGVyKQorICAgIHsKKyAgICAgICAgdGhpcy5kZXNjcmlwdG9yID0gYnVpbGRlci5kZXNjcmlwdG9yOworICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSBidWlsZGVyLmdldENvbXBvbmVudHMoKSAhPSBudWxsID8gSW1tdXRhYmxlU2V0LmNvcHlPZihidWlsZGVyLmdldENvbXBvbmVudHMoKSkgOiBUT0NDb21wb25lbnQubG9hZE9yQ3JlYXRlKHRoaXMuZGVzY3JpcHRvcik7CisgICAgICAgIHRoaXMudGFibGVNZXRhZGF0YVJlZiA9IGJ1aWxkZXIuZ2V0VGFibGVNZXRhZGF0YVJlZigpICE9IG51bGwgPyBidWlsZGVyLmdldFRhYmxlTWV0YWRhdGFSZWYoKSA6IHJlc29sdmVUYWJsZU1ldGFkYXRhUmVmKCk7CisgICAgICAgIHRoaXMuaW9PcHRpb25zID0gYnVpbGRlci5nZXRJT09wdGlvbnMoKSAhPSBudWxsID8gYnVpbGRlci5nZXRJT09wdGlvbnMoKSA6IElPT3B0aW9ucy5mcm9tRGF0YWJhc2VEZXNjcmlwdG9yKCk7CisgICAgICAgIHRoaXMuY2h1bmtDYWNoZSA9IGJ1aWxkZXIuZ2V0Q2h1bmtDYWNoZSgpICE9IG51bGwgPyBidWlsZGVyLmdldENodW5rQ2FjaGUoKSA6IENodW5rQ2FjaGUuaW5zdGFuY2U7CisKKyAgICAgICAgY2hlY2tOb3ROdWxsKHRoaXMuY29tcG9uZW50cyk7CisgICAgICAgIGNoZWNrTm90TnVsbCh0aGlzLnRhYmxlTWV0YWRhdGFSZWYpOworICAgIH0KKworICAgIHB1YmxpYyBSIGJ1aWxkKFNTVGFibGUuT3duZXIgb3duZXIsIGJvb2xlYW4gdmFsaWRhdGUsIGJvb2xlYW4gb25saW5lKQorICAgIHsKKyAgICAgICAgY2hlY2tBcmd1bWVudChjb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudHMuREFUQSksICJEYXRhIGNvbXBvbmVudCBpcyBtaXNzaW5nIGZvciBzc3RhYmxlICVzIiwgZGVzY3JpcHRvcik7CisgICAgICAgIGlmICh2YWxpZGF0ZSkKKyAgICAgICAgICAgIGNoZWNrQXJndW1lbnQodGhpcy5jb21wb25lbnRzLmNvbnRhaW5zQWxsKGRlc2NyaXB0b3IuZ2V0Rm9ybWF0KCkucHJpbWFyeUNvbXBvbmVudHMoKSksICJTb21lIHJlcXVpcmVkIGNvbXBvbmVudHMgKCVzKSBhcmUgbWlzc2luZyBmb3Igc3N0YWJsZSAlcyIsIFNldHMuZGlmZmVyZW5jZShkZXNjcmlwdG9yLmdldEZvcm1hdCgpLnByaW1hcnlDb21wb25lbnRzKCksIHRoaXMuY29tcG9uZW50cyksIGRlc2NyaXB0b3IpOworCisgICAgICAgIEIgYnVpbGRlciA9IChCKSBkZXNjcmlwdG9yLmdldEZvcm1hdCgpLmdldFJlYWRlckZhY3RvcnkoKS5idWlsZGVyKGRlc2NyaXB0b3IpOworICAgICAgICBidWlsZGVyLnNldE9wZW5SZWFzb24oTk9STUFMKTsKKyAgICAgICAgYnVpbGRlci5zZXRNYXhEYXRhQWdlKENsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgYnVpbGRlci5zZXRUYWJsZU1ldGFkYXRhUmVmKHRhYmxlTWV0YWRhdGFSZWYpOworICAgICAgICBidWlsZGVyLnNldENvbXBvbmVudHMoY29tcG9uZW50cyk7CisKKyAgICAgICAgUiByZWFkZXIgPSBudWxsOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBDb21wcmVzc2lvbkluZm9Db21wb25lbnQudmVyaWZ5Q29tcHJlc3Npb25JbmZvRXhpc3RlbmNlSWZBcHBsaWNhYmxlKGRlc2NyaXB0b3IsIGJ1aWxkZXIuZ2V0Q29tcG9uZW50cygpKTsKKworICAgICAgICAgICAgbG9uZyB0MCA9IENsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgICAgICBvcGVuQ29tcG9uZW50cyhidWlsZGVyLCBvd25lciwgdmFsaWRhdGUsIG9ubGluZSk7CisKKyAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIlNTVGFibGUge30gbG9hZGVkIGluIHt9bXMiLCBkZXNjcmlwdG9yLCBDbG9jay5HbG9iYWwuY3VycmVudFRpbWVNaWxsaXMoKSAtIHQwKTsKKworICAgICAgICAgICAgcmVhZGVyID0gYnVpbGRlci5idWlsZChvd25lciwgdmFsaWRhdGUsIG9ubGluZSk7CisKKyAgICAgICAgICAgIHJldHVybiByZWFkZXI7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbiB8IEVycm9yIGV4KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVhZGVyLnNlbGZSZWYoKS5yZWxlYXNlKCk7CisKKyAgICAgICAgICAgIEpWTVN0YWJpbGl0eUluc3BlY3Rvci5pbnNwZWN0VGhyb3dhYmxlKGV4KTsKKworICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgdGhyb3cgKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKSBleDsKKworICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKGV4LCBkZXNjcmlwdG9yLmJhc2VGaWxlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IEtleVJlYWRlciBidWlsZEtleVJlYWRlcihUYWJsZU1ldHJpY3MgdGFibGVNZXRyaWNzKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvcGVuQ29tcG9uZW50cyhCIGJ1aWxkZXIsIFNTVGFibGUuT3duZXIgb3duZXIsIGJvb2xlYW4gdmFsaWRhdGUsIGJvb2xlYW4gb25saW5lKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBzc3RhYmxlIGlzIGNyZWF0ZWQgdXNpbmcgc2FtZSBwYXJ0aXRpb25lci4KKyAgICAgKiBQYXJ0aXRpb25lciBjYW4gYmUgbnVsbCwgd2hpY2ggaW5kaWNhdGVzIG9sZGVyIHZlcnNpb24gb2Ygc3N0YWJsZSBvciBubyBzdGF0cyBhdmFpbGFibGUuCisgICAgICogSW4gdGhhdCBjYXNlLCB3ZSBza2lwIHRoZSBjaGVjay4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVBhcnRpdGlvbmVyKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsIFZhbGlkYXRpb25NZXRhZGF0YSB2YWxpZGF0aW9uTWV0YWRhdGEpCisgICAgeworICAgICAgICBTdHJpbmcgcGFydGl0aW9uZXJOYW1lID0gbWV0YWRhdGEucGFydGl0aW9uZXIuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCk7CisgICAgICAgIGlmICh2YWxpZGF0aW9uTWV0YWRhdGEgIT0gbnVsbCAmJiAhcGFydGl0aW9uZXJOYW1lLmVxdWFscyh2YWxpZGF0aW9uTWV0YWRhdGEucGFydGl0aW9uZXIpKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24obmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkNhbm5vdCBvcGVuICVzOyBwYXJ0aXRpb25lciAlcyBkb2VzIG5vdCBtYXRjaCBzeXN0ZW0gcGFydGl0aW9uZXIgJXMuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3RlIHRoYXQgdGhlIGRlZmF1bHQgcGFydGl0aW9uZXIgc3RhcnRpbmcgd2l0aCBDYXNzYW5kcmEgMS4yIGlzIE11cm11cjNQYXJ0aXRpb25lciwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvIHlvdSB3aWxsIG5lZWQgdG8gZWRpdCB0aGF0IHRvIG1hdGNoIHlvdXIgb2xkIHBhcnRpdGlvbmVyIGlmIHVwZ3JhZGluZy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IsIHZhbGlkYXRpb25NZXRhZGF0YS5wYXJ0aXRpb25lciwgcGFydGl0aW9uZXJOYW1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuU1RBVFMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgVGFibGVNZXRhZGF0YVJlZiByZXNvbHZlVGFibGVNZXRhZGF0YVJlZigpCisgICAgeworICAgICAgICBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhOworICAgICAgICBpZiAoZGVzY3JpcHRvci5jZm5hbWUuY29udGFpbnMoU0VDT05EQVJZX0lOREVYX05BTUVfU0VQQVJBVE9SKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGkgPSBkZXNjcmlwdG9yLmNmbmFtZS5pbmRleE9mKFNFQ09OREFSWV9JTkRFWF9OQU1FX1NFUEFSQVRPUik7CisgICAgICAgICAgICBTdHJpbmcgaW5kZXhOYW1lID0gZGVzY3JpcHRvci5jZm5hbWUuc3Vic3RyaW5nKGkgKyAxKTsKKyAgICAgICAgICAgIG1ldGFkYXRhID0gU2NoZW1hLmluc3RhbmNlLmdldEluZGV4VGFibGVNZXRhZGF0YVJlZihkZXNjcmlwdG9yLmtzbmFtZSwgaW5kZXhOYW1lKTsKKyAgICAgICAgICAgIGlmIChtZXRhZGF0YSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiQ291bGQgbm90IGZpbmQgaW5kZXggbWV0YWRhdGEgZm9yIGluZGV4IGNmICIgKyBpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG1ldGFkYXRhID0gU2NoZW1hLmluc3RhbmNlLmdldFRhYmxlTWV0YWRhdGFSZWYoZGVzY3JpcHRvci5rc25hbWUsIGRlc2NyaXB0b3IuY2ZuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtZXRhZGF0YTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TU1RhYmxlUmVhZGVyV2l0aEZpbHRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWFjMWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQWJzdHJhY3RSb3dJbmRleEVudHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZWFkc0xpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZmlsdGVyLkJsb29tRmlsdGVyVHJhY2tlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5JRmlsdGVyOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuU2hhcmVkQ2xvc2VhYmxlLnNoYXJlZENvcHlPck51bGw7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTU1RhYmxlUmVhZGVyV2l0aEZpbHRlciBleHRlbmRzIFNTVGFibGVSZWFkZXIKK3sKKyAgICBwcml2YXRlIGZpbmFsIElGaWx0ZXIgZmlsdGVyOworICAgIHByaXZhdGUgZmluYWwgQmxvb21GaWx0ZXJUcmFja2VyIGZpbHRlclRyYWNrZXI7CisKKyAgICBwcm90ZWN0ZWQgU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIoQnVpbGRlcjw/LCA/PiBidWlsZGVyLCBPd25lciBvd25lcikKKyAgICB7CisgICAgICAgIHN1cGVyKGJ1aWxkZXIsIG93bmVyKTsKKyAgICAgICAgdGhpcy5maWx0ZXIgPSBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGJ1aWxkZXIuZ2V0RmlsdGVyKCkpOworICAgICAgICB0aGlzLmZpbHRlclRyYWNrZXIgPSBuZXcgQmxvb21GaWx0ZXJUcmFja2VyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIExpc3Q8QXV0b0Nsb3NlYWJsZT4gc2V0dXBJbnN0YW5jZShib29sZWFuIHRyYWNrSG90bmVzcykKKyAgICB7CisgICAgICAgIEFycmF5TGlzdDxBdXRvQ2xvc2VhYmxlPiBjbG9zZWFibGVzID0gTGlzdHMubmV3QXJyYXlMaXN0KGZpbHRlcik7CisgICAgICAgIGNsb3NlYWJsZXMuYWRkQWxsKHN1cGVyLnNldHVwSW5zdGFuY2UodHJhY2tIb3RuZXNzKSk7CisgICAgICAgIHJldHVybiBjbG9zZWFibGVzOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCA8QiBleHRlbmRzIEJ1aWxkZXI8PywgQj4+IEIgdW5idWlsZFRvKEIgYnVpbGRlciwgYm9vbGVhbiBzaGFyZWRDb3B5KQorICAgIHsKKyAgICAgICAgQiBiID0gc3VwZXIudW5idWlsZFRvKGJ1aWxkZXIsIHNoYXJlZENvcHkpOworICAgICAgICBpZiAoYnVpbGRlci5nZXRGaWx0ZXIoKSA9PSBudWxsKQorICAgICAgICAgICAgYi5zZXRGaWx0ZXIoc2hhcmVkQ29weSA/IHNoYXJlZENvcHlPck51bGwoZmlsdGVyKSA6IGZpbHRlcik7CisgICAgICAgIHJldHVybiBiOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzUHJlc2VudEluRmlsdGVyKElGaWx0ZXIuRmlsdGVyS2V5IGtleSkKKyAgICB7CisgICAgICAgIHJldHVybiBmaWx0ZXIuaXNQcmVzZW50KGtleSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gbWF5Q29udGFpbkFzc3VtaW5nS2V5SXNJblJhbmdlKERlY29yYXRlZEtleSBrZXkpCisgICAgeworICAgICAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIGJsb29tIGZpbHRlcihiZl9mcF9jaGFuY2U9MS4wIG9yIGZpbHRlciBmaWxlIGlzIG1pc3NpbmcpLAorICAgICAgICAvLyB3ZSBjaGVjayBpbmRleCBmaWxlIGluc3RlYWQuCisgICAgICAgIHJldHVybiAhZmlsdGVyLmlzSW5mb3JtYXRpdmUoKSAmJiBnZXRQb3NpdGlvbihrZXksIE9wZXJhdG9yLkVRLCBmYWxzZSkgPj0gMCB8fCBmaWx0ZXIuaXNQcmVzZW50KGtleSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5U2VsZWN0ZWQoU1NUYWJsZVJlYWRzTGlzdGVuZXIuU2VsZWN0aW9uUmVhc29uIHJlYXNvbiwgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbG9jYWxMaXN0ZW5lciwgT3BlcmF0b3Igb3AsIGJvb2xlYW4gdXBkYXRlU3RhdHMsIEFic3RyYWN0Um93SW5kZXhFbnRyeSBlbnRyeSkKKyAgICB7CisgICAgICAgIHN1cGVyLm5vdGlmeVNlbGVjdGVkKHJlYXNvbiwgbG9jYWxMaXN0ZW5lciwgb3AsIHVwZGF0ZVN0YXRzLCBlbnRyeSk7CisKKyAgICAgICAgaWYgKCEodXBkYXRlU3RhdHMgJiYgb3AgPT0gU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgZmlsdGVyVHJhY2tlci5hZGRUcnVlUG9zaXRpdmUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlTa2lwcGVkKFNTVGFibGVSZWFkc0xpc3RlbmVyLlNraXBwaW5nUmVhc29uIHJlYXNvbiwgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbG9jYWxMaXN0ZW5lciwgT3BlcmF0b3Igb3AsIGJvb2xlYW4gdXBkYXRlU3RhdHMpCisgICAgeworICAgICAgICBzdXBlci5ub3RpZnlTa2lwcGVkKHJlYXNvbiwgbG9jYWxMaXN0ZW5lciwgb3AsIHVwZGF0ZVN0YXRzKTsKKworICAgICAgICBpZiAoIXVwZGF0ZVN0YXRzKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHN3aXRjaCAocmVhc29uKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJMT09NX0ZJTFRFUjoKKyAgICAgICAgICAgICAgICBmaWx0ZXJUcmFja2VyLmFkZFRydWVOZWdhdGl2ZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSU5fTUFYX0tFWVM6CisgICAgICAgICAgICAgICAgLy8gY2hlY2tpbmcgYmxvb20gZmlsdGVyIGFnYWluc3Qga2V5cyBvdXRzaWRlIHRoZSBzc3RhYmxlIHJhbmdlIG1ha2Ugbm8gc2Vuc2Ugc28gY29sbGVjdGluZworICAgICAgICAgICAgICAgIC8vIHN0YXRpc3RpY3Mgb24gdGhhdCBtYWtlcyBubyBzZW5zZSBlaXRoZXIKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKG9wID09IFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpCisgICAgICAgICAgICAgICAgICAgIGZpbHRlclRyYWNrZXIuYWRkRmFsc2VQb3NpdGl2ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEJsb29tRmlsdGVyVHJhY2tlciBnZXRGaWx0ZXJUcmFja2VyKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmaWx0ZXJUcmFja2VyOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldEZpbHRlclNlcmlhbGl6ZWRTaXplKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmaWx0ZXIuc2VyaWFsaXplZFNpemUoZGVzY3JpcHRvci52ZXJzaW9uLmhhc09sZEJmRm9ybWF0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldEZpbHRlck9mZkhlYXBTaXplKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmaWx0ZXIub2ZmSGVhcFNpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIgY2xvbmVBbmRSZXBsYWNlKElGaWx0ZXIgZmlsdGVyKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQnVpbGRlcjxSIGV4dGVuZHMgU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIsIEIgZXh0ZW5kcyBCdWlsZGVyPFIsIEI+PiBleHRlbmRzIFNTVGFibGVSZWFkZXIuQnVpbGRlcjxSLCBCPgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKKworICAgICAgICBwdWJsaWMgQnVpbGRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGRlc2NyaXB0b3IpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEIgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmZpbHRlciA9IGZpbHRlcjsKKyAgICAgICAgICAgIHJldHVybiAoQikgdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJRmlsdGVyIGdldEZpbHRlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlcjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NTVGFibGVSZWFkc0xpc3RlbmVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TU1RhYmxlUmVhZHNMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDM4NGJmLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NTVGFibGVSZWFkc0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd0luZGV4RW50cnk7Ci0KLS8qKgotICogTGlzdGVuZXIgZm9yIHJlY2VpdmluZyBub3RpZmljYXRpb25zIGFzc29jaWF0ZWQgd2l0aCByZWFkaW5nIFNTVGFibGVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNTVGFibGVSZWFkc0xpc3RlbmVyCi17Ci0gICAgLyoqCi0gICAgICogVGhlIHJlYXNvbnMgZm9yIHNraXBwaW5nIGFuIFNTVGFibGUKLSAgICAgKi8KLSAgICBlbnVtIFNraXBwaW5nUmVhc29uCi0gICAgewotICAgICAgICBCTE9PTV9GSUxURVIsCi0gICAgICAgIE1JTl9NQVhfS0VZUywKLSAgICAgICAgUEFSVElUSU9OX0lOREVYX0xPT0tVUCwKLSAgICAgICAgSU5ERVhfRU5UUllfTk9UX0ZPVU5EOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSByZWFzb25zIGZvciBzZWxlY3RpbmcgYW4gU1NUYWJsZQotICAgICAqLwotICAgIGVudW0gU2VsZWN0aW9uUmVhc29uCi0gICAgewotICAgICAgICBLRVlfQ0FDSEVfSElULAotICAgICAgICBJTkRFWF9FTlRSWV9GT1VORDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMaXN0ZW5lciB0aGF0IGRvZXMgbm90aGluZy4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU1NUYWJsZVJlYWRzTGlzdGVuZXIgTk9PUF9MSVNURU5FUiA9IG5ldyBTU1RhYmxlUmVhZHNMaXN0ZW5lcigpIHt9OwotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBub3RpZmljYXRpb24gdGhhdCB0aGUgc3BlY2lmaWVkIFNTVGFibGUgaGFzIGJlZW4gc2tpcHBlZCBkdXJpbmcgYSBzaW5nbGUgcGFydGl0aW9uIHF1ZXJ5LgotICAgICAqCi0gICAgICogQHBhcmFtIHNzdGFibGUgdGhlIFNTVGFibGUgcmVhZGVyCi0gICAgICogQHBhcmFtIHJlYXNvbiB0aGUgcmVhc29uIGZvciB3aGljaCB0aGUgU1NUYWJsZSBoYXMgYmVlbiBza2lwcGVkCi0gICAgICovCi0gICAgZGVmYXVsdCB2b2lkIG9uU1NUYWJsZVNraXBwZWQoU1NUYWJsZVJlYWRlciBzc3RhYmxlLCBTa2lwcGluZ1JlYXNvbiByZWFzb24pCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHNwZWNpZmllZCBTU1RhYmxlIGhhcyBiZWVuIHNlbGVjdGVkIGR1cmluZyBhIHNpbmdsZSBwYXJ0aXRpb24gcXVlcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3N0YWJsZSB0aGUgU1NUYWJsZSByZWFkZXIKLSAgICAgKiBAcGFyYW0gaW5kZXhFbnRyeSB0aGUgaW5kZXggZW50cnkKLSAgICAgKiBAcGFyYW0gcmVhc29uIHRoZSByZWFzb24gZm9yIHdoaWNoIHRoZSBTU1RhYmxlIGhhcyBiZWVuIHNlbGVjdGVkCi0gICAgICovCi0gICAgZGVmYXVsdCB2b2lkIG9uU1NUYWJsZVNlbGVjdGVkKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgUm93SW5kZXhFbnRyeTw/PiBpbmRleEVudHJ5LCBTZWxlY3Rpb25SZWFzb24gcmVhc29uKQotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzcGVjaWZpZWQgU1NUYWJsZSBpcyBiZWluZyBzY2FubmVkIGR1cmluZyBhIHBhcnRpdGlvbiByYW5nZSBxdWVyeS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzc3RhYmxlIHRoZSBTU1RhYmxlIHJlYWRlciBvZiB0aGUgU1NUYWJsZSBiZWluZyBzY2FubmVkLgotICAgICAqLwotICAgIGRlZmF1bHQgdm9pZCBvblNjYW5uaW5nU3RhcnRlZChTU1RhYmxlUmVhZGVyIHNzdGFibGUpCi0gICAgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NTVGFibGVTY2FubmVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TU1RhYmxlU2Nhbm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNWIyYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TU1RhYmxlU2Nhbm5lci5qYXZhCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGF0YVJhbmdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5QYXJ0aXRpb25Qb3NpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuTGF6aWx5SW5pdGlhbGl6ZWRVbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkFic3RyYWN0Qm91bmRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5BYnN0cmFjdEJvdW5kcy5Cb3VuZGFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQm91bmRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFJvd0luZGV4RW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db3JydXB0U1NUYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklTU1RhYmxlU2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZWFkc0xpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmFuZG9tQWNjZXNzUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkFic3RyYWN0SXRlcmF0b3I7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkFic3RyYWN0Qm91bmRzLmlzRW1wdHk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5BYnN0cmFjdEJvdW5kcy5tYXhMZWZ0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQWJzdHJhY3RCb3VuZHMubWluUmlnaHQ7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTU1RhYmxlU2Nhbm5lcjxTIGV4dGVuZHMgU1NUYWJsZVJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFIGV4dGVuZHMgQWJzdHJhY3RSb3dJbmRleEVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkgZXh0ZW5kcyBTU1RhYmxlU2Nhbm5lcjxTLCBFLCBJPi5CYXNlS2V5U2Nhbm5pbmdJdGVyYXRvcj4KK2ltcGxlbWVudHMgSVNTVGFibGVTY2FubmVyCit7CisgICAgcHJvdGVjdGVkIGZpbmFsIEF0b21pY0Jvb2xlYW4gaXNDbG9zZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisgICAgcHJvdGVjdGVkIGZpbmFsIFJhbmRvbUFjY2Vzc1JlYWRlciBkZmlsZTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgUyBzc3RhYmxlOworCisgICAgcHJvdGVjdGVkIGZpbmFsIEl0ZXJhdG9yPEFic3RyYWN0Qm91bmRzPFBhcnRpdGlvblBvc2l0aW9uPj4gcmFuZ2VJdGVyYXRvcjsKKworICAgIHByb3RlY3RlZCBmaW5hbCBDb2x1bW5GaWx0ZXIgY29sdW1uczsKKyAgICBwcm90ZWN0ZWQgZmluYWwgRGF0YVJhbmdlIGRhdGFSYW5nZTsKKyAgICBwcml2YXRlIGZpbmFsIFNTVGFibGVSZWFkc0xpc3RlbmVyIGxpc3RlbmVyOworCisgICAgcHJvdGVjdGVkIEkgaXRlcmF0b3I7CisKKyAgICBwcm90ZWN0ZWQgbG9uZyBzdGFydFNjYW4gPSAtMTsKKyAgICBwcm90ZWN0ZWQgbG9uZyBieXRlc1NjYW5uZWQgPSAwOworCisgICAgcHJvdGVjdGVkIFNTVGFibGVTY2FubmVyKFMgc3N0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uRmlsdGVyIGNvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFSYW5nZSBkYXRhUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPEFic3RyYWN0Qm91bmRzPFBhcnRpdGlvblBvc2l0aW9uPj4gcmFuZ2VJdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXIpCisgICAgeworICAgICAgICBhc3NlcnQgc3N0YWJsZSAhPSBudWxsOworCisgICAgICAgIHRoaXMuZGZpbGUgPSBzc3RhYmxlLm9wZW5EYXRhUmVhZGVyKCk7CisgICAgICAgIHRoaXMuc3N0YWJsZSA9IHNzdGFibGU7CisgICAgICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7CisgICAgICAgIHRoaXMuZGF0YVJhbmdlID0gZGF0YVJhbmdlOworICAgICAgICB0aGlzLnJhbmdlSXRlcmF0b3IgPSByYW5nZUl0ZXJhdG9yOworICAgICAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBMaXN0PEFic3RyYWN0Qm91bmRzPFBhcnRpdGlvblBvc2l0aW9uPj4gbWFrZUJvdW5kcyhTU1RhYmxlUmVhZGVyIHNzdGFibGUsIENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+PiB0b2tlblJhbmdlcykKKyAgICB7CisgICAgICAgIExpc3Q8QWJzdHJhY3RCb3VuZHM8UGFydGl0aW9uUG9zaXRpb24+PiBib3VuZHNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KHRva2VuUmFuZ2VzLnNpemUoKSk7CisgICAgICAgIGZvciAoUmFuZ2U8VG9rZW4+IHJhbmdlIDogUmFuZ2Uubm9ybWFsaXplKHRva2VuUmFuZ2VzKSkKKyAgICAgICAgICAgIGFkZFJhbmdlKHNzdGFibGUsIFJhbmdlLm1ha2VSb3dSYW5nZShyYW5nZSksIGJvdW5kc0xpc3QpOworICAgICAgICByZXR1cm4gYm91bmRzTGlzdDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIExpc3Q8QWJzdHJhY3RCb3VuZHM8UGFydGl0aW9uUG9zaXRpb24+PiBtYWtlQm91bmRzKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgRGF0YVJhbmdlIGRhdGFSYW5nZSkKKyAgICB7CisgICAgICAgIExpc3Q8QWJzdHJhY3RCb3VuZHM8UGFydGl0aW9uUG9zaXRpb24+PiBib3VuZHNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KDIpOworICAgICAgICBhZGRSYW5nZShzc3RhYmxlLCBkYXRhUmFuZ2Uua2V5UmFuZ2UoKSwgYm91bmRzTGlzdCk7CisgICAgICAgIHJldHVybiBib3VuZHNMaXN0OworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgQWJzdHJhY3RCb3VuZHM8UGFydGl0aW9uUG9zaXRpb24+IGZ1bGxSYW5nZShTU1RhYmxlUmVhZGVyIHNzdGFibGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEJvdW5kczw+KHNzdGFibGUuZmlyc3QsIHNzdGFibGUubGFzdCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRSYW5nZShTU1RhYmxlUmVhZGVyIHNzdGFibGUsIEFic3RyYWN0Qm91bmRzPFBhcnRpdGlvblBvc2l0aW9uPiByZXF1ZXN0ZWQsIExpc3Q8QWJzdHJhY3RCb3VuZHM8UGFydGl0aW9uUG9zaXRpb24+PiBib3VuZHNMaXN0KQorICAgIHsKKyAgICAgICAgaWYgKHJlcXVlc3RlZCBpbnN0YW5jZW9mIFJhbmdlICYmICgoUmFuZ2U8Pz4pIHJlcXVlc3RlZCkuaXNXcmFwQXJvdW5kKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWQucmlnaHQuY29tcGFyZVRvKHNzdGFibGUuZmlyc3QpID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gc2luY2Ugd2Ugd3JhcCwgd2UgbXVzdCBjb250YWluIHRoZSB3aG9sZSBzc3RhYmxlIHByaW9yIHRvIHN0b3BLZXkoKQorICAgICAgICAgICAgICAgIEJvdW5kYXJ5PFBhcnRpdGlvblBvc2l0aW9uPiBsZWZ0ID0gbmV3IEJvdW5kYXJ5PD4oc3N0YWJsZS5maXJzdCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgQm91bmRhcnk8UGFydGl0aW9uUG9zaXRpb24+IHJpZ2h0OworICAgICAgICAgICAgICAgIHJpZ2h0ID0gcmVxdWVzdGVkLnJpZ2h0Qm91bmRhcnkoKTsKKyAgICAgICAgICAgICAgICByaWdodCA9IG1pblJpZ2h0KHJpZ2h0LCBzc3RhYmxlLmxhc3QsIHRydWUpOworICAgICAgICAgICAgICAgIGlmICghaXNFbXB0eShsZWZ0LCByaWdodCkpCisgICAgICAgICAgICAgICAgICAgIGJvdW5kc0xpc3QuYWRkKEFic3RyYWN0Qm91bmRzLmJvdW5kcyhsZWZ0LCByaWdodCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlcXVlc3RlZC5sZWZ0LmNvbXBhcmVUbyhzc3RhYmxlLmxhc3QpIDw9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gc2luY2Ugd2Ugd3JhcCwgd2UgbXVzdCBjb250YWluIHRoZSB3aG9sZSBzc3RhYmxlIGFmdGVyIGRhdGFSYW5nZS5zdGFydEtleSgpCisgICAgICAgICAgICAgICAgQm91bmRhcnk8UGFydGl0aW9uUG9zaXRpb24+IHJpZ2h0ID0gbmV3IEJvdW5kYXJ5PD4oc3N0YWJsZS5sYXN0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICBCb3VuZGFyeTxQYXJ0aXRpb25Qb3NpdGlvbj4gbGVmdDsKKyAgICAgICAgICAgICAgICBsZWZ0ID0gcmVxdWVzdGVkLmxlZnRCb3VuZGFyeSgpOworICAgICAgICAgICAgICAgIGxlZnQgPSBtYXhMZWZ0KGxlZnQsIHNzdGFibGUuZmlyc3QsIHRydWUpOworICAgICAgICAgICAgICAgIGlmICghaXNFbXB0eShsZWZ0LCByaWdodCkpCisgICAgICAgICAgICAgICAgICAgIGJvdW5kc0xpc3QuYWRkKEFic3RyYWN0Qm91bmRzLmJvdW5kcyhsZWZ0LCByaWdodCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0ICFBYnN0cmFjdEJvdW5kcy5zdHJpY3RseVdyYXBzQXJvdW5kKHJlcXVlc3RlZC5sZWZ0LCByZXF1ZXN0ZWQucmlnaHQpOworICAgICAgICAgICAgQm91bmRhcnk8UGFydGl0aW9uUG9zaXRpb24+IGxlZnQsIHJpZ2h0OworICAgICAgICAgICAgbGVmdCA9IHJlcXVlc3RlZC5sZWZ0Qm91bmRhcnkoKTsKKyAgICAgICAgICAgIHJpZ2h0ID0gcmVxdWVzdGVkLnJpZ2h0Qm91bmRhcnkoKTsKKyAgICAgICAgICAgIGxlZnQgPSBtYXhMZWZ0KGxlZnQsIHNzdGFibGUuZmlyc3QsIHRydWUpOworICAgICAgICAgICAgLy8gYXBwYXJlbnRseSBpc1dyYXBBcm91bmQoKSBkb2Vzbid0IGNvdW50IEJvdW5kcyB0aGF0IGV4dGVuZCB0byB0aGUgbGltaXQgKG1pbikgYXMgd3JhcHBpbmcKKyAgICAgICAgICAgIHJpZ2h0ID0gcmVxdWVzdGVkLnJpZ2h0LmlzTWluaW11bSgpID8gbmV3IEJvdW5kYXJ5PD4oc3N0YWJsZS5sYXN0LCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtaW5SaWdodChyaWdodCwgc3N0YWJsZS5sYXN0LCB0cnVlKTsKKyAgICAgICAgICAgIGlmICghaXNFbXB0eShsZWZ0LCByaWdodCkpCisgICAgICAgICAgICAgICAgYm91bmRzTGlzdC5hZGQoQWJzdHJhY3RCb3VuZHMuYm91bmRzKGxlZnQsIHJpZ2h0KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlzQ2xvc2VkLmNvbXBhcmVBbmRTZXQoZmFsc2UsIHRydWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hcmtTY2FubmVkKCk7CisgICAgICAgICAgICAgICAgZG9DbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBzc3RhYmxlLm1hcmtTdXNwZWN0KCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24oZSwgc3N0YWJsZS5nZXRGaWxlbmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvQ2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRMZW5ndGhJbkJ5dGVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzc3RhYmxlLnVuY29tcHJlc3NlZExlbmd0aCgpOworICAgIH0KKworCisgICAgcHVibGljIGxvbmcgZ2V0Q29tcHJlc3NlZExlbmd0aEluQnl0ZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNzdGFibGUub25EaXNrTGVuZ3RoKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFBvc2l0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZmlsZS5nZXRGaWxlUG9pbnRlcigpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldEJ5dGVzU2Nhbm5lZCgpCisgICAgeworICAgICAgICByZXR1cm4gYnl0ZXNTY2FubmVkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8U1NUYWJsZVJlYWRlcj4gZ2V0QmFja2luZ1NTVGFibGVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBJbW11dGFibGVTZXQub2Yoc3N0YWJsZSk7CisgICAgfQorCisgICAgcHVibGljIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNzdGFibGUubWV0YWRhdGEoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKKyAgICB7CisgICAgICAgIGlmIChpdGVyYXRvciA9PSBudWxsKQorICAgICAgICAgICAgaXRlcmF0b3IgPSBjcmVhdGVJdGVyYXRvcigpOworICAgICAgICByZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpOworICAgIH0KKworICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3IgbmV4dCgpCisgICAgeworICAgICAgICBpZiAoaXRlcmF0b3IgPT0gbnVsbCkKKyAgICAgICAgICAgIGl0ZXJhdG9yID0gY3JlYXRlSXRlcmF0b3IoKTsKKyAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLm5leHQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBJIGNyZWF0ZUl0ZXJhdG9yKCkKKyAgICB7CisgICAgICAgIHRoaXMubGlzdGVuZXIub25TY2FubmluZ1N0YXJ0ZWQoc3N0YWJsZSk7CisgICAgICAgIHJldHVybiBkb0NyZWF0ZUl0ZXJhdG9yKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IEkgZG9DcmVhdGVJdGVyYXRvcigpOworCisgICAgcHJpdmF0ZSB2b2lkIG1hcmtTY2FubmVkKCkKKyAgICB7CisgICAgICAgIGlmIChzdGFydFNjYW4gIT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVzU2Nhbm5lZCArPSBkZmlsZS5nZXRGaWxlUG9pbnRlcigpIC0gc3RhcnRTY2FuOworICAgICAgICAgICAgc3RhcnRTY2FuID0gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlcyhkZmlsZT0lcyBzc3RhYmxlPSVzKSIsIGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLCBkZmlsZSwgc3N0YWJsZSk7CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VLZXlTY2FubmluZ0l0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RJdGVyYXRvcjxVbmZpbHRlcmVkUm93SXRlcmF0b3I+CisgICAgeworICAgICAgICBwcm90ZWN0ZWQgRGVjb3JhdGVkS2V5IGN1cnJlbnRLZXk7CisgICAgICAgIHByb3RlY3RlZCBFIGN1cnJlbnRFbnRyeTsKKyAgICAgICAgcHJpdmF0ZSBMYXppbHlJbml0aWFsaXplZFVuZmlsdGVyZWRSb3dJdGVyYXRvciBjdXJyZW50Um93SXRlcmF0b3I7CisKKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gcHJlcGFyZVRvSXRlcmF0ZVJvdygpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGdldFJvd0l0ZXJhdG9yKEUgaW5kZXhFbnRyeSwgRGVjb3JhdGVkS2V5IGtleSkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkUm93SXRlcmF0b3IgY29tcHV0ZU5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3VycmVudFJvd0l0ZXJhdG9yICE9IG51bGwgJiYgY3VycmVudFJvd0l0ZXJhdG9yLmlzT3BlbigpICYmIGN1cnJlbnRSb3dJdGVyYXRvci5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIFVuZmlsdGVyZWRSb3dJdGVyYXRvciByZXR1cm5lZCBieSB0aGUgbGFzdCBjYWxsIHRvIG5leHQoKSB3YXMgaW5pdGlhbGl6ZWQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0IG11c3QgYmUgY2xvc2VkIGJlZm9yZSBjYWxsaW5nIGhhc05leHQoKSBvciBuZXh0KCkgYWdhaW4uIik7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hcmtTY2FubmVkKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIXByZXBhcmVUb0l0ZXJhdGVSb3coKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuZE9mRGF0YSgpOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBGb3IgYSBnaXZlbiBwYXJ0aXRpb24ga2V5LCB3ZSB3YW50IHRvIGF2b2lkIGhpdHRpbmcgdGhlIGRhdGEgZmlsZSB1bmxlc3Mgd2UncmUgZXhwbGljaXRseSBhc2tlZC4KKyAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIGltcG9ydGFudCBmb3IgUGFydGl0aW9uUmFuZ2VSZWFkQ29tbWFuZCNjaGVja0NhY2hlRmlsdGVyLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50Um93SXRlcmF0b3IgPSBuZXcgTGF6aWx5SW5pdGlhbGl6ZWRVbmZpbHRlcmVkUm93SXRlcmF0b3IoY3VycmVudEtleSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFN0b3JlIGN1cnJlbnRFbnRyeSByZWZlcmVuY2UgZHVyaW5nIG9iamVjdCBpbnN0YW50aWF0aW9uIGFzIGxhdGVyIChkdXJpbmcgaW5pdGlhbGl6ZSkgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBtYXkgcG9pbnQgdG8gYSBkaWZmZXJlbnQgZW50cnkuCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgZmluYWwgRSByb3dJbmRleEVudHJ5ID0gY3VycmVudEVudHJ5OworCisgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkUm93SXRlcmF0b3IgaW5pdGlhbGl6ZUl0ZXJhdG9yKCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTY2FuID0gcm93SW5kZXhFbnRyeS5wb3NpdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Um93SXRlcmF0b3Iocm93SW5kZXhFbnRyeSwgcGFydGl0aW9uS2V5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIHwgSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLm1hcmtTdXNwZWN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKGUsIHNzdGFibGUuZ2V0RmlsZW5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIHwgSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzc3RhYmxlLm1hcmtTdXNwZWN0KCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKGUsIHNzdGFibGUuZ2V0RmlsZW5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TU1RhYmxlV3JpdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TU1RhYmxlV3JpdGVyLmphdmEKaW5kZXggZjgyYTdjMi4uMjU1ZTFjZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU1NUYWJsZVdyaXRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NTVGFibGVXcml0ZXIuamF2YQpAQCAtMTgsNDggKzE4LDQ3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQ7CiAKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25QdXJnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93SW5kZXhFbnRyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzLkd1YXJkcmFpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZU5ld1RyYWNrZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Db21wbGV4Q29sdW1uRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvdzsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkFic3RyYWN0Qm91bmRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5JbmRleDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU1dyaXRlRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFJvd0luZGV4RW50cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVGbHVzaE9ic2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVplcm9Db3B5V3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29sbGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YVR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5TdGF0c01ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5NbWFwcGVkUmVnaW9uc0NhY2hlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRocm93YWJsZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5UcmFuc2FjdGlvbmFsOwogCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKIC8qKgotICogVGhpcyBpcyB0aGUgQVBJIGFsbCB0YWJsZSB3cml0ZXJzIG11c3QgaW1wbGVtZW50LgotICoKLSAqIFRhYmxlV3JpdGVyLmNyZWF0ZSgpIGlzIHRoZSBwcmltYXJ5IHdheSB0byBjcmVhdGUgYSB3cml0ZXIgZm9yIGEgcGFydGljdWxhciBmb3JtYXQuCi0gKiBUaGUgZm9ybWF0IGluZm9ybWF0aW9uIGlzIHBhcnQgb2YgdGhlIERlc2NyaXB0b3IuCisgKiBBIHJvb3QgY2xhc3MgZm9yIGEgd3JpdGVyIGltcGxlbWVudGF0aW9uLiBBIHdyaXRlciBtdXN0IGJlIGNyZWF0ZWQgYnkgcGFzc2luZyBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYworICoge0BsaW5rIEJ1aWxkZXJ9LCBhIHtAbGluayBMaWZlY3ljbGVOZXdUcmFja2VyfSBhbmQge0BsaW5rIFNTVGFibGUuT3duZXJ9IGluc3RhbmNlcy4gSW1wbGVtZW50aW5nIGNsYXNzZXMgc2hvdWxkCisgKiBub3QgZXh0ZW5kIHRoYXQgbGlzdCBhbmQgYWxsIHRoZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBidWlsZGVyLgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU1NUYWJsZVdyaXRlciBleHRlbmRzIFNTVGFibGUgaW1wbGVtZW50cyBUcmFuc2FjdGlvbmFsCiB7CkBAIC02OSwxNDMgKzY4LDU3IEBACiAgICAgcHJvdGVjdGVkIGxvbmcgbWF4RGF0YUFnZSA9IC0xOwogICAgIHByb3RlY3RlZCBmaW5hbCBsb25nIGtleUNvdW50OwogICAgIHByb3RlY3RlZCBmaW5hbCBNZXRhZGF0YUNvbGxlY3RvciBtZXRhZGF0YUNvbGxlY3RvcjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgUm93SW5kZXhFbnRyeS5JbmRleFNlcmlhbGl6ZXIgcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXI7CiAgICAgcHJvdGVjdGVkIGZpbmFsIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyOwotICAgIHByb3RlY3RlZCBmaW5hbCBUcmFuc2FjdGlvbmFsUHJveHkgdHhuUHJveHkgPSB0eG5Qcm94eSgpOwogICAgIHByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uPFNTVGFibGVGbHVzaE9ic2VydmVyPiBvYnNlcnZlcnM7CisgICAgcHJvdGVjdGVkIGZpbmFsIE1tYXBwZWRSZWdpb25zQ2FjaGUgbW1hcHBlZFJlZ2lvbnNDYWNoZTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgVHJhbnNhY3Rpb25hbFByb3h5IHR4blByb3h5ID0gdHhuUHJveHkoKTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgTGlmZWN5Y2xlTmV3VHJhY2tlciBsaWZlY3ljbGVOZXdUcmFja2VyOworICAgIHByb3RlY3RlZCBEZWNvcmF0ZWRLZXkgZmlyc3Q7CisgICAgcHJvdGVjdGVkIERlY29yYXRlZEtleSBsYXN0OwogCisgICAgLyoqCisgICAgICogVGhlIGltcGxlbWVudGluZyBtZXRob2Qgc2hvdWxkIHJldHVybiBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgVHJhbnNhY3Rpb25hbFByb3h5fSBpbml0aWFsaXplZCB3aXRoIGEgbGlzdCBvZiBhbGwKKyAgICAgKiB0cmFuc2FjdGlvbmFsIHJlc291cmNlcyBpbmNsdWRlZCBpbiB0aGlzIHdyaXRlci4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVHJhbnNhY3Rpb25hbFByb3h5IHR4blByb3h5KCk7CiAKLSAgICAvLyBkdWUgdG8gbGFjayBvZiBtdWx0aXBsZSBpbmhlcml0YW5jZSwgd2UgdXNlIGFuIGlubmVyIGNsYXNzIHRvIHByb3h5IG91ciBUcmFuc2FjdGlvbmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgY2xhc3MgVHJhbnNhY3Rpb25hbFByb3h5IGV4dGVuZHMgQWJzdHJhY3RUcmFuc2FjdGlvbmFsCisgICAgcHJvdGVjdGVkIFNTVGFibGVXcml0ZXIoQnVpbGRlcjw/LCA/PiBidWlsZGVyLCBMaWZlY3ljbGVOZXdUcmFja2VyIGxpZmVjeWNsZU5ld1RyYWNrZXIsIFNTVGFibGUuT3duZXIgb3duZXIpCiAgICAgewotICAgICAgICAvLyBzaG91bGQgYmUgc2V0IGR1cmluZyBkb1ByZXBhcmUoKQotICAgICAgICBwcm90ZWN0ZWQgU1NUYWJsZVJlYWRlciBmaW5hbFJlYWRlcjsKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gb3BlblJlc3VsdDsKKyAgICAgICAgc3VwZXIoYnVpbGRlciwgb3duZXIpOworICAgICAgICBjaGVja05vdE51bGwoYnVpbGRlci5nZXRGbHVzaE9ic2VydmVycygpKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGJ1aWxkZXIuZ2V0TWV0YWRhdGFDb2xsZWN0b3IoKSk7CisgICAgICAgIGNoZWNrTm90TnVsbChidWlsZGVyLmdldFNlcmlhbGl6YXRpb25IZWFkZXIoKSk7CisKKyAgICAgICAgdGhpcy5rZXlDb3VudCA9IGJ1aWxkZXIuZ2V0S2V5Q291bnQoKTsKKyAgICAgICAgdGhpcy5yZXBhaXJlZEF0ID0gYnVpbGRlci5nZXRSZXBhaXJlZEF0KCk7CisgICAgICAgIHRoaXMucGVuZGluZ1JlcGFpciA9IGJ1aWxkZXIuZ2V0UGVuZGluZ1JlcGFpcigpOworICAgICAgICB0aGlzLmlzVHJhbnNpZW50ID0gYnVpbGRlci5pc1RyYW5zaWVudFNTVGFibGUoKTsKKyAgICAgICAgdGhpcy5tZXRhZGF0YUNvbGxlY3RvciA9IGJ1aWxkZXIuZ2V0TWV0YWRhdGFDb2xsZWN0b3IoKTsKKyAgICAgICAgdGhpcy5oZWFkZXIgPSBidWlsZGVyLmdldFNlcmlhbGl6YXRpb25IZWFkZXIoKTsKKyAgICAgICAgdGhpcy5vYnNlcnZlcnMgPSBidWlsZGVyLmdldEZsdXNoT2JzZXJ2ZXJzKCk7CisgICAgICAgIHRoaXMubW1hcHBlZFJlZ2lvbnNDYWNoZSA9IGJ1aWxkZXIuZ2V0TW1hcHBlZFJlZ2lvbnNDYWNoZSgpOworICAgICAgICB0aGlzLmxpZmVjeWNsZU5ld1RyYWNrZXIgPSBsaWZlY3ljbGVOZXdUcmFja2VyOworCisgICAgICAgIGxpZmVjeWNsZU5ld1RyYWNrZXIudHJhY2tOZXcodGhpcyk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFNTVGFibGVXcml0ZXIoRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcga2V5Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyByZXBhaXJlZEF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVVUlEIHBlbmRpbmdSZXBhaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1RyYW5zaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhQ29sbGVjdG9yIG1ldGFkYXRhQ29sbGVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248U1NUYWJsZUZsdXNoT2JzZXJ2ZXI+IG9ic2VydmVycykKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRGVjb3JhdGVkS2V5IGdldEZpcnN0KCkKICAgICB7Ci0gICAgICAgIHN1cGVyKGRlc2NyaXB0b3IsIGNvbXBvbmVudHMobWV0YWRhdGEuZ2V0TG9jYWwoKSksIG1ldGFkYXRhLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0RGlza09wdGltaXphdGlvblN0cmF0ZWd5KCkpOwotICAgICAgICB0aGlzLmtleUNvdW50ID0ga2V5Q291bnQ7Ci0gICAgICAgIHRoaXMucmVwYWlyZWRBdCA9IHJlcGFpcmVkQXQ7Ci0gICAgICAgIHRoaXMucGVuZGluZ1JlcGFpciA9IHBlbmRpbmdSZXBhaXI7Ci0gICAgICAgIHRoaXMuaXNUcmFuc2llbnQgPSBpc1RyYW5zaWVudDsKLSAgICAgICAgdGhpcy5tZXRhZGF0YUNvbGxlY3RvciA9IG1ldGFkYXRhQ29sbGVjdG9yOwotICAgICAgICB0aGlzLmhlYWRlciA9IGhlYWRlcjsKLSAgICAgICAgdGhpcy5yb3dJbmRleEVudHJ5U2VyaWFsaXplciA9IGRlc2NyaXB0b3IudmVyc2lvbi5nZXRTU1RhYmxlRm9ybWF0KCkuZ2V0SW5kZXhTZXJpYWxpemVyKG1ldGFkYXRhLmdldCgpLCBkZXNjcmlwdG9yLnZlcnNpb24sIGhlYWRlcik7Ci0gICAgICAgIHRoaXMub2JzZXJ2ZXJzID0gb2JzZXJ2ZXJzID09IG51bGwgPyBDb2xsZWN0aW9ucy5lbXB0eVNldCgpIDogb2JzZXJ2ZXJzOworICAgICAgICByZXR1cm4gZmlyc3Q7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBTU1RhYmxlV3JpdGVyIGNyZWF0ZShEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nIGtleUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZyByZXBhaXJlZEF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVVSUQgcGVuZGluZ1JlcGFpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNUcmFuc2llbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGFDb2xsZWN0b3IgbWV0YWRhdGFDb2xsZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248SW5kZXg+IGluZGV4ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWZlY3ljbGVOZXdUcmFja2VyIGxpZmVjeWNsZU5ld1RyYWNrZXIpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIERlY29yYXRlZEtleSBnZXRMYXN0KCkKICAgICB7Ci0gICAgICAgIEZhY3Rvcnkgd3JpdGVyRmFjdG9yeSA9IGRlc2NyaXB0b3IuZ2V0Rm9ybWF0KCkuZ2V0V3JpdGVyRmFjdG9yeSgpOwotICAgICAgICByZXR1cm4gd3JpdGVyRmFjdG9yeS5vcGVuKGRlc2NyaXB0b3IsIGtleUNvdW50LCByZXBhaXJlZEF0LCBwZW5kaW5nUmVwYWlyLCBpc1RyYW5zaWVudCwgbWV0YWRhdGEsIG1ldGFkYXRhQ29sbGVjdG9yLCBoZWFkZXIsIG9ic2VydmVycyhkZXNjcmlwdG9yLCBpbmRleGVzLCBsaWZlY3ljbGVOZXdUcmFja2VyLm9wVHlwZSgpKSwgbGlmZWN5Y2xlTmV3VHJhY2tlcik7CisgICAgICAgIHJldHVybiBsYXN0OwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZVdyaXRlciBjcmVhdGUoRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBrZXlDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcmVwYWlyZWRBdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVVUlEIHBlbmRpbmdSZXBhaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzVHJhbnNpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNzdGFibGVMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxJbmRleD4gaW5kZXhlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpZmVjeWNsZU5ld1RyYWNrZXIgbGlmZWN5Y2xlTmV3VHJhY2tlcikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWJzdHJhY3RCb3VuZHM8VG9rZW4+IGdldEJvdW5kcygpCiAgICAgewotICAgICAgICBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhID0gU2NoZW1hLmluc3RhbmNlLmdldFRhYmxlTWV0YWRhdGFSZWYoZGVzY3JpcHRvcik7Ci0gICAgICAgIHJldHVybiBjcmVhdGUobWV0YWRhdGEsIGRlc2NyaXB0b3IsIGtleUNvdW50LCByZXBhaXJlZEF0LCBwZW5kaW5nUmVwYWlyLCBpc1RyYW5zaWVudCwgc3N0YWJsZUxldmVsLCBoZWFkZXIsIGluZGV4ZXMsIGxpZmVjeWNsZU5ld1RyYWNrZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZVdyaXRlciBjcmVhdGUoVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcga2V5Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHJlcGFpcmVkQXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVVVJRCBwZW5kaW5nUmVwYWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1RyYW5zaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzc3RhYmxlTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248SW5kZXg+IGluZGV4ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWZlY3ljbGVOZXdUcmFja2VyIGxpZmVjeWNsZU5ld1RyYWNrZXIpCi0gICAgewotICAgICAgICBNZXRhZGF0YUNvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgTWV0YWRhdGFDb2xsZWN0b3IobWV0YWRhdGEuZ2V0KCkuY29tcGFyYXRvcikuc3N0YWJsZUxldmVsKHNzdGFibGVMZXZlbCk7Ci0gICAgICAgIHJldHVybiBjcmVhdGUoZGVzY3JpcHRvciwga2V5Q291bnQsIHJlcGFpcmVkQXQsIHBlbmRpbmdSZXBhaXIsIGlzVHJhbnNpZW50LCBtZXRhZGF0YSwgY29sbGVjdG9yLCBoZWFkZXIsIGluZGV4ZXMsIGxpZmVjeWNsZU5ld1RyYWNrZXIpOwotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZVdyaXRlciBjcmVhdGUoRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBrZXlDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcmVwYWlyZWRBdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVVUlEIHBlbmRpbmdSZXBhaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzVHJhbnNpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPEluZGV4PiBpbmRleGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlmZWN5Y2xlTmV3VHJhY2tlciBsaWZlY3ljbGVOZXdUcmFja2VyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZShkZXNjcmlwdG9yLCBrZXlDb3VudCwgcmVwYWlyZWRBdCwgcGVuZGluZ1JlcGFpciwgaXNUcmFuc2llbnQsIDAsIGhlYWRlciwgaW5kZXhlcywgbGlmZWN5Y2xlTmV3VHJhY2tlcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyhUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKQotICAgIHsKLSAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IG5ldyBIYXNoU2V0PENvbXBvbmVudD4oQXJyYXlzLmFzTGlzdChDb21wb25lbnQuREFUQSwKLSAgICAgICAgICAgICAgICBDb21wb25lbnQuUFJJTUFSWV9JTkRFWCwKLSAgICAgICAgICAgICAgICBDb21wb25lbnQuU1RBVFMsCi0gICAgICAgICAgICAgICAgQ29tcG9uZW50LlNVTU1BUlksCi0gICAgICAgICAgICAgICAgQ29tcG9uZW50LlRPQywKLSAgICAgICAgICAgICAgICBDb21wb25lbnQuRElHRVNUKSk7Ci0KLSAgICAgICAgaWYgKG1ldGFkYXRhLnBhcmFtcy5ibG9vbUZpbHRlckZwQ2hhbmNlIDwgMS4wKQotICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoQ29tcG9uZW50LkZJTFRFUik7Ci0KLSAgICAgICAgaWYgKG1ldGFkYXRhLnBhcmFtcy5jb21wcmVzc2lvbi5pc0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoQ29tcG9uZW50LkNPTVBSRVNTSU9OX0lORk8pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy8gaXQgd291bGQgZmVlbCBzYWZlciB0byBhY3R1YWxseSBhZGQgdGhpcyBjb21wb25lbnQgbGF0ZXIgaW4gbWF5YmVXcml0ZURpZ2VzdCgpLAotICAgICAgICAgICAgLy8gYnV0IHRoZSBjb21wb25lbnRzIGFyZSB1bm1vZGlmaWFibGUgYWZ0ZXIgY29uc3RydWN0aW9uCi0gICAgICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnQuQ1JDKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29tcG9uZW50czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPFNTVGFibGVGbHVzaE9ic2VydmVyPiBvYnNlcnZlcnMoRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPEluZGV4PiBpbmRleGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUpCi0gICAgewotICAgICAgICBpZiAoaW5kZXhlcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCi0gICAgICAgIExpc3Q8U1NUYWJsZUZsdXNoT2JzZXJ2ZXI+IG9ic2VydmVycyA9IG5ldyBBcnJheUxpc3Q8PihpbmRleGVzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoSW5kZXggaW5kZXggOiBpbmRleGVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBTU1RhYmxlRmx1c2hPYnNlcnZlciBvYnNlcnZlciA9IGluZGV4LmdldEZsdXNoT2JzZXJ2ZXIoZGVzY3JpcHRvciwgb3BlcmF0aW9uVHlwZSk7Ci0gICAgICAgICAgICBpZiAob2JzZXJ2ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvYnNlcnZlci5iZWdpbigpOwotICAgICAgICAgICAgICAgIG9ic2VydmVycy5hZGQob2JzZXJ2ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEltbXV0YWJsZUxpc3QuY29weU9mKG9ic2VydmVycyk7CisgICAgICAgIHJldHVybiAoZmlyc3QgIT0gbnVsbCAmJiBsYXN0ICE9IG51bGwpID8gQWJzdHJhY3RCb3VuZHMuYm91bmRzKGZpcnN0LmdldFRva2VuKCksIHRydWUsIGxhc3QuZ2V0VG9rZW4oKSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsOwogICAgIH0KIAogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG1hcmsoKTsKQEAgLTIxNyw0NCArMTMwLDYyIEBACiAgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBpbmRleCBlbnRyeSBpZiBzb21ldGhpbmcgd2FzIHdyaXR0ZW4sIHRoYXQgaXMgaWYge0Bjb2RlIGl0ZXJhdG9yfQogICAgICAqIHdhc24ndCBlbXB0eSwge0Bjb2RlIG51bGx9IG90aGVyd2lzZS4KICAgICAgKgotICAgICAqIEB0aHJvd3MgRlNXcml0ZUVycm9yIGlmIGEgd3JpdGUgdG8gdGhlIGRhdGFGaWxlIGZhaWxzCisgICAgICogQHRocm93cyBGU1dyaXRlRXJyb3IgaWYgd3JpdGluZyB0byB0aGUgZGF0YUZpbGUgZmFpbHMKICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgUm93SW5kZXhFbnRyeSBhcHBlbmQoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yKTsKKyAgICBwdWJsaWMgYWJzdHJhY3QgQWJzdHJhY3RSb3dJbmRleEVudHJ5IGFwcGVuZChVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3IpOwogCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHBvc2l0aW9uIGluIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAtIGZvciB1bmNvbXByZXNzZWQgZmlsZXMgaXQgaXMgdGhlIHNhbWUgYXMge0BsaW5rICNnZXRPbkRpc2tGaWxlUG9pbnRlcigpfQorICAgICAqIGJ1dCBmb3IgY29tcHJlc3NlZCBmaWxlcyBpdCByZXR1cm5zIGEgcG9zaXRpb24gaW4gdGhlIGRhdGEgcmF0aGVyIHRoYW4gYSBwb3NpdGlvbiBpbiB0aGUgZmlsZSBvbiBkaXNrLgorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBsb25nIGdldEZpbGVQb2ludGVyKCk7CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcG9zaXRpb24gaW4gdGhlIChjb21wcmVzc2VkKSBkYXRhIGZpbGUgb24gZGlzay4gU2VlIHtAbGluayAjZ2V0RmlsZVBvaW50ZXIoKX0KKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRPbkRpc2tGaWxlUG9pbnRlcigpOwogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYW1vdW50IG9mIGRhdGEgYWxyZWFkeSB3cml0dGVuIHRvIGRpc2sgdGhhdCBtYXkgbm90IGJlIGFjY3VyYXRlIChmb3IgZXhhbXBsZSwgdGhlIHBvc2l0aW9uIGFmdGVyCisgICAgICogdGhlIHJlY2VudGx5IGZsdXNoZWQgY2h1bmspLgorICAgICAqLwogICAgIHB1YmxpYyBsb25nIGdldEVzdGltYXRlZE9uRGlza0J5dGVzV3JpdHRlbigpCiAgICAgewogICAgICAgICByZXR1cm4gZ2V0T25EaXNrRmlsZVBvaW50ZXIoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXNldCB0aGUgZGF0YSBmaWxlIHRvIHRoZSBtYXJrZWQgcG9zaXRpb24gKHNlZSB7QGxpbmsgI21hcmsoKX0pIGFuZCB0cnVuY2F0ZSB0aGUgcmVzdCBvZiB0aGUgZmlsZS4KKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZXNldEFuZFRydW5jYXRlKCk7CiAKLSAgICBwdWJsaWMgU1NUYWJsZVdyaXRlciBzZXRSZXBhaXJlZEF0KGxvbmcgcmVwYWlyZWRBdCkKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXBhaXJlZEF0KGxvbmcgcmVwYWlyZWRBdCkKICAgICB7CiAgICAgICAgIGlmIChyZXBhaXJlZEF0ID4gMCkKICAgICAgICAgICAgIHRoaXMucmVwYWlyZWRBdCA9IHJlcGFpcmVkQXQ7Ci0gICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAotICAgIHB1YmxpYyBTU1RhYmxlV3JpdGVyIHNldE1heERhdGFBZ2UobG9uZyBtYXhEYXRhQWdlKQorICAgIHB1YmxpYyB2b2lkIHNldE1heERhdGFBZ2UobG9uZyBtYXhEYXRhQWdlKQogICAgIHsKICAgICAgICAgdGhpcy5tYXhEYXRhQWdlID0gbWF4RGF0YUFnZTsKLSAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCi0gICAgcHVibGljIFNTVGFibGVXcml0ZXIgc2V0T3BlblJlc3VsdChib29sZWFuIG9wZW5SZXN1bHQpCisgICAgcHVibGljIHZvaWQgc2V0T3BlblJlc3VsdChib29sZWFuIG9wZW5SZXN1bHQpCiAgICAgewogICAgICAgICB0eG5Qcm94eS5vcGVuUmVzdWx0ID0gb3BlblJlc3VsdDsKLSAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogT3BlbiB0aGUgcmVzdWx0YW50IFNTVGFibGVSZWFkZXIgYmVmb3JlIGl0IGhhcyBiZWVuIGZ1bGx5IHdyaXR0ZW4KKyAgICAgKiBPcGVuIHRoZSByZXN1bHRhbnQgU1NUYWJsZVJlYWRlciBiZWZvcmUgaXQgaGFzIGJlZW4gZnVsbHkgd3JpdHRlbi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcGFzc2VkIGNvbnN1bWVyIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIG5lY2Vzc2FyeSBkYXRhIGhhcyBiZWVuIGZsdXNoZWQgdG8gZGlzay9jYWNoZS4gVGhpcyBtYXkgbmV2ZXIgaGFwcGVuCisgICAgICogKGUuZy4gaWYgdGhlIHRhYmxlIHdhcyBmaW5pc2hlZCBiZWZvcmUgdGhlIGZsdXNoZXMgbWF0ZXJpYWxpemVkLCBvciBpZiB0aGlzIGNhbGwgcmV0dXJucyBmYWxzZSBlLmcuIGlmIGEgdGFibGUKKyAgICAgKiB3YXMgYWxyZWFkeSBwcmVwYXJlZCBidXQgaGFzbid0IHJlYWNoZWQgcmVhZGluZXNzIHlldCkuCisgICAgICogPHA+CisgICAgICogVXNlcyBjYWxsYmFjayBpbnN0ZWFkIG9mIGZ1dHVyZSBiZWNhdXNlIHByZXBhcmF0aW9uIGFuZCBjYWxsYmFjayBoYXBwZW4gb24gdGhlIHNhbWUgdGhyZWFkLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTU1RhYmxlUmVhZGVyIG9wZW5FYXJseSgpOworCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgb3BlbkVhcmx5KENvbnN1bWVyPFNTVGFibGVSZWFkZXI+IGRvV2hlblJlYWR5KTsKIAogICAgIC8qKgogICAgICAqIE9wZW4gdGhlIHJlc3VsdGFudCBTU1RhYmxlUmVhZGVyIG9uY2UgaXQgaGFzIGJlZW4gZnVsbHkgd3JpdHRlbiwgYnV0IGJlZm9yZSB0aGUKQEAgLTI2MiwxNyArMTkzLDExIEBACiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNTVGFibGVSZWFkZXIgb3BlbkZpbmFsRWFybHkoKTsKIAotICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyIGZpbmlzaChsb25nIHJlcGFpcmVkQXQsIGxvbmcgbWF4RGF0YUFnZSwgYm9vbGVhbiBvcGVuUmVzdWx0KQotICAgIHsKLSAgICAgICAgaWYgKHJlcGFpcmVkQXQgPiAwKQotICAgICAgICAgICAgdGhpcy5yZXBhaXJlZEF0ID0gcmVwYWlyZWRBdDsKLSAgICAgICAgdGhpcy5tYXhEYXRhQWdlID0gbWF4RGF0YUFnZTsKLSAgICAgICAgcmV0dXJuIGZpbmlzaChvcGVuUmVzdWx0KTsKLSAgICB9CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFNTVGFibGVSZWFkZXIgb3BlbkZpbmFsKFNTVGFibGVSZWFkZXIuT3BlblJlYXNvbiBvcGVuUmVhc29uKTsKIAogICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyIGZpbmlzaChib29sZWFuIG9wZW5SZXN1bHQpCiAgICAgewotICAgICAgICBzZXRPcGVuUmVzdWx0KG9wZW5SZXN1bHQpOworICAgICAgICB0aGlzLnNldE9wZW5SZXN1bHQob3BlblJlc3VsdCk7CiAgICAgICAgIHR4blByb3h5LmZpbmlzaCgpOwogICAgICAgICBvYnNlcnZlcnMuZm9yRWFjaChTU1RhYmxlRmx1c2hPYnNlcnZlcjo6Y29tcGxldGUpOwogICAgICAgICByZXR1cm4gZmluaXNoZWQoKTsKQEAgLTI4NCw2ICsyMDksNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyIGZpbmlzaGVkKCkKICAgICB7CisgICAgICAgIHR4blByb3h5LmZpbmFsUmVhZGVyQWNjZXNzZWQgPSB0cnVlOwogICAgICAgICByZXR1cm4gdHhuUHJveHkuZmluYWxSZWFkZXI7CiAgICAgfQogCkBAIC0zMjcsNyArMjUzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwYWlyZWRBdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1JlcGFpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUcmFuc2llbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QucmV0YWluYWJsZSgpLmdldEtleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0LnJldGFpbmFibGUoKS5nZXRLZXkoKSk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIFN0YXRzTWV0YWRhdGEgc3RhdHNNZXRhZGF0YSgpCkBAIC0zNDAsNTAgKzI2OCw4IEBACiAgICAgICAgIG1ldGFkYXRhQ29sbGVjdG9yLnJlbGVhc2UoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVuYW1lKERlc2NyaXB0b3IgdG1wZGVzYywgRGVzY3JpcHRvciBuZXdkZXNjLCBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzKQotICAgIHsKLSAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogU2V0cy5kaWZmZXJlbmNlKGNvbXBvbmVudHMsIFNldHMubmV3SGFzaFNldChDb21wb25lbnQuREFUQSwgQ29tcG9uZW50LlNVTU1BUlkpKSkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZVV0aWxzLnJlbmFtZVdpdGhDb25maXJtKHRtcGRlc2MuZmlsZW5hbWVGb3IoY29tcG9uZW50KSwgbmV3ZGVzYy5maWxlbmFtZUZvcihjb21wb25lbnQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRvIC1EYXRhIGxhc3QgYmVjYXVzZSAtRGF0YSBwcmVzZW50IHNob3VsZCBtZWFuIHRoZSBzc3RhYmxlIHdhcyBjb21wbGV0ZWx5IHJlbmFtZWQgYmVmb3JlIGNyYXNoCi0gICAgICAgIEZpbGVVdGlscy5yZW5hbWVXaXRoQ29uZmlybSh0bXBkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSwgbmV3ZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpOwotCi0gICAgICAgIC8vIHJlbmFtZSBpdCB3aXRob3V0IGNvbmZpcm1hdGlvbiBiZWNhdXNlIHN1bW1hcnkgY2FuIGJlIGF2YWlsYWJsZSBmb3IgbG9hZE5ld1NTVGFibGVzIGJ1dCBub3QgZm9yIGNsb3NlQW5kT3BlblJlYWRlcgotICAgICAgICBGaWxlVXRpbHMucmVuYW1lV2l0aE91dENvbmZpcm0odG1wZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuU1VNTUFSWSksIG5ld2Rlc2MuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlNVTU1BUlkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weShEZXNjcmlwdG9yIHRtcGRlc2MsIERlc2NyaXB0b3IgbmV3ZGVzYywgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cykKLSAgICB7Ci0gICAgICAgIGZvciAoQ29tcG9uZW50IGNvbXBvbmVudCA6IFNldHMuZGlmZmVyZW5jZShjb21wb25lbnRzLCBTZXRzLm5ld0hhc2hTZXQoQ29tcG9uZW50LkRBVEEsIENvbXBvbmVudC5TVU1NQVJZKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5V2l0aENvbmZpcm0odG1wZGVzYy5maWxlbmFtZUZvcihjb21wb25lbnQpLCBuZXdkZXNjLmZpbGVuYW1lRm9yKGNvbXBvbmVudCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZG8gLURhdGEgbGFzdCBiZWNhdXNlIC1EYXRhIHByZXNlbnQgc2hvdWxkIG1lYW4gdGhlIHNzdGFibGUgd2FzIGNvbXBsZXRlbHkgY29waWVkIGJlZm9yZSBjcmFzaAotICAgICAgICBGaWxlVXRpbHMuY29weVdpdGhDb25maXJtKHRtcGRlc2MuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpLCBuZXdkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSk7Ci0KLSAgICAgICAgLy8gY29weSBpdCB3aXRob3V0IGNvbmZpcm1hdGlvbiBiZWNhdXNlIHN1bW1hcnkgY2FuIGJlIGF2YWlsYWJsZSBmb3IgbG9hZE5ld1NTVGFibGVzIGJ1dCBub3QgZm9yIGNsb3NlQW5kT3BlblJlYWRlcgotICAgICAgICBGaWxlVXRpbHMuY29weVdpdGhPdXRDb25maXJtKHRtcGRlc2MuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlNVTU1BUlkpLCBuZXdkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5TVU1NQVJZKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGhhcmRsaW5rKERlc2NyaXB0b3IgdG1wZGVzYywgRGVzY3JpcHRvciBuZXdkZXNjLCBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzKQotICAgIHsKLSAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogU2V0cy5kaWZmZXJlbmNlKGNvbXBvbmVudHMsIFNldHMubmV3SGFzaFNldChDb21wb25lbnQuREFUQSwgQ29tcG9uZW50LlNVTU1BUlkpKSkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNyZWF0ZUhhcmRMaW5rV2l0aENvbmZpcm0odG1wZGVzYy5maWxlbmFtZUZvcihjb21wb25lbnQpLCBuZXdkZXNjLmZpbGVuYW1lRm9yKGNvbXBvbmVudCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZG8gLURhdGEgbGFzdCBiZWNhdXNlIC1EYXRhIHByZXNlbnQgc2hvdWxkIG1lYW4gdGhlIHNzdGFibGUgd2FzIGNvbXBsZXRlbHkgY29waWVkIGJlZm9yZSBjcmFzaAotICAgICAgICBGaWxlVXRpbHMuY3JlYXRlSGFyZExpbmtXaXRoQ29uZmlybSh0bXBkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSwgbmV3ZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpOwotCi0gICAgICAgIC8vIGNvcHkgaXQgd2l0aG91dCBjb25maXJtYXRpb24gYmVjYXVzZSBzdW1tYXJ5IGNhbiBiZSBhdmFpbGFibGUgZm9yIGxvYWROZXdTU1RhYmxlcyBidXQgbm90IGZvciBjbG9zZUFuZE9wZW5SZWFkZXIKLSAgICAgICAgRmlsZVV0aWxzLmNyZWF0ZUhhcmRMaW5rV2l0aG91dENvbmZpcm0odG1wZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuU1VNTUFSWSksIG5ld2Rlc2MuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlNVTU1BUlkpKTsKLSAgICB9Ci0KICAgICAvKioKLSAgICAgKiBQYXJhbWV0ZXJzIGZvciBjYWxjdWxhdGluZyB0aGUgZXhwZWN0ZWQgc2l6ZSBvZiBhbiBzc3RhYmxlLiBFeHBvc2VkIG9uIG1lbXRhYmxlIGZsdXNoIHNldHMgKGkuZS4gY29sbGVjdGVkCisgICAgICogUGFyYW1ldGVycyBmb3IgY2FsY3VsYXRpbmcgdGhlIGV4cGVjdGVkIHNpemUgb2YgYW4gU1NUYWJsZS4gRXhwb3NlZCBvbiBtZW10YWJsZSBmbHVzaCBzZXRzIChpLmUuIGNvbGxlY3RlZAogICAgICAqIHN1YnNldHMgb2YgYSBtZW10YWJsZSB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0byBzc3RhYmxlcykuCiAgICAgICovCiAgICAgcHVibGljIGludGVyZmFjZSBTU1RhYmxlU2l6ZVBhcmFtZXRlcnMKQEAgLTM5Myw1OCArMjc5LDIyNSBAQAogICAgICAgICBsb25nIGRhdGFTaXplKCk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBGYWN0b3J5CisgICAgLy8gZHVlIHRvIGxhY2sgb2YgbXVsdGlwbGUgaW5oZXJpdGFuY2UsIHdlIHVzZSBhbiBpbm5lciBjbGFzcyB0byBwcm94eSBvdXIgVHJhbnNhY3Rpb25hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgICAgcHJvdGVjdGVkIGNsYXNzIFRyYW5zYWN0aW9uYWxQcm94eSBleHRlbmRzIEFic3RyYWN0VHJhbnNhY3Rpb25hbAogICAgIHsKLSAgICAgICAgcHVibGljIGFic3RyYWN0IGxvbmcgZXN0aW1hdGVTaXplKFNTVGFibGVTaXplUGFyYW1ldGVycyBwYXJhbWV0ZXJzKTsKKyAgICAgICAgLy8gc2hvdWxkIGJlIHNldCBkdXJpbmcgZG9QcmVwYXJlKCkKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdXBwbGllcjxJbW11dGFibGVMaXN0PFRyYW5zYWN0aW9uYWw+PiB0cmFuc2FjdGlvbmFsczsKIAotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgU1NUYWJsZVdyaXRlciBvcGVuKERlc2NyaXB0b3IgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGtleUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcmVwYWlyZWRBdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVVVJRCBwZW5kaW5nUmVwYWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNUcmFuc2llbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YUNvbGxlY3RvciBtZXRhZGF0YUNvbGxlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPFNTVGFibGVGbHVzaE9ic2VydmVyPiBvYnNlcnZlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlmZWN5Y2xlTmV3VHJhY2tlciBsaWZlY3ljbGVOZXdUcmFja2VyKTsKKyAgICAgICAgcHJpdmF0ZSBTU1RhYmxlUmVhZGVyIGZpbmFsUmVhZGVyOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gb3BlblJlc3VsdDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGZpbmFsUmVhZGVyQWNjZXNzZWQ7CisKKyAgICAgICAgcHVibGljIFRyYW5zYWN0aW9uYWxQcm94eShTdXBwbGllcjxJbW11dGFibGVMaXN0PFRyYW5zYWN0aW9uYWw+PiB0cmFuc2FjdGlvbmFscykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbmFscyA9IHRyYW5zYWN0aW9uYWxzOworICAgICAgICB9CisKKyAgICAgICAgLy8gZmluYWxpc2Ugb3VyIHN0YXRlIG9uIGRpc2ssIGluY2x1ZGluZyByZW5hbWluZworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb1ByZXBhcmUoKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc2FjdGlvbmFscy5nZXQoKS5mb3JFYWNoKFRyYW5zYWN0aW9uYWw6OnByZXBhcmVUb0NvbW1pdCk7CisgICAgICAgICAgICBuZXcgU3RhdHNDb21wb25lbnQoZmluYWxpemVNZXRhZGF0YSgpKS5zYXZlKGRlc2NyaXB0b3IpOworCisgICAgICAgICAgICAvLyBzYXZlIHRoZSB0YWJsZSBvZiBjb21wb25lbnRzCisgICAgICAgICAgICBUT0NDb21wb25lbnQuYXBwZW5kVE9DKGRlc2NyaXB0b3IsIGNvbXBvbmVudHMpOworCisgICAgICAgICAgICBpZiAob3BlblJlc3VsdCkKKyAgICAgICAgICAgICAgICBmaW5hbFJlYWRlciA9IG9wZW5GaW5hbChTU1RhYmxlUmVhZGVyLk9wZW5SZWFzb24uTk9STUFMKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBUaHJvd2FibGUgZG9Db21taXQoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoVHJhbnNhY3Rpb25hbCB0IDogdHJhbnNhY3Rpb25hbHMuZ2V0KCkucmV2ZXJzZSgpKQorICAgICAgICAgICAgICAgIGFjY3VtdWxhdGUgPSB0LmNvbW1pdChhY2N1bXVsYXRlKTsKKworICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGU7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgVGhyb3dhYmxlIGRvQWJvcnQoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoVHJhbnNhY3Rpb25hbCB0IDogdHJhbnNhY3Rpb25hbHMuZ2V0KCkpCisgICAgICAgICAgICAgICAgYWNjdW11bGF0ZSA9IHQuYWJvcnQoYWNjdW11bGF0ZSk7CisKKyAgICAgICAgICAgIGlmICghZmluYWxSZWFkZXJBY2Nlc3NlZCAmJiBmaW5hbFJlYWRlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFjY3VtdWxhdGUgPSBUaHJvd2FibGVzLnBlcmZvcm0oYWNjdW11bGF0ZSwgKCkgLT4gZmluYWxSZWFkZXIuc2VsZlJlZigpLnJlbGVhc2UoKSk7CisgICAgICAgICAgICAgICAgZmluYWxSZWFkZXIgPSBudWxsOworICAgICAgICAgICAgICAgIGZpbmFsUmVhZGVyQWNjZXNzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFRocm93YWJsZSBkb1Bvc3RDbGVhbnVwKFRocm93YWJsZSBhY2N1bXVsYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBhY2N1bXVsYXRlID0gc3VwZXIuZG9Qb3N0Q2xlYW51cChhY2N1bXVsYXRlKTsKKyAgICAgICAgICAgIGFjY3VtdWxhdGUgPSBUaHJvd2FibGVzLmNsb3NlKGFjY3VtdWxhdGUsIG1tYXBwZWRSZWdpb25zQ2FjaGUpOworICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGU7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZ3VhcmRDb2xsZWN0aW9uU2l6ZShUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5LCBVbmZpbHRlcmVkIHVuZmlsdGVyZWQpCisgICAgLyoqCisgICAgICogQSBidWlsZGVyIG9mIHRoaXMgc3N0YWJsZSB3cml0ZXIuIEl0IHNob3VsZCBiZSBleHRlbmRlZCBmb3IgZWFjaCBpbXBsZW1lbnRhdGlvbiB3aXRoIHRoZSBzcGVjaWZpYyBmaWVsZHMuCisgICAgICoKKyAgICAgKiBBbiBpbXBsZW1lbnRhdGlvbiBzaG91bGQgb3BlbiBhbGwgdGhlIHJlc291cmNlcyB3aGVuIHtAbGluayAjYnVpbGQoTGlmZWN5Y2xlTmV3VHJhY2tlciwgT3duZXIpfSBhbmQgcGFzcyB0aGVtCisgICAgICogaW4gYnVpbGRlciBmaWVsZHMgdG8gdGhlIHdyaXRlciwgc28gdGhhdCB0aGUgd3JpdGVyIGNhbiBhY2Nlc3MgdGhlbSB2aWEgZ2V0dGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8Vz4gdHlwZSBvZiB0aGUgc3N0YWJsZSB3cml0ZXIgdG8gYmUgYnVpbGQgd2l0aCB0aGlzIGJ1aWxkZXIKKyAgICAgKiBAcGFyYW0gPEI+IHR5cGUgb2YgdGhpcyBidWlsZGVyCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBCdWlsZGVyPFcgZXh0ZW5kcyBTU1RhYmxlV3JpdGVyLCBCIGV4dGVuZHMgQnVpbGRlcjxXLCBCPj4gZXh0ZW5kcyBTU1RhYmxlLkJ1aWxkZXI8VywgQj4KICAgICB7Ci0gICAgICAgIGlmICghR3VhcmRyYWlscy5jb2xsZWN0aW9uU2l6ZS5lbmFibGVkKCkgJiYgIUd1YXJkcmFpbHMuaXRlbXNQZXJDb2xsZWN0aW9uLmVuYWJsZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgcHJpdmF0ZSBNZXRhZGF0YUNvbGxlY3RvciBtZXRhZGF0YUNvbGxlY3RvcjsKKyAgICAgICAgcHJpdmF0ZSBsb25nIGtleUNvdW50OworICAgICAgICBwcml2YXRlIGxvbmcgcmVwYWlyZWRBdDsKKyAgICAgICAgcHJpdmF0ZSBUaW1lVVVJRCBwZW5kaW5nUmVwYWlyOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gdHJhbnNpZW50U1NUYWJsZTsKKyAgICAgICAgcHJpdmF0ZSBTZXJpYWxpemF0aW9uSGVhZGVyIHNlcmlhbGl6YXRpb25IZWFkZXI7CisgICAgICAgIHByaXZhdGUgQ29sbGVjdGlvbjxTU1RhYmxlRmx1c2hPYnNlcnZlcj4gZmx1c2hPYnNlcnZlcnM7CiAKLSAgICAgICAgaWYgKCF1bmZpbHRlcmVkLmlzUm93KCkgfHwgU2NoZW1hQ29uc3RhbnRzLmlzU3lzdGVtS2V5c3BhY2UobWV0YWRhdGEua2V5c3BhY2UpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIFJvdyByb3cgPSAoUm93KSB1bmZpbHRlcmVkOwotICAgICAgICBmb3IgKENvbHVtbk1ldGFkYXRhIGNvbHVtbiA6IHJvdy5jb2x1bW5zKCkpCisgICAgICAgIHB1YmxpYyBCIHNldE1ldGFkYXRhQ29sbGVjdG9yKE1ldGFkYXRhQ29sbGVjdG9yIG1ldGFkYXRhQ29sbGVjdG9yKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWNvbHVtbi50eXBlLmlzQ29sbGVjdGlvbigpIHx8ICFjb2x1bW4udHlwZS5pc011bHRpQ2VsbCgpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgdGhpcy5tZXRhZGF0YUNvbGxlY3RvciA9IG1ldGFkYXRhQ29sbGVjdG9yOworICAgICAgICAgICAgcmV0dXJuIChCKSB0aGlzOworICAgICAgICB9CiAKLSAgICAgICAgICAgIENvbXBsZXhDb2x1bW5EYXRhIGNlbGxzID0gcm93LmdldENvbXBsZXhDb2x1bW5EYXRhKGNvbHVtbik7Ci0gICAgICAgICAgICBpZiAoY2VsbHMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgcHVibGljIEIgc2V0S2V5Q291bnQobG9uZyBrZXlDb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5rZXlDb3VudCA9IGtleUNvdW50OworICAgICAgICAgICAgcmV0dXJuIChCKSB0aGlzOworICAgICAgICB9CiAKLSAgICAgICAgICAgIENvbXBsZXhDb2x1bW5EYXRhIGxpdmVDZWxscyA9IGNlbGxzLnB1cmdlKERlbGV0aW9uUHVyZ2VyLlBVUkdFX0FMTCwgRkJVdGlsaXRpZXMubm93SW5TZWNvbmRzKCkpOwotICAgICAgICAgICAgaWYgKGxpdmVDZWxscyA9PSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBwdWJsaWMgQiBzZXRSZXBhaXJlZEF0KGxvbmcgcmVwYWlyZWRBdCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5yZXBhaXJlZEF0ID0gcmVwYWlyZWRBdDsKKyAgICAgICAgICAgIHJldHVybiAoQikgdGhpczsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBpbnQgY2VsbHNTaXplID0gbGl2ZUNlbGxzLmRhdGFTaXplKCk7Ci0gICAgICAgICAgICBpbnQgY2VsbHNDb3VudCA9IGxpdmVDZWxscy5jZWxsc0NvdW50KCk7CisgICAgICAgIHB1YmxpYyBCIHNldFBlbmRpbmdSZXBhaXIoVGltZVVVSUQgcGVuZGluZ1JlcGFpcikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5wZW5kaW5nUmVwYWlyID0gcGVuZGluZ1JlcGFpcjsKKyAgICAgICAgICAgIHJldHVybiAoQikgdGhpczsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoIUd1YXJkcmFpbHMuY29sbGVjdGlvblNpemUudHJpZ2dlcnNPbihjZWxsc1NpemUsIG51bGwpICYmCi0gICAgICAgICAgICAgICAgIUd1YXJkcmFpbHMuaXRlbXNQZXJDb2xsZWN0aW9uLnRyaWdnZXJzT24oY2VsbHNDb3VudCwgbnVsbCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHB1YmxpYyBCIHNldFRyYW5zaWVudFNTVGFibGUoYm9vbGVhbiB0cmFuc2llbnRTU1RhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnRyYW5zaWVudFNTVGFibGUgPSB0cmFuc2llbnRTU1RhYmxlOworICAgICAgICAgICAgcmV0dXJuIChCKSB0aGlzOworICAgICAgICB9CiAKLSAgICAgICAgICAgIFN0cmluZyBrZXlTdHJpbmcgPSBtZXRhZGF0YS5wcmltYXJ5S2V5QXNDUUxMaXRlcmFsKHBhcnRpdGlvbktleS5nZXRLZXkoKSwgcm93LmNsdXN0ZXJpbmcoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgiJXMgaW4gcm93ICVzIGluIHRhYmxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5uYW1lLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSk7Ci0gICAgICAgICAgICBHdWFyZHJhaWxzLmNvbGxlY3Rpb25TaXplLmd1YXJkKGNlbGxzU2l6ZSwgbXNnLCB0cnVlLCBudWxsKTsKLSAgICAgICAgICAgIEd1YXJkcmFpbHMuaXRlbXNQZXJDb2xsZWN0aW9uLmd1YXJkKGNlbGxzQ291bnQsIG1zZywgdHJ1ZSwgbnVsbCk7CisgICAgICAgIHB1YmxpYyBCIHNldFNlcmlhbGl6YXRpb25IZWFkZXIoU2VyaWFsaXphdGlvbkhlYWRlciBzZXJpYWxpemF0aW9uSGVhZGVyKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnNlcmlhbGl6YXRpb25IZWFkZXIgPSBzZXJpYWxpemF0aW9uSGVhZGVyOworICAgICAgICAgICAgcmV0dXJuIChCKSB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEIgc2V0Rmx1c2hPYnNlcnZlcnMoQ29sbGVjdGlvbjxTU1RhYmxlRmx1c2hPYnNlcnZlcj4gZmx1c2hPYnNlcnZlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZmx1c2hPYnNlcnZlcnMgPSBJbW11dGFibGVMaXN0LmNvcHlPZihmbHVzaE9ic2VydmVycyk7CisgICAgICAgICAgICByZXR1cm4gKEIpIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQiBhZGREZWZhdWx0Q29tcG9uZW50cygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrTm90TnVsbChnZXRUYWJsZU1ldGFkYXRhUmVmKCkpOworCisgICAgICAgICAgICBhZGRDb21wb25lbnRzKEltbXV0YWJsZVNldC5vZihDb21wb25lbnRzLkRBVEEsIENvbXBvbmVudHMuU1RBVFMsIENvbXBvbmVudHMuRElHRVNULCBDb21wb25lbnRzLlRPQykpOworCisgICAgICAgICAgICBpZiAoZ2V0VGFibGVNZXRhZGF0YVJlZigpLmdldExvY2FsKCkucGFyYW1zLmNvbXByZXNzaW9uLmlzRW5hYmxlZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkZENvbXBvbmVudHMoSW1tdXRhYmxlU2V0Lm9mKENvbXBvbmVudHMuQ09NUFJFU1NJT05fSU5GTykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGl0IHdvdWxkIGZlZWwgc2FmZXIgdG8gYWN0dWFsbHkgYWRkIHRoaXMgY29tcG9uZW50IGxhdGVyIGluIG1heWJlV3JpdGVEaWdlc3QoKSwKKyAgICAgICAgICAgICAgICAvLyBidXQgdGhlIGNvbXBvbmVudHMgYXJlIHVubW9kaWZpYWJsZSBhZnRlciBjb25zdHJ1Y3Rpb24KKyAgICAgICAgICAgICAgICBhZGRDb21wb25lbnRzKEltbXV0YWJsZVNldC5vZihDb21wb25lbnRzLkNSQykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gKEIpIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQiBhZGRGbHVzaE9ic2VydmVyc0ZvclNlY29uZGFyeUluZGV4ZXMoQ29sbGVjdGlvbjxJbmRleD4gaW5kZXhlcywgT3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW5kZXhlcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAoQikgdGhpczsKKworICAgICAgICAgICAgQ29sbGVjdGlvbjxTU1RhYmxlRmx1c2hPYnNlcnZlcj4gY3VycmVudCA9IHRoaXMuZmx1c2hPYnNlcnZlcnMgIT0gbnVsbCA/IHRoaXMuZmx1c2hPYnNlcnZlcnMgOiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgICAgIExpc3Q8U1NUYWJsZUZsdXNoT2JzZXJ2ZXI+IG9ic2VydmVycyA9IG5ldyBBcnJheUxpc3Q8PihpbmRleGVzLnNpemUoKSArIGN1cnJlbnQuc2l6ZSgpKTsKKyAgICAgICAgICAgIG9ic2VydmVycy5hZGRBbGwoY3VycmVudCk7CisKKyAgICAgICAgICAgIGZvciAoSW5kZXggaW5kZXggOiBpbmRleGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNTVGFibGVGbHVzaE9ic2VydmVyIG9ic2VydmVyID0gaW5kZXguZ2V0Rmx1c2hPYnNlcnZlcihkZXNjcmlwdG9yLCBvcGVyYXRpb25UeXBlKTsKKyAgICAgICAgICAgICAgICBpZiAob2JzZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIG9ic2VydmVycy5hZGQob2JzZXJ2ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHNldEZsdXNoT2JzZXJ2ZXJzKG9ic2VydmVycyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWV0YWRhdGFDb2xsZWN0b3IgZ2V0TWV0YWRhdGFDb2xsZWN0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGFDb2xsZWN0b3I7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBnZXRLZXlDb3VudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBrZXlDb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGdldFJlcGFpcmVkQXQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmVwYWlyZWRBdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUaW1lVVVJRCBnZXRQZW5kaW5nUmVwYWlyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBlbmRpbmdSZXBhaXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1RyYW5zaWVudFNTVGFibGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJhbnNpZW50U1NUYWJsZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTZXJpYWxpemF0aW9uSGVhZGVyIGdldFNlcmlhbGl6YXRpb25IZWFkZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc2VyaWFsaXphdGlvbkhlYWRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uPFNTVGFibGVGbHVzaE9ic2VydmVyPiBnZXRGbHVzaE9ic2VydmVycygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmbHVzaE9ic2VydmVyczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBNbWFwcGVkUmVnaW9uc0NhY2hlIGdldE1tYXBwZWRSZWdpb25zQ2FjaGUoKTsKKworICAgICAgICBwdWJsaWMgQnVpbGRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGRlc2NyaXB0b3IpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFcgYnVpbGQoTGlmZWN5Y2xlTmV3VHJhY2tlciBsaWZlY3ljbGVOZXdUcmFja2VyLCBPd25lciBvd25lcikKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tOb3ROdWxsKGdldENvbXBvbmVudHMoKSk7CisKKyAgICAgICAgICAgIHZhbGlkYXRlUmVwYWlyZWRNZXRhZGF0YShnZXRSZXBhaXJlZEF0KCksIGdldFBlbmRpbmdSZXBhaXIoKSwgaXNUcmFuc2llbnRTU1RhYmxlKCkpOworCisgICAgICAgICAgICByZXR1cm4gYnVpbGRJbnRlcm5hbChsaWZlY3ljbGVOZXdUcmFja2VyLCBvd25lcik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVyBidWlsZEludGVybmFsKExpZmVjeWNsZU5ld1RyYWNrZXIgbGlmZWN5Y2xlTmV3VHJhY2tlciwgT3duZXIgb3duZXIpOworCisgICAgICAgIHB1YmxpYyBTU1RhYmxlWmVyb0NvcHlXcml0ZXIgY3JlYXRlWmVyb0NvcHlXcml0ZXIoTGlmZWN5Y2xlTmV3VHJhY2tlciBsaWZlY3ljbGVOZXdUcmFja2VyLCBPd25lciBvd25lcikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTU1RhYmxlWmVyb0NvcHlXcml0ZXIodGhpcywgbGlmZWN5Y2xlTmV3VHJhY2tlciwgb3duZXIpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU29ydGVkVGFibGVQYXJ0aXRpb25Xcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NvcnRlZFRhYmxlUGFydGl0aW9uV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYzNGFmMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NvcnRlZFRhYmxlUGFydGl0aW9uV3JpdGVyLmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ1ByZWZpeDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25UaW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5SYW5nZVRvbWJzdG9uZU1hcmtlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlNlcmlhbGl6YXRpb25IZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU29ydGVkVGFibGVQYXJ0aXRpb25Xcml0ZXIgaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlCit7CisgICAgcHJvdGVjdGVkIGZpbmFsIFVuZmlsdGVyZWRTZXJpYWxpemVyIHVuZmlsdGVyZWRTZXJpYWxpemVyOworCisgICAgcHJpdmF0ZSBmaW5hbCBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlcjsKKyAgICBwcml2YXRlIGZpbmFsIFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyOworICAgIHByaXZhdGUgZmluYWwgU2VyaWFsaXphdGlvbkhlbHBlciBoZWxwZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgdmVyc2lvbjsKKworICAgIHByaXZhdGUgbG9uZyBwcmV2aW91c1Jvd1N0YXJ0OworICAgIHByaXZhdGUgbG9uZyBpbml0aWFsUG9zaXRpb247CisgICAgcHJpdmF0ZSBsb25nIGhlYWRlckxlbmd0aDsKKworICAgIHByb3RlY3RlZCBsb25nIHN0YXJ0UG9zaXRpb247CisgICAgcHJvdGVjdGVkIGludCB3cml0dGVuOworCisgICAgcHJvdGVjdGVkIENsdXN0ZXJpbmdQcmVmaXg8Pz4gZmlyc3RDbHVzdGVyaW5nOworICAgIHByb3RlY3RlZCBDbHVzdGVyaW5nUHJlZml4PD8+IGxhc3RDbHVzdGVyaW5nOworCisgICAgcHJvdGVjdGVkIERlbGV0aW9uVGltZSBvcGVuTWFya2VyID0gRGVsZXRpb25UaW1lLkxJVkU7CisgICAgcHJvdGVjdGVkIERlbGV0aW9uVGltZSBzdGFydE9wZW5NYXJrZXIgPSBEZWxldGlvblRpbWUuTElWRTsKKworICAgIC8vIFNlcXVlbmNlIGNvbnRyb2wsIGFsc28gdXNlZCB0byBhZGQgZW1wdHkgc3RhdGljIHJvdyBpZiBgYWRkU3RhdGljUm93YCBpcyBub3QgY2FsbGVkLgorICAgIHByaXZhdGUgZW51bSBTdGF0ZQorICAgIHsKKyAgICAgICAgQVdBSVRJTkdfUEFSVElUSU9OX0hFQURFUiwKKyAgICAgICAgQVdBSVRJTkdfU1RBVElDX1JPVywKKyAgICAgICAgQVdBSVRJTkdfUk9XUywKKyAgICAgICAgQ09NUExFVEVECisgICAgfQorCisgICAgU3RhdGUgc3RhdGUgPSBTdGF0ZS5BV0FJVElOR19QQVJUSVRJT05fSEVBREVSOworCisgICAgcHJvdGVjdGVkIFNvcnRlZFRhYmxlUGFydGl0aW9uV3JpdGVyKFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyLCBTZXF1ZW50aWFsV3JpdGVyIHdyaXRlciwgVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgdGhpcy5oZWFkZXIgPSBoZWFkZXI7CisgICAgICAgIHRoaXMud3JpdGVyID0gd3JpdGVyOworICAgICAgICB0aGlzLnVuZmlsdGVyZWRTZXJpYWxpemVyID0gVW5maWx0ZXJlZFNlcmlhbGl6ZXIuc2VyaWFsaXplcjsKKyAgICAgICAgdGhpcy5oZWxwZXIgPSBuZXcgU2VyaWFsaXphdGlvbkhlbHBlcihoZWFkZXIpOworICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uLmNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcmVzZXQoKQorICAgIHsKKyAgICAgICAgdGhpcy5pbml0aWFsUG9zaXRpb24gPSB3cml0ZXIucG9zaXRpb24oKTsKKyAgICAgICAgdGhpcy5zdGFydFBvc2l0aW9uID0gLTE7CisgICAgICAgIHRoaXMucHJldmlvdXNSb3dTdGFydCA9IDA7CisgICAgICAgIHRoaXMud3JpdHRlbiA9IDA7CisgICAgICAgIHRoaXMuZmlyc3RDbHVzdGVyaW5nID0gbnVsbDsKKyAgICAgICAgdGhpcy5sYXN0Q2x1c3RlcmluZyA9IG51bGw7CisgICAgICAgIHRoaXMub3Blbk1hcmtlciA9IERlbGV0aW9uVGltZS5MSVZFOworICAgICAgICB0aGlzLmhlYWRlckxlbmd0aCA9IC0xOworICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQVdBSVRJTkdfUEFSVElUSU9OX0hFQURFUjsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRIZWFkZXJMZW5ndGgoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGhlYWRlckxlbmd0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydChEZWNvcmF0ZWRLZXkga2V5LCBEZWxldGlvblRpbWUgcGFydGl0aW9uTGV2ZWxEZWxldGlvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQ09NUExFVEVEKQorICAgICAgICAgICAgcmVzZXQoKTsKKworICAgICAgICBjaGVja1N0YXRlKHN0YXRlID09IFN0YXRlLkFXQUlUSU5HX1BBUlRJVElPTl9IRUFERVIpOworCisgICAgICAgIEJ5dGVCdWZmZXJVdGlsLndyaXRlV2l0aFNob3J0TGVuZ3RoKGtleS5nZXRLZXkoKSwgd3JpdGVyKTsKKyAgICAgICAgRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuc2VyaWFsaXplKHBhcnRpdGlvbkxldmVsRGVsZXRpb24sIHdyaXRlcik7CisKKyAgICAgICAgaWYgKCFoZWFkZXIuaGFzU3RhdGljKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaGVhZGVyTGVuZ3RoID0gd3JpdGVyLnBvc2l0aW9uKCkgLSBpbml0aWFsUG9zaXRpb247CisgICAgICAgICAgICBzdGF0ZSA9IFN0YXRlLkFXQUlUSU5HX1JPV1M7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZSA9IFN0YXRlLkFXQUlUSU5HX1NUQVRJQ19ST1c7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkU3RhdGljUm93KFJvdyBzdGF0aWNSb3cpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY2hlY2tTdGF0ZShzdGF0ZSA9PSBTdGF0ZS5BV0FJVElOR19TVEFUSUNfUk9XKTsKKyAgICAgICAgY2hlY2tTdGF0ZShzdGF0aWNSb3cuaXNTdGF0aWMoKSk7CisKKyAgICAgICAgVW5maWx0ZXJlZFNlcmlhbGl6ZXIuc2VyaWFsaXplci5zZXJpYWxpemVTdGF0aWNSb3coc3RhdGljUm93LCBoZWxwZXIsIHdyaXRlciwgdmVyc2lvbik7CisKKyAgICAgICAgdGhpcy5oZWFkZXJMZW5ndGggPSB3cml0ZXIucG9zaXRpb24oKSAtIGluaXRpYWxQb3NpdGlvbjsKKyAgICAgICAgc3RhdGUgPSBTdGF0ZS5BV0FJVElOR19ST1dTOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFVuZmlsdGVyZWQoVW5maWx0ZXJlZCB1bmZpbHRlcmVkKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGNoZWNrU3RhdGUoc3RhdGUgPT0gU3RhdGUuQVdBSVRJTkdfUk9XUyk7CisKKyAgICAgICAgbG9uZyBwb3MgPSBjdXJyZW50UG9zaXRpb24oKTsKKworICAgICAgICBpZiAoZmlyc3RDbHVzdGVyaW5nID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEJlZ2lubmluZyBvZiBhbiBpbmRleCBibG9jay4gUmVtZW1iZXIgdGhlIHN0YXJ0IGFuZCBwb3NpdGlvbgorICAgICAgICAgICAgZmlyc3RDbHVzdGVyaW5nID0gdW5maWx0ZXJlZC5jbHVzdGVyaW5nKCk7CisgICAgICAgICAgICBzdGFydE9wZW5NYXJrZXIgPSBvcGVuTWFya2VyOworICAgICAgICAgICAgc3RhcnRQb3NpdGlvbiA9IHBvczsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgdW5maWx0ZXJlZFBvc2l0aW9uID0gd3JpdGVyLnBvc2l0aW9uKCk7CisgICAgICAgIHVuZmlsdGVyZWRTZXJpYWxpemVyLnNlcmlhbGl6ZSh1bmZpbHRlcmVkLCBoZWxwZXIsIHdyaXRlciwgcG9zIC0gcHJldmlvdXNSb3dTdGFydCwgdmVyc2lvbik7CisKKyAgICAgICAgbGFzdENsdXN0ZXJpbmcgPSB1bmZpbHRlcmVkLmNsdXN0ZXJpbmcoKTsKKyAgICAgICAgcHJldmlvdXNSb3dTdGFydCA9IHBvczsKKyAgICAgICAgKyt3cml0dGVuOworCisgICAgICAgIGlmICh1bmZpbHRlcmVkLmtpbmQoKSA9PSBVbmZpbHRlcmVkLktpbmQuUkFOR0VfVE9NQlNUT05FX01BUktFUikKKyAgICAgICAgeworICAgICAgICAgICAgUmFuZ2VUb21ic3RvbmVNYXJrZXIgbWFya2VyID0gKFJhbmdlVG9tYnN0b25lTWFya2VyKSB1bmZpbHRlcmVkOworICAgICAgICAgICAgb3Blbk1hcmtlciA9IG1hcmtlci5pc09wZW4oZmFsc2UpID8gbWFya2VyLm9wZW5EZWxldGlvblRpbWUoZmFsc2UpIDogRGVsZXRpb25UaW1lLkxJVkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgbG9uZyBmaW5pc2goKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGNoZWNrU3RhdGUoc3RhdGUgPT0gU3RhdGUuQVdBSVRJTkdfUk9XUyk7CisKKyAgICAgICAgc3RhdGUgPSBTdGF0ZS5DT01QTEVURUQ7CisKKyAgICAgICAgbG9uZyBlbmRQb3NpdGlvbiA9IGN1cnJlbnRQb3NpdGlvbigpOworICAgICAgICB1bmZpbHRlcmVkU2VyaWFsaXplci53cml0ZUVuZE9mUGFydGl0aW9uKHdyaXRlcik7CisKKyAgICAgICAgcmV0dXJuIGVuZFBvc2l0aW9uOworICAgIH0KKworICAgIHByb3RlY3RlZCBsb25nIGN1cnJlbnRQb3NpdGlvbigpCisgICAgeworICAgICAgICByZXR1cm4gd3JpdGVyLnBvc2l0aW9uKCkgLSBpbml0aWFsUG9zaXRpb247CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0SW5pdGlhbFBvc2l0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpbml0aWFsUG9zaXRpb247CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NvcnRlZFRhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NvcnRlZFRhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjY0NzU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU29ydGVkVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQ7CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aS5CdGlGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5TdGF0c01ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuVmFsaWRhdGlvbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5JRmlsdGVyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU29ydGVkVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlcjxSIGV4dGVuZHMgU1NUYWJsZVJlYWRlciwgQiBleHRlbmRzIFNTVGFibGVSZWFkZXIuQnVpbGRlcjxSLCBCPj4KK2V4dGVuZHMgU1NUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyPFIsIEI+Cit7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNvcnRlZFRhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXIuY2xhc3MpOworICAgIHByaXZhdGUgRmlsZUhhbmRsZS5CdWlsZGVyIGRhdGFGaWxlQnVpbGRlcjsKKworICAgIHB1YmxpYyBTb3J0ZWRUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyKFNTVGFibGUuQnVpbGRlcjw/LCA/PiBidWlsZGVyKQorICAgIHsKKyAgICAgICAgc3VwZXIoYnVpbGRlcik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIElGaWx0ZXIgbG9hZEZpbHRlcihWYWxpZGF0aW9uTWV0YWRhdGEgdmFsaWRhdGlvbk1ldGFkYXRhKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEZpbHRlckNvbXBvbmVudC5tYXliZUxvYWRCbG9vbUZpbHRlcihkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVNZXRhZGF0YVJlZi5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uTWV0YWRhdGEpOworICAgIH0KKworICAgIHByb3RlY3RlZCBGaWxlSGFuZGxlLkJ1aWxkZXIgZGF0YUZpbGVCdWlsZGVyKFN0YXRzTWV0YWRhdGEgc3RhdHNNZXRhZGF0YSkKKyAgICB7CisgICAgICAgIGFzc2VydCB0aGlzLmRhdGFGaWxlQnVpbGRlciA9PSBudWxsIHx8IHRoaXMuZGF0YUZpbGVCdWlsZGVyLmZpbGUuZXF1YWxzKGRlc2NyaXB0b3IuZmlsZUZvcihCdGlGb3JtYXQuQ29tcG9uZW50cy5EQVRBKSk7CisKKyAgICAgICAgbG9nZ2VyLmluZm8oIk9wZW5pbmcge30gKHt9KSIsIGRlc2NyaXB0b3IsIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KGRlc2NyaXB0b3IuZmlsZUZvcihCdGlGb3JtYXQuQ29tcG9uZW50cy5EQVRBKS5sZW5ndGgoKSkpOworCisgICAgICAgIGxvbmcgcmVjb3JkU2l6ZSA9IHN0YXRzTWV0YWRhdGEuZXN0aW1hdGVkUGFydGl0aW9uU2l6ZS5wZXJjZW50aWxlKGlvT3B0aW9ucy5kaXNrT3B0aW1pemF0aW9uRXN0aW1hdGVQZXJjZW50aWxlKTsKKyAgICAgICAgaW50IGJ1ZmZlclNpemUgPSBpb09wdGlvbnMuZGlza09wdGltaXphdGlvblN0cmF0ZWd5LmJ1ZmZlclNpemUocmVjb3JkU2l6ZSk7CisKKyAgICAgICAgaWYgKGRhdGFGaWxlQnVpbGRlciA9PSBudWxsKQorICAgICAgICAgICAgZGF0YUZpbGVCdWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihkZXNjcmlwdG9yLmZpbGVGb3IoQnRpRm9ybWF0LkNvbXBvbmVudHMuREFUQSkpOworCisgICAgICAgIGRhdGFGaWxlQnVpbGRlci5idWZmZXJTaXplKGJ1ZmZlclNpemUpOworICAgICAgICBkYXRhRmlsZUJ1aWxkZXIud2l0aENodW5rQ2FjaGUoY2h1bmtDYWNoZSk7CisgICAgICAgIGRhdGFGaWxlQnVpbGRlci5tbWFwcGVkKGlvT3B0aW9ucy5kZWZhdWx0RGlza0FjY2Vzc01vZGUpOworCisgICAgICAgIHJldHVybiBkYXRhRmlsZUJ1aWxkZXI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU29ydGVkVGFibGVTY3J1YmJlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU29ydGVkVGFibGVTY3J1YmJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YzkxM2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9Tb3J0ZWRUYWJsZVNjcnViYmVyLmphdmEKQEAgLTAsMCArMSw2MzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXJyb3I7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jazsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWFkV3JpdGVMb2NrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5jb25jdXJyZW50Lk5vdFRocmVhZFNhZmU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdDb21wYXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5MaXZlbmVzc0luZm87CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5JbW11dGFibGVCVHJlZVBhcnRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlBhcnRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkFic3RyYWN0Q2VsbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Db2x1bW5EYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ29tcGxleENvbHVtbkRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3dzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5XcmFwcGluZ1VuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVNjcnViYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZUlkZW50aXR5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmV3cml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuU3RhdHNNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SYW5kb21BY2Nlc3NSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5BY3RpdmVSZXBhaXJTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkFic3RyYWN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT3V0cHV0SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlJlZnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5LkhlYXBDbG9uZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJRDsKKworQE5vdFRocmVhZFNhZmUKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTb3J0ZWRUYWJsZVNjcnViYmVyPFIgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyV2l0aEZpbHRlcj4gaW1wbGVtZW50cyBJU2NydWJiZXIKK3sKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU29ydGVkVGFibGVTY3J1YmJlci5jbGFzcyk7CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzOworICAgIHByb3RlY3RlZCBmaW5hbCBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbjsKKyAgICBwcm90ZWN0ZWQgZmluYWwgRmlsZSBkZXN0aW5hdGlvbjsKKyAgICBwcm90ZWN0ZWQgZmluYWwgSVNjcnViYmVyLk9wdGlvbnMgb3B0aW9uczsKKyAgICBwcm90ZWN0ZWQgZmluYWwgUiBzc3RhYmxlOworICAgIHByb3RlY3RlZCBmaW5hbCBPdXRwdXRIYW5kbGVyIG91dHB1dEhhbmRsZXI7CisgICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNDb21tdXRhdGl2ZTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgbG9uZyBleHBlY3RlZEJsb29tRmlsdGVyU2l6ZTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgUmVhZFdyaXRlTG9jayBmaWxlQWNjZXNzTG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgcHJvdGVjdGVkIGZpbmFsIFJhbmRvbUFjY2Vzc1JlYWRlciBkYXRhRmlsZTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgU2NydWJJbmZvIHNjcnViSW5mbzsKKworICAgIHByb3RlY3RlZCBmaW5hbCBOZWdhdGl2ZUxvY2FsRGVsZXRpb25JbmZvTWV0cmljcyBuZWdhdGl2ZUxvY2FsRGVsZXRpb25JbmZvTWV0cmljcyA9IG5ldyBOZWdhdGl2ZUxvY2FsRGVsZXRpb25JbmZvTWV0cmljcygpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxQYXJ0aXRpb24+IHBhcnRpdGlvbkNvbXBhcmF0b3IgPSBDb21wYXJhdG9yLmNvbXBhcmluZyhQYXJ0aXRpb246OnBhcnRpdGlvbktleSk7CisgICAgcHJvdGVjdGVkIGZpbmFsIFNvcnRlZFNldDxQYXJ0aXRpb24+IG91dE9mT3JkZXIgPSBuZXcgVHJlZVNldDw+KHBhcnRpdGlvbkNvbXBhcmF0b3IpOworCisKKyAgICBwcm90ZWN0ZWQgaW50IGdvb2RQYXJ0aXRpb25zOworICAgIHByb3RlY3RlZCBpbnQgYmFkUGFydGl0aW9uczsKKyAgICBwcm90ZWN0ZWQgaW50IGVtcHR5UGFydGl0aW9uczsKKworCisgICAgcHJvdGVjdGVkIFNvcnRlZFRhYmxlU2NydWJiZXIoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dEhhbmRsZXIgb3V0cHV0SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMpCisgICAgeworICAgICAgICB0aGlzLnNzdGFibGUgPSAoUikgdHJhbnNhY3Rpb24ub25seU9uZSgpOworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChzc3RhYmxlLm1ldGFkYXRhKCkpOworICAgICAgICBhc3NlcnQgc3N0YWJsZS5tZXRhZGF0YSgpLmtleXNwYWNlLmVxdWFscyhjZnMua2V5c3BhY2UuZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKCFzc3RhYmxlLmRlc2NyaXB0b3IuY2ZuYW1lLmVxdWFscyhjZnMubWV0YWRhdGEoKS5uYW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nZ2VyLndhcm4oIkRlc2NyaXB0b3IgcG9pbnRzIHRvIGEgZGlmZmVyZW50IHRhYmxlIHt9IHRoYW4gbWV0YWRhdGEge30iLCBzc3RhYmxlLmRlc2NyaXB0b3IuY2ZuYW1lLCBjZnMubWV0YWRhdGEoKS5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgc3N0YWJsZS5tZXRhZGF0YSgpLnZhbGlkYXRlQ29tcGF0aWJpbGl0eShjZnMubWV0YWRhdGEoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCJEZXNjcmlwdG9yIHBvaW50cyB0byBhIGRpZmZlcmVudCB0YWJsZSB7fSB0aGFuIG1ldGFkYXRhIHt9Iiwgc3N0YWJsZS5kZXNjcmlwdG9yLmNmbmFtZSwgY2ZzLm1ldGFkYXRhKCkubmFtZSk7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmNmcyA9IGNmczsKKyAgICAgICAgdGhpcy50cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uOworICAgICAgICB0aGlzLm91dHB1dEhhbmRsZXIgPSBvdXRwdXRIYW5kbGVyOworICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gY2ZzLmdldERpcmVjdG9yaWVzKCkuZ2V0TG9jYXRpb25Gb3JEaXNrKGNmcy5nZXREaXNrQm91bmRhcmllcygpLmdldENvcnJlY3REaXNrRm9yU1NUYWJsZShzc3RhYmxlKSk7CisgICAgICAgIHRoaXMuaXNDb21tdXRhdGl2ZSA9IGNmcy5tZXRhZGF0YSgpLmlzQ291bnRlcigpOworCisgICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gdG9TY3J1YiA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qoc3N0YWJsZSk7CisKKyAgICAgICAgbG9uZyBhcHByb3hpbWF0ZUtleUNvdW50OworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgYXBwcm94aW1hdGVLZXlDb3VudCA9IFNTVGFibGVSZWFkZXIuZ2V0QXBwcm94aW1hdGVLZXlDb3VudCh0b1NjcnViKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBwcm94aW1hdGVLZXlDb3VudCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5leHBlY3RlZEJsb29tRmlsdGVyU2l6ZSA9IE1hdGgubWF4KGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsLCBhcHByb3hpbWF0ZUtleUNvdW50KTsKKworICAgICAgICAvLyBsb29wIHRocm91Z2ggZWFjaCBwYXJ0aXRpb24sIGRlc2VyaWFsaXppbmcgdG8gY2hlY2sgZm9yIGRhbWFnZS4KKyAgICAgICAgLy8gV2UnbGwgYWxzbyBsb29wIHRocm91Z2ggdGhlIGluZGV4IGF0IHRoZSBzYW1lIHRpbWUsIHVzaW5nIHRoZSBwb3NpdGlvbiBmcm9tIHRoZSBpbmRleCB0byByZWNvdmVyIGlmIHRoZQorICAgICAgICAvLyBwYXJ0aXRpb24gaGVhZGVyIChrZXkgb3IgZGF0YSBzaXplKSBpcyBjb3JydXB0LiAoVGhpcyBtZWFucyBvdXIgcG9zaXRpb24gaW4gdGhlIGluZGV4IGZpbGUgd2lsbCBiZSBvbmUKKyAgICAgICAgLy8gcGFydGl0aW9uICJhaGVhZCIgb2YgdGhlIGRhdGEgZmlsZS4pCisgICAgICAgIHRoaXMuZGF0YUZpbGUgPSB0cmFuc2FjdGlvbi5pc09mZmxpbmUoKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBzc3RhYmxlLm9wZW5EYXRhUmVhZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogc3N0YWJsZS5vcGVuRGF0YVJlYWRlcihDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5nZXRSYXRlTGltaXRlcigpKTsKKworICAgICAgICB0aGlzLnNjcnViSW5mbyA9IG5ldyBTY3J1YkluZm8oZGF0YUZpbGUsIHNzdGFibGUsIGZpbGVBY2Nlc3NMb2NrLnJlYWRMb2NrKCkpOworCisgICAgICAgIGlmIChvcHRpb25zLnJlaW5zZXJ0T3ZlcmZsb3dlZFRUTFJvd3MpCisgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dCgiU3RhcnRpbmcgc2NydWIgd2l0aCByZWluc2VydCBvdmVyZmxvd2VkIFRUTCBvcHRpb24iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlT3JwaGFuZWRDb21wb25lbnRzKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cykKKyAgICB7CisgICAgICAgIEZpbGUgZGF0YUZpbGUgPSBkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKTsKKyAgICAgICAgaWYgKGNvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50cy5EQVRBKSAmJiBkYXRhRmlsZS5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICAvLyBldmVyeXRoaW5nIGFwcGVhcnMgdG8gYmUgaW4gb3JkZXIuLi4gbW92aW5nIG9uLgorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIG1pc3NpbmcgdGhlIERBVEEgZmlsZSEgYWxsIGNvbXBvbmVudHMgYXJlIG9ycGhhbmVkCisgICAgICAgIGxvZ2dlci53YXJuKCJSZW1vdmluZyBvcnBoYW5zIGZvciB7fToge30iLCBkZXNjcmlwdG9yLCBjb21wb25lbnRzKTsKKyAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogY29tcG9uZW50cykKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZSBmaWxlID0gZGVzY3JpcHRvci5maWxlRm9yKGNvbXBvbmVudCk7CisgICAgICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmZpbGVGb3IoY29tcG9uZW50KS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNjcnViKCkKKyAgICB7CisgICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gZmluaXNoZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgb3V0cHV0SGFuZGxlci5vdXRwdXQoIlNjcnViYmluZyAlcyAoJXMpIiwgc3N0YWJsZSwgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoZGF0YUZpbGUubGVuZ3RoKCkpKTsKKyAgICAgICAgdHJ5IChTU1RhYmxlUmV3cml0ZXIgd3JpdGVyID0gU1NUYWJsZVJld3JpdGVyLmNvbnN0cnVjdChjZnMsIHRyYW5zYWN0aW9uLCBmYWxzZSwgc3N0YWJsZS5tYXhEYXRhQWdlKTsKKyAgICAgICAgICAgICBSZWZzPFNTVGFibGVSZWFkZXI+IHJlZnMgPSBSZWZzLnJlZihDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3N0YWJsZSkpKQorICAgICAgICB7CisgICAgICAgICAgICBTdGF0c01ldGFkYXRhIG1ldGFkYXRhID0gc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKTsKKyAgICAgICAgICAgIHdyaXRlci5zd2l0Y2hXcml0ZXIoQ29tcGFjdGlvbk1hbmFnZXIuY3JlYXRlV3JpdGVyKGNmcywgZGVzdGluYXRpb24sIGV4cGVjdGVkQmxvb21GaWx0ZXJTaXplLCBtZXRhZGF0YS5yZXBhaXJlZEF0LCBtZXRhZGF0YS5wZW5kaW5nUmVwYWlyLCBtZXRhZGF0YS5pc1RyYW5zaWVudCwgc3N0YWJsZSwgdHJhbnNhY3Rpb24pKTsKKworICAgICAgICAgICAgc2NydWJJbnRlcm5hbCh3cml0ZXIpOworCisgICAgICAgICAgICBpZiAoIW91dE9mT3JkZXIuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIGZpbmlzaGVkLmFkZCh3cml0ZU91dE9mT3JkZXJQYXJ0aXRpb25zKG1ldGFkYXRhKSk7CisKKyAgICAgICAgICAgIC8vIGZpbmlzaCBvYnNvbGV0ZXMgdGhlIG9sZCBzc3RhYmxlCisgICAgICAgICAgICB0cmFuc2FjdGlvbi5vYnNvbGV0ZU9yaWdpbmFscygpOworICAgICAgICAgICAgZmluaXNoZWQuYWRkQWxsKHdyaXRlci5zZXRSZXBhaXJlZEF0KGJhZFBhcnRpdGlvbnMgPiAwID8gQWN0aXZlUmVwYWlyU2VydmljZS5VTlJFUEFJUkVEX1NTVEFCTEUgOiBzc3RhYmxlLmdldFNTVGFibGVNZXRhZGF0YSgpLnJlcGFpcmVkQXQpLmZpbmlzaCgpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvbi5pc09mZmxpbmUoKSkKKyAgICAgICAgICAgICAgICBmaW5pc2hlZC5mb3JFYWNoKHNzdGFibGUgLT4gc3N0YWJsZS5zZWxmUmVmKCkucmVsZWFzZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dHB1dFN1bW1hcnkoZmluaXNoZWQpOworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNjcnViSW50ZXJuYWwoU1NUYWJsZVJld3JpdGVyIHdyaXRlcikgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgcHJpdmF0ZSB2b2lkIG91dHB1dFN1bW1hcnkoTGlzdDxTU1RhYmxlUmVhZGVyPiBmaW5pc2hlZCkKKyAgICB7CisgICAgICAgIGlmICghZmluaXNoZWQuaXNFbXB0eSgpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dCgiU2NydWIgb2YgJXMgY29tcGxldGU6ICVkIHBhcnRpdGlvbnMgaW4gbmV3IHNzdGFibGUgYW5kICVkIGVtcHR5ICh0b21ic3RvbmVkKSBwYXJ0aXRpb25zIGRyb3BwZWQiLCBzc3RhYmxlLCBnb29kUGFydGl0aW9ucywgZW1wdHlQYXJ0aXRpb25zKTsKKyAgICAgICAgICAgIGlmIChuZWdhdGl2ZUxvY2FsRGVsZXRpb25JbmZvTWV0cmljcy5maXhlZFJvd3MgPiAwKQorICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KCJGaXhlZCAlZCByb3dzIHdpdGggb3ZlcmZsb3dlZCBsb2NhbCBkZWxldGlvbiB0aW1lLiIsIG5lZ2F0aXZlTG9jYWxEZWxldGlvbkluZm9NZXRyaWNzLmZpeGVkUm93cyk7CisgICAgICAgICAgICBpZiAoYmFkUGFydGl0aW9ucyA+IDApCisgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKCJVbmFibGUgdG8gcmVjb3ZlciAlZCBwYXJ0aXRpb25zIHRoYXQgd2VyZSBza2lwcGVkLiAgWW91IGNhbiBhdHRlbXB0IG1hbnVhbCByZWNvdmVyeSBmcm9tIHRoZSBwcmUtc2NydWIgc25hcHNob3QuICBZb3UgY2FuIGFsc28gcnVuIG5vZGV0b29sIHJlcGFpciB0byB0cmFuc2ZlciB0aGUgZGF0YSBmcm9tIGEgaGVhbHRoeSByZXBsaWNhLCBpZiBhbnkiLCBiYWRQYXJ0aXRpb25zKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiYWRQYXJ0aXRpb25zID4gMCkKKyAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4oIk5vIHZhbGlkIHBhcnRpdGlvbnMgZm91bmQgd2hpbGUgc2NydWJiaW5nICVzOyBpdCBpcyBtYXJrZWQgZm9yIGRlbGV0aW9uIG5vdy4gSWYgeW91IHdhbnQgdG8gYXR0ZW1wdCBtYW51YWwgcmVjb3ZlcnksIHlvdSBjYW4gZmluZCBhIGNvcHkgaW4gdGhlIHByZS1zY3J1YiBzbmFwc2hvdCIsIHNzdGFibGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KCJTY3J1YiBvZiAlcyBjb21wbGV0ZTsgbG9va3MgbGlrZSBhbGwgJWQgcGFydGl0aW9ucyB3ZXJlIHRvbWJzdG9uZWQiLCBzc3RhYmxlLCBlbXB0eVBhcnRpdGlvbnMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTU1RhYmxlUmVhZGVyIHdyaXRlT3V0T2ZPcmRlclBhcnRpdGlvbnMoU3RhdHNNZXRhZGF0YSBtZXRhZGF0YSkKKyAgICB7CisgICAgICAgIC8vIG91dCBvZiBvcmRlciBwYXJ0aXRpb25zL3Jvd3MsIGJ1dCBubyBiYWQgcGFydGl0aW9uIGZvdW5kIC0gd2UgY2FuIGtlZXAgb3VyIHJlcGFpcmVkQXQgdGltZQorICAgICAgICBsb25nIHJlcGFpcmVkQXQgPSBiYWRQYXJ0aXRpb25zID4gMCA/IEFjdGl2ZVJlcGFpclNlcnZpY2UuVU5SRVBBSVJFRF9TU1RBQkxFIDogc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5yZXBhaXJlZEF0OworICAgICAgICBTU1RhYmxlUmVhZGVyIG5ld0luT3JkZXJTc3RhYmxlOworICAgICAgICB0cnkgKFNTVGFibGVXcml0ZXIgaW5PcmRlcldyaXRlciA9IENvbXBhY3Rpb25NYW5hZ2VyLmNyZWF0ZVdyaXRlcihjZnMsIGRlc3RpbmF0aW9uLCBleHBlY3RlZEJsb29tRmlsdGVyU2l6ZSwgcmVwYWlyZWRBdCwgbWV0YWRhdGEucGVuZGluZ1JlcGFpciwgbWV0YWRhdGEuaXNUcmFuc2llbnQsIHNzdGFibGUsIHRyYW5zYWN0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChQYXJ0aXRpb24gcGFydGl0aW9uIDogb3V0T2ZPcmRlcikKKyAgICAgICAgICAgICAgICBpbk9yZGVyV3JpdGVyLmFwcGVuZChwYXJ0aXRpb24udW5maWx0ZXJlZEl0ZXJhdG9yKCkpOworICAgICAgICAgICAgaW5PcmRlcldyaXRlci5zZXRSZXBhaXJlZEF0KC0xKTsKKyAgICAgICAgICAgIGluT3JkZXJXcml0ZXIuc2V0TWF4RGF0YUFnZShzc3RhYmxlLm1heERhdGFBZ2UpOworICAgICAgICAgICAgbmV3SW5PcmRlclNzdGFibGUgPSBpbk9yZGVyV3JpdGVyLmZpbmlzaCh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICB0cmFuc2FjdGlvbi51cGRhdGUobmV3SW5PcmRlclNzdGFibGUsIGZhbHNlKTsKKyAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKCIlZCBvdXQgb2Ygb3JkZXIgcGFydGl0aW9uIChvciBwYXJ0aXRpb25zIHdpdGhvdXQgb2Ygb3JkZXIgcm93cykgZm91bmQgd2hpbGUgc2NydWJiaW5nICVzOyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaG9zZSBoYXZlIGJlZW4gd3JpdHRlbiAoaW4gb3JkZXIpIHRvIGEgbmV3IHNzdGFibGUgKCVzKSIsIG91dE9mT3JkZXIuc2l6ZSgpLCBzc3RhYmxlLCBuZXdJbk9yZGVyU3N0YWJsZSk7CisgICAgICAgIHJldHVybiBuZXdJbk9yZGVyU3N0YWJsZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHdpdGhWYWxpZGF0aW9uKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyLCBTdHJpbmcgZmlsZW5hbWUpOworCisgICAgQE92ZXJyaWRlCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIFNjcnViUmVzdWx0IHNjcnViV2l0aFJlc3VsdCgpCisgICAgeworICAgICAgICBzY3J1YigpOworICAgICAgICByZXR1cm4gbmV3IFNjcnViUmVzdWx0KGdvb2RQYXJ0aXRpb25zLCBiYWRQYXJ0aXRpb25zLCBlbXB0eVBhcnRpdGlvbnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb21wYWN0aW9uSW5mby5Ib2xkZXIgZ2V0U2NydWJJbmZvKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzY3J1YkluZm87CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBrZXlTdHJpbmcoRGVjb3JhdGVkS2V5IGtleSkKKyAgICB7CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAiKHVua25vd24pIjsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNmcy5tZXRhZGF0YSgpLnBhcnRpdGlvbktleVR5cGUuZ2V0U3RyaW5nKGtleS5nZXRLZXkoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiKGNvcnJ1cHRlZDsgaGV4IHZhbHVlOiAlcykiLCBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KGtleS5nZXRLZXkoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdHJ5QXBwZW5kKERlY29yYXRlZEtleSBwcmV2S2V5LCBEZWNvcmF0ZWRLZXkga2V5LCBTU1RhYmxlUmV3cml0ZXIgd3JpdGVyKQorICAgIHsKKyAgICAgICAgLy8gT3JkZXJDaGVja2VySXRlcmF0b3Igd2lsbCBjaGVjaywgYXQgaXRlcmF0aW9uIHRpbWUsIHRoYXQgdGhlIHJvd3MgYXJlIGluIHRoZSBwcm9wZXIgb3JkZXIuIElmIGl0IGRldGVjdHMKKyAgICAgICAgLy8gdGhhdCBvbmUgcm93IGlzIG91dCBvZiBvcmRlciwgaXQgd2lsbCBzdG9wIHJldHVybmluZyB0aGVtLiBUaGUgcmVtYWluaW5nIHJvd3Mgd2lsbCBiZSBzb3J0ZWQgYW5kIGFkZGVkCisgICAgICAgIC8vIHRvIHRoZSBvdXRPZk9yZGVyIHNldCB0aGF0IHdpbGwgYmUgbGF0ZXIgd3JpdHRlbiB0byBhIG5ldyBTU1RhYmxlLgorICAgICAgICB0cnkgKE9yZGVyQ2hlY2tlckl0ZXJhdG9yIHNzdGFibGVJdGVyYXRvciA9IG5ldyBPcmRlckNoZWNrZXJJdGVyYXRvcihnZXRJdGVyYXRvcihrZXkpLCBjZnMubWV0YWRhdGEoKS5jb21wYXJhdG9yKTsKKyAgICAgICAgICAgICBVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3IgPSB3aXRoVmFsaWRhdGlvbihzc3RhYmxlSXRlcmF0b3IsIGRhdGFGaWxlLmdldFBhdGgoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwcmV2S2V5ICE9IG51bGwgJiYgcHJldktleS5jb21wYXJlVG8oa2V5KSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2F2ZU91dE9mT3JkZXJQYXJ0aXRpb24ocHJldktleSwga2V5LCBpdGVyYXRvcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAod3JpdGVyLnRyeUFwcGVuZChpdGVyYXRvcikgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBlbXB0eVBhcnRpdGlvbnMrKzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnb29kUGFydGl0aW9ucysrOworCisgICAgICAgICAgICBpZiAoc3N0YWJsZUl0ZXJhdG9yLmhhc1Jvd3NPdXRPZk9yZGVyKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKCJPdXQgb2Ygb3JkZXIgcm93cyBmb3VuZCBpbiBwYXJ0aXRpb246ICVzIiwga2V5U3RyaW5nKGtleSkpOworICAgICAgICAgICAgICAgIG91dE9mT3JkZXIuYWRkKHNzdGFibGVJdGVyYXRvci5nZXRSb3dzT3V0T2ZPcmRlcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9ubHkgd3JhcCB3aXRoIHtAbGluayBGaXhOZWdhdGl2ZUxvY2FsRGVsZXRpb25UaW1lSXRlcmF0b3J9IGlmIHtAbGluayBJU2NydWJiZXIuT3B0aW9ucyNyZWluc2VydE92ZXJmbG93ZWRUVExSb3dzfSBvcHRpb24KKyAgICAgKiBpcyBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBnZXRJdGVyYXRvcihEZWNvcmF0ZWRLZXkga2V5KQorICAgIHsKKyAgICAgICAgUm93TWVyZ2luZ1NTVGFibGVJdGVyYXRvciByb3dNZXJnaW5nSXRlcmF0b3IgPSBuZXcgUm93TWVyZ2luZ1NTVGFibGVJdGVyYXRvcihTU1RhYmxlSWRlbnRpdHlJdGVyYXRvci5jcmVhdGUoc3N0YWJsZSwgZGF0YUZpbGUsIGtleSksIG91dHB1dEhhbmRsZXIpOworICAgICAgICBpZiAob3B0aW9ucy5yZWluc2VydE92ZXJmbG93ZWRUVExSb3dzKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBGaXhOZWdhdGl2ZUxvY2FsRGVsZXRpb25UaW1lSXRlcmF0b3Iocm93TWVyZ2luZ0l0ZXJhdG9yLCBvdXRwdXRIYW5kbGVyLCBuZWdhdGl2ZUxvY2FsRGVsZXRpb25JbmZvTWV0cmljcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiByb3dNZXJnaW5nSXRlcmF0b3I7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNhdmVPdXRPZk9yZGVyUGFydGl0aW9uKERlY29yYXRlZEtleSBwcmV2S2V5LCBEZWNvcmF0ZWRLZXkga2V5LCBVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3IpCisgICAgeworICAgICAgICAvLyBUT0RPIGJpdGNoIGlmIHRoZSByb3cgaXMgdG9vIGxhcmdlPyAgaWYgaXQgaXMgdGhlcmUncyBub3QgbXVjaCB3ZSBjYW4gZG8gLi4uCisgICAgICAgIG91dHB1dEhhbmRsZXIud2FybigiT3V0IG9mIG9yZGVyIHBhcnRpdGlvbiBkZXRlY3RlZCAoJXMgZm91bmQgYWZ0ZXIgJXMpIiwga2V5U3RyaW5nKGtleSksIGtleVN0cmluZyhwcmV2S2V5KSk7CisgICAgICAgIG91dE9mT3JkZXIuYWRkKEltbXV0YWJsZUJUcmVlUGFydGl0aW9uLmNyZWF0ZShpdGVyYXRvcikpOworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCB0aHJvd0lmRmF0YWwoVGhyb3dhYmxlIHRoKQorICAgIHsKKyAgICAgICAgaWYgKHRoIGluc3RhbmNlb2YgRXJyb3IgJiYgISh0aCBpbnN0YW5jZW9mIEFzc2VydGlvbkVycm9yIHx8IHRoIGluc3RhbmNlb2YgSU9FcnJvcikpCisgICAgICAgICAgICB0aHJvdyAoRXJyb3IpIHRoOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHRocm93SWZDYW5ub3RDb250aW51ZShEZWNvcmF0ZWRLZXkga2V5LCBUaHJvd2FibGUgdGgpCisgICAgeworICAgICAgICBpZiAoaXNDb21tdXRhdGl2ZSAmJiAhb3B0aW9ucy5za2lwQ29ycnVwdGVkKQorICAgICAgICB7CisgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4oIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNjcnViYmluZyB0aGUgcGFydGl0aW9uIHdpdGgga2V5ICclcycuICBTa2lwcGluZyBjb3JydXB0ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIGluIGNvdW50ZXIgdGFibGVzIHdpbGwgcmVzdWx0IGluIHVuZGVyY291bnRzIGZvciB0aGUgYWZmZWN0ZWQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdW50ZXJzIChzZWUgQ0FTU0FORFJBLTI3NTkgZm9yIG1vcmUgZGV0YWlscyksIHNvIGJ5IGRlZmF1bHQgdGhlIHNjcnViIHdpbGwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0b3AgYXQgdGhpcyBwb2ludC4gIElmIHlvdSB3b3VsZCBsaWtlIHRvIHNraXAgdGhlIHJvdyBhbnl3YXkgYW5kIGNvbnRpbnVlICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY3J1YmJpbmcsIHJlLXJ1biB0aGUgc2NydWIgd2l0aCB0aGUgLS1za2lwLWNvcnJ1cHRlZCBvcHRpb24uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlTdHJpbmcoa2V5KSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FcnJvcih0aCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2NydWJJbmZvIGV4dGVuZHMgQ29tcGFjdGlvbkluZm8uSG9sZGVyCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIFJhbmRvbUFjY2Vzc1JlYWRlciBkYXRhRmlsZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTU1RhYmxlUmVhZGVyIHNzdGFibGU7CisgICAgICAgIHByaXZhdGUgZmluYWwgVGltZVVVSUQgc2NydWJDb21wYWN0aW9uSWQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgTG9jayBmaWxlUmVhZExvY2s7CisKKyAgICAgICAgcHVibGljIFNjcnViSW5mbyhSYW5kb21BY2Nlc3NSZWFkZXIgZGF0YUZpbGUsIFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgTG9jayBmaWxlUmVhZExvY2spCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZGF0YUZpbGUgPSBkYXRhRmlsZTsKKyAgICAgICAgICAgIHRoaXMuc3N0YWJsZSA9IHNzdGFibGU7CisgICAgICAgICAgICB0aGlzLmZpbGVSZWFkTG9jayA9IGZpbGVSZWFkTG9jazsKKyAgICAgICAgICAgIHNjcnViQ29tcGFjdGlvbklkID0gbmV4dFRpbWVVVUlEKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29tcGFjdGlvbkluZm8gZ2V0Q29tcGFjdGlvbkluZm8oKQorICAgICAgICB7CisgICAgICAgICAgICBmaWxlUmVhZExvY2subG9jaygpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wYWN0aW9uSW5mbyhzc3RhYmxlLm1ldGFkYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25UeXBlLlNDUlVCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUZpbGUuZ2V0RmlsZVBvaW50ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFGaWxlLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NydWJDb21wYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVTZXQub2Yoc3N0YWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLmdldFBhdGgoc3N0YWJsZS5nZXRGaWxlbmFtZSgpKS5nZXRQYXJlbnQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWxlUmVhZExvY2sudW5sb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0dsb2JhbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluIHNvbWUgY2FzZSBsaWtlIENBU1NBTkRSQS0xMjEyNyB0aGUgY2VsbHMgbWlnaHQgaGF2ZSBiZWVuIHN0b3JlZCBpbiB0aGUgd3Jvbmcgb3JkZXIuIFRoaXMgZGVjb3JhdG9yIGNoZWNrIHRoZQorICAgICAqIGNlbGxzIG9yZGVyIGFuZCBjb2xsZWN0IHRoZSBvdXQtb2Ytb3JkZXIgY2VsbHMgdG8gY29ycmVjdCB0aGUgcHJvYmxlbS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBPcmRlckNoZWNrZXJJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0SXRlcmF0b3I8VW5maWx0ZXJlZD4gaW1wbGVtZW50cyBXcmFwcGluZ1VuZmlsdGVyZWRSb3dJdGVyYXRvcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvcjsKKworICAgICAgICBwcml2YXRlIFVuZmlsdGVyZWQgcHJldmlvdXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwYXJ0aXRpb24gY29udGFpbmluZyB0aGUgcm93cyB3aGljaCBhcmUgb3V0IG9mIG9yZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBQYXJ0aXRpb24gcm93c091dE9mT3JkZXI7CisKKyAgICAgICAgcHVibGljIE9yZGVyQ2hlY2tlckl0ZXJhdG9yKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvciwgQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvcikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOworICAgICAgICAgICAgdGhpcy5jb21wYXJhdG9yID0gY29tcGFyYXRvcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHdyYXBwZWQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNSb3dzT3V0T2ZPcmRlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByb3dzT3V0T2ZPcmRlciAhPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFBhcnRpdGlvbiBnZXRSb3dzT3V0T2ZPcmRlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByb3dzT3V0T2ZPcmRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZCBjb21wdXRlTmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaXRlcmF0b3IuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBlbmRPZkRhdGEoKTsKKworICAgICAgICAgICAgVW5maWx0ZXJlZCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOworCisgICAgICAgICAgICAvLyBJZiB3ZSBkZXRlY3QgdGhhdCBzb21lIHJvd3MgYXJlIG91dCBvZiBvcmRlciB3ZSB3aWxsIHN0b3JlIGFuZCBzb3J0IHRoZSByZW1haW5pbmcgb25lcyB0byBpbnNlcnQgdGhlbQorICAgICAgICAgICAgLy8gaW4gYSBzZXBhcmF0ZSBTU1RhYmxlLgorICAgICAgICAgICAgaWYgKHByZXZpb3VzICE9IG51bGwgJiYgY29tcGFyYXRvci5jb21wYXJlKG5leHQsIHByZXZpb3VzKSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcm93c091dE9mT3JkZXIgPSBJbW11dGFibGVCVHJlZVBhcnRpdGlvbi5jcmVhdGUoVW5maWx0ZXJlZFJvd0l0ZXJhdG9ycy5jb25jYXQobmV4dCwgaXRlcmF0b3IpLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVuZE9mRGF0YSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldmlvdXMgPSBuZXh0OworICAgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEdXJpbmcgMi54IG1pZ3JhdGlvbiwgdW5kZXIgc29tZSBjaXJjdW1zdGFuY2VzIHJvd3MgbWlnaHQgaGF2ZSBnb3R0ZW4gZHVwbGljYXRlZC4KKyAgICAgKiBNZXJnaW5nIGl0ZXJhdG9yIG1lcmdlcyByb3dzIHdpdGggc2FtZSBjbHVzdGVyaW5nLgorICAgICAqIDxwPgorICAgICAqIEZvciBtb3JlIGRldGFpbHMsIHJlZmVyIHRvIENBU1NBTkRSQS0xMjE0NC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSb3dNZXJnaW5nU1NUYWJsZUl0ZXJhdG9yIGltcGxlbWVudHMgV3JhcHBpbmdVbmZpbHRlcmVkUm93SXRlcmF0b3IKKyAgICB7CisgICAgICAgIFVuZmlsdGVyZWQgbmV4dFRvT2ZmZXIgPSBudWxsOworICAgICAgICBwcml2YXRlIGZpbmFsIE91dHB1dEhhbmRsZXIgb3V0cHV0OworICAgICAgICBwcml2YXRlIGZpbmFsIFVuZmlsdGVyZWRSb3dJdGVyYXRvciB3cmFwcGVkOworCisgICAgICAgIFJvd01lcmdpbmdTU1RhYmxlSXRlcmF0b3IoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHNvdXJjZSwgT3V0cHV0SGFuZGxlciBvdXRwdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMud3JhcHBlZCA9IHNvdXJjZTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3Igd3JhcHBlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB3cmFwcGVkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV4dFRvT2ZmZXIgIT0gbnVsbCB8fCB3cmFwcGVkLmhhc05leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVW5maWx0ZXJlZCBuZXh0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVW5maWx0ZXJlZCBuZXh0ID0gbmV4dFRvT2ZmZXIgIT0gbnVsbCA/IG5leHRUb09mZmVyIDogd3JhcHBlZC5uZXh0KCk7CisKKyAgICAgICAgICAgIGlmIChuZXh0LmlzUm93KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBsb2dnZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB3aGlsZSAod3JhcHBlZC5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBVbmZpbHRlcmVkIHBlZWsgPSB3cmFwcGVkLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwZWVrLmlzUm93KCkgfHwgIW5leHQuY2x1c3RlcmluZygpLmVxdWFscyhwZWVrLmNsdXN0ZXJpbmcoKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRUb09mZmVyID0gcGVlazsgLy8gT2ZmZXIgcGVlayBpbiBuZXh0IGNhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRHVwbGljYXRlIHJvdywgbWVyZ2UgaXQuCisgICAgICAgICAgICAgICAgICAgIG5leHQgPSBSb3dzLm1lcmdlKChSb3cpIG5leHQsIChSb3cpIHBlZWspOworCisgICAgICAgICAgICAgICAgICAgIGlmICghbG9nZ2VkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFydGl0aW9uS2V5ID0gbWV0YWRhdGEoKS5wYXJ0aXRpb25LZXlUeXBlLmdldFN0cmluZyhwYXJ0aXRpb25LZXkoKS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQud2FybigiRHVwbGljYXRlIHJvdyBkZXRlY3RlZCBpbiAlcy4lczogJXMgJXMiLCBtZXRhZGF0YSgpLmtleXNwYWNlLCBtZXRhZGF0YSgpLm5hbWUsIHBhcnRpdGlvbktleSwgbmV4dC5jbHVzdGVyaW5nKCkudG9TdHJpbmcobWV0YWRhdGEoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmV4dFRvT2ZmZXIgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGl0ZXJhdG9yIGNvbnZlcnRzIG5lZ2F0aXZlIHtAbGluayBBYnN0cmFjdENlbGwjbG9jYWxEZWxldGlvblRpbWUoKX0gaW50byB7QGxpbmsgQWJzdHJhY3RDZWxsI01BWF9ERUxFVElPTl9USU1FfQorICAgICAqIDxwPgorICAgICAqIFRoaXMgaXMgdG8gcmVjb3ZlciBlbnRyaWVzIHdpdGggb3ZlcmZsb3dlZCBsb2NhbEV4cGlyYXRpb25UaW1lIGR1ZSB0byBDQVNTQU5EUkEtMTQwOTIKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBGaXhOZWdhdGl2ZUxvY2FsRGVsZXRpb25UaW1lSXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEl0ZXJhdG9yPFVuZmlsdGVyZWQ+IGltcGxlbWVudHMgV3JhcHBpbmdVbmZpbHRlcmVkUm93SXRlcmF0b3IKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGVjb3JhdGVkIGl0ZXJhdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3I7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPdXRwdXRIYW5kbGVyIG91dHB1dEhhbmRsZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgTmVnYXRpdmVMb2NhbERlbGV0aW9uSW5mb01ldHJpY3MgbmVnYXRpdmVMb2NhbEV4cGlyYXRpb25UaW1lTWV0cmljczsKKworICAgICAgICBwdWJsaWMgRml4TmVnYXRpdmVMb2NhbERlbGV0aW9uVGltZUl0ZXJhdG9yKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvciwgT3V0cHV0SGFuZGxlciBvdXRwdXRIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lZ2F0aXZlTG9jYWxEZWxldGlvbkluZm9NZXRyaWNzIG5lZ2F0aXZlTG9jYWxEZWxldGlvbkluZm9NZXRyaWNzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7CisgICAgICAgICAgICB0aGlzLm91dHB1dEhhbmRsZXIgPSBvdXRwdXRIYW5kbGVyOworICAgICAgICAgICAgdGhpcy5uZWdhdGl2ZUxvY2FsRXhwaXJhdGlvblRpbWVNZXRyaWNzID0gbmVnYXRpdmVMb2NhbERlbGV0aW9uSW5mb01ldHJpY3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciB3cmFwcGVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkIGNvbXB1dGVOZXh0KCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpdGVyYXRvci5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVuZE9mRGF0YSgpOworCisgICAgICAgICAgICBVbmZpbHRlcmVkIG5leHQgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoIW5leHQuaXNSb3coKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDsKKworICAgICAgICAgICAgaWYgKGhhc05lZ2F0aXZlTG9jYWxFeHBpcmF0aW9uVGltZSgoUm93KSBuZXh0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLmRlYnVnKCJGb3VuZCByb3cgd2l0aCBuZWdhdGl2ZSBsb2NhbCBleHBpcmF0aW9uIHRpbWU6ICVzIiwgbmV4dC50b1N0cmluZyhtZXRhZGF0YSgpLCBmYWxzZSkpOworICAgICAgICAgICAgICAgIG5lZ2F0aXZlTG9jYWxFeHBpcmF0aW9uVGltZU1ldHJpY3MuZml4ZWRSb3dzKys7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpeE5lZ2F0aXZlTG9jYWxFeHBpcmF0aW9uVGltZSgoUm93KSBuZXh0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaGFzTmVnYXRpdmVMb2NhbEV4cGlyYXRpb25UaW1lKFJvdyBuZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBSb3cgcm93ID0gbmV4dDsKKyAgICAgICAgICAgIGlmIChyb3cucHJpbWFyeUtleUxpdmVuZXNzSW5mbygpLmlzRXhwaXJpbmcoKSAmJiByb3cucHJpbWFyeUtleUxpdmVuZXNzSW5mbygpLmxvY2FsRXhwaXJhdGlvblRpbWUoKSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoQ29sdW1uRGF0YSBjZCA6IHJvdykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2QuY29sdW1uKCkuaXNTaW1wbGUoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENlbGw8Pz4gY2VsbCA9IChDZWxsPD8+KSBjZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGwuaXNFeHBpcmluZygpICYmIGNlbGwubG9jYWxEZWxldGlvblRpbWUoKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29tcGxleENvbHVtbkRhdGEgY29tcGxleERhdGEgPSAoQ29tcGxleENvbHVtbkRhdGEpIGNkOworICAgICAgICAgICAgICAgICAgICBmb3IgKENlbGw8Pz4gY2VsbCA6IGNvbXBsZXhEYXRhKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbC5pc0V4cGlyaW5nKCkgJiYgY2VsbC5sb2NhbERlbGV0aW9uVGltZSgpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBVbmZpbHRlcmVkIGZpeE5lZ2F0aXZlTG9jYWxFeHBpcmF0aW9uVGltZShSb3cgcm93KQorICAgICAgICB7CisgICAgICAgICAgICBMaXZlbmVzc0luZm8gbGl2ZW5lc3NJbmZvID0gcm93LnByaW1hcnlLZXlMaXZlbmVzc0luZm8oKTsKKyAgICAgICAgICAgIGlmIChsaXZlbmVzc0luZm8uaXNFeHBpcmluZygpICYmIGxpdmVuZXNzSW5mby5sb2NhbEV4cGlyYXRpb25UaW1lKCkgPCAwKQorICAgICAgICAgICAgICAgIGxpdmVuZXNzSW5mbyA9IGxpdmVuZXNzSW5mby53aXRoVXBkYXRlZFRpbWVzdGFtcEFuZExvY2FsRGVsZXRpb25UaW1lKGxpdmVuZXNzSW5mby50aW1lc3RhbXAoKSArIDEsIEFic3RyYWN0Q2VsbC5NQVhfREVMRVRJT05fVElNRSk7CisKKyAgICAgICAgICAgIHJldHVybiByb3cudHJhbnNmb3JtQW5kRmlsdGVyKGxpdmVuZXNzSW5mbywgcm93LmRlbGV0aW9uKCksIGNkIC0+IHsKKyAgICAgICAgICAgICAgICBpZiAoY2QuY29sdW1uKCkuaXNTaW1wbGUoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENlbGwgY2VsbCA9IChDZWxsKSBjZDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNlbGwuaXNFeHBpcmluZygpICYmIGNlbGwubG9jYWxEZWxldGlvblRpbWUoKSA8IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY2VsbC53aXRoVXBkYXRlZFRpbWVzdGFtcEFuZExvY2FsRGVsZXRpb25UaW1lKGNlbGwudGltZXN0YW1wKCkgKyAxLCBBYnN0cmFjdENlbGwuTUFYX0RFTEVUSU9OX1RJTUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNlbGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbXBsZXhDb2x1bW5EYXRhIGNvbXBsZXhEYXRhID0gKENvbXBsZXhDb2x1bW5EYXRhKSBjZDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXhEYXRhLnRyYW5zZm9ybUFuZEZpbHRlcihjZWxsIC0+IGNlbGwuaXNFeHBpcmluZygpICYmIGNlbGwubG9jYWxEZWxldGlvblRpbWUoKSA8IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY2VsbC53aXRoVXBkYXRlZFRpbWVzdGFtcEFuZExvY2FsRGVsZXRpb25UaW1lKGNlbGwudGltZXN0YW1wKCkgKyAxLCBBYnN0cmFjdENlbGwuTUFYX0RFTEVUSU9OX1RJTUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNlbGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pLmNsb25lKEhlYXBDbG9uZXIuaW5zdGFuY2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTmVnYXRpdmVMb2NhbERlbGV0aW9uSW5mb01ldHJpY3MKKyAgICB7CisgICAgICAgIHB1YmxpYyB2b2xhdGlsZSBpbnQgZml4ZWRSb3dzID0gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9Tb3J0ZWRUYWJsZVZlcmlmaWVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9Tb3J0ZWRUYWJsZVZlcmlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzY2I0ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NvcnRlZFRhYmxlVmVyaWZpZXIuamF2YQpAQCAtMCwwICsxLDUyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jazsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWFkV3JpdGVMb2NrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Mb25nUHJlZGljYXRlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uQ29udHJvbGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkludGVycnVwdGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Mb2NhbFBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db3JydXB0U1NUYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklWZXJpZmllcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLktleUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuS2V5UmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZUlkZW50aXR5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW50ZWdyaXR5TWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SYW5kb21BY2Nlc3NSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5BY3RpdmVSZXBhaXJTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSUZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PdXRwdXRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU29ydGVkVGFibGVWZXJpZmllcjxSIGV4dGVuZHMgU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXI+IGltcGxlbWVudHMgSVZlcmlmaWVyCit7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNvcnRlZFRhYmxlVmVyaWZpZXIuY2xhc3MpOworCisgICAgcHJvdGVjdGVkIGZpbmFsIENvbHVtbkZhbWlseVN0b3JlIGNmczsKKyAgICBwcm90ZWN0ZWQgZmluYWwgUiBzc3RhYmxlOworCisgICAgcHJvdGVjdGVkIGZpbmFsIFJlYWRXcml0ZUxvY2sgZmlsZUFjY2Vzc0xvY2s7CisgICAgcHJvdGVjdGVkIGZpbmFsIFJhbmRvbUFjY2Vzc1JlYWRlciBkYXRhRmlsZTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgVmVyaWZ5SW5mbyB2ZXJpZnlJbmZvOworICAgIHByb3RlY3RlZCBmaW5hbCBPcHRpb25zIG9wdGlvbnM7CisgICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNPZmZsaW5lOworCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBrZXlzcGFjZSwgcmV0dXJuIHRoZSBzZXQgb2YgbG9jYWwgYW5kIHBlbmRpbmcgdG9rZW4gcmFuZ2VzLiAgQnkgZGVmYXVsdCB7QGxpbmsgU3RvcmFnZVNlcnZpY2UjZ2V0TG9jYWxBbmRQZW5kaW5nUmFuZ2VzKFN0cmluZyl9CisgICAgICogaXMgZXhwZWN0ZWQsIGJ1dCBmb3IgdGhlIHN0YW5kYWxvbmUgdmVyaWZpZXIgY2FzZSB3ZSBjYW4ndCB1c2UgdGhhdCwgc28gdGhpcyBpcyBoZXJlIHRvIGFsbG93IHRoZSBDTEkgdG8gcHJvdmlkZQorICAgICAqIHRoZSB0b2tlbiByYW5nZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIEZ1bmN0aW9uPFN0cmluZywgPyBleHRlbmRzIENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+Pj4gdG9rZW5Mb29rdXA7CisgICAgcHJvdGVjdGVkIGludCBnb29kUm93czsKKworICAgIHByb3RlY3RlZCBmaW5hbCBPdXRwdXRIYW5kbGVyIG91dHB1dEhhbmRsZXI7CisKKyAgICBwdWJsaWMgU29ydGVkVGFibGVWZXJpZmllcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIFIgc3N0YWJsZSwgT3V0cHV0SGFuZGxlciBvdXRwdXRIYW5kbGVyLCBib29sZWFuIGlzT2ZmbGluZSwgT3B0aW9ucyBvcHRpb25zKQorICAgIHsKKyAgICAgICAgdGhpcy5jZnMgPSBjZnM7CisgICAgICAgIHRoaXMuc3N0YWJsZSA9IHNzdGFibGU7CisgICAgICAgIHRoaXMub3V0cHV0SGFuZGxlciA9IG91dHB1dEhhbmRsZXI7CisKKyAgICAgICAgdGhpcy5maWxlQWNjZXNzTG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgICAgIHRoaXMuZGF0YUZpbGUgPSBpc09mZmxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgID8gc3N0YWJsZS5vcGVuRGF0YVJlYWRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICA6IHNzdGFibGUub3BlbkRhdGFSZWFkZXIoQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZ2V0UmF0ZUxpbWl0ZXIoKSk7CisgICAgICAgIHRoaXMudmVyaWZ5SW5mbyA9IG5ldyBWZXJpZnlJbmZvKGRhdGFGaWxlLCBzc3RhYmxlLCBmaWxlQWNjZXNzTG9jay5yZWFkTG9jaygpKTsKKyAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKyAgICAgICAgdGhpcy5pc09mZmxpbmUgPSBpc09mZmxpbmU7CisgICAgICAgIHRoaXMudG9rZW5Mb29rdXAgPSBvcHRpb25zLnRva2VuTG9va3VwOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGRlc2VyaWFsaXplQmxvb21GaWx0ZXIoU1NUYWJsZVJlYWRlciBzc3RhYmxlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoSUZpbHRlciBmaWx0ZXIgPSBGaWx0ZXJDb21wb25lbnQubG9hZChzc3RhYmxlLmRlc2NyaXB0b3IpKSB7CisgICAgICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJGaWx0ZXIgbG9hZGVkIGZvciB7fSIsIHNzdGFibGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENvbXBhY3Rpb25JbmZvLkhvbGRlciBnZXRWZXJpZnlJbmZvKCkKKyAgICB7CisgICAgICAgIHJldHVybiB2ZXJpZnlJbmZvOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIG1hcmtBbmRUaHJvdyhUaHJvd2FibGUgY2F1c2UpCisgICAgeworICAgICAgICBtYXJrQW5kVGhyb3coY2F1c2UsIHRydWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIG1hcmtBbmRUaHJvdyhUaHJvd2FibGUgY2F1c2UsIGJvb2xlYW4gbXV0YXRlUmVwYWlyZWQpCisgICAgeworICAgICAgICBpZiAobXV0YXRlUmVwYWlyZWQgJiYgb3B0aW9ucy5tdXRhdGVSZXBhaXJTdGF0dXMpIC8vIGlmIHdlIGFyZSBhYmxlIHRvIG11dGF0ZSByZXBhaXJlZCBmbGFnLCBhbiBpbmNyZW1lbnRhbCByZXBhaXIgc2hvdWxkIGJlIGVub3VnaAorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzc3RhYmxlLm11dGF0ZVJlcGFpcmVkQW5kUmVsb2FkKEFjdGl2ZVJlcGFpclNlcnZpY2UuVU5SRVBBSVJFRF9TU1RBQkxFLCBzc3RhYmxlLmdldFBlbmRpbmdSZXBhaXIoKSwgc3N0YWJsZS5pc1RyYW5zaWVudCgpKTsKKyAgICAgICAgICAgICAgICBjZnMuZ2V0VHJhY2tlcigpLm5vdGlmeVNTVGFibGVSZXBhaXJlZFN0YXR1c0NoYW5nZWQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHNzdGFibGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5vdXRwdXQoIkVycm9yIG11dGF0aW5nIHJlcGFpcmVkQXQgZm9yIFNTVGFibGUgJXMsIGFzIHBhcnQgb2YgbWFya0FuZFRocm93Iiwgc3N0YWJsZS5nZXRGaWxlbmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBFeGNlcHRpb24gZSA9IG5ldyBFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiSW52YWxpZCBTU1RhYmxlICVzLCBwbGVhc2UgZm9yY2UgJXNyZXBhaXIiLCBzc3RhYmxlLmdldEZpbGVuYW1lKCksIChtdXRhdGVSZXBhaXJlZCAmJiBvcHRpb25zLm11dGF0ZVJlcGFpclN0YXR1cykgPyAiIiA6ICJhIGZ1bGwgIiksIGNhdXNlKTsKKyAgICAgICAgaWYgKG9wdGlvbnMuaW52b2tlRGlza0ZhaWx1cmVQb2xpY3kpCisgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24oZSwgc3N0YWJsZS5nZXRGaWxlbmFtZSgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmVyaWZ5KCkKKyAgICB7CisgICAgICAgIHZlcmlmeVNTVGFibGVWZXJzaW9uKCk7CisKKyAgICAgICAgdmVyaWZ5U1NUYWJsZU1ldGFkYXRhKCk7CisKKyAgICAgICAgdmVyaWZ5SW5kZXgoKTsKKworICAgICAgICB2ZXJpZnlCbG9vbUZpbHRlcigpOworCisgICAgICAgIGlmIChvcHRpb25zLmNoZWNrT3duc1Rva2VucyAmJiAhaXNPZmZsaW5lICYmICEoY2ZzLmdldFBhcnRpdGlvbmVyKCkgaW5zdGFuY2VvZiBMb2NhbFBhcnRpdGlvbmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZlcmlmeU93bmVkUmFuZ2VzKCkgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAob3B0aW9ucy5xdWljaykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAodmVyaWZ5RGlnZXN0KCkgJiYgIW9wdGlvbnMuZXh0ZW5kZWRWZXJpZmljYXRpb24pCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdmVyaWZ5U1NUYWJsZSgpOworCisgICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KCJWZXJpZnkgb2YgJXMgc3VjY2VlZGVkLiBBbGwgJWQgcm93cyByZWFkIHN1Y2Nlc3NmdWxseSIsIHNzdGFibGUsIGdvb2RSb3dzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlCbG9vbUZpbHRlcigpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5kZWJ1ZygiRGVzZXJpYWxpemluZyBibG9vbSBmaWx0ZXIgZm9yICVzIiwgc3N0YWJsZSk7CisgICAgICAgICAgICBkZXNlcmlhbGl6ZUJsb29tRmlsdGVyKHNzdGFibGUpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKHQpOworICAgICAgICAgICAgbWFya0FuZFRocm93KHQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U1NUYWJsZU1ldGFkYXRhKCkKKyAgICB7CisgICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KCJEZXNlcmlhbGl6aW5nIHNzdGFibGUgbWV0YWRhdGEgZm9yICVzICIsIHNzdGFibGUpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgU3RhdHNDb21wb25lbnQgc3RhdHNDb21wb25lbnQgPSBTdGF0c0NvbXBvbmVudC5sb2FkKHNzdGFibGUuZGVzY3JpcHRvciwgTWV0YWRhdGFUeXBlLlZBTElEQVRJT04sIE1ldGFkYXRhVHlwZS5TVEFUUywgTWV0YWRhdGFUeXBlLkhFQURFUik7CisgICAgICAgICAgICBpZiAoc3RhdHNDb21wb25lbnQudmFsaWRhdGlvbk1ldGFkYXRhKCkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICFzdGF0c0NvbXBvbmVudC52YWxpZGF0aW9uTWV0YWRhdGEoKS5wYXJ0aXRpb25lci5lcXVhbHMoc3N0YWJsZS5nZXRQYXJ0aXRpb25lcigpLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlBhcnRpdGlvbmVyIGRvZXMgbm90IG1hdGNoIHZhbGlkYXRpb24gbWV0YWRhdGEiKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2Fybih0KTsKKyAgICAgICAgICAgIG1hcmtBbmRUaHJvdyh0LCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTU1RhYmxlVmVyc2lvbigpCisgICAgeworICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dCgiVmVyaWZ5aW5nICVzICglcykiLCBzc3RhYmxlLCBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShkYXRhRmlsZS5sZW5ndGgoKSkpOworICAgICAgICBpZiAob3B0aW9ucy5jaGVja1ZlcnNpb24gJiYgIXNzdGFibGUuZGVzY3JpcHRvci52ZXJzaW9uLmlzTGF0ZXN0VmVyc2lvbigpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgiJXMgaXMgbm90IHRoZSBsYXRlc3QgdmVyc2lvbiwgcnVuIHVwZ3JhZGVzc3RhYmxlcyIsIHNzdGFibGUpOworICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5vdXRwdXQobXNnKTsKKyAgICAgICAgICAgIC8vIGRvbid0IHVzZSBtYXJrQW5kVGhyb3cgaGVyZSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgYSBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBmb3IgdGhpcy4KKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1zZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IHZlcmlmeU93bmVkUmFuZ2VzKCkKKyAgICB7CisgICAgICAgIExpc3Q8UmFuZ2U8VG9rZW4+PiBvd25lZFJhbmdlcyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICBvdXRwdXRIYW5kbGVyLmRlYnVnKCJDaGVja2luZyB0aGF0IGFsbCB0b2tlbnMgYXJlIG93bmVkIGJ5IHRoZSBjdXJyZW50IG5vZGUiKTsKKyAgICAgICAgdHJ5IChLZXlJdGVyYXRvciBpdGVyID0gc3N0YWJsZS5rZXlJdGVyYXRvcigpKQorICAgICAgICB7CisgICAgICAgICAgICBvd25lZFJhbmdlcyA9IFJhbmdlLm5vcm1hbGl6ZSh0b2tlbkxvb2t1cC5hcHBseShjZnMubWV0YWRhdGEua2V5c3BhY2UpKTsKKyAgICAgICAgICAgIGlmIChvd25lZFJhbmdlcy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBSYW5nZU93bkhlbHBlciByYW5nZU93bkhlbHBlciA9IG5ldyBSYW5nZU93bkhlbHBlcihvd25lZFJhbmdlcyk7CisgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIHJhbmdlT3duSGVscGVyLnZhbGlkYXRlKGtleSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQorICAgICAgICB7CisgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4odCk7CisgICAgICAgICAgICBtYXJrQW5kVGhyb3codCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gb3duZWRSYW5nZXMuc2l6ZSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIHZlcmlmeURpZ2VzdCgpCisgICAgeworICAgICAgICBib29sZWFuIHBhc3NlZCA9IHRydWU7CisgICAgICAgIC8vIFZlcmlmeSB3aWxsIHVzZSB0aGUgRGlnZXN0IGZpbGVzLCB3aGljaCB3b3JrcyBmb3IgYm90aCBjb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgc3N0YWJsZXMKKyAgICAgICAgb3V0cHV0SGFuZGxlci5vdXRwdXQoIkNoZWNraW5nIGNvbXB1dGVkIGhhc2ggb2YgJXMgIiwgc3N0YWJsZSk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBEYXRhSW50ZWdyaXR5TWV0YWRhdGEuRmlsZURpZ2VzdFZhbGlkYXRvciB2YWxpZGF0b3IgPSBzc3RhYmxlLm1heWJlR2V0RGlnZXN0VmFsaWRhdG9yKCk7CisKKyAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dCgiRGF0YSBkaWdlc3QgbWlzc2luZywgYXNzdW1pbmcgZXh0ZW5kZWQgdmVyaWZpY2F0aW9uIG9mIGRpc2sgdmFsdWVzIik7CisgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2FybihlKTsKKyAgICAgICAgICAgIG1hcmtBbmRUaHJvdyhlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFzc2VkOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHZlcmlmeVNTVGFibGUoKQorICAgIHsKKyAgICAgICAgb3V0cHV0SGFuZGxlci5vdXRwdXQoIkV4dGVuZGVkIFZlcmlmeSByZXF1ZXN0ZWQsIHByb2NlZWRpbmcgdG8gaW5zcGVjdCB2YWx1ZXMiKTsKKworICAgICAgICB0cnkgKFZlcmlmeUNvbnRyb2xsZXIgdmVyaWZ5Q29udHJvbGxlciA9IG5ldyBWZXJpZnlDb250cm9sbGVyKGNmcyk7CisgICAgICAgICAgICAgS2V5UmVhZGVyIGluZGV4SXRlcmF0b3IgPSBzc3RhYmxlLmtleVJlYWRlcigpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW5kZXhJdGVyYXRvci5kYXRhUG9zaXRpb24oKSAhPSAwKQorICAgICAgICAgICAgICAgIG1hcmtBbmRUaHJvdyhuZXcgUnVudGltZUV4Y2VwdGlvbigiRmlyc3Qgcm93IHBvc2l0aW9uIGZyb20gaW5kZXggIT0gMDogIiArIGluZGV4SXRlcmF0b3IuZGF0YVBvc2l0aW9uKCkpKTsKKworICAgICAgICAgICAgTGlzdDxSYW5nZTxUb2tlbj4+IG93bmVkUmFuZ2VzID0gaXNPZmZsaW5lID8gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkgOiBSYW5nZS5ub3JtYWxpemUodG9rZW5Mb29rdXAuYXBwbHkoY2ZzLm1ldGFkYXRhKCkua2V5c3BhY2UpKTsKKyAgICAgICAgICAgIFJhbmdlT3duSGVscGVyIHJhbmdlT3duSGVscGVyID0gbmV3IFJhbmdlT3duSGVscGVyKG93bmVkUmFuZ2VzKTsKKyAgICAgICAgICAgIERlY29yYXRlZEtleSBwcmV2S2V5ID0gbnVsbDsKKworICAgICAgICAgICAgd2hpbGUgKCFkYXRhRmlsZS5pc0VPRigpKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgaWYgKHZlcmlmeUluZm8uaXNTdG9wUmVxdWVzdGVkKCkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb24odmVyaWZ5SW5mby5nZXRDb21wYWN0aW9uSW5mbygpKTsKKworICAgICAgICAgICAgICAgIGxvbmcgcm93U3RhcnQgPSBkYXRhRmlsZS5nZXRGaWxlUG9pbnRlcigpOworICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIuZGVidWcoIlJlYWRpbmcgcm93IGF0ICVkIiwgcm93U3RhcnQpOworCisgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrZXkgPSBzc3RhYmxlLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoZGF0YUZpbGUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0aCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hcmtBbmRUaHJvdyh0aCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hlY2tPd25zVG9rZW5zICYmIG93bmVkUmFuZ2VzLnNpemUoKSA+IDAgJiYgIShjZnMuZ2V0UGFydGl0aW9uZXIoKSBpbnN0YW5jZW9mIExvY2FsUGFydGl0aW9uZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlT3duSGVscGVyLnZhbGlkYXRlKGtleSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4odCwgIktleSAlcyBpbiBzc3RhYmxlICVzIG5vdCBvd25lZCBieSBsb2NhbCByYW5nZXMgJXMiLCBrZXksIHNzdGFibGUsIG93bmVkUmFuZ2VzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtBbmRUaHJvdyh0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgY3VycmVudEluZGV4S2V5ID0gaW5kZXhJdGVyYXRvci5rZXkoKTsKKyAgICAgICAgICAgICAgICBsb25nIG5leHRSb3dQb3NpdGlvbkZyb21JbmRleCA9IDA7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXh0Um93UG9zaXRpb25Gcm9tSW5kZXggPSBpbmRleEl0ZXJhdG9yLmFkdmFuY2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGluZGV4SXRlcmF0b3IuZGF0YVBvc2l0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkYXRhRmlsZS5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0aCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hcmtBbmRUaHJvdyh0aCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbG9uZyBkYXRhU3RhcnQgPSBkYXRhRmlsZS5nZXRGaWxlUG9pbnRlcigpOworICAgICAgICAgICAgICAgIGxvbmcgZGF0YVN0YXJ0RnJvbUluZGV4ID0gY3VycmVudEluZGV4S2V5ID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcm93U3RhcnQgKyAyICsgY3VycmVudEluZGV4S2V5LnJlbWFpbmluZygpOworCisgICAgICAgICAgICAgICAgbG9uZyBkYXRhU2l6ZSA9IG5leHRSb3dQb3NpdGlvbkZyb21JbmRleCAtIGRhdGFTdGFydEZyb21JbmRleDsKKyAgICAgICAgICAgICAgICAvLyBhdm9pZCBhbiBOUEUgaWYga2V5IGlzIG51bGwKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5TmFtZSA9IGtleSA9PSBudWxsID8gIih1bnJlYWRhYmxlIGtleSkiIDogQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChrZXkuZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIuZGVidWcoInJvdyAlcyBpcyAlcyIsIGtleU5hbWUsIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KGRhdGFTaXplKSk7CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCB8fCBkYXRhU2l6ZSA+IGRhdGFGaWxlLmxlbmd0aCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbWFya0FuZFRocm93KG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoImtleSA9ICVzLCBkYXRhU2l6ZT0lZCwgZGF0YUZpbGUubGVuZ3RoKCkgPSAlZCIsIGtleSwgZGF0YVNpemUsIGRhdGFGaWxlLmxlbmd0aCgpKSkpOworCisgICAgICAgICAgICAgICAgICAgIHRyeSAoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yID0gU1NUYWJsZUlkZW50aXR5SXRlcmF0b3IuY3JlYXRlKHNzdGFibGUsIGRhdGFGaWxlLCBrZXkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJpZnlQYXJ0aXRpb24oa2V5LCBpdGVyYXRvcik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoKHByZXZLZXkgIT0gbnVsbCAmJiBwcmV2S2V5LmNvbXBhcmVUbyhrZXkpID4gMCkgfHwgIWtleS5nZXRLZXkoKS5lcXVhbHMoY3VycmVudEluZGV4S2V5KSB8fCBkYXRhU3RhcnQgIT0gZGF0YVN0YXJ0RnJvbUluZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgbWFya0FuZFRocm93KG5ldyBSdW50aW1lRXhjZXB0aW9uKCJLZXkgb3V0IG9mIG9yZGVyOiBwcmV2aW91cyA9ICIgKyBwcmV2S2V5ICsgIiA6IGN1cnJlbnQgPSAiICsga2V5KSk7CisKKyAgICAgICAgICAgICAgICAgICAgZ29vZFJvd3MrKzsKKyAgICAgICAgICAgICAgICAgICAgcHJldktleSA9IGtleTsKKworCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIuZGVidWcoIlJvdyAlcyBhdCAlcyB2YWxpZCwgbW92aW5nIHRvIG5leHQgcm93IGF0ICVzICIsIGdvb2RSb3dzLCByb3dTdGFydCwgbmV4dFJvd1Bvc2l0aW9uRnJvbUluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YUZpbGUuc2VlayhuZXh0Um93UG9zaXRpb25Gcm9tSW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWFya0FuZFRocm93KHRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQorICAgICAgICB7CisgICAgICAgICAgICBUaHJvd2FibGVzLnRocm93SWZVbmNoZWNrZWQodCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHZlcmlmeVBhcnRpdGlvbihEZWNvcmF0ZWRLZXkga2V5LCBVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3IpOworCisgICAgcHJvdGVjdGVkIHZvaWQgdmVyaWZ5SW5kZXgoKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dEhhbmRsZXIuZGVidWcoIkRlc2VyaWFsaXppbmcgaW5kZXggZm9yICVzIiwgc3N0YWJsZSk7CisgICAgICAgICAgICBkZXNlcmlhbGl6ZUluZGV4KHNzdGFibGUpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKHQpOworICAgICAgICAgICAgbWFya0FuZFRocm93KHQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlc2VyaWFsaXplSW5kZXgoU1NUYWJsZVJlYWRlciBzc3RhYmxlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoS2V5UmVhZGVyIGl0ID0gc3N0YWJsZS5rZXlSZWFkZXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBsYXN0ID0gaXQua2V5KCk7CisgICAgICAgICAgICB3aGlsZSAoaXQuYWR2YW5jZSgpKSBsYXN0ID0gaXQua2V5KCk7IC8vIG5vLW9wLCBqdXN0IGNoZWNrIGlmIGluZGV4IGlzIHJlYWRhYmxlCisgICAgICAgICAgICBpZiAoIU9iamVjdHMuZXF1YWxzKGxhc3QsIHNzdGFibGUubGFzdC5nZXRLZXkoKSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKG5ldyBJT0V4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgcGFydGl0aW9uIGluZGV4IiksIGl0LnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgIHsKKyAgICAgICAgZmlsZUFjY2Vzc0xvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlUXVpZXRseShkYXRhRmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBmaWxlQWNjZXNzTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZSB0aGUgZmFjdCB0aGF0IGNoZWNrKC4uLikgaXMgY2FsbGVkIHdpdGggc29ydGVkIHRva2VucyAtIHdlIGtlZXAgYSBwb2ludGVyIGluIHRvIHRoZSBub3JtYWxpemVkIHJhbmdlcworICAgICAqIGFuZCBvbmx5IGJ1bXAgdGhlIHBvaW50ZXIgaWYgdGhlIGtleSBnaXZlbiBpcyBvdXQgb2YgcmFuZ2UuIFRoaXMgaXMgZG9uZSB0byBhdm9pZCBjYWxsaW5nIC5jb250YWlucyguLikgbWFueQorICAgICAqIHRpbWVzIGZvciBlYWNoIGtleSAod2l0aCB2bm9kZXMgZm9yIGV4YW1wbGUpCisgICAgICovCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSYW5nZU93bkhlbHBlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFJhbmdlPFRva2VuPj4gbm9ybWFsaXplZFJhbmdlczsKKyAgICAgICAgcHJpdmF0ZSBpbnQgcmFuZ2VJbmRleCA9IDA7CisgICAgICAgIHByaXZhdGUgRGVjb3JhdGVkS2V5IGxhc3RLZXk7CisKKyAgICAgICAgcHVibGljIFJhbmdlT3duSGVscGVyKExpc3Q8UmFuZ2U8VG9rZW4+PiBub3JtYWxpemVkUmFuZ2VzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWRSYW5nZXMgPSBub3JtYWxpemVkUmFuZ2VzOworICAgICAgICAgICAgUmFuZ2UuYXNzZXJ0Tm9ybWFsaXplZChub3JtYWxpemVkUmFuZ2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBjaGVjayBpZiB0aGUgZ2l2ZW4ga2V5IGlzIGNvbnRhaW5lZCBpbiBhbnkgb2YgdGhlIGdpdmVuIHJhbmdlcworICAgICAgICAgKiA8cD4KKyAgICAgICAgICogTXVzdCBiZSBjYWxsZWQgaW4gc29ydGVkIG9yZGVyIC0ga2V5IHNob3VsZCBiZSBpbmNyZWFzaW5nCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleQorICAgICAgICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gaWYgdGhlIGtleSBpcyBub3QgY29udGFpbmVkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShEZWNvcmF0ZWRLZXkga2V5KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWNoZWNrKGtleSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIktleSAiICsga2V5ICsgIiBpcyBub3QgY29udGFpbmVkIGluIHRoZSBnaXZlbiByYW5nZXMiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBjaGVjayBpZiB0aGUgZ2l2ZW4ga2V5IGlzIGNvbnRhaW5lZCBpbiBhbnkgb2YgdGhlIGdpdmVuIHJhbmdlcworICAgICAgICAgKiA8cD4KKyAgICAgICAgICogTXVzdCBiZSBjYWxsZWQgaW4gc29ydGVkIG9yZGVyIC0ga2V5IHNob3VsZCBiZSBpbmNyZWFzaW5nCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleQorICAgICAgICAgKiBAcmV0dXJuIGJvb2xlYW4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNoZWNrKERlY29yYXRlZEtleSBrZXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBsYXN0S2V5ID09IG51bGwgfHwga2V5LmNvbXBhcmVUbyhsYXN0S2V5KSA+IDA7CisgICAgICAgICAgICBsYXN0S2V5ID0ga2V5OworCisgICAgICAgICAgICBpZiAobm9ybWFsaXplZFJhbmdlcy5pc0VtcHR5KCkpIC8vIGhhbmRsZSB0ZXN0cyBldGMuIHdoZXJlIHdlIGRvbid0IGhhdmUgYW55IHJhbmdlcworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICBpZiAocmFuZ2VJbmRleCA+IG5vcm1hbGl6ZWRSYW5nZXMuc2l6ZSgpIC0gMSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJSYW5nZU93bkhlbHBlciBjYW4gb25seSBiZSB1c2VkIHRvIGZpbmQgdGhlIGZpcnN0IG91dC1vZi1yYW5nZS10b2tlbiIpOworCisgICAgICAgICAgICB3aGlsZSAoIW5vcm1hbGl6ZWRSYW5nZXMuZ2V0KHJhbmdlSW5kZXgpLmNvbnRhaW5zKGtleS5nZXRUb2tlbigpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYW5nZUluZGV4Kys7CisgICAgICAgICAgICAgICAgaWYgKHJhbmdlSW5kZXggPiBub3JtYWxpemVkUmFuZ2VzLnNpemUoKSAtIDEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFZlcmlmeUluZm8gZXh0ZW5kcyBDb21wYWN0aW9uSW5mby5Ib2xkZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmFuZG9tQWNjZXNzUmVhZGVyIGRhdGFGaWxlOworICAgICAgICBwcml2YXRlIGZpbmFsIFNTVGFibGVSZWFkZXIgc3N0YWJsZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUaW1lVVVJRCB2ZXJpZmljYXRpb25Db21wYWN0aW9uSWQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgTG9jayBmaWxlUmVhZExvY2s7CisKKyAgICAgICAgcHVibGljIFZlcmlmeUluZm8oUmFuZG9tQWNjZXNzUmVhZGVyIGRhdGFGaWxlLCBTU1RhYmxlUmVhZGVyIHNzdGFibGUsIExvY2sgZmlsZVJlYWRMb2NrKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmRhdGFGaWxlID0gZGF0YUZpbGU7CisgICAgICAgICAgICB0aGlzLnNzdGFibGUgPSBzc3RhYmxlOworICAgICAgICAgICAgdGhpcy5maWxlUmVhZExvY2sgPSBmaWxlUmVhZExvY2s7CisgICAgICAgICAgICB2ZXJpZmljYXRpb25Db21wYWN0aW9uSWQgPSBUaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29tcGFjdGlvbkluZm8gZ2V0Q29tcGFjdGlvbkluZm8oKQorICAgICAgICB7CisgICAgICAgICAgICBmaWxlUmVhZExvY2subG9jaygpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wYWN0aW9uSW5mbyhzc3RhYmxlLm1ldGFkYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25UeXBlLlZFUklGWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFGaWxlLmdldEZpbGVQb2ludGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhRmlsZS5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbkNvbXBhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZVNldC5vZihzc3RhYmxlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWxlUmVhZExvY2sudW5sb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0dsb2JhbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVmVyaWZ5Q29udHJvbGxlciBleHRlbmRzIENvbXBhY3Rpb25Db250cm9sbGVyCisgICAgeworICAgICAgICBwdWJsaWMgVmVyaWZ5Q29udHJvbGxlcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGNmcywgSW50ZWdlci5NQVhfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMb25nUHJlZGljYXRlIGdldFB1cmdlRXZhbHVhdG9yKERlY29yYXRlZEtleSBrZXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0aW1lIC0+IGZhbHNlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU29ydGVkVGFibGVXcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NvcnRlZFRhYmxlV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc3MTY5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NvcnRlZFRhYmxlV3JpdGVyLmphdmEKQEAgLTAsMCArMSw0NzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlbGV0aW9uUHVyZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlbGV0aW9uVGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzLkd1YXJkcmFpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZU5ld1RyYWNrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Db21wbGV4Q29sdW1uRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlBhcnRpdGlvblNlcmlhbGl6YXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5SYW5nZVRvbWJzdG9uZUJvdW5kTWFya2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUmFuZ2VUb21ic3RvbmVCb3VuZGFyeU1hcmtlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJhbmdlVG9tYnN0b25lTWFya2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNXcml0ZUVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkNvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkNvbXByZXNzaW9uTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFJvd0luZGV4RW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVGbHVzaE9ic2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLlN0YXRzTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhUG9zaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GaWx0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLklGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlRyYW5zYWN0aW9uYWw7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworLyoqCisgKiBBIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgYSB3cml0ZXIgd2hpY2ggYXNzdW1lcyB0aGUgZXhpc3RlbmNlIG9mIHNvbWUgcGFydGl0aW9uIGluZGV4IGFuZCBibG9vbSBmaWx0ZXIuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTb3J0ZWRUYWJsZVdyaXRlcjxQIGV4dGVuZHMgU29ydGVkVGFibGVQYXJ0aXRpb25Xcml0ZXI+IGV4dGVuZHMgU1NUYWJsZVdyaXRlcgoreworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTb3J0ZWRUYWJsZVdyaXRlci5jbGFzcyk7CisKKyAgICAvLyBUT0RPIGRhdGFXcml0ZXIgaXMgbm90IG5lZWRlZCB0byBiZSBkaXJlY3RseSBhY2Nlc3NpYmxlIC0gd2UgY2FuIGFjY2VzcyBldmVyeXRoaW5nIHdlIG5lZWQgZm9yIHRoZSBkYXRhV3JpdGVyCisgICAgLy8gICBmcm9tIGEgcGFydGl0aW9uIHdyaXRlcgorICAgIHByb3RlY3RlZCBmaW5hbCBTZXF1ZW50aWFsV3JpdGVyIGRhdGFXcml0ZXI7CisgICAgcHJvdGVjdGVkIGZpbmFsIFAgcGFydGl0aW9uV3JpdGVyOworICAgIHByaXZhdGUgZmluYWwgRmlsZUhhbmRsZS5CdWlsZGVyIGRhdGFGaWxlQnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuREFUQSkpOworICAgIHByaXZhdGUgRGVjb3JhdGVkS2V5IGxhc3RXcml0dGVuS2V5OworICAgIHByaXZhdGUgRGF0YVBvc2l0aW9uIGRhdGFNYXJrOworICAgIHByaXZhdGUgbG9uZyBsYXN0RWFybHlPcGVuTGVuZ3RoOworCisgICAgcHVibGljIFNvcnRlZFRhYmxlV3JpdGVyKEJ1aWxkZXI8UCwgPywgPz4gYnVpbGRlciwgTGlmZWN5Y2xlTmV3VHJhY2tlciBsaWZlY3ljbGVOZXdUcmFja2VyLCBTU1RhYmxlLk93bmVyIG93bmVyKQorICAgIHsKKyAgICAgICAgc3VwZXIoYnVpbGRlciwgbGlmZWN5Y2xlTmV3VHJhY2tlciwgb3duZXIpOworICAgICAgICBjaGVja05vdE51bGwoYnVpbGRlci5nZXREYXRhV3JpdGVyKCkpOworICAgICAgICBjaGVja05vdE51bGwoYnVpbGRlci5nZXRQYXJ0aXRpb25Xcml0ZXIoKSk7CisKKyAgICAgICAgdGhpcy5kYXRhV3JpdGVyID0gYnVpbGRlci5nZXREYXRhV3JpdGVyKCk7CisgICAgICAgIHRoaXMucGFydGl0aW9uV3JpdGVyID0gYnVpbGRlci5nZXRQYXJ0aXRpb25Xcml0ZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmRzIHBhcnRpdGlvbiBkYXRhIHRvIHRoaXMgd3JpdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcnRpdGlvbiB0aGUgcGFydGl0aW9uIHRvIHdyaXRlCisgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBpbmRleCBlbnRyeSBpZiBzb21ldGhpbmcgd2FzIHdyaXR0ZW4sIHRoYXQgaXMgaWYge0Bjb2RlIGl0ZXJhdG9yfSB3YXNuJ3QgZW1wdHksCisgICAgICoge0Bjb2RlIG51bGx9IG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIEZTV3JpdGVFcnJvciBpZiB3cml0ZSB0byB0aGUgZGF0YUZpbGUgZmFpbHMKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgQWJzdHJhY3RSb3dJbmRleEVudHJ5IGFwcGVuZChVbmZpbHRlcmVkUm93SXRlcmF0b3IgcGFydGl0aW9uKQorICAgIHsKKyAgICAgICAgaWYgKHBhcnRpdGlvbi5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCF2ZXJpZnlQYXJ0aXRpb24ocGFydGl0aW9uLnBhcnRpdGlvbktleSgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgc3RhcnRQYXJ0aXRpb24ocGFydGl0aW9uLnBhcnRpdGlvbktleSgpLCBwYXJ0aXRpb24ucGFydGl0aW9uTGV2ZWxEZWxldGlvbigpKTsKKworICAgICAgICAgICAgQWJzdHJhY3RSb3dJbmRleEVudHJ5IGluZGV4RW50cnk7CisgICAgICAgICAgICBpZiAoaGVhZGVyLmhhc1N0YXRpYygpKQorICAgICAgICAgICAgICAgIGFkZFN0YXRpY1JvdyhwYXJ0aXRpb24ucGFydGl0aW9uS2V5KCksIHBhcnRpdGlvbi5zdGF0aWNSb3coKSk7CisKKyAgICAgICAgICAgIHdoaWxlIChwYXJ0aXRpb24uaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgIGFkZFVuZmlsdGVyZWQocGFydGl0aW9uLnBhcnRpdGlvbktleSgpLCBwYXJ0aXRpb24ubmV4dCgpKTsKKworICAgICAgICAgICAgaW5kZXhFbnRyeSA9IGVuZFBhcnRpdGlvbihwYXJ0aXRpb24ucGFydGl0aW9uS2V5KCksIHBhcnRpdGlvbi5wYXJ0aXRpb25MZXZlbERlbGV0aW9uKCkpOworCisgICAgICAgICAgICByZXR1cm4gaW5kZXhFbnRyeTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24gYm9lKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUGFydGl0aW9uU2VyaWFsaXphdGlvbkV4Y2VwdGlvbihwYXJ0aXRpb24sIGJvZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBGU1dyaXRlRXJyb3IoZSwgZ2V0RmlsZW5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gdmVyaWZ5UGFydGl0aW9uKERlY29yYXRlZEtleSBrZXkpCisgICAgeworICAgICAgICBhc3NlcnQga2V5ICE9IG51bGwgOiAiS2V5cyBtdXN0IG5vdCBiZSBudWxsIjsgLy8gZW1wdHkga2V5cyBBUkUgYWxsb3dlZCBiL2Mgb2YgaW5kZXhlZCBjb2x1bW4gdmFsdWVzCisKKyAgICAgICAgaWYgKGtleS5nZXRLZXkoKS5yZW1haW5pbmcoKSA+IEZCVXRpbGl0aWVzLk1BWF9VTlNJR05FRF9TSE9SVCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJLZXkgc2l6ZSB7fSBleGNlZWRzIG1heGltdW0gb2Yge30sIHNraXBwaW5nIHJvdyIsIGtleS5nZXRLZXkoKS5yZW1haW5pbmcoKSwgRkJVdGlsaXRpZXMuTUFYX1VOU0lHTkVEX1NIT1JUKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsYXN0V3JpdHRlbktleSAhPSBudWxsICYmIGxhc3RXcml0dGVuS2V5LmNvbXBhcmVUbyhrZXkpID49IDApCisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJMYXN0IHdyaXR0ZW4ga2V5ICVzID49IGN1cnJlbnQga2V5ICVzLCB3cml0aW5nIGludG8gJXMiLCBsYXN0V3JpdHRlbktleSwga2V5LCBnZXRGaWxlbmFtZSgpKSk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0UGFydGl0aW9uKERlY29yYXRlZEtleSBrZXksIERlbGV0aW9uVGltZSBwYXJ0aXRpb25MZXZlbERlbGV0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHBhcnRpdGlvbldyaXRlci5zdGFydChrZXksIHBhcnRpdGlvbkxldmVsRGVsZXRpb24pOworICAgICAgICBtZXRhZGF0YUNvbGxlY3Rvci51cGRhdGVQYXJ0aXRpb25EZWxldGlvbihwYXJ0aXRpb25MZXZlbERlbGV0aW9uKTsKKworICAgICAgICBvblN0YXJ0UGFydGl0aW9uKGtleSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZFN0YXRpY1JvdyhEZWNvcmF0ZWRLZXkga2V5LCBSb3cgcm93KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGd1YXJkQ29sbGVjdGlvblNpemUoa2V5LCByb3cpOworCisgICAgICAgIHBhcnRpdGlvbldyaXRlci5hZGRTdGF0aWNSb3cocm93KTsKKyAgICAgICAgaWYgKCFyb3cuaXNFbXB0eSgpKQorICAgICAgICAgICAgUm93cy5jb2xsZWN0U3RhdHMocm93LCBtZXRhZGF0YUNvbGxlY3Rvcik7CisKKyAgICAgICAgb25TdGF0aWNSb3cocm93KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkVW5maWx0ZXJlZChEZWNvcmF0ZWRLZXkga2V5LCBVbmZpbHRlcmVkIHVuZmlsdGVyZWQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKHVuZmlsdGVyZWQuaXNSb3coKSkKKyAgICAgICAgICAgIGFkZFJvdyhrZXksIChSb3cpIHVuZmlsdGVyZWQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhZGRSYW5nZVRvbXN0b25lTWFya2VyKChSYW5nZVRvbWJzdG9uZU1hcmtlcikgdW5maWx0ZXJlZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZFJvdyhEZWNvcmF0ZWRLZXkga2V5LCBSb3cgcm93KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGd1YXJkQ29sbGVjdGlvblNpemUoa2V5LCByb3cpOworCisgICAgICAgIHBhcnRpdGlvbldyaXRlci5hZGRVbmZpbHRlcmVkKHJvdyk7CisgICAgICAgIG1ldGFkYXRhQ29sbGVjdG9yLnVwZGF0ZUNsdXN0ZXJpbmdWYWx1ZXMocm93LmNsdXN0ZXJpbmcoKSk7CisgICAgICAgIFJvd3MuY29sbGVjdFN0YXRzKHJvdywgbWV0YWRhdGFDb2xsZWN0b3IpOworCisgICAgICAgIG9uUm93KHJvdyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZFJhbmdlVG9tc3RvbmVNYXJrZXIoUmFuZ2VUb21ic3RvbmVNYXJrZXIgbWFya2VyKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHBhcnRpdGlvbldyaXRlci5hZGRVbmZpbHRlcmVkKG1hcmtlcik7CisKKyAgICAgICAgbWV0YWRhdGFDb2xsZWN0b3IudXBkYXRlQ2x1c3RlcmluZ1ZhbHVlc0J5Qm91bmRPckJvdW5kYXJ5KG1hcmtlci5jbHVzdGVyaW5nKCkpOworICAgICAgICBpZiAobWFya2VyLmlzQm91bmRhcnkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgUmFuZ2VUb21ic3RvbmVCb3VuZGFyeU1hcmtlciBibSA9IChSYW5nZVRvbWJzdG9uZUJvdW5kYXJ5TWFya2VyKSBtYXJrZXI7CisgICAgICAgICAgICBtZXRhZGF0YUNvbGxlY3Rvci51cGRhdGUoYm0uZW5kRGVsZXRpb25UaW1lKCkpOworICAgICAgICAgICAgbWV0YWRhdGFDb2xsZWN0b3IudXBkYXRlKGJtLnN0YXJ0RGVsZXRpb25UaW1lKCkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbWV0YWRhdGFDb2xsZWN0b3IudXBkYXRlKCgoUmFuZ2VUb21ic3RvbmVCb3VuZE1hcmtlcikgbWFya2VyKS5kZWxldGlvblRpbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBvblJhbmdlVG9tYnN0b25lTWFya2VyKG1hcmtlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBBYnN0cmFjdFJvd0luZGV4RW50cnkgZW5kUGFydGl0aW9uKERlY29yYXRlZEtleSBrZXksIERlbGV0aW9uVGltZSBwYXJ0aXRpb25MZXZlbERlbGV0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGxvbmcgZmluaXNoUmVzdWx0ID0gcGFydGl0aW9uV3JpdGVyLmZpbmlzaCgpOworCisgICAgICAgIGxvbmcgZW5kUG9zaXRpb24gPSBkYXRhV3JpdGVyLnBvc2l0aW9uKCk7CisgICAgICAgIGxvbmcgcm93U2l6ZSA9IGVuZFBvc2l0aW9uIC0gcGFydGl0aW9uV3JpdGVyLmdldEluaXRpYWxQb3NpdGlvbigpOworICAgICAgICBndWFyZFBhcnRpdGlvblNpemUoa2V5LCByb3dTaXplKTsKKyAgICAgICAgbWF5YmVMb2dMYXJnZVBhcnRpdGlvbldhcm5pbmcoa2V5LCByb3dTaXplKTsKKyAgICAgICAgbWF5YmVMb2dNYW55VG9tYnN0b25lc1dhcm5pbmcoa2V5LCBtZXRhZGF0YUNvbGxlY3Rvci50b3RhbFRvbWJzdG9uZXMpOworICAgICAgICBtZXRhZGF0YUNvbGxlY3Rvci5hZGRQYXJ0aXRpb25TaXplSW5CeXRlcyhyb3dTaXplKTsKKyAgICAgICAgbWV0YWRhdGFDb2xsZWN0b3IuYWRkS2V5KGtleS5nZXRLZXkoKSk7CisgICAgICAgIG1ldGFkYXRhQ29sbGVjdG9yLmFkZENlbGxQZXJQYXJ0aXRpb25Db3VudCgpOworCisgICAgICAgIGxhc3RXcml0dGVuS2V5ID0ga2V5OworICAgICAgICBsYXN0ID0gbGFzdFdyaXR0ZW5LZXk7CisgICAgICAgIGlmIChmaXJzdCA9PSBudWxsKQorICAgICAgICAgICAgZmlyc3QgPSBsYXN0V3JpdHRlbktleTsKKworICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICBsb2dnZXIudHJhY2UoIndyb3RlIHt9IGF0IHt9Iiwga2V5LCBlbmRQb3NpdGlvbik7CisKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVJvd0luZGV4RW50cnkoa2V5LCBwYXJ0aXRpb25MZXZlbERlbGV0aW9uLCBmaW5pc2hSZXN1bHQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIG9uU3RhcnRQYXJ0aXRpb24oRGVjb3JhdGVkS2V5IGtleSkKKyAgICB7CisgICAgICAgIG5vdGlmeU9ic2VydmVycyhvIC0+IG8uc3RhcnRQYXJ0aXRpb24oa2V5LCBwYXJ0aXRpb25Xcml0ZXIuZ2V0SW5pdGlhbFBvc2l0aW9uKCksIHBhcnRpdGlvbldyaXRlci5nZXRJbml0aWFsUG9zaXRpb24oKSkpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIG9uU3RhdGljUm93KFJvdyByb3cpCisgICAgeworICAgICAgICBub3RpZnlPYnNlcnZlcnMobyAtPiBvLnN0YXRpY1Jvdyhyb3cpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJvdyhSb3cgcm93KQorICAgIHsKKyAgICAgICAgbm90aWZ5T2JzZXJ2ZXJzKG8gLT4gby5uZXh0VW5maWx0ZXJlZENsdXN0ZXIocm93KSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgb25SYW5nZVRvbWJzdG9uZU1hcmtlcihSYW5nZVRvbWJzdG9uZU1hcmtlciBtYXJrZXIpCisgICAgeworICAgICAgICBub3RpZnlPYnNlcnZlcnMobyAtPiBvLm5leHRVbmZpbHRlcmVkQ2x1c3RlcihtYXJrZXIpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQWJzdHJhY3RSb3dJbmRleEVudHJ5IGNyZWF0ZVJvd0luZGV4RW50cnkoRGVjb3JhdGVkS2V5IGtleSwgRGVsZXRpb25UaW1lIHBhcnRpdGlvbkxldmVsRGVsZXRpb24sIGxvbmcgZmluaXNoUmVzdWx0KSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBub3RpZnlPYnNlcnZlcnMoQ29uc3VtZXI8U1NUYWJsZUZsdXNoT2JzZXJ2ZXI+IGFjdGlvbikKKyAgICB7CisgICAgICAgIGlmIChvYnNlcnZlcnMgIT0gbnVsbCAmJiAhb2JzZXJ2ZXJzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIG9ic2VydmVycy5mb3JFYWNoKGFjdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbWFyaygpCisgICAgeworICAgICAgICBkYXRhTWFyayA9IGRhdGFXcml0ZXIubWFyaygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlc2V0QW5kVHJ1bmNhdGUoKQorICAgIHsKKyAgICAgICAgZGF0YVdyaXRlci5yZXNldEFuZFRydW5jYXRlKGRhdGFNYXJrKTsKKyAgICAgICAgcGFydGl0aW9uV3JpdGVyLnJlc2V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0RmlsZVBvaW50ZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRhdGFXcml0ZXIucG9zaXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRPbkRpc2tGaWxlUG9pbnRlcigpCisgICAgeworICAgICAgICByZXR1cm4gZGF0YVdyaXRlci5nZXRPbkRpc2tGaWxlUG9pbnRlcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldEVzdGltYXRlZE9uRGlza0J5dGVzV3JpdHRlbigpCisgICAgeworICAgICAgICByZXR1cm4gZGF0YVdyaXRlci5nZXRFc3RpbWF0ZWRPbkRpc2tCeXRlc1dyaXR0ZW4oKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRmlsZUhhbmRsZSBvcGVuRGF0YUZpbGUobG9uZyBsZW5ndGhPdmVycmlkZSwgU3RhdHNNZXRhZGF0YSBzdGF0c01ldGFkYXRhKQorICAgIHsKKyAgICAgICAgaW50IGRhdGFCdWZmZXJTaXplID0gaW9PcHRpb25zLmRpc2tPcHRpbWl6YXRpb25TdHJhdGVneS5idWZmZXJTaXplKHN0YXRzTWV0YWRhdGEuZXN0aW1hdGVkUGFydGl0aW9uU2l6ZS5wZXJjZW50aWxlKGlvT3B0aW9ucy5kaXNrT3B0aW1pemF0aW9uRXN0aW1hdGVQZXJjZW50aWxlKSk7CisKKworICAgICAgICBGaWxlSGFuZGxlIGRhdGFGaWxlOworICAgICAgICB0cnkgKENvbXByZXNzaW9uTWV0YWRhdGEgY29tcHJlc3Npb25NZXRhZGF0YSA9IGNvbXByZXNzaW9uID8gKChDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlcikgZGF0YVdyaXRlcikub3BlbihsZW5ndGhPdmVycmlkZSkgOiBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBkYXRhRmlsZSA9IGRhdGFGaWxlQnVpbGRlci5tbWFwcGVkKGlvT3B0aW9ucy5kZWZhdWx0RGlza0FjY2Vzc01vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoTW1hcHBlZFJlZ2lvbnNDYWNoZShtbWFwcGVkUmVnaW9uc0NhY2hlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENodW5rQ2FjaGUoY2h1bmtDYWNoZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb21wcmVzc2lvbk1ldGFkYXRhKGNvbXByZXNzaW9uTWV0YWRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWZmZXJTaXplKGRhdGFCdWZmZXJTaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aExlbmd0aE92ZXJyaWRlKGxlbmd0aE92ZXJyaWRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29tcGxldGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2h1bmtDYWNoZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChsYXN0RWFybHlPcGVuTGVuZ3RoICE9IDAgJiYgZGF0YUZpbGUuZGF0YUxlbmd0aCgpID4gbGFzdEVhcmx5T3Blbkxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgY2h1bmtDYWNoZS5pbnZhbGlkYXRlUG9zaXRpb24oZGF0YUZpbGUsIGxhc3RFYXJseU9wZW5MZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdEVhcmx5T3Blbkxlbmd0aCA9IGRhdGFGaWxlLmRhdGFMZW5ndGgoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB8IEVycm9yIGV4KQorICAgICAgICB7CisgICAgICAgICAgICBUaHJvd2FibGVzLmNsb3NlTm9uTnVsbEFuZEFkZFN1cHByZXNzZWQoZXgsIGRhdGFGaWxlKTsKKyAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRhdGFGaWxlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBndWFyZFBhcnRpdGlvblNpemUoRGVjb3JhdGVkS2V5IGtleSwgbG9uZyByb3dTaXplKQorICAgIHsKKyAgICAgICAgaWYgKEd1YXJkcmFpbHMucGFydGl0aW9uU2l6ZS50cmlnZ2Vyc09uKHJvd1NpemUsIG51bGwpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgd2hhdCA9IFN0cmluZy5mb3JtYXQoIiVzLiVzOiVzIG9uIHNzdGFibGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLmtleXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEoKS5wYXJ0aXRpb25LZXlUeXBlLmdldFN0cmluZyhrZXkuZ2V0S2V5KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpbGVuYW1lKCkpOworICAgICAgICAgICAgR3VhcmRyYWlscy5wYXJ0aXRpb25TaXplLmd1YXJkKHJvd1NpemUsIHdoYXQsIHRydWUsIG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG1heWJlTG9nTGFyZ2VQYXJ0aXRpb25XYXJuaW5nKERlY29yYXRlZEtleSBrZXksIGxvbmcgcm93U2l6ZSkKKyAgICB7CisgICAgICAgIGlmIChyb3dTaXplID4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbXBhY3Rpb25MYXJnZVBhcnRpdGlvbldhcm5pbmdUaHJlc2hvbGQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIGtleVN0cmluZyA9IG1ldGFkYXRhKCkucGFydGl0aW9uS2V5VHlwZS5nZXRTdHJpbmcoa2V5LmdldEtleSgpKTsKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCJXcml0aW5nIGxhcmdlIHBhcnRpdGlvbiB7fS97fTp7fSAoe30pIHRvIHNzdGFibGUge30iLCBtZXRhZGF0YS5rZXlzcGFjZSwgbWV0YWRhdGEubmFtZSwga2V5U3RyaW5nLCBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShyb3dTaXplKSwgZ2V0RmlsZW5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWF5YmVMb2dNYW55VG9tYnN0b25lc1dhcm5pbmcoRGVjb3JhdGVkS2V5IGtleSwgaW50IHRvbWJzdG9uZUNvdW50KQorICAgIHsKKyAgICAgICAgaWYgKHRvbWJzdG9uZUNvdW50ID4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbXBhY3Rpb25Ub21ic3RvbmVXYXJuaW5nVGhyZXNob2xkKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBrZXlTdHJpbmcgPSBtZXRhZGF0YSgpLnBhcnRpdGlvbktleVR5cGUuZ2V0U3RyaW5nKGtleS5nZXRLZXkoKSk7CisgICAgICAgICAgICBsb2dnZXIud2FybigiV3JpdGluZyB7fSB0b21ic3RvbmVzIHRvIHt9L3t9Ont9IGluIHNzdGFibGUge30iLCB0b21ic3RvbmVDb3VudCwgbWV0YWRhdGEua2V5c3BhY2UsIG1ldGFkYXRhLm5hbWUsIGtleVN0cmluZywgZ2V0RmlsZW5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ3VhcmRDb2xsZWN0aW9uU2l6ZShEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5LCBSb3cgcm93KQorICAgIHsKKyAgICAgICAgaWYgKCFHdWFyZHJhaWxzLmNvbGxlY3Rpb25TaXplLmVuYWJsZWQoKSAmJiAhR3VhcmRyYWlscy5pdGVtc1BlckNvbGxlY3Rpb24uZW5hYmxlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChyb3cuaXNFbXB0eSgpIHx8IFNjaGVtYUNvbnN0YW50cy5pc1N5c3RlbUtleXNwYWNlKG1ldGFkYXRhLmtleXNwYWNlKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBmb3IgKENvbHVtbk1ldGFkYXRhIGNvbHVtbiA6IHJvdy5jb2x1bW5zKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghY29sdW1uLnR5cGUuaXNDb2xsZWN0aW9uKCkgfHwgIWNvbHVtbi50eXBlLmlzTXVsdGlDZWxsKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIENvbXBsZXhDb2x1bW5EYXRhIGNlbGxzID0gcm93LmdldENvbXBsZXhDb2x1bW5EYXRhKGNvbHVtbik7CisgICAgICAgICAgICBpZiAoY2VsbHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgQ29tcGxleENvbHVtbkRhdGEgbGl2ZUNlbGxzID0gY2VsbHMucHVyZ2UoRGVsZXRpb25QdXJnZXIuUFVSR0VfQUxMLCBGQlV0aWxpdGllcy5ub3dJblNlY29uZHMoKSk7CisgICAgICAgICAgICBpZiAobGl2ZUNlbGxzID09IG51bGwpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGludCBjZWxsc1NpemUgPSBsaXZlQ2VsbHMuZGF0YVNpemUoKTsKKyAgICAgICAgICAgIGludCBjZWxsc0NvdW50ID0gbGl2ZUNlbGxzLmNlbGxzQ291bnQoKTsKKworICAgICAgICAgICAgaWYgKCFHdWFyZHJhaWxzLmNvbGxlY3Rpb25TaXplLnRyaWdnZXJzT24oY2VsbHNTaXplLCBudWxsKSAmJgorICAgICAgICAgICAgICAgICFHdWFyZHJhaWxzLml0ZW1zUGVyQ29sbGVjdGlvbi50cmlnZ2Vyc09uKGNlbGxzQ291bnQsIG51bGwpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBTdHJpbmcga2V5U3RyaW5nID0gbWV0YWRhdGEuZ2V0TG9jYWwoKS5wcmltYXJ5S2V5QXNDUUxMaXRlcmFsKHBhcnRpdGlvbktleS5nZXRLZXkoKSwgcm93LmNsdXN0ZXJpbmcoKSk7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgiJXMgaW4gcm93ICVzIGluIHRhYmxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5uYW1lLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSk7CisgICAgICAgICAgICBHdWFyZHJhaWxzLmNvbGxlY3Rpb25TaXplLmd1YXJkKGNlbGxzU2l6ZSwgbXNnLCB0cnVlLCBudWxsKTsKKyAgICAgICAgICAgIEd1YXJkcmFpbHMuaXRlbXNQZXJDb2xsZWN0aW9uLmd1YXJkKGNlbGxzQ291bnQsIG1zZywgdHJ1ZSwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SW5kZXhXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdFRyYW5zYWN0aW9uYWwgaW1wbGVtZW50cyBUcmFuc2FjdGlvbmFsCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgRGVzY3JpcHRvciBkZXNjcmlwdG9yOworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YTsKKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHM7CisKKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIElGaWx0ZXIgYmY7CisKKyAgICAgICAgcHJvdGVjdGVkIEFic3RyYWN0SW5kZXhXcml0ZXIoQnVpbGRlcjw/LCA/LCA/PiBiKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBiLmRlc2NyaXB0b3I7CisgICAgICAgICAgICB0aGlzLm1ldGFkYXRhID0gYi5nZXRUYWJsZU1ldGFkYXRhUmVmKCk7CisgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSBiLmdldENvbXBvbmVudHMoKTsKKworICAgICAgICAgICAgYmYgPSBGaWx0ZXJGYWN0b3J5LmdldEZpbHRlcihiLmdldEtleUNvdW50KCksIGIuZ2V0VGFibGVNZXRhZGF0YVJlZigpLmdldExvY2FsKCkucGFyYW1zLmJsb29tRmlsdGVyRnBDaGFuY2UpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZmx1c2hCZigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudHMuRklMVEVSKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZpbHRlckNvbXBvbmVudC5zYXZlKGJmLCBkZXNjcmlwdG9yLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZTV3JpdGVFcnJvcihleCwgZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuRklMVEVSKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9QcmVwYXJlKCkKKyAgICAgICAgeworICAgICAgICAgICAgZmx1c2hCZigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBUaHJvd2FibGUgZG9Qb3N0Q2xlYW51cChUaHJvd2FibGUgYWNjdW11bGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgYWNjdW11bGF0ZSA9IGJmLmNsb3NlKGFjY3VtdWxhdGUpOworICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSUZpbHRlciBnZXRGaWx0ZXJDb3B5KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGJmLnNoYXJlZENvcHkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQnVpbGRlcjxQIGV4dGVuZHMgU29ydGVkVGFibGVQYXJ0aXRpb25Xcml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcgZXh0ZW5kcyBTb3J0ZWRUYWJsZVdyaXRlcjxQPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQiBleHRlbmRzIEJ1aWxkZXI8UCwgVywgQj4+IGV4dGVuZHMgU1NUYWJsZVdyaXRlci5CdWlsZGVyPFcsIEI+CisgICAgeworCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKERlc2NyaXB0b3IgZGVzY3JpcHRvcikKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZGVzY3JpcHRvcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEIgYWRkRGVmYXVsdENvbXBvbmVudHMoKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlci5hZGREZWZhdWx0Q29tcG9uZW50cygpOworCisgICAgICAgICAgICBpZiAoRmlsdGVyQ29tcG9uZW50LnNob3VsZFVzZUJsb29tRmlsdGVyKGdldFRhYmxlTWV0YWRhdGFSZWYoKS5nZXRMb2NhbCgpLnBhcmFtcy5ibG9vbUZpbHRlckZwQ2hhbmNlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGRDb21wb25lbnRzKEltbXV0YWJsZVNldC5vZihTU1RhYmxlRm9ybWF0LkNvbXBvbmVudHMuRklMVEVSKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAoQikgdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBTZXF1ZW50aWFsV3JpdGVyIGdldERhdGFXcml0ZXIoKTsKKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgUCBnZXRQYXJ0aXRpb25Xcml0ZXIoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TdGF0c0NvbXBvbmVudC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU3RhdHNDb21wb25lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTA0MmUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU3RhdHNDb21wb25lbnQuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuVW5rbm93bkNvbHVtbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU1dyaXRlRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db3JydXB0U1NUYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuQ29tcGFjdGlvbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5TdGF0c01ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuVmFsaWRhdGlvbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNlcXVlbnRpYWxXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworCitwdWJsaWMgY2xhc3MgU3RhdHNDb21wb25lbnQKK3sKKyAgICBwdWJsaWMgZmluYWwgTWFwPE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFDb21wb25lbnQ+IG1ldGFkYXRhOworCisgICAgcHVibGljIFN0YXRzQ29tcG9uZW50KE1hcDxNZXRhZGF0YVR5cGUsIE1ldGFkYXRhQ29tcG9uZW50PiBtZXRhZGF0YSkKKyAgICB7CisgICAgICAgIHRoaXMubWV0YWRhdGEgPSBJbW11dGFibGVNYXAuY29weU9mKG1ldGFkYXRhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0YXRzQ29tcG9uZW50IGxvYWQoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBsb2FkKGRlc2NyaXB0b3IsIE1ldGFkYXRhVHlwZS52YWx1ZXMoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdGF0c0NvbXBvbmVudCBsb2FkKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgTWV0YWRhdGFUeXBlLi4uIHR5cGVzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIE1hcDxNZXRhZGF0YVR5cGUsIE1ldGFkYXRhQ29tcG9uZW50PiBtZXRhZGF0YTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIG1ldGFkYXRhID0gZGVzY3JpcHRvci5nZXRNZXRhZGF0YVNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZShkZXNjcmlwdG9yLCBFbnVtU2V0LmNvcHlPZihBcnJheXMuYXNMaXN0KHR5cGVzKSkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24oZSwgZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuU1RBVFMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgU3RhdHNDb21wb25lbnQobWV0YWRhdGEpOworICAgIH0KKworICAgIHB1YmxpYyBTZXJpYWxpemF0aW9uSGVhZGVyLkNvbXBvbmVudCBzZXJpYWxpemF0aW9uSGVhZGVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoU2VyaWFsaXphdGlvbkhlYWRlci5Db21wb25lbnQpIG1ldGFkYXRhLmdldChNZXRhZGF0YVR5cGUuSEVBREVSKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VyaWFsaXphdGlvbkhlYWRlciBzZXJpYWxpemF0aW9uSGVhZGVyKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEpCisgICAgeworICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyLkNvbXBvbmVudCBoZWFkZXIgPSBzZXJpYWxpemF0aW9uSGVhZGVyKCk7CisgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhlYWRlci50b0hlYWRlcihtZXRhZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVW5rbm93bkNvbHVtbkV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBDb21wYWN0aW9uTWV0YWRhdGEgY29tcGFjdGlvbk1ldGFkYXRhKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoQ29tcGFjdGlvbk1ldGFkYXRhKSBtZXRhZGF0YS5nZXQoTWV0YWRhdGFUeXBlLkNPTVBBQ1RJT04pOworICAgIH0KKworICAgIHB1YmxpYyBWYWxpZGF0aW9uTWV0YWRhdGEgdmFsaWRhdGlvbk1ldGFkYXRhKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoVmFsaWRhdGlvbk1ldGFkYXRhKSBtZXRhZGF0YS5nZXQoTWV0YWRhdGFUeXBlLlZBTElEQVRJT04pOworICAgIH0KKworICAgIHB1YmxpYyBTdGF0c01ldGFkYXRhIHN0YXRzTWV0YWRhdGEoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChTdGF0c01ldGFkYXRhKSBtZXRhZGF0YS5nZXQoTWV0YWRhdGFUeXBlLlNUQVRTKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzYXZlKERlc2NyaXB0b3IgZGVzYykKKyAgICB7CisgICAgICAgIEZpbGUgZmlsZSA9IGRlc2MuZmlsZUZvcihDb21wb25lbnRzLlNUQVRTKTsKKyAgICAgICAgdHJ5IChTZXF1ZW50aWFsV3JpdGVyIG91dCA9IG5ldyBTZXF1ZW50aWFsV3JpdGVyKGZpbGUsIFNlcXVlbnRpYWxXcml0ZXJPcHRpb24uREVGQVVMVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlc2MuZ2V0TWV0YWRhdGFTZXJpYWxpemVyKCkuc2VyaWFsaXplKG1ldGFkYXRhLCBvdXQsIGRlc2MudmVyc2lvbik7CisgICAgICAgICAgICBvdXQuZmluaXNoKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBGU1dyaXRlRXJyb3IoZSwgZmlsZS5wYXRoKCkpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9UT0NDb21wb25lbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1RPQ0NvbXBvbmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MTVkMzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9UT0NDb21wb25lbnQuamF2YQpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FcnJvcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLk5vU3VjaEZpbGVFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNXcml0ZUVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0LkNvbXBvbmVudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZU91dHB1dFN0cmVhbVBsdXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlLldyaXRlTW9kZS5BUFBFTkQ7CisKK3B1YmxpYyBjbGFzcyBUT0NDb21wb25lbnQKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVE9DQ29tcG9uZW50LmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBsaXN0IG9mIGNvbXBvbmVudHMgZnJvbSB0aGUgVE9DIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc2V0IG9mIGNvbXBvbmVudHMgZm91bmQgaW4gdGhlIFRPQworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2V0PENvbXBvbmVudD4gbG9hZFRPQyhEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGxvYWRUT0MoZGVzY3JpcHRvciwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIGxpc3Qgb2YgY29tcG9uZW50cyBmcm9tIHRoZSBUT0MgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHNraXBNaXNzaW5nLCBza2lwIGFkZGluZyB0aGUgY29tcG9uZW50IHRvIHRoZSByZXR1cm5lZCBzZXQgaWYgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZSBpcyBtaXNzaW5nLgorICAgICAqIEByZXR1cm4gc2V0IG9mIGNvbXBvbmVudHMgZm91bmQgaW4gdGhlIFRPQworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2V0PENvbXBvbmVudD4gbG9hZFRPQyhEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGJvb2xlYW4gc2tpcE1pc3NpbmcpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRmlsZSB0b2NGaWxlID0gZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuVE9DKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGNvbXBvbmVudE5hbWVzID0gRmlsZXMucmVhZEFsbExpbmVzKHRvY0ZpbGUudG9QYXRoKCkpOworICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gU2V0cy5uZXdIYXNoU2V0V2l0aEV4cGVjdGVkU2l6ZShjb21wb25lbnROYW1lcy5zaXplKCkpOworICAgICAgICBmb3IgKFN0cmluZyBjb21wb25lbnROYW1lIDogY29tcG9uZW50TmFtZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnQucGFyc2UoY29tcG9uZW50TmFtZSwgZGVzY3JpcHRvci52ZXJzaW9uLmZvcm1hdCk7CisgICAgICAgICAgICBpZiAoc2tpcE1pc3NpbmcgJiYgIWRlc2NyaXB0b3IuZmlsZUZvcihjb21wb25lbnQpLmV4aXN0cygpKQorICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiTWlzc2luZyBjb21wb25lbnQ6IHt9IiwgZGVzY3JpcHRvci5maWxlRm9yKGNvbXBvbmVudCkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKGNvbXBvbmVudCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kcyBuZXcgY29tcG9uZW50IG5hbWVzIHRvIHRoZSBUT0MgY29tcG9uZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhcHBlbmRUT0MoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBDb2xsZWN0aW9uPENvbXBvbmVudD4gY29tcG9uZW50cykKKyAgICB7CisgICAgICAgIEZpbGUgdG9jRmlsZSA9IGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlRPQyk7CisgICAgICAgIHRyeSAoRmlsZU91dHB1dFN0cmVhbVBsdXMgb3V0ID0gdG9jRmlsZS5uZXdPdXRwdXRTdHJlYW0oQVBQRU5EKTsKKyAgICAgICAgICAgICBQcmludFdyaXRlciB3ID0gbmV3IFByaW50V3JpdGVyKG91dCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoQ29tcG9uZW50IGNvbXBvbmVudCA6IGNvbXBvbmVudHMpCisgICAgICAgICAgICAgICAgdy5wcmludGxuKGNvbXBvbmVudC5uYW1lKTsKKyAgICAgICAgICAgIHcuZmx1c2goKTsKKyAgICAgICAgICAgIG91dC5zeW5jKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBGU1dyaXRlRXJyb3IoZSwgdG9jRmlsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNldDxDb21wb25lbnQ+IGxvYWRPckNyZWF0ZShEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRPQ0NvbXBvbmVudC5sb2FkVE9DKGRlc2NyaXB0b3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB8IE5vU3VjaEZpbGVFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gZGVzY3JpcHRvci5kaXNjb3ZlckNvbXBvbmVudHMoKTsKKyAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50cy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRzOyAvLyBzc3RhYmxlIGRvZXNuJ3QgZXhpc3QgeWV0CisKKyAgICAgICAgICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnRzLlRPQyk7CisgICAgICAgICAgICAgICAgVE9DQ29tcG9uZW50LmFwcGVuZFRPQyhkZXNjcmlwdG9yLCBjb21wb25lbnRzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXJyb3IoZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9WZXJzaW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9WZXJzaW9uLmphdmEKaW5kZXggYWE0MWIxNC4uMTM3OTc5YSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvVmVyc2lvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1ZlcnNpb24uamF2YQpAQCAtMTcsMzAgKzE3LDMxIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQ7CiAKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogCiAvKioKICAqIEEgc2V0IG9mIGZlYXR1cmUgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIGEgU1NUYWJsZSBmb3JtYXQKLSAqCisgKiA8cD4KICAqIHZlcnNpb25zIGFyZSBkZW5vdGVkIGFzIFttYWpvcl1bbWlub3JdLiAgTWlub3IgdmVyc2lvbnMgbXVzdCBiZSBmb3J3YXJkLWNvbXBhdGlibGU6CiAgKiBuZXcgZmllbGRzIGFyZSBhbGxvd2VkIGluIGUuZy4gdGhlIG1ldGFkYXRhIGNvbXBvbmVudCwgYnV0IGZpZWxkcyBjYW4ndCBiZSByZW1vdmVkCiAgKiBvciBoYXZlIHRoZWlyIHNpemUgY2hhbmdlZC4KLSAqCisgKiA8cD4KICAqIE1pbm9yIHZlcnNpb25zIHdlcmUgaW50cm9kdWNlZCB3aXRoIHZlcnNpb24gImhiIiBmb3IgQ2Fzc2FuZHJhIDEuMC4zOyBwcmlvciB0byB0aGF0LAogICogd2UgYWx3YXlzIGluY3JlbWVudGVkIHRoZSBtYWpvciB2ZXJzaW9uLgotICoKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFZlcnNpb24KIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFZBTElEQVRJT04gPSBQYXR0ZXJuLmNvbXBpbGUoIlthLXpdKyIpOwogCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyB2ZXJzaW9uOwotICAgIHByb3RlY3RlZCBmaW5hbCBTU1RhYmxlRm9ybWF0IGZvcm1hdDsKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHZlcnNpb247CisgICAgcHVibGljIGZpbmFsIFNTVGFibGVGb3JtYXQ8PywgPz4gZm9ybWF0OworCiAgICAgcHJvdGVjdGVkIFZlcnNpb24oU1NUYWJsZUZvcm1hdCBmb3JtYXQsIFN0cmluZyB2ZXJzaW9uKQogICAgIHsKLSAgICAgICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247CisgICAgICAgIHRoaXMuZm9ybWF0ID0gT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChmb3JtYXQpOworICAgICAgICB0aGlzLnZlcnNpb24gPSBPYmplY3RzLnJlcXVpcmVOb25OdWxsKHZlcnNpb24pOwogICAgIH0KIAogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzTGF0ZXN0VmVyc2lvbigpOwpAQCAtNjIsMjEgKzYzLDMwIEBACiAgICAgLyoqCiAgICAgICogVGhlIG9sZCBibG9vbWZpbHRlciBmb3JtYXQgc2VyaWFsaXplcyB0aGUgZGF0YSBhcyBCSUdfRU5ESUFOIGxvbmcncywgdGhlIG5ldyBvbmUgdXNlcyB0aGUKICAgICAgKiBzYW1lIGZvcm1hdCBhcyBpbiBtZW1vcnkgKHNlcmlhbGl6ZXMgYXMgYnl0ZXMpLgorICAgICAqCiAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBibG9vbWZpbHRlciBmaWxlIGlzIG9sZCBzZXJpYWxpemF0aW9uIGZvcm1hdAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc09sZEJmRm9ybWF0KCk7CiAKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBpdCBpcyByZXBsYWNlZCBieSB7QGxpbmsgI2hhc0ltcHJvdmVkTWluTWF4KCl9IHNpbmNlICduYycgYW5kIHRvIGJlIGNvbXBsZXRldGx5IHJlbW92ZWQgc2luY2UgJ29hJworICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzQWNjdXJhdGVNaW5NYXgoKTsKIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpCi0gICAgewotICAgICAgICByZXR1cm4gdmVyc2lvbjsKLSAgICB9CisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgaXQgaXMgcmVwbGFjZWQgYnkge0BsaW5rICNoYXNJbXByb3ZlZE1pbk1heCgpfSBzaW5jZSAnbmMnIGFuZCB0byBiZSBjb21wbGV0ZXRseSByZW1vdmVkIHNpbmNlICdvYScKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc0xlZ2FjeU1pbk1heCgpOwogCi0gICAgcHVibGljIFNTVGFibGVGb3JtYXQgZ2V0U1NUYWJsZUZvcm1hdCgpCi0gICAgewotICAgICAgICByZXR1cm4gZm9ybWF0OwotICAgIH0KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNPcmlnaW5hdGluZ0hvc3RJZCgpOworCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzSW1wcm92ZWRNaW5NYXgoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25zUHJlc2VuY2VNYXJrZXIoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc0tleVJhbmdlKCk7CiAKICAgICAvKioKICAgICAgKiBAcGFyYW0gdmVyIFNTVGFibGUgdmVyc2lvbgpAQCAtODksNiArOTksNyBAQAogICAgIH0KIAogICAgIGFic3RyYWN0IHB1YmxpYyBib29sZWFuIGlzQ29tcGF0aWJsZSgpOworCiAgICAgYWJzdHJhY3QgcHVibGljIGJvb2xlYW4gaXNDb21wYXRpYmxlRm9yU3RyZWFtaW5nKCk7CiAKICAgICBAT3ZlcnJpZGUKQEAgLTk3LDI0ICsxMDgsMjQgQEAKICAgICAgICAgcmV0dXJuIHZlcnNpb247CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQorICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtYXRBbmRWZXJzaW9uU3RyaW5nKCkKICAgICB7Ci0gICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOwotICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBmb3JtYXQubmFtZSgpICsgJy0nICsgdmVyc2lvbjsKKyAgICB9CiAKLSAgICAgICAgVmVyc2lvbiB2ZXJzaW9uMSA9IChWZXJzaW9uKSBvOworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpCisgICAgeworICAgICAgICBpZiAodGhpcyA9PSBvdGhlcikgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvdGhlciA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gb3RoZXIuZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgIGlmICh2ZXJzaW9uICE9IG51bGwgPyAhdmVyc2lvbi5lcXVhbHModmVyc2lvbjEudmVyc2lvbikgOiB2ZXJzaW9uMS52ZXJzaW9uICE9IG51bGwpIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgVmVyc2lvbiBvdGhlclZlcnNpb24gPSAoVmVyc2lvbikgb3RoZXI7CisgICAgICAgIHJldHVybiBPYmplY3RzLmVxdWFscyh2ZXJzaW9uLCBvdGhlclZlcnNpb24udmVyc2lvbikgJiYgT2JqZWN0cy5lcXVhbHMoZm9ybWF0Lm5hbWUoKSwgb3RoZXJWZXJzaW9uLmZvcm1hdC5uYW1lKCkpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIHZlcnNpb24gIT0gbnVsbCA/IHZlcnNpb24uaGFzaENvZGUoKSA6IDA7CisgICAgICAgIHJldHVybiBPYmplY3RzLmhhc2godmVyc2lvbiwgZm9ybWF0Lm5hbWUoKSk7CiAgICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzT3JpZ2luYXRpbmdIb3N0SWQoKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1ZlcnNpb25BbmRUeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9WZXJzaW9uQW5kVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDY5OGE5Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1ZlcnNpb25BbmRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlNwbGl0dGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwotCi0vKioKLSAqIEdyb3VwcyBhIHNzdGFibGUge0BsaW5rIFZlcnNpb259IHdpdGggYSB7QGxpbmsgU1NUYWJsZUZvcm1hdC5UeXBlfS4KLSAqCi0gKiA8cD5Ob3RlIHRoYXQgYm90aCBpbmZvcm1hdGlvbiBhcmUgY3VycmVudGx5IG5lY2Vzc2FyeSB0byBpZGVudGlmeSB0aGUgZXhhY3QgImZvcm1hdCIgb2YgYW4gc3N0YWJsZSAod2l0aG91dCBoYXZpbmcKLSAqIGl0cyB7QGxpbmsgRGVzY3JpcHRvcn0pLiBJbiBwYXJ0aWN1bGFyLCB3aGlsZSB7QGxpbmsgVmVyc2lvbn0gY29udGFpbnMgaXRzIHt7QGxpbmsgU1NUYWJsZUZvcm1hdH19LCB5b3UgY2Fubm90IGdldAotICogdGhlIHt7QGxpbmsgU1NUYWJsZUZvcm1hdC5UeXBlfX0gZnJvbSB0aGF0LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVmVyc2lvbkFuZFR5cGUKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTcGxpdHRlciBzcGxpdE9uRGFzaCA9IFNwbGl0dGVyLm9uKCctJykub21pdEVtcHR5U3RyaW5ncygpLnRyaW1SZXN1bHRzKCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZlcnNpb24gdmVyc2lvbjsKLSAgICBwcml2YXRlIGZpbmFsIFNTVGFibGVGb3JtYXQuVHlwZSBmb3JtYXRUeXBlOwotCi0gICAgcHVibGljIFZlcnNpb25BbmRUeXBlKFZlcnNpb24gdmVyc2lvbiwgU1NUYWJsZUZvcm1hdC5UeXBlIGZvcm1hdFR5cGUpCi0gICAgewotICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotICAgICAgICB0aGlzLmZvcm1hdFR5cGUgPSBmb3JtYXRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBWZXJzaW9uIHZlcnNpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZlcnNpb247Ci0gICAgfQotCi0gICAgcHVibGljIFNTVGFibGVGb3JtYXQuVHlwZSBmb3JtYXRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmb3JtYXRUeXBlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzID09IG8pCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBWZXJzaW9uQW5kVHlwZSB0aGF0ID0gKFZlcnNpb25BbmRUeXBlKSBvOwotICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHModmVyc2lvbiwgdGhhdC52ZXJzaW9uKSAmJgotICAgICAgICAgICAgICAgZm9ybWF0VHlwZSA9PSB0aGF0LmZvcm1hdFR5cGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKHZlcnNpb24sIGZvcm1hdFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVmVyc2lvbkFuZFR5cGUgZnJvbVN0cmluZyhTdHJpbmcgdmVyc2lvbkFuZFR5cGUpCi0gICAgewotICAgICAgICBMaXN0PFN0cmluZz4gY29tcG9uZW50cyA9IHNwbGl0T25EYXNoLnNwbGl0VG9MaXN0KHZlcnNpb25BbmRUeXBlKTsKLSAgICAgICAgaWYgKGNvbXBvbmVudHMuc2l6ZSgpICE9IDIpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIFZlcnNpb25BbmRUeXBlIHN0cmluZzogIiArIHZlcnNpb25BbmRUeXBlICsgIiAoc2hvdWxkIGJlIG9mIHRoZSBmb3JtICdiaWctYmMnKSIpOwotCi0gICAgICAgIFNTVGFibGVGb3JtYXQuVHlwZSBmb3JtYXRUeXBlID0gU1NUYWJsZUZvcm1hdC5UeXBlLnZhbGlkYXRlKGNvbXBvbmVudHMuZ2V0KDApKTsKLSAgICAgICAgVmVyc2lvbiB2ZXJzaW9uID0gZm9ybWF0VHlwZS5pbmZvLmdldFZlcnNpb24oY29tcG9uZW50cy5nZXQoMSkpOwotICAgICAgICByZXR1cm4gbmV3IFZlcnNpb25BbmRUeXBlKHZlcnNpb24sIGZvcm1hdFR5cGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZvcm1hdFR5cGUubmFtZSArICctJyArIHZlcnNpb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ0Zvcm1hdC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ0Zvcm1hdC5qYXZhCmluZGV4IGM4NDc4MmYuLjg4Y2ExNWMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9CaWdGb3JtYXQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnRm9ybWF0LmphdmEKQEAgLTE3LDMzICsxNywxMzcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWc7CiAKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93SW5kZXhFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVOZXdUcmFja2VyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuS2V5Q2FjaGVLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbGxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkdhdWdlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU2NydWJiZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5NZXRyaWNzUHJvdmlkZXJzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZpbHRlci5CbG9vbUZpbHRlck1ldHJpY3M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuQWJzdHJhY3RTU1RhYmxlRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU29ydGVkVGFibGVTY3J1YmJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuaW5kZXhzdW1tYXJ5LkluZGV4U3VtbWFyeU1ldHJpY3M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5rZXljYWNoZS5LZXlDYWNoZU1ldHJpY3M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2luZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DYWNoZVNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSlZNU3RhYmlsaXR5SW5zcGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk91dHB1dEhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0LkNvbXBvbmVudHMuREFUQTsKIAogLyoqCiAgKiBMZWdhY3kgYmlndGFibGUgZm9ybWF0CiAgKi8KLXB1YmxpYyBjbGFzcyBCaWdGb3JtYXQgaW1wbGVtZW50cyBTU1RhYmxlRm9ybWF0CitwdWJsaWMgY2xhc3MgQmlnRm9ybWF0IGV4dGVuZHMgQWJzdHJhY3RTU1RhYmxlRm9ybWF0PEJpZ1RhYmxlUmVhZGVyLCBCaWdUYWJsZVdyaXRlcj4KIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpZ0Zvcm1hdCBpbnN0YW5jZSA9IG5ldyBCaWdGb3JtYXQoKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZlcnNpb24gbGF0ZXN0VmVyc2lvbiA9IG5ldyBCaWdWZXJzaW9uKEJpZ1ZlcnNpb24uY3VycmVudF92ZXJzaW9uKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTU1RhYmxlUmVhZGVyLkZhY3RvcnkgcmVhZGVyRmFjdG9yeSA9IG5ldyBSZWFkZXJGYWN0b3J5KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU1NUYWJsZVdyaXRlci5GYWN0b3J5IHdyaXRlckZhY3RvcnkgPSBuZXcgV3JpdGVyRmFjdG9yeSgpOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihCaWdGb3JtYXQuY2xhc3MpOwogCi0gICAgcHJpdmF0ZSBCaWdGb3JtYXQoKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiYmlnIjsKKworICAgIHByaXZhdGUgZmluYWwgVmVyc2lvbiBsYXRlc3RWZXJzaW9uID0gbmV3IEJpZ1ZlcnNpb24odGhpcywgQmlnVmVyc2lvbi5jdXJyZW50X3ZlcnNpb24pOworICAgIHByaXZhdGUgZmluYWwgQmlnVGFibGVSZWFkZXJGYWN0b3J5IHJlYWRlckZhY3RvcnkgPSBuZXcgQmlnVGFibGVSZWFkZXJGYWN0b3J5KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBCaWdUYWJsZVdyaXRlckZhY3Rvcnkgd3JpdGVyRmFjdG9yeSA9IG5ldyBCaWdUYWJsZVdyaXRlckZhY3RvcnkoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29tcG9uZW50cyBleHRlbmRzIFNTVGFibGVGb3JtYXQuQ29tcG9uZW50cwogICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUeXBlcyBleHRlbmRzIFNTVGFibGVGb3JtYXQuQ29tcG9uZW50cy5UeXBlcworICAgICAgICB7CisgICAgICAgICAgICAvLyBpbmRleCBvZiB0aGUgcm93IGtleXMgd2l0aCBwb2ludGVycyB0byB0aGVpciBwb3NpdGlvbnMgaW4gdGhlIGRhdGEgZmlsZQorICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnQuVHlwZSBQUklNQVJZX0lOREVYID0gQ29tcG9uZW50LlR5cGUuY3JlYXRlU2luZ2xldG9uKCJQUklNQVJZX0lOREVYIiwgIkluZGV4LmRiIiwgQmlnRm9ybWF0LmNsYXNzKTsKKyAgICAgICAgICAgIC8vIGhvbGRzIFNTVGFibGUgSW5kZXggU3VtbWFyeSAoc2FtcGxpbmcgb2YgSW5kZXggY29tcG9uZW50KQorICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnQuVHlwZSBTVU1NQVJZID0gQ29tcG9uZW50LlR5cGUuY3JlYXRlU2luZ2xldG9uKCJTVU1NQVJZIiwgIlN1bW1hcnkuZGIiLCBCaWdGb3JtYXQuY2xhc3MpOworICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBDb21wb25lbnQgUFJJTUFSWV9JTkRFWCA9IFR5cGVzLlBSSU1BUllfSU5ERVguZ2V0U2luZ2xldG9uKCk7CisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29tcG9uZW50IFNVTU1BUlkgPSBUeXBlcy5TVU1NQVJZLmdldFNpbmdsZXRvbigpOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxDb21wb25lbnQ+IEJBVENIX0NPTVBPTkVOVFMgPSBJbW11dGFibGVTZXQub2YoREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklNQVJZX0lOREVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBSRVNTSU9OX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRTKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8Q29tcG9uZW50PiBQUklNQVJZX0NPTVBPTkVOVFMgPSBJbW11dGFibGVTZXQub2YoREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU1BUllfSU5ERVgpOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxDb21wb25lbnQ+IEdFTkVSQVRFRF9PTl9MT0FEX0NPTVBPTkVOVFMgPSBJbW11dGFibGVTZXQub2YoRklMVEVSLCBTVU1NQVJZKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8Q29tcG9uZW50PiBNVVRBQkxFX0NPTVBPTkVOVFMgPSBJbW11dGFibGVTZXQub2YoU1RBVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVU1NQVJZKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8Q29tcG9uZW50PiBVUExPQURfQ09NUE9ORU5UUyA9IEltbXV0YWJsZVNldC5vZihEQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklNQVJZX0lOREVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVU1NQVJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QUkVTU0lPTl9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFUUyk7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PENvbXBvbmVudD4gU1RSRUFNX0NPTVBPTkVOVFMgPSBJbW11dGFibGVTZXQub2YoREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTUFSWV9JTkRFWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBSRVNTSU9OX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUFSWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElHRVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkMpOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxDb21wb25lbnQ+IEFMTF9DT01QT05FTlRTID0gSW1tdXRhYmxlU2V0Lm9mKERBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU1BUllfSU5ERVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QUkVTU0lPTl9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVTU1BUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJR0VTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT0MpOworICAgIH0KKworICAgIHB1YmxpYyBCaWdGb3JtYXQoTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zKQorICAgIHsKKyAgICAgICAgc3VwZXIoTkFNRSwgb3B0aW9ucyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzKFNTVGFibGVGb3JtYXQ8PywgPz4gZm9ybWF0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZvcm1hdC5uYW1lKCkuZXF1YWxzKE5BTUUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQmlnRm9ybWF0IGdldEluc3RhbmNlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoQmlnRm9ybWF0KSBPYmplY3RzLnJlcXVpcmVOb25OdWxsKERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU1RhYmxlRm9ybWF0cygpLmdldChOQU1FKSwgIlVua25vd24gU1NUYWJsZSBmb3JtYXQ6ICIgKyBOQU1FKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTZWxlY3RlZCgpCisgICAgeworICAgICAgICByZXR1cm4gaXMoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTU1LDI4ICsxNTksMTgwIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFZlcnNpb24gZ2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQmlnVmVyc2lvbih2ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIG5ldyBCaWdWZXJzaW9uKHRoaXMsIHZlcnNpb24pOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTU1RhYmxlV3JpdGVyLkZhY3RvcnkgZ2V0V3JpdGVyRmFjdG9yeSgpCisgICAgcHVibGljIEJpZ1RhYmxlV3JpdGVyRmFjdG9yeSBnZXRXcml0ZXJGYWN0b3J5KCkKICAgICB7CiAgICAgICAgIHJldHVybiB3cml0ZXJGYWN0b3J5OwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyLkZhY3RvcnkgZ2V0UmVhZGVyRmFjdG9yeSgpCisgICAgcHVibGljIEJpZ1RhYmxlUmVhZGVyRmFjdG9yeSBnZXRSZWFkZXJGYWN0b3J5KCkKICAgICB7CiAgICAgICAgIHJldHVybiByZWFkZXJGYWN0b3J5OwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSb3dJbmRleEVudHJ5LkluZGV4U2VyaWFsaXplciBnZXRJbmRleFNlcmlhbGl6ZXIoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgVmVyc2lvbiB2ZXJzaW9uLCBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlcikKKyAgICBwdWJsaWMgU2V0PENvbXBvbmVudD4gYWxsQ29tcG9uZW50cygpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IFJvd0luZGV4RW50cnkuU2VyaWFsaXplcih2ZXJzaW9uLCBoZWFkZXIpOworICAgICAgICByZXR1cm4gQ29tcG9uZW50cy5BTExfQ09NUE9ORU5UUzsKICAgICB9CiAKLSAgICBzdGF0aWMgY2xhc3MgV3JpdGVyRmFjdG9yeSBleHRlbmRzIFNTVGFibGVXcml0ZXIuRmFjdG9yeQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q29tcG9uZW50PiBzdHJlYW1pbmdDb21wb25lbnRzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBDb21wb25lbnRzLlNUUkVBTV9DT01QT05FTlRTOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q29tcG9uZW50PiBwcmltYXJ5Q29tcG9uZW50cygpCisgICAgeworICAgICAgICByZXR1cm4gQ29tcG9uZW50cy5QUklNQVJZX0NPTVBPTkVOVFM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDb21wb25lbnQ+IGJhdGNoQ29tcG9uZW50cygpCisgICAgeworICAgICAgICByZXR1cm4gQ29tcG9uZW50cy5CQVRDSF9DT01QT05FTlRTOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q29tcG9uZW50PiB1cGxvYWRDb21wb25lbnRzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBDb21wb25lbnRzLlVQTE9BRF9DT01QT05FTlRTOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q29tcG9uZW50PiBtdXRhYmxlQ29tcG9uZW50cygpCisgICAgeworICAgICAgICByZXR1cm4gQ29tcG9uZW50cy5NVVRBQkxFX0NPTVBPTkVOVFM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDb21wb25lbnQ+IGdlbmVyYXRlZE9uTG9hZENvbXBvbmVudHMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIENvbXBvbmVudHMuR0VORVJBVEVEX09OX0xPQURfQ09NUE9ORU5UUzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1NUYWJsZUZvcm1hdC5LZXlDYWNoZVZhbHVlU2VyaWFsaXplcjxCaWdUYWJsZVJlYWRlciwgUm93SW5kZXhFbnRyeT4gZ2V0S2V5Q2FjaGVWYWx1ZVNlcmlhbGl6ZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEtleUNhY2hlVmFsdWVTZXJpYWxpemVyLmluc3RhbmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJU2NydWJiZXIgZ2V0U2NydWJiZXIoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiwgT3V0cHV0SGFuZGxlciBvdXRwdXRIYW5kbGVyLCBJU2NydWJiZXIuT3B0aW9ucyBvcHRpb25zKQorICAgIHsKKyAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50KGNmcy5tZXRhZGF0YSgpLmVxdWFscyh0cmFuc2FjdGlvbi5vbmx5T25lKCkubWV0YWRhdGEoKSksICJTU1RhYmxlIG1ldGFkYXRhIGRvZXMgbm90IG1hdGNoIGN1cnJlbnQgZGVmaW5pdGlvbiIpOworICAgICAgICByZXR1cm4gbmV3IEJpZ1RhYmxlU2NydWJiZXIoY2ZzLCB0cmFuc2FjdGlvbiwgb3V0cHV0SGFuZGxlciwgb3B0aW9ucyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1ldHJpY3NQcm92aWRlcnMgZ2V0Rm9ybWF0U3BlY2lmaWNNZXRyaWNzUHJvdmlkZXJzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBCaWdUYWJsZVNwZWNpZmljTWV0cmljc1Byb3ZpZGVycy5pbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZWxldGVPcnBoYW5lZENvbXBvbmVudHMoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzKQorICAgIHsKKyAgICAgICAgU29ydGVkVGFibGVTY3J1YmJlci5kZWxldGVPcnBoYW5lZENvbXBvbmVudHMoZGVzY3JpcHRvciwgY29tcG9uZW50cyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZShEZXNjcmlwdG9yIGRlc2MsIExpc3Q8Q29tcG9uZW50PiBjb21wb25lbnRzKQorICAgIHsKKyAgICAgICAgbG9nZ2VyLmluZm8oIkRlbGV0aW5nIHNzdGFibGU6IHt9IiwgZGVzYyk7CisKKyAgICAgICAgaWYgKGNvbXBvbmVudHMucmVtb3ZlKERBVEEpKQorICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoMCwgREFUQSk7IC8vIERBVEEgY29tcG9uZW50IHNob3VsZCBiZSBmaXJzdAorICAgICAgICBpZiAoY29tcG9uZW50cy5yZW1vdmUoQ29tcG9uZW50cy5TVU1NQVJZKSkKKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudHMuU1VNTUFSWSk7IC8vIFNVTU1BUlkgY29tcG9uZW50IHNob3VsZCBiZSBsYXN0IChJREsgd2h5KQorCisgICAgICAgIGZvciAoQ29tcG9uZW50IGNvbXBvbmVudCA6IGNvbXBvbmVudHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiRGVsZXRpbmcgY29tcG9uZW50IHt9IG9mIHt9IiwgY29tcG9uZW50LCBkZXNjKTsKKyAgICAgICAgICAgIGRlc2MuZmlsZUZvcihjb21wb25lbnQpLmRlbGV0ZUlmRXhpc3RzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZWxldGUoRGVzY3JpcHRvciBkZXNjKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHJlbW92ZSBrZXkgY2FjaGUgZW50cmllcyBmb3IgdGhlIHNzdGFibGUgYmVpbmcgZGVsZXRlZAorICAgICAgICAgICAgSXRlcmF0b3I8S2V5Q2FjaGVLZXk+IGl0ID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmtleUl0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEtleUNhY2hlS2V5IGtleSA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoa2V5LmRlc2MuZXF1YWxzKGRlc2MpKQorICAgICAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVsZXRlKGRlc2MsIExpc3RzLm5ld0FycmF5TGlzdChTZXRzLmludGVyc2VjdGlvbihhbGxDb21wb25lbnRzKCksIGRlc2MuZGlzY292ZXJDb21wb25lbnRzKCkpKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQorICAgICAgICB7CisgICAgICAgICAgICBKVk1TdGFiaWxpdHlJbnNwZWN0b3IuaW5zcGVjdFRocm93YWJsZSh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBLZXlDYWNoZVZhbHVlU2VyaWFsaXplciBpbXBsZW1lbnRzIFNTVGFibGVGb3JtYXQuS2V5Q2FjaGVWYWx1ZVNlcmlhbGl6ZXI8QmlnVGFibGVSZWFkZXIsIFJvd0luZGV4RW50cnk+CisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBLZXlDYWNoZVZhbHVlU2VyaWFsaXplciBpbnN0YW5jZSA9IG5ldyBLZXlDYWNoZVZhbHVlU2VyaWFsaXplcigpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBza2lwKERhdGFJbnB1dFBsdXMgaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBSb3dJbmRleEVudHJ5LlNlcmlhbGl6ZXIuc2tpcEZvckNhY2hlKGlucHV0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUm93SW5kZXhFbnRyeSBkZXNlcmlhbGl6ZShCaWdUYWJsZVJlYWRlciByZWFkZXIsIERhdGFJbnB1dFBsdXMgaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmVhZGVyLmRlc2VyaWFsaXplS2V5Q2FjaGVWYWx1ZShpbnB1dCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFJvd0luZGV4RW50cnkgZW50cnksIERhdGFPdXRwdXRQbHVzIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGVudHJ5LnNlcmlhbGl6ZUZvckNhY2hlKG91dHB1dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQmlnVGFibGVSZWFkZXJGYWN0b3J5IGltcGxlbWVudHMgU1NUYWJsZVJlYWRlckZhY3Rvcnk8QmlnVGFibGVSZWFkZXIsIEJpZ1RhYmxlUmVhZGVyLkJ1aWxkZXI+CisgICAgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJpZ1RhYmxlUmVhZGVyLkJ1aWxkZXIgYnVpbGRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQmlnVGFibGVSZWFkZXIuQnVpbGRlcihkZXNjcmlwdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU1NUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyPEJpZ1RhYmxlUmVhZGVyLCBCaWdUYWJsZVJlYWRlci5CdWlsZGVyPiBsb2FkaW5nQnVpbGRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGFSZWYgdGFibGVNZXRhZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdTU1RhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXIobmV3IFNTVGFibGUuQnVpbGRlcjw+KGRlc2NyaXB0b3IpLnNldFRhYmxlTWV0YWRhdGFSZWYodGFibGVNZXRhZGF0YVJlZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb21wb25lbnRzKGNvbXBvbmVudHMpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUGFpcjxEZWNvcmF0ZWRLZXksIERlY29yYXRlZEtleT4gcmVhZEtleVJhbmdlKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEluZGV4U3VtbWFyeUNvbXBvbmVudC5sb2FkRmlyc3RBbmRMYXN0S2V5KGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlNVTU1BUlkpLCBwYXJ0aXRpb25lcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENsYXNzPEJpZ1RhYmxlUmVhZGVyPiBnZXRSZWFkZXJDbGFzcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCaWdUYWJsZVJlYWRlci5jbGFzczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBCaWdUYWJsZVdyaXRlckZhY3RvcnkgaW1wbGVtZW50cyBTU1RhYmxlV3JpdGVyRmFjdG9yeTxCaWdUYWJsZVdyaXRlciwgQmlnVGFibGVXcml0ZXIuQnVpbGRlcj4KICAgICB7CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgbG9uZyBlc3RpbWF0ZVNpemUoU1NUYWJsZVdyaXRlci5TU1RhYmxlU2l6ZVBhcmFtZXRlcnMgcGFyYW1ldGVycykKQEAgLTg4LDQwICszNDQsMTUgQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU1NUYWJsZVdyaXRlciBvcGVuKERlc2NyaXB0b3IgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGtleUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcmVwYWlyZWRBdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVVVJRCBwZW5kaW5nUmVwYWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNUcmFuc2llbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YUNvbGxlY3RvciBtZXRhZGF0YUNvbGxlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPFNTVGFibGVGbHVzaE9ic2VydmVyPiBvYnNlcnZlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlmZWN5Y2xlTmV3VHJhY2tlciBsaWZlY3ljbGVOZXdUcmFja2VyKQorICAgICAgICBwdWJsaWMgQmlnVGFibGVXcml0ZXIuQnVpbGRlciBidWlsZGVyKERlc2NyaXB0b3IgZGVzY3JpcHRvcikKICAgICAgICAgewotICAgICAgICAgICAgU1NUYWJsZS52YWxpZGF0ZVJlcGFpcmVkTWV0YWRhdGEocmVwYWlyZWRBdCwgcGVuZGluZ1JlcGFpciwgaXNUcmFuc2llbnQpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdUYWJsZVdyaXRlcihkZXNjcmlwdG9yLCBrZXlDb3VudCwgcmVwYWlyZWRBdCwgcGVuZGluZ1JlcGFpciwgaXNUcmFuc2llbnQsIG1ldGFkYXRhLCBtZXRhZGF0YUNvbGxlY3RvciwgaGVhZGVyLCBvYnNlcnZlcnMsIGxpZmVjeWNsZU5ld1RyYWNrZXIpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdUYWJsZVdyaXRlci5CdWlsZGVyKGRlc2NyaXB0b3IpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgc3RhdGljIGNsYXNzIFJlYWRlckZhY3RvcnkgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyLkZhY3RvcnkKLSAgICB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU1NUYWJsZVJlYWRlciBvcGVuKFNTVGFibGVSZWFkZXJCdWlsZGVyIGJ1aWxkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQmlnVGFibGVSZWFkZXIoYnVpbGRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyB2ZXJzaW9ucyBhcmUgZGVub3RlZCBhcyBbbWFqb3JdW21pbm9yXS4gIE1pbm9yIHZlcnNpb25zIG11c3QgYmUgZm9yd2FyZC1jb21wYXRpYmxlOgotICAgIC8vIG5ldyBmaWVsZHMgYXJlIGFsbG93ZWQgaW4gZS5nLiB0aGUgbWV0YWRhdGEgY29tcG9uZW50LCBidXQgZmllbGRzIGNhbid0IGJlIHJlbW92ZWQKLSAgICAvLyBvciBoYXZlIHRoZWlyIHNpemUgY2hhbmdlZC4KLSAgICAvLwotICAgIC8vIE1pbm9yIHZlcnNpb25zIHdlcmUgaW50cm9kdWNlZCB3aXRoIHZlcnNpb24gImhiIiBmb3IgQ2Fzc2FuZHJhIDEuMC4zOyBwcmlvciB0byB0aGF0LAotICAgIC8vIHdlIGFsd2F5cyBpbmNyZW1lbnRlZCB0aGUgbWFqb3IgdmVyc2lvbi4KICAgICBzdGF0aWMgY2xhc3MgQmlnVmVyc2lvbiBleHRlbmRzIFZlcnNpb24KICAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGN1cnJlbnRfdmVyc2lvbiA9ICJuYiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGN1cnJlbnRfdmVyc2lvbiA9ICJuYyI7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVhcmxpZXN0X3N1cHBvcnRlZF92ZXJzaW9uID0gIm1hIjsKIAogICAgICAgICAvLyBtYSAoMy4wLjApOiBzd2FwIGJmIGhhc2ggb3JkZXIKQEAgLTEzMywxOSArMzY0LDI0IEBACiAKICAgICAgICAgLy8gbmEgKDQuMC1yYzEpOiB1bmNvbXByZXNzZWQgY2h1bmtzLCBwZW5kaW5nIHJlcGFpciBzZXNzaW9uLCBpc1RyYW5zaWVudCwgY2hlY2tzdW1tZWQgc3N0YWJsZSBtZXRhZGF0YSBmaWxlLCBuZXcgQmxvb21maWx0ZXIgZm9ybWF0CiAgICAgICAgIC8vIG5iICg0LjAuMCk6IG9yaWdpbmF0aW5nIGhvc3QgaWQKKyAgICAgICAgLy8gbmMgKDQuMSk6IGltcHJvdmVkIG1pbi9tYXgsIHBhcnRpdGlvbiBsZXZlbCBkZWxldGlvbiBwcmVzZW5jZSBtYXJrZXIsIGtleSByYW5nZSAoQ0FTU0FORFJBLTE4MTM0KQogICAgICAgICAvLwogICAgICAgICAvLyBOT1RFOiB3aGVuIGFkZGluZyBhIG5ldyB2ZXJzaW9uLCBwbGVhc2UgYWRkIHRoYXQgdG8gTGVnYWN5U1NUYWJsZVRlc3QsIHRvby4KIAogICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNMYXRlc3RWZXJzaW9uOwotICAgICAgICBwdWJsaWMgZmluYWwgaW50IGNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBjb3JyZXNwb25kaW5nTWVzc2FnaW5nVmVyc2lvbjsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGhhc0NvbW1pdExvZ0xvd2VyQm91bmQ7CiAgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBoYXNDb21taXRMb2dJbnRlcnZhbHM7CiAgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBoYXNBY2N1cmF0ZU1pbk1heDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGhhc0xlZ2FjeU1pbk1heDsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGhhc09yaWdpbmF0aW5nSG9zdElkOwotICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNYXhDb21wcmVzc2VkTGVuZ3RoOworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaGFzTWF4Q29tcHJlc3NlZExlbmd0aDsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGhhc1BlbmRpbmdSZXBhaXI7CiAgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBoYXNNZXRhZGF0YUNoZWNrc3VtOwogICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaGFzSXNUcmFuc2llbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBoYXNJbXByb3ZlZE1pbk1heDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25QcmVzZW5jZU1hcmtlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGhhc0tleVJhbmdlOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBDQVNTQU5EUkEtOTA2NzogNC4wIGJsb29tIGZpbHRlciByZXByZXNlbnRhdGlvbiBjaGFuZ2VkICh0d28gbG9uZ3MganVzdCBzd2FwcGVkKQpAQCAtMTUzLDIyICszODksMjYgQEAKICAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBoYXNPbGRCZkZvcm1hdDsKIAotICAgICAgICBCaWdWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKQorICAgICAgICBCaWdWZXJzaW9uKEJpZ0Zvcm1hdCBmb3JtYXQsIFN0cmluZyB2ZXJzaW9uKQogICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihpbnN0YW5jZSwgdmVyc2lvbik7CisgICAgICAgICAgICBzdXBlcihmb3JtYXQsIHZlcnNpb24pOwogCiAgICAgICAgICAgICBpc0xhdGVzdFZlcnNpb24gPSB2ZXJzaW9uLmNvbXBhcmVUbyhjdXJyZW50X3ZlcnNpb24pID09IDA7CiAgICAgICAgICAgICBjb3JyZXNwb25kaW5nTWVzc2FnaW5nVmVyc2lvbiA9IE1lc3NhZ2luZ1NlcnZpY2UuVkVSU0lPTl8zMDsKIAogICAgICAgICAgICAgaGFzQ29tbWl0TG9nTG93ZXJCb3VuZCA9IHZlcnNpb24uY29tcGFyZVRvKCJtYiIpID49IDA7CiAgICAgICAgICAgICBoYXNDb21taXRMb2dJbnRlcnZhbHMgPSB2ZXJzaW9uLmNvbXBhcmVUbygibWMiKSA+PSAwOwotICAgICAgICAgICAgaGFzQWNjdXJhdGVNaW5NYXggPSB2ZXJzaW9uLmNvbXBhcmVUbygibWQiKSA+PSAwOwotICAgICAgICAgICAgaGFzT3JpZ2luYXRpbmdIb3N0SWQgPSB2ZXJzaW9uLm1hdGNoZXMoIihtW2Utel0pfChuW2Itel0pIik7CisgICAgICAgICAgICBoYXNBY2N1cmF0ZU1pbk1heCA9IHZlcnNpb24ubWF0Y2hlcygiKG1bZC16XSl8KG5bYS16XSkiKTsgLy8gZGVwcmVjYXRlZCBpbiAnbmMnIGFuZCB0byBiZSByZW1vdmVkIGluICdvYScKKyAgICAgICAgICAgIGhhc0xlZ2FjeU1pbk1heCA9IHZlcnNpb24ubWF0Y2hlcygiKG1bYS16XSl8KG5bYS16XSkiKTsgLy8gZGVwcmVjYXRlZCBpbiAnbmMnIGFuZCB0byBiZSByZW1vdmVkIGluICdvYScKKyAgICAgICAgICAgIGhhc09yaWdpbmF0aW5nSG9zdElkID0gdmVyc2lvbi5tYXRjaGVzKCIobVtlLXpdKSIpIHx8IHZlcnNpb24uY29tcGFyZVRvKCJuYiIpID49IDA7CiAgICAgICAgICAgICBoYXNNYXhDb21wcmVzc2VkTGVuZ3RoID0gdmVyc2lvbi5jb21wYXJlVG8oIm5hIikgPj0gMDsKICAgICAgICAgICAgIGhhc1BlbmRpbmdSZXBhaXIgPSB2ZXJzaW9uLmNvbXBhcmVUbygibmEiKSA+PSAwOwogICAgICAgICAgICAgaGFzSXNUcmFuc2llbnQgPSB2ZXJzaW9uLmNvbXBhcmVUbygibmEiKSA+PSAwOwogICAgICAgICAgICAgaGFzTWV0YWRhdGFDaGVja3N1bSA9IHZlcnNpb24uY29tcGFyZVRvKCJuYSIpID49IDA7CiAgICAgICAgICAgICBoYXNPbGRCZkZvcm1hdCA9IHZlcnNpb24uY29tcGFyZVRvKCJuYSIpIDwgMDsKKyAgICAgICAgICAgIGhhc0ltcHJvdmVkTWluTWF4ID0gdmVyc2lvbi5jb21wYXJlVG8oIm5jIikgPj0gMDsKKyAgICAgICAgICAgIGhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25QcmVzZW5jZU1hcmtlciA9IHZlcnNpb24uY29tcGFyZVRvKCJuYyIpID49IDA7CisgICAgICAgICAgICBoYXNLZXlSYW5nZSA9IHZlcnNpb24uY29tcGFyZVRvKCJuYyIpID49IDA7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKQEAgLTE3OCw2ICs0MTgsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbW1pdExvZ0xvd2VyQm91bmQoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gaGFzQ29tbWl0TG9nTG93ZXJCb3VuZDsKQEAgLTE4OSw2ICs0MzUsMTMgQEAKICAgICAgICAgICAgIHJldHVybiBoYXNDb21taXRMb2dJbnRlcnZhbHM7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTWF4Q29tcHJlc3NlZExlbmd0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBoYXNNYXhDb21wcmVzc2VkTGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1BlbmRpbmdSZXBhaXIoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gaGFzUGVuZGluZ1JlcGFpcjsKQEAgLTIwMSwyMyArNDU0LDU0IEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBjb3JyZXNwb25kaW5nTWVzc2FnaW5nVmVyc2lvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb3JyZXNwb25kaW5nTWVzc2FnaW5nVmVyc2lvbjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNZXRhZGF0YUNoZWNrc3VtKCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIGhhc01ldGFkYXRhQ2hlY2tzdW07CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzT2xkQmZGb3JtYXQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaGFzT2xkQmZGb3JtYXQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQWNjdXJhdGVNaW5NYXgoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gaGFzQWNjdXJhdGVNaW5NYXg7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTGVnYWN5TWluTWF4KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGhhc0xlZ2FjeU1pbk1heDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNPcmlnaW5hdGluZ0hvc3RJZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBoYXNPcmlnaW5hdGluZ0hvc3RJZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNJbXByb3ZlZE1pbk1heCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBoYXNJbXByb3ZlZE1pbk1heDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNQYXJ0aXRpb25MZXZlbERlbGV0aW9uc1ByZXNlbmNlTWFya2VyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25QcmVzZW5jZU1hcmtlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNLZXlSYW5nZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBoYXNLZXlSYW5nZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBhdGlibGUoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gdmVyc2lvbi5jb21wYXJlVG8oZWFybGllc3Rfc3VwcG9ydGVkX3ZlcnNpb24pID49IDAgJiYgdmVyc2lvbi5jaGFyQXQoMCkgPD0gY3VycmVudF92ZXJzaW9uLmNoYXJBdCgwKTsKQEAgLTIyOCwyMiArNTEyLDM2IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBpc0NvbXBhdGlibGUoKSAmJiB2ZXJzaW9uLmNoYXJBdCgwKSA9PSBjdXJyZW50X3ZlcnNpb24uY2hhckF0KDApOwogICAgICAgICB9CisgICAgfQogCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc09yaWdpbmF0aW5nSG9zdElkKCkKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCaWdUYWJsZVNwZWNpZmljTWV0cmljc1Byb3ZpZGVycyBpbXBsZW1lbnRzIE1ldHJpY3NQcm92aWRlcnMKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEJpZ1RhYmxlU3BlY2lmaWNNZXRyaWNzUHJvdmlkZXJzIGluc3RhbmNlID0gbmV3IEJpZ1RhYmxlU3BlY2lmaWNNZXRyaWNzUHJvdmlkZXJzKCk7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTxHYXVnZVByb3ZpZGVyPD8+PiBnYXVnZVByb3ZpZGVycyA9IEl0ZXJhYmxlcy5jb25jYXQoQmxvb21GaWx0ZXJNZXRyaWNzLmluc3RhbmNlLmdldEdhdWdlUHJvdmlkZXJzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4U3VtbWFyeU1ldHJpY3MuaW5zdGFuY2UuZ2V0R2F1Z2VQcm92aWRlcnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5Q2FjaGVNZXRyaWNzLmluc3RhbmNlLmdldEdhdWdlUHJvdmlkZXJzKCkpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSXRlcmFibGU8R2F1Z2VQcm92aWRlcjw/Pj4gZ2V0R2F1Z2VQcm92aWRlcnMoKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaGFzT3JpZ2luYXRpbmdIb3N0SWQ7CisgICAgICAgICAgICByZXR1cm4gZ2F1Z2VQcm92aWRlcnM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJpZ0Zvcm1hdEZhY3RvcnkgaW1wbGVtZW50cyBGYWN0b3J5CisgICAgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBuYW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE5BTUU7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTWF4Q29tcHJlc3NlZExlbmd0aCgpCisgICAgICAgIHB1YmxpYyBTU1RhYmxlRm9ybWF0PD8sID8+IGdldEluc3RhbmNlKE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucykKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGhhc01heENvbXByZXNzZWRMZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzT2xkQmZGb3JtYXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaGFzT2xkQmZGb3JtYXQ7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJpZ0Zvcm1hdChvcHRpb25zKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9CaWdGb3JtYXRQYXJ0aXRpb25Xcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9CaWdGb3JtYXRQYXJ0aXRpb25Xcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDE5ODJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ0Zvcm1hdFBhcnRpdGlvbldyaXRlci5qYXZhCkBAIC0wLDAgKzEsMjU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLkludHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5JU2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkluZGV4SW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5Tb3J0ZWRUYWJsZVBhcnRpdGlvbldyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNlcXVlbnRpYWxXcml0ZXI7CisKKy8qKgorICogQ29sdW1uIGluZGV4IGJ1aWxkZXIgdXNlZCBieSB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ1RhYmxlV3JpdGVyfS4KKyAqIEZvciBpbmRleCBlbnRyaWVzIHRoYXQgZXhjZWVkIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnI2NvbHVtbl9pbmRleF9jYWNoZV9zaXplfSwKKyAqIHRoaXMgdXNlcyB0aGUgc2VyaWFsaXphdGlvbiBsb2dpYyBhcyBpbiB7QGxpbmsgUm93SW5kZXhFbnRyeX0uCisgKi8KK3B1YmxpYyBjbGFzcyBCaWdGb3JtYXRQYXJ0aXRpb25Xcml0ZXIgZXh0ZW5kcyBTb3J0ZWRUYWJsZVBhcnRpdGlvbldyaXRlcgoreworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfR1JBTlVMQVJJVFkgPSA2NCAqIDEwMjQ7CisKKyAgICAvLyB1c2VkLCBpZiB0aGUgcm93LWluZGV4LWVudHJ5IHJlYWNoZXMgY29uZmlnIGNvbHVtbl9pbmRleF9jYWNoZV9zaXplCisgICAgcHJpdmF0ZSBEYXRhT3V0cHV0QnVmZmVyIGJ1ZmZlcjsKKyAgICAvLyB1c2VkIHRvIHRyYWNrIHRoZSBzaXplIG9mIHRoZSBzZXJpYWxpemVkIHNpemUgb2Ygcm93LWluZGV4LWVudHJ5ICh1bnVzZWQgZm9yIGJ1ZmZlcikKKyAgICBwcml2YXRlIGludCBpbmRleFNhbXBsZXNTZXJpYWxpemVkU2l6ZTsKKyAgICAvLyB1c2VkLCB1bnRpbCB0aGUgcm93LWluZGV4LWVudHJ5IHJlYWNoZXMgY29uZmlnIGNvbHVtbl9pbmRleF9jYWNoZV9zaXplCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEluZGV4SW5mbz4gaW5kZXhTYW1wbGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICBwcml2YXRlIERhdGFPdXRwdXRCdWZmZXIgcmV1c2FibGVCdWZmZXI7CisKKyAgICBwcml2YXRlIGludCBjb2x1bW5JbmRleENvdW50OworICAgIHByaXZhdGUgaW50W10gaW5kZXhPZmZzZXRzOworCisgICAgcHJpdmF0ZSBmaW5hbCBJU2VyaWFsaXplcjxJbmRleEluZm8+IGlkeFNlcmlhbGl6ZXI7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBjYWNoZVNpemVUaHJlc2hvbGQ7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXhTaXplOworCisgICAgQmlnRm9ybWF0UGFydGl0aW9uV3JpdGVyKFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW50aWFsV3JpdGVyIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU2VyaWFsaXplcjxJbmRleEluZm8+IGluZGV4SW5mb1NlcmlhbGl6ZXIpCisgICAgeworICAgICAgICB0aGlzKGhlYWRlciwgd3JpdGVyLCB2ZXJzaW9uLCBpbmRleEluZm9TZXJpYWxpemVyLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29sdW1uSW5kZXhDYWNoZVNpemUoKSwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbHVtbkluZGV4U2l6ZShERUZBVUxUX0dSQU5VTEFSSVRZKSk7CisgICAgfQorCisgICAgQmlnRm9ybWF0UGFydGl0aW9uV3JpdGVyKFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW50aWFsV3JpdGVyIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU2VyaWFsaXplcjxJbmRleEluZm8+IGluZGV4SW5mb1NlcmlhbGl6ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYWNoZVNpemVUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleFNpemUpCisgICAgeworICAgICAgICBzdXBlcihoZWFkZXIsIHdyaXRlciwgdmVyc2lvbik7CisgICAgICAgIHRoaXMuaWR4U2VyaWFsaXplciA9IGluZGV4SW5mb1NlcmlhbGl6ZXI7CisgICAgICAgIHRoaXMuY2FjaGVTaXplVGhyZXNob2xkID0gY2FjaGVTaXplVGhyZXNob2xkOworICAgICAgICB0aGlzLmluZGV4U2l6ZSA9IGluZGV4U2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpCisgICAgeworICAgICAgICBzdXBlci5yZXNldCgpOworICAgICAgICB0aGlzLmNvbHVtbkluZGV4Q291bnQgPSAwOworICAgICAgICB0aGlzLmluZGV4U2FtcGxlc1NlcmlhbGl6ZWRTaXplID0gMDsKKyAgICAgICAgdGhpcy5pbmRleFNhbXBsZXMuY2xlYXIoKTsKKworICAgICAgICBpZiAodGhpcy5idWZmZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMucmV1c2FibGVCdWZmZXIgPSB0aGlzLmJ1ZmZlcjsKKyAgICAgICAgdGhpcy5idWZmZXIgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uSW5kZXhDb3VudCgpCisgICAgeworICAgICAgICByZXR1cm4gY29sdW1uSW5kZXhDb3VudDsKKyAgICB9CisKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBidWZmZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlciAhPSBudWxsID8gYnVmZmVyLmJ1ZmZlcigpIDogbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxJbmRleEluZm8+IGluZGV4U2FtcGxlcygpCisgICAgeworICAgICAgICBpZiAoaW5kZXhTYW1wbGVzU2VyaWFsaXplZFNpemUgKyBjb2x1bW5JbmRleENvdW50ICogVHlwZVNpemVzLnNpemVvZigwKSA8PSBjYWNoZVNpemVUaHJlc2hvbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpbmRleFNhbXBsZXM7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50W10gb2Zmc2V0cygpCisgICAgeworICAgICAgICByZXR1cm4gaW5kZXhPZmZzZXRzICE9IG51bGwKKyAgICAgICAgICAgICAgID8gQXJyYXlzLmNvcHlPZihpbmRleE9mZnNldHMsIGNvbHVtbkluZGV4Q291bnQpCisgICAgICAgICAgICAgICA6IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZEluZGV4QmxvY2soKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIEluZGV4SW5mbyBjSW5kZXhJbmZvID0gbmV3IEluZGV4SW5mbyhmaXJzdENsdXN0ZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Q2x1c3RlcmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb24oKSAtIHN0YXJ0UG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhb3Blbk1hcmtlci5pc0xpdmUoKSA/IG9wZW5NYXJrZXIgOiBudWxsKTsKKworICAgICAgICAvLyBpbmRleE9mZnNldHMgaXMgdXNlZCBmb3IgYm90aCBzaGFsbG93IChTaGFsbG93SW5kZXhlZEVudHJ5KSBhbmQgbm9uLXNoYWxsb3cgSW5kZXhlZEVudHJ5LgorICAgICAgICAvLyBGb3Igc2hhbGxvdyBvbmVzLCB3ZSBuZWVkIGl0IHRvIHNlcmlhbGl6ZSB0aGUgb2Zmc3RzIGluIGZpbmlzaCgpLgorICAgICAgICAvLyBGb3Igbm9uLXNoYWxsb3cgb25lcywgdGhlIG9mZnN0cyBhcmUgcGFzc2VkIGludG8gSW5kZXhlZEVudHJ5LCBzbyB3ZSBkb24ndCBoYXZlIHRvCisgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0cyBhZ2Fpbi4KKworICAgICAgICAvLyBpbmRleE9mZnNldHMgY29udGFpbnMgdGhlIG9mZnNldHMgb2YgdGhlIHNlcmlhbGl6ZWQgSW5kZXhJbmZvIG9iamVjdHMuCisgICAgICAgIC8vIEkuZS4gaW5kZXhPZmZzZXRzWzBdIGlzIGFsd2F5cyAwIHNvIHdlIGRvbid0IGhhdmUgdG8gZGVhbCB3aXRoIGEgc3BlY2lhbCBoYW5kbGluZworICAgICAgICAvLyBmb3IgaW5kZXggIzAgYW5kIGFsd2F5cyBzdWJ0cmFjdGluZyAxIGZvciB0aGUgaW5kZXggKHdoaWNoIGNvdWxkIGJlIGVycm9yLXByb25lKS4KKyAgICAgICAgaWYgKGluZGV4T2Zmc2V0cyA9PSBudWxsKQorICAgICAgICAgICAgaW5kZXhPZmZzZXRzID0gbmV3IGludFsxMF07CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4Q291bnQgPj0gaW5kZXhPZmZzZXRzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICBpbmRleE9mZnNldHMgPSBBcnJheXMuY29weU9mKGluZGV4T2Zmc2V0cywgaW5kZXhPZmZzZXRzLmxlbmd0aCArIDEwKTsKKworICAgICAgICAgICAgLy90aGUgMHRoIGVsZW1lbnQgaXMgYWx3YXlzIDAKKyAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleENvdW50ID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5kZXhPZmZzZXRzW2NvbHVtbkluZGV4Q291bnRdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRleE9mZnNldHNbY29sdW1uSW5kZXhDb3VudF0gPQorICAgICAgICAgICAgICAgIGJ1ZmZlciAhPSBudWxsCisgICAgICAgICAgICAgICAgPyBJbnRzLmNoZWNrZWRDYXN0KGJ1ZmZlci5wb3NpdGlvbigpKQorICAgICAgICAgICAgICAgIDogaW5kZXhTYW1wbGVzU2VyaWFsaXplZFNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29sdW1uSW5kZXhDb3VudCsrOworCisgICAgICAgIC8vIEZpcnN0LCB3ZSBjb2xsZWN0IHRoZSBJbmRleEluZm8gb2JqZWN0cyB1bnRpbCB3ZSByZWFjaCBDb25maWcuY29sdW1uX2luZGV4X2NhY2hlX3NpemUgaW4gYW4gQXJyYXlMaXN0LgorICAgICAgICAvLyBXaGVuIGNvbHVtbl9pbmRleF9jYWNoZV9zaXplIGlzIHJlYWNoZWQsIHdlIHN3aXRjaCB0byBieXRlLWJ1ZmZlciBtb2RlLgorICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluZGV4U2FtcGxlc1NlcmlhbGl6ZWRTaXplICs9IGlkeFNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoY0luZGV4SW5mbyk7CisgICAgICAgICAgICBpZiAoaW5kZXhTYW1wbGVzU2VyaWFsaXplZFNpemUgKyBjb2x1bW5JbmRleENvdW50ICogVHlwZVNpemVzLnNpemVvZigwKSA+IGNhY2hlU2l6ZVRocmVzaG9sZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSByZXVzZU9yQWxsb2NhdGVCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICBmb3IgKEluZGV4SW5mbyBpbmRleFNhbXBsZSA6IGluZGV4U2FtcGxlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlkeFNlcmlhbGl6ZXIuc2VyaWFsaXplKGluZGV4U2FtcGxlLCBidWZmZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRleFNhbXBsZXMuYWRkKGNJbmRleEluZm8pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGRvbid0IHB1dCBhbiBlbHNlIGhlcmUgc2luY2UgYnVmZmVyIG1heSBiZSBhbGxvY2F0ZWQgaW4gcHJlY2VkaW5nIGlmIGJsb2NrCisgICAgICAgIGlmIChidWZmZXIgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWR4U2VyaWFsaXplci5zZXJpYWxpemUoY0luZGV4SW5mbywgYnVmZmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpcnN0Q2x1c3RlcmluZyA9IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBEYXRhT3V0cHV0QnVmZmVyIHJldXNlT3JBbGxvY2F0ZUJ1ZmZlcigpCisgICAgeworICAgICAgICAvLyBDaGVjayB3aGV0aGVyIGEgcmV1c2FibGUgRGF0YU91dHB1dEJ1ZmZlciBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcworICAgICAgICAvLyBDb2x1bW5JbmRleCBpbnN0YW5jZSBhbmQgcmV0dXJuIGl0LgorICAgICAgICBpZiAocmV1c2FibGVCdWZmZXIgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgRGF0YU91dHB1dEJ1ZmZlciBidWZmZXIgPSByZXVzYWJsZUJ1ZmZlcjsKKyAgICAgICAgICAgIGJ1ZmZlci5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICAgICAgfQorICAgICAgICAvLyBkb24ndCB1c2UgdGhlIHN0YW5kYXJkIFJFQ1lDTEVSIGFzIHRoYXQgb25seSByZWN5Y2xlcyB1cCB0byAxTUIgYW5kIHJlcXVpcmVzIHByb3BlciBjbGVhbnVwCisgICAgICAgIHJldHVybiBuZXcgRGF0YU91dHB1dEJ1ZmZlcihjYWNoZVNpemVUaHJlc2hvbGQgKiAyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRVbmZpbHRlcmVkKFVuZmlsdGVyZWQgdW5maWx0ZXJlZCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBzdXBlci5hZGRVbmZpbHRlcmVkKHVuZmlsdGVyZWQpOworCisgICAgICAgIC8vIGlmIHdlIGhpdCB0aGUgY29sdW1uIGluZGV4IHNpemUgdGhhdCB3ZSBoYXZlIHRvIGluZGV4IGFmdGVyLCBnbyBhaGVhZCBhbmQgaW5kZXggaXQuCisgICAgICAgIGlmIChjdXJyZW50UG9zaXRpb24oKSAtIHN0YXJ0UG9zaXRpb24gPj0gaW5kZXhTaXplKQorICAgICAgICAgICAgYWRkSW5kZXhCbG9jaygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGZpbmlzaCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbG9uZyBlbmRQb3NpdGlvbiA9IHN1cGVyLmZpbmlzaCgpOworCisgICAgICAgIC8vIEl0J3MgcG9zc2libGUgd2UgYWRkIG5vIHJvd3MsIGp1c3QgYSB0b3AgbGV2ZWwgZGVsZXRpb24KKyAgICAgICAgaWYgKHdyaXR0ZW4gPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBlbmRQb3NpdGlvbjsKKworICAgICAgICAvLyB0aGUgbGFzdCBjb2x1bW4gbWF5IGhhdmUgZmFsbGVuIG9uIGFuIGluZGV4IGJvdW5kYXJ5IGFscmVhZHkuICBpZiBub3QsIGluZGV4IGl0IGV4cGxpY2l0bHkuCisgICAgICAgIGlmIChmaXJzdENsdXN0ZXJpbmcgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZEluZGV4QmxvY2soKTsKKworICAgICAgICAvLyBJZiB3ZSBzZXJpYWxpemUgdGhlIEluZGV4SW5mbyBvYmplY3RzIGRpcmVjdGx5IGluIHRoZSBjb2RlIGFib3ZlIGludG8gJ2J1ZmZlcicsCisgICAgICAgIC8vIHdlIGhhdmUgdG8gd3JpdGUgdGhlIG9mZnN0cyB0byB0aGVzZSBoZXJlLiBUaGUgb2Zmc2V0cyBoYXZlIGFscmVhZHkgYmVlbiBjb2xsZWN0ZWQKKyAgICAgICAgLy8gaW4gaW5kZXhPZmZzZXRzW10uIGJ1ZmZlciBpcyAhPSBudWxsLCBpZiBpdCBleGNlZWRzIENvbmZpZy5jb2x1bW5faW5kZXhfY2FjaGVfc2l6ZS4KKyAgICAgICAgLy8gSW4gdGhlIG90aGVyIGNhc2UsIHdoZW4gYnVmZmVyPT1udWxsLCB0aGUgb2Zmc2V0cyBhcmUgc2VyaWFsaXplZCBpbiBSb3dJbmRleEVudHJ5LkluZGV4ZWRFbnRyeS5zZXJpYWxpemUoKS4KKyAgICAgICAgaWYgKGJ1ZmZlciAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkluZGV4Q291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICBidWZmZXIud3JpdGVJbnQoaW5kZXhPZmZzZXRzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdlIHNob3VsZCBhbHdheXMgaGF2ZSBhdCBsZWFzdCBvbmUgY29tcHV0ZWQgaW5kZXggYmxvY2ssIGJ1dCB3ZSBvbmx5IHdyaXRlIGl0IG91dCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gdGhhdC4KKyAgICAgICAgYXNzZXJ0IGNvbHVtbkluZGV4Q291bnQgPiAwICYmIGdldEhlYWRlckxlbmd0aCgpID49IDA7CisKKyAgICAgICAgcmV0dXJuIGVuZFBvc2l0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaW5kZXhJbmZvU2VyaWFsaXplZFNpemUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlciAhPSBudWxsCisgICAgICAgICAgICAgICA/IGJ1ZmZlci5idWZmZXIoKS5saW1pdCgpCisgICAgICAgICAgICAgICA6IGluZGV4U2FtcGxlc1NlcmlhbGl6ZWRTaXplICsgY29sdW1uSW5kZXhDb3VudCAqIFR5cGVTaXplcy5zaXplb2YoMCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgIHsKKyAgICAgICAgLy8gbm8tb3AKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ1NTVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ1NTVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZjcyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnU1NUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwzMDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWxJbnQ7CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQ29tcHJlc3Npb25NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRvd25zYW1wbGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLktleVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuQ29tcHJlc3Npb25JbmZvQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LkZpbHRlckNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5JbmRleENvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5Tb3J0ZWRUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlN0YXRzQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQuQ29tcG9uZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeS5JbmRleFN1bW1hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5pbmRleHN1bW1hcnkuSW5kZXhTdW1tYXJ5QnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmtleWNhY2hlLktleUNhY2hlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuVmFsaWRhdGlvbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGlza09wdGltaXphdGlvblN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlRhYmxlTWV0cmljczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNhY2hlU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GaWx0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLklGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCitwdWJsaWMgY2xhc3MgQmlnU1NUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyIGV4dGVuZHMgU29ydGVkVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlcjxCaWdUYWJsZVJlYWRlciwgQmlnVGFibGVSZWFkZXIuQnVpbGRlcj4KK3sKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQmlnU1NUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyLmNsYXNzKTsKKworICAgIHByaXZhdGUgRmlsZUhhbmRsZS5CdWlsZGVyIGluZGV4RmlsZUJ1aWxkZXI7CisKKyAgICBwdWJsaWMgQmlnU1NUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyKFNTVGFibGUuQnVpbGRlcjw/LCA/PiBkZXNjcmlwdG9yKQorICAgIHsKKyAgICAgICAgc3VwZXIoZGVzY3JpcHRvcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb3BlbkNvbXBvbmVudHMoQmlnVGFibGVSZWFkZXIuQnVpbGRlciBidWlsZGVyLCBTU1RhYmxlLk93bmVyIG93bmVyLCBib29sZWFuIHZhbGlkYXRlLCBib29sZWFuIG9ubGluZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG9ubGluZSAmJiBidWlsZGVyLmdldFRhYmxlTWV0YWRhdGFSZWYoKS5nZXRMb2NhbCgpLnBhcmFtcy5jYWNoaW5nLmNhY2hlS2V5cygpKQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0S2V5Q2FjaGUobmV3IEtleUNhY2hlKENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZSkpOworCisgICAgICAgICAgICBTdGF0c0NvbXBvbmVudCBzdGF0c0NvbXBvbmVudCA9IFN0YXRzQ29tcG9uZW50LmxvYWQoZGVzY3JpcHRvciwgTWV0YWRhdGFUeXBlLlNUQVRTLCBNZXRhZGF0YVR5cGUuSEVBREVSLCBNZXRhZGF0YVR5cGUuVkFMSURBVElPTik7CisgICAgICAgICAgICBidWlsZGVyLnNldFNlcmlhbGl6YXRpb25IZWFkZXIoc3RhdHNDb21wb25lbnQuc2VyaWFsaXphdGlvbkhlYWRlcihidWlsZGVyLmdldFRhYmxlTWV0YWRhdGFSZWYoKS5nZXRMb2NhbCgpKSk7CisgICAgICAgICAgICBjaGVja0FyZ3VtZW50KCFvbmxpbmUgfHwgYnVpbGRlci5nZXRTZXJpYWxpemF0aW9uSGVhZGVyKCkgIT0gbnVsbCk7CisKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0U3RhdHNNZXRhZGF0YShzdGF0c0NvbXBvbmVudC5zdGF0c01ldGFkYXRhKCkpOworICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IudmVyc2lvbi5oYXNLZXlSYW5nZSgpICYmIHN0YXRzQ29tcG9uZW50LnN0YXRzTWV0YWRhdGEoKSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0Rmlyc3QodGFibGVNZXRhZGF0YVJlZi5nZXRMb2NhbCgpLnBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KHN0YXRzQ29tcG9uZW50LnN0YXRzTWV0YWRhdGEoKS5maXJzdEtleSkpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0TGFzdCh0YWJsZU1ldGFkYXRhUmVmLmdldExvY2FsKCkucGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoc3RhdHNDb21wb25lbnQuc3RhdHNNZXRhZGF0YSgpLmxhc3RLZXkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVmFsaWRhdGlvbk1ldGFkYXRhIHZhbGlkYXRpb25NZXRhZGF0YSA9IHN0YXRzQ29tcG9uZW50LnZhbGlkYXRpb25NZXRhZGF0YSgpOworICAgICAgICAgICAgdmFsaWRhdGVQYXJ0aXRpb25lcihidWlsZGVyLmdldFRhYmxlTWV0YWRhdGFSZWYoKS5nZXRMb2NhbCgpLCB2YWxpZGF0aW9uTWV0YWRhdGEpOworCisgICAgICAgICAgICBib29sZWFuIGZpbHRlck5lZWRlZCA9IG9ubGluZTsKKyAgICAgICAgICAgIGlmIChmaWx0ZXJOZWVkZWQpCisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRGaWx0ZXIobG9hZEZpbHRlcih2YWxpZGF0aW9uTWV0YWRhdGEpKTsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVidWlsZEZpbHRlciA9IGZpbHRlck5lZWRlZCAmJiBidWlsZGVyLmdldEZpbHRlcigpID09IG51bGw7CisKKyAgICAgICAgICAgIGJvb2xlYW4gc3VtbWFyeU5lZWRlZCA9IHRydWU7CisgICAgICAgICAgICBpZiAoc3VtbWFyeU5lZWRlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbmRleFN1bW1hcnlDb21wb25lbnQgc3VtbWFyeUNvbXBvbmVudCA9IGxvYWRTdW1tYXJ5KCk7CisgICAgICAgICAgICAgICAgaWYgKHN1bW1hcnlDb21wb25lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWlsZGVyLmdldEZpcnN0KCkgPT0gbnVsbCB8fCBidWlsZGVyLmdldExhc3QoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnNldEZpcnN0KHN1bW1hcnlDb21wb25lbnQuZmlyc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRMYXN0KHN1bW1hcnlDb21wb25lbnQubGFzdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRJbmRleFN1bW1hcnkoc3VtbWFyeUNvbXBvbmVudC5pbmRleFN1bW1hcnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2xlYW4gcmVidWlsZFN1bW1hcnkgPSBzdW1tYXJ5TmVlZGVkICYmIGJ1aWxkZXIuZ2V0SW5kZXhTdW1tYXJ5KCkgPT0gbnVsbDsKKworICAgICAgICAgICAgaWYgKGJ1aWxkZXIuZ2V0Q29tcG9uZW50cygpLmNvbnRhaW5zKENvbXBvbmVudHMuUFJJTUFSWV9JTkRFWCkgJiYgKHJlYnVpbGRGaWx0ZXIgfHwgcmVidWlsZFN1bW1hcnkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBpbmRleEZpbGUgPSBpbmRleEZpbGVCdWlsZGVyKGJ1aWxkZXIuZ2V0SW5kZXhTdW1tYXJ5KCkpLmNvbXBsZXRlKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQYWlyPElGaWx0ZXIsIEluZGV4U3VtbWFyeUNvbXBvbmVudD4gZmlsdGVyQW5kU3VtbWFyeSA9IGJ1aWxkU3VtbWFyeUFuZEJsb29tRmlsdGVyKGluZGV4RmlsZSwgYnVpbGRlci5nZXRTZXJpYWxpemF0aW9uSGVhZGVyKCksIHJlYnVpbGRGaWx0ZXIsIHJlYnVpbGRTdW1tYXJ5LCBvd25lciAhPSBudWxsID8gb3duZXIuZ2V0TWV0cmljcygpIDogbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIElGaWx0ZXIgZmlsdGVyID0gZmlsdGVyQW5kU3VtbWFyeS5sZWZ0OworICAgICAgICAgICAgICAgICAgICBJbmRleFN1bW1hcnlDb21wb25lbnQgc3VtbWFyeUNvbXBvbmVudCA9IGZpbHRlckFuZFN1bW1hcnkucmlnaHQ7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1bW1hcnlDb21wb25lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRGaXJzdChzdW1tYXJ5Q29tcG9uZW50LmZpcnN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0TGFzdChzdW1tYXJ5Q29tcG9uZW50Lmxhc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRJbmRleFN1bW1hcnkoc3VtbWFyeUNvbXBvbmVudC5pbmRleFN1bW1hcnkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob25saW5lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlDb21wb25lbnQuc2F2ZShkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5TVU1NQVJZKSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnNldEZpbHRlcihmaWx0ZXIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob25saW5lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlckNvbXBvbmVudC5zYXZlKGZpbHRlciwgZGVzY3JpcHRvciwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgKENvbXByZXNzaW9uTWV0YWRhdGEgY29tcHJlc3Npb25NZXRhZGF0YSA9IENvbXByZXNzaW9uSW5mb0NvbXBvbmVudC5tYXliZUxvYWQoZGVzY3JpcHRvciwgY29tcG9uZW50cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXREYXRhRmlsZShkYXRhRmlsZUJ1aWxkZXIoYnVpbGRlci5nZXRTdGF0c01ldGFkYXRhKCkpLndpdGhDb21wcmVzc2lvbk1ldGFkYXRhKGNvbXByZXNzaW9uTWV0YWRhdGEpLmNvbXBsZXRlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYnVpbGRlci5nZXRGaWx0ZXIoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0RmlsdGVyKEZpbHRlckZhY3RvcnkuQWx3YXlzUHJlc2VudCk7CisKKyAgICAgICAgICAgIGlmIChidWlsZGVyLmdldENvbXBvbmVudHMoKS5jb250YWlucyhDb21wb25lbnRzLlBSSU1BUllfSU5ERVgpKQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0SW5kZXhGaWxlKGluZGV4RmlsZUJ1aWxkZXIoYnVpbGRlci5nZXRJbmRleFN1bW1hcnkoKSkuY29tcGxldGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIHwgUnVudGltZUV4Y2VwdGlvbiB8IEVycm9yIGV4KQorICAgICAgICB7CisgICAgICAgICAgICBUaHJvd2FibGVzLmNsb3NlTm9uTnVsbEFuZEFkZFN1cHByZXNzZWQoZXgsIGJ1aWxkZXIuZ2V0RGF0YUZpbGUoKSwgYnVpbGRlci5nZXRJbmRleEZpbGUoKSwgYnVpbGRlci5nZXRGaWx0ZXIoKSwgYnVpbGRlci5nZXRJbmRleFN1bW1hcnkoKSk7CisgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBLZXlSZWFkZXIgYnVpbGRLZXlSZWFkZXIoVGFibGVNZXRyaWNzIHRhYmxlTWV0cmljcykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBTdGF0c0NvbXBvbmVudCBzdGF0c0NvbXBvbmVudCA9IFN0YXRzQ29tcG9uZW50LmxvYWQoZGVzY3JpcHRvciwgTWV0YWRhdGFUeXBlLlNUQVRTLCBNZXRhZGF0YVR5cGUuSEVBREVSLCBNZXRhZGF0YVR5cGUuVkFMSURBVElPTik7CisgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyID0gc3RhdHNDb21wb25lbnQuc2VyaWFsaXphdGlvbkhlYWRlcih0YWJsZU1ldGFkYXRhUmVmLmdldExvY2FsKCkpOworICAgICAgICB0cnkgKEZpbGVIYW5kbGUgaW5kZXhGaWxlID0gaW5kZXhGaWxlQnVpbGRlcihudWxsKS5jb21wbGV0ZSgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlS2V5UmVhZGVyKGluZGV4RmlsZSwgaGVhZGVyLCB0YWJsZU1ldHJpY3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBLZXlSZWFkZXIgY3JlYXRlS2V5UmVhZGVyKEZpbGVIYW5kbGUgaW5kZXhGaWxlLCBTZXJpYWxpemF0aW9uSGVhZGVyIHNlcmlhbGl6YXRpb25IZWFkZXIsIFRhYmxlTWV0cmljcyB0YWJsZU1ldHJpY3MpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGluZGV4RmlsZSk7CisgICAgICAgIGNoZWNrTm90TnVsbChzZXJpYWxpemF0aW9uSGVhZGVyKTsKKworICAgICAgICBSb3dJbmRleEVudHJ5LkluZGV4U2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IFJvd0luZGV4RW50cnkuU2VyaWFsaXplcihkZXNjcmlwdG9yLnZlcnNpb24sIHNlcmlhbGl6YXRpb25IZWFkZXIsIHRhYmxlTWV0cmljcyk7CisgICAgICAgIHJldHVybiBCaWdUYWJsZUtleVJlYWRlci5jcmVhdGUoaW5kZXhGaWxlLCBzZXJpYWxpemVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHbyB0aHJvdWdoIHRoZSBpbmRleCBhbmQgb3B0aW9uYWxseSByZWJ1aWxkIHRoZSBpbmRleCBzdW1tYXJ5IGFuZCBCbG9vbSBmaWx0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVidWlsZEZpbHRlciAgdHJ1ZSBpZiBCbG9vbSBmaWx0ZXIgc2hvdWxkIGJlIHJlYnVpbHQKKyAgICAgKiBAcGFyYW0gcmVidWlsZFN1bW1hcnkgdHJ1ZSBpZiBpbmRleCBzdW1tYXJ5LCBmaXJzdCBhbmQgbGFzdCBrZXlzIHNob3VsZCBiZSByZWJ1aWx0CisgICAgICogQHJldHVybiBhIHBhaXIgb2YgY3JlYXRlZCBmaWx0ZXIgYW5kIGluZGV4IHN1bW1hcnkgY29tcG9uZW50IChvciBudWxscyBpZiBzb21lIG9mIHRoZW0gd2VyZSBub3QgY3JlYXRlZCkKKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQorICAgIHByaXZhdGUgUGFpcjxJRmlsdGVyLCBJbmRleFN1bW1hcnlDb21wb25lbnQ+IGJ1aWxkU3VtbWFyeUFuZEJsb29tRmlsdGVyKEZpbGVIYW5kbGUgaW5kZXhGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgc2VyaWFsaXphdGlvbkhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJlYnVpbGRGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZWJ1aWxkU3VtbWFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZU1ldHJpY3MgdGFibGVNZXRyaWNzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGNoZWNrTm90TnVsbChpbmRleEZpbGUpOworICAgICAgICBjaGVja05vdE51bGwoc2VyaWFsaXphdGlvbkhlYWRlcik7CisKKyAgICAgICAgRGVjb3JhdGVkS2V5IGZpcnN0ID0gbnVsbCwga2V5ID0gbnVsbDsKKyAgICAgICAgSUZpbHRlciBiZiA9IG51bGw7CisgICAgICAgIEluZGV4U3VtbWFyeSBpbmRleFN1bW1hcnkgPSBudWxsOworCisgICAgICAgIC8vIHdlIHJlYWQgdGhlIHBvc2l0aW9ucyBpbiBhIEJSQUYsIHNvIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgYW4gZW50cnkgc3Bhbm5pbmcgYSBtbWFwIGJvdW5kYXJ5LgorICAgICAgICB0cnkgKEtleVJlYWRlciBrZXlSZWFkZXIgPSBjcmVhdGVLZXlSZWFkZXIoaW5kZXhGaWxlLCBzZXJpYWxpemF0aW9uSGVhZGVyLCB0YWJsZU1ldHJpY3MpKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGVzdGltYXRlZFJvd3NOdW1iZXIgPSByZWJ1aWxkRmlsdGVyIHx8IHJlYnVpbGRTdW1tYXJ5ID8gZXN0aW1hdGVSb3dzRnJvbUluZGV4KGluZGV4RmlsZSkgOiAwOworCisgICAgICAgICAgICBpZiAocmVidWlsZEZpbHRlcikKKyAgICAgICAgICAgICAgICBiZiA9IEZpbHRlckZhY3RvcnkuZ2V0RmlsdGVyKGVzdGltYXRlZFJvd3NOdW1iZXIsIHRhYmxlTWV0YWRhdGFSZWYuZ2V0TG9jYWwoKS5wYXJhbXMuYmxvb21GaWx0ZXJGcENoYW5jZSk7CisKKyAgICAgICAgICAgIHRyeSAoSW5kZXhTdW1tYXJ5QnVpbGRlciBzdW1tYXJ5QnVpbGRlciA9ICFyZWJ1aWxkU3VtbWFyeSA/IG51bGwgOiBuZXcgSW5kZXhTdW1tYXJ5QnVpbGRlcihlc3RpbWF0ZWRSb3dzTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTWV0YWRhdGFSZWYuZ2V0TG9jYWwoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3duc2FtcGxpbmcuQkFTRV9TQU1QTElOR19MRVZFTCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUgKCFrZXlSZWFkZXIuaXNFeGhhdXN0ZWQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGtleSA9IHRhYmxlTWV0YWRhdGFSZWYuZ2V0TG9jYWwoKS5wYXJ0aXRpb25lci5kZWNvcmF0ZUtleShrZXlSZWFkZXIua2V5KCkpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVidWlsZFN1bW1hcnkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0ga2V5OworICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeUJ1aWxkZXIubWF5YmVBZGRFbnRyeShrZXksIGtleVJlYWRlci5rZXlQb3NpdGlvbkZvclNlY29uZGFyeUluZGV4KCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlYnVpbGRGaWx0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICBiZi5hZGQoa2V5KTsKKworICAgICAgICAgICAgICAgICAgICBrZXlSZWFkZXIuYWR2YW5jZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyZWJ1aWxkU3VtbWFyeSkKKyAgICAgICAgICAgICAgICAgICAgaW5kZXhTdW1tYXJ5ID0gc3VtbWFyeUJ1aWxkZXIuYnVpbGQodGFibGVNZXRhZGF0YVJlZi5nZXRMb2NhbCgpLnBhcnRpdGlvbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gfCBSdW50aW1lRXhjZXB0aW9uIHwgRXJyb3IgZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRocm93YWJsZXMuY2xvc2VOb25OdWxsQW5kQWRkU3VwcHJlc3NlZChleCwgaW5kZXhTdW1tYXJ5LCBiZik7CisgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCByZWJ1aWxkU3VtbWFyeSB8fCBpbmRleFN1bW1hcnkgPT0gbnVsbDsKKyAgICAgICAgcmV0dXJuIFBhaXIuY3JlYXRlKGJmLCByZWJ1aWxkU3VtbWFyeSA/IG5ldyBJbmRleFN1bW1hcnlDb21wb25lbnQoaW5kZXhTdW1tYXJ5LCBmaXJzdCwga2V5KSA6IG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWQgaW5kZXggc3VtbWFyeSwgZmlyc3Qga2V5IGFuZCBsYXN0IGtleSBmcm9tIFN1bW1hcnkuZGIgZmlsZSBpZiBpdCBleGlzdHMuCisgICAgICogPHA+CisgICAgICogaWYgbG9hZGVkIGluZGV4IHN1bW1hcnkgaGFzIGRpZmZlcmVudCBpbmRleCBpbnRlcnZhbCBmcm9tIGN1cnJlbnQgdmFsdWUgc3RvcmVkIGluIHNjaGVtYSwKKyAgICAgKiB0aGVuIFN1bW1hcnkuZGIgZmlsZSB3aWxsIGJlIGRlbGV0ZWQgYW5kIG5lZWQgdG8gYmUgcmVidWlsdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEluZGV4U3VtbWFyeUNvbXBvbmVudCBsb2FkU3VtbWFyeSgpCisgICAgeworICAgICAgICBJbmRleFN1bW1hcnlDb21wb25lbnQgc3VtbWFyeUNvbXBvbmVudCA9IG51bGw7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnRzLlNVTU1BUlkpKQorICAgICAgICAgICAgICAgIHN1bW1hcnlDb21wb25lbnQgPSBJbmRleFN1bW1hcnlDb21wb25lbnQubG9hZE9yRGVsZXRlQ29ycnVwdGVkKGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlNVTU1BUlkpLCB0YWJsZU1ldGFkYXRhUmVmLmdldCgpKTsKKworICAgICAgICAgICAgaWYgKHN1bW1hcnlDb21wb25lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIkluZGV4IHN1bW1hcnkgZmlsZSBpcyBtaXNzaW5nOiB7fSIsIGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlNVTU1BUlkpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiSW5kZXggc3VtbWFyeSBmaWxlIGlzIGNvcnJ1cHRlZDogIiArIGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlNVTU1BUlkpLCBleCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3VtbWFyeUNvbXBvbmVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIEFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2Yga2V5cyBjb250YWluZWQgaW4gdGhlIGdpdmVuIGluZGV4IGZpbGUuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZXN0aW1hdGVSb3dzRnJvbUluZGV4KEZpbGVIYW5kbGUgaW5kZXhGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGNoZWNrTm90TnVsbChpbmRleEZpbGUpOworCisgICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzUmVhZGVyIGluZGV4UmVhZGVyID0gaW5kZXhGaWxlLmNyZWF0ZVJlYWRlcigpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBjb2xsZWN0IHNpemVzIGZvciB0aGUgZmlyc3QgMTAwMDAga2V5cywgb3IgZmlyc3QgMTAgbWViaWJ5dGVzIG9mIGRhdGEKKyAgICAgICAgICAgIGZpbmFsIGludCBzYW1wbGVzQ2FwID0gMTAwMDA7CisgICAgICAgICAgICBmaW5hbCBpbnQgYnl0ZXNDYXAgPSAoaW50KSBNYXRoLm1pbigxMDAwMDAwMCwgaW5kZXhSZWFkZXIubGVuZ3RoKCkpOworICAgICAgICAgICAgaW50IGtleXMgPSAwOworICAgICAgICAgICAgd2hpbGUgKGluZGV4UmVhZGVyLmdldEZpbGVQb2ludGVyKCkgPCBieXRlc0NhcCAmJiBrZXlzIDwgc2FtcGxlc0NhcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5za2lwU2hvcnRMZW5ndGgoaW5kZXhSZWFkZXIpOworICAgICAgICAgICAgICAgIFJvd0luZGV4RW50cnkuU2VyaWFsaXplci5za2lwKGluZGV4UmVhZGVyLCBkZXNjcmlwdG9yLnZlcnNpb24pOworICAgICAgICAgICAgICAgIGtleXMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydCBrZXlzID4gMCAmJiBpbmRleFJlYWRlci5nZXRGaWxlUG9pbnRlcigpID4gMCAmJiBpbmRleFJlYWRlci5sZW5ndGgoKSA+IDAgOiAiVW5leHBlY3RlZCBlbXB0eSBpbmRleCBmaWxlOiAiICsgaW5kZXhSZWFkZXI7CisgICAgICAgICAgICBsb25nIGVzdGltYXRlZFJvd3MgPSBpbmRleFJlYWRlci5sZW5ndGgoKSAvIChpbmRleFJlYWRlci5nZXRGaWxlUG9pbnRlcigpIC8ga2V5cyk7CisgICAgICAgICAgICBpbmRleFJlYWRlci5zZWVrKDApOworICAgICAgICAgICAgcmV0dXJuIGVzdGltYXRlZFJvd3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEZpbGVIYW5kbGUuQnVpbGRlciBpbmRleEZpbGVCdWlsZGVyKEluZGV4U3VtbWFyeSBpbmRleFN1bW1hcnkpCisgICAgeworICAgICAgICBhc3NlcnQgdGhpcy5pbmRleEZpbGVCdWlsZGVyID09IG51bGwgfHwgdGhpcy5pbmRleEZpbGVCdWlsZGVyLmZpbGUuZXF1YWxzKGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlBSSU1BUllfSU5ERVgpKTsKKworICAgICAgICBsb25nIGluZGV4RmlsZUxlbmd0aCA9IGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlBSSU1BUllfSU5ERVgpLmxlbmd0aCgpOworICAgICAgICBPcHRpb25hbEludCBpbmRleEJ1ZmZlclNpemUgPSBpbmRleFN1bW1hcnkgIT0gbnVsbCA/IE9wdGlvbmFsSW50Lm9mKGlvT3B0aW9ucy5kaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3kuYnVmZmVyU2l6ZShpbmRleEZpbGVMZW5ndGggLyBpbmRleFN1bW1hcnkuc2l6ZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBPcHRpb25hbEludC5lbXB0eSgpOworCisgICAgICAgIGlmIChpbmRleEZpbGVCdWlsZGVyID09IG51bGwpCisgICAgICAgICAgICBpbmRleEZpbGVCdWlsZGVyID0gSW5kZXhDb21wb25lbnQuZmlsZUJ1aWxkZXIoZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuUFJJTUFSWV9JTkRFWCksIGlvT3B0aW9ucywgY2h1bmtDYWNoZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWZmZXJTaXplKGluZGV4QnVmZmVyU2l6ZS5vckVsc2UoRGlza09wdGltaXphdGlvblN0cmF0ZWd5Lk1BWF9CVUZGRVJfU0laRSkpOworCisgICAgICAgIGluZGV4QnVmZmVyU2l6ZS5pZlByZXNlbnQoaW5kZXhGaWxlQnVpbGRlcjo6YnVmZmVyU2l6ZSk7CisKKyAgICAgICAgcmV0dXJuIGluZGV4RmlsZUJ1aWxkZXI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ1RhYmxlS2V5UmVhZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnVGFibGVLZXlSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmM0ZTYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ1RhYmxlS2V5UmVhZGVyLmphdmEKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLmNvbmN1cnJlbnQuTm90VGhyZWFkU2FmZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuS2V5UmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5Sb3dJbmRleEVudHJ5LkluZGV4U2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SYW5kb21BY2Nlc3NSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKKworQE5vdFRocmVhZFNhZmUKK3B1YmxpYyBjbGFzcyBCaWdUYWJsZUtleVJlYWRlciBpbXBsZW1lbnRzIEtleVJlYWRlcgoreworICAgIHByaXZhdGUgZmluYWwgRmlsZUhhbmRsZSBpbmRleEZpbGU7CisgICAgcHJpdmF0ZSBmaW5hbCBSYW5kb21BY2Nlc3NSZWFkZXIgaW5kZXhGaWxlUmVhZGVyOworICAgIHByaXZhdGUgZmluYWwgSW5kZXhTZXJpYWxpemVyIHJvd0luZGV4RW50cnlTZXJpYWxpemVyOworICAgIHByaXZhdGUgZmluYWwgbG9uZyBpbml0aWFsUG9zaXRpb247CisKKyAgICBwcml2YXRlIEJ5dGVCdWZmZXIga2V5OworICAgIHByaXZhdGUgbG9uZyBkYXRhUG9zaXRpb247CisgICAgcHJpdmF0ZSBsb25nIGtleVBvc2l0aW9uOworCisgICAgcHJpdmF0ZSBCaWdUYWJsZUtleVJlYWRlcihGaWxlSGFuZGxlIGluZGV4RmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciBpbmRleEZpbGVSZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleFNlcmlhbGl6ZXIgcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIpCisgICAgeworICAgICAgICB0aGlzLmluZGV4RmlsZSA9IGluZGV4RmlsZTsKKyAgICAgICAgdGhpcy5pbmRleEZpbGVSZWFkZXIgPSBpbmRleEZpbGVSZWFkZXI7CisgICAgICAgIHRoaXMucm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIgPSByb3dJbmRleEVudHJ5U2VyaWFsaXplcjsKKyAgICAgICAgdGhpcy5pbml0aWFsUG9zaXRpb24gPSBpbmRleEZpbGVSZWFkZXIuZ2V0RmlsZVBvaW50ZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEJpZ1RhYmxlS2V5UmVhZGVyIGNyZWF0ZShSYW5kb21BY2Nlc3NSZWFkZXIgaW5kZXhGaWxlUmVhZGVyLCBJbmRleFNlcmlhbGl6ZXIgc2VyaWFsaXplcikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBCaWdUYWJsZUtleVJlYWRlciBpdGVyYXRvciA9IG5ldyBCaWdUYWJsZUtleVJlYWRlcihudWxsLCBpbmRleEZpbGVSZWFkZXIsIHNlcmlhbGl6ZXIpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgaXRlcmF0b3IuYWR2YW5jZSgpOworICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiB8IFJ1bnRpbWVFeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGl0ZXJhdG9yLmNsb3NlKCk7CisgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJlc291cmNlIiB9KQorICAgIHB1YmxpYyBzdGF0aWMgQmlnVGFibGVLZXlSZWFkZXIgY3JlYXRlKEZpbGVIYW5kbGUgaW5kZXhGaWxlLCBJbmRleFNlcmlhbGl6ZXIgc2VyaWFsaXplcikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBGaWxlSGFuZGxlIGlGaWxlID0gbnVsbDsKKyAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHJlYWRlciA9IG51bGw7CisgICAgICAgIEJpZ1RhYmxlS2V5UmVhZGVyIGl0ZXJhdG9yID0gbnVsbDsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlGaWxlID0gaW5kZXhGaWxlLnNoYXJlZENvcHkoKTsKKyAgICAgICAgICAgIHJlYWRlciA9IGlGaWxlLmNyZWF0ZVJlYWRlcigpOworICAgICAgICAgICAgaXRlcmF0b3IgPSBuZXcgQmlnVGFibGVLZXlSZWFkZXIoaUZpbGUsIHJlYWRlciwgc2VyaWFsaXplcik7CisgICAgICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7CisgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIHwgUnVudGltZUV4Y2VwdGlvbiBleCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGl0ZXJhdG9yICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaXRlcmF0b3IuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUaHJvd2FibGVzLmNsb3NlTm9uTnVsbEFuZEFkZFN1cHByZXNzZWQoZXgsIHJlYWRlciwgaUZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgeworICAgICAgICBrZXkgPSBudWxsOworICAgICAgICBkYXRhUG9zaXRpb24gPSAtMTsKKyAgICAgICAga2V5UG9zaXRpb24gPSAtMTsKKyAgICAgICAgRmlsZVV0aWxzLmNsb3NlUXVpZXRseShpbmRleEZpbGVSZWFkZXIpOworICAgICAgICBGaWxlVXRpbHMuY2xvc2VRdWlldGx5KGluZGV4RmlsZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gYWR2YW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKCFpbmRleEZpbGVSZWFkZXIuaXNFT0YoKSkKKyAgICAgICAgeworICAgICAgICAgICAga2V5UG9zaXRpb24gPSBpbmRleEZpbGVSZWFkZXIuZ2V0RmlsZVBvaW50ZXIoKTsKKyAgICAgICAgICAgIGtleSA9IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoaW5kZXhGaWxlUmVhZGVyKTsKKyAgICAgICAgICAgIGRhdGFQb3NpdGlvbiA9IHJvd0luZGV4RW50cnlTZXJpYWxpemVyLmRlc2VyaWFsaXplUG9zaXRpb25BbmRTa2lwKGluZGV4RmlsZVJlYWRlcik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGtleVBvc2l0aW9uID0gLTE7CisgICAgICAgICAgICBkYXRhUG9zaXRpb24gPSAtMTsKKyAgICAgICAgICAgIGtleSA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0V4aGF1c3RlZCgpCisgICAgeworICAgICAgICByZXR1cm4ga2V5ID09IG51bGwgJiYgZGF0YVBvc2l0aW9uIDwgMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBrZXkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBrZXlQb3NpdGlvbkZvclNlY29uZGFyeUluZGV4KCkKKyAgICB7CisgICAgICAgIHJldHVybiBrZXlQb3NpdGlvbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBkYXRhUG9zaXRpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRhdGFQb3NpdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBpbmRleFBvc2l0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpbmRleEZpbGVSZWFkZXIuZ2V0RmlsZVBvaW50ZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbmRleFBvc2l0aW9uKGxvbmcgcG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKHBvc2l0aW9uID4gaW5kZXhMZW5ndGgoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJUaGUgcmVxdWVzdGVkIHBvc2l0aW9uIGV4Y2VlZHMgdGhlIGluZGV4IGxlbmd0aCIpOworICAgICAgICBpbmRleEZpbGVSZWFkZXIuc2Vlayhwb3NpdGlvbik7CisgICAgICAgIGtleSA9IG51bGw7CisgICAgICAgIGtleVBvc2l0aW9uID0gMDsKKyAgICAgICAgZGF0YVBvc2l0aW9uID0gMDsKKyAgICAgICAgYWR2YW5jZSgpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGluZGV4TGVuZ3RoKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpbmRleEZpbGVSZWFkZXIubGVuZ3RoKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGluZGV4RmlsZVJlYWRlci5zZWVrKGluaXRpYWxQb3NpdGlvbik7CisgICAgICAgIGtleSA9IG51bGw7CisgICAgICAgIGtleVBvc2l0aW9uID0gMDsKKyAgICAgICAgZGF0YVBvc2l0aW9uID0gMDsKKyAgICAgICAgYWR2YW5jZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIkJpZ1RhYmxlLVBhcnRpdGlvbkluZGV4SXRlcmF0b3IoJXMpIiwgaW5kZXhGaWxlLnBhdGgoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ1RhYmxlUmVhZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnVGFibGVSZWFkZXIuamF2YQppbmRleCBlMGVkZDdhLi4wOTg0Y2M5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnVGFibGVSZWFkZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnVGFibGVSZWFkZXIuamF2YQpAQCAtMTksNDIgKzE5LDExMCBAQAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyQnVpbGRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb2x1bW5pdGVyYXRvci5TU1RhYmxlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29sdW1uaXRlcmF0b3IuU1NUYWJsZVJldmVyc2VkSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0JvdW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRhdGFSYW5nZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25UaW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlBhcnRpdGlvblBvc2l0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNsaWNlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcldpdGhMb3dlckJvdW5kOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQWJzdHJhY3RCb3VuZHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFJvd0luZGV4RW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db3JydXB0U1NUYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Eb3duc2FtcGxpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU1NUYWJsZVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JVmVyaWZpZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JbmRleEluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5LZXlSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVJlYWRzTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmVhZHNMaXN0ZW5lci5TZWxlY3Rpb25SZWFzb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmVhZHNMaXN0ZW5lci5Ta2lwcGluZ1JlYXNvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkc0xpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkc0xpc3RlbmVyLlNlbGVjdGlvblJlYXNvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZHNMaXN0ZW5lci5Ta2lwcGluZ1JlYXNvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyV2l0aEZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0LkNvbXBvbmVudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5pbmRleHN1bW1hcnkuSW5kZXhTdW1tYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuaW5kZXhzdW1tYXJ5LkluZGV4U3VtbWFyeUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5pbmRleHN1bW1hcnkuSW5kZXhTdW1tYXJ5U3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmtleWNhY2hlLktleUNhY2hlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUua2V5Y2FjaGUuS2V5Q2FjaGVTdXBwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVEYXRhSW5wdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhY2luZy5UcmFjaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5JRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk91dHB1dEhhbmRsZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5TaGFyZWRDbG9zZWFibGUuc2hhcmVkQ29weU9yTnVsbDsKIAogLyoqCiAgKiBTU1RhYmxlUmVhZGVycyBhcmUgb3BlbigpZWQgYnkgS2V5c3BhY2Uub25TdGFydDsgYWZ0ZXIgdGhhdCB0aGV5IGFyZSBjcmVhdGVkIGJ5IFNTVGFibGVXcml0ZXIucmVuYW1lQW5kT3Blbi4KICAqIERvIG5vdCByZS1jYWxsIG9wZW4oKSBvbiBleGlzdGluZyBTU1RhYmxlIGZpbGVzOyB1c2UgdGhlIHJlZmVyZW5jZXMga2VwdCBieSBDb2x1bW5GYW1pbHlTdG9yZSBwb3N0LXN0YXJ0IGluc3RlYWQuCiAgKi8KLXB1YmxpYyBjbGFzcyBCaWdUYWJsZVJlYWRlciBleHRlbmRzIFNTVGFibGVSZWFkZXIKK3B1YmxpYyBjbGFzcyBCaWdUYWJsZVJlYWRlciBleHRlbmRzIFNTVGFibGVSZWFkZXJXaXRoRmlsdGVyIGltcGxlbWVudHMgSW5kZXhTdW1tYXJ5U3VwcG9ydDxCaWdUYWJsZVJlYWRlcj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUNhY2hlU3VwcG9ydDxCaWdUYWJsZVJlYWRlcj4KIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQmlnVGFibGVSZWFkZXIuY2xhc3MpOwogCi0gICAgQmlnVGFibGVSZWFkZXIoU1NUYWJsZVJlYWRlckJ1aWxkZXIgYnVpbGRlcikKKyAgICBwcml2YXRlIGZpbmFsIFJvd0luZGV4RW50cnkuSW5kZXhTZXJpYWxpemVyIHJvd0luZGV4RW50cnlTZXJpYWxpemVyOworICAgIHByaXZhdGUgZmluYWwgSW5kZXhTdW1tYXJ5IGluZGV4U3VtbWFyeTsKKyAgICBwcml2YXRlIGZpbmFsIEZpbGVIYW5kbGUgaWZpbGU7CisKKyAgICBwcml2YXRlIGZpbmFsIEtleUNhY2hlIGtleUNhY2hlOworCisgICAgcHVibGljIEJpZ1RhYmxlUmVhZGVyKEJ1aWxkZXIgYnVpbGRlciwgU1NUYWJsZS5Pd25lciBvd25lcikKICAgICB7Ci0gICAgICAgIHN1cGVyKGJ1aWxkZXIpOworICAgICAgICBzdXBlcihidWlsZGVyLCBvd25lcik7CisgICAgICAgIHRoaXMuaWZpbGUgPSBidWlsZGVyLmdldEluZGV4RmlsZSgpOworICAgICAgICB0aGlzLmluZGV4U3VtbWFyeSA9IGJ1aWxkZXIuZ2V0SW5kZXhTdW1tYXJ5KCk7CisgICAgICAgIHRoaXMucm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIgPSBuZXcgUm93SW5kZXhFbnRyeS5TZXJpYWxpemVyKGRlc2NyaXB0b3IudmVyc2lvbiwgaGVhZGVyLCBvd25lciAhPSBudWxsID8gb3duZXIuZ2V0TWV0cmljcygpIDogbnVsbCk7CisgICAgICAgIHRoaXMua2V5Q2FjaGUgPSBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGJ1aWxkZXIuZ2V0S2V5Q2FjaGUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIExpc3Q8QXV0b0Nsb3NlYWJsZT4gc2V0dXBJbnN0YW5jZShib29sZWFuIHRyYWNrSG90bmVzcykKKyAgICB7CisgICAgICAgIEFycmF5TGlzdDxBdXRvQ2xvc2VhYmxlPiBjbG9zZWFibGVzID0gTGlzdHMubmV3QXJyYXlMaXN0KGluZGV4U3VtbWFyeSwgaWZpbGUpOworICAgICAgICBjbG9zZWFibGVzLmFkZEFsbChzdXBlci5zZXR1cEluc3RhbmNlKHRyYWNrSG90bmVzcykpOworICAgICAgICByZXR1cm4gY2xvc2VhYmxlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlSW5NZW1vcnlDb21wb25lbnRzKCkKKyAgICB7CisgICAgICAgIGNsb3NlSW50ZXJuYWxDb21wb25lbnQoaW5kZXhTdW1tYXJ5KTsKKyAgICAgICAgYXNzZXJ0IGluZGV4U3VtbWFyeS5pc0NsZWFuZWRVcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbmRleFN1bW1hcnkgZ2V0SW5kZXhTdW1tYXJ5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBpbmRleFN1bW1hcnk7CiAgICAgfQogCiAgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciByb3dJdGVyYXRvcihEZWNvcmF0ZWRLZXkga2V5LApAQCAtNjMsMTggKzEzMSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXZlcnNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkc0xpc3RlbmVyIGxpc3RlbmVyKQogICAgIHsKLSAgICAgICAgUm93SW5kZXhFbnRyeSByaWUgPSBnZXRQb3NpdGlvbihrZXksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEsIGxpc3RlbmVyKTsKKyAgICAgICAgUm93SW5kZXhFbnRyeSByaWUgPSBnZXRSb3dJbmRleEVudHJ5KGtleSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSwgdHJ1ZSwgbGlzdGVuZXIpOwogICAgICAgICByZXR1cm4gcm93SXRlcmF0b3IobnVsbCwga2V5LCByaWUsIHNsaWNlcywgc2VsZWN0ZWRDb2x1bW5zLCByZXZlcnNlZCk7CiAgICAgfQogCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKICAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHJvd0l0ZXJhdG9yKEZpbGVEYXRhSW5wdXQgZmlsZSwgRGVjb3JhdGVkS2V5IGtleSwgUm93SW5kZXhFbnRyeSBpbmRleEVudHJ5LCBTbGljZXMgc2xpY2VzLCBDb2x1bW5GaWx0ZXIgc2VsZWN0ZWRDb2x1bW5zLCBib29sZWFuIHJldmVyc2VkKQogICAgIHsKICAgICAgICAgaWYgKGluZGV4RW50cnkgPT0gbnVsbCkKICAgICAgICAgICAgIHJldHVybiBVbmZpbHRlcmVkUm93SXRlcmF0b3JzLm5vUm93c0l0ZXJhdG9yKG1ldGFkYXRhKCksIGtleSwgUm93cy5FTVBUWV9TVEFUSUNfUk9XLCBEZWxldGlvblRpbWUuTElWRSwgcmV2ZXJzZWQpOwotICAgICAgICByZXR1cm4gcmV2ZXJzZWQKLSAgICAgICAgICAgICA/IG5ldyBTU1RhYmxlUmV2ZXJzZWRJdGVyYXRvcih0aGlzLCBmaWxlLCBrZXksIGluZGV4RW50cnksIHNsaWNlcywgc2VsZWN0ZWRDb2x1bW5zLCBpZmlsZSkKLSAgICAgICAgICAgICA6IG5ldyBTU1RhYmxlSXRlcmF0b3IodGhpcywgZmlsZSwga2V5LCBpbmRleEVudHJ5LCBzbGljZXMsIHNlbGVjdGVkQ29sdW1ucywgaWZpbGUpOworICAgICAgICBlbHNlIGlmIChyZXZlcnNlZCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgU1NUYWJsZVJldmVyc2VkSXRlcmF0b3IodGhpcywgZmlsZSwga2V5LCBpbmRleEVudHJ5LCBzbGljZXMsIHNlbGVjdGVkQ29sdW1ucywgaWZpbGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbmV3IFNTVGFibGVJdGVyYXRvcih0aGlzLCBmaWxlLCBrZXksIGluZGV4RW50cnksIHNsaWNlcywgc2VsZWN0ZWRDb2x1bW5zLCBpZmlsZSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC04Myw2ICsxNTEsMTIgQEAKICAgICAgICAgcmV0dXJuIEJpZ1RhYmxlU2Nhbm5lci5nZXRTY2FubmVyKHRoaXMsIGNvbHVtbnMsIGRhdGFSYW5nZSwgbGlzdGVuZXIpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBLZXlSZWFkZXIga2V5UmVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gQmlnVGFibGVLZXlSZWFkZXIuY3JlYXRlKGlmaWxlLCByb3dJbmRleEVudHJ5U2VyaWFsaXplcik7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogRGlyZWN0IEkvTyBTU1RhYmxlU2Nhbm5lciBvdmVyIGFuIGl0ZXJhdG9yIG9mIGJvdW5kcy4KICAgICAgKgpAQCAtMTE4LDk3ICsxOTIsMTMzIEBACiAgICAgICAgICAgICByZXR1cm4gZ2V0U2Nhbm5lcigpOwogICAgIH0KIAotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gY2FsbGVyIHRvIGNsb3NlCisgICAgLyoqCisgICAgICogRmluZHMgYW5kIHJldHVybnMgdGhlIGZpcnN0IGtleSBiZXlvbmQgYSBnaXZlbiB0b2tlbiBpbiB0aGlzIFNTVGFibGUgb3IgbnVsbCBpZiBubyBzdWNoIGtleSBleGlzdHMuCisgICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBzaW1wbGVJdGVyYXRvcihGaWxlRGF0YUlucHV0IGRmaWxlLCBEZWNvcmF0ZWRLZXkga2V5LCBSb3dJbmRleEVudHJ5IHBvc2l0aW9uLCBib29sZWFuIHRvbWJzdG9uZU9ubHkpCisgICAgcHVibGljIERlY29yYXRlZEtleSBmaXJzdEtleUJleW9uZChQYXJ0aXRpb25Qb3NpdGlvbiB0b2tlbikKICAgICB7Ci0gICAgICAgIHJldHVybiBTU1RhYmxlSWRlbnRpdHlJdGVyYXRvci5jcmVhdGUodGhpcywgZGZpbGUsIHBvc2l0aW9uLCBrZXksIHRvbWJzdG9uZU9ubHkpOworICAgICAgICBpZiAodG9rZW4uY29tcGFyZVRvKGZpcnN0KSA8IDApCisgICAgICAgICAgICByZXR1cm4gZmlyc3Q7CisKKyAgICAgICAgbG9uZyBzYW1wbGVkUG9zaXRpb24gPSBnZXRJbmRleFNjYW5Qb3NpdGlvbih0b2tlbik7CisKKyAgICAgICAgaWYgKGlmaWxlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBTdHJpbmcgcGF0aCA9IG51bGw7CisgICAgICAgIHRyeSAoRmlsZURhdGFJbnB1dCBpbiA9IGlmaWxlLmNyZWF0ZVJlYWRlcihzYW1wbGVkUG9zaXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgICBwYXRoID0gaW4uZ2V0UGF0aCgpOworICAgICAgICAgICAgd2hpbGUgKCFpbi5pc0VPRigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgaW5kZXhLZXkgPSBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGluKTsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgaW5kZXhEZWNvcmF0ZWRLZXkgPSBkZWNvcmF0ZUtleShpbmRleEtleSk7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4RGVjb3JhdGVkS2V5LmNvbXBhcmVUbyh0b2tlbikgPiAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhEZWNvcmF0ZWRLZXk7CisKKyAgICAgICAgICAgICAgICBSb3dJbmRleEVudHJ5LlNlcmlhbGl6ZXIuc2tpcChpbiwgZGVzY3JpcHRvci52ZXJzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgbWFya1N1c3BlY3QoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihlLCBwYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgcG9zaXRpb24gd2hpbGUgdXBkYXRpbmcgdGhlIGtleSBjYWNoZSBhbmQgdGhlIHN0YXRzLgorICAgICAqCiAgICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGFwcGx5IGFzIHRoZSByaHMgdG8gdGhlIGdpdmVuIE9wZXJhdG9yLiBBICdmYWtlJyBrZXkgaXMgYWxsb3dlZCB0bwotICAgICAqIGFsbG93IGtleSBzZWxlY3Rpb24gYnkgdG9rZW4gYm91bmRzIGJ1dCBvbmx5IGlmIG9wICE9ICogRVEKLSAgICAgKiBAcGFyYW0gb3AgVGhlIE9wZXJhdG9yIGRlZmluaW5nIG1hdGNoaW5nIGtleXM6IHRoZSBuZWFyZXN0IGtleSB0byB0aGUgdGFyZ2V0IG1hdGNoaW5nIHRoZSBvcGVyYXRvciB3aW5zLgotICAgICAqIEBwYXJhbSB1cGRhdGVDYWNoZUFuZFN0YXRzIHRydWUgaWYgdXBkYXRpbmcgc3RhdHMgYW5kIGNhY2hlCisgICAgICogICAgICAgICAgICBhbGxvdyBrZXkgc2VsZWN0aW9uIGJ5IHRva2VuIGJvdW5kcyBidXQgb25seSBpZiBvcCAhPSAqIEVRCisgICAgICogQHBhcmFtIG9wICBUaGUgT3BlcmF0b3IgZGVmaW5pbmcgbWF0Y2hpbmcga2V5czogdGhlIG5lYXJlc3Qga2V5IHRvIHRoZSB0YXJnZXQgbWF0Y2hpbmcgdGhlIG9wZXJhdG9yIHdpbnMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFJvd0luZGV4RW50cnkgZ2V0Um93SW5kZXhFbnRyeShQYXJ0aXRpb25Qb3NpdGlvbiBrZXksIE9wZXJhdG9yIG9wKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldFJvd0luZGV4RW50cnkoa2V5LCBvcCwgdHJ1ZSwgU1NUYWJsZVJlYWRzTGlzdGVuZXIuTk9PUF9MSVNURU5FUik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGtleSAgICAgICAgIFRoZSBrZXkgdG8gYXBwbHkgYXMgdGhlIHJocyB0byB0aGUgZ2l2ZW4gT3BlcmF0b3IuIEEgJ2Zha2UnIGtleSBpcyBhbGxvd2VkIHRvCisgICAgICogICAgICAgICAgICAgICAgICAgIGFsbG93IGtleSBzZWxlY3Rpb24gYnkgdG9rZW4gYm91bmRzIGJ1dCBvbmx5IGlmIG9wICE9ICogRVEKKyAgICAgKiBAcGFyYW0gb3BlcmF0b3IgICAgVGhlIE9wZXJhdG9yIGRlZmluaW5nIG1hdGNoaW5nIGtleXM6IHRoZSBuZWFyZXN0IGtleSB0byB0aGUgdGFyZ2V0IG1hdGNoaW5nIHRoZSBvcGVyYXRvciB3aW5zLgorICAgICAqIEBwYXJhbSB1cGRhdGVTdGF0cyB0cnVlIGlmIHVwZGF0aW5nIHN0YXRzIGFuZCBjYWNoZQogICAgICAqIEByZXR1cm4gVGhlIGluZGV4IGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGtleSwgb3IgbnVsbCBpZiB0aGUga2V5IGlzIG5vdCBwcmVzZW50CiAgICAgICovCi0gICAgcHJvdGVjdGVkIFJvd0luZGV4RW50cnkgZ2V0UG9zaXRpb24oUGFydGl0aW9uUG9zaXRpb24ga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yIG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXBkYXRlQ2FjaGVBbmRTdGF0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHBlcm1pdE1hdGNoUGFzdExhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXIpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJvd0luZGV4RW50cnkgZ2V0Um93SW5kZXhFbnRyeShQYXJ0aXRpb25Qb3NpdGlvbiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRvciBvcGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXBkYXRlU3RhdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcikKICAgICB7CiAgICAgICAgIC8vIEhhdmluZyBubyBpbmRleCBmaWxlIGlzIGltcG9zc2libGUgaW4gYSBub3JtYWwgb3BlcmF0aW9uLiBUaGUgb25seSB3YXkgaXQgbWlnaHQgaGFwcGVuIGlzIHJ1bm5pbmcKLSAgICAgICAgLy8gU2NydWJiZXIgdGhhdCBkb2VzIG5vdCByZWFsbHkgcmVseSBvbnRvIHRoaXMgbWV0aG9kLgorICAgICAgICAvLyBTY3J1YmJlciB0aGF0IGRvZXMgbm90IHJlYWxseSByZWx5IG9uIHRoaXMgbWV0aG9kLgogICAgICAgICBpZiAoaWZpbGUgPT0gbnVsbCkKLSAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KIAotICAgICAgICBpZiAob3AgPT0gT3BlcmF0b3IuRVEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBrZXkgaW5zdGFuY2VvZiBEZWNvcmF0ZWRLZXk7IC8vIEVRIG9ubHkgbWFrZSBzZW5zZSBpZiB0aGUga2V5IGlzIGEgdmFsaWQgcm93IGtleQotICAgICAgICAgICAgaWYgKCFiZi5pc1ByZXNlbnQoKERlY29yYXRlZEtleSlrZXkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uU1NUYWJsZVNraXBwZWQodGhpcywgU2tpcHBpbmdSZWFzb24uQkxPT01fRklMVEVSKTsKLSAgICAgICAgICAgICAgICBUcmFjaW5nLnRyYWNlKCJCbG9vbSBmaWx0ZXIgYWxsb3dzIHNraXBwaW5nIHNzdGFibGUge30iLCBkZXNjcmlwdG9yLmlkKTsKLSAgICAgICAgICAgICAgICBibG9vbUZpbHRlclRyYWNrZXIuYWRkVHJ1ZU5lZ2F0aXZlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBuZXh0LCB0aGUga2V5IGNhY2hlIChvbmx5IG1ha2Ugc2Vuc2UgZm9yIHZhbGlkIHJvdyBrZXkpCi0gICAgICAgIGlmICgob3AgPT0gT3BlcmF0b3IuRVEgfHwgb3AgPT0gT3BlcmF0b3IuR0UpICYmIChrZXkgaW5zdGFuY2VvZiBEZWNvcmF0ZWRLZXkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBEZWNvcmF0ZWRLZXkgZGVjb3JhdGVkS2V5ID0gKERlY29yYXRlZEtleSkga2V5OwotICAgICAgICAgICAgUm93SW5kZXhFbnRyeSBjYWNoZWRQb3NpdGlvbiA9IGdldENhY2hlZFBvc2l0aW9uKGRlY29yYXRlZEtleSwgdXBkYXRlQ2FjaGVBbmRTdGF0cyk7Ci0gICAgICAgICAgICBpZiAoY2FjaGVkUG9zaXRpb24gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBkbyBub3QgbmVlZCB0byB0cmFjayAidHJ1ZSBwb3NpdGl2ZSIgZm9yIEJsb29tIEZpbHRlciBoZXJlIGJlY2F1c2UgaXQgaGFzIGJlZW4gYWxyZWFkeSB0cmFja2VkCi0gICAgICAgICAgICAgICAgLy8gaW5zaWRlIGdldENhY2hlZFBvc2l0aW9uIG1ldGhvZAotICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uU1NUYWJsZVNlbGVjdGVkKHRoaXMsIGNhY2hlZFBvc2l0aW9uLCBTZWxlY3Rpb25SZWFzb24uS0VZX0NBQ0hFX0hJVCk7Ci0gICAgICAgICAgICAgICAgVHJhY2luZy50cmFjZSgiS2V5IGNhY2hlIGhpdCBmb3Igc3N0YWJsZSB7fSIsIGRlc2NyaXB0b3IuaWQpOwotICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWRQb3NpdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBPcGVyYXRvciBzZWFyY2hPcCA9IG9wZXJhdG9yOwogCiAgICAgICAgIC8vIGNoZWNrIHRoZSBzbWFsbGVzdCBhbmQgZ3JlYXRlc3Qga2V5cyBpbiB0aGUgc3N0YWJsZSB0byBzZWUgaWYgaXQgY2FuJ3QgYmUgcHJlc2VudAogICAgICAgICBib29sZWFuIHNraXAgPSBmYWxzZTsKICAgICAgICAgaWYgKGtleS5jb21wYXJlVG8oZmlyc3QpIDwgMCkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKG9wID09IE9wZXJhdG9yLkVRKQorICAgICAgICAgICAgaWYgKHNlYXJjaE9wID09IE9wZXJhdG9yLkVRKQorICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHNraXAgPSB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGtleSA9IGZpcnN0OwotCi0gICAgICAgICAgICBvcCA9IE9wZXJhdG9yLkVROworICAgICAgICAgICAgICAgIHNlYXJjaE9wID0gT3BlcmF0b3IuR0U7IC8vIHNpbmNlIG9wICE9IEVRLCBibG9vbSBmaWx0ZXIgd2lsbCBiZSBza2lwcGVkOyBmaXJzdCBrZXkgaXMgaW5jbHVkZWQgc28gbm8gcmVhc29uIHRvIGNoZWNrIGJsb29tIGZpbHRlcgorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICAgaW50IGwgPSBsYXN0LmNvbXBhcmVUbyhrZXkpOwotICAgICAgICAgICAgLy8gbCA8PSAwICA9PiB3ZSBtYXkgYmUgbG9va2luZyBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpbGU7IHdlIHRoZW4gbmFycm93IG91ciBiZWhhdmlvdXIgdG86Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgICAxKSBza2lwcGluZyBpZiBzdHJpY3RseSBncmVhdGVyIGZvciBHRSBhbmQgRVE7Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgICAyKSBza2lwcGluZyBpZiBlcXVhbCBhbmQgc2VhcmNoaW5nIEdULCBhbmQgd2UgYXJlbid0IHBlcm1pdHRpbmcgbWF0Y2hpbmcgcGFzdCBsYXN0Ci0gICAgICAgICAgICBza2lwID0gbCA8PSAwICYmIChsIDwgMCB8fCAoIXBlcm1pdE1hdGNoUGFzdExhc3QgJiYgb3AgPT0gT3BlcmF0b3IuR1QpKTsKKyAgICAgICAgICAgIHNraXAgPSBsIDwgMCAvLyBvdXQgb2YgcmFuZ2UsIHNraXAKKyAgICAgICAgICAgICAgICAgICB8fCBsID09IDAgJiYgc2VhcmNoT3AgPT0gT3BlcmF0b3IuR1Q7IC8vIHNlYXJjaCBlbnRyeSA+IGtleSwgYnV0IGtleSBpcyB0aGUgbGFzdCBpbiByYW5nZSwgc28gc2tpcAorICAgICAgICAgICAgaWYgKGwgPT0gMCkKKyAgICAgICAgICAgICAgICBzZWFyY2hPcCA9IE9wZXJhdG9yLkdFOyAvLyBzaW5jZSBvcCAhPSBFUSwgYmxvb20gZmlsdGVyIHdpbGwgYmUgc2tpcHBlZCwgbGFzdCBrZXkgaXMgaW5jbHVkZWQgc28gbm8gcmVhc29uIHRvIGNoZWNrIGJsb29tIGZpbHRlcgogICAgICAgICB9CiAgICAgICAgIGlmIChza2lwKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAob3AgPT0gT3BlcmF0b3IuRVEgJiYgdXBkYXRlQ2FjaGVBbmRTdGF0cykKLSAgICAgICAgICAgICAgICBibG9vbUZpbHRlclRyYWNrZXIuYWRkRmFsc2VQb3NpdGl2ZSgpOwotICAgICAgICAgICAgbGlzdGVuZXIub25TU1RhYmxlU2tpcHBlZCh0aGlzLCBTa2lwcGluZ1JlYXNvbi5NSU5fTUFYX0tFWVMpOwotICAgICAgICAgICAgVHJhY2luZy50cmFjZSgiQ2hlY2sgYWdhaW5zdCBtaW4gYW5kIG1heCBrZXlzIGFsbG93cyBza2lwcGluZyBzc3RhYmxlIHt9IiwgZGVzY3JpcHRvci5pZCk7CisgICAgICAgICAgICBub3RpZnlTa2lwcGVkKFNraXBwaW5nUmVhc29uLk1JTl9NQVhfS0VZUywgbGlzdGVuZXIsIG9wZXJhdG9yLCB1cGRhdGVTdGF0cyk7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogCisgICAgICAgIGlmIChzZWFyY2hPcCA9PSBPcGVyYXRvci5FUSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IGtleSBpbnN0YW5jZW9mIERlY29yYXRlZEtleTsgLy8gRVEgb25seSBtYWtlIHNlbnNlIGlmIHRoZSBrZXkgaXMgYSB2YWxpZCByb3cga2V5CisgICAgICAgICAgICBpZiAoIWlzUHJlc2VudEluRmlsdGVyKChJRmlsdGVyLkZpbHRlcktleSkga2V5KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBub3RpZnlTa2lwcGVkKFNraXBwaW5nUmVhc29uLkJMT09NX0ZJTFRFUiwgbGlzdGVuZXIsIG9wZXJhdG9yLCB1cGRhdGVTdGF0cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBuZXh0LCB0aGUga2V5IGNhY2hlIChvbmx5IG1ha2Ugc2Vuc2UgZm9yIHZhbGlkIHJvdyBrZXkpCisgICAgICAgIGlmICgoc2VhcmNoT3AgPT0gT3BlcmF0b3IuRVEgfHwgc2VhcmNoT3AgPT0gT3BlcmF0b3IuR0UpICYmIChrZXkgaW5zdGFuY2VvZiBEZWNvcmF0ZWRLZXkpKQorICAgICAgICB7CisgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgZGVjb3JhdGVkS2V5ID0gKERlY29yYXRlZEtleSkga2V5OworICAgICAgICAgICAgQWJzdHJhY3RSb3dJbmRleEVudHJ5IGNhY2hlZFBvc2l0aW9uID0gZ2V0Q2FjaGVkUG9zaXRpb24oZGVjb3JhdGVkS2V5LCB1cGRhdGVTdGF0cyk7CisgICAgICAgICAgICBpZiAoY2FjaGVkUG9zaXRpb24gIT0gbnVsbCAmJiBjYWNoZWRQb3NpdGlvbi5nZXRTU1RhYmxlRm9ybWF0KCkgPT0gZGVzY3JpcHRvci5nZXRGb3JtYXQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBub3RpZnlTZWxlY3RlZChTZWxlY3Rpb25SZWFzb24uS0VZX0NBQ0hFX0hJVCwgbGlzdGVuZXIsIG9wZXJhdG9yLCB1cGRhdGVTdGF0cywgY2FjaGVkUG9zaXRpb24pOworICAgICAgICAgICAgICAgIHJldHVybiAoUm93SW5kZXhFbnRyeSkgY2FjaGVkUG9zaXRpb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBpbnQgYmluYXJ5U2VhcmNoUmVzdWx0ID0gaW5kZXhTdW1tYXJ5LmJpbmFyeVNlYXJjaChrZXkpOwotICAgICAgICBsb25nIHNhbXBsZWRQb3NpdGlvbiA9IGdldEluZGV4U2NhblBvc2l0aW9uRnJvbUJpbmFyeVNlYXJjaFJlc3VsdChiaW5hcnlTZWFyY2hSZXN1bHQsIGluZGV4U3VtbWFyeSk7Ci0gICAgICAgIGludCBzYW1wbGVkSW5kZXggPSBnZXRJbmRleFN1bW1hcnlJbmRleEZyb21CaW5hcnlTZWFyY2hSZXN1bHQoYmluYXJ5U2VhcmNoUmVzdWx0KTsKKyAgICAgICAgbG9uZyBzYW1wbGVkUG9zaXRpb24gPSBpbmRleFN1bW1hcnkuZ2V0U2NhblBvc2l0aW9uRnJvbUJpbmFyeVNlYXJjaFJlc3VsdChiaW5hcnlTZWFyY2hSZXN1bHQpOworICAgICAgICBpbnQgc2FtcGxlZEluZGV4ID0gSW5kZXhTdW1tYXJ5LmdldEluZGV4RnJvbUJpbmFyeVNlYXJjaFJlc3VsdChiaW5hcnlTZWFyY2hSZXN1bHQpOwogCiAgICAgICAgIGludCBlZmZlY3RpdmVJbnRlcnZhbCA9IGluZGV4U3VtbWFyeS5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsQWZ0ZXJJbmRleChzYW1wbGVkSW5kZXgpOwogCiAgICAgICAgIC8vIHNjYW4gdGhlIG9uLWRpc2sgaW5kZXgsIHN0YXJ0aW5nIGF0IHRoZSBuZWFyZXN0IHNhbXBsZWQgcG9zaXRpb24uCi0gICAgICAgIC8vIFRoZSBjaGVjayBhZ2FpbnN0IEluZGV4SW50ZXJ2YWwgaXMgdG8gYmUgZXhpdCB0aGUgbG9vcCBpbiB0aGUgRVEgY2FzZSB3aGVuIHRoZSBrZXkgbG9va2VkIGZvciBpcyBub3QgcHJlc2VudAorICAgICAgICAvLyBUaGUgY2hlY2sgYWdhaW5zdCBJbmRleEludGVydmFsIGlzIHRvIGJlIGV4aXRlZCB0aGUgbG9vcCBpbiB0aGUgRVEgY2FzZSB3aGVuIHRoZSBrZXkgbG9va2VkIGZvciBpcyBub3QgcHJlc2VudAogICAgICAgICAvLyAoYmxvb20gZmlsdGVyIGZhbHNlIHBvc2l0aXZlKS4gQnV0IG5vdGUgdGhhdCBmb3Igbm9uLUVRIGNhc2VzLCB3ZSBtaWdodCBuZWVkIHRvIGNoZWNrIHRoZSBmaXJzdCBrZXkgb2YgdGhlCiAgICAgICAgIC8vIG5leHQgaW5kZXggcG9zaXRpb24gYmVjYXVzZSB0aGUgc2VhcmNoZWQga2V5IGNhbiBiZSBncmVhdGVyIHRoZSBsYXN0IGtleSBvZiB0aGUgaW5kZXggaW50ZXJ2YWwgY2hlY2tlZCBpZiBpdAogICAgICAgICAvLyBpcyBsZXNzZXIgdGhhbiB0aGUgZmlyc3Qga2V5IG9mIG5leHQgaW50ZXJ2YWwgKGFuZCBpbiB0aGF0IGNhc2Ugd2UgbXVzdCByZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBrZXkKQEAgLTIyOCw3ICszMzgsNyBAQAogICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhhY3RNYXRjaDsgLy8gaXMgdGhlIGN1cnJlbnQgcG9zaXRpb24gYW4gZXhhY3QgbWF0Y2ggZm9yIHRoZSBrZXksIHN1aXRhYmxlIGZvciBjYWNoaW5nCiAKICAgICAgICAgICAgICAgICAvLyBDb21wYXJlIHJhdyBrZXlzIGlmIHBvc3NpYmxlIGZvciBwZXJmb3JtYW5jZSwgb3RoZXJ3aXNlIGNvbXBhcmUgZGVjb3JhdGVkIGtleXMuCi0gICAgICAgICAgICAgICAgaWYgKG9wID09IE9wZXJhdG9yLkVRICYmIGkgPD0gZWZmZWN0aXZlSW50ZXJ2YWwpCisgICAgICAgICAgICAgICAgaWYgKHNlYXJjaE9wID09IE9wZXJhdG9yLkVRICYmIGkgPD0gZWZmZWN0aXZlSW50ZXJ2YWwpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBvcFNhdGlzZmllZCA9IGV4YWN0TWF0Y2ggPSBpbmRleEtleS5lcXVhbHMoKChEZWNvcmF0ZWRLZXkpIGtleSkuZ2V0S2V5KCkpOwogICAgICAgICAgICAgICAgIH0KQEAgLTIzNiwxNSArMzQ2LDEyIEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgaW5kZXhEZWNvcmF0ZWRLZXkgPSBkZWNvcmF0ZUtleShpbmRleEtleSk7CiAgICAgICAgICAgICAgICAgICAgIGludCBjb21wYXJpc29uID0gaW5kZXhEZWNvcmF0ZWRLZXkuY29tcGFyZVRvKGtleSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCB2ID0gb3AuYXBwbHkoY29tcGFyaXNvbik7CisgICAgICAgICAgICAgICAgICAgIGludCB2ID0gc2VhcmNoT3AuYXBwbHkoY29tcGFyaXNvbik7CiAgICAgICAgICAgICAgICAgICAgIG9wU2F0aXNmaWVkID0gKHYgPT0gMCk7CiAgICAgICAgICAgICAgICAgICAgIGV4YWN0TWF0Y2ggPSAoY29tcGFyaXNvbiA9PSAwKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPCAwKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPT0gU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSAmJiB1cGRhdGVDYWNoZUFuZFN0YXRzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29tRmlsdGVyVHJhY2tlci5hZGRGYWxzZVBvc2l0aXZlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vblNTVGFibGVTa2lwcGVkKHRoaXMsIFNraXBwaW5nUmVhc29uLlBBUlRJVElPTl9JTkRFWF9MT09LVVApOwotICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2luZy50cmFjZSgiUGFydGl0aW9uIGluZGV4IGxvb2t1cCBhbGxvd3Mgc2tpcHBpbmcgc3N0YWJsZSB7fSIsIGRlc2NyaXB0b3IuaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5U2tpcHBlZChTa2lwcGluZ1JlYXNvbi5QQVJUSVRJT05fSU5ERVhfTE9PS1VQLCBsaXN0ZW5lciwgb3BlcmF0b3IsIHVwZGF0ZVN0YXRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtMjUzLDEwICszNjAsMTAgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWQgZGF0YSBwb3NpdGlvbiBmcm9tIGluZGV4IGVudHJ5CiAgICAgICAgICAgICAgICAgICAgIFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSA9IHJvd0luZGV4RW50cnlTZXJpYWxpemVyLmRlc2VyaWFsaXplKGluKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4YWN0TWF0Y2ggJiYgdXBkYXRlQ2FjaGVBbmRTdGF0cykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4YWN0TWF0Y2ggJiYgdXBkYXRlU3RhdHMpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBrZXkgaW5zdGFuY2VvZiBEZWNvcmF0ZWRLZXk7IC8vIGtleSBjYW4gYmUgPT0gdG8gdGhlIGluZGV4IGtleSBvbmx5IGlmIGl0J3MgYSB0cnVlIHJvdyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBkZWNvcmF0ZWRLZXkgPSAoRGVjb3JhdGVkS2V5KWtleTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBkZWNvcmF0ZWRLZXkgPSAoRGVjb3JhdGVkS2V5KSBrZXk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKQEAgLTI3MiwxMCArMzc5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlIGV4YWN0IG1hdGNoIGZvciB0aGUga2V5CiAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZUtleShkZWNvcmF0ZWRLZXksIGluZGV4RW50cnkpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvcCA9PSBPcGVyYXRvci5FUSAmJiB1cGRhdGVDYWNoZUFuZFN0YXRzKQotICAgICAgICAgICAgICAgICAgICAgICAgYmxvb21GaWx0ZXJUcmFja2VyLmFkZFRydWVQb3NpdGl2ZSgpOwotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vblNTVGFibGVTZWxlY3RlZCh0aGlzLCBpbmRleEVudHJ5LCBTZWxlY3Rpb25SZWFzb24uSU5ERVhfRU5UUllfRk9VTkQpOwotICAgICAgICAgICAgICAgICAgICBUcmFjaW5nLnRyYWNlKCJQYXJ0aXRpb24gaW5kZXggd2l0aCB7fSBlbnRyaWVzIGZvdW5kIGZvciBzc3RhYmxlIHt9IiwgaW5kZXhFbnRyeS5jb2x1bW5zSW5kZXhDb3VudCgpLCBkZXNjcmlwdG9yLmlkKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5U2VsZWN0ZWQoU2VsZWN0aW9uUmVhc29uLklOREVYX0VOVFJZX0ZPVU5ELCBsaXN0ZW5lciwgb3BlcmF0b3IsIHVwZGF0ZVN0YXRzLCBpbmRleEVudHJ5KTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4RW50cnk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0yODgsMTIgKzM5MiwzNTQgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihlLCBwYXRoKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChvcCA9PSBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRICYmIHVwZGF0ZUNhY2hlQW5kU3RhdHMpCi0gICAgICAgICAgICBibG9vbUZpbHRlclRyYWNrZXIuYWRkRmFsc2VQb3NpdGl2ZSgpOwotICAgICAgICBsaXN0ZW5lci5vblNTVGFibGVTa2lwcGVkKHRoaXMsIFNraXBwaW5nUmVhc29uLklOREVYX0VOVFJZX05PVF9GT1VORCk7Ci0gICAgICAgIFRyYWNpbmcudHJhY2UoIlBhcnRpdGlvbiBpbmRleCBsb29rdXAgY29tcGxldGUgKGJsb29tIGZpbHRlciBmYWxzZSBwb3NpdGl2ZSkgZm9yIHNzdGFibGUge30iLCBkZXNjcmlwdG9yLmlkKTsKKyAgICAgICAgbm90aWZ5U2tpcHBlZChTa2lwcGluZ1JlYXNvbi5JTkRFWF9FTlRSWV9OT1RfRk9VTkQsIGxpc3RlbmVyLCBvcGVyYXRvciwgdXBkYXRlU3RhdHMpOwogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ga2V5ICAgICAgICAgICAgICAgICBUaGUga2V5IHRvIGFwcGx5IGFzIHRoZSByaHMgdG8gdGhlIGdpdmVuIE9wZXJhdG9yLiBBICdmYWtlJyBrZXkgaXMgYWxsb3dlZCB0bworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93IGtleSBzZWxlY3Rpb24gYnkgdG9rZW4gYm91bmRzIGJ1dCBvbmx5IGlmIG9wICE9ICogRVEKKyAgICAgKiBAcGFyYW0gb3AgICAgICAgICAgICAgICAgICBUaGUgT3BlcmF0b3IgZGVmaW5pbmcgbWF0Y2hpbmcga2V5czogdGhlIG5lYXJlc3Qga2V5IHRvIHRoZSB0YXJnZXQgbWF0Y2hpbmcgdGhlIG9wZXJhdG9yIHdpbnMuCisgICAgICogQHBhcmFtIHVwZGF0ZUNhY2hlQW5kU3RhdHMgdHJ1ZSBpZiB1cGRhdGluZyBzdGF0cyBhbmQgY2FjaGUKKyAgICAgKiBAcmV0dXJuIFRoZSBpbmRleCBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBrZXksIG9yIG51bGwgaWYgdGhlIGtleSBpcyBub3QgcHJlc2VudAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBsb25nIGdldFBvc2l0aW9uKFBhcnRpdGlvblBvc2l0aW9uIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRvciBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVwZGF0ZUNhY2hlQW5kU3RhdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXIpCisgICAgeworICAgICAgICBSb3dJbmRleEVudHJ5IHJvd0luZGV4RW50cnkgPSBnZXRSb3dJbmRleEVudHJ5KGtleSwgb3AsIHVwZGF0ZUNhY2hlQW5kU3RhdHMsIGxpc3RlbmVyKTsKKyAgICAgICAgcmV0dXJuIHJvd0luZGV4RW50cnkgIT0gbnVsbCA/IHJvd0luZGV4RW50cnkucG9zaXRpb24gOiAtMTsKKyAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRGVjb3JhdGVkS2V5IGtleUF0UG9zaXRpb25Gcm9tU2Vjb25kYXJ5SW5kZXgobG9uZyBrZXlQb3NpdGlvbkZyb21TZWNvbmRhcnlJbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBEZWNvcmF0ZWRLZXkga2V5OworICAgICAgICB0cnkgKEZpbGVEYXRhSW5wdXQgaW4gPSBpZmlsZS5jcmVhdGVSZWFkZXIoa2V5UG9zaXRpb25Gcm9tU2Vjb25kYXJ5SW5kZXgpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW4uaXNFT0YoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAga2V5ID0gZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChpbikpOworCisgICAgICAgICAgICAvLyBoaW50IHJlYWQgcGF0aCBhYm91dCBrZXkgbG9jYXRpb24gaWYgY2FjaGluZyBpcyBlbmFibGVkCisgICAgICAgICAgICAvLyB0aGlzIHNhdmVzIGluZGV4IHN1bW1hcnkgbG9va3VwIGFuZCBpbmRleCBmaWxlIGl0ZXJhdGlvbiB3aGljaCB3aG91bGQgYmUgcHJldHR5IGNvc3RseQorICAgICAgICAgICAgLy8gZXNwZWNpYWxseSBpbiBwcmVzZW5jZSBvZiBwcm9tb3RlZCBjb2x1bW4gaW5kZXhlcworICAgICAgICAgICAgY2FjaGVLZXkoa2V5LCByb3dJbmRleEVudHJ5U2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUm93SW5kZXhFbnRyeSBkZXNlcmlhbGl6ZUtleUNhY2hlVmFsdWUoRGF0YUlucHV0UGx1cyBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIuZGVzZXJpYWxpemVGb3JDYWNoZShpbnB1dCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsdXN0ZXJpbmdCb3VuZDw/PiBnZXRMb3dlckJvdW5kUHJlZml4RnJvbUNhY2hlKERlY29yYXRlZEtleSBwYXJ0aXRpb25LZXksIGJvb2xlYW4gaXNSZXZlcnNlZCkKKyAgICB7CisgICAgICAgIEFic3RyYWN0Um93SW5kZXhFbnRyeSByaWUgPSBnZXRDYWNoZWRQb3NpdGlvbihwYXJ0aXRpb25LZXksIGZhbHNlKTsKKyAgICAgICAgaWYgKCEocmllIGluc3RhbmNlb2YgUm93SW5kZXhFbnRyeSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBSb3dJbmRleEVudHJ5IHJvd0luZGV4RW50cnkgPSAoUm93SW5kZXhFbnRyeSkgcmllOworICAgICAgICBpZiAoIXJvd0luZGV4RW50cnkuaW5kZXhPbkhlYXAoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHRyeSAoUm93SW5kZXhFbnRyeS5JbmRleEluZm9SZXRyaWV2ZXIgb25IZWFwUmV0cmlldmVyID0gcm93SW5kZXhFbnRyeS5vcGVuV2l0aEluZGV4KG51bGwpKQorICAgICAgICB7CisgICAgICAgICAgICBJbmRleEluZm8gY29sdW1ucyA9IG9uSGVhcFJldHJpZXZlci5jb2x1bW5zSW5kZXgoaXNSZXZlcnNlZCA/IHJvd0luZGV4RW50cnkuYmxvY2tDb3VudCgpIC0gMSA6IDApOworICAgICAgICAgICAgQ2x1c3RlcmluZ0JvdW5kPD8+IGJvdW5kID0gaXNSZXZlcnNlZCA/IGNvbHVtbnMubGFzdE5hbWUuYXNFbmRCb3VuZCgpIDogY29sdW1ucy5maXJzdE5hbWUuYXNTdGFydEJvdW5kKCk7CisgICAgICAgICAgICBVbmZpbHRlcmVkUm93SXRlcmF0b3JXaXRoTG93ZXJCb3VuZC5hc3NlcnRCb3VuZFNpemUoYm91bmQsIHRoaXMpOworICAgICAgICAgICAgcmV0dXJuIGJvdW5kLmFydGlmaWNpYWxMb3dlckJvdW5kKGlzUmV2ZXJzZWQpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigic2hvdWxkIG5ldmVyIG9jY3VyIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIEFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2Yga2V5cyBpbiB0aGlzIFNTVGFibGUgYmFzZWQgb24gdGhlIGluZGV4IHN1bW1hcnkuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZXN0aW1hdGVkS2V5cygpCisgICAgeworICAgICAgICByZXR1cm4gaW5kZXhTdW1tYXJ5LmdldEVzdGltYXRlZEtleUNvdW50KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBBbiBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mIGtleXMgZm9yIGdpdmVuIHJhbmdlcyBpbiB0aGlzIFNTVGFibGUuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZXN0aW1hdGVkS2V5c0ZvclJhbmdlcyhDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4gcmFuZ2VzKQorICAgIHsKKyAgICAgICAgbG9uZyBzYW1wbGVLZXlDb3VudCA9IDA7CisgICAgICAgIExpc3Q8SW5kZXhlc0JvdW5kcz4gc2FtcGxlSW5kZXhlcyA9IGluZGV4U3VtbWFyeS5nZXRTYW1wbGVJbmRleGVzRm9yUmFuZ2VzKHJhbmdlcyk7CisgICAgICAgIGZvciAoSW5kZXhlc0JvdW5kcyBzYW1wbGVJbmRleFJhbmdlIDogc2FtcGxlSW5kZXhlcykKKyAgICAgICAgICAgIHNhbXBsZUtleUNvdW50ICs9IChzYW1wbGVJbmRleFJhbmdlLnVwcGVyUG9zaXRpb24gLSBzYW1wbGVJbmRleFJhbmdlLmxvd2VyUG9zaXRpb24gKyAxKTsKKworICAgICAgICAvLyBhZGp1c3QgZm9yIHRoZSBjdXJyZW50IHNhbXBsaW5nIGxldmVsOiAoQlNMIC8gU0wpICogaW5kZXhfaW50ZXJ2YWxfYXRfZnVsbF9zYW1wbGluZworICAgICAgICBsb25nIGVzdGltYXRlZEtleXMgPSBzYW1wbGVLZXlDb3VudCAqICgobG9uZykgRG93bnNhbXBsaW5nLkJBU0VfU0FNUExJTkdfTEVWRUwgKiBpbmRleFN1bW1hcnkuZ2V0TWluSW5kZXhJbnRlcnZhbCgpKSAvIGluZGV4U3VtbWFyeS5nZXRTYW1wbGluZ0xldmVsKCk7CisgICAgICAgIHJldHVybiBNYXRoLm1heCgxLCBlc3RpbWF0ZWRLZXlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBJbmRleFN1bW1hcnkgPiAyLiAgQXQgZnVsbCBzYW1wbGluZywgdGhpcyBpcyBhcHByb3hpbWF0ZWx5CisgICAgICogMS9JTkRFWF9JTlRFUlZBTHRoIG9mIHRoZSBrZXlzIGluIHRoaXMgU1NUYWJsZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VzdGltYXRpb25JbmZvcm1hdGl2ZSgpCisgICAgeworICAgICAgICByZXR1cm4gaW5kZXhTdW1tYXJ5LnNpemUoKSA+IDI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEl0ZXJhYmxlPERlY29yYXRlZEtleT4gZ2V0S2V5U2FtcGxlcyhmaW5hbCBSYW5nZTxUb2tlbj4gcmFuZ2UpCisgICAgeworICAgICAgICByZXR1cm4gSXRlcmFibGVzLnRyYW5zZm9ybShpbmRleFN1bW1hcnkuZ2V0S2V5U2FtcGxlcyhyYW5nZSksIGJ5dGVzIC0+IGRlY29yYXRlS2V5KEJ5dGVCdWZmZXIud3JhcChieXRlcykpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmFuZG9tQWNjZXNzUmVhZGVyIG9wZW5JbmRleFJlYWRlcigpCisgICAgeworICAgICAgICBpZiAoaWZpbGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBpZmlsZS5jcmVhdGVSZWFkZXIoKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIEZpbGVIYW5kbGUgZ2V0SW5kZXhGaWxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpZmlsZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVZlcmlmaWVyIGdldFZlcmlmaWVyKENvbHVtbkZhbWlseVN0b3JlIGNmcywgT3V0cHV0SGFuZGxlciBvdXRwdXRIYW5kbGVyLCBib29sZWFuIGlzT2ZmbGluZSwgSVZlcmlmaWVyLk9wdGlvbnMgb3B0aW9ucykKKyAgICB7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudChjZnMubWV0YWRhdGEoKS5lcXVhbHMobWV0YWRhdGEoKSkpOworICAgICAgICByZXR1cm4gbmV3IEJpZ1RhYmxlVmVyaWZpZXIoY2ZzLCB0aGlzLCBvdXRwdXRIYW5kbGVyLCBpc09mZmxpbmUsIG9wdGlvbnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHBvc2l0aW9uIHdpdGggdGhlIGluZGV4IGZpbGUgdG8gc3RhcnQgc2Nhbm5pbmcgdG8gZmluZCB0aGUgZ2l2ZW4ga2V5IChhdCBtb3N0IGluZGV4SW50ZXJ2YWwga2V5cyBhd2F5LAorICAgICAqIG1vZHVsbyBkb3duc2FtcGxpbmcgb2YgdGhlIGluZGV4IHN1bW1hcnkpLiBBbHdheXMgcmV0dXJucyBhIHtAY29kZSB2YWx1ZSA+PSAwfQorICAgICAqLworICAgIGxvbmcgZ2V0SW5kZXhTY2FuUG9zaXRpb24oUGFydGl0aW9uUG9zaXRpb24ga2V5KQorICAgIHsKKyAgICAgICAgaWYgKG9wZW5SZWFzb24gPT0gT3BlblJlYXNvbi5NT1ZFRF9TVEFSVCAmJiBrZXkuY29tcGFyZVRvKGZpcnN0KSA8IDApCisgICAgICAgICAgICBrZXkgPSBmaXJzdDsKKworICAgICAgICByZXR1cm4gaW5kZXhTdW1tYXJ5LmdldFNjYW5Qb3NpdGlvbihrZXkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBCdWlsZGVyIHVuYnVpbGRUbyhCdWlsZGVyIGJ1aWxkZXIsIGJvb2xlYW4gc2hhcmVkQ29weSkKKyAgICB7CisgICAgICAgIEJ1aWxkZXIgYiA9IHN1cGVyLnVuYnVpbGRUbyhidWlsZGVyLCBzaGFyZWRDb3B5KTsKKyAgICAgICAgaWYgKGJ1aWxkZXIuZ2V0SW5kZXhGaWxlKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIGIuc2V0SW5kZXhGaWxlKHNoYXJlZENvcHkgPyBzaGFyZWRDb3B5T3JOdWxsKGlmaWxlKSA6IGlmaWxlKTsKKyAgICAgICAgaWYgKGJ1aWxkZXIuZ2V0SW5kZXhTdW1tYXJ5KCkgPT0gbnVsbCkKKyAgICAgICAgICAgIGIuc2V0SW5kZXhTdW1tYXJ5KHNoYXJlZENvcHkgPyBzaGFyZWRDb3B5T3JOdWxsKGluZGV4U3VtbWFyeSkgOiBpbmRleFN1bW1hcnkpOworCisgICAgICAgIGIuc2V0S2V5Q2FjaGUoa2V5Q2FjaGUpOworCisgICAgICAgIHJldHVybiBiOworICAgIH0KKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyV2l0aEZpbHRlciBjbG9uZUFuZFJlcGxhY2UoSUZpbHRlciBmaWx0ZXIpCisgICAgeworICAgICAgICByZXR1cm4gdW5idWlsZFRvKG5ldyBCdWlsZGVyKGRlc2NyaXB0b3IpLnNldEZpbHRlcihmaWx0ZXIpLCB0cnVlKS5idWlsZChvd25lcigpLm9yRWxzZShudWxsKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvbmUgdGhpcyByZWFkZXIgd2l0aCB0aGUgcHJvdmlkZWQgc3RhcnQgYW5kIG9wZW4gcmVhc29uLCBhbmQgc2V0IHRoZSBjbG9uZSBhcyByZXBsYWNlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXdGaXJzdCB0aGUgZmlyc3Qga2V5IGZvciB0aGUgcmVwbGFjZW1lbnQgKHdoaWNoIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgZHVlIHRvIHRoZSBwcmUtZW1wdGl2ZQorICAgICAqICAgICAgICAgICAgICAgICBvcGVuaW5nIG9mIGNvbXBhY3Rpb24gcmVzdWx0cykuCisgICAgICogQHBhcmFtIHJlYXNvbiAgIHRoZSB7QGNvZGUgT3BlblJlYXNvbn0gZm9yIHRoZSByZXBsYWNlbWVudC4KKyAgICAgKiBAcmV0dXJuIHRoZSBjbG9uZWQgcmVhZGVyLiBUaGF0IHJlYWRlciBpcyBzZXQgYXMgYSByZXBsYWNlbWVudCBieSB0aGUgbWV0aG9kLgorICAgICAqLworICAgIHByaXZhdGUgU1NUYWJsZVJlYWRlciBjbG9uZUFuZFJlcGxhY2UoRGVjb3JhdGVkS2V5IG5ld0ZpcnN0LCBPcGVuUmVhc29uIHJlYXNvbikKKyAgICB7CisgICAgICAgIHJldHVybiB1bmJ1aWxkVG8obmV3IEJ1aWxkZXIoZGVzY3JpcHRvciksIHRydWUpCisgICAgICAgICAgICAgICAuc2V0Rmlyc3QobmV3Rmlyc3QpCisgICAgICAgICAgICAgICAuc2V0T3BlblJlYXNvbihyZWFzb24pCisgICAgICAgICAgICAgICAuYnVpbGQob3duZXIoKS5vckVsc2UobnVsbCksIHRydWUsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb25lIHRoaXMgcmVhZGVyIHdpdGggdGhlIG5ldyB2YWx1ZXMgYW5kIHNldCB0aGUgY2xvbmUgYXMgcmVwbGFjZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV3Rmlyc3QgICB0aGUgZmlyc3Qga2V5IGZvciB0aGUgcmVwbGFjZW1lbnQgKHdoaWNoIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgZHVlIHRvIHRoZSBwcmUtZW1wdGl2ZQorICAgICAqICAgICAgICAgICAgICAgICAgIG9wZW5pbmcgb2YgY29tcGFjdGlvbiByZXN1bHRzKS4KKyAgICAgKiBAcGFyYW0gcmVhc29uICAgICB0aGUge0Bjb2RlIE9wZW5SZWFzb259IGZvciB0aGUgcmVwbGFjZW1lbnQuCisgICAgICogQHBhcmFtIG5ld1N1bW1hcnkgdGhlIGluZGV4IHN1bW1hcnkgZm9yIHRoZSByZXBsYWNlbWVudC4KKyAgICAgKiBAcmV0dXJuIHRoZSBjbG9uZWQgcmVhZGVyLiBUaGF0IHJlYWRlciBpcyBzZXQgYXMgYSByZXBsYWNlbWVudCBieSB0aGUgbWV0aG9kLgorICAgICAqLworICAgIHByaXZhdGUgQmlnVGFibGVSZWFkZXIgY2xvbmVBbmRSZXBsYWNlKERlY29yYXRlZEtleSBuZXdGaXJzdCwgT3BlblJlYXNvbiByZWFzb24sIEluZGV4U3VtbWFyeSBuZXdTdW1tYXJ5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVuYnVpbGRUbyhuZXcgQnVpbGRlcihkZXNjcmlwdG9yKS5zZXRJbmRleFN1bW1hcnkobmV3U3VtbWFyeSksIHRydWUpCisgICAgICAgICAgICAgICAgICAgIC5zZXRJbmRleFN1bW1hcnkobmV3U3VtbWFyeSkKKyAgICAgICAgICAgICAgICAgICAgLnNldEZpcnN0KG5ld0ZpcnN0KQorICAgICAgICAgICAgICAgICAgICAuc2V0T3BlblJlYXNvbihyZWFzb24pCisgICAgICAgICAgICAgICAgICAgIC5idWlsZChvd25lcigpLm9yRWxzZShudWxsKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIFNTVGFibGVSZWFkZXIgY2xvbmVXaXRoUmVzdG9yZWRTdGFydChEZWNvcmF0ZWRLZXkgcmVzdG9yZWRTdGFydCkKKyAgICB7CisgICAgICAgIHJldHVybiBydW5XaXRoTG9jayhpZ25vcmVkIC0+IGNsb25lQW5kUmVwbGFjZShyZXN0b3JlZFN0YXJ0LCBPcGVuUmVhc29uLk5PUk1BTCkpOworICAgIH0KKworICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyIGNsb25lV2l0aE5ld1N0YXJ0KERlY29yYXRlZEtleSBuZXdTdGFydCkKKyAgICB7CisgICAgICAgIHJldHVybiBydW5XaXRoTG9jayhpZ25vcmVkIC0+IHsKKyAgICAgICAgICAgIGFzc2VydCBvcGVuUmVhc29uICE9IE9wZW5SZWFzb24uRUFSTFk7CisgICAgICAgICAgICAvLyBUT0RPOiBtZXJnZSB3aXRoIGNhbGxlcidzIGZpcnN0S2V5QmV5b25kKCkgd29yayx0byBzYXZlIHRpbWUKKyAgICAgICAgICAgIGlmIChuZXdTdGFydC5jb21wYXJlVG8oZmlyc3QpID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNYXA8RmlsZUhhbmRsZSwgTG9uZz4gaGFuZGxlQW5kUG9zaXRpb25zID0gbmV3IExpbmtlZEhhc2hNYXA8PigyKTsKKyAgICAgICAgICAgICAgICBpZiAoZGZpbGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlQW5kUG9zaXRpb25zLnB1dChkZmlsZSwgZ2V0UG9zaXRpb24obmV3U3RhcnQsIE9wZXJhdG9yLkVRKSk7CisgICAgICAgICAgICAgICAgaWYgKGlmaWxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUFuZFBvc2l0aW9ucy5wdXQoaWZpbGUsIGdldEluZGV4U2NhblBvc2l0aW9uKG5ld1N0YXJ0KSk7CisgICAgICAgICAgICAgICAgcnVuT25DbG9zZSgoKSAtPiBoYW5kbGVBbmRQb3NpdGlvbnMuZm9yRWFjaChGaWxlSGFuZGxlOjpkcm9wUGFnZUNhY2hlKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBjbG9uZUFuZFJlcGxhY2UobmV3U3RhcnQsIE9wZW5SZWFzb24uTU9WRURfU1RBUlQpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IFNTVGFibGVSZWFkZXIgd2l0aCB0aGUgc2FtZSBwcm9wZXJ0aWVzIGFzIHRoaXMgU1NUYWJsZVJlYWRlciBleGNlcHQgdGhhdCBhIG5ldyBJbmRleFN1bW1hcnkgd2lsbAorICAgICAqIGJlIGJ1aWx0IGF0IHRoZSB0YXJnZXQgc2FtcGxpbmdMZXZlbC4gIFRoaXMgKG9yaWdpbmFsKSBTU1RhYmxlUmVhZGVyIGluc3RhbmNlIHdpbGwgYmUgbWFya2VkIGFzIHJlcGxhY2VkLCBoYXZlCisgICAgICogaXRzIERlbGV0aW5nVGFzayByZW1vdmVkLCBhbmQgaGF2ZSBpdHMgcGVyaW9kaWMgcmVhZC1tZXRlciBzeW5jIHRhc2sgY2FuY2VsbGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHNhbXBsaW5nTGV2ZWwgdGhlIGRlc2lyZWQgc2FtcGxpbmcgbGV2ZWwgZm9yIHRoZSBpbmRleCBzdW1tYXJ5IG9uIHRoZSBuZXcgU1NUYWJsZVJlYWRlcgorICAgICAqIEByZXR1cm4gYSBuZXcgU1NUYWJsZVJlYWRlcgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCisgICAgcHVibGljIEJpZ1RhYmxlUmVhZGVyIGNsb25lV2l0aE5ld1N1bW1hcnlTYW1wbGluZ0xldmVsKENvbHVtbkZhbWlseVN0b3JlIHBhcmVudCwgaW50IHNhbXBsaW5nTGV2ZWwpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgYXNzZXJ0IG9wZW5SZWFzb24gIT0gT3BlblJlYXNvbi5FQVJMWTsKKworICAgICAgICBpbnQgbWluSW5kZXhJbnRlcnZhbCA9IG1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWw7CisgICAgICAgIGludCBtYXhJbmRleEludGVydmFsID0gbWV0YWRhdGEoKS5wYXJhbXMubWF4SW5kZXhJbnRlcnZhbDsKKyAgICAgICAgZG91YmxlIGVmZmVjdGl2ZUludGVydmFsID0gaW5kZXhTdW1tYXJ5LmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKTsKKworICAgICAgICBJbmRleFN1bW1hcnkgbmV3U3VtbWFyeTsKKworICAgICAgICAvLyBXZSBoYXZlIHRvIHJlYnVpbGQgdGhlIHN1bW1hcnkgZnJvbSB0aGUgb24tZGlzayBwcmltYXJ5IGluZGV4IGluIHRocmVlIGNhc2VzOgorICAgICAgICAvLyAxLiBUaGUgc2FtcGxpbmcgbGV2ZWwgd2VudCB1cCwgc28gd2UgbmVlZCB0byByZWFkIG1vcmUgZW50cmllcyBvZmYgZGlzaworICAgICAgICAvLyAyLiBUaGUgbWluX2luZGV4X2ludGVydmFsIGNoYW5nZWQgKGluIGVpdGhlciBkaXJlY3Rpb24pOyB0aGlzIGNoYW5nZXMgd2hhdCBlbnRyaWVzIHdvdWxkIGJlIGluIHRoZSBzdW1tYXJ5CisgICAgICAgIC8vICAgIGF0IGZ1bGwgc2FtcGxpbmcgKGFuZCBjb25zZXF1ZW50bHkgYXQgYW55IG90aGVyIHNhbXBsaW5nIGxldmVsKQorICAgICAgICAvLyAzLiBUaGUgbWF4X2luZGV4X2ludGVydmFsIHdhcyBsb3dlcmVkLCBmb3JjaW5nIHVzIHRvIHJhaXNlIHRoZSBzYW1wbGluZyBsZXZlbAorICAgICAgICBpZiAoc2FtcGxpbmdMZXZlbCA+IGluZGV4U3VtbWFyeS5nZXRTYW1wbGluZ0xldmVsKCkgfHwgaW5kZXhTdW1tYXJ5LmdldE1pbkluZGV4SW50ZXJ2YWwoKSAhPSBtaW5JbmRleEludGVydmFsIHx8IGVmZmVjdGl2ZUludGVydmFsID4gbWF4SW5kZXhJbnRlcnZhbCkKKyAgICAgICAgeworICAgICAgICAgICAgbmV3U3VtbWFyeSA9IGJ1aWxkU3VtbWFyeUF0TGV2ZWwoc2FtcGxpbmdMZXZlbCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc2FtcGxpbmdMZXZlbCA8IGluZGV4U3VtbWFyeS5nZXRTYW1wbGluZ0xldmVsKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHdlIGNhbiB1c2UgdGhlIGV4aXN0aW5nIGluZGV4IHN1bW1hcnkgdG8gbWFrZSBhIHNtYWxsZXIgb25lCisgICAgICAgICAgICBuZXdTdW1tYXJ5ID0gSW5kZXhTdW1tYXJ5QnVpbGRlci5kb3duc2FtcGxlKGluZGV4U3VtbWFyeSwgc2FtcGxpbmdMZXZlbCwgbWluSW5kZXhJbnRlcnZhbCwgZ2V0UGFydGl0aW9uZXIoKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIkF0dGVtcHRlZCB0byBjbG9uZSBTU1RhYmxlUmVhZGVyIHdpdGggdGhlIHNhbWUgaW5kZXggc3VtbWFyeSBzYW1wbGluZyBsZXZlbCBhbmQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vIGFkanVzdG1lbnRzIHRvIG1pbi9tYXhfaW5kZXhfaW50ZXJ2YWwiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFsd2F5cyBzYXZlIHRoZSByZXNhbXBsZWQgaW5kZXggd2l0aCBsb2NrIHRvIGF2b2lkIHJhY2luZyB3aXRoIGVudGlyZS1zc3RhYmxlIHN0cmVhbWluZworICAgICAgICByZXR1cm4gcnVuV2l0aExvY2soaWdub3JlZCAtPiB7CisgICAgICAgICAgICBuZXcgSW5kZXhTdW1tYXJ5Q29tcG9uZW50KG5ld1N1bW1hcnksIGZpcnN0LCBsYXN0KS5zYXZlKGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlNVTU1BUlkpLCB0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiBjbG9uZUFuZFJlcGxhY2UoZmlyc3QsIE9wZW5SZWFzb24uTUVUQURBVEFfQ0hBTkdFLCBuZXdTdW1tYXJ5KTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBJbmRleFN1bW1hcnkgYnVpbGRTdW1tYXJ5QXRMZXZlbChpbnQgbmV3U2FtcGxpbmdMZXZlbCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyB3ZSByZWFkIHRoZSBwb3NpdGlvbnMgaW4gYSBCUkFGLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGFuIGVudHJ5IHNwYW5uaW5nIGEgbW1hcCBib3VuZGFyeS4KKyAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHByaW1hcnlJbmRleCA9IFJhbmRvbUFjY2Vzc1JlYWRlci5vcGVuKGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlBSSU1BUllfSU5ERVgpKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgaW5kZXhTaXplID0gcHJpbWFyeUluZGV4Lmxlbmd0aCgpOworICAgICAgICAgICAgdHJ5IChJbmRleFN1bW1hcnlCdWlsZGVyIHN1bW1hcnlCdWlsZGVyID0gbmV3IEluZGV4U3VtbWFyeUJ1aWxkZXIoZXN0aW1hdGVkS2V5cygpLCBtZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsLCBuZXdTYW1wbGluZ0xldmVsKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIGluZGV4UG9zaXRpb247CisgICAgICAgICAgICAgICAgd2hpbGUgKChpbmRleFBvc2l0aW9uID0gcHJpbWFyeUluZGV4LmdldEZpbGVQb2ludGVyKCkpICE9IGluZGV4U2l6ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlCdWlsZGVyLm1heWJlQWRkRW50cnkoZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChwcmltYXJ5SW5kZXgpKSwgaW5kZXhQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIFJvd0luZGV4RW50cnkuU2VyaWFsaXplci5za2lwKHByaW1hcnlJbmRleCwgZGVzY3JpcHRvci52ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VtbWFyeUJ1aWxkZXIuYnVpbGQoZ2V0UGFydGl0aW9uZXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2VRdWlldGx5KHByaW1hcnlJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgS2V5Q2FjaGUgZ2V0S2V5Q2FjaGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMua2V5Q2FjaGU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIGV4dGVuZHMgU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIuQnVpbGRlcjxCaWdUYWJsZVJlYWRlciwgQnVpbGRlcj4KKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihCdWlsZGVyLmNsYXNzKTsKKworICAgICAgICBwcml2YXRlIEluZGV4U3VtbWFyeSBpbmRleFN1bW1hcnk7CisgICAgICAgIHByaXZhdGUgRmlsZUhhbmRsZSBpbmRleEZpbGU7CisgICAgICAgIHByaXZhdGUgS2V5Q2FjaGUga2V5Q2FjaGUgPSBLZXlDYWNoZS5OT19DQUNIRTsKKworICAgICAgICBwdWJsaWMgQnVpbGRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGRlc2NyaXB0b3IpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0SW5kZXhGaWxlKEZpbGVIYW5kbGUgaW5kZXhGaWxlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmluZGV4RmlsZSA9IGluZGV4RmlsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0SW5kZXhTdW1tYXJ5KEluZGV4U3VtbWFyeSBpbmRleFN1bW1hcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaW5kZXhTdW1tYXJ5ID0gaW5kZXhTdW1tYXJ5OworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRLZXlDYWNoZShLZXlDYWNoZSBrZXlDYWNoZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5rZXlDYWNoZSA9IGtleUNhY2hlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW5kZXhTdW1tYXJ5IGdldEluZGV4U3VtbWFyeSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpbmRleFN1bW1hcnk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmlsZUhhbmRsZSBnZXRJbmRleEZpbGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaW5kZXhGaWxlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEtleUNhY2hlIGdldEtleUNhY2hlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGtleUNhY2hlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBCaWdUYWJsZVJlYWRlciBidWlsZEludGVybmFsKE93bmVyIG93bmVyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJpZ1RhYmxlUmVhZGVyKHRoaXMsIG93bmVyKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9CaWdUYWJsZVNjYW5uZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9CaWdUYWJsZVNjYW5uZXIuamF2YQppbmRleCAyMzViOWIxLi44ODdkOTk3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnVGFibGVTY2FubmVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ1RhYmxlU2Nhbm5lci5qYXZhCkBAIC0xOCw2MyArMTgsNDUgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5BYnN0cmFjdEl0ZXJhdG9yOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYXRvcnM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGF0YVJhbmdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5QYXJ0aXRpb25Qb3NpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ2x1c3RlcmluZ0luZGV4RmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkFic3RyYWN0Qm91bmRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5BYnN0cmFjdEJvdW5kcy5Cb3VuZGFyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQm91bmRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db3JydXB0U1NUYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklTU1RhYmxlU2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlSWRlbnRpdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkc0xpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVJlYWRzTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVNjYW5uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SYW5kb21BY2Nlc3NSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkFic3RyYWN0Qm91bmRzLmlzRW1wdHk7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5BYnN0cmFjdEJvdW5kcy5tYXhMZWZ0OwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQWJzdHJhY3RCb3VuZHMubWluUmlnaHQ7Ci0KLXB1YmxpYyBjbGFzcyBCaWdUYWJsZVNjYW5uZXIgaW1wbGVtZW50cyBJU1NUYWJsZVNjYW5uZXIKK3B1YmxpYyBjbGFzcyBCaWdUYWJsZVNjYW5uZXIgZXh0ZW5kcyBTU1RhYmxlU2Nhbm5lcjxCaWdUYWJsZVJlYWRlciwgUm93SW5kZXhFbnRyeSwgQmlnVGFibGVTY2FubmVyLkJpZ1NjYW5uaW5nSXRlcmF0b3I+CiB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNCb29sZWFuIGlzQ2xvc2VkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOwotICAgIHByb3RlY3RlZCBmaW5hbCBSYW5kb21BY2Nlc3NSZWFkZXIgZGZpbGU7CiAgICAgcHJvdGVjdGVkIGZpbmFsIFJhbmRvbUFjY2Vzc1JlYWRlciBpZmlsZTsKLSAgICBwdWJsaWMgZmluYWwgU1NUYWJsZVJlYWRlciBzc3RhYmxlOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjxBYnN0cmFjdEJvdW5kczxQYXJ0aXRpb25Qb3NpdGlvbj4+IHJhbmdlSXRlcmF0b3I7CiAgICAgcHJpdmF0ZSBBYnN0cmFjdEJvdW5kczxQYXJ0aXRpb25Qb3NpdGlvbj4gY3VycmVudFJhbmdlOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBDb2x1bW5GaWx0ZXIgY29sdW1uczsKLSAgICBwcml2YXRlIGZpbmFsIERhdGFSYW5nZSBkYXRhUmFuZ2U7CiAgICAgcHJpdmF0ZSBmaW5hbCBSb3dJbmRleEVudHJ5LkluZGV4U2VyaWFsaXplciByb3dJbmRleEVudHJ5U2VyaWFsaXplcjsKLSAgICBwcml2YXRlIGZpbmFsIFNTVGFibGVSZWFkc0xpc3RlbmVyIGxpc3RlbmVyOwotICAgIHByaXZhdGUgbG9uZyBzdGFydFNjYW4gPSAtMTsKLSAgICBwcml2YXRlIGxvbmcgYnl0ZXNTY2FubmVkID0gMDsKLQotICAgIHByb3RlY3RlZCBJdGVyYXRvcjxVbmZpbHRlcmVkUm93SXRlcmF0b3I+IGl0ZXJhdG9yOwogCiAgICAgLy8gRnVsbCBzY2FuIG9mIHRoZSBzc3RhYmxlcwotICAgIHB1YmxpYyBzdGF0aWMgSVNTVGFibGVTY2FubmVyIGdldFNjYW5uZXIoU1NUYWJsZVJlYWRlciBzc3RhYmxlKQorICAgIHB1YmxpYyBzdGF0aWMgSVNTVGFibGVTY2FubmVyIGdldFNjYW5uZXIoQmlnVGFibGVSZWFkZXIgc3N0YWJsZSkKICAgICB7CiAgICAgICAgIHJldHVybiBnZXRTY2FubmVyKHNzdGFibGUsIEl0ZXJhdG9ycy5zaW5nbGV0b25JdGVyYXRvcihmdWxsUmFuZ2Uoc3N0YWJsZSkpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIElTU1RhYmxlU2Nhbm5lciBnZXRTY2FubmVyKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwKKyAgICBwdWJsaWMgc3RhdGljIElTU1RhYmxlU2Nhbm5lciBnZXRTY2FubmVyKEJpZ1RhYmxlUmVhZGVyIHNzdGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5GaWx0ZXIgY29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFSYW5nZSBkYXRhUmFuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcikKQEAgLTgyLDk5ICs2NCwyNSBAQAogICAgICAgICByZXR1cm4gbmV3IEJpZ1RhYmxlU2Nhbm5lcihzc3RhYmxlLCBjb2x1bW5zLCBkYXRhUmFuZ2UsIG1ha2VCb3VuZHMoc3N0YWJsZSwgZGF0YVJhbmdlKS5pdGVyYXRvcigpLCBsaXN0ZW5lcik7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBJU1NUYWJsZVNjYW5uZXIgZ2V0U2Nhbm5lcihTU1RhYmxlUmVhZGVyIHNzdGFibGUsIENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+PiB0b2tlblJhbmdlcykKKyAgICBwdWJsaWMgc3RhdGljIElTU1RhYmxlU2Nhbm5lciBnZXRTY2FubmVyKEJpZ1RhYmxlUmVhZGVyIHNzdGFibGUsIENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+PiB0b2tlblJhbmdlcykKICAgICB7Ci0gICAgICAgIC8vIFdlIHdhbnQgdG8gYXZvaWQgYWxsb2NhdGluZyBhIFNTVGFibGVTY2FubmVyIGlmIHRoZSByYW5nZSBkb24ndCBvdmVybGFwIHRoZSBzc3RhYmxlICgjNTI0OSkKLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyLlBhcnRpdGlvblBvc2l0aW9uQm91bmRzPiBwb3NpdGlvbnMgPSBzc3RhYmxlLmdldFBvc2l0aW9uc0ZvclJhbmdlcyh0b2tlblJhbmdlcyk7Ci0gICAgICAgIGlmIChwb3NpdGlvbnMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBFbXB0eVNTVGFibGVTY2FubmVyKHNzdGFibGUpOwotCiAgICAgICAgIHJldHVybiBnZXRTY2FubmVyKHNzdGFibGUsIG1ha2VCb3VuZHMoc3N0YWJsZSwgdG9rZW5SYW5nZXMpLml0ZXJhdG9yKCkpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgSVNTVGFibGVTY2FubmVyIGdldFNjYW5uZXIoU1NUYWJsZVJlYWRlciBzc3RhYmxlLCBJdGVyYXRvcjxBYnN0cmFjdEJvdW5kczxQYXJ0aXRpb25Qb3NpdGlvbj4+IHJhbmdlSXRlcmF0b3IpCisgICAgcHVibGljIHN0YXRpYyBJU1NUYWJsZVNjYW5uZXIgZ2V0U2Nhbm5lcihCaWdUYWJsZVJlYWRlciBzc3RhYmxlLCBJdGVyYXRvcjxBYnN0cmFjdEJvdW5kczxQYXJ0aXRpb25Qb3NpdGlvbj4+IHJhbmdlSXRlcmF0b3IpCiAgICAgewogICAgICAgICByZXR1cm4gbmV3IEJpZ1RhYmxlU2Nhbm5lcihzc3RhYmxlLCBDb2x1bW5GaWx0ZXIuYWxsKHNzdGFibGUubWV0YWRhdGEoKSksIG51bGwsIHJhbmdlSXRlcmF0b3IsIFNTVGFibGVSZWFkc0xpc3RlbmVyLk5PT1BfTElTVEVORVIpOwogICAgIH0KIAotICAgIHByaXZhdGUgQmlnVGFibGVTY2FubmVyKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwKKyAgICBwcml2YXRlIEJpZ1RhYmxlU2Nhbm5lcihCaWdUYWJsZVJlYWRlciBzc3RhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbkZpbHRlciBjb2x1bW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFSYW5nZSBkYXRhUmFuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8QWJzdHJhY3RCb3VuZHM8UGFydGl0aW9uUG9zaXRpb24+PiByYW5nZUl0ZXJhdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkc0xpc3RlbmVyIGxpc3RlbmVyKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IHNzdGFibGUgIT0gbnVsbDsKLQotICAgICAgICB0aGlzLmRmaWxlID0gc3N0YWJsZS5vcGVuRGF0YVJlYWRlcigpOworICAgICAgICBzdXBlcihzc3RhYmxlLCBjb2x1bW5zLCBkYXRhUmFuZ2UsIHJhbmdlSXRlcmF0b3IsIGxpc3RlbmVyKTsKICAgICAgICAgdGhpcy5pZmlsZSA9IHNzdGFibGUub3BlbkluZGV4UmVhZGVyKCk7Ci0gICAgICAgIHRoaXMuc3N0YWJsZSA9IHNzdGFibGU7Ci0gICAgICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7Ci0gICAgICAgIHRoaXMuZGF0YVJhbmdlID0gZGF0YVJhbmdlOwotICAgICAgICB0aGlzLnJvd0luZGV4RW50cnlTZXJpYWxpemVyID0gc3N0YWJsZS5kZXNjcmlwdG9yLnZlcnNpb24uZ2V0U1NUYWJsZUZvcm1hdCgpLmdldEluZGV4U2VyaWFsaXplcihzc3RhYmxlLm1ldGFkYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuZGVzY3JpcHRvci52ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmhlYWRlcik7Ci0gICAgICAgIHRoaXMucmFuZ2VJdGVyYXRvciA9IHJhbmdlSXRlcmF0b3I7Ci0gICAgICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEFic3RyYWN0Qm91bmRzPFBhcnRpdGlvblBvc2l0aW9uPj4gbWFrZUJvdW5kcyhTU1RhYmxlUmVhZGVyIHNzdGFibGUsIENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+PiB0b2tlblJhbmdlcykKLSAgICB7Ci0gICAgICAgIExpc3Q8QWJzdHJhY3RCb3VuZHM8UGFydGl0aW9uUG9zaXRpb24+PiBib3VuZHNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KHRva2VuUmFuZ2VzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoUmFuZ2U8VG9rZW4+IHJhbmdlIDogUmFuZ2Uubm9ybWFsaXplKHRva2VuUmFuZ2VzKSkKLSAgICAgICAgICAgIGFkZFJhbmdlKHNzdGFibGUsIFJhbmdlLm1ha2VSb3dSYW5nZShyYW5nZSksIGJvdW5kc0xpc3QpOwotICAgICAgICByZXR1cm4gYm91bmRzTGlzdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEFic3RyYWN0Qm91bmRzPFBhcnRpdGlvblBvc2l0aW9uPj4gbWFrZUJvdW5kcyhTU1RhYmxlUmVhZGVyIHNzdGFibGUsIERhdGFSYW5nZSBkYXRhUmFuZ2UpCi0gICAgewotICAgICAgICBMaXN0PEFic3RyYWN0Qm91bmRzPFBhcnRpdGlvblBvc2l0aW9uPj4gYm91bmRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigyKTsKLSAgICAgICAgYWRkUmFuZ2Uoc3N0YWJsZSwgZGF0YVJhbmdlLmtleVJhbmdlKCksIGJvdW5kc0xpc3QpOwotICAgICAgICByZXR1cm4gYm91bmRzTGlzdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBBYnN0cmFjdEJvdW5kczxQYXJ0aXRpb25Qb3NpdGlvbj4gZnVsbFJhbmdlKFNTVGFibGVSZWFkZXIgc3N0YWJsZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQm91bmRzPFBhcnRpdGlvblBvc2l0aW9uPihzc3RhYmxlLmZpcnN0LCBzc3RhYmxlLmxhc3QpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkUmFuZ2UoU1NUYWJsZVJlYWRlciBzc3RhYmxlLCBBYnN0cmFjdEJvdW5kczxQYXJ0aXRpb25Qb3NpdGlvbj4gcmVxdWVzdGVkLCBMaXN0PEFic3RyYWN0Qm91bmRzPFBhcnRpdGlvblBvc2l0aW9uPj4gYm91bmRzTGlzdCkKLSAgICB7Ci0gICAgICAgIGlmIChyZXF1ZXN0ZWQgaW5zdGFuY2VvZiBSYW5nZSAmJiAoKFJhbmdlKXJlcXVlc3RlZCkuaXNXcmFwQXJvdW5kKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWQucmlnaHQuY29tcGFyZVRvKHNzdGFibGUuZmlyc3QpID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gc2luY2Ugd2Ugd3JhcCwgd2UgbXVzdCBjb250YWluIHRoZSB3aG9sZSBzc3RhYmxlIHByaW9yIHRvIHN0b3BLZXkoKQotICAgICAgICAgICAgICAgIEJvdW5kYXJ5PFBhcnRpdGlvblBvc2l0aW9uPiBsZWZ0ID0gbmV3IEJvdW5kYXJ5PFBhcnRpdGlvblBvc2l0aW9uPihzc3RhYmxlLmZpcnN0LCB0cnVlKTsKLSAgICAgICAgICAgICAgICBCb3VuZGFyeTxQYXJ0aXRpb25Qb3NpdGlvbj4gcmlnaHQ7Ci0gICAgICAgICAgICAgICAgcmlnaHQgPSByZXF1ZXN0ZWQucmlnaHRCb3VuZGFyeSgpOwotICAgICAgICAgICAgICAgIHJpZ2h0ID0gbWluUmlnaHQocmlnaHQsIHNzdGFibGUubGFzdCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0VtcHR5KGxlZnQsIHJpZ2h0KSkKLSAgICAgICAgICAgICAgICAgICAgYm91bmRzTGlzdC5hZGQoQWJzdHJhY3RCb3VuZHMuYm91bmRzKGxlZnQsIHJpZ2h0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVxdWVzdGVkLmxlZnQuY29tcGFyZVRvKHNzdGFibGUubGFzdCkgPD0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSB3cmFwLCB3ZSBtdXN0IGNvbnRhaW4gdGhlIHdob2xlIHNzdGFibGUgYWZ0ZXIgZGF0YVJhbmdlLnN0YXJ0S2V5KCkKLSAgICAgICAgICAgICAgICBCb3VuZGFyeTxQYXJ0aXRpb25Qb3NpdGlvbj4gcmlnaHQgPSBuZXcgQm91bmRhcnk8UGFydGl0aW9uUG9zaXRpb24+KHNzdGFibGUubGFzdCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgQm91bmRhcnk8UGFydGl0aW9uUG9zaXRpb24+IGxlZnQ7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IHJlcXVlc3RlZC5sZWZ0Qm91bmRhcnkoKTsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gbWF4TGVmdChsZWZ0LCBzc3RhYmxlLmZpcnN0LCB0cnVlKTsKLSAgICAgICAgICAgICAgICBpZiAoIWlzRW1wdHkobGVmdCwgcmlnaHQpKQotICAgICAgICAgICAgICAgICAgICBib3VuZHNMaXN0LmFkZChBYnN0cmFjdEJvdW5kcy5ib3VuZHMobGVmdCwgcmlnaHQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ZWQubGVmdC5jb21wYXJlVG8ocmVxdWVzdGVkLnJpZ2h0KSA8PSAwIHx8IHJlcXVlc3RlZC5yaWdodC5pc01pbmltdW0oKTsKLSAgICAgICAgICAgIEJvdW5kYXJ5PFBhcnRpdGlvblBvc2l0aW9uPiBsZWZ0LCByaWdodDsKLSAgICAgICAgICAgIGxlZnQgPSByZXF1ZXN0ZWQubGVmdEJvdW5kYXJ5KCk7Ci0gICAgICAgICAgICByaWdodCA9IHJlcXVlc3RlZC5yaWdodEJvdW5kYXJ5KCk7Ci0gICAgICAgICAgICBsZWZ0ID0gbWF4TGVmdChsZWZ0LCBzc3RhYmxlLmZpcnN0LCB0cnVlKTsKLSAgICAgICAgICAgIC8vIGFwcGFyZW50bHkgaXNXcmFwQXJvdW5kKCkgZG9lc24ndCBjb3VudCBCb3VuZHMgdGhhdCBleHRlbmQgdG8gdGhlIGxpbWl0IChtaW4pIGFzIHdyYXBwaW5nCi0gICAgICAgICAgICByaWdodCA9IHJlcXVlc3RlZC5yaWdodC5pc01pbmltdW0oKSA/IG5ldyBCb3VuZGFyeTxQYXJ0aXRpb25Qb3NpdGlvbj4oc3N0YWJsZS5sYXN0LCB0cnVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbWluUmlnaHQocmlnaHQsIHNzdGFibGUubGFzdCwgdHJ1ZSk7Ci0gICAgICAgICAgICBpZiAoIWlzRW1wdHkobGVmdCwgcmlnaHQpKQotICAgICAgICAgICAgICAgIGJvdW5kc0xpc3QuYWRkKEFic3RyYWN0Qm91bmRzLmJvdW5kcyhsZWZ0LCByaWdodCkpOwotICAgICAgICB9CisgICAgICAgIHRoaXMucm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIgPSBuZXcgUm93SW5kZXhFbnRyeS5TZXJpYWxpemVyKHNzdGFibGUuZGVzY3JpcHRvci52ZXJzaW9uLCBzc3RhYmxlLmhlYWRlciwgc3N0YWJsZS5vd25lcigpLm1hcChTU1RhYmxlLk93bmVyOjpnZXRNZXRyaWNzKS5vckVsc2UobnVsbCkpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzZWVrVG9DdXJyZW50UmFuZ2VTdGFydCgpCkBAIC0yMDksMTc3ICsxMTcsODggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICBwcm90ZWN0ZWQgdm9pZCBkb0Nsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlzQ2xvc2VkLmNvbXBhcmVBbmRTZXQoZmFsc2UsIHRydWUpKQotICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShkZmlsZSwgaWZpbGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzc3RhYmxlLm1hcmtTdXNwZWN0KCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24oZSwgc3N0YWJsZS5nZXRGaWxlbmFtZSgpKTsKLSAgICAgICAgfQorICAgICAgICBGaWxlVXRpbHMuY2xvc2UoZGZpbGUsIGlmaWxlKTsKICAgICB9CiAKLSAgICBwdWJsaWMgbG9uZyBnZXRMZW5ndGhJbkJ5dGVzKCkKKyAgICBwcm90ZWN0ZWQgQmlnU2Nhbm5pbmdJdGVyYXRvciBkb0NyZWF0ZUl0ZXJhdG9yKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBkZmlsZS5sZW5ndGgoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBCaWdTY2FubmluZ0l0ZXJhdG9yKCk7CiAgICAgfQogCi0gICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFBvc2l0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZmlsZS5nZXRGaWxlUG9pbnRlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldEJ5dGVzU2Nhbm5lZCgpCi0gICAgewotICAgICAgICByZXR1cm4gYnl0ZXNTY2FubmVkOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldENvbXByZXNzZWRMZW5ndGhJbkJ5dGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzc3RhYmxlLm9uRGlza0xlbmd0aCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQ8U1NUYWJsZVJlYWRlcj4gZ2V0QmFja2luZ1NTVGFibGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBJbW11dGFibGVTZXQub2Yoc3N0YWJsZSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSgpCi0gICAgewotICAgICAgICByZXR1cm4gc3N0YWJsZS5tZXRhZGF0YSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKQotICAgIHsKLSAgICAgICAgaWYgKGl0ZXJhdG9yID09IG51bGwpCi0gICAgICAgICAgICBpdGVyYXRvciA9IGNyZWF0ZUl0ZXJhdG9yKCk7Ci0gICAgICAgIHJldHVybiBpdGVyYXRvci5oYXNOZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBuZXh0KCkKLSAgICB7Ci0gICAgICAgIGlmIChpdGVyYXRvciA9PSBudWxsKQotICAgICAgICAgICAgaXRlcmF0b3IgPSBjcmVhdGVJdGVyYXRvcigpOwotICAgICAgICByZXR1cm4gaXRlcmF0b3IubmV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEl0ZXJhdG9yPFVuZmlsdGVyZWRSb3dJdGVyYXRvcj4gY3JlYXRlSXRlcmF0b3IoKQotICAgIHsKLSAgICAgICAgdGhpcy5saXN0ZW5lci5vblNjYW5uaW5nU3RhcnRlZChzc3RhYmxlKTsKLSAgICAgICAgcmV0dXJuIG5ldyBLZXlTY2FubmluZ0l0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGNsYXNzIEtleVNjYW5uaW5nSXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEl0ZXJhdG9yPFVuZmlsdGVyZWRSb3dJdGVyYXRvcj4KKyAgICBwcm90ZWN0ZWQgY2xhc3MgQmlnU2Nhbm5pbmdJdGVyYXRvciBleHRlbmRzIFNTVGFibGVTY2FubmVyPEJpZ1RhYmxlUmVhZGVyLCBSb3dJbmRleEVudHJ5LCBCaWdUYWJsZVNjYW5uZXIuQmlnU2Nhbm5pbmdJdGVyYXRvcj4uQmFzZUtleVNjYW5uaW5nSXRlcmF0b3IKICAgICB7CiAgICAgICAgIHByaXZhdGUgRGVjb3JhdGVkS2V5IG5leHRLZXk7CiAgICAgICAgIHByaXZhdGUgUm93SW5kZXhFbnRyeSBuZXh0RW50cnk7Ci0gICAgICAgIHByaXZhdGUgRGVjb3JhdGVkS2V5IGN1cnJlbnRLZXk7Ci0gICAgICAgIHByaXZhdGUgUm93SW5kZXhFbnRyeSBjdXJyZW50RW50cnk7CiAKLSAgICAgICAgcHJvdGVjdGVkIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBjb21wdXRlTmV4dCgpCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIHByZXBhcmVUb0l0ZXJhdGVSb3coKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewotICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICBpZiAobmV4dEVudHJ5ID09IG51bGwpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG5leHRFbnRyeSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGRvCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRTY2FuICE9IC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzU2Nhbm5lZCArPSBkZmlsZS5nZXRGaWxlUG9pbnRlcigpIC0gc3RhcnRTY2FuOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRTY2FuICE9IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNTY2FubmVkICs9IGRmaWxlLmdldEZpbGVQb2ludGVyKCkgLSBzdGFydFNjYW47CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIHN0YXJ0aW5nIHRoZSBmaXJzdCByYW5nZSBvciB3ZSBqdXN0IHBhc3NlZCB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyByYW5nZQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyYW5nZUl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5kT2ZEYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIHN0YXJ0aW5nIHRoZSBmaXJzdCByYW5nZSBvciB3ZSBqdXN0IHBhc3NlZCB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyByYW5nZQorICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlSXRlcmF0b3IuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmFuZ2UgPSByYW5nZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZWtUb0N1cnJlbnRSYW5nZVN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydFNjYW4gPSBkZmlsZS5nZXRGaWxlUG9pbnRlcigpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmFuZ2UgPSByYW5nZUl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgc2Vla1RvQ3VycmVudFJhbmdlU3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRTY2FuID0gZGZpbGUuZ2V0RmlsZVBvaW50ZXIoKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlmaWxlLmlzRU9GKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuZE9mRGF0YSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaWZpbGUuaXNFT0YoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEtleSA9IHNzdGFibGUuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChpZmlsZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVudHJ5ID0gcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaWZpbGUpOwotICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICghY3VycmVudFJhbmdlLmNvbnRhaW5zKGN1cnJlbnRLZXkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjdXJyZW50S2V5ID0gc3N0YWJsZS5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGlmaWxlKSk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbnRyeSA9IHJvd0luZGV4RW50cnlTZXJpYWxpemVyLmRlc2VyaWFsaXplKGlmaWxlKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlICghY3VycmVudFJhbmdlLmNvbnRhaW5zKGN1cnJlbnRLZXkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgcmFuZ2UKKyAgICAgICAgICAgICAgICBjdXJyZW50S2V5ID0gbmV4dEtleTsKKyAgICAgICAgICAgICAgICBjdXJyZW50RW50cnkgPSBuZXh0RW50cnk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpZmlsZS5pc0VPRigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5leHRFbnRyeSA9IG51bGw7CisgICAgICAgICAgICAgICAgbmV4dEtleSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0aGUgcG9zaXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGtleSwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGZhbGxzIGluIHRoZSBjdXJyZW50IHJhbmdlCisgICAgICAgICAgICAgICAgbmV4dEtleSA9IHNzdGFibGUuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChpZmlsZSkpOworICAgICAgICAgICAgICAgIG5leHRFbnRyeSA9IHJvd0luZGV4RW50cnlTZXJpYWxpemVyLmRlc2VyaWFsaXplKGlmaWxlKTsKKworICAgICAgICAgICAgICAgIGlmICghY3VycmVudFJhbmdlLmNvbnRhaW5zKG5leHRLZXkpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHJhbmdlCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRLZXkgPSBuZXh0S2V5OwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50RW50cnkgPSBuZXh0RW50cnk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlmaWxlLmlzRU9GKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuZXh0RW50cnkgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICBuZXh0S2V5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbmV4dEVudHJ5ID0gbnVsbDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0aGUgcG9zaXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGtleSwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGZhbGxzIGluIHRoZSBjdXJyZW50IHJhbmdlCi0gICAgICAgICAgICAgICAgICAgIG5leHRLZXkgPSBzc3RhYmxlLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoaWZpbGUpKTsKLSAgICAgICAgICAgICAgICAgICAgbmV4dEVudHJ5ID0gcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaWZpbGUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudFJhbmdlLmNvbnRhaW5zKG5leHRLZXkpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXh0S2V5ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFbnRyeSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIEZvciBhIGdpdmVuIHBhcnRpdGlvbiBrZXksIHdlIHdhbnQgdG8gYXZvaWQgaGl0dGluZyB0aGUgZGF0YQotICAgICAgICAgICAgICAgICAqIGZpbGUgdW5sZXNzIHdlJ3JlIGV4cGxpY2l0ZWx5IGFza2VkIHRvLiBUaGlzIGlzIGltcG9ydGFudAotICAgICAgICAgICAgICAgICAqIGZvciBQYXJ0aXRpb25SYW5nZVJlYWRDb21tYW5kI2NoZWNrQ2FjaGVGaWx0ZXIuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMYXppbHlJbml0aWFsaXplZFVuZmlsdGVyZWRSb3dJdGVyYXRvcihjdXJyZW50S2V5KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpbml0aWFsaXplSXRlcmF0b3IoKQotICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFNjYW4gIT0gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNTY2FubmVkICs9IGRmaWxlLmdldEZpbGVQb2ludGVyKCkgLSBzdGFydFNjYW47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhUmFuZ2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmaWxlLnNlZWsoY3VycmVudEVudHJ5LnBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTY2FuID0gZGZpbGUuZ2V0RmlsZVBvaW50ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuc2tpcFNob3J0TGVuZ3RoKGRmaWxlKTsgLy8ga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTU1RhYmxlSWRlbnRpdHlJdGVyYXRvci5jcmVhdGUoc3N0YWJsZSwgZGZpbGUsIHBhcnRpdGlvbktleSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTY2FuID0gZGZpbGUuZ2V0RmlsZVBvaW50ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbHVzdGVyaW5nSW5kZXhGaWx0ZXIgZmlsdGVyID0gZGF0YVJhbmdlLmNsdXN0ZXJpbmdJbmRleEZpbHRlcihwYXJ0aXRpb25LZXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNzdGFibGUucm93SXRlcmF0b3IoZGZpbGUsIHBhcnRpdGlvbktleSgpLCBjdXJyZW50RW50cnksIGZpbHRlci5nZXRTbGljZXMoQmlnVGFibGVTY2FubmVyLnRoaXMubWV0YWRhdGEoKSksIGNvbHVtbnMsIGZpbHRlci5pc1JldmVyc2VkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIHwgSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLm1hcmtTdXNwZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKGUsIHNzdGFibGUuZ2V0RmlsZW5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIHwgSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBnZXRSb3dJdGVyYXRvcihSb3dJbmRleEVudHJ5IHJvd0luZGV4RW50cnksIERlY29yYXRlZEtleSBrZXkpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZGF0YVJhbmdlID09IG51bGwpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3N0YWJsZS5tYXJrU3VzcGVjdCgpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihlLCBzc3RhYmxlLmdldEZpbGVuYW1lKCkpOworICAgICAgICAgICAgICAgIGRmaWxlLnNlZWsocm93SW5kZXhFbnRyeS5wb3NpdGlvbik7CisgICAgICAgICAgICAgICAgc3RhcnRTY2FuID0gZGZpbGUuZ2V0RmlsZVBvaW50ZXIoKTsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5za2lwU2hvcnRMZW5ndGgoZGZpbGUpOyAvLyBrZXkKKyAgICAgICAgICAgICAgICByZXR1cm4gU1NUYWJsZUlkZW50aXR5SXRlcmF0b3IuY3JlYXRlKHNzdGFibGUsIGRmaWxlLCBrZXkpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXJ0U2NhbiA9IGRmaWxlLmdldEZpbGVQb2ludGVyKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENsdXN0ZXJpbmdJbmRleEZpbHRlciBmaWx0ZXIgPSBkYXRhUmFuZ2UuY2x1c3RlcmluZ0luZGV4RmlsdGVyKGtleSk7CisgICAgICAgICAgICByZXR1cm4gc3N0YWJsZS5yb3dJdGVyYXRvcihkZmlsZSwga2V5LCByb3dJbmRleEVudHJ5LCBmaWx0ZXIuZ2V0U2xpY2VzKEJpZ1RhYmxlU2Nhbm5lci50aGlzLm1ldGFkYXRhKCkpLCBjb2x1bW5zLCBmaWx0ZXIuaXNSZXZlcnNlZCgpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzkyLDU5ICsyMTEsNCBAQAogICAgICAgICAgICAgICAgIiBzc3RhYmxlPSIgKyBzc3RhYmxlICsKICAgICAgICAgICAgICAgICIpIjsKICAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVtcHR5U1NUYWJsZVNjYW5uZXIgZXh0ZW5kcyBBYnN0cmFjdFVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvciBpbXBsZW1lbnRzIElTU1RhYmxlU2Nhbm5lcgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTU1RhYmxlUmVhZGVyIHNzdGFibGU7Ci0KLSAgICAgICAgcHVibGljIEVtcHR5U1NUYWJsZVNjYW5uZXIoU1NUYWJsZVJlYWRlciBzc3RhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnNzdGFibGUgPSBzc3RhYmxlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgZ2V0TGVuZ3RoSW5CeXRlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFBvc2l0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRCeXRlc1NjYW5uZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIGdldENvbXByZXNzZWRMZW5ndGhJbkJ5dGVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2V0PFNTVGFibGVSZWFkZXI+IGdldEJhY2tpbmdTU1RhYmxlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBJbW11dGFibGVTZXQub2Yoc3N0YWJsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzc3RhYmxlLm1ldGFkYXRhKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBuZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldE1pbkxvY2FsRGVsZXRpb25UaW1lKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIERlbGV0aW9uVGltZS5MSVZFLmxvY2FsRGVsZXRpb25UaW1lKCk7Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnVGFibGVTY3J1YmJlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ1RhYmxlU2NydWJiZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzk5MWY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ1RhYmxlU2NydWJiZXIuamF2YQpAQCAtMCwwICsxLDI5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnOworCitpbXBvcnQgamF2YS5pby5JT0Vycm9yOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3JzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVNjcnViYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVJld3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNvcnRlZFRhYmxlU2NydWJiZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmFuZG9tQWNjZXNzUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpWTVN0YWJpbGl0eUluc3BlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PdXRwdXRIYW5kbGVyOworCitwdWJsaWMgY2xhc3MgQmlnVGFibGVTY3J1YmJlciBleHRlbmRzIFNvcnRlZFRhYmxlU2NydWJiZXI8QmlnVGFibGVSZWFkZXI+IGltcGxlbWVudHMgSVNjcnViYmVyCit7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzSW5kZXg7CisKKyAgICBwcml2YXRlIGZpbmFsIFJhbmRvbUFjY2Vzc1JlYWRlciBpbmRleEZpbGU7CisgICAgcHJpdmF0ZSBmaW5hbCBSb3dJbmRleEVudHJ5LkluZGV4U2VyaWFsaXplciByb3dJbmRleEVudHJ5U2VyaWFsaXplcjsKKworICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBjdXJyZW50SW5kZXhLZXk7CisgICAgcHJpdmF0ZSBCeXRlQnVmZmVyIG5leHRJbmRleEtleTsKKyAgICBwcml2YXRlIGxvbmcgY3VycmVudFBhcnRpdGlvblBvc2l0aW9uRnJvbUluZGV4OworICAgIHByaXZhdGUgbG9uZyBuZXh0UGFydGl0aW9uUG9zaXRpb25Gcm9tSW5kZXg7CisKKyAgICBwdWJsaWMgQmlnVGFibGVTY3J1YmJlcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0SGFuZGxlciBvdXRwdXRIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucykKKyAgICB7CisgICAgICAgIHN1cGVyKGNmcywgdHJhbnNhY3Rpb24sIG91dHB1dEhhbmRsZXIsIG9wdGlvbnMpOworCisgICAgICAgIHRoaXMucm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIgPSBuZXcgUm93SW5kZXhFbnRyeS5TZXJpYWxpemVyKHNzdGFibGUuZGVzY3JpcHRvci52ZXJzaW9uLCBzc3RhYmxlLmhlYWRlciwgY2ZzLmdldE1ldHJpY3MoKSk7CisKKyAgICAgICAgYm9vbGVhbiBoYXNJbmRleEZpbGUgPSBzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlBSSU1BUllfSU5ERVgpLmV4aXN0cygpOworICAgICAgICB0aGlzLmlzSW5kZXggPSBjZnMuaXNJbmRleCgpOworICAgICAgICBpZiAoIWhhc0luZGV4RmlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaWYgdGhlcmUncyBhbnkgY29ycnVwdGlvbiBpbiB0aGUgLURhdGEuZGIgdGhlbiBwYXJ0aXRpb25zIGNhbid0IGJlIHNraXBwZWQgb3Zlci4gYnV0IGl0J3Mgd29ydGggYSBzaG90LgorICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKCJNaXNzaW5nIGNvbXBvbmVudDogJXMiLCBzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlBSSU1BUllfSU5ERVgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuaW5kZXhGaWxlID0gaGFzSW5kZXhGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgPyBSYW5kb21BY2Nlc3NSZWFkZXIub3Blbihzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlBSSU1BUllfSU5ERVgpKQorICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbDsKKworICAgICAgICB0aGlzLmN1cnJlbnRQYXJ0aXRpb25Qb3NpdGlvbkZyb21JbmRleCA9IDA7CisgICAgICAgIHRoaXMubmV4dFBhcnRpdGlvblBvc2l0aW9uRnJvbUluZGV4ID0gMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHdpdGhWYWxpZGF0aW9uKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyLCBTdHJpbmcgZmlsZW5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gb3B0aW9ucy5jaGVja0RhdGEgJiYgIWlzSW5kZXggPyBVbmZpbHRlcmVkUm93SXRlcmF0b3JzLndpdGhWYWxpZGF0aW9uKGl0ZXIsIGZpbGVuYW1lKSA6IGl0ZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2NydWJJbnRlcm5hbChTU1RhYmxlUmV3cml0ZXIgd3JpdGVyKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBuZXh0SW5kZXhLZXkgPSBpbmRleEF2YWlsYWJsZSgpID8gQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChpbmRleEZpbGUpIDogbnVsbDsKKyAgICAgICAgICAgIGlmIChpbmRleEF2YWlsYWJsZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHRocm93IGF3YXkgdmFyaWFibGUsIHNvIHdlIGRvbid0IGhhdmUgYSBzaWRlIGVmZmVjdCBpbiB0aGUgYXNzZXJ0aW9uCisgICAgICAgICAgICAgICAgbG9uZyBmaXJzdFJvd1Bvc2l0aW9uRnJvbUluZGV4ID0gcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIuZGVzZXJpYWxpemVQb3NpdGlvbkFuZFNraXAoaW5kZXhGaWxlKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQgZmlyc3RSb3dQb3NpdGlvbkZyb21JbmRleCA9PSAwIDogZmlyc3RSb3dQb3NpdGlvbkZyb21JbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGV4KQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvd0lmRmF0YWwoZXgpOworICAgICAgICAgICAgbmV4dEluZGV4S2V5ID0gbnVsbDsKKyAgICAgICAgICAgIG5leHRQYXJ0aXRpb25Qb3NpdGlvbkZyb21JbmRleCA9IGRhdGFGaWxlLmxlbmd0aCgpOworICAgICAgICAgICAgaWYgKGluZGV4RmlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGluZGV4RmlsZS5zZWVrKGluZGV4RmlsZS5sZW5ndGgoKSk7CisgICAgICAgIH0KKworICAgICAgICBEZWNvcmF0ZWRLZXkgcHJldktleSA9IG51bGw7CisKKyAgICAgICAgd2hpbGUgKCFkYXRhRmlsZS5pc0VPRigpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2NydWJJbmZvLmlzU3RvcFJlcXVlc3RlZCgpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb24oc2NydWJJbmZvLmdldENvbXBhY3Rpb25JbmZvKCkpOworCisgICAgICAgICAgICBsb25nIHBhcnRpdGlvblN0YXJ0ID0gZGF0YUZpbGUuZ2V0RmlsZVBvaW50ZXIoKTsKKyAgICAgICAgICAgIG91dHB1dEhhbmRsZXIuZGVidWcoIlJlYWRpbmcgcm93IGF0ICVkIiwgcGFydGl0aW9uU3RhcnQpOworCisgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gbnVsbDsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgcmF3ID0gQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChkYXRhRmlsZSk7CisgICAgICAgICAgICAgICAgaWYgKCFjZnMubWV0YWRhdGEuZ2V0TG9jYWwoKS5pc0luZGV4KCkpCisgICAgICAgICAgICAgICAgICAgIGNmcy5tZXRhZGF0YS5nZXRMb2NhbCgpLnBhcnRpdGlvbktleVR5cGUudmFsaWRhdGUocmF3KTsKKyAgICAgICAgICAgICAgICBrZXkgPSBzc3RhYmxlLmRlY29yYXRlS2V5KHJhdyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93SWZGYXRhbCh0aCk7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIG51bGwga2V5IGJlbG93CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvbmcgZGF0YVN0YXJ0RnJvbUluZGV4ID0gLTE7CisgICAgICAgICAgICBsb25nIGRhdGFTaXplRnJvbUluZGV4ID0gLTE7CisgICAgICAgICAgICB1cGRhdGVJbmRleEtleSgpOworCisgICAgICAgICAgICBpZiAoaW5kZXhBdmFpbGFibGUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4S2V5ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYXRhU3RhcnRGcm9tSW5kZXggPSBjdXJyZW50UGFydGl0aW9uUG9zaXRpb25Gcm9tSW5kZXggKyAyICsgY3VycmVudEluZGV4S2V5LnJlbWFpbmluZygpOworICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZUZyb21JbmRleCA9IG5leHRQYXJ0aXRpb25Qb3NpdGlvbkZyb21JbmRleCAtIGRhdGFTdGFydEZyb21JbmRleDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvbmcgZGF0YVN0YXJ0ID0gZGF0YUZpbGUuZ2V0RmlsZVBvaW50ZXIoKTsKKworICAgICAgICAgICAgU3RyaW5nIGtleU5hbWUgPSBrZXkgPT0gbnVsbCA/ICIodW5yZWFkYWJsZSBrZXkpIiA6IGtleVN0cmluZyhrZXkpOworICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5kZWJ1ZygicGFydGl0aW9uICVzIGlzICVzIiwga2V5TmFtZSwgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoZGF0YVNpemVGcm9tSW5kZXgpKTsKKyAgICAgICAgICAgIGFzc2VydCBjdXJyZW50SW5kZXhLZXkgIT0gbnVsbCB8fCAhaW5kZXhBdmFpbGFibGUoKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FcnJvcihuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byByZWFkIHBhcnRpdGlvbiBrZXkgZnJvbSBkYXRhIGZpbGUiKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4S2V5ICE9IG51bGwgJiYgIWtleS5nZXRLZXkoKS5lcXVhbHMoY3VycmVudEluZGV4S2V5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0Vycm9yKG5ldyBJT0V4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJLZXkgZnJvbSBkYXRhIGZpbGUgKCVzKSBkb2VzIG5vdCBtYXRjaCBrZXkgZnJvbSBpbmRleCBmaWxlICglcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0J5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoa2V5LmdldEtleSgpKSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChjdXJyZW50SW5kZXhLZXkpKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX3RvbyBiaWdfIiwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChjdXJyZW50SW5kZXhLZXkpKSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpbmRleEZpbGUgIT0gbnVsbCAmJiBkYXRhU2l6ZUZyb21JbmRleCA+IGRhdGFGaWxlLmxlbmd0aCgpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FcnJvcihuZXcgSU9FeGNlcHRpb24oIkltcG9zc2libGUgcGFydGl0aW9uIHNpemUgKGdyZWF0ZXIgdGhhbiBmaWxlIGxlbmd0aCk6ICIgKyBkYXRhU2l6ZUZyb21JbmRleCkpOworCisgICAgICAgICAgICAgICAgaWYgKGluZGV4RmlsZSAhPSBudWxsICYmIGRhdGFTdGFydCAhPSBkYXRhU3RhcnRGcm9tSW5kZXgpCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2FybigiRGF0YSBmaWxlIHBhcnRpdGlvbiBwb3NpdGlvbiAlZCBkaWZmZXJzIGZyb20gaW5kZXggZmlsZSByb3cgcG9zaXRpb24gJWQiLCBkYXRhU3RhcnQsIGRhdGFTdGFydEZyb21JbmRleCk7CisKKyAgICAgICAgICAgICAgICBpZiAodHJ5QXBwZW5kKHByZXZLZXksIGtleSwgd3JpdGVyKSkKKyAgICAgICAgICAgICAgICAgICAgcHJldktleSA9IGtleTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3dJZkZhdGFsKHRoKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4odGgsICJFcnJvciByZWFkaW5nIHBhcnRpdGlvbiAlcyAoc3RhY2t0cmFjZSBmb2xsb3dzKToiLCBrZXlOYW1lKTsKKworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXhLZXkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiAoa2V5ID09IG51bGwgfHwgIWtleS5nZXRLZXkoKS5lcXVhbHMoY3VycmVudEluZGV4S2V5KSB8fCBkYXRhU3RhcnQgIT0gZGF0YVN0YXJ0RnJvbUluZGV4KSkKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5vdXRwdXQoIlJldHJ5aW5nIGZyb20gcGFydGl0aW9uIGluZGV4OyBkYXRhIGlzICVzIGJ5dGVzIHN0YXJ0aW5nIGF0ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemVGcm9tSW5kZXgsIGRhdGFTdGFydEZyb21JbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGtleSA9IHNzdGFibGUuZGVjb3JhdGVLZXkoY3VycmVudEluZGV4S2V5KTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2ZzLm1ldGFkYXRhLmdldExvY2FsKCkuaXNJbmRleCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmcy5tZXRhZGF0YS5nZXRMb2NhbCgpLnBhcnRpdGlvbktleVR5cGUudmFsaWRhdGUoa2V5LmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFGaWxlLnNlZWsoZGF0YVN0YXJ0RnJvbUluZGV4KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyeUFwcGVuZChwcmV2S2V5LCBrZXksIHdyaXRlcikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldktleSA9IGtleTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRoMikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dJZkZhdGFsKHRoMik7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd0lmQ2Fubm90Q29udGludWUoa2V5LCB0aDIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4odGgyLCAiUmV0cnkgZmFpbGVkIHRvby4gU2tpcHBpbmcgdG8gbmV4dCBwYXJ0aXRpb24gKHJldHJ5J3Mgc3RhY2t0cmFjZSBmb2xsb3dzKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYmFkUGFydGl0aW9ucysrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWVrVG9OZXh0UGFydGl0aW9uKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dJZkNhbm5vdENvbnRpbnVlKGtleSwgdGgpOworCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2FybigiUGFydGl0aW9uIHN0YXJ0aW5nIGF0IHBvc2l0aW9uICVkIGlzIHVucmVhZGFibGU7IHNraXBwaW5nIHRvIG5leHQiLCBkYXRhU3RhcnQpOworICAgICAgICAgICAgICAgICAgICBiYWRQYXJ0aXRpb25zKys7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXhLZXkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2Vla1RvTmV4dFBhcnRpdGlvbigpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVJbmRleEtleSgpCisgICAgeworICAgICAgICBjdXJyZW50SW5kZXhLZXkgPSBuZXh0SW5kZXhLZXk7CisgICAgICAgIGN1cnJlbnRQYXJ0aXRpb25Qb3NpdGlvbkZyb21JbmRleCA9IG5leHRQYXJ0aXRpb25Qb3NpdGlvbkZyb21JbmRleDsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIG5leHRJbmRleEtleSA9ICFpbmRleEF2YWlsYWJsZSgpID8gbnVsbCA6IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoaW5kZXhGaWxlKTsKKworICAgICAgICAgICAgbmV4dFBhcnRpdGlvblBvc2l0aW9uRnJvbUluZGV4ID0gIWluZGV4QXZhaWxhYmxlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGF0YUZpbGUubGVuZ3RoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIuZGVzZXJpYWxpemVQb3NpdGlvbkFuZFNraXAoaW5kZXhGaWxlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRoKQorICAgICAgICB7CisgICAgICAgICAgICBKVk1TdGFiaWxpdHlJbnNwZWN0b3IuaW5zcGVjdFRocm93YWJsZSh0aCk7CisgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4odGgsICJFcnJvciByZWFkaW5nIGluZGV4IGZpbGUiKTsKKyAgICAgICAgICAgIG5leHRJbmRleEtleSA9IG51bGw7CisgICAgICAgICAgICBuZXh0UGFydGl0aW9uUG9zaXRpb25Gcm9tSW5kZXggPSBkYXRhRmlsZS5sZW5ndGgoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpbmRleEF2YWlsYWJsZSgpCisgICAgeworICAgICAgICByZXR1cm4gaW5kZXhGaWxlICE9IG51bGwgJiYgIWluZGV4RmlsZS5pc0VPRigpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBzZWVrVG9OZXh0UGFydGl0aW9uKCkKKyAgICB7CisgICAgICAgIHdoaWxlIChuZXh0UGFydGl0aW9uUG9zaXRpb25Gcm9tSW5kZXggPCBkYXRhRmlsZS5sZW5ndGgoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGF0YUZpbGUuc2VlayhuZXh0UGFydGl0aW9uUG9zaXRpb25Gcm9tSW5kZXgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvd0lmRmF0YWwodGgpOworICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2Fybih0aCwgIkZhaWxlZCB0byBzZWVrIHRvIG5leHQgcGFydGl0aW9uIHBvc2l0aW9uICVkIiwgbmV4dFBhcnRpdGlvblBvc2l0aW9uRnJvbUluZGV4KTsKKyAgICAgICAgICAgICAgICBiYWRQYXJ0aXRpb25zKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVwZGF0ZUluZGV4S2V5KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGhyb3dJZkNhbm5vdENvbnRpbnVlKERlY29yYXRlZEtleSBrZXksIFRocm93YWJsZSB0aCkKKyAgICB7CisgICAgICAgIGlmIChpc0luZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4oIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNjcnViYmluZyB0aGUgcGFydGl0aW9uIHdpdGgga2V5ICclcycgZm9yIGFuIGluZGV4IHRhYmxlLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2NydWJiaW5nIHdpbGwgYWJvcnQgZm9yIHRoaXMgdGFibGUgYW5kIHRoZSBpbmRleCB3aWxsIGJlIHJlYnVpbHQuIiwga2V5U3RyaW5nKGtleSkpOworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXJyb3IodGgpOworICAgICAgICB9CisKKyAgICAgICAgc3VwZXIudGhyb3dJZkNhbm5vdENvbnRpbnVlKGtleSwgdGgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICB7CisgICAgICAgIGZpbGVBY2Nlc3NMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZVF1aWV0bHkoZGF0YUZpbGUpOworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlUXVpZXRseShpbmRleEZpbGUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgZmlsZUFjY2Vzc0xvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnVGFibGVWZXJpZmllci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ1RhYmxlVmVyaWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGRmM2UxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ1RhYmxlVmVyaWZpZXIuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLk5vU3VjaEZpbGVFeGNlcHRpb247CitpbXBvcnQgamF2YS50aW1lLkluc3RhbnQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklWZXJpZmllcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNvcnRlZFRhYmxlVmVyaWZpZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk91dHB1dEhhbmRsZXI7CisKK3B1YmxpYyBjbGFzcyBCaWdUYWJsZVZlcmlmaWVyIGV4dGVuZHMgU29ydGVkVGFibGVWZXJpZmllcjxCaWdUYWJsZVJlYWRlcj4gaW1wbGVtZW50cyBJVmVyaWZpZXIKK3sKKyAgICBwdWJsaWMgQmlnVGFibGVWZXJpZmllcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIEJpZ1RhYmxlUmVhZGVyIHNzdGFibGUsIE91dHB1dEhhbmRsZXIgb3V0cHV0SGFuZGxlciwgYm9vbGVhbiBpc09mZmxpbmUsIE9wdGlvbnMgb3B0aW9ucykKKyAgICB7CisgICAgICAgIHN1cGVyKGNmcywgc3N0YWJsZSwgb3V0cHV0SGFuZGxlciwgaXNPZmZsaW5lLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlQYXJ0aXRpb24oRGVjb3JhdGVkS2V5IGtleSwgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yKQorICAgIHsKKyAgICAgICAgUm93IGZpcnN0ID0gbnVsbDsKKyAgICAgICAgaW50IGR1cGxpY2F0ZVJvd3MgPSAwOworICAgICAgICBsb25nIG1pblRpbWVzdGFtcCA9IExvbmcuTUFYX1ZBTFVFOworICAgICAgICBsb25nIG1heFRpbWVzdGFtcCA9IExvbmcuTUlOX1ZBTFVFOworICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQorICAgICAgICB7CisgICAgICAgICAgICBVbmZpbHRlcmVkIHVmID0gaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgaWYgKHVmLmlzUm93KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUm93IHJvdyA9IChSb3cpIHVmOworICAgICAgICAgICAgICAgIGlmIChmaXJzdCAhPSBudWxsICYmIGZpcnN0LmNsdXN0ZXJpbmcoKS5lcXVhbHMocm93LmNsdXN0ZXJpbmcoKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVSb3dzKys7CisgICAgICAgICAgICAgICAgICAgIGZvciAoQ2VsbCBjZWxsIDogcm93LmNlbGxzKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heFRpbWVzdGFtcCA9IE1hdGgubWF4KGNlbGwudGltZXN0YW1wKCksIG1heFRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5UaW1lc3RhbXAgPSBNYXRoLm1pbihjZWxsLnRpbWVzdGFtcCgpLCBtaW5UaW1lc3RhbXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkdXBsaWNhdGVSb3dzID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0R1cGxpY2F0ZXMoa2V5LCBmaXJzdCwgZHVwbGljYXRlUm93cywgbWluVGltZXN0YW1wLCBtYXhUaW1lc3RhbXApOworICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVSb3dzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSByb3c7CisgICAgICAgICAgICAgICAgICAgIG1heFRpbWVzdGFtcCA9IExvbmcuTUlOX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICBtaW5UaW1lc3RhbXAgPSBMb25nLk1BWF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGR1cGxpY2F0ZVJvd3MgPiAwKQorICAgICAgICAgICAgbG9nRHVwbGljYXRlcyhrZXksIGZpcnN0LCBkdXBsaWNhdGVSb3dzLCBtaW5UaW1lc3RhbXAsIG1heFRpbWVzdGFtcCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUluZGV4U3VtbWFyeSgpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5kZWJ1ZygiRGVzZXJpYWxpemluZyBpbmRleCBzdW1tYXJ5IGZvciAlcyIsIHNzdGFibGUpOworICAgICAgICAgICAgZGVzZXJpYWxpemVJbmRleFN1bW1hcnkoc3N0YWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQorICAgICAgICB7CisgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dCgiSW5kZXggc3VtbWFyeSBpcyBjb3JydXB0IC0gaWYgaXQgaXMgcmVtb3ZlZCBpdCB3aWxsIGdldCByZWJ1aWx0IG9uIHN0YXJ0dXAgJXMiLCBzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlNVTU1BUlkpKTsKKyAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2Fybih0KTsKKyAgICAgICAgICAgIG1hcmtBbmRUaHJvdyh0LCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlJbmRleCgpCisgICAgeworICAgICAgICB2ZXJpZnlJbmRleFN1bW1hcnkoKTsKKyAgICAgICAgc3VwZXIudmVyaWZ5SW5kZXgoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9nRHVwbGljYXRlcyhEZWNvcmF0ZWRLZXkga2V5LCBSb3cgZmlyc3QsIGludCBkdXBsaWNhdGVSb3dzLCBsb25nIG1pblRpbWVzdGFtcCwgbG9uZyBtYXhUaW1lc3RhbXApCisgICAgeworICAgICAgICBTdHJpbmcga2V5U3RyaW5nID0gc3N0YWJsZS5tZXRhZGF0YSgpLnBhcnRpdGlvbktleVR5cGUuZ2V0U3RyaW5nKGtleS5nZXRLZXkoKSk7CisgICAgICAgIGxvbmcgZmlyc3RNYXhUcyA9IExvbmcuTUlOX1ZBTFVFOworICAgICAgICBsb25nIGZpcnN0TWluVHMgPSBMb25nLk1BWF9WQUxVRTsKKyAgICAgICAgZm9yIChDZWxsIGNlbGwgOiBmaXJzdC5jZWxscygpKQorICAgICAgICB7CisgICAgICAgICAgICBmaXJzdE1heFRzID0gTWF0aC5tYXgoZmlyc3RNYXhUcywgY2VsbC50aW1lc3RhbXAoKSk7CisgICAgICAgICAgICBmaXJzdE1pblRzID0gTWF0aC5taW4oZmlyc3RNaW5UcywgY2VsbC50aW1lc3RhbXAoKSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0SGFuZGxlci5vdXRwdXQoIiVkIGR1cGxpY2F0ZSByb3dzIGZvdW5kIGZvciBbJXMgJXNdIGluICVzLiVzICglcyksIHRpbWVzdGFtcHM6IFtmaXJzdCByb3cgKCVzLCAlcyldLCBbZHVwbGljYXRlcyAoJXMsICVzLCBlcTolYildIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlUm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5U3RyaW5nLCBmaXJzdC5jbHVzdGVyaW5nKCkudG9TdHJpbmcoc3N0YWJsZS5tZXRhZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5tZXRhZGF0YSgpLmtleXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLm1ldGFkYXRhKCkubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZVN0cmluZyhmaXJzdE1pblRzKSwgZGF0ZVN0cmluZyhmaXJzdE1heFRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZVN0cmluZyhtaW5UaW1lc3RhbXApLCBkYXRlU3RyaW5nKG1heFRpbWVzdGFtcCksIG1pblRpbWVzdGFtcCA9PSBtYXhUaW1lc3RhbXApOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGRhdGVTdHJpbmcobG9uZyB0aW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEluc3RhbnQub2ZFcG9jaE1pbGxpKFRpbWVVbml0Lk1JQ1JPU0VDT05EUy50b01pbGxpcyh0aW1lKSkudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGVzZXJpYWxpemVJbmRleFN1bW1hcnkoU1NUYWJsZVJlYWRlciBzc3RhYmxlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIEluZGV4U3VtbWFyeUNvbXBvbmVudCBzdW1tYXJ5Q29tcG9uZW50ID0gSW5kZXhTdW1tYXJ5Q29tcG9uZW50LmxvYWQoc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5TVU1NQVJZKSwgY2ZzLm1ldGFkYXRhKCkpOworICAgICAgICBpZiAoc3VtbWFyeUNvbXBvbmVudCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEZpbGVFeGNlcHRpb24oIkluZGV4IHN1bW1hcnkgY29tcG9uZW50IG9mIHNzdGFibGUgIiArIHNzdGFibGUuZGVzY3JpcHRvciArICIgaXMgbWlzc2luZyIpOworICAgICAgICBGaWxlVXRpbHMuY2xvc2VRdWlldGx5KHN1bW1hcnlDb21wb25lbnQuaW5kZXhTdW1tYXJ5KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnVGFibGVXcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9CaWdUYWJsZVdyaXRlci5qYXZhCmluZGV4IGU4ZGZmMzIuLjVhZTUyY2YgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9CaWdUYWJsZVdyaXRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9CaWdUYWJsZVdyaXRlci5qYXZhCkBAIC0xNyw1MzkgKzE3LDI2OCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZzsKIAotCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVOZXdUcmFja2VyOwotCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5DaHVua0NhY2hlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmFuc2Zvcm0uVHJhbnNmb3JtYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlbGV0aW9uVGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuSUxpZmVjeWNsZVRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVOZXdUcmFja2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTV3JpdGVFcnJvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzcy5Db21wcmVzc2VkU2VxdWVudGlhbFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzcy5JQ29tcHJlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZsdXNoT2JzZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFJvd0luZGV4RW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRG93bnNhbXBsaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5EYXRhQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LkluZGV4Q29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5TdGF0c01ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29tcHJlc3Npb25QYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlNoYXJlZENsb3NlYWJsZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5UcmFuc2FjdGlvbmFsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNvcnRlZFRhYmxlV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQuQ29tcG9uZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeS5JbmRleFN1bW1hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5pbmRleHN1bW1hcnkuSW5kZXhTdW1tYXJ5QnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmtleWNhY2hlLktleUNhY2hlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUua2V5Y2FjaGUuS2V5Q2FjaGVTdXBwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YVBvc2l0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLk1tYXBwZWRSZWdpb25zQ2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2FjaGVTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkVzdGltYXRlZEhpc3RvZ3JhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5JRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpWTVN0YWJpbGl0eUluc3BlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOwogCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZS5CdWlsZGVyLk5PX0xFTkdUSF9PVkVSUklERTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLmN1cnJlbnRUaW1lTWlsbGlzOwogCi1wdWJsaWMgY2xhc3MgQmlnVGFibGVXcml0ZXIgZXh0ZW5kcyBTU1RhYmxlV3JpdGVyCitwdWJsaWMgY2xhc3MgQmlnVGFibGVXcml0ZXIgZXh0ZW5kcyBTb3J0ZWRUYWJsZVdyaXRlcjxCaWdGb3JtYXRQYXJ0aXRpb25Xcml0ZXI+CiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEJpZ1RhYmxlV3JpdGVyLmNsYXNzKTsKIAotICAgIHByaXZhdGUgZmluYWwgQ29sdW1uSW5kZXggY29sdW1uSW5kZXhXcml0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJbmRleFdyaXRlciBpd3JpdGVyOwotICAgIHByaXZhdGUgZmluYWwgRmlsZUhhbmRsZS5CdWlsZGVyIGRidWlsZGVyOwotICAgIHByb3RlY3RlZCBmaW5hbCBTZXF1ZW50aWFsV3JpdGVyIGRhdGFGaWxlOwotICAgIHByaXZhdGUgRGVjb3JhdGVkS2V5IGxhc3RXcml0dGVuS2V5OwotICAgIHByaXZhdGUgRGF0YVBvc2l0aW9uIGRhdGFNYXJrOwotICAgIHByaXZhdGUgbG9uZyBsYXN0RWFybHlPcGVuTGVuZ3RoID0gMDsKLSAgICBwcml2YXRlIGZpbmFsIE9wdGlvbmFsPENodW5rQ2FjaGU+IGNodW5rQ2FjaGUgPSBPcHRpb25hbC5vZk51bGxhYmxlKENodW5rQ2FjaGUuaW5zdGFuY2UpOworICAgIHByaXZhdGUgZmluYWwgSW5kZXhXcml0ZXIgaW5kZXhXcml0ZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBSb3dJbmRleEVudHJ5LkluZGV4U2VyaWFsaXplciByb3dJbmRleEVudHJ5U2VyaWFsaXplcjsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxEZWNvcmF0ZWRLZXksIEFic3RyYWN0Um93SW5kZXhFbnRyeT4gY2FjaGVkS2V5cyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gc2hvdWxkTWlncmF0ZUtleUNhY2hlOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXF1ZW50aWFsV3JpdGVyT3B0aW9uIHdyaXRlck9wdGlvbiA9IFNlcXVlbnRpYWxXcml0ZXJPcHRpb24ubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50cmlja2xlRnN5bmMoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFRyaWNrbGVGc3luYygpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHJpY2tsZUZzeW5jQnl0ZUludGVydmFsKERhdGFiYXNlRGVzY3JpcHRvci5nZXRUcmlja2xlRnN5bmNJbnRlcnZhbEluS2lCKCkgKiAxMDI0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLQotICAgIHB1YmxpYyBCaWdUYWJsZVdyaXRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcga2V5Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcmVwYWlyZWRBdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVVSUQgcGVuZGluZ1JlcGFpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1RyYW5zaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGFDb2xsZWN0b3IgbWV0YWRhdGFDb2xsZWN0b3IsIAotICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxTU1RhYmxlRmx1c2hPYnNlcnZlcj4gb2JzZXJ2ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBMaWZlY3ljbGVOZXdUcmFja2VyIGxpZmVjeWNsZU5ld1RyYWNrZXIpCisgICAgcHVibGljIEJpZ1RhYmxlV3JpdGVyKEJ1aWxkZXIgYnVpbGRlciwgTGlmZWN5Y2xlTmV3VHJhY2tlciBsaWZlY3ljbGVOZXdUcmFja2VyLCBTU1RhYmxlLk93bmVyIG93bmVyKQogICAgIHsKLSAgICAgICAgc3VwZXIoZGVzY3JpcHRvciwga2V5Q291bnQsIHJlcGFpcmVkQXQsIHBlbmRpbmdSZXBhaXIsIGlzVHJhbnNpZW50LCBtZXRhZGF0YSwgbWV0YWRhdGFDb2xsZWN0b3IsIGhlYWRlciwgb2JzZXJ2ZXJzKTsKLSAgICAgICAgbGlmZWN5Y2xlTmV3VHJhY2tlci50cmFja05ldyh0aGlzKTsgLy8gbXVzdCB0cmFjayBiZWZvcmUgYW55IGZpbGVzIGFyZSBjcmVhdGVkCisgICAgICAgIHN1cGVyKGJ1aWxkZXIsIGxpZmVjeWNsZU5ld1RyYWNrZXIsIG93bmVyKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGJ1aWxkZXIuZ2V0Um93SW5kZXhFbnRyeVNlcmlhbGl6ZXIoKSk7CisgICAgICAgIGNoZWNrTm90TnVsbChidWlsZGVyLmdldEluZGV4V3JpdGVyKCkpOwogCi0gICAgICAgIGlmIChjb21wcmVzc2lvbikKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgQ29tcHJlc3Npb25QYXJhbXMgY29tcHJlc3Npb25QYXJhbXMgPSBjb21wcmVzc2lvbkZvcihsaWZlY3ljbGVOZXdUcmFja2VyLm9wVHlwZSgpKTsKLQotICAgICAgICAgICAgZGF0YUZpbGUgPSBuZXcgQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIobmV3IEZpbGUoZ2V0RmlsZW5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5DT01QUkVTU0lPTl9JTkZPKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRJR0VTVCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyT3B0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25QYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUNvbGxlY3Rvcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBkYXRhRmlsZSA9IG5ldyBDaGVja3N1bW1lZFNlcXVlbnRpYWxXcml0ZXIobmV3IEZpbGUoZ2V0RmlsZW5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkNSQykpLAotICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5ESUdFU1QpKSwKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyT3B0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBkYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpLmNvbXByZXNzZWQoY29tcHJlc3Npb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1tYXBwZWQoRGF0YWJhc2VEZXNjcmlwdG9yLmdldERpc2tBY2Nlc3NNb2RlKCkgPT0gQ29uZmlnLkRpc2tBY2Nlc3NNb2RlLm1tYXApOwotICAgICAgICBjaHVua0NhY2hlLmlmUHJlc2VudChkYnVpbGRlcjo6d2l0aENodW5rQ2FjaGUpOwotICAgICAgICBpd3JpdGVyID0gbmV3IEluZGV4V3JpdGVyKGtleUNvdW50KTsKLQotICAgICAgICBjb2x1bW5JbmRleFdyaXRlciA9IG5ldyBDb2x1bW5JbmRleCh0aGlzLmhlYWRlciwgZGF0YUZpbGUsIGRlc2NyaXB0b3IudmVyc2lvbiwgdGhpcy5vYnNlcnZlcnMsIGdldFJvd0luZGV4RW50cnlTZXJpYWxpemVyKCkuaW5kZXhJbmZvU2VyaWFsaXplcigpKTsKKyAgICAgICAgdGhpcy5yb3dJbmRleEVudHJ5U2VyaWFsaXplciA9IGJ1aWxkZXIuZ2V0Um93SW5kZXhFbnRyeVNlcmlhbGl6ZXIoKTsKKyAgICAgICAgdGhpcy5pbmRleFdyaXRlciA9IGJ1aWxkZXIuZ2V0SW5kZXhXcml0ZXIoKTsKKyAgICAgICAgdGhpcy5zaG91bGRNaWdyYXRlS2V5Q2FjaGUgPSBEYXRhYmFzZURlc2NyaXB0b3Iuc2hvdWxkTWlncmF0ZUtleWNhY2hlT25Db21wYWN0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsaWZlY3ljbGVOZXdUcmFja2VyIGluc3RhbmNlb2YgSUxpZmVjeWNsZVRyYW5zYWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgISgoSUxpZmVjeWNsZVRyYW5zYWN0aW9uKSBsaWZlY3ljbGVOZXdUcmFja2VyKS5pc09mZmxpbmUoKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBHaXZlbiBhbiBPcFR5cGUsIGRldGVybWluZSB0aGUgY29ycmVjdCBDb21wcmVzc2lvbiBQYXJhbWV0ZXJzCi0gICAgICogQHBhcmFtIG9wVHlwZQotICAgICAqIEByZXR1cm4ge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wcmVzc2lvblBhcmFtc30KLSAgICAgKi8KLSAgICBwcml2YXRlIENvbXByZXNzaW9uUGFyYW1zIGNvbXByZXNzaW9uRm9yKGZpbmFsIE9wZXJhdGlvblR5cGUgb3BUeXBlKQotICAgIHsKLSAgICAgICAgQ29tcHJlc3Npb25QYXJhbXMgY29tcHJlc3Npb25QYXJhbXMgPSBtZXRhZGF0YS5nZXRMb2NhbCgpLnBhcmFtcy5jb21wcmVzc2lvbjsKLSAgICAgICAgZmluYWwgSUNvbXByZXNzb3IgY29tcHJlc3NvciA9IGNvbXByZXNzaW9uUGFyYW1zLmdldFNzdGFibGVDb21wcmVzc29yKCk7Ci0KLSAgICAgICAgaWYgKG51bGwgIT0gY29tcHJlc3NvciAmJiBvcFR5cGUgPT0gT3BlcmF0aW9uVHlwZS5GTFVTSCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgZmx1c2hpbmcgb3V0IG9mIHRoZSBtZW10YWJsZSB0aHJvdWdocHV0IG9mIHRoZSBjb21wcmVzc29yIGlzIGNyaXRpY2FsIGFzIGZsdXNoZXMsCi0gICAgICAgICAgICAvLyBlc3BlY2lhbGx5IG9mIGxhcmdlIHRhYmxlcywgY2FuIHF1ZXVlIHVwIGFuZCBwb3RlbnRpYWxseSBibG9jayB3cml0ZXMuCi0gICAgICAgICAgICAvLyBUaGlzIG9wdGltaXphdGlvbiBhbGxvd3MgdXMgdG8gZmFsbCBiYWNrIHRvIGEgZmFzdGVyIGNvbXByZXNzb3IgaWYgYSBwYXJ0aWN1bGFyCi0gICAgICAgICAgICAvLyBjb21wcmVzc2lvbiBhbGdvcml0aG0gaW5kaWNhdGVzIHdlIHNob3VsZC4gU2VlIENBU1NBTkRSQS0xNTM3OSBmb3IgbW9yZSBkZXRhaWxzLgotICAgICAgICAgICAgc3dpdGNoIChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Rmx1c2hDb21wcmVzc2lvbigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEl0IGlzIHJlbGF0aXZlbHkgZWFzaWVyIHRvIGluc2VydCBhIE5vb3AgY29tcHJlc3NvciB0aGFuIHRvIGRpc2FibGUgY29tcHJlc3NlZCB3cml0aW5nCi0gICAgICAgICAgICAgICAgLy8gZW50aXJlbHkgYXMgdGhlICJjb21wcmVzc2lvbiIgbWVtYmVyIGZpZWxkIGlzIHByb3ZpZGVkIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgY2xhc3MuCi0gICAgICAgICAgICAgICAgLy8gSXQgbWF5IG1ha2Ugc2Vuc2UgaW4gdGhlIGZ1dHVyZSB0byByZWZhY3RvciB0aGUgb3duZXJzaGlwIG9mIHRoZSBjb21wcmVzc2lvbiBmbGFnIHNvIHRoYXQKLSAgICAgICAgICAgICAgICAvLyBXZSBjYW4gYnlwYXNzIHRoZSBDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlciBpbiB0aGlzIGNhc2UgZW50aXJlbHkuCi0gICAgICAgICAgICAgICAgY2FzZSBub25lOgotICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvblBhcmFtcyA9IENvbXByZXNzaW9uUGFyYW1zLk5PT1A7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgZmFzdDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wcmVzc29yLnJlY29tbWVuZGVkVXNlcygpLmNvbnRhaW5zKElDb21wcmVzc29yLlVzZXMuRkFTVF9DT01QUkVTU0lPTikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IGNvbXByZXNzb3IgaXMgZ2VuZXJhbGx5IGZhc3QgKExaNCB3aXRoIDE2S2lCIGJsb2NrIHNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvblBhcmFtcyA9IENvbXByZXNzaW9uUGFyYW1zLkRFRkFVTFQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgdGFibGU6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29tcHJlc3Npb25QYXJhbXM7Ci0gICAgfQotCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgbWFyaygpCiAgICAgewotICAgICAgICBkYXRhTWFyayA9IGRhdGFGaWxlLm1hcmsoKTsKLSAgICAgICAgaXdyaXRlci5tYXJrKCk7CisgICAgICAgIHN1cGVyLm1hcmsoKTsKKyAgICAgICAgaW5kZXhXcml0ZXIubWFyaygpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJlc2V0QW5kVHJ1bmNhdGUoKQogICAgIHsKLSAgICAgICAgZGF0YUZpbGUucmVzZXRBbmRUcnVuY2F0ZShkYXRhTWFyayk7Ci0gICAgICAgIGl3cml0ZXIucmVzZXRBbmRUcnVuY2F0ZSgpOworICAgICAgICBzdXBlci5yZXNldEFuZFRydW5jYXRlKCk7CisgICAgICAgIGluZGV4V3JpdGVyLnJlc2V0QW5kVHJ1bmNhdGUoKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIHNhbml0eSBjaGVja3Mgb24gQHBhcmFtIGRlY29yYXRlZEtleSBhbmQgQHJldHVybiB0aGUgcG9zaXRpb24gaW4gdGhlIGRhdGEgZmlsZSBiZWZvcmUgYW55IGRhdGEgaXMgd3JpdHRlbgotICAgICAqLwotICAgIHByb3RlY3RlZCBsb25nIGJlZm9yZUFwcGVuZChEZWNvcmF0ZWRLZXkgZGVjb3JhdGVkS2V5KQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uU3RhcnRQYXJ0aXRpb24oRGVjb3JhdGVkS2V5IGtleSkKICAgICB7Ci0gICAgICAgIGFzc2VydCBkZWNvcmF0ZWRLZXkgIT0gbnVsbCA6ICJLZXlzIG11c3Qgbm90IGJlIG51bGwiOyAvLyBlbXB0eSBrZXlzIEFSRSBhbGxvd2VkIGIvYyBvZiBpbmRleGVkIGNvbHVtbiB2YWx1ZXMKLSAgICAgICAgaWYgKGxhc3RXcml0dGVuS2V5ICE9IG51bGwgJiYgbGFzdFdyaXR0ZW5LZXkuY29tcGFyZVRvKGRlY29yYXRlZEtleSkgPj0gMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJMYXN0IHdyaXR0ZW4ga2V5ICIgKyBsYXN0V3JpdHRlbktleSArICIgPj0gY3VycmVudCBrZXkgIiArIGRlY29yYXRlZEtleSArICIgd3JpdGluZyBpbnRvICIgKyBnZXRGaWxlbmFtZSgpKTsKLSAgICAgICAgcmV0dXJuIChsYXN0V3JpdHRlbktleSA9PSBudWxsKSA/IDAgOiBkYXRhRmlsZS5wb3NpdGlvbigpOworICAgICAgICBub3RpZnlPYnNlcnZlcnMobyAtPiBvLnN0YXJ0UGFydGl0aW9uKGtleSwgcGFydGl0aW9uV3JpdGVyLmdldEluaXRpYWxQb3NpdGlvbigpLCBpbmRleFdyaXRlci53cml0ZXIucG9zaXRpb24oKSkpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBhZnRlckFwcGVuZChEZWNvcmF0ZWRLZXkgZGVjb3JhdGVkS2V5LCBsb25nIGRhdGFFbmQsIFJvd0luZGV4RW50cnkgaW5kZXgsIEJ5dGVCdWZmZXIgaW5kZXhJbmZvKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUm93SW5kZXhFbnRyeSBjcmVhdGVSb3dJbmRleEVudHJ5KERlY29yYXRlZEtleSBrZXksIERlbGV0aW9uVGltZSBwYXJ0aXRpb25MZXZlbERlbGV0aW9uLCBsb25nIGZpbmlzaFJlc3VsdCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBtZXRhZGF0YUNvbGxlY3Rvci5hZGRLZXkoZGVjb3JhdGVkS2V5LmdldEtleSgpKTsKLSAgICAgICAgbGFzdFdyaXR0ZW5LZXkgPSBkZWNvcmF0ZWRLZXk7Ci0gICAgICAgIGxhc3QgPSBsYXN0V3JpdHRlbktleTsKLSAgICAgICAgaWYgKGZpcnN0ID09IG51bGwpCi0gICAgICAgICAgICBmaXJzdCA9IGxhc3RXcml0dGVuS2V5OworICAgICAgICAvLyBhZnRlckFwcGVuZCgpIHdyaXRlcyB0aGUgcGFydGl0aW9uIGtleSBiZWZvcmUgdGhlIGZpcnN0IFJvd0luZGV4RW50cnkgLSBzbyB3ZSBoYXZlIHRvIGFkZCBpdCdzCisgICAgICAgIC8vIHNlcmlhbGl6ZWQgc2l6ZSB0byB0aGUgaW5kZXgtd3JpdGVyIHBvc2l0aW9uCisgICAgICAgIGxvbmcgaW5kZXhGaWxlUG9zaXRpb24gPSBCeXRlQnVmZmVyVXRpbC5zZXJpYWxpemVkU2l6ZVdpdGhTaG9ydExlbmd0aChrZXkuZ2V0S2V5KCkpICsgaW5kZXhXcml0ZXIud3JpdGVyLnBvc2l0aW9uKCk7CiAKLSAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJ3cm90ZSB7fSBhdCB7fSIsIGRlY29yYXRlZEtleSwgZGF0YUVuZCk7Ci0gICAgICAgIGl3cml0ZXIuYXBwZW5kKGRlY29yYXRlZEtleSwgaW5kZXgsIGRhdGFFbmQsIGluZGV4SW5mbyk7Ci0gICAgfQorICAgICAgICBSb3dJbmRleEVudHJ5IGVudHJ5ID0gUm93SW5kZXhFbnRyeS5jcmVhdGUocGFydGl0aW9uV3JpdGVyLmdldEluaXRpYWxQb3NpdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhGaWxlUG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25MZXZlbERlbGV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uV3JpdGVyLmdldEhlYWRlckxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uV3JpdGVyLmdldENvbHVtbkluZGV4Q291bnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbldyaXRlci5pbmRleEluZm9TZXJpYWxpemVkU2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uV3JpdGVyLmluZGV4U2FtcGxlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uV3JpdGVyLm9mZnNldHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0luZGV4RW50cnlTZXJpYWxpemVyLmluZGV4SW5mb1NlcmlhbGl6ZXIoKSk7CiAKLSAgICAvKioKLSAgICAgKiBBcHBlbmRzIHBhcnRpdGlvbiBkYXRhIHRvIHRoaXMgd3JpdGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yIHRoZSBwYXJ0aXRpb24gdG8gd3JpdGUKLSAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGluZGV4IGVudHJ5IGlmIHNvbWV0aGluZyB3YXMgd3JpdHRlbiwgdGhhdCBpcyBpZiB7QGNvZGUgaXRlcmF0b3J9Ci0gICAgICogd2Fzbid0IGVtcHR5LCB7QGNvZGUgbnVsbH0gb3RoZXJ3aXNlLgotICAgICAqCi0gICAgICogQHRocm93cyBGU1dyaXRlRXJyb3IgaWYgYSB3cml0ZSB0byB0aGUgZGF0YUZpbGUgZmFpbHMKLSAgICAgKi8KLSAgICBwdWJsaWMgUm93SW5kZXhFbnRyeSBhcHBlbmQoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yKQotICAgIHsKLSAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IGl0ZXJhdG9yLnBhcnRpdGlvbktleSgpOworICAgICAgICBpbmRleFdyaXRlci5hcHBlbmQoa2V5LCBlbnRyeSwgZGF0YVdyaXRlci5wb3NpdGlvbigpLCBwYXJ0aXRpb25Xcml0ZXIuYnVmZmVyKCkpOwogCi0gICAgICAgIGlmIChrZXkuZ2V0S2V5KCkucmVtYWluaW5nKCkgPiBGQlV0aWxpdGllcy5NQVhfVU5TSUdORURfU0hPUlQpCisgICAgICAgIGlmIChzaG91bGRNaWdyYXRlS2V5Q2FjaGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiS2V5IHNpemUge30gZXhjZWVkcyBtYXhpbXVtIG9mIHt9LCBza2lwcGluZyByb3ciLCBrZXkuZ2V0S2V5KCkucmVtYWluaW5nKCksIEZCVXRpbGl0aWVzLk1BWF9VTlNJR05FRF9TSE9SVCk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpdGVyYXRvci5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBsb25nIHN0YXJ0UG9zaXRpb24gPSBiZWZvcmVBcHBlbmQoa2V5KTsKLSAgICAgICAgb2JzZXJ2ZXJzLmZvckVhY2goKG8pIC0+IG8uc3RhcnRQYXJ0aXRpb24oa2V5LCBpd3JpdGVyLmluZGV4RmlsZS5wb3NpdGlvbigpKSk7Ci0KLSAgICAgICAgLy9SZXVzZSB0aGUgd3JpdGVyIGZvciBlYWNoIHJvdwotICAgICAgICBjb2x1bW5JbmRleFdyaXRlci5yZXNldCgpOwotCi0gICAgICAgIHRyeSAoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGNvbGxlY3RpbmcgPSBUcmFuc2Zvcm1hdGlvbi5hcHBseShpdGVyYXRvciwgbmV3IFN0YXRzQ29sbGVjdG9yKG1ldGFkYXRhQ29sbGVjdG9yKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbHVtbkluZGV4V3JpdGVyLmJ1aWxkUm93SW5kZXgoY29sbGVjdGluZyk7Ci0KLSAgICAgICAgICAgIC8vIGFmdGVyQXBwZW5kKCkgd3JpdGVzIHRoZSBwYXJ0aXRpb24ga2V5IGJlZm9yZSB0aGUgZmlyc3QgUm93SW5kZXhFbnRyeSAtIHNvIHdlIGhhdmUgdG8gYWRkIGl0J3MKLSAgICAgICAgICAgIC8vIHNlcmlhbGl6ZWQgc2l6ZSB0byB0aGUgaW5kZXgtd3JpdGVyIHBvc2l0aW9uCi0gICAgICAgICAgICBsb25nIGluZGV4RmlsZVBvc2l0aW9uID0gQnl0ZUJ1ZmZlclV0aWwuc2VyaWFsaXplZFNpemVXaXRoU2hvcnRMZW5ndGgoa2V5LmdldEtleSgpKSArIGl3cml0ZXIuaW5kZXhGaWxlLnBvc2l0aW9uKCk7Ci0KLSAgICAgICAgICAgIFJvd0luZGV4RW50cnkgZW50cnkgPSBSb3dJbmRleEVudHJ5LmNyZWF0ZShzdGFydFBvc2l0aW9uLCBpbmRleEZpbGVQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW5nLnBhcnRpdGlvbkxldmVsRGVsZXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5JbmRleFdyaXRlci5oZWFkZXJMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXhXcml0ZXIuY29sdW1uSW5kZXhDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5JbmRleFdyaXRlci5pbmRleEluZm9TZXJpYWxpemVkU2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4V3JpdGVyLmluZGV4U2FtcGxlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4V3JpdGVyLm9mZnNldHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSb3dJbmRleEVudHJ5U2VyaWFsaXplcigpLmluZGV4SW5mb1NlcmlhbGl6ZXIoKSk7Ci0KLSAgICAgICAgICAgIGxvbmcgZW5kUG9zaXRpb24gPSBkYXRhRmlsZS5wb3NpdGlvbigpOwotICAgICAgICAgICAgbG9uZyByb3dTaXplID0gZW5kUG9zaXRpb24gLSBzdGFydFBvc2l0aW9uOwotICAgICAgICAgICAgbWF5YmVMb2dMYXJnZVBhcnRpdGlvbldhcm5pbmcoa2V5LCByb3dTaXplKTsKLSAgICAgICAgICAgIG1heWJlTG9nTWFueVRvbWJzdG9uZXNXYXJuaW5nKGtleSwgbWV0YWRhdGFDb2xsZWN0b3IudG90YWxUb21ic3RvbmVzKTsKLSAgICAgICAgICAgIG1ldGFkYXRhQ29sbGVjdG9yLmFkZFBhcnRpdGlvblNpemVJbkJ5dGVzKHJvd1NpemUpOwotICAgICAgICAgICAgYWZ0ZXJBcHBlbmQoa2V5LCBlbmRQb3NpdGlvbiwgZW50cnksIGNvbHVtbkluZGV4V3JpdGVyLmJ1ZmZlcigpKTsKLSAgICAgICAgICAgIHJldHVybiBlbnRyeTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24gYm9lKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUGFydGl0aW9uU2VyaWFsaXphdGlvbkV4Y2VwdGlvbihpdGVyYXRvciwgYm9lKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZTV3JpdGVFcnJvcihlLCBkYXRhRmlsZS5nZXRQYXRoKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSb3dJbmRleEVudHJ5LkluZGV4U2VyaWFsaXplcjxJbmRleEluZm8+IGdldFJvd0luZGV4RW50cnlTZXJpYWxpemVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoUm93SW5kZXhFbnRyeS5JbmRleFNlcmlhbGl6ZXI8SW5kZXhJbmZvPikgcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG1heWJlTG9nTGFyZ2VQYXJ0aXRpb25XYXJuaW5nKERlY29yYXRlZEtleSBrZXksIGxvbmcgcm93U2l6ZSkKLSAgICB7Ci0gICAgICAgIGlmIChyb3dTaXplID4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbXBhY3Rpb25MYXJnZVBhcnRpdGlvbldhcm5pbmdUaHJlc2hvbGQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGtleVN0cmluZyA9IG1ldGFkYXRhKCkucGFydGl0aW9uS2V5VHlwZS5nZXRTdHJpbmcoa2V5LmdldEtleSgpKTsKLSAgICAgICAgICAgIGxvZ2dlci53YXJuKCJXcml0aW5nIGxhcmdlIHBhcnRpdGlvbiB7fS97fTp7fSAoe30pIHRvIHNzdGFibGUge30iLCBtZXRhZGF0YS5rZXlzcGFjZSwgbWV0YWRhdGEubmFtZSwga2V5U3RyaW5nLCBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShyb3dTaXplKSwgZ2V0RmlsZW5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbWF5YmVMb2dNYW55VG9tYnN0b25lc1dhcm5pbmcoRGVjb3JhdGVkS2V5IGtleSwgaW50IHRvbWJzdG9uZUNvdW50KQotICAgIHsKLSAgICAgICAgaWYgKHRvbWJzdG9uZUNvdW50ID4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbXBhY3Rpb25Ub21ic3RvbmVXYXJuaW5nVGhyZXNob2xkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXlTdHJpbmcgPSBtZXRhZGF0YSgpLnBhcnRpdGlvbktleVR5cGUuZ2V0U3RyaW5nKGtleS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICBsb2dnZXIud2FybigiV3JpdGluZyB7fSB0b21ic3RvbmVzIHRvIHt9L3t9Ont9IGluIHNzdGFibGUge30iLCB0b21ic3RvbmVDb3VudCwgbWV0YWRhdGEua2V5c3BhY2UsIG1ldGFkYXRhLm5hbWUsIGtleVN0cmluZywgZ2V0RmlsZW5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdGF0c0NvbGxlY3RvciBleHRlbmRzIFRyYW5zZm9ybWF0aW9uCi0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIE1ldGFkYXRhQ29sbGVjdG9yIGNvbGxlY3RvcjsKLSAgICAgICAgcHJpdmF0ZSBpbnQgY2VsbENvdW50OwotCi0gICAgICAgIFN0YXRzQ29sbGVjdG9yKE1ldGFkYXRhQ29sbGVjdG9yIGNvbGxlY3RvcikKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5jb2xsZWN0b3IgPSBjb2xsZWN0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFJvdyBhcHBseVRvU3RhdGljKFJvdyByb3cpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghcm93LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBjZWxsQ291bnQgKz0gUm93cy5jb2xsZWN0U3RhdHMocm93LCBjb2xsZWN0b3IpOwotICAgICAgICAgICAgcmV0dXJuIHJvdzsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgUm93IGFwcGx5VG9Sb3coUm93IHJvdykKLSAgICAgICAgewotICAgICAgICAgICAgY29sbGVjdG9yLnVwZGF0ZUNsdXN0ZXJpbmdWYWx1ZXMocm93LmNsdXN0ZXJpbmcoKSk7Ci0gICAgICAgICAgICBjZWxsQ291bnQgKz0gUm93cy5jb2xsZWN0U3RhdHMocm93LCBjb2xsZWN0b3IpOwotICAgICAgICAgICAgcmV0dXJuIHJvdzsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgUmFuZ2VUb21ic3RvbmVNYXJrZXIgYXBwbHlUb01hcmtlcihSYW5nZVRvbWJzdG9uZU1hcmtlciBtYXJrZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbGxlY3Rvci51cGRhdGVDbHVzdGVyaW5nVmFsdWVzKG1hcmtlci5jbHVzdGVyaW5nKCkpOwotICAgICAgICAgICAgaWYgKG1hcmtlci5pc0JvdW5kYXJ5KCkpCisgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgcmVhZGVyIDogKChJTGlmZWN5Y2xlVHJhbnNhY3Rpb24pIGxpZmVjeWNsZU5ld1RyYWNrZXIpLm9yaWdpbmFscygpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJhbmdlVG9tYnN0b25lQm91bmRhcnlNYXJrZXIgYm0gPSAoUmFuZ2VUb21ic3RvbmVCb3VuZGFyeU1hcmtlciltYXJrZXI7Ci0gICAgICAgICAgICAgICAgY29sbGVjdG9yLnVwZGF0ZShibS5lbmREZWxldGlvblRpbWUoKSk7Ci0gICAgICAgICAgICAgICAgY29sbGVjdG9yLnVwZGF0ZShibS5zdGFydERlbGV0aW9uVGltZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVhZGVyIGluc3RhbmNlb2YgS2V5Q2FjaGVTdXBwb3J0PD8+ICYmICgoS2V5Q2FjaGVTdXBwb3J0PD8+KSByZWFkZXIpLmdldENhY2hlZFBvc2l0aW9uKGtleSwgZmFsc2UpICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYWNoZWRLZXlzLnB1dChrZXksIGVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbGxlY3Rvci51cGRhdGUoKChSYW5nZVRvbWJzdG9uZUJvdW5kTWFya2VyKW1hcmtlcikuZGVsZXRpb25UaW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1hcmtlcjsKICAgICAgICAgfQogCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblBhcnRpdGlvbkNsb3NlKCkKLSAgICAgICAgewotICAgICAgICAgICAgY29sbGVjdG9yLmFkZENlbGxQZXJQYXJ0aXRpb25Db3VudChjZWxsQ291bnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBEZWxldGlvblRpbWUgYXBwbHlUb0RlbGV0aW9uKERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbGxlY3Rvci51cGRhdGUoZGVsZXRpb25UaW1lKTsKLSAgICAgICAgICAgIHJldHVybiBkZWxldGlvblRpbWU7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVudHJ5OwogICAgIH0KIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCi0gICAgcHVibGljIFNTVGFibGVSZWFkZXIgb3BlbkVhcmx5KCkKKyAgICBwcml2YXRlIEJpZ1RhYmxlUmVhZGVyIG9wZW5JbnRlcm5hbChJbmRleFN1bW1hcnlCdWlsZGVyLlJlYWRhYmxlQm91bmRhcnkgYm91bmRhcnksIFNTVGFibGVSZWFkZXIuT3BlblJlYXNvbiBvcGVuUmVhc29uKQogICAgIHsKLSAgICAgICAgLy8gZmluZCB0aGUgbWF4IChleGNsdXNpdmUpIHJlYWRhYmxlIGtleQotICAgICAgICBJbmRleFN1bW1hcnlCdWlsZGVyLlJlYWRhYmxlQm91bmRhcnkgYm91bmRhcnkgPSBpd3JpdGVyLmdldE1heFJlYWRhYmxlKCk7Ci0gICAgICAgIGlmIChib3VuZGFyeSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGFzc2VydCBib3VuZGFyeSA9PSBudWxsIHx8IChib3VuZGFyeS5pbmRleExlbmd0aCA+IDAgJiYgYm91bmRhcnkuZGF0YUxlbmd0aCA+IDApOwogCisgICAgICAgIElGaWx0ZXIgZmlsdGVyID0gbnVsbDsKICAgICAgICAgSW5kZXhTdW1tYXJ5IGluZGV4U3VtbWFyeSA9IG51bGw7Ci0gICAgICAgIEZpbGVIYW5kbGUgaWZpbGUgPSBudWxsOwotICAgICAgICBGaWxlSGFuZGxlIGRmaWxlID0gbnVsbDsKLSAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gbnVsbDsKKyAgICAgICAgRmlsZUhhbmRsZSBkYXRhRmlsZSA9IG51bGw7CisgICAgICAgIEZpbGVIYW5kbGUgaW5kZXhGaWxlID0gbnVsbDsKIAorICAgICAgICBCaWdUYWJsZVJlYWRlci5CdWlsZGVyIGJ1aWxkZXIgPSB1bmJ1aWxkVG8obmV3IEJpZ1RhYmxlUmVhZGVyLkJ1aWxkZXIoZGVzY3JpcHRvciksIHRydWUpLnNldE1heERhdGFBZ2UobWF4RGF0YUFnZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTZXJpYWxpemF0aW9uSGVhZGVyKGhlYWRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRPcGVuUmVhc29uKG9wZW5SZWFzb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Rmlyc3QoZmlyc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGFzdChib3VuZGFyeSAhPSBudWxsID8gYm91bmRhcnkubGFzdEtleSA6IGxhc3QpOworCisgICAgICAgIEJpZ1RhYmxlUmVhZGVyIHJlYWRlcjsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIFN0YXRzTWV0YWRhdGEgc3RhdHMgPSBzdGF0c01ldGFkYXRhKCk7Ci0gICAgICAgICAgICBhc3NlcnQgYm91bmRhcnkuaW5kZXhMZW5ndGggPiAwICYmIGJvdW5kYXJ5LmRhdGFMZW5ndGggPiAwOwotICAgICAgICAgICAgLy8gb3BlbiB0aGUgcmVhZGVyIGVhcmx5Ci0gICAgICAgICAgICBpbmRleFN1bW1hcnkgPSBpd3JpdGVyLnN1bW1hcnkuYnVpbGQobWV0YWRhdGEoKS5wYXJ0aXRpb25lciwgYm91bmRhcnkpOwotICAgICAgICAgICAgbG9uZyBpbmRleEZpbGVMZW5ndGggPSBuZXcgRmlsZShkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5QUklNQVJZX0lOREVYKSkubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpbnQgaW5kZXhCdWZmZXJTaXplID0gb3B0aW1pemF0aW9uU3RyYXRlZ3kuYnVmZmVyU2l6ZShpbmRleEZpbGVMZW5ndGggLyBpbmRleFN1bW1hcnkuc2l6ZSgpKTsKLSAgICAgICAgICAgIGlmaWxlID0gaXdyaXRlci5idWlsZGVyLmJ1ZmZlclNpemUoaW5kZXhCdWZmZXJTaXplKS5jb21wbGV0ZShib3VuZGFyeS5pbmRleExlbmd0aCk7Ci0gICAgICAgICAgICBpZiAoY29tcHJlc3Npb24pCi0gICAgICAgICAgICAgICAgZGJ1aWxkZXIud2l0aENvbXByZXNzaW9uTWV0YWRhdGEoKChDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlcikgZGF0YUZpbGUpLm9wZW4oYm91bmRhcnkuZGF0YUxlbmd0aCkpOwotICAgICAgICAgICAgaW50IGRhdGFCdWZmZXJTaXplID0gb3B0aW1pemF0aW9uU3RyYXRlZ3kuYnVmZmVyU2l6ZShzdGF0cy5lc3RpbWF0ZWRQYXJ0aXRpb25TaXplLnBlcmNlbnRpbGUoRGF0YWJhc2VEZXNjcmlwdG9yLmdldERpc2tPcHRpbWl6YXRpb25Fc3RpbWF0ZVBlcmNlbnRpbGUoKSkpOwotICAgICAgICAgICAgZGZpbGUgPSBkYnVpbGRlci5idWZmZXJTaXplKGRhdGFCdWZmZXJTaXplKS5jb21wbGV0ZShib3VuZGFyeS5kYXRhTGVuZ3RoKTsKLSAgICAgICAgICAgIGludmFsaWRhdGVDYWNoZUF0Qm91bmRhcnkoZGZpbGUpOwotICAgICAgICAgICAgc3N0YWJsZSA9IFNTVGFibGVSZWFkZXIuaW50ZXJuYWxPcGVuKGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cywgbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZpbGUsIGRmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4U3VtbWFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpd3JpdGVyLmJmLnNoYXJlZENvcHkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEYXRhQWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIuT3BlblJlYXNvbi5FQVJMWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIpOwogCi0gICAgICAgICAgICAvLyBub3cgaXQncyBvcGVuLCBmaW5kIHRoZSBBQ1RVQUwgbGFzdCByZWFkYWJsZSBrZXkgKGkuZS4gZm9yIHdoaWNoIHRoZSBkYXRhIGZpbGUgaGFzIGFsc28gYmVlbiBmbHVzaGVkKQotICAgICAgICAgICAgc3N0YWJsZS5maXJzdCA9IGdldE1pbmltYWxLZXkoZmlyc3QpOwotICAgICAgICAgICAgc3N0YWJsZS5sYXN0ID0gZ2V0TWluaW1hbEtleShib3VuZGFyeS5sYXN0S2V5KTsKLSAgICAgICAgICAgIHJldHVybiBzc3RhYmxlOworICAgICAgICAgICAgYnVpbGRlci5zZXRTdGF0c01ldGFkYXRhKHN0YXRzTWV0YWRhdGEoKSk7CisKKyAgICAgICAgICAgIEVzdGltYXRlZEhpc3RvZ3JhbSBwYXJ0aXRpb25TaXplSGlzdG9ncmFtID0gYnVpbGRlci5nZXRTdGF0c01ldGFkYXRhKCkuZXN0aW1hdGVkUGFydGl0aW9uU2l6ZTsKKyAgICAgICAgICAgIGlmIChib3VuZGFyeSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwYXJ0aXRpb25TaXplSGlzdG9ncmFtLmlzT3ZlcmZsb3dlZCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIkVzdGltYXRlZCBwYXJ0aXRpb24gc2l6ZSBoaXN0b2dyYW0gZm9yICd7fScgaXMgb3ZlcmZsb3dlZCAoe30gdmFsdWVzIGdyZWF0ZXIgdGhhbiB7fSkuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2xlYXJpbmcgdGhlIG92ZXJmbG93IGJ1Y2tldCB0byBhbGxvdyBmb3IgZGVncmFkZWQgbWVhbiBhbmQgcGVyY2VudGlsZSBjYWxjdWxhdGlvbnMuLi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLCBwYXJ0aXRpb25TaXplSGlzdG9ncmFtLm92ZXJmbG93Q291bnQoKSwgcGFydGl0aW9uU2l6ZUhpc3RvZ3JhbS5nZXRMYXJnZXN0QnVja2V0T2Zmc2V0KCkpOworICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25TaXplSGlzdG9ncmFtLmNsZWFyT3ZlcmZsb3coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbHRlciA9IGluZGV4V3JpdGVyLmdldEZpbHRlckNvcHkoKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RmlsdGVyKGZpbHRlcik7CisgICAgICAgICAgICBpbmRleFN1bW1hcnkgPSBpbmRleFdyaXRlci5zdW1tYXJ5LmJ1aWxkKG1ldGFkYXRhKCkucGFydGl0aW9uZXIsIGJvdW5kYXJ5KTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0SW5kZXhTdW1tYXJ5KGluZGV4U3VtbWFyeSk7CisKKyAgICAgICAgICAgIGxvbmcgaW5kZXhGaWxlTGVuZ3RoID0gZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuUFJJTUFSWV9JTkRFWCkubGVuZ3RoKCk7CisgICAgICAgICAgICBpbnQgaW5kZXhCdWZmZXJTaXplID0gaW9PcHRpb25zLmRpc2tPcHRpbWl6YXRpb25TdHJhdGVneS5idWZmZXJTaXplKGluZGV4RmlsZUxlbmd0aCAvIGJ1aWxkZXIuZ2V0SW5kZXhTdW1tYXJ5KCkuc2l6ZSgpKTsKKyAgICAgICAgICAgIEZpbGVIYW5kbGUuQnVpbGRlciBpbmRleEZpbGVCdWlsZGVyID0gaW5kZXhXcml0ZXIuYnVpbGRlcjsKKyAgICAgICAgICAgIGluZGV4RmlsZSA9IGluZGV4RmlsZUJ1aWxkZXIuYnVmZmVyU2l6ZShpbmRleEJ1ZmZlclNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhMZW5ndGhPdmVycmlkZShib3VuZGFyeSAhPSBudWxsID8gYm91bmRhcnkuaW5kZXhMZW5ndGggOiBOT19MRU5HVEhfT1ZFUlJJREUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBsZXRlKCk7CisgICAgICAgICAgICBidWlsZGVyLnNldEluZGV4RmlsZShpbmRleEZpbGUpOworICAgICAgICAgICAgZGF0YUZpbGUgPSBvcGVuRGF0YUZpbGUoYm91bmRhcnkgIT0gbnVsbCA/IGJvdW5kYXJ5LmRhdGFMZW5ndGggOiBOT19MRU5HVEhfT1ZFUlJJREUsIGJ1aWxkZXIuZ2V0U3RhdHNNZXRhZGF0YSgpKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGF0YUZpbGUoZGF0YUZpbGUpOworICAgICAgICAgICAgYnVpbGRlci5zZXRLZXlDYWNoZShtZXRhZGF0YSgpLnBhcmFtcy5jYWNoaW5nLmNhY2hlS2V5cygpID8gbmV3IEtleUNhY2hlKENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZSkgOiBLZXlDYWNoZS5OT19DQUNIRSk7CisKKyAgICAgICAgICAgIHJlYWRlciA9IGJ1aWxkZXIuYnVpbGQob3duZXIoKS5vckVsc2UobnVsbCksIHRydWUsIHRydWUpOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKICAgICAgICAgewogICAgICAgICAgICAgSlZNU3RhYmlsaXR5SW5zcGVjdG9yLmluc3BlY3RUaHJvd2FibGUodCk7Ci0gICAgICAgICAgICAvLyBJZiB3ZSBzdWNjZXNzZnVsbHkgY3JlYXRlZCBvdXIgc3N0YWJsZSwgd2UgY2FuIHJlbHkgb24gaXRzIEluc3RhbmNlVGlkaWVyIHRvIGNsZWFuIHRoaW5ncyB1cCBmb3IgdXMKLSAgICAgICAgICAgIGlmIChzc3RhYmxlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc3N0YWJsZS5zZWxmUmVmKCkucmVsZWFzZSgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIFN0cmVhbS5vZihpbmRleFN1bW1hcnksIGlmaWxlLCBkZmlsZSkuZmlsdGVyKE9iamVjdHM6Om5vbk51bGwpLmZvckVhY2goU2hhcmVkQ2xvc2VhYmxlSW1wbDo6Y2xvc2UpOworICAgICAgICAgICAgVGhyb3dhYmxlcy5jbG9zZU5vbk51bGxBbmRBZGRTdXBwcmVzc2VkKHQsIGRhdGFGaWxlLCBpbmRleEZpbGUsIGluZGV4U3VtbWFyeSwgZmlsdGVyKTsKICAgICAgICAgICAgIHRocm93IHQ7CiAgICAgICAgIH0KKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8RGVjb3JhdGVkS2V5LCBBYnN0cmFjdFJvd0luZGV4RW50cnk+IGNhY2hlZEtleSA6IGNhY2hlZEtleXMuZW50cnlTZXQoKSkKKyAgICAgICAgICAgICAgICByZWFkZXIuY2FjaGVLZXkoY2FjaGVkS2V5LmdldEtleSgpLCBjYWNoZWRLZXkuZ2V0VmFsdWUoKSk7CisKKyAgICAgICAgICAgIC8vIGNsZWFyaW5nIHRoZSBjb2xsZWN0ZWQgY2FjaGUga2V5cyBzbyB0aGF0IHdlIHdpbGwgbm90IGhhdmUgdG8gY2FjaGUgdGhlbSBhZ2FpbiB3aGVuIG9wZW5pbmcgcGFydGlhbCBvcgorICAgICAgICAgICAgLy8gZmluYWwgbGF0ZXIgLSBjYWNoZSBrZXkgcmVmZXIgb25seSB0byB0aGUgZGVzY3JpcHRvciwgbm90IHRvIHRoZSBwYXJ0aWN1bGFyIFNTVGFibGVSZWFkZXIgaW5zdGFuY2UuCisgICAgICAgICAgICBjYWNoZWRLZXlzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQorICAgICAgICB7CisgICAgICAgICAgICBKVk1TdGFiaWxpdHlJbnNwZWN0b3IuaW5zcGVjdFRocm93YWJsZSh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZWFkZXI7CiAgICAgfQogCi0gICAgdm9pZCBpbnZhbGlkYXRlQ2FjaGVBdEJvdW5kYXJ5KEZpbGVIYW5kbGUgZGZpbGUpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb3BlbkVhcmx5KENvbnN1bWVyPFNTVGFibGVSZWFkZXI+IGRvV2hlblJlYWR5KQogICAgIHsKLSAgICAgICAgY2h1bmtDYWNoZS5pZlByZXNlbnQoY2FjaGUgLT4gewotICAgICAgICAgICAgaWYgKGxhc3RFYXJseU9wZW5MZW5ndGggIT0gMCAmJiBkZmlsZS5kYXRhTGVuZ3RoKCkgPiBsYXN0RWFybHlPcGVuTGVuZ3RoKQotICAgICAgICAgICAgICAgIGNhY2hlLmludmFsaWRhdGVQb3NpdGlvbihkZmlsZSwgbGFzdEVhcmx5T3Blbkxlbmd0aCk7Ci0gICAgICAgIH0pOwotICAgICAgICBsYXN0RWFybHlPcGVuTGVuZ3RoID0gZGZpbGUuZGF0YUxlbmd0aCgpOworICAgICAgICAvLyBmaW5kIHRoZSBtYXggKGV4Y2x1c2l2ZSkgcmVhZGFibGUga2V5CisgICAgICAgIEluZGV4U3VtbWFyeUJ1aWxkZXIuUmVhZGFibGVCb3VuZGFyeSBib3VuZGFyeSA9IGluZGV4V3JpdGVyLmdldE1heFJlYWRhYmxlKCk7CisgICAgICAgIGlmIChib3VuZGFyeSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGRvV2hlblJlYWR5LmFjY2VwdChvcGVuSW50ZXJuYWwoYm91bmRhcnksIFNTVGFibGVSZWFkZXIuT3BlblJlYXNvbi5FQVJMWSkpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyIG9wZW5GaW5hbEVhcmx5KCkKICAgICB7CiAgICAgICAgIC8vIHdlIG11c3QgZW5zdXJlIHRoZSBkYXRhIGlzIGNvbXBsZXRlbHkgZmx1c2hlZCB0byBkaXNrCi0gICAgICAgIGRhdGFGaWxlLnN5bmMoKTsKLSAgICAgICAgaXdyaXRlci5pbmRleEZpbGUuc3luYygpOworICAgICAgICBkYXRhV3JpdGVyLnN5bmMoKTsKKyAgICAgICAgaW5kZXhXcml0ZXIud3JpdGVyLnN5bmMoKTsKIAogICAgICAgICByZXR1cm4gb3BlbkZpbmFsKFNTVGFibGVSZWFkZXIuT3BlblJlYXNvbi5FQVJMWSk7CiAgICAgfQogCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKLSAgICBwcml2YXRlIFNTVGFibGVSZWFkZXIgb3BlbkZpbmFsKFNTVGFibGVSZWFkZXIuT3BlblJlYXNvbiBvcGVuUmVhc29uKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyIG9wZW5GaW5hbChTU1RhYmxlUmVhZGVyLk9wZW5SZWFzb24gb3BlblJlYXNvbikKICAgICB7CiAgICAgICAgIGlmIChtYXhEYXRhQWdlIDwgMCkKICAgICAgICAgICAgIG1heERhdGFBZ2UgPSBjdXJyZW50VGltZU1pbGxpcygpOwogCi0gICAgICAgIEluZGV4U3VtbWFyeSBpbmRleFN1bW1hcnkgPSBudWxsOwotICAgICAgICBGaWxlSGFuZGxlIGlmaWxlID0gbnVsbDsKLSAgICAgICAgRmlsZUhhbmRsZSBkZmlsZSA9IG51bGw7Ci0gICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0YXRzTWV0YWRhdGEgc3RhdHMgPSBzdGF0c01ldGFkYXRhKCk7Ci0gICAgICAgICAgICAvLyBmaW5hbGl6ZSBpbi1tZW1vcnkgc3RhdGUgZm9yIHRoZSByZWFkZXIKLSAgICAgICAgICAgIGluZGV4U3VtbWFyeSA9IGl3cml0ZXIuc3VtbWFyeS5idWlsZChtZXRhZGF0YSgpLnBhcnRpdGlvbmVyKTsKLSAgICAgICAgICAgIGxvbmcgaW5kZXhGaWxlTGVuZ3RoID0gbmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuUFJJTUFSWV9JTkRFWCkpLmxlbmd0aCgpOwotICAgICAgICAgICAgaW50IGRhdGFCdWZmZXJTaXplID0gb3B0aW1pemF0aW9uU3RyYXRlZ3kuYnVmZmVyU2l6ZShzdGF0cy5lc3RpbWF0ZWRQYXJ0aXRpb25TaXplLnBlcmNlbnRpbGUoRGF0YWJhc2VEZXNjcmlwdG9yLmdldERpc2tPcHRpbWl6YXRpb25Fc3RpbWF0ZVBlcmNlbnRpbGUoKSkpOwotICAgICAgICAgICAgaW50IGluZGV4QnVmZmVyU2l6ZSA9IG9wdGltaXphdGlvblN0cmF0ZWd5LmJ1ZmZlclNpemUoaW5kZXhGaWxlTGVuZ3RoIC8gaW5kZXhTdW1tYXJ5LnNpemUoKSk7Ci0gICAgICAgICAgICBpZmlsZSA9IGl3cml0ZXIuYnVpbGRlci5idWZmZXJTaXplKGluZGV4QnVmZmVyU2l6ZSkuY29tcGxldGUoKTsKLSAgICAgICAgICAgIGlmIChjb21wcmVzc2lvbikKLSAgICAgICAgICAgICAgICBkYnVpbGRlci53aXRoQ29tcHJlc3Npb25NZXRhZGF0YSgoKENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyKSBkYXRhRmlsZSkub3BlbigwKSk7Ci0gICAgICAgICAgICBkZmlsZSA9IGRidWlsZGVyLmJ1ZmZlclNpemUoZGF0YUJ1ZmZlclNpemUpLmNvbXBsZXRlKCk7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlQ2FjaGVBdEJvdW5kYXJ5KGRmaWxlKTsKLSAgICAgICAgICAgIHNzdGFibGUgPSBTU1RhYmxlUmVhZGVyLmludGVybmFsT3BlbihkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhTdW1tYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl3cml0ZXIuYmYuc2hhcmVkQ29weSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERhdGFBZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlblJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIpOwotICAgICAgICAgICAgc3N0YWJsZS5maXJzdCA9IGdldE1pbmltYWxLZXkoZmlyc3QpOwotICAgICAgICAgICAgc3N0YWJsZS5sYXN0ID0gZ2V0TWluaW1hbEtleShsYXN0KTsKLSAgICAgICAgICAgIHJldHVybiBzc3RhYmxlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgSlZNU3RhYmlsaXR5SW5zcGVjdG9yLmluc3BlY3RUaHJvd2FibGUodCk7Ci0gICAgICAgICAgICAvLyBJZiB3ZSBzdWNjZXNzZnVsbHkgY3JlYXRlZCBvdXIgc3N0YWJsZSwgd2UgY2FuIHJlbHkgb24gaXRzIEluc3RhbmNlVGlkaWVyIHRvIGNsZWFuIHRoaW5ncyB1cCBmb3IgdXMKLSAgICAgICAgICAgIGlmIChzc3RhYmxlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc3N0YWJsZS5zZWxmUmVmKCkucmVsZWFzZSgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIFN0cmVhbS5vZihpbmRleFN1bW1hcnksIGlmaWxlLCBkZmlsZSkuZmlsdGVyKE9iamVjdHM6Om5vbk51bGwpLmZvckVhY2goU2hhcmVkQ2xvc2VhYmxlSW1wbDo6Y2xvc2UpOwotICAgICAgICAgICAgdGhyb3cgdDsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gb3BlbkludGVybmFsKG51bGwsIG9wZW5SZWFzb24pOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBTU1RhYmxlV3JpdGVyLlRyYW5zYWN0aW9uYWxQcm94eSB0eG5Qcm94eSgpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uYWxQcm94eSgpOwotICAgIH0KLQotICAgIGNsYXNzIFRyYW5zYWN0aW9uYWxQcm94eSBleHRlbmRzIFNTVGFibGVXcml0ZXIuVHJhbnNhY3Rpb25hbFByb3h5Ci0gICAgewotICAgICAgICAvLyBmaW5hbGlzZSBvdXIgc3RhdGUgb24gZGlzaywgaW5jbHVkaW5nIHJlbmFtaW5nCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGRvUHJlcGFyZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGl3cml0ZXIucHJlcGFyZVRvQ29tbWl0KCk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIHNzdGFibGUgc3RhdGlzdGljcwotICAgICAgICAgICAgZGF0YUZpbGUucHJlcGFyZVRvQ29tbWl0KCk7Ci0gICAgICAgICAgICB3cml0ZU1ldGFkYXRhKGRlc2NyaXB0b3IsIGZpbmFsaXplTWV0YWRhdGEoKSk7Ci0KLSAgICAgICAgICAgIC8vIHNhdmUgdGhlIHRhYmxlIG9mIGNvbXBvbmVudHMKLSAgICAgICAgICAgIFNTVGFibGUuYXBwZW5kVE9DKGRlc2NyaXB0b3IsIGNvbXBvbmVudHMpOwotCi0gICAgICAgICAgICBpZiAob3BlblJlc3VsdCkKLSAgICAgICAgICAgICAgICBmaW5hbFJlYWRlciA9IG9wZW5GaW5hbChTU1RhYmxlUmVhZGVyLk9wZW5SZWFzb24uTk9STUFMKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBUaHJvd2FibGUgZG9Db21taXQoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFjY3VtdWxhdGUgPSBkYXRhRmlsZS5jb21taXQoYWNjdW11bGF0ZSk7Ci0gICAgICAgICAgICBhY2N1bXVsYXRlID0gaXdyaXRlci5jb21taXQoYWNjdW11bGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgVGhyb3dhYmxlIGRvUG9zdENsZWFudXAoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFjY3VtdWxhdGUgPSBkYnVpbGRlci5jbG9zZShhY2N1bXVsYXRlKTsKLSAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFRocm93YWJsZSBkb0Fib3J0KFRocm93YWJsZSBhY2N1bXVsYXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBhY2N1bXVsYXRlID0gaXdyaXRlci5hYm9ydChhY2N1bXVsYXRlKTsKLSAgICAgICAgICAgIGFjY3VtdWxhdGUgPSBkYXRhRmlsZS5hYm9ydChhY2N1bXVsYXRlKTsKLSAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlTWV0YWRhdGEoRGVzY3JpcHRvciBkZXNjLCBNYXA8TWV0YWRhdGFUeXBlLCBNZXRhZGF0YUNvbXBvbmVudD4gY29tcG9uZW50cykKLSAgICB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRlc2MuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlNUQVRTKSk7Ci0gICAgICAgIHRyeSAoU2VxdWVudGlhbFdyaXRlciBvdXQgPSBuZXcgU2VxdWVudGlhbFdyaXRlcihmaWxlLCB3cml0ZXJPcHRpb24pKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZXNjLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLnNlcmlhbGl6ZShjb21wb25lbnRzLCBvdXQsIGRlc2MudmVyc2lvbik7Ci0gICAgICAgICAgICBvdXQuZmluaXNoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBGU1dyaXRlRXJyb3IoZSwgZmlsZS5wYXRoKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0RmlsZVBvaW50ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRhdGFGaWxlLnBvc2l0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0T25EaXNrRmlsZVBvaW50ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRhdGFGaWxlLmdldE9uRGlza0ZpbGVQb2ludGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0RXN0aW1hdGVkT25EaXNrQnl0ZXNXcml0dGVuKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkYXRhRmlsZS5nZXRFc3RpbWF0ZWRPbkRpc2tCeXRlc1dyaXR0ZW4oKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTU1RhYmxlV3JpdGVyLlRyYW5zYWN0aW9uYWxQcm94eSgoKSAtPiBGQlV0aWxpdGllcy5pbW11dGFibGVMaXN0V2l0aEZpbHRlcmVkTnVsbHMoaW5kZXhXcml0ZXIsIGRhdGFXcml0ZXIpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBFbmNhcHN1bGF0ZXMgd3JpdGluZyB0aGUgaW5kZXggYW5kIGZpbHRlciBmb3IgYW4gU1NUYWJsZS4gVGhlIHN0YXRlIG9mIHRoaXMgb2JqZWN0IGlzIG5vdCB2YWxpZCB1bnRpbCBpdCBoYXMgYmVlbiBjbG9zZWQuCiAgICAgICovCi0gICAgY2xhc3MgSW5kZXhXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdFRyYW5zYWN0aW9uYWwgaW1wbGVtZW50cyBUcmFuc2FjdGlvbmFsCisgICAgc3RhdGljIGNsYXNzIEluZGV4V3JpdGVyIGV4dGVuZHMgU29ydGVkVGFibGVXcml0ZXIuQWJzdHJhY3RJbmRleFdyaXRlcgogICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXF1ZW50aWFsV3JpdGVyIGluZGV4RmlsZTsKLSAgICAgICAgcHVibGljIGZpbmFsIEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyOwotICAgICAgICBwdWJsaWMgZmluYWwgSW5kZXhTdW1tYXJ5QnVpbGRlciBzdW1tYXJ5OwotICAgICAgICBwdWJsaWMgZmluYWwgSUZpbHRlciBiZjsKLSAgICAgICAgcHJpdmF0ZSBEYXRhUG9zaXRpb24gbWFyazsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSb3dJbmRleEVudHJ5LkluZGV4U2VyaWFsaXplciByb3dJbmRleEVudHJ5U2VyaWFsaXplcjsKIAotICAgICAgICBJbmRleFdyaXRlcihsb25nIGtleUNvdW50KQorICAgICAgICBmaW5hbCBTZXF1ZW50aWFsV3JpdGVyIHdyaXRlcjsKKyAgICAgICAgZmluYWwgRmlsZUhhbmRsZS5CdWlsZGVyIGJ1aWxkZXI7CisgICAgICAgIGZpbmFsIEluZGV4U3VtbWFyeUJ1aWxkZXIgc3VtbWFyeTsKKyAgICAgICAgcHJpdmF0ZSBEYXRhUG9zaXRpb24gbWFyazsKKyAgICAgICAgcHJpdmF0ZSBEZWNvcmF0ZWRLZXkgZmlyc3Q7CisgICAgICAgIHByaXZhdGUgRGVjb3JhdGVkS2V5IGxhc3Q7CisKKyAgICAgICAgcHJvdGVjdGVkIEluZGV4V3JpdGVyKEJ1aWxkZXIgYikKICAgICAgICAgewotICAgICAgICAgICAgaW5kZXhGaWxlID0gbmV3IFNlcXVlbnRpYWxXcml0ZXIobmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuUFJJTUFSWV9JTkRFWCkpLCB3cml0ZXJPcHRpb24pOwotICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuUFJJTUFSWV9JTkRFWCkpLm1tYXBwZWQoRGF0YWJhc2VEZXNjcmlwdG9yLmdldEluZGV4QWNjZXNzTW9kZSgpID09IENvbmZpZy5EaXNrQWNjZXNzTW9kZS5tbWFwKTsKLSAgICAgICAgICAgIGNodW5rQ2FjaGUuaWZQcmVzZW50KGJ1aWxkZXI6OndpdGhDaHVua0NhY2hlKTsKLSAgICAgICAgICAgIHN1bW1hcnkgPSBuZXcgSW5kZXhTdW1tYXJ5QnVpbGRlcihrZXlDb3VudCwgbWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbCwgRG93bnNhbXBsaW5nLkJBU0VfU0FNUExJTkdfTEVWRUwpOwotICAgICAgICAgICAgYmYgPSBGaWx0ZXJGYWN0b3J5LmdldEZpbHRlcihrZXlDb3VudCwgbWV0YWRhdGEoKS5wYXJhbXMuYmxvb21GaWx0ZXJGcENoYW5jZSk7CisgICAgICAgICAgICBzdXBlcihiKTsKKyAgICAgICAgICAgIHRoaXMucm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIgPSBiLmdldFJvd0luZGV4RW50cnlTZXJpYWxpemVyKCk7CisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgU2VxdWVudGlhbFdyaXRlcihiLmRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlBSSU1BUllfSU5ERVgpLCBiLmdldElPT3B0aW9ucygpLndyaXRlck9wdGlvbnMpOworICAgICAgICAgICAgYnVpbGRlciA9IEluZGV4Q29tcG9uZW50LmZpbGVCdWlsZGVyKENvbXBvbmVudHMuUFJJTUFSWV9JTkRFWCwgYikud2l0aE1tYXBwZWRSZWdpb25zQ2FjaGUoYi5nZXRNbWFwcGVkUmVnaW9uc0NhY2hlKCkpOworICAgICAgICAgICAgc3VtbWFyeSA9IG5ldyBJbmRleFN1bW1hcnlCdWlsZGVyKGIuZ2V0S2V5Q291bnQoKSwgYi5nZXRUYWJsZU1ldGFkYXRhUmVmKCkuZ2V0TG9jYWwoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbCwgRG93bnNhbXBsaW5nLkJBU0VfU0FNUExJTkdfTEVWRUwpOwogICAgICAgICAgICAgLy8gcmVnaXN0ZXIgbGlzdGVuZXJzIHRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBmaWxlcyBhcmUgZmx1c2hlZAotICAgICAgICAgICAgaW5kZXhGaWxlLnNldFBvc3RGbHVzaExpc3RlbmVyKCgpIC0+IHN1bW1hcnkubWFya0luZGV4U3luY2VkKGluZGV4RmlsZS5nZXRMYXN0Rmx1c2hPZmZzZXQoKSkpOwotICAgICAgICAgICAgZGF0YUZpbGUuc2V0UG9zdEZsdXNoTGlzdGVuZXIoKCkgLT4gc3VtbWFyeS5tYXJrRGF0YVN5bmNlZChkYXRhRmlsZS5nZXRMYXN0Rmx1c2hPZmZzZXQoKSkpOworICAgICAgICAgICAgd3JpdGVyLnNldFBvc3RGbHVzaExpc3RlbmVyKCgpIC0+IHN1bW1hcnkubWFya0luZGV4U3luY2VkKHdyaXRlci5nZXRMYXN0Rmx1c2hPZmZzZXQoKSkpOworICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKKyAgICAgICAgICAgIFNlcXVlbnRpYWxXcml0ZXIgZGF0YVdyaXRlciA9IGIuZ2V0RGF0YVdyaXRlcigpOworICAgICAgICAgICAgZGF0YVdyaXRlci5zZXRQb3N0Rmx1c2hMaXN0ZW5lcigoKSAtPiBzdW1tYXJ5Lm1hcmtEYXRhU3luY2VkKGRhdGFXcml0ZXIuZ2V0TGFzdEZsdXNoT2Zmc2V0KCkpKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGZpbmRzIHRoZSBsYXN0ICgtb2Zmc2V0KSBkZWNvcmF0ZWQga2V5IHRoYXQgY2FuIGJlIGd1YXJhbnRlZWQgdG8gb2NjdXIgZnVsbHkgaW4gdGhlIGZsdXNoZWQgcG9ydGlvbiBvZiB0aGUgaW5kZXggZmlsZQpAQCAtNTYxLDE3ICsyOTAsMjEgQEAKICAgICAgICAgcHVibGljIHZvaWQgYXBwZW5kKERlY29yYXRlZEtleSBrZXksIFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSwgbG9uZyBkYXRhRW5kLCBCeXRlQnVmZmVyIGluZGV4SW5mbykgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIGJmLmFkZChrZXkpOwotICAgICAgICAgICAgbG9uZyBpbmRleFN0YXJ0ID0gaW5kZXhGaWxlLnBvc2l0aW9uKCk7CisgICAgICAgICAgICBpZiAoZmlyc3QgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGtleTsKKyAgICAgICAgICAgIGxhc3QgPSBrZXk7CisKKyAgICAgICAgICAgIGxvbmcgaW5kZXhTdGFydCA9IHdyaXRlci5wb3NpdGlvbigpOwogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVXaXRoU2hvcnRMZW5ndGgoa2V5LmdldEtleSgpLCBpbmRleEZpbGUpOwotICAgICAgICAgICAgICAgIHJvd0luZGV4RW50cnlTZXJpYWxpemVyLnNlcmlhbGl6ZShpbmRleEVudHJ5LCBpbmRleEZpbGUsIGluZGV4SW5mbyk7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVXaXRoU2hvcnRMZW5ndGgoa2V5LmdldEtleSgpLCB3cml0ZXIpOworICAgICAgICAgICAgICAgIHJvd0luZGV4RW50cnlTZXJpYWxpemVyLnNlcmlhbGl6ZShpbmRleEVudHJ5LCB3cml0ZXIsIGluZGV4SW5mbyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRlNXcml0ZUVycm9yKGUsIGluZGV4RmlsZS5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBGU1dyaXRlRXJyb3IoZSwgd3JpdGVyLmdldFBhdGgoKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb25nIGluZGV4RW5kID0gaW5kZXhGaWxlLnBvc2l0aW9uKCk7CisgICAgICAgICAgICBsb25nIGluZGV4RW5kID0gd3JpdGVyLnBvc2l0aW9uKCk7CiAKICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIndyb3RlIGluZGV4IGVudHJ5OiB7fSBhdCB7fSIsIGluZGV4RW50cnksIGluZGV4U3RhcnQpOwpAQCAtNTc5LDc1ICszMTIsMTUyIEBACiAgICAgICAgICAgICBzdW1tYXJ5Lm1heWJlQWRkRW50cnkoa2V5LCBpbmRleFN0YXJ0LCBpbmRleEVuZCwgZGF0YUVuZCk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogQ2xvc2VzIHRoZSBpbmRleCBhbmQgYmxvb21maWx0ZXIsIG1ha2luZyB0aGUgcHVibGljIHN0YXRlIG9mIHRoaXMgd3JpdGVyIHZhbGlkIGZvciBjb25zdW1wdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgZmx1c2hCZigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudC5GSUxURVIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuRklMVEVSKTsKLSAgICAgICAgICAgICAgICB0cnkgKEZpbGVPdXRwdXRTdHJlYW1QbHVzIHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtUGx1cyhwYXRoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJsb29tIGZpbHRlcgotICAgICAgICAgICAgICAgICAgICBCbG9vbUZpbHRlclNlcmlhbGl6ZXIuc2VyaWFsaXplKChCbG9vbUZpbHRlcikgYmYsIHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICBzdHJlYW0uc3luYygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGU1dyaXRlRXJyb3IoZSwgcGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KICAgICAgICAgcHVibGljIHZvaWQgbWFyaygpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1hcmsgPSBpbmRleEZpbGUubWFyaygpOworICAgICAgICAgICAgbWFyayA9IHdyaXRlci5tYXJrKCk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCByZXNldEFuZFRydW5jYXRlKCkKICAgICAgICAgewogICAgICAgICAgICAgLy8gd2UgY2FuJ3QgdW4tc2V0IHRoZSBibG9vbSBmaWx0ZXIgYWRkaXRpb24sIGJ1dCBleHRyYSBrZXlzIGluIHRoZXJlIGFyZSBoYXJtbGVzcy4KLSAgICAgICAgICAgIC8vIHdlIGNhbid0IHJlc2V0IGRidWlsZGVyIGVpdGhlciwgYnV0IHRoYXQgaXMgdGhlIGxhc3QgdGhpbmcgY2FsbGVkIGluIGFmdGVyYXBwZW5kIHNvCisgICAgICAgICAgICAvLyB3ZSBjYW4ndCByZXNldCBkYnVpbGRlciBlaXRoZXIsIGJ1dCB0aGF0IGlzIHRoZSBsYXN0IHRoaW5nIGNhbGxlZCBpbiBhZnRlcmFwcGVuZCwgc28KICAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGF0IGlmIHRoYXQgd29ya2VkIHRoZW4gd2Ugd29uJ3QgYmUgdHJ5aW5nIHRvIHJlc2V0LgotICAgICAgICAgICAgaW5kZXhGaWxlLnJlc2V0QW5kVHJ1bmNhdGUobWFyayk7CisgICAgICAgICAgICB3cml0ZXIucmVzZXRBbmRUcnVuY2F0ZShtYXJrKTsKICAgICAgICAgfQogCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIGRvUHJlcGFyZSgpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZsdXNoQmYoKTsKKyAgICAgICAgICAgIGNoZWNrTm90TnVsbChmaXJzdCk7CisgICAgICAgICAgICBjaGVja05vdE51bGwobGFzdCk7CisKKyAgICAgICAgICAgIHN1cGVyLmRvUHJlcGFyZSgpOwogCiAgICAgICAgICAgICAvLyB0cnVuY2F0ZSBpbmRleCBmaWxlCi0gICAgICAgICAgICBsb25nIHBvc2l0aW9uID0gaW5kZXhGaWxlLnBvc2l0aW9uKCk7Ci0gICAgICAgICAgICBpbmRleEZpbGUucHJlcGFyZVRvQ29tbWl0KCk7Ci0gICAgICAgICAgICBGaWxlVXRpbHMudHJ1bmNhdGUoaW5kZXhGaWxlLmdldFBhdGgoKSwgcG9zaXRpb24pOworICAgICAgICAgICAgbG9uZyBwb3NpdGlvbiA9IHdyaXRlci5wb3NpdGlvbigpOworICAgICAgICAgICAgd3JpdGVyLnByZXBhcmVUb0NvbW1pdCgpOworICAgICAgICAgICAgRmlsZVV0aWxzLnRydW5jYXRlKHdyaXRlci5nZXRQYXRoKCksIHBvc2l0aW9uKTsKIAogICAgICAgICAgICAgLy8gc2F2ZSBzdW1tYXJ5CiAgICAgICAgICAgICBzdW1tYXJ5LnByZXBhcmVUb0NvbW1pdCgpOwotICAgICAgICAgICAgdHJ5IChJbmRleFN1bW1hcnkgaW5kZXhTdW1tYXJ5ID0gc3VtbWFyeS5idWlsZChnZXRQYXJ0aXRpb25lcigpKSkKKyAgICAgICAgICAgIHRyeSAoSW5kZXhTdW1tYXJ5IGluZGV4U3VtbWFyeSA9IHN1bW1hcnkuYnVpbGQobWV0YWRhdGEuZ2V0TG9jYWwoKS5wYXJ0aXRpb25lcikpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlci5zYXZlU3VtbWFyeShkZXNjcmlwdG9yLCBmaXJzdCwgbGFzdCwgaW5kZXhTdW1tYXJ5KTsKKyAgICAgICAgICAgICAgICBuZXcgSW5kZXhTdW1tYXJ5Q29tcG9uZW50KGluZGV4U3VtbWFyeSwgZmlyc3QsIGxhc3QpLnNhdmUoZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuU1VNTUFSWSksIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJGYWlsZWQgdG8gc2F2ZSBpbmRleCBzdW1tYXJ5IiwgZXgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcHJvdGVjdGVkIFRocm93YWJsZSBkb0NvbW1pdChUaHJvd2FibGUgYWNjdW11bGF0ZSkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGluZGV4RmlsZS5jb21taXQoYWNjdW11bGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gd3JpdGVyLmNvbW1pdChhY2N1bXVsYXRlKTsKICAgICAgICAgfQogCiAgICAgICAgIHByb3RlY3RlZCBUaHJvd2FibGUgZG9BYm9ydChUaHJvd2FibGUgYWNjdW11bGF0ZSkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHN1bW1hcnkuY2xvc2UoaW5kZXhGaWxlLmFib3J0KGFjY3VtdWxhdGUpKTsKKyAgICAgICAgICAgIHJldHVybiBzdW1tYXJ5LmNsb3NlKHdyaXRlci5hYm9ydChhY2N1bXVsYXRlKSk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIFRocm93YWJsZSBkb1Bvc3RDbGVhbnVwKFRocm93YWJsZSBhY2N1bXVsYXRlKQogICAgICAgICB7CisgICAgICAgICAgICBhY2N1bXVsYXRlID0gc3VwZXIuZG9Qb3N0Q2xlYW51cChhY2N1bXVsYXRlKTsKICAgICAgICAgICAgIGFjY3VtdWxhdGUgPSBzdW1tYXJ5LmNsb3NlKGFjY3VtdWxhdGUpOwotICAgICAgICAgICAgYWNjdW11bGF0ZSA9IGJmLmNsb3NlKGFjY3VtdWxhdGUpOwotICAgICAgICAgICAgYWNjdW11bGF0ZSA9IGJ1aWxkZXIuY2xvc2UoYWNjdW11bGF0ZSk7CiAgICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0ZTsKICAgICAgICAgfQogICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciBleHRlbmRzIFNvcnRlZFRhYmxlV3JpdGVyLkJ1aWxkZXI8QmlnRm9ybWF0UGFydGl0aW9uV3JpdGVyLCBCaWdUYWJsZVdyaXRlciwgQnVpbGRlcj4KKyAgICB7CisgICAgICAgIHByaXZhdGUgUm93SW5kZXhFbnRyeS5JbmRleFNlcmlhbGl6ZXIgcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXI7CisgICAgICAgIHByaXZhdGUgSW5kZXhXcml0ZXIgaW5kZXhXcml0ZXI7CisgICAgICAgIHByaXZhdGUgU2VxdWVudGlhbFdyaXRlciBkYXRhV3JpdGVyOworICAgICAgICBwcml2YXRlIEJpZ0Zvcm1hdFBhcnRpdGlvbldyaXRlciBwYXJ0aXRpb25Xcml0ZXI7CisgICAgICAgIHByaXZhdGUgTW1hcHBlZFJlZ2lvbnNDYWNoZSBtbWFwcGVkUmVnaW9uc0NhY2hlOworCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKERlc2NyaXB0b3IgZGVzY3JpcHRvcikKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZGVzY3JpcHRvcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkRGVmYXVsdENvbXBvbmVudHMoKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlci5hZGREZWZhdWx0Q29tcG9uZW50cygpOworCisgICAgICAgICAgICBhZGRDb21wb25lbnRzKEltbXV0YWJsZVNldC5vZihDb21wb25lbnRzLlBSSU1BUllfSU5ERVgsIENvbXBvbmVudHMuU1VNTUFSWSkpOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgZ2V0dGVycyBmb3IgdGhlIHJlc291cmNlcyBvcGVuZWQgYnkgYnVpbGRJbnRlcm5hbCBtZXRob2QgY2FuIGJlIG9ubHkgdXNlZCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mCisgICAgICAgIC8vIHRoYXQgbWV0aG9kIC0gdGhhdCBpcywgZHVyaW5nIHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhlIHNzdGFibGUuCisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNbWFwcGVkUmVnaW9uc0NhY2hlIGdldE1tYXBwZWRSZWdpb25zQ2FjaGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZW5zdXJpbmdJbkJ1aWxkSW50ZXJuYWxDb250ZXh0KG1tYXBwZWRSZWdpb25zQ2FjaGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTZXF1ZW50aWFsV3JpdGVyIGdldERhdGFXcml0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZW5zdXJpbmdJbkJ1aWxkSW50ZXJuYWxDb250ZXh0KGRhdGFXcml0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCaWdGb3JtYXRQYXJ0aXRpb25Xcml0ZXIgZ2V0UGFydGl0aW9uV3JpdGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVuc3VyaW5nSW5CdWlsZEludGVybmFsQ29udGV4dChwYXJ0aXRpb25Xcml0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJvd0luZGV4RW50cnkuSW5kZXhTZXJpYWxpemVyIGdldFJvd0luZGV4RW50cnlTZXJpYWxpemVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVuc3VyaW5nSW5CdWlsZEludGVybmFsQ29udGV4dChyb3dJbmRleEVudHJ5U2VyaWFsaXplcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW5kZXhXcml0ZXIgZ2V0SW5kZXhXcml0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZW5zdXJpbmdJbkJ1aWxkSW50ZXJuYWxDb250ZXh0KGluZGV4V3JpdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgPFQ+IFQgZW5zdXJpbmdJbkJ1aWxkSW50ZXJuYWxDb250ZXh0KFQgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZSh2YWx1ZSAhPSBudWxsLCAiVGhpcyBnZXR0ZXIgY2FuIGJlIHVzZWQgb25seSBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoZSBzc3RhYmxlIGNvbnN0cnVjdG9yLiBEbyBub3QgdXNlIGl0IGRpcmVjdGx5LiIpOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBCaWdUYWJsZVdyaXRlciBidWlsZEludGVybmFsKExpZmVjeWNsZU5ld1RyYWNrZXIgbGlmZWN5Y2xlTmV3VHJhY2tlciwgT3duZXIgb3duZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1tYXBwZWRSZWdpb25zQ2FjaGUgPSBuZXcgTW1hcHBlZFJlZ2lvbnNDYWNoZSgpOworICAgICAgICAgICAgICAgIHJvd0luZGV4RW50cnlTZXJpYWxpemVyID0gbmV3IFJvd0luZGV4RW50cnkuU2VyaWFsaXplcihkZXNjcmlwdG9yLnZlcnNpb24sIGdldFNlcmlhbGl6YXRpb25IZWFkZXIoKSwgb3duZXIgIT0gbnVsbCA/IG93bmVyLmdldE1ldHJpY3MoKSA6IG51bGwpOworICAgICAgICAgICAgICAgIGRhdGFXcml0ZXIgPSBEYXRhQ29tcG9uZW50LmJ1aWxkV3JpdGVyKGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGFibGVNZXRhZGF0YVJlZigpLmdldExvY2FsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SU9PcHRpb25zKCkud3JpdGVyT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNZXRhZGF0YUNvbGxlY3RvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZmVjeWNsZU5ld1RyYWNrZXIub3BUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SU9PcHRpb25zKCkuZmx1c2hDb21wcmVzc2lvbik7CisgICAgICAgICAgICAgICAgaW5kZXhXcml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIodGhpcyk7CisgICAgICAgICAgICAgICAgcGFydGl0aW9uV3JpdGVyID0gbmV3IEJpZ0Zvcm1hdFBhcnRpdGlvbldyaXRlcihnZXRTZXJpYWxpemF0aW9uSGVhZGVyKCksIGRhdGFXcml0ZXIsIGRlc2NyaXB0b3IudmVyc2lvbiwgcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIuaW5kZXhJbmZvU2VyaWFsaXplcigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJpZ1RhYmxlV3JpdGVyKHRoaXMsIGxpZmVjeWNsZU5ld1RyYWNrZXIsIG93bmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHwgRXJyb3IgZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGhyb3dhYmxlcy5jbG9zZUFuZEFkZFN1cHByZXNzZWQoZXgsIHBhcnRpdGlvbldyaXRlciwgaW5kZXhXcml0ZXIsIGRhdGFXcml0ZXIsIG1tYXBwZWRSZWdpb25zQ2FjaGUpOworICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJvd0luZGV4RW50cnlTZXJpYWxpemVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpbmRleFdyaXRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgZGF0YVdyaXRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgcGFydGl0aW9uV3JpdGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICBtbWFwcGVkUmVnaW9uc0NhY2hlID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9CaWdUYWJsZVplcm9Db3B5V3JpdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnVGFibGVaZXJvQ29weVdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjQwMzQ5Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9CaWdUYWJsZVplcm9Db3B5V3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnOwotCi1pbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DbG9zZWRDaGFubmVsRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVOZXdUcmFja2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU1dyaXRlRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQnVmZmVyVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZU11bHRpV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNlcXVlbnRpYWxXcml0ZXJPcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LkFzeW5jU3RyZWFtaW5nSW5wdXRQbHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhUmVmOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeTsKLQotcHVibGljIGNsYXNzIEJpZ1RhYmxlWmVyb0NvcHlXcml0ZXIgZXh0ZW5kcyBTU1RhYmxlIGltcGxlbWVudHMgU1NUYWJsZU11bHRpV3JpdGVyCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEJpZ1RhYmxlWmVyb0NvcHlXcml0ZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhOwotICAgIHByaXZhdGUgdm9sYXRpbGUgU1NUYWJsZVJlYWRlciBmaW5hbFJlYWRlcjsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxDb21wb25lbnQuVHlwZSwgU2VxdWVudGlhbFdyaXRlcj4gY29tcG9uZW50V3JpdGVyczsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNlcXVlbnRpYWxXcml0ZXJPcHRpb24gV1JJVEVSX09QVElPTiA9Ci0gICAgICAgIFNlcXVlbnRpYWxXcml0ZXJPcHRpb24ubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHJpY2tsZUZzeW5jKGZhbHNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1ZmZlclNpemUoMiA8PCAyMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWZmZXJUeXBlKEJ1ZmZlclR5cGUuT0ZGX0hFQVApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEltbXV0YWJsZVNldDxDb21wb25lbnQ+IFNVUFBPUlRFRF9DT01QT05FTlRTID0KLSAgICAgICAgSW1tdXRhYmxlU2V0Lm9mKENvbXBvbmVudC5EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50LlBSSU1BUllfSU5ERVgsCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnQuU1VNTUFSWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudC5TVEFUUywKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudC5DT01QUkVTU0lPTl9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50LkZJTFRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudC5ESUdFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnQuQ1JDKTsKLQotICAgIHB1YmxpYyBCaWdUYWJsZVplcm9Db3B5V3JpdGVyKERlc2NyaXB0b3IgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpZmVjeWNsZU5ld1RyYWNrZXIgbGlmZWN5Y2xlTmV3VHJhY2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPENvbXBvbmVudD4gY29tcG9uZW50cykKLSAgICB7Ci0gICAgICAgIHN1cGVyKGRlc2NyaXB0b3IsIEltbXV0YWJsZVNldC5jb3B5T2YoY29tcG9uZW50cyksIG1ldGFkYXRhLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0RGlza09wdGltaXphdGlvblN0cmF0ZWd5KCkpOwotCi0gICAgICAgIGxpZmVjeWNsZU5ld1RyYWNrZXIudHJhY2tOZXcodGhpcyk7Ci0gICAgICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgdGhpcy5jb21wb25lbnRXcml0ZXJzID0gbmV3IEVudW1NYXA8PihDb21wb25lbnQuVHlwZS5jbGFzcyk7Ci0KLSAgICAgICAgaWYgKCFTVVBQT1JURURfQ09NUE9ORU5UUy5jb250YWluc0FsbChjb21wb25lbnRzKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihmb3JtYXQoIlVuc3VwcG9ydGVkIHN0cmVhbWluZyBjb21wb25lbnQgZGV0ZWN0ZWQgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRzLmRpZmZlcmVuY2UoSW1tdXRhYmxlU2V0LmNvcHlPZihjb21wb25lbnRzKSwgU1VQUE9SVEVEX0NPTVBPTkVOVFMpKSk7Ci0KLSAgICAgICAgZm9yIChDb21wb25lbnQgYyA6IGNvbXBvbmVudHMpCi0gICAgICAgICAgICBjb21wb25lbnRXcml0ZXJzLnB1dChjLnR5cGUsIG1ha2VXcml0ZXIoZGVzY3JpcHRvciwgYykpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFNlcXVlbnRpYWxXcml0ZXIgbWFrZVdyaXRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIENvbXBvbmVudCBjb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFNlcXVlbnRpYWxXcml0ZXIobmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihjb21wb25lbnQpKSwgV1JJVEVSX09QVElPTiwgZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZShEYXRhSW5wdXRQbHVzIGluLCBsb25nIHNpemUsIFNlcXVlbnRpYWxXcml0ZXIgb3V0KSB0aHJvd3MgRlNXcml0ZUVycm9yCi0gICAgewotICAgICAgICBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSAxIDw8IDIwOwotICAgICAgICBsb25nIGJ5dGVzUmVhZCA9IDA7Ci0gICAgICAgIGJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUgKGJ5dGVzUmVhZCA8IHNpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHRvUmVhZCA9IChpbnQpIE1hdGgubWluKHNpemUgLSBieXRlc1JlYWQsIEJVRkZFUl9TSVpFKTsKLSAgICAgICAgICAgICAgICBpbi5yZWFkRnVsbHkoYnVmZiwgMCwgdG9SZWFkKTsKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBNYXRoLm1pbih0b1JlYWQsIEJVRkZFUl9TSVpFKTsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmZiwgMCwgY291bnQpOwotICAgICAgICAgICAgICAgIGJ5dGVzUmVhZCArPSBjb3VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dC5zeW5jKCk7IC8vIGZpbmlzaCB3aWxsIGFsc28gY2FsbCBzeW5jKCkuIExlYXZpbmcgaGVyZSB0byBnZXQgc3R1ZmYgZmx1c2hlZCBhcyBlYXJseSBhcyBwb3NzaWJsZQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRlNXcml0ZUVycm9yKGUsIG91dC5nZXRQYXRoKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gYXBwZW5kKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBwYXJ0aXRpb24pCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIGJ5IEJpZ1RhYmxlQmxvY2tXcml0ZXIiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBmaW5pc2gobG9uZyByZXBhaXJlZEF0LCBsb25nIG1heERhdGFBZ2UsIGJvb2xlYW4gb3BlblJlc3VsdCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaW5pc2gob3BlblJlc3VsdCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gZmluaXNoKGJvb2xlYW4gb3BlblJlc3VsdCkKLSAgICB7Ci0gICAgICAgIHNldE9wZW5SZXN1bHQob3BlblJlc3VsdCk7Ci0KLSAgICAgICAgZm9yIChTZXF1ZW50aWFsV3JpdGVyIHdyaXRlciA6IGNvbXBvbmVudFdyaXRlcnMudmFsdWVzKCkpCi0gICAgICAgICAgICB3cml0ZXIuZmluaXNoKCk7Ci0KLSAgICAgICAgcmV0dXJuIGZpbmlzaGVkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gZmluaXNoZWQoKQotICAgIHsKLSAgICAgICAgaWYgKGZpbmFsUmVhZGVyID09IG51bGwpCi0gICAgICAgICAgICBmaW5hbFJlYWRlciA9IFNTVGFibGVSZWFkZXIub3BlbihkZXNjcmlwdG9yLCBjb21wb25lbnRzLCBtZXRhZGF0YSk7Ci0KLSAgICAgICAgcmV0dXJuIEltbXV0YWJsZUxpc3Qub2YoZmluYWxSZWFkZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTU1RhYmxlTXVsdGlXcml0ZXIgc2V0T3BlblJlc3VsdChib29sZWFuIG9wZW5SZXN1bHQpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRGaWxlUG9pbnRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVGFibGVJZCBnZXRUYWJsZUlkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtZXRhZGF0YS5pZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVGhyb3dhYmxlIGNvbW1pdChUaHJvd2FibGUgYWNjdW11bGF0ZSkKLSAgICB7Ci0gICAgICAgIGZvciAoU2VxdWVudGlhbFdyaXRlciB3cml0ZXIgOiBjb21wb25lbnRXcml0ZXJzLnZhbHVlcygpKQotICAgICAgICAgICAgYWNjdW11bGF0ZSA9IHdyaXRlci5jb21taXQoYWNjdW11bGF0ZSk7Ci0gICAgICAgIHJldHVybiBhY2N1bXVsYXRlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUaHJvd2FibGUgYWJvcnQoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCi0gICAgewotICAgICAgICBmb3IgKFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyIDogY29tcG9uZW50V3JpdGVycy52YWx1ZXMoKSkKLSAgICAgICAgICAgIGFjY3VtdWxhdGUgPSB3cml0ZXIuYWJvcnQoYWNjdW11bGF0ZSk7Ci0gICAgICAgIHJldHVybiBhY2N1bXVsYXRlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVUb0NvbW1pdCgpCi0gICAgewotICAgICAgICBmb3IgKFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyIDogY29tcG9uZW50V3JpdGVycy52YWx1ZXMoKSkKLSAgICAgICAgICAgIHdyaXRlci5wcmVwYXJlVG9Db21taXQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCi0gICAgewotICAgICAgICBmb3IgKFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyIDogY29tcG9uZW50V3JpdGVycy52YWx1ZXMoKSkKLSAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQ29tcG9uZW50KENvbXBvbmVudC5UeXBlIHR5cGUsIERhdGFJbnB1dFBsdXMgaW4sIGxvbmcgc2l6ZSkgdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGxvZ2dlci5pbmZvKCJXcml0aW5nIGNvbXBvbmVudCB7fSB0byB7fSBsZW5ndGgge30iLCB0eXBlLCBjb21wb25lbnRXcml0ZXJzLmdldCh0eXBlKS5nZXRQYXRoKCksIHByZXR0eVByaW50TWVtb3J5KHNpemUpKTsKLQotICAgICAgICBpZiAoaW4gaW5zdGFuY2VvZiBBc3luY1N0cmVhbWluZ0lucHV0UGx1cykKLSAgICAgICAgICAgIHdyaXRlKChBc3luY1N0cmVhbWluZ0lucHV0UGx1cykgaW4sIHNpemUsIGNvbXBvbmVudFdyaXRlcnMuZ2V0KHR5cGUpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgd3JpdGUoaW4sIHNpemUsIGNvbXBvbmVudFdyaXRlcnMuZ2V0KHR5cGUpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGUoQXN5bmNTdHJlYW1pbmdJbnB1dFBsdXMgaW4sIGxvbmcgc2l6ZSwgU2VxdWVudGlhbFdyaXRlciB3cml0ZXIpIHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCi0gICAgewotICAgICAgICBsb2dnZXIuaW5mbygiQmxvY2sgV3JpdGluZyBjb21wb25lbnQgdG8ge30gbGVuZ3RoIHt9Iiwgd3JpdGVyLmdldFBhdGgoKSwgcHJldHR5UHJpbnRNZW1vcnkoc2l6ZSkpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpbi5jb25zdW1lKHdyaXRlcjo6d3JpdGVEaXJlY3RseVRvQ2hhbm5lbCwgc2l6ZSk7Ci0gICAgICAgICAgICB3cml0ZXIuc3luYygpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFT0ZFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBGU1dyaXRlRXJyb3IgdHJpZ2dlcnMgZGlzayBmYWlsdXJlIHBvbGljeSwgYnV0IGlmIHdlIGdldCBhIGNvbm5lY3Rpb24gaXNzdWUgd2UgZG8gbm90IHdhbnQgdG8gZG8gdGhhdAotICAgICAgICAgICAgLy8gc28gcmV0aHJvdyBzbyB0aGUgZXJyb3IgaGFuZGxpbmcgbG9naWMgaGlnaGVyIHVwIGlzIGFibGUgdG8gZGVhbCB3aXRoIHRoaXMKLSAgICAgICAgICAgIC8vIHNlZSBDQVNTQU5EUkEtMTcxMTYKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBGU1dyaXRlRXJyb3IoZSwgd3JpdGVyLmdldFBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvSW5kZXhTdGF0ZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0luZGV4U3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzY5N2NmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0luZGV4U3RhdGUuamF2YQpAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0JvdW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdDb21wYXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdQcmVmaXg7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFNTVGFibGVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkluZGV4SW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFQb3NpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7CisKKy8vIFVzZWQgYnkgaW5kZXhlZCByZWFkZXJzIHRvIHN0b3JlIHdoZXJlIHRoZXkgYXJlIG9mIHRoZSBpbmRleC4KK3B1YmxpYyBjbGFzcyBJbmRleFN0YXRlIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZQoreworICAgIHByaXZhdGUgZmluYWwgQWJzdHJhY3RTU1RhYmxlSXRlcmF0b3I8Um93SW5kZXhFbnRyeT4uQWJzdHJhY3RSZWFkZXIgcmVhZGVyOworICAgIHByaXZhdGUgZmluYWwgQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvcjsKKworICAgIHByaXZhdGUgZmluYWwgUm93SW5kZXhFbnRyeSBpbmRleEVudHJ5OworICAgIHByaXZhdGUgZmluYWwgUm93SW5kZXhFbnRyeS5JbmRleEluZm9SZXRyaWV2ZXIgaW5kZXhJbmZvUmV0cmlldmVyOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiByZXZlcnNlZDsKKworICAgIHByaXZhdGUgaW50IGN1cnJlbnRJbmRleElkeDsKKworICAgIC8vIE1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJsb2NrIGNvcnJlc3BvbmRpbmcgdG8gY3VycmVudEluZGV4SWR4LgorICAgIHByaXZhdGUgRGF0YVBvc2l0aW9uIG1hcms7CisKKyAgICBwdWJsaWMgSW5kZXhTdGF0ZShBYnN0cmFjdFNTVGFibGVJdGVyYXRvcjxSb3dJbmRleEVudHJ5Pi5BYnN0cmFjdFJlYWRlciByZWFkZXIsIENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IsIFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSwgYm9vbGVhbiByZXZlcnNlZCwgRmlsZUhhbmRsZSBpbmRleEZpbGUpCisgICAgeworICAgICAgICB0aGlzLnJlYWRlciA9IHJlYWRlcjsKKyAgICAgICAgdGhpcy5jb21wYXJhdG9yID0gY29tcGFyYXRvcjsKKyAgICAgICAgdGhpcy5pbmRleEVudHJ5ID0gaW5kZXhFbnRyeTsKKyAgICAgICAgdGhpcy5pbmRleEluZm9SZXRyaWV2ZXIgPSBpbmRleEVudHJ5Lm9wZW5XaXRoSW5kZXgoaW5kZXhGaWxlKTsKKyAgICAgICAgdGhpcy5yZXZlcnNlZCA9IHJldmVyc2VkOworICAgICAgICB0aGlzLmN1cnJlbnRJbmRleElkeCA9IHJldmVyc2VkID8gaW5kZXhFbnRyeS5ibG9ja0NvdW50KCkgOiAtMTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RvbmUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJldmVyc2VkID8gY3VycmVudEluZGV4SWR4IDwgMCA6IGN1cnJlbnRJbmRleElkeCA+PSBpbmRleEVudHJ5LmJsb2NrQ291bnQoKTsKKyAgICB9CisKKyAgICAvLyBTZXRzIHRoZSByZWFkZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBibG9ja0lkeC4KKyAgICBwdWJsaWMgdm9pZCBzZXRUb0Jsb2NrKGludCBibG9ja0lkeCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoYmxvY2tJZHggPj0gMCAmJiBibG9ja0lkeCA8IGluZGV4RW50cnkuYmxvY2tDb3VudCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZWFkZXIuc2Vla1RvUG9zaXRpb24oY29sdW1uT2Zmc2V0KGJsb2NrSWR4KSk7CisgICAgICAgICAgICBtYXJrID0gcmVhZGVyLmZpbGUubWFyaygpOworICAgICAgICAgICAgcmVhZGVyLmRlc2VyaWFsaXplci5jbGVhclN0YXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBjdXJyZW50SW5kZXhJZHggPSBibG9ja0lkeDsKKyAgICAgICAgcmVhZGVyLm9wZW5NYXJrZXIgPSBibG9ja0lkeCA+IDAgPyBpbmRleChibG9ja0lkeCAtIDEpLmVuZE9wZW5NYXJrZXIgOiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgbG9uZyBjb2x1bW5PZmZzZXQoaW50IGkpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGluZGV4RW50cnkucG9zaXRpb24gKyBpbmRleChpKS5vZmZzZXQ7CisgICAgfQorCisgICAgcHVibGljIGludCBibG9ja3NDb3VudCgpCisgICAgeworICAgICAgICByZXR1cm4gaW5kZXhFbnRyeS5ibG9ja0NvdW50KCk7CisgICAgfQorCisgICAgLy8gVXBkYXRlIHRoZSBibG9jayBpZHggYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVhZGVyIHBvc2l0aW9uIGlmIHdlJ3JlIHBhc3QgdGhlIGN1cnJlbnQgYmxvY2suCisgICAgLy8gVGhpcyBvbmx5IG1ha2VzIHNlbnNlIGZvciBmb3J3YXJkIGl0ZXJhdGlvbiAoZm9yIHJldmVyc2Ugb25lcywgd2hlbiB3ZSByZWFjaCB0aGUgZW5kIG9mIGEgYmxvY2sgd2UKKyAgICAvLyBzaG91bGQgc2VlayB0byB0aGUgcHJldmlvdXMgb25lLCBub3QgdXBkYXRlIHRoZSBpbmRleCBzdGF0ZSBhbmQgY29udGludWUpLgorICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUJsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBhc3NlcnQgIXJldmVyc2VkOworCisgICAgICAgIC8vIElmIHdlIGdldCBoZXJlIHdpdGggY3VycmVudEJsb2NrSWR4IDwgMCwgaXQgbWVhbnMgc2V0VG9CbG9jaygpIGhhcyBuZXZlciBiZWVuIGNhbGxlZCwgc28gaXQgbWVhbnMKKyAgICAgICAgLy8gd2UncmUgYWJvdXQgdG8gcmVhZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhcnRpdGlvbiwgYnV0IGhhdmVuJ3QgInByZXBhcmVkIiB0aGUgSW5kZXhTdGF0ZSB5ZXQuCisgICAgICAgIC8vIERvIHNvIGJ5IHNldHRpbmcgdXMgb24gdGhlIGZpcnN0IGJsb2NrLgorICAgICAgICBpZiAoY3VycmVudEluZGV4SWR4IDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgc2V0VG9CbG9jaygwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChjdXJyZW50SW5kZXhJZHggKyAxIDwgaW5kZXhFbnRyeS5ibG9ja0NvdW50KCkgJiYgaXNQYXN0Q3VycmVudEJsb2NrKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlYWRlci5vcGVuTWFya2VyID0gY3VycmVudEluZGV4KCkuZW5kT3Blbk1hcmtlcjsKKyAgICAgICAgICAgICsrY3VycmVudEluZGV4SWR4OworCisgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIHNldCB0aGUgbWFyaywgYW5kIHdlIGhhdmUgdG8gc2V0IGl0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJsb2NrLiBTbyBpZiB3ZSdyZSBub3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYmxvY2ssIHRoaXMgZm9yY2VzIHVzIHRvIGEgd2VpcmQgc2VlayBkYW5jZS4KKyAgICAgICAgICAgIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIHdoZW4gcmVhZGluZyBvbGQgZmlsZSBob3dldmVyLgorICAgICAgICAgICAgbG9uZyBzdGFydE9mQmxvY2sgPSBjb2x1bW5PZmZzZXQoY3VycmVudEluZGV4SWR4KTsKKyAgICAgICAgICAgIGxvbmcgY3VycmVudEZpbGVQb2ludGVyID0gcmVhZGVyLmZpbGUuZ2V0RmlsZVBvaW50ZXIoKTsKKyAgICAgICAgICAgIGlmIChzdGFydE9mQmxvY2sgPT0gY3VycmVudEZpbGVQb2ludGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hcmsgPSByZWFkZXIuZmlsZS5tYXJrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVhZGVyLnNlZWtUb1Bvc2l0aW9uKHN0YXJ0T2ZCbG9jayk7CisgICAgICAgICAgICAgICAgbWFyayA9IHJlYWRlci5maWxlLm1hcmsoKTsKKyAgICAgICAgICAgICAgICByZWFkZXIuc2Vla1RvUG9zaXRpb24oY3VycmVudEZpbGVQb2ludGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENoZWNrIGlmIHdlJ3ZlIGNyb3NzZWQgYW4gaW5kZXggYm91bmRhcnkgKGJhc2VkIG9uIHRoZSBtYXJrIG9uIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGluZGV4IGJsb2NrKS4KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Bhc3RDdXJyZW50QmxvY2soKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGFzc2VydCByZWFkZXIuZGVzZXJpYWxpemVyICE9IG51bGw7CisgICAgICAgIHJldHVybiByZWFkZXIuZmlsZS5ieXRlc1Bhc3RNYXJrKG1hcmspID49IGN1cnJlbnRJbmRleCgpLndpZHRoOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgY3VycmVudEJsb2NrSWR4KCkKKyAgICB7CisgICAgICAgIHJldHVybiBjdXJyZW50SW5kZXhJZHg7CisgICAgfQorCisgICAgcHVibGljIEluZGV4SW5mbyBjdXJyZW50SW5kZXgoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBpbmRleChjdXJyZW50SW5kZXhJZHgpOworICAgIH0KKworICAgIHB1YmxpYyBJbmRleEluZm8gaW5kZXgoaW50IGkpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGluZGV4SW5mb1JldHJpZXZlci5jb2x1bW5zSW5kZXgoaSk7CisgICAgfQorCisgICAgLy8gRmluZHMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBibG9jayBjb250YWluaW5nIHRoZSBwcm92aWRlZCBib3VuZCwgc3RhcnRpbmcgYXQgdGhlIHByb3ZpZGVkIGluZGV4LgorICAgIC8vIFdpbGwgYmUgLTEgaWYgdGhlIGJvdW5kIGlzIGJlZm9yZSBhbnkgYmxvY2ssIGFuZCBibG9ja3NDb3VudCgpIGlmIGl0IGlzIGFmdGVyIGV2ZXJ5IGJsb2NrLgorICAgIHB1YmxpYyBpbnQgZmluZEJsb2NrSW5kZXgoQ2x1c3RlcmluZ0JvdW5kPD8+IGJvdW5kLCBpbnQgZnJvbUlkeCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoYm91bmQuaXNCb3R0b20oKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGJvdW5kLmlzVG9wKCkpCisgICAgICAgICAgICByZXR1cm4gYmxvY2tzQ291bnQoKTsKKworICAgICAgICByZXR1cm4gaW5kZXhGb3IoYm91bmQsIGZyb21JZHgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaW5kZXhGb3IoQ2x1c3RlcmluZ1ByZWZpeDw/PiBuYW1lLCBpbnQgbGFzdEluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIEluZGV4SW5mbyB0YXJnZXQgPSBuZXcgSW5kZXhJbmZvKG5hbWUsIG5hbWUsIDAsIDAsIG51bGwpOworICAgICAgICAvKgorICAgICAgICBUYWtlIHRoZSBleGFtcGxlIGZyb20gdGhlIHVuaXQgdGVzdCwgYW5kIHNheSB5b3VyIGluZGV4IGxvb2tzIGxpa2UgdGhpczoKKyAgICAgICAgWzAuLjVdWzEwLi4xNV1bMjAuLjI1XQorICAgICAgICBhbmQgeW91IGxvb2sgZm9yIHRoZSBzbGljZSBbMTMuLjE3XS4KKworICAgICAgICBXaGVuIGRvaW5nIGZvcndhcmQgc2xpY2UsIHdlIGFyZSBkb2luZyBhIGJpbmFyeSBzZWFyY2ggY29tcGFyaW5nIDEzICh0aGUgc3RhcnQgb2YgdGhlIHF1ZXJ5KQorICAgICAgICB0byB0aGUgbGFzdE5hbWUgcGFydCBvZiB0aGUgaW5kZXggc2xvdC4gWW91J2xsIGVuZCB1cCB3aXRoIHRoZSAiZmlyc3QiIHNsb3QsIGdvaW5nIGZyb20gbGVmdCB0byByaWdodCwKKyAgICAgICAgdGhhdCBtYXkgY29udGFpbiB0aGUgc3RhcnQuCisKKyAgICAgICAgV2hlbiBkb2luZyBhIHJldmVyc2Ugc2xpY2UsIHdlIGRvIHRoZSBzYW1lIHRoaW5nLCBvbmx5IHVzaW5nIGFzIGEgc3RhcnQgY29sdW1uIHRoZSBlbmQgb2YgdGhlIHF1ZXJ5LAorICAgICAgICBpLmUuIDE3IGluIHRoaXMgZXhhbXBsZSwgY29tcGFyZWQgdG8gdGhlIGZpcnN0TmFtZSBwYXJ0IG9mIHRoZSBpbmRleCBzbG90cy4gIGJzZWFyY2ggd2lsbCBnaXZlIHVzIHRoZQorICAgICAgICBmaXJzdCBzbG90IHdoZXJlIGZpcnN0TmFtZSA+IHN0YXJ0IChbMjAuLjI1XSBoZXJlKSwgc28gd2Ugc3VidHJhY3QgYW4gZXh0cmEgb25lIHRvIGdldCB0aGUgc2xvdCBqdXN0IGJlZm9yZS4KKyAgICAgICAgKi8KKyAgICAgICAgaW50IHN0YXJ0SWR4ID0gMDsKKyAgICAgICAgaW50IGVuZElkeCA9IGluZGV4RW50cnkuYmxvY2tDb3VudCgpIC0gMTsKKworICAgICAgICBpZiAocmV2ZXJzZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChsYXN0SW5kZXggPCBlbmRJZHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW5kSWR4ID0gbGFzdEluZGV4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxhc3RJbmRleCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhcnRJZHggPSBsYXN0SW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQgaW5kZXggPSBiaW5hcnlTZWFyY2godGFyZ2V0LCBjb21wYXJhdG9yLmluZGV4Q29tcGFyYXRvcihyZXZlcnNlZCksIHN0YXJ0SWR4LCBlbmRJZHgpOworICAgICAgICByZXR1cm4gKGluZGV4IDwgMCA/IC1pbmRleCAtIChyZXZlcnNlZCA/IDIgOiAxKSA6IGluZGV4KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBiaW5hcnlTZWFyY2goSW5kZXhJbmZvIGtleSwgQ29tcGFyYXRvcjxJbmRleEluZm8+IGMsIGludCBsb3csIGludCBoaWdoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHdoaWxlIChsb3cgPD0gaGlnaCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG1pZCA9IChsb3cgKyBoaWdoKSA+Pj4gMTsKKyAgICAgICAgICAgIEluZGV4SW5mbyBtaWRWYWwgPSBpbmRleChtaWQpOworICAgICAgICAgICAgaW50IGNtcCA9IGMuY29tcGFyZShtaWRWYWwsIGtleSk7CisKKyAgICAgICAgICAgIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7CisgICAgICAgICAgICBlbHNlIGlmIChjbXAgPiAwKQorICAgICAgICAgICAgICAgIGhpZ2ggPSBtaWQgLSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBtaWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0obG93ICsgMSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiSW5kZXhTdGF0ZShpbmRleFNpemU9JWQsIGN1cnJlbnRCbG9jaz0lZCwgcmV2ZXJzZWQ9JWIpIiwgaW5kZXhFbnRyeS5ibG9ja0NvdW50KCksIGN1cnJlbnRJbmRleElkeCwgcmV2ZXJzZWQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBpbmRleEluZm9SZXRyaWV2ZXIuY2xvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvSW5kZXhTdW1tYXJ5Q29tcG9uZW50LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvSW5kZXhTdW1tYXJ5Q29tcG9uZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNhNDBjYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9JbmRleFN1bW1hcnlDb21wb25lbnQuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuaW5kZXhzdW1tYXJ5LkluZGV4U3VtbWFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRTdHJlYW1QbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVJbnB1dFN0cmVhbVBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKKworcHVibGljIGNsYXNzIEluZGV4U3VtbWFyeUNvbXBvbmVudAoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihJbmRleFN1bW1hcnlDb21wb25lbnQuY2xhc3MpOworCisgICAgcHVibGljIGZpbmFsIEluZGV4U3VtbWFyeSBpbmRleFN1bW1hcnk7CisgICAgcHVibGljIGZpbmFsIERlY29yYXRlZEtleSBmaXJzdDsKKyAgICBwdWJsaWMgZmluYWwgRGVjb3JhdGVkS2V5IGxhc3Q7CisKKyAgICBwdWJsaWMgSW5kZXhTdW1tYXJ5Q29tcG9uZW50KEluZGV4U3VtbWFyeSBpbmRleFN1bW1hcnksIERlY29yYXRlZEtleSBmaXJzdCwgRGVjb3JhdGVkS2V5IGxhc3QpCisgICAgeworICAgICAgICB0aGlzLmluZGV4U3VtbWFyeSA9IGluZGV4U3VtbWFyeTsKKyAgICAgICAgdGhpcy5maXJzdCA9IGZpcnN0OworICAgICAgICB0aGlzLmxhc3QgPSBsYXN0OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUGFpcjxEZWNvcmF0ZWRLZXksIERlY29yYXRlZEtleT4gbG9hZEZpcnN0QW5kTGFzdEtleShGaWxlIHN1bW1hcnlGaWxlLCBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKCFzdW1tYXJ5RmlsZS5leGlzdHMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiSW5kZXggc3VtbWFyeSB7fSBkb2VzIG5vdCBleGlzdCIsIHN1bW1hcnlGaWxlLmFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW1QbHVzIGlTdHJlYW0gPSBzdW1tYXJ5RmlsZS5uZXdJbnB1dFN0cmVhbSgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEluZGV4U3VtbWFyeS5JbmRleFN1bW1hcnlTZXJpYWxpemVyKCkuZGVzZXJpYWxpemVGaXJzdExhc3RLZXkoaVN0cmVhbSwgcGFydGl0aW9uZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCBpbmRleCBzdW1tYXJ5LCBmaXJzdCBrZXkgYW5kIGxhc3Qga2V5IGZyb20gU3VtbWFyeS5kYiBmaWxlIGlmIGl0IGV4aXN0cy4KKyAgICAgKiA8cD4KKyAgICAgKiBpZiBsb2FkZWQgaW5kZXggc3VtbWFyeSBoYXMgZGlmZmVyZW50IGluZGV4IGludGVydmFsIGZyb20gY3VycmVudCB2YWx1ZSBzdG9yZWQgaW4gc2NoZW1hLAorICAgICAqIHRoZW4gU3VtbWFyeS5kYiBmaWxlIHdpbGwgYmUgZGVsZXRlZCBhbmQgbmVlZCB0byBiZSByZWJ1aWx0LgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBJbmRleFN1bW1hcnlDb21wb25lbnQgbG9hZChGaWxlIHN1bW1hcnlGaWxlLCBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmICghc3VtbWFyeUZpbGUuZXhpc3RzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIkluZGV4IHN1bW1hcnkge30gZG9lcyBub3QgZXhpc3QiLCBzdW1tYXJ5RmlsZS5hYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEluZGV4U3VtbWFyeSBzdW1tYXJ5ID0gbnVsbDsKKyAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW1QbHVzIGlTdHJlYW0gPSBzdW1tYXJ5RmlsZS5uZXdJbnB1dFN0cmVhbSgpKQorICAgICAgICB7CisgICAgICAgICAgICBzdW1tYXJ5ID0gSW5kZXhTdW1tYXJ5LnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5wYXJ0aXRpb25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5wYXJhbXMubWF4SW5kZXhJbnRlcnZhbCk7CisgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgZmlyc3QgPSBtZXRhZGF0YS5wYXJ0aXRpb25lci5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aExlbmd0aChpU3RyZWFtKSk7CisgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgbGFzdCA9IG1ldGFkYXRhLnBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoTGVuZ3RoKGlTdHJlYW0pKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbmRleFN1bW1hcnlDb21wb25lbnQoc3VtbWFyeSwgZmlyc3QsIGxhc3QpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN1bW1hcnkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzdW1tYXJ5LmNsb3NlKCk7CisKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJDYW5ub3QgZGVzZXJpYWxpemUgaW5kZXggc3VtbWFyeSBmcm9tICVzIiwgc3VtbWFyeUZpbGUpLCBleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEluZGV4U3VtbWFyeUNvbXBvbmVudCBsb2FkT3JEZWxldGVDb3JydXB0ZWQoRmlsZSBzdW1tYXJ5RmlsZSwgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGxvYWQoc3VtbWFyeUZpbGUsIG1ldGFkYXRhKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1bW1hcnlGaWxlLmRlbGV0ZUlmRXhpc3RzKCk7CisgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNhdmUgaW5kZXggc3VtbWFyeSB0byBTdW1tYXJ5LmRiIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2F2ZShGaWxlIHN1bW1hcnlGaWxlLCBib29sZWFuIGRlbGV0ZU9uRmFpbHVyZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoc3VtbWFyeUZpbGUuZXhpc3RzKCkpCisgICAgICAgICAgICBzdW1tYXJ5RmlsZS5kZWxldGUoKTsKKworICAgICAgICB0cnkgKERhdGFPdXRwdXRTdHJlYW1QbHVzIG9TdHJlYW0gPSBzdW1tYXJ5RmlsZS5uZXdPdXRwdXRTdHJlYW0oRmlsZS5Xcml0ZU1vZGUuT1ZFUldSSVRFKSkKKyAgICAgICAgeworICAgICAgICAgICAgSW5kZXhTdW1tYXJ5LnNlcmlhbGl6ZXIuc2VyaWFsaXplKGluZGV4U3VtbWFyeSwgb1N0cmVhbSk7CisgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC53cml0ZVdpdGhMZW5ndGgoZmlyc3QuZ2V0S2V5KCksIG9TdHJlYW0pOworICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVXaXRoTGVuZ3RoKGxhc3QuZ2V0S2V5KCksIG9TdHJlYW0pOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRlbGV0ZU9uRmFpbHVyZSkKKyAgICAgICAgICAgICAgICBzdW1tYXJ5RmlsZS5kZWxldGVJZkV4aXN0cygpOworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJGYWlsZWQgdG8gc2F2ZSBpbmRleCBzdW1tYXJ5IHRvICIgKyBzdW1tYXJ5RmlsZSwgZXgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL1Jvd0luZGV4RW50cnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9Sb3dJbmRleEVudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGViZmVlMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9Sb3dJbmRleEVudHJ5LmphdmEKQEAgLTAsMCArMSw4ODcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLkhpc3RvZ3JhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YVN0b3JhZ2VTcGVjOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQXJyYXlDbHVzdGVyaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlbGV0aW9uVGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5NZXNzYWdlUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJlYWRDb21tYW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJlamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5JU2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0Um93SW5kZXhFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkluZGV4SW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQuQ29tcG9uZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVEYXRhSW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmFuZG9tQWNjZXNzUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuVHJhY2tlZERhdGFJbnB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5EZWZhdWx0TmFtZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5NZXRyaWNOYW1lRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlRhYmxlTWV0cmljczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuUGFyYW1UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT2JqZWN0U2l6ZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMudmludC5WSW50Q29kaW5nOworaW1wb3J0IG9yZy5naXRodWIuamFtbS5Vbm1ldGVyZWQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DYXNzYW5kcmFNZXRyaWNzUmVnaXN0cnkuTWV0cmljczsKKworLyoqCisgKiBCaW5hcnkgZm9ybWF0IG9mIHtAY29kZSBSb3dJbmRleEVudHJ5fSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisgKiB7QGNvZGUKKyAqIChsb25nKSBwb3NpdGlvbiAoNjQgYml0IGxvbmcsIHZpbnQgZW5jb2RlZCkKKyAqICAoaW50KSBzZXJpYWxpemVkIHNpemUgb2YgZGF0YSB0aGF0IGZvbGxvd3MgKDMyIGJpdCBpbnQsIHZpbnQgZW5jb2RlZCkKKyAqIC0tIGZvbGxvd2luZyBmb3IgaW5kZXhlZCBlbnRyaWVzIG9ubHkgKHNvIHNlcmlhbGl6ZWQgc2l6ZSA+IDApCisgKiAgKGludCkgRGVsZXRpb25UaW1lLmxvY2FsRGVsZXRpb25UaW1lCisgKiAobG9uZykgRGVsZXRpb25UaW1lLm1hcmtlZEZvckRlbGV0aW9uQXQKKyAqICAoaW50KSBudW1iZXIgb2YgSW5kZXhJbmZvIG9iamVjdHMgKDMyIGJpdCBpbnQsIHZpbnQgZW5jb2RlZCkKKyAqICAgICgqKSBzZXJpYWxpemVkIEluZGV4SW5mbyBvYmplY3RzLCBzZWUgYmVsb3cKKyAqICAgICgqKSBvZmZzZXRzIG9mIHNlcmlhbGl6ZWQgSW5kZXhJbmZvIG9iamVjdHMsIHNpbmNlIHZlcnNpb24gIm1hIiAoMy4wKQorICogICAgICAgIEVhY2ggSW5kZXhJbmZvIG9iamVjdCdzIG9mZnNldCBpcyByZWxhdGl2ZSB0byB0aGUgZmlyc3QgSW5kZXhJbmZvIG9iamVjdC4KKyAqIH0KKyAqIDxwPgorICogU2VlIHtAbGluayBJbmRleEluZm99IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzZXJpYWxpemVkIGZvcm1hdC4KKyAqIDwvcD4KKyAqCisgKiA8cD4KKyAqIEZvciBlYWNoIHBhcnRpdGlvbiwgdGhlIGxheW91dCBvZiB0aGUgaW5kZXggZmlsZSBsb29rcyBsaWtlIHRoaXM6CisgKiA8L3A+CisgKiA8b2w+CisgKiAgICAgPGxpPnBhcnRpdGlvbiBrZXkgLSBwcmVmaXhlZCB3aXRoIHtAY29kZSBzaG9ydH0gbGVuZ3RoPC9saT4KKyAqICAgICA8bGk+c2VyaWFsaXplZCB7QGNvZGUgUm93SW5kZXhFbnRyeX0gb2JqZWN0czwvbGk+CisgKiA8L29sPgorICoKKyAqIDxwPgorICogICAgIEdlbmVyYWxseSwgd2UgZGlzdGluZ3Vpc2ggYmV0d2VlbiBpbmRleCBlbnRyaWVzIHRoYXQgaGF2ZSA8aT5pbmRleAorICogICAgIHNhbXBsZXM8L2k+IChsaXN0IG9mIHtAbGluayBJbmRleEluZm99IG9iamVjdHMpIGFuZCB0aG9zZSB3aG8gZG9uJ3QuCisgKiAgICAgRm9yIGVhY2ggPGk+cG9ydGlvbjwvaT4gb2YgZGF0YSBmb3IgYSBzaW5nbGUgcGFydGl0aW9uIGluIHRoZSBkYXRhIGZpbGUsCisgKiAgICAgYW4gaW5kZXggc2FtcGxlIGlzIGNyZWF0ZWQuIFRoZSBzaXplIG9mIHRoYXQgPGk+cG9ydGlvbjwvaT4gaXMgZGVmaW5lZAorICogICAgIGJ5IHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnI2NvbHVtbl9pbmRleF9zaXplfS4KKyAqIDwvcD4KKyAqIDxwPgorICogICAgIEluZGV4IGVudHJpZXMgd2l0aCBsZXNzIHRoYW4gMiBpbmRleCBzYW1wbGVzLCB3aWxsIGp1c3Qgc3RvcmUgdGhlCisgKiAgICAgcG9zaXRpb24gaW4gdGhlIGRhdGEgZmlsZS4KKyAqIDwvcD4KKyAqIDxwPgorICogICAgIE5vdGU6IGxlZ2FjeSBzc3RhYmxlcyBmb3IgaW5kZXggZW50cmllcyBhcmUgdGhvc2Ugc3N0YWJsZSBmb3JtYXRzIHRoYXQKKyAqICAgICBkbyA8aT5ub3Q8L2k+IGhhdmUgYW4gb2Zmc2V0cyB0YWJsZSB0byBpbmRleCBzYW1wbGVzICh7QGxpbmsgSW5kZXhJbmZvfQorICogICAgIG9iamVjdHMpLiBUaGVzZSBhcmUgdGhvc2Ugc3N0YWJsZXMgY3JlYXRlZCBvbiBDYXNzYW5kcmEgdmVyc2lvbnMKKyAqICAgICBlYXJsaWVyIHRoYW4gMy4wLgorICogPC9wPgorICogPHA+CisgKiAgICAgRm9yIGluZGV4IGVudHJpZXMgd2l0aCBpbmRleCBzYW1wbGVzIHdlIHN0b3JlIHRoZSBpbmRleCBzYW1wbGVzCisgKiAgICAgKHtAbGluayBJbmRleEluZm99IG9iamVjdHMpLiBUaGUgYmlnZ2VyIHRoZSBwYXJ0aXRpb24sIHRoZSBtb3JlCisgKiAgICAgaW5kZXggc2FtcGxlcyBhcmUgY3JlYXRlZC4gU2luY2UgYSBodWdlIGFtb3VudCBvZiBpbmRleCBzYW1wbGVzCisgKiAgICAgd2lsbCAicG9sbHV0ZSIgdGhlIGhlYXAgYW5kIGNhdXNlIGh1Z2UgR0MgcHJlc3N1cmUsIENhc3NhbmRyYSAzLjYKKyAqICAgICAoQ0FTU0FORFJBLTExMjA2KSBkaXN0aW5ndWlzaGVzIGJldHdlZW4gaW5kZXggZW50cmllcyB3aXRoIGFuCisgKiAgICAgImFjY2VwdGFibGUiIGFtb3VudCBvZiBpbmRleCBzYW1wbGVzIHBlciBwYXJ0aXRpb24gYW5kIHRob3NlCisgKiAgICAgd2l0aCBhbiAiZW5vcm1vdXMiIGFtb3VudCBvZiBpbmRleCBzYW1wbGVzLiBUaGUgYmFycmllcgorICogICAgIGlzIGNvbnRyb2xsZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyCisgKiAgICAge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWcjY29sdW1uX2luZGV4X2NhY2hlX3NpemV9LgorICogICAgIEluZGV4IGVudHJpZXMgd2l0aCBhIHRvdGFsIHNlcmlhbGl6ZWQgc2l6ZSBvZiBpbmRleCBzYW1wbGVzIHVwIHRvCisgKiAgICAge0Bjb2RlIGNvbHVtbl9pbmRleF9jYWNoZV9zaXplfSB3aWxsIGJlIGhlbGQgaW4gYW4gYXJyYXkuCisgKiAgICAgSW5kZXggZW50cmllcyBleGNlZWRpbmcgdGhhdCB2YWx1ZSB3aWxsIGFsd2F5cyBiZSBhY2Nlc3NlZCBmcm9tCisgKiAgICAgZGlzay4KKyAqIDwvcD4KKyAqIDxwPgorICogICAgIFRoaXMgcmVzdWx0cyBpbiB0aGVzZSBjbGFzc2VzOgorICogPC9wPgorICogPHVsPgorICogICAgIDxsaT57QGxpbmsgUm93SW5kZXhFbnRyeX0ganVzdCBzdG9yZXMgdGhlIG9mZnNldCBpbiB0aGUgZGF0YSBmaWxlLjwvbGk+CisgKiAgICAgPGxpPntAbGluayBJbmRleGVkRW50cnl9IGlzIGZvciBpbmRleCBlbnRyaWVzIHdpdGggaW5kZXggc2FtcGxlcworICogICAgIGFuZCB1c2VkIGZvciBib3RoIGN1cnJlbnQgYW5kIGxlZ2FjeSBzc3RhYmxlcywgd2hpY2ggZG8gbm90IGV4Y2VlZAorICogICAgIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnI2NvbHVtbl9pbmRleF9jYWNoZV9zaXplfS48L2xpPgorICogICAgIDxsaT57QGxpbmsgU2hhbGxvd0luZGV4ZWRFbnRyeX0gaXMgZm9yIGluZGV4IGVudHJpZXMgd2l0aCBpbmRleCBzYW1wbGVzCisgKiAgICAgdGhhdCBleGNlZWQge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWcjY29sdW1uX2luZGV4X2NhY2hlX3NpemV9CisgKiAgICAgZm9yIHNzdGFibGVzIHdpdGggYW4gb2Zmc2V0IHRhYmxlIHRvIHRoZSBpbmRleCBzYW1wbGVzLjwvbGk+CisgKiA8L3VsPgorICogPHA+CisgKiAgICAgU2luY2UgYWNjZXNzIHRvIGluZGV4IHNhbXBsZXMgb24gZGlzayAob2J2aW91c2x5KSByZXF1aXJlcyBzb21lIGZpbGUKKyAqICAgICByZWFkZXIsIHRoYXQgZnVuY3Rpb25hbGl0eSBpcyBlbmNhcHN1bGF0ZWQgaW4gaW1wbGVtZW50YXRpb25zIG9mCisgKiAgICAge0BsaW5rIEluZGV4SW5mb1JldHJpZXZlcn0uIFRoZXJlIGlzIGFuIGltcGxlbWVudGF0aW9uIHRvIGFjY2VzcworICogICAgIGluZGV4IHNhbXBsZXMgb2YgbGVnYWN5IHNzdGFibGVzICh3aXRob3V0IHRoZSBvZmZzZXRzIHRhYmxlKSwKKyAqICAgICBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhY2Nlc3Mgc3N0YWJsZXMgd2l0aCBhbiBvZmZzZXRzIHRhYmxlLgorICogPC9wPgorICogPHA+CisgKiAgICAgVW50aWwgbm93IChDYXNzYW5kcmEgMy54KSwgd2Ugc3RpbGwgc3VwcG9ydCByZWFkaW5nIGZyb20gPGk+bGVnYWN5PC9pPiBzc3RhYmxlcyAtCisgKiAgICAgaS5lLiBzc3RhYmxlcyBjcmVhdGVkIGJ5IENhc3NhbmRyYSAmbHQ7IDMuMCAoc2VlIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0fS4KKyAqIDwvcD4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBSb3dJbmRleEVudHJ5IGV4dGVuZHMgQWJzdHJhY3RSb3dJbmRleEVudHJ5Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnRm9ybWF0IEZPUk1BVCA9IEJpZ0Zvcm1hdC5nZXRJbnN0YW5jZSgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRU1QVFlfU0laRSA9IE9iamVjdFNpemVzLm1lYXN1cmUobmV3IFJvd0luZGV4RW50cnkoMCkpOworCisgICAgLy8gY29uc3RhbnRzIGZvciB0eXBlIG9mIHJvdy1pbmRleC1lbnRyeSBhcyBzZXJpYWxpemVkIGZvciBzYXZlZC1jYWNoZQorICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0FDSEVfTk9UX0lOREVYRUQgPSAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0FDSEVfSU5ERVhFRCA9IDE7CisgICAgc3RhdGljIGZpbmFsIGludCBDQUNIRV9JTkRFWEVEX1NIQUxMT1cgPSAyOworCisgICAgc3RhdGljIGZpbmFsIEhpc3RvZ3JhbSBpbmRleEVudHJ5U2l6ZUhpc3RvZ3JhbTsKKyAgICBzdGF0aWMgZmluYWwgSGlzdG9ncmFtIGluZGV4SW5mb0NvdW50SGlzdG9ncmFtOworICAgIHN0YXRpYyBmaW5hbCBIaXN0b2dyYW0gaW5kZXhJbmZvR2V0c0hpc3RvZ3JhbTsKKyAgICBzdGF0aWMgZmluYWwgSGlzdG9ncmFtIGluZGV4SW5mb1JlYWRzSGlzdG9ncmFtOworICAgIHN0YXRpYworICAgIHsKKyAgICAgICAgTWV0cmljTmFtZUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBEZWZhdWx0TmFtZUZhY3RvcnkoIkluZGV4IiwgIlJvd0luZGV4RW50cnkiKTsKKyAgICAgICAgaW5kZXhFbnRyeVNpemVIaXN0b2dyYW0gPSBNZXRyaWNzLmhpc3RvZ3JhbShmYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUoIkluZGV4ZWRFbnRyeVNpemUiKSwgZmFsc2UpOworICAgICAgICBpbmRleEluZm9Db3VudEhpc3RvZ3JhbSA9IE1ldHJpY3MuaGlzdG9ncmFtKGZhY3RvcnkuY3JlYXRlTWV0cmljTmFtZSgiSW5kZXhJbmZvQ291bnQiKSwgZmFsc2UpOworICAgICAgICBpbmRleEluZm9HZXRzSGlzdG9ncmFtID0gTWV0cmljcy5oaXN0b2dyYW0oZmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKCJJbmRleEluZm9HZXRzIiksIGZhbHNlKTsKKyAgICAgICAgaW5kZXhJbmZvUmVhZHNIaXN0b2dyYW0gPSBNZXRyaWNzLmhpc3RvZ3JhbShmYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUoIkluZGV4SW5mb1JlYWRzIiksIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUm93SW5kZXhFbnRyeShsb25nIHBvc2l0aW9uKQorICAgIHsKKyAgICAgICAgc3VwZXIocG9zaXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGluZGV4IGVudHJ5IGNvbnRhaW5zIHRoZSByb3ctbGV2ZWwgdG9tYnN0b25lIGFuZCBjb2x1bW4gc3VtbWFyeS4gIE90aGVyd2lzZSwKKyAgICAgKiBjYWxsZXIgc2hvdWxkIGZldGNoIHRoZXNlIGZyb20gdGhlIHJvdyBoZWFkZXIuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNJbmRleGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBibG9ja0NvdW50KCkgPiAxOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGluZGV4T25IZWFwKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRGVsZXRpb25UaW1lIGRlbGV0aW9uVGltZSgpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGJsb2NrQ291bnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJpZ0Zvcm1hdCBnZXRTU1RhYmxlRm9ybWF0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBGT1JNQVQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgdW5zaGFyZWRIZWFwU2l6ZSgpCisgICAgeworICAgICAgICByZXR1cm4gRU1QVFlfU0laRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZGF0YUZpbGVQb3NpdGlvbiAgcG9zaXRpb24gb2YgdGhlIHBhcnRpdGlvbiBpbiB0aGUge0BsaW5rIENvbXBvbmVudHMuVHlwZXMjREFUQX0gZmlsZQorICAgICAqIEBwYXJhbSBpbmRleEZpbGVQb3NpdGlvbiBwb3NpdGlvbiBpbiB0aGUge0BsaW5rIENvbXBvbmVudHMuVHlwZXMjUFJJTUFSWV9JTkRFWH0gb2YgdGhlIHtAbGluayBSb3dJbmRleEVudHJ5fQorICAgICAqIEBwYXJhbSBkZWxldGlvblRpbWUgICAgICBkZWxldGlvbiB0aW1lIG9mIHtAbGluayBSb3dJbmRleEVudHJ5fQorICAgICAqIEBwYXJhbSBoZWFkZXJMZW5ndGggICAgICBkZWxldGlvbiB0aW1lIG9mIHtAbGluayBSb3dJbmRleEVudHJ5fQorICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleENvdW50ICBudW1iZXIgb2Yge0BsaW5rIEluZGV4SW5mb30gZW50cmllcyBpbiB0aGUge0BsaW5rIFJvd0luZGV4RW50cnl9CisgICAgICogQHBhcmFtIGluZGV4ZWRQYXJ0U2l6ZSAgIHNlcmlhbGl6ZWQgc2l6ZSBvZiBhbGwgc2VyaWFsaXplZCB7QGxpbmsgSW5kZXhJbmZvfSBvYmplY3RzIGFuZCB0aGVpciBvZmZzZXRzCisgICAgICogQHBhcmFtIGluZGV4U2FtcGxlcyAgICAgIGxpc3Qgd2l0aCBJbmRleEluZm8gb2Zmc2V0cyAoaWYgdG90YWwgc2VyaWFsaXplZCBzaXplIGlzIGxlc3MgdGhhbiB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZyNjb2x1bW5faW5kZXhfY2FjaGVfc2l6ZX0KKyAgICAgKiBAcGFyYW0gb2Zmc2V0cyAgICAgICAgICAgb2Zmc2V0cyBvZiBJbmRleEluZm8gb2Zmc2V0cworICAgICAqIEBwYXJhbSBpZHhJbmZvU2VyaWFsaXplciB0aGUge0BsaW5rIEluZGV4SW5mb30gc2VyaWFsaXplcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUm93SW5kZXhFbnRyeSBjcmVhdGUobG9uZyBkYXRhRmlsZVBvc2l0aW9uLCBsb25nIGluZGV4RmlsZVBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lLCBsb25nIGhlYWRlckxlbmd0aCwgaW50IGNvbHVtbkluZGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleGVkUGFydFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8SW5kZXhJbmZvPiBpbmRleFNhbXBsZXMsIGludFtdIG9mZnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTZXJpYWxpemVyPEluZGV4SW5mbz4gaWR4SW5mb1NlcmlhbGl6ZXIpCisgICAgeworICAgICAgICAvLyBJZiB0aGUgInBhcnRpdGlvbiBidWlsZGluZyBjb2RlIiBpbiBCaWdUYWJsZVdyaXRlci5hcHBlbmQoKSB2aWEgQ29sdW1uSW5kZXggcmV0dXJucyBhIGxpc3QKKyAgICAgICAgLy8gb2YgSW5kZXhJbmZvIG9iamVjdHMsIHdoaWNoIGlzIHRoZSBjYXNlIGlmIHRoZSBzZXJpYWxpemVkIHNpemUgaXMgbGVzcyB0aGFuCisgICAgICAgIC8vIENvbmZpZy5jb2x1bW5faW5kZXhfY2FjaGVfc2l6ZSwgQU5EIHdlIGhhdmUgbW9yZSB0aGFuIG9uZSBJbmRleEluZm8gb2JqZWN0LCB3ZQorICAgICAgICAvLyBjb25zdHJ1Y3QgYW4gSW5kZXhlZEVudHJ5IG9iamVjdC4gKG5vdGU6IGluZGV4U2FtcGxlcy5zaXplKCkgYW5kIGNvbHVtbkluZGV4Q291bnQgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nKQorICAgICAgICBpZiAoaW5kZXhTYW1wbGVzICE9IG51bGwgJiYgaW5kZXhTYW1wbGVzLnNpemUoKSA+IDEpCisgICAgICAgICAgICByZXR1cm4gbmV3IEluZGV4ZWRFbnRyeShkYXRhRmlsZVBvc2l0aW9uLCBkZWxldGlvblRpbWUsIGhlYWRlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4U2FtcGxlcy50b0FycmF5KG5ldyBJbmRleEluZm9baW5kZXhTYW1wbGVzLnNpemUoKV0pLCBvZmZzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhlZFBhcnRTaXplLCBpZHhJbmZvU2VyaWFsaXplcik7CisgICAgICAgIC8vIEhlcmUgd2UgaGF2ZSB0byBkZWNpZGUgd2hldGhlciB3ZSBoYXZlIHNlcmlhbGl6ZWQgSW5kZXhJbmZvIG9iamVjdHMgdGhhdCBleGNlZWRzCisgICAgICAgIC8vIENvbmZpZy5jb2x1bW5faW5kZXhfY2FjaGVfc2l6ZSAobm90IGV4Y2VlZGluZyBjYXNlIGNvdmVyZWQgYWJvdmUpLgorICAgICAgICAvLyBTdWNoIGEgImJpZyIgaW5kZXhlZC1lbnRyeSBpcyByZXByZXNlbnRlZCBhcyBhIHNoYWxsb3cgb25lLgorICAgICAgICBpZiAoY29sdW1uSW5kZXhDb3VudCA+IDEpCisgICAgICAgICAgICByZXR1cm4gbmV3IFNoYWxsb3dJbmRleGVkRW50cnkoZGF0YUZpbGVQb3NpdGlvbiwgaW5kZXhGaWxlUG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRpb25UaW1lLCBoZWFkZXJMZW5ndGgsIGNvbHVtbkluZGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhlZFBhcnRTaXplLCBpZHhJbmZvU2VyaWFsaXplcik7CisgICAgICAgIC8vIExhc3QgY2FzZSBpcyB0aGF0IHRoZXJlIGFyZSBubyBpbmRleCBzYW1wbGVzLgorICAgICAgICByZXR1cm4gbmV3IFJvd0luZGV4RW50cnkoZGF0YUZpbGVQb3NpdGlvbik7CisgICAgfQorCisgICAgcHVibGljIEluZGV4SW5mb1JldHJpZXZlciBvcGVuV2l0aEluZGV4KEZpbGVIYW5kbGUgaW5kZXhGaWxlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBJbmRleFNlcmlhbGl6ZXIKKyAgICB7CisgICAgICAgIHZvaWQgc2VyaWFsaXplKFJvd0luZGV4RW50cnkgcmllLCBEYXRhT3V0cHV0UGx1cyBvdXQsIEJ5dGVCdWZmZXIgaW5kZXhJbmZvKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAgICAgUm93SW5kZXhFbnRyeSBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBsb25nIGluZGV4RmlsZVBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgICAgIGRlZmF1bHQgUm93SW5kZXhFbnRyeSBkZXNlcmlhbGl6ZShSYW5kb21BY2Nlc3NSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplKHJlYWRlciwgcmVhZGVyLmdldEZpbGVQb2ludGVyKCkpOworCisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0IFJvd0luZGV4RW50cnkgZGVzZXJpYWxpemUoRmlsZURhdGFJbnB1dCBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZShpbnB1dCwgaW5wdXQuZ2V0RmlsZVBvaW50ZXIoKSk7CisKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2VyaWFsaXplRm9yQ2FjaGUoUm93SW5kZXhFbnRyeSByaWUsIERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgICAgIFJvd0luZGV4RW50cnkgZGVzZXJpYWxpemVGb3JDYWNoZShEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAgICAgbG9uZyBkZXNlcmlhbGl6ZVBvc2l0aW9uQW5kU2tpcChEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAgICAgSVNlcmlhbGl6ZXIgaW5kZXhJbmZvU2VyaWFsaXplcigpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU2VyaWFsaXplciBpbXBsZW1lbnRzIEluZGV4U2VyaWFsaXplcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbmRleEluZm8uU2VyaWFsaXplciBpZHhJbmZvU2VyaWFsaXplcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBWZXJzaW9uIHZlcnNpb247CisgICAgICAgIHByaXZhdGUgZmluYWwgVGFibGVNZXRyaWNzIHRhYmxlTWV0cmljczsKKworICAgICAgICBwdWJsaWMgU2VyaWFsaXplcihWZXJzaW9uIHZlcnNpb24sIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyLCBUYWJsZU1ldHJpY3MgdGFibGVNZXRyaWNzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmlkeEluZm9TZXJpYWxpemVyID0gSW5kZXhJbmZvLnNlcmlhbGl6ZXIodmVyc2lvbiwgaGVhZGVyKTsKKyAgICAgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247CisgICAgICAgICAgICB0aGlzLnRhYmxlTWV0cmljcyA9IHRhYmxlTWV0cmljczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSW5kZXhJbmZvLlNlcmlhbGl6ZXIgaW5kZXhJbmZvU2VyaWFsaXplcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpZHhJbmZvU2VyaWFsaXplcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoUm93SW5kZXhFbnRyeSByaWUsIERhdGFPdXRwdXRQbHVzIG91dCwgQnl0ZUJ1ZmZlciBpbmRleEluZm8pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICByaWUuc2VyaWFsaXplKG91dCwgaW5kZXhJbmZvKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemVGb3JDYWNoZShSb3dJbmRleEVudHJ5IHJpZSwgRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcmllLnNlcmlhbGl6ZUZvckNhY2hlKG91dCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJvd0luZGV4RW50cnkgZGVzZXJpYWxpemVGb3JDYWNoZShEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBwb3NpdGlvbiA9IGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKworICAgICAgICAgICAgc3dpdGNoIChpbi5yZWFkQnl0ZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQ0FDSEVfTk9UX0lOREVYRUQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUm93SW5kZXhFbnRyeShwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgY2FzZSBDQUNIRV9JTkRFWEVEOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEluZGV4ZWRFbnRyeShwb3NpdGlvbiwgaW4sIGlkeEluZm9TZXJpYWxpemVyKTsKKyAgICAgICAgICAgICAgICBjYXNlIENBQ0hFX0lOREVYRURfU0hBTExPVzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaGFsbG93SW5kZXhlZEVudHJ5KHBvc2l0aW9uLCBpbiwgaWR4SW5mb1NlcmlhbGl6ZXIpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNraXBGb3JDYWNoZShEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgc3dpdGNoIChpbi5yZWFkQnl0ZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQ0FDSEVfTk9UX0lOREVYRUQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0FDSEVfSU5ERVhFRDoKKyAgICAgICAgICAgICAgICAgICAgSW5kZXhlZEVudHJ5LnNraXBGb3JDYWNoZShpbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0FDSEVfSU5ERVhFRF9TSEFMTE9XOgorICAgICAgICAgICAgICAgICAgICBTaGFsbG93SW5kZXhlZEVudHJ5LnNraXBGb3JDYWNoZShpbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUm93SW5kZXhFbnRyeSBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBsb25nIGluZGV4RmlsZVBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBwb3NpdGlvbiA9IGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKworICAgICAgICAgICAgaW50IHNpemUgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChzaXplID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSb3dJbmRleEVudHJ5KHBvc2l0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIGhlYWRlckxlbmd0aCA9IGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgICAgICBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lID0gRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4pOworICAgICAgICAgICAgICAgIGludCBjb2x1bW5zSW5kZXhDb3VudCA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOworCisgICAgICAgICAgICAgICAgY2hlY2tTaXplKGNvbHVtbnNJbmRleENvdW50LCBzaXplKTsKKworICAgICAgICAgICAgICAgIGludCBpbmRleGVkUGFydFNpemUgPSBzaXplIC0gc2VyaWFsaXplZFNpemUoZGVsZXRpb25UaW1lLCBoZWFkZXJMZW5ndGgsIGNvbHVtbnNJbmRleENvdW50KTsKKworICAgICAgICAgICAgICAgIGlmIChzaXplIDw9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRDb2x1bW5JbmRleENhY2hlU2l6ZSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbmRleGVkRW50cnkocG9zaXRpb24sIGluLCBkZWxldGlvblRpbWUsIGhlYWRlckxlbmd0aCwgY29sdW1uc0luZGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeEluZm9TZXJpYWxpemVyLCBpbmRleGVkUGFydFNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbi5za2lwQnl0ZXMoaW5kZXhlZFBhcnRTaXplKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNoYWxsb3dJbmRleGVkRW50cnkocG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEZpbGVQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0aW9uVGltZSwgaGVhZGVyTGVuZ3RoLCBjb2x1bW5zSW5kZXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ZWRQYXJ0U2l6ZSwgaWR4SW5mb1NlcmlhbGl6ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja1NpemUoaW50IGVudHJpZXMsIGludCBieXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZENvbW1hbmQgY29tbWFuZCA9IFJlYWRDb21tYW5kLmdldENvbW1hbmQoKTsKKyAgICAgICAgICAgIGlmIChjb21tYW5kID09IG51bGwgfHwgU2NoZW1hQ29uc3RhbnRzLmlzU3lzdGVtS2V5c3BhY2UoY29tbWFuZC5tZXRhZGF0YSgpLmtleXNwYWNlKSB8fCAhRGF0YWJhc2VEZXNjcmlwdG9yLmdldFJlYWRUaHJlc2hvbGRzRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kIHdhcm5UaHJlc2hvbGQgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Um93SW5kZXhSZWFkU2l6ZVdhcm5UaHJlc2hvbGQoKTsKKyAgICAgICAgICAgIERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCBmYWlsVGhyZXNob2xkID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFJvd0luZGV4UmVhZFNpemVGYWlsVGhyZXNob2xkKCk7CisgICAgICAgICAgICBpZiAod2FyblRocmVzaG9sZCA9PSBudWxsICYmIGZhaWxUaHJlc2hvbGQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGxvbmcgZXN0aW1hdGVkTWVtb3J5ID0gZXN0aW1hdGVNYXRlcmlhbGl6ZWRJbmRleFNpemUoZW50cmllcywgYnl0ZXMpOworICAgICAgICAgICAgaWYgKHRhYmxlTWV0cmljcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRhYmxlTWV0cmljcy5yb3dJbmRleFNpemUudXBkYXRlKGVzdGltYXRlZE1lbW9yeSk7CisKKyAgICAgICAgICAgIGlmIChmYWlsVGhyZXNob2xkICE9IG51bGwgJiYgZXN0aW1hdGVkTWVtb3J5ID4gZmFpbFRocmVzaG9sZC50b0J5dGVzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoIlF1ZXJ5ICVzIGF0dGVtcHRlZCB0byBhY2Nlc3MgYSBsYXJnZSBSb3dJbmRleEVudHJ5IGVzdGltYXRlZCB0byBiZSAlZCBieXRlcyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4tbWVtb3J5ICh0b3RhbCBlbnRyaWVzOiAlZCwgdG90YWwgYnl0ZXM6ICVkKSBidXQgdGhlIG1heCBhbGxvd2VkIGlzICVzOyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcXVlcnkgYWJvcnRlZCAgKHNlZSByb3dfaW5kZXhfcmVhZF9zaXplX2ZhaWxfdGhyZXNob2xkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC50b0NRTFN0cmluZygpLCBlc3RpbWF0ZWRNZW1vcnksIGVudHJpZXMsIGJ5dGVzLCBmYWlsVGhyZXNob2xkKTsKKyAgICAgICAgICAgICAgICBNZXNzYWdlUGFyYW1zLnJlbW92ZShQYXJhbVR5cGUuUk9XX0lOREVYX1JFQURfU0laRV9XQVJOKTsKKyAgICAgICAgICAgICAgICBNZXNzYWdlUGFyYW1zLmFkZChQYXJhbVR5cGUuUk9XX0lOREVYX1JFQURfU0laRV9GQUlMLCBlc3RpbWF0ZWRNZW1vcnkpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJvd0luZGV4RW50cnlSZWFkU2l6ZVRvb0xhcmdlRXhjZXB0aW9uKG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh3YXJuVGhyZXNob2xkICE9IG51bGwgJiYgZXN0aW1hdGVkTWVtb3J5ID4gd2FyblRocmVzaG9sZC50b0J5dGVzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gdXNlIGFkZElmTGFyZ2VyIHJhdGhlciB0aGFuIGFkZCBhcyBhIHByZXZpb3VzIHBhcnRpdGlvbiBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhpcyBvbmUKKyAgICAgICAgICAgICAgICBMb25nIGN1cnJlbnQgPSBNZXNzYWdlUGFyYW1zLmdldChQYXJhbVR5cGUuUk9XX0lOREVYX1JFQURfU0laRV9XQVJOKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsIHx8IGN1cnJlbnQuY29tcGFyZVRvKGVzdGltYXRlZE1lbW9yeSkgPCAwKQorICAgICAgICAgICAgICAgICAgICBNZXNzYWdlUGFyYW1zLmFkZChQYXJhbVR5cGUuUk9XX0lOREVYX1JFQURfU0laRV9XQVJOLCBlc3RpbWF0ZWRNZW1vcnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBlc3RpbWF0ZU1hdGVyaWFsaXplZEluZGV4U2l6ZShpbnQgZW50cmllcywgaW50IGJ5dGVzKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIG92ZXJoZWFkID0gSW5kZXhJbmZvLkVNUFRZX1NJWkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEFycmF5Q2x1c3RlcmluZy5FTVBUWV9TSVpFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBEZWxldGlvblRpbWUuRU1QVFlfU0laRTsKKworICAgICAgICAgICAgcmV0dXJuIChvdmVyaGVhZCAqIGVudHJpZXMpICsgYnl0ZXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZGVzZXJpYWxpemVQb3NpdGlvbkFuZFNraXAoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgcG9zaXRpb24gPSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisKKyAgICAgICAgICAgIGludCBzaXplID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CisgICAgICAgICAgICBpZiAoc2l6ZSA+IDApCisgICAgICAgICAgICAgICAgaW4uc2tpcEJ5dGVzRnVsbHkoc2l6ZSk7CisKKyAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWFkcyBvbmx5IHRoZSBkYXRhICdwb3NpdGlvbicgb2YgdGhlIGluZGV4IGVudHJ5IGFuZCByZXR1cm5zIGl0LiBOb3RlIHRoYXQgdGhpcyBsZWZ0ICdpbicgaW4gdGhlIG1pZGRsZQorICAgICAgICAgKiBvZiByZWFkaW5nIGFuIGVudHJ5LCBzbyB0aGlzIGlzIG9ubHkgdXNlZnVsIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyBhbmQgaW4gbW9zdCBjYXNlICdkZXNlcmlhbGl6ZScKKyAgICAgICAgICogc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgbG9uZyByZWFkUG9zaXRpb24oRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2tpcChEYXRhSW5wdXRQbHVzIGluLCBWZXJzaW9uIHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICByZWFkUG9zaXRpb24oaW4pOworICAgICAgICAgICAgc2tpcFByb21vdGVkSW5kZXgoaW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBza2lwUHJvbW90ZWRJbmRleChEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaW50IHNpemUgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChzaXplIDw9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpbi5za2lwQnl0ZXNGdWxseShzaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBzZXJpYWxpemVkU2l6ZShEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lLCBsb25nIGhlYWRlckxlbmd0aCwgaW50IGNvbHVtbkluZGV4Q291bnQpCisgICAgeworICAgICAgICByZXR1cm4gVHlwZVNpemVzLnNpemVvZlVuc2lnbmVkVkludChoZWFkZXJMZW5ndGgpCisgICAgICAgICAgICAgICArIChpbnQpIERlbGV0aW9uVGltZS5zZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKGRlbGV0aW9uVGltZSkKKyAgICAgICAgICAgICAgICsgVHlwZVNpemVzLnNpemVvZlVuc2lnbmVkVkludChjb2x1bW5JbmRleENvdW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoRGF0YU91dHB1dFBsdXMgb3V0LCBCeXRlQnVmZmVyIGluZGV4SW5mbykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQocG9zaXRpb24pOworCisgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZUZvckNhY2hlKERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQocG9zaXRpb24pOworCisgICAgICAgIG91dC53cml0ZUJ5dGUoQ0FDSEVfTk9UX0lOREVYRUQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGVudHJ5IGluIHRoZSByb3cgaW5kZXggZm9yIGEgcm93IHdob3NlIGNvbHVtbnMgYXJlIGluZGV4ZWQgLSB1c2VkIGZvciBib3RoIGxlZ2FjeSBhbmQgY3VycmVudCBmb3JtYXRzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEluZGV4ZWRFbnRyeSBleHRlbmRzIFJvd0luZGV4RW50cnkKKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQkFTRV9TSVpFOworCisgICAgICAgIHN0YXRpYworICAgICAgICB7CisgICAgICAgICAgICBCQVNFX1NJWkUgPSBPYmplY3RTaXplcy5tZWFzdXJlKG5ldyBJbmRleGVkRW50cnkoMCwgRGVsZXRpb25UaW1lLkxJVkUsIDAsIG51bGwsIG51bGwsIDAsIG51bGwpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmluYWwgRGVsZXRpb25UaW1lIGRlbGV0aW9uVGltZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGhlYWRlckxlbmd0aDsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEluZGV4SW5mb1tdIGNvbHVtbnNJbmRleDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnRbXSBvZmZzZXRzOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBpbmRleGVkUGFydFNpemU7CisgICAgICAgIEBVbm1ldGVyZWQKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJU2VyaWFsaXplcjxJbmRleEluZm8+IGlkeEluZm9TZXJpYWxpemVyOworCisgICAgICAgIHByaXZhdGUgSW5kZXhlZEVudHJ5KGxvbmcgZGF0YUZpbGVQb3NpdGlvbiwgRGVsZXRpb25UaW1lIGRlbGV0aW9uVGltZSwgbG9uZyBoZWFkZXJMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4SW5mb1tdIGNvbHVtbnNJbmRleCwgaW50W10gb2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ZWRQYXJ0U2l6ZSwgSVNlcmlhbGl6ZXI8SW5kZXhJbmZvPiBpZHhJbmZvU2VyaWFsaXplcikKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZGF0YUZpbGVQb3NpdGlvbik7CisKKyAgICAgICAgICAgIHRoaXMuaGVhZGVyTGVuZ3RoID0gaGVhZGVyTGVuZ3RoOworICAgICAgICAgICAgdGhpcy5kZWxldGlvblRpbWUgPSBkZWxldGlvblRpbWU7CisKKyAgICAgICAgICAgIHRoaXMuY29sdW1uc0luZGV4ID0gY29sdW1uc0luZGV4OworICAgICAgICAgICAgdGhpcy5vZmZzZXRzID0gb2Zmc2V0czsKKyAgICAgICAgICAgIHRoaXMuaW5kZXhlZFBhcnRTaXplID0gaW5kZXhlZFBhcnRTaXplOworICAgICAgICAgICAgdGhpcy5pZHhJbmZvU2VyaWFsaXplciA9IGlkeEluZm9TZXJpYWxpemVyOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBJbmRleGVkRW50cnkobG9uZyBkYXRhRmlsZVBvc2l0aW9uLCBEYXRhSW5wdXRQbHVzIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lLCBsb25nIGhlYWRlckxlbmd0aCwgaW50IGNvbHVtbkluZGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4SW5mby5TZXJpYWxpemVyIGlkeEluZm9TZXJpYWxpemVyLCBpbnQgaW5kZXhlZFBhcnRTaXplKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZGF0YUZpbGVQb3NpdGlvbik7CisKKyAgICAgICAgICAgIHRoaXMuaGVhZGVyTGVuZ3RoID0gaGVhZGVyTGVuZ3RoOworICAgICAgICAgICAgdGhpcy5kZWxldGlvblRpbWUgPSBkZWxldGlvblRpbWU7CisgICAgICAgICAgICBpbnQgY29sdW1uc0luZGV4Q291bnQgPSBjb2x1bW5JbmRleENvdW50OworCisgICAgICAgICAgICB0aGlzLmNvbHVtbnNJbmRleCA9IG5ldyBJbmRleEluZm9bY29sdW1uc0luZGV4Q291bnRdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zSW5kZXhDb3VudDsgaSsrKQorICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uc0luZGV4W2ldID0gaWR4SW5mb1NlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4pOworCisgICAgICAgICAgICB0aGlzLm9mZnNldHMgPSBuZXcgaW50W3RoaXMuY29sdW1uc0luZGV4Lmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9mZnNldHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgb2Zmc2V0c1tpXSA9IGluLnJlYWRJbnQoKTsKKworICAgICAgICAgICAgdGhpcy5pbmRleGVkUGFydFNpemUgPSBpbmRleGVkUGFydFNpemU7CisKKyAgICAgICAgICAgIHRoaXMuaWR4SW5mb1NlcmlhbGl6ZXIgPSBpZHhJbmZvU2VyaWFsaXplcjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RvciBjYWxsZWQgZnJvbSB7QGxpbmsgU2VyaWFsaXplciNkZXNlcmlhbGl6ZUZvckNhY2hlKG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1cyl9LgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBJbmRleGVkRW50cnkobG9uZyBkYXRhRmlsZVBvc2l0aW9uLCBEYXRhSW5wdXRQbHVzIGluLCBJU2VyaWFsaXplcjxJbmRleEluZm8+IGlkeEluZm9TZXJpYWxpemVyKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZGF0YUZpbGVQb3NpdGlvbik7CisKKyAgICAgICAgICAgIHRoaXMuaGVhZGVyTGVuZ3RoID0gaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgdGhpcy5kZWxldGlvblRpbWUgPSBEZWxldGlvblRpbWUuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbik7CisgICAgICAgICAgICBpbnQgY29sdW1uc0luZGV4Q291bnQgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKKworICAgICAgICAgICAgVHJhY2tlZERhdGFJbnB1dFBsdXMgdHJhY2tlZEluID0gbmV3IFRyYWNrZWREYXRhSW5wdXRQbHVzKGluKTsKKworICAgICAgICAgICAgdGhpcy5jb2x1bW5zSW5kZXggPSBuZXcgSW5kZXhJbmZvW2NvbHVtbnNJbmRleENvdW50XTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uc0luZGV4Q291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbnNJbmRleFtpXSA9IGlkeEluZm9TZXJpYWxpemVyLmRlc2VyaWFsaXplKHRyYWNrZWRJbik7CisKKyAgICAgICAgICAgIHRoaXMub2Zmc2V0cyA9IG51bGw7CisKKyAgICAgICAgICAgIHRoaXMuaW5kZXhlZFBhcnRTaXplID0gKGludCkgdHJhY2tlZEluLmdldEJ5dGVzUmVhZCgpOworCisgICAgICAgICAgICB0aGlzLmlkeEluZm9TZXJpYWxpemVyID0gaWR4SW5mb1NlcmlhbGl6ZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaW5kZXhPbkhlYXAoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGJsb2NrQ291bnQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY29sdW1uc0luZGV4Lmxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRGVsZXRpb25UaW1lIGRlbGV0aW9uVGltZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZWxldGlvblRpbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEluZGV4SW5mb1JldHJpZXZlciBvcGVuV2l0aEluZGV4KEZpbGVIYW5kbGUgaW5kZXhGaWxlKQorICAgICAgICB7CisgICAgICAgICAgICBpbmRleEVudHJ5U2l6ZUhpc3RvZ3JhbS51cGRhdGUoc2VyaWFsaXplZFNpemUoZGVsZXRpb25UaW1lLCBoZWFkZXJMZW5ndGgsIGNvbHVtbnNJbmRleC5sZW5ndGgpICsgaW5kZXhlZFBhcnRTaXplKTsKKyAgICAgICAgICAgIGluZGV4SW5mb0NvdW50SGlzdG9ncmFtLnVwZGF0ZShjb2x1bW5zSW5kZXgubGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhJbmZvUmV0cmlldmVyKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcml2YXRlIGludCByZXRyaWV2YWxzOworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIEluZGV4SW5mbyBjb2x1bW5zSW5kZXgoaW50IGluZGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0cmlldmFscysrOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uc0luZGV4W2luZGV4XTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbmRleEluZm9HZXRzSGlzdG9ncmFtLnVwZGF0ZShyZXRyaWV2YWxzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIHVuc2hhcmVkSGVhcFNpemUoKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGVudHJ5U2l6ZSA9IDA7CisgICAgICAgICAgICBmb3IgKEluZGV4SW5mbyBpZHggOiBjb2x1bW5zSW5kZXgpCisgICAgICAgICAgICAgICAgZW50cnlTaXplICs9IGlkeC51bnNoYXJlZEhlYXBTaXplKCk7CisgICAgICAgICAgICByZXR1cm4gQkFTRV9TSVpFCisgICAgICAgICAgICAgICAgKyBlbnRyeVNpemUKKyAgICAgICAgICAgICAgICArIE9iamVjdFNpemVzLnNpemVPZlJlZmVyZW5jZUFycmF5KGNvbHVtbnNJbmRleC5sZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShEYXRhT3V0cHV0UGx1cyBvdXQsIEJ5dGVCdWZmZXIgaW5kZXhJbmZvKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IGluZGV4ZWRQYXJ0U2l6ZSAhPSBJbnRlZ2VyLk1JTl9WQUxVRTsKKworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHBvc2l0aW9uKTsKKworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoc2VyaWFsaXplZFNpemUoZGVsZXRpb25UaW1lLCBoZWFkZXJMZW5ndGgsIGNvbHVtbnNJbmRleC5sZW5ndGgpICsgaW5kZXhlZFBhcnRTaXplKTsKKworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGhlYWRlckxlbmd0aCk7CisgICAgICAgICAgICBEZWxldGlvblRpbWUuc2VyaWFsaXplci5zZXJpYWxpemUoZGVsZXRpb25UaW1lLCBvdXQpOworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoY29sdW1uc0luZGV4Lmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKEluZGV4SW5mbyBpbmZvIDogY29sdW1uc0luZGV4KQorICAgICAgICAgICAgICAgIGlkeEluZm9TZXJpYWxpemVyLnNlcmlhbGl6ZShpbmZvLCBvdXQpOworICAgICAgICAgICAgZm9yIChpbnQgb2Zmc2V0IDogb2Zmc2V0cykKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVJbnQob2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemVGb3JDYWNoZShEYXRhT3V0cHV0UGx1cyBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQocG9zaXRpb24pOworICAgICAgICAgICAgb3V0LndyaXRlQnl0ZShDQUNIRV9JTkRFWEVEKTsKKworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGhlYWRlckxlbmd0aCk7CisgICAgICAgICAgICBEZWxldGlvblRpbWUuc2VyaWFsaXplci5zZXJpYWxpemUoZGVsZXRpb25UaW1lLCBvdXQpOworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoYmxvY2tDb3VudCgpKTsKKworICAgICAgICAgICAgZm9yIChJbmRleEluZm8gaW5kZXhJbmZvIDogY29sdW1uc0luZGV4KQorICAgICAgICAgICAgICAgIGlkeEluZm9TZXJpYWxpemVyLnNlcmlhbGl6ZShpbmRleEluZm8sIG91dCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgdm9pZCBza2lwRm9yQ2FjaGUoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgIERlbGV0aW9uVGltZS5zZXJpYWxpemVyLnNraXAoaW4pOworICAgICAgICAgICAgaW4ucmVhZFVuc2lnbmVkVkludCgpOworCisgICAgICAgICAgICBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBlbnRyeSBpbiB0aGUgcm93IGluZGV4IGZvciBhIHJvdyB3aG9zZSBjb2x1bW5zIGFyZSBpbmRleGVkIGFuZCB0aGUge0BsaW5rIEluZGV4SW5mb30gb2JqZWN0cworICAgICAqIGFyZSBub3QgcmVhZCBpbnRvIHRoZSBrZXkgY2FjaGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU2hhbGxvd0luZGV4ZWRFbnRyeSBleHRlbmRzIFJvd0luZGV4RW50cnkKKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQkFTRV9TSVpFOworCisgICAgICAgIHN0YXRpYworICAgICAgICB7CisgICAgICAgICAgICBCQVNFX1NJWkUgPSBPYmplY3RTaXplcy5tZWFzdXJlKG5ldyBTaGFsbG93SW5kZXhlZEVudHJ5KDAsIDAsIERlbGV0aW9uVGltZS5MSVZFLCAwLCAxMCwgMCwgbnVsbCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGluZGV4RmlsZVBvc2l0aW9uOworCisgICAgICAgIHByaXZhdGUgZmluYWwgRGVsZXRpb25UaW1lIGRlbGV0aW9uVGltZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGhlYWRlckxlbmd0aDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgY29sdW1uc0luZGV4Q291bnQ7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXhlZFBhcnRTaXplOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBvZmZzZXRzT2Zmc2V0OworICAgICAgICBAVW5tZXRlcmVkCisgICAgICAgIHByaXZhdGUgZmluYWwgSVNlcmlhbGl6ZXI8SW5kZXhJbmZvPiBpZHhJbmZvU2VyaWFsaXplcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgZmllbGRzU2VyaWFsaXplZFNpemU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNlZSB7QGxpbmsgI2NyZWF0ZShsb25nLCBsb25nLCBEZWxldGlvblRpbWUsIGxvbmcsIGludCwgaW50LCBMaXN0LCBpbnRbXSwgSVNlcmlhbGl6ZXIpfSBmb3IgYSBkZXNjcmlwdGlvbgorICAgICAgICAgKiBvZiB0aGUgcGFyYW1ldGVycy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgU2hhbGxvd0luZGV4ZWRFbnRyeShsb25nIGRhdGFGaWxlUG9zaXRpb24sIGxvbmcgaW5kZXhGaWxlUG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lLCBsb25nIGhlYWRlckxlbmd0aCwgaW50IGNvbHVtbkluZGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhlZFBhcnRTaXplLCBJU2VyaWFsaXplcjxJbmRleEluZm8+IGlkeEluZm9TZXJpYWxpemVyKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihkYXRhRmlsZVBvc2l0aW9uKTsKKworICAgICAgICAgICAgYXNzZXJ0IGNvbHVtbkluZGV4Q291bnQgPiAxOworCisgICAgICAgICAgICB0aGlzLmluZGV4RmlsZVBvc2l0aW9uID0gaW5kZXhGaWxlUG9zaXRpb247CisgICAgICAgICAgICB0aGlzLmhlYWRlckxlbmd0aCA9IGhlYWRlckxlbmd0aDsKKyAgICAgICAgICAgIHRoaXMuZGVsZXRpb25UaW1lID0gZGVsZXRpb25UaW1lOworICAgICAgICAgICAgdGhpcy5jb2x1bW5zSW5kZXhDb3VudCA9IGNvbHVtbkluZGV4Q291bnQ7CisKKyAgICAgICAgICAgIHRoaXMuaW5kZXhlZFBhcnRTaXplID0gaW5kZXhlZFBhcnRTaXplOworICAgICAgICAgICAgdGhpcy5pZHhJbmZvU2VyaWFsaXplciA9IGlkeEluZm9TZXJpYWxpemVyOworCisgICAgICAgICAgICB0aGlzLmZpZWxkc1NlcmlhbGl6ZWRTaXplID0gc2VyaWFsaXplZFNpemUoZGVsZXRpb25UaW1lLCBoZWFkZXJMZW5ndGgsIGNvbHVtbkluZGV4Q291bnQpOworICAgICAgICAgICAgdGhpcy5vZmZzZXRzT2Zmc2V0ID0gaW5kZXhlZFBhcnRTaXplICsgZmllbGRzU2VyaWFsaXplZFNpemUgLSBjb2x1bW5zSW5kZXhDb3VudCAqIFR5cGVTaXplcy5JTlRfU0laRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3Iga2V5LWNhY2hlIGRlc2VyaWFsaXphdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBTaGFsbG93SW5kZXhlZEVudHJ5KGxvbmcgZGF0YUZpbGVQb3NpdGlvbiwgRGF0YUlucHV0UGx1cyBpbiwgSW5kZXhJbmZvLlNlcmlhbGl6ZXIgaWR4SW5mb1NlcmlhbGl6ZXIpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihkYXRhRmlsZVBvc2l0aW9uKTsKKworICAgICAgICAgICAgdGhpcy5pbmRleEZpbGVQb3NpdGlvbiA9IGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKworICAgICAgICAgICAgdGhpcy5oZWFkZXJMZW5ndGggPSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICB0aGlzLmRlbGV0aW9uVGltZSA9IERlbGV0aW9uVGltZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGluKTsKKyAgICAgICAgICAgIHRoaXMuY29sdW1uc0luZGV4Q291bnQgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKKworICAgICAgICAgICAgdGhpcy5pbmRleGVkUGFydFNpemUgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKKworICAgICAgICAgICAgdGhpcy5pZHhJbmZvU2VyaWFsaXplciA9IGlkeEluZm9TZXJpYWxpemVyOworCisgICAgICAgICAgICB0aGlzLmZpZWxkc1NlcmlhbGl6ZWRTaXplID0gc2VyaWFsaXplZFNpemUoZGVsZXRpb25UaW1lLCBoZWFkZXJMZW5ndGgsIGNvbHVtbnNJbmRleENvdW50KTsKKyAgICAgICAgICAgIHRoaXMub2Zmc2V0c09mZnNldCA9IGluZGV4ZWRQYXJ0U2l6ZSArIGZpZWxkc1NlcmlhbGl6ZWRTaXplIC0gY29sdW1uc0luZGV4Q291bnQgKiBUeXBlU2l6ZXMuSU5UX1NJWkU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBibG9ja0NvdW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNvbHVtbnNJbmRleENvdW50OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRlbGV0aW9uVGltZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSW5kZXhJbmZvUmV0cmlldmVyIG9wZW5XaXRoSW5kZXgoRmlsZUhhbmRsZSBpbmRleEZpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluZGV4RW50cnlTaXplSGlzdG9ncmFtLnVwZGF0ZShpbmRleGVkUGFydFNpemUgKyBmaWVsZHNTZXJpYWxpemVkU2l6ZSk7CisgICAgICAgICAgICBpbmRleEluZm9Db3VudEhpc3RvZ3JhbS51cGRhdGUoY29sdW1uc0luZGV4Q291bnQpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBTaGFsbG93SW5mb1JldHJpZXZlcihpbmRleEZpbGVQb3NpdGlvbiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZJbnRDb2RpbmcuY29tcHV0ZVVuc2lnbmVkVkludFNpemUocG9zaXRpb24pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkludENvZGluZy5jb21wdXRlVW5zaWduZWRWSW50U2l6ZShpbmRleGVkUGFydFNpemUgKyBmaWVsZHNTZXJpYWxpemVkU2l6ZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHNTZXJpYWxpemVkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0c09mZnNldCAtIGZpZWxkc1NlcmlhbGl6ZWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEZpbGUuY3JlYXRlUmVhZGVyKCksIGlkeEluZm9TZXJpYWxpemVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyB1bnNoYXJlZEhlYXBTaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJBU0VfU0laRTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoRGF0YU91dHB1dFBsdXMgb3V0LCBCeXRlQnVmZmVyIGluZGV4SW5mbykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChwb3NpdGlvbik7CisKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGZpZWxkc1NlcmlhbGl6ZWRTaXplICsgaW5kZXhJbmZvLmxpbWl0KCkpOworCisgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoaGVhZGVyTGVuZ3RoKTsKKyAgICAgICAgICAgIERlbGV0aW9uVGltZS5zZXJpYWxpemVyLnNlcmlhbGl6ZShkZWxldGlvblRpbWUsIG91dCk7CisgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihjb2x1bW5zSW5kZXhDb3VudCk7CisKKyAgICAgICAgICAgIG91dC53cml0ZShpbmRleEluZm8pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZUZvckNhY2hlKERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChwb3NpdGlvbik7CisgICAgICAgICAgICBvdXQud3JpdGVCeXRlKENBQ0hFX0lOREVYRURfU0hBTExPVyk7CisKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChpbmRleEZpbGVQb3NpdGlvbik7CisKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChoZWFkZXJMZW5ndGgpOworICAgICAgICAgICAgRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGRlbGV0aW9uVGltZSwgb3V0KTsKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGNvbHVtbnNJbmRleENvdW50KTsKKworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoaW5kZXhlZFBhcnRTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyB2b2lkIHNraXBGb3JDYWNoZShEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaW4ucmVhZFVuc2lnbmVkVkludCgpOworCisgICAgICAgICAgICBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICBEZWxldGlvblRpbWUuc2VyaWFsaXplci5za2lwKGluKTsKKyAgICAgICAgICAgIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKworICAgICAgICAgICAgaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU2hhbGxvd0luZm9SZXRyaWV2ZXIgZXh0ZW5kcyBGaWxlSW5kZXhJbmZvUmV0cmlldmVyCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBvZmZzZXRzT2Zmc2V0OworCisgICAgICAgIHByaXZhdGUgU2hhbGxvd0luZm9SZXRyaWV2ZXIobG9uZyBpbmRleEluZm9GaWxlUG9zaXRpb24sIGludCBvZmZzZXRzT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEYXRhSW5wdXQgaW5kZXhSZWFkZXIsIElTZXJpYWxpemVyPEluZGV4SW5mbz4gaWR4SW5mb1NlcmlhbGl6ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGluZGV4SW5mb0ZpbGVQb3NpdGlvbiwgaW5kZXhSZWFkZXIsIGlkeEluZm9TZXJpYWxpemVyKTsKKyAgICAgICAgICAgIHRoaXMub2Zmc2V0c09mZnNldCA9IG9mZnNldHNPZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgSW5kZXhJbmZvIGZldGNoSW5kZXgoaW50IGluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgLy8gc2VlayB0byBwb3NpdGlvbiBpbiAib2Zmc2V0cyB0byBJbmRleEluZm8iIHRhYmxlCisgICAgICAgICAgICBpbmRleFJlYWRlci5zZWVrKGluZGV4SW5mb0ZpbGVQb3NpdGlvbiArIG9mZnNldHNPZmZzZXQgKyBpbmRleCAqIFR5cGVTaXplcy5JTlRfU0laRSk7CisKKyAgICAgICAgICAgIC8vIHJlYWQgb2Zmc2V0IG9mIEluZGV4SW5mbworICAgICAgICAgICAgaW50IGluZGV4SW5mb1BvcyA9IGluZGV4UmVhZGVyLnJlYWRJbnQoKTsKKworICAgICAgICAgICAgLy8gc2VlayB0byBwb3Npc2lvbiBvZiBJbmRleEluZm8KKyAgICAgICAgICAgIGluZGV4UmVhZGVyLnNlZWsoaW5kZXhJbmZvRmlsZVBvc2l0aW9uICsgaW5kZXhJbmZvUG9zKTsKKworICAgICAgICAgICAgLy8gZmluYWxseSwgZGVzZXJpYWxpemUgSW5kZXhJbmZvCisgICAgICAgICAgICByZXR1cm4gaWR4SW5mb1NlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW5kZXhSZWFkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQmFzZSBjbGFzcyB0byBhY2Nlc3Mge0BsaW5rIEluZGV4SW5mb30gb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIEluZGV4SW5mb1JldHJpZXZlciBleHRlbmRzIEF1dG9DbG9zZWFibGUKKyAgICB7CisgICAgICAgIEluZGV4SW5mbyBjb2x1bW5zSW5kZXgoaW50IGluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAgICAgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCYXNlIGNsYXNzIHRvIGFjY2VzcyB7QGxpbmsgSW5kZXhJbmZvfSBvYmplY3RzIG9uIGRpc2sgdGhhdCBrZWVwcyBhbHJlYWR5CisgICAgICogcmVhZCB7QGxpbmsgSW5kZXhJbmZvfSBvbiBoZWFwLgorICAgICAqLworICAgIHByaXZhdGUgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEZpbGVJbmRleEluZm9SZXRyaWV2ZXIgaW1wbGVtZW50cyBJbmRleEluZm9SZXRyaWV2ZXIKKyAgICB7CisgICAgICAgIGZpbmFsIGxvbmcgaW5kZXhJbmZvRmlsZVBvc2l0aW9uOworICAgICAgICBmaW5hbCBJU2VyaWFsaXplcjxJbmRleEluZm8+IGlkeEluZm9TZXJpYWxpemVyOworICAgICAgICBmaW5hbCBGaWxlRGF0YUlucHV0IGluZGV4UmVhZGVyOworICAgICAgICBpbnQgcmV0cmlldmFsczsKKworICAgICAgICAvKioKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGluZGV4SW5mb0ZpbGVQb3NpdGlvbiBvZmZzZXQgb2YgZmlyc3Qgc2VyaWFsaXplZCB7QGxpbmsgSW5kZXhJbmZvfSBvYmplY3QKKyAgICAgICAgICogQHBhcmFtIGluZGV4UmVhZGVyIGZpbGUgZGF0YSBpbnB1dCB0byBhY2Nlc3MgdGhlIGluZGV4IGZpbGUsIGNsb3NlZCBieSB0aGlzIGluc3RhbmNlCisgICAgICAgICAqIEBwYXJhbSBpZHhJbmZvU2VyaWFsaXplciB0aGUgaW5kZXggc2VyaWFsaXplciB0byBkZXNlcmlhbGl6ZSB7QGxpbmsgSW5kZXhJbmZvfSBvYmplY3RzCisgICAgICAgICAqLworICAgICAgICBGaWxlSW5kZXhJbmZvUmV0cmlldmVyKGxvbmcgaW5kZXhJbmZvRmlsZVBvc2l0aW9uLCBGaWxlRGF0YUlucHV0IGluZGV4UmVhZGVyLCBJU2VyaWFsaXplcjxJbmRleEluZm8+IGlkeEluZm9TZXJpYWxpemVyKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmluZGV4SW5mb0ZpbGVQb3NpdGlvbiA9IGluZGV4SW5mb0ZpbGVQb3NpdGlvbjsKKyAgICAgICAgICAgIHRoaXMuaWR4SW5mb1NlcmlhbGl6ZXIgPSBpZHhJbmZvU2VyaWFsaXplcjsKKyAgICAgICAgICAgIHRoaXMuaW5kZXhSZWFkZXIgPSBpbmRleFJlYWRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgZmluYWwgSW5kZXhJbmZvIGNvbHVtbnNJbmRleChpbnQgaW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICByZXRyaWV2YWxzKys7CisgICAgICAgICAgICByZXR1cm4gZmV0Y2hJbmRleChpbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBhYnN0cmFjdCBJbmRleEluZm8gZmV0Y2hJbmRleChpbnQgaW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaW5kZXhSZWFkZXIuY2xvc2UoKTsKKworICAgICAgICAgICAgaW5kZXhJbmZvR2V0c0hpc3RvZ3JhbS51cGRhdGUocmV0cmlldmFscyk7CisgICAgICAgICAgICBpbmRleEluZm9SZWFkc0hpc3RvZ3JhbS51cGRhdGUocmV0cmlldmFscyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJvd0luZGV4RW50cnlSZWFkU2l6ZVRvb0xhcmdlRXhjZXB0aW9uIGV4dGVuZHMgUmVqZWN0RXhjZXB0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgUm93SW5kZXhFbnRyeVJlYWRTaXplVG9vTGFyZ2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL1NTVGFibGVJdGVyYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL1NTVGFibGVJdGVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MTVkMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvU1NUYWJsZUl0ZXJhdG9yLmphdmEKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2xpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2xpY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlVuZmlsdGVyZWRWYWxpZGF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5SYW5nZVRvbWJzdG9uZU1hcmtlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFNTVGFibGVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZURhdGFJbnB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7CisKKy8qKgorICogIEEgQ2VsbCBJdGVyYXRvciBvdmVyIFNTVGFibGUKKyAqLworcHVibGljIGNsYXNzIFNTVGFibGVJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0U1NUYWJsZUl0ZXJhdG9yPFJvd0luZGV4RW50cnk+Cit7CisgICAgLyoqCisgICAgICogVGhlIGluZGV4IG9mIHRoZSBzbGljZSBiZWluZyBwcm9jZXNzZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc2xpY2U7CisKKyAgICBwdWJsaWMgU1NUYWJsZUl0ZXJhdG9yKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEYXRhSW5wdXQgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3dJbmRleEVudHJ5IGluZGV4RW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTbGljZXMgc2xpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uRmlsdGVyIGNvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSGFuZGxlIGlmaWxlKQorICAgIHsKKyAgICAgICAgc3VwZXIoc3N0YWJsZSwgZmlsZSwga2V5LCBpbmRleEVudHJ5LCBzbGljZXMsIGNvbHVtbnMsIGlmaWxlKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBjYWxsZXIgdG8gY2xvc2UKKyAgICBwcm90ZWN0ZWQgUmVhZGVyIGNyZWF0ZVJlYWRlckludGVybmFsKFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSwgRmlsZURhdGFJbnB1dCBmaWxlLCBib29sZWFuIHNob3VsZENsb3NlRmlsZSkKKyAgICB7CisgICAgICAgIHJldHVybiBpbmRleEVudHJ5LmlzSW5kZXhlZCgpCisgICAgICAgICAgICAgPyBuZXcgRm9yd2FyZEluZGV4ZWRSZWFkZXIoaW5kZXhFbnRyeSwgZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKQorICAgICAgICAgICAgIDogbmV3IEZvcndhcmRSZWFkZXIoZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IG5leHRTbGljZUluZGV4KCkKKyAgICB7CisgICAgICAgIGludCBuZXh0ID0gc2xpY2U7CisgICAgICAgIHNsaWNlKys7CisgICAgICAgIHJldHVybiBuZXh0OworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGhhc01vcmVTbGljZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNsaWNlIDwgc2xpY2VzLnNpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JldmVyc2VPcmRlcigpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBGb3J3YXJkSW5kZXhlZFJlYWRlciBleHRlbmRzIEZvcndhcmRSZWFkZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgSW5kZXhTdGF0ZSBpbmRleFN0YXRlOworCisgICAgICAgIHByaXZhdGUgaW50IGxhc3RCbG9ja0lkeDsgLy8gdGhlIGxhc3QgaW5kZXggYmxvY2sgdGhhdCBoYXMgZGF0YSBmb3IgdGhlIGN1cnJlbnQgcXVlcnkKKworICAgICAgICBwcml2YXRlIEZvcndhcmRJbmRleGVkUmVhZGVyKFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSwgRmlsZURhdGFJbnB1dCBmaWxlLCBib29sZWFuIHNob3VsZENsb3NlRmlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKTsKKyAgICAgICAgICAgIHRoaXMuaW5kZXhTdGF0ZSA9IG5ldyBJbmRleFN0YXRlKHRoaXMsIG1ldGFkYXRhLmNvbXBhcmF0b3IsIGluZGV4RW50cnksIGZhbHNlLCBpZmlsZSk7CisgICAgICAgICAgICB0aGlzLmxhc3RCbG9ja0lkeCA9IGluZGV4U3RhdGUuYmxvY2tzQ291bnQoKTsgLy8gaWYgd2UgbmV2ZXIgY2FsbCBzZXRGb3JTbGljZSwgdGhhdCdzIHdoZXJlIHdlIHdhbnQgdG8gc3RvcAorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7CisgICAgICAgICAgICB0aGlzLmluZGV4U3RhdGUuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRGb3JTbGljZShTbGljZSBzbGljZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyLnNldEZvclNsaWNlKHNsaWNlKTsKKworICAgICAgICAgICAgLy8gaWYgb3VyIHByZXZpb3VzIHNsaWNpbmcgYWxyZWFkeSBnb3QgdXMgdGhlIGJpZ2dlc3Qgcm93IGluIHRoZSBzc3RhYmxlLCB3ZSdyZSBkb25lCisgICAgICAgICAgICBpZiAoaW5kZXhTdGF0ZS5pc0RvbmUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbGljZURvbmUgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRmluZCB0aGUgZmlyc3QgaW5kZXggYmxvY2sgd2UnbGwgbmVlZCB0byByZWFkIGZvciB0aGUgc2xpY2UuCisgICAgICAgICAgICBpbnQgc3RhcnRJZHggPSBpbmRleFN0YXRlLmZpbmRCbG9ja0luZGV4KHNsaWNlLnN0YXJ0KCksIGluZGV4U3RhdGUuY3VycmVudEJsb2NrSWR4KCkpOworICAgICAgICAgICAgaWYgKHN0YXJ0SWR4ID49IGluZGV4U3RhdGUuYmxvY2tzQ291bnQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbGljZURvbmUgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRmluZCB0aGUgbGFzdCBpbmRleCBibG9jayB3ZSdsbCBuZWVkIHRvIHJlYWQgZm9yIHRoZSBzbGljZS4KKyAgICAgICAgICAgIGxhc3RCbG9ja0lkeCA9IGluZGV4U3RhdGUuZmluZEJsb2NrSW5kZXgoc2xpY2UuZW5kKCksIHN0YXJ0SWR4KTsKKworICAgICAgICAgICAgLy8gSWYgdGhlIHNsaWNlIGVuZCBpcyBiZWZvcmUgdGhlIHZlcnkgZmlyc3QgYmxvY2ssIHdlIGhhdmUgbm90aGluZyBmb3IgdGhhdCBzbGljZQorICAgICAgICAgICAgaWYgKGxhc3RCbG9ja0lkeCA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IHN0YXJ0SWR4IDwgMDsKKyAgICAgICAgICAgICAgICBzbGljZURvbmUgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgd2Ugc3RhcnQgYmVmb3JlIHRoZSB2ZXJ5IGZpcnN0IGJsb2NrLCBqdXN0IHJlYWQgZnJvbSB0aGUgZmlyc3Qgb25lLgorICAgICAgICAgICAgaWYgKHN0YXJ0SWR4IDwgMCkKKyAgICAgICAgICAgICAgICBzdGFydElkeCA9IDA7CisKKyAgICAgICAgICAgIC8vIElmIHRoYXQncyB0aGUgbGFzdCBibG9jayB3ZSB3ZXJlIHJlYWRpbmcsIHdlJ3JlIGFscmVhZHkgd2hlcmUgd2Ugd2FudCB0byBiZS4gT3RoZXJ3aXNlLAorICAgICAgICAgICAgLy8gc2VlayB0byB0aGF0IGZpcnN0IGJsb2NrCisgICAgICAgICAgICBpZiAoc3RhcnRJZHggIT0gaW5kZXhTdGF0ZS5jdXJyZW50QmxvY2tJZHgoKSkKKyAgICAgICAgICAgICAgICBpbmRleFN0YXRlLnNldFRvQmxvY2soc3RhcnRJZHgpOworCisgICAgICAgICAgICAvLyBUaGUgaW5kZXggc2VhcmNoIGlzIGJhc2VkIG9uIHRoZSBsYXN0IG5hbWUgb2YgdGhlIGluZGV4IGJsb2Nrcywgc28gYXQgdGhhdCBwb2ludCB3ZSBoYXZlIHRoYXQ6CisgICAgICAgICAgICAvLyAgIDEpIGluZGV4ZXNbY3VycmVudElkeCAtIDFdLmxhc3ROYW1lIDwgc2xpY2Uuc3RhcnQgPD0gaW5kZXhlc1tjdXJyZW50SWR4XS5sYXN0TmFtZQorICAgICAgICAgICAgLy8gICAyKSBpbmRleGVzW2xhc3RCbG9ja0lkeCAtIDFdLmxhc3ROYW1lIDwgc2xpY2UuZW5kIDw9IGluZGV4ZXNbbGFzdEJsb2NrSWR4XS5sYXN0TmFtZQorICAgICAgICAgICAgLy8gc28gaWYgY3VycmVudElkeCA9PSBsYXN0QmxvY2tJZHggYW5kIHNsaWNlLmVuZCA8IGluZGV4ZXNbY3VycmVudElkeF0uZmlyc3ROYW1lLCB3ZSdyZSBndWFyYW50ZWVkIHRoYXQgdGhlCisgICAgICAgICAgICAvLyB3aG9sZSBzbGljZSBpcyBiZXR3ZWVuIHRoZSBwcmV2aW91cyBibG9jayBlbmQgYW5kIHRoaXMgYmxvY2sgc3RhcnQsIGFuZCB0aHVzIGhhcyBubyBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICAvLyBkYXRhLiBPbmUgZXhjZXB0aW9uIGlzIGlmIHRoZSBwcmV2aW91cyBibG9jayBlbmRzIHdpdGggYW4gb3Blbk1hcmtlciBhcyBpdCB3aWxsIGNvdmVyIG91ciBzbGljZQorICAgICAgICAgICAgLy8gYW5kIHdlIG5lZWQgdG8gcmV0dXJuIGl0LgorICAgICAgICAgICAgaWYgKGluZGV4U3RhdGUuY3VycmVudEJsb2NrSWR4KCkgPT0gbGFzdEJsb2NrSWR4CisgICAgICAgICAgICAgICAgJiYgbWV0YWRhdGEoKS5jb21wYXJhdG9yLmNvbXBhcmUoc2xpY2UuZW5kKCksIGluZGV4U3RhdGUuY3VycmVudEluZGV4KCkuZmlyc3ROYW1lKSA8IDAKKyAgICAgICAgICAgICAgICAmJiBvcGVuTWFya2VyID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2xpY2VEb25lID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZCBjb21wdXRlTmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBPdXIgcHJldmlvdXMgcmVhZCBtaWdodCBoYXZlIG1hZGUgdXMgY3Jvc3MgYW4gaW5kZXggYmxvY2sgYm91bmRhcnkuIElmIHNvLCB1cGRhdGUgb3VyIGluZm9ybWF0aW9ucy4KKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSByZWFkIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFydGl0aW9uLCB0aGlzIGlzIGFsc28gd2hhdCB3aWxsIGluaXRpYWxpemUgdGhlIGluZGV4IHN0YXRlLgorICAgICAgICAgICAgICAgIGluZGV4U3RhdGUudXBkYXRlQmxvY2soKTsKKworICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgbmV4dCB1bmZpbHRlcmVkIHVubGVzcyB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQsIG9yIHdlJ3JlIGJleW9uZCBvdXIgc2xpY2UKKyAgICAgICAgICAgICAgICAvLyBlbmQgKG5vdGUgdGhhdCB1bmxlc3Mgd2UncmUgb24gdGhlIGxhc3QgYmxvY2sgZm9yIHRoZSBzbGljZSwgdGhlcmUgaXMgbm8gcG9pbnQKKyAgICAgICAgICAgICAgICAvLyBpbiBjaGVja2luZyB0aGUgc2xpY2UgZW5kKS4KKyAgICAgICAgICAgICAgICBpZiAoaW5kZXhTdGF0ZS5pc0RvbmUoKQorICAgICAgICAgICAgICAgICAgICB8fCBpbmRleFN0YXRlLmN1cnJlbnRCbG9ja0lkeCgpID4gbGFzdEJsb2NrSWR4CisgICAgICAgICAgICAgICAgICAgIHx8ICFkZXNlcmlhbGl6ZXIuaGFzTmV4dCgpCisgICAgICAgICAgICAgICAgICAgIHx8IChpbmRleFN0YXRlLmN1cnJlbnRCbG9ja0lkeCgpID09IGxhc3RCbG9ja0lkeCAmJiBkZXNlcmlhbGl6ZXIuY29tcGFyZU5leHRUbyhlbmQpID49IDApKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworCisgICAgICAgICAgICAgICAgVW5maWx0ZXJlZCBuZXh0ID0gZGVzZXJpYWxpemVyLnJlYWROZXh0KCk7CisgICAgICAgICAgICAgICAgVW5maWx0ZXJlZFZhbGlkYXRpb24ubWF5YmVWYWxpZGF0ZVVuZmlsdGVyZWQobmV4dCwgbWV0YWRhdGEoKSwga2V5LCBzc3RhYmxlKTsKKyAgICAgICAgICAgICAgICAvLyBXZSBtYXkgZ2V0IGVtcHR5IHJvdyBmb3IgdGhlIHNhbWUgcmVhc29uIGV4cHJlc3NlZCBvbiBVbmZpbHRlcmVkU2VyaWFsaXplci5kZXNlcmlhbGl6ZU9uZS4KKyAgICAgICAgICAgICAgICBpZiAobmV4dC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgaWYgKG5leHQua2luZCgpID09IFVuZmlsdGVyZWQuS2luZC5SQU5HRV9UT01CU1RPTkVfTUFSS0VSKQorICAgICAgICAgICAgICAgICAgICB1cGRhdGVPcGVuTWFya2VyKChSYW5nZVRvbWJzdG9uZU1hcmtlcikgbmV4dCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvU1NUYWJsZVJldmVyc2VkSXRlcmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9TU1RhYmxlUmV2ZXJzZWRJdGVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZTI1MzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvU1NUYWJsZVJldmVyc2VkSXRlcmF0b3IuamF2YQpAQCAtMCwwICsxLDQ2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQnVmZmVyQ2x1c3RlcmluZ0JvdW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdCb3VuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuTXV0YWJsZURlbGV0aW9uSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWd1bGFyQW5kU3RhdGljQ29sdW1uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbGljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbGljZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVW5maWx0ZXJlZFZhbGlkYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLkltbXV0YWJsZUJUcmVlUGFydGl0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuRW5jb2RpbmdTdGF0czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJhbmdlVG9tYnN0b25lQm91bmRNYXJrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5SYW5nZVRvbWJzdG9uZU1hcmtlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvd3M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQWJzdHJhY3RTU1RhYmxlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVEYXRhSW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkFic3RyYWN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnRyZWUuQlRyZWU7CisKKy8qKgorICogIEEgQ2VsbCBJdGVyYXRvciBpbiByZXZlcnNlZCBjbHVzdGVyaW5nIG9yZGVyIG92ZXIgU1NUYWJsZQorICovCitwdWJsaWMgY2xhc3MgU1NUYWJsZVJldmVyc2VkSXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFNTVGFibGVJdGVyYXRvcjxSb3dJbmRleEVudHJ5PgoreworICAgIC8qKgorICAgICAqIFRoZSBpbmRleCBvZiB0aGUgc2xpY2UgYmVpbmcgcHJvY2Vzc2VkLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHNsaWNlOworCisgICAgcHVibGljIFNTVGFibGVSZXZlcnNlZEl0ZXJhdG9yKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURhdGFJbnB1dCBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3dJbmRleEVudHJ5IGluZGV4RW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsaWNlcyBzbGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbkZpbHRlciBjb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSGFuZGxlIGlmaWxlKQorICAgIHsKKyAgICAgICAgc3VwZXIoc3N0YWJsZSwgZmlsZSwga2V5LCBpbmRleEVudHJ5LCBzbGljZXMsIGNvbHVtbnMsIGlmaWxlKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBjYWxsZXIgdG8gY2xvc2UKKyAgICBwcm90ZWN0ZWQgUmVhZGVyIGNyZWF0ZVJlYWRlckludGVybmFsKFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSwgRmlsZURhdGFJbnB1dCBmaWxlLCBib29sZWFuIHNob3VsZENsb3NlRmlsZSkKKyAgICB7CisgICAgICAgIHJldHVybiBpbmRleEVudHJ5LmlzSW5kZXhlZCgpCisgICAgICAgICAgICAgPyBuZXcgUmV2ZXJzZUluZGV4ZWRSZWFkZXIoaW5kZXhFbnRyeSwgZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKQorICAgICAgICAgICAgIDogbmV3IFJldmVyc2VSZWFkZXIoZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JldmVyc2VPcmRlcigpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IG5leHRTbGljZUluZGV4KCkKKyAgICB7CisgICAgICAgIGludCBuZXh0ID0gc2xpY2U7CisgICAgICAgIHNsaWNlKys7CisgICAgICAgIHJldHVybiBzbGljZXMuc2l6ZSgpIC0gKG5leHQgKyAxKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNNb3JlU2xpY2VzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzbGljZSA8IHNsaWNlcy5zaXplKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBSZXZlcnNlUmVhZGVyIGV4dGVuZHMgQWJzdHJhY3RSZWFkZXIKKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBSZXVzYWJsZVBhcnRpdGlvbkRhdGEgYnVmZmVyOworICAgICAgICBwcm90ZWN0ZWQgSXRlcmF0b3I8VW5maWx0ZXJlZD4gaXRlcmF0b3I7CisKKyAgICAgICAgLy8gU2V0IGluIGxvYWRGcm9tRGlzayAoKSBhbmQgdXNlZCBpbiBzZXRJdGVyYXRvciB0byBoYW5kbGUgcmFuZ2UgdG9tYnN0b25lIGV4dGVuZGluZyBvbiBtdWx0aXBsZSBpbmRleCBibG9jay4gU2VlCisgICAgICAgIC8vIGxvYWRGcm9tRGlzayBmb3IgZGV0YWlscy4gTm90ZSB0aGF0IHRob3NlIGFyZSBhbHdheXMgZmFsc2UgZm9yIG5vbi1pbmRleGVkIHJlYWRlcnMuCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIHNraXBGaXJzdEl0ZXJhdGVkSXRlbTsKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2tpcExhc3RJdGVyYXRlZEl0ZW07CisKKyAgICAgICAgcHJpdmF0ZSBSZXZlcnNlUmVhZGVyKEZpbGVEYXRhSW5wdXQgZmlsZSwgYm9vbGVhbiBzaG91bGRDbG9zZUZpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGZpbGUsIHNob3VsZENsb3NlRmlsZSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgUmV1c2FibGVQYXJ0aXRpb25EYXRhIGNyZWF0ZUJ1ZmZlcihpbnQgYmxvY2tzQ291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBlc3RpbWF0ZWRSb3dDb3VudCA9IDE2OworICAgICAgICAgICAgaW50IGNvbHVtbkNvdW50ID0gbWV0YWRhdGEoKS5yZWd1bGFyQ29sdW1ucygpLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChjb2x1bW5Db3VudCA9PSAwIHx8IG1ldGFkYXRhKCkuY2x1c3RlcmluZ0NvbHVtbnMoKS5pc0VtcHR5KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXN0aW1hdGVkUm93Q291bnQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVG8gYXZvaWQgd2FzdGVkIHJlc2l6aW5nIHdlIGd1ZXNzLWVzdGltYXRlIHRoZSBudW1iZXIgb2Ygcm93cyB3ZSdyZSBsaWtlbHkgdG8gcmVhZC4gRm9yIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgdXNlIHRoZSBzdGF0cyBvbiB0aGUgbnVtYmVyIG9mIHJvd3MgcGVyIHBhcnRpdGlvbiBmb3IgdGhhdCBzc3RhYmxlLgorICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogc28gZmFyIHdlIG9ubHkga2VlcCBzdGF0cyBvbiBjZWxscywgc28gdG8gZ2V0IGEgcm91Z2ggZXN0aW1hdGUgb24gdGhlIG51bWJlciBvZiByb3dzLAorICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkaXZpZGUgYnkgdGhlIG51bWJlciBvZiByZWd1bGFyIGNvbHVtbnMgdGhlIHRhYmxlIGhhcy4gV2Ugc2hvdWxkIGZpeCBvbmNlIHdlIGNvbGxlY3QgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHN0YXRzIG9uIHJvd3MKKyAgICAgICAgICAgICAgICAgICAgaW50IGVzdGltYXRlZFJvd3NQZXJQYXJ0aXRpb24gPSAoaW50KShzc3RhYmxlLmdldEVzdGltYXRlZENlbGxQZXJQYXJ0aXRpb25Db3VudCgpLnBlcmNlbnRpbGUoMC43NSkgLyBjb2x1bW5Db3VudCk7CisgICAgICAgICAgICAgICAgICAgIGVzdGltYXRlZFJvd0NvdW50ID0gTWF0aC5tYXgoZXN0aW1hdGVkUm93c1BlclBhcnRpdGlvbiAvIGJsb2Nrc0NvdW50LCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEVzdGltYXRlZEhpc3RvZ3JhbSBtZWFuKCkgbWV0aG9kIGNhbiB0aHJvdyB0aGlzIChpZiBpdCBvdmVyZmxvd3MpLiBXaGlsZSBzdWNoIG92ZXJmbG93CisgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZG4ndCBoYXBwZW4sIGl0J3Mgbm90IHdvcnRoIHRha2luZyB0aGUgcmlzayBvZiBsZXR0aW5nIHRoZSBleGNlcHRpb24gYnViYmxlIHVwLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgUmV1c2FibGVQYXJ0aXRpb25EYXRhKG1ldGFkYXRhKCksIHBhcnRpdGlvbktleSgpLCBjb2x1bW5zKCksIGVzdGltYXRlZFJvd0NvdW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZvclNsaWNlKFNsaWNlIHNsaWNlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSByZWFkIHRoZSBkYXRhLCBqdXN0IGNyZWF0ZSB0aGUgaXRlcmF0b3IgZm9yIHRoZSBzbGljZS4gT3RoZXJ3aXNlLCByZWFkIHRoZSBkYXRhLgorICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGNyZWF0ZUJ1ZmZlcigxKTsKKyAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgY2FuIHJldXNlIHRoYXQgYnVmZmVyIGJldHdlZW4gc2xpY2VzICh3ZSBjb3VsZCBhbHRlcm5hdGl2ZWx5IHJlLXJlYWQgZnJvbSBkaXNrCisgICAgICAgICAgICAgICAgLy8gZXZlcnkgdGltZSwgYnV0IHRoYXQgZmVlbHMgbW9yZSB3YXN0ZWZ1bCkgc28gd2Ugd2FudCB0byBpbmNsdWRlIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgYmVnaW5uaW5nLgorICAgICAgICAgICAgICAgIC8vIFdlIGNhbiBzdG9wIGF0IHRoZSBzbGljZSBlbmQgaG93ZXZlciBzaW5jZSBhbnkgZm9sbG93aW5nIHNsaWNlIHdpbGwgYmUgYmVmb3JlIHRoYXQuCisgICAgICAgICAgICAgICAgbG9hZEZyb21EaXNrKG51bGwsIHNsaWNlLmVuZCgpLCBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0SXRlcmF0b3Ioc2xpY2UpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0SXRlcmF0b3IoU2xpY2Ugc2xpY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBidWZmZXIgIT0gbnVsbDsKKyAgICAgICAgICAgIGl0ZXJhdG9yID0gYnVmZmVyLmJ1aWx0LnVuZmlsdGVyZWRJdGVyYXRvcihjb2x1bW5zLCBTbGljZXMud2l0aChtZXRhZGF0YSgpLmNvbXBhcmF0b3IsIHNsaWNlKSwgdHJ1ZSk7CisKKyAgICAgICAgICAgIGlmICghaXRlcmF0b3IuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaWYgKHNraXBGaXJzdEl0ZXJhdGVkSXRlbSkKKyAgICAgICAgICAgICAgICBpdGVyYXRvci5uZXh0KCk7CisKKyAgICAgICAgICAgIGlmIChza2lwTGFzdEl0ZXJhdGVkSXRlbSkKKyAgICAgICAgICAgICAgICBpdGVyYXRvciA9IG5ldyBTa2lwTGFzdEl0ZXJhdG9yKGl0ZXJhdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGhhc05leHRJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICAvLyBJZiB3ZSd2ZSBuZXZlciBjYWxsZWQgc2V0Rm9yU2xpY2UsIHdlJ3JlIHJlYWRpbmcgZXZlcnl0aGluZworICAgICAgICAgICAgaWYgKGl0ZXJhdG9yID09IG51bGwpCisgICAgICAgICAgICAgICAgc2V0Rm9yU2xpY2UoU2xpY2UuQUxMKTsKKworICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkIG5leHRJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWhhc05leHQoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIHN0b3BSZWFkaW5nRGlzaygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWFkcyB0aGUgdW5maWx0ZXJlZCBmcm9tIGRpc2sgYW5kIGxvYWQgdGhlbSBpbnRvIHRoZSByZWFkZXIgYnVmZmVyLiBJdCBzdG9wcyByZWFkaW5nIHdoZW4gZWl0aGVyIHRoZSBwYXJ0aXRpb24KKyAgICAgICAgLy8gaXMgZnVsbHkgcmVhZCwgb3Igd2hlbiBzdG9wUmVhZGluZ0Rpc2soKSByZXR1cm5zIHRydWUuCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGxvYWRGcm9tRGlzayhDbHVzdGVyaW5nQm91bmQ8Pz4gc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbHVzdGVyaW5nQm91bmQ8Pz4gZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNQcmV2aW91c0Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNOZXh0QmxvY2spIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICAvLyBzdGFydCAhPSBudWxsIG1lYW5zIGl0J3MgdGhlIGJsb2NrIGNvdmVyaW5nIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNsaWNlLCBzbyBpdCBoYXMgdG8gYmUgdGhlIGxhc3QgYmxvY2sgZm9yIHRoaXMgc2xpY2UuCisgICAgICAgICAgICBhc3NlcnQgc3RhcnQgPT0gbnVsbCB8fCAhaGFzTmV4dEJsb2NrOworCisgICAgICAgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICAgICAgICAgIHNraXBGaXJzdEl0ZXJhdGVkSXRlbSA9IGZhbHNlOworICAgICAgICAgICAgc2tpcExhc3RJdGVyYXRlZEl0ZW0gPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gSWYgdGhlIHN0YXJ0IG1pZ2h0IGJlIGluIHRoaXMgYmxvY2ssIHNraXAgZXZlcnl0aGluZyB0aGF0IGNvbWVzIGJlZm9yZSBpdC4KKyAgICAgICAgICAgIGlmIChzdGFydCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlIChkZXNlcmlhbGl6ZXIuaGFzTmV4dCgpICYmIGRlc2VyaWFsaXplci5jb21wYXJlTmV4dFRvKHN0YXJ0KSA8PSAwICYmICFzdG9wUmVhZGluZ0Rpc2soKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXNlcmlhbGl6ZXIubmV4dElzUm93KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNlcmlhbGl6ZXIuc2tpcE5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlT3Blbk1hcmtlcigoUmFuZ2VUb21ic3RvbmVNYXJrZXIpZGVzZXJpYWxpemVyLnJlYWROZXh0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBvcGVuIG1hcmtlciwgaXQncyBlaXRoZXIgb25lIGZyb20gd2hhdCB3ZSBqdXN0IHNraXBwZWQgb3IgaXQncyBvbmUgdGhhdCBvcGVuIGluIHRoZSBuZXh0IChvcgorICAgICAgICAgICAgLy8gb25lIG9mIHRoZSBuZXh0KSBpbmRleCBibG9jayAoaWYgb3Blbk1hcmtlciA9PSBvcGVuTWFya2VyQXRTdGFydE9mQmxvY2spLgorICAgICAgICAgICAgaWYgKG9wZW5NYXJrZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGZlZWQgYSBtYXJrZXIgdG8gdGhlIGJ1ZmZlciwgYmVjYXVzZSB0aGF0IG1hcmtlciBpcyBsaWtlbHkgdG8gYmUgY2xvc2UgbGF0ZXIgYW5kIEltbXRhYmxlQlRyZWVQYXJ0aXRpb24KKyAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IHRha2Uga2luZGx5IHRvIG1hcmtlciB0aGF0IGNvbWVzIHdpdGhvdXQgdGhlaXIgY291bnRlcnBhcnQuIElmIHRoYXQncyB0aGUgbGFzdCBibG9jayB3ZSdyZSBnb25uYSByZWFkIChmb3IKKyAgICAgICAgICAgICAgICAvLyB0aGUgY3VycmVudCBzbGljZSBhdCBsZWFzdCkgaXQncyBlYXN5IGJlY2F1c2Ugd2UnbGwgd2FudCB0byByZXR1cm4gdGhhdCBvcGVuIG1hcmtlciBhdCB0aGUgZW5kIG9mIHRoZSBkYXRhIGluIHRoaXMKKyAgICAgICAgICAgICAgICAvLyBibG9jayBhbnl3YXksIHNvIHdlIGhhdmUgbm90aGluZyBtb3JlIHRvIGRvIHRoYW4gYWRkaW5nIGl0IHRvIHRoZSBidWZmZXIuCisgICAgICAgICAgICAgICAgLy8gSWYgaXQncyBub3QgdGhlIGxhc3QgYmxvY2sgaG93ZXZlciwgaW4gd2hpY2ggY2FzZSB3ZSBrbm93IHdlJ2xsIGhhdmUgc3RhcnQgPT0gbnVsbCwgaXQgbWVhbnMgdGhpcyBtYXJrZXIgaXMgcmVhbGx5CisgICAgICAgICAgICAgICAgLy8gb3BlbiBpbiBhIG5leHQgYmxvY2sgYW5kIHNvIHdoaWxlIHdlIGRvIG5lZWQgdG8gYWRkIGl0IHRoZSBidWZmZXIgZm9yIHRoZSByZWFzb24gbWVudGlvbmVkIGFib3ZlLCB3ZSBkb24ndAorICAgICAgICAgICAgICAgIC8vIHdhbnQgdG8gInJldHVybiIgaXQganVzdCB5ZXQsIHdlJ2xsIHdhaXQgdW50aWwgd2UgcmVhY2ggaXQgaW4gdGhlIG5leHQgYmxvY2tzLiBUaGF0J3Mgd2h5IHdlIHRyaWdnZXIKKyAgICAgICAgICAgICAgICAvLyBza2lwTGFzdEl0ZXJhdGVkSXRlbSBpbiB0aGF0IGNhc2UgKHRoaXMgaXMgZmlyc3QgaXRlbSBvZiB0aGUgYmxvY2ssIGJ1dCB3ZSdyZSBpdGVyYXRpbmcgaW4gcmV2ZXJzZSBvcmRlcgorICAgICAgICAgICAgICAgIC8vIHNvIGl0IHdpbGwgYmUgbGFzdCByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IpLgorICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdCb3VuZDw/PiBtYXJrZXJTdGFydCA9IHN0YXJ0ID09IG51bGwgPyBCdWZmZXJDbHVzdGVyaW5nQm91bmQuQk9UVE9NIDogc3RhcnQ7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFkZChuZXcgUmFuZ2VUb21ic3RvbmVCb3VuZE1hcmtlcihtYXJrZXJTdGFydCwgb3Blbk1hcmtlcikpOworICAgICAgICAgICAgICAgIGlmIChoYXNOZXh0QmxvY2spCisgICAgICAgICAgICAgICAgICAgIHNraXBMYXN0SXRlcmF0ZWRJdGVtID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTm93IGRlc2VyaWFsaXplIGV2ZXJ5dGhpbmcgdW50aWwgd2UgcmVhY2ggb3VyIHJlcXVlc3RlZCBlbmQgKGlmIHdlIGhhdmUgb25lKQorICAgICAgICAgICAgLy8gU2VlIFNTVGFibGVJdGVyYXRvci5Gb3J3YXJkUmVhZC5jb21wdXRlTmV4dCgpIGZvciB3aHkgdGhpcyBpcyBhIHN0cmljdCBpbmVxdWFsaXR5IGJlbG93OiB0aGlzIGlzIHRoZSBzYW1lCisgICAgICAgICAgICAvLyByZWFzb25pbmcgaGVyZS4KKyAgICAgICAgICAgIHdoaWxlIChkZXNlcmlhbGl6ZXIuaGFzTmV4dCgpCisgICAgICAgICAgICAgICAgICAgJiYgKGVuZCA9PSBudWxsIHx8IGRlc2VyaWFsaXplci5jb21wYXJlTmV4dFRvKGVuZCkgPCAwKQorICAgICAgICAgICAgICAgICAgICYmICFzdG9wUmVhZGluZ0Rpc2soKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVbmZpbHRlcmVkIHVuZmlsdGVyZWQgPSBkZXNlcmlhbGl6ZXIucmVhZE5leHQoKTsKKyAgICAgICAgICAgICAgICBVbmZpbHRlcmVkVmFsaWRhdGlvbi5tYXliZVZhbGlkYXRlVW5maWx0ZXJlZCh1bmZpbHRlcmVkLCBtZXRhZGF0YSgpLCBrZXksIHNzdGFibGUpOworICAgICAgICAgICAgICAgIC8vIFdlIG1heSBnZXQgZW1wdHkgcm93IGZvciB0aGUgc2FtZSByZWFzb24gZXhwcmVzc2VkIG9uIFVuZmlsdGVyZWRTZXJpYWxpemVyLmRlc2VyaWFsaXplT25lLgorICAgICAgICAgICAgICAgIGlmICghdW5maWx0ZXJlZC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hZGQodW5maWx0ZXJlZCk7CisKKyAgICAgICAgICAgICAgICBpZiAodW5maWx0ZXJlZC5pc1JhbmdlVG9tYnN0b25lTWFya2VyKCkpCisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZU9wZW5NYXJrZXIoKFJhbmdlVG9tYnN0b25lTWFya2VyKXVuZmlsdGVyZWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIG9wZW4gbWFya2VyLCB3ZSBzaG91bGQgY2xvc2UgaXQgYmVmb3JlIGZpbmlzaGluZworICAgICAgICAgICAgaWYgKG9wZW5NYXJrZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByZXZlcnNlIHByb2JsZW0gdGhhbiB0aGUgb25lIGF0IHRoZSBzdGFydCBvZiB0aGUgYmxvY2suIE5hbWVseSwgaWYgaXQncyB0aGUgZmlyc3QgYmxvY2sKKyAgICAgICAgICAgICAgICAvLyB3ZSBkZXNlcmlhbGl6ZSBmb3IgdGhlIHNsaWNlICh0aGUgb25lIGNvdmVyaW5nIHRoZSBzbGljZSBlbmQgYmFzaWNhbGx5KSwgdGhlbiBpdCdzIGVhc3ksIHdlIGp1c3Qgd2FudAorICAgICAgICAgICAgICAgIC8vIHRvIGFkZCB0aGUgY2xvc2UgbWFya2VyIHRvIHRoZSBidWZmZXIgYW5kIHJldHVybiBpdCBub3JtYWxseS4KKyAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIG5vdGUgb3VyIGZpcnN0IGJsb2NrIChmb3IgdGhlIHNsaWNlKSBob3dldmVyLCBpdCBtZWFucyB0aGF0IG1hcmtlciBjbG9zZWQgaW4gYSBwcmV2aW91c2x5IHJlYWQKKyAgICAgICAgICAgICAgICAvLyBibG9jayBhbmQgd2UgaGF2ZSBhbHJlYWR5IHJldHVybmVkIGl0LiBTbyB3aGlsZSB3ZSBzaG91bGQgc3RpbGwgYWRkIGl0IHRvIHRoZSBidWZmZXIgZm9yIHRoZSBzYWtlIG9mCisgICAgICAgICAgICAgICAgLy8gbm90IGJyZWFraW5nIEltbXV0YWJsZUJUcmVlUGFydGl0aW9uLCB3ZSBzaG91bGQgc2tpcCBpdCB3aGVuIHJldHVybmluZyBmcm9tIHRoZSBpdGVyYXRvciwgaGVuY2UgdGhlCisgICAgICAgICAgICAgICAgLy8gc2tpcEZpcnN0SXRlcmF0ZWRJdGVtICh0aGlzIGlzIHRoZSBsYXN0IGl0ZW0gb2YgdGhlIGJsb2NrLCBidXQgd2UncmUgaXRlcmF0aW5nIGluIHJldmVyc2Ugb3JkZXIgc28gaXQgd2lsbAorICAgICAgICAgICAgICAgIC8vIGJlIHRoZSBmaXJzdCByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IpLgorICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdCb3VuZDw/PiBtYXJrZXJFbmQgPSBlbmQgPT0gbnVsbCA/IEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZC5UT1AgOiBlbmQ7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFkZChuZXcgUmFuZ2VUb21ic3RvbmVCb3VuZE1hcmtlcihtYXJrZXJFbmQsIG9wZW5NYXJrZXIpKTsKKyAgICAgICAgICAgICAgICBpZiAoaGFzUHJldmlvdXNCbG9jaykKKyAgICAgICAgICAgICAgICAgICAgc2tpcEZpcnN0SXRlcmF0ZWRJdGVtID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnVmZmVyLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFJldmVyc2VJbmRleGVkUmVhZGVyIGV4dGVuZHMgUmV2ZXJzZVJlYWRlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbmRleFN0YXRlIGluZGV4U3RhdGU7CisKKyAgICAgICAgLy8gVGhlIHNsaWNlIHdlJ3JlIGN1cnJlbnRseSBpdGVyYXRpbmcgb3ZlcgorICAgICAgICBwcml2YXRlIFNsaWNlIHNsaWNlOworICAgICAgICAvLyBUaGUgbGFzdCBpbmRleCBibG9jayB0byBjb25zaWRlciBmb3IgdGhlIHNsaWNlCisgICAgICAgIHByaXZhdGUgaW50IGxhc3RCbG9ja0lkeDsKKworICAgICAgICBwcml2YXRlIFJldmVyc2VJbmRleGVkUmVhZGVyKFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSwgRmlsZURhdGFJbnB1dCBmaWxlLCBib29sZWFuIHNob3VsZENsb3NlRmlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKTsKKyAgICAgICAgICAgIHRoaXMuaW5kZXhTdGF0ZSA9IG5ldyBJbmRleFN0YXRlKHRoaXMsIG1ldGFkYXRhLmNvbXBhcmF0b3IsIGluZGV4RW50cnksIHRydWUsIGlmaWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBzdXBlci5jbG9zZSgpOworICAgICAgICAgICAgdGhpcy5pbmRleFN0YXRlLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Rm9yU2xpY2UoU2xpY2Ugc2xpY2UpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnNsaWNlID0gc2xpY2U7CisKKyAgICAgICAgICAgIC8vIGlmIG91ciBwcmV2aW91cyBzbGljaW5nIGFscmVhZHkgZ290IHVzIHBhc3QgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3N0YWJsZSwgd2UncmUgZG9uZQorICAgICAgICAgICAgaWYgKGluZGV4U3RhdGUuaXNEb25lKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaXRlcmF0b3IgPSBDb2xsZWN0aW9ucy5lbXB0eUl0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBpbmRleCBibG9jayB3ZSdsbCBuZWVkIHRvIHJlYWQgZm9yIHRoZSBzbGljZS4KKyAgICAgICAgICAgIGludCBzdGFydElkeCA9IGluZGV4U3RhdGUuZmluZEJsb2NrSW5kZXgoc2xpY2UuZW5kKCksIGluZGV4U3RhdGUuY3VycmVudEJsb2NrSWR4KCkpOworICAgICAgICAgICAgaWYgKHN0YXJ0SWR4IDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpdGVyYXRvciA9IENvbGxlY3Rpb25zLmVtcHR5SXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICBpbmRleFN0YXRlLnNldFRvQmxvY2soc3RhcnRJZHgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGFzdEJsb2NrSWR4ID0gaW5kZXhTdGF0ZS5maW5kQmxvY2tJbmRleChzbGljZS5zdGFydCgpLCBzdGFydElkeCk7CisKKyAgICAgICAgICAgIC8vIElmIHRoZSBsYXN0IGJsb2NrIHRvIGxvb2sgKGluIHJldmVyc2Ugb3JkZXIpIGlzIGFmdGVyIHRoZSB2ZXJ5IGxhc3QgYmxvY2ssIHdlIGhhdmUgbm90aGluZyBmb3IgdGhhdCBzbGljZQorICAgICAgICAgICAgaWYgKGxhc3RCbG9ja0lkeCA+PSBpbmRleFN0YXRlLmJsb2Nrc0NvdW50KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IHN0YXJ0SWR4ID49IGluZGV4U3RhdGUuYmxvY2tzQ291bnQoKTsKKyAgICAgICAgICAgICAgICBpdGVyYXRvciA9IENvbGxlY3Rpb25zLmVtcHR5SXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIHdlIHN0YXJ0IChpbiByZXZlcnNlIG9yZGVyKSBhZnRlciB0aGUgdmVyeSBsYXN0IGJsb2NrLCBqdXN0IHJlYWQgZnJvbSB0aGUgbGFzdCBvbmUuCisgICAgICAgICAgICBpZiAoc3RhcnRJZHggPj0gaW5kZXhTdGF0ZS5ibG9ja3NDb3VudCgpKQorICAgICAgICAgICAgICAgIHN0YXJ0SWR4ID0gaW5kZXhTdGF0ZS5ibG9ja3NDb3VudCgpIC0gMTsKKworICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGV2ZW4gaWYgd2Ugd2VyZSBhbHJlYWR5IHNldCBvbiB0aGUgcHJvcGVyIGJsb2NrICh3aGljaCB3b3VsZCBoYXBwZW4gaWYgdGhlIHByZXZpb3VzIHNsaWNlCisgICAgICAgICAgICAvLyByZXF1ZXN0ZWQgZW5kZWQgb24gdGhlIHNhbWUgYmxvY2sgdGhpcyBvbmUgc3RhcnQpLCB3ZSBjYW4ndCByZXVzZSBpdCBiZWNhdXNlIHdoZW4gcmVhZGluZyB0aGUgcHJldmlvdXMKKyAgICAgICAgICAgIC8vIHNsaWNlIHdlJ3ZlIG9ubHkgcmVhZCB0aGF0IGJsb2NrIGZyb20gdGhlIHByZXZpb3VzIHNsaWNlIHN0YXJ0LiBSZS1yZWFkaW5nIGFsc28gaGFuZGxlcworICAgICAgICAgICAgLy8gc2tpcEZpcnN0SXRlcmF0ZWRJdGVtL3NraXBMYXN0SXRlcmF0ZWRJdGVtIHRoYXQgd2Ugd291bGQgbmVlZCB0byBoYW5kbGUgb3RoZXJ3aXNlLgorICAgICAgICAgICAgaW5kZXhTdGF0ZS5zZXRUb0Jsb2NrKHN0YXJ0SWR4KTsKKworICAgICAgICAgICAgcmVhZEN1cnJlbnRCbG9jayhmYWxzZSwgc3RhcnRJZHggIT0gbGFzdEJsb2NrSWR4KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOZXh0SW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN1cGVyLmhhc05leHRJbnRlcm5hbCgpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIG5vdGhpbmcgbW9yZSBmb3Igb3VyIGN1cnJlbnQgYmxvY2ssIG1vdmUgdGhlIG5leHQgb25lIChzbyB0aGUgb25lIGJlZm9yZSBvbiBkaXNrKS4KKyAgICAgICAgICAgICAgICBpbnQgbmV4dEJsb2NrSWR4ID0gaW5kZXhTdGF0ZS5jdXJyZW50QmxvY2tJZHgoKSAtIDE7CisgICAgICAgICAgICAgICAgaWYgKG5leHRCbG9ja0lkeCA8IDAgfHwgbmV4dEJsb2NrSWR4IDwgbGFzdEJsb2NrSWR4KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAvLyBUaGUgc2xpY2Ugc3RhcnQgY2FuIGJlIGluCisgICAgICAgICAgICAgICAgaW5kZXhTdGF0ZS5zZXRUb0Jsb2NrKG5leHRCbG9ja0lkeCk7CisgICAgICAgICAgICAgICAgcmVhZEN1cnJlbnRCbG9jayh0cnVlLCBuZXh0QmxvY2tJZHggIT0gbGFzdEJsb2NrSWR4KTsKKworICAgICAgICAgICAgICAgIC8vIElmIGFuIGluZGV4ZWQgYmxvY2sgb25seSBjb250YWlucyBkYXRhIGZvciBhIGRyb3BwZWQgY29sdW1uLCB0aGUgaXRlcmF0b3Igd2lsbCBiZSBlbXB0eSwgZXZlbgorICAgICAgICAgICAgICAgIC8vIHRob3VnaCB3ZSBtYXkgc3RpbGwgaGF2ZSBkYXRhIHRvIHJlYWQgaW4gc3Vic2VxdWVudCBibG9ja3MKKworICAgICAgICAgICAgICAgIC8vIGFsc28sIGZvciBwcmUtMy4wIHN0b3JhZ2UgZm9ybWF0cywgaW5kZXggYmxvY2tzIHRoYXQgb25seSBjb250YWluIGEgc2luZ2xlIHJvdyBhbmQgdGhhdCByb3cgY3Jvc3NlcworICAgICAgICAgICAgICAgIC8vIGluZGV4IGJvdW5kYXJpZXMsIHRoZSBpdGVyYXRvciB3aWxsIGJlIGVtcHR5IGV2ZW4gdGhvdWdoIHdlIGhhdmVuJ3QgcmVhZCBldmVyeXRoaW5nIHdlJ3JlIGludGVuZGluZworICAgICAgICAgICAgICAgIC8vIHRvIHJlYWQuIEluIHRoYXQgY2FzZSwgd2Ugd2FudCB0byByZWFkIHRoZSBuZXh0IGluZGV4IGJsb2NrLiBUaGlzIHNob3VsZG4ndCBiZSBwb3NzaWJsZSBpbiAzLjArCisgICAgICAgICAgICAgICAgLy8gZm9ybWF0cyAoc2VlIG5leHQgY29tbWVudCkKKyAgICAgICAgICAgICAgICBpZiAoIWl0ZXJhdG9yLmhhc05leHQoKSAmJiBuZXh0QmxvY2tJZHggPiBsYXN0QmxvY2tJZHgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlYWRzIHRoZSBjdXJyZW50IGJsb2NrLCB0aGUgbGFzdCBvbmUgd2UndmUgc2V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaGFzUHJldmlvdXNCbG9jayBpcyB3aGV0aGVyIHdlIGhhdmUgYWxyZWFkeSByZWFkIGEgcHJldmlvdXMgYmxvY2sgZm9yIHRoZSBjdXJyZW50IHNsaWNlLgorICAgICAgICAgKiBAcGFyYW0gaGFzTmV4dEJsb2NrIGlzIHdoZXRoZXIgd2UgaGF2ZSBtb3JlIGJsb2NrcyB0byByZWFkIGZvciB0aGUgY3VycmVudCBzbGljZS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCByZWFkQ3VycmVudEJsb2NrKGJvb2xlYW4gaGFzUHJldmlvdXNCbG9jaywgYm9vbGVhbiBoYXNOZXh0QmxvY2spIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpCisgICAgICAgICAgICAgICAgYnVmZmVyID0gY3JlYXRlQnVmZmVyKGluZGV4U3RhdGUuYmxvY2tzQ291bnQoKSk7CisKKyAgICAgICAgICAgIC8vIFRoZSBzbGljZSBzdGFydCAocmVzcC4gc2xpY2UgZW5kKSBpcyBvbmx5IG1lYW5pbmdmdWwgb24gdGhlIGxhc3QgKHJlc3AuIGZpcnN0KSBibG9jayByZWFkIChzaW5jZSBhZ2FpbiwKKyAgICAgICAgICAgIC8vIHdlIHJlYWQgYmxvY2tzIGluIHJldmVyc2Ugb3JkZXIpLgorICAgICAgICAgICAgYm9vbGVhbiBjYW5JbmNsdWRlU2xpY2VTdGFydCA9ICFoYXNOZXh0QmxvY2s7CisgICAgICAgICAgICBib29sZWFuIGNhbkluY2x1ZGVTbGljZUVuZCA9ICFoYXNQcmV2aW91c0Jsb2NrOworCisgICAgICAgICAgICBsb2FkRnJvbURpc2soY2FuSW5jbHVkZVNsaWNlU3RhcnQgPyBzbGljZS5zdGFydCgpIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYW5JbmNsdWRlU2xpY2VFbmQgPyBzbGljZS5lbmQoKSA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUHJldmlvdXNCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBoYXNOZXh0QmxvY2spOworICAgICAgICAgICAgc2V0SXRlcmF0b3Ioc2xpY2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIHN0b3BSZWFkaW5nRGlzaygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaW5kZXhTdGF0ZS5pc1Bhc3RDdXJyZW50QmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUmV1c2FibGVQYXJ0aXRpb25EYXRhCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGE7CisgICAgICAgIHByaXZhdGUgZmluYWwgRGVjb3JhdGVkS2V5IHBhcnRpdGlvbktleTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWd1bGFyQW5kU3RhdGljQ29sdW1ucyBjb2x1bW5zOworCisgICAgICAgIHByaXZhdGUgTXV0YWJsZURlbGV0aW9uSW5mby5CdWlsZGVyIGRlbGV0aW9uQnVpbGRlcjsKKyAgICAgICAgcHJpdmF0ZSBNdXRhYmxlRGVsZXRpb25JbmZvIGRlbGV0aW9uSW5mbzsKKyAgICAgICAgcHJpdmF0ZSBCVHJlZS5CdWlsZGVyPFJvdz4gcm93QnVpbGRlcjsKKyAgICAgICAgcHJpdmF0ZSBJbW11dGFibGVCVHJlZVBhcnRpdGlvbiBidWlsdDsKKworICAgICAgICBwcml2YXRlIFJldXNhYmxlUGFydGl0aW9uRGF0YShUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWd1bGFyQW5kU3RhdGljQ29sdW1ucyBjb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5pdGlhbFJvd0NhcGFjaXR5KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7CisgICAgICAgICAgICB0aGlzLnBhcnRpdGlvbktleSA9IHBhcnRpdGlvbktleTsKKyAgICAgICAgICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7CisgICAgICAgICAgICB0aGlzLnJvd0J1aWxkZXIgPSBCVHJlZS5idWlsZGVyKG1ldGFkYXRhLmNvbXBhcmF0b3IsIGluaXRpYWxSb3dDYXBhY2l0eSk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZChVbmZpbHRlcmVkIHVuZmlsdGVyZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh1bmZpbHRlcmVkLmlzUm93KCkpCisgICAgICAgICAgICAgICAgcm93QnVpbGRlci5hZGQoKFJvdyl1bmZpbHRlcmVkKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkZWxldGlvbkJ1aWxkZXIuYWRkKChSYW5nZVRvbWJzdG9uZU1hcmtlcil1bmZpbHRlcmVkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVpbHQgPSBudWxsOworICAgICAgICAgICAgcm93QnVpbGRlci5yZXVzZSgpOworICAgICAgICAgICAgZGVsZXRpb25CdWlsZGVyID0gTXV0YWJsZURlbGV0aW9uSW5mby5idWlsZGVyKHBhcnRpdGlvbkxldmVsRGVsZXRpb24sIG1ldGFkYXRhKCkuY29tcGFyYXRvciwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYnVpbGQoKQorICAgICAgICB7CisgICAgICAgICAgICBkZWxldGlvbkluZm8gPSBkZWxldGlvbkJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgIGJ1aWx0ID0gbmV3IEltbXV0YWJsZUJUcmVlUGFydGl0aW9uKG1ldGFkYXRhLCBwYXJ0aXRpb25LZXksIGNvbHVtbnMsIFJvd3MuRU1QVFlfU1RBVElDX1JPVywgcm93QnVpbGRlci5idWlsZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRpb25JbmZvLCBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTKTsKKyAgICAgICAgICAgIGRlbGV0aW9uQnVpbGRlciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTa2lwTGFzdEl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RJdGVyYXRvcjxVbmZpbHRlcmVkPgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjxVbmZpbHRlcmVkPiBpdGVyYXRvcjsKKworICAgICAgICBwcml2YXRlIFNraXBMYXN0SXRlcmF0b3IoSXRlcmF0b3I8VW5maWx0ZXJlZD4gaXRlcmF0b3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkIGNvbXB1dGVOZXh0KCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpdGVyYXRvci5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVuZE9mRGF0YSgpOworCisgICAgICAgICAgICBVbmZpbHRlcmVkIG5leHQgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gbmV4dCA6IGVuZE9mRGF0YSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL0J0aUZvcm1hdC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL0J0aUZvcm1hdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1Y2JhNGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvQnRpRm9ybWF0LmphdmEKQEAgLTAsMCArMSw0NTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5HYXVnZVByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVNjcnViYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuTWV0cmljc1Byb3ZpZGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5maWx0ZXIuQmxvb21GaWx0ZXJNZXRyaWNzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LkFic3RyYWN0U1NUYWJsZUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU29ydGVkVGFibGVTY3J1YmJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhUmVmOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpWTVN0YWJpbGl0eUluc3BlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PdXRwdXRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CisKKy8qKgorICogQmlndGFibGUgZm9ybWF0IHdpdGggdHJpZSBpbmRpY2VzLiBTZWUgQlRJRm9ybWF0Lm1kIGZvciB0aGUgZm9ybWF0IGRvY3VtZW50YXRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBCdGlGb3JtYXQgZXh0ZW5kcyBBYnN0cmFjdFNTVGFibGVGb3JtYXQ8QnRpVGFibGVSZWFkZXIsIEJ0aVRhYmxlV3JpdGVyPgoreworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihCdGlGb3JtYXQuY2xhc3MpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJidGkiOworCisgICAgcHJpdmF0ZSBmaW5hbCBWZXJzaW9uIGxhdGVzdFZlcnNpb24gPSBuZXcgQnRpVmVyc2lvbih0aGlzLCBCdGlWZXJzaW9uLmN1cnJlbnRfdmVyc2lvbik7CisgICAgc3RhdGljIGZpbmFsIEJ0aVRhYmxlUmVhZGVyRmFjdG9yeSByZWFkZXJGYWN0b3J5ID0gbmV3IEJ0aVRhYmxlUmVhZGVyRmFjdG9yeSgpOworICAgIHN0YXRpYyBmaW5hbCBCdGlUYWJsZVdyaXRlckZhY3Rvcnkgd3JpdGVyRmFjdG9yeSA9IG5ldyBCdGlUYWJsZVdyaXRlckZhY3RvcnkoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29tcG9uZW50cyBleHRlbmRzIFNTVGFibGVGb3JtYXQuQ29tcG9uZW50cworICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUeXBlcyBleHRlbmRzIEFic3RyYWN0U1NUYWJsZUZvcm1hdC5Db21wb25lbnRzLlR5cGVzCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50LlR5cGUgUEFSVElUSU9OX0lOREVYID0gQ29tcG9uZW50LlR5cGUuY3JlYXRlU2luZ2xldG9uKCJQQVJUSVRJT05fSU5ERVgiLCAiUGFydGl0aW9ucy5kYiIsIEJ0aUZvcm1hdC5jbGFzcyk7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudC5UeXBlIFJPV19JTkRFWCA9IENvbXBvbmVudC5UeXBlLmNyZWF0ZVNpbmdsZXRvbigiUk9XX0lOREVYIiwgIlJvd3MuZGIiLCBCdGlGb3JtYXQuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBDb21wb25lbnQgUEFSVElUSU9OX0lOREVYID0gVHlwZXMuUEFSVElUSU9OX0lOREVYLmdldFNpbmdsZXRvbigpOworCisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29tcG9uZW50IFJPV19JTkRFWCA9IFR5cGVzLlJPV19JTkRFWC5nZXRTaW5nbGV0b24oKTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTZXQ8Q29tcG9uZW50PiBTVFJFQU1JTkdfQ09NUE9ORU5UUyA9IEltbXV0YWJsZVNldC5vZihEQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJUSVRJT05fSU5ERVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJPV19JTkRFWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBSRVNTSU9OX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElHRVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkMpOworCisgICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFNldDxDb21wb25lbnQ+IFBSSU1BUllfQ09NUE9ORU5UUyA9IEltbXV0YWJsZVNldC5vZihEQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSVElUSU9OX0lOREVYKTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTZXQ8Q29tcG9uZW50PiBNVVRBQkxFX0NPTVBPTkVOVFMgPSBJbW11dGFibGVTZXQub2YoU1RBVFMpOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxDb21wb25lbnQ+IFVQTE9BRF9DT01QT05FTlRTID0gSW1tdXRhYmxlU2V0Lm9mKERBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUlRJVElPTl9JTkRFWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9XX0lOREVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QUkVTU0lPTl9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFUUyk7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PENvbXBvbmVudD4gQkFUQ0hfQ09NUE9ORU5UUyA9IEltbXV0YWJsZVNldC5vZihEQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUlRJVElPTl9JTkRFWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST1dfSU5ERVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NUFJFU1NJT05fSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBVFMpOworCisgICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFNldDxDb21wb25lbnQ+IEFMTF9DT01QT05FTlRTID0gSW1tdXRhYmxlU2V0Lm9mKERBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUlRJVElPTl9JTkRFWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9XX0lOREVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NUFJFU1NJT05fSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUdFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9DKTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTZXQ8Q29tcG9uZW50PiBHRU5FUkFURURfT05fTE9BRF9DT01QT05FTlRTID0gSW1tdXRhYmxlU2V0Lm9mKEZJTFRFUik7CisgICAgfQorCisKKyAgICBwdWJsaWMgQnRpRm9ybWF0KE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucykKKyAgICB7CisgICAgICAgIHN1cGVyKE5BTUUsIG9wdGlvbnMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpcyhTU1RhYmxlRm9ybWF0PD8sID8+IGZvcm1hdCkKKyAgICB7CisgICAgICAgIHJldHVybiBmb3JtYXQubmFtZSgpLmVxdWFscyhOQU1FKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTZWxlY3RlZCgpCisgICAgeworICAgICAgICByZXR1cm4gaXMoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmVyc2lvbiBnZXRMYXRlc3RWZXJzaW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBsYXRlc3RWZXJzaW9uOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWZXJzaW9uIGdldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEJ0aVZlcnNpb24odGhpcywgdmVyc2lvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ0aVRhYmxlV3JpdGVyRmFjdG9yeSBnZXRXcml0ZXJGYWN0b3J5KCkKKyAgICB7CisgICAgICAgIHJldHVybiB3cml0ZXJGYWN0b3J5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdGlUYWJsZVJlYWRlckZhY3RvcnkgZ2V0UmVhZGVyRmFjdG9yeSgpCisgICAgeworICAgICAgICByZXR1cm4gcmVhZGVyRmFjdG9yeTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENvbXBvbmVudD4gc3RyZWFtaW5nQ29tcG9uZW50cygpCisgICAgeworICAgICAgICByZXR1cm4gQ29tcG9uZW50cy5TVFJFQU1JTkdfQ09NUE9ORU5UUzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENvbXBvbmVudD4gcHJpbWFyeUNvbXBvbmVudHMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIENvbXBvbmVudHMuUFJJTUFSWV9DT01QT05FTlRTOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q29tcG9uZW50PiBiYXRjaENvbXBvbmVudHMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIENvbXBvbmVudHMuQkFUQ0hfQ09NUE9ORU5UUzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENvbXBvbmVudD4gdXBsb2FkQ29tcG9uZW50cygpCisgICAgeworICAgICAgICByZXR1cm4gQ29tcG9uZW50cy5VUExPQURfQ09NUE9ORU5UUzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENvbXBvbmVudD4gbXV0YWJsZUNvbXBvbmVudHMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIENvbXBvbmVudHMuTVVUQUJMRV9DT01QT05FTlRTOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q29tcG9uZW50PiBhbGxDb21wb25lbnRzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBDb21wb25lbnRzLkFMTF9DT01QT05FTlRTOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q29tcG9uZW50PiBnZW5lcmF0ZWRPbkxvYWRDb21wb25lbnRzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBDb21wb25lbnRzLkdFTkVSQVRFRF9PTl9MT0FEX0NPTVBPTkVOVFM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNTVGFibGVGb3JtYXQuS2V5Q2FjaGVWYWx1ZVNlcmlhbGl6ZXI8QnRpVGFibGVSZWFkZXIsIFRyaWVJbmRleEVudHJ5PiBnZXRLZXlDYWNoZVZhbHVlU2VyaWFsaXplcigpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIkJUSSBzc3RhYmxlcyBkbyBub3QgdXNlIGtleSBjYWNoZSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJU2NydWJiZXIgZ2V0U2NydWJiZXIoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiwgT3V0cHV0SGFuZGxlciBvdXRwdXRIYW5kbGVyLCBJU2NydWJiZXIuT3B0aW9ucyBvcHRpb25zKQorICAgIHsKKyAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50KGNmcy5tZXRhZGF0YSgpLmVxdWFscyh0cmFuc2FjdGlvbi5vbmx5T25lKCkubWV0YWRhdGEoKSksICJTU1RhYmxlIG1ldGFkYXRhIGRvZXMgbm90IG1hdGNoIGN1cnJlbnQgZGVmaW5pdGlvbiIpOworICAgICAgICByZXR1cm4gbmV3IEJ0aVRhYmxlU2NydWJiZXIoY2ZzLCB0cmFuc2FjdGlvbiwgb3V0cHV0SGFuZGxlciwgb3B0aW9ucyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1ldHJpY3NQcm92aWRlcnMgZ2V0Rm9ybWF0U3BlY2lmaWNNZXRyaWNzUHJvdmlkZXJzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBCdGlUYWJsZVNwZWNpZmljTWV0cmljc1Byb3ZpZGVycy5pbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZWxldGVPcnBoYW5lZENvbXBvbmVudHMoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzKQorICAgIHsKKyAgICAgICAgU29ydGVkVGFibGVTY3J1YmJlci5kZWxldGVPcnBoYW5lZENvbXBvbmVudHMoZGVzY3JpcHRvciwgY29tcG9uZW50cyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZShEZXNjcmlwdG9yIGRlc2MsIExpc3Q8Q29tcG9uZW50PiBjb21wb25lbnRzKQorICAgIHsKKyAgICAgICAgbG9nZ2VyLmluZm8oIkRlbGV0aW5nIHNzdGFibGU6IHt9IiwgZGVzYyk7CisKKyAgICAgICAgaWYgKGNvbXBvbmVudHMucmVtb3ZlKFNTVGFibGVGb3JtYXQuQ29tcG9uZW50cy5EQVRBKSkKKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKDAsIFNTVGFibGVGb3JtYXQuQ29tcG9uZW50cy5EQVRBKTsgLy8gREFUQSBjb21wb25lbnQgc2hvdWxkIGJlIGZpcnN0CisKKyAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogY29tcG9uZW50cykKKyAgICAgICAgeworICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJEZWxldGluZyBjb21wb25lbnQge30gb2Yge30iLCBjb21wb25lbnQsIGRlc2MpOworICAgICAgICAgICAgZGVzYy5maWxlRm9yKGNvbXBvbmVudCkuZGVsZXRlSWZFeGlzdHMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlbGV0ZShEZXNjcmlwdG9yIGRlc2MpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgZGVsZXRlKGRlc2MsIExpc3RzLm5ld0FycmF5TGlzdChTZXRzLmludGVyc2VjdGlvbihhbGxDb21wb25lbnRzKCksIGRlc2MuZGlzY292ZXJDb21wb25lbnRzKCkpKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQorICAgICAgICB7CisgICAgICAgICAgICBKVk1TdGFiaWxpdHlJbnNwZWN0b3IuaW5zcGVjdFRocm93YWJsZSh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBCdGlUYWJsZVJlYWRlckZhY3RvcnkgaW1wbGVtZW50cyBTU1RhYmxlUmVhZGVyRmFjdG9yeTxCdGlUYWJsZVJlYWRlciwgQnRpVGFibGVSZWFkZXIuQnVpbGRlcj4KKyAgICB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU1NUYWJsZVJlYWRlci5CdWlsZGVyPEJ0aVRhYmxlUmVhZGVyLCBCdGlUYWJsZVJlYWRlci5CdWlsZGVyPiBidWlsZGVyKERlc2NyaXB0b3IgZGVzY3JpcHRvcikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCdGlUYWJsZVJlYWRlci5CdWlsZGVyKGRlc2NyaXB0b3IpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXI8QnRpVGFibGVSZWFkZXIsIEJ0aVRhYmxlUmVhZGVyLkJ1aWxkZXI+IGxvYWRpbmdCdWlsZGVyKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgVGFibGVNZXRhZGF0YVJlZiB0YWJsZU1ldGFkYXRhUmVmLCBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ0aVRhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXIobmV3IFNTVGFibGUuQnVpbGRlcjw+KGRlc2NyaXB0b3IpLnNldFRhYmxlTWV0YWRhdGFSZWYodGFibGVNZXRhZGF0YVJlZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29tcG9uZW50cyhjb21wb25lbnRzKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFBhaXI8RGVjb3JhdGVkS2V5LCBEZWNvcmF0ZWRLZXk+IHJlYWRLZXlSYW5nZShEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lcikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBQYXJ0aXRpb25JbmRleC5yZWFkRmlyc3RBbmRMYXN0S2V5KGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlBBUlRJVElPTl9JTkRFWCksIHBhcnRpdGlvbmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2xhc3M8QnRpVGFibGVSZWFkZXI+IGdldFJlYWRlckNsYXNzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJ0aVRhYmxlUmVhZGVyLmNsYXNzOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEJ0aVRhYmxlV3JpdGVyRmFjdG9yeSBpbXBsZW1lbnRzIFNTVGFibGVXcml0ZXJGYWN0b3J5PEJ0aVRhYmxlV3JpdGVyLCBCdGlUYWJsZVdyaXRlci5CdWlsZGVyPgorICAgIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdGlUYWJsZVdyaXRlci5CdWlsZGVyIGJ1aWxkZXIoRGVzY3JpcHRvciBkZXNjcmlwdG9yKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ0aVRhYmxlV3JpdGVyLkJ1aWxkZXIoZGVzY3JpcHRvcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZXN0aW1hdGVTaXplKFNTVGFibGVXcml0ZXIuU1NUYWJsZVNpemVQYXJhbWV0ZXJzIHBhcmFtZXRlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAobG9uZykgKChwYXJhbWV0ZXJzLnBhcnRpdGlvbkNvdW50KCkgKiA4IC8vIGluZGV4IGVudHJpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBhcmFtZXRlcnMucGFydGl0aW9uS2V5c1NpemUoKSAvLyBrZXlzIGluIGRhdGEgZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGFyYW1ldGVycy5kYXRhU2l6ZSgpKSAvLyBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDEuMik7IC8vIGJsb29tIGZpbHRlciBhbmQgcm93IGluZGV4IG92ZXJoZWFkCisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQnRpVmVyc2lvbiBleHRlbmRzIFZlcnNpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGN1cnJlbnRfdmVyc2lvbiA9ICJkYSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVhcmxpZXN0X3N1cHBvcnRlZF92ZXJzaW9uID0gImRhIjsKKworICAgICAgICAvLyB2ZXJzaW9ucyBhYS1jeiBhcmUgbm90IHN1cHBvcnRlZCBpbiBPU1MKKyAgICAgICAgLy8gZGEgKDUuMCk6IGluaXRpYWwgdmVyc2lvbiBvZiB0aGUgQklUIGZvcm1hdAorICAgICAgICAvLyBOT1RFOiB3aGVuIGFkZGluZyBhIG5ldyB2ZXJzaW9uLCBwbGVhc2UgYWRkIHRoYXQgdG8gTGVnYWN5U1NUYWJsZVRlc3QsIHRvby4KKworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNMYXRlc3RWZXJzaW9uOworCisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IGNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uOworCisgICAgICAgIEJ0aVZlcnNpb24oQnRpRm9ybWF0IGZvcm1hdCwgU3RyaW5nIHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGZvcm1hdCwgdmVyc2lvbik7CisKKyAgICAgICAgICAgIGlzTGF0ZXN0VmVyc2lvbiA9IHZlcnNpb24uY29tcGFyZVRvKGN1cnJlbnRfdmVyc2lvbikgPT0gMDsKKyAgICAgICAgICAgIGNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uID0gTWVzc2FnaW5nU2VydmljZS5WRVJTSU9OXzQwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTGF0ZXN0VmVyc2lvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpc0xhdGVzdFZlcnNpb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjb3JyZXNwb25kaW5nTWVzc2FnaW5nVmVyc2lvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjb3JyZXNwb25kaW5nTWVzc2FnaW5nVmVyc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb21taXRMb2dMb3dlckJvdW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ29tbWl0TG9nSW50ZXJ2YWxzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTWF4Q29tcHJlc3NlZExlbmd0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1BlbmRpbmdSZXBhaXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNJc1RyYW5zaWVudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01ldGFkYXRhQ2hlY2tzdW0oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNPbGRCZkZvcm1hdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNBY2N1cmF0ZU1pbk1heCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTGVnYWN5TWluTWF4KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc09yaWdpbmF0aW5nSG9zdElkKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzSW1wcm92ZWRNaW5NYXgoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNQYXJ0aXRpb25MZXZlbERlbGV0aW9uc1ByZXNlbmNlTWFya2VyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzS2V5UmFuZ2UoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBhdGlibGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdmVyc2lvbi5jb21wYXJlVG8oZWFybGllc3Rfc3VwcG9ydGVkX3ZlcnNpb24pID49IDAgJiYgdmVyc2lvbi5jaGFyQXQoMCkgPD0gY3VycmVudF92ZXJzaW9uLmNoYXJBdCgwKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBhdGlibGVGb3JTdHJlYW1pbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaXNDb21wYXRpYmxlKCkgJiYgdmVyc2lvbi5jaGFyQXQoMCkgPT0gY3VycmVudF92ZXJzaW9uLmNoYXJBdCgwKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQnRpVGFibGVTcGVjaWZpY01ldHJpY3NQcm92aWRlcnMgaW1wbGVtZW50cyBNZXRyaWNzUHJvdmlkZXJzCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBCdGlUYWJsZVNwZWNpZmljTWV0cmljc1Byb3ZpZGVycyBpbnN0YW5jZSA9IG5ldyBCdGlUYWJsZVNwZWNpZmljTWV0cmljc1Byb3ZpZGVycygpOworCisgICAgICAgIHByaXZhdGUgZmluYWwgSXRlcmFibGU8R2F1Z2VQcm92aWRlcjw/Pj4gZ2F1Z2VQcm92aWRlcnMgPSBCbG9vbUZpbHRlck1ldHJpY3MuaW5zdGFuY2UuZ2V0R2F1Z2VQcm92aWRlcnMoKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEl0ZXJhYmxlPEdhdWdlUHJvdmlkZXI8Pz4+IGdldEdhdWdlUHJvdmlkZXJzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGdhdWdlUHJvdmlkZXJzOworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdGlGb3JtYXRGYWN0b3J5IGltcGxlbWVudHMgRmFjdG9yeQorICAgIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBOQU1FOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTU1RhYmxlRm9ybWF0PD8sID8+IGdldEluc3RhbmNlKE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCdGlGb3JtYXQob3B0aW9ucyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvQnRpRm9ybWF0Lm1kIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL0J0aUZvcm1hdC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGM4ODNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL0J0aUZvcm1hdC5tZApAQCAtMCwwICsxLDEwMTAgQEAKKzwhLS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworIyBCaWcgVHJpZS1JbmRleGVkIChCVEkpIFNTVGFibGUgZm9ybWF0CisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBCVEkgU1NUYWJsZSBmb3JtYXQsIHdoaWNoIGlzIGludHJvZHVjZWQgdG8KK0Nhc3NhbmRyYSB3aXRoIFtDRVAtMjVdKGh0dHBzOi8vY3dpa2kuYXBhY2hlLm9yZy9jb25mbHVlbmNlL2Rpc3BsYXkvQ0FTU0FORFJBL0NFUC0yNSUzQStUcmllLWluZGV4ZWQrU1NUYWJsZStmb3JtYXQpLgorCitUaGUgZm9ybWF0IGlzIGNhbGxlZCBCVEksIHdoaWNoIHN0YW5kcyBmb3IgIkJpZyBUcmllLUluZGV4ZWQiLCBiZWNhdXNlIGl0IHNoYXJlcwordGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBleGlzdGluZyBCSUcgZm9ybWF0IGFuZCBvbmx5IGNoYW5nZXMgdGhlIHByaW1hcnkgaW5kZXhlcworaW5zaWRlIFNTVGFibGVzLiBUaGUgZm9ybWF0IHJlbGllcyBvbiBieXRlIG9yZGVyIGFuZCB0cmllcywgYW5kIHVzZXMgYSBjb21iaW5hdGlvbgorb2YgZmVhdHVyZXMgdG8gbWFrZSB0aGUgaW5kZXhpbmcgc3RydWN0dXJlcyBjb21wYWN0IGFuZCBlZmZpY2llbnQuIFRoZSBwYXJhZ3JhcGhzCitiZWxvdyBkZXNjcmliZSB0aGUgZm9ybWF0J3MgZmVhdHVyZXMgYW5kIG1lY2hhbmlzbXMgdG9nZXRoZXIgd2l0aCB0aGUgbW90aXZhdGlvbiAKK2JlaGluZCB0aGVtLCBhbmQgY29uY2x1ZGUgd2l0aCBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgb24tZGlzayBmb3JtYXQuCisKKyMgUHJlcmVxdWlzaXRlcworCisjIyBCeXRlLWNvbXBhcmFibGUgdHlwZXMKKworVGhlIHByb3BlcnR5IG9mIGJlaW5nIGJ5dGUtY29tcGFyYWJsZSAoYWxzbyBjYWxsZWQgYnl0ZS1vcmRlcmVkKSBmb3IgYQora2V5IGRlbm90ZXMgdGhhdCB0aGVyZSBpcyBhIHNlcmlhbGlzYXRpb24gb2YgdGhhdCBrZXkgdG8gYSBzZXF1ZW5jZSBvZgorYnl0ZXMgd2hlcmUgdGhlIGxleGljb2dyYXBoaWMgY29tcGFyaXNvbiBvZiB0aGUgdW5zaWduZWQgYnl0ZXMgcHJvZHVjZXMKK3RoZSBzYW1lIHJlc3VsdCBhcyBwZXJmb3JtaW5nIGEgdHlwZWQgY29tcGFyaXNvbiBvZiB0aGUga2V5LgorCitGb3IgQ2Fzc2FuZHJhLCBzdWNoIGEgcmVwcmVzZW50YXRpb24gaXMgZ2l2ZW4gYnkKK1tDQVNTQU5EUkEtNjkzNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtNjkzNikuCitEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgbWVjaGFuaWNzIG9mIHRoZSB0cmFuc2xhdGlvbiBhcmUgcHJvdmlkZWQgaW4KK3RoZSBbaW5jbHVkZWQgZG9jdW1lbnRhdGlvbl0oLi4vLi4vLi4vLi4vdXRpbHMvYnl0ZWNvbXBhcmFibGUvQnl0ZUNvbXBhcmFibGUubWQpLgorCisjIyBUcmllcworCitBIHRyaWUgaXMgYSBkYXRhIHN0cnVjdHVyZSB0aGF0IGRlc2NyaWJlcyBhIG1hcHBpbmcgYmV0d2VlbiBzZXF1ZW5jZXMKK2FuZCBhc3NvY2lhdGVkIHZhbHVlcy4gSXQgaXMgdmVyeSBzaW1pbGFyIHRvIGEgZGV0ZXJtaW5pc3RpYyBmaW5pdGUKK3N0YXRlIGF1dG9tYXRvbiwgd2l0aCB0aGUgbWFpbiBkaWZmZXJlbmNlIHRoYXQgYW4gYXV0b21hdG9uIGlzIGFsbG93ZWQKK3RvIGhhdmUgY3ljbGVzLCB3aGlsZSBhIHRyaWUgaXMgbm90LgorCitCZWNhdXNlIHRoZSB0aGVvcnkgYW5kIG1haW4gdXNhZ2Ugb2YgdGhlIHN0cnVjdHVyZSBpcyBmb3IgZW5jb2Rpbmcgd29yZHMKK29mIGEgbGFuZ3VhZ2UsIHRoZSB0cmllIHRlcm1pbm9sb2d5IHRhbGtzIGFib3V0ICJjaGFyYWN0ZXJzIiwgIndvcmRzIgorYW5kICJhbHBoYWJldCIsIHdoaWNoIGluIG91ciBjYXNlIG1hcCB0byBieXRlcyBvZiB0aGUgYnl0ZS1vcmRlcmVkCityZXByZXNlbnRhdGlvbiwgdGhlIHNlcXVlbmNlIHRoYXQgZW5jb2RlcyBpdCwgYW5kIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YKK2EgYnl0ZVteMV0uCisKK1teMV06IEZvciBzaW1wbGljaXR5IHRoaXMgZGVzY3JpcHRpb24gYXNzdW1lcyB3ZSBkaXJlY3RseSBtYXAgYSBieXRlIHRvCithIGNoYXJhY3Rlci4gT3RoZXIgb3B0aW9ucyBhcmUgYWxzbyBwb3NzaWJsZSAoZS5nLiB1c2luZyBoZXggZGlnaXRzCithcyB0aGUgYWxwaGFiZXQgYW5kIHR3byB0cmFuc2l0aW9ucyBwZXIgYnl0ZSkuCisKK0EgdHJpZSBjYW4gYmUgZGVmaW5lZCBhcyBhIHRyZWUgZ3JhcGggaW4gd2hpY2ggdmVydGljZXMgYXJlIHN0YXRlcywgc29tZQorb2Ygd2hpY2ggY2FuIGJlIGZpbmFsIGFuZCBjb250YWluIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24sIGFuZCB3aGVyZQorZWRnZXMgYXJlIGxhYmVsbGVkIHdpdGggY2hhcmFjdGVycy4gQSB2YWxpZCB3b3JkIGluIHRoZSB0cmllIGlzIGVuY29kZWQKK2J5IGEgcGF0aCBzdGFydGluZyBmcm9tIHRoZSByb290IG9mIHRoZSB0cmllIHdoZXJlIGVhY2ggZWRnZSBpcyBsYWJlbGxlZAord2l0aCB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIHdvcmQsIGFuZCBlbmRpbmcgaW4gYSBmaW5hbCBzdGF0ZSB3aGljaAorY29udGFpbnMgdGhlICdwYXlsb2FkJyBhc3NvY2lhdGVkIHdpdGggdGhlIHdvcmQuCisKK2BgYG1lcm1haWQKK2dyYXBoIFRECisgIE5vZGVfKCggKSkKKyAgc3R5bGUgTm9kZV8gZmlsbDpkYXJrZ3JleQorICBOb2RlXyAtLSJhIi0tPiBOb2RlX2EoKChhKSkpCisgICAgTm9kZV9hIC0tImwiLS0+IE5vZGVfYWwoKCApKQorICAgICAgTm9kZV9hbCAtLSJsIi0tPiBOb2RlX2FsbCgoICkpCisgICAgICAgIE5vZGVfYWxsIC0tIm8iLS0+IE5vZGVfYWxsbygoICkpCisgICAgICAgICAgTm9kZV9hbGxvIC0tInciLS0+IE5vZGVfYWxsb3coKChhbGxvdykpKQorICAgIE5vZGVfYSAtLSJuIi0tPiBOb2RlX2FuKCgoYW4pKSkKKyAgICAgIE5vZGVfYW4gLS0iZCItLT4gTm9kZV9hbmQoKChhbmQpKSkKKyAgICAgIE5vZGVfYW4gLS0ieSItLT4gTm9kZV9hbnkoKChhbnkpKSkKKyAgICBOb2RlX2EgLS0iciItLT4gTm9kZV9hcigoICkpCisgICAgICBOb2RlX2FyIC0tImUiLS0+IE5vZGVfYXJlKCgoYXJlKSkpCisgICAgTm9kZV9hIC0tInMiLS0+IE5vZGVfYXMoKChhcykpKQorICBOb2RlXyAtLSJuIi0tPiBOb2RlX24oKCApKQorICAgIE5vZGVfbiAtLSJvIi0tPiBOb2RlX25vKCggKSkKKyAgICAgIE5vZGVfbm8gLS0iZCItLT4gTm9kZV9ub2QoKCApKQorICAgICAgICBOb2RlX25vZCAtLSJlIi0tPiBOb2RlX25vZGUoKChub2RlKSkpCisgIE5vZGVfIC0tIm8iLS0+IE5vZGVfbygoICkpCisgICAgTm9kZV9vIC0tImYiLS0+IE5vZGVfb2YoKChvZikpKQorICAgIE5vZGVfbyAtLSJuIi0tPiBOb2RlX29uKCgob24pKSkKKyAgTm9kZV8gLS0idCItLT4gTm9kZV90KCggKSkKKyAgICBOb2RlX3QgLS0iaCItLT4gTm9kZV90aCgoICkpCisgICAgICBOb2RlX3RoIC0tImUiLS0+IE5vZGVfdGhlKCgodGhlKSkpCisgICAgICBOb2RlX3RoIC0tImkiLS0+IE5vZGVfdGhpKCggKSkKKyAgICAgICAgTm9kZV90aGkgLS0icyItLT4gTm9kZV90aGlzKCgodGhpcykpKQorICAgIE5vZGVfdCAtLSJvIi0tPiBOb2RlX3RvKCgodG8pKSkKKyAgICBOb2RlX3QgLS0iciItLT4gTm9kZV90cigoICkpCisgICAgICBOb2RlX3RyIC0tImkiLS0+IE5vZGVfdHJpKCggKSkKKyAgICAgICAgTm9kZV90cmkgLS0iZSItLT4gTm9kZV90cmllKCgodHJpZSkpKQorICAgIE5vZGVfdCAtLSJ5Ii0tPiBOb2RlX3R5KCggKSkKKyAgICAgIE5vZGVfdHkgLS0icCItLT4gTm9kZV90eXAoKCApKQorICAgICAgICBOb2RlX3R5cCAtLSJlIi0tPiBOb2RlX3R5cGUoKCApKQorICAgICAgICAgIE5vZGVfdHlwZSAtLSJzIi0tPiBOb2RlX3R5cGVzKCgodHlwZXMpKSkKKyAgTm9kZV8gLS0idyItLT4gTm9kZV93KCggKSkKKyAgICBOb2RlX3cgLS0iaSItLT4gTm9kZV93aSgoICkpCisgICAgICBOb2RlX3dpIC0tInQiLS0+IE5vZGVfd2l0KCggKSkKKyAgICAgICAgTm9kZV93aXQgLS0iaCItLT4gTm9kZV93aXRoKCgod2l0aCkpKQorICAgICAgICAgIE5vZGVfd2l0aCAtLSJvIi0tPiBOb2RlX3dpdGhvKCggKSkKKyAgICAgICAgICAgIE5vZGVfd2l0aG8gLS0idSItLT4gTm9kZV93aXRob3UoKCApKQorICAgICAgICAgICAgICBOb2RlX3dpdGhvdSAtLSJ0Ii0tPiBOb2RlX3dpdGhvdXQoKCh3aXRob3V0KSkpCitgYGAKKworVGhpcyBtZWFucyB0aGF0IGluIGEgY29uc3RydWN0ZWQgdHJpZSBmaW5kaW5nIHRoZSBwYXlsb2FkIGFzc29jaWF0ZWQKK3dpdGggYSB3b3JkIGlzIGEgbWF0dGVyIG9mIGZvbGxvd2luZyB0aGUgZWRnZXMgKGFsc28gY2FsbGVkCisidHJhbnNpdGlvbnMiKSBmcm9tIHRoZSBpbml0aWFsIHN0YXRlIGxhYmVsbGVkIHdpdGggdGhlIGNvbnNlY3V0aXZlCitjaGFyYWN0ZXJzIG9mIHRoZSB3b3JkLCBhbmQgcmV0cmlldmluZyB0aGUgcGF5bG9hZCBhc3NvY2lhdGVkIHdpdGggdGhlCitzdGF0ZSBhdCB3aGljaCB3ZSBlbmQgdXAuIElmIHRoYXQncyBub3QgYSBmaW5hbCBzdGF0ZSwgb3IgaWYgYXQgYW55Citwb2ludCBpbiB0aGlzIHdlIGRpZCBub3QgZmluZCBhIHRyYW5zaXRpb24gaW4gdGhlIHRyaWUgbWF0Y2hpbmcgdGhlCitjaGFyYWN0ZXIsIHRoZSB0cmllIGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRpb24gZm9yIHRoZSB3b3JkLiBUaGUKK2NvbXBsZXhpdHkgb2YgbG9va3VwIGlzIHRodXMgX09fKGxlbih3b3JkKSkgdHJhbnNpdGlvbnMsIHdoZXJlIHRoZSBjb3N0IG9mCit0YWtpbmcgYSB0cmFuc2l0aW9uIGlzIHVzdWFsbHkgY29uc3RhbnQsIHRodXMgdGhpcyBjb21wbGV4aXR5IGlzCit0aGVvcmV0aWNhbGx5IG9wdGltYWwuCisKK0Zyb20gYSBzdG9yYWdlIHNwYWNlIHBlcnNwZWN0aXZlLCBvbmUgb2YgdGhlIG1haW4gYmVuZWZpdHMgb2YgYSB0cmllIGFzCithIGRhdGEgc3RydWN0dXJlIGZvciBzdG9yaW5nIGEgbWFwIGlzIHRoZSBmYWN0IHRoYXQgaXQgY29tcGxldGVseSBhdm9pZHMKK3N0b3JpbmcgcmVkdW5kYW50IHByZWZpeGVzLiBBbGwgd29yZHMgdGhhdCBzdGFydCB3aXRoIHRoZSBzYW1lIHNlcXVlbmNlCitzdG9yZSBhIHJlcHJlc2VudGF0aW9uIG9mIHRoYXQgc2VxdWVuY2Ugb25seSBvbmNlLiBJZiBwcmVmaXhlcyBhcmUKK2NvbW1vbmx5IHNoYXJlZCwgdGhpcyBjYW4gc2F2ZSBhIGdyZWF0IGRlYWwgb2Ygc3BhY2UuCisKK1doZW4gdGhlIGl0ZW1zIHN0b3JlZCBpbiBhIHRyaWUgYXJlIGxleGljb2dyYXBoaWNhbGx5ICg9Ynl0ZSkgb3JkZXJlZCwgYQordHJpZSBpcyBhbHNvIGFuIG9yZGVyZWQgc3RydWN0dXJlLiBBIHRyaWUgY2FuIGJlIHdhbGtlZCBpbiBvcmRlciBhbmQgaXQKK2lzIGFsc28gcG9zc2libGUgdG8gZWZmaWNpZW50bHkgbGlzdCB0aGUgaXRlbXMgYmV0d2VlbiB0d28gZ2l2ZW4ga2V5cy4KKworSW4gZmFjdCwgb25lIGNhbiBlZmZpY2llbnRseSAoYW5kIGxhemlseSkgYXBwbHkgc2V0IGFsZ2VicmEgb3ZlciB0cmllcywKK2FuZCBzbGljaW5nIGNhbiBiZSBzZWVuIGFzIGEgc2ltcGxlIGFwcGxpY2F0aW9uIG9mIGludGVyc2VjdGlvbiwgd2hlcmUKK3RoZSBpbnRlcnNlY3RpbmcgdHJpZSBpcyBnZW5lcmF0ZWQgb24gdGhlIGZseS4gVGhlIHNldCBvcGVyYXRpb25zCitiZW5lZml0IGZyb20gdGhlIHNhbWUgcHJlZml4LXNoYXJpbmcgZWZmZWN0ICZtZGFzaDsgd2UgYXBwbHkgdW5pb24gLworaW50ZXJzZWN0aW9uIC8gZGlmZmVyZW5jZSB0byBhIHN0YXRlLCB3aGljaCBoYXMgdGhlIGVmZmVjdCBvZiBhcHBseWluZwordGhlIG9wZXJhdGlvbiB0byBhbGwgd29yZHMgdGhhdCBzaGFyZSB0aGUgcHJlZml4IGRlbm90ZWQgYnkgdGhhdCBzdGF0ZS4KKworYGBgbWVybWFpZAorZ3JhcGggVEQKKyAgTm9kZV8oKCApKQorICBzdHlsZSBOb2RlXyBmaWxsOmRhcmtncmV5CisgIE5vZGVfIC0tImEiLS0+IE5vZGVfYSgoKGEpKSkKKyAgc3R5bGUgTm9kZV9hIHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgIGxpbmtTdHlsZSAwIHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgTm9kZV9hIC0tImwiLS0+IE5vZGVfYWwoKCApKQorICAgIHN0eWxlIE5vZGVfYWwgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICBsaW5rU3R5bGUgMSBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgTm9kZV9hbCAtLSJsIi0tPiBOb2RlX2FsbCgoICkpCisgICAgICBzdHlsZSBOb2RlX2FsbCBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgbGlua1N0eWxlIDIgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgICAgTm9kZV9hbGwgLS0ibyItLT4gTm9kZV9hbGxvKCggKSkKKyAgICAgICAgc3R5bGUgTm9kZV9hbGxvIHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICAgIGxpbmtTdHlsZSAzIHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICAgICAgTm9kZV9hbGxvIC0tInciLS0+IE5vZGVfYWxsb3coKChhbGxvdykpKQorICAgICAgICAgIHN0eWxlIE5vZGVfYWxsb3cgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgICAgICBsaW5rU3R5bGUgNCBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgIE5vZGVfYSAtLSJuIi0tPiBOb2RlX2FuKCgoYW4pKSkKKyAgICAgICAgICBzdHlsZSBOb2RlX2FuIHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICAgICAgbGlua1N0eWxlIDUgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgIE5vZGVfYW4gLS0iZCItLT4gTm9kZV9hbmQoKChhbmQpKSkKKyAgICAgICAgICBzdHlsZSBOb2RlX2FuZCBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgICAgIGxpbmtTdHlsZSA2IHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICBOb2RlX2FuIC0tInkiLS0+IE5vZGVfYW55KCgoYW55KSkpCisgICAgICAgICAgc3R5bGUgTm9kZV9hbnkgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgICAgICBsaW5rU3R5bGUgNyBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgIE5vZGVfYSAtLSJyIi0tPiBOb2RlX2FyKCggKSkKKyAgICAgICAgICBzdHlsZSBOb2RlX2FyIHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICAgICAgbGlua1N0eWxlIDggc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgIE5vZGVfYXIgLS0iZSItLT4gTm9kZV9hcmUoKChhcmUpKSkKKyAgICAgICAgICBzdHlsZSBOb2RlX2FyZSBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgICAgIGxpbmtTdHlsZSA5IHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgTm9kZV9hIC0tInMiLS0+IE5vZGVfYXMoKChhcykpKQorICAgICAgICAgIHN0eWxlIE5vZGVfYXMgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgICAgICBsaW5rU3R5bGUgMTAgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgTm9kZV8gLS0ibiItLT4gTm9kZV9uKCggKSkKKyAgICBOb2RlX24gLS0ibyItLT4gTm9kZV9ubygoICkpCisgICAgICBOb2RlX25vIC0tImQiLS0+IE5vZGVfbm9kKCggKSkKKyAgICAgICAgTm9kZV9ub2QgLS0iZSItLT4gTm9kZV9ub2RlKCgobm9kZSkpKQorICBOb2RlXyAtLSJvIi0tPiBOb2RlX28oKCApKQorICAgIE5vZGVfbyAtLSJmIi0tPiBOb2RlX29mKCgob2YpKSkKKyAgICBOb2RlX28gLS0ibiItLT4gTm9kZV9vbigoKG9uKSkpCisgIE5vZGVfIC0tInQiLS0+IE5vZGVfdCgoICkpCisgICAgTm9kZV90IC0tImgiLS0+IE5vZGVfdGgoKCApKQorICAgICAgTm9kZV90aCAtLSJlIi0tPiBOb2RlX3RoZSgoKHRoZSkpKQorICAgICAgTm9kZV90aCAtLSJpIi0tPiBOb2RlX3RoaSgoICkpCisgICAgICAgIE5vZGVfdGhpIC0tInMiLS0+IE5vZGVfdGhpcygoKHRoaXMpKSkKKyAgICAgICAgICBzdHlsZSBOb2RlX3RoaXMgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgICAgICBsaW5rU3R5bGUgMjIgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICBOb2RlX3QgLS0ibyItLT4gTm9kZV90bygoKHRvKSkpCisgICAgICAgICAgc3R5bGUgTm9kZV90byBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgICAgIGxpbmtTdHlsZSAyMyBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgIE5vZGVfdCAtLSJyIi0tPiBOb2RlX3RyKCggKSkKKyAgICAgICAgICBzdHlsZSBOb2RlX3RyIHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICAgICAgbGlua1N0eWxlIDI0IHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICBOb2RlX3RyIC0tImkiLS0+IE5vZGVfdHJpKCggKSkKKyAgICAgICAgICBzdHlsZSBOb2RlX3RyaSBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgICAgIGxpbmtTdHlsZSAyNSBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgICBOb2RlX3RyaSAtLSJlIi0tPiBOb2RlX3RyaWUoKCh0cmllKSkpCisgICAgICAgICAgc3R5bGUgTm9kZV90cmllIHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICAgICAgbGlua1N0eWxlIDI2IHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgTm9kZV90IC0tInkiLS0+IE5vZGVfdHkoKCApKQorICAgICAgICAgIHN0eWxlIE5vZGVfdHkgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgICAgICBsaW5rU3R5bGUgMjcgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgIE5vZGVfdHkgLS0icCItLT4gTm9kZV90eXAoKCApKQorICAgICAgICAgIHN0eWxlIE5vZGVfdHlwIHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICAgICAgbGlua1N0eWxlIDI4IHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICAgIE5vZGVfdHlwIC0tImUiLS0+IE5vZGVfdHlwZSgoICkpCisgICAgICAgICAgc3R5bGUgTm9kZV90eXBlIHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICAgICAgbGlua1N0eWxlIDI5IHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICAgICAgTm9kZV90eXBlIC0tInMiLS0+IE5vZGVfdHlwZXMoKCh0eXBlcykpKQorICAgICAgICAgIHN0eWxlIE5vZGVfdHlwZXMgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgICAgICBsaW5rU3R5bGUgMzAgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgTm9kZV8gLS0idyItLT4gTm9kZV93KCggKSkKKyAgICAgICAgICBzdHlsZSBOb2RlX3cgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgICAgICBsaW5rU3R5bGUgMzEgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICBOb2RlX3cgLS0iaSItLT4gTm9kZV93aSgoICkpCisgICAgICAgICAgc3R5bGUgTm9kZV93aSBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgICAgIGxpbmtTdHlsZSAzMiBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgTm9kZV93aSAtLSJ0Ii0tPiBOb2RlX3dpdCgoICkpCisgICAgICAgICAgc3R5bGUgTm9kZV93aXQgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgICAgICBsaW5rU3R5bGUgMzMgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgICAgTm9kZV93aXQgLS0iaCItLT4gTm9kZV93aXRoKCgod2l0aCkpKQorICAgICAgICAgIHN0eWxlIE5vZGVfd2l0aCBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgICAgIGxpbmtTdHlsZSAzNCBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgICAgIE5vZGVfd2l0aCAtLSJvIi0tPiBOb2RlX3dpdGhvKCggKSkKKyAgICAgICAgICBzdHlsZSBOb2RlX3dpdGhvIHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICAgICAgbGlua1N0eWxlIDM1IHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICAgICAgICBOb2RlX3dpdGhvIC0tInUiLS0+IE5vZGVfd2l0aG91KCggKSkKKyAgICAgICAgICBzdHlsZSBOb2RlX3dpdGhvdSBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgICAgIGxpbmtTdHlsZSAzNiBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgICAgICAgICBOb2RlX3dpdGhvdSAtLSJ0Ii0tPiBOb2RlX3dpdGhvdXQoKCh3aXRob3V0KSkpCisgICAgICAgICAgc3R5bGUgTm9kZV93aXRob3V0IHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICAgICAgbGlua1N0eWxlIDM3IHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisKK2BgYAorCisoQW4gZXhhbXBsZSBvZiBzbGljaW5nIHRoZSB0cmllIGFib3ZlIHdpdGggdGhlIHJhbmdlICJiaXQiLSJ0aGluZyIuCitQcm9jZXNzaW5nIG9ubHkgYXBwbGllcyBvbiBib3VuZGFyeSBub2RlcyAocm9vdCwgInQiLCAidGgiLCAidGhpIiksCit3aGVyZSB3ZSB0aHJvdyBhd2F5IHRoZSB0cmFuc2l0aW9ucyBvdXRzaWRlIHRoZSByYW5nZS4gU3VidHJpZXMgbGlrZSB0aGUKK29uZXMgZm9yICJuIiBhbmQgIm8iIGZhbGwgY29tcGxldGVseSBiZXR3ZWVuICJiIiBhbmQgInQiIHRodXMgYXJlIGZ1bGx5CitpbnNpZGUgdGhlIHJhbmdlIGFuZCBjYW4gYmUgcHJvY2Vzc2VkIHdpdGhvdXQgYW55IGZ1cnRoZXIgcmVzdHJpY3Rpb25zLikKKworQSB0cmllIGNhbiBiZSB1c2VkIGFzIGEgbW9kaWZpYWJsZSBpbi1tZW1vcnkgZGF0YSBzdHJ1Y3R1cmUgd2hlcmUgb25lCitjYW4gYWRkIGFuZCByZW1vdmUgaW5kaXZpZHVhbCBlbGVtZW50cy4gSXQgY2FuIGFsc28gYmUgY29uc3RydWN0ZWQgZnJvbQorc29ydGVkIGlucHV0LCBpbmNyZW1lbnRhbGx5IHN0b3JpbmcgdGhlIGRhdGEgZGlyZWN0bHkgdG8gZGlzayBhbmQKK2J1aWxkaW5nIGFuIGVmZmljaWVudCByZWFkLW9ubHkgb24tZGlzayBkYXRhIHN0cnVjdHVyZS4KKworRm9yIG1vcmUgZm9ybWFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb25jZXB0IGFuZCBhcHBsaWNhdGlvbnMgb2YgdHJpZXMKK2FuZCBmaW5pdGUgc3RhdGUgYXV0b21hdGEsIHRyeSBbSW50cm9kdWN0aW9uIHRvIEF1dG9tYXRhIFRoZW9yeSwKK0xhbmd1YWdlcywgYW5kIENvbXB1dGF0aW9uXShodHRwczovL2Jvb2tzLmdvb2dsZS5jb20vYm9va3M/aWQ9ZFZpcEJ3QUFRQkFKKS4KK1RoZXJlIGFyZSBtYW55IHZhcmlhdGlvbnMgb2YgdGhlIGNvbmNlcHQsIGFuZCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YKK3N0YXRlcyBhbmQgdHJhbnNpdGlvbnMgdGhhdCBjYW4gYmUgcHV0IHRvIHVzZSB0byBhY2hpZXZlIGV2ZW4gZnVydGhlcgorZWZmaWNpZW5jeSBnYWluczsgc29tZSBvZiB0aGVzZSB3aWxsIGJlIGRldGFpbGVkIGJlbG93LgorCisjIEluZGV4aW5nIHdpdGggdHJpZXMKKworU2luY2UgYSB0cmllIGlzIGdlbmVyYWxseSBhbiBvcmRlcmVkIGJ5dGUgc291cmNlIHRvIHBheWxvYWQgbWFwLCB3ZSBjYW4KK2FwcGx5IHRoZSBjb25jZXB0IGRpcmVjdGx5IHRvIHRoZSBjb21wb25lbnRzIG9mIENhc3NhbmRyYSB0aGF0IGFyZSBtb3N0CithZmZlY3RlZCBieSB0aGUgaW5lZmZpY2llbmN5IG9mIHVzaW5nIGNvbXBhcmlzb24tYmFzZWQgc3RydWN0dXJlczogdGhlCitpbmRpY2VzLgorCitUaGlzIGNhbiBiZSBkb25lIGluIHRoZSBmb2xsb3dpbmcgd2F5OgorCistICAgV2hlbiB3ZSB3cml0ZSB0aGUgaW5kZXgsIHdlIG1hcCBlYWNoIGtleSBpbnRvIGl0cyBieXRlLW9yZGVyZWQKKyAgICByZXByZXNlbnRhdGlvbiBhbmQgY3JlYXRlIGFuIG9uLWRpc2sgdHJpZSBvZiBieXRlLW9yZGVyZWQKKyAgICByZXByZXNlbnRhdGlvbnMgb2Yga2V5cyBtYXBwaW5nIGludG8gcG9zaXRpb25zIGluIHRoZSBkYXRhIGZpbGUuCisKKy0gICBXaGVuIHdlIG5lZWQgYW4gZXhhY3QgbWF0Y2ggZm9yIGEga2V5LCB3ZSBjcmVhdGUgYSAobGF6aWx5CisgICAgZ2VuZXJhdGVkKSBieXRlLW9yZGVyZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGtleSBhbmQgbG9vayBmb3IgaXQKKyAgICBpbiB0aGUgdHJpZS4KKworICAgIC0gICBJZiB3ZSBmaW5kIGEgbWF0Y2gsIHdlIGtub3cgdGhlIGRhdGEgZmlsZSBwb3NpdGlvbi4KKworICAgIC0gICBJZiB0aGVyZSBpcyBubyBtYXRjaCwgdGhlcmUgaXMgbm8gZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS4KKworLSAgIFdoZW4gd2UgbmVlZCBhIGdyZWF0ZXItdGhhbi9ncmVhdGVyLW9yLWVxdWFsIG1hdGNoLCB3ZSB1c2UgdGhlCisgICAgYnl0ZS1vcmRlcmVkIHJlcHJlc2VudGF0aW9uIHRvIGNyZWF0ZSBhIHBhdGggdGhhdCBsZWFkcyB0byB0aGUKKyAgICBmaXJzdCBtYXRjaGluZyBkYXRhIHBvc2l0aW9uIGluIHRoZSBzc3RhYmxlLgorCisgICAgLSAgIFdlIGNhbiB0aGVuIHVzZSB0aGlzIHBhdGggdG8gaXRlcmF0ZSB0aGUgZ3JlYXRlciBrZXlzIGluIHRoZQorICAgICAgICBzc3RhYmxlLgorCitUaGlzIHdvcmtzLCBidXQgaXNuJ3QgdmVyeSBlZmZpY2llbnQuIExvb2t1cCBpbiBpdCBpcyBfT18obGVuKGtleSkpLCAKK3doaWNoIGNhbiBldmVuIG1lYW4gdGhhdCBtYW55IHNlZWtzIG9uIGRpc2ssIGFuZCB3ZSBoYXZlIHRvIHN0b3JlCithIHRyYW5zaXRpb24gKHdoaWNoIGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIHN0cnVjdHVyZSkgZm9yIGV2ZXJ5Citub24tcHJlZml4IGNoYXJhY3RlciBpbiB0aGUgZGF0YXNldC4KKworV2UgY2FuIGRvIG11Y2ggYmV0dGVyLgorCisjIyBUcmltbWluZyB0aGUgZmF0CisKK1RoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhlIGluZGV4IGlzIHRvIGZpbmQgYSBwb3NpdGlvbiBpbiB0aGUgZGF0YSBmaWxlCitmb3IgdGhlIGdpdmVuIGtleS4gSXQgbmVlZHMgdG8gYmUgYWJsZSB0byBmaW5kIHRoZSBjb3JyZWN0IHBvc2l0aW9uIGZvcgorYW55IGV4aXN0aW5nIGtleSwgYnV0IHRoZXJlIGlzIG5vIG5lZWQgZm9yIGl0IHRvIGJlIGV4YWN0IG9uIGtleXMgdGhhdAorYXJlIG5vdCBwcmVzZW50IGluIHRoZSBmaWxlICZtZGFzaDsgc2luY2Ugb3VyIGRhdGEgZmlsZXMgY29udGFpbiBhIGNvcHkgb2YKK3RoZSBrZXkgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggcGFydGl0aW9uLCB3ZSBjYW4gc2ltcGx5IGNoZWNrIGlmIHRoZSBrZXkKK3dlIGFyZSBzZWFyY2hpbmcgZm9yIG1hdGNoZXMgdGhlIGtleSBhdCB0aGUgcG9zaXRpb24gcmV0dXJuZWQgYnkgdGhlCitpbmRleC4KKworVGhpcyBhbGxvd3MgdXMgdG8gdXNlIGEgc2ltcGxlIG9wdGltaXphdGlvbjogaW5zdGVhZCBvZiBzdG9yaW5nIHRoZSBmdWxsCitrZXkgaW4gdGhlIGluZGV4IHRyaWUsIHdlIGNhbiBzdG9yZSBvbmx5IGEgcHJlZml4IG9mIHRoZSBrZXkgdGhhdCBpcwordW5pcXVlIGFtb25nIGFsbCBwYXJ0aXRpb25zIGluIHRoZSB0YWJsZS4gVGhpcyBtZWFucyB0aGF0IHdlIGhhdmUKK2ludGVybWVkaWF0ZSBub2RlcyBpbiB0aGUgdHJpZSBvbmx5IGlmIGEgcHJlZml4IGlzIHNoYXJlZCBieSBtdWx0aXBsZQora2V5cywgd2hpY2ggbm9ybWFsbHkgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIG5vZGVzIGFuZCB0cmFuc2l0aW9ucyBpbiB0aGUKK3RyaWUgdG8gYWJvdXQgMipuKi4KKworYGBgbWVybWFpZAorZ3JhcGggVEQKKyAgTm9kZV8oKCApKQorICBzdHlsZSBOb2RlXyBmaWxsOmRhcmtncmV5CisgIE5vZGVfICAtLSJhIi0tPiBOb2RlX2EoKCggKSkpCisgICAgTm9kZV9hIC0tImwiLS0+IE5vZGVfYWwoKCggKSkpCisgICAgTm9kZV9hIC0tIm4iLS0+IE5vZGVfYW4oKCggKSkpCisgICAgICBOb2RlX2FuIC0tImQiLS0+IE5vZGVfYW5kKCgoICkpKQorICAgICAgTm9kZV9hbiAtLSJ5Ii0tPiBOb2RlX2FueSgoKCApKSkKKyAgICBOb2RlX2EgLS0iciItLT4gTm9kZV9hcigoKCApKSkKKyAgICBOb2RlX2EgLS0icyItLT4gTm9kZV9hcygoKCApKSkKKyAgTm9kZV8gIC0tIm4iLS0+IE5vZGVfbigoKCApKSkKKyAgTm9kZV8gIC0tIm8iLS0+IE5vZGVfbygoICkpCisgICAgTm9kZV9vIC0tImYiLS0+IE5vZGVfb2YoKCggKSkpCisgICAgTm9kZV9vIC0tIm4iLS0+IE5vZGVfb24oKCggKSkpCisgIE5vZGVfICAtLSJ0Ii0tPiBOb2RlX3QoKCApKQorICAgIE5vZGVfdCAtLSJoIi0tPiBOb2RlX3RoKCggKSkKKyAgICAgIE5vZGVfdGggLS0iZSItLT4gTm9kZV90aGUoKCggKSkpCisgICAgICBOb2RlX3RoIC0tImkiLS0+IE5vZGVfdGhpKCgoICkpKQorICAgIE5vZGVfdCAtLSJvIi0tPiBOb2RlX3RvKCgoICkpKQorICAgIE5vZGVfdCAtLSJyIi0tPiBOb2RlX3RyKCgoICkpKQorICAgIE5vZGVfdCAtLSJ5Ii0tPiBOb2RlX3R5KCgoICkpKQorICBOb2RlXyAgLS0idyItLT4gTm9kZV93KCggKSkKKyAgICBOb2RlX3cgLS0iaXRoIi0tPiBOb2RlX3dpdGgoKCggKSkpCisgICAgICAgICAgTm9kZV93aXRoIC0tIm8iLS0+IE5vZGVfd2l0aG91dCgoKCApKSkKK2BgYAorCitUaGlzIGFsc28gcmVkdWNlcyB0aGUgbnVtYmVyIG9mIHN0ZXBzIHdlIG5lZWQgdG8gdGFrZSBpbiB0aGUgdHJpZS4gSW4gYQord2VsbC1iYWxhbmNlZCBrZXkgc2V0IChzdWNoIGFzIHRoZSBvbmUgd2hlcmUgdGhlIGJ5dGUtb3JkZXJlZCBrZXkgc3RhcnRzCit3aXRoIGEgaGFzaCBhcyBpbiBNdXJtdXIgb3IgUmFuZG9tLXBhcnRpdGlvbmVkIHByaW1hcnkga2V5cykgdGhlIGxvb2t1cAorY29tcGxleGl0eSBiZWNvbWVzIF9PXyhsb2cgX25fKSB0cmFuc2l0aW9uc1teMl0uCisKK1teMl06IEZvciBjb21wYXJpc29uLCB0aGUgY29tcGxleGl0eSBvZiBiaW5hcnkgc2VhcmNoIGluIGEgc29ydGVkCitwcmltYXJ5IGluZGV4IGlzIGFsc28gX09fKGxvZyBfbl8pLCBidXQgaW4ga2V5IGNvbXBhcmlzb25zIHdob3NlCitjb21wbGV4aXR5IG9uIGF2ZXJhZ2UgaW4gYSB3ZWxsLWJhbGFuY2VkIGtleSBzZXQgaXMgYW5vdGhlciBfT18obG9nIF9uXykKK2ZvciBhIHRvdGFsIF9PXyhsb2c8c3VwPjI8L3N1cD4gX25fKS4KKworIyMgVGFraW5nIGhhcmR3YXJlIGludG8gYWNjb3VudAorCitUaGUgcG9pbnQgYWJvdmUgaW1wcm92ZXMgdGhlIG51bWJlciBvZiB0cmFuc2l0aW9ucyBzaWduaWZpY2FudGx5LCBidXQKK3RoZSBvdXQtb2YtY2FjaGUgZWZmaWNpZW5jeSBpcyBzdGlsbCBwcmV0dHkgYmFkIGlmIHdlIGhhdmUgdG8gcmVhZCBhIG5ldworZGlzayBwYWdlIGV2ZXJ5IHRpbWUgd2UgZXhhbWluZSBhIG5vZGUuIEZvcnR1bmF0ZWx5IHdlIGNhbiB0YWtlIHNvbWUKK2V4dHJhIGNhcmUgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBtYWtlIHN1cmUgd2UgbWFrZSB0aGUgbW9zdCBvZiBldmVyeQorZGlzayBwYWdlIGJyb3VnaHQgdXAgZHVyaW5nIGxvb2t1cC4KKworVGhlIGlkZWEgb2YgdGhpcyBpcyB0byBwYWNrIHdpZGUgc2VjdGlvbnMgb2YgdGhlIHRyaWUgaW4gcGFnZXMsIHNvIHRoYXQKK2V2ZXJ5IHRpbWUgd2Ugb3BlbiBhIHBhZ2Ugd2UgY2FuIGJlIGNlcnRhaW4gdG8gYmUgYWJsZSB0byBmb2xsb3cgc2V2ZXJhbAordHJhbnNpdGlvbnMgYmVmb3JlIGxlYXZpbmcgdGhhdCBwYWdlLgorCitgYGBtZXJtYWlkCitncmFwaCBURAorICBzdWJncmFwaCBwMSBbIF0KKyAgTm9kZV8oKCApKQorICBzdHlsZSBOb2RlXyBmaWxsOmRhcmtncmV5CisgICAgTm9kZV8gIC0tImEiLS0+IE5vZGVfYSgoKCApKSkKKyAgICBOb2RlXyAgLS0idCItLT4gTm9kZV90KCggKSkKKyAgZW5kCisgIAorICBzdWJncmFwaCBwMiBbIF0KKyAgICBOb2RlX2EgLS0ibCItLT4gTm9kZV9hbCgoKCApKSkKKyAgICBOb2RlX2EgLS0ibiItLT4gTm9kZV9hbigoKCApKSkKKyAgICAgIE5vZGVfYW4gLS0iZCItLT4gTm9kZV9hbmQoKCggKSkpCisgICAgICBOb2RlX2FuIC0tInkiLS0+IE5vZGVfYW55KCgoICkpKQorICBlbmQKKyAgCisgIHN1YmdyYXBoIHAzIFsgXQorICAgIE5vZGVfYSAtLSJyIi0tPiBOb2RlX2FyKCgoICkpKQorICAgIE5vZGVfYSAtLSJzIi0tPiBOb2RlX2FzKCgoICkpKQorICBOb2RlXyAgLS0ibiItLT4gTm9kZV9uKCgoICkpKQorICBlbmQKKworICBzdWJncmFwaCBwNCBbIF0KKyAgTm9kZV8gIC0tIm8iLS0+IE5vZGVfbygoICkpCisgICAgTm9kZV9vIC0tImYiLS0+IE5vZGVfb2YoKCggKSkpCisgICAgTm9kZV9vIC0tIm4iLS0+IE5vZGVfb24oKCggKSkpCisgICAgTm9kZV90IC0tIm8iLS0+IE5vZGVfdG8oKCggKSkpCisgIGVuZAorICAKKyAgc3ViZ3JhcGggcDUgWyBdCisgICAgTm9kZV90IC0tImgiLS0+IE5vZGVfdGgoKCApKQorICAgICAgTm9kZV90aCAtLSJlIi0tPiBOb2RlX3RoZSgoKCApKSkKKyAgICAgIE5vZGVfdGggLS0iaSItLT4gTm9kZV90aGkoKCggKSkpCisgICAgTm9kZV90IC0tInIiLS0+IE5vZGVfdHIoKCggKSkpCisgIGVuZAorICAKKyAgc3ViZ3JhcGggcDYgWyBdCisgICAgTm9kZV90IC0tInkiLS0+IE5vZGVfdHkoKCggKSkpCisgIE5vZGVfICAtLSJ3Ii0tPiBOb2RlX3coKCApKQorICAgIE5vZGVfdyAtLSJpdGgiLS0+IE5vZGVfd2l0aCgoKCApKSkKKyAgICAgICAgICBOb2RlX3dpdGggLS0ibyItLT4gTm9kZV93aXRob3V0KCgoICkpKQorICBlbmQKKyAgCisgIHAyIH5+fiBwMyB+fn4gcDQgfn5+IHA1IH5+fiBwNgorYGBgCisKK09uZSB3YXkgdG8gZ2VuZXJhdGUgc29tZXRoaW5nIGxpa2UgdGhpcyBpcyB0byBzdGFydCBmcm9tIHRoZSByb290IGFuZCBkbworYSBicmVhZHRoLWZpcnN0IHdhbGssIHBsYWNpbmcgdGhlIGVuY291bnRlcmVkIG5vZGVzIG9uIGRpc2sgdW50aWwgYSBwYWdlCitpcyBmaWxsZWQgYW5kIHRoZWlyIHRhcmdldCB0cmFuc2l0aW9ucyBpbiBhIHF1ZXVlIGZvciB3aGljaCB0aGUgcHJvY2VzcworaXMgcmVwZWF0ZWQgdG8gZmlsbCBvdGhlciBwYWdlcy4KKworQW5vdGhlciBhcHByb2FjaCwgbW9yZSBzdWl0YWJsZSB0byBvdXIgYXBwbGljYXRpb24gYmVjYXVzZSBpdCBjYW4gYmUKK2RvbmUgYXMgcGFydCBvZiB0aGUgaW5jcmVtZW50YWwgY29uc3RydWN0aW9uIHByb2Nlc3MsIGlzIHRvIGRvIHRoZQorcGFja2luZyBmcm9tIHRoZSBib3R0b20gdXAgJm1kYXNoOyB3aGVuIHRoZSBpbmNyZW1lbnRhbCBjb25zdHJ1Y3Rpb24KK2FsZ29yaXRobSBjb21wbGV0ZXMgYSBub2RlIHdlIGRvIG5vdCBpbW1lZGlhdGVseSB3cml0ZSBpdCwgYnV0IHdhaXQKK3VudGlsIHdlIGhhdmUgZm9ybWVkIGEgYnJhbmNoIHRoYXQgaXMgYmlnZ2VyIHRoYW4gYSBwYWdlLiBXaGVuIHRoaXMKK2hhcHBlbnMgd2UgbGF5IG91dCB0aGUgbm9kZSdzIGNoaWxkcmVuIChlYWNoIHNtYWxsZXIgdGhhbiBhIHBhZ2UgYnV0Cityb290IG9mIGEgYmlnZ2VzdCBicmFuY2ggdGhhdCB3b3VsZCBmaXQpIGFuZCBsZXQgdGhlIHBhcmVudCBub2RlIGJlCit0cmVhdGVkIGxpa2UgYSBsZWFmIGZyb20gdGhlcmUgb24uIEluIHR1cm4gaXQgd2lsbCBiZWNvbWUgcGFydCBvZiBhCiticmFuY2ggdGhhdCBpcyBiaWdnZXIgdGhhbiBhIHBhZ2UgYW5kIHdpbGwgYmUgbGFpZCBwYWNrYWdlZCB0b2dldGhlcgord2l0aCBpdHMgcmVsYXRlZCBub2RlcywgcmVzdWx0aW5nIGluIGEgcGljdHVyZSBzaW1pbGFyIHRvIHRoZSBhYm92ZS4KKworSW4gZmFjdCB0aGUgYm90dG9tLXVwIHByb2Nlc3MgaGFzIGEgbGl0dGxlIHBlcmZvcm1hbmNlIGJlbmVmaXQgb3ZlciB0aGUKK3RvcC1kb3duOiB3aXRoIHRoZSB0b3AtZG93biBjb25zdHJ1Y3Rpb24gdGhlIHJvb3QgcGFnZSBpcyBmdWxsIGFuZCBsZWFmCitwYWdlcyB0YWtlIGNvbWJpbmF0aW9ucyBvZiB1bnJlbGF0ZWQgc21hbGxlciBicmFuY2hlczsgd2l0aCB0aGUKK2JvdHRvbS11cCB0aGUgbGVhZiBwYWdlcyB0YWtlIGFzIG11Y2ggaW5mb3JtYXRpb24gYXMgcG9zc2libGUgYWJvdXQgYQorYnJhbmNoLCB3aGlsZSB0aGUgcm9vdCBvZnRlbiByZW1haW5zIHVuZmlsbGVkLiBGb3IgdGhlIGJlc3QgcG9zc2libGUKK291dC1vZi1jYWNoZSBlZmZpY2llbmN5IHdlIHdvdWxkIHByZWZlciB0aGUgc2V0IG9mIG5vbi1sZWFmIHBhZ2VzIHRvIGJlCithcyBzbWFsbCBhcyBwb3NzaWJsZS4gSGF2aW5nIGxhcmdlciBsZWFmIHBhZ2UgYnJhbmNoZXMgbWVhbnMgbW9yZSBvZiB0aGUKK3RyaWUgZGF0YSBpcyBpbiB0aGUgbGVhZiBicmFuY2hlcyBhbmQgdGh1cyB0aGUgc2l6ZSBvZiB0aGF0IGludGVybWVkaWF0ZQorbm9kZSBzZXQgaXMgc21hbGxlci4KKworU2VlIFtgSW5jcmVtZW50YWxUcmllV3JpdGVyUGFnZUF3YXJlYF0oLi4vLi4vLi4vdHJpZXMvSW5jcmVtZW50YWxEZWVwVHJpZVdyaXRlclBhZ2VBd2FyZS5qYXZhKSAKK2ZvciBkZXRhaWxzIG9uIGhvdyB0aGUgcGFnZS1hd2FyZQordHJpZSBjb25zdHJ1Y3Rpb24gaXMgaW1wbGVtZW50ZWQuCisKKyMjIFN0b3JpbmcgdGhlIHRyaWUKKworQW5vdGhlciBpbnRlcmVzdGluZyBxdWVzdGlvbiBhYm91dCB0aGUgZm9ybWF0IG9mIHRoZSB0cmllIGlzIGhvdyBvbmUKK3N0b3JlcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRyYW5zaXRpb25zIGluIGEgbm9kZS4gSWYgd2Ugd2FudCB0bworbWFpbnRhaW4gdGhhdCB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGlzIHByb3BvcnRpb25hbCB0byB0aGUgbnVtYmVyIG9mCitvdmVyYWxsIHRyYW5zaXRpb25zLCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gc3RvcmUgbm9kZSB0cmFuc2l0aW9ucworc3BhcnNlbHkuIFR5cGljYWxseSB0aGlzIGlzIGRvbmUgdXNpbmcgYSBsaXN0IG9mIHRyYW5zaXRpb24gY2hhcmFjdGVycworYW5kIGJpbmFyeSBzZWFyY2hpbmcgYW1vbmcgdGhlbSB0byBtYWtlIGEgdHJhbnNpdGlvbi4KKworVGhpcyBiaW5hcnkgc2VhcmNoIGNhbiB0aGVvcmV0aWNhbGx5IGJlIHRha2VuIHRvIHVzZSBjb25zdGFudCB0aW1lCisoc2luY2UgdGhlIGFscGhhYmV0IHNpemUgaXMgc21hbGwgYW5kIHByZWRlZmluZWQpLCBidXQgaXNuJ3QgdGhlIG1vc3QKK2VmZmljaWVudCBvcGVyYXRpb24gaW4gcHJhY3RpY2UgZHVlIHRvIHRoZSB1bnByZWRpY3RhYmxlIGJyYW5jaAoraW5zdHJ1Y3Rpb25zIG5lY2Vzc2FyeSBmb3IgaXRzIGltcGxlbWVudGF0aW9uLiBJdCBpcyBwcmVmZXJhYmxlIHRvIGF2b2lkCitpdCBhcyBtdWNoIGFzIHBvc3NpYmxlLgorCitUbyBkbyB0aGlzLCBhbmQgdG8gc2hhdmUgYSBmZXcgYWRkaXRpb25hbCBieXRlcyBpbiBjb21tb24gY2FzZXMsIG91cgoraW1wbGVtZW50YXRpb24gb2Ygb24tZGlzayB0cmllcyB1c2VzIHR5cGVkIG5vZGVzLiBBIG5vZGUgY2FuIGJlOgorCistICAgRmluYWwgd2l0aCBubyB0cmFuc2l0aW9ucyAoYFBBWUxPQURfT05MWWApLgorCistICAgSGF2aW5nIG9uZSB0cmFuc2l0aW9uIChgU0lOR0xFYCksIHdoaWNoIGhhcyB0byBzdG9yZSBvbmx5IHRoZQorICAgIGNoYXJhY3RlciBhbmQgdGFyZ2V0IGZvciB0aGF0IHRyYW5zaXRpb24uCisKKy0gICBIYXZpbmcgYSBiaW5hcnktc2VhcmNoZWQgbGlzdCBvZiB0cmFuc2l0aW9ucyAoYFNQQVJTRWApLCB3aGVyZSB0aGUKKyAgICBudW1iZXIgb2YgY2hhcmFjdGVycywgZWFjaCBjaGFyYWN0ZXIgYW5kIHRoZSB0YXJnZXRzIGFyZSBzdG9yZWQuCisKKy0gICBIYXZpbmcgYSBjb25zZWN1dGl2ZSByYW5nZSBvZiB0cmFuc2l0aW9ucyAoYERFTlNFYCksIHdoZXJlIHRoZSBmaXJzdAorICAgIGFuZCBsYXN0IGNoYXJhY3RlciBhbmQgdGFyZ2V0cyBhcmUgc3RvcmVkLCBwb3NzaWJseSBpbmNsdWRpbmcgc29tZQorICAgIG51bGwgdHJhbnNpdGlvbnMuCisKK1dlIHVzZSBvbmUgYnl0ZSBwZXIgbm9kZSB0byBzdG9yZSBmb3VyIGJpdHMgb2Ygbm9kZSB0eXBlIGFzIHdlbGwgYXMgZm91cgorYml0cyBvZiBwYXlsb2FkIGluZm9ybWF0aW9uLgorCitJbiBhIHdlbGwtYmFsYW5jZWQgYW5kIHBvcHVsYXRlZCB0cmllIHRoZSBub2RlcyB3aGVyZSBsb29rdXAgc3BlbmRzIG1vc3QKK3RpbWUgKHRoZSBub2RlcyBjbG9zZXN0IHRvIHRoZSByb290KSBhcmUgYERFTlNFYCBub2Rlcywgd2hlcmUgZmluZGluZyB0aGUKK3RhcmdldCBmb3IgdGhlIHRyYW5zaXRpb24gaXMgYSBkaXJlY3QgY2FsY3VsYXRpb24gZnJvbSB0aGUgY29kZSBvZiB0aGUKK2NoYXJhY3Rlci4gT24gdGhlIG90aGVyIGhhbmQsIG1vc3Qgb2YgdGhlIG5vZGVzICh0aGUgb25lcyBjbG9zZXN0IHRvIHRoZQorbGVhdmVzKSBhcmUgYFBBWUxPQURfT05MWWAsIGBTSU5HTEVgIG9yIGBTUEFSU0VgIHRvIGF2b2lkIHRha2luZyBhbnkgbW9yZQorc3BhY2UgdGhhbiBuZWNlc3NhcnkuCisKK1RoZSBtYWluIG9iamVjdGl2ZSBmb3IgdGhlIHRyaWUgc3RvcmFnZSBmb3JtYXQgaXMgdG8gYWNoaWV2ZSB0aGUKK3NtYWxsZXN0IHBvc3NpYmxlIHBhY2tpbmcgKGFuZCB0aHVzIHNtYWxsZXN0IGNhY2hlIHVzYWdlIGFuZCBmZXdlc3QgZGlzaworcmVhZHMpLCB0aHVzIHdlIGNob29zZSB0aGUgdHlwZSB0aGF0IHJlc3VsdHMgaW4gdGhlIHNtYWxsZXN0CityZXByZXNlbnRhdGlvbiBvZiB0aGUgbm9kZS4gYERFTlNFYCB0eXBlIGdldHMgY2hvc2VuIG5hdHVyYWxseSB3aGVuIGl0cworZW5jb2RpbmcgKHdoaWNoIGF2b2lkcyBzdG9yaW5nIHRoZSBjaGFyYWN0ZXIgbGlzdCBidXQgbWF5IGluY2x1ZGUgbnVsbAordGFyZ2V0cykgaXMgc21hbGxlciB0aGFuIGBTUEFSU0VgLgorCisjIyBQb2ludGVyIFNpemVzCisKK1RoZSBuZXh0IG9wdGltaXphdGlvbiB3ZSBtYWtlIGluIHRoZSBzdG9yYWdlIGZvcm1hdCBpcyBiYXNlZCBvbiB0aGUgZmFjdAordGhhdCBtb3N0IG5vZGVzIGluIHRoZSB0cmllIGFyZSBpbiB0aGUgbG93ZXIgbGV2ZWxzIG9mIHRoZSB0cmVlIGFuZCB0aHVzCitjbG9zZSB0byBsZWF2ZXMuIEFzIHN1Y2gsIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBub2RlIGFuZCBpdHMgdGFyZ2V0Cit0cmFuc2l0aW9ucyB3aGVuIGxhaWQgb3V0IGR1cmluZyB0aGUgY29uc3RydWN0aW9uIHByb2Nlc3MgaXMgc21hbGwgYW5kCit0aHVzIGl0IGlzIGEgaHVnZSB3aW4gdG8gc3RvcmUgcG9pbnRlcnMgYXMgZGlzdGFuY2VzIHdpdGggdmFyaWFibGUgc2l6ZS4KKworVGhpcyBpcyBldmVuIG1vcmUgdHJ1ZSBmb3IgdGhlIHBhZ2UtYXdhcmUgbGF5b3V0IHdlIHVzZSAmbWRhc2g7IGFsbCBpbnRlcm5hbAordHJhbnNpdGlvbnMgd2l0aGluIHRoZSBwYWdlIChpLmUuID45OSUgb2YgYWxsIHRyYW5zaXRpb25zIGluIHRoZSB0cmllISkKK2NhbiBiZSBzdG9yZWQgdXNpbmcganVzdCBhbiBvZmZzZXQgd2l0aGluIHRoZSBwYWdlLCB1c2luZyBqdXN0IDEyIGJpdHMuCisKK1RoaXMgaXMgaGVhdmlseSB1c2VkIHZpYSBmdXJ0aGVyIHNwZWNpYWxpemF0aW9uIG9mIHRoZSBub2RlIHR5cGVzOiBlLmcuCit3ZSBoYXZlIGBERU5TRV8xMmAsIGBERU5TRV8xNmAgdG8gYERFTlNFXzQwYCBhcyB3ZWxsIGFzIGBERU5TRV9MT05HYAorc3VidHlwZXMgd2hpY2ggZGlmZmVyIGluIHRoZSBzaXplIG9mIHBvaW50ZXIgdGhleSB1c2UuCisKKyMgUHJpbWFyeSBpbmRleGluZyBpbiB0aGUgQlRJIGZvcm1hdAorCitUaGUgcHVycG9zZSBvZiB0aGUgcHJpbWFyeSBpbmRleCBvZiBhbiBzc3RhYmxlIGlzIHRvIGJlIGFibGUgdG8gbWFwIGEKK2tleSBjb250YWluaW5nIHBhcnRpdGlvbiBhbmQgY2x1c3RlcmluZyBjb21wb25lbnRzIHRvIGEgcG9zaXRpb24gaW4gdGhlCitzc3RhYmxlIGRhdGEgZmlsZSB3aGljaCBob2xkcyB0aGUgcmVsZXZhbnQgcm93IG9yIHRoZSBjbG9zZXN0IHJvdyB3aXRoIGEKK2dyZWF0ZXIga2V5IGFuZCBlbmFibGVzIGl0ZXJhdGlvbiBvZiByb3dzIGZyb20gdGhhdCBwb2ludCBvbi4KKworUGFydGl0aW9uIGtleXMgYXJlIG5vcm1hbGx5IGZ1bGx5IHNwZWNpZmllZCwgd2hpbGUgY2x1c3RlcmluZyBrZXlzIGFyZQorb2Z0ZW4gZ2l2ZW4gcGFydGlhbGx5IG9yIHZpYSBhIGNvbXBhcmlzb24gcmVsYXRpb24uIFRoZXkgYXJlIGFsc28KK3RyZWF0ZWQgZGlmZmVyZW50bHkgYnkgYWxsIHRoZSBpbmZyYXN0cnVjdHVyZSBhbmQgaGF2ZSBoaXN0b3JpY2FsbHkgaGFkCitkaWZmZXJlbnQgaW5kZXggc3RydWN0dXJlczsgd2UgY2hvc2UgdG8gcmV0YWluIHRoaXMgZGlzdGluY3Rpb24gZm9yIHRoZQordGltZSBiZWluZyBhbmQgaW1wbGVtZW50IHNpbWlsYXIgcmVwbGFjZW1lbnQgc3RydWN0dXJlcyB1c2luZyB0cmllcy4KKworIyMgUGFydGl0aW9uIGluZGV4IGltcGxlbWVudGF0aW9uIGRldGFpbHMKKworVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGUgcGFydGl0aW9uIGluZGV4IGlzIHRvIG1hcCBhIHNwZWNpZmllZAorcGFydGl0aW9uIGtleSB0byBhIHJvdyBpbmRleCBmb3IgdGhlIHBhcnRpdGlvbi4gSXQgYWxzbyBuZWVkcyB0byBzdXBwb3J0CitpdGVyYXRpb24gZnJvbSBhIChwb3NzaWJseSBwYXJ0aWFsbHkgc3BlY2lmaWVkKSBwYXJ0aXRpb24gcG9zaXRpb24uIFRoZQorZGVzY3JpcHRpb24gYmVsb3cgZGV0YWlscyBtYXBwaW5nIG9ubHk7IGl0ZXJhdGlvbiBpcyBhIHRyaXZpYWwKK2FwcGxpY2F0aW9uIG9mIHRoZSB0cmllIG1hY2hpbmVyeSB0byB0aGUgZGVzY3JpYmVkIHN0cnVjdHVyZS4KKworSW4gYWRkaXRpb24gdG8gd2lkZSBwYXJ0aXRpb25zIHdoZXJlIGEgcm93IGluZGV4IGlzIG1hbmRhdG9yeSwgQ2Fzc2FuZHJhCitpcyBvZnRlbiB1c2VkIGZvciB0YWJsZXMgd2hlcmUgdGhlIHBhcnRpdGlvbnMgaGF2ZSBvbmx5IGEKK2NvdXBsZSBvZiByb3dzLCBpbmNsdWRpbmcgYWxzbyBvbmVzIHdoZXJlIHRoZSBwYXJ0aXRpb24ga2V5IGlzIHRoZSBvbmx5Citjb21wb25lbnQgb2YgdGhlIHByaW1hcnkga2V5LCBpLmUuIHdoZXJlIHJvdyBhbmQgcGFydGl0aW9uIGFyZSB0aGUgc2FtZQordGhpbmcuIEZvciB0aGVzZSBzaXR1YXRpb25zIGl0IG1ha2VzIG5vIHNlbnNlIHRvIGFjdHVhbGx5IGhhdmUgYSByb3cKK2luZGV4IGFuZCB0aGUgcGFydGl0aW9uIGluZGV4IHNob3VsZCBwb2ludCBkaXJlY3RseSB0byB0aGUgZGF0YS4KKworVGhlIGFwcGxpY2F0aW9uIG9mIHRyaWVzIHRvIENhc3NhbmRyYSdzIHBhcnRpdGlvbiBpbmRleCB1c2VzIHRoZSB0cmllCitpbmZyYXN0cnVjdHVyZSBkZXNjcmliZWQgYWJvdmUgdG8gY3JlYXRlIGEgdHJpZSBtYXBwaW5nIHVuaXF1ZQorYnl0ZS1vcmRlcmVkIHBhcnRpdGlvbiBrZXkgcHJlZml4ZXMgdG8gZWl0aGVyOgorCistICAgQSBwb3NpdGlvbiBpbiB0aGUgcm93IGluZGV4IGZpbGUgd2hpY2ggY29udGFpbnMgdGhlIGluZGV4IG9mIHRoZQorICAgIHJvd3Mgd2l0aGluIHRoYXQgcGFydGl0aW9uLCBvcgorCistICAgQSBwb3NpdGlvbiBpbiB0aGUgZGF0YSBmaWxlIGNvbnRhaW5pbmcgdGhlIHJlbGV2YW50IHBhcnRpdGlvbiAoaWYgYQorICAgIHJvdyBpbmRleCBmb3IgaXQgaXMgbm90IG5lY2Vzc2FyeSkuCisKK0Egc2luZ2xlIHRhYmxlIGNhbiBoYXZlIGJvdGggaW5kZXhlZCBhbmQgbm9uLWluZGV4ZWQgcm93cy4gRm9yCitlZmZpY2llbmN5IHRoZSBwYXJ0aXRpb24gaW5kZXggc3RvcmVzIHRoZSBwb3NpdGlvbiBhcyBhIHNpbmdsZSBsb25nLAordXNpbmcgaXRzIHNpZ24gYml0IHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgdHdvIG9wdGlvbnNbXjNdLiBUaGlzCit2YWx1ZSBpcyBzdG9yZWQgd2l0aCB2YXJpYWJsZSBsZW5ndGggJm1kYXNoOyBtb3JlIHByZWNpc2VseSwgd2UgdXNlIHRoZSBmb3VyCitiaXRzIHByb3ZpZGVkIGluIHRoZSBub2RlIHR5cGUgYnl0ZSB0byBzdG9yZSB0aGUgbGVuZ3RoIG9mIHRoZSBwb2ludGVyLgorCitbXjNdOiBJdCBuZWVkcyB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gMCB3aXRoIGluZGV4IGFuZCAwIHdpdGhvdXQKK2luZGV4LCBob3dldmVyLCBzbyB3ZSB1c2UgfnBvcyBpbnN0ZWFkIG9mIC1wb3MgdG8gZW5jb2RlCitkaXJlY3QtdG8tZGF0YSBtYXBwaW5ncy4gVGhpcyBzdGlsbCBhbGxvd3Mgc2lnbiBleHBhbnNpb24KK2luc3RydWN0aW9ucyB0byBiZSB1c2VkIHRvIGNvbnZlcnQgZS5nLiBgaW50YCB0byBgbG9uZ2AuCisKK0xvb2t1cCBpbiB0aGlzIGluZGV4IGlzIGFjY29tcGxpc2hlZCBieSBjb252ZXJ0aW5nIHRoZSBkZWNvcmF0ZWQKK3BhcnRpdGlvbiBrZXkgdG8gaXRzIGJ5dGUtb3JkZXJlZCByZXByZXNlbnRhdGlvbiBhbmQgZm9sbG93aW5nIHRoZQordHJhbnNpdGlvbnMgZm9yIGl0cyBieXRlcyB3aGlsZSB0aGUgdHJpZSBoYXMgYW55LiBJZiBhdCBhbnkgcG9pbnQgdGhlCit0cmllIGRvZXMgbm90IG9mZmVyIGEgdHJhbnNpdGlvbiBmb3IgdGhlIG5leHQgYnl0ZSBidXQgaXMgbm90IGEgbGVhZgorbm9kZSwgdGhlIHNzdGFibGUgZG9lcyBub3QgY29udGFpbiBhIG1hcHBpbmcgZm9yIHRoZSBnaXZlbiBrZXkuCisKK0lmIGEgbGVhZiBvZiB0aGUgdHJpZSBpcyByZWFjaGVkLCB0aGVuIHRoZSBwcmVmaXggb2YgdGhlIHBhcnRpdGlvbiBrZXkKK21hdGNoZXMgc29tZSBjb250ZW50IGluIHRoZSBmaWxlLCBidXQgd2UgYXJlIG5vdCB5ZXQgc3VyZSBpZiBpdCBpcyBhCitmdWxsIG1hdGNoIGZvciB0aGUgcGFydGl0aW9uIGtleS4gVGhlIGxlYWYgbm9kZSBwb2ludHMgdG8gYSBwbGFjZSBpbiB0aGUKK3JvdyBpbmRleCBvciBkYXRhIGZpbGUuIEluIGVpdGhlciBjYXNlIHRoZSBmaXJzdCBieXRlcyBhdCB0aGUgc3BlY2lmaWVkCitwb3NpdGlvbiBjb250YWluIGEgc2VyaWFsaXphdGlvbiBvZiB0aGUgcGFydGl0aW9uIGtleSwgd2hpY2ggd2UgY2FuCitjb21wYXJlIHRvIHRoZSBrZXkgYmVpbmcgbWFwcGVkLiBJZiBpdCBtYXRjaGVzLCB3ZSBoYXZlIGZvdW5kIHRoZQorcGFydGl0aW9uLiBJZiBub3QsIHNpbmNlIHRoZSBzdG9yZWQgcHJlZml4ZXMgYXJlIHVuaXF1ZSwgbm8gZGF0YSBmb3IKK3RoaXMgcGFydGl0aW9uIGV4aXN0cyBpbiB0aGlzIHNzdGFibGUuCisKKyMjIyBFZmZpY2llbmN5CisKK0lmIGV2ZXJ5dGhpbmcgaXMgaW4gY2FjaGUgdGhpcyBsb29rdXAgaXMgZXh0cmVtZWx5IGVmZmljaWVudDogaXQgZm9sbG93cworYSBmZXcgdHJhbnNpdGlvbnMgaW4gYERFTlNFYCBub2RlcyBwbHVzIG9uZSBvciB0d28gYmluYXJ5IHNlYXJjaGVzIGluCitgU1BBUlNFYCBvciBgU0lOR0xFYCwgYW5kIGZpbmlzaGVzIHdpdGggYSBkaXJlY3QgY29tcGFyaXNvbiBvZiBhIGJ5dGUgYnVmZmVyCit3aXRoIGNvbnRlbnRzIG9mIGEgZmlsZS4gTm8gb2JqZWN0IGFsbG9jYXRpb24gb3IgZGVzZXJpYWxpemF0aW9uIGlzCituZWNlc3NhcnkuCisKK0lmIG5vdCBhbGwgZGF0YSBpcyBpbiBjYWNoZSwgdGhlIHBlcmZvcm1hbmNlIG9mIHRoaXMgbG9va3VwIG1vc3QgaGVhdmlseQorZGVwZW5kcyBvbiB0aGUgbnVtYmVyIG9mIHBhZ2VzIHRoYXQgbXVzdCBiZSBmZXRjaGVkIGZyb20gcGVyc2lzdGVudAorc3RvcmFnZS4gVGhlIGV4cGVjdGF0aW9uIG9uIHdoaWNoIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQsIGlzIHRoYXQKK2lmIGFuIHNzdGFibGUgaXMgaW4gdXNlIGFsbCBub24tbGVhZiBwYWdlcyBvZiB0aGUgaW5kZXggd2lsbCB0ZW5kIHRvCityZW1haW4gY2FjaGVkLiBJZiB0aGF0IGV4cGVjdGF0aW9uIGlzIG1ldCwgbG9va3VwIHdpbGwgb25seSByZXF1aXJlCitmZXRjaGluZyBvbmUgbGVhZiBpbmRleCBwYWdlIGFuZCBvbmUgZGF0YS9yb3cgaW5kZXggcGFnZSBmb3IgdGhlIGZ1bGwKK2tleSBjb21wYXJpc29uLiBPbiBhIG1hdGNoIHRoZSBsYXR0ZXIgZmV0Y2ggd2lsbCBiZSByZXF1aXJlZCBhbnl3YXksCitzaW5jZSB3ZSB3b3VsZCB3YW50IHRvIHJlYWQgdGhlIGRhdGEgYXQgdGhhdCBwb3NpdGlvbi4KKworQW4gaW1wb3J0YW50IGNvbnNpZGVyYXRpb24gaW4gdGhlIGRlc2lnbiBvZiB0aGlzIGZlYXR1cmUgd2FzIHRvIG1ha2UKK3N1cmUgdGhlcmUgaXMgbm8gc2l0dWF0aW9uIGluIHdoaWNoIHRoZSB0cmllIGluZGljZXMgcGVyZm9ybSB3b3JzZSB0aGFuCit0aGUgZWFybGllciBjb2RlLCB0aHVzIHdlIHNob3VsZCBhaW0gdG8gZG8gYXQgbW9zdCBhcyBtYW55IHJlYWRzLiBUaGUKK251bWJlciBvZiByYW5kb20gYWNjZXNzZXMgZm9yIHRoZSBlYXJsaWVyIGluZGV4IGltcGxlbWVudGF0aW9uIHdoZXJlIGFuCitpbmRleCBzdW1tYXJ5IGlzIGZvcmNlZCBpbiBtZW1vcnkgaXMgb25lIF9zZWVrXyByZXF1aXJlZCB0byBzdGFydAorcmVhZGluZyBmcm9tIHRoZSBwYXJ0aXRpb24gaW5kZXggKHRob3VnaCB1c3VhbGx5IG11bHRpcGxlIGNvbnNlY3V0aXZlCitwYWdlcyBuZWVkIHRvIGJlIHJlYWQpLCBhbmQgb25lIHNlZWsgbmVlZGVkIHRvIHN0YXJ0IHJlYWRpbmcgdGhlIGFjdHVhbAorZGF0YS4gU2luY2UgdGhlIGluZGV4IHN1bW1hcnkgZW5kcyB1cCBiZWluZyBvZiBzaW1pbGFyIHNpemUgdG8gdGhlCitub24tbGVhZiBwYWdlcyBvZiB0aGUgdHJpZSBpbmRleCwgdGhlIG1lbW9yeSB1c2FnZSBhbmQgbnVtYmVyIG9mIHNlZWtzCitmb3IgdGhlIHRyaWUgaW5kZXggb24gbWF0Y2ggZW5kcyB1cCBiZWluZyB0aGUgc2FtZSBidXQgd2UgcmVhZCBsZXNzIGRhdGEKK2FuZCBkbyBtdWNoIGxlc3MgcHJvY2Vzc2luZy4KKworT24gbWlzbWF0Y2gsIHRob3VnaCwgd2UgbWF5IGJlIG1ha2luZyBvbmUgYWRkaXRpb25hbCBzZWVrLiBIb3dldmVyLCB3ZQorY2FuIGRyYXN0aWNhbGx5IHJlZHVjZSB0aGUgY2hhbmNlIG9mIG1pc21hdGNoLCB3aGljaCB3ZSBjdXJyZW50bHkgZG8gaW4KK3R3byB3YXlzOgorCistICAgQnkgdXNpbmcgYSBibG9vbSBmaWx0ZXIgYmVmb3JlIGxvb2t1cC4gVGhlIGNoYW5jZSBvZiBnZXR0aW5nIGEgYmxvb20KKyAgICBmaWx0ZXIgaGl0IGFzIHdlbGwgYXMgYSBwcmVmaXggbWF0Y2ggZm9yIHRoZSB3cm9uZyBrZXkgaXMgcHJldHR5CisgICAgbG93IGFuZCBnZXRzIGxvd2VyIHdpdGggaW5jcmVhc2luZyBzc3RhYmxlIHNpemUuCisKKy0gICBCeSBzdG9yaW5nIHNvbWUgb2YgdGhlIGtleSBoYXNoIGJpdHMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIHRva2VuCisgICAgYXQgdGhlIHBheWxvYWQgbm9kZSBhbmQgY29tcGFyaW5nIHRoZW0gd2l0aCB0aGUgbWFwcGVkIGtleSdzIGhhc2gKKyAgICBiaXRzLgorCitDdXJyZW50bHkgd2UgdXNlIGEgY29tYmluYXRpb24gb2YgYm90aCBieSBkZWZhdWx0IGFzIHRoZSBiZXN0IHBlcmZvcm1pbmcKK29wdGlvbi4gVGhlIHVzZXIgY2FuIGRpc2FibGUgb3IgY2hvb3NlIHRvIGhhdmUgYSBzbWFsbGVyIGJsb29tIGZpbHRlciwKK2FuZCB0aGUgY29kZSBhbHNvIHN1cHBvcnRzIGluZGljZXMgdGhhdCBkbyBub3QgY29udGFpbiBoYXNoIGJpdHMgKHRob3VnaAordG8gcmVkdWNlIGNvbmZpZ3VyYXRpb24gY29tcGxleGl0eSB3ZSBkbyBub3QgaGF2ZSBwbGFucyB0byBleHBvc2UgdGhhdAorb3B0aW9uKS4KKworRm9yIGZ1bGx5IGNvbGQgc3N0YWJsZXMgd2UgaGF2ZSB0byBwZXJmb3JtIG1vcmUgcmFuZG9tIGZldGNoZXMgZnJvbSBkaXNrCit0aGFuIHRoZSBlYXJsaWVyIGltcGxlbWVudGF0aW9uLCBidXQgd2UgcmVhZCBsZXNzLiBUZXN0aW5nIHNob3dlZCB0aGF0CitoYXZpbmcgYSBibG9vbSBmaWx0ZXIgaXMgZW5vdWdoIHRvIG1ha2UgdGhlIHRyaWUgaW5kZXggZmFzdGVyOyBpZiBhCitibG9vbSBmaWx0ZXIgaXMgbm90IHByZXNlbnQsIHdlIHRyeSBnb2luZyB0aHJvdWdoIHRoZSBieXRlIGNvbnRlbnRzIG9mCit0aGUgaW5kZXggZmlsZSBvbiBib290IHRvIHByZWZldGNoIGl0IHdoaWNoIGVuZHMgdXAgdGFraW5nIG5vdCB0b28gbG9uZworKHNpbmNlIGl0IGlzIHJlYWQgc2VxdWVudGlhbGx5IHJhdGhlciB0aGFuIHJhbmRvbWx5KSBhbmQgYm9vc3RpbmcgY29sZAorcGVyZm9ybWFuY2UgZHJhbWF0aWNhbGx5LgorCisjIyMgQnVpbGRpbmcgYW5kIGVhcmx5IG9wZW4KKworVGhlIHBhcnRpdGlvbiBpbmRleCBpcyBidWlsdCB1c2luZyB0aGUgcGFnZS1hd2FyZSBpbmNyZW1lbnRhbAorY29uc3RydWN0aW9uIGRlc2NyaWJlZCBlYXJsaWVyLCB3aGVyZSB3ZSBhbHNvIGRlbGF5IHdyaXRpbmcgZWFjaCBrZXkKK3VudGlsIHdlIGhhdmUgc2VlbiB0aGUgbmV4dCBzbyB0aGF0IHdlIGNhbiBmaW5kIHRoZSBzaG9ydGVzdCBwcmVmaXggdGhhdAoraXMgZW5vdWdoIHRvIGRpZmZlcmVudGlhdGUgaXQgZnJvbSB0aGUgcHJldmlvdXMgYW5kIG5leHQga2V5cyAodGhpcyBhbHNvCitkaWZmZXJlbnRpYXRlcyBpdCBmcm9tIGFsbCBvdGhlcnMgaW4gdGhlIHNzdGFibGUgYmVjYXVzZSB0aGUgY29udGVudHMKK2FyZSBzb3J0ZWQpLiBPbmx5IHRoYXQgcHJlZml4IGlzIHdyaXR0ZW4gdG8gdGhlIHRyaWUuCisKK09uZSBsYXN0IGNvbXBsaWNhdGlvbiBpcyB0aGUgc3VwcG9ydCBmb3IgZWFybHkgb3BlbmluZyBvZiBzc3RhYmxlcyB3aGljaAorYWxsb3dzIG5ld2x5LWNvbXBhY3RlZCB0YWJsZXMgdG8gZ3JhZHVhbGx5IG9jY3VweSB0aGUgcGFnZSBjYWNoZS4gVGhvdWdoCit0aGUgaW5kZXggYnVpbGRpbmcgaXMgaW5jcmVtZW50YWwsIHRoZSBwYXJ0aWFsbHktd3JpdHRlbiB0cmllIGlzIG5vdAordXNhYmxlIGRpcmVjdGx5IGJlY2F1c2UgdGhlIHJvb3Qgb2YgdGhlIHRyaWUgYXMgd2VsbCBhcyB0aGUgcGF0aCBmcm9tIGl0Cit0byB0aGUgbGFzdCB3cml0dGVuIG5vZGVzIGlzIG5vdCB5ZXQgcHJlc2VudCBpbiB0aGUgZmlsZS4KKworVGhpcyBwcm9ibGVtIGNhbiBiZSBlYXNpbHkgb3ZlcmNvbWUsIHRob3VnaCwgYnkgZHVtcGluZyB0aGVzZQoraW50ZXJtZWRpYXRlIG5vZGVzIHRvIGFuIGluLW1lbW9yeSBidWZmZXIgKHdpdGhvdXQgdGhlIG5lZWQgZm9yCitwYWdlLWF3YXJlIHBhY2tpbmcpIGFuZCBmb3JtaW5nIGFuIGluZGV4IGJ5IGF0dGFjaGluZyB0aGlzIGJ1ZmZlciBhdCB0aGUKK2VuZCBvZiB0aGUgcGFydGlhbGx5IHdyaXR0ZW4gZmlsZSB1c2luZyAKK1tgVGFpbE92ZXJyaWRpbmdSZWJ1ZmZlcmVyYF0oLi4vLi4vLi4vdXRpbC9UYWlsT3ZlcnJpZGluZ1JlYnVmZmVyZXIuamF2YSkuCisKKyMjIFJvdyBpbmRleCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisKK1VubGlrZSB0aGUgcGFydGl0aW9uIGluZGV4LCB0aGUgbWFpbiB1c2Ugb2YgdGhlIHJvdyBpbmRleCBpcyB0byBpdGVyYXRlCitmcm9tIGEgZ2l2ZW4gY2x1c3RlcmluZyBrZXkgaW4gZm9yd2FyZCBvciByZXZlcnNlIGRpcmVjdGlvbiAod2hlcmUgZXhhY3QKK2tleSBsb29rdXAgaXMganVzdCBhIHNwZWNpYWwgY2FzZSkuCisKK1Jvd3MgYXJlIG9mdGVuIHZlcnkgc21hbGwgKHRoZXkgY291bGQgY29udGFpbiBhIHNpbmdsZSBpbnQgb3Igbm8gY29sdW1ucworYXQgYWxsKSBhbmQgdGh1cyB0aGVyZSBpcyBhIHJlYWwgcG9zc2liaWxpdHkgZm9yIHRoZSByb3cgaW5kaWNlcyB0bworYmVjb21lIGJpZ2dlciB0aGFuIHRoZSBkYXRhIHRoZXkgcmVwcmVzZW50LiBUaGlzIGlzIG5vdCBhIGRlc2lyYWJsZQorb3V0Y29tZSwgd2hpY2ggaXMgcGFydCBvZiB0aGUgcmVhc29uIHdoeSBDYXNzYW5kcmEncyByb3cgaW5kZXggaGFzCitoaXN0b3JpY2FsbHkgb3BlcmF0ZWQgb24gYmxvY2tzIG9mIHJvd3MgcmF0aGVyIHRoYW4gaW5kZXhpbmcgZXZlcnkgcm93CitpbiB0aGUgcGFydGl0aW9uLiBUaGlzIGlzIGEgY29uY2VybiB3ZSBhbHNvIGhhdmUgd2l0aCB0aGUgdHJpZS1iYXNlZAoraW5kZXgsIHRodXMgd2UgYWxzbyBpbmRleCBibG9ja3Mgb2Ygcm93cyAoYnkgZGVmYXVsdCwgYSBibG9jayBvZiByb3dzCit0aGF0IGlzIGF0IGxlYXN0IDE2a2IgaW4gc2l6ZSAmbWRhc2g7IHRoaXMgd2lsbCBiZSBjYWxsZWQgdGhlIGluZGV4CitfZ3JhbnVsYXJpdHlfIGJlbG93LCBzcGVjaWZpZWQgYnkgdGhlIGBjb2x1bW5faW5kZXhfc2l6ZWAKK2BjYXNzYW5kcmEueWFtbGAgcGFyYW1ldGVyKS4KKworT3VyIHJvdyBpbmRleCBpbXBsZW1lbnRhdGlvbiB0aHVzIGNyZWF0ZXMgYSBtYXAgZnJvbSBjbHVzdGVyaW5nIGtleXMgb3IKK3ByZWZpeGVzIHRvIHRoZSBkYXRhIHBvc2l0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5kZXggYmxvY2sgd2hpY2ggaXMKK3RoZSBlYXJsaWVzdCB0aGF0IGNvdWxkIGNvbnRhaW4gYSBrZXkgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbgorb25lLiBBZGRpdGlvbmFsbHksIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBkZWxldGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mCit0aGUgYmxvY2ssIHRoZSBpbmRleCBtdXN0IHNwZWNpZnkgaXQgc28gdGhhdCBpdCBjYW4gYmUgdGFrZW4gaW50bworYWNjb3VudCB3aGVuIG1lcmdpbmcgZGF0YSBmcm9tIG11bHRpcGxlIHNzdGFibGVzLgorCitFYWNoIGluZGV4IGJsb2NrIHdpbGwgY29udGFpbiBhdCBsZWFzdCBvbmUga2V5LCBidXQgZ2VuZXJhbGx5IGl0IHdpbGwKK2hhdmUgZGlmZmVyZW50IGZpcnN0IGFuZCBsYXN0IGtleXMuIFdlIGRvbid0IHN0b3JlIHRoZXNlIGtleXMsIGJ1dAoraW5zdGVhZCB3ZSBpbmRleCB0aGUgcG9zaXRpb25zIGJldHdlZW4gYmxvY2tzIGJ5IHN0b3JpbmcgYSAic2VwYXJhdG9yIiwKK3NvbWUga2V5IHRoYXQgaXMgZ3JlYXRlciB0aGFuIHRoZSBsYXN0IGtleSBvZiB0aGUgcHJldmlvdXMgYmxvY2sgYW5kCitzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGZpcnN0IGtleSBvZiB0aGUgbmV4dFteNF0uIFRoZW4sIHdoZW4gd2UKK2xvb2sgdXAgYSBnaXZlbiBjbHVzdGVyaW5nLCB3ZSBmb2xsb3cgaXRzIGJ5dGVzIGFzIGxvbmcgYXMgd2UgY2FuIGluIHRoZQordHJpZSBhbmQgd2UgY2FuIGJlIGNlcnRhaW4gdGhhdCBhbGwgYmxvY2tzIGJlZm9yZSB0aGUgY2xvc2VzdAorbGVzcy10aGFuLW9yLWVxdWFsIGVudHJ5IGluIHRoZSB0cmllIGNhbm5vdCBjb250YWluIGFueSBkYXRhIHRoYXQgaXMKK2dyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4ga2V5LgorCitbXjRdOiBBbm90aGVyIHdheSB0byBpbnRlcnByZXQgdGhpcyBpcyB0aGF0IHdlIGluZGV4IHRoZSBzdGFydCBvZiBlYWNoCitibG9jayBvbmx5LCBidXQgZm9yIGVmZmljaWVuY3kgd2UgZG9uJ3QgdXNlIHRoZSBmaXJzdCBrZXkgb2YgdGhlCitibG9jayBhcyBpdHMgYmVnaW5uaW5nLCBidXQgaW5zdGVhZCBzb21ldGhpbmcgY2xvc2VyIHRvIHRoZSBsYXN0IGtleQorb2YgdGhlIHByZXZpb3VzIGJsb2NrIChidXQgc3RpbGwgZ3JlYXRlciB0aGFuIGl0KS4KKworSXQgbWF5IGhhcHBlbiB0aGF0IHRoZSBpZGVudGlmaWVkIGJsb2NrIGFjdHVhbGx5IGRvZXNuJ3QgY29udGFpbiBhbnkKK21hdGNoaW5nIGRhdGEgKGUuZy4gYmVjYXVzZSB0aGUgbG9va2VkLXVwIGtleSBlbmRzIHVwIGJldHdlZW4gdGhlIGxhc3QKK2tleSBpbiB0aGUgYmxvY2sgYW5kIHRoZSBzZXBhcmF0b3IpLCBidXQgdGhpcyBvbmx5IGFmZmVjdHMgZWZmaWNpZW5jeSBhcwordGhlIGl0ZXJhdGlvbiBtZWNoYW5pc20gZG9lcyBub3QgZXhwZWN0IHRoZSBkYXRhIHBvc2l0aW9uIHJldHVybmVkIGJ5Cit0aGUgaW5kZXggdG8gYmUgZ3VhcmFudGVlZCB0byBzdGFydCB3aXRoIGVsZW1lbnRzIHRoYXQgZml0IHRoZSBjcml0ZXJpYTsKK2l0IHdvdWxkIG9ubHkgaGF2ZSB0byB3YWxrIGEgd2hvbGUgYmxvY2sgZm9yd2FyZCB0byBmaW5kIHRoZSBtYXRjaGluZwora2V5LgorCitJdCBpcyBpbXBvcnRhbnQgdG8ga2VlcCB0aGUgbnVtYmVyIG9mIHRoZXNlIGZhbHNlIHBvc2l0aXZlcyBsb3csIGFuZCBhdAordGhlIHNhbWUgdGltZSB3ZSBhaW0gZm9yIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBzaXplIG9mIHRoZSBpbmRleCBmb3IgYQorZ2l2ZW4gZ3JhbnVsYXJpdHkuIFRoZSBjaG9pY2Ugb2Ygc2VwYXJhdG9yIGFmZmVjdHMgdGhpcyBiYWxhbmNlW141XTsgdGhlCitvcHRpb24gd2UgdXNlLCBhcyBhIGdvb2QgdHJhZGVvZmYgaW4gdGhlIHZlaW4gb2YgdGhlIHVuaXF1ZSBwcmVmaXgKK2FwcHJvYWNoIHVzZWQgaW4gdGhlIHBhcnRpdGlvbiBpbmRleCwgaXMgdG8gdXNlIHRoZSBzaG9ydGVzdCBwcmVmaXggb2YKK3RoZSBuZXh0IGJsb2NrJ3MgYmVnaW5uaW5nIGtleSB0aGF0IHNlcGFyYXRlcyBpdCBmcm9tIHRoZSBwcmV2aW91cworYmxvY2sncyBlbmQga2V5LCBhZGp1c3RlZCBzbyB0aGF0IHRoZSBsYXN0IGJ5dGUgb2YgaXQgaXMgMSBncmVhdGVyIHRoYW4KK3RoYXQgZW5kIGtleS4KKworW141XTogRm9yIGV4YW1wbGUsIHRoZSBiZXN0IHNlcGFyYXRvciBmb3IgZmFsc2UgcG9zaXRpdmVzIGlzIHRoZSBuZXh0Citwb3NzaWJsZSBieXRlIHNlcXVlbmNlIGFmdGVyIHRoZSBwcmV2aW91cyBibG9jaydzIGZpbmFsIGtleSwgd2hpY2gKK2lzIG9idGFpbmVkIGJ5IGFkZGluZyBhIDAwIGJ5dGUgdG8gaXRzIGVuZC4gVGhpcywgaG93ZXZlciwgbWVhbnMgYWxsCit0aGUgYnl0ZXMgb2YgdGhlIGJ5dGUtb3JkZXJlZCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGtleSBtdXN0IGJlCitwcmVzZW50IGluIHRoZSBpbmRleCwgd2hpY2ggaW5mbGF0ZXMgdGhlIGluZGV4J3Mgc2l6ZSBhbmQgbG9va3VwCitjb21wbGV4aXR5LgorCitGb3IgZXhhbXBsZSwgaWYgYmxvY2sgMiBjb3ZlcnMgInNvbWV0aGluZyIgdG8gInNvbWV3aGVyZSIgYW5kIGJsb2NrIDMKKyZtZGFzaDsgInNvcnJ5IiB0byAidGVhc2UiLCB0aGVuIHRoZSBzZXF1ZW5jZSAic29uIiBpcyB1c2VkIGFzIHRoZSBzZXBhcmF0b3IKK2JldHdlZW4gYmxvY2tzIDIgYW5kIDMuIFRoaXMgbGVhdmVzIHRoaW5ncyBsaWtlICJzb21tZWxpZXIiIGluIHRoZSBhcmVhCit0aGF0IHRyaWdnZXJzIGZhbHNlIHBvc2l0aXZlcywgYnV0IHN0b3JlcyBhbmQgaGFzIHRvIHdhbGsganVzdCB0aHJlZQorYnl0ZXMgdG8gZmluZCB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGl0ZXJhdGlvbi4KKworIyMjIEVmZmljaWVuY3kKKworRmluZGluZyB0aGUgY2FuZGlkYXRlIGJsb2NrIGluIHRoZSB0cmllIGludm9sdmVzIHdhbGtpbmcgdGhlIGJ5dGUKK29yZGVyZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsdXN0ZXJpbmcga2V5IGluIHRoZSB0cmllIGFuZCBmaW5kaW5nIHRoZQorY2xvc2VzdCBsZXNzLXRoYW4tb3ItZXF1YWwgdmFsdWUuIFRoZSBudW1iZXIgb2Ygc3RlcHMgaXMgcHJvcG9ydGlvbmFsIHRvCit0aGUgbGVuZ3RoIG9mIHRoZSBzZXBhcmF0b3JzICZtZGFzaDsgdGhlIGxvd2VyIHRoZWlyIG51bWJlciB0aGUgc2hvcnRlciB0aGF0CitzZXF1ZW5jZSBpcywgdGhvdWdoIHdlIGNhbid0IGV4cGVjdCBfT18obG9nIF9uXykgY29tcGxleGl0eSBzaW5jZSB0aGVyZSBtYXkKK2JlIG1hbnkgaXRlbXMgc2hhcmluZyB0aGUgc2FtZSBsb25nIHByZWZpeGVzIChlLmcuIGlmIHRoZXJlIGFyZSBsb25nCitzdHJpbmdzIGluIHRoZSBjb21wb25lbnRzIG9mIHRoZSBjbHVzdGVyaW5nIGtleXMgYmVmb3JlIHRoZSBsYXN0KS4gRXZlbgorc28sIHN1Y2ggcmVwZWF0aW5nIHByZWZpeGVzIGFyZSBhZGRyZXNzZWQgdmVyeSB3ZWxsIGJ5IHRoZSBwYWdlLXBhY2tpbmcKK2FuZCBgU0lOR0xFX05PUEFZTE9BRF80YCBub2RlIHR5cGUsIHJlc3VsdGluZyBpbiB2ZXJ5IGVmZmljaWVudCB3YWxrcy4KKworQWZ0ZXIgdGhpcyBzdGVwIHdlIGFsc28gcGVyZm9ybSBhIGxpbmVhciB3YWxrIHdpdGhpbiB0aGUgZGF0YSBmaWxlIHRvCitmaW5kIHRoZSBhY3R1YWwgc3RhcnQgb2YgdGhlIG1hdGNoaW5nIGRhdGEuIFRoaXMgaXMgdXN1YWxseSBjb3N0bGllciBhbmQKK21heSBpbnZvbHZlIG9iamVjdCBhbGxvY2F0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24uCisKK1RoZSB0cmFkZW9mZiBiZXR3ZWVuIHRoZSBzaXplIG9mIHRoZSBpbmRleCBhbmQgdGhlIHRpbWUgaXQgdGFrZXMgdG8gZmluZAordGhlIHJlbGV2YW50IHJvd3MgaXMgY29udHJvbGxlZCBieSB0aGUgaW5kZXggZ3JhbnVsYXJpdHkuIFRoZSBsb3dlciBpdAoraXMsIHRoZSBtb3JlIGVmZmljaWVudCBsb29rdXAgKGVzcGVjaWFsbHkgZXhhY3QgbWF0Y2ggbG9va3VwKSBiZWNvbWVzIGF0Cit0aGUgZXhwZW5zZSBvZiBiaWdnZXIgaW5kZXggc2l6ZS4gVGhlIDE2a2IgZGVmYXVsdCBpcyBjaG9zZW4gcHJldHR5Citjb25zZXJ2YXRpdmVseVteNl07IGlmIHVzZXJzIGRvbid0IG1pbmQgYmlnZ2VyIGluZGljZXMgc29tZXRoaW5nIGxpa2UgNCwKKzIgb3IgMWtiIGdyYW51bGFyaXR5IHNob3VsZCBiZSBxdWl0ZSBhIGJpdCBtb3JlIGVmZmljaWVudC4gSXQgaXMgYWxzbworcG9zc2libGUgdG8gaW5kZXggZXZlcnkgcm93IGJ5IGNob29zaW5nIGEgZ3JhbnVsYXJpdHkgb2YgMGtiOyBhdCB0aGVzZQorc2V0dGluZ3MgaW4tY2FjaGUgdHJpZS1pbmRleGVkIHNzdGFibGVzIHRlbmQgdG8gb3V0cGVyZm9ybQorYENvbmN1cnJlbnRTa2lwTGlzdE1hcGAgbWVtdGFibGVzIGZvciByZWFkcy4KKworW142XTogVGhpcyB3YXMgY2hvc2VuIHdpdGggdGhlIGFpbSB0byBtYXRjaCB0aGUgc2l6ZSBvZiB0aGUgdHJpZSBpbmRleAorY29tcGFyZWQgdG8gdGhlIGVhcmxpZXIgdmVyc2lvbiBvZiB0aGUgcm93IGluZGV4IGF0IGl0cyBkZWZhdWx0CitncmFudWxhcml0eSBvZiA2NGtiLgorCisjIyMgUmV2ZXJzZSBsb29rdXAKKworVG8gcGVyZm9ybSBhIHJldmVyc2UgbG9va3VwLCB3ZSBjYW4gdXNlIHRoZSBzYW1lIG1lY2hhbmlzbSBhcyBhYm92ZQorKHdpdGggZ3JlYXRlci10aGFuLW9yLWVxdWFsKSB0byBmaW5kIHRoZSBpbml0aWFsIGJsb2NrIGZvciB0aGUKK2l0ZXJhdGlvbi4gSG93ZXZlciwgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uIHdlIGNvdWxkIHNpbXBseSB3YWxrIHRoZQorZGF0YSBmaWxlIHRvIGZpbmQgdGhlIG5leHQgcm93cywgYnV0IHRoaXMgaXNuJ3QgcG9zc2libGUgZ29pbmcKK2JhY2t3YXJkcy4KKworVG8gc29sdmUgdGhpcyBwcm9ibGVtIHRoZSBpbmRleCBoZWxwcyB0aGUgaXRlcmF0aW9uIG1hY2hpbmVyeSBieQorcHJvdmlkaW5nIGFuIGl0ZXJhdG9yIG9mIGluZGV4IGJsb2NrcyBpbiByZXZlcnNlIG9yZGVyLiBGb3IgZWFjaCBpbmRleAorYmxvY2sgdGhlIGl0ZXJhdGlvbiB3YWxrcyBpdCBmb3J3YXJkIGFuZCBjcmVhdGVzIGEgc3RhY2sgb2YgYWxsIGl0cyByb3cKK3Bvc2l0aW9ucywgdGhlbiBzdGFydHMgaXNzdWluZyByb3dzIGJ5IHBvcHBpbmcgYW5kIGV4YW1pbmluZyByb3dzIGZyb20KK3RoYXQgc3RhY2suIFdoZW4gdGhlIHN0YWNrIGlzIGV4aGF1c3RlZCBpdCByZXF1ZXN0cyB0aGUgcHJldmlvdXMgYmxvY2sKK2Zyb20gdGhlIGluZGV4IGFuZCBhcHBsaWVzIHRoZSBzYW1lIHByb2NlZHVyZSB0aGVyZS4KKworIyBDb2RlIHN0cnVjdHVyZQorCitUaGUgaW1wbGVtZW50YXRpb24gaXMgbW9zdGx5IGluIHR3byBwYWNrYWdlcywgYG8uYS5jLmlvLnRyaWVzYCBjb250YWlucwordGhlIGdlbmVyaWMgY29kZSB0byBjb25zdHJ1Y3QgYW5kIHJlYWQgb24tZGlzayB0cmllcywgYW5kIAorYG8uYS5jLmlvLnNzdGFibGUuZm9ybWF0LmJ0aWAsIHdoaWNoIGltcGxlbWVudHMgdGhlIHNwZWNpZmljcyBvZiB0aGUKK2Zvcm1hdCBhbmQgdGhlIHR3byBpbmRleGVzLgorCisjIyBCdWlsZGluZyB0cmllcworCitUcmllcyBhcmUgYnVpbHQgZnJvbSBzb3J0ZWQga2V5cyB1c2luZyBhbiBbYEluY3JlbWVudGFsVHJpZVdyaXRlcmBdKC4uLy4uLy4uL3RyaWVzL0luY3JlbWVudGFsVHJpZVdyaXRlci5qYXZhKS4gCitUaGUgY29kZSBjb250YWlucyB0aHJlZSBpbXBsZW1lbnRhdGlvbnMgd2l0aCBpbmNyZWFzaW5nIGNvbXBsZXhpdHk6CistIFtgSW5jcmVtZW50YWxUcmllV3JpdGVyU2ltcGxlYF0oLi4vLi4vLi4vdHJpZXMvSW5jcmVtZW50YWxUcmllV3JpdGVyU2ltcGxlLmphdmEpCisgIGltcGxlbWVudHMgc2ltcGxlIGluY3JlbWVudGFsIGNvbnN0cnVjdGlvbiBvZiB0cmllcyBmcm9tIHNvcnRlZCBpbnB1dCwKKy0gW2BJbmNyZW1lbnRhbFRyaWVXcml0ZXJQYWdlQXdhcmVgXSguLi8uLi8uLi90cmllcy9JbmNyZW1lbnRhbFRyaWVXcml0ZXJQYWdlQXdhcmUuamF2YSkKKyAgYWRkcyBwYWNraW5nIG9mIG5vZGVzIHRvIGRpc2sgcGFnZXMsCistIFtgSW5jcmVtZW50YWxEZWVwVHJpZVdyaXRlclBhZ2VBd2FyZWBdKC4uLy4uLy4uL3RyaWVzL0luY3JlbWVudGFsRGVlcFRyaWVXcml0ZXJQYWdlQXdhcmUuamF2YSkKKyAgYWRkcyB0aGUgYWJpbGl0eSB0byB0cmFuc2l0aW9uIHRvIG9uLWhlYXAgcmVjdXJzaW9uIGZvciBhbGwgc3RhZ2VzIG9mIHRoZSBjb25zdHJ1Y3Rpb24KKyAgcHJvY2VzcyB0byBiZSBhYmxlIHRvIGhhbmRsZSB2ZXJ5IGxhcmdlIGtleXMuCisKK09ubHkgdGhlIGxhdHRlciBpcyB1c2VkLCBidXQgd2UgcHJvdmlkZSAoYW5kIHRlc3QpIHRoZSBvdGhlciB0d28gYXMgYSBmb3JtIG9mCitkb2N1bWVudGF0aW9uLgorCitUaGUgYnVpbGRlcnMgdGFrZSBhIGBUcmllU2VyaWFsaXplcmAgYXMgcGFyYW1ldGVyLCB3aGljaCBkZXRlcm1pbmVzIGhvdyB0aGUgbm9kZXMKK2FyZSB3cml0dGVuLiBUaGUgaW5kZXhlcyBpbXBsZW1lbnQgdGhpcyB1c2luZyBgVHJpZU5vZGVgLCB3cml0aW5nIGFueSBwYXlsb2FkIHRoZXkKK25lZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG5vZGUgc2VyaWFsaXphdGlvbi4KKworIyMgUmVhZGluZyB0cmllcworCitUaGUgQlRJIGZvcm1hdCB0cmllcyBhcmUgdXNlZCBkaXJlY3RseSBpbiB0aGVpciBvbi1kaXNrIGZvcm1hdC4gVG8gYWNoaWV2ZSB0aGlzLAorYWxsIG5vZGUgdHlwZXMgYXJlIGltcGxlbWVudGVkIGFzIHN0YXRpYyBvYmplY3RzIGluIGBUcmllTm9kZWAuIFJlYWRpbmcgbm9kZXMgaW4KK2EgZmlsZSBpcyBlbmNhcHN1bGF0ZWQgaW4gW2BXYWxrZXJgXSguLi8uLi8uLi90cmllcy9XYWxrZXIuamF2YSksIAord2hpY2ggcHJvdmlkZXMgYSBtZXRob2QgdG8gYGdvYCB0byBhIHNwZWNpZmljIG5vZGUgYW5kIHVzZSBpdCwgaS5lLiAKK2dldCBhbnkgYXNzb2NpYXRlZCBkYXRhLCBzZWFyY2ggaW4gdGhlIGNoaWxkcmVuIGxpc3QgYW5kCitmb2xsb3cgdHJhbnNpdGlvbnMgdG8gY2hpbGRyZW4uIEl0IGFsc28gcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSB0byBmaW5kIHRoZQorbWFwcGluZyBmb3IgYSBnaXZlbiBrZXksIGZsb29ycyBhbmQgY2VpbGluZ3MgYXMgd2VsbCBhcyBzb21lIGNvbWJpbmF0aW9ucy4KK0l0ZXJhdGluZyB0aGUgcGF5bG9hZHMgYmV0d2VlbiB0d28ga2V5IGJvdW5kcyBpcyBpbXBsZW1lbnRlZCBieSAKK1tgVmFsdWVJdGVyYXRvcmBdKC4uLy4uLy4uL3RyaWVzL1ZhbHVlSXRlcmF0b3IuamF2YSksCithbmQgW2BSZXZlcnNlVmFsdWVJdGVyYXRvcmBdKC4uLy4uLy4uL3RyaWVzL1JldmVyc2VWYWx1ZUl0ZXJhdG9yLmphdmEpLgorCitTcGVjaWFsIGNhcmUgaXMgZ2l2ZW4gdG8gcHJlZml4ZXMgdG8gbWFrZSBzdXJlIHRoZSBzZW1hbnRpY3Mgb2Ygc2VhcmNoZXMgbWF0Y2hlcword2hhdCB0aGUgZm9ybWF0IG5lZWRzLgorCisjIyBTU1RhYmxlIGZvcm1hdCBpbXBsZW1lbnRhdGlvbgorCitUaGUgdHdvIGluZGV4ZXMgYXJlIGltcGxlbWVudGVkLCByZXNwZWN0aXZlbHksIGJ5IFtgUGFydGl0aW9uSW5kZXhgXShQYXJ0aXRpb25JbmRleC5qYXZhKQorL1tgUGFydGl0aW9uSW5kZXhCdWlsZGVyYF0oUGFydGl0aW9uSW5kZXhCdWlsZGVyLmphdmEpCithbmQgW2BSb3dJbmRleFJlYWRlcmBdKFJvd0luZGV4UmVhZGVyLmphdmEpL1tgUm93SW5kZXhXcml0ZXJgXShSb3dJbmRleFdyaXRlci5qYXZhKS4gCitUaGUgZm9ybWF0IGltcGxlbWVudGF0aW9uIGV4dGVuZHMgdGhlIGZpbHRlcmVkCitiYXNlIGNsYXNzIGFuZCBmb2xsb3dzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIEJJRyBpbXBsZW1lbnRhdGlvbiwgd2hlcmUKK2FsbCByZWZlcmVuY2VzIHRvIHRoZSBwcmltYXJ5IGluZGV4IGFyZSByZXBsYWNlZCB3aXRoIGNhbGxzIHRvIHRoZXNlIHR3byAKK2NsYXNzZXMuCisKKyMgSW5kZXggZmlsZSBmb3JtYXQgaW4gQlRJCisKKyMjIFRyaWUgbm9kZXMKK0ltcGxlbWVudGVkIGluIFtgVHJpZU5vZGUuamF2YWBdKC4uLy4uLy4uL3RyaWVzL1RyaWVOb2RlLmphdmEpCisKK05vZGVzIHN0YXJ0IHdpdGggZm91ciBiaXRzIG9mIG5vZGUgdHlwZSwgZm9sbG93ZWQgYnkgNCBwYXlsb2FkIGJpdHMKKyhfcGJfKSwgd2hpY2ggYXJlIDAgaWYgdGhlIG5vZGUgaGFzIG5vIGFzc29jaWF0ZWQgcGF5bG9hZDsgb3RoZXJ3aXNlIHRoZQorbm9kZSB0eXBlIGdpdmVzIGFuIG9wdGlvbiB0byBjb21wdXRlIHRoZSBzdGFydGluZyBwb3NpdGlvbiBmb3IgdGhlCitwYXlsb2FkIChfcHBvc18pIGZyb20gdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBub2RlIChfbnBvc18pLgorVGhlIGxheW91dCBvZiB0aGUgbm9kZSBkZXBlbmRzIG9uIGl0cyB0eXBlLgorCitgUEFZTE9BRF9PTkxZYCBub2RlczoKKworLSAgIDQgdHlwZSBiaXRzLCAwCisKKy0gICA0IHBheWxvYWQgYml0cworCistICAgcGF5bG9hZCBpZiBfcGJfICZuZTsgMCwgX3Bwb3NfIGlzIF9ucG9zXyArIDEKKworYFNJTkdMRV9OT1BBWUxPQURfNGAgYW5kIGBTSU5HTEVfTk9QQVlMT0FEXzEyYCBub2RlczoKKworLSAgIDQgdHlwZSBiaXRzCisKKy0gICA0IHBvaW50ZXIgYml0cworCistICAgOCBwb2ludGVyIGJpdHMgKGZvciBgU0lOR0xFX05PUEFZTE9BRF8xMmApCisKKy0gICA4IGJpdHMgdHJhbnNpdGlvbiBieXRlCisKKy0gICBfcGJfIGlzIGFzc3VtZWQgMAorCitgU0lOR0xFXzgvMTZgOgorCistICAgNCB0eXBlIGJpdHMKKworLSAgIDQgcGF5bG9hZCBiaXRzCisKKy0gICA4IGJpdHMgdHJhbnNpdGlvbiBieXRlCisKKy0gICA4LzE2IHBvaW50ZXIgYml0cworCistICAgcGF5bG9hZCBpZiBfcGJfICZuZTsgMCwgX3Bwb3NfIGlzIF9ucG9zXyArIDMvNAorCitgU1BBUlNFXzgvMTIvMTYvMjQvNDBgOgorCistICAgNCB0eXBlIGJpdHMKKworLSAgIDQgcGF5bG9hZCBiaXRzCisKKy0gICA4IGJpdCBjaGlsZCBjb3VudAorCistICAgOCBiaXRzIHBlciBjaGlsZCwgdGhlIHRyYW5zaXRpb24gYnl0ZXMKKworLSAgIDgvMTIvMTYvMjQvNDAgYml0cyBwZXIgY2hpbGQsIHRoZSBwb2ludGVycworCistICAgcGF5bG9hZCBpZiBfcGJfICZuZTsgMCwgX3Bwb3NfIGlzIF9ucG9zXyArIDIgKyAoMi8yLjUvMy80LzYpKihfY2hpbGQKKyAgICBjb3VudF8pIChyb3VuZGVkIHVwKQorCitgREVOU0VfMTIvMTYvMjQvMzIvNDAvTE9OR2A6CisKKy0gICA0IHR5cGUgYml0cworCistICAgNCBwYXlsb2FkIGJpdHMKKworLSAgIDggYml0IHN0YXJ0IGJ5dGUgdmFsdWUKKworLSAgIDggYml0IF9sZW5ndGhfLTEKKworLSAgIF9sZW5ndGhfICogMTIvMTYvMjQvMzIvNDAvNjQgYml0cyBwZXIgY2hpbGQsIHRoZSBwb2ludGVycworCistICAgcGF5bG9hZCBpZiBfcGJfICZuZTsgMCwgX3Bwb3NfIGlzIF9ucG9zXyArIDMgKyAoMS41LzIvMy80LzUvOCkqKF9sZW5ndGhfKQorICAgIChyb3VuZGVkIHVwKQorCitUaGlzIGlzIHRoZSBzcGFjZSB0YWtlbiBieSBlYWNoIG5vZGUgdHlwZSAoX0NTXyBzdGFuZHMgZm9yIGNoaWxkIHNwYW4sCitpLmUuIGxhcmdlc3QgLSBzbWFsbGVzdCArIDEsIF9DQ18gaXMgY2hpbGQgY291bnQpOgorCit8VHlwZSAgICAgICAgICAgICAgICAgfCBTaXplIGluIGJ5dGVzIGV4Y2wuIHBheWxvYWQgfFNpemUgZm9yIDEgY2hpbGR8U2l6ZSBmb3IgOSBkZW5zZSBjaGlsZHJlbiAoMDEtMDgsIDEwKXxTaXplIGZvciAxMCBzcGFyc2UgY2hpbGRyZW4gKDAxICsgaSoxMCl8V2h5IHRoZSB0eXBlIGlzIG5lZWRlZCAgICAgICAgICB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLTp8LS0tLS0tLS0tLS0tLS0tLS0tLTp8LS0tLS0tLS0tLS0tLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8YFBBWUxPQURfT05MWWAgICAgICAgfCAxICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAtICAgICAgICAgICAgICB8IC0gICAgICAgICAgICAgICAgICB8IC0gICAgICAgICAgICAgICAgICB8ICBMZWF2ZXMgZG9taW5hdGUgdGhlIHRyaWUgICAgICB8Cit8YFNJTkdMRV9OT1BBWUxPQURfNGAgfCAyICAgICAgICAgICAgICAgICAgICAgICAgICAgfDIgICAgICAgICAgICAgICB8IC0gICAgICAgICAgICAgICAgICB8IC0gICAgICAgICAgICAgICAgICB8ICBTaW5nbGUtdHJhbnNpdGlvbiBjaGFpbnMgICAgICB8Cit8YFNJTkdMRV84YCAgICAgICAgICAgfCAzICAgICAgICAgICAgICAgICAgICAgICAgICAgfDMgICAgICAgICAgICAgICB8IC0gICAgICAgICAgICAgICAgICB8IC0gICAgICAgICAgICAgICAgICB8ICBQYXlsb2FkIHdpdGhpbiBjaGFpbiAgICAgICAgICB8Cit8YFNQQVJTRV84YCAgICAgICAgICAgfCAyICsgX0NDXyAqIDIgICAgICAgICAgICAgICAgfDQgICAgICAgICAgICAgICB8IDIwICAgICAgICAgICAgICAgICB8IDIyICAgICAgICAgICAgICAgICB8ICBNb3N0IGNvbW1vbiB0eXBlIGFmdGVyIGxlYXZlcyB8Cit8YFNJTkdMRV9OT1BBWUxPQURfMTJgfCAzICAgICAgICAgICAgICAgICAgICAgICAgICAgfDMgICAgICAgICAgICAgICB8IC0gICAgICAgICAgICAgICAgICB8IC0gICAgICAgICAgICAgICAgICB8ICAxMiBiaXRzIGNvdmVyIGFsbCBpbi1wYWdlIHRyYW5zaXRpb25zICAgIHwgCit8YFNQQVJTRV8xMmAgICAgICAgICAgfCAyICsgX0NDXyAqIDIuNSAgICAgICAgICAgICAgfDUgICAgICAgICAgICAgICB8IDI1ICAgICAgICAgICAgICAgICB8IDI3ICAgICAgICAgICAgICAgICB8ICBTaXplIG9mIHNwYXJzZSBpcyBwcm9wb3J0aW9uYWwgdG8gbnVtYmVyIG9mIGNoaWxkcmVuIHwKK3xgREVOU0VfMTJgICAgICAgICAgICB8IDMgKyBfQ1NfICogMS41ICAgICAgICAgICAgICB8NSAgICAgICAgICAgICAgIHwgMTggICAgICAgICAgICAgICAgIHwgMTQwICAgICAgICAgICAgICAgIHwgIExvb2t1cCBpbiBkZW5zZSBpcyBmYXN0ZXIsIHNpemUgc21hbGxlciBpZiBmZXcgaG9sZXMgICAgfCAKK3xgU0lOR0xFXzE2YCAgICAgICAgICB8IDQgICAgICAgICAgICAgICAgICAgICAgICAgICB8NCAgICAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgCit8YFNQQVJTRV8xNmAgICAgICAgICAgfCAyICsgX0NDXyAqIDMgICAgICAgICAgICAgICAgfDUgICAgICAgICAgICAgICB8IDI5ICAgICAgICAgICAgICAgICB8IDMyICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAKK3xgREVOU0VfMTZgICAgICAgICAgICB8IDMgKyBfQ1NfICogMiAgICAgICAgICAgICAgICB8NSAgICAgICAgICAgICAgIHwgMjMgICAgICAgICAgICAgICAgIHwgMTg1ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIAorfGBTUEFSU0VfMjRgICAgICAgICAgIHwgMiArIF9DQ18gKiA0ICAgICAgICAgICAgICAgIHw2ICAgICAgICAgICAgICAgfCAzOCAgICAgICAgICAgICAgICAgfCA0MiAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgCit8YERFTlNFXzI0YCAgICAgICAgICAgfCAzICsgX0NTXyAqIDMgICAgICAgICAgICAgICAgfDYgICAgICAgICAgICAgICB8IDMzICAgICAgICAgICAgICAgICB8IDI3NiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAKK3xgREVOU0VfMzJgICAgICAgICAgICB8IDMgKyBfQ1NfICogNCAgICAgICAgICAgICAgICB8NyAgICAgICAgICAgICAgIHwgNDMgICAgICAgICAgICAgICAgIHwgMzY3ICAgICAgICAgICAgICAgIHwgIE5vZGVzIHdpdGggYmlnIHN1YnRyZWVzIGFyZSB1c3VhbGx5IGRlbnNlICAgfCAKK3xgU1BBUlNFXzQwYCAgICAgICAgICB8IDIgKyBfQ0NfICogNiAgICAgICAgICAgICAgICB8OCAgICAgICAgICAgICAgIHwgNTYgICAgICAgICAgICAgICAgIHwgNjIgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIAorfGBERU5TRV80MGAgICAgICAgICAgIHwgMyArIF9DU18gKiA1ICAgICAgICAgICAgICAgIHw4ICAgICAgICAgICAgICAgfCA1MyAgICAgICAgICAgICAgICAgfCA0NTggICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgCit8YERFTlNFX0xPTkdgICAgICAgICAgfCAzICsgX0NTXyAqIDggICAgICAgICAgICAgICAgfDExICAgICAgICAgICAgICB8IDgzICAgICAgICAgICAgICAgICB8IDczMSAgICAgICAgICAgICAgICB8ICBDYXRjaC1hbGwgICAgICAgICAgICAgICAgICAgICB8CisKK0FsbCBwb2ludGVycyBhcmUgc3RvcmVkIGFzIGRpc3RhbmNlcywgYW5kIHNpbmNlIGFsbCB0cmllcyBhcmUgd3JpdHRlbgorZnJvbSB0aGUgYm90dG9tIHVwIChhbmQgaGVuY2UgYSBjaGlsZCBpcyBhbHdheXMgYmVmb3JlIHRoZSBwYXJlbnQgaW4gdGhlCitmaWxlKSwgdGhlIGRpc3RhbmNlIGlzIHN1YnRyYWN0ZWQgZnJvbSB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbm9kZQordG8gb2J0YWluIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hpbGQgbm9kZS4KKworTm90ZTogQWxsIG5vZGVzIGFyZSBwbGFjZWQgaW4gc3VjaCBhIHdheSB0aGF0IHRoZXkgZG8gbm90IGNyb3NzIGEgcGFnZQorYm91bmRhcnkuIEkuZS4gaWYgYSByZWFkZXIgKGUuZy4gW2BXYWxrZXJgXSguLi8uLi8uLi90cmllcy9XYWxrZXIuamF2YSkpIAoraXMgcG9zaXRpb25lZCBhdCBhIG5vZGUsIGl0IGlzCitndWFyYW50ZWVkIHRoYXQgYWxsIHJlYWRzIG9mIHRoZSBub2RlJ3MgZGF0YSBjYW4gY29tcGxldGUgd2l0aG91dAorcmVxdWlyaW5nIGEgZGlmZmVyZW50IHBhZ2UgdG8gYmUgZmV0Y2hlZCBmcm9tIGRpc2suCisKKyMjIFBhcnRpdGlvbiBpbmRleAorSW1wbGVtZW50ZWQgaW4gW2BQYXJ0aXRpb25JbmRleC5qYXZhYF0oUGFydGl0aW9uSW5kZXguamF2YSkKKworTGF5b3V0OgorYGBgCitbbm9kZXMgcGFnZSwgNDA5NiBieXRlc10KKy4uLgorW25vZGVzIHBhZ2UsIDQwOTYgYnl0ZXNdCitbbm9kZXMgcGFnZSBpbmNsdWRpbmcgcm9vdCBub2RlLCDiiaQ0MDk2IGJ5dGVzXQorW3NtYWxsZXN0IGtleSwgd2l0aCBzaG9ydCBsZW5ndGhdCitbbGFyZ2VzdCBrZXksIHdpdGggc2hvcnQgbGVuZ3RoXQorW3NtYWxsZXN0IGtleSBwb3MsIGxvbmddCitba2V5IGNvdW50LCBsb25nXQorW3Jvb3QgcG9zLCBsb25nXQorYGBgCisKK1RoZSBTU1RhYmxlJ3MgcGFydGl0aW9uIGluZGV4IGlzIHN0b3JlZCBpbiB0aGUgLVBhcnRpdGlvbnMuZGIgZmlsZS4gVGhlCitmaWxlIGl0c2VsZiBpcyB3cml0dGVuIGZyb20gdGhlIGJvdHRvbSB1cCwgYW5kIGl0cyAiaGVhZGVyIiBpcyBhdCB0aGUKK2VuZCBvZiB0aGUgZmlsZS4KKworTW9yZSBwcmVjaXNlbHksIHRoZSBsYXN0IDMgbG9uZ3MgaW4gdGhlIGZpbGUgY29udGFpbjoKKworLSAgIEEgZmlsZSBwb3NpdGlvbiB3aGVyZSB0aGUgc21hbGxlc3QgYW5kIGdyZWF0ZXN0IGtleSBhcmUgd3JpdHRlbi4KKworLSAgIFRoZSBleGFjdCBudW1iZXIgb2Yga2V5cyBpbiB0aGUgZmlsZS4KKworLSAgIEEgZmlsZSBwb3NpdGlvbiBmb3IgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgaW5kZXguCisKK1RoZXNlIHRocmVlIGxvbmdzIGFyZSBwcmVjZWRlZCBieSB0aGUgc2VyaWFsaXphdGlvbiBvZiB0aGUgZmlyc3QgYW5kCitsYXN0IGtleSwgYW5kIGJlZm9yZSB0aGF0IGFyZSB0aGUgdHJpZSBjb250ZW50cy4KKworVG8gZmluZCBhIG1hdGNoIGZvciB0aGUga2V5LCBzdGFydCBhdCB0aGUgcm9vdCBwb3NpdGlvbiwgZGVjb2RlIHRoZSBub2RlCisoc2VlIHRoZSAiVHJpZSBub2RlcyIgc2VjdGlvbiBhYm92ZSkgYW5kIGZvbGxvdyB0aGUgdHJhbnNpdGlvbnMKK2FjY29yZGluZyB0byB0aGUgYnl0ZXMgb2YgdGhlIGJ5dGUtb3JkZXJlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUga2V5Cit3aGlsZSB0aGUgbm9kZSBoYXMgY2hpbGRyZW4gYW5kIHRoZXJlIGFyZSBieXRlcyBsZWZ0IGluIHRoZSBrZXkuCisKK0lmIGEgbGVhZiBub2RlIGlzIHJlYWNoZWQsIHRoYXQgbm9kZSBjb250YWlucyB0aGUgZm9sbG93aW5nIHBheWxvYWQ6CisKKy0gICBJZiBfcGJfIDwgOCwgbGV0CisKKyAgICAtICAgX2lkeHBvc18gYmUgdGhlIHNpZ24tZXh0ZW5kZWQgaW50ZWdlciB2YWx1ZSBvZiBsZW5ndGggX3BiXyBhdAorICAgICAgICBfcHBvc18KKworLSAgIElmIF9wYl8gJmdlOyA4IChhbHdheXMgdGhlIGNhc2UgaW4gQ2Fzc2FuZHJhIDUgZmlsZXMpLCBsZXQKKworICAgIC0gICBfaGFzaF8gYmUgdGhlIGJ5dGUgYXQgX3Bwb3NfCisKKyAgICAtICAgX2lkeHBvc18gYmUgdGhlIHNpZ24tZXh0ZW5kZWQgaW50ZWdlciB2YWx1ZSBvZiBsZW5ndGggX3BiLTdfIGF0CisgICAgICAgIF9wcG9zKzFfCisKK0lmIGF0IGFueSBzdGVwIHRoZXJlIGlzIG5vIHRyYW5zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgYnl0ZSBvZiB0aGUKK2tleSwgb3IgaWYgX2hhc2hfIGlzIHByZXNlbnQgYW5kIHRoZSBsb3dlc3Qtb3JkZXIgYnl0ZSBvZiB0aGUga2V5J3MgaGFzaAordmFsdWUgZG9lcyBub3QgbWF0Y2ggaXQsIHRoZSBpbmRleCBhbmQgc3N0YWJsZSBoYXZlIG5vIG1hcHBpbmcgZm9yIHRoZQorZ2l2ZW4ga2V5LgorCitPdGhlcndpc2UgX2lkeHBvc18gc3BlY2lmaWVzOgorCistICAgaWYgX2lkeHBvc18gJmdlOyAwLCB0aGUgcm93IGluZGV4IGZpbGUgY29udGFpbnMgYW4gaW5kZXggZm9yIHRoZQorICAgIGdpdmVuIGtleSAoc2VlIHJvdyBpbmRleCBzZWN0aW9uIGJlbG93KSBhdCBwb3NpdGlvbiBfaWR4cG9zXworCistICAgb3RoZXJ3aXNlLCB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBzdGFydHMgYXQgcG9zaXRpb24KKyAgICB+X2lkeHBvc18gaW4gdGhlIGRhdGEgZmlsZQorCitJbiBlaXRoZXIgY2FzZSB0aGUgY29udGVudCBpbiB0aGUgcmVzcGVjdGl2ZSBmaWxlIHN0YXJ0cyB3aXRoIHRoZQorc2VyaWFsaXphdGlvbiBvZiB0aGUgcGFydGl0aW9uIGtleSwgd2hpY2ggbXVzdCBiZSBjb21wYXJlZCB3aXRoIHRoZSBrZXkKK3JlcXVlc3RlZCB0byBlbnN1cmUgdGhleSBtYXRjaC4KKworIyMgUm93IGluZGV4CitJbXBsZW1lbnRlZCBpbiBbYFJvd0luZGV4UmVhZGVyLmphdmFgXShSb3dJbmRleFJlYWRlci5qYXZhKQorCitMYXlvdXQ6CitgYGAKK1tyb3cgaW5kZXgsIHBhZGRlZCB0byBwYWdlIGJvdW5kYXJ5XQorLi4uCitbcm93IGluZGV4LCBwYWRkZWQgdG8gcGFnZSBib3VuZGFyeV0KK2BgYAorV2hlcmUgZWFjaCByb3cgaW5kZXggY29udGFpbnM6CitgYGAKK1tub2RlcyBwYWdlLCA0MDk2IGJ5dGVzXQorLi4uCitbbm9kZXMgcGFnZSwgNDA5NiBieXRlc10KK1tub2RlcyBwYWdlIGluY2x1ZGluZyByb290IG5vZGUsIOKJpDQwOTYgYnl0ZXNdCitbcGFydGl0aW9uIGtleSwgd2l0aCBzaG9ydCBsZW5ndGhdCitbcG9zaXRpb24gb2YgdGhlIHBhcnRpdGlvbiBpbiB0aGUgZGF0YSBmaWxlLCB1bnNpZ25lZCB2aW50XQorW3Bvc2l0aW9uIG9mIHRoZSByb290IG5vZGUsIHZpbnQgZW5jb2RpbmcgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKK3N0YXJ0IG9mIHRoZSBkYXRhIGZpbGUgcG9zaXRpb24gYW5kIHRoZSBwb3NpdGlvbiBvZiB0aGUgcm9vdCBub2RlXQorW251bWJlciBvZiByb3dzIGluIHRoZSBwYXJ0aXRpb24sIHVuc2lnbmVkIHZpbnRdCitbcGFydGl0aW9uIGRlbGV0aW9uIHRpbWUsIDEyIGJ5dGVzXQorYGBgCisKK1RoZSBlbnRyaWVzIGluIHRoZSBwYXJ0aXRpb24gaW5kZXggcG9pbnQgdG8gdGhlIHBvc2l0aW9uIGF0IHRoZSBzdGFydCBvZgordGhlIHBhcnRpdGlvbiBrZXkuCisKK1RoZSBwYXlsb2FkIHJlYWNoYWJsZSBhdCB0aGUgZW5kIG9mIGEgdHJhdmVyc2FsIGNvbnRhaW5zOgorCistICAgSW50ZWdlciBvZiBfcGJfJjcgYnl0ZXMgc3BlY2lmeWluZyB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgcGFydGl0aW9uCisgICAgd2hlcmUgdGhlIHJlbGV2YW50IHJvdyBpcyBjb250YWluZWQKKworLSAgIElmIF9wYl8gJmdlOyA4LCAxMiBieXRlcyBvZiBkZWxldGlvbiB0aW1lIGFjdGl2ZSBhdCB0aGUgc3RhcnQgb2YgdGhlCisgICAgcm93IGluZGV4IGJsb2NrCisKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9CdGlGb3JtYXRQYXJ0aXRpb25Xcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9CdGlGb3JtYXRQYXJ0aXRpb25Xcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTY4MzIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL0J0aUZvcm1hdFBhcnRpdGlvbldyaXRlci5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdDb21wYXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNvcnRlZFRhYmxlUGFydGl0aW9uV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpLlJvd0luZGV4UmVhZGVyLkluZGV4SW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNlcXVlbnRpYWxXcml0ZXI7CisKKy8qKgorICogUGFydGl0aW9uIHdyaXRlciB1c2VkIGJ5IHtAbGluayBCdGlUYWJsZVdyaXRlcn0uCisgKiA8cD4KKyAqIFdyaXRlcyBhbGwgcGFzc2VkIGRhdGEgdG8gdGhlIGdpdmVuIFNlcXVlbnRpYWxXcml0ZXIgYW5kIGlmIG5lY2Vzc2FyeSBidWlsZHMgYSBSb3dJbmRleCBieSBjb25zdHJ1Y3RpbmcgYW4gZW50cnkKKyAqIGZvciBlYWNoIHJvdyB3aXRoaW4gYSBwYXJ0aXRpb24gdGhhdCBmb2xsb3dzIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnI2NvbHVtbl9pbmRleF9zaXplfSBvZiB3cml0dGVuCisgKiBkYXRhLgorICovCitjbGFzcyBCdGlGb3JtYXRQYXJ0aXRpb25Xcml0ZXIgZXh0ZW5kcyBTb3J0ZWRUYWJsZVBhcnRpdGlvbldyaXRlcgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0dSQU5VTEFSSVRZID0gMTYgKiAxMDI0OworICAgIHByaXZhdGUgZmluYWwgUm93SW5kZXhXcml0ZXIgcm93VHJpZTsKKyAgICBwcml2YXRlIGZpbmFsIGludCByb3dJbmRleEJsb2NrU2l6ZTsKKyAgICBwcml2YXRlIGludCByb3dJbmRleEJsb2NrQ291bnQ7CisKKyAgICBCdGlGb3JtYXRQYXJ0aXRpb25Xcml0ZXIoU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbnRpYWxXcml0ZXIgZGF0YVdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVudGlhbFdyaXRlciByb3dJbmRleFdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgdGhpcyhoZWFkZXIsIGNvbXBhcmF0b3IsIGRhdGFXcml0ZXIsIHJvd0luZGV4V3JpdGVyLCB2ZXJzaW9uLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29sdW1uSW5kZXhTaXplKERFRkFVTFRfR1JBTlVMQVJJVFkpKTsKKyAgICB9CisKKworICAgIEJ0aUZvcm1hdFBhcnRpdGlvbldyaXRlcihTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVudGlhbFdyaXRlciBkYXRhV3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW50aWFsV3JpdGVyIHJvd0luZGV4V3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dJbmRleEJsb2NrU2l6ZSkKKyAgICB7CisgICAgICAgIHN1cGVyKGhlYWRlciwgZGF0YVdyaXRlciwgdmVyc2lvbik7CisgICAgICAgIHRoaXMucm93SW5kZXhCbG9ja1NpemUgPSByb3dJbmRleEJsb2NrU2l6ZTsKKyAgICAgICAgdGhpcy5yb3dUcmllID0gbmV3IFJvd0luZGV4V3JpdGVyKGNvbXBhcmF0b3IsIHJvd0luZGV4V3JpdGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpCisgICAgeworICAgICAgICBzdXBlci5yZXNldCgpOworICAgICAgICByb3dUcmllLnJlc2V0KCk7CisgICAgICAgIHJvd0luZGV4QmxvY2tDb3VudCA9IDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkVW5maWx0ZXJlZChVbmZpbHRlcmVkIHVuZmlsdGVyZWQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgc3VwZXIuYWRkVW5maWx0ZXJlZCh1bmZpbHRlcmVkKTsKKworICAgICAgICAvLyBpZiB3ZSBoaXQgdGhlIGNvbHVtbiBpbmRleCBzaXplIHRoYXQgd2UgaGF2ZSB0byBpbmRleCBhZnRlciwgZ28gYWhlYWQgYW5kIGluZGV4IGl0LgorICAgICAgICBpZiAoY3VycmVudFBvc2l0aW9uKCkgLSBzdGFydFBvc2l0aW9uID49IHJvd0luZGV4QmxvY2tTaXplKQorICAgICAgICAgICAgYWRkSW5kZXhCbG9jaygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICB7CisgICAgICAgIHJvd1RyaWUuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBmaW5pc2goKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGxvbmcgZW5kUG9zaXRpb24gPSBzdXBlci5maW5pc2goKTsKKworICAgICAgICAvLyB0aGUgbGFzdCByb3cgbWF5IGhhdmUgZmFsbGVuIG9uIGFuIGluZGV4IGJvdW5kYXJ5IGFscmVhZHkuICBpZiBub3QsIGluZGV4IHRoZSBsYXN0IGJsb2NrIGV4cGxpY2l0bHkuCisgICAgICAgIGlmIChyb3dJbmRleEJsb2NrQ291bnQgPiAwICYmIGZpcnN0Q2x1c3RlcmluZyAhPSBudWxsKQorICAgICAgICAgICAgYWRkSW5kZXhCbG9jaygpOworCisgICAgICAgIGlmIChyb3dJbmRleEJsb2NrQ291bnQgPiAxKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcm93VHJpZS5jb21wbGV0ZShlbmRQb3NpdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2UgZG9uJ3QgY29tcGxldGUgdGhlIHRyaWUgYXMgYW4gaW5kZXggb2Ygb25lIGJsb2NrIGFkZHMgbm8gaW5mb3JtYXRpb24gYW5kIHdlIGFyZSBiZXR0ZXIgb2ZmCisgICAgICAgICAgICAvLyB3aXRob3V0IGEgcm93IGluZGV4IGZvciBzdWNoIHBhcnRpdGlvbnMuIEV2ZW4gaWYgd2UgZGlkIHdyaXRlIHNvbWV0aGluZyB0byB0aGUgZmlsZSAod2hpY2ggc2hvdWxkbid0IGJlCisgICAgICAgICAgICAvLyB0aGUgY2FzZSBhcyB0aGUgZmlyc3QgZW50cnkgaGFzIGFuIGVtcHR5IGtleSBhbmQgcm9vdCBpc24ndCBmaWxsZWQpLCB0aGF0J3Mgbm90IGEgcHJvYmxlbS4KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFkZEluZGV4QmxvY2soKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIEluZGV4SW5mbyBjSW5kZXhJbmZvID0gbmV3IEluZGV4SW5mbyhzdGFydFBvc2l0aW9uLCBzdGFydE9wZW5NYXJrZXIpOworICAgICAgICByb3dUcmllLmFkZChmaXJzdENsdXN0ZXJpbmcsIGxhc3RDbHVzdGVyaW5nLCBjSW5kZXhJbmZvKTsKKyAgICAgICAgZmlyc3RDbHVzdGVyaW5nID0gbnVsbDsKKyAgICAgICAgKytyb3dJbmRleEJsb2NrQ291bnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSb3dJbmRleEJsb2NrQ291bnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJvd0luZGV4QmxvY2tDb3VudDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvQnRpVGFibGVSZWFkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9CdGlUYWJsZVJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MmRjZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvQnRpVGFibGVSZWFkZXIuamF2YQpAQCAtMCwwICsxLDUzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGF0YVJhbmdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUGFydGl0aW9uUG9zaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2xpY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5VbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3dzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQWJzdHJhY3RCb3VuZHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklTU1RhYmxlU2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklWZXJpZmllcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZWFkc0xpc3RlbmVyLlNlbGVjdGlvblJlYXNvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZWFkc0xpc3RlbmVyLlNraXBwaW5nUmVhc29uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXJXaXRoRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZURhdGFJbnB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SYW5kb21BY2Nlc3NSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSUZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PdXRwdXRIYW5kbGVyOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVE7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXIuT3BlcmF0b3IuR0U7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXIuT3BlcmF0b3IuR1Q7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuU2hhcmVkQ2xvc2VhYmxlLnNoYXJlZENvcHlPck51bGw7CisKKy8qKgorICogUmVhZGVyIG9mIFNTVGFibGUgZmlsZXMgaW4gQlRJIGZvcm1hdCAoc2VlIHtAbGluayBCdGlGb3JtYXR9KSwgd3JpdHRlbiBieSB7QGxpbmsgQnRpVGFibGVXcml0ZXJ9LgorICogPHA+CisgKiBTU1RhYmxlUmVhZGVycyBhcmUgb3BlbigpZWQgYnkgS2V5c3BhY2Uub25TdGFydDsgYWZ0ZXIgdGhhdCB0aGV5IGFyZSBjcmVhdGVkIGJ5IFNTVGFibGVXcml0ZXIucmVuYW1lQW5kT3Blbi4KKyAqIERvIG5vdCByZS1jYWxsIG9wZW4oKSBvbiBleGlzdGluZyBTU1RhYmxlIGZpbGVzOyB1c2UgdGhlIHJlZmVyZW5jZXMga2VwdCBieSBDb2x1bW5GYW1pbHlTdG9yZSBwb3N0LXN0YXJ0IGluc3RlYWQuCisgKi8KK3B1YmxpYyBjbGFzcyBCdGlUYWJsZVJlYWRlciBleHRlbmRzIFNTVGFibGVSZWFkZXJXaXRoRmlsdGVyCit7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlSGFuZGxlIHJvd0luZGV4RmlsZTsKKyAgICBwcml2YXRlIGZpbmFsIFBhcnRpdGlvbkluZGV4IHBhcnRpdGlvbkluZGV4OworCisgICAgcHVibGljIEJ0aVRhYmxlUmVhZGVyKEJ1aWxkZXIgYnVpbGRlciwgU1NUYWJsZS5Pd25lciBvd25lcikKKyAgICB7CisgICAgICAgIHN1cGVyKGJ1aWxkZXIsIG93bmVyKTsKKyAgICAgICAgdGhpcy5yb3dJbmRleEZpbGUgPSBidWlsZGVyLmdldFJvd0luZGV4RmlsZSgpOworICAgICAgICB0aGlzLnBhcnRpdGlvbkluZGV4ID0gYnVpbGRlci5nZXRQYXJ0aXRpb25JbmRleCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBCdWlsZGVyIHVuYnVpbGRUbyhCdWlsZGVyIGJ1aWxkZXIsIGJvb2xlYW4gc2hhcmVkQ29weSkKKyAgICB7CisgICAgICAgIEJ1aWxkZXIgYiA9IHN1cGVyLnVuYnVpbGRUbyhidWlsZGVyLCBzaGFyZWRDb3B5KTsKKyAgICAgICAgaWYgKGJ1aWxkZXIuZ2V0UGFydGl0aW9uSW5kZXgoKSA9PSBudWxsKQorICAgICAgICAgICAgYi5zZXRQYXJ0aXRpb25JbmRleChzaGFyZWRDb3B5ID8gc2hhcmVkQ29weU9yTnVsbChwYXJ0aXRpb25JbmRleCkgOiBwYXJ0aXRpb25JbmRleCk7CisgICAgICAgIGlmIChidWlsZGVyLmdldFJvd0luZGV4RmlsZSgpID09IG51bGwpCisgICAgICAgICAgICBiLnNldFJvd0luZGV4RmlsZShzaGFyZWRDb3B5ID8gc2hhcmVkQ29weU9yTnVsbChyb3dJbmRleEZpbGUpIDogcm93SW5kZXhGaWxlKTsKKworICAgICAgICByZXR1cm4gYjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTGlzdDxBdXRvQ2xvc2VhYmxlPiBzZXR1cEluc3RhbmNlKGJvb2xlYW4gdHJhY2tIb3RuZXNzKQorICAgIHsKKyAgICAgICAgQXJyYXlMaXN0PEF1dG9DbG9zZWFibGU+IGNsb3NlYWJsZXMgPSBMaXN0cy5uZXdBcnJheUxpc3Qocm93SW5kZXhGaWxlLCBwYXJ0aXRpb25JbmRleCk7CisgICAgICAgIGNsb3NlYWJsZXMuYWRkQWxsKHN1cGVyLnNldHVwSW5zdGFuY2UodHJhY2tIb3RuZXNzKSk7CisgICAgICAgIHJldHVybiBjbG9zZWFibGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gZmlsdGVyIG91dCBkYXRhIGJlZm9yZSB7QGxpbmsgI2ZpcnN0fS4gTmVlZGVkIGZvciBzb3VyY2VzIG9mIGRhdGEgaW4gYSBjb21wYWN0aW9uLCB3aGVyZSB0aGUgcmVsZXZhbnQKKyAgICAgKiBvdXRwdXQgaXMgb3BlbmVkIGVhcmx5IC0tIGluIHRoaXMgY2FzZSB0aGUgc3N0YWJsZSdzIHN0YXJ0IGlzIGNoYW5nZWQsIGJ1dCB0aGUgZGF0YSBjYW4gc3RpbGwgYmUgZm91bmQgaW4gdGhlCisgICAgICogZmlsZS4gUmFuZ2UgYW5kIHBvaW50IHF1ZXJpZXMgbXVzdCBmaWx0ZXIgaXQgb3V0LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGZpbHRlckZpcnN0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBvcGVuUmVhc29uID09IE9wZW5SZWFzb24uTU9WRURfU1RBUlQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBmaWx0ZXIgb3V0IGRhdGEgYWZ0ZXIge0BsaW5rICNsYXN0fS4gRWFybHktb3BlbiBzc3RhYmxlcyBtYXkgY29udGFpbiBkYXRhIGJleW9uZCB0aGUgc3dpdGNoIHBvaW50CisgICAgICogKGJlY2F1c2UgYW4gZWFybHktb3BlbmVkIHNzdGFibGUgaXMgbm90IHJlYWR5IHVudGlsIGJ1ZmZlcnMgaGF2ZSBiZWVuIGZsdXNoZWQpLCBhbmQgbGVhdmluZyB0aGF0IGRhdGEgdmlzaWJsZQorICAgICAqIHdpbGwgZ2l2ZSBhIHJlZHVuZGFudCBjb3B5IHdpdGggYWxsIGFzc29jaWF0ZWQgb3ZlcmhlYWRzLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGZpbHRlckxhc3QoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG9wZW5SZWFzb24gPT0gT3BlblJlYXNvbi5FQVJMWSAmJiBwYXJ0aXRpb25JbmRleCBpbnN0YW5jZW9mIFBhcnRpdGlvbkluZGV4RWFybHk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZXN0aW1hdGVkS2V5cygpCisgICAgeworICAgICAgICByZXR1cm4gcGFydGl0aW9uSW5kZXggPT0gbnVsbCA/IDAgOiBwYXJ0aXRpb25JbmRleC5zaXplKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRyaWVJbmRleEVudHJ5IGdldFJvd0luZGV4RW50cnkoUGFydGl0aW9uUG9zaXRpb24ga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yIG9wZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXBkYXRlU3RhdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXIpCisgICAgeworICAgICAgICBQYXJ0aXRpb25Qb3NpdGlvbiBzZWFyY2hLZXk7CisgICAgICAgIE9wZXJhdG9yIHNlYXJjaE9wOworCisgICAgICAgIGlmIChvcGVyYXRvciA9PSBFUSkKKyAgICAgICAgICAgIHJldHVybiBnZXRFeGFjdFBvc2l0aW9uKChEZWNvcmF0ZWRLZXkpIGtleSwgbGlzdGVuZXIsIHVwZGF0ZVN0YXRzKTsKKworICAgICAgICBpZiAob3BlcmF0b3IgPT0gR1QgfHwgb3BlcmF0b3IgPT0gR0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaWx0ZXJMYXN0KCkgJiYgbGFzdC5jb21wYXJlVG8oa2V5KSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbm90aWZ5U2tpcHBlZChTa2lwcGluZ1JlYXNvbi5NSU5fTUFYX0tFWVMsIGxpc3RlbmVyLCBvcGVyYXRvciwgdXBkYXRlU3RhdHMpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbGVhbiBmaWx0ZXJlZExlZnQgPSAoZmlsdGVyRmlyc3QoKSAmJiBmaXJzdC5jb21wYXJlVG8oa2V5KSA+IDApOworICAgICAgICAgICAgc2VhcmNoS2V5ID0gZmlsdGVyZWRMZWZ0ID8gZmlyc3QgOiBrZXk7CisgICAgICAgICAgICBzZWFyY2hPcCA9IGZpbHRlcmVkTGVmdCA/IEdFIDogb3BlcmF0b3I7CisKKyAgICAgICAgICAgIHRyeSAoUGFydGl0aW9uSW5kZXguUmVhZGVyIHJlYWRlciA9IHBhcnRpdGlvbkluZGV4Lm9wZW5SZWFkZXIoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUcmllSW5kZXhFbnRyeSByaWUgPSByZWFkZXIuY2VpbGluZyhzZWFyY2hLZXksIChwb3MsIGFzc3VtZU5vTWF0Y2gsIGNvbXBhcmVLZXkpIC0+IHJldHJpZXZlRW50cnlJZkFjY2VwdGFibGUoc2VhcmNoT3AsIGNvbXBhcmVLZXksIHBvcywgYXNzdW1lTm9NYXRjaCkpOworICAgICAgICAgICAgICAgIGlmIChyaWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5U2VsZWN0ZWQoU2VsZWN0aW9uUmVhc29uLklOREVYX0VOVFJZX0ZPVU5ELCBsaXN0ZW5lciwgb3BlcmF0b3IsIHVwZGF0ZVN0YXRzLCByaWUpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5U2tpcHBlZChTa2lwcGluZ1JlYXNvbi5JTkRFWF9FTlRSWV9OT1RfRk9VTkQsIGxpc3RlbmVyLCBvcGVyYXRvciwgdXBkYXRlU3RhdHMpOworICAgICAgICAgICAgICAgIHJldHVybiByaWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYXJrU3VzcGVjdCgpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihlLCByb3dJbmRleEZpbGUucGF0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgb3A6ICIgKyBvcGVyYXRvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHtAbGluayAjZ2V0Um93SW5kZXhFbnRyeX0gYWJvdmUgKHZpYSBSZWFkZXIuY2VpbGluZy9mbG9vcikgdG8gY2hlY2sgaWYgdGhlIHBvc2l0aW9uIHNhdGlzZmllcyB0aGUgZnVsbAorICAgICAqIGtleSBjb25zdHJhaW50LiBUaGlzIGlzIGNhbGxlZCBvbmNlIGlmIHRoZXJlIGlzIGEgcHJlZml4IG1hdGNoICh3aGljaCBjYW4gYmUgaW4gYW55IHJlbGF0aW9uc2hpcCB3aXRoIHRoZSBzb3VnaHQKKyAgICAgKiBrZXksIHRodXMgYXNzdW1lTm9NYXRjaDogZmFsc2UpLCBhbmQgaWYgaXQgcmV0dXJucyBudWxsIGl0IGlzIGNhbGxlZCBhZ2FpbiBmb3IgdGhlIGNsb3Nlc3QgZ3JlYXRlciBwb3NpdGlvbgorICAgICAqICh3aXRoIGFzc3VtZU5vTWF0Y2g6IHRydWUpLgorICAgICAqIFJldHVybnMgdGhlIGluZGV4IGVudHJ5IGF0IHRoaXMgcG9zaXRpb24sIG9yIG51bGwgaWYgdGhlIHNlYXJjaCBvcCByZWplY3RzIGl0LgorICAgICAqLworICAgIHByaXZhdGUgVHJpZUluZGV4RW50cnkgcmV0cmlldmVFbnRyeUlmQWNjZXB0YWJsZShPcGVyYXRvciBzZWFyY2hPcCwgUGFydGl0aW9uUG9zaXRpb24gc2VhcmNoS2V5LCBsb25nIHBvcywgYm9vbGVhbiBhc3N1bWVOb01hdGNoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChwb3MgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5IChGaWxlRGF0YUlucHV0IGluID0gcm93SW5kZXhGaWxlLmNyZWF0ZVJlYWRlcihwb3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhc3N1bWVOb01hdGNoKQorICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5za2lwU2hvcnRMZW5ndGgoaW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgaW5kZXhLZXkgPSBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGluKTsKKyAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGRlY29yYXRlZCA9IGRlY29yYXRlS2V5KGluZGV4S2V5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaE9wLmFwcGx5KGRlY29yYXRlZC5jb21wYXJlVG8oc2VhcmNoS2V5KSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gVHJpZUluZGV4RW50cnkuZGVzZXJpYWxpemUoaW4sIGluLmdldEZpbGVQb2ludGVyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcG9zID0gfnBvczsKKyAgICAgICAgICAgIGlmICghYXNzdW1lTm9NYXRjaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkgKEZpbGVEYXRhSW5wdXQgaW4gPSBkZmlsZS5jcmVhdGVSZWFkZXIocG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgaW5kZXhLZXkgPSBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGluKTsKKyAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGRlY29yYXRlZCA9IGRlY29yYXRlS2V5KGluZGV4S2V5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaE9wLmFwcGx5KGRlY29yYXRlZC5jb21wYXJlVG8oc2VhcmNoS2V5KSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgVHJpZUluZGV4RW50cnkocG9zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEZWNvcmF0ZWRLZXkga2V5QXRQb3NpdGlvbkZyb21TZWNvbmRhcnlJbmRleChsb25nIGtleVBvc2l0aW9uRnJvbVNlY29uZGFyeUluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzUmVhZGVyIHJlYWRlciA9IG9wZW5EYXRhUmVhZGVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlYWRlci5zZWVrKGtleVBvc2l0aW9uRnJvbVNlY29uZGFyeUluZGV4KTsKKyAgICAgICAgICAgIGlmIChyZWFkZXIuaXNFT0YoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBkZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKHJlYWRlcikpOworICAgICAgICB9CisgICAgfQorCisgICAgVHJpZUluZGV4RW50cnkgZ2V0RXhhY3RQb3NpdGlvbihEZWNvcmF0ZWRLZXkgZGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXBkYXRlU3RhdHMpCisgICAgeworICAgICAgICBpZiAoKGZpbHRlckZpcnN0KCkgJiYgZmlyc3QuY29tcGFyZVRvKGRrKSA+IDApIHx8IChmaWx0ZXJMYXN0KCkgJiYgbGFzdC5jb21wYXJlVG8oZGspIDwgMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vdGlmeVNraXBwZWQoU2tpcHBpbmdSZWFzb24uTUlOX01BWF9LRVlTLCBsaXN0ZW5lciwgRVEsIHVwZGF0ZVN0YXRzKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc1ByZXNlbnRJbkZpbHRlcihkaykpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vdGlmeVNraXBwZWQoU2tpcHBpbmdSZWFzb24uQkxPT01fRklMVEVSLCBsaXN0ZW5lciwgRVEsIHVwZGF0ZVN0YXRzKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IChQYXJ0aXRpb25JbmRleC5SZWFkZXIgcmVhZGVyID0gcGFydGl0aW9uSW5kZXgub3BlblJlYWRlcigpKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGluZGV4UG9zID0gcmVhZGVyLmV4YWN0Q2FuZGlkYXRlKGRrKTsKKyAgICAgICAgICAgIGlmIChpbmRleFBvcyA9PSBQYXJ0aXRpb25JbmRleC5OT1RfRk9VTkQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbm90aWZ5U2tpcHBlZChTa2lwcGluZ1JlYXNvbi5QQVJUSVRJT05fSU5ERVhfTE9PS1VQLCBsaXN0ZW5lciwgRVEsIHVwZGF0ZVN0YXRzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRmlsZUhhbmRsZSBmaDsKKyAgICAgICAgICAgIGxvbmcgc2Vla1Bvc2l0aW9uOworICAgICAgICAgICAgaWYgKGluZGV4UG9zID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmggPSByb3dJbmRleEZpbGU7CisgICAgICAgICAgICAgICAgc2Vla1Bvc2l0aW9uID0gaW5kZXhQb3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmggPSBkZmlsZTsKKyAgICAgICAgICAgICAgICBzZWVrUG9zaXRpb24gPSB+aW5kZXhQb3M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSAoRmlsZURhdGFJbnB1dCBpbiA9IGZoLmNyZWF0ZVJlYWRlcihzZWVrUG9zaXRpb24pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChCeXRlQnVmZmVyVXRpbC5lcXVhbHNXaXRoU2hvcnRMZW5ndGgoaW4sIGRrLmdldEtleSgpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRyaWVJbmRleEVudHJ5IHJpZSA9IGluZGV4UG9zID49IDAgPyBUcmllSW5kZXhFbnRyeS5kZXNlcmlhbGl6ZShpbiwgaW4uZ2V0RmlsZVBvaW50ZXIoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBUcmllSW5kZXhFbnRyeSh+aW5kZXhQb3MpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlTZWxlY3RlZChTZWxlY3Rpb25SZWFzb24uSU5ERVhfRU5UUllfRk9VTkQsIGxpc3RlbmVyLCBFUSwgdXBkYXRlU3RhdHMsIHJpZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByaWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeVNraXBwZWQoU2tpcHBpbmdSZWFzb24uSU5ERVhfRU5UUllfTk9UX0ZPVU5ELCBsaXN0ZW5lciwgRVEsIHVwZGF0ZVN0YXRzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiB8IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB8IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB8IEFzc2VydGlvbkVycm9yIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1hcmtTdXNwZWN0KCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24oZSwgcm93SW5kZXhGaWxlLnBhdGgoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBQYXJ0aXRpb25JdGVyYXRvciBsaXN0aW5nIGFsbCBwYXJ0aXRpb25zIHdpdGhpbiB0aGUgZ2l2ZW4gYm91bmRzLgorICAgICAqIFRoaXMgbWV0aG9kIHJlbGllcyBvbiBpdHMgY2FsbGVyIHRvIHByZXBhcmUgdGhlIGJvdW5kcyBjb3JyZWN0bHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYm91bmRzIEEgcmFuZ2Ugb2Yga2V5cy4gTXVzdCBub3QgYmUgYSB3cmFwYXJvdW5kIHJhbmdlLCBhbmQgd2lsbCBub3QgYmUgY2hlY2tlZCBhZ2FpbnN0CisgICAgICogICAgICAgICAgICAgICB0aGUgc3N0YWJsZSdzIGJvdW5kcyAoaS5lLiB0aGlzIHdpbGwgcmV0dXJuIGRhdGEgYmVmb3JlIGEgbW92ZWQgc3RhcnQgb3IgYWZ0ZXIgYW4gZWFybHktb3BlbiBsaW1pdCkKKyAgICAgKi8KKyAgICBQYXJ0aXRpb25JdGVyYXRvciBjb3ZlcmVkS2V5c0l0ZXJhdG9yKEFic3RyYWN0Qm91bmRzPFBhcnRpdGlvblBvc2l0aW9uPiBib3VuZHMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIFBhcnRpdGlvbkl0ZXJhdG9yLmNyZWF0ZShwYXJ0aXRpb25JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSgpLnBhcnRpdGlvbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0luZGV4RmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMubGVmdCwgYm91bmRzLmluY2x1c2l2ZUxlZnQoKSA/IC0xIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMucmlnaHQsIGJvdW5kcy5pbmNsdXNpdmVSaWdodCgpID8gMCA6IC0xKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NydWJQYXJ0aXRpb25JdGVyYXRvciBzY3J1YlBhcnRpdGlvbnNJdGVyYXRvcigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTY3J1Ykl0ZXJhdG9yKHBhcnRpdGlvbkluZGV4LCByb3dJbmRleEZpbGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXJ0aXRpb25JdGVyYXRvciBrZXlSZWFkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBQYXJ0aXRpb25JdGVyYXRvci5jcmVhdGUocGFydGl0aW9uSW5kZXgsIG1ldGFkYXRhKCkucGFydGl0aW9uZXIsIHJvd0luZGV4RmlsZSwgZGZpbGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJdGVyYWJsZTxEZWNvcmF0ZWRLZXk+IGdldEtleVNhbXBsZXMoZmluYWwgUmFuZ2U8VG9rZW4+IHJhbmdlKQorICAgIHsKKyAgICAgICAgLy8gQlRJIGRvZXMgbm90IHN1cHBvcnQga2V5IHNhbXBsaW5nIGFzIGl0IHdvdWxkIGludm9sdmUgd2Fsa2luZyB0aGUgaW5kZXggb3IgZGF0YSBmaWxlLgorICAgICAgICAvLyBWYWxpZGF0b3IgaGFzIGFuIGFsdGVybmF0ZSBzb2x1dGlvbiBmb3IgZW1wdHkga2V5IHNhbXBsZSBsaXN0cy4KKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGVzdGltYXRlZEtleXNGb3JSYW5nZXMoQ29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+IHJhbmdlcykKKyAgICB7CisgICAgICAgIC8vIEVzdGltYXRlIHRoZSBudW1iZXIgb2YgcGFydGl0aW9ucyBieSBjYWxjdWxhdGluZyB0aGUgYnl0ZXMgb2YgdGhlIHNzdGFibGUgdGhhdCBhcmUgY292ZXJlZCBieSB0aGUgc3BlY2lmaWVkCisgICAgICAgIC8vIHJhbmdlcyBhbmQgdXNpbmcgdGhlIG1lYW4gcGFydGl0aW9uIHNpemUgdG8gb2J0YWluIGEgbnVtYmVyIG9mIHBhcnRpdGlvbnMgZnJvbSB0aGF0LgorICAgICAgICBsb25nIHNlbGVjdGVkRGF0YVNpemUgPSAwOworICAgICAgICBmb3IgKFJhbmdlPFRva2VuPiByYW5nZSA6IFJhbmdlLm5vcm1hbGl6ZShyYW5nZXMpKQorICAgICAgICB7CisgICAgICAgICAgICBQYXJ0aXRpb25Qb3NpdGlvbiBsZWZ0ID0gcmFuZ2UubGVmdC5taW5LZXlCb3VuZCgpOworICAgICAgICAgICAgaWYgKGxlZnQuY29tcGFyZVRvKGZpcnN0KSA8PSAwKQorICAgICAgICAgICAgICAgIGxlZnQgPSBudWxsOworICAgICAgICAgICAgZWxzZSBpZiAobGVmdC5jb21wYXJlVG8obGFzdCkgPiAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgIC8vIG5vIGludGVyc2VjdGlvbgorCisgICAgICAgICAgICBQYXJ0aXRpb25Qb3NpdGlvbiByaWdodCA9IHJhbmdlLnJpZ2h0Lm1pbktleUJvdW5kKCk7CisgICAgICAgICAgICBpZiAocmFuZ2UucmlnaHQuaXNNaW5pbXVtKCkgfHwgcmlnaHQuY29tcGFyZVRvKGxhc3QpID49IDApCisgICAgICAgICAgICAgICAgcmlnaHQgPSBudWxsOworICAgICAgICAgICAgZWxzZSBpZiAocmlnaHQuY29tcGFyZVRvKGZpcnN0KSA8IDApCisgICAgICAgICAgICAgICAgY29udGludWU7ICAgLy8gbm8gaW50ZXJzZWN0aW9uCisKKyAgICAgICAgICAgIGlmIChsZWZ0ID09IG51bGwgJiYgcmlnaHQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFydGl0aW9uSW5kZXguc2l6ZSgpOyAgIC8vIHNzdGFibGUgaXMgZnVsbHkgY292ZXJlZCwgcmV0dXJuIGZ1bGwgcGFydGl0aW9uIGNvdW50IHRvIGF2b2lkIHJvdW5kaW5nIGVycm9ycworCisgICAgICAgICAgICBpZiAobGVmdCA9PSBudWxsICYmIGZpbHRlckZpcnN0KCkpCisgICAgICAgICAgICAgICAgbGVmdCA9IGZpcnN0OworICAgICAgICAgICAgaWYgKHJpZ2h0ID09IG51bGwgJiYgZmlsdGVyTGFzdCgpKQorICAgICAgICAgICAgICAgIHJpZ2h0ID0gbGFzdDsKKworICAgICAgICAgICAgbG9uZyBzdGFydFBvcyA9IGxlZnQgIT0gbnVsbCA/IGdldFBvc2l0aW9uKGxlZnQsIEdFKSA6IDA7CisgICAgICAgICAgICBsb25nIGVuZFBvcyA9IHJpZ2h0ICE9IG51bGwgPyBnZXRQb3NpdGlvbihyaWdodCwgR0UpIDogdW5jb21wcmVzc2VkTGVuZ3RoKCk7CisgICAgICAgICAgICBzZWxlY3RlZERhdGFTaXplICs9IGVuZFBvcyAtIHN0YXJ0UG9zOworICAgICAgICB9CisgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHNlbGVjdGVkRGF0YVNpemUgLyBzc3RhYmxlTWV0YWRhdGEuZXN0aW1hdGVkUGFydGl0aW9uU2l6ZS5yYXdNZWFuKCkpOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciByb3dJdGVyYXRvcihEZWNvcmF0ZWRLZXkga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xpY2VzIHNsaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbkZpbHRlciBzZWxlY3RlZENvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJldmVyc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXIpCisgICAgeworICAgICAgICByZXR1cm4gcm93SXRlcmF0b3IobnVsbCwga2V5LCBnZXRFeGFjdFBvc2l0aW9uKGtleSwgbGlzdGVuZXIsIHRydWUpLCBzbGljZXMsIHNlbGVjdGVkQ29sdW1ucywgcmV2ZXJzZWQpOworICAgIH0KKworICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3Igcm93SXRlcmF0b3IoRmlsZURhdGFJbnB1dCBkYXRhRmlsZUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWVJbmRleEVudHJ5IGluZGV4RW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbGljZXMgc2xpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uRmlsdGVyIHNlbGVjdGVkQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmV2ZXJzZWQpCisgICAgeworICAgICAgICBpZiAoaW5kZXhFbnRyeSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIFVuZmlsdGVyZWRSb3dJdGVyYXRvcnMubm9Sb3dzSXRlcmF0b3IobWV0YWRhdGEoKSwga2V5LCBSb3dzLkVNUFRZX1NUQVRJQ19ST1csIERlbGV0aW9uVGltZS5MSVZFLCByZXZlcnNlZCk7CisKKyAgICAgICAgaWYgKHJldmVyc2VkKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTU1RhYmxlUmV2ZXJzZWRJdGVyYXRvcih0aGlzLCBkYXRhRmlsZUlucHV0LCBrZXksIGluZGV4RW50cnksIHNsaWNlcywgc2VsZWN0ZWRDb2x1bW5zLCByb3dJbmRleEZpbGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbmV3IFNTVGFibGVJdGVyYXRvcih0aGlzLCBkYXRhRmlsZUlucHV0LCBrZXksIGluZGV4RW50cnksIHNsaWNlcywgc2VsZWN0ZWRDb2x1bW5zLCByb3dJbmRleEZpbGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJU1NUYWJsZVNjYW5uZXIgZ2V0U2Nhbm5lcigpCisgICAgeworICAgICAgICByZXR1cm4gQnRpVGFibGVTY2FubmVyLmdldFNjYW5uZXIodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElTU1RhYmxlU2Nhbm5lciBnZXRTY2FubmVyKENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+PiByYW5nZXMpCisgICAgeworICAgICAgICBpZiAocmFuZ2VzICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gQnRpVGFibGVTY2FubmVyLmdldFNjYW5uZXIodGhpcywgcmFuZ2VzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGdldFNjYW5uZXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVNTVGFibGVTY2FubmVyIGdldFNjYW5uZXIoSXRlcmF0b3I8QWJzdHJhY3RCb3VuZHM8UGFydGl0aW9uUG9zaXRpb24+PiByYW5nZUl0ZXJhdG9yKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ0aVRhYmxlU2Nhbm5lci5nZXRTY2FubmVyKHRoaXMsIHJhbmdlSXRlcmF0b3IpOworICAgIH0KKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdGlUYWJsZVJlYWRlciBjbG9uZUFuZFJlcGxhY2UoSUZpbHRlciBmaWx0ZXIpCisgICAgeworICAgICAgICByZXR1cm4gdW5idWlsZFRvKG5ldyBCdWlsZGVyKGRlc2NyaXB0b3IpLnNldEZpbHRlcihmaWx0ZXIpLCB0cnVlKS5idWlsZChvd25lcigpLm9yRWxzZShudWxsKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ0aVRhYmxlUmVhZGVyIGNsb25lV2l0aFJlc3RvcmVkU3RhcnQoRGVjb3JhdGVkS2V5IHJlc3RvcmVkU3RhcnQpCisgICAgeworICAgICAgICByZXR1cm4gcnVuV2l0aExvY2soaWdub3JlZCAtPiBjbG9uZUFuZFJlcGxhY2UocmVzdG9yZWRTdGFydCwgT3BlblJlYXNvbi5OT1JNQUwpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnRpVGFibGVSZWFkZXIgY2xvbmVXaXRoTmV3U3RhcnQoRGVjb3JhdGVkS2V5IG5ld1N0YXJ0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJ1bldpdGhMb2NrKGQgLT4geworICAgICAgICAgICAgYXNzZXJ0IG9wZW5SZWFzb24gIT0gT3BlblJlYXNvbi5FQVJMWSA6ICJDYW5ub3Qgb3BlbiBlYXJseSBhbiBlYXJseS1vcGVuIFNTVGFibGUiOworICAgICAgICAgICAgaWYgKG5ld1N0YXJ0LmNvbXBhcmVUbyhmaXJzdCkgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgZGF0YVN0YXJ0ID0gZ2V0UG9zaXRpb24obmV3U3RhcnQsIE9wZXJhdG9yLkVRKTsKKyAgICAgICAgICAgICAgICBydW5PbkNsb3NlKCgpIC0+IGRmaWxlLmRyb3BQYWdlQ2FjaGUoZGF0YVN0YXJ0KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBjbG9uZUFuZFJlcGxhY2UobmV3U3RhcnQsIE9wZW5SZWFzb24uTU9WRURfU1RBUlQpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9uZSB0aGlzIHJlYWRlciB3aXRoIHRoZSBwcm92aWRlZCBzdGFydCBhbmQgb3BlbiByZWFzb24sIGFuZCBzZXQgdGhlIGNsb25lIGFzIHJlcGxhY2VtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIG5ld0ZpcnN0IHRoZSBmaXJzdCBrZXkgZm9yIHRoZSByZXBsYWNlbWVudCAod2hpY2ggY2FuIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBkdWUgdG8gdGhlIHByZS1lbXB0aXZlCisgICAgICogICAgICAgICAgICAgICAgIG9wZW5pbmcgb2YgY29tcGFjdGlvbiByZXN1bHRzKS4KKyAgICAgKiBAcGFyYW0gcmVhc29uICAgdGhlIHtAY29kZSBPcGVuUmVhc29ufSBmb3IgdGhlIHJlcGxhY2VtZW50LgorICAgICAqIEByZXR1cm4gdGhlIGNsb25lZCByZWFkZXIuIFRoYXQgcmVhZGVyIGlzIHNldCBhcyBhIHJlcGxhY2VtZW50IGJ5IHRoZSBtZXRob2QuCisgICAgICovCisgICAgcHJpdmF0ZSBCdGlUYWJsZVJlYWRlciBjbG9uZUFuZFJlcGxhY2UoRGVjb3JhdGVkS2V5IG5ld0ZpcnN0LCBPcGVuUmVhc29uIHJlYXNvbikKKyAgICB7CisgICAgICAgIHJldHVybiB1bmJ1aWxkVG8obmV3IEJ1aWxkZXIoZGVzY3JpcHRvciksIHRydWUpCisgICAgICAgICAgICAgICAuc2V0Rmlyc3QobmV3Rmlyc3QpCisgICAgICAgICAgICAgICAuc2V0T3BlblJlYXNvbihyZWFzb24pCisgICAgICAgICAgICAgICAuYnVpbGQob3duZXIoKS5vckVsc2UobnVsbCksIHRydWUsIHRydWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEZWNvcmF0ZWRLZXkgZmlyc3RLZXlCZXlvbmQoUGFydGl0aW9uUG9zaXRpb24gdG9rZW4pCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgVHJpZUluZGV4RW50cnkgcG9zID0gZ2V0Um93SW5kZXhFbnRyeSh0b2tlbiwgT3BlcmF0b3IuR1QsIHRydWUsIFNTVGFibGVSZWFkc0xpc3RlbmVyLk5PT1BfTElTVEVORVIpOworICAgICAgICAgICAgaWYgKHBvcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICB0cnkgKEZpbGVEYXRhSW5wdXQgaW4gPSBkZmlsZS5jcmVhdGVSZWFkZXIocG9zLnBvc2l0aW9uKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGluZGV4S2V5ID0gQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChpbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29yYXRlS2V5KGluZGV4S2V5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgbWFya1N1c3BlY3QoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihlLCBkZmlsZS5wYXRoKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVsZWFzZUluTWVtb3J5Q29tcG9uZW50cygpCisgICAgeworICAgICAgICBjbG9zZUludGVybmFsQ29tcG9uZW50KHBhcnRpdGlvbkluZGV4KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VzdGltYXRpb25JbmZvcm1hdGl2ZSgpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yIHBhcnRpdGlvbkl0ZXJhdG9yKENvbHVtbkZpbHRlciBjb2x1bW5GaWx0ZXIsIERhdGFSYW5nZSBkYXRhUmFuZ2UsIFNTVGFibGVSZWFkc0xpc3RlbmVyIGxpc3RlbmVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ0aVRhYmxlU2Nhbm5lci5nZXRTY2FubmVyKHRoaXMsIGNvbHVtbkZpbHRlciwgZGF0YVJhbmdlLCBsaXN0ZW5lcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElWZXJpZmllciBnZXRWZXJpZmllcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIE91dHB1dEhhbmRsZXIgb3V0cHV0SGFuZGxlciwgYm9vbGVhbiBpc09mZmxpbmUsIElWZXJpZmllci5PcHRpb25zIG9wdGlvbnMpCisgICAgeworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQoY2ZzLm1ldGFkYXRhKCkuZXF1YWxzKG1ldGFkYXRhKCkpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBCdGlUYWJsZVZlcmlmaWVyKGNmcywgdGhpcywgb3V0cHV0SGFuZGxlciwgaXNPZmZsaW5lLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyV2l0aEZpbHRlci5CdWlsZGVyPEJ0aVRhYmxlUmVhZGVyLCBCdWlsZGVyPgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBQYXJ0aXRpb25JbmRleCBwYXJ0aXRpb25JbmRleDsKKyAgICAgICAgcHJpdmF0ZSBGaWxlSGFuZGxlIHJvd0luZGV4RmlsZTsKKworICAgICAgICBwdWJsaWMgQnVpbGRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGRlc2NyaXB0b3IpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Um93SW5kZXhGaWxlKEZpbGVIYW5kbGUgcm93SW5kZXhGaWxlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnJvd0luZGV4RmlsZSA9IHJvd0luZGV4RmlsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UGFydGl0aW9uSW5kZXgoUGFydGl0aW9uSW5kZXggcGFydGl0aW9uSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucGFydGl0aW9uSW5kZXggPSBwYXJ0aXRpb25JbmRleDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFBhcnRpdGlvbkluZGV4IGdldFBhcnRpdGlvbkluZGV4KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBhcnRpdGlvbkluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEZpbGVIYW5kbGUgZ2V0Um93SW5kZXhGaWxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHJvd0luZGV4RmlsZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQnRpVGFibGVSZWFkZXIgYnVpbGRJbnRlcm5hbChPd25lciBvd25lcikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCdGlUYWJsZVJlYWRlcih0aGlzLCBvd25lcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvQnRpVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL0J0aVRhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmU2OTI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL0J0aVRhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXIuamF2YQpAQCAtMCwwICsxLDIwOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5idGk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkNvbXByZXNzaW9uTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5LZXlSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LkNvbXByZXNzaW9uSW5mb0NvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5GaWx0ZXJDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU29ydGVkVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TdGF0c0NvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5idGkuQnRpRm9ybWF0LkNvbXBvbmVudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5TdGF0c01ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuVmFsaWRhdGlvbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlRhYmxlTWV0cmljczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GaWx0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLklGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworcHVibGljIGNsYXNzIEJ0aVRhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXIgZXh0ZW5kcyBTb3J0ZWRUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyPEJ0aVRhYmxlUmVhZGVyLCBCdGlUYWJsZVJlYWRlci5CdWlsZGVyPgoreworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihCdGlUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyLmNsYXNzKTsKKworICAgIHByaXZhdGUgRmlsZUhhbmRsZS5CdWlsZGVyIHBhcnRpdGlvbkluZGV4RmlsZUJ1aWxkZXI7CisgICAgcHJpdmF0ZSBGaWxlSGFuZGxlLkJ1aWxkZXIgcm93SW5kZXhGaWxlQnVpbGRlcjsKKworICAgIHB1YmxpYyBCdGlUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyKFNTVGFibGUuQnVpbGRlcjw/LCA/PiBidWlsZGVyKQorICAgIHsKKyAgICAgICAgc3VwZXIoYnVpbGRlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEtleVJlYWRlciBidWlsZEtleVJlYWRlcihUYWJsZU1ldHJpY3MgdGFibGVNZXRyaWNzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0YXRzQ29tcG9uZW50IHN0YXRzQ29tcG9uZW50ID0gU3RhdHNDb21wb25lbnQubG9hZChkZXNjcmlwdG9yLCBNZXRhZGF0YVR5cGUuU1RBVFMsIE1ldGFkYXRhVHlwZS5IRUFERVIsIE1ldGFkYXRhVHlwZS5WQUxJREFUSU9OKTsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUtleVJlYWRlcihzdGF0c0NvbXBvbmVudC5zdGF0c01ldGFkYXRhKCkpOworICAgIH0KKworICAgIHByaXZhdGUgS2V5UmVhZGVyIGNyZWF0ZUtleVJlYWRlcihTdGF0c01ldGFkYXRhIHN0YXRzTWV0YWRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY2hlY2tOb3ROdWxsKHN0YXRzTWV0YWRhdGEpOworCisgICAgICAgIHRyeSAoUGFydGl0aW9uSW5kZXggaW5kZXggPSBQYXJ0aXRpb25JbmRleC5sb2FkKHBhcnRpdGlvbkluZGV4RmlsZUJ1aWxkZXIoKSwgdGFibGVNZXRhZGF0YVJlZi5nZXRMb2NhbCgpLnBhcnRpdGlvbmVyLCBmYWxzZSk7CisgICAgICAgICAgICAgQ29tcHJlc3Npb25NZXRhZGF0YSBjb21wcmVzc2lvbk1ldGFkYXRhID0gQ29tcHJlc3Npb25JbmZvQ29tcG9uZW50Lm1heWJlTG9hZChkZXNjcmlwdG9yLCBjb21wb25lbnRzKTsKKyAgICAgICAgICAgICBGaWxlSGFuZGxlIGRGaWxlID0gZGF0YUZpbGVCdWlsZGVyKHN0YXRzTWV0YWRhdGEpLndpdGhDb21wcmVzc2lvbk1ldGFkYXRhKGNvbXByZXNzaW9uTWV0YWRhdGEpLmNvbXBsZXRlKCk7CisgICAgICAgICAgICAgRmlsZUhhbmRsZSByaUZpbGUgPSByb3dJbmRleEZpbGVCdWlsZGVyKCkuY29tcGxldGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFBhcnRpdGlvbkl0ZXJhdG9yLmNyZWF0ZShpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVNZXRhZGF0YVJlZi5nZXRMb2NhbCgpLnBhcnRpdGlvbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRGaWxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9wZW5Db21wb25lbnRzKEJ0aVRhYmxlUmVhZGVyLkJ1aWxkZXIgYnVpbGRlciwgU1NUYWJsZS5Pd25lciBvd25lciwgYm9vbGVhbiB2YWxpZGF0ZSwgYm9vbGVhbiBvbmxpbmUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFN0YXRzQ29tcG9uZW50IHN0YXRzQ29tcG9uZW50ID0gU3RhdHNDb21wb25lbnQubG9hZChkZXNjcmlwdG9yLCBNZXRhZGF0YVR5cGUuU1RBVFMsIE1ldGFkYXRhVHlwZS5WQUxJREFUSU9OLCBNZXRhZGF0YVR5cGUuSEVBREVSKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0U2VyaWFsaXphdGlvbkhlYWRlcihzdGF0c0NvbXBvbmVudC5zZXJpYWxpemF0aW9uSGVhZGVyKGJ1aWxkZXIuZ2V0VGFibGVNZXRhZGF0YVJlZigpLmdldExvY2FsKCkpKTsKKyAgICAgICAgICAgIGNoZWNrQXJndW1lbnQoIW9ubGluZSB8fCBidWlsZGVyLmdldFNlcmlhbGl6YXRpb25IZWFkZXIoKSAhPSBudWxsKTsKKworICAgICAgICAgICAgYnVpbGRlci5zZXRTdGF0c01ldGFkYXRhKHN0YXRzQ29tcG9uZW50LnN0YXRzTWV0YWRhdGEoKSk7CisgICAgICAgICAgICBWYWxpZGF0aW9uTWV0YWRhdGEgdmFsaWRhdGlvbk1ldGFkYXRhID0gc3RhdHNDb21wb25lbnQudmFsaWRhdGlvbk1ldGFkYXRhKCk7CisgICAgICAgICAgICB2YWxpZGF0ZVBhcnRpdGlvbmVyKGJ1aWxkZXIuZ2V0VGFibGVNZXRhZGF0YVJlZigpLmdldExvY2FsKCksIHZhbGlkYXRpb25NZXRhZGF0YSk7CisKKyAgICAgICAgICAgIGJvb2xlYW4gZmlsdGVyTmVlZGVkID0gb25saW5lOworICAgICAgICAgICAgaWYgKGZpbHRlck5lZWRlZCkKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldEZpbHRlcihsb2FkRmlsdGVyKHZhbGlkYXRpb25NZXRhZGF0YSkpOworICAgICAgICAgICAgYm9vbGVhbiByZWJ1aWxkRmlsdGVyID0gZmlsdGVyTmVlZGVkICYmIGJ1aWxkZXIuZ2V0RmlsdGVyKCkgPT0gbnVsbDsKKworICAgICAgICAgICAgaWYgKGJ1aWxkZXIuZ2V0Q29tcG9uZW50cygpLmNvbnRhaW5zKENvbXBvbmVudHMuUEFSVElUSU9OX0lOREVYKSAmJiBidWlsZGVyLmdldENvbXBvbmVudHMoKS5jb250YWlucyhDb21wb25lbnRzLlJPV19JTkRFWCkgJiYgcmVidWlsZEZpbHRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyZXNvdXJjZSIsICJSZWR1bmRhbnRTdXBwcmVzc2lvbiIgfSkKKyAgICAgICAgICAgICAgICBJRmlsdGVyIGZpbHRlciA9IGJ1aWxkQmxvb21GaWx0ZXIoc3RhdHNDb21wb25lbnQuc3RhdHNNZXRhZGF0YSgpKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldEZpbHRlcihmaWx0ZXIpOworICAgICAgICAgICAgICAgIEZpbHRlckNvbXBvbmVudC5zYXZlKGZpbHRlciwgZGVzY3JpcHRvciwgZmFsc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYnVpbGRlci5nZXRGaWx0ZXIoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0RmlsdGVyKEZpbHRlckZhY3RvcnkuQWx3YXlzUHJlc2VudCk7CisKKyAgICAgICAgICAgIGlmIChidWlsZGVyLmdldENvbXBvbmVudHMoKS5jb250YWlucyhDb21wb25lbnRzLlJPV19JTkRFWCkpCisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRSb3dJbmRleEZpbGUocm93SW5kZXhGaWxlQnVpbGRlcigpLmNvbXBsZXRlKCkpOworCisgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci52ZXJzaW9uLmhhc0tleVJhbmdlKCkgJiYgYnVpbGRlci5nZXRTdGF0c01ldGFkYXRhKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSB0YWJsZU1ldGFkYXRhUmVmLmdldExvY2FsKCkucGFydGl0aW9uZXI7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRGaXJzdChwYXJ0aXRpb25lci5kZWNvcmF0ZUtleShidWlsZGVyLmdldFN0YXRzTWV0YWRhdGEoKS5maXJzdEtleSkpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0TGFzdChwYXJ0aXRpb25lci5kZWNvcmF0ZUtleShidWlsZGVyLmdldFN0YXRzTWV0YWRhdGEoKS5sYXN0S2V5KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChidWlsZGVyLmdldENvbXBvbmVudHMoKS5jb250YWlucyhDb21wb25lbnRzLlBBUlRJVElPTl9JTkRFWCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRQYXJ0aXRpb25JbmRleChvcGVuUGFydGl0aW9uSW5kZXgoYnVpbGRlci5nZXRGaWx0ZXIoKS5pc0luZm9ybWF0aXZlKCkpKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVpbGRlci5nZXRGaXJzdCgpID09IG51bGwgfHwgYnVpbGRlci5nZXRMYXN0KCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0Rmlyc3QoYnVpbGRlci5nZXRQYXJ0aXRpb25JbmRleCgpLmZpcnN0S2V5KCkpOworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnNldExhc3QoYnVpbGRlci5nZXRQYXJ0aXRpb25JbmRleCgpLmxhc3RLZXkoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgKENvbXByZXNzaW9uTWV0YWRhdGEgY29tcHJlc3Npb25NZXRhZGF0YSA9IENvbXByZXNzaW9uSW5mb0NvbXBvbmVudC5tYXliZUxvYWQoZGVzY3JpcHRvciwgY29tcG9uZW50cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXREYXRhRmlsZShkYXRhRmlsZUJ1aWxkZXIoYnVpbGRlci5nZXRTdGF0c01ldGFkYXRhKCkpLndpdGhDb21wcmVzc2lvbk1ldGFkYXRhKGNvbXByZXNzaW9uTWV0YWRhdGEpLmNvbXBsZXRlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiB8IFJ1bnRpbWVFeGNlcHRpb24gfCBFcnJvciBleCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaW4gY2FzZSBvZiBmYWlsdXJlLCBjbG9zZSBvbmx5IHRob3NlIGNvbXBvbmVudHMgd2hpY2ggaGF2ZSBiZWVuIG9wZW5lZCBpbiB0aGlzIHRyeS1jYXRjaCBibG9jaworICAgICAgICAgICAgVGhyb3dhYmxlcy5jbG9zZUFuZEFkZFN1cHByZXNzZWQoZXgsIGJ1aWxkZXIuZ2V0UGFydGl0aW9uSW5kZXgoKSwgYnVpbGRlci5nZXRSb3dJbmRleEZpbGUoKSwgYnVpbGRlci5nZXREYXRhRmlsZSgpLCBidWlsZGVyLmdldEZpbHRlcigpKTsKKyAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBJRmlsdGVyIGJ1aWxkQmxvb21GaWx0ZXIoU3RhdHNNZXRhZGF0YSBzdGF0c01ldGFkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIElGaWx0ZXIgYmYgPSBudWxsOworCisgICAgICAgIHRyeSAoS2V5UmVhZGVyIGtleVJlYWRlciA9IGNyZWF0ZUtleVJlYWRlcihzdGF0c01ldGFkYXRhKSkKKyAgICAgICAgeworICAgICAgICAgICAgYmYgPSBGaWx0ZXJGYWN0b3J5LmdldEZpbHRlcihzdGF0c01ldGFkYXRhLnRvdGFsUm93cywgdGFibGVNZXRhZGF0YVJlZi5nZXRMb2NhbCgpLnBhcmFtcy5ibG9vbUZpbHRlckZwQ2hhbmNlKTsKKworICAgICAgICAgICAgd2hpbGUgKCFrZXlSZWFkZXIuaXNFeGhhdXN0ZWQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gdGFibGVNZXRhZGF0YVJlZi5nZXRMb2NhbCgpLnBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KGtleVJlYWRlci5rZXkoKSk7CisgICAgICAgICAgICAgICAgYmYuYWRkKGtleSk7CisKKyAgICAgICAgICAgICAgICBrZXlSZWFkZXIuYWR2YW5jZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiB8IFJ1bnRpbWVFeGNlcHRpb24gfCBFcnJvciBleCkKKyAgICAgICAgeworICAgICAgICAgICAgVGhyb3dhYmxlcy5jbG9zZUFuZEFkZFN1cHByZXNzZWQoZXgsIGJmKTsKKyAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJmOworICAgIH0KKworICAgIHByaXZhdGUgUGFydGl0aW9uSW5kZXggb3BlblBhcnRpdGlvbkluZGV4KGJvb2xlYW4gcHJlbG9hZCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKEZpbGVIYW5kbGUgaW5kZXhGaWxlID0gcGFydGl0aW9uSW5kZXhGaWxlQnVpbGRlcigpLmNvbXBsZXRlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBQYXJ0aXRpb25JbmRleC5sb2FkKGluZGV4RmlsZSwgdGFibGVNZXRhZGF0YVJlZi5nZXRMb2NhbCgpLnBhcnRpdGlvbmVyLCBwcmVsb2FkKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiUGFydGl0aW9uIGluZGV4IGZpbGUgaXMgY29ycnVwdGVkOiAiICsgZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuUEFSVElUSU9OX0lOREVYKSwgZXgpOworICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEZpbGVIYW5kbGUuQnVpbGRlciByb3dJbmRleEZpbGVCdWlsZGVyKCkKKyAgICB7CisgICAgICAgIGFzc2VydCByb3dJbmRleEZpbGVCdWlsZGVyID09IG51bGwgfHwgcm93SW5kZXhGaWxlQnVpbGRlci5maWxlLmVxdWFscyhkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5ST1dfSU5ERVgpKTsKKworICAgICAgICBpZiAocm93SW5kZXhGaWxlQnVpbGRlciA9PSBudWxsKQorICAgICAgICAgICAgcm93SW5kZXhGaWxlQnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuUk9XX0lOREVYKSk7CisKKyAgICAgICAgcm93SW5kZXhGaWxlQnVpbGRlci53aXRoQ2h1bmtDYWNoZShjaHVua0NhY2hlKTsKKyAgICAgICAgcm93SW5kZXhGaWxlQnVpbGRlci5tbWFwcGVkKGlvT3B0aW9ucy5pbmRleERpc2tBY2Nlc3NNb2RlKTsKKworICAgICAgICByZXR1cm4gcm93SW5kZXhGaWxlQnVpbGRlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIEZpbGVIYW5kbGUuQnVpbGRlciBwYXJ0aXRpb25JbmRleEZpbGVCdWlsZGVyKCkKKyAgICB7CisgICAgICAgIGFzc2VydCBwYXJ0aXRpb25JbmRleEZpbGVCdWlsZGVyID09IG51bGwgfHwgcGFydGl0aW9uSW5kZXhGaWxlQnVpbGRlci5maWxlLmVxdWFscyhkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5QQVJUSVRJT05fSU5ERVgpKTsKKworICAgICAgICBpZiAocGFydGl0aW9uSW5kZXhGaWxlQnVpbGRlciA9PSBudWxsKQorICAgICAgICAgICAgcGFydGl0aW9uSW5kZXhGaWxlQnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuUEFSVElUSU9OX0lOREVYKSk7CisKKyAgICAgICAgcGFydGl0aW9uSW5kZXhGaWxlQnVpbGRlci53aXRoQ2h1bmtDYWNoZShjaHVua0NhY2hlKTsKKyAgICAgICAgcGFydGl0aW9uSW5kZXhGaWxlQnVpbGRlci5tbWFwcGVkKGlvT3B0aW9ucy5pbmRleERpc2tBY2Nlc3NNb2RlKTsKKworICAgICAgICByZXR1cm4gcGFydGl0aW9uSW5kZXhGaWxlQnVpbGRlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvQnRpVGFibGVTY2FubmVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvQnRpVGFibGVTY2FubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmODYyYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9CdGlUYWJsZVNjYW5uZXIuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpOworCitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhdG9yczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRhdGFSYW5nZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUGFydGl0aW9uUG9zaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNsdXN0ZXJpbmdJbmRleEZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5BYnN0cmFjdEJvdW5kczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVJlYWRzTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CisKK3B1YmxpYyBjbGFzcyBCdGlUYWJsZVNjYW5uZXIgZXh0ZW5kcyBTU1RhYmxlU2Nhbm5lcjxCdGlUYWJsZVJlYWRlciwgVHJpZUluZGV4RW50cnksIEJ0aVRhYmxlU2Nhbm5lci5CdGlTY2FubmluZ0l0ZXJhdG9yPgoreworICAgIC8vIEZ1bGwgc2NhbiBvZiB0aGUgc3N0YWJsZXMKKyAgICBwdWJsaWMgc3RhdGljIEJ0aVRhYmxlU2Nhbm5lciBnZXRTY2FubmVyKEJ0aVRhYmxlUmVhZGVyIHNzdGFibGUpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0U2Nhbm5lcihzc3RhYmxlLCBJdGVyYXRvcnMuc2luZ2xldG9uSXRlcmF0b3IoZnVsbFJhbmdlKHNzdGFibGUpKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBCdGlUYWJsZVNjYW5uZXIgZ2V0U2Nhbm5lcihCdGlUYWJsZVJlYWRlciBzc3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uRmlsdGVyIGNvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhUmFuZ2UgZGF0YVJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXIpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEJ0aVRhYmxlU2Nhbm5lcihzc3RhYmxlLCBjb2x1bW5zLCBkYXRhUmFuZ2UsIG1ha2VCb3VuZHMoc3N0YWJsZSwgZGF0YVJhbmdlKS5pdGVyYXRvcigpLCBsaXN0ZW5lcik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBCdGlUYWJsZVNjYW5uZXIgZ2V0U2Nhbm5lcihCdGlUYWJsZVJlYWRlciBzc3RhYmxlLCBDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4gdG9rZW5SYW5nZXMpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0U2Nhbm5lcihzc3RhYmxlLCBtYWtlQm91bmRzKHNzdGFibGUsIHRva2VuUmFuZ2VzKS5pdGVyYXRvcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEJ0aVRhYmxlU2Nhbm5lciBnZXRTY2FubmVyKEJ0aVRhYmxlUmVhZGVyIHNzdGFibGUsIEl0ZXJhdG9yPEFic3RyYWN0Qm91bmRzPFBhcnRpdGlvblBvc2l0aW9uPj4gcmFuZ2VJdGVyYXRvcikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQnRpVGFibGVTY2FubmVyKHNzdGFibGUsIENvbHVtbkZpbHRlci5hbGwoc3N0YWJsZS5tZXRhZGF0YSgpKSwgbnVsbCwgcmFuZ2VJdGVyYXRvciwgU1NUYWJsZVJlYWRzTGlzdGVuZXIuTk9PUF9MSVNURU5FUik7CisgICAgfQorCisgICAgcHJpdmF0ZSBCdGlUYWJsZVNjYW5uZXIoQnRpVGFibGVSZWFkZXIgc3N0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5GaWx0ZXIgY29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhUmFuZ2UgZGF0YVJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPEFic3RyYWN0Qm91bmRzPFBhcnRpdGlvblBvc2l0aW9uPj4gcmFuZ2VJdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICB7CisgICAgICAgIHN1cGVyKHNzdGFibGUsIGNvbHVtbnMsIGRhdGFSYW5nZSwgcmFuZ2VJdGVyYXRvciwgbGlzdGVuZXIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGRvQ2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIEZpbGVVdGlscy5jbG9zZShkZmlsZSwgaXRlcmF0b3IpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBCdGlTY2FubmluZ0l0ZXJhdG9yIGRvQ3JlYXRlSXRlcmF0b3IoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCdGlTY2FubmluZ0l0ZXJhdG9yKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGNsYXNzIEJ0aVNjYW5uaW5nSXRlcmF0b3IgZXh0ZW5kcyBTU1RhYmxlU2Nhbm5lcjxCdGlUYWJsZVJlYWRlciwgVHJpZUluZGV4RW50cnksIEJ0aVRhYmxlU2Nhbm5lci5CdGlTY2FubmluZ0l0ZXJhdG9yPi5CYXNlS2V5U2Nhbm5pbmdJdGVyYXRvciBpbXBsZW1lbnRzIENsb3NlYWJsZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBQYXJ0aXRpb25JdGVyYXRvciBpdGVyYXRvcjsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZVRvSXRlcmF0ZVJvdygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRTY2FuICE9IC0xKQorICAgICAgICAgICAgICAgICAgICBieXRlc1NjYW5uZWQgKz0gZ2V0Q3VycmVudFBvc2l0aW9uKCkgLSBzdGFydFNjYW47CisKKyAgICAgICAgICAgICAgICBpZiAoaXRlcmF0b3IgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbnRyeSA9IGl0ZXJhdG9yLmVudHJ5KCk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRLZXkgPSBpdGVyYXRvci5kZWNvcmF0ZWRLZXkoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbnRyeSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpdGVyYXRvciA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gdHJ5IG5leHQgcmFuZ2UKKyAgICAgICAgICAgICAgICBpZiAoIXJhbmdlSXRlcmF0b3IuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgaXRlcmF0b3IgPSBzc3RhYmxlLmNvdmVyZWRLZXlzSXRlcmF0b3IocmFuZ2VJdGVyYXRvci5uZXh0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkUm93SXRlcmF0b3IgZ2V0Um93SXRlcmF0b3IoVHJpZUluZGV4RW50cnkgaW5kZXhFbnRyeSwgRGVjb3JhdGVkS2V5IGtleSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRhdGFSYW5nZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzc3RhYmxlLnNpbXBsZUl0ZXJhdG9yKGRmaWxlLCBrZXksIGluZGV4RW50cnkucG9zaXRpb24sIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbHVzdGVyaW5nSW5kZXhGaWx0ZXIgZmlsdGVyID0gZGF0YVJhbmdlLmNsdXN0ZXJpbmdJbmRleEZpbHRlcihrZXkpOworICAgICAgICAgICAgICAgIHJldHVybiBzc3RhYmxlLnJvd0l0ZXJhdG9yKGRmaWxlLCBrZXksIGluZGV4RW50cnksIGZpbHRlci5nZXRTbGljZXMoQnRpVGFibGVTY2FubmVyLnRoaXMubWV0YWRhdGEoKSksIGNvbHVtbnMsIGZpbHRlci5pc1JldmVyc2VkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIuY2xvc2UoKTsgIC8vIGNhbid0IHRocm93CisgICAgICAgICAgICBpZiAoaXRlcmF0b3IgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBpdGVyYXRvci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL0J0aVRhYmxlU2NydWJiZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9CdGlUYWJsZVNjcnViYmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM4ZWQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9CdGlUYWJsZVNjcnViYmVyLmphdmEKQEAgLTAsMCArMSwzMTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aTsKKworaW1wb3J0IGphdmEuaW8uSU9FcnJvcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkludGVycnVwdGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU2NydWJiZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmV3cml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU29ydGVkVGFibGVTY3J1YmJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5idGkuQnRpRm9ybWF0LkNvbXBvbmVudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT3V0cHV0SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOworCitwdWJsaWMgY2xhc3MgQnRpVGFibGVTY3J1YmJlciBleHRlbmRzIFNvcnRlZFRhYmxlU2NydWJiZXI8QnRpVGFibGVSZWFkZXI+IGltcGxlbWVudHMgSVNjcnViYmVyCit7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzSW5kZXg7CisgICAgcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdFR5cGU8Pz4gcGFydGl0aW9uS2V5VHlwZTsKKyAgICBwcml2YXRlIFNjcnViUGFydGl0aW9uSXRlcmF0b3IgaW5kZXhJdGVyYXRvcjsKKworICAgIHB1YmxpYyBCdGlUYWJsZVNjcnViYmVyKENvbHVtbkZhbWlseVN0b3JlIGNmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRIYW5kbGVyIG91dHB1dEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNjcnViYmVyLk9wdGlvbnMgb3B0aW9ucykKKyAgICB7CisgICAgICAgIHN1cGVyKGNmcywgdHJhbnNhY3Rpb24sIG91dHB1dEhhbmRsZXIsIG9wdGlvbnMpOworCisgICAgICAgIGJvb2xlYW4gaGFzSW5kZXhGaWxlID0gc3N0YWJsZS5nZXRDb21wb25lbnRzKCkuY29udGFpbnMoQ29tcG9uZW50cy5QQVJUSVRJT05fSU5ERVgpOworICAgICAgICB0aGlzLmlzSW5kZXggPSBjZnMuaXNJbmRleCgpOworICAgICAgICB0aGlzLnBhcnRpdGlvbktleVR5cGUgPSBjZnMubWV0YWRhdGEuZ2V0KCkucGFydGl0aW9uS2V5VHlwZTsKKyAgICAgICAgaWYgKCFoYXNJbmRleEZpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlmIHRoZXJlJ3MgYW55IGNvcnJ1cHRpb24gaW4gdGhlIC1EYXRhLmRiIHRoZW4gcGFydGl0aW9ucyBjYW4ndCBiZSBza2lwcGVkIG92ZXIuIGJ1dCBpdCdzIHdvcnRoIGEgc2hvdC4KKyAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2FybigiTWlzc2luZyBpbmRleCBjb21wb25lbnQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmluZGV4SXRlcmF0b3IgPSBoYXNJbmRleEZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gb3BlbkluZGV4SXRlcmF0b3IoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KQorICAgICAgICB7CisgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4oIkRldGVjdGVkIGNvcnJ1cHRpb24gaW4gdGhlIGluZGV4IGZpbGUgLSBjYW5ub3Qgb3BlbiBpbmRleCBpdGVyYXRvciIsIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU2NydWJQYXJ0aXRpb25JdGVyYXRvciBvcGVuSW5kZXhJdGVyYXRvcigpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNzdGFibGUuc2NydWJQYXJ0aXRpb25zSXRlcmF0b3IoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2Fybih0LCAiSW5kZXggaXMgdW5yZWFkYWJsZSwgc2NydWJiaW5nIHdpbGwgY29udGludWUgd2l0aG91dCBpbmRleC4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHdpdGhWYWxpZGF0aW9uKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyLCBTdHJpbmcgZmlsZW5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gb3B0aW9ucy5jaGVja0RhdGEgJiYgIWlzSW5kZXggPyBVbmZpbHRlcmVkUm93SXRlcmF0b3JzLndpdGhWYWxpZGF0aW9uKGl0ZXIsIGZpbGVuYW1lKSA6IGl0ZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2NydWJJbnRlcm5hbChTU1RhYmxlUmV3cml0ZXIgd3JpdGVyKQorICAgIHsKKyAgICAgICAgaWYgKGluZGV4QXZhaWxhYmxlKCkgJiYgaW5kZXhJdGVyYXRvci5kYXRhUG9zaXRpb24oKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4oIkZpcnN0IHBvc2l0aW9uIHJlcG9ydGVkIGJ5IGluZGV4IHNob3VsZCBiZSAwLCB3YXMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhJdGVyYXRvci5kYXRhUG9zaXRpb24oKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgY29udGludWluZyB3aXRob3V0IGluZGV4LiIpOworICAgICAgICAgICAgaW5kZXhJdGVyYXRvci5jbG9zZSgpOworICAgICAgICAgICAgaW5kZXhJdGVyYXRvciA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBEZWNvcmF0ZWRLZXkgcHJldktleSA9IG51bGw7CisKKyAgICAgICAgd2hpbGUgKCFkYXRhRmlsZS5pc0VPRigpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2NydWJJbmZvLmlzU3RvcFJlcXVlc3RlZCgpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb24oc2NydWJJbmZvLmdldENvbXBhY3Rpb25JbmZvKCkpOworCisgICAgICAgICAgICAvLyBwb3NpdGlvbiBpbiBhIGRhdGEgZmlsZSB3aGVyZSB0aGUgcGFydGl0aW9uIHN0YXJ0cworICAgICAgICAgICAgbG9uZyBkYXRhU3RhcnQgPSBkYXRhRmlsZS5nZXRGaWxlUG9pbnRlcigpOworICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5kZWJ1ZygiUmVhZGluZyByb3cgYXQgJWQiLCBkYXRhU3RhcnQpOworCisgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gbnVsbDsKKyAgICAgICAgICAgIFRocm93YWJsZSBrZXlSZWFkRXJyb3IgPSBudWxsOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciByYXcgPSBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGRhdGFGaWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoIWlzSW5kZXgpCisgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbktleVR5cGUudmFsaWRhdGUocmF3KTsKKyAgICAgICAgICAgICAgICBrZXkgPSBzc3RhYmxlLmRlY29yYXRlS2V5KHJhdyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGtleVJlYWRFcnJvciA9IHRoOworICAgICAgICAgICAgICAgIHRocm93SWZGYXRhbCh0aCk7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIG51bGwga2V5IGJlbG93CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHBvc2l0aW9uIG9mIHRoZSBwYXJ0aXRpb24gaW4gYSBkYXRhIGZpbGUsIGl0IHBvaW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXJ0aXRpb24ga2V5CisgICAgICAgICAgICBsb25nIGRhdGFTdGFydEZyb21JbmRleCA9IC0xOworICAgICAgICAgICAgLy8gc2l6ZSBvZiB0aGUgcGFydGl0aW9uIChpbmNsdWRpbmcgcGFydGl0aW9uIGtleSkKKyAgICAgICAgICAgIGxvbmcgZGF0YVNpemVGcm9tSW5kZXggPSAtMTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgY3VycmVudEluZGV4S2V5ID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChpbmRleEF2YWlsYWJsZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleEtleSA9IGluZGV4SXRlcmF0b3Iua2V5KCk7CisgICAgICAgICAgICAgICAgZGF0YVN0YXJ0RnJvbUluZGV4ID0gaW5kZXhJdGVyYXRvci5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoIWluZGV4SXRlcmF0b3IuaXNFeGhhdXN0ZWQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEl0ZXJhdG9yLmFkdmFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5kZXhJdGVyYXRvci5pc0V4aGF1c3RlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplRnJvbUluZGV4ID0gaW5kZXhJdGVyYXRvci5kYXRhUG9zaXRpb24oKSAtIGRhdGFTdGFydEZyb21JbmRleDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd0lmRmF0YWwodGgpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWR2YW5jZSB0byB0aGUgbmV4dCBpbmRleCBwb3NpdGlvbi4gSW5kZXggaXMgY29ycnVwdGVkLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29udGludWluZyB3aXRob3V0IHRoZSBpbmRleC4gTGFzdCBwb3NpdGlvbiByZWFkIGlzICVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhJdGVyYXRvci5kYXRhUG9zaXRpb24oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEl0ZXJhdG9yLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEl0ZXJhdG9yID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleEtleSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU3RhcnRGcm9tSW5kZXggPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplRnJvbUluZGV4ID0gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBrZXlOYW1lID0ga2V5ID09IG51bGwgPyAiKHVucmVhZGFibGUga2V5KSIgOiBrZXlTdHJpbmcoa2V5KTsKKyAgICAgICAgICAgIG91dHB1dEhhbmRsZXIuZGVidWcoInBhcnRpdGlvbiAlcyBpcyAlcyIsIGtleU5hbWUsIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KGRhdGFTaXplRnJvbUluZGV4KSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXJyb3IobmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVhZCBwYXJ0aXRpb24ga2V5IGZyb20gZGF0YSBmaWxlIiwga2V5UmVhZEVycm9yKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4S2V5ICE9IG51bGwgJiYgIWtleS5nZXRLZXkoKS5lcXVhbHMoY3VycmVudEluZGV4S2V5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0Vycm9yKG5ldyBJT0V4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJLZXkgZnJvbSBkYXRhIGZpbGUgKCVzKSBkb2VzIG5vdCBtYXRjaCBrZXkgZnJvbSBpbmRleCBmaWxlICglcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KGtleS5nZXRLZXkoKSksIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoY3VycmVudEluZGV4S2V5KSkpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXhJdGVyYXRvciAhPSBudWxsICYmIGRhdGFTaXplRnJvbUluZGV4ID4gZGF0YUZpbGUubGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0Vycm9yKG5ldyBJT0V4Y2VwdGlvbigiSW1wb3NzaWJsZSBwYXJ0aXRpb24gc2l6ZSAoZ3JlYXRlciB0aGFuIGZpbGUgbGVuZ3RoKTogIiArIGRhdGFTaXplRnJvbUluZGV4KSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXhJdGVyYXRvciAhPSBudWxsICYmIGRhdGFTdGFydCAhPSBkYXRhU3RhcnRGcm9tSW5kZXgpCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2FybigiRGF0YSBmaWxlIHBhcnRpdGlvbiBwb3NpdGlvbiAlZCBkaWZmZXJzIGZyb20gaW5kZXggZmlsZSByb3cgcG9zaXRpb24gJWQiLCBkYXRhU3RhcnQsIGRhdGFTdGFydEZyb21JbmRleCk7CisKKyAgICAgICAgICAgICAgICBpZiAodHJ5QXBwZW5kKHByZXZLZXksIGtleSwgd3JpdGVyKSkKKyAgICAgICAgICAgICAgICAgICAgcHJldktleSA9IGtleTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3dJZkZhdGFsKHRoKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4odGgsICJFcnJvciByZWFkaW5nIHBhcnRpdGlvbiAlcyAoc3RhY2t0cmFjZSBmb2xsb3dzKToiLCBrZXlOYW1lKTsKKworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXhLZXkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiAoa2V5ID09IG51bGwgfHwgIWtleS5nZXRLZXkoKS5lcXVhbHMoY3VycmVudEluZGV4S2V5KSB8fCBkYXRhU3RhcnQgIT0gZGF0YVN0YXJ0RnJvbUluZGV4KSkKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcG9zaXRpb24gd2hlcmUgdGhlIHJvdyBzaG91bGQgc3RhcnQgaW4gYSBkYXRhIGZpbGUgKHJpZ2h0IGFmdGVyIHRoZSBwYXJ0aXRpb24ga2V5KQorICAgICAgICAgICAgICAgICAgICBsb25nIHJvd1N0YXJ0RnJvbUluZGV4ID0gZGF0YVN0YXJ0RnJvbUluZGV4ICsgVHlwZVNpemVzLlNIT1JUX1NJWkUgKyBjdXJyZW50SW5kZXhLZXkucmVtYWluaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KCJSZXRyeWluZyBmcm9tIHBhcnRpdGlvbiBpbmRleDsgZGF0YSBpcyAlcyBieXRlcyBzdGFydGluZyBhdCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplRnJvbUluZGV4LCByb3dTdGFydEZyb21JbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGtleSA9IHNzdGFibGUuZGVjb3JhdGVLZXkoY3VycmVudEluZGV4S2V5KTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25LZXlUeXBlLnZhbGlkYXRlKGtleS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhRmlsZS5zZWVrKHJvd1N0YXJ0RnJvbUluZGV4KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyeUFwcGVuZChwcmV2S2V5LCBrZXksIHdyaXRlcikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldktleSA9IGtleTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRoMikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dJZkZhdGFsKHRoMik7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd0lmQ2Fubm90Q29udGludWUoa2V5LCB0aDIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4odGgyLCAiUmV0cnkgZmFpbGVkIHRvby4gU2tpcHBpbmcgdG8gbmV4dCBwYXJ0aXRpb24gKHJldHJ5J3Mgc3RhY2t0cmFjZSBmb2xsb3dzKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYmFkUGFydGl0aW9ucysrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWVrVG9OZXh0UGFydGl0aW9uKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dJZkNhbm5vdENvbnRpbnVlKGtleSwgdGgpOworCisgICAgICAgICAgICAgICAgICAgIGJhZFBhcnRpdGlvbnMrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4SXRlcmF0b3IgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKCJQYXJ0aXRpb24gc3RhcnRpbmcgYXQgcG9zaXRpb24gJWQgaXMgdW5yZWFkYWJsZTsgc2tpcHBpbmcgdG8gbmV4dCIsIGRhdGFTdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlZWtUb05leHRQYXJ0aXRpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2FybigiVW5yZWNvdmVyYWJsZSBlcnJvciB3aGlsZSBzY3J1YmJpbmcgJXMuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNjcnViYmluZyBjYW5ub3QgY29udGludWUuIFRoZSBzc3RhYmxlIHdpbGwgYmUgbWFya2VkIGZvciBkZWxldGlvbi4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBjYW4gYXR0ZW1wdCBtYW51YWwgcmVjb3ZlcnkgZnJvbSB0aGUgcHJlLXNjcnViIHNuYXBzaG90LiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91IGNhbiBhbHNvIHJ1biBub2RldG9vbCByZXBhaXIgdG8gdHJhbnNmZXIgdGhlIGRhdGEgZnJvbSBhIGhlYWx0aHkgcmVwbGljYSwgaWYgYW55LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSdzIG5vIHdheSB0byByZXN5bmMgYW5kIGNvbnRpbnVlLiBHaXZlIHVwLgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByaXZhdGUgYm9vbGVhbiBpbmRleEF2YWlsYWJsZSgpCisgICAgeworICAgICAgICByZXR1cm4gaW5kZXhJdGVyYXRvciAhPSBudWxsICYmICFpbmRleEl0ZXJhdG9yLmlzRXhoYXVzdGVkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHNlZWtUb05leHRQYXJ0aXRpb24oKQorICAgIHsKKyAgICAgICAgd2hpbGUgKGluZGV4QXZhaWxhYmxlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgbmV4dFJvd1Bvc2l0aW9uRnJvbUluZGV4ID0gaW5kZXhJdGVyYXRvci5kYXRhUG9zaXRpb24oKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGF0YUZpbGUuc2VlayhuZXh0Um93UG9zaXRpb25Gcm9tSW5kZXgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvd0lmRmF0YWwodGgpOworICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2Fybih0aCwgIkZhaWxlZCB0byBzZWVrIHRvIG5leHQgcm93IHBvc2l0aW9uICVkIiwgbmV4dFJvd1Bvc2l0aW9uRnJvbUluZGV4KTsKKyAgICAgICAgICAgICAgICBiYWRQYXJ0aXRpb25zKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGV4SXRlcmF0b3IuYWR2YW5jZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4odGgsICJGYWlsZWQgdG8gZ28gdG8gdGhlIG5leHQgZW50cnkgaW4gaW5kZXgiKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLmNsZWFuZWQodGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRocm93SWZDYW5ub3RDb250aW51ZShEZWNvcmF0ZWRLZXkga2V5LCBUaHJvd2FibGUgdGgpCisgICAgeworICAgICAgICBpZiAoaXNJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBzY3J1YmJpbmcgdGhlIHBhcnRpdGlvbiB3aXRoIGtleSAnJXMnIGZvciBhbiBpbmRleCB0YWJsZS4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNjcnViYmluZyB3aWxsIGFib3J0IGZvciB0aGlzIHRhYmxlIGFuZCB0aGUgaW5kZXggd2lsbCBiZSByZWJ1aWx0LiIsIGtleVN0cmluZyhrZXkpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0Vycm9yKHRoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN1cGVyLnRocm93SWZDYW5ub3RDb250aW51ZShrZXksIHRoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgeworICAgICAgICBmaWxlQWNjZXNzTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2VRdWlldGx5KGRhdGFGaWxlKTsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZVF1aWV0bHkoaW5kZXhJdGVyYXRvcik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBmaWxlQWNjZXNzTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9CdGlUYWJsZVZlcmlmaWVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvQnRpVGFibGVWZXJpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMjVhZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvQnRpVGFibGVWZXJpZmllci5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklWZXJpZmllcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5Tb3J0ZWRUYWJsZVZlcmlmaWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk91dHB1dEhhbmRsZXI7CisKK3B1YmxpYyBjbGFzcyBCdGlUYWJsZVZlcmlmaWVyIGV4dGVuZHMgU29ydGVkVGFibGVWZXJpZmllcjxCdGlUYWJsZVJlYWRlcj4gaW1wbGVtZW50cyBJVmVyaWZpZXIKK3sKKyAgICBwdWJsaWMgQnRpVGFibGVWZXJpZmllcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIEJ0aVRhYmxlUmVhZGVyIHNzdGFibGUsIE91dHB1dEhhbmRsZXIgb3V0cHV0SGFuZGxlciwgYm9vbGVhbiBpc09mZmxpbmUsIE9wdGlvbnMgb3B0aW9ucykKKyAgICB7CisgICAgICAgIHN1cGVyKGNmcywgc3N0YWJsZSwgb3V0cHV0SGFuZGxlciwgaXNPZmZsaW5lLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlQYXJ0aXRpb24oRGVjb3JhdGVkS2V5IGtleSwgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yKQorICAgIHsKKyAgICAgICAgLy8gVGhlIHRyaWUgd3JpdGVycyBhYm9ydCBpZiBzdXBwbGllZCB3aXRoIGJhZGx5IG9yZGVyZWQgb3IgZHVwbGljYXRlIHJvdyBrZXlzLiBWZXJpZmljYXRpb24gaXMgbm90IG5lY2Vzc2FyeS4KKyAgICAgICAgLy8gbm8tb3AsIGp1c3Qgb3BlbiBhbmQgY2xvc2UgcGFydGl0aW9uLgorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9CdGlUYWJsZVdyaXRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL0J0aVRhYmxlV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEzNDNmZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9CdGlUYWJsZVdyaXRlci5qYXZhCkBAIC0wLDAgKzEsNDI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5idGk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25UaW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVOZXdUcmFja2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTUmVhZEVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTV3JpdGVFcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0Um93SW5kZXhFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LkRhdGFDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuSW5kZXhDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyLk9wZW5SZWFzb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU29ydGVkVGFibGVXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpLkJ0aUZvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YVBvc2l0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLk1tYXBwZWRSZWdpb25zQ2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLklGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSlZNU3RhYmlsaXR5SW5zcGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRocm93YWJsZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5UcmFuc2FjdGlvbmFsOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZS5CdWlsZGVyLk5PX0xFTkdUSF9PVkVSUklERTsKKworLyoqCisgKiBXcml0ZXMgU1NUYWJsZXMgaW4gQlRJIGZvcm1hdCAoc2VlIHtAbGluayBCdGlGb3JtYXR9KSwgd2hpY2ggY2FuIGJlIHJlYWQgYnkge0BsaW5rIEJ0aVRhYmxlUmVhZGVyfS4KKyAqLworQFZpc2libGVGb3JUZXN0aW5nCitwdWJsaWMgY2xhc3MgQnRpVGFibGVXcml0ZXIgZXh0ZW5kcyBTb3J0ZWRUYWJsZVdyaXRlcjxCdGlGb3JtYXRQYXJ0aXRpb25Xcml0ZXI+Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEJ0aVRhYmxlV3JpdGVyLmNsYXNzKTsKKworICAgIHByaXZhdGUgZmluYWwgQnRpRm9ybWF0UGFydGl0aW9uV3JpdGVyIHBhcnRpdGlvbldyaXRlcjsKKyAgICBwcml2YXRlIGZpbmFsIEluZGV4V3JpdGVyIGl3cml0ZXI7CisKKyAgICBwdWJsaWMgQnRpVGFibGVXcml0ZXIoQnVpbGRlciBidWlsZGVyLCBMaWZlY3ljbGVOZXdUcmFja2VyIGxpZmVjeWNsZU5ld1RyYWNrZXIsIFNTVGFibGUuT3duZXIgb3duZXIpCisgICAgeworICAgICAgICBzdXBlcihidWlsZGVyLCBsaWZlY3ljbGVOZXdUcmFja2VyLCBvd25lcik7CisgICAgICAgIHRoaXMuaXdyaXRlciA9IGJ1aWxkZXIuZ2V0SW5kZXhXcml0ZXIoKTsKKyAgICAgICAgdGhpcy5wYXJ0aXRpb25Xcml0ZXIgPSBidWlsZGVyLmdldFBhcnRpdGlvbldyaXRlcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG1hcmsoKQorICAgIHsKKyAgICAgICAgc3VwZXIubWFyaygpOworICAgICAgICBpd3JpdGVyLm1hcmsoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXNldEFuZFRydW5jYXRlKCkKKyAgICB7CisgICAgICAgIHN1cGVyLnJlc2V0QW5kVHJ1bmNhdGUoKTsKKyAgICAgICAgaXdyaXRlci5yZXNldEFuZFRydW5jYXRlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRyaWVJbmRleEVudHJ5IGNyZWF0ZVJvd0luZGV4RW50cnkoRGVjb3JhdGVkS2V5IGtleSwgRGVsZXRpb25UaW1lIHBhcnRpdGlvbkxldmVsRGVsZXRpb24sIGxvbmcgZmluaXNoUmVzdWx0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFRyaWVJbmRleEVudHJ5IGVudHJ5ID0gVHJpZUluZGV4RW50cnkuY3JlYXRlKHBhcnRpdGlvbldyaXRlci5nZXRJbml0aWFsUG9zaXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25MZXZlbERlbGV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25Xcml0ZXIuZ2V0Um93SW5kZXhCbG9ja0NvdW50KCkpOworICAgICAgICBpd3JpdGVyLmFwcGVuZChrZXksIGVudHJ5KTsKKyAgICAgICAgcmV0dXJuIGVudHJ5OworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsicmVzb3VyY2UiLCAiUmVkdW5kYW50U3VwcHJlc3Npb24ifSkKKyAgICBwcml2YXRlIEJ0aVRhYmxlUmVhZGVyIG9wZW5JbnRlcm5hbChPcGVuUmVhc29uIG9wZW5SZWFzb24sIGJvb2xlYW4gaXNGaW5hbCwgU3VwcGxpZXI8UGFydGl0aW9uSW5kZXg+IHBhcnRpdGlvbkluZGV4U3VwcGxpZXIpCisgICAgeworICAgICAgICBJRmlsdGVyIGZpbHRlciA9IG51bGw7CisgICAgICAgIEZpbGVIYW5kbGUgZGF0YUZpbGUgPSBudWxsOworICAgICAgICBQYXJ0aXRpb25JbmRleCBwYXJ0aXRpb25JbmRleCA9IG51bGw7CisgICAgICAgIEZpbGVIYW5kbGUgcm93SW5kZXhGaWxlID0gbnVsbDsKKworICAgICAgICBCdGlUYWJsZVJlYWRlci5CdWlsZGVyIGJ1aWxkZXIgPSB1bmJ1aWxkVG8obmV3IEJ0aVRhYmxlUmVhZGVyLkJ1aWxkZXIoZGVzY3JpcHRvciksIHRydWUpLnNldE1heERhdGFBZ2UobWF4RGF0YUFnZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTZXJpYWxpemF0aW9uSGVhZGVyKGhlYWRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRPcGVuUmVhc29uKG9wZW5SZWFzb24pOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBidWlsZGVyLnNldFN0YXRzTWV0YWRhdGEoc3RhdHNNZXRhZGF0YSgpKTsKKworICAgICAgICAgICAgcGFydGl0aW9uSW5kZXggPSBwYXJ0aXRpb25JbmRleFN1cHBsaWVyLmdldCgpOworICAgICAgICAgICAgcm93SW5kZXhGaWxlID0gaXdyaXRlci5yb3dJbmRleEZIQnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICAgICAgZGF0YUZpbGUgPSBvcGVuRGF0YUZpbGUoaXNGaW5hbCA/IE5PX0xFTkdUSF9PVkVSUklERSA6IGRhdGFXcml0ZXIuZ2V0TGFzdEZsdXNoT2Zmc2V0KCksIGJ1aWxkZXIuZ2V0U3RhdHNNZXRhZGF0YSgpKTsKKyAgICAgICAgICAgIGZpbHRlciA9IGl3cml0ZXIuZ2V0RmlsdGVyQ29weSgpOworCisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5zZXRQYXJ0aXRpb25JbmRleChwYXJ0aXRpb25JbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpcnN0KHBhcnRpdGlvbkluZGV4LmZpcnN0S2V5KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXN0KHBhcnRpdGlvbkluZGV4Lmxhc3RLZXkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFJvd0luZGV4RmlsZShyb3dJbmRleEZpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREYXRhRmlsZShkYXRhRmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpbHRlcihmaWx0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZChvd25lcigpLm9yRWxzZShudWxsKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gfCBFcnJvciBleCkKKyAgICAgICAgeworICAgICAgICAgICAgSlZNU3RhYmlsaXR5SW5zcGVjdG9yLmluc3BlY3RUaHJvd2FibGUoZXgpOworICAgICAgICAgICAgVGhyb3dhYmxlcy5jbG9zZU5vbk51bGxBbmRBZGRTdXBwcmVzc2VkKGV4LCBmaWx0ZXIsIGRhdGFGaWxlLCByb3dJbmRleEZpbGUsIHBhcnRpdGlvbkluZGV4KTsKKyAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb3BlbkVhcmx5KENvbnN1bWVyPFNTVGFibGVSZWFkZXI+IGNhbGxXaGVuUmVhZHkpCisgICAgeworICAgICAgICBsb25nIGRhdGFMZW5ndGggPSBkYXRhV3JpdGVyLnBvc2l0aW9uKCk7CisgICAgICAgIGl3cml0ZXIuYnVpbGRQYXJ0aWFsKGRhdGFMZW5ndGgsIHBhcnRpdGlvbkluZGV4IC0+CisgICAgICAgIHsKKyAgICAgICAgICAgIGl3cml0ZXIucm93SW5kZXhGSEJ1aWxkZXIud2l0aExlbmd0aE92ZXJyaWRlKGl3cml0ZXIucm93SW5kZXhXcml0ZXIuZ2V0TGFzdEZsdXNoT2Zmc2V0KCkpOworICAgICAgICAgICAgQnRpVGFibGVSZWFkZXIgcmVhZGVyID0gb3BlbkludGVybmFsKE9wZW5SZWFzb24uRUFSTFksIGZhbHNlLCAoKSAtPiBwYXJ0aXRpb25JbmRleCk7CisgICAgICAgICAgICBjYWxsV2hlblJlYWR5LmFjY2VwdChyZWFkZXIpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1NUYWJsZVJlYWRlciBvcGVuRmluYWxFYXJseSgpCisgICAgeworICAgICAgICAvLyB3ZSBtdXN0IGVuc3VyZSB0aGUgZGF0YSBpcyBjb21wbGV0ZWx5IGZsdXNoZWQgdG8gZGlzaworICAgICAgICBpd3JpdGVyLmNvbXBsZXRlKCk7IC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgYnkgY29tcGxldGVkUGFydGl0aW9uSW5kZXgoKSBiZWxvdyB0b28sIGJ1dCB3ZSB3YW50IGl0IGRvbmUgbm93IHRvCisgICAgICAgIC8vIGVuc3VyZSBvdXRzdGFuZGluZyBvcGVuRWFybHkgYWN0aW9ucyBhcmUgbm90IHRyaWdnZXJlZC4KKyAgICAgICAgZGF0YVdyaXRlci5zeW5jKCk7CisgICAgICAgIGl3cml0ZXIucm93SW5kZXhXcml0ZXIuc3luYygpOworICAgICAgICAvLyBOb3RlOiBOb3RoaW5nIG11c3QgYmUgd3JpdHRlbiB0byBhbnkgb2YgdGhlIGZpbGVzIGFmdGVyIHRoaXMgcG9pbnQsIGFzIHRoZSBjaHVuayBjYWNoZSBjb3VsZCBwaWNrIHVwIGFuZAorICAgICAgICAvLyByZXRhaW4gYSBwYXJ0aWFsbHktd3JpdHRlbiBwYWdlLgorCisgICAgICAgIHJldHVybiBvcGVuRmluYWwoT3BlblJlYXNvbi5FQVJMWSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJyZXNvdXJjZSIsICJSZWR1bmRhbnRTdXBwcmVzc2lvbiJ9KQorICAgIHByb3RlY3RlZCBTU1RhYmxlUmVhZGVyIG9wZW5GaW5hbChPcGVuUmVhc29uIG9wZW5SZWFzb24pCisgICAgeworCisgICAgICAgIGlmIChtYXhEYXRhQWdlIDwgMCkKKyAgICAgICAgICAgIG1heERhdGFBZ2UgPSBDbG9jay5HbG9iYWwuY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICByZXR1cm4gb3BlbkludGVybmFsKG9wZW5SZWFzb24sIHRydWUsIGl3cml0ZXI6OmNvbXBsZXRlZFBhcnRpdGlvbkluZGV4KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVHJhbnNhY3Rpb25hbFByb3h5IHR4blByb3h5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25hbFByb3h5KCgpIC0+IEZCVXRpbGl0aWVzLmltbXV0YWJsZUxpc3RXaXRoRmlsdGVyZWROdWxscyhpd3JpdGVyLCBkYXRhV3JpdGVyKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBUcmFuc2FjdGlvbmFsUHJveHkgZXh0ZW5kcyBTb3J0ZWRUYWJsZVdyaXRlcjxCdGlGb3JtYXRQYXJ0aXRpb25Xcml0ZXI+LlRyYW5zYWN0aW9uYWxQcm94eQorICAgIHsKKyAgICAgICAgcHVibGljIFRyYW5zYWN0aW9uYWxQcm94eShTdXBwbGllcjxJbW11dGFibGVMaXN0PFRyYW5zYWN0aW9uYWw+PiB0cmFuc2FjdGlvbmFscykKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIodHJhbnNhY3Rpb25hbHMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBUaHJvd2FibGUgZG9Qb3N0Q2xlYW51cChUaHJvd2FibGUgYWNjdW11bGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgYWNjdW11bGF0ZSA9IFRocm93YWJsZXMuY2xvc2UoYWNjdW11bGF0ZSwgcGFydGl0aW9uV3JpdGVyKTsKKyAgICAgICAgICAgIGFjY3VtdWxhdGUgPSBzdXBlci5kb1Bvc3RDbGVhbnVwKGFjY3VtdWxhdGUpOworICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNhcHN1bGF0ZXMgd3JpdGluZyB0aGUgaW5kZXggYW5kIGZpbHRlciBmb3IgYW4gU1NUYWJsZS4gVGhlIHN0YXRlIG9mIHRoaXMgb2JqZWN0IGlzIG5vdCB2YWxpZCB1bnRpbCBpdCBoYXMgYmVlbiBjbG9zZWQuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIEluZGV4V3JpdGVyIGV4dGVuZHMgU29ydGVkVGFibGVXcml0ZXIuQWJzdHJhY3RJbmRleFdyaXRlcgorICAgIHsKKyAgICAgICAgZmluYWwgU2VxdWVudGlhbFdyaXRlciByb3dJbmRleFdyaXRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBGaWxlSGFuZGxlLkJ1aWxkZXIgcm93SW5kZXhGSEJ1aWxkZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgU2VxdWVudGlhbFdyaXRlciBwYXJ0aXRpb25JbmRleFdyaXRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBGaWxlSGFuZGxlLkJ1aWxkZXIgcGFydGl0aW9uSW5kZXhGSEJ1aWxkZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFydGl0aW9uSW5kZXhCdWlsZGVyIHBhcnRpdGlvbkluZGV4OworICAgICAgICBib29sZWFuIHBhcnRpdGlvbkluZGV4Q29tcGxldGVkID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgRGF0YVBvc2l0aW9uIHJpTWFyazsKKyAgICAgICAgcHJpdmF0ZSBEYXRhUG9zaXRpb24gcGlNYXJrOworCisgICAgICAgIEluZGV4V3JpdGVyKEJ1aWxkZXIgYikKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoYik7CisgICAgICAgICAgICByb3dJbmRleFdyaXRlciA9IG5ldyBTZXF1ZW50aWFsV3JpdGVyKGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlJPV19JTkRFWCksIGIuZ2V0SU9PcHRpb25zKCkud3JpdGVyT3B0aW9ucyk7CisgICAgICAgICAgICByb3dJbmRleEZIQnVpbGRlciA9IEluZGV4Q29tcG9uZW50LmZpbGVCdWlsZGVyKENvbXBvbmVudHMuUk9XX0lOREVYLCBiKS53aXRoTW1hcHBlZFJlZ2lvbnNDYWNoZShiLmdldE1tYXBwZWRSZWdpb25zQ2FjaGUoKSk7CisgICAgICAgICAgICBwYXJ0aXRpb25JbmRleFdyaXRlciA9IG5ldyBTZXF1ZW50aWFsV3JpdGVyKGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlBBUlRJVElPTl9JTkRFWCksIGIuZ2V0SU9PcHRpb25zKCkud3JpdGVyT3B0aW9ucyk7CisgICAgICAgICAgICBwYXJ0aXRpb25JbmRleEZIQnVpbGRlciA9IEluZGV4Q29tcG9uZW50LmZpbGVCdWlsZGVyKENvbXBvbmVudHMuUEFSVElUSU9OX0lOREVYLCBiKS53aXRoTW1hcHBlZFJlZ2lvbnNDYWNoZShiLmdldE1tYXBwZWRSZWdpb25zQ2FjaGUoKSk7CisgICAgICAgICAgICBwYXJ0aXRpb25JbmRleCA9IG5ldyBQYXJ0aXRpb25JbmRleEJ1aWxkZXIocGFydGl0aW9uSW5kZXhXcml0ZXIsIHBhcnRpdGlvbkluZGV4RkhCdWlsZGVyKTsKKyAgICAgICAgICAgIC8vIHJlZ2lzdGVyIGxpc3RlbmVycyB0byBiZSBhbGVydGVkIHdoZW4gdGhlIGRhdGEgZmlsZXMgYXJlIGZsdXNoZWQKKyAgICAgICAgICAgIHBhcnRpdGlvbkluZGV4V3JpdGVyLnNldFBvc3RGbHVzaExpc3RlbmVyKCgpIC0+IHBhcnRpdGlvbkluZGV4Lm1hcmtQYXJ0aXRpb25JbmRleFN5bmNlZChwYXJ0aXRpb25JbmRleFdyaXRlci5nZXRMYXN0Rmx1c2hPZmZzZXQoKSkpOworICAgICAgICAgICAgcm93SW5kZXhXcml0ZXIuc2V0UG9zdEZsdXNoTGlzdGVuZXIoKCkgLT4gcGFydGl0aW9uSW5kZXgubWFya1Jvd0luZGV4U3luY2VkKHJvd0luZGV4V3JpdGVyLmdldExhc3RGbHVzaE9mZnNldCgpKSk7CisgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InJlc291cmNlIiwgIlJlZHVuZGFudFN1cHByZXNzaW9uIn0pCisgICAgICAgICAgICBTZXF1ZW50aWFsV3JpdGVyIGRhdGFXcml0ZXIgPSBiLmdldERhdGFXcml0ZXIoKTsKKyAgICAgICAgICAgIGRhdGFXcml0ZXIuc2V0UG9zdEZsdXNoTGlzdGVuZXIoKCkgLT4gcGFydGl0aW9uSW5kZXgubWFya0RhdGFTeW5jZWQoZGF0YVdyaXRlci5nZXRMYXN0Rmx1c2hPZmZzZXQoKSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgYXBwZW5kKERlY29yYXRlZEtleSBrZXksIEFic3RyYWN0Um93SW5kZXhFbnRyeSBpbmRleEVudHJ5KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgYmYuYWRkKGtleSk7CisgICAgICAgICAgICBsb25nIHBvc2l0aW9uOworICAgICAgICAgICAgaWYgKGluZGV4RW50cnkuaXNJbmRleGVkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9uZyBpbmRleFN0YXJ0ID0gcm93SW5kZXhXcml0ZXIucG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLndyaXRlV2l0aFNob3J0TGVuZ3RoKGtleS5nZXRLZXkoKSwgcm93SW5kZXhXcml0ZXIpOworICAgICAgICAgICAgICAgICAgICAoKFRyaWVJbmRleEVudHJ5KSBpbmRleEVudHJ5KS5zZXJpYWxpemUocm93SW5kZXhXcml0ZXIsIHJvd0luZGV4V3JpdGVyLnBvc2l0aW9uKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGU1dyaXRlRXJyb3IoZSwgcm93SW5kZXhXcml0ZXIuZ2V0RmlsZSgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgid3JvdGUgaW5kZXggZW50cnk6IHt9IGF0IHt9IiwgaW5kZXhFbnRyeSwgaW5kZXhTdGFydCk7CisgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBpbmRleFN0YXJ0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFdyaXRlIGRhdGEgcG9zaXRpb24gZGlyZWN0bHkgaW4gdHJpZS4KKyAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IH5pbmRleEVudHJ5LnBvc2l0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFydGl0aW9uSW5kZXguYWRkRW50cnkoa2V5LCBwb3NpdGlvbik7CisgICAgICAgICAgICByZXR1cm4gcG9zaXRpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBidWlsZFBhcnRpYWwobG9uZyBkYXRhUG9zaXRpb24sIENvbnN1bWVyPFBhcnRpdGlvbkluZGV4PiBjYWxsV2hlblJlYWR5KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcGFydGl0aW9uSW5kZXguYnVpbGRQYXJ0aWFsKGNhbGxXaGVuUmVhZHksIHJvd0luZGV4V3JpdGVyLnBvc2l0aW9uKCksIGRhdGFQb3NpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBtYXJrKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmlNYXJrID0gcm93SW5kZXhXcml0ZXIubWFyaygpOworICAgICAgICAgICAgcGlNYXJrID0gcGFydGl0aW9uSW5kZXhXcml0ZXIubWFyaygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVzZXRBbmRUcnVuY2F0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHdlIGNhbid0IHVuLXNldCB0aGUgYmxvb20gZmlsdGVyIGFkZGl0aW9uLCBidXQgZXh0cmEga2V5cyBpbiB0aGVyZSBhcmUgaGFybWxlc3MuCisgICAgICAgICAgICAvLyB3ZSBjYW4ndCByZXNldCBkYnVpbGRlciBlaXRoZXIsIGJ1dCB0aGF0IGlzIHRoZSBsYXN0IHRoaW5nIGNhbGxlZCBpbiBhZnRlciBhcHBlbmQsIHNvCisgICAgICAgICAgICAvLyB3ZSBhc3N1bWUgdGhhdCBpZiB0aGF0IHdvcmtlZCB0aGVuIHdlIHdvbid0IGJlIHRyeWluZyB0byByZXNldC4KKyAgICAgICAgICAgIHJvd0luZGV4V3JpdGVyLnJlc2V0QW5kVHJ1bmNhdGUocmlNYXJrKTsKKyAgICAgICAgICAgIHBhcnRpdGlvbkluZGV4V3JpdGVyLnJlc2V0QW5kVHJ1bmNhdGUocGlNYXJrKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGRvUHJlcGFyZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsdXNoQmYoKTsKKworICAgICAgICAgICAgLy8gdHJ1bmNhdGUgaW5kZXggZmlsZQorICAgICAgICAgICAgcm93SW5kZXhXcml0ZXIucHJlcGFyZVRvQ29tbWl0KCk7CisgICAgICAgICAgICByb3dJbmRleEZIQnVpbGRlci53aXRoTGVuZ3RoT3ZlcnJpZGUocm93SW5kZXhXcml0ZXIuZ2V0TGFzdEZsdXNoT2Zmc2V0KCkpOworCisgICAgICAgICAgICBjb21wbGV0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBjb21wbGV0ZSgpIHRocm93cyBGU1dyaXRlRXJyb3IKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBhcnRpdGlvbkluZGV4Q29tcGxldGVkKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFydGl0aW9uSW5kZXguY29tcGxldGUoKTsKKyAgICAgICAgICAgICAgICBwYXJ0aXRpb25JbmRleENvbXBsZXRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRlNXcml0ZUVycm9yKGUsIHBhcnRpdGlvbkluZGV4V3JpdGVyLmdldEZpbGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBQYXJ0aXRpb25JbmRleCBjb21wbGV0ZWRQYXJ0aXRpb25JbmRleCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbXBsZXRlKCk7CisgICAgICAgICAgICByb3dJbmRleEZIQnVpbGRlci53aXRoTGVuZ3RoT3ZlcnJpZGUoMCk7CisgICAgICAgICAgICBwYXJ0aXRpb25JbmRleEZIQnVpbGRlci53aXRoTGVuZ3RoT3ZlcnJpZGUoMCk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUGFydGl0aW9uSW5kZXgubG9hZChwYXJ0aXRpb25JbmRleEZIQnVpbGRlciwgbWV0YWRhdGEuZ2V0TG9jYWwoKS5wYXJ0aXRpb25lciwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZTUmVhZEVycm9yKGUsIHBhcnRpdGlvbkluZGV4V3JpdGVyLmdldEZpbGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgVGhyb3dhYmxlIGRvQ29tbWl0KFRocm93YWJsZSBhY2N1bXVsYXRlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcm93SW5kZXhXcml0ZXIuY29tbWl0KGFjY3VtdWxhdGUpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFRocm93YWJsZSBkb0Fib3J0KFRocm93YWJsZSBhY2N1bXVsYXRlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcm93SW5kZXhXcml0ZXIuYWJvcnQoYWNjdW11bGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFRocm93YWJsZSBkb1Bvc3RDbGVhbnVwKFRocm93YWJsZSBhY2N1bXVsYXRlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVGhyb3dhYmxlcy5jbG9zZShhY2N1bXVsYXRlLCBiZiwgcGFydGl0aW9uSW5kZXgsIHJvd0luZGV4V3JpdGVyLCBwYXJ0aXRpb25JbmRleFdyaXRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgZXh0ZW5kcyBTb3J0ZWRUYWJsZVdyaXRlci5CdWlsZGVyPEJ0aUZvcm1hdFBhcnRpdGlvbldyaXRlciwgQnRpVGFibGVXcml0ZXIsIEJ1aWxkZXI+CisgICAgeworICAgICAgICBwcml2YXRlIFNlcXVlbnRpYWxXcml0ZXIgZGF0YVdyaXRlcjsKKyAgICAgICAgcHJpdmF0ZSBCdGlGb3JtYXRQYXJ0aXRpb25Xcml0ZXIgcGFydGl0aW9uV3JpdGVyOworICAgICAgICBwcml2YXRlIEluZGV4V3JpdGVyIGluZGV4V3JpdGVyOworICAgICAgICBwcml2YXRlIE1tYXBwZWRSZWdpb25zQ2FjaGUgbW1hcHBlZFJlZ2lvbnNDYWNoZTsKKworICAgICAgICBwdWJsaWMgQnVpbGRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGRlc2NyaXB0b3IpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBnZXR0ZXJzIGZvciB0aGUgcmVzb3VyY2VzIG9wZW5lZCBieSBidWlsZEludGVybmFsIG1ldGhvZCBjYW4gYmUgb25seSB1c2VkIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YKKyAgICAgICAgLy8gdGhhdCBtZXRob2QgLSB0aGF0IGlzLCBkdXJpbmcgdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUgc3N0YWJsZS4KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1tYXBwZWRSZWdpb25zQ2FjaGUgZ2V0TW1hcHBlZFJlZ2lvbnNDYWNoZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlbnN1cmluZ0luQnVpbGRJbnRlcm5hbENvbnRleHQobW1hcHBlZFJlZ2lvbnNDYWNoZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNlcXVlbnRpYWxXcml0ZXIgZ2V0RGF0YVdyaXRlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlbnN1cmluZ0luQnVpbGRJbnRlcm5hbENvbnRleHQoZGF0YVdyaXRlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ0aUZvcm1hdFBhcnRpdGlvbldyaXRlciBnZXRQYXJ0aXRpb25Xcml0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZW5zdXJpbmdJbkJ1aWxkSW50ZXJuYWxDb250ZXh0KHBhcnRpdGlvbldyaXRlcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW5kZXhXcml0ZXIgZ2V0SW5kZXhXcml0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZW5zdXJpbmdJbkJ1aWxkSW50ZXJuYWxDb250ZXh0KGluZGV4V3JpdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgPFQ+IFQgZW5zdXJpbmdJbkJ1aWxkSW50ZXJuYWxDb250ZXh0KFQgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZSh2YWx1ZSAhPSBudWxsLCAiVGhpcyBnZXR0ZXIgY2FuIGJlIHVzZWQgb25seSBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoZSBzc3RhYmxlIGNvbnN0cnVjdG9yLiBEbyBub3QgdXNlIGl0IGRpcmVjdGx5LiIpOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZERlZmF1bHRDb21wb25lbnRzKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIuYWRkRGVmYXVsdENvbXBvbmVudHMoKTsKKworICAgICAgICAgICAgYWRkQ29tcG9uZW50cyhJbW11dGFibGVTZXQub2YoQ29tcG9uZW50cy5QQVJUSVRJT05fSU5ERVgsIENvbXBvbmVudHMuUk9XX0lOREVYKSk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBCdGlUYWJsZVdyaXRlciBidWlsZEludGVybmFsKExpZmVjeWNsZU5ld1RyYWNrZXIgbGlmZWN5Y2xlTmV3VHJhY2tlciwgT3duZXIgb3duZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1tYXBwZWRSZWdpb25zQ2FjaGUgPSBuZXcgTW1hcHBlZFJlZ2lvbnNDYWNoZSgpOworICAgICAgICAgICAgICAgIGRhdGFXcml0ZXIgPSBEYXRhQ29tcG9uZW50LmJ1aWxkV3JpdGVyKGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGFibGVNZXRhZGF0YVJlZigpLmdldExvY2FsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SU9PcHRpb25zKCkud3JpdGVyT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNZXRhZGF0YUNvbGxlY3RvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZmVjeWNsZU5ld1RyYWNrZXIub3BUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SU9PcHRpb25zKCkuZmx1c2hDb21wcmVzc2lvbik7CisKKyAgICAgICAgICAgICAgICBpbmRleFdyaXRlciA9IG5ldyBJbmRleFdyaXRlcih0aGlzKTsKKyAgICAgICAgICAgICAgICBwYXJ0aXRpb25Xcml0ZXIgPSBuZXcgQnRpRm9ybWF0UGFydGl0aW9uV3JpdGVyKGdldFNlcmlhbGl6YXRpb25IZWFkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRhYmxlTWV0YWRhdGFSZWYoKS5nZXRMb2NhbCgpLmNvbXBhcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhV3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhXcml0ZXIucm93SW5kZXhXcml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLnZlcnNpb24pOworCisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ0aVRhYmxlV3JpdGVyKHRoaXMsIGxpZmVjeWNsZU5ld1RyYWNrZXIsIG93bmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHwgRXJyb3IgZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGhyb3dhYmxlcy5jbG9zZUFuZEFkZFN1cHByZXNzZWQoZXgsIHBhcnRpdGlvbldyaXRlciwgaW5kZXhXcml0ZXIsIGRhdGFXcml0ZXIsIG1tYXBwZWRSZWdpb25zQ2FjaGUpOworICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhcnRpdGlvbldyaXRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgaW5kZXhXcml0ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIGRhdGFXcml0ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIG1tYXBwZWRSZWdpb25zQ2FjaGUgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1BhcnRpdGlvbkluZGV4LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvUGFydGl0aW9uSW5kZXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWEzNDM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1BhcnRpdGlvbkluZGV4LmphdmEKQEAgLTAsMCArMSw0NTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5QYXJ0aXRpb25Qb3NpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzLlNlcmlhbGl6YXRpb25Ob2RlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzLlRyaWVOb2RlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzLlRyaWVTZXJpYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzLlZhbHVlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udHJpZXMuV2Fsa2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZURhdGFJbnB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5QYWdlQXdhcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SZWJ1ZmZlcmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2l6ZWRJbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlJlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlNoYXJlZENsb3NlYWJsZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGhvbGRzIHRoZSBwYXJ0aXRpb24gaW5kZXggYXMgYW4gb24tZGlzayB0cmllIG1hcHBpbmcgdW5pcXVlIHByZWZpeGVzIG9mIGRlY29yYXRlZCBrZXlzIHRvOgorICogPHVsPgorICogICAgIDxsaT5kYXRhIGZpbGUgcG9zaXRpb24gaWYgdGhlIHBhcnRpdGlvbiBpcyBzbWFsbCBlbm91Z2ggdG8gbm90IG5lZWQgYW4gaW5kZXgKKyAqICAgICA8bGk+cm93IGluZGV4IGZpbGUgcG9zaXRpb24gaWYgdGhlIHBhcnRpdGlvbiBoYXMgYSByb3cgaW5kZXgKKyAqIDwvdWw+cGx1czx1bD4KKyAqICAgICA8bGk+dGhlIGxhc3QgOCBiaXRzIG9mIHRoZSBrZXkncyBmaWx0ZXIgaGFzaCB3aGljaCBpcyB1c2VkIHRvIGZpbHRlciBvdXQgbWlzbWF0Y2hlZCBrZXlzIHdpdGhvdXQgcmVhZGluZyB0aGUga2V5CisgKiA8L3VsPgorICogVG8gYXZvaWQgaGF2aW5nIHRvIGNyZWF0ZSBhbiBvYmplY3QgdG8gY2FycnkgdGhlIHJlc3VsdCwgdGhlIHR3byBhcmUgZGlzdGluZ3Vpc2hlZCBieSBzaWduLiBEaXJlY3QtdG8tZGZpbGUgZW50cmllcworICogYXJlIHJlY29yZGVkIGFzIH5wb3NpdGlvbiAofiBpbnN0ZWFkIG9mIC0gdG8gZGlmZmVyZW50aWF0ZSAwIGluIGlmaWxlIGZyb20gMCBpbiBkZmlsZSkuCisgKiA8cD4KKyAqIEluIGVpdGhlciBjYXNlIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBhdCB0aGlzIHBvc2l0aW9uIHN0YXJ0IHdpdGggYSBzZXJpYWxpemF0aW9uIG9mIHRoZSBrZXkgd2hpY2ggY2FuIGJlIHVzZWQKKyAqIHRvIHZlcmlmeSB0aGUgY29ycmVjdCBrZXkgaXMgZm91bmQuCisgKiA8cD4KKyAqIFRoZSBpbmRleGVzIGFyZSBjcmVhdGVkIGJ5IHtAbGluayBQYXJ0aXRpb25JbmRleEJ1aWxkZXJ9LiBUbyByZWFkIHRoZSBpbmRleCBvbmUgbXVzdCBvYnRhaW4gYSB0aHJlYWQtdW5zYWZlCisgKiB7QGxpbmsgUmVhZGVyfSBvciB7QGxpbmsgSW5kZXhQb3NJdGVyYXRvcn0uCisgKi8KK0BWaXNpYmxlRm9yVGVzdGluZworcHVibGljIGNsYXNzIFBhcnRpdGlvbkluZGV4IGltcGxlbWVudHMgU2hhcmVkQ2xvc2VhYmxlCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFBhcnRpdGlvbkluZGV4LmNsYXNzKTsKKworICAgIHByaXZhdGUgZmluYWwgRmlsZUhhbmRsZSBmaDsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcga2V5Q291bnQ7CisgICAgcHJpdmF0ZSBmaW5hbCBEZWNvcmF0ZWRLZXkgZmlyc3Q7CisgICAgcHJpdmF0ZSBmaW5hbCBEZWNvcmF0ZWRLZXkgbGFzdDsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgcm9vdDsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBOT1RfRk9VTkQgPSBMb25nLk1JTl9WQUxVRTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT09URVJfTEVOR1RIID0gMyAqIDg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfSEFTX0hBU0hfQllURSA9IDg7CisKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgUGFydGl0aW9uSW5kZXgoRmlsZUhhbmRsZSBmaCwgbG9uZyB0cmllUm9vdCwgbG9uZyBrZXlDb3VudCwgRGVjb3JhdGVkS2V5IGZpcnN0LCBEZWNvcmF0ZWRLZXkgbGFzdCkKKyAgICB7CisgICAgICAgIHRoaXMua2V5Q291bnQgPSBrZXlDb3VudDsKKyAgICAgICAgdGhpcy5maCA9IGZoLnNoYXJlZENvcHkoKTsKKyAgICAgICAgdGhpcy5maXJzdCA9IGZpcnN0OworICAgICAgICB0aGlzLmxhc3QgPSBsYXN0OworICAgICAgICB0aGlzLnJvb3QgPSB0cmllUm9vdDsKKyAgICB9CisKKyAgICBwcml2YXRlIFBhcnRpdGlvbkluZGV4KFBhcnRpdGlvbkluZGV4IHNyYykKKyAgICB7CisgICAgICAgIHRoaXMoc3JjLmZoLCBzcmMucm9vdCwgc3JjLmtleUNvdW50LCBzcmMuZmlyc3QsIHNyYy5sYXN0KTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgUGF5bG9hZAorICAgIHsKKyAgICAgICAgZmluYWwgbG9uZyBwb3NpdGlvbjsKKyAgICAgICAgZmluYWwgc2hvcnQgaGFzaEJpdHM7CisKKyAgICAgICAgcHVibGljIFBheWxvYWQobG9uZyBwb3NpdGlvbiwgc2hvcnQgaGFzaEJpdHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgICAgIGFzc2VydCB0aGlzLnBvc2l0aW9uICE9IE5PVF9GT1VORCA6ICJQYXJ0aXRpb24gcG9zaXRpb24gIiArIE5PVF9GT1VORCArICIgaXMgbm90IHZhbGlkLiI7CisgICAgICAgICAgICB0aGlzLmhhc2hCaXRzID0gaGFzaEJpdHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgZmluYWwgUGFydGl0aW9uSW5kZXhTZXJpYWxpemVyIFRSSUVfU0VSSUFMSVpFUiA9IG5ldyBQYXJ0aXRpb25JbmRleFNlcmlhbGl6ZXIoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBhcnRpdGlvbkluZGV4U2VyaWFsaXplciBpbXBsZW1lbnRzIFRyaWVTZXJpYWxpemVyPFBheWxvYWQsIERhdGFPdXRwdXRQbHVzPgorICAgIHsKKyAgICAgICAgcHVibGljIGludCBzaXplb2ZOb2RlKFNlcmlhbGl6YXRpb25Ob2RlPFBheWxvYWQ+IG5vZGUsIGxvbmcgbm9kZVBvc2l0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVHJpZU5vZGUudHlwZUZvcihub2RlLCBub2RlUG9zaXRpb24pLnNpemVvZk5vZGUobm9kZSkgKworICAgICAgICAgICAgICAgICAgIChub2RlLnBheWxvYWQoKSAhPSBudWxsID8gMSArIFNpemVkSW50cy5ub25aZXJvU2l6ZShub2RlLnBheWxvYWQoKS5wb3NpdGlvbikgOiAwKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShEYXRhT3V0cHV0UGx1cyBkZXN0LCBTZXJpYWxpemF0aW9uTm9kZTxQYXlsb2FkPiBub2RlLCBsb25nIG5vZGVQb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlKGRlc3QsIFRyaWVOb2RlLnR5cGVGb3Iobm9kZSwgbm9kZVBvc2l0aW9uKSwgbm9kZSwgbm9kZVBvc2l0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZShEYXRhT3V0cHV0UGx1cyBkZXN0LCBUcmllTm9kZSB0eXBlLCBTZXJpYWxpemF0aW9uTm9kZTxQYXlsb2FkPiBub2RlLCBsb25nIG5vZGVQb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIFBheWxvYWQgcGF5bG9hZCA9IG5vZGUucGF5bG9hZCgpOworICAgICAgICAgICAgaWYgKHBheWxvYWQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IFNpemVkSW50cy5ub25aZXJvU2l6ZShwYXlsb2FkLnBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAvLyBUaGUgcmVhZGVyIHN1cHBvcnRzIHBheWxvYWRzIGJvdGggd2l0aCAocGF5bG9hZEJpdHMgYmV0d2VlbiA4IGFuZCAxNSkgYW5kIHdpdGhvdXQgKHBheWxvYWRCaXRzCisgICAgICAgICAgICAgICAgLy8gYmV0d2VlbiAxIGFuZCA3KSBoYXNoLiBUbyBub3QgaW50cm9kdWNlIHVuZHVlIGNvbmZpZ3VyYXRpb24gY29tcGxleGl0eSwgd2UgYWx3YXlzIHdyaXRlIGEgaGFzaC4KKyAgICAgICAgICAgICAgICBpbnQgcGF5bG9hZEJpdHMgPSBGTEFHX0hBU19IQVNIX0JZVEUgKyAoc2l6ZSAtIDEpOworICAgICAgICAgICAgICAgIHR5cGUuc2VyaWFsaXplKGRlc3QsIG5vZGUsIHBheWxvYWRCaXRzLCBub2RlUG9zaXRpb24pOworICAgICAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKHBheWxvYWQuaGFzaEJpdHMpOworICAgICAgICAgICAgICAgIFNpemVkSW50cy53cml0ZShkZXN0LCBwYXlsb2FkLnBvc2l0aW9uLCBzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0eXBlLnNlcmlhbGl6ZShkZXN0LCBub2RlLCAwLCBub2RlUG9zaXRpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGxvbmcgc2l6ZSgpCisgICAgeworICAgICAgICByZXR1cm4ga2V5Q291bnQ7CisgICAgfQorCisgICAgcHVibGljIERlY29yYXRlZEtleSBmaXJzdEtleSgpCisgICAgeworICAgICAgICByZXR1cm4gZmlyc3Q7CisgICAgfQorCisgICAgcHVibGljIERlY29yYXRlZEtleSBsYXN0S2V5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBsYXN0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXJ0aXRpb25JbmRleCBzaGFyZWRDb3B5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgUGFydGl0aW9uSW5kZXgodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkVG8oUmVmLklkZW50aXR5Q29sbGVjdGlvbiBpZGVudGl0aWVzKQorICAgIHsKKyAgICAgICAgZmguYWRkVG8oaWRlbnRpdGllcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQYXJ0aXRpb25JbmRleCBsb2FkKEZpbGVIYW5kbGUuQnVpbGRlciBmaEJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcmVsb2FkKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IGZoQnVpbGRlci5jb21wbGV0ZSgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbG9hZChmaCwgcGFydGl0aW9uZXIsIHByZWxvYWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQYWlyPERlY29yYXRlZEtleSwgRGVjb3JhdGVkS2V5PiByZWFkRmlyc3RBbmRMYXN0S2V5KEZpbGUgZmlsZSwgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoUGFydGl0aW9uSW5kZXggaW5kZXggPSBsb2FkKG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZmlsZSksIHBhcnRpdGlvbmVyLCBmYWxzZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBQYWlyLmNyZWF0ZShpbmRleC5maXJzdEtleSgpLCBpbmRleC5sYXN0S2V5KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQYXJ0aXRpb25JbmRleCBsb2FkKEZpbGVIYW5kbGUgZmgsIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lciwgYm9vbGVhbiBwcmVsb2FkKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoRmlsZURhdGFJbnB1dCByZHIgPSBmaC5jcmVhdGVSZWFkZXIoZmguZGF0YUxlbmd0aCgpIC0gRk9PVEVSX0xFTkdUSCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgZmlyc3RQb3MgPSByZHIucmVhZExvbmcoKTsKKyAgICAgICAgICAgIGxvbmcga2V5Q291bnQgPSByZHIucmVhZExvbmcoKTsKKyAgICAgICAgICAgIGxvbmcgcm9vdCA9IHJkci5yZWFkTG9uZygpOworICAgICAgICAgICAgcmRyLnNlZWsoZmlyc3RQb3MpOworICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGZpcnN0ID0gcGFydGl0aW9uZXIgIT0gbnVsbCA/IHBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgocmRyKSkgOiBudWxsOworICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGxhc3QgPSBwYXJ0aXRpb25lciAhPSBudWxsID8gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChyZHIpKSA6IG51bGw7CisgICAgICAgICAgICBpZiAocHJlbG9hZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY3N1bSA9IDA7CisgICAgICAgICAgICAgICAgLy8gZm9yY2UgYSByZWFkIG9mIGFsbCB0aGUgcGFnZXMgb2YgdGhlIGluZGV4CisgICAgICAgICAgICAgICAgZm9yIChsb25nIHBvcyA9IDA7IHBvcyA8IGZoLmRhdGFMZW5ndGgoKTsgcG9zICs9IFBhZ2VBd2FyZS5QQUdFX1NJWkUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZHIuc2Vlayhwb3MpOworICAgICAgICAgICAgICAgICAgICBjc3VtICs9IHJkci5yZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIkNoZWNrc3VtIHt9IiwgY3N1bSk7ICAgICAgLy8gTm90ZTogdHJhY2UgaXMgcmVxdWlyZWQgc28gdGhhdCByZWFkcyBhcmVuJ3Qgb3B0aW1pemVkIGF3YXkuCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGFydGl0aW9uSW5kZXgoZmgsIHJvb3QsIGtleUNvdW50LCBmaXJzdCwgbGFzdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgeworICAgICAgICBmaC5jbG9zZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUaHJvd2FibGUgY2xvc2UoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCisgICAgeworICAgICAgICByZXR1cm4gZmguY2xvc2UoYWNjdW11bGF0ZSk7CisgICAgfQorCisgICAgcHVibGljIFJlYWRlciBvcGVuUmVhZGVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgUmVhZGVyKHRoaXMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBJbmRleFBvc0l0ZXJhdG9yIGFsbEtleXNJdGVyYXRvcigpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEluZGV4UG9zSXRlcmF0b3IodGhpcyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFJlYnVmZmVyZXIgaW5zdGFudGlhdGVSZWJ1ZmZlcmVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmaC5pbnN0YW50aWF0ZVJlYnVmZmVyZXIobnVsbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBmaWxlIGhhbmRsZSB0byB0aGUgZmlsZSBvbiBkaXNrLiBUaGlzIGlzIG5lZWRlZCBmb3IgbG9ja2luZyB0aGUgaW5kZXggaW4gUkFNLgorICAgICAqLworICAgIEZpbGVIYW5kbGUgZ2V0RmlsZUhhbmRsZSgpCisgICAgeworICAgICAgICByZXR1cm4gZmg7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBnZXRJbmRleFBvcyhCeXRlQnVmZmVyIGNvbnRlbnRzLCBpbnQgcGF5bG9hZFBvcywgaW50IGJ5dGVzKQorICAgIHsKKyAgICAgICAgaWYgKGJ5dGVzID49IEZMQUdfSEFTX0hBU0hfQllURSkKKyAgICAgICAgeworICAgICAgICAgICAgKytwYXlsb2FkUG9zOworICAgICAgICAgICAgYnl0ZXMgLT0gRkxBR19IQVNfSEFTSF9CWVRFIC0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnl0ZXMgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBOT1RfRk9VTkQ7CisgICAgICAgIHJldHVybiBTaXplZEludHMucmVhZChjb250ZW50cywgcGF5bG9hZFBvcywgYnl0ZXMpOworICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgQWNjZXB0b3I8QXJnVHlwZSwgUmVzdWx0VHlwZT4KKyAgICB7CisgICAgICAgIFJlc3VsdFR5cGUgYWNjZXB0KGxvbmcgcG9zaXRpb24sIGJvb2xlYW4gYXNzdW1lTm9NYXRjaCwgQXJnVHlwZSB2KSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZXMgbWV0aG9kcyB0byByZWFkIHRoZSBwYXJ0aXRpb24gaW5kZXggdHJpZS4KKyAgICAgKiBUaHJlYWQtdW5zYWZlLCB1c2VzIGNsYXNzIG1lbWJlcnMgdG8gc3RvcmUgbG9va3VwIHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVhZGVyIGV4dGVuZHMgV2Fsa2VyPFJlYWRlcj4KKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBSZWFkZXIoUGFydGl0aW9uSW5kZXggaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGluZGV4Lmluc3RhbnRpYXRlUmVidWZmZXJlcigpLCBpbmRleC5yb290KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBGaW5kcyBhIGNhbmRpZGF0ZSBmb3IgYW4gZXhhY3Qga2V5IHNlYXJjaC4gUmV0dXJucyBhbiBpZmlsZSAoaWYgcG9zaXRpdmUpIG9yIGRmaWxlIChpZiBuZWdhdGl2ZSwgdXNpbmcgfikKKyAgICAgICAgICogcG9zaXRpb24uIFRoZSBwb3NpdGlvbiByZXR1cm5lZCBoYXMgYSBsb3cgY2hhbmNlIG9mIGJlaW5nIGEgZGlmZmVyZW50IGVudHJ5LCBidXQgb25seSBpZiB0aGUgc291Z2h0IGtleQorICAgICAgICAgKiBpcyBub3QgcHJlc2VudCBpbiB0aGUgZmlsZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBsb25nIGV4YWN0Q2FuZGlkYXRlKERlY29yYXRlZEtleSBrZXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEEgaGl0IG11c3QgYmUgYSBwcmVmaXggb2YgdGhlIGJ5dGUtY29tcGFyYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUga2V5LgorICAgICAgICAgICAgaW50IGIgPSBmb2xsb3coa2V5KTsKKyAgICAgICAgICAgIC8vIElmIHRoZSBwcmVmaXggZW5kZWQgaW4gYSBub2RlIHdpdGggY2hpbGRyZW4gaXQgaXMgb25seSBhY2NlcHRhYmxlIGlmIGl0IGlzIGEgZnVsbCBtYXRjaC4KKyAgICAgICAgICAgIGlmIChiICE9IEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSAmJiBoYXNDaGlsZHJlbigpKQorICAgICAgICAgICAgICAgIHJldHVybiBOT1RfRk9VTkQ7CisgICAgICAgICAgICBpZiAoIWNoZWNrSGFzaEJpdHMoa2V5LmZpbHRlckhhc2hMb3dlckJpdHMoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9GT1VORDsKKyAgICAgICAgICAgIHJldHVybiBnZXRDdXJyZW50SW5kZXhQb3MoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGJvb2xlYW4gY2hlY2tIYXNoQml0cyhzaG9ydCBoYXNoQml0cykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGJ5dGVzID0gcGF5bG9hZEZsYWdzKCk7CisgICAgICAgICAgICBpZiAoYnl0ZXMgPCBGTEFHX0hBU19IQVNIX0JZVEUpCisgICAgICAgICAgICAgICAgcmV0dXJuIGJ5dGVzID4gMDsKKyAgICAgICAgICAgIHJldHVybiAoYnVmLmdldChwYXlsb2FkUG9zaXRpb24oKSkgPT0gKGJ5dGUpIGhhc2hCaXRzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyA8UmVzdWx0VHlwZT4gUmVzdWx0VHlwZSBjZWlsaW5nKFBhcnRpdGlvblBvc2l0aW9uIGtleSwgQWNjZXB0b3I8UGFydGl0aW9uUG9zaXRpb24sIFJlc3VsdFR5cGU+IGFjY2VwdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgLy8gTG9vayBmb3IgYSBwcmVmaXggb2YgdGhlIGtleS4gSWYgdGhlcmUgaXMgb25lLCB0aGUga2V5IGl0IHN0YW5kcyBmb3IgY291bGQgYmUgbGVzcywgZXF1YWwsIG9yIGdyZWF0ZXIKKyAgICAgICAgICAgIC8vIHRoYW4gdGhlIHJlcXVpcmVkIHZhbHVlIHNvIHRyeSB0aGF0IGZpcnN0LgorICAgICAgICAgICAgaW50IGIgPSBmb2xsb3dXaXRoR3JlYXRlcihrZXkpOworICAgICAgICAgICAgLy8gSWYgdGhlIHByZWZpeCBlbmRlZCBpbiBhIG5vZGUgd2l0aCBjaGlsZHJlbiBpdCBpcyBvbmx5IGFjY2VwdGFibGUgaWYgaXQgaXMgYSBmdWxsIG1hdGNoLgorICAgICAgICAgICAgaWYgKCFoYXNDaGlsZHJlbigpIHx8IGIgPT0gQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvbmcgaW5kZXhQb3MgPSBnZXRDdXJyZW50SW5kZXhQb3MoKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXhQb3MgIT0gTk9UX0ZPVU5EKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUmVzdWx0VHlwZSByZXMgPSBhY2NlcHRvci5hY2NlcHQoaW5kZXhQb3MsIGZhbHNlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIHRoYXQgd2FzIG5vdCBmb3VuZCwgdGhlIGNsb3Nlc3QgZ3JlYXRlciB2YWx1ZSBjYW4gYmUgdXNlZCBpbnN0ZWFkLCBhbmQgd2Uga25vdyB0aGF0CisgICAgICAgICAgICAvLyBpdCBzdGFuZHMgZm9yIGEga2V5IGdyZWF0ZXIgdGhhbiB0aGUgYXJndW1lbnQuCisgICAgICAgICAgICBpZiAoZ3JlYXRlckJyYW5jaCA9PSBOT05FKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgZ29NaW4oZ3JlYXRlckJyYW5jaCk7CisgICAgICAgICAgICBsb25nIGluZGV4UG9zID0gZ2V0Q3VycmVudEluZGV4UG9zKCk7CisgICAgICAgICAgICBpZiAoaW5kZXhQb3MgPT0gTk9UX0ZPVU5EKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICByZXR1cm4gYWNjZXB0b3IuYWNjZXB0KGluZGV4UG9zLCB0cnVlLCBrZXkpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgPFJlc3VsdFR5cGU+IFJlc3VsdFR5cGUgZmxvb3IoUGFydGl0aW9uUG9zaXRpb24ga2V5LCBBY2NlcHRvcjxQYXJ0aXRpb25Qb3NpdGlvbiwgUmVzdWx0VHlwZT4gYWNjZXB0b3IpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICAvLyBDaGVjayBmb3IgYSBwcmVmaXggYW5kIGZpbmQgY2xvc2VzdCBzbWFsbGVyIGJyYW5jaC4KKyAgICAgICAgICAgIExvbmcgaW5kZXhQb3MgPSBwcmVmaXhBbmROZWlnaGJvdXJzKGtleSwgUmVhZGVyOjpnZXRTcGVjaWZpY0luZGV4UG9zKTsKKworICAgICAgICAgICAgaWYgKGluZGV4UG9zICE9IG51bGwgJiYgaW5kZXhQb3MgIT0gTk9UX0ZPVU5EKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJlc3VsdFR5cGUgcmVzID0gYWNjZXB0b3IuYWNjZXB0KGluZGV4UG9zLCBmYWxzZSwga2V5KTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSByZXR1cm4gdGhlIEluZGV4SW5mbyBmb3IgdGhlIGNsb3Nlc3QgZW50cnkgb2YgdGhlIHNtYWxsZXIgYnJhbmNoICh3aGljaCBpcyB0aGUgbWF4IG9mIGxlc3NlckJyYW5jaCkuCisgICAgICAgICAgICAvLyBOb3RlIChzZWUgcHJlZml4QW5kTmVpZ2hib3Vycyk6IHNpbmNlIHdlIGFjY2VwdCBwcmVmaXggbWF0Y2hlcyBhYm92ZSwgYXQgdGhpcyBwb2ludCB0aGVyZSBjYW5ub3QgYmUgYW5vdGhlcgorICAgICAgICAgICAgLy8gcHJlZml4IG1hdGNoIHRoYXQgaXMgY2xvc2VyIHRoYW4gbWF4KGxlc3NlckJyYW5jaCkuCisgICAgICAgICAgICBpZiAobGVzc2VyQnJhbmNoID09IE5PTkUpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBnb01heChsZXNzZXJCcmFuY2gpOworICAgICAgICAgICAgaW5kZXhQb3MgPSBnZXRDdXJyZW50SW5kZXhQb3MoKTsKKyAgICAgICAgICAgIGlmIChpbmRleFBvcyA9PSBOT1RfRk9VTkQpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiBhY2NlcHRvci5hY2NlcHQoaW5kZXhQb3MsIHRydWUsIGtleSk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBMb25nIGdldFNwZWNpZmljSW5kZXhQb3MoaW50IHBvcywgaW50IGJpdHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRJbmRleFBvcyhidWYsIHBvcywgYml0cyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50SW5kZXhQb3MoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SW5kZXhQb3MoYnVmLCBwYXlsb2FkUG9zaXRpb24oKSwgcGF5bG9hZEZsYWdzKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0TGFzdEluZGV4UG9zaXRpb24oKQorICAgICAgICB7CisgICAgICAgICAgICBnb01heChyb290KTsKKyAgICAgICAgICAgIHJldHVybiBnZXRDdXJyZW50SW5kZXhQb3MoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUbyBiZSB1c2VkIG9ubHkgaW4gYW5hbHlzaXMuCisgICAgICAgICAqLworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgcHJvdGVjdGVkIGludCBwYXlsb2FkU2l6ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBieXRlcyA9IHBheWxvYWRGbGFncygpOworICAgICAgICAgICAgcmV0dXJuIGJ5dGVzID4gNyA/IGJ5dGVzIC0gNiA6IGJ5dGVzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0b3Igb2YgaW5kZXggcG9zaXRpb25zIGNvdmVyZWQgYmV0d2VlbiB0d28ga2V5cy4gU2luY2Ugd2Ugc3RvcmUgcHJlZml4ZXMgb25seSwgdGhlIGZpcnN0IGFuZCBsYXN0IHJldHVybmVkCisgICAgICogdmFsdWVzIGNhbiBiZSBvdXRzaWRlIHRoZSBzcGFuIChhbmQgaW5jbHVzaXZlbmVzcyBpcyBub3QgZ2l2ZW4gYXMgd2UgY2Fubm90IHZlcmlmeSBpdCkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbmRleFBvc0l0ZXJhdG9yIGV4dGVuZHMgVmFsdWVJdGVyYXRvcjxJbmRleFBvc0l0ZXJhdG9yPgorICAgIHsKKyAgICAgICAgc3RhdGljIGZpbmFsIGxvbmcgSU5WQUxJRCA9IC0xOworICAgICAgICBsb25nIHBvcyA9IElOVkFMSUQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBwYXJhbSBpbmRleCBQYXJ0aXRpb25JbmRleCB0byB1c2UgZm9yIHRoZSBpdGVyYXRpb24uCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBOb3RlOiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucyB0aGlzIGNsYXNzIGRvZXMgbm90IGtlZXAgYSByZWZlcmVuY2Ugb2YgdGhlIGluZGV4LiBDYWxsZXIgbXVzdCBlbnN1cmUgYQorICAgICAgICAgKiByZWZlcmVuY2UgaXMgaGVsZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoaXMgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEluZGV4UG9zSXRlcmF0b3IoUGFydGl0aW9uSW5kZXggaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGluZGV4Lmluc3RhbnRpYXRlUmVidWZmZXJlcigpLCBpbmRleC5yb290KTsKKyAgICAgICAgfQorCisgICAgICAgIEluZGV4UG9zSXRlcmF0b3IoUGFydGl0aW9uSW5kZXggaW5kZXgsIFBhcnRpdGlvblBvc2l0aW9uIHN0YXJ0LCBQYXJ0aXRpb25Qb3NpdGlvbiBlbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGluZGV4Lmluc3RhbnRpYXRlUmVidWZmZXJlcigpLCBpbmRleC5yb290LCBzdGFydCwgZW5kLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBpbiB0aGUgcm93IGluZGV4IG9yIGRhdGEgZmlsZS4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBsb25nIG5leHRJbmRleFBvcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHdpdGhvdXQgbWlzc2luZyBwb3NpdGlvbnMsIHdlIHNhdmUgYW5kIHJldXNlIHRoZSB1bnJldHVybmVkIHBvc2l0aW9uLgorICAgICAgICAgICAgaWYgKHBvcyA9PSBJTlZBTElEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvcyA9IG5leHRQYXlsb2FkZWROb2RlKCk7CisgICAgICAgICAgICAgICAgaWYgKHBvcyA9PSBJTlZBTElEKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0ZPVU5EOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnbyhwb3MpOworCisgICAgICAgICAgICBwb3MgPSBJTlZBTElEOyAvLyBtYWtlIHN1cmUgbmV4dCB0aW1lIHdlIGNhbGwgbmV4dFBheWxvYWRlZE5vZGUoKSBhZ2FpbgorICAgICAgICAgICAgcmV0dXJuIGdldEluZGV4UG9zKGJ1ZiwgcGF5bG9hZFBvc2l0aW9uKCksIHBheWxvYWRGbGFncygpKTsgLy8gdGhpcyBzaG91bGQgbm90IHRocm93CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkZWJ1Zy90ZXN0IGNvZGUKKyAgICAgKi8KKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgdm9pZCBkdW1wVHJpZShTdHJpbmcgZmlsZU5hbWUpCisgICAgeworICAgICAgICB0cnkoUHJpbnRTdHJlYW0gcHMgPSBuZXcgUHJpbnRTdHJlYW0oZmlsZU5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICBkdW1wVHJpZShwcyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQorICAgICAgICB7CisgICAgICAgICAgICBsb2dnZXIud2FybigiRmFpbGVkIHRvIGR1bXAgdHJpZSB0byB7fSBkdWUgdG8gZXhjZXB0aW9uIHt9IiwgZmlsZU5hbWUsIHQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGR1bXBUcmllKFByaW50U3RyZWFtIG91dCkKKyAgICB7CisgICAgICAgIHRyeSAoUmVhZGVyIHJkciA9IG9wZW5SZWFkZXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmRyLmR1bXBUcmllKG91dCwgKGJ1ZiwgcHBvcywgcGJpdHMpIC0+IExvbmcudG9TdHJpbmcoZ2V0SW5kZXhQb3MoYnVmLCBwcG9zLCBwYml0cykpKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1BhcnRpdGlvbkluZGV4QnVpbGRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1BhcnRpdGlvbkluZGV4QnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZjQzY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvUGFydGl0aW9uSW5kZXhCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzLkluY3JlbWVudGFsVHJpZVdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby50cmllcy5XYWxrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKKworLyoqCisgKiBQYXJ0aXRpb24gaW5kZXggYnVpbGRlcjogc3RvcmVzIGluZGV4IG9yIGRhdGEgcG9zaXRpb25zIGluIGFuIGluY3JlbWVudGFsbHkgYnVpbHQsIHBhZ2UgYXdhcmUgb24tZGlzayB0cmllLgorICogPHA+CisgKiBUaGUgZmlsZXMgY3JlYXRlZCBieSB0aGlzIGJ1aWxkZXIgYXJlIHJlYWQgYnkge0BsaW5rIFBhcnRpdGlvbkluZGV4fS4KKyAqLworY2xhc3MgUGFydGl0aW9uSW5kZXhCdWlsZGVyIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZQoreworICAgIHByaXZhdGUgZmluYWwgU2VxdWVudGlhbFdyaXRlciB3cml0ZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBJbmNyZW1lbnRhbFRyaWVXcml0ZXI8UGFydGl0aW9uSW5kZXguUGF5bG9hZD4gdHJpZVdyaXRlcjsKKyAgICBwcml2YXRlIGZpbmFsIEZpbGVIYW5kbGUuQnVpbGRlciBmaEJ1aWxkZXI7CisKKyAgICAvLyB0aGUgbGFzdCBzeW5jZWQgZGF0YSBmaWxlIHBvc2l0aW9uCisgICAgcHJpdmF0ZSBsb25nIGRhdGFTeW5jUG9zaXRpb247CisgICAgLy8gdGhlIGxhc3Qgc3luY2VkIHJvdyBpbmRleCBmaWxlIHBvc2l0aW9uCisgICAgcHJpdmF0ZSBsb25nIHJvd0luZGV4U3luY1Bvc2l0aW9uOworICAgIC8vIHRoZSBsYXN0IHN5bmNlZCBwYXJ0aXRpb24gaW5kZXggZmlsZSBwb3NpdGlvbgorICAgIHByaXZhdGUgbG9uZyBwYXJ0aXRpb25JbmRleFN5bmNQb3NpdGlvbjsKKworICAgIC8vIFBhcnRpYWwgaW5kZXggY2FuIG9ubHkgYmUgdXNlZCBhZnRlciBhbGwgdGhyZWUgZmlsZXMgaGF2ZSBiZWVuIHN5bmNlZCB0byB0aGUgcmVxdWlyZWQgcG9zaXRpb25zLgorICAgIHByaXZhdGUgbG9uZyBwYXJ0aWFsSW5kZXhEYXRhRW5kOworICAgIHByaXZhdGUgbG9uZyBwYXJ0aWFsSW5kZXhSb3dFbmQ7CisgICAgcHJpdmF0ZSBsb25nIHBhcnRpYWxJbmRleFBhcnRpdGlvbkVuZDsKKyAgICBwcml2YXRlIEluY3JlbWVudGFsVHJpZVdyaXRlci5QYXJ0aWFsVGFpbCBwYXJ0aWFsSW5kZXhUYWlsOworICAgIHByaXZhdGUgQ29uc3VtZXI8UGFydGl0aW9uSW5kZXg+IHBhcnRpYWxJbmRleENvbnN1bWVyOworICAgIHByaXZhdGUgRGVjb3JhdGVkS2V5IHBhcnRpYWxJbmRleExhc3RLZXk7CisKKyAgICBwcml2YXRlIGludCBsYXN0RGlmZlBvaW50OworICAgIHByaXZhdGUgRGVjb3JhdGVkS2V5IGZpcnN0S2V5OworICAgIHByaXZhdGUgRGVjb3JhdGVkS2V5IGxhc3RLZXk7CisgICAgcHJpdmF0ZSBEZWNvcmF0ZWRLZXkgbGFzdFdyaXR0ZW5LZXk7CisgICAgcHJpdmF0ZSBQYXJ0aXRpb25JbmRleC5QYXlsb2FkIGxhc3RQYXlsb2FkOworCisgICAgcHVibGljIFBhcnRpdGlvbkluZGV4QnVpbGRlcihTZXF1ZW50aWFsV3JpdGVyIHdyaXRlciwgRmlsZUhhbmRsZS5CdWlsZGVyIGZoQnVpbGRlcikKKyAgICB7CisgICAgICAgIHRoaXMud3JpdGVyID0gd3JpdGVyOworICAgICAgICB0aGlzLnRyaWVXcml0ZXIgPSBJbmNyZW1lbnRhbFRyaWVXcml0ZXIub3BlbihQYXJ0aXRpb25JbmRleC5UUklFX1NFUklBTElaRVIsIHdyaXRlcik7CisgICAgICAgIHRoaXMuZmhCdWlsZGVyID0gZmhCdWlsZGVyOworICAgIH0KKworICAgIC8qCisgICAgICogQ2FsbGVkIHdoZW4gcGFydGl0aW9uIGluZGV4IGhhcyBiZWVuIGZsdXNoZWQgdG8gdGhlIGdpdmVuIHBvc2l0aW9uLgorICAgICAqIElmIHRoaXMgbWFrZXMgYWxsIHJlcXVpcmVkIHBvc2l0aW9ucyBmb3IgYSBwYXJ0aWFsIHZpZXcgZmx1c2hlZCwgdGhpcyB3aWxsIGNhbGwgdGhlIHBhcnRpYWxJbmRleENvbnN1bWVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1hcmtQYXJ0aXRpb25JbmRleFN5bmNlZChsb25nIHVwVG9Qb3NpdGlvbikKKyAgICB7CisgICAgICAgIHBhcnRpdGlvbkluZGV4U3luY1Bvc2l0aW9uID0gdXBUb1Bvc2l0aW9uOworICAgICAgICByZWZyZXNoUmVhZGFibGVCb3VuZGFyeSgpOworICAgIH0KKworICAgIC8qCisgICAgICogQ2FsbGVkIHdoZW4gcm93IGluZGV4IGhhcyBiZWVuIGZsdXNoZWQgdG8gdGhlIGdpdmVuIHBvc2l0aW9uLgorICAgICAqIElmIHRoaXMgbWFrZXMgYWxsIHJlcXVpcmVkIHBvc2l0aW9ucyBmb3IgYSBwYXJ0aWFsIHZpZXcgZmx1c2hlZCwgdGhpcyB3aWxsIGNhbGwgdGhlIHBhcnRpYWxJbmRleENvbnN1bWVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1hcmtSb3dJbmRleFN5bmNlZChsb25nIHVwVG9Qb3NpdGlvbikKKyAgICB7CisgICAgICAgIHJvd0luZGV4U3luY1Bvc2l0aW9uID0gdXBUb1Bvc2l0aW9uOworICAgICAgICByZWZyZXNoUmVhZGFibGVCb3VuZGFyeSgpOworICAgIH0KKworICAgIC8qCisgICAgICogQ2FsbGVkIHdoZW4gZGF0YSBmaWxlIGhhcyBiZWVuIGZsdXNoZWQgdG8gdGhlIGdpdmVuIHBvc2l0aW9uLgorICAgICAqIElmIHRoaXMgbWFrZXMgYWxsIHJlcXVpcmVkIHBvc2l0aW9ucyBmb3IgYSBwYXJ0aWFsIHZpZXcgZmx1c2hlZCwgdGhpcyB3aWxsIGNhbGwgdGhlIHBhcnRpYWxJbmRleENvbnN1bWVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1hcmtEYXRhU3luY2VkKGxvbmcgdXBUb1Bvc2l0aW9uKQorICAgIHsKKyAgICAgICAgZGF0YVN5bmNQb3NpdGlvbiA9IHVwVG9Qb3NpdGlvbjsKKyAgICAgICAgcmVmcmVzaFJlYWRhYmxlQm91bmRhcnkoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVmcmVzaFJlYWRhYmxlQm91bmRhcnkoKQorICAgIHsKKyAgICAgICAgaWYgKHBhcnRpYWxJbmRleENvbnN1bWVyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChkYXRhU3luY1Bvc2l0aW9uIDwgcGFydGlhbEluZGV4RGF0YUVuZCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHJvd0luZGV4U3luY1Bvc2l0aW9uIDwgcGFydGlhbEluZGV4Um93RW5kKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAocGFydGl0aW9uSW5kZXhTeW5jUG9zaXRpb24gPCBwYXJ0aWFsSW5kZXhQYXJ0aXRpb25FbmQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gZmhCdWlsZGVyLndpdGhMZW5ndGhPdmVycmlkZSh3cml0ZXIuZ2V0TGFzdEZsdXNoT2Zmc2V0KCkpLmNvbXBsZXRlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJlc291cmNlIiwgIlJlZHVuZGFudFN1cHByZXNzaW9uIiB9KQorICAgICAgICAgICAgUGFydGl0aW9uSW5kZXggcGkgPSBuZXcgUGFydGl0aW9uSW5kZXhFYXJseShmaCwgcGFydGlhbEluZGV4VGFpbC5yb290KCksIHBhcnRpYWxJbmRleFRhaWwuY291bnQoKSwgZmlyc3RLZXksIHBhcnRpYWxJbmRleExhc3RLZXksIHBhcnRpYWxJbmRleFRhaWwuY3V0b2ZmKCksIHBhcnRpYWxJbmRleFRhaWwudGFpbCgpKTsKKyAgICAgICAgICAgIHBhcnRpYWxJbmRleENvbnN1bWVyLmFjY2VwdChwaSk7CisgICAgICAgICAgICBwYXJ0aWFsSW5kZXhDb25zdW1lciA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBmaEJ1aWxkZXIud2l0aExlbmd0aE92ZXJyaWRlKC0xKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgKiBAcGFyYW0gZGVjb3JhdGVkS2V5IHRoZSBrZXkgZm9yIHRoaXMgcmVjb3JkCisgICAgKiBAcGFyYW0gcG9zaXRpb24gdGhlIHBvc2l0aW9uIHRvIHdyaXRlIHdpdGggdGhlIHJlY29yZDoKKyAgICAqICAgIC0gcG9zaXRpdmUgaWYgcG9zaXRpb24gcG9pbnRzIHRvIGFuIGluZGV4IGVudHJ5IGluIHRoZSBpbmRleCBmaWxlCisgICAgKiAgICAtIG5lZ2F0aXZlIGlmIH5wb3NpdGlvbiBwb2ludHMgZGlyZWN0bHkgdG8gdGhlIGtleSBpbiB0aGUgZGF0YSBmaWxlCisgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFbnRyeShEZWNvcmF0ZWRLZXkgZGVjb3JhdGVkS2V5LCBsb25nIHBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChsYXN0S2V5ID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpcnN0S2V5ID0gZGVjb3JhdGVkS2V5OworICAgICAgICAgICAgbGFzdERpZmZQb2ludCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZGlmZlBvaW50ID0gQnl0ZUNvbXBhcmFibGUuZGlmZlBvaW50KGxhc3RLZXksIGRlY29yYXRlZEtleSwgV2Fsa2VyLkJZVEVfQ09NUEFSQUJMRV9WRVJTSU9OKTsKKyAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlIHByZXZQcmVmaXggPSBCeXRlQ29tcGFyYWJsZS5jdXQobGFzdEtleSwgTWF0aC5tYXgoZGlmZlBvaW50LCBsYXN0RGlmZlBvaW50KSk7CisgICAgICAgICAgICB0cmllV3JpdGVyLmFkZChwcmV2UHJlZml4LCBsYXN0UGF5bG9hZCk7CisgICAgICAgICAgICBsYXN0V3JpdHRlbktleSA9IGxhc3RLZXk7CisgICAgICAgICAgICBsYXN0RGlmZlBvaW50ID0gZGlmZlBvaW50OworICAgICAgICB9CisgICAgICAgIGxhc3RLZXkgPSBkZWNvcmF0ZWRLZXk7CisgICAgICAgIGxhc3RQYXlsb2FkID0gbmV3IFBhcnRpdGlvbkluZGV4LlBheWxvYWQocG9zaXRpb24sIGRlY29yYXRlZEtleS5maWx0ZXJIYXNoTG93ZXJCaXRzKCkpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGNvbXBsZXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBEbyBub3QgdHJpZ2dlciBwZW5kaW5nIHBhcnRpYWwgYnVpbGRzLgorICAgICAgICBwYXJ0aWFsSW5kZXhDb25zdW1lciA9IG51bGw7CisKKyAgICAgICAgaWYgKGxhc3RLZXkgIT0gbGFzdFdyaXR0ZW5LZXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlIHByZXZQcmVmaXggPSBCeXRlQ29tcGFyYWJsZS5jdXQobGFzdEtleSwgbGFzdERpZmZQb2ludCk7CisgICAgICAgICAgICB0cmllV3JpdGVyLmFkZChwcmV2UHJlZml4LCBsYXN0UGF5bG9hZCk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIHJvb3QgPSB0cmllV3JpdGVyLmNvbXBsZXRlKCk7CisgICAgICAgIGxvbmcgY291bnQgPSB0cmllV3JpdGVyLmNvdW50KCk7CisgICAgICAgIGxvbmcgZmlyc3RLZXlQb3MgPSB3cml0ZXIucG9zaXRpb24oKTsKKyAgICAgICAgaWYgKGZpcnN0S2V5ICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLndyaXRlV2l0aFNob3J0TGVuZ3RoKGZpcnN0S2V5LmdldEtleSgpLCB3cml0ZXIpOworICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVXaXRoU2hvcnRMZW5ndGgobGFzdEtleS5nZXRLZXkoKSwgd3JpdGVyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBsYXN0S2V5ID09IG51bGw7CisgICAgICAgICAgICB3cml0ZXIud3JpdGVTaG9ydCgwKTsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZVNob3J0KDApOworICAgICAgICB9CisKKyAgICAgICAgd3JpdGVyLndyaXRlTG9uZyhmaXJzdEtleVBvcyk7CisgICAgICAgIHdyaXRlci53cml0ZUxvbmcoY291bnQpOworICAgICAgICB3cml0ZXIud3JpdGVMb25nKHJvb3QpOworCisgICAgICAgIHdyaXRlci5zeW5jKCk7CisgICAgICAgIGZoQnVpbGRlci53aXRoTGVuZ3RoT3ZlcnJpZGUod3JpdGVyLmdldExhc3RGbHVzaE9mZnNldCgpKTsKKworICAgICAgICByZXR1cm4gcm9vdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZHMgYSBQYXJ0aXRpb25JbmRleCByZXByZXNlbnRpbmcgdGhlIHJlY29yZHMgd3JpdHRlbiB1bnRpbCB0aGlzIHBvaW50IHdpdGhvdXQgaW50ZXJydXB0aW5nIHdyaXRlcy4gQmVjYXVzZQorICAgICAqIGRhdGEgaW4gYnVmZmVyZWQgd3JpdGVycyBkb2VzIG5vdCBnZXQgaW1tZWRpYXRlbHkgZmx1c2hlZCB0byB0aGUgZmlsZSBzeXN0ZW0sIGFuZCB3ZSBkbyBub3Qgd2FudCB0byBmb3JjZSBmbHVzaGluZworICAgICAqIG9mIHRoZSByZWxldmFudCBmaWxlcyAod2hpY2ggZS5nLiBjb3VsZCBjYXVzZSBhIHByb2JsZW0gZm9yIGNvbXByZXNzZWQgZGF0YSBmaWxlcyksIHRoaXMgY2FsbCBjYW5ub3QgcmV0dXJuCisgICAgICogaW1tZWRpYXRlbHkuIEluc3RlYWQsIGl0IHdpbGwgdGFrZSBhbiBpbmRleCBzbmFwc2hvdCBidXQgd2FpdCB3aXRoIG1ha2luZyBpdCBhY3RpdmUgKGJ5IGNhbGxpbmcgdGhlIHByb3ZpZGVkCisgICAgICogY2FsbGJhY2spIHVudGlsIGl0IHJlZ2lzdGVycyB0aGF0IGFsbCByZWxldmFudCBmaWxlcyAoZGF0YSwgcm93IGluZGV4IGFuZCBwYXJ0aXRpb24gaW5kZXgpIGhhdmUgYmVlbiBmbHVzaGVkIGF0CisgICAgICogbGVhc3QgYXMgZmFyIGFzIHRoZSByZXF1aXJlZCBwb3NpdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FsbFdoZW5SZWFkeSBjYWxsYmFjayB0aGF0IGlzIGdpdmVuIHRoZSBwcmVwYXJlZCBwYXJ0aWFsIGluZGV4IHdoZW4gYWxsIHJlbGV2YW50IGRhdGEgaGFzIGJlZW4gZmx1c2hlZAorICAgICAqIEBwYXJhbSByb3dJbmRleEVuZCB0aGUgcG9zaXRpb24gaW4gdGhlIHJvdyBpbmRleCBmaWxlIHdlIG5lZWQgdG8gYmUgYWJsZSB0byByZWFkIHRvIChleGNsdXNpdmUpIHRvIHJlYWQgYWxsCisgICAgICogICAgICAgICAgICAgICAgICAgIHJlY29yZHMgd3JpdHRlbiBzbyBmYXIKKyAgICAgKiBAcGFyYW0gZGF0YUVuZCB0aGUgcG9zaXRpb24gaW4gdGhlIGRhdGEgZmlsZSB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gcmVhZCB0byAoZXhjbHVzaXZlKSB0byByZWFkIGFsbCByZWNvcmRzCisgICAgICogICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4gc28gZmFyCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZXF1ZXN0IHdhcyBhY2NlcHRlZCwgZmFsc2UgaWYgdGhlcmUncyBubyBwb2ludCB0byBkbyB0aGlzIGF0IHRoaXMgdGltZSAoZS5nLiBhbm90aGVyCisgICAgICogICAgICAgICBwYXJ0aWFsIHJlcHJlc2VudGF0aW9uIGlzIHByZXBhcmVkIGJ1dCBzdGlsbCBpc24ndCB1c2FibGUpLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGJ1aWxkUGFydGlhbChDb25zdW1lcjxQYXJ0aXRpb25JbmRleD4gY2FsbFdoZW5SZWFkeSwgbG9uZyByb3dJbmRleEVuZCwgbG9uZyBkYXRhRW5kKQorICAgIHsKKyAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCBhZHZhbmNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIHByZXBhcmVkLCB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uCisgICAgICAgIGlmIChsYXN0V3JpdHRlbktleSA9PSBwYXJ0aWFsSW5kZXhMYXN0S2V5KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIERvbid0IHdhc3RlIHRpbWUgaWYgYW4gaW5kZXggd2FzIGFscmVhZHkgcHJlcGFyZWQgYnV0IGhhc24ndCByZWFjaGVkIHVzYWJpbGl0eSB5ZXQuCisgICAgICAgIGlmIChwYXJ0aWFsSW5kZXhDb25zdW1lciAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBwYXJ0aWFsSW5kZXhUYWlsID0gdHJpZVdyaXRlci5tYWtlUGFydGlhbFJvb3QoKTsKKyAgICAgICAgICAgIHBhcnRpYWxJbmRleERhdGFFbmQgPSBkYXRhRW5kOworICAgICAgICAgICAgcGFydGlhbEluZGV4Um93RW5kID0gcm93SW5kZXhFbmQ7CisgICAgICAgICAgICBwYXJ0aWFsSW5kZXhQYXJ0aXRpb25FbmQgPSB3cml0ZXIucG9zaXRpb24oKTsKKyAgICAgICAgICAgIHBhcnRpYWxJbmRleExhc3RLZXkgPSBsYXN0V3JpdHRlbktleTsKKyAgICAgICAgICAgIHBhcnRpYWxJbmRleENvbnN1bWVyID0gY2FsbFdoZW5SZWFkeTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBcyB3cml0ZXMgaGFwcGVuIG9uIGluLW1lbW9yeSBidWZmZXJzLCBmYWlsdXJlIGhlcmUgaXMgbm90IGV4cGVjdGVkLgorICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gY2xvc2UgdGhlIGJ1aWxkZXIgYW5kIHJlbGVhc2UgYW55IGFzc29jaWF0ZWQgbWVtb3J5CisgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgIHsKKyAgICAgICAgdHJpZVdyaXRlci5jbG9zZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9QYXJ0aXRpb25JbmRleEVhcmx5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvUGFydGl0aW9uSW5kZXhFYXJseS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ODZlODcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvUGFydGl0aW9uSW5kZXhFYXJseS5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aTsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmVidWZmZXJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlRhaWxPdmVycmlkaW5nUmVidWZmZXJlcjsKKworLyoqCisgKiBFYXJseS1vcGVuZWQgcGFydGl0aW9uIGluZGV4LiBQYXJ0IG9mIHRoZSBkYXRhIGlzIGFscmVhZHkgd3JpdHRlbiB0byBmaWxlLCBidXQgc29tZSBub2RlcywgaW5jbHVkaW5nIHRoZSBvbmVzIGluIHRoZQorICogY2hhaW4gbGVhZGluZyB0byB0aGUgbGFzdCBlbnRyeSBpbiB0aGUgaW5kZXgsIGFyZSBpbiB0aGUgc3VwcGxpZWQgYnl0ZSBidWZmZXIgYW5kIGFyZSBhdHRhY2hlZCBhcyBhIHRhaWwgYXQgdGhlIGdpdmVuCisgKiBwb3NpdGlvbiB0byBmb3JtIGEgdmlldyBvdmVyIHRoZSBwYXJ0aWFsbHktd3JpdHRlbiBkYXRhLgorICovCitjbGFzcyBQYXJ0aXRpb25JbmRleEVhcmx5IGV4dGVuZHMgUGFydGl0aW9uSW5kZXgKK3sKKyAgICBmaW5hbCBsb25nIGN1dG9mZjsKKyAgICBmaW5hbCBCeXRlQnVmZmVyIHRhaWw7CisKKyAgICBwdWJsaWMgUGFydGl0aW9uSW5kZXhFYXJseShGaWxlSGFuZGxlIGZoLCBsb25nIHRyaWVSb290LCBsb25nIGtleUNvdW50LCBEZWNvcmF0ZWRLZXkgZmlyc3QsIERlY29yYXRlZEtleSBsYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgY3V0b2ZmLCBCeXRlQnVmZmVyIHRhaWwpCisgICAgeworICAgICAgICBzdXBlcihmaCwgdHJpZVJvb3QsIGtleUNvdW50LCBmaXJzdCwgbGFzdCk7CisgICAgICAgIHRoaXMuY3V0b2ZmID0gY3V0b2ZmOworICAgICAgICB0aGlzLnRhaWwgPSB0YWlsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZWJ1ZmZlcmVyIGluc3RhbnRpYXRlUmVidWZmZXJlcigpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFRhaWxPdmVycmlkaW5nUmVidWZmZXJlcihzdXBlci5pbnN0YW50aWF0ZVJlYnVmZmVyZXIoKSwgY3V0b2ZmLCB0YWlsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvUGFydGl0aW9uSXRlcmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9QYXJ0aXRpb25JdGVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZDhmZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvUGFydGl0aW9uSXRlcmF0b3IuamF2YQpAQCAtMCwwICsxLDI1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlBhcnRpdGlvblBvc2l0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5LZXlSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlRGF0YUlucHV0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzLmltbXV0YWJsZUxpc3RXaXRoRmlsdGVyZWROdWxsczsKKworLyoqCisgKiBQYXJ0aXRpb24gaXRlcmF0b3IgZm9yIHRoZSBCVEkgZm9ybWF0LgorICogPHA+CisgKiBBcyB0aGUgaW5kZXggc3RvcmVzIHByZWZpeGVzIG9mIGtleXMsIHRoZSBzbGljZSByZXR1cm5lZCBieSB0aGUgdW5kZXJseWluZyB7QGxpbmsgUGFydGl0aW9uSW5kZXguSW5kZXhQb3NJdGVyYXRvcn0KKyAqIG1heSBzdGFydCBhbmQgZW5kIHdpdGggZW50cmllcyB0aGF0IGhhdmUgdGhlIHNhbWUgcHJlZml4IGFzIHRoZSBwcm92aWRlZCBib3VuZHMsIGJ1dCBiZSBpbiB0aGUgd3JvbmcgcmVsYXRpb25zaGlwCisgKiB3aXRoIHRoZW0uIFRvIGZpbHRlciB0aGVzZSBvdXQsIHdlIHN0YXJ0IGJ5IGNoZWNraW5nIHRoZSBmaXJzdCBpdGVtIGR1cmluZyBpbml0aWFsaXphdGlvbiwgYW5kIGJ5IHdvcmtpbmcgb25lIGl0ZW0KKyAqIGFoZWFkLCBzbyB0aGF0IHdlIGNhbiByZWNvZ25pemUgdGhlIGVuZCBvZiB0aGUgc2xpY2UgYW5kIGNoZWNrIHRoZSBsYXN0IGl0ZW0gYmVmb3JlIHdlIHJldHVybiBpdC4KKyAqLworY2xhc3MgUGFydGl0aW9uSXRlcmF0b3IgZXh0ZW5kcyBQYXJ0aXRpb25JbmRleC5JbmRleFBvc0l0ZXJhdG9yIGltcGxlbWVudHMgS2V5UmVhZGVyCit7CisgICAgcHJpdmF0ZSBmaW5hbCBQYXJ0aXRpb25JbmRleCBwYXJ0aXRpb25JbmRleDsKKyAgICBwcml2YXRlIGZpbmFsIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lcjsKKyAgICBwcml2YXRlIGZpbmFsIFBhcnRpdGlvblBvc2l0aW9uIGxpbWl0OworICAgIHByaXZhdGUgZmluYWwgaW50IGV4Y2x1c2l2ZUxpbWl0OworICAgIHByaXZhdGUgZmluYWwgRmlsZUhhbmRsZSBkYXRhRmlsZTsKKyAgICBwcml2YXRlIGZpbmFsIEZpbGVIYW5kbGUgcm93SW5kZXhGaWxlOworCisgICAgcHJpdmF0ZSBGaWxlRGF0YUlucHV0IGRhdGFJbnB1dDsKKyAgICBwcml2YXRlIEZpbGVEYXRhSW5wdXQgaW5kZXhJbnB1dDsKKworICAgIHByaXZhdGUgRGVjb3JhdGVkS2V5IGN1cnJlbnRLZXk7CisgICAgcHJpdmF0ZSBUcmllSW5kZXhFbnRyeSBjdXJyZW50RW50cnk7CisgICAgcHJpdmF0ZSBEZWNvcmF0ZWRLZXkgbmV4dEtleTsKKyAgICBwcml2YXRlIFRyaWVJbmRleEVudHJ5IG5leHRFbnRyeTsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJlc291cmNlIiwgIlJlZHVuZGFudFN1cHByZXNzaW9uIiB9KQorICAgIHN0YXRpYyBQYXJ0aXRpb25JdGVyYXRvciBjcmVhdGUoUGFydGl0aW9uSW5kZXggcGFydGl0aW9uSW5kZXgsIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lciwgRmlsZUhhbmRsZSByb3dJbmRleEZpbGUsIEZpbGVIYW5kbGUgZGF0YUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aXRpb25Qb3NpdGlvbiBsZWZ0LCBpbnQgaW5jbHVzaXZlTGVmdCwgUGFydGl0aW9uUG9zaXRpb24gcmlnaHQsIGludCBleGNsdXNpdmVSaWdodCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBQYXJ0aXRpb25JdGVyYXRvciBwYXJ0aXRpb25JdGVyYXRvciA9IG51bGw7CisgICAgICAgIFBhcnRpdGlvbkluZGV4IHBhcnRpdGlvbkluZGV4Q29weSA9IG51bGw7CisgICAgICAgIEZpbGVIYW5kbGUgZGF0YUZpbGVDb3B5ID0gbnVsbDsKKyAgICAgICAgRmlsZUhhbmRsZSByb3dJbmRleEZpbGVDb3B5ID0gbnVsbDsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcGFydGl0aW9uSW5kZXhDb3B5ID0gcGFydGl0aW9uSW5kZXguc2hhcmVkQ29weSgpOworICAgICAgICAgICAgZGF0YUZpbGVDb3B5ID0gZGF0YUZpbGUuc2hhcmVkQ29weSgpOworICAgICAgICAgICAgcm93SW5kZXhGaWxlQ29weSA9IHJvd0luZGV4RmlsZS5zaGFyZWRDb3B5KCk7CisKKyAgICAgICAgICAgIHBhcnRpdGlvbkl0ZXJhdG9yID0gbmV3IFBhcnRpdGlvbkl0ZXJhdG9yKHBhcnRpdGlvbkluZGV4Q29weSwgcGFydGl0aW9uZXIsIHJvd0luZGV4RmlsZUNvcHksIGRhdGFGaWxlQ29weSwgbGVmdCwgcmlnaHQsIGV4Y2x1c2l2ZVJpZ2h0KTsKKworICAgICAgICAgICAgcGFydGl0aW9uSXRlcmF0b3IucmVhZE5leHQoKTsKKyAgICAgICAgICAgIC8vIEJlY2F1c2UgdGhlIGluZGV4IHN0b3JlcyBwcmVmaXhlcywgdGhlIGZpcnN0IHZhbHVlIGNhbiBiZSBpbiBhbnkgcmVsYXRpb25zaGlwIHdpdGggdGhlIGxlZnQgYm91bmQuCisgICAgICAgICAgICBpZiAocGFydGl0aW9uSXRlcmF0b3IubmV4dEtleSAhPSBudWxsICYmICEocGFydGl0aW9uSXRlcmF0b3IubmV4dEtleS5jb21wYXJlVG8obGVmdCkgPiBpbmNsdXNpdmVMZWZ0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYXJ0aXRpb25JdGVyYXRvci5yZWFkTmV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFydGl0aW9uSXRlcmF0b3IuYWR2YW5jZSgpOworICAgICAgICAgICAgcmV0dXJuIHBhcnRpdGlvbkl0ZXJhdG9yOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiB8IFJ1bnRpbWVFeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXJ0aXRpb25JdGVyYXRvciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhcnRpdGlvbkl0ZXJhdG9yLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGhyb3dhYmxlcy5jbG9zZU5vbk51bGxBbmRBZGRTdXBwcmVzc2VkKGV4LCByb3dJbmRleEZpbGVDb3B5LCBkYXRhRmlsZUNvcHksIHBhcnRpdGlvbkluZGV4Q29weSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBQYXJ0aXRpb25JdGVyYXRvciBjcmVhdGUoUGFydGl0aW9uSW5kZXggcGFydGl0aW9uSW5kZXgsIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lciwgRmlsZUhhbmRsZSByb3dJbmRleEZpbGUsIEZpbGVIYW5kbGUgZGF0YUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZShwYXJ0aXRpb25JbmRleCwgcGFydGl0aW9uZXIsIHJvd0luZGV4RmlsZSwgZGF0YUZpbGUsIHBhcnRpdGlvbkluZGV4LmZpcnN0S2V5KCksIC0xLCBwYXJ0aXRpb25JbmRleC5sYXN0S2V5KCksIDApOworICAgIH0KKworICAgIHN0YXRpYyBQYXJ0aXRpb25JdGVyYXRvciBlbXB0eShQYXJ0aXRpb25JbmRleCBwYXJ0aXRpb25JbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgUGFydGl0aW9uSXRlcmF0b3IocGFydGl0aW9uSW5kZXguc2hhcmVkQ29weSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFBhcnRpdGlvbkl0ZXJhdG9yKFBhcnRpdGlvbkluZGV4IHBhcnRpdGlvbkluZGV4LCBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIsIEZpbGVIYW5kbGUgcm93SW5kZXhGaWxlLCBGaWxlSGFuZGxlIGRhdGFGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uUG9zaXRpb24gbGVmdCwgUGFydGl0aW9uUG9zaXRpb24gcmlnaHQsIGludCBleGNsdXNpdmVSaWdodCkKKyAgICB7CisgICAgICAgIHN1cGVyKHBhcnRpdGlvbkluZGV4LCBsZWZ0LCByaWdodCk7CisgICAgICAgIHRoaXMucGFydGl0aW9uSW5kZXggPSBwYXJ0aXRpb25JbmRleDsKKyAgICAgICAgdGhpcy5wYXJ0aXRpb25lciA9IHBhcnRpdGlvbmVyOworICAgICAgICB0aGlzLmxpbWl0ID0gcmlnaHQ7CisgICAgICAgIHRoaXMuZXhjbHVzaXZlTGltaXQgPSBleGNsdXNpdmVSaWdodDsKKyAgICAgICAgdGhpcy5yb3dJbmRleEZpbGUgPSByb3dJbmRleEZpbGU7CisgICAgICAgIHRoaXMuZGF0YUZpbGUgPSBkYXRhRmlsZTsKKyAgICB9CisKKyAgICBwcml2YXRlIFBhcnRpdGlvbkl0ZXJhdG9yKFBhcnRpdGlvbkluZGV4IHBhcnRpdGlvbkluZGV4KQorICAgIHsKKyAgICAgICAgc3VwZXIocGFydGl0aW9uSW5kZXgsIHBhcnRpdGlvbkluZGV4LmZpcnN0S2V5KCksIHBhcnRpdGlvbkluZGV4LmZpcnN0S2V5KCkpOworICAgICAgICB0aGlzLnBhcnRpdGlvbkluZGV4ID0gcGFydGl0aW9uSW5kZXg7CisgICAgICAgIHRoaXMucGFydGl0aW9uZXIgPSBudWxsOworICAgICAgICB0aGlzLmxpbWl0ID0gcGFydGl0aW9uSW5kZXguZmlyc3RLZXkoKTsKKyAgICAgICAgdGhpcy5leGNsdXNpdmVMaW1pdCA9IC0xOworICAgICAgICB0aGlzLnJvd0luZGV4RmlsZSA9IG51bGw7CisgICAgICAgIHRoaXMuZGF0YUZpbGUgPSBudWxsOworCisgICAgICAgIHRoaXMuY3VycmVudEVudHJ5ID0gbnVsbDsKKyAgICAgICAgdGhpcy5jdXJyZW50S2V5ID0gbnVsbDsKKyAgICAgICAgdGhpcy5uZXh0RW50cnkgPSBudWxsOworICAgICAgICB0aGlzLm5leHRLZXkgPSBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICB7CisgICAgICAgIFRocm93YWJsZSBhY2N1bSA9IG51bGw7CisgICAgICAgIGFjY3VtID0gVGhyb3dhYmxlcy5jbG9zZShhY2N1bSwgaW1tdXRhYmxlTGlzdFdpdGhGaWx0ZXJlZE51bGxzKHBhcnRpdGlvbkluZGV4LCBkYXRhRmlsZSwgcm93SW5kZXhGaWxlKSk7CisgICAgICAgIGFjY3VtID0gVGhyb3dhYmxlcy5jbG9zZShhY2N1bSwgaW1tdXRhYmxlTGlzdFdpdGhGaWx0ZXJlZE51bGxzKGRhdGFJbnB1dCwgaW5kZXhJbnB1dCkpOworICAgICAgICBhY2N1bSA9IFRocm93YWJsZXMucGVyZm9ybShhY2N1bSwgc3VwZXI6OmNsb3NlKTsKKyAgICAgICAgVGhyb3dhYmxlcy5tYXliZUZhaWwoYWNjdW0pOworICAgIH0KKworICAgIHB1YmxpYyBEZWNvcmF0ZWRLZXkgZGVjb3JhdGVkS2V5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBjdXJyZW50S2V5OworICAgIH0KKworICAgIHB1YmxpYyBCeXRlQnVmZmVyIGtleSgpCisgICAgeworICAgICAgICByZXR1cm4gY3VycmVudEtleS5nZXRLZXkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBkYXRhUG9zaXRpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRFbnRyeSAhPSBudWxsID8gY3VycmVudEVudHJ5LnBvc2l0aW9uIDogLTE7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcga2V5UG9zaXRpb25Gb3JTZWNvbmRhcnlJbmRleCgpCisgICAgeworICAgICAgICByZXR1cm4gZGF0YVBvc2l0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIFRyaWVJbmRleEVudHJ5IGVudHJ5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBjdXJyZW50RW50cnk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gYWR2YW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY3VycmVudEtleSA9IG5leHRLZXk7CisgICAgICAgIGN1cnJlbnRFbnRyeSA9IG5leHRFbnRyeTsKKyAgICAgICAgaWYgKGN1cnJlbnRLZXkgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVhZE5leHQoKTsKKyAgICAgICAgICAgIC8vIGlmIG5leHRLZXkgaXMgbnVsbCwgdGhlbiBjdXJyZW50S2V5IGlzIHRoZSBsYXN0IGtleSB0byBiZSBwdWJsaXNoZWQsIHRoZXJlZm9yZSBjaGVjayBhZ2FpbnN0IGFueSBsaW1pdAorICAgICAgICAgICAgLy8gYW5kIHN1cHByZXNzIHRoZSBwYXJ0aXRpb24gaWYgaXQgaXMgYmV5b25kIHRoZSBsaW1pdAorICAgICAgICAgICAgaWYgKG5leHRLZXkgPT0gbnVsbCAmJiBsaW1pdCAhPSBudWxsICYmIGN1cnJlbnRLZXkuY29tcGFyZVRvKGxpbWl0KSA+IGV4Y2x1c2l2ZUxpbWl0KQorICAgICAgICAgICAgeyAgIC8vIGV4Y2x1ZGUgbGFzdCBwYXJ0aXRpb24gb3V0c2lkZSByYW5nZQorICAgICAgICAgICAgICAgIGN1cnJlbnRLZXkgPSBudWxsOworICAgICAgICAgICAgICAgIGN1cnJlbnRFbnRyeSA9IG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWFkTmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbG9uZyBwb3MgPSBuZXh0SW5kZXhQb3MoKTsKKyAgICAgICAgaWYgKHBvcyAhPSBQYXJ0aXRpb25JbmRleC5OT1RfRk9VTkQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwb3MgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZWVrSW5kZXhJbnB1dChwb3MpOworICAgICAgICAgICAgICAgIG5leHRLZXkgPSBwYXJ0aXRpb25lci5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGluZGV4SW5wdXQpKTsKKyAgICAgICAgICAgICAgICBuZXh0RW50cnkgPSBUcmllSW5kZXhFbnRyeS5kZXNlcmlhbGl6ZShpbmRleElucHV0LCBpbmRleElucHV0LmdldEZpbGVQb2ludGVyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvcyA9IH5wb3M7CisgICAgICAgICAgICAgICAgc2Vla0RhdGFJbnB1dChwb3MpOworICAgICAgICAgICAgICAgIG5leHRLZXkgPSBwYXJ0aXRpb25lci5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGRhdGFJbnB1dCkpOworICAgICAgICAgICAgICAgIG5leHRFbnRyeSA9IG5ldyBUcmllSW5kZXhFbnRyeShwb3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbmV4dEtleSA9IG51bGw7CisgICAgICAgICAgICBuZXh0RW50cnkgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlZWtJbmRleElucHV0KGxvbmcgcG9zKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChpbmRleElucHV0ID09IG51bGwpCisgICAgICAgICAgICBpbmRleElucHV0ID0gcm93SW5kZXhGaWxlLmNyZWF0ZVJlYWRlcihwb3MpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbmRleElucHV0LnNlZWsocG9zKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2Vla0RhdGFJbnB1dChsb25nIHBvcykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoZGF0YUlucHV0ID09IG51bGwpCisgICAgICAgICAgICBkYXRhSW5wdXQgPSBkYXRhRmlsZS5jcmVhdGVSZWFkZXIocG9zKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZGF0YUlucHV0LnNlZWsocG9zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0V4aGF1c3RlZCgpCisgICAgeworICAgICAgICByZXR1cm4gY3VycmVudEtleSA9PSBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKKyAgICB7CisgICAgICAgIGdvKHJvb3QpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIkJUSS1QYXJ0aXRpb25JdGVyYXRvciglcykiLCBwYXJ0aXRpb25JbmRleC5nZXRGaWxlSGFuZGxlKCkucGF0aCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvUm93SW5kZXhSZWFkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9Sb3dJbmRleFJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NjdjZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvUm93SW5kZXhSZWFkZXIuamF2YQpAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5jb25jdXJyZW50Lk5vdFRocmVhZFNhZmU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udHJpZXMuU2VyaWFsaXphdGlvbk5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udHJpZXMuVHJpZU5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udHJpZXMuVHJpZVNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udHJpZXMuV2Fsa2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2l6ZWRJbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworCisvKioKKyAqIFJlYWRlciBjbGFzcyBmb3Igcm93IGluZGV4IGZpbGVzIGNyZWF0ZWQgYnkge0BsaW5rIFJvd0luZGV4V3JpdGVyfS4KKyAqIDxwPgorICogUm93IGluZGV4ICJ0cmllcyIgZG8gbm90IG5lZWQgdG8gc3RvcmUgd2hvbGUga2V5cywgYXMgd2hhdCB3ZSBuZWVkIGZyb20gdGhlbSBpcyB0byBiZSBhYmxlIHRvIHRlbGwgd2hlcmUgaW4gdGhlIGRhdGEgZmlsZQorICogdG8gc3RhcnQgbG9va2luZyBmb3IgYSBnaXZlbiBrZXkuIEluc3RlYWQsIHdlIHN0b3JlIHNvbWUgcHJlZml4IHRoYXQgaXMgZ3JlYXRlciB0aGFuIHRoZSBncmVhdGVzdCBrZXkgb2YgdGhlIHByZXZpb3VzCisgKiBpbmRleCBzZWN0aW9uIGFuZCBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNtYWxsZXN0IGtleSBvZiB0aGUgbmV4dC4gU28gZm9yIGEgZ2l2ZW4ga2V5IHRoZSBmaXJzdCBpbmRleCBzZWN0aW9uCisgKiB0aGF0IGNvdWxkIHBvdGVudGlhbGx5IGNvbnRhaW4gaXQgaXMgZ2l2ZW4gYnkgdGhlIHRyaWUncyBmbG9vciBmb3IgdGhhdCBrZXkuCisgKiA8cD4KKyAqIFRoaXMgYnVpbGRzIHVwb24gdGhlIHRyaWUgV2Fsa2VyIGNsYXNzIHdoaWNoIHByb3ZpZGVzIGJhc2ljIHRyaWUgd2Fsa2luZyBmdW5jdGlvbmFsaXR5LiBUaGUgY2xhc3MgaXMgdGhyZWFkLXVuc2FmZQorICogYW5kIG11c3QgYmUgcmUtaW5zdGFudGlhdGVkIGZvciBldmVyeSB0aHJlYWQgdGhhdCBuZWVkcyBhY2Nlc3MgdG8gdGhlIHRyaWUgKGl0cyBvdmVyaGVhZCBpcyBiZWxvdyB0aGF0IG9mIGEKKyAqIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcn0pLgorICovCitATm90VGhyZWFkU2FmZQorcHVibGljIGNsYXNzIFJvd0luZGV4UmVhZGVyIGV4dGVuZHMgV2Fsa2VyPFJvd0luZGV4UmVhZGVyPgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX09QRU5fTUFSS0VSID0gODsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5kZXhJbmZvCisgICAgeworICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyBvZmZzZXQ7CisgICAgICAgIHB1YmxpYyBmaW5hbCBEZWxldGlvblRpbWUgb3BlbkRlbGV0aW9uOworCisgICAgICAgIEluZGV4SW5mbyhsb25nIG9mZnNldCwgRGVsZXRpb25UaW1lIG9wZW5EZWxldGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICB0aGlzLm9wZW5EZWxldGlvbiA9IG9wZW5EZWxldGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBSb3dJbmRleFJlYWRlcihGaWxlSGFuZGxlIGZpbGUsIGxvbmcgcm9vdCkKKyAgICB7CisgICAgICAgIHN1cGVyKGZpbGUuaW5zdGFudGlhdGVSZWJ1ZmZlcmVyKG51bGwpLCByb290KTsKKyAgICB9CisKKyAgICBwdWJsaWMgUm93SW5kZXhSZWFkZXIoRmlsZUhhbmRsZSBmaWxlLCBUcmllSW5kZXhFbnRyeSBlbnRyeSkKKyAgICB7CisgICAgICAgIHRoaXMoZmlsZSwgZW50cnkuaW5kZXhUcmllUm9vdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcHV0ZXMgdGhlIGZsb29yIGZvciBhIGdpdmVuIGtleS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5kZXhJbmZvIHNlcGFyYXRvckZsb29yKEJ5dGVDb21wYXJhYmxlIGtleSkKKyAgICB7CisgICAgICAgIC8vIENoZWNrIGZvciBhIHByZWZpeCBhbmQgZmluZCBjbG9zZXN0IHNtYWxsZXIgYnJhbmNoLgorICAgICAgICBJbmRleEluZm8gcmVzID0gcHJlZml4QW5kTmVpZ2hib3VycyhrZXksIFJvd0luZGV4UmVhZGVyOjpyZWFkUGF5bG9hZCk7CisgICAgICAgIC8vIElmIHRoZXJlJ3MgYSBwcmVmaXgsIGluIGEgc2VwYXJhdG9yIHRyaWUgaXQgY291bGQgYmUgbGVzcyB0aGFuLCBlcXVhbCwgb3IgZ3JlYXRlciB0aGFuIHNvdWdodCB2YWx1ZS4KKyAgICAgICAgLy8gU291Z2h0IHZhbHVlIGlzIHN0aWxsIGdyZWF0ZXIgdGhhbiBtYXggb2YgcHJldmlvdXMgc2VjdGlvbi4KKyAgICAgICAgLy8gT24gbWF0Y2ggdGhlIHByZWZpeCBtdXN0IGJlIHVzZWQgYXMgYSBzdGFydGluZyBwb2ludC4KKyAgICAgICAgaWYgKHJlcyAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKworICAgICAgICAvLyBPdGhlcndpc2UgcmV0dXJuIHRoZSBJbmRleEluZm8gZm9yIHRoZSBjbG9zZXN0IGVudHJ5IG9mIHRoZSBzbWFsbGVyIGJyYW5jaCAod2hpY2ggaXMgdGhlIG1heCBvZiBsZXNzZXJCcmFuY2gpLgorICAgICAgICAvLyBOb3RlIChzZWUgcHJlZml4QW5kTmVpZ2hib3Vycyk6IHNpbmNlIHdlIGFjY2VwdCBwcmVmaXggbWF0Y2hlcyBhYm92ZSwgYXQgdGhpcyBwb2ludCB0aGVyZSBjYW5ub3QgYmUgYW5vdGhlcgorICAgICAgICAvLyBwcmVmaXggbWF0Y2ggdGhhdCBpcyBjbG9zZXIgdGhhbiBtYXgobGVzc2VyQnJhbmNoKS4KKyAgICAgICAgaWYgKGxlc3NlckJyYW5jaCA9PSBOT05FKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGdvTWF4KGxlc3NlckJyYW5jaCk7CisgICAgICAgIHJldHVybiBnZXRDdXJyZW50SW5kZXhJbmZvKCk7CisgICAgfQorCisgICAgcHVibGljIEluZGV4SW5mbyBtaW4oKQorICAgIHsKKyAgICAgICAgZ29NaW4ocm9vdCk7CisgICAgICAgIHJldHVybiBnZXRDdXJyZW50SW5kZXhJbmZvKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEluZGV4SW5mbyBnZXRDdXJyZW50SW5kZXhJbmZvKCkKKyAgICB7CisgICAgICAgIHJldHVybiByZWFkUGF5bG9hZChwYXlsb2FkUG9zaXRpb24oKSwgcGF5bG9hZEZsYWdzKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBJbmRleEluZm8gcmVhZFBheWxvYWQoaW50IHBwb3MsIGludCBiaXRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlYWRQYXlsb2FkKGJ1ZiwgcHBvcywgYml0cyk7CisgICAgfQorCisgICAgc3RhdGljIEluZGV4SW5mbyByZWFkUGF5bG9hZChCeXRlQnVmZmVyIGJ1ZiwgaW50IHBwb3MsIGludCBiaXRzKQorICAgIHsKKyAgICAgICAgbG9uZyBkYXRhT2Zmc2V0OworICAgICAgICBpZiAoYml0cyA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGludCBieXRlcyA9IGJpdHMgJiB+RkxBR19PUEVOX01BUktFUjsKKyAgICAgICAgZGF0YU9mZnNldCA9IFNpemVkSW50cy5yZWFkKGJ1ZiwgcHBvcywgYnl0ZXMpOworICAgICAgICBwcG9zICs9IGJ5dGVzOworICAgICAgICBEZWxldGlvblRpbWUgZGVsZXRpb24gPSAoYml0cyAmIEZMQUdfT1BFTl9NQVJLRVIpICE9IDAKKyAgICAgICAgICAgICAgICA/IERlbGV0aW9uVGltZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGJ1ZiwgcHBvcykKKyAgICAgICAgICAgICAgICA6IG51bGw7CisgICAgICAgIHJldHVybiBuZXcgSW5kZXhJbmZvKGRhdGFPZmZzZXQsIGRlbGV0aW9uKTsKKyAgICB9CisKKyAgICAvLyBUaGUgdHJpZSBzZXJpYWxpemVyIGRlc2NyaWJlcyBob3cgdGhlIHBheWxvYWRzIGFyZSB3cml0dGVuLiBQbGFjZWQgaGVyZSAoaW5zdGVhZCBvZiB3cml0ZXIpIHNvIHRoYXQgcmVhZGluZyBhbmQKKyAgICAvLyB3cml0aW5nIHRoZSBwYXlsb2FkIGFyZSBjbG9zZSB0b2dldGhlciBzaG91bGQgdGhleSBuZWVkIHRvIGJlIGNoYW5nZWQuCisgICAgc3RhdGljIGZpbmFsIFRyaWVTZXJpYWxpemVyPEluZGV4SW5mbywgRGF0YU91dHB1dFBsdXM+IHRyaWVTZXJpYWxpemVyID0gbmV3IFRyaWVTZXJpYWxpemVyPEluZGV4SW5mbywgRGF0YU91dHB1dFBsdXM+KCkKKyAgICB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHNpemVvZk5vZGUoU2VyaWFsaXphdGlvbk5vZGU8SW5kZXhJbmZvPiBub2RlLCBsb25nIG5vZGVQb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFRyaWVOb2RlLnR5cGVGb3Iobm9kZSwgbm9kZVBvc2l0aW9uKS5zaXplb2ZOb2RlKG5vZGUpICsgc2l6ZW9mKG5vZGUucGF5bG9hZCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShEYXRhT3V0cHV0UGx1cyBkZXN0LCBTZXJpYWxpemF0aW9uTm9kZTxJbmRleEluZm8+IG5vZGUsIGxvbmcgbm9kZVBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGUoZGVzdCwgVHJpZU5vZGUudHlwZUZvcihub2RlLCBub2RlUG9zaXRpb24pLCBub2RlLCBub2RlUG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgc2l6ZW9mKEluZGV4SW5mbyBwYXlsb2FkKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IDA7CisgICAgICAgICAgICBpZiAocGF5bG9hZCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpemUgKz0gU2l6ZWRJbnRzLm5vblplcm9TaXplKHBheWxvYWQub2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpZiAoIXBheWxvYWQub3BlbkRlbGV0aW9uLmlzTGl2ZSgpKQorICAgICAgICAgICAgICAgICAgICBzaXplICs9IERlbGV0aW9uVGltZS5zZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKHBheWxvYWQub3BlbkRlbGV0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlKERhdGFPdXRwdXRQbHVzIGRlc3QsIFRyaWVOb2RlIHR5cGUsIFNlcmlhbGl6YXRpb25Ob2RlPEluZGV4SW5mbz4gbm9kZSwgbG9uZyBub2RlUG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBJbmRleEluZm8gcGF5bG9hZCA9IG5vZGUucGF5bG9hZCgpOworICAgICAgICAgICAgaW50IGJ5dGVzID0gMDsKKyAgICAgICAgICAgIGludCBoYXNPcGVuTWFya2VyID0gMDsKKyAgICAgICAgICAgIGlmIChwYXlsb2FkICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZXMgPSBTaXplZEludHMubm9uWmVyb1NpemUocGF5bG9hZC5vZmZzZXQpOworICAgICAgICAgICAgICAgIGFzc2VydCBieXRlcyA8IDggOiAiUm93IGluZGV4IGRvZXMgbm90IHN1cHBvcnQgcm93cyBsYXJnZXIgdGhhbiAzMiBQaUIiOworICAgICAgICAgICAgICAgIGlmICghcGF5bG9hZC5vcGVuRGVsZXRpb24uaXNMaXZlKCkpCisgICAgICAgICAgICAgICAgICAgIGhhc09wZW5NYXJrZXIgPSBGTEFHX09QRU5fTUFSS0VSOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHlwZS5zZXJpYWxpemUoZGVzdCwgbm9kZSwgYnl0ZXMgfCBoYXNPcGVuTWFya2VyLCBub2RlUG9zaXRpb24pOworICAgICAgICAgICAgaWYgKHBheWxvYWQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTaXplZEludHMud3JpdGUoZGVzdCwgcGF5bG9hZC5vZmZzZXQsIGJ5dGVzKTsKKworICAgICAgICAgICAgICAgIGlmIChoYXNPcGVuTWFya2VyID09IEZMQUdfT1BFTl9NQVJLRVIpCisgICAgICAgICAgICAgICAgICAgIERlbGV0aW9uVGltZS5zZXJpYWxpemVyLnNlcmlhbGl6ZShwYXlsb2FkLm9wZW5EZWxldGlvbiwgZGVzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH07CisKKyAgICAvLyBkZWJ1Zy90ZXN0IGNvZGUKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICBwdWJsaWMgdm9pZCBkdW1wVHJpZShQcmludFN0cmVhbSBvdXQpCisgICAgeworICAgICAgICBkdW1wVHJpZShvdXQsIFJvd0luZGV4UmVhZGVyOjpkdW1wUm93SW5kZXhFbnRyeSk7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBkdW1wUm93SW5kZXhFbnRyeShCeXRlQnVmZmVyIGJ1ZiwgaW50IHBwb3MsIGludCBiaXRzKQorICAgIHsKKyAgICAgICAgSW5kZXhJbmZvIGlpID0gcmVhZFBheWxvYWQoYnVmLCBwcG9zLCBiaXRzKTsKKworICAgICAgICByZXR1cm4gaWkgIT0gbnVsbAorICAgICAgICAgICAgICAgPyBTdHJpbmcuZm9ybWF0KCJwb3MgJXggJXMiLCBpaS5vZmZzZXQsIGlpLm9wZW5EZWxldGlvbiA9PSBudWxsID8gIiIgOiBpaS5vcGVuRGVsZXRpb24pCisgICAgICAgICAgICAgICA6ICJwb3MgbnVsbCI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1Jvd0luZGV4UmV2ZXJzZUl0ZXJhdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvUm93SW5kZXhSZXZlcnNlSXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWI2NjdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1Jvd0luZGV4UmV2ZXJzZUl0ZXJhdG9yLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpOworCitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aS5Sb3dJbmRleFJlYWRlci5JbmRleEluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udHJpZXMuUmV2ZXJzZVZhbHVlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworCisvKioKKyAqIFJldmVyc2UgaXRlcmF0b3Igb3ZlciB0aGUgcm93IGluZGV4LiBOZWVkZWQgdG8gZ2V0IHByZXZpb3VzIGluZGV4IGJsb2NrcyBmb3IgcmV2ZXJzZSBpdGVyYXRpb24uCisgKi8KK2NsYXNzIFJvd0luZGV4UmV2ZXJzZUl0ZXJhdG9yIGV4dGVuZHMgUmV2ZXJzZVZhbHVlSXRlcmF0b3I8Um93SW5kZXhSZXZlcnNlSXRlcmF0b3I+Cit7CisgICAgcHJpdmF0ZSBsb25nIGN1cnJlbnROb2RlID0gLTE7CisKKyAgICBwdWJsaWMgUm93SW5kZXhSZXZlcnNlSXRlcmF0b3IoRmlsZUhhbmRsZSBmaWxlLCBsb25nIHJvb3QsIEJ5dGVDb21wYXJhYmxlIHN0YXJ0LCBCeXRlQ29tcGFyYWJsZSBlbmQpCisgICAgeworICAgICAgICBzdXBlcihmaWxlLmluc3RhbnRpYXRlUmVidWZmZXJlcihudWxsKSwgcm9vdCwgc3RhcnQsIGVuZCwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIFJvd0luZGV4UmV2ZXJzZUl0ZXJhdG9yKEZpbGVIYW5kbGUgZmlsZSwgVHJpZUluZGV4RW50cnkgZW50cnksIEJ5dGVDb21wYXJhYmxlIGVuZCkKKyAgICB7CisgICAgICAgIHRoaXMoZmlsZSwgZW50cnkuaW5kZXhUcmllUm9vdCwgQnl0ZUNvbXBhcmFibGUuRU1QVFksIGVuZCk7CisgICAgfQorCisgICAgcHVibGljIEluZGV4SW5mbyBuZXh0SW5kZXhJbmZvKCkKKyAgICB7CisgICAgICAgIGlmIChjdXJyZW50Tm9kZSA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgICAgY3VycmVudE5vZGUgPSBuZXh0UGF5bG9hZGVkTm9kZSgpOworICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgZ28oY3VycmVudE5vZGUpOworICAgICAgICBJbmRleEluZm8gaW5mbyA9IFJvd0luZGV4UmVhZGVyLnJlYWRQYXlsb2FkKGJ1ZiwgcGF5bG9hZFBvc2l0aW9uKCksIHBheWxvYWRGbGFncygpKTsKKworICAgICAgICBjdXJyZW50Tm9kZSA9IC0xOworICAgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisKKyAgICAvLyBkZWJ1Zy90ZXN0IGNvZGUKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICBwdWJsaWMgdm9pZCBkdW1wVHJpZShQcmludFN0cmVhbSBvdXQpCisgICAgeworICAgICAgICBkdW1wVHJpZShvdXQsIFJvd0luZGV4UmVhZGVyOjpkdW1wUm93SW5kZXhFbnRyeSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1Jvd0luZGV4V3JpdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvUm93SW5kZXhXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWJhZjE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1Jvd0luZGV4V3JpdGVyLmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nQ29tcGFyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nUHJlZml4OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlbGV0aW9uVGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5idGkuUm93SW5kZXhSZWFkZXIuSW5kZXhJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzLkluY3JlbWVudGFsVHJpZVdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby50cmllcy5XYWxrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworCisvKioKKyAqIFByZXBhcmVyIC8gd3JpdGVyIG9mIHJvdyBpbmRleCB0cmllcyB0aGF0IGNhbiBiZSByZWFkIGJ5IHtAbGluayBSb3dJbmRleFJlYWRlcn0gYW5kIGl0ZXJhdGVkIGJ5CisgKiB7QGxpbmsgUm93SW5kZXhSZXZlcnNlSXRlcmF0b3J9LgorICogPHA+CisgKiBVc2VzIHtAbGluayBJbmNyZW1lbnRhbFRyaWVXcml0ZXJ9IHRvIGJ1aWxkIGEgdHJpZSBvZiBpbmRleCBzZWN0aW9uIHNlcGFyYXRvcnMgb2YgdGhlIHNob3J0ZXN0IHBvc3NpYmxlIGxlbmd0aCBzdWNoCisgKiB0aGF0IHtAY29kZSBwcmV2TWF4IDwgc2VwYXJhdG9yIDw9IG5leHRNaW59LgorICovCitjbGFzcyBSb3dJbmRleFdyaXRlciBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUKK3sKKyAgICBwcml2YXRlIGZpbmFsIENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3I7CisgICAgcHJpdmF0ZSBmaW5hbCBJbmNyZW1lbnRhbFRyaWVXcml0ZXI8SW5kZXhJbmZvPiB0cmllOworICAgIHByaXZhdGUgQnl0ZUNvbXBhcmFibGUgcHJldk1heCA9IG51bGw7CisgICAgcHJpdmF0ZSBCeXRlQ29tcGFyYWJsZSBwcmV2U2VwID0gbnVsbDsKKworICAgIFJvd0luZGV4V3JpdGVyKENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IsIERhdGFPdXRwdXRQbHVzIG91dCkKKyAgICB7CisgICAgICAgIHRoaXMuY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7CisgICAgICAgIHRoaXMudHJpZSA9IEluY3JlbWVudGFsVHJpZVdyaXRlci5vcGVuKFJvd0luZGV4UmVhZGVyLnRyaWVTZXJpYWxpemVyLCBvdXQpOworICAgIH0KKworICAgIHZvaWQgcmVzZXQoKQorICAgIHsKKyAgICAgICAgcHJldk1heCA9IG51bGw7CisgICAgICAgIHByZXZTZXAgPSBudWxsOworICAgICAgICB0cmllLnJlc2V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgIHsKKyAgICAgICAgdHJpZS5jbG9zZSgpOworICAgIH0KKworICAgIHZvaWQgYWRkKENsdXN0ZXJpbmdQcmVmaXg8Pz4gZmlyc3ROYW1lLCBDbHVzdGVyaW5nUHJlZml4PD8+IGxhc3ROYW1lLCBJbmRleEluZm8gaW5mbykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBhc3NlcnQgaW5mby5vcGVuRGVsZXRpb24gIT0gbnVsbDsKKyAgICAgICAgQnl0ZUNvbXBhcmFibGUgc2VwID0gcHJldk1heCA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQnl0ZUNvbXBhcmFibGUuRU1QVFkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCeXRlQ29tcGFyYWJsZS5zZXBhcmF0b3JHdChwcmV2TWF4LCBjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUoZmlyc3ROYW1lKSk7CisgICAgICAgIHRyaWUuYWRkKHNlcCwgaW5mbyk7CisgICAgICAgIHByZXZTZXAgPSBzZXA7CisgICAgICAgIHByZXZNYXggPSBjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUobGFzdE5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGNvbXBsZXRlKGxvbmcgZW5kUG9zKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIEFkZCBhIHNlcGFyYXRvciBhZnRlciB0aGUgbGFzdCBzZWN0aW9uLCBzbyB0aGF0IGdyZWF0ZXIgaW5wdXRzIGNhbiBiZSBxdWlja2x5IHJlamVjdGVkLgorICAgICAgICAvLyBUbyBtYXhpbWl6ZSBpdHMgZWZmaWNpZW5jeSB3ZSBhZGQgaXQgd2l0aCB0aGUgbGVuZ3RoIG9mIHRoZSBsYXN0IGFkZGVkIHNlcGFyYXRvci4KKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBCeXRlU291cmNlIG1heCA9IHByZXZNYXguYXNDb21wYXJhYmxlQnl0ZXMoV2Fsa2VyLkJZVEVfQ09NUEFSQUJMRV9WRVJTSU9OKTsKKyAgICAgICAgQnl0ZVNvdXJjZSBzZXAgPSBwcmV2U2VwLmFzQ29tcGFyYWJsZUJ5dGVzKFdhbGtlci5CWVRFX0NPTVBBUkFCTEVfVkVSU0lPTik7CisgICAgICAgIGludCBjOworICAgICAgICB3aGlsZSAoKGMgPSBtYXgubmV4dCgpKSA9PSBzZXAubmV4dCgpICYmIGMgIT0gQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgKytpOworICAgICAgICBhc3NlcnQgYyAhPSBCeXRlU291cmNlLkVORF9PRl9TVFJFQU0gOiAiQ29ycnVwdGVkIHJvdyBvcmRlciwgbWF4PSIgKyBwcmV2TWF4OworCisgICAgICAgIHRyaWUuYWRkKG51ZGdlKHByZXZNYXgsIGkpLCBuZXcgSW5kZXhJbmZvKGVuZFBvcywgRGVsZXRpb25UaW1lLkxJVkUpKTsKKworICAgICAgICByZXR1cm4gdHJpZS5jb21wbGV0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2VzIGEgc291cmNlIHRoYXQgaXMgc2xpZ2h0bHkgZ3JlYXRlciB0aGFuIGFyZ3VtZW50IHdpdGggbGVuZ3RoIGF0IGxlYXN0IG51ZGdlQXQuCisgICAgICovCisgICAgcHJpdmF0ZSBCeXRlQ29tcGFyYWJsZSBudWRnZShCeXRlQ29tcGFyYWJsZSB2YWx1ZSwgaW50IG51ZGdlQXQpCisgICAgeworICAgICAgICByZXR1cm4gdmVyc2lvbiAtPiBuZXcgQnl0ZVNvdXJjZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQnl0ZVNvdXJjZSB2ID0gdmFsdWUuYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbik7CisgICAgICAgICAgICBwcml2YXRlIGludCBjdXIgPSAwOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbmV4dCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGIgPSBCeXRlU291cmNlLkVORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgaWYgKGN1ciA8PSBudWRnZUF0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYiA9IHYubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY3VyID09IG51ZGdlQXQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiIDwgMHhGRikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2I7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7ICAvLyBjYW4ndCBudWRnZSBoZXJlLCBpbmNyZWFzZSBuZXh0IGluc3RlYWQgKGV2ZW50dWFsbHkgd2lsbCBiZSAtMSkKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK2N1cjsKKyAgICAgICAgICAgICAgICByZXR1cm4gYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvU1NUYWJsZUl0ZXJhdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvU1NUYWJsZUl0ZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUxMzc1YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9TU1RhYmxlSXRlcmF0b3IuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbGljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbGljZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0Um93SW5kZXhFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0U1NUYWJsZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aS5Sb3dJbmRleFJlYWRlci5JbmRleEluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlRGF0YUlucHV0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKKworLyoqCisgKiAgVW5maWx0ZXJlZCByb3cgaXRlcmF0b3Igb3ZlciBhIEJUSSBTU1RhYmxlLgorICovCitjbGFzcyBTU1RhYmxlSXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFNTVGFibGVJdGVyYXRvcjxBYnN0cmFjdFJvd0luZGV4RW50cnk+Cit7CisgICAgLyoqCisgICAgICogVGhlIGluZGV4IG9mIHRoZSBzbGljZSBiZWluZyBwcm9jZXNzZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc2xpY2U7CisKKyAgICBwdWJsaWMgU1NUYWJsZUl0ZXJhdG9yKEJ0aVRhYmxlUmVhZGVyIHNzdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGF0YUlucHV0IGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RSb3dJbmRleEVudHJ5IGluZGV4RW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTbGljZXMgc2xpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uRmlsdGVyIGNvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSGFuZGxlIGlmaWxlKQorICAgIHsKKyAgICAgICAgc3VwZXIoc3N0YWJsZSwgZmlsZSwga2V5LCBpbmRleEVudHJ5LCBzbGljZXMsIGNvbHVtbnMsIGlmaWxlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUmVhZGVyIGNyZWF0ZVJlYWRlckludGVybmFsKEFic3RyYWN0Um93SW5kZXhFbnRyeSBpbmRleEVudHJ5LCBGaWxlRGF0YUlucHV0IGZpbGUsIGJvb2xlYW4gc2hvdWxkQ2xvc2VGaWxlKQorICAgIHsKKyAgICAgICAgaWYgKGluZGV4RW50cnkuaXNJbmRleGVkKCkpCisgICAgICAgICAgICByZXR1cm4gbmV3IEZvcndhcmRJbmRleGVkUmVhZGVyKGluZGV4RW50cnksIGZpbGUsIHNob3VsZENsb3NlRmlsZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBuZXcgRm9yd2FyZFJlYWRlcihmaWxlLCBzaG91bGRDbG9zZUZpbGUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgbmV4dFNsaWNlSW5kZXgoKQorICAgIHsKKyAgICAgICAgaW50IG5leHQgPSBzbGljZTsKKyAgICAgICAgc2xpY2UrKzsKKyAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzTW9yZVNsaWNlcygpCisgICAgeworICAgICAgICByZXR1cm4gc2xpY2UgPCBzbGljZXMuc2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUmV2ZXJzZU9yZGVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEZvcndhcmRJbmRleGVkUmVhZGVyIGV4dGVuZHMgRm9yd2FyZFJlYWRlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSb3dJbmRleFJlYWRlciBpbmRleFJlYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGJhc2VQb3NpdGlvbjsKKworICAgICAgICBwcml2YXRlIEZvcndhcmRJbmRleGVkUmVhZGVyKEFic3RyYWN0Um93SW5kZXhFbnRyeSBpbmRleEVudHJ5LCBGaWxlRGF0YUlucHV0IGZpbGUsIGJvb2xlYW4gc2hvdWxkQ2xvc2VGaWxlKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihmaWxlLCBzaG91bGRDbG9zZUZpbGUpOworICAgICAgICAgICAgYmFzZVBvc2l0aW9uID0gaW5kZXhFbnRyeS5wb3NpdGlvbjsKKyAgICAgICAgICAgIGluZGV4UmVhZGVyID0gbmV3IFJvd0luZGV4UmVhZGVyKGlmaWxlLCAoVHJpZUluZGV4RW50cnkpIGluZGV4RW50cnkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGluZGV4UmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICBzdXBlci5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZvclNsaWNlKFNsaWNlIHNsaWNlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIuc2V0Rm9yU2xpY2Uoc2xpY2UpOworICAgICAgICAgICAgSW5kZXhJbmZvIGluZGV4SW5mbyA9IGluZGV4UmVhZGVyLnNlcGFyYXRvckZsb29yKG1ldGFkYXRhLmNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShzbGljZS5zdGFydCgpKSk7CisgICAgICAgICAgICBhc3NlcnQgaW5kZXhJbmZvICE9IG51bGw7CisgICAgICAgICAgICBsb25nIHBvc2l0aW9uID0gYmFzZVBvc2l0aW9uICsgaW5kZXhJbmZvLm9mZnNldDsKKyAgICAgICAgICAgIGlmIChmaWxlID09IG51bGwgfHwgcG9zaXRpb24gPiBmaWxlLmdldEZpbGVQb2ludGVyKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3Blbk1hcmtlciA9IGluZGV4SW5mby5vcGVuRGVsZXRpb247CisgICAgICAgICAgICAgICAgc2Vla1RvUG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIGFyZSBhbHJlYWR5IGluIHRoZSByZWxldmFudCBpbmRleCBibG9jaywgdGhlcmUgaXMgbm8gcG9pbnQgdG8gZ28gYmFjayB0byBpdHMgYmVnaW5uaW5nLgorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1NTVGFibGVSZXZlcnNlZEl0ZXJhdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvU1NUYWJsZVJldmVyc2VkSXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTFkNzJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1NTVGFibGVSZXZlcnNlZEl0ZXJhdG9yLmphdmEKQEAgLTAsMCArMSwyOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CisKK2ltcG9ydCBjb20uY2Fycm90c2VhcmNoLmhwcGMuTG9uZ1N0YWNrOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdCb3VuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nQ29tcGFyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2xpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2xpY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlVuZmlsdGVyZWRWYWxpZGF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5SYW5nZVRvbWJzdG9uZUJvdW5kTWFya2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUmFuZ2VUb21ic3RvbmVNYXJrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQWJzdHJhY3RSb3dJbmRleEVudHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQWJzdHJhY3RTU1RhYmxlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpLlJvd0luZGV4UmVhZGVyLkluZGV4SW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVEYXRhSW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworCisvKioKKyAqIFVuZmlsdGVyZWQgcm93IGl0ZXJhdG9yIG92ZXIgYSBCVEkgU1NUYWJsZSB0aGF0IHJldHVybnMgcm93cyBpbiByZXZlcnNlIG9yZGVyLgorICovCitjbGFzcyBTU1RhYmxlUmV2ZXJzZWRJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0U1NUYWJsZUl0ZXJhdG9yPFRyaWVJbmRleEVudHJ5PgoreworICAgIC8qKgorICAgICAqIFRoZSBpbmRleCBvZiB0aGUgc2xpY2UgYmVpbmcgcHJvY2Vzc2VkLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHNsaWNlOworCisgICAgcHVibGljIFNTVGFibGVSZXZlcnNlZEl0ZXJhdG9yKEJ0aVRhYmxlUmVhZGVyIHNzdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEYXRhSW5wdXQgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpZUluZGV4RW50cnkgaW5kZXhFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xpY2VzIHNsaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uRmlsdGVyIGNvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVIYW5kbGUgaWZpbGUpCisgICAgeworICAgICAgICBzdXBlcihzc3RhYmxlLCBmaWxlLCBrZXksIGluZGV4RW50cnksIHNsaWNlcywgY29sdW1ucywgaWZpbGUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBSZWFkZXIgY3JlYXRlUmVhZGVySW50ZXJuYWwoVHJpZUluZGV4RW50cnkgaW5kZXhFbnRyeSwgRmlsZURhdGFJbnB1dCBmaWxlLCBib29sZWFuIHNob3VsZENsb3NlRmlsZSkKKyAgICB7CisgICAgICAgIGlmIChpbmRleEVudHJ5LmlzSW5kZXhlZCgpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXZlcnNlSW5kZXhlZFJlYWRlcihpbmRleEVudHJ5LCBmaWxlLCBzaG91bGRDbG9zZUZpbGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbmV3IFJldmVyc2VSZWFkZXIoZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JldmVyc2VPcmRlcigpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IG5leHRTbGljZUluZGV4KCkKKyAgICB7CisgICAgICAgIGludCBuZXh0ID0gc2xpY2U7CisgICAgICAgIHNsaWNlKys7CisgICAgICAgIHJldHVybiBzbGljZXMuc2l6ZSgpIC0gKG5leHQgKyAxKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNNb3JlU2xpY2VzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzbGljZSA8IHNsaWNlcy5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV2ZXJzZSBpdGVyYXRpb24gaXMgcGVyZm9ybWVkIGJ5IGdvaW5nIHRocm91Z2ggYW4gaW5kZXggYmxvY2sgKG9yIHRoZSB3aG9sZSBwYXJ0aXRpb24gaWYgbm90IGluZGV4ZWQpIGZvcndhcmRzCisgICAgICogYW5kIHN0b3JpbmcgdGhlIHBvc2l0aW9ucyBvZiBlYWNoIGVudHJ5IHRoYXQgZmFsbHMgd2l0aGluIHRoZSBzbGljZSBpbiBhIHN0YWNrLiBSZXZlcnNlIGl0ZXJhdGlvbiB0aGVuIHBvcHMgb3V0CisgICAgICogcG9zaXRpb25zIGFuZCByZWFkcyB0aGUgZW50cmllcy4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlOiBUaGUgZWFybGllciB2ZXJzaW9uIG9mIHRoaXMgd2FzIGNvbnN0cnVjdGluZyBhbiBpbi1tZW1vcnkgdmlldyBvZiB0aGUgYmxvY2sgaW5zdGVhZCwgd2hpY2ggZ2l2ZXMgYmV0dGVyCisgICAgICogcGVyZm9ybWFuY2Ugb24gYmlnZ2VyIHF1ZXJpZXMgYW5kIGluZGV4IGJsb2NrcyAoZHVlIHRvIG5vdCBoYXZpbmcgdG8gcmVhZCBkaXNrIGFnYWluKS4gV2l0aCB0aGUgbG93ZXIKKyAgICAgKiBncmFudWxhcml0eSBvZiB0aGUgdHJpZXMgaXQgbWFrZXMgYmV0dGVyIHNlbnNlIHRvIHN0b3JlIGFzIGxpdHRsZSBhcyBwb3NzaWJsZSBhcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBibG9jaworICAgICAqIHNob3VsZCB2ZXJ5IHJhcmVseSBiZSBpbiBvdGhlciBwYWdlL2NodW5rIGNhY2hlIGxvY2F0aW9ucy4gVGhpcyBoYXMgdGhlIGJlbmVmaXQgb2YgYmVpbmcgYWJsZSB0byBhbnN3ZXIgc21hbGwKKyAgICAgKiBxdWVyaWVzIChlc3AuIExJTUlUIDEpIGZhc3RlciBhbmQgd2l0aCBsZXNzIEdDIGNodXJuLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgUmV2ZXJzZVJlYWRlciBleHRlbmRzIEFic3RyYWN0UmVhZGVyCisgICAgeworICAgICAgICBmaW5hbCBMb25nU3RhY2sgcm93T2Zmc2V0cyA9IG5ldyBMb25nU3RhY2soKTsKKyAgICAgICAgUmFuZ2VUb21ic3RvbmVNYXJrZXIgYmxvY2tPcGVuTWFya2VyLCBibG9ja0Nsb3NlTWFya2VyOworICAgICAgICBwcml2YXRlIFVuZmlsdGVyZWQgbmV4dCA9IG51bGw7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBmb3VuZExlc3NUaGFuOworICAgICAgICBwcml2YXRlIGxvbmcgc3RhcnRQb3MgPSAtMTsKKworICAgICAgICBwcml2YXRlIFJldmVyc2VSZWFkZXIoRmlsZURhdGFJbnB1dCBmaWxlLCBib29sZWFuIHNob3VsZENsb3NlRmlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRGb3JTbGljZShTbGljZSBzbGljZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHJlYWQgZnVsbCByb3cgYW5kIGZpbHRlcgorICAgICAgICAgICAgaWYgKHN0YXJ0UG9zID09IC0xKQorICAgICAgICAgICAgICAgIHN0YXJ0UG9zID0gZmlsZS5nZXRGaWxlUG9pbnRlcigpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNlZWtUb1Bvc2l0aW9uKHN0YXJ0UG9zKTsKKworICAgICAgICAgICAgZmlsbE9mZnNldHMoc2xpY2UsIHRydWUsIHRydWUsIExvbmcuTUFYX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOZXh0SW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG5leHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIG5leHQgPSBjb21wdXRlTmV4dCgpOworICAgICAgICAgICAgcmV0dXJuIG5leHQgIT0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZCBuZXh0SW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFoYXNOZXh0SW50ZXJuYWwoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBVbmZpbHRlcmVkIHRvUmV0dXJuID0gbmV4dDsKKyAgICAgICAgICAgIG5leHQgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIHRvUmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBVbmZpbHRlcmVkIGNvbXB1dGVOZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIFVuZmlsdGVyZWQgdG9SZXR1cm47CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChibG9ja0Nsb3NlTWFya2VyICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0b1JldHVybiA9IGJsb2NrQ2xvc2VNYXJrZXI7CisgICAgICAgICAgICAgICAgICAgIGJsb2NrQ2xvc2VNYXJrZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9SZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlICghcm93T2Zmc2V0cy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZWVrVG9Qb3NpdGlvbihyb3dPZmZzZXRzLnBvcCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNOZXh0ID0gZGVzZXJpYWxpemVyLmhhc05leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGhhc05leHQgOiAiRGF0YSBmaWxlIGNoYW5nZWQgYWZ0ZXIgb2Zmc2V0IGNvbGxlY3Rpb24gcGFzcyI7CisgICAgICAgICAgICAgICAgICAgIHRvUmV0dXJuID0gZGVzZXJpYWxpemVyLnJlYWROZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIFVuZmlsdGVyZWRWYWxpZGF0aW9uLm1heWJlVmFsaWRhdGVVbmZpbHRlcmVkKHRvUmV0dXJuLCBtZXRhZGF0YSgpLCBrZXksIHNzdGFibGUpOworICAgICAgICAgICAgICAgICAgICAvLyBXZSBtYXkgZ2V0IGVtcHR5IHJvdyBmb3IgdGhlIHNhbWUgcmVhc29uIGV4cHJlc3NlZCBvbiBVbmZpbHRlcmVkU2VyaWFsaXplci5kZXNlcmlhbGl6ZU9uZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCF0b1JldHVybi5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9SZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKCFmb3VuZExlc3NUaGFuICYmIGFkdmFuY2VJbmRleEJsb2NrKCkpOworCisgICAgICAgICAgICAvLyBvcGVuIG1hcmtlciB0byBiZSBvdXRwdXQgb25seSBhcyBzbGljZSBpcyBmaW5pc2hlZAorICAgICAgICAgICAgaWYgKGJsb2NrT3Blbk1hcmtlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRvUmV0dXJuID0gYmxvY2tPcGVuTWFya2VyOworICAgICAgICAgICAgICAgIGJsb2NrT3Blbk1hcmtlciA9IG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvUmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhZHZhbmNlSW5kZXhCbG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGZpbGxPZmZzZXRzKFNsaWNlIHNsaWNlLCBib29sZWFuIGZpbHRlclN0YXJ0LCBib29sZWFuIGZpbHRlckVuZCwgbG9uZyBzdG9wUG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBmaWx0ZXJTdGFydCAmPSAhc2xpY2Uuc3RhcnQoKS5lcXVhbHMoQ2x1c3RlcmluZ0JvdW5kLkJPVFRPTSk7CisgICAgICAgICAgICBmaWx0ZXJFbmQgJj0gIXNsaWNlLmVuZCgpLmVxdWFscyhDbHVzdGVyaW5nQm91bmQuVE9QKTsKKworICAgICAgICAgICAgQ2x1c3RlcmluZ0JvdW5kPD8+IHN0YXJ0ID0gc2xpY2Uuc3RhcnQoKTsKKyAgICAgICAgICAgIGxvbmcgY3VycmVudFBvc2l0aW9uID0gZmlsZS5nZXRGaWxlUG9pbnRlcigpOworICAgICAgICAgICAgZm91bmRMZXNzVGhhbiA9IGZhbHNlOworICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGNvcHkgb2YgaGFuZGxlUHJlU2xpY2VEYXRhIHdoaWNoIGFsc28gY2hlY2tzIGN1cnJlbnRQb3NpdGlvbiA8IHN0b3BQb3NpdGlvbi4KKyAgICAgICAgICAgIC8vIE5vdCBleHRyYWN0ZWQgdG8gbWV0aG9kIGFzIHdlIG5lZWQgYm90aCBtYXJrZXIgYW5kIGN1cnJlbnRQb3NpdGlvbi4KKyAgICAgICAgICAgIGlmIChmaWx0ZXJTdGFydCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudFBvc2l0aW9uIDwgc3RvcFBvc2l0aW9uICYmIGRlc2VyaWFsaXplci5oYXNOZXh0KCkgJiYgZGVzZXJpYWxpemVyLmNvbXBhcmVOZXh0VG8oc3RhcnQpIDw9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZGVzZXJpYWxpemVyLm5leHRJc1JvdygpKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzZXJpYWxpemVyLnNraXBOZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZU9wZW5NYXJrZXIoKFJhbmdlVG9tYnN0b25lTWFya2VyKSBkZXNlcmlhbGl6ZXIucmVhZE5leHQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uID0gZmlsZS5nZXRGaWxlUG9pbnRlcigpOworICAgICAgICAgICAgICAgICAgICBmb3VuZExlc3NUaGFuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGJlZ2lubmluZyBvZiBvdXIgcXVlcmllZCBzbGljZS4gSWYgd2UgaGF2ZSBhbiBvcGVuIG1hcmtlcgorICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIHJldHVybiB0aGF0IGF0IHRoZSBlbmQgb2YgdGhlIHNsaWNlIHRvIGNsb3NlIHRoZSBkZWxldGlvbi4KKyAgICAgICAgICAgIGlmIChvcGVuTWFya2VyICE9IG51bGwpCisgICAgICAgICAgICAgICAgYmxvY2tPcGVuTWFya2VyID0gbmV3IFJhbmdlVG9tYnN0b25lQm91bmRNYXJrZXIoc3RhcnQsIG9wZW5NYXJrZXIpOworCisKKyAgICAgICAgICAgIC8vIE5vdyBkZXNlcmlhbGl6ZSBldmVyeXRoaW5nIHVudGlsIHdlIHJlYWNoIG91ciByZXF1ZXN0ZWQgZW5kIChpZiB3ZSBoYXZlIG9uZSkKKyAgICAgICAgICAgIC8vIFNlZSBTU1RhYmxlSXRlcmF0b3IuRm9yd2FyZFJlYWQuY29tcHV0ZU5leHQoKSBmb3Igd2h5IHRoaXMgaXMgYSBzdHJpY3QgaW5lcXVhbGl0eSBiZWxvdzogdGhpcyBpcyB0aGUgc2FtZQorICAgICAgICAgICAgLy8gcmVhc29uaW5nIGhlcmUuCisgICAgICAgICAgICB3aGlsZSAoY3VycmVudFBvc2l0aW9uIDwgc3RvcFBvc2l0aW9uICYmIGRlc2VyaWFsaXplci5oYXNOZXh0KCkKKyAgICAgICAgICAgICAgICAgICAmJiAoIWZpbHRlckVuZCB8fCBkZXNlcmlhbGl6ZXIuY29tcGFyZU5leHRUbyhzbGljZS5lbmQoKSkgPCAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByb3dPZmZzZXRzLnB1c2goY3VycmVudFBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVzZXJpYWxpemVyLm5leHRJc1JvdygpKQorICAgICAgICAgICAgICAgICAgICBkZXNlcmlhbGl6ZXIuc2tpcE5leHQoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZU9wZW5NYXJrZXIoKFJhbmdlVG9tYnN0b25lTWFya2VyKSBkZXNlcmlhbGl6ZXIucmVhZE5leHQoKSk7CisKKyAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb24gPSBmaWxlLmdldEZpbGVQb2ludGVyKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYW4gb3BlbiBtYXJrZXIsIHdlIHNob3VsZCBvdXRwdXQgdGhhdCBmaXJzdCwgdW5sZXNzIGVuZCBpcyBub3QgYmVpbmcgZmlsdGVyZWQKKyAgICAgICAgICAgIC8vIChpLmUuIGl0J3MgZWl0aGVyIHRvcCAod2hlcmUgYSBtYXJrZXIgY2FuJ3QgYmUgb3Blbikgb3Igd2UgcGxhY2VkIHRoYXQgbWFya2VyIGR1cmluZyBwcmV2aW91cyBibG9jaykuCisgICAgICAgICAgICBpZiAob3Blbk1hcmtlciAhPSBudWxsICYmIGZpbHRlckVuZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIG5vIGVuZCBhbmQgc3RpbGwgYW4gb3Blbk1hcmtlciwgdGhpcyBtZWFucyB3ZSdyZSBpbmRleGVkIGFuZCB0aGUgbWFya2VyIGlzIGNsb3NlZCBpbiBhIGZvbGxvd2luZyBibG9jay4KKyAgICAgICAgICAgICAgICBibG9ja0Nsb3NlTWFya2VyID0gbmV3IFJhbmdlVG9tYnN0b25lQm91bmRNYXJrZXIoc2xpY2UuZW5kKCksIG9wZW5NYXJrZXIpOworICAgICAgICAgICAgICAgIG9wZW5NYXJrZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBSZXZlcnNlSW5kZXhlZFJlYWRlciBleHRlbmRzIFJldmVyc2VSZWFkZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgUm93SW5kZXhSZXZlcnNlSXRlcmF0b3IgaW5kZXhSZWFkZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgVHJpZUluZGV4RW50cnkgaW5kZXhFbnRyeTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGJhc2VQb3NpdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBTbGljZSBjdXJyZW50U2xpY2U7CisgICAgICAgIHByaXZhdGUgbG9uZyBjdXJyZW50QmxvY2tTdGFydDsKKworICAgICAgICBwdWJsaWMgUmV2ZXJzZUluZGV4ZWRSZWFkZXIoQWJzdHJhY3RSb3dJbmRleEVudHJ5IGluZGV4RW50cnksIEZpbGVEYXRhSW5wdXQgZmlsZSwgYm9vbGVhbiBzaG91bGRDbG9zZUZpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGZpbGUsIHNob3VsZENsb3NlRmlsZSk7CisgICAgICAgICAgICBiYXNlUG9zaXRpb24gPSBpbmRleEVudHJ5LnBvc2l0aW9uOworICAgICAgICAgICAgdGhpcy5pbmRleEVudHJ5ID0gKFRyaWVJbmRleEVudHJ5KSBpbmRleEVudHJ5OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbmRleFJlYWRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIGluZGV4UmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICBzdXBlci5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZvclNsaWNlKFNsaWNlIHNsaWNlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgY3VycmVudFNsaWNlID0gc2xpY2U7CisgICAgICAgICAgICBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbWV0YWRhdGEuY29tcGFyYXRvcjsKKyAgICAgICAgICAgIGlmIChpbmRleFJlYWRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIGluZGV4UmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICBpbmRleFJlYWRlciA9IG5ldyBSb3dJbmRleFJldmVyc2VJdGVyYXRvcihpZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4RW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUoc2xpY2UuZW5kKCkpKTsKKyAgICAgICAgICAgIGdvdG9CbG9jayhpbmRleFJlYWRlci5uZXh0SW5kZXhJbmZvKCksIHRydWUsIExvbmcuTUFYX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gZ290b0Jsb2NrKEluZGV4SW5mbyBpbmRleEluZm8sIGJvb2xlYW4gZmlsdGVyRW5kLCBsb25nIGJsb2NrRW5kKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgYmxvY2tPcGVuTWFya2VyID0gbnVsbDsKKyAgICAgICAgICAgIGJsb2NrQ2xvc2VNYXJrZXIgPSBudWxsOworICAgICAgICAgICAgcm93T2Zmc2V0cy5jbGVhcigpOworICAgICAgICAgICAgaWYgKGluZGV4SW5mbyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGN1cnJlbnRCbG9ja1N0YXJ0ID0gYmFzZVBvc2l0aW9uICsgaW5kZXhJbmZvLm9mZnNldDsKKyAgICAgICAgICAgIG9wZW5NYXJrZXIgPSBpbmRleEluZm8ub3BlbkRlbGV0aW9uOworCisgICAgICAgICAgICBzZWVrVG9Qb3NpdGlvbihjdXJyZW50QmxvY2tTdGFydCk7CisgICAgICAgICAgICBmaWxsT2Zmc2V0cyhjdXJyZW50U2xpY2UsIHRydWUsIGZpbHRlckVuZCwgYmxvY2tFbmQpOworICAgICAgICAgICAgcmV0dXJuICFyb3dPZmZzZXRzLmlzRW1wdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhZHZhbmNlSW5kZXhCbG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZ290b0Jsb2NrKGluZGV4UmVhZGVyLm5leHRJbmRleEluZm8oKSwgZmFsc2UsIGN1cnJlbnRCbG9ja1N0YXJ0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9TY3J1Ykl0ZXJhdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvU2NydWJJdGVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OTFhNmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvU2NydWJJdGVyYXRvci5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZURhdGFJbnB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CisKK3B1YmxpYyBjbGFzcyBTY3J1Ykl0ZXJhdG9yIGV4dGVuZHMgUGFydGl0aW9uSW5kZXguSW5kZXhQb3NJdGVyYXRvciBpbXBsZW1lbnRzIFNjcnViUGFydGl0aW9uSXRlcmF0b3IKK3sKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWEhBVVNURUQgPSAtMTsKKyAgICBCeXRlQnVmZmVyIGtleTsKKyAgICBsb25nIGRhdGFQb3NpdGlvbjsKKyAgICBmaW5hbCBGaWxlSGFuZGxlIHJvd0luZGV4RmlsZTsKKworICAgIFNjcnViSXRlcmF0b3IoUGFydGl0aW9uSW5kZXggcGFydGl0aW9uSW5kZXgsIEZpbGVIYW5kbGUgcm93SW5kZXhGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHN1cGVyKHBhcnRpdGlvbkluZGV4KTsKKyAgICAgICAgdGhpcy5yb3dJbmRleEZpbGUgPSByb3dJbmRleEZpbGUuc2hhcmVkQ29weSgpOworICAgICAgICBhZHZhbmNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgIHsKKyAgICAgICAgc3VwZXIuY2xvc2UoKTsKKyAgICAgICAgcm93SW5kZXhGaWxlLmNsb3NlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIga2V5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBrZXk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZGF0YVBvc2l0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkYXRhUG9zaXRpb247CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWR2YW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbG9uZyBwb3MgPSBuZXh0SW5kZXhQb3MoKTsKKyAgICAgICAgaWYgKHBvcyAhPSBQYXJ0aXRpb25JbmRleC5OT1RfRk9VTkQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwb3MgPj0gMCkgLy8gcm93IGluZGV4IHBvc2l0aW9uCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5IChGaWxlRGF0YUlucHV0IGluID0gcm93SW5kZXhGaWxlLmNyZWF0ZVJlYWRlcihwb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChpbik7CisgICAgICAgICAgICAgICAgICAgIGRhdGFQb3NpdGlvbiA9IFRyaWVJbmRleEVudHJ5LmRlc2VyaWFsaXplKGluLCBpbi5nZXRGaWxlUG9pbnRlcigpKS5wb3NpdGlvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga2V5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBkYXRhUG9zaXRpb24gPSB+cG9zOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAga2V5ID0gbnVsbDsKKyAgICAgICAgICAgIGRhdGFQb3NpdGlvbiA9IEVYSEFVU1RFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRXhoYXVzdGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkYXRhUG9zaXRpb24gPT0gRVhIQVVTVEVEOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9TY3J1YlBhcnRpdGlvbkl0ZXJhdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvU2NydWJQYXJ0aXRpb25JdGVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZjg4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvU2NydWJQYXJ0aXRpb25JdGVyYXRvci5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aTsKKworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworLyoqCisgKiBJdGVyYXRvciBvdmVyIHRoZSBwYXJ0aXRpb25zIG9mIGFuIHNzdGFibGUgdXNlZCBmb3Igc2NydWJiaW5nLgorICogPHA+CisgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIHtAbGluayBQYXJ0aXRpb25JdGVyYXRvcn0gaXMgdGhhdCB0aGlzIG9ubHkgdXNlcyBpbmZvcm1hdGlvbiBwcmVzZW50IGluIHRoZSBpbmRleCBmaWxlCisgKiBhbmQgZG9lcyBub3QgdHJ5IHRvIHJlYWQga2V5cyBvZiB0aGUgZGF0YSBmaWxlIChmb3IgdGhlIHRyaWUgaW5kZXggZm9ybWF0KSwgdGh1cyB7QGxpbmsgI2tleSgpfSBjYW4gYmUgbnVsbC4KKyAqIDxwPgorICogU3RhcnRzIGFkdmFuY2VkIHRvIGEgcG9zaXRpb24sIHtAbGluayAjYWR2YW5jZSgpfSBpcyB0byBiZSB1c2VkIHRvIGdvIHRvIG5leHQsIGFuZCBpdGVyYXRpb24gY29tcGxldGVzIHdoZW4KKyAqIHtAbGluayAjZGF0YVBvc2l0aW9uKCl9ID09IC0xLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFNjcnViUGFydGl0aW9uSXRlcmF0b3IgZXh0ZW5kcyBDbG9zZWFibGUKK3sKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVkIHBhcnRpdGlvbiBrZXkgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBpdGVyYXRvciByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGluZGV4IG9yIGlmIHRoZSBrZXkgbWF5IG5vdAorICAgICAqIGJlIGZ1bGx5IHJldHJpZXZlZCBmcm9tIHRoZSBpbmRleCBmaWxlLgorICAgICAqLworICAgIEJ5dGVCdWZmZXIga2V5KCk7CisKKyAgICAvKioKKyAgICAgKiBLZXkgcG9zaXRpb24gaW4gZGF0YSBmaWxlIG9yIC0xIGlmIHRoZSBpdGVyYXRvciByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGluZGV4LgorICAgICAqLworICAgIGxvbmcgZGF0YVBvc2l0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBNb3ZlIHRvIHRoZSBuZXh0IHBvc2l0aW9uIGluIHRoZSBpbmRleCBmaWxlLgorICAgICAqLworICAgIHZvaWQgYWR2YW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIGJvb2xlYW4gaXNFeGhhdXN0ZWQoKTsKKworICAgIHZvaWQgY2xvc2UoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9UcmllSW5kZXhFbnRyeS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1RyaWVJbmRleEVudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RiNzQzYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9UcmllSW5kZXhFbnRyeS5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5idGk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25UaW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQWJzdHJhY3RSb3dJbmRleEVudHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CisKKy8qKgorICogSW5kZXggZW50cnkgZm9yIHRoZSBCVEkgcGFydGl0aW9uIGluZGV4LiBUaGlzIGNhbiBiZSBhIHNpbXBsZSBwb3NpdGlvbiBpbiB0aGUgZGF0YSBmaWxlLCBvciBhbiBlbnRyeSBpbiB0aGUgcm93CisgKiBpbmRleCBmaWxlIHdoZXJlIHRoZSByb3dzIGFyZSBpbmRleGVkIGluIGJsb2NrcyAoc2VlIHtAbGluayBSb3dJbmRleFJlYWRlcn0pLgorICovCitmaW5hbCBjbGFzcyBUcmllSW5kZXhFbnRyeSBleHRlbmRzIEFic3RyYWN0Um93SW5kZXhFbnRyeQoreworICAgIGZpbmFsIGxvbmcgaW5kZXhUcmllUm9vdDsKKyAgICBwcml2YXRlIGZpbmFsIGludCByb3dJbmRleEJsb2NrQ291bnQ7CisgICAgcHJpdmF0ZSBmaW5hbCBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lOworCisgICAgVHJpZUluZGV4RW50cnkobG9uZyBkYXRhRmlsZVBvc2l0aW9uLCBsb25nIGluZGV4VHJpZVJvb3QsIGludCByb3dJbmRleEJsb2NrQ291bnQsIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUpCisgICAgeworICAgICAgICBzdXBlcihkYXRhRmlsZVBvc2l0aW9uKTsKKyAgICAgICAgdGhpcy5pbmRleFRyaWVSb290ID0gaW5kZXhUcmllUm9vdDsKKyAgICAgICAgdGhpcy5yb3dJbmRleEJsb2NrQ291bnQgPSByb3dJbmRleEJsb2NrQ291bnQ7CisgICAgICAgIHRoaXMuZGVsZXRpb25UaW1lID0gZGVsZXRpb25UaW1lOworICAgIH0KKworICAgIHB1YmxpYyBUcmllSW5kZXhFbnRyeShsb25nIHBvc2l0aW9uKQorICAgIHsKKyAgICAgICAgc3VwZXIocG9zaXRpb24pOworICAgICAgICB0aGlzLmluZGV4VHJpZVJvb3QgPSAtMTsKKyAgICAgICAgdGhpcy5yb3dJbmRleEJsb2NrQ291bnQgPSAwOworICAgICAgICB0aGlzLmRlbGV0aW9uVGltZSA9IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBibG9ja0NvdW50KCkKKyAgICB7CisgICAgICAgIHJldHVybiByb3dJbmRleEJsb2NrQ291bnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNTVGFibGVGb3JtYXQ8PywgPz4gZ2V0U1NUYWJsZUZvcm1hdCgpCisgICAgeworICAgICAgICB0aHJvdyBub0tleUNhY2hlRXJyb3IoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemVGb3JDYWNoZShEYXRhT3V0cHV0UGx1cyBvdXQpCisgICAgeworICAgICAgICB0aHJvdyBub0tleUNhY2hlRXJyb3IoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBBc3NlcnRpb25FcnJvciBub0tleUNhY2hlRXJyb3IoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBc3NlcnRpb25FcnJvcigiQlRJIFNTVGFibGVzIHNob3VsZCBub3QgdXNlIGtleSBjYWNoZSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxldGlvblRpbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgdW5zaGFyZWRIZWFwU2l6ZSgpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIkJUSSBTU1RhYmxlcyBpbmRleCBlbnRyaWVzIHNob3VsZCBub3QgYmUgcGVyc2lzdGVkIGluIGFueSBpbi1tZW1vcnkgc3RydWN0dXJlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKERhdGFPdXRwdXRQbHVzIGluZGV4RmlsZSwgbG9uZyBiYXNlUG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgYXNzZXJ0IGluZGV4VHJpZVJvb3QgIT0gLTEgJiYgcm93SW5kZXhCbG9ja0NvdW50ID4gMCAmJiBkZWxldGlvblRpbWUgIT0gbnVsbDsKKyAgICAgICAgaW5kZXhGaWxlLndyaXRlVW5zaWduZWRWSW50KHBvc2l0aW9uKTsKKyAgICAgICAgaW5kZXhGaWxlLndyaXRlVkludChpbmRleFRyaWVSb290IC0gYmFzZVBvc2l0aW9uKTsKKyAgICAgICAgaW5kZXhGaWxlLndyaXRlVW5zaWduZWRWSW50MzIocm93SW5kZXhCbG9ja0NvdW50KTsKKyAgICAgICAgRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGRlbGV0aW9uVGltZSwgaW5kZXhGaWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaW5kZXggZW50cnkuIFRoZSByb3cgaW5kZXggdHJpZSBtdXN0IGFscmVhZHkgaGF2ZSBiZWVuIHdyaXR0ZW4gKGJ5IFJvd0luZGV4V3JpdGVyKSB0byB0aGUgcm93IGluZGV4CisgICAgICogZmlsZSBhbmQgaXRzIHJvb3QgcG9zaXRpb24gbXVzdCBiZSBzcGVjaWZpZWQgaW4gdHJpZVJvb3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUcmllSW5kZXhFbnRyeSBjcmVhdGUobG9uZyBkYXRhU3RhcnRQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHRyaWVSb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0aW9uVGltZSBwYXJ0aXRpb25MZXZlbERlbGV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dJbmRleEJsb2NrQ291bnQpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFRyaWVJbmRleEVudHJ5KGRhdGFTdGFydFBvc2l0aW9uLCB0cmllUm9vdCwgdHJpZVJvb3QgPT0gLTEgPyAwIDogcm93SW5kZXhCbG9ja0NvdW50LCBwYXJ0aXRpb25MZXZlbERlbGV0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRyaWVJbmRleEVudHJ5IGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4sIGxvbmcgYmFzZVBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGxvbmcgZGF0YUZpbGVQb3NpdGlvbiA9IGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgbG9uZyBpbmRleFRyaWVSb290ID0gaW4ucmVhZFZJbnQoKSArIGJhc2VQb3NpdGlvbjsKKyAgICAgICAgaW50IHJvd0luZGV4QmxvY2tDb3VudCA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOworICAgICAgICBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lID0gRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4pOworICAgICAgICByZXR1cm4gbmV3IFRyaWVJbmRleEVudHJ5KGRhdGFGaWxlUG9zaXRpb24sIGluZGV4VHJpZVJvb3QsIHJvd0luZGV4QmxvY2tDb3VudCwgZGVsZXRpb25UaW1lKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvaW5kZXhzdW1tYXJ5L0luZGV4U3VtbWFyeS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9pbmRleHN1bW1hcnkvSW5kZXhTdW1tYXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA1ZDIzNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvaW5kZXhzdW1tYXJ5L0luZGV4U3VtbWFyeS5qYXZhCkBAIC0wLDAgKzEsNDg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlBhcnRpdGlvblBvc2l0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRvd25zYW1wbGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXMuRGF0YUlucHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuTWVtb3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuTWVtb3J5T3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5XcmFwcGVkU2hhcmVkQ2xvc2VhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5NZW1vcnlVdGlsOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRG93bnNhbXBsaW5nLkJBU0VfU0FNUExJTkdfTEVWRUw7CisKKy8qCisgKiBMYXlvdXQgb2YgTWVtb3J5IGZvciBpbmRleCBzdW1tYXJpZXM6CisgKgorICogVGhlcmUgYXJlIHR3byBzZWN0aW9uczoKKyAqICAxLiBBICJoZWFkZXIiIGNvbnRhaW5pbmcgdGhlIG9mZnNldCBpbnRvIGBieXRlc2Agb2YgZW50cmllcyBpbiB0aGUgc3VtbWFyeSBzdW1tYXJ5IGRhdGEsIGNvbnNpc3Rpbmcgb2YKKyAqICAgICBvbmUgZm91ciBieXRlIHBvc2l0aW9uIGZvciBlYWNoIGVudHJ5IGluIHRoZSBzdW1tYXJ5LiAgVGhpcyBhbGxvd3MgdXMgZG8gc2ltcGxlIG1hdGggaW4gZ2V0SW5kZXgoKQorICogICAgIHRvIGZpbmQgdGhlIHBvc2l0aW9uIGluIHRoZSBNZW1vcnkgdG8gc3RhcnQgcmVhZGluZyB0aGUgYWN0dWFsIGluZGV4IHN1bW1hcnkgZW50cnkuCisgKiAgICAgKFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Uga2V5cyBjYW4gaGF2ZSBkaWZmZXJlbnQgbGVuZ3Rocy4pCisgKiAgMi4gIEEgc2VxdWVuY2Ugb2YgKERlY29yYXRlZEtleSwgcG9zaXRpb24pIHBhaXJzLCB3aGVyZSBwb3NpdGlvbiBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIGFjdHVhbCBpbmRleCBmaWxlLgorICovCitwdWJsaWMgY2xhc3MgSW5kZXhTdW1tYXJ5IGV4dGVuZHMgV3JhcHBlZFNoYXJlZENsb3NlYWJsZQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihJbmRleFN1bW1hcnkuY2xhc3MpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSW5kZXhTdW1tYXJ5U2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IEluZGV4U3VtbWFyeVNlcmlhbGl6ZXIoKTsKKworICAgIC8qKgorICAgICAqIEEgbG93ZXIgYm91bmQgZm9yIHRoZSBhdmVyYWdlIG51bWJlciBvZiBwYXJ0aXRpb25zIGluIGJldHdlZW4gZWFjaCBpbmRleCBzdW1tYXJ5IGVudHJ5LiBBIGxvd2VyIHZhbHVlIG1lYW5zCisgICAgICogdGhhdCBtb3JlIHBhcnRpdGlvbnMgd2lsbCBoYXZlIGFuIGVudHJ5IGluIHRoZSBpbmRleCBzdW1tYXJ5IHdoZW4gYXQgdGhlIGZ1bGwgc2FtcGxpbmcgbGV2ZWwuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbWluSW5kZXhJbnRlcnZhbDsKKworICAgIHByaXZhdGUgZmluYWwgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyOworICAgIHByaXZhdGUgZmluYWwgaW50IHNpemVBdEZ1bGxTYW1wbGluZzsKKyAgICAvLyB3ZSBwZXJtaXQgdGhlIG1lbW9yeSB0byBzcGFuIGEgcmFuZ2UgbGFyZ2VyIHRoYW4gd2UgdXNlLAorICAgIC8vIHNvIHdlIGhhdmUgYW4gYWNjb21wYW55aW5nIGNvdW50IGFuZCBsZW5ndGggZm9yIGVhY2ggcGFydAorICAgIC8vIHdlIHNwbGl0IG91ciBkYXRhIGludG8gdHdvIHJhbmdlczogb2Zmc2V0cyAoaW5kZXhpbmcgaW50byBlbnRyaWVzKSwKKyAgICAvLyBhbmQgZW50cmllcyBjb250YWluaW5nIHRoZSBzdW1tYXJ5IGRhdGEKKyAgICBwcml2YXRlIGZpbmFsIE1lbW9yeSBvZmZzZXRzOworICAgIHByaXZhdGUgZmluYWwgaW50IG9mZnNldENvdW50OworICAgIC8vIGVudHJpZXMgaXMgYSBsaXN0IG9mIChwYXJ0aXRpb24ga2V5LCBpbmRleCBmaWxlIG9mZnNldCkgcGFpcnMKKyAgICBwcml2YXRlIGZpbmFsIE1lbW9yeSBlbnRyaWVzOworICAgIHByaXZhdGUgZmluYWwgbG9uZyBlbnRyaWVzTGVuZ3RoOworCisgICAgLyoqCisgICAgICogQSB2YWx1ZSBiZXR3ZWVuIDEgYW5kIEJBU0VfU0FNUExJTkdfTEVWRUwgdGhhdCByZXByZXNlbnRzIGhvdyBtYW55IG9mIHRoZSBvcmlnaW5hbAorICAgICAqIGluZGV4IHN1bW1hcnkgZW50cmllcyAoKDEgLyBpbmRleEludGVydmFsKSAqIG51bUtleXMpIGhhdmUgYmVlbiByZXRhaW5lZC4KKyAgICAgKgorICAgICAqIFRodXMsIHRoaXMgc3VtbWFyeSBjb250YWlucyAoc2FtcGxpbmdMZXZlbCAvIEJBU0VfU0FNUExJTkdfTEVWRUwpICogKCgxIC8gaW5kZXhJbnRlcnZhbCkgKiBudW1LZXlzKSkgZW50cmllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBzYW1wbGluZ0xldmVsOworCisgICAgcHVibGljIEluZGV4U3VtbWFyeShJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIsIE1lbW9yeSBvZmZzZXRzLCBpbnQgb2Zmc2V0Q291bnQsIE1lbW9yeSBlbnRyaWVzLCBsb25nIGVudHJpZXNMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZUF0RnVsbFNhbXBsaW5nLCBpbnQgbWluSW5kZXhJbnRlcnZhbCwgaW50IHNhbXBsaW5nTGV2ZWwpCisgICAgeworICAgICAgICBzdXBlcihuZXcgTWVtb3J5W10geyBvZmZzZXRzLCBlbnRyaWVzIH0pOworICAgICAgICBhc3NlcnQgb2Zmc2V0cy5nZXRJbnQoMCkgPT0gMDsKKyAgICAgICAgdGhpcy5wYXJ0aXRpb25lciA9IHBhcnRpdGlvbmVyOworICAgICAgICB0aGlzLm1pbkluZGV4SW50ZXJ2YWwgPSBtaW5JbmRleEludGVydmFsOworICAgICAgICB0aGlzLm9mZnNldENvdW50ID0gb2Zmc2V0Q291bnQ7CisgICAgICAgIHRoaXMuZW50cmllc0xlbmd0aCA9IGVudHJpZXNMZW5ndGg7CisgICAgICAgIHRoaXMuc2l6ZUF0RnVsbFNhbXBsaW5nID0gc2l6ZUF0RnVsbFNhbXBsaW5nOworICAgICAgICB0aGlzLm9mZnNldHMgPSBvZmZzZXRzOworICAgICAgICB0aGlzLmVudHJpZXMgPSBlbnRyaWVzOworICAgICAgICB0aGlzLnNhbXBsaW5nTGV2ZWwgPSBzYW1wbGluZ0xldmVsOworICAgICAgICBhc3NlcnQgc2FtcGxpbmdMZXZlbCA+IDA7CisgICAgfQorCisgICAgcHJpdmF0ZSBJbmRleFN1bW1hcnkoSW5kZXhTdW1tYXJ5IGNvcHkpCisgICAgeworICAgICAgICBzdXBlcihjb3B5KTsKKyAgICAgICAgdGhpcy5wYXJ0aXRpb25lciA9IGNvcHkucGFydGl0aW9uZXI7CisgICAgICAgIHRoaXMubWluSW5kZXhJbnRlcnZhbCA9IGNvcHkubWluSW5kZXhJbnRlcnZhbDsKKyAgICAgICAgdGhpcy5vZmZzZXRDb3VudCA9IGNvcHkub2Zmc2V0Q291bnQ7CisgICAgICAgIHRoaXMuZW50cmllc0xlbmd0aCA9IGNvcHkuZW50cmllc0xlbmd0aDsKKyAgICAgICAgdGhpcy5zaXplQXRGdWxsU2FtcGxpbmcgPSBjb3B5LnNpemVBdEZ1bGxTYW1wbGluZzsKKyAgICAgICAgdGhpcy5vZmZzZXRzID0gY29weS5vZmZzZXRzOworICAgICAgICB0aGlzLmVudHJpZXMgPSBjb3B5LmVudHJpZXM7CisgICAgICAgIHRoaXMuc2FtcGxpbmdMZXZlbCA9IGNvcHkuc2FtcGxpbmdMZXZlbDsKKyAgICB9CisKKyAgICAvLyBiaW5hcnkgc2VhcmNoIGlzIG5vdG9yaW91c2x5IG1vcmUgZGlmZmljdWx0IHRvIGdldCByaWdodCB0aGFuIGl0IGxvb2tzOyB0aGlzIGlzIGxpZnRlZCBmcm9tCisgICAgLy8gSGFybW9ueSdzIENvbGxlY3Rpb25zIGltcGxlbWVudGF0aW9uCisgICAgcHVibGljIGludCBiaW5hcnlTZWFyY2goUGFydGl0aW9uUG9zaXRpb24ga2V5KQorICAgIHsKKyAgICAgICAgLy8gV2Ugd2lsbCBiZSBjb21wYXJpbmcgbm9uLW5hdGl2ZSBLZXlzLCBzbyB1c2UgYSBidWZmZXIgd2l0aCBhcHByb3ByaWF0ZSBieXRlIG9yZGVyCisgICAgICAgIEJ5dGVCdWZmZXIgaG9sbG93ID0gTWVtb3J5VXRpbC5nZXRIb2xsb3dEaXJlY3RCeXRlQnVmZmVyKCkub3JkZXIoQnl0ZU9yZGVyLkJJR19FTkRJQU4pOworICAgICAgICBpbnQgbG93ID0gMCwgbWlkID0gb2Zmc2V0Q291bnQsIGhpZ2ggPSBtaWQgLSAxLCByZXN1bHQgPSAtMTsKKyAgICAgICAgd2hpbGUgKGxvdyA8PSBoaWdoKQorICAgICAgICB7CisgICAgICAgICAgICBtaWQgPSAobG93ICsgaGlnaCkgPj4gMTsKKyAgICAgICAgICAgIGZpbGxUZW1wb3JhcnlLZXkobWlkLCBob2xsb3cpOworICAgICAgICAgICAgcmVzdWx0ID0gLURlY29yYXRlZEtleS5jb21wYXJlVG8ocGFydGl0aW9uZXIsIGhvbGxvdywga2V5KTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWlkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhpZ2ggPSBtaWQgLSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIC1taWQgLSAocmVzdWx0IDwgMCA/IDEgOiAyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgYWN0dWFsIGluZGV4IHN1bW1hcnkgZW50cnkgaW4gb3VyIE1lbW9yeSBhdHRyaWJ1dGUsICdieXRlcycuCisgICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZW50cnkgb3Iga2V5IHRvIGdldCB0aGUgcG9zaXRpb24gZm9yCisgICAgICogQHJldHVybiBhbiBvZmZzZXQgaW50byBvdXIgTWVtb3J5IGF0dHJpYnV0ZSB3aGVyZSB0aGUgYWN0dWFsIGVudHJ5IHJlc2lkZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBvc2l0aW9uSW5TdW1tYXJ5KGludCBpbmRleCkKKyAgICB7CisgICAgICAgIC8vIFRoZSBmaXJzdCBzZWN0aW9uIG9mIGJ5dGVzIGhvbGRzIGEgZm91ci1ieXRlIHBvc2l0aW9uIGZvciBlYWNoIGVudHJ5IGluIHRoZSBzdW1tYXJ5LCBzbyBqdXN0IG11bHRpcGx5IGJ5IDQuCisgICAgICAgIHJldHVybiBvZmZzZXRzLmdldEludChpbmRleCA8PCAyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIGdldEtleShpbnQgaW5kZXgpCisgICAgeworICAgICAgICBsb25nIHN0YXJ0ID0gZ2V0UG9zaXRpb25JblN1bW1hcnkoaW5kZXgpOworICAgICAgICBpbnQga2V5U2l6ZSA9IChpbnQpIChjYWxjdWxhdGVFbmQoaW5kZXgpIC0gc3RhcnQgLSA4TCk7CisgICAgICAgIGJ5dGVbXSBrZXkgPSBuZXcgYnl0ZVtrZXlTaXplXTsKKyAgICAgICAgZW50cmllcy5nZXRCeXRlcyhzdGFydCwga2V5LCAwLCBrZXlTaXplKTsKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZmlsbFRlbXBvcmFyeUtleShpbnQgaW5kZXgsIEJ5dGVCdWZmZXIgYnVmZmVyKQorICAgIHsKKyAgICAgICAgbG9uZyBzdGFydCA9IGdldFBvc2l0aW9uSW5TdW1tYXJ5KGluZGV4KTsKKyAgICAgICAgaW50IGtleVNpemUgPSAoaW50KSAoY2FsY3VsYXRlRW5kKGluZGV4KSAtIHN0YXJ0IC0gOEwpOworICAgICAgICBlbnRyaWVzLnNldEJ5dGVCdWZmZXIoYnVmZmVyLCBzdGFydCwga2V5U2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVG8oUmVmLklkZW50aXR5Q29sbGVjdGlvbiBpZGVudGl0aWVzKQorICAgIHsKKyAgICAgICAgc3VwZXIuYWRkVG8oaWRlbnRpdGllcyk7CisgICAgICAgIGlkZW50aXRpZXMuYWRkKG9mZnNldHMpOworICAgICAgICBpZGVudGl0aWVzLmFkZChlbnRyaWVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRQb3NpdGlvbihpbnQgaW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gZW50cmllcy5nZXRMb25nKGNhbGN1bGF0ZUVuZChpbmRleCkgLSA4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRFbmRJblN1bW1hcnkoaW50IGluZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZUVuZChpbmRleCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGNhbGN1bGF0ZUVuZChpbnQgaW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gaW5kZXggPT0gKG9mZnNldENvdW50IC0gMSkgPyBlbnRyaWVzTGVuZ3RoIDogZ2V0UG9zaXRpb25JblN1bW1hcnkoaW5kZXggKyAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1pbkluZGV4SW50ZXJ2YWwoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1pbkluZGV4SW50ZXJ2YWw7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoQkFTRV9TQU1QTElOR19MRVZFTCAvIChkb3VibGUpIHNhbXBsaW5nTGV2ZWwpICogbWluSW5kZXhJbnRlcnZhbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSB0b3RhbCBudW1iZXIgb2Yga2V5cyBpbiB0aGUgU1NUYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRFc3RpbWF0ZWRLZXlDb3VudCgpCisgICAgeworICAgICAgICByZXR1cm4gKChsb25nKSBnZXRNYXhOdW1iZXJPZkVudHJpZXMoKSArIDEpICogbWluSW5kZXhJbnRlcnZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNpemUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG9mZnNldENvdW50OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U2FtcGxpbmdMZXZlbCgpCisgICAgeworICAgICAgICByZXR1cm4gc2FtcGxpbmdMZXZlbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyB0aGlzIHN1bW1hcnkgd291bGQgaGF2ZSBpZiBpdCB3ZXJlIGF0IHRoZSBmdWxsIHNhbXBsaW5nIGxldmVsLCB3aGljaCBpcyBlcXVhbAorICAgICAqIHRvIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcHJpbWFyeSBvbi1kaXNrIGluZGV4IGRpdmlkZWQgYnkgdGhlIG1pbiBpbmRleCBpbnRlcnZhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1heE51bWJlck9mRW50cmllcygpCisgICAgeworICAgICAgICByZXR1cm4gc2l6ZUF0RnVsbFNhbXBsaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFtb3VudCBvZiBvZmYtaGVhcCBtZW1vcnkgdXNlZCBmb3IgdGhlIGVudHJpZXMgcG9ydGlvbiBvZiB0aGlzIHN1bW1hcnkuCisgICAgICogQHJldHVybiBzaXplIGluIGJ5dGVzCisgICAgICovCisgICAgbG9uZyBnZXRFbnRyaWVzTGVuZ3RoKCkKKyAgICB7CisgICAgICAgIHJldHVybiBlbnRyaWVzTGVuZ3RoOworICAgIH0KKworICAgIE1lbW9yeSBnZXRPZmZzZXRzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBvZmZzZXRzOworICAgIH0KKworICAgIE1lbW9yeSBnZXRFbnRyaWVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBlbnRyaWVzOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldE9mZkhlYXBTaXplKCkKKyAgICB7CisgICAgICAgIHJldHVybiBvZmZzZXRDb3VudCAqIDQgKyBlbnRyaWVzTGVuZ3RoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwcmltYXJ5IChvbi1kaXNrKSBpbmRleCBlbnRyaWVzIGJldHdlZW4gdGhlIGluZGV4IHN1bW1hcnkgZW50cnkgYXQgYGluZGV4YCBhbmQgdGhlIG5leHQKKyAgICAgKiBpbmRleCBzdW1tYXJ5IGVudHJ5IChhc3N1bWluZyB0aGVyZSBpcyBvbmUpLiAgV2l0aG91dCBhbnkgZG93bnNhbXBsaW5nLCB0aGlzIHdpbGwgYWx3YXlzIGJlIGVxdWl2YWxlbnQgdG8KKyAgICAgKiB0aGUgaW5kZXggaW50ZXJ2YWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIGFuIGluZGV4IHN1bW1hcnkgZW50cnkgKGJldHdlZW4gemVybyBhbmQgdGhlIGluZGV4IGVudHJ5IHNpemUpCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFydGl0aW9ucyBhZnRlciBgaW5kZXhgIHVudGlsIHRoZSBuZXh0IHBhcnRpdGlvbiB3aXRoIGEgc3VtbWFyeSBlbnRyeQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbEFmdGVySW5kZXgoaW50IGluZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIERvd25zYW1wbGluZy5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsQWZ0ZXJJbmRleChpbmRleCwgc2FtcGxpbmdMZXZlbCwgbWluSW5kZXhJbnRlcnZhbCk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8U1NUYWJsZVJlYWRlci5JbmRleGVzQm91bmRzPiBnZXRTYW1wbGVJbmRleGVzRm9yUmFuZ2VzKENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+PiByYW5nZXMpCisgICAgeworICAgICAgICAvLyB1c2UgdGhlIGluZGV4IHRvIGRldGVybWluZSBhIG1pbmltYWwgc2VjdGlvbiBmb3IgZWFjaCByYW5nZQorICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXIuSW5kZXhlc0JvdW5kcz4gcG9zaXRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgZm9yIChSYW5nZTxUb2tlbj4gcmFuZ2UgOiBSYW5nZS5ub3JtYWxpemUocmFuZ2VzKSkKKyAgICAgICAgeworICAgICAgICAgICAgUGFydGl0aW9uUG9zaXRpb24gbGVmdFBvc2l0aW9uID0gcmFuZ2UubGVmdC5tYXhLZXlCb3VuZCgpOworICAgICAgICAgICAgUGFydGl0aW9uUG9zaXRpb24gcmlnaHRQb3NpdGlvbiA9IHJhbmdlLnJpZ2h0Lm1heEtleUJvdW5kKCk7CisKKyAgICAgICAgICAgIGludCBsZWZ0ID0gYmluYXJ5U2VhcmNoKGxlZnRQb3NpdGlvbik7CisgICAgICAgICAgICBpZiAobGVmdCA8IDApCisgICAgICAgICAgICAgICAgbGVmdCA9IChsZWZ0ICsgMSkgKiAtMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAvLyBsZWZ0IHJhbmdlIGFyZSBzdGFydCBleGNsdXNpdmUKKyAgICAgICAgICAgICAgICBsZWZ0ID0gbGVmdCArIDE7CisgICAgICAgICAgICBpZiAobGVmdCA9PSBzaXplKCkpCisgICAgICAgICAgICAgICAgLy8gbGVmdCBpcyBwYXN0IHRoZSBlbmQgb2YgdGhlIHNhbXBsaW5nCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGludCByaWdodCA9IFJhbmdlLmlzV3JhcEFyb3VuZChyYW5nZS5sZWZ0LCByYW5nZS5yaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gc2l6ZSgpIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgOiBiaW5hcnlTZWFyY2gocmlnaHRQb3NpdGlvbik7CisgICAgICAgICAgICBpZiAocmlnaHQgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHJhbmdlIGFyZSBlbmQgaW5jbHVzaXZlIHNvIHdlIHVzZSB0aGUgcHJldmlvdXMgaW5kZXggZnJvbSB3aGF0IGJpbmFyeVNlYXJjaCBnaXZlIHVzCisgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhhdCB3aWxsIGJlIHRoZSBsYXN0IGluZGV4IHdlIHdpbGwgcmV0dXJuCisgICAgICAgICAgICAgICAgcmlnaHQgPSAocmlnaHQgKyAxKSAqIC0xOworICAgICAgICAgICAgICAgIGlmIChyaWdodCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAvLyBNZWFucyB0aGUgZmlyc3Qga2V5IGlzIGFscmVhZHkgc3RyaWNseSBncmVhdGVyIHRoYXQgdGhlIHJpZ2h0IGJvdW5kCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHJpZ2h0LS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsZWZ0ID4gcmlnaHQpCisgICAgICAgICAgICAgICAgLy8gZW1wdHkgcmFuZ2UKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHBvc2l0aW9ucy5hZGQobmV3IFNTVGFibGVSZWFkZXIuSW5kZXhlc0JvdW5kcyhsZWZ0LCByaWdodCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwb3NpdGlvbnM7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhYmxlPGJ5dGVbXT4gZ2V0S2V5U2FtcGxlcyhmaW5hbCBSYW5nZTxUb2tlbj4gcmFuZ2UpCisgICAgeworICAgICAgICBmaW5hbCBMaXN0PFNTVGFibGVSZWFkZXIuSW5kZXhlc0JvdW5kcz4gaW5kZXhSYW5nZXMgPSBnZXRTYW1wbGVJbmRleGVzRm9yUmFuZ2VzKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocmFuZ2UpKTsKKworICAgICAgICBpZiAoaW5kZXhSYW5nZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworCisgICAgICAgIHJldHVybiAoKSAtPiBuZXcgSXRlcmF0b3I8Ynl0ZVtdPigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgSXRlcmF0b3I8U1NUYWJsZVJlYWRlci5JbmRleGVzQm91bmRzPiByYW5nZUl0ZXIgPSBpbmRleFJhbmdlcy5pdGVyYXRvcigpOworICAgICAgICAgICAgcHJpdmF0ZSBTU1RhYmxlUmVhZGVyLkluZGV4ZXNCb3VuZHMgY3VycmVudDsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IGlkeDsKKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbCB8fCBpZHggPiBjdXJyZW50LnVwcGVyUG9zaXRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VJdGVyLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHJhbmdlSXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZHggPSBjdXJyZW50Lmxvd2VyUG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBieXRlW10gbmV4dCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldEtleShpZHgrKyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0U2NhblBvc2l0aW9uKFBhcnRpdGlvblBvc2l0aW9uIGtleSkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRTY2FuUG9zaXRpb25Gcm9tQmluYXJ5U2VhcmNoUmVzdWx0KGJpbmFyeVNlYXJjaChrZXkpKTsKKyAgICB9CisKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgbG9uZyBnZXRTY2FuUG9zaXRpb25Gcm9tQmluYXJ5U2VhcmNoUmVzdWx0KGludCBiaW5hcnlTZWFyY2hSZXN1bHQpCisgICAgeworICAgICAgICBpZiAoYmluYXJ5U2VhcmNoUmVzdWx0ID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBnZXRQb3NpdGlvbihnZXRJbmRleEZyb21CaW5hcnlTZWFyY2hSZXN1bHQoYmluYXJ5U2VhcmNoUmVzdWx0KSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0SW5kZXhGcm9tQmluYXJ5U2VhcmNoUmVzdWx0KGludCBiaW5hcnlTZWFyY2hSZXN1bHQpCisgICAgeworICAgICAgICBpZiAoYmluYXJ5U2VhcmNoUmVzdWx0IDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gYmluYXJ5IHNlYXJjaCBnaXZlcyB1cyB0aGUgZmlyc3QgaW5kZXggX2dyZWF0ZXJfIHRoYW4gdGhlIGtleSBzZWFyY2hlZCBmb3IsCisgICAgICAgICAgICAvLyBpLmUuLCBpdHMgaW5zZXJ0aW9uIHBvc2l0aW9uCisgICAgICAgICAgICBpbnQgZ3JlYXRlclRoYW4gPSAoYmluYXJ5U2VhcmNoUmVzdWx0ICsgMSkgKiAtMTsKKyAgICAgICAgICAgIGlmIChncmVhdGVyVGhhbiA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHJldHVybiBncmVhdGVyVGhhbiAtIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmluYXJ5U2VhcmNoUmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEluZGV4U3VtbWFyeSBzaGFyZWRDb3B5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgSW5kZXhTdW1tYXJ5KHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5kZXhTdW1tYXJ5U2VyaWFsaXplcgorICAgIHsKKyAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKEluZGV4U3VtbWFyeSB0LCBEYXRhT3V0cHV0UGx1cyBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBvdXQud3JpdGVJbnQodC5taW5JbmRleEludGVydmFsKTsKKyAgICAgICAgICAgIG91dC53cml0ZUludCh0Lm9mZnNldENvdW50KTsKKyAgICAgICAgICAgIG91dC53cml0ZUxvbmcodC5nZXRPZmZIZWFwU2l6ZSgpKTsKKyAgICAgICAgICAgIG91dC53cml0ZUludCh0LnNhbXBsaW5nTGV2ZWwpOworICAgICAgICAgICAgb3V0LndyaXRlSW50KHQuc2l6ZUF0RnVsbFNhbXBsaW5nKTsKKyAgICAgICAgICAgIC8vIG91ciBvbi1kaXNrIHJlcHJlc2VudGF0aW9uIHRyZWF0cyB0aGUgb2Zmc2V0cyBhbmQgdGhlIHN1bW1hcnkgZGF0YSBhcyBvbmUgY29udGlndW91cyBzdHJ1Y3R1cmUsCisgICAgICAgICAgICAvLyBpbiB3aGljaCB0aGUgb2Zmc2V0cyBhcmUgYmFzZWQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHN0cnVjdHVyZS4gaS5lLiwgaWYgdGhlIG9mZnNldHMgb2NjdXB5CisgICAgICAgICAgICAvLyBYIGJ5dGVzLCB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IG9mZnNldCB3aWxsIGJlIFguIEluIG1lbW9yeSB3ZSBzcGxpdCB0aGUgdHdvIHJlZ2lvbnMgdXAsIHNvIHRoYXQKKyAgICAgICAgICAgIC8vIHRoZSBzdW1tYXJ5IHZhbHVlcyBhcmUgaW5kZXhlZCBmcm9tIHplcm8sIHNvIHdlIGFwcGx5IGEgY29ycmVjdGlvbiB0byB0aGUgb2Zmc2V0cyB3aGVuIGRlL3NlcmlhbGl6aW5nLgorICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIGFkZGluZyBYIHRvIGVhY2ggb2YgdGhlIG9mZnNldHMuCisgICAgICAgICAgICBpbnQgYmFzZU9mZnNldCA9IHQub2Zmc2V0Q291bnQgKiA0OworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgdC5vZmZzZXRDb3VudCA7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gdC5vZmZzZXRzLmdldEludChpICogNCkgKyBiYXNlT2Zmc2V0OworICAgICAgICAgICAgICAgIC8vIG91ciBzZXJpYWxpemF0aW9uIGZvcm1hdCBmb3IgdGhpcyBmaWxlIHVzZXMgbmF0aXZlIGJ5dGUgb3JkZXIsIHNvIGlmIHRoaXMgaXMgZGlmZmVyZW50IHRvIHRoZQorICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgSmF2YSBzZXJpYWxpemF0aW9uIG9yZGVyIChCSUdfRU5ESUFOKSB3ZSBoYXZlIHRvIHJldmVyc2Ugb3VyIGJ5dGVzCisgICAgICAgICAgICAgICAgaWYgKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpICE9IEJ5dGVPcmRlci5CSUdfRU5ESUFOKQorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBJbnRlZ2VyLnJldmVyc2VCeXRlcyhvZmZzZXQpOworICAgICAgICAgICAgICAgIG91dC53cml0ZUludChvZmZzZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LndyaXRlKHQuZW50cmllcywgMCwgdC5lbnRyaWVzTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCisgICAgICAgIHB1YmxpYyA8VCBleHRlbmRzIElucHV0U3RyZWFtICYgRGF0YUlucHV0UGx1cz4gSW5kZXhTdW1tYXJ5IGRlc2VyaWFsaXplKFQgaW4sIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lciwgaW50IGV4cGVjdGVkTWluSW5kZXhJbnRlcnZhbCwgaW50IG1heEluZGV4SW50ZXJ2YWwpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbWluSW5kZXhJbnRlcnZhbCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGlmIChtaW5JbmRleEludGVydmFsICE9IGV4cGVjdGVkTWluSW5kZXhJbnRlcnZhbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiQ2Fubm90IHJlYWQgaW5kZXggc3VtbWFyeSBiZWNhdXNlIG1pbl9pbmRleF9pbnRlcnZhbCBjaGFuZ2VkIGZyb20gJWQgdG8gJWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5JbmRleEludGVydmFsLCBleHBlY3RlZE1pbkluZGV4SW50ZXJ2YWwpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IG9mZnNldENvdW50ID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgbG9uZyBvZmZoZWFwU2l6ZSA9IGluLnJlYWRMb25nKCk7CisgICAgICAgICAgICBpbnQgc2FtcGxpbmdMZXZlbCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGludCBmdWxsU2FtcGxpbmdTdW1tYXJ5U2l6ZSA9IGluLnJlYWRJbnQoKTsKKworICAgICAgICAgICAgaW50IGVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwgPSAoaW50KSBNYXRoLmNlaWwoKEJBU0VfU0FNUExJTkdfTEVWRUwgLyAoZG91YmxlKSBzYW1wbGluZ0xldmVsKSAqIG1pbkluZGV4SW50ZXJ2YWwpOworICAgICAgICAgICAgaWYgKGVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwgPiBtYXhJbmRleEludGVydmFsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJSZWJ1aWxkaW5nIGluZGV4IHN1bW1hcnkgYmVjYXVzZSB0aGUgZWZmZWN0aXZlIGluZGV4IGludGVydmFsICglZCkgaXMgaGlnaGVyIHRoYW4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRoZSBjdXJyZW50IG1heCBpbmRleCBpbnRlcnZhbCAoJWQpIiwgZWZmZWN0aXZlSW5kZXhJbnRlcnZhbCwgbWF4SW5kZXhJbnRlcnZhbCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNZW1vcnkgb2Zmc2V0cyA9IE1lbW9yeS5hbGxvY2F0ZShvZmZzZXRDb3VudCAqIDQpOworICAgICAgICAgICAgTWVtb3J5IGVudHJpZXMgPSBNZW1vcnkuYWxsb2NhdGUob2ZmaGVhcFNpemUgLSBvZmZzZXRzLnNpemUoKSk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5jb3B5KGluLCBuZXcgTWVtb3J5T3V0cHV0U3RyZWFtKG9mZnNldHMpLCBvZmZzZXRzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgRkJVdGlsaXRpZXMuY29weShpbiwgbmV3IE1lbW9yeU91dHB1dFN0cmVhbShlbnRyaWVzKSwgZW50cmllcy5zaXplKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRzLmZyZWUoKTsKKyAgICAgICAgICAgICAgICBlbnRyaWVzLmZyZWUoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBpb2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBvdXIgb24tZGlzayByZXByZXNlbnRhdGlvbiB0cmVhdHMgdGhlIG9mZnNldHMgYW5kIHRoZSBzdW1tYXJ5IGRhdGEgYXMgb25lIGNvbnRpZ3VvdXMgc3RydWN0dXJlLAorICAgICAgICAgICAgLy8gaW4gd2hpY2ggdGhlIG9mZnNldHMgYXJlIGJhc2VkIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzdHJ1Y3R1cmUuIGkuZS4sIGlmIHRoZSBvZmZzZXRzIG9jY3VweQorICAgICAgICAgICAgLy8gWCBieXRlcywgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBvZmZzZXQgd2lsbCBiZSBYLiBJbiBtZW1vcnkgd2Ugc3BsaXQgdGhlIHR3byByZWdpb25zIHVwLCBzbyB0aGF0CisgICAgICAgICAgICAvLyB0aGUgc3VtbWFyeSB2YWx1ZXMgYXJlIGluZGV4ZWQgZnJvbSB6ZXJvLCBzbyB3ZSBhcHBseSBhIGNvcnJlY3Rpb24gdG8gdGhlIG9mZnNldHMgd2hlbiBkZS9zZXJpYWxpemluZy4KKyAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSBzdWJ0cmFjdGluZyBYIGZyb20gZWFjaCBvZiB0aGUgb2Zmc2V0cy4KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG9mZnNldHMuc2l6ZSgpIDsgaSArPSA0KQorICAgICAgICAgICAgICAgIG9mZnNldHMuc2V0SW50KGksIChpbnQpIChvZmZzZXRzLmdldEludChpKSAtIG9mZnNldHMuc2l6ZSgpKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEluZGV4U3VtbWFyeShwYXJ0aXRpb25lciwgb2Zmc2V0cywgb2Zmc2V0Q291bnQsIGVudHJpZXMsIGVudHJpZXMuc2l6ZSgpLCBmdWxsU2FtcGxpbmdTdW1tYXJ5U2l6ZSwgbWluSW5kZXhJbnRlcnZhbCwgc2FtcGxpbmdMZXZlbCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRGVzZXJpYWxpemVzIHRoZSBmaXJzdCBhbmQgbGFzdCBrZXkgc3RvcmVkIGluIHRoZSBzdW1tYXJ5CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBPbmx5IGZvciB1c2UgYnkgb2ZmbGluZSB0b29scyBsaWtlIFNTVGFibGVNZXRhZGF0YVZpZXdlciwgb3RoZXJ3aXNlIFNTVGFibGUuZmlyc3QvbGFzdCBzaG91bGQgYmUgdXNlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBQYWlyPERlY29yYXRlZEtleSwgRGVjb3JhdGVkS2V5PiBkZXNlcmlhbGl6ZUZpcnN0TGFzdEtleShEYXRhSW5wdXRTdHJlYW1QbHVzIGluLCBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpbi5za2lwQnl0ZXMoNCk7IC8vIG1pbkluZGV4SW50ZXJ2YWwKKyAgICAgICAgICAgIGludCBvZmZzZXRDb3VudCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGxvbmcgb2ZmaGVhcFNpemUgPSBpbi5yZWFkTG9uZygpOworICAgICAgICAgICAgaW4uc2tpcEJ5dGVzKDgpOyAvLyBzYW1wbGluZ0xldmVsLCBmdWxsU2FtcGxpbmdTdW1tYXJ5U2l6ZQorCisgICAgICAgICAgICBpbi5za2lwQnl0ZXMob2Zmc2V0Q291bnQgKiA0KTsKKyAgICAgICAgICAgIGluLnNraXBCeXRlcygoaW50KSAob2ZmaGVhcFNpemUgLSBvZmZzZXRDb3VudCAqIDQpKTsKKworICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGZpcnN0ID0gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhMZW5ndGgoaW4pKTsKKyAgICAgICAgICAgIERlY29yYXRlZEtleSBsYXN0ID0gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhMZW5ndGgoaW4pKTsKKyAgICAgICAgICAgIHJldHVybiBQYWlyLmNyZWF0ZShmaXJzdCwgbGFzdCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2luZGV4c3VtbWFyeS9JbmRleFN1bW1hcnlCdWlsZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2luZGV4c3VtbWFyeS9JbmRleFN1bW1hcnlCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzOGZjOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvaW5kZXhzdW1tYXJ5L0luZGV4U3VtbWFyeUJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5pbmRleHN1bW1hcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworCitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5UeXBlU2l6ZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRvd25zYW1wbGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLk1lbW9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNhZmVNZW1vcnlXcml0ZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5JTkRFWF9TVU1NQVJZX0VYUEVDVEVEX0tFWV9TSVpFOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRvd25zYW1wbGluZy5CQVNFX1NBTVBMSU5HX0xFVkVMOworCitwdWJsaWMgY2xhc3MgSW5kZXhTdW1tYXJ5QnVpbGRlciBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSW5kZXhTdW1tYXJ5QnVpbGRlci5jbGFzcyk7CisKKyAgICBzdGF0aWMgbG9uZyBkZWZhdWx0RXhwZWN0ZWRLZXlTaXplID0gSU5ERVhfU1VNTUFSWV9FWFBFQ1RFRF9LRVlfU0laRS5nZXRMb25nKCk7CisKKyAgICAvLyB0aGUgb2Zmc2V0IGluIHRoZSBrZXlzIG1lbW9yeSByZWdpb24gdG8gbG9vayBmb3IgYSBnaXZlbiBzdW1tYXJ5IGJvdW5kYXJ5CisgICAgcHJpdmF0ZSBmaW5hbCBTYWZlTWVtb3J5V3JpdGVyIG9mZnNldHM7CisgICAgcHJpdmF0ZSBmaW5hbCBTYWZlTWVtb3J5V3JpdGVyIGVudHJpZXM7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBtaW5JbmRleEludGVydmFsOworICAgIHByaXZhdGUgZmluYWwgaW50IHNhbXBsaW5nTGV2ZWw7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnRbXSBzdGFydFBvaW50czsKKyAgICBwcml2YXRlIGxvbmcga2V5c1dyaXR0ZW4gPSAwOworICAgIHByaXZhdGUgbG9uZyBpbmRleEludGVydmFsTWF0Y2hlcyA9IDA7CisgICAgcHJpdmF0ZSBsb25nIG5leHRTYW1wbGVQb3NpdGlvbjsKKworICAgIC8vIGZvciBlYWNoIFJlYWRhYmxlQm91bmRhcnksIHdlIG1hcCBpdHMgZGF0YUxlbmd0aCBwcm9wZXJ0eSB0byBpdHNlbGYsIHBlcm1pdHRpbmcgdXMgdG8gbG9va3VwIHRoZQorICAgIC8vIGxhc3QgcmVhZGFibGUgYm91bmRhcnkgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGRhdGEgZmlsZQorICAgIC8vIFtkYXRhIGZpbGUgcG9zaXRpb24gbGltaXRdID0+IFtSZWFkYWJsZUJvdW5kYXJ5XQorICAgIHByaXZhdGUgVHJlZU1hcDxMb25nLCBSZWFkYWJsZUJvdW5kYXJ5PiBsYXN0UmVhZGFibGVCeURhdGEgPSBuZXcgVHJlZU1hcDw+KCk7CisgICAgLy8gZm9yIGVhY2ggUmVhZGFibGVCb3VuZGFyeSwgd2UgbWFwIGl0cyBpbmRleExlbmd0aCBwcm9wZXJ0eSB0byBpdHNlbGYsIHBlcm1pdHRpbmcgdXMgdG8gbG9va3VwIHRoZQorICAgIC8vIGxhc3QgcmVhZGFibGUgYm91bmRhcnkgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGluZGV4IGZpbGUKKyAgICAvLyBbaW5kZXggZmlsZSBwb3NpdGlvbiBsaW1pdF0gPT4gW1JlYWRhYmxlQm91bmRhcnldCisgICAgcHJpdmF0ZSBUcmVlTWFwPExvbmcsIFJlYWRhYmxlQm91bmRhcnk+IGxhc3RSZWFkYWJsZUJ5SW5kZXggPSBuZXcgVHJlZU1hcDw+KCk7CisgICAgLy8gdGhlIGxhc3Qgc3luY2VkIGRhdGEgZmlsZSBwb3NpdGlvbgorICAgIHByaXZhdGUgbG9uZyBkYXRhU3luY1Bvc2l0aW9uOworICAgIC8vIHRoZSBsYXN0IHN5bmNlZCBpbmRleCBmaWxlIHBvc2l0aW9uCisgICAgcHJpdmF0ZSBsb25nIGluZGV4U3luY1Bvc2l0aW9uOworCisgICAgLy8gdGhlIGxhc3Qgc3VtbWFyeSBpbnRlcnZhbCBib3VuZGFyeSB0aGF0IGlzIGZ1bGx5IHJlYWRhYmxlIGluIGJvdGggZGF0YSBhbmQgaW5kZXggZmlsZXMKKyAgICBwcml2YXRlIFJlYWRhYmxlQm91bmRhcnkgbGFzdFJlYWRhYmxlQm91bmRhcnk7CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgYm91bmRhcnkgdGhhdCBpcyBndWFyYW50ZWVkIGZ1bGx5IHJlYWRhYmxlIGluIHRoZSBzdW1tYXJ5LCBpbmRleCBmaWxlIGFuZCBkYXRhIGZpbGUuCisgICAgICogVGhlIGtleSBjb250YWluZWQgaXMgdGhlIGxhc3Qga2V5IHJlYWRhYmxlIGlmIHRoZSBpbmRleCBhbmQgZGF0YSBmaWxlcyBoYXZlIGJlZW4gZmx1c2hlZCB0byB0aGUKKyAgICAgKiBzdG9yZWQgbGVuZ3Rocy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlYWRhYmxlQm91bmRhcnkKKyAgICB7CisgICAgICAgIHB1YmxpYyBmaW5hbCBEZWNvcmF0ZWRLZXkgbGFzdEtleTsKKyAgICAgICAgcHVibGljIGZpbmFsIGxvbmcgaW5kZXhMZW5ndGg7CisgICAgICAgIHB1YmxpYyBmaW5hbCBsb25nIGRhdGFMZW5ndGg7CisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgc3VtbWFyeUNvdW50OworICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyBlbnRyaWVzTGVuZ3RoOworICAgICAgICBwdWJsaWMgUmVhZGFibGVCb3VuZGFyeShEZWNvcmF0ZWRLZXkgbGFzdEtleSwgbG9uZyBpbmRleExlbmd0aCwgbG9uZyBkYXRhTGVuZ3RoLCBpbnQgc3VtbWFyeUNvdW50LCBsb25nIGVudHJpZXNMZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubGFzdEtleSA9IGxhc3RLZXk7CisgICAgICAgICAgICB0aGlzLmluZGV4TGVuZ3RoID0gaW5kZXhMZW5ndGg7CisgICAgICAgICAgICB0aGlzLmRhdGFMZW5ndGggPSBkYXRhTGVuZ3RoOworICAgICAgICAgICAgdGhpcy5zdW1tYXJ5Q291bnQgPSBzdW1tYXJ5Q291bnQ7CisgICAgICAgICAgICB0aGlzLmVudHJpZXNMZW5ndGggPSBlbnRyaWVzTGVuZ3RoOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGQgYW4gaW5kZXggc3VtbWFyeSBidWlsZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGV4cGVjdGVkS2V5cyAtIHRoZSBudW1iZXIgb2Yga2V5cyB3ZSBleHBlY3QgaW4gdGhlIHNzdGFibGUKKyAgICAgKiBAcGFyYW0gbWluSW5kZXhJbnRlcnZhbCAtIHRoZSBtaW5pbXVtIGludGVydmFsIGJldHdlZW4gZW50cmllcyBzZWxlY3RlZCBmb3Igc2FtcGxpbmcKKyAgICAgKiBAcGFyYW0gc2FtcGxpbmdMZXZlbCAtIHRoZSBsZXZlbCBhdCB3aGljaCBlbnRyaWVzIGFyZSBzYW1wbGVkCisgICAgICovCisgICAgcHVibGljIEluZGV4U3VtbWFyeUJ1aWxkZXIobG9uZyBleHBlY3RlZEtleXMsIGludCBtaW5JbmRleEludGVydmFsLCBpbnQgc2FtcGxpbmdMZXZlbCkKKyAgICB7CisgICAgICAgIHRoaXMuc2FtcGxpbmdMZXZlbCA9IHNhbXBsaW5nTGV2ZWw7CisgICAgICAgIHRoaXMuc3RhcnRQb2ludHMgPSBEb3duc2FtcGxpbmcuZ2V0U3RhcnRQb2ludHMoQkFTRV9TQU1QTElOR19MRVZFTCwgc2FtcGxpbmdMZXZlbCk7CisKKyAgICAgICAgbG9uZyBleHBlY3RlZEVudHJ5U2l6ZSA9IGdldEVudHJ5U2l6ZShkZWZhdWx0RXhwZWN0ZWRLZXlTaXplKTsKKyAgICAgICAgbG9uZyBtYXhFeHBlY3RlZEVudHJpZXMgPSBleHBlY3RlZEtleXMgLyBtaW5JbmRleEludGVydmFsOworICAgICAgICBsb25nIG1heEV4cGVjdGVkRW50cmllc1NpemUgPSBtYXhFeHBlY3RlZEVudHJpZXMgKiBleHBlY3RlZEVudHJ5U2l6ZTsKKyAgICAgICAgaWYgKG1heEV4cGVjdGVkRW50cmllc1NpemUgPiBJbnRlZ2VyLk1BWF9WQUxVRSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdGhhdCdzIGEgX2xvdF8gb2Yga2V5cywgYW5kIGEgdmVyeSBsb3cgbWluIGluZGV4IGludGVydmFsCisgICAgICAgICAgICBpbnQgZWZmZWN0aXZlTWluSW50ZXJ2YWwgPSAoaW50KSBNYXRoLmNlaWwoKGRvdWJsZSkoZXhwZWN0ZWRLZXlzICogZXhwZWN0ZWRFbnRyeVNpemUpIC8gSW50ZWdlci5NQVhfVkFMVUUpOworICAgICAgICAgICAgbWF4RXhwZWN0ZWRFbnRyaWVzID0gZXhwZWN0ZWRLZXlzIC8gZWZmZWN0aXZlTWluSW50ZXJ2YWw7CisgICAgICAgICAgICBtYXhFeHBlY3RlZEVudHJpZXNTaXplID0gbWF4RXhwZWN0ZWRFbnRyaWVzICogZXhwZWN0ZWRFbnRyeVNpemU7CisgICAgICAgICAgICBhc3NlcnQgbWF4RXhwZWN0ZWRFbnRyaWVzU2l6ZSA8PSBJbnRlZ2VyLk1BWF9WQUxVRSA6IG1heEV4cGVjdGVkRW50cmllc1NpemU7CisgICAgICAgICAgICBsb2dnZXIud2FybigibWluX2luZGV4X2ludGVydmFsIG9mIHt9IGlzIHRvbyBsb3cgZm9yIHt9IGV4cGVjdGVkIGtleXMgb2YgYXZnIHNpemUge307IHVzaW5nIGludGVydmFsIG9mIHt9IGluc3RlYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbWluSW5kZXhJbnRlcnZhbCwgZXhwZWN0ZWRLZXlzLCBkZWZhdWx0RXhwZWN0ZWRLZXlTaXplLCBlZmZlY3RpdmVNaW5JbnRlcnZhbCk7CisgICAgICAgICAgICB0aGlzLm1pbkluZGV4SW50ZXJ2YWwgPSBlZmZlY3RpdmVNaW5JbnRlcnZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubWluSW5kZXhJbnRlcnZhbCA9IG1pbkluZGV4SW50ZXJ2YWw7CisgICAgICAgIH0KKworICAgICAgICAvLyBmb3IgaW5pdGlhbGl6aW5nIGRhdGEgc3RydWN0dXJlcywgYWRqdXN0IG91ciBlc3RpbWF0ZXMgYmFzZWQgb24gdGhlIHNhbXBsaW5nIGxldmVsCisgICAgICAgIG1heEV4cGVjdGVkRW50cmllcyA9IE1hdGgubWF4KDEsIChtYXhFeHBlY3RlZEVudHJpZXMgKiBzYW1wbGluZ0xldmVsKSAvIEJBU0VfU0FNUExJTkdfTEVWRUwpOworICAgICAgICBvZmZzZXRzID0gbmV3IFNhZmVNZW1vcnlXcml0ZXIoNCAqIG1heEV4cGVjdGVkRW50cmllcykub3JkZXIoQnl0ZU9yZGVyLm5hdGl2ZU9yZGVyKCkpOworICAgICAgICBlbnRyaWVzID0gbmV3IFNhZmVNZW1vcnlXcml0ZXIoZXhwZWN0ZWRFbnRyeVNpemUgKiBtYXhFeHBlY3RlZEVudHJpZXMpLm9yZGVyKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpKTsKKworICAgICAgICAvLyB0aGUgc3VtbWFyeSB3aWxsIGFsd2F5cyBjb250YWluIHRoZSBmaXJzdCBpbmRleCBlbnRyeSAoZG93bnNhbXBsaW5nIHdpbGwgbmV2ZXIgcmVtb3ZlIGl0KQorICAgICAgICBuZXh0U2FtcGxlUG9zaXRpb24gPSAwOworICAgICAgICBpbmRleEludGVydmFsTWF0Y2hlcysrOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVuIGEga2V5LCByZXR1cm4gaG93IGxvbmcgdGhlIHNlcmlhbGl6ZWQgaW5kZXggc3VtbWFyeSBlbnRyeSB3aWxsIGJlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgZ2V0RW50cnlTaXplKERlY29yYXRlZEtleSBrZXkpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0RW50cnlTaXplKGtleS5nZXRLZXkoKS5yZW1haW5pbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBrZXkgc2l6ZSwgcmV0dXJuIGhvdyBsb25nIHRoZSBzZXJpYWxpemVkIGluZGV4IHN1bW1hcnkgZW50cnkgd2lsbCBiZSwgdGhhdCBpcyBhZGQgOCBieXRlcyB0bworICAgICAqIGFjY29tb2RhdGUgZm9yIHRoZSBzaXplIG9mIHRoZSBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldEVudHJ5U2l6ZShsb25nIGtleVNpemUpCisgICAgeworICAgICAgICByZXR1cm4ga2V5U2l6ZSArIFR5cGVTaXplcy5zaXplb2YoMEwpOworICAgIH0KKworICAgIC8vIHRoZSBpbmRleCBmaWxlIGhhcyBiZWVuIGZsdXNoZWQgdG8gdGhlIHByb3ZpZGVkIHBvc2l0aW9uOyBzdGFzaCBpdCBhbmQgdXNlIHRoYXQgdG8gcmVjYWxjdWxhdGUgb3VyIG1heCByZWFkYWJsZSBib3VuZGFyeQorICAgIHB1YmxpYyB2b2lkIG1hcmtJbmRleFN5bmNlZChsb25nIHVwVG9Qb3NpdGlvbikKKyAgICB7CisgICAgICAgIGluZGV4U3luY1Bvc2l0aW9uID0gdXBUb1Bvc2l0aW9uOworICAgICAgICByZWZyZXNoUmVhZGFibGVCb3VuZGFyeSgpOworICAgIH0KKworICAgIC8vIHRoZSBkYXRhIGZpbGUgaGFzIGJlZW4gZmx1c2hlZCB0byB0aGUgcHJvdmlkZWQgcG9zaXRpb247IHN0YXNoIGl0IGFuZCB1c2UgdGhhdCB0byByZWNhbGN1bGF0ZSBvdXIgbWF4IHJlYWRhYmxlIGJvdW5kYXJ5CisgICAgcHVibGljIHZvaWQgbWFya0RhdGFTeW5jZWQobG9uZyB1cFRvUG9zaXRpb24pCisgICAgeworICAgICAgICBkYXRhU3luY1Bvc2l0aW9uID0gdXBUb1Bvc2l0aW9uOworICAgICAgICByZWZyZXNoUmVhZGFibGVCb3VuZGFyeSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWZyZXNoUmVhZGFibGVCb3VuZGFyeSgpCisgICAgeworICAgICAgICAvLyBncmFiIHRoZSByZWFkYWJsZSBib3VuZGFyeSBwcmlvciB0byB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gZWl0aGVyIHRoZSBkYXRhIG9yIGluZGV4IGZpbGUKKyAgICAgICAgTWFwLkVudHJ5PD8sIFJlYWRhYmxlQm91bmRhcnk+IGJ5RGF0YSA9IGxhc3RSZWFkYWJsZUJ5RGF0YS5mbG9vckVudHJ5KGRhdGFTeW5jUG9zaXRpb24pOworICAgICAgICBNYXAuRW50cnk8PywgUmVhZGFibGVCb3VuZGFyeT4gYnlJbmRleCA9IGxhc3RSZWFkYWJsZUJ5SW5kZXguZmxvb3JFbnRyeShpbmRleFN5bmNQb3NpdGlvbik7CisgICAgICAgIGlmIChieURhdGEgPT0gbnVsbCB8fCBieUluZGV4ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gdGFrZSB0aGUgbG93ZXN0IG9mIHRoZSB0d28sIGFuZCBzdGFzaCBpdAorICAgICAgICBsYXN0UmVhZGFibGVCb3VuZGFyeSA9IGJ5SW5kZXguZ2V0VmFsdWUoKS5pbmRleExlbmd0aCA8IGJ5RGF0YS5nZXRWYWx1ZSgpLmluZGV4TGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBieUluZGV4LmdldFZhbHVlKCkgOiBieURhdGEuZ2V0VmFsdWUoKTsKKworICAgICAgICAvLyBjbGVhciBvdXIgZGF0YSBwcmlvciB0byB0aGlzLCBzaW5jZSB3ZSBubyBsb25nZXIgbmVlZCBpdAorICAgICAgICBsYXN0UmVhZGFibGVCeURhdGEuaGVhZE1hcChsYXN0UmVhZGFibGVCb3VuZGFyeS5kYXRhTGVuZ3RoLCBmYWxzZSkuY2xlYXIoKTsKKyAgICAgICAgbGFzdFJlYWRhYmxlQnlJbmRleC5oZWFkTWFwKGxhc3RSZWFkYWJsZUJvdW5kYXJ5LmluZGV4TGVuZ3RoLCBmYWxzZSkuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVhZGFibGVCb3VuZGFyeSBnZXRMYXN0UmVhZGFibGVCb3VuZGFyeSgpCisgICAgeworICAgICAgICByZXR1cm4gbGFzdFJlYWRhYmxlQm91bmRhcnk7CisgICAgfQorCisgICAgcHVibGljIEluZGV4U3VtbWFyeUJ1aWxkZXIgbWF5YmVBZGRFbnRyeShEZWNvcmF0ZWRLZXkgZGVjb3JhdGVkS2V5LCBsb25nIGluZGV4U3RhcnQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIG1heWJlQWRkRW50cnkoZGVjb3JhdGVkS2V5LCBpbmRleFN0YXJ0LCAwLCAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWNvcmF0ZWRLZXkgdGhlIGtleSBmb3IgdGhpcyByZWNvcmQKKyAgICAgKiBAcGFyYW0gaW5kZXhTdGFydCB0aGUgcG9zaXRpb24gaW4gdGhlIGluZGV4IGZpbGUgdGhpcyByZWNvcmQgYmVnaW5zCisgICAgICogQHBhcmFtIGluZGV4RW5kIHRoZSBwb3NpdGlvbiBpbiB0aGUgaW5kZXggZmlsZSB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gcmVhZCB0byAoZXhjbHVzaXZlKSB0byByZWFkIHRoaXMgcmVjb3JkCisgICAgICogQHBhcmFtIGRhdGFFbmQgdGhlIHBvc2l0aW9uIGluIHRoZSBkYXRhIGZpbGUgd2UgbmVlZCB0byBiZSBhYmxlIHRvIHJlYWQgdG8gKGV4Y2x1c2l2ZSkgdG8gcmVhZCB0aGlzIHJlY29yZAorICAgICAqICAgICAgICAgICAgICAgIGEgdmFsdWUgb2YgMCBpbmRpY2F0ZXMgd2UgYXJlIG5vdCB0cmFja2luZyByZWFkYWJsZSBib3VuZGFyaWVzCisgICAgICovCisgICAgcHVibGljIEluZGV4U3VtbWFyeUJ1aWxkZXIgbWF5YmVBZGRFbnRyeShEZWNvcmF0ZWRLZXkgZGVjb3JhdGVkS2V5LCBsb25nIGluZGV4U3RhcnQsIGxvbmcgaW5kZXhFbmQsIGxvbmcgZGF0YUVuZCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoa2V5c1dyaXR0ZW4gPT0gbmV4dFNhbXBsZVBvc2l0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGVudHJpZXMubGVuZ3RoKCkgKyBnZXRFbnRyeVNpemUoZGVjb3JhdGVkS2V5KSkgPD0gSW50ZWdlci5NQVhfVkFMVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2Zmc2V0cy53cml0ZUludCgoaW50KSBlbnRyaWVzLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBlbnRyaWVzLndyaXRlKGRlY29yYXRlZEtleS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgZW50cmllcy53cml0ZUxvbmcoaW5kZXhTdGFydCk7CisgICAgICAgICAgICAgICAgc2V0TmV4dFNhbXBsZVBvc2l0aW9uKGtleXNXcml0dGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBjYW5ub3QgZnVsbHkgc2FtcGxlIHRoaXMgc3N0YWJsZSBkdWUgdG8gdG9vIG11Y2ggbWVtb3J5IGluIHRoZSBpbmRleCBzdW1tYXJ5LCBzbyBsZXQncyB0ZWxsIHRoZSB1c2VyCisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJNZW1vcnkgY2FwYWNpdHkgb2YgaW5kZXggc3VtbWFyeSBleGNlZWRlZCAoMkdpQiksIGluZGV4IHN1bW1hcnkgd2lsbCBub3QgY292ZXIgZnVsbCBzc3RhYmxlLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInlvdSBzaG91bGQgaW5jcmVhc2UgbWluX3NhbXBsaW5nX2xldmVsIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZGF0YUVuZCAhPSAwICYmIGtleXNXcml0dGVuICsgMSA9PSBuZXh0U2FtcGxlUG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIGxhc3Qga2V5IGluIHRoaXMgc3VtbWFyeSBpbnRlcnZhbCwgc28gc3Rhc2ggaXQKKyAgICAgICAgICAgIFJlYWRhYmxlQm91bmRhcnkgYm91bmRhcnkgPSBuZXcgUmVhZGFibGVCb3VuZGFyeShkZWNvcmF0ZWRLZXksIGluZGV4RW5kLCBkYXRhRW5kLCAoaW50KSAob2Zmc2V0cy5sZW5ndGgoKSAvIDQpLCBlbnRyaWVzLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGxhc3RSZWFkYWJsZUJ5RGF0YS5wdXQoZGF0YUVuZCwgYm91bmRhcnkpOworICAgICAgICAgICAgbGFzdFJlYWRhYmxlQnlJbmRleC5wdXQoaW5kZXhFbmQsIGJvdW5kYXJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIGtleXNXcml0dGVuKys7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8vIGNhbGN1bGF0ZSB0aGUgbmV4dCBrZXkgd2Ugd2lsbCBzdG9yZSB0byBvdXIgc3VtbWFyeQorICAgIHByaXZhdGUgdm9pZCBzZXROZXh0U2FtcGxlUG9zaXRpb24obG9uZyBwb3NpdGlvbikKKyAgICB7CisgICAgICAgIHRyeUFnYWluOiB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcG9zaXRpb24gKz0gbWluSW5kZXhJbnRlcnZhbDsKKyAgICAgICAgICAgIGxvbmcgdGVzdCA9IGluZGV4SW50ZXJ2YWxNYXRjaGVzKys7CisgICAgICAgICAgICBmb3IgKGludCBzdGFydCA6IHN0YXJ0UG9pbnRzKQorICAgICAgICAgICAgICAgIGlmICgodGVzdCAtIHN0YXJ0KSAlIEJBU0VfU0FNUExJTkdfTEVWRUwgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUgdHJ5QWdhaW47CisKKyAgICAgICAgICAgIG5leHRTYW1wbGVQb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJlcGFyZVRvQ29tbWl0KCkKKyAgICB7CisgICAgICAgIC8vIHRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIHdlJ3ZlIGZpbmlzaGVkIGFwcGVuZGluZyByZWNvcmRzLCBzbyB3ZSB0cnVuY2F0ZSB0aGUKKyAgICAgICAgLy8gbWVtb3J5IHdlJ3JlIHVzaW5nIHRvIHRoZSBleGFjdCBhbW91bnQgcmVxdWlyZWQgdG8gcmVwcmVzZW50IGl0IGJlZm9yZSBidWlsZGluZyBvdXIgc3VtbWFyeQorICAgICAgICBlbnRyaWVzLnRyaW0oKTsKKyAgICAgICAgb2Zmc2V0cy50cmltKCk7CisgICAgfQorCisgICAgcHVibGljIEluZGV4U3VtbWFyeSBidWlsZChJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIpCisgICAgeworICAgICAgICByZXR1cm4gYnVpbGQocGFydGl0aW9uZXIsIG51bGwpOworICAgIH0KKworICAgIC8vIGJ1aWxkIHRoZSBzdW1tYXJ5IHVwIHRvIHRoZSBwcm92aWRlZCBib3VuZGFyeTsgdGhpcyBpcyBiYWNrZWQgYnkgc2hhcmVkIG1lbW9yeSBiZXR3ZWVuCisgICAgLy8gbXVsdGlwbGUgaW52b2NhdGlvbnMgb2YgdGhpcyBidWlsZCBtZXRob2QKKyAgICBwdWJsaWMgSW5kZXhTdW1tYXJ5IGJ1aWxkKElQYXJ0aXRpb25lciBwYXJ0aXRpb25lciwgUmVhZGFibGVCb3VuZGFyeSBib3VuZGFyeSkKKyAgICB7CisgICAgICAgIGFzc2VydCBlbnRyaWVzLmxlbmd0aCgpID4gMDsKKworICAgICAgICBpbnQgY291bnQgPSAoaW50KSAob2Zmc2V0cy5sZW5ndGgoKSAvIDQpOworICAgICAgICBsb25nIGVudHJpZXNMZW5ndGggPSBlbnRyaWVzLmxlbmd0aCgpOworICAgICAgICBpZiAoYm91bmRhcnkgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgY291bnQgPSBib3VuZGFyeS5zdW1tYXJ5Q291bnQ7CisgICAgICAgICAgICBlbnRyaWVzTGVuZ3RoID0gYm91bmRhcnkuZW50cmllc0xlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBzaXplQXRGdWxsU2FtcGxpbmcgPSAoaW50KSBNYXRoLmNlaWwoa2V5c1dyaXR0ZW4gLyAoZG91YmxlKSBtaW5JbmRleEludGVydmFsKTsKKyAgICAgICAgYXNzZXJ0IGNvdW50ID4gMDsKKyAgICAgICAgcmV0dXJuIG5ldyBJbmRleFN1bW1hcnkocGFydGl0aW9uZXIsIG9mZnNldHMuY3VycmVudEJ1ZmZlcigpLnNoYXJlZENvcHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsIGVudHJpZXMuY3VycmVudEJ1ZmZlcigpLnNoYXJlZENvcHkoKSwgZW50cmllc0xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZUF0RnVsbFNhbXBsaW5nLCBtaW5JbmRleEludGVydmFsLCBzYW1wbGluZ0xldmVsKTsKKyAgICB9CisKKyAgICAvLyBjbG9zZSB0aGUgYnVpbGRlciBhbmQgcmVsZWFzZSBhbnkgYXNzb2NpYXRlZCBtZW1vcnkKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgeworICAgICAgICBlbnRyaWVzLmNsb3NlKCk7CisgICAgICAgIG9mZnNldHMuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGhyb3dhYmxlIGNsb3NlKFRocm93YWJsZSBhY2N1bXVsYXRlKQorICAgIHsKKyAgICAgICAgYWNjdW11bGF0ZSA9IGVudHJpZXMuY2xvc2UoYWNjdW11bGF0ZSk7CisgICAgICAgIGFjY3VtdWxhdGUgPSBvZmZzZXRzLmNsb3NlKGFjY3VtdWxhdGUpOworICAgICAgICByZXR1cm4gYWNjdW11bGF0ZTsKKyAgICB9CisKKyAgICBzdGF0aWMgaW50IGVudHJpZXNBdFNhbXBsaW5nTGV2ZWwoaW50IHNhbXBsaW5nTGV2ZWwsIGludCBtYXhTdW1tYXJ5U2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAoaW50KSBNYXRoLmNlaWwoKHNhbXBsaW5nTGV2ZWwgKiBtYXhTdW1tYXJ5U2l6ZSkgLyAoZG91YmxlKSBCQVNFX1NBTVBMSU5HX0xFVkVMKTsKKyAgICB9CisKKyAgICBzdGF0aWMgaW50IGNhbGN1bGF0ZVNhbXBsaW5nTGV2ZWwoaW50IGN1cnJlbnRTYW1wbGluZ0xldmVsLCBpbnQgY3VycmVudE51bUVudHJpZXMsIGxvbmcgdGFyZ2V0TnVtRW50cmllcywgaW50IG1pbkluZGV4SW50ZXJ2YWwsIGludCBtYXhJbmRleEludGVydmFsKQorICAgIHsKKyAgICAgICAgLy8gZWZmZWN0aXZlIGluZGV4IGludGVydmFsID09IChCQVNFX1NBTVBMSU5HX0xFVkVMIC8gc2FtcGxpbmdMZXZlbCkgKiBtaW5JbmRleEludGVydmFsCisgICAgICAgIC8vIHNvIHdlIGNhbiBqdXN0IHNvbHZlIGZvciBtaW5TYW1wbGluZ0xldmVsIGhlcmU6CisgICAgICAgIC8vIG1heEluZGV4SW50ZXJ2YWwgPT0gKEJBU0VfU0FNUExJTkdfTEVWRUwgLyBtaW5TYW1wbGluZ0xldmVsKSAqIG1pbkluZGV4SW50ZXJ2YWwKKyAgICAgICAgaW50IGVmZmVjdGl2ZU1pblNhbXBsaW5nTGV2ZWwgPSBNYXRoLm1heCgxLCAoaW50KSBNYXRoLmNlaWwoKEJBU0VfU0FNUExJTkdfTEVWRUwgKiBtaW5JbmRleEludGVydmFsKSAvIChkb3VibGUpIG1heEluZGV4SW50ZXJ2YWwpKTsKKworICAgICAgICAvLyBBbGdlYnJhaWMgZXhwbGFuYXRpb24gZm9yIGNhbGN1bGF0aW5nIHRoZSBuZXcgc2FtcGxpbmcgbGV2ZWwgKHNvbHZlIGZvciBuZXdTYW1wbGluZ0xldmVsKToKKyAgICAgICAgLy8gb3JpZ2luYWxOdW1FbnRyaWVzID0gKGJhc2VTYW1wbGluZ0xldmVsIC8gY3VycmVudFNhbXBsaW5nTGV2ZWwpICogY3VycmVudE51bUVudHJpZXMKKyAgICAgICAgLy8gbmV3U3BhY2VVc2VkID0gKG5ld1NhbXBsaW5nTGV2ZWwgLyBiYXNlU2FtcGxpbmdMZXZlbCkgKiBvcmlnaW5hbE51bUVudHJpZXMKKyAgICAgICAgLy8gbmV3U3BhY2VVc2VkID0gKG5ld1NhbXBsaW5nTGV2ZWwgLyBiYXNlU2FtcGxpbmdMZXZlbCkgKiAoYmFzZVNhbXBsaW5nTGV2ZWwgLyBjdXJyZW50U2FtcGxpbmdMZXZlbCkgKiBjdXJyZW50TnVtRW50cmllcworICAgICAgICAvLyBuZXdTcGFjZVVzZWQgPSAobmV3U2FtcGxpbmdMZXZlbCAvIGN1cnJlbnRTYW1wbGluZ0xldmVsKSAqIGN1cnJlbnROdW1FbnRyaWVzCisgICAgICAgIC8vIChuZXdTcGFjZVVzZWQgKiBjdXJyZW50U2FtcGxpbmdMZXZlbCkgLyBjdXJyZW50TnVtRW50cmllcyA9IG5ld1NhbXBsaW5nTGV2ZWwKKyAgICAgICAgaW50IG5ld1NhbXBsaW5nTGV2ZWwgPSAoaW50KSAodGFyZ2V0TnVtRW50cmllcyAqIGN1cnJlbnRTYW1wbGluZ0xldmVsKSAvIGN1cnJlbnROdW1FbnRyaWVzOworICAgICAgICByZXR1cm4gTWF0aC5taW4oQkFTRV9TQU1QTElOR19MRVZFTCwgTWF0aC5tYXgoZWZmZWN0aXZlTWluU2FtcGxpbmdMZXZlbCwgbmV3U2FtcGxpbmdMZXZlbCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERvd25zYW1wbGVzIGFuIGV4aXN0aW5nIGluZGV4IHN1bW1hcnkgdG8gYSBuZXcgc2FtcGxpbmcgbGV2ZWwuCisgICAgICogQHBhcmFtIGV4aXN0aW5nIGFuIGV4aXN0aW5nIEluZGV4U3VtbWFyeQorICAgICAqIEBwYXJhbSBuZXdTYW1wbGluZ0xldmVsIHRoZSB0YXJnZXQgbGV2ZWwgZm9yIHRoZSBuZXcgSW5kZXhTdW1tYXJ5LiAgVGhpcyBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgY3VycmVudCBzYW1wbGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsIGZvciBgZXhpc3RpbmdgLgorICAgICAqIEBwYXJhbSBwYXJ0aXRpb25lciB0aGUgcGFydGl0aW9uZXIgdXNlZCBmb3IgdGhlIGluZGV4IHN1bW1hcnkKKyAgICAgKiBAcmV0dXJuIGEgbmV3IEluZGV4U3VtbWFyeQorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBJbmRleFN1bW1hcnkgZG93bnNhbXBsZShJbmRleFN1bW1hcnkgZXhpc3RpbmcsIGludCBuZXdTYW1wbGluZ0xldmVsLCBpbnQgbWluSW5kZXhJbnRlcnZhbCwgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyKQorICAgIHsKKyAgICAgICAgLy8gVG8gZG93bnNhbXBsZSB0aGUgb2xkIGluZGV4IHN1bW1hcnksIHdlJ2xsIGdvIHRocm91Z2ggKHBvdGVudGlhbGx5KSBzZXZlcmFsIHJvdW5kcyBvZiBkb3duc2FtcGxpbmcuCisgICAgICAgIC8vIENvbmNlcHR1YWxseSwgZWFjaCByb3VuZCBzdGFydHMgYXQgcG9zaXRpb24gWCBhbmQgdGhlbiByZW1vdmVzIGV2ZXJ5IE50aCBpdGVtLiAgVGhlIHZhbHVlIG9mIFggZm9sbG93cworICAgICAgICAvLyBhIHBhcnRpY3VsYXIgcGF0dGVybiB0byBldmVubHkgc3BhY2Ugb3V0IHRoZSBpdGVtcyB0aGF0IHdlIHJlbW92ZS4gIFRoZSB2YWx1ZSBvZiBOIGRlY3JlYXNlcyBieSBvbmUgZWFjaAorICAgICAgICAvLyByb3VuZC4KKworICAgICAgICBpbnQgY3VycmVudFNhbXBsaW5nTGV2ZWwgPSBleGlzdGluZy5nZXRTYW1wbGluZ0xldmVsKCk7CisgICAgICAgIGFzc2VydCBjdXJyZW50U2FtcGxpbmdMZXZlbCA+IG5ld1NhbXBsaW5nTGV2ZWw7CisgICAgICAgIGFzc2VydCBtaW5JbmRleEludGVydmFsID09IGV4aXN0aW5nLmdldE1pbkluZGV4SW50ZXJ2YWwoKTsKKworICAgICAgICAvLyBjYWxjdWxhdGUgc3RhcnRpbmcgaW5kZXhlcyBmb3IgZG93bnNhbXBsaW5nIHJvdW5kcworICAgICAgICBpbnRbXSBzdGFydFBvaW50cyA9IERvd25zYW1wbGluZy5nZXRTdGFydFBvaW50cyhjdXJyZW50U2FtcGxpbmdMZXZlbCwgbmV3U2FtcGxpbmdMZXZlbCk7CisKKyAgICAgICAgLy8gY2FsY3VsYXRlIG5ldyBvZmYtaGVhcCBzaXplCisgICAgICAgIGludCBuZXdLZXlDb3VudCA9IGV4aXN0aW5nLnNpemUoKTsKKyAgICAgICAgbG9uZyBuZXdFbnRyaWVzTGVuZ3RoID0gZXhpc3RpbmcuZ2V0RW50cmllc0xlbmd0aCgpOworICAgICAgICBmb3IgKGludCBzdGFydCA6IHN0YXJ0UG9pbnRzKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBqID0gc3RhcnQ7IGogPCBleGlzdGluZy5zaXplKCk7IGogKz0gY3VycmVudFNhbXBsaW5nTGV2ZWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3S2V5Q291bnQtLTsKKyAgICAgICAgICAgICAgICBsb25nIGxlbmd0aCA9IGV4aXN0aW5nLmdldEVuZEluU3VtbWFyeShqKSAtIGV4aXN0aW5nLmdldFBvc2l0aW9uSW5TdW1tYXJ5KGopOworICAgICAgICAgICAgICAgIG5ld0VudHJpZXNMZW5ndGggLT0gbGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTWVtb3J5IG9sZEVudHJpZXMgPSBleGlzdGluZy5nZXRFbnRyaWVzKCk7CisgICAgICAgIE1lbW9yeSBuZXdPZmZzZXRzID0gTWVtb3J5LmFsbG9jYXRlKG5ld0tleUNvdW50ICogNCk7CisgICAgICAgIE1lbW9yeSBuZXdFbnRyaWVzID0gTWVtb3J5LmFsbG9jYXRlKG5ld0VudHJpZXNMZW5ndGgpOworCisgICAgICAgIC8vIENvcHkgb2xkIGVudHJpZXMgdG8gb3VyIG5ldyBNZW1vcnkuCisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgaW50IG5ld0VudHJpZXNPZmZzZXQgPSAwOworICAgICAgICBvdXRlcjoKKyAgICAgICAgZm9yIChpbnQgb2xkU3VtbWFyeUluZGV4ID0gMDsgb2xkU3VtbWFyeUluZGV4IDwgZXhpc3Rpbmcuc2l6ZSgpOyBvbGRTdW1tYXJ5SW5kZXgrKykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIGlmIHdlIGNhbiBza2lwIHRoaXMgZW50cnksIGdvIHRocm91Z2ggdGhlIHN0YXJ0aW5nIHBvaW50cyBmb3Igb3VyIGRvd25zYW1wbGluZyByb3VuZHMKKyAgICAgICAgICAgIC8vIGFuZCBzZWUgaWYgdGhlIGVudHJ5J3MgaW5kZXggaXMgY292ZXJlZCBieSB0aGF0IHJvdW5kCisgICAgICAgICAgICBmb3IgKGludCBzdGFydCA6IHN0YXJ0UG9pbnRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgob2xkU3VtbWFyeUluZGV4IC0gc3RhcnQpICUgY3VycmVudFNhbXBsaW5nTGV2ZWwgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgYWN0dWFsIGVudHJ5IGluIHRoZSBpbmRleCBzdW1tYXJ5ICg0IGJ5dGVzKQorICAgICAgICAgICAgbmV3T2Zmc2V0cy5zZXRJbnQoaSAqIDQsIG5ld0VudHJpZXNPZmZzZXQpOworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgbG9uZyBzdGFydCA9IGV4aXN0aW5nLmdldFBvc2l0aW9uSW5TdW1tYXJ5KG9sZFN1bW1hcnlJbmRleCk7CisgICAgICAgICAgICBsb25nIGxlbmd0aCA9IGV4aXN0aW5nLmdldEVuZEluU3VtbWFyeShvbGRTdW1tYXJ5SW5kZXgpIC0gc3RhcnQ7CisgICAgICAgICAgICBuZXdFbnRyaWVzLnB1dChuZXdFbnRyaWVzT2Zmc2V0LCBvbGRFbnRyaWVzLCBzdGFydCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIG5ld0VudHJpZXNPZmZzZXQgKz0gbGVuZ3RoOworICAgICAgICB9CisgICAgICAgIGFzc2VydCBuZXdFbnRyaWVzT2Zmc2V0ID09IG5ld0VudHJpZXNMZW5ndGg7CisgICAgICAgIHJldHVybiBuZXcgSW5kZXhTdW1tYXJ5KHBhcnRpdGlvbmVyLCBuZXdPZmZzZXRzLCBuZXdLZXlDb3VudCwgbmV3RW50cmllcywgbmV3RW50cmllc0xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuZ2V0TWF4TnVtYmVyT2ZFbnRyaWVzKCksIG1pbkluZGV4SW50ZXJ2YWwsIG5ld1NhbXBsaW5nTGV2ZWwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvaW5kZXhzdW1tYXJ5L0luZGV4U3VtbWFyeU1hbmFnZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvaW5kZXhzdW1tYXJ5L0luZGV4U3VtbWFyeU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmRjM2I4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9pbmRleHN1bW1hcnkvSW5kZXhTdW1tYXJ5TWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMjk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uY29kYWhhbGUubWV0cmljcy5UaW1lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkludGVycnVwdGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuU1NUYWJsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuVmlldzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkV4ZWN1dG9yVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTUJlYW5XcmFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuV3JhcHBlZFJ1bm5hYmxlOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRXhlY3V0b3JGYWN0b3J5Lkdsb2JhbC5leGVjdXRvckZhY3Rvcnk7CisvKioKKyAqIE1hbmFnZXMgdGhlIGZpeGVkLXNpemUgbWVtb3J5IHBvb2wgZm9yIGluZGV4IHN1bW1hcmllcywgcGVyaW9kaWNhbGx5IHJlc2l6aW5nIHRoZW0KKyAqIGluIG9yZGVyIHRvIGdpdmUgbW9yZSBtZW1vcnkgdG8gaG90IHNzdGFibGVzIGFuZCBsZXNzIG1lbW9yeSB0byBjb2xkIHNzdGFibGVzLgorICovCitwdWJsaWMgY2xhc3MgSW5kZXhTdW1tYXJ5TWFuYWdlcjxUIGV4dGVuZHMgU1NUYWJsZVJlYWRlciAmIEluZGV4U3VtbWFyeVN1cHBvcnQ8VD4+IGltcGxlbWVudHMgSW5kZXhTdW1tYXJ5TWFuYWdlck1CZWFuCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEluZGV4U3VtbWFyeU1hbmFnZXIuY2xhc3MpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1CRUFOX05BTUUgPSAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGI6dHlwZT1JbmRleFN1bW1hcmllcyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbmRleFN1bW1hcnlNYW5hZ2VyPD8+IGluc3RhbmNlOworCisgICAgcHJpdmF0ZSBsb25nIG1lbW9yeVBvb2xCeXRlczsKKworICAgIHByaXZhdGUgZmluYWwgU2NoZWR1bGVkRXhlY3V0b3JQbHVzIGV4ZWN1dG9yOworCisgICAgLy8gb3VyIG5leHQgc2NoZWR1bGVkIHJlc2l6aW5nIHJ1bgorICAgIHByaXZhdGUgU2NoZWR1bGVkRnV0dXJlIGZ1dHVyZTsKKworICAgIHByaXZhdGUgZmluYWwgU3VwcGxpZXI8TGlzdDxUPj4gaW5kZXhTdW1tYXJpZXNQcm92aWRlcjsKKworICAgIHByaXZhdGUgc3RhdGljIDxUIGV4dGVuZHMgU1NUYWJsZVJlYWRlciAmIEluZGV4U3VtbWFyeVN1cHBvcnQ+IExpc3Q8VD4gZ2V0QWxsU3VwcG9ydGVkUmVhZGVycygpIHsKKyAgICAgICAgTGlzdDxUPiByZWFkZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoS2V5c3BhY2Uga2V5c3BhY2UgOiBLZXlzcGFjZS5hbGwoKSkKKyAgICAgICAgICAgIGZvciAoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzIDoga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmVzKCkpCisgICAgICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdHIgOiBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpCisgICAgICAgICAgICAgICAgICAgIGlmIChzc3RyIGluc3RhbmNlb2YgSW5kZXhTdW1tYXJ5U3VwcG9ydCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlcnMuYWRkKCgoVCkgc3N0cikpOworICAgICAgICByZXR1cm4gcmVhZGVyczsKKyAgICB9CisKKyAgICBzdGF0aWMKKyAgICB7CisgICAgICAgIGluc3RhbmNlID0gbmV3IEluZGV4U3VtbWFyeU1hbmFnZXI8PihJbmRleFN1bW1hcnlNYW5hZ2VyOjpnZXRBbGxTdXBwb3J0ZWRSZWFkZXJzKTsKKyAgICAgICAgTUJlYW5XcmFwcGVyLmluc3RhbmNlLnJlZ2lzdGVyTUJlYW4oaW5zdGFuY2UsIE1CRUFOX05BTUUpOworICAgIH0KKworICAgIHByaXZhdGUgSW5kZXhTdW1tYXJ5TWFuYWdlcihTdXBwbGllcjxMaXN0PFQ+PiBpbmRleFN1bW1hcmllc1Byb3ZpZGVyKQorICAgIHsKKyAgICAgICAgdGhpcy5pbmRleFN1bW1hcmllc1Byb3ZpZGVyID0gaW5kZXhTdW1tYXJpZXNQcm92aWRlcjsKKworICAgICAgICBleGVjdXRvciA9IGV4ZWN1dG9yRmFjdG9yeSgpLnNjaGVkdWxlZChmYWxzZSwgIkluZGV4U3VtbWFyeU1hbmFnZXIiLCBUaHJlYWQuTUlOX1BSSU9SSVRZKTsKKworICAgICAgICBsb25nIGluZGV4U3VtbWFyeVNpemVJbk1CID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldEluZGV4U3VtbWFyeUNhcGFjaXR5SW5NaUIoKTsKKyAgICAgICAgaW50IGludGVydmFsID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldEluZGV4U3VtbWFyeVJlc2l6ZUludGVydmFsSW5NaW51dGVzKCk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJJbml0aWFsaXppbmcgaW5kZXggc3VtbWFyeSBtYW5hZ2VyIHdpdGggYSBtZW1vcnkgcG9vbCBzaXplIG9mIHt9IE1CIGFuZCBhIHJlc2l6ZSBpbnRlcnZhbCBvZiB7fSBtaW51dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgaW5kZXhTdW1tYXJ5U2l6ZUluTUIsIGludGVydmFsKTsKKworICAgICAgICBzZXRNZW1vcnlQb29sQ2FwYWNpdHlJbk1CKERhdGFiYXNlRGVzY3JpcHRvci5nZXRJbmRleFN1bW1hcnlDYXBhY2l0eUluTWlCKCkpOworICAgICAgICBzZXRSZXNpemVJbnRlcnZhbEluTWludXRlcyhEYXRhYmFzZURlc2NyaXB0b3IuZ2V0SW5kZXhTdW1tYXJ5UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoKSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXNpemVJbnRlcnZhbEluTWludXRlcygpCisgICAgeworICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldEluZGV4U3VtbWFyeVJlc2l6ZUludGVydmFsSW5NaW51dGVzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoaW50IHJlc2l6ZUludGVydmFsSW5NaW51dGVzKQorICAgIHsKKyAgICAgICAgaW50IG9sZEludGVydmFsID0gZ2V0UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldEluZGV4U3VtbWFyeVJlc2l6ZUludGVydmFsSW5NaW51dGVzKHJlc2l6ZUludGVydmFsSW5NaW51dGVzKTsKKworICAgICAgICBsb25nIGluaXRpYWxEZWxheTsKKyAgICAgICAgaWYgKGZ1dHVyZSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpbml0aWFsRGVsYXkgPSBvbGRJbnRlcnZhbCA8IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTWF0aC5tYXgoMCwgcmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMgLSAob2xkSW50ZXJ2YWwgLSBmdXR1cmUuZ2V0RGVsYXkoVGltZVVuaXQuTUlOVVRFUykpKTsKKyAgICAgICAgICAgIGZ1dHVyZS5jYW5jZWwoZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW5pdGlhbERlbGF5ID0gcmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICBmdXR1cmUgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZnV0dXJlID0gZXhlY3V0b3Iuc2NoZWR1bGVXaXRoRml4ZWREZWxheShuZXcgV3JhcHBlZFJ1bm5hYmxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcnVuTWF5VGhyb3coKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVkaXN0cmlidXRlU3VtbWFyaWVzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sIGluaXRpYWxEZWxheSwgcmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMsIFRpbWVVbml0Lk1JTlVURVMpOworICAgIH0KKworICAgIC8vIGZvciB0ZXN0aW5nIG9ubHkKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBMb25nIGdldFRpbWVUb05leHRSZXNpemUoVGltZVVuaXQgdGltZVVuaXQpCisgICAgeworICAgICAgICBpZiAoZnV0dXJlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICByZXR1cm4gZnV0dXJlLmdldERlbGF5KHRpbWVVbml0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRNZW1vcnlQb29sQ2FwYWNpdHlJbk1CKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtZW1vcnlQb29sQnl0ZXMgLyAxMDI0TCAvIDEwMjRMOworICAgIH0KKworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBnZXRJbmRleEludGVydmFscygpCisgICAgeworICAgICAgICBMaXN0PFQ+IHN1bW1hcnlQcm92aWRlcnMgPSBpbmRleFN1bW1hcmllc1Byb3ZpZGVyLmdldCgpOworICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBpbnRlcnZhbHMgPSBuZXcgSGFzaE1hcDw+KHN1bW1hcnlQcm92aWRlcnMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChUIHN1bW1hcnlQcm92aWRlciA6IHN1bW1hcnlQcm92aWRlcnMpCisgICAgICAgICAgICBpbnRlcnZhbHMucHV0KHN1bW1hcnlQcm92aWRlci5nZXRGaWxlbmFtZSgpLCAoaW50KSBNYXRoLnJvdW5kKHN1bW1hcnlQcm92aWRlci5nZXRJbmRleFN1bW1hcnkoKS5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCkpKTsKKworICAgICAgICByZXR1cm4gaW50ZXJ2YWxzOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0QXZlcmFnZUluZGV4SW50ZXJ2YWwoKQorICAgIHsKKyAgICAgICAgTGlzdDxUPiBzdW1tYXJ5UHJvdmlkZXJzID0gaW5kZXhTdW1tYXJpZXNQcm92aWRlci5nZXQoKTsKKyAgICAgICAgZG91YmxlIHRvdGFsID0gMC4wOworICAgICAgICBmb3IgKEluZGV4U3VtbWFyeVN1cHBvcnQgc3VtbWFyeVByb3ZpZGVyIDogc3VtbWFyeVByb3ZpZGVycykKKyAgICAgICAgICAgIHRvdGFsICs9IHN1bW1hcnlQcm92aWRlci5nZXRJbmRleFN1bW1hcnkoKS5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCk7CisgICAgICAgIHJldHVybiB0b3RhbCAvIHN1bW1hcnlQcm92aWRlcnMuc2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1lbW9yeVBvb2xDYXBhY2l0eUluTUIobG9uZyBtZW1vcnlQb29sQ2FwYWNpdHlJbk1CKQorICAgIHsKKyAgICAgICAgdGhpcy5tZW1vcnlQb29sQnl0ZXMgPSBtZW1vcnlQb29sQ2FwYWNpdHlJbk1CICogMTAyNEwgKiAxMDI0TDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhY3R1YWwgc3BhY2UgY29uc3VtZWQgYnkgaW5kZXggc3VtbWFyaWVzIGZvciBhbGwgc3N0YWJsZXMuCisgICAgICogQHJldHVybiBzcGFjZSBjdXJyZW50bHkgdXNlZCBpbiBNQgorICAgICAqLworICAgIHB1YmxpYyBkb3VibGUgZ2V0TWVtb3J5UG9vbFNpemVJbk1CKCkKKyAgICB7CisgICAgICAgIGxvbmcgdG90YWwgPSAwOworICAgICAgICBmb3IgKEluZGV4U3VtbWFyeVN1cHBvcnQgc3VtbWFyeVByb3ZpZGVyIDogaW5kZXhTdW1tYXJpZXNQcm92aWRlci5nZXQoKSkKKyAgICAgICAgICAgIHRvdGFsICs9IHN1bW1hcnlQcm92aWRlci5nZXRJbmRleFN1bW1hcnkoKS5nZXRPZmZIZWFwU2l6ZSgpOworICAgICAgICByZXR1cm4gdG90YWwgLyAxMDI0LjAgLyAxMDI0LjA7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFya3MgdGhlIG5vbi1jb21wYWN0aW5nIHNzdGFibGVzIGFzIGNvbXBhY3RpbmcgZm9yIGluZGV4IHN1bW1hcnkgcmVkaXN0cmlidXRpb24gZm9yIGFsbCBrZXlzcGFjZXMvdGFibGVzLgorICAgICAqCisgICAgICogQHJldHVybiBQYWlyIGNvbnRhaW5pbmc6CisgICAgICogICAgICAgICAgbGVmdDogdG90YWwgc2l6ZSBvZiB0aGUgb2ZmIGhlYXAgaW5kZXggc3VtbWFyaWVzIGZvciB0aGUgc3N0YWJsZXMgd2Ugd2VyZSB1bmFibGUgdG8gbWFyayBjb21wYWN0aW5nICh0aGV5IHdlcmUgaW52b2x2ZWQgaW4gb3RoZXIgY29tcGFjdGlvbnMpCisgICAgICogICAgICAgICAgcmlnaHQ6IHRoZSB0cmFuc2FjdGlvbnMsIGtleWVkIGJ5IHRhYmxlIGlkLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCisgICAgcHJpdmF0ZSBQYWlyPExvbmcsIE1hcDxUYWJsZUlkLCBMaWZlY3ljbGVUcmFuc2FjdGlvbj4+IGdldFJlc3RyaWJ1dGlvblRyYW5zYWN0aW9ucygpCisgICAgeworICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IGFsbENvbXBhY3RpbmcgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTWFwPFRhYmxlSWQsIExpZmVjeWNsZVRyYW5zYWN0aW9uPiBhbGxOb25Db21wYWN0aW5nID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBmb3IgKEtleXNwYWNlIGtzIDogS2V5c3BhY2UuYWxsKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoQ29sdW1uRmFtaWx5U3RvcmUgY2ZTdG9yZToga3MuZ2V0Q29sdW1uRmFtaWx5U3RvcmVzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0PFNTVGFibGVSZWFkZXI+IG5vbkNvbXBhY3RpbmcsIGFsbFNTVGFibGVzOworICAgICAgICAgICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4bjsKKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVmlldyB2aWV3ID0gY2ZTdG9yZS5nZXRUcmFja2VyKCkuZ2V0VmlldygpOworICAgICAgICAgICAgICAgICAgICBhbGxTU1RhYmxlcyA9IEltbXV0YWJsZVNldC5jb3B5T2Yodmlldy5zZWxlY3QoU1NUYWJsZVNldC5DQU5PTklDQUwpKTsKKyAgICAgICAgICAgICAgICAgICAgbm9uQ29tcGFjdGluZyA9IEltbXV0YWJsZVNldC5jb3B5T2Yodmlldy5nZXRVbmNvbXBhY3RpbmcoYWxsU1NUYWJsZXMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKG51bGwgPT0gKHR4biA9IGNmU3RvcmUuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShub25Db21wYWN0aW5nLCBPcGVyYXRpb25UeXBlLklOREVYX1NVTU1BUlkpKSk7CisKKyAgICAgICAgICAgICAgICBhbGxOb25Db21wYWN0aW5nLnB1dChjZlN0b3JlLm1ldGFkYXRhLmlkLCB0eG4pOworICAgICAgICAgICAgICAgIGFsbENvbXBhY3RpbmcuYWRkQWxsKFNldHMuZGlmZmVyZW5jZShhbGxTU1RhYmxlcywgbm9uQ29tcGFjdGluZykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvbmcgbm9uUmVkaXN0cmlidXRpbmdPZmZIZWFwU2l6ZSA9IGFsbENvbXBhY3Rpbmcuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoSW5kZXhTdW1tYXJ5U3VwcG9ydC5jbGFzczo6aXNJbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoSW5kZXhTdW1tYXJ5U3VwcG9ydC5jbGFzczo6Y2FzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoSW5kZXhTdW1tYXJ5U3VwcG9ydDo6Z2V0SW5kZXhTdW1tYXJ5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcFRvTG9uZyhJbmRleFN1bW1hcnk6OmdldE9mZkhlYXBTaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN1bSgpOworICAgICAgICByZXR1cm4gUGFpci5jcmVhdGUobm9uUmVkaXN0cmlidXRpbmdPZmZIZWFwU2l6ZSwgYWxsTm9uQ29tcGFjdGluZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVkaXN0cmlidXRlU3VtbWFyaWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuaXNHbG9iYWxDb21wYWN0aW9uUGF1c2VkKCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFBhaXI8TG9uZywgTWFwPFRhYmxlSWQsIExpZmVjeWNsZVRyYW5zYWN0aW9uPj4gcmVkaXN0cmlidXRpb25UcmFuc2FjdGlvbkluZm8gPSBnZXRSZXN0cmlidXRpb25UcmFuc2FjdGlvbnMoKTsKKyAgICAgICAgTWFwPFRhYmxlSWQsIExpZmVjeWNsZVRyYW5zYWN0aW9uPiB0cmFuc2FjdGlvbnMgPSByZWRpc3RyaWJ1dGlvblRyYW5zYWN0aW9uSW5mby5yaWdodDsKKyAgICAgICAgbG9uZyBub25SZWRpc3RyaWJ1dGluZ09mZkhlYXBTaXplID0gcmVkaXN0cmlidXRpb25UcmFuc2FjdGlvbkluZm8ubGVmdDsKKyAgICAgICAgdHJ5IChUaW1lci5Db250ZXh0IGN0eCA9IENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmdldE1ldHJpY3MoKS5pbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvblRpbWUudGltZSgpKQorICAgICAgICB7CisgICAgICAgICAgICByZWRpc3RyaWJ1dGVTdW1tYXJpZXMobmV3IEluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uKHRyYW5zYWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uUmVkaXN0cmlidXRpbmdPZmZIZWFwU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW1vcnlQb29sQnl0ZXMpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgQ29tcGFjdGlvbkludGVycnVwdGVkRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJJbmRleCBzdW1tYXJ5IGludGVycnVwdGVkOiB7fSIsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkdvdCBleGNlcHRpb24gZHVyaW5nIGluZGV4IHN1bW1hcnkgcmVkaXN0cmlidXRpb24iLCBlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRkJVdGlsaXRpZXMuY2xvc2VBbGwodHJhbnNhY3Rpb25zLnZhbHVlcygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGVtcHRzIHRvIGZhaXJseSBkaXN0cmlidXRlIGEgZml4ZWQgcG9vbCBvZiBtZW1vcnkgZm9yIGluZGV4IHN1bW1hcmllcyBhY3Jvc3MgYSBzZXQgb2YgU1NUYWJsZXMgYmFzZWQgb24KKyAgICAgKiB0aGVpciByZWNlbnQgcmVhZCByYXRlcy4KKyAgICAgKiBAcGFyYW0gcmVkaXN0cmlidXRpb24gZW5jYXBzdWxhdGluZyB0aGUgdHJhbnNhY3Rpb25zIGNvbnRhaW5pbmcgdGhlIHNzdGFibGVzIHdlIGFyZSB0byByZWRpc3RyaWJ1dGUgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBwb29sIGFjcm9zcyBhbmQgYSBzaXplIChpbiBieXRlcykgdGhhdCB0aGUgdG90YWwgaW5kZXggc3VtbWFyeSBzcGFjZSB1c2FnZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgc3RheSBjbG9zZSB0byBvciB1bmRlciwgaWYgcG9zc2libGUKKyAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBuZXcgU1NUYWJsZVJlYWRlciBpbnN0YW5jZXMKKyAgICAgKi8KKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgU1NUYWJsZVJlYWRlciAmIEluZGV4U3VtbWFyeVN1cHBvcnQ+IExpc3Q8VD4gcmVkaXN0cmlidXRlU3VtbWFyaWVzKEluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uIHJlZGlzdHJpYnV0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5ydW5Bc0FjdGl2ZUNvbXBhY3Rpb24ocmVkaXN0cmlidXRpb24sIHJlZGlzdHJpYnV0aW9uOjpyZWRpc3RyaWJ1dGVTdW1tYXJpZXMpOworICAgIH0KKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyB2b2lkIHNodXRkb3duQW5kV2FpdChsb25nIHRpbWVvdXQsIFRpbWVVbml0IHVuaXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKGZ1dHVyZSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBmdXR1cmUuY2FuY2VsKGZhbHNlKTsKKyAgICAgICAgICAgIGZ1dHVyZSA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgRXhlY3V0b3JVdGlscy5zaHV0ZG93bkFuZFdhaXQodGltZW91dCwgdW5pdCwgZXhlY3V0b3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvaW5kZXhzdW1tYXJ5L0luZGV4U3VtbWFyeU1hbmFnZXJNQmVhbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9pbmRleHN1bW1hcnkvSW5kZXhTdW1tYXJ5TWFuYWdlck1CZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3OTU0NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvaW5kZXhzdW1tYXJ5L0luZGV4U3VtbWFyeU1hbmFnZXJNQmVhbi5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuaW5kZXhzdW1tYXJ5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgaW50ZXJmYWNlIEluZGV4U3VtbWFyeU1hbmFnZXJNQmVhbgoreworICAgIHB1YmxpYyBsb25nIGdldE1lbW9yeVBvb2xDYXBhY2l0eUluTUIoKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRNZW1vcnlQb29sQ2FwYWNpdHlJbk1CKGxvbmcgbWVtb3J5UG9vbENhcGFjaXR5SW5NQik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFjdHVhbCBvZmYtaGVhcCBtZW1vcnkgdXNhZ2Ugb2YgdGhlIGluZGV4IHN1bW1hcmllcyBmb3IgYWxsIG5vbi1jb21wYWN0aW5nIHNzdGFibGVzLgorICAgICAqIEByZXR1cm4gVGhlIGFtb3VudCBvZiBtZW1vcnkgdXNlZCBpbiBNaUIuCisgICAgICovCisgICAgcHVibGljIGRvdWJsZSBnZXRNZW1vcnlQb29sU2l6ZUluTUIoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBtYXAgb2YgU1NUYWJsZSBmaWxlbmFtZXMgdG8gdGhlaXIgY3VycmVudCBlZmZlY3RpdmUgaW5kZXggaW50ZXJ2YWwuCisgICAgICovCisgICAgcHVibGljIE1hcDxTdHJpbmcsIEludGVnZXI+IGdldEluZGV4SW50ZXJ2YWxzKCk7CisKKyAgICBwdWJsaWMgZG91YmxlIGdldEF2ZXJhZ2VJbmRleEludGVydmFsKCk7CisKKyAgICBwdWJsaWMgdm9pZCByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBwdWJsaWMgaW50IGdldFJlc2l6ZUludGVydmFsSW5NaW51dGVzKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgcmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMgPSAtMSBmb3IgZGlzYWJsZWQ7IFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgaW5kZXhfc3VtbWFyeV9yZXNpemVfaW50ZXJ2YWwgYmVpbmcKKyAgICAgKiBzZXQgdG8gbnVsbCBpbiBjYXNzYW5kcmEueWFtbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc2l6ZUludGVydmFsSW5NaW51dGVzKGludCByZXNpemVJbnRlcnZhbEluTWludXRlcyk7Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2luZGV4c3VtbWFyeS9JbmRleFN1bW1hcnlNZXRyaWNzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2luZGV4c3VtbWFyeS9JbmRleFN1bW1hcnlNZXRyaWNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg1NWU0MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvaW5kZXhzdW1tYXJ5L0luZGV4U3VtbWFyeU1ldHJpY3MuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuaW5kZXhzdW1tYXJ5OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQWJzdHJhY3RNZXRyaWNzUHJvdmlkZXJzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuR2F1Z2VQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworCitwdWJsaWMgY2xhc3MgSW5kZXhTdW1tYXJ5TWV0cmljczxSIGV4dGVuZHMgU1NUYWJsZVJlYWRlciAmIEluZGV4U3VtbWFyeVN1cHBvcnQ8Uj4+IGV4dGVuZHMgQWJzdHJhY3RNZXRyaWNzUHJvdmlkZXJzPFI+Cit7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBJbmRleFN1bW1hcnlNZXRyaWNzPD8+IGluc3RhbmNlID0gbmV3IEluZGV4U3VtbWFyeU1ldHJpY3M8PigpOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFIgbWFwKFNTVGFibGVSZWFkZXIgcikKKyAgICB7CisgICAgICAgIGlmIChyIGluc3RhbmNlb2YgSW5kZXhTdW1tYXJ5U3VwcG9ydDw/PikKKyAgICAgICAgICAgIHJldHVybiAoUikgcjsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBHYXVnZVByb3ZpZGVyPExvbmc+IGluZGV4U3VtbWFyeU9mZkhlYXBNZW1vcnlVc2VkID0gbmV3R2F1Z2VQcm92aWRlcigiSW5kZXhTdW1tYXJ5T2ZmSGVhcE1lbW9yeVVzZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIC0+IHIuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0T2ZmSGVhcFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmc6OnN1bSk7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8R2F1Z2VQcm92aWRlcjw/Pj4gZ2F1Z2VQcm92aWRlcnMgPSBBcnJheXMuYXNMaXN0KGluZGV4U3VtbWFyeU9mZkhlYXBNZW1vcnlVc2VkKTsKKworICAgIHB1YmxpYyBMaXN0PEdhdWdlUHJvdmlkZXI8Pz4+IGdldEdhdWdlUHJvdmlkZXJzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBnYXVnZVByb3ZpZGVyczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2luZGV4c3VtbWFyeS9JbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9pbmRleHN1bW1hcnkvSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2QxZjk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9pbmRleHN1bW1hcnkvSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24uamF2YQpAQCAtMCwwICsxLDQwOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkluZm8uVW5pdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRG93bnNhbXBsaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5TdG9yYWdlTWV0cmljczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuUmVmczsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRvd25zYW1wbGluZy5CQVNFX1NBTVBMSU5HX0xFVkVMOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwubmFub1RpbWU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlELkdlbmVyYXRvci5uZXh0VGltZVVVSUQ7CisKK3B1YmxpYyBjbGFzcyBJbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvbiBleHRlbmRzIENvbXBhY3Rpb25JbmZvLkhvbGRlcgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihJbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvbi5jbGFzcyk7CisKKyAgICAvLyBUaGUgdGFyZ2V0IChvciBpZGVhbCkgbnVtYmVyIG9mIGluZGV4IHN1bW1hcnkgZW50cmllcyBtdXN0IGRpZmZlciBmcm9tIHRoZSBhY3R1YWwgbnVtYmVyIG9mCisgICAgLy8gZW50cmllcyBieSB0aGlzIHJhdGlvIGluIG9yZGVyIHRvIHRyaWdnZXIgYW4gdXBzYW1wbGUgb3IgZG93bnNhbXBsZSBvZiB0aGUgc3VtbWFyeS4gIEJlY2F1c2UKKyAgICAvLyB1cHNhbXBsaW5nIHJlcXVpcmVzIHJlYWRpbmcgdGhlIHByaW1hcnkgaW5kZXggaW4gb3JkZXIgdG8gcmVidWlsZCB0aGUgc3VtbWFyeSwgdGhlIHRocmVzaG9sZAorICAgIC8vIGZvciB1cHNhbXBsaW5nIGlzIGlzIGhpZ2hlci4KKyAgICBzdGF0aWMgZmluYWwgZG91YmxlIFVQU0FNUExFX1RIUkVTSE9MRCA9IDEuNTsKKyAgICBzdGF0aWMgZmluYWwgZG91YmxlIERPV05TQU1QTEVfVEhFU0hPTEQgPSAwLjc1OworCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8VGFibGVJZCwgTGlmZWN5Y2xlVHJhbnNhY3Rpb24+IHRyYW5zYWN0aW9uczsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgbm9uUmVkaXN0cmlidXRpbmdPZmZIZWFwU2l6ZTsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgbWVtb3J5UG9vbEJ5dGVzOworICAgIHByaXZhdGUgZmluYWwgVGltZVVVSUQgY29tcGFjdGlvbklkOworICAgIHByaXZhdGUgdm9sYXRpbGUgbG9uZyByZW1haW5pbmdTcGFjZTsKKworICAgIC8qKgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9ucyB0aGUgdHJhbnNhY3Rpb25zIGZvciB0aGUgZGlmZmVyZW50IGtleXNwYWNlcy90YWJsZXMgd2UgYXJlIHRvIHJlZGlzdHJpYnV0ZQorICAgICAqIEBwYXJhbSBub25SZWRpc3RyaWJ1dGluZ09mZkhlYXBTaXplIHRoZSB0b3RhbCBpbmRleCBzdW1tYXJ5IG9mZiBoZWFwIHNpemUgZm9yIGFsbCBzc3RhYmxlcyB3ZSB3ZXJlIG5vdCBhYmxlIHRvIG1hcmsgY29tcGFjdGluZyAoZHVlIHRvIHRoZW0gYmVpbmcgaW52b2x2ZWQgaW4gb3RoZXIgY29tcGFjdGlvbnMpCisgICAgICogQHBhcmFtIG1lbW9yeVBvb2xCeXRlcyBzaXplIG9mIHRoZSBtZW1vcnkgcG9vbAorICAgICAqLworICAgIHB1YmxpYyBJbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvbihNYXA8VGFibGVJZCwgTGlmZWN5Y2xlVHJhbnNhY3Rpb24+IHRyYW5zYWN0aW9ucywgbG9uZyBub25SZWRpc3RyaWJ1dGluZ09mZkhlYXBTaXplLCBsb25nIG1lbW9yeVBvb2xCeXRlcykKKyAgICB7CisgICAgICAgIHRoaXMudHJhbnNhY3Rpb25zID0gdHJhbnNhY3Rpb25zOworICAgICAgICB0aGlzLm5vblJlZGlzdHJpYnV0aW5nT2ZmSGVhcFNpemUgPSBub25SZWRpc3RyaWJ1dGluZ09mZkhlYXBTaXplOworICAgICAgICB0aGlzLm1lbW9yeVBvb2xCeXRlcyA9IG1lbW9yeVBvb2xCeXRlczsKKyAgICAgICAgdGhpcy5jb21wYWN0aW9uSWQgPSBuZXh0VGltZVVVSUQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyA8VCBleHRlbmRzIFNTVGFibGVSZWFkZXIgJiBJbmRleFN1bW1hcnlTdXBwb3J0PFQ+PiBMaXN0PFQ+IGdldEluZGV4U3VtbWFyeVN1cHBvcnRpbmdBbmRDbG9zZU90aGVycyhMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4pCisgICAgeworICAgICAgICBMaXN0PFQ+IGZpbHRlcmVkID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gY2FuY2VscyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHR4bi5vcmlnaW5hbHMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNzdGFibGUgaW5zdGFuY2VvZiBJbmRleFN1bW1hcnlTdXBwb3J0PD8+KQorICAgICAgICAgICAgICAgIGZpbHRlcmVkLmFkZCgoVCkgc3N0YWJsZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY2FuY2Vscy5hZGQoc3N0YWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgdHhuLmNhbmNlbChjYW5jZWxzKTsKKyAgICAgICAgcmV0dXJuIGZpbHRlcmVkOworICAgIH0KKworICAgIHB1YmxpYyA8VCBleHRlbmRzIFNTVGFibGVSZWFkZXIgJiBJbmRleFN1bW1hcnlTdXBwb3J0PFQ+PiBMaXN0PFQ+IHJlZGlzdHJpYnV0ZVN1bW1hcmllcygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbG9uZyBzdGFydCA9IG5hbm9UaW1lKCk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJSZWRpc3RyaWJ1dGluZyBpbmRleCBzdW1tYXJpZXMiKTsKKyAgICAgICAgTGlzdDxUPiByZWRpc3RyaWJ1dGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICBmb3IgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA6IHRyYW5zYWN0aW9ucy52YWx1ZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVkaXN0cmlidXRlLmFkZEFsbChnZXRJbmRleFN1bW1hcnlTdXBwb3J0aW5nQW5kQ2xvc2VPdGhlcnModHhuKSk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIHRvdGFsID0gbm9uUmVkaXN0cmlidXRpbmdPZmZIZWFwU2l6ZTsKKyAgICAgICAgZm9yIChUIHNzdGFibGUgOiByZWRpc3RyaWJ1dGUpCisgICAgICAgICAgICB0b3RhbCArPSBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldE9mZkhlYXBTaXplKCk7CisKKyAgICAgICAgbG9nZ2VyLmluZm8oIkJlZ2lubmluZyByZWRpc3RyaWJ1dGlvbiBvZiBpbmRleCBzdW1tYXJpZXMgZm9yIHt9IHNzdGFibGVzIHdpdGggbWVtb3J5IHBvb2wgc2l6ZSB7fSBNaUI7IGN1cnJlbnQgc3BhY2VkIHVzZWQgaXMge30gTWlCIiwKKyAgICAgICAgICAgICAgICAgICAgIHJlZGlzdHJpYnV0ZS5zaXplKCksIG1lbW9yeVBvb2xCeXRlcyAvIDEwMjRMIC8gMTAyNEwsIHRvdGFsIC8gMTAyNC4wIC8gMTAyNC4wKTsKKworICAgICAgICBmaW5hbCBNYXA8VCwgRG91YmxlPiByZWFkUmF0ZXMgPSBuZXcgSGFzaE1hcDw+KHJlZGlzdHJpYnV0ZS5zaXplKCkpOworICAgICAgICBkb3VibGUgdG90YWxSZWFkc1BlclNlYyA9IDAuMDsKKyAgICAgICAgZm9yIChUIHNzdGFibGUgOiByZWRpc3RyaWJ1dGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpc1N0b3BSZXF1ZXN0ZWQoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29tcGFjdGlvbkludGVycnVwdGVkRXhjZXB0aW9uKGdldENvbXBhY3Rpb25JbmZvKCkpOworCisgICAgICAgICAgICBpZiAoc3N0YWJsZS5nZXRSZWFkTWV0ZXIoKSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERvdWJsZSByZWFkUmF0ZSA9IHNzdGFibGUuZ2V0UmVhZE1ldGVyKCkuZmlmdGVlbk1pbnV0ZVJhdGUoKTsKKyAgICAgICAgICAgICAgICB0b3RhbFJlYWRzUGVyU2VjICs9IHJlYWRSYXRlOworICAgICAgICAgICAgICAgIHJlYWRSYXRlcy5wdXQoc3N0YWJsZSwgcmVhZFJhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvZ2dlci50cmFjZSgiVG90YWwgcmVhZHMvc2VjIGFjcm9zcyBhbGwgc3N0YWJsZXMgaW4gaW5kZXggc3VtbWFyeSByZXNpemUgcHJvY2Vzczoge30iLCB0b3RhbFJlYWRzUGVyU2VjKTsKKworICAgICAgICAvLyBjb3B5IGFuZCBzb3J0IGJ5IHJlYWQgcmF0ZXMgKGFzY2VuZGluZykKKyAgICAgICAgTGlzdDxUPiBzc3RhYmxlc0J5SG90bmVzcyA9IG5ldyBBcnJheUxpc3Q8PihyZWRpc3RyaWJ1dGUpOworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHNzdGFibGVzQnlIb3RuZXNzLCBuZXcgUmVhZFJhdGVDb21wYXJhdG9yKHJlYWRSYXRlcykpOworCisgICAgICAgIGxvbmcgcmVtYWluaW5nQnl0ZXMgPSBtZW1vcnlQb29sQnl0ZXMgLSBub25SZWRpc3RyaWJ1dGluZ09mZkhlYXBTaXplOworCisgICAgICAgIGxvZ2dlci50cmFjZSgiSW5kZXggc3VtbWFyaWVzIGZvciBjb21wYWN0aW5nIFNTVGFibGVzIGFyZSB1c2luZyB7fSBNaUIgb2Ygc3BhY2UiLAorICAgICAgICAgICAgICAgICAgICAgKG1lbW9yeVBvb2xCeXRlcyAtIHJlbWFpbmluZ0J5dGVzKSAvIDEwMjQuMCAvIDEwMjQuMCk7CisgICAgICAgIExpc3Q8VD4gbmV3U1NUYWJsZXM7CisgICAgICAgIHRyeSAoUmVmczxTU1RhYmxlUmVhZGVyPiByZWZzID0gUmVmcy5yZWYoc3N0YWJsZXNCeUhvdG5lc3MpKQorICAgICAgICB7CisgICAgICAgICAgICBuZXdTU1RhYmxlcyA9IGFkanVzdFNhbXBsaW5nTGV2ZWxzKHNzdGFibGVzQnlIb3RuZXNzLCB0cmFuc2FjdGlvbnMsIHRvdGFsUmVhZHNQZXJTZWMsIHJlbWFpbmluZ0J5dGVzKTsKKworICAgICAgICAgICAgZm9yIChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gOiB0cmFuc2FjdGlvbnMudmFsdWVzKCkpCisgICAgICAgICAgICAgICAgdHhuLmZpbmlzaCgpOworICAgICAgICB9CisgICAgICAgIHRvdGFsID0gbm9uUmVkaXN0cmlidXRpbmdPZmZIZWFwU2l6ZTsKKyAgICAgICAgZm9yIChUIHNzdGFibGUgOiBuZXdTU1RhYmxlcykKKyAgICAgICAgICAgIHRvdGFsICs9IHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0T2ZmSGVhcFNpemUoKTsKKworICAgICAgICBsb2dnZXIuaW5mbygiQ29tcGxldGVkIHJlc2l6aW5nIG9mIGluZGV4IHN1bW1hcmllczsgY3VycmVudCBhcHByb3hpbWF0ZSBtZW1vcnkgdXNlZDoge30gTWlCLCB0aW1lIHNwZW50OiB7fW1zIiwKKyAgICAgICAgICAgICAgICAgICAgdG90YWwgLyAxMDI0LjAgLyAxMDI0LjAsIFRpbWVVbml0Lk5BTk9TRUNPTkRTLnRvTWlsbGlzKG5hbm9UaW1lKCkgLSBzdGFydCkpOworCisgICAgICAgIHJldHVybiBuZXdTU1RhYmxlczsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUIGV4dGVuZHMgU1NUYWJsZVJlYWRlciAmIEluZGV4U3VtbWFyeVN1cHBvcnQ8VD4+IExpc3Q8VD4gYWRqdXN0U2FtcGxpbmdMZXZlbHMoTGlzdDxUPiBzc3RhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFRhYmxlSWQsIExpZmVjeWNsZVRyYW5zYWN0aW9uPiB0cmFuc2FjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0b3RhbFJlYWRzUGVyU2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIG1lbW9yeVBvb2xDYXBhY2l0eSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBMaXN0PFJlc2FtcGxlRW50cnk8VD4+IHRvRG93bnNhbXBsZSA9IG5ldyBBcnJheUxpc3Q8Pihzc3RhYmxlcy5zaXplKCkgLyA0KTsKKyAgICAgICAgTGlzdDxSZXNhbXBsZUVudHJ5PFQ+PiB0b1Vwc2FtcGxlID0gbmV3IEFycmF5TGlzdDw+KHNzdGFibGVzLnNpemUoKSAvIDQpOworICAgICAgICBMaXN0PFJlc2FtcGxlRW50cnk8VD4+IGZvcmNlUmVzYW1wbGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSZXNhbXBsZUVudHJ5PFQ+PiBmb3JjZVVwc2FtcGxlID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8VD4gbmV3U1NUYWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oc3N0YWJsZXMuc2l6ZSgpKTsKKworICAgICAgICAvLyBHb2luZyBmcm9tIHRoZSBjb2xkZXN0IHRvIHRoZSBob3R0ZXN0IHNzdGFibGVzLCB0cnkgdG8gZ2l2ZSBlYWNoIHNzdGFibGUgYW4gYW1vdW50IG9mIHNwYWNlIHByb3BvcnRpb25hbAorICAgICAgICAvLyB0byB0aGUgbnVtYmVyIG9mIHRvdGFsIHJlYWRzL3NlYyBpdCBoYW5kbGVzLgorICAgICAgICByZW1haW5pbmdTcGFjZSA9IG1lbW9yeVBvb2xDYXBhY2l0eTsKKyAgICAgICAgZm9yIChUIHNzdGFibGUgOiBzc3RhYmxlcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlzU3RvcFJlcXVlc3RlZCgpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb24oZ2V0Q29tcGFjdGlvbkluZm8oKSk7CisKKyAgICAgICAgICAgIGludCBtaW5JbmRleEludGVydmFsID0gc3N0YWJsZS5tZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsOworICAgICAgICAgICAgaW50IG1heEluZGV4SW50ZXJ2YWwgPSBzc3RhYmxlLm1ldGFkYXRhKCkucGFyYW1zLm1heEluZGV4SW50ZXJ2YWw7CisKKyAgICAgICAgICAgIGRvdWJsZSByZWFkc1BlclNlYyA9IHNzdGFibGUuZ2V0UmVhZE1ldGVyKCkgPT0gbnVsbCA/IDAuMCA6IHNzdGFibGUuZ2V0UmVhZE1ldGVyKCkuZmlmdGVlbk1pbnV0ZVJhdGUoKTsKKyAgICAgICAgICAgIGxvbmcgaWRlYWxTcGFjZSA9IE1hdGgucm91bmQocmVtYWluaW5nU3BhY2UgKiAocmVhZHNQZXJTZWMgLyB0b3RhbFJlYWRzUGVyU2VjKSk7CisKKyAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgaG93IG1hbnkgZW50cmllcyBvdXIgaWRlYWxTcGFjZSB3b3VsZCBidXkgdXMsIGFuZCBwaWNrIGEgbmV3IHNhbXBsaW5nIGxldmVsIGJhc2VkIG9uIHRoYXQKKyAgICAgICAgICAgIGludCBjdXJyZW50TnVtRW50cmllcyA9IHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuc2l6ZSgpOworICAgICAgICAgICAgZG91YmxlIGF2Z0VudHJ5U2l6ZSA9IHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0T2ZmSGVhcFNpemUoKSAvIChkb3VibGUpIGN1cnJlbnROdW1FbnRyaWVzOworICAgICAgICAgICAgbG9uZyB0YXJnZXROdW1FbnRyaWVzID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChpZGVhbFNwYWNlIC8gYXZnRW50cnlTaXplKSk7CisgICAgICAgICAgICBpbnQgY3VycmVudFNhbXBsaW5nTGV2ZWwgPSBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldFNhbXBsaW5nTGV2ZWwoKTsKKyAgICAgICAgICAgIGludCBtYXhTdW1tYXJ5U2l6ZSA9IHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0TWF4TnVtYmVyT2ZFbnRyaWVzKCk7CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSBtaW5faW5kZXhfaW50ZXJ2YWwgY2hhbmdlZCwgY2FsY3VsYXRlIHdoYXQgb3VyIGN1cnJlbnQgc2FtcGxpbmcgbGV2ZWwgd291bGQgYmUgdW5kZXIgdGhlIG5ldyBtaW4KKyAgICAgICAgICAgIGlmIChzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldE1pbkluZGV4SW50ZXJ2YWwoKSAhPSBtaW5JbmRleEludGVydmFsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBlZmZlY3RpdmVTYW1wbGluZ0xldmVsID0gKGludCkgTWF0aC5yb3VuZChjdXJyZW50U2FtcGxpbmdMZXZlbCAqIChtaW5JbmRleEludGVydmFsIC8gKGRvdWJsZSkgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5nZXRNaW5JbmRleEludGVydmFsKCkpKTsKKyAgICAgICAgICAgICAgICBtYXhTdW1tYXJ5U2l6ZSA9IChpbnQpIE1hdGgucm91bmQobWF4U3VtbWFyeVNpemUgKiAoc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5nZXRNaW5JbmRleEludGVydmFsKCkgLyAoZG91YmxlKSBtaW5JbmRleEludGVydmFsKSk7CisgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJtaW5faW5kZXhfaW50ZXJ2YWwgY2hhbmdlZCBmcm9tIHt9IHRvIHt9LCBzbyB0aGUgY3VycmVudCBzYW1wbGluZyBsZXZlbCBmb3Ige30gaXMgZWZmZWN0aXZlbHkgbm93IHt9ICh3YXMge30pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5nZXRNaW5JbmRleEludGVydmFsKCksIG1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUsIGVmZmVjdGl2ZVNhbXBsaW5nTGV2ZWwsIGN1cnJlbnRTYW1wbGluZ0xldmVsKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50U2FtcGxpbmdMZXZlbCA9IGVmZmVjdGl2ZVNhbXBsaW5nTGV2ZWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBuZXdTYW1wbGluZ0xldmVsID0gSW5kZXhTdW1tYXJ5QnVpbGRlci5jYWxjdWxhdGVTYW1wbGluZ0xldmVsKGN1cnJlbnRTYW1wbGluZ0xldmVsLCBjdXJyZW50TnVtRW50cmllcywgdGFyZ2V0TnVtRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgbWluSW5kZXhJbnRlcnZhbCwgbWF4SW5kZXhJbnRlcnZhbCk7CisgICAgICAgICAgICBpbnQgbnVtRW50cmllc0F0TmV3U2FtcGxpbmdMZXZlbCA9IEluZGV4U3VtbWFyeUJ1aWxkZXIuZW50cmllc0F0U2FtcGxpbmdMZXZlbChuZXdTYW1wbGluZ0xldmVsLCBtYXhTdW1tYXJ5U2l6ZSk7CisgICAgICAgICAgICBkb3VibGUgZWZmZWN0aXZlSW5kZXhJbnRlcnZhbCA9IHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbCgpOworCisgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJ7fSBoYXMge30gcmVhZHMvc2VjOyBpZGVhbCBzcGFjZSBmb3IgaW5kZXggc3VtbWFyeToge30gKHt9IGVudHJpZXMpOyBjb25zaWRlcmluZyBtb3ZpbmcgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcm9tIGxldmVsIHt9ICh7fSBlbnRyaWVzLCB7fSkgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byBsZXZlbCB7fSAoe30gZW50cmllcywge30pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5nZXRGaWxlbmFtZSgpLCByZWFkc1BlclNlYywgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoaWRlYWxTcGFjZSksIHRhcmdldE51bUVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTYW1wbGluZ0xldmVsLCBjdXJyZW50TnVtRW50cmllcywgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoKGxvbmcpIChjdXJyZW50TnVtRW50cmllcyAqIGF2Z0VudHJ5U2l6ZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTYW1wbGluZ0xldmVsLCBudW1FbnRyaWVzQXROZXdTYW1wbGluZ0xldmVsLCBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeSgobG9uZykgKG51bUVudHJpZXNBdE5ld1NhbXBsaW5nTGV2ZWwgKiBhdmdFbnRyeVNpemUpKSk7CisKKyAgICAgICAgICAgIGlmIChlZmZlY3RpdmVJbmRleEludGVydmFsIDwgbWluSW5kZXhJbnRlcnZhbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbWluX2luZGV4X2ludGVydmFsIHdhcyBjaGFuZ2VkOyByZS1zYW1wbGUgdG8gbWF0Y2ggaXQuCisgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJGb3JjaW5nIHJlc2FtcGxlIG9mIHt9IGJlY2F1c2UgdGhlIGN1cnJlbnQgaW5kZXggaW50ZXJ2YWwgKHt9KSBpcyBiZWxvdyBtaW5faW5kZXhfaW50ZXJ2YWwgKHt9KSIsCisgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLCBlZmZlY3RpdmVJbmRleEludGVydmFsLCBtaW5JbmRleEludGVydmFsKTsKKyAgICAgICAgICAgICAgICBsb25nIHNwYWNlVXNlZCA9IChsb25nKSBNYXRoLmNlaWwoYXZnRW50cnlTaXplICogbnVtRW50cmllc0F0TmV3U2FtcGxpbmdMZXZlbCk7CisgICAgICAgICAgICAgICAgZm9yY2VSZXNhbXBsZS5hZGQobmV3IFJlc2FtcGxlRW50cnk8VD4oc3N0YWJsZSwgc3BhY2VVc2VkLCBuZXdTYW1wbGluZ0xldmVsKSk7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nU3BhY2UgLT0gc3BhY2VVc2VkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZWZmZWN0aXZlSW5kZXhJbnRlcnZhbCA+IG1heEluZGV4SW50ZXJ2YWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gVGhlIG1heF9pbmRleF9pbnRlcnZhbCB3YXMgbG93ZXJlZDsgZm9yY2UgYW4gdXBzYW1wbGUgdG8gdGhlIGVmZmVjdGl2ZSBtaW5pbXVtIHNhbXBsaW5nIGxldmVsCisgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJGb3JjaW5nIHVwc2FtcGxlIG9mIHt9IGJlY2F1c2UgdGhlIGN1cnJlbnQgaW5kZXggaW50ZXJ2YWwgKHt9KSBpcyBhYm92ZSBtYXhfaW5kZXhfaW50ZXJ2YWwgKHt9KSIsCisgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLCBlZmZlY3RpdmVJbmRleEludGVydmFsLCBtYXhJbmRleEludGVydmFsKTsKKyAgICAgICAgICAgICAgICBuZXdTYW1wbGluZ0xldmVsID0gTWF0aC5tYXgoMSwgKEJBU0VfU0FNUExJTkdfTEVWRUwgKiBtaW5JbmRleEludGVydmFsKSAvIG1heEluZGV4SW50ZXJ2YWwpOworICAgICAgICAgICAgICAgIG51bUVudHJpZXNBdE5ld1NhbXBsaW5nTGV2ZWwgPSBJbmRleFN1bW1hcnlCdWlsZGVyLmVudHJpZXNBdFNhbXBsaW5nTGV2ZWwobmV3U2FtcGxpbmdMZXZlbCwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5nZXRNYXhOdW1iZXJPZkVudHJpZXMoKSk7CisgICAgICAgICAgICAgICAgbG9uZyBzcGFjZVVzZWQgPSAobG9uZykgTWF0aC5jZWlsKGF2Z0VudHJ5U2l6ZSAqIG51bUVudHJpZXNBdE5ld1NhbXBsaW5nTGV2ZWwpOworICAgICAgICAgICAgICAgIGZvcmNlVXBzYW1wbGUuYWRkKG5ldyBSZXNhbXBsZUVudHJ5PFQ+KHNzdGFibGUsIHNwYWNlVXNlZCwgbmV3U2FtcGxpbmdMZXZlbCkpOworICAgICAgICAgICAgICAgIHJlbWFpbmluZ1NwYWNlIC09IGF2Z0VudHJ5U2l6ZSAqIG51bUVudHJpZXNBdE5ld1NhbXBsaW5nTGV2ZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh0YXJnZXROdW1FbnRyaWVzID49IGN1cnJlbnROdW1FbnRyaWVzICogVVBTQU1QTEVfVEhSRVNIT0xEICYmIG5ld1NhbXBsaW5nTGV2ZWwgPiBjdXJyZW50U2FtcGxpbmdMZXZlbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIHNwYWNlVXNlZCA9IChsb25nKSBNYXRoLmNlaWwoYXZnRW50cnlTaXplICogbnVtRW50cmllc0F0TmV3U2FtcGxpbmdMZXZlbCk7CisgICAgICAgICAgICAgICAgdG9VcHNhbXBsZS5hZGQobmV3IFJlc2FtcGxlRW50cnk8VD4oc3N0YWJsZSwgc3BhY2VVc2VkLCBuZXdTYW1wbGluZ0xldmVsKSk7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nU3BhY2UgLT0gYXZnRW50cnlTaXplICogbnVtRW50cmllc0F0TmV3U2FtcGxpbmdMZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHRhcmdldE51bUVudHJpZXMgPCBjdXJyZW50TnVtRW50cmllcyAqIERPV05TQU1QTEVfVEhFU0hPTEQgJiYgbmV3U2FtcGxpbmdMZXZlbCA8IGN1cnJlbnRTYW1wbGluZ0xldmVsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvbmcgc3BhY2VVc2VkID0gKGxvbmcpIE1hdGguY2VpbChhdmdFbnRyeVNpemUgKiBudW1FbnRyaWVzQXROZXdTYW1wbGluZ0xldmVsKTsKKyAgICAgICAgICAgICAgICB0b0Rvd25zYW1wbGUuYWRkKG5ldyBSZXNhbXBsZUVudHJ5PFQ+KHNzdGFibGUsIHNwYWNlVXNlZCwgbmV3U2FtcGxpbmdMZXZlbCkpOworICAgICAgICAgICAgICAgIHJlbWFpbmluZ1NwYWNlIC09IHNwYWNlVXNlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBrZWVwIHRoZSBzYW1lIHNhbXBsaW5nIGxldmVsCisgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJTU1RhYmxlIHt9IGlzIHdpdGhpbiB0aHJlc2hvbGRzIG9mIGlkZWFsIHNhbXBsaW5nIiwgc3N0YWJsZSk7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nU3BhY2UgLT0gc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5nZXRPZmZIZWFwU2l6ZSgpOworICAgICAgICAgICAgICAgIG5ld1NTVGFibGVzLmFkZChzc3RhYmxlKTsKKyAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMuZ2V0KHNzdGFibGUubWV0YWRhdGEoKS5pZCkuY2FuY2VsKHNzdGFibGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG90YWxSZWFkc1BlclNlYyAtPSByZWFkc1BlclNlYzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZW1haW5pbmdTcGFjZSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFBhaXI8TGlzdDxUPiwgTGlzdDxSZXNhbXBsZUVudHJ5PFQ+Pj4gcmVzdWx0ID0gZGlzdHJpYnV0ZVJlbWFpbmluZ1NwYWNlKHRvRG93bnNhbXBsZSwgcmVtYWluaW5nU3BhY2UpOworICAgICAgICAgICAgdG9Eb3duc2FtcGxlID0gcmVzdWx0LnJpZ2h0OworICAgICAgICAgICAgbmV3U1NUYWJsZXMuYWRkQWxsKHJlc3VsdC5sZWZ0KTsKKyAgICAgICAgICAgIGZvciAoVCBzc3RhYmxlIDogcmVzdWx0LmxlZnQpCisgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zLmdldChzc3RhYmxlLm1ldGFkYXRhKCkuaWQpLmNhbmNlbChzc3RhYmxlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRvd25zYW1wbGUgZmlyc3QsIHRoZW4gdXBzYW1wbGUKKyAgICAgICAgbG9nZ2VyLmluZm8oImluZGV4IHN1bW1hcmllczogZG93bnNhbXBsZToge30sIGZvcmNlIHJlc2FtcGxlOiB7fSwgdXBzYW1wbGU6IHt9LCBmb3JjZSB1cHNhbXBsZToge30iLCB0b0Rvd25zYW1wbGUuc2l6ZSgpLCBmb3JjZVJlc2FtcGxlLnNpemUoKSwgdG9VcHNhbXBsZS5zaXplKCksIGZvcmNlVXBzYW1wbGUuc2l6ZSgpKTsKKyAgICAgICAgdG9Eb3duc2FtcGxlLmFkZEFsbChmb3JjZVJlc2FtcGxlKTsKKyAgICAgICAgdG9Eb3duc2FtcGxlLmFkZEFsbCh0b1Vwc2FtcGxlKTsKKyAgICAgICAgdG9Eb3duc2FtcGxlLmFkZEFsbChmb3JjZVVwc2FtcGxlKTsKKyAgICAgICAgZm9yIChSZXNhbXBsZUVudHJ5PFQ+IGVudHJ5IDogdG9Eb3duc2FtcGxlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXNTdG9wUmVxdWVzdGVkKCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbXBhY3Rpb25JbnRlcnJ1cHRlZEV4Y2VwdGlvbihnZXRDb21wYWN0aW9uSW5mbygpKTsKKworICAgICAgICAgICAgVCBzc3RhYmxlID0gZW50cnkuc3N0YWJsZTsKKyAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiUmUtc2FtcGxpbmcgaW5kZXggc3VtbWFyeSBmb3Ige30gZnJvbSB7fS97fSB0byB7fS97fSBvZiB0aGUgb3JpZ2luYWwgbnVtYmVyIG9mIGVudHJpZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpLCBEb3duc2FtcGxpbmcuQkFTRV9TQU1QTElOR19MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5uZXdTYW1wbGluZ0xldmVsLCBEb3duc2FtcGxpbmcuQkFTRV9TQU1QTElOR19MRVZFTCk7CisgICAgICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKHNzdGFibGUubWV0YWRhdGEoKS5rZXlzcGFjZSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoc3N0YWJsZS5tZXRhZGF0YSgpLmlkKTsKKyAgICAgICAgICAgIGxvbmcgb2xkU2l6ZSA9IHNzdGFibGUuYnl0ZXNPbkRpc2soKTsKKyAgICAgICAgICAgIGxvbmcgb2xkU2l6ZVVuY29tcHJlc3NlZCA9IHNzdGFibGUubG9naWNhbEJ5dGVzT25EaXNrKCk7CisKKyAgICAgICAgICAgIFQgcmVwbGFjZW1lbnQgPSBzc3RhYmxlLmNsb25lV2l0aE5ld1N1bW1hcnlTYW1wbGluZ0xldmVsKGNmcywgZW50cnkubmV3U2FtcGxpbmdMZXZlbCk7CisgICAgICAgICAgICBsb25nIG5ld1NpemUgPSByZXBsYWNlbWVudC5ieXRlc09uRGlzaygpOworICAgICAgICAgICAgbG9uZyBuZXdTaXplVW5jb21wcmVzc2VkID0gcmVwbGFjZW1lbnQubG9naWNhbEJ5dGVzT25EaXNrKCk7CisKKyAgICAgICAgICAgIG5ld1NTVGFibGVzLmFkZChyZXBsYWNlbWVudCk7CisgICAgICAgICAgICB0cmFuc2FjdGlvbnMuZ2V0KHNzdGFibGUubWV0YWRhdGEoKS5pZCkudXBkYXRlKHJlcGxhY2VtZW50LCB0cnVlKTsKKyAgICAgICAgICAgIGFkZEhvb2tzKGNmcywgdHJhbnNhY3Rpb25zLCBvbGRTaXplLCBuZXdTaXplLCBvbGRTaXplVW5jb21wcmVzc2VkLCBuZXdTaXplVW5jb21wcmVzc2VkKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXdTU1RhYmxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgaG9va3MgdG8gY29ycmVjdGx5IHVwZGF0ZSB0aGUgc3RvcmFnZSBsb2FkIG1ldHJpY3Mgb25jZSB0aGUgdHJhbnNhY3Rpb24gaXMgY2xvc2VkL2Fib3J0ZWQKKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBUcmFuc2FjdGlvbnMgYXJlIGNsb3NlZCBpbiBmaW5hbGx5IG91dHNpZGUgb2YgdGhpcyBtZXRob2QKKyAgICBwcml2YXRlIHZvaWQgYWRkSG9va3MoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBNYXA8VGFibGVJZCwgTGlmZWN5Y2xlVHJhbnNhY3Rpb24+IHRyYW5zYWN0aW9ucywgbG9uZyBvbGRTaXplLCBsb25nIG5ld1NpemUsIGxvbmcgb2xkU2l6ZVVuY29tcHJlc3NlZCwgbG9uZyBuZXdTaXplVW5jb21wcmVzc2VkKQorICAgIHsKKyAgICAgICAgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gdHJhbnNhY3Rpb25zLmdldChjZnMubWV0YWRhdGEuaWQpOworICAgICAgICB0eG4ucnVuT25Db21taXQoKCkgLT4geworICAgICAgICAgICAgLy8gVGhlIG5ldyBzaXplIHdpbGwgYmUgYWRkZWQgaW4gVHJhbnNhY3Rpb25hbC5jb21taXQoKSBhcyBhbiB1cGRhdGVkIFNTVGFibGUsIG1vcmUgZGV0YWlsczogQ0FTU0FORFJBLTEzNzM4CisgICAgICAgICAgICBTdG9yYWdlTWV0cmljcy5sb2FkLmRlYyhvbGRTaXplKTsKKyAgICAgICAgICAgIFN0b3JhZ2VNZXRyaWNzLnVuY29tcHJlc3NlZExvYWQuZGVjKG9sZFNpemVVbmNvbXByZXNzZWQpOworCisgICAgICAgICAgICBjZnMubWV0cmljLmxpdmVEaXNrU3BhY2VVc2VkLmRlYyhvbGRTaXplKTsKKyAgICAgICAgICAgIGNmcy5tZXRyaWMudW5jb21wcmVzc2VkTGl2ZURpc2tTcGFjZVVzZWQuZGVjKG9sZFNpemVVbmNvbXByZXNzZWQpOworICAgICAgICAgICAgY2ZzLm1ldHJpYy50b3RhbERpc2tTcGFjZVVzZWQuZGVjKG9sZFNpemUpOworICAgICAgICB9KTsKKyAgICAgICAgdHhuLnJ1bk9uQWJvcnQoKCkgLT4geworICAgICAgICAgICAgLy8gdGhlIGxvY2FsIGRpc2sgd2FzIG1vZGlmaWVkIGJ1dCBib29ra2VlcGluZyBjb3VsZG4ndCBiZSBjb21taXRlZCwgYXBwbHkgdGhlIGRlbHRhCisgICAgICAgICAgICBsb25nIGRlbHRhID0gb2xkU2l6ZSAtIG5ld1NpemU7IC8vIGlmIG5ldyBpcyBsYXJnZXIgdGhpcyB3aWxsIGJlIG5lZ2F0aXZlLCBzbyBkZWMgd2lsbCBiZWNvbWUgYSBpbmMKKyAgICAgICAgICAgIGxvbmcgZGVsdGFVbmNvbXByZXNzZWQgPSBvbGRTaXplVW5jb21wcmVzc2VkIC0gbmV3U2l6ZVVuY29tcHJlc3NlZDsKKworICAgICAgICAgICAgU3RvcmFnZU1ldHJpY3MubG9hZC5kZWMoZGVsdGEpOworICAgICAgICAgICAgU3RvcmFnZU1ldHJpY3MudW5jb21wcmVzc2VkTG9hZC5kZWMoZGVsdGFVbmNvbXByZXNzZWQpOworCisgICAgICAgICAgICBjZnMubWV0cmljLmxpdmVEaXNrU3BhY2VVc2VkLmRlYyhkZWx0YSk7CisgICAgICAgICAgICBjZnMubWV0cmljLnVuY29tcHJlc3NlZExpdmVEaXNrU3BhY2VVc2VkLmRlYyhkZWx0YVVuY29tcHJlc3NlZCk7CisgICAgICAgICAgICBjZnMubWV0cmljLnRvdGFsRGlza1NwYWNlVXNlZC5kZWMoZGVsdGEpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBzdGF0aWMgPFQgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyICYgSW5kZXhTdW1tYXJ5U3VwcG9ydDxUPj4gUGFpcjxMaXN0PFQ+LCBMaXN0PFJlc2FtcGxlRW50cnk8VD4+PiBkaXN0cmlidXRlUmVtYWluaW5nU3BhY2UoTGlzdDxSZXNhbXBsZUVudHJ5PFQ+PiB0b0Rvd25zYW1wbGUsIGxvbmcgcmVtYWluaW5nU3BhY2UpCisgICAgeworICAgICAgICAvLyBzb3J0IGJ5IHRoZSBhbW91bnQgb2Ygc3BhY2UgcmVnYWluZWQgYnkgZG9pbmcgdGhlIGRvd25zYW1wbGUgb3BlcmF0aW9uOyB3ZSB3YW50IHRvIHRyeSB0byBhdm9pZCBvcGVyYXRpb25zCisgICAgICAgIC8vIHRoYXQgd2lsbCBtYWtlIGxpdHRsZSBkaWZmZXJlbmNlLgorICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRvRG93bnNhbXBsZSwgQ29tcGFyYXRvci5jb21wYXJpbmdEb3VibGUobyAtPiBvLnNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0T2ZmSGVhcFNpemUoKSAtIG8ubmV3U3BhY2VVc2VkKSk7CisKKyAgICAgICAgaW50IG5vRG93bnNhbXBsZUN1dG9mZiA9IDA7CisgICAgICAgIExpc3Q8VD4gd2lsbE5vdERvd25zYW1wbGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgd2hpbGUgKHJlbWFpbmluZ1NwYWNlID4gMCAmJiBub0Rvd25zYW1wbGVDdXRvZmYgPCB0b0Rvd25zYW1wbGUuc2l6ZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBSZXNhbXBsZUVudHJ5PFQ+IGVudHJ5ID0gdG9Eb3duc2FtcGxlLmdldChub0Rvd25zYW1wbGVDdXRvZmYpOworCisgICAgICAgICAgICBsb25nIGV4dHJhU3BhY2VSZXF1aXJlZCA9IGVudHJ5LnNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0T2ZmSGVhcFNpemUoKSAtIGVudHJ5Lm5ld1NwYWNlVXNlZDsKKyAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBoYXZlIGVub3VnaCBsZWZ0b3ZlciBzcGFjZSB0byBrZWVwIHRoZSBjdXJyZW50IHNhbXBsaW5nIGxldmVsCisgICAgICAgICAgICBpZiAoZXh0cmFTcGFjZVJlcXVpcmVkIDw9IHJlbWFpbmluZ1NwYWNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiVXNpbmcgbGVmdG92ZXIgc3BhY2UgdG8ga2VlcCB7fSBhdCB0aGUgY3VycmVudCBzYW1wbGluZyBsZXZlbCAoe30pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuc3N0YWJsZSwgZW50cnkuc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5nZXRTYW1wbGluZ0xldmVsKCkpOworICAgICAgICAgICAgICAgIHdpbGxOb3REb3duc2FtcGxlLmFkZChlbnRyeS5zc3RhYmxlKTsKKyAgICAgICAgICAgICAgICByZW1haW5pbmdTcGFjZSAtPSBleHRyYVNwYWNlUmVxdWlyZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5vRG93bnNhbXBsZUN1dG9mZisrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQYWlyLmNyZWF0ZSh3aWxsTm90RG93bnNhbXBsZSwgdG9Eb3duc2FtcGxlLnN1Ykxpc3Qobm9Eb3duc2FtcGxlQ3V0b2ZmLCB0b0Rvd25zYW1wbGUuc2l6ZSgpKSk7CisgICAgfQorCisgICAgcHVibGljIENvbXBhY3Rpb25JbmZvIGdldENvbXBhY3Rpb25JbmZvKCkKKyAgICB7CisgICAgICAgIHJldHVybiBDb21wYWN0aW9uSW5mby53aXRob3V0U1NUYWJsZXMobnVsbCwgT3BlcmF0aW9uVHlwZS5JTkRFWF9TVU1NQVJZLCAobWVtb3J5UG9vbEJ5dGVzIC0gcmVtYWluaW5nU3BhY2UpLCBtZW1vcnlQb29sQnl0ZXMsIFVuaXQuQllURVMsIGNvbXBhY3Rpb25JZCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqIFV0aWxpdHkgY2xhc3MgZm9yIHNvcnRpbmcgc3N0YWJsZXMgYnkgdGhlaXIgcmVhZCByYXRlcy4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZWFkUmF0ZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yPFNTVGFibGVSZWFkZXI+CisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDw/IGV4dGVuZHMgU1NUYWJsZVJlYWRlciwgRG91YmxlPiByZWFkUmF0ZXM7CisKKyAgICAgICAgUmVhZFJhdGVDb21wYXJhdG9yKE1hcDw/IGV4dGVuZHMgU1NUYWJsZVJlYWRlciwgRG91YmxlPiByZWFkUmF0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucmVhZFJhdGVzID0gcmVhZFJhdGVzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShTU1RhYmxlUmVhZGVyIG8xLCBTU1RhYmxlUmVhZGVyIG8yKQorICAgICAgICB7CisgICAgICAgICAgICBEb3VibGUgcmVhZFJhdGUxID0gcmVhZFJhdGVzLmdldChvMSk7CisgICAgICAgICAgICBEb3VibGUgcmVhZFJhdGUyID0gcmVhZFJhdGVzLmdldChvMik7CisgICAgICAgICAgICBpZiAocmVhZFJhdGUxID09IG51bGwgJiYgcmVhZFJhdGUyID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBlbHNlIGlmIChyZWFkUmF0ZTEgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBlbHNlIGlmIChyZWFkUmF0ZTIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gRG91YmxlLmNvbXBhcmUocmVhZFJhdGUxLCByZWFkUmF0ZTIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVzYW1wbGVFbnRyeTxUIGV4dGVuZHMgU1NUYWJsZVJlYWRlciAmIEluZGV4U3VtbWFyeVN1cHBvcnQ8VD4+CisgICAgeworICAgICAgICBwdWJsaWMgZmluYWwgVCBzc3RhYmxlOworICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyBuZXdTcGFjZVVzZWQ7CisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbmV3U2FtcGxpbmdMZXZlbDsKKworICAgICAgICBSZXNhbXBsZUVudHJ5KFQgc3N0YWJsZSwgbG9uZyBuZXdTcGFjZVVzZWQsIGludCBuZXdTYW1wbGluZ0xldmVsKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnNzdGFibGUgPSBzc3RhYmxlOworICAgICAgICAgICAgdGhpcy5uZXdTcGFjZVVzZWQgPSBuZXdTcGFjZVVzZWQ7CisgICAgICAgICAgICB0aGlzLm5ld1NhbXBsaW5nTGV2ZWwgPSBuZXdTYW1wbGluZ0xldmVsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9pbmRleHN1bW1hcnkvSW5kZXhTdW1tYXJ5U3VwcG9ydC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9pbmRleHN1bW1hcnkvSW5kZXhTdW1tYXJ5U3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYWQ4M2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2luZGV4c3VtbWFyeS9JbmRleFN1bW1hcnlTdXBwb3J0LmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgSW5kZXhTdW1tYXJ5U3VwcG9ydDxUIGV4dGVuZHMgU1NUYWJsZVJlYWRlciAmIEluZGV4U3VtbWFyeVN1cHBvcnQ8VD4+Cit7CisgICAgSW5kZXhTdW1tYXJ5IGdldEluZGV4U3VtbWFyeSgpOworCisgICAgVCBjbG9uZVdpdGhOZXdTdW1tYXJ5U2FtcGxpbmdMZXZlbChDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIGludCBuZXdTYW1wbGluZ0xldmVsKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBzdGF0aWMgYm9vbGVhbiBpc1N1cHBvcnRlZEJ5KFNTVGFibGVGb3JtYXQ8PywgPz4gZm9ybWF0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEluZGV4U3VtbWFyeVN1cHBvcnQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShmb3JtYXQuZ2V0UmVhZGVyRmFjdG9yeSgpLmdldFJlYWRlckNsYXNzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUva2V5Y2FjaGUvS2V5Q2FjaGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUva2V5Y2FjaGUvS2V5Q2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWQxOTU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9rZXljYWNoZS9LZXlDYWNoZS5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5rZXljYWNoZTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5Mb25nQWRkZXI7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Ob25udWxsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuSW5zdHJ1bWVudGluZ0NhY2hlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLktleUNhY2hlS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQWJzdHJhY3RSb3dJbmRleEVudHJ5OworCisvKioKKyAqIEEgc2ltcGxlIHdyYXBwZXIgb2YgcG9zc2libHkgZ2xvYmFsIGNhY2hlIHdpdGggbG9jYWwgbWV0cmljcy4KKyAqLworcHVibGljIGNsYXNzIEtleUNhY2hlCit7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBLZXlDYWNoZSBOT19DQUNIRSA9IG5ldyBLZXlDYWNoZShudWxsKTsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihLZXlDYWNoZS5jbGFzcyk7CisKKyAgICBwcml2YXRlIGZpbmFsIEluc3RydW1lbnRpbmdDYWNoZTxLZXlDYWNoZUtleSwgQWJzdHJhY3RSb3dJbmRleEVudHJ5PiBjYWNoZTsKKyAgICBwcml2YXRlIGZpbmFsIExvbmdBZGRlciBoaXRzID0gbmV3IExvbmdBZGRlcigpOworICAgIHByaXZhdGUgZmluYWwgTG9uZ0FkZGVyIHJlcXVlc3RzID0gbmV3IExvbmdBZGRlcigpOworCisgICAgcHVibGljIEtleUNhY2hlKEBOdWxsYWJsZSBJbnN0cnVtZW50aW5nQ2FjaGU8S2V5Q2FjaGVLZXksIEFic3RyYWN0Um93SW5kZXhFbnRyeT4gY2FjaGUpCisgICAgeworICAgICAgICB0aGlzLmNhY2hlID0gY2FjaGU7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0SGl0cygpCisgICAgeworICAgICAgICByZXR1cm4gY2FjaGUgIT0gbnVsbCA/IGhpdHMuc3VtKCkgOiAwOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldFJlcXVlc3RzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjYWNoZSAhPSBudWxsID8gcmVxdWVzdHMuc3VtKCkgOiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHB1dChATm9ubnVsbCBLZXlDYWNoZUtleSBjYWNoZUtleSwgQE5vbm51bGwgQWJzdHJhY3RSb3dJbmRleEVudHJ5IGluZm8pCisgICAgeworICAgICAgICBpZiAoY2FjaGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBsb2dnZXIudHJhY2UoIkFkZGluZyBjYWNoZSBlbnRyeSBmb3Ige30gLT4ge30iLCBjYWNoZUtleSwgaW5mbyk7CisgICAgICAgIGNhY2hlLnB1dChjYWNoZUtleSwgaW5mbyk7CisgICAgfQorCisgICAgcHVibGljIEBOdWxsYWJsZSBBYnN0cmFjdFJvd0luZGV4RW50cnkgZ2V0KEtleUNhY2hlS2V5IGtleSwgYm9vbGVhbiB1cGRhdGVTdGF0cykKKyAgICB7CisgICAgICAgIGlmIChjYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgaWYgKHVwZGF0ZVN0YXRzKQorICAgICAgICB7CisgICAgICAgICAgICByZXF1ZXN0cy5pbmNyZW1lbnQoKTsKKyAgICAgICAgICAgIEFic3RyYWN0Um93SW5kZXhFbnRyeSByID0gY2FjaGUuZ2V0KGtleSk7CisgICAgICAgICAgICBpZiAociAhPSBudWxsKQorICAgICAgICAgICAgICAgIGhpdHMuaW5jcmVtZW50KCk7CisgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjYWNoZS5nZXRJbnRlcm5hbChrZXkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjYWNoZSAhPSBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUva2V5Y2FjaGUvS2V5Q2FjaGVNZXRyaWNzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2tleWNhY2hlL0tleUNhY2hlTWV0cmljcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYTFhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2tleWNhY2hlL0tleUNhY2hlTWV0cmljcy5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5rZXljYWNoZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0TWV0cmljc1Byb3ZpZGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkdhdWdlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKKworcHVibGljIGNsYXNzIEtleUNhY2hlTWV0cmljczxSIGV4dGVuZHMgU1NUYWJsZVJlYWRlciAmIEtleUNhY2hlU3VwcG9ydDxSPj4gZXh0ZW5kcyBBYnN0cmFjdE1ldHJpY3NQcm92aWRlcnM8Uj4KK3sKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIEtleUNhY2hlTWV0cmljczw/PiBpbnN0YW5jZSA9IG5ldyBLZXlDYWNoZU1ldHJpY3M8PigpOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFIgbWFwKFNTVGFibGVSZWFkZXIgcikKKyAgICB7CisgICAgICAgIGlmIChyIGluc3RhbmNlb2YgS2V5Q2FjaGVTdXBwb3J0PD8+KQorICAgICAgICAgICAgcmV0dXJuIChSKSByOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKiogS2V5IGNhY2hlIGhpdCByYXRlICBmb3IgdGhpcyBDRiAqLworICAgIHByaXZhdGUgZmluYWwgR2F1Z2VQcm92aWRlcjxEb3VibGU+IGtleUNhY2hlSGl0UmF0ZSA9IG5ld0dhdWdlUHJvdmlkZXIoIktleUNhY2hlSGl0UmF0ZSIsIHJlYWRlcnMgLT4geworICAgICAgICBsb25nIGhpdHMgPSAwTDsKKyAgICAgICAgbG9uZyByZXF1ZXN0cyA9IDBMOworICAgICAgICBmb3IgKFIgc3N0YWJsZSA6IHJlYWRlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhpdHMgKz0gc3N0YWJsZS5nZXRLZXlDYWNoZSgpLmdldEhpdHMoKTsKKyAgICAgICAgICAgIHJlcXVlc3RzICs9IHNzdGFibGUuZ2V0S2V5Q2FjaGUoKS5nZXRSZXF1ZXN0cygpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChkb3VibGUpIGhpdHMgLyAoZG91YmxlKSBNYXRoLm1heCgxLCByZXF1ZXN0cyk7CisgICAgfSk7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8R2F1Z2VQcm92aWRlcjw/Pj4gZ2F1Z2VQcm92aWRlcnMgPSBBcnJheXMuYXNMaXN0KGtleUNhY2hlSGl0UmF0ZSk7CisKKyAgICBwdWJsaWMgTGlzdDxHYXVnZVByb3ZpZGVyPD8+PiBnZXRHYXVnZVByb3ZpZGVycygpCisgICAgeworICAgICAgICByZXR1cm4gZ2F1Z2VQcm92aWRlcnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9rZXljYWNoZS9LZXlDYWNoZVN1cHBvcnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUva2V5Y2FjaGUvS2V5Q2FjaGVTdXBwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1ZGI3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUva2V5Y2FjaGUvS2V5Q2FjaGVTdXBwb3J0LmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmtleWNhY2hlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTm9ubnVsbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuS2V5Q2FjaGVLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0JvdW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0Um93SW5kZXhFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOworCitwdWJsaWMgaW50ZXJmYWNlIEtleUNhY2hlU3VwcG9ydDxUIGV4dGVuZHMgU1NUYWJsZVJlYWRlciAmIEtleUNhY2hlU3VwcG9ydDxUPj4KK3sKKyAgICBATm9ubnVsbAorICAgIEtleUNhY2hlIGdldEtleUNhY2hlKCk7CisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgcXVpY2tseSBnZXQgYSBsb3dlciBib3VuZCBwcmVmaXggZnJvbSBjYWNoZSBvbmx5IGlmIGV2ZXJ5dGhpbmcgaXMgYWxyZWFkeSBhdmFpbGFiZSBpbiBtZW1vcnkgYW5kIGRvZXMgbm90CisgICAgICogbmVlZCB0byBiZSBsb2FkZWQgZnJvbSBkaXNrLgorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIENsdXN0ZXJpbmdCb3VuZDw/PiBnZXRMb3dlckJvdW5kUHJlZml4RnJvbUNhY2hlKERlY29yYXRlZEtleSBwYXJ0aXRpb25LZXksIGJvb2xlYW4gaXNSZXZlcnNlZCk7CisKKyAgICBkZWZhdWx0IEBOb25udWxsIEtleUNhY2hlS2V5IGdldENhY2hlS2V5KEJ5dGVCdWZmZXIga2V5KQorICAgIHsKKyAgICAgICAgVCByZWFkZXIgPSAoVCkgdGhpczsKKyAgICAgICAgcmV0dXJuIG5ldyBLZXlDYWNoZUtleShyZWFkZXIubWV0YWRhdGEoKSwgcmVhZGVyLmRlc2NyaXB0b3IsIGtleSk7CisgICAgfQorCisgICAgZGVmYXVsdCBATm9ubnVsbCBLZXlDYWNoZUtleSBnZXRDYWNoZUtleShEZWNvcmF0ZWRLZXkga2V5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldENhY2hlS2V5KGtleS5nZXRLZXkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2lsbCByZXR1cm4gbnVsbCBpZiBrZXkgaXMgbm90IGZvdW5kIG9yIGNhY2hlIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICovCisgICAgZGVmYXVsdCBATnVsbGFibGUgQWJzdHJhY3RSb3dJbmRleEVudHJ5IGdldENhY2hlZFBvc2l0aW9uKERlY29yYXRlZEtleSBrZXksIGJvb2xlYW4gdXBkYXRlU3RhdHMpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0Q2FjaGVkUG9zaXRpb24oZ2V0Q2FjaGVLZXkoa2V5KSwgdXBkYXRlU3RhdHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdpbGwgcmV0dXJuIG51bGwgaWYga2V5IGlzIG5vdCBmb3VuZCBvciBjYWNoZSBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqLworICAgIGRlZmF1bHQgQE51bGxhYmxlIEFic3RyYWN0Um93SW5kZXhFbnRyeSBnZXRDYWNoZWRQb3NpdGlvbihLZXlDYWNoZUtleSBrZXksIGJvb2xlYW4gdXBkYXRlU3RhdHMpCisgICAgeworICAgICAgICBLZXlDYWNoZSBrZXlDYWNoZSA9IGdldEtleUNhY2hlKCk7CisgICAgICAgIEFic3RyYWN0Um93SW5kZXhFbnRyeSBjYWNoZWRFbnRyeSA9IGtleUNhY2hlLmdldChrZXksIHVwZGF0ZVN0YXRzKTsKKyAgICAgICAgYXNzZXJ0IGNhY2hlZEVudHJ5ID09IG51bGwgfHwgY2FjaGVkRW50cnkuZ2V0U1NUYWJsZUZvcm1hdCgpID09ICgoVCkgdGhpcykuZGVzY3JpcHRvci52ZXJzaW9uLmZvcm1hdDsKKworICAgICAgICByZXR1cm4gY2FjaGVkRW50cnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FjaGVzIGEga2V5IG9ubHkgaWYgY2FjaGUgaXMgYXZhaWxhYmxlLgorICAgICAqLworICAgIGRlZmF1bHQgdm9pZCBjYWNoZUtleShATm9ubnVsbCBEZWNvcmF0ZWRLZXkga2V5LCBATm9ubnVsbCBBYnN0cmFjdFJvd0luZGV4RW50cnkgaW5mbykKKyAgICB7CisgICAgICAgIFQgcmVhZGVyID0gKFQpIHRoaXM7CisgICAgICAgIGFzc2VydCBpbmZvLmdldFNTVGFibGVGb3JtYXQoKSA9PSByZWFkZXIuZGVzY3JpcHRvci52ZXJzaW9uLmZvcm1hdDsKKworICAgICAgICBLZXlDYWNoZUtleSBjYWNoZUtleSA9IGdldENhY2hlS2V5KGtleSk7CisgICAgICAgIGdldEtleUNhY2hlKCkucHV0KGNhY2hlS2V5LCBpbmZvKTsKKyAgICB9CisKKyAgICBATm9ubnVsbAorICAgIEFic3RyYWN0Um93SW5kZXhFbnRyeSBkZXNlcmlhbGl6ZUtleUNhY2hlVmFsdWUoQE5vbm51bGwgRGF0YUlucHV0UGx1cyBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgc3RhdGljIGJvb2xlYW4gaXNTdXBwb3J0ZWRCeShTU1RhYmxlRm9ybWF0PD8sID8+IGZvcm1hdCkKKyAgICB7CisgICAgICAgIHJldHVybiBLZXlDYWNoZVN1cHBvcnQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShmb3JtYXQuZ2V0UmVhZGVyRmFjdG9yeSgpLmdldFJlYWRlckNsYXNzKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9tZXRhZGF0YS9NZXRhZGF0YUNvbGxlY3Rvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9tZXRhZGF0YS9NZXRhZGF0YUNvbGxlY3Rvci5qYXZhCmluZGV4IDEzNzUzMzEuLmQxNGViYjIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvbWV0YWRhdGEvTWV0YWRhdGFDb2xsZWN0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL21ldGFkYXRhL01ldGFkYXRhQ29sbGVjdG9yLmphdmEKQEAgLTE4LDM3ICsxOCw0NCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhOwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5VVUlEOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOwotCiBpbXBvcnQgY29tLmNsZWFyc3ByaW5nLmFuYWx5dGljcy5zdHJlYW0uY2FyZGluYWxpdHkuSHlwZXJMb2dMb2dQbHVzOwogaW1wb3J0IGNvbS5jbGVhcnNwcmluZy5hbmFseXRpY3Muc3RyZWFtLmNhcmRpbmFsaXR5LklDYXJkaW5hbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0JvdW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdCb3VuZE9yQm91bmRhcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0NvbXBhcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ1ByZWZpeDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuTGl2ZW5lc3NJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2xpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZ1Bvc2l0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZy5JbnRlcnZhbFNldDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlBhcnRpdGlvblN0YXRpc3RpY3NDb2xsZWN0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkFjdGl2ZVJlcGFpclNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Fc3RpbWF0ZWRIaXN0b2dyYW07CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTXVybXVySGFzaDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5zdHJlYW1oaXN0LlRvbWJzdG9uZUhpc3RvZ3JhbTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5zdHJlYW1oaXN0LlN0cmVhbWluZ1RvbWJzdG9uZUhpc3RvZ3JhbUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuc3RyZWFtaGlzdC5Ub21ic3RvbmVIaXN0b2dyYW07CiAKIHB1YmxpYyBjbGFzcyBNZXRhZGF0YUNvbGxlY3RvciBpbXBsZW1lbnRzIFBhcnRpdGlvblN0YXRpc3RpY3NDb2xsZWN0b3IKIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBOT19DT01QUkVTU0lPTl9SQVRJTyA9IC0xLjA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlcltdIEVNUFRZX0NMVVNURVJJTkcgPSBuZXcgQnl0ZUJ1ZmZlclswXTsKKworICAgIHByaXZhdGUgbG9uZyBjdXJyZW50UGFydGl0aW9uQ2VsbHMgPSAwOwogCiAgICAgc3RhdGljIEVzdGltYXRlZEhpc3RvZ3JhbSBkZWZhdWx0Q2VsbFBlclBhcnRpdGlvbkNvdW50SGlzdG9ncmFtKCkKICAgICB7CkBAIC01OCw4ICs2NSw5IEBACiAKICAgICBzdGF0aWMgRXN0aW1hdGVkSGlzdG9ncmFtIGRlZmF1bHRQYXJ0aXRpb25TaXplSGlzdG9ncmFtKCkKICAgICB7Ci0gICAgICAgIC8vIEVIIG9mIDE1MCBjYW4gdHJhY2sgYSBtYXggdmFsdWUgb2YgMTY5NzgwNjQ5NTE4MywgaS5lLiwgPiAxLjVQQgotICAgICAgICByZXR1cm4gbmV3IEVzdGltYXRlZEhpc3RvZ3JhbSgxNTApOworICAgICAgICAvLyBFSCBvZiAxNTUgY2FuIHRyYWNrIGEgbWF4IHZhbHVlIG9mIDM1MjA1NzE1NDg0MTIgaS5lLiAzLjVUQgorICAgICAgICByZXR1cm4gbmV3IEVzdGltYXRlZEhpc3RvZ3JhbSgxNTUpOworCiAgICAgfQogCiAgICAgc3RhdGljIFRvbWJzdG9uZUhpc3RvZ3JhbSBkZWZhdWx0VG9tYnN0b25lRHJvcFRpbWVIaXN0b2dyYW0oKQpAQCAtODEsMTUgKzg5LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT19DT01QUkVTU0lPTl9SQVRJTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRUb21ic3RvbmVEcm9wVGltZUhpc3RvZ3JhbSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLjxCeXRlQnVmZmVyPmVtcHR5TGlzdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuPEJ5dGVCdWZmZXI+ZW1wdHlMaXN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsaWNlLkFMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3RpdmVSZXBhaXJTZXJ2aWNlLlVOUkVQQUlSRURfU1NUQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLkVNUFRZX0JZVEVfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuRU1QVFlfQllURV9CVUZGRVIpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCBFc3RpbWF0ZWRIaXN0b2dyYW0gZXN0aW1hdGVkUGFydGl0aW9uU2l6ZSA9IGRlZmF1bHRQYXJ0aXRpb25TaXplSGlzdG9ncmFtKCk7CkBAIC0xMDIsOSArMTEzLDI1IEBACiAgICAgcHJvdGVjdGVkIGRvdWJsZSBjb21wcmVzc2lvblJhdGlvID0gTk9fQ09NUFJFU1NJT05fUkFUSU87CiAgICAgcHJvdGVjdGVkIFN0cmVhbWluZ1RvbWJzdG9uZUhpc3RvZ3JhbUJ1aWxkZXIgZXN0aW1hdGVkVG9tYnN0b25lRHJvcFRpbWUgPSBuZXcgU3RyZWFtaW5nVG9tYnN0b25lSGlzdG9ncmFtQnVpbGRlcihTU1RhYmxlLlRPTUJTVE9ORV9ISVNUT0dSQU1fQklOX1NJWkUsIFNTVGFibGUuVE9NQlNUT05FX0hJU1RPR1JBTV9TUE9PTF9TSVpFLCBTU1RhYmxlLlRPTUJTVE9ORV9ISVNUT0dSQU1fVFRMX1JPVU5EX1NFQ09ORFMpOwogICAgIHByb3RlY3RlZCBpbnQgc3N0YWJsZUxldmVsOwotICAgIHByaXZhdGUgQ2x1c3RlcmluZ1ByZWZpeDw/PiBtaW5DbHVzdGVyaW5nID0gbnVsbDsKLSAgICBwcml2YXRlIENsdXN0ZXJpbmdQcmVmaXg8Pz4gbWF4Q2x1c3RlcmluZyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc21hbGxlc3QgY2x1c3RlcmluZyBwcmVmaXggZm9yIGFueSB7QGxpbmsgVW5maWx0ZXJlZH0gaW4gdGhlIHNzdGFibGUuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGlzIGFsd2F5cyBlaXRoZXIgYSBDbHVzdGVyaW5nLCBvciBhIHN0YXJ0IGJvdW5kIChzaW5jZSBmb3IgYW55IGVuZCByYW5nZSB0b21ic3RvbmUgYm91bmQsIHRoZXJlIHNob3VsZAorICAgICAqIGJlIGEgY29ycmVzcG9uZGluZyBzdGFydCBib3VuZCB0aGF0IGlzIHNtYWxsZXIpLgorICAgICAqLworICAgIHByaXZhdGUgQ2x1c3RlcmluZ1ByZWZpeDw/PiBtaW5DbHVzdGVyaW5nID0gQ2x1c3RlcmluZ0JvdW5kLk1BWF9TVEFSVDsKKyAgICAvKioKKyAgICAgKiBUaGUgbGFyZ2VzdCBjbHVzdGVyaW5nIHByZWZpeCBmb3IgYW55IHtAbGluayBVbmZpbHRlcmVkfSBpbiB0aGUgc3N0YWJsZS4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgaXMgYWx3YXlzIGVpdGhlciBhIENsdXN0ZXJpbmcsIG9yIGFuIGVuZCBib3VuZCAoc2luY2UgZm9yIGFueSBzdGFydCByYW5nZSB0b21ic3RvbmUgYm91bmQsIHRoZXJlIHNob3VsZAorICAgICAqIGJlIGEgY29ycmVzcG9uZGluZyBlbmQgYm91bmQgdGhhdCBpcyBiaWdnZXIpLgorICAgICAqLworICAgIHByaXZhdGUgQ2x1c3RlcmluZ1ByZWZpeDw/PiBtYXhDbHVzdGVyaW5nID0gQ2x1c3RlcmluZ0JvdW5kLk1JTl9FTkQ7CisgICAgcHJpdmF0ZSBib29sZWFuIGNsdXN0ZXJpbmdJbml0aWFsaXplZCA9IGZhbHNlOworCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGVnYWN5Q291bnRlclNoYXJkcyA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNQYXJ0aXRpb25MZXZlbERlbGV0aW9ucyA9IGZhbHNlOwogICAgIHByb3RlY3RlZCBsb25nIHRvdGFsQ29sdW1uc1NldDsKICAgICBwcm90ZWN0ZWQgbG9uZyB0b3RhbFJvd3M7CiAgICAgcHVibGljIGludCB0b3RhbFRvbWJzdG9uZXM7CkBAIC0xNjksNiArMTk2LDEzIEBACiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAorICAgIHB1YmxpYyBNZXRhZGF0YUNvbGxlY3RvciBhZGRDZWxsUGVyUGFydGl0aW9uQ291bnQoKQorICAgIHsKKyAgICAgICAgZXN0aW1hdGVkQ2VsbFBlclBhcnRpdGlvbkNvdW50LmFkZChjdXJyZW50UGFydGl0aW9uQ2VsbHMpOworICAgICAgICBjdXJyZW50UGFydGl0aW9uQ2VsbHMgPSAwOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSYXRpbyBpcyBjb21wcmVzc2VkL3VuY29tcHJlc3NlZCBhbmQgaXQgaXMKICAgICAgKiBpZiB5b3UgaGF2ZSAxLnggdGhlbiBjb21wcmVzc2lvbiBpc24ndCBoZWxwaW5nCkBAIC0xOTMsNiArMjI3LDcgQEAKIAogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShDZWxsPD8+IGNlbGwpCiAgICAgeworICAgICAgICArK2N1cnJlbnRQYXJ0aXRpb25DZWxsczsKICAgICAgICAgdXBkYXRlVGltZXN0YW1wKGNlbGwudGltZXN0YW1wKCkpOwogICAgICAgICB1cGRhdGVUVEwoY2VsbC50dGwoKSk7CiAgICAgICAgIHVwZGF0ZUxvY2FsRGVsZXRpb25UaW1lKGNlbGwubG9jYWxEZWxldGlvblRpbWUoKSk7CkBAIC0yMDAsNiArMjM1LDEzIEBACiAgICAgICAgICAgICB1cGRhdGVUb21ic3RvbmVDb3VudCgpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBhcnRpdGlvbkRlbGV0aW9uKERlbGV0aW9uVGltZSBkdCkKKyAgICB7CisgICAgICAgIGlmICghZHQuaXNMaXZlKCkpCisgICAgICAgICAgICBoYXNQYXJ0aXRpb25MZXZlbERlbGV0aW9ucyA9IHRydWU7CisgICAgICAgIHVwZGF0ZShkdCk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdXBkYXRlKERlbGV0aW9uVGltZSBkdCkKICAgICB7CiAgICAgICAgIGlmICghZHQuaXNMaXZlKCkpCkBAIC0yNTAsMTEgKzI5Miw1NCBAQAogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKLSAgICBwdWJsaWMgTWV0YWRhdGFDb2xsZWN0b3IgdXBkYXRlQ2x1c3RlcmluZ1ZhbHVlcyhDbHVzdGVyaW5nUHJlZml4PD8+IGNsdXN0ZXJpbmcpCisgICAgcHVibGljIHZvaWQgdXBkYXRlQ2x1c3RlcmluZ1ZhbHVlcyhDbHVzdGVyaW5nPD8+IGNsdXN0ZXJpbmcpCiAgICAgewotICAgICAgICBtaW5DbHVzdGVyaW5nID0gbWluQ2x1c3RlcmluZyA9PSBudWxsIHx8IGNvbXBhcmF0b3IuY29tcGFyZShjbHVzdGVyaW5nLCBtaW5DbHVzdGVyaW5nKSA8IDAgPyBjbHVzdGVyaW5nLm1pbmltaXplKCkgOiBtaW5DbHVzdGVyaW5nOwotICAgICAgICBtYXhDbHVzdGVyaW5nID0gbWF4Q2x1c3RlcmluZyA9PSBudWxsIHx8IGNvbXBhcmF0b3IuY29tcGFyZShjbHVzdGVyaW5nLCBtYXhDbHVzdGVyaW5nKSA+IDAgPyBjbHVzdGVyaW5nLm1pbmltaXplKCkgOiBtYXhDbHVzdGVyaW5nOwotICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgaWYgKGNsdXN0ZXJpbmcgPT0gQ2x1c3RlcmluZy5TVEFUSUNfQ0xVU1RFUklORykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBJbiBjYXNlIG9mIG1vbm90b25pY2FsbHkgZ3Jvd2luZyBzdHJlYW0gb2YgY2x1c3RlcmluZ3MsIHdlIHdpbGwgdXN1YWxseSByZXF1aXJlIG9ubHkgb25lIGNvbXBhcmlzb24KKyAgICAgICAgLy8gYmVjYXVzZSBpZiB3ZSBkZXRlY3RlZCBYIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBNQVgsIHRoZW4gaXQgY2Fubm90IGJlIGxvd2VyIHRoYW4gdGhlIGN1cnJlbnQgTUlOCisgICAgICAgIC8vIGF0IHRoZSBzYW1lIHRpbWUuIFRoZSBvbmx5IGNhc2Ugd2hlbiB3ZSBuZWVkIHRvIHVwZGF0ZSBNSU4gd2hlbiB0aGUgY3VycmVudCBNQVggd2FzIGRldGVjdGVkIHRvIGJlIHVwZGF0ZWQKKyAgICAgICAgLy8gaXMgdGhlIGNhc2Ugd2hlbiBNSU4gd2FzIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgYW5kIHN0aWxsIHBvaW50IHRoZSBDbHVzdGVyaW5nQm91bmQuTUFYX1NUQVJUCisgICAgICAgIGlmIChjb21wYXJhdG9yLmNvbXBhcmUoY2x1c3RlcmluZywgbWF4Q2x1c3RlcmluZykgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBtYXhDbHVzdGVyaW5nID0gY2x1c3RlcmluZzsKKyAgICAgICAgICAgIGlmIChtaW5DbHVzdGVyaW5nID09IENsdXN0ZXJpbmdCb3VuZC5NQVhfU1RBUlQpCisgICAgICAgICAgICAgICAgbWluQ2x1c3RlcmluZyA9IGNsdXN0ZXJpbmc7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY29tcGFyYXRvci5jb21wYXJlKGNsdXN0ZXJpbmcsIG1pbkNsdXN0ZXJpbmcpIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgbWluQ2x1c3RlcmluZyA9IGNsdXN0ZXJpbmc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVDbHVzdGVyaW5nVmFsdWVzQnlCb3VuZE9yQm91bmRhcnkoQ2x1c3RlcmluZ0JvdW5kT3JCb3VuZGFyeTw/PiBjbHVzdGVyaW5nQm91bmRPckJvdW5kYXJ5KQorICAgIHsKKyAgICAgICAgLy8gSW4gYSBTU1RhYmxlLCBldmVyeSBvcGVuaW5nIG1hcmtlciB3aWxsIGJlIGNsb3NlZCwgc28gdGhlIHN0YXJ0IG9mIGEgcmFuZ2UgdG9tYnN0b25lIG1hcmtlciB3aWxsIG5ldmVyIGJlCisgICAgICAgIC8vIHRoZSBtYXhDbHVzdGVyaW5nICh0aGUgY29ycmVzcG9uZGluZyBjbG9zZSBtaWdodCB0aG91Z2gpIGFuZCB0aGVyZSBpcyBubyBwb2ludCBpbiBkb2luZyB0aGUgY29tcGFyaXNvbgorICAgICAgICAvLyAoYW5kIHZpY2UtdmVyc2EgZm9yIHRoZSBjbG9zZSkuIEJ5IHRoZSBzYW1lIHJlYXNvbmluZywgYSBib3VuZGFyeSB3aWxsIG5ldmVyIGJlIGVpdGhlciB0aGUgbWluIG9yIG1heAorICAgICAgICAvLyBjbHVzdGVyaW5nLCBhbmQgd2UgY2FuIHNhdmUgb24gY29tcGFyaXNvbnMuCisgICAgICAgIGlmIChjbHVzdGVyaW5nQm91bmRPckJvdW5kYXJ5LmlzQm91bmRhcnkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBzZWUgdGhlIGNvbW1lbnQgaW4gdXBkYXRlQ2x1c3RlcmluZ1ZhbHVlcyhDbHVzdGVyaW5nKQorICAgICAgICBpZiAoY29tcGFyYXRvci5jb21wYXJlKGNsdXN0ZXJpbmdCb3VuZE9yQm91bmRhcnksIG1heENsdXN0ZXJpbmcpID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsdXN0ZXJpbmdCb3VuZE9yQm91bmRhcnkua2luZCgpLmlzRW5kKCkpCisgICAgICAgICAgICAgICAgbWF4Q2x1c3RlcmluZyA9IGNsdXN0ZXJpbmdCb3VuZE9yQm91bmRhcnk7CisKKyAgICAgICAgICAgIC8vIG5vdGUgdGhhdCBzaW5jZSB3ZSBleGNsdWRlZCBib3VuZGFyaWVzIGFib3ZlLCB0aGVyZSBpcyBubyB3YXkgdGhhdCB0aGUgcHJvdmlkZWQgY2x1c3RlcmluZyBwcmVmaXggaXMKKyAgICAgICAgICAgIC8vIGEgc3RhcnQgYW5kIGVuIGVuZCBhdCB0aGUgc2FtZSB0aW1lCisgICAgICAgICAgICBlbHNlIGlmIChtaW5DbHVzdGVyaW5nID09IENsdXN0ZXJpbmdCb3VuZC5NQVhfU1RBUlQpCisgICAgICAgICAgICAgICAgbWluQ2x1c3RlcmluZyA9IGNsdXN0ZXJpbmdCb3VuZE9yQm91bmRhcnk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY29tcGFyYXRvci5jb21wYXJlKGNsdXN0ZXJpbmdCb3VuZE9yQm91bmRhcnksIG1pbkNsdXN0ZXJpbmcpIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsdXN0ZXJpbmdCb3VuZE9yQm91bmRhcnkua2luZCgpLmlzU3RhcnQoKSkKKyAgICAgICAgICAgICAgICBtaW5DbHVzdGVyaW5nID0gY2x1c3RlcmluZ0JvdW5kT3JCb3VuZGFyeTsKKyAgICAgICAgICAgIGVsc2UgaWYgKG1heENsdXN0ZXJpbmcgPT0gQ2x1c3RlcmluZ0JvdW5kLk1JTl9FTkQpCisgICAgICAgICAgICAgICAgbWF4Q2x1c3RlcmluZyA9IGNsdXN0ZXJpbmdCb3VuZE9yQm91bmRhcnk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB1cGRhdGVIYXNMZWdhY3lDb3VudGVyU2hhcmRzKGJvb2xlYW4gaGFzTGVnYWN5Q291bnRlclNoYXJkcykKQEAgLTI2MiwxMiArMzQ3LDExIEBACiAgICAgICAgIHRoaXMuaGFzTGVnYWN5Q291bnRlclNoYXJkcyA9IHRoaXMuaGFzTGVnYWN5Q291bnRlclNoYXJkcyB8fCBoYXNMZWdhY3lDb3VudGVyU2hhcmRzOwogICAgIH0KIAotICAgIHB1YmxpYyBNYXA8TWV0YWRhdGFUeXBlLCBNZXRhZGF0YUNvbXBvbmVudD4gZmluYWxpemVNZXRhZGF0YShTdHJpbmcgcGFydGl0aW9uZXIsIGRvdWJsZSBibG9vbUZpbHRlckZQQ2hhbmNlLCBsb25nIHJlcGFpcmVkQXQsIFRpbWVVVUlEIHBlbmRpbmdSZXBhaXIsIGJvb2xlYW4gaXNUcmFuc2llbnQsIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyKQorICAgIHB1YmxpYyBNYXA8TWV0YWRhdGFUeXBlLCBNZXRhZGF0YUNvbXBvbmVudD4gZmluYWxpemVNZXRhZGF0YShTdHJpbmcgcGFydGl0aW9uZXIsIGRvdWJsZSBibG9vbUZpbHRlckZQQ2hhbmNlLCBsb25nIHJlcGFpcmVkQXQsIFRpbWVVVUlEIHBlbmRpbmdSZXBhaXIsIGJvb2xlYW4gaXNUcmFuc2llbnQsIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyLCBCeXRlQnVmZmVyIGZpcnN0S2V5LCBCeXRlQnVmZmVyIGxhc3RLZXkpCiAgICAgewotICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrU3RhdGUoKG1pbkNsdXN0ZXJpbmcgPT0gbnVsbCAmJiBtYXhDbHVzdGVyaW5nID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjb21wYXJhdG9yLmNvbXBhcmUobWF4Q2x1c3RlcmluZywgbWluQ2x1c3RlcmluZykgPj0gMCk7Ci0gICAgICAgIEJ5dGVCdWZmZXJbXSBtaW5WYWx1ZXMgPSBtaW5DbHVzdGVyaW5nICE9IG51bGwgPyBtaW5DbHVzdGVyaW5nLmdldEJ1ZmZlckFycmF5KCkgOiBFTVBUWV9DTFVTVEVSSU5HOwotICAgICAgICBCeXRlQnVmZmVyW10gbWF4VmFsdWVzID0gbWF4Q2x1c3RlcmluZyAhPSBudWxsID8gbWF4Q2x1c3RlcmluZy5nZXRCdWZmZXJBcnJheSgpIDogRU1QVFlfQ0xVU1RFUklORzsKKyAgICAgICAgYXNzZXJ0IG1pbkNsdXN0ZXJpbmcua2luZCgpID09IENsdXN0ZXJpbmdQcmVmaXguS2luZC5DTFVTVEVSSU5HIHx8IG1pbkNsdXN0ZXJpbmcua2luZCgpLmlzU3RhcnQoKTsKKyAgICAgICAgYXNzZXJ0IG1heENsdXN0ZXJpbmcua2luZCgpID09IENsdXN0ZXJpbmdQcmVmaXguS2luZC5DTFVTVEVSSU5HIHx8IG1heENsdXN0ZXJpbmcua2luZCgpLmlzRW5kKCk7CisKICAgICAgICAgTWFwPE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBuZXcgRW51bU1hcDw+KE1ldGFkYXRhVHlwZS5jbGFzcyk7CiAgICAgICAgIGNvbXBvbmVudHMucHV0KE1ldGFkYXRhVHlwZS5WQUxJREFUSU9OLCBuZXcgVmFsaWRhdGlvbk1ldGFkYXRhKHBhcnRpdGlvbmVyLCBibG9vbUZpbHRlckZQQ2hhbmNlKSk7CiAgICAgICAgIGNvbXBvbmVudHMucHV0KE1ldGFkYXRhVHlwZS5TVEFUUywgbmV3IFN0YXRzTWV0YWRhdGEoZXN0aW1hdGVkUGFydGl0aW9uU2l6ZSwKQEAgLTI4MiwxNSArMzY2LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25SYXRpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZWRUb21ic3RvbmVEcm9wVGltZS5idWlsZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGVMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlTGlzdChtaW5WYWx1ZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VMaXN0KG1heFZhbHVlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyYXRvci5zdWJ0eXBlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsaWNlLm1ha2UobWluQ2x1c3RlcmluZy5yZXRhaW5hYmxlKCkuYXNTdGFydEJvdW5kKCksIG1heENsdXN0ZXJpbmcucmV0YWluYWJsZSgpLmFzRW5kQm91bmQoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzTGVnYWN5Q291bnRlclNoYXJkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBhaXJlZEF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsQ29sdW1uc1NldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFJvd3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYXRpbmdIb3N0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1JlcGFpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RyYW5zaWVudCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVHJhbnNpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0S2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RLZXkpKTsKICAgICAgICAgY29tcG9uZW50cy5wdXQoTWV0YWRhdGFUeXBlLkNPTVBBQ1RJT04sIG5ldyBDb21wYWN0aW9uTWV0YWRhdGEoY2FyZGluYWxpdHkpKTsKICAgICAgICAgY29tcG9uZW50cy5wdXQoTWV0YWRhdGFUeXBlLkhFQURFUiwgaGVhZGVyLnRvQ29tcG9uZW50KCkpOwogICAgICAgICByZXR1cm4gY29tcG9uZW50czsKQEAgLTMwNCwxOCArMzkxLDYgQEAKICAgICAgICAgZXN0aW1hdGVkVG9tYnN0b25lRHJvcFRpbWUucmVsZWFzZUJ1ZmZlcnMoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEJ5dGVCdWZmZXI+IG1ha2VMaXN0KEJ5dGVCdWZmZXJbXSB2YWx1ZXMpCi0gICAgewotICAgICAgICAvLyBJbiBtb3N0IGNhc2UsIGwgd2lsbCBiZSB0aGUgc2FtZSBzaXplIHRoYW4gdmFsdWVzLCBidXQgaXQncyBwb3NzaWJsZSBmb3IgaXQgdG8gYmUgc21hbGxlcgotICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IGwgPSBuZXcgQXJyYXlMaXN0PEJ5dGVCdWZmZXI+KHZhbHVlcy5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIGlmICh2YWx1ZXNbaV0gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBsLmFkZCh2YWx1ZXNbaV0pOwotICAgICAgICByZXR1cm4gbDsKLSAgICB9Ci0KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1pbk1heExvbmdUcmFja2VyCiAgICAgewogICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgZGVmYXVsdE1pbjsKQEAgLTQwOSw0ICs0ODQsNCBAQAogICAgICAgICAgICAgcmV0dXJuIGlzU2V0ID8gbWF4IDogZGVmYXVsdE1heDsKICAgICAgICAgfQogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL21ldGFkYXRhL01ldGFkYXRhU2VyaWFsaXplci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9tZXRhZGF0YS9NZXRhZGF0YVNlcmlhbGl6ZXIuamF2YQppbmRleCBmMTNkYWE0Li41ZWNiNTgyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL21ldGFkYXRhL01ldGFkYXRhU2VyaWFsaXplci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvbWV0YWRhdGEvTWV0YWRhdGFTZXJpYWxpemVyLmphdmEKQEAgLTE3LDI1ICsxNywzMyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGE7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLio7Ci0KIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5VbmFyeU9wZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKLQogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU1dyaXRlRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db3JydXB0U1NUYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlRGF0YUlucHV0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmFuZG9tQWNjZXNzUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzLnVwZGF0ZUNoZWNrc3VtSW50OwpAQCAtMTEzLDcgKzEyMSw3IEBACiAgICAgewogICAgICAgICBNYXA8TWV0YWRhdGFUeXBlLCBNZXRhZGF0YUNvbXBvbmVudD4gY29tcG9uZW50czsKICAgICAgICAgbG9nZ2VyLnRyYWNlKCJMb2FkIG1ldGFkYXRhIGZvciB7fSIsIGRlc2NyaXB0b3IpOwotICAgICAgICBGaWxlIHN0YXRzRmlsZSA9IG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlNUQVRTKSk7CisgICAgICAgIEZpbGUgc3RhdHNGaWxlID0gZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuU1RBVFMpOwogICAgICAgICBpZiAoIXN0YXRzRmlsZS5leGlzdHMoKSkKICAgICAgICAgewogICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJObyBzc3RhYmxlIHN0YXRzIGZvciB7fSIsIGRlc2NyaXB0b3IpOwpAQCAtMjEzLDggKzIyMSw4IEBACiAKICAgICAgICAgaWYgKGFjdHVhbENoZWNrc3VtICE9IGV4cGVjdGVkQ2hlY2tzdW0pCiAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlNUQVRTKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihuZXcgSU9FeGNlcHRpb24oIkNoZWNrc3VtcyBkbyBub3QgbWF0Y2ggZm9yICIgKyBmaWxlbmFtZSksIGZpbGVuYW1lKTsKKyAgICAgICAgICAgIEZpbGUgZmlsZSA9IGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlNUQVRTKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihuZXcgSU9FeGNlcHRpb24oIkNoZWNrc3VtcyBkbyBub3QgbWF0Y2ggZm9yICIgKyBmaWxlKSwgZmlsZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIyMiw3ICsyMzAsNyBAQAogICAgIHB1YmxpYyB2b2lkIG11dGF0ZShEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFN0cmluZyBkZXNjcmlwdGlvbiwgVW5hcnlPcGVyYXRvcjxTdGF0c01ldGFkYXRhPiB0cmFuc2Zvcm0pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpICkKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiTXV0YXRpbmcge30gdG8ge30iLCBkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5TVEFUUyksIGRlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiTXV0YXRpbmcge30gdG8ge30iLCBkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5TVEFUUyksIGRlc2NyaXB0aW9uKTsKIAogICAgICAgICBtdXRhdGUoZGVzY3JpcHRvciwgdHJhbnNmb3JtKTsKICAgICB9CkBAIC0yMzEsNyArMjM5LDcgQEAKICAgICBwdWJsaWMgdm9pZCBtdXRhdGVMZXZlbChEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGludCBuZXdMZXZlbCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoIk11dGF0aW5nIHt9IHRvIGxldmVsIHt9IiwgZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuU1RBVFMpLCBuZXdMZXZlbCk7CisgICAgICAgICAgICBsb2dnZXIudHJhY2UoIk11dGF0aW5nIHt9IHRvIGxldmVsIHt9IiwgZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuU1RBVFMpLCBuZXdMZXZlbCk7CiAKICAgICAgICAgbXV0YXRlKGRlc2NyaXB0b3IsIHN0YXRzIC0+IHN0YXRzLm11dGF0ZUxldmVsKG5ld0xldmVsKSk7CiAgICAgfQpAQCAtMjQxLDcgKzI0OSw3IEBACiAgICAgewogICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCiAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIk11dGF0aW5nIHt9IHRvIHJlcGFpcmVkQXQgdGltZSB7fSBhbmQgcGVuZGluZ1JlcGFpciB7fSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuU1RBVFMpLCBuZXdSZXBhaXJlZEF0LCBuZXdQZW5kaW5nUmVwYWlyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5TVEFUUyksIG5ld1JlcGFpcmVkQXQsIG5ld1BlbmRpbmdSZXBhaXIpOwogCiAgICAgICAgIG11dGF0ZShkZXNjcmlwdG9yLCBzdGF0cyAtPiBzdGF0cy5tdXRhdGVSZXBhaXJlZE1ldGFkYXRhKG5ld1JlcGFpcmVkQXQsIG5ld1BlbmRpbmdSZXBhaXIsIGlzVHJhbnNpZW50KSk7CiAgICAgfQpAQCAtMjU3LDggKzI2NSw4IEBACiAKICAgICBwdWJsaWMgdm9pZCByZXdyaXRlU1NUYWJsZU1ldGFkYXRhKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgTWFwPE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFDb21wb25lbnQ+IGN1cnJlbnRDb21wb25lbnRzKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IGRlc2NyaXB0b3IudG1wRmlsZW5hbWVGb3IoQ29tcG9uZW50LlNUQVRTKTsKLSAgICAgICAgdHJ5IChEYXRhT3V0cHV0U3RyZWFtUGx1cyBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbVBsdXMoZmlsZVBhdGgpKQorICAgICAgICBGaWxlIGZpbGUgPSBkZXNjcmlwdG9yLnRtcEZpbGVGb3IoQ29tcG9uZW50cy5TVEFUUyk7CisgICAgICAgIHRyeSAoRGF0YU91dHB1dFN0cmVhbVBsdXMgb3V0ID0gZmlsZS5uZXdPdXRwdXRTdHJlYW0oRmlsZS5Xcml0ZU1vZGUuT1ZFUldSSVRFKSkKICAgICAgICAgewogICAgICAgICAgICAgc2VyaWFsaXplKGN1cnJlbnRDb21wb25lbnRzLCBvdXQsIGRlc2NyaXB0b3IudmVyc2lvbik7CiAgICAgICAgICAgICBvdXQuZmx1c2goKTsKQEAgLTI2Niw4ICsyNzQsOCBAQAogICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKICAgICAgICAgewogICAgICAgICAgICAgVGhyb3dhYmxlcy50aHJvd0lmSW5zdGFuY2VPZihlLCBGaWxlTm90Rm91bmRFeGNlcHRpb24uY2xhc3MpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEZTV3JpdGVFcnJvcihlLCBmaWxlUGF0aCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgRlNXcml0ZUVycm9yKGUsIGZpbGUpOwogICAgICAgICB9Ci0gICAgICAgIEZpbGVVdGlscy5yZW5hbWVXaXRoQ29uZmlybShmaWxlUGF0aCwgZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuU1RBVFMpKTsKKyAgICAgICAgZmlsZS5tb3ZlKGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlNUQVRTKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9tZXRhZGF0YS9TdGF0c01ldGFkYXRhLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL21ldGFkYXRhL1N0YXRzTWV0YWRhdGEuamF2YQppbmRleCBlZTU1MDVmLi5kYjgwNzZkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL21ldGFkYXRhL1N0YXRzTWV0YWRhdGEuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL21ldGFkYXRhL1N0YXRzTWV0YWRhdGEuamF2YQpAQCAtMTksMjggKzE5LDM0IEBACiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5BcnJheVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLkVxdWFsc0J1aWxkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuSGFzaENvZGVCdWlsZGVyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkVuY29kaW5nU3RhdHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQnVmZmVyQ2x1c3RlcmluZ0JvdW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdCb3VuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbGljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5UeXBlU2l6ZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZ1Bvc2l0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZy5JbnRlcnZhbFNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5FbmNvZGluZ1N0YXRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLklTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuQWJzdHJhY3RUeXBlU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Fc3RpbWF0ZWRIaXN0b2dyYW07CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuc3RyZWFtaGlzdC5Ub21ic3RvbmVIaXN0b2dyYW07CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVVVJRFNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuc3RyZWFtaGlzdC5Ub21ic3RvbmVIaXN0b2dyYW07CiAKIC8qKgogICogU1NUYWJsZSBtZXRhZGF0YSB0aGF0IGFsd2F5cyBzdGF5IG9uIGhlYXAuCkBAIC02Miw4ICs2OCw3IEBACiAgICAgcHVibGljIGZpbmFsIGRvdWJsZSBjb21wcmVzc2lvblJhdGlvOwogICAgIHB1YmxpYyBmaW5hbCBUb21ic3RvbmVIaXN0b2dyYW0gZXN0aW1hdGVkVG9tYnN0b25lRHJvcFRpbWU7CiAgICAgcHVibGljIGZpbmFsIGludCBzc3RhYmxlTGV2ZWw7Ci0gICAgcHVibGljIGZpbmFsIExpc3Q8Qnl0ZUJ1ZmZlcj4gbWluQ2x1c3RlcmluZ1ZhbHVlczsKLSAgICBwdWJsaWMgZmluYWwgTGlzdDxCeXRlQnVmZmVyPiBtYXhDbHVzdGVyaW5nVmFsdWVzOworICAgIHB1YmxpYyBmaW5hbCBTbGljZSBjb3ZlcmVkQ2x1c3RlcmluZzsKICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNMZWdhY3lDb3VudGVyU2hhcmRzOwogICAgIHB1YmxpYyBmaW5hbCBsb25nIHJlcGFpcmVkQXQ7CiAgICAgcHVibGljIGZpbmFsIGxvbmcgdG90YWxDb2x1bW5zU2V0OwpAQCAtNzQsNiArNzksMjMgQEAKICAgICAvLyBqdXN0IGhvbGRzIHRoZSBjdXJyZW50IGVuY29kaW5nIHN0YXRzIHRvIGF2b2lkIGFsbG9jYXRpbmcgLSBpdCBpcyBub3Qgc2VyaWFsaXplZAogICAgIHB1YmxpYyBmaW5hbCBFbmNvZGluZ1N0YXRzIGVuY29kaW5nU3RhdHM7CiAKKyAgICAvLyBVc2VkIHRvIHNlcmlhbGl6ZSBtaW4vbWF4IGNsdXN0ZXJpbmcuIENhbiBiZSBudWxsIGlmIHRoZSBtZXRhZGF0YSB3YXMgZGVzZXJpYWxpemVkIGZyb20gYSBsZWdhY3kgdmVyc2lvbgorICAgIHByaXZhdGUgZmluYWwgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGNsdXN0ZXJpbmdUeXBlczsKKworICAgIC8qKgorICAgICAqIFRoaXMgYm9vbGVhbiBpcyB1c2VkIGFzIGFuIGFwcHJveGltYXRpb24gb2Ygd2hldGhlciBhIGdpdmVuIGtleSBjYW4gYmUgZ3VhcmFudGVlZCBub3QgdG8gaGF2ZSBwYXJ0aXRpb24KKyAgICAgKiBkZWxldGlvbnMgaW4gdGhpcyBzc3RhYmxlLiBPYnZpb3VzbHksIHRoaXMgaXMgcHJldHR5IGltcHJlY2lzZTogYSBzaW5nbGUgcGFydGl0aW9uIGRlbGV0aW9uIGluIHRoZSBzc3RhYmxlCisgICAgICogbWVhbnMgd2UgaGF2ZSB0byBhc3N1bWUgX2FueV8ga2V5IG1heSBoYXZlIGEgcGFydGl0aW9uIGRlbGV0aW9uLiBUaGlzIGlzIHN0aWxsIGxpa2VseSB1c2VmdWwgYXMgd29ya2xvYWRzIHRoYXQKKyAgICAgKiBkb2VzIG5vdCB1c2UgcGFydGl0aW9uIGxldmVsIGRlbGV0aW9ucywgb3Igb25seSB2ZXJ5IHJhcmVseSwgYXJlIHByb2JhYmx5IG5vdCB0aGF0IHJhcmUuCisgICAgICogVE9ETyB3ZSBjb3VsZCByZXBsYWNlIHRoaXMgYnkgYSBzbWFsbCBibG9vbS1maWx0ZXIgaW5zdGVhZDsgdGhlIG9ubHkgZG93bnNpZGUgYmVpbmcgdGhhdCB3ZSdkIGhhdmUgdG8gY2FyZSBhYm91dAorICAgICAqICB0aGUgc2l6ZSBvZiB0aGlzIGJsb29tIGZpbHRlcnMgbm90IGdldHRpbmcgb3V0IG9mIGhhbmRzLCBhbmQgaXQncyBhIHRpbnkgYml0IHVuY2xlYXIgaWYgaXQncyB3b3J0aCB0aGUgYWRkZWQKKyAgICAgKiAgY29tcGxleGl0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNQYXJ0aXRpb25MZXZlbERlbGV0aW9uczsKKworICAgIHB1YmxpYyBmaW5hbCBCeXRlQnVmZmVyIGZpcnN0S2V5OworICAgIHB1YmxpYyBmaW5hbCBCeXRlQnVmZmVyIGxhc3RLZXk7CisKICAgICBwdWJsaWMgU3RhdHNNZXRhZGF0YShFc3RpbWF0ZWRIaXN0b2dyYW0gZXN0aW1hdGVkUGFydGl0aW9uU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBFc3RpbWF0ZWRIaXN0b2dyYW0gZXN0aW1hdGVkQ2VsbFBlclBhcnRpdGlvbkNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgIEludGVydmFsU2V0PENvbW1pdExvZ1Bvc2l0aW9uPiBjb21taXRMb2dJbnRlcnZhbHMsCkBAIC04NiwxNSArMTA4LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGNvbXByZXNzaW9uUmF0aW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgVG9tYnN0b25lSGlzdG9ncmFtIGVzdGltYXRlZFRvbWJzdG9uZURyb3BUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzc3RhYmxlTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBtaW5DbHVzdGVyaW5nVmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gbWF4Q2x1c3RlcmluZ1ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gY2x1c3RlcmluZ1R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNsaWNlIGNvdmVyZWRDbHVzdGVyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzTGVnYWN5Q291bnRlclNoYXJkcywKICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHJlcGFpcmVkQXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB0b3RhbENvbHVtbnNTZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB0b3RhbFJvd3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgVVVJRCBvcmlnaW5hdGluZ0hvc3RJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVVVJRCBwZW5kaW5nUmVwYWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNUcmFuc2llbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1RyYW5zaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgZmlyc3RLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBsYXN0S2V5KQogICAgIHsKICAgICAgICAgdGhpcy5lc3RpbWF0ZWRQYXJ0aXRpb25TaXplID0gZXN0aW1hdGVkUGFydGl0aW9uU2l6ZTsKICAgICAgICAgdGhpcy5lc3RpbWF0ZWRDZWxsUGVyUGFydGl0aW9uQ291bnQgPSBlc3RpbWF0ZWRDZWxsUGVyUGFydGl0aW9uQ291bnQ7CkBAIC0xMDgsOCArMTMzLDggQEAKICAgICAgICAgdGhpcy5jb21wcmVzc2lvblJhdGlvID0gY29tcHJlc3Npb25SYXRpbzsKICAgICAgICAgdGhpcy5lc3RpbWF0ZWRUb21ic3RvbmVEcm9wVGltZSA9IGVzdGltYXRlZFRvbWJzdG9uZURyb3BUaW1lOwogICAgICAgICB0aGlzLnNzdGFibGVMZXZlbCA9IHNzdGFibGVMZXZlbDsKLSAgICAgICAgdGhpcy5taW5DbHVzdGVyaW5nVmFsdWVzID0gbWluQ2x1c3RlcmluZ1ZhbHVlczsKLSAgICAgICAgdGhpcy5tYXhDbHVzdGVyaW5nVmFsdWVzID0gbWF4Q2x1c3RlcmluZ1ZhbHVlczsKKyAgICAgICAgdGhpcy5jbHVzdGVyaW5nVHlwZXMgPSBjbHVzdGVyaW5nVHlwZXM7CisgICAgICAgIHRoaXMuY292ZXJlZENsdXN0ZXJpbmcgPSBjb3ZlcmVkQ2x1c3RlcmluZzsKICAgICAgICAgdGhpcy5oYXNMZWdhY3lDb3VudGVyU2hhcmRzID0gaGFzTGVnYWN5Q291bnRlclNoYXJkczsKICAgICAgICAgdGhpcy5yZXBhaXJlZEF0ID0gcmVwYWlyZWRBdDsKICAgICAgICAgdGhpcy50b3RhbENvbHVtbnNTZXQgPSB0b3RhbENvbHVtbnNTZXQ7CkBAIC0xMTgsNiArMTQzLDkgQEAKICAgICAgICAgdGhpcy5wZW5kaW5nUmVwYWlyID0gcGVuZGluZ1JlcGFpcjsKICAgICAgICAgdGhpcy5pc1RyYW5zaWVudCA9IGlzVHJhbnNpZW50OwogICAgICAgICB0aGlzLmVuY29kaW5nU3RhdHMgPSBuZXcgRW5jb2RpbmdTdGF0cyhtaW5UaW1lc3RhbXAsIG1pbkxvY2FsRGVsZXRpb25UaW1lLCBtaW5UVEwpOworICAgICAgICB0aGlzLmhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25zID0gaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnM7CisgICAgICAgIHRoaXMuZmlyc3RLZXkgPSBmaXJzdEtleTsKKyAgICAgICAgdGhpcy5sYXN0S2V5ID0gbGFzdEtleTsKICAgICB9CiAKICAgICBwdWJsaWMgTWV0YWRhdGFUeXBlIGdldFR5cGUoKQpAQCAtMTYzLDE1ICsxOTEsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uUmF0aW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZWRUb21ic3RvbmVEcm9wVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluQ2x1c3RlcmluZ1ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heENsdXN0ZXJpbmdWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyaW5nVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmVkQ2x1c3RlcmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0xlZ2FjeUNvdW50ZXJTaGFyZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBhaXJlZEF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxDb2x1bW5zU2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxSb3dzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYXRpbmdIb3N0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nUmVwYWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUcmFuc2llbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUcmFuc2llbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQYXJ0aXRpb25MZXZlbERlbGV0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0S2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEtleSk7CiAgICAgfQogCiAgICAgcHVibGljIFN0YXRzTWV0YWRhdGEgbXV0YXRlUmVwYWlyZWRNZXRhZGF0YShsb25nIG5ld1JlcGFpcmVkQXQsIFRpbWVVVUlEIG5ld1BlbmRpbmdSZXBhaXIsIGJvb2xlYW4gbmV3SXNUcmFuc2llbnQpCkBAIC0xODgsMTUgKzIxOSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25SYXRpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzdGltYXRlZFRvbWJzdG9uZURyb3BUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZUxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluQ2x1c3RlcmluZ1ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heENsdXN0ZXJpbmdWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyaW5nVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmVkQ2x1c3RlcmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0xlZ2FjeUNvdW50ZXJTaGFyZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdSZXBhaXJlZEF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxDb2x1bW5zU2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxSb3dzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYXRpbmdIb3N0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQZW5kaW5nUmVwYWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SXNUcmFuc2llbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SXNUcmFuc2llbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQYXJ0aXRpb25MZXZlbERlbGV0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0S2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEtleSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0yMjAsMTMgKzI1NCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGVzdGltYXRlZFRvbWJzdG9uZURyb3BUaW1lLCB0aGF0LmVzdGltYXRlZFRvbWJzdG9uZURyb3BUaW1lKQogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHNzdGFibGVMZXZlbCwgdGhhdC5zc3RhYmxlTGV2ZWwpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQocmVwYWlyZWRBdCwgdGhhdC5yZXBhaXJlZEF0KQotICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG1heENsdXN0ZXJpbmdWYWx1ZXMsIHRoYXQubWF4Q2x1c3RlcmluZ1ZhbHVlcykKLSAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChtaW5DbHVzdGVyaW5nVmFsdWVzLCB0aGF0Lm1pbkNsdXN0ZXJpbmdWYWx1ZXMpCisgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoY292ZXJlZENsdXN0ZXJpbmcsIHRoYXQuY292ZXJlZENsdXN0ZXJpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoaGFzTGVnYWN5Q291bnRlclNoYXJkcywgdGhhdC5oYXNMZWdhY3lDb3VudGVyU2hhcmRzKQogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHRvdGFsQ29sdW1uc1NldCwgdGhhdC50b3RhbENvbHVtbnNTZXQpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQodG90YWxSb3dzLCB0aGF0LnRvdGFsUm93cykKICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChvcmlnaW5hdGluZ0hvc3RJZCwgdGhhdC5vcmlnaW5hdGluZ0hvc3RJZCkKICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChwZW5kaW5nUmVwYWlyLCB0aGF0LnBlbmRpbmdSZXBhaXIpCisgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnMsIHRoYXQuaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnMpCisgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZmlyc3RLZXksIHRoYXQuZmlyc3RLZXkpCisgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobGFzdEtleSwgdGhhdC5sYXN0S2V5KQogICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKICAgICB9CiAKQEAgLTI0NywxMyArMjgzLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZXN0aW1hdGVkVG9tYnN0b25lRHJvcFRpbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoc3N0YWJsZUxldmVsKQogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHJlcGFpcmVkQXQpCi0gICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobWF4Q2x1c3RlcmluZ1ZhbHVlcykKLSAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChtaW5DbHVzdGVyaW5nVmFsdWVzKQorICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGNvdmVyZWRDbHVzdGVyaW5nKQogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGhhc0xlZ2FjeUNvdW50ZXJTaGFyZHMpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQodG90YWxDb2x1bW5zU2V0KQogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHRvdGFsUm93cykKICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChvcmlnaW5hdGluZ0hvc3RJZCkKICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChwZW5kaW5nUmVwYWlyKQorICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25zKQorICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGZpcnN0S2V5KQorICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGxhc3RLZXkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwogICAgIH0KIApAQCAtMjYxLDYgKzI5OSw4IEBACiAgICAgewogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU3RhdHNNZXRhZGF0YVNlcmlhbGl6ZXIuY2xhc3MpOwogCisgICAgICAgIHByaXZhdGUgZmluYWwgQWJzdHJhY3RUeXBlU2VyaWFsaXplciB0eXBlU2VyaWFsaXplciA9IG5ldyBBYnN0cmFjdFR5cGVTZXJpYWxpemVyKCk7CisKICAgICAgICAgcHVibGljIGludCBzZXJpYWxpemVkU2l6ZShWZXJzaW9uIHZlcnNpb24sIFN0YXRzTWV0YWRhdGEgY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgaW50IHNpemUgPSAwOwpAQCAtMjcwLDE0ICszMTAsMjMgQEAKICAgICAgICAgICAgIHNpemUgKz0gOCArIDggKyA0ICsgNCArIDQgKyA0ICsgOCArIDg7IC8vIG1peC9tYXggdGltZXN0YW1wKGxvbmcpLCBtaW4vbWF4TG9jYWxEZWxldGlvblRpbWUoaW50KSwgbWluL21heCBUVEwsIGNvbXByZXNzaW9uUmF0aW8oZG91YmxlKSwgcmVwYWlyZWRBdCAobG9uZykKICAgICAgICAgICAgIHNpemUgKz0gVG9tYnN0b25lSGlzdG9ncmFtLnNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoY29tcG9uZW50LmVzdGltYXRlZFRvbWJzdG9uZURyb3BUaW1lKTsKICAgICAgICAgICAgIHNpemUgKz0gVHlwZVNpemVzLnNpemVvZihjb21wb25lbnQuc3N0YWJsZUxldmVsKTsKLSAgICAgICAgICAgIC8vIG1pbiBjb2x1bW4gbmFtZXMKLSAgICAgICAgICAgIHNpemUgKz0gNDsKLSAgICAgICAgICAgIGZvciAoQnl0ZUJ1ZmZlciB2YWx1ZSA6IGNvbXBvbmVudC5taW5DbHVzdGVyaW5nVmFsdWVzKQotICAgICAgICAgICAgICAgIHNpemUgKz0gMiArIHZhbHVlLnJlbWFpbmluZygpOyAvLyB3aXRoIHNob3J0IGxlbmd0aAotICAgICAgICAgICAgLy8gbWF4IGNvbHVtbiBuYW1lcwotICAgICAgICAgICAgc2l6ZSArPSA0OwotICAgICAgICAgICAgZm9yIChCeXRlQnVmZmVyIHZhbHVlIDogY29tcG9uZW50Lm1heENsdXN0ZXJpbmdWYWx1ZXMpCi0gICAgICAgICAgICAgICAgc2l6ZSArPSAyICsgdmFsdWUucmVtYWluaW5nKCk7IC8vIHdpdGggc2hvcnQgbGVuZ3RoCisKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uLmhhc0xlZ2FjeU1pbk1heCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG1pbiBjb2x1bW4gbmFtZXMKKyAgICAgICAgICAgICAgICBzaXplICs9IDQ7CisgICAgICAgICAgICAgICAgQ2x1c3RlcmluZ0JvdW5kPD8+IG1pbkNsdXN0ZXJpbmdWYWx1ZXMgPSBjb21wb25lbnQuY292ZXJlZENsdXN0ZXJpbmcuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBzaXplICs9IG1pbkNsdXN0ZXJpbmdWYWx1ZXMuc2l6ZSgpICogMiAvKiBzaG9ydCBsZW5ndGggKi8gKyBtaW5DbHVzdGVyaW5nVmFsdWVzLmRhdGFTaXplKCk7CisgICAgICAgICAgICAgICAgLy8gbWF4IGNvbHVtbiBuYW1lcworICAgICAgICAgICAgICAgIHNpemUgKz0gNDsKKyAgICAgICAgICAgICAgICBDbHVzdGVyaW5nQm91bmQ8Pz4gbWF4Q2x1c3RlcmluZ1ZhbHVlcyA9IGNvbXBvbmVudC5jb3ZlcmVkQ2x1c3RlcmluZy5lbmQoKTsKKyAgICAgICAgICAgICAgICBzaXplICs9IG1heENsdXN0ZXJpbmdWYWx1ZXMuc2l6ZSgpICogMiAvKiBzaG9ydCBsZW5ndGggKi8gKyBtYXhDbHVzdGVyaW5nVmFsdWVzLmRhdGFTaXplKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh2ZXJzaW9uLmhhc0ltcHJvdmVkTWluTWF4KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2l6ZSA9IGltcHJvdmVkTWluTWF4U2l6ZSh2ZXJzaW9uLCBjb21wb25lbnQsIHNpemUpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBzaXplICs9IFR5cGVTaXplcy5zaXplb2YoY29tcG9uZW50Lmhhc0xlZ2FjeUNvdW50ZXJTaGFyZHMpOwogICAgICAgICAgICAgc2l6ZSArPSA4ICsgODsgLy8gdG90YWxDb2x1bW5zU2V0LCB0b3RhbFJvd3MKICAgICAgICAgICAgIGlmICh2ZXJzaW9uLmhhc0NvbW1pdExvZ0xvd2VyQm91bmQoKSkKQEAgLTMwNCw2ICszNTMsMzEgQEAKICAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSBVVUlEU2VyaWFsaXplci5zZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKGNvbXBvbmVudC5vcmlnaW5hdGluZ0hvc3RJZCwgdmVyc2lvbi5jb3JyZXNwb25kaW5nTWVzc2FnaW5nVmVyc2lvbigpKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKHZlcnNpb24uaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnNQcmVzZW5jZU1hcmtlcigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpemUgKz0gVHlwZVNpemVzLnNpemVvZihjb21wb25lbnQuaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodmVyc2lvbi5oYXNJbXByb3ZlZE1pbk1heCgpICYmIHZlcnNpb24uaGFzTGVnYWN5TWluTWF4KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2l6ZSA9IGltcHJvdmVkTWluTWF4U2l6ZSh2ZXJzaW9uLCBjb21wb25lbnQsIHNpemUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodmVyc2lvbi5oYXNLZXlSYW5nZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpemUgKz0gQnl0ZUJ1ZmZlclV0aWwuc2VyaWFsaXplZFNpemVXaXRoVkludExlbmd0aChjb21wb25lbnQuZmlyc3RLZXkpOworICAgICAgICAgICAgICAgIHNpemUgKz0gQnl0ZUJ1ZmZlclV0aWwuc2VyaWFsaXplZFNpemVXaXRoVkludExlbmd0aChjb21wb25lbnQubGFzdEtleSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgaW1wcm92ZWRNaW5NYXhTaXplKFZlcnNpb24gdmVyc2lvbiwgU3RhdHNNZXRhZGF0YSBjb21wb25lbnQsIGludCBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplICs9IHR5cGVTZXJpYWxpemVyLnNlcmlhbGl6ZWRMaXN0U2l6ZShjb21wb25lbnQuY2x1c3RlcmluZ1R5cGVzKTsKKyAgICAgICAgICAgIHNpemUgKz0gU2xpY2Uuc2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShjb21wb25lbnQuY292ZXJlZENsdXN0ZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi5jb3JyZXNwb25kaW5nTWVzc2FnaW5nVmVyc2lvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5jbHVzdGVyaW5nVHlwZXMpOwogICAgICAgICAgICAgcmV0dXJuIHNpemU7CiAgICAgICAgIH0KIApAQCAtMzIyLDEyICszOTYsMzEgQEAKICAgICAgICAgICAgIFRvbWJzdG9uZUhpc3RvZ3JhbS5zZXJpYWxpemVyLnNlcmlhbGl6ZShjb21wb25lbnQuZXN0aW1hdGVkVG9tYnN0b25lRHJvcFRpbWUsIG91dCk7CiAgICAgICAgICAgICBvdXQud3JpdGVJbnQoY29tcG9uZW50LnNzdGFibGVMZXZlbCk7CiAgICAgICAgICAgICBvdXQud3JpdGVMb25nKGNvbXBvbmVudC5yZXBhaXJlZEF0KTsKLSAgICAgICAgICAgIG91dC53cml0ZUludChjb21wb25lbnQubWluQ2x1c3RlcmluZ1ZhbHVlcy5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChCeXRlQnVmZmVyIHZhbHVlIDogY29tcG9uZW50Lm1pbkNsdXN0ZXJpbmdWYWx1ZXMpCi0gICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVXaXRoU2hvcnRMZW5ndGgodmFsdWUsIG91dCk7Ci0gICAgICAgICAgICBvdXQud3JpdGVJbnQoY29tcG9uZW50Lm1heENsdXN0ZXJpbmdWYWx1ZXMuc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoQnl0ZUJ1ZmZlciB2YWx1ZSA6IGNvbXBvbmVudC5tYXhDbHVzdGVyaW5nVmFsdWVzKQotICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLndyaXRlV2l0aFNob3J0TGVuZ3RoKHZhbHVlLCBvdXQpOworCisgICAgICAgICAgICBpZiAodmVyc2lvbi5oYXNMZWdhY3lNaW5NYXgoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbHVzdGVyaW5nQm91bmQ8Pz4gbWluQ2x1c3RlcmluZ1ZhbHVlcyA9IGNvbXBvbmVudC5jb3ZlcmVkQ2x1c3RlcmluZy5zdGFydCgpOworICAgICAgICAgICAgICAgIG91dC53cml0ZUludChjb3VudFVudGlsTnVsbChtaW5DbHVzdGVyaW5nVmFsdWVzLmdldEJ1ZmZlckFycmF5KCkpKTsKKyAgICAgICAgICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgdmFsdWUgOiBtaW5DbHVzdGVyaW5nVmFsdWVzLmdldEJ1ZmZlckFycmF5KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC53cml0ZVdpdGhTaG9ydExlbmd0aCh2YWx1ZSwgb3V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ2x1c3RlcmluZ0JvdW5kPD8+IG1heENsdXN0ZXJpbmdWYWx1ZXMgPSBjb21wb25lbnQuY292ZXJlZENsdXN0ZXJpbmcuZW5kKCk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlSW50KGNvdW50VW50aWxOdWxsKG1heENsdXN0ZXJpbmdWYWx1ZXMuZ2V0QnVmZmVyQXJyYXkoKSkpOworICAgICAgICAgICAgICAgIGZvciAoQnl0ZUJ1ZmZlciB2YWx1ZSA6IG1heENsdXN0ZXJpbmdWYWx1ZXMuZ2V0QnVmZmVyQXJyYXkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLndyaXRlV2l0aFNob3J0TGVuZ3RoKHZhbHVlLCBvdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHZlcnNpb24uaGFzSW1wcm92ZWRNaW5NYXgoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVJbXByb3ZlZE1pbk1heCh2ZXJzaW9uLCBjb21wb25lbnQsIG91dCk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oY29tcG9uZW50Lmhhc0xlZ2FjeUNvdW50ZXJTaGFyZHMpOwogCiAgICAgICAgICAgICBvdXQud3JpdGVMb25nKGNvbXBvbmVudC50b3RhbENvbHVtbnNTZXQpOwpAQCAtMzY4LDYgKzQ2MSwzMiBAQAogICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVCeXRlKDApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHZlcnNpb24uaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnNQcmVzZW5jZU1hcmtlcigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oY29tcG9uZW50Lmhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25zKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHZlcnNpb24uaGFzSW1wcm92ZWRNaW5NYXgoKSAmJiB2ZXJzaW9uLmhhc0xlZ2FjeU1pbk1heCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUltcHJvdmVkTWluTWF4KHZlcnNpb24sIGNvbXBvbmVudCwgb3V0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHZlcnNpb24uaGFzS2V5UmFuZ2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC53cml0ZVdpdGhWSW50TGVuZ3RoKGNvbXBvbmVudC5maXJzdEtleSwgb3V0KTsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC53cml0ZVdpdGhWSW50TGVuZ3RoKGNvbXBvbmVudC5sYXN0S2V5LCBvdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHNlcmlhbGl6ZUltcHJvdmVkTWluTWF4KFZlcnNpb24gdmVyc2lvbiwgU3RhdHNNZXRhZGF0YSBjb21wb25lbnQsIERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBjb21wb25lbnQuY2x1c3RlcmluZ1R5cGVzICE9IG51bGw7CisgICAgICAgICAgICB0eXBlU2VyaWFsaXplci5zZXJpYWxpemVMaXN0KGNvbXBvbmVudC5jbHVzdGVyaW5nVHlwZXMsIG91dCk7CisgICAgICAgICAgICBTbGljZS5zZXJpYWxpemVyLnNlcmlhbGl6ZShjb21wb25lbnQuY292ZXJlZENsdXN0ZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLmNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuY2x1c3RlcmluZ1R5cGVzKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBTdGF0c01ldGFkYXRhIGRlc2VyaWFsaXplKFZlcnNpb24gdmVyc2lvbiwgRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCkBAIC00MDcsMjQgKzUyNiwzMSBAQAogICAgICAgICAgICAgaW50IHNzdGFibGVMZXZlbCA9IGluLnJlYWRJbnQoKTsKICAgICAgICAgICAgIGxvbmcgcmVwYWlyZWRBdCA9IGluLnJlYWRMb25nKCk7CiAKLSAgICAgICAgICAgIC8vIGZvciBsZWdhY3kgc3N0YWJsZXMsIHdlIHNraXAgZGVzZXJpYWxpemluZyB0aGUgbWluIGFuZCBtYXggY2x1c3RlcmluZyB2YWx1ZQotICAgICAgICAgICAgLy8gdG8gcHJldmVudCBlcnJvbmVvdXNseSBleGNsdWRpbmcgc3N0YWJsZXMgZnJvbSByZWFkcyAoc2VlIENBU1NBTkRSQS0xNDg2MSkKLSAgICAgICAgICAgIGludCBjb2xDb3VudCA9IGluLnJlYWRJbnQoKTsKLSAgICAgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gbWluQ2x1c3RlcmluZ1ZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8Pihjb2xDb3VudCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbENvdW50OyBpKyspCisgICAgICAgICAgICBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gY2x1c3RlcmluZ1R5cGVzID0gbnVsbDsKKyAgICAgICAgICAgIFNsaWNlIGNvdmVyZWRDbHVzdGVyaW5nID0gU2xpY2UuQUxMOworICAgICAgICAgICAgaWYgKHZlcnNpb24uaGFzTGVnYWN5TWluTWF4KCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciB2YWwgPSBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGluKTsKLSAgICAgICAgICAgICAgICBpZiAodmVyc2lvbi5oYXNBY2N1cmF0ZU1pbk1heCgpKQotICAgICAgICAgICAgICAgICAgICBtaW5DbHVzdGVyaW5nVmFsdWVzLmFkZCh2YWwpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFdlIGFsd2F5cyBkZXNlcmlhbGl6ZSB0aGUgbWluL21heCBjbHVzdGVyaW5nIHZhbHVlcyBpZiB0aGV5IGFyZSB0aGVyZSwgYnV0IHdlIGlnbm9yZSB0aGVtIGZvcgorICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBzc3RhYmxlcyB3aGVyZSAhaGFzQWNjdXJhdGVNaW5NYXggZHVlIHRvIENBU1NBTkRSQS0xNDg2MS4KKyAgICAgICAgICAgICAgICBpbnQgY29sQ291bnQgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlcltdIG1pbkNsdXN0ZXJpbmdWYWx1ZXMgPSBuZXcgQnl0ZUJ1ZmZlcltjb2xDb3VudF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xDb3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBtaW5DbHVzdGVyaW5nVmFsdWVzW2ldID0gQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChpbik7CiAKLSAgICAgICAgICAgIGNvbENvdW50ID0gaW4ucmVhZEludCgpOwotICAgICAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBtYXhDbHVzdGVyaW5nVmFsdWVzID0gbmV3IEFycmF5TGlzdDw+KGNvbENvdW50KTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sQ291bnQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHZhbCA9IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoaW4pOworICAgICAgICAgICAgICAgIGNvbENvdW50ID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJbXSBtYXhDbHVzdGVyaW5nVmFsdWVzID0gbmV3IEJ5dGVCdWZmZXJbY29sQ291bnRdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgbWF4Q2x1c3RlcmluZ1ZhbHVlc1tpXSA9IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoaW4pOworCiAgICAgICAgICAgICAgICAgaWYgKHZlcnNpb24uaGFzQWNjdXJhdGVNaW5NYXgoKSkKLSAgICAgICAgICAgICAgICAgICAgbWF4Q2x1c3RlcmluZ1ZhbHVlcy5hZGQodmFsKTsKKyAgICAgICAgICAgICAgICAgICAgY292ZXJlZENsdXN0ZXJpbmcgPSBTbGljZS5tYWtlKEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZC5pbmNsdXNpdmVTdGFydE9mKG1pbkNsdXN0ZXJpbmdWYWx1ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyQ2x1c3RlcmluZ0JvdW5kLmluY2x1c2l2ZUVuZE9mKG1heENsdXN0ZXJpbmdWYWx1ZXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHZlcnNpb24uaGFzSW1wcm92ZWRNaW5NYXgoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBpbXByb3ZlZE1pbk1heCB3aWxsIGJlIGluIHRoaXMgcGxhY2Ugd2hlbiBsZWdhY3lNaW5NYXggaXMgcmVtb3ZlZAorICAgICAgICAgICAgICAgIGNsdXN0ZXJpbmdUeXBlcyA9IHR5cGVTZXJpYWxpemVyLmRlc2VyaWFsaXplTGlzdChpbik7CisgICAgICAgICAgICAgICAgY292ZXJlZENsdXN0ZXJpbmcgPSBTbGljZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCB2ZXJzaW9uLmNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uKCksIGNsdXN0ZXJpbmdUeXBlcyk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJvb2xlYW4gaGFzTGVnYWN5Q291bnRlclNoYXJkcyA9IGluLnJlYWRCb29sZWFuKCk7CkBAIC00MzgsNyArNTY0LDcgQEAKICAgICAgICAgICAgIGlmICh2ZXJzaW9uLmhhc0NvbW1pdExvZ0ludGVydmFscygpKQogICAgICAgICAgICAgICAgIGNvbW1pdExvZ0ludGVydmFscyA9IGNvbW1pdExvZ1Bvc2l0aW9uU2V0U2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbik7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY29tbWl0TG9nSW50ZXJ2YWxzID0gbmV3IEludGVydmFsU2V0PENvbW1pdExvZ1Bvc2l0aW9uPihjb21taXRMb2dMb3dlckJvdW5kLCBjb21taXRMb2dVcHBlckJvdW5kKTsKKyAgICAgICAgICAgICAgICBjb21taXRMb2dJbnRlcnZhbHMgPSBuZXcgSW50ZXJ2YWxTZXQ8Pihjb21taXRMb2dMb3dlckJvdW5kLCBjb21taXRMb2dVcHBlckJvdW5kKTsKIAogICAgICAgICAgICAgVGltZVVVSUQgcGVuZGluZ1JlcGFpciA9IG51bGw7CiAgICAgICAgICAgICBpZiAodmVyc2lvbi5oYXNQZW5kaW5nUmVwYWlyKCkgJiYgaW4ucmVhZEJ5dGUoKSAhPSAwKQpAQCAtNDUyLDYgKzU3OCwyOSBAQAogICAgICAgICAgICAgaWYgKHZlcnNpb24uaGFzT3JpZ2luYXRpbmdIb3N0SWQoKSAmJiBpbi5yZWFkQnl0ZSgpICE9IDApCiAgICAgICAgICAgICAgICAgb3JpZ2luYXRpbmdIb3N0SWQgPSBVVUlEU2VyaWFsaXplci5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCAwKTsKIAorICAgICAgICAgICAgLy8gSWYgbm90IHJlY29yZGVkLCB0aGUgb25seSB0aW1lIHdlIGNhbiBndWFyYW50ZWUgdGhlcmUgaXMgbm8gcGFydGl0aW9uIGxldmVsIGRlbGV0aW9uIGlzIGlmIHRoZXJlIGlzIG5vCisgICAgICAgICAgICAvLyBkZWxldGlvbiBhdCBhbGwuIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBhc3N1bWUgdGhlcmUgbWF5IGJlIHNvbWUuCisgICAgICAgICAgICBib29sZWFuIGhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25zID0gbWluTG9jYWxEZWxldGlvblRpbWUgIT0gQ2VsbC5OT19ERUxFVElPTl9USU1FOworICAgICAgICAgICAgaWYgKHZlcnNpb24uaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnNQcmVzZW5jZU1hcmtlcigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25zID0gaW4ucmVhZEJvb2xlYW4oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHZlcnNpb24uaGFzSW1wcm92ZWRNaW5NYXgoKSAmJiB2ZXJzaW9uLmhhc0xlZ2FjeU1pbk1heCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGltcHJvdmVkTWluTWF4IHdpbGwgYmUgaW4gdGhpcyBwbGFjZSB1bnRpbCBsZWdhY3lNaW5NYXggaXMgcmVtb3ZlZAorICAgICAgICAgICAgICAgIGNsdXN0ZXJpbmdUeXBlcyA9IHR5cGVTZXJpYWxpemVyLmRlc2VyaWFsaXplTGlzdChpbik7CisgICAgICAgICAgICAgICAgY292ZXJlZENsdXN0ZXJpbmcgPSBTbGljZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCB2ZXJzaW9uLmNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uKCksIGNsdXN0ZXJpbmdUeXBlcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgZmlyc3RLZXkgPSBudWxsOworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBsYXN0S2V5ID0gbnVsbDsKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uLmhhc0tleVJhbmdlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlyc3RLZXkgPSBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFZJbnRMZW5ndGgoaW4pOworICAgICAgICAgICAgICAgIGxhc3RLZXkgPSBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFZJbnRMZW5ndGgoaW4pOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXRzTWV0YWRhdGEocGFydGl0aW9uU2l6ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uQ291bnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdExvZ0ludGVydmFscywKQEAgLTQ2NCwxNSArNjEzLDI1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25SYXRpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b21ic3RvbmVIaXN0b2dyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZUxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkNsdXN0ZXJpbmdWYWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Q2x1c3RlcmluZ1ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyaW5nVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY292ZXJlZENsdXN0ZXJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzTGVnYWN5Q291bnRlclNoYXJkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBhaXJlZEF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsQ29sdW1uc1NldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFJvd3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYXRpbmdIb3N0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1JlcGFpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RyYW5zaWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUcmFuc2llbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEtleSk7CiAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBjb3VudFVudGlsTnVsbChCeXRlQnVmZmVyW10gYnVmZmVyQXJyYXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpID0gQXJyYXlVdGlscy5pbmRleE9mKGJ1ZmZlckFycmF5LCBudWxsKTsKKyAgICAgICAgICAgIHJldHVybiBpIDwgMCA/IGJ1ZmZlckFycmF5Lmxlbmd0aCA6IGk7CisgICAgICAgIH0KKwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL0luY3JlbWVudGFsRGVlcFRyaWVXcml0ZXJQYWdlQXdhcmUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL0luY3JlbWVudGFsRGVlcFRyaWVXcml0ZXJQYWdlQXdhcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGI1NTBjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvSW5jcmVtZW50YWxEZWVwVHJpZVdyaXRlclBhZ2VBd2FyZS5qYXZhCkBAIC0wLDAgKzEsNDExIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uY29uY3VycmVudC5Ob3RUaHJlYWRTYWZlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgdmFyaWFudCBvZiB7QGxpbmsgSW5jcmVtZW50YWxUcmllV3JpdGVyUGFnZUF3YXJlfSB3aGljaCBpcyBhYmxlIHRvIGJ1aWxkIGV2ZW4gdmVyeSBkZWVwCisgKiB0cmllcy4gV2hpbGUgdGhlIHBhcmVudCBjbGFzcyB1c2VzIHJlY3Vyc2lvbiBmb3IgY2xhcml0eSwgaXQgbWF5IGVuZCB1cCB3aXRoIHN0YWNrIG92ZXJmbG93IGZvciB0cmllcyB3aXRoCisgKiB2ZXJ5IGxvbmcga2V5cy4gVGhpcyBpbXBsZW1lbnRhdGlvbiBjYW4gc3dpdGNoIHByb2Nlc3NpbmcgZnJvbSBzdGFjayB0byBoZWFwIGF0IGEgY2VydGFpbiBkZXB0aCAocHJvdmlkZWQKKyAqIGFzIGEgY29uc3RydWN0b3IgcGFyYW0pLgorICogPHA+CisgKiBUaGlzIGNsYXNzIGludGVudGlvbmFsbHkgcmVwZWF0cyBjb2RlIHByZXNlbnQgaW4gdGhlIHBhcmVudCBjbGFzcywgYm90aCBpbiB0aGUgaW4tc3RhY2sgYW5kIG9uLWhlYXAgdmVyc2lvbnMKKyAqIG9mIGVhY2ggb2YgdGhlIHRocmVlIGltcGxlbWVudGVkIHJlY3Vyc2l2ZSBvcGVyYXRpb25zLiBSZW1vdmluZyB0aGlzIHJlcGV0aXRpb24gY2FuIGNhdXNlIGhpZ2hlciBzdGFjayB1c2FnZQorICogYW5kIHRodXMgc3RhY2sgb3ZlcmZsb3cgZmFpbHVyZXMuCisgKi8KK0BOb3RUaHJlYWRTYWZlCitwdWJsaWMgY2xhc3MgSW5jcmVtZW50YWxEZWVwVHJpZVdyaXRlclBhZ2VBd2FyZTxWQUxVRT4gZXh0ZW5kcyBJbmNyZW1lbnRhbFRyaWVXcml0ZXJQYWdlQXdhcmU8VkFMVUU+Cit7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbWF4UmVjdXJzaW9uRGVwdGg7CisKKyAgICBwdWJsaWMgSW5jcmVtZW50YWxEZWVwVHJpZVdyaXRlclBhZ2VBd2FyZShUcmllU2VyaWFsaXplcjxWQUxVRSwgPyBzdXBlciBEYXRhT3V0cHV0UGx1cz4gdHJpZVNlcmlhbGl6ZXIsIERhdGFPdXRwdXRQbHVzIGRlc3QsIGludCBtYXhSZWN1cnNpb25EZXB0aCkKKyAgICB7CisgICAgICAgIHN1cGVyKHRyaWVTZXJpYWxpemVyLCBkZXN0KTsKKyAgICAgICAgdGhpcy5tYXhSZWN1cnNpb25EZXB0aCA9IG1heFJlY3Vyc2lvbkRlcHRoOworICAgIH0KKworICAgIHB1YmxpYyBJbmNyZW1lbnRhbERlZXBUcmllV3JpdGVyUGFnZUF3YXJlKFRyaWVTZXJpYWxpemVyPFZBTFVFLCA/IHN1cGVyIERhdGFPdXRwdXRQbHVzPiB0cmllU2VyaWFsaXplciwgRGF0YU91dHB1dFBsdXMgZGVzdCkKKyAgICB7CisgICAgICAgIHRoaXModHJpZVNlcmlhbGl6ZXIsIGRlc3QsIDY0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW1wbGUgZnJhbWV3b3JrIGZvciBleGVjdXRpbmcgcmVjdXJzaW9uIHVzaW5nIG9uLWhlYXAgbGlua2VkIHRyYWNlIHRvIGF2b2lkIHN0YWNrIG92ZXJydW5zLgorICAgICAqLworICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBSZWN1cnNpb248Tk9ERT4KKyAgICB7CisgICAgICAgIGZpbmFsIFJlY3Vyc2lvbjxOT0RFPiBwYXJlbnQ7CisgICAgICAgIGZpbmFsIE5PREUgbm9kZTsKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8Tk9ERT4gY2hpbGRJdGVyYXRvcjsKKworICAgICAgICBSZWN1cnNpb24oTk9ERSBub2RlLCBJdGVyYXRvcjxOT0RFPiBjaGlsZEl0ZXJhdG9yLCBSZWN1cnNpb248Tk9ERT4gcGFyZW50KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKyAgICAgICAgICAgIHRoaXMubm9kZSA9IG5vZGU7CisgICAgICAgICAgICB0aGlzLmNoaWxkSXRlcmF0b3IgPSBjaGlsZEl0ZXJhdG9yOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1ha2UgYSBjaGlsZCBSZWN1cnNpb24gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gbm9kZSBhbmQgaW5pdGlhbGl6ZSBpdCBhcyBuZWNlc3NhcnkgdG8gY29udGludWUgcHJvY2Vzc2luZworICAgICAgICAgKiB3aXRoIGl0LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogTWF5IHJldHVybiBudWxsIGlmIHRoZSByZWN1cnNpb24gZG9lcyBub3QgbmVlZCB0byBjb250aW51ZSBpbnNpZGUgdGhlIGNoaWxkIGJyYW5jaC4KKyAgICAgICAgICovCisgICAgICAgIGFic3RyYWN0IFJlY3Vyc2lvbjxOT0RFPiBtYWtlQ2hpbGQoTk9ERSBjaGlsZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbXBsZXRlIHRoZSBwcm9jZXNzaW5nIHRoaXMgUmVjdXJzaW9uIG9iamVjdC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIE5vdGU6IHRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQgZm9yIHRoZSBub2RlcyBmb3Igd2hpY2ggbWFrZUNoaWxkKCkgcmV0dXJucyBudWxsLgorICAgICAgICAgKi8KKyAgICAgICAgYWJzdHJhY3Qgdm9pZCBjb21wbGV0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29tcGxldGUgcHJvY2Vzc2luZyBvZiB0aGUgZ2l2ZW4gY2hpbGQgKHBvc3NpYmx5IHJldHJpZXZlIGRhdGEgdG8gYXBwbHkgdG8gYW55IGFjY3VtdWxhdGlvbiBwZXJmb3JtZWQKKyAgICAgICAgICogaW4gdGhpcyBSZWN1cnNpb24gb2JqZWN0KS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gcHJvY2Vzc2luZyBhIGNoaWxkIGNvbXBsZXRlcywgaW5jbHVkaW5nIHdoZW4gcmVjdXJzaW9uIGluc2lkZSB0aGUgY2hpbGQgYnJhbmNoCisgICAgICAgICAqIGlzIHNraXBwZWQgYnkgbWFrZUNoaWxkKCkgcmV0dXJuaW5nIG51bGwuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGNvbXBsZXRlQ2hpbGQoTk9ERSBjaGlsZCkKKyAgICAgICAge30KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVjdXJzaXZlIHByb2Nlc3MsIGluIGRlcHRoLWZpcnN0IG9yZGVyLCB0aGUgYnJhbmNoIHJvb3RlZCBhdCB0aGlzIHJlY3Vyc2lvbiBub2RlLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogUmV0dXJucyB0aGlzLgorICAgICAgICAgKi8KKyAgICAgICAgUmVjdXJzaW9uPE5PREU+IHByb2Nlc3MoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgUmVjdXJzaW9uPE5PREU+IGN1cnIgPSB0aGlzOworCisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3Vyci5jaGlsZEl0ZXJhdG9yLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5PREUgY2hpbGQgPSBjdXJyLmNoaWxkSXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBSZWN1cnNpb248Tk9ERT4gY2hpbGRSZWMgPSBjdXJyLm1ha2VDaGlsZChjaGlsZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZFJlYyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY3VyciA9IGNoaWxkUmVjOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyLmNvbXBsZXRlQ2hpbGQoY2hpbGQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdXJyLmNvbXBsZXRlKCk7CisgICAgICAgICAgICAgICAgICAgIFJlY3Vyc2lvbjxOT0RFPiBjdXJyUGFyZW50ID0gY3Vyci5wYXJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyUGFyZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycjsKKyAgICAgICAgICAgICAgICAgICAgY3VyclBhcmVudC5jb21wbGV0ZUNoaWxkKGN1cnIubm9kZSk7CisgICAgICAgICAgICAgICAgICAgIGN1cnIgPSBjdXJyUGFyZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBpbnQgcmVjYWxjVG90YWxTaXplKE5vZGU8VkFMVUU+IG5vZGUsIGxvbmcgbm9kZVBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiByZWNhbGNUb3RhbFNpemVSZWN1cnNpdmVPblN0YWNrKG5vZGUsIG5vZGVQb3NpdGlvbiwgMCk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoIkR1cGxpY2F0ZWRDb2RlIikgLy8gaW50ZW50aW9uYWxseSBkdXBsaWNhdGVzIEluY3JlbWVudGFsVHJpZVdyaXRlclBhZ2VBd2FyZQorICAgIHByaXZhdGUgaW50IHJlY2FsY1RvdGFsU2l6ZVJlY3Vyc2l2ZU9uU3RhY2soTm9kZTxWQUxVRT4gbm9kZSwgbG9uZyBub2RlUG9zaXRpb24sIGludCBkZXB0aCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAobm9kZS5oYXNPdXRPZlBhZ2VJbkJyYW5jaCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHN6ID0gMDsKKyAgICAgICAgICAgIGZvciAoTm9kZTxWQUxVRT4gY2hpbGQgOiBub2RlLmNoaWxkcmVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkZXB0aCA8IG1heFJlY3Vyc2lvbkRlcHRoKQorICAgICAgICAgICAgICAgICAgICBzeiArPSByZWNhbGNUb3RhbFNpemVSZWN1cnNpdmVPblN0YWNrKGNoaWxkLCBub2RlUG9zaXRpb24gKyBzeiwgZGVwdGggKyAxKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN6ICs9IHJlY2FsY1RvdGFsU2l6ZVJlY3Vyc2l2ZU9uSGVhcChjaGlsZCwgbm9kZVBvc2l0aW9uICsgc3opOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZS5icmFuY2hTaXplID0gc3o7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGUgc2l6aW5nIGJlbG93IHdpbGwgdXNlIHRoZSBicmFuY2ggc2l6ZSBjYWxjdWxhdGVkIGFib3ZlLiBTaW5jZSB0aGF0IGNhbiBjaGFuZ2Ugb24gb3V0LW9mLXBhZ2UgaW4gYnJhbmNoLAorICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZSBzaXplIGlmIGVpdGhlciBmbGFnIGlzIHNldC4KKyAgICAgICAgaWYgKG5vZGUuaGFzT3V0T2ZQYWdlQ2hpbGRyZW4gfHwgbm9kZS5oYXNPdXRPZlBhZ2VJbkJyYW5jaCkKKyAgICAgICAgICAgIG5vZGUubm9kZVNpemUgPSBzZXJpYWxpemVyLnNpemVvZk5vZGUobm9kZSwgbm9kZVBvc2l0aW9uICsgbm9kZS5icmFuY2hTaXplKTsKKworICAgICAgICByZXR1cm4gbm9kZS5icmFuY2hTaXplICsgbm9kZS5ub2RlU2l6ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCByZWNhbGNUb3RhbFNpemVSZWN1cnNpdmVPbkhlYXAoTm9kZTxWQUxVRT4gbm9kZSwgbG9uZyBub2RlUG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKG5vZGUuaGFzT3V0T2ZQYWdlSW5CcmFuY2gpCisgICAgICAgICAgICBuZXcgUmVjYWxjVG90YWxTaXplUmVjdXJzaW9uKG5vZGUsIG51bGwsIG5vZGVQb3NpdGlvbikucHJvY2VzcygpOworCisgICAgICAgIGlmIChub2RlLmhhc091dE9mUGFnZUNoaWxkcmVuIHx8IG5vZGUuaGFzT3V0T2ZQYWdlSW5CcmFuY2gpCisgICAgICAgICAgICBub2RlLm5vZGVTaXplID0gc2VyaWFsaXplci5zaXplb2ZOb2RlKG5vZGUsIG5vZGVQb3NpdGlvbiArIG5vZGUuYnJhbmNoU2l6ZSk7CisKKyAgICAgICAgcmV0dXJuIG5vZGUuYnJhbmNoU2l6ZSArIG5vZGUubm9kZVNpemU7CisgICAgfQorCisgICAgY2xhc3MgUmVjYWxjVG90YWxTaXplUmVjdXJzaW9uIGV4dGVuZHMgUmVjdXJzaW9uPE5vZGU8VkFMVUU+PgorICAgIHsKKyAgICAgICAgZmluYWwgbG9uZyBub2RlUG9zaXRpb247CisgICAgICAgIGludCBzejsKKworICAgICAgICBSZWNhbGNUb3RhbFNpemVSZWN1cnNpb24oTm9kZTxWQUxVRT4gbm9kZSwgUmVjdXJzaW9uPE5vZGU8VkFMVUU+PiBwYXJlbnQsIGxvbmcgbm9kZVBvc2l0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihub2RlLCBub2RlLmNoaWxkcmVuLml0ZXJhdG9yKCksIHBhcmVudCk7CisgICAgICAgICAgICBzeiA9IDA7CisgICAgICAgICAgICB0aGlzLm5vZGVQb3NpdGlvbiA9IG5vZGVQb3NpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBSZWN1cnNpb248Tm9kZTxWQUxVRT4+IG1ha2VDaGlsZChOb2RlPFZBTFVFPiBjaGlsZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNoaWxkLmhhc091dE9mUGFnZUluQnJhbmNoKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVjYWxjVG90YWxTaXplUmVjdXJzaW9uKGNoaWxkLCB0aGlzLCBub2RlUG9zaXRpb24gKyBzeik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBjb21wbGV0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vZGUuYnJhbmNoU2l6ZSA9IHN6OworICAgICAgICB9CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoIkR1cGxpY2F0ZWRDb2RlIikgLy8gaW50ZW50aW9uYWxseSBkdXBsaWNhdGVzIEluY3JlbWVudGFsVHJpZVdyaXRlclBhZ2VBd2FyZSBhbmQgb25TdGFjayBjb2RlCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIGNvbXBsZXRlQ2hpbGQoTm9kZTxWQUxVRT4gY2hpbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgZm9yIG5vZGVzIHRoYXQgd2VyZSByZWN1cnNpdmVseSBwcm9jZXNzZWQgYXMgd2VsbCBhcyB0aGUgb25lcyB0aGF0IHdlcmVuJ3QuCisKKyAgICAgICAgICAgIC8vIFRoZSBzaXppbmcgYmVsb3cgd2lsbCB1c2UgdGhlIGJyYW5jaCBzaXplIGNhbGN1bGF0ZWQgYWJvdmUuIFNpbmNlIHRoYXQgY2FuIGNoYW5nZSBvbiBvdXQtb2YtcGFnZSBpbiBicmFuY2gsCisgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZSBzaXplIGlmIGVpdGhlciBmbGFnIGlzIHNldC4KKyAgICAgICAgICAgIGlmIChjaGlsZC5oYXNPdXRPZlBhZ2VDaGlsZHJlbiB8fCBjaGlsZC5oYXNPdXRPZlBhZ2VJbkJyYW5jaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIGNoaWxkUG9zaXRpb24gPSB0aGlzLm5vZGVQb3NpdGlvbiArIHN6OworICAgICAgICAgICAgICAgIGNoaWxkLm5vZGVTaXplID0gc2VyaWFsaXplci5zaXplb2ZOb2RlKGNoaWxkLCBjaGlsZFBvc2l0aW9uICsgY2hpbGQuYnJhbmNoU2l6ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN6ICs9IGNoaWxkLmJyYW5jaFNpemUgKyBjaGlsZC5ub2RlU2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBsb25nIHdyaXRlKE5vZGU8VkFMVUU+IG5vZGUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIHdyaXRlUmVjdXJzaXZlT25TdGFjayhub2RlLCAwKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiRHVwbGljYXRlZENvZGUiKSAvLyBpbnRlbnRpb25hbGx5IGR1cGxpY2F0ZXMgSW5jcmVtZW50YWxUcmllV3JpdGVyUGFnZUF3YXJlCisgICAgcHJpdmF0ZSBsb25nIHdyaXRlUmVjdXJzaXZlT25TdGFjayhOb2RlPFZBTFVFPiBub2RlLCBpbnQgZGVwdGgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbG9uZyBub2RlUG9zaXRpb24gPSBkZXN0LnBvc2l0aW9uKCk7CisgICAgICAgIGZvciAoTm9kZTxWQUxVRT4gY2hpbGQgOiBub2RlLmNoaWxkcmVuKQorICAgICAgICAgICAgaWYgKGNoaWxkLmZpbGVQb3MgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRlcHRoIDwgbWF4UmVjdXJzaW9uRGVwdGgpCisgICAgICAgICAgICAgICAgICAgIGNoaWxkLmZpbGVQb3MgPSB3cml0ZVJlY3Vyc2l2ZU9uU3RhY2soY2hpbGQsIGRlcHRoICsgMSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjaGlsZC5maWxlUG9zID0gd3JpdGVSZWN1cnNpdmVPbkhlYXAoY2hpbGQpOworICAgICAgICAgICAgfQorCisgICAgICAgIG5vZGVQb3NpdGlvbiArPSBub2RlLmJyYW5jaFNpemU7CisgICAgICAgIGFzc2VydCBkZXN0LnBvc2l0aW9uKCkgPT0gbm9kZVBvc2l0aW9uCisgICAgICAgIDogIkV4cGVjdGVkIG5vZGUgcG9zaXRpb24gdG8gYmUgIiArIG5vZGVQb3NpdGlvbiArICIgYnV0IGdvdCAiICsgZGVzdC5wb3NpdGlvbigpICsgIiBhZnRlciB3cml0aW5nIGNoaWxkcmVuLlxuIiArIGR1bXBOb2RlKG5vZGUsIGRlc3QucG9zaXRpb24oKSk7CisKKyAgICAgICAgc2VyaWFsaXplci53cml0ZShkZXN0LCBub2RlLCBub2RlUG9zaXRpb24pOworCisgICAgICAgIGFzc2VydCBkZXN0LnBvc2l0aW9uKCkgPT0gbm9kZVBvc2l0aW9uICsgbm9kZS5ub2RlU2l6ZQorICAgICAgICAgICAgICAgfHwgZGVzdC5wYWRkZWRQb3NpdGlvbigpID09IGRlc3QucG9zaXRpb24oKSAvLyBGb3IgUGFydGl0aW9uSW5kZXhUZXN0LnRlc3RQb2ludGVyR3Jvd3RoIHdoZXJlIHBvc2l0aW9uIG1heSBqdW1wIG9uIHBhZ2UgYm91bmRhcmllcy4KKyAgICAgICAgOiAiRXhwZWN0ZWQgbm9kZSBwb3NpdGlvbiB0byBiZSAiICsgKG5vZGVQb3NpdGlvbiArIG5vZGUubm9kZVNpemUpICsgIiBidXQgZ290ICIgKyBkZXN0LnBvc2l0aW9uKCkgKyAiIGFmdGVyIHdyaXRpbmcgbm9kZSwgbm9kZVNpemUgIiArIG5vZGUubm9kZVNpemUgKyAiLlxuIiArIGR1bXBOb2RlKG5vZGUsIG5vZGVQb3NpdGlvbik7CisgICAgICAgIHJldHVybiBub2RlUG9zaXRpb247CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIHdyaXRlUmVjdXJzaXZlT25IZWFwKE5vZGU8VkFMVUU+IG5vZGUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBXcml0ZVJlY3Vyc2lvbihub2RlLCBudWxsKS5wcm9jZXNzKCkubm9kZS5maWxlUG9zOworICAgIH0KKworICAgIGNsYXNzIFdyaXRlUmVjdXJzaW9uIGV4dGVuZHMgUmVjdXJzaW9uPE5vZGU8VkFMVUU+PgorICAgIHsKKyAgICAgICAgbG9uZyBub2RlUG9zaXRpb247CisKKyAgICAgICAgV3JpdGVSZWN1cnNpb24oTm9kZTxWQUxVRT4gbm9kZSwgUmVjdXJzaW9uPE5vZGU8VkFMVUU+PiBwYXJlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKG5vZGUsIG5vZGUuY2hpbGRyZW4uaXRlcmF0b3IoKSwgcGFyZW50KTsKKyAgICAgICAgICAgIG5vZGVQb3NpdGlvbiA9IGRlc3QucG9zaXRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBSZWN1cnNpb248Tm9kZTxWQUxVRT4+IG1ha2VDaGlsZChOb2RlPFZBTFVFPiBjaGlsZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNoaWxkLmZpbGVQb3MgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXcml0ZVJlY3Vyc2lvbihjaGlsZCwgdGhpcyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiRHVwbGljYXRlZENvZGUiKSAvLyBpbnRlbnRpb25hbGx5IGR1cGxpY2F0ZXMgSW5jcmVtZW50YWxUcmllV3JpdGVyUGFnZUF3YXJlIGFuZCBvblN0YWNrIGNvZGUKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgY29tcGxldGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgbm9kZVBvc2l0aW9uID0gbm9kZVBvc2l0aW9uICsgbm9kZS5icmFuY2hTaXplOworICAgICAgICAgICAgYXNzZXJ0IGRlc3QucG9zaXRpb24oKSA9PSBub2RlUG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgOiAiRXhwZWN0ZWQgbm9kZSBwb3NpdGlvbiB0byBiZSAiICsgbm9kZVBvc2l0aW9uICsgIiBidXQgZ290ICIgKyBkZXN0LnBvc2l0aW9uKCkgKyAiIGFmdGVyIHdyaXRpbmcgY2hpbGRyZW4uXG4iICsgZHVtcE5vZGUobm9kZSwgZGVzdC5wb3NpdGlvbigpKTsKKworICAgICAgICAgICAgc2VyaWFsaXplci53cml0ZShkZXN0LCBub2RlLCBub2RlUG9zaXRpb24pOworCisgICAgICAgICAgICBhc3NlcnQgZGVzdC5wb3NpdGlvbigpID09IG5vZGVQb3NpdGlvbiArIG5vZGUubm9kZVNpemUKKyAgICAgICAgICAgICAgICAgICB8fCBkZXN0LnBhZGRlZFBvc2l0aW9uKCkgPT0gZGVzdC5wb3NpdGlvbigpIC8vIEZvciBQYXJ0aXRpb25JbmRleFRlc3QudGVzdFBvaW50ZXJHcm93dGggd2hlcmUgcG9zaXRpb24gbWF5IGp1bXAgb24gcGFnZSBib3VuZGFyaWVzLgorICAgICAgICAgICAgICAgICAgICA6ICJFeHBlY3RlZCBub2RlIHBvc2l0aW9uIHRvIGJlICIgKyAobm9kZVBvc2l0aW9uICsgbm9kZS5ub2RlU2l6ZSkgKyAiIGJ1dCBnb3QgIiArIGRlc3QucG9zaXRpb24oKSArICIgYWZ0ZXIgd3JpdGluZyBub2RlLCBub2RlU2l6ZSAiICsgbm9kZS5ub2RlU2l6ZSArICIuXG4iICsgZHVtcE5vZGUobm9kZSwgbm9kZVBvc2l0aW9uKTsKKworICAgICAgICAgICAgbm9kZS5maWxlUG9zID0gbm9kZVBvc2l0aW9uOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGxvbmcgd3JpdGVQYXJ0aWFsKE5vZGU8VkFMVUU+IG5vZGUsIERhdGFPdXRwdXRQbHVzIGRlc3QsIGxvbmcgYmFzZU9mZnNldCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gd3JpdGVQYXJ0aWFsUmVjdXJzaXZlT25TdGFjayhub2RlLCBkZXN0LCBiYXNlT2Zmc2V0LCAwKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiRHVwbGljYXRlZENvZGUiKSAvLyBpbnRlbnRpb25hbGx5IGR1cGxpY2F0ZXMgSW5jcmVtZW50YWxUcmllV3JpdGVyUGFnZUF3YXJlCisgICAgcHJpdmF0ZSBsb25nIHdyaXRlUGFydGlhbFJlY3Vyc2l2ZU9uU3RhY2soTm9kZTxWQUxVRT4gbm9kZSwgRGF0YU91dHB1dFBsdXMgZGVzdCwgbG9uZyBiYXNlT2Zmc2V0LCBpbnQgZGVwdGgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbG9uZyBzdGFydFBvc2l0aW9uID0gZGVzdC5wb3NpdGlvbigpICsgYmFzZU9mZnNldDsKKworICAgICAgICBMaXN0PE5vZGU8VkFMVUU+PiBjaGlsZHJlblRvQ2xlYXIgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChOb2RlPFZBTFVFPiBjaGlsZCA6IG5vZGUuY2hpbGRyZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjaGlsZC5maWxlUG9zID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoaWxkcmVuVG9DbGVhci5hZGQoY2hpbGQpOworICAgICAgICAgICAgICAgIGlmIChkZXB0aCA8IG1heFJlY3Vyc2lvbkRlcHRoKQorICAgICAgICAgICAgICAgICAgICBjaGlsZC5maWxlUG9zID0gd3JpdGVQYXJ0aWFsUmVjdXJzaXZlT25TdGFjayhjaGlsZCwgZGVzdCwgYmFzZU9mZnNldCwgZGVwdGggKyAxKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNoaWxkLmZpbGVQb3MgPSB3cml0ZVBhcnRpYWxSZWN1cnNpdmVPbkhlYXAoY2hpbGQsIGRlc3QsIGJhc2VPZmZzZXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbG9uZyBub2RlUG9zaXRpb24gPSBkZXN0LnBvc2l0aW9uKCkgKyBiYXNlT2Zmc2V0OworCisgICAgICAgIGlmIChub2RlLmhhc091dE9mUGFnZUluQnJhbmNoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGJyYW5jaCBzaXplIHdpdGggdGhlIHNpemUgb2Ygd2hhdCB3ZSBoYXZlIGp1c3Qgd3JpdHRlbi4gVGhpcyBtYXkgYmUgdXNlZCBieSB0aGUgbm9kZSdzCisgICAgICAgICAgICAvLyBtYXhQb3NpdGlvbkRlbHRhLCBhbmQgaXQncyBhIGJldHRlciBhcHByb3hpbWF0aW9uIGZvciBsYXRlciBmaXR0aW5nIGNhbGN1bGF0aW9ucy4KKyAgICAgICAgICAgIG5vZGUuYnJhbmNoU2l6ZSA9IChpbnQpIChub2RlUG9zaXRpb24gLSBzdGFydFBvc2l0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHNlcmlhbGl6ZXIud3JpdGUoZGVzdCwgbm9kZSwgbm9kZVBvc2l0aW9uKTsKKworICAgICAgICBpZiAobm9kZS5oYXNPdXRPZlBhZ2VDaGlsZHJlbiB8fCBub2RlLmhhc091dE9mUGFnZUluQnJhbmNoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIG5vZGUgc2l6ZSB3aXRoIHdoYXQgd2UgaGF2ZSBqdXN0IHNlZW4uIEl0J3MgYSBiZXR0ZXIgYXBwcm94aW1hdGlvbiBmb3IgbGF0ZXIgZml0dGluZworICAgICAgICAgICAgLy8gY2FsY3VsYXRpb25zLgorICAgICAgICAgICAgbG9uZyBlbmRQb3NpdGlvbiA9IGRlc3QucG9zaXRpb24oKSArIGJhc2VPZmZzZXQ7CisgICAgICAgICAgICBub2RlLm5vZGVTaXplID0gKGludCkgKGVuZFBvc2l0aW9uIC0gbm9kZVBvc2l0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoTm9kZTxWQUxVRT4gY2hpbGQgOiBjaGlsZHJlblRvQ2xlYXIpCisgICAgICAgICAgICBjaGlsZC5maWxlUG9zID0gLTE7CisgICAgICAgIHJldHVybiBub2RlUG9zaXRpb247CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIHdyaXRlUGFydGlhbFJlY3Vyc2l2ZU9uSGVhcChOb2RlPFZBTFVFPiBub2RlLCBEYXRhT3V0cHV0UGx1cyBkZXN0LCBsb25nIGJhc2VPZmZzZXQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbmV3IFdyaXRlUGFydGlhbFJlY3Vyc2lvbihub2RlLCBkZXN0LCBiYXNlT2Zmc2V0KS5wcm9jZXNzKCk7CisgICAgICAgIGxvbmcgcG9zID0gbm9kZS5maWxlUG9zOworICAgICAgICBub2RlLmZpbGVQb3MgPSAtMTsKKyAgICAgICAgcmV0dXJuIHBvczsKKyAgICB9CisKKyAgICBjbGFzcyBXcml0ZVBhcnRpYWxSZWN1cnNpb24gZXh0ZW5kcyBSZWN1cnNpb248Tm9kZTxWQUxVRT4+CisgICAgeworICAgICAgICBmaW5hbCBEYXRhT3V0cHV0UGx1cyBkZXN0OworICAgICAgICBmaW5hbCBsb25nIGJhc2VPZmZzZXQ7CisgICAgICAgIGZpbmFsIGxvbmcgc3RhcnRQb3NpdGlvbjsKKyAgICAgICAgZmluYWwgTGlzdDxOb2RlPFZBTFVFPj4gY2hpbGRyZW5Ub0NsZWFyOworCisgICAgICAgIFdyaXRlUGFydGlhbFJlY3Vyc2lvbihOb2RlPFZBTFVFPiBub2RlLCBXcml0ZVBhcnRpYWxSZWN1cnNpb24gcGFyZW50KQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihub2RlLCBub2RlLmNoaWxkcmVuLml0ZXJhdG9yKCksIHBhcmVudCk7CisgICAgICAgICAgICB0aGlzLmRlc3QgPSBwYXJlbnQuZGVzdDsKKyAgICAgICAgICAgIHRoaXMuYmFzZU9mZnNldCA9IHBhcmVudC5iYXNlT2Zmc2V0OworICAgICAgICAgICAgdGhpcy5zdGFydFBvc2l0aW9uID0gZGVzdC5wb3NpdGlvbigpICsgYmFzZU9mZnNldDsKKyAgICAgICAgICAgIGNoaWxkcmVuVG9DbGVhciA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB9CisKKyAgICAgICAgV3JpdGVQYXJ0aWFsUmVjdXJzaW9uKE5vZGU8VkFMVUU+IG5vZGUsIERhdGFPdXRwdXRQbHVzIGRlc3QsIGxvbmcgYmFzZU9mZnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIobm9kZSwgbm9kZS5jaGlsZHJlbi5pdGVyYXRvcigpLCBudWxsKTsKKyAgICAgICAgICAgIHRoaXMuZGVzdCA9IGRlc3Q7CisgICAgICAgICAgICB0aGlzLmJhc2VPZmZzZXQgPSBiYXNlT2Zmc2V0OworICAgICAgICAgICAgdGhpcy5zdGFydFBvc2l0aW9uID0gZGVzdC5wb3NpdGlvbigpICsgYmFzZU9mZnNldDsKKyAgICAgICAgICAgIGNoaWxkcmVuVG9DbGVhciA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB9CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoIkR1cGxpY2F0ZWRDb2RlIikgLy8gaW50ZW50aW9uYWxseSBkdXBsaWNhdGVzIEluY3JlbWVudGFsVHJpZVdyaXRlclBhZ2VBd2FyZSBhbmQgb25TdGFjayBjb2RlCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBSZWN1cnNpb248Tm9kZTxWQUxVRT4+IG1ha2VDaGlsZChOb2RlPFZBTFVFPiBjaGlsZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNoaWxkLmZpbGVQb3MgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hpbGRyZW5Ub0NsZWFyLmFkZChjaGlsZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXcml0ZVBhcnRpYWxSZWN1cnNpb24oY2hpbGQsIHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgY29tcGxldGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBub2RlUG9zaXRpb24gPSBkZXN0LnBvc2l0aW9uKCkgKyBiYXNlT2Zmc2V0OworCisgICAgICAgICAgICBpZiAobm9kZS5oYXNPdXRPZlBhZ2VJbkJyYW5jaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGJyYW5jaCBzaXplIHdpdGggdGhlIHNpemUgb2Ygd2hhdCB3ZSBoYXZlIGp1c3Qgd3JpdHRlbi4gVGhpcyBtYXkgYmUgdXNlZCBieSB0aGUgbm9kZSdzCisgICAgICAgICAgICAgICAgLy8gbWF4UG9zaXRpb25EZWx0YSwgYW5kIGl0J3MgYSBiZXR0ZXIgYXBwcm94aW1hdGlvbiBmb3IgbGF0ZXIgZml0dGluZyBjYWxjdWxhdGlvbnMuCisgICAgICAgICAgICAgICAgbm9kZS5icmFuY2hTaXplID0gKGludCkgKG5vZGVQb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXJpYWxpemVyLndyaXRlKGRlc3QsIG5vZGUsIG5vZGVQb3NpdGlvbik7CisKKyAgICAgICAgICAgIGlmIChub2RlLmhhc091dE9mUGFnZUNoaWxkcmVuIHx8IG5vZGUuaGFzT3V0T2ZQYWdlSW5CcmFuY2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBub2RlIHNpemUgd2l0aCB3aGF0IHdlIGhhdmUganVzdCBzZWVuLiBJdCdzIGEgYmV0dGVyIGFwcHJveGltYXRpb24gZm9yIGxhdGVyIGZpdHRpbmcKKyAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGlvbnMuCisgICAgICAgICAgICAgICAgbG9uZyBlbmRQb3NpdGlvbiA9IGRlc3QucG9zaXRpb24oKSArIGJhc2VPZmZzZXQ7CisgICAgICAgICAgICAgICAgbm9kZS5ub2RlU2l6ZSA9IChpbnQpIChlbmRQb3NpdGlvbiAtIG5vZGVQb3NpdGlvbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoTm9kZTxWQUxVRT4gY2hpbGQgOiBjaGlsZHJlblRvQ2xlYXIpCisgICAgICAgICAgICAgICAgY2hpbGQuZmlsZVBvcyA9IC0xOworCisgICAgICAgICAgICBub2RlLmZpbGVQb3MgPSBub2RlUG9zaXRpb247CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9JbmNyZW1lbnRhbFRyaWVXcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL0luY3JlbWVudGFsVHJpZVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYzFlNGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9JbmNyZW1lbnRhbFRyaWVXcml0ZXIuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby50cmllczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CisKKy8qKgorICogQ29tbW9uIGludGVyZmFjZSBmb3IgaW5jcmVtZW50YWwgdHJpZSB3cml0ZXJzLiBJbmNyZW1lbnRhbCB3cml0ZXJzIHRha2Ugc29ydGVkIGlucHV0IHRvIGNvbnN0cnVjdCBhIHRyaWUgZmlsZSB3aGlsZQorICogYnVmZmVyaW5nIG9ubHkgbGltaXRlZCBhbW91bnQgb2YgZGF0YS4KKyAqIFRoZSB3cml0aW5nIGl0c2VsZiBpcyBkb25lIGJ5IHNvbWUgbm9kZSBzZXJpYWxpemVyIHBhc3NlZCBvbiBjb25zdHJ1Y3Rpb24gdGltZS4KKyAqIDxwPgorICogU2VlIHtAY29kZSBvcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvQnRpRm9ybWF0Lm1kfSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbWVjaGFuaXNtcyBvZiB3cml0aW5nCisgKiBhbmQgcmVhZGluZyBhbiBvbi1kaXNrIHRyaWUuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSW5jcmVtZW50YWxUcmllV3JpdGVyPFZBTFVFPiBleHRlbmRzIEF1dG9DbG9zZWFibGUKK3sKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gZW50cnkgdG8gdGhlIHRyaWUgd2l0aCB0aGUgYXNzb2NpYXRlZCB2YWx1ZS4KKyAgICAgKi8KKyAgICB2b2lkIGFkZChCeXRlQ29tcGFyYWJsZSBuZXh0LCBWQUxVRSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYWRkZWQgZW50cmllcy4KKyAgICAgKi8KKyAgICBsb25nIGNvdW50KCk7CisKKyAgICAvKioKKyAgICAgKiBDb21wbGV0ZSB0aGUgcHJvY2VzcyBhbmQgcmV0dXJuIHRoZSBwb3NpdGlvbiBpbiB0aGUgZmlsZSBvZiB0aGUgcm9vdCBub2RlLgorICAgICAqLworICAgIGxvbmcgY29tcGxldGUoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICB2b2lkIGNsb3NlKCk7CisKKyAgICAvKioKKyAgICAgKiBNYWtlIGEgdGVtcG9yYXJ5IGluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdW53cml0dGVuIG5vZGVzIHRoYXQgY292ZXJzIGV2ZXJ5dGhpbmcgYWRkZWQgdG8gdGhlIHRyaWUgdW50aWwKKyAgICAgKiB0aGlzIHBvaW50LiBUaGUgb2JqZWN0IHJldHVybmVkIHJlcHJlc2VudHMgYSAidGFpbCIgZm9yIHRoZSBmaWxlIHRoYXQgbmVlZHMgdG8gYmUgYXR0YWNoZWQgYXQgdGhlICJjdXRvZmYiIHBvaW50CisgICAgICogdG8gdGhlIGZpbGUgKHVzaW5nIGUuZy4gVGFpbE92ZXJyaWRpbmdSZWJ1ZmZlcmVyKS4KKyAgICAgKi8KKyAgICBQYXJ0aWFsVGFpbCBtYWtlUGFydGlhbFJvb3QoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKworICAgIGludGVyZmFjZSBQYXJ0aWFsVGFpbAorICAgIHsKKyAgICAgICAgLyoqIFBvc2l0aW9uIG9mIHRoZSByb290IG9mIHRoZSBwYXJ0aWFsIHJlcHJlc2VudGF0aW9uLiBSZXNpZGVzIGluIHRoZSB0YWlsIGJ1ZmZlci4gKi8gCisgICAgICAgIGxvbmcgcm9vdCgpOworICAgICAgICAvKiogTnVtYmVyIG9mIGtleXMgd3JpdHRlbiAqLworICAgICAgICBsb25nIGNvdW50KCk7CisgICAgICAgIC8qKiBDdXRvZmYgcG9pbnQuIFBvc2l0aW9ucyBsb3dlciB0aGF0IHRoaXMgYXJlIHRvIGJlIHJlYWQgZnJvbSB0aGUgZmlsZTsgaGlnaGVyIG9uZXMgZnJvbSB0aGUgdGFpbCBidWZmZXIuICovCisgICAgICAgIGxvbmcgY3V0b2ZmKCk7CisgICAgICAgIC8qKiBCdWZmZXIgY29udGFpbmluZyBpbi1tZW1vcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRhaWwuICovCisgICAgICAgIEJ5dGVCdWZmZXIgdGFpbCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIHN1aXRhYmxlIHRyaWUgd3JpdGVyLgorICAgICAqLworICAgIHN0YXRpYyA8VkFMVUU+IEluY3JlbWVudGFsVHJpZVdyaXRlcjxWQUxVRT4gb3BlbihUcmllU2VyaWFsaXplcjxWQUxVRSwgPyBzdXBlciBEYXRhT3V0cHV0UGx1cz4gdHJpZVNlcmlhbGl6ZXIsIERhdGFPdXRwdXRQbHVzIGRlc3QpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEluY3JlbWVudGFsRGVlcFRyaWVXcml0ZXJQYWdlQXdhcmU8Pih0cmllU2VyaWFsaXplciwgZGVzdCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL0luY3JlbWVudGFsVHJpZVdyaXRlckJhc2UuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL0luY3JlbWVudGFsVHJpZVdyaXRlckJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDYwOTlhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvSW5jcmVtZW50YWxUcmllV3JpdGVyQmFzZS5qYXZhCkBAIC0wLDAgKzEsMjY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby50cmllczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlEZXF1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5EZXF1ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5MaWdodHdlaWdodFJlY3ljbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuVGhyZWFkTG9jYWxzOworCisvKioKKyAqIEhlbHBlciBiYXNlIGNsYXNzIGZvciBpbmNyZW1lbnRhbCB0cmllIGJ1aWxkZXJzLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW5jcmVtZW50YWxUcmllV3JpdGVyQmFzZTxWQUxVRSwgREVTVCwgTk9ERSBleHRlbmRzIEluY3JlbWVudGFsVHJpZVdyaXRlckJhc2UuQmFzZU5vZGU8VkFMVUUsIE5PREU+PgoraW1wbGVtZW50cyBJbmNyZW1lbnRhbFRyaWVXcml0ZXI8VkFMVUU+Cit7CisgICAgcHJvdGVjdGVkIGZpbmFsIERlcXVlPE5PREU+IHN0YWNrID0gbmV3IEFycmF5RGVxdWU8PigpOworICAgIHByb3RlY3RlZCBmaW5hbCBUcmllU2VyaWFsaXplcjxWQUxVRSwgPyBzdXBlciBERVNUPiBzZXJpYWxpemVyOworICAgIHByb3RlY3RlZCBmaW5hbCBERVNUIGRlc3Q7CisgICAgcHJvdGVjdGVkIEJ5dGVDb21wYXJhYmxlIHByZXYgPSBudWxsOworICAgIGxvbmcgY291bnQgPSAwOworCisgICAgcHJvdGVjdGVkIEluY3JlbWVudGFsVHJpZVdyaXRlckJhc2UoVHJpZVNlcmlhbGl6ZXI8VkFMVUUsID8gc3VwZXIgREVTVD4gc2VyaWFsaXplciwgREVTVCBkZXN0LCBOT0RFIHJvb3QpCisgICAgeworICAgICAgICB0aGlzLnNlcmlhbGl6ZXIgPSBzZXJpYWxpemVyOworICAgICAgICB0aGlzLmRlc3QgPSBkZXN0OworICAgICAgICB0aGlzLnN0YWNrLmFkZExhc3Qocm9vdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcmVzZXQoTk9ERSByb290KQorICAgIHsKKyAgICAgICAgdGhpcy5wcmV2ID0gbnVsbDsKKyAgICAgICAgdGhpcy5jb3VudCA9IDA7CisgICAgICAgIHRoaXMuc3RhY2suY2xlYXIoKTsKKyAgICAgICAgdGhpcy5zdGFjay5hZGRMYXN0KHJvb3QpOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgIHsKKyAgICAgICAgdGhpcy5wcmV2ID0gbnVsbDsKKyAgICAgICAgdGhpcy5jb3VudCA9IDA7CisgICAgICAgIHRoaXMuc3RhY2suY2xlYXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGQoQnl0ZUNvbXBhcmFibGUgbmV4dCwgVkFMVUUgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgKytjb3VudDsKKyAgICAgICAgaW50IHN0YWNrcG9zID0gMDsKKyAgICAgICAgQnl0ZVNvdXJjZSBzbiA9IG5leHQuYXNDb21wYXJhYmxlQnl0ZXMoV2Fsa2VyLkJZVEVfQ09NUEFSQUJMRV9WRVJTSU9OKTsKKyAgICAgICAgaW50IG4gPSBzbi5uZXh0KCk7CisKKyAgICAgICAgaWYgKHByZXYgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZVNvdXJjZSBzcCA9IHByZXYuYXNDb21wYXJhYmxlQnl0ZXMoV2Fsa2VyLkJZVEVfQ09NUEFSQUJMRV9WRVJTSU9OKTsKKyAgICAgICAgICAgIGludCBwID0gc3AubmV4dCgpOworICAgICAgICAgICAgd2hpbGUgKCBuID09IHAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydCBuICE9IEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSA6IFN0cmluZy5mb3JtYXQoIkluY3JlbWVudGFsIHRyaWUgcmVxdWlyZXMgdW5pcXVlIHNvcnRlZCBrZXlzLCBnb3QgZXF1YWwgJXMoJXMpIGFmdGVyICVzKCVzKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhXYWxrZXIuQllURV9DT01QQVJBQkxFX1ZFUlNJT04pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhXYWxrZXIuQllURV9DT01QQVJBQkxFX1ZFUlNJT04pKTsKKworICAgICAgICAgICAgICAgICsrc3RhY2twb3M7CisgICAgICAgICAgICAgICAgbiA9IHNuLm5leHQoKTsKKyAgICAgICAgICAgICAgICBwID0gc3AubmV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0IHAgPCBuIDogU3RyaW5nLmZvcm1hdCgiSW5jcmVtZW50YWwgdHJpZSByZXF1aXJlcyBzb3J0ZWQga2V5cywgZ290ICVzKCVzKSBhZnRlciAlcyglcykuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKFdhbGtlci5CWVRFX0NPTVBBUkFCTEVfVkVSU0lPTiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhXYWxrZXIuQllURV9DT01QQVJBQkxFX1ZFUlNJT04pKTsKKyAgICAgICAgfQorICAgICAgICBwcmV2ID0gbmV4dDsKKworICAgICAgICB3aGlsZSAoc3RhY2suc2l6ZSgpID4gc3RhY2twb3MgKyAxKQorICAgICAgICAgICAgY29tcGxldGVMYXN0KCk7CisKKyAgICAgICAgTk9ERSBub2RlID0gc3RhY2suZ2V0TGFzdCgpOworICAgICAgICB3aGlsZSAobiAhPSBCeXRlU291cmNlLkVORF9PRl9TVFJFQU0pCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLmFkZENoaWxkKChieXRlKSBuKTsKKyAgICAgICAgICAgIHN0YWNrLmFkZExhc3Qobm9kZSk7CisgICAgICAgICAgICArK3N0YWNrcG9zOworICAgICAgICAgICAgbiA9IHNuLm5leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIFZBTFVFIGV4aXN0aW5nUGF5bG9hZCA9IG5vZGUuc2V0UGF5bG9hZCh2YWx1ZSk7CisgICAgICAgIGFzc2VydCBleGlzdGluZ1BheWxvYWQgPT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBjb21wbGV0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgTk9ERSByb290ID0gc3RhY2suZ2V0Rmlyc3QoKTsKKyAgICAgICAgaWYgKHJvb3QuZmlsZVBvcyAhPSAtMSkKKyAgICAgICAgICAgIHJldHVybiByb290LmZpbGVQb3M7CisKKyAgICAgICAgcmV0dXJuIHBlcmZvcm1Db21wbGV0aW9uKCkuZmlsZVBvczsKKyAgICB9CisKKyAgICBOT0RFIHBlcmZvcm1Db21wbGV0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBOT0RFIHJvb3QgPSBudWxsOworICAgICAgICB3aGlsZSAoIXN0YWNrLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJvb3QgPSBjb21wbGV0ZUxhc3QoKTsKKyAgICAgICAgc3RhY2suYWRkTGFzdChyb290KTsKKyAgICAgICAgcmV0dXJuIHJvb3Q7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgY291bnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIHByb3RlY3RlZCBOT0RFIGNvbXBsZXRlTGFzdCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgTk9ERSBub2RlID0gc3RhY2sucmVtb3ZlTGFzdCgpOworICAgICAgICBjb21wbGV0ZShub2RlKTsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorCisgICAgYWJzdHJhY3Qgdm9pZCBjb21wbGV0ZShOT0RFIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgYWJzdHJhY3QgcHVibGljIFBhcnRpYWxUYWlsIG1ha2VQYXJ0aWFsUm9vdCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIHN0YXRpYyBjbGFzcyBQVGFpbCBpbXBsZW1lbnRzIFBhcnRpYWxUYWlsCisgICAgeworICAgICAgICBsb25nIHJvb3Q7CisgICAgICAgIGxvbmcgY3V0b2ZmOworICAgICAgICBsb25nIGNvdW50OworICAgICAgICBCeXRlQnVmZmVyIHRhaWw7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIHJvb3QoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcm9vdDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBjdXRvZmYoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY3V0b2ZmOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIHRhaWwoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGFpbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBjb3VudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjb3VudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBCYXNlTm9kZTxWQUxVRSwgTk9ERSBleHRlbmRzIEJhc2VOb2RlPFZBTFVFLCBOT0RFPj4gaW1wbGVtZW50cyBTZXJpYWxpemF0aW9uTm9kZTxWQUxVRT4KKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSElMRFJFTl9MSVNUX1JFQ1lDTEVSX0xJTUlUID0gMTAyNDsKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlnaHR3ZWlnaHRSZWN5Y2xlcjxBcnJheUxpc3Q+IENISUxEUkVOX0xJU1RfUkVDWUNMRVIgPSBUaHJlYWRMb2NhbHMuY3JlYXRlTGlnaHR3ZWlnaHRSZWN5Y2xlcihDSElMRFJFTl9MSVNUX1JFQ1lDTEVSX0xJTUlUKTsKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0IEVNUFRZX0xJU1QgPSBuZXcgQXJyYXlMaXN0PD4oMCk7CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoeyAidW5jaGVja2VkIiwgInJhd3R5cGVzIiB9KQorICAgICAgICBwcml2YXRlIHN0YXRpYyA8Tk9ERT4gQXJyYXlMaXN0PE5PREU+IGFsbG9jYXRlQ2hpbGRyZW5MaXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENISUxEUkVOX0xJU1RfUkVDWUNMRVIucmV1c2VPckFsbG9jYXRlKCgpIC0+IG5ldyBBcnJheUxpc3QoNCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgPE5PREU+IHZvaWQgcmVjeWNsZUNoaWxkcmVuTGlzdChBcnJheUxpc3Q8Tk9ERT4gY2hpbGRyZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIENISUxEUkVOX0xJU1RfUkVDWUNMRVIudHJ5UmVjeWNsZShjaGlsZHJlbik7CisgICAgICAgIH0KKworICAgICAgICBWQUxVRSBwYXlsb2FkOworICAgICAgICBBcnJheUxpc3Q8Tk9ERT4gY2hpbGRyZW47CisgICAgICAgIGZpbmFsIGludCB0cmFuc2l0aW9uOworICAgICAgICBsb25nIGZpbGVQb3MgPSAtMTsKKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgQmFzZU5vZGUoaW50IHRyYW5zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoaWxkcmVuID0gRU1QVFlfTElTVDsKKyAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IHRyYW5zaXRpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVkFMVUUgcGF5bG9hZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwYXlsb2FkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFZBTFVFIHNldFBheWxvYWQoVkFMVUUgbmV3UGF5bG9hZCkKKyAgICAgICAgeworICAgICAgICAgICAgVkFMVUUgcCA9IHBheWxvYWQ7CisgICAgICAgICAgICBwYXlsb2FkID0gbmV3UGF5bG9hZDsKKyAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE5PREUgYWRkQ2hpbGQoYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgY2hpbGRyZW4uaXNFbXB0eSgpIHx8IChjaGlsZHJlbi5nZXQoY2hpbGRyZW4uc2l6ZSgpIC0gMSkudHJhbnNpdGlvbiAmIDB4RkYpIDwgKGIgJiAweEZGKTsKKyAgICAgICAgICAgIE5PREUgbm9kZSA9IG5ld05vZGUoYik7CisgICAgICAgICAgICBpZiAoY2hpbGRyZW4gPT0gRU1QVFlfTElTVCkKKyAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGFsbG9jYXRlQ2hpbGRyZW5MaXN0KCk7CisKKyAgICAgICAgICAgIGNoaWxkcmVuLmFkZChub2RlKTsKKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBjaGlsZENvdW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuLnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZmluYWxpemVXaXRoUG9zaXRpb24obG9uZyBwb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5maWxlUG9zID0gcG9zaXRpb247CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgbm90IGhvbGRpbmcgb24gdG8gcG9pbnRlcnMgdG8gZGF0YSB3ZSBubyBsb25nZXIgbmVlZAorICAgICAgICAgICAgLy8gKG90aGVyd2lzZSB3ZSBrZWVwIHRoZSB3aG9sZSB0cmllIGluIG1lbW9yeSkuCisgICAgICAgICAgICBpZiAoY2hpbGRyZW4gIT0gRU1QVFlfTElTVCkKKyAgICAgICAgICAgICAgICAvLyB0aGUgcmVjeWNsZXIgd2lsbCBhbHNvIGNsZWFyIHRoZSBjb2xsZWN0aW9uIGJlZm9yZSBhZGRpbmcgaXQgdG8gdGhlIHBvb2wKKyAgICAgICAgICAgICAgICByZWN5Y2xlQ2hpbGRyZW5MaXN0KGNoaWxkcmVuKTsKKworICAgICAgICAgICAgY2hpbGRyZW4gPSBudWxsOworICAgICAgICAgICAgcGF5bG9hZCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHRyYW5zaXRpb24oaW50IGkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbi5nZXQoaSkudHJhbnNpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiUwMngiLCB0cmFuc2l0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGFic3RyYWN0IE5PREUgbmV3Tm9kZShieXRlIHRyYW5zaXRpb24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL0luY3JlbWVudGFsVHJpZVdyaXRlclBhZ2VBd2FyZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvSW5jcmVtZW50YWxUcmllV3JpdGVyUGFnZUF3YXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI3NDk3NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL0luY3JlbWVudGFsVHJpZVdyaXRlclBhZ2VBd2FyZS5qYXZhCkBAIC0wLDAgKzEsNDY3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby50cmllczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTmF2aWdhYmxlU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5jb25jdXJyZW50Lk5vdFRocmVhZFNhZmU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKKworLyoqCisgKiBJbmNyZW1lbnRhbCBidWlsZGVycyBvZiBvbi1kaXNrIHRyaWVzIHdoaWNoIHBhY2tzIHRyaWUgc3RhZ2VzIGludG8gZGlzayBjYWNoZSBwYWdlcy4KKyAqCisgKiBUaGUgaW5jcmVtZW50YWwgY29yZSBpcyBhcyBpbiB7QGxpbmsgSW5jcmVtZW50YWxUcmllV3JpdGVyU2ltcGxlfSwgd2hpY2ggdGhpcyBhdWdtZW50cyBieToKKyAqIDx1bD4KKyAqICAgPGxpPiBjYWxjdWxhdGluZyBicmFuY2ggc2l6ZXMgcmVmbGVjdGluZyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBuZWVkcyB0byBiZSB3cml0dGVuIHRvIHN0b3JlIHRoZSB0cmllCisgKiAgICAgYnJhbmNoIHJvb3RlZCBhdCBlYWNoIG5vZGUKKyAqICAgPGxpPiBkZWxheWluZyB3cml0aW5nIGFueSBwYXJ0IG9mIGEgY29tcGxldGVkIG5vZGUgdW50aWwgaXRzIGJyYW5jaCBzaXplIGlzIGFib3ZlIHRoZSBwYWdlIHNpemUKKyAqICAgPGxpPiBsYXlpbmcgb3V0IChzb21lIG9mKSBpdHMgY2hpbGRyZW4gYnJhbmNoZXMgKGVhY2ggc21hbGxlciB0aGFuIGEgcGFnZSkgdG8gYmUgY29udGFpbmVkIHdpdGhpbiBhIHBhZ2UKKyAqICAgPGxpPiBhZGp1c3RpbmcgdGhlIGJyYW5jaCBzaXplIHRvIHJlZmxlY3QgdGhlIGZhY3QgdGhhdCB0aGUgY2hpbGRyZW4gYXJlIG5vdyB3cml0dGVuIChpLmUuIHJlbW92aW5nIHRoZWlyIHNpemUpCisgKiA8L3VsPgorICogPHA+CisgKiBUaGUgcHJvY2VzcyBpcyBib3R0b20tdXAsIGkuZS4gcGFnZXMgYXJlIHBhY2tlZCBhdCB0aGUgYm90dG9tIGFuZCB0aGUgcm9vdCBwYWdlIGlzIHVzdWFsbHkgc21hbGxlci4KKyAqIFRoaXMgbWF5IGFwcGVhciBsZXNzIGVmZmljaWVudCB0aGFuIGEgdG9wLWRvd24gcHJvY2VzcyB3aGljaCBwdXRzIG1vcmUgaW5mb3JtYXRpb24gaW4gdGhlIHRvcCBwYWdlcyB0aGF0CisgKiB0ZW5kIHRvIHN0YXkgaW4gY2FjaGUsIGJ1dCBpbiBib3RoIGNhc2VzIHBlcmZvcm1pbmcgYSBzZWFyY2ggd2lsbCB1c3VhbGx5IHJlcXVpcmUgYW4gYWRkaXRpb25hbCBkaXNrIHJlYWQKKyAqIGZvciB0aGUgbGVhZiBwYWdlLiBXaGVuIHdlIG1heGltaXplIHRoZSBhbW91bnQgb2YgcmVsZXZhbnQgZGF0YSB0aGF0IHJlYWQgYnJpbmdzIGJ5IHVzaW5nIHRoZSBib3R0b20tdXAKKyAqIHByb2Nlc3MsIHdlIGhhdmUgcHJhY3RpY2FsbHkgdGhlIHNhbWUgZWZmaWNpZW5jeSB3aXRoIHNtYWxsZXIgaW50ZXJtZWRpYXRlIHBhZ2UgZm9vdHByaW50LCBpLmUuIGZld2VyIGRhdGEKKyAqIHRvIGtlZXAgaW4gY2FjaGUuCisgKiA8cD4KKyAqIEFzIGFuIGV4YW1wbGUsIHRha2luZyBhIHNhbXBsZSBwYWdlIHNpemUgZml0dGluZyA0IG5vZGVzLCBhIHNpbXBsZSB0cmllIHdvdWxkIGJlIHNwbGl0IGxpa2UgdGhpczoKKyAqIDxwcmU+CisgKiBOb2RlIDAgfAorICogICAtYS0+IHwgTm9kZSAxCisgKiAgICAgICAgfCAgIC1zLT4gTm9kZSAyCisgKiAgICAgICAgfCAgICAgICAgICAtay0+IE5vZGUgMyAocGF5bG9hZCAxKQorICogICAgICAgIHwgICAgICAgICAgLXMtPiBOb2RlIDQgKHBheWxvYWQgMikKKyAqICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAtYi0+IE5vZGUgNSB8CisgKiAgICAgICAgICAtYS0+IHxOb2RlIDYKKyAqICAgICAgICAgICAgICAgfCAgLW4tPiBOb2RlIDcKKyAqICAgICAgICAgICAgICAgfCAgICAgICAgIC1rLT4gTm9kZSA4IChwYXlsb2FkIDMpCisgKiAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgLXMtPiBOb2RlIDkgKHBheWxvYWQgNCkKKyAqIDwvcHJlPgorICogd2hlcmUgbGluZXMgZGVub3RlIHBhZ2UgYm91bmRhcmllcy4KKyAqIDxwPgorICogVGhlIHByb2Nlc3MgaXRzZWxmIHdpbGwgc3RhcnQgYnkgYWRkaW5nICJhc2siIHdoaWNoIGFkZHMgdGhyZWUgbm9kZXMgYWZ0ZXIgdGhlIHJvb3QgdG8gdGhlIHN0YWNrLiBBZGRpbmcgImFzcyIKKyAqIGNvbXBsZXRlcyBOb2RlIDMsIHNldHRpbmcgaXRzIGJyYW5jaCBhIHNpemUgb2YgMSBhbmQgcmVwbGFjZXMgaXQgb24gdGhlIHN0YWNrIHdpdGggTm9kZSA0LgorICogVGhlIHN0ZXAgb2YgYWRkaW5nICJiYW5rIiBzdGFydHMgYnkgY29tcGxldGluZyBOb2RlIDQgKHNpemUgMSksIE5vZGUgMiAoc2l6ZSAzKSwgTm9kZSAxIChzaXplIDQpLCB0aGVuIGFkZHMgNCBtb3JlCisgKiBub2RlcyB0byB0aGUgc3RhY2suIEFkZGluZyAiYmFua3MiIGRlc2NlbmRzIG9uZSBtb3JlIG5vZGUuCisgKiA8cD4KKyAqIFRoZSB0cmllIGNvbXBsZXRpb24gc3RlcCBjb21wbGV0ZXMgbm9kZXMgOSAoc2l6ZSAxKSwgOCAoc2l6ZSAyKSwgNyAoc2l6ZSAzKSwgNiAoc2l6ZSA0KSwgNSAoc2l6ZSA1KS4gU2luY2UgdGhlIHNpemUKKyAqIG9mIG5vZGUgNSBpcyBhYm92ZSB0aGUgcGFnZSBzaXplLCB0aGUgYWxnb3JpdGhtIGxheXMgb3V0IGl0cyBjaGlsZHJlbi4gTm9kZXMgNiwgNywgOCwgOSBhcmUgd3JpdHRlbiBpbiBvcmRlci4gVGhlCisgKiBzaXplIG9mIG5vZGUgNSBpcyBub3cganVzdCB0aGUgc2l6ZSBvZiBpdCBpbmRpdmlkdWFsbHksIDEuIFRoZSBwcm9jZXNzIGNvbnRpbnVlcyB3aXRoIGNvbXBsZXRpbmcgTm9kZSAwIChzaXplIDYpLgorICogVGhpcyBpcyBiaWdnZXIgdGhhbiB0aGUgcGFnZSBzaXplLCBzbyBzb21lIG9mIGl0cyBjaGlsZHJlbiBuZWVkIHRvIGJlIHdyaXR0ZW4uIFRoZSBhbGdvcml0aG0gdGFrZXMgdGhlIGxhcmdlc3QsCisgKiBOb2RlIDEsIGFuZCBsYXlzIGl0IG91dCB3aXRoIGl0cyBjaGlsZHJlbiBpbiB0aGUgZmlsZS4gTm9kZSAwIG5vdyBoYXMgYW4gYWRqdXN0ZWQgc2l6ZSBvZiAyIHdoaWNoIGlzIGJlbG93IHRoZQorICogcGFnZSBzaXplLCBhbmQgd2UgY2FuIGNvbnRpbnVlIHRoZSBwcm9jZXNzLgorICogPHA+CisgKiBTaW5jZSB0aGlzIHdhcyB0aGUgcm9vdCBvZiB0aGUgdHJpZSwgdGhlIGN1cnJlbnQgcGFnZSBpcyBwYWRkZWQgYW5kIHRoZSByZW1haW5pbmcgbm9kZXMgMCwgNSBhcmUgd3JpdHRlbi4KKyAqLworQE5vdFRocmVhZFNhZmUKK3B1YmxpYyBjbGFzcyBJbmNyZW1lbnRhbFRyaWVXcml0ZXJQYWdlQXdhcmU8VkFMVUU+CitleHRlbmRzIEluY3JlbWVudGFsVHJpZVdyaXRlckJhc2U8VkFMVUUsIERhdGFPdXRwdXRQbHVzLCBJbmNyZW1lbnRhbFRyaWVXcml0ZXJQYWdlQXdhcmUuTm9kZTxWQUxVRT4+CitpbXBsZW1lbnRzIEluY3JlbWVudGFsVHJpZVdyaXRlcjxWQUxVRT4KK3sKKyAgICBmaW5hbCBpbnQgbWF4Qnl0ZXNQZXJQYWdlOworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQ29tcGFyYXRvcjxOb2RlPD8+PiBCUkFOQ0hfU0laRV9DT01QQVJBVE9SID0gKGwsIHIpIC0+CisgICAgeworICAgICAgICAvLyBTbWFsbGVyIGJyYW5jaGVzIGZpcnN0LgorICAgICAgICBpbnQgYyA9IEludGVnZXIuY29tcGFyZShsLmJyYW5jaFNpemUgKyBsLm5vZGVTaXplLCByLmJyYW5jaFNpemUgKyByLm5vZGVTaXplKTsKKyAgICAgICAgaWYgKGMgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBjOworCisgICAgICAgIC8vIFRoZW4gb3JkZXIgYnkgY2hhcmFjdGVyLCB3aGljaCBzZXJ2ZXMgc2V2ZXJhbCBwdXJwb3NlczoKKyAgICAgICAgLy8gLSBlbmZvcmNlcyBpbmVxdWFsaXR5IHRvIG1ha2Ugc3VyZSBlcXVhbCBzaXplcyBhcmVuJ3QgdHJlYXRlZCBhcyBkdXBsaWNhdGVzLAorICAgICAgICAvLyAtIG1ha2VzIHN1cmUgdGhlIGl0ZW0gd2UgdXNlIGZvciBjb21wYXJpc29uIGtleSBjb21lcyBncmVhdGVyIHRoYW4gYWxsIGVxdWFsLXNpemVkIG5vZGVzLAorICAgICAgICAvLyAtIG9yZGVycyBlcXVhbCBzaXplZCBpdGVtcyBzbyB0aGF0IG1vc3QgcmVjZW50bHkgcHJvY2Vzc2VkIChhbmQgcG90ZW50aWFsbHkgaGF2aW5nIGNsb3NlciBjaGlsZHJlbikgY29tZXMKKyAgICAgICAgLy8gICBsYXN0IGFuZCBpcyB0aHVzIHRoZSBmaXJzdCBvbmUgcGlja2VkIGZvciBsYXlvdXQuCisgICAgICAgIGMgPSBJbnRlZ2VyLmNvbXBhcmUobC50cmFuc2l0aW9uLCByLnRyYW5zaXRpb24pOworCisgICAgICAgIGFzc2VydCBjICE9IDAgfHwgbCA9PSByOworICAgICAgICByZXR1cm4gYzsKKyAgICB9OworCisgICAgSW5jcmVtZW50YWxUcmllV3JpdGVyUGFnZUF3YXJlKFRyaWVTZXJpYWxpemVyPFZBTFVFLCA/IHN1cGVyIERhdGFPdXRwdXRQbHVzPiB0cmllU2VyaWFsaXplciwgRGF0YU91dHB1dFBsdXMgZGVzdCkKKyAgICB7CisgICAgICAgIHN1cGVyKHRyaWVTZXJpYWxpemVyLCBkZXN0LCBuZXcgTm9kZTw+KChieXRlKSAwKSk7CisgICAgICAgIHRoaXMubWF4Qnl0ZXNQZXJQYWdlID0gZGVzdC5tYXhCeXRlc0luUGFnZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKKyAgICB7CisgICAgICAgIHJlc2V0KG5ldyBOb2RlPD4oKGJ5dGUpIDApKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBOb2RlPFZBTFVFPiBwZXJmb3JtQ29tcGxldGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgTm9kZTxWQUxVRT4gcm9vdCA9IHN1cGVyLnBlcmZvcm1Db21wbGV0aW9uKCk7CisKKyAgICAgICAgaW50IGFjdHVhbFNpemUgPSByZWNhbGNUb3RhbFNpemUocm9vdCwgZGVzdC5wb3NpdGlvbigpKTsKKyAgICAgICAgaW50IGJ5dGVzTGVmdCA9IGRlc3QuYnl0ZXNMZWZ0SW5QYWdlKCk7CisgICAgICAgIGlmIChhY3R1YWxTaXplID4gYnl0ZXNMZWZ0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYWN0dWFsU2l6ZSA8PSBtYXhCeXRlc1BlclBhZ2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGVzdC5wYWRUb1BhZ2VCb3VuZGFyeSgpOworICAgICAgICAgICAgICAgIGJ5dGVzTGVmdCA9IG1heEJ5dGVzUGVyUGFnZTsKKyAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiBjaGFuZ2VkLCByZWNhbGN1bGF0ZSBhZ2FpbgorICAgICAgICAgICAgICAgIGFjdHVhbFNpemUgPSByZWNhbGNUb3RhbFNpemUocm9vdCwgZGVzdC5wb3NpdGlvbigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGFjdHVhbFNpemUgPiBieXRlc0xlZnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gU3RpbGwgZ3JlYXRlci4gTGF5IG91dCBjaGlsZHJlbiBzZXBhcmF0ZWx5LgorICAgICAgICAgICAgICAgIGxheW91dENoaWxkcmVuKHJvb3QpOworCisgICAgICAgICAgICAgICAgLy8gUGFkIGlmIG5lZWRlZCBhbmQgcGxhY2UuCisgICAgICAgICAgICAgICAgaWYgKHJvb3Qubm9kZVNpemUgPiBkZXN0LmJ5dGVzTGVmdEluUGFnZSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzdC5wYWRUb1BhZ2VCb3VuZGFyeSgpOworICAgICAgICAgICAgICAgICAgICAvLyBSZWNhbGN1bGF0ZSBhZ2FpbiBhcyBwb2ludGVyIHNpemUgbWF5IGhhdmUgY2hhbmdlZCwgdHJpZ2dlcmluZyBhc3NlcnRpb24gaW4gd3JpdGVSZWN1cnNpdmUuCisgICAgICAgICAgICAgICAgICAgIHJlY2FsY1RvdGFsU2l6ZShyb290LCBkZXN0LnBvc2l0aW9uKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgcm9vdC5maW5hbGl6ZVdpdGhQb3NpdGlvbih3cml0ZShyb290KSk7CisgICAgICAgIHJldHVybiByb290OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgY29tcGxldGUoTm9kZTxWQUxVRT4gbm9kZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBhc3NlcnQgbm9kZS5maWxlUG9zID09IC0xOworCisgICAgICAgIGludCBicmFuY2hTaXplID0gMDsKKyAgICAgICAgZm9yIChOb2RlPFZBTFVFPiBjaGlsZCA6IG5vZGUuY2hpbGRyZW4pCisgICAgICAgICAgICBicmFuY2hTaXplICs9IGNoaWxkLmJyYW5jaFNpemUgKyBjaGlsZC5ub2RlU2l6ZTsKKworICAgICAgICBub2RlLmJyYW5jaFNpemUgPSBicmFuY2hTaXplOworCisgICAgICAgIGludCBub2RlU2l6ZSA9IHNlcmlhbGl6ZXIuc2l6ZW9mTm9kZShub2RlLCBkZXN0LnBvc2l0aW9uKCkpOworICAgICAgICBpZiAobm9kZVNpemUgKyBicmFuY2hTaXplIDwgbWF4Qnl0ZXNQZXJQYWdlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBHb29kLiBUaGlzIG5vZGUgYW5kIGFsbCBjaGlsZHJlbiB3aWxsIChtb3N0IHByb2JhYmx5KSBmaXQgcGFnZS4KKyAgICAgICAgICAgIG5vZGUubm9kZVNpemUgPSBub2RlU2l6ZTsKKyAgICAgICAgICAgIG5vZGUuaGFzT3V0T2ZQYWdlQ2hpbGRyZW4gPSBmYWxzZTsKKyAgICAgICAgICAgIG5vZGUuaGFzT3V0T2ZQYWdlSW5CcmFuY2ggPSBmYWxzZTsKKworICAgICAgICAgICAgZm9yIChOb2RlPFZBTFVFPiBjaGlsZCA6IG5vZGUuY2hpbGRyZW4pCisgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmZpbGVQb3MgIT0gLTEpCisgICAgICAgICAgICAgICAgICAgIG5vZGUuaGFzT3V0T2ZQYWdlQ2hpbGRyZW4gPSB0cnVlOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkLmhhc091dE9mUGFnZUNoaWxkcmVuIHx8IGNoaWxkLmhhc091dE9mUGFnZUluQnJhbmNoKQorICAgICAgICAgICAgICAgICAgICBub2RlLmhhc091dE9mUGFnZUluQnJhbmNoID0gdHJ1ZTsKKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2Fubm90IGZpdC4gTGF5IG91dCBjaGlsZHJlbjsgVGhlIGN1cnJlbnQgbm9kZSB3aWxsIGJlIG1hcmtlZCBhcyBvbmUgd2l0aCBvdXQtb2YtcGFnZSBjaGlsZHJlbi4KKyAgICAgICAgbGF5b3V0Q2hpbGRyZW4obm9kZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxheW91dENoaWxkcmVuKE5vZGU8VkFMVUU+IG5vZGUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgYXNzZXJ0IG5vZGUuZmlsZVBvcyA9PSAtMTsKKworICAgICAgICBOYXZpZ2FibGVTZXQ8Tm9kZTxWQUxVRT4+IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZHJlbldpdGhVbnNldFBvc2l0aW9uKCk7CisKKyAgICAgICAgaW50IGJ5dGVzTGVmdCA9IGRlc3QuYnl0ZXNMZWZ0SW5QYWdlKCk7CisgICAgICAgIE5vZGU8VkFMVUU+IGNtcCA9IG5ldyBOb2RlPD4oMjU2KTsgLy8gZ29lcyBhZnRlciBhbGwgZXF1YWwtc2l6ZWQgdW5wbGFjZWQgbm9kZXMgKHdob3NlIHRyYW5zaXRpb24gY2hhcmFjdGVyIGlzIDAtMjU1KQorICAgICAgICBjbXAubm9kZVNpemUgPSAwOworICAgICAgICB3aGlsZSAoIWNoaWxkcmVuLmlzRW1wdHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgY21wLmJyYW5jaFNpemUgPSBieXRlc0xlZnQ7CisgICAgICAgICAgICBOb2RlPFZBTFVFPiBjaGlsZCA9IGNoaWxkcmVuLmhlYWRTZXQoY21wLCB0cnVlKS5wb2xsTGFzdCgpOyAgICAvLyBncmFiIGJpZ2dlc3QgdGhhdCBjb3VsZCBmaXQKKyAgICAgICAgICAgIGlmIChjaGlsZCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRlc3QucGFkVG9QYWdlQm91bmRhcnkoKTsKKyAgICAgICAgICAgICAgICBieXRlc0xlZnQgPSBtYXhCeXRlc1BlclBhZ2U7CisgICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZHJlbi5wb2xsTGFzdCgpOyAgICAgICAvLyBqdXN0IGJpZ2dlc3QKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXNzZXJ0IGNoaWxkICE9IG51bGw7CisgICAgICAgICAgICBpZiAoY2hpbGQuaGFzT3V0T2ZQYWdlQ2hpbGRyZW4gfHwgY2hpbGQuaGFzT3V0T2ZQYWdlSW5CcmFuY2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gV2UgZGlkbid0IGtub3cgd2hhdCBzaXplIHRoaXMgYnJhbmNoIHdpbGwgYWN0dWFsbHkgbmVlZCB0byBiZSwgbm9kZSdzIGNoaWxkcmVuIG1heSBiZSBmYXIuCisgICAgICAgICAgICAgICAgLy8gV2Ugbm93IGtub3cgd2hlcmUgd2Ugd291bGQgcGxhY2UgaXQsIHNvIGxldCdzIHJlZXZhbHVhdGUgc2l6ZS4KKyAgICAgICAgICAgICAgICBpbnQgYWN0dWFsU2l6ZSA9IHJlY2FsY1RvdGFsU2l6ZShjaGlsZCwgZGVzdC5wb3NpdGlvbigpKTsKKyAgICAgICAgICAgICAgICBpZiAoYWN0dWFsU2l6ZSA+IGJ5dGVzTGVmdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc0xlZnQgPT0gbWF4Qnl0ZXNQZXJQYWdlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBCcmFuY2ggZG9lc24ndCBldmVuIGZpdCBpbiBhIHBhZ2UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IEluIHRoaXMgc2l0dWF0aW9uIHdlIGFyZW4ndCBhY3R1YWxseSBtYWtpbmcgdGhlIGJlc3QgY2hvaWNlIGFzIHRoZSBsYXlvdXQgc2hvdWxkIGhhdmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2VuIHBsYWNlIGF0IHRoZSBjaGlsZCAod2hpY2ggY291bGQgaGF2ZSBtYWRlIHRoZSBjdXJyZW50IHBhcmVudCBzbWFsbCBlbm91Z2ggdG8gZml0KS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgbm90IHRyaXZpYWwgdG8gZml4IGJ1dCBzaG91bGQgYmUgdmVyeSByYXJlLgorCisgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRDaGlsZHJlbihjaGlsZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc0xlZnQgPSBkZXN0LmJ5dGVzTGVmdEluUGFnZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgKGNoaWxkLmZpbGVQb3MgPT0gLTEpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRG9lc24ndCBmaXQsIGJ1dCB0aGF0J3MgcHJvYmFibHkgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGEgZnVsbCBwYWdlLiBQdXQgaXQgYmFjayB3aXRoIHRoZSBuZXcKKyAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBhbmQgcmV0cnkgd2hlbiB3ZSBkbyBoYXZlIGVub3VnaCBzcGFjZS4KKyAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4uYWRkKGNoaWxkKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjaGlsZC5maW5hbGl6ZVdpdGhQb3NpdGlvbih3cml0ZShjaGlsZCkpOworICAgICAgICAgICAgYnl0ZXNMZWZ0ID0gZGVzdC5ieXRlc0xlZnRJblBhZ2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZSBzaXppbmcgYmVsb3cgd2lsbCB1c2UgdGhlIGJyYW5jaCBzaXplLCBzbyBtYWtlIHN1cmUgaXQncyBzZXQuCisgICAgICAgIG5vZGUuYnJhbmNoU2l6ZSA9IDA7CisgICAgICAgIG5vZGUuaGFzT3V0T2ZQYWdlQ2hpbGRyZW4gPSB0cnVlOworICAgICAgICBub2RlLmhhc091dE9mUGFnZUluQnJhbmNoID0gZmFsc2U7CisgICAgICAgIG5vZGUubm9kZVNpemUgPSBzZXJpYWxpemVyLnNpemVvZk5vZGUobm9kZSwgZGVzdC5wb3NpdGlvbigpKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiRHVwbGljYXRlZENvZGUiKSAvLyBpbnRlbnRpb25hbGx5IGR1cGxpY2F0ZWQgaW4gSW5jcmVtZW50YWxEZWVwVHJpZVdyaXRlclBhZ2VBd2FyZQorICAgIHByb3RlY3RlZCBpbnQgcmVjYWxjVG90YWxTaXplKE5vZGU8VkFMVUU+IG5vZGUsIGxvbmcgbm9kZVBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChub2RlLmhhc091dE9mUGFnZUluQnJhbmNoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc3ogPSAwOworICAgICAgICAgICAgZm9yIChOb2RlPFZBTFVFPiBjaGlsZCA6IG5vZGUuY2hpbGRyZW4pCisgICAgICAgICAgICAgICAgc3ogKz0gcmVjYWxjVG90YWxTaXplKGNoaWxkLCBub2RlUG9zaXRpb24gKyBzeik7CisgICAgICAgICAgICBub2RlLmJyYW5jaFNpemUgPSBzejsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZSBzaXppbmcgYmVsb3cgd2lsbCB1c2UgdGhlIGJyYW5jaCBzaXplIGNhbGN1bGF0ZWQgYWJvdmUuIFNpbmNlIHRoYXQgY2FuIGNoYW5nZSBvbiBvdXQtb2YtcGFnZSBpbiBicmFuY2gsCisgICAgICAgIC8vIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIHNpemUgaWYgZWl0aGVyIGZsYWcgaXMgc2V0LgorICAgICAgICBpZiAobm9kZS5oYXNPdXRPZlBhZ2VDaGlsZHJlbiB8fCBub2RlLmhhc091dE9mUGFnZUluQnJhbmNoKQorICAgICAgICAgICAgbm9kZS5ub2RlU2l6ZSA9IHNlcmlhbGl6ZXIuc2l6ZW9mTm9kZShub2RlLCBub2RlUG9zaXRpb24gKyBub2RlLmJyYW5jaFNpemUpOworCisgICAgICAgIHJldHVybiBub2RlLmJyYW5jaFNpemUgKyBub2RlLm5vZGVTaXplOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJEdXBsaWNhdGVkQ29kZSIpIC8vIGludGVudGlvbmFsbHkgZHVwbGljYXRlZCBpbiBJbmNyZW1lbnRhbERlZXBUcmllV3JpdGVyUGFnZUF3YXJlCisgICAgcHJvdGVjdGVkIGxvbmcgd3JpdGUoTm9kZTxWQUxVRT4gbm9kZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBsb25nIG5vZGVQb3NpdGlvbiA9IGRlc3QucG9zaXRpb24oKTsKKyAgICAgICAgZm9yIChOb2RlPFZBTFVFPiBjaGlsZCA6IG5vZGUuY2hpbGRyZW4pCisgICAgICAgICAgICBpZiAoY2hpbGQuZmlsZVBvcyA9PSAtMSkKKyAgICAgICAgICAgICAgICBjaGlsZC5maWxlUG9zID0gd3JpdGUoY2hpbGQpOworCisgICAgICAgIG5vZGVQb3NpdGlvbiArPSBub2RlLmJyYW5jaFNpemU7CisgICAgICAgIGFzc2VydCBkZXN0LnBvc2l0aW9uKCkgPT0gbm9kZVBvc2l0aW9uCisgICAgICAgICAgICAgICAgOiAiRXhwZWN0ZWQgbm9kZSBwb3NpdGlvbiB0byBiZSAiICsgbm9kZVBvc2l0aW9uICsgIiBidXQgZ290ICIgKyBkZXN0LnBvc2l0aW9uKCkgKyAiIGFmdGVyIHdyaXRpbmcgY2hpbGRyZW4uXG4iICsgZHVtcE5vZGUobm9kZSwgZGVzdC5wb3NpdGlvbigpKTsKKworICAgICAgICBzZXJpYWxpemVyLndyaXRlKGRlc3QsIG5vZGUsIG5vZGVQb3NpdGlvbik7CisKKyAgICAgICAgYXNzZXJ0IGRlc3QucG9zaXRpb24oKSA9PSBub2RlUG9zaXRpb24gKyBub2RlLm5vZGVTaXplCisgICAgICAgICAgICAgICAgfHwgZGVzdC5wYWRkZWRQb3NpdGlvbigpID09IGRlc3QucG9zaXRpb24oKSAvLyBGb3IgUGFydGl0aW9uSW5kZXhUZXN0LnRlc3RQb2ludGVyR3Jvd3RoIHdoZXJlIHBvc2l0aW9uIG1heSBqdW1wIG9uIHBhZ2UgYm91bmRhcmllcy4KKyAgICAgICAgICAgICAgICA6ICJFeHBlY3RlZCBub2RlIHBvc2l0aW9uIHRvIGJlICIgKyAobm9kZVBvc2l0aW9uICsgbm9kZS5ub2RlU2l6ZSkgKyAiIGJ1dCBnb3QgIiArIGRlc3QucG9zaXRpb24oKSArICIgYWZ0ZXIgd3JpdGluZyBub2RlLCBub2RlU2l6ZSAiICsgbm9kZS5ub2RlU2l6ZSArICIuXG4iICsgZHVtcE5vZGUobm9kZSwgbm9kZVBvc2l0aW9uKTsKKyAgICAgICAgcmV0dXJuIG5vZGVQb3NpdGlvbjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGR1bXBOb2RlKE5vZGU8VkFMVUU+IG5vZGUsIGxvbmcgbm9kZVBvc2l0aW9uKQorICAgIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXMgPSBuZXcgU3RyaW5nQnVpbGRlcihTdHJpbmcuZm9ybWF0KCJBdCAlLGQoJXgpIHR5cGUgJXMgY2hpbGQgY291bnQgJXMgbm9kZVNpemUgJSxkIGJyYW5jaFNpemUgJSxkICVzJXMlbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlUG9zaXRpb24sIG5vZGVQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWVOb2RlLnR5cGVGb3Iobm9kZSwgbm9kZVBvc2l0aW9uKSwgbm9kZS5jaGlsZENvdW50KCksIG5vZGUubm9kZVNpemUsIG5vZGUuYnJhbmNoU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuaGFzT3V0T2ZQYWdlQ2hpbGRyZW4gPyAiQyIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuaGFzT3V0T2ZQYWdlSW5CcmFuY2ggPyAiQiIgOiAiIikpOworICAgICAgICBmb3IgKE5vZGU8VkFMVUU+IGNoaWxkIDogbm9kZS5jaGlsZHJlbikKKyAgICAgICAgICAgIHJlcy5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiQ2hpbGQgJTJ4IGF0ICUsZCgleCkgdHlwZSAlcyBjaGlsZCBjb3VudCAlcyBzaXplICVzIG5vZGVTaXplICUsZCBicmFuY2hTaXplICUsZCAlcyVzJW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnRyYW5zaXRpb24gJiAweEZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmZpbGVQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZmlsZVBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5jaGlsZHJlbiAhPSBudWxsID8gVHJpZU5vZGUudHlwZUZvcihjaGlsZCwgY2hpbGQuZmlsZVBvcykgOiAibi9hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5jaGlsZHJlbiAhPSBudWxsID8gY2hpbGQuY2hpbGRDb3VudCgpIDogIm4vYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuY2hpbGRyZW4gIT0gbnVsbCA/IHNlcmlhbGl6ZXIuc2l6ZW9mTm9kZShjaGlsZCwgY2hpbGQuZmlsZVBvcykgOiAibi9hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5ub2RlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5icmFuY2hTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmhhc091dE9mUGFnZUNoaWxkcmVuID8gIkMiIDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuaGFzT3V0T2ZQYWdlSW5CcmFuY2ggPyAiQiIgOiAiIikpOworCisgICAgICAgIHJldHVybiByZXMudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUGFydGlhbFRhaWwgbWFrZVBhcnRpYWxSb290KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdCB0aGUgcGFydGlhbCB0YWlsIHdpbGwgYmUgaW4gbWVtb3J5LCBzbyB3ZSBkb24ndCBib3RoZXIgd2l0aCBwYWdlLWZpdHRpbmcuCisgICAgICAgIC8vIFdlIGNvdWxkIGFsc28gc2VuZCBzb21lIGNvbXBsZXRlZCBjaGlsZHJlbiB0byBkaXNrLCBidXQgdGhhdCBjb3VsZCBtYWtlIHN1Ym9wdGltYWwgbGF5b3V0IGNob2ljZXMsIHNvIHdlJ2QKKyAgICAgICAgLy8gcmF0aGVyIG5vdC4gSnVzdCB3cml0ZSBhbnl0aGluZyBub3Qgd3JpdHRlbiB5ZXQgdG8gYSBidWZmZXIsIGZyb20gYm90dG9tIHRvIHRvcCwgYW5kIHdlJ3JlIGRvbmUuCisgICAgICAgIHRyeSAoRGF0YU91dHB1dEJ1ZmZlciBidWYgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlcigpKQorICAgICAgICB7CisgICAgICAgICAgICBQVGFpbCB0YWlsID0gbmV3IFBUYWlsKCk7CisgICAgICAgICAgICAvLyBSZWFkZXJzIGFzayByZWJ1ZmZlcmVycyBmb3IgcGFnZS1hbGlnbmVkIHBvc2l0aW9ucywgc28gbWFrZSBzdXJlIHRhaWwgc3RhcnRzIGF0IG9uZS4KKyAgICAgICAgICAgIC8vICJQYWRkaW5nIiBvZiB0aGUgY3V0b2ZmIHBvaW50IG1heSBsZWF2ZSBzb21lIHVuYWRkcmVzc2FibGUgc3BhY2UgaW4gdGhlIGNvbnN0cnVjdGVkIGZpbGUgdmlldy4KKyAgICAgICAgICAgIC8vIE5vdGhpbmcgd2lsbCBwb2ludCB0byBpdCwgdGhvdWdoLCBzbyB0aGF0J3MgZmluZS4KKyAgICAgICAgICAgIHRhaWwuY3V0b2ZmID0gZGVzdC5wYWRkZWRQb3NpdGlvbigpOworICAgICAgICAgICAgdGFpbC5jb3VudCA9IGNvdW50OworICAgICAgICAgICAgdGFpbC5yb290ID0gd3JpdGVQYXJ0aWFsKHN0YWNrLmdldEZpcnN0KCksIGJ1ZiwgdGFpbC5jdXRvZmYpOworICAgICAgICAgICAgdGFpbC50YWlsID0gYnVmLmFzTmV3QnVmZmVyKCk7CisgICAgICAgICAgICByZXR1cm4gdGFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJEdXBsaWNhdGVkQ29kZSIpIC8vIGludGVudGlvbmFsbHkgZHVwbGljYXRlZCBpbiBJbmNyZW1lbnRhbERlZXBUcmllV3JpdGVyUGFnZUF3YXJlCisgICAgcHJvdGVjdGVkIGxvbmcgd3JpdGVQYXJ0aWFsKE5vZGU8VkFMVUU+IG5vZGUsIERhdGFPdXRwdXRQbHVzIGRlc3QsIGxvbmcgYmFzZU9mZnNldCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBsb25nIHN0YXJ0UG9zaXRpb24gPSBkZXN0LnBvc2l0aW9uKCkgKyBiYXNlT2Zmc2V0OworCisgICAgICAgIExpc3Q8Tm9kZTxWQUxVRT4+IGNoaWxkcmVuVG9DbGVhciA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKE5vZGU8VkFMVUU+IGNoaWxkIDogbm9kZS5jaGlsZHJlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNoaWxkLmZpbGVQb3MgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hpbGRyZW5Ub0NsZWFyLmFkZChjaGlsZCk7CisgICAgICAgICAgICAgICAgY2hpbGQuZmlsZVBvcyA9IHdyaXRlUGFydGlhbChjaGlsZCwgZGVzdCwgYmFzZU9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsb25nIG5vZGVQb3NpdGlvbiA9IGRlc3QucG9zaXRpb24oKSArIGJhc2VPZmZzZXQ7CisKKyAgICAgICAgaWYgKG5vZGUuaGFzT3V0T2ZQYWdlSW5CcmFuY2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgYnJhbmNoIHNpemUgd2l0aCB0aGUgc2l6ZSBvZiB3aGF0IHdlIGhhdmUganVzdCB3cml0dGVuLiBUaGlzIG1heSBiZSB1c2VkIGJ5IHRoZSBub2RlJ3MKKyAgICAgICAgICAgIC8vIG1heFBvc2l0aW9uRGVsdGEsIGFuZCBpdCdzIGEgYmV0dGVyIGFwcHJveGltYXRpb24gZm9yIGxhdGVyIGZpdHRpbmcgY2FsY3VsYXRpb25zLgorICAgICAgICAgICAgbm9kZS5icmFuY2hTaXplID0gKGludCkgKG5vZGVQb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgc2VyaWFsaXplci53cml0ZShkZXN0LCBub2RlLCBub2RlUG9zaXRpb24pOworCisgICAgICAgIGlmIChub2RlLmhhc091dE9mUGFnZUNoaWxkcmVuIHx8IG5vZGUuaGFzT3V0T2ZQYWdlSW5CcmFuY2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbm9kZSBzaXplIHdpdGggd2hhdCB3ZSBoYXZlIGp1c3Qgc2Vlbi4gSXQncyBhIGJldHRlciBhcHByb3hpbWF0aW9uIGZvciBsYXRlciBmaXR0aW5nCisgICAgICAgICAgICAvLyBjYWxjdWxhdGlvbnMuCisgICAgICAgICAgICBsb25nIGVuZFBvc2l0aW9uID0gZGVzdC5wb3NpdGlvbigpICsgYmFzZU9mZnNldDsKKyAgICAgICAgICAgIG5vZGUubm9kZVNpemUgPSAoaW50KSAoZW5kUG9zaXRpb24gLSBub2RlUG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChOb2RlPFZBTFVFPiBjaGlsZCA6IGNoaWxkcmVuVG9DbGVhcikKKyAgICAgICAgICAgIGNoaWxkLmZpbGVQb3MgPSAtMTsKKyAgICAgICAgcmV0dXJuIG5vZGVQb3NpdGlvbjsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTm9kZTxWYWx1ZT4gZXh0ZW5kcyBJbmNyZW1lbnRhbFRyaWVXcml0ZXJCYXNlLkJhc2VOb2RlPFZhbHVlLCBOb2RlPFZhbHVlPj4KKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDdXJyZW50bHkgY2FsY3VsYXRlZCBzaXplIG9mIHRoZSBicmFuY2ggYmVsb3cgdGhpcyBub2RlLCBub3QgaW5jbHVkaW5nIHRoZSBub2RlIGl0c2VsZi4KKyAgICAgICAgICogSWYgaGFzT3V0T2ZQYWdlSW5CcmFuY2ggaXMgdHJ1ZSwgdGhpcyBtYXkgYmUgdW5kZXJlc3RpbWF0ZWQgYXMgdGhlIHNpemUKKyAgICAgICAgICogZGVwZW5kcyBvbiB0aGUgcG9zaXRpb24gdGhlIGJyYW5jaCBpcyB3cml0dGVuLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IGJyYW5jaFNpemUgPSAtMTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEN1cnJlbnRseSBjYWxjdWxhdGVkIG5vZGUgc2l6ZS4gSWYgaGFzT3V0T2ZQYWdlQ2hpbGRyZW4gaXMgdHJ1ZSwgdGhpcyBtYXkgYmUgdW5kZXJlc3RpbWF0ZWQgYXMgdGhlIHNpemUKKyAgICAgICAgICogZGVwZW5kcyBvbiB0aGUgcG9zaXRpb24gdGhlIG5vZGUgaXMgd3JpdHRlbi4KKyAgICAgICAgICovCisgICAgICAgIGludCBub2RlU2l6ZSA9IC0xOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXaGV0aGVyIHRoZXJlIGlzIGFuIG91dC1vZi1wYWdlLCBhbHJlYWR5IHdyaXR0ZW4gbm9kZSBpbiB0aGUgYnJhbmNoZXMgYmVsb3cgdGhlIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUKKyAgICAgICAgICogbm9kZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gaGFzT3V0T2ZQYWdlSW5CcmFuY2ggPSBmYWxzZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZXRoZXIgYSBjaGlsZCBvZiB0aGUgbm9kZSBpcyBvdXQgb2YgcGFnZSwgYWxyZWFkeSB3cml0dGVuLgorICAgICAgICAgKiBGb3JjZWQgdG8gdHJ1ZSBiZWZvcmUgYmVpbmcgc2V0IHRvIG1ha2Ugc3VyZSBtYXhQb3NpdGlvbkRlbHRhIHBlcmZvcm1zIGl0cyBldmFsdWF0aW9uIG9uIG5vbi1jb21wbGV0ZWQKKyAgICAgICAgICogbm9kZXMgZm9yIG1ha2VQYXJ0aWFsUm9vdC4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gaGFzT3V0T2ZQYWdlQ2hpbGRyZW4gPSB0cnVlOworCisgICAgICAgIE5vZGUoaW50IHRyYW5zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKHRyYW5zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIE5vZGU8VmFsdWU+IG5ld05vZGUoYnl0ZSB0cmFuc2l0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE5vZGU8Pih0cmFuc2l0aW9uICYgMHhGRik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBzZXJpYWxpemVkUG9zaXRpb25EZWx0YShpbnQgaSwgbG9uZyBub2RlUG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCAoY2hpbGRyZW4uZ2V0KGkpLmZpbGVQb3MgIT0gLTEpOworICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuLmdldChpKS5maWxlUG9zIC0gbm9kZVBvc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBtYXggZGVsdGEgaXMgdGhlIGRlbHRhIHdpdGggZWl0aGVyOgorICAgICAgICAgKiAtIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgZmlyc3QgY2hpbGQgbm90LXlldC1wbGFjZWQgY2hpbGQgd2lsbCBiZSBsYWlkIG91dC4KKyAgICAgICAgICogLSB0aGUgcG9zaXRpb24gb2YgdGhlIGZ1cnRoZXN0IGNoaWxkIHRoYXQgaXMgYWxyZWFkeSBwbGFjZWQuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGFzc3VtZXMgYWxsIGNoaWxkcmVuJ3MgYnJhbmNoIGFuZCBub2RlIHNpemVzLCBhcyB3ZWxsIGFzIHRoaXMgbm9kZSdzIGJyYW5jaFNpemUsIGFyZSBhbHJlYWR5CisgICAgICAgICAqIGNhbGN1bGF0ZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgbG9uZyBtYXhQb3NpdGlvbkRlbHRhKGxvbmcgbm9kZVBvc2l0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGUgbWF4IGRlbHRhIGlzIHRoZSBwb3NpdGlvbiB0aGUgZmlyc3QgY2hpbGQgd291bGQgYmUgbGFpZCBvdXQuCisgICAgICAgICAgICBhc3NlcnQgKGNoaWxkQ291bnQoKSA+IDApOworCisgICAgICAgICAgICBpZiAoIWhhc091dE9mUGFnZUNoaWxkcmVuKQorICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYmUgYWJsZSB0byBhZGRyZXNzIHRoZSBmaXJzdCBjaGlsZC4gV2UgZG9uJ3QgbmVlZCB0byBjb3ZlciBpdHMgYnJhbmNoLCB0aG91Z2guCisgICAgICAgICAgICAgICAgcmV0dXJuIC0oYnJhbmNoU2l6ZSAtIGNoaWxkcmVuLmdldCgwKS5icmFuY2hTaXplKTsKKworICAgICAgICAgICAgbG9uZyBtaW5QbGFjZWQgPSAwOworICAgICAgICAgICAgbG9uZyBtaW5VbnBsYWNlZCA9IDE7CisgICAgICAgICAgICBmb3IgKE5vZGU8VmFsdWU+IGNoaWxkIDogY2hpbGRyZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmZpbGVQb3MgIT0gLTEpCisgICAgICAgICAgICAgICAgICAgIG1pblBsYWNlZCA9IE1hdGgubWluKG1pblBsYWNlZCwgY2hpbGQuZmlsZVBvcyAtIG5vZGVQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobWluVW5wbGFjZWQgPiAwKSAgIC8vIHRyaWdnZXJzIG9uY2UKKyAgICAgICAgICAgICAgICAgICAgbWluVW5wbGFjZWQgPSAtKGJyYW5jaFNpemUgLSBjaGlsZC5icmFuY2hTaXplKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKG1pblBsYWNlZCwgbWluVW5wbGFjZWQpOworICAgICAgICB9CisKKyAgICAgICAgTmF2aWdhYmxlU2V0PE5vZGU8VmFsdWU+PiBnZXRDaGlsZHJlbldpdGhVbnNldFBvc2l0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgTmF2aWdhYmxlU2V0PE5vZGU8VmFsdWU+PiByZXN1bHQgPSBuZXcgVHJlZVNldDw+KEJSQU5DSF9TSVpFX0NPTVBBUkFUT1IpOworICAgICAgICAgICAgZm9yIChOb2RlPFZhbHVlPiBjaGlsZCA6IGNoaWxkcmVuKQorICAgICAgICAgICAgICAgIGlmIChjaGlsZC5maWxlUG9zID09IC0xKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGNoaWxkKTsKKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIGZpbmFsaXplV2l0aFBvc2l0aW9uKGxvbmcgcG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuYnJhbmNoU2l6ZSA9IDA7ICAgICAgICAgICAgICAgIC8vIHRha2VzIG5vIHNwYWNlIGluIGN1cnJlbnQgcGFnZQorICAgICAgICAgICAgdGhpcy5ub2RlU2l6ZSA9IDA7CisgICAgICAgICAgICB0aGlzLmhhc091dE9mUGFnZUluQnJhbmNoID0gZmFsc2U7ICAvLyBpdHMgc2l6ZSBubyBsb25nZXIgbmVlZHMgdG8gYmUgcmVjYWxjdWxhdGVkCisgICAgICAgICAgICB0aGlzLmhhc091dE9mUGFnZUNoaWxkcmVuID0gZmFsc2U7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZVdpdGhQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlMDJ4IGJyYW5jaFNpemU9JTA0eCBub2RlU2l6ZT0lMDR4ICVzJXMiLCB0cmFuc2l0aW9uLCBicmFuY2hTaXplLCBub2RlU2l6ZSwgaGFzT3V0T2ZQYWdlSW5CcmFuY2ggPyAiQiIgOiAiIiwgaGFzT3V0T2ZQYWdlQ2hpbGRyZW4gPyAiQyIgOiAiIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9JbmNyZW1lbnRhbFRyaWVXcml0ZXJTaW1wbGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL0luY3JlbWVudGFsVHJpZVdyaXRlclNpbXBsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MjBiMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9JbmNyZW1lbnRhbFRyaWVXcml0ZXJTaW1wbGUuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udHJpZXM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5jb25jdXJyZW50Lk5vdFRocmVhZFNhZmU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKKworLyoqCisgKiBJbmNyZW1lbnRhbCBidWlsZGVyIG9mIG9uLWRpc2sgdHJpZXMuIFRha2VzIHNvcnRlZCBpbnB1dC4KKyAqIDxwPgorICogSW5jcmVtZW50YWwgYnVpbGRpbmcgaXMgZG9uZSBieSBtYWludGFpbmluZyBhIHN0YWNrIG9mIG5vZGVzIGluIHByb2dyZXNzIHdoaWNoIGZvbGxvd3MgdGhlIHBhdGggdG8gcmVhY2ggdGhlIGxhc3QKKyAqIGFkZGVkIGVudHJ5LiBXaGVuIGEgbmV3IGVudHJ5IGlzIG5lZWRlZCwgY29tcGFyaXNvbiB3aXRoIHRoZSBwcmV2aW91cyBjYW4gdGVsbCB1cyBob3cgbXVjaCBvZiB0aGUgcGFyZW50cyBzdGFjaworICogcmVtYWlucyB0aGUgc2FtZS4gVGhlIHJlc3Qgb2YgdGhlIHN0YWNrIGlzIGNvbXBsZXRlIGFzIG5vIG5ldyBlbnRyeSBjYW4gYWZmZWN0IHRoZW0gZHVlIHRvIHRoZSBpbnB1dCBzb3J0aW5nLgorICogVGhlIGNvbXBsZXRlZCBub2RlcyBjYW4gYmUgd3JpdHRlbiB0byBkaXNrIGFuZCBkaXNjYXJkZWQsIGtlZXBpbmcgb25seSBhIHBvaW50ZXIgdG8gdGhlaXIgbG9jYXRpb24gaW4gdGhlIGZpbGUKKyAqICh0aGlzIHBvaW50ZXIgd2lsbCBiZSBkaXNjYXJkZWQgdG9vIHdoZW4gdGhlIHBhcmVudCBub2RlIGlzIGNvbXBsZXRlZCkuIFRoaXMgZW5zdXJlcyB0aGF0IGEgdmVyeSBsaW1pdGVkIGFtb3VudCBvZgorICogZGF0YSBpcyBrZXB0IGluIG1lbW9yeSBhdCBhbGwgdGltZXMuCisgKiA8cD4KKyAqIE5vdGU6IFRoaXMgY2xhc3MgaXMgY3VycmVudGx5IHVudXNlZCAoYnV0IHRlc3RlZCkgYW5kIHN0YW5kcyBvbmx5IGFzIGZvcm0gb2YgZG9jdW1lbnRhdGlvbiBmb3IKKyAqIHtAbGluayBJbmNyZW1lbnRhbFRyaWVXcml0ZXJQYWdlQXdhcmV9LgorICovCitATm90VGhyZWFkU2FmZQorcHVibGljIGNsYXNzIEluY3JlbWVudGFsVHJpZVdyaXRlclNpbXBsZTxWQUxVRT4KKyAgICAgICAgZXh0ZW5kcyBJbmNyZW1lbnRhbFRyaWVXcml0ZXJCYXNlPFZBTFVFLCBEYXRhT3V0cHV0UGx1cywgSW5jcmVtZW50YWxUcmllV3JpdGVyU2ltcGxlLk5vZGU8VkFMVUU+PgorICAgICAgICBpbXBsZW1lbnRzIEluY3JlbWVudGFsVHJpZVdyaXRlcjxWQUxVRT4KK3sKKyAgICBwcml2YXRlIGxvbmcgcG9zaXRpb24gPSAwOworCisgICAgcHVibGljIEluY3JlbWVudGFsVHJpZVdyaXRlclNpbXBsZShUcmllU2VyaWFsaXplcjxWQUxVRSwgPyBzdXBlciBEYXRhT3V0cHV0UGx1cz4gdHJpZVNlcmlhbGl6ZXIsIERhdGFPdXRwdXRQbHVzIGRlc3QpCisgICAgeworICAgICAgICBzdXBlcih0cmllU2VyaWFsaXplciwgZGVzdCwgbmV3IE5vZGU8PigoYnl0ZSkgMCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbXBsZXRlKE5vZGU8VkFMVUU+IG5vZGUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbG9uZyBub2RlUG9zID0gcG9zaXRpb247CisgICAgICAgIHBvc2l0aW9uICs9IHdyaXRlKG5vZGUsIGRlc3QsIHBvc2l0aW9uKTsKKyAgICAgICAgbm9kZS5maW5hbGl6ZVdpdGhQb3NpdGlvbihub2RlUG9zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpCisgICAgeworICAgICAgICByZXNldChuZXcgTm9kZTw+KChieXRlKSAwKSk7CisgICAgICAgIHBvc2l0aW9uID0gMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUGFydGlhbFRhaWwgbWFrZVBhcnRpYWxSb290KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKERhdGFPdXRwdXRCdWZmZXIgYnVmID0gbmV3IERhdGFPdXRwdXRCdWZmZXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgUFRhaWwgdGFpbCA9IG5ldyBQVGFpbCgpOworICAgICAgICAgICAgdGFpbC5jdXRvZmYgPSBwb3NpdGlvbjsKKyAgICAgICAgICAgIHRhaWwuY291bnQgPSBjb3VudDsKKyAgICAgICAgICAgIGxvbmcgbm9kZVBvcyA9IHBvc2l0aW9uOworICAgICAgICAgICAgZm9yIChOb2RlPFZBTFVFPiBub2RlIDogKEl0ZXJhYmxlPE5vZGU8VkFMVUU+Pikgc3RhY2s6OmRlc2NlbmRpbmdJdGVyYXRvcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBub2RlLmZpbGVQb3MgPSBub2RlUG9zOworICAgICAgICAgICAgICAgIG5vZGVQb3MgKz0gd3JpdGUobm9kZSwgYnVmLCBub2RlUG9zKTsKKyAgICAgICAgICAgICAgICAvLyBIYWNreSBidXQgd29ya3M6IHRlbXBvcmFyaWx5IHdyaXRlIG5vZGUncyBwb3NpdGlvbi4gV2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIHdlIGZpbmFsaXplIG5vZGUuCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRhaWwudGFpbCA9IGJ1Zi5hc05ld0J1ZmZlcigpOworICAgICAgICAgICAgdGFpbC5yb290ID0gc3RhY2suZ2V0Rmlyc3QoKS5maWxlUG9zOworCisgICAgICAgICAgICBmb3IgKE5vZGU8VkFMVUU+IG5vZGUgOiAoSXRlcmFibGU8Tm9kZTxWQUxVRT4+KSBzdGFjazo6ZGVzY2VuZGluZ0l0ZXJhdG9yKQorICAgICAgICAgICAgICAgIG5vZGUuZmlsZVBvcyA9IC0xOworCisgICAgICAgICAgICByZXR1cm4gdGFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgbG9uZyB3cml0ZShOb2RlPFZBTFVFPiBub2RlLCBEYXRhT3V0cHV0UGx1cyBkZXN0LCBsb25nIG5vZGVQb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBsb25nIHNpemUgPSBzZXJpYWxpemVyLnNpemVvZk5vZGUobm9kZSwgbm9kZVBvc2l0aW9uKTsKKyAgICAgICAgc2VyaWFsaXplci53cml0ZShkZXN0LCBub2RlLCBub2RlUG9zaXRpb24pOworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTm9kZTxWYWx1ZT4gZXh0ZW5kcyBJbmNyZW1lbnRhbFRyaWVXcml0ZXJCYXNlLkJhc2VOb2RlPFZhbHVlLCBOb2RlPFZhbHVlPj4KKyAgICB7CisgICAgICAgIE5vZGUoaW50IHRyYW5zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKHRyYW5zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIE5vZGU8VmFsdWU+IG5ld05vZGUoYnl0ZSB0cmFuc2l0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE5vZGU8Pih0cmFuc2l0aW9uICYgMHhGRik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBzZXJpYWxpemVkUG9zaXRpb25EZWx0YShpbnQgaSwgbG9uZyBub2RlUG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBjaGlsZHJlbi5nZXQoaSkuZmlsZVBvcyAhPSAtMTsKKyAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbi5nZXQoaSkuZmlsZVBvcyAtIG5vZGVQb3NpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIG1heFBvc2l0aW9uRGVsdGEobG9uZyBub2RlUG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgbWluID0gMDsKKyAgICAgICAgICAgIGZvciAoTm9kZTxWYWx1ZT4gY2hpbGQgOiBjaGlsZHJlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZmlsZVBvcyAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgbWluID0gTWF0aC5taW4obWluLCBjaGlsZC5maWxlUG9zIC0gbm9kZVBvc2l0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtaW47CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvUmV2ZXJzZVZhbHVlSXRlcmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL1JldmVyc2VWYWx1ZUl0ZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdjMTk5YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL1JldmVyc2VWYWx1ZUl0ZXJhdG9yLmphdmEKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5jb25jdXJyZW50Lk5vdFRocmVhZFNhZmU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJlYnVmZmVyZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKKworLyoqCisgKiBUaHJlYWQtdW5zYWZlIHJldmVyc2UgdmFsdWUgaXRlcmF0b3IgZm9yIG9uLWRpc2sgdHJpZXMuIFVzZXMgdGhlIGFzc3VtcHRpb25zIG9mIHtAbGluayBXYWxrZXJ9LgorICogPHA+CisgKiBUaGUgbWFpbiB1dGlsaXR5IG9mIHRoaXMgY2xhc3MgaXMgdGhlIHtAbGluayAjbmV4dFBheWxvYWRlZE5vZGUoKX0gbWV0aG9kLCB3aGljaCBsaXN0cyBhbGwgbm9kZXMgdGhhdCBjb250YWluIGEKKyAqIHBheWxvYWQgd2l0aGluIHRoZSByZXF1ZXN0ZWQgYm91bmRzLiBUaGUgdHJlYXRtZW50IG9mIHRoZSBib3VuZHMgaXMgbm9uLXN0YW5kYXJkIChzZWUKKyAqIHtAbGluayAjUmV2ZXJzZVZhbHVlSXRlcmF0b3IoUmVidWZmZXJlciwgbG9uZywgQnl0ZUNvbXBhcmFibGUsIEJ5dGVDb21wYXJhYmxlLCBib29sZWFuKX0pLCBuZWNlc3NhcnkgdG8gcHJvcGVybHkgd2FsaworICogdHJpZXMgb2YgcHJlZml4ZXMgYW5kIHNlcGFyYXRvcnMuCisgKi8KK0BOb3RUaHJlYWRTYWZlCitwdWJsaWMgY2xhc3MgUmV2ZXJzZVZhbHVlSXRlcmF0b3I8Q29uY3JldGUgZXh0ZW5kcyBSZXZlcnNlVmFsdWVJdGVyYXRvcjxDb25jcmV0ZT4+IGV4dGVuZHMgV2Fsa2VyPENvbmNyZXRlPgoreworICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9UX0FUX0xJTUlUID0gSW50ZWdlci5NSU5fVkFMVUU7CisgICAgcHJpdmF0ZSBmaW5hbCBCeXRlU291cmNlIGxpbWl0OworICAgIHByaXZhdGUgSXRlcmF0aW9uUG9zaXRpb24gc3RhY2s7CisgICAgcHJpdmF0ZSBsb25nIG5leHQ7CisgICAgcHJpdmF0ZSBib29sZWFuIHJlcG9ydGluZ1ByZWZpeGVzOworCisgICAgc3RhdGljIGNsYXNzIEl0ZXJhdGlvblBvc2l0aW9uCisgICAgeworICAgICAgICBmaW5hbCBsb25nIG5vZGU7CisgICAgICAgIGZpbmFsIGludCBsaW1pdDsKKyAgICAgICAgZmluYWwgSXRlcmF0aW9uUG9zaXRpb24gcHJldjsKKyAgICAgICAgaW50IGNoaWxkSW5kZXg7CisKKyAgICAgICAgcHVibGljIEl0ZXJhdGlvblBvc2l0aW9uKGxvbmcgbm9kZSwgaW50IGNoaWxkSW5kZXgsIGludCBsaW1pdCwgSXRlcmF0aW9uUG9zaXRpb24gcHJldikKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHRoaXMubm9kZSA9IG5vZGU7CisgICAgICAgICAgICB0aGlzLmNoaWxkSW5kZXggPSBjaGlsZEluZGV4OworICAgICAgICAgICAgdGhpcy5saW1pdCA9IGxpbWl0OworICAgICAgICAgICAgdGhpcy5wcmV2ID0gcHJldjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBSZXZlcnNlVmFsdWVJdGVyYXRvcihSZWJ1ZmZlcmVyIHNvdXJjZSwgbG9uZyByb290KQorICAgIHsKKyAgICAgICAgc3VwZXIoc291cmNlLCByb290KTsKKyAgICAgICAgbGltaXQgPSBudWxsOworICAgICAgICBpbml0aWFsaXplTm9SaWdodEJvdW5kKHJvb3QsIE5PVF9BVF9MSU1JVCwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cmFpbmVkIGl0ZXJhdG9yLiBUaGUgZW5kIHBvc2l0aW9uIGlzIGFsd2F5cyB0cmVhdGVkIGFzIGluY2x1c2l2ZSwgYW5kIHdlIGhhdmUgdHdvIHBvc3NpYmxlIHRyZWF0bWVudHMgZm9yCisgICAgICogdGhlIHN0YXJ0OgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT4gV2hlbiB7QGNvZGUgYWRtaXRQcmVmaXg9ZmFsc2V9LCBleGFjdCBtYXRjaGVzIGFuZCBhbnkgcHJlZml4ZXMgb2YgdGhlIHN0YXJ0IGFyZSBleGNsdWRlZC4KKyAgICAgKiAgIDxsaT4gV2hlbiB7QGNvZGUgYWRtaXRQcmVmaXg9dHJ1ZX0sIHRoZSBsb25nZXN0IHByZWZpeCBvZiB0aGUgc3RhcnQgcHJlc2VudCBpbiB0aGUgdHJpZSBpcyBhbHNvIGluY2x1ZGVkLAorICAgICAqICAgICAgICBwcm92aWRlZCB0aGF0IHRoZXJlIGlzIG5vIGVudHJ5IGluIHRoZSB0cmllIGJldHdlZW4gdGhhdCBwcmVmaXggYW5kIHRoZSBzdGFydC4gQW4gZXhhY3QgbWF0Y2ggYWxzbworICAgICAqICAgICAgICBzYXRpc2ZpZXMgdGhpcyBhbmQgaXMgaW5jbHVkZWQuCisgICAgICogPC91bD4KKyAgICAgKiBUaGlzIGJlaGF2aW91ciBpcyBzaGFyZWQgd2l0aCB0aGUgZm9yd2FyZCBjb3VudGVycGFydCB7QGxpbmsgVmFsdWVJdGVyYXRvcn0uCisgICAgICovCisgICAgcHJvdGVjdGVkIFJldmVyc2VWYWx1ZUl0ZXJhdG9yKFJlYnVmZmVyZXIgc291cmNlLCBsb25nIHJvb3QsIEJ5dGVDb21wYXJhYmxlIHN0YXJ0LCBCeXRlQ29tcGFyYWJsZSBlbmQsIGJvb2xlYW4gYWRtaXRQcmVmaXgpCisgICAgeworICAgICAgICBzdXBlcihzb3VyY2UsIHJvb3QpOworICAgICAgICBsaW1pdCA9IHN0YXJ0ICE9IG51bGwgPyBzdGFydC5hc0NvbXBhcmFibGVCeXRlcyhCWVRFX0NPTVBBUkFCTEVfVkVSU0lPTikgOiBudWxsOworCisgICAgICAgIGlmIChlbmQgIT0gbnVsbCkKKyAgICAgICAgICAgIGluaXRpYWxpemVXaXRoUmlnaHRCb3VuZChyb290LCBlbmQuYXNDb21wYXJhYmxlQnl0ZXMoQllURV9DT01QQVJBQkxFX1ZFUlNJT04pLCBhZG1pdFByZWZpeCwgbGltaXQgIT0gbnVsbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGluaXRpYWxpemVOb1JpZ2h0Qm91bmQocm9vdCwgbGltaXQgIT0gbnVsbCA/IGxpbWl0Lm5leHQoKSA6IE5PVF9BVF9MSU1JVCwgYWRtaXRQcmVmaXgpOworICAgIH0KKworICAgIHZvaWQgaW5pdGlhbGl6ZVdpdGhSaWdodEJvdW5kKGxvbmcgcm9vdCwgQnl0ZVNvdXJjZSBlbmRTdHJlYW0sIGJvb2xlYW4gYWRtaXRQcmVmaXgsIGJvb2xlYW4gaGFzTGltaXQpCisgICAgeworICAgICAgICBJdGVyYXRpb25Qb3NpdGlvbiBwcmV2ID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiBhdExpbWl0ID0gaGFzTGltaXQ7CisgICAgICAgIGludCBjaGlsZEluZGV4OworICAgICAgICBpbnQgbGltaXRCeXRlOworICAgICAgICByZXBvcnRpbmdQcmVmaXhlcyA9IGFkbWl0UHJlZml4OworCisgICAgICAgIC8vIEZvbGxvdyBlbmQgcG9zaXRpb24gd2hpbGUgd2Ugc3RpbGwgaGF2ZSBhIHByZWZpeCwgc3RhY2tpbmcgcGF0aC4KKyAgICAgICAgZ28ocm9vdCk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcyA9IGVuZFN0cmVhbS5uZXh0KCk7CisgICAgICAgICAgICBjaGlsZEluZGV4ID0gc2VhcmNoKHMpOworCisgICAgICAgICAgICBsaW1pdEJ5dGUgPSBOT1RfQVRfTElNSVQ7CisgICAgICAgICAgICBpZiAoYXRMaW1pdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1pdEJ5dGUgPSBsaW1pdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKHMgPiBsaW1pdEJ5dGUpCisgICAgICAgICAgICAgICAgICAgIGF0TGltaXQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGlsZEluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgcHJldiA9IG5ldyBJdGVyYXRpb25Qb3NpdGlvbihwb3NpdGlvbiwgY2hpbGRJbmRleCwgbGltaXRCeXRlLCBwcmV2KTsKKyAgICAgICAgICAgIGdvKHRyYW5zaXRpb24oY2hpbGRJbmRleCkpOyAvLyBjaGlsZEluZGV4IGlzIHBvc2l0aXZlLCB0aGlzIHRyYW5zaXRpb24gbXVzdCBleGlzdAorICAgICAgICB9CisKKyAgICAgICAgLy8gQWR2YW5jaW5nIG5vdyBnaXZlcyB1cyBmaXJzdCBtYXRjaC4KKyAgICAgICAgY2hpbGRJbmRleCA9IC0xIC0gY2hpbGRJbmRleDsKKyAgICAgICAgc3RhY2sgPSBuZXcgSXRlcmF0aW9uUG9zaXRpb24ocG9zaXRpb24sIGNoaWxkSW5kZXgsIGxpbWl0Qnl0ZSwgcHJldik7CisgICAgICAgIG5leHQgPSBhZHZhbmNlTm9kZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplTm9SaWdodEJvdW5kKGxvbmcgcm9vdCwgaW50IGxpbWl0Qnl0ZSwgYm9vbGVhbiBhZG1pdFByZWZpeCkKKyAgICB7CisgICAgICAgIGdvKHJvb3QpOworICAgICAgICBzdGFjayA9IG5ldyBJdGVyYXRpb25Qb3NpdGlvbihyb290LCAtMSAtIHNlYXJjaCgyNTYpLCBsaW1pdEJ5dGUsIG51bGwpOworICAgICAgICBuZXh0ID0gYWR2YW5jZU5vZGUoKTsKKyAgICAgICAgcmVwb3J0aW5nUHJlZml4ZXMgPSBhZG1pdFByZWZpeDsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIG5leHQgbm9kZSB3aXRoIHBheWxvYWQgY29udGFpbmVkIGluIHRoZSBpdGVyYXRlZCBzcGFuLgorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIG5leHRQYXlsb2FkZWROb2RlKCkKKyAgICB7CisgICAgICAgIGxvbmcgdG9SZXR1cm4gPSBuZXh0OworICAgICAgICBpZiAobmV4dCAhPSAtMSkKKyAgICAgICAgICAgIG5leHQgPSBhZHZhbmNlTm9kZSgpOworICAgICAgICByZXR1cm4gdG9SZXR1cm47CisgICAgfQorCisgICAgbG9uZyBhZHZhbmNlTm9kZSgpCisgICAgeworICAgICAgICBpZiAoc3RhY2sgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBsb25nIGNoaWxkOworICAgICAgICBpbnQgdHJhbnNpdGlvbkJ5dGU7CisKKyAgICAgICAgZ28oc3RhY2subm9kZSk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBhZHZhbmNlIHBvc2l0aW9uIGluIG5vZGUKKyAgICAgICAgICAgIGludCBjaGlsZElkeCA9IHN0YWNrLmNoaWxkSW5kZXggLSAxOworICAgICAgICAgICAgYm9vbGVhbiBiZXlvbmRMaW1pdCA9IHRydWU7CisgICAgICAgICAgICBpZiAoY2hpbGRJZHggPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFuc2l0aW9uQnl0ZSA9IHRyYW5zaXRpb25CeXRlKGNoaWxkSWR4KTsKKyAgICAgICAgICAgICAgICBiZXlvbmRMaW1pdCA9IHRyYW5zaXRpb25CeXRlIDwgc3RhY2subGltaXQ7CisgICAgICAgICAgICAgICAgaWYgKGJleW9uZExpbWl0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHN0YWNrLmxpbWl0ID49IDA7ICAgIC8vIHdlIGFyZSBhdCBhIGxpbWl0IHBvc2l0aW9uIChub3QgaW4gYSBub2RlIHRoYXQncyBjb21wbGV0ZWx5IHdpdGhpbiB0aGUgc3BhbikKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0aW5nUHJlZml4ZXMgPSBmYWxzZTsgIC8vIHRoZXJlIGV4aXN0cyBhIHNtYWxsZXIgY2hpbGQgdGhhbiBsaW1pdCwgbm8gbG9uZ2VyIHNob3VsZCByZXBvcnQgcHJlZml4ZXMKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHJhbnNpdGlvbkJ5dGUgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKKworICAgICAgICAgICAgaWYgKGJleW9uZExpbWl0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGFzY2VuZCB0byBwYXJlbnQsIHJlbW92ZSBmcm9tIHN0YWNrCisgICAgICAgICAgICAgICAgSXRlcmF0aW9uUG9zaXRpb24gc3RhY2tUb3AgPSBzdGFjazsKKyAgICAgICAgICAgICAgICBzdGFjayA9IHN0YWNrLnByZXY7CisKKyAgICAgICAgICAgICAgICAvLyBSZXBvcnQgcGF5bG9hZHMgb24gdGhlIHdheSB1cAorICAgICAgICAgICAgICAgIC8vIHVubGVzcyB3ZSBhcmUgYXQgbGltaXQgYW5kIHRoZXJlIGhhcyBiZWVuIGEgc21hbGxlciBjaGlsZAorICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkRmxhZ3MoKSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGZ1bGx5IGluc2lkZSB0aGUgY292ZXJlZCBzcGFjZSwgcmVwb3J0LgorICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgb24gdGhlIGV4YWN0IG1hdGNoIG9mIHRoZSBsaW1pdCwgc3RhY2tUb3AubGltaXQgd291bGQgYmUgRU5EX09GX1NUUkVBTS4KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjb21wYXJpc29uIHJlamVjdHMgdGhlIGV4YWN0IG1hdGNoOyBpZiB3ZSB3YW50ZWQgdG8gaW5jbHVkZSBpdCwgd2UgY291bGQgdGVzdCA8IDAgaW5zdGVhZC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrVG9wLmxpbWl0ID09IE5PVF9BVF9MSU1JVCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFja1RvcC5ub2RlOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXBvcnRpbmdQcmVmaXhlcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0aW5nUHJlZml4ZXMgPSBmYWxzZTsgLy8gaWYgd2UgYXJlIGF0IGxpbWl0IHBvc2l0aW9uIG9ubHkgcmVwb3J0IG9uZSBwcmVmaXgsIHRoZSBjbG9zZXN0CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2tUb3Aubm9kZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHNraXAgdGhpcyBwYXlsb2FkCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0YWNrID09IG51bGwpICAgICAgICAvLyBleGhhdXN0ZWQgd2hvbGUgdHJpZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9ORTsKKyAgICAgICAgICAgICAgICBnbyhzdGFjay5ub2RlKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2hpbGQgPSB0cmFuc2l0aW9uKGNoaWxkSWR4KTsKKyAgICAgICAgICAgIGlmIChjaGlsZCAhPSBOT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvKGNoaWxkKTsKKworICAgICAgICAgICAgICAgIHN0YWNrLmNoaWxkSW5kZXggPSBjaGlsZElkeDsKKworICAgICAgICAgICAgICAgIC8vIGRlc2NlbmQsIHN0YWNrIHVwIHBvc2l0aW9uCisgICAgICAgICAgICAgICAgaW50IGwgPSBOT1RfQVRfTElNSVQ7CisgICAgICAgICAgICAgICAgaWYgKHRyYW5zaXRpb25CeXRlID09IHN0YWNrLmxpbWl0KQorICAgICAgICAgICAgICAgICAgICBsID0gbGltaXQubmV4dCgpOworCisgICAgICAgICAgICAgICAgc3RhY2sgPSBuZXcgSXRlcmF0aW9uUG9zaXRpb24oY2hpbGQsIHRyYW5zaXRpb25SYW5nZSgpLCBsLCBzdGFjayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhY2suY2hpbGRJbmRleCA9IGNoaWxkSWR4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvU2VyaWFsaXphdGlvbk5vZGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL1NlcmlhbGl6YXRpb25Ob2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFlN2E0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL1NlcmlhbGl6YXRpb25Ob2RlLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udHJpZXM7CisKKy8qKgorICogQW4gYWJzdHJhY3Rpb24gb2YgYSBub2RlIGdpdmVuIHRvIHRoZSB0cmllIHNlcmlhbGl6ZXIgdG8gd3JpdGUuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2VyaWFsaXphdGlvbk5vZGU8VkFMVUU+Cit7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBjaGlsZHJlbiBvZiB0aGUgbm9kZS4KKyAgICAgKi8KKyAgICBpbnQgY2hpbGRDb3VudCgpOworCisgICAgLyoqCisgICAgICogVGhlIHBheWxvYWQgb2YgdGhlIG5vZGUgaWYgdGhlIG5vZGUgaGFzIGFueSBhc3NvY2lhdGVkLCBvdGhlcndpc2UgbnVsbC4KKyAgICAgKi8KKyAgICBWQUxVRSBwYXlsb2FkKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHJhbnNpdGlvbiBjaGFyYWN0ZXIgZm9yIHRoZSBjaGlsZCBhdCBwb3NpdGlvbiBpLiBNdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCAyNTUuCisgICAgICovCisgICAgaW50IHRyYW5zaXRpb24oaW50IGkpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGlzIG5vZGUncyBwb3NpdGlvbiBhbmQgdGhlIGNoaWxkIGF0IGluZGV4IGkuCisgICAgICogR2l2ZW4gYXMgYSBkaWZmZXJlbmNlIGNhbGN1bGF0aW9uIHRvIGJlIGFibGUgdG8gaGFuZGxlIHR3byBkaWZmZXJlbnQgdHlwZXMgb2YgY2FsbHM6CisgICAgICogLSB3cml0aW5nIG5vZGVzIHdoZXJlIGFsbCBjaGlsZHJlbidzIHBvc2l0aW9ucyBhcmUgYWxyZWFkeSBjb21wbGV0ZWx5IGRldGVybWluZWQKKyAgICAgKiAtIHNpemluZyBhbmQgd3JpdGluZyBicmFuY2hlcyB3aXRoaW4gYSBwYWdlIHdoZXJlIHdlIGRvbid0IGtub3cgd2hlcmUgd2UnbGwgYWN0dWFsbHkgcGxhY2UKKyAgICAgKiAgIHRoZSBub2RlcywgYnV0IHdlIGtub3cgaG93IGZhciBiYWNrd2FyZCB0aGUgY2hpbGQgbm9kZXMgd2lsbCBlbmQgdXAKKyAgICAgKi8KKyAgICBsb25nIHNlcmlhbGl6ZWRQb3NpdGlvbkRlbHRhKGludCBpLCBsb25nIG5vZGVQb3NpdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmdXJ0aGVzdCBkaXN0YW5jZSB0aGF0IG5lZWRzIHRvIGJlIHdyaXR0ZW4gdG8gc3RvcmUgdGhpcyBub2RlLCBpLmUuCisgICAgICogICBtaW4oc2VyaWFsaXplZFBvc2l0aW9uRGVsdGEoaSwgbm9kZVBvc2l0aW9uKSBmb3IgMCA8PSBpIDwgY2hpbGRDb3VudCgpKQorICAgICAqIEdpdmVuIHNlcGFyYXRlbHkgYXMgdGhlIGxvb3AgYWJvdmUgY2FuIGJlIGluZWZmaWNpZW50IChlLmcuIHdoZW4gY2hpbGRyZW4gYXJlIG5vdCB5ZXQgd3JpdHRlbikuCisgICAgICovCisgICAgbG9uZyBtYXhQb3NpdGlvbkRlbHRhKGxvbmcgbm9kZVBvc2l0aW9uKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL1RyaWVOb2RlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9UcmllTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYTRlZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9UcmllTm9kZS5qYXZhCkBAIC0wLDAgKzEsOTg3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby50cmllczsKKworaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dDsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2l6ZWRJbnRzOworCisvKioKKyAqIFRyaWUgbm9kZSB0eXBlcyBhbmQgbWFuaXB1bGF0aW9uIG1lY2hhbmlzbXMuIFRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byBhbGxvdyBmb3IgaGFuZGxpbmcgdHJpZXMgZGlyZWN0bHkgYXMKKyAqIHRoZXkgYXJlIG9uIGRpc2sgd2l0aG91dCBhbnkgc2VyaWFsaXphdGlvbiwgYW5kIHRvIGVuYWJsZSB0aGUgY3JlYXRpb24gb2Ygc3VjaCBmaWxlcy4KKyAqIDxwPgorICogVGhlIHNlcmlhbGl6YXRpb24gbWV0aG9kcyB0YWtlIGFzIGFyZ3VtZW50IGEgZ2VuZXJpYyB7QGNvZGUgU2VyaWFsaXphdGlvbk5vZGV9IGFuZCBwcm92aWRlIGEgbWV0aG9kIHtAY29kZSB0eXBlRm9yfQorICogZm9yIGNob29zaW5nIGEgc3VpdGFibGUgdHlwZSB0byByZXByZXNlbnQgaXQsIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHNpemUgYW5kIHdyaXRlIHRoZSBub2RlLgorICogPHA+CisgKiBUbyByZWFkIGEgZmlsZSBjb250YWluaW5nIHRyaWUgbm9kZXMsIG9uZSB3b3VsZCB1c2Uge0Bjb2RlIGF0fSB0byBpZGVudGlmeSB0aGUgbm9kZSB0eXBlIGFuZCB0aGVuIHRoZSB2YXJpb3VzCisgKiByZWFkIG1ldGhvZHMgdG8gcmV0cmlldmUgdGhlIGRhdGEuIFRoZXkgYWxsIHRha2UgYSBidWZmZXIgKHVzdWFsbHkgbWVtb3J5LW1hcHBlZCkgY29udGFpbmluZyB0aGUgZGF0YSwgYW5kIGEgcG9zaXRpb24KKyAqIGluIGl0IHRoYXQgaWRlbnRpZmllcyB0aGUgbm9kZS4KKyAqIDxwPgorICogVGhlc2Ugbm9kZSB0eXBlcyBkbyBub3Qgc3BlY2lmeSBhbnkgdHJlYXRtZW50IG9mIHBheWxvYWRzLiBUaGV5IGFyZSBvbmx5IGNvbmNlcm5lZCB3aXRoIHByb3ZpZGluZyA0IGJpdHMgb2YKKyAqIHNwYWNlIGZvciB7QGNvZGUgcGF5bG9hZEZsYWdzfSwgYW5kIGEgd2F5IG9mIGNhbGN1bGF0aW5nIHRoZSBwb3NpdGlvbiBhZnRlciB0aGUgbm9kZS4gVXNlcnMgb2YgdGhpcyBjbGFzcyBieSBjb252ZW50aW9uCisgKiB1c2Ugbm9uLXplcm8gcGF5bG9hZEZsYWdzIHRvIGluZGljYXRlIGEgcGF5bG9hZCBleGlzdHMsIHdyaXRlIGl0IChwb3NzaWJseSBpbiBmbGFnLWRlcGVuZGVudCBmb3JtYXQpIGF0IHNlcmlhbGl6YXRpb24KKyAqIHRpbWUgYWZ0ZXIgdGhlIG5vZGUgaXRzZWxmIGlzIHdyaXR0ZW4sIGFuZCByZWFkIGl0IHVzaW5nIHRoZSB7QGNvZGUgcGF5bG9hZFBvc2l0aW9ufSB2YWx1ZS4KKyAqIDxwPgorICogVG8gaW1wcm92ZSBlZmZpY2llbmN5LCBtdWx0aXBsZSBub2RlIHR5cGVzIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHRyYW5zaXRpb25zIGFyZSBwcm92aWRlZDoKKyAqIC0tIHBheWxvYWQgb25seSwgd2hpY2ggaGFzIG5vIG91dGdvaW5nIHRyYW5zaXRpb25zCisgKiAtLSBzaW5nbGUgb3V0Z29pbmcgdHJhbnNpdGlvbgorICogLS0gc3BhcnNlLCB3aGljaCBwcm92aWRlcyBhIGxpc3Qgb2YgdHJhbnNpdGlvbiBieXRlcyB3aXRoIGNvcnJlc3BvbmRpbmcgdGFyZ2V0cworICogLS0gZGVuc2UsIHdoZXJlIHRoZSB0cmFuc2l0aW9ucyBzcGFuIGEgcmFuZ2Ugb2YgdmFsdWVzIGFuZCBoYXZpbmcgdGhlIGxpc3QgKGFuZCB0aGUgc2VhcmNoIGluIGl0KSBjYW4gYmUgYXZvaWRlZAorICogPHA+CisgKiBGb3IgZWFjaCBvZiB0aGUgdHJhbnNpdGlvbi1jYXJyeWluZyB0eXBlcyB3ZSBhbHNvIGhhdmUgImluLXBhZ2UiIHZlcnNpb25zIHdoZXJlIHRyYW5zaXRpb24gdGFyZ2V0cyBhcmUgdGhlIDQsIDggb3IgMTIKKyAqIGxvd2VzdCBiaXRzIG9mIHRoZSBwb3NpdGlvbiB3aXRoaW4gdGhlIHNhbWUgcGFnZS4gVG8gc2F2ZSBvbmUgZnVydGhlciBieXRlLCB0aGUgc2luZ2xlIGluLXBhZ2UgdmVyc2lvbnMgdXNpbmcgNCBvciAxMgorICogYml0cyBjYW5ub3QgY2FycnkgYSBwYXlsb2FkLgorICogPHA+CisgKiBUaGlzIGNsYXNzIGlzIGVmZmVjdGl2ZWx5IGFuIGVudW1lcmF0aW9uOyBhYnN0cmFjdCBjbGFzcyBwZXJtaXRzIGluc3RhbmNlcyB0byBleHRlbmQgZWFjaCBvdGhlciBhbmQgcmV1c2UgY29kZS4KKyAqIDxwPgorICogU2VlIHtAY29kZSBvcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvQnRpRm9ybWF0Lm1kfSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbWVjaGFuaXNtcyBvZiB3cml0aW5nCisgKiBhbmQgcmVhZGluZyBhbiBvbi1kaXNrIHRyaWUuCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKHsgIlNhbWVQYXJhbWV0ZXJWYWx1ZSIgfSkKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmllTm9kZQoreworICAgIC8qKiBWYWx1ZSB1c2VkIHRvIGluZGljYXRlIGEgYnJhbmNoIChlLmcuIGZvciB0cmFuc2l0aW9uIGFuZCBsYXN0VHJhbnNpdGlvbikgZG9lcyBub3QgZXhpc3QuICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgTk9ORSA9IC0xOworCisgICAgLy8gQ29uc3VtcHRpb24gKHJlYWQpIG1ldGhvZHMKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2Ygbm9kZSBzdG9yZWQgYXQgdGhpcyBwb3NpdGlvbi4gSXQgY2FuIHRoZW4gYmUgdXNlZCB0byBjYWxsIHRoZSBtZXRob2RzIGJlbG93LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVHJpZU5vZGUgYXQoQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbikKKyAgICB7CisgICAgICAgIHJldHVybiBUeXBlcy52YWx1ZXNbKHNyYy5nZXQocG9zaXRpb24pID4+IDQpICYgMHhGXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSA0IHBheWxvYWQgZmxhZyBiaXRzLiBOb2RlIHR5cGVzIHRoYXQgY2Fubm90IGNhcnJ5IGEgcGF5bG9hZCByZXR1cm4gMC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHBheWxvYWRGbGFncyhCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNyYy5nZXQocG9zaXRpb24pICYgMHgwRjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBvc2l0aW9uIGp1c3QgYWZ0ZXIgdGhlIG5vZGUsIHdoZXJlIHRoZSBwYXlsb2FkIGlzIHVzdWFsbHkgc3RvcmVkLgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBpbnQgcGF5bG9hZFBvc2l0aW9uKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24pOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBzZWFyY2ggaW5kZXggZm9yIHRoZSBnaXZlbiBieXRlIGluIHRoZSBub2RlLiBJZiBleGFjdCBtYXRjaCBpcyBwcmVzZW50LCB0aGlzIGlzID49IDAsIG90aGVyd2lzZSBhcyBpbgorICAgICAqIGJpbmFyeSBzZWFyY2guCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGludCBzZWFyY2goQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgaW50IHRyYW5zaXRpb25CeXRlKTsgICAgICAgLy8gcmV0dXJucyBhcyBiaW5hcnlTZWFyY2gKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHVwcGVyIGNoaWxkSW5kZXggbGltaXQuIENhbGxpbmcgdHJhbnNpdGlvbiB3aXRoIHZhbHVlcyAwLi4udHJhbnNpdGlvblJhbmdlIC0gMSBpcyB2YWxpZC4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgaW50IHRyYW5zaXRpb25SYW5nZShCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGJ5dGUgdmFsdWUgZm9yIHRoaXMgY2hpbGQgaW5kZXgsIG9yIEludGVnZXIuTUFYX1ZBTFVFIGlmIHRoZXJlIGFyZSBubyB0cmFuc2l0aW9ucyB3aXRoIHRoaXMgaW5kZXggb3IKKyAgICAgKiBoaWdoZXIgdG8gcGVybWl0IGxpc3RpbmcgdGhlIGNoaWxkcmVuIHdpdGhvdXQgbmVlZGluZyB0byBjYWxsIHRyYW5zaXRpb25SYW5nZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGlsZEluZGV4IG11c3QgYmUgPj0gMCwgdGhvdWdoIGl0IGlzIGFsbG93ZWQgdG8gcGFzcyBhIHZhbHVlIGdyZWF0ZXIgdGhhbiB7QGNvZGUgdHJhbnNpdGlvblJhbmdlIC0gMX0KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgaW50IHRyYW5zaXRpb25CeXRlKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGludCBjaGlsZEluZGV4KTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlbHRhIGJldHdlZW4gdGhlIHBvc2l0aW9uIG9mIHRoaXMgbm9kZSBhbmQgdGhlIHBvc2l0aW9uIG9mIHRoZSB0YXJnZXQgb2YgdGhlIHNwZWNpZmllZCB0cmFuc2l0aW9uLgorICAgICAqIFRoaXMgaXMgYWx3YXlzIGEgbmVnYXRpdmUgbnVtYmVyLiBEZW5zZSBub2RlcyB1c2UgMCB0byBzcGVjaWZ5ICJubyB0cmFuc2l0aW9uIi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGlsZEluZGV4IG11c3QgYmUgPj0gMCBhbmQgPCB7QGxpbmsgI3RyYW5zaXRpb25SYW5nZShCeXRlQnVmZmVyLCBpbnQpfSAtIG5vdGUgdGhhdCB0aGlzIGlzIG5vdCB2YWxpZGF0ZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICBhbmQgYmVoYXZpb3VyIG9mIHRoaXMgbWV0aG9kIGlzIHVuZGVmaW5lZCBmb3IgdmFsdWVzIG91dHNpZGUgb2YgdGhhdCByYW5nZQorICAgICAqLworICAgIGFic3RyYWN0IGxvbmcgdHJhbnNpdGlvbkRlbHRhKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGludCBjaGlsZEluZGV4KTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgcG9zaXRpb24gb2Ygbm9kZSB0byB0cmFuc2l0aW9uIHRvIGZvciB0aGUgZ2l2ZW4gc2VhcmNoIGluZGV4LiBBcmd1bWVudCBtdXN0IGJlIHBvc2l0aXZlLiBNYXkgcmV0dXJuIE5PTkUKKyAgICAgKiBpZiBhIHRyYW5zaXRpb24gd2l0aCB0aGF0IGluZGV4IGRvZXMgbm90IGV4aXN0IChERU5TRSBub2RlcykuCisgICAgICogUG9zaXRpb24gaXMgdGhlIG9mZnNldCBvZiB0aGUgbm9kZSB3aXRoaW4gdGhlIEJ5dGVCdWZmZXIuIHBvc2l0aW9uTG9uZyBpcyBpdHMgZ2xvYmFsIHBsYWNlbWVudCwgd2hpY2ggaXMgdGhlCisgICAgICogYmFzZSBmb3IgYW55IG9mZnNldCBjYWxjdWxhdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9zaXRpb25Mb25nIGFsdGhvdWdoIGl0IHNlZW1zIHRvIGJlIG9idmlvdXMsIHRoaXMgYXJndW1lbnQgbXVzdCBiZSAicmVhbCIsIHRoYXQgaXMsIGVhY2ggY2hpbGQgbXVzdCBoYXZlCisgICAgICogICAgICAgICAgICAgICAgICAgICB0aGUgY2FsY3VsYXRlZCBhYnNvbHV0ZSBwb3NpdGlvbiA+PSAwLCBvdGhlcndpc2UgdGhlIGJlaGF2aW91ciBvZiB0aGlzIG1ldGhvZCBpcyB1bmRlZmluZWQKKyAgICAgKiBAcGFyYW0gY2hpbGRJbmRleCAgIG11c3QgYmUgPj0gMCBhbmQgPCB7QGxpbmsgI3RyYW5zaXRpb25SYW5nZShCeXRlQnVmZmVyLCBpbnQpfSAtIG5vdGUgdGhhdCB0aGlzIGlzIG5vdCB2YWxpZGF0ZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGFuZCBiZWhhdmlvdXIgb2YgdGhpcyBtZXRob2QgaXMgdW5kZWZpbmVkIGZvciB2YWx1ZXMgb3V0c2lkZSBvZiB0aGF0IHJhbmdlCisgICAgICovCisgICAgcHVibGljIGxvbmcgdHJhbnNpdGlvbihCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uLCBsb25nIHBvc2l0aW9uTG9uZywgaW50IGNoaWxkSW5kZXgpCisgICAgeworICAgICAgICAvLyBub3RlOiB0aGlzIGlzIG5vdCB2YWxpZCBmb3IgZGVuc2Ugbm9kZXMKKyAgICAgICAgcmV0dXJuIHBvc2l0aW9uTG9uZyArIHRyYW5zaXRpb25EZWx0YShzcmMsIHBvc2l0aW9uLCBjaGlsZEluZGV4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBoaWdoZXN0IHRyYW5zaXRpb24gZm9yIHRoaXMgbm9kZSwgb3IgTk9ORSBpZiBub25lIGV4aXN0IChQQVlMT0FEX09OTFkgbm9kZXMpLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGxhc3RUcmFuc2l0aW9uKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGxvbmcgcG9zaXRpb25Mb25nKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zaXRpb24oc3JjLCBwb3NpdGlvbiwgcG9zaXRpb25Mb25nLCB0cmFuc2l0aW9uUmFuZ2Uoc3JjLCBwb3NpdGlvbikgLSAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdHJhbnNpdGlvbiB0aGF0IGlzIGhpZ2hlciB0aGFuIHRoZSBpbmRleCByZXR1cm5lZCBieSB7QGNvZGUgc2VhcmNofS4gVGhpcyBtYXkgbm90IGV4aXN0IChpZiB0aGUKKyAgICAgKiBhcmd1bWVudCB3YXMgaGlnaGVyIHRoYW4gdGhlIGxhc3QgdHJhbnNpdGlvbiBieXRlKSwgaW4gd2hpY2ggY2FzZSB0aGlzIHJldHVybnMgdGhlIGdpdmVuIHtAY29kZSBkZWZhdWx0VmFsdWV9LgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBsb25nIGdyZWF0ZXJUcmFuc2l0aW9uKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGxvbmcgcG9zaXRpb25Mb25nLCBpbnQgc2VhcmNoSW5kZXgsIGxvbmcgZGVmYXVsdFZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB0cmFuc2l0aW9uIHRoYXQgaXMgbG93ZXIgdGhhbiB0aGUgaW5kZXggcmV0dXJuZWQgYnkge0Bjb2RlIHNlYXJjaH0uIFJldHVybnMge0Bjb2RlIGRlZmF1bHRWYWx1ZX0gZm9yCisgICAgICoge0Bjb2RlIHNlYXJjaEluZGV4fSBlcXVhbHMgMCBvciAtMSBhcyBsZXNzZXIgdHJhbnNpdGlvbiBmb3IgdGhvc2UgaW5kZXhlcyBkb2VzIG5vdCBleGlzdC4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgbG9uZyBsZXNzZXJUcmFuc2l0aW9uKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGxvbmcgcG9zaXRpb25Mb25nLCBpbnQgc2VhcmNoSW5kZXgsIGxvbmcgZGVmYXVsdFZhbHVlKTsKKworICAgIC8vIENvbnN0cnVjdGlvbiAoc2VyaWFsaXphdGlvbikgbWV0aG9kcworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5vZGUgdHlwZSB0aGF0IGlzIHN1aXRhYmxlIHRvIHN0b3JlIHRoZSBub2RlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVHJpZU5vZGUgdHlwZUZvcihTZXJpYWxpemF0aW9uTm9kZTw/PiBub2RlLCBsb25nIG5vZGVQb3NpdGlvbikKKyAgICB7CisgICAgICAgIGludCBjID0gbm9kZS5jaGlsZENvdW50KCk7CisgICAgICAgIGlmIChjID09IDApCisgICAgICAgICAgICByZXR1cm4gVHlwZXMuUEFZTE9BRF9PTkxZOworCisgICAgICAgIGludCBiaXRzUGVyUG9pbnRlckluZGV4ID0gMDsKKyAgICAgICAgbG9uZyBkZWx0YSA9IG5vZGUubWF4UG9zaXRpb25EZWx0YShub2RlUG9zaXRpb24pOworICAgICAgICBhc3NlcnQgZGVsdGEgPCAwOworICAgICAgICB3aGlsZSAoIVR5cGVzLnNpbmdsZXNbYml0c1BlclBvaW50ZXJJbmRleF0uZml0cygtZGVsdGEpKQorICAgICAgICAgICAgKytiaXRzUGVyUG9pbnRlckluZGV4OworCisgICAgICAgIGlmIChjID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChub2RlLnBheWxvYWQoKSAhPSBudWxsICYmIFR5cGVzLnNpbmdsZXNbYml0c1BlclBvaW50ZXJJbmRleF0uYnl0ZXNQZXJQb2ludGVyID09IEZSQUNUSU9OQUxfQllURVMpCisgICAgICAgICAgICAgICAgKytiaXRzUGVyUG9pbnRlckluZGV4OyAvLyBuZXh0IGluZGV4IHdpbGwgcGVybWl0IHBheWxvYWQKKworICAgICAgICAgICAgcmV0dXJuIFR5cGVzLnNpbmdsZXNbYml0c1BlclBvaW50ZXJJbmRleF07CisgICAgICAgIH0KKworICAgICAgICBUcmllTm9kZSBzcGFyc2UgPSBUeXBlcy5zcGFyc2VzW2JpdHNQZXJQb2ludGVySW5kZXhdOworICAgICAgICBUcmllTm9kZSBkZW5zZSA9IFR5cGVzLmRlbnNlc1tiaXRzUGVyUG9pbnRlckluZGV4XTsKKyAgICAgICAgcmV0dXJuIChzcGFyc2Uuc2l6ZW9mTm9kZShub2RlKSA8IGRlbnNlLnNpemVvZk5vZGUobm9kZSkpID8gc3BhcnNlIDogZGVuc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2l6ZSBuZWVkZWQgdG8gc2VyaWFsaXplIHRoaXMgbm9kZS4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgaW50IHNpemVvZk5vZGUoU2VyaWFsaXphdGlvbk5vZGU8Pz4gbm9kZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBub2RlLiBBbGwgdHJhbnNpdGlvbiB0YXJnZXQgcG9zaXRpb25zIG11c3QgYWxyZWFkeSBoYXZlIGJlZW4gZGVmaW5lZC4ge0Bjb2RlIHBheWxvYWRCaXRzfSBtdXN0CisgICAgICogYmUgZm91ciBiaXRzLgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShEYXRhT3V0cHV0UGx1cyBvdXQsIFNlcmlhbGl6YXRpb25Ob2RlPD8+IG5vZGUsIGludCBwYXlsb2FkQml0cywgbG9uZyBub2RlUG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8vIEltcGxlbWVudGF0aW9ucworCisgICAgZmluYWwgaW50IGJ5dGVzUGVyUG9pbnRlcjsKKyAgICBzdGF0aWMgZmluYWwgaW50IEZSQUNUSU9OQUxfQllURVMgPSAwOworCisgICAgVHJpZU5vZGUoaW50IG9yZGluYWwsIGludCBieXRlc1BlclBvaW50ZXIpCisgICAgeworICAgICAgICB0aGlzLm9yZGluYWwgPSBvcmRpbmFsOworICAgICAgICB0aGlzLmJ5dGVzUGVyUG9pbnRlciA9IGJ5dGVzUGVyUG9pbnRlcjsKKyAgICB9CisKKyAgICBmaW5hbCBpbnQgb3JkaW5hbDsKKworICAgIHN0YXRpYyBwcml2YXRlIGNsYXNzIFBheWxvYWRPbmx5IGV4dGVuZHMgVHJpZU5vZGUKKyAgICB7CisgICAgICAgIC8vIGJ5dGUgZmxhZ3MKKyAgICAgICAgLy8gdmFyIHBheWxvYWQKKyAgICAgICAgUGF5bG9hZE9ubHkoaW50IG9yZGluYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKG9yZGluYWwsIEZSQUNUSU9OQUxfQllURVMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgcGF5bG9hZFBvc2l0aW9uKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbiArIDE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBzZWFyY2goQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgaW50IHRyYW5zaXRpb25CeXRlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgdHJhbnNpdGlvbkRlbHRhKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGludCBjaGlsZEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyB0cmFuc2l0aW9uKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGxvbmcgcG9zaXRpb25Mb25nLCBpbnQgY2hpbGRJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE5PTkU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgbGFzdFRyYW5zaXRpb24oQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgbG9uZyBwb3NpdGlvbkxvbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBOT05FOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdyZWF0ZXJUcmFuc2l0aW9uKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGxvbmcgcG9zaXRpb25Mb25nLCBpbnQgc2VhcmNoSW5kZXgsIGxvbmcgZGVmYXVsdFZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGxlc3NlclRyYW5zaXRpb24oQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgbG9uZyBwb3NpdGlvbkxvbmcsIGludCBzZWFyY2hJbmRleCwgbG9uZyBkZWZhdWx0VmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCB0cmFuc2l0aW9uQnl0ZShCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uLCBpbnQgY2hpbGRJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgdHJhbnNpdGlvblJhbmdlKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBzaXplb2ZOb2RlKFNlcmlhbGl6YXRpb25Ob2RlPD8+IG5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShEYXRhT3V0cHV0UGx1cyBkZXN0LCBTZXJpYWxpemF0aW9uTm9kZTw/PiBub2RlLCBpbnQgcGF5bG9hZEJpdHMsIGxvbmcgbm9kZVBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUoKG9yZGluYWwgPDwgNCkgKyAocGF5bG9hZEJpdHMgJiAweDBGKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgcHJpdmF0ZSBjbGFzcyBTaW5nbGUgZXh0ZW5kcyBUcmllTm9kZQorICAgIHsKKyAgICAgICAgLy8gYnl0ZSBmbGFncworICAgICAgICAvLyBieXRlIHRyYW5zaXRpb24KKyAgICAgICAgLy8gYnl0ZXNQZXJQb2ludGVyIGJ5dGVzIHRyYW5zaXRpb24gdGFyZ2V0CisgICAgICAgIC8vIHZhciBwYXlsb2FkCisKKyAgICAgICAgU2luZ2xlKGludCBvcmRpbmFsLCBpbnQgYnl0ZXNQZXJQb2ludGVyKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihvcmRpbmFsLCBieXRlc1BlclBvaW50ZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgcGF5bG9hZFBvc2l0aW9uKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbiArIDIgKyBieXRlc1BlclBvaW50ZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBzZWFyY2goQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgaW50IHRyYW5zaXRpb25CeXRlKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYyA9IHNyYy5nZXQocG9zaXRpb24gKyAxKSAmIDB4RkY7CisgICAgICAgICAgICBpZiAodHJhbnNpdGlvbkJ5dGUgPT0gYykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2l0aW9uQnl0ZSA8IGMgPyAtMSA6IC0yOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgdHJhbnNpdGlvbkRlbHRhKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGludCBjaGlsZEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gLXJlYWRCeXRlcyhzcmMsIHBvc2l0aW9uICsgMik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgbGFzdFRyYW5zaXRpb24oQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgbG9uZyBwb3NpdGlvbkxvbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2l0aW9uKHNyYywgcG9zaXRpb24sIHBvc2l0aW9uTG9uZywgMCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ3JlYXRlclRyYW5zaXRpb24oQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgbG9uZyBwb3NpdGlvbkxvbmcsIGludCBzZWFyY2hJbmRleCwgbG9uZyBkZWZhdWx0VmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoc2VhcmNoSW5kZXggPT0gLTEpID8gdHJhbnNpdGlvbihzcmMsIHBvc2l0aW9uLCBwb3NpdGlvbkxvbmcsIDApIDogZGVmYXVsdFZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGxlc3NlclRyYW5zaXRpb24oQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgbG9uZyBwb3NpdGlvbkxvbmcsIGludCBzZWFyY2hJbmRleCwgbG9uZyBkZWZhdWx0VmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzZWFyY2hJbmRleCA9PSAwIHx8IHNlYXJjaEluZGV4ID09IC0xID8gZGVmYXVsdFZhbHVlIDogdHJhbnNpdGlvbihzcmMsIHBvc2l0aW9uLCBwb3NpdGlvbkxvbmcsIDApOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgdHJhbnNpdGlvbkJ5dGUoQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgaW50IGNoaWxkSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjaGlsZEluZGV4ID09IDAgPyBzcmMuZ2V0KHBvc2l0aW9uICsgMSkgJiAweEZGIDogSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCB0cmFuc2l0aW9uUmFuZ2UoQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHNpemVvZk5vZGUoU2VyaWFsaXphdGlvbk5vZGU8Pz4gbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDIgKyBieXRlc1BlclBvaW50ZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKERhdGFPdXRwdXRQbHVzIGRlc3QsIFNlcmlhbGl6YXRpb25Ob2RlPD8+IG5vZGUsIGludCBwYXlsb2FkQml0cywgbG9uZyBub2RlUG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY2hpbGRDb3VudCA9IG5vZGUuY2hpbGRDb3VudCgpOworICAgICAgICAgICAgYXNzZXJ0IGNoaWxkQ291bnQgPT0gMTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKChvcmRpbmFsIDw8IDQpICsgKHBheWxvYWRCaXRzICYgMHgwRikpOworCisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZShub2RlLnRyYW5zaXRpb24oMCkpOworICAgICAgICAgICAgd3JpdGVCeXRlcyhkZXN0LCAtbm9kZS5zZXJpYWxpemVkUG9zaXRpb25EZWx0YSgwLCBub2RlUG9zaXRpb24pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBwcml2YXRlIGNsYXNzIFNpbmdsZU5vUGF5bG9hZDQgZXh0ZW5kcyBTaW5nbGUKKyAgICB7CisgICAgICAgIC8vIDQtYml0IHR5cGUgb3JkaW5hbAorICAgICAgICAvLyA0LWJpdCB0YXJnZXQgZGVsdGEKKyAgICAgICAgLy8gYnl0ZSB0cmFuc2l0aW9uCisgICAgICAgIC8vIG5vIHBheWxvYWQhCisgICAgICAgIFNpbmdsZU5vUGF5bG9hZDQoaW50IG9yZGluYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKG9yZGluYWwsIEZSQUNUSU9OQUxfQllURVMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgcGF5bG9hZEZsYWdzKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWx0aG91Z2ggd2UgZG9uJ3QgaGF2ZSBhIHBheWxvYWQgcG9zaXRpb24sIHByb3ZpZGUgb25lIGZvciBjYWxjdWxhdGluZyB0aGUgc2l6ZSBvZiB0aGUgbm9kZS4KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgcGF5bG9hZFBvc2l0aW9uKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbiArIDI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgdHJhbnNpdGlvbkRlbHRhKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGludCBjaGlsZEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gLShzcmMuZ2V0KHBvc2l0aW9uKSAmIDB4Rik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgYm9vbGVhbiBmaXRzKGxvbmcgZGVsdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAwIDw9IGRlbHRhICYmIGRlbHRhIDw9IDB4RjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoRGF0YU91dHB1dFBsdXMgZGVzdCwgU2VyaWFsaXphdGlvbk5vZGU8Pz4gbm9kZSwgaW50IHBheWxvYWRCaXRzLCBsb25nIG5vZGVQb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBwYXlsb2FkQml0cyA9PSAwOworICAgICAgICAgICAgaW50IGNoaWxkQ291bnQgPSBub2RlLmNoaWxkQ291bnQoKTsKKyAgICAgICAgICAgIGFzc2VydCBjaGlsZENvdW50ID09IDE7CisgICAgICAgICAgICBsb25nIHBkID0gLW5vZGUuc2VyaWFsaXplZFBvc2l0aW9uRGVsdGEoMCwgbm9kZVBvc2l0aW9uKTsKKyAgICAgICAgICAgIGFzc2VydCBwZCA+IDAgJiYgcGQgPCAweDEwOworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUoKG9yZGluYWwgPDwgNCkgKyAoaW50KSAocGQgJiAweDBGKSk7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZShub2RlLnRyYW5zaXRpb24oMCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZW9mTm9kZShTZXJpYWxpemF0aW9uTm9kZTw/PiBub2RlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBwcml2YXRlIGNsYXNzIFNpbmdsZU5vUGF5bG9hZDEyIGV4dGVuZHMgU2luZ2xlCisgICAgeworICAgICAgICAvLyA0LWJpdCB0eXBlIG9yZGluYWwKKyAgICAgICAgLy8gMTItYml0IHRhcmdldCBkZWx0YQorICAgICAgICAvLyBieXRlIHRyYW5zaXRpb24KKyAgICAgICAgLy8gbm8gcGF5bG9hZCEKKyAgICAgICAgU2luZ2xlTm9QYXlsb2FkMTIoaW50IG9yZGluYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKG9yZGluYWwsIEZSQUNUSU9OQUxfQllURVMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgcGF5bG9hZEZsYWdzKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWx0aG91Z2ggd2UgZG9uJ3QgaGF2ZSBhIHBheWxvYWQgcG9zaXRpb24sIHByb3ZpZGUgb25lIGZvciBjYWxjdWxhdGluZyB0aGUgc2l6ZSBvZiB0aGUgbm9kZS4KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgcGF5bG9hZFBvc2l0aW9uKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbiArIDM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBzZWFyY2goQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgaW50IHRyYW5zaXRpb25CeXRlKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYyA9IHNyYy5nZXQocG9zaXRpb24gKyAyKSAmIDB4RkY7CisgICAgICAgICAgICBpZiAodHJhbnNpdGlvbkJ5dGUgPT0gYykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2l0aW9uQnl0ZSA8IGMgPyAtMSA6IC0yOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIHRyYW5zaXRpb25EZWx0YShCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uLCBpbnQgY2hpbGRJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIC0oc3JjLmdldFNob3J0KHBvc2l0aW9uKSAmIDB4RkZGKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHRyYW5zaXRpb25CeXRlKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGludCBjaGlsZEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY2hpbGRJbmRleCA9PSAwID8gc3JjLmdldChwb3NpdGlvbiArIDIpICYgMHhGRiA6IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIGJvb2xlYW4gZml0cyhsb25nIGRlbHRhKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMCA8PSBkZWx0YSAmJiBkZWx0YSA8PSAweEZGRjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoRGF0YU91dHB1dFBsdXMgZGVzdCwgU2VyaWFsaXphdGlvbk5vZGU8Pz4gbm9kZSwgaW50IHBheWxvYWRCaXRzLCBsb25nIG5vZGVQb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBwYXlsb2FkQml0cyA9PSAwOworICAgICAgICAgICAgaW50IGNoaWxkQ291bnQgPSBub2RlLmNoaWxkQ291bnQoKTsKKyAgICAgICAgICAgIGFzc2VydCBjaGlsZENvdW50ID09IDE7CisgICAgICAgICAgICBsb25nIHBkID0gLW5vZGUuc2VyaWFsaXplZFBvc2l0aW9uRGVsdGEoMCwgbm9kZVBvc2l0aW9uKTsKKyAgICAgICAgICAgIGFzc2VydCBwZCA+IDAgJiYgcGQgPCAweDEwMDA7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgob3JkaW5hbCA8PCA0KSArIChpbnQpICgocGQgPj4gOCkgJiAweDBGKSk7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgoYnl0ZSkgcGQpOworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUobm9kZS50cmFuc2l0aW9uKDApKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHNpemVvZk5vZGUoU2VyaWFsaXphdGlvbk5vZGU8Pz4gbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgcHJpdmF0ZSBjbGFzcyBTcGFyc2UgZXh0ZW5kcyBUcmllTm9kZQorICAgIHsKKyAgICAgICAgLy8gYnl0ZSBmbGFncworICAgICAgICAvLyBieXRlIGNvdW50ICg8PSAyNTUpCisgICAgICAgIC8vIGNvdW50IGJ5dGVzIHRyYW5zaXRpb25zCisgICAgICAgIC8vIGNvdW50IGludHMgdHJhbnNpdGlvbiB0YXJnZXRzCisgICAgICAgIC8vIHZhciBwYXlsb2FkCisKKyAgICAgICAgU3BhcnNlKGludCBvcmRpbmFsLCBpbnQgYnl0ZXNQZXJQb2ludGVyKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihvcmRpbmFsLCBieXRlc1BlclBvaW50ZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgdHJhbnNpdGlvblJhbmdlKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzcmMuZ2V0KHBvc2l0aW9uICsgMSkgJiAweEZGOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgcGF5bG9hZFBvc2l0aW9uKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IHRyYW5zaXRpb25SYW5nZShzcmMsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbiArIDIgKyAoYnl0ZXNQZXJQb2ludGVyICsgMSkgKiBjb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHNlYXJjaChCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uLCBpbnQga2V5KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbCA9IC0xOyAvLyBrbm93biA8IGtleQorICAgICAgICAgICAgaW50IHIgPSB0cmFuc2l0aW9uUmFuZ2Uoc3JjLCBwb3NpdGlvbik7ICAgLy8ga25vd24gPiBrZXkKKyAgICAgICAgICAgIHBvc2l0aW9uICs9IDI7CisKKyAgICAgICAgICAgIHdoaWxlIChsICsgMSA8IHIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG0gPSAobCArIHIgKyAxKSAvIDI7CisgICAgICAgICAgICAgICAgaW50IGNoaWxkVHJhbnNpdGlvbiA9IHNyYy5nZXQocG9zaXRpb24gKyBtKSAmIDB4RkY7CisgICAgICAgICAgICAgICAgaW50IGNtcCA9IEludGVnZXIuY29tcGFyZShrZXksIGNoaWxkVHJhbnNpdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKGNtcCA8IDApCisgICAgICAgICAgICAgICAgICAgIHIgPSBtOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNtcCA+IDApCisgICAgICAgICAgICAgICAgICAgIGwgPSBtOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAtciAtIDE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgdHJhbnNpdGlvbkRlbHRhKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGludCBjaGlsZEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgY2hpbGRJbmRleCA+PSAwOworICAgICAgICAgICAgaW50IHJhbmdlID0gdHJhbnNpdGlvblJhbmdlKHNyYywgcG9zaXRpb24pOworICAgICAgICAgICAgYXNzZXJ0IGNoaWxkSW5kZXggPCByYW5nZTsKKyAgICAgICAgICAgIHJldHVybiAtcmVhZEJ5dGVzKHNyYywgcG9zaXRpb24gKyAyICsgcmFuZ2UgKyBieXRlc1BlclBvaW50ZXIgKiBjaGlsZEluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBncmVhdGVyVHJhbnNpdGlvbihCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uLCBsb25nIHBvc2l0aW9uTG9uZywgaW50IHNlYXJjaEluZGV4LCBsb25nIGRlZmF1bHRWYWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNlYXJjaEluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICBzZWFyY2hJbmRleCA9IC0xIC0gc2VhcmNoSW5kZXg7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKytzZWFyY2hJbmRleDsKKyAgICAgICAgICAgIGlmIChzZWFyY2hJbmRleCA+PSB0cmFuc2l0aW9uUmFuZ2Uoc3JjLCBwb3NpdGlvbikpCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2l0aW9uKHNyYywgcG9zaXRpb24sIHBvc2l0aW9uTG9uZywgc2VhcmNoSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgbGVzc2VyVHJhbnNpdGlvbihCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uLCBsb25nIHBvc2l0aW9uTG9uZywgaW50IHNlYXJjaEluZGV4LCBsb25nIGRlZmF1bHRWYWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNlYXJjaEluZGV4ID09IDAgfHwgc2VhcmNoSW5kZXggPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgIGlmIChzZWFyY2hJbmRleCA8IDApCisgICAgICAgICAgICAgICAgc2VhcmNoSW5kZXggPSAtMiAtIHNlYXJjaEluZGV4OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIC0tc2VhcmNoSW5kZXg7CisgICAgICAgICAgICByZXR1cm4gdHJhbnNpdGlvbihzcmMsIHBvc2l0aW9uLCBwb3NpdGlvbkxvbmcsIHNlYXJjaEluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHRyYW5zaXRpb25CeXRlKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGludCBjaGlsZEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY2hpbGRJbmRleCA8IHRyYW5zaXRpb25SYW5nZShzcmMsIHBvc2l0aW9uKSA/IHNyYy5nZXQocG9zaXRpb24gKyAyICsgY2hpbGRJbmRleCkgJiAweEZGIDogSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBzaXplb2ZOb2RlKFNlcmlhbGl6YXRpb25Ob2RlPD8+IG5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAyICsgbm9kZS5jaGlsZENvdW50KCkgKiAoMSArIGJ5dGVzUGVyUG9pbnRlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKERhdGFPdXRwdXRQbHVzIGRlc3QsIFNlcmlhbGl6YXRpb25Ob2RlPD8+IG5vZGUsIGludCBwYXlsb2FkQml0cywgbG9uZyBub2RlUG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY2hpbGRDb3VudCA9IG5vZGUuY2hpbGRDb3VudCgpOworICAgICAgICAgICAgYXNzZXJ0IGNoaWxkQ291bnQgPiAwOworICAgICAgICAgICAgYXNzZXJ0IGNoaWxkQ291bnQgPCAyNTY7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgob3JkaW5hbCA8PCA0KSArIChwYXlsb2FkQml0cyAmIDB4MEYpKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKGNoaWxkQ291bnQpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkQ291bnQ7ICsraSkKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZShub2RlLnRyYW5zaXRpb24oaSkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZENvdW50OyArK2kpCisgICAgICAgICAgICAgICAgd3JpdGVCeXRlcyhkZXN0LCAtbm9kZS5zZXJpYWxpemVkUG9zaXRpb25EZWx0YShpLCBub2RlUG9zaXRpb24pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBwcml2YXRlIGNsYXNzIFNwYXJzZTEyIGV4dGVuZHMgU3BhcnNlCisgICAgeworICAgICAgICAvLyBieXRlIGZsYWdzCisgICAgICAgIC8vIGJ5dGUgY291bnQgKDw9IDI1NSkKKyAgICAgICAgLy8gY291bnQgYnl0ZXMgdHJhbnNpdGlvbnMKKyAgICAgICAgLy8gY291bnQgMTItYml0cyB0cmFuc2l0aW9uIHRhcmdldHMKKyAgICAgICAgLy8gdmFyIHBheWxvYWQKKyAgICAgICAgU3BhcnNlMTIoaW50IG9yZGluYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKG9yZGluYWwsIEZSQUNUSU9OQUxfQllURVMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgcGF5bG9hZFBvc2l0aW9uKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IHRyYW5zaXRpb25SYW5nZShzcmMsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbiArIDIgKyAoNSAqIGNvdW50ICsgMSkgLyAyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIHRyYW5zaXRpb25EZWx0YShCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uLCBpbnQgY2hpbGRJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIC1yZWFkMTJCaXRzKHNyYywgcG9zaXRpb24gKyAyICsgdHJhbnNpdGlvblJhbmdlKHNyYywgcG9zaXRpb24pLCBjaGlsZEluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHNpemVvZk5vZGUoU2VyaWFsaXphdGlvbk5vZGU8Pz4gbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDIgKyAobm9kZS5jaGlsZENvdW50KCkgKiA1ICsgMSkgLyAyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShEYXRhT3V0cHV0UGx1cyBkZXN0LCBTZXJpYWxpemF0aW9uTm9kZTw/PiBub2RlLCBpbnQgcGF5bG9hZEJpdHMsIGxvbmcgbm9kZVBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNoaWxkQ291bnQgPSBub2RlLmNoaWxkQ291bnQoKTsKKyAgICAgICAgICAgIGFzc2VydCBjaGlsZENvdW50IDwgMjU2OworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUoKG9yZGluYWwgPDwgNCkgKyAocGF5bG9hZEJpdHMgJiAweDBGKSk7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZShjaGlsZENvdW50KTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZENvdW50OyArK2kpCisgICAgICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUobm9kZS50cmFuc2l0aW9uKGkpKTsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSArIDIgPD0gY2hpbGRDb3VudDsgaSArPSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBwMCA9IChpbnQpIC1ub2RlLnNlcmlhbGl6ZWRQb3NpdGlvbkRlbHRhKGksIG5vZGVQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgaW50IHAxID0gKGludCkgLW5vZGUuc2VyaWFsaXplZFBvc2l0aW9uRGVsdGEoaSArIDEsIG5vZGVQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgYXNzZXJ0IHAwID4gMCAmJiBwMCA8ICgxIDw8IDEyKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQgcDEgPiAwICYmIHAxIDwgKDEgPDwgMTIpOworICAgICAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKHAwID4+IDQpOworICAgICAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKChwMCA8PCA0KSB8IChwMSA+PiA4KSk7CisgICAgICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUocDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPCBjaGlsZENvdW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvbmcgcGQgPSAtbm9kZS5zZXJpYWxpemVkUG9zaXRpb25EZWx0YShpLCBub2RlUG9zaXRpb24pOworICAgICAgICAgICAgICAgIGFzc2VydCBwZCA+IDAgJiYgcGQgPCAoMSA8PCAxMik7CisgICAgICAgICAgICAgICAgZGVzdC53cml0ZVNob3J0KChzaG9ydCkgKHBkIDw8IDQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBib29sZWFuIGZpdHMobG9uZyBkZWx0YSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDAgPD0gZGVsdGEgJiYgZGVsdGEgPD0gMHhGRkY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgcHJpdmF0ZSBjbGFzcyBEZW5zZSBleHRlbmRzIFRyaWVOb2RlCisgICAgeworICAgICAgICAvLyBieXRlIGZsYWdzCisgICAgICAgIC8vIGJ5dGUgc3RhcnQKKyAgICAgICAgLy8gYnl0ZSBsZW5ndGgtMQorICAgICAgICAvLyBsZW5ndGggaW50cyB0cmFuc2l0aW9uIHRhcmdldHMgKC0xIGZvciBub3QgcHJlc2VudCkKKyAgICAgICAgLy8gdmFyIHBheWxvYWQKKworICAgICAgICBzdGF0aWMgZmluYWwgaW50IE5VTExfVkFMVUUgPSAwOworCisgICAgICAgIERlbnNlKGludCBvcmRpbmFsLCBpbnQgYnl0ZXNQZXJQb2ludGVyKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihvcmRpbmFsLCBieXRlc1BlclBvaW50ZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgdHJhbnNpdGlvblJhbmdlKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAxICsgKHNyYy5nZXQocG9zaXRpb24gKyAyKSAmIDB4RkYpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgcGF5bG9hZFBvc2l0aW9uKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbiArIDMgKyB0cmFuc2l0aW9uUmFuZ2Uoc3JjLCBwb3NpdGlvbikgKiBieXRlc1BlclBvaW50ZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBzZWFyY2goQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgaW50IHRyYW5zaXRpb25CeXRlKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbCA9IHNyYy5nZXQocG9zaXRpb24gKyAxKSAmIDB4RkY7CisgICAgICAgICAgICBpbnQgaSA9IHRyYW5zaXRpb25CeXRlIC0gbDsKKyAgICAgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBpbnQgbGVuID0gdHJhbnNpdGlvblJhbmdlKHNyYywgcG9zaXRpb24pOworICAgICAgICAgICAgaWYgKGkgPj0gbGVuKQorICAgICAgICAgICAgICAgIHJldHVybiAtbGVuIC0gMTsKKyAgICAgICAgICAgIGxvbmcgdCA9IHRyYW5zaXRpb24oc3JjLCBwb3NpdGlvbiwgMEwsIGkpOworICAgICAgICAgICAgcmV0dXJuIHQgIT0gLTEgPyBpIDogLWkgLSAxOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIHRyYW5zaXRpb25EZWx0YShCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uLCBpbnQgY2hpbGRJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIC1yZWFkQnl0ZXMoc3JjLCBwb3NpdGlvbiArIDMgKyBjaGlsZEluZGV4ICogYnl0ZXNQZXJQb2ludGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyB0cmFuc2l0aW9uKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGxvbmcgcG9zaXRpb25Mb25nLCBpbnQgY2hpbGRJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyB2ID0gdHJhbnNpdGlvbkRlbHRhKHNyYywgcG9zaXRpb24sIGNoaWxkSW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIHYgIT0gTlVMTF9WQUxVRSA/IHYgKyBwb3NpdGlvbkxvbmcgOiBOT05FOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdyZWF0ZXJUcmFuc2l0aW9uKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGxvbmcgcG9zaXRpb25Mb25nLCBpbnQgc2VhcmNoSW5kZXgsIGxvbmcgZGVmYXVsdFZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2VhcmNoSW5kZXggPCAwKQorICAgICAgICAgICAgICAgIHNlYXJjaEluZGV4ID0gLTEgLSBzZWFyY2hJbmRleDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICArK3NlYXJjaEluZGV4OworICAgICAgICAgICAgaW50IGxlbiA9IHRyYW5zaXRpb25SYW5nZShzcmMsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGZvciAoOyBzZWFyY2hJbmRleCA8IGxlbjsgKytzZWFyY2hJbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIHQgPSB0cmFuc2l0aW9uKHNyYywgcG9zaXRpb24sIHBvc2l0aW9uTG9uZywgc2VhcmNoSW5kZXgpOworICAgICAgICAgICAgICAgIGlmICh0ICE9IE5PTkUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBsZXNzZXJUcmFuc2l0aW9uKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGxvbmcgcG9zaXRpb25Mb25nLCBpbnQgc2VhcmNoSW5kZXgsIGxvbmcgZGVmYXVsdFZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2VhcmNoSW5kZXggPT0gMCB8fCBzZWFyY2hJbmRleCA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworCisgICAgICAgICAgICBpZiAoc2VhcmNoSW5kZXggPCAwKQorICAgICAgICAgICAgICAgIHNlYXJjaEluZGV4ID0gLTIgLSBzZWFyY2hJbmRleDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAtLXNlYXJjaEluZGV4OworICAgICAgICAgICAgZm9yICg7IHNlYXJjaEluZGV4ID49IDA7IC0tc2VhcmNoSW5kZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9uZyB0ID0gdHJhbnNpdGlvbihzcmMsIHBvc2l0aW9uLCBwb3NpdGlvbkxvbmcsIHNlYXJjaEluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAodCAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiAidHJhbnNpdGlvbiBtdXN0IGFsd2F5cyBleGlzdCBhdCAwLCBhbmQgd2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgZm9yIGxlc3Mgb2YgdGhhdCI7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgdHJhbnNpdGlvbkJ5dGUoQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgaW50IGNoaWxkSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjaGlsZEluZGV4ID49IHRyYW5zaXRpb25SYW5nZShzcmMsIHBvc2l0aW9uKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICBpbnQgbCA9IHNyYy5nZXQocG9zaXRpb24gKyAxKSAmIDB4RkY7CisgICAgICAgICAgICByZXR1cm4gbCArIGNoaWxkSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBzaXplb2ZOb2RlKFNlcmlhbGl6YXRpb25Ob2RlPD8+IG5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsID0gbm9kZS50cmFuc2l0aW9uKDApOworICAgICAgICAgICAgaW50IHIgPSBub2RlLnRyYW5zaXRpb24obm9kZS5jaGlsZENvdW50KCkgLSAxKTsKKyAgICAgICAgICAgIHJldHVybiAzICsgKHIgLSBsICsgMSkgKiBieXRlc1BlclBvaW50ZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKERhdGFPdXRwdXRQbHVzIGRlc3QsIFNlcmlhbGl6YXRpb25Ob2RlPD8+IG5vZGUsIGludCBwYXlsb2FkQml0cywgbG9uZyBub2RlUG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY2hpbGRDb3VudCA9IG5vZGUuY2hpbGRDb3VudCgpOworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUoKG9yZGluYWwgPDwgNCkgKyAocGF5bG9hZEJpdHMgJiAweDBGKSk7CisgICAgICAgICAgICBpbnQgbCA9IG5vZGUudHJhbnNpdGlvbigwKTsKKyAgICAgICAgICAgIGludCByID0gbm9kZS50cmFuc2l0aW9uKGNoaWxkQ291bnQgLSAxKTsKKyAgICAgICAgICAgIGFzc2VydCAwIDw9IGwgJiYgbCA8PSByICYmIHIgPD0gMjU1OworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUobCk7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZShyIC0gbCk7ICAgICAgLy8gciBpcyBpbmNsdWRlZCwgaS5lLiB0aGlzIGlzIGxlbiAtIDEKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZENvdW50OyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG5leHQgPSBub2RlLnRyYW5zaXRpb24oaSk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGwgPCBuZXh0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVCeXRlcyhkZXN0LCBOVUxMX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgKytsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZUJ5dGVzKGRlc3QsIC1ub2RlLnNlcmlhbGl6ZWRQb3NpdGlvbkRlbHRhKGksIG5vZGVQb3NpdGlvbikpOworICAgICAgICAgICAgICAgICsrbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBwcml2YXRlIGNsYXNzIERlbnNlMTIgZXh0ZW5kcyBEZW5zZQorICAgIHsKKyAgICAgICAgLy8gYnl0ZSBmbGFncworICAgICAgICAvLyBieXRlIHN0YXJ0CisgICAgICAgIC8vIGJ5dGUgbGVuZ3RoLTEKKyAgICAgICAgLy8gbGVuZ3RoIDEyLWJpdHMgdHJhbnNpdGlvbiB0YXJnZXRzICgtMSBmb3Igbm90IHByZXNlbnQpCisgICAgICAgIC8vIHZhciBwYXlsb2FkCisKKyAgICAgICAgRGVuc2UxMihpbnQgb3JkaW5hbCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIob3JkaW5hbCwgRlJBQ1RJT05BTF9CWVRFUyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBwYXlsb2FkUG9zaXRpb24oQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uICsgMyArICh0cmFuc2l0aW9uUmFuZ2Uoc3JjLCBwb3NpdGlvbikgKiAzICsgMSkgLyAyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIHRyYW5zaXRpb25EZWx0YShCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uLCBpbnQgY2hpbGRJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIC1yZWFkMTJCaXRzKHNyYywgcG9zaXRpb24gKyAzLCBjaGlsZEluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHNpemVvZk5vZGUoU2VyaWFsaXphdGlvbk5vZGU8Pz4gbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGwgPSBub2RlLnRyYW5zaXRpb24oMCk7CisgICAgICAgICAgICBpbnQgciA9IG5vZGUudHJhbnNpdGlvbihub2RlLmNoaWxkQ291bnQoKSAtIDEpOworICAgICAgICAgICAgcmV0dXJuIDMgKyAoKHIgLSBsICsgMSkgKiAzICsgMSkgLyAyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShEYXRhT3V0cHV0UGx1cyBkZXN0LCBTZXJpYWxpemF0aW9uTm9kZTw/PiBub2RlLCBpbnQgcGF5bG9hZEJpdHMsIGxvbmcgbm9kZVBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNoaWxkQ291bnQgPSBub2RlLmNoaWxkQ291bnQoKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKChvcmRpbmFsIDw8IDQpICsgKHBheWxvYWRCaXRzICYgMHgwRikpOworICAgICAgICAgICAgaW50IGwgPSBub2RlLnRyYW5zaXRpb24oMCk7CisgICAgICAgICAgICBpbnQgciA9IG5vZGUudHJhbnNpdGlvbihjaGlsZENvdW50IC0gMSk7CisgICAgICAgICAgICBhc3NlcnQgMCA8PSBsICYmIGwgPD0gciAmJiByIDw9IDI1NTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKGwpOworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUociAtIGwpOyAgICAgIC8vIHIgaXMgaW5jbHVkZWQsIGkuZS4gdGhpcyBpcyBsZW4gLSAxCisKKyAgICAgICAgICAgIGludCBjYXJyeSA9IDA7CisgICAgICAgICAgICBpbnQgc3RhcnQgPSBsOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZENvdW50OyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG5leHQgPSBub2RlLnRyYW5zaXRpb24oaSk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGwgPCBuZXh0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FycnkgPSB3cml0ZTEyQml0cyhkZXN0LCBOVUxMX1ZBTFVFLCBsIC0gc3RhcnQsIGNhcnJ5KTsKKyAgICAgICAgICAgICAgICAgICAgKytsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb25nIHBkID0gbm9kZS5zZXJpYWxpemVkUG9zaXRpb25EZWx0YShpLCBub2RlUG9zaXRpb24pOworICAgICAgICAgICAgICAgIGNhcnJ5ID0gd3JpdGUxMkJpdHMoZGVzdCwgKGludCkgLXBkLCBsIC0gc3RhcnQsIGNhcnJ5KTsKKyAgICAgICAgICAgICAgICArK2w7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKChsIC0gc3RhcnQpICYgMSkgPT0gMSkKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZShjYXJyeSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgYm9vbGVhbiBmaXRzKGxvbmcgZGVsdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAwIDw9IGRlbHRhICYmIGRlbHRhIDw9IDB4RkZGOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHByaXZhdGUgY2xhc3MgTG9uZ0RlbnNlIGV4dGVuZHMgRGVuc2UKKyAgICB7CisgICAgICAgIC8vIGJ5dGUgZmxhZ3MKKyAgICAgICAgLy8gYnl0ZSBzdGFydAorICAgICAgICAvLyBieXRlIGxlbmd0aC0xCisgICAgICAgIC8vIGxlbmd0aCBsb25nIHRyYW5zaXRpb24gdGFyZ2V0cyAoLTEgZm9yIG5vdCBwcmVzZW50KQorICAgICAgICAvLyB2YXIgcGF5bG9hZAorICAgICAgICBMb25nRGVuc2UoaW50IG9yZGluYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKG9yZGluYWwsIDgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIHRyYW5zaXRpb25EZWx0YShCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uLCBpbnQgY2hpbGRJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIC1zcmMuZ2V0TG9uZyhwb3NpdGlvbiArIDMgKyBjaGlsZEluZGV4ICogOCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVCeXRlcyhEYXRhT3V0cHV0UGx1cyBkZXN0LCBsb25nIG9mcykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVMb25nKG9mcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgYm9vbGVhbiBmaXRzKGxvbmcgZGVsdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisKKyAgICBzdGF0aWMgaW50IHJlYWQxMkJpdHMoQnl0ZUJ1ZmZlciBzcmMsIGludCBiYXNlLCBpbnQgc2VhcmNoSW5kZXgpCisgICAgeworICAgICAgICBpbnQgd29yZCA9IHNyYy5nZXRTaG9ydChiYXNlICsgKDMgKiBzZWFyY2hJbmRleCkgLyAyKTsKKyAgICAgICAgaWYgKChzZWFyY2hJbmRleCAmIDEpID09IDApCisgICAgICAgICAgICB3b3JkID0gKHdvcmQgPj4gNCk7CisgICAgICAgIHJldHVybiB3b3JkICYgMHhGRkY7CisgICAgfQorCisgICAgc3RhdGljIGludCB3cml0ZTEyQml0cyhEYXRhT3V0cHV0IGRlc3QsIGludCB2YWx1ZSwgaW50IGluZGV4LCBpbnQgY2FycnkpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgYXNzZXJ0IDAgPD0gdmFsdWUgJiYgdmFsdWUgPD0gMHhGRkY7CisgICAgICAgIGlmICgoaW5kZXggJiAxKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSh2YWx1ZSA+PiA0KTsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSA8PCA0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUoY2FycnkgfCAodmFsdWUgPj4gOCkpOworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUodmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsb25nIHJlYWRCeXRlcyhCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFNpemVkSW50cy5yZWFkVW5zaWduZWQoc3JjLCBwb3NpdGlvbiwgYnl0ZXNQZXJQb2ludGVyKTsKKyAgICB9CisKKyAgICB2b2lkIHdyaXRlQnl0ZXMoRGF0YU91dHB1dFBsdXMgZGVzdCwgbG9uZyBvZnMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgYXNzZXJ0IGZpdHMob2ZzKTsKKyAgICAgICAgU2l6ZWRJbnRzLndyaXRlKGRlc3QsIG9mcywgYnl0ZXNQZXJQb2ludGVyKTsKKyAgICB9CisKKyAgICBib29sZWFuIGZpdHMobG9uZyBkZWx0YSkKKyAgICB7CisgICAgICAgIHJldHVybiAwIDw9IGRlbHRhICYmIGRlbHRhIDwgKDFMIDw8IChieXRlc1BlclBvaW50ZXIgKiA4KSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgeworICAgICAgICBTdHJpbmcgcmVzID0gZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgIGlmIChieXRlc1BlclBvaW50ZXIgPj0gMSkKKyAgICAgICAgICAgIHJlcyArPSAoYnl0ZXNQZXJQb2ludGVyICogOCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFR5cGVzCisgICAgeworICAgICAgICBzdGF0aWMgZmluYWwgVHJpZU5vZGUgUEFZTE9BRF9PTkxZID0gbmV3IFBheWxvYWRPbmx5KDApOworICAgICAgICBzdGF0aWMgZmluYWwgVHJpZU5vZGUgU0lOR0xFX05PUEFZTE9BRF80ID0gbmV3IFNpbmdsZU5vUGF5bG9hZDQoMSk7CisgICAgICAgIHN0YXRpYyBmaW5hbCBUcmllTm9kZSBTSU5HTEVfOCA9IG5ldyBTaW5nbGUoMiwgMSk7CisgICAgICAgIHN0YXRpYyBmaW5hbCBUcmllTm9kZSBTSU5HTEVfTk9QQVlMT0FEXzEyID0gbmV3IFNpbmdsZU5vUGF5bG9hZDEyKDMpOworICAgICAgICBzdGF0aWMgZmluYWwgVHJpZU5vZGUgU0lOR0xFXzE2ID0gbmV3IFNpbmdsZSg0LCAyKTsKKyAgICAgICAgc3RhdGljIGZpbmFsIFRyaWVOb2RlIFNQQVJTRV84ID0gbmV3IFNwYXJzZSg1LCAxKTsKKyAgICAgICAgc3RhdGljIGZpbmFsIFRyaWVOb2RlIFNQQVJTRV8xMiA9IG5ldyBTcGFyc2UxMig2KTsKKyAgICAgICAgc3RhdGljIGZpbmFsIFRyaWVOb2RlIFNQQVJTRV8xNiA9IG5ldyBTcGFyc2UoNywgMik7CisgICAgICAgIHN0YXRpYyBmaW5hbCBUcmllTm9kZSBTUEFSU0VfMjQgPSBuZXcgU3BhcnNlKDgsIDMpOworICAgICAgICBzdGF0aWMgZmluYWwgVHJpZU5vZGUgU1BBUlNFXzQwID0gbmV3IFNwYXJzZSg5LCA1KTsKKyAgICAgICAgc3RhdGljIGZpbmFsIFRyaWVOb2RlIERFTlNFXzEyID0gbmV3IERlbnNlMTIoMTApOworICAgICAgICBzdGF0aWMgZmluYWwgVHJpZU5vZGUgREVOU0VfMTYgPSBuZXcgRGVuc2UoMTEsIDIpOworICAgICAgICBzdGF0aWMgZmluYWwgVHJpZU5vZGUgREVOU0VfMjQgPSBuZXcgRGVuc2UoMTIsIDMpOworICAgICAgICBzdGF0aWMgZmluYWwgVHJpZU5vZGUgREVOU0VfMzIgPSBuZXcgRGVuc2UoMTMsIDQpOworICAgICAgICBzdGF0aWMgZmluYWwgVHJpZU5vZGUgREVOU0VfNDAgPSBuZXcgRGVuc2UoMTQsIDUpOworICAgICAgICBzdGF0aWMgZmluYWwgVHJpZU5vZGUgTE9OR19ERU5TRSA9IG5ldyBMb25nRGVuc2UoMTUpOworCisgICAgICAgIC8vIFRoZSBwb3NpdGlvbiBvZiBlYWNoIHR5cGUgaW4gdGhpcyBsaXN0IG11c3QgbWF0Y2ggaXRzIG9yZGluYWwgdmFsdWUuIENoZWNrZWQgYnkgdGhlIHN0YXRpYyBibG9jayBiZWxvdy4KKyAgICAgICAgc3RhdGljIGZpbmFsIFRyaWVOb2RlW10gdmFsdWVzID0gbmV3IFRyaWVOb2RlW117IFBBWUxPQURfT05MWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTkdMRV9OT1BBWUxPQURfNCwgU0lOR0xFXzgsIFNJTkdMRV9OT1BBWUxPQURfMTIsIFNJTkdMRV8xNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQQVJTRV84LCBTUEFSU0VfMTIsIFNQQVJTRV8xNiwgU1BBUlNFXzI0LCBTUEFSU0VfNDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERU5TRV8xMiwgREVOU0VfMTYsIERFTlNFXzI0LCBERU5TRV8zMiwgREVOU0VfNDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HX0RFTlNFIH07IC8vIENhdGNoLWFsbAorCisgICAgICAgIC8vIFdlIGNhbid0IGZpdCBhbGwgdHlwZXMgKiBhbGwgc2l6ZXMgaW4gNCBiaXRzLCBzbyB3ZSB1c2UgYSBzZWxlY3Rpb24uIFdoZW4gd2UgZG9uJ3QgaGF2ZSBhIG1hdGNoaW5nIGluc3RhbmNlCisgICAgICAgIC8vIHdlIGp1c3QgdXNlIHNvbWV0aGluZyBtb3JlIGdlbmVyYWwgdGhhdCBjYW4gZG8gaXRzIGpvYi4KKyAgICAgICAgLy8gVGhlIGFycmF5cyBiZWxvdyBtdXN0IGhhdmUgY29ycmVzcG9uZGluZyB0eXBlcyBmb3IgYWxsIHNpemVzIHNwZWNpZmllZCBieSB0aGUgc2luZ2xlcyByb3cuCisgICAgICAgIC8vIE5vdGU6IDEyIGJpdCBzaXplcyBhcmUgaW1wb3J0YW50LCBiZWNhdXNlIHRoYXQgc2l6ZSB3aWxsIGZpdCBhbnkgcG9pbnRlciB3aXRoaW4gYSBwYWdlLXBhY2tlZCBicmFuY2guCisgICAgICAgIHN0YXRpYyBmaW5hbCBUcmllTm9kZVtdIHNpbmdsZXMgPSBuZXcgVHJpZU5vZGVbXXsgU0lOR0xFX05PUEFZTE9BRF80LCBTSU5HTEVfOCwgU0lOR0xFX05PUEFZTE9BRF8xMiwgU0lOR0xFXzE2LCBERU5TRV8yNCwgREVOU0VfMzIsIERFTlNFXzQwLCBMT05HX0RFTlNFIH07CisgICAgICAgIHN0YXRpYyBmaW5hbCBUcmllTm9kZVtdIHNwYXJzZXMgPSBuZXcgVHJpZU5vZGVbXXsgU1BBUlNFXzgsIFNQQVJTRV84LCBTUEFSU0VfMTIsIFNQQVJTRV8xNiwgU1BBUlNFXzI0LCBTUEFSU0VfNDAsIFNQQVJTRV80MCwgTE9OR19ERU5TRSB9OworICAgICAgICBzdGF0aWMgZmluYWwgVHJpZU5vZGVbXSBkZW5zZXMgPSBuZXcgVHJpZU5vZGVbXXsgREVOU0VfMTIsIERFTlNFXzEyLCBERU5TRV8xMiwgREVOU0VfMTYsIERFTlNFXzI0LCBERU5TRV8zMiwgREVOU0VfNDAsIExPTkdfREVOU0UgfTsKKworICAgICAgICBzdGF0aWMKKyAgICAgICAgeworICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gQ29uc3RhbnRDb25kaXRpb25zCisgICAgICAgICAgICBhc3NlcnQgc3BhcnNlcy5sZW5ndGggPT0gc2luZ2xlcy5sZW5ndGggJiYgZGVuc2VzLmxlbmd0aCA9PSBzaW5nbGVzLmxlbmd0aCAmJiB2YWx1ZXMubGVuZ3RoIDw9IDE2OworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICAgICAgYXNzZXJ0IHZhbHVlc1tpXS5vcmRpbmFsID09IGk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9UcmllU2VyaWFsaXplci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvVHJpZVNlcmlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDAxMGNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvVHJpZVNlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby50cmllczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBpbnRlcmZhY2UgVHJpZVNlcmlhbGl6ZXI8VkFMVUUsIERFU1Q+Cit7CisgICAgaW50IHNpemVvZk5vZGUoU2VyaWFsaXphdGlvbk5vZGU8VkFMVUU+IG5vZGUsIGxvbmcgbm9kZVBvc2l0aW9uKTsKKworICAgIC8vIE9ubHkgY2FsbGVkIGFmdGVyIGFsbCBjaGlsZHJlbidzIHNlcmlhbGl6ZWRQb3NpdGlvbnMgaGF2ZSBiZWVuIHNldC4KKyAgICB2b2lkIHdyaXRlKERFU1QgZGVzdCwgU2VyaWFsaXphdGlvbk5vZGU8VkFMVUU+IG5vZGUsIGxvbmcgbm9kZVBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9WYWx1ZUl0ZXJhdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9WYWx1ZUl0ZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZlMGNkNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL1ZhbHVlSXRlcmF0b3IuamF2YQpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udHJpZXM7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLmNvbmN1cnJlbnQuTm90VGhyZWFkU2FmZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmVidWZmZXJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworCisvKioKKyAqIFRocmVhZC11bnNhZmUgdmFsdWUgaXRlcmF0b3IgZm9yIG9uLWRpc2sgdHJpZXMuIFVzZXMgdGhlIGFzc3VtcHRpb25zIG9mIHtAbGluayBXYWxrZXJ9LgorICogPHA+CisgKiBUaGUgbWFpbiB1dGlsaXR5IG9mIHRoaXMgY2xhc3MgaXMgdGhlIHtAbGluayAjbmV4dFBheWxvYWRlZE5vZGUoKX0gbWV0aG9kLCB3aGljaCBsaXN0cyBhbGwgbm9kZXMgdGhhdCBjb250YWluIGEKKyAqIHBheWxvYWQgd2l0aGluIHRoZSByZXF1ZXN0ZWQgYm91bmRzLiBUaGUgdHJlYXRtZW50IG9mIHRoZSBib3VuZHMgaXMgbm9uLXN0YW5kYXJkIChzZWUKKyAqIHtAbGluayAjVmFsdWVJdGVyYXRvcihSZWJ1ZmZlcmVyLCBsb25nLCBCeXRlQ29tcGFyYWJsZSwgQnl0ZUNvbXBhcmFibGUsIGJvb2xlYW4pfSksIG5lY2Vzc2FyeSB0byBwcm9wZXJseSB3YWxrCisgKiB0cmllcyBvZiBwcmVmaXhlcyBhbmQgc2VwYXJhdG9ycy4KKyAqLworQE5vdFRocmVhZFNhZmUKK3B1YmxpYyBjbGFzcyBWYWx1ZUl0ZXJhdG9yPENPTkNSRVRFIGV4dGVuZHMgVmFsdWVJdGVyYXRvcjxDT05DUkVURT4+IGV4dGVuZHMgV2Fsa2VyPENPTkNSRVRFPgoreworICAgIHByaXZhdGUgZmluYWwgQnl0ZVNvdXJjZSBsaW1pdDsKKyAgICBwcml2YXRlIEl0ZXJhdGlvblBvc2l0aW9uIHN0YWNrOworICAgIHByaXZhdGUgbG9uZyBuZXh0OworCisgICAgc3RhdGljIGNsYXNzIEl0ZXJhdGlvblBvc2l0aW9uCisgICAgeworICAgICAgICBmaW5hbCBsb25nIG5vZGU7CisgICAgICAgIGZpbmFsIGludCBsaW1pdDsKKyAgICAgICAgZmluYWwgSXRlcmF0aW9uUG9zaXRpb24gcHJldjsKKyAgICAgICAgaW50IGNoaWxkSW5kZXg7CisKKyAgICAgICAgSXRlcmF0aW9uUG9zaXRpb24obG9uZyBub2RlLCBpbnQgY2hpbGRJbmRleCwgaW50IGxpbWl0LCBJdGVyYXRpb25Qb3NpdGlvbiBwcmV2KQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgdGhpcy5ub2RlID0gbm9kZTsKKyAgICAgICAgICAgIHRoaXMuY2hpbGRJbmRleCA9IGNoaWxkSW5kZXg7CisgICAgICAgICAgICB0aGlzLmxpbWl0ID0gbGltaXQ7CisgICAgICAgICAgICB0aGlzLnByZXYgPSBwcmV2OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiW05vZGUgJWQsIGNoaWxkICVkLCBsaW1pdCAlZF0iLCBub2RlLCBjaGlsZEluZGV4LCBsaW1pdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVmFsdWVJdGVyYXRvcihSZWJ1ZmZlcmVyIHNvdXJjZSwgbG9uZyByb290KQorICAgIHsKKyAgICAgICAgc3VwZXIoc291cmNlLCByb290KTsKKyAgICAgICAgbGltaXQgPSBudWxsOworICAgICAgICBpbml0aWFsaXplTm9MZWZ0Qm91bmQocm9vdCwgMjU2KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJhaW5lZCBpdGVyYXRvci4gVGhlIGVuZCBwb3NpdGlvbiBpcyBhbHdheXMgdHJlYXRlZCBhcyBpbmNsdXNpdmUsIGFuZCB3ZSBoYXZlIHR3byBwb3NzaWJsZSB0cmVhdG1lbnRzIGZvcgorICAgICAqIHRoZSBzdGFydDoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+IFdoZW4ge0Bjb2RlIGFkbWl0UHJlZml4PWZhbHNlfSwgZXhhY3QgbWF0Y2hlcyBhbmQgYW55IHByZWZpeGVzIG9mIHRoZSBzdGFydCBhcmUgZXhjbHVkZWQuCisgICAgICogICA8bGk+IFdoZW4ge0Bjb2RlIGFkbWl0UHJlZml4PXRydWV9LCB0aGUgbG9uZ2VzdCBwcmVmaXggb2YgdGhlIHN0YXJ0IHByZXNlbnQgaW4gdGhlIHRyaWUgaXMgYWxzbyBpbmNsdWRlZCwKKyAgICAgKiAgICAgICAgcHJvdmlkZWQgdGhhdCB0aGVyZSBpcyBubyBlbnRyeSBpbiB0aGUgdHJpZSBiZXR3ZWVuIHRoYXQgcHJlZml4IGFuZCB0aGUgc3RhcnQuIEFuIGV4YWN0IG1hdGNoIGFsc28KKyAgICAgKiAgICAgICAgc2F0aXNmaWVzIHRoaXMgYW5kIGlzIGluY2x1ZGVkLgorICAgICAqIDwvdWw+CisgICAgICogVGhpcyBiZWhhdmlvdXIgaXMgc2hhcmVkIHdpdGggdGhlIHJldmVyc2UgY291bnRlcnBhcnQge0BsaW5rIFJldmVyc2VWYWx1ZUl0ZXJhdG9yfS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVmFsdWVJdGVyYXRvcihSZWJ1ZmZlcmVyIHNvdXJjZSwgbG9uZyByb290LCBCeXRlQ29tcGFyYWJsZSBzdGFydCwgQnl0ZUNvbXBhcmFibGUgZW5kLCBib29sZWFuIGFkbWl0UHJlZml4KQorICAgIHsKKyAgICAgICAgc3VwZXIoc291cmNlLCByb290KTsKKyAgICAgICAgbGltaXQgPSBlbmQgIT0gbnVsbCA/IGVuZC5hc0NvbXBhcmFibGVCeXRlcyhCWVRFX0NPTVBBUkFCTEVfVkVSU0lPTikgOiBudWxsOworCisgICAgICAgIGlmIChzdGFydCAhPSBudWxsKQorICAgICAgICAgICAgaW5pdGlhbGl6ZVdpdGhMZWZ0Qm91bmQocm9vdCwgc3RhcnQuYXNDb21wYXJhYmxlQnl0ZXMoQllURV9DT01QQVJBQkxFX1ZFUlNJT04pLCBhZG1pdFByZWZpeCwgbGltaXQgIT0gbnVsbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGluaXRpYWxpemVOb0xlZnRCb3VuZChyb290LCBsaW1pdCAhPSBudWxsID8gbGltaXQubmV4dCgpIDogMjU2KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVdpdGhMZWZ0Qm91bmQobG9uZyByb290LCBCeXRlU291cmNlIHN0YXJ0U3RyZWFtLCBib29sZWFuIGFkbWl0UHJlZml4LCBib29sZWFuIGF0TGltaXQpCisgICAgeworICAgICAgICBJdGVyYXRpb25Qb3NpdGlvbiBwcmV2ID0gbnVsbDsKKyAgICAgICAgaW50IGNoaWxkSW5kZXg7CisgICAgICAgIGludCBsaW1pdEJ5dGU7CisgICAgICAgIGxvbmcgcGF5bG9hZGVkTm9kZSA9IC0xOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICAvLyBGb2xsb3cgc3RhcnQgcG9zaXRpb24gd2hpbGUgd2Ugc3RpbGwgaGF2ZSBhIHByZWZpeCwgc3RhY2tpbmcgcGF0aCBhbmQgc2F2aW5nIHByZWZpeGVzLgorICAgICAgICAgICAgZ28ocm9vdCk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcyA9IHN0YXJ0U3RyZWFtLm5leHQoKTsKKyAgICAgICAgICAgICAgICBjaGlsZEluZGV4ID0gc2VhcmNoKHMpOworCisgICAgICAgICAgICAgICAgLy8gRm9yIGEgc2VwYXJhdG9yIHRyaWUgdGhlIGxhdGVzdCBwYXlsb2FkIG1ldCBhbG9uZyB0aGUgcHJlZml4IGlzIGEgcG90ZW50aWFsIG1hdGNoIGZvciBzdGFydAorICAgICAgICAgICAgICAgIGlmIChhZG1pdFByZWZpeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEluZGV4ID09IDAgfHwgY2hpbGRJbmRleCA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBheWxvYWRGbGFncygpICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZGVkTm9kZSA9IHBvc2l0aW9uOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZGVkTm9kZSA9IC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbGltaXRCeXRlID0gMjU2OworICAgICAgICAgICAgICAgIGlmIChhdExpbWl0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGltaXRCeXRlID0gbGltaXQubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBpZiAocyA8IGxpbWl0Qnl0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0TGltaXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkSW5kZXggPCAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIHByZXYgPSBuZXcgSXRlcmF0aW9uUG9zaXRpb24ocG9zaXRpb24sIGNoaWxkSW5kZXgsIGxpbWl0Qnl0ZSwgcHJldik7CisgICAgICAgICAgICAgICAgZ28odHJhbnNpdGlvbihjaGlsZEluZGV4KSk7IC8vIGNoaWxkIGluZGV4IGlzIHBvc2l0aXZlLCB0cmFuc2l0aW9uIG11c3QgZXhpc3QKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2hpbGRJbmRleCA9IC0xIC0gY2hpbGRJbmRleCAtIDE7CisgICAgICAgICAgICBzdGFjayA9IG5ldyBJdGVyYXRpb25Qb3NpdGlvbihwb3NpdGlvbiwgY2hpbGRJbmRleCwgbGltaXRCeXRlLCBwcmV2KTsKKworICAgICAgICAgICAgLy8gQWR2YW5jaW5nIG5vdyBnaXZlcyB1cyBmaXJzdCBtYXRjaCBpZiB3ZSBkaWRuJ3QgZmluZCBvbmUgYWxyZWFkeS4KKyAgICAgICAgICAgIGlmIChwYXlsb2FkZWROb2RlICE9IC0xKQorICAgICAgICAgICAgICAgIG5leHQgPSBwYXlsb2FkZWROb2RlOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG5leHQgPSBhZHZhbmNlTm9kZSgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIHRocm93IHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZU5vTGVmdEJvdW5kKGxvbmcgcm9vdCwgaW50IGxpbWl0Qnl0ZSkKKyAgICB7CisgICAgICAgIHN0YWNrID0gbmV3IEl0ZXJhdGlvblBvc2l0aW9uKHJvb3QsIC0xLCBsaW1pdEJ5dGUsIG51bGwpOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBnbyhyb290KTsKKyAgICAgICAgICAgIGlmIChwYXlsb2FkRmxhZ3MoKSAhPSAwKQorICAgICAgICAgICAgICAgIG5leHQgPSByb290OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG5leHQgPSBhZHZhbmNlTm9kZSgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIHRocm93IHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgbmV4dCBub2RlIHdpdGggcGF5bG9hZCBjb250YWluZWQgaW4gdGhlIGl0ZXJhdGVkIHNwYW4uCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcgbmV4dFBheWxvYWRlZE5vZGUoKQorICAgIHsKKyAgICAgICAgbG9uZyB0b1JldHVybiA9IG5leHQ7CisgICAgICAgIGlmIChuZXh0ICE9IC0xKQorICAgICAgICAgICAgbmV4dCA9IGFkdmFuY2VOb2RlKCk7CisgICAgICAgIHJldHVybiB0b1JldHVybjsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgYWR2YW5jZU5vZGUoKQorICAgIHsKKyAgICAgICAgbG9uZyBjaGlsZDsKKyAgICAgICAgaW50IHRyYW5zaXRpb25CeXRlOworCisgICAgICAgIGdvKHN0YWNrLm5vZGUpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNoaWxkSW5kZXggPSBzdGFjay5jaGlsZEluZGV4ICsgMTsKKyAgICAgICAgICAgIHRyYW5zaXRpb25CeXRlID0gdHJhbnNpdGlvbkJ5dGUoY2hpbGRJbmRleCk7CisKKyAgICAgICAgICAgIGlmICh0cmFuc2l0aW9uQnl0ZSA+IHN0YWNrLmxpbWl0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGFzY2VuZAorICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2sucHJldjsKKyAgICAgICAgICAgICAgICBpZiAoc3RhY2sgPT0gbnVsbCkgICAgICAgIC8vIGV4aGF1c3RlZCB3aG9sZSB0cmllCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICBnbyhzdGFjay5ub2RlKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2hpbGQgPSB0cmFuc2l0aW9uKGNoaWxkSW5kZXgpOworCisgICAgICAgICAgICBpZiAoY2hpbGQgIT0gTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgY2hpbGQgPj0gMCA6IFN0cmluZy5mb3JtYXQoIkV4cGVjdGVkIHZhbHVlID49IDAgYnV0IGdvdCAlZCAtICVzIiwgY2hpbGQsIHRoaXMpOworCisgICAgICAgICAgICAgICAgLy8gZGVzY2VuZAorICAgICAgICAgICAgICAgIGdvKGNoaWxkKTsKKworICAgICAgICAgICAgICAgIGludCBsID0gMjU2OworICAgICAgICAgICAgICAgIGlmICh0cmFuc2l0aW9uQnl0ZSA9PSBzdGFjay5saW1pdCkKKyAgICAgICAgICAgICAgICAgICAgbCA9IGxpbWl0Lm5leHQoKTsKKworICAgICAgICAgICAgICAgIHN0YWNrLmNoaWxkSW5kZXggPSBjaGlsZEluZGV4OworICAgICAgICAgICAgICAgIHN0YWNrID0gbmV3IEl0ZXJhdGlvblBvc2l0aW9uKGNoaWxkLCAtMSwgbCwgc3RhY2spOworCisgICAgICAgICAgICAgICAgaWYgKHBheWxvYWRGbGFncygpICE9IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGFjay5jaGlsZEluZGV4ID0gY2hpbGRJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvV2Fsa2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9XYWxrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzcwY2VjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvV2Fsa2VyLmphdmEKQEAgLTAsMCArMSwzOTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzOworCitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5jb25jdXJyZW50Lk5vdFRocmVhZFNhZmU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlBhZ2VBd2FyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJlYnVmZmVyZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SZWJ1ZmZlcmVyLkJ1ZmZlckhvbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworCisvKioKKyAqIFRocmVhZC11bnNhZmUgdHJpZSB3YWxraW5nIGhlbHBlci4gVGhpcyBpcyBhbmFsb2dvdXMgdG8ge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmFuZG9tQWNjZXNzUmVhZGVyfSBmb3IKKyAqIHRyaWVzIC0tIHRha2VzIGFuIG9uLWRpc2sgdHJpZSBhY2Nlc3NpYmxlIHZpYSBhIHN1cHBsaWVkIFJlYnVmZmVyZXIgYW5kIGxldHMgdXNlciBzZWVrIHRvIG5vZGVzIGFuZCB3b3JrIHdpdGggdGhlbS4KKyAqIDxwPgorICogQXNzdW1lcyBkYXRhIHdhcyB3cml0dGVuIHVzaW5nIHBhZ2UtYXdhcmUgYnVpbGRlciBhbmQgdGh1cyBubyBub2RlIGNyb3NzZXMgYSBwYWdlIGFuZCB0aHVzIGEgYnVmZmVyIGJvdW5kYXJ5LgorICogPHA+CisgKiBTZWUge0Bjb2RlIG9yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9CdGlGb3JtYXQubWR9IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBtZWNoYW5pc21zIG9mIHdyaXRpbmcKKyAqIGFuZCByZWFkaW5nIGFuIG9uLWRpc2sgdHJpZS4KKyAqLworQE5vdFRocmVhZFNhZmUKK3B1YmxpYyBjbGFzcyBXYWxrZXI8Q09OQ1JFVEUgZXh0ZW5kcyBXYWxrZXI8Q09OQ1JFVEU+PiBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUKK3sKKyAgICAvKiogVmFsdWUgdXNlZCB0byBpbmRpY2F0ZSBhIGJyYW5jaCAoZS5nLiBsZXNzZXIvZ3JlYXRlckJyYW5jaCkgZG9lcyBub3QgZXhpc3QuICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgTk9ORSA9IFRyaWVOb2RlLk5PTkU7CisKKyAgICBwcml2YXRlIGZpbmFsIFJlYnVmZmVyZXIgc291cmNlOworICAgIHByb3RlY3RlZCBmaW5hbCBsb25nIHJvb3Q7CisKKyAgICAvLyBTdGF0ZSByZWxhdGluZyB0byBjdXJyZW50IG5vZGUuCisgICAgcHJpdmF0ZSBCdWZmZXJIb2xkZXIgYmg7ICAgIC8vIGZyb20gUmVidWZmZXJlcgorICAgIHByaXZhdGUgaW50IG9mZnNldDsgICAgICAgICAvLyBvZmZzZXQgb2YgY3VycmVudCBub2RlIHdpdGhpbiBidWYKKyAgICBwcm90ZWN0ZWQgVHJpZU5vZGUgbm9kZVR5cGU7ICAvLyB0eXBlIG9mIGN1cnJlbnQgbm9kZQorICAgIHByb3RlY3RlZCBCeXRlQnVmZmVyIGJ1ZjsgICAvLyBidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YQorICAgIHByb3RlY3RlZCBsb25nIHBvc2l0aW9uOyAgICAvLyBmaWxlIHBvc2l0aW9uIG9mIGN1cnJlbnQgbm9kZQorCisgICAgLy8gU3RhdGUgcmVsYXRpbmcgdG8gc2VhcmNoZXMuCisgICAgcHJvdGVjdGVkIGxvbmcgZ3JlYXRlckJyYW5jaDsKKyAgICBwcm90ZWN0ZWQgbG9uZyBsZXNzZXJCcmFuY2g7CisKKyAgICAvLyBWZXJzaW9uIG9mIHRoZSBieXRlIGNvbXBhcmFibGUgY29udmVyc2lvbiB0byB1c2UKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gQllURV9DT01QQVJBQkxFX1ZFUlNJT04gPSBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHdhbGtlci4gUmVidWZmZXJlciBtdXN0IGJlIGFsaWduZWQgYW5kIHdpdGggYSBidWZmZXIgc2l6ZSB0aGF0IGlzIGF0IGxlYXN0IDRrLgorICAgICAqLworICAgIHB1YmxpYyBXYWxrZXIoUmVidWZmZXJlciBzb3VyY2UsIGxvbmcgcm9vdCkKKyAgICB7CisgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOworICAgICAgICB0aGlzLnJvb3QgPSByb290OworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgYmggPSBzb3VyY2UucmVidWZmZXIocm9vdCk7CisgICAgICAgICAgICBidWYgPSBiaC5idWZmZXIoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJoICE9IG51bGwpIGJoLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHNvdXJjZS5jbG9zZVJlYWRlcigpOworICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgeworICAgICAgICBiaC5yZWxlYXNlKCk7CisgICAgICAgIHNvdXJjZS5jbG9zZVJlYWRlcigpOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGdvKGxvbmcgcG9zaXRpb24pCisgICAgeworICAgICAgICBsb25nIGN1ck9mZnNldCA9IHBvc2l0aW9uIC0gYmgub2Zmc2V0KCk7CisgICAgICAgIGlmIChjdXJPZmZzZXQgPCAwIHx8IGN1ck9mZnNldCA+PSBidWYubGltaXQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgYmgucmVsZWFzZSgpOworICAgICAgICAgICAgYmggPSBSZWJ1ZmZlcmVyLkVNUFRZOyAvLyBwcmV2ZW50cyBkb3VibGUgcmVsZWFzZSBpZiB0aGUgY2FsbCBiZWxvdyBmYWlscworICAgICAgICAgICAgYmggPSBzb3VyY2UucmVidWZmZXIocG9zaXRpb24pOworICAgICAgICAgICAgYnVmID0gYmguYnVmZmVyKCk7CisgICAgICAgICAgICBjdXJPZmZzZXQgPSBwb3NpdGlvbiAtIGJoLm9mZnNldCgpOworICAgICAgICAgICAgYXNzZXJ0IGN1ck9mZnNldCA+PSAwICYmIGN1ck9mZnNldCA8IGJ1Zi5saW1pdCgpIDogU3RyaW5nLmZvcm1hdCgiSW52YWxpZCBvZmZzZXQ6ICVkLCBidWY6ICVzLCBiaDogJXMiLCBjdXJPZmZzZXQsIGJ1ZiwgYmgpOworICAgICAgICB9CisgICAgICAgIHRoaXMub2Zmc2V0ID0gKGludCkgY3VyT2Zmc2V0OworICAgICAgICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgIG5vZGVUeXBlID0gVHJpZU5vZGUuYXQoYnVmLCAoaW50KSBjdXJPZmZzZXQpOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgcGF5bG9hZEZsYWdzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlVHlwZS5wYXlsb2FkRmxhZ3MoYnVmLCBvZmZzZXQpOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgcGF5bG9hZFBvc2l0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlVHlwZS5wYXlsb2FkUG9zaXRpb24oYnVmLCBvZmZzZXQpOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgc2VhcmNoKGludCB0cmFuc2l0aW9uQnl0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlVHlwZS5zZWFyY2goYnVmLCBvZmZzZXQsIHRyYW5zaXRpb25CeXRlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgbG9uZyB0cmFuc2l0aW9uKGludCBjaGlsZEluZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGVUeXBlLnRyYW5zaXRpb24oYnVmLCBvZmZzZXQsIHBvc2l0aW9uLCBjaGlsZEluZGV4KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgbG9uZyBsYXN0VHJhbnNpdGlvbigpCisgICAgeworICAgICAgICByZXR1cm4gbm9kZVR5cGUubGFzdFRyYW5zaXRpb24oYnVmLCBvZmZzZXQsIHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgbG9uZyBncmVhdGVyVHJhbnNpdGlvbihpbnQgc2VhcmNoSW5kZXgsIGxvbmcgZGVmYXVsdFZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGVUeXBlLmdyZWF0ZXJUcmFuc2l0aW9uKGJ1Ziwgb2Zmc2V0LCBwb3NpdGlvbiwgc2VhcmNoSW5kZXgsIGRlZmF1bHRWYWx1ZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIGxvbmcgbGVzc2VyVHJhbnNpdGlvbihpbnQgc2VhcmNoSW5kZXgsIGxvbmcgZGVmYXVsdFZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGVUeXBlLmxlc3NlclRyYW5zaXRpb24oYnVmLCBvZmZzZXQsIHBvc2l0aW9uLCBzZWFyY2hJbmRleCwgZGVmYXVsdFZhbHVlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IHRyYW5zaXRpb25CeXRlKGludCBjaGlsZEluZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGVUeXBlLnRyYW5zaXRpb25CeXRlKGJ1Ziwgb2Zmc2V0LCBjaGlsZEluZGV4KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IHRyYW5zaXRpb25SYW5nZSgpCisgICAgeworICAgICAgICByZXR1cm4gbm9kZVR5cGUudHJhbnNpdGlvblJhbmdlKGJ1Ziwgb2Zmc2V0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBoYXNDaGlsZHJlbigpCisgICAgeworICAgICAgICByZXR1cm4gdHJhbnNpdGlvblJhbmdlKCkgPiAwOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGdvTWF4KGxvbmcgcG9zKQorICAgIHsKKyAgICAgICAgZ28ocG9zKTsKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgbGFzdENoaWxkID0gbGFzdFRyYW5zaXRpb24oKTsKKyAgICAgICAgICAgIGlmIChsYXN0Q2hpbGQgPT0gTk9ORSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBnbyhsYXN0Q2hpbGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZ29NaW4obG9uZyBwb3MpCisgICAgeworICAgICAgICBnbyhwb3MpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHBheWxvYWRCaXRzID0gcGF5bG9hZEZsYWdzKCk7CisgICAgICAgICAgICBpZiAocGF5bG9hZEJpdHMgPiAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgbG9uZyBmaXJzdENoaWxkID0gdHJhbnNpdGlvbigwKTsKKyAgICAgICAgICAgIGlmIChmaXJzdENoaWxkID09IE5PTkUpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgZ28oZmlyc3RDaGlsZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIEV4dHJhY3RvcjxSRVNVTFQsIFZBTFVFPgorICAgIHsKKyAgICAgICAgUkVTVUxUIGV4dHJhY3QoVkFMVUUgd2Fsa2VyLCBpbnQgcGF5bG9hZFBvc2l0aW9uLCBpbnQgcGF5bG9hZEZsYWdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb2xsb3dzIHRoZSBnaXZlbiBrZXkgd2hpbGUgdGhlcmUgYXJlIHRyYW5zaXRpb25zIGluIHRoZSB0cmllIGZvciBpdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IHVubWF0Y2hlZCBieXRlIG9mIHRoZSBrZXksIG1heSBiZSB7QGxpbmsgQnl0ZVNvdXJjZSNFTkRfT0ZfU1RSRUFNfQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZm9sbG93KEJ5dGVDb21wYXJhYmxlIGtleSkKKyAgICB7CisgICAgICAgIEJ5dGVTb3VyY2Ugc3RyZWFtID0ga2V5LmFzQ29tcGFyYWJsZUJ5dGVzKEJZVEVfQ09NUEFSQUJMRV9WRVJTSU9OKTsKKyAgICAgICAgZ28ocm9vdCk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYiA9IHN0cmVhbS5uZXh0KCk7CisgICAgICAgICAgICBpbnQgY2hpbGRJbmRleCA9IHNlYXJjaChiKTsKKworICAgICAgICAgICAgaWYgKGNoaWxkSW5kZXggPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBiOworCisgICAgICAgICAgICBnbyh0cmFuc2l0aW9uKGNoaWxkSW5kZXgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZvbGxvd3MgdGhlIHRyaWUgZm9yIGEgZ2l2ZW4ga2V5LCByZW1lbWJlcmluZyB0aGUgY2xvc2VzdCBncmVhdGVyIGJyYW5jaC4KKyAgICAgKiBPbiByZXR1cm4gdGhlIHdhbGtlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBsb25nZXN0IHByZWZpeCB0aGF0IG1hdGNoZXMgdGhlIGlucHV0ICh3aXRoIG9yIHdpdGhvdXQgcGF5bG9hZCksIGFuZAorICAgICAqIG1pbihncmVhdGVyQnJhbmNoKSBpcyB0aGUgaW1tZWRpYXRlIGdyZWF0ZXIgbmVpZ2hib3VyLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZmlyc3QgdW5tYXRjaGVkIGJ5dGUgb2YgdGhlIGtleSwgbWF5IGJlIHtAbGluayBCeXRlU291cmNlI0VORF9PRl9TVFJFQU19CisgICAgICovCisgICAgcHVibGljIGludCBmb2xsb3dXaXRoR3JlYXRlcihCeXRlQ29tcGFyYWJsZSBrZXkpCisgICAgeworICAgICAgICBncmVhdGVyQnJhbmNoID0gTk9ORTsKKworICAgICAgICBCeXRlU291cmNlIHN0cmVhbSA9IGtleS5hc0NvbXBhcmFibGVCeXRlcyhCWVRFX0NPTVBBUkFCTEVfVkVSU0lPTik7CisgICAgICAgIGdvKHJvb3QpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGIgPSBzdHJlYW0ubmV4dCgpOworICAgICAgICAgICAgaW50IHNlYXJjaEluZGV4ID0gc2VhcmNoKGIpOworCisgICAgICAgICAgICBncmVhdGVyQnJhbmNoID0gZ3JlYXRlclRyYW5zaXRpb24oc2VhcmNoSW5kZXgsIGdyZWF0ZXJCcmFuY2gpOworICAgICAgICAgICAgaWYgKHNlYXJjaEluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYjsKKworICAgICAgICAgICAgZ28odHJhbnNpdGlvbihzZWFyY2hJbmRleCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9sbG93cyB0aGUgdHJpZSBmb3IgYSBnaXZlbiBrZXksIHJlbWVtYmVyaW5nIHRoZSBjbG9zZXN0IGxlc3NlciBicmFuY2guCisgICAgICogT24gcmV0dXJuIHRoZSB3YWxrZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgbG9uZ2VzdCBwcmVmaXggdGhhdCBtYXRjaGVzIHRoZSBpbnB1dCAod2l0aCBvciB3aXRob3V0IHBheWxvYWQpLCBhbmQKKyAgICAgKiBtYXgobGVzc2VyQnJhbmNoKSBpcyB0aGUgaW1tZWRpYXRlIGxlc3NlciBuZWlnaGJvdXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCB1bm1hdGNoZWQgYnl0ZSBvZiB0aGUga2V5LCBtYXkgYmUge0BsaW5rIEJ5dGVTb3VyY2UjRU5EX09GX1NUUkVBTX0KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGZvbGxvd1dpdGhMZXNzZXIoQnl0ZUNvbXBhcmFibGUga2V5KQorICAgIHsKKyAgICAgICAgbGVzc2VyQnJhbmNoID0gTk9ORTsKKworICAgICAgICBCeXRlU291cmNlIHN0cmVhbSA9IGtleS5hc0NvbXBhcmFibGVCeXRlcyhCWVRFX0NPTVBBUkFCTEVfVkVSU0lPTik7CisgICAgICAgIGdvKHJvb3QpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGIgPSBzdHJlYW0ubmV4dCgpOworICAgICAgICAgICAgaW50IHNlYXJjaEluZGV4ID0gc2VhcmNoKGIpOworCisgICAgICAgICAgICBsZXNzZXJCcmFuY2ggPSBsZXNzZXJUcmFuc2l0aW9uKHNlYXJjaEluZGV4LCBsZXNzZXJCcmFuY2gpOworCisgICAgICAgICAgICBpZiAoc2VhcmNoSW5kZXggPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBiOworCisgICAgICAgICAgICBnbyh0cmFuc2l0aW9uKHNlYXJjaEluZGV4KSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRha2VzIGEgcHJlZml4IG9mIHRoZSBnaXZlbiBrZXkuIFRoZSBwcmVmaXggaXMgaW4gdGhlIHNlbnNlIG9mIGEgc2VwYXJhdG9yIGtleSBtYXRjaCwgaS5lLiBpdCBpcyBvbmx5CisgICAgICogdW5kZXJzdG9vZCBhcyB2YWxpZCBpZiB0aGVyZSBhcmUgbm8gZ3JlYXRlciBlbnRyaWVzIGluIHRoZSB0cmllIChlLmcuIGRhdGEgYXQgJ2EnIGlzIGlnbm9yZWQgaWYgJ2FiJyBvciAnYWJiYScKKyAgICAgKiBpcyBpbiB0aGUgdHJpZSB3aGVuIGxvb2tpbmcgZm9yICdhYmMnIG9yICdhYycsIGJ1dCBhY2NlcHRlZCB3aGVuIGxvb2tpbmcgZm9yICdhYScpLgorICAgICAqIEluIG9yZGVyIHRvIG5vdCBoYXZlIHRvIGdvIGJhY2sgdG8gZGF0YSB0aGF0IG1heSBoYXZlIGV4aXRlZCBjYWNoZSwgcGF5bG9hZHMgYXJlIGV4dHJhY3RlZCB3aGVuIHRoZSBub2RlIGlzCisgICAgICogdmlzaXRlZCAoaW5zdGVhZCBvZiBzYXZpbmcgdGhlIG5vZGUncyBwb3NpdGlvbiksIHdoaWNoIHJlcXVpcmVzIGFuIGV4dHJhY3RvciB0byBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyA8UkVTVUxUPiBSRVNVTFQgcHJlZml4KEJ5dGVDb21wYXJhYmxlIGtleSwgRXh0cmFjdG9yPFJFU1VMVCwgQ09OQ1JFVEU+IGV4dHJhY3RvcikKKyAgICB7CisgICAgICAgIFJFU1VMVCBwYXlsb2FkID0gbnVsbDsKKworICAgICAgICBCeXRlU291cmNlIHN0cmVhbSA9IGtleS5hc0NvbXBhcmFibGVCeXRlcyhCWVRFX0NPTVBBUkFCTEVfVkVSU0lPTik7CisgICAgICAgIGdvKHJvb3QpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGIgPSBzdHJlYW0ubmV4dCgpOworICAgICAgICAgICAgaW50IGNoaWxkSW5kZXggPSBzZWFyY2goYik7CisKKyAgICAgICAgICAgIGlmIChjaGlsZEluZGV4ID4gMCkKKyAgICAgICAgICAgICAgICBwYXlsb2FkID0gbnVsbDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcGF5bG9hZEJpdHMgPSBwYXlsb2FkRmxhZ3MoKTsKKyAgICAgICAgICAgICAgICBpZiAocGF5bG9hZEJpdHMgPiAwKQorICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gZXh0cmFjdG9yLmV4dHJhY3QoKENPTkNSRVRFKSB0aGlzLCBwYXlsb2FkUG9zaXRpb24oKSwgcGF5bG9hZEJpdHMpOworICAgICAgICAgICAgICAgIGlmIChjaGlsZEluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdvKHRyYW5zaXRpb24oY2hpbGRJbmRleCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9sbG93cyB0aGUgdHJpZSBmb3IgYSBnaXZlbiBrZXksIHRha2luZyBhIHByZWZpeCAoaW4gdGhlIHNlbnNlIGFib3ZlKSBhbmQgc2VhcmNoaW5nIGZvciBuZWlnaGJvcmluZyB2YWx1ZXMuCisgICAgICogT24gcmV0dXJuIG1pbihncmVhdGVyQnJhbmNoKSBhbmQgbWF4KGxlc3NlckJyYW5jaCkgYXJlIHRoZSBpbW1lZGlhdGUgbm9uLXByZWZpeCBuZWlnaGJvdXJzIGZvciB0aGUgc291Z2h0IHZhbHVlLgorICAgICAqIDxwPgorICAgICAqIE5vdGU6IGluIGEgc2VwYXJhdG9yIHRyaWUgdGhlIGNsb3Nlc3Qgc21hbGxlciBuZWlnaGJvdXIgY2FuIGJlIGFub3RoZXIgcHJlZml4IG9mIHRoZSBnaXZlbiBrZXkuIFRoaXMgbWV0aG9kCisgICAgICogZG9lcyBub3QgdGFrZSB0aGF0IGludG8gYWNjb3VudC4gRS5nLiBpZiB0cmllIGNvbnRhaW5zICJhYmJhIiwgImFzIiBhbmQgImFzayIsIGxvb2tpbmcgZm9yICJhc2tpbmciIHdpbGwgZmluZAorICAgICAqICJhc2siIGFzIHRoZSBtYXRjaCwgYnV0IG1heChsZXNzZXJCcmFuY2gpIHdpbGwgcG9pbnQgdG8gImFiYmEiIGluc3RlYWQgb2YgdGhlIGNvcnJlY3QgImFzIi4gVGhpcyBwcm9ibGVtIGNhbgorICAgICAqIG9ubHkgb2NjdXIgaWYgdGhlcmUgaXMgYSB2YWxpZCBwcmVmaXggbWF0Y2guCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIDxSRVNVTFQ+IFJFU1VMVCBwcmVmaXhBbmROZWlnaGJvdXJzKEJ5dGVDb21wYXJhYmxlIGtleSwgRXh0cmFjdG9yPFJFU1VMVCwgQ09OQ1JFVEU+IGV4dHJhY3RvcikKKyAgICB7CisgICAgICAgIFJFU1VMVCBwYXlsb2FkID0gbnVsbDsKKyAgICAgICAgZ3JlYXRlckJyYW5jaCA9IE5PTkU7CisgICAgICAgIGxlc3NlckJyYW5jaCA9IE5PTkU7CisKKyAgICAgICAgQnl0ZVNvdXJjZSBzdHJlYW0gPSBrZXkuYXNDb21wYXJhYmxlQnl0ZXMoQllURV9DT01QQVJBQkxFX1ZFUlNJT04pOworICAgICAgICBnbyhyb290KTsKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBiID0gc3RyZWFtLm5leHQoKTsKKyAgICAgICAgICAgIGludCBzZWFyY2hJbmRleCA9IHNlYXJjaChiKTsKKworICAgICAgICAgICAgZ3JlYXRlckJyYW5jaCA9IGdyZWF0ZXJUcmFuc2l0aW9uKHNlYXJjaEluZGV4LCBncmVhdGVyQnJhbmNoKTsKKworICAgICAgICAgICAgaWYgKHNlYXJjaEluZGV4ID09IC0xIHx8IHNlYXJjaEluZGV4ID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHBheWxvYWRCaXRzID0gcGF5bG9hZEZsYWdzKCk7CisgICAgICAgICAgICAgICAgaWYgKHBheWxvYWRCaXRzID4gMCkKKyAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IGV4dHJhY3Rvci5leHRyYWN0KChDT05DUkVURSkgdGhpcywgcGF5bG9hZFBvc2l0aW9uKCksIHBheWxvYWRCaXRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXNzZXJCcmFuY2ggPSBsZXNzZXJUcmFuc2l0aW9uKHNlYXJjaEluZGV4LCBsZXNzZXJCcmFuY2gpOworICAgICAgICAgICAgICAgIHBheWxvYWQgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2VhcmNoSW5kZXggPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkOworCisgICAgICAgICAgICBnbyh0cmFuc2l0aW9uKHNlYXJjaEluZGV4KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUbyBiZSB1c2VkIG9ubHkgaW4gYW5hbHlzaXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBub2RlVHlwZU9yZGluYWwoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGVUeXBlLm9yZGluYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVG8gYmUgdXNlZCBvbmx5IGluIGFuYWx5c2lzLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgbm9kZVNpemUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBheWxvYWRQb3NpdGlvbigpIC0gb2Zmc2V0OworICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgUGF5bG9hZFRvU3RyaW5nCisgICAgeworICAgICAgICBTdHJpbmcgcGF5bG9hZEFzU3RyaW5nKEJ5dGVCdWZmZXIgYnVmLCBpbnQgcGF5bG9hZFBvcywgaW50IHBheWxvYWRGbGFncyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcFRyaWUoUHJpbnRTdHJlYW0gb3V0LCBQYXlsb2FkVG9TdHJpbmcgcGF5bG9hZFJlYWRlcikKKyAgICB7CisgICAgICAgIG91dC5wcmludCgiUk9PVCIpOworICAgICAgICBkdW1wVHJpZShvdXQsIHBheWxvYWRSZWFkZXIsIHJvb3QsICIiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZHVtcFRyaWUoUHJpbnRTdHJlYW0gb3V0LCBQYXlsb2FkVG9TdHJpbmcgcGF5bG9hZFJlYWRlciwgbG9uZyBub2RlLCBTdHJpbmcgaW5kZW50KQorICAgIHsKKyAgICAgICAgZ28obm9kZSk7CisgICAgICAgIGludCBiaXRzID0gcGF5bG9hZEZsYWdzKCk7CisgICAgICAgIG91dC5mb3JtYXQoIiAlc0AleCAlcyVuIiwgbm9kZVR5cGUudG9TdHJpbmcoKSwgbm9kZSwgYml0cyA9PSAwID8gIiIgOiBwYXlsb2FkUmVhZGVyLnBheWxvYWRBc1N0cmluZyhidWYsIHBheWxvYWRQb3NpdGlvbigpLCBiaXRzKSk7CisgICAgICAgIGludCByYW5nZSA9IHRyYW5zaXRpb25SYW5nZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJhbmdlOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgY2hpbGQgPSB0cmFuc2l0aW9uKGkpOworICAgICAgICAgICAgaWYgKGNoaWxkID09IE5PTkUpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBvdXQuZm9ybWF0KCIlcyUwMnggJXM+IiwgaW5kZW50LCB0cmFuc2l0aW9uQnl0ZShpKSwgUGFnZUF3YXJlLnBhZ2VTdGFydChwb3NpdGlvbikgPT0gUGFnZUF3YXJlLnBhZ2VTdGFydChjaGlsZCkgPyAiLS0iIDogIj09Iik7CisgICAgICAgICAgICBkdW1wVHJpZShvdXQsIHBheWxvYWRSZWFkZXIsIGNoaWxkLCBpbmRlbnQgKyAiICAiKTsKKyAgICAgICAgICAgIGdvKG5vZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiW1RyaWUgV2Fsa2VyIC0gTm9kZVR5cGU6ICVzLCBzb3VyY2U6ICVzLCBidWZmZXI6ICVzLCBidWZmZXIgZmlsZSBvZmZzZXQ6ICVkLCBOb2RlIGJ1ZmZlciBvZmZzZXQ6ICVkLCBOb2RlIGZpbGUgcG9zaXRpb246ICVkXSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVUeXBlLCBzb3VyY2UsIGJ1ZiwgYmgub2Zmc2V0KCksIG9mZnNldCwgcG9zaXRpb24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvQnVmZmVyZWREYXRhT3V0cHV0U3RyZWFtUGx1cy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9CdWZmZXJlZERhdGFPdXRwdXRTdHJlYW1QbHVzLmphdmEKaW5kZXggNGU5YmJiNS4uYTcxMmJhNiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9CdWZmZXJlZERhdGFPdXRwdXRTdHJlYW1QbHVzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9CdWZmZXJlZERhdGFPdXRwdXRTdHJlYW1QbHVzLmphdmEKQEAgLTI2LDkgKzI2LDEwIEBACiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOwogCiBpbXBvcnQgbmV0Lm5pY291bGFqLmNvbXBpbGVjb21tYW5kLmFubm90YXRpb25zLkRvbnRJbmxpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GYXN0Qnl0ZU9wZXJhdGlvbnM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5OSU9fREFUQV9PVVRQVVRfU1RSRUFNX1BMVVNfQlVGRkVSX1NJWkU7CisKIC8qKgogICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIERhdGFPdXRwdXRTdHJlYW1QbHVzIGludGVyZmFjZSB1c2luZyBhIEJ5dGVCdWZmZXIgdG8gc3RhZ2Ugd3JpdGVzCiAgKiBiZWZvcmUgZmx1c2hpbmcgdGhlbSB0byBhbiB1bmRlcmx5aW5nIGNoYW5uZWwuCkBAIC0zNyw3ICszOCw3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBCdWZmZXJlZERhdGFPdXRwdXRTdHJlYW1QbHVzIGV4dGVuZHMgRGF0YU91dHB1dFN0cmVhbVBsdXMKIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IEludGVnZXIuZ2V0SW50ZWdlcihDb25maWcuUFJPUEVSVFlfUFJFRklYICsgIm5pb19kYXRhX291dHB1dF9zdHJlYW1fcGx1c19idWZmZXJfc2l6ZSIsIDEwMjQgKiAzMik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSBOSU9fREFUQV9PVVRQVVRfU1RSRUFNX1BMVVNfQlVGRkVSX1NJWkUuZ2V0SW50KCk7CiAKICAgICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciBidWZmZXI7CiAKQEAgLTY2LDYgKzY3LDE2IEBACiAgICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwogICAgIH0KIAorICAgIHByb3RlY3RlZCBCdWZmZXJlZERhdGFPdXRwdXRTdHJlYW1QbHVzKGludCBzaXplKQorICAgIHsKKyAgICAgICAgdGhpcy5idWZmZXIgPSBhbGxvY2F0ZShzaXplKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciBhbGxvY2F0ZShpbnQgc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyLmFsbG9jYXRlKHNpemUpOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CkBAIC03NSw2ICs4Niw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKKyAgICAgICAgYXNzZXJ0IGJ1ZmZlciAhPSBudWxsIDogIkF0dGVtcHQgdG8gdXNlIGEgY2xvc2VkIGRhdGEgb3V0cHV0IjsKICAgICAgICAgaWYgKGIgPT0gbnVsbCkKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwogCkBAIC0xMTEsNiArMTIzLDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShCeXRlQnVmZmVyIHNyYykgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgeworICAgICAgICBhc3NlcnQgYnVmZmVyICE9IG51bGwgOiAiQXR0ZW1wdCB0byB1c2UgYSBjbG9zZWQgZGF0YSBvdXRwdXQiOwogICAgICAgICBpbnQgc3JjUG9zID0gc3JjLnBvc2l0aW9uKCk7CiAgICAgICAgIGludCBzcmNDb3VudDsKICAgICAgICAgaW50IHRyZ0F2YWlsYWJsZTsKQEAgLTEyOCw2ICsxNDEsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CisgICAgICAgIGFzc2VydCBidWZmZXIgIT0gbnVsbCA6ICJBdHRlbXB0IHRvIHVzZSBhIGNsb3NlZCBkYXRhIG91dHB1dCI7CiAgICAgICAgIGlmICghYnVmZmVyLmhhc1JlbWFpbmluZygpKQogICAgICAgICAgICAgZG9GbHVzaCgxKTsKICAgICAgICAgYnVmZmVyLnB1dCgoYnl0ZSkgKGIgJiAweEZGKSk7CkBAIC0xMzYsNiArMTUwLDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZUJvb2xlYW4oYm9vbGVhbiB2KSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CisgICAgICAgIGFzc2VydCBidWZmZXIgIT0gbnVsbCA6ICJBdHRlbXB0IHRvIHVzZSBhIGNsb3NlZCBkYXRhIG91dHB1dCI7CiAgICAgICAgIGlmICghYnVmZmVyLmhhc1JlbWFpbmluZygpKQogICAgICAgICAgICAgZG9GbHVzaCgxKTsKICAgICAgICAgYnVmZmVyLnB1dCh2ID8gKGJ5dGUpMSA6IChieXRlKTApOwpAQCAtMTQ4LDExICsxNjMsMTIgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGVzKGxvbmcgcmVnaXN0ZXIsIGludCBieXRlcykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgcHVibGljIHZvaWQgd3JpdGVNb3N0U2lnbmlmaWNhbnRCeXRlcyhsb25nIHJlZ2lzdGVyLCBpbnQgYnl0ZXMpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKKyAgICAgICAgYXNzZXJ0IGJ1ZmZlciAhPSBudWxsIDogIkF0dGVtcHQgdG8gdXNlIGEgY2xvc2VkIGRhdGEgb3V0cHV0IjsKICAgICAgICAgaWYgKGJ1ZmZlci5yZW1haW5pbmcoKSA8IExvbmcuQllURVMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyLndyaXRlQnl0ZXMocmVnaXN0ZXIsIGJ5dGVzKTsKKyAgICAgICAgICAgIHN1cGVyLndyaXRlTW9zdFNpZ25pZmljYW50Qnl0ZXMocmVnaXN0ZXIsIGJ5dGVzKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKQEAgLTE3MSw2ICsxODcsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlQ2hhcihpbnQgdikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgeworICAgICAgICBhc3NlcnQgYnVmZmVyICE9IG51bGwgOiAiQXR0ZW1wdCB0byB1c2UgYSBjbG9zZWQgZGF0YSBvdXRwdXQiOwogICAgICAgICBpZiAoYnVmZmVyLnJlbWFpbmluZygpIDwgMikKICAgICAgICAgICAgIHdyaXRlU2xvdyh2LCAyKTsKICAgICAgICAgZWxzZQpAQCAtMTgwLDYgKzE5Nyw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGVJbnQoaW50IHYpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKKyAgICAgICAgYXNzZXJ0IGJ1ZmZlciAhPSBudWxsIDogIkF0dGVtcHQgdG8gdXNlIGEgY2xvc2VkIGRhdGEgb3V0cHV0IjsKICAgICAgICAgaWYgKGJ1ZmZlci5yZW1haW5pbmcoKSA8IDQpCiAgICAgICAgICAgICB3cml0ZVNsb3codiwgNCk7CiAgICAgICAgIGVsc2UKQEAgLTE4OSw2ICsyMDcsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlTG9uZyhsb25nIHYpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKKyAgICAgICAgYXNzZXJ0IGJ1ZmZlciAhPSBudWxsIDogIkF0dGVtcHQgdG8gdXNlIGEgY2xvc2VkIGRhdGEgb3V0cHV0IjsKICAgICAgICAgaWYgKGJ1ZmZlci5yZW1haW5pbmcoKSA8IDgpCiAgICAgICAgICAgICB3cml0ZVNsb3codiwgOCk7CiAgICAgICAgIGVsc2UKQEAgLTIxMCw2ICsyMjksNyBAQAogICAgIEBEb250SW5saW5lCiAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlU2xvdyhsb25nIGJ5dGVzLCBpbnQgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKKyAgICAgICAgYXNzZXJ0IGJ1ZmZlciAhPSBudWxsIDogIkF0dGVtcHQgdG8gdXNlIGEgY2xvc2VkIGRhdGEgb3V0cHV0IjsKICAgICAgICAgaW50IG9yaWdDb3VudCA9IGNvdW50OwogICAgICAgICBpZiAoQnl0ZU9yZGVyLkJJR19FTkRJQU4gPT0gYnVmZmVyLm9yZGVyKCkpCiAgICAgICAgICAgICB3aGlsZSAoY291bnQgPiAwKSB3cml0ZUJ5dGUoKGludCkgKGJ5dGVzID4+PiAoOCAqIC0tY291bnQpKSk7CkBAIC0yMzQsNiArMjU0LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZVVURihTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgeworICAgICAgICBhc3NlcnQgYnVmZmVyICE9IG51bGwgOiAiQXR0ZW1wdCB0byB1c2UgYSBjbG9zZWQgZGF0YSBvdXRwdXQiOwogICAgICAgICBVbmJ1ZmZlcmVkRGF0YU91dHB1dFN0cmVhbVBsdXMud3JpdGVVVEYocywgdGhpcyk7CiAgICAgfQogCkBAIC0yNDMsNiArMjY0LDcgQEAKICAgICBARG9udElubGluZQogICAgIHByb3RlY3RlZCB2b2lkIGRvRmx1c2goaW50IGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CisgICAgICAgIGFzc2VydCBidWZmZXIgIT0gbnVsbCA6ICJBdHRlbXB0IHRvIHVzZSBhIGNsb3NlZCBkYXRhIG91dHB1dCI7CiAgICAgICAgIGJ1ZmZlci5mbGlwKCk7CiAKICAgICAgICAgd2hpbGUgKGJ1ZmZlci5oYXNSZW1haW5pbmcoKSkKQEAgLTI3MSw3ICsyOTMsOCBAQAogCiAgICAgcHVibGljIEJ1ZmZlcmVkRGF0YU91dHB1dFN0cmVhbVBsdXMgb3JkZXIoQnl0ZU9yZGVyIG9yZGVyKQogICAgIHsKKyAgICAgICAgYXNzZXJ0IGJ1ZmZlciAhPSBudWxsIDogIkF0dGVtcHQgdG8gdXNlIGEgY2xvc2VkIGRhdGEgb3V0cHV0IjsKICAgICAgICAgdGhpcy5idWZmZXIub3JkZXIob3JkZXIpOwogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9DaGFubmVsUHJveHkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvQ2hhbm5lbFByb3h5LmphdmEKaW5kZXggNzE3ZGVmNy4uODE2NjViZSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9DaGFubmVsUHJveHkuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0NoYW5uZWxQcm94eS5qYXZhCkBAIC00MCw2ICs0MCw3IEBACiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBDaGFubmVsUHJveHkgZXh0ZW5kcyBTaGFyZWRDbG9zZWFibGVJbXBsCiB7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIGZpbGU7CiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmlsZVBhdGg7CiAgICAgcHJpdmF0ZSBmaW5hbCBGaWxlQ2hhbm5lbCBjaGFubmVsOwogCkBAIC02MiwxNCArNjMsMTUgQEAKIAogICAgIHB1YmxpYyBDaGFubmVsUHJveHkoRmlsZSBmaWxlKQogICAgIHsKLSAgICAgICAgdGhpcyhmaWxlLnBhdGgoKSwgb3BlbkNoYW5uZWwoZmlsZSkpOworICAgICAgICB0aGlzKGZpbGUsIG9wZW5DaGFubmVsKGZpbGUpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgQ2hhbm5lbFByb3h5KFN0cmluZyBmaWxlUGF0aCwgRmlsZUNoYW5uZWwgY2hhbm5lbCkKKyAgICBwdWJsaWMgQ2hhbm5lbFByb3h5KEZpbGUgZmlsZSwgRmlsZUNoYW5uZWwgY2hhbm5lbCkKICAgICB7Ci0gICAgICAgIHN1cGVyKG5ldyBDbGVhbnVwKGZpbGVQYXRoLCBjaGFubmVsKSk7CisgICAgICAgIHN1cGVyKG5ldyBDbGVhbnVwKGZpbGUucGF0aCgpLCBjaGFubmVsKSk7CiAKLSAgICAgICAgdGhpcy5maWxlUGF0aCA9IGZpbGVQYXRoOworICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgICAgICB0aGlzLmZpbGVQYXRoID0gZmlsZS5wYXRoKCk7CiAgICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7CiAgICAgfQogCkBAIC03Nyw2ICs3OSw3IEBACiAgICAgewogICAgICAgICBzdXBlcihjb3B5KTsKIAorICAgICAgICB0aGlzLmZpbGUgPSBjb3B5LmZpbGU7CiAgICAgICAgIHRoaXMuZmlsZVBhdGggPSBjb3B5LmZpbGVQYXRoOwogICAgICAgICB0aGlzLmNoYW5uZWwgPSBjb3B5LmNoYW5uZWw7CiAgICAgfQpAQCAtMTMwLDYgKzEzMywxMSBAQAogICAgICAgICByZXR1cm4gZmlsZVBhdGg7CiAgICAgfQogCisgICAgcHVibGljIEZpbGUgZmlsZSgpCisgICAgeworICAgICAgICByZXR1cm4gZmlsZTsKKyAgICB9CisKICAgICBwdWJsaWMgaW50IHJlYWQoQnl0ZUJ1ZmZlciBidWZmZXIsIGxvbmcgcG9zaXRpb24pCiAgICAgewogICAgICAgICB0cnkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRGF0YUlucHV0UGx1cy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9EYXRhSW5wdXRQbHVzLmphdmEKaW5kZXggYmRhODQ2MS4uZDExN2M3ZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9EYXRhSW5wdXRQbHVzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9EYXRhSW5wdXRQbHVzLmphdmEKQEAgLTE3LDEwICsxNywxNCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWw7CiAKLWltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXQ7CitpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2hhcmVkOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnZpbnQuVkludENvZGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy52aW50LlZJbnRDb2RpbmcuVkludE91dE9mUmFuZ2VFeGNlcHRpb247CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2hhcmVkLlNjb3BlLlNJTVVMQVRJT047CiAKQEAgLTMwLDEyICszNCwzMSBAQAogQFNoYXJlZChzY29wZSA9IFNJTVVMQVRJT04pCiBwdWJsaWMgaW50ZXJmYWNlIERhdGFJbnB1dFBsdXMgZXh0ZW5kcyBEYXRhSW5wdXQKIHsKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgNjQtYml0IGludGVnZXIgYmFjay4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGFzc3VtZXMgaXQgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiB1c2luZworICAgICAqIHtAbGluayBEYXRhT3V0cHV0UGx1cyN3cml0ZVZJbnQobG9uZyl9IG9yIHNpbWlsYXIgdGhhdCB6aWd6YWcgZW5jb2RlcyB0aGUgdmludC4KKyAgICAgKi8KICAgICBkZWZhdWx0IGxvbmcgcmVhZFZJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIHJldHVybiBWSW50Q29kaW5nLnJlYWRWSW50KHRoaXMpOwogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJlYWQgdXAgdG8gYSAzMi1iaXQgaW50ZWdlciBiYWNrLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgYXNzdW1lcyB0aGUgaW50ZWdlciB3YXMgb3JpZ2luYWxseSB3cml0dGVuIHVzaW5nCisgICAgICoge0BsaW5rIERhdGFPdXRwdXRQbHVzI3dyaXRlVkludDMyKGludCl9IG9yIHNpbWlsYXIgdGhhdCB6aWd6YWcgZW5jb2RlcyB0aGUgdmludC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVkludE91dE9mUmFuZ2VFeGNlcHRpb24gSWYgdGhlIHZpbnQgZG9lc24ndCBmaXQgaW50byBhIDMyLWJpdCBpbnRlZ2VyCisgICAgICovCisgICAgZGVmYXVsdCBpbnQgcmVhZFZJbnQzMigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIFZJbnRDb2RpbmcucmVhZFZJbnQzMih0aGlzKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBUaGluayBoYXJkIGJlZm9yZSBvcHRpbmcgZm9yIGFuIHVuc2lnbmVkIGVuY29kaW5nLiBJcyB0aGlzIGdvaW5nIHRvIGJpdGUgc29tZW9uZSBiZWNhdXNlIHNvbWUgZGF5CiAgICAgICogdGhleSBtaWdodCBuZWVkIHRvIHBhc3MgaW4gYSBzZW50aW5lbCB2YWx1ZSB1c2luZyBuZWdhdGl2ZSBudW1iZXJzPyBJcyB0aGUgcmlzayB3b3J0aCBpdAogICAgICAqIHRvIHNhdmUgYSBmZXcgYnl0ZXM/CkBAIC00OCw2ICs3MSwxOSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJlYWQgdXAgdG8gYSAzMi1iaXQgaW50ZWdlciBiYWNrLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgYXNzdW1lcyB0aGUgb3JpZ2luYWwgaW50ZWdlciB3YXMgd3JpdHRlbiB1c2luZyB7QGxpbmsgRGF0YU91dHB1dFBsdXMjd3JpdGVVbnNpZ25lZFZJbnQzMihpbnQpfQorICAgICAqIG9yIHNpbWlsYXIgdGhhdCBkb2Vzbid0IHppZ3phZyBlbmNvZGVzIHRoZSB2aW50LgorICAgICAqCisgICAgICogQHRocm93cyBWSW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiBJZiB0aGUgdmludCBkb2Vzbid0IGZpdCBpbnRvIGEgMzItYml0IGludGVnZXIKKyAgICAgKi8KKyAgICBkZWZhdWx0IGludCByZWFkVW5zaWduZWRWSW50MzIoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBWSW50Q29kaW5nLnJlYWRVbnNpZ25lZFZJbnQzMih0aGlzKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBBbHdheXMgc2tpcHMgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgYnl0ZXMsIHVubGVzcyBFT0YgaXMgcmVhY2hlZAogICAgICAqCiAgICAgICogQHBhcmFtIG4gbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAKQEAgLTY0LDE0ICsxMDAsOCBAQAogCiAgICAgLyoqCiAgICAgICogV3JhcHBlciBhcm91bmQgYW4gSW5wdXRTdHJlYW0gdGhhdCBwcm92aWRlcyBubyBidWZmZXJpbmcgYnV0IGNhbiBkZWNvZGUgdmFyaW50cwotICAgICAqCi0gICAgICogVE9ETzogcHJvYmFibHkgc2hvdWxkbid0IHVzZSBEYXRhSW5wdXRTdHJlYW0gYXMgYSBwYXJlbnQKICAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgRGF0YUlucHV0U3RyZWFtUGx1cyBleHRlbmRzIERhdGFJbnB1dFN0cmVhbSBpbXBsZW1lbnRzIERhdGFJbnB1dFBsdXMKKyAgICBhYnN0cmFjdCBjbGFzcyBEYXRhSW5wdXRTdHJlYW1QbHVzIGV4dGVuZHMgSW5wdXRTdHJlYW0gaW1wbGVtZW50cyBEYXRhSW5wdXRQbHVzCiAgICAgewotICAgICAgICBwdWJsaWMgRGF0YUlucHV0U3RyZWFtUGx1cyhJbnB1dFN0cmVhbSBpcykKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoaXMpOwotICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9EYXRhSW50ZWdyaXR5TWV0YWRhdGEuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRGF0YUludGVncml0eU1ldGFkYXRhLmphdmEKaW5kZXggNjVkNGU1OC4uYWVmMzYxNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9EYXRhSW50ZWdyaXR5TWV0YWRhdGEuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0RhdGFJbnRlZ3JpdHlNZXRhZGF0YS5qYXZhCkBAIC0yMyw1MSArMjMsMzAgQEAKIGltcG9ydCBqYXZhLnV0aWwuemlwLkNoZWNrZWRJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkNoZWNrc3VtOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2hlY2tzdW1UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRocm93YWJsZXM7CiAKIHB1YmxpYyBjbGFzcyBEYXRhSW50ZWdyaXR5TWV0YWRhdGEKIHsKLSAgICBwdWJsaWMgc3RhdGljIENoZWNrc3VtVmFsaWRhdG9yIGNoZWNrc3VtVmFsaWRhdG9yKERlc2NyaXB0b3IgZGVzYykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IENoZWNrc3VtVmFsaWRhdG9yKGRlc2MpOwotICAgIH0KLQogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2hlY2tzdW1WYWxpZGF0b3IgaW1wbGVtZW50cyBDbG9zZWFibGUKICAgICB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgQ2hlY2tzdW1UeXBlIGNoZWNrc3VtVHlwZTsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBSYW5kb21BY2Nlc3NSZWFkZXIgcmVhZGVyOwogICAgICAgICBwdWJsaWMgZmluYWwgaW50IGNodW5rU2l6ZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGF0YUZpbGVuYW1lOwogCi0gICAgICAgIHB1YmxpYyBDaGVja3N1bVZhbGlkYXRvcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICBwdWJsaWMgQ2hlY2tzdW1WYWxpZGF0b3IoRmlsZSBkYXRhRmlsZSwgRmlsZSBjcmNGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgdGhpcyhDaGVja3N1bVR5cGUuQ1JDMzIsCi0gICAgICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlci5vcGVuKG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkNSQykpKSwKLSAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpOworICAgICAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIub3BlbihjcmNGaWxlKSwKKyAgICAgICAgICAgICAgICAgZGF0YUZpbGUuYWJzb2x1dGVQYXRoKCkpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIENoZWNrc3VtVmFsaWRhdG9yKENoZWNrc3VtVHlwZSBjaGVja3N1bVR5cGUsIFJhbmRvbUFjY2Vzc1JlYWRlciByZWFkZXIsIFN0cmluZyBkYXRhRmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzLmNoZWNrc3VtVHlwZSA9IGNoZWNrc3VtVHlwZTsKICAgICAgICAgICAgIHRoaXMucmVhZGVyID0gcmVhZGVyOwotICAgICAgICAgICAgdGhpcy5kYXRhRmlsZW5hbWUgPSBkYXRhRmlsZW5hbWU7CiAgICAgICAgICAgICBjaHVua1NpemUgPSByZWFkZXIucmVhZEludCgpOwogICAgICAgICB9CiAKLSAgICAgICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgICAgIHByb3RlY3RlZCBDaGVja3N1bVZhbGlkYXRvcihDaGVja3N1bVR5cGUgY2hlY2tzdW1UeXBlLCBSYW5kb21BY2Nlc3NSZWFkZXIgcmVhZGVyLCBpbnQgY2h1bmtTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmNoZWNrc3VtVHlwZSA9IGNoZWNrc3VtVHlwZTsKLSAgICAgICAgICAgIHRoaXMucmVhZGVyID0gcmVhZGVyOwotICAgICAgICAgICAgdGhpcy5kYXRhRmlsZW5hbWUgPSBudWxsOwotICAgICAgICAgICAgdGhpcy5jaHVua1NpemUgPSBjaHVua1NpemU7Ci0gICAgICAgIH0KLQogICAgICAgICBwdWJsaWMgdm9pZCBzZWVrKGxvbmcgb2Zmc2V0KQogICAgICAgICB7CiAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gY2h1bmtTdGFydChvZmZzZXQpOwpAQCAtODIsMTAgKzYxLDEwIEBACiAKICAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoYnl0ZVtdIGJ5dGVzLCBpbnQgc3RhcnQsIGludCBlbmQpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY3VycmVudCA9IChpbnQpIGNoZWNrc3VtVHlwZS5vZihieXRlcywgc3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICBpbnQgYWN0dWFsID0gcmVhZGVyLnJlYWRJbnQoKTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50ICE9IGFjdHVhbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNvcnJ1cHRlZCBGaWxlIDogIiArIGRhdGFGaWxlbmFtZSk7CisgICAgICAgICAgICBpbnQgY2FsY3VsYXRlZFZhbHVlID0gKGludCkgY2hlY2tzdW1UeXBlLm9mKGJ5dGVzLCBzdGFydCwgZW5kKTsKKyAgICAgICAgICAgIGludCBzdG9yZWRWYWx1ZSA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBpZiAoY2FsY3VsYXRlZFZhbHVlICE9IHN0b3JlZFZhbHVlKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJDb3JydXB0ZWQgZmlsZTogaW50ZWdyaXR5IGNoZWNrICglcykgZmFpbGVkIGZvciAlczogJWQgIT0gJWQiLCBjaGVja3N1bVR5cGUubmFtZSgpLCByZWFkZXIuZ2V0UGF0aCgpLCBzdG9yZWRWYWx1ZSwgY2FsY3VsYXRlZFZhbHVlKSk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTk2LDEwICs3NSwxMCBAQAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoQnl0ZUJ1ZmZlciBidWZmZXIpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY3VycmVudCA9IChpbnQpIGNoZWNrc3VtVHlwZS5vZihidWZmZXIpOwotICAgICAgICAgICAgaW50IGFjdHVhbCA9IHJlYWRlci5yZWFkSW50KCk7Ci0gICAgICAgICAgICBpZiAoY3VycmVudCAhPSBhY3R1YWwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3JydXB0ZWQgRmlsZSA6ICIgKyBkYXRhRmlsZW5hbWUpOworICAgICAgICAgICAgaW50IGNhbGN1bGF0ZWRWYWx1ZSA9IChpbnQpIGNoZWNrc3VtVHlwZS5vZihidWZmZXIpOworICAgICAgICAgICAgaW50IHN0b3JlZFZhbHVlID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGlmIChjYWxjdWxhdGVkVmFsdWUgIT0gc3RvcmVkVmFsdWUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkNvcnJ1cHRlZCBmaWxlOiBpbnRlZ3JpdHkgY2hlY2sgKCVzKSBmYWlsZWQgZm9yICVzOiAlZCAhPSAlZCIsIGNoZWNrc3VtVHlwZS5uYW1lKCksIHJlYWRlci5nZXRQYXRoKCksIHN0b3JlZFZhbHVlLCBjYWxjdWxhdGVkVmFsdWUpKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKQEAgLTEwOCw1NSArODcsMzMgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRmlsZURpZ2VzdFZhbGlkYXRvciBmaWxlRGlnZXN0VmFsaWRhdG9yKERlc2NyaXB0b3IgZGVzYykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEZpbGVEaWdlc3RWYWxpZGF0b3IoZGVzYyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWxlRGlnZXN0VmFsaWRhdG9yIGltcGxlbWVudHMgQ2xvc2VhYmxlCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWxlRGlnZXN0VmFsaWRhdG9yCiAgICAgewogICAgICAgICBwcml2YXRlIGZpbmFsIENoZWNrc3VtIGNoZWNrc3VtOwotICAgICAgICBwcml2YXRlIGZpbmFsIFJhbmRvbUFjY2Vzc1JlYWRlciBkaWdlc3RSZWFkZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUmFuZG9tQWNjZXNzUmVhZGVyIGRhdGFSZWFkZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotICAgICAgICBwcml2YXRlIGxvbmcgc3RvcmVkRGlnZXN0VmFsdWU7CisgICAgICAgIHByaXZhdGUgZmluYWwgRmlsZSBkYXRhRmlsZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIGRpZ2VzdEZpbGU7CiAKLSAgICAgICAgcHVibGljIEZpbGVEaWdlc3RWYWxpZGF0b3IoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgcHVibGljIEZpbGVEaWdlc3RWYWxpZGF0b3IoRmlsZSBkYXRhRmlsZSwgRmlsZSBkaWdlc3RGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewotICAgICAgICAgICAgdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICAgICAgICAgIGNoZWNrc3VtID0gQ2hlY2tzdW1UeXBlLkNSQzMyLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBkaWdlc3RSZWFkZXIgPSBSYW5kb21BY2Nlc3NSZWFkZXIub3BlbihuZXcgRmlsZShkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5ESUdFU1QpKSk7Ci0gICAgICAgICAgICBkYXRhUmVhZGVyID0gUmFuZG9tQWNjZXNzUmVhZGVyLm9wZW4obmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0b3JlZERpZ2VzdFZhbHVlID0gTG9uZy5wYXJzZUxvbmcoZGlnZXN0UmVhZGVyLnJlYWRMaW5lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgLy8gQXR0ZW1wdGluZyB0byBjcmVhdGUgYSBGaWxlRGlnZXN0VmFsaWRhdG9yIHdpdGhvdXQgYSBESUdFU1QgZmlsZSB3aWxsIGZhaWwKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNvcnJ1cHRlZCBTU1RhYmxlIDogIiArIGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuZGF0YUZpbGUgPSBkYXRhRmlsZTsKKyAgICAgICAgICAgIHRoaXMuZGlnZXN0RmlsZSA9IGRpZ2VzdEZpbGU7CisgICAgICAgICAgICB0aGlzLmNoZWNrc3VtID0gQ2hlY2tzdW1UeXBlLkNSQzMyLm5ld0luc3RhbmNlKCk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgZW50aXJlIGZpbGUKICAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewotICAgICAgICAgICAgQ2hlY2tlZElucHV0U3RyZWFtIGNoZWNrZWRJbnB1dFN0cmVhbSA9IG5ldyBDaGVja2VkSW5wdXRTdHJlYW0oZGF0YVJlYWRlciwgY2hlY2tzdW0pOwotICAgICAgICAgICAgYnl0ZVtdIGNodW5rID0gbmV3IGJ5dGVbNjQgKiAxMDI0XTsKLQotICAgICAgICAgICAgd2hpbGUoIGNoZWNrZWRJbnB1dFN0cmVhbS5yZWFkKGNodW5rKSA+IDAgKSB7IH0KLSAgICAgICAgICAgIGxvbmcgY2FsY3VsYXRlZERpZ2VzdFZhbHVlID0gY2hlY2tlZElucHV0U3RyZWFtLmdldENoZWNrc3VtKCkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChzdG9yZWREaWdlc3RWYWx1ZSAhPSBjYWxjdWxhdGVkRGlnZXN0VmFsdWUpCisgICAgICAgICAgICB0cnkgKFJhbmRvbUFjY2Vzc1JlYWRlciBkaWdlc3RSZWFkZXIgPSBSYW5kb21BY2Nlc3NSZWFkZXIub3BlbihkaWdlc3RGaWxlKTsKKyAgICAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIGRhdGFSZWFkZXIgPSBSYW5kb21BY2Nlc3NSZWFkZXIub3BlbihkYXRhRmlsZSk7CisgICAgICAgICAgICAgICAgIENoZWNrZWRJbnB1dFN0cmVhbSBjaGVja2VkSW5wdXRTdHJlYW0gPSBuZXcgQ2hlY2tlZElucHV0U3RyZWFtKGRhdGFSZWFkZXIsIGNoZWNrc3VtKTspCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3JydXB0ZWQgU1NUYWJsZSA6ICIgKyBkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSk7CisgICAgICAgICAgICAgICAgbG9uZyBzdG9yZWREaWdlc3RWYWx1ZSA9IExvbmcucGFyc2VMb25nKGRpZ2VzdFJlYWRlci5yZWFkTGluZSgpKTsKKyAgICAgICAgICAgICAgICBieXRlW10gY2h1bmsgPSBuZXcgYnl0ZVs2NCAqIDEwMjRdOworICAgICAgICAgICAgICAgIHdoaWxlIChjaGVja2VkSW5wdXRTdHJlYW0ucmVhZChjaHVuaykgPiAwKSA7CisgICAgICAgICAgICAgICAgbG9uZyBjYWxjdWxhdGVkRGlnZXN0VmFsdWUgPSBjaGVja2VkSW5wdXRTdHJlYW0uZ2V0Q2hlY2tzdW0oKS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgIGlmIChzdG9yZWREaWdlc3RWYWx1ZSAhPSBjYWxjdWxhdGVkRGlnZXN0VmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJDb3JydXB0ZWQgZmlsZTogaW50ZWdyaXR5IGNoZWNrIChkaWdlc3QpIGZhaWxlZCBmb3IgJXM6ICVkICE9ICVkIiwgZGF0YUZpbGUsIHN0b3JlZERpZ2VzdFZhbHVlLCBjYWxjdWxhdGVkRGlnZXN0VmFsdWUpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKLSAgICAgICAgewotICAgICAgICAgICAgVGhyb3dhYmxlcy5wZXJmb3JtKGRpZ2VzdFJlYWRlcjo6Y2xvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlYWRlcjo6Y2xvc2UpOwotICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9EYXRhT3V0cHV0QnVmZmVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0RhdGFPdXRwdXRCdWZmZXIuamF2YQppbmRleCBkNmYzYTRhLi5kMjdhOTM1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0RhdGFPdXRwdXRCdWZmZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0RhdGFPdXRwdXRCdWZmZXIuamF2YQpAQCAtMjYsNyArMjYsMTAgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7CiAKIGltcG9ydCBpby5uZXR0eS51dGlsLmNvbmN1cnJlbnQuRmFzdFRocmVhZExvY2FsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5EQVRBX09VVFBVVF9CVUZGRVJfQUxMT0NBVEVfVFlQRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ET0JfRE9VQkxJTkdfVEhSRVNIT0xEX01COworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkRPQl9NQVhfUkVDWUNMRV9CWVRFUzsKIAogLyoqCiAgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRGF0YU91dHB1dFN0cmVhbSBpbnRlcmZhY2UgdXNpbmcgYSBGYXN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFuZCBleHBvc2luZwpAQCAtMzksMTcgKzQyLDE5IEBACiAgICAgLyoKICAgICAgKiBUaHJlc2hvbGQgYXQgd2hpY2ggcmVzaXppbmcgdHJhbnNpdGlvbnMgZnJvbSBkb3VibGluZyB0byBpbmNyZWFzaW5nIGJ5IDUwJQogICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBsb25nIERPVUJMSU5HX1RIUkVTSE9MRCA9IExvbmcuZ2V0TG9uZyhDb25maWcuUFJPUEVSVFlfUFJFRklYICsgIkRPQl9ET1VCTElOR19USFJFU0hPTERfTUIiLCA2NCk7CisgICAgc3RhdGljIGZpbmFsIGxvbmcgRE9VQkxJTkdfVEhSRVNIT0xEID0gRE9CX0RPVUJMSU5HX1RIUkVTSE9MRF9NQi5nZXRMb25nKCk7CiAKICAgICAvKgogICAgICAqIE9ubHkgcmVjeWNsZSBPdXRwdXRCdWZmZXJzIHVwIHRvIDFNYi4gTGFyZ2VyIGJ1ZmZlcnMgd2lsbCBiZSB0cmltbWVkIGJhY2sgdG8gdGhpcyBzaXplLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUkVDWUNMRV9CVUZGRVJfU0laRSA9IEludGVnZXIuZ2V0SW50ZWdlcihDb25maWcuUFJPUEVSVFlfUFJFRklYICsgImRvYl9tYXhfcmVjeWNsZV9ieXRlcyIsIDEwMjQgKiAxMDI0KTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JFQ1lDTEVfQlVGRkVSX1NJWkUgPSBET0JfTUFYX1JFQ1lDTEVfQllURVMuZ2V0SW50KCk7CisgICAgcHJpdmF0ZSBlbnVtIEFsbG9jYXRpb25UeXBlIHsgRElSRUNULCBPTkhFQVAgfQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFsbG9jYXRpb25UeXBlIEFMTE9DQVRJT05fVFlQRSA9IERBVEFfT1VUUFVUX0JVRkZFUl9BTExPQ0FURV9UWVBFLmdldEVudW0oQWxsb2NhdGlvblR5cGUuRElSRUNUKTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0lOSVRJQUxfQlVGRkVSX1NJWkUgPSAxMjg7CiAKICAgICAvKioKLSAgICAgKiBTY3JhdGNoIGJ1ZmZlcnMgdXNlZCBtb3N0bHkgZm9yIHNlcmlhbGl6aW5nIGluIG1lbW9yeS4gSXQncyBpbXBvcnRhbnQgdG8gY2FsbCAjcmVjeWNsZSgpIHdoZW4gZmluaXNoZWQKKyAgICAgKiBTY3JhdGNoIGJ1ZmZlcnMgdXNlZCBtb3N0bHkgZm9yIHNlcmlhbGl6aW5nIGluIG1lbW9yeS4gSXQncyBpbXBvcnRhbnQgdG8gY2FsbCAjY2xvc2UoKSB3aGVuIGZpbmlzaGVkCiAgICAgICogdG8ga2VlcCB0aGUgbWVtb3J5IG92ZXJoZWFkIGZyb20gYmVpbmcgdG9vIGxhcmdlIGluIHRoZSBzeXN0ZW0uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBGYXN0VGhyZWFkTG9jYWw8RGF0YU91dHB1dEJ1ZmZlcj4gc2NyYXRjaEJ1ZmZlciA9IG5ldyBGYXN0VGhyZWFkTG9jYWw8RGF0YU91dHB1dEJ1ZmZlcj4oKQpAQCAtNTksMjkgKzY0LDM4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YU91dHB1dEJ1ZmZlcigpCiAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci5jYXBhY2l0eSgpIDw9IE1BWF9SRUNZQ0xFX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyICE9IG51bGwgJiYgYnVmZmVyLmNhcGFjaXR5KCkgPD0gTUFYX1JFQ1lDTEVfQlVGRkVSX1NJWkUpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShERUZBVUxUX0lOSVRJQUxfQlVGRkVSX1NJWkUpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0QnVmZmVyKGFsbG9jYXRlKERFRkFVTFRfSU5JVElBTF9CVUZGRVJfU0laRSkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIEJ5dGVCdWZmZXIgYWxsb2NhdGUoaW50IHNpemUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQUxMT0NBVElPTl9UWVBFID09IEFsbG9jYXRpb25UeXBlLkRJUkVDVCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KHNpemUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIuYWxsb2NhdGUoc2l6ZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfTsKICAgICAgICAgfQogICAgIH07CiAKICAgICBwdWJsaWMgRGF0YU91dHB1dEJ1ZmZlcigpCiAgICAgewotICAgICAgICB0aGlzKERFRkFVTFRfSU5JVElBTF9CVUZGRVJfU0laRSk7CisgICAgICAgIHN1cGVyKERFRkFVTFRfSU5JVElBTF9CVUZGRVJfU0laRSk7CiAgICAgfQogCiAgICAgcHVibGljIERhdGFPdXRwdXRCdWZmZXIoaW50IHNpemUpCiAgICAgewotICAgICAgICBzdXBlcihCeXRlQnVmZmVyLmFsbG9jYXRlKHNpemUpKTsKKyAgICAgICAgc3VwZXIoc2l6ZSk7CiAgICAgfQogCiAgICAgcHVibGljIERhdGFPdXRwdXRCdWZmZXIoQnl0ZUJ1ZmZlciBidWZmZXIpCkBAIC0xNTgsOSArMTcyLDE1IEBACiAgICAgewogICAgICAgICBpZiAoY291bnQgPD0gMCkKICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgQnl0ZUJ1ZmZlciBuZXdCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGNoZWNrZWRBcnJheVNpemVDYXN0KGNhbGN1bGF0ZU5ld1NpemUoY291bnQpKSk7CisgICAgICAgIEJ5dGVCdWZmZXIgbmV3QnVmZmVyID0gYWxsb2NhdGUoY2hlY2tlZEFycmF5U2l6ZUNhc3QoY2FsY3VsYXRlTmV3U2l6ZShjb3VudCkpKTsKICAgICAgICAgYnVmZmVyLmZsaXAoKTsKICAgICAgICAgbmV3QnVmZmVyLnB1dChidWZmZXIpOworICAgICAgICBzZXRCdWZmZXIobmV3QnVmZmVyKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRCdWZmZXIoQnl0ZUJ1ZmZlciBuZXdCdWZmZXIpCisgICAgeworICAgICAgICBGaWxlVXRpbHMuY2xlYW4oYnVmZmVyKTsgLy8gZnJlZSBpZiBkaXJlY3QKICAgICAgICAgYnVmZmVyID0gbmV3QnVmZmVyOwogICAgIH0KIApAQCAtMjIxLDYgKzI0MSwxOCBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIHVuZGVybHlpbmcgQnl0ZUJ1ZmZlciBhbmQgY2FsbHMge0BsaW5rIEJ5dGVCdWZmZXIjZmxpcCgpfS4gIFRoaXMgbWV0aG9kIGlzICJ1bnNhZmUiIGluIHRoZSBzZW5zZSB0aGF0CisgICAgICogaXQgcmV0dXJucyB0aGUgdW5kZXJseWluZyBidWZmZXIsIHdoaWNoIG1heSBiZSBtb2RpZmllZCBieSBvdGhlciBtZXRob2RzIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgKG9yIGNsZWFyZWQgb24KKyAgICAgKiB7QGxpbmsgI2Nsb3NlKCl9KS4gSWYgdGhlIGNhbGxpbmcgbG9naWMga25vd3MgdGhhdCBubyBuZXcgY2FsbHMgdG8gdGhpcyBvYmplY3Qgd2lsbCBoYXBwZW4gYWZ0ZXIgY2FsbGluZyB0aGlzCisgICAgICogbWV0aG9kLCB0aGVuIHRoaXMgbWV0aG9kIGNhbiBhdm9pZCB0aGUgY29weWluZyBkb25lIGluIHtAbGluayAjYXNOZXdCdWZmZXIoKX0sIGFuZCB7QGxpbmsgI2J1ZmZlcigpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciB1bnNhZmVHZXRCdWZmZXJBbmRGbGlwKCkKKyAgICB7CisgICAgICAgIGJ1ZmZlci5mbGlwKCk7CisgICAgICAgIHJldHVybiBidWZmZXI7CisgICAgfQorCiAgICAgcHVibGljIGJ5dGVbXSBnZXREYXRhKCkKICAgICB7CiAgICAgICAgIGFzc2VydCBidWZmZXIuYXJyYXlPZmZzZXQoKSA9PSAwOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9EYXRhT3V0cHV0UGx1cy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9EYXRhT3V0cHV0UGx1cy5qYXZhCmluZGV4IDIwNWRhYjcuLjhiM2I0OWYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRGF0YU91dHB1dFBsdXMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0RhdGFPdXRwdXRQbHVzLmphdmEKQEAgLTE3LDEzICsxNywxMyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWw7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5TaGFyZWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMudmludC5WSW50Q29kaW5nOworCiBpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0OwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlNoYXJlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy52aW50LlZJbnRDb2Rpbmc7Ci0KIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2hhcmVkLlNjb3BlLlNJTVVMQVRJT047CiAKIC8qKgpAQCAtNDcsNiArNDcsMTcgQEAKICAgICAgICAgVkludENvZGluZy53cml0ZVZJbnQoaSwgdGhpcyk7CiAgICAgfQogCisgICAgQERlcHJlY2F0ZWQKKyAgICBkZWZhdWx0IHZvaWQgd3JpdGVWSW50KGludCBpKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVc2Ugd3JpdGVWSW50MzIvcmVhZFZJbnQzMiIpOworICAgIH0KKworICAgIGRlZmF1bHQgdm9pZCB3cml0ZVZJbnQzMihpbnQgaSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBWSW50Q29kaW5nLndyaXRlVkludDMyKGksIHRoaXMpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgZm9yIHN0b3JpbmcgdW5zaWduZWQgdmFsdWVzLCBib3RoIGluIHN0b3JhZ2UgYW5kIENQVSBidXJkZW4uCiAgICAgICoKQEAgLTU5LDYgKzcwLDE3IEBACiAgICAgICAgIFZJbnRDb2Rpbmcud3JpdGVVbnNpZ25lZFZJbnQoaSwgdGhpcyk7CiAgICAgfQogCisgICAgQERlcHJlY2F0ZWQKKyAgICBkZWZhdWx0IHZvaWQgd3JpdGVVbnNpZ25lZFZJbnQoaW50IGkpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVzZSB3cml0ZVVuc2lnbmVkVkludDMyL3JlYWRVbnNpZ25lZFZJbnQzMiIpOworICAgIH0KKworICAgIGRlZmF1bHQgdm9pZCB3cml0ZVVuc2lnbmVkVkludDMyKGludCBpKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFZJbnRDb2Rpbmcud3JpdGVVbnNpZ25lZFZJbnQzMihpLCB0aGlzKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBBbiBlZmZpY2llbnQgd2F5IHRvIHdyaXRlIHRoZSB0eXBlIHtAY29kZSBieXRlc30gb2YgYSBsb25nCiAgICAgICoKQEAgLTY2LDcgKzg4LDcgQEAKICAgICAgKiBAcGFyYW0gYnl0ZXMgLSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZSByZWdpc3RlciBvY2N1cGllcy4gVmFsaWQgdmFsdWVzIGFyZSBiZXR3ZWVuIDEgYW5kIDggaW5jbHVzaXZlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKi8KLSAgICBkZWZhdWx0IHZvaWQgd3JpdGVCeXRlcyhsb25nIHJlZ2lzdGVyLCBpbnQgYnl0ZXMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIGRlZmF1bHQgdm9pZCB3cml0ZU1vc3RTaWduaWZpY2FudEJ5dGVzKGxvbmcgcmVnaXN0ZXIsIGludCBieXRlcykgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBzd2l0Y2ggKGJ5dGVzKQogICAgICAgICB7CkBAIC0xMjksNCArMTUxLDQwIEBACiAgICAgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotfQorCisgICAgLy8gVGhlIG1ldGhvZHMgYmVsb3cgc3VwcG9ydCBwYWdlLWF3YXJlIGxheW91dCBmb3Igd3JpdGluZy4gVGhlc2Ugd291bGQgb25seSBiZSBpbXBsZW1lbnRlZCBpZiBwb3NpdGlvbigpIGlzCisgICAgLy8gYWxzbyBzdXBwb3J0ZWQuCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIHBhZ2UgY2FuIHRha2UgYXQgbWF4aW11bS4KKyAgICAgKi8KKyAgICBkZWZhdWx0IGludCBtYXhCeXRlc0luUGFnZSgpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWQgdGhpcyBwYWdlIHdpdGggMHMgdG8gbW92ZSBvbiB0byB0aGUgbmV4dC4KKyAgICAgKi8KKyAgICBkZWZhdWx0IHZvaWQgcGFkVG9QYWdlQm91bmRhcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgaG93IG1hbnkgYnl0ZXMgYXJlIGxlZnQgaW4gdGhlIHBhZ2UuCisgICAgICovCisgICAgZGVmYXVsdCBpbnQgYnl0ZXNMZWZ0SW5QYWdlKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgcGFkZGVkIHBvc2l0aW9uLiBUaGlzIGlzIGVpdGhlciB0aGUgY3VycmVudCBwb3NpdGlvbiAoaWYgYWxyZWFkeSBwYWRkZWQpLCBvciB0aGUgc3RhcnQgb2YgbmV4dAorICAgICAqIHBhZ2UuCisgICAgICovCisgICAgZGVmYXVsdCBsb25nIHBhZGRlZFBvc2l0aW9uKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0RhdGFPdXRwdXRTdHJlYW1QbHVzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0RhdGFPdXRwdXRTdHJlYW1QbHVzLmphdmEKaW5kZXggZTkzMTg5OS4uN2RkMjM0MSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9EYXRhT3V0cHV0U3RyZWFtUGx1cy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRGF0YU91dHB1dFN0cmVhbVBsdXMuamF2YQpAQCAtMjMsOSArMjMsMTAgQEAKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Xcml0YWJsZUJ5dGVDaGFubmVsOwogCiBpbXBvcnQgaW8ubmV0dHkudXRpbC5jb25jdXJyZW50LkZhc3RUaHJlYWRMb2NhbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuREFUQV9PVVRQVVRfU1RSRUFNX1BMVVNfVEVNUF9CVUZGRVJfU0laRTsKKwogLyoqCiAgKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBEYXRhT3V0cHV0U3RyZWFtcyB0aGF0IGFjY2VwdCB3cml0ZXMgZnJvbSBCeXRlQnVmZmVyIG9yIE1lbW9yeSBhbmQgYWxzbyBwcm92aWRlCiAgKiBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgV3JpdGFibGVCeXRlQ2hhbm5lbCBhc3NvY2lhdGVkIHdpdGggdGhlaXIgb3V0cHV0IHN0cmVhbS4KQEAgLTQ3LDggKzQ4LDcgQEAKICAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgTUFYX0JVRkZFUl9TSVpFID0KLSAgICAgICAgICAgIEludGVnZXIuZ2V0SW50ZWdlcihDb25maWcuUFJPUEVSVFlfUFJFRklYICsgImRhdGFfb3V0cHV0X3N0cmVhbV9wbHVzX3RlbXBfYnVmZmVyX3NpemUiLCA4MTkyKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0JVRkZFUl9TSVpFID0gREFUQV9PVVRQVVRfU1RSRUFNX1BMVVNfVEVNUF9CVUZGRVJfU0laRS5nZXRJbnQoKTsKIAogICAgIC8qCiAgICAgICogRmFjdG9yZWQgb3V0IGludG8gc2VwYXJhdGUgbWV0aG9kIHRvIGNyZWF0ZSBtb3JlIGZsZXhpYmlsaXR5IGFyb3VuZCBpbmxpbmluZwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9FbXB0eVJlYnVmZmVyZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRW1wdHlSZWJ1ZmZlcmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4ZTdlMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRW1wdHlSZWJ1ZmZlcmVyLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsOworCitwdWJsaWMgY2xhc3MgRW1wdHlSZWJ1ZmZlcmVyIGltcGxlbWVudHMgUmVidWZmZXJlciwgUmVidWZmZXJlckZhY3RvcnkKK3sKKyAgICBwcml2YXRlIGZpbmFsIENoYW5uZWxQcm94eSBjaGFubmVsOworCisgICAgcHVibGljIEVtcHR5UmVidWZmZXJlcihDaGFubmVsUHJveHkgY2hhbm5lbCkKKyAgICB7CisgICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgIHsKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDaGFubmVsUHJveHkgY2hhbm5lbCgpCisgICAgeworICAgICAgICByZXR1cm4gY2hhbm5lbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBmaWxlTGVuZ3RoKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBkb3VibGUgZ2V0Q3JjQ2hlY2tDaGFuY2UoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1ZmZlckhvbGRlciByZWJ1ZmZlcihsb25nIHBvc2l0aW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEVNUFRZOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlUmVhZGVyKCkKKyAgICB7CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVidWZmZXJlciBpbnN0YW50aWF0ZVJlYnVmZmVyZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9GaWxlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0ZpbGUuamF2YQppbmRleCAxZjQ4NzA3Li5kZTQxNTM4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0ZpbGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0ZpbGUuamF2YQpAQCAtMjMsNyArMjMsMTIgQEAKIGltcG9ydCBqYXZhLmlvLlVuY2hlY2tlZElPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSSTsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKLWltcG9ydCBqYXZhLm5pby5maWxlLio7IC8vIGNoZWNrc3R5bGU6IHBlcm1pdCB0aGlzIGltcG9ydAoraW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVN5c3RlbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVTeXN0ZW1zOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5Ob1N1Y2hGaWxlRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOyAvLyBjaGVja3N0eWxlOiBwZXJtaXQgdGhpcyBpbXBvcnQKIGltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlQcmVkaWNhdGU7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOwpAQCAtMzEsOSArMzYsOSBAQAogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5JbnRGdW5jdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwotCiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5SYXRlTGltaXRlcjsKIAogaW1wb3J0IG5ldC5vcGVuaGZ0LmNocm9uaWNsZS5jb3JlLnV0aWwuVGhyb3dpbmdGdW5jdGlvbjsKQEAgLTEyMiwxNyArMTI3LDI4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogVW5zYWZlIGNvbnN0cnVjdG9yIHRoYXQgYWxsb3dzIGEgRmlsZSB0byB1c2UgYSBkaWZmZXJldCB7QGxpbmsgRmlsZVN5c3RlbX0gdGhhbiB7QGxpbmsgRmlsZSNmaWxlc3lzdGVtfS4KKyAgICAgKgorICAgICAqIFRoZSBtYWluIGNhbGxlciBvZiBzdWNoIGEgbWV0aG9kIGFyZSBjYXNlcyBzdWNoIGFzIEpWTSBEdGVzdCBmdW5jdGlvbnMgdGhhdCBuZWVkIGFjY2VzcyB0byB0aGUgbG9nZ2luZyBmcmFtd29yaworICAgICAqIGZpbGVzLCB3aGljaCBleGlzdHMgb24gaW4ge0BsaW5rIEZpbGVTeXN0ZW1zI2dldERlZmF1bHQoKX0uCisgICAgICovCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIEZpbGUoRmlsZVN5c3RlbSBmcywgU3RyaW5nIGZpcnN0LCBTdHJpbmcuLi4gbW9yZSkKKyAgICB7CisgICAgICAgIHRoaXMucGF0aCA9IGZzLmdldFBhdGgoZmlyc3QsIG1vcmUpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHdyYXAKICAgICAgKi8KICAgICBwdWJsaWMgRmlsZShQYXRoIHBhdGgpCiAgICAgewogICAgICAgICBpZiAocGF0aCAhPSBudWxsICYmIHBhdGguZ2V0RmlsZVN5c3RlbSgpICE9IGZpbGVzeXN0ZW0pCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbmNvbXBhdGlibGUgZmlsZSBzeXN0ZW0iKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkluY29tcGF0aWJsZSBmaWxlIHN5c3RlbTsgcGF0aCBGaWxlU3lzdGVtICgiICsgcGF0aC5nZXRGaWxlU3lzdGVtKCkgKyAiKSBpcyBub3QgdGhlIHNhbWUgcmVmZXJlbmNlICgiICsgZmlsZXN5c3RlbSArICIpIik7CiAKICAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKICAgICB9CiAKLQogICAgIHB1YmxpYyBzdGF0aWMgUGF0aCBnZXRQYXRoKFN0cmluZyBmaXJzdCwgU3RyaW5nLi4uIG1vcmUpCiAgICAgewogICAgICAgICByZXR1cm4gZmlsZXN5c3RlbS5nZXRQYXRoKGZpcnN0LCBtb3JlKTsKQEAgLTc1Myw2ICs3NjksMTMgQEAKICAgICAgICAgcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW1QbHVzKHRoaXMpOwogICAgIH0KIAorICAgIHB1YmxpYyBGaWxlIHdpdGhTdWZmaXgoU3RyaW5nIHN1ZmZpeCkKKyAgICB7CisgICAgICAgIGlmIChwYXRoID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3Qgc3VmZml4IGFuIGVtcHR5IHBhdGgiKTsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHBhdGguZ2V0UGFyZW50KCkucmVzb2x2ZShwYXRoLmdldEZpbGVOYW1lKCkudG9TdHJpbmcoKSArIHN1ZmZpeCkpOworICAgIH0KKwogICAgIHByaXZhdGUgUGF0aCB0b1BhdGhGb3JXcml0ZSgpCiAgICAgewogICAgICAgICBpZiAocGF0aCA9PSBudWxsKQpAQCAtNzY3LDYgKzc5MCwxMiBAQAogICAgICAgICByZXR1cm4gcGF0aDsKICAgICB9CiAKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgc3RhdGljIEZpbGVTeXN0ZW0gdW5zYWZlR2V0RmlsZXN5c3RlbSgpCisgICAgeworICAgICAgICByZXR1cm4gZmlsZXN5c3RlbTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdW5zYWZlU2V0RmlsZXN5c3RlbShGaWxlU3lzdGVtIGZzKQogICAgIHsKICAgICAgICAgZmlsZXN5c3RlbSA9IGZzOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9GaWxlSGFuZGxlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0ZpbGVIYW5kbGUuamF2YQppbmRleCA2YmFiNDYwLi41YzRiZDcyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0ZpbGVIYW5kbGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0ZpbGVIYW5kbGUuamF2YQpAQCAtMTcsMzEgKzE3LDI5IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbDsKIAotaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuUmF0ZUxpbWl0ZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLkNodW5rQ2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzcy5CdWZmZXJUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkNvbXByZXNzaW9uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTmF0aXZlTGlicmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuUmVmOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuUmVmQ291bnRlZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlNoYXJlZENsb3NlYWJsZUltcGw7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlcy5tYXliZUZhaWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKLQogLyoqCiAgKiB7QGxpbmsgRmlsZUhhbmRsZX0gcHJvdmlkZXMgYWNjZXNzIHRvIGEgZmlsZSBmb3IgcmVhZGluZywgaW5jbHVkaW5nIHRoZSBvbmVzIHdyaXR0ZW4gYnkgdmFyaW91cyB7QGxpbmsgU2VxdWVudGlhbFdyaXRlcn0KICAqIGluc3RhbmNlcywgYW5kIGl0IGlzIHR5cGljYWxseSB1c2VkIGJ5IHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyfS4KLSAqCisgKiA8cD4KICAqIFVzZSB7QGxpbmsgRmlsZUhhbmRsZS5CdWlsZGVyfSB0byBjcmVhdGUgYW4gaW5zdGFuY2UsIGFuZCBjYWxsIHtAbGluayAjY3JlYXRlUmVhZGVyKCl9IChhbmQgaXRzIHZhcmlhbnRzKSB0bwogICogYWNjZXNzIHRoZSByZWFkZXJzIGZvciB0aGUgdW5kZXJseWluZyBmaWxlLgotICoKKyAqIDxwPgogICogWW91IGNhbiB1c2Uge0BsaW5rIEJ1aWxkZXIjY29tcGxldGUoKX0gc2V2ZXJhbCB0aW1lcyBkdXJpbmcgaXRzIGxpZmVjeWNsZSB3aXRoIGRpZmZlcmVudCB7QGNvZGUgb3ZlcnJpZGVMZW5ndGh9KGkuZS4gZWFybHkgb3BlbmluZyBmaWxlKS4KICAqIEZvciB0aGF0IHJlYXNvbiwgdGhlIGJ1aWxkZXIga2VlcHMgYSByZWZlcmVuY2UgdG8gdGhlIGZpbGUgY2hhbm5lbCBhbmQgbWFrZXMgYSBjb3B5IGZvciBlYWNoIHtAbGluayBCdWlsZGVyI2NvbXBsZXRlKCl9IGNhbGwuCiAgKiBUaGVyZWZvcmUsIGl0IGlzIGltcG9ydGFudCB0byBjbG9zZSB0aGUge0BsaW5rIEJ1aWxkZXJ9IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZCwgYXMgd2VsbCBhcyBhbnkge0BsaW5rIEZpbGVIYW5kbGV9CkBAIC00OSw4ICs0Nyw2IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBGaWxlSGFuZGxlIGV4dGVuZHMgU2hhcmVkQ2xvc2VhYmxlSW1wbAogewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihGaWxlSGFuZGxlLmNsYXNzKTsKLQogICAgIHB1YmxpYyBmaW5hbCBDaGFubmVsUHJveHkgY2hhbm5lbDsKIAogICAgIHB1YmxpYyBmaW5hbCBsb25nIG9uRGlza0xlbmd0aDsKQEAgLTg4LDggKzg0LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHJldHVybiBQYXRoIHRvIHRoZSBmaWxlIHRoaXMgZmFjdG9yeSBpcyByZWZlcmVuY2luZworICAgICAqIEByZXR1cm4gZmlsZSB0aGlzIGZhY3RvcnkgaXMgcmVmZXJlbmNpbmcKICAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBmaWxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRmlsZShjaGFubmVsLmZpbGVQYXRoKCkpOworICAgIH0KKwogICAgIHB1YmxpYyBTdHJpbmcgcGF0aCgpCiAgICAgewogICAgICAgICByZXR1cm4gY2hhbm5lbC5maWxlUGF0aCgpOwpAQCAtMTE0LDcgKzExNSw2IEBACiAgICAgcHVibGljIHZvaWQgYWRkVG8oUmVmLklkZW50aXR5Q29sbGVjdGlvbiBpZGVudGl0aWVzKQogICAgIHsKICAgICAgICAgc3VwZXIuYWRkVG8oaWRlbnRpdGllcyk7Ci0gICAgICAgIGNvbXByZXNzaW9uTWV0YWRhdGEuaWZQcmVzZW50KG1ldGFkYXRhIC0+IG1ldGFkYXRhLmFkZFRvKGlkZW50aXRpZXMpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE1NSw3ICsxNTUsMTQgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeSB7IHJlYWRlci5jbG9zZSgpOyB9IGNhdGNoIChUaHJvd2FibGUgdDIpIHsgdC5hZGRTdXBwcmVzc2VkKHQyKTsgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHQuYWRkU3VwcHJlc3NlZCh0Mik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICB0aHJvdyB0OwogICAgICAgICB9CiAgICAgfQpAQCAtMTczLDEwICsxODAsMTAgQEAKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGEuY2h1bmtGb3IoYmVmb3JlKS5vZmZzZXQ7CiAgICAgICAgIH0pLm9yRWxzZShiZWZvcmUpOwotICAgICAgICBOYXRpdmVMaWJyYXJ5LnRyeVNraXBDYWNoZShjaGFubmVsLmdldEZpbGVEZXNjcmlwdG9yKCksIDAsIHBvc2l0aW9uLCBwYXRoKCkpOworICAgICAgICBOYXRpdmVMaWJyYXJ5LnRyeVNraXBDYWNoZShjaGFubmVsLmdldEZpbGVEZXNjcmlwdG9yKCksIDAsIHBvc2l0aW9uLCBmaWxlKCkuYWJzb2x1dGVQYXRoKCkpOwogICAgIH0KIAotICAgIHByaXZhdGUgUmVidWZmZXJlciBpbnN0YW50aWF0ZVJlYnVmZmVyZXIoUmF0ZUxpbWl0ZXIgbGltaXRlcikKKyAgICBwdWJsaWMgUmVidWZmZXJlciBpbnN0YW50aWF0ZVJlYnVmZmVyZXIoUmF0ZUxpbWl0ZXIgbGltaXRlcikKICAgICB7CiAgICAgICAgIFJlYnVmZmVyZXIgcmVidWZmZXJlciA9IHJlYnVmZmVyZXJGYWN0b3J5Lmluc3RhbnRpYXRlUmVidWZmZXJlcigpOwogCkBAIC0yMzgsMzUgKzI0NSwyMyBAQAogICAgIC8qKgogICAgICAqIENvbmZpZ3VyZXMgaG93IHRoZSBmaWxlIHdpbGwgYmUgcmVhZCAoY29tcHJlc3NlZCwgbW1hcHBlZCwgdXNlIGNhY2hlIGV0Yy4pCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlcgogICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGF0aDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE5PX0xFTkdUSF9PVkVSUklERSA9IC0xOwogCi0gICAgICAgIHByaXZhdGUgQ2hhbm5lbFByb3h5IGNoYW5uZWw7CisgICAgICAgIHB1YmxpYyBmaW5hbCBGaWxlIGZpbGU7CisKICAgICAgICAgcHJpdmF0ZSBDb21wcmVzc2lvbk1ldGFkYXRhIGNvbXByZXNzaW9uTWV0YWRhdGE7Ci0gICAgICAgIHByaXZhdGUgTW1hcHBlZFJlZ2lvbnMgcmVnaW9uczsKICAgICAgICAgcHJpdmF0ZSBDaHVua0NhY2hlIGNodW5rQ2FjaGU7CiAgICAgICAgIHByaXZhdGUgaW50IGJ1ZmZlclNpemUgPSBSYW5kb21BY2Nlc3NSZWFkZXIuREVGQVVMVF9CVUZGRVJfU0laRTsKICAgICAgICAgcHJpdmF0ZSBCdWZmZXJUeXBlIGJ1ZmZlclR5cGUgPSBCdWZmZXJUeXBlLk9GRl9IRUFQOwotCiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtbWFwcGVkID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBjb21wcmVzc2VkID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgbG9uZyBsZW5ndGhPdmVycmlkZSA9IC0xOworICAgICAgICBwcml2YXRlIE1tYXBwZWRSZWdpb25zQ2FjaGUgbW1hcHBlZFJlZ2lvbnNDYWNoZTsKIAotICAgICAgICBwdWJsaWMgQnVpbGRlcihTdHJpbmcgcGF0aCkKKyAgICAgICAgcHVibGljIEJ1aWxkZXIoRmlsZSBmaWxlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnBhdGggPSBwYXRoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoQ2hhbm5lbFByb3h5IGNoYW5uZWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7Ci0gICAgICAgICAgICB0aGlzLnBhdGggPSBjaGFubmVsLmZpbGVQYXRoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQnVpbGRlciBjb21wcmVzc2VkKGJvb2xlYW4gY29tcHJlc3NlZCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5jb21wcmVzc2VkID0gY29tcHJlc3NlZDsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMjgzLDEzICsyNzgsMTUgQEAKIAogICAgICAgICAvKioKICAgICAgICAgICogUHJvdmlkZSB7QGxpbmsgQ29tcHJlc3Npb25NZXRhZGF0YX0gdG8gdXNlIHdoZW4gcmVhZGluZyBjb21wcmVzc2VkIGZpbGUuCisgICAgICAgICAqIFVwb24gY29tcGxldGlvbiwgYnVpbGRlciB3aWxsIGNyZWF0ZSBhIHNoYXJlZCBjb3B5IG9mIHRoaXMgb2JqZWN0IGFuZCB0aGF0IGNvcHkgd2lsbCBiZSB1c2VkIGluIHRoZSBjcmVhdGVkCisgICAgICAgICAqIGluc3RhbmNlIG9mIHtAbGluayBGaWxlSGFuZGxlfS4gVGhlcmVmb3JlLCB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjbG9zaW5nIHRoZSBpbnN0YW5jZSBvZgorICAgICAgICAgKiB7QGxpbmsgQ29tcHJlc3Npb25NZXRhZGF0YX0gcGFzc2VkIHRvIHRoaXMgbWV0aG9kIGFmdGVyIGJ1aWxkZXIgY29tcGxldGlvbi4KICAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhIENvbXByZXNzaW9uTWV0YWRhdGEgdG8gdXNlCisgICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YSBDb21wcmVzc2lvbk1ldGFkYXRhIHRvIHVzZSwgY2FuIGJlIHtAY29kZSBudWxsfSBpZiBubyBjb21wcmVzc2lvbiBpcyB1c2VkCiAgICAgICAgICAqIEByZXR1cm4gdGhpcyBvYmplY3QKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBCdWlsZGVyIHdpdGhDb21wcmVzc2lvbk1ldGFkYXRhKENvbXByZXNzaW9uTWV0YWRhdGEgbWV0YWRhdGEpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuY29tcHJlc3NlZCA9IE9iamVjdHMubm9uTnVsbChtZXRhZGF0YSk7CiAgICAgICAgICAgICB0aGlzLmNvbXByZXNzaW9uTWV0YWRhdGEgPSBtZXRhZGF0YTsKICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CkBAIC0zMDYsNiArMzAzLDE4IEBACiAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIG1tYXBwZWQoQ29uZmlnLkRpc2tBY2Nlc3NNb2RlIGRpc2tBY2Nlc3NNb2RlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm1tYXBwZWQgPSBkaXNrQWNjZXNzTW9kZSA9PSBDb25maWcuRGlza0FjY2Vzc01vZGUubW1hcDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgd2l0aE1tYXBwZWRSZWdpb25zQ2FjaGUoTW1hcHBlZFJlZ2lvbnNDYWNoZSBtbWFwcGVkUmVnaW9uc0NhY2hlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm1tYXBwZWRSZWdpb25zQ2FjaGUgPSBtbWFwcGVkUmVnaW9uc0NhY2hlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKwogICAgICAgICAvKioKICAgICAgICAgICogU2V0IHRoZSBidWZmZXIgc2l6ZSB0byB1c2UgKGlmIGFwcHJvcHJpYXRlKS4KICAgICAgICAgICoKQEAgLTMzMSwxMjggKzM0MCw5NyBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIENvbXBsZXRlIGJ1aWxkaW5nIHtAbGluayBGaWxlSGFuZGxlfSB3aXRob3V0IG92ZXJyaWRpbmcgZmlsZSBsZW5ndGguCisgICAgICAgICAqIE92ZXJyaWRlIHRoZSBmaWxlIGxlbmd0aC4KICAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjY29tcGxldGUobG9uZykKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBGaWxlSGFuZGxlIGNvbXBsZXRlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlKC0xTCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29tcGxldGUgYnVpbGRpbmcge0BsaW5rIEZpbGVIYW5kbGV9IHdpdGggdGhlIGdpdmVuIGxlbmd0aCwgd2hpY2ggb3ZlcnJpZGVzIHRoZSBmaWxlIGxlbmd0aC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIG92ZXJyaWRlTGVuZ3RoIE92ZXJyaWRlIGZpbGUgbGVuZ3RoIChpbiBieXRlcykgc28gdGhhdCByZWFkIGNhbm5vdCBnbyBmdXJ0aGVyIHRoYW4gdGhpcyB2YWx1ZS4KKyAgICAgICAgICogQHBhcmFtIGxlbmd0aE92ZXJyaWRlIE92ZXJyaWRlIGZpbGUgbGVuZ3RoIChpbiBieXRlcykgc28gdGhhdCByZWFkIGNhbm5vdCBnbyBmdXJ0aGVyIHRoYW4gdGhpcyB2YWx1ZS4KICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMCwgdGhlbiB0aGUgdmFsdWUgaXMgaWdub3JlZC4KICAgICAgICAgICogQHJldHVybiBCdWlsdCBmaWxlCiAgICAgICAgICAqLwotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQotICAgICAgICBwdWJsaWMgRmlsZUhhbmRsZSBjb21wbGV0ZShsb25nIG92ZXJyaWRlTGVuZ3RoKQorICAgICAgICBwdWJsaWMgQnVpbGRlciB3aXRoTGVuZ3RoT3ZlcnJpZGUobG9uZyBsZW5ndGhPdmVycmlkZSkKICAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBjaGFubmVsT3BlbmVkID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoY2hhbm5lbCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KHBhdGgpOwotICAgICAgICAgICAgICAgIGNoYW5uZWxPcGVuZWQgPSB0cnVlOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5sZW5ndGhPdmVycmlkZSA9IGxlbmd0aE92ZXJyaWRlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KIAotICAgICAgICAgICAgQ2hhbm5lbFByb3h5IGNoYW5uZWxDb3B5ID0gY2hhbm5lbC5zaGFyZWRDb3B5KCk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb21wbGV0ZSBidWlsZGluZyB7QGxpbmsgRmlsZUhhbmRsZX0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRmlsZUhhbmRsZSBjb21wbGV0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZShDaGFubmVsUHJveHk6Om5ldyk7CisgICAgICAgIH0KKworICAgICAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKKyAgICAgICAgcHVibGljIEZpbGVIYW5kbGUgY29tcGxldGUoRnVuY3Rpb248RmlsZSwgQ2hhbm5lbFByb3h5PiBjaGFubmVsUHJveHlGYWN0b3J5KQorICAgICAgICB7CisgICAgICAgICAgICBDaGFubmVsUHJveHkgY2hhbm5lbCA9IG51bGw7CisgICAgICAgICAgICBNbWFwcGVkUmVnaW9ucyByZWdpb25zID0gbnVsbDsKKyAgICAgICAgICAgIENvbXByZXNzaW9uTWV0YWRhdGEgY29tcHJlc3Npb25NZXRhZGF0YSA9IG51bGw7CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoY29tcHJlc3NlZCAmJiBjb21wcmVzc2lvbk1ldGFkYXRhID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uTWV0YWRhdGEgPSBDb21wcmVzc2lvbk1ldGFkYXRhLmNyZWF0ZShjaGFubmVsQ29weS5maWxlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICBjb21wcmVzc2lvbk1ldGFkYXRhID0gdGhpcy5jb21wcmVzc2lvbk1ldGFkYXRhICE9IG51bGwgPyB0aGlzLmNvbXByZXNzaW9uTWV0YWRhdGEuc2hhcmVkQ29weSgpIDogbnVsbDsKKyAgICAgICAgICAgICAgICBjaGFubmVsID0gY2hhbm5lbFByb3h5RmFjdG9yeS5hcHBseShmaWxlKTsKIAotICAgICAgICAgICAgICAgIGxvbmcgbGVuZ3RoID0gb3ZlcnJpZGVMZW5ndGggPiAwID8gb3ZlcnJpZGVMZW5ndGggOiBjb21wcmVzc2VkID8gY29tcHJlc3Npb25NZXRhZGF0YS5jb21wcmVzc2VkRmlsZUxlbmd0aCA6IGNoYW5uZWxDb3B5LnNpemUoKTsKKyAgICAgICAgICAgICAgICBsb25nIGZpbGVMZW5ndGggPSAoY29tcHJlc3Npb25NZXRhZGF0YSAhPSBudWxsKSA/IGNvbXByZXNzaW9uTWV0YWRhdGEuY29tcHJlc3NlZEZpbGVMZW5ndGggOiBjaGFubmVsLnNpemUoKTsKKyAgICAgICAgICAgICAgICBsb25nIGxlbmd0aCA9IGxlbmd0aE92ZXJyaWRlID4gMCA/IGxlbmd0aE92ZXJyaWRlIDogZmlsZUxlbmd0aDsKIAogICAgICAgICAgICAgICAgIFJlYnVmZmVyZXJGYWN0b3J5IHJlYnVmZmVyZXJGYWN0b3J5OwotICAgICAgICAgICAgICAgIGlmIChtbWFwcGVkKQorICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21wcmVzc2VkKQorICAgICAgICAgICAgICAgICAgICByZWJ1ZmZlcmVyRmFjdG9yeSA9IG5ldyBFbXB0eVJlYnVmZmVyZXIoY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1tYXBwZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29tcHJlc3Npb25NZXRhZGF0YSAhPSBudWxsKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWdpb25zID0gTW1hcHBlZFJlZ2lvbnMubWFwKGNoYW5uZWxDb3B5LCBjb21wcmVzc2lvbk1ldGFkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYnVmZmVyZXJGYWN0b3J5ID0gbWF5YmVDYWNoZWQobmV3IENvbXByZXNzZWRDaHVua1JlYWRlci5NbWFwKGNoYW5uZWxDb3B5LCBjb21wcmVzc2lvbk1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9ucykpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9ucyA9IG1tYXBwZWRSZWdpb25zQ2FjaGUgIT0gbnVsbCA/IG1tYXBwZWRSZWdpb25zQ2FjaGUuZ2V0T3JDcmVhdGUoY2hhbm5lbCwgY29tcHJlc3Npb25NZXRhZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBNbWFwcGVkUmVnaW9ucy5tYXAoY2hhbm5lbCwgY29tcHJlc3Npb25NZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWJ1ZmZlcmVyRmFjdG9yeSA9IG1heWJlQ2FjaGVkKG5ldyBDb21wcmVzc2VkQ2h1bmtSZWFkZXIuTW1hcChjaGFubmVsLCBjb21wcmVzc2lvbk1ldGFkYXRhLCByZWdpb25zKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVSZWdpb25zKGNoYW5uZWxDb3B5LCBsZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVidWZmZXJlckZhY3RvcnkgPSBuZXcgTW1hcFJlYnVmZmVyZXIoY2hhbm5lbENvcHksIGxlbmd0aCwgcmVnaW9ucy5zaGFyZWRDb3B5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9ucyA9IG1tYXBwZWRSZWdpb25zQ2FjaGUgIT0gbnVsbCA/IG1tYXBwZWRSZWdpb25zQ2FjaGUuZ2V0T3JDcmVhdGUoY2hhbm5lbCwgbGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1tYXBwZWRSZWdpb25zLm1hcChjaGFubmVsLCBsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVidWZmZXJlckZhY3RvcnkgPSBuZXcgTW1hcFJlYnVmZmVyZXIoY2hhbm5lbCwgbGVuZ3RoLCByZWdpb25zKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZWdpb25zID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXByZXNzZWQpCisgICAgICAgICAgICAgICAgICAgIGlmIChjb21wcmVzc2lvbk1ldGFkYXRhICE9IG51bGwpCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYnVmZmVyZXJGYWN0b3J5ID0gbWF5YmVDYWNoZWQobmV3IENvbXByZXNzZWRDaHVua1JlYWRlci5TdGFuZGFyZChjaGFubmVsQ29weSwgY29tcHJlc3Npb25NZXRhZGF0YSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVidWZmZXJlckZhY3RvcnkgPSBtYXliZUNhY2hlZChuZXcgQ29tcHJlc3NlZENodW5rUmVhZGVyLlN0YW5kYXJkKGNoYW5uZWwsIGNvbXByZXNzaW9uTWV0YWRhdGEpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaHVua1NpemUgPSBEaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3kucm91bmRGb3JDYWNoaW5nKGJ1ZmZlclNpemUsIENodW5rQ2FjaGUucm91bmRVcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWJ1ZmZlcmVyRmFjdG9yeSA9IG1heWJlQ2FjaGVkKG5ldyBTaW1wbGVDaHVua1JlYWRlcihjaGFubmVsQ29weSwgbGVuZ3RoLCBidWZmZXJUeXBlLCBjaHVua1NpemUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYnVmZmVyZXJGYWN0b3J5ID0gbWF5YmVDYWNoZWQobmV3IFNpbXBsZUNodW5rUmVhZGVyKGNoYW5uZWwsIGxlbmd0aCwgYnVmZmVyVHlwZSwgY2h1bmtTaXplKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ2xlYW51cCBjbGVhbnVwID0gbmV3IENsZWFudXAoY2hhbm5lbENvcHksIHJlYnVmZmVyZXJGYWN0b3J5LCBjb21wcmVzc2lvbk1ldGFkYXRhLCBjaHVua0NhY2hlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVIYW5kbGUoY2xlYW51cCwgY2hhbm5lbENvcHksIHJlYnVmZmVyZXJGYWN0b3J5LCBjb21wcmVzc2lvbk1ldGFkYXRhLCBsZW5ndGgpOworICAgICAgICAgICAgICAgIENsZWFudXAgY2xlYW51cCA9IG5ldyBDbGVhbnVwKGNoYW5uZWwsIHJlYnVmZmVyZXJGYWN0b3J5LCBjb21wcmVzc2lvbk1ldGFkYXRhLCBjaHVua0NhY2hlKTsKKworICAgICAgICAgICAgICAgIEZpbGVIYW5kbGUgZmlsZUhhbmRsZSA9IG5ldyBGaWxlSGFuZGxlKGNsZWFudXAsIGNoYW5uZWwsIHJlYnVmZmVyZXJGYWN0b3J5LCBjb21wcmVzc2lvbk1ldGFkYXRhLCBsZW5ndGgpOworICAgICAgICAgICAgICAgIHJldHVybiBmaWxlSGFuZGxlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYW5uZWxDb3B5LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxPcGVuZWQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDaGFubmVsUHJveHkgYyA9IGNoYW5uZWw7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLmNsZWFuZWQoYy5jbG9zZSh0KSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFRocm93YWJsZXMuY2xvc2VOb25OdWxsQW5kQWRkU3VwcHJlc3NlZCh0LCByZWdpb25zLCBjaGFubmVsLCBjb21wcmVzc2lvbk1ldGFkYXRhKTsKICAgICAgICAgICAgICAgICB0aHJvdyB0OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIFRocm93YWJsZSBjbG9zZShUaHJvd2FibGUgYWNjdW11bGF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFjb21wcmVzc2VkICYmIHJlZ2lvbnMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBhY2N1bXVsYXRlID0gcmVnaW9ucy5jbG9zZShhY2N1bXVsYXRlKTsKLSAgICAgICAgICAgIGlmIChjaGFubmVsICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWwuY2xvc2UoYWNjdW11bGF0ZSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXliZUZhaWwoY2xvc2UobnVsbCkpOwotICAgICAgICB9Ci0KICAgICAgICAgcHJpdmF0ZSBSZWJ1ZmZlcmVyRmFjdG9yeSBtYXliZUNhY2hlZChDaHVua1JlYWRlciByZWFkZXIpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChjaHVua0NhY2hlICE9IG51bGwgJiYgY2h1bmtDYWNoZS5jYXBhY2l0eSgpID4gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gY2h1bmtDYWNoZS5tYXliZVdyYXAocmVhZGVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2h1bmtDYWNoZS53cmFwKHJlYWRlcik7CiAgICAgICAgICAgICByZXR1cm4gcmVhZGVyOwogICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJlZ2lvbnMoQ2hhbm5lbFByb3h5IGNoYW5uZWwsIGxvbmcgbGVuZ3RoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocmVnaW9ucyAhPSBudWxsICYmICFyZWdpb25zLmlzVmFsaWQoY2hhbm5lbCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGhyb3dhYmxlIGVyciA9IHJlZ2lvbnMuY2xvc2UobnVsbCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkZhaWxlZCB0byBjbG9zZSBtYXBwZWQgcmVnaW9ucyIsIGVycik7Ci0KLSAgICAgICAgICAgICAgICByZWdpb25zID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZWdpb25zID0gTW1hcHBlZFJlZ2lvbnMubWFwKGNoYW5uZWwsIGxlbmd0aCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmVnaW9ucy5leHRlbmQobGVuZ3RoKTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIihwYXRoPSciICsgcGF0aCgpICsgJ1wnJyArCisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIocGF0aD0nIiArIGZpbGUoKSArICdcJycgKwogICAgICAgICAgICAgICAgIiwgbGVuZ3RoPSIgKyByZWJ1ZmZlcmVyRmFjdG9yeS5maWxlTGVuZ3RoKCkgKwogICAgICAgICAgICAgICAgJyknOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRmlsZUlucHV0U3RyZWFtUGx1cy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9GaWxlSW5wdXRTdHJlYW1QbHVzLmphdmEKaW5kZXggNzllODQzOC4uMmJkNTdhOSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9GaWxlSW5wdXRTdHJlYW1QbHVzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9GaWxlSW5wdXRTdHJlYW1QbHVzLmphdmEKQEAgLTI3LDM3ICsyNywyOSBAQAogcHVibGljIGNsYXNzIEZpbGVJbnB1dFN0cmVhbVBsdXMgZXh0ZW5kcyBSZWJ1ZmZlcmluZ0lucHV0U3RyZWFtCiB7CiAgICAgZmluYWwgRmlsZUNoYW5uZWwgY2hhbm5lbDsKKyAgICBwdWJsaWMgZmluYWwgRmlsZSBmaWxlOwogCiAgICAgcHVibGljIEZpbGVJbnB1dFN0cmVhbVBsdXMoU3RyaW5nIGZpbGUpIHRocm93cyBOb1N1Y2hGaWxlRXhjZXB0aW9uCiAgICAgewogICAgICAgICB0aGlzKG5ldyBGaWxlKGZpbGUpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgRmlsZUlucHV0U3RyZWFtUGx1cyhGaWxlIGZpbGUpIHRocm93cyBOb1N1Y2hGaWxlRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aGlzKGZpbGUubmV3UmVhZENoYW5uZWwoKSk7Ci0gICAgfQotCiAgICAgcHVibGljIEZpbGVJbnB1dFN0cmVhbVBsdXMoUGF0aCBwYXRoKSB0aHJvd3MgTm9TdWNoRmlsZUV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgdGhpcyhQYXRoVXRpbHMubmV3UmVhZENoYW5uZWwocGF0aCkpOworICAgICAgICB0aGlzKG5ldyBGaWxlKHBhdGgpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgRmlsZUlucHV0U3RyZWFtUGx1cyhQYXRoIHBhdGgsIGludCBidWZmZXJTaXplKSB0aHJvd3MgTm9TdWNoRmlsZUV4Y2VwdGlvbgorICAgIHB1YmxpYyBGaWxlSW5wdXRTdHJlYW1QbHVzKEZpbGUgZmlsZSkgdGhyb3dzIE5vU3VjaEZpbGVFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIHRoaXMoUGF0aFV0aWxzLm5ld1JlYWRDaGFubmVsKHBhdGgpLCBidWZmZXJTaXplKTsKKyAgICAgICAgdGhpcyhmaWxlLCAxIDw8IDE0KTsKICAgICB9CiAKLSAgICBwcml2YXRlIEZpbGVJbnB1dFN0cmVhbVBsdXMoRmlsZUNoYW5uZWwgY2hhbm5lbCkKLSAgICB7Ci0gICAgICAgIHRoaXMoY2hhbm5lbCwgMSA8PCAxNCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWxlSW5wdXRTdHJlYW1QbHVzKEZpbGVDaGFubmVsIGNoYW5uZWwsIGludCBidWZmZXJTaXplKQorICAgIHB1YmxpYyBGaWxlSW5wdXRTdHJlYW1QbHVzKEZpbGUgZmlsZSwgaW50IGJ1ZmZlclNpemUpIHRocm93cyBOb1N1Y2hGaWxlRXhjZXB0aW9uCiAgICAgewogICAgICAgICBzdXBlcihCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KGJ1ZmZlclNpemUpKTsKLSAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDsKKyAgICAgICAgdGhpcy5jaGFubmVsID0gZmlsZS5uZXdSZWFkQ2hhbm5lbCgpOwogICAgICAgICB0aGlzLmJ1ZmZlci5saW1pdCgwKTsKKyAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRmlsZVN0b3JlVXRpbHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRmlsZVN0b3JlVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTQ1NWJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9GaWxlU3RvcmVVdGlscy5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlU3RvcmU7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworCitwdWJsaWMgY2xhc3MgRmlsZVN0b3JlVXRpbHMKK3sKKyAgICAvKioKKyAgICAgKiBUcnkgYW5kIGdldCB0aGUgdG90YWwgc3BhY2Ugb2YgdGhlIGdpdmVuIGZpbGVzdG9yZQorICAgICAqIEByZXR1cm4gbG9uZyB2YWx1ZSBvZiBhdmFpbGFibGUgc3BhY2UgaWYgbm8gZXJyb3JzCisgICAgICogICAgICAgICBMb25nLk1BWF9WQUxVRSBpZiBvbiBhIGxhcmdlIGZpbGUgc3lzdGVtIHRoYXQgb3ZlcmZsb3dzCisgICAgICogICAgICAgICAwIG9uIGV4Y2VwdGlvbiBkdXJpbmcgSU9Ub0xvbmdGdW5jdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyB0cnlHZXRTcGFjZShGaWxlU3RvcmUgZmlsZXN0b3JlLCBQYXRoVXRpbHMuSU9Ub0xvbmdGdW5jdGlvbjxGaWxlU3RvcmU+IGdldFNwYWNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRyeUdldFNwYWNlKGZpbGVzdG9yZSwgZ2V0U3BhY2UsIGlnbm9yZSAtPiB7fSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBsb25nIHRyeUdldFNwYWNlKEZpbGVTdG9yZSBmaWxlc3RvcmUsIFBhdGhVdGlscy5JT1RvTG9uZ0Z1bmN0aW9uPEZpbGVTdG9yZT4gZ2V0U3BhY2UsIENvbnN1bWVyPElPRXhjZXB0aW9uPiBvckVsc2UpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUxhcmdlRmlsZVN5c3RlbShnZXRTcGFjZS5hcHBseShmaWxlc3RvcmUpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgb3JFbHNlLmFjY2VwdChlKTsKKyAgICAgICAgICAgIHJldHVybiAwTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByaXZhdGUgY29uc3RydWN0b3IgYXMgdGhlIGNsYXNzIGNvbnRhaW5zIG9ubHkgc3RhdGljIG1ldGhvZHMuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlU3RvcmVVdGlscygpCisgICAgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZSBsYXJnZSBmaWxlIHN5c3RlbSBieSByZXR1cm5pbmcge0Bjb2RlIExvbmcuTUFYX1ZBTFVFfSB3aGVuIHRoZSBzaXplIG92ZXJmbG93cy4KKyAgICAgKiBAcGFyYW0gc2l6ZSByZXR1cm5lZCBieSB0aGUgSmF2YSdzIEZpbGVTdG9yZSBtZXRob2RzCisgICAgICogQHJldHVybiB0aGUgc2l6ZSBvciB7QGNvZGUgTG9uZy5NQVhfVkFMVUV9IGlmIHRoZSBzaXplIHdhcyBiaWdnZXIgdGhhbiB7QGNvZGUgTG9uZy5NQVhfVkFMVUV9CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBoYW5kbGVMYXJnZUZpbGVTeXN0ZW0obG9uZyBzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNpemUgPCAwID8gTG9uZy5NQVhfVkFMVUUgOiBzaXplOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRmlsZVV0aWxzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0ZpbGVVdGlscy5qYXZhCmluZGV4IDAxZjFmMTguLjlkOGVmYzcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRmlsZVV0aWxzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9GaWxlVXRpbHMuamF2YQpAQCAtNTEsOSArNTEsOCBAQAogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5SYXRlTGltaXRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7Ci0KK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuUmF0ZUxpbWl0ZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIApAQCAtNjQsNyArNjMsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpWTVN0YWJpbGl0eUluc3BlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5TeW5jVXRpbDsKIAotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXMucHJvcGFnYXRlOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkpBVkFfSU9fVE1QRElSOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzLm1heWJlRmFpbDsKIApAQCAtMjEwLDkgKzIwOCwxNCBAQAogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUhhcmRMaW5rV2l0aG91dENvbmZpcm0oU3RyaW5nIGZyb20sIFN0cmluZyB0bykKICAgICB7CisgICAgICAgIGNyZWF0ZUhhcmRMaW5rV2l0aG91dENvbmZpcm0obmV3IEZpbGUoZnJvbSksIG5ldyBGaWxlKHRvKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUhhcmRMaW5rV2l0aG91dENvbmZpcm0oRmlsZSBmcm9tLCBGaWxlIHRvKQorICAgIHsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIGNyZWF0ZUhhcmRMaW5rKG5ldyBGaWxlKGZyb20pLCBuZXcgRmlsZSh0bykpOworICAgICAgICAgICAgY3JlYXRlSGFyZExpbmsoZnJvbSwgdG8pOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChGU1dyaXRlRXJyb3IgZnNlKQogICAgICAgICB7CkBAIC0yMjMsOSArMjI2LDE0IEBACiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weVdpdGhPdXRDb25maXJtKFN0cmluZyBmcm9tLCBTdHJpbmcgdG8pCiAgICAgeworICAgICAgICBjb3B5V2l0aE91dENvbmZpcm0obmV3IEZpbGUoZnJvbSksIG5ldyBGaWxlKHRvKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlXaXRoT3V0Q29uZmlybShGaWxlIGZyb20sIEZpbGUgdG8pCisgICAgewogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgRmlsZXMuY29weShGaWxlLmdldFBhdGgoZnJvbSksIEZpbGUuZ2V0UGF0aCh0bykpOworICAgICAgICAgICAgRmlsZXMuY29weShmcm9tLnRvUGF0aCgpLCB0by50b1BhdGgoKSk7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKQEAgLTQ3OCw3ICs0ODYsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBoYW5kbGVGU0Vycm9yQW5kUHJvcGFnYXRlKEZTRXJyb3IgZSkKICAgICB7CiAgICAgICAgIEpWTVN0YWJpbGl0eUluc3BlY3Rvci5pbnNwZWN0VGhyb3dhYmxlKGUpOwotICAgICAgICB0aHJvdyBwcm9wYWdhdGUoZSk7CisgICAgICAgIHRocm93IGU7CiAgICAgfQogCiAgICAgLyoqCkBAIC03OTAsNCArNzk4LDQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0xpbWl0aW5nUmVidWZmZXJlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9MaW1pdGluZ1JlYnVmZmVyZXIuamF2YQppbmRleCBiNWM3ZjM0Li5iY2JmMmVmIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0xpbWl0aW5nUmVidWZmZXJlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvTGltaXRpbmdSZWJ1ZmZlcmVyLmphdmEKQEAgLTIwLDMwICsyMCwyOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWw7CiAKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uY29uY3VycmVudC5Ob3RUaHJlYWRTYWZlOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5JbnRzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5SYXRlTGltaXRlcjsKIAogLyoqCiAgKiBSZWJ1ZmZlcmVyIHdyYXBwZXIgdGhhdCBhcHBsaWVzIHJhdGUgbGltaXRpbmcuCi0gKgorICogPHA+CiAgKiBJbnN0YW50aWF0ZWQgb25jZSBwZXIgUmFuZG9tQWNjZXNzUmVhZGVyLCB0aHJlYWQtdW5zYWZlLgogICogVGhlIGluc3RhbmNlcyByZXVzZSB0aGVtc2VsdmVzIGFzIHRoZSBCdWZmZXJIb2xkZXIgdG8gYXZvaWQgaGF2aW5nIHRvIHJldHVybiBhIG5ldyBvYmplY3QgZm9yIGVhY2ggcmVidWZmZXIgY2FsbC4KKyAqIE9ubHkgb25lIEJ1ZmZlckhvbGRlciBjYW4gYmUgYWN0aXZlIGF0IGEgdGltZS4gQ2FsbGluZyB7QGxpbmsgI3JlYnVmZmVyKGxvbmcpfSBiZWZvcmUgdGhlIHByZXZpb3VzbHkgb2J0YWluZWQKKyAqIGJ1ZmZlciBob2xkZXIgaXMgcmVsZWFzZWQgd2lsbCB0aHJvdyB7QGxpbmsgQXNzZXJ0aW9uRXJyb3J9LgogICovCi1wdWJsaWMgY2xhc3MgTGltaXRpbmdSZWJ1ZmZlcmVyIGltcGxlbWVudHMgUmVidWZmZXJlciwgUmVidWZmZXJlci5CdWZmZXJIb2xkZXIKK0BOb3RUaHJlYWRTYWZlCitwdWJsaWMgY2xhc3MgTGltaXRpbmdSZWJ1ZmZlcmVyIGV4dGVuZHMgV3JhcHBpbmdSZWJ1ZmZlcmVyCiB7Ci0gICAgZmluYWwgcHJpdmF0ZSBSZWJ1ZmZlcmVyIHdyYXBwZWQ7CiAgICAgZmluYWwgcHJpdmF0ZSBSYXRlTGltaXRlciBsaW1pdGVyOwogICAgIGZpbmFsIHByaXZhdGUgaW50IGxpbWl0UXVhbnQ7CiAKLSAgICBwcml2YXRlIEJ1ZmZlckhvbGRlciBidWZmZXJIb2xkZXI7Ci0gICAgcHJpdmF0ZSBCeXRlQnVmZmVyIGJ1ZmZlcjsKLSAgICBwcml2YXRlIGxvbmcgb2Zmc2V0OwotCiAgICAgcHVibGljIExpbWl0aW5nUmVidWZmZXJlcihSZWJ1ZmZlcmVyIHdyYXBwZWQsIFJhdGVMaW1pdGVyIGxpbWl0ZXIsIGludCBsaW1pdFF1YW50KQogICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsKKyAgICAgICAgc3VwZXIod3JhcHBlZCk7CiAgICAgICAgIHRoaXMubGltaXRlciA9IGxpbWl0ZXI7CiAgICAgICAgIHRoaXMubGltaXRRdWFudCA9IGxpbWl0UXVhbnQ7CiAgICAgfQpAQCAtNTEsOSArNDksNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBCdWZmZXJIb2xkZXIgcmVidWZmZXIobG9uZyBwb3NpdGlvbikKICAgICB7Ci0gICAgICAgIGJ1ZmZlckhvbGRlciA9IHdyYXBwZWQucmVidWZmZXIocG9zaXRpb24pOwotICAgICAgICBidWZmZXIgPSBidWZmZXJIb2xkZXIuYnVmZmVyKCk7Ci0gICAgICAgIG9mZnNldCA9IGJ1ZmZlckhvbGRlci5vZmZzZXQoKTsKKyAgICAgICAgc3VwZXIucmVidWZmZXIocG9zaXRpb24pOwogICAgICAgICBpbnQgcG9zSW5CdWZmZXIgPSBJbnRzLmNoZWNrZWRDYXN0KHBvc2l0aW9uIC0gb2Zmc2V0KTsKICAgICAgICAgaW50IHJlbWFpbmluZyA9IGJ1ZmZlci5saW1pdCgpIC0gcG9zSW5CdWZmZXI7CiAgICAgICAgIGlmIChyZW1haW5pbmcgPT0gMCkKQEAgLTY5LDU4ICs2NSw4IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENoYW5uZWxQcm94eSBjaGFubmVsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmNoYW5uZWwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBmaWxlTGVuZ3RoKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmZpbGVMZW5ndGgoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZG91YmxlIGdldENyY0NoZWNrQ2hhbmNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENyY0NoZWNrQ2hhbmNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKQotICAgIHsKLSAgICAgICAgd3JhcHBlZC5jbG9zZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlUmVhZGVyKCkKLSAgICB7Ci0gICAgICAgIHdyYXBwZWQuY2xvc2VSZWFkZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKICAgICB7CiAgICAgICAgIHJldHVybiAiTGltaXRpbmdSZWJ1ZmZlcmVyWyIgKyBsaW1pdGVyICsgIl06IiArIHdyYXBwZWQ7CiAgICAgfQotCi0gICAgLy8gQnVmZmVySG9sZGVyIG1ldGhvZHMKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCeXRlQnVmZmVyIGJ1ZmZlcigpCi0gICAgewotICAgICAgICByZXR1cm4gYnVmZmVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIG9mZnNldCgpCi0gICAgewotICAgICAgICByZXR1cm4gb2Zmc2V0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKQotICAgIHsKLSAgICAgICAgYnVmZmVySG9sZGVyLnJlbGVhc2UoKTsKLSAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9NbWFwcGVkUmVnaW9ucy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9NbWFwcGVkUmVnaW9ucy5qYXZhCmluZGV4IDBiN2RkMzkuLmJlNjQ2NTQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvTW1hcHBlZFJlZ2lvbnMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL01tYXBwZWRSZWdpb25zLmphdmEKQEAgLTM2LDE4ICszNiwyNSBAQAogCiBwdWJsaWMgY2xhc3MgTW1hcHBlZFJlZ2lvbnMgZXh0ZW5kcyBTaGFyZWRDbG9zZWFibGVJbXBsCiB7Ci0gICAgLyoqIEluIGEgcGVyZmVjdCB3b3JsZCwgTUFYX1NFR01FTlRfU0laRSB3b3VsZCBiZSBmaW5hbCwgYnV0IHdlIG5lZWQgdG8gdGVzdCB3aXRoIGEgc21hbGxlciBzaXplICovCisgICAgLyoqCisgICAgICogSW4gYSBwZXJmZWN0IHdvcmxkLCBNQVhfU0VHTUVOVF9TSVpFIHdvdWxkIGJlIGZpbmFsLCBidXQgd2UgbmVlZCB0byB0ZXN0IHdpdGggYSBzbWFsbGVyIHNpemUKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBNQVhfU0VHTUVOVF9TSVpFID0gSW50ZWdlci5NQVhfVkFMVUU7CiAKLSAgICAvKiogV2hlbiB3ZSBuZWVkIHRvIGdyb3cgdGhlIGFycmF5cywgd2UgYWRkIHRoaXMgbnVtYmVyIG9mIHJlZ2lvbiBzbG90cyAqLworICAgIC8qKgorICAgICAqIFdoZW4gd2UgbmVlZCB0byBncm93IHRoZSBhcnJheXMsIHdlIGFkZCB0aGlzIG51bWJlciBvZiByZWdpb24gc2xvdHMKKyAgICAgKi8KICAgICBzdGF0aWMgZmluYWwgaW50IFJFR0lPTl9BTExPQ19TSVpFID0gMTU7CiAKLSAgICAvKiogVGhlIG9yaWdpbmFsIHN0YXRlLCB3aGljaCBpcyBzaGFyZWQgd2l0aCB0aGUgdGlkaWVyIGFuZAorICAgIC8qKgorICAgICAqIFRoZSBvcmlnaW5hbCBzdGF0ZSwgd2hpY2ggaXMgc2hhcmVkIHdpdGggdGhlIHRpZGllciBhbmQKICAgICAgKiBjb250YWlucyBhbGwgdGhlIHJlZ2lvbnMgbWFwcGVkIHNvIGZhci4gSXQgYWxzbwotICAgICAqIGRvZXMgdGhlIGFjdHVhbCBtYXBwaW5nLiAqLworICAgICAqIGRvZXMgdGhlIGFjdHVhbCBtYXBwaW5nLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgU3RhdGUgc3RhdGU7CiAKLSAgICAvKiogQSBjb3B5IG9mIHRoZSBsYXRlc3Qgc3RhdGUuIFdlIHVwZGF0ZSB0aGlzIGVhY2ggdGltZSB0aGUgb3JpZ2luYWwgc3RhdGUgaXMKKyAgICAvKioKKyAgICAgKiBBIGNvcHkgb2YgdGhlIGxhdGVzdCBzdGF0ZS4gV2UgdXBkYXRlIHRoaXMgZWFjaCB0aW1lIHRoZSBvcmlnaW5hbCBzdGF0ZSBpcwogICAgICAqIHVwZGF0ZWQgYW5kIHdlIHNoYXJlIHRoaXMgd2l0aCBjb3BpZXMuIElmIHdlIGFyZSBhIGNvcHksIHRoZW4gdGhpcwogICAgICAqIGlzIG51bGwuIENvcGllcyBjYW4gb25seSBhY2Nlc3MgZXhpc3RpbmcgcmVnaW9ucywgdGhleSBjYW5ub3QgY3JlYXRlCiAgICAgICogbmV3IG9uZXMuIFRoaXMgaXMgZm9yIHRocmVhZCBzYWZldHkgYW5kIGJlY2F1c2UgTW1hcHBlZFJlZ2lvbnMgaXMKQEAgLTkyLDcgKzk5LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAcGFyYW0gY2hhbm5lbCBmaWxlIHRvIG1hcC4gdGhlIE1tYXBwZWRSZWdpb25zIGluc3RhbmNlIHdpbGwgaG9sZCBzaGFyZWQgY29weSBvZiBnaXZlbiBjaGFubmVsLgorICAgICAqIEBwYXJhbSBjaGFubmVsICBmaWxlIHRvIG1hcC4gdGhlIE1tYXBwZWRSZWdpb25zIGluc3RhbmNlIHdpbGwgaG9sZCBzaGFyZWQgY29weSBvZiBnaXZlbiBjaGFubmVsLgogICAgICAqIEBwYXJhbSBtZXRhZGF0YQogICAgICAqIEByZXR1cm4gbmV3IGluc3RhbmNlCiAgICAgICovCkBAIC0xMjYsNyArMTMzLDEyIEBACiAgICAgICAgIHJldHVybiBjb3B5ID09IG51bGw7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgZXh0ZW5kKGxvbmcgbGVuZ3RoKQorICAgIC8qKgorICAgICAqIEV4dGVuZHMgdGhpcyBjb2xsZWN0aW9uIG9mIG1tYXBwZWQgcmVnaW9ucyB1cCB0byB0aGUgcHJvdmlkZWQgdG90YWwgbGVuZ3RoLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgbmV3IHJlZ2lvbnMgaGF2ZSBiZWVuIGNyZWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBleHRlbmQobG9uZyBsZW5ndGgpCiAgICAgewogICAgICAgICBpZiAobGVuZ3RoIDwgMCkKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxlbmd0aCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSIpOwpAQCAtMTM0LDEyICsxNDYsNDEgQEAKICAgICAgICAgYXNzZXJ0ICFpc0NvcHkoKSA6ICJDb3BpZXMgY2Fubm90IGJlIGV4dGVuZGVkIjsKIAogICAgICAgICBpZiAobGVuZ3RoIDw9IHN0YXRlLmxlbmd0aCkKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAorICAgICAgICBpbnQgaW5pdGlhbFJlZ2lvbnMgPSBzdGF0ZS5sYXN0OwogICAgICAgICB1cGRhdGVTdGF0ZShsZW5ndGgpOwogICAgICAgICBjb3B5ID0gbmV3IFN0YXRlKHN0YXRlKTsKKyAgICAgICAgcmV0dXJuIHN0YXRlLmxhc3QgPiBpbml0aWFsUmVnaW9uczsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBFeHRlbmRzIHRoaXMgY29sbGVjdGlvbiBvZiBtbWFwcGVkIHJlZ2lvbnMgdXAgdG8gdGhlIGxlbmd0aCBvZiB0aGUgY29tcHJlc3NlZCBmaWxlIGRlc2NyaWJlZCBieSB0aGUgcHJvdmlkZWQKKyAgICAgKiBtZXRhZGF0YS4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIG5ldyByZWdpb25zIGhhdmUgYmVlbiBjcmVhdGVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXh0ZW5kKENvbXByZXNzaW9uTWV0YWRhdGEgY29tcHJlc3Npb25NZXRhZGF0YSkKKyAgICB7CisgICAgICAgIGFzc2VydCAhaXNDb3B5KCkgOiAiQ29waWVzIGNhbm5vdCBiZSBleHRlbmRlZCI7CisKKyAgICAgICAgaWYgKGNvbXByZXNzaW9uTWV0YWRhdGEuY29tcHJlc3NlZEZpbGVMZW5ndGggPD0gc3RhdGUubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGludCBpbml0aWFsUmVnaW9ucyA9IHN0YXRlLmxhc3Q7CisgICAgICAgIGlmIChjb21wcmVzc2lvbk1ldGFkYXRhLmNvbXByZXNzZWRGaWxlTGVuZ3RoIC0gc3RhdGUubGVuZ3RoIDw9IE1BWF9TRUdNRU5UX1NJWkUpCisgICAgICAgICAgICB1cGRhdGVTdGF0ZShjb21wcmVzc2lvbk1ldGFkYXRhLmNvbXByZXNzZWRGaWxlTGVuZ3RoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdXBkYXRlU3RhdGUoY29tcHJlc3Npb25NZXRhZGF0YSk7CisKKyAgICAgICAgY29weSA9IG5ldyBTdGF0ZShzdGF0ZSk7CisgICAgICAgIHJldHVybiBzdGF0ZS5sYXN0ID4gaW5pdGlhbFJlZ2lvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlcyBzdGF0ZSBieSBhZGRpbmcgdGhlIHJlbWFpbmluZyBzZWdtZW50cy4gSXQgc3RhcnRzIHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgbGFzdCBzZWdtZW50IGVuZCBwb3NpdGlvbiBhbmQKKyAgICAgKiBzdWJzZXF1ZW50bHkgYWRkIG5ldyBzZWdtZW50cyB1bnRpbCBhbGwgZGF0YSB1cCB0byB0aGUgcHJvdmlkZWQgbGVuZ3RoIGFyZSBtYXBwZWQuCisgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0YXRlKGxvbmcgbGVuZ3RoKQogICAgIHsKICAgICAgICAgc3RhdGUubGVuZ3RoID0gbGVuZ3RoOwpAQCAtMTU0LDggKzE5NSw4IEBACiAKICAgICBwcml2YXRlIHZvaWQgdXBkYXRlU3RhdGUoQ29tcHJlc3Npb25NZXRhZGF0YSBtZXRhZGF0YSkKICAgICB7Ci0gICAgICAgIGxvbmcgb2Zmc2V0ID0gMDsKLSAgICAgICAgbG9uZyBsYXN0U2VnbWVudE9mZnNldCA9IDA7CisgICAgICAgIGxvbmcgbGFzdFNlZ21lbnRPZmZzZXQgPSBzdGF0ZS5nZXRQb3NpdGlvbigpOworICAgICAgICBsb25nIG9mZnNldCA9IG1ldGFkYXRhLmdldERhdGFPZmZzZXRGb3JDaHVua09mZnNldChsYXN0U2VnbWVudE9mZnNldCk7CiAgICAgICAgIGxvbmcgc2VnbWVudFNpemUgPSAwOwogCiAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBtZXRhZGF0YS5kYXRhTGVuZ3RoKQpAQCAtMTk4LDcgKzIzOSw3IEBACiAgICAgICAgIGFzc2VydCAhaXNDbGVhbmVkVXAoKSA6ICJBdHRlbXB0ZWQgdG8gdXNlIGNsb3NlZCByZWdpb24iOwogICAgICAgICByZXR1cm4gc3RhdGUuZmxvb3IocG9zaXRpb24pOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIGNsb3NlUXVpZXRseSgpCiAgICAgewogICAgICAgICBUaHJvd2FibGUgZXJyID0gY2xvc2UobnVsbCk7CkBAIC0yNDUsMTkgKzI4NiwyOSBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU3RhdGUKICAgICB7Ci0gICAgICAgIC8qKiBUaGUgZmlsZSBjaGFubmVsICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZmlsZSBjaGFubmVsCisgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIGZpbmFsIENoYW5uZWxQcm94eSBjaGFubmVsOwogCi0gICAgICAgIC8qKiBBbiBhcnJheSBvZiByZWdpb24gYnVmZmVycywgc3luY2hyb25pemVkIHdpdGggb2Zmc2V0cyAqLworICAgICAgICAvKioKKyAgICAgICAgICogQW4gYXJyYXkgb2YgcmVnaW9uIGJ1ZmZlcnMsIHN5bmNocm9uaXplZCB3aXRoIG9mZnNldHMKKyAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgQnl0ZUJ1ZmZlcltdIGJ1ZmZlcnM7CiAKLSAgICAgICAgLyoqIEFuIGFycmF5IG9mIHJlZ2lvbiBvZmZzZXRzLCBzeW5jaHJvbml6ZWQgd2l0aCBidWZmZXJzICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiBhcnJheSBvZiByZWdpb24gb2Zmc2V0cywgc3luY2hyb25pemVkIHdpdGggYnVmZmVycworICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBsb25nW10gb2Zmc2V0czsKIAotICAgICAgICAvKiogVGhlIG1heGltdW0gZmlsZSBsZW5ndGggd2UgaGF2ZSBtYXBwZWQgKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBtYXhpbXVtIGZpbGUgbGVuZ3RoIHdlIGhhdmUgbWFwcGVkCisgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIGxvbmcgbGVuZ3RoOwogCi0gICAgICAgIC8qKiBUaGUgaW5kZXggdG8gdGhlIGxhc3QgcmVnaW9uIGFkZGVkICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgaW5kZXggdG8gdGhlIGxhc3QgcmVnaW9uIGFkZGVkCisgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIGludCBsYXN0OwogCiAgICAgICAgIHByaXZhdGUgU3RhdGUoQ2hhbm5lbFByb3h5IGNoYW5uZWwpCkBAIC0yOTIsNyArMzQzLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgYXNzZXJ0IDAgPD0gcG9zaXRpb24gJiYgcG9zaXRpb24gPD0gbGVuZ3RoIDogU3RyaW5nLmZvcm1hdCgiJWQgPiAlZCIsIHBvc2l0aW9uLCBsZW5ndGgpOwogCi0gICAgICAgICAgICBpbnQgaWR4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChvZmZzZXRzLCAwLCBsYXN0ICsxLCBwb3NpdGlvbik7CisgICAgICAgICAgICBpbnQgaWR4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChvZmZzZXRzLCAwLCBsYXN0ICsgMSwgcG9zaXRpb24pOwogICAgICAgICAgICAgYXNzZXJ0IGlkeCAhPSAtMSA6IFN0cmluZy5mb3JtYXQoIkJhZCBwb3NpdGlvbiAlZCBmb3IgcmVnaW9ucyAlcywgbGFzdCAlZCBpbiAlcyIsIHBvc2l0aW9uLCBBcnJheXMudG9TdHJpbmcob2Zmc2V0cyksIGxhc3QsIGNoYW5uZWwpOwogICAgICAgICAgICAgaWYgKGlkeCA8IDApCiAgICAgICAgICAgICAgICAgaWR4ID0gLShpZHggKyAyKTsgLy8gcm91bmQgZG93biB0byBlbnRyeSBhdCBpbnNlcnRpb24gcG9pbnQKQEAgLTM2Miw1ICs0MTMsNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL01tYXBwZWRSZWdpb25zQ2FjaGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvTW1hcHBlZFJlZ2lvbnNDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNjg3YWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL01tYXBwZWRSZWdpb25zQ2FjaGUuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLmNvbmN1cnJlbnQuTm90VGhyZWFkU2FmZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkNvbXByZXNzaW9uTWV0YWRhdGE7CisKKy8qKgorICogSXQgaXMgYSB1dGlsaXR5IGNsYXNzIGZvciBjYWNoaW5nIHtAbGluayBNbWFwcGVkUmVnaW9uc30gcHJpbWFyaWx5IHVzZWQgYnkgYSB7QGxpbmsgRmlsZUhhbmRsZS5CdWlsZGVyfSB3aGVuIGEgaGFuZGxlCisgKiB0byB0aGUgc2FtZSBmaWxlIGlzIGNyZWF0ZWQgbXVsdGlwbGUgdGltZXMgKGFzIHdoZW4gYW4gc3N0YWJsZSBpcyBvcGVuZWQgZWFybHkpLgorICovCitATm90VGhyZWFkU2FmZQorcHVibGljIGNsYXNzIE1tYXBwZWRSZWdpb25zQ2FjaGUgaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlCit7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8RmlsZSwgTW1hcHBlZFJlZ2lvbnM+IGNhY2hlID0gbmV3IEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIExvb2tzIGZvciBtbWFwcGVkIHJlZ2lvbnMgaW4gY2FjaGUuIElmIGZvdW5kLCBhIHNoYXJlZCBjb3B5IGlzIGNyZWF0ZWQgYW5kIGV4dGVuZGVkIHRvIHRoZSBwcm92aWRlZCBsZW5ndGguCisgICAgICogSWYgbW1hcHBlZCByZWdpb25zIGRvIG5vdCBleGlzdCB5ZXQgZm9yIHRoZSBwcm92aWRlZCBrZXksIHRoZXkgYXJlIGNyZWF0ZWQgYW5kIGEgc2hhcmVkIGNvcHkgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hhbm5lbCBjaGFubmVsIGZvciB3aGljaCB0aGUgbW1hcHBlZCByZWdpb25zIGFyZSByZXF1ZXN0ZWQKKyAgICAgKiBAcGFyYW0gbGVuZ3RoICBsZW5ndGggb2YgdGhlIGZpbGUKKyAgICAgKiBAcmV0dXJuIGEgc2hhcmVkIGNvcHkgb2YgdGhlIGNhY2hlZCBtbWFwcGVkIHJlZ2lvbnMKKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQorICAgIHB1YmxpYyBNbWFwcGVkUmVnaW9ucyBnZXRPckNyZWF0ZShDaGFubmVsUHJveHkgY2hhbm5lbCwgbG9uZyBsZW5ndGgpCisgICAgeworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrU3RhdGUoIWNsb3NlZCk7CisgICAgICAgIE1tYXBwZWRSZWdpb25zIHJlZ2lvbnMgPSBjYWNoZS5jb21wdXRlSWZBYnNlbnQoY2hhbm5lbC5maWxlKCksIGlnbm9yZWQgLT4gTW1hcHBlZFJlZ2lvbnMubWFwKGNoYW5uZWwsIGxlbmd0aCkpOworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQocmVnaW9ucy5pc1ZhbGlkKGNoYW5uZWwpKTsKKyAgICAgICAgcmVnaW9ucy5leHRlbmQobGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHJlZ2lvbnMuc2hhcmVkQ29weSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvb2tzIGZvciBtbWFwcGVkIHJlZ2lvbnMgaW4gY2FjaGUuIElmIGZvdW5kLCBhIHNoYXJlZCBjb3B5IGlzIGNyZWF0ZWQgYW5kIGV4dGVuZGVkIGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQgbWV0YWRhdGEuCisgICAgICogSWYgbW1hcHBlZCByZWdpb25zIGRvIG5vdCBleGlzdCB5ZXQgZm9yIHRoZSBwcm92aWRlZCBrZXksIHRoZXkgYXJlIGNyZWF0ZWQgYW5kIGEgc2hhcmVkIGNvcHkgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hhbm5lbCBjaGFubmVsIGZvciB3aGljaCB0aGUgbW1hcHBlZCByZWdpb25zIGFyZSByZXF1ZXN0ZWQKKyAgICAgKiBAcGFyYW0gbWV0YWRhdGEgY29tcHJlc3Npb24gbWV0YWRhdGEgb2YgdGhlIGZpbGUKKyAgICAgKiBAcmV0dXJuIGEgc2hhcmVkIGNvcHkgb2YgdGhlIGNhY2hlZCBtbWFwcGVkIHJlZ2lvbnMKKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQorICAgIHB1YmxpYyBNbWFwcGVkUmVnaW9ucyBnZXRPckNyZWF0ZShDaGFubmVsUHJveHkgY2hhbm5lbCwgQ29tcHJlc3Npb25NZXRhZGF0YSBtZXRhZGF0YSkKKyAgICB7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZSghY2xvc2VkKTsKKyAgICAgICAgTW1hcHBlZFJlZ2lvbnMgcmVnaW9ucyA9IGNhY2hlLmNvbXB1dGVJZkFic2VudChjaGFubmVsLmZpbGUoKSwgaWdub3JlZCAtPiBNbWFwcGVkUmVnaW9ucy5tYXAoY2hhbm5lbCwgbWV0YWRhdGEpKTsKKyAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50KHJlZ2lvbnMuaXNWYWxpZChjaGFubmVsKSk7CisgICAgICAgIHJlZ2lvbnMuZXh0ZW5kKG1ldGFkYXRhKTsKKyAgICAgICAgcmV0dXJuIHJlZ2lvbnMuc2hhcmVkQ29weSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgIHsKKyAgICAgICAgY2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgSXRlcmF0b3I8TW1hcHBlZFJlZ2lvbnM+IGl0ID0gY2FjaGUudmFsdWVzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgTW1hcHBlZFJlZ2lvbnMgcmVnaW9uID0gaXQubmV4dCgpOworICAgICAgICAgICAgcmVnaW9uLmNsb3NlUXVpZXRseSgpOworICAgICAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1BhZ2VBd2FyZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9QYWdlQXdhcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWJhOGUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9QYWdlQXdhcmUuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBQYWdlQXdhcmUKK3sKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQUdFX1NJWkUgPSA0MDk2OyAvLyBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFHRV9TSVpFX1NISUZUID0gSW50ZWdlci5udW1iZXJPZlRyYWlsaW5nWmVyb3MoUEFHRV9TSVpFKTsKKworICAgIC8qKgorICAgICAqIENhbGN1bGF0ZSB0aGUgZW5kIG9mIHRoZSBwYWdlIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHBvc2l0aW9uLgorICAgICAqIEVxdWl2YWxlbnQgdG8gZmxvb3IoZHN0UG9zIC8gUEFHRV9TSVpFICsgMSkgKiBQQUdFX1NJWkUuCisgICAgICogPHA+CisgICAgICogV2hlbiB0aGUgYXJndW1lbnQgaXMgZXF1YWwgdG8gdGhlIHBhZ2UgYm91bmRhcnksIHJldHVybnMgdGhlIG5leHQgcGFnZSBib3VuZGFyeS4gRS5nLiBwYWdlTGltaXQoMCkgPT0gUEFHRV9TSVpFLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBwYWdlTGltaXQobG9uZyBkc3RQb3MpCisgICAgeworICAgICAgICByZXR1cm4gKGRzdFBvcyB8IChQQUdFX1NJWkUgLSAxKSkgKyAxOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGN1bGF0ZSB0aGUgc3RhcnQgb2YgdGhlIHBhZ2UgdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gcG9zaXRpb24uCisgICAgICogRXF1aXZhbGVudCB0byBmbG9vcihkc3RQb3MgLyBQQUdFX1NJWkUpICogUEFHRV9TSVpFLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBwYWdlU3RhcnQobG9uZyBkc3RQb3MpCisgICAgeworICAgICAgICByZXR1cm4gZHN0UG9zICYgLVBBR0VfU0laRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxjdWxhdGUgdGhlIGVhcmxpZXN0IHBhZ2UgYm91bmRhcnkgZm9yIHRoZSBnaXZlbiBwb3NpdGlvbi4KKyAgICAgKiBFcXVpdmFsZW50IHRvIGNlaWwoZHN0UG9zIC8gUEFHRV9TSVpFKSAqIFBBR0VfU0laRS4KKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIHRoZSBhcmd1bWVudCBpcyBlcXVhbCB0byBhIHBhZ2UgYm91bmRhcnksIHJldHVybnMgdGhlIGFyZ3VtZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBwYWRkZWQobG9uZyBkc3RQb3MpCisgICAgeworICAgICAgICByZXR1cm4gcGFnZVN0YXJ0KGRzdFBvcyArIFBBR0VfU0laRSAtIDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGxlZnQgaW4gdGhpcyBwYWdlLgorICAgICAqIEVxdWl2YWxlbnQgdG8gcGFnZUxpbWl0KHBvc2l0aW9uKSAtIHBvc2l0aW9uLgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdGhlIGFyZ3VtZW50IGlzIGVxdWFsIHRvIGEgcGFnZSBib3VuZGFyeSwgcmV0dXJucyBQQUdFX1NJWkUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgYnl0ZXNMZWZ0SW5QYWdlKGxvbmcgZHN0UG9zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFBBR0VfU0laRSAtIChpbnQpIChkc3RQb3MgJiAoUEFHRV9TSVpFIC0gMSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHBhZ2VzIHRoYXQgZml0IGluIHRoZSBnaXZlbiBzaXplLCByb3VuZGVkIHVwIHRvIGEgcGFnZSBpZiB0aGUgc2l6ZSBpcyBub3QgYW4gZXhhY3QgbXVsdGlwbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSB0aGF0IG5lZWRzIHRvIGNvdmVyIGEgbnVtYmVyIG9mIHBhZ2VzCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHBhZ2VzLCByb3VuZGVkIHVwCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgbnVtUGFnZXMoaW50IHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gKHNpemUgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NJWkVfU0hJRlQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgYSBudW1iZXIgb2YgcGFnZXMsIGRldGVybWluZSB0aGUgZXhhY3QgcGFnZSBudW1iZXIgdGhpcworICAgICAqIHBvc2l0aW9uIGZhbGxzIGludG8uIEZvciBleGFtcGxlLCBwb3NpdGlvbnMgZnJvbSAwIHRvIHtAbGluayAjUEFHRV9TSVpFfSAtMSB3aWxsIGZhbGwgaW50byBwYWdlIHplcm8KKyAgICAgKiBhbmQgc28gZm9ydGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHN0UG9zIHRoZSBwb3NpdGlvbgorICAgICAqIEByZXR1cm4gdGhlIHBhZ2UgbnVtYmVyLCBpbmRleGVkIGF0IHplcm8KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBwYWdlTnVtKGxvbmcgZHN0UG9zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1hdGgudG9JbnRFeGFjdChkc3RQb3MgPj4gUEFHRV9TSVpFX1NISUZUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWQgdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0gd2l0aCB6ZXJvZXMgdW50aWwgdGhlIG5leHQgcGFnZSBib3VuZGFyeS4KKyAgICAgKiBJZiB0aGUgZGVzdGluYXRpb24gcG9zaXRpb24gaXMgYWxyZWFkeSBhdCBhIHBhZ2UgYm91bmRhcnksIGRvIG5vdCBkbyBhbnl0aGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcGFkKERhdGFPdXRwdXRQbHVzIGRlc3QpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbG9uZyBwb3NpdGlvbiA9IGRlc3QucG9zaXRpb24oKTsKKyAgICAgICAgbG9uZyBieXRlc0xlZnQgPSBwYWRkZWQocG9zaXRpb24pIC0gcG9zaXRpb247CisgICAgICAgIC8vIGJ5dGVzTGVmdCBpcyBwcm92YWJseSB3aXRoaW4gWzAsIHBhZ2VTaXplIC0gMV0KKyAgICAgICAgZGVzdC53cml0ZShFbXB0eVBhZ2UuRU1QVFlfUEFHRSwgMCwgKGludCkgYnl0ZXNMZWZ0KTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgRW1wdHlQYWdlCisgICAgeworICAgICAgICBzdGF0aWMgZmluYWwgYnl0ZVtdIEVNUFRZX1BBR0UgPSBuZXcgYnl0ZVtQQUdFX1NJWkVdOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1BhdGhVdGlscy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9QYXRoVXRpbHMuamF2YQppbmRleCA0YjNlZmRiLi4wMjc3NDJmIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1BhdGhVdGlscy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvUGF0aFV0aWxzLmphdmEKQEAgLTU4LDcgKzU4LDcgQEAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFBhdGhVdGlscwogewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gY29uc2lzdGVudERpcmVjdG9yeUxpc3RpbmdzID0gQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkRFVEVSTUlOSVNNX0NPTlNJU1RFTlRfRElSRUNUT1JZX0xJU1RJTkdTLmdldEJvb2xlYW4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGNvbnNpc3RlbnREaXJlY3RvcnlMaXN0aW5ncyA9IENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DT05TSVNURU5UX0RJUkVDVE9SWV9MSVNUSU5HUy5nZXRCb29sZWFuKCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RhbmRhcmRPcGVuT3B0aW9uPiBSRUFEX09QVElPTlMgPSB1bm1vZGlmaWFibGVTZXQoRW51bVNldC5vZihSRUFEKSk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0YW5kYXJkT3Blbk9wdGlvbj4gV1JJVEVfT1BUSU9OUyA9IHVubW9kaWZpYWJsZVNldChFbnVtU2V0Lm9mKFdSSVRFLCBDUkVBVEUsIFRSVU5DQVRFX0VYSVNUSU5HKSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1JlYnVmZmVyaW5nSW5wdXRTdHJlYW0uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvUmVidWZmZXJpbmdJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDE4Y2FiZDMuLmI3YWUyMDUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvUmVidWZmZXJpbmdJbnB1dFN0cmVhbS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvUmVidWZmZXJpbmdJbnB1dFN0cmVhbS5qYXZhCkBAIC0yMSwxMyArMjEsMTMgQEAKIGltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7CiAKIGltcG9ydCBuZXQubmljb3VsYWouY29tcGlsZWNvbW1hbmQuYW5ub3RhdGlvbnMuRG9udElubGluZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXMuRGF0YUlucHV0U3RyZWFtUGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GYXN0Qnl0ZU9wZXJhdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMudmludC5WSW50Q29kaW5nOwogCkBAIC0zNiwxMCArMzYsMTAgQEAKIC8qKgogICogUm91Z2ggZXF1aXZhbGVudCBvZiBCdWZmZXJlZElucHV0U3RyZWFtIGFuZCBEYXRhSW5wdXRTdHJlYW0gd3JhcHBpbmcgYSBCeXRlQnVmZmVyIHRoYXQgY2FuIGJlIHJlZmlsbGVkCiAgKiB2aWEgcmVidWZmZXIuIEltcGxlbWVudGF0aW9ucyBwcm92aWRlIHRoaXMgYnVmZmVyIGZyb20gdmFyaW91cyBjaGFubmVscyAoc29ja2V0LCBmaWxlLCBtZW1vcnksIGV0YykuCi0gKgorICogPHA+CiAgKiBSZWJ1ZmZlcmluZ0lucHV0U3RyZWFtIGlzIG5vdCB0aHJlYWQgc2FmZS4KICAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlYnVmZmVyaW5nSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSBpbXBsZW1lbnRzIERhdGFJbnB1dFBsdXMsIENsb3NlYWJsZQorcHVibGljIGFic3RyYWN0IGNsYXNzIFJlYnVmZmVyaW5nSW5wdXRTdHJlYW0gZXh0ZW5kcyBEYXRhSW5wdXRTdHJlYW1QbHVzIGltcGxlbWVudHMgRGF0YUlucHV0UGx1cywgQ2xvc2VhYmxlCiB7CiAgICAgcHJvdGVjdGVkIEJ5dGVCdWZmZXIgYnVmZmVyOwogCkBAIC0yMzEsMTEgKzIzMSwxOSBAQAogICAgICAgICAgICAgcmV0dXJuIHJlYWRQcmltaXRpdmVTbG93bHkoOCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGxvbmcgcmVhZFZJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIHJldHVybiBWSW50Q29kaW5nLmRlY29kZVppZ1phZzY0KHJlYWRVbnNpZ25lZFZJbnQoKSk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCByZWFkVkludDMyKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gVkludENvZGluZy5jaGVja2VkQ2FzdChWSW50Q29kaW5nLmRlY29kZVppZ1phZzY0KHJlYWRVbnNpZ25lZFZJbnQoKSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBsb25nIHJlYWRVbnNpZ25lZFZJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIC8vSWYgOSBieXRlcyBhcmVuJ3QgYXZhaWxhYmxlIHVzZSB0aGUgc2xvdyBwYXRoIGluIFZJbnRDb2RpbmcKQEAgLTI2OCw2ICsyNzYsMTIgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHJlYWRVbnNpZ25lZFZJbnQzMigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIFZJbnRDb2RpbmcuY2hlY2tlZENhc3QocmVhZFVuc2lnbmVkVkludCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmxvYXQgcmVhZEZsb2F0KCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBpZiAoYnVmZmVyLnJlbWFpbmluZygpID49IDQpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1NlcXVlbnRpYWxXcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvU2VxdWVudGlhbFdyaXRlci5qYXZhCmluZGV4IDQzMWVjZTMuLmNiNzBhYWMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvU2VxdWVudGlhbFdyaXRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvU2VxdWVudGlhbFdyaXRlci5qYXZhCkBAIC0zNyw2ICszNyw3IEBACiB7CiAgICAgLy8gYWJzb2x1dGUgcGF0aCB0byB0aGUgZ2l2ZW4gZmlsZQogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZpbGVQYXRoOworICAgIHByaXZhdGUgZmluYWwgRmlsZSBmaWxlOwogCiAgICAgLy8gT2Zmc2V0IGZvciBzdGFydCBvZiBidWZmZXIgcmVsYXRpdmUgdG8gdW5kZXJseWluZyBmaWxlCiAgICAgcHJvdGVjdGVkIGxvbmcgYnVmZmVyT2Zmc2V0OwpAQCAtODMsMTYgKzg0LDE5IEBACiAgICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0ZTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb1ByZXBhcmUoKQogICAgICAgICB7CiAgICAgICAgICAgICBzeW5jSW50ZXJuYWwoKTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgVGhyb3dhYmxlIGRvQ29tbWl0KFRocm93YWJsZSBhY2N1bXVsYXRlKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0ZTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgVGhyb3dhYmxlIGRvQWJvcnQoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlOwpAQCAtMTYyLDEyICsxNjYsMTMgQEAKICAgICAgICAgdGhpcy5zdHJpY3RGbHVzaGluZyA9IHN0cmljdEZsdXNoaW5nOwogICAgICAgICB0aGlzLmZjaGFubmVsID0gKEZpbGVDaGFubmVsKWNoYW5uZWw7CiAKKyAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKICAgICAgICAgdGhpcy5maWxlUGF0aCA9IGZpbGUuYWJzb2x1dGVQYXRoKCk7CiAKICAgICAgICAgdGhpcy5vcHRpb24gPSBvcHRpb247CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2tpcEJ5dGVzKGludCBudW1CeXRlcykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgcHVibGljIHZvaWQgc2tpcEJ5dGVzKGxvbmcgbnVtQnl0ZXMpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgZmx1c2goKTsKICAgICAgICAgZmNoYW5uZWwucG9zaXRpb24oZmNoYW5uZWwucG9zaXRpb24oKSArIG51bUJ5dGVzKTsKQEAgLTI1MCwxNiArMjU1LDQyIEBACiAgICAgICAgICAgICBydW5Qb3N0Rmx1c2gucnVuKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaGFzUG9zaXRpb24oKQogICAgIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGxvbmcgcG9zaXRpb24oKQogICAgIHsKICAgICAgICAgcmV0dXJuIGN1cnJlbnQoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IG1heEJ5dGVzSW5QYWdlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBQYWdlQXdhcmUuUEFHRV9TSVpFOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHBhZFRvUGFnZUJvdW5kYXJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBQYWdlQXdhcmUucGFkKHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgYnl0ZXNMZWZ0SW5QYWdlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBQYWdlQXdhcmUuYnl0ZXNMZWZ0SW5QYWdlKHBvc2l0aW9uKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIHBhZGRlZFBvc2l0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBQYWdlQXdhcmUucGFkZGVkKHBvc2l0aW9uKCkpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgZmlsZSBwb2ludGVyIG9mIHRoZSB1bmRlcmx5aW5nIG9uLWRpc2sgZmlsZS4KICAgICAgKiBOb3RlIHRoYXQgc2luY2Ugd3JpdGUgd29ya3MgYnkgYnVmZmVyaW5nIGRhdGEsIHRoZSB2YWx1ZSBvZiB0aGlzIHdpbGwgaW5jcmVhc2UgYnkgYnVmZmVyCkBAIC0yOTYsNiArMzI3LDExIEBACiAgICAgICAgIHJldHVybiBmaWxlUGF0aDsKICAgICB9CiAKKyAgICBwdWJsaWMgRmlsZSBnZXRGaWxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmaWxlOworICAgIH0KKwogICAgIHByb3RlY3RlZCB2b2lkIHJlc2V0QnVmZmVyKCkKICAgICB7CiAgICAgICAgIGJ1ZmZlck9mZnNldCA9IGN1cnJlbnQoKTsKQEAgLTM3MywxNiArNDA5LDE5IEBACiAgICAgICAgIHJldHVybiBjaGFubmVsLmlzT3BlbigpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHByZXBhcmVUb0NvbW1pdCgpCiAgICAgewogICAgICAgICB0eG5Qcm94eS5wcmVwYXJlVG9Db21taXQoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmluYWwgVGhyb3dhYmxlIGNvbW1pdChUaHJvd2FibGUgYWNjdW11bGF0ZSkKICAgICB7CiAgICAgICAgIHJldHVybiB0eG5Qcm94eS5jb21taXQoYWNjdW11bGF0ZSk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIFRocm93YWJsZSBhYm9ydChUaHJvd2FibGUgYWNjdW11bGF0ZSkKICAgICB7CiAgICAgICAgIHJldHVybiB0eG5Qcm94eS5hYm9ydChhY2N1bXVsYXRlKTsKQEAgLTQyOCw0ICs0NjcsNCBAQAogICAgICAgICAgICAgdGhpcy5wb2ludGVyID0gcG9pbnRlcjsKICAgICAgICAgfQogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1NpbXBsZUNodW5rUmVhZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1NpbXBsZUNodW5rUmVhZGVyLmphdmEKaW5kZXggMDVmZGI2Yi4uOGQwMGNlNSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9TaW1wbGVDaHVua1JlYWRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvU2ltcGxlQ2h1bmtSZWFkZXIuamF2YQpAQCAtNTcsNyArNTcsMTAgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgUmVidWZmZXJlciBpbnN0YW50aWF0ZVJlYnVmZmVyZXIoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJNYW5hZ2luZ1JlYnVmZmVyZXIuVW5hbGlnbmVkKHRoaXMpOworICAgICAgICBpZiAoSW50ZWdlci5iaXRDb3VudChidWZmZXJTaXplKSA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJNYW5hZ2luZ1JlYnVmZmVyZXIuQWxpZ25lZCh0aGlzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJNYW5hZ2luZ1JlYnVmZmVyZXIuVW5hbGlnbmVkKHRoaXMpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNjksNCArNzIsNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTGVuZ3RoKCkpOwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1NpemVkSW50cy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9TaXplZEludHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMThlMWYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9TaXplZEludHMuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIHNpemluZywgd3JpdGluZyBhbmQgcmVhZGluZyBpbnRzIHdpdGggbGVuZ3RoIHN0b3JlZCBzZXBhcmF0ZWx5LgorICogVXNlZCBmb3IgdHJpZSBwYXlsb2Fkcy4KKyAqLworcHVibGljIGNsYXNzIFNpemVkSW50cworeworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3ZSBuZWVkIHRvIHN0b3JlIHRoZSBnaXZlbiBwb3NpdGlvbi4KKyAgICAgKiBUaGlzIG1ldGhvZCB1bmRlcnN0YW5kcyAwIHRvIG5lZWQgMSBieXRlLgorICAgICAqIDxwPgorICAgICAqIElmIHlvdXIgdXNlIGNhc2UgcGVybWl0cyAwIHRvIGJlIGVuY29kZWQgaW4gMCBsZW5ndGgsIHVzZSB7QGxpbmsgI3NpemVBbGxvd2luZ1plcm99IGJlbG93LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IG5vblplcm9TaXplKGxvbmcgdmFsdWUpCisgICAgeworICAgICAgICBpZiAodmFsdWUgPCAwKQorICAgICAgICAgICAgdmFsdWUgPSB+dmFsdWU7CisgICAgICAgIGludCBseiA9IExvbmcubnVtYmVyT2ZMZWFkaW5nWmVyb3ModmFsdWUpOyAgICAgICAvLyAxIDw9IGx6IDw9IDY0CisgICAgICAgIHJldHVybiAoNjQgLSBseiArIDEgKyA3KSAvIDg7ICAgLy8gc2lnbmlmaWNhbnQgYml0cywgKzEgZm9yIHNpZ24sIHJvdW5kZWQgdXAuIEF0IGxlYXN0IDEsIGF0IG1vc3QgOC4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgbmVlZCB0byBzdG9yZSB0aGUgZ2l2ZW4gcG9zaXRpb24uIFJldHVybnMgMCBmb3IgMCBhcmd1bWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBzaXplQWxsb3dpbmdaZXJvKGxvbmcgdmFsdWUpCisgICAgeworICAgICAgICBpZiAodmFsdWUgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gbm9uWmVyb1NpemUodmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyByZWFkKEJ5dGVCdWZmZXIgc3JjLCBpbnQgc3RhcnRQb3MsIGludCBieXRlcykKKyAgICB7CisgICAgICAgIHN3aXRjaCAoYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3JjLmdldChzdGFydFBvcyk7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNyYy5nZXRTaG9ydChzdGFydFBvcyk7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9uZyBoaWdoID0gc3JjLmdldChzdGFydFBvcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChoaWdoIDw8IDE2TCkgfCAoc3JjLmdldFNob3J0KHN0YXJ0UG9zICsgMSkgJiAweEZGRkZMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3JjLmdldEludChzdGFydFBvcyk7CisgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9uZyBoaWdoID0gc3JjLmdldChzdGFydFBvcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChoaWdoIDw8IDMyTCkgfCAoc3JjLmdldEludChzdGFydFBvcyArIDEpICYgMHhGRkZGRkZGRkwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvbmcgaGlnaCA9IHNyYy5nZXRTaG9ydChzdGFydFBvcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChoaWdoIDw8IDMyTCkgfCAoc3JjLmdldEludChzdGFydFBvcyArIDIpICYgMHhGRkZGRkZGRkwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvbmcgaGlnaCA9IHNyYy5nZXQoc3RhcnRQb3MpOworICAgICAgICAgICAgICAgIGhpZ2ggPSAoaGlnaCA8PCAxNkwpIHwgKHNyYy5nZXRTaG9ydChzdGFydFBvcyArIDEpICYgMHhGRkZGTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChoaWdoIDw8IDMyTCkgfCAoc3JjLmdldEludChzdGFydFBvcyArIDMpICYgMHhGRkZGRkZGRkwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgIHJldHVybiBzcmMuZ2V0TG9uZyhzdGFydFBvcyk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBsb25nIHJlYWRVbnNpZ25lZChCeXRlQnVmZmVyIHNyYywgaW50IHN0YXJ0UG9zLCBpbnQgYnl0ZXMpCisgICAgeworICAgICAgICBpZiAoYnl0ZXMgPT0gOCkKKyAgICAgICAgICAgIHJldHVybiBzcmMuZ2V0TG9uZyhzdGFydFBvcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiByZWFkKHNyYywgc3RhcnRQb3MsIGJ5dGVzKSAmICgoMUwgPDwgKGJ5dGVzICogOCkpIC0gMSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlKERhdGFPdXRwdXRQbHVzIGRlc3QsIGxvbmcgdmFsdWUsIGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRlc3Qud3JpdGVNb3N0U2lnbmlmaWNhbnRCeXRlcyh2YWx1ZSA8PCAoKDggLSBzaXplKSAqIDgpLCBzaXplKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9UYWlsT3ZlcnJpZGluZ1JlYnVmZmVyZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvVGFpbE92ZXJyaWRpbmdSZWJ1ZmZlcmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZiN2VkMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvVGFpbE92ZXJyaWRpbmdSZWJ1ZmZlcmVyLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbDsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5jb25jdXJyZW50Lk5vdFRocmVhZFNhZmU7CisKKy8qKgorICogU3BlY2lhbCByZWJ1ZmZlcmVyIHRoYXQgcmVwbGFjZXMgdGhlIHRhaWwgb2YgdGhlIGZpbGUgKGZyb20gdGhlIHNwZWNpZmllZCBjdXRvZmYgcG9pbnQpIHdpdGggdGhlIGdpdmVuIGJ1ZmZlci4KKyAqIDxwPgorICogSW5zdGFudGlhdGVkIG9uY2UgcGVyIFJhbmRvbUFjY2Vzc1JlYWRlciwgdGhyZWFkLXVuc2FmZS4KKyAqIFRoZSBpbnN0YW5jZXMgcmV1c2UgdGhlbXNlbHZlcyBhcyB0aGUgQnVmZmVySG9sZGVyIHRvIGF2b2lkIGhhdmluZyB0byByZXR1cm4gYSBuZXcgb2JqZWN0IGZvciBlYWNoIHJlYnVmZmVyIGNhbGwuCisgKiBPbmx5IG9uZSBCdWZmZXJIb2xkZXIgY2FuIGJlIGFjdGl2ZSBhdCBhIHRpbWUuIENhbGxpbmcge0BsaW5rICNyZWJ1ZmZlcihsb25nKX0gYmVmb3JlIHRoZSBwcmV2aW91c2x5IG9idGFpbmVkCisgKiBidWZmZXIgaG9sZGVyIGlzIHJlbGVhc2VkIHdpbGwgdGhyb3cge0BsaW5rIEFzc2VydGlvbkVycm9yfS4KKyAqLworQE5vdFRocmVhZFNhZmUKK3B1YmxpYyBjbGFzcyBUYWlsT3ZlcnJpZGluZ1JlYnVmZmVyZXIgZXh0ZW5kcyBXcmFwcGluZ1JlYnVmZmVyZXIKK3sKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgY3V0b2ZmOworICAgIHByaXZhdGUgZmluYWwgQnl0ZUJ1ZmZlciB0YWlsOworCisgICAgcHVibGljIFRhaWxPdmVycmlkaW5nUmVidWZmZXJlcihSZWJ1ZmZlcmVyIHNvdXJjZSwgbG9uZyBjdXRvZmYsIEJ5dGVCdWZmZXIgdGFpbCkKKyAgICB7CisgICAgICAgIHN1cGVyKHNvdXJjZSk7CisgICAgICAgIHRoaXMuY3V0b2ZmID0gY3V0b2ZmOworICAgICAgICB0aGlzLnRhaWwgPSB0YWlsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZWJ1ZmZlcmVyLkJ1ZmZlckhvbGRlciByZWJ1ZmZlcihsb25nIHBvc2l0aW9uKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGJ1ZmZlciA9PSBudWxsIDogIkJ1ZmZlciBob2xkZXIgaGFzIGJlZW4gYWxyZWFkeSBhY3F1aXJlZCBhbmQgaGFzIGJlZW4gbm90IHJlbGVhc2VkIHlldCI7CisgICAgICAgIGlmIChwb3NpdGlvbiA8IGN1dG9mZikKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIucmVidWZmZXIocG9zaXRpb24pOworICAgICAgICAgICAgaWYgKG9mZnNldCArIGJ1ZmZlci5saW1pdCgpID4gY3V0b2ZmKQorICAgICAgICAgICAgICAgIGJ1ZmZlci5saW1pdCgoaW50KSAoY3V0b2ZmIC0gb2Zmc2V0KSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBidWZmZXIgPSB0YWlsLmR1cGxpY2F0ZSgpOworICAgICAgICAgICAgb2Zmc2V0ID0gY3V0b2ZmOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGZpbGVMZW5ndGgoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGN1dG9mZiArIHRhaWwubGltaXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlc1srJWRAJWRdOiVzIiwgZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCksIHRhaWwubGltaXQoKSwgY3V0b2ZmLCB3cmFwcGVkLnRvU3RyaW5nKCkpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1RlZURhdGFJbnB1dFBsdXMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvVGVlRGF0YUlucHV0UGx1cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNmMxY2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1RlZURhdGFJbnB1dFBsdXMuamF2YQpAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsOworCitpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOworCisvKioKKyAqIERhdGFJbnB1dCB0aGF0IGFsc28gc3RvcmVzIHRoZSByYXcgaW5wdXRzIGludG8gYW4gb3V0cHV0IGJ1ZmZlcgorICogVGhpcyBpcyB1c2VmdWwgZm9yIHN0b3Jpbmcgc2VyaWFsaXplZCBidWZmZXJzIGFzIHRoZXkgYXJlIGRlc2VyaWFsaXplZC4KKyAqCisgKiBOb3RlOiBJZiBhIG5vbi16ZXJvIGxpbWl0IGlzIGluY2x1ZGVkIGl0IGlzIGltcG9ydGFudCB0byBmb3IgY2FsbGVycyB0byBjaGVjayB7QGxpbmsgI2lzTGltaXRSZWFjaGVkKCl9CisgKiBiZWZvcmUgdXNpbmcgdGhlIHRlZSBidWZmZXIgYXMgaXQgY291bGQgYmUgY3JvcHBlZC4KKyAqLworcHVibGljIGNsYXNzIFRlZURhdGFJbnB1dFBsdXMgaW1wbGVtZW50cyBEYXRhSW5wdXRQbHVzCit7CisgICAgcHJpdmF0ZSBmaW5hbCBEYXRhSW5wdXRQbHVzIHNvdXJjZTsKKyAgICBwcml2YXRlIGZpbmFsIERhdGFPdXRwdXRQbHVzIHRlZUJ1ZmZlcjsKKworICAgIHByaXZhdGUgZmluYWwgbG9uZyBsaW1pdDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbGltaXRSZWFjaGVkOworCisgICAgcHVibGljIFRlZURhdGFJbnB1dFBsdXMoRGF0YUlucHV0UGx1cyBzb3VyY2UsIERhdGFPdXRwdXRQbHVzIHRlZUJ1ZmZlcikKKyAgICB7CisgICAgICAgIHRoaXMoc291cmNlLCB0ZWVCdWZmZXIsIDApOworICAgIH0KKworICAgIHB1YmxpYyBUZWVEYXRhSW5wdXRQbHVzKERhdGFJbnB1dFBsdXMgc291cmNlLCBEYXRhT3V0cHV0UGx1cyB0ZWVCdWZmZXIsIGxvbmcgbGltaXQpCisgICAgeworICAgICAgICBhc3NlcnQgc291cmNlICE9IG51bGwgJiYgdGVlQnVmZmVyICE9IG51bGw7CisgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOworICAgICAgICB0aGlzLnRlZUJ1ZmZlciA9IHRlZUJ1ZmZlcjsKKyAgICAgICAgdGhpcy5saW1pdCA9IGxpbWl0OworICAgICAgICB0aGlzLmxpbWl0UmVhY2hlZCA9IGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBtYXliZVdyaXRlKGludCBsZW5ndGgsIFRocm93YWJsZXMuRGlzY3JldGVBY3Rpb248SU9FeGNlcHRpb24+IHdyaXRlQWN0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChsaW1pdCA8PSAwIHx8ICghbGltaXRSZWFjaGVkICYmICh0ZWVCdWZmZXIucG9zaXRpb24oKSArIGxlbmd0aCkgPCBsaW1pdCkpCisgICAgICAgICAgICB3cml0ZUFjdGlvbi5wZXJmb3JtKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxpbWl0UmVhY2hlZCA9IHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVhZEZ1bGx5KGJ5dGVbXSBieXRlcykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBzb3VyY2UucmVhZEZ1bGx5KGJ5dGVzKTsKKyAgICAgICAgbWF5YmVXcml0ZShieXRlcy5sZW5ndGgsICgpIC0+IHRlZUJ1ZmZlci53cml0ZShieXRlcykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlYWRGdWxseShieXRlW10gYnl0ZXMsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgc291cmNlLnJlYWRGdWxseShieXRlcywgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICBtYXliZVdyaXRlKGxlbmd0aCwgKCkgLT4gdGVlQnVmZmVyLndyaXRlKGJ5dGVzLCBvZmZzZXQsIGxlbmd0aCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc2tpcEJ5dGVzKGludCBuKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlIHYgPSBzb3VyY2UucmVhZEJ5dGUoKTsKKyAgICAgICAgICAgICAgICBtYXliZVdyaXRlKFR5cGVTaXplcy5CWVRFX1NJWkUsICgpIC0+IHRlZUJ1ZmZlci53cml0ZUJ5dGUodikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEVPRkV4Y2VwdGlvbiBlb2YpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcmVhZEJvb2xlYW4oKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGJvb2xlYW4gdiA9IHNvdXJjZS5yZWFkQm9vbGVhbigpOworICAgICAgICBtYXliZVdyaXRlKFR5cGVTaXplcy5CT09MX1NJWkUsICgpIC0+IHRlZUJ1ZmZlci53cml0ZUJvb2xlYW4odikpOworICAgICAgICByZXR1cm4gdjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYnl0ZSByZWFkQnl0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgYnl0ZSB2ID0gc291cmNlLnJlYWRCeXRlKCk7CisgICAgICAgIG1heWJlV3JpdGUoVHlwZVNpemVzLkJZVEVfU0laRSwgKCkgLT4gdGVlQnVmZmVyLndyaXRlQnl0ZSh2KSk7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgcmVhZFVuc2lnbmVkQnl0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaW50IHYgPSBzb3VyY2UucmVhZFVuc2lnbmVkQnl0ZSgpOworICAgICAgICBtYXliZVdyaXRlKFR5cGVTaXplcy5CWVRFX1NJWkUsICgpIC0+IHRlZUJ1ZmZlci53cml0ZUJ5dGUodikpOworICAgICAgICByZXR1cm4gdjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc2hvcnQgcmVhZFNob3J0KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBzaG9ydCB2ID0gc291cmNlLnJlYWRTaG9ydCgpOworICAgICAgICBtYXliZVdyaXRlKFR5cGVTaXplcy5TSE9SVF9TSVpFLCAoKSAtPiB0ZWVCdWZmZXIud3JpdGVTaG9ydCh2KSk7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgcmVhZFVuc2lnbmVkU2hvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGludCB2ID0gc291cmNlLnJlYWRVbnNpZ25lZFNob3J0KCk7CisgICAgICAgIG1heWJlV3JpdGUoVHlwZVNpemVzLlNIT1JUX1NJWkUsICgpIC0+IHRlZUJ1ZmZlci53cml0ZVNob3J0KHYpKTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGNoYXIgcmVhZENoYXIoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGNoYXIgdiA9IHNvdXJjZS5yZWFkQ2hhcigpOworICAgICAgICBtYXliZVdyaXRlKFR5cGVTaXplcy5CWVRFX1NJWkUsICgpIC0+IHRlZUJ1ZmZlci53cml0ZUNoYXIodikpOworICAgICAgICByZXR1cm4gdjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHJlYWRJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGludCB2ID0gc291cmNlLnJlYWRJbnQoKTsKKyAgICAgICAgbWF5YmVXcml0ZShUeXBlU2l6ZXMuSU5UX1NJWkUsICgpIC0+IHRlZUJ1ZmZlci53cml0ZUludCh2KSk7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIHJlYWRMb25nKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBsb25nIHYgPSBzb3VyY2UucmVhZExvbmcoKTsKKyAgICAgICAgbWF5YmVXcml0ZShUeXBlU2l6ZXMuTE9OR19TSVpFLCAoKSAtPiB0ZWVCdWZmZXIud3JpdGVMb25nKHYpKTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZsb2F0IHJlYWRGbG9hdCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZmxvYXQgdiA9IHNvdXJjZS5yZWFkRmxvYXQoKTsKKyAgICAgICAgbWF5YmVXcml0ZShUeXBlU2l6ZXMuRkxPQVRfU0laRSwgKCkgLT4gdGVlQnVmZmVyLndyaXRlRmxvYXQodikpOworICAgICAgICByZXR1cm4gdjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZG91YmxlIHJlYWREb3VibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRvdWJsZSB2ID0gc291cmNlLnJlYWREb3VibGUoKTsKKyAgICAgICAgbWF5YmVXcml0ZShUeXBlU2l6ZXMuRE9VQkxFX1NJWkUsICgpIC0+IHRlZUJ1ZmZlci53cml0ZURvdWJsZSh2KSk7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgcmVhZExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vVGhpcyBvbmUgaXNuJ3Qgc2FmZSBzaW5jZSB3ZSBrbm93IHRoZSBhY3R1YWwgbGluZSB0ZXJtaW5hdGlvbiB0eXBlCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgcmVhZFVURigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIHYgPSBzb3VyY2UucmVhZFVURigpOworICAgICAgICBtYXliZVdyaXRlKFR5cGVTaXplcy5zaXplb2YodiksICgpIC0+IHRlZUJ1ZmZlci53cml0ZVVURih2KSk7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIHJlYWRWSW50KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBsb25nIHYgPSBzb3VyY2UucmVhZFZJbnQoKTsKKyAgICAgICAgbWF5YmVXcml0ZShUeXBlU2l6ZXMuc2l6ZW9mVkludCh2KSwgKCkgLT4gdGVlQnVmZmVyLndyaXRlVkludCh2KSk7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIHJlYWRVbnNpZ25lZFZJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGxvbmcgdiA9IHNvdXJjZS5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgIG1heWJlV3JpdGUoVHlwZVNpemVzLnNpemVvZlVuc2lnbmVkVkludCh2KSwgKCkgLT4gdGVlQnVmZmVyLndyaXRlVW5zaWduZWRWSW50KHYpKTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2tpcEJ5dGVzRnVsbHkoaW50IG4pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgc291cmNlLnNraXBCeXRlc0Z1bGx5KG4pOworICAgICAgICBtYXliZVdyaXRlKG4sICgpIC0+IHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICAgICAgICAgIHRlZUJ1ZmZlci53cml0ZUJ5dGUoMCk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gZGV0ZWN0IGlmIHRoZSB0ZWVCdWZmZXIgaGl0IHRoZSBzdXBwbGllZCBsaW1pdC4KKyAgICAgKiBJZiB0cnVlIHRoaXMgbWVhbnMgdGhlIHRlZUJ1ZmZlciBkb2VzIG5vdCBjb250YWluIHRoZSBmdWxsIGlucHV0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTGltaXRSZWFjaGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBsaW1pdFJlYWNoZWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9XcmFwcGluZ1JlYnVmZmVyZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvV3JhcHBpbmdSZWJ1ZmZlcmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZiZTVlYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvV3JhcHBpbmdSZWJ1ZmZlcmVyLmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWw7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uY29uY3VycmVudC5Ob3RUaHJlYWRTYWZlOworCisvKioKKyAqIEluc3RhbnRpYXRlZCBvbmNlIHBlciBSYW5kb21BY2Nlc3NSZWFkZXIsIHRocmVhZC11bnNhZmUuCisgKiBUaGUgaW5zdGFuY2VzIHJldXNlIHRoZW1zZWx2ZXMgYXMgdGhlIEJ1ZmZlckhvbGRlciB0byBhdm9pZCBoYXZpbmcgdG8gcmV0dXJuIGEgbmV3IG9iamVjdCBmb3IgZWFjaCByZWJ1ZmZlciBjYWxsLgorICogT25seSBvbmUgYnVmZmVyIGhvbGRlciBjYW4gYmUgYWN0aXZlIGF0IGEgdGltZS4gQ2FsbGluZyB7QGxpbmsgI3JlYnVmZmVyKGxvbmcpfSBiZWZvcmUgdGhlIHByZXZpb3VzbHkgb2J0YWluZWQKKyAqIGJ1ZmZlciBob2xkZXIgaXMgcmVsZWFzZWQgd2lsbCB0aHJvdyB7QGxpbmsgQXNzZXJ0aW9uRXJyb3J9LiBXZSB3aWxsIGdldCB0aGF0IGV4Y2VwdGlvbiBhbHNvIGluIGNhc2Ugd2UgdHJ5IHRvIGNsb3NlCisgKiB0aGUgcmVidWZmZXJlciB3aXRob3V0IGNsb3NpbmcgdGhlIHJlY2VudGx5IG9idGFpbmVkIGJ1ZmZlciBob2xkZXIuCisgKiA8cD4KKyAqIENhbGxpbmcgbWV0aG9kcyBvZiB7QGxpbmsgQnVmZmVySG9sZGVyfSB3aWxsIGFsc28gcHJvZHVjZSB7QGxpbmsgQXNzZXJ0aW9uRXJyb3J9IGlmIGJ1ZmZlciBob2xkZXIgaXMgbm90IGFjcXVpcmVkLgorICogPHA+CisgKiBUaGUgb3ZlcnJpZGluZyBjbGFzc2VzIG11c3QgY29uZm9ybSB0byB0aGUgYWZvcmVtZW50aW9uZWQgcnVsZXMuCisgKi8KK0BOb3RUaHJlYWRTYWZlCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgV3JhcHBpbmdSZWJ1ZmZlcmVyIGltcGxlbWVudHMgUmVidWZmZXJlciwgUmVidWZmZXJlci5CdWZmZXJIb2xkZXIKK3sKKyAgICBwcm90ZWN0ZWQgZmluYWwgUmVidWZmZXJlciB3cmFwcGVkOworCisgICAgcHJvdGVjdGVkIEJ1ZmZlckhvbGRlciBidWZmZXJIb2xkZXI7CisgICAgcHJvdGVjdGVkIEJ5dGVCdWZmZXIgYnVmZmVyOworICAgIHByb3RlY3RlZCBsb25nIG9mZnNldDsKKworICAgIHB1YmxpYyBXcmFwcGluZ1JlYnVmZmVyZXIoUmVidWZmZXJlciB3cmFwcGVkKQorICAgIHsKKyAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVmZmVySG9sZGVyIHJlYnVmZmVyKGxvbmcgcG9zaXRpb24pCisgICAgeworICAgICAgICBhc3NlcnQgYnVmZmVyID09IG51bGw7CisgICAgICAgIGJ1ZmZlckhvbGRlciA9IHdyYXBwZWQucmVidWZmZXIocG9zaXRpb24pOworICAgICAgICBidWZmZXIgPSBidWZmZXJIb2xkZXIuYnVmZmVyKCk7CisgICAgICAgIG9mZnNldCA9IGJ1ZmZlckhvbGRlci5vZmZzZXQoKTsKKworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2hhbm5lbFByb3h5IGNoYW5uZWwoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQuY2hhbm5lbCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGZpbGVMZW5ndGgoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQuZmlsZUxlbmd0aCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBkb3VibGUgZ2V0Q3JjQ2hlY2tDaGFuY2UoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q3JjQ2hlY2tDaGFuY2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgeworICAgICAgICBhc3NlcnQgYnVmZmVyID09IG51bGwgOiAiUmVidWZmZXJlciBpcyBhdHRlbXB0ZWQgdG8gYmUgY2xvc2VkIGJ1dCB0aGUgYnVmZmVyIGhvbGRlciBoYXMgbm90IGJlZW4gcmVsZWFzZWQiOworICAgICAgICB3cmFwcGVkLmNsb3NlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2VSZWFkZXIoKQorICAgIHsKKyAgICAgICAgd3JhcHBlZC5jbG9zZVJlYWRlcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzW106JXMiLCBnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwgd3JhcHBlZC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBidWZmZXIoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGJ1ZmZlciAhPSBudWxsIDogIkJ1ZmZlciBob2xkZXIgaGFzIG5vdCBiZWVuIGFjcXVpcmVkIjsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBvZmZzZXQoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGJ1ZmZlciAhPSBudWxsIDogIkJ1ZmZlciBob2xkZXIgaGFzIG5vdCBiZWVuIGFjcXVpcmVkIjsKKyAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkKKyAgICB7CisgICAgICAgIGFzc2VydCBidWZmZXIgIT0gbnVsbDsKKyAgICAgICAgaWYgKGJ1ZmZlckhvbGRlciAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBidWZmZXJIb2xkZXIucmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVySG9sZGVyID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBidWZmZXIgPSBudWxsOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL0R5bmFtaWNFbmRwb2ludFNuaXRjaC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9EeW5hbWljRW5kcG9pbnRTbml0Y2guamF2YQppbmRleCAyMjQ4MjQ4Li43N2UwNGU2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL0R5bmFtaWNFbmRwb2ludFNuaXRjaC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvRHluYW1pY0VuZHBvaW50U25pdGNoLmphdmEKQEAgLTI2LDYgKzI2LDggQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKKwogaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLkV4cG9uZW50aWFsbHlEZWNheWluZ1Jlc2Vydm9pcjsKIAogaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLlNuYXBzaG90OwpAQCAtNDEsMTIgKzQzLDE0IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTUJlYW5XcmFwcGVyOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSUdOT1JFX0RZTkFNSUNfU05JVENIX1NFVkVSSVRZOworCiAvKioKICAqIEEgZHluYW1pYyBzbml0Y2ggdGhhdCBzb3J0cyBlbmRwb2ludHMgYnkgbGF0ZW5jeSB3aXRoIGFuIGFkYXB0ZWQgcGhpIGZhaWx1cmUgZGV0ZWN0b3IKICAqLwogcHVibGljIGNsYXNzIER5bmFtaWNFbmRwb2ludFNuaXRjaCBleHRlbmRzIEFic3RyYWN0RW5kcG9pbnRTbml0Y2ggaW1wbGVtZW50cyBMYXRlbmN5U3Vic2NyaWJlcnMuU3Vic2NyaWJlciwgRHluYW1pY0VuZHBvaW50U25pdGNoTUJlYW4KIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9TRVZFUklUWSA9ICFCb29sZWFuLmdldEJvb2xlYW4oImNhc3NhbmRyYS5pZ25vcmVfZHluYW1pY19zbml0Y2hfc2V2ZXJpdHkiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9TRVZFUklUWSA9ICFJR05PUkVfRFlOQU1JQ19TTklUQ0hfU0VWRVJJVFkuZ2V0Qm9vbGVhbigpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIEFMUEhBID0gMC43NTsgLy8gc2V0IHRvIDAuNzUgdG8gbWFrZSBFRFMgbW9yZSBiaWFzZWQgdG8gdG93YXJkcyB0aGUgbmV3ZXIgdmFsdWVzCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdJTkRPV19TSVpFID0gMTAwOwpAQCAtMjAwLDcgKzIwNCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIERvdWJsZSBzY29yZSA9IHNjb3Jlcy5nZXQocmVwbGljYS5lbmRwb2ludCgpKTsKICAgICAgICAgICAgIGlmIChzY29yZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHNjb3JlID0gMC4wOworICAgICAgICAgICAgICAgIHNjb3JlID0gZGVmYXVsdFN0b3JlKHJlcGxpY2EuZW5kcG9pbnQoKSk7CiAgICAgICAgICAgICBzdWJzbml0Y2hPcmRlcmVkU2NvcmVzLmFkZChzY29yZSk7CiAgICAgICAgIH0KIApAQCAtMjI0LDYgKzIyOCwxMSBAQAogICAgICAgICByZXR1cm4gcmVwbGljYXM7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgZG91YmxlIGRlZmF1bHRTdG9yZShJbmV0QWRkcmVzc0FuZFBvcnQgdGFyZ2V0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIFVTRV9TRVZFUklUWSA/IGdldFNldmVyaXR5KHRhcmdldCkgOiAwLjA7CisgICAgfQorCiAgICAgLy8gQ29tcGFyZSBlbmRwb2ludHMgZ2l2ZW4gYW4gaW1tdXRhYmxlIHNuYXBzaG90IG9mIHRoZSBzY29yZXMKICAgICBwcml2YXRlIGludCBjb21wYXJlRW5kcG9pbnRzKEluZXRBZGRyZXNzQW5kUG9ydCB0YXJnZXQsIFJlcGxpY2EgYTEsIFJlcGxpY2EgYTIsIE1hcDxJbmV0QWRkcmVzc0FuZFBvcnQsIERvdWJsZT4gc2NvcmVzKQogICAgIHsKQEAgLTIzMiwxMiArMjQxLDEyIEBACiAgICAgICAgIAogICAgICAgICBpZiAoc2NvcmVkMSA9PSBudWxsKQogICAgICAgICB7Ci0gICAgICAgICAgICBzY29yZWQxID0gMC4wOworICAgICAgICAgICAgc2NvcmVkMSA9IGRlZmF1bHRTdG9yZShhMS5lbmRwb2ludCgpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzY29yZWQyID09IG51bGwpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHNjb3JlZDIgPSAwLjA7CisgICAgICAgICAgICBzY29yZWQyID0gZGVmYXVsdFN0b3JlKGEyLmVuZHBvaW50KCkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHNjb3JlZDEuZXF1YWxzKHNjb3JlZDIpKQpAQCAtMjY5LDcgKzI3OCw4IEBACiAgICAgICAgIHNhbXBsZS51cGRhdGUodW5pdC50b01pbGxpcyhsYXRlbmN5KSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVNjb3JlcygpIC8vIHRoaXMgaXMgZXhwZW5zaXZlCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIHZvaWQgdXBkYXRlU2NvcmVzKCkgLy8gdGhpcyBpcyBleHBlbnNpdmUKICAgICB7CiAgICAgICAgIGlmICghU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuaXNJbml0aWFsaXplZCgpKQogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMzU5LDEyICszNjksMTkgQEAKICAgICAgICAgcmV0dXJuIHRpbWluZ3M7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0U2V2ZXJpdHkoZG91YmxlIHNldmVyaXR5KQogICAgIHsKKyAgICAgICAgYWRkU2V2ZXJpdHkoc2V2ZXJpdHkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRTZXZlcml0eShkb3VibGUgc2V2ZXJpdHkpCisgICAgewogICAgICAgICBHb3NzaXBlci5pbnN0YW5jZS5hZGRMb2NhbEFwcGxpY2F0aW9uU3RhdGUoQXBwbGljYXRpb25TdGF0ZS5TRVZFUklUWSwgU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UudmFsdWVGYWN0b3J5LnNldmVyaXR5KHNldmVyaXR5KSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBkb3VibGUgZ2V0U2V2ZXJpdHkoSW5ldEFkZHJlc3NBbmRQb3J0IGVuZHBvaW50KQorICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIGdldFNldmVyaXR5KEluZXRBZGRyZXNzQW5kUG9ydCBlbmRwb2ludCkKICAgICB7CiAgICAgICAgIEVuZHBvaW50U3RhdGUgc3RhdGUgPSBHb3NzaXBlci5pbnN0YW5jZS5nZXRFbmRwb2ludFN0YXRlRm9yRW5kcG9pbnQoZW5kcG9pbnQpOwogICAgICAgICBpZiAoc3RhdGUgPT0gbnVsbCkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvSW5ldEFkZHJlc3NBbmRQb3J0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL0luZXRBZGRyZXNzQW5kUG9ydC5qYXZhCmluZGV4IGU2YTkyMGIuLjc4NjI3ZTQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvSW5ldEFkZHJlc3NBbmRQb3J0LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9JbmV0QWRkcmVzc0FuZFBvcnQuamF2YQpAQCAtMjYsNyArMjYsMTEgQEAKIGltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5uZXQuSG9zdEFuZFBvcnQ7CiAKQEAgLTY0LDcgKzY4LDggQEAKIAogICAgIHB1YmxpYyBmaW5hbCBieXRlW10gYWRkcmVzc0J5dGVzOwogCi0gICAgcHJpdmF0ZSBJbmV0QWRkcmVzc0FuZFBvcnQoSW5ldEFkZHJlc3MgYWRkcmVzcywgYnl0ZVtdIGFkZHJlc3NCeXRlcywgaW50IHBvcnQpCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgSW5ldEFkZHJlc3NBbmRQb3J0KEluZXRBZGRyZXNzIGFkZHJlc3MsIGJ5dGVbXSBhZGRyZXNzQnl0ZXMsIGludCBwb3J0KQogICAgIHsKICAgICAgICAgc3VwZXIoYWRkcmVzcywgcG9ydCk7CiAgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKGFkZHJlc3MpOwpAQCAtMjE1LDYgKzIyMCwzMSBAQAogICAgICAgICByZXR1cm4gZ2V0QnlOYW1lT3ZlcnJpZGVEZWZhdWx0cyhuYW1lLCBudWxsKTsKICAgICB9CiAKKworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxJbmV0QWRkcmVzc0FuZFBvcnQ+IGdldEFsbEJ5TmFtZShTdHJpbmcgbmFtZSkgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gZ2V0QWxsQnlOYW1lT3ZlcnJpZGVEZWZhdWx0cyhuYW1lLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIEhvc3RuYW1lICsgb3B0aW9uYWwgcG9ydHMgc3RyaW5nCisgICAgICogQHBhcmFtIHBvcnQgUG9ydCB0byBjb25uZWN0IG9uLCBvdmVycmlkZGVuIGJ5IHZhbHVlcyBpbiBob3N0bmFtZSBzdHJpbmcsIGRlZmF1bHRzIHRvIERhdGFiYXNlRGVzY3JpcHRvciBkZWZhdWx0IGlmIG5vdCBzcGVjaWZpZWQgYW55d2hlcmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0PEluZXRBZGRyZXNzQW5kUG9ydD4gZ2V0QWxsQnlOYW1lT3ZlcnJpZGVEZWZhdWx0cyhTdHJpbmcgbmFtZSwgSW50ZWdlciBwb3J0KSB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEhvc3RBbmRQb3J0IGhhcCA9IEhvc3RBbmRQb3J0LmZyb21TdHJpbmcobmFtZSk7CisgICAgICAgIGlmIChoYXAuaGFzUG9ydCgpKQorICAgICAgICB7CisgICAgICAgICAgICBwb3J0ID0gaGFwLmdldFBvcnQoKTsKKyAgICAgICAgfQorICAgICAgICBJbnRlZ2VyIGZpbmFsUG9ydCA9IHBvcnQ7CisKKyAgICAgICAgcmV0dXJuIFN0cmVhbS5vZihJbmV0QWRkcmVzcy5nZXRBbGxCeU5hbWUoaGFwLmdldEhvc3QoKSkpCisgICAgICAgICAgICAgICAgICAgICAubWFwKChhZGRyZXNzKSAtPiBnZXRCeUFkZHJlc3NPdmVycmlkZURlZmF1bHRzKGFkZHJlc3MsIGZpbmFsUG9ydCkpCisgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKgogICAgICAqIEBwYXJhbSBuYW1lIEhvc3RuYW1lICsgb3B0aW9uYWwgcG9ydHMgc3RyaW5nCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5LmphdmEKaW5kZXggMWQzOWJiZS4uOWQxOTg5ZSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9OZXR3b3JrVG9wb2xvZ3lTdHJhdGVneS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3kuamF2YQpAQCAtMzUwLDYgKzM1MCw3IEBACiAgICAgICAgICAgICAgICAgU3RyaW5nIGRjID0gZS5nZXRLZXkoKTsKICAgICAgICAgICAgICAgICBSZXBsaWNhdGlvbkZhY3RvciByZiA9IGdldFJlcGxpY2F0aW9uRmFjdG9yKGRjKTsKICAgICAgICAgICAgICAgICBHdWFyZHJhaWxzLm1pbmltdW1SZXBsaWNhdGlvbkZhY3Rvci5ndWFyZChyZi5mdWxsUmVwbGljYXMsIGtleXNwYWNlTmFtZSwgZmFsc2UsIHN0YXRlKTsKKyAgICAgICAgICAgICAgICBHdWFyZHJhaWxzLm1heGltdW1SZXBsaWNhdGlvbkZhY3Rvci5ndWFyZChyZi5mdWxsUmVwbGljYXMsIGtleXNwYWNlTmFtZSwgZmFsc2UsIHN0YXRlKTsKICAgICAgICAgICAgICAgICBpbnQgbm9kZUNvdW50ID0gZGNzTm9kZXMuZ2V0KGRjKS5zaXplKCk7CiAgICAgICAgICAgICAgICAgLy8gbm9kZUNvdW50PT0wIG9uIG1hbnkgdGVzdHMKICAgICAgICAgICAgICAgICBpZiAocmYuZnVsbFJlcGxpY2FzID4gbm9kZUNvdW50ICYmIG5vZGVDb3VudCAhPSAwKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9SZWNvbm5lY3RhYmxlU25pdGNoSGVscGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL1JlY29ubmVjdGFibGVTbml0Y2hIZWxwZXIuamF2YQppbmRleCBkOGNhOWU0Li45ZTViYTIzIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL1JlY29ubmVjdGFibGVTbml0Y2hIZWxwZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL1JlY29ubmVjdGFibGVTbml0Y2hIZWxwZXIuamF2YQpAQCAtMzAsNiArMzAsOCBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5JSW50ZXJub2RlQXV0aGVudGljYXRvci5JbnRlcm5vZGVDb25uZWN0aW9uRGlyZWN0aW9uLk9VVEJPVU5EX1BSRUNPTk5FQ1Q7CisKIC8qKgogICogU2lkZWtpY2sgaGVscGVyIGZvciBzbml0Y2hlcyB0aGF0IHdhbnQgdG8gcmVjb25uZWN0IGZyb20gb25lIElQIGFkZHIgZm9yIGEgbm9kZSB0byBhbm90aGVyLgogICogVHlwaWNhbGx5LCB0aGlzIGlzIGZvciBzaXR1YXRpb25zIGxpa2UgRUMyIHdoZXJlIGEgbm9kZSB3aWxsIGhhdmUgYSBwdWJsaWMgYWRkcmVzcyBhbmQgYSBwcml2YXRlIGFkZHJlc3MsCkBAIC02NCw3ICs2Niw4IEBACiAgICAgQFZpc2libGVGb3JUZXN0aW5nCiAgICAgc3RhdGljIHZvaWQgcmVjb25uZWN0KEluZXRBZGRyZXNzQW5kUG9ydCBwdWJsaWNBZGRyZXNzLCBJbmV0QWRkcmVzc0FuZFBvcnQgbG9jYWxBZGRyZXNzLCBJRW5kcG9pbnRTbml0Y2ggc25pdGNoLCBTdHJpbmcgbG9jYWxEYykKICAgICB7Ci0gICAgICAgIGlmICghbmV3IE91dGJvdW5kQ29ubmVjdGlvblNldHRpbmdzKHB1YmxpY0FkZHJlc3MsIGxvY2FsQWRkcmVzcykud2l0aERlZmF1bHRzKENvbm5lY3Rpb25DYXRlZ29yeS5NRVNTQUdJTkcpLmF1dGhlbnRpY2F0ZSgpKQorICAgICAgICBmaW5hbCBPdXRib3VuZENvbm5lY3Rpb25TZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBPdXRib3VuZENvbm5lY3Rpb25TZXR0aW5ncyhwdWJsaWNBZGRyZXNzLCBsb2NhbEFkZHJlc3MpLndpdGhEZWZhdWx0cyhDb25uZWN0aW9uQ2F0ZWdvcnkuTUVTU0FHSU5HKTsKKyAgICAgICAgaWYgKCFzZXR0aW5ncy5hdXRoZW50aWNhdG9yKCkuYXV0aGVudGljYXRlKHNldHRpbmdzLnRvLmdldEFkZHJlc3MoKSwgc2V0dGluZ3MudG8uZ2V0UG9ydCgpLCBudWxsLCBPVVRCT1VORF9QUkVDT05ORUNUKSkKICAgICAgICAgewogICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJJbnRlcm5vZGVBdXRoZW50aWNhdG9yIHNhaWQgZG9uJ3QgcmVjb25uZWN0IHRvIHt9IG9uIHt9IiwgcHVibGljQWRkcmVzcywgbG9jYWxBZGRyZXNzKTsKICAgICAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvUmVwbGljYS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9SZXBsaWNhLmphdmEKaW5kZXggNGM1ZjdjNi4uNGM1OGU2NCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9SZXBsaWNhLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9SZXBsaWNhLmphdmEKQEAgLTE5MSw2ICsxOTEsNSBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIHRyYW5zaWVudFJlcGxpY2EoZW5kcG9pbnQsIG5ldyBSYW5nZTw+KHN0YXJ0LCBlbmQpKTsKICAgICB9Ci0KIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9TaW1wbGVTZWVkUHJvdmlkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvU2ltcGxlU2VlZFByb3ZpZGVyLmphdmEKaW5kZXggZmU1MDBiNC4uYjZjY2FlYyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9TaW1wbGVTZWVkUHJvdmlkZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL1NpbXBsZVNlZWRQcm92aWRlci5qYXZhCkBAIC0yMyw4ICsyMywxMiBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogCiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKQEAgLTMyLDggKzM2LDE4IEBACiBwdWJsaWMgY2xhc3MgU2ltcGxlU2VlZFByb3ZpZGVyIGltcGxlbWVudHMgU2VlZFByb3ZpZGVyCiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNpbXBsZVNlZWRQcm92aWRlci5jbGFzcyk7CisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VFRFNfS0VZID0gInNlZWRzIjsKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPTFZFX01VTFRJUExFX0lQX0FERFJFU1NFU19QRVJfRE5TX1JFQ09SRF9LRVkgPSAicmVzb2x2ZV9tdWx0aXBsZV9pcF9hZGRyZXNzZXNfcGVyX2Ruc19yZWNvcmQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUVEX0NPVU5UX1dBUk5fVEhSRVNIT0xEID0gQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlNFRURfQ09VTlRfV0FSTl9USFJFU0hPTEQuZ2V0SW50KDIwKTsKIAotICAgIHB1YmxpYyBTaW1wbGVTZWVkUHJvdmlkZXIoTWFwPFN0cmluZywgU3RyaW5nPiBhcmdzKSB7fQorICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gZGVmYXVsdFNlZWRzOworCisgICAgcHVibGljIFNpbXBsZVNlZWRQcm92aWRlcihNYXA8U3RyaW5nLCBTdHJpbmc+IGFyZ3MpCisgICAgeworICAgICAgICBkZWZhdWx0U2VlZHMgPSBuZXcgU3RyaW5nW10geyBGQlV0aWxpdGllcy5nZXRMb2NhbEFkZHJlc3NBbmRQb3J0KCkuZ2V0SG9zdEFkZHJlc3ModHJ1ZSkgfTsKKyAgICB9CiAKICAgICBwdWJsaWMgTGlzdDxJbmV0QWRkcmVzc0FuZFBvcnQ+IGdldFNlZWRzKCkKICAgICB7CkBAIC00NiwxNCArNjAsNDQgQEAKICAgICAgICAgewogICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUpOwogICAgICAgICB9Ci0gICAgICAgIFN0cmluZ1tdIGhvc3RzID0gY29uZi5zZWVkX3Byb3ZpZGVyLnBhcmFtZXRlcnMuZ2V0KCJzZWVkcyIpLnNwbGl0KCIsIiwgLTEpOworCisgICAgICAgIGFzc2VydCBjb25mLnNlZWRfcHJvdmlkZXIgIT0gbnVsbCA6ICJjb25mLnNlZWRfcHJvdmlkZXIgaXMgbnVsbCEiOworCisgICAgICAgIGJvb2xlYW4gcmVzb2x2ZU11bHRpcGxlSXBzOworICAgICAgICBTdHJpbmdbXSBob3N0czsKKworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMgPSBjb25mLnNlZWRfcHJvdmlkZXIucGFyYW1ldGVyczsKKyAgICAgICAgaWYgKHBhcmFtZXRlcnMgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzb2x2ZU11bHRpcGxlSXBzID0gZmFsc2U7CisgICAgICAgICAgICBob3N0cyA9IGRlZmF1bHRTZWVkczsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGhvc3RzID0gcGFyYW1ldGVycy5nZXRPckRlZmF1bHQoU0VFRFNfS0VZLCBkZWZhdWx0U2VlZHNbMF0pLnNwbGl0KCIsIiwgLTEpOworICAgICAgICAgICAgcmVzb2x2ZU11bHRpcGxlSXBzID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4ocGFyYW1ldGVycy5nZXRPckRlZmF1bHQoUkVTT0xWRV9NVUxUSVBMRV9JUF9BRERSRVNTRVNfUEVSX0ROU19SRUNPUkRfS0VZLCBCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgfQorCiAgICAgICAgIExpc3Q8SW5ldEFkZHJlc3NBbmRQb3J0PiBzZWVkcyA9IG5ldyBBcnJheUxpc3Q8Pihob3N0cy5sZW5ndGgpOworCiAgICAgICAgIGZvciAoU3RyaW5nIGhvc3QgOiBob3N0cykKICAgICAgICAgewogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIWhvc3QudHJpbSgpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBzZWVkcy5hZGQoSW5ldEFkZHJlc3NBbmRQb3J0LmdldEJ5TmFtZShob3N0LnRyaW0oKSkpOworICAgICAgICAgICAgICAgIGlmICghaG9zdC50cmltKCkuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVNdWx0aXBsZUlwcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxJbmV0QWRkcmVzc0FuZFBvcnQ+IHJlc29sdmVkU2VlZHMgPSBJbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QWxsQnlOYW1lKGhvc3QudHJpbSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlZWRzLmFkZEFsbChyZXNvbHZlZFNlZWRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1Zygie30gcmVzb2x2ZXMgdG8ge30iLCBob3N0LCByZXNvbHZlZFNlZWRzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzQW5kUG9ydCBhZGRyZXNzQW5kUG9ydCA9IEluZXRBZGRyZXNzQW5kUG9ydC5nZXRCeU5hbWUoaG9zdC50cmltKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VlZHMuYWRkKGFkZHJlc3NBbmRQb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiT25seSByZXNvbHZpbmcgb25lIElQIHBlciBETlMgcmVjb3JkIC0ge30gcmVzb2x2ZXMgdG8ge30iLCBob3N0LCBhZGRyZXNzQW5kUG9ydCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZXgpCkBAIC02Miw2ICsxMDYsMTIgQEAKICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiU2VlZCBwcm92aWRlciBjb3VsZG4ndCBsb29rdXAgaG9zdCB7fSIsIGhvc3QpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlZWRzLnNpemUoKSA+IFNFRURfQ09VTlRfV0FSTl9USFJFU0hPTEQpCisgICAgICAgICAgICBsb2dnZXIud2FybigiU2VlZCBwcm92aWRlciByZXR1cm5lZCBtb3JlIHRoYW4ge30gc2VlZHMuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIkEgbGFyZ2Ugc2VlZCBsaXN0IG1heSBpbXBhY3QgZWZmZWN0aXZlbmVzcyBvZiB0aGUgdGhpcmQgZ29zc2lwIHJvdW5kLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBTRUVEX0NPVU5UX1dBUk5fVEhSRVNIT0xEKTsKKwogICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChzZWVkcyk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9TaW1wbGVTdHJhdGVneS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9TaW1wbGVTdHJhdGVneS5qYXZhCmluZGV4IGU1YjkyMTAuLjQ4OGI2MDEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvU2ltcGxlU3RyYXRlZ3kuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL1NpbXBsZVN0cmF0ZWd5LmphdmEKQEAgLTEwOSw2ICsxMDksNyBAQAogICAgICAgICAgICAgaW50IG5vZGVDb3VudCA9IFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmdldEhvc3RJZFRvRW5kcG9pbnQoKS5zaXplKCk7CiAgICAgICAgICAgICAvLyBub2RlQ291bnQ9PTAgb24gbWFueSB0ZXN0cwogICAgICAgICAgICAgR3VhcmRyYWlscy5taW5pbXVtUmVwbGljYXRpb25GYWN0b3IuZ3VhcmQocmYuZnVsbFJlcGxpY2FzLCBrZXlzcGFjZU5hbWUsIGZhbHNlLCBzdGF0ZSk7CisgICAgICAgICAgICBHdWFyZHJhaWxzLm1heGltdW1SZXBsaWNhdGlvbkZhY3Rvci5ndWFyZChyZi5mdWxsUmVwbGljYXMsIGtleXNwYWNlTmFtZSwgZmFsc2UsIHN0YXRlKTsKICAgICAgICAgICAgIGlmIChyZi5mdWxsUmVwbGljYXMgPiBub2RlQ291bnQgJiYgbm9kZUNvdW50ICE9IDApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJZb3VyIHJlcGxpY2F0aW9uIGZhY3RvciAiICsgcmYuZnVsbFJlcGxpY2FzCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL1NuaXRjaFByb3BlcnRpZXMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvU25pdGNoUHJvcGVydGllcy5qYXZhCmluZGV4IGFmYjY4MDQuLmIwYmZlNGMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvU25pdGNoUHJvcGVydGllcy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvU25pdGNoUHJvcGVydGllcy5qYXZhCkBAIC0yNSwxMCArMjUsMTIgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX1JBQ0tEQ19QUk9QRVJUSUVTOworCiBwdWJsaWMgY2xhc3MgU25pdGNoUHJvcGVydGllcwogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTbml0Y2hQcm9wZXJ0aWVzLmNsYXNzKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQUNLRENfUFJPUEVSVFlfRklMRU5BTUUgPSAiY2Fzc2FuZHJhLXJhY2tkYy5wcm9wZXJ0aWVzIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQUNLRENfUFJPUEVSVFlfRklMRU5BTUUgPSBDQVNTQU5EUkFfUkFDS0RDX1BST1BFUlRJRVMuZ2V0S2V5KCk7CiAKICAgICBwcml2YXRlIGZpbmFsIFByb3BlcnRpZXMgcHJvcGVydGllczsKIApAQCAtMzYsNyArMzgsNyBAQAogICAgIHsKICAgICAgICAgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBjb25maWdVUkwgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUkFDS0RDX1BST1BFUlRZX0ZJTEVOQU1FKTsKKyAgICAgICAgU3RyaW5nIGNvbmZpZ1VSTCA9IENBU1NBTkRSQV9SQUNLRENfUFJPUEVSVElFUy5nZXRTdHJpbmcoKTsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKICAgICAgICAgICAgIFVSTCB1cmw7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL0NsaWVudFJlcXVlc3RTaXplTWV0cmljcy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9DbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGVmODdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9DbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLkNvdW50ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMucmVzdHJpY3Rpb25zLlN0YXRlbWVudFJlc3RyaWN0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnNlbGVjdGlvbi5TZWxlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuSU11dGF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uVXBkYXRlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQubWVzc2FnZXMuUmVzdWx0TWVzc2FnZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNhc3NhbmRyYU1ldHJpY3NSZWdpc3RyeS5NZXRyaWNzOworCitwdWJsaWMgY2xhc3MgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEUgPSAiQ2xpZW50UmVxdWVzdFNpemUiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb3VudGVyIHRvdGFsQ29sdW1uc1JlYWQgPSBNZXRyaWNzLmNvdW50ZXIoRGVmYXVsdE5hbWVGYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUoVFlQRSwgIkNvbHVtbnNSZWFkIiwgbnVsbCkpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ291bnRlciB0b3RhbFJvd3NSZWFkID0gTWV0cmljcy5jb3VudGVyKERlZmF1bHROYW1lRmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKFRZUEUsICJSb3dzUmVhZCIsIG51bGwpKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvdW50ZXIgdG90YWxDb2x1bW5zV3JpdHRlbiA9IE1ldHJpY3MuY291bnRlcihEZWZhdWx0TmFtZUZhY3RvcnkuY3JlYXRlTWV0cmljTmFtZShUWVBFLCAiQ29sdW1uc1dyaXR0ZW4iLCBudWxsKSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb3VudGVyIHRvdGFsUm93c1dyaXR0ZW4gPSBNZXRyaWNzLmNvdW50ZXIoRGVmYXVsdE5hbWVGYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUoVFlQRSwgIlJvd3NXcml0dGVuIiwgbnVsbCkpOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlY29yZFJlYWRSZXNwb25zZU1ldHJpY3MoUmVzdWx0TWVzc2FnZS5Sb3dzIHJvd3MsIFN0YXRlbWVudFJlc3RyaWN0aW9ucyByZXN0cmljdGlvbnMsIFNlbGVjdGlvbiBzZWxlY3Rpb24pCisgICAgeworICAgICAgICBpZiAoIURhdGFiYXNlRGVzY3JpcHRvci5nZXRDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3NFbmFibGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaW50IHJvd0NvdW50ID0gcm93cy5yZXN1bHQuc2l6ZSgpOworICAgICAgICBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzUmVhZC5pbmMocm93Q291bnQpOworICAgICAgICAKKyAgICAgICAgaW50IG5vblJlc3RyaWN0ZWRDb2x1bW5zID0gc2VsZWN0aW9uLmdldENvbHVtbnMoKS5zaXplKCk7CisgICAgICAgIAorICAgICAgICBmb3IgKENvbHVtbk1ldGFkYXRhIGNvbHVtbiA6IHNlbGVjdGlvbi5nZXRDb2x1bW5zKCkpCisgICAgICAgICAgICBpZiAocmVzdHJpY3Rpb25zLmlzRXF1YWxpdHlSZXN0cmljdGVkKGNvbHVtbikpCisgICAgICAgICAgICAgICAgbm9uUmVzdHJpY3RlZENvbHVtbnMtLTsKKyAgICAgICAgICAgIAorICAgICAgICBsb25nIGNvbHVtbkNvdW50ID0gKGxvbmcpIHJvd0NvdW50ICogbm9uUmVzdHJpY3RlZENvbHVtbnM7CisgICAgICAgIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNSZWFkLmluYyhjb2x1bW5Db3VudCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlY29yZFJvd0FuZENvbHVtbkNvdW50TWV0cmljcyhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJTXV0YXRpb24+IG11dGF0aW9ucykKKyAgICB7CisgICAgICAgIGlmICghRGF0YWJhc2VEZXNjcmlwdG9yLmdldENsaWVudFJlcXVlc3RTaXplTWV0cmljc0VuYWJsZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpbnQgcm93Q291bnQgPSAwOworICAgICAgICBpbnQgY29sdW1uQ291bnQgPSAwOworCisgICAgICAgIGZvciAoSU11dGF0aW9uIG11dGF0aW9uIDogbXV0YXRpb25zKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKFBhcnRpdGlvblVwZGF0ZSB1cGRhdGUgOiBtdXRhdGlvbi5nZXRQYXJ0aXRpb25VcGRhdGVzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29sdW1uQ291bnQgKz0gdXBkYXRlLmFmZmVjdGVkQ29sdW1uQ291bnQoKTsKKyAgICAgICAgICAgICAgICByb3dDb3VudCArPSB1cGRhdGUuYWZmZWN0ZWRSb3dDb3VudCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1dyaXR0ZW4uaW5jKGNvbHVtbkNvdW50KTsKKyAgICAgICAgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsUm93c1dyaXR0ZW4uaW5jKHJvd0NvdW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVjb3JkUm93QW5kQ29sdW1uQ291bnRNZXRyaWNzKFBhcnRpdGlvblVwZGF0ZSB1cGRhdGUpCisgICAgeworICAgICAgICBpZiAoIURhdGFiYXNlRGVzY3JpcHRvci5nZXRDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3NFbmFibGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1dyaXR0ZW4uaW5jKHVwZGF0ZS5hZmZlY3RlZENvbHVtbkNvdW50KCkpOworICAgICAgICBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzV3JpdHRlbi5pbmModXBkYXRlLmFmZmVjdGVkUm93Q291bnQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9EZWNheWluZ0VzdGltYXRlZEhpc3RvZ3JhbVJlc2Vydm9pci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9EZWNheWluZ0VzdGltYXRlZEhpc3RvZ3JhbVJlc2Vydm9pci5qYXZhCmluZGV4IDMwODAyM2UuLjU2NWUzM2YgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvRGVjYXlpbmdFc3RpbWF0ZWRIaXN0b2dyYW1SZXNlcnZvaXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL0RlY2F5aW5nRXN0aW1hdGVkSGlzdG9ncmFtUmVzZXJ2b2lyLmphdmEKQEAgLTQyLDYgKzQyLDcgQEAKIAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuTWF0aC5tYXg7CiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5NYXRoLm1pbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ERUNBWUlOR19FU1RJTUFURURfSElTVE9HUkFNX1JFU0VSVk9JUl9TVFJJUEVfQ09VTlQ7CiAKIC8qKgogICogQSBkZWNheWluZyBoaXN0b2dyYW0gcmVzZXJ2b2lyIHdoZXJlIHZhbHVlcyBjb2xsZWN0ZWQgZHVyaW5nIGVhY2ggbWludXRlIHdpbGwgYmUgdHdpY2UgYXMgc2lnbmlmaWNhbnQgYXMgdGhlIHZhbHVlcwpAQCAtOTEsNyArOTIsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQlVDS0VUX0NPVU5UID0gMTY0OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPV19CVUNLRVRfQ09VTlQgPSAxMjc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9TVFJJUEVfQ09VTlQgPSBJbnRlZ2VyLnBhcnNlSW50KFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmRlaHJfc3RyaXBlX2NvdW50IiwgIjIiKSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9TVFJJUEVfQ09VTlQgPSBERUNBWUlOR19FU1RJTUFURURfSElTVE9HUkFNX1JFU0VSVk9JUl9TVFJJUEVfQ09VTlQuZ2V0SW50KCk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0JVQ0tFVF9DT1VOVCA9IDIzNzsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVGQVVMVF9aRVJPX0NPTlNJREVSQVRJT04gPSBmYWxzZTsKIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9GcmVxdWVuY3lTYW1wbGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL0ZyZXF1ZW5jeVNhbXBsZXIuamF2YQppbmRleCA4YTg5MThiLi5kNGRmZTg2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL0ZyZXF1ZW5jeVNhbXBsZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL0ZyZXF1ZW5jeVNhbXBsZXIuamF2YQpAQCAtMzMsMzMgKzMzLDMxIEBACiAgKiA8cD5hZGQoIngiLCAxMCk7IGFuZCBhZGQoIngiLCAyMCk7IHdpbGwgcmVzdWx0IGluICJ4IiA9IDMwPC9wPiBUaGlzIHVzZXMgU3RyZWFtU3VtbWFyeSB0byBvbmx5IHN0b3JlIHRoZQogICogYXBwcm94aW1hdGUgY2FyZGluYWxpdHkgKGNhcGFjaXR5KSBvZiBrZXlzLiBJZiB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IGtleXMgZXhjZWVkIHRoZSBjYXBhY2l0eSwgdGhlIGVycm9yIG9mIHRoZQogICogc2FtcGxlIG1heSBpbmNyZWFzZSBkZXBlbmRpbmcgb24gZGlzdHJpYnV0aW9uIG9mIGtleXMgYW1vbmcgdGhlIHRvdGFsIHNldC4KKyAqCisgKiBOb3RlOiB7QGxpbmsgU2FtcGxlciNzYW1wbGVyRXhlY3V0b3J9IGlzIHNpbmdsZSB0aHJlYWRlZCBidXQgd2Ugc3RpbGwgbmVlZCB0byBzeW5jaHJvbml6ZSBhcyB3ZSBoYXZlIGFjY2VzcworICogZnJvbSBib3RoIGludGVybmFsIGFuZCB0aGUgZXh0ZXJuYWwgSk1YIGNvbnRleHQgdGhhdCBjYW4gY2F1c2UgcmFjZXMuCiAgKiAKICAqIEBwYXJhbSA8VD4KICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEZyZXF1ZW5jeVNhbXBsZXI8VD4gZXh0ZW5kcyBTYW1wbGVyPFQ+CiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEZyZXF1ZW5jeVNhbXBsZXIuY2xhc3MpOwotICAgIHByaXZhdGUgbG9uZyBlbmRUaW1lTmFub3MgPSAtMTsKIAogICAgIHByaXZhdGUgU3RyZWFtU3VtbWFyeTxUPiBzdW1tYXJ5OwogCiAgICAgLyoqCiAgICAgICogU3RhcnQgdG8gcmVjb3JkIHNhbXBsZXMKICAgICAgKgotICAgICAqIEBwYXJhbSBjYXBhY2l0eQotICAgICAqICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZSBpdGVtcyB0byBrZWVwIGluIG1lbW9yeSwgdGhlIGxvd2VyIHRoaXMgaXMKLSAgICAgKiAgICAgICAgICAgIHRoZSBsZXNzIGFjY3VyYXRlIHJlc3VsdHMgYXJlLiBGb3IgYmVzdCByZXN1bHRzIHVzZSB2YWx1ZQotICAgICAqICAgICAgICAgICAgY2xvc2UgdG8gY2FyZGluYWxpdHksIGJ1dCB1bmRlcnN0YW5kIHRoZSBtZW1vcnkgdHJhZGUgb2Zmcy4KKyAgICAgKiBAcGFyYW0gY2FwYWNpdHkgTnVtYmVyIG9mIHNhbXBsZSBpdGVtcyB0byBrZWVwIGluIG1lbW9yeSwgdGhlIGxvd2VyIHRoaXMgaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgdGhlIGxlc3MgYWNjdXJhdGUgcmVzdWx0cyBhcmUuIEZvciBiZXN0IHJlc3VsdHMgdXNlIHZhbHVlCisgICAgICogICAgICAgICAgICAgICAgIGNsb3NlIHRvIGNhcmRpbmFsaXR5LCBidXQgdW5kZXJzdGFuZCB0aGUgbWVtb3J5IHRyYWRlIG9mZnMuCiAgICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGJlZ2luU2FtcGxpbmcoaW50IGNhcGFjaXR5LCBpbnQgZHVyYXRpb25NaWxsaXMpCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGJlZ2luU2FtcGxpbmcoaW50IGNhcGFjaXR5LCBsb25nIGR1cmF0aW9uTWlsbGlzKQogICAgIHsKLSAgICAgICAgaWYgKGVuZFRpbWVOYW5vcyA9PSAtMSB8fCBjbG9jay5ub3coKSA+IGVuZFRpbWVOYW5vcykKLSAgICAgICAgewotICAgICAgICAgICAgc3VtbWFyeSA9IG5ldyBTdHJlYW1TdW1tYXJ5PD4oY2FwYWNpdHkpOwotICAgICAgICAgICAgZW5kVGltZU5hbm9zID0gY2xvY2subm93KCkgKyBNSUxMSVNFQ09ORFMudG9OYW5vcyhkdXJhdGlvbk1pbGxpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQorICAgICAgICBpZiAoaXNBY3RpdmUoKSkKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTYW1wbGluZyBhbHJlYWR5IGluIHByb2dyZXNzIik7CisgICAgICAgIHVwZGF0ZUVuZFRpbWUoY2xvY2subm93KCkgKyBNSUxMSVNFQ09ORFMudG9OYW5vcyhkdXJhdGlvbk1pbGxpcykpOworICAgICAgICBzdW1tYXJ5ID0gbmV3IFN0cmVhbVN1bW1hcnk8PihjYXBhY2l0eSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02OSwxMiArNjcsMTIgQEAKICAgICBwdWJsaWMgc3luY2hyb25pemVkIExpc3Q8U2FtcGxlPFQ+PiBmaW5pc2hTYW1wbGluZyhpbnQgY291bnQpCiAgICAgewogICAgICAgICBMaXN0PFNhbXBsZTxUPj4gcmVzdWx0cyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgICAgICBpZiAoZW5kVGltZU5hbm9zICE9IC0xKQorICAgICAgICBpZiAoaXNFbmFibGVkKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGVuZFRpbWVOYW5vcyA9IC0xOworICAgICAgICAgICAgZGlzYWJsZSgpOwogICAgICAgICAgICAgcmVzdWx0cyA9IHN1bW1hcnkudG9wSyhjb3VudCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoYyAtPiBuZXcgU2FtcGxlPFQ+KGMuZ2V0SXRlbSgpLCBjLmdldENvdW50KCksIGMuZ2V0RXJyb3IoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoYyAtPiBuZXcgU2FtcGxlPD4oYy5nZXRJdGVtKCksIGMuZ2V0Q291bnQoKSwgYy5nZXRFcnJvcigpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CkBAIC04MiwyNCArODAsMTYgQEAKIAogICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBpbnNlcnQoZmluYWwgVCBpdGVtLCBmaW5hbCBsb25nIHZhbHVlKQogICAgIHsKLSAgICAgICAgLy8gc2FtcGxlckV4ZWN1dG9yIGlzIHNpbmdsZSB0aHJlYWRlZCBidXQgc3RpbGwgbmVlZAotICAgICAgICAvLyBzeW5jaHJvbml6YXRpb24gYWdhaW5zdCBqbXggY2FsbHMgdG8gZmluaXNoU2FtcGxpbmcKLSAgICAgICAgaWYgKHZhbHVlID4gMCAmJiBjbG9jay5ub3coKSA8PSBlbmRUaW1lTmFub3MpCisgICAgICAgIGlmICh2YWx1ZSA+IDAgJiYgaXNBY3RpdmUoKSkKICAgICAgICAgewogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgc3VtbWFyeS5vZmZlcihpdGVtLCAoaW50KSBNYXRoLm1pbih2YWx1ZSwgSW50ZWdlci5NQVhfVkFMVUUpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiRmFpbHVyZSB0byBvZmZlciBzYW1wbGUiLCBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZW5kVGltZU5hbm9zICE9IC0xICYmIGNsb2NrLm5vdygpIDw9IGVuZFRpbWVOYW5vczsKLSAgICB9Ci0KIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9LZXlzcGFjZU1ldHJpY3MuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvS2V5c3BhY2VNZXRyaWNzLmphdmEKaW5kZXggNzc2MDI3ZS4uNzA3Y2NhMiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9LZXlzcGFjZU1ldHJpY3MuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL0tleXNwYWNlTWV0cmljcy5qYXZhCkBAIC0yMCwxOCArMjAsMjIgQEAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Ub0xvbmdGdW5jdGlvbjsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKKwogaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLkNvdW50ZXI7CiBpbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuR2F1Z2U7CiBpbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuSGlzdG9ncmFtOwogaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLk1ldGVyOwogaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLlRpbWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5HYXVnZVByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DYXNzYW5kcmFNZXRyaWNzUmVnaXN0cnkuTWV0cmljTmFtZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlRhYmxlTWV0cmljcy5SZWxlYXNhYmxlTWV0cmljOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwotCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2Fzc2FuZHJhTWV0cmljc1JlZ2lzdHJ5Lk1ldHJpY3M7CiAKIC8qKgpAQCAtNTksMTYgKzYzLDE1IEBACiAgICAgcHVibGljIGZpbmFsIEdhdWdlPExvbmc+IHBlbmRpbmdGbHVzaGVzOwogICAgIC8qKiBFc3RpbWF0ZSBvZiBudW1iZXIgb2YgcGVuZGluZyBjb21wYWN0aW9zIGZvciB0aGlzIENGICovCiAgICAgcHVibGljIGZpbmFsIEdhdWdlPExvbmc+IHBlbmRpbmdDb21wYWN0aW9uczsKLSAgICAvKiogRGlzayBzcGFjZSB1c2VkIGJ5IFNTVGFibGVzIGJlbG9uZ2luZyB0byB0aGlzIENGICovCisgICAgLyoqIERpc2sgc3BhY2UgdXNlZCBieSBTU1RhYmxlcyBiZWxvbmdpbmcgdG8gdGFibGVzIGluIHRoaXMga2V5c3BhY2UgKi8KICAgICBwdWJsaWMgZmluYWwgR2F1Z2U8TG9uZz4gbGl2ZURpc2tTcGFjZVVzZWQ7Ci0gICAgLyoqIFRvdGFsIGRpc2sgc3BhY2UgdXNlZCBieSBTU1RhYmxlcyBiZWxvbmdpbmcgdG8gdGhpcyBDRiwgaW5jbHVkaW5nIG9ic29sZXRlIG9uZXMgd2FpdGluZyB0byBiZSBHQydkICovCisgICAgLyoqIERpc2sgc3BhY2UgdXNlZCBieSBTU1RhYmxlcyBiZWxvbmdpbmcgdG8gdGFibGVzIGluIHRoaXMga2V5c3BhY2UsIHNjYWxlZCBkb3duIGJ5IHJlcGxpY2F0aW9uIGZhY3RvciAqLworICAgIHB1YmxpYyBmaW5hbCBHYXVnZTxMb25nPiB1bnJlcGxpY2F0ZWRMaXZlRGlza1NwYWNlVXNlZDsKKyAgICAvKiogVW5jb21wcmVzc2VkL2xvZ2ljYWwgc2l6ZSBvZiBTU1RhYmxlcyBiZWxvbmdpbmcgdG8gdGFibGVzIGluIHRoaXMga2V5c3BhY2UgKi8KKyAgICBwdWJsaWMgZmluYWwgR2F1Z2U8TG9uZz4gdW5jb21wcmVzc2VkTGl2ZURpc2tTcGFjZVVzZWQ7CisgICAgLyoqIFVuY29tcHJlc3NlZC9sb2dpY2FsIHNpemUgb2YgU1NUYWJsZXMgYmVsb25naW5nIHRvIHRhYmxlcyBpbiB0aGlzIGtleXNwYWNlLCBzY2FsZWQgZG93biBieSByZXBsaWNhdGlvbiBmYWN0b3IgKi8KKyAgICBwdWJsaWMgZmluYWwgR2F1Z2U8TG9uZz4gdW5yZXBsaWNhdGVkVW5jb21wcmVzc2VkTGl2ZURpc2tTcGFjZVVzZWQ7CiAgICAgcHVibGljIGZpbmFsIEdhdWdlPExvbmc+IHRvdGFsRGlza1NwYWNlVXNlZDsKLSAgICAvKiogRGlzayBzcGFjZSB1c2VkIGJ5IGJsb29tIGZpbHRlciAqLwotICAgIHB1YmxpYyBmaW5hbCBHYXVnZTxMb25nPiBibG9vbUZpbHRlckRpc2tTcGFjZVVzZWQ7Ci0gICAgLyoqIE9mZiBoZWFwIG1lbW9yeSB1c2VkIGJ5IGJsb29tIGZpbHRlciAqLwotICAgIHB1YmxpYyBmaW5hbCBHYXVnZTxMb25nPiBibG9vbUZpbHRlck9mZkhlYXBNZW1vcnlVc2VkOwotICAgIC8qKiBPZmYgaGVhcCBtZW1vcnkgdXNlZCBieSBpbmRleCBzdW1tYXJ5ICovCi0gICAgcHVibGljIGZpbmFsIEdhdWdlPExvbmc+IGluZGV4U3VtbWFyeU9mZkhlYXBNZW1vcnlVc2VkOwogICAgIC8qKiBPZmYgaGVhcCBtZW1vcnkgdXNlZCBieSBjb21wcmVzc2lvbiBtZXRhIGRhdGEqLwogICAgIHB1YmxpYyBmaW5hbCBHYXVnZTxMb25nPiBjb21wcmVzc2lvbk1ldGFkYXRhT2ZmSGVhcE1lbW9yeVVzZWQ7CiAgICAgLyoqIChMb2NhbCkgcmVhZCBtZXRyaWNzICovCkBAIC03Nyw4ICs4MCwxMCBAQAogICAgIHB1YmxpYyBmaW5hbCBMYXRlbmN5TWV0cmljcyByYW5nZUxhdGVuY3k7CiAgICAgLyoqIChMb2NhbCkgd3JpdGUgbWV0cmljcyAqLwogICAgIHB1YmxpYyBmaW5hbCBMYXRlbmN5TWV0cmljcyB3cml0ZUxhdGVuY3k7Ci0gICAgLyoqIEhpc3RvZ3JhbSBvZiB0aGUgbnVtYmVyIG9mIHNzdGFibGUgZGF0YSBmaWxlcyBhY2Nlc3NlZCBwZXIgcmVhZCAqLworICAgIC8qKiBIaXN0b2dyYW0gb2YgdGhlIG51bWJlciBvZiBzc3RhYmxlIGRhdGEgZmlsZXMgYWNjZXNzZWQgcGVyIHNpbmdsZSBwYXJ0aXRpb24gcmVhZCAqLwogICAgIHB1YmxpYyBmaW5hbCBIaXN0b2dyYW0gc3N0YWJsZXNQZXJSZWFkSGlzdG9ncmFtOworICAgIC8qKiBIaXN0b2dyYW0gb2YgdGhlIG51bWJlciBvZiBzc3RhYmxlIGRhdGEgZmlsZXMgYWNjZXNzZWQgcGVyIHBhcnRpdGlvbiByYW5nZSByZWFkICovCisgICAgcHVibGljIGZpbmFsIEhpc3RvZ3JhbSBzc3RhYmxlc1BlclJhbmdlUmVhZEhpc3RvZ3JhbTsKICAgICAvKiogVG9tYnN0b25lcyBzY2FubmVkIGluIHF1ZXJpZXMgb24gdGhpcyBLZXlzcGFjZSAqLwogICAgIHB1YmxpYyBmaW5hbCBIaXN0b2dyYW0gdG9tYnN0b25lU2Nhbm5lZEhpc3RvZ3JhbTsKICAgICAvKiogTGl2ZSBjZWxscyBzY2FubmVkIGluIHF1ZXJpZXMgb24gdGhpcyBLZXlzcGFjZSAqLwpAQCAtMTY4LDggKzE3MywxMCBAQAogICAgIHB1YmxpYyBmaW5hbCBNZXRlciByb3dJbmRleFNpemVBYm9ydHM7CiAgICAgcHVibGljIGZpbmFsIEhpc3RvZ3JhbSByb3dJbmRleFNpemU7CiAKKyAgICBwdWJsaWMgZmluYWwgSW1tdXRhYmxlTWFwPFNTVGFibGVGb3JtYXQ8PywgPz4sIEltbXV0YWJsZU1hcDxTdHJpbmcsIEdhdWdlPD8gZXh0ZW5kcyBOdW1iZXI+Pj4gZm9ybWF0U3BlY2lmaWNHYXVnZXM7CisKICAgICBwdWJsaWMgZmluYWwgTWV0cmljTmFtZUZhY3RvcnkgZmFjdG9yeTsKLSAgICBwcml2YXRlIEtleXNwYWNlIGtleXNwYWNlOworICAgIHByaXZhdGUgZmluYWwgS2V5c3BhY2Uga2V5c3BhY2U7CiAKICAgICAvKiogc2V0IGNvbnRhaW5pbmcgbmFtZXMgb2YgYWxsIHRoZSBtZXRyaWNzIHN0b3JlZCBoZXJlLCBmb3IgcmVsZWFzaW5nIGxhdGVyICovCiAgICAgcHJpdmF0ZSBTZXQ8UmVsZWFzYWJsZU1ldHJpYz4gYWxsTWV0cmljcyA9IFNldHMubmV3SGFzaFNldCgpOwpAQCAtMjAxLDE0ICsyMDgsMTUgQEAKICAgICAgICAgICAgICAgICBtZXRyaWMgLT4gbWV0cmljLm1lbXRhYmxlU3dpdGNoQ291bnQuZ2V0Q291bnQoKSk7CiAgICAgICAgIHBlbmRpbmdDb21wYWN0aW9ucyA9IGNyZWF0ZUtleXNwYWNlR2F1Z2UoIlBlbmRpbmdDb21wYWN0aW9ucyIsIG1ldHJpYyAtPiBtZXRyaWMucGVuZGluZ0NvbXBhY3Rpb25zLmdldFZhbHVlKCkpOwogICAgICAgICBwZW5kaW5nRmx1c2hlcyA9IGNyZWF0ZUtleXNwYWNlR2F1Z2UoIlBlbmRpbmdGbHVzaGVzIiwgbWV0cmljIC0+IG1ldHJpYy5wZW5kaW5nRmx1c2hlcy5nZXRDb3VudCgpKTsKKwogICAgICAgICBsaXZlRGlza1NwYWNlVXNlZCA9IGNyZWF0ZUtleXNwYWNlR2F1Z2UoIkxpdmVEaXNrU3BhY2VVc2VkIiwgbWV0cmljIC0+IG1ldHJpYy5saXZlRGlza1NwYWNlVXNlZC5nZXRDb3VudCgpKTsKKyAgICAgICAgdW5jb21wcmVzc2VkTGl2ZURpc2tTcGFjZVVzZWQgPSBjcmVhdGVLZXlzcGFjZUdhdWdlKCJVbmNvbXByZXNzZWRMaXZlRGlza1NwYWNlVXNlZCIsIG1ldHJpYyAtPiBtZXRyaWMudW5jb21wcmVzc2VkTGl2ZURpc2tTcGFjZVVzZWQuZ2V0Q291bnQoKSk7CisgICAgICAgIHVucmVwbGljYXRlZExpdmVEaXNrU3BhY2VVc2VkID0gY3JlYXRlS2V5c3BhY2VHYXVnZSgiVW5yZXBsaWNhdGVkTGl2ZURpc2tTcGFjZVVzZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljIC0+IG1ldHJpYy5saXZlRGlza1NwYWNlVXNlZC5nZXRDb3VudCgpIC8ga2V5c3BhY2UuZ2V0UmVwbGljYXRpb25TdHJhdGVneSgpLmdldFJlcGxpY2F0aW9uRmFjdG9yKCkuZnVsbFJlcGxpY2FzKTsKKyAgICAgICAgdW5yZXBsaWNhdGVkVW5jb21wcmVzc2VkTGl2ZURpc2tTcGFjZVVzZWQgPSBjcmVhdGVLZXlzcGFjZUdhdWdlKCJVbnJlcGxpY2F0ZWRVbmNvbXByZXNzZWRMaXZlRGlza1NwYWNlVXNlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWMgLT4gbWV0cmljLnVuY29tcHJlc3NlZExpdmVEaXNrU3BhY2VVc2VkLmdldENvdW50KCkgLyBrZXlzcGFjZS5nZXRSZXBsaWNhdGlvblN0cmF0ZWd5KCkuZ2V0UmVwbGljYXRpb25GYWN0b3IoKS5mdWxsUmVwbGljYXMpOwogICAgICAgICB0b3RhbERpc2tTcGFjZVVzZWQgPSBjcmVhdGVLZXlzcGFjZUdhdWdlKCJUb3RhbERpc2tTcGFjZVVzZWQiLCBtZXRyaWMgLT4gbWV0cmljLnRvdGFsRGlza1NwYWNlVXNlZC5nZXRDb3VudCgpKTsKLSAgICAgICAgYmxvb21GaWx0ZXJEaXNrU3BhY2VVc2VkID0gY3JlYXRlS2V5c3BhY2VHYXVnZSgiQmxvb21GaWx0ZXJEaXNrU3BhY2VVc2VkIiwKLSAgICAgICAgICAgICAgICBtZXRyaWMgLT4gbWV0cmljLmJsb29tRmlsdGVyRGlza1NwYWNlVXNlZC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgYmxvb21GaWx0ZXJPZmZIZWFwTWVtb3J5VXNlZCA9IGNyZWF0ZUtleXNwYWNlR2F1Z2UoIkJsb29tRmlsdGVyT2ZmSGVhcE1lbW9yeVVzZWQiLAotICAgICAgICAgICAgICAgIG1ldHJpYyAtPiBtZXRyaWMuYmxvb21GaWx0ZXJPZmZIZWFwTWVtb3J5VXNlZC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgaW5kZXhTdW1tYXJ5T2ZmSGVhcE1lbW9yeVVzZWQgPSBjcmVhdGVLZXlzcGFjZUdhdWdlKCJJbmRleFN1bW1hcnlPZmZIZWFwTWVtb3J5VXNlZCIsCi0gICAgICAgICAgICAgICAgbWV0cmljIC0+IG1ldHJpYy5pbmRleFN1bW1hcnlPZmZIZWFwTWVtb3J5VXNlZC5nZXRWYWx1ZSgpKTsKKwogICAgICAgICBjb21wcmVzc2lvbk1ldGFkYXRhT2ZmSGVhcE1lbW9yeVVzZWQgPSBjcmVhdGVLZXlzcGFjZUdhdWdlKCJDb21wcmVzc2lvbk1ldGFkYXRhT2ZmSGVhcE1lbW9yeVVzZWQiLAogICAgICAgICAgICAgICAgIG1ldHJpYyAtPiBtZXRyaWMuY29tcHJlc3Npb25NZXRhZGF0YU9mZkhlYXBNZW1vcnlVc2VkLmdldFZhbHVlKCkpOwogCkBAIC0yMTksNiArMjI3LDcgQEAKIAogICAgICAgICAvLyBjcmVhdGUgaGlzdG9ncmFtcyBmb3IgVGFibGVNZXRyaWNzIHRvIHJlcGxpY2F0ZSB1cGRhdGVzIHRvCiAgICAgICAgIHNzdGFibGVzUGVyUmVhZEhpc3RvZ3JhbSA9IGNyZWF0ZUtleXNwYWNlSGlzdG9ncmFtKCJTU1RhYmxlc1BlclJlYWRIaXN0b2dyYW0iLCB0cnVlKTsKKyAgICAgICAgc3N0YWJsZXNQZXJSYW5nZVJlYWRIaXN0b2dyYW0gPSBjcmVhdGVLZXlzcGFjZUhpc3RvZ3JhbSgiU1NUYWJsZXNQZXJSYW5nZVJlYWRIaXN0b2dyYW0iLCB0cnVlKTsKICAgICAgICAgdG9tYnN0b25lU2Nhbm5lZEhpc3RvZ3JhbSA9IGNyZWF0ZUtleXNwYWNlSGlzdG9ncmFtKCJUb21ic3RvbmVTY2FubmVkSGlzdG9ncmFtIiwgZmFsc2UpOwogICAgICAgICBsaXZlU2Nhbm5lZEhpc3RvZ3JhbSA9IGNyZWF0ZUtleXNwYWNlSGlzdG9ncmFtKCJMaXZlU2Nhbm5lZEhpc3RvZ3JhbSIsIGZhbHNlKTsKICAgICAgICAgY29sVXBkYXRlVGltZURlbHRhSGlzdG9ncmFtID0gY3JlYXRlS2V5c3BhY2VIaXN0b2dyYW0oIkNvbFVwZGF0ZVRpbWVEZWx0YUhpc3RvZ3JhbSIsIGZhbHNlKTsKQEAgLTI2NSw2ICsyNzQsOCBAQAogICAgICAgICByb3dJbmRleFNpemVXYXJuaW5ncyA9IGNyZWF0ZUtleXNwYWNlTWV0ZXIoIlJvd0luZGV4U2l6ZVdhcm5pbmdzIik7CiAgICAgICAgIHJvd0luZGV4U2l6ZUFib3J0cyA9IGNyZWF0ZUtleXNwYWNlTWV0ZXIoIlJvd0luZGV4U2l6ZUFib3J0cyIpOwogICAgICAgICByb3dJbmRleFNpemUgPSBjcmVhdGVLZXlzcGFjZUhpc3RvZ3JhbSgiUm93SW5kZXhTaXplIiwgZmFsc2UpOworCisgICAgICAgIGZvcm1hdFNwZWNpZmljR2F1Z2VzID0gY3JlYXRlRm9ybWF0U3BlY2lmaWNHYXVnZXMoa2V5c3BhY2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjc4LDEwICsyODksMzAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgSW1tdXRhYmxlTWFwPFNTVGFibGVGb3JtYXQ8PywgPz4sIEltbXV0YWJsZU1hcDxTdHJpbmcsIEdhdWdlPD8gZXh0ZW5kcyBOdW1iZXI+Pj4gY3JlYXRlRm9ybWF0U3BlY2lmaWNHYXVnZXMoS2V5c3BhY2Uga2V5c3BhY2UpCisgICAgeworICAgICAgICBJbW11dGFibGVNYXAuQnVpbGRlcjxTU1RhYmxlRm9ybWF0PD8gLD8+LCBJbW11dGFibGVNYXA8U3RyaW5nLCBHYXVnZTw/IGV4dGVuZHMgTnVtYmVyPj4+IGJ1aWxkZXIgPSBJbW11dGFibGVNYXAuYnVpbGRlcigpOworICAgICAgICBmb3IgKFNTVGFibGVGb3JtYXQ8PywgPz4gZm9ybWF0IDogRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNTVGFibGVGb3JtYXRzKCkudmFsdWVzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEltbXV0YWJsZU1hcC5CdWlsZGVyPFN0cmluZywgR2F1Z2U8PyBleHRlbmRzIE51bWJlcj4+IGdhdWdlcyA9IEltbXV0YWJsZU1hcC5idWlsZGVyKCk7CisgICAgICAgICAgICBmb3IgKEdhdWdlUHJvdmlkZXI8Pz4gZ2F1Z2VQcm92aWRlciA6IGZvcm1hdC5nZXRGb3JtYXRTcGVjaWZpY01ldHJpY3NQcm92aWRlcnMoKS5nZXRHYXVnZVByb3ZpZGVycygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyBmaW5hbE5hbWUgPSBnYXVnZVByb3ZpZGVyLm5hbWU7CisgICAgICAgICAgICAgICAgYWxsTWV0cmljcy5hZGQoKCkgLT4gcmVsZWFzZU1ldHJpYyhmaW5hbE5hbWUpKTsKKyAgICAgICAgICAgICAgICBHYXVnZTw/IGV4dGVuZHMgTnVtYmVyPiBnYXVnZSA9IE1ldHJpY3MucmVnaXN0ZXIoZmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKGZpbmFsTmFtZSksIGdhdWdlUHJvdmlkZXIuZ2V0S2V5c3BhY2VHYXVnZShrZXlzcGFjZSkpOworICAgICAgICAgICAgICAgIGdhdWdlcy5wdXQoZ2F1Z2VQcm92aWRlci5uYW1lLCBnYXVnZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWlsZGVyLnB1dChmb3JtYXQsIGdhdWdlcy5idWlsZCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBnYXVnZSB0aGF0IHdpbGwgc3VtIHRoZSBjdXJyZW50IHZhbHVlIG9mIGEgbWV0cmljIGZvciBhbGwgY29sdW1uIGZhbWlsaWVzIGluIHRoaXMga2V5c3BhY2UKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEBwYXJhbSBleHRyYWN0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRyaWMgYmVpbmcgY3JlYXRlZAorICAgICAqIEBwYXJhbSBleHRyYWN0b3IgYSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGEgc3BlY2lmaWVkIG1ldHJpYyB2YWx1ZSBmb3IgYSBnaXZlbiB0YWJsZQorICAgICAqCiAgICAgICogQHJldHVybiBHYXVnZSZndDtMb25nPiB0aGF0IGNvbXB1dGVzIHN1bSBvZiBNZXRyaWNWYWx1ZS5nZXRWYWx1ZSgpCiAgICAgICovCiAgICAgcHJpdmF0ZSBHYXVnZTxMb25nPiBjcmVhdGVLZXlzcGFjZUdhdWdlKFN0cmluZyBuYW1lLCBmaW5hbCBUb0xvbmdGdW5jdGlvbjxUYWJsZU1ldHJpY3M+IGV4dHJhY3RvcikKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvTWF4U2FtcGxlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9NYXhTYW1wbGVyLmphdmEKaW5kZXggZGYyNGJiOS4uMDU5M2UzNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9NYXhTYW1wbGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9NYXhTYW1wbGVyLmphdmEKQEAgLTI2LDM5ICsyNiwzNSBAQAogCiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTExJU0VDT05EUzsKIAorLyoqCisgKiBOb3RlOiB7QGxpbmsgU2FtcGxlciNzYW1wbGVyRXhlY3V0b3J9IGlzIHNpbmdsZSB0aHJlYWRlZCBidXQgd2Ugc3RpbGwgbmVlZCB0byBzeW5jaHJvbml6ZSBhcyB3ZSBoYXZlIGFjY2VzcworICogZnJvbSBib3RoIGludGVybmFsIGFuZCB0aGUgZXh0ZXJuYWwgSk1YIGNvbnRleHQgdGhhdCBjYW4gY2F1c2UgcmFjZXMuCisgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNYXhTYW1wbGVyPFQ+IGV4dGVuZHMgU2FtcGxlcjxUPgogewogICAgIHByaXZhdGUgaW50IGNhcGFjaXR5OwogICAgIHByaXZhdGUgTWluTWF4UHJpb3JpdHlRdWV1ZTxTYW1wbGU8VD4+IHF1ZXVlOwotICAgIHByaXZhdGUgbG9uZyBlbmRUaW1lTmFub3MgPSAtMTsKICAgICBwcml2YXRlIGZpbmFsIENvbXBhcmF0b3I8U2FtcGxlPFQ+PiBjb21wID0gQ29sbGVjdGlvbnMucmV2ZXJzZU9yZGVyKENvbXBhcmF0b3IuY29tcGFyaW5nKHAgLT4gcC5jb3VudCkpOwogCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYmVnaW5TYW1wbGluZyhpbnQgY2FwYWNpdHksIGxvbmcgZHVyYXRpb25NaWxsaXMpCiAgICAgewotICAgICAgICByZXR1cm4gZW5kVGltZU5hbm9zICE9IC0xICYmIGNsb2NrLm5vdygpIDw9IGVuZFRpbWVOYW5vczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYmVnaW5TYW1wbGluZyhpbnQgY2FwYWNpdHksIGludCBkdXJhdGlvbk1pbGxpcykKLSAgICB7Ci0gICAgICAgIGlmIChlbmRUaW1lTmFub3MgPT0gLTEgfHwgY2xvY2subm93KCkgPiBlbmRUaW1lTmFub3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuZFRpbWVOYW5vcyA9IGNsb2NrLm5vdygpICsgTUlMTElTRUNPTkRTLnRvTmFub3MoZHVyYXRpb25NaWxsaXMpOwotICAgICAgICAgICAgcXVldWUgPSBNaW5NYXhQcmlvcml0eVF1ZXVlCi0gICAgICAgICAgICAgICAgICAgIC5vcmRlcmVkQnkoY29tcCkKLSAgICAgICAgICAgICAgICAgICAgLm1heGltdW1TaXplKE1hdGgubWF4KDEsIGNhcGFjaXR5KSkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZSgpOwotICAgICAgICAgICAgdGhpcy5jYXBhY2l0eSA9IGNhcGFjaXR5OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKKyAgICAgICAgaWYgKGlzQWN0aXZlKCkpCiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU2FtcGxpbmcgYWxyZWFkeSBpbiBwcm9ncmVzcyIpOworICAgICAgICB1cGRhdGVFbmRUaW1lKGNsb2NrLm5vdygpICsgTUlMTElTRUNPTkRTLnRvTmFub3MoZHVyYXRpb25NaWxsaXMpKTsKKyAgICAgICAgcXVldWUgPSBNaW5NYXhQcmlvcml0eVF1ZXVlLm9yZGVyZWRCeShjb21wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4aW11bVNpemUoTWF0aC5tYXgoMSwgY2FwYWNpdHkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlKCk7CisgICAgICAgIHRoaXMuY2FwYWNpdHkgPSBjYXBhY2l0eTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIExpc3Q8U2FtcGxlPFQ+PiBmaW5pc2hTYW1wbGluZyhpbnQgY291bnQpCiAgICAgewogICAgICAgICBMaXN0PFNhbXBsZTxUPj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KGNvdW50KTsKLSAgICAgICAgaWYgKGVuZFRpbWVOYW5vcyAhPSAtMSkKKyAgICAgICAgaWYgKGlzRW5hYmxlZCgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBlbmRUaW1lTmFub3MgPSAtMTsKKyAgICAgICAgICAgIGRpc2FibGUoKTsKICAgICAgICAgICAgIFNhbXBsZTxUPiBuZXh0OwogICAgICAgICAgICAgd2hpbGUgKChuZXh0ID0gcXVldWUucG9sbCgpKSAhPSBudWxsICYmIHJlc3VsdC5zaXplKCkgPD0gY291bnQpCiAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChuZXh0KTsKQEAgLTY5LDkgKzY1LDEyIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGluc2VydChUIGl0ZW0sIGxvbmcgdmFsdWUpCiAgICAgewotICAgICAgICBpZiAodmFsdWUgPiAwICYmIGNsb2NrLm5vdygpIDw9IGVuZFRpbWVOYW5vcwotICAgICAgICAgICAgICAgICYmIChxdWV1ZS5pc0VtcHR5KCkgfHwgcXVldWUuc2l6ZSgpIDwgY2FwYWNpdHkgfHwgcXVldWUucGVla0xhc3QoKS5jb3VudCA8IHZhbHVlKSkKKyAgICAgICAgaWYgKGlzQWN0aXZlKCkgJiYgcGVybWl0c1ZhbHVlKHZhbHVlKSkKICAgICAgICAgICAgIHF1ZXVlLmFkZChuZXcgU2FtcGxlPFQ+KGl0ZW0sIHZhbHVlLCAwKSk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBib29sZWFuIHBlcm1pdHNWYWx1ZShsb25nIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlID4gMCAmJiAocXVldWUuaXNFbXB0eSgpIHx8IHF1ZXVlLnNpemUoKSA8IGNhcGFjaXR5IHx8IHF1ZXVlLnBlZWtMYXN0KCkuY291bnQgPCB2YWx1ZSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9NaW5NYXhBdmdNZXRyaWMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvTWluTWF4QXZnTWV0cmljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY1ZjUyZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvTWluTWF4QXZnTWV0cmljLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczsKKworaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLkdhdWdlOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2Fzc2FuZHJhTWV0cmljc1JlZ2lzdHJ5Lk1ldHJpY3M7CisKK3B1YmxpYyBjbGFzcyBNaW5NYXhBdmdNZXRyaWMKK3sKKyAgICBwcml2YXRlIGZpbmFsIE1ldHJpY05hbWVGYWN0b3J5IGZhY3Rvcnk7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZVByZWZpeDsKKworICAgIGZpbmFsIEdhdWdlPExvbmc+IG1pbkdhdWdlOworICAgIGZpbmFsIEdhdWdlPExvbmc+IG1heEdhdWdlOworICAgIGZpbmFsIEdhdWdlPERvdWJsZT4gYXZnR2F1Z2U7CisgICAgZmluYWwgR2F1Z2U8RG91YmxlPiBzdGRkZXZHYXVnZTsKKyAgICBmaW5hbCBHYXVnZTxJbnRlZ2VyPiBudW1TYW1wbGVzR2F1Z2U7CisKKyAgICBwcml2YXRlIGxvbmcgbWluOworICAgIHByaXZhdGUgbG9uZyBtYXg7CisgICAgcHJpdmF0ZSBsb25nIHN1bTsKKyAgICBwcml2YXRlIGxvbmcgc3VtU3F1YXJlczsKKyAgICBwcml2YXRlIGludCBudW1TYW1wbGVzOworCisgICAgcHVibGljIE1pbk1heEF2Z01ldHJpYyhNZXRyaWNOYW1lRmFjdG9yeSBmYWN0b3J5LCBTdHJpbmcgbmFtZVByZWZpeCkKKyAgICB7CisgICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7CisgICAgICAgIHRoaXMubmFtZVByZWZpeCA9IG5hbWVQcmVmaXg7CisKKyAgICAgICAgbWluR2F1Z2UgPSBNZXRyaWNzLnJlZ2lzdGVyKGZhY3RvcnkuY3JlYXRlTWV0cmljTmFtZShuYW1lUHJlZml4ICsgIk1pbiIpLCAoKSAtPiBtaW4pOworICAgICAgICBtYXhHYXVnZSA9IE1ldHJpY3MucmVnaXN0ZXIoZmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKG5hbWVQcmVmaXggKyAiTWF4IiksICgpIC0+IG1heCk7CisgICAgICAgIGF2Z0dhdWdlID0gTWV0cmljcy5yZWdpc3RlcihmYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUobmFtZVByZWZpeCArICJBdmciKSwgKCkgLT4gbnVtU2FtcGxlcyA+IDAgPyAoKGRvdWJsZSkgc3VtKSAvIG51bVNhbXBsZXMgOiAwKTsKKyAgICAgICAgc3RkZGV2R2F1Z2UgPSBNZXRyaWNzLnJlZ2lzdGVyKGZhY3RvcnkuY3JlYXRlTWV0cmljTmFtZShuYW1lUHJlZml4ICsgIlN0ZERldiIpLCAoKSAtPiBzdGRkZXYoKSk7CisgICAgICAgIG51bVNhbXBsZXNHYXVnZSA9IE1ldHJpY3MucmVnaXN0ZXIoZmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKG5hbWVQcmVmaXggKyAiTnVtU2FtcGxlcyIpLCAoKSAtPiBudW1TYW1wbGVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkKKyAgICB7CisgICAgICAgIE1ldHJpY3MucmVtb3ZlKGZhY3RvcnkuY3JlYXRlTWV0cmljTmFtZShuYW1lUHJlZml4ICsgIk1pbiIpKTsKKyAgICAgICAgTWV0cmljcy5yZW1vdmUoZmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKG5hbWVQcmVmaXggKyAiTWF4IikpOworICAgICAgICBNZXRyaWNzLnJlbW92ZShmYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUobmFtZVByZWZpeCArICJBdmciKSk7CisgICAgICAgIE1ldHJpY3MucmVtb3ZlKGZhY3RvcnkuY3JlYXRlTWV0cmljTmFtZShuYW1lUHJlZml4ICsgIlN0ZERldiIpKTsKKyAgICAgICAgTWV0cmljcy5yZW1vdmUoZmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKG5hbWVQcmVmaXggKyAiTnVtU2FtcGxlcyIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpCisgICAgeworICAgICAgICBzdW0gPSAwOworICAgICAgICBzdW1TcXVhcmVzID0gMDsKKyAgICAgICAgbWF4ID0gTG9uZy5NSU5fVkFMVUU7CisgICAgICAgIG1pbiA9IExvbmcuTUFYX1ZBTFVFOworICAgICAgICBudW1TYW1wbGVzID0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGUobG9uZyB2YWx1ZSkKKyAgICB7CisgICAgICAgIG1heCA9IG1heCA+IHZhbHVlID8gbWF4IDogdmFsdWU7CisgICAgICAgIG1pbiA9IG1pbiA8IHZhbHVlID8gbWluIDogdmFsdWU7CisgICAgICAgIHN1bSArPSB2YWx1ZTsKKyAgICAgICAgc3VtU3F1YXJlcyArPSB2YWx1ZSAqIHZhbHVlOworICAgICAgICBudW1TYW1wbGVzKys7CisgICAgfQorCisgICAgcHJpdmF0ZSBEb3VibGUgc3RkZGV2KCkKKyAgICB7CisgICAgICAgIGlmIChudW1TYW1wbGVzID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIGF2Z1NxdWFyZSA9ICgoZG91YmxlKSBzdW1TcXVhcmVzKSAvIG51bVNhbXBsZXM7CisgICAgICAgICAgICBkb3VibGUgYXZnID0gKChkb3VibGUpIHN1bSkgLyBudW1TYW1wbGVzOworICAgICAgICAgICAgcmV0dXJuIE1hdGguc3FydChhdmdTcXVhcmUgLSBhdmcgKiBhdmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDAuMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJ7IiArCisgICAgICAgICAgICAgICAibWluPSIgKyBtaW4gKworICAgICAgICAgICAgICAgIiwgbWF4PSIgKyBtYXggKworICAgICAgICAgICAgICAgIiwgYXZnPSIgKyAoc3VtICogMS4wIC8gbnVtU2FtcGxlcykgKworICAgICAgICAgICAgICAgIiwgc3RkRGV2PSIgKyBzdGRkZXYoKSArCisgICAgICAgICAgICAgICAiLCBudW1TYW1wbGVzPSIgKyBudW1TYW1wbGVzICsKKyAgICAgICAgICAgICAgICd9JzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL1NhbXBsZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvU2FtcGxlci5qYXZhCmluZGV4IGIzZDBmMjEuLjZlYjg1MDggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvU2FtcGxlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvU2FtcGxlci5qYXZhCkBAIC0xNywxMCArMTcsMTIgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOwogCitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaUZ1bmN0aW9uOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvclBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2luZ1NlcnZpY2U7CkBAIC0zNCw5ICszNiw2MSBAQAogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2FtcGxlcjxUPgogeworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgRElTQUJMRUQgPSAtMUw7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaUZ1bmN0aW9uPFNhbXBsZXJUeXBlLCBTYW1wbGluZ01hbmFnZXIuUmVzdWx0QnVpbGRlciwgU2FtcGxpbmdNYW5hZ2VyLlJlc3VsdEJ1aWxkZXI+CisgICAgICAgIEZyZXF1ZW5jeVNhbXBsZXJGb21hdHRlciA9ICh0eXBlLCByZXN1bHRCdWlsZGVyKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRCdWlsZGVyLmZvclR5cGUodHlwZSwgdHlwZS5kZXNjcmlwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oIlRhYmxlIiwgInRhYmxlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oIlBhcnRpdGlvbiIsICJ2YWx1ZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCJDb3VudCIsICJjb3VudCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCIrLy0iLCAiZXJyb3IiKTsKKwogICAgIHB1YmxpYyBlbnVtIFNhbXBsZXJUeXBlCiAgICAgewotICAgICAgICBSRUFEUywgV1JJVEVTLCBMT0NBTF9SRUFEX1RJTUUsIFdSSVRFX1NJWkUsIENBU19DT05URU5USU9OUworICAgICAgICBSRUFEUygiRnJlcXVlbmN5IG9mIHJlYWRzIGJ5IHBhcnRpdGlvbiIsIEZyZXF1ZW5jeVNhbXBsZXJGb21hdHRlciksCisgICAgICAgIFdSSVRFUygiRnJlcXVlbmN5IG9mIHdyaXRlcyBieSBwYXJ0aXRpb24iLCBGcmVxdWVuY3lTYW1wbGVyRm9tYXR0ZXIpLAorICAgICAgICBMT0NBTF9SRUFEX1RJTUUoIkxvbmdlc3QgcmVhZCBxdWVyeSB0aW1lcyIsICgoc2FtcGxlclR5cGUsIHJlc3VsdEJ1aWxkZXIpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEJ1aWxkZXIuZm9yVHlwZShzYW1wbGVyVHlwZSwgc2FtcGxlclR5cGUuZGVzY3JpcHRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCJRdWVyeSIsICJ2YWx1ZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCJNaWNyb3NlY29uZHMiLCAiY291bnQiKSkpLAorICAgICAgICBSRUFEX1JPV19DT1VOVCgiUGFydGl0aW9ucyByZWFkIHdpdGggdGhlIG1vc3Qgcm93cyIsICgoc2FtcGxlclR5cGUsIHJlc3VsdEJ1aWxkZXIpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRCdWlsZGVyLmZvclR5cGUoc2FtcGxlclR5cGUsIHNhbXBsZXJUeXBlLmRlc2NyaXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbHVtbigiVGFibGUiLCAidGFibGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbHVtbigiUGFydGl0aW9uIiwgInZhbHVlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oIlJvd3MiLCAiY291bnQiKSkpLAorCisgICAgICAgIFJFQURfVE9NQlNUT05FX0NPVU5UKCJQYXJ0aXRpb25zIHJlYWQgd2l0aCB0aGUgbW9zdCB0b21ic3RvbmVzIiwgKChzYW1wbGVyVHlwZSwgcmVzdWx0QnVpbGRlcikgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEJ1aWxkZXIuZm9yVHlwZShzYW1wbGVyVHlwZSwgc2FtcGxlclR5cGUuZGVzY3JpcHRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbHVtbigiVGFibGUiLCAidGFibGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oIlBhcnRpdGlvbiIsICJ2YWx1ZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbHVtbigiVG9tYnN0b25lcyIsICJjb3VudCIpKSksCisKKyAgICAgICAgUkVBRF9TU1RBQkxFX0NPVU5UKCJQYXJ0aXRpb25zIHJlYWQgd2l0aCB0aGUgbW9zdCBzc3RhYmxlcyIsICgoc2FtcGxlclR5cGUsIHJlc3VsdEJ1aWxkZXIpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0QnVpbGRlci5mb3JUeXBlKHNhbXBsZXJUeXBlLCBzYW1wbGVyVHlwZS5kZXNjcmlwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbHVtbigiVGFibGUiLCAidGFibGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCJQYXJ0aXRpb24iLCAidmFsdWUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCJTU1RhYmxlcyIsICJjb3VudCIpKSksCisgICAgICAgIFdSSVRFX1NJWkUoIk1heCBtdXRhdGlvbiBzaXplIGJ5IHBhcnRpdGlvbiIsICgoc2FtcGxlclR5cGUsIHJlc3VsdEJ1aWxkZXIpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRCdWlsZGVyLmZvclR5cGUoc2FtcGxlclR5cGUsIHNhbXBsZXJUeXBlLmRlc2NyaXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oIlRhYmxlIiwgInRhYmxlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCJQYXJ0aXRpb24iLCAidmFsdWUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oIkJ5dGVzIiwgImNvdW50IikpKSwKKyAgICAgICAgQ0FTX0NPTlRFTlRJT05TKCJGcmVxdWVuY3kgb2YgQ0FTIGNvbnRlbnRpb24gYnkgcGFydGl0aW9uIiwgRnJlcXVlbmN5U2FtcGxlckZvbWF0dGVyKTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaUZ1bmN0aW9uPFNhbXBsZXJUeXBlLCBTYW1wbGluZ01hbmFnZXIuUmVzdWx0QnVpbGRlciwgU2FtcGxpbmdNYW5hZ2VyLlJlc3VsdEJ1aWxkZXI+IGZvcm1hdHRlcjsKKworICAgICAgICBTYW1wbGVyVHlwZShTdHJpbmcgZGVzY3JpcHRpb24sIEJpRnVuY3Rpb248U2FtcGxlclR5cGUsIFNhbXBsaW5nTWFuYWdlci5SZXN1bHRCdWlsZGVyLCBTYW1wbGluZ01hbmFnZXIuUmVzdWx0QnVpbGRlcj4gZm9ybWF0dGVyKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgICAgICAgICB0aGlzLmZvcm1hdHRlciA9IGZvcm1hdHRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZm9ybWF0KFNhbXBsaW5nTWFuYWdlci5SZXN1bHRCdWlsZGVyIHJlc3VsdEJ1aWxkZXIsIFByaW50U3RyZWFtIHBzKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JtYXR0ZXIuYXBwbHkodGhpcywgcmVzdWx0QnVpbGRlcikucHJpbnQocHMpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCkBAIC01MCw2ICsxMDQsOCBAQAogICAgICAgICAgICAgLndpdGhSZWplY3RlZEV4ZWN1dGlvbkhhbmRsZXIoKHJ1bm5hYmxlLCBleGVjdXRvcikgLT4gTWVzc2FnaW5nU2VydmljZS5pbnN0YW5jZSgpLm1ldHJpY3MucmVjb3JkU2VsZkRyb3BwZWRNZXNzYWdlKFZlcmIuX1NBTVBMRSkpCiAgICAgICAgICAgICAuYnVpbGQoKTsKIAorICAgIHByaXZhdGUgbG9uZyBlbmRUaW1lTmFub3MgPSAtMTsKKwogICAgIHB1YmxpYyB2b2lkIGFkZFNhbXBsZShmaW5hbCBUIGl0ZW0sIGZpbmFsIGludCB2YWx1ZSkKICAgICB7CiAgICAgICAgIGlmIChpc0VuYWJsZWQoKSkKQEAgLTU4LDEwICsxMTQsNTMgQEAKIAogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluc2VydChUIGl0ZW0sIGxvbmcgdmFsdWUpOwogCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNFbmFibGVkKCk7CisgICAgLyoqCisgICAgICogQSBzYW1wbGVyIGlzIGVuYWJsZWQgYmV0d2VlbiB7QGxpbmsgdGhpcyNiZWdpblNhbXBsaW5nfSBhbmQge0BsaW5rIHRoaXMjZmluaXNoU2FtcGxpbmd9CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzYW1wbGVyIGlzIGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBlbmRUaW1lTmFub3MgIT0gRElTQUJMRUQ7CisgICAgfQogCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgYmVnaW5TYW1wbGluZyhpbnQgY2FwYWNpdHksIGludCBkdXJhdGlvbk1pbGxpcyk7CisgICAgcHVibGljIHZvaWQgZGlzYWJsZSgpCisgICAgeworICAgICAgICBlbmRUaW1lTmFub3MgPSBESVNBQkxFRDsKKyAgICB9CiAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNhbXBsZXIgaXMgYWN0aXZlLgorICAgICAqIEEgc2FtcGxlciBpcyBhY3RpdmUgb25seSBpZiBpdCBpcyBlbmFibGVkIGFuZCB0aGUgY3VycmVudCB0aW1lIGlzIHdpdGhpbiB0aGUgYGR1cmF0aW9uTWlsbGlzYCB3aGVuIGJlZ2lubmluZyBzYW1wbGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpCisgICAgeworICAgICAgICByZXR1cm4gaXNFbmFibGVkKCkgJiYgY2xvY2subm93KCkgPD0gZW5kVGltZU5hbm9zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZSB0aGUgZW5kIHRpbWUgZm9yIHRoZSBzYW1wbGVyLiBJbXBsaWNpdGx5LCBjYWxsaW5nIHRoaXMgbWV0aG9kIGVuYWJsZXMgdGhlIHNhbXBsZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlRW5kVGltZShsb25nIGVuZFRpbWVNaWxsaXMpCisgICAgeworICAgICAgICB0aGlzLmVuZFRpbWVOYW5vcyA9IGVuZFRpbWVNaWxsaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmVnaW4gc2FtcGxpbmcgd2l0aCB0aGUgY29uZmlndXJlZCBjYXBhY2l0eSBhbmQgZHVyYXRpb24KKyAgICAgKiBAcGFyYW0gY2FwYWNpdHkgTnVtYmVyIG9mIHNhbXBsZSBpdGVtcyB0byBrZWVwIGluIG1lbW9yeSwgdGhlIGxvd2VyIHRoaXMgaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgdGhlIGxlc3MgYWNjdXJhdGUgcmVzdWx0cyBhcmUuIEZvciBiZXN0IHJlc3VsdHMgdXNlIHZhbHVlCisgICAgICogICAgICAgICAgICAgICAgIGNsb3NlIHRvIGNhcmRpbmFsaXR5LCBidXQgdW5kZXJzdGFuZCB0aGUgbWVtb3J5IHRyYWRlIG9mZnMuCisgICAgICogQHBhcmFtIGR1cmF0aW9uTWlsbGlzIFVwcGVyYm91bmQgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIGZvciBzYW1wbGluZy4gVGhlIHNhbXBsZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgc3RvcHMgYWNjZXB0aW5nIG5ldyBzYW1wbGVzIGFmdGVyIGV4Y2VlZGluZyB0aGUgZHVyYXRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgZXZlbiBpZiB7QGxpbmsgI2ZpbmlzaFNhbXBsaW5nKGludCl9fSBpcyBub3QgY2FsbGVkLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGJlZ2luU2FtcGxpbmcoaW50IGNhcGFjaXR5LCBsb25nIGR1cmF0aW9uTWlsbGlzKTsKKworICAgIC8qKgorICAgICAqIFN0b3Agc2FtcGxpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0cworICAgICAqIEBwYXJhbSBjb3VudCBUaGUgbnVtYmVyIG9mIHRoZSBzYW1wbGVzIHJlcXVlc3RlZCB0byByZXRyaWV2ZSBmcm9tIHRoZSBzYW1wbGVyCisgICAgICogQHJldHVybiBhIGxpc3Qgb2Ygc2FtcGxlcywgdGhlIHNpemUgaXMgdGhlIG1pbmltdW0gb2YgdGhlIHRvdGFsIHNhbXBsZXMgYW5kIHtAcGFyYW0gY291bnR9LgorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBMaXN0PFNhbXBsZTxUPj4gZmluaXNoU2FtcGxpbmcoaW50IGNvdW50KTsKIAogICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgdG9TdHJpbmcoVCB2YWx1ZSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL1NhbXBsaW5nTWFuYWdlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9TYW1wbGluZ01hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2Q4ZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9TYW1wbGluZ01hbmFnZXIuamF2YQpAQCAtMCwwICsxLDM5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbVN1cHBvcnQ7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uQ29tcG9zaXRlRGF0YTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5PcGVuRGF0YUV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5ub2RldG9vbC5Qcm9maWxlTG9hZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5ub2RldG9vbC5mb3JtYXR0ZXIuVGFibGVCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CisKK3B1YmxpYyBjbGFzcyBTYW1wbGluZ01hbmFnZXIKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU2FtcGxpbmdNYW5hZ2VyLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIFRyYWNrcyB0aGUgYWN0aXZlIHNjaGVkdWxlZCBzYW1wbGluZyB0YXNrcy4KKyAgICAgKiBUaGUga2V5IG9mIHRoZSBtYXAgaXMgYSB7QGxpbmsgSm9iSWR9LCB3aGljaCBpcyBlZmZlY3RpdmVseSBhIGtleXNwYWNlICsgdGFibGUgYWJzdHJhY3RlZCBiZWhpbmQgc29tZSBzeW50YWN0aWMKKyAgICAgKiBzdWdhciBzbyB3ZSBjYW4gdXNlIHRoZW0gd2l0aG91dCBwZXBwZXJpbmcgUGFpcnMgdGhyb3VnaG91dCB0aGlzIGNsYXNzLiBCb3RoIGtleXNwYWNlIGFuZCB0YWJsZSBhcmUgbnVsbGFibGUsCisgICAgICogYSBwYXJhZGlnbSB3ZSBpbmhlcml0IGZyb20ge0BsaW5rIFByb2ZpbGVMb2FkfSBzbyBuZWVkIHRvIGFjY29tbW9kYXRlIGhlcmUuCisgICAgICoKKyAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIG1hcCBpcyB0aGUgY3VycmVudCBzY2hlZHVsZWQgdGFzay4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwPEpvYklkLCBGdXR1cmU8Pz4+IGFjdGl2ZVNhbXBsaW5nVGFza3MgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworCisgICAgLyoqIFRhc2tzIHRoYXQgYXJlIGFjdGl2ZWx5IGJlaW5nIGNhbmNlbGxlZCAqLworICAgIHByaXZhdGUgZmluYWwgU2V0PEpvYklkPiBjYW5jZWxpbmdUYXNrcyA9IENvbmN1cnJlbnRIYXNoTWFwLm5ld0tleVNldCgpOworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0UmVzdWx0KFJlc3VsdEJ1aWxkZXIgcmVzdWx0QnVpbGRlcikKKyAgICB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICB0cnkgKFByaW50U3RyZWFtIHBzID0gbmV3IFByaW50U3RyZWFtKGJhb3MpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKFNhbXBsZXIuU2FtcGxlclR5cGUgc2FtcGxlclR5cGUgOiBTYW1wbGVyLlNhbXBsZXJUeXBlLnZhbHVlcygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNhbXBsZXJUeXBlLmZvcm1hdChyZXN1bHRCdWlsZGVyLCBwcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYmFvcy50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxDb2x1bW5GYW1pbHlTdG9yZT4gZ2V0VGFibGVzKFN0cmluZyBrcywgU3RyaW5nIHRhYmxlKQorICAgIHsKKyAgICAgICAgLy8gbnVsbCBLRVlTUEFDRSA9PSBhbGwgdGhlIHRhYmxlcworICAgICAgICBpZiAoa3MgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBDb2x1bW5GYW1pbHlTdG9yZS5hbGwoKTsKKworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3MpOworCisgICAgICAgIC8vIEtFWVNQQUNFIGRlZmluZWQgdy9udWxsIHRhYmxlID09IGFsbCB0aGUgdGFibGVzIG9uIHRoYXQgS0VZU1BBQ0UKKyAgICAgICAgaWYgKHRhYmxlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmVzKCk7CisgICAgICAgIC8vIE9yIHdlIGp1c3QgaGF2ZSBhIHNwZWNpZmljIGtzK3RhYmxlIGNvbWJvIHdlJ3JlIGxvb2tpbmcgdG8gcHJvZmlsZQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZSh0YWJsZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIHRoZSBzYW1wbGVycyBmb3IgdGhlIGtleXNwYWNlIGFuZCB0YWJsZS4KKyAgICAgKiBAcGFyYW0ga3MgS2V5c3BhY2UuIE51bGxhYmxlLiBJZiBudWxsLCB0aGUgc2NoZWR1bGVkIHNhbXBsaW5nIGlzIG9uIGFsbCBrZXlzcGFjZXMgYW5kIHRhYmxlcworICAgICAqIEBwYXJhbSB0YWJsZSBOdWxsYWJsZS4gSWYgbnVsbCwgdGhlIHNjaGVkdWxlZCBzYW1wbGluZyBpcyBvbiBhbGwgdGFibGVzIG9mIHRoZSBzcGVjaWZpZWQga2V5c3BhY2UKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gRHVyYXRpb24gb2YgZWFjaCBzY2hlZHVsZWQgc2FtcGxpbmcgam9iIGluIG1pbGxpc2Vjb25kcworICAgICAqIEBwYXJhbSBpbnRlcnZhbCBJbnRlcnZhbCBvZiBlYWNoIHNjaGVkdWxlZCBzYW1wbGluZyBqb2IgaW4gbWlsbGlzZWNvbmRzCisgICAgICogQHBhcmFtIGNhcGFjaXR5IENhcGFjaXR5IG9mIHRoZSBzYW1wbGVyLCBoaWdoZXIgZm9yIG1vcmUgYWNjdXJhY3kKKyAgICAgKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHRoZSB0b3Agc2FtcGxlcyB0byBsaXN0CisgICAgICogQHBhcmFtIHNhbXBsZXJzIGEgbGlzdCBvZiBzYW1wbGVycyB0byBlbmFibGUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNjaGVkdWxlZCBzYW1wbGluZyBpcyBzdGFydGVkIHN1Y2Nlc3NmdWxseS4gT3RoZXJ3aXNlIHJldHVybiBmYXNsZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyKFN0cmluZyBrcywgU3RyaW5nIHRhYmxlLCBpbnQgZHVyYXRpb24sIGludCBpbnRlcnZhbCwgaW50IGNhcGFjaXR5LCBpbnQgY291bnQsIExpc3Q8U3RyaW5nPiBzYW1wbGVycykKKyAgICB7CisgICAgICAgIEpvYklkIGpvYklkID0gbmV3IEpvYklkKGtzLCB0YWJsZSk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJSZWdpc3RlcmluZyBzYW1wbGVycyB7fSBmb3Ige30iLCBzYW1wbGVycywgam9iSWQpOworCisgICAgICAgIGlmICghY2FuU2NoZWR1bGUoam9iSWQpKQorICAgICAgICB7CisgICAgICAgICAgICBsb2dnZXIuaW5mbygiVW5hYmxlIHRvIHJlZ2lzdGVyIHt9IGR1ZSB0byBleGlzdGluZyBvbmdvaW5nIHNhbXBsaW5nLiIsIGpvYklkKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vICdiZWdpbicgdGFza3MgYXJlIGNoYWluZWQgdG8gZmluaXNoIGJlZm9yZSB0aGVpciBwYWlyZWQgJ2ZpbmlzaCcKKyAgICAgICAgYWN0aXZlU2FtcGxpbmdUYXNrcy5wdXQoam9iSWQsIFNjaGVkdWxlZEV4ZWN1dG9ycy5vcHRpb25hbFRhc2tzLnN1Ym1pdCgKKyAgICAgICAgY3JlYXRlU2FtcGxpbmdCZWdpblJ1bm5hYmxlKGpvYklkLCBnZXRUYWJsZXMoa3MsIHRhYmxlKSwgZHVyYXRpb24sIGludGVydmFsLCBjYXBhY2l0eSwgY291bnQsIHNhbXBsZXJzKQorICAgICAgICApKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gdW5yZWdpc3RlcihTdHJpbmcga3MsIFN0cmluZyB0YWJsZSkKKyAgICB7CisgICAgICAgIC8vIHVucmVnaXN0ZXIgYWxsCisgICAgICAgIC8vIHJldHVybiB0cnVlIHdoZW4gYWxsIHRhc2tzIGFyZSBjYW5jZWxsZWQgc3VjY2Vzc2Z1bGx5CisgICAgICAgIGlmIChrcyA9PSBudWxsICYmIHRhYmxlID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVzID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoSm9iSWQgaWQgOiBhY3RpdmVTYW1wbGluZ1Rhc2tzLmtleVNldCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlcyA9IGNhbmNlbFRhc2soaWQpICYgcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjYW5jZWxUYXNrKG5ldyBKb2JJZChrcywgdGFibGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gYWxsSm9icygpCisgICAgeworICAgICAgICByZXR1cm4gam9iSWRzKCkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgLm1hcChKb2JJZDo6dG9TdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgU2V0PEpvYklkPiBqb2JJZHMoKQorICAgIHsKKyAgICAgICAgU2V0PEpvYklkPiBhbGwgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIGFsbC5hZGRBbGwoYWN0aXZlU2FtcGxpbmdUYXNrcy5rZXlTZXQoKSk7CisgICAgICAgIGFsbC5hZGRBbGwoY2FuY2VsaW5nVGFza3MpOworICAgICAgICByZXR1cm4gYWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIGlmIGEgc2NoZWR1bGUgb24gdGhlIGtleXNwYWNlIGFuZCB0YWJsZSBpcyBwZXJtaXR0ZWQKKyAgICAgKiBAcGFyYW0gam9iSWQKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcG9zc2libGUsIGZhbHNlIGlmIHRoZXJlIGFyZSBvdmVybGFwcGluZyB0YWJsZXMgYWxyZWFkeSBiZWluZyBzYW1wbGVkCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNhblNjaGVkdWxlKEpvYklkIGpvYklkKQorICAgIHsKKyAgICAgICAgU2V0PEpvYklkPiBhbGxKb2JJZHMgPSBqb2JJZHMoKTsKKyAgICAgICAgLy8gVGhlcmUgaXMgYSBzY2hlZHVsZSB0aGF0IHdvcmtzIG9uIGFsbCB0YWJsZXMuIE92ZXJsYXBwaW5nIGd1YXJhbnRlZWQuCisgICAgICAgIGlmIChhbGxKb2JJZHMuY29udGFpbnMoSm9iSWQuQUxMX0tTX0FORF9UQUJMRVMpIHx8ICghYWxsSm9iSWRzLmlzRW1wdHkoKSAmJiBqb2JJZC5lcXVhbHMoSm9iSWQuQUxMX0tTX0FORF9UQUJMRVMpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgLy8gdGhlcmUgaXMgYW4gZXhhY3RseSBkdXBsaWNhdGVkIHNjaGVkdWxlCisgICAgICAgIGVsc2UgaWYgKGFsbEpvYklkcy5jb250YWlucyhqb2JJZCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBoYXMgbm8gb3ZlcmxhcHBpbmcgdGFibGVzIHVuZGVyIHRoZSBrZXlzcGFjZQorICAgICAgICAgICAgcmV0dXJuICFhbGxKb2JJZHMuY29udGFpbnMoSm9iSWQuY3JlYXRlRm9yQWxsVGFibGVzKGpvYklkLmtleXNwYWNlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FuY2VsIGEgdGFzayBieSBpdHMgaWQuIFRoZSBjb3JyZXNwb25kaW5nIHRhc2sgd2lsbCBiZSBzdG9wcGVkIG9uY2UgaXRzIGZpbmFsIHNhbXBsaW5nIGNvbXBsZXRlcy4KKyAgICAgKiBAcGFyYW0gam9iSWQKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRhc2sgZXhpc3RzLCBmYWxzZSBpZiBub3QgZm91bmQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY2FuY2VsVGFzayhKb2JJZCBqb2JJZCkKKyAgICB7CisgICAgICAgIEZ1dHVyZTw/PiB0YXNrID0gYWN0aXZlU2FtcGxpbmdUYXNrcy5yZW1vdmUoam9iSWQpOworICAgICAgICBpZiAodGFzayAhPSBudWxsKQorICAgICAgICAgICAgY2FuY2VsaW5nVGFza3MuYWRkKGpvYklkKTsKKyAgICAgICAgcmV0dXJuIHRhc2sgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCZWdpbiBzYW1wbGluZyBhbmQgc2NoZWR1bGUgYSBmdXR1cmUgdGFzayB0byBlbmQgdGhlIHNhbXBsaW5nIHRhc2sKKyAgICAgKi8KKyAgICBwcml2YXRlIFJ1bm5hYmxlIGNyZWF0ZVNhbXBsaW5nQmVnaW5SdW5uYWJsZShKb2JJZCBqb2JJZCwgSXRlcmFibGU8Q29sdW1uRmFtaWx5U3RvcmU+IHRhYmxlcywgaW50IGR1cmF0aW9uLCBpbnQgaW50ZXJ2YWwsIGludCBjYXBhY2l0eSwgaW50IGNvdW50LCBMaXN0PFN0cmluZz4gc2FtcGxlcnMpCisgICAgeworICAgICAgICByZXR1cm4gKCkgLT4KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGluZ1Rhc2tzLmNvbnRhaW5zKGpvYklkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIlRoZSBzYW1wbGluZyBqb2Igb2Yge30gaXMgY3VycmVudGx5IGNhbmNlbGluZy4gTm90IGlzc3VpbmcgYSBuZXcgcnVuLiIsIGpvYklkKTsKKyAgICAgICAgICAgICAgICBhY3RpdmVTYW1wbGluZ1Rhc2tzLnJlbW92ZShqb2JJZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHRhYmxlTmFtZXMgPSBTdHJlYW1TdXBwb3J0LnN0cmVhbSh0YWJsZXMuc3BsaXRlcmF0b3IoKSwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGNmcyAtPiBTdHJpbmcuZm9ybWF0KCIlcy4lcyIsIGNmcy5rZXlzcGFjZSwgY2ZzLm5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgICAgICBsb2dnZXIuaW5mbygiU3RhcnRpbmcgdG8gc2FtcGxlIHRhYmxlcyB7fSB3aXRoIHRoZSBzYW1wbGVycyB7fSBmb3Ige30gbXMiLCB0YWJsZU5hbWVzLCBzYW1wbGVycywgZHVyYXRpb24pOworICAgICAgICAgICAgZm9yIChTdHJpbmcgc2FtcGxlciA6IHNhbXBsZXJzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzIDogdGFibGVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2ZzLmJlZ2luTG9jYWxTYW1wbGluZyhzYW1wbGVyLCBjYXBhY2l0eSwgZHVyYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZ1dHVyZTw/PiBmdXQgPSBTY2hlZHVsZWRFeGVjdXRvcnMub3B0aW9uYWxUYXNrcy5zY2hlZHVsZSgKKyAgICAgICAgICAgICAgICBjcmVhdGVTYW1wbGluZ0VuZFJ1bm5hYmxlKGpvYklkLCB0YWJsZXMsIGR1cmF0aW9uLCBpbnRlcnZhbCwgY2FwYWNpdHksIGNvdW50LCBzYW1wbGVycyksCisgICAgICAgICAgICAgICAgaW50ZXJ2YWwsCisgICAgICAgICAgICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIC8vIHJlYWNoZWQgdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCBydW5uYWJsZQorICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSByZWZlcmVuY2VkIGZ1dHVyZSB0byBTYW1wbGluZ0ZpbmlzaAorICAgICAgICAgICAgYWN0aXZlU2FtcGxpbmdUYXNrcy5wdXQoam9iSWQsIGZ1dCk7CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluaXNoIHRoZSBzYW1wbGluZyBhbmQgYmVnaW4gYSBuZXcgb25lIGltbWVkaWF0ZWx5IGFmdGVyLgorICAgICAqCisgICAgICogTk9URTogRG8gbm90IGNhbGwgdGhpcyBvdXRzaWRlIHRoZSBjb250ZXh0IG9mIHtAbGluayB0aGlzI2NyZWF0ZVNhbXBsaW5nQmVnaW5SdW5uYWJsZX0sIGFzIHdlIG5lZWQgdG8gcHJlc2VydmUKKyAgICAgKiBvcmRlcmluZyBiZXR3ZWVuIGEgInN0YXJ0IiBhbmQgImVuZCIgcnVubmFibGUKKyAgICAgKi8KKyAgICBwcml2YXRlIFJ1bm5hYmxlIGNyZWF0ZVNhbXBsaW5nRW5kUnVubmFibGUoSm9iSWQgam9iSWQsIEl0ZXJhYmxlPENvbHVtbkZhbWlseVN0b3JlPiB0YWJsZXMsIGludCBkdXJhdGlvbiwgaW50IGludGVydmFsLCBpbnQgY2FwYWNpdHksIGludCBjb3VudCwgTGlzdDxTdHJpbmc+IHNhbXBsZXJzKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgpIC0+CisgICAgICAgIHsKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8Q29tcG9zaXRlRGF0YT4+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBzYW1wbGVyIDogc2FtcGxlcnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTGlzdDxDb21wb3NpdGVEYXRhPiB0b3BrID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgZm9yIChDb2x1bW5GYW1pbHlTdG9yZSBjZnMgOiB0YWJsZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdG9way5hZGRBbGwoY2ZzLmZpbmlzaExvY2FsU2FtcGxpbmcoc2FtcGxlciwgY291bnQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoT3BlbkRhdGFFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIkZhaWxlZCB0byByZXRyaWV2ZSB0aGUgc2FtcGxlZCBkYXRhLiBBYm9ydCB0aGUgYmFja2dyb3VuZCBzYW1wbGluZyBqb2I6IHt9LiIsIGpvYklkLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNhbXBsaW5nVGFza3MucmVtb3ZlKGpvYklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGluZ1Rhc2tzLnJlbW92ZShqb2JJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0b3BrLnNvcnQoKGxlZnQsIHJpZ2h0KSAtPiBMb25nLmNvbXBhcmUoKGxvbmcpIHJpZ2h0LmdldCgiY291bnQiKSwgKGxvbmcpIGxlZnQuZ2V0KCJjb3VudCIpKSk7CisgICAgICAgICAgICAgICAgLy8gc3VibGlzdCBpcyBub3Qgc2VyaWFsaXphYmxlIGZvciBqbXgKKyAgICAgICAgICAgICAgICB0b3BrID0gbmV3IEFycmF5TGlzdDw+KHRvcGsuc3ViTGlzdCgwLCBNYXRoLm1pbih0b3BrLnNpemUoKSwgY291bnQpKSk7CisgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXQoc2FtcGxlciwgdG9wayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBdG9taWNCb29sZWFuIGZpcnN0ID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgICAgICAgICAgUmVzdWx0QnVpbGRlciByYiA9IG5ldyBSZXN1bHRCdWlsZGVyKGZpcnN0LCByZXN1bHRzLCBzYW1wbGVycyk7CisgICAgICAgICAgICBsb2dnZXIuaW5mbyhmb3JtYXRSZXN1bHQocmIpKTsKKworICAgICAgICAgICAgLy8gSWYgbm9ib2R5IGhhcyBjYW5jZWxlZCB1cywgd2UgcGluZy1wb25nIGJhY2sgdG8gYSAiYmVnaW4iIHJ1bm5hYmxlIHRvIHJ1biBhbm90aGVyIHByb2ZpbGUgbG9hZAorICAgICAgICAgICAgaWYgKCFjYW5jZWxpbmdUYXNrcy5jb250YWlucyhqb2JJZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRnV0dXJlPD8+IGZ1dCA9IFNjaGVkdWxlZEV4ZWN1dG9ycy5vcHRpb25hbFRhc2tzLnN1Ym1pdCgKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlU2FtcGxpbmdCZWdpblJ1bm5hYmxlKGpvYklkLCB0YWJsZXMsIGR1cmF0aW9uLCBpbnRlcnZhbCwgY2FwYWNpdHksIGNvdW50LCBzYW1wbGVycykpOworICAgICAgICAgICAgICAgIGFjdGl2ZVNhbXBsaW5nVGFza3MucHV0KGpvYklkLCBmdXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSWYgc29tZW9uZSAqaGFzKiBjYW5jZWxlZCB1cywgd2UgbmVlZCB0byByZW1vdmUgdGhlIHJ1bm5hYmxlIGZyb20gYWN0aXZlU2FtcGxpbmcgYW5kIGFsc28gcmVtb3ZlIHRoZQorICAgICAgICAgICAgLy8gY2FuY2VsbGF0aW9uIHNlbnRpbmVsIHNvIHN1YnNlcXVlbnQgcmUtc3VibWl0cyBvZiBwcm9maWxpbmcgZG9uJ3QgZ2V0IGJsb2NrZWQgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiVGhlIHNhbXBsaW5nIGpvYiB7fSBoYXMgYmVlbiBjYW5jZWxsZWQuIiwgam9iSWQpOworICAgICAgICAgICAgICAgIGFjdGl2ZVNhbXBsaW5nVGFza3MucmVtb3ZlKGpvYklkKTsKKyAgICAgICAgICAgICAgICBjYW5jZWxpbmdUYXNrcy5yZW1vdmUoam9iSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEpvYklkCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEpvYklkIEFMTF9LU19BTkRfVEFCTEVTID0gbmV3IEpvYklkKG51bGwsIG51bGwpOworCisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcga2V5c3BhY2U7CisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgdGFibGU7CisKKyAgICAgICAgcHVibGljIEpvYklkKFN0cmluZyBrcywgU3RyaW5nIHRiKQorICAgICAgICB7CisgICAgICAgICAgICBrZXlzcGFjZSA9IGtzOworICAgICAgICAgICAgdGFibGUgPSB0YjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSm9iSWQgY3JlYXRlRm9yQWxsVGFibGVzKFN0cmluZyBrZXlzcGFjZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBKb2JJZChrZXlzcGFjZSwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtYXliZVdpbGRDYXJkKGtleXNwYWNlKSArICcuJyArIG1heWJlV2lsZENhcmQodGFibGUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbWF5YmVXaWxkQ2FyZChTdHJpbmcgaW5wdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gIioiIDogaW5wdXQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIEpvYklkIGpvYklkID0gKEpvYklkKSBvOworICAgICAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWxzKGtleXNwYWNlLCBqb2JJZC5rZXlzcGFjZSkgJiYgT2JqZWN0cy5lcXVhbHModGFibGUsIGpvYklkLnRhYmxlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaChrZXlzcGFjZSwgdGFibGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXN1bHRCdWlsZGVyCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgU2FtcGxlci5TYW1wbGVyVHlwZSB0eXBlOworICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICBwcm90ZWN0ZWQgQXRvbWljQm9vbGVhbiBmaXJzdDsKKyAgICAgICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIExpc3Q8Q29tcG9zaXRlRGF0YT4+IHJlc3VsdHM7CisgICAgICAgIHByb3RlY3RlZCBMaXN0PFN0cmluZz4gdGFyZ2V0czsKKyAgICAgICAgcHJvdGVjdGVkIExpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGRhdGFLZXlzOworCisgICAgICAgIHB1YmxpYyBSZXN1bHRCdWlsZGVyKEF0b21pY0Jvb2xlYW4gZmlyc3QsIE1hcDxTdHJpbmcsIExpc3Q8Q29tcG9zaXRlRGF0YT4+IHJlc3VsdHMsIExpc3Q8U3RyaW5nPiB0YXJnZXRzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7CisgICAgICAgICAgICB0aGlzLnJlc3VsdHMgPSByZXN1bHRzOworICAgICAgICAgICAgdGhpcy50YXJnZXRzID0gdGFyZ2V0czsKKyAgICAgICAgICAgIHRoaXMuZGF0YUtleXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgIHRoaXMuZGF0YUtleXMuYWRkKFBhaXIuY3JlYXRlKCIgICIsICIgICIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTYW1wbGluZ01hbmFnZXIuUmVzdWx0QnVpbGRlciBmb3JUeXBlKFNhbXBsZXIuU2FtcGxlclR5cGUgdHlwZSwgU3RyaW5nIGRlc2NyaXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBTYW1wbGluZ01hbmFnZXIuUmVzdWx0QnVpbGRlciByYiA9IG5ldyBTYW1wbGluZ01hbmFnZXIuUmVzdWx0QnVpbGRlcihmaXJzdCwgcmVzdWx0cywgdGFyZ2V0cyk7CisgICAgICAgICAgICByYi50eXBlID0gdHlwZTsKKyAgICAgICAgICAgIHJiLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgICAgICAgICByZXR1cm4gcmI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2FtcGxpbmdNYW5hZ2VyLlJlc3VsdEJ1aWxkZXIgYWRkQ29sdW1uKFN0cmluZyB0aXRsZSwgU3RyaW5nIGtleSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5kYXRhS2V5cy5hZGQoUGFpci5jcmVhdGUodGl0bGUsIGtleSkpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldChDb21wb3NpdGVEYXRhIGNkLCBTdHJpbmcga2V5KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2QuY29udGFpbnNLZXkoa2V5KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY2QuZ2V0KGtleSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHJldHVybiBrZXk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBwcmludChQcmludFN0cmVhbSBwcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRhcmdldHMuY29udGFpbnModHlwZS50b1N0cmluZygpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZpcnN0LmdldCgpKQorICAgICAgICAgICAgICAgICAgICBwcy5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgZmlyc3Quc2V0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICBwcy5wcmludGxuKGRlc2NyaXB0aW9uICsgJzonKTsKKyAgICAgICAgICAgICAgICBUYWJsZUJ1aWxkZXIgb3V0ID0gbmV3IFRhYmxlQnVpbGRlcigpOworICAgICAgICAgICAgICAgIG91dC5hZGQoZGF0YUtleXMuc3RyZWFtKCkubWFwKHAgLT4gcC5sZWZ0KS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpLnRvQXJyYXkobmV3IFN0cmluZ1tdIHt9KSk7CisgICAgICAgICAgICAgICAgTGlzdDxDb21wb3NpdGVEYXRhPiB0b3BrID0gcmVzdWx0cy5nZXQodHlwZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBmb3IgKENvbXBvc2l0ZURhdGEgY2QgOiB0b3BrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmFkZChkYXRhS2V5cy5zdHJlYW0oKS5tYXAocCAtPiBnZXQoY2QsIHAucmlnaHQpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpLnRvQXJyYXkobmV3IFN0cmluZ1tdIHt9KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0b3BrLnNpemUoKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHMucHJpbnRsbigiICAgTm90aGluZyByZWNvcmRlZCBkdXJpbmcgc2FtcGxpbmcgcGVyaW9kLi4uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludFRvKHBzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL1N0b3JhZ2VNZXRyaWNzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL1N0b3JhZ2VNZXRyaWNzLmphdmEKaW5kZXggOTM5OWJhNi4uZDg2YTIxNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9TdG9yYWdlTWV0cmljcy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvU3RvcmFnZU1ldHJpY3MuamF2YQpAQCAtMTcsNyArMTcsMTIgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOwogCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlRvTG9uZ0Z1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtU3VwcG9ydDsKKwogaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLkNvdW50ZXI7CitpbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuR2F1Z2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DYXNzYW5kcmFNZXRyaWNzUmVnaXN0cnkuTWV0cmljczsKIApAQCAtMjksOCArMzQsMjMgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRyaWNOYW1lRmFjdG9yeSBmYWN0b3J5ID0gbmV3IERlZmF1bHROYW1lRmFjdG9yeSgiU3RvcmFnZSIpOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb3VudGVyIGxvYWQgPSBNZXRyaWNzLmNvdW50ZXIoZmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKCJMb2FkIikpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ291bnRlciB1bmNvbXByZXNzZWRMb2FkID0gTWV0cmljcy5jb3VudGVyKGZhY3RvcnkuY3JlYXRlTWV0cmljTmFtZSgiVW5jb21wcmVzc2VkTG9hZCIpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgR2F1Z2U8TG9uZz4gdW5yZXBsaWNhdGVkTG9hZCA9CisgICAgICAgIGNyZWF0ZVN1bW1pbmdHYXVnZSgiVW5yZXBsaWNhdGVkTG9hZCIsIG1ldHJpYyAtPiBtZXRyaWMudW5yZXBsaWNhdGVkTGl2ZURpc2tTcGFjZVVzZWQuZ2V0VmFsdWUoKSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBHYXVnZTxMb25nPiB1bnJlcGxpY2F0ZWRVbmNvbXByZXNzZWRMb2FkID0KKyAgICAgICAgY3JlYXRlU3VtbWluZ0dhdWdlKCJVbnJlcGxpY2F0ZWRVbmNvbXByZXNzZWRMb2FkIiwgbWV0cmljIC0+IG1ldHJpYy51bnJlcGxpY2F0ZWRVbmNvbXByZXNzZWRMaXZlRGlza1NwYWNlVXNlZC5nZXRWYWx1ZSgpKTsKKwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ291bnRlciB1bmNhdWdodEV4Y2VwdGlvbnMgPSBNZXRyaWNzLmNvdW50ZXIoZmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKCJFeGNlcHRpb25zIikpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ291bnRlciB0b3RhbEhpbnRzSW5Qcm9ncmVzcyAgPSBNZXRyaWNzLmNvdW50ZXIoZmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKCJUb3RhbEhpbnRzSW5Qcm9ncmVzcyIpKTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvdW50ZXIgdG90YWxIaW50cyA9IE1ldHJpY3MuY291bnRlcihmYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUoIlRvdGFsSGludHMiKSk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb3VudGVyIHJlcGFpckV4Y2VwdGlvbnMgPSBNZXRyaWNzLmNvdW50ZXIoZmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKCJSZXBhaXJFeGNlcHRpb25zIikpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgR2F1Z2U8TG9uZz4gY3JlYXRlU3VtbWluZ0dhdWdlKFN0cmluZyBuYW1lLCBUb0xvbmdGdW5jdGlvbjxLZXlzcGFjZU1ldHJpY3M+IGV4dHJhY3RvcikKKyAgICB7CisgICAgICAgIHJldHVybiBNZXRyaWNzLnJlZ2lzdGVyKGZhY3RvcnkuY3JlYXRlTWV0cmljTmFtZShuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gU3RyZWFtU3VwcG9ydC5zdHJlYW0oS2V5c3BhY2UuYWxsKCkuc3BsaXRlcmF0b3IoKSwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwVG9Mb25nKGtleXNwYWNlIC0+IGV4dHJhY3Rvci5hcHBseUFzTG9uZyhrZXlzcGFjZS5tZXRyaWMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN1bSgpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL1RhYmxlTWV0cmljcy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9UYWJsZU1ldHJpY3MuamF2YQppbmRleCA1ZTdhYjc4Li5mNGI5MjIxIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL1RhYmxlTWV0cmljcy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvVGFibGVNZXRyaWNzLmphdmEKQEAgLTE3LDMzICsxNyw0MSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M7CiAKLWltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlDUk9TRUNPTkRTOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNhc3NhbmRyYU1ldHJpY3NSZWdpc3RyeS5NZXRyaWNzOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwubmFub1RpbWU7Ci0KIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwotaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLlRpbWVyOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7Ci0KIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuQXJyYXlVdGlsczsKIAoraW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLkNvdW50ZXI7CitpbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuR2F1Z2U7CitpbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuSGlzdG9ncmFtOworaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLk1ldGVyOworaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLk1ldHJpYzsKK2ltcG9ydCBjb20uY29kYWhhbGUubWV0cmljcy5UaW1lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLk1lbXRhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5TU1RhYmxlU2V0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5WaWV3OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLk1lbXRhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LlNlY29uZGFyeUluZGV4TWFuYWdlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzcy5Db21wcmVzc2lvbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuR2F1Z2VQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbGxlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlNhbXBsZXIuU2FtcGxlclR5cGU7CkBAIC01MiwxMiArNjAsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkVzdGltYXRlZEhpc3RvZ3JhbTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogCi1pbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuQ291bnRlcjsKLWltcG9ydCBjb20uY29kYWhhbGUubWV0cmljcy5HYXVnZTsKLWltcG9ydCBjb20uY29kYWhhbGUubWV0cmljcy5IaXN0b2dyYW07Ci1pbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuTWV0ZXI7Ci1pbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuTWV0cmljOwotaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLlJhdGlvR2F1Z2U7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JQ1JPU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DYXNzYW5kcmFNZXRyaWNzUmVnaXN0cnkuTWV0cmljczsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLm5hbm9UaW1lOwogCiAvKioKICAqIE1ldHJpY3MgZm9yIHtAbGluayBDb2x1bW5GYW1pbHlTdG9yZX0uCkBAIC0xMDAsOCArMTA1LDEwIEBACiAgICAgcHVibGljIGZpbmFsIEdhdWdlPExvbmc+IGVzdGltYXRlZFBhcnRpdGlvbkNvdW50OwogICAgIC8qKiBIaXN0b2dyYW0gb2YgZXN0aW1hdGVkIG51bWJlciBvZiBjb2x1bW5zLiAqLwogICAgIHB1YmxpYyBmaW5hbCBHYXVnZTxsb25nW10+IGVzdGltYXRlZENvbHVtbkNvdW50SGlzdG9ncmFtOwotICAgIC8qKiBIaXN0b2dyYW0gb2YgdGhlIG51bWJlciBvZiBzc3RhYmxlIGRhdGEgZmlsZXMgYWNjZXNzZWQgcGVyIHJlYWQgKi8KKyAgICAvKiogSGlzdG9ncmFtIG9mIHRoZSBudW1iZXIgb2Ygc3N0YWJsZSBkYXRhIGZpbGVzIGFjY2Vzc2VkIHBlciBzaW5nbGUgcGFydGl0aW9uIHJlYWQgKi8KICAgICBwdWJsaWMgZmluYWwgVGFibGVIaXN0b2dyYW0gc3N0YWJsZXNQZXJSZWFkSGlzdG9ncmFtOworICAgIC8qKiBIaXN0b2dyYW0gb2YgdGhlIG51bWJlciBvZiBzc3RhYmxlIGRhdGEgZmlsZXMgYWNjZXNzZWQgcGVyIHBhcnRpdGlvbiByYW5nZSByZWFkICovCisgICAgcHVibGljIGZpbmFsIFRhYmxlSGlzdG9ncmFtIHNzdGFibGVzUGVyUmFuZ2VSZWFkSGlzdG9ncmFtOwogICAgIC8qKiAoTG9jYWwpIHJlYWQgbWV0cmljcyAqLwogICAgIHB1YmxpYyBmaW5hbCBMYXRlbmN5TWV0cmljcyByZWFkTGF0ZW5jeTsKICAgICAvKiogKExvY2FsKSByYW5nZSBzbGljZSBtZXRyaWNzICovCkBAIC0xMjAsOCArMTI3LDE0IEBACiAgICAgcHVibGljIGZpbmFsIEdhdWdlPEludGVnZXI+IGxpdmVTU1RhYmxlQ291bnQ7CiAgICAgLyoqIE51bWJlciBvZiBTU1RhYmxlcyB3aXRoIG9sZCB2ZXJzaW9uIG9uIGRpc2sgZm9yIHRoaXMgQ0YgKi8KICAgICBwdWJsaWMgZmluYWwgR2F1Z2U8SW50ZWdlcj4gb2xkVmVyc2lvblNTVGFibGVDb3VudDsKKyAgICAvKiogTWF4aW11bSBkdXJhdGlvbiBvZiBhbiBTU1RhYmxlIGZvciB0aGlzIHRhYmxlLCBjb21wdXRlZCBhcyBtYXhUaW1lc3RhbXAgLSBtaW5UaW1lc3RhbXAqLworICAgIHB1YmxpYyBmaW5hbCBHYXVnZTxMb25nPiBtYXhTU1RhYmxlRHVyYXRpb247CisgICAgLyoqIE1heGltdW0gc2l6ZSBvZiBTU1RhYmxlIG9mIHRoaXMgdGFibGUgLSB0aGUgcGh5c2ljYWwgc2l6ZSBvbiBkaXNrIG9mIGFsbCBjb21wb25lbnRzIGZvciBzdWNoIFNTVGFibGUgaW4gYnl0ZXMqLworICAgIHB1YmxpYyBmaW5hbCBHYXVnZTxMb25nPiBtYXhTU1RhYmxlU2l6ZTsKICAgICAvKiogRGlzayBzcGFjZSB1c2VkIGJ5IFNTVGFibGVzIGJlbG9uZ2luZyB0byB0aGlzIHRhYmxlICovCiAgICAgcHVibGljIGZpbmFsIENvdW50ZXIgbGl2ZURpc2tTcGFjZVVzZWQ7CisgICAgLyoqIFVuY29tcHJlc3NlZC9sb2dpY2FsIGRpc2sgc3BhY2UgdXNlZCBieSBTU1RhYmxlcyBiZWxvbmdpbmcgdG8gdGhpcyB0YWJsZSAqLworICAgIHB1YmxpYyBmaW5hbCBDb3VudGVyIHVuY29tcHJlc3NlZExpdmVEaXNrU3BhY2VVc2VkOwogICAgIC8qKiBUb3RhbCBkaXNrIHNwYWNlIHVzZWQgYnkgU1NUYWJsZXMgYmVsb25naW5nIHRvIHRoaXMgdGFibGUsIGluY2x1ZGluZyBvYnNvbGV0ZSBvbmVzIHdhaXRpbmcgdG8gYmUgR0MnZCAqLwogICAgIHB1YmxpYyBmaW5hbCBDb3VudGVyIHRvdGFsRGlza1NwYWNlVXNlZDsKICAgICAvKiogU2l6ZSBvZiB0aGUgc21hbGxlc3QgY29tcGFjdGVkIHBhcnRpdGlvbiAqLwpAQCAtMTMwLDI0ICsxNDMsOCBAQAogICAgIHB1YmxpYyBmaW5hbCBHYXVnZTxMb25nPiBtYXhQYXJ0aXRpb25TaXplOwogICAgIC8qKiBTaXplIG9mIHRoZSBzbWFsbGVzdCBjb21wYWN0ZWQgcGFydGl0aW9uICovCiAgICAgcHVibGljIGZpbmFsIEdhdWdlPExvbmc+IG1lYW5QYXJ0aXRpb25TaXplOwotICAgIC8qKiBOdW1iZXIgb2YgZmFsc2UgcG9zaXRpdmVzIGluIGJsb29tIGZpbHRlciAqLwotICAgIHB1YmxpYyBmaW5hbCBHYXVnZTxMb25nPiBibG9vbUZpbHRlckZhbHNlUG9zaXRpdmVzOwotICAgIC8qKiBOdW1iZXIgb2YgZmFsc2UgcG9zaXRpdmVzIGluIGJsb29tIGZpbHRlciBmcm9tIGxhc3QgcmVhZCAqLwotICAgIHB1YmxpYyBmaW5hbCBHYXVnZTxMb25nPiByZWNlbnRCbG9vbUZpbHRlckZhbHNlUG9zaXRpdmVzOwotICAgIC8qKiBGYWxzZSBwb3NpdGl2ZSByYXRpbyBvZiBibG9vbSBmaWx0ZXIgKi8KLSAgICBwdWJsaWMgZmluYWwgR2F1Z2U8RG91YmxlPiBibG9vbUZpbHRlckZhbHNlUmF0aW87Ci0gICAgLyoqIEZhbHNlIHBvc2l0aXZlIHJhdGlvIG9mIGJsb29tIGZpbHRlciBmcm9tIGxhc3QgcmVhZCAqLwotICAgIHB1YmxpYyBmaW5hbCBHYXVnZTxEb3VibGU+IHJlY2VudEJsb29tRmlsdGVyRmFsc2VSYXRpbzsKLSAgICAvKiogRGlzayBzcGFjZSB1c2VkIGJ5IGJsb29tIGZpbHRlciAqLwotICAgIHB1YmxpYyBmaW5hbCBHYXVnZTxMb25nPiBibG9vbUZpbHRlckRpc2tTcGFjZVVzZWQ7Ci0gICAgLyoqIE9mZiBoZWFwIG1lbW9yeSB1c2VkIGJ5IGJsb29tIGZpbHRlciAqLwotICAgIHB1YmxpYyBmaW5hbCBHYXVnZTxMb25nPiBibG9vbUZpbHRlck9mZkhlYXBNZW1vcnlVc2VkOwotICAgIC8qKiBPZmYgaGVhcCBtZW1vcnkgdXNlZCBieSBpbmRleCBzdW1tYXJ5ICovCi0gICAgcHVibGljIGZpbmFsIEdhdWdlPExvbmc+IGluZGV4U3VtbWFyeU9mZkhlYXBNZW1vcnlVc2VkOwogICAgIC8qKiBPZmYgaGVhcCBtZW1vcnkgdXNlZCBieSBjb21wcmVzc2lvbiBtZXRhIGRhdGEqLwogICAgIHB1YmxpYyBmaW5hbCBHYXVnZTxMb25nPiBjb21wcmVzc2lvbk1ldGFkYXRhT2ZmSGVhcE1lbW9yeVVzZWQ7Ci0gICAgLyoqIEtleSBjYWNoZSBoaXQgcmF0ZSAgZm9yIHRoaXMgQ0YgKi8KLSAgICBwdWJsaWMgZmluYWwgR2F1Z2U8RG91YmxlPiBrZXlDYWNoZUhpdFJhdGU7CiAgICAgLyoqIFRvbWJzdG9uZXMgc2Nhbm5lZCBpbiBxdWVyaWVzIG9uIHRoaXMgQ0YgKi8KICAgICBwdWJsaWMgZmluYWwgVGFibGVIaXN0b2dyYW0gdG9tYnN0b25lU2Nhbm5lZEhpc3RvZ3JhbTsKICAgICAvKiogTGl2ZSByb3dzIHNjYW5uZWQgaW4gcXVlcmllcyBvbiB0aGlzIENGICovCkBAIC0yNjAsNiArMjU3LDEyIEBACiAgICAgcHVibGljIGZpbmFsIFNhbXBsZXI8Qnl0ZUJ1ZmZlcj4gdG9wQ2FzUGFydGl0aW9uQ29udGVudGlvbjsKICAgICAvKiogV2hlbiBzYW1wbGVyIGFjdGl2YXRlZCwgd2lsbCB0cmFjayB0aGUgc2xvd2VzdCBsb2NhbCByZWFkcyAqKi8KICAgICBwdWJsaWMgZmluYWwgU2FtcGxlcjxTdHJpbmc+IHRvcExvY2FsUmVhZFF1ZXJ5VGltZTsKKyAgICAvKiogV2hlbiBzYW1wbGVyIGFjdGl2YXRlZCwgd2lsbCB0cmFjayBwYXJ0aXRpb25zIHJlYWQgd2l0aCB0aGUgbW9zdCByb3dzICoqLworICAgIHB1YmxpYyBmaW5hbCBTYW1wbGVyPEJ5dGVCdWZmZXI+IHRvcFJlYWRQYXJ0aXRpb25Sb3dDb3VudDsKKyAgICAvKiogV2hlbiBzYW1wbGVyIGFjdGl2YXRlZCwgd2lsbCB0cmFjayBwYXJ0aXRpb25zIHJlYWQgd2l0aCB0aGUgbW9zdCB0b21ic3RvbmVzICoqLworICAgIHB1YmxpYyBmaW5hbCBTYW1wbGVyPEJ5dGVCdWZmZXI+IHRvcFJlYWRQYXJ0aXRpb25Ub21ic3RvbmVDb3VudDsKKyAgICAvKiogV2hlbiBzYW1wbGUgYWN0aXZhdGVkLCB3aWxsIHRyYWNrIHBhcnRpdGlvbnMgcmVhZCB3aXRoIHRoZSBtb3N0IG1lcmdlZCBzc3RhYmxlcyAqKi8KKyAgICBwdWJsaWMgZmluYWwgU2FtcGxlcjxCeXRlQnVmZmVyPiB0b3BSZWFkUGFydGl0aW9uU1NUYWJsZUNvdW50OwogCiAgICAgcHVibGljIGZpbmFsIFRhYmxlTWV0ZXIgY2xpZW50VG9tYnN0b25lV2FybmluZ3M7CiAgICAgcHVibGljIGZpbmFsIFRhYmxlTWV0ZXIgY2xpZW50VG9tYnN0b25lQWJvcnRzOwpAQCAtMjc2LDYgKzI3OSw4IEBACiAgICAgcHVibGljIGZpbmFsIFRhYmxlTWV0ZXIgcm93SW5kZXhTaXplQWJvcnRzOwogICAgIHB1YmxpYyBmaW5hbCBUYWJsZUhpc3RvZ3JhbSByb3dJbmRleFNpemU7CiAKKyAgICBwdWJsaWMgZmluYWwgSW1tdXRhYmxlTWFwPFNTVGFibGVGb3JtYXQ8PywgPz4sIEltbXV0YWJsZU1hcDxTdHJpbmcsIEdhdWdlPD8gZXh0ZW5kcyBOdW1iZXI+Pj4gZm9ybWF0U3BlY2lmaWNHYXVnZXM7CisKICAgICBwcml2YXRlIHN0YXRpYyBQYWlyPExvbmcsIExvbmc+IHRvdGFsTm9uU3lzdGVtVGFibGVzU2l6ZShQcmVkaWNhdGU8U1NUYWJsZVJlYWRlcj4gcHJlZGljYXRlKQogICAgIHsKICAgICAgICAgbG9uZyB0b3RhbCA9IDA7CkBAIC00NDAsMTEgKzQ0NSwzOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9OwogCisgICAgICAgIHRvcFJlYWRQYXJ0aXRpb25Sb3dDb3VudCA9IG5ldyBNYXhTYW1wbGVyPEJ5dGVCdWZmZXI+KCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhCeXRlQnVmZmVyIHZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBjZnMubWV0YWRhdGEoKS5wYXJ0aXRpb25LZXlUeXBlLmdldFN0cmluZyh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgdG9wUmVhZFBhcnRpdGlvblRvbWJzdG9uZUNvdW50ID0gbmV3IE1heFNhbXBsZXI8Qnl0ZUJ1ZmZlcj4oKQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKEJ5dGVCdWZmZXIgdmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNmcy5tZXRhZGF0YSgpLnBhcnRpdGlvbktleVR5cGUuZ2V0U3RyaW5nKHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICB0b3BSZWFkUGFydGl0aW9uU1NUYWJsZUNvdW50ID0gbmV3IE1heFNhbXBsZXI8Qnl0ZUJ1ZmZlcj4oKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoQnl0ZUJ1ZmZlciB2YWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2ZzLm1ldGFkYXRhKCkucGFydGl0aW9uS2V5VHlwZS5nZXRTdHJpbmcodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCiAgICAgICAgIHNhbXBsZXJzLnB1dChTYW1wbGVyVHlwZS5SRUFEUywgdG9wUmVhZFBhcnRpdGlvbkZyZXF1ZW5jeSk7CiAgICAgICAgIHNhbXBsZXJzLnB1dChTYW1wbGVyVHlwZS5XUklURVMsIHRvcFdyaXRlUGFydGl0aW9uRnJlcXVlbmN5KTsKICAgICAgICAgc2FtcGxlcnMucHV0KFNhbXBsZXJUeXBlLldSSVRFX1NJWkUsIHRvcFdyaXRlUGFydGl0aW9uU2l6ZSk7CiAgICAgICAgIHNhbXBsZXJzLnB1dChTYW1wbGVyVHlwZS5DQVNfQ09OVEVOVElPTlMsIHRvcENhc1BhcnRpdGlvbkNvbnRlbnRpb24pOwogICAgICAgICBzYW1wbGVycy5wdXQoU2FtcGxlclR5cGUuTE9DQUxfUkVBRF9USU1FLCB0b3BMb2NhbFJlYWRRdWVyeVRpbWUpOworICAgICAgICBzYW1wbGVycy5wdXQoU2FtcGxlclR5cGUuUkVBRF9ST1dfQ09VTlQsIHRvcFJlYWRQYXJ0aXRpb25Sb3dDb3VudCk7CisgICAgICAgIHNhbXBsZXJzLnB1dChTYW1wbGVyVHlwZS5SRUFEX1RPTUJTVE9ORV9DT1VOVCwgdG9wUmVhZFBhcnRpdGlvblRvbWJzdG9uZUNvdW50KTsKKyAgICAgICAgc2FtcGxlcnMucHV0KFNhbXBsZXJUeXBlLlJFQURfU1NUQUJMRV9DT1VOVCwgdG9wUmVhZFBhcnRpdGlvblNTVGFibGVDb3VudCk7CiAKICAgICAgICAgbWVtdGFibGVDb2x1bW5zQ291bnQgPSBjcmVhdGVUYWJsZUdhdWdlKCJNZW10YWJsZUNvbHVtbnNDb3VudCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gY2ZzLmdldFRyYWNrZXIoKS5nZXRWaWV3KCkuZ2V0Q3VycmVudE1lbXRhYmxlKCkub3BlcmF0aW9uQ291bnQoKSk7CkBAIC01MTIsNiArNTQ1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXI6OmdldEVzdGltYXRlZENlbGxQZXJQYXJ0aXRpb25Db3VudCksIG51bGwpOwogICAgICAgICAKICAgICAgICAgc3N0YWJsZXNQZXJSZWFkSGlzdG9ncmFtID0gY3JlYXRlVGFibGVIaXN0b2dyYW0oIlNTVGFibGVzUGVyUmVhZEhpc3RvZ3JhbSIsIGNmcy5rZXlzcGFjZS5tZXRyaWMuc3N0YWJsZXNQZXJSZWFkSGlzdG9ncmFtLCB0cnVlKTsKKyAgICAgICAgc3N0YWJsZXNQZXJSYW5nZVJlYWRIaXN0b2dyYW0gPSBjcmVhdGVUYWJsZUhpc3RvZ3JhbSgiU1NUYWJsZXNQZXJSYW5nZVJlYWRIaXN0b2dyYW0iLCBjZnMua2V5c3BhY2UubWV0cmljLnNzdGFibGVzUGVyUmFuZ2VSZWFkSGlzdG9ncmFtLCB0cnVlKTsKICAgICAgICAgY29tcHJlc3Npb25SYXRpbyA9IGNyZWF0ZVRhYmxlR2F1Z2UoIkNvbXByZXNzaW9uUmF0aW8iLCBuZXcgR2F1Z2U8RG91YmxlPigpCiAgICAgICAgIHsKICAgICAgICAgICAgIHB1YmxpYyBEb3VibGUgZ2V0VmFsdWUoKQpAQCAtNjA0LDcgKzYzOCwzNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsKICAgICAgICAgICAgIH0KICAgICAgICAgfSk7CisgICAgICAgIG1heFNTVGFibGVEdXJhdGlvbiA9IGNyZWF0ZVRhYmxlR2F1Z2UoIk1heFNTVGFibGVEdXJhdGlvbiIsIG5ldyBHYXVnZTxMb25nPigpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIExvbmcgZ2V0VmFsdWUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBjZnMuZ2V0VHJhY2tlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWaWV3KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmxpdmVTU1RhYmxlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHNzdGFibGUgLT4gc3N0YWJsZS5nZXRNaW5UaW1lc3RhbXAoKSAhPSBMb25nLk1BWF9WQUxVRSAmJiBzc3RhYmxlLmdldE1heFRpbWVzdGFtcCgpICE9IExvbmcuTUFYX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKHNzVGFibGVSZWFkZXIgLT4gc3NUYWJsZVJlYWRlci5nZXRNYXhUaW1lc3RhbXAoKSAtIHNzVGFibGVSZWFkZXIuZ2V0TWluVGltZXN0YW1wKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXgoTG9uZzo6Y29tcGFyZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLm9yRWxzZSgwTCkgLyAxMDAwOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgbWF4U1NUYWJsZVNpemUgPSBjcmVhdGVUYWJsZUdhdWdlKCJNYXhTU1RhYmxlU2l6ZSIsIG5ldyBHYXVnZTxMb25nPigpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIExvbmcgZ2V0VmFsdWUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBjZnMuZ2V0VHJhY2tlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWaWV3KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmxpdmVTU1RhYmxlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKFNTVGFibGVSZWFkZXI6OmJ5dGVzT25EaXNrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4KExvbmc6OmNvbXBhcmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5vckVsc2UoMEwpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKICAgICAgICAgbGl2ZURpc2tTcGFjZVVzZWQgPSBjcmVhdGVUYWJsZUNvdW50ZXIoIkxpdmVEaXNrU3BhY2VVc2VkIik7CisgICAgICAgIHVuY29tcHJlc3NlZExpdmVEaXNrU3BhY2VVc2VkID0gY3JlYXRlVGFibGVDb3VudGVyKCJVbmNvbXByZXNzZWRMaXZlRGlza1NwYWNlVXNlZCIpOwogICAgICAgICB0b3RhbERpc2tTcGFjZVVzZWQgPSBjcmVhdGVUYWJsZUNvdW50ZXIoIlRvdGFsRGlza1NwYWNlVXNlZCIpOwogICAgICAgICBtaW5QYXJ0aXRpb25TaXplID0gY3JlYXRlVGFibGVHYXVnZSgiTWluUGFydGl0aW9uU2l6ZSIsICJNaW5Sb3dTaXplIiwgbmV3IEdhdWdlPExvbmc+KCkKICAgICAgICAgewpAQCAtNjg2LDEzMiArNzUwLDYgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gY291bnQgPiAwID8gc3VtIC8gY291bnQgOiAwOwogICAgICAgICAgICAgfQogICAgICAgICB9KTsKLSAgICAgICAgYmxvb21GaWx0ZXJGYWxzZVBvc2l0aXZlcyA9IGNyZWF0ZVRhYmxlR2F1Z2UoIkJsb29tRmlsdGVyRmFsc2VQb3NpdGl2ZXMiLCBuZXcgR2F1Z2U8TG9uZz4oKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgTG9uZyBnZXRWYWx1ZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZyBjb3VudCA9IDBMOwotICAgICAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlOiBjZnMuZ2V0U1NUYWJsZXMoU1NUYWJsZVNldC5MSVZFKSkKLSAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gc3N0YWJsZS5nZXRCbG9vbUZpbHRlckZhbHNlUG9zaXRpdmVDb3VudCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJlY2VudEJsb29tRmlsdGVyRmFsc2VQb3NpdGl2ZXMgPSBjcmVhdGVUYWJsZUdhdWdlKCJSZWNlbnRCbG9vbUZpbHRlckZhbHNlUG9zaXRpdmVzIiwgbmV3IEdhdWdlPExvbmc+KCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIExvbmcgZ2V0VmFsdWUoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvbmcgY291bnQgPSAwTDsKLSAgICAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGNmcy5nZXRTU1RhYmxlcyhTU1RhYmxlU2V0LkxJVkUpKQotICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBzc3RhYmxlLmdldFJlY2VudEJsb29tRmlsdGVyRmFsc2VQb3NpdGl2ZUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgYmxvb21GaWx0ZXJGYWxzZVJhdGlvID0gY3JlYXRlVGFibGVHYXVnZSgiQmxvb21GaWx0ZXJGYWxzZVJhdGlvIiwgbmV3IEdhdWdlPERvdWJsZT4oKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgRG91YmxlIGdldFZhbHVlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25nIGZhbHNlUG9zaXRpdmVDb3VudCA9IDBMOwotICAgICAgICAgICAgICAgIGxvbmcgdHJ1ZVBvc2l0aXZlQ291bnQgPSAwTDsKLSAgICAgICAgICAgICAgICBsb25nIHRydWVOZWdhdGl2ZUNvdW50ID0gMEw7Ci0gICAgICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBjZnMuZ2V0U1NUYWJsZXMoU1NUYWJsZVNldC5MSVZFKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZhbHNlUG9zaXRpdmVDb3VudCArPSBzc3RhYmxlLmdldEJsb29tRmlsdGVyRmFsc2VQb3NpdGl2ZUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIHRydWVQb3NpdGl2ZUNvdW50ICs9IHNzdGFibGUuZ2V0Qmxvb21GaWx0ZXJUcnVlUG9zaXRpdmVDb3VudCgpOwotICAgICAgICAgICAgICAgICAgICB0cnVlTmVnYXRpdmVDb3VudCArPSBzc3RhYmxlLmdldEJsb29tRmlsdGVyVHJ1ZU5lZ2F0aXZlQ291bnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGZhbHNlUG9zaXRpdmVDb3VudCA9PSAwTCAmJiB0cnVlUG9zaXRpdmVDb3VudCA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBkOwotICAgICAgICAgICAgICAgIHJldHVybiAoZG91YmxlKSBmYWxzZVBvc2l0aXZlQ291bnQgLyAodHJ1ZVBvc2l0aXZlQ291bnQgKyBmYWxzZVBvc2l0aXZlQ291bnQgKyB0cnVlTmVnYXRpdmVDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIG5ldyBHYXVnZTxEb3VibGU+KCkgLy8gZ2xvYmFsIGdhdWdlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBEb3VibGUgZ2V0VmFsdWUoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvbmcgZmFsc2VQb3NpdGl2ZUNvdW50ID0gMEw7Ci0gICAgICAgICAgICAgICAgbG9uZyB0cnVlUG9zaXRpdmVDb3VudCA9IDBMOwotICAgICAgICAgICAgICAgIGxvbmcgdHJ1ZU5lZ2F0aXZlQ291bnQgPSAwTDsKLSAgICAgICAgICAgICAgICBmb3IgKEtleXNwYWNlIGtleXNwYWNlIDogS2V5c3BhY2UuYWxsKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGtleXNwYWNlLmdldEFsbFNTVGFibGVzKFNTVGFibGVTZXQuTElWRSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlUG9zaXRpdmVDb3VudCArPSBzc3RhYmxlLmdldEJsb29tRmlsdGVyRmFsc2VQb3NpdGl2ZUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlUG9zaXRpdmVDb3VudCArPSBzc3RhYmxlLmdldEJsb29tRmlsdGVyVHJ1ZVBvc2l0aXZlQ291bnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWVOZWdhdGl2ZUNvdW50ICs9IHNzdGFibGUuZ2V0Qmxvb21GaWx0ZXJUcnVlTmVnYXRpdmVDb3VudCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChmYWxzZVBvc2l0aXZlQ291bnQgPT0gMEwgJiYgdHJ1ZVBvc2l0aXZlQ291bnQgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwZDsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGRvdWJsZSkgZmFsc2VQb3NpdGl2ZUNvdW50IC8gKHRydWVQb3NpdGl2ZUNvdW50ICsgZmFsc2VQb3NpdGl2ZUNvdW50ICsgdHJ1ZU5lZ2F0aXZlQ291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmVjZW50Qmxvb21GaWx0ZXJGYWxzZVJhdGlvID0gY3JlYXRlVGFibGVHYXVnZSgiUmVjZW50Qmxvb21GaWx0ZXJGYWxzZVJhdGlvIiwgbmV3IEdhdWdlPERvdWJsZT4oKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgRG91YmxlIGdldFZhbHVlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25nIGZhbHNlUG9zaXRpdmVDb3VudCA9IDBMOwotICAgICAgICAgICAgICAgIGxvbmcgdHJ1ZVBvc2l0aXZlQ291bnQgPSAwTDsKLSAgICAgICAgICAgICAgICBsb25nIHRydWVOZWdhdGl2ZUNvdW50ID0gMEw7Ci0gICAgICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGU6IGNmcy5nZXRTU1RhYmxlcyhTU1RhYmxlU2V0LkxJVkUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmFsc2VQb3NpdGl2ZUNvdW50ICs9IHNzdGFibGUuZ2V0UmVjZW50Qmxvb21GaWx0ZXJGYWxzZVBvc2l0aXZlQ291bnQoKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZVBvc2l0aXZlQ291bnQgKz0gc3N0YWJsZS5nZXRSZWNlbnRCbG9vbUZpbHRlclRydWVQb3NpdGl2ZUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIHRydWVOZWdhdGl2ZUNvdW50ICs9IHNzdGFibGUuZ2V0UmVjZW50Qmxvb21GaWx0ZXJUcnVlTmVnYXRpdmVDb3VudCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZmFsc2VQb3NpdGl2ZUNvdW50ID09IDBMICYmIHRydWVQb3NpdGl2ZUNvdW50ID09IDBMKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMGQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChkb3VibGUpIGZhbHNlUG9zaXRpdmVDb3VudCAvICh0cnVlUG9zaXRpdmVDb3VudCArIGZhbHNlUG9zaXRpdmVDb3VudCArIHRydWVOZWdhdGl2ZUNvdW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgbmV3IEdhdWdlPERvdWJsZT4oKSAvLyBnbG9iYWwgZ2F1Z2UKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIERvdWJsZSBnZXRWYWx1ZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZyBmYWxzZVBvc2l0aXZlQ291bnQgPSAwTDsKLSAgICAgICAgICAgICAgICBsb25nIHRydWVQb3NpdGl2ZUNvdW50ID0gMEw7Ci0gICAgICAgICAgICAgICAgbG9uZyB0cnVlTmVnYXRpdmVDb3VudCA9IDBMOwotICAgICAgICAgICAgICAgIGZvciAoS2V5c3BhY2Uga2V5c3BhY2UgOiBLZXlzcGFjZS5hbGwoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDoga2V5c3BhY2UuZ2V0QWxsU1NUYWJsZXMoU1NUYWJsZVNldC5MSVZFKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2VQb3NpdGl2ZUNvdW50ICs9IHNzdGFibGUuZ2V0UmVjZW50Qmxvb21GaWx0ZXJGYWxzZVBvc2l0aXZlQ291bnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWVQb3NpdGl2ZUNvdW50ICs9IHNzdGFibGUuZ2V0UmVjZW50Qmxvb21GaWx0ZXJUcnVlUG9zaXRpdmVDb3VudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZU5lZ2F0aXZlQ291bnQgKz0gc3N0YWJsZS5nZXRSZWNlbnRCbG9vbUZpbHRlclRydWVOZWdhdGl2ZUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGZhbHNlUG9zaXRpdmVDb3VudCA9PSAwTCAmJiB0cnVlUG9zaXRpdmVDb3VudCA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBkOwotICAgICAgICAgICAgICAgIHJldHVybiAoZG91YmxlKSBmYWxzZVBvc2l0aXZlQ291bnQgLyAodHJ1ZVBvc2l0aXZlQ291bnQgKyBmYWxzZVBvc2l0aXZlQ291bnQgKyB0cnVlTmVnYXRpdmVDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBibG9vbUZpbHRlckRpc2tTcGFjZVVzZWQgPSBjcmVhdGVUYWJsZUdhdWdlKCJCbG9vbUZpbHRlckRpc2tTcGFjZVVzZWQiLCBuZXcgR2F1Z2U8TG9uZz4oKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgTG9uZyBnZXRWYWx1ZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZyB0b3RhbCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdCA6IGNmcy5nZXRTU1RhYmxlcyhTU1RhYmxlU2V0LkNBTk9OSUNBTCkpCi0gICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHNzdC5nZXRCbG9vbUZpbHRlclNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRvdGFsOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgYmxvb21GaWx0ZXJPZmZIZWFwTWVtb3J5VXNlZCA9IGNyZWF0ZVRhYmxlR2F1Z2UoIkJsb29tRmlsdGVyT2ZmSGVhcE1lbW9yeVVzZWQiLCBuZXcgR2F1Z2U8TG9uZz4oKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgTG9uZyBnZXRWYWx1ZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZyB0b3RhbCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdCA6IGNmcy5nZXRTU1RhYmxlcyhTU1RhYmxlU2V0LkxJVkUpKQotICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBzc3QuZ2V0Qmxvb21GaWx0ZXJPZmZIZWFwU2l6ZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0b3RhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGluZGV4U3VtbWFyeU9mZkhlYXBNZW1vcnlVc2VkID0gY3JlYXRlVGFibGVHYXVnZSgiSW5kZXhTdW1tYXJ5T2ZmSGVhcE1lbW9yeVVzZWQiLCBuZXcgR2F1Z2U8TG9uZz4oKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgTG9uZyBnZXRWYWx1ZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZyB0b3RhbCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdCA6IGNmcy5nZXRTU1RhYmxlcyhTU1RhYmxlU2V0LkxJVkUpKQotICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBzc3QuZ2V0SW5kZXhTdW1tYXJ5T2ZmSGVhcFNpemUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdG90YWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwogICAgICAgICBjb21wcmVzc2lvbk1ldGFkYXRhT2ZmSGVhcE1lbW9yeVVzZWQgPSBjcmVhdGVUYWJsZUdhdWdlKCJDb21wcmVzc2lvbk1ldGFkYXRhT2ZmSGVhcE1lbW9yeVVzZWQiLCBuZXcgR2F1Z2U8TG9uZz4oKQogICAgICAgICB7CiAgICAgICAgICAgICBwdWJsaWMgTG9uZyBnZXRWYWx1ZSgpCkBAIC04MzAsMzAgKzc2OCw2IEBACiAgICAgICAgIGFkZGl0aW9uYWxXcml0ZXMgPSBjcmVhdGVUYWJsZUNvdW50ZXIoIkFkZGl0aW9uYWxXcml0ZXMiKTsKICAgICAgICAgYWRkaXRpb25hbFdyaXRlTGF0ZW5jeU5hbm9zID0gY3JlYXRlVGFibGVHYXVnZSgiQWRkaXRpb25hbFdyaXRlTGF0ZW5jeU5hbm9zIiwgKCkgLT4gTUlDUk9TRUNPTkRTLnRvTmFub3MoY2ZzLmFkZGl0aW9uYWxXcml0ZUxhdGVuY3lNaWNyb3MpKTsKIAotICAgICAgICBrZXlDYWNoZUhpdFJhdGUgPSBjcmVhdGVUYWJsZUdhdWdlKCJLZXlDYWNoZUhpdFJhdGUiLCAiS2V5Q2FjaGVIaXRSYXRlIiwgbmV3IFJhdGlvR2F1Z2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBSYXRpbyBnZXRSYXRpbygpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFJhdGlvLm9mKGdldE51bWVyYXRvcigpLCBnZXREZW5vbWluYXRvcigpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJvdGVjdGVkIGRvdWJsZSBnZXROdW1lcmF0b3IoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvbmcgaGl0cyA9IDBMOwotICAgICAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogY2ZzLmdldFNTVGFibGVzKFNTVGFibGVTZXQuTElWRSkpCi0gICAgICAgICAgICAgICAgICAgIGhpdHMgKz0gc3N0YWJsZS5nZXRLZXlDYWNoZUhpdCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBoaXRzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcm90ZWN0ZWQgZG91YmxlIGdldERlbm9taW5hdG9yKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25nIHJlcXVlc3RzID0gMEw7Ci0gICAgICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBjZnMuZ2V0U1NUYWJsZXMoU1NUYWJsZVNldC5MSVZFKSkKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHMgKz0gc3N0YWJsZS5nZXRLZXlDYWNoZVJlcXVlc3QoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgocmVxdWVzdHMsIDEpOyAvLyB0byBhdm9pZCBOYU4uCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIG51bGwpOwogICAgICAgICB0b21ic3RvbmVTY2FubmVkSGlzdG9ncmFtID0gY3JlYXRlVGFibGVIaXN0b2dyYW0oIlRvbWJzdG9uZVNjYW5uZWRIaXN0b2dyYW0iLCBjZnMua2V5c3BhY2UubWV0cmljLnRvbWJzdG9uZVNjYW5uZWRIaXN0b2dyYW0sIGZhbHNlKTsKICAgICAgICAgbGl2ZVNjYW5uZWRIaXN0b2dyYW0gPSBjcmVhdGVUYWJsZUhpc3RvZ3JhbSgiTGl2ZVNjYW5uZWRIaXN0b2dyYW0iLCBjZnMua2V5c3BhY2UubWV0cmljLmxpdmVTY2FubmVkSGlzdG9ncmFtLCBmYWxzZSk7CiAgICAgICAgIGNvbFVwZGF0ZVRpbWVEZWx0YUhpc3RvZ3JhbSA9IGNyZWF0ZVRhYmxlSGlzdG9ncmFtKCJDb2xVcGRhdGVUaW1lRGVsdGFIaXN0b2dyYW0iLCBjZnMua2V5c3BhY2UubWV0cmljLmNvbFVwZGF0ZVRpbWVEZWx0YUhpc3RvZ3JhbSwgZmFsc2UpOwpAQCAtOTQ0LDYgKzg1OCw4IEBACiAgICAgICAgIHJvd0luZGV4U2l6ZVdhcm5pbmdzID0gY3JlYXRlVGFibGVNZXRlcigiUm93SW5kZXhTaXplV2FybmluZ3MiLCBjZnMua2V5c3BhY2UubWV0cmljLnJvd0luZGV4U2l6ZVdhcm5pbmdzKTsKICAgICAgICAgcm93SW5kZXhTaXplQWJvcnRzID0gY3JlYXRlVGFibGVNZXRlcigiUm93SW5kZXhTaXplQWJvcnRzIiwgY2ZzLmtleXNwYWNlLm1ldHJpYy5yb3dJbmRleFNpemVBYm9ydHMpOwogICAgICAgICByb3dJbmRleFNpemUgPSBjcmVhdGVUYWJsZUhpc3RvZ3JhbSgiUm93SW5kZXhTaXplIiwgY2ZzLmtleXNwYWNlLm1ldHJpYy5yb3dJbmRleFNpemUsIGZhbHNlKTsKKworICAgICAgICBmb3JtYXRTcGVjaWZpY0dhdWdlcyA9IGNyZWF0ZUZvcm1hdFNwZWNpZmljR2F1Z2VzKGNmcyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBNZW10YWJsZS5NZW1vcnlVc2FnZSBnZXRNZW1vcnlVc2FnZVdpdGhJbmRleGVzKENvbHVtbkZhbWlseVN0b3JlIGNmcykKQEAgLTk2MCw2ICs4NzYsMTEgQEAKICAgICAgICAgc3N0YWJsZXNQZXJSZWFkSGlzdG9ncmFtLnVwZGF0ZShjb3VudCk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdXBkYXRlU1NUYWJsZUl0ZXJhdGVkSW5SYW5nZVJlYWQoaW50IGNvdW50KQorICAgIHsKKyAgICAgICAgc3N0YWJsZXNQZXJSYW5nZVJlYWRIaXN0b2dyYW0udXBkYXRlKGNvdW50KTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZWxlYXNlIGFsbCBhc3NvY2lhdGVkIG1ldHJpY3MuCiAgICAgICovCkBAIC05NzEsNiArODkyLDIyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIEltbXV0YWJsZU1hcDxTU1RhYmxlRm9ybWF0PD8sID8+LCBJbW11dGFibGVNYXA8U3RyaW5nLCBHYXVnZTw/IGV4dGVuZHMgTnVtYmVyPj4+IGNyZWF0ZUZvcm1hdFNwZWNpZmljR2F1Z2VzKENvbHVtbkZhbWlseVN0b3JlIGNmcykKKyAgICB7CisgICAgICAgIEltbXV0YWJsZU1hcC5CdWlsZGVyPFNTVGFibGVGb3JtYXQ8PywgPz4sIEltbXV0YWJsZU1hcDxTdHJpbmcsIEdhdWdlPD8gZXh0ZW5kcyBOdW1iZXI+Pj4gYnVpbGRlciA9IEltbXV0YWJsZU1hcC5idWlsZGVyKCk7CisgICAgICAgIGZvciAoU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXQgOiBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U1NUYWJsZUZvcm1hdHMoKS52YWx1ZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgSW1tdXRhYmxlTWFwLkJ1aWxkZXI8U3RyaW5nLCBHYXVnZTw/IGV4dGVuZHMgTnVtYmVyPj4gZ2F1Z2VzID0gSW1tdXRhYmxlTWFwLmJ1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvciAoR2F1Z2VQcm92aWRlcjw/PiBnYXVnZVByb3ZpZGVyIDogZm9ybWF0LmdldEZvcm1hdFNwZWNpZmljTWV0cmljc1Byb3ZpZGVycygpLmdldEdhdWdlUHJvdmlkZXJzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR2F1Z2U8PyBleHRlbmRzIE51bWJlcj4gZ2F1Z2UgPSBjcmVhdGVUYWJsZUdhdWdlKGdhdWdlUHJvdmlkZXIubmFtZSwgZ2F1Z2VQcm92aWRlci5nZXRUYWJsZUdhdWdlKGNmcyksIGdhdWdlUHJvdmlkZXIuZ2V0R2xvYmFsR2F1Z2UoKSk7CisgICAgICAgICAgICAgICAgZ2F1Z2VzLnB1dChnYXVnZVByb3ZpZGVyLm5hbWUsIGdhdWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1aWxkZXIucHV0KGZvcm1hdCwgZ2F1Z2VzLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgZ2F1Z2UgdGhhdCB3aWxsIGJlIHBhcnQgb2YgYSBtZXJnZWQgdmVyc2lvbiBvZiBhbGwgY29sdW1uIGZhbWlsaWVzLiAgVGhlIGdsb2JhbCBnYXVnZQogICAgICAqIHdpbGwgbWVyZ2UgZWFjaCBDRiBnYXVnZSBieSBhZGRpbmcgdGhlaXIgdmFsdWVzCkBAIC0xMDk3LDYgKzEwMzQsNyBAQAogICAgICAgICAgICAgICAgIC8vIHVzaW5nIFNTVGFibGVTZXQuQ0FOT05JQ0FMLgogICAgICAgICAgICAgICAgIGFzc2VydCBzc3RhYmxlLm9wZW5SZWFzb24gIT0gU1NUYWJsZVJlYWRlci5PcGVuUmVhc29uLkVBUkxZOwogCisgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhIGNvbXByZXNzaW9uTWV0YWRhdGEgPSBzc3RhYmxlLmdldENvbXByZXNzaW9uTWV0YWRhdGEoKTsKICAgICAgICAgICAgICAgICBjb21wcmVzc2VkTGVuZ3RoU3VtICs9IGNvbXByZXNzaW9uTWV0YWRhdGEuY29tcHJlc3NlZEZpbGVMZW5ndGg7CiAgICAgICAgICAgICAgICAgZGF0YUxlbmd0aFN1bSArPSBjb21wcmVzc2lvbk1ldGFkYXRhLmRhdGFMZW5ndGg7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL1RvcFBhcnRpdGlvblRyYWNrZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvVG9wUGFydGl0aW9uVHJhY2tlci5qYXZhCmluZGV4IDU2YTg2MGEuLjZlYzBjNDEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvVG9wUGFydGl0aW9uVHJhY2tlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvVG9wUGFydGl0aW9uVHJhY2tlci5qYXZhCkBAIC00NSw3ICs0NSw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJhbnNmb3JtLlRyYW5zZm9ybWF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiAKQEAgLTIzOCw3ICsyMzcsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKIAogICAgICAgICAgICAgaWYgKHRvcC5zaXplKCkgPCBtYXhUb3BQYXJ0aXRpb25Db3VudCB8fCB2YWx1ZSA+IGN1cnJlbnRNaW5WYWx1ZSkKLSAgICAgICAgICAgICAgICB0cmFjayhuZXcgVG9wUGFydGl0aW9uKFNTVGFibGUuZ2V0TWluaW1hbEtleShrZXkpLCB2YWx1ZSkpOworICAgICAgICAgICAgICAgIHRyYWNrKG5ldyBUb3BQYXJ0aXRpb24oa2V5LnJldGFpbmFibGUoKSwgdmFsdWUpKTsKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgdm9pZCB0cmFjayhUb3BQYXJ0aXRpb24gdHApCkBAIC00MDQsNCArNDAzLDQgQEAKICAgICAgICAgICAgIHRoaXMubGFzdFVwZGF0ZWQgPSBsYXN0VXBkYXRlZDsKICAgICAgICAgfQogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL1RyaWVNZW10YWJsZU1ldHJpY3NWaWV3LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL1RyaWVNZW10YWJsZU1ldHJpY3NWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM0MzUwMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvVHJpZU1lbXRhYmxlTWV0cmljc1ZpZXcuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M7CisKK2ltcG9ydCBjb20uY29kYWhhbGUubWV0cmljcy5Db3VudGVyOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2Fzc2FuZHJhTWV0cmljc1JlZ2lzdHJ5Lk1ldHJpY3M7CisKK3B1YmxpYyBjbGFzcyBUcmllTWVtdGFibGVNZXRyaWNzVmlldworeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTkNPTlRFTkRFRF9QVVRTID0gIlVuY29udGVuZGVkIG1lbXRhYmxlIHB1dHMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5ERURfUFVUUyA9ICJDb250ZW5kZWQgbWVtdGFibGUgcHV0cyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRJT05fVElNRSA9ICJDb250ZW50aW9uIHRpbWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX0ZMVVNIX1NIQVJEX1NJWkVTID0gIlNoYXJkIHNpemVzIGR1cmluZyBsYXN0IGZsdXNoIjsKKworICAgIC8vIHRoZSBudW1iZXIgb2YgbWVtdGFibGUgcHV0cyB0aGF0IGRpZCBub3QgbmVlZCB0byB3YWl0IG9uIHdyaXRlIGxvY2sKKyAgICBwdWJsaWMgZmluYWwgQ291bnRlciB1bmNvbnRlbmRlZFB1dHM7CisKKyAgICAvLyB0aGUgbnVtYmVyIG9mIG1lbXRhYmxlIHB1dHMgdGhhdCBuZWVkZWQgdG8gd2FpdCBvbiB3cml0ZSBsb2NrCisgICAgcHVibGljIGZpbmFsIENvdW50ZXIgY29udGVuZGVkUHV0czsKKworICAgIC8vIHNoYXJkIHB1dCBjb250ZW50aW9uIG1lYXN1cmVtZW50cworICAgIHB1YmxpYyBmaW5hbCBMYXRlbmN5TWV0cmljcyBjb250ZW50aW9uVGltZTsKKworICAgIC8vIHNoYXJkIHNpemVzIGRpc3RyaWJ1dGlvbgorICAgIHB1YmxpYyBmaW5hbCBNaW5NYXhBdmdNZXRyaWMgbGFzdEZsdXNoU2hhcmREYXRhU2l6ZXM7CisKKyAgICBwcml2YXRlIGZpbmFsIFRyaWVNZW10YWJsZU1ldHJpY05hbWVGYWN0b3J5IGZhY3Rvcnk7CisKKyAgICBwdWJsaWMgVHJpZU1lbXRhYmxlTWV0cmljc1ZpZXcoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUpCisgICAgeworICAgICAgICBmYWN0b3J5ID0gbmV3IFRyaWVNZW10YWJsZU1ldHJpY05hbWVGYWN0b3J5KGtleXNwYWNlLCB0YWJsZSk7CisgICAgICAgIAorICAgICAgICB1bmNvbnRlbmRlZFB1dHMgPSBNZXRyaWNzLmNvdW50ZXIoZmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKFVOQ09OVEVOREVEX1BVVFMpKTsKKyAgICAgICAgY29udGVuZGVkUHV0cyA9IE1ldHJpY3MuY291bnRlcihmYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUoQ09OVEVOREVEX1BVVFMpKTsKKyAgICAgICAgY29udGVudGlvblRpbWUgPSBuZXcgTGF0ZW5jeU1ldHJpY3MoZmFjdG9yeSwgQ09OVEVOVElPTl9USU1FKTsKKyAgICAgICAgbGFzdEZsdXNoU2hhcmREYXRhU2l6ZXMgPSBuZXcgTWluTWF4QXZnTWV0cmljKGZhY3RvcnksIExBU1RfRkxVU0hfU0hBUkRfU0laRVMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKQorICAgIHsKKyAgICAgICAgTWV0cmljcy5yZW1vdmUoZmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKFVOQ09OVEVOREVEX1BVVFMpKTsKKyAgICAgICAgTWV0cmljcy5yZW1vdmUoZmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKENPTlRFTkRFRF9QVVRTKSk7CisgICAgICAgIGNvbnRlbnRpb25UaW1lLnJlbGVhc2UoKTsKKyAgICAgICAgbGFzdEZsdXNoU2hhcmREYXRhU2l6ZXMucmVsZWFzZSgpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBUcmllTWVtdGFibGVNZXRyaWNOYW1lRmFjdG9yeSBpbXBsZW1lbnRzIE1ldHJpY05hbWVGYWN0b3J5CisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBrZXlzcGFjZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGFibGU7CisKKyAgICAgICAgVHJpZU1lbXRhYmxlTWV0cmljTmFtZUZhY3RvcnkoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMua2V5c3BhY2UgPSBrZXlzcGFjZTsKKyAgICAgICAgICAgIHRoaXMudGFibGUgPSB0YWJsZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDYXNzYW5kcmFNZXRyaWNzUmVnaXN0cnkuTWV0cmljTmFtZSBjcmVhdGVNZXRyaWNOYW1lKFN0cmluZyBtZXRyaWNOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgZ3JvdXBOYW1lID0gVGFibGVNZXRyaWNzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7CisgICAgICAgICAgICBTdHJpbmcgdHlwZSA9ICJUcmllTWVtdGFibGUiOworCisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIG1iZWFuTmFtZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBtYmVhbk5hbWUuYXBwZW5kKGdyb3VwTmFtZSkuYXBwZW5kKCI6Iik7CisgICAgICAgICAgICBtYmVhbk5hbWUuYXBwZW5kKCJ0eXBlPSIpLmFwcGVuZCh0eXBlKTsKKyAgICAgICAgICAgIG1iZWFuTmFtZS5hcHBlbmQoIixrZXlzcGFjZT0iKS5hcHBlbmQoa2V5c3BhY2UpOworICAgICAgICAgICAgbWJlYW5OYW1lLmFwcGVuZCgiLHNjb3BlPSIpLmFwcGVuZCh0YWJsZSk7CisgICAgICAgICAgICBtYmVhbk5hbWUuYXBwZW5kKCIsbmFtZT0iKS5hcHBlbmQobWV0cmljTmFtZSk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2Fzc2FuZHJhTWV0cmljc1JlZ2lzdHJ5Lk1ldHJpY05hbWUoZ3JvdXBOYW1lLCB0eXBlLCBtZXRyaWNOYW1lLCBrZXlzcGFjZSArICIuIiArIHRhYmxlLCBtYmVhbk5hbWUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvQ3VzdG9tUGFyYW1zU2VyaWFsaXplci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0N1c3RvbVBhcmFtc1NlcmlhbGl6ZXIuamF2YQppbmRleCBhODY2NjUxLi5jNmM3MmZlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvQ3VzdG9tUGFyYW1zU2VyaWFsaXplci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9DdXN0b21QYXJhbXNTZXJpYWxpemVyLmphdmEKQEAgLTM4LDcgKzM4LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoTWFwPFN0cmluZywgYnl0ZVtdPiB0LCBEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludCh0LnNpemUoKSk7CisgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKHQuc2l6ZSgpKTsKICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBieXRlW10+IGUgOiB0LmVudHJ5U2V0KCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIG91dC53cml0ZVVURihlLmdldEtleSgpKTsKQEAgLTYxLDcgKzYxLDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTWFwPFN0cmluZywgYnl0ZVtdPiBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBpbnQgZW50cmllcyA9IChpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgaW50IGVudHJpZXMgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKICAgICAgICAgTWFwPFN0cmluZywgYnl0ZVtdPiBjdXN0b21QYXJhbXMgPSBNYXBzLm5ld0hhc2hNYXBXaXRoRXhwZWN0ZWRTaXplKGVudHJpZXMpOwogCiAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGVudHJpZXMgOyArK2kpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvRm9yd2FyZGluZ0luZm8uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9Gb3J3YXJkaW5nSW5mby5qYXZhCmluZGV4IDc2ZTJhNzUuLjJlZTE5OWEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9Gb3J3YXJkaW5nSW5mby5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9Gb3J3YXJkaW5nSW5mby5qYXZhCkBAIC0xNywyMSArMTcsMjAgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQ7CiAKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpQ29uc3VtZXI7Ci0KIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5JbnRzOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLklWZXJzaW9uZWRTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OwogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaUNvbnN1bWVyOworCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0LlNlcmlhbGl6ZXIuaW5ldEFkZHJlc3NBbmRQb3J0U2VyaWFsaXplcjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2luZ1NlcnZpY2UuVkVSU0lPTl80MDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMudmludC5WSW50Q29kaW5nLmNvbXB1dGVVbnNpZ25lZFZJbnRTaXplOwpAQCAtODUsNyArODQsNyBAQAogCiAgICAgICAgICAgICBpbnQgY291bnQgPSBpZHMubGVuZ3RoOwogICAgICAgICAgICAgaWYgKHZlcnNpb24gPj0gVkVSU0lPTl80MCkKLSAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoY291bnQpOworICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGNvdW50KTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBvdXQud3JpdGVJbnQoY291bnQpOwogCkBAIC0xMTgsNyArMTE3LDcgQEAKIAogICAgICAgICBwdWJsaWMgRm9yd2FyZGluZ0luZm8gZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbiwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSB2ZXJzaW9uID49IFZFUlNJT05fNDAgPyBJbnRzLmNoZWNrZWRDYXN0KGluLnJlYWRVbnNpZ25lZFZJbnQoKSkgOiBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICBpbnQgY291bnQgPSB2ZXJzaW9uID49IFZFUlNJT05fNDAgPyBpbi5yZWFkVW5zaWduZWRWSW50MzIoKSA6IGluLnJlYWRJbnQoKTsKIAogICAgICAgICAgICAgbG9uZ1tdIGlkcyA9IG5ldyBsb25nW2NvdW50XTsKICAgICAgICAgICAgIExpc3Q8SW5ldEFkZHJlc3NBbmRQb3J0PiB0YXJnZXRzID0gbmV3IEFycmF5TGlzdDw+KGNvdW50KTsKQEAgLTEyNiw3ICsxMjUsNyBAQAogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRhcmdldHMuYWRkKGluZXRBZGRyZXNzQW5kUG9ydFNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIHZlcnNpb24pKTsKLSAgICAgICAgICAgICAgICBpZHNbaV0gPSB2ZXJzaW9uID49IFZFUlNJT05fNDAgPyBJbnRzLmNoZWNrZWRDYXN0KGluLnJlYWRVbnNpZ25lZFZJbnQoKSkgOiBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgaWRzW2ldID0gdmVyc2lvbiA+PSBWRVJTSU9OXzQwID8gaW4ucmVhZFVuc2lnbmVkVkludDMyKCkgOiBpbi5yZWFkSW50KCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBuZXcgRm9yd2FyZGluZ0luZm8odGFyZ2V0cywgaWRzKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9JbmJvdW5kQ29ubmVjdGlvbkluaXRpYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0luYm91bmRDb25uZWN0aW9uSW5pdGlhdG9yLmphdmEKaW5kZXggODA3ZDAyNi4uZTRkZTUyNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0luYm91bmRDb25uZWN0aW9uSW5pdGlhdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0luYm91bmRDb25uZWN0aW9uSW5pdGlhdG9yLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwogaW1wb3J0IGphdmEubmV0LlNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKQEAgLTQ2LDYgKzQ3LDcgQEAKIGltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmxvZ2dpbmcuTG9nZ2luZ0hhbmRsZXI7CiBpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5zc2wuU3NsQ29udGV4dDsKIGltcG9ydCBpby5uZXR0eS5oYW5kbGVyLnNzbC5Tc2xIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguSUludGVybm9kZUF1dGhlbnRpY2F0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRW5jcnlwdGlvbk9wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwpAQCAtNjAsNyArNjIsMTEgQEAKIAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuTWF0aC4qOwogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSUxMSVNFQ09ORFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguSUludGVybm9kZUF1dGhlbnRpY2F0b3IuSW50ZXJub2RlQ29ubmVjdGlvbkRpcmVjdGlvbi5JTkJPVU5EOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LkV4ZWN1dG9yRmFjdG9yeS5HbG9iYWwuZXhlY3V0b3JGYWN0b3J5OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuSW50ZXJub2RlQ29ubmVjdGlvblV0aWxzLkRJU0NBUkRfSEFORExFUl9OQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuSW50ZXJub2RlQ29ubmVjdGlvblV0aWxzLlNTTF9IQU5ETEVSX05BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5JbnRlcm5vZGVDb25uZWN0aW9uVXRpbHMuY2VydGlmaWNhdGVzOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZS4qOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuU29ja2V0RmFjdG9yeS5XSVJFVFJBQ0U7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5Tb2NrZXRGYWN0b3J5Lm5ld1NzbEhhbmRsZXI7CkBAIC0xMDIsNyArMTA4LDcgQEAKIAogICAgICAgICAgICAgcGlwZWxpbmVJbmplY3Rvci5hY2NlcHQocGlwZWxpbmUpOwogCi0gICAgICAgICAgICAvLyBvcmRlciBvZiBoYW5kbGVyczogc3NsIC0+IGxvZ2dlciAtPiBoYW5kc2hha2VIYW5kbGVyCisgICAgICAgICAgICAvLyBvcmRlciBvZiBoYW5kbGVyczogc3NsIC0+IGNsaWVudC1hdXRoZW50aWNhdGlvbiAtPiBsb2dnZXIgLT4gaGFuZHNoYWtlSGFuZGxlcgogICAgICAgICAgICAgLy8gRm9yIGVpdGhlciB1bmVuY3J5cHRlZCBvciB0cmFuc2l0aW9uYWwgbW9kZXMsIGFsbG93IFNzbCBvcHRpb25hbGx5LgogICAgICAgICAgICAgc3dpdGNoKHNldHRpbmdzLmVuY3J5cHRpb24udGxzRW5jcnlwdGlvblBvbGljeSgpKQogICAgICAgICAgICAgewpAQCAtMTExLDE0ICsxMTcsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUuYWRkQWZ0ZXIoUElQRUxJTkVfSU5URVJOT0RFX0VSUk9SX0VYQ0xVU0lPTlMsICJyZWplY3Rzc2wiLCBuZXcgUmVqZWN0U3NsSGFuZGxlcigpKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBPUFRJT05BTDoKLSAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUuYWRkQWZ0ZXIoUElQRUxJTkVfSU5URVJOT0RFX0VSUk9SX0VYQ0xVU0lPTlMsICJzc2wiLCBuZXcgT3B0aW9uYWxTc2xIYW5kbGVyKHNldHRpbmdzLmVuY3J5cHRpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUuYWRkQWZ0ZXIoUElQRUxJTkVfSU5URVJOT0RFX0VSUk9SX0VYQ0xVU0lPTlMsIFNTTF9IQU5ETEVSX05BTUUsIG5ldyBPcHRpb25hbFNzbEhhbmRsZXIoc2V0dGluZ3MuZW5jcnlwdGlvbikpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIEVOQ1JZUFRFRDoKICAgICAgICAgICAgICAgICAgICAgU3NsSGFuZGxlciBzc2xIYW5kbGVyID0gZ2V0U3NsSGFuZGxlcigiY3JlYXRpbmciLCBjaGFubmVsLCBzZXR0aW5ncy5lbmNyeXB0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUuYWRkQWZ0ZXIoUElQRUxJTkVfSU5URVJOT0RFX0VSUk9SX0VYQ0xVU0lPTlMsICJzc2wiLCBzc2xIYW5kbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUuYWRkQWZ0ZXIoUElQRUxJTkVfSU5URVJOT0RFX0VSUk9SX0VYQ0xVU0lPTlMsIFNTTF9IQU5ETEVSX05BTUUsIHNzbEhhbmRsZXIpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gUGlwZWxpbmUgZm9yIHBlcmZvcm1pbmcgY2xpZW50IGF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICBwaXBlbGluZS5hZGRMYXN0KCJjbGllbnQtYXV0aGVudGljYXRpb24iLCBuZXcgQ2xpZW50QXV0aGVudGljYXRpb25IYW5kbGVyKHNldHRpbmdzLmF1dGhlbnRpY2F0b3IpKTsKKwogICAgICAgICAgICAgaWYgKFdJUkVUUkFDRSkKICAgICAgICAgICAgICAgICBwaXBlbGluZS5hZGRMYXN0KCJsb2dnZXIiLCBuZXcgTG9nZ2luZ0hhbmRsZXIoTG9nTGV2ZWwuSU5GTykpOwogCkBAIC0xOTksNiArMjA4LDYxIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogSGFuZGxlciB0byBwZXJmb3JtIGF1dGhlbnRpY2F0aW9uIGZvciBpbnRlcm5vZGUgaW5ib3VuZCBjb25uZWN0aW9ucy4KKyAgICAgKiBUaGlzIGhhbmRsZXIgaXMgY2FsbGVkIGV2ZW4gYmVmb3JlIG1lc3NhZ2luZyBoYW5kc2hha2Ugc3RhcnRzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENsaWVudEF1dGhlbnRpY2F0aW9uSGFuZGxlciBleHRlbmRzIEJ5dGVUb01lc3NhZ2VEZWNvZGVyCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIElJbnRlcm5vZGVBdXRoZW50aWNhdG9yIGF1dGhlbnRpY2F0b3I7CisKKyAgICAgICAgcHVibGljIENsaWVudEF1dGhlbnRpY2F0aW9uSGFuZGxlcihJSW50ZXJub2RlQXV0aGVudGljYXRvciBhdXRoZW50aWNhdG9yKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmF1dGhlbnRpY2F0b3IgPSBhdXRoZW50aWNhdG9yOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGRlY29kZShDaGFubmVsSGFuZGxlckNvbnRleHQgY2hhbm5lbEhhbmRsZXJDb250ZXh0LCBCeXRlQnVmIGJ5dGVCdWYsIExpc3Q8T2JqZWN0PiBsaXN0KSB0aHJvd3MgRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEV4dHJhY3QgY2VydGlmaWNhdGVzIGZyb20gU1NMIGhhbmRsZXIoaGFuZGxlciB3aXRoIG5hbWUgInNzbCIpLgorICAgICAgICAgICAgZmluYWwgQ2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMgPSBjZXJ0aWZpY2F0ZXMoY2hhbm5lbEhhbmRsZXJDb250ZXh0LmNoYW5uZWwoKSk7CisgICAgICAgICAgICBpZiAoIWF1dGhlbnRpY2F0ZShjaGFubmVsSGFuZGxlckNvbnRleHQuY2hhbm5lbCgpLnJlbW90ZUFkZHJlc3MoKSwgY2VydGlmaWNhdGVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlVuYWJsZSB0byBhdXRoZW50aWNhdGUgcGVlciB7fSBmb3IgaW50ZXJub2RlIGF1dGhlbnRpY2F0aW9uIiwgY2hhbm5lbEhhbmRsZXJDb250ZXh0LmNoYW5uZWwoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBUbyByZWxlYXNlIGFsbCB0aGUgcGVuZGluZyBidWZmZXJlZCBkYXRhLCByZXBsYWNlIGF1dGhlbnRpY2F0aW9uIGhhbmRsZXIgd2l0aCBkaXNjYXJkIGhhbmRsZXIuCisgICAgICAgICAgICAgICAgLy8gVGhpcyBhdm9pZHMgcGVuZGluZyBpbmJvdW5kIGRhdGEgdG8gYmUgZmlyZWQgdGhyb3VnaCB0aGUgcGlwZWxpbmUKKyAgICAgICAgICAgICAgICBjaGFubmVsSGFuZGxlckNvbnRleHQucGlwZWxpbmUoKS5yZXBsYWNlKHRoaXMsIERJU0NBUkRfSEFORExFUl9OQU1FLCBuZXcgSW50ZXJub2RlQ29ubmVjdGlvblV0aWxzLkJ5dGVCdWZEaXNjYXJkSGFuZGxlcigpKTsKKyAgICAgICAgICAgICAgICBjaGFubmVsSGFuZGxlckNvbnRleHQucGlwZWxpbmUoKS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYW5uZWxIYW5kbGVyQ29udGV4dC5waXBlbGluZSgpLnJlbW92ZSh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBhdXRoZW50aWNhdGUoU29ja2V0QWRkcmVzcyBzb2NrZXRBZGRyZXNzLCBmaW5hbCBDZXJ0aWZpY2F0ZVtdIGNlcnRpZmljYXRlcykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzb2NrZXRBZGRyZXNzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLmVxdWFscygiRW1iZWRkZWRTb2NrZXRBZGRyZXNzIikpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAgIGlmICghKHNvY2tldEFkZHJlc3MgaW5zdGFuY2VvZiBJbmV0U29ja2V0QWRkcmVzcykpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlVuZXhwZWN0ZWQgU29ja2V0QWRkcmVzcyB0eXBlOiAlcywgJXMiLCBzb2NrZXRBZGRyZXNzLmdldENsYXNzKCksIHNvY2tldEFkZHJlc3MpKTsKKworICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgYWRkciA9IChJbmV0U29ja2V0QWRkcmVzcykgc29ja2V0QWRkcmVzczsKKyAgICAgICAgICAgIGlmICghYXV0aGVudGljYXRvci5hdXRoZW50aWNhdGUoYWRkci5nZXRBZGRyZXNzKCksIGFkZHIuZ2V0UG9ydCgpLCBjZXJ0aWZpY2F0ZXMsIElOQk9VTkQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIExvZyBhdCBpbmZvIGxldmVsIGFzIGFueXRoaW5nIHRoYXQgY2FuIHJlYWNoIHRoZSBpbmJvdW5kIHBvcnQgY291bGQgaGl0IHRoaXMKKyAgICAgICAgICAgICAgICAvLyBhbmQgdHJpZ2dlciBhIGxvZyBvZiBub2lzZS4gIEZhaWxlZCBvdXRib3VuZCBjb25uZWN0aW9ucyB0byBrbm93biBjbHVzdGVyIGVuZHBvaW50cworICAgICAgICAgICAgICAgIC8vIHN0aWxsIGZhaWwgd2l0aCBhbiBFUlJPUiBtZXNzYWdlIGFuZCBleGNlcHRpb24gdG8gYWxlcnQgb3BlcmF0b3JzIHRoYXQgYXJlbid0IHdhdGNoaW5nIGxvZ3MgY2xvc2VseS4KKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiQXV0aGVudGljYXRlIHJlamVjdGVkIGluYm91bmQgaW50ZXJub2RlIGNvbm5lY3Rpb24gZnJvbSB7fSIsIGFkZHIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKICAgICAgKiAnU2VydmVyLXNpZGUnIGNvbXBvbmVudCB0aGF0IG5lZ290aWF0ZXMgdGhlIGludGVybm9kZSBoYW5kc2hha2Ugd2hlbiBlc3RhYmxpc2hpbmcgYSBuZXcgY29ubmVjdGlvbi4KICAgICAgKiBUaGlzIGhhbmRsZXIgd2lsbCBiZSB0aGUgZmlyc3QgaW4gdGhlIG5ldHR5IGNoYW5uZWwgZm9yIGVhY2ggaW5jb21pbmcgY29ubmVjdGlvbiAoc2VjdXJlIHNvY2tldCAoVExTKSBub3R3aXRoc3RhbmRpbmcpLAogICAgICAqIGFuZCBvbmNlIHRoZSBoYW5kc2hha2UgaXMgc3VjY2Vzc2Z1bCwgaXQgd2lsbCBjb25maWd1cmUgdGhlIHByb3BlciBoYW5kbGVycyAoe0BsaW5rIEluYm91bmRNZXNzYWdlSGFuZGxlcn0KQEAgLTIyMyw4ICsyODcsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIE9uIHJlZ2lzdHJhdGlvbiwgaW1tZWRpYXRlbHkgc2NoZWR1bGUgYSB0aW1lb3V0IHRvIGtpbGwgdGhpcyBjb25uZWN0aW9uIGlmIGl0IGRvZXMgbm90IGhhbmRzaGFrZSBwcm9tcHRseSwKLSAgICAgICAgICogYW5kIGF1dGhlbnRpY2F0ZSB0aGUgcmVtb3RlIGFkZHJlc3MuCisgICAgICAgICAqIE9uIHJlZ2lzdHJhdGlvbiwgaW1tZWRpYXRlbHkgc2NoZWR1bGUgYSB0aW1lb3V0IHRvIGtpbGwgdGhpcyBjb25uZWN0aW9uIGlmIGl0IGRvZXMgbm90IGhhbmRzaGFrZSBwcm9tcHRseS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZXJBZGRlZChDaGFubmVsSGFuZGxlckNvbnRleHQgY3R4KSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICAgIHsKQEAgLTIzMiwzMSArMjk1LDYgQEAKICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlRpbWVvdXQgaGFuZHNoYWtpbmcgd2l0aCB7fSAob24ge30pIiwgU29ja2V0RmFjdG9yeS5hZGRyZXNzSWQoaW5pdGlhdGUuZnJvbSwgKEluZXRTb2NrZXRBZGRyZXNzKSBjdHguY2hhbm5lbCgpLnJlbW90ZUFkZHJlc3MoKSksIHNldHRpbmdzLmJpbmRBZGRyZXNzKTsKICAgICAgICAgICAgICAgICBmYWlsSGFuZHNoYWtlKGN0eCk7CiAgICAgICAgICAgICB9LCBIYW5kc2hha2VQcm90b2NvbC5USU1FT1VUX01JTExJUywgTUlMTElTRUNPTkRTKTsKLQotICAgICAgICAgICAgaWYgKCFhdXRoZW50aWNhdGUoY3R4LmNoYW5uZWwoKS5yZW1vdGVBZGRyZXNzKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhaWxIYW5kc2hha2UoY3R4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBhdXRoZW50aWNhdGUoU29ja2V0QWRkcmVzcyBzb2NrZXRBZGRyZXNzKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNvY2tldEFkZHJlc3MuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkuZXF1YWxzKCJFbWJlZGRlZFNvY2tldEFkZHJlc3MiKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgaWYgKCEoc29ja2V0QWRkcmVzcyBpbnN0YW5jZW9mIEluZXRTb2NrZXRBZGRyZXNzKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiVW5leHBlY3RlZCBTb2NrZXRBZGRyZXNzIHR5cGU6ICVzLCAlcyIsIHNvY2tldEFkZHJlc3MuZ2V0Q2xhc3MoKSwgc29ja2V0QWRkcmVzcykpOwotCi0gICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBhZGRyID0gKEluZXRTb2NrZXRBZGRyZXNzKXNvY2tldEFkZHJlc3M7Ci0gICAgICAgICAgICBpZiAoIXNldHRpbmdzLmF1dGhlbnRpY2F0ZShhZGRyLmdldEFkZHJlc3MoKSwgYWRkci5nZXRQb3J0KCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIExvZyBhdCBpbmZvIGxldmVsIGFzIGFueXRoaW5nIHRoYXQgY2FuIHJlYWNoIHRoZSBpbmJvdW5kIHBvcnQgY291bGQgaGl0IHRoaXMKLSAgICAgICAgICAgICAgICAvLyBhbmQgdHJpZ2dlciBhIGxvZyBvZiBub2lzZS4gIEZhaWxlZCBvdXRib3VuZCBjb25uZWN0aW9ucyB0byBrbm93biBjbHVzdGVyIGVuZHBvaW50cwotICAgICAgICAgICAgICAgIC8vIHN0aWxsIGZhaWwgd2l0aCBhbiBFUlJPUiBtZXNzYWdlIGFuZCBleGNlcHRpb24gdG8gYWxlcnQgb3BlcmF0b3JzIHRoYXQgYXJlbid0IHdhdGNoaW5nIGxvZ3MgY2xvc2VseS4KLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiQXV0aGVudGljYXRlIHJlamVjdGVkIGluYm91bmQgaW50ZXJub2RlIGNvbm5lY3Rpb24gZnJvbSB7fSIsIGFkZHIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC01NzgsNyArNjE2LDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBDb25uZWN0aW9uIHVzZXMgU1NML1RMUywgcmVwbGFjZSB0aGUgZGV0ZWN0aW9uIGhhbmRsZXIgd2l0aCBhIFNzbEhhbmRsZXIgYW5kIHNvIHVzZSBlbmNyeXB0aW9uLgogICAgICAgICAgICAgICAgIFNzbEhhbmRsZXIgc3NsSGFuZGxlciA9IGdldFNzbEhhbmRsZXIoInJlcGxhY2luZyBvcHRpb25hbCIsIGN0eC5jaGFubmVsKCksIGVuY3J5cHRpb25PcHRpb25zKTsKLSAgICAgICAgICAgICAgICBjdHgucGlwZWxpbmUoKS5yZXBsYWNlKHRoaXMsICJzc2wiLCBzc2xIYW5kbGVyKTsKKyAgICAgICAgICAgICAgICBjdHgucGlwZWxpbmUoKS5yZXBsYWNlKHRoaXMsIFNTTF9IQU5ETEVSX05BTUUsIHNzbEhhbmRsZXIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0luYm91bmRDb25uZWN0aW9uU2V0dGluZ3MuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9JbmJvdW5kQ29ubmVjdGlvblNldHRpbmdzLmphdmEKaW5kZXggMmVhYjliYy4uNDQ4ZGE2MiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0luYm91bmRDb25uZWN0aW9uU2V0dGluZ3MuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvSW5ib3VuZENvbm5lY3Rpb25TZXR0aW5ncy5qYXZhCkBAIC0xOCw3ICsxOCw2IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0OwogCi1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOwpAQCAtNzEsMTYgKzcwLDYgQEAKICAgICAgICAgdGhpcyhudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBhdXRoZW50aWNhdGUoSW5ldEFkZHJlc3NBbmRQb3J0IGVuZHBvaW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGF1dGhlbnRpY2F0b3IuYXV0aGVudGljYXRlKGVuZHBvaW50LmdldEFkZHJlc3MoKSwgZW5kcG9pbnQuZ2V0UG9ydCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhdXRoZW50aWNhdGUoSW5ldEFkZHJlc3MgYWRkcmVzcywgaW50IHBvcnQpCi0gICAgewotICAgICAgICByZXR1cm4gYXV0aGVudGljYXRvci5hdXRoZW50aWNhdGUoYWRkcmVzcywgcG9ydCk7Ci0gICAgfQotCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCiAgICAgewogICAgICAgICByZXR1cm4gZm9ybWF0KCJhZGRyZXNzOiAoJXMpLCBuaWM6ICVzLCBlbmNyeXB0aW9uOiAlcyIsCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvSW50ZXJub2RlQ29ubmVjdGlvblV0aWxzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvSW50ZXJub2RlQ29ubmVjdGlvblV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQzZDFiZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9JbnRlcm5vZGVDb25uZWN0aW9uVXRpbHMuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldDsKKworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZENoYW5uZWxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgaW8ubmV0dHkuYnVmZmVyLkJ5dGVCdWY7CitpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsOworaW1wb3J0IGlvLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbEhhbmRsZXJDb250ZXh0OworaW1wb3J0IGlvLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbEluYm91bmRIYW5kbGVyQWRhcHRlcjsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLnNzbC5Tc2xIYW5kbGVyOworCisvKioKKyAqIENsYXNzIHRoYXQgY29udGFpbnMgY2VydGlmaWNhdGUgdXRpbGl0eSBtZXRob2RzLgorICovCitwdWJsaWMgY2xhc3MgSW50ZXJub2RlQ29ubmVjdGlvblV0aWxzCit7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU1NMX0hBTkRMRVJfTkFNRSA9ICJzc2wiOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERJU0NBUkRfSEFORExFUl9OQU1FID0gImRpc2NhcmQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihJbnRlcm5vZGVDb25uZWN0aW9uVXRpbHMuY2xhc3MpOworCisgICAgcHVibGljIHN0YXRpYyBDZXJ0aWZpY2F0ZVtdIGNlcnRpZmljYXRlcyhDaGFubmVsIGNoYW5uZWwpCisgICAgeworICAgICAgICBmaW5hbCBTc2xIYW5kbGVyIHNzbEhhbmRsZXIgPSAoU3NsSGFuZGxlcikgY2hhbm5lbC5waXBlbGluZSgpLmdldChTU0xfSEFORExFUl9OQU1FKTsKKyAgICAgICAgQ2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMgPSBudWxsOworICAgICAgICBpZiAoc3NsSGFuZGxlciAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZXMgPSBzc2xIYW5kbGVyLmVuZ2luZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTZXNzaW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBlZXJDZXJ0aWZpY2F0ZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiRmFpbGVkIHRvIGdldCBwZWVyIGNlcnRpZmljYXRlcyBmb3IgcGVlciB7fSIsIGNoYW5uZWwucmVtb3RlQWRkcmVzcygpLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2VydGlmaWNhdGVzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NTTEVycm9yKGZpbmFsIFRocm93YWJsZSBjYXVzZSkKKyAgICB7CisgICAgICAgIHJldHVybiAoY2F1c2UgaW5zdGFuY2VvZiBDbG9zZWRDaGFubmVsRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgJiYgY2F1c2UuZ2V0Q2F1c2UoKSA9PSBudWxsCisgICAgICAgICAgICAgICAmJiBjYXVzZS5nZXRTdGFja1RyYWNlKClbMF0uZ2V0Q2xhc3NOYW1lKCkuY29udGFpbnMoIlNzbEhhbmRsZXIiKQorICAgICAgICAgICAgICAgJiYgY2F1c2UuZ2V0U3RhY2tUcmFjZSgpWzBdLmdldE1ldGhvZE5hbWUoKS5jb250YWlucygiY2hhbm5lbEluYWN0aXZlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzY2FyZCBoYW5kbGVyIHJlbGVhc2VzIHRoZSByZWNlaXZlZCBkYXRhIHNpbGVudGx5LiB3aGVuIGludGVybm9kZSBhdXRoZW50aWNhdGlvbiBmYWlscywgdGhlIGNoYW5uZWwgaXMgY2xvc2VkLAorICAgICAqIGJ1dCB0aGUgcGVuZGluZyBidWZmZXJlZCBkYXRhIG1heSBzdGlsbCBiZSBmaXJlZCB0aHJvdWdoIHRoZSBwaXBlbGluZS4gVG8gYXZvaWQgdGhhdCwgYXV0aGVudGljYXRpb24gaGFuZGxlciBpcworICAgICAqIHJlcGxhY2VkIHdpdGggdGhpcyBEaXNjYXJkSGFuZGxlciB0byByZWxlYXNlIGFsbCB0aGUgYnVmZmVyZWQgZGF0YSwgdG8gYXZvaWQgaGFuZGxpbmcgdW5hdXRoZW50aWNhdGVkIGRhdGEgaW4gdGhlCisgICAgICogZm9sbG93aW5nIGhhbmRsZXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnl0ZUJ1ZkRpc2NhcmRIYW5kbGVyIGV4dGVuZHMgQ2hhbm5lbEluYm91bmRIYW5kbGVyQWRhcHRlcgorICAgIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNoYW5uZWxSZWFkKENoYW5uZWxIYW5kbGVyQ29udGV4dCBjdHgsIE9iamVjdCBtc2cpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtc2cgaW5zdGFuY2VvZiBCeXRlQnVmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICgoQnl0ZUJ1ZikgbXNnKS5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3R4LmZpcmVDaGFubmVsUmVhZChtc2cpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L01lc3NhZ2UuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9NZXNzYWdlLmphdmEKaW5kZXggMDllNGJhMy4uZmExNDEzNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L01lc3NhZ2UuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvTWVzc2FnZS5qYXZhCkBAIC0yNiwxNCArMjYsMTIgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIAotaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7Ci0KIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLkludHM7Ci0KIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuUmVxdWVzdEZhaWx1cmVSZWFzb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uSVZlcnNpb25lZEFzeW1tZXRyaWNTZXJpYWxpemVyOwpAQCAtNTAsMTkgKzQ4LDEzIEBACiAKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlOVVRFUzsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTkFOT1NFQ09ORFM7Ci0KIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzLnNpemVvZjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzLnNpemVvZlVuc2lnbmVkVkludDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQuU2VyaWFsaXplci5pbmV0QWRkcmVzc0FuZFBvcnRTZXJpYWxpemVyOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZS5WRVJTSU9OXzMwMTQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlLlZFUlNJT05fMzA7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlLlZFUlNJT05fNDA7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlLmluc3RhbmNlOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZS4qOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllcy5nZXRCcm9hZGNhc3RBZGRyZXNzQW5kUG9ydDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTW9ub3RvbmljQ2xvY2suR2xvYmFsLmFwcHJveFRpbWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnZpbnQuVkludENvZGluZy5jb21wdXRlVW5zaWduZWRWSW50U2l6ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMudmludC5WSW50Q29kaW5nLmdldFVuc2lnbmVkVkludDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMudmludC5WSW50Q29kaW5nLnNraXBVbnNpZ25lZFZJbnQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnZpbnQuVkludENvZGluZy4qOwogCiAvKioKICAqIEltbXV0YWJsZSBtYWluIHVuaXQgb2YgaW50ZXJub2RlIGNvbW11bmljYXRpb24gLSB3aGF0IHVzZWQgdG8gYmUge0Bjb2RlIE1lc3NhZ2VJbn0gYW5kIHtAY29kZSBNZXNzYWdlT3V0fSBmdXNlZApAQCAtNzg1LDggKzc3Nyw4IEBACiAgICAgICAgICAgICAvLyB0aGUgc2FtZSBiZXR3ZWVuIG5vdyBhbmQgd2hlbiB0aGUgcmVjaXBpZW50IHJlY29uc3RydWN0cyBpdC4KICAgICAgICAgICAgIG91dC53cml0ZUludCgoaW50KSBhcHByb3hUaW1lLnRyYW5zbGF0ZSgpLnRvTWlsbGlzU2luY2VFcG9jaChoZWFkZXIuY3JlYXRlZEF0TmFub3MpKTsKICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChOQU5PU0VDT05EUy50b01pbGxpcyhoZWFkZXIuZXhwaXJlc0F0TmFub3MgLSBoZWFkZXIuY3JlYXRlZEF0TmFub3MpKTsKLSAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChoZWFkZXIudmVyYi5pZCk7Ci0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoaGVhZGVyLmZsYWdzKTsKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGhlYWRlci52ZXJiLmlkKTsKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGhlYWRlci5mbGFncyk7CiAgICAgICAgICAgICBzZXJpYWxpemVQYXJhbXMoaGVhZGVyLnBhcmFtcywgb3V0LCB2ZXJzaW9uKTsKICAgICAgICAgfQogCkBAIC03OTcsOCArNzg5LDggQEAKICAgICAgICAgICAgIE1vbm90b25pY0Nsb2NrVHJhbnNsYXRpb24gdGltZVNuYXBzaG90ID0gYXBwcm94VGltZS50cmFuc2xhdGUoKTsKICAgICAgICAgICAgIGxvbmcgY3JlYXRpb25UaW1lTmFub3MgPSBjYWxjdWxhdGVDcmVhdGlvblRpbWVOYW5vcyhpbi5yZWFkSW50KCksIHRpbWVTbmFwc2hvdCwgY3VycmVudFRpbWVOYW5vcyk7CiAgICAgICAgICAgICBsb25nIGV4cGlyZXNBdE5hbm9zID0gZ2V0RXhwaXJlc0F0TmFub3MoY3JlYXRpb25UaW1lTmFub3MsIGN1cnJlbnRUaW1lTmFub3MsIFRpbWVVbml0Lk1JTExJU0VDT05EUy50b05hbm9zKGluLnJlYWRVbnNpZ25lZFZJbnQoKSkpOwotICAgICAgICAgICAgVmVyYiB2ZXJiID0gVmVyYi5mcm9tSWQoSW50cy5jaGVja2VkQ2FzdChpbi5yZWFkVW5zaWduZWRWSW50KCkpKTsKLSAgICAgICAgICAgIGludCBmbGFncyA9IEludHMuY2hlY2tlZENhc3QoaW4ucmVhZFVuc2lnbmVkVkludCgpKTsKKyAgICAgICAgICAgIFZlcmIgdmVyYiA9IFZlcmIuZnJvbUlkKGluLnJlYWRVbnNpZ25lZFZJbnQzMigpKTsKKyAgICAgICAgICAgIGludCBmbGFncyA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogICAgICAgICAgICAgTWFwPFBhcmFtVHlwZSwgT2JqZWN0PiBwYXJhbXMgPSBkZXNlcmlhbGl6ZVBhcmFtcyhpbiwgdmVyc2lvbik7CiAgICAgICAgICAgICByZXR1cm4gbmV3IEhlYWRlcihpZCwgdmVyYiwgcGVlciwgY3JlYXRpb25UaW1lTmFub3MsIGV4cGlyZXNBdE5hbm9zLCBmbGFncywgcGFyYW1zKTsKICAgICAgICAgfQpAQCAtODQwLDEwICs4MzIsMTAgQEAKICAgICAgICAgICAgIGxvbmcgZXhwaXJlc0luTWlsbGlzID0gZ2V0VW5zaWduZWRWSW50KGJ1ZiwgaW5kZXgpOwogICAgICAgICAgICAgaW5kZXggKz0gY29tcHV0ZVVuc2lnbmVkVkludFNpemUoZXhwaXJlc0luTWlsbGlzKTsKIAotICAgICAgICAgICAgVmVyYiB2ZXJiID0gVmVyYi5mcm9tSWQoSW50cy5jaGVja2VkQ2FzdChnZXRVbnNpZ25lZFZJbnQoYnVmLCBpbmRleCkpKTsKKyAgICAgICAgICAgIFZlcmIgdmVyYiA9IFZlcmIuZnJvbUlkKGdldFVuc2lnbmVkVkludDMyKGJ1ZiwgaW5kZXgpKTsKICAgICAgICAgICAgIGluZGV4ICs9IGNvbXB1dGVVbnNpZ25lZFZJbnRTaXplKHZlcmIuaWQpOwogCi0gICAgICAgICAgICBpbnQgZmxhZ3MgPSBJbnRzLmNoZWNrZWRDYXN0KGdldFVuc2lnbmVkVkludChidWYsIGluZGV4KSk7CisgICAgICAgICAgICBpbnQgZmxhZ3MgPSBnZXRVbnNpZ25lZFZJbnQzMihidWYsIGluZGV4KTsKICAgICAgICAgICAgIGluZGV4ICs9IGNvbXB1dGVVbnNpZ25lZFZJbnRTaXplKGZsYWdzKTsKIAogICAgICAgICAgICAgTWFwPFBhcmFtVHlwZSwgT2JqZWN0PiBwYXJhbXMgPSBleHRyYWN0UGFyYW1zKGJ1ZiwgaW5kZXgsIHZlcnNpb24pOwpAQCAtODU3LDcgKzg0OSw3IEBACiAgICAgICAgIHByaXZhdGUgPFQ+IHZvaWQgc2VyaWFsaXplUG9zdDQwKE1lc3NhZ2U8VD4gbWVzc2FnZSwgRGF0YU91dHB1dFBsdXMgb3V0LCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIHNlcmlhbGl6ZUhlYWRlclBvc3Q0MChtZXNzYWdlLmhlYWRlciwgb3V0LCB2ZXJzaW9uKTsKLSAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChtZXNzYWdlLnBheWxvYWRTaXplKHZlcnNpb24pKTsKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKG1lc3NhZ2UucGF5bG9hZFNpemUodmVyc2lvbikpOwogICAgICAgICAgICAgbWVzc2FnZS52ZXJiKCkuc2VyaWFsaXplcigpLnNlcmlhbGl6ZShtZXNzYWdlLnBheWxvYWQsIG91dCwgdmVyc2lvbik7CiAgICAgICAgIH0KIApAQCAtMTIyMSw3ICsxMjEzLDcgQEAKICAgICAgICAgcHJpdmF0ZSB2b2lkIHNlcmlhbGl6ZVBhcmFtcyhNYXA8UGFyYW1UeXBlLCBPYmplY3Q+IHBhcmFtcywgRGF0YU91dHB1dFBsdXMgb3V0LCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICh2ZXJzaW9uID49IFZFUlNJT05fNDApCi0gICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHBhcmFtcy5zaXplKCkpOworICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKHBhcmFtcy5zaXplKCkpOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIG91dC53cml0ZUludChwYXJhbXMuc2l6ZSgpKTsKIApAQCAtMTIyOSw3ICsxMjIxLDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBQYXJhbVR5cGUgdHlwZSA9IGt2LmdldEtleSgpOwogICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID49IFZFUlNJT05fNDApCi0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludCh0eXBlLmlkKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIodHlwZS5pZCk7CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVVEYodHlwZS5sZWdhY3lBbGlhcyk7CiAKQEAgLTEyMzgsNyArMTIzMCw3IEBACiAKICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gSW50cy5jaGVja2VkQ2FzdChzZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKHZhbHVlLCB2ZXJzaW9uKSk7CiAgICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gPj0gVkVSU0lPTl80MCkKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGxlbmd0aCk7CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVJbnQobGVuZ3RoKTsKIApAQCAtMTI0OCw3ICsxMjQwLDcgQEAKIAogICAgICAgICBwcml2YXRlIE1hcDxQYXJhbVR5cGUsIE9iamVjdD4gZGVzZXJpYWxpemVQYXJhbXMoRGF0YUlucHV0UGx1cyBpbiwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSB2ZXJzaW9uID49IFZFUlNJT05fNDAgPyBJbnRzLmNoZWNrZWRDYXN0KGluLnJlYWRVbnNpZ25lZFZJbnQoKSkgOiBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICBpbnQgY291bnQgPSB2ZXJzaW9uID49IFZFUlNJT05fNDAgPyBpbi5yZWFkVW5zaWduZWRWSW50MzIoKSA6IGluLnJlYWRJbnQoKTsKIAogICAgICAgICAgICAgaWYgKGNvdW50ID09IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX1BBUkFNUzsKQEAgLTEyNTgsMTEgKzEyNTAsMTEgQEAKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBQYXJhbVR5cGUgdHlwZSA9IHZlcnNpb24gPj0gVkVSU0lPTl80MAotICAgICAgICAgICAgICAgICAgICA/IFBhcmFtVHlwZS5sb29rVXBCeUlkKEludHMuY2hlY2tlZENhc3QoaW4ucmVhZFVuc2lnbmVkVkludCgpKSkKKyAgICAgICAgICAgICAgICAgICAgPyBQYXJhbVR5cGUubG9va1VwQnlJZChpbi5yZWFkVW5zaWduZWRWSW50MzIoKSkKICAgICAgICAgICAgICAgICAgICAgOiBQYXJhbVR5cGUubG9va1VwQnlBbGlhcyhpbi5yZWFkVVRGKCkpOwogCiAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IHZlcnNpb24gPj0gVkVSU0lPTl80MAotICAgICAgICAgICAgICAgICAgICA/IEludHMuY2hlY2tlZENhc3QoaW4ucmVhZFVuc2lnbmVkVkludCgpKQorICAgICAgICAgICAgICAgICAgICA/IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpCiAgICAgICAgICAgICAgICAgICAgIDogaW4ucmVhZEludCgpOwogCiAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdHlwZSkKQEAgLTEzMTEsMTIgKzEzMDMsMTIgQEAKIAogICAgICAgICBwcml2YXRlIHZvaWQgc2tpcFBhcmFtc1Bvc3Q0MChEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewotICAgICAgICAgICAgaW50IGNvdW50ID0gSW50cy5jaGVja2VkQ2FzdChpbi5yZWFkVW5zaWduZWRWSW50KCkpOworICAgICAgICAgICAgaW50IGNvdW50ID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBza2lwVW5zaWduZWRWSW50KGluKTsKLSAgICAgICAgICAgICAgICBpbi5za2lwQnl0ZXNGdWxseShJbnRzLmNoZWNrZWRDYXN0KGluLnJlYWRVbnNpZ25lZFZJbnQoKSkpOworICAgICAgICAgICAgICAgIGluLnNraXBCeXRlc0Z1bGx5KGluLnJlYWRVbnNpZ25lZFZJbnQzMigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvTWVzc2FnaW5nU2VydmljZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L01lc3NhZ2luZ1NlcnZpY2UuamF2YQppbmRleCBiYzM5MDU2Li5jMjNjNmFmIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvTWVzc2FnaW5nU2VydmljZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9NZXNzYWdpbmdTZXJ2aWNlLmphdmEKQEAgLTIwLDEwICsyMCwxMyBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIApAQCAtMjA4LDExICsyMTEsMjcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzMwID0gMTA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8zMDE0ID0gMTE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl80MCA9IDEyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fNDEgPSAxMzsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBtaW5pbXVtX3ZlcnNpb24gPSBWRVJTSU9OXzMwOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGN1cnJlbnRfdmVyc2lvbiA9IFZFUlNJT05fNDA7CiAgICAgc3RhdGljIEFjY2VwdFZlcnNpb25zIGFjY2VwdF9tZXNzYWdpbmcgPSBuZXcgQWNjZXB0VmVyc2lvbnMobWluaW11bV92ZXJzaW9uLCBjdXJyZW50X3ZlcnNpb24pOwogICAgIHN0YXRpYyBBY2NlcHRWZXJzaW9ucyBhY2NlcHRfc3RyZWFtaW5nID0gbmV3IEFjY2VwdFZlcnNpb25zKGN1cnJlbnRfdmVyc2lvbiwgY3VycmVudF92ZXJzaW9uKTsKKyAgICBzdGF0aWMgTWFwPEludGVnZXIsIEludGVnZXI+IHZlcnNpb25PcmRpbmFsTWFwID0gQXJyYXlzLnN0cmVhbShWZXJzaW9uLnZhbHVlcygpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAodiAtPiB2LnZhbHVlLCB2IC0+IHYub3JkaW5hbCgpKSk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGFuIG9wdGltaXNhdGlvbiB0byBzcGVlZCB1cCB0aGUgdHJhbnNsYXRpb24gb2YgdGhlIHNlcmlhbGl6YXRpb24KKyAgICAgKiB2ZXJzaW9uIHRvIHRoZSB7QGxpbmsgVmVyc2lvbn0gZW51bSBvcmRpbmFsLgorICAgICAqCisgICAgICogQHBhcmFtIHZlcnNpb24gdGhlIHNlcmlhbGl6YXRpb24gdmVyc2lvbgorICAgICAqIEByZXR1cm4gYSB7QGxpbmsgVmVyc2lvbn0gb3JkaW5hbCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFZlcnNpb25PcmRpbmFsKGludCB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgSW50ZWdlciBvcmRpbmFsID0gdmVyc2lvbk9yZGluYWxNYXAuZ2V0KHZlcnNpb24pOworICAgICAgICBpZiAob3JkaW5hbCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5rb3duIHNlcmlhbGl6YXRpb24gdmVyc2lvbjogIiArIHZlcnNpb24pOworCisgICAgICAgIHJldHVybiBvcmRpbmFsOworICAgIH0KIAogICAgIHB1YmxpYyBlbnVtIFZlcnNpb24KICAgICB7CkBAIC00ODMsNyArNTAyLDEwIEBACiAgICAgewogICAgICAgICBPdXRib3VuZENvbm5lY3Rpb25zIHBvb2wgPSBjaGFubmVsTWFuYWdlcnMuZ2V0KHRvKTsKICAgICAgICAgaWYgKHBvb2wgIT0gbnVsbCkKKyAgICAgICAgewogICAgICAgICAgICAgcG9vbC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJJbnRlcnJ1cHRlZCBvdXRib3VuZCBjb25uZWN0aW9ucyB0byB7fSIsIHRvKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L091dGJvdW5kQ29ubmVjdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L091dGJvdW5kQ29ubmVjdGlvbi5qYXZhCmluZGV4IDgyMTUyMWIuLjJhZjZkM2IgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9PdXRib3VuZENvbm5lY3Rpb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvT3V0Ym91bmRDb25uZWN0aW9uLmphdmEKQEAgLTYxLDYgKzYxLDcgQEAKIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLk1hdGgubWF4OwogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuTWF0aC5taW47CiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTExJU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LkludGVybm9kZUNvbm5lY3Rpb25VdGlscy5pc1NTTEVycm9yOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZS5jdXJyZW50X3ZlcnNpb247CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5PdXRib3VuZENvbm5lY3Rpb25Jbml0aWF0b3IuKjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk91dGJvdW5kQ29ubmVjdGlvbnMuTEFSR0VfTUVTU0FHRV9USFJFU0hPTEQ7CkBAIC0xMTAwLDggKzExMDEsOSBAQAogCiAgICAgICAgICAgICAgICAgaWYgKGhhc1BlbmRpbmcoKSkKICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTU0xGYWlsdXJlID0gaXNTU0xFcnJvcihjYXVzZSk7CiAgICAgICAgICAgICAgICAgICAgIFByb21pc2U8UmVzdWx0PE1lc3NhZ2luZ1N1Y2Nlc3M+PiByZXN1bHQgPSBBc3luY1Byb21pc2Uud2l0aEV4ZWN1dG9yKGV2ZW50TG9vcCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gbmV3IENvbm5lY3Rpbmcoc3RhdGUuZGlzY29ubmVjdGVkKCksIHJlc3VsdCwgZXZlbnRMb29wLnNjaGVkdWxlKCgpIC0+IGF0dGVtcHQocmVzdWx0KSwgbWF4KDEwMCwgcmV0cnlSYXRlTWlsbGlzKSwgTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gbmV3IENvbm5lY3Rpbmcoc3RhdGUuZGlzY29ubmVjdGVkKCksIHJlc3VsdCwgZXZlbnRMb29wLnNjaGVkdWxlKCgpIC0+IGF0dGVtcHQocmVzdWx0LCBpc1NTTEZhaWx1cmUpLCBtYXgoMTAwLCByZXRyeVJhdGVNaWxsaXMpLCBNSUxMSVNFQ09ORFMpKTsKICAgICAgICAgICAgICAgICAgICAgcmV0cnlSYXRlTWlsbGlzID0gbWluKDEwMDAsIHJldHJ5UmF0ZU1pbGxpcyAqIDIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlCkBAIC0xMTg5LDcgKzExOTEsNyBAQAogICAgICAgICAgICAgICoKICAgICAgICAgICAgICAqIE5vdGU6IHRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCBvbiB0aGUgZXZlbnQgbG9vcC4KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGF0dGVtcHQoUHJvbWlzZTxSZXN1bHQ8TWVzc2FnaW5nU3VjY2Vzcz4+IHJlc3VsdCkKKyAgICAgICAgICAgIHByaXZhdGUgdm9pZCBhdHRlbXB0KFByb21pc2U8UmVzdWx0PE1lc3NhZ2luZ1N1Y2Nlc3M+PiByZXN1bHQsIGJvb2xlYW4gc3NsRmFsbGJhY2tFbmFibGVkKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICsrY29ubmVjdGlvbkF0dGVtcHRzOwogCkBAIC0xMjE2LDcgKzEyMTgsMjAgQEAKICAgICAgICAgICAgICAgICAvLyBlbnN1cmUgd2UgY29ubmVjdCB0byB0aGUgY29ycmVjdCBTU0wgcG9ydAogICAgICAgICAgICAgICAgIHNldHRpbmdzID0gc2V0dGluZ3Mud2l0aExlZ2FjeVBvcnRJZk5lY2Vzc2FyeShtZXNzYWdpbmdWZXJzaW9uKTsKIAotICAgICAgICAgICAgICAgIGluaXRpYXRlTWVzc2FnaW5nKGV2ZW50TG9vcCwgdHlwZSwgc2V0dGluZ3MsIG1lc3NhZ2luZ1ZlcnNpb24sIHJlc3VsdCkKKyAgICAgICAgICAgICAgICAvLyBJbiBtaXhlZCBtb2RlIG9wZXJhdGlvbiwgc29tZSBub2RlcyBtaWdodCBiZSBjb25maWd1cmVkIHRvIHVzZSBTU0wgZm9yIGludGVybm9kZSBjb25uZWN0aW9ucyBhbmQKKyAgICAgICAgICAgICAgICAvLyBvdGhlcnMgbWlnaHQgYmUgY29uZmlndXJlZCB0byBub3QgdXNlIFNTTC4gV2hlbiBhIG5vZGUgaXMgY29uZmlndXJlZCBpbiBvcHRpb25hbCBTU0wgbW9kZSwgSXQgc2hvdWxkCisgICAgICAgICAgICAgICAgLy8gYmUgYWJsZSB0byBoYW5kbGUgU1NMIGFuZCBOb24tU1NMIGludGVybm9kZSBjb25uZWN0aW9ucy4gV2UgdGFrZSBjYXJlIG9mIHRoaXMgd2hlbiBhY2NlcHRpbmcgTk9OLVNTTAorICAgICAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gaW4gSW5ib3VuZCBjb25uZWN0aW9uIGJ5IGhhdmluZyBvcHRpb25hbCBTU0wgaGFuZGxlciBmb3IgaW5ib3VuZCBjb25uZWN0aW9ucy4KKyAgICAgICAgICAgICAgICAvLyBGb3Igb3V0Ym91bmQgY29ubmVjdGlvbnMsIGlmIHRoZSBhdXRoZW50aWNhdGlvbiBmYWlscywgd2Ugc2hvdWxkIGZhbGwgYmFjayB0byBvdGhlciBTU0wgc3RyYXRlZ2llcworICAgICAgICAgICAgICAgIC8vIHdoaWxlIHRhbGtpbmcgdG8gb2xkZXIgbm9kZXMgaW4gdGhlIGNsdXN0ZXIgd2hpY2ggYXJlIGNvbmZpZ3VyZWQgdG8gbWFrZSBOT04tU1NMIGNvbm5lY3Rpb25zCisgICAgICAgICAgICAgICAgU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZVtdIGZhbGxCYWNrU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZXMgPSBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlLnZhbHVlcygpOworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IHNzbEZhbGxiYWNrRW5hYmxlZCAmJiBzZXR0aW5ncy53aXRoRW5jcnlwdGlvbigpICYmIHNldHRpbmdzLmVuY3J5cHRpb24uZ2V0T3B0aW9uYWwoKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGNvbm5lY3Rpb25BdHRlbXB0cyAtIDEpICUgZmFsbEJhY2tTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlcy5sZW5ndGggOiAwOworICAgICAgICAgICAgICAgIGlmIChmYWxsQmFja1NzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGVzW2luZGV4XSAhPSBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlLlNFUlZFUl9DT05GSUcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiQ29ubmVjdGlvbklkIHt9IGlzIGZhbGxpbmcgYmFjayB0byB7fSByZWNvbm5lY3Qgc3RyYXRlZ3kgZm9yIHJldHJ5IiwgaWQoKSwgZmFsbEJhY2tTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlc1tpbmRleF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbml0aWF0ZU1lc3NhZ2luZyhldmVudExvb3AsIHR5cGUsIGZhbGxCYWNrU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZXNbaW5kZXhdLCBzZXR0aW5ncywgbWVzc2FnaW5nVmVyc2lvbiwgcmVzdWx0KQogICAgICAgICAgICAgICAgIC5hZGRMaXN0ZW5lcihmdXR1cmUgLT4gewogICAgICAgICAgICAgICAgICAgICBpZiAoZnV0dXJlLmlzQ2FuY2VsbGVkKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC0xMjMxLDcgKzEyNDYsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIFByb21pc2U8UmVzdWx0PE1lc3NhZ2luZ1N1Y2Nlc3M+PiByZXN1bHQgPSBBc3luY1Byb21pc2Uud2l0aEV4ZWN1dG9yKGV2ZW50TG9vcCk7CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBuZXcgQ29ubmVjdGluZyhzdGF0ZS5kaXNjb25uZWN0ZWQoKSwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICBhdHRlbXB0KHJlc3VsdCk7CisgICAgICAgICAgICAgICAgYXR0ZW1wdChyZXN1bHQsIGZhbHNlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvT3V0Ym91bmRDb25uZWN0aW9uSW5pdGlhdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvT3V0Ym91bmRDb25uZWN0aW9uSW5pdGlhdG9yLmphdmEKaW5kZXggYTE4NzA2OC4uZWJkMzBmNSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L091dGJvdW5kQ29ubmVjdGlvbkluaXRpYXRvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9PdXRib3VuZENvbm5lY3Rpb25Jbml0aWF0b3IuamF2YQpAQCAtMjEsMTMgKzIxLDE2IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DbG9zZWRDaGFubmVsRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworCiBpbXBvcnQgaW8ubmV0dHkudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsgLy9jaGVja3N0eWxlOiBwZXJtaXQgdGhpcyBpbXBvcnQKIGltcG9ydCBpby5uZXR0eS51dGlsLmNvbmN1cnJlbnQuUHJvbWlzZTsgLy9jaGVja3N0eWxlOiBwZXJtaXQgdGhpcyBpbXBvcnQKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkFzeW5jUHJvbWlzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkltbWVkaWF0ZUZ1dHVyZTsKKwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKQEAgLTU2LDkgKzU5LDE1IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VjdXJpdHkuSVNzbENvbnRleHRGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5LlNTTEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSlZNU3RhYmlsaXR5SW5zcGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuSW1tZWRpYXRlRnV0dXJlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5CdWZmZXJQb29sczsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC4qOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLklJbnRlcm5vZGVBdXRoZW50aWNhdG9yLkludGVybm9kZUNvbm5lY3Rpb25EaXJlY3Rpb24uT1VUQk9VTkQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguSUludGVybm9kZUF1dGhlbnRpY2F0b3IuSW50ZXJub2RlQ29ubmVjdGlvbkRpcmVjdGlvbi5PVVRCT1VORF9QUkVDT05ORUNUOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuSW50ZXJub2RlQ29ubmVjdGlvblV0aWxzLkRJU0NBUkRfSEFORExFUl9OQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuSW50ZXJub2RlQ29ubmVjdGlvblV0aWxzLlNTTF9IQU5ETEVSX05BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5JbnRlcm5vZGVDb25uZWN0aW9uVXRpbHMuY2VydGlmaWNhdGVzOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZS5WRVJTSU9OXzQwOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuSGFuZHNoYWtlUHJvdG9jb2wuKjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LkNvbm5lY3Rpb25UeXBlLlNUUkVBTUlORzsKQEAgLTg1LDE1ICs5NCwxNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihPdXRib3VuZENvbm5lY3Rpb25Jbml0aWF0b3IuY2xhc3MpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBDb25uZWN0aW9uVHlwZSB0eXBlOworICAgIHByaXZhdGUgZmluYWwgU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZSBzc2xDb25uZWN0aW9uVHlwZTsKICAgICBwcml2YXRlIGZpbmFsIE91dGJvdW5kQ29ubmVjdGlvblNldHRpbmdzIHNldHRpbmdzOwogICAgIHByaXZhdGUgZmluYWwgaW50IHJlcXVlc3RNZXNzYWdpbmdWZXJzaW9uOyAvLyBmb3IgcHJlNDAgbm9kZXMKICAgICBwcml2YXRlIGZpbmFsIFByb21pc2U8UmVzdWx0PFN1Y2Nlc3NUeXBlPj4gcmVzdWx0UHJvbWlzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gaXNDbG9zZWQ7CiAKLSAgICBwcml2YXRlIE91dGJvdW5kQ29ubmVjdGlvbkluaXRpYXRvcihDb25uZWN0aW9uVHlwZSB0eXBlLCBPdXRib3VuZENvbm5lY3Rpb25TZXR0aW5ncyBzZXR0aW5ncywKKyAgICBwcml2YXRlIE91dGJvdW5kQ29ubmVjdGlvbkluaXRpYXRvcihDb25uZWN0aW9uVHlwZSB0eXBlLCBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlIHNzbENvbm5lY3Rpb25UeXBlLCBPdXRib3VuZENvbm5lY3Rpb25TZXR0aW5ncyBzZXR0aW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVxdWVzdE1lc3NhZ2luZ1ZlcnNpb24sIFByb21pc2U8UmVzdWx0PFN1Y2Nlc3NUeXBlPj4gcmVzdWx0UHJvbWlzZSkKICAgICB7CiAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMuc3NsQ29ubmVjdGlvblR5cGUgPSBzc2xDb25uZWN0aW9uVHlwZTsKICAgICAgICAgdGhpcy5yZXF1ZXN0TWVzc2FnaW5nVmVyc2lvbiA9IHJlcXVlc3RNZXNzYWdpbmdWZXJzaW9uOwogICAgICAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7CiAgICAgICAgIHRoaXMucmVzdWx0UHJvbWlzZSA9IHJlc3VsdFByb21pc2U7CkBAIC0xMDYsOSArMTE3LDEwIEBACiAgICAgICoKICAgICAgKiBUaGUgcmV0dXJuZWQge0Bjb2RlIEZ1dHVyZX0gaXMgZ3VhcmFudGVlZCB0byBiZSBjb21wbGV0ZWQgb24gdGhlIHN1cHBsaWVkIGV2ZW50TG9vcC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEZ1dHVyZTxSZXN1bHQ8U3RyZWFtaW5nU3VjY2Vzcz4+IGluaXRpYXRlU3RyZWFtaW5nKEV2ZW50TG9vcCBldmVudExvb3AsIE91dGJvdW5kQ29ubmVjdGlvblNldHRpbmdzIHNldHRpbmdzLCBpbnQgcmVxdWVzdE1lc3NhZ2luZ1ZlcnNpb24pCisgICAgcHVibGljIHN0YXRpYyBGdXR1cmU8UmVzdWx0PFN0cmVhbWluZ1N1Y2Nlc3M+PiBpbml0aWF0ZVN0cmVhbWluZyhFdmVudExvb3AgZXZlbnRMb29wLCBPdXRib3VuZENvbm5lY3Rpb25TZXR0aW5ncyBzZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUgc3NsQ29ubmVjdGlvblR5cGUsIGludCByZXF1ZXN0TWVzc2FnaW5nVmVyc2lvbikKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgT3V0Ym91bmRDb25uZWN0aW9uSW5pdGlhdG9yPFN0cmVhbWluZ1N1Y2Nlc3M+KFNUUkVBTUlORywgc2V0dGluZ3MsIHJlcXVlc3RNZXNzYWdpbmdWZXJzaW9uLCBBc3luY1Byb21pc2Uud2l0aEV4ZWN1dG9yKGV2ZW50TG9vcCkpCisgICAgICAgIHJldHVybiBuZXcgT3V0Ym91bmRDb25uZWN0aW9uSW5pdGlhdG9yPFN0cmVhbWluZ1N1Y2Nlc3M+KFNUUkVBTUlORywgc3NsQ29ubmVjdGlvblR5cGUsIHNldHRpbmdzLCByZXF1ZXN0TWVzc2FnaW5nVmVyc2lvbiwgQXN5bmNQcm9taXNlLndpdGhFeGVjdXRvcihldmVudExvb3ApKQogICAgICAgICAgICAgICAgLmluaXRpYXRlKGV2ZW50TG9vcCk7CiAgICAgfQogCkBAIC0xMTksOSArMTMxLDEwIEBACiAgICAgICoKICAgICAgKiBUaGUgcmV0dXJuZWQge0Bjb2RlIEZ1dHVyZX0gaXMgZ3VhcmFudGVlZCB0byBiZSBjb21wbGV0ZWQgb24gdGhlIHN1cHBsaWVkIGV2ZW50TG9vcC4KICAgICAgKi8KLSAgICBzdGF0aWMgRnV0dXJlPFJlc3VsdDxNZXNzYWdpbmdTdWNjZXNzPj4gaW5pdGlhdGVNZXNzYWdpbmcoRXZlbnRMb29wIGV2ZW50TG9vcCwgQ29ubmVjdGlvblR5cGUgdHlwZSwgT3V0Ym91bmRDb25uZWN0aW9uU2V0dGluZ3Mgc2V0dGluZ3MsIGludCByZXF1ZXN0TWVzc2FnaW5nVmVyc2lvbiwgUHJvbWlzZTxSZXN1bHQ8TWVzc2FnaW5nU3VjY2Vzcz4+IHJlc3VsdCkKKyAgICBzdGF0aWMgRnV0dXJlPFJlc3VsdDxNZXNzYWdpbmdTdWNjZXNzPj4gaW5pdGlhdGVNZXNzYWdpbmcoRXZlbnRMb29wIGV2ZW50TG9vcCwgQ29ubmVjdGlvblR5cGUgdHlwZSwgU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZSBzc2xDb25uZWN0aW9uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0Ym91bmRDb25uZWN0aW9uU2V0dGluZ3Mgc2V0dGluZ3MsIGludCByZXF1ZXN0TWVzc2FnaW5nVmVyc2lvbiwgUHJvbWlzZTxSZXN1bHQ8TWVzc2FnaW5nU3VjY2Vzcz4+IHJlc3VsdCkKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgT3V0Ym91bmRDb25uZWN0aW9uSW5pdGlhdG9yPD4odHlwZSwgc2V0dGluZ3MsIHJlcXVlc3RNZXNzYWdpbmdWZXJzaW9uLCByZXN1bHQpCisgICAgICAgIHJldHVybiBuZXcgT3V0Ym91bmRDb25uZWN0aW9uSW5pdGlhdG9yPD4odHlwZSwgc3NsQ29ubmVjdGlvblR5cGUsIHNldHRpbmdzLCByZXF1ZXN0TWVzc2FnaW5nVmVyc2lvbiwgcmVzdWx0KQogICAgICAgICAgICAgICAgLmluaXRpYXRlKGV2ZW50TG9vcCk7CiAgICAgfQogCkBAIC0xMzAsMTMgKzE0MywxNSBAQAogICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCiAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImNyZWF0aW5nIG91dGJvdW5kIGJvb3RzdHJhcCB0byB7fSwgcmVxdWVzdFZlcnNpb246IHt9Iiwgc2V0dGluZ3MsIHJlcXVlc3RNZXNzYWdpbmdWZXJzaW9uKTsKIAotICAgICAgICBpZiAoIXNldHRpbmdzLmF1dGhlbnRpY2F0ZSgpKQorICAgICAgICBpZiAoIXNldHRpbmdzLmF1dGhlbnRpY2F0b3IuYXV0aGVudGljYXRlKHNldHRpbmdzLnRvLmdldEFkZHJlc3MoKSwgc2V0dGluZ3MudG8uZ2V0UG9ydCgpLCBudWxsLCBPVVRCT1VORF9QUkVDT05ORUNUKSkKICAgICAgICAgewogICAgICAgICAgICAgLy8gaW50ZXJydXB0IG90aGVyIGNvbm5lY3Rpb25zLCBzbyB0aGV5IG11c3QgYXR0ZW1wdCB0byByZS1hdXRoZW50aWNhdGUKICAgICAgICAgICAgIE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS5pbnRlcnJ1cHRPdXRib3VuZChzZXR0aW5ncy50byk7Ci0gICAgICAgICAgICByZXR1cm4gSW1tZWRpYXRlRnV0dXJlLmZhaWx1cmUobmV3IElPRXhjZXB0aW9uKCJhdXRoZW50aWNhdGlvbiBmYWlsZWQgdG8gIiArIHNldHRpbmdzLmNvbm5lY3RUb0lkKCkpKTsKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiQXV0aGVudGljYXRpb24gZmFpbGVkIHRvICIgKyBzZXR0aW5ncy5jb25uZWN0VG9JZCgpKTsKKyAgICAgICAgICAgIHJldHVybiBJbW1lZGlhdGVGdXR1cmUuZmFpbHVyZShuZXcgSU9FeGNlcHRpb24oIkF1dGhlbnRpY2F0aW9uIGZhaWxlZCB0byAiICsgc2V0dGluZ3MuY29ubmVjdFRvSWQoKSkpOwogICAgICAgICB9CiAKKwogICAgICAgICAvLyB0aGlzIGlzIGEgYml0IHVnbHksIGJ1dCBpcyB0aGUgZWFzaWVzdCB3YXkgdG8gZW5zdXJlIHRoYXQgaWYgd2UgdGltZW91dCB3ZSBjYW4gcHJvcGFnYXRlIGEgc3VpdGFibGUgZXJyb3IgbWVzc2FnZQogICAgICAgICAvLyBhbmQgc3RpbGwgZ3VhcmFudGVlIHRoYXQsIGlmIG9uIHRpbWluZyBvdXQgd2UgcmFjZWQgd2l0aCBzdWNjZXNzLCB0aGUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgY2hhbm5lbCBpcyBoYW5kbGVkCiAgICAgICAgIEF0b21pY0Jvb2xlYW4gdGltZWRvdXQgPSBuZXcgQXRvbWljQm9vbGVhbigpOwpAQCAtMTkyLDI1ICsyMDcsMzMgQEAKICAgICAgICAgcmV0dXJuIGJvb3RzdHJhcDsKICAgICB9CiAKKyAgICBwdWJsaWMgZW51bSBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlCisgICAgeworICAgICAgICBTRVJWRVJfQ09ORklHLCAvLyBPcmlnaW5hbCBjb25maWd1cmF0aW9uIG9mIHRoZSBzZXJ2ZXIKKyAgICAgICAgTVRMUywKKyAgICAgICAgU1NMLAorICAgICAgICBOT19TU0wKKyAgICB9CisKICAgICBwcml2YXRlIGNsYXNzIEluaXRpYWxpemVyIGV4dGVuZHMgQ2hhbm5lbEluaXRpYWxpemVyPFNvY2tldENoYW5uZWw+CiAgICAgewogICAgICAgICBwdWJsaWMgdm9pZCBpbml0Q2hhbm5lbChTb2NrZXRDaGFubmVsIGNoYW5uZWwpIHRocm93cyBFeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgQ2hhbm5lbFBpcGVsaW5lIHBpcGVsaW5lID0gY2hhbm5lbC5waXBlbGluZSgpOwogCi0gICAgICAgICAgICAvLyBvcmRlciBvZiBoYW5kbGVyczogc3NsIC0+IGxvZ2dlciAtPiBoYW5kc2hha2VIYW5kbGVyCi0gICAgICAgICAgICBpZiAoc2V0dGluZ3Mud2l0aEVuY3J5cHRpb24oKSkKKyAgICAgICAgICAgIC8vIG9yZGVyIG9mIGhhbmRsZXJzOiBzc2wgLT4gc2VydmVyLWF1dGhlbnRpY2F0aW9uIC0+IGxvZ2dlciAtPiBoYW5kc2hha2VIYW5kbGVyCisgICAgICAgICAgICBpZiAoKHNzbENvbm5lY3Rpb25UeXBlID09IFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUuU0VSVkVSX0NPTkZJRyAmJiBzZXR0aW5ncy53aXRoRW5jcnlwdGlvbigpKQorICAgICAgICAgICAgICAgIHx8IHNzbENvbm5lY3Rpb25UeXBlID09IFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUuU1NMIHx8IHNzbENvbm5lY3Rpb25UeXBlID09IFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUuTVRMUykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBzaG91bGQgYWN0dWFsbHkgZW5jcnlwdCB0aGlzIGNvbm5lY3Rpb24KLSAgICAgICAgICAgICAgICBTc2xDb250ZXh0IHNzbENvbnRleHQgPSBTU0xGYWN0b3J5LmdldE9yQ3JlYXRlU3NsQ29udGV4dChzZXR0aW5ncy5lbmNyeXB0aW9uLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTc2xDb250ZXh0RmFjdG9yeS5Tb2NrZXRUeXBlLkNMSUVOVCk7CisgICAgICAgICAgICAgICAgU3NsQ29udGV4dCBzc2xDb250ZXh0ID0gZ2V0U3NsQ29udGV4dChzc2xDb25uZWN0aW9uVHlwZSk7CiAgICAgICAgICAgICAgICAgLy8gZm9yIHNvbWUgcmVhc29uIGNoYW5uZWwucmVtb3RlQWRkcmVzcygpIHdpbGwgcmV0dXJuIG51bGwKICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzc0FuZFBvcnQgYWRkcmVzcyA9IHNldHRpbmdzLnRvOwogICAgICAgICAgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIHBlZXIgPSBzZXR0aW5ncy5lbmNyeXB0aW9uLnJlcXVpcmVfZW5kcG9pbnRfdmVyaWZpY2F0aW9uID8gbmV3IEluZXRTb2NrZXRBZGRyZXNzKGFkZHJlc3MuZ2V0QWRkcmVzcygpLCBhZGRyZXNzLmdldFBvcnQoKSkgOiBudWxsOwogICAgICAgICAgICAgICAgIFNzbEhhbmRsZXIgc3NsSGFuZGxlciA9IG5ld1NzbEhhbmRsZXIoY2hhbm5lbCwgc3NsQ29udGV4dCwgcGVlcik7CiAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJjcmVhdGluZyBvdXRib3VuZCBuZXR0eSBTc2xDb250ZXh0OiBjb250ZXh0PXt9LCBlbmdpbmU9e30iLCBzc2xDb250ZXh0LmdldENsYXNzKCkuZ2V0TmFtZSgpLCBzc2xIYW5kbGVyLmVuZ2luZSgpLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBwaXBlbGluZS5hZGRGaXJzdCgic3NsIiwgc3NsSGFuZGxlcik7CisgICAgICAgICAgICAgICAgcGlwZWxpbmUuYWRkRmlyc3QoU1NMX0hBTkRMRVJfTkFNRSwgc3NsSGFuZGxlcik7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBwaXBlbGluZS5hZGRMYXN0KCJzZXJ2ZXItYXV0aGVudGljYXRpb24iLCBuZXcgU2VydmVyQXV0aGVudGljYXRpb25IYW5kbGVyKHNldHRpbmdzKSk7CiAKICAgICAgICAgICAgIGlmIChXSVJFVFJBQ0UpCiAgICAgICAgICAgICAgICAgcGlwZWxpbmUuYWRkTGFzdCgibG9nZ2VyIiwgbmV3IExvZ2dpbmdIYW5kbGVyKExvZ0xldmVsLklORk8pKTsKQEAgLTIxOCw2ICsyNDEsNTkgQEAKICAgICAgICAgICAgIHBpcGVsaW5lLmFkZExhc3QoImhhbmRzaGFrZSIsIG5ldyBIYW5kbGVyKCkpOwogICAgICAgICB9CiAKKyAgICAgICAgcHJpdmF0ZSBTc2xDb250ZXh0IGdldFNzbENvbnRleHQoU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZSBjb25uZWN0aW9uVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVxdWlyZUNsaWVudEF1dGggPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChjb25uZWN0aW9uVHlwZSA9PSBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlLk1UTFMgfHwgY29ubmVjdGlvblR5cGUgPT0gU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS5TU0wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVxdWlyZUNsaWVudEF1dGggPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY29ubmVjdGlvblR5cGUgPT0gU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS5TRVJWRVJfQ09ORklHKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlcXVpcmVDbGllbnRBdXRoID0gc2V0dGluZ3Mud2l0aEVuY3J5cHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBTU0xGYWN0b3J5LmdldE9yQ3JlYXRlU3NsQ29udGV4dChzZXR0aW5ncy5lbmNyeXB0aW9uLCByZXF1aXJlQ2xpZW50QXV0aCwgSVNzbENvbnRleHRGYWN0b3J5LlNvY2tldFR5cGUuQ0xJRU5UKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogQXV0aGVudGljYXRlcyB0aGUgc2VydmVyIGJlZm9yZSBhbiBvdXRib3VuZCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLiBJZiBhIGNvbm5lY3Rpb24gaXMgU1NMIGJhc2VkIGNvbm5lY3Rpb24KKyAgICAgKiBTZXJ2ZXIncyBpZGVudGl0eSBpcyB2ZXJpZmllZCBkdXJpbmcgc3NsIGhhbmRzaGFrZSB1c2luZyByb290IGNlcnRpZmljYXRlIGluIHRydXN0c3RvcmUuIE9uZSBtYXkgY2hvb3NlIHRvIGlnbm9yZQorICAgICAqIG91dGJvdW5kIGF1dGhlbnRpY2F0aW9uIG9yIHBlcmZvcm0gcmVxdWlyZWQgYXV0aGVudGljYXRpb24gZm9yIG91dGJvdW5kIGNvbm5lY3Rpb25zIGluIHRoZSBpbXBsZW1lbnRhdGlvbgorICAgICAqIG9mIElJbnRlcm5vZGVBdXRoZW50aWNhdG9yIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBzdGF0aWMgY2xhc3MgU2VydmVyQXV0aGVudGljYXRpb25IYW5kbGVyIGV4dGVuZHMgQnl0ZVRvTWVzc2FnZURlY29kZXIKKyAgICB7CisgICAgICAgIGZpbmFsIE91dGJvdW5kQ29ubmVjdGlvblNldHRpbmdzIHNldHRpbmdzOworCisgICAgICAgIFNlcnZlckF1dGhlbnRpY2F0aW9uSGFuZGxlcihPdXRib3VuZENvbm5lY3Rpb25TZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGRlY29kZShDaGFubmVsSGFuZGxlckNvbnRleHQgY2hhbm5lbEhhbmRsZXJDb250ZXh0LCBCeXRlQnVmIGJ5dGVCdWYsIExpc3Q8T2JqZWN0PiBsaXN0KSB0aHJvd3MgRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEV4dHJhY3QgY2VydGlmaWNhdGVzIGZyb20gU1NMIGhhbmRsZXIoaGFuZGxlciB3aXRoIG5hbWUgInNzbCIpLgorICAgICAgICAgICAgZmluYWwgQ2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMgPSBjZXJ0aWZpY2F0ZXMoY2hhbm5lbEhhbmRsZXJDb250ZXh0LmNoYW5uZWwoKSk7CisgICAgICAgICAgICBpZiAoIXNldHRpbmdzLmF1dGhlbnRpY2F0b3IuYXV0aGVudGljYXRlKHNldHRpbmdzLnRvLmdldEFkZHJlc3MoKSwgc2V0dGluZ3MudG8uZ2V0UG9ydCgpLCBjZXJ0aWZpY2F0ZXMsIE9VVEJPVU5EKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBpbnRlcnJ1cHQgb3RoZXIgY29ubmVjdGlvbnMsIHNvIHRoZXkgbXVzdCBhdHRlbXB0IHRvIHJlLWF1dGhlbnRpY2F0ZQorICAgICAgICAgICAgICAgIE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS5pbnRlcnJ1cHRPdXRib3VuZChzZXR0aW5ncy50byk7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJBdXRoZW50aWNhdGlvbiBmYWlsZWQgdG8gIiArIHNldHRpbmdzLmNvbm5lY3RUb0lkKCkpOworCisgICAgICAgICAgICAgICAgLy8gVG8gcmVsZWFzZSBhbGwgdGhlIHBlbmRpbmcgYnVmZmVyZWQgZGF0YSwgcmVwbGFjZSBhdXRoZW50aWNhdGlvbiBoYW5kbGVyIHdpdGggZGlzY2FyZCBoYW5kbGVyLgorICAgICAgICAgICAgICAgIC8vIFRoaXMgYXZvaWRzIHBlbmRpbmcgaW5ib3VuZCBkYXRhIHRvIGJlIGZpcmVkIHRocm91Z2ggdGhlIHBpcGVsaW5lCisgICAgICAgICAgICAgICAgY2hhbm5lbEhhbmRsZXJDb250ZXh0LnBpcGVsaW5lKCkucmVwbGFjZSh0aGlzLCBESVNDQVJEX0hBTkRMRVJfTkFNRSwgbmV3IEludGVybm9kZUNvbm5lY3Rpb25VdGlscy5CeXRlQnVmRGlzY2FyZEhhbmRsZXIoKSk7CisgICAgICAgICAgICAgICAgY2hhbm5lbEhhbmRsZXJDb250ZXh0LnBpcGVsaW5lKCkuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsSGFuZGxlckNvbnRleHQucGlwZWxpbmUoKS5yZW1vdmUodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIGNsYXNzIEhhbmRsZXIgZXh0ZW5kcyBCeXRlVG9NZXNzYWdlRGVjb2RlcgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L091dGJvdW5kQ29ubmVjdGlvblNldHRpbmdzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvT3V0Ym91bmRDb25uZWN0aW9uU2V0dGluZ3MuamF2YQppbmRleCA1YjI0NmUzLi40NzIxZTYxIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvT3V0Ym91bmRDb25uZWN0aW9uU2V0dGluZ3MuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvT3V0Ym91bmRDb25uZWN0aW9uU2V0dGluZ3MuamF2YQpAQCAtMjMsOSArMjMsOSBAQAogCiBpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5Xcml0ZUJ1ZmZlcldhdGVyTWFyazsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLklJbnRlcm5vZGVBdXRoZW50aWNhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5FbmNyeXB0aW9uT3B0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRW5jcnlwdGlvbk9wdGlvbnMuU2VydmVyRW5jcnlwdGlvbk9wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZ21zLkdvc3NpcGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSUVuZHBvaW50U25pdGNoOwpAQCAtNDMsMTEgKzQzLDEwIEBACiBAU3VwcHJlc3NXYXJuaW5ncyh7ICJXZWFrZXJBY2Nlc3MiLCAidW51c2VkIiB9KQogcHVibGljIGNsYXNzIE91dGJvdW5kQ29ubmVjdGlvblNldHRpbmdzCiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVFJBRENfVENQX05PREVMQVlfUFJPUEVSVFkgPSBDb25maWcuUFJPUEVSVFlfUFJFRklYICsgIm90Y19pbnRyYWRjX3RjcF9ub2RlbGF5IjsKICAgICAvKioKICAgICAgKiBFbmFibGVkL2Rpc2FibGUgVENQX05PREVMQVkgZm9yIGludHJhZGMgY29ubmVjdGlvbnMuIERlZmF1bHRzIHRvIGVuYWJsZWQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBJTlRSQURDX1RDUF9OT0RFTEFZID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oU3lzdGVtLmdldFByb3BlcnR5KElOVFJBRENfVENQX05PREVMQVlfUFJPUEVSVFksICJ0cnVlIikpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gSU5UUkFEQ19UQ1BfTk9ERUxBWSA9IENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5PVENfSU5UUkFEQ19UQ1BfTk9ERUxBWS5nZXRCb29sZWFuKCk7CiAKICAgICBwdWJsaWMgZW51bSBGcmFtaW5nCiAgICAgewpAQCAtODIsNyArODEsNyBAQAogICAgIHB1YmxpYyBmaW5hbCBJSW50ZXJub2RlQXV0aGVudGljYXRvciBhdXRoZW50aWNhdG9yOwogICAgIHB1YmxpYyBmaW5hbCBJbmV0QWRkcmVzc0FuZFBvcnQgdG87CiAgICAgcHVibGljIGZpbmFsIEluZXRBZGRyZXNzQW5kUG9ydCBjb25uZWN0VG87IC8vIG1heSBiZSByZXByZXNlbnRlZCBieSBhIGRpZmZlcmVudCBJUCBhZGRyZXNzIG9uIHRoaXMgbm9kZSdzIGxvY2FsIG5ldHdvcmsKLSAgICBwdWJsaWMgZmluYWwgRW5jcnlwdGlvbk9wdGlvbnMgZW5jcnlwdGlvbjsKKyAgICBwdWJsaWMgZmluYWwgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgZW5jcnlwdGlvbjsKICAgICBwdWJsaWMgZmluYWwgRnJhbWluZyBmcmFtaW5nOwogICAgIHB1YmxpYyBmaW5hbCBJbnRlZ2VyIHNvY2tldFNlbmRCdWZmZXJTaXplSW5CeXRlczsKICAgICBwdWJsaWMgZmluYWwgSW50ZWdlciBhcHBsaWNhdGlvblNlbmRRdWV1ZUNhcGFjaXR5SW5CeXRlczsKQEAgLTExMiw3ICsxMTEsNyBAQAogICAgIHByaXZhdGUgT3V0Ym91bmRDb25uZWN0aW9uU2V0dGluZ3MoSUludGVybm9kZUF1dGhlbnRpY2F0b3IgYXV0aGVudGljYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzQW5kUG9ydCB0bywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzQW5kUG9ydCBjb25uZWN0VG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0aW9uT3B0aW9ucyBlbmNyeXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgZW5jcnlwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmcgZnJhbWluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIgc29ja2V0U2VuZEJ1ZmZlclNpemVJbkJ5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBhcHBsaWNhdGlvblNlbmRRdWV1ZUNhcGFjaXR5SW5CeXRlcywKQEAgLTE1NywxMSArMTU2LDYgQEAKICAgICAgICAgdGhpcy5lbmRwb2ludFRvVmVyc2lvbiA9IGVuZHBvaW50VG9WZXJzaW9uOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIGF1dGhlbnRpY2F0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gYXV0aGVudGljYXRvci5hdXRoZW50aWNhdGUodG8uZ2V0QWRkcmVzcygpLCB0by5nZXRQb3J0KCkpOwotICAgIH0KLQogICAgIHB1YmxpYyBib29sZWFuIHdpdGhFbmNyeXB0aW9uKCkKICAgICB7CiAgICAgICAgIHJldHVybiBlbmNyeXB0aW9uICE9IG51bGw7CkBAIC0zNjUsNyArMzU5LDcgQEAKICAgICAgICAgcmV0dXJuIGRlYnVnICE9IG51bGwgPyBkZWJ1ZyA6IE91dGJvdW5kRGVidWdDYWxsYmFja3MuTk9ORTsKICAgICB9CiAKLSAgICBwdWJsaWMgRW5jcnlwdGlvbk9wdGlvbnMgZW5jcnlwdGlvbigpCisgICAgcHVibGljIFNlcnZlckVuY3J5cHRpb25PcHRpb25zIGVuY3J5cHRpb24oKQogICAgIHsKICAgICAgICAgcmV0dXJuIGVuY3J5cHRpb24gIT0gbnVsbCA/IGVuY3J5cHRpb24gOiBkZWZhdWx0RW5jcnlwdGlvbk9wdGlvbnModG8pOwogICAgIH0KQEAgLTUwMSw3ICs0OTUsNyBAQAogICAgIH0KIAogICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHN0YXRpYyBFbmNyeXB0aW9uT3B0aW9ucyBkZWZhdWx0RW5jcnlwdGlvbk9wdGlvbnMoSW5ldEFkZHJlc3NBbmRQb3J0IGVuZHBvaW50KQorICAgIHN0YXRpYyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyBkZWZhdWx0RW5jcnlwdGlvbk9wdGlvbnMoSW5ldEFkZHJlc3NBbmRQb3J0IGVuZHBvaW50KQogICAgIHsKICAgICAgICAgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgb3B0aW9ucyA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRJbnRlcm5vZGVNZXNzYWdpbmdFbmN5cHRpb25PcHRpb25zKCk7CiAgICAgICAgIHJldHVybiBvcHRpb25zLnNob3VsZEVuY3J5cHQoZW5kcG9pbnQpID8gb3B0aW9ucyA6IG51bGw7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvT3V0Ym91bmRDb25uZWN0aW9ucy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L091dGJvdW5kQ29ubmVjdGlvbnMuamF2YQppbmRleCBhZDg3ZWM1Li4wNzI5MTk0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvT3V0Ym91bmRDb25uZWN0aW9ucy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9PdXRib3VuZENvbm5lY3Rpb25zLmphdmEKQEAgLTM5LDkgKzM5LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Ob1NwYW1Mb2dnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5VbmNoZWNrZWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuSW50ZWdlci5nZXRJbnRlZ2VyOwogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuTWF0aC5tYXg7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWcuUFJPUEVSVFlfUFJFRklYOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk9UQ1BfTEFSR0VfTUVTU0FHRV9USFJFU0hPTEQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtcy5Hb3NzaXBlci5pbnN0YW5jZTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LkZyYW1lRW5jb2RlckNyYy5IRUFERVJfQU5EX1RSQUlMRVJfTEVOR1RIOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTGVnYWN5TFo0Q29uc3RhbnRzLkhFQURFUl9MRU5HVEg7CkBAIC02Miw3ICs2MSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE91dGJvdW5kQ29ubmVjdGlvbnMuY2xhc3MpOwogCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFSR0VfTUVTU0FHRV9USFJFU0hPTEQgPSBnZXRJbnRlZ2VyKFBST1BFUlRZX1BSRUZJWCArICJvdGNwX2xhcmdlX21lc3NhZ2VfdGhyZXNob2xkIiwgMTAyNCAqIDY0KQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBUkdFX01FU1NBR0VfVEhSRVNIT0xEID0gT1RDUF9MQVJHRV9NRVNTQUdFX1RIUkVTSE9MRC5nZXRJbnQoKQogICAgIC0gbWF4KG1heChIRUFERVJfTEVOR1RILCBIRUFERVJfQU5EX1RSQUlMRVJfTEVOR1RIKSwgRnJhbWVFbmNvZGVyTFo0LkhFQURFUl9BTkRfVFJBSUxFUl9MRU5HVEgpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBDb25kaXRpb24gbWV0cmljc1JlYWR5ID0gbmV3T25lVGltZUNvbmRpdGlvbigpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L1BhcmFtVHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L1BhcmFtVHlwZS5qYXZhCmluZGV4IDM3ZjRiZjguLjZjYjhmYjQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9QYXJhbVR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvUGFyYW1UeXBlLmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFjaW5nLlRyYWNpbmc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSW50MzJTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkludDY0U2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5SYW5nZXNTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogCiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5NYXRoLm1heDsKQEAgLTQyLDMwICs0MywzMCBAQAogICovCiBwdWJsaWMgZW51bSBQYXJhbVR5cGUKIHsKLSAgICBGT1JXQVJEX1RPICAgICAgICAgICgwLCAiRldEX1RPIiwgICAgICAgIEZvcndhcmRpbmdJbmZvLnNlcmlhbGl6ZXIpLAotICAgIFJFU1BPTkRfVE8gICAgICAgICAgKDEsICJGV0RfRlJNIiwgICAgICAgZndkRnJtU2VyaWFsaXplciksCisgICAgRk9SV0FSRF9UTyAgICAgICAgICAgICAgICAgICgwLCAgIkZXRF9UTyIsICAgICAgICAgIEZvcndhcmRpbmdJbmZvLnNlcmlhbGl6ZXIpLAorICAgIFJFU1BPTkRfVE8gICAgICAgICAgICAgICAgICAoMSwgICJGV0RfRlJNIiwgICAgICAgICBmd2RGcm1TZXJpYWxpemVyKSwKIAogICAgIEBEZXByZWNhdGVkCi0gICAgRkFJTFVSRV9SRVNQT05TRSAgICAoMiwgIkZBSUwiLCAgICAgICAgICBMZWdhY3lGbGFnLnNlcmlhbGl6ZXIpLAorICAgIEZBSUxVUkVfUkVTUE9OU0UgICAgICAgICAgICAoMiwgICJGQUlMIiwgICAgICAgICAgICBMZWdhY3lGbGFnLnNlcmlhbGl6ZXIpLAogICAgIEBEZXByZWNhdGVkCi0gICAgRkFJTFVSRV9SRUFTT04gICAgICAoMywgIkZBSUxfUkVBU09OIiwgICBSZXF1ZXN0RmFpbHVyZVJlYXNvbi5zZXJpYWxpemVyKSwKKyAgICBGQUlMVVJFX1JFQVNPTiAgICAgICAgICAgICAgKDMsICAiRkFJTF9SRUFTT04iLCAgICAgUmVxdWVzdEZhaWx1cmVSZWFzb24uc2VyaWFsaXplciksCiAgICAgQERlcHJlY2F0ZWQKLSAgICBGQUlMVVJFX0NBTExCQUNLICAgICg0LCAiQ0FMX0JBQyIsICAgICAgIExlZ2FjeUZsYWcuc2VyaWFsaXplciksCisgICAgRkFJTFVSRV9DQUxMQkFDSyAgICAgICAgICAgICg0LCAgIkNBTF9CQUMiLCAgICAgICAgIExlZ2FjeUZsYWcuc2VyaWFsaXplciksCiAKLSAgICBUUkFDRV9TRVNTSU9OICAgICAgICg1LCAiVHJhY2VTZXNzaW9uIiwgIFRpbWVVVUlELlNlcmlhbGl6ZXIuaW5zdGFuY2UpLAotICAgIFRSQUNFX1RZUEUgICAgICAgICAgKDYsICJUcmFjZVR5cGUiLCAgICAgVHJhY2luZy50cmFjZVR5cGVTZXJpYWxpemVyKSwKKyAgICBUUkFDRV9TRVNTSU9OICAgICAgICAgICAgICAgKDUsICAiVHJhY2VTZXNzaW9uIiwgICAgVGltZVVVSUQuU2VyaWFsaXplci5pbnN0YW5jZSksCisgICAgVFJBQ0VfVFlQRSAgICAgICAgICAgICAgICAgICg2LCAgIlRyYWNlVHlwZSIsICAgICAgIFRyYWNpbmcudHJhY2VUeXBlU2VyaWFsaXplciksCiAKICAgICBARGVwcmVjYXRlZAotICAgIFRSQUNLX1JFUEFJUkVEX0RBVEEgKDcsICJUcmFja1JlcGFpcmVkIiwgTGVnYWN5RmxhZy5zZXJpYWxpemVyKSwKKyAgICBUUkFDS19SRVBBSVJFRF9EQVRBICAgICAgICAgKDcsICAiVHJhY2tSZXBhaXJlZCIsICAgTGVnYWN5RmxhZy5zZXJpYWxpemVyKSwKIAotICAgIFRPTUJTVE9ORV9GQUlMKDgsICJUU0YiLCBJbnQzMlNlcmlhbGl6ZXIuc2VyaWFsaXplciksCi0gICAgVE9NQlNUT05FX1dBUk5JTkcoOSwgIlRTVyIsIEludDMyU2VyaWFsaXplci5zZXJpYWxpemVyKSwKLSAgICBMT0NBTF9SRUFEX1NJWkVfRkFJTCgxMCwgIkxSU0YiLCBJbnQ2NFNlcmlhbGl6ZXIuc2VyaWFsaXplciksCi0gICAgTE9DQUxfUkVBRF9TSVpFX1dBUk4oMTEsICJMUlNXIiwgSW50NjRTZXJpYWxpemVyLnNlcmlhbGl6ZXIpLAotICAgIFJPV19JTkRFWF9SRUFEX1NJWkVfRkFJTCgxMiwgIlJJUlNGIiwgSW50NjRTZXJpYWxpemVyLnNlcmlhbGl6ZXIpLAotICAgIFJPV19JTkRFWF9SRUFEX1NJWkVfV0FSTigxMywgIlJJUlNXIiwgSW50NjRTZXJpYWxpemVyLnNlcmlhbGl6ZXIpLAotCi0gICAgQ1VTVE9NX01BUCAgICAgICAgICAoMTQsICJDVVNUT00iLCAgICAgICBDdXN0b21QYXJhbXNTZXJpYWxpemVyLnNlcmlhbGl6ZXIpOworICAgIFRPTUJTVE9ORV9GQUlMICAgICAgICAgICAgICAoOCwgICJUU0YiLCAgICAgICAgICAgICBJbnQzMlNlcmlhbGl6ZXIuc2VyaWFsaXplciksCisgICAgVE9NQlNUT05FX1dBUk5JTkcgICAgICAgICAgICg5LCAgIlRTVyIsICAgICAgICAgICAgIEludDMyU2VyaWFsaXplci5zZXJpYWxpemVyKSwKKyAgICBMT0NBTF9SRUFEX1NJWkVfRkFJTCAgICAgICAgKDEwLCAiTFJTRiIsICAgICAgICAgICAgSW50NjRTZXJpYWxpemVyLnNlcmlhbGl6ZXIpLAorICAgIExPQ0FMX1JFQURfU0laRV9XQVJOICAgICAgICAoMTEsICJMUlNXIiwgICAgICAgICAgICBJbnQ2NFNlcmlhbGl6ZXIuc2VyaWFsaXplciksCisgICAgUk9XX0lOREVYX1JFQURfU0laRV9GQUlMICAgICgxMiwgIlJJUlNGIiwgICAgICAgICAgIEludDY0U2VyaWFsaXplci5zZXJpYWxpemVyKSwKKyAgICBST1dfSU5ERVhfUkVBRF9TSVpFX1dBUk4gICAgKDEzLCAiUklSU1ciLCAgICAgICAgICAgSW50NjRTZXJpYWxpemVyLnNlcmlhbGl6ZXIpLAorICAgIENVU1RPTV9NQVAgICAgICAgICAgICAgICAgICAoMTQsICJDVVNUT00iLCAgICAgICAgICBDdXN0b21QYXJhbXNTZXJpYWxpemVyLnNlcmlhbGl6ZXIpLAorICAgIFNOQVBTSE9UX1JBTkdFUyAgICAgICAgICAgICAoMTUsICJTTkFQU0hPVF9SQU5HRVMiLCBSYW5nZXNTZXJpYWxpemVyLnNlcmlhbGl6ZXIpOwogCiAgICAgZmluYWwgaW50IGlkOwogICAgIEBEZXByZWNhdGVkIGZpbmFsIFN0cmluZyBsZWdhY3lBbGlhczsgLy8gcHJlLTQuMCB3ZSB1c2VkIHRvIHNlcmlhbGl6ZSBlbnRpcmUgcGFyYW0gbmFtZSBzdHJpbmcKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9SZXF1ZXN0Q2FsbGJhY2suamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9SZXF1ZXN0Q2FsbGJhY2suamF2YQppbmRleCBiZDE0Y2FlLi4xNGUwMTY5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvUmVxdWVzdENhbGxiYWNrLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L1JlcXVlc3RDYWxsYmFjay5qYXZhCkBAIC0xNyw2ICsxNyw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0OwogCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuUmVxdWVzdEZhaWx1cmVSZWFzb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CiAKQEAgLTYzLDQgKzY1LDE5IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBzdGF0aWMgYm9vbGVhbiBpc1RpbWVvdXQoTWFwPEluZXRBZGRyZXNzQW5kUG9ydCwgUmVxdWVzdEZhaWx1cmVSZWFzb24+IGZhaWx1cmVSZWFzb25CeUVuZHBvaW50KQorICAgIHsKKyAgICAgICAgLy8gVGhlIHJlYXNvbiB0aGF0IGFsbCBtdXN0IGJlIHRpbWVvdXQgdG8gYmUgY2FsbGVkIGEgdGltZW91dCBpcyBhcyBmb2xsb3dzCisgICAgICAgIC8vIEFzc3VtZSBSRj02LCBRVU9SVU0sIGFuZCBmYWlsdXJlUmVhc29uQnlFbmRwb2ludC5zaXplKCkgPT0gMworICAgICAgICAvLyBSMSAtPiBUSU1FT1VUCisgICAgICAgIC8vIFIyIC0+IFRJTUVPVVQKKyAgICAgICAgLy8gUjMgLT4gUkVBRF9UT09fTUFOWV9UT01CU1RPTkVTCisgICAgICAgIC8vIFNpbmNlIHdlIGdvdCBhIHJlcGx5IGJhY2ssIGFuZCB0aGF0IHdhcyBhIGZhaWx1cmUsIHdlIHNob3VsZCByZXR1cm4gYSBmYWlsdXJlIGxldHRpbmcgdGhlIHVzZXIga25vdy4KKyAgICAgICAgLy8gV2hlbiBhbGwgZmFpbHVyZXMgYXJlIGEgdGltZW91dCwgdGhlbiB0aGlzIGlzIGEgcmFjZSBjb25kaXRpb24gd2l0aAorICAgICAgICAvLyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkF3YWl0YWJsZS5hd2FpdChsb25nLCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKKyAgICAgICAgLy8gVGhlIHJhY2UgaXMgdGhhdCB0aGUgbWVzc2FnZSBleHBpcmUgcGF0aCBydW5zIGFuZCBleHBpcmVzIGFsbCBtZXNzYWdlcywgdGhpcyB0aGVuIGNhc3VlcyB0aGUgY29uZGl0aW9uCisgICAgICAgIC8vIHRvIHNpZ25hbCB0ZWxsaW5nIHRoZSBjYWxsZXIgImdvdCBhbGwgcmVwbGllcyEiLgorICAgICAgICByZXR1cm4gZmFpbHVyZVJlYXNvbkJ5RW5kcG9pbnQudmFsdWVzKCkuc3RyZWFtKCkuYWxsTWF0Y2goUmVxdWVzdEZhaWx1cmVSZWFzb24uVElNRU9VVDo6ZXF1YWxzKTsKKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9Tb2NrZXRGYWN0b3J5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvU29ja2V0RmFjdG9yeS5qYXZhCmluZGV4IDMzZmZmNmIuLjc4MjU2MjYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9Tb2NrZXRGYWN0b3J5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L1NvY2tldEZhY3RvcnkuamF2YQpAQCAtNjEsNyArNjEsNiBAQAogaW1wb3J0IGlvLm5ldHR5LnV0aWwuaW50ZXJuYWwubG9nZ2luZy5JbnRlcm5hbExvZ2dlckZhY3Rvcnk7CiBpbXBvcnQgaW8ubmV0dHkudXRpbC5pbnRlcm5hbC5sb2dnaW5nLlNsZjRKTG9nZ2VyRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50Lk5hbWVkVGhyZWFkRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5FbmNyeXB0aW9uT3B0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZWN1cml0eS5TU0xGYWN0b3J5OwpAQCAtNzMsNiArNzIsNyBAQAogaW1wb3J0IHN0YXRpYyBpby5uZXR0eS5jaGFubmVsLnVuaXguRXJyb3JzLkVSUk9SX0VDT05OUkVGVVNFRF9ORUdBVElWRTsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuU0VDT05EUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvckZhY3RvcnkuR2xvYmFsLmV4ZWN1dG9yRmFjdG9yeTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5JTlRFUk5PREVfRVZFTlRfVEhSRUFEUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlcy5pc0NhdXNlZEJ5OwogCiAvKioKQEAgLTgzLDcgKzgzLDcgQEAKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU29ja2V0RmFjdG9yeS5jbGFzcyk7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfVEhSRUFEUyA9IEludGVnZXIuZ2V0SW50ZWdlcihDb25maWcuUFJPUEVSVFlfUFJFRklYICsgImludGVybm9kZS1ldmVudC10aHJlYWRzIiwgRkJVdGlsaXRpZXMuZ2V0QXZhaWxhYmxlUHJvY2Vzc29ycygpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfVEhSRUFEUyA9IElOVEVSTk9ERV9FVkVOVF9USFJFQURTLmdldEludChGQlV0aWxpdGllcy5nZXRBdmFpbGFibGVQcm9jZXNzb3JzKCkpOwogCiAgICAgLyoqCiAgICAgICogVGhlIGRlZmF1bHQgdGFzayBxdWV1ZSB1c2VkIGJ5IHtAY29kZSBOaW9FdmVudExvb3B9IGFuZCB7QGNvZGUgRXBvbGxFdmVudExvb3B9IGlzIHtAY29kZSBNcHNjVW5ib3VuZGVkQXJyYXlRdWV1ZX0sCkBAIC0yMTUsNyArMjE1LDcgQEAKICAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBTc2xIYW5kbGVyfSBmcm9tIHByb3ZpZGVkIFNzbENvbnRleHQuCiAgICAgICogQHBhcmFtIHBlZXIgZW5hYmxlcyBlbmRwb2ludCB2ZXJpZmljYXRpb24gZm9yIHJlbW90ZSBhZGRyZXNzIHdoZW4gbm90IG51bGwKICAgICAgKi8KLSAgICBzdGF0aWMgU3NsSGFuZGxlciBuZXdTc2xIYW5kbGVyKENoYW5uZWwgY2hhbm5lbCwgU3NsQ29udGV4dCBzc2xDb250ZXh0LCBATnVsbGFibGUgSW5ldFNvY2tldEFkZHJlc3MgcGVlcikKKyAgICBwdWJsaWMgc3RhdGljIFNzbEhhbmRsZXIgbmV3U3NsSGFuZGxlcihDaGFubmVsIGNoYW5uZWwsIFNzbENvbnRleHQgc3NsQ29udGV4dCwgQE51bGxhYmxlIEluZXRTb2NrZXRBZGRyZXNzIHBlZXIpCiAgICAgewogICAgICAgICBpZiAocGVlciA9PSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIHNzbENvbnRleHQubmV3SGFuZGxlcihjaGFubmVsLmFsbG9jKCkpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L1ZlcmIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9WZXJiLmphdmEKaW5kZXggZDUwYTE4Ny4uZDUyZjE0YyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L1ZlcmIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvVmVyYi5qYXZhCkBAIC05Niw2ICs5Niw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy52MS5QcmVwYXJlVmVyYkhhbmRsZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy52MS5Qcm9wb3NlVmVyYkhhbmRsZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlJlcGxpY2F0aW9uRG9uZVZlcmJIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlJlZmxlY3Rpb25VdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5VVUlEU2VyaWFsaXplcjsKIApAQCAtMzUxLDcgKzM1Miw3IEBACiAgICAgICAgIFN1cHBsaWVyPD8gZXh0ZW5kcyBJVmVyYkhhbmRsZXI8Pz4+IG9yaWdpbmFsID0gdGhpcy5oYW5kbGVyOwogICAgICAgICBGaWVsZCBmaWVsZCA9IFZlcmIuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgiaGFuZGxlciIpOwogICAgICAgICBmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICBGaWVsZCBtb2RpZmllcnMgPSBGaWVsZC5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJtb2RpZmllcnMiKTsKKyAgICAgICAgRmllbGQgbW9kaWZpZXJzID0gUmVmbGVjdGlvblV0aWxzLmdldE1vZGlmaWVyc0ZpZWxkKCk7CiAgICAgICAgIG1vZGlmaWVycy5zZXRBY2Nlc3NpYmxlKHRydWUpOwogICAgICAgICBtb2RpZmllcnMuc2V0SW50KGZpZWxkLCBmaWVsZC5nZXRNb2RpZmllcnMoKSAmIH5Nb2RpZmllci5GSU5BTCk7CiAgICAgICAgIGZpZWxkLnNldCh0aGlzLCBoYW5kbGVyKTsKQEAgLTM2NCw3ICszNjUsNyBAQAogICAgICAgICBTdXBwbGllcjw/IGV4dGVuZHMgSVZlcnNpb25lZEFzeW1tZXRyaWNTZXJpYWxpemVyPD8sID8+PiBvcmlnaW5hbCA9IHRoaXMuc2VyaWFsaXplcjsKICAgICAgICAgRmllbGQgZmllbGQgPSBWZXJiLmNsYXNzLmdldERlY2xhcmVkRmllbGQoInNlcmlhbGl6ZXIiKTsKICAgICAgICAgZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgRmllbGQgbW9kaWZpZXJzID0gRmllbGQuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgibW9kaWZpZXJzIik7CisgICAgICAgIEZpZWxkIG1vZGlmaWVycyA9IFJlZmxlY3Rpb25VdGlscy5nZXRNb2RpZmllcnNGaWVsZCgpOwogICAgICAgICBtb2RpZmllcnMuc2V0QWNjZXNzaWJsZSh0cnVlKTsKICAgICAgICAgbW9kaWZpZXJzLnNldEludChmaWVsZCwgZmllbGQuZ2V0TW9kaWZpZXJzKCkgJiB+TW9kaWZpZXIuRklOQUwpOwogICAgICAgICBmaWVsZC5zZXQodGhpcywgc2VyaWFsaXplcik7CkBAIC0zNzcsNyArMzc4LDcgQEAKICAgICAgICAgVG9Mb25nRnVuY3Rpb248VGltZVVuaXQ+IG9yaWdpbmFsID0gdGhpcy5leHBpcmF0aW9uOwogICAgICAgICBGaWVsZCBmaWVsZCA9IFZlcmIuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgiZXhwaXJhdGlvbiIpOwogICAgICAgICBmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICBGaWVsZCBtb2RpZmllcnMgPSBGaWVsZC5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJtb2RpZmllcnMiKTsKKyAgICAgICAgRmllbGQgbW9kaWZpZXJzID0gUmVmbGVjdGlvblV0aWxzLmdldE1vZGlmaWVyc0ZpZWxkKCk7CiAgICAgICAgIG1vZGlmaWVycy5zZXRBY2Nlc3NpYmxlKHRydWUpOwogICAgICAgICBtb2RpZmllcnMuc2V0SW50KGZpZWxkLCBmaWVsZC5nZXRNb2RpZmllcnMoKSAmIH5Nb2RpZmllci5GSU5BTCk7CiAgICAgICAgIGZpZWxkLnNldCh0aGlzLCBleHBpcmF0aW9uKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9Mb2NhbFN5bmNUYXNrLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvTG9jYWxTeW5jVGFzay5qYXZhCmluZGV4IDI4YTZhY2MuLjVkZjA1YzcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9Mb2NhbFN5bmNUYXNrLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL0xvY2FsU3luY1Rhc2suamF2YQpAQCAtMTQ5LDcgKzE0OSw3IEBACiAgICAgICAgICAgICAgICAgc3RhdGUudHJhY2UoInt9L3t9ICh7fSUpIHt9IGlkeDp7fXt9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShwaS5jdXJyZW50Qnl0ZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KHBpLnRvdGFsQnl0ZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpLmN1cnJlbnRCeXRlcyAqIDEwMCAvIHBpLnRvdGFsQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGkucHJvZ3Jlc3NQZXJjZW50YWdlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGkuZGlyZWN0aW9uID09IFByb2dyZXNzSW5mby5EaXJlY3Rpb24uT1VUID8gInNlbnQgdG8iIDogInJlY2VpdmVkIGZyb20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpLnNlc3Npb25JbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaS5wZWVyIH0pOwpAQCAtMjAxLDQgKzIwMSw0IEBACiAgICAgICAgICAgICBwbGFuLmdldENvb3JkaW5hdG9yKCkuZ2V0QWxsU3RyZWFtU2Vzc2lvbnMoKS5mb3JFYWNoKFN0cmVhbVNlc3Npb246OmFib3J0KTsKICAgICAgICAgfSk7CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9QcmV2aWV3UmVwYWlyVGFzay5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL1ByZXZpZXdSZXBhaXJUYXNrLmphdmEKaW5kZXggN2NlN2QxZi4uNzI4YTgxMyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL1ByZXZpZXdSZXBhaXJUYXNrLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL1ByZXZpZXdSZXBhaXJUYXNrLmphdmEKQEAgLTI3LDYgKzI3LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LkV4ZWN1dG9yUGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5SZXBhaXJNZXRyaWNzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnJlcGFpci5jb25zaXN0ZW50LlN5bmNTdGF0U3VtbWFyeTsKQEAgLTEwNCwxNCArMTA2LDE4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIFNldDxTdHJpbmc+IG1pc21hdGNoaW5nVGFibGVzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICAgICAgU2V0PEluZXRBZGRyZXNzQW5kUG9ydD4gbm9kZXMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgICAgICBTZXQ8UmFuZ2U8VG9rZW4+PiByYW5nZXMgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgICAgICAgICBmb3IgKFJlcGFpclNlc3Npb25SZXN1bHQgc2Vzc2lvblJlc3VsdCA6IHJlc3VsdHMpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZm9yIChSZXBhaXJSZXN1bHQgcmVwYWlyUmVzdWx0IDogZW1wdHlJZk51bGwoc2Vzc2lvblJlc3VsdC5yZXBhaXJKb2JSZXN1bHRzKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoU3luY1N0YXQgc3RhdCA6IGVtcHR5SWZOdWxsKHJlcGFpclJlc3VsdC5zdGF0cykpCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0Lm51bWJlck9mRGlmZmVyZW5jZXMgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0LmRpZmZlcmVuY2VzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNtYXRjaGluZ1RhYmxlcy5hZGQocmVwYWlyUmVzdWx0LmRlc2MuY29sdW1uRmFtaWx5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZXMuYWRkQWxsKHN0YXQuZGlmZmVyZW5jZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gc25hcHNob3QgYWxsIHJlcGxpY2FzLCBldmVuIGlmIHRoZXkgZG9uJ3QgaGF2ZSBhbnkgZGlmZmVyZW5jZXMKICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLmFkZChzdGF0Lm5vZGVzLmNvb3JkaW5hdG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLmFkZChzdGF0Lm5vZGVzLnBlZXIpOwpAQCAtMTI1LDEwICsxMzEsMTMgQEAKICAgICAgICAgICAgICAgICAvLyB3ZSBjYW4ganVzdCBjaGVjayBzbmFwc2hvdCBleGlzdGVuY2UgbG9jYWxseSBzaW5jZSB0aGUgcmVwYWlyIGNvb3JkaW5hdG9yIGlzIGFsd2F5cyBhIHJlcGxpY2EgKHVubGlrZSBpbiB0aGUgcmVhZCBjYXNlKQogICAgICAgICAgICAgICAgIGlmICghS2V5c3BhY2Uub3BlbihrZXlzcGFjZSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUodGFibGUpLnNuYXBzaG90RXhpc3RzKHNuYXBzaG90TmFtZSkpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygie30gU25hcHNob3R0aW5nIHt9Lnt9IGZvciBwcmV2aWV3IHJlcGFpciBtaXNtYXRjaCB3aXRoIHRhZyB7fSBvbiBpbnN0YW5jZXMge30iLAorICAgICAgICAgICAgICAgICAgICBMaXN0PFJhbmdlPFRva2VuPj4gbm9ybWFsaXplZFJhbmdlcyA9IFJhbmdlLm5vcm1hbGl6ZShyYW5nZXMpOworICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygie30gU25hcHNob3R0aW5nIHt9Lnt9IGZvciBwcmV2aWV3IHJlcGFpciBtaXNtYXRjaCBmb3IgcmFuZ2VzIHt9IHdpdGggdGFnIHt9IG9uIGluc3RhbmNlcyB7fSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0UHJldmlld0tpbmQoKS5sb2dQcmVmaXgocGFyZW50U2Vzc2lvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXNwYWNlLCB0YWJsZSwgc25hcHNob3ROYW1lLCBub2Rlcyk7Ci0gICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNTbmFwc2hvdFNlcnZpY2UucmVwYWlyZWREYXRhTWlzbWF0Y2goS2V5c3BhY2Uub3BlbihrZXlzcGFjZSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUodGFibGUpLm1ldGFkYXRhKCksIG5vZGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c3BhY2UsIHRhYmxlLCBub3JtYWxpemVkUmFuZ2VzLCBzbmFwc2hvdE5hbWUsIG5vZGVzKTsKKyAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY1NuYXBzaG90U2VydmljZS5yZXBhaXJlZERhdGFNaXNtYXRjaChLZXlzcGFjZS5vcGVuKGtleXNwYWNlKS5nZXRDb2x1bW5GYW1pbHlTdG9yZSh0YWJsZSkubWV0YWRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkUmFuZ2VzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9TeW5jU3RhdC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL1N5bmNTdGF0LmphdmEKaW5kZXggN2JiNTAzZi4uMjI0MTkxNSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL1N5bmNTdGF0LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL1N5bmNTdGF0LmphdmEKQEAgLTE3LDggKzE3LDExIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEucmVwYWlyOwogCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TZXNzaW9uU3VtbWFyeTsKIAogLyoqCkBAIC0yNywyMyArMzAsMjMgQEAKIHB1YmxpYyBjbGFzcyBTeW5jU3RhdAogewogICAgIHB1YmxpYyBmaW5hbCBTeW5jTm9kZVBhaXIgbm9kZXM7Ci0gICAgcHVibGljIGZpbmFsIGxvbmcgbnVtYmVyT2ZEaWZmZXJlbmNlczsgLy8gVE9ETzogcmV2ZXJ0IHRvIFJhbmdlPFRva2VuPgorICAgIHB1YmxpYyBmaW5hbCBDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4gZGlmZmVyZW5jZXM7CiAgICAgcHVibGljIGZpbmFsIExpc3Q8U2Vzc2lvblN1bW1hcnk+IHN1bW1hcmllczsKIAotICAgIHB1YmxpYyBTeW5jU3RhdChTeW5jTm9kZVBhaXIgbm9kZXMsIGxvbmcgbnVtYmVyT2ZEaWZmZXJlbmNlcykKKyAgICBwdWJsaWMgU3luY1N0YXQoU3luY05vZGVQYWlyIG5vZGVzLCBDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4gZGlmZmVyZW5jZXMpCiAgICAgewotICAgICAgICB0aGlzKG5vZGVzLCBudW1iZXJPZkRpZmZlcmVuY2VzLCBudWxsKTsKKyAgICAgICAgdGhpcyhub2RlcywgZGlmZmVyZW5jZXMsIG51bGwpOwogICAgIH0KIAotICAgIHB1YmxpYyBTeW5jU3RhdChTeW5jTm9kZVBhaXIgbm9kZXMsIGxvbmcgbnVtYmVyT2ZEaWZmZXJlbmNlcywgTGlzdDxTZXNzaW9uU3VtbWFyeT4gc3VtbWFyaWVzKQorICAgIHB1YmxpYyBTeW5jU3RhdChTeW5jTm9kZVBhaXIgbm9kZXMsICBDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4gZGlmZmVyZW5jZXMsIExpc3Q8U2Vzc2lvblN1bW1hcnk+IHN1bW1hcmllcykKICAgICB7CiAgICAgICAgIHRoaXMubm9kZXMgPSBub2RlczsKLSAgICAgICAgdGhpcy5udW1iZXJPZkRpZmZlcmVuY2VzID0gbnVtYmVyT2ZEaWZmZXJlbmNlczsKICAgICAgICAgdGhpcy5zdW1tYXJpZXMgPSBzdW1tYXJpZXM7CisgICAgICAgIHRoaXMuZGlmZmVyZW5jZXMgPSBkaWZmZXJlbmNlczsKICAgICB9CiAKICAgICBwdWJsaWMgU3luY1N0YXQgd2l0aFN1bW1hcmllcyhMaXN0PFNlc3Npb25TdW1tYXJ5PiBzdW1tYXJpZXMpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IFN5bmNTdGF0KG5vZGVzLCBudW1iZXJPZkRpZmZlcmVuY2VzLCBzdW1tYXJpZXMpOworICAgICAgICByZXR1cm4gbmV3IFN5bmNTdGF0KG5vZGVzLCBkaWZmZXJlbmNlcywgc3VtbWFyaWVzKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvU3luY1Rhc2suamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9TeW5jVGFzay5qYXZhCmluZGV4IGIzMjVlYjQuLjczOTNlZmYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9TeW5jVGFzay5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9TeW5jVGFzay5qYXZhCkBAIC02MCw3ICs2MCw3IEBACiAgICAgICAgIHRoaXMucmFuZ2VzVG9TeW5jID0gcmFuZ2VzVG9TeW5jOwogICAgICAgICB0aGlzLm5vZGVQYWlyID0gbmV3IFN5bmNOb2RlUGFpcihwcmltYXJ5RW5kcG9pbnQsIHBlZXIpOwogICAgICAgICB0aGlzLnByZXZpZXdLaW5kID0gcHJldmlld0tpbmQ7Ci0gICAgICAgIHRoaXMuc3RhdCA9IG5ldyBTeW5jU3RhdChub2RlUGFpciwgcmFuZ2VzVG9TeW5jLnNpemUoKSk7CisgICAgICAgIHRoaXMuc3RhdCA9IG5ldyBTeW5jU3RhdChub2RlUGFpciwgcmFuZ2VzVG9TeW5jKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzdGFydFN5bmMoKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9jb25zaXN0ZW50L0xvY2FsU2Vzc2lvbnMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9jb25zaXN0ZW50L0xvY2FsU2Vzc2lvbnMuamF2YQppbmRleCBlZDJiZjBiLi5lZDFlMzdhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvY29uc2lzdGVudC9Mb2NhbFNlc3Npb25zLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL2NvbnNpc3RlbnQvTG9jYWxTZXNzaW9ucy5qYXZhCkBAIC05OCw2ICs5OCwxMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuRnV0dXJlOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRXhlY3V0b3JGYWN0b3J5Lkdsb2JhbC5leGVjdXRvckZhY3Rvcnk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUkVQQUlSX0NMRUFOVVBfSU5URVJWQUxfU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5SRVBBSVJfREVMRVRFX1RJTUVPVVRfU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5SRVBBSVJfRkFJTF9USU1FT1VUX1NFQ09ORFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUkVQQUlSX1NUQVRVU19DSEVDS19USU1FT1VUX1NFQ09ORFM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5WZXJiLkZBSUxFRF9TRVNTSU9OX01TRzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlZlcmIuRklOQUxJWkVfUFJPTUlTRV9NU0c7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5WZXJiLlBSRVBBUkVfQ09OU0lTVEVOVF9SU1A7CkBAIC0xMjEsMjYgKzEyNSwyMiBAQAogICAgICAqIEFtb3VudCBvZiB0aW1lIGEgc2Vzc2lvbiBjYW4gZ28gd2l0aG91dCBhbnkgYWN0aXZpdHkgYmVmb3JlIHdlIHN0YXJ0IGNoZWNraW5nIHRoZSBzdGF0dXMgb2Ygb3RoZXIKICAgICAgKiBwYXJ0aWNpcGFudHMgdG8gc2VlIGlmIHdlJ3ZlIG1pc3NlZCBhIG1lc3NhZ2UKICAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IENIRUNLX1NUQVRVU19USU1FT1VUID0gSW50ZWdlci5nZXRJbnRlZ2VyKCJjYXNzYW5kcmEucmVwYWlyX3N0YXR1c19jaGVja190aW1lb3V0X3NlY29uZHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50cy5jaGVja2VkQ2FzdChUaW1lVW5pdC5IT1VSUy50b1NlY29uZHMoMSkpKTsKKyAgICBzdGF0aWMgZmluYWwgaW50IENIRUNLX1NUQVRVU19USU1FT1VUID0gUkVQQUlSX1NUQVRVU19DSEVDS19USU1FT1VUX1NFQ09ORFMuZ2V0SW50KCk7CiAKICAgICAvKioKICAgICAgKiBBbW91bnQgb2YgdGltZSBhIHNlc3Npb24gY2FuIGdvIHdpdGhvdXQgYW55IGFjdGl2aXR5IGJlZm9yZSBiZWluZyBhdXRvbWF0aWNhbGx5IHNldCB0byBGQUlMRUQKICAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEFVVE9fRkFJTF9USU1FT1VUID0gSW50ZWdlci5nZXRJbnRlZ2VyKCJjYXNzYW5kcmEucmVwYWlyX2ZhaWxfdGltZW91dF9zZWNvbmRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHMuY2hlY2tlZENhc3QoVGltZVVuaXQuREFZUy50b1NlY29uZHMoMSkpKTsKKyAgICBzdGF0aWMgZmluYWwgaW50IEFVVE9fRkFJTF9USU1FT1VUID0gUkVQQUlSX0ZBSUxfVElNRU9VVF9TRUNPTkRTLmdldEludCgpOwogCiAgICAgLyoqCiAgICAgICogQW1vdW50IG9mIHRpbWUgYSBjb21wbGV0ZWQgc2Vzc2lvbiBpcyBrZXB0IGFyb3VuZCBhZnRlciBjb21wbGV0aW9uIGJlZm9yZSBiZWluZyBkZWxldGVkLCB0aGlzIGdpdmVzCiAgICAgICogY29tcGFjdGlvbiBwbGVudHkgb2YgdGltZSB0byBtb3ZlIHNzdGFibGVzIGZyb20gc3VjY2Vzc2Z1bCBzZXNzaW9ucyBpbnRvIHRoZSByZXBhaXJlZCBidWNrZXQKICAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEFVVE9fREVMRVRFX1RJTUVPVVQgPSBJbnRlZ2VyLmdldEludGVnZXIoImNhc3NhbmRyYS5yZXBhaXJfZGVsZXRlX3RpbWVvdXRfc2Vjb25kcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHMuY2hlY2tlZENhc3QoVGltZVVuaXQuREFZUy50b1NlY29uZHMoMSkpKTsKKyAgICBzdGF0aWMgZmluYWwgaW50IEFVVE9fREVMRVRFX1RJTUVPVVQgPSBSRVBBSVJfREVMRVRFX1RJTUVPVVRfU0VDT05EUy5nZXRJbnQoKTsKICAgICAvKioKICAgICAgKiBIb3cgb2Z0ZW4gTG9jYWxTZXNzaW9ucy5jbGVhbnVwIGlzIHJ1bgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMRUFOVVBfSU5URVJWQUwgPSBJbnRlZ2VyLmdldEludGVnZXIoImNhc3NhbmRyYS5yZXBhaXJfY2xlYW51cF9pbnRlcnZhbF9zZWNvbmRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHMuY2hlY2tlZENhc3QoVGltZVVuaXQuTUlOVVRFUy50b1NlY29uZHMoMTApKSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xFQU5VUF9JTlRFUlZBTCA9IFJFUEFJUl9DTEVBTlVQX0lOVEVSVkFMX1NFQ09ORFMuZ2V0SW50KCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBTZXQ8VGFibGVJZD4gdXVpZFRvVGFibGVJZChTZXQ8VVVJRD4gc3JjKQogICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9jb25zaXN0ZW50L1N5bmNTdGF0U3VtbWFyeS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL2NvbnNpc3RlbnQvU3luY1N0YXRTdW1tYXJ5LmphdmEKaW5kZXggM2QyMTcwMi4uODU1YWQ0YiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL2NvbnNpc3RlbnQvU3luY1N0YXRTdW1tYXJ5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL2NvbnNpc3RlbnQvU3luY1N0YXRTdW1tYXJ5LmphdmEKQEAgLTIxLDEzICsyMSwxOCBAQAogaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEucmVwYWlyLlJlcGFpclJlc3VsdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5yZXBhaXIuUmVwYWlyU2Vzc2lvblJlc3VsdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5yZXBhaXIuU3luY1N0YXQ7CkBAIC01MCw3ICs1NSw3IEBACiAKICAgICAgICAgaW50IGZpbGVzID0gMDsKICAgICAgICAgbG9uZyBieXRlcyA9IDA7Ci0gICAgICAgIGxvbmcgcmFuZ2VzID0gMDsKKyAgICAgICAgU2V0PFJhbmdlPFRva2VuPj4gcmFuZ2VzID0gbmV3IEhhc2hTZXQ8PigpOwogCiAgICAgICAgIFNlc3Npb24oSW5ldFNvY2tldEFkZHJlc3Mgc3JjLCBJbmV0U29ja2V0QWRkcmVzcyBkc3QpCiAgICAgICAgIHsKQEAgLTY0LDE1ICs2OSwxNSBAQAogICAgICAgICAgICAgYnl0ZXMgKz0gc3VtbWFyeS50b3RhbFNpemU7CiAgICAgICAgIH0KIAotICAgICAgICB2b2lkIGNvbnN1bWVTdW1tYXJpZXMoQ29sbGVjdGlvbjxTdHJlYW1TdW1tYXJ5PiBzdW1tYXJpZXMsIGxvbmcgbnVtUmFuZ2VzKQorICAgICAgICB2b2lkIGNvbnN1bWVTdW1tYXJpZXMoQ29sbGVjdGlvbjxTdHJlYW1TdW1tYXJ5PiBzdW1tYXJpZXMsIENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+PiByYW5nZXMpCiAgICAgICAgIHsKICAgICAgICAgICAgIHN1bW1hcmllcy5mb3JFYWNoKHRoaXM6OmNvbnN1bWVTdW1tYXJ5KTsKLSAgICAgICAgICAgIHJhbmdlcyArPSBudW1SYW5nZXM7CisgICAgICAgICAgICB0aGlzLnJhbmdlcy5hZGRBbGwocmFuZ2VzKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMgLT4gJXM6ICVzIHJhbmdlcywgJXMgc3N0YWJsZXMsICVzIGJ5dGVzIiwgc3JjLCBkc3QsIHJhbmdlcywgZmlsZXMsIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KGJ5dGVzKSk7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMgLT4gJXM6ICVzIHJhbmdlcywgJXMgc3N0YWJsZXMsICVzIGJ5dGVzIiwgc3JjLCBkc3QsIHJhbmdlcy5zaXplKCksIGZpbGVzLCBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShieXRlcykpOwogICAgICAgICB9CiAgICAgfQogCkBAIC04NCw3ICs4OSw3IEBACiAKICAgICAgICAgaW50IGZpbGVzID0gLTE7CiAgICAgICAgIGxvbmcgYnl0ZXMgPSAtMTsKLSAgICAgICAgaW50IHJhbmdlcyA9IC0xOworICAgICAgICBDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4gcmFuZ2VzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICBib29sZWFuIHRvdGFsc0NhbGN1bGF0ZWQgPSBmYWxzZTsKIAogICAgICAgICBmaW5hbCBNYXA8UGFpcjxJbmV0U29ja2V0QWRkcmVzcywgSW5ldFNvY2tldEFkZHJlc3M+LCBTZXNzaW9uPiBzZXNzaW9ucyA9IG5ldyBIYXNoTWFwPD4oKTsKQEAgLTEwOSw4ICsxMTQsOCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBmb3IgKFNlc3Npb25TdW1tYXJ5IHN1bW1hcnk6IHN0YXQuc3VtbWFyaWVzKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldE9yQ3JlYXRlKHN1bW1hcnkuY29vcmRpbmF0b3IsIHN1bW1hcnkucGVlcikuY29uc3VtZVN1bW1hcmllcyhzdW1tYXJ5LnNlbmRpbmdTdW1tYXJpZXMsIHN0YXQubnVtYmVyT2ZEaWZmZXJlbmNlcyk7Ci0gICAgICAgICAgICAgICAgZ2V0T3JDcmVhdGUoc3VtbWFyeS5wZWVyLCBzdW1tYXJ5LmNvb3JkaW5hdG9yKS5jb25zdW1lU3VtbWFyaWVzKHN1bW1hcnkucmVjZWl2aW5nU3VtbWFyaWVzLCBzdGF0Lm51bWJlck9mRGlmZmVyZW5jZXMpOworICAgICAgICAgICAgICAgIGdldE9yQ3JlYXRlKHN1bW1hcnkuY29vcmRpbmF0b3IsIHN1bW1hcnkucGVlcikuY29uc3VtZVN1bW1hcmllcyhzdW1tYXJ5LnNlbmRpbmdTdW1tYXJpZXMsIHN0YXQuZGlmZmVyZW5jZXMpOworICAgICAgICAgICAgICAgIGdldE9yQ3JlYXRlKHN1bW1hcnkucGVlciwgc3VtbWFyeS5jb29yZGluYXRvcikuY29uc3VtZVN1bW1hcmllcyhzdW1tYXJ5LnJlY2VpdmluZ1N1bW1hcmllcywgc3RhdC5kaWZmZXJlbmNlcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTIzLDEyICsxMjgsMTIgQEAKICAgICAgICAgewogICAgICAgICAgICAgZmlsZXMgPSAwOwogICAgICAgICAgICAgYnl0ZXMgPSAwOwotICAgICAgICAgICAgcmFuZ2VzID0gMDsKKyAgICAgICAgICAgIHJhbmdlcyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgICAgIGZvciAoU2Vzc2lvbiBzZXNzaW9uOiBzZXNzaW9ucy52YWx1ZXMoKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBmaWxlcyArPSBzZXNzaW9uLmZpbGVzOwogICAgICAgICAgICAgICAgIGJ5dGVzICs9IHNlc3Npb24uYnl0ZXM7Ci0gICAgICAgICAgICAgICAgcmFuZ2VzICs9IHNlc3Npb24ucmFuZ2VzOworICAgICAgICAgICAgICAgIHJhbmdlcy5hZGRBbGwoc2Vzc2lvbi5yYW5nZXMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdG90YWxzQ2FsY3VsYXRlZCA9IHRydWU7CiAgICAgICAgIH0KQEAgLTE0NywyMSArMTUyLDM2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIG91dHB1dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAKLSAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiJXMuJXMgLSAlcyByYW5nZXMsICVzIHNzdGFibGVzLCAlcyBieXRlc1xuIiwga2V5c3BhY2UsIHRhYmxlLCByYW5nZXMsIGZpbGVzLCBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShieXRlcykpKTsKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiJXMuJXMgLSAlcyByYW5nZXMsICVzIHNzdGFibGVzLCAlcyBieXRlc1xuIiwga2V5c3BhY2UsIHRhYmxlLCByYW5nZXMuc2l6ZSgpLCBmaWxlcywgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoYnl0ZXMpKSk7CisgICAgICAgICAgICBpZiAocmFuZ2VzLnNpemUoKSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiICAgIE1pc21hdGNoaW5nIHJhbmdlczogIik7CisgICAgICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgICAgIEl0ZXJhdG9yPFJhbmdlPFRva2VuPj4gcmFuZ2VJdGVyYXRvciA9IHJhbmdlcy5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIHdoaWxlIChyYW5nZUl0ZXJhdG9yLmhhc05leHQoKSAmJiBpIDwgMzApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSYW5nZTxUb2tlbj4gciA9IHJhbmdlSXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCcoJykuYXBwZW5kKHIubGVmdCkuYXBwZW5kKCcsJykuYXBwZW5kKHIucmlnaHQpLmFwcGVuZCgiXSwiKTsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAzMCkKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiLi4uIik7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZChTeXN0ZW0ubGluZVNlcGFyYXRvcigpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvciAoU2Vzc2lvbiBzZXNzaW9uOiBzZXNzaW9ucy52YWx1ZXMoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIgICAgIikuYXBwZW5kKHNlc3Npb24udG9TdHJpbmcoKSkuYXBwZW5kKCdcbicpOworICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIiAgICAiKS5hcHBlbmQoc2Vzc2lvbi50b1N0cmluZygpKS5hcHBlbmQoU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gb3V0cHV0LnRvU3RyaW5nKCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIE1hcDxQYWlyPFN0cmluZywgU3RyaW5nPiwgVGFibGU+IHN1bW1hcmllcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxQYWlyPFN0cmluZywgU3RyaW5nPiwgVGFibGU+IHN1bW1hcmllcyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNFc3RpbWF0ZTsKIAogICAgIHByaXZhdGUgaW50IGZpbGVzID0gLTE7CiAgICAgcHJpdmF0ZSBsb25nIGJ5dGVzID0gLTE7Ci0gICAgcHJpdmF0ZSBpbnQgcmFuZ2VzID0gLTE7CisgICAgcHJpdmF0ZSBTZXQ8UmFuZ2U8VG9rZW4+PiByYW5nZXMgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgcHJpdmF0ZSBib29sZWFuIHRvdGFsc0NhbGN1bGF0ZWQgPSBmYWxzZTsKIAogICAgIHB1YmxpYyBTeW5jU3RhdFN1bW1hcnkoYm9vbGVhbiBpc0VzdGltYXRlKQpAQCAtMTkwLDE0ICsyMTAsMTQgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKICAgICB7CiAgICAgICAgIGNhbGN1bGF0ZVRvdGFscygpOwotICAgICAgICByZXR1cm4gZmlsZXMgPT0gMCAmJiBieXRlcyA9PSAwICYmIHJhbmdlcyA9PSAwOworICAgICAgICByZXR1cm4gZmlsZXMgPT0gMCAmJiBieXRlcyA9PSAwICYmIHJhbmdlcy5pc0VtcHR5KCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVRvdGFscygpCiAgICAgewogICAgICAgICBmaWxlcyA9IDA7CiAgICAgICAgIGJ5dGVzID0gMDsKLSAgICAgICAgcmFuZ2VzID0gMDsKKyAgICAgICAgcmFuZ2VzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICBzdW1tYXJpZXMudmFsdWVzKCkuZm9yRWFjaChUYWJsZTo6Y2FsY3VsYXRlVG90YWxzKTsKICAgICAgICAgZm9yIChUYWJsZSB0YWJsZTogc3VtbWFyaWVzLnZhbHVlcygpKQogICAgICAgICB7CkBAIC0yMDgsNyArMjI4LDcgQEAKICAgICAgICAgICAgIHRhYmxlLmNhbGN1bGF0ZVRvdGFscygpOwogICAgICAgICAgICAgZmlsZXMgKz0gdGFibGUuZmlsZXM7CiAgICAgICAgICAgICBieXRlcyArPSB0YWJsZS5ieXRlczsKLSAgICAgICAgICAgIHJhbmdlcyArPSB0YWJsZS5yYW5nZXM7CisgICAgICAgICAgICByYW5nZXMuYWRkQWxsKHRhYmxlLnJhbmdlcyk7CiAgICAgICAgIH0KICAgICAgICAgdG90YWxzQ2FsY3VsYXRlZCA9IHRydWU7CiAgICAgfQpAQCAtMjI4LDExICsyNDgsMTEgQEAKIAogICAgICAgICBpZiAoaXNFc3RpbWF0ZSkKICAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0LmFwcGVuZChTdHJpbmcuZm9ybWF0KCJUb3RhbCBlc3RpbWF0ZWQgc3RyZWFtaW5nOiAlcyByYW5nZXMsICVzIHNzdGFibGVzLCAlcyBieXRlc1xuIiwgcmFuZ2VzLCBmaWxlcywgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoYnl0ZXMpKSk7CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKFN0cmluZy5mb3JtYXQoIlRvdGFsIGVzdGltYXRlZCBzdHJlYW1pbmc6ICVzIHJhbmdlcywgJXMgc3N0YWJsZXMsICVzIGJ5dGVzXG4iLCByYW5nZXMuc2l6ZSgpLCBmaWxlcywgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoYnl0ZXMpKSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXQuYXBwZW5kKFN0cmluZy5mb3JtYXQoIlRvdGFsIHN0cmVhbWluZzogJXMgcmFuZ2VzLCAlcyBzc3RhYmxlcywgJXMgYnl0ZXNcbiIsIHJhbmdlcywgZmlsZXMsIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KGJ5dGVzKSkpOworICAgICAgICAgICAgb3V0cHV0LmFwcGVuZChTdHJpbmcuZm9ybWF0KCJUb3RhbCBzdHJlYW1pbmc6ICVzIHJhbmdlcywgJXMgc3N0YWJsZXMsICVzIGJ5dGVzXG4iLCByYW5nZXMuc2l6ZSgpLCBmaWxlcywgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoYnl0ZXMpKSk7CiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKFBhaXI8U3RyaW5nLCBTdHJpbmc+IHRhYmxlTmFtZTogdGFibGVzKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL2NvbnNpc3RlbnQvYWRtaW4vQ2xlYW51cFN1bW1hcnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9jb25zaXN0ZW50L2FkbWluL0NsZWFudXBTdW1tYXJ5LmphdmEKaW5kZXggMmQyMWRlYi4uODliMWVlYyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL2NvbnNpc3RlbnQvYWRtaW4vQ2xlYW51cFN1bW1hcnkuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvY29uc2lzdGVudC9hZG1pbi9DbGVhbnVwU3VtbWFyeS5qYXZhCkBAIC0zMiw3ICszMiw2IEBACiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uU2ltcGxlVHlwZTsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CkBAIC01Nyw3ICs1Niw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKE9wZW5EYXRhRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEyNiw3ICsxMjUsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChPcGVuRGF0YUV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvY29uc2lzdGVudC9hZG1pbi9QZW5kaW5nU3RhdC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL2NvbnNpc3RlbnQvYWRtaW4vUGVuZGluZ1N0YXQuamF2YQppbmRleCBiN2Q0ZmVhLi4wZjUwZTBlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvY29uc2lzdGVudC9hZG1pbi9QZW5kaW5nU3RhdC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9jb25zaXN0ZW50L2FkbWluL1BlbmRpbmdTdGF0LmphdmEKQEAgLTMyLDcgKzMyLDYgQEAKIGltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5TaW1wbGVUeXBlOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlczsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CkBAIC01NSw3ICs1NCw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKE9wZW5EYXRhRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTk0LDcgKzkzLDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoT3BlbkRhdGFFeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5wcm9wYWdhdGUoZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL2NvbnNpc3RlbnQvYWRtaW4vUGVuZGluZ1N0YXRzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvY29uc2lzdGVudC9hZG1pbi9QZW5kaW5nU3RhdHMuamF2YQppbmRleCBmMWI1MTVlLi5lMjUzYTBlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvY29uc2lzdGVudC9hZG1pbi9QZW5kaW5nU3RhdHMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvY29uc2lzdGVudC9hZG1pbi9QZW5kaW5nU3RhdHMuamF2YQpAQCAtMjgsNyArMjgsNiBAQAogaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLlNpbXBsZVR5cGU7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOwogCiBwdWJsaWMgY2xhc3MgUGVuZGluZ1N0YXRzCiB7CkBAIC01MSw3ICs1MCw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKE9wZW5EYXRhRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTg3LDcgKzg2LDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoT3BlbkRhdGFFeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5wcm9wYWdhdGUoZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL2NvbnNpc3RlbnQvYWRtaW4vUmVwYWlyU3RhdHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9jb25zaXN0ZW50L2FkbWluL1JlcGFpclN0YXRzLmphdmEKaW5kZXggYmJiNDc3OC4uNmQzZTQyNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL2NvbnNpc3RlbnQvYWRtaW4vUmVwYWlyU3RhdHMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvY29uc2lzdGVudC9hZG1pbi9SZXBhaXJTdGF0cy5qYXZhCkBAIC0yNSw3ICsyNSw2IEBACiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uKjsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5yZXBhaXIuY29uc2lzdGVudC5SZXBhaXJlZFN0YXRlOwogCkBAIC00Nyw3ICs0Niw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoT3BlbkRhdGFFeGNlcHRpb24gZSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC03NSw3ICs3NCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoT3BlbkRhdGFFeGNlcHRpb24gZSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xMTIsNyArMTExLDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoT3BlbkRhdGFFeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5wcm9wYWdhdGUoZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTY1LDcgKzE2NCw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKE9wZW5EYXRhRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9tZXNzYWdlcy9SZXBhaXJPcHRpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9tZXNzYWdlcy9SZXBhaXJPcHRpb24uamF2YQppbmRleCA2YmI3ZmRiLi5mMDUwOGEzIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvbWVzc2FnZXMvUmVwYWlyT3B0aW9uLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL21lc3NhZ2VzL1JlcGFpck9wdGlvbi5qYXZhCkBAIC0zOTUsMjIgKzM5NSwyMCBAQAogCiAgICAgcHVibGljIGJvb2xlYW4gb3B0aW1pc2VTdHJlYW1zKCkKICAgICB7Ci0gICAgICAgIGlmKG9wdGltaXNlU3RyZWFtcykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGlmIChpc1B1bGxSZXBhaXIoKSB8fCBpc0ZvcmNlZFJlcGFpcigpKQorICAgICAgICBpZiAoaXNQdWxsUmVwYWlyKCkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgaWYgKGlzSW5jcmVtZW50YWwoKSAmJiBEYXRhYmFzZURlc2NyaXB0b3IuYXV0b09wdGltaXNlSW5jUmVwYWlyU3RyZWFtcygpKQorICAgICAgICBpZiAoaXNQcmV2aWV3KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChEYXRhYmFzZURlc2NyaXB0b3IuYXV0b09wdGltaXNlUHJldmlld1JlcGFpclN0cmVhbXMoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpc0luY3JlbWVudGFsKCkgJiYgRGF0YWJhc2VEZXNjcmlwdG9yLmF1dG9PcHRpbWlzZUluY1JlcGFpclN0cmVhbXMoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBlbHNlIGlmICghaXNJbmNyZW1lbnRhbCgpICYmIERhdGFiYXNlRGVzY3JpcHRvci5hdXRvT3B0aW1pc2VGdWxsUmVwYWlyU3RyZWFtcygpKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICAgICAgaWYgKGlzUHJldmlldygpICYmIERhdGFiYXNlRGVzY3JpcHRvci5hdXRvT3B0aW1pc2VQcmV2aWV3UmVwYWlyU3RyZWFtcygpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgaWYgKCFpc0luY3JlbWVudGFsKCkgJiYgRGF0YWJhc2VEZXNjcmlwdG9yLmF1dG9PcHRpbWlzZUZ1bGxSZXBhaXJTdHJlYW1zKCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBvcHRpbWlzZVN0cmVhbXM7CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gaWdub3JlVW5yZXBsaWNhdGVkS2V5c3BhY2VzKCkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9Db2x1bW5NZXRhZGF0YS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL0NvbHVtbk1ldGFkYXRhLmphdmEKaW5kZXggZmRiZDE2Ni4uZjY4YTdiNSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL0NvbHVtbk1ldGFkYXRhLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL0NvbHVtbk1ldGFkYXRhLmphdmEKQEAgLTIxLDExICsyMSwxNCBAQAogaW1wb3J0IGphdmEudXRpbC4qOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CiAKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Nb3JlT2JqZWN0czsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkNvbGxlY3Rpb25zMjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nLkNvbHVtbk1hc2s7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zZWxlY3Rpb24uU2VsZWN0YWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnNlbGVjdGlvbi5TZWxlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnNlbGVjdGlvbi5TaW1wbGVTZWxlY3RvcjsKQEAgLTk1LDYgKzk4LDEyIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGNvbXBhcmlzb25PcmRlcjsKIAorICAgIC8qKgorICAgICAqIE1hc2tpbmcgZnVuY3Rpb24gdXNlZCB0byBkeW5hbWljYWxseSBtYXNrIHRoZSBjb250ZW50cyBvZiB0aGlzIGNvbHVtbi4KKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBwcml2YXRlIGZpbmFsIENvbHVtbk1hc2sgbWFzazsKKwogICAgIHByaXZhdGUgc3RhdGljIGxvbmcgY29tcGFyaXNvbk9yZGVyKEtpbmQga2luZCwgYm9vbGVhbiBpc0NvbXBsZXgsIGxvbmcgcG9zaXRpb24sIENvbHVtbklkZW50aWZpZXIgbmFtZSkKICAgICB7CiAgICAgICAgIGFzc2VydCBwb3NpdGlvbiA+PSAwICYmIHBvc2l0aW9uIDwgMSA8PCAxMjsKQEAgLTEwNiw1MiArMTE1LDU4IEBACiAKICAgICBwdWJsaWMgc3RhdGljIENvbHVtbk1ldGFkYXRhIHBhcnRpdGlvbktleUNvbHVtbihUYWJsZU1ldGFkYXRhIHRhYmxlLCBCeXRlQnVmZmVyIG5hbWUsIEFic3RyYWN0VHlwZTw/PiB0eXBlLCBpbnQgcG9zaXRpb24pCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKHRhYmxlLCBuYW1lLCB0eXBlLCBwb3NpdGlvbiwgS2luZC5QQVJUSVRJT05fS0VZKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5NZXRhZGF0YSh0YWJsZSwgbmFtZSwgdHlwZSwgcG9zaXRpb24sIEtpbmQuUEFSVElUSU9OX0tFWSwgbnVsbCk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBDb2x1bW5NZXRhZGF0YSBwYXJ0aXRpb25LZXlDb2x1bW4oU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUsIFN0cmluZyBuYW1lLCBBYnN0cmFjdFR5cGU8Pz4gdHlwZSwgaW50IHBvc2l0aW9uKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5NZXRhZGF0YShrZXlzcGFjZSwgdGFibGUsIENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQobmFtZSwgdHJ1ZSksIHR5cGUsIHBvc2l0aW9uLCBLaW5kLlBBUlRJVElPTl9LRVkpOworICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKGtleXNwYWNlLCB0YWJsZSwgQ29sdW1uSWRlbnRpZmllci5nZXRJbnRlcm5lZChuYW1lLCB0cnVlKSwgdHlwZSwgcG9zaXRpb24sIEtpbmQuUEFSVElUSU9OX0tFWSwgbnVsbCk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBDb2x1bW5NZXRhZGF0YSBjbHVzdGVyaW5nQ29sdW1uKFRhYmxlTWV0YWRhdGEgdGFibGUsIEJ5dGVCdWZmZXIgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHR5cGUsIGludCBwb3NpdGlvbikKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEodGFibGUsIG5hbWUsIHR5cGUsIHBvc2l0aW9uLCBLaW5kLkNMVVNURVJJTkcpOworICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKHRhYmxlLCBuYW1lLCB0eXBlLCBwb3NpdGlvbiwgS2luZC5DTFVTVEVSSU5HLCBudWxsKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIENvbHVtbk1ldGFkYXRhIGNsdXN0ZXJpbmdDb2x1bW4oU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUsIFN0cmluZyBuYW1lLCBBYnN0cmFjdFR5cGU8Pz4gdHlwZSwgaW50IHBvc2l0aW9uKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5NZXRhZGF0YShrZXlzcGFjZSwgdGFibGUsIENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQobmFtZSwgdHJ1ZSksIHR5cGUsIHBvc2l0aW9uLCBLaW5kLkNMVVNURVJJTkcpOworICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKGtleXNwYWNlLCB0YWJsZSwgQ29sdW1uSWRlbnRpZmllci5nZXRJbnRlcm5lZChuYW1lLCB0cnVlKSwgdHlwZSwgcG9zaXRpb24sIEtpbmQuQ0xVU1RFUklORywgbnVsbCk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBDb2x1bW5NZXRhZGF0YSByZWd1bGFyQ29sdW1uKFRhYmxlTWV0YWRhdGEgdGFibGUsIEJ5dGVCdWZmZXIgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHR5cGUpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKHRhYmxlLCBuYW1lLCB0eXBlLCBOT19QT1NJVElPTiwgS2luZC5SRUdVTEFSKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5NZXRhZGF0YSh0YWJsZSwgbmFtZSwgdHlwZSwgTk9fUE9TSVRJT04sIEtpbmQuUkVHVUxBUiwgbnVsbCk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBDb2x1bW5NZXRhZGF0YSByZWd1bGFyQ29sdW1uKFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlLCBTdHJpbmcgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHR5cGUpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKGtleXNwYWNlLCB0YWJsZSwgQ29sdW1uSWRlbnRpZmllci5nZXRJbnRlcm5lZChuYW1lLCB0cnVlKSwgdHlwZSwgTk9fUE9TSVRJT04sIEtpbmQuUkVHVUxBUik7CisgICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoa2V5c3BhY2UsIHRhYmxlLCBDb2x1bW5JZGVudGlmaWVyLmdldEludGVybmVkKG5hbWUsIHRydWUpLCB0eXBlLCBOT19QT1NJVElPTiwgS2luZC5SRUdVTEFSLCBudWxsKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIENvbHVtbk1ldGFkYXRhIHN0YXRpY0NvbHVtbihUYWJsZU1ldGFkYXRhIHRhYmxlLCBCeXRlQnVmZmVyIG5hbWUsIEFic3RyYWN0VHlwZTw/PiB0eXBlKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5NZXRhZGF0YSh0YWJsZSwgbmFtZSwgdHlwZSwgTk9fUE9TSVRJT04sIEtpbmQuU1RBVElDKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5NZXRhZGF0YSh0YWJsZSwgbmFtZSwgdHlwZSwgTk9fUE9TSVRJT04sIEtpbmQuU1RBVElDLCBudWxsKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIENvbHVtbk1ldGFkYXRhIHN0YXRpY0NvbHVtbihTdHJpbmcga2V5c3BhY2UsIFN0cmluZyB0YWJsZSwgU3RyaW5nIG5hbWUsIEFic3RyYWN0VHlwZTw/PiB0eXBlKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5NZXRhZGF0YShrZXlzcGFjZSwgdGFibGUsIENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQobmFtZSwgdHJ1ZSksIHR5cGUsIE5PX1BPU0lUSU9OLCBLaW5kLlNUQVRJQyk7CisgICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoa2V5c3BhY2UsIHRhYmxlLCBDb2x1bW5JZGVudGlmaWVyLmdldEludGVybmVkKG5hbWUsIHRydWUpLCB0eXBlLCBOT19QT1NJVElPTiwgS2luZC5TVEFUSUMsIG51bGwpOwogICAgIH0KIAotICAgIHB1YmxpYyBDb2x1bW5NZXRhZGF0YShUYWJsZU1ldGFkYXRhIHRhYmxlLCBCeXRlQnVmZmVyIG5hbWUsIEFic3RyYWN0VHlwZTw/PiB0eXBlLCBpbnQgcG9zaXRpb24sIEtpbmQga2luZCkKKyAgICBwdWJsaWMgQ29sdW1uTWV0YWRhdGEoVGFibGVNZXRhZGF0YSB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBLaW5kIGtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBDb2x1bW5NYXNrIG1hc2spCiAgICAgewogICAgICAgICB0aGlzKHRhYmxlLmtleXNwYWNlLAogICAgICAgICAgICAgIHRhYmxlLm5hbWUsCiAgICAgICAgICAgICAgQ29sdW1uSWRlbnRpZmllci5nZXRJbnRlcm5lZChuYW1lLCBVVEY4VHlwZS5pbnN0YW5jZSksCiAgICAgICAgICAgICAgdHlwZSwKICAgICAgICAgICAgICBwb3NpdGlvbiwKLSAgICAgICAgICAgICBraW5kKTsKKyAgICAgICAgICAgICBraW5kLAorICAgICAgICAgICAgIG1hc2spOwogICAgIH0KIAogICAgIEBWaXNpYmxlRm9yVGVzdGluZwpAQCAtMTYwLDE4ICsxNzUsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uSWRlbnRpZmllciBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBLaW5kIGtpbmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtpbmQga2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQE51bGxhYmxlIENvbHVtbk1hc2sgbWFzaykKICAgICB7CiAgICAgICAgIHN1cGVyKGtzTmFtZSwgY2ZOYW1lLCBuYW1lLCB0eXBlKTsKICAgICAgICAgYXNzZXJ0IG5hbWUgIT0gbnVsbCAmJiB0eXBlICE9IG51bGwgJiYga2luZCAhPSBudWxsOwogICAgICAgICBhc3NlcnQgKHBvc2l0aW9uID09IE5PX1BPU0lUSU9OKSA9PSAha2luZC5pc1ByaW1hcnlLZXlLaW5kKCk7IC8vIFRoZSBwb3NpdGlvbiByZWFsbHkgb25seSBtYWtlIHNlbnNlIGZvciBwYXJ0aXRpb24gYW5kIGNsdXN0ZXJpbmcgY29sdW1ucyAoYW5kIHRob3NlIG11c3QgaGF2ZSBvbmUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIG1ha2Ugc3VyZSB3ZSBkb24ndCBzbmVhayBpdCBmb3Igc29tZXRoaW5nIGVsc2Ugc2luY2UgaXQnZCBicmVha3MgZXF1YWxzKCkKKworICAgICAgICAvLyBUaGUgcHJvcGFnYXRpb24gb2Ygc3lzdGVtIGRpc3RyaWJ1dGVkIGtleXNwYWNlcyBhdCBzdGFydHVwIGNhbiBiZSBwcm9ibGVtYXRpYyBmb3Igb2xkIG5vZGVzIHdpdGhvdXQgRERNLAorICAgICAgICAvLyBzaW5jZSB0aG9zZSB3b24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCB0aGUgbWFzayBtdXRhdGlvbnMuIFRodXMsIHdlIGRvbid0IHN1cHBvcnQgRERNIG9uIHRob3NlIGtleXNwYWNlcy4KKyAgICAgICAgaWYgKG1hc2sgIT0gbnVsbCAmJiBTY2hlbWFDb25zdGFudHMuaXNSZXBsaWNhdGVkU3lzdGVtS2V5c3BhY2Uoa3NOYW1lKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiRERNIGlzIG5vdCBzdXBwb3J0ZWQgb24gc3lzdGVtIGRpc3RyaWJ1dGVkIGtleXNwYWNlcyIpOworCiAgICAgICAgIHRoaXMua2luZCA9IGtpbmQ7CiAgICAgICAgIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjsKICAgICAgICAgdGhpcy5jZWxsUGF0aENvbXBhcmF0b3IgPSBtYWtlQ2VsbFBhdGhDb21wYXJhdG9yKGtpbmQsIHR5cGUpOwogICAgICAgICB0aGlzLmNlbGxDb21wYXJhdG9yID0gY2VsbFBhdGhDb21wYXJhdG9yID09IG51bGwgPyBDb2x1bW5EYXRhLmNvbXBhcmF0b3IgOiAoYSwgYikgLT4gY2VsbFBhdGhDb21wYXJhdG9yLmNvbXBhcmUoYS5wYXRoKCksIGIucGF0aCgpKTsKICAgICAgICAgdGhpcy5hc3ltbWV0cmljQ2VsbFBhdGhDb21wYXJhdG9yID0gY2VsbFBhdGhDb21wYXJhdG9yID09IG51bGwgPyBudWxsIDogKGEsIGIpIC0+IGNlbGxQYXRoQ29tcGFyYXRvci5jb21wYXJlKCgoQ2VsbDw/PilhKS5wYXRoKCksIChDZWxsUGF0aCkgYik7CiAgICAgICAgIHRoaXMuY29tcGFyaXNvbk9yZGVyID0gY29tcGFyaXNvbk9yZGVyKGtpbmQsIGlzQ29tcGxleCgpLCBNYXRoLm1heCgwLCBwb3NpdGlvbiksIG5hbWUpOworICAgICAgICB0aGlzLm1hc2sgPSBtYXNrOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIENvbXBhcmF0b3I8Q2VsbFBhdGg+IG1ha2VDZWxsUGF0aENvbXBhcmF0b3IoS2luZCBraW5kLCBBYnN0cmFjdFR5cGU8Pz4gdHlwZSkKQEAgLTIwMywxNyArMjI2LDIyIEBACiAKICAgICBwdWJsaWMgQ29sdW1uTWV0YWRhdGEgY29weSgpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKGtzTmFtZSwgY2ZOYW1lLCBuYW1lLCB0eXBlLCBwb3NpdGlvbiwga2luZCk7CisgICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoa3NOYW1lLCBjZk5hbWUsIG5hbWUsIHR5cGUsIHBvc2l0aW9uLCBraW5kLCBtYXNrKTsKICAgICB9CiAKICAgICBwdWJsaWMgQ29sdW1uTWV0YWRhdGEgd2l0aE5ld05hbWUoQ29sdW1uSWRlbnRpZmllciBuZXdOYW1lKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5NZXRhZGF0YShrc05hbWUsIGNmTmFtZSwgbmV3TmFtZSwgdHlwZSwgcG9zaXRpb24sIGtpbmQpOworICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKGtzTmFtZSwgY2ZOYW1lLCBuZXdOYW1lLCB0eXBlLCBwb3NpdGlvbiwga2luZCwgbWFzayk7CiAgICAgfQogCiAgICAgcHVibGljIENvbHVtbk1ldGFkYXRhIHdpdGhOZXdUeXBlKEFic3RyYWN0VHlwZTw/PiBuZXdUeXBlKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5NZXRhZGF0YShrc05hbWUsIGNmTmFtZSwgbmFtZSwgbmV3VHlwZSwgcG9zaXRpb24sIGtpbmQpOworICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKGtzTmFtZSwgY2ZOYW1lLCBuYW1lLCBuZXdUeXBlLCBwb3NpdGlvbiwga2luZCwgbWFzayk7CisgICAgfQorCisgICAgcHVibGljIENvbHVtbk1ldGFkYXRhIHdpdGhOZXdNYXNrKEBOdWxsYWJsZSBDb2x1bW5NYXNrIG5ld01hc2spCisgICAgeworICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKGtzTmFtZSwgY2ZOYW1lLCBuYW1lLCB0eXBlLCBwb3NpdGlvbiwga2luZCwgbmV3TWFzayk7CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gaXNQYXJ0aXRpb25LZXkoKQpAQCAtMjMxLDYgKzI1OSwxMSBAQAogICAgICAgICByZXR1cm4ga2luZCA9PSBLaW5kLlNUQVRJQzsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc01hc2tlZCgpCisgICAgeworICAgICAgICByZXR1cm4gbWFzayAhPSBudWxsOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzUmVndWxhcigpCiAgICAgewogICAgICAgICByZXR1cm4ga2luZCA9PSBLaW5kLlJFR1VMQVI7CkBAIC0yNDksNiArMjgyLDEyIEBACiAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKICAgICB9CiAKKyAgICBATnVsbGFibGUKKyAgICBwdWJsaWMgQ29sdW1uTWFzayBnZXRNYXNrKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtYXNrOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykKICAgICB7CkBAIC0yNjksNyArMzA4LDggQEAKICAgICAgICAgICAgICYmIGtpbmQgPT0gb3RoZXIua2luZAogICAgICAgICAgICAgJiYgcG9zaXRpb24gPT0gb3RoZXIucG9zaXRpb24KICAgICAgICAgICAgICYmIGtzTmFtZS5lcXVhbHMob3RoZXIua3NOYW1lKQotICAgICAgICAgICAgJiYgY2ZOYW1lLmVxdWFscyhvdGhlci5jZk5hbWUpOworICAgICAgICAgICAgJiYgY2ZOYW1lLmVxdWFscyhvdGhlci5jZk5hbWUpCisgICAgICAgICAgICAmJiBPYmplY3RzLmVxdWFscyhtYXNrLCBvdGhlci5tYXNrKTsKICAgICB9CiAKICAgICBPcHRpb25hbDxEaWZmZXJlbmNlPiBjb21wYXJlKENvbHVtbk1ldGFkYXRhIG90aGVyKQpAQCAtMjk5LDYgKzMzOSw3IEBACiAgICAgICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArICh0eXBlID09IG51bGwgPyAwIDogdHlwZS5oYXNoQ29kZSgpKTsKICAgICAgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKGtpbmQgPT0gbnVsbCA/IDAgOiBraW5kLmhhc2hDb2RlKCkpOwogICAgICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBwb3NpdGlvbjsKKyAgICAgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKG1hc2sgPT0gbnVsbCA/IDAgOiBtYXNrLmhhc2hDb2RlKCkpOwogICAgICAgICAgICAgaGFzaCA9IHJlc3VsdDsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMzM0LDcgKzM3NSw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc2VzU2VsZWN0aW9uKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGlzTWFza2VkKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00MzMsNiArNDc0LDkgQEAKIAogICAgICAgICBpZiAoaXNTdGF0aWMoKSkKICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgc3RhdGljIik7CisKKyAgICAgICAgaWYgKGlzTWFza2VkKCkpCisgICAgICAgICAgICBtYXNrLmFwcGVuZENxbFRvKGJ1aWxkZXIpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvQ1FMU3RyaW5nKEl0ZXJhYmxlPENvbHVtbk1ldGFkYXRhPiBkZWZzKQpAQCAtNDg4LDcgKzUzMiw3IEBACiAKICAgICBwdWJsaWMgU2VsZWN0b3IuRmFjdG9yeSBuZXdTZWxlY3RvckZhY3RvcnkoVGFibGVNZXRhZGF0YSB0YWJsZSwgQWJzdHJhY3RUeXBlPD8+IGV4cGVjdGVkVHlwZSwgTGlzdDxDb2x1bW5NZXRhZGF0YT4gZGVmcywgVmFyaWFibGVTcGVjaWZpY2F0aW9ucyBib3VuZE5hbWVzKSB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIHJldHVybiBTaW1wbGVTZWxlY3Rvci5uZXdGYWN0b3J5KHRoaXMsIGFkZEFuZEdldEluZGV4KHRoaXMsIGRlZnMpKTsKKyAgICAgICAgcmV0dXJuIFNpbXBsZVNlbGVjdG9yLm5ld0ZhY3RvcnkodGhpcywgYWRkQW5kR2V0SW5kZXgodGhpcywgZGVmcyksIGZhbHNlKTsKICAgICB9CiAKICAgICBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGdldEV4YWN0VHlwZUlmS25vd24oU3RyaW5nIGtleXNwYWNlKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL0NvbXBhY3Rpb25QYXJhbXMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9Db21wYWN0aW9uUGFyYW1zLmphdmEKaW5kZXggNDg1OTQ2OC4uZWZmNjM0ZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL0NvbXBhY3Rpb25QYXJhbXMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvQ29tcGFjdGlvblBhcmFtcy5qYXZhCkBAIC0zOCw2ICszOCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiAKIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuREVGQVVMVF9QUk9WSURFX09WRVJMQVBQSU5HX1RPTUJTVE9ORVM7CiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBDb21wYWN0aW9uUGFyYW1zCiB7CkBAIC03NiwxNSArNzcsMTUgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BWF9USFJFU0hPTEQgPSAzMjsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZBVUxUX0VOQUJMRUQgPSB0cnVlOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVG9tYnN0b25lT3B0aW9uIERFRkFVTFRfUFJPVklERV9PVkVSTEFQUElOR19UT01CU1RPTkVTID0KLSAgICAgICAgICAgIFRvbWJzdG9uZU9wdGlvbi52YWx1ZU9mKFN5c3RlbS5nZXRQcm9wZXJ0eSgiZGVmYXVsdC5wcm92aWRlLm92ZXJsYXBwaW5nLnRvbWJzdG9uZXMiLCBUb21ic3RvbmVPcHRpb24uTk9ORS50b1N0cmluZygpKS50b1VwcGVyQ2FzZSgpKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRvbWJzdG9uZU9wdGlvbiBERUZBVUxUX1BST1ZJREVfT1ZFUkxBUFBJTkdfVE9NQlNUT05FU19QUk9QRVJUWV9WQUxVRSA9CisgICAgICAgIERFRkFVTFRfUFJPVklERV9PVkVSTEFQUElOR19UT01CU1RPTkVTLmdldEVudW0oVG9tYnN0b25lT3B0aW9uLk5PTkUpOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IERFRkFVTFRfVEhSRVNIT0xEUyA9CiAgICAgICAgIEltbXV0YWJsZU1hcC5vZihPcHRpb24uTUlOX1RIUkVTSE9MRC50b1N0cmluZygpLCBJbnRlZ2VyLnRvU3RyaW5nKERFRkFVTFRfTUlOX1RIUkVTSE9MRCksCiAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb24uTUFYX1RIUkVTSE9MRC50b1N0cmluZygpLCBJbnRlZ2VyLnRvU3RyaW5nKERFRkFVTFRfTUFYX1RIUkVTSE9MRCkpOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYWN0aW9uUGFyYW1zIERFRkFVTFQgPQotICAgICAgICBuZXcgQ29tcGFjdGlvblBhcmFtcyhTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzLCBERUZBVUxUX1RIUkVTSE9MRFMsIERFRkFVTFRfRU5BQkxFRCwgREVGQVVMVF9QUk9WSURFX09WRVJMQVBQSU5HX1RPTUJTVE9ORVMpOworICAgICAgICBuZXcgQ29tcGFjdGlvblBhcmFtcyhTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzLCBERUZBVUxUX1RIUkVTSE9MRFMsIERFRkFVTFRfRU5BQkxFRCwgREVGQVVMVF9QUk9WSURFX09WRVJMQVBQSU5HX1RPTUJTVE9ORVNfUFJPUEVSVFlfVkFMVUUpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQWJzdHJhY3RDb21wYWN0aW9uU3RyYXRlZ3k+IGtsYXNzOwogICAgIHByaXZhdGUgZmluYWwgSW1tdXRhYmxlTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zOwpAQCAtMTA1LDcgKzEwNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQm9vbGVhbi5wYXJzZUJvb2xlYW4ob3B0aW9ucy5nZXQoT3B0aW9uLkVOQUJMRUQudG9TdHJpbmcoKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogREVGQVVMVF9FTkFCTEVEOwogICAgICAgICBTdHJpbmcgb3ZlcmxhcHBpbmdUb21ic3RvbmVQYXJtID0gb3B0aW9ucy5nZXRPckRlZmF1bHQoT3B0aW9uLlBST1ZJREVfT1ZFUkxBUFBJTkdfVE9NQlNUT05FUy50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9QUk9WSURFX09WRVJMQVBQSU5HX1RPTUJTVE9ORVMudG9TdHJpbmcoKSkudG9VcHBlckNhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUFJPVklERV9PVkVSTEFQUElOR19UT01CU1RPTkVTX1BST1BFUlRZX1ZBTFVFLnRvU3RyaW5nKCkpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgIE9wdGlvbmFsPFRvbWJzdG9uZU9wdGlvbj4gdG9tYnN0b25lT3B0aW9uYWwgPSBUb21ic3RvbmVPcHRpb24uZm9yTmFtZShvdmVybGFwcGluZ1RvbWJzdG9uZVBhcm0pOwogICAgICAgICBpZiAoIXRvbWJzdG9uZU9wdGlvbmFsLmlzUHJlc2VudCgpKQogICAgICAgICB7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvRGVmYXVsdFNjaGVtYVVwZGF0ZUhhbmRsZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9EZWZhdWx0U2NoZW1hVXBkYXRlSGFuZGxlci5qYXZhCmluZGV4IDBmMGMzZTkuLjBiZWE1NzcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9EZWZhdWx0U2NoZW1hVXBkYXRlSGFuZGxlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9EZWZhdWx0U2NoZW1hVXBkYXRlSGFuZGxlci5qYXZhCkBAIC0xMjksNyArMTI5LDcgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogCiAgICAgICAgIGxvZ2dlci53YXJuKCJUaGVyZSBhcmUgbm9kZXMgaW4gdGhlIGNsdXN0ZXIgd2l0aCBhIGRpZmZlcmVudCBzY2hlbWEgdmVyc2lvbiB0aGFuIHVzLCBmcm9tIHdoaWNoIHdlIGRpZCBub3QgbWVyZ2Ugc2NoZW1hczogIiArCi0gICAgICAgICAgICAgICAgICAgICJvdXIgdmVyc2lvbjogKHt9KSwgb3V0c3RhbmRpbmcgdmVyc2lvbnMgLT4gZW5kcG9pbnRzOiB7fS4gVXNlIC1Ee319PXRydWUgdG8gaWdub3JlIHRoaXMsICIgKworICAgICAgICAgICAgICAgICAgICAib3VyIHZlcnNpb246ICh7fSksIG91dHN0YW5kaW5nIHZlcnNpb25zIC0+IGVuZHBvaW50czoge30uIFVzZSAtRHt9PXRydWUgdG8gaWdub3JlIHRoaXMsICIgKwogICAgICAgICAgICAgICAgICAgICAiLUR7fT08ZXAxWyxlcE5dPiB0byBza2lwIHNwZWNpZmljIGVuZHBvaW50cywgb3IgLUR7fT08dmVyMVssdmVyTl0+IHRvIHNraXAgc3BlY2lmaWMgc2NoZW1hIHZlcnNpb25zIiwKICAgICAgICAgICAgICAgICAgICAgU2NoZW1hLmluc3RhbmNlLmdldFZlcnNpb24oKSwKICAgICAgICAgICAgICAgICAgICAgbWlncmF0aW9uQ29vcmRpbmF0b3Iub3V0c3RhbmRpbmdWZXJzaW9ucygpLApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL0Rpc3RyaWJ1dGVkU2NoZW1hLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvRGlzdHJpYnV0ZWRTY2hlbWEuamF2YQppbmRleCA0ZmVkOWJiLi5kMmYzMGFhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvRGlzdHJpYnV0ZWRTY2hlbWEuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvRGlzdHJpYnV0ZWRTY2hlbWEuamF2YQpAQCAtOTEsNyArOTEsNyBAQAogICAgICAgICAgICAga3NtLnRhYmxlcy5mb3JFYWNoKHRtIC0+IFByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudCh0bS5rZXlzcGFjZS5lcXVhbHMoa3NtLm5hbWUpLCAiVGFibGUgJXMgbWV0YWRhdGEgcG9pbnRzIHRvIGtleXNwYWNlICVzIHdoaWxlIGRlZmluZWQgaW4ga2V5c3BhY2UgJXMiLCB0bS5uYW1lLCB0bS5rZXlzcGFjZSwga3NtLm5hbWUpKTsKICAgICAgICAgICAgIGtzbS52aWV3cy5mb3JFYWNoKHZtIC0+IFByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudCh2bS5rZXlzcGFjZSgpLmVxdWFscyhrc20ubmFtZSksICJWaWV3ICVzIG1ldGFkYXRhIHBvaW50cyB0byBrZXlzcGFjZSAlcyB3aGlsZSBkZWZpbmVkIGluIGtleXNwYWNlICVzIiwgdm0ubmFtZSgpLCB2bS5rZXlzcGFjZSgpLCBrc20ubmFtZSkpOwogICAgICAgICAgICAga3NtLnR5cGVzLmZvckVhY2godXQgLT4gUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50KHV0LmtleXNwYWNlLmVxdWFscyhrc20ubmFtZSksICJUeXBlICVzIHBvaW50cyB0byBrZXlzcGFjZSAlcyB3aGlsZSBkZWZpbmVkIGluIGtleXNwYWNlICVzIiwgdXQubmFtZSwgdXQua2V5c3BhY2UsIGtzbS5uYW1lKSk7Ci0gICAgICAgICAgICBrc20uZnVuY3Rpb25zLmZvckVhY2goZiAtPiBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQoZi5uYW1lKCkua2V5c3BhY2UuZXF1YWxzKGtzbS5uYW1lKSwgIkZ1bmN0aW9uICVzIHBvaW50cyB0byBrZXlzcGFjZSAlcyB3aGlsZSBkZWZpbmVkIGluIGtleXNwYWNlICVzIiwgZi5uYW1lKCkubmFtZSwgZi5uYW1lKCkua2V5c3BhY2UsIGtzbS5uYW1lKSk7CisgICAgICAgICAgICBrc20udXNlckZ1bmN0aW9ucy5mb3JFYWNoKGYgLT4gUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50KGYubmFtZSgpLmtleXNwYWNlLmVxdWFscyhrc20ubmFtZSksICJGdW5jdGlvbiAlcyBwb2ludHMgdG8ga2V5c3BhY2UgJXMgd2hpbGUgZGVmaW5lZCBpbiBrZXlzcGFjZSAlcyIsIGYubmFtZSgpLm5hbWUsIGYubmFtZSgpLmtleXNwYWNlLCBrc20ubmFtZSkpOwogICAgICAgICB9KTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvRnVuY3Rpb25zLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvRnVuY3Rpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZGUzYjguLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL0Z1bmN0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYTsKLQotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKLWltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7Ci1pbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lio7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVXNlclR5cGU7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdDsKLQotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlcy5hbnk7Ci0KLS8qKgotICogQW4gaW1tdXRhYmxlIGNvbnRhaW5lciBmb3IgYSBrZXlzcGFjZSdzIFVEQXMgYW5kIFVERnMgKGFuZCwgaW4gY2FzZSBvZiB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU3lzdGVtS2V5c3BhY2V9LAotICogbmF0aXZlIGZ1bmN0aW9ucyBhbmQgYWdncmVnYXRlcykuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBGdW5jdGlvbnMgaW1wbGVtZW50cyBJdGVyYWJsZTxGdW5jdGlvbj4KLXsKLSAgICBwdWJsaWMgZW51bSBGaWx0ZXIgaW1wbGVtZW50cyBQcmVkaWNhdGU8RnVuY3Rpb24+Ci0gICAgewotICAgICAgICBBTEwsIFVERiwgVURBOwotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHRlc3QoRnVuY3Rpb24gZnVuY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAodGhpcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIFVERjogcmV0dXJuIGZ1bmN0aW9uIGluc3RhbmNlb2YgVURGdW5jdGlvbjsKLSAgICAgICAgICAgICAgICBjYXNlIFVEQTogcmV0dXJuIGZ1bmN0aW9uIGluc3RhbmNlb2YgVURBZ2dyZWdhdGU7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBJbW11dGFibGVNdWx0aW1hcDxGdW5jdGlvbk5hbWUsIEZ1bmN0aW9uPiBmdW5jdGlvbnM7Ci0KLSAgICBwcml2YXRlIEZ1bmN0aW9ucyhCdWlsZGVyIGJ1aWxkZXIpCi0gICAgewotICAgICAgICBmdW5jdGlvbnMgPSBidWlsZGVyLmZ1bmN0aW9ucy5idWlsZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBidWlsZGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRnVuY3Rpb25zIG5vbmUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIoKS5idWlsZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRnVuY3Rpb25zIG9mKEZ1bmN0aW9uLi4uIGZ1bnMpCi0gICAgewotICAgICAgICByZXR1cm4gYnVpbGRlcigpLmFkZChmdW5zKS5idWlsZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxGdW5jdGlvbj4gaXRlcmF0b3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJlYW08RnVuY3Rpb24+IHN0cmVhbSgpCi0gICAgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLnZhbHVlcygpLnN0cmVhbSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgc2l6ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLnNpemUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGEgc3RyZWFtIG9mIGtleXNwYWNlJ3MgVURGcwotICAgICAqLwotICAgIHB1YmxpYyBTdHJlYW08VURGdW5jdGlvbj4gdWRmcygpCi0gICAgewotICAgICAgICByZXR1cm4gc3RyZWFtKCkuZmlsdGVyKEZpbHRlci5VREYpLm1hcChmIC0+IChVREZ1bmN0aW9uKSBmKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGEgc3RyZWFtIG9mIGtleXNwYWNlJ3MgVURBcwotICAgICAqLwotICAgIHB1YmxpYyBTdHJlYW08VURBZ2dyZWdhdGU+IHVkYXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHN0cmVhbSgpLmZpbHRlcihGaWx0ZXIuVURBKS5tYXAoZiAtPiAoVURBZ2dyZWdhdGUpIGYpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYWJsZTxGdW5jdGlvbj4gcmVmZXJlbmNpbmdVc2VyVHlwZShCeXRlQnVmZmVyIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gSXRlcmFibGVzLmZpbHRlcih0aGlzLCBmIC0+IGYucmVmZXJlbmNlc1VzZXJUeXBlKG5hbWUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRnVuY3Rpb25zIHdpdGhVcGRhdGVkVXNlclR5cGUoVXNlclR5cGUgdWR0KQotICAgIHsKLSAgICAgICAgaWYgKCFhbnkodGhpcywgZiAtPiBmLnJlZmVyZW5jZXNVc2VyVHlwZSh1ZHQubmFtZSkpKQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxVREZ1bmN0aW9uPiAgdWRmcyA9IHVkZnMoKS5tYXAoZiAtPiBmLndpdGhVcGRhdGVkVXNlclR5cGUodWR0KSkuY29sbGVjdCh0b0xpc3QoKSk7Ci0gICAgICAgIENvbGxlY3Rpb248VURBZ2dyZWdhdGU+IHVkYXMgPSB1ZGFzKCkubWFwKGYgLT4gZi53aXRoVXBkYXRlZFVzZXJUeXBlKHVkZnMsIHVkdCkpLmNvbGxlY3QodG9MaXN0KCkpOwotCi0gICAgICAgIHJldHVybiBidWlsZGVyKCkuYWRkKHVkZnMpLmFkZCh1ZGFzKS5idWlsZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYSBzdHJlYW0gb2YgYWdncmVnYXRlcyB0aGF0IHVzZSB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gYXMgZWl0aGVyIGEgc3RhdGUgb3IgYSBmaW5hbCBmdW5jdGlvbgotICAgICAqIEBwYXJhbSBmdW5jdGlvbiB0aGUgcmVmZXJyZWUgZnVuY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyZWFtPFVEQWdncmVnYXRlPiBhZ2dyZWdhdGVzVXNpbmdGdW5jdGlvbihGdW5jdGlvbiBmdW5jdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiB1ZGFzKCkuZmlsdGVyKHVkYSAtPiB1ZGEuaGFzUmVmZXJlbmNlVG8oZnVuY3Rpb24pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYWxsIGZ1bmN0aW9uIG92ZXJsb2FkcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgZnVsbHkgcXVhbGlmaWVkIGZ1bmN0aW9uIG5hbWUKLSAgICAgKiBAcmV0dXJuIGFuIGVtcHR5IGxpc3QgaWYgdGhlIGZ1bmN0aW9uIG5hbWUgaXMgbm90IGZvdW5kOyBhIG5vbi1lbXB0eSBjb2xsZWN0aW9uIG9mIHtAbGluayBGdW5jdGlvbn0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIENvbGxlY3Rpb248RnVuY3Rpb24+IGdldChGdW5jdGlvbk5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhbGwgVURGcyBvdmVybG9hZHMgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIGZ1bGx5IHF1YWxpZmllZCBmdW5jdGlvbiBuYW1lCi0gICAgICogQHJldHVybiBhbiBlbXB0eSBsaXN0IGlmIHRoZSBmdW5jdGlvbiBuYW1lIGlzIG5vdCBmb3VuZDsgYSBub24tZW1wdHkgY29sbGVjdGlvbiBvZiB7QGxpbmsgVURGdW5jdGlvbn0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIENvbGxlY3Rpb248VURGdW5jdGlvbj4gZ2V0VWRmcyhGdW5jdGlvbk5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMuZ2V0KG5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoRmlsdGVyLlVERikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZiAtPiAoVURGdW5jdGlvbikgZikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhbGwgVURBcyBvdmVybG9hZHMgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIGZ1bGx5IHF1YWxpZmllZCBmdW5jdGlvbiBuYW1lCi0gICAgICogQHJldHVybiBhbiBlbXB0eSBsaXN0IGlmIHRoZSBmdW5jdGlvbiBuYW1lIGlzIG5vdCBmb3VuZDsgYSBub24tZW1wdHkgY29sbGVjdGlvbiBvZiB7QGxpbmsgVURBZ2dyZWdhdGV9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uPFVEQWdncmVnYXRlPiBnZXRVZGFzKEZ1bmN0aW9uTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy5nZXQobmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQotICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihGaWx0ZXIuVURBKQotICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmIC0+IChVREFnZ3JlZ2F0ZSkgZikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPcHRpb25hbDxGdW5jdGlvbj4gZmluZChGdW5jdGlvbk5hbWUgbmFtZSwgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpbmQobmFtZSwgYXJnVHlwZXMsIEZpbHRlci5BTEwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBmdWxseSBxdWFsaWZpZWQgZnVuY3Rpb24gbmFtZQotICAgICAqIEBwYXJhbSBhcmdUeXBlcyBmdW5jdGlvbiBhcmd1bWVudCB0eXBlcwotICAgICAqIEByZXR1cm4gYW4gZW1wdHkge0BsaW5rIE9wdGlvbmFsfSBpZiB0aGUgZnVuY3Rpb24gbmFtZSBpcyBub3QgZm91bmQ7IGEgbm9uLWVtcHR5IG9wdGlvbmFsIG9mIHtAbGluayBGdW5jdGlvbn0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIE9wdGlvbmFsPEZ1bmN0aW9uPiBmaW5kKEZ1bmN0aW9uTmFtZSBuYW1lLCBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMsIEZpbHRlciBmaWx0ZXIpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0KG5hbWUpLnN0cmVhbSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGZpbHRlci5hbmQoZnVuIC0+IHR5cGVzTWF0Y2goZnVuLmFyZ1R5cGVzKCksIGFyZ1R5cGVzKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZmluZEFueSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBXZSBuZWVkIHRvIGNvbXBhcmUgdGhlIENRTDMgcmVwcmVzZW50YXRpb24gb2YgdGhlIHR5cGUgYmVjYXVzZSBjb21wYXJpbmcKLSAgICAgKiB0aGUgQWJzdHJhY3RUeXBlIHdpbGwgZmFpbCBmb3IgZXhhbXBsZSBpZiBhIFVEVCBoYXMgYmVlbiBjaGFuZ2VkLgotICAgICAqIFJlYXNvbiBpcyB0aGF0IFVzZXJUeXBlLmVxdWFscygpIHRha2VzIHRoZSBmaWVsZCBuYW1lcyBhbmQgdHlwZXMgaW50byBhY2NvdW50LgotICAgICAqIEV4YW1wbGUgQ1FMIHNlcXVlbmNlIHRoYXQgd291bGQgZmFpbCB3aGVuIGNvbXBhcmluZyBBYnN0cmFjdFR5cGU6Ci0gICAgICogICAgQ1JFQVRFIFRZUEUgZm9vIC4uLgotICAgICAqICAgIENSRUFURSBGVU5DVElPTiBiYXIgKCBwYXIgZm9vICkgUkVUVVJOUyBmb28gLi4uCi0gICAgICogICAgQUxURVIgVFlQRSBmb28gQUREIC4uLgotICAgICAqIG9yCi0gICAgICogICAgQUxURVIgVFlQRSBmb28gQUxURVIgLi4uCi0gICAgICogb3IKLSAgICAgKiAgICBBTFRFUiBUWVBFIGZvbyBSRU5BTUUgLi4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB0eXBlc01hdGNoKEFic3RyYWN0VHlwZTw/PiB0MSwgQWJzdHJhY3RUeXBlPD8+IHQyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHQxLmZyZWV6ZSgpLmFzQ1FMM1R5cGUoKS50b1N0cmluZygpLmVxdWFscyh0Mi5mcmVlemUoKS5hc0NRTDNUeXBlKCkudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHR5cGVzTWF0Y2goTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IHQxLCBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gdDIpCi0gICAgewotICAgICAgICBpZiAodDEuc2l6ZSgpICE9IHQyLnNpemUoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHQxLnNpemUoKTsgaSsrKQotICAgICAgICAgICAgaWYgKCF0eXBlc01hdGNoKHQxLmdldChpKSwgdDIuZ2V0KGkpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgdHlwZUhhc2hDb2RlKEFic3RyYWN0VHlwZTw/PiB0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIHQuYXNDUUwzVHlwZSgpLnRvU3RyaW5nKCkuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCB0eXBlSGFzaENvZGUoTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IHR5cGVzKQotICAgIHsKLSAgICAgICAgaW50IGggPSAwOwotICAgICAgICBmb3IgKEFic3RyYWN0VHlwZTw/PiB0eXBlIDogdHlwZXMpCi0gICAgICAgICAgICBoID0gaCAqIDMxICsgdHlwZUhhc2hDb2RlKHR5cGUpOwotICAgICAgICByZXR1cm4gaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRnVuY3Rpb25zIGZpbHRlcihQcmVkaWNhdGU8RnVuY3Rpb24+IHByZWRpY2F0ZSkKLSAgICB7Ci0gICAgICAgIEJ1aWxkZXIgYnVpbGRlciA9IGJ1aWxkZXIoKTsKLSAgICAgICAgc3RyZWFtKCkuZmlsdGVyKHByZWRpY2F0ZSkuZm9yRWFjaChidWlsZGVyOjphZGQpOwotICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEZ1bmN0aW9ucyBpbnN0YW5jZSB3aXRoIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBhZGRlZAotICAgICAqLwotICAgIHB1YmxpYyBGdW5jdGlvbnMgd2l0aChGdW5jdGlvbiBmdW4pCi0gICAgewotICAgICAgICBpZiAoZmluZChmdW4ubmFtZSgpLCBmdW4uYXJnVHlwZXMoKSkuaXNQcmVzZW50KCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkZ1bmN0aW9uICVzIGFscmVhZHkgZXhpc3RzIiwgZnVuLm5hbWUoKSkpOwotCi0gICAgICAgIHJldHVybiBidWlsZGVyKCkuYWRkKHRoaXMpLmFkZChmdW4pLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIEZ1bmN0aW9ucyBpbnN0YW5jZSB3aXRoIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBwcm92aWRlZCBuYW1lIGFuZCBhcmd1bWVudCB0eXBlcyByZW1vdmVkCi0gICAgICovCi0gICAgcHVibGljIEZ1bmN0aW9ucyB3aXRob3V0KEZ1bmN0aW9uTmFtZSBuYW1lLCBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMpCi0gICAgewotICAgICAgICBGdW5jdGlvbiBmdW4gPQotICAgICAgICAgICAgZmluZChuYW1lLCBhcmdUeXBlcykub3JFbHNlVGhyb3coKCkgLT4gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJGdW5jdGlvbiAlcyBkb2Vzbid0IGV4aXN0cyIsIG5hbWUpKSk7Ci0KLSAgICAgICAgcmV0dXJuIHdpdGhvdXQoZnVuKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRnVuY3Rpb25zIHdpdGhvdXQoRnVuY3Rpb24gZnVuY3Rpb24pCi0gICAgewotICAgICAgICByZXR1cm4gYnVpbGRlcigpLmFkZChJdGVyYWJsZXMuZmlsdGVyKHRoaXMsIGYgLT4gZiAhPSBmdW5jdGlvbikpLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEZ1bmN0aW9ucyB3aXRoQWRkZWRPclVwZGF0ZWQoRnVuY3Rpb24gZnVuY3Rpb24pCi0gICAgewotICAgICAgICByZXR1cm4gYnVpbGRlcigpLmFkZChJdGVyYWJsZXMuZmlsdGVyKHRoaXMsIGYgLT4gIShmLm5hbWUoKS5lcXVhbHMoZnVuY3Rpb24ubmFtZSgpKSAmJiBGdW5jdGlvbnMudHlwZXNNYXRjaChmLmFyZ1R5cGVzKCksIGZ1bmN0aW9uLmFyZ1R5cGVzKCkpKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGZ1bmN0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMgPT0gbyB8fCAobyBpbnN0YW5jZW9mIEZ1bmN0aW9ucyAmJiBmdW5jdGlvbnMuZXF1YWxzKCgoRnVuY3Rpb25zKSBvKS5mdW5jdGlvbnMpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMudmFsdWVzKCkudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIKLSAgICB7Ci0gICAgICAgIGZpbmFsIEltbXV0YWJsZU11bHRpbWFwLkJ1aWxkZXI8RnVuY3Rpb25OYW1lLCBGdW5jdGlvbj4gZnVuY3Rpb25zID0gbmV3IEltbXV0YWJsZU11bHRpbWFwLkJ1aWxkZXI8PigpOwotCi0gICAgICAgIHByaXZhdGUgQnVpbGRlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHdlIG5lZWQgZGV0ZXJtaW5pc3RpYyBpdGVyYXRpb24gb3JkZXI7IG90aGVyd2lzZSBGdW5jdGlvbnMuZXF1YWxzKCkgYnJlYWtzIGRvd24KLSAgICAgICAgICAgIGZ1bmN0aW9ucy5vcmRlclZhbHVlc0J5KENvbXBhcmF0b3IuY29tcGFyaW5nSW50KE9iamVjdDo6aGFzaENvZGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBGdW5jdGlvbnMgYnVpbGQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9ucyh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZChGdW5jdGlvbiBmdW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZ1bmN0aW9ucy5wdXQoZnVuLm5hbWUoKSwgZnVuKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkKEZ1bmN0aW9uLi4uIGZ1bnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoRnVuY3Rpb24gZnVuIDogZnVucykKLSAgICAgICAgICAgICAgICBhZGQoZnVuKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkKEl0ZXJhYmxlPD8gZXh0ZW5kcyBGdW5jdGlvbj4gZnVucykKLSAgICAgICAgewotICAgICAgICAgICAgZnVucy5mb3JFYWNoKHRoaXM6OmFkZCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHN0YXRpYyBGdW5jdGlvbnNEaWZmPFVERnVuY3Rpb24+IHVkZnNEaWZmKEZ1bmN0aW9ucyBiZWZvcmUsIEZ1bmN0aW9ucyBhZnRlcikKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRnVuY3Rpb25zRGlmZjxVREZ1bmN0aW9uPikgRnVuY3Rpb25zRGlmZi5kaWZmKGJlZm9yZSwgYWZ0ZXIsIEZpbHRlci5VREYpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHN0YXRpYyBGdW5jdGlvbnNEaWZmPFVEQWdncmVnYXRlPiB1ZGFzRGlmZihGdW5jdGlvbnMgYmVmb3JlLCBGdW5jdGlvbnMgYWZ0ZXIpCi0gICAgewotICAgICAgICByZXR1cm4gKEZ1bmN0aW9uc0RpZmY8VURBZ2dyZWdhdGU+KSBGdW5jdGlvbnNEaWZmLmRpZmYoYmVmb3JlLCBhZnRlciwgRmlsdGVyLlVEQSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGdW5jdGlvbnNEaWZmPFQgZXh0ZW5kcyBGdW5jdGlvbj4gZXh0ZW5kcyBEaWZmPEZ1bmN0aW9ucywgVD4KLSAgICB7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBGdW5jdGlvbnNEaWZmIE5PTkUgPSBuZXcgRnVuY3Rpb25zRGlmZjw+KEZ1bmN0aW9ucy5ub25lKCksIEZ1bmN0aW9ucy5ub25lKCksIEltbXV0YWJsZUxpc3Qub2YoKSk7Ci0KLSAgICAgICAgcHJpdmF0ZSBGdW5jdGlvbnNEaWZmKEZ1bmN0aW9ucyBjcmVhdGVkLCBGdW5jdGlvbnMgZHJvcHBlZCwgSW1tdXRhYmxlQ29sbGVjdGlvbjxBbHRlcmVkPFQ+PiBhbHRlcmVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihjcmVhdGVkLCBkcm9wcGVkLCBhbHRlcmVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIEZ1bmN0aW9uc0RpZmYgZGlmZihGdW5jdGlvbnMgYmVmb3JlLCBGdW5jdGlvbnMgYWZ0ZXIsIEZpbHRlciBmaWx0ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChiZWZvcmUgPT0gYWZ0ZXIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5PTkU7Ci0KLSAgICAgICAgICAgIEZ1bmN0aW9ucyBjcmVhdGVkID0gYWZ0ZXIuZmlsdGVyKGZpbHRlci5hbmQoayAtPiAhYmVmb3JlLmZpbmQoay5uYW1lKCksIGsuYXJnVHlwZXMoKSwgZmlsdGVyKS5pc1ByZXNlbnQoKSkpOwotICAgICAgICAgICAgRnVuY3Rpb25zIGRyb3BwZWQgPSBiZWZvcmUuZmlsdGVyKGZpbHRlci5hbmQoayAtPiAhYWZ0ZXIuZmluZChrLm5hbWUoKSwgay5hcmdUeXBlcygpLCBmaWx0ZXIpLmlzUHJlc2VudCgpKSk7Ci0KLSAgICAgICAgICAgIEltbXV0YWJsZUxpc3QuQnVpbGRlcjxBbHRlcmVkPEZ1bmN0aW9uPj4gYWx0ZXJlZCA9IEltbXV0YWJsZUxpc3QuYnVpbGRlcigpOwotICAgICAgICAgICAgYmVmb3JlLnN0cmVhbSgpLmZpbHRlcihmaWx0ZXIpLmZvckVhY2goZnVuY3Rpb25CZWZvcmUgLT4KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZnRlci5maW5kKGZ1bmN0aW9uQmVmb3JlLm5hbWUoKSwgZnVuY3Rpb25CZWZvcmUuYXJnVHlwZXMoKSwgZmlsdGVyKS5pZlByZXNlbnQoZnVuY3Rpb25BZnRlciAtPgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25CZWZvcmUuY29tcGFyZShmdW5jdGlvbkFmdGVyKS5pZlByZXNlbnQoa2luZCAtPiBhbHRlcmVkLmFkZChuZXcgQWx0ZXJlZDw+KGZ1bmN0aW9uQmVmb3JlLCBmdW5jdGlvbkFmdGVyLCBraW5kKSkpOwotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25zRGlmZjw+KGNyZWF0ZWQsIGRyb3BwZWQsIGFsdGVyZWQuYnVpbGQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvS2V5c3BhY2VNZXRhZGF0YS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL0tleXNwYWNlTWV0YWRhdGEuamF2YQppbmRleCA2ZDg1MzkxLi5mYjJlZmM4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvS2V5c3BhY2VNZXRhZGF0YS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9LZXlzcGFjZU1ldGFkYXRhLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CiAKQEAgLTMwLDEyICszMSwxMyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DcWxCdWlsZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuU2NoZW1hRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5VREFnZ3JlZ2F0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5VREZ1bmN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVXNlclR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuQWJzdHJhY3RSZXBsaWNhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5GdW5jdGlvbnMuRnVuY3Rpb25zRGlmZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVXNlckZ1bmN0aW9ucy5GdW5jdGlvbnNEaWZmOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZXMuVGFibGVzRGlmZjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVHlwZXMuVHlwZXNEaWZmOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5WaWV3cy5WaWV3c0RpZmY7CkBAIC02MSw5ICs2Myw5IEBACiAgICAgcHVibGljIGZpbmFsIFRhYmxlcyB0YWJsZXM7CiAgICAgcHVibGljIGZpbmFsIFZpZXdzIHZpZXdzOwogICAgIHB1YmxpYyBmaW5hbCBUeXBlcyB0eXBlczsKLSAgICBwdWJsaWMgZmluYWwgRnVuY3Rpb25zIGZ1bmN0aW9uczsKKyAgICBwdWJsaWMgZmluYWwgVXNlckZ1bmN0aW9ucyB1c2VyRnVuY3Rpb25zOwogCi0gICAgcHJpdmF0ZSBLZXlzcGFjZU1ldGFkYXRhKFN0cmluZyBuYW1lLCBLaW5kIGtpbmQsIEtleXNwYWNlUGFyYW1zIHBhcmFtcywgVGFibGVzIHRhYmxlcywgVmlld3Mgdmlld3MsIFR5cGVzIHR5cGVzLCBGdW5jdGlvbnMgZnVuY3Rpb25zKQorICAgIHByaXZhdGUgS2V5c3BhY2VNZXRhZGF0YShTdHJpbmcgbmFtZSwgS2luZCBraW5kLCBLZXlzcGFjZVBhcmFtcyBwYXJhbXMsIFRhYmxlcyB0YWJsZXMsIFZpZXdzIHZpZXdzLCBUeXBlcyB0eXBlcywgVXNlckZ1bmN0aW9ucyBmdW5jdGlvbnMpCiAgICAgewogICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgICAgICB0aGlzLmtpbmQgPSBraW5kOwpAQCAtNzEsNTcgKzczLDU3IEBACiAgICAgICAgIHRoaXMudGFibGVzID0gdGFibGVzOwogICAgICAgICB0aGlzLnZpZXdzID0gdmlld3M7CiAgICAgICAgIHRoaXMudHlwZXMgPSB0eXBlczsKLSAgICAgICAgdGhpcy5mdW5jdGlvbnMgPSBmdW5jdGlvbnM7CisgICAgICAgIHRoaXMudXNlckZ1bmN0aW9ucyA9IGZ1bmN0aW9uczsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIEtleXNwYWNlTWV0YWRhdGEgY3JlYXRlKFN0cmluZyBuYW1lLCBLZXlzcGFjZVBhcmFtcyBwYXJhbXMpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IEtleXNwYWNlTWV0YWRhdGEobmFtZSwgS2luZC5SRUdVTEFSLCBwYXJhbXMsIFRhYmxlcy5ub25lKCksIFZpZXdzLm5vbmUoKSwgVHlwZXMubm9uZSgpLCBGdW5jdGlvbnMubm9uZSgpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBLZXlzcGFjZU1ldGFkYXRhKG5hbWUsIEtpbmQuUkVHVUxBUiwgcGFyYW1zLCBUYWJsZXMubm9uZSgpLCBWaWV3cy5ub25lKCksIFR5cGVzLm5vbmUoKSwgVXNlckZ1bmN0aW9ucy5ub25lKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgS2V5c3BhY2VNZXRhZGF0YSBjcmVhdGUoU3RyaW5nIG5hbWUsIEtleXNwYWNlUGFyYW1zIHBhcmFtcywgVGFibGVzIHRhYmxlcykKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgS2V5c3BhY2VNZXRhZGF0YShuYW1lLCBLaW5kLlJFR1VMQVIsIHBhcmFtcywgdGFibGVzLCBWaWV3cy5ub25lKCksIFR5cGVzLm5vbmUoKSwgRnVuY3Rpb25zLm5vbmUoKSk7CisgICAgICAgIHJldHVybiBuZXcgS2V5c3BhY2VNZXRhZGF0YShuYW1lLCBLaW5kLlJFR1VMQVIsIHBhcmFtcywgdGFibGVzLCBWaWV3cy5ub25lKCksIFR5cGVzLm5vbmUoKSwgVXNlckZ1bmN0aW9ucy5ub25lKCkpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgS2V5c3BhY2VNZXRhZGF0YSBjcmVhdGUoU3RyaW5nIG5hbWUsIEtleXNwYWNlUGFyYW1zIHBhcmFtcywgVGFibGVzIHRhYmxlcywgVmlld3Mgdmlld3MsIFR5cGVzIHR5cGVzLCBGdW5jdGlvbnMgZnVuY3Rpb25zKQorICAgIHB1YmxpYyBzdGF0aWMgS2V5c3BhY2VNZXRhZGF0YSBjcmVhdGUoU3RyaW5nIG5hbWUsIEtleXNwYWNlUGFyYW1zIHBhcmFtcywgVGFibGVzIHRhYmxlcywgVmlld3Mgdmlld3MsIFR5cGVzIHR5cGVzLCBVc2VyRnVuY3Rpb25zIGZ1bmN0aW9ucykKICAgICB7CiAgICAgICAgIHJldHVybiBuZXcgS2V5c3BhY2VNZXRhZGF0YShuYW1lLCBLaW5kLlJFR1VMQVIsIHBhcmFtcywgdGFibGVzLCB2aWV3cywgdHlwZXMsIGZ1bmN0aW9ucyk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBLZXlzcGFjZU1ldGFkYXRhIHZpcnR1YWwoU3RyaW5nIG5hbWUsIFRhYmxlcyB0YWJsZXMpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IEtleXNwYWNlTWV0YWRhdGEobmFtZSwgS2luZC5WSVJUVUFMLCBLZXlzcGFjZVBhcmFtcy5sb2NhbCgpLCB0YWJsZXMsIFZpZXdzLm5vbmUoKSwgVHlwZXMubm9uZSgpLCBGdW5jdGlvbnMubm9uZSgpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBLZXlzcGFjZU1ldGFkYXRhKG5hbWUsIEtpbmQuVklSVFVBTCwgS2V5c3BhY2VQYXJhbXMubG9jYWwoKSwgdGFibGVzLCBWaWV3cy5ub25lKCksIFR5cGVzLm5vbmUoKSwgVXNlckZ1bmN0aW9ucy5ub25lKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyBLZXlzcGFjZU1ldGFkYXRhIHdpdGhTd2FwcGVkKEtleXNwYWNlUGFyYW1zIHBhcmFtcykKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgS2V5c3BhY2VNZXRhZGF0YShuYW1lLCBraW5kLCBwYXJhbXMsIHRhYmxlcywgdmlld3MsIHR5cGVzLCBmdW5jdGlvbnMpOworICAgICAgICByZXR1cm4gbmV3IEtleXNwYWNlTWV0YWRhdGEobmFtZSwga2luZCwgcGFyYW1zLCB0YWJsZXMsIHZpZXdzLCB0eXBlcywgdXNlckZ1bmN0aW9ucyk7CiAgICAgfQogCiAgICAgcHVibGljIEtleXNwYWNlTWV0YWRhdGEgd2l0aFN3YXBwZWQoVGFibGVzIHJlZ3VsYXIpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IEtleXNwYWNlTWV0YWRhdGEobmFtZSwga2luZCwgcGFyYW1zLCByZWd1bGFyLCB2aWV3cywgdHlwZXMsIGZ1bmN0aW9ucyk7CisgICAgICAgIHJldHVybiBuZXcgS2V5c3BhY2VNZXRhZGF0YShuYW1lLCBraW5kLCBwYXJhbXMsIHJlZ3VsYXIsIHZpZXdzLCB0eXBlcywgdXNlckZ1bmN0aW9ucyk7CiAgICAgfQogCiAgICAgcHVibGljIEtleXNwYWNlTWV0YWRhdGEgd2l0aFN3YXBwZWQoVmlld3Mgdmlld3MpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IEtleXNwYWNlTWV0YWRhdGEobmFtZSwga2luZCwgcGFyYW1zLCB0YWJsZXMsIHZpZXdzLCB0eXBlcywgZnVuY3Rpb25zKTsKKyAgICAgICAgcmV0dXJuIG5ldyBLZXlzcGFjZU1ldGFkYXRhKG5hbWUsIGtpbmQsIHBhcmFtcywgdGFibGVzLCB2aWV3cywgdHlwZXMsIHVzZXJGdW5jdGlvbnMpOwogICAgIH0KIAogICAgIHB1YmxpYyBLZXlzcGFjZU1ldGFkYXRhIHdpdGhTd2FwcGVkKFR5cGVzIHR5cGVzKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBLZXlzcGFjZU1ldGFkYXRhKG5hbWUsIGtpbmQsIHBhcmFtcywgdGFibGVzLCB2aWV3cywgdHlwZXMsIGZ1bmN0aW9ucyk7CisgICAgICAgIHJldHVybiBuZXcgS2V5c3BhY2VNZXRhZGF0YShuYW1lLCBraW5kLCBwYXJhbXMsIHRhYmxlcywgdmlld3MsIHR5cGVzLCB1c2VyRnVuY3Rpb25zKTsKICAgICB9CiAKLSAgICBwdWJsaWMgS2V5c3BhY2VNZXRhZGF0YSB3aXRoU3dhcHBlZChGdW5jdGlvbnMgZnVuY3Rpb25zKQorICAgIHB1YmxpYyBLZXlzcGFjZU1ldGFkYXRhIHdpdGhTd2FwcGVkKFVzZXJGdW5jdGlvbnMgZnVuY3Rpb25zKQogICAgIHsKICAgICAgICAgcmV0dXJuIG5ldyBLZXlzcGFjZU1ldGFkYXRhKG5hbWUsIGtpbmQsIHBhcmFtcywgdGFibGVzLCB2aWV3cywgdHlwZXMsIGZ1bmN0aW9ucyk7CiAgICAgfQogCiAgICAgcHVibGljIEtleXNwYWNlTWV0YWRhdGEgZW1wdHkoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBLZXlzcGFjZU1ldGFkYXRhKHRoaXMubmFtZSwgdGhpcy5raW5kLCB0aGlzLnBhcmFtcywgVGFibGVzLm5vbmUoKSwgVmlld3Mubm9uZSgpLCBUeXBlcy5ub25lKCksIEZ1bmN0aW9ucy5ub25lKCkpOworICAgICAgICByZXR1cm4gbmV3IEtleXNwYWNlTWV0YWRhdGEodGhpcy5uYW1lLCB0aGlzLmtpbmQsIHRoaXMucGFyYW1zLCBUYWJsZXMubm9uZSgpLCBWaWV3cy5ub25lKCksIFR5cGVzLm5vbmUoKSwgVXNlckZ1bmN0aW9ucy5ub25lKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpCkBAIC0xNDEsNyArMTQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlcy53aXRoVXBkYXRlZFVzZXJUeXBlKHVkdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cy53aXRoVXBkYXRlZFVzZXJUeXBlcyh1ZHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXMud2l0aFVwZGF0ZWRVc2VyVHlwZSh1ZHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zLndpdGhVcGRhdGVkVXNlclR5cGUodWR0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRnVuY3Rpb25zLndpdGhVcGRhdGVkVXNlclR5cGUodWR0KSk7CiAgICAgfQogCiAgICAgcHVibGljIEl0ZXJhYmxlPFRhYmxlTWV0YWRhdGE+IHRhYmxlc0FuZFZpZXdzKCkKQEAgLTE3Myw2ICsxNzUsMTUgQEAKICAgICAgICAgcmV0dXJuIGFueSh0YWJsZXMsIHQgLT4gdC5pbmRleGVzLmhhcyhpbmRleE5hbWUpKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZnVuY3Rpb24gYSB1c2VyIGZ1bmN0aW9uCisgICAgICogQHJldHVybiBhIHN0cmVhbSBvZiB0YWJsZXMgd2l0aGluIHRoaXMga2V5c3BhY2UgdGhhdCBoYXZlIGNvbHVtbiBtYXNrcyB1c2luZyB0aGUgc3BlY2lmaWVkIHVzZXIgZnVuY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyZWFtPFRhYmxlTWV0YWRhdGE+IHRhYmxlc1VzaW5nRnVuY3Rpb24oRnVuY3Rpb24gZnVuY3Rpb24pCisgICAgeworICAgICAgICByZXR1cm4gdGFibGVzLnN0cmVhbSgpLmZpbHRlcih0YWJsZSAtPiB0YWJsZS5kZXBlbmRzT24oZnVuY3Rpb24pKTsKKyAgICB9CisKICAgICBwdWJsaWMgU3RyaW5nIGZpbmRBdmFpbGFibGVJbmRleE5hbWUoU3RyaW5nIGJhc2VOYW1lKQogICAgIHsKICAgICAgICAgaWYgKCFoYXNJbmRleChiYXNlTmFtZSkpCkBAIC0yMDAsNyArMjExLDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBPYmplY3RzLmhhc2hDb2RlKG5hbWUsIGtpbmQsIHBhcmFtcywgdGFibGVzLCB2aWV3cywgZnVuY3Rpb25zLCB0eXBlcyk7CisgICAgICAgIHJldHVybiBPYmplY3RzLmhhc2hDb2RlKG5hbWUsIGtpbmQsIHBhcmFtcywgdGFibGVzLCB2aWV3cywgdXNlckZ1bmN0aW9ucywgdHlwZXMpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjE1LDEyICsyMjYsMTIgQEAKICAgICAgICAgS2V5c3BhY2VNZXRhZGF0YSBvdGhlciA9IChLZXlzcGFjZU1ldGFkYXRhKSBvOwogCiAgICAgICAgIHJldHVybiBuYW1lLmVxdWFscyhvdGhlci5uYW1lKQotICAgICAgICAgICAgJiYga2luZCA9PSBvdGhlci5raW5kCi0gICAgICAgICAgICAmJiBwYXJhbXMuZXF1YWxzKG90aGVyLnBhcmFtcykKLSAgICAgICAgICAgICYmIHRhYmxlcy5lcXVhbHMob3RoZXIudGFibGVzKQotICAgICAgICAgICAgJiYgdmlld3MuZXF1YWxzKG90aGVyLnZpZXdzKQotICAgICAgICAgICAgJiYgZnVuY3Rpb25zLmVxdWFscyhvdGhlci5mdW5jdGlvbnMpCi0gICAgICAgICAgICAmJiB0eXBlcy5lcXVhbHMob3RoZXIudHlwZXMpOworICAgICAgICAgICAgICAgJiYga2luZCA9PSBvdGhlci5raW5kCisgICAgICAgICAgICAgICAmJiBwYXJhbXMuZXF1YWxzKG90aGVyLnBhcmFtcykKKyAgICAgICAgICAgICAgICYmIHRhYmxlcy5lcXVhbHMob3RoZXIudGFibGVzKQorICAgICAgICAgICAgICAgJiYgdmlld3MuZXF1YWxzKG90aGVyLnZpZXdzKQorICAgICAgICAgICAgICAgJiYgdXNlckZ1bmN0aW9ucy5lcXVhbHMob3RoZXIudXNlckZ1bmN0aW9ucykKKyAgICAgICAgICAgICAgICYmIHR5cGVzLmVxdWFscyhvdGhlci50eXBlcyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0yMzIsNyArMjQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCgicGFyYW1zIiwgcGFyYW1zKQogICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKCJ0YWJsZXMiLCB0YWJsZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoInZpZXdzIiwgdmlld3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoImZ1bmN0aW9ucyIsIGZ1bmN0aW9ucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCgiZnVuY3Rpb25zIiwgdXNlckZ1bmN0aW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCgidHlwZXMiLCB0eXBlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCk7CiAgICAgfQpAQCAtMzg1LDEwICszOTYsMTAgQEAKIAogICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIEZ1bmN0aW9uc0RpZmY8VURGdW5jdGlvbj4gIHVkZnMgPSBGdW5jdGlvbnNEaWZmLk5PTkU7CiAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgRnVuY3Rpb25zRGlmZjxVREFnZ3JlZ2F0ZT4gdWRhcyA9IEZ1bmN0aW9uc0RpZmYuTk9ORTsKLSAgICAgICAgICAgIGlmIChiZWZvcmUuZnVuY3Rpb25zICE9IGFmdGVyLmZ1bmN0aW9ucykKKyAgICAgICAgICAgIGlmIChiZWZvcmUudXNlckZ1bmN0aW9ucyAhPSBhZnRlci51c2VyRnVuY3Rpb25zKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVkZnMgPSBGdW5jdGlvbnMudWRmc0RpZmYoYmVmb3JlLmZ1bmN0aW9ucywgYWZ0ZXIuZnVuY3Rpb25zKTsKLSAgICAgICAgICAgICAgICB1ZGFzID0gRnVuY3Rpb25zLnVkYXNEaWZmKGJlZm9yZS5mdW5jdGlvbnMsIGFmdGVyLmZ1bmN0aW9ucyk7CisgICAgICAgICAgICAgICAgdWRmcyA9IFVzZXJGdW5jdGlvbnMudWRmc0RpZmYoYmVmb3JlLnVzZXJGdW5jdGlvbnMsIGFmdGVyLnVzZXJGdW5jdGlvbnMpOworICAgICAgICAgICAgICAgIHVkYXMgPSBVc2VyRnVuY3Rpb25zLnVkYXNEaWZmKGJlZm9yZS51c2VyRnVuY3Rpb25zLCBhZnRlci51c2VyRnVuY3Rpb25zKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGJlZm9yZS5wYXJhbXMuZXF1YWxzKGFmdGVyLnBhcmFtcykgJiYgdGFibGVzLmlzRW1wdHkoKSAmJiB2aWV3cy5pc0VtcHR5KCkgJiYgdHlwZXMuaXNFbXB0eSgpICYmIHVkZnMuaXNFbXB0eSgpICYmIHVkYXMuaXNFbXB0eSgpKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL01pZ3JhdGlvbkNvb3JkaW5hdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvTWlncmF0aW9uQ29vcmRpbmF0b3IuamF2YQppbmRleCA2MWVmNGM4Li41NjI0ODk5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvTWlncmF0aW9uQ29vcmRpbmF0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvTWlncmF0aW9uQ29vcmRpbmF0b3IuamF2YQpAQCAtNDYsNyArNDYsNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTm9TcGFtTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKQEAgLTY4LDYgKzY3LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuVmVyYjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk5vU3BhbUxvZ2dlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlNpbXVsYXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuRnV0dXJlOwpAQCAtMjU0LDEwICsyNTQsMTEgQEAKIAogICAgIHZvaWQgc3RhcnQoKQogICAgIHsKLSAgICAgICAgbG9nZ2VyLmluZm8oIlN0YXJ0aW5nIG1pZ3JhdGlvbiBjb29yZGluYXRvciBhbmQgc2NoZWR1bGluZyBwdWxsaW5nIHNjaGVtYSB2ZXJzaW9ucyBldmVyeSB7fSIsIER1cmF0aW9uLm9mTWlsbGlzKFNDSEVNQV9QVUxMX0lOVEVSVkFMX01TLmdldExvbmcoKSkpOworICAgICAgICBsb25nIGludGVydmFsID0gU0NIRU1BX1BVTExfSU5URVJWQUxfTVMuZ2V0TG9uZygpOworICAgICAgICBsb2dnZXIuaW5mbygiU3RhcnRpbmcgbWlncmF0aW9uIGNvb3JkaW5hdG9yIGFuZCBzY2hlZHVsaW5nIHB1bGxpbmcgc2NoZW1hIHZlcnNpb25zIGV2ZXJ5IHt9IiwgRHVyYXRpb24ub2ZNaWxsaXMoaW50ZXJ2YWwpKTsKICAgICAgICAgYW5ub3VuY2Uoc2NoZW1hVmVyc2lvbi5nZXQoKSk7CiAgICAgICAgIHBlcmlvZGljUHVsbFRhc2sudXBkYXRlQW5kR2V0KGN1clRhc2sgLT4gY3VyVGFzayA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBwZXJpb2RpY0NoZWNrRXhlY3V0b3Iuc2NoZWR1bGVXaXRoRml4ZWREZWxheSh0aGlzOjpwdWxsVW5yZWNlaXZlZFNjaGVtYVZlcnNpb25zLCBTQ0hFTUFfUFVMTF9JTlRFUlZBTF9NUy5nZXRMb25nKCksIFNDSEVNQV9QVUxMX0lOVEVSVkFMX01TLmdldExvbmcoKSwgVGltZVVuaXQuTUlMTElTRUNPTkRTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcGVyaW9kaWNDaGVja0V4ZWN1dG9yLnNjaGVkdWxlV2l0aEZpeGVkRGVsYXkodGhpczo6cHVsbFVucmVjZWl2ZWRTY2hlbWFWZXJzaW9ucywgaW50ZXJ2YWwsIGludGVydmFsLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjdXJUYXNrKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9TY2hlbWEuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9TY2hlbWEuamF2YQppbmRleCAwZGJhMTY3Li4zY2YxODE0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvU2NoZW1hLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYS5qYXZhCkBAIC0xOCw3ICsxOCwxNCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWE7CiAKIGltcG9ydCBqYXZhLnRpbWUuRHVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKQEAgLTI4LDEwICszNSwxNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwRGlmZmVyZW5jZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuT2JqZWN0VXRpbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5Vc2VyRnVuY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2VOb3REZWZpbmVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlN5c3RlbUtleXNwYWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWwuVmlydHVhbEtleXNwYWNlUmVnaXN0cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwpAQCAtNDksOSArNjMsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuQXdhaXRhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuTG9hZGluZ01hcDsKIAotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXMuc2l6ZTsKIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3IuaXNEYWVtb25Jbml0aWFsaXplZDsKQEAgLTIxMyw2ICsyMjQsMTIgQEAKICAgICAgICAgcmV0dXJuIGtleXNwYWNlSW5zdGFuY2VzLmdldElmUmVhZHkoa2V5c3BhY2VOYW1lKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHtAbGluayBDb2x1bW5GYW1pbHlTdG9yZX0gYnkgdGhlIHRhYmxlIGlkZW50aWZpZXIuIE5vdGUgdGhhdCB0aG91Z2gsIGlmIGNhbGxlZCBmb3Ige0BsaW5rIFRhYmxlTWV0YWRhdGEjaWR9LAorICAgICAqIHdoZW4gbWV0YWRhdGEgcG9pbnRzIHRvIGEgc2Vjb25kYXJ5IGluZGV4IHRhYmxlLCB0aGUge0BsaW5rIFRhYmxlTWV0YWRhdGEjaWR9IGRlbm90ZXMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIG1haW4KKyAgICAgKiB0YWJsZSwgbm90IHRoZSBpbmRleCB0YWJsZS4gVGh1cywgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gQ0ZTIG9mIHRoZSBtYWluIHRhYmxlIHJhdGhlciB0aGFuLCBwcm9iYWJseSBleHBlY3RlZCwKKyAgICAgKiBDRlMgZm9yIHRoZSBpbmRleCBiYWNraW5nIHRhYmxlLgorICAgICAqLwogICAgIHB1YmxpYyBDb2x1bW5GYW1pbHlTdG9yZSBnZXRDb2x1bW5GYW1pbHlTdG9yZUluc3RhbmNlKFRhYmxlSWQgaWQpCiAgICAgewogICAgICAgICBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhID0gZ2V0VGFibGVNZXRhZGF0YShpZCk7CkBAIC00NTcsMTMgKzQ3NCwxMyBAQAogICAgIC8qIEZ1bmN0aW9uIGhlbHBlcnMgKi8KIAogICAgIC8qKgotICAgICAqIEdldCBhbGwgZnVuY3Rpb24gb3ZlcmxvYWRzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCisgICAgICogR2V0IGFsbCB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb3ZlcmxvYWRzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgogICAgICAqCiAgICAgICogQHBhcmFtIG5hbWUgZnVsbHkgcXVhbGlmaWVkIGZ1bmN0aW9uIG5hbWUKICAgICAgKiBAcmV0dXJuIGFuIGVtcHR5IGxpc3QgaWYgdGhlIGtleXNwYWNlIG9yIHRoZSBmdW5jdGlvbiBuYW1lIGFyZSBub3QgZm91bmQ7Ci0gICAgICogICAgICAgICBhIG5vbi1lbXB0eSBjb2xsZWN0aW9uIG9mIHtAbGluayBGdW5jdGlvbn0gb3RoZXJ3aXNlCisgICAgICogICAgICAgICBhIG5vbi1lbXB0eSBjb2xsZWN0aW9uIG9mIHtAbGluayBVc2VyRnVuY3Rpb259IG90aGVyd2lzZQogICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uPEZ1bmN0aW9uPiBnZXRGdW5jdGlvbnMoRnVuY3Rpb25OYW1lIG5hbWUpCisgICAgcHVibGljIENvbGxlY3Rpb248VXNlckZ1bmN0aW9uPiBnZXRVc2VyRnVuY3Rpb25zKEZ1bmN0aW9uTmFtZSBuYW1lKQogICAgIHsKICAgICAgICAgaWYgKCFuYW1lLmhhc0tleXNwYWNlKCkpCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBmdWxseSBxdWFsaWZpZWQ6IGdvdCAlcyIsIG5hbWUpKTsKQEAgLTQ3MSwyNiArNDg4LDI0IEBACiAgICAgICAgIEtleXNwYWNlTWV0YWRhdGEga3NtID0gZ2V0S2V5c3BhY2VNZXRhZGF0YShuYW1lLmtleXNwYWNlKTsKICAgICAgICAgcmV0dXJuIGtzbSA9PSBudWxsCiAgICAgICAgICAgICAgICA/IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpCi0gICAgICAgICAgICAgICA6IGtzbS5mdW5jdGlvbnMuZ2V0KG5hbWUpOworICAgICAgICAgICAgICAgOiBrc20udXNlckZ1bmN0aW9ucy5nZXQobmFtZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRmluZCB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKKyAgICAgKiBGaW5kIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgYXJndW1lbnRzLgogICAgICAqCiAgICAgICogQHBhcmFtIG5hbWUgICAgIGZ1bGx5IHF1YWxpZmllZCBmdW5jdGlvbiBuYW1lCiAgICAgICogQHBhcmFtIGFyZ1R5cGVzIGZ1bmN0aW9uIGFyZ3VtZW50IHR5cGVzCiAgICAgICogQHJldHVybiBhbiBlbXB0eSB7QGxpbmsgT3B0aW9uYWx9IGlmIHRoZSBrZXlzcGFjZSBvciB0aGUgZnVuY3Rpb24gbmFtZSBhcmUgbm90IGZvdW5kOwogICAgICAqICAgICAgICAgYSBub24tZW1wdHkgb3B0aW9uYWwgb2Yge0BsaW5rIEZ1bmN0aW9ufSBvdGhlcndpc2UKICAgICAgKi8KLSAgICBwdWJsaWMgT3B0aW9uYWw8RnVuY3Rpb24+IGZpbmRGdW5jdGlvbihGdW5jdGlvbk5hbWUgbmFtZSwgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzKQorICAgIHB1YmxpYyBPcHRpb25hbDxVc2VyRnVuY3Rpb24+IGZpbmRVc2VyRnVuY3Rpb24oRnVuY3Rpb25OYW1lIG5hbWUsIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBhcmdUeXBlcykKICAgICB7CiAgICAgICAgIGlmICghbmFtZS5oYXNLZXlzcGFjZSgpKQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJGdW5jdGlvbiBuYW1lIG11c3QgYmUgZnVsbHkgcXVhbGxpZmllZDogZ290ICVzIiwgbmFtZSkpOwogCi0gICAgICAgIEtleXNwYWNlTWV0YWRhdGEga3NtID0gZ2V0S2V5c3BhY2VNZXRhZGF0YShuYW1lLmtleXNwYWNlKTsKLSAgICAgICAgcmV0dXJuIGtzbSA9PSBudWxsCi0gICAgICAgICAgICAgICA/IE9wdGlvbmFsLmVtcHR5KCkKLSAgICAgICAgICAgICAgIDoga3NtLmZ1bmN0aW9ucy5maW5kKG5hbWUsIGFyZ1R5cGVzKTsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoZ2V0S2V5c3BhY2VNZXRhZGF0YShuYW1lLmtleXNwYWNlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgLmZsYXRNYXAoa3NtIC0+IGtzbS51c2VyRnVuY3Rpb25zLmZpbmQobmFtZSwgYXJnVHlwZXMpKTsKICAgICB9CiAKICAgICAvKiBWZXJzaW9uIGNvbnRyb2wgKi8KQEAgLTc3Nyw0ICs3OTIsNCBAQAogICAgICAgICAgICAgICAgOiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOwogICAgIH0KIAotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9TY2hlbWFDaGFuZ2VOb3RpZmllci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYUNoYW5nZU5vdGlmaWVyLmphdmEKaW5kZXggYzQ1MzdlMS4uNDQ5ZTk5YiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYUNoYW5nZU5vdGlmaWVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYUNoYW5nZU5vdGlmaWVyLmphdmEKQEAgLTUyLDggKzUyLDggQEAKICAgICAgICAga2V5c3BhY2UudHlwZXMuZm9yRWFjaCh0aGlzOjpub3RpZnlDcmVhdGVUeXBlKTsKICAgICAgICAga2V5c3BhY2UudGFibGVzLmZvckVhY2godGhpczo6bm90aWZ5Q3JlYXRlVGFibGUpOwogICAgICAgICBrZXlzcGFjZS52aWV3cy5mb3JFYWNoKHRoaXM6Om5vdGlmeUNyZWF0ZVZpZXcpOwotICAgICAgICBrZXlzcGFjZS5mdW5jdGlvbnMudWRmcygpLmZvckVhY2godGhpczo6bm90aWZ5Q3JlYXRlRnVuY3Rpb24pOwotICAgICAgICBrZXlzcGFjZS5mdW5jdGlvbnMudWRhcygpLmZvckVhY2godGhpczo6bm90aWZ5Q3JlYXRlQWdncmVnYXRlKTsKKyAgICAgICAga2V5c3BhY2UudXNlckZ1bmN0aW9ucy51ZGZzKCkuZm9yRWFjaCh0aGlzOjpub3RpZnlDcmVhdGVGdW5jdGlvbik7CisgICAgICAgIGtleXNwYWNlLnVzZXJGdW5jdGlvbnMudWRhcygpLmZvckVhY2godGhpczo6bm90aWZ5Q3JlYXRlQWdncmVnYXRlKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBub3RpZnlLZXlzcGFjZUFsdGVyZWQoS2V5c3BhY2VNZXRhZGF0YS5LZXlzcGFjZURpZmYgZGVsdGEsIGJvb2xlYW4gZHJvcERhdGEpCkBAIC04NCw4ICs4NCw4IEBACiAKICAgICBwdWJsaWMgdm9pZCBub3RpZnlLZXlzcGFjZURyb3BwZWQoS2V5c3BhY2VNZXRhZGF0YSBrZXlzcGFjZSwgYm9vbGVhbiBkcm9wRGF0YSkKICAgICB7Ci0gICAgICAgIGtleXNwYWNlLmZ1bmN0aW9ucy51ZGFzKCkuZm9yRWFjaCh0aGlzOjpub3RpZnlEcm9wQWdncmVnYXRlKTsKLSAgICAgICAga2V5c3BhY2UuZnVuY3Rpb25zLnVkZnMoKS5mb3JFYWNoKHRoaXM6Om5vdGlmeURyb3BGdW5jdGlvbik7CisgICAgICAgIGtleXNwYWNlLnVzZXJGdW5jdGlvbnMudWRhcygpLmZvckVhY2godGhpczo6bm90aWZ5RHJvcEFnZ3JlZ2F0ZSk7CisgICAgICAgIGtleXNwYWNlLnVzZXJGdW5jdGlvbnMudWRmcygpLmZvckVhY2godGhpczo6bm90aWZ5RHJvcEZ1bmN0aW9uKTsKICAgICAgICAga2V5c3BhY2Uudmlld3MuZm9yRWFjaCh2aWV3IC0+IG5vdGlmeURyb3BWaWV3KHZpZXcsIGRyb3BEYXRhKSk7CiAgICAgICAgIGtleXNwYWNlLnRhYmxlcy5mb3JFYWNoKG1ldGFkYXRhIC0+IG5vdGlmeURyb3BUYWJsZShtZXRhZGF0YSwgZHJvcERhdGEpKTsKICAgICAgICAga2V5c3BhY2UudHlwZXMuZm9yRWFjaCh0aGlzOjpub3RpZnlEcm9wVHlwZSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvU2NoZW1hRXZlbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9TY2hlbWFFdmVudC5qYXZhCmluZGV4IDU3MDNmZTIuLjhjZGQwYzggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9TY2hlbWFFdmVudC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9TY2hlbWFFdmVudC5qYXZhCkBAIC0xNzIsNyArMTcyLDcgQEAKICAgICAgICAgaWYgKGtzbS5wYXJhbXMgIT0gbnVsbCkgcmV0LnB1dCgicGFyYW1zIiwga3NtLnBhcmFtcy50b1N0cmluZygpKTsKICAgICAgICAgaWYgKGtzbS50YWJsZXMgIT0gbnVsbCkgcmV0LnB1dCgidGFibGVzIiwga3NtLnRhYmxlcy50b1N0cmluZygpKTsKICAgICAgICAgaWYgKGtzbS52aWV3cyAhPSBudWxsKSByZXQucHV0KCJ2aWV3cyIsIGtzbS52aWV3cy50b1N0cmluZygpKTsKLSAgICAgICAgaWYgKGtzbS5mdW5jdGlvbnMgIT0gbnVsbCkgcmV0LnB1dCgiZnVuY3Rpb25zIiwga3NtLmZ1bmN0aW9ucy50b1N0cmluZygpKTsKKyAgICAgICAgaWYgKGtzbS51c2VyRnVuY3Rpb25zICE9IG51bGwpIHJldC5wdXQoImZ1bmN0aW9ucyIsIGtzbS51c2VyRnVuY3Rpb25zLnRvU3RyaW5nKCkpOwogICAgICAgICBpZiAoa3NtLnR5cGVzICE9IG51bGwpIHJldC5wdXQoInR5cGVzIiwga3NtLnR5cGVzLnRvU3RyaW5nKCkpOwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9TY2hlbWFLZXlzcGFjZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYUtleXNwYWNlLmphdmEKaW5kZXggM2YyMjNkZC4uZDExZjg3MCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYUtleXNwYWNlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYUtleXNwYWNlLmphdmEKQEAgLTM1LDYgKzM1LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nLkNvbHVtbk1hc2s7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLnNjaGVtYS5DcmVhdGVUYWJsZVN0YXRlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CkBAIC01Niw2ICs1Nyw4IEBACiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3Q7CiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b1NldDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLklHTk9SRV9DT1JSVVBURURfU0NIRU1BX1RBQkxFUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0ZMVVNIX0xPQ0FMX1NDSEVNQV9DSEFOR0VTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVJbnRlcm5hbDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5RdWVyeVByb2Nlc3Nvci5leGVjdXRlT25jZUludGVybmFsOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hS2V5c3BhY2VUYWJsZXMuKjsKQEAgLTYzLDcgKzY2LDcgQEAKIAogLyoqCiAgKiBzeXN0ZW1fc2NoZW1hLiogdGFibGVzIGFuZCBtZXRob2RzIGZvciBtYW5pcHVsYXRpbmcgdGhlbS4KLSAqIAorICoKICAqIFBsZWFzZSBub3RpY2UgdGhpcyBjbGFzcyBpcyBfbm90XyB0aHJlYWQgc2FmZSBhbmQgYWxsIG1ldGhvZHMgd2hpY2ggcmVhZHMgb3IgdXBkYXRlcyB0aGUgZGF0YSBpbiBzY2hlbWEga2V5c3BhY2UKICAqIHNob3VsZCBiZSBhY2Nlc3NlZCBvbmx5IGZyb20gdGhlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBTY2hlbWFVcGRhdGVIYW5kbGVyfSBpbiBzeW5jaHJvbml6ZWQgYmxvY2tzLgogICovCkBAIC03Niw4ICs3OSw4IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU2NoZW1hS2V5c3BhY2UuY2xhc3MpOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBGTFVTSF9TQ0hFTUFfVEFCTEVTID0gQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkZMVVNIX0xPQ0FMX1NDSEVNQV9DSEFOR0VTLmdldEJvb2xlYW4oKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIElHTk9SRV9DT1JSVVBURURfU0NIRU1BX1RBQkxFUyA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmlnbm9yZV9jb3JydXB0ZWRfc2NoZW1hX3RhYmxlcyIsICJmYWxzZSIpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEZMVVNIX1NDSEVNQV9UQUJMRVMgPSBURVNUX0ZMVVNIX0xPQ0FMX1NDSEVNQV9DSEFOR0VTLmdldEJvb2xlYW4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIElHTk9SRV9DT1JSVVBURURfU0NIRU1BX1RBQkxFU19QUk9QRVJUWV9WQUxVRSA9IElHTk9SRV9DT1JSVVBURURfU0NIRU1BX1RBQkxFUy5nZXRCb29sZWFuKCk7CiAKICAgICAvKioKICAgICAgKiBUaGUgdGFibGVzIHRvIHdoaWNoIHdlIGFkZGVkIHRoZSBjZGMgY29sdW1uLiBUaGlzIGlzIHVzZWQgaW4ge0BsaW5rICNtYWtlVXBkYXRlRm9yU2NoZW1hfSBiZWxvdyB0byBtYWtlIHN1cmUgd2Ugc2tpcCB0aGF0CkBAIC0xMDAsNiArMTAzLDcgQEAKICAgICAgICAgICAgICAgIkNSRUFURSBUQUJMRSAlcyAoIgogICAgICAgICAgICAgICArICJrZXlzcGFjZV9uYW1lIHRleHQsIgogICAgICAgICAgICAgICArICJ0YWJsZV9uYW1lIHRleHQsIgorICAgICAgICAgICAgICArICJhbGxvd19hdXRvX3NuYXBzaG90IGJvb2xlYW4sIgogICAgICAgICAgICAgICArICJibG9vbV9maWx0ZXJfZnBfY2hhbmNlIGRvdWJsZSwiCiAgICAgICAgICAgICAgICsgImNhY2hpbmcgZnJvemVuPG1hcDx0ZXh0LCB0ZXh0Pj4sIgogICAgICAgICAgICAgICArICJjb21tZW50IHRleHQsIgpAQCAtMTEyLDYgKzExNiw3IEBACiAgICAgICAgICAgICAgICsgImV4dGVuc2lvbnMgZnJvemVuPG1hcDx0ZXh0LCBibG9iPj4sIgogICAgICAgICAgICAgICArICJmbGFncyBmcm96ZW48c2V0PHRleHQ+PiwiIC8vIFNVUEVSLCBDT1VOVEVSLCBERU5TRSwgQ09NUE9VTkQKICAgICAgICAgICAgICAgKyAiZ2NfZ3JhY2Vfc2Vjb25kcyBpbnQsIgorICAgICAgICAgICAgICArICJpbmNyZW1lbnRhbF9iYWNrdXBzIGJvb2xlYW4sIgogICAgICAgICAgICAgICArICJpZCB1dWlkLCIKICAgICAgICAgICAgICAgKyAibWF4X2luZGV4X2ludGVydmFsIGludCwiCiAgICAgICAgICAgICAgICsgIm1lbXRhYmxlX2ZsdXNoX3BlcmlvZF9pbl9tcyBpbnQsIgpAQCAtMTM3LDYgKzE0MiwyMCBAQAogICAgICAgICAgICAgICArICJ0eXBlIHRleHQsIgogICAgICAgICAgICAgICArICJQUklNQVJZIEtFWSAoKGtleXNwYWNlX25hbWUpLCB0YWJsZV9uYW1lLCBjb2x1bW5fbmFtZSkpIik7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUYWJsZU1ldGFkYXRhIENvbHVtbk1hc2tzID0KKyAgICBwYXJzZShDT0xVTU5fTUFTS1MsCisgICAgICAgICAgImNvbHVtbiBkeW5hbWljIGRhdGEgbWFza3MiLAorICAgICAgICAgICJDUkVBVEUgVEFCTEUgJXMgKCIKKyAgICAgICAgICArICJrZXlzcGFjZV9uYW1lIHRleHQsIgorICAgICAgICAgICsgInRhYmxlX25hbWUgdGV4dCwiCisgICAgICAgICAgKyAiY29sdW1uX25hbWUgdGV4dCwiCisgICAgICAgICAgKyAiZnVuY3Rpb25fa2V5c3BhY2UgdGV4dCwiCisgICAgICAgICAgKyAiZnVuY3Rpb25fbmFtZSB0ZXh0LCIKKyAgICAgICAgICArICJmdW5jdGlvbl9hcmd1bWVudF90eXBlcyBmcm96ZW48bGlzdDx0ZXh0Pj4sIgorICAgICAgICAgICsgImZ1bmN0aW9uX2FyZ3VtZW50X3ZhbHVlcyBmcm96ZW48bGlzdDx0ZXh0Pj4sIgorICAgICAgICAgICsgImZ1bmN0aW9uX2FyZ3VtZW50X251bGxzIGZyb3plbjxsaXN0PGJvb2xlYW4+PiwiIC8vIGFyZ3VtZW50cyB0aGF0IGFyZSBudWxsCisgICAgICAgICAgKyAiUFJJTUFSWSBLRVkgKChrZXlzcGFjZV9uYW1lKSwgdGFibGVfbmFtZSwgY29sdW1uX25hbWUpKSIpOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGFibGVNZXRhZGF0YSBEcm9wcGVkQ29sdW1ucyA9CiAgICAgICAgIHBhcnNlKERST1BQRURfQ09MVU1OUywKICAgICAgICAgICAgICAgImRyb3BwZWQgY29sdW1uIHJlZ2lzdHJ5IiwKQEAgLTE2OCw2ICsxODcsNyBAQAogICAgICAgICAgICAgICArICJiYXNlX3RhYmxlX2lkIHV1aWQsIgogICAgICAgICAgICAgICArICJiYXNlX3RhYmxlX25hbWUgdGV4dCwiCiAgICAgICAgICAgICAgICsgIndoZXJlX2NsYXVzZSB0ZXh0LCIKKyAgICAgICAgICAgICAgKyAiYWxsb3dfYXV0b19zbmFwc2hvdCBib29sZWFuLCIKICAgICAgICAgICAgICAgKyAiYmxvb21fZmlsdGVyX2ZwX2NoYW5jZSBkb3VibGUsIgogICAgICAgICAgICAgICArICJjYWNoaW5nIGZyb3plbjxtYXA8dGV4dCwgdGV4dD4+LCIKICAgICAgICAgICAgICAgKyAiY29tbWVudCB0ZXh0LCIKQEAgLTE3OSw2ICsxOTksNyBAQAogICAgICAgICAgICAgICArICJkZWZhdWx0X3RpbWVfdG9fbGl2ZSBpbnQsIgogICAgICAgICAgICAgICArICJleHRlbnNpb25zIGZyb3plbjxtYXA8dGV4dCwgYmxvYj4+LCIKICAgICAgICAgICAgICAgKyAiZ2NfZ3JhY2Vfc2Vjb25kcyBpbnQsIgorICAgICAgICAgICAgICArICJpbmNyZW1lbnRhbF9iYWNrdXBzIGJvb2xlYW4sIgogICAgICAgICAgICAgICArICJpZCB1dWlkLCIKICAgICAgICAgICAgICAgKyAiaW5jbHVkZV9hbGxfY29sdW1ucyBib29sZWFuLCIKICAgICAgICAgICAgICAgKyAibWF4X2luZGV4X2ludGVydmFsIGludCwiCkBAIC0yNDAsOCArMjYxLDE3IEBACiAgICAgICAgICAgICAgICsgInN0YXRlX3R5cGUgdGV4dCwiCiAgICAgICAgICAgICAgICsgIlBSSU1BUlkgS0VZICgoa2V5c3BhY2VfbmFtZSksIGFnZ3JlZ2F0ZV9uYW1lLCBhcmd1bWVudF90eXBlcykpIik7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFRhYmxlTWV0YWRhdGE+IEFMTF9UQUJMRV9NRVRBREFUQSA9Ci0gICAgICAgIEltbXV0YWJsZUxpc3Qub2YoS2V5c3BhY2VzLCBUYWJsZXMsIENvbHVtbnMsIFRyaWdnZXJzLCBEcm9wcGVkQ29sdW1ucywgVmlld3MsIFR5cGVzLCBGdW5jdGlvbnMsIEFnZ3JlZ2F0ZXMsIEluZGV4ZXMpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8VGFibGVNZXRhZGF0YT4gQUxMX1RBQkxFX01FVEFEQVRBID0gSW1tdXRhYmxlTGlzdC5vZihLZXlzcGFjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uTWFza3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWdnZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm9wcGVkQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZ3JlZ2F0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4ZXMpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgVGFibGVNZXRhZGF0YSBwYXJzZShTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uLCBTdHJpbmcgY3FsKQogICAgIHsKQEAgLTQ2OSw4ICs0OTksOCBAQAogICAgICAgICBrZXlzcGFjZS50YWJsZXMuZm9yRWFjaCh0YWJsZSAtPiBhZGRUYWJsZVRvU2NoZW1hTXV0YXRpb24odGFibGUsIHRydWUsIGJ1aWxkZXIpKTsKICAgICAgICAga2V5c3BhY2Uudmlld3MuZm9yRWFjaCh2aWV3IC0+IGFkZFZpZXdUb1NjaGVtYU11dGF0aW9uKHZpZXcsIHRydWUsIGJ1aWxkZXIpKTsKICAgICAgICAga2V5c3BhY2UudHlwZXMuZm9yRWFjaCh0eXBlIC0+IGFkZFR5cGVUb1NjaGVtYU11dGF0aW9uKHR5cGUsIGJ1aWxkZXIpKTsKLSAgICAgICAga2V5c3BhY2UuZnVuY3Rpb25zLnVkZnMoKS5mb3JFYWNoKHVkZiAtPiBhZGRGdW5jdGlvblRvU2NoZW1hTXV0YXRpb24odWRmLCBidWlsZGVyKSk7Ci0gICAgICAgIGtleXNwYWNlLmZ1bmN0aW9ucy51ZGFzKCkuZm9yRWFjaCh1ZGEgLT4gYWRkQWdncmVnYXRlVG9TY2hlbWFNdXRhdGlvbih1ZGEsIGJ1aWxkZXIpKTsKKyAgICAgICAga2V5c3BhY2UudXNlckZ1bmN0aW9ucy51ZGZzKCkuZm9yRWFjaCh1ZGYgLT4gYWRkRnVuY3Rpb25Ub1NjaGVtYU11dGF0aW9uKHVkZiwgYnVpbGRlcikpOworICAgICAgICBrZXlzcGFjZS51c2VyRnVuY3Rpb25zLnVkYXMoKS5mb3JFYWNoKHVkYSAtPiBhZGRBZ2dyZWdhdGVUb1NjaGVtYU11dGF0aW9uKHVkYSwgYnVpbGRlcikpOwogCiAgICAgICAgIHJldHVybiBidWlsZGVyOwogICAgIH0KQEAgLTU2Myw2ICs1OTMsMTYgQEAKICAgICAgICAgLy8gaW4gbWl4ZWQgb3BlcmF0aW9uIHdpdGggcHJlLTQuMSB2ZXJzaW9uZWQgbm9kZSBkdXJpbmcgdXBncmFkZXMuCiAgICAgICAgIGlmIChwYXJhbXMubWVtdGFibGUgIT0gTWVtdGFibGVQYXJhbXMuREVGQVVMVCkKICAgICAgICAgICAgIGJ1aWxkZXIuYWRkKCJtZW10YWJsZSIsIHBhcmFtcy5tZW10YWJsZS5jb25maWd1cmF0aW9uS2V5KCkpOworCisgICAgICAgIC8vIEFzIGFib3ZlLCBvbmx5IGFkZCB0aGUgYWxsb3dfYXV0b19zbmFwc2hvdCBjb2x1bW4gaWYgdGhlIHZhbHVlIGlzIG5vdCBkZWZhdWx0ICh0cnVlKSBhbmQKKyAgICAgICAgLy8gYXV0by1zbmFwc2hvdHRpbmcgaXMgZW5hYmxlZCwgdG8gYXZvaWQgUlRFIGluIHByZS00LjIgdmVyc2lvbmVkIG5vZGUgZHVyaW5nIHVwZ3JhZGVzCisgICAgICAgIGlmICghcGFyYW1zLmFsbG93QXV0b1NuYXBzaG90KQorICAgICAgICAgICAgYnVpbGRlci5hZGQoImFsbG93X2F1dG9fc25hcHNob3QiLCBmYWxzZSk7CisKKyAgICAgICAgLy8gQXMgYWJvdmUsIG9ubHkgYWRkIHRoZSBpbmNyZW1lbnRhbF9iYWNrdXBzIGNvbHVtbiBpZiB0aGUgdmFsdWUgaXMgbm90IGRlZmF1bHQgKHRydWUpIGFuZAorICAgICAgICAvLyBpbmNyZW1lbnRhbF9iYWNrdXBzIGlzIGVuYWJsZWQsIHRvIGF2b2lkIFJURSBpbiBwcmUtNC4yIHZlcnNpb25lZCBub2RlIGR1cmluZyB1cGdyYWRlcworICAgICAgICBpZiAoIXBhcmFtcy5pbmNyZW1lbnRhbEJhY2t1cHMpCisgICAgICAgICAgICBidWlsZGVyLmFkZCgiaW5jcmVtZW50YWxfYmFja3VwcyIsIGZhbHNlKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEFsdGVyVGFibGVUb1NjaGVtYU11dGF0aW9uKFRhYmxlTWV0YWRhdGEgb2xkVGFibGUsIFRhYmxlTWV0YWRhdGEgbmV3VGFibGUsIE11dGF0aW9uLlNpbXBsZUJ1aWxkZXIgYnVpbGRlcikKQEAgLTY3NCw3ICs3MTQsNyBAQAogICAgIHsKICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHR5cGUgPSBjb2x1bW4udHlwZTsKICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBSZXZlcnNlZFR5cGUpCi0gICAgICAgICAgICB0eXBlID0gKChSZXZlcnNlZFR5cGUpIHR5cGUpLmJhc2VUeXBlOworICAgICAgICAgICAgdHlwZSA9ICgoUmV2ZXJzZWRUeXBlPD8+KSB0eXBlKS5iYXNlVHlwZTsKIAogICAgICAgICBidWlsZGVyLnVwZGF0ZShDb2x1bW5zKQogICAgICAgICAgICAgICAgLnJvdyh0YWJsZS5uYW1lLCBjb2x1bW4ubmFtZS50b1N0cmluZygpKQpAQCAtNjgzLDYgKzcyMyw1MiBAQAogICAgICAgICAgICAgICAgLmFkZCgicG9zaXRpb24iLCBjb2x1bW4ucG9zaXRpb24oKSkKICAgICAgICAgICAgICAgIC5hZGQoImNsdXN0ZXJpbmdfb3JkZXIiLCBjb2x1bW4uY2x1c3RlcmluZ09yZGVyKCkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKQogICAgICAgICAgICAgICAgLmFkZCgidHlwZSIsIHR5cGUuYXNDUUwzVHlwZSgpLnRvU3RyaW5nKCkpOworCisgICAgICAgIENvbHVtbk1hc2sgbWFzayA9IGNvbHVtbi5nZXRNYXNrKCk7CisgICAgICAgIGlmIChTY2hlbWFDb25zdGFudHMuaXNSZXBsaWNhdGVkU3lzdGVtS2V5c3BhY2UodGFibGUua2V5c3BhY2UpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGUgcHJvcGFnYXRpb24gb2Ygc3lzdGVtIGRpc3RyaWJ1dGVkIGtleXNwYWNlcyBhdCBzdGFydHVwIGNhbiBiZSBwcm9ibGVtYXRpYyBmb3Igb2xkIG5vZGVzIHdpdGhvdXQgRERNLAorICAgICAgICAgICAgLy8gc2luY2UgdGhvc2Ugd29uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggdGhlIG1hc2sgbXV0YXRpb25zLiBUaHVzLCB3ZSBkb24ndCBzdXBwb3J0IERETSBvbiB0aG9zZSBrZXlzcGFjZXMuCisgICAgICAgICAgICBhc3NlcnQgbWFzayA9PSBudWxsIDogIkR5bmFtaWMgZGF0YSBtYXNraW5nIHNob3VsZG4ndCBiZSB1c2VkIG9uIHN5c3RlbSBkaXN0cmlidXRlZCBrZXlzcGFjZXMiOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgUm93LlNpbXBsZUJ1aWxkZXIgbWFza0J1aWxkZXIgPSBidWlsZGVyLnVwZGF0ZShDb2x1bW5NYXNrcykucm93KHRhYmxlLm5hbWUsIGNvbHVtbi5uYW1lLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICBpZiAobWFzayA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hc2tCdWlsZGVyLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZ1bmN0aW9uTmFtZSBtYXNrRnVuY3Rpb25OYW1lID0gbWFzay5mdW5jdGlvbi5uYW1lKCk7CisKKyAgICAgICAgICAgICAgICAvLyBTb21lIGFyZ3VtZW50cyBvZiB0aGUgbWFza2luZyBmdW5jdGlvbiBjYW4gYmUgbnVsbCwgYnV0IHRoZSBDUUwncyBsaXN0IHR5cGUgdGhhdCBzdG9yZXMgdGhlbSBkb2Vzbid0CisgICAgICAgICAgICAgICAgLy8gYWNjZXB0IG51bGxzLCBzbyB3ZSB1c2UgYSBwYXJhbGxlbCBsaXN0IG9mIGJvb2xlYW5zIHRvIHN0b3JlIHdoYXQgYXJndW1lbnRzIGFyZSBudWxsLgorICAgICAgICAgICAgICAgIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBwYXJ0aWFsVHlwZXMgPSBtYXNrLnBhcnRpYWxBcmd1bWVudFR5cGVzKCk7CisgICAgICAgICAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBwYXJ0aWFsVmFsdWVzID0gbWFzay5wYXJ0aWFsQXJndW1lbnRWYWx1ZXMoKTsKKyAgICAgICAgICAgICAgICBpbnQgbnVtQXJncyA9IHBhcnRpYWxUeXBlcy5zaXplKCk7CisgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHR5cGVzID0gbmV3IEFycmF5TGlzdDw+KG51bUFyZ3MpOworICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PD4obnVtQXJncyk7CisgICAgICAgICAgICAgICAgTGlzdDxCb29sZWFuPiBudWxscyA9IG5ldyBBcnJheUxpc3Q8PihudW1BcmdzKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiBhcmdUeXBlID0gcGFydGlhbFR5cGVzLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgdHlwZXMuYWRkKGFyZ1R5cGUuYXNDUUwzVHlwZSgpLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYXJnVmFsdWUgPSBwYXJ0aWFsVmFsdWVzLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc051bGwgPSBhcmdWYWx1ZSA9PSBudWxsOworICAgICAgICAgICAgICAgICAgICBudWxscy5hZGQoaXNOdWxsKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZChpc051bGwgPyAiIiA6IGFyZ1R5cGUuZ2V0U3RyaW5nKGFyZ1ZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWFza0J1aWxkZXIuYWRkKCJmdW5jdGlvbl9rZXlzcGFjZSIsIG1hc2tGdW5jdGlvbk5hbWUua2V5c3BhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKCJmdW5jdGlvbl9uYW1lIiwgbWFza0Z1bmN0aW9uTmFtZS5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCgiZnVuY3Rpb25fYXJndW1lbnRfdHlwZXMiLCB0eXBlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoImZ1bmN0aW9uX2FyZ3VtZW50X3ZhbHVlcyIsIHZhbHVlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoImZ1bmN0aW9uX2FyZ3VtZW50X251bGxzIiwgbnVsbHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkcm9wQ29sdW1uRnJvbVNjaGVtYU11dGF0aW9uKFRhYmxlTWV0YWRhdGEgdGFibGUsIENvbHVtbk1ldGFkYXRhIGNvbHVtbiwgTXV0YXRpb24uU2ltcGxlQnVpbGRlciBidWlsZGVyKQpAQCAtODYyLDkgKzk0OCw5IEBACiAgICAgewogICAgICAgICBLZXlzcGFjZVBhcmFtcyBwYXJhbXMgPSBmZXRjaEtleXNwYWNlUGFyYW1zKGtleXNwYWNlTmFtZSk7CiAgICAgICAgIFR5cGVzIHR5cGVzID0gZmV0Y2hUeXBlcyhrZXlzcGFjZU5hbWUpOwotICAgICAgICBUYWJsZXMgdGFibGVzID0gZmV0Y2hUYWJsZXMoa2V5c3BhY2VOYW1lLCB0eXBlcyk7Ci0gICAgICAgIFZpZXdzIHZpZXdzID0gZmV0Y2hWaWV3cyhrZXlzcGFjZU5hbWUsIHR5cGVzKTsKLSAgICAgICAgRnVuY3Rpb25zIGZ1bmN0aW9ucyA9IGZldGNoRnVuY3Rpb25zKGtleXNwYWNlTmFtZSwgdHlwZXMpOworICAgICAgICBVc2VyRnVuY3Rpb25zIGZ1bmN0aW9ucyA9IGZldGNoRnVuY3Rpb25zKGtleXNwYWNlTmFtZSwgdHlwZXMpOworICAgICAgICBUYWJsZXMgdGFibGVzID0gZmV0Y2hUYWJsZXMoa2V5c3BhY2VOYW1lLCB0eXBlcywgZnVuY3Rpb25zKTsKKyAgICAgICAgVmlld3Mgdmlld3MgPSBmZXRjaFZpZXdzKGtleXNwYWNlTmFtZSwgdHlwZXMsIGZ1bmN0aW9ucyk7CiAgICAgICAgIHJldHVybiBLZXlzcGFjZU1ldGFkYXRhLmNyZWF0ZShrZXlzcGFjZU5hbWUsIHBhcmFtcywgdGFibGVzLCB2aWV3cywgdHlwZXMsIGZ1bmN0aW9ucyk7CiAgICAgfQogCkBAIC04OTMsNyArOTc5LDcgQEAKICAgICAgICAgcmV0dXJuIHR5cGVzLmJ1aWxkKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGFibGVzIGZldGNoVGFibGVzKFN0cmluZyBrZXlzcGFjZU5hbWUsIFR5cGVzIHR5cGVzKQorICAgIHByaXZhdGUgc3RhdGljIFRhYmxlcyBmZXRjaFRhYmxlcyhTdHJpbmcga2V5c3BhY2VOYW1lLCBUeXBlcyB0eXBlcywgVXNlckZ1bmN0aW9ucyBmdW5jdGlvbnMpCiAgICAgewogICAgICAgICBTdHJpbmcgcXVlcnkgPSBmb3JtYXQoIlNFTEVDVCB0YWJsZV9uYW1lIEZST00gJXMuJXMgV0hFUkUga2V5c3BhY2VfbmFtZSA9ID8iLCBTY2hlbWFDb25zdGFudHMuU0NIRU1BX0tFWVNQQUNFX05BTUUsIFRBQkxFUyk7CiAKQEAgLTkwMyw3ICs5ODksNyBAQAogICAgICAgICAgICAgU3RyaW5nIHRhYmxlTmFtZSA9IHJvdy5nZXRTdHJpbmcoInRhYmxlX25hbWUiKTsKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRhYmxlcy5hZGQoZmV0Y2hUYWJsZShrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZSwgdHlwZXMpKTsKKyAgICAgICAgICAgICAgICB0YWJsZXMuYWRkKGZldGNoVGFibGUoa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsIHR5cGVzLCBmdW5jdGlvbnMpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChNaXNzaW5nQ29sdW1ucyBleGMpCiAgICAgICAgICAgICB7CkBAIC05MTgsMTMgKzEwMDQsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5TQ0hFTUFfS0VZU1BBQ0VfTkFNRSwgQ09MVU1OUywga2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb25zdGFudHMuU0NIRU1BX0tFWVNQQUNFX05BTUUsIENPTFVNTlMpOwogCi0gICAgICAgICAgICAgICAgaWYgKElHTk9SRV9DT1JSVVBURURfU0NIRU1BX1RBQkxFUykKKyAgICAgICAgICAgICAgICBpZiAoSUdOT1JFX0NPUlJVUFRFRF9TQ0hFTUFfVEFCTEVTX1BST1BFUlRZX1ZBTFVFKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yTXNnLCAiIiwgZXhjKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yTXNnLCAicmVzdGFydCBjYXNzYW5kcmEgd2l0aCAtRGNhc3NhbmRyYS5pZ25vcmVfY29ycnVwdGVkX3NjaGVtYV90YWJsZXM9dHJ1ZSBhbmQgIik7CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnJvck1zZywgInJlc3RhcnQgY2Fzc2FuZHJhIHdpdGggLUR7fT10cnVlIGFuZCAiLCBJR05PUkVfQ09SUlVQVEVEX1NDSEVNQV9UQUJMRVMuZ2V0S2V5KCkpOwogICAgICAgICAgICAgICAgICAgICB0aHJvdyBleGM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtOTMyLDcgKzEwMTgsNyBAQAogICAgICAgICByZXR1cm4gdGFibGVzLmJ1aWxkKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGFibGVNZXRhZGF0YSBmZXRjaFRhYmxlKFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZyB0YWJsZU5hbWUsIFR5cGVzIHR5cGVzKQorICAgIHByaXZhdGUgc3RhdGljIFRhYmxlTWV0YWRhdGEgZmV0Y2hUYWJsZShTdHJpbmcga2V5c3BhY2VOYW1lLCBTdHJpbmcgdGFibGVOYW1lLCBUeXBlcyB0eXBlcywgVXNlckZ1bmN0aW9ucyBmdW5jdGlvbnMpCiAgICAgewogICAgICAgICBTdHJpbmcgcXVlcnkgPSBTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgKiBGUk9NICVzLiVzIFdIRVJFIGtleXNwYWNlX25hbWUgPSA/IEFORCB0YWJsZV9uYW1lID0gPyIsIFNjaGVtYUNvbnN0YW50cy5TQ0hFTUFfS0VZU1BBQ0VfTkFNRSwgVEFCTEVTKTsKICAgICAgICAgVW50eXBlZFJlc3VsdFNldCByb3dzID0gcXVlcnkocXVlcnksIGtleXNwYWNlTmFtZSwgdGFibGVOYW1lKTsKQEAgLTk0NCw3ICsxMDMwLDcgQEAKICAgICAgICAgcmV0dXJuIFRhYmxlTWV0YWRhdGEuYnVpbGRlcihrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZSwgVGFibGVJZC5mcm9tVVVJRChyb3cuZ2V0VVVJRCgiaWQiKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZsYWdzKGZsYWdzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYXJhbXMoY3JlYXRlVGFibGVQYXJhbXNGcm9tUm93KHJvdykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbHVtbnMoZmV0Y2hDb2x1bW5zKGtleXNwYWNlTmFtZSwgdGFibGVOYW1lLCB0eXBlcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbHVtbnMoZmV0Y2hDb2x1bW5zKGtleXNwYWNlTmFtZSwgdGFibGVOYW1lLCB0eXBlcywgZnVuY3Rpb25zKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZHJvcHBlZENvbHVtbnMoZmV0Y2hEcm9wcGVkQ29sdW1ucyhrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluZGV4ZXMoZmV0Y2hJbmRleGVzKGtleXNwYWNlTmFtZSwgdGFibGVOYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHJpZ2dlcnMoZmV0Y2hUcmlnZ2VycyhrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZSkpCkBAIC05NTQsMzIgKzEwNDAsNDEgQEAKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBzdGF0aWMgVGFibGVQYXJhbXMgY3JlYXRlVGFibGVQYXJhbXNGcm9tUm93KFVudHlwZWRSZXN1bHRTZXQuUm93IHJvdykKICAgICB7Ci0gICAgICAgIHJldHVybiBUYWJsZVBhcmFtcy5idWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmJsb29tRmlsdGVyRnBDaGFuY2Uocm93LmdldERvdWJsZSgiYmxvb21fZmlsdGVyX2ZwX2NoYW5jZSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuY2FjaGluZyhDYWNoaW5nUGFyYW1zLmZyb21NYXAocm93LmdldEZyb3plblRleHRNYXAoImNhY2hpbmciKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5jb21tZW50KHJvdy5nZXRTdHJpbmcoImNvbW1lbnQiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhY3Rpb24oQ29tcGFjdGlvblBhcmFtcy5mcm9tTWFwKHJvdy5nZXRGcm96ZW5UZXh0TWFwKCJjb21wYWN0aW9uIikpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuY29tcHJlc3Npb24oQ29tcHJlc3Npb25QYXJhbXMuZnJvbU1hcChyb3cuZ2V0RnJvemVuVGV4dE1hcCgiY29tcHJlc3Npb24iKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5tZW10YWJsZShNZW10YWJsZVBhcmFtcy5nZXRXaXRoRmFsbGJhY2socm93LmhhcygibWVtdGFibGUiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcm93LmdldFN0cmluZygibWVtdGFibGUiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCkpIC8vIG1lbXRhYmxlIGNvbHVtbiB3YXMgaW50cm9kdWNlZCBpbiA0LjEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHRUaW1lVG9MaXZlKHJvdy5nZXRJbnQoImRlZmF1bHRfdGltZV90b19saXZlIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5leHRlbnNpb25zKHJvdy5nZXRGcm96ZW5NYXAoImV4dGVuc2lvbnMiLCBVVEY4VHlwZS5pbnN0YW5jZSwgQnl0ZXNUeXBlLmluc3RhbmNlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmdjR3JhY2VTZWNvbmRzKHJvdy5nZXRJbnQoImdjX2dyYWNlX3NlY29uZHMiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heEluZGV4SW50ZXJ2YWwocm93LmdldEludCgibWF4X2luZGV4X2ludGVydmFsIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5tZW10YWJsZUZsdXNoUGVyaW9kSW5Ncyhyb3cuZ2V0SW50KCJtZW10YWJsZV9mbHVzaF9wZXJpb2RfaW5fbXMiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLm1pbkluZGV4SW50ZXJ2YWwocm93LmdldEludCgibWluX2luZGV4X2ludGVydmFsIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmNDaGVja0NoYW5jZShyb3cuZ2V0RG91YmxlKCJjcmNfY2hlY2tfY2hhbmNlIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5zcGVjdWxhdGl2ZVJldHJ5KFNwZWN1bGF0aXZlUmV0cnlQb2xpY3kuZnJvbVN0cmluZyhyb3cuZ2V0U3RyaW5nKCJzcGVjdWxhdGl2ZV9yZXRyeSIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZGl0aW9uYWxXcml0ZVBvbGljeShyb3cuaGFzKCJhZGRpdGlvbmFsX3dyaXRlX3BvbGljeSIpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY3VsYXRpdmVSZXRyeVBvbGljeS5mcm9tU3RyaW5nKHJvdy5nZXRTdHJpbmcoImFkZGl0aW9uYWxfd3JpdGVfcG9saWN5IikpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY3VsYXRpdmVSZXRyeVBvbGljeS5mcm9tU3RyaW5nKCI5OVBFUkNFTlRJTEUiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmNkYyhyb3cuaGFzKCJjZGMiKSAmJiByb3cuZ2V0Qm9vbGVhbigiY2RjIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWFkUmVwYWlyKGdldFJlYWRSZXBhaXJTdHJhdGVneShyb3cpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgVGFibGVQYXJhbXMuQnVpbGRlciBidWlsZGVyID0gVGFibGVQYXJhbXMuYnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJsb29tRmlsdGVyRnBDaGFuY2Uocm93LmdldERvdWJsZSgiYmxvb21fZmlsdGVyX2ZwX2NoYW5jZSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWNoaW5nKENhY2hpbmdQYXJhbXMuZnJvbU1hcChyb3cuZ2V0RnJvemVuVGV4dE1hcCgiY2FjaGluZyIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29tbWVudChyb3cuZ2V0U3RyaW5nKCJjb21tZW50IikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhY3Rpb24oQ29tcGFjdGlvblBhcmFtcy5mcm9tTWFwKHJvdy5nZXRGcm96ZW5UZXh0TWFwKCJjb21wYWN0aW9uIikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb21wcmVzc2lvbihDb21wcmVzc2lvblBhcmFtcy5mcm9tTWFwKHJvdy5nZXRGcm96ZW5UZXh0TWFwKCJjb21wcmVzc2lvbiIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWVtdGFibGUoTWVtdGFibGVQYXJhbXMuZ2V0V2l0aEZhbGxiYWNrKHJvdy5oYXMoIm1lbXRhYmxlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcm93LmdldFN0cmluZygibWVtdGFibGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsKSkgLy8gbWVtdGFibGUgY29sdW1uIHdhcyBpbnRyb2R1Y2VkIGluIDQuMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0VGltZVRvTGl2ZShyb3cuZ2V0SW50KCJkZWZhdWx0X3RpbWVfdG9fbGl2ZSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5leHRlbnNpb25zKHJvdy5nZXRGcm96ZW5NYXAoImV4dGVuc2lvbnMiLCBVVEY4VHlwZS5pbnN0YW5jZSwgQnl0ZXNUeXBlLmluc3RhbmNlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2NHcmFjZVNlY29uZHMocm93LmdldEludCgiZ2NfZ3JhY2Vfc2Vjb25kcyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhJbmRleEludGVydmFsKHJvdy5nZXRJbnQoIm1heF9pbmRleF9pbnRlcnZhbCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tZW10YWJsZUZsdXNoUGVyaW9kSW5Ncyhyb3cuZ2V0SW50KCJtZW10YWJsZV9mbHVzaF9wZXJpb2RfaW5fbXMiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWluSW5kZXhJbnRlcnZhbChyb3cuZ2V0SW50KCJtaW5faW5kZXhfaW50ZXJ2YWwiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JjQ2hlY2tDaGFuY2Uocm93LmdldERvdWJsZSgiY3JjX2NoZWNrX2NoYW5jZSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zcGVjdWxhdGl2ZVJldHJ5KFNwZWN1bGF0aXZlUmV0cnlQb2xpY3kuZnJvbVN0cmluZyhyb3cuZ2V0U3RyaW5nKCJzcGVjdWxhdGl2ZV9yZXRyeSIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkaXRpb25hbFdyaXRlUG9saWN5KHJvdy5oYXMoImFkZGl0aW9uYWxfd3JpdGVfcG9saWN5IikgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY3VsYXRpdmVSZXRyeVBvbGljeS5mcm9tU3RyaW5nKHJvdy5nZXRTdHJpbmcoImFkZGl0aW9uYWxfd3JpdGVfcG9saWN5IikpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWN1bGF0aXZlUmV0cnlQb2xpY3kuZnJvbVN0cmluZygiOTlQRVJDRU5USUxFIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNkYyhyb3cuaGFzKCJjZGMiKSAmJiByb3cuZ2V0Qm9vbGVhbigiY2RjIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlYWRSZXBhaXIoZ2V0UmVhZFJlcGFpclN0cmF0ZWd5KHJvdykpOworCisgICAgICAgIC8vIGFsbG93X2F1dG9fc25hcHNob3QgY29sdW1uIHdhcyBpbnRyb2R1Y2VkIGluIDQuMgorICAgICAgICBpZiAocm93LmhhcygiYWxsb3dfYXV0b19zbmFwc2hvdCIpKQorICAgICAgICAgICAgYnVpbGRlci5hbGxvd0F1dG9TbmFwc2hvdChyb3cuZ2V0Qm9vbGVhbigiYWxsb3dfYXV0b19zbmFwc2hvdCIpKTsKKworICAgICAgICAvLyBpbmNyZW1lbnRhbF9iYWNrdXBzIGNvbHVtbiB3YXMgaW50cm9kdWNlZCBpbiA0LjIKKyAgICAgICAgaWYgKHJvdy5oYXMoImluY3JlbWVudGFsX2JhY2t1cHMiKSkKKyAgICAgICAgICAgIGJ1aWxkZXIuaW5jcmVtZW50YWxCYWNrdXBzKHJvdy5nZXRCb29sZWFuKCJpbmNyZW1lbnRhbF9iYWNrdXBzIikpOworCisgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxDb2x1bW5NZXRhZGF0YT4gZmV0Y2hDb2x1bW5zKFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlLCBUeXBlcyB0eXBlcykKKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENvbHVtbk1ldGFkYXRhPiBmZXRjaENvbHVtbnMoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUsIFR5cGVzIHR5cGVzLCBVc2VyRnVuY3Rpb25zIGZ1bmN0aW9ucykKICAgICB7CiAgICAgICAgIFN0cmluZyBxdWVyeSA9IGZvcm1hdCgiU0VMRUNUICogRlJPTSAlcy4lcyBXSEVSRSBrZXlzcGFjZV9uYW1lID0gPyBBTkQgdGFibGVfbmFtZSA9ID8iLCBTY2hlbWFDb25zdGFudHMuU0NIRU1BX0tFWVNQQUNFX05BTUUsIENPTFVNTlMpOwogICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IGNvbHVtblJvd3MgPSBxdWVyeShxdWVyeSwga2V5c3BhY2UsIHRhYmxlKTsKQEAgLTk4Nyw3ICsxMDgyLDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQ29sdW1ucygiQ29sdW1ucyBub3QgZm91bmQgaW4gc2NoZW1hIHRhYmxlIGZvciAiICsga2V5c3BhY2UgKyAnLicgKyB0YWJsZSk7CiAKICAgICAgICAgTGlzdDxDb2x1bW5NZXRhZGF0YT4gY29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBjb2x1bW5Sb3dzLmZvckVhY2gocm93IC0+IGNvbHVtbnMuYWRkKGNyZWF0ZUNvbHVtbkZyb21Sb3cocm93LCB0eXBlcykpKTsKKyAgICAgICAgY29sdW1uUm93cy5mb3JFYWNoKHJvdyAtPiBjb2x1bW5zLmFkZChjcmVhdGVDb2x1bW5Gcm9tUm93KHJvdywgdHlwZXMsIGZ1bmN0aW9ucykpKTsKIAogICAgICAgICBpZiAoY29sdW1ucy5zdHJlYW0oKS5ub25lTWF0Y2goQ29sdW1uTWV0YWRhdGE6OmlzUGFydGl0aW9uS2V5KSkKICAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQ29sdW1ucygiTm8gcGFydGl0aW9uIGtleSBjb2x1bW5zIGZvdW5kIGluIHNjaGVtYSB0YWJsZSBmb3IgIiArIGtleXNwYWNlICsgIi4iICsgdGFibGUpOwpAQCAtOTk2LDcgKzEwOTEsNyBAQAogICAgIH0KIAogICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHN0YXRpYyBDb2x1bW5NZXRhZGF0YSBjcmVhdGVDb2x1bW5Gcm9tUm93KFVudHlwZWRSZXN1bHRTZXQuUm93IHJvdywgVHlwZXMgdHlwZXMpCisgICAgcHVibGljIHN0YXRpYyBDb2x1bW5NZXRhZGF0YSBjcmVhdGVDb2x1bW5Gcm9tUm93KFVudHlwZWRSZXN1bHRTZXQuUm93IHJvdywgVHlwZXMgdHlwZXMsIFVzZXJGdW5jdGlvbnMgZnVuY3Rpb25zKQogICAgIHsKICAgICAgICAgU3RyaW5nIGtleXNwYWNlID0gcm93LmdldFN0cmluZygia2V5c3BhY2VfbmFtZSIpOwogICAgICAgICBTdHJpbmcgdGFibGUgPSByb3cuZ2V0U3RyaW5nKCJ0YWJsZV9uYW1lIik7CkBAIC0xMDEyLDcgKzExMDcsNTMgQEAKIAogICAgICAgICBDb2x1bW5JZGVudGlmaWVyIG5hbWUgPSBuZXcgQ29sdW1uSWRlbnRpZmllcihyb3cuZ2V0Qnl0ZXMoImNvbHVtbl9uYW1lX2J5dGVzIiksIHJvdy5nZXRTdHJpbmcoImNvbHVtbl9uYW1lIikpOwogCi0gICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoa2V5c3BhY2UsIHRhYmxlLCBuYW1lLCB0eXBlLCBwb3NpdGlvbiwga2luZCk7CisgICAgICAgIENvbHVtbk1hc2sgbWFzayA9IG51bGw7CisgICAgICAgIFN0cmluZyBxdWVyeSA9IGZvcm1hdCgiU0VMRUNUICogRlJPTSAlcy4lcyBXSEVSRSBrZXlzcGFjZV9uYW1lID0gPyBBTkQgdGFibGVfbmFtZSA9ID8gQU5EIGNvbHVtbl9uYW1lID0gPyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb25zdGFudHMuU0NIRU1BX0tFWVNQQUNFX05BTUUsIENPTFVNTl9NQVNLUyk7CisgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgY29sdW1uTWFza3MgPSBxdWVyeShxdWVyeSwga2V5c3BhY2UsIHRhYmxlLCBuYW1lLnRvU3RyaW5nKCkpOworICAgICAgICBpZiAoIWNvbHVtbk1hc2tzLmlzRW1wdHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgVW50eXBlZFJlc3VsdFNldC5Sb3cgbWFza1JvdyA9IGNvbHVtbk1hc2tzLm9uZSgpOworICAgICAgICAgICAgRnVuY3Rpb25OYW1lIGZ1bmN0aW9uTmFtZSA9IG5ldyBGdW5jdGlvbk5hbWUobWFza1Jvdy5nZXRTdHJpbmcoImZ1bmN0aW9uX2tleXNwYWNlIiksIG1hc2tSb3cuZ2V0U3RyaW5nKCJmdW5jdGlvbl9uYW1lIikpOworCisgICAgICAgICAgICBMaXN0PFN0cmluZz4gcGFydGlhbEFyZ3VtZW50VHlwZXMgPSBtYXNrUm93LmdldEZyb3plbkxpc3QoImZ1bmN0aW9uX2FyZ3VtZW50X3R5cGVzIiwgVVRGOFR5cGUuaW5zdGFuY2UpOworICAgICAgICAgICAgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ3VtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PD4oMSArIHBhcnRpYWxBcmd1bWVudFR5cGVzLnNpemUoKSk7CisgICAgICAgICAgICBhcmd1bWVudFR5cGVzLmFkZCh0eXBlKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGFyZ3VtZW50VHlwZSA6IHBhcnRpYWxBcmd1bWVudFR5cGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFyZ3VtZW50VHlwZXMuYWRkKENRTFR5cGVQYXJzZXIucGFyc2Uoa2V5c3BhY2UsIGFyZ3VtZW50VHlwZSwgdHlwZXMpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRnVuY3Rpb24gZnVuY3Rpb24gPSBGdW5jdGlvblJlc29sdmVyLmdldChrZXlzcGFjZSwgZnVuY3Rpb25OYW1lLCBhcmd1bWVudFR5cGVzLCBudWxsLCBudWxsLCBudWxsLCBmdW5jdGlvbnMpOworICAgICAgICAgICAgaWYgKGZ1bmN0aW9uID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGZvcm1hdCgiVW5hYmxlIHRvIGZpbmQgbWFza2luZyBmdW5jdGlvbiAlcyglcykgZm9yIGNvbHVtbiAlcy4lcy4lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbk5hbWUsIGFyZ3VtZW50VHlwZXMsIGtleXNwYWNlLCB0YWJsZSwgbmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIShmdW5jdGlvbiBpbnN0YW5jZW9mIFNjYWxhckZ1bmN0aW9uKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZm9ybWF0KCJDb2x1bW4gJXMuJXMuJXMgaXMgdW5leHBlY3RlZGx5IG1hc2tlZCB3aXRoIGZ1bmN0aW9uICVzICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndoaWNoIGlzIG5vdCBhIHNjYWxhciBtYXNraW5nIGZ1bmN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXNwYWNlLCB0YWJsZSwgbmFtZSwgZnVuY3Rpb24pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU29tZSBhcmd1bWVudHMgb2YgdGhlIG1hc2tpbmcgZnVuY3Rpb24gY2FuIGJlIG51bGwsIGJ1dCB0aGUgQ1FMJ3MgbGlzdCB0eXBlIHRoYXQgc3RvcmVzIHRoZW0gZG9lc24ndAorICAgICAgICAgICAgLy8gYWNjZXB0IG51bGxzLCBzbyB3ZSB1c2UgYSBwYXJhbGxlbCBsaXN0IG9mIGJvb2xlYW5zIHRvIHN0b3JlIHdoYXQgYXJndW1lbnRzIGFyZSBudWxsLgorICAgICAgICAgICAgTGlzdDxCb29sZWFuPiBudWxscyA9IG1hc2tSb3cuZ2V0RnJvemVuTGlzdCgiZnVuY3Rpb25fYXJndW1lbnRfbnVsbHMiLCBCb29sZWFuVHlwZS5pbnN0YW5jZSk7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWVzQXNDUUwgPSBtYXNrUm93LmdldEZyb3plbkxpc3QoImZ1bmN0aW9uX2FyZ3VtZW50X3ZhbHVlcyIsIFVURjhUeXBlLmluc3RhbmNlKTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXJbXSB2YWx1ZXMgPSBuZXcgQnl0ZUJ1ZmZlclt2YWx1ZXNBc0NRTC5zaXplKCldOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXNBc0NRTC5zaXplKCk7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobnVsbHMuZ2V0KGkpKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBudWxsOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gYXJndW1lbnRUeXBlcy5nZXQoaSArIDEpLmZyb21TdHJpbmcodmFsdWVzQXNDUUwuZ2V0KGkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWFzayA9IENvbHVtbk1hc2suYnVpbGQoKFNjYWxhckZ1bmN0aW9uKSBmdW5jdGlvbiwgdmFsdWVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoa2V5c3BhY2UsIHRhYmxlLCBuYW1lLCB0eXBlLCBwb3NpdGlvbiwga2luZCwgbWFzayk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPEJ5dGVCdWZmZXIsIERyb3BwZWRDb2x1bW4+IGZldGNoRHJvcHBlZENvbHVtbnMoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUpCkBAIC0xMDQ0LDcgKzExODUsNyBAQAogICAgICAgICBhc3NlcnQga2luZCA9PSBDb2x1bW5NZXRhZGF0YS5LaW5kLlJFR1VMQVIgfHwga2luZCA9PSBDb2x1bW5NZXRhZGF0YS5LaW5kLlNUQVRJQwogICAgICAgICAgICAgOiAiVW5leHBlY3RlZCBkcm9wcGVkIGNvbHVtbiBraW5kOiAiICsga2luZDsKIAotICAgICAgICBDb2x1bW5NZXRhZGF0YSBjb2x1bW4gPSBuZXcgQ29sdW1uTWV0YWRhdGEoa2V5c3BhY2UsIHRhYmxlLCBDb2x1bW5JZGVudGlmaWVyLmdldEludGVybmVkKG5hbWUsIHRydWUpLCB0eXBlLCBDb2x1bW5NZXRhZGF0YS5OT19QT1NJVElPTiwga2luZCk7CisgICAgICAgIENvbHVtbk1ldGFkYXRhIGNvbHVtbiA9IG5ldyBDb2x1bW5NZXRhZGF0YShrZXlzcGFjZSwgdGFibGUsIENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQobmFtZSwgdHJ1ZSksIHR5cGUsIENvbHVtbk1ldGFkYXRhLk5PX1BPU0lUSU9OLCBraW5kLCBudWxsKTsKICAgICAgICAgbG9uZyBkcm9wcGVkVGltZSA9IFRpbWVVbml0Lk1JTExJU0VDT05EUy50b01pY3Jvcyhyb3cuZ2V0TG9uZygiZHJvcHBlZF90aW1lIikpOwogICAgICAgICByZXR1cm4gbmV3IERyb3BwZWRDb2x1bW4oY29sdW1uLCBkcm9wcGVkVGltZSk7CiAgICAgfQpAQCAtMTA4MCwxNyArMTIyMSwxNyBAQAogICAgICAgICByZXR1cm4gbmV3IFRyaWdnZXJNZXRhZGF0YShuYW1lLCBjbGFzc09wdGlvbik7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgVmlld3MgZmV0Y2hWaWV3cyhTdHJpbmcga2V5c3BhY2VOYW1lLCBUeXBlcyB0eXBlcykKKyAgICBwcml2YXRlIHN0YXRpYyBWaWV3cyBmZXRjaFZpZXdzKFN0cmluZyBrZXlzcGFjZU5hbWUsIFR5cGVzIHR5cGVzLCBVc2VyRnVuY3Rpb25zIGZ1bmN0aW9ucykKICAgICB7CiAgICAgICAgIFN0cmluZyBxdWVyeSA9IGZvcm1hdCgiU0VMRUNUIHZpZXdfbmFtZSBGUk9NICVzLiVzIFdIRVJFIGtleXNwYWNlX25hbWUgPSA/IiwgU2NoZW1hQ29uc3RhbnRzLlNDSEVNQV9LRVlTUEFDRV9OQU1FLCBWSUVXUyk7CiAKICAgICAgICAgVmlld3MuQnVpbGRlciB2aWV3cyA9IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5WaWV3cy5idWlsZGVyKCk7CiAgICAgICAgIGZvciAoVW50eXBlZFJlc3VsdFNldC5Sb3cgcm93IDogcXVlcnkocXVlcnksIGtleXNwYWNlTmFtZSkpCi0gICAgICAgICAgICB2aWV3cy5wdXQoZmV0Y2hWaWV3KGtleXNwYWNlTmFtZSwgcm93LmdldFN0cmluZygidmlld19uYW1lIiksIHR5cGVzKSk7CisgICAgICAgICAgICB2aWV3cy5wdXQoZmV0Y2hWaWV3KGtleXNwYWNlTmFtZSwgcm93LmdldFN0cmluZygidmlld19uYW1lIiksIHR5cGVzLCBmdW5jdGlvbnMpKTsKICAgICAgICAgcmV0dXJuIHZpZXdzLmJ1aWxkKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgVmlld01ldGFkYXRhIGZldGNoVmlldyhTdHJpbmcga2V5c3BhY2VOYW1lLCBTdHJpbmcgdmlld05hbWUsIFR5cGVzIHR5cGVzKQorICAgIHByaXZhdGUgc3RhdGljIFZpZXdNZXRhZGF0YSBmZXRjaFZpZXcoU3RyaW5nIGtleXNwYWNlTmFtZSwgU3RyaW5nIHZpZXdOYW1lLCBUeXBlcyB0eXBlcywgVXNlckZ1bmN0aW9ucyBmdW5jdGlvbnMpCiAgICAgewogICAgICAgICBTdHJpbmcgcXVlcnkgPSBTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgKiBGUk9NICVzLiVzIFdIRVJFIGtleXNwYWNlX25hbWUgPSA/IEFORCB2aWV3X25hbWUgPSA/IiwgU2NoZW1hQ29uc3RhbnRzLlNDSEVNQV9LRVlTUEFDRV9OQU1FLCBWSUVXUyk7CiAgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcm93cyA9IHF1ZXJ5KHF1ZXJ5LCBrZXlzcGFjZU5hbWUsIHZpZXdOYW1lKTsKQEAgLTExMDMsNyArMTI0NCw3IEBACiAgICAgICAgIGJvb2xlYW4gaW5jbHVkZUFsbCA9IHJvdy5nZXRCb29sZWFuKCJpbmNsdWRlX2FsbF9jb2x1bW5zIik7CiAgICAgICAgIFN0cmluZyB3aGVyZUNsYXVzZVN0cmluZyA9IHJvdy5nZXRTdHJpbmcoIndoZXJlX2NsYXVzZSIpOwogCi0gICAgICAgIExpc3Q8Q29sdW1uTWV0YWRhdGE+IGNvbHVtbnMgPSBmZXRjaENvbHVtbnMoa2V5c3BhY2VOYW1lLCB2aWV3TmFtZSwgdHlwZXMpOworICAgICAgICBMaXN0PENvbHVtbk1ldGFkYXRhPiBjb2x1bW5zID0gZmV0Y2hDb2x1bW5zKGtleXNwYWNlTmFtZSwgdmlld05hbWUsIHR5cGVzLCBmdW5jdGlvbnMpOwogCiAgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEgPQogICAgICAgICAgICAgVGFibGVNZXRhZGF0YS5idWlsZGVyKGtleXNwYWNlTmFtZSwgdmlld05hbWUsIFRhYmxlSWQuZnJvbVVVSUQocm93LmdldFVVSUQoImlkIikpKQpAQCAtMTEyNywxMiArMTI2OCwxMiBAQAogICAgICAgICByZXR1cm4gbmV3IFZpZXdNZXRhZGF0YShiYXNlVGFibGVJZCwgYmFzZVRhYmxlTmFtZSwgaW5jbHVkZUFsbCwgd2hlcmVDbGF1c2UsIG1ldGFkYXRhKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBGdW5jdGlvbnMgZmV0Y2hGdW5jdGlvbnMoU3RyaW5nIGtleXNwYWNlTmFtZSwgVHlwZXMgdHlwZXMpCisgICAgcHJpdmF0ZSBzdGF0aWMgVXNlckZ1bmN0aW9ucyBmZXRjaEZ1bmN0aW9ucyhTdHJpbmcga2V5c3BhY2VOYW1lLCBUeXBlcyB0eXBlcykKICAgICB7CiAgICAgICAgIENvbGxlY3Rpb248VURGdW5jdGlvbj4gdWRmcyA9IGZldGNoVURGcyhrZXlzcGFjZU5hbWUsIHR5cGVzKTsKICAgICAgICAgQ29sbGVjdGlvbjxVREFnZ3JlZ2F0ZT4gdWRhcyA9IGZldGNoVURBcyhrZXlzcGFjZU5hbWUsIHVkZnMsIHR5cGVzKTsKIAotICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkZ1bmN0aW9ucy5idWlsZGVyKCkuYWRkKHVkZnMpLmFkZCh1ZGFzKS5idWlsZCgpOworICAgICAgICByZXR1cm4gVXNlckZ1bmN0aW9ucy5idWlsZGVyKCkuYWRkKHVkZnMpLmFkZCh1ZGFzKS5idWlsZCgpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248VURGdW5jdGlvbj4gZmV0Y2hVREZzKFN0cmluZyBrZXlzcGFjZU5hbWUsIFR5cGVzIHR5cGVzKQpAQCAtMTE2OSw3ICsxMzEwLDcgQEAKICAgICAgICAgICogVE9ETzogZmluZCBhIHdheSB0byBnZXQgcmlkIG9mIFNjaGVtYS5pbnN0YW5jZSBkZXBlbmRlbmN5OyBldmFsdWF0ZSBpZiB0aGUgb3BpbWlzYXRpb24gYmVsb3cgbWFrZXMgYSBkaWZmZXJlbmNlCiAgICAgICAgICAqIGluIHRoZSBmaXJzdCBwbGFjZS4gUmVtb3ZlIGlmIGl0IGlzbid0LgogICAgICAgICAgKi8KLSAgICAgICAgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb24gZXhpc3RpbmcgPSBTY2hlbWEuaW5zdGFuY2UuZmluZEZ1bmN0aW9uKG5hbWUsIGFyZ1R5cGVzKS5vckVsc2UobnVsbCk7CisgICAgICAgIFVzZXJGdW5jdGlvbiBleGlzdGluZyA9IFNjaGVtYS5pbnN0YW5jZS5maW5kVXNlckZ1bmN0aW9uKG5hbWUsIGFyZ1R5cGVzKS5vckVsc2UobnVsbCk7CiAgICAgICAgIGlmIChleGlzdGluZyBpbnN0YW5jZW9mIFVERnVuY3Rpb24pCiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIFRoaXMgY2hlY2sgcHJldmVudHMgZHVwbGljYXRlIGNvbXBpbGF0aW9uIG9mIGVmZmVjdGl2ZWx5IHRoZSBzYW1lIFVERi4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9TY2hlbWFLZXlzcGFjZVRhYmxlcy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYUtleXNwYWNlVGFibGVzLmphdmEKaW5kZXggYzAwYTRmNy4uM2ZjOWM4YiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYUtleXNwYWNlVGFibGVzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYUtleXNwYWNlVGFibGVzLmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTUEFDRVMgPSAia2V5c3BhY2VzIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRVMgPSAidGFibGVzIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5TID0gImNvbHVtbnMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9NQVNLUyA9ICJjb2x1bW5fbWFza3MiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERST1BQRURfQ09MVU1OUyA9ICJkcm9wcGVkX2NvbHVtbnMiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSUdHRVJTID0gInRyaWdnZXJzIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXUyA9ICJ2aWV3cyI7CkBAIC00NSw3ICs0Niw4IEBACiAgICAgICoKICAgICAgKiBTZWUgQ0FTU0FORFJBLTEyMjEzIGZvciBtb3JlIGRldGFpbHMuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbW11dGFibGVMaXN0PFN0cmluZz4gQUxMID0gSW1tdXRhYmxlTGlzdC5vZihDT0xVTU5TLAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1tdXRhYmxlTGlzdDxTdHJpbmc+IEFMTCA9IEltbXV0YWJsZUxpc3Qub2YoQ09MVU1OX01BU0tTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERST1BQRURfQ09MVU1OUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSSUdHRVJTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRVMsCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvU2NoZW1hVXBkYXRlSGFuZGxlckZhY3RvcnlQcm92aWRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYVVwZGF0ZUhhbmRsZXJGYWN0b3J5UHJvdmlkZXIuamF2YQppbmRleCA5NDExYTkyLi42M2QxNzBhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvU2NoZW1hVXBkYXRlSGFuZGxlckZhY3RvcnlQcm92aWRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9TY2hlbWFVcGRhdGVIYW5kbGVyRmFjdG9yeVByb3ZpZGVyLmphdmEKQEAgLTI1LDEyICsyNSwxNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlNDSEVNQV9VUERBVEVfSEFORExFUl9GQUNUT1JZX0NMQVNTOworCiAvKioKLSAqIFByb3ZpZGVzIHRoZSBpbnN0YW5jZSBvZiBTY2hlbWFVcGRhdGVIYW5kbGVyIGZhY3RvcnkgcG9pbnRlZCBieSB7QGxpbmsgI1NVSF9GQUNUT1JZX0NMQVNTX1BST1BFUlRZfSBzeXN0ZW0gcHJvcGVydHkuCisgKiBQcm92aWRlcyB0aGUgaW5zdGFuY2Ugb2YgU2NoZW1hVXBkYXRlSGFuZGxlciBmYWN0b3J5IHBvaW50ZWQgYnkKKyAqIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzI1NDSEVNQV9VUERBVEVfSEFORExFUl9GQUNUT1JZX0NMQVNTfSBzeXN0ZW0gcHJvcGVydHkuCiAgKiBJZiB0aGUgcHJvcGVydHkgaXMgbm90IGRlZmluZWQsIHRoZSBkZWZhdWx0IGZhY3Rvcnkge0BsaW5rIERlZmF1bHRTY2hlbWFVcGRhdGVIYW5kbGVyfSBpbnN0YW5jZSBpcyByZXR1cm5lZC4KICAqLwogcHVibGljIGNsYXNzIFNjaGVtYVVwZGF0ZUhhbmRsZXJGYWN0b3J5UHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlcjxTY2hlbWFVcGRhdGVIYW5kbGVyRmFjdG9yeT4KIHsKKyAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TQ0hFTUFfVVBEQVRFX0hBTkRMRVJfRkFDVE9SWV9DTEFTUyBpbnN0ZWFkLiAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VIX0ZBQ1RPUllfQ0xBU1NfUFJPUEVSVFkgPSAiY2Fzc2FuZHJhLnNjaGVtYS51cGRhdGVfaGFuZGxlcl9mYWN0b3J5LmNsYXNzIjsKIAogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU2NoZW1hVXBkYXRlSGFuZGxlckZhY3RvcnlQcm92aWRlciBpbnN0YW5jZSA9IG5ldyBTY2hlbWFVcGRhdGVIYW5kbGVyRmFjdG9yeVByb3ZpZGVyKCk7CkBAIC0zOCw3ICs0Myw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFNjaGVtYVVwZGF0ZUhhbmRsZXJGYWN0b3J5IGdldCgpCiAgICAgewotICAgICAgICBTdHJpbmcgc3VoRmFjdG9yeUNsYXNzTmFtZSA9IFN0cmluZ1V0aWxzLnRyaW1Ub051bGwoU3lzdGVtLmdldFByb3BlcnR5KFNVSF9GQUNUT1JZX0NMQVNTX1BST1BFUlRZKSk7CisgICAgICAgIFN0cmluZyBzdWhGYWN0b3J5Q2xhc3NOYW1lID0gU3RyaW5nVXRpbHMudHJpbVRvTnVsbChTQ0hFTUFfVVBEQVRFX0hBTkRMRVJfRkFDVE9SWV9DTEFTUy5nZXRTdHJpbmcoKSk7CiAgICAgICAgIGlmIChzdWhGYWN0b3J5Q2xhc3NOYW1lID09IG51bGwpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBEZWZhdWx0U2NoZW1hVXBkYXRlSGFuZGxlckZhY3RvcnkuaW5zdGFuY2U7CkBAIC01Myw3ICs1OCw3IEBACiAgICAgICAgICAgICBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB8IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiRmFpbGVkIHRvIGluaXRpYWxpemUgc2NoZW1hIHVwZGF0ZSBoYW5kbGVyIGZhY3RvcnkgY2xhc3MgJXMgZGVmaW5lZCBpbiAlcyBzeXN0ZW0gcHJvcGVydHkuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1aEZhY3RvcnlDbGFzc05hbWUsIFNVSF9GQUNUT1JZX0NMQVNTX1BST1BFUlRZKSwgZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VoRmFjdG9yeUNsYXNzTmFtZSwgU0NIRU1BX1VQREFURV9IQU5ETEVSX0ZBQ1RPUllfQ0xBU1MuZ2V0S2V5KCkpLCBleCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvU3lzdGVtRGlzdHJpYnV0ZWRLZXlzcGFjZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1N5c3RlbURpc3RyaWJ1dGVkS2V5c3BhY2UuamF2YQppbmRleCBkYzQwMDkzLi5jMTFiMmM0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvU3lzdGVtRGlzdHJpYnV0ZWRLZXlzcGFjZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9TeXN0ZW1EaXN0cmlidXRlZEtleXNwYWNlLmphdmEKQEAgLTE3NCw3ICsxNzQsNyBAQAogICAgIHsKICAgICAgICAgQ29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+IHJhbmdlcyA9IG9wdGlvbnMuZ2V0UmFuZ2VzKCk7CiAgICAgICAgIFN0cmluZyBxdWVyeSA9ICJJTlNFUlQgSU5UTyAlcy4lcyAocGFyZW50X2lkLCBrZXlzcGFjZV9uYW1lLCBjb2x1bW5mYW1pbHlfbmFtZXMsIHJlcXVlc3RlZF9yYW5nZXMsIHN0YXJ0ZWRfYXQsICAgICAgICAgIG9wdGlvbnMpIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVkFMVUVTICglcywgICAgICAgICclcycsICAgICAgICAgIHsgJyVzJyB9LCAgICAgICAgICAgeyAnJXMnIH0sICAgICAgICAgIHRvVGltZXN0YW1wKG5vdygpKSwgeyAlcyB9KSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFZBTFVFUyAoJXMsICAgICAgICAnJXMnLCAgICAgICAgICB7ICclcycgfSwgICAgICAgICAgIHsgJyVzJyB9LCAgICAgICAgICB0b190aW1lc3RhbXAobm93KCkpLCB7ICVzIH0pIjsKICAgICAgICAgU3RyaW5nIGZtdFFyeSA9IGZvcm1hdChxdWVyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLkRJU1RSSUJVVEVEX0tFWVNQQUNFX05BTUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkVOVF9SRVBBSVJfSElTVE9SWSwKQEAgLTIwNiw3ICsyMDYsNyBAQAogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGZhaWxQYXJlbnRSZXBhaXIoVGltZVVVSUQgcGFyZW50X2lkLCBUaHJvd2FibGUgdCkKICAgICB7Ci0gICAgICAgIFN0cmluZyBxdWVyeSA9ICJVUERBVEUgJXMuJXMgU0VUIGZpbmlzaGVkX2F0ID0gdG9UaW1lc3RhbXAobm93KCkpLCBleGNlcHRpb25fbWVzc2FnZT0/LCBleGNlcHRpb25fc3RhY2t0cmFjZT0/IFdIRVJFIHBhcmVudF9pZD0lcyI7CisgICAgICAgIFN0cmluZyBxdWVyeSA9ICJVUERBVEUgJXMuJXMgU0VUIGZpbmlzaGVkX2F0ID0gdG9fdGltZXN0YW1wKG5vdygpKSwgZXhjZXB0aW9uX21lc3NhZ2U9PywgZXhjZXB0aW9uX3N0YWNrdHJhY2U9PyBXSEVSRSBwYXJlbnRfaWQ9JXMiOwogCiAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKICAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwpAQCAtMjE4LDcgKzIxOCw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3VjY2Vzc2Z1bFBhcmVudFJlcGFpcihUaW1lVVVJRCBwYXJlbnRfaWQsIENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+PiBzdWNjZXNzZnVsUmFuZ2VzKQogICAgIHsKLSAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gIlVQREFURSAlcy4lcyBTRVQgZmluaXNoZWRfYXQgPSB0b1RpbWVzdGFtcChub3coKSksIHN1Y2Nlc3NmdWxfcmFuZ2VzID0geyclcyd9IFdIRVJFIHBhcmVudF9pZD0lcyI7CisgICAgICAgIFN0cmluZyBxdWVyeSA9ICJVUERBVEUgJXMuJXMgU0VUIGZpbmlzaGVkX2F0ID0gdG9fdGltZXN0YW1wKG5vdygpKSwgc3VjY2Vzc2Z1bF9yYW5nZXMgPSB7JyVzJ30gV0hFUkUgcGFyZW50X2lkPSVzIjsKICAgICAgICAgU3RyaW5nIGZtdFF1ZXJ5ID0gZm9ybWF0KHF1ZXJ5LCBTY2hlbWFDb25zdGFudHMuRElTVFJJQlVURURfS0VZU1BBQ0VfTkFNRSwgUEFSRU5UX1JFUEFJUl9ISVNUT1JZLCBKb2luZXIub24oIicsJyIpLmpvaW4oc3VjY2Vzc2Z1bFJhbmdlcyksIHBhcmVudF9pZC50b1N0cmluZygpKTsKICAgICAgICAgcHJvY2Vzc1NpbGVudChmbXRRdWVyeSk7CiAgICAgfQpAQCAtMjQxLDEwICsyNDEsMTAgQEAKIAogICAgICAgICBTdHJpbmcgcXVlcnkgPQogICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcy4lcyAoa2V5c3BhY2VfbmFtZSwgY29sdW1uZmFtaWx5X25hbWUsIGlkLCBwYXJlbnRfaWQsIHJhbmdlX2JlZ2luLCByYW5nZV9lbmQsIGNvb3JkaW5hdG9yLCBjb29yZGluYXRvcl9wb3J0LCBwYXJ0aWNpcGFudHMsIHBhcnRpY2lwYW50c192Miwgc3RhdHVzLCBzdGFydGVkX2F0KSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJWQUxVRVMgKCAgICclcycsICAgICAgICAgICclcycsICAgICAgICAgICAgICAlcywgJXMsICAgICAgICAnJXMnLCAgICAgICAgJyVzJywgICAgICAnJXMnLCAgICAgICAgJWQsICAgICAgICAgICAgICAgeyAnJXMnIH0sICAgICB7ICclcycgfSwgICAgICAgICclcycsICAgdG9UaW1lc3RhbXAobm93KCkpKSI7CisgICAgICAgICAgICAgICAgICAgICAgICAiVkFMVUVTICggICAnJXMnLCAgICAgICAgICAnJXMnLCAgICAgICAgICAgICAgJXMsICVzLCAgICAgICAgJyVzJywgICAgICAgICclcycsICAgICAgJyVzJywgICAgICAgICVkLCAgICAgICAgICAgICAgIHsgJyVzJyB9LCAgICAgeyAnJXMnIH0sICAgICAgICAnJXMnLCAgIHRvX3RpbWVzdGFtcChub3coKSkpIjsKICAgICAgICAgU3RyaW5nIHF1ZXJ5V2l0aG91dE5ld0NvbHVtbnMgPQogICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcy4lcyAoa2V5c3BhY2VfbmFtZSwgY29sdW1uZmFtaWx5X25hbWUsIGlkLCBwYXJlbnRfaWQsIHJhbmdlX2JlZ2luLCByYW5nZV9lbmQsIGNvb3JkaW5hdG9yLCBwYXJ0aWNpcGFudHMsIHN0YXR1cywgc3RhcnRlZF9hdCkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiVkFMVUVTICggICAnJXMnLCAgICAgICAgICAnJXMnLCAgICAgICAgICAgICAgJXMsICVzLCAgICAgICAgJyVzJywgICAgICAgICclcycsICAgICAgJyVzJywgICAgICAgICAgICAgICB7ICclcycgfSwgICAgICAgICclcycsICAgdG9UaW1lc3RhbXAobm93KCkpKSI7CisgICAgICAgICAgICAgICAgICAgICAgICAiVkFMVUVTICggICAnJXMnLCAgICAgICAgICAnJXMnLCAgICAgICAgICAgICAgJXMsICVzLCAgICAgICAgJyVzJywgICAgICAgICclcycsICAgICAgJyVzJywgICAgICAgICAgICAgICB7ICclcycgfSwgICAgICAgICclcycsICAgdG9fdGltZXN0YW1wKG5vdygpKSkiOwogCiAgICAgICAgIGZvciAoU3RyaW5nIGNmbmFtZSA6IGNmbmFtZXMpCiAgICAgICAgIHsKQEAgLTI5Miw3ICsyOTIsNyBAQAogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHN1Y2Nlc3NmdWxSZXBhaXJKb2IoVGltZVVVSUQgaWQsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZyBjZm5hbWUpCiAgICAgewotICAgICAgICBTdHJpbmcgcXVlcnkgPSAiVVBEQVRFICVzLiVzIFNFVCBzdGF0dXMgPSAnJXMnLCBmaW5pc2hlZF9hdCA9IHRvVGltZXN0YW1wKG5vdygpKSBXSEVSRSBrZXlzcGFjZV9uYW1lID0gJyVzJyBBTkQgY29sdW1uZmFtaWx5X25hbWUgPSAnJXMnIEFORCBpZCA9ICVzIjsKKyAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gIlVQREFURSAlcy4lcyBTRVQgc3RhdHVzID0gJyVzJywgZmluaXNoZWRfYXQgPSB0b190aW1lc3RhbXAobm93KCkpIFdIRVJFIGtleXNwYWNlX25hbWUgPSAnJXMnIEFORCBjb2x1bW5mYW1pbHlfbmFtZSA9ICclcycgQU5EIGlkID0gJXMiOwogICAgICAgICBTdHJpbmcgZm10UXVlcnkgPSBmb3JtYXQocXVlcnksIFNjaGVtYUNvbnN0YW50cy5ESVNUUklCVVRFRF9LRVlTUEFDRV9OQU1FLCBSRVBBSVJfSElTVE9SWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBhaXJTdGF0ZS5TVUNDRVNTLnRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c3BhY2VOYW1lLApAQCAtMzAzLDcgKzMwMyw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmFpbGVkUmVwYWlySm9iKFRpbWVVVUlEIGlkLCBTdHJpbmcga2V5c3BhY2VOYW1lLCBTdHJpbmcgY2ZuYW1lLCBUaHJvd2FibGUgdCkKICAgICB7Ci0gICAgICAgIFN0cmluZyBxdWVyeSA9ICJVUERBVEUgJXMuJXMgU0VUIHN0YXR1cyA9ICclcycsIGZpbmlzaGVkX2F0ID0gdG9UaW1lc3RhbXAobm93KCkpLCBleGNlcHRpb25fbWVzc2FnZT0/LCBleGNlcHRpb25fc3RhY2t0cmFjZT0/IFdIRVJFIGtleXNwYWNlX25hbWUgPSAnJXMnIEFORCBjb2x1bW5mYW1pbHlfbmFtZSA9ICclcycgQU5EIGlkID0gJXMiOworICAgICAgICBTdHJpbmcgcXVlcnkgPSAiVVBEQVRFICVzLiVzIFNFVCBzdGF0dXMgPSAnJXMnLCBmaW5pc2hlZF9hdCA9IHRvX3RpbWVzdGFtcChub3coKSksIGV4Y2VwdGlvbl9tZXNzYWdlPT8sIGV4Y2VwdGlvbl9zdGFja3RyYWNlPT8gV0hFUkUga2V5c3BhY2VfbmFtZSA9ICclcycgQU5EIGNvbHVtbmZhbWlseV9uYW1lID0gJyVzJyBBTkQgaWQgPSAlcyI7CiAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKICAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwogICAgICAgICB0LnByaW50U3RhY2tUcmFjZShwdyk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvVGFibGVJZC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1RhYmxlSWQuamF2YQppbmRleCBmZDQ3YTQ3Li5jZWVlZWMzIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvVGFibGVJZC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9UYWJsZUlkLmphdmEKQEAgLTIwLDExICsyMCwxNSBAQAogaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0OwogaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dDsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLlVVSUQ7CiAKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLkFycmF5VXRpbHM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlELkdlbmVyYXRvci5uZXh0VGltZVVVSUQ7CiAKQEAgLTYyLDYgKzY2LDI3IEBACiAgICAgICAgIHJldHVybiBuZXcgVGFibGVJZChVVUlELmZyb21TdHJpbmcoaWRTdHJpbmcpKTsKICAgICB9CiAKKyAgICBATnVsbGFibGUKKyAgICBwdWJsaWMgc3RhdGljIFBhaXI8U3RyaW5nLCBUYWJsZUlkPiB0YWJsZU5hbWVBbmRJZEZyb21GaWxlbmFtZShTdHJpbmcgZmlsZW5hbWUpCisgICAgeworICAgICAgICBpbnQgZGFzaCA9IGZpbGVuYW1lLmxhc3RJbmRleE9mKCctJyk7CisgICAgICAgIGlmIChkYXNoIDw9IDAgfHwgZGFzaCAhPSBmaWxlbmFtZS5sZW5ndGgoKSAtIDMyIC0gMSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFRhYmxlSWQgaWQgPSBmcm9tSGV4U3RyaW5nKGZpbGVuYW1lLnN1YnN0cmluZyhkYXNoICsgMSkpOworICAgICAgICBTdHJpbmcgdGFibGVOYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKDAsIGRhc2gpOworCisgICAgICAgIHJldHVybiBQYWlyLmNyZWF0ZSh0YWJsZU5hbWUsIGlkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBUYWJsZUlkIGZyb21IZXhTdHJpbmcoU3RyaW5nIG5vbkRhc2hVVUlEKQorICAgIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBieXRlcyA9IEJ5dGVCdWZmZXJVdGlsLmhleFRvQnl0ZXMobm9uRGFzaFVVSUQpOworICAgICAgICBsb25nIG1zYiA9IGJ5dGVzLmdldExvbmcoMCk7CisgICAgICAgIGxvbmcgbHNiID0gYnl0ZXMuZ2V0TG9uZyg4KTsKKyAgICAgICAgcmV0dXJuIGZyb21VVUlEKG5ldyBVVUlEKG1zYiwgbHNiKSk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyB0aGUgVVVJRCBvZiBhIHN5c3RlbSB0YWJsZS4KICAgICAgKgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1RhYmxlTWV0YWRhdGEuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9UYWJsZU1ldGFkYXRhLmphdmEKaW5kZXggMmU5ZDUwNy4uNTNhMjJhYiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1RhYmxlTWV0YWRhdGEuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvVGFibGVNZXRhZGF0YS5qYXZhCkBAIC0xOCwxNCArMTgsMjcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hOwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuTW9yZU9iamVjdHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC4qOwotCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVDb2xsZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIApAQCAtMzQsOCArNDcsMjAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNvbHVtbklkZW50aWZpZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DcWxCdWlsZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuU2NoZW1hRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nLkNvbHVtbk1hc2s7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nQ29tcGFyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpcmVjdG9yaWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZXNUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQ29tcG9zaXRlVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkVtcHR5VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVURjhUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVXNlclR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKQEAgLTI2Myw2ICsyODgsMTEgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNJbmNyZW1lbnRhbEJhY2t1cHNFbmFibGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJhbXMuaW5jcmVtZW50YWxCYWNrdXBzOworICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGlzU3RhdGljQ29tcGFjdFRhYmxlKCkKICAgICB7CkBAIC00MTQsNiArNDQ0LDM1IEBACiAgICAgICAgIHJldHVybiAhc3RhdGljQ29sdW1ucygpLmlzRW1wdHkoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgdGFibGUgaGFzIGFueSBtYXNrZWQgY29sdW1uLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNNYXNrZWRDb2x1bW5zKCkKKyAgICB7CisgICAgICAgIGZvciAoQ29sdW1uTWV0YWRhdGEgY29sdW1uIDogY29sdW1ucy52YWx1ZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbHVtbi5pc01hc2tlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZnVuY3Rpb24gYSB1c2VyIGZ1bmN0aW9uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHRhYmxlIGhhcyBhbnkgbWFza2VkIGNvbHVtbiBkZXBlbmRpbmcgb24gdGhlIHNwZWNpZmllZCB1c2VyIGZ1bmN0aW9uLAorICAgICAqIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGRlcGVuZHNPbihGdW5jdGlvbiBmdW5jdGlvbikKKyAgICB7CisgICAgICAgIGZvciAoQ29sdW1uTWV0YWRhdGEgY29sdW1uIDogY29sdW1ucy52YWx1ZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgQ29sdW1uTWFzayBtYXNrID0gY29sdW1uLmdldE1hc2soKTsKKyAgICAgICAgICAgIGlmIChtYXNrICE9IG51bGwgJiYgbWFzay5mdW5jdGlvbi5uYW1lKCkuZXF1YWxzKGZ1bmN0aW9uLm5hbWUoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkKICAgICB7CiAgICAgICAgIGlmICghaXNOYW1lVmFsaWQoa2V5c3BhY2UpKQpAQCAtNDY5LDcgKzUyOCw3IEBACiAgICAgICAgIHJldHVybiAhY29sdW1uTmFtZS5ieXRlcy5oYXNSZW1haW5pbmcoKTsKICAgICB9CiAKLSAgICB2b2lkIHZhbGlkYXRlQ29tcGF0aWJpbGl0eShUYWJsZU1ldGFkYXRhIHByZXZpb3VzKQorICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlQ29tcGF0aWJpbGl0eShUYWJsZU1ldGFkYXRhIHByZXZpb3VzKQogICAgIHsKICAgICAgICAgaWYgKGlzSW5kZXgoKSkKICAgICAgICAgICAgIHJldHVybjsKQEAgLTc3Nyw2ICs4MzYsMTIgQEAKICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWxsb3dBdXRvU25hcHNob3QoYm9vbGVhbiB2YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhcmFtcy5hbGxvd0F1dG9TbmFwc2hvdCh2YWwpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgQnVpbGRlciBibG9vbUZpbHRlckZwQ2hhbmNlKGRvdWJsZSB2YWwpCiAgICAgICAgIHsKICAgICAgICAgICAgIHBhcmFtcy5ibG9vbUZpbHRlckZwQ2hhbmNlKHZhbCk7CkBAIC04OTcsNDQgKzk2Miw4NCBAQAogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRQYXJ0aXRpb25LZXlDb2x1bW4oU3RyaW5nIG5hbWUsIEFic3RyYWN0VHlwZSB0eXBlKQorICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRQYXJ0aXRpb25LZXlDb2x1bW4oU3RyaW5nIG5hbWUsIEFic3RyYWN0VHlwZTw/PiB0eXBlKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYWRkUGFydGl0aW9uS2V5Q29sdW1uKENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQobmFtZSwgZmFsc2UpLCB0eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBhZGRQYXJ0aXRpb25LZXlDb2x1bW4obmFtZSwgdHlwZSwgbnVsbCk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRQYXJ0aXRpb25LZXlDb2x1bW4oQ29sdW1uSWRlbnRpZmllciBuYW1lLCBBYnN0cmFjdFR5cGUgdHlwZSkKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkUGFydGl0aW9uS2V5Q29sdW1uKFN0cmluZyBuYW1lLCBBYnN0cmFjdFR5cGU8Pz4gdHlwZSwgQE51bGxhYmxlIENvbHVtbk1hc2sgbWFzaykKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGFkZENvbHVtbihuZXcgQ29sdW1uTWV0YWRhdGEoa2V5c3BhY2UsIHRoaXMubmFtZSwgbmFtZSwgdHlwZSwgcGFydGl0aW9uS2V5Q29sdW1ucy5zaXplKCksIENvbHVtbk1ldGFkYXRhLktpbmQuUEFSVElUSU9OX0tFWSkpOworICAgICAgICAgICAgcmV0dXJuIGFkZFBhcnRpdGlvbktleUNvbHVtbihDb2x1bW5JZGVudGlmaWVyLmdldEludGVybmVkKG5hbWUsIGZhbHNlKSwgdHlwZSwgbWFzayk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRDbHVzdGVyaW5nQ29sdW1uKFN0cmluZyBuYW1lLCBBYnN0cmFjdFR5cGUgdHlwZSkKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkUGFydGl0aW9uS2V5Q29sdW1uKENvbHVtbklkZW50aWZpZXIgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHR5cGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBhZGRDbHVzdGVyaW5nQ29sdW1uKENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQobmFtZSwgZmFsc2UpLCB0eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBhZGRQYXJ0aXRpb25LZXlDb2x1bW4obmFtZSwgdHlwZSwgbnVsbCk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRDbHVzdGVyaW5nQ29sdW1uKENvbHVtbklkZW50aWZpZXIgbmFtZSwgQWJzdHJhY3RUeXBlIHR5cGUpCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFBhcnRpdGlvbktleUNvbHVtbihDb2x1bW5JZGVudGlmaWVyIG5hbWUsIEFic3RyYWN0VHlwZTw/PiB0eXBlLCBATnVsbGFibGUgQ29sdW1uTWFzayBtYXNrKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYWRkQ29sdW1uKG5ldyBDb2x1bW5NZXRhZGF0YShrZXlzcGFjZSwgdGhpcy5uYW1lLCBuYW1lLCB0eXBlLCBjbHVzdGVyaW5nQ29sdW1ucy5zaXplKCksIENvbHVtbk1ldGFkYXRhLktpbmQuQ0xVU1RFUklORykpOworICAgICAgICAgICAgcmV0dXJuIGFkZENvbHVtbihuZXcgQ29sdW1uTWV0YWRhdGEoa2V5c3BhY2UsIHRoaXMubmFtZSwgbmFtZSwgdHlwZSwgcGFydGl0aW9uS2V5Q29sdW1ucy5zaXplKCksIENvbHVtbk1ldGFkYXRhLktpbmQuUEFSVElUSU9OX0tFWSwgbWFzaykpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkUmVndWxhckNvbHVtbihTdHJpbmcgbmFtZSwgQWJzdHJhY3RUeXBlIHR5cGUpCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENsdXN0ZXJpbmdDb2x1bW4oU3RyaW5nIG5hbWUsIEFic3RyYWN0VHlwZTw/PiB0eXBlKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYWRkUmVndWxhckNvbHVtbihDb2x1bW5JZGVudGlmaWVyLmdldEludGVybmVkKG5hbWUsIGZhbHNlKSwgdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gYWRkQ2x1c3RlcmluZ0NvbHVtbihuYW1lLCB0eXBlLCBudWxsKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFJlZ3VsYXJDb2x1bW4oQ29sdW1uSWRlbnRpZmllciBuYW1lLCBBYnN0cmFjdFR5cGUgdHlwZSkKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ2x1c3RlcmluZ0NvbHVtbihTdHJpbmcgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHR5cGUsIEBOdWxsYWJsZSBDb2x1bW5NYXNrIG1hc2spCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBhZGRDb2x1bW4obmV3IENvbHVtbk1ldGFkYXRhKGtleXNwYWNlLCB0aGlzLm5hbWUsIG5hbWUsIHR5cGUsIENvbHVtbk1ldGFkYXRhLk5PX1BPU0lUSU9OLCBDb2x1bW5NZXRhZGF0YS5LaW5kLlJFR1VMQVIpKTsKKyAgICAgICAgICAgIHJldHVybiBhZGRDbHVzdGVyaW5nQ29sdW1uKENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQobmFtZSwgZmFsc2UpLCB0eXBlLCBtYXNrKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFN0YXRpY0NvbHVtbihTdHJpbmcgbmFtZSwgQWJzdHJhY3RUeXBlIHR5cGUpCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENsdXN0ZXJpbmdDb2x1bW4oQ29sdW1uSWRlbnRpZmllciBuYW1lLCBBYnN0cmFjdFR5cGU8Pz4gdHlwZSkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGFkZFN0YXRpY0NvbHVtbihDb2x1bW5JZGVudGlmaWVyLmdldEludGVybmVkKG5hbWUsIGZhbHNlKSwgdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gYWRkQ2x1c3RlcmluZ0NvbHVtbihuYW1lLCB0eXBlLCBudWxsKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFN0YXRpY0NvbHVtbihDb2x1bW5JZGVudGlmaWVyIG5hbWUsIEFic3RyYWN0VHlwZSB0eXBlKQorICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRDbHVzdGVyaW5nQ29sdW1uKENvbHVtbklkZW50aWZpZXIgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHR5cGUsIEBOdWxsYWJsZSBDb2x1bW5NYXNrIG1hc2spCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBhZGRDb2x1bW4obmV3IENvbHVtbk1ldGFkYXRhKGtleXNwYWNlLCB0aGlzLm5hbWUsIG5hbWUsIHR5cGUsIENvbHVtbk1ldGFkYXRhLk5PX1BPU0lUSU9OLCBDb2x1bW5NZXRhZGF0YS5LaW5kLlNUQVRJQykpOworICAgICAgICAgICAgcmV0dXJuIGFkZENvbHVtbihuZXcgQ29sdW1uTWV0YWRhdGEoa2V5c3BhY2UsIHRoaXMubmFtZSwgbmFtZSwgdHlwZSwgY2x1c3RlcmluZ0NvbHVtbnMuc2l6ZSgpLCBDb2x1bW5NZXRhZGF0YS5LaW5kLkNMVVNURVJJTkcsIG1hc2spKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFJlZ3VsYXJDb2x1bW4oU3RyaW5nIG5hbWUsIEFic3RyYWN0VHlwZTw/PiB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYWRkUmVndWxhckNvbHVtbihuYW1lLCB0eXBlLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFJlZ3VsYXJDb2x1bW4oU3RyaW5nIG5hbWUsIEFic3RyYWN0VHlwZTw/PiB0eXBlLCBATnVsbGFibGUgQ29sdW1uTWFzayBtYXNrKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYWRkUmVndWxhckNvbHVtbihDb2x1bW5JZGVudGlmaWVyLmdldEludGVybmVkKG5hbWUsIGZhbHNlKSwgdHlwZSwgbWFzayk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRSZWd1bGFyQ29sdW1uKENvbHVtbklkZW50aWZpZXIgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhZGRSZWd1bGFyQ29sdW1uKG5hbWUsIHR5cGUsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkUmVndWxhckNvbHVtbihDb2x1bW5JZGVudGlmaWVyIG5hbWUsIEFic3RyYWN0VHlwZTw/PiB0eXBlLCBATnVsbGFibGUgQ29sdW1uTWFzayBtYXNrKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYWRkQ29sdW1uKG5ldyBDb2x1bW5NZXRhZGF0YShrZXlzcGFjZSwgdGhpcy5uYW1lLCBuYW1lLCB0eXBlLCBDb2x1bW5NZXRhZGF0YS5OT19QT1NJVElPTiwgQ29sdW1uTWV0YWRhdGEuS2luZC5SRUdVTEFSLCBtYXNrKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRTdGF0aWNDb2x1bW4oU3RyaW5nIG5hbWUsIEFic3RyYWN0VHlwZTw/PiB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYWRkU3RhdGljQ29sdW1uKG5hbWUsIHR5cGUsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkU3RhdGljQ29sdW1uKFN0cmluZyBuYW1lLCBBYnN0cmFjdFR5cGU8Pz4gdHlwZSwgQE51bGxhYmxlIENvbHVtbk1hc2sgbWFzaykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGFkZFN0YXRpY0NvbHVtbihDb2x1bW5JZGVudGlmaWVyLmdldEludGVybmVkKG5hbWUsIGZhbHNlKSwgdHlwZSwgbWFzayk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRTdGF0aWNDb2x1bW4oQ29sdW1uSWRlbnRpZmllciBuYW1lLCBBYnN0cmFjdFR5cGU8Pz4gdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGFkZFN0YXRpY0NvbHVtbihuYW1lLCB0eXBlLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFN0YXRpY0NvbHVtbihDb2x1bW5JZGVudGlmaWVyIG5hbWUsIEFic3RyYWN0VHlwZTw/PiB0eXBlLCBATnVsbGFibGUgQ29sdW1uTWFzayBtYXNrKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYWRkQ29sdW1uKG5ldyBDb2x1bW5NZXRhZGF0YShrZXlzcGFjZSwgdGhpcy5uYW1lLCBuYW1lLCB0eXBlLCBDb2x1bW5NZXRhZGF0YS5OT19QT1NJVElPTiwgQ29sdW1uTWV0YWRhdGEuS2luZC5TVEFUSUMsIG1hc2spKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENvbHVtbihDb2x1bW5NZXRhZGF0YSBjb2x1bW4pCkBAIC0xMDU5LDYgKzExNjQsMTkgQEAKICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWx0ZXJDb2x1bW5NYXNrKENvbHVtbklkZW50aWZpZXIgbmFtZSwgQE51bGxhYmxlIENvbHVtbk1hc2sgbWFzaykKKyAgICAgICAgeworICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEgY29sdW1uID0gY29sdW1ucy5nZXQobmFtZS5ieXRlcyk7CisgICAgICAgICAgICBpZiAoY29sdW1uID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBDb2x1bW5NZXRhZGF0YSBuZXdDb2x1bW4gPSBjb2x1bW4ud2l0aE5ld01hc2sobWFzayk7CisKKyAgICAgICAgICAgIHVwZGF0ZUNvbHVtbihjb2x1bW4sIG5ld0NvbHVtbik7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKICAgICAgICAgQnVpbGRlciBhbHRlckNvbHVtblR5cGUoQ29sdW1uSWRlbnRpZmllciBuYW1lLCBBYnN0cmFjdFR5cGU8Pz4gdHlwZSkKICAgICAgICAgewogICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEgY29sdW1uID0gY29sdW1ucy5nZXQobmFtZS5ieXRlcyk7CkBAIC0xMDY3LDYgKzExODUsMTMgQEAKIAogICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEgbmV3Q29sdW1uID0gY29sdW1uLndpdGhOZXdUeXBlKHR5cGUpOwogCisgICAgICAgICAgICB1cGRhdGVDb2x1bW4oY29sdW1uLCBuZXdDb2x1bW4pOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDb2x1bW4oQ29sdW1uTWV0YWRhdGEgY29sdW1uLCBDb2x1bW5NZXRhZGF0YSBuZXdDb2x1bW4pCisgICAgICAgIHsKICAgICAgICAgICAgIHN3aXRjaCAoY29sdW1uLmtpbmQpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgY2FzZSBQQVJUSVRJT05fS0VZOgpAQCAtMTA4Myw4ICsxMjA4LDYgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY29sdW1ucy5wdXQoY29sdW1uLm5hbWUuYnl0ZXMsIG5ld0NvbHVtbik7Ci0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAgICAgfQogICAgIApAQCAtMTUwOSw3ICsxNjMyLDcgQEAKICAgICAgICAgICAgICAgICBmb3IgKENvbHVtbk1ldGFkYXRhIGMgOiByZWd1bGFyQW5kU3RhdGljQ29sdW1ucykKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjLmlzU3RhdGljKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zLmFkZChuZXcgQ29sdW1uTWV0YWRhdGEoYy5rc05hbWUsIGMuY2ZOYW1lLCBjLm5hbWUsIGMudHlwZSwgLTEsIENvbHVtbk1ldGFkYXRhLktpbmQuUkVHVUxBUikpOworICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1ucy5hZGQobmV3IENvbHVtbk1ldGFkYXRhKGMua3NOYW1lLCBjLmNmTmFtZSwgYy5uYW1lLCBjLnR5cGUsIC0xLCBDb2x1bW5NZXRhZGF0YS5LaW5kLlJFR1VMQVIsIGMuZ2V0TWFzaygpKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG90aGVyQ29sdW1ucyA9IGNvbHVtbnMuaXRlcmF0b3IoKTsKICAgICAgICAgICAgIH0KQEAgLTE1OTYsNCArMTcxOSw0IEBACiAKICAgICB9CiAKLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvVGFibGVQYXJhbXMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9UYWJsZVBhcmFtcy5qYXZhCmluZGV4IDQ0MDcyOWMuLjhmODgzZjggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9UYWJsZVBhcmFtcy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9UYWJsZVBhcmFtcy5qYXZhCkBAIC0zNiwxMSArMzYsMTMgQEAKIAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTWFwOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVQYXJhbXMuT3B0aW9uLio7CiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBUYWJsZVBhcmFtcwogewogICAgIHB1YmxpYyBlbnVtIE9wdGlvbgogICAgIHsKKyAgICAgICAgQUxMT1dfQVVUT19TTkFQU0hPVCwKICAgICAgICAgQkxPT01fRklMVEVSX0ZQX0NIQU5DRSwKICAgICAgICAgQ0FDSElORywKICAgICAgICAgQ09NTUVOVCwKQEAgLTUwLDYgKzUyLDcgQEAKICAgICAgICAgREVGQVVMVF9USU1FX1RPX0xJVkUsCiAgICAgICAgIEVYVEVOU0lPTlMsCiAgICAgICAgIEdDX0dSQUNFX1NFQ09ORFMsCisgICAgICAgIElOQ1JFTUVOVEFMX0JBQ0tVUFMsCiAgICAgICAgIE1BWF9JTkRFWF9JTlRFUlZBTCwKICAgICAgICAgTUVNVEFCTEVfRkxVU0hfUEVSSU9EX0lOX01TLAogICAgICAgICBNSU5fSU5ERVhfSU5URVJWQUwsCkBAIC02Nyw5ICs3MCwxMSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY29tbWVudDsKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBhbGxvd0F1dG9TbmFwc2hvdDsKICAgICBwdWJsaWMgZmluYWwgZG91YmxlIGJsb29tRmlsdGVyRnBDaGFuY2U7CiAgICAgcHVibGljIGZpbmFsIGRvdWJsZSBjcmNDaGVja0NoYW5jZTsKICAgICBwdWJsaWMgZmluYWwgaW50IGdjR3JhY2VTZWNvbmRzOworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGluY3JlbWVudGFsQmFja3VwczsKICAgICBwdWJsaWMgZmluYWwgaW50IGRlZmF1bHRUaW1lVG9MaXZlOwogICAgIHB1YmxpYyBmaW5hbCBpbnQgbWVtdGFibGVGbHVzaFBlcmlvZEluTXM7CiAgICAgcHVibGljIGZpbmFsIGludCBtaW5JbmRleEludGVydmFsOwpAQCAtODcsMTEgKzkyLDEzIEBACiAgICAgcHJpdmF0ZSBUYWJsZVBhcmFtcyhCdWlsZGVyIGJ1aWxkZXIpCiAgICAgewogICAgICAgICBjb21tZW50ID0gYnVpbGRlci5jb21tZW50OwotICAgICAgICBibG9vbUZpbHRlckZwQ2hhbmNlID0gYnVpbGRlci5ibG9vbUZpbHRlckZwQ2hhbmNlID09IG51bGwKKyAgICAgICAgYWxsb3dBdXRvU25hcHNob3QgPSBidWlsZGVyLmFsbG93QXV0b1NuYXBzaG90OworICAgICAgICBibG9vbUZpbHRlckZwQ2hhbmNlID0gYnVpbGRlci5ibG9vbUZpbHRlckZwQ2hhbmNlID09IC0xCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBidWlsZGVyLmNvbXBhY3Rpb24uZGVmYXVsdEJsb29tRmlsdGVyRmJDaGFuY2UoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYnVpbGRlci5ibG9vbUZpbHRlckZwQ2hhbmNlOwogICAgICAgICBjcmNDaGVja0NoYW5jZSA9IGJ1aWxkZXIuY3JjQ2hlY2tDaGFuY2U7CiAgICAgICAgIGdjR3JhY2VTZWNvbmRzID0gYnVpbGRlci5nY0dyYWNlU2Vjb25kczsKKyAgICAgICAgaW5jcmVtZW50YWxCYWNrdXBzID0gYnVpbGRlci5pbmNyZW1lbnRhbEJhY2t1cHM7CiAgICAgICAgIGRlZmF1bHRUaW1lVG9MaXZlID0gYnVpbGRlci5kZWZhdWx0VGltZVRvTGl2ZTsKICAgICAgICAgbWVtdGFibGVGbHVzaFBlcmlvZEluTXMgPSBidWlsZGVyLm1lbXRhYmxlRmx1c2hQZXJpb2RJbk1zOwogICAgICAgICBtaW5JbmRleEludGVydmFsID0gYnVpbGRlci5taW5JbmRleEludGVydmFsOwpAQCAtMTE0LDcgKzEyMSw4IEBACiAKICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgYnVpbGRlcihUYWJsZVBhcmFtcyBwYXJhbXMpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5ibG9vbUZpbHRlckZwQ2hhbmNlKHBhcmFtcy5ibG9vbUZpbHRlckZwQ2hhbmNlKQorICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5hbGxvd0F1dG9TbmFwc2hvdChwYXJhbXMuYWxsb3dBdXRvU25hcHNob3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJsb29tRmlsdGVyRnBDaGFuY2UocGFyYW1zLmJsb29tRmlsdGVyRnBDaGFuY2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhY2hpbmcocGFyYW1zLmNhY2hpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbW1lbnQocGFyYW1zLmNvbW1lbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhY3Rpb24ocGFyYW1zLmNvbXBhY3Rpb24pCkBAIC0xMjMsNiArMTMxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JjQ2hlY2tDaGFuY2UocGFyYW1zLmNyY0NoZWNrQ2hhbmNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0VGltZVRvTGl2ZShwYXJhbXMuZGVmYXVsdFRpbWVUb0xpdmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdjR3JhY2VTZWNvbmRzKHBhcmFtcy5nY0dyYWNlU2Vjb25kcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5jcmVtZW50YWxCYWNrdXBzKHBhcmFtcy5pbmNyZW1lbnRhbEJhY2t1cHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heEluZGV4SW50ZXJ2YWwocGFyYW1zLm1heEluZGV4SW50ZXJ2YWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1lbXRhYmxlRmx1c2hQZXJpb2RJbk1zKHBhcmFtcy5tZW10YWJsZUZsdXNoUGVyaW9kSW5NcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWluSW5kZXhJbnRlcnZhbChwYXJhbXMubWluSW5kZXhJbnRlcnZhbCkKQEAgLTE0Nyw3ICsxNTYsNyBAQAogICAgICAgICBpZiAoYmxvb21GaWx0ZXJGcENoYW5jZSA8PSAgbWluQmxvb21GaWx0ZXJGcENoYW5jZVZhbHVlIHx8IGJsb29tRmlsdGVyRnBDaGFuY2UgPiAxKQogICAgICAgICB7CiAgICAgICAgICAgICBmYWlsKCIlcyBtdXN0IGJlIGxhcmdlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMS4wIChnb3QgJXMpIiwKLSAgICAgICAgICAgICAgICAgT3B0aW9uLkJMT09NX0ZJTFRFUl9GUF9DSEFOQ0UsCisgICAgICAgICAgICAgICAgIEJMT09NX0ZJTFRFUl9GUF9DSEFOQ0UsCiAgICAgICAgICAgICAgICAgIG1pbkJsb29tRmlsdGVyRnBDaGFuY2VWYWx1ZSwKICAgICAgICAgICAgICAgICAgYmxvb21GaWx0ZXJGcENoYW5jZSk7CiAgICAgICAgIH0KQEAgLTE1NSwzMyArMTY0LDMzIEBACiAgICAgICAgIGlmIChjcmNDaGVja0NoYW5jZSA8IDAgfHwgY3JjQ2hlY2tDaGFuY2UgPiAxLjApCiAgICAgICAgIHsKICAgICAgICAgICAgIGZhaWwoIiVzIG11c3QgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gMCBhbmQgc21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIDEuMCAoZ290ICVzKSIsCi0gICAgICAgICAgICAgICAgIE9wdGlvbi5DUkNfQ0hFQ0tfQ0hBTkNFLAorICAgICAgICAgICAgICAgICBDUkNfQ0hFQ0tfQ0hBTkNFLAogICAgICAgICAgICAgICAgICBjcmNDaGVja0NoYW5jZSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZGVmYXVsdFRpbWVUb0xpdmUgPCAwKQotICAgICAgICAgICAgZmFpbCgiJXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCAoZ290ICVzKSIsIE9wdGlvbi5ERUZBVUxUX1RJTUVfVE9fTElWRSwgZGVmYXVsdFRpbWVUb0xpdmUpOworICAgICAgICAgICAgZmFpbCgiJXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCAoZ290ICVzKSIsIERFRkFVTFRfVElNRV9UT19MSVZFLCBkZWZhdWx0VGltZVRvTGl2ZSk7CiAKICAgICAgICAgaWYgKGRlZmF1bHRUaW1lVG9MaXZlID4gQXR0cmlidXRlcy5NQVhfVFRMKQotICAgICAgICAgICAgZmFpbCgiJXMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJWQgKGdvdCAlcykiLCBPcHRpb24uREVGQVVMVF9USU1FX1RPX0xJVkUsIEF0dHJpYnV0ZXMuTUFYX1RUTCwgZGVmYXVsdFRpbWVUb0xpdmUpOworICAgICAgICAgICAgZmFpbCgiJXMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJWQgKGdvdCAlcykiLCBERUZBVUxUX1RJTUVfVE9fTElWRSwgQXR0cmlidXRlcy5NQVhfVFRMLCBkZWZhdWx0VGltZVRvTGl2ZSk7CiAKICAgICAgICAgaWYgKGdjR3JhY2VTZWNvbmRzIDwgMCkKLSAgICAgICAgICAgIGZhaWwoIiVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgKGdvdCAlcykiLCBPcHRpb24uR0NfR1JBQ0VfU0VDT05EUywgZ2NHcmFjZVNlY29uZHMpOworICAgICAgICAgICAgZmFpbCgiJXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCAoZ290ICVzKSIsIEdDX0dSQUNFX1NFQ09ORFMsIGdjR3JhY2VTZWNvbmRzKTsKIAogICAgICAgICBpZiAobWluSW5kZXhJbnRlcnZhbCA8IDEpCi0gICAgICAgICAgICBmYWlsKCIlcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxIChnb3QgJXMpIiwgT3B0aW9uLk1JTl9JTkRFWF9JTlRFUlZBTCwgbWluSW5kZXhJbnRlcnZhbCk7CisgICAgICAgICAgICBmYWlsKCIlcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxIChnb3QgJXMpIiwgTUlOX0lOREVYX0lOVEVSVkFMLCBtaW5JbmRleEludGVydmFsKTsKIAogICAgICAgICBpZiAobWF4SW5kZXhJbnRlcnZhbCA8IG1pbkluZGV4SW50ZXJ2YWwpCiAgICAgICAgIHsKICAgICAgICAgICAgIGZhaWwoIiVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzICglcykgKGdvdCAlcykiLAotICAgICAgICAgICAgICAgICBPcHRpb24uTUFYX0lOREVYX0lOVEVSVkFMLAotICAgICAgICAgICAgICAgICBPcHRpb24uTUlOX0lOREVYX0lOVEVSVkFMLAorICAgICAgICAgICAgICAgICBNQVhfSU5ERVhfSU5URVJWQUwsCisgICAgICAgICAgICAgICAgIE1JTl9JTkRFWF9JTlRFUlZBTCwKICAgICAgICAgICAgICAgICAgbWluSW5kZXhJbnRlcnZhbCwKICAgICAgICAgICAgICAgICAgbWF4SW5kZXhJbnRlcnZhbCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobWVtdGFibGVGbHVzaFBlcmlvZEluTXMgPCAwKQotICAgICAgICAgICAgZmFpbCgiJXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCAoZ290ICVzKSIsIE9wdGlvbi5NRU1UQUJMRV9GTFVTSF9QRVJJT0RfSU5fTVMsIG1lbXRhYmxlRmx1c2hQZXJpb2RJbk1zKTsKKyAgICAgICAgICAgIGZhaWwoIiVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgKGdvdCAlcykiLCBNRU1UQUJMRV9GTFVTSF9QRVJJT0RfSU5fTVMsIG1lbXRhYmxlRmx1c2hQZXJpb2RJbk1zKTsKIAogICAgICAgICBpZiAoY2RjICYmIG1lbXRhYmxlLmZhY3RvcnkoKS53cml0ZXNTaG91bGRTa2lwQ29tbWl0TG9nKCkpCiAgICAgICAgICAgICBmYWlsKCJDREMgY2Fubm90IHdvcmsgaWYgd3JpdGVzIHNraXAgdGhlIGNvbW1pdCBsb2cuIENoZWNrIHlvdXIgbWVtdGFibGUgY29uZmlndXJhdGlvbi4iKTsKQEAgLTIwNCw5ICsyMTMsMTIgQEAKICAgICAgICAgVGFibGVQYXJhbXMgcCA9IChUYWJsZVBhcmFtcykgbzsKIAogICAgICAgICByZXR1cm4gY29tbWVudC5lcXVhbHMocC5jb21tZW50KQorICAgICAgICAgICAgJiYgYWRkaXRpb25hbFdyaXRlUG9saWN5LmVxdWFscyhwLmFkZGl0aW9uYWxXcml0ZVBvbGljeSkKKyAgICAgICAgICAgICYmIGFsbG93QXV0b1NuYXBzaG90ID09IHAuYWxsb3dBdXRvU25hcHNob3QKICAgICAgICAgICAgICYmIGJsb29tRmlsdGVyRnBDaGFuY2UgPT0gcC5ibG9vbUZpbHRlckZwQ2hhbmNlCiAgICAgICAgICAgICAmJiBjcmNDaGVja0NoYW5jZSA9PSBwLmNyY0NoZWNrQ2hhbmNlCi0gICAgICAgICAgICAmJiBnY0dyYWNlU2Vjb25kcyA9PSBwLmdjR3JhY2VTZWNvbmRzCisgICAgICAgICAgICAmJiBnY0dyYWNlU2Vjb25kcyA9PSBwLmdjR3JhY2VTZWNvbmRzIAorICAgICAgICAgICAgJiYgaW5jcmVtZW50YWxCYWNrdXBzID09IHAuaW5jcmVtZW50YWxCYWNrdXBzCiAgICAgICAgICAgICAmJiBkZWZhdWx0VGltZVRvTGl2ZSA9PSBwLmRlZmF1bHRUaW1lVG9MaXZlCiAgICAgICAgICAgICAmJiBtZW10YWJsZUZsdXNoUGVyaW9kSW5NcyA9PSBwLm1lbXRhYmxlRmx1c2hQZXJpb2RJbk1zCiAgICAgICAgICAgICAmJiBtaW5JbmRleEludGVydmFsID09IHAubWluSW5kZXhJbnRlcnZhbApAQCAtMjI1LDkgKzIzNywxMiBAQAogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQogICAgIHsKICAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaENvZGUoY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbFdyaXRlUG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd0F1dG9TbmFwc2hvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb21GaWx0ZXJGcENoYW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JjQ2hlY2tDaGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjR3JhY2VTZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRhbEJhY2t1cHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRUaW1lVG9MaXZlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW10YWJsZUZsdXNoUGVyaW9kSW5NcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluSW5kZXhJbnRlcnZhbCwKQEAgLTI0NiwyMiArMjYxLDI1IEBACiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCiAgICAgewogICAgICAgICByZXR1cm4gTW9yZU9iamVjdHMudG9TdHJpbmdIZWxwZXIodGhpcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChPcHRpb24uQ09NTUVOVC50b1N0cmluZygpLCBjb21tZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKE9wdGlvbi5CTE9PTV9GSUxURVJfRlBfQ0hBTkNFLnRvU3RyaW5nKCksIGJsb29tRmlsdGVyRnBDaGFuY2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoT3B0aW9uLkNSQ19DSEVDS19DSEFOQ0UudG9TdHJpbmcoKSwgY3JjQ2hlY2tDaGFuY2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoT3B0aW9uLkdDX0dSQUNFX1NFQ09ORFMudG9TdHJpbmcoKSwgZ2NHcmFjZVNlY29uZHMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoT3B0aW9uLkRFRkFVTFRfVElNRV9UT19MSVZFLnRvU3RyaW5nKCksIGRlZmF1bHRUaW1lVG9MaXZlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKE9wdGlvbi5NRU1UQUJMRV9GTFVTSF9QRVJJT0RfSU5fTVMudG9TdHJpbmcoKSwgbWVtdGFibGVGbHVzaFBlcmlvZEluTXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoT3B0aW9uLk1JTl9JTkRFWF9JTlRFUlZBTC50b1N0cmluZygpLCBtaW5JbmRleEludGVydmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKE9wdGlvbi5NQVhfSU5ERVhfSU5URVJWQUwudG9TdHJpbmcoKSwgbWF4SW5kZXhJbnRlcnZhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChPcHRpb24uU1BFQ1VMQVRJVkVfUkVUUlkudG9TdHJpbmcoKSwgc3BlY3VsYXRpdmVSZXRyeSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChPcHRpb24uQ0FDSElORy50b1N0cmluZygpLCBjYWNoaW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKE9wdGlvbi5DT01QQUNUSU9OLnRvU3RyaW5nKCksIGNvbXBhY3Rpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoT3B0aW9uLkNPTVBSRVNTSU9OLnRvU3RyaW5nKCksIGNvbXByZXNzaW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKE9wdGlvbi5NRU1UQUJMRS50b1N0cmluZygpLCBtZW10YWJsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChPcHRpb24uRVhURU5TSU9OUy50b1N0cmluZygpLCBleHRlbnNpb25zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKE9wdGlvbi5DREMudG9TdHJpbmcoKSwgY2RjKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKE9wdGlvbi5SRUFEX1JFUEFJUi50b1N0cmluZygpLCByZWFkUmVwYWlyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKENPTU1FTlQudG9TdHJpbmcoKSwgY29tbWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChBRERJVElPTkFMX1dSSVRFX1BPTElDWS50b1N0cmluZygpLCBhZGRpdGlvbmFsV3JpdGVQb2xpY3kpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoQUxMT1dfQVVUT19TTkFQU0hPVC50b1N0cmluZygpLCBhbGxvd0F1dG9TbmFwc2hvdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChCTE9PTV9GSUxURVJfRlBfQ0hBTkNFLnRvU3RyaW5nKCksIGJsb29tRmlsdGVyRnBDaGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoQ1JDX0NIRUNLX0NIQU5DRS50b1N0cmluZygpLCBjcmNDaGVja0NoYW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChHQ19HUkFDRV9TRUNPTkRTLnRvU3RyaW5nKCksIGdjR3JhY2VTZWNvbmRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKERFRkFVTFRfVElNRV9UT19MSVZFLnRvU3RyaW5nKCksIGRlZmF1bHRUaW1lVG9MaXZlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKElOQ1JFTUVOVEFMX0JBQ0tVUFMudG9TdHJpbmcoKSwgaW5jcmVtZW50YWxCYWNrdXBzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKE1FTVRBQkxFX0ZMVVNIX1BFUklPRF9JTl9NUy50b1N0cmluZygpLCBtZW10YWJsZUZsdXNoUGVyaW9kSW5NcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChNSU5fSU5ERVhfSU5URVJWQUwudG9TdHJpbmcoKSwgbWluSW5kZXhJbnRlcnZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChNQVhfSU5ERVhfSU5URVJWQUwudG9TdHJpbmcoKSwgbWF4SW5kZXhJbnRlcnZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChTUEVDVUxBVElWRV9SRVRSWS50b1N0cmluZygpLCBzcGVjdWxhdGl2ZVJldHJ5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKENBQ0hJTkcudG9TdHJpbmcoKSwgY2FjaGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChDT01QQUNUSU9OLnRvU3RyaW5nKCksIGNvbXBhY3Rpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoQ09NUFJFU1NJT04udG9TdHJpbmcoKSwgY29tcHJlc3Npb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoTUVNVEFCTEUudG9TdHJpbmcoKSwgbWVtdGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoRVhURU5TSU9OUy50b1N0cmluZygpLCBleHRlbnNpb25zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKENEQy50b1N0cmluZygpLCBjZGMpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoUkVBRF9SRVBBSVIudG9TdHJpbmcoKSwgcmVhZFJlcGFpcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCk7CiAgICAgfQogCkBAIC0yNzAsNiArMjg4LDggQEAKICAgICAgICAgLy8gb3B0aW9uIG5hbWVzIHNob3VsZCBiZSBpbiBhbHBoYWJldGljYWwgb3JkZXIKICAgICAgICAgYnVpbGRlci5hcHBlbmQoImFkZGl0aW9uYWxfd3JpdGVfcG9saWN5ID0gIikuYXBwZW5kV2l0aFNpbmdsZVF1b3RlcyhhZGRpdGlvbmFsV3JpdGVQb2xpY3kudG9TdHJpbmcoKSkKICAgICAgICAgICAgICAgIC5uZXdMaW5lKCkKKyAgICAgICAgICAgICAgIC5hcHBlbmQoIkFORCBhbGxvd19hdXRvX3NuYXBzaG90ID0gIikuYXBwZW5kKGFsbG93QXV0b1NuYXBzaG90KQorICAgICAgICAgICAgICAgLm5ld0xpbmUoKQogICAgICAgICAgICAgICAgLmFwcGVuZCgiQU5EIGJsb29tX2ZpbHRlcl9mcF9jaGFuY2UgPSAiKS5hcHBlbmQoYmxvb21GaWx0ZXJGcENoYW5jZSkKICAgICAgICAgICAgICAgIC5uZXdMaW5lKCkKICAgICAgICAgICAgICAgIC5hcHBlbmQoIkFORCBjYWNoaW5nID0gIikuYXBwZW5kKGNhY2hpbmcuYXNNYXAoKSkKQEAgLTMwMSw2ICszMjEsOCBAQAogICAgICAgICAgICAgICAgLm5ld0xpbmUoKQogICAgICAgICAgICAgICAgLmFwcGVuZCgiQU5EIGdjX2dyYWNlX3NlY29uZHMgPSAiKS5hcHBlbmQoZ2NHcmFjZVNlY29uZHMpCiAgICAgICAgICAgICAgICAubmV3TGluZSgpCisgICAgICAgICAgICAgICAuYXBwZW5kKCJBTkQgaW5jcmVtZW50YWxfYmFja3VwcyA9ICIpLmFwcGVuZChpbmNyZW1lbnRhbEJhY2t1cHMpCisgICAgICAgICAgICAgICAubmV3TGluZSgpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCJBTkQgbWF4X2luZGV4X2ludGVydmFsID0gIikuYXBwZW5kKG1heEluZGV4SW50ZXJ2YWwpCiAgICAgICAgICAgICAgICAubmV3TGluZSgpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCJBTkQgbWVtdGFibGVfZmx1c2hfcGVyaW9kX2luX21zID0gIikuYXBwZW5kKG1lbXRhYmxlRmx1c2hQZXJpb2RJbk1zKQpAQCAtMzE1LDkgKzMzNywxMSBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlcgogICAgIHsKICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY29tbWVudCA9ICIiOwotICAgICAgICBwcml2YXRlIERvdWJsZSBibG9vbUZpbHRlckZwQ2hhbmNlOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gYWxsb3dBdXRvU25hcHNob3QgPSB0cnVlOworICAgICAgICBwcml2YXRlIGRvdWJsZSBibG9vbUZpbHRlckZwQ2hhbmNlID0gLTE7CiAgICAgICAgIHByaXZhdGUgZG91YmxlIGNyY0NoZWNrQ2hhbmNlID0gMS4wOwogICAgICAgICBwcml2YXRlIGludCBnY0dyYWNlU2Vjb25kcyA9IDg2NDAwMDsgLy8gMTAgZGF5cworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaW5jcmVtZW50YWxCYWNrdXBzID0gdHJ1ZTsKICAgICAgICAgcHJpdmF0ZSBpbnQgZGVmYXVsdFRpbWVUb0xpdmUgPSAwOwogICAgICAgICBwcml2YXRlIGludCBtZW10YWJsZUZsdXNoUGVyaW9kSW5NcyA9IDA7CiAgICAgICAgIHByaXZhdGUgaW50IG1pbkluZGV4SW50ZXJ2YWwgPSAxMjg7CkBAIC0zNDcsNiArMzcxLDEyIEBACiAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFsbG93QXV0b1NuYXBzaG90KGJvb2xlYW4gdmFsKQorICAgICAgICB7CisgICAgICAgICAgICBhbGxvd0F1dG9TbmFwc2hvdCA9IHZhbDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIEJ1aWxkZXIgYmxvb21GaWx0ZXJGcENoYW5jZShkb3VibGUgdmFsKQogICAgICAgICB7CiAgICAgICAgICAgICBibG9vbUZpbHRlckZwQ2hhbmNlID0gdmFsOwpAQCAtMzY1LDYgKzM5NSwxMiBAQAogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgQnVpbGRlciBpbmNyZW1lbnRhbEJhY2t1cHMoYm9vbGVhbiB2YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluY3JlbWVudGFsQmFja3VwcyA9IHZhbDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIEJ1aWxkZXIgZGVmYXVsdFRpbWVUb0xpdmUoaW50IHZhbCkKICAgICAgICAgewogICAgICAgICAgICAgZGVmYXVsdFRpbWVUb0xpdmUgPSB2YWw7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvVXNlckZ1bmN0aW9ucy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1VzZXJGdW5jdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDBjNzA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1VzZXJGdW5jdGlvbnMuamF2YQpAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuKjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Vc2VyVHlwZTsKKworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLmFueTsKKworLyoqCisgKiBBbiBpbW11dGFibGUgY29udGFpbmVyIGZvciBhIGtleXNwYWNlJ3MgVURBcyBhbmQgVURGcy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFVzZXJGdW5jdGlvbnMgaW1wbGVtZW50cyBJdGVyYWJsZTxVc2VyRnVuY3Rpb24+Cit7CisgICAgcHVibGljIGVudW0gRmlsdGVyIGltcGxlbWVudHMgUHJlZGljYXRlPFVzZXJGdW5jdGlvbj4KKyAgICB7CisgICAgICAgIEFMTCwgVURGLCBVREE7CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gdGVzdChVc2VyRnVuY3Rpb24gZnVuY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAodGhpcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFVERjogcmV0dXJuIGZ1bmN0aW9uIGluc3RhbmNlb2YgVURGdW5jdGlvbjsKKyAgICAgICAgICAgICAgICBjYXNlIFVEQTogcmV0dXJuIGZ1bmN0aW9uIGluc3RhbmNlb2YgVURBZ2dyZWdhdGU7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBJbW11dGFibGVNdWx0aW1hcDxGdW5jdGlvbk5hbWUsIFVzZXJGdW5jdGlvbj4gZnVuY3Rpb25zOworCisgICAgcHJpdmF0ZSBVc2VyRnVuY3Rpb25zKEJ1aWxkZXIgYnVpbGRlcikKKyAgICB7CisgICAgICAgIGZ1bmN0aW9ucyA9IGJ1aWxkZXIuZnVuY3Rpb25zLmJ1aWxkKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIGJ1aWxkZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBVc2VyRnVuY3Rpb25zIG5vbmUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIoKS5idWlsZCgpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvcjxVc2VyRnVuY3Rpb24+IGl0ZXJhdG9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmdW5jdGlvbnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyZWFtPFVzZXJGdW5jdGlvbj4gc3RyZWFtKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmdW5jdGlvbnMudmFsdWVzKCkuc3RyZWFtKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmdW5jdGlvbnMuc2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSBzdHJlYW0gb2Yga2V5c3BhY2UncyBVREZzCisgICAgICovCisgICAgcHVibGljIFN0cmVhbTxVREZ1bmN0aW9uPiB1ZGZzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdHJlYW0oKS5maWx0ZXIoRmlsdGVyLlVERikubWFwKGYgLT4gKFVERnVuY3Rpb24pIGYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSBzdHJlYW0gb2Yga2V5c3BhY2UncyBVREFzCisgICAgICovCisgICAgcHVibGljIFN0cmVhbTxVREFnZ3JlZ2F0ZT4gdWRhcygpCisgICAgeworICAgICAgICByZXR1cm4gc3RyZWFtKCkuZmlsdGVyKEZpbHRlci5VREEpLm1hcChmIC0+IChVREFnZ3JlZ2F0ZSkgZik7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhYmxlPFVzZXJGdW5jdGlvbj4gcmVmZXJlbmNpbmdVc2VyVHlwZShCeXRlQnVmZmVyIG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gSXRlcmFibGVzLmZpbHRlcih0aGlzLCBmIC0+IGYucmVmZXJlbmNlc1VzZXJUeXBlKG5hbWUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVXNlckZ1bmN0aW9ucyB3aXRoVXBkYXRlZFVzZXJUeXBlKFVzZXJUeXBlIHVkdCkKKyAgICB7CisgICAgICAgIGlmICghYW55KHRoaXMsIGYgLT4gZi5yZWZlcmVuY2VzVXNlclR5cGUodWR0Lm5hbWUpKSkKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIENvbGxlY3Rpb248VURGdW5jdGlvbj4gIHVkZnMgPSB1ZGZzKCkubWFwKGYgLT4gZi53aXRoVXBkYXRlZFVzZXJUeXBlKHVkdCkpLmNvbGxlY3QodG9MaXN0KCkpOworICAgICAgICBDb2xsZWN0aW9uPFVEQWdncmVnYXRlPiB1ZGFzID0gdWRhcygpLm1hcChmIC0+IGYud2l0aFVwZGF0ZWRVc2VyVHlwZSh1ZGZzLCB1ZHQpKS5jb2xsZWN0KHRvTGlzdCgpKTsKKworICAgICAgICByZXR1cm4gYnVpbGRlcigpLmFkZCh1ZGZzKS5hZGQodWRhcykuYnVpbGQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGEgc3RyZWFtIG9mIGFnZ3JlZ2F0ZXMgdGhhdCB1c2UgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGFzIGVpdGhlciBhIHN0YXRlIG9yIGEgZmluYWwgZnVuY3Rpb24KKyAgICAgKiBAcGFyYW0gZnVuY3Rpb24gdGhlIHJlZmVycmVlIGZ1bmN0aW9uCisgICAgICovCisgICAgcHVibGljIFN0cmVhbTxVREFnZ3JlZ2F0ZT4gYWdncmVnYXRlc1VzaW5nRnVuY3Rpb24oRnVuY3Rpb24gZnVuY3Rpb24pCisgICAgeworICAgICAgICByZXR1cm4gdWRhcygpLmZpbHRlcih1ZGEgLT4gdWRhLmhhc1JlZmVyZW5jZVRvKGZ1bmN0aW9uKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFsbCBmdW5jdGlvbiBvdmVybG9hZHMgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIGZ1bGx5IHF1YWxpZmllZCBmdW5jdGlvbiBuYW1lCisgICAgICogQHJldHVybiBhbiBlbXB0eSBsaXN0IGlmIHRoZSBmdW5jdGlvbiBuYW1lIGlzIG5vdCBmb3VuZDsgYSBub24tZW1wdHkgY29sbGVjdGlvbiBvZiB7QGxpbmsgRnVuY3Rpb259IG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uPFVzZXJGdW5jdGlvbj4gZ2V0KEZ1bmN0aW9uTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy5nZXQobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFsbCBVREZzIG92ZXJsb2FkcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgZnVsbHkgcXVhbGlmaWVkIGZ1bmN0aW9uIG5hbWUKKyAgICAgKiBAcmV0dXJuIGFuIGVtcHR5IGxpc3QgaWYgdGhlIGZ1bmN0aW9uIG5hbWUgaXMgbm90IGZvdW5kOyBhIG5vbi1lbXB0eSBjb2xsZWN0aW9uIG9mIHtAbGluayBVREZ1bmN0aW9ufSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxVREZ1bmN0aW9uPiBnZXRVZGZzKEZ1bmN0aW9uTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy5nZXQobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihGaWx0ZXIuVURGKQorICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmIC0+IChVREZ1bmN0aW9uKSBmKQorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFsbCBVREFzIG92ZXJsb2FkcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgZnVsbHkgcXVhbGlmaWVkIGZ1bmN0aW9uIG5hbWUKKyAgICAgKiBAcmV0dXJuIGFuIGVtcHR5IGxpc3QgaWYgdGhlIGZ1bmN0aW9uIG5hbWUgaXMgbm90IGZvdW5kOyBhIG5vbi1lbXB0eSBjb2xsZWN0aW9uIG9mIHtAbGluayBVREFnZ3JlZ2F0ZX0gb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb248VURBZ2dyZWdhdGU+IGdldFVkYXMoRnVuY3Rpb25OYW1lIG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gZnVuY3Rpb25zLmdldChuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEZpbHRlci5VREEpCisgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGYgLT4gKFVEQWdncmVnYXRlKSBmKQorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisgICAgcHVibGljIE9wdGlvbmFsPFVzZXJGdW5jdGlvbj4gZmluZChGdW5jdGlvbk5hbWUgbmFtZSwgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZpbmQobmFtZSwgYXJnVHlwZXMsIEZpbHRlci5BTEwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBmdWxseSBxdWFsaWZpZWQgZnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBhcmdUeXBlcyBmdW5jdGlvbiBhcmd1bWVudCB0eXBlcworICAgICAqIEByZXR1cm4gYW4gZW1wdHkge0BsaW5rIE9wdGlvbmFsfSBpZiB0aGUgZnVuY3Rpb24gbmFtZSBpcyBub3QgZm91bmQ7IGEgbm9uLWVtcHR5IG9wdGlvbmFsIG9mIHtAbGluayBGdW5jdGlvbn0gb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIE9wdGlvbmFsPFVzZXJGdW5jdGlvbj4gZmluZChGdW5jdGlvbk5hbWUgbmFtZSwgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzLCBGaWx0ZXIgZmlsdGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldChuYW1lKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmaWx0ZXIuYW5kKGZ1biAtPiBmdW4udHlwZXNNYXRjaChhcmdUeXBlcykpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmRBbnkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBmdW5jdGlvbnMuaXNFbXB0eSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IHR5cGVIYXNoQ29kZShBYnN0cmFjdFR5cGU8Pz4gdCkKKyAgICB7CisgICAgICAgIHJldHVybiB0LmFzQ1FMM1R5cGUoKS50b1N0cmluZygpLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgdHlwZUhhc2hDb2RlKExpc3Q8QWJzdHJhY3RUeXBlPD8+PiB0eXBlcykKKyAgICB7CisgICAgICAgIGludCBoID0gMDsKKyAgICAgICAgZm9yIChBYnN0cmFjdFR5cGU8Pz4gdHlwZSA6IHR5cGVzKQorICAgICAgICAgICAgaCA9IGggKiAzMSArIHR5cGVIYXNoQ29kZSh0eXBlKTsKKyAgICAgICAgcmV0dXJuIGg7CisgICAgfQorCisgICAgcHVibGljIFVzZXJGdW5jdGlvbnMgZmlsdGVyKFByZWRpY2F0ZTxVc2VyRnVuY3Rpb24+IHByZWRpY2F0ZSkKKyAgICB7CisgICAgICAgIEJ1aWxkZXIgYnVpbGRlciA9IGJ1aWxkZXIoKTsKKyAgICAgICAgc3RyZWFtKCkuZmlsdGVyKHByZWRpY2F0ZSkuZm9yRWFjaChidWlsZGVyOjphZGQpOworICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIEZ1bmN0aW9ucyBpbnN0YW5jZSB3aXRoIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyBVc2VyRnVuY3Rpb25zIHdpdGgoVXNlckZ1bmN0aW9uIGZ1bikKKyAgICB7CisgICAgICAgIGlmIChmaW5kKGZ1bi5uYW1lKCksIGZ1bi5hcmdUeXBlcygpKS5pc1ByZXNlbnQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiRnVuY3Rpb24gJXMgYWxyZWFkeSBleGlzdHMiLCBmdW4ubmFtZSgpKSk7CisKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIoKS5hZGQodGhpcykuYWRkKGZ1bikuYnVpbGQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgRnVuY3Rpb25zIGluc3RhbmNlIHdpdGggdGhlIGZ1bmN0aW9uIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUgYW5kIGFyZ3VtZW50IHR5cGVzIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgVXNlckZ1bmN0aW9ucyB3aXRob3V0KEZ1bmN0aW9uTmFtZSBuYW1lLCBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMpCisgICAgeworICAgICAgICBGdW5jdGlvbiBmdW4gPQorICAgICAgICAgICAgZmluZChuYW1lLCBhcmdUeXBlcykub3JFbHNlVGhyb3coKCkgLT4gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJGdW5jdGlvbiAlcyBkb2Vzbid0IGV4aXN0cyIsIG5hbWUpKSk7CisKKyAgICAgICAgcmV0dXJuIHdpdGhvdXQoZnVuKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVXNlckZ1bmN0aW9ucyB3aXRob3V0KEZ1bmN0aW9uIGZ1bmN0aW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIoKS5hZGQoSXRlcmFibGVzLmZpbHRlcih0aGlzLCBmIC0+IGYgIT0gZnVuY3Rpb24pKS5idWlsZCgpOworICAgIH0KKworICAgIHB1YmxpYyBVc2VyRnVuY3Rpb25zIHdpdGhBZGRlZE9yVXBkYXRlZChVc2VyRnVuY3Rpb24gZnVuY3Rpb24pCisgICAgeworICAgICAgICByZXR1cm4gYnVpbGRlcigpLmFkZChJdGVyYWJsZXMuZmlsdGVyKHRoaXMsIGYgLT4gIShmLm5hbWUoKS5lcXVhbHMoZnVuY3Rpb24ubmFtZSgpKSAmJiBmLnR5cGVzTWF0Y2goZnVuY3Rpb24uYXJnVHlwZXMoKSkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoZnVuY3Rpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCisgICAgeworICAgICAgICByZXR1cm4gdGhpcyA9PSBvIHx8IChvIGluc3RhbmNlb2YgVXNlckZ1bmN0aW9ucyAmJiBmdW5jdGlvbnMuZXF1YWxzKCgoVXNlckZ1bmN0aW9ucykgbykuZnVuY3Rpb25zKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpCisgICAgeworICAgICAgICByZXR1cm4gZnVuY3Rpb25zLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gZnVuY3Rpb25zLnZhbHVlcygpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyCisgICAgeworICAgICAgICBmaW5hbCBJbW11dGFibGVNdWx0aW1hcC5CdWlsZGVyPEZ1bmN0aW9uTmFtZSwgVXNlckZ1bmN0aW9uPiBmdW5jdGlvbnMgPSBuZXcgSW1tdXRhYmxlTXVsdGltYXAuQnVpbGRlcjw+KCk7CisKKyAgICAgICAgcHJpdmF0ZSBCdWlsZGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gd2UgbmVlZCBkZXRlcm1pbmlzdGljIGl0ZXJhdGlvbiBvcmRlcjsgb3RoZXJ3aXNlIEZ1bmN0aW9ucy5lcXVhbHMoKSBicmVha3MgZG93bgorICAgICAgICAgICAgZnVuY3Rpb25zLm9yZGVyVmFsdWVzQnkoQ29tcGFyYXRvci5jb21wYXJpbmdJbnQoT2JqZWN0OjpoYXNoQ29kZSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFVzZXJGdW5jdGlvbnMgYnVpbGQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFVzZXJGdW5jdGlvbnModGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGQoVXNlckZ1bmN0aW9uIGZ1bikKKyAgICAgICAgeworICAgICAgICAgICAgZnVuY3Rpb25zLnB1dChmdW4ubmFtZSgpLCBmdW4pOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGQoVXNlckZ1bmN0aW9uLi4uIGZ1bnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoVXNlckZ1bmN0aW9uIGZ1biA6IGZ1bnMpCisgICAgICAgICAgICAgICAgYWRkKGZ1bik7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZChJdGVyYWJsZTw/IGV4dGVuZHMgVXNlckZ1bmN0aW9uPiBmdW5zKQorICAgICAgICB7CisgICAgICAgICAgICBmdW5zLmZvckVhY2godGhpczo6YWRkKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgc3RhdGljIEZ1bmN0aW9uc0RpZmY8VURGdW5jdGlvbj4gdWRmc0RpZmYoVXNlckZ1bmN0aW9ucyBiZWZvcmUsIFVzZXJGdW5jdGlvbnMgYWZ0ZXIpCisgICAgeworICAgICAgICByZXR1cm4gKEZ1bmN0aW9uc0RpZmY8VURGdW5jdGlvbj4pIEZ1bmN0aW9uc0RpZmYuZGlmZihiZWZvcmUsIGFmdGVyLCBGaWx0ZXIuVURGKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBzdGF0aWMgRnVuY3Rpb25zRGlmZjxVREFnZ3JlZ2F0ZT4gdWRhc0RpZmYoVXNlckZ1bmN0aW9ucyBiZWZvcmUsIFVzZXJGdW5jdGlvbnMgYWZ0ZXIpCisgICAgeworICAgICAgICByZXR1cm4gKEZ1bmN0aW9uc0RpZmY8VURBZ2dyZWdhdGU+KSBGdW5jdGlvbnNEaWZmLmRpZmYoYmVmb3JlLCBhZnRlciwgRmlsdGVyLlVEQSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGdW5jdGlvbnNEaWZmPFQgZXh0ZW5kcyBGdW5jdGlvbj4gZXh0ZW5kcyBEaWZmPFVzZXJGdW5jdGlvbnMsIFQ+CisgICAgeworICAgICAgICBzdGF0aWMgZmluYWwgRnVuY3Rpb25zRGlmZiBOT05FID0gbmV3IEZ1bmN0aW9uc0RpZmY8PihVc2VyRnVuY3Rpb25zLm5vbmUoKSwgVXNlckZ1bmN0aW9ucy5ub25lKCksIEltbXV0YWJsZUxpc3Qub2YoKSk7CisKKyAgICAgICAgcHJpdmF0ZSBGdW5jdGlvbnNEaWZmKFVzZXJGdW5jdGlvbnMgY3JlYXRlZCwgVXNlckZ1bmN0aW9ucyBkcm9wcGVkLCBJbW11dGFibGVDb2xsZWN0aW9uPEFsdGVyZWQ8VD4+IGFsdGVyZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGNyZWF0ZWQsIGRyb3BwZWQsIGFsdGVyZWQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRnVuY3Rpb25zRGlmZiBkaWZmKFVzZXJGdW5jdGlvbnMgYmVmb3JlLCBVc2VyRnVuY3Rpb25zIGFmdGVyLCBGaWx0ZXIgZmlsdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmVmb3JlID09IGFmdGVyKQorICAgICAgICAgICAgICAgIHJldHVybiBOT05FOworCisgICAgICAgICAgICBVc2VyRnVuY3Rpb25zIGNyZWF0ZWQgPSBhZnRlci5maWx0ZXIoZmlsdGVyLmFuZChrIC0+ICFiZWZvcmUuZmluZChrLm5hbWUoKSwgay5hcmdUeXBlcygpLCBmaWx0ZXIpLmlzUHJlc2VudCgpKSk7CisgICAgICAgICAgICBVc2VyRnVuY3Rpb25zIGRyb3BwZWQgPSBiZWZvcmUuZmlsdGVyKGZpbHRlci5hbmQoayAtPiAhYWZ0ZXIuZmluZChrLm5hbWUoKSwgay5hcmdUeXBlcygpLCBmaWx0ZXIpLmlzUHJlc2VudCgpKSk7CisKKyAgICAgICAgICAgIEltbXV0YWJsZUxpc3QuQnVpbGRlcjxBbHRlcmVkPFVzZXJGdW5jdGlvbj4+IGFsdGVyZWQgPSBJbW11dGFibGVMaXN0LmJ1aWxkZXIoKTsKKyAgICAgICAgICAgIGJlZm9yZS5zdHJlYW0oKS5maWx0ZXIoZmlsdGVyKS5mb3JFYWNoKGZ1bmN0aW9uQmVmb3JlIC0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWZ0ZXIuZmluZChmdW5jdGlvbkJlZm9yZS5uYW1lKCksIGZ1bmN0aW9uQmVmb3JlLmFyZ1R5cGVzKCksIGZpbHRlcikuaWZQcmVzZW50KGZ1bmN0aW9uQWZ0ZXIgLT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQmVmb3JlLmNvbXBhcmUoZnVuY3Rpb25BZnRlcikuaWZQcmVzZW50KGtpbmQgLT4gYWx0ZXJlZC5hZGQobmV3IEFsdGVyZWQ8PihmdW5jdGlvbkJlZm9yZSwgZnVuY3Rpb25BZnRlciwga2luZCkpKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uc0RpZmY8PihjcmVhdGVkLCBkcm9wcGVkLCBhbHRlcmVkLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1ZpZXdNZXRhZGF0YS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1ZpZXdNZXRhZGF0YS5qYXZhCmluZGV4IDAwNTMyNDkuLmRmMjZhMTMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9WaWV3TWV0YWRhdGEuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvVmlld01ldGFkYXRhLmphdmEKQEAgLTIwLDEwICsyMCwxMyBAQAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOwogCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLkhhc2hDb2RlQnVpbGRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5Ub1N0cmluZ0J1aWxkZXI7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMubWFza2luZy5Db2x1bW5NYXNrOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVXNlclR5cGU7CiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBWaWV3TWV0YWRhdGEgaW1wbGVtZW50cyBTY2hlbWFFbGVtZW50CkBAIC0xNTgsNiArMTYxLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnVuYnVpbGQoKS5hZGRDb2x1bW4oY29sdW1uKS5idWlsZCgpKTsKICAgICB9CiAKKyAgICBwdWJsaWMgVmlld01ldGFkYXRhIHdpdGhOZXdDb2x1bW5NYXNrKENvbHVtbklkZW50aWZpZXIgbmFtZSwgQE51bGxhYmxlIENvbHVtbk1hc2sgbWFzaykKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVmlld01ldGFkYXRhKGJhc2VUYWJsZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlVGFibGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlQWxsQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmVDbGF1c2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnVuYnVpbGQoKS5hbHRlckNvbHVtbk1hc2sobmFtZSwgbWFzaykuYnVpbGQoKSk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgYXBwZW5kQ3FsVG8oQ3FsQnVpbGRlciBidWlsZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW50ZXJuYWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaWZOb3RFeGlzdHMpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9BYnN0cmFjdFNzbENvbnRleHRGYWN0b3J5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9BYnN0cmFjdFNzbENvbnRleHRGYWN0b3J5LmphdmEKaW5kZXggYzJlZjg1MS4uNDA2YzQ3MiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvQWJzdHJhY3RTc2xDb250ZXh0RmFjdG9yeS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0Fic3RyYWN0U3NsQ29udGV4dEZhY3RvcnkuamF2YQpAQCAtMzUsNyArMzUsOCBAQAogaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuc3NsLlNzbENvbnRleHQ7CiBpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5zc2wuU3NsQ29udGV4dEJ1aWxkZXI7CiBpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5zc2wuU3NsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkRJU0FCTEVfVENBQ1RJVkVfT1BFTlNTTDsKIAogLyoqCiAgKiBBYnN0cmFjdCBjbGFzcyBpbXBsZW1lbnRpbmcge0Bjb2RlIElTc2xDb250ZXh0RmFjb3RyeX0gdG8gcHJvdmlkZSBtb3N0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IHRoYXQgYW55CkBAIC0xMDksMTIgKzExMCwxMyBAQAogCiAgICAgLyoqCiAgICAgICogRGVydmllcyBpZiB7QGNvZGUgT3BlblNTTH0gaXMgYXZhaWxhYmxlLiBJdCBhbGxvd3MgaW4tanZtIGR0ZXN0cyB0byBkaXNhYmxlIHRjbmF0aXZlIG9wZW5zc2wgc3VwcG9ydCBieQotICAgICAqIHNldHRpbmcge0Bjb2RlIGNhc3NhbmRyYS5kaXNhYmxlX3RjYWN0aXZlX29wZW5zc2x9IHN5c3RlbSBwcm9wZXJ0eSBhcyB7QGNvZGUgdHJ1ZX0uIE90aGVyd2lzZSwgaXQgY3JlYXRlcyBhCi0gICAgICogY2lyY3VsYXIgcmVmZXJlbmNlIHRoYXQgcHJldmVudHMgdGhlIGluc3RhbmNlIGNsYXNzIGxvYWRlciBmcm9tIGJlaW5nIGdhcmJhZ2UgY29sbGVjdGVkLgorICAgICAqIHNldHRpbmcge0BsaW5rICBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzI0RJU0FCTEVfVENBQ1RJVkVfT1BFTlNTTH0KKyAgICAgKiBzeXN0ZW0gcHJvcGVydHkgYXMge0Bjb2RlIHRydWV9LiBPdGhlcndpc2UsIGl0IGNyZWF0ZXMgYSBjaXJjdWxhciByZWZlcmVuY2UgdGhhdCBwcmV2ZW50cyB0aGUgaW5zdGFuY2UKKyAgICAgKiBjbGFzcyBsb2FkZXIgZnJvbSBiZWluZyBnYXJiYWdlIGNvbGxlY3RlZC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBkZXJpdmVJZk9wZW5Tc2xBdmFpbGFibGUoKQogICAgIHsKLSAgICAgICAgaWYgKEJvb2xlYW4uZ2V0Qm9vbGVhbihDb25maWcuUFJPUEVSVFlfUFJFRklYICsgImRpc2FibGVfdGNhY3RpdmVfb3BlbnNzbCIpKQorICAgICAgICBpZiAoRElTQUJMRV9UQ0FDVElWRV9PUEVOU1NMLmdldEJvb2xlYW4oKSkKICAgICAgICAgICAgIG9wZW5Tc2xJc0F2YWlsYWJsZSA9IGZhbHNlOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBvcGVuU3NsSXNBdmFpbGFibGUgPSBPcGVuU3NsLmlzQXZhaWxhYmxlKCk7CkBAIC0xNzgsMTUgKzE4MCwxNiBAQAogICAgICAgICAgICAga2V5IGZpbGUgaW4gUEVNIGZvcm1hdCAoc2VlIHtAbGluayBTc2xDb250ZXh0QnVpbGRlciNmb3JTZXJ2ZXIoRmlsZSwgRmlsZSwgU3RyaW5nKX0pLiBIb3dldmVyLCB3ZSBhcmUKICAgICAgICAgICAgIG5vdCBzdXBwb3J0aW5nIHRoYXQgbm93IHRvIGtlZXAgdGhlIGNvbmZpZy95YW1sIEFQSSBzaW1wbGUuCiAgICAgICAgICAqLwotICAgICAgICBLZXlNYW5hZ2VyRmFjdG9yeSBrbWYgPSBidWlsZEtleU1hbmFnZXJGYWN0b3J5KCk7CiAgICAgICAgIFNzbENvbnRleHRCdWlsZGVyIGJ1aWxkZXI7CiAgICAgICAgIGlmIChzb2NrZXRUeXBlID09IFNvY2tldFR5cGUuU0VSVkVSKQogICAgICAgICB7CisgICAgICAgICAgICBLZXlNYW5hZ2VyRmFjdG9yeSBrbWYgPSBidWlsZEtleU1hbmFnZXJGYWN0b3J5KCk7CiAgICAgICAgICAgICBidWlsZGVyID0gU3NsQ29udGV4dEJ1aWxkZXIuZm9yU2VydmVyKGttZikuY2xpZW50QXV0aCh0aGlzLnJlcXVpcmVfY2xpZW50X2F1dGggPyBDbGllbnRBdXRoLlJFUVVJUkUgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50QXV0aC5OT05FKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKKyAgICAgICAgICAgIEtleU1hbmFnZXJGYWN0b3J5IGttZiA9IGJ1aWxkT3V0Ym91bmRLZXlNYW5hZ2VyRmFjdG9yeSgpOwogICAgICAgICAgICAgYnVpbGRlciA9IFNzbENvbnRleHRCdWlsZGVyLmZvckNsaWVudCgpLmtleU1hbmFnZXIoa21mKTsKICAgICAgICAgfQogCkBAIC0yNjMsNCArMjY2LDEyIEBACiAgICAgYWJzdHJhY3QgcHJvdGVjdGVkIEtleU1hbmFnZXJGYWN0b3J5IGJ1aWxkS2V5TWFuYWdlckZhY3RvcnkoKSB0aHJvd3MgU1NMRXhjZXB0aW9uOwogCiAgICAgYWJzdHJhY3QgcHJvdGVjdGVkIFRydXN0TWFuYWdlckZhY3RvcnkgYnVpbGRUcnVzdE1hbmFnZXJGYWN0b3J5KCkgdGhyb3dzIFNTTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHtAY29kZSBLZXlNYW5hZ2VyRmFjdG9yeX0gZm9yIG91dGJvdW5kIGNvbm5lY3Rpb25zLgorICAgICAqIEl0IHByb3ZpZGVzIGEgc2VwZXJhdGUga2V5c3RvcmUgZm9yIGludGVybm9kZSBtVExTIG91dGJvdW5kIGNvbm5lY3Rpb25zLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIEtleU1hbmFnZXJGYWN0b3J5fQorICAgICAqIEB0aHJvd3MgU1NMRXhjZXB0aW9uCisgICAgICovCisgICAgYWJzdHJhY3QgcHJvdGVjdGVkIEtleU1hbmFnZXJGYWN0b3J5IGJ1aWxkT3V0Ym91bmRLZXlNYW5hZ2VyRmFjdG9yeSgpIHRocm93cyBTU0xFeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9EaXNhYmxlU3NsQ29udGV4dEZhY3RvcnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0Rpc2FibGVTc2xDb250ZXh0RmFjdG9yeS5qYXZhCmluZGV4IDlkYWIwNjIuLjgwNThkMGEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0Rpc2FibGVTc2xDb250ZXh0RmFjdG9yeS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0Rpc2FibGVTc2xDb250ZXh0RmFjdG9yeS5qYXZhCkBAIC0zNywxMiArMzcsMjQgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgS2V5TWFuYWdlckZhY3RvcnkgYnVpbGRPdXRib3VuZEtleU1hbmFnZXJGYWN0b3J5KCkgdGhyb3dzIFNTTEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaGFzS2V5c3RvcmUoKQogICAgIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc091dGJvdW5kS2V5c3RvcmUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGluaXRIb3RSZWxvYWRpbmcoKSB0aHJvd3MgU1NMRXhjZXB0aW9uCiAgICAgewogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0ZpbGVCYXNlZFNzbENvbnRleHRGYWN0b3J5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9GaWxlQmFzZWRTc2xDb250ZXh0RmFjdG9yeS5qYXZhCmluZGV4IDk4NzZlYjQuLmZkZjY2OTYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0ZpbGVCYXNlZFNzbENvbnRleHRGYWN0b3J5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvRmlsZUJhc2VkU3NsQ29udGV4dEZhY3RvcnkuamF2YQpAQCAtMzIsNyArMzIsNiBAQAogaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMRXhjZXB0aW9uOwogaW1wb3J0IGphdmF4Lm5ldC5zc2wuVHJ1c3RNYW5hZ2VyRmFjdG9yeTsKIAotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlsczsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwpAQCAtNDcsMzggKzQ2LDMyIEBACiAgKiB7QGNvZGUgQ0FVVElPTjp9IFdoaWxlIHRoaXMgaXMgYSB1c2VmdWwgYWJzdHJhY3Rpb24sIHBsZWFzZSBiZSBjYXJlZnVsIGlmIHlvdSBuZWVkIHRvIG1vZGlmeSB0aGlzIGNsYXNzCiAgKiBnaXZlbiBwb3NzaWJsZSBjdXN0b20gaW1wbGVtZW50YXRpb25zIG91dCB0aGVyZSEKICAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEZpbGVCYXNlZFNzbENvbnRleHRGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTc2xDb250ZXh0RmFjdG9yeQorcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbGVCYXNlZFNzbENvbnRleHRGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTc2xDb250ZXh0RmFjdG9yeQogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihGaWxlQmFzZWRTc2xDb250ZXh0RmFjdG9yeS5jbGFzcyk7Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBwcm90ZWN0ZWQgdm9sYXRpbGUgYm9vbGVhbiBjaGVja2VkRXhwaXJ5ID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIEZpbGVCYXNlZFN0b3JlQ29udGV4dCBrZXlzdG9yZUNvbnRleHQ7CisgICAgcHJvdGVjdGVkIEZpbGVCYXNlZFN0b3JlQ29udGV4dCBvdXRib3VuZEtleXN0b3JlQ29udGV4dDsKKyAgICBwcm90ZWN0ZWQgRmlsZUJhc2VkU3RvcmVDb250ZXh0IHRydXN0U3RvcmVDb250ZXh0OwogCiAgICAgLyoqCiAgICAgICogTGlzdCBvZiBmaWxlcyB0aGF0IHRyaWdnZXIgaG90IHJlbG9hZGluZyBvZiBTU0wgY2VydGlmaWNhdGVzCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvbGF0aWxlIExpc3Q8SG90UmVsb2FkYWJsZUZpbGU+IGhvdFJlbG9hZGFibGVGaWxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCi0gICAgcHJvdGVjdGVkIFN0cmluZyBrZXlzdG9yZTsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGtleXN0b3JlX3Bhc3N3b3JkOwotICAgIHByb3RlY3RlZCBTdHJpbmcgdHJ1c3RzdG9yZTsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRydXN0c3RvcmVfcGFzc3dvcmQ7Ci0KICAgICBwdWJsaWMgRmlsZUJhc2VkU3NsQ29udGV4dEZhY3RvcnkoKQogICAgIHsKLSAgICAgICAga2V5c3RvcmUgPSAiY29uZi8ua2V5c3RvcmUiOwotICAgICAgICBrZXlzdG9yZV9wYXNzd29yZCA9ICJjYXNzYW5kcmEiOwotICAgICAgICB0cnVzdHN0b3JlID0gImNvbmYvLnRydXN0c3RvcmUiOwotICAgICAgICB0cnVzdHN0b3JlX3Bhc3N3b3JkID0gImNhc3NhbmRyYSI7CisgICAgICAgIGtleXN0b3JlQ29udGV4dCA9IG5ldyBGaWxlQmFzZWRTdG9yZUNvbnRleHQoImNvbmYvLmtleXN0b3JlIiwgImNhc3NhbmRyYSIpOworICAgICAgICBvdXRib3VuZEtleXN0b3JlQ29udGV4dCA9IG5ldyBGaWxlQmFzZWRTdG9yZUNvbnRleHQoImNvbmYvLmtleXN0b3JlIiwgImNhc3NhbmRyYSIpOworICAgICAgICB0cnVzdFN0b3JlQ29udGV4dCA9IG5ldyBGaWxlQmFzZWRTdG9yZUNvbnRleHQoImNvbmYvLnRydXN0c3RvcmUiLCAiY2Fzc2FuZHJhIik7CiAgICAgfQogCiAgICAgcHVibGljIEZpbGVCYXNlZFNzbENvbnRleHRGYWN0b3J5KE1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1ldGVycykKICAgICB7CiAgICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpOwotICAgICAgICBrZXlzdG9yZSA9IGdldFN0cmluZygia2V5c3RvcmUiKTsKLSAgICAgICAga2V5c3RvcmVfcGFzc3dvcmQgPSBnZXRTdHJpbmcoImtleXN0b3JlX3Bhc3N3b3JkIik7Ci0gICAgICAgIHRydXN0c3RvcmUgPSBnZXRTdHJpbmcoInRydXN0c3RvcmUiKTsKLSAgICAgICAgdHJ1c3RzdG9yZV9wYXNzd29yZCA9IGdldFN0cmluZygidHJ1c3RzdG9yZV9wYXNzd29yZCIpOworICAgICAgICBrZXlzdG9yZUNvbnRleHQgPSBuZXcgRmlsZUJhc2VkU3RvcmVDb250ZXh0KGdldFN0cmluZygia2V5c3RvcmUiKSwgZ2V0U3RyaW5nKCJrZXlzdG9yZV9wYXNzd29yZCIpKTsKKyAgICAgICAgb3V0Ym91bmRLZXlzdG9yZUNvbnRleHQgPSBuZXcgRmlsZUJhc2VkU3RvcmVDb250ZXh0KFN0cmluZ1V0aWxzLmRlZmF1bHRTdHJpbmcoZ2V0U3RyaW5nKCJvdXRib3VuZF9rZXlzdG9yZSIpLCBrZXlzdG9yZUNvbnRleHQuZmlsZVBhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nVXRpbHMuZGVmYXVsdFN0cmluZyhnZXRTdHJpbmcoIm91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkIiksIGtleXN0b3JlQ29udGV4dC5wYXNzd29yZCkpOworICAgICAgICB0cnVzdFN0b3JlQ29udGV4dCA9IG5ldyBGaWxlQmFzZWRTdG9yZUNvbnRleHQoZ2V0U3RyaW5nKCJ0cnVzdHN0b3JlIiksIGdldFN0cmluZygidHJ1c3RzdG9yZV9wYXNzd29yZCIpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTkwLDMwICs4Myw0MSBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGhhc0tleXN0b3JlKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBrZXlzdG9yZSAhPSBudWxsICYmIG5ldyBGaWxlKGtleXN0b3JlKS5leGlzdHMoKTsKKyAgICAgICAgcmV0dXJuIGtleXN0b3JlQ29udGV4dC5oYXNLZXlzdG9yZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc091dGJvdW5kS2V5c3RvcmUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG91dGJvdW5kS2V5c3RvcmVDb250ZXh0Lmhhc0tleXN0b3JlKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIGhhc1RydXN0c3RvcmUoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIHRydXN0c3RvcmUgIT0gbnVsbCAmJiBuZXcgRmlsZSh0cnVzdHN0b3JlKS5leGlzdHMoKTsKKyAgICAgICAgcmV0dXJuIHRydXN0U3RvcmVDb250ZXh0LmZpbGVQYXRoICE9IG51bGwgJiYgbmV3IEZpbGUodHJ1c3RTdG9yZUNvbnRleHQuZmlsZVBhdGgpLmV4aXN0cygpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBpbml0SG90UmVsb2FkaW5nKCkKICAgICB7CiAgICAgICAgIGJvb2xlYW4gaGFzS2V5c3RvcmUgPSBoYXNLZXlzdG9yZSgpOworICAgICAgICBib29sZWFuIGhhc091dGJvdW5kS2V5c3RvcmUgPSBoYXNPdXRib3VuZEtleXN0b3JlKCk7CiAgICAgICAgIGJvb2xlYW4gaGFzVHJ1c3RzdG9yZSA9IGhhc1RydXN0c3RvcmUoKTsKIAotICAgICAgICBpZiAoaGFzS2V5c3RvcmUgfHwgaGFzVHJ1c3RzdG9yZSkKKyAgICAgICAgaWYgKGhhc0tleXN0b3JlIHx8IGhhc091dGJvdW5kS2V5c3RvcmUgfHwgaGFzVHJ1c3RzdG9yZSkKICAgICAgICAgewogICAgICAgICAgICAgTGlzdDxIb3RSZWxvYWRhYmxlRmlsZT4gZmlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgICAgIGlmIChoYXNLZXlzdG9yZSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWxlTGlzdC5hZGQobmV3IEhvdFJlbG9hZGFibGVGaWxlKGtleXN0b3JlKSk7CisgICAgICAgICAgICAgICAgZmlsZUxpc3QuYWRkKG5ldyBIb3RSZWxvYWRhYmxlRmlsZShrZXlzdG9yZUNvbnRleHQuZmlsZVBhdGgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYXNPdXRib3VuZEtleXN0b3JlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpbGVMaXN0LmFkZChuZXcgSG90UmVsb2FkYWJsZUZpbGUob3V0Ym91bmRLZXlzdG9yZUNvbnRleHQuZmlsZVBhdGgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChoYXNUcnVzdHN0b3JlKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbGVMaXN0LmFkZChuZXcgSG90UmVsb2FkYWJsZUZpbGUodHJ1c3RzdG9yZSkpOworICAgICAgICAgICAgICAgIGZpbGVMaXN0LmFkZChuZXcgSG90UmVsb2FkYWJsZUZpbGUodHJ1c3RTdG9yZUNvbnRleHQuZmlsZVBhdGgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGhvdFJlbG9hZGFibGVGaWxlcyA9IGZpbGVMaXN0OwogICAgICAgICB9CkBAIC0xMjIsMTUgKzEyNiwxOCBAQAogICAgIC8qKgogICAgICAqIFZhbGlkYXRlcyB0aGUgZ2l2ZW4ga2V5c3RvcmUgcGFzc3dvcmQuCiAgICAgICoKKyAgICAgKiBAcGFyYW0gaXNPdXRib3VuZEtleXN0b3JlIHtAY29kZSB0cnVlfSBmb3IgdGhlIHtAY29kZSBvdXRib3VuZF9rZXlzdG9yZV9wYXNzd29yZH07e0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKICAgICAgKiBAcGFyYW0gcGFzc3dvcmQgICAgICAgICAgIHZhbHVlCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHtAY29kZSBwYXNzd29yZH0gaXMgZW1wdHkgYXMgcGVyIHRoZSBkZWZpbml0aW9uIG9mIHtAbGluayBTdHJpbmdVdGlscyNpc0VtcHR5KENoYXJTZXF1ZW5jZSl9CiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpCisgICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQYXNzd29yZChib29sZWFuIGlzT3V0Ym91bmRLZXlzdG9yZSwgU3RyaW5nIHBhc3N3b3JkKQogICAgIHsKICAgICAgICAgYm9vbGVhbiBrZXlzdG9yZVBhc3N3b3JkRW1wdHkgPSBTdHJpbmdVdGlscy5pc0VtcHR5KHBhc3N3b3JkKTsKICAgICAgICAgaWYgKGtleXN0b3JlUGFzc3dvcmRFbXB0eSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiJ2tleXN0b3JlX3Bhc3N3b3JkJyBtdXN0IGJlIHNwZWNpZmllZCIpOworICAgICAgICAgICAgU3RyaW5nIGtleU5hbWUgPSBpc091dGJvdW5kS2V5c3RvcmUgPyAib3V0Ym91bmRfIiA6ICIiOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoIiclc2tleXN0b3JlX3Bhc3N3b3JkJyBtdXN0IGJlIHNwZWNpZmllZCIsIGtleU5hbWUpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtc2cpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNDAsNiArMTQ3LDggQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gS2V5TWFuYWdlckZhY3RvcnkgYnVpbHQgZnJvbSB0aGUgZmlsZSBiYXNlZCBrZXlzdG9yZS4KICAgICAgKiBAdGhyb3dzIFNTTEV4Y2VwdGlvbiBpZiBhbnkgaXNzdWVzIGVuY291bnRlcmVkIGR1cmluZyB0aGUgYnVpbGQgcHJvY2VzcworICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB2YWxpZGF0aW9uIGZvciB0aGUge0Bjb2RlIGtleXN0b3JlX3Bhc3N3b3JkfSBmYWlscworICAgICAqIEBzZWUgI3ZhbGlkYXRlUGFzc3dvcmQoYm9vbGVhbiwgU3RyaW5nKQogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBLZXlNYW5hZ2VyRmFjdG9yeSBidWlsZEtleU1hbmFnZXJGYWN0b3J5KCkgdGhyb3dzIFNTTEV4Y2VwdGlvbgpAQCAtMTQ4LDI2ICsxNTcsMTkgQEAKICAgICAgICAgICogVmFsaWRhdGlvbiBvZiB0aGUgcGFzc3dvcmQgaXMgZGVsYXllZCB1bnRpbCB0aGlzIHBvaW50IHRvIGFsbG93IG51bGxhYmxlIGtleXN0b3JlIHBhc3N3b3JkcwogICAgICAgICAgKiBmb3Igb3RoZXIgdXNlLWNhc2VzIChDQVNTQU5EUkEtMTgxMjQpLgogICAgICAgICAgKi8KLSAgICAgICAgdmFsaWRhdGVQYXNzd29yZChrZXlzdG9yZV9wYXNzd29yZCk7CisgICAgICAgIHZhbGlkYXRlUGFzc3dvcmQoZmFsc2UsIGtleXN0b3JlQ29udGV4dC5wYXNzd29yZCk7CisgICAgICAgIHJldHVybiBnZXRLZXlNYW5hZ2VyRmFjdG9yeShrZXlzdG9yZUNvbnRleHQpOworICAgIH0KIAotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGtzZiA9IEZpbGVzLm5ld0lucHV0U3RyZWFtKEZpbGUuZ2V0UGF0aChrZXlzdG9yZSkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWxnb3JpdGhtID0gdGhpcy5hbGdvcml0aG0gPT0gbnVsbCA/IEtleU1hbmFnZXJGYWN0b3J5LmdldERlZmF1bHRBbGdvcml0aG0oKSA6IHRoaXMuYWxnb3JpdGhtOwotICAgICAgICAgICAgS2V5TWFuYWdlckZhY3Rvcnkga21mID0gS2V5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoYWxnb3JpdGhtKTsKLSAgICAgICAgICAgIEtleVN0b3JlIGtzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2Uoc3RvcmVfdHlwZSk7Ci0gICAgICAgICAgICBrcy5sb2FkKGtzZiwga2V5c3RvcmVfcGFzc3dvcmQudG9DaGFyQXJyYXkoKSk7Ci0gICAgICAgICAgICBpZiAoIWNoZWNrZWRFeHBpcnkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hlY2tFeHBpcmVkQ2VydHMoa3MpOwotICAgICAgICAgICAgICAgIGNoZWNrZWRFeHBpcnkgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAga21mLmluaXQoa3MsIGtleXN0b3JlX3Bhc3N3b3JkLnRvQ2hhckFycmF5KCkpOwotICAgICAgICAgICAgcmV0dXJuIGttZjsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTU0xFeGNlcHRpb24oImZhaWxlZCB0byBidWlsZCBrZXkgbWFuYWdlciBzdG9yZSBmb3Igc2VjdXJlIGNvbm5lY3Rpb25zIiwgZSk7Ci0gICAgICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgS2V5TWFuYWdlckZhY3RvcnkgYnVpbGRPdXRib3VuZEtleU1hbmFnZXJGYWN0b3J5KCkgdGhyb3dzIFNTTEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogVmFsaWRhdGlvbiBvZiB0aGUgcGFzc3dvcmQgaXMgZGVsYXllZCB1bnRpbCB0aGlzIHBvaW50IHRvIGFsbG93IG51bGxhYmxlIGtleXN0b3JlIHBhc3N3b3JkcworICAgICAgICAgKiBmb3Igb3RoZXIgdXNlLWNhc2VzIChDQVNTQU5EUkEtMTgxMjQpLgorICAgICAgICAgKi8KKyAgICAgICAgdmFsaWRhdGVQYXNzd29yZCh0cnVlLCBvdXRib3VuZEtleXN0b3JlQ29udGV4dC5wYXNzd29yZCk7CisgICAgICAgIHJldHVybiBnZXRLZXlNYW5hZ2VyRmFjdG9yeShvdXRib3VuZEtleXN0b3JlQ29udGV4dCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzksMTMgKzE4MSwxMyBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBUcnVzdE1hbmFnZXJGYWN0b3J5IGJ1aWxkVHJ1c3RNYW5hZ2VyRmFjdG9yeSgpIHRocm93cyBTU0xFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gdHNmID0gRmlsZXMubmV3SW5wdXRTdHJlYW0oRmlsZS5nZXRQYXRoKHRydXN0c3RvcmUpKSkKKyAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSB0c2YgPSBGaWxlcy5uZXdJbnB1dFN0cmVhbShGaWxlLmdldFBhdGgodHJ1c3RTdG9yZUNvbnRleHQuZmlsZVBhdGgpKSkKICAgICAgICAgewogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFsZ29yaXRobSA9IHRoaXMuYWxnb3JpdGhtID09IG51bGwgPyBUcnVzdE1hbmFnZXJGYWN0b3J5LmdldERlZmF1bHRBbGdvcml0aG0oKSA6IHRoaXMuYWxnb3JpdGhtOwogICAgICAgICAgICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeSB0bWYgPSBUcnVzdE1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKGFsZ29yaXRobSk7CiAgICAgICAgICAgICBLZXlTdG9yZSB0cyA9IEtleVN0b3JlLmdldEluc3RhbmNlKHN0b3JlX3R5cGUpOwogCi0gICAgICAgICAgICBmaW5hbCBjaGFyW10gdHJ1c3RzdG9yZVBhc3N3b3JkID0gU3RyaW5nVXRpbHMuaXNFbXB0eSh0cnVzdHN0b3JlX3Bhc3N3b3JkKSA/IG51bGwgOiB0cnVzdHN0b3JlX3Bhc3N3b3JkLnRvQ2hhckFycmF5KCk7CisgICAgICAgICAgICBmaW5hbCBjaGFyW10gdHJ1c3RzdG9yZVBhc3N3b3JkID0gU3RyaW5nVXRpbHMuaXNFbXB0eSh0cnVzdFN0b3JlQ29udGV4dC5wYXNzd29yZCkgPyBudWxsIDogdHJ1c3RTdG9yZUNvbnRleHQucGFzc3dvcmQudG9DaGFyQXJyYXkoKTsKICAgICAgICAgICAgIHRzLmxvYWQodHNmLCB0cnVzdHN0b3JlUGFzc3dvcmQpOwogICAgICAgICAgICAgdG1mLmluaXQodHMpOwogICAgICAgICAgICAgcmV0dXJuIHRtZjsKQEAgLTE5Niw2ICsxOTgsMjkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgS2V5TWFuYWdlckZhY3RvcnkgZ2V0S2V5TWFuYWdlckZhY3RvcnkoZmluYWwgRmlsZUJhc2VkU3RvcmVDb250ZXh0IGNvbnRleHQpIHRocm93cyBTU0xFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0ga3NmID0gRmlsZXMubmV3SW5wdXRTdHJlYW0oRmlsZS5nZXRQYXRoKGNvbnRleHQuZmlsZVBhdGgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFsZ29yaXRobSA9IHRoaXMuYWxnb3JpdGhtID09IG51bGwgPyBLZXlNYW5hZ2VyRmFjdG9yeS5nZXREZWZhdWx0QWxnb3JpdGhtKCkgOiB0aGlzLmFsZ29yaXRobTsKKyAgICAgICAgICAgIEtleU1hbmFnZXJGYWN0b3J5IGttZiA9IEtleU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKGFsZ29yaXRobSk7CisgICAgICAgICAgICBLZXlTdG9yZSBrcyA9IEtleVN0b3JlLmdldEluc3RhbmNlKHN0b3JlX3R5cGUpOworICAgICAgICAgICAga3MubG9hZChrc2YsIGNvbnRleHQucGFzc3dvcmQudG9DaGFyQXJyYXkoKSk7CisKKyAgICAgICAgICAgIGlmICghY29udGV4dC5jaGVja2VkRXhwaXJ5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoZWNrRXhwaXJlZENlcnRzKGtzKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmNoZWNrZWRFeHBpcnkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAga21mLmluaXQoa3MsIGNvbnRleHQucGFzc3dvcmQudG9DaGFyQXJyYXkoKSk7CisgICAgICAgICAgICByZXR1cm4ga21mOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNTTEV4Y2VwdGlvbigiZmFpbGVkIHRvIGJ1aWxkIGtleSBtYW5hZ2VyIHN0b3JlIGZvciBzZWN1cmUgY29ubmVjdGlvbnMiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByb3RlY3RlZCBib29sZWFuIGNoZWNrRXhwaXJlZENlcnRzKEtleVN0b3JlIGtzKSB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24KICAgICB7CiAgICAgICAgIGJvb2xlYW4gaGFzRXhwaXJlZENlcnRzID0gZmFsc2U7CkBAIC0yNDcsNCArMjcyLDI3IEBACiAgICAgICAgICAgICAgICAgICAgJ30nOwogICAgICAgICB9CiAgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBGaWxlQmFzZWRTdG9yZUNvbnRleHQKKyAgICB7CisgICAgICAgIHB1YmxpYyB2b2xhdGlsZSBib29sZWFuIGNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIFN0cmluZyBmaWxlUGF0aDsKKyAgICAgICAgcHVibGljIFN0cmluZyBwYXNzd29yZDsKKworICAgICAgICBwdWJsaWMgRmlsZUJhc2VkU3RvcmVDb250ZXh0KFN0cmluZyBrZXlzdG9yZSwgU3RyaW5nIGtleXN0b3JlUGFzc3dvcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZmlsZVBhdGggPSBrZXlzdG9yZTsKKyAgICAgICAgICAgIHRoaXMucGFzc3dvcmQgPSBrZXlzdG9yZVBhc3N3b3JkOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzS2V5c3RvcmUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmlsZVBhdGggIT0gbnVsbCAmJiBuZXcgRmlsZShmaWxlUGF0aCkuZXhpc3RzKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwYXNzd29yZE1hdGNoZXNJZlByZXNlbnQoU3RyaW5nIGtleVBhc3N3b3JkKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuaXNFbXB0eShwYXNzd29yZCkgfHwga2V5UGFzc3dvcmQuZXF1YWxzKHBhc3N3b3JkKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0lTc2xDb250ZXh0RmFjdG9yeS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvSVNzbENvbnRleHRGYWN0b3J5LmphdmEKaW5kZXggNTc5Yzk1ZS4uMTFjNDcxNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvSVNzbENvbnRleHRGYWN0b3J5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvSVNzbENvbnRleHRGYWN0b3J5LmphdmEKQEAgLTEwMCw2ICsxMDAsMTYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIGlmIHRoaXMgZmFjdG9yeSB1c2VzIG91dGJvdW5kIGtleXN0b3JlLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gYnkgZGVmYXVsdCB1bmxlc3MgdGhlIGltcGxlbWVudGF0aW9uIG92ZXJyaWRlcyB0aGlzCisgICAgICovCisgICAgZGVmYXVsdCBib29sZWFuIGhhc091dGJvdW5kS2V5c3RvcmUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHByZXBhcmVkIGxpc3Qgb2YgYWNjZXB0ZWQgcHJvdG9jb2xzLgogICAgICAqCiAgICAgICogQHJldHVybiBhcnJheSBvZiBwcm90b2NvbCBuYW1lcyBzdWl0YWJsZSBmb3IgcGFzc2luZyB0byBOZXR0eSdzIFNzbENvbnRleHRCdWlsZGVyLnByb3RvY29scywgb3IgbnVsbCBpZiB0aGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1BFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1BFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnkuamF2YQppbmRleCBkNjJhZWY1Li42MmUyZDRjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9QRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeS5qYXZhCkBAIC04OSw0MiArODksNTAgQEAKIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1RBUkdFVF9TVE9SRVRZUEUgPSAiUEtDUzEyIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeS5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGVtRW5jb2RlZEtleTsKLSAgICBwcml2YXRlIFN0cmluZyBrZXlQYXNzd29yZDsKLSAgICBwcml2YXRlIFN0cmluZyBwZW1FbmNvZGVkQ2VydGlmaWNhdGVzOwotICAgIHByaXZhdGUgYm9vbGVhbiBtYXliZUZpbGVCYXNlZFByaXZhdGVLZXk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1heWJlRmlsZUJhc2VkVHJ1c3RlZENlcnRpZmljYXRlczsKKyAgICBwcml2YXRlIFBFTUJhc2VkS2V5U3RvcmVDb250ZXh0IHBlbUVuY29kZWRUcnVzdENlcnRpZmljYXRlczsKKyAgICBwcml2YXRlIFBFTUJhc2VkS2V5U3RvcmVDb250ZXh0IHBlbUVuY29kZWRLZXlDb250ZXh0OworICAgIHByaXZhdGUgUEVNQmFzZWRLZXlTdG9yZUNvbnRleHQgcGVtRW5jb2RlZE91dGJvdW5kS2V5Q29udGV4dDsKIAogICAgIHB1YmxpYyBQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5KCkKICAgICB7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUGFzc3dvcmRzKCkKKyAgICB7CisgICAgICAgIGJvb2xlYW4gc2hvdWxkVGhyb3cgPSAha2V5c3RvcmVDb250ZXh0LnBhc3N3b3JkTWF0Y2hlc0lmUHJlc2VudChwZW1FbmNvZGVkS2V5Q29udGV4dC5wYXNzd29yZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFvdXRib3VuZEtleXN0b3JlQ29udGV4dC5wYXNzd29yZE1hdGNoZXNJZlByZXNlbnQocGVtRW5jb2RlZE91dGJvdW5kS2V5Q29udGV4dC5wYXNzd29yZCk7CisgICAgICAgIGJvb2xlYW4gb3V0Ym91bmRQYXNzd29yZE1pc21hdGNoID0gIW91dGJvdW5kS2V5c3RvcmVDb250ZXh0LnBhc3N3b3JkTWF0Y2hlc0lmUHJlc2VudChwZW1FbmNvZGVkT3V0Ym91bmRLZXlDb250ZXh0LnBhc3N3b3JkKTsKKyAgICAgICAgU3RyaW5nIGtleU5hbWUgPSBvdXRib3VuZFBhc3N3b3JkTWlzbWF0Y2ggPyAib3V0Ym91bmRfIiA6ICIiOworCisgICAgICAgIGlmIChzaG91bGRUaHJvdykKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoIiclc2tleXN0b3JlX3Bhc3N3b3JkJyBhbmQgJyVza2V5X3Bhc3N3b3JkJyBib3RoIGNvbmZpZ3VyYXRpb25zIGFyZSBnaXZlbiBhbmQgdGhlIHZhbHVlcyBkbyBub3QgbWF0Y2giLCBrZXlOYW1lLCBrZXlOYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obXNnKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5KE1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1ldGVycykKICAgICB7CiAgICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpOwotICAgICAgICBwZW1FbmNvZGVkS2V5ID0gZ2V0U3RyaW5nKENvbmZpZ0tleS5FTkNPREVEX0tFWS5nZXRLZXlOYW1lKCkpOwotICAgICAgICBrZXlQYXNzd29yZCA9IGdldFN0cmluZyhDb25maWdLZXkuS0VZX1BBU1NXT1JELmdldEtleU5hbWUoKSk7Ci0gICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KGtleVBhc3N3b3JkKSkKLSAgICAgICAgewotICAgICAgICAgICAga2V5UGFzc3dvcmQgPSBrZXlzdG9yZV9wYXNzd29yZDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghU3RyaW5nVXRpbHMuaXNFbXB0eShrZXlzdG9yZV9wYXNzd29yZCkgJiYgIWtleVBhc3N3b3JkLmVxdWFscyhrZXlzdG9yZV9wYXNzd29yZCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIidrZXlzdG9yZV9wYXNzd29yZCcgYW5kICdrZXlfcGFzc3dvcmQnIGJvdGggY29uZmlndXJhdGlvbnMgYXJlIGdpdmVuIGFuZCB0aGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZXMgZG8gbm90IG1hdGNoIik7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RyaW5nIHBlbUVuY29kZWRLZXkgPSBnZXRTdHJpbmcoQ29uZmlnS2V5LkVOQ09ERURfS0VZLmdldEtleU5hbWUoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBwZW1FbmNvZGVkS2V5UGFzc3dvcmQgPSBTdHJpbmdVdGlscy5kZWZhdWx0U3RyaW5nKGdldFN0cmluZyhDb25maWdLZXkuS0VZX1BBU1NXT1JELmdldEtleU5hbWUoKSksIGtleXN0b3JlQ29udGV4dC5wYXNzd29yZCk7CisgICAgICAgIHBlbUVuY29kZWRLZXlDb250ZXh0ID0gbmV3IFBFTUJhc2VkS2V5U3RvcmVDb250ZXh0KHBlbUVuY29kZWRLZXksIHBlbUVuY29kZWRLZXlQYXNzd29yZCwgU3RyaW5nVXRpbHMuaXNFbXB0eShwZW1FbmNvZGVkS2V5KSwga2V5c3RvcmVDb250ZXh0KTsKIAotICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkodHJ1c3RzdG9yZV9wYXNzd29yZCkpCisgICAgICAgIGZpbmFsIFN0cmluZyBwZW1FbmNvZGVkT3V0Ym91bmRLZXkgPSBTdHJpbmdVdGlscy5kZWZhdWx0U3RyaW5nKGdldFN0cmluZyhDb25maWdLZXkuT1VUQk9VTkRfRU5DT0RFRF9LRVkuZ2V0S2V5TmFtZSgpKSwgcGVtRW5jb2RlZEtleSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBvdXRib3VuZEtleVBhc3N3b3JkID0gU3RyaW5nVXRpbHMuZGVmYXVsdFN0cmluZyhTdHJpbmdVdGlscy5kZWZhdWx0U3RyaW5nKGdldFN0cmluZyhDb25maWdLZXkuT1VUQk9VTkRfRU5DT0RFRF9LRVlfUEFTU1dPUkQuZ2V0S2V5TmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Ym91bmRLZXlzdG9yZUNvbnRleHQucGFzc3dvcmQpLCBwZW1FbmNvZGVkS2V5UGFzc3dvcmQpOworICAgICAgICBwZW1FbmNvZGVkT3V0Ym91bmRLZXlDb250ZXh0ID0gbmV3IFBFTUJhc2VkS2V5U3RvcmVDb250ZXh0KHBlbUVuY29kZWRLZXksIG91dGJvdW5kS2V5UGFzc3dvcmQsIFN0cmluZ1V0aWxzLmlzRW1wdHkocGVtRW5jb2RlZE91dGJvdW5kS2V5KSwgb3V0Ym91bmRLZXlzdG9yZUNvbnRleHQpOworCisgICAgICAgIHZhbGlkYXRlUGFzc3dvcmRzKCk7CisKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KHRydXN0U3RvcmVDb250ZXh0LnBhc3N3b3JkKSkKICAgICAgICAgewogICAgICAgICAgICAgbG9nZ2VyLndhcm4oIlBFTSBiYXNlZCB0cnVzdHN0b3JlIHNob3VsZCBub3QgYmUgdXNpbmcgcGFzc3dvcmQuIElnbm9yaW5nIHRoZSBnaXZlbiB2YWx1ZSBpbiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICIndHJ1c3RzdG9yZV9wYXNzd29yZCcgY29uZmlndXJhdGlvbi4iKTsKICAgICAgICAgfQogCi0gICAgICAgIHBlbUVuY29kZWRDZXJ0aWZpY2F0ZXMgPSBnZXRTdHJpbmcoQ29uZmlnS2V5LkVOQ09ERURfQ0VSVElGSUNBVEVTLmdldEtleU5hbWUoKSk7Ci0KLSAgICAgICAgbWF5YmVGaWxlQmFzZWRQcml2YXRlS2V5ID0gU3RyaW5nVXRpbHMuaXNFbXB0eShwZW1FbmNvZGVkS2V5KTsKLSAgICAgICAgbWF5YmVGaWxlQmFzZWRUcnVzdGVkQ2VydGlmaWNhdGVzID0gU3RyaW5nVXRpbHMuaXNFbXB0eShwZW1FbmNvZGVkQ2VydGlmaWNhdGVzKTsKLQorICAgICAgICBmaW5hbCBTdHJpbmcgcGVtRW5jb2RlZENlcnRzID0gZ2V0U3RyaW5nKENvbmZpZ0tleS5FTkNPREVEX0NFUlRJRklDQVRFUy5nZXRLZXlOYW1lKCkpOworICAgICAgICBwZW1FbmNvZGVkVHJ1c3RDZXJ0aWZpY2F0ZXMgPSBuZXcgUEVNQmFzZWRLZXlTdG9yZUNvbnRleHQocGVtRW5jb2RlZENlcnRzLCBudWxsLCBTdHJpbmdVdGlscy5pc0VtcHR5KHBlbUVuY29kZWRDZXJ0cyksIHRydXN0U3RvcmVDb250ZXh0KTsKICAgICAgICAgZW5mb3JjZVNpbmdsZVByaXZhdGVLZXlTb3VyY2UoKTsKICAgICAgICAgZW5mb3JjZVNpbmdsZVR1cnN0ZWRDZXJ0aWZpY2F0ZXNTb3VyY2UoKTsKICAgICB9CkBAIC0xMzcsMTggKzE0NSwyMiBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGhhc0tleXN0b3JlKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBtYXliZUZpbGVCYXNlZFByaXZhdGVLZXkgPyBrZXlzdG9yZUZpbGVFeGlzdHMoKSA6Ci0gICAgICAgICAgICAgICAhU3RyaW5nVXRpbHMuaXNFbXB0eShwZW1FbmNvZGVkS2V5KTsKKyAgICAgICAgcmV0dXJuIHBlbUVuY29kZWRLZXlDb250ZXh0Lm1heWJlRmlsZWJhc2VkS2V5CisgICAgICAgICAgICAgICA/IGtleXN0b3JlQ29udGV4dC5oYXNLZXlzdG9yZSgpCisgICAgICAgICAgICAgICA6ICFTdHJpbmdVdGlscy5pc0VtcHR5KHBlbUVuY29kZWRLZXlDb250ZXh0LmtleSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBrZXlzdG9yZSBmaWxlIGV4aXN0cy4KKyAgICAgKiBEZWNpZGVzIGlmIHRoaXMgZmFjdG9yeSBoYXMgYW4gb3V0Ym91bmQga2V5c3RvcmUgZGVmaW5lZCAtIGtleSBtYXRlcmlhbCBzcGVjaWZpZWQgaW4gZmlsZXMgb3IgaW5saW5lIHRvIHRoZSBjb25maWd1cmF0aW9uLgogICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYga2V5c3RvcmUgZmlsZSBleGlzdHM7IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlcmUgaXMgYW4gb3V0Ym91bmQga2V5c3RvcmUgZGVmaW5lZDsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKICAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4ga2V5c3RvcmVGaWxlRXhpc3RzKCkKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNPdXRib3VuZEtleXN0b3JlKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBrZXlzdG9yZSAhPSBudWxsICYmIG5ldyBGaWxlKGtleXN0b3JlKS5leGlzdHMoKTsKKyAgICAgICAgcmV0dXJuIHBlbUVuY29kZWRPdXRib3VuZEtleUNvbnRleHQubWF5YmVGaWxlYmFzZWRLZXkKKyAgICAgICAgICAgICAgID8gb3V0Ym91bmRLZXlzdG9yZUNvbnRleHQuaGFzS2V5c3RvcmUoKQorICAgICAgICAgICAgICAgOiAhU3RyaW5nVXRpbHMuaXNFbXB0eShwZW1FbmNvZGVkT3V0Ym91bmRLZXlDb250ZXh0LmtleSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNTksOCArMTcxLDggQEAKICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gaGFzVHJ1c3RzdG9yZSgpCiAgICAgewotICAgICAgICByZXR1cm4gbWF5YmVGaWxlQmFzZWRUcnVzdGVkQ2VydGlmaWNhdGVzID8gdHJ1c3RzdG9yZUZpbGVFeGlzdHMoKSA6Ci0gICAgICAgICAgICAgICAhU3RyaW5nVXRpbHMuaXNFbXB0eShwZW1FbmNvZGVkQ2VydGlmaWNhdGVzKTsKKyAgICAgICAgcmV0dXJuIHBlbUVuY29kZWRUcnVzdENlcnRpZmljYXRlcy5tYXliZUZpbGViYXNlZEtleSA/IHRydXN0c3RvcmVGaWxlRXhpc3RzKCkgOgorICAgICAgICAgICAgICAgIVN0cmluZ1V0aWxzLmlzRW1wdHkocGVtRW5jb2RlZFRydXN0Q2VydGlmaWNhdGVzLmtleSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzAsNyArMTgyLDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gdHJ1c3RzdG9yZUZpbGVFeGlzdHMoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIHRydXN0c3RvcmUgIT0gbnVsbCAmJiBuZXcgRmlsZSh0cnVzdHN0b3JlKS5leGlzdHMoKTsKKyAgICAgICAgcmV0dXJuIHRydXN0U3RvcmVDb250ZXh0LmZpbGVQYXRoICE9IG51bGwgJiYgbmV3IEZpbGUodHJ1c3RTdG9yZUNvbnRleHQuZmlsZVBhdGgpLmV4aXN0cygpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTgwLDEzICsxOTIsMTcgQEAKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5pdEhvdFJlbG9hZGluZygpCiAgICAgewogICAgICAgICBMaXN0PEhvdFJlbG9hZGFibGVGaWxlPiBmaWxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBpZiAobWF5YmVGaWxlQmFzZWRQcml2YXRlS2V5ICYmIGhhc0tleXN0b3JlKCkpCisgICAgICAgIGlmIChwZW1FbmNvZGVkS2V5Q29udGV4dC5tYXliZUZpbGViYXNlZEtleSAmJiBoYXNLZXlzdG9yZSgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBmaWxlTGlzdC5hZGQobmV3IEhvdFJlbG9hZGFibGVGaWxlKGtleXN0b3JlKSk7CisgICAgICAgICAgICBmaWxlTGlzdC5hZGQobmV3IEhvdFJlbG9hZGFibGVGaWxlKGtleXN0b3JlQ29udGV4dC5maWxlUGF0aCkpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtYXliZUZpbGVCYXNlZFRydXN0ZWRDZXJ0aWZpY2F0ZXMgJiYgaGFzVHJ1c3RzdG9yZSgpKQorICAgICAgICBpZiAocGVtRW5jb2RlZE91dGJvdW5kS2V5Q29udGV4dC5tYXliZUZpbGViYXNlZEtleSAmJiBoYXNPdXRib3VuZEtleXN0b3JlKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZpbGVMaXN0LmFkZChuZXcgSG90UmVsb2FkYWJsZUZpbGUodHJ1c3RzdG9yZSkpOworICAgICAgICAgICAgZmlsZUxpc3QuYWRkKG5ldyBIb3RSZWxvYWRhYmxlRmlsZShvdXRib3VuZEtleXN0b3JlQ29udGV4dC5maWxlUGF0aCkpOworICAgICAgICB9CisgICAgICAgIGlmIChwZW1FbmNvZGVkVHJ1c3RDZXJ0aWZpY2F0ZXMubWF5YmVGaWxlYmFzZWRLZXkgJiYgaGFzVHJ1c3RzdG9yZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBmaWxlTGlzdC5hZGQobmV3IEhvdFJlbG9hZGFibGVGaWxlKHRydXN0U3RvcmVDb250ZXh0LmZpbGVQYXRoKSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFmaWxlTGlzdC5pc0VtcHR5KCkpCiAgICAgICAgIHsKQEAgLTIwNCwyOSArMjIwLDQwIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIEtleU1hbmFnZXJGYWN0b3J5IGJ1aWxkS2V5TWFuYWdlckZhY3RvcnkoKSB0aHJvd3MgU1NMRXhjZXB0aW9uCiAgICAgeworICAgICAgICByZXR1cm4gYnVpbGRLZXlNYW5hZ2VyRmFjdG9yeShwZW1FbmNvZGVkS2V5Q29udGV4dCwga2V5c3RvcmVDb250ZXh0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgS2V5TWFuYWdlckZhY3RvcnkgYnVpbGRPdXRib3VuZEtleU1hbmFnZXJGYWN0b3J5KCkgdGhyb3dzIFNTTEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGJ1aWxkS2V5TWFuYWdlckZhY3RvcnkocGVtRW5jb2RlZE91dGJvdW5kS2V5Q29udGV4dCwgb3V0Ym91bmRLZXlzdG9yZUNvbnRleHQpOworICAgIH0KKworICAgIHByaXZhdGUgS2V5TWFuYWdlckZhY3RvcnkgYnVpbGRLZXlNYW5hZ2VyRmFjdG9yeShQRU1CYXNlZEtleVN0b3JlQ29udGV4dCBwZW1CYXNlZEtleVN0b3JlQ29udGV4dCwgRmlsZUJhc2VkU3RvcmVDb250ZXh0IGtleVN0b3JlQ29udGV4dCkgdGhyb3dzIFNTTEV4Y2VwdGlvbgorICAgIHsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChoYXNLZXlzdG9yZSgpKQorICAgICAgICAgICAgaWYgKHBlbUJhc2VkS2V5U3RvcmVDb250ZXh0Lmhhc0tleSgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtYXliZUZpbGVCYXNlZFByaXZhdGVLZXkpCisgICAgICAgICAgICAgICAgaWYgKHBlbUJhc2VkS2V5U3RvcmVDb250ZXh0Lm1heWJlRmlsZWJhc2VkS2V5KQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGVtRW5jb2RlZEtleSA9IHJlYWRQRU1GaWxlKGtleXN0b3JlKTsgLy8gcmVhZCBQRU0gZnJvbSB0aGUgZmlsZQorICAgICAgICAgICAgICAgICAgICBwZW1CYXNlZEtleVN0b3JlQ29udGV4dC5rZXkgPSByZWFkUEVNRmlsZShrZXlTdG9yZUNvbnRleHQuZmlsZVBhdGgpOyAvLyByZWFkIFBFTSBmcm9tIHRoZSBmaWxlCiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgS2V5TWFuYWdlckZhY3Rvcnkga21mID0gS2V5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoCiAgICAgICAgICAgICAgICAgYWxnb3JpdGhtID09IG51bGwgPyBLZXlNYW5hZ2VyRmFjdG9yeS5nZXREZWZhdWx0QWxnb3JpdGhtKCkgOiBhbGdvcml0aG0pOwotICAgICAgICAgICAgICAgIEtleVN0b3JlIGtzID0gYnVpbGRLZXlTdG9yZSgpOwotICAgICAgICAgICAgICAgIGlmICghY2hlY2tlZEV4cGlyeSkKKyAgICAgICAgICAgICAgICBLZXlTdG9yZSBrcyA9IGJ1aWxkS2V5U3RvcmUocGVtQmFzZWRLZXlTdG9yZUNvbnRleHQua2V5LCBwZW1CYXNlZEtleVN0b3JlQ29udGV4dC5wYXNzd29yZCk7CisgICAgICAgICAgICAgICAgaWYgKCFrZXlTdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGNoZWNrRXhwaXJlZENlcnRzKGtzKTsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tlZEV4cGlyeSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGtleVN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAga21mLmluaXQoa3MsIGtleVBhc3N3b3JkICE9IG51bGwgPyBrZXlQYXNzd29yZC50b0NoYXJBcnJheSgpIDogbnVsbCk7CisgICAgICAgICAgICAgICAga21mLmluaXQoa3MsIHBlbUJhc2VkS2V5U3RvcmVDb250ZXh0LnBhc3N3b3JkICE9IG51bGwgPyBwZW1CYXNlZEtleVN0b3JlQ29udGV4dC5wYXNzd29yZC50b0NoYXJBcnJheSgpIDogbnVsbCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGttZjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU1NMRXhjZXB0aW9uKCJNdXN0IHByb3ZpZGUga2V5c3RvcmUgb3IgcHJpdmF0ZV9rZXkgaW4gY29uZmlndXJhdGlvbiBmb3IgUEVNQmFzZWRTU2xDb250ZXh0RmFjdG9yeSIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTU0xFeGNlcHRpb24oIk11c3QgcHJvdmlkZSBvdXRib3VuZF9rZXlzdG9yZSBvciBvdXRib3VuZF9wcml2YXRlX2tleSBpbiBjb25maWd1cmF0aW9uIGZvciBQRU1CYXNlZFNTbENvbnRleHRGYWN0b3J5Iik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQpAQCAtMjQ4LDkgKzI3NSw5IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChoYXNUcnVzdHN0b3JlKCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG1heWJlRmlsZUJhc2VkVHJ1c3RlZENlcnRpZmljYXRlcykKKyAgICAgICAgICAgICAgICBpZiAocGVtRW5jb2RlZFRydXN0Q2VydGlmaWNhdGVzLm1heWJlRmlsZWJhc2VkS2V5KQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGVtRW5jb2RlZENlcnRpZmljYXRlcyA9IHJlYWRQRU1GaWxlKHRydXN0c3RvcmUpOyAvLyByZWFkIFBFTSBmcm9tIHRoZSBmaWxlCisgICAgICAgICAgICAgICAgICAgIHBlbUVuY29kZWRUcnVzdENlcnRpZmljYXRlcy5rZXkgPSByZWFkUEVNRmlsZSh0cnVzdFN0b3JlQ29udGV4dC5maWxlUGF0aCk7IC8vIHJlYWQgUEVNIGZyb20gdGhlIGZpbGUKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBUcnVzdE1hbmFnZXJGYWN0b3J5IHRtZiA9IFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoCkBAIC0yODAsNyArMzA3LDcgQEAKICAgICAgKiBCdWlsZHMgS2V5U3RvcmUgb2JqZWN0IGdpdmVuIHRoZSB7QGxpbmsgI0RFRkFVTFRfVEFSR0VUX1NUT1JFVFlQRX0gb3V0IG9mIHRoZSBQRU0gZm9ybWF0dGVkIHByaXZhdGUga2V5IG1hdGVyaWFsLgogICAgICAqIEl0IHVzZXMge0Bjb2RlIGNhc3NhbmRyYS1zc2wta2V5c3RvcmV9IGFzIHRoZSBhbGlhcyBmb3IgdGhlIGNyZWF0ZWQga2V5LWVudHJ5LgogICAgICAqLwotICAgIHByaXZhdGUgS2V5U3RvcmUgYnVpbGRLZXlTdG9yZSgpIHRocm93cyBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24sIElPRXhjZXB0aW9uCisgICAgcHJpdmF0ZSBzdGF0aWMgS2V5U3RvcmUgYnVpbGRLZXlTdG9yZShmaW5hbCBTdHJpbmcgcGVtRW5jb2RlZEtleSwgZmluYWwgU3RyaW5nIGtleVBhc3N3b3JkKSB0aHJvd3MgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgY2hhcltdIGtleVBhc3N3b3JkQXJyYXkgPSBrZXlQYXNzd29yZCAhPSBudWxsID8ga2V5UGFzc3dvcmQudG9DaGFyQXJyYXkoKSA6IG51bGw7CiAgICAgICAgIFByaXZhdGVLZXkgcHJpdmF0ZUtleSA9IFBFTVJlYWRlci5leHRyYWN0UHJpdmF0ZUtleShwZW1FbmNvZGVkS2V5LCBrZXlQYXNzd29yZCk7CkBAIC0zMDQsNyArMzMxLDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIEtleVN0b3JlIGJ1aWxkVHJ1c3RTdG9yZSgpIHRocm93cyBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24sIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBDZXJ0aWZpY2F0ZVtdIGNlcnRDaGFpbkFycmF5ID0gUEVNUmVhZGVyLmV4dHJhY3RDZXJ0aWZpY2F0ZXMocGVtRW5jb2RlZENlcnRpZmljYXRlcyk7CisgICAgICAgIENlcnRpZmljYXRlW10gY2VydENoYWluQXJyYXkgPSBQRU1SZWFkZXIuZXh0cmFjdENlcnRpZmljYXRlcyhwZW1FbmNvZGVkVHJ1c3RDZXJ0aWZpY2F0ZXMua2V5KTsKICAgICAgICAgaWYgKGNlcnRDaGFpbkFycmF5ID09IG51bGwgfHwgY2VydENoYWluQXJyYXkubGVuZ3RoID09IDApCiAgICAgICAgIHsKICAgICAgICAgICAgIHRocm93IG5ldyBTU0xFeGNlcHRpb24oIkNvdWxkIG5vdCByZWFkIGFueSBjZXJ0aWZpY2F0ZXMgZnJvbSB0aGUgZ2l2ZW4gUEVNIik7CkBAIC0zMjUsMTEgKzM1MiwxNiBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBlbmZvcmNlU2luZ2xlUHJpdmF0ZUtleVNvdXJjZSgpCiAgICAgewotICAgICAgICBpZiAoa2V5c3RvcmVGaWxlRXhpc3RzKCkgJiYgIVN0cmluZ1V0aWxzLmlzRW1wdHkocGVtRW5jb2RlZEtleSkpCisgICAgICAgIGlmIChrZXlzdG9yZUNvbnRleHQuaGFzS2V5c3RvcmUoKSAmJiAhU3RyaW5nVXRpbHMuaXNFbXB0eShwZW1FbmNvZGVkS2V5Q29udGV4dC5rZXkpKQogICAgICAgICB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb25maWd1cmF0aW9uIG11c3Qgc3BlY2lmeSB2YWx1ZSBmb3IgZWl0aGVyIGtleXN0b3JlIG9yIHByaXZhdGVfa2V5LCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBib3RoIGZvciBQRU1CYXNlZFNTbENvbnRleHRGYWN0b3J5Iik7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG91dGJvdW5kS2V5c3RvcmVDb250ZXh0Lmhhc0tleXN0b3JlKCkgJiYgIVN0cmluZ1V0aWxzLmlzRW1wdHkocGVtRW5jb2RlZE91dGJvdW5kS2V5Q29udGV4dC5rZXkpKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb25maWd1cmF0aW9uIG11c3Qgc3BlY2lmeSB2YWx1ZSBmb3IgZWl0aGVyIG91dGJvdW5kX2tleXN0b3JlIG9yIG91dGJvdW5kX3ByaXZhdGVfa2V5LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBib3RoIGZvciBQRU1CYXNlZFNTbENvbnRleHRGYWN0b3J5Iik7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTMzOCwxNyArMzcwLDQzIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGVuZm9yY2VTaW5nbGVUdXJzdGVkQ2VydGlmaWNhdGVzU291cmNlKCkKICAgICB7Ci0gICAgICAgIGlmICh0cnVzdHN0b3JlRmlsZUV4aXN0cygpICYmICFTdHJpbmdVdGlscy5pc0VtcHR5KHBlbUVuY29kZWRDZXJ0aWZpY2F0ZXMpKQorICAgICAgICBpZiAodHJ1c3RzdG9yZUZpbGVFeGlzdHMoKSAmJiAhU3RyaW5nVXRpbHMuaXNFbXB0eShwZW1FbmNvZGVkVHJ1c3RDZXJ0aWZpY2F0ZXMua2V5KSkKICAgICAgICAgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29uZmlndXJhdGlvbiBtdXN0IHNwZWNpZnkgdmFsdWUgZm9yIGVpdGhlciB0cnVzdHN0b3JlIG9yICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJ1c3RlZF9jZXJ0aWZpY2F0ZXMsIG5vdCBib3RoIGZvciBQRU1CYXNlZFNTbENvbnRleHRGYWN0b3J5Iik7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBFTUJhc2VkS2V5U3RvcmVDb250ZXh0CisgICAgeworICAgICAgICBwdWJsaWMgU3RyaW5nIGtleTsKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBwYXNzd29yZDsKKyAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gbWF5YmVGaWxlYmFzZWRLZXk7CisgICAgICAgIHB1YmxpYyBmaW5hbCBGaWxlQmFzZWRTdG9yZUNvbnRleHQgZmlsZWJhc2VkS2V5c3RvcmVDb250ZXh0OworCisgICAgICAgIHB1YmxpYyBQRU1CYXNlZEtleVN0b3JlQ29udGV4dChmaW5hbCBTdHJpbmcgZW5jb2RlZEtleSwgZmluYWwgU3RyaW5nIGdldEVuY29kZWRLZXlQYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbWF5YmVGaWxlYmFzZWRLZXksIGZpbmFsIEZpbGVCYXNlZFN0b3JlQ29udGV4dCBmaWxlYmFzZWRLZXlzdG9yZUNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMua2V5ID0gZW5jb2RlZEtleTsKKyAgICAgICAgICAgIHRoaXMucGFzc3dvcmQgPSBnZXRFbmNvZGVkS2V5UGFzc3dvcmQ7CisgICAgICAgICAgICB0aGlzLm1heWJlRmlsZWJhc2VkS2V5ID0gbWF5YmVGaWxlYmFzZWRLZXk7CisgICAgICAgICAgICB0aGlzLmZpbGViYXNlZEtleXN0b3JlQ29udGV4dCA9IGZpbGViYXNlZEtleXN0b3JlQ29udGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0tleSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtYXliZUZpbGViYXNlZEtleQorICAgICAgICAgICAgICAgICAgID8gZmlsZWJhc2VkS2V5c3RvcmVDb250ZXh0Lmhhc0tleXN0b3JlKCkKKyAgICAgICAgICAgICAgICAgICA6ICFTdHJpbmdVdGlscy5pc0VtcHR5KGtleSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgZW51bSBDb25maWdLZXkKICAgICB7CiAgICAgICAgIEVOQ09ERURfS0VZKCJwcml2YXRlX2tleSIpLAogICAgICAgICBLRVlfUEFTU1dPUkQoInByaXZhdGVfa2V5X3Bhc3N3b3JkIiksCisgICAgICAgIE9VVEJPVU5EX0VOQ09ERURfS0VZKCJvdXRib3VuZF9wcml2YXRlX2tleSIpLAorICAgICAgICBPVVRCT1VORF9FTkNPREVEX0tFWV9QQVNTV09SRCgib3V0Ym91bmRfcHJpdmF0ZV9rZXlfcGFzc3dvcmQiKSwKICAgICAgICAgRU5DT0RFRF9DRVJUSUZJQ0FURVMoInRydXN0ZWRfY2VydGlmaWNhdGVzIik7CiAKICAgICAgICAgZmluYWwgU3RyaW5nIGtleU5hbWU7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9TU0xGYWN0b3J5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9TU0xGYWN0b3J5LmphdmEKaW5kZXggZTA2ZGExZi4uZTZkYTU3NyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvU1NMRmFjdG9yeS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1NTTEZhY3RvcnkuamF2YQpAQCAtNDEsMTEgKzQxLDEyIEBACiBpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5zc2wuU3NsQ29udGV4dDsKIGltcG9ydCBpby5uZXR0eS51dGlsLlJlZmVyZW5jZUNvdW50VXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5LklTc2xDb250ZXh0RmFjdG9yeS5Tb2NrZXRUeXBlOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRElTQUJMRV9UQ0FDVElWRV9PUEVOU1NMOworCiAvKioKICAqIEEgRmFjdG9yeSBmb3IgcHJvdmlkaW5nIGFuZCBzZXR0aW5nIHVwIGNsaWVudCB7QGxpbmsgU1NMU29ja2V0fXMuIEFsc28gcHJvdmlkZXMKICAqIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGJvdGggSlNTRSB7QGxpbmsgU1NMQ29udGV4dH0gaW5zdGFuY2VzIGFzIHdlbGwgYXMgbmV0dHkge0BsaW5rIFNzbENvbnRleHR9IGluc3RhbmNlcy4KQEAgLTY0LDcgKzY1LDcgQEAKICAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG9wZW5Tc2xJc0F2YWlsYWJsZTsKICAgICBzdGF0aWMKICAgICB7Ci0gICAgICAgIGlmIChCb29sZWFuLmdldEJvb2xlYW4oQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJkaXNhYmxlX3RjYWN0aXZlX29wZW5zc2wiKSkKKyAgICAgICAgaWYgKERJU0FCTEVfVENBQ1RJVkVfT1BFTlNTTC5nZXRCb29sZWFuKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIG9wZW5Tc2xJc0F2YWlsYWJsZSA9IGZhbHNlOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJpYWxpemVycy9BYnN0cmFjdE1hcFNlcmlhbGl6ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL0Fic3RyYWN0TWFwU2VyaWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YmFlNmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJpYWxpemVycy9BYnN0cmFjdE1hcFNlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVyczsKKworaW1wb3J0IGphdmEubmlvLkJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5SYW5nZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZUJ1ZmZlckFjY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworCisvKioKKyAqIENvbW1vbiBzdXBlcmNsYXNzIGZvciB7QGxpbmsgU2V0U2VyaWFsaXplcn0gYW5kIHtAbGluayBNYXBTZXJpYWxpemVyfSwgY29uc2lkZXJpbmcgYSBzZXQgYXMgYSBtYXAgd2l0aG91dCB2YWx1ZXMuCisgKi8KK2Fic3RyYWN0IGNsYXNzIEFic3RyYWN0TWFwU2VyaWFsaXplcjxUPiBleHRlbmRzIENvbGxlY3Rpb25TZXJpYWxpemVyPFQ+Cit7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGhhc1ZhbHVlczsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisgICAgcHJvdGVjdGVkIEFic3RyYWN0TWFwU2VyaWFsaXplcihib29sZWFuIGhhc1ZhbHVlcykKKyAgICB7CisgICAgICAgIHRoaXMuaGFzVmFsdWVzID0gaGFzVmFsdWVzOworICAgICAgICBuYW1lID0gaGFzVmFsdWVzID8gIm1hcCIgOiAic2V0IjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRTbGljZUZyb21TZXJpYWxpemVkKEJ5dGVCdWZmZXIgY29sbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gY29tcGFyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZnJvemVuKQorICAgIHsKKyAgICAgICAgaWYgKGZyb20gPT0gQnl0ZUJ1ZmZlclV0aWwuVU5TRVRfQllURV9CVUZGRVIgJiYgdG8gPT0gQnl0ZUJ1ZmZlclV0aWwuVU5TRVRfQllURV9CVUZGRVIpCisgICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbjsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBpbnB1dCA9IGNvbGxlY3Rpb24uZHVwbGljYXRlKCk7CisgICAgICAgICAgICBpbnQgbiA9IHJlYWRDb2xsZWN0aW9uU2l6ZShpbnB1dCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlKTsKKyAgICAgICAgICAgIGlucHV0LnBvc2l0aW9uKGlucHV0LnBvc2l0aW9uKCkgKyBzaXplT2ZDb2xsZWN0aW9uU2l6ZSgpKTsKKyAgICAgICAgICAgIGludCBzdGFydFBvcyA9IGlucHV0LnBvc2l0aW9uKCk7CisgICAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgICAgYm9vbGVhbiBpblNsaWNlID0gZnJvbSA9PSBCeXRlQnVmZmVyVXRpbC5VTlNFVF9CWVRFX0JVRkZFUjsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHBvcyA9IGlucHV0LnBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBrZXkgPSByZWFkVmFsdWUoaW5wdXQsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgMCk7CisgICAgICAgICAgICAgICAgaW5wdXQucG9zaXRpb24oaW5wdXQucG9zaXRpb24oKSArIHNpemVPZlZhbHVlKGtleSwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlKSk7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IHBhc3NlZCB0aGUgc3RhcnQgYWxyZWFkeSwgY2hlY2sgaWYgd2UgaGF2ZSBub3cKKyAgICAgICAgICAgICAgICBpZiAoIWluU2xpY2UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgY29tcGFyaXNvbiA9IGNvbXBhcmF0b3IuY29tcGFyZUZvckNRTChmcm9tLCBrZXkpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyaXNvbiA8PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3cgd2l0aGluIHRoZSBzbGljZQorICAgICAgICAgICAgICAgICAgICAgICAgaW5TbGljZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvcyA9IHBvczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGJlZm9yZSB0aGUgc2xpY2UsIHNvIHdlIGtub3cgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXBNYXBWYWx1ZShpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE5vdyBjaGVjayBpZiB3ZSdyZSBkb25lCisgICAgICAgICAgICAgICAgaW50IGNvbXBhcmlzb24gPSB0byA9PSBCeXRlQnVmZmVyVXRpbC5VTlNFVF9CWVRFX0JVRkZFUiA/IC0xIDogY29tcGFyYXRvci5jb21wYXJlRm9yQ1FMKGtleSwgdG8pOworICAgICAgICAgICAgICAgIGlmIChjb21wYXJpc29uID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGRvbmUgYW5kIHNob3VsZG4ndCBpbmNsdWRlIHRoZSBrZXkgd2UganVzdCByZWFkCisgICAgICAgICAgICAgICAgICAgIGlucHV0LnBvc2l0aW9uKHBvcyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UnbGwgaW5jbHVkZSB0aGF0IGVsZW1lbnQKKyAgICAgICAgICAgICAgICBza2lwTWFwVmFsdWUoaW5wdXQpOyAvLyB2YWx1ZQorICAgICAgICAgICAgICAgICsrY291bnQ7CisKKyAgICAgICAgICAgICAgICAvLyBCdXQgaWYgd2Uga25vdyBpdCB3YXMgdGhlIGxhc3Qgb2YgdGhlIHNsaWNlLCB3ZSBicmVhayBlYXJseQorICAgICAgICAgICAgICAgIGlmIChjb21wYXJpc29uID09IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY291bnQgPT0gMCAmJiAhZnJvemVuKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICByZXR1cm4gY29weUFzTmV3Q29sbGVjdGlvbihjb2xsZWN0aW9uLCBjb3VudCwgc3RhcnRQb3MsIGlucHV0LnBvc2l0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gfCBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKCJOb3QgZW5vdWdoIGJ5dGVzIHRvIHJlYWQgYSAiICsgbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldEluZGV4RnJvbVNlcmlhbGl6ZWQoQnl0ZUJ1ZmZlciBjb2xsZWN0aW9uLCBCeXRlQnVmZmVyIGtleSwgQWJzdHJhY3RUeXBlPD8+IGNvbXBhcmF0b3IpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBpbnB1dCA9IGNvbGxlY3Rpb24uZHVwbGljYXRlKCk7CisgICAgICAgICAgICBpbnQgbiA9IHJlYWRDb2xsZWN0aW9uU2l6ZShpbnB1dCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlKTsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSBzaXplT2ZDb2xsZWN0aW9uU2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBrYmIgPSByZWFkVmFsdWUoaW5wdXQsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZU9mVmFsdWUoa2JiLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UpOworICAgICAgICAgICAgICAgIGludCBjb21wYXJpc29uID0gY29tcGFyYXRvci5jb21wYXJlRm9yQ1FMKGtiYiwga2V5KTsKKworICAgICAgICAgICAgICAgIGlmIChjb21wYXJpc29uID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworCisgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmlzb24gPiAwKQorICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgc2V0IGlzIGluIHNvcnRlZCBvcmRlciwgd2Uga25vdyB3ZSd2ZSBnb25lIHRvbyBmYXIgYW5kIHRoZSBlbGVtZW50IGRvZXNuJ3QgZXhpc3QKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICAgICAgLy8gY29tcGFyaXNvbiA8IDAKKyAgICAgICAgICAgICAgICBpZiAoaGFzVmFsdWVzKQorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2tpcFZhbHVlKGlucHV0LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIG9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiTm90IGVub3VnaCBieXRlcyB0byByZWFkIGEgIiArIG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJhbmdlPEludGVnZXI+IGdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKEJ5dGVCdWZmZXIgY29sbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gY29tcGFyYXRvcikKKyAgICB7CisgICAgICAgIGlmIChmcm9tID09IEJ5dGVCdWZmZXJVdGlsLlVOU0VUX0JZVEVfQlVGRkVSICYmIHRvID09IEJ5dGVCdWZmZXJVdGlsLlVOU0VUX0JZVEVfQlVGRkVSKQorICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmNsb3NlZCgwLCBJbnRlZ2VyLk1BWF9WQUxVRSk7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgaW5wdXQgPSBjb2xsZWN0aW9uLmR1cGxpY2F0ZSgpOworICAgICAgICAgICAgaW50IG4gPSByZWFkQ29sbGVjdGlvblNpemUoaW5wdXQsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSk7CisgICAgICAgICAgICBpbnB1dC5wb3NpdGlvbihpbnB1dC5wb3NpdGlvbigpICsgc2l6ZU9mQ29sbGVjdGlvblNpemUoKSk7CisgICAgICAgICAgICBpbnQgc3RhcnQgPSBmcm9tID09IEJ5dGVCdWZmZXJVdGlsLlVOU0VUX0JZVEVfQlVGRkVSID8gMCA6IC0xOworICAgICAgICAgICAgaW50IGVuZCA9IHRvID09IEJ5dGVCdWZmZXJVdGlsLlVOU0VUX0JZVEVfQlVGRkVSID8gbiA6IC0xOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCAmJiBlbmQgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgICAgIHNraXBNYXBWYWx1ZShpbnB1dCk7CisKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGtleSA9IHJlYWRWYWx1ZShpbnB1dCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCAwKTsKKyAgICAgICAgICAgICAgICBpbnB1dC5wb3NpdGlvbihpbnB1dC5wb3NpdGlvbigpICsgc2l6ZU9mVmFsdWUoa2V5LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UpKTsKKworICAgICAgICAgICAgICAgIGlmIChzdGFydCA8IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgY29tcGFyaXNvbiA9IGNvbXBhcmF0b3IuY29tcGFyZUZvckNRTChmcm9tLCBrZXkpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyaXNvbiA8PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZW5kIDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBjb21wYXJpc29uID0gY29tcGFyYXRvci5jb21wYXJlRm9yQ1FMKGtleSwgdG8pOworICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyaXNvbiA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuY2xvc2VkT3BlbigwLCAwKTsKKworICAgICAgICAgICAgaWYgKGVuZCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmNsb3NlZE9wZW4oc3RhcnQsIG4pOworCisgICAgICAgICAgICByZXR1cm4gUmFuZ2UuY2xvc2VkT3BlbihzdGFydCwgZW5kKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKCJOb3QgZW5vdWdoIGJ5dGVzIHRvIHJlYWQgYSAiICsgbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2tpcE1hcFZhbHVlKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICBpZiAoaGFzVmFsdWVzKQorICAgICAgICAgICAgc2tpcFZhbHVlKGlucHV0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJpYWxpemVycy9BYnN0cmFjdFR5cGVTZXJpYWxpemVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJpYWxpemVycy9BYnN0cmFjdFR5cGVTZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJlNGQ2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL0Fic3RyYWN0VHlwZVNlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5UeXBlU2l6ZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5UeXBlUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CisKK3B1YmxpYyBjbGFzcyBBYnN0cmFjdFR5cGVTZXJpYWxpemVyCit7CisgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKEFic3RyYWN0VHlwZTw/PiB0eXBlLCBEYXRhT3V0cHV0UGx1cyBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVXaXRoVkludExlbmd0aChVVEY4VHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UodHlwZS50b1N0cmluZygpKSwgb3V0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemVMaXN0KExpc3Q8QWJzdHJhY3RUeXBlPD8+PiB0eXBlcywgRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKHR5cGVzLnNpemUoKSk7CisgICAgICAgIGZvciAoQWJzdHJhY3RUeXBlPD8+IHR5cGUgOiB0eXBlcykKKyAgICAgICAgICAgIHNlcmlhbGl6ZSh0eXBlLCBvdXQpOworICAgIH0KKworICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBCeXRlQnVmZmVyIHJhdyA9IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoVkludExlbmd0aChpbik7CisgICAgICAgIHJldHVybiBUeXBlUGFyc2VyLnBhcnNlKFVURjhUeXBlLmluc3RhbmNlLmNvbXBvc2UocmF3KSk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBkZXNlcmlhbGl6ZUxpc3QoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBpbnQgc2l6ZSA9IChpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IHR5cGVzID0gbmV3IEFycmF5TGlzdDw+KHNpemUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgIHR5cGVzLmFkZChkZXNlcmlhbGl6ZShpbikpOworICAgICAgICByZXR1cm4gdHlwZXM7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgc2VyaWFsaXplZFNpemUoQWJzdHJhY3RUeXBlPD8+IHR5cGUpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuc2VyaWFsaXplZFNpemVXaXRoVkludExlbmd0aChVVEY4VHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UodHlwZS50b1N0cmluZygpKSk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgc2VyaWFsaXplZExpc3RTaXplKExpc3Q8QWJzdHJhY3RUeXBlPD8+PiB0eXBlcykKKyAgICB7CisgICAgICAgIGxvbmcgc2l6ZSA9IFR5cGVTaXplcy5zaXplb2ZVbnNpZ25lZFZJbnQodHlwZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChBYnN0cmFjdFR5cGU8Pz4gdHlwZSA6IHR5cGVzKQorICAgICAgICAgICAgc2l6ZSArPSBzZXJpYWxpemVkU2l6ZSh0eXBlKTsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL0Jvb2xlYW5TZXJpYWxpemVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJpYWxpemVycy9Cb29sZWFuU2VyaWFsaXplci5qYXZhCmluZGV4IGQzNzJhMmEuLjQwM2U2YjcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL0Jvb2xlYW5TZXJpYWxpemVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VyaWFsaXplcnMvQm9vbGVhblNlcmlhbGl6ZXIuamF2YQpAQCAtMjQsOCArMjQsOCBAQAogCiBwdWJsaWMgY2xhc3MgQm9vbGVhblNlcmlhbGl6ZXIgZXh0ZW5kcyBUeXBlU2VyaWFsaXplcjxCb29sZWFuPgogewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgVFJVRSA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdIHsxfSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlciBGQUxTRSA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdIHswfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIFRSVUUgPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbXSB7MX0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlciBGQUxTRSA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdIHswfSk7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW5TZXJpYWxpemVyIGluc3RhbmNlID0gbmV3IEJvb2xlYW5TZXJpYWxpemVyKCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL0NvbGxlY3Rpb25TZXJpYWxpemVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJpYWxpemVycy9Db2xsZWN0aW9uU2VyaWFsaXplci5qYXZhCmluZGV4IDE3MjJjM2QuLmI1MTRkMjQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL0NvbGxlY3Rpb25TZXJpYWxpemVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VyaWFsaXplcnMvQ29sbGVjdGlvblNlcmlhbGl6ZXIuamF2YQpAQCAtMTgsMTQgKzE4LDE3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnM7CiAKK2ltcG9ydCBqYXZhLm5pby5CdWZmZXJVbmRlcmZsb3dFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlJhbmdlOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZUJ1ZmZlckFjY2Vzc29yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVmFsdWVBY2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogCkBAIC0zNCw3OSArMzcsNDkgQEAKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdDxCeXRlQnVmZmVyPiBzZXJpYWxpemVWYWx1ZXMoVCB2YWx1ZSk7CiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBnZXRFbGVtZW50Q291bnQoVCB2YWx1ZSk7CiAKLSAgICBwdWJsaWMgYWJzdHJhY3QgPFY+IFQgZGVzZXJpYWxpemVGb3JOYXRpdmVQcm90b2NvbChWIHZhbHVlLCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBQcm90b2NvbFZlcnNpb24gdmVyc2lvbik7Ci0KLSAgICBwdWJsaWMgVCBkZXNlcmlhbGl6ZUZvck5hdGl2ZVByb3RvY29sKEJ5dGVCdWZmZXIgdmFsdWUsIFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplRm9yTmF0aXZlUHJvdG9jb2wodmFsdWUsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgdmVyc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IDxWPiB2b2lkIHZhbGlkYXRlRm9yTmF0aXZlUHJvdG9jb2woViB2YWx1ZSwgVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pOwotCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEJ5dGVCdWZmZXIgc2VyaWFsaXplKFQgaW5wdXQpCiAgICAgewogICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IHZhbHVlcyA9IHNlcmlhbGl6ZVZhbHVlcyhpbnB1dCk7Ci0gICAgICAgIC8vIFNlZSBkZXNlcmlhbGl6ZSgpIGZvciB3aHkgdXNpbmcgdGhlIHByb3RvY29sIHYzIHZhcmlhbnQgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLgotICAgICAgICByZXR1cm4gcGFjayh2YWx1ZXMsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgZ2V0RWxlbWVudENvdW50KGlucHV0KSwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKKyAgICAgICAgcmV0dXJuIHBhY2sodmFsdWVzLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIGdldEVsZW1lbnRDb3VudChpbnB1dCkpOwogICAgIH0KIAotICAgIHB1YmxpYyA8Vj4gVCBkZXNlcmlhbGl6ZShWIHZhbHVlLCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yKQorICAgIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlciBwYWNrKENvbGxlY3Rpb248Qnl0ZUJ1ZmZlcj4gdmFsdWVzLCBpbnQgZWxlbWVudHMpCiAgICAgewotICAgICAgICAvLyBUaGUgb25seSBjYXNlcyB3ZSBzZXJpYWxpemUvZGVzZXJpYWxpemUgY29sbGVjdGlvbnMgaW50ZXJuYWxseSAoaS5lLiBub3QgZm9yIHRoZSBwcm90b2NvbCBzYWtlKSwKLSAgICAgICAgLy8gaXM6Ci0gICAgICAgIC8vICAxKSB3aGVuIGNvbGxlY3Rpb25zIGFyZSBmcm96ZW4KLSAgICAgICAgLy8gIDIpIGZvciBpbnRlcm5hbCBjYWxscy4KLSAgICAgICAgLy8gSW4gYm90aCBjYXNlLCB1c2luZyB0aGUgcHJvdG9jb2wgMyB2ZXJzaW9uIHZhcmlhbnQgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLgotICAgICAgICByZXR1cm4gZGVzZXJpYWxpemVGb3JOYXRpdmVQcm90b2NvbCh2YWx1ZSwgYWNjZXNzb3IsIFByb3RvY29sVmVyc2lvbi5WMyk7CisgICAgICAgIHJldHVybiBwYWNrKHZhbHVlcywgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBlbGVtZW50cyk7CiAgICAgfQogCi0gICAgcHVibGljIDxUMT4gdm9pZCB2YWxpZGF0ZShUMSB2YWx1ZSwgVmFsdWVBY2Nlc3NvcjxUMT4gYWNjZXNzb3IpIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBTYW1lIHRoaW5nIGFzIGFib3ZlCi0gICAgICAgIHZhbGlkYXRlRm9yTmF0aXZlUHJvdG9jb2wodmFsdWUsIGFjY2Vzc29yLCBQcm90b2NvbFZlcnNpb24uVjMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlciBwYWNrKENvbGxlY3Rpb248Qnl0ZUJ1ZmZlcj4gdmFsdWVzLCBpbnQgZWxlbWVudHMsIFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBhY2sodmFsdWVzLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIGVsZW1lbnRzLCB2ZXJzaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIDxWPiBWIHBhY2soQ29sbGVjdGlvbjxWPiB2YWx1ZXMsIFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIGludCBlbGVtZW50cywgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pCisgICAgcHVibGljIHN0YXRpYyA8Vj4gViBwYWNrKENvbGxlY3Rpb248Vj4gdmFsdWVzLCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBpbnQgZWxlbWVudHMpCiAgICAgewogICAgICAgICBpbnQgc2l6ZSA9IDA7CiAgICAgICAgIGZvciAoViB2YWx1ZSA6IHZhbHVlcykKLSAgICAgICAgICAgIHNpemUgKz0gc2l6ZU9mVmFsdWUodmFsdWUsIGFjY2Vzc29yLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIHNpemUgKz0gc2l6ZU9mVmFsdWUodmFsdWUsIGFjY2Vzc29yKTsKIAotICAgICAgICBCeXRlQnVmZmVyIHJlc3VsdCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoc2l6ZU9mQ29sbGVjdGlvblNpemUoZWxlbWVudHMsIHZlcnNpb24pICsgc2l6ZSk7Ci0gICAgICAgIHdyaXRlQ29sbGVjdGlvblNpemUocmVzdWx0LCBlbGVtZW50cywgdmVyc2lvbik7CisgICAgICAgIEJ5dGVCdWZmZXIgcmVzdWx0ID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShzaXplT2ZDb2xsZWN0aW9uU2l6ZSgpICsgc2l6ZSk7CisgICAgICAgIHdyaXRlQ29sbGVjdGlvblNpemUocmVzdWx0LCBlbGVtZW50cyk7CiAgICAgICAgIGZvciAoViB2YWx1ZSA6IHZhbHVlcykKICAgICAgICAgewotICAgICAgICAgICAgd3JpdGVWYWx1ZShyZXN1bHQsIHZhbHVlLCBhY2Nlc3NvciwgdmVyc2lvbik7CisgICAgICAgICAgICB3cml0ZVZhbHVlKHJlc3VsdCwgdmFsdWUsIGFjY2Vzc29yKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYWNjZXNzb3IudmFsdWVPZigoQnl0ZUJ1ZmZlcikgcmVzdWx0LmZsaXAoKSk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHdyaXRlQ29sbGVjdGlvblNpemUoQnl0ZUJ1ZmZlciBvdXRwdXQsIGludCBlbGVtZW50cywgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHdyaXRlQ29sbGVjdGlvblNpemUoQnl0ZUJ1ZmZlciBvdXRwdXQsIGludCBlbGVtZW50cykKICAgICB7CiAgICAgICAgIG91dHB1dC5wdXRJbnQoZWxlbWVudHMpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgaW50IHJlYWRDb2xsZWN0aW9uU2l6ZShCeXRlQnVmZmVyIGlucHV0LCBQcm90b2NvbFZlcnNpb24gdmVyc2lvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiByZWFkQ29sbGVjdGlvblNpemUoaW5wdXQsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgdmVyc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyA8Vj4gaW50IHJlYWRDb2xsZWN0aW9uU2l6ZShWIHZhbHVlLCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBQcm90b2NvbFZlcnNpb24gdmVyc2lvbikKKyAgICBwdWJsaWMgc3RhdGljIDxWPiBpbnQgcmVhZENvbGxlY3Rpb25TaXplKFYgdmFsdWUsIFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IpCiAgICAgewogICAgICAgICByZXR1cm4gYWNjZXNzb3IudG9JbnQodmFsdWUpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgaW50IHNpemVPZkNvbGxlY3Rpb25TaXplKGludCBlbGVtZW50cywgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pCisgICAgcHVibGljIHN0YXRpYyBpbnQgc2l6ZU9mQ29sbGVjdGlvblNpemUoKQogICAgIHsKICAgICAgICAgcmV0dXJuIFR5cGVTaXplcy5JTlRfU0laRTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIDxWPiB2b2lkIHdyaXRlVmFsdWUoQnl0ZUJ1ZmZlciBvdXRwdXQsIFYgdmFsdWUsIFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uKQorICAgIHB1YmxpYyBzdGF0aWMgPFY+IHZvaWQgd3JpdGVWYWx1ZShCeXRlQnVmZmVyIG91dHB1dCwgViB2YWx1ZSwgVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvcikKICAgICB7CiAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQogICAgICAgICB7CkBAIC0xMTgsNyArOTEsNyBAQAogICAgICAgICBhY2Nlc3Nvci53cml0ZSh2YWx1ZSwgb3V0cHV0KTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIDxWPiBWIHJlYWRWYWx1ZShWIGlucHV0LCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBpbnQgb2Zmc2V0LCBQcm90b2NvbFZlcnNpb24gdmVyc2lvbikKKyAgICBwdWJsaWMgc3RhdGljIDxWPiBWIHJlYWRWYWx1ZShWIGlucHV0LCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBpbnQgb2Zmc2V0KQogICAgIHsKICAgICAgICAgaW50IHNpemUgPSBhY2Nlc3Nvci5nZXRJbnQoaW5wdXQsIG9mZnNldCk7CiAgICAgICAgIGlmIChzaXplIDwgMCkKQEAgLTEyNywyNyArMTAwLDI3IEBACiAgICAgICAgIHJldHVybiBhY2Nlc3Nvci5zbGljZShpbnB1dCwgb2Zmc2V0ICsgVHlwZVNpemVzLklOVF9TSVpFLCBzaXplKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIDxWPiBWIHJlYWROb25OdWxsVmFsdWUoViBpbnB1dCwgVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgaW50IG9mZnNldCwgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pCisgICAgcHVibGljIHN0YXRpYyA8Vj4gViByZWFkTm9uTnVsbFZhbHVlKFYgaW5wdXQsIFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIGludCBvZmZzZXQpCiAgICAgewotICAgICAgICBWIHZhbHVlID0gcmVhZFZhbHVlKGlucHV0LCBhY2Nlc3Nvciwgb2Zmc2V0LCB2ZXJzaW9uKTsKKyAgICAgICAgViB2YWx1ZSA9IHJlYWRWYWx1ZShpbnB1dCwgYWNjZXNzb3IsIG9mZnNldCk7CiAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQogICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oIk51bGwgdmFsdWUgcmVhZCB3aGVuIG5vdCBhbGxvd2VkIik7CiAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgc2tpcFZhbHVlKEJ5dGVCdWZmZXIgaW5wdXQsIFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uKQorICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBza2lwVmFsdWUoQnl0ZUJ1ZmZlciBpbnB1dCkKICAgICB7CiAgICAgICAgIGludCBzaXplID0gaW5wdXQuZ2V0SW50KCk7CiAgICAgICAgIGlucHV0LnBvc2l0aW9uKGlucHV0LnBvc2l0aW9uKCkgKyBzaXplKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIDxWPiBpbnQgc2tpcFZhbHVlKFYgaW5wdXQsIFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIGludCBvZmZzZXQsIFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uKQorICAgIHB1YmxpYyBzdGF0aWMgPFY+IGludCBza2lwVmFsdWUoViBpbnB1dCwgVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgaW50IG9mZnNldCkKICAgICB7CiAgICAgICAgIGludCBzaXplID0gYWNjZXNzb3IuZ2V0SW50KGlucHV0LCBvZmZzZXQpOwogICAgICAgICByZXR1cm4gVHlwZVNpemVzLnNpemVvZihzaXplKSArIHNpemU7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyA8Vj4gaW50IHNpemVPZlZhbHVlKFYgdmFsdWUsIFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uKQorICAgIHB1YmxpYyBzdGF0aWMgPFY+IGludCBzaXplT2ZWYWx1ZShWIHZhbHVlLCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yKQogICAgIHsKICAgICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyA0IDogNCArIGFjY2Vzc29yLnNpemUodmFsdWUpOwogICAgIH0KQEAgLTE4OCwyMCArMTYxLDcyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZyb3plbik7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiBhbiBlbGVtZW50IGluIGEgc2VyaWFsaXplZCBjb2xsZWN0aW9uLgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNldHMgYW5kIG1hcHMsIGJ1dCBub3QgYnkgbGlzdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29sbGVjdGlvbiBUaGUgc2VyaWFsaXplZCBjb2xsZWN0aW9uLiBUaGlzIGNhbm5vdCBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB3aGljaCB0aGUgaW5kZXggbXVzdCBiZSBmb3VuZC4gVGhpcyBjYW5ub3QgYmUge0Bjb2RlIG51bGx9IG5vcgorICAgICAqIHtAbGluayBCeXRlQnVmZmVyVXRpbCNVTlNFVF9CWVRFX0JVRkZFUn0pLgorICAgICAqIEBwYXJhbSBjb21wYXJhdG9yIFRoZSB0eXBlIHRvIHVzZSB0byBjb21wYXJlIHRoZSB7QGNvZGUga2V5fSB2YWx1ZSB0byB0aG9zZSBpbiB0aGUgY29sbGVjdGlvbi4KKyAgICAgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGgge0Bjb2RlIGtleX0gaWYgb25lIGV4aXN0cywge0Bjb2RlIC0xfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRJbmRleEZyb21TZXJpYWxpemVkKEJ5dGVCdWZmZXIgY29sbGVjdGlvbiwgQnl0ZUJ1ZmZlciBrZXksIEFic3RyYWN0VHlwZTw/PiBjb21wYXJhdG9yKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJhbmdlIG9mIGluZGV4ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIHJhbmdlIG9mIGVsZW1lbnRzIGluIHRoZSBzZXJpYWxpemVkIGNvbGxlY3Rpb24uCisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IHRoaXMgaXMgb25seSBzdXBwb3J0ZWQgYnkgc2V0cyBhbmQgbWFwcywgYnV0IG5vdCBieSBsaXN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIFRoZSBzZXJpYWxpemVkIGNvbGxlY3Rpb24uIFRoaXMgY2Fubm90IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAcGFyYW0gZnJvbSAgVGhlIGxlZnQgYm91bmQgb2YgdGhlIHNsaWNlIHRvIGV4dHJhY3QuIFRoaXMgY2Fubm90IGJlIHtAY29kZSBudWxsfSBidXQgaWYgdGhpcyBpcworICAgICAqIHtAbGluayBCeXRlQnVmZmVyVXRpbCNVTlNFVF9CWVRFX0JVRkZFUn0sIHRoZW4gdGhlIHJldHVybmVkIHNsaWNlIHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb2xsZWN0aW9uLgorICAgICAqIEBwYXJhbSB0byBUaGUgbGVmdCBib3VuZCBvZiB0aGUgc2xpY2UgdG8gZXh0cmFjdC4gVGhpcyBjYW5ub3QgYmUge0Bjb2RlIG51bGx9IGJ1dCBpZiB0aGlzIGlzCisgICAgICoge0BsaW5rIEJ5dGVCdWZmZXJVdGlsI1VOU0VUX0JZVEVfQlVGRkVSfSwgdGhlbiB0aGUgcmV0dXJuZWQgc2xpY2UgZW5kcyBhdCB0aGUgZW5kIG9mIHRoZSBjb2xsZWN0aW9uLgorICAgICAqIEBwYXJhbSBjb21wYXJhdG9yIFRoZSB0eXBlIHRvIHVzZSB0byBjb21wYXJlIHRoZSB7QGNvZGUgZnJvbX0gYW5kIHtAY29kZSB0b30gdmFsdWVzIHRvIHRob3NlIGluIHRoZSBjb2xsZWN0aW9uLgorICAgICAqIEByZXR1cm4gVGhlIHJhbmdlIG9mIGluZGV4ZXMgY29ycmVzcG9uZGluZyB0byBzcGVjaWZpZWQgcmFuZ2Ugb2YgZWxlbWVudHMuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFJhbmdlPEludGVnZXI+IGdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKEJ5dGVCdWZmZXIgY29sbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gY29tcGFyYXRvcik7CisKKyAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgbmV3IHNlcmlhbGl6ZWQgbWFwIGNvbXBvc2VkIGZyb20gdGhlIGRhdGEgZnJvbSB7QGNvZGUgaW5wdXR9IGJldHdlZW4ge0Bjb2RlIHN0YXJ0UG9zfQogICAgICAqIChpbmNsdXNpdmUpIGFuZCB7QGNvZGUgZW5kUG9zfSAoZXhjbHVzaXZlKSwgYXNzdW1pbmcgdGhhdCBkYXRhIGhvbGRzIHtAY29kZSBjb3VudH0gZWxlbWVudHMuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIEJ5dGVCdWZmZXIgY29weUFzTmV3Q29sbGVjdGlvbihCeXRlQnVmZmVyIGlucHV0LCBpbnQgY291bnQsIGludCBzdGFydFBvcywgaW50IGVuZFBvcywgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pCisgICAgcHJvdGVjdGVkIEJ5dGVCdWZmZXIgY29weUFzTmV3Q29sbGVjdGlvbihCeXRlQnVmZmVyIGlucHV0LCBpbnQgY291bnQsIGludCBzdGFydFBvcywgaW50IGVuZFBvcykKICAgICB7Ci0gICAgICAgIGludCBzaXplTGVuID0gc2l6ZU9mQ29sbGVjdGlvblNpemUoY291bnQsIHZlcnNpb24pOworICAgICAgICBpbnQgc2l6ZUxlbiA9IHNpemVPZkNvbGxlY3Rpb25TaXplKCk7CiAgICAgICAgIGlmIChjb3VudCA9PSAwKQogICAgICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXIuYWxsb2NhdGUoc2l6ZUxlbik7CiAKICAgICAgICAgaW50IGJvZHlMZW4gPSBlbmRQb3MgLSBzdGFydFBvczsKICAgICAgICAgQnl0ZUJ1ZmZlciBvdXRwdXQgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKHNpemVMZW4gKyBib2R5TGVuKTsKLSAgICAgICAgd3JpdGVDb2xsZWN0aW9uU2l6ZShvdXRwdXQsIGNvdW50LCB2ZXJzaW9uKTsKKyAgICAgICAgd3JpdGVDb2xsZWN0aW9uU2l6ZShvdXRwdXQsIGNvdW50KTsKICAgICAgICAgb3V0cHV0LnBvc2l0aW9uKDApOwogICAgICAgICBCeXRlQnVmZmVyVXRpbC5jb3B5Qnl0ZXMoaW5wdXQsIHN0YXJ0UG9zLCBvdXRwdXQsIHNpemVMZW4sIGJvZHlMZW4pOwogICAgICAgICByZXR1cm4gb3V0cHV0OwogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZvckVhY2goQnl0ZUJ1ZmZlciBpbnB1dCwgQ29uc3VtZXI8Qnl0ZUJ1ZmZlcj4gYWN0aW9uKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjb2xsZWN0aW9uU2l6ZSA9IHJlYWRDb2xsZWN0aW9uU2l6ZShpbnB1dCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlKTsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSBzaXplT2ZDb2xsZWN0aW9uU2l6ZSgpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbGxlY3Rpb25TaXplOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciB2YWx1ZSA9IHJlYWRWYWx1ZShpbnB1dCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIG9mZnNldCArPSBzaXplT2ZWYWx1ZSh2YWx1ZSwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlKTsKKworICAgICAgICAgICAgICAgIGFjdGlvbi5hY2NlcHQodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gfCBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKCJOb3QgZW5vdWdoIGJ5dGVzIHRvIHJlYWQgYSBzZXQiKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL0R1cmF0aW9uU2VyaWFsaXplci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VyaWFsaXplcnMvRHVyYXRpb25TZXJpYWxpemVyLmphdmEKaW5kZXggMjU0YjJiMC4uNzgzMjZlMSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VyaWFsaXplcnMvRHVyYXRpb25TZXJpYWxpemVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VyaWFsaXplcnMvRHVyYXRpb25TZXJpYWxpemVyLmphdmEKQEAgLTE3LDkgKzE3LDYgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVyczsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLQogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuRHVyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5WYWx1ZUFjY2Vzc29yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0QnVmZmVyOwpAQCAtMjcsNiArMjQsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnZpbnQuVkludENvZGluZzsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKwogcHVibGljIGZpbmFsIGNsYXNzIER1cmF0aW9uU2VyaWFsaXplciBleHRlbmRzIFR5cGVTZXJpYWxpemVyPER1cmF0aW9uPgogewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRHVyYXRpb25TZXJpYWxpemVyIGluc3RhbmNlID0gbmV3IER1cmF0aW9uU2VyaWFsaXplcigpOwpAQCAtNjUsOCArNjUsOCBAQAogCiAgICAgICAgIHRyeSAoRGF0YUlucHV0QnVmZmVyIGluID0gbmV3IERhdGFJbnB1dEJ1ZmZlcihhY2Nlc3Nvci50b0J1ZmZlcih2YWx1ZSksIHRydWUpKSAgLy8gVE9ETzogbWFrZSBhIHZhbHVlIGlucHV0IGJ1ZmZlcgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbW9udGhzID0gKGludCkgaW4ucmVhZFZJbnQoKTsKLSAgICAgICAgICAgIGludCBkYXlzID0gKGludCkgaW4ucmVhZFZJbnQoKTsKKyAgICAgICAgICAgIGludCBtb250aHMgPSBpbi5yZWFkVkludDMyKCk7CisgICAgICAgICAgICBpbnQgZGF5cyA9IGluLnJlYWRWSW50MzIoKTsKICAgICAgICAgICAgIGxvbmcgbmFub3NlY29uZHMgPSBpbi5yZWFkVkludCgpOwogICAgICAgICAgICAgcmV0dXJuIER1cmF0aW9uLm5ld0luc3RhbmNlKG1vbnRocywgZGF5cywgbmFub3NlY29uZHMpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJpYWxpemVycy9MaXN0U2VyaWFsaXplci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VyaWFsaXplcnMvTGlzdFNlcmlhbGl6ZXIuamF2YQppbmRleCA3YTJmNjM0Li5mMTBlOGY3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJpYWxpemVycy9MaXN0U2VyaWFsaXplci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL0xpc3RTZXJpYWxpemVyLmphdmEKQEAgLTI1LDI0ICsyNSwyNyBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRNYXA7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuUmFuZ2U7CisKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5UeXBlU2l6ZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlQnVmZmVyQWNjZXNzb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5WYWx1ZUFjY2Vzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CiAKIHB1YmxpYyBjbGFzcyBMaXN0U2VyaWFsaXplcjxUPiBleHRlbmRzIENvbGxlY3Rpb25TZXJpYWxpemVyPExpc3Q8VD4+CiB7CiAgICAgLy8gaW50ZXJuaW5nIGluc3RhbmNlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbmN1cnJlbnRNYXA8VHlwZVNlcmlhbGl6ZXI8Pz4sIExpc3RTZXJpYWxpemVyPiBpbnN0YW5jZXMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8VHlwZVNlcmlhbGl6ZXI8Pz4sIExpc3RTZXJpYWxpemVyPigpOworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uY3VycmVudE1hcDxUeXBlU2VyaWFsaXplcjw/PiwgTGlzdFNlcmlhbGl6ZXI+IGluc3RhbmNlcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CiAKICAgICBwdWJsaWMgZmluYWwgVHlwZVNlcmlhbGl6ZXI8VD4gZWxlbWVudHM7CiAKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgc3RhdGljIDxUPiBMaXN0U2VyaWFsaXplcjxUPiBnZXRJbnN0YW5jZShUeXBlU2VyaWFsaXplcjxUPiBlbGVtZW50cykKICAgICB7CiAgICAgICAgIExpc3RTZXJpYWxpemVyPFQ+IHQgPSBpbnN0YW5jZXMuZ2V0KGVsZW1lbnRzKTsKICAgICAgICAgaWYgKHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHQgPSBpbnN0YW5jZXMuY29tcHV0ZUlmQWJzZW50KGVsZW1lbnRzLCBrIC0+IG5ldyBMaXN0U2VyaWFsaXplcjw+KGspICk7CisgICAgICAgICAgICB0ID0gaW5zdGFuY2VzLmNvbXB1dGVJZkFic2VudChlbGVtZW50cywgTGlzdFNlcmlhbGl6ZXI6Om5ldyk7CiAgICAgICAgIHJldHVybiB0OwogICAgIH0KIApAQCAtNTEsNiArNTQsNyBAQAogICAgICAgICB0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIExpc3Q8Qnl0ZUJ1ZmZlcj4gc2VyaWFsaXplVmFsdWVzKExpc3Q8VD4gdmFsdWVzKQogICAgIHsKICAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBvdXRwdXQgPSBuZXcgQXJyYXlMaXN0PD4odmFsdWVzLnNpemUoKSk7CkBAIC01OSwyMSArNjMsMjMgQEAKICAgICAgICAgcmV0dXJuIG91dHB1dDsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldEVsZW1lbnRDb3VudChMaXN0PFQ+IHZhbHVlKQogICAgIHsKICAgICAgICAgcmV0dXJuIHZhbHVlLnNpemUoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgPFY+IHZvaWQgdmFsaWRhdGVGb3JOYXRpdmVQcm90b2NvbChWIGlucHV0LCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBQcm90b2NvbFZlcnNpb24gdmVyc2lvbikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IHZvaWQgdmFsaWRhdGUoViBpbnB1dCwgVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvcikKICAgICB7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbiA9IHJlYWRDb2xsZWN0aW9uU2l6ZShpbnB1dCwgYWNjZXNzb3IsIHZlcnNpb24pOwotICAgICAgICAgICAgaW50IG9mZnNldCA9IHNpemVPZkNvbGxlY3Rpb25TaXplKG4sIHZlcnNpb24pOworICAgICAgICAgICAgaW50IG4gPSByZWFkQ29sbGVjdGlvblNpemUoaW5wdXQsIGFjY2Vzc29yKTsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSBzaXplT2ZDb2xsZWN0aW9uU2l6ZSgpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgViB2YWx1ZSA9IHJlYWROb25OdWxsVmFsdWUoaW5wdXQsIGFjY2Vzc29yLCBvZmZzZXQsIHZlcnNpb24pOwotICAgICAgICAgICAgICAgIG9mZnNldCArPSBzaXplT2ZWYWx1ZSh2YWx1ZSwgYWNjZXNzb3IsIHZlcnNpb24pOworICAgICAgICAgICAgICAgIFYgdmFsdWUgPSByZWFkTm9uTnVsbFZhbHVlKGlucHV0LCBhY2Nlc3Nvciwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZU9mVmFsdWUodmFsdWUsIGFjY2Vzc29yKTsKICAgICAgICAgICAgICAgICBlbGVtZW50cy52YWxpZGF0ZSh2YWx1ZSwgYWNjZXNzb3IpOwogICAgICAgICAgICAgfQogCkBAIC04NiwxMiArOTIsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyA8Vj4gTGlzdDxUPiBkZXNlcmlhbGl6ZUZvck5hdGl2ZVByb3RvY29sKFYgaW5wdXQsIFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gTGlzdDxUPiBkZXNlcmlhbGl6ZShWIGlucHV0LCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yKQogICAgIHsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBuID0gcmVhZENvbGxlY3Rpb25TaXplKGlucHV0LCBhY2Nlc3NvciwgdmVyc2lvbik7Ci0gICAgICAgICAgICBpbnQgb2Zmc2V0ID0gc2l6ZU9mQ29sbGVjdGlvblNpemUobiwgdmVyc2lvbik7CisgICAgICAgICAgICBpbnQgbiA9IHJlYWRDb2xsZWN0aW9uU2l6ZShpbnB1dCwgYWNjZXNzb3IpOworICAgICAgICAgICAgaW50IG9mZnNldCA9IHNpemVPZkNvbGxlY3Rpb25TaXplKCk7CiAKICAgICAgICAgICAgIGlmIChuIDwgMCkKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiVGhlIGRhdGEgY2Fubm90IGJlIGRlc2VyaWFsaXplZCBhcyBhIGxpc3QiKTsKQEAgLTEwMCw3ICsxMDcsNyBAQAogICAgICAgICAgICAgLy8gSW4gc3VjaCBhIGNhc2Ugd2UgZG8gbm90IHdhbnQgdG8gaW5pdGlhbGl6ZSB0aGUgbGlzdCB3aXRoIHRoYXQgc2l6ZSBhcyBpdCBjYW4gcmVzdWx0CiAgICAgICAgICAgICAvLyBpbiBhbiBPT00gKHNlZSBDQVNTQU5EUkEtMTI2MTgpLiBPbiB0aGUgb3RoZXIgaGFuZCB3ZSBkbyBub3Qgd2FudCB0byBoYXZlIHRvIHJlc2l6ZSB0aGUgbGlzdAogICAgICAgICAgICAgLy8gaWYgd2UgY2FuIGF2b2lkIGl0LCBzbyB3ZSBwdXQgYSByZWFzb25hYmxlIGxpbWl0IG9uIHRoZSBpbml0aWFsQ2FwYWNpdHkuCi0gICAgICAgICAgICBMaXN0PFQ+IGwgPSBuZXcgQXJyYXlMaXN0PFQ+KE1hdGgubWluKG4sIDI1NikpOworICAgICAgICAgICAgTGlzdDxUPiBsID0gbmV3IEFycmF5TGlzdDw+KE1hdGgubWluKG4sIDI1NikpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy8gQ0FTU0FORFJBLTY4Mzk6ICJXZSBjYW4gaGF2ZSBudWxscyBpbiBsaXN0cyB0aGF0IGFyZSB1c2VkIGZvciBJTiB2YWx1ZXMiCkBAIC0xMDksOCArMTE2LDggQEAKICAgICAgICAgICAgICAgICAvLyBmb3IgaXQsIGJ1dCBzaG91bGQgbGlrZWx5IGJlIGNoYW5nZWQgdG8gcmVhZE5vbk51bGwuIFZhbGlkYXRlIGhhcyBiZWVuCiAgICAgICAgICAgICAgICAgLy8gY2hhbmdlZCB0byB0aHJvdyBvbiBudWxsIGVsZW1lbnRzIGFzIG90aGVyd2lzZSBpdCB3b3VsZCBOUEUsIGFuZCBpdCdzIHVuY2xlYXIKICAgICAgICAgICAgICAgICAvLyBpZiBjYWxsZXJzIGNvdWxkIGhhbmRsZSBudWxsIGVsZW1lbnRzLgotICAgICAgICAgICAgICAgIFYgZGF0YWJiID0gcmVhZFZhbHVlKGlucHV0LCBhY2Nlc3Nvciwgb2Zmc2V0LCB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZU9mVmFsdWUoZGF0YWJiLCBhY2Nlc3NvciwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgViBkYXRhYmIgPSByZWFkVmFsdWUoaW5wdXQsIGFjY2Vzc29yLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIG9mZnNldCArPSBzaXplT2ZWYWx1ZShkYXRhYmIsIGFjY2Vzc29yKTsKICAgICAgICAgICAgICAgICBpZiAoZGF0YWJiICE9IG51bGwpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy52YWxpZGF0ZShkYXRhYmIsIGFjY2Vzc29yKTsKQEAgLTE0Miw4ICsxNDksOCBAQAogICAgIHsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBzID0gcmVhZENvbGxlY3Rpb25TaXplKGlucHV0LCBhY2Nlc3NvciwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKLSAgICAgICAgICAgIGludCBvZmZzZXQgPSBzaXplT2ZDb2xsZWN0aW9uU2l6ZShzLCBQcm90b2NvbFZlcnNpb24uVjMpOworICAgICAgICAgICAgaW50IHMgPSByZWFkQ29sbGVjdGlvblNpemUoaW5wdXQsIGFjY2Vzc29yKTsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSBzaXplT2ZDb2xsZWN0aW9uU2l6ZSgpOwogCiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHM7IGkrKykKICAgICAgICAgICAgIHsKQEAgLTE3OCw4ICsxODUsOCBAQAogICAgIHsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBuID0gcmVhZENvbGxlY3Rpb25TaXplKGlucHV0LCBhY2Nlc3NvciwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKLSAgICAgICAgICAgIGludCBvZmZzZXQgPSBzaXplT2ZDb2xsZWN0aW9uU2l6ZShuLCBQcm90b2NvbFZlcnNpb24uVjMpOworICAgICAgICAgICAgaW50IG4gPSByZWFkQ29sbGVjdGlvblNpemUoaW5wdXQsIGFjY2Vzc29yKTsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSBzaXplT2ZDb2xsZWN0aW9uU2l6ZSgpOwogICAgICAgICAgICAgaWYgKG4gPD0gaW5kZXgpCiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAKQEAgLTE4OCw3ICsxOTUsNyBAQAogICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSBhY2Nlc3Nvci5nZXRJbnQoaW5wdXQsIG9mZnNldCk7CiAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IFR5cGVTaXplcy5JTlRfU0laRSArIGxlbmd0aDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZWFkVmFsdWUoaW5wdXQsIGFjY2Vzc29yLCBvZmZzZXQsIFByb3RvY29sVmVyc2lvbi5WMyk7CisgICAgICAgICAgICByZXR1cm4gcmVhZFZhbHVlKGlucHV0LCBhY2Nlc3Nvciwgb2Zmc2V0KTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uIHwgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKQogICAgICAgICB7CkBAIC0yMDEsNiArMjA4LDcgQEAKICAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoaW5wdXQsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgaW5kZXgpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoTGlzdDxUPiB2YWx1ZSkKICAgICB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwpAQCAtMjE4LDYgKzIyNiw4IEBACiAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKICAgICBwdWJsaWMgQ2xhc3M8TGlzdDxUPj4gZ2V0VHlwZSgpCiAgICAgewogICAgICAgICByZXR1cm4gKENsYXNzKSBMaXN0LmNsYXNzOwpAQCAtMjI2LDcgKzIzNiw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0U2VyaWFsaXplZFZhbHVlKEJ5dGVCdWZmZXIgY29sbGVjdGlvbiwgQnl0ZUJ1ZmZlciBrZXksIEFic3RyYWN0VHlwZTw/PiBjb21wYXJhdG9yKQogICAgIHsKLSAgICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgc2VsZWN0aW5nIGFuIGVsZW1lbnQgb2YgYSBsaXN0IHNvIHdlIGRvbid0IG5lZWQgdGhpcy4KKyAgICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgc2VsZWN0aW5nIGFuIGVsZW1lbnQgb2YgYSBsaXN0LCBzbyB3ZSBkb24ndCBuZWVkIHRoaXMuCiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KIApAQCAtMjM3LDcgKzI0NywyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IGNvbXBhcmF0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZyb3plbikKICAgICB7Ci0gICAgICAgIC8vIFdlIGRvbid0IGFsbG93IHNsaWNpbmcgb2YgbGlzdCBzbyB3ZSBkb24ndCBuZWVkIHRoaXMuCisgICAgICAgIC8vIFdlIGRvbid0IGFsbG93IHNsaWNpbmcgb2YgbGlzdHMsIHNvIHdlIGRvbid0IG5lZWQgdGhpcy4KKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRJbmRleEZyb21TZXJpYWxpemVkKEJ5dGVCdWZmZXIgY29sbGVjdGlvbiwgQnl0ZUJ1ZmZlciBrZXksIEFic3RyYWN0VHlwZTw/PiBjb21wYXJhdG9yKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJhbmdlPEludGVnZXI+IGdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKEJ5dGVCdWZmZXIgY29sbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gY29tcGFyYXRvcikKKyAgICB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL01hcFNlcmlhbGl6ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL01hcFNlcmlhbGl6ZXIuamF2YQppbmRleCAyZTM2M2I0Li45ZWIwNjQyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJpYWxpemVycy9NYXBTZXJpYWxpemVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VyaWFsaXplcnMvTWFwU2VyaWFsaXplci5qYXZhCkBAIC0yMCw0OSArMjAsNTUgQEAKIAogaW1wb3J0IGphdmEubmlvLkJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZUJ1ZmZlckFjY2Vzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVmFsdWVDb21wYXJhdG9yczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlZhbHVlQWNjZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlZhbHVlQ29tcGFyYXRvcnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKIAotcHVibGljIGNsYXNzIE1hcFNlcmlhbGl6ZXI8SywgVj4gZXh0ZW5kcyBDb2xsZWN0aW9uU2VyaWFsaXplcjxNYXA8SywgVj4+CitwdWJsaWMgY2xhc3MgTWFwU2VyaWFsaXplcjxLLCBWPiBleHRlbmRzIEFic3RyYWN0TWFwU2VyaWFsaXplcjxNYXA8SywgVj4+CiB7CiAgICAgLy8gaW50ZXJuaW5nIGluc3RhbmNlcworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uY3VycmVudE1hcDxQYWlyPFR5cGVTZXJpYWxpemVyPD8+LCBUeXBlU2VyaWFsaXplcjw/Pj4sIE1hcFNlcmlhbGl6ZXI+IGluc3RhbmNlcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CiAKICAgICBwdWJsaWMgZmluYWwgVHlwZVNlcmlhbGl6ZXI8Sz4ga2V5czsKICAgICBwdWJsaWMgZmluYWwgVHlwZVNlcmlhbGl6ZXI8Vj4gdmFsdWVzOwogICAgIHByaXZhdGUgZmluYWwgVmFsdWVDb21wYXJhdG9ycyBjb21wYXJhdG9yczsKIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBzdGF0aWMgPEssIFY+IE1hcFNlcmlhbGl6ZXI8SywgVj4gZ2V0SW5zdGFuY2UoVHlwZVNlcmlhbGl6ZXI8Sz4ga2V5cywgVHlwZVNlcmlhbGl6ZXI8Vj4gdmFsdWVzLCBWYWx1ZUNvbXBhcmF0b3JzIGNvbXBhcmF0b3JzKQogICAgIHsKICAgICAgICAgUGFpcjxUeXBlU2VyaWFsaXplcjw/PiwgVHlwZVNlcmlhbGl6ZXI8Pz4+IHAgPSBQYWlyLmNyZWF0ZShrZXlzLCB2YWx1ZXMpOwogICAgICAgICBNYXBTZXJpYWxpemVyPEssIFY+IHQgPSBpbnN0YW5jZXMuZ2V0KHApOwogICAgICAgICBpZiAodCA9PSBudWxsKQotICAgICAgICAgICAgdCA9IGluc3RhbmNlcy5jb21wdXRlSWZBYnNlbnQocCwgayAtPiBuZXcgTWFwU2VyaWFsaXplcjw+KGsubGVmdCwgay5yaWdodCwgY29tcGFyYXRvcnMpICk7CisgICAgICAgICAgICB0ID0gaW5zdGFuY2VzLmNvbXB1dGVJZkFic2VudChwLCBrIC0+IG5ldyBNYXBTZXJpYWxpemVyPD4oay5sZWZ0LCBrLnJpZ2h0LCBjb21wYXJhdG9ycykpOwogICAgICAgICByZXR1cm4gdDsKICAgICB9CiAKICAgICBwcml2YXRlIE1hcFNlcmlhbGl6ZXIoVHlwZVNlcmlhbGl6ZXI8Sz4ga2V5cywgVHlwZVNlcmlhbGl6ZXI8Vj4gdmFsdWVzLCBWYWx1ZUNvbXBhcmF0b3JzIGNvbXBhcmF0b3JzKQogICAgIHsKKyAgICAgICAgc3VwZXIodHJ1ZSk7CiAgICAgICAgIHRoaXMua2V5cyA9IGtleXM7CiAgICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzOwogICAgICAgICB0aGlzLmNvbXBhcmF0b3JzID0gY29tcGFyYXRvcnM7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIExpc3Q8Qnl0ZUJ1ZmZlcj4gc2VyaWFsaXplVmFsdWVzKE1hcDxLLCBWPiBtYXApCiAgICAgewogICAgICAgICBMaXN0PFBhaXI8Qnl0ZUJ1ZmZlciwgQnl0ZUJ1ZmZlcj4+IHBhaXJzID0gbmV3IEFycmF5TGlzdDw+KG1hcC5zaXplKCkpOwogICAgICAgICBmb3IgKE1hcC5FbnRyeTxLLCBWPiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKQogICAgICAgICAgICAgcGFpcnMuYWRkKFBhaXIuY3JlYXRlKGtleXMuc2VyaWFsaXplKGVudHJ5LmdldEtleSgpKSwgdmFsdWVzLnNlcmlhbGl6ZShlbnRyeS5nZXRWYWx1ZSgpKSkpOwotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHBhaXJzLCAobCwgcikgLT4gY29tcGFyYXRvcnMuYnVmZmVyLmNvbXBhcmUobC5sZWZ0LCByLmxlZnQpKTsKKyAgICAgICAgcGFpcnMuc29ydCgobCwgcikgLT4gY29tcGFyYXRvcnMuYnVmZmVyLmNvbXBhcmUobC5sZWZ0LCByLmxlZnQpKTsKICAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBidWZmZXJzID0gbmV3IEFycmF5TGlzdDw+KHBhaXJzLnNpemUoKSAqIDIpOwogICAgICAgICBmb3IgKFBhaXI8Qnl0ZUJ1ZmZlciwgQnl0ZUJ1ZmZlcj4gcCA6IHBhaXJzKQogICAgICAgICB7CkBAIC03MiwyOCArNzgsMzAgQEAKICAgICAgICAgcmV0dXJuIGJ1ZmZlcnM7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRFbGVtZW50Q291bnQoTWFwPEssIFY+IHZhbHVlKQogICAgIHsKICAgICAgICAgcmV0dXJuIHZhbHVlLnNpemUoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgPFQ+IHZvaWQgdmFsaWRhdGVGb3JOYXRpdmVQcm90b2NvbChUIGlucHV0LCBWYWx1ZUFjY2Vzc29yPFQ+IGFjY2Vzc29yLCBQcm90b2NvbFZlcnNpb24gdmVyc2lvbikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IHZvaWQgdmFsaWRhdGUoVCBpbnB1dCwgVmFsdWVBY2Nlc3NvcjxUPiBhY2Nlc3NvcikKICAgICB7CiAgICAgICAgIHRyeQogICAgICAgICB7CiAgICAgICAgICAgICAvLyBFbXB0eSB2YWx1ZXMgYXJlIHN0aWxsIHZhbGlkLgogICAgICAgICAgICAgaWYgKGFjY2Vzc29yLmlzRW1wdHkoaW5wdXQpKSByZXR1cm47Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCBuID0gcmVhZENvbGxlY3Rpb25TaXplKGlucHV0LCBhY2Nlc3NvciwgdmVyc2lvbik7Ci0gICAgICAgICAgICBpbnQgb2Zmc2V0ID0gc2l6ZU9mQ29sbGVjdGlvblNpemUobiwgdmVyc2lvbik7CisKKyAgICAgICAgICAgIGludCBuID0gcmVhZENvbGxlY3Rpb25TaXplKGlucHV0LCBhY2Nlc3Nvcik7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gc2l6ZU9mQ29sbGVjdGlvblNpemUoKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFQga2V5ID0gcmVhZE5vbk51bGxWYWx1ZShpbnB1dCwgYWNjZXNzb3IsIG9mZnNldCwgdmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVPZlZhbHVlKGtleSwgYWNjZXNzb3IsIHZlcnNpb24pOworICAgICAgICAgICAgICAgIFQga2V5ID0gcmVhZE5vbk51bGxWYWx1ZShpbnB1dCwgYWNjZXNzb3IsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVPZlZhbHVlKGtleSwgYWNjZXNzb3IpOwogICAgICAgICAgICAgICAgIGtleXMudmFsaWRhdGUoa2V5LCBhY2Nlc3Nvcik7CiAKLSAgICAgICAgICAgICAgICBUIHZhbHVlID0gcmVhZE5vbk51bGxWYWx1ZShpbnB1dCwgYWNjZXNzb3IsIG9mZnNldCwgdmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVPZlZhbHVlKHZhbHVlLCBhY2Nlc3NvciwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgVCB2YWx1ZSA9IHJlYWROb25OdWxsVmFsdWUoaW5wdXQsIGFjY2Vzc29yLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIG9mZnNldCArPSBzaXplT2ZWYWx1ZSh2YWx1ZSwgYWNjZXNzb3IpOwogICAgICAgICAgICAgICAgIHZhbHVlcy52YWxpZGF0ZSh2YWx1ZSwgYWNjZXNzb3IpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFhY2Nlc3Nvci5pc0VtcHR5RnJvbU9mZnNldChpbnB1dCwgb2Zmc2V0KSkKQEAgLTEwNSwxMiArMTEzLDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgPEk+IE1hcDxLLCBWPiBkZXNlcmlhbGl6ZUZvck5hdGl2ZVByb3RvY29sKEkgaW5wdXQsIFZhbHVlQWNjZXNzb3I8ST4gYWNjZXNzb3IsIFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8ST4gTWFwPEssIFY+IGRlc2VyaWFsaXplKEkgaW5wdXQsIFZhbHVlQWNjZXNzb3I8ST4gYWNjZXNzb3IpCiAgICAgewogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgaW50IG4gPSByZWFkQ29sbGVjdGlvblNpemUoaW5wdXQsIGFjY2Vzc29yLCB2ZXJzaW9uKTsKLSAgICAgICAgICAgIGludCBvZmZzZXQgPSBzaXplT2ZDb2xsZWN0aW9uU2l6ZShuLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIGludCBuID0gcmVhZENvbGxlY3Rpb25TaXplKGlucHV0LCBhY2Nlc3Nvcik7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gc2l6ZU9mQ29sbGVjdGlvblNpemUoKTsKIAogICAgICAgICAgICAgaWYgKG4gPCAwKQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKCJUaGUgZGF0YSBjYW5ub3QgYmUgZGVzZXJpYWxpemVkIGFzIGEgbWFwIik7CkBAIC0xMTksMTUgKzEyOCwxNSBAQAogICAgICAgICAgICAgLy8gSW4gc3VjaCBhIGNhc2Ugd2UgZG8gbm90IHdhbnQgdG8gaW5pdGlhbGl6ZSB0aGUgbWFwIHdpdGggdGhhdCBpbml0aWFsQ2FwYWNpdHkgYXMgaXQgY2FuIHJlc3VsdAogICAgICAgICAgICAgLy8gaW4gYW4gT09NIHdoZW4gcHV0IGlzIGNhbGxlZCAoc2VlIENBU1NBTkRSQS0xMjYxOCkuIE9uIHRoZSBvdGhlciBoYW5kIHdlIGRvIG5vdCB3YW50IHRvIGhhdmUgdG8gcmVzaXplCiAgICAgICAgICAgICAvLyB0aGUgbWFwIGlmIHdlIGNhbiBhdm9pZCBpdCwgc28gd2UgcHV0IGEgcmVhc29uYWJsZSBsaW1pdCBvbiB0aGUgaW5pdGlhbENhcGFjaXR5LgotICAgICAgICAgICAgTWFwPEssIFY+IG0gPSBuZXcgTGlua2VkSGFzaE1hcDxLLCBWPihNYXRoLm1pbihuLCAyNTYpKTsKKyAgICAgICAgICAgIE1hcDxLLCBWPiBtID0gbmV3IExpbmtlZEhhc2hNYXA8PihNYXRoLm1pbihuLCAyNTYpKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEkga2V5ID0gcmVhZE5vbk51bGxWYWx1ZShpbnB1dCwgYWNjZXNzb3IsIG9mZnNldCwgdmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVPZlZhbHVlKGtleSwgYWNjZXNzb3IsIHZlcnNpb24pOworICAgICAgICAgICAgICAgIEkga2V5ID0gcmVhZE5vbk51bGxWYWx1ZShpbnB1dCwgYWNjZXNzb3IsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVPZlZhbHVlKGtleSwgYWNjZXNzb3IpOwogICAgICAgICAgICAgICAgIGtleXMudmFsaWRhdGUoa2V5LCBhY2Nlc3Nvcik7CiAKLSAgICAgICAgICAgICAgICBJIHZhbHVlID0gcmVhZE5vbk51bGxWYWx1ZShpbnB1dCwgYWNjZXNzb3IsIG9mZnNldCwgdmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVPZlZhbHVlKHZhbHVlLCBhY2Nlc3NvciwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgSSB2YWx1ZSA9IHJlYWROb25OdWxsVmFsdWUoaW5wdXQsIGFjY2Vzc29yLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIG9mZnNldCArPSBzaXplT2ZWYWx1ZSh2YWx1ZSwgYWNjZXNzb3IpOwogICAgICAgICAgICAgICAgIHZhbHVlcy52YWxpZGF0ZSh2YWx1ZSwgYWNjZXNzb3IpOwogCiAgICAgICAgICAgICAgICAgbS5wdXQoa2V5cy5kZXNlcmlhbGl6ZShrZXksIGFjY2Vzc29yKSwgdmFsdWVzLmRlc2VyaWFsaXplKHZhbHVlLCBhY2Nlc3NvcikpOwpAQCAtMTQ4LDIwICsxNTcsMjAgQEAKICAgICAgICAgdHJ5CiAgICAgICAgIHsKICAgICAgICAgICAgIEJ5dGVCdWZmZXIgaW5wdXQgPSBjb2xsZWN0aW9uLmR1cGxpY2F0ZSgpOwotICAgICAgICAgICAgaW50IG4gPSByZWFkQ29sbGVjdGlvblNpemUoaW5wdXQsIFByb3RvY29sVmVyc2lvbi5WMyk7Ci0gICAgICAgICAgICBpbnQgb2Zmc2V0ID0gc2l6ZU9mQ29sbGVjdGlvblNpemUobiwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKKyAgICAgICAgICAgIGludCBuID0gcmVhZENvbGxlY3Rpb25TaXplKGlucHV0LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UpOworICAgICAgICAgICAgaW50IG9mZnNldCA9IHNpemVPZkNvbGxlY3Rpb25TaXplKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGtiYiA9IHJlYWRWYWx1ZShpbnB1dCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBvZmZzZXQsIFByb3RvY29sVmVyc2lvbi5WMyk7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVPZlZhbHVlKGtiYiwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBQcm90b2NvbFZlcnNpb24uVjMpOworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIga2JiID0gcmVhZFZhbHVlKGlucHV0LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVPZlZhbHVlKGtiYiwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlKTsKICAgICAgICAgICAgICAgICBpbnQgY29tcGFyaXNvbiA9IGNvbXBhcmF0b3IuY29tcGFyZUZvckNRTChrYmIsIGtleSk7CiAgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmlzb24gPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRWYWx1ZShpbnB1dCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBvZmZzZXQsIFByb3RvY29sVmVyc2lvbi5WMyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkVmFsdWUoaW5wdXQsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgb2Zmc2V0KTsKICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb21wYXJpc29uID4gMCkKICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIG1hcCBpcyBpbiBzb3J0ZWQgb3JkZXIsIHdlIGtub3cgd2UndmUgZ29uZSB0b28gZmFyIGFuZCB0aGUgZWxlbWVudCBkb2Vzbid0IGV4aXN0CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgIGVsc2UgLy8gY29tcGFyaXNvbiA8IDAKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNraXBWYWx1ZShpbnB1dCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBvZmZzZXQsIFByb3RvY29sVmVyc2lvbi5WMyk7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBza2lwVmFsdWUoaW5wdXQsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgb2Zmc2V0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CkBAIC0xNzIsNzcgKzE4MSw2IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0U2xpY2VGcm9tU2VyaWFsaXplZChCeXRlQnVmZmVyIGNvbGxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IGNvbXBhcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZyb3plbikKLSAgICB7Ci0gICAgICAgIGlmIChmcm9tID09IEJ5dGVCdWZmZXJVdGlsLlVOU0VUX0JZVEVfQlVGRkVSICYmIHRvID09IEJ5dGVCdWZmZXJVdGlsLlVOU0VUX0JZVEVfQlVGRkVSKQotICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEJ5dGVCdWZmZXIgaW5wdXQgPSBjb2xsZWN0aW9uLmR1cGxpY2F0ZSgpOwotICAgICAgICAgICAgaW50IG4gPSByZWFkQ29sbGVjdGlvblNpemUoaW5wdXQsIFByb3RvY29sVmVyc2lvbi5WMyk7Ci0gICAgICAgICAgICBpbnB1dC5wb3NpdGlvbihpbnB1dC5wb3NpdGlvbigpICsgc2l6ZU9mQ29sbGVjdGlvblNpemUobiwgUHJvdG9jb2xWZXJzaW9uLlYzKSk7Ci0gICAgICAgICAgICBpbnQgc3RhcnRQb3MgPSBpbnB1dC5wb3NpdGlvbigpOwotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIGJvb2xlYW4gaW5TbGljZSA9IGZyb20gPT0gQnl0ZUJ1ZmZlclV0aWwuVU5TRVRfQllURV9CVUZGRVI7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBwb3MgPSBpbnB1dC5wb3NpdGlvbigpOwotICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIga2JiID0gcmVhZFZhbHVlKGlucHV0LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIDAsIFByb3RvY29sVmVyc2lvbi5WMyk7IC8vIGtleQotICAgICAgICAgICAgICAgIGlucHV0LnBvc2l0aW9uKGlucHV0LnBvc2l0aW9uKCkgKyBzaXplT2ZWYWx1ZShrYmIsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgUHJvdG9jb2xWZXJzaW9uLlYzKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IHBhc3NlZCB0aGUgc3RhcnQgYWxyZWFkeSwgY2hlY2sgaWYgd2UgaGF2ZSBub3cKLSAgICAgICAgICAgICAgICBpZiAoIWluU2xpY2UpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgY29tcGFyaXNvbiA9IGNvbXBhcmF0b3IuY29tcGFyZUZvckNRTChmcm9tLCBrYmIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyaXNvbiA8PSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3cgd2l0aGluIHRoZSBzbGljZQotICAgICAgICAgICAgICAgICAgICAgICAgaW5TbGljZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvcyA9IHBvczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGJlZm9yZSB0aGUgc2xpY2Ugc28gd2Uga25vdyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgc2tpcFZhbHVlKGlucHV0LCBQcm90b2NvbFZlcnNpb24uVjMpOyAvLyB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3cgY2hlY2sgaWYgd2UncmUgZG9uZQotICAgICAgICAgICAgICAgIGludCBjb21wYXJpc29uID0gdG8gPT0gQnl0ZUJ1ZmZlclV0aWwuVU5TRVRfQllURV9CVUZGRVIgPyAtMSA6IGNvbXBhcmF0b3IuY29tcGFyZUZvckNRTChrYmIsIHRvKTsKLSAgICAgICAgICAgICAgICBpZiAoY29tcGFyaXNvbiA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBkb25lIGFuZCBzaG91bGRuJ3QgaW5jbHVkZSB0aGUga2V5IHdlIGp1c3QgcmVhZAotICAgICAgICAgICAgICAgICAgICBpbnB1dC5wb3NpdGlvbihwb3MpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlJ2xsIGluY2x1ZGUgdGhhdCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgc2tpcFZhbHVlKGlucHV0LCBQcm90b2NvbFZlcnNpb24uVjMpOyAvLyB2YWx1ZQotICAgICAgICAgICAgICAgICsrY291bnQ7Ci0KLSAgICAgICAgICAgICAgICAvLyBCdXQgaWYgd2Uga25vdyBpZiB3YXMgdGhlIGxhc3Qgb2YgdGhlIHNsaWNlLCB3ZSBicmVhayBlYXJseQotICAgICAgICAgICAgICAgIGlmIChjb21wYXJpc29uID09IDApCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY291bnQgPT0gMCAmJiAhZnJvemVuKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICByZXR1cm4gY29weUFzTmV3Q29sbGVjdGlvbihjb2xsZWN0aW9uLCBjb3VudCwgc3RhcnRQb3MsIGlucHV0LnBvc2l0aW9uKCksIFByb3RvY29sVmVyc2lvbi5WMyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiB8IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oIk5vdCBlbm91Z2ggYnl0ZXMgdG8gcmVhZCBhIG1hcCIpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhNYXA8SywgVj4gdmFsdWUpCiAgICAgewogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKQEAgLTI2Miw4ICsyMDAsMTYgQEAKICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9KQogICAgIHB1YmxpYyBDbGFzczxNYXA8SywgVj4+IGdldFR5cGUoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIChDbGFzcylNYXAuY2xhc3M7CisgICAgICAgIHJldHVybiAoQ2xhc3MpIE1hcC5jbGFzczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmb3JFYWNoKEJ5dGVCdWZmZXIgaW5wdXQsIENvbnN1bWVyPEJ5dGVCdWZmZXI+IGFjdGlvbikKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL1NldFNlcmlhbGl6ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL1NldFNlcmlhbGl6ZXIuamF2YQppbmRleCBiZjU2NWJlLi41OTljMmE4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJpYWxpemVycy9TZXRTZXJpYWxpemVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VyaWFsaXplcnMvU2V0U2VyaWFsaXplci5qYXZhCkBAIC0yMCwyNiArMjAsMjggQEAKIAogaW1wb3J0IGphdmEubmlvLkJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlQnVmZmVyQWNjZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5WYWx1ZUNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVmFsdWVBY2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlQnVmZmVyQWNjZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5WYWx1ZUFjY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVmFsdWVDb21wYXJhdG9yczsKIAotcHVibGljIGNsYXNzIFNldFNlcmlhbGl6ZXI8VD4gZXh0ZW5kcyBDb2xsZWN0aW9uU2VyaWFsaXplcjxTZXQ8VD4+CitwdWJsaWMgY2xhc3MgU2V0U2VyaWFsaXplcjxUPiBleHRlbmRzIEFic3RyYWN0TWFwU2VyaWFsaXplcjxTZXQ8VD4+CiB7CiAgICAgLy8gaW50ZXJuaW5nIGluc3RhbmNlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbmN1cnJlbnRNYXA8VHlwZVNlcmlhbGl6ZXI8Pz4sIFNldFNlcmlhbGl6ZXI+IGluc3RhbmNlcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxUeXBlU2VyaWFsaXplcjw/PiwgU2V0U2VyaWFsaXplcj4oKTsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbmN1cnJlbnRNYXA8VHlwZVNlcmlhbGl6ZXI8Pz4sIFNldFNlcmlhbGl6ZXI+IGluc3RhbmNlcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CiAKICAgICBwdWJsaWMgZmluYWwgVHlwZVNlcmlhbGl6ZXI8VD4gZWxlbWVudHM7CiAgICAgcHJpdmF0ZSBmaW5hbCBWYWx1ZUNvbXBhcmF0b3JzIGNvbXBhcmF0b3JzOwogCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIHN0YXRpYyA8VD4gU2V0U2VyaWFsaXplcjxUPiBnZXRJbnN0YW5jZShUeXBlU2VyaWFsaXplcjxUPiBlbGVtZW50cywgVmFsdWVDb21wYXJhdG9ycyBjb21wYXJhdG9ycykKICAgICB7CiAgICAgICAgIFNldFNlcmlhbGl6ZXI8VD4gdCA9IGluc3RhbmNlcy5nZXQoZWxlbWVudHMpOwpAQCAtNTAsMzcgKzUyLDQxIEBACiAKICAgICBwdWJsaWMgU2V0U2VyaWFsaXplcihUeXBlU2VyaWFsaXplcjxUPiBlbGVtZW50cywgVmFsdWVDb21wYXJhdG9ycyBjb21wYXJhdG9ycykKICAgICB7CisgICAgICAgIHN1cGVyKGZhbHNlKTsKICAgICAgICAgdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOwogICAgICAgICB0aGlzLmNvbXBhcmF0b3JzID0gY29tcGFyYXRvcnM7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIExpc3Q8Qnl0ZUJ1ZmZlcj4gc2VyaWFsaXplVmFsdWVzKFNldDxUPiB2YWx1ZXMpCiAgICAgewogICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IGJ1ZmZlcnMgPSBuZXcgQXJyYXlMaXN0PD4odmFsdWVzLnNpemUoKSk7CiAgICAgICAgIGZvciAoVCB2YWx1ZSA6IHZhbHVlcykKICAgICAgICAgICAgIGJ1ZmZlcnMuYWRkKGVsZW1lbnRzLnNlcmlhbGl6ZSh2YWx1ZSkpOwotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGJ1ZmZlcnMsIGNvbXBhcmF0b3JzLmJ1ZmZlcik7CisgICAgICAgIGJ1ZmZlcnMuc29ydChjb21wYXJhdG9ycy5idWZmZXIpOwogICAgICAgICByZXR1cm4gYnVmZmVyczsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldEVsZW1lbnRDb3VudChTZXQ8VD4gdmFsdWUpCiAgICAgewogICAgICAgICByZXR1cm4gdmFsdWUuc2l6ZSgpOwogICAgIH0KIAotICAgIHB1YmxpYyA8Vj4gdm9pZCB2YWxpZGF0ZUZvck5hdGl2ZVByb3RvY29sKFYgaW5wdXQsIFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gdm9pZCB2YWxpZGF0ZShWIGlucHV0LCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yKQogICAgIHsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIEVtcHR5IHZhbHVlcyBhcmUgc3RpbGwgdmFsaWQuCiAgICAgICAgICAgICBpZiAoYWNjZXNzb3IuaXNFbXB0eShpbnB1dCkpIHJldHVybjsKICAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IG4gPSByZWFkQ29sbGVjdGlvblNpemUoaW5wdXQsIGFjY2Vzc29yLCB2ZXJzaW9uKTsKLSAgICAgICAgICAgIGludCBvZmZzZXQgPSBzaXplT2ZDb2xsZWN0aW9uU2l6ZShuLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIGludCBuID0gcmVhZENvbGxlY3Rpb25TaXplKGlucHV0LCBhY2Nlc3Nvcik7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gc2l6ZU9mQ29sbGVjdGlvblNpemUoKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFYgdmFsdWUgPSByZWFkTm9uTnVsbFZhbHVlKGlucHV0LCBhY2Nlc3Nvciwgb2Zmc2V0LCB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZU9mVmFsdWUodmFsdWUsIGFjY2Vzc29yLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBWIHZhbHVlID0gcmVhZE5vbk51bGxWYWx1ZShpbnB1dCwgYWNjZXNzb3IsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVPZlZhbHVlKHZhbHVlLCBhY2Nlc3Nvcik7CiAgICAgICAgICAgICAgICAgZWxlbWVudHMudmFsaWRhdGUodmFsdWUsIGFjY2Vzc29yKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghYWNjZXNzb3IuaXNFbXB0eUZyb21PZmZzZXQoaW5wdXQsIG9mZnNldCkpCkBAIC05MiwxMiArOTgsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyA8Vj4gU2V0PFQ+IGRlc2VyaWFsaXplRm9yTmF0aXZlUHJvdG9jb2woViBpbnB1dCwgVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBTZXQ8VD4gZGVzZXJpYWxpemUoViBpbnB1dCwgVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvcikKICAgICB7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbiA9IHJlYWRDb2xsZWN0aW9uU2l6ZShpbnB1dCwgYWNjZXNzb3IsIHZlcnNpb24pOwotICAgICAgICAgICAgaW50IG9mZnNldCA9IHNpemVPZkNvbGxlY3Rpb25TaXplKG4sIHZlcnNpb24pOworICAgICAgICAgICAgaW50IG4gPSByZWFkQ29sbGVjdGlvblNpemUoaW5wdXQsIGFjY2Vzc29yKTsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSBzaXplT2ZDb2xsZWN0aW9uU2l6ZSgpOwogCiAgICAgICAgICAgICBpZiAobiA8IDApCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oIlRoZSBkYXRhIGNhbm5vdCBiZSBkZXNlcmlhbGl6ZWQgYXMgYSBzZXQiKTsKQEAgLTEwNiwxMiArMTEzLDEyIEBACiAgICAgICAgICAgICAvLyBJbiBzdWNoIGEgY2FzZSB3ZSBkbyBub3Qgd2FudCB0byBpbml0aWFsaXplIHRoZSBzZXQgd2l0aCB0aGF0IGluaXRpYWxDYXBhY2l0eSBhcyBpdCBjYW4gcmVzdWx0CiAgICAgICAgICAgICAvLyBpbiBhbiBPT00gd2hlbiBhZGQgaXMgY2FsbGVkIChzZWUgQ0FTU0FORFJBLTEyNjE4KS4gT24gdGhlIG90aGVyIGhhbmQgd2UgZG8gbm90IHdhbnQgdG8gaGF2ZSB0byByZXNpemUKICAgICAgICAgICAgIC8vIHRoZSBzZXQgaWYgd2UgY2FuIGF2b2lkIGl0LCBzbyB3ZSBwdXQgYSByZWFzb25hYmxlIGxpbWl0IG9uIHRoZSBpbml0aWFsQ2FwYWNpdHkuCi0gICAgICAgICAgICBTZXQ8VD4gbCA9IG5ldyBMaW5rZWRIYXNoU2V0PFQ+KE1hdGgubWluKG4sIDI1NikpOworICAgICAgICAgICAgU2V0PFQ+IGwgPSBuZXcgTGlua2VkSGFzaFNldDw+KE1hdGgubWluKG4sIDI1NikpOwogCiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWIHZhbHVlID0gcmVhZE5vbk51bGxWYWx1ZShpbnB1dCwgYWNjZXNzb3IsIG9mZnNldCwgdmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVPZlZhbHVlKHZhbHVlLCBhY2Nlc3NvciwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgViB2YWx1ZSA9IHJlYWROb25OdWxsVmFsdWUoaW5wdXQsIGFjY2Vzc29yLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIG9mZnNldCArPSBzaXplT2ZWYWx1ZSh2YWx1ZSwgYWNjZXNzb3IpOwogICAgICAgICAgICAgICAgIGVsZW1lbnRzLnZhbGlkYXRlKHZhbHVlLCBhY2Nlc3Nvcik7CiAgICAgICAgICAgICAgICAgbC5hZGQoZWxlbWVudHMuZGVzZXJpYWxpemUodmFsdWUsIGFjY2Vzc29yKSk7CiAgICAgICAgICAgICB9CkBAIC0xMjUsNiArMTMyLDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoU2V0PFQ+IHZhbHVlKQogICAgIHsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CkBAIC0xNDYsNiArMTU0LDggQEAKICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9KQogICAgIHB1YmxpYyBDbGFzczxTZXQ8VD4+IGdldFR5cGUoKQogICAgIHsKICAgICAgICAgcmV0dXJuIChDbGFzcykgU2V0LmNsYXNzOwpAQCAtMTU2LDEzICsxNjYsMTMgQEAKICAgICB7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbiA9IHJlYWRDb2xsZWN0aW9uU2l6ZShpbnB1dCwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKLSAgICAgICAgICAgIGludCBvZmZzZXQgPSBzaXplT2ZDb2xsZWN0aW9uU2l6ZShuLCBQcm90b2NvbFZlcnNpb24uVjMpOworICAgICAgICAgICAgaW50IG4gPSByZWFkQ29sbGVjdGlvblNpemUoaW5wdXQsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSk7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gc2l6ZU9mQ29sbGVjdGlvblNpemUoKTsKIAogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciB2YWx1ZSA9IHJlYWRWYWx1ZShpbnB1dCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBvZmZzZXQsIFByb3RvY29sVmVyc2lvbi5WMyk7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVPZlZhbHVlKHZhbHVlLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIFByb3RvY29sVmVyc2lvbi5WMyk7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciB2YWx1ZSA9IHJlYWRWYWx1ZShpbnB1dCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIG9mZnNldCArPSBzaXplT2ZWYWx1ZSh2YWx1ZSwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlKTsKICAgICAgICAgICAgICAgICBpbnQgY29tcGFyaXNvbiA9IGNvbXBhcmF0b3IuY29tcGFyZUZvckNRTCh2YWx1ZSwga2V5KTsKICAgICAgICAgICAgICAgICBpZiAoY29tcGFyaXNvbiA9PSAwKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CkBAIC0xNzgsNzQgKzE4OCw0IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiTm90IGVub3VnaCBieXRlcyB0byByZWFkIGEgc2V0Iik7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRTbGljZUZyb21TZXJpYWxpemVkKEJ5dGVCdWZmZXIgY29sbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgZnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gY29tcGFyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZnJvemVuKQotICAgIHsKLSAgICAgICAgaWYgKGZyb20gPT0gQnl0ZUJ1ZmZlclV0aWwuVU5TRVRfQllURV9CVUZGRVIgJiYgdG8gPT0gQnl0ZUJ1ZmZlclV0aWwuVU5TRVRfQllURV9CVUZGRVIpCi0gICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbjsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgQnl0ZUJ1ZmZlciBpbnB1dCA9IGNvbGxlY3Rpb24uZHVwbGljYXRlKCk7Ci0gICAgICAgICAgICBpbnQgbiA9IHJlYWRDb2xsZWN0aW9uU2l6ZShpbnB1dCwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKLSAgICAgICAgICAgIGlucHV0LnBvc2l0aW9uKGlucHV0LnBvc2l0aW9uKCkgKyBzaXplT2ZDb2xsZWN0aW9uU2l6ZShuLCBQcm90b2NvbFZlcnNpb24uVjMpKTsKLSAgICAgICAgICAgIGludCBzdGFydFBvcyA9IGlucHV0LnBvc2l0aW9uKCk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgYm9vbGVhbiBpblNsaWNlID0gZnJvbSA9PSBCeXRlQnVmZmVyVXRpbC5VTlNFVF9CWVRFX0JVRkZFUjsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHBvcyA9IGlucHV0LnBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciB2YWx1ZSA9IHJlYWRWYWx1ZShpbnB1dCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCAwLCBQcm90b2NvbFZlcnNpb24uVjMpOwotICAgICAgICAgICAgICAgIGlucHV0LnBvc2l0aW9uKGlucHV0LnBvc2l0aW9uKCkgKyBzaXplT2ZWYWx1ZSh2YWx1ZSwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBQcm90b2NvbFZlcnNpb24uVjMpKTsKLQotICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmVuJ3QgcGFzc2VkIHRoZSBzdGFydCBhbHJlYWR5LCBjaGVjayBpZiB3ZSBoYXZlIG5vdwotICAgICAgICAgICAgICAgIGlmICghaW5TbGljZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjb21wYXJpc29uID0gY29tcGFyYXRvci5jb21wYXJlRm9yQ1FMKGZyb20sIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmlzb24gPD0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgbm93IHdpdGhpbiB0aGUgc2xpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGluU2xpY2UgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb3MgPSBwb3M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBiZWZvcmUgdGhlIHNsaWNlIHNvIHdlIGtub3cgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIE5vdyBjaGVjayBpZiB3ZSdyZSBkb25lCi0gICAgICAgICAgICAgICAgaW50IGNvbXBhcmlzb24gPSB0byA9PSBCeXRlQnVmZmVyVXRpbC5VTlNFVF9CWVRFX0JVRkZFUiA/IC0xIDogY29tcGFyYXRvci5jb21wYXJlRm9yQ1FMKHZhbHVlLCB0byk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBhcmlzb24gPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgZG9uZSBhbmQgc2hvdWxkbid0IGluY2x1ZGUgdGhlIHZhbHVlIHdlIGp1c3QgcmVhZAotICAgICAgICAgICAgICAgICAgICBpbnB1dC5wb3NpdGlvbihwb3MpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlJ2xsIGluY2x1ZGUgdGhhdCB2YWx1ZQotICAgICAgICAgICAgICAgICsrY291bnQ7Ci0KLSAgICAgICAgICAgICAgICAvLyBCdXQgaWYgd2Uga25vdyBpZiB3YXMgdGhlIGxhc3Qgb2YgdGhlIHNsaWNlLCB3ZSBicmVhayBlYXJseQotICAgICAgICAgICAgICAgIGlmIChjb21wYXJpc29uID09IDApCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY291bnQgPT0gMCAmJiAhZnJvemVuKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICByZXR1cm4gY29weUFzTmV3Q29sbGVjdGlvbihjb2xsZWN0aW9uLCBjb3VudCwgc3RhcnRQb3MsIGlucHV0LnBvc2l0aW9uKCksIFByb3RvY29sVmVyc2lvbi5WMyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiB8IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oIk5vdCBlbm91Z2ggYnl0ZXMgdG8gcmVhZCBhIHNldCIpOwotICAgICAgICB9Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9BYnN0cmFjdFdyaXRlUmVzcG9uc2VIYW5kbGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0Fic3RyYWN0V3JpdGVSZXNwb25zZUhhbmRsZXIuamF2YQppbmRleCBjZTI4MjY2Li5kMmM1NGY5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0Fic3RyYWN0V3JpdGVSZXNwb25zZUhhbmRsZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0Fic3RyYWN0V3JpdGVSZXNwb25zZUhhbmRsZXIuamF2YQpAQCAtMjIsNyArMjIsOSBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIApAQCAtMTE0LDM0ICsxMTYsNDIgQEAKICAgICB7CiAgICAgICAgIGxvbmcgdGltZW91dE5hbm9zID0gY3VycmVudFRpbWVvdXROYW5vcygpOwogCi0gICAgICAgIGJvb2xlYW4gc3VjY2VzczsKKyAgICAgICAgYm9vbGVhbiBzaWduYWxlZDsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIHN1Y2Nlc3MgPSBjb25kaXRpb24uYXdhaXQodGltZW91dE5hbm9zLCBOQU5PU0VDT05EUyk7CisgICAgICAgICAgICBzaWduYWxlZCA9IGNvbmRpdGlvbi5hd2FpdCh0aW1lb3V0TmFub3MsIE5BTk9TRUNPTkRTKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKICAgICAgICAgewogICAgICAgICAgICAgdGhyb3cgbmV3IFVuY2hlY2tlZEludGVycnVwdGVkRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFzdWNjZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgYmxvY2tlZEZvciA9IGJsb2NrRm9yKCk7Ci0gICAgICAgICAgICBpbnQgYWNrcyA9IGFja0NvdW50KCk7Ci0gICAgICAgICAgICAvLyBJdCdzIHByZXR0eSB1bmxpa2VseSwgYnV0IHdlIGNhbiByYWNlIGJldHdlZW4gZXhpdGluZyBhd2FpdCBhYm92ZSBhbmQgaGVyZSwgc28KLSAgICAgICAgICAgIC8vIHRoYXQgd2UgY291bGQgbm93IGhhdmUgZW5vdWdoIGFja3MuIEluIHRoYXQgY2FzZSwgd2UgImxpZSIgb24gdGhlIGFja3MgY291bnQgdG8KLSAgICAgICAgICAgIC8vIGF2b2lkIHNlbmRpbmcgY29uZnVzaW5nIGluZm8gdG8gdGhlIHVzZXIgKHNlZSBDQVNTQU5EUkEtNjQ5MSkuCi0gICAgICAgICAgICBpZiAoYWNrcyA+PSBibG9ja2VkRm9yKQotICAgICAgICAgICAgICAgIGFja3MgPSBibG9ja2VkRm9yIC0gMTsKLSAgICAgICAgICAgIHRocm93IG5ldyBXcml0ZVRpbWVvdXRFeGNlcHRpb24od3JpdGVUeXBlLCByZXBsaWNhUGxhbi5jb25zaXN0ZW5jeUxldmVsKCksIGFja3MsIGJsb2NrZWRGb3IpOwotICAgICAgICB9CisgICAgICAgIGlmICghc2lnbmFsZWQpCisgICAgICAgICAgICB0aHJvd1RpbWVvdXQoKTsKIAogICAgICAgICBpZiAoYmxvY2tGb3IoKSArIGZhaWx1cmVzID4gY2FuZGlkYXRlUmVwbGljYUNvdW50KCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBXcml0ZUZhaWx1cmVFeGNlcHRpb24ocmVwbGljYVBsYW4uY29uc2lzdGVuY3lMZXZlbCgpLCBhY2tDb3VudCgpLCBibG9ja0ZvcigpLCB3cml0ZVR5cGUsIGZhaWx1cmVSZWFzb25CeUVuZHBvaW50KTsKKyAgICAgICAgICAgIGlmIChSZXF1ZXN0Q2FsbGJhY2suaXNUaW1lb3V0KHRoaXMuZmFpbHVyZVJlYXNvbkJ5RW5kcG9pbnQua2V5U2V0KCkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHRoaXM6OndhaXRpbmdGb3IpIC8vIERhdGFjZW50ZXJXcml0ZVJlc3BvbnNlSGFuZGxlciBmaWx0ZXJzIGVycm9ycyBmcm9tIHJlbW90ZSBEQ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKEZ1bmN0aW9uLmlkZW50aXR5KCksIHRoaXMuZmFpbHVyZVJlYXNvbkJ5RW5kcG9pbnQ6OmdldCkpKSkKKyAgICAgICAgICAgICAgICB0aHJvd1RpbWVvdXQoKTsKKworICAgICAgICAgICAgdGhyb3cgbmV3IFdyaXRlRmFpbHVyZUV4Y2VwdGlvbihyZXBsaWNhUGxhbi5jb25zaXN0ZW5jeUxldmVsKCksIGFja0NvdW50KCksIGJsb2NrRm9yKCksIHdyaXRlVHlwZSwgdGhpcy5mYWlsdXJlUmVhc29uQnlFbmRwb2ludCk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgdGhyb3dUaW1lb3V0KCkKKyAgICB7CisgICAgICAgIGludCBibG9ja2VkRm9yID0gYmxvY2tGb3IoKTsKKyAgICAgICAgaW50IGFja3MgPSBhY2tDb3VudCgpOworICAgICAgICAvLyBJdCdzIHByZXR0eSB1bmxpa2VseSwgYnV0IHdlIGNhbiByYWNlIGJldHdlZW4gZXhpdGluZyBhd2FpdCBhYm92ZSBhbmQgaGVyZSwgc28KKyAgICAgICAgLy8gdGhhdCB3ZSBjb3VsZCBub3cgaGF2ZSBlbm91Z2ggYWNrcy4gSW4gdGhhdCBjYXNlLCB3ZSAibGllIiBvbiB0aGUgYWNrcyBjb3VudCB0bworICAgICAgICAvLyBhdm9pZCBzZW5kaW5nIGNvbmZ1c2luZyBpbmZvIHRvIHRoZSB1c2VyIChzZWUgQ0FTU0FORFJBLTY0OTEpLgorICAgICAgICBpZiAoYWNrcyA+PSBibG9ja2VkRm9yKQorICAgICAgICAgICAgYWNrcyA9IGJsb2NrZWRGb3IgLSAxOworICAgICAgICB0aHJvdyBuZXcgV3JpdGVUaW1lb3V0RXhjZXB0aW9uKHdyaXRlVHlwZSwgcmVwbGljYVBsYW4uY29uc2lzdGVuY3lMZXZlbCgpLCBhY2tzLCBibG9ja2VkRm9yKTsKKyAgICB9CisKICAgICBwdWJsaWMgZmluYWwgbG9uZyBjdXJyZW50VGltZW91dE5hbm9zKCkKICAgICB7CiAgICAgICAgIGxvbmcgcmVxdWVzdFRpbWVvdXQgPSB3cml0ZVR5cGUgPT0gQ09VTlRFUgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9BY3RpdmVSZXBhaXJTZXJ2aWNlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0FjdGl2ZVJlcGFpclNlcnZpY2UuamF2YQppbmRleCBhMDcxNmIxLi41ZDY5NTA3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0FjdGl2ZVJlcGFpclNlcnZpY2UuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0FjdGl2ZVJlcGFpclNlcnZpY2UuamF2YQpAQCAtNDUsNiArNDUsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkR1cmF0aW9uU3BlYzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkFic3RyYWN0UmVwbGljYXRpb25TdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkVuZHBvaW50c0J5UmFuZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5FbmRwb2ludHNGb3JSYW5nZTsKQEAgLTExOCw2ICsxMTksMTEgQEAKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNldDsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlMTElTRUNPTkRTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LkV4ZWN1dG9yRmFjdG9yeS5HbG9iYWwuZXhlY3V0b3JGYWN0b3J5OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlBBUkVOVF9SRVBBSVJfU1RBVFVTX0NBQ0hFX1NJWkU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUEFSRU5UX1JFUEFJUl9TVEFUVVNfRVhQSVJZX1NFQ09ORFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUEFYT1NfUkVQQUlSX0FMTE9XX01VTFRJUExFX1BFTkRJTkdfVU5TQUZFOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlNLSVBfUEFYT1NfUkVQQUlSX09OX1RPUE9MT0dZX0NIQU5HRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TS0lQX1BBWE9TX1JFUEFJUl9PTl9UT1BPTE9HWV9DSEFOR0VfS0VZU1BBQ0VTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnLlJlcGFpckNvbW1hbmRQb29sRnVsbFN0cmF0ZWd5LnJlamVjdDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvci4qOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnZS5vdXQ7CkBAIC0yMjAsMTMgKzIyNiwxMSBAQAogICAgICAgICB0aGlzLmZhaWx1cmVEZXRlY3RvciA9IGZhaWx1cmVEZXRlY3RvcjsKICAgICAgICAgdGhpcy5nb3NzaXBlciA9IGdvc3NpcGVyOwogICAgICAgICB0aGlzLnJlcGFpclN0YXR1c0J5Q21kID0gQ2FjaGVCdWlsZGVyLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4cGlyZUFmdGVyV3JpdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nLmdldExvbmcoImNhc3NhbmRyYS5wYXJlbnRfcmVwYWlyX3N0YXR1c19leHBpcnlfc2Vjb25kcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUy5jb252ZXJ0KDEsIFRpbWVVbml0LkRBWVMpKSwgVGltZVVuaXQuU0VDT05EUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5leHBpcmVBZnRlcldyaXRlKFBBUkVOVF9SRVBBSVJfU1RBVFVTX0VYUElSWV9TRUNPTkRTLmdldExvbmcoKSwgVGltZVVuaXQuU0VDT05EUykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzaW5nIHdlaWdodCB3b3VsZG4ndCB3b3JrIHNvIHdlbGwsIHNpbmNlIGl0IGRvZXNuJ3QgcmVmbGVjdCBtdXRhdGlvbiBvZiBjYWNoZWQgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZ3VhdmEvd2lraS9DYWNoZXNFeHBsYWluZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFzc3VtZSBlYWNoIGVudHJ5IGlzIHVubGlrZWx5IHRvIGJlIG11Y2ggbW9yZSB0aGFuIDEwMCBieXRlcywgc28gYm91bmRpbmcgdGhlIHNpemUgc2hvdWxkIGJlIHN1ZmZpY2llbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4aW11bVNpemUoTG9uZy5nZXRMb25nKCJjYXNzYW5kcmEucGFyZW50X3JlcGFpcl9zdGF0dXNfY2FjaGVfc2l6ZSIsIDEwMF8wMDApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heGltdW1TaXplKFBBUkVOVF9SRVBBSVJfU1RBVFVTX0NBQ0hFX1NJWkUuZ2V0TG9uZygpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAKICAgICAgICAgRHVyYXRpb25TcGVjLkxvbmdOYW5vc2Vjb25kc0JvdW5kIGR1cmF0aW9uID0gZ2V0UmVwYWlyU3RhdGVFeHBpcmVzKCk7CkBAIC0yOTQsMTggKzI5OCw0NCBAQAogICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFJlcGFpclNlc3Npb25TcGFjZUluTWlCKCk7CiAgICAgfQogCisgICAgQERlcHJlY2F0ZWQKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1lYmlieXRlcyhpbnQgc2l6ZUluTWViaWJ5dGVzKQogICAgIHsKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFJlcGFpclNlc3Npb25TcGFjZUluTWlCKHNpemVJbk1lYmlieXRlcyk7CiAgICAgfQogCisgICAgQERlcHJlY2F0ZWQKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldFJlcGFpclNlc3Npb25TcGFjZUluTWViaWJ5dGVzKCkKICAgICB7CiAgICAgICAgIHJldHVybiBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0UmVwYWlyU2Vzc2lvblNwYWNlSW5NaUIoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1pQihpbnQgc2l6ZUluTWViaWJ5dGVzKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1pQihzaXplSW5NZWJpYnl0ZXMpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJbiBDQVNTQU5EUkEtMTc2NjgsIEpNWCBzZXR0ZXJzIHRoYXQgZGlkIG5vdCB0aHJvdyBzdGFuZGFyZCBleGNlcHRpb25zIHdlcmUgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBvbmVzIHRoYXQgZG8uCisgICAgICogRm9yIGNvbnNpc3RlbmN5IHB1cnBvc2VzLCB0aGUgcmVzcGVjdGl2ZSBnZXR0ZXIgImdldFJlcGFpclNlc3Npb25TcGFjZUluTWViaWJ5dGVzIiB3YXMgYWxzbyBkZXByZWNhdGVkIGFuZAorICAgICAqIHJlcGxhY2VkIGJ5IHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0UmVwYWlyU2Vzc2lvblNwYWNlSW5NaUIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIERhdGFiYXNlRGVzY3JpcHRvci5nZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1pQigpOworICAgIH0KKwogICAgIHB1YmxpYyBMaXN0PENvbXBvc2l0ZURhdGE+IGdldFJlcGFpclN0YXRzKExpc3Q8U3RyaW5nPiBzY2hlbWFBcmdzLCBTdHJpbmcgcmFuZ2VTdHJpbmcpCiAgICAgewogICAgICAgICBMaXN0PENvbXBvc2l0ZURhdGE+IHN0YXRzID0gbmV3IEFycmF5TGlzdDw+KCk7CkBAIC0xMDI4LDIxICsxMDU4LDIxIEBACiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkluc3VmZmljaWVudCBsaXZlIG5vZGVzIHRvIHJlcGFpciBwYXhvcyBmb3IgJXMgaW4gJXMgZm9yICVzLlxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZXJlIG11c3QgYmUgZW5vdWdoIGxpdmUgbm9kZXMgdG8gc2F0aXNmeSBFQUNIX1FVT1JVTSwgYnV0IHRoZSBmb2xsb3dpbmcgbm9kZXMgYXJlIGRvd246ICVzXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBjaGVjayBjYW4gYmUgc2tpcHBlZCBieSBzZXR0aW5nIGVpdGhlciB0aGUgeWFtbCBwcm9wZXJ0eSBza2lwX3BheG9zX3JlcGFpcl9vbl90b3BvbG9neV9jaGFuZ2Ugb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBzeXN0ZW0gcHJvcGVydHkgY2Fzc2FuZHJhLnNraXBfcGF4b3NfcmVwYWlyX29uX3RvcG9sb2d5X2NoYW5nZSB0byBmYWxzZS4gVGhlIGpteCBwcm9wZXJ0eSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHN5c3RlbSBwcm9wZXJ0eSAlcyB0byBmYWxzZS4gVGhlIGpteCBwcm9wZXJ0eSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RvcmFnZVNlcnZpY2UuU2tpcFBheG9zUmVwYWlyT25Ub3BvbG9neUNoYW5nZSBjYW4gYWxzbyBiZSBzZXQgdG8gZmFsc2UgdG8gdGVtcG9yYXJpbHkgZGlzYWJsZSB3aXRob3V0ICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXN0YXJ0aW5nIHRoZSBub2RlXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kaXZpZHVhbCBrZXlzcGFjZXMgY2FuIGJlIHNraXBwZWQgd2l0aCB0aGUgeWFtbCBwcm9wZXJ0eSBza2lwX3BheG9zX3JlcGFpcl9vbl90b3BvbG9neV9jaGFuZ2Vfa2V5c3BhY2VzLCB0aGUiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3lzdGVtIHByb3BlcnR5IGNhc3NhbmRyYS5za2lwX3BheG9zX3JlcGFpcl9vbl90b3BvbG9neV9jaGFuZ2Vfa2V5c3BhY2VzLCBvciB0ZW1wb3JhcmlseSB3aXRoIHRoZSBqbXgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3lzdGVtIHByb3BlcnR5ICVzLCBvciB0ZW1wb3JhcmlseSB3aXRoIHRoZSBqbXgiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydHkgU3RvcmFnZVNlcnZpY2UuU2tpcFBheG9zUmVwYWlyT25Ub3BvbG9neUNoYW5nZUtleXNwYWNlc1xuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNraXBwaW5nIHRoaXMgY2hlY2sgY2FuIGxlYWQgdG8gcGF4b3MgY29ycmVjdG5lc3MgaXNzdWVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSwga3NOYW1lLCByZWFzb24sIGRvd25FbmRwb2ludHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSwga3NOYW1lLCByZWFzb24sIGRvd25FbmRwb2ludHMsIFNLSVBfUEFYT1NfUkVQQUlSX09OX1RPUE9MT0dZX0NIQU5HRS5nZXRLZXkoKSwgU0tJUF9QQVhPU19SRVBBSVJfT05fVE9QT0xPR1lfQ0hBTkdFX0tFWVNQQUNFUy5nZXRLZXkoKSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBFbmRwb2ludHNGb3JUb2tlbiBwZW5kaW5nID0gU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuZ2V0VG9rZW5NZXRhZGF0YSgpLnBlbmRpbmdFbmRwb2ludHNGb3JUb2tlbihyYW5nZS5yaWdodCwga3NOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAocGVuZGluZy5zaXplKCkgPiAxICYmICFCb29sZWFuLmdldEJvb2xlYW4oImNhc3NhbmRyYS5wYXhvc19yZXBhaXJfYWxsb3dfbXVsdGlwbGVfcGVuZGluZ191bnNhZmUiKSkKKyAgICAgICAgICAgICAgICBpZiAocGVuZGluZy5zaXplKCkgPiAxICYmICFQQVhPU19SRVBBSVJfQUxMT1dfTVVMVElQTEVfUEVORElOR19VTlNBRkUuZ2V0Qm9vbGVhbigpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiQ2Fubm90IGJlZ2luIHBheG9zIGF1dG8gcmVwYWlyIGZvciAlcyBpbiAlcy4lcywgbXVsdGlwbGUgcGVuZGluZyBlbmRwb2ludHMgZXhpc3QgZm9yIHJhbmdlICglcykuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgLURjYXNzYW5kcmEucGF4b3NfcmVwYWlyX2FsbG93X211bHRpcGxlX3BlbmRpbmdfdW5zYWZlPXRydWUgdG8gc2tpcCB0aGlzIGNoZWNrIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSwgdGFibGUua2V5c3BhY2UsIHRhYmxlLm5hbWUsIHBlbmRpbmcpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IC1EJXM9dHJ1ZSB0byBza2lwIHRoaXMgY2hlY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLCB0YWJsZS5rZXlzcGFjZSwgdGFibGUubmFtZSwgcGVuZGluZywgUEFYT1NfUkVQQUlSX0FMTE9XX01VTFRJUExFX1BFTkRJTkdfVU5TQUZFLmdldEtleSgpKSk7CiAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgRnV0dXJlPFZvaWQ+IGZ1dHVyZSA9IFBheG9zQ2xlYW51cC5jbGVhbnVwKGVuZHBvaW50cywgdGFibGUsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihyYW5nZSksIGZhbHNlLCByZXBhaXJDb21tYW5kRXhlY3V0b3IoKSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0FjdGl2ZVJlcGFpclNlcnZpY2VNQmVhbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9BY3RpdmVSZXBhaXJTZXJ2aWNlTUJlYW4uamF2YQppbmRleCAwMDlhZDU2Li45YTYwNjYzIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0FjdGl2ZVJlcGFpclNlcnZpY2VNQmVhbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQWN0aXZlUmVwYWlyU2VydmljZU1CZWFuLmphdmEKQEAgLTM0LDkgKzM0LDIwIEBACiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgaW50IGdldFJlcGFpclNlc3Npb25TcGFjZUluTWVnYWJ5dGVzKCk7CiAKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Ugc2V0UmVwYWlyU2Vzc2lvblNwYWNlSW5NaUIgaW5zdGVhZCBhcyBpdCB3aWxsIG5vdCB0aHJvdyBub24tc3RhbmRhcmQgZXhjZXB0aW9ucworICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc2V0UmVwYWlyU2Vzc2lvblNwYWNlSW5NZWJpYnl0ZXMoaW50IHNpemVJbk1lYmlieXRlcyk7CisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIGdldFJlcGFpclNlc3Npb25TcGFjZUluTWlCIGluc3RlYWQKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBpbnQgZ2V0UmVwYWlyU2Vzc2lvblNwYWNlSW5NZWJpYnl0ZXMoKTsKIAorICAgIHB1YmxpYyB2b2lkIHNldFJlcGFpclNlc3Npb25TcGFjZUluTWlCKGludCBzaXplSW5NZWJpYnl0ZXMpOworICAgIHB1YmxpYyBpbnQgZ2V0UmVwYWlyU2Vzc2lvblNwYWNlSW5NaUIoKTsKKwogICAgIHB1YmxpYyBib29sZWFuIGdldFVzZU9mZmhlYXBNZXJrbGVUcmVlcygpOwogICAgIHB1YmxpYyB2b2lkIHNldFVzZU9mZmhlYXBNZXJrbGVUcmVlcyhib29sZWFuIHZhbHVlKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9DYWNoZVNlcnZpY2UuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQ2FjaGVTZXJ2aWNlLmphdmEKaW5kZXggOWMyM2U3MS4uMGRjMzExMCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9DYWNoZVNlcnZpY2UuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0NhY2hlU2VydmljZS5qYXZhCkBAIC0xOSwzMSArMTksNTEgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOwogCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVRyaXBsZTsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5BdXRvU2F2aW5nQ2FjaGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuQXV0b1NhdmluZ0NhY2hlLkNhY2hlU2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5DYWNoZVByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLkNhZmZlaW5lQ2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuQ291bnRlckNhY2hlS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLklDYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5JUm93Q2FjaGVFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5LZXlDYWNoZUtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5Sb3dDYWNoZUtleTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LlN0YWdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbG9ja0FuZENvdW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWFkRXhlY3V0aW9uQ29udHJvbGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TaW5nbGVQYXJ0aXRpb25SZWFkQ29tbWFuZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb250ZXh0LkNvdW50ZXJDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5TU1RhYmxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5EYXRhTGltaXRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuQ2FjaGVkQlRyZWVQYXJ0aXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5DYWNoZWRQYXJ0aXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQWJzdHJhY3RSb3dJbmRleEVudHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVJZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVJZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TZXF1ZW5jZUJhc2VkU1NUYWJsZUlkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmtleWNhY2hlLktleUNhY2hlU3VwcG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQXJyYXlVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwpAQCAtODAsNyArMTAwLDcgQEAKIAogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ2FjaGVTZXJ2aWNlIGluc3RhbmNlID0gbmV3IENhY2hlU2VydmljZSgpOwogCi0gICAgcHVibGljIGZpbmFsIEF1dG9TYXZpbmdDYWNoZTxLZXlDYWNoZUtleSwgUm93SW5kZXhFbnRyeT4ga2V5Q2FjaGU7CisgICAgcHVibGljIGZpbmFsIEF1dG9TYXZpbmdDYWNoZTxLZXlDYWNoZUtleSwgQWJzdHJhY3RSb3dJbmRleEVudHJ5PiBrZXlDYWNoZTsKICAgICBwdWJsaWMgZmluYWwgQXV0b1NhdmluZ0NhY2hlPFJvd0NhY2hlS2V5LCBJUm93Q2FjaGVFbnRyeT4gcm93Q2FjaGU7CiAgICAgcHVibGljIGZpbmFsIEF1dG9TYXZpbmdDYWNoZTxDb3VudGVyQ2FjaGVLZXksIENsb2NrQW5kQ291bnQ+IGNvdW50ZXJDYWNoZTsKIApAQCAtOTYsNyArMTE2LDcgQEAKICAgICAvKioKICAgICAgKiBAcmV0dXJuIGF1dG8gc2F2aW5nIGNhY2hlIG9iamVjdAogICAgICAqLwotICAgIHByaXZhdGUgQXV0b1NhdmluZ0NhY2hlPEtleUNhY2hlS2V5LCBSb3dJbmRleEVudHJ5PiBpbml0S2V5Q2FjaGUoKQorICAgIHByaXZhdGUgQXV0b1NhdmluZ0NhY2hlPEtleUNhY2hlS2V5LCBBYnN0cmFjdFJvd0luZGV4RW50cnk+IGluaXRLZXlDYWNoZSgpCiAgICAgewogICAgICAgICBsb2dnZXIuaW5mbygiSW5pdGlhbGl6aW5nIGtleSBjYWNoZSB3aXRoIGNhcGFjaXR5IG9mIHt9IE1pQnMuIiwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldEtleUNhY2hlU2l6ZUluTWlCKCkpOwogCkBAIC0xMDQsOSArMTI0LDkgQEAKIAogICAgICAgICAvLyBhcyB2YWx1ZXMgYXJlIGNvbnN0YW50IHNpemUgd2UgY2FuIHVzZSBzaW5nbGV0b24gd2VpZ2hlcgogICAgICAgICAvLyB3aGVyZSA0OCA9IDQwIGJ5dGVzIChhdmVyYWdlIHNpemUgb2YgdGhlIGtleSkgKyA4IGJ5dGVzIChzaXplIG9mIHZhbHVlKQotICAgICAgICBJQ2FjaGU8S2V5Q2FjaGVLZXksIFJvd0luZGV4RW50cnk+IGtjOworICAgICAgICBJQ2FjaGU8S2V5Q2FjaGVLZXksIEFic3RyYWN0Um93SW5kZXhFbnRyeT4ga2M7CiAgICAgICAgIGtjID0gQ2FmZmVpbmVDYWNoZS5jcmVhdGUoa2V5Q2FjaGVJbk1lbW9yeUNhcGFjaXR5KTsKLSAgICAgICAgQXV0b1NhdmluZ0NhY2hlPEtleUNhY2hlS2V5LCBSb3dJbmRleEVudHJ5PiBrZXlDYWNoZSA9IG5ldyBBdXRvU2F2aW5nQ2FjaGU8PihrYywgQ2FjaGVUeXBlLktFWV9DQUNIRSwgbmV3IEtleUNhY2hlU2VyaWFsaXplcigpKTsKKyAgICAgICAgQXV0b1NhdmluZ0NhY2hlPEtleUNhY2hlS2V5LCBBYnN0cmFjdFJvd0luZGV4RW50cnk+IGtleUNhY2hlID0gbmV3IEF1dG9TYXZpbmdDYWNoZTw+KGtjLCBDYWNoZVR5cGUuS0VZX0NBQ0hFLCBuZXcgS2V5Q2FjaGVTZXJpYWxpemVyKCkpOwogCiAgICAgICAgIGludCBrZXlDYWNoZUtleXNUb1NhdmUgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0S2V5Q2FjaGVLZXlzVG9TYXZlKCk7CiAKQEAgLTM0MCwxNjYgKzM2MCwyMDEgQEAKICAgICAgICAgbG9nZ2VyLmRlYnVnKCJjYWNoZSBzYXZlcyBjb21wbGV0ZWQiKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvdW50ZXJDYWNoZVNlcmlhbGl6ZXIgaW1wbGVtZW50cyBDYWNoZVNlcmlhbGl6ZXI8Q291bnRlckNhY2hlS2V5LCBDbG9ja0FuZENvdW50PgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ291bnRlckNhY2hlU2VyaWFsaXplciBleHRlbmRzIENhY2hlU2VyaWFsaXplcjxDb3VudGVyQ2FjaGVLZXksIENsb2NrQW5kQ291bnQ+CiAgICAgewogICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoQ291bnRlckNhY2hlS2V5IGtleSwgRGF0YU91dHB1dFBsdXMgb3V0LCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICBhc3NlcnQoY2ZzLm1ldGFkYXRhKCkuaXNDb3VudGVyKCkpOwotICAgICAgICAgICAgVGFibGVNZXRhZGF0YSB0YWJsZU1ldGFkYXRhID0gY2ZzLm1ldGFkYXRhKCk7Ci0gICAgICAgICAgICB0YWJsZU1ldGFkYXRhLmlkLnNlcmlhbGl6ZShvdXQpOwotICAgICAgICAgICAgb3V0LndyaXRlVVRGKHRhYmxlTWV0YWRhdGEuaW5kZXhOYW1lKCkub3JFbHNlKCIiKSk7CisgICAgICAgICAgICB3cml0ZUNGUyhvdXQsIGNmcyk7CiAgICAgICAgICAgICBrZXkud3JpdGUob3V0KTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBGdXR1cmU8UGFpcjxDb3VudGVyQ2FjaGVLZXksIENsb2NrQW5kQ291bnQ+PiBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBmaW5hbCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICBwdWJsaWMgRnV0dXJlPFBhaXI8Q291bnRlckNhY2hlS2V5LCBDbG9ja0FuZENvdW50Pj4gZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIC8vS2V5c3BhY2UgYW5kIENGIG5hbWUgYXJlIGRlc2VyaWFsaXplZCBieSBBdXRvU2F2aW5nIGNhY2hlIGFuZCB1c2VkIHRvIGZldGNoIHRoZSBDRlMgcHJvdmlkZWQgYXMgYQogICAgICAgICAgICAgLy9wYXJhbWV0ZXIgc28gdGhleSBhcmVuJ3QgZGVzZXJpYWxpemVkIGhlcmUsIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHNlcmlhbGl6ZWQgYnkgdGhpcyBzZXJpYWxpemVyCisgICAgICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSByZWFkQ0ZTKGluKTsKICAgICAgICAgICAgIGlmIChjZnMgPT0gbnVsbCkKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIGZpbmFsIENvdW50ZXJDYWNoZUtleSBjYWNoZUtleSA9IENvdW50ZXJDYWNoZUtleS5yZWFkKGNmcy5tZXRhZGF0YSgpLCBpbik7CiAgICAgICAgICAgICBpZiAoIWNmcy5tZXRhZGF0YSgpLmlzQ291bnRlcigpIHx8ICFjZnMuaXNDb3VudGVyQ2FjaGVFbmFibGVkKCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAKLSAgICAgICAgICAgIHJldHVybiBTdGFnZS5SRUFELnN1Ym1pdChuZXcgQ2FsbGFibGU8UGFpcjxDb3VudGVyQ2FjaGVLZXksIENsb2NrQW5kQ291bnQ+PigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIFBhaXI8Q291bnRlckNhY2hlS2V5LCBDbG9ja0FuZENvdW50PiBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciB2YWx1ZSA9IGNhY2hlS2V5LnJlYWRDb3VudGVyVmFsdWUoY2ZzKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICA6IFBhaXIuY3JlYXRlKGNhY2hlS2V5LCBDb3VudGVyQ29udGV4dC5pbnN0YW5jZSgpLmdldExvY2FsQ2xvY2tBbmRDb3VudCh2YWx1ZSkpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBTdGFnZS5SRUFELnN1Ym1pdCgoKSAtPiB7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciB2YWx1ZSA9IGNhY2hlS2V5LnJlYWRDb3VudGVyVmFsdWUoY2ZzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgPyBudWxsCisgICAgICAgICAgICAgICAgICAgICA6IFBhaXIuY3JlYXRlKGNhY2hlS2V5LCBDb3VudGVyQ29udGV4dC5pbnN0YW5jZSgpLmdldExvY2FsQ2xvY2tBbmRDb3VudCh2YWx1ZSkpOwogICAgICAgICAgICAgfSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJvd0NhY2hlU2VyaWFsaXplciBpbXBsZW1lbnRzIENhY2hlU2VyaWFsaXplcjxSb3dDYWNoZUtleSwgSVJvd0NhY2hlRW50cnk+CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSb3dDYWNoZVNlcmlhbGl6ZXIgZXh0ZW5kcyBDYWNoZVNlcmlhbGl6ZXI8Um93Q2FjaGVLZXksIElSb3dDYWNoZUVudHJ5PgogICAgIHsKICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFJvd0NhY2hlS2V5IGtleSwgRGF0YU91dHB1dFBsdXMgb3V0LCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICBhc3NlcnQoIWNmcy5pc0luZGV4KCkpOy8vU2hvdWxkbid0IGhhdmUgcm93IGNhY2hlIGVudHJpZXMgZm9yIGluZGV4ZXMKLSAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEgdGFibGVNZXRhZGF0YSA9IGNmcy5tZXRhZGF0YSgpOwotICAgICAgICAgICAgdGFibGVNZXRhZGF0YS5pZC5zZXJpYWxpemUob3V0KTsKLSAgICAgICAgICAgIG91dC53cml0ZVVURih0YWJsZU1ldGFkYXRhLmluZGV4TmFtZSgpLm9yRWxzZSgiIikpOworICAgICAgICAgICAgd3JpdGVDRlMob3V0LCBjZnMpOwogICAgICAgICAgICAgQnl0ZUFycmF5VXRpbC53cml0ZVdpdGhMZW5ndGgoa2V5LmtleSwgb3V0KTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBGdXR1cmU8UGFpcjxSb3dDYWNoZUtleSwgSVJvd0NhY2hlRW50cnk+PiBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBmaW5hbCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICBwdWJsaWMgRnV0dXJlPFBhaXI8Um93Q2FjaGVLZXksIElSb3dDYWNoZUVudHJ5Pj4gZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIC8vS2V5c3BhY2UgYW5kIENGIG5hbWUgYXJlIGRlc2VyaWFsaXplZCBieSBBdXRvU2F2aW5nIGNhY2hlIGFuZCB1c2VkIHRvIGZldGNoIHRoZSBDRlMgcHJvdmlkZWQgYXMgYQogICAgICAgICAgICAgLy9wYXJhbWV0ZXIgc28gdGhleSBhcmVuJ3QgZGVzZXJpYWxpemVkIGhlcmUsIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHNlcmlhbGl6ZWQgYnkgdGhpcyBzZXJpYWxpemVyCisgICAgICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSByZWFkQ0ZTKGluKTsKICAgICAgICAgICAgIGZpbmFsIEJ5dGVCdWZmZXIgYnVmZmVyID0gQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhMZW5ndGgoaW4pOwogICAgICAgICAgICAgaWYgKGNmcyA9PSBudWxsICB8fCAhY2ZzLmlzUm93Q2FjaGVFbmFibGVkKCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICBmaW5hbCBpbnQgcm93c1RvQ2FjaGUgPSBjZnMubWV0YWRhdGEoKS5wYXJhbXMuY2FjaGluZy5yb3dzUGVyUGFydGl0aW9uVG9DYWNoZSgpOwogICAgICAgICAgICAgYXNzZXJ0KCFjZnMuaXNJbmRleCgpKTsvL1Nob3VsZG4ndCBoYXZlIHJvdyBjYWNoZSBlbnRyaWVzIGZvciBpbmRleGVzCiAKLSAgICAgICAgICAgIHJldHVybiBTdGFnZS5SRUFELnN1Ym1pdChuZXcgQ2FsbGFibGU8UGFpcjxSb3dDYWNoZUtleSwgSVJvd0NhY2hlRW50cnk+PigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIFBhaXI8Um93Q2FjaGVLZXksIElSb3dDYWNoZUVudHJ5PiBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICAgICAgcmV0dXJuIFN0YWdlLlJFQUQuc3VibWl0KCgpIC0+IHsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gY2ZzLmRlY29yYXRlS2V5KGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaW50IG5vd0luU2VjID0gRkJVdGlsaXRpZXMubm93SW5TZWNvbmRzKCk7CisgICAgICAgICAgICAgICAgU2luZ2xlUGFydGl0aW9uUmVhZENvbW1hbmQgY21kID0gU2luZ2xlUGFydGl0aW9uUmVhZENvbW1hbmQuZnVsbFBhcnRpdGlvblJlYWQoY2ZzLm1ldGFkYXRhKCksIG5vd0luU2VjLCBrZXkpOworICAgICAgICAgICAgICAgIHRyeSAoUmVhZEV4ZWN1dGlvbkNvbnRyb2xsZXIgY29udHJvbGxlciA9IGNtZC5leGVjdXRpb25Db250cm9sbGVyKCk7IFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyID0gY21kLnF1ZXJ5TWVtdGFibGVBbmREaXNrKGNmcywgY29udHJvbGxlcikpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gY2ZzLmRlY29yYXRlS2V5KGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIGludCBub3dJblNlYyA9IEZCVXRpbGl0aWVzLm5vd0luU2Vjb25kcygpOwotICAgICAgICAgICAgICAgICAgICBTaW5nbGVQYXJ0aXRpb25SZWFkQ29tbWFuZCBjbWQgPSBTaW5nbGVQYXJ0aXRpb25SZWFkQ29tbWFuZC5mdWxsUGFydGl0aW9uUmVhZChjZnMubWV0YWRhdGEoKSwgbm93SW5TZWMsIGtleSk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSAoUmVhZEV4ZWN1dGlvbkNvbnRyb2xsZXIgY29udHJvbGxlciA9IGNtZC5leGVjdXRpb25Db250cm9sbGVyKCk7IFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyID0gY21kLnF1ZXJ5TWVtdGFibGVBbmREaXNrKGNmcywgY29udHJvbGxlcikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlZFBhcnRpdGlvbiB0b0NhY2hlID0gQ2FjaGVkQlRyZWVQYXJ0aXRpb24uY3JlYXRlKERhdGFMaW1pdHMuY3FsTGltaXRzKHJvd3NUb0NhY2hlKS5maWx0ZXIoaXRlciwgbm93SW5TZWMsIHRydWUpLCBub3dJblNlYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGFpci5jcmVhdGUobmV3IFJvd0NhY2hlS2V5KGNmcy5tZXRhZGF0YSgpLCBrZXkpLCB0b0NhY2hlKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBDYWNoZWRQYXJ0aXRpb24gdG9DYWNoZSA9IENhY2hlZEJUcmVlUGFydGl0aW9uLmNyZWF0ZShEYXRhTGltaXRzLmNxbExpbWl0cyhyb3dzVG9DYWNoZSkuZmlsdGVyKGl0ZXIsIG5vd0luU2VjLCB0cnVlKSwgbm93SW5TZWMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGFpci5jcmVhdGUobmV3IFJvd0NhY2hlS2V5KGNmcy5tZXRhZGF0YSgpLCBrZXkpLCB0b0NhY2hlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9KTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgS2V5Q2FjaGVTZXJpYWxpemVyIGltcGxlbWVudHMgQ2FjaGVTZXJpYWxpemVyPEtleUNhY2hlS2V5LCBSb3dJbmRleEVudHJ5PgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgS2V5Q2FjaGVTZXJpYWxpemVyIGV4dGVuZHMgQ2FjaGVTZXJpYWxpemVyPEtleUNhY2hlS2V5LCBBYnN0cmFjdFJvd0luZGV4RW50cnk+CiAgICAgewotICAgICAgICAvLyBGb3IgY29sdW1uIGZhbWlsaWVzIHdpdGggbWFueSBTU1RhYmxlcyB0aGUgbGluZWFyIG5hdHVyZSBvZiBnZXRTU1RhYmxlcyBzbG93ZWQgZG93biBLZXlDYWNoZSBsb2FkaW5nCi0gICAgICAgIC8vIGJ5IG9yZGVycyBvZiBtYWduaXR1ZGUuIFNvIHdlIGNhY2hlIHRoZSBzc3RhYmxlcyBvbmNlIGFuZCByZWx5IG9uIGNsZWFudXBBZnRlckRlc2VyaWFsaXplIHRvIGNsZWFudXAgYW55Ci0gICAgICAgIC8vIGNhY2hlZCBzdGF0ZSB3ZSBtYXkgaGF2ZSBhY2N1bXVsYXRlZCBkdXJpbmcgdGhlIGxvYWQuCi0gICAgICAgIE1hcDxQYWlyPFN0cmluZywgU3RyaW5nPiwgTWFwPFNTVGFibGVJZCwgU1NUYWJsZVJlYWRlcj4+IGNhY2hlZFNTVGFibGVSZWFkZXJzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UGFpcjxLZXlDYWNoZVN1cHBvcnQ8Pz4sIFNTVGFibGVGb3JtYXQ8PywgPz4+PiByZWFkZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgTGlua2VkSGFzaE1hcDxEZXNjcmlwdG9yLCBQYWlyPEludGVnZXIsIENvbHVtbkZhbWlseVN0b3JlPj4gcmVhZGVyT3JkaW5hbHMgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZU1ldGFkYXRhKERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyLnNlcmlhbGl6ZU1ldGFkYXRhKG91dCk7CisgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihyZWFkZXJPcmRpbmFscy5zaXplKCkpOworICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjOworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8RGVzY3JpcHRvciwgUGFpcjxJbnRlZ2VyLCBDb2x1bW5GYW1pbHlTdG9yZT4+IHRhYmxlIDogcmVhZGVyT3JkaW5hbHMuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZXNjID0gdGFibGUuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gdGFibGUuZ2V0VmFsdWUoKS5yaWdodDsKKyAgICAgICAgICAgICAgICBzdXBlci53cml0ZUNGUyhvdXQsIGNmcyk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlVVRGKGRlc2MudmVyc2lvbi5mb3JtYXQubmFtZSgpKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVVVEYoZGVzYy52ZXJzaW9uLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLndyaXRlV2l0aFNob3J0TGVuZ3RoKGRlc2MuaWQuYXNCeXRlcygpLCBvdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGRlc2VyaWFsaXplTWV0YWRhdGEoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyLmRlc2VyaWFsaXplTWV0YWRhdGEoaW4pOworICAgICAgICAgICAgTWFwPENvbHVtbkZhbWlseVN0b3JlLCBNYXA8SW1tdXRhYmxlVHJpcGxlPFNTVGFibGVJZCwgU3RyaW5nLCBTU1RhYmxlRm9ybWF0PD8sID8+PiwgU1NUYWJsZVJlYWRlcj4+IHRtcFJlYWRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICBpbnQgc3N0YWJsZXNOdW0gPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKKyAgICAgICAgICAgIHJlYWRlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJlYWRlcnMuZW5zdXJlQ2FwYWNpdHkoc3N0YWJsZXNOdW0pOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzc3RhYmxlc051bTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IHJlYWRDRlMoaW4pOworICAgICAgICAgICAgICAgIFN0cmluZyBmb3JtYXROYW1lID0gaW4ucmVhZFVURigpOworICAgICAgICAgICAgICAgIFNTVGFibGVGb3JtYXQ8PywgPz4gZm9ybWF0ID0gT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U1NUYWJsZUZvcm1hdHMoKS5nZXQoZm9ybWF0TmFtZSksICJVbmtub3duIFNTVGFibGUgZm9ybWF0OiAiICsgZm9ybWF0TmFtZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZlcnNpb24gPSBpbi5yZWFkVVRGKCk7CisgICAgICAgICAgICAgICAgU1NUYWJsZUlkIGlkID0gU1NUYWJsZUlkRmFjdG9yeS5pbnN0YW5jZS5mcm9tQnl0ZXMoQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChpbikpOworCisgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXIgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChjZnMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1hcDxJbW11dGFibGVUcmlwbGU8U1NUYWJsZUlkLCBTdHJpbmcsIFNTVGFibGVGb3JtYXQ8PywgPz4+LCBTU1RhYmxlUmVhZGVyPiByZWFkZXJzTWFwID0gdG1wUmVhZGVycy5nZXQoY2ZzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlcnNNYXAgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU2V0PFNTVGFibGVSZWFkZXI+IGxpdmVSZWFkZXJzID0gY2ZzLmdldExpdmVTU1RhYmxlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPD4obGl2ZVJlYWRlcnMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciByIDogbGl2ZVJlYWRlcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyc01hcC5wdXQoSW1tdXRhYmxlVHJpcGxlLm9mKHIuZGVzY3JpcHRvci5pZCwgci5kZXNjcmlwdG9yLnZlcnNpb24udG9TdHJpbmcoKSwgci5kZXNjcmlwdG9yLnZlcnNpb24uZm9ybWF0KSwgcik7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXBSZWFkZXJzLnB1dChjZnMsIHJlYWRlcnNNYXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlYWRlciA9IHJlYWRlcnNNYXAuZ2V0KEltbXV0YWJsZVRyaXBsZS5vZihpZCwgdmVyc2lvbiwgZm9ybWF0KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZWFkZXIgaW5zdGFuY2VvZiBLZXlDYWNoZVN1cHBvcnQ8Pz4pCisgICAgICAgICAgICAgICAgICAgIHJlYWRlcnMuYWRkKFBhaXIuY3JlYXRlKChLZXlDYWNoZVN1cHBvcnQ8Pz4pIHJlYWRlciwgZm9ybWF0KSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZWFkZXJzLmFkZChQYWlyLmNyZWF0ZShudWxsLCBmb3JtYXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShLZXlDYWNoZUtleSBrZXksIERhdGFPdXRwdXRQbHVzIG91dCwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewotICAgICAgICAgICAgUm93SW5kZXhFbnRyeSBlbnRyeSA9IENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5nZXRJbnRlcm5hbChrZXkpOworICAgICAgICAgICAgQWJzdHJhY3RSb3dJbmRleEVudHJ5IGVudHJ5ID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmdldEludGVybmFsKGtleSk7CiAgICAgICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkKICAgICAgICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEgdGFibGVNZXRhZGF0YSA9IGNmcy5tZXRhZGF0YSgpOwotICAgICAgICAgICAgdGFibGVNZXRhZGF0YS5pZC5zZXJpYWxpemUob3V0KTsKLSAgICAgICAgICAgIG91dC53cml0ZVVURih0YWJsZU1ldGFkYXRhLmluZGV4TmFtZSgpLm9yRWxzZSgiIikpOwotICAgICAgICAgICAgQnl0ZUFycmF5VXRpbC53cml0ZVdpdGhMZW5ndGgoa2V5LmtleSwgb3V0KTsKLSAgICAgICAgICAgIGlmIChrZXkuZGVzYy5pZCBpbnN0YW5jZW9mIFNlcXVlbmNlQmFzZWRTU1RhYmxlSWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlSW50KCgoU2VxdWVuY2VCYXNlZFNTVGFibGVJZCkga2V5LmRlc2MuaWQpLmdlbmVyYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dC53cml0ZUludChJbnRlZ2VyLk1JTl9WQUxVRSk7IC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciAiaW50IGJhc2VkIGdlbmVyYXRpb24gb25seSIKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC53cml0ZVdpdGhTaG9ydExlbmd0aChrZXkuZGVzYy5pZC5hc0J5dGVzKCksIG91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQud3JpdGVCb29sZWFuKHRydWUpOwotCi0gICAgICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciA9IG5ldyBTZXJpYWxpemF0aW9uSGVhZGVyKGZhbHNlLCBjZnMubWV0YWRhdGEoKSwgY2ZzLm1ldGFkYXRhKCkucmVndWxhckFuZFN0YXRpY0NvbHVtbnMoKSwgRW5jb2RpbmdTdGF0cy5OT19TVEFUUyk7Ci0gICAgICAgICAgICBrZXkuZGVzYy5nZXRGb3JtYXQoKS5nZXRJbmRleFNlcmlhbGl6ZXIoY2ZzLm1ldGFkYXRhKCksIGtleS5kZXNjLnZlcnNpb24sIGhlYWRlcikuc2VyaWFsaXplRm9yQ2FjaGUoZW50cnksIG91dCk7CisgICAgICAgICAgICB3cml0ZVNTVGFibGUoY2ZzLCBrZXkuZGVzYywgb3V0KTsKKyAgICAgICAgICAgIG91dC53cml0ZUludChrZXkua2V5Lmxlbmd0aCk7CisgICAgICAgICAgICBvdXQud3JpdGUoa2V5LmtleSk7CisgICAgICAgICAgICBlbnRyeS5zZXJpYWxpemVGb3JDYWNoZShvdXQpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIEZ1dHVyZTxQYWlyPEtleUNhY2hlS2V5LCBSb3dJbmRleEVudHJ5Pj4gZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbnB1dCwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgcHVibGljIEZ1dHVyZTxQYWlyPEtleUNhY2hlS2V5LCBBYnN0cmFjdFJvd0luZGV4RW50cnk+PiBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBza2lwRW50cnkgPSBjZnMgPT0gbnVsbCB8fCAhY2ZzLmlzS2V5Q2FjaGVFbmFibGVkKCk7CisgICAgICAgICAgICBQYWlyPEtleUNhY2hlU3VwcG9ydDw/PiwgU1NUYWJsZUZvcm1hdDw/LCA/Pj4gcmVhZGVyID0gcmVhZFNTVGFibGUoaW5wdXQpOworICAgICAgICAgICAgYm9vbGVhbiBza2lwRW50cnkgPSByZWFkZXIubGVmdCA9PSBudWxsIHx8ICFyZWFkZXIubGVmdC5nZXRLZXlDYWNoZSgpLmlzRW5hYmxlZCgpOwogCi0gICAgICAgICAgICAvL0tleXNwYWNlIGFuZCBDRiBuYW1lIGFyZSBkZXNlcmlhbGl6ZWQgYnkgQXV0b1NhdmluZyBjYWNoZSBhbmQgdXNlZCB0byBmZXRjaCB0aGUgQ0ZTIHByb3ZpZGVkIGFzIGEKLSAgICAgICAgICAgIC8vcGFyYW1ldGVyIHNvIHRoZXkgYXJlbid0IGRlc2VyaWFsaXplZCBoZXJlLCBldmVuIHRob3VnaCB0aGV5IGFyZSBzZXJpYWxpemVkIGJ5IHRoaXMgc2VyaWFsaXplcgogICAgICAgICAgICAgaW50IGtleUxlbmd0aCA9IGlucHV0LnJlYWRJbnQoKTsKICAgICAgICAgICAgIGlmIChrZXlMZW5ndGggPiBGQlV0aWxpdGllcy5NQVhfVU5TSUdORURfU0hPUlQpCi0gICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkNvcnJ1cHRlZCBrZXkgY2FjaGUuIEtleSBsZW5ndGggb2YgJWQgaXMgbG9uZ2VyIHRoYW4gbWF4aW11bSBvZiAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5TGVuZ3RoLCBGQlV0aWxpdGllcy5NQVhfVU5TSUdORURfU0hPUlQpKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIEJ5dGVCdWZmZXIga2V5ID0gQnl0ZUJ1ZmZlclV0aWwucmVhZChpbnB1dCwga2V5TGVuZ3RoKTsKLSAgICAgICAgICAgIGludCBnZW5lcmF0aW9uID0gaW5wdXQucmVhZEludCgpOwotICAgICAgICAgICAgU1NUYWJsZUlkIGdlbmVyYXRpb25JZCA9IGdlbmVyYXRpb24gPT0gSW50ZWdlci5NSU5fVkFMVUUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU1NUYWJsZUlkRmFjdG9yeS5pbnN0YW5jZS5mcm9tQnl0ZXMoQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChpbnB1dCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBTZXF1ZW5jZUJhc2VkU1NUYWJsZUlkKGdlbmVyYXRpb24pOyAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgImludCBiYXNlZCBnZW5lcmF0aW9uIHNzdGFibGVzIgotICAgICAgICAgICAgaW5wdXQucmVhZEJvb2xlYW4oKTsgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yICJwcm9tb3RlZCBpbmRleGVzIiBib29sZWFuCi0gICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoIXNraXBFbnRyeSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQYWlyPFN0cmluZywgU3RyaW5nPiBxdWFsaWZpZWROYW1lID0gUGFpci5jcmVhdGUoY2ZzLm1ldGFkYXRhLmtleXNwYWNlLCBjZnMubWV0YWRhdGEubmFtZSk7Ci0gICAgICAgICAgICAgICAgTWFwPFNTVGFibGVJZCwgU1NUYWJsZVJlYWRlcj4gZ2VuZXJhdGlvblRvU1NUYWJsZVJlYWRlciA9IGNhY2hlZFNTVGFibGVSZWFkZXJzLmdldChxdWFsaWZpZWROYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvblRvU1NUYWJsZVJlYWRlciA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvblRvU1NUYWJsZVJlYWRlciA9IG5ldyBIYXNoTWFwPD4oY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc1RhYmxlUmVhZGVyIDogY2ZzLmdldFNTVGFibGVzKFNTVGFibGVTZXQuQ0FOT05JQ0FMKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvblRvU1NUYWJsZVJlYWRlci5wdXQoc3NUYWJsZVJlYWRlci5kZXNjcmlwdG9yLmlkLCBzc1RhYmxlUmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGNhY2hlZFNTVGFibGVSZWFkZXJzLnB1dElmQWJzZW50KHF1YWxpZmllZE5hbWUsIGdlbmVyYXRpb25Ub1NTVGFibGVSZWFkZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZWFkZXIgPSBnZW5lcmF0aW9uVG9TU1RhYmxlUmVhZGVyLmdldChnZW5lcmF0aW9uSWQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2tpcEVudHJ5IHx8IHJlYWRlciA9PSBudWxsKQorICAgICAgICAgICAgaWYgKHNraXBFbnRyeSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBUaGUgc3N0YWJsZSBkb2Vzbid0IGV4aXN0IGFueW1vcmUsIHNvIHdlIGNhbid0IGJlIHN1cmUgb2YgdGhlIGV4YWN0IHZlcnNpb24gYW5kIGFzc3VtZSBpdHMgdGhlIGN1cnJlbnQgdmVyc2lvbi4gVGhlIG9ubHkgY2FzZSB3aGVyZSB3ZSdsbCBiZQogICAgICAgICAgICAgICAgIC8vIHdyb25nIGlzIGR1cmluZyB1cGdyYWRlLCBpbiB3aGljaCBjYXNlIHdlIGZhaWwgYXQgZGVzZXJpYWxpemF0aW9uLiBUaGlzIGlzIG5vdCBhIGh1Z2UgZGVhbCBob3dldmVyIHNpbmNlIDEpIHRoaXMgaXMgdW5saWtlbHkgZW5vdWdoIHRoYXQKICAgICAgICAgICAgICAgICAvLyB0aGlzIHdvbid0IGFmZmVjdCBtYW55IHVzZXJzIChpZiBhbnkpIGFuZCBvbmx5IG9uY2UsIDIpIHRoaXMgZG9lc24ndCBwcmV2ZW50IHRoZSBub2RlIGZyb20gc3RhcnRpbmcgYW5kIDMpIENBU1NBTkRSQS0xMDIxOSBzaG93cyB0aGF0IHRoaXMKICAgICAgICAgICAgICAgICAvLyBwYXJ0IG9mIHRoZSBjb2RlIGhhcyBiZWVuIGJyb2tlbiBmb3IgYSB3aGlsZSB3aXRob3V0IGFueW9uZSBub3RpY2luZyAoaXQgaXMsIGJ0dywgc3RpbGwgYnJva2VuIHVudGlsIENBU1NBTkRSQS0xMDIxOSBpcyBmaXhlZCkuCi0gICAgICAgICAgICAgICAgUm93SW5kZXhFbnRyeS5TZXJpYWxpemVyLnNraXBGb3JDYWNoZShpbnB1dCk7CisgICAgICAgICAgICAgICAgU1NUYWJsZUZvcm1hdC5LZXlDYWNoZVZhbHVlU2VyaWFsaXplcjw/LCA/PiBzZXJpYWxpemVyID0gcmVhZGVyLnJpZ2h0LmdldEtleUNhY2hlVmFsdWVTZXJpYWxpemVyKCk7CisKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLnNraXAoaW5wdXQpOwogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9uZyBwb3MgPSAoKFJhbmRvbUFjY2Vzc1JlYWRlcikgaW5wdXQpLmdldFBvc2l0aW9uKCk7CisgICAgICAgICAgICBBYnN0cmFjdFJvd0luZGV4RW50cnkgY2FjaGVWYWx1ZTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhY2hlVmFsdWUgPSByZWFkZXIubGVmdC5kZXNlcmlhbGl6ZUtleUNhY2hlVmFsdWUoaW5wdXQpOworICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB8IEVycm9yIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiRGVzZXJpYWxpemluZyBrZXkgY2FjaGUgZW50cnkgYXQge30gZm9yIHt9IiwgcG9zLCByZWFkZXIubGVmdCk7CisgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLZXlDYWNoZUtleSBjYWNoZUtleSA9IHJlYWRlci5sZWZ0LmdldENhY2hlS2V5KGtleSk7CisgICAgICAgICAgICByZXR1cm4gSW1tZWRpYXRlRnV0dXJlLnN1Y2Nlc3MoUGFpci5jcmVhdGUoY2FjaGVLZXksIGNhY2hlVmFsdWUpKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBSb3dJbmRleEVudHJ5LkluZGV4U2VyaWFsaXplcjw/PiBpbmRleFNlcmlhbGl6ZXIgPSByZWFkZXIuZGVzY3JpcHRvci5nZXRGb3JtYXQoKS5nZXRJbmRleFNlcmlhbGl6ZXIocmVhZGVyLm1ldGFkYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmRlc2NyaXB0b3IudmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuaGVhZGVyKTsKLSAgICAgICAgICAgIFJvd0luZGV4RW50cnk8Pz4gZW50cnkgPSBpbmRleFNlcmlhbGl6ZXIuZGVzZXJpYWxpemVGb3JDYWNoZShpbnB1dCk7Ci0gICAgICAgICAgICByZXR1cm4gSW1tZWRpYXRlRnV0dXJlLnN1Y2Nlc3MoUGFpci5jcmVhdGUobmV3IEtleUNhY2hlS2V5KGNmcy5tZXRhZGF0YSgpLCByZWFkZXIuZGVzY3JpcHRvciwga2V5KSwgZW50cnkpKTsKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlU1NUYWJsZShDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIERlc2NyaXB0b3IgZGVzYywgRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0T3JDcmVhdGVDRlNPcmRpbmFsKGNmcyk7CisgICAgICAgICAgICBQYWlyPEludGVnZXIsIENvbHVtbkZhbWlseVN0b3JlPiBleGlzdGluZyA9IHJlYWRlck9yZGluYWxzLnB1dElmQWJzZW50KGRlc2MsIFBhaXIuY3JlYXRlKHJlYWRlck9yZGluYWxzLnNpemUoKSwgY2ZzKSk7CisgICAgICAgICAgICBpbnQgb3JkaW5hbCA9IGV4aXN0aW5nID09IG51bGwgPyByZWFkZXJPcmRpbmFscy5zaXplKCkgLSAxIDogZXhpc3RpbmcubGVmdDsKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKG9yZGluYWwpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBQYWlyPEtleUNhY2hlU3VwcG9ydDw/PiwgU1NUYWJsZUZvcm1hdDw/LCA/Pj4gcmVhZFNTVGFibGUoRGF0YUlucHV0UGx1cyBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBvcmRpbmFsID0gaW5wdXQucmVhZFVuc2lnbmVkVkludDMyKCk7CisgICAgICAgICAgICBpZiAob3JkaW5hbCA+PSByZWFkZXJzLnNpemUoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNvcnJ1cHRlZCBrZXkgY2FjaGUuIEZhaWxlZCB0byBkZXNlcmlhbGl6ZSBrZXkgb2Yga2V5IGNhY2hlIC0gaW52YWxpZCBzc3RhYmxlIG9yZGluYWwgIiArIG9yZGluYWwpOworICAgICAgICAgICAgcmV0dXJuIHJlYWRlcnMuZ2V0KG9yZGluYWwpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgY2xlYW51cEFmdGVyRGVzZXJpYWxpemUoKQogICAgICAgICB7Ci0gICAgICAgICAgICBjYWNoZWRTU1RhYmxlUmVhZGVycy5jbGVhcigpOworICAgICAgICAgICAgc3VwZXIuY2xlYW51cEFmdGVyRGVzZXJpYWxpemUoKTsKKyAgICAgICAgICAgIHJlYWRlcnMuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFudXBBZnRlclNlcmlhbGl6ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyLmNsZWFudXBBZnRlclNlcmlhbGl6ZSgpOworICAgICAgICAgICAgcmVhZGVyT3JkaW5hbHMuY2xlYXIoKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQ2Fzc2FuZHJhRGFlbW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0Nhc3NhbmRyYURhZW1vbi5qYXZhCmluZGV4IGYxYmNhNjYuLjg0ZmM1YjEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQ2Fzc2FuZHJhRGFlbW9uLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9DYXNzYW5kcmFEYWVtb24uamF2YQpAQCAtODcsMTUgKzg3LDIyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTmF0aXZlTGlicmFyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkZ1dHVyZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkZ1dHVyZUNvbWJpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmxvZ2dpbmcuTG9nZ2luZ1N1cHBvcnRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmxvZ2dpbmcuVmlydHVhbFRhYmxlQXBwZW5kZXI7CiAKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTkFOT1NFQ09ORFM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX0ZPUkVHUk9VTkQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX0pNWF9MT0NBTF9QT1JUOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9KTVhfUkVNT1RFX1BPUlQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX1BJRF9GSUxFOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNPTV9TVU5fTUFOQUdFTUVOVF9KTVhSRU1PVEVfUE9SVDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5KQVZBX0NMQVNTX1BBVEg7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSkFWQV9STUlfU0VSVkVSX1JBTkRPTV9JRDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5KQVZBX1ZFUlNJT047CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSkFWQV9WTV9OQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk1FVFJJQ1NfUkVQT1JURVJfQ09ORklHX0ZJTEU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU0laRV9SRUNPUkRFUl9JTlRFUlZBTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TVEFSVF9OQVRJVkVfVFJBTlNQT1JUOwogCiAvKioKICAqIFRoZSA8Y29kZT5DYXNzYW5kcmFEYWVtb248L2NvZGU+IGlzIGFuIGFic3RyYWN0aW9uIGZvciBhIENhc3NhbmRyYSBkYWVtb24KQEAgLTE0OSw3ICsxNTYsNyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZhLnJtaS5zZXJ2ZXIucmFuZG9tSURzIiwgInRydWUiKTsKKyAgICAgICAgSkFWQV9STUlfU0VSVkVSX1JBTkRPTV9JRC5zZXRCb29sZWFuKHRydWUpOwogCiAgICAgICAgIC8vIElmIGEgcmVtb3RlIHBvcnQgaGFzIGJlZW4gc3BlY2lmaWVkIHRoZW4gdXNlIHRoYXQgdG8gc2V0IHVwIGEgSk1YCiAgICAgICAgIC8vIGNvbm5lY3RvciBzZXJ2ZXIgd2hpY2ggY2FuIGJlIGFjY2Vzc2VkIHJlbW90ZWx5LiBPdGhlcndpc2UsIGxvb2sKQEAgLTE2NSw3ICsxNzIsNyBAQAogICAgICAgICBpZiAoam14UG9ydCA9PSBudWxsKQogICAgICAgICB7CiAgICAgICAgICAgICBsb2NhbE9ubHkgPSB0cnVlOwotICAgICAgICAgICAgam14UG9ydCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmpteC5sb2NhbC5wb3J0Iik7CisgICAgICAgICAgICBqbXhQb3J0ID0gQ0FTU0FORFJBX0pNWF9MT0NBTF9QT1JULmdldFN0cmluZygpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGpteFBvcnQgPT0gbnVsbCkKQEAgLTI0Nyw3ICsyNTQsNyBAQAogCiAgICAgICAgIFRocmVhZEF3YXJlU2VjdXJpdHlNYW5hZ2VyLmluc3RhbGwoKTsKIAotICAgICAgICBsb2dTeXN0ZW1JbmZvKCk7CisgICAgICAgIGxvZ1N5c3RlbUluZm8obG9nZ2VyKTsKIAogICAgICAgICBOYXRpdmVMaWJyYXJ5LnRyeU1sb2NrYWxsKCk7CiAKQEAgLTI5MCwyNCArMjk3LDEzIEBACiAKICAgICAgICAgU1NUYWJsZUhlYWRlckZpeC5maXhOb25Gcm96ZW5VRFRJZlVwZ3JhZGVGcm9tMzAoKTsKIAotICAgICAgICAvLyBjbGVhbiB1cCBkZWJyaXMgaW4gdGhlIHJlc3Qgb2YgdGhlIGtleXNwYWNlcwotICAgICAgICBmb3IgKFN0cmluZyBrZXlzcGFjZU5hbWUgOiBTY2hlbWEuaW5zdGFuY2UuZ2V0S2V5c3BhY2VzKCkpCisgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTa2lwIHN5c3RlbSBhcyB3ZSd2ZSBhbHJlYWR5IGNsZWFuZWQgaXQKLSAgICAgICAgICAgIGlmIChrZXlzcGFjZU5hbWUuZXF1YWxzKFNjaGVtYUNvbnN0YW50cy5TWVNURU1fS0VZU1BBQ0VfTkFNRSkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIGZvciAoVGFibGVNZXRhZGF0YSBjZm0gOiBTY2hlbWEuaW5zdGFuY2UuZ2V0VGFibGVzQW5kVmlld3Moa2V5c3BhY2VOYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlLnNjcnViRGF0YURpcmVjdG9yaWVzKGNmbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTdGFydHVwRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBleGl0T3JGYWlsKGUucmV0dXJuQ29kZSwgZS5nZXRNZXNzYWdlKCksIGUuZ2V0Q2F1c2UoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgc2NydWJEYXRhRGlyZWN0b3JpZXMoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoU3RhcnR1cEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBleGl0T3JGYWlsKGUucmV0dXJuQ29kZSwgZS5nZXRNZXNzYWdlKCksIGUuZ2V0Q2F1c2UoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBLZXlzcGFjZS5zZXRJbml0aWFsaXplZCgpOwpAQCAtMzc3LDcgKzM3Myw3IEBACiAKICAgICAgICAgLy8gc2NoZWR1bGUgcGVyaW9kaWMgZHVtcHMgb2YgdGFibGUgc2l6ZSBlc3RpbWF0ZXMgaW50byBTeXN0ZW1LZXlzcGFjZS5TSVpFX0VTVElNQVRFU19DRgogICAgICAgICAvLyBzZXQgY2Fzc2FuZHJhLnNpemVfcmVjb3JkZXJfaW50ZXJ2YWwgdG8gMCB0byBkaXNhYmxlCi0gICAgICAgIGludCBzaXplUmVjb3JkZXJJbnRlcnZhbCA9IEludGVnZXIuZ2V0SW50ZWdlcigiY2Fzc2FuZHJhLnNpemVfcmVjb3JkZXJfaW50ZXJ2YWwiLCA1ICogNjApOworICAgICAgICBpbnQgc2l6ZVJlY29yZGVySW50ZXJ2YWwgPSBTSVpFX1JFQ09SREVSX0lOVEVSVkFMLmdldEludCgpOwogICAgICAgICBpZiAoc2l6ZVJlY29yZGVySW50ZXJ2YWwgPiAwKQogICAgICAgICAgICAgU2NoZWR1bGVkRXhlY3V0b3JzLm9wdGlvbmFsVGFza3Muc2NoZWR1bGVXaXRoRml4ZWREZWxheShTaXplRXN0aW1hdGVzUmVjb3JkZXIuaW5zdGFuY2UsIDMwLCBzaXplUmVjb3JkZXJJbnRlcnZhbCwgVGltZVVuaXQuU0VDT05EUyk7CiAKQEAgLTM4OCw3ICszODQsNyBAQAogICAgICAgICBRdWVyeVByb2Nlc3Nvci5pbnN0YW5jZS5wcmVsb2FkUHJlcGFyZWRTdGF0ZW1lbnRzKCk7CiAKICAgICAgICAgLy8gTWV0cmljcwotICAgICAgICBTdHJpbmcgbWV0cmljc1JlcG9ydGVyQ29uZmlnRmlsZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLm1ldHJpY3NSZXBvcnRlckNvbmZpZ0ZpbGUiKTsKKyAgICAgICAgU3RyaW5nIG1ldHJpY3NSZXBvcnRlckNvbmZpZ0ZpbGUgPSBNRVRSSUNTX1JFUE9SVEVSX0NPTkZJR19GSUxFLmdldFN0cmluZygpOwogICAgICAgICBpZiAobWV0cmljc1JlcG9ydGVyQ29uZmlnRmlsZSAhPSBudWxsKQogICAgICAgICB7CiAgICAgICAgICAgICBsb2dnZXIuaW5mbygiVHJ5aW5nIHRvIGxvYWQgbWV0cmljcy1yZXBvcnRlci1jb25maWcgZnJvbSBmaWxlOiB7fSIsIG1ldHJpY3NSZXBvcnRlckNvbmZpZ0ZpbGUpOwpAQCAtNTc4LDYgKzU3NCwyOCBAQAogICAgIHsKICAgICAgICAgVmlydHVhbEtleXNwYWNlUmVnaXN0cnkuaW5zdGFuY2UucmVnaXN0ZXIoVmlydHVhbFNjaGVtYUtleXNwYWNlLmluc3RhbmNlKTsKICAgICAgICAgVmlydHVhbEtleXNwYWNlUmVnaXN0cnkuaW5zdGFuY2UucmVnaXN0ZXIoU3lzdGVtVmlld3NLZXlzcGFjZS5pbnN0YW5jZSk7CisKKyAgICAgICAgLy8gZmx1c2ggbG9nIG1lc3NhZ2VzIHRvIHN5c3RlbV92aWV3cy5zeXN0ZW1fbG9ncyB2aXJ0dWFsIHRhYmxlIGFzIHRoZXJlIHdlcmUgbWVzc2FnZXMgYWxyZWFkeSBsb2dnZWQKKyAgICAgICAgLy8gYmVmb3JlIHRoYXQgdmlydHVhbCB0YWJsZSB3YXMgaW5zdGFudGlhdGVkCisgICAgICAgIExvZ2dpbmdTdXBwb3J0RmFjdG9yeS5nZXRMb2dnaW5nU3VwcG9ydCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBcHBlbmRlcihWaXJ0dWFsVGFibGVBcHBlbmRlci5jbGFzcywgVmlydHVhbFRhYmxlQXBwZW5kZXIuQVBQRU5ERVJfTkFNRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlmUHJlc2VudChhcHBlbmRlciAtPiAoKFZpcnR1YWxUYWJsZUFwcGVuZGVyKSBhcHBlbmRlcikuZmx1c2hCdWZmZXIoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2NydWJEYXRhRGlyZWN0b3JpZXMoKSB0aHJvd3MgU3RhcnR1cEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gY2xlYW4gdXAgZGVicmlzIGluIHRoZSByZXN0IG9mIHRoZSBrZXlzcGFjZXMKKyAgICAgICAgZm9yIChTdHJpbmcga2V5c3BhY2VOYW1lIDogU2NoZW1hLmluc3RhbmNlLmdldEtleXNwYWNlcygpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBTa2lwIHN5c3RlbSBhcyB3ZSd2ZSBhbHJlYWR5IGNsZWFuZWQgaXQKKyAgICAgICAgICAgIGlmIChrZXlzcGFjZU5hbWUuZXF1YWxzKFNjaGVtYUNvbnN0YW50cy5TWVNURU1fS0VZU1BBQ0VfTkFNRSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGZvciAoVGFibGVNZXRhZGF0YSBjZm0gOiBTY2hlbWEuaW5zdGFuY2UuZ2V0VGFibGVzQW5kVmlld3Moa2V5c3BhY2VOYW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZS5zY3J1YkRhdGFEaXJlY3RvcmllcyhjZm0pOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGluaXRpYWxpemVDbGllbnRUcmFuc3BvcnRzKCkKQEAgLTYxNCw3ICs2MzIsNyBAQAogICAgICAgICByZXR1cm4gc2V0dXBDb21wbGV0ZWQ7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGxvZ1N5c3RlbUluZm8oKQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dTeXN0ZW1JbmZvKExvZ2dlciBsb2dnZXIpCiAgICAgewogICAgIAlpZiAobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKICAgICAJewpAQCAtNjg1LDggKzcwMyw4IEBACiAKICAgICBwcml2YXRlIHZvaWQgc3RhcnRDbGllbnRUcmFuc3BvcnRzKCkKICAgICB7Ci0gICAgICAgIFN0cmluZyBuYXRpdmVGbGFnID0gU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEuc3RhcnRfbmF0aXZlX3RyYW5zcG9ydCIpOwotICAgICAgICBpZiAoKG5hdGl2ZUZsYWcgIT0gbnVsbCAmJiBCb29sZWFuLnBhcnNlQm9vbGVhbihuYXRpdmVGbGFnKSkgfHwgKG5hdGl2ZUZsYWcgPT0gbnVsbCAmJiBEYXRhYmFzZURlc2NyaXB0b3Iuc3RhcnROYXRpdmVUcmFuc3BvcnQoKSkpCisgICAgICAgIFN0cmluZyBuYXRpdmVGbGFnID0gU1RBUlRfTkFUSVZFX1RSQU5TUE9SVC5nZXRTdHJpbmcoKTsKKyAgICAgICAgaWYgKFNUQVJUX05BVElWRV9UUkFOU1BPUlQuZ2V0Qm9vbGVhbigpIHx8IChuYXRpdmVGbGFnID09IG51bGwgJiYgRGF0YWJhc2VEZXNjcmlwdG9yLnN0YXJ0TmF0aXZlVHJhbnNwb3J0KCkpKQogICAgICAgICB7CiAgICAgICAgICAgICBzdGFydE5hdGl2ZVRyYW5zcG9ydCgpOwogICAgICAgICAgICAgU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2Uuc2V0UnBjUmVhZHkodHJ1ZSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0NsaWVudFN0YXRlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0NsaWVudFN0YXRlLmphdmEKaW5kZXggOWUzNWM3Zi4uZjAzYTk3MSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9DbGllbnRTdGF0ZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQ2xpZW50U3RhdGUuamF2YQpAQCAtNTgsNiArNTgsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpWTVN0YWJpbGl0eUluc3BlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5NRDVEaWdlc3Q7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DVVNUT01fUVVFUllfSEFORExFUl9DTEFTUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLmN1cnJlbnRUaW1lTWlsbGlzOwogCiAvKioKQEAgLTEwMSwxMyArMTAyLDE0IEBACiAgICAgc3RhdGljCiAgICAgewogICAgICAgICBRdWVyeUhhbmRsZXIgaGFuZGxlciA9IFF1ZXJ5UHJvY2Vzc29yLmluc3RhbmNlOwotICAgICAgICBTdHJpbmcgY3VzdG9tSGFuZGxlckNsYXNzID0gU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEuY3VzdG9tX3F1ZXJ5X2hhbmRsZXJfY2xhc3MiKTsKKyAgICAgICAgU3RyaW5nIGN1c3RvbUhhbmRsZXJDbGFzcyA9IENVU1RPTV9RVUVSWV9IQU5ETEVSX0NMQVNTLmdldFN0cmluZygpOwogICAgICAgICBpZiAoY3VzdG9tSGFuZGxlckNsYXNzICE9IG51bGwpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBGQlV0aWxpdGllcy5jb25zdHJ1Y3QoY3VzdG9tSGFuZGxlckNsYXNzLCAiUXVlcnlIYW5kbGVyIik7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlVzaW5nIHt9IGFzIHF1ZXJ5IGhhbmRsZXIgZm9yIG5hdGl2ZSBwcm90b2NvbCBxdWVyaWVzIChhcyByZXF1ZXN0ZWQgd2l0aCAtRGNhc3NhbmRyYS5jdXN0b21fcXVlcnlfaGFuZGxlcl9jbGFzcykiLCBjdXN0b21IYW5kbGVyQ2xhc3MpOworICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJVc2luZyB7fSBhcyBhIHF1ZXJ5IGhhbmRsZXIgZm9yIG5hdGl2ZSBwcm90b2NvbCBxdWVyaWVzIChhcyByZXF1ZXN0ZWQgYnkgdGhlIHt9IHN5c3RlbSBwcm9wZXJ0eSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbUhhbmRsZXJDbGFzcywgQ1VTVE9NX1FVRVJZX0hBTkRMRVJfQ0xBU1MuZ2V0S2V5KCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQogICAgICAgICAgICAgewpAQCAtNDE0LDYgKzQxNiwyNyBAQAogICAgICAgICBlbnN1cmVQZXJtaXNzaW9uKHRhYmxlLmtleXNwYWNlLCBwZXJtLCB0YWJsZS5yZXNvdXJjZSk7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaGFzVGFibGVQZXJtaXNzaW9uKFRhYmxlTWV0YWRhdGEgdGFibGUsIFBlcm1pc3Npb24gcGVybSkKKyAgICB7CisgICAgICAgIGlmIChpc0ludGVybmFsKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgdmFsaWRhdGVMb2dpbigpOworCisgICAgICAgIGlmICghRGF0YWJhc2VEZXNjcmlwdG9yLmdldEF1dGhvcml6ZXIoKS5yZXF1aXJlQXV0aG9yaXphdGlvbigpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgTGlzdDw/IGV4dGVuZHMgSVJlc291cmNlPiByZXNvdXJjZXMgPSBSZXNvdXJjZXMuY2hhaW4odGFibGUucmVzb3VyY2UpOworICAgICAgICBpZiAoRGF0YWJhc2VEZXNjcmlwdG9yLmdldEF1dGhGcm9tUm9vdCgpKQorICAgICAgICAgICAgcmVzb3VyY2VzID0gTGlzdHMucmV2ZXJzZShyZXNvdXJjZXMpOworCisgICAgICAgIGZvciAoSVJlc291cmNlIHIgOiByZXNvdXJjZXMpCisgICAgICAgICAgICBpZiAoYXV0aG9yaXplKHIpLmNvbnRhaW5zKHBlcm0pKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgZW5zdXJlUGVybWlzc2lvbihTdHJpbmcga2V5c3BhY2UsIFBlcm1pc3Npb24gcGVybSwgRGF0YVJlc291cmNlIHJlc291cmNlKQogICAgIHsKICAgICAgICAgdmFsaWRhdGVLZXlzcGFjZShrZXlzcGFjZSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0RhdGFSZXN1cnJlY3Rpb25DaGVjay5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9EYXRhUmVzdXJyZWN0aW9uQ2hlY2suamF2YQppbmRleCAyYzNiMDM1Li40Y2YzMjc4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0RhdGFSZXN1cnJlY3Rpb25DaGVjay5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvRGF0YVJlc3VycmVjdGlvbkNoZWNrLmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSnNvblV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiAKIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CkBAIC04NiwxMiArODYsMTIgQEAKIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemVUb0pzb25GaWxlKEZpbGUgb3V0cHV0RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZCVXRpbGl0aWVzLnNlcmlhbGl6ZVRvSnNvbkZpbGUodGhpcywgb3V0cHV0RmlsZSk7CisgICAgICAgICAgICBKc29uVXRpbHMuc2VyaWFsaXplVG9Kc29uRmlsZSh0aGlzLCBvdXRwdXRGaWxlKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgSGVhcnRiZWF0IGRlc2VyaWFsaXplRnJvbUpzb25GaWxlKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBGQlV0aWxpdGllcy5kZXNlcmlhbGl6ZUZyb21Kc29uRmlsZShIZWFydGJlYXQuY2xhc3MsIGZpbGUpOworICAgICAgICAgICAgcmV0dXJuIEpzb25VdGlscy5kZXNlcmlhbGl6ZUZyb21Kc29uRmlsZShIZWFydGJlYXQuY2xhc3MsIGZpbGUpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0xvYWRCcm9hZGNhc3Rlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9Mb2FkQnJvYWRjYXN0ZXIuamF2YQppbmRleCBlYmRhM2NkLi5kYTkzZWJkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0xvYWRCcm9hZGNhc3Rlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvTG9hZEJyb2FkY2FzdGVyLmphdmEKQEAgLTMwLDkgKzMwLDExIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvcnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZ21zLio7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5CUk9BRENBU1RfSU5URVJWQUxfTVM7CisKIHB1YmxpYyBjbGFzcyBMb2FkQnJvYWRjYXN0ZXIgaW1wbGVtZW50cyBJRW5kcG9pbnRTdGF0ZUNoYW5nZVN1YnNjcmliZXIKIHsKLSAgICBzdGF0aWMgZmluYWwgaW50IEJST0FEQ0FTVF9JTlRFUlZBTCA9IEludGVnZXIuZ2V0SW50ZWdlcigiY2Fzc2FuZHJhLmJyb2FkY2FzdF9pbnRlcnZhbF9tcyIsIDYwICogMTAwMCk7CisgICAgc3RhdGljIGZpbmFsIGludCBCUk9BRENBU1RfSU5URVJWQUwgPSBCUk9BRENBU1RfSU5URVJWQUxfTVMuZ2V0SW50KCk7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvYWRCcm9hZGNhc3RlciBpbnN0YW5jZSA9IG5ldyBMb2FkQnJvYWRjYXN0ZXIoKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9OYXRpdmVUcmFuc3BvcnRTZXJ2aWNlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL05hdGl2ZVRyYW5zcG9ydFNlcnZpY2UuamF2YQppbmRleCBmMTMxZDc0Li5jYzZlZTM3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL05hdGl2ZVRyYW5zcG9ydFNlcnZpY2UuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL05hdGl2ZVRyYW5zcG9ydFNlcnZpY2UuamF2YQpAQCAtNDAsNiArNDAsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5TZXJ2ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTmF0aXZlTGlicmFyeTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk5BVElWRV9FUE9MTF9FTkFCTEVEOworCiAvKioKICAqIEhhbmRsZXMgbmF0aXZlIHRyYW5zcG9ydCBzZXJ2ZXIgbGlmZWN5Y2xlIGFuZCBhc3NvY2lhdGVkIHJlc291cmNlcy4gTGF6aWx5IGluaXRpYWxpemVkLgogICovCkBAIC0xNjAsNyArMTYyLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXNlRXBvbGwoKQogICAgIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBlbmFibGVFcG9sbCA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLm5hdGl2ZS5lcG9sbC5lbmFibGVkIiwgInRydWUiKSk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZW5hYmxlRXBvbGwgPSBOQVRJVkVfRVBPTExfRU5BQkxFRC5nZXRCb29sZWFuKCk7CiAKICAgICAgICAgaWYgKGVuYWJsZUVwb2xsICYmICFFcG9sbC5pc0F2YWlsYWJsZSgpICYmIE5hdGl2ZUxpYnJhcnkub3NUeXBlID09IE5hdGl2ZUxpYnJhcnkuT1NUeXBlLkxJTlVYKQogICAgICAgICAgICAgbG9nZ2VyLndhcm4oImVwb2xsIG5vdCBhdmFpbGFibGUiLCBFcG9sbC51bmF2YWlsYWJpbGl0eUNhdXNlKCkpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TU1RhYmxlc0dsb2JhbFRyYWNrZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU1NUYWJsZXNHbG9iYWxUcmFja2VyLmphdmEKaW5kZXggZGU3ODg5Mi4uNmE3YmFmMyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TU1RhYmxlc0dsb2JhbFRyYWNrZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1NTVGFibGVzR2xvYmFsVHJhY2tlci5qYXZhCkBAIC0zNiw3ICszNiw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLlRyYWNrZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVmVyc2lvbkFuZFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLklOb3RpZmljYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5JTm90aWZpY2F0aW9uQ29uc3VtZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5Jbml0aWFsU1NUYWJsZUFkZGVkTm90aWZpY2F0aW9uOwpAQCAtNzgsMjMgKzc4LDIzIEBACiAKICAgICBwcml2YXRlIGZpbmFsIFNldDxEZXNjcmlwdG9yPiBhbGxTU1RhYmxlcyA9IENvbmN1cnJlbnRIYXNoTWFwLm5ld0tleVNldCgpOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBWZXJzaW9uQW5kVHlwZSBjdXJyZW50VmVyc2lvbjsKKyAgICBwcml2YXRlIGZpbmFsIFZlcnNpb24gY3VycmVudFZlcnNpb247CiAgICAgcHJpdmF0ZSBpbnQgc3N0YWJsZXNGb3JDdXJyZW50VmVyc2lvbjsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxWZXJzaW9uQW5kVHlwZSwgSW50ZWdlcj4gc3N0YWJsZXNGb3JPdGhlclZlcnNpb25zID0gbmV3IEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFZlcnNpb24sIEludGVnZXI+IHNzdGFibGVzRm9yT3RoZXJWZXJzaW9ucyA9IG5ldyBIYXNoTWFwPD4oKTsKIAotICAgIHByaXZhdGUgdm9sYXRpbGUgSW1tdXRhYmxlU2V0PFZlcnNpb25BbmRUeXBlPiB2ZXJzaW9uc0luVXNlID0gSW1tdXRhYmxlU2V0Lm9mKCk7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBJbW11dGFibGVTZXQ8VmVyc2lvbj4gdmVyc2lvbnNJblVzZSA9IEltbXV0YWJsZVNldC5vZigpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SU5vdGlmaWNhdGlvbkNvbnN1bWVyPiBzdWJzY3JpYmVycyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5U2V0PD4oKTsKIAotICAgIHB1YmxpYyBTU1RhYmxlc0dsb2JhbFRyYWNrZXIoU1NUYWJsZUZvcm1hdC5UeXBlIGN1cnJlbnRTU1RhYmxlRm9ybWF0KQorICAgIHB1YmxpYyBTU1RhYmxlc0dsb2JhbFRyYWNrZXIoU1NUYWJsZUZvcm1hdDw/LCA/PiBjdXJyZW50U1NUYWJsZUZvcm1hdCkKICAgICB7Ci0gICAgICAgIHRoaXMuY3VycmVudFZlcnNpb24gPSBuZXcgVmVyc2lvbkFuZFR5cGUoY3VycmVudFNTVGFibGVGb3JtYXQuaW5mby5nZXRMYXRlc3RWZXJzaW9uKCksIGN1cnJlbnRTU1RhYmxlRm9ybWF0KTsKKyAgICAgICAgdGhpcy5jdXJyZW50VmVyc2lvbiA9IGN1cnJlbnRTU1RhYmxlRm9ybWF0LmdldExhdGVzdFZlcnNpb24oKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBUaGUgc2V0IG9mIGFsbCBzc3RhYmxlIHZlcnNpb25zIGN1cnJlbnRseSBpbiB1c2Ugb24gdGhpcyBub2RlLgogICAgICAqLwotICAgIHB1YmxpYyBTZXQ8VmVyc2lvbkFuZFR5cGU+IHZlcnNpb25zSW5Vc2UoKQorICAgIHB1YmxpYyBTZXQ8VmVyc2lvbj4gdmVyc2lvbnNJblVzZSgpCiAgICAgewogICAgICAgICByZXR1cm4gdmVyc2lvbnNJblVzZTsKICAgICB9CkBAIC0xNTEsNyArMTUxLDcgQEAKICAgICAgICAgIHN5bmNocm9uaXplZCBibG9jay4KICAgICAgICAgKi8KICAgICAgICAgaW50IGN1cnJlbnREZWx0YSA9IDA7Ci0gICAgICAgIE1hcDxWZXJzaW9uQW5kVHlwZSwgSW50ZWdlcj4gb3RoZXJzRGVsdGEgPSBudWxsOworICAgICAgICBNYXA8VmVyc2lvbiwgSW50ZWdlcj4gb3RoZXJzRGVsdGEgPSBudWxsOwogICAgICAgICAvKgogICAgICAgICAgTm90ZTogd2UgZGVhbCB3aXRoIHJlbW92ZXMgZmlyc3QgYXMgaWYgYSBub3RpZmljYXRpb24gYm90aCByZW1vdmVzIGFuZCBhZGRzLCBpdCdzIGEgY29tcGFjdGlvbiBhbmQgd2hpbGUKICAgICAgICAgIGl0IHNob3VsZCBuZXZlciByZW1vdmUgYW5kIGFkZCB0aGUgc2FtZSBkZXNjcmlwdG9yIGluIHByYWN0aWNlLCBkb2luZyB0aGUgcmVtb3ZlIGZpcnN0IGlzIG1vcmUgbG9naWNhbC4KQEAgLTE2MSw3ICsxNjEsNyBAQAogICAgICAgICAgICAgaWYgKCFhbGxTU1RhYmxlcy5yZW1vdmUoZGVzYykpCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAKLSAgICAgICAgICAgIFZlcnNpb25BbmRUeXBlIHZlcnNpb24gPSB2ZXJzaW9uKGRlc2MpOworICAgICAgICAgICAgVmVyc2lvbiB2ZXJzaW9uID0gZGVzYy52ZXJzaW9uOwogICAgICAgICAgICAgaWYgKGN1cnJlbnRWZXJzaW9uLmVxdWFscyh2ZXJzaW9uKSkKICAgICAgICAgICAgICAgICAtLWN1cnJlbnREZWx0YTsKICAgICAgICAgICAgIGVsc2UKQEAgLTE3Miw3ICsxNzIsNyBAQAogICAgICAgICAgICAgaWYgKCFhbGxTU1RhYmxlcy5hZGQoZGVzYykpCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAKLSAgICAgICAgICAgIFZlcnNpb25BbmRUeXBlIHZlcnNpb24gPSB2ZXJzaW9uKGRlc2MpOworICAgICAgICAgICAgVmVyc2lvbiB2ZXJzaW9uID0gZGVzYy52ZXJzaW9uOwogICAgICAgICAgICAgaWYgKGN1cnJlbnRWZXJzaW9uLmVxdWFscyh2ZXJzaW9uKSkKICAgICAgICAgICAgICAgICArK2N1cnJlbnREZWx0YTsKICAgICAgICAgICAgIGVsc2UKQEAgLTE5Niw5ICsxOTYsOSBAQAogCiAgICAgICAgICAgICBpZiAob3RoZXJzRGVsdGEgIT0gbnVsbCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxWZXJzaW9uQW5kVHlwZSwgSW50ZWdlcj4gZW50cnkgOiBvdGhlcnNEZWx0YS5lbnRyeVNldCgpKQorICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFZlcnNpb24sIEludGVnZXI+IGVudHJ5IDogb3RoZXJzRGVsdGEuZW50cnlTZXQoKSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFZlcnNpb25BbmRUeXBlIHZlcnNpb24gPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiB2ZXJzaW9uID0gZW50cnkuZ2V0S2V5KCk7CiAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSA9IGVudHJ5LmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVzIHRoZSBjb3VudCwgcmVtb3ZpbmcgdGhlIHZlcnNpb24gaWYgaXQgcmVhY2hlcyAwIChub3RlOiB3ZSBjb3VsZCB1c2UgTWFwI2NvbXB1dGUgZm9yIHRoaXMsCkBAIC0yMjEsMTYgKzIyMSwxNiBAQAogICAgICAgICByZXR1cm4gdHJpZ2dlclVwZGF0ZTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBJbW11dGFibGVTZXQ8VmVyc2lvbkFuZFR5cGU+IGNvbXB1dGVWZXJzaW9uc0luVXNlKGludCBzc3RhYmxlc0ZvckN1cnJlbnRWZXJzaW9uLCBWZXJzaW9uQW5kVHlwZSBjdXJyZW50VmVyc2lvbiwgTWFwPFZlcnNpb25BbmRUeXBlLCBJbnRlZ2VyPiBzc3RhYmxlc0Zvck90aGVyVmVyc2lvbnMpCisgICAgcHJpdmF0ZSBzdGF0aWMgSW1tdXRhYmxlU2V0PFZlcnNpb24+IGNvbXB1dGVWZXJzaW9uc0luVXNlKGludCBzc3RhYmxlc0ZvckN1cnJlbnRWZXJzaW9uLCBWZXJzaW9uIGN1cnJlbnRWZXJzaW9uLCBNYXA8VmVyc2lvbiwgSW50ZWdlcj4gc3N0YWJsZXNGb3JPdGhlclZlcnNpb25zKQogICAgIHsKLSAgICAgICAgSW1tdXRhYmxlU2V0LkJ1aWxkZXI8VmVyc2lvbkFuZFR5cGU+IGJ1aWxkZXIgPSBJbW11dGFibGVTZXQuYnVpbGRlcigpOworICAgICAgICBJbW11dGFibGVTZXQuQnVpbGRlcjxWZXJzaW9uPiBidWlsZGVyID0gSW1tdXRhYmxlU2V0LmJ1aWxkZXIoKTsKICAgICAgICAgaWYgKHNzdGFibGVzRm9yQ3VycmVudFZlcnNpb24gPiAwKQogICAgICAgICAgICAgYnVpbGRlci5hZGQoY3VycmVudFZlcnNpb24pOwogICAgICAgICBidWlsZGVyLmFkZEFsbChzc3RhYmxlc0Zvck90aGVyVmVyc2lvbnMua2V5U2V0KCkpOwogICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGludCBzYW5pdGl6ZVNTVGFibGVzQ291bnQoaW50IHNzdGFibGVDb3VudCwgVmVyc2lvbkFuZFR5cGUgdmVyc2lvbikKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgc2FuaXRpemVTU1RhYmxlc0NvdW50KGludCBzc3RhYmxlQ291bnQsIFZlcnNpb24gdmVyc2lvbikKICAgICB7CiAgICAgICAgIGlmIChzc3RhYmxlQ291bnQgPj0gMCkKICAgICAgICAgICAgIHJldHVybiBzc3RhYmxlQ291bnQ7CkBAIC0yNDEsNyArMjQxLDcgQEAKICAgICAgICAgKi8KICAgICAgICAgbm9TcGFtTG9nZ2VyLmVycm9yKCJJbnZhbGlkIHN0YXRlIHdoaWxlIGhhbmRsaW5nIHNzdGFibGVzIGNoYW5nZSBub3RpZmljYXRpb246IHRoZSBudW1iZXIgb2Ygc3N0YWJsZXMgZm9yICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcnNpb24ge30gd2FzIGNvbXB1dGVkIHRvIHt9LiBUaGlzIGluZGljYXRlIGEgYnVnIGFuZCBwbGVhc2UgcmVwb3J0IGl0LCBidXQgaXQgc2hvdWxkICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBoYXZlIGFkdmVyc2UgY29uc2VxdWVuY2VzLiIsIHZlcnNpb24sIHNzdGFibGVDb3VudCwgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGhhdmUgYWR2ZXJzZSBjb25zZXF1ZW5jZXMuIiwgdmVyc2lvbi50b0Zvcm1hdEFuZFZlcnNpb25TdHJpbmcoKSwgc3N0YWJsZUNvdW50LCBuZXcgUnVudGltZUV4Y2VwdGlvbigpKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC0yNjcsMTggKzI2NywxMyBAQAogICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIE1hcDxWZXJzaW9uQW5kVHlwZSwgSW50ZWdlcj4gdXBkYXRlKE1hcDxWZXJzaW9uQW5kVHlwZSwgSW50ZWdlcj4gY291bnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb25BbmRUeXBlIHRvVXBkYXRlLAorICAgIHByaXZhdGUgc3RhdGljIE1hcDxWZXJzaW9uLCBJbnRlZ2VyPiB1cGRhdGUoTWFwPFZlcnNpb24sIEludGVnZXI+IGNvdW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIHRvVXBkYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSkKICAgICB7Ci0gICAgICAgIE1hcDxWZXJzaW9uQW5kVHlwZSwgSW50ZWdlcj4gbSA9IGNvdW50cyA9PSBudWxsID8gbmV3IEhhc2hNYXA8PigpIDogY291bnRzOworICAgICAgICBNYXA8VmVyc2lvbiwgSW50ZWdlcj4gbSA9IGNvdW50cyA9PSBudWxsID8gbmV3IEhhc2hNYXA8PigpIDogY291bnRzOwogICAgICAgICBtLm1lcmdlKHRvVXBkYXRlLCBkZWx0YSwgKGEsIGIpIC0+IChhICsgYiA9PSAwKSA/IG51bGwgOiAoYSArIGIpKTsKICAgICAgICAgcmV0dXJuIG07CiAgICAgfQogCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgc3RhdGljIFZlcnNpb25BbmRUeXBlIHZlcnNpb24oRGVzY3JpcHRvciBzc3RhYmxlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBWZXJzaW9uQW5kVHlwZShzc3RhYmxlLnZlcnNpb24sIHNzdGFibGUuZm9ybWF0VHlwZSk7Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TU1RhYmxlc1ZlcnNpb25zSW5Vc2VDaGFuZ2VOb3RpZmljYXRpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU1NUYWJsZXNWZXJzaW9uc0luVXNlQ2hhbmdlTm90aWZpY2F0aW9uLmphdmEKaW5kZXggMzUyYmVjNy4uMDhmNjdhNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TU1RhYmxlc1ZlcnNpb25zSW5Vc2VDaGFuZ2VOb3RpZmljYXRpb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1NTVGFibGVzVmVyc2lvbnNJblVzZUNoYW5nZU5vdGlmaWNhdGlvbi5qYXZhCkBAIC0xOCw5ICsxOCwxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2U7CiAKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb25BbmRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5JTm90aWZpY2F0aW9uOwogCiAvKioKQEAgLTM1LDkgKzM3LDkgQEAKICAgICAvKioKICAgICAgKiBUaGUgc2V0IG9mIGFsbCBzc3RhYmxlIHZlcnNpb25zIGluIHVzZSBvbiB0aGlzIG5vZGUgYXQgdGhlIHRpbWUgb2YgdGhpcyBub3RpZmljYXRpb24uCiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIEltbXV0YWJsZVNldDxWZXJzaW9uQW5kVHlwZT4gdmVyc2lvbnNJblVzZTsKKyAgICBwdWJsaWMgZmluYWwgSW1tdXRhYmxlU2V0PFZlcnNpb24+IHZlcnNpb25zSW5Vc2U7CiAKLSAgICBTU1RhYmxlc1ZlcnNpb25zSW5Vc2VDaGFuZ2VOb3RpZmljYXRpb24oSW1tdXRhYmxlU2V0PFZlcnNpb25BbmRUeXBlPiB2ZXJzaW9uc0luVXNlKQorICAgIFNTVGFibGVzVmVyc2lvbnNJblVzZUNoYW5nZU5vdGlmaWNhdGlvbihJbW11dGFibGVTZXQ8VmVyc2lvbj4gdmVyc2lvbnNJblVzZSkKICAgICB7CiAgICAgICAgIHRoaXMudmVyc2lvbnNJblVzZSA9IHZlcnNpb25zSW5Vc2U7CiAgICAgfQpAQCAtNDUsNiArNDcsNiBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlNTVGFibGVzSW5Vc2VDaGFuZ2VOb3RpZmljYXRpb24oJXMpIiwgdmVyc2lvbnNJblVzZSk7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJTU1RhYmxlc0luVXNlQ2hhbmdlTm90aWZpY2F0aW9uKCVzKSIsIHZlcnNpb25zSW5Vc2Uuc3RyZWFtKCkubWFwKFZlcnNpb246OnRvRm9ybWF0QW5kVmVyc2lvblN0cmluZykuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TbmFwc2hvdFZlcmJIYW5kbGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1NuYXBzaG90VmVyYkhhbmRsZXIuamF2YQppbmRleCA4NTBjOTgyLi45OWI1MTA1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1NuYXBzaG90VmVyYkhhbmRsZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1NuYXBzaG90VmVyYkhhbmRsZXIuamF2YQpAQCAtMTcsMTYgKzE3LDIzIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZTsKIAoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbmFwc2hvdENvbW1hbmQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU25hcHNob3RDb21tYW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LklWZXJiSGFuZGxlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5EaWFnbm9zdGljU25hcHNob3RTZXJ2aWNlOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5QYXJhbVR5cGUuU05BUFNIT1RfUkFOR0VTOworCiBwdWJsaWMgY2xhc3MgU25hcHNob3RWZXJiSGFuZGxlciBpbXBsZW1lbnRzIElWZXJiSGFuZGxlcjxTbmFwc2hvdENvbW1hbmQ+CiB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTbmFwc2hvdFZlcmJIYW5kbGVyIGluc3RhbmNlID0gbmV3IFNuYXBzaG90VmVyYkhhbmRsZXIoKTsKQEAgLTM3LDExICs0NCwxNCBAQAogICAgICAgICBTbmFwc2hvdENvbW1hbmQgY29tbWFuZCA9IG1lc3NhZ2UucGF5bG9hZDsKICAgICAgICAgaWYgKGNvbW1hbmQuY2xlYXJfc25hcHNob3QpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEtleXNwYWNlLmNsZWFyU25hcHNob3QoY29tbWFuZC5zbmFwc2hvdF9uYW1lLCBjb21tYW5kLmtleXNwYWNlKTsKKyAgICAgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmNsZWFyU25hcHNob3QoY29tbWFuZC5zbmFwc2hvdF9uYW1lLCBjb21tYW5kLmtleXNwYWNlKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChEaWFnbm9zdGljU25hcHNob3RTZXJ2aWNlLmlzRGlhZ25vc3RpY1NuYXBzaG90UmVxdWVzdChjb21tYW5kKSkKICAgICAgICAgewotICAgICAgICAgICAgRGlhZ25vc3RpY1NuYXBzaG90U2VydmljZS5zbmFwc2hvdChjb21tYW5kLCBtZXNzYWdlLmZyb20oKSk7CisgICAgICAgICAgICBMaXN0PFJhbmdlPFRva2VuPj4gcmFuZ2VzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZS5oZWFkZXIucGFyYW1zKCkuY29udGFpbnNLZXkoU05BUFNIT1RfUkFOR0VTKSkKKyAgICAgICAgICAgICAgICByYW5nZXMgPSAoTGlzdDxSYW5nZTxUb2tlbj4+KSBtZXNzYWdlLmhlYWRlci5wYXJhbXMoKS5nZXQoU05BUFNIT1RfUkFOR0VTKTsKKyAgICAgICAgICAgIERpYWdub3N0aWNTbmFwc2hvdFNlcnZpY2Uuc25hcHNob3QoY29tbWFuZCwgcmFuZ2VzLCBtZXNzYWdlLmZyb20oKSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0YXJ0dXBDaGVjay5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdGFydHVwQ2hlY2suamF2YQppbmRleCAzMzFiMzgxLi5jMzc5MGU4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0YXJ0dXBDaGVjay5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RhcnR1cENoZWNrLmphdmEKQEAgLTMxLDcgKzMxLDcgQEAKICAqIG1pc2NvbmZpZ3VyYXRpb24gb2YgY2x1c3Rlcl9uYW1lIGluIGNhc3NhbmRyYS55YW1sLgogICoKICAqIFRoZSBTdGFydHVwQ2hlY2tzIGNsYXNzIG1hbmFnZXMgYSBjb2xsZWN0aW9uIG9mIHRoZXNlIHRlc3RzLCB3aGljaCBpdCBleGVjdXRlcwotICogcmlnaHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VydmVyIHNldHR1cCBwcm9jZXNzLgorICogcmlnaHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VydmVyIHNldHVwIHByb2Nlc3MuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgU3RhcnR1cENoZWNrCiB7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0YXJ0dXBDaGVja3MuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RhcnR1cENoZWNrcy5qYXZhCmluZGV4IDBhYWNjMDIuLmQwNGQ1NTkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RhcnR1cENoZWNrcy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RhcnR1cENoZWNrcy5qYXZhCkBAIC03Myw2ICs3Myw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTmF0aXZlTGlicmFyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5TaWdhckxpYnJhcnk7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfSk1YX0xPQ0FMX1BPUlQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09NX1NVTl9NQU5BR0VNRU5UX0pNWFJFTU9URV9QT1JUOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkpBVkFfVkVSU0lPTjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5KQVZBX1ZNX05BTUU7CkBAIC0xNjQsNyArMTY1LDcgQEAKIAogICAgIC8qKgogICAgICAqIFJ1biB0aGUgY29uZmlndXJlZCB0ZXN0cyBhbmQgcmV0dXJuIGEgcmVwb3J0IGRldGFpbGluZyB0aGUgcmVzdWx0cy4KLSAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuU3RhcnR1cEV4Y2VwdGlvbiBpZiBhbnkgdGVzdCBkZXRlcm1pbmVzIHRoYXQgdGhlCisgICAgICogQHRocm93cyBTdGFydHVwRXhjZXB0aW9uIGlmIGFueSB0ZXN0IGRldGVybWluZXMgdGhhdCB0aGUKICAgICAgKiBzeXN0ZW0gaXMgbm90IGluIGFuIHZhbGlkIHN0YXRlIHRvIHN0YXJ0dXAKICAgICAgKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zIHRvIHBhc3MgdG8gcmVzcGVjdGl2ZSBjaGVja3MgZm9yIHRoZWlyIGNvbmZpZ3JhdGlvbgogICAgICAqLwpAQCAtMjU3LDcgKzI1OCw3IEBACiAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIkpNWCBpcyBub3QgZW5hYmxlZCB0byByZWNlaXZlIHJlbW90ZSBjb25uZWN0aW9ucy4gUGxlYXNlIHNlZSBjYXNzYW5kcmEtZW52LnNoIGZvciBtb3JlIGluZm8uIik7CiAgICAgICAgICAgICAgICAgam14UG9ydCA9IENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfSk1YX0xPQ0FMX1BPUlQudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICBpZiAoam14UG9ydCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoImNhc3NhbmRyYS5qbXgubG9jYWwucG9ydCBtaXNzaW5nIGZyb20gY2Fzc2FuZHJhLWVudi5zaCwgdW5hYmxlIHRvIHN0YXJ0IGxvY2FsIEpNWCBzZXJ2aWNlLiIpOworICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoQ0FTU0FORFJBX0pNWF9MT0NBTF9QT1JULmdldEtleSgpICsgIiBtaXNzaW5nIGZyb20gY2Fzc2FuZHJhLWVudi5zaCwgdW5hYmxlIHRvIHN0YXJ0IGxvY2FsIEpNWCBzZXJ2aWNlLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewpAQCAtNTU0LDcgKzU1NSw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzYyA9IERlc2NyaXB0b3IuZnJvbUZpbGVuYW1lKGZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gRGVzY3JpcHRvci5mcm9tRmlsZVdpdGhDb21wb25lbnQoZmlsZSwgZmFsc2UpLmxlZnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlc2MuaXNDb21wYXRpYmxlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZC5hZGQoZmlsZS50b1N0cmluZygpKTsKIApAQCAtNTcwLDYgKzU3MSw0MCBAQAogCiAgICAgICAgICAgICAgICAgcHVibGljIEZpbGVWaXNpdFJlc3VsdCBwcmVWaXNpdERpcmVjdG9yeShQYXRoIGRpciwgQmFzaWNGaWxlQXR0cmlidXRlcyBhdHRycykgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBuYW1lUGFydHMgPSBGaWxlVXRpbHMuZ2V0Q2Fub25pY2FsUGF0aChuZXcgRmlsZShkaXIpKS5zcGxpdChqYXZhLmlvLkZpbGUuc2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVQYXJ0cy5sZW5ndGggPj0gMikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhYmxlUGFydCA9IG5hbWVQYXJ0c1tuYW1lUGFydHMubGVuZ3RoIC0gMV07CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcga3NQYXJ0ID0gbmFtZVBhcnRzW25hbWVQYXJ0cy5sZW5ndGggLSAyXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYmxlUGFydC5jb250YWlucygiLSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlUGFydCA9IHRhYmxlUGFydC5zcGxpdCgiLSIpWzBdOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiB2ZXJ5IG9sZCB2ZXJzaW9ucyBvZiBDYXNzYW5kcmEsIHdlIHdvdWxkbid0IG5lY2Vzc2FyaWx5IGRlbGV0ZSBzc3RhYmxlcyBmcm9tIGRyb3BwZWQgc3lzdGVtIHRhYmxlcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggd2VyZSByZW1vdmVkIGluIHZhcmlvdXMgbWFqb3IgdmVyc2lvbiB1cGdyYWRlcyAoZS5nIHN5c3RlbS5WZXJzaW9ucyBpbiAxLjIpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa3NQYXJ0LmVxdWFscyhTY2hlbWFDb25zdGFudHMuU1lTVEVNX0tFWVNQQUNFX05BTUUpICYmICFTeXN0ZW1LZXlzcGFjZS5BTExfVEFCTEVfTkFNRVMuY29udGFpbnModGFibGVQYXJ0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2Fub25pY2FsUGF0aCA9IEZpbGVVdGlscy5nZXRDYW5vbmljYWxQYXRoKG5ldyBGaWxlKGRpcikpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2FuIGhhdmUgc25hcHNob3RzIG9mIG91ciBzeXN0ZW0gdGFibGVzIG9yIHNuYXBzaG90cyBjcmVhdGVkIHdpdGggYSAtdCB0YWcgb2YgInN5c3RlbSIgdGhhdCB3b3VsZCB0cmlnZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBwb3RlbnRpYWwgd2FybmluZywgc28gd2Ugd2FybiBtb3JlIHNvZnRseSBpbiB0aGUgY2FzZSB0aGF0IGl0J3MgcHJvYmFibHkgYSBzbmFwc2hvdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2Fub25pY2FsUGF0aC5jb250YWlucygic25hcHNob3QiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJGb3VuZCB1bmtub3duIHN5c3RlbSBkaXJlY3Rvcnkge30ue30gYXQge30gdGhhdCBjb250YWlucyB0aGUgd29yZCBzbmFwc2hvdC4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIG1heSBiZSBsZWZ0IG92ZXIgZnJvbSBhIHByZXZpb3VzIHZlcnNpb24gb2YgQ2Fzc2FuZHJhIG9yIG1heSBiZSBub3JtYWwuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIENvbnNpZGVyIHJlbW92aW5nIGFmdGVyIGluc3BlY3Rpb24gaWYgZGV0ZXJtaW5lZCB0byBiZSB1bm5lY2Vzc2FyeS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrc1BhcnQsIHRhYmxlUGFydCwgY2Fub25pY2FsUGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJGb3VuZCB1bmtub3duIHN5c3RlbSBkaXJlY3Rvcnkge30ue30gYXQge30gLSB0aGlzIGlzIGxpa2VseSBsZWZ0IG92ZXIgZnJvbSBhIHByZXZpb3VzICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVyc2lvbiBvZiBDYXNzYW5kcmEgYW5kIHNob3VsZCBiZSByZW1vdmVkIGFmdGVyIGluc3BlY3Rpb24uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3NQYXJ0LCB0YWJsZVBhcnQsIGNhbm9uaWNhbFBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmlsZVZpc2l0UmVzdWx0LlNLSVBfU1VCVFJFRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZGlyLmdldEZpbGVOYW1lKCkudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuYW1lLmVxdWFscyhEaXJlY3Rvcmllcy5TTkFQU0hPVF9TVUJESVIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbmFtZS5lcXVhbHMoRGlyZWN0b3JpZXMuQkFDS1VQU19TVUJESVIpCkBAIC02NDcsNyArNjgyLDcgQEAKICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihTdHJpbmcuZm9ybWF0KCJDYXNzYW5kcmEgc3lzdGVtIHByb3BlcnR5IGZsYWcgJXMgaXMgZGVwcmVjYXRlZCBhbmQgeW91IHNob3VsZCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Ugc3RhcnR1cCBjaGVjayBjb25maWd1cmF0aW9uIGluIGNhc3NhbmRyYS55YW1sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5JR05PUkVfREMuZ2V0S2V5KCkpKTsKLSAgICAgICAgICAgICAgICBlbmFibGVkID0gIUJvb2xlYW4uZ2V0Qm9vbGVhbihDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSUdOT1JFX0RDLmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICBlbmFibGVkID0gIUNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5JR05PUkVfREMuZ2V0Qm9vbGVhbigpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGVuYWJsZWQpCiAgICAgICAgICAgICB7CkBAIC02ODQsNyArNzE5LDcgQEAKICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihTdHJpbmcuZm9ybWF0KCJDYXNzYW5kcmEgc3lzdGVtIHByb3BlcnR5IGZsYWcgJXMgaXMgZGVwcmVjYXRlZCBhbmQgeW91IHNob3VsZCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Ugc3RhcnR1cCBjaGVjayBjb25maWd1cmF0aW9uIGluIGNhc3NhbmRyYS55YW1sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5JR05PUkVfUkFDSy5nZXRLZXkoKSkpOwotICAgICAgICAgICAgICAgIGVuYWJsZWQgPSAhQm9vbGVhbi5nZXRCb29sZWFuKENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5JR05PUkVfUkFDSy5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgZW5hYmxlZCA9ICFDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSUdOT1JFX1JBQ0suZ2V0Qm9vbGVhbigpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGVuYWJsZWQpCiAgICAgICAgICAgICB7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VQcm94eS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdG9yYWdlUHJveHkuamF2YQppbmRleCAyYTBjY2FiLi4xYmI0MGFkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VQcm94eS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RvcmFnZVByb3h5LmphdmEKQEAgLTQ0LDE5ICs0NCwxNSBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5VbmludGVycnVwdGlibGVzOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy5QYXhvczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwotCiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmJhdGNobG9nLkJhdGNoOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmJhdGNobG9nLkJhdGNobG9nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LkRlYnVnZ2FibGVUYXNrLlJ1bm5hYmxlRGVidWdnYWJsZVRhc2s7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5TdGFnZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db25zaXN0ZW5jeUxldmVsOwpAQCAtODgsNiArODQsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Jc0Jvb3RzdHJhcHBpbmdFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5PdmVybG9hZGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuUXVlcnlDYW5jZWxsZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5SZWFkQWJvcnRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5SZWFkRmFpbHVyZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlJlYWRUaW1lb3V0RXhjZXB0aW9uOwpAQCAtMTAyLDYgKzk5LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oaW50cy5IaW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhpbnRzLkhpbnRzU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkFic3RyYWN0UmVwbGljYXRpb25TdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkR5bmFtaWNFbmRwb2ludFNuaXRjaDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkVuZHBvaW50c0ZvclRva2VuOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSUVuZHBvaW50U25pdGNoOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OwpAQCAtMTExLDYgKzEwOSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SZXBsaWNhUGxhbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SZXBsaWNhczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNBU0NsaWVudFJlcXVlc3RNZXRyaWNzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuRGVueWxpc3RNZXRyaWNzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuUmVhZFJlcGFpck1ldHJpY3M7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5TdG9yYWdlTWV0cmljczsKQEAgLTEyNSw2ICsxMjQsMTEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UucGF4b3MuQmFsbG90OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UucGF4b3MuQ29tbWl0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UucGF4b3MuQ29udGVudGlvblN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UucGF4b3MuUGF4b3M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy5QYXhvc1N0YXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UucGF4b3MudjEuUHJlcGFyZUNhbGxiYWNrOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UucGF4b3MudjEuUHJvcG9zZUNhbGxiYWNrOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UucmVhZHMuQWJzdHJhY3RSZWFkRXhlY3V0b3I7CkBAIC0xMzksMTMgKzE0MywxNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk1vbm90b25pY0Nsb2NrOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk5vU3BhbUxvZ2dlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5VbmNoZWNrZWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKIAotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlcy5jb25jYXQ7CiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTExJU0VDT05EUzsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTkFOT1NFQ09ORFM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXMuY29uY2F0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHMuam9pbjsKKwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db25zaXN0ZW5jeUxldmVsLlNFUklBTDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2Uub3V0OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNsaWVudFJlcXVlc3RzTWV0cmljc0hvbGRlci5jYXNSZWFkTWV0cmljczsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DbGllbnRSZXF1ZXN0c01ldHJpY3NIb2xkZXIuY2FzV3JpdGVNZXRyaWNzOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNsaWVudFJlcXVlc3RzTWV0cmljc0hvbGRlci5yZWFkTWV0cmljczsKQEAgLTE1Myw4ICsxNjEsMTUgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DbGllbnRSZXF1ZXN0c01ldHJpY3NIb2xkZXIudmlld1dyaXRlTWV0cmljczsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DbGllbnRSZXF1ZXN0c01ldHJpY3NIb2xkZXIud3JpdGVNZXRyaWNzOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNsaWVudFJlcXVlc3RzTWV0cmljc0hvbGRlci53cml0ZU1ldHJpY3NGb3JMZXZlbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2Uub3V0OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTm9QYXlsb2FkLm5vUGF5bG9hZDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlZlcmIuKjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlZlcmIuQkFUQ0hfU1RPUkVfUkVROworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuVmVyYi5NVVRBVElPTl9SRVE7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5WZXJiLlBBWE9TX0NPTU1JVF9SRVE7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5WZXJiLlBBWE9TX1BSRVBBUkVfUkVROworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuVmVyYi5QQVhPU19QUk9QT1NFX1JFUTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlZlcmIuU0NIRU1BX1ZFUlNJT05fUkVROworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuVmVyYi5UUlVOQ0FURV9SRVE7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQmF0Y2hsb2dSZXNwb25zZUhhbmRsZXIuQmF0Y2hsb2dDbGVhbnVwOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLkJhbGxvdC5GbGFnLkdMT0JBTDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy5CYWxsb3QuRmxhZy5MT0NBTDsKQEAgLTE2NSw3ICsxODAsNiBAQAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwubmFub1RpbWU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlELkdlbmVyYXRvci5uZXh0VGltZVVVSUQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2gubmV3Q291bnREb3duTGF0Y2g7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlscy5qb2luOwogCiBwdWJsaWMgY2xhc3MgU3RvcmFnZVByb3h5IGltcGxlbWVudHMgU3RvcmFnZVByb3h5TUJlYW4KIHsKQEAgLTM1MCw2ICszNjQsOSBAQAogICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZGVzaXJlZCB1cGRhdGVzCiAgICAgICAgICAgICAgICAgUGFydGl0aW9uVXBkYXRlIHVwZGF0ZXMgPSByZXF1ZXN0Lm1ha2VVcGRhdGVzKGN1cnJlbnQsIGNsaWVudFN0YXRlLCBiYWxsb3QpOwogCisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBtZXRyaWNzIGJlZm9yZSB0cmlnZ2VycyBwb3RlbnRpYWxseSBhZGQgbXV0YXRpb25zLgorICAgICAgICAgICAgICAgIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy5yZWNvcmRSb3dBbmRDb2x1bW5Db3VudE1ldHJpY3ModXBkYXRlcyk7CisKICAgICAgICAgICAgICAgICBsb25nIHNpemUgPSB1cGRhdGVzLmRhdGFTaXplKCk7CiAgICAgICAgICAgICAgICAgY2FzV3JpdGVNZXRyaWNzLm11dGF0aW9uU2l6ZS51cGRhdGUoc2l6ZSk7CiAgICAgICAgICAgICAgICAgd3JpdGVNZXRyaWNzRm9yTGV2ZWwoY29uc2lzdGVuY3lGb3JQYXhvcykubXV0YXRpb25TaXplLnVwZGF0ZShzaXplKTsKQEAgLTgyOSw2ICs4NDYsMTIgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGRlc2NyaXB0aW9uKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIlBheG9zICIgKyBtZXNzYWdlLnBheWxvYWQudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwcm90ZWN0ZWQgVmVyYiB2ZXJiKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByZXR1cm4gUEFYT1NfQ09NTUlUX1JFUTsKQEAgLTEyNjMsNyArMTI4Niw3IEBACiAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIlNlbmRpbmcgYmF0Y2hsb2cgc3RvcmUgcmVxdWVzdCB7fSB0byB7fSBmb3Ige30gbXV0YXRpb25zIiwgYmF0Y2guaWQsIHJlcGxpY2EsIGJhdGNoLnNpemUoKSk7CiAKICAgICAgICAgICAgIGlmIChyZXBsaWNhLmlzU2VsZigpKQotICAgICAgICAgICAgICAgIHBlcmZvcm1Mb2NhbGx5KFN0YWdlLk1VVEFUSU9OLCByZXBsaWNhLCAoKSAtPiBCYXRjaGxvZ01hbmFnZXIuc3RvcmUoYmF0Y2gpLCBoYW5kbGVyKTsKKyAgICAgICAgICAgICAgICBwZXJmb3JtTG9jYWxseShTdGFnZS5NVVRBVElPTiwgcmVwbGljYSwgKCkgLT4gQmF0Y2hsb2dNYW5hZ2VyLnN0b3JlKGJhdGNoKSwgaGFuZGxlciwgIkJhdGNobG9nIHN0b3JlIik7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgTWVzc2FnaW5nU2VydmljZS5pbnN0YW5jZSgpLnNlbmRXaXRoQ2FsbGJhY2sobWVzc2FnZSwgcmVwbGljYS5lbmRwb2ludCgpLCBoYW5kbGVyKTsKICAgICAgICAgfQpAQCAtMTI3OSw3ICsxMzAyLDcgQEAKICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIlNlbmRpbmcgYmF0Y2hsb2cgcmVtb3ZlIHJlcXVlc3Qge30gdG8ge30iLCB1dWlkLCB0YXJnZXQpOwogCiAgICAgICAgICAgICBpZiAodGFyZ2V0LmlzU2VsZigpKQotICAgICAgICAgICAgICAgIHBlcmZvcm1Mb2NhbGx5KFN0YWdlLk1VVEFUSU9OLCB0YXJnZXQsICgpIC0+IEJhdGNobG9nTWFuYWdlci5yZW1vdmUodXVpZCkpOworICAgICAgICAgICAgICAgIHBlcmZvcm1Mb2NhbGx5KFN0YWdlLk1VVEFUSU9OLCB0YXJnZXQsICgpIC0+IEJhdGNobG9nTWFuYWdlci5yZW1vdmUodXVpZCksICJCYXRjaGxvZyByZW1vdmUiKTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBNZXNzYWdpbmdTZXJ2aWNlLmluc3RhbmNlKCkuc2VuZChtZXNzYWdlLCB0YXJnZXQuZW5kcG9pbnQoKSk7CiAgICAgICAgIH0KQEAgLTE0NTcsNiArMTQ4MCwxNSBAQAogCiAgICAgICAgIExpc3Q8SW5ldEFkZHJlc3NBbmRQb3J0PiBiYWNrUHJlc3N1cmVIb3N0cyA9IG51bGw7CiAKKyAgICAgICAgLy8gRm9yIHBlcmZvcm1hbmNlLCBNdXRhdGlvbiBjYWNoZXMgc2VyaWFsaXplZCBidWZmZXJzIHRoYXQgYXJlIGNvbXB1dGVkIGxhemlseSBpbiBzZXJpYWxpemVkQnVmZmVyKCkuIFRoYXQKKyAgICAgICAgLy8gY29tcHV0YXRpb24gaXMgbm90IHN5bmNocm9uaXplZCBob3dldmVyIGFuZCB3ZSB3aWxsIHBvdGVudGlhbGx5IGNhbGwgdGhhdCBtZXRob2QgY29uY3VycmVudGx5IGZvciBlYWNoCisgICAgICAgIC8vIGRpc3BhdGNoZWQgbWVzc2FnZSAobm90IHRoYXQgY29uY3VycmVudCBjYWxscyB0byBzZXJpYWxpemVkQnVmZmVyKCkgYXJlICJ1bnNhZmUiIHBlciBzZSwganVzdCB0aGF0IHRoZXkKKyAgICAgICAgLy8gbWF5IHJlc3VsdCBpbiBtdWx0aXBsZSBjb21wdXRhdGlvbnMsIG1ha2luZyB0aGUgY2FjaGluZyBvcHRpbWl6YXRpb24gbW9vdCkuIFNvIGZvcmNpbmcgdGhlIHNlcmlhbGl6YXRpb24KKyAgICAgICAgLy8gaGVyZSB0byBtYWtlIHN1cmUgaXQncyBhbHJlYWR5IGNhY2hlZC9jb21wdXRlZCB3aGVuIGl0J3MgY29uY3VycmVudGx5IHVzZWQgbGF0ZXIuCisgICAgICAgIC8vIFNpZGUgbm90ZTogd2UgaGF2ZSBvbmUgY2FjaGVkIGJ1ZmZlcnMgZm9yIGVhY2ggdXNlZCBFbmNvZGluZ1ZlcnNpb24gYW5kIHRoaXMgb25seSBwcmUtY29tcHV0ZSB0aGUgb25lIGZvcgorICAgICAgICAvLyB0aGUgY3VycmVudCB2ZXJzaW9uLCBidXQgaXQncyBqdXN0IGFuIG9wdGltaXphdGlvbiBhbmQgd2UncmUgb2sgbm90IG9wdGltaXppbmcgZm9yIG1peGVkLXZlcnNpb24gY2x1c3RlcnMuCisgICAgICAgIE11dGF0aW9uLnNlcmlhbGl6ZXIucHJlcGFyZVNlcmlhbGl6ZWRCdWZmZXIobXV0YXRpb24sIE1lc3NhZ2luZ1NlcnZpY2UuY3VycmVudF92ZXJzaW9uKTsKKwogICAgICAgICBmb3IgKFJlcGxpY2EgZGVzdGluYXRpb24gOiBwbGFuLmNvbnRhY3RzKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNoZWNrSGludE92ZXJsb2FkKGRlc3RpbmF0aW9uKTsKQEAgLTE1MjMsNyArMTU1NSw3IEBACiAgICAgICAgIGlmIChpbnNlcnRMb2NhbCkKICAgICAgICAgewogICAgICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwobG9jYWxSZXBsaWNhKTsKLSAgICAgICAgICAgIHBlcmZvcm1Mb2NhbGx5KHN0YWdlLCBsb2NhbFJlcGxpY2EsIG11dGF0aW9uOjphcHBseSwgcmVzcG9uc2VIYW5kbGVyKTsKKyAgICAgICAgICAgIHBlcmZvcm1Mb2NhbGx5KHN0YWdlLCBsb2NhbFJlcGxpY2EsIG11dGF0aW9uOjphcHBseSwgcmVzcG9uc2VIYW5kbGVyLCBtdXRhdGlvbik7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobG9jYWxEYyAhPSBudWxsKQpAQCAtMTU2Niw3ICsxNTk4LDcgQEAKIAogICAgICAgICBpZiAodGFyZ2V0cy5zaXplKCkgPiAxKQogICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXRzLmdldChUaHJlYWRMb2NhbFJhbmRvbS5jdXJyZW50KCkubmV4dEludCgwLCB0YXJnZXRzLnNpemUoKSkpOworICAgICAgICAgICAgdGFyZ2V0ID0gcGlja1JlcGxpY2EodGFyZ2V0cyk7CiAgICAgICAgICAgICBFbmRwb2ludHNGb3JUb2tlbiBmb3J3YXJkVG9SZXBsaWNhcyA9IHRhcmdldHMuZmlsdGVyKHIgLT4gciAhPSB0YXJnZXQsIHRhcmdldHMuc2l6ZSgpKTsKIAogICAgICAgICAgICAgZm9yIChSZXBsaWNhIHJlcGxpY2EgOiBmb3J3YXJkVG9SZXBsaWNhcykKQEAgLTE1ODYsMTEgKzE2MTgsMTkgQEAKICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldHMuZ2V0KDApOwogICAgICAgICB9CiAKKyAgICAgICAgVHJhY2luZy50cmFjZSgiU2VuZGluZyBtdXRhdGlvbiB0byByZW1vdGUgcmVwbGljYSB7fSIsIHRhcmdldCk7CiAgICAgICAgIE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS5zZW5kV3JpdGVXaXRoQ2FsbGJhY2sobWVzc2FnZSwgdGFyZ2V0LCBoYW5kbGVyKTsKICAgICAgICAgbG9nZ2VyLnRyYWNlKCJTZW5kaW5nIG1lc3NhZ2UgdG8ge31Ae30iLCBtZXNzYWdlLmlkKCksIHRhcmdldCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwZXJmb3JtTG9jYWxseShTdGFnZSBzdGFnZSwgUmVwbGljYSBsb2NhbFJlcGxpY2EsIGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlKQorICAgIHByaXZhdGUgc3RhdGljIFJlcGxpY2EgcGlja1JlcGxpY2EoRW5kcG9pbnRzRm9yVG9rZW4gdGFyZ2V0cykKKyAgICB7CisgICAgICAgIEVuZHBvaW50c0ZvclRva2VuIGhlYWx0aHkgPSB0YXJnZXRzLmZpbHRlcihyIC0+IER5bmFtaWNFbmRwb2ludFNuaXRjaC5nZXRTZXZlcml0eShyLmVuZHBvaW50KCkpID09IDApOworICAgICAgICBFbmRwb2ludHNGb3JUb2tlbiBzZWxlY3QgPSBoZWFsdGh5LmlzRW1wdHkoKSA/IHRhcmdldHMgOiBoZWFsdGh5OworICAgICAgICByZXR1cm4gc2VsZWN0LmdldChUaHJlYWRMb2NhbFJhbmRvbS5jdXJyZW50KCkubmV4dEludCgwLCBzZWxlY3Quc2l6ZSgpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwZXJmb3JtTG9jYWxseShTdGFnZSBzdGFnZSwgUmVwbGljYSBsb2NhbFJlcGxpY2EsIGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlLCBTdHJpbmcgZGVzY3JpcHRpb24pCiAgICAgewogICAgICAgICBzdGFnZS5tYXliZUV4ZWN1dGVJbW1lZGlhdGVseShuZXcgTG9jYWxNdXRhdGlvblJ1bm5hYmxlKGxvY2FsUmVwbGljYSkKICAgICAgICAgewpAQCAtMTYwNyw2ICsxNjQ3LDEyIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHByb3RlY3RlZCBWZXJiIHZlcmIoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHJldHVybiBWZXJiLk1VVEFUSU9OX1JFUTsKQEAgLTE2MTQsNyArMTY2MCw3IEBACiAgICAgICAgIH0pOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcGVyZm9ybUxvY2FsbHkoU3RhZ2Ugc3RhZ2UsIFJlcGxpY2EgbG9jYWxSZXBsaWNhLCBmaW5hbCBSdW5uYWJsZSBydW5uYWJsZSwgZmluYWwgUmVxdWVzdENhbGxiYWNrPD8+IGhhbmRsZXIpCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwZXJmb3JtTG9jYWxseShTdGFnZSBzdGFnZSwgUmVwbGljYSBsb2NhbFJlcGxpY2EsIGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlLCBmaW5hbCBSZXF1ZXN0Q2FsbGJhY2s8Pz4gaGFuZGxlciwgT2JqZWN0IGRlc2NyaXB0aW9uKQogICAgIHsKICAgICAgICAgc3RhZ2UubWF5YmVFeGVjdXRlSW1tZWRpYXRlbHkobmV3IExvY2FsTXV0YXRpb25SdW5uYWJsZShsb2NhbFJlcGxpY2EpCiAgICAgICAgIHsKQEAgLTE2MzQsNiArMTY4MCwxNCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb24oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGRlc2NyaXB0aW9uIGlzIGFuIE9iamVjdCBhbmQgdG9TdHJpbmcoKSBjYWxsZWQgc28gd2UgZG8gbm90IGhhdmUgdG8gZXZhbHVhdGUgdGhlIE11dGF0aW9uLnRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICAvLyB1bmxlc3MgZXhwbGljbGl0bHkgY2hlY2tlZAorICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbi50b1N0cmluZygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHByb3RlY3RlZCBWZXJiIHZlcmIoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHJldHVybiBWZXJiLk1VVEFUSU9OX1JFUTsKQEAgLTE2NzMsOCArMTcyNyw4IEBACiAgICAgICAgICAgICAvLyB3ZSBidWlsZCB0aGlzIE9OTFkgdG8gcGVyZm9ybSB0aGUgc3VmZmljaWVuY3kgY2hlY2sgdGhhdCBoYXBwZW5zIG9uIGNvbnN0cnVjdGlvbgogICAgICAgICAgICAgUmVwbGljYVBsYW5zLmZvcldyaXRlKGtleXNwYWNlLCBjbS5jb25zaXN0ZW5jeSgpLCB0aywgUmVwbGljYVBsYW5zLndyaXRlQWxsKTsKIAotICAgICAgICAgICAgLy8gVGhpcyBob3N0IGlzbid0IGEgcmVwbGljYSwgc28gbWFyayB0aGUgcmVxdWVzdCBhcyBiZWluZyByZW1vdGUuIElmIHRoaXMgaG9zdCBpcyBhIAotICAgICAgICAgICAgLy8gcmVwbGljYSwgYXBwbHlDb3VudGVyTXV0YXRpb25PbkNvb3JkaW5hdG9yKCkgaW4gdGhlIGJyYW5jaCBhYm92ZSB3aWxsIGNhbGwgcGVyZm9ybVdyaXRlKCksIGFuZCAKKyAgICAgICAgICAgIC8vIFRoaXMgaG9zdCBpc24ndCBhIHJlcGxpY2EsIHNvIG1hcmsgdGhlIHJlcXVlc3QgYXMgYmVpbmcgcmVtb3RlLiBJZiB0aGlzIGhvc3QgaXMgYQorICAgICAgICAgICAgLy8gcmVwbGljYSwgYXBwbHlDb3VudGVyTXV0YXRpb25PbkNvb3JkaW5hdG9yKCkgaW4gdGhlIGJyYW5jaCBhYm92ZSB3aWxsIGNhbGwgcGVyZm9ybVdyaXRlKCksIGFuZAogICAgICAgICAgICAgLy8gdGhlcmUgd2UnbGwgbWFyayBhIGxvY2FsIHJlcXVlc3QgYWdhaW5zdCB0aGUgbWV0cmljcy4KICAgICAgICAgICAgIHdyaXRlTWV0cmljcy5yZW1vdGVSZXF1ZXN0cy5tYXJrKCk7CiAKQEAgLTE3OTIsNyArMTg0Niw3IEBACiAgICAgcHVibGljIHN0YXRpYyBQYXJ0aXRpb25JdGVyYXRvciByZWFkKFNpbmdsZVBhcnRpdGlvblJlYWRDb21tYW5kLkdyb3VwIGdyb3VwLCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5TGV2ZWwsIGxvbmcgcXVlcnlTdGFydE5hbm9UaW1lKQogICAgIHRocm93cyBVbmF2YWlsYWJsZUV4Y2VwdGlvbiwgSXNCb290c3RyYXBwaW5nRXhjZXB0aW9uLCBSZWFkRmFpbHVyZUV4Y2VwdGlvbiwgUmVhZFRpbWVvdXRFeGNlcHRpb24sIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uCiAgICAgewotICAgICAgICBpZiAoU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuaXNCb290c3RyYXBNb2RlKCkgJiYgIXN5c3RlbUtleXNwYWNlUXVlcnkoZ3JvdXAucXVlcmllcykpCisgICAgICAgIGlmICghaXNTYWZlVG9QZXJmb3JtUmVhZChncm91cC5xdWVyaWVzKSkKICAgICAgICAgewogICAgICAgICAgICAgcmVhZE1ldHJpY3MudW5hdmFpbGFibGVzLm1hcmsoKTsKICAgICAgICAgICAgIHJlYWRNZXRyaWNzRm9yTGV2ZWwoY29uc2lzdGVuY3lMZXZlbCkudW5hdmFpbGFibGVzLm1hcmsoKTsKQEAgLTE4MTksNiArMTg3MywxNiBAQAogICAgICAgICAgICAgIDogcmVhZFJlZ3VsYXIoZ3JvdXAsIGNvbnNpc3RlbmN5TGV2ZWwsIHF1ZXJ5U3RhcnROYW5vVGltZSk7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2FmZVRvUGVyZm9ybVJlYWQoTGlzdDxTaW5nbGVQYXJ0aXRpb25SZWFkQ29tbWFuZD4gcXVlcmllcykKKyAgICB7CisgICAgICAgIHJldHVybiBpc1NhZmVUb1BlcmZvcm1SZWFkKCkgfHwgc3lzdGVtS2V5c3BhY2VRdWVyeShxdWVyaWVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTYWZlVG9QZXJmb3JtUmVhZCgpCisgICAgeworICAgICAgICByZXR1cm4gIVN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmlzQm9vdHN0cmFwTW9kZSgpOworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIFBhcnRpdGlvbkl0ZXJhdG9yIHJlYWRXaXRoUGF4b3MoU2luZ2xlUGFydGl0aW9uUmVhZENvbW1hbmQuR3JvdXAgZ3JvdXAsIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lMZXZlbCwgbG9uZyBxdWVyeVN0YXJ0TmFub1RpbWUpCiAgICAgdGhyb3dzIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLCBVbmF2YWlsYWJsZUV4Y2VwdGlvbiwgUmVhZEZhaWx1cmVFeGNlcHRpb24sIFJlYWRUaW1lb3V0RXhjZXB0aW9uCiAgICAgewpAQCAtMjA4Nyw3ICsyMTUxLDcgQEAKICAgICAgICAgcmV0dXJuIGNvbmNhdEFuZEJsb2NrT25SZXBhaXIocmVzdWx0cywgcmVwYWlycyk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBMb2NhbFJlYWRSdW5uYWJsZSBleHRlbmRzIERyb3BwYWJsZVJ1bm5hYmxlCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMb2NhbFJlYWRSdW5uYWJsZSBleHRlbmRzIERyb3BwYWJsZVJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGVEZWJ1Z2dhYmxlVGFzawogICAgIHsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWFkQ29tbWFuZCBjb21tYW5kOwogICAgICAgICBwcml2YXRlIGZpbmFsIFJlYWRDYWxsYmFjayBoYW5kbGVyOwpAQCAtMjEyOSw2ICsyMTkzLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gY29tbWFuZC5jcmVhdGVFbXB0eVJlc3BvbnNlKCk7CiAgICAgICAgICAgICAgICAgICAgIHJlYWRSZWplY3RlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChRdWVyeUNhbmNlbGxlZEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJRdWVyeSBjYW5jZWxsZWQgKHRpbWVvdXQpIiwgZSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0ICFjb21tYW5kLmlzQ29tcGxldGVkKCkgOiAiTG9jYWwgcmVhZCBtYXJrZWQgYXMgY29tcGxldGVkIGRlc3BpdGUgYmVpbmcgYWJvcnRlZCBieSB0aW1lb3V0IHRvIHRhYmxlICIgKyBjb21tYW5kLm1ldGFkYXRhKCk7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQuY29tcGxldGUoKSkKICAgICAgICAgICAgICAgICB7CkBAIC0yMTU3LDYgKzIyMjcsMjQgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgY3JlYXRpb25UaW1lTmFub3MoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXBwcm94Q3JlYXRpb25UaW1lTmFub3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgc3RhcnRUaW1lTmFub3MoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXBwcm94U3RhcnRUaW1lTmFub3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjb21tYW5kLnRvQ1FMU3RyaW5nKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIFBhcnRpdGlvbkl0ZXJhdG9yIGdldFJhbmdlU2xpY2UoUGFydGl0aW9uUmFuZ2VSZWFkQ29tbWFuZCBjb21tYW5kLApAQCAtMjQ2Nyw3ICsyNTU1LDkgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBEcm9wcGFibGVSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlCiAgICAgewotICAgICAgICBmaW5hbCBsb25nIGFwcHJveENyZWF0aW9uVGltZU5hbm9zOworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgbG9uZyBhcHByb3hDcmVhdGlvblRpbWVOYW5vczsKKyAgICAgICAgcHJvdGVjdGVkIHZvbGF0aWxlIGxvbmcgYXBwcm94U3RhcnRUaW1lTmFub3M7CisgICAgICAgIAogICAgICAgICBmaW5hbCBWZXJiIHZlcmI7CiAKICAgICAgICAgcHVibGljIERyb3BwYWJsZVJ1bm5hYmxlKFZlcmIgdmVyYikKQEAgLTI0NzgsMTEgKzI1NjgsMTEgQEAKIAogICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBydW4oKQogICAgICAgICB7Ci0gICAgICAgICAgICBsb25nIGFwcHJveEN1cnJlbnRUaW1lTmFub3MgPSBNb25vdG9uaWNDbG9jay5HbG9iYWwuYXBwcm94VGltZS5ub3coKTsKKyAgICAgICAgICAgIGFwcHJveFN0YXJ0VGltZU5hbm9zID0gTW9ub3RvbmljQ2xvY2suR2xvYmFsLmFwcHJveFRpbWUubm93KCk7CiAgICAgICAgICAgICBsb25nIGV4cGlyYXRpb25UaW1lTmFub3MgPSB2ZXJiLmV4cGlyZXNBdE5hbm9zKGFwcHJveENyZWF0aW9uVGltZU5hbm9zKTsKLSAgICAgICAgICAgIGlmIChhcHByb3hDdXJyZW50VGltZU5hbm9zID4gZXhwaXJhdGlvblRpbWVOYW5vcykKKyAgICAgICAgICAgIGlmIChhcHByb3hTdGFydFRpbWVOYW5vcyA+IGV4cGlyYXRpb25UaW1lTmFub3MpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZyB0aW1lVGFrZW5OYW5vcyA9IGFwcHJveEN1cnJlbnRUaW1lTmFub3MgLSBhcHByb3hDcmVhdGlvblRpbWVOYW5vczsKKyAgICAgICAgICAgICAgICBsb25nIHRpbWVUYWtlbk5hbm9zID0gYXBwcm94U3RhcnRUaW1lTmFub3MgLSBhcHByb3hDcmVhdGlvblRpbWVOYW5vczsKICAgICAgICAgICAgICAgICBNZXNzYWdpbmdTZXJ2aWNlLmluc3RhbmNlKCkubWV0cmljcy5yZWNvcmRTZWxmRHJvcHBlZE1lc3NhZ2UodmVyYiwgdGltZVRha2VuTmFub3MsIE5BTk9TRUNPTkRTKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC0yNTAzLDkgKzI1OTMsMTAgQEAKICAgICAgKiBMaWtlIERyb3BwYWJsZVJ1bm5hYmxlLCBidXQgaWYgaXQgYWJvcnRzLCBpdCB3aWxsIHJlcnVuIChvbiB0aGUgbXV0YXRpb24gc3RhZ2UpIGFmdGVyCiAgICAgICogbWFya2luZyBpdHNlbGYgYXMgYSBoaW50IGluIHByb2dyZXNzIHNvIHRoYXQgdGhlIGhpbnQgYmFja3ByZXNzdXJlIG1lY2hhbmlzbSBjYW4gZnVuY3Rpb24uCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgTG9jYWxNdXRhdGlvblJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUKKyAgICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBMb2NhbE11dGF0aW9uUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZURlYnVnZ2FibGVUYXNrCiAgICAgewogICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgYXBwcm94Q3JlYXRpb25UaW1lTmFub3MgPSBNb25vdG9uaWNDbG9jay5HbG9iYWwuYXBwcm94VGltZS5ub3coKTsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBsb25nIGFwcHJveFN0YXJ0VGltZU5hbm9zOwogCiAgICAgICAgIHByaXZhdGUgZmluYWwgUmVwbGljYSBsb2NhbFJlcGxpY2E7CiAKQEAgLTI1MTcsMTEgKzI2MDgsMTIgQEAKICAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVuKCkKICAgICAgICAgewogICAgICAgICAgICAgZmluYWwgVmVyYiB2ZXJiID0gdmVyYigpOwotICAgICAgICAgICAgbG9uZyBub3dOYW5vcyA9IE1vbm90b25pY0Nsb2NrLkdsb2JhbC5hcHByb3hUaW1lLm5vdygpOworICAgICAgICAgICAgYXBwcm94U3RhcnRUaW1lTmFub3MgPSBNb25vdG9uaWNDbG9jay5HbG9iYWwuYXBwcm94VGltZS5ub3coKTsKICAgICAgICAgICAgIGxvbmcgZXhwaXJhdGlvblRpbWVOYW5vcyA9IHZlcmIuZXhwaXJlc0F0TmFub3MoYXBwcm94Q3JlYXRpb25UaW1lTmFub3MpOwotICAgICAgICAgICAgaWYgKG5vd05hbm9zID4gZXhwaXJhdGlvblRpbWVOYW5vcykKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGFwcHJveFN0YXJ0VGltZU5hbm9zID4gZXhwaXJhdGlvblRpbWVOYW5vcykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25nIHRpbWVUYWtlbk5hbm9zID0gbm93TmFub3MgLSBhcHByb3hDcmVhdGlvblRpbWVOYW5vczsKKyAgICAgICAgICAgICAgICBsb25nIHRpbWVUYWtlbk5hbm9zID0gYXBwcm94U3RhcnRUaW1lTmFub3MgLSBhcHByb3hDcmVhdGlvblRpbWVOYW5vczsKICAgICAgICAgICAgICAgICBNZXNzYWdpbmdTZXJ2aWNlLmluc3RhbmNlKCkubWV0cmljcy5yZWNvcmRTZWxmRHJvcHBlZE1lc3NhZ2UoVmVyYi5NVVRBVElPTl9SRVEsIHRpbWVUYWtlbk5hbm9zLCBOQU5PU0VDT05EUyk7CiAKICAgICAgICAgICAgICAgICBIaW50UnVubmFibGUgcnVubmFibGUgPSBuZXcgSGludFJ1bm5hYmxlKEVuZHBvaW50c0ZvclRva2VuLm9mKGxvY2FsUmVwbGljYS5yYW5nZSgpLnJpZ2h0LCBsb2NhbFJlcGxpY2EpKQpAQCAtMjU0NSwxNCArMjYzNywzNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGNyZWF0aW9uVGltZU5hbm9zKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGFwcHJveENyZWF0aW9uVGltZU5hbm9zOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIHN0YXJ0VGltZU5hbm9zKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGFwcHJveFN0YXJ0VGltZU5hbm9zOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIGFic3RyYWN0IHB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb24oKTsKKwogICAgICAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgVmVyYiB2ZXJiKCk7CiAgICAgICAgIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHJ1bk1heVRocm93KCkgdGhyb3dzIEV4Y2VwdGlvbjsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nUmVxdWVzdEV4Y2VwdGlvbihFeGNlcHRpb24gZXhjZXB0aW9uLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSZWFkQ29tbWFuZD4gY29tbWFuZHMpCiAgICAgeworICAgICAgICAvLyBNdWx0aXBsZSBkaWZmZXJlbnQgdHlwZXMgb2YgZXJyb3JzIGNhbiBoYXBwZW4sIHNvIGJ5IGRlZHVwcGluZyBvbiB0aGUgZXJyb3IgdHlwZSB3ZSBjYW4gc2VlIGVhY2ggZXJyb3IKKyAgICAgICAgLy8gY2FzZSByYXRoZXIgdGhhbiBqdXN0IGV4cG9zaW5nIHRoZSBmaXJzdCBlcnJvciBzZWVuOyB0aGlzIHNob3VsZCBtYWtlIHN1cmUgbW9yZSByYXJlIGlzc3VlcyBhcmUgZXhwb3NlZAorICAgICAgICAvLyByYXRoZXIgdGhhbiBiZWluZyBoaWRkZW4gYnkgbW9yZSBjb21tb24gZXJyb3JzIHN1Y2ggYXMgdGltZW91dCBvciB1bmF2YWlsYWJsZQorICAgICAgICAvLyBzZWUgQ0FTU0FORFJBLTE3NzU0CisgICAgICAgIFN0cmluZyBtc2cgPSBleGNlcHRpb24uZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiIFwie31cIiB3aGlsZSBleGVjdXRpbmcge30iOwogICAgICAgICBOb1NwYW1Mb2dnZXIubG9nKGxvZ2dlciwgTm9TcGFtTG9nZ2VyLkxldmVsLklORk8sIEZBSUxVUkVfTE9HR0lOR19JTlRFUlZBTF9TRUNPTkRTLCBUaW1lVW5pdC5TRUNPTkRTLAotICAgICAgICAgICAgICAgICAgICAgICAgICJcInt9XCIgd2hpbGUgZXhlY3V0aW5nIHt9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gbmV3IE9iamVjdFtdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLApAQCAtMzA4NCw0ICszMTk2LDQwIEBACiAgICAgewogICAgICAgICByZXR1cm4gUGF4b3NTdGF0ZS5nZXREaXNhYmxlQ29vcmRpbmF0b3JMb2NraW5nKCk7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RHVtcEhlYXBPblVuY2F1Z2h0RXhjZXB0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0RHVtcEhlYXBPblVuY2F1Z2h0RXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RHVtcEhlYXBPblVuY2F1Z2h0RXhjZXB0aW9uKGJvb2xlYW4gZW5hYmxlZCkKKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXREdW1wSGVhcE9uVW5jYXVnaHRFeGNlcHRpb24oZW5hYmxlZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U1N0YWJsZVJlYWRSYXRlUGVyc2lzdGVuY2VFbmFibGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U1N0YWJsZVJlYWRSYXRlUGVyc2lzdGVuY2VFbmFibGVkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U1N0YWJsZVJlYWRSYXRlUGVyc2lzdGVuY2VFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkKKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRTU3RhYmxlUmVhZFJhdGVQZXJzaXN0ZW5jZUVuYWJsZWQoZW5hYmxlZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Q2xpZW50UmVxdWVzdFNpemVNZXRyaWNzRW5hYmxlZCgpCisgICAgeworICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldENsaWVudFJlcXVlc3RTaXplTWV0cmljc0VuYWJsZWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3NFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkKKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3NFbmFibGVkKGVuYWJsZWQpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RvcmFnZVByb3h5TUJlYW4uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RvcmFnZVByb3h5TUJlYW4uamF2YQppbmRleCA1NDYxNDNkLi40YmE0MWQ2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VQcm94eU1CZWFuLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdG9yYWdlUHJveHlNQmVhbi5qYXZhCkBAIC0xMzUsNCArMTM1LDEzIEBACiAKICAgICB2b2lkIHNldFBheG9zQ29vcmRpbmF0b3JMb2NraW5nRGlzYWJsZWQoYm9vbGVhbiBkaXNhYmxlZCk7CiAgICAgYm9vbGVhbiBnZXRQYXhvc0Nvb3JkaW5hdG9yTG9ja2luZ0Rpc2FibGVkKCk7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREdW1wSGVhcE9uVW5jYXVnaHRFeGNlcHRpb24oKTsKKyAgICBwdWJsaWMgdm9pZCBzZXREdW1wSGVhcE9uVW5jYXVnaHRFeGNlcHRpb24oYm9vbGVhbiBlbmFibGVkKTsKKworICAgIGJvb2xlYW4gZ2V0U1N0YWJsZVJlYWRSYXRlUGVyc2lzdGVuY2VFbmFibGVkKCk7CisgICAgdm9pZCBzZXRTU3RhYmxlUmVhZFJhdGVQZXJzaXN0ZW5jZUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKTsKKworICAgIGJvb2xlYW4gZ2V0Q2xpZW50UmVxdWVzdFNpemVNZXRyaWNzRW5hYmxlZCgpOworICAgIHZvaWQgc2V0Q2xpZW50UmVxdWVzdFNpemVNZXRyaWNzRW5hYmxlZChib29sZWFuIGVuYWJsZWQpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdG9yYWdlU2VydmljZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdG9yYWdlU2VydmljZS5qYXZhCmluZGV4IGVkMTBmMDQuLjVlNjY3MTggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RvcmFnZVNlcnZpY2UuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VTZXJ2aWNlLmphdmEKQEAgLTE3LDcgKzE3LDYgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlOwogCi0KIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FcnJvcjsKQEAgLTI3LDExICsyNiwxMyBAQAogaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS50aW1lLkluc3RhbnQ7CitpbXBvcnQgamF2YS50aW1lLmZvcm1hdC5EYXRlVGltZVBhcnNlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwpAQCAtNjEsNyArNjIsMTAgQEAKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbVN1cHBvcnQ7CiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lkxpc3RlbmVyTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25Ccm9hZGNhc3RlclN1cHBvcnQ7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25GaWx0ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25MaXN0ZW5lcjsKIGltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5Db21wb3NpdGVEYXRhOwogaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLk9wZW5EYXRhRXhjZXB0aW9uOwogaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLlRhYnVsYXJEYXRhOwpAQCAtMTE2LDcgKzEyMCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU3lzdGVtS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uVmVyaWZpZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsLlZpcnR1YWxLZXlzcGFjZVJlZ2lzdHJ5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Cb290U3RyYXBwZXI7CkBAIC0xNDIsOSArMTQ2LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZ21zLlRva2VuU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5nbXMuVmVyc2lvbmVkVmFsdWU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGludHMuSGludHNTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVNjcnViYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVZlcmlmaWVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb25BbmRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUGF0aFV0aWxzOwpAQCAtMTY1LDYgKzE3MCw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SZXBsaWNhczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLlN5c3RlbVJlcGxpY2FzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuVG9rZW5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlNhbXBsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5TYW1wbGluZ01hbmFnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5TdG9yYWdlTWV0cmljczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuQXN5bmNPbmVSZXNwb25zZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnZTsKQEAgLTIwMCw2ICsyMDcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYWNpbmcuVHJhY2VLZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuQ2xpZW50UmVzb3VyY2VMaW1pdHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jazsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5FeGVjdXRvclV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpWTVN0YWJpbGl0eUluc3BlY3RvcjsKQEAgLTIyMCw2ICsyMjgsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnByb2dyZXNzLmpteC5KTVhCcm9hZGNhc3RFeGVjdXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5wcm9ncmVzcy5qbXguSk1YUHJvZ3Jlc3NTdXBwb3J0OwogCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OwogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlcy50cmFuc2Zvcm07CiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLnRyeUZpbmQ7CiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5BcnJheXMuYXNMaXN0OwpAQCAtMjMwLDEwICsyMzksMjQgQEAKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuU0VDT05EUzsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdDsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTWFwOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkFMTE9XX1VOU0FGRV9KT0lOOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkFMTE9XX1VOU0FGRV9SRVBMQUNFOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkJPT1RTVFJBUF9TQ0hFTUFfREVMQVlfTVM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQk9PVFNUUkFQX1NLSVBfU0NIRU1BX0NIRUNLOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNPTlNJU1RFTlRfUkFOR0VfTU9WRU1FTlQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09OU0lTVEVOVF9TSU1VTFRBTkVPVVNfTU9WRVNfQUxMT1c7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRFJBSU5fRVhFQ1VUT1JfVElNRU9VVF9NUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5KT0lOX1JJTkc7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTE9BRF9SSU5HX1NUQVRFOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk9WRVJSSURFX0RFQ09NTUlTU0lPTjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5QQVhPU19SRVBBSVJfT05fVE9QT0xPR1lfQ0hBTkdFX1JFVFJJRVM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUEFYT1NfUkVQQUlSX09OX1RPUE9MT0dZX0NIQU5HRV9SRVRSWV9ERUxBWV9TRUNPTkRTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJFUExBQ0VNRU5UX0FMTE9XX0VNUFRZOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJFUExBQ0VfQUREUkVTUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5SRVBMQUNFX0FERFJFU1NfRklSU1RfQk9PVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5SRVNFVF9CT09UU1RSQVBfUFJPR1JFU1M7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU1RBUlRfR09TU0lQOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfV1JJVEVfU1VSVkVZOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5TZWNvbmRhcnlJbmRleE1hbmFnZXIuZ2V0SW5kZXhOYW1lOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5TZWNvbmRhcnlJbmRleE1hbmFnZXIuaXNJbmRleENvbHVtbkZhbWlseTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk5vUGF5bG9hZC5ub1BheWxvYWQ7CkBAIC0zMDEsMTAgKzMyNCwxNSBAQAogICAgIHByaXZhdGUgZmluYWwgTGlzdDxSdW5uYWJsZT4gcHJlU2h1dGRvd25Ib29rcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgIHByaXZhdGUgZmluYWwgTGlzdDxSdW5uYWJsZT4gcG9zdFNodXRkb3duSG9va3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAotICAgIHByaXZhdGUgZmluYWwgU25hcHNob3RNYW5hZ2VyIHNuYXBzaG90TWFuYWdlciA9IG5ldyBTbmFwc2hvdE1hbmFnZXIoKTsKKyAgICBwdWJsaWMgZmluYWwgU25hcHNob3RNYW5hZ2VyIHNuYXBzaG90TWFuYWdlciA9IG5ldyBTbmFwc2hvdE1hbmFnZXIoKTsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RvcmFnZVNlcnZpY2UgaW5zdGFuY2UgPSBuZXcgU3RvcmFnZVNlcnZpY2UoKTsKIAorICAgIHByaXZhdGUgZmluYWwgU2FtcGxpbmdNYW5hZ2VyIHNhbXBsaW5nTWFuYWdlciA9IG5ldyBTYW1wbGluZ01hbmFnZXIoKTsKKworICAgIEBWaXNpYmxlRm9yVGVzdGluZyAvLyB0aGlzIGlzIHVzZWQgZm9yIGR0ZXN0cyBvbmx5LCBzZWUgQ0FTU0FORFJBLTE4MTUyCisgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gc2tpcE5vdGlmaWNhdGlvbkxpc3RlbmVycyA9IGZhbHNlOworCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBpc0luU2h1dGRvd25Ib29rKCkKICAgICB7CkBAIC0zNzIsOCArNDAwLDcgQEAKICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gaXNCb290c3RyYXBNb2RlOwogCiAgICAgLyogd2UgYm9vdHN0cmFwIGJ1dCBkbyBOT1Qgam9pbiB0aGUgcmluZyB1bmxlc3MgdG9sZCB0byBkbyBzbyAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1N1cnZleU1vZGUgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihTeXN0ZW0uZ2V0UHJvcGVydHkKLSAgICAgICAgICAgICgiY2Fzc2FuZHJhLndyaXRlX3N1cnZleSIsICJmYWxzZSIpKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTdXJ2ZXlNb2RlID0gVEVTVF9XUklURV9TVVJWRVkuZ2V0Qm9vbGVhbihmYWxzZSk7CiAgICAgLyogdHJ1ZSBpZiBub2RlIGlzIHJlYnVpbGRpbmcgYW5kIHJlY2VpdmluZyBkYXRhICovCiAgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNCb29sZWFuIGlzUmVidWlsZGluZyA9IG5ldyBBdG9taWNCb29sZWFuKCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNCb29sZWFuIGlzRGVjb21taXNzaW9uaW5nID0gbmV3IEF0b21pY0Jvb2xlYW4oKTsKQEAgLTM4Nyw3ICs0MTQsNyBAQAogICAgIC8qIHRoZSBwcm9iYWJpbGl0eSBmb3IgdHJhY2luZyBhbnkgcGFydGljdWxhciByZXF1ZXN0LCAwIGRpc2FibGVzIHRyYWNpbmcgYW5kIDEgZW5hYmxlcyBmb3IgYWxsICovCiAgICAgcHJpdmF0ZSBkb3VibGUgdHJhY2VQcm9iYWJpbGl0eSA9IDAuMDsKIAotICAgIHByaXZhdGUgZW51bSBNb2RlIHsgU1RBUlRJTkcsIE5PUk1BTCwgSk9JTklORywgTEVBVklORywgREVDT01NSVNTSU9ORUQsIE1PVklORywgRFJBSU5JTkcsIERSQUlORUQgfQorICAgIHB1YmxpYyBlbnVtIE1vZGUgeyBTVEFSVElORywgTk9STUFMLCBKT0lOSU5HLCBMRUFWSU5HLCBERUNPTU1JU1NJT05FRCwgTU9WSU5HLCBEUkFJTklORywgRFJBSU5FRCB9CiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBNb2RlIG9wZXJhdGlvbk1vZGUgPSBNb2RlLlNUQVJUSU5HOwogCiAgICAgLyogVXNlZCBmb3IgdHJhY2tpbmcgZHJhaW4gcHJvZ3Jlc3MgKi8KQEAgLTQwMiw5ICs0MjksOSBAQAogICAgIHByaXZhdGUgQ29sbGVjdGlvbjxUb2tlbj4gYm9vdHN0cmFwVG9rZW5zID0gbnVsbDsKIAogICAgIC8vIHRydWUgd2hlbiBrZWVwaW5nIHN0cmljdCBjb25zaXN0ZW5jeSB3aGlsZSBib290c3RyYXBwaW5nCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHVzZVN0cmljdENvbnNpc3RlbmN5ID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEuY29uc2lzdGVudC5yYW5nZW1vdmVtZW50IiwgInRydWUiKSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBhbGxvd1NpbXVsdGFuZW91c01vdmVzID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEuY29uc2lzdGVudC5zaW11bHRhbmVvdXNtb3Zlcy5hbGxvdyIsImZhbHNlIikpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gam9pblJpbmcgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5qb2luX3JpbmciLCAidHJ1ZSIpKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdXNlU3RyaWN0Q29uc2lzdGVuY3kgPSBDT05TSVNURU5UX1JBTkdFX01PVkVNRU5ULmdldEJvb2xlYW4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGFsbG93U2ltdWx0YW5lb3VzTW92ZXMgPSBDT05TSVNURU5UX1NJTVVMVEFORU9VU19NT1ZFU19BTExPVy5nZXRCb29sZWFuKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBqb2luUmluZyA9IEpPSU5fUklORy5nZXRCb29sZWFuKCk7CiAgICAgcHJpdmF0ZSBib29sZWFuIHJlcGxhY2luZzsKIAogICAgIHByaXZhdGUgZmluYWwgU3RyZWFtU3RhdGVTdG9yZSBzdHJlYW1TdGF0ZVN0b3JlID0gbmV3IFN0cmVhbVN0YXRlU3RvcmUoKTsKQEAgLTQ1MiwxMCArNDc5LDE0IEBACiAgICAgICAgIHN1cGVyKEpNWEJyb2FkY2FzdEV4ZWN1dG9yLmV4ZWN1dG9yKTsKIAogICAgICAgICBqbXhPYmplY3ROYW1lID0gIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiOnR5cGU9U3RvcmFnZVNlcnZpY2UiOworCisgICAgICAgIHNzdGFibGVzVHJhY2tlciA9IG5ldyBTU1RhYmxlc0dsb2JhbFRyYWNrZXIoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJNQmVhbnMoKQorICAgIHsKICAgICAgICAgTUJlYW5XcmFwcGVyLmluc3RhbmNlLnJlZ2lzdGVyTUJlYW4odGhpcywgam14T2JqZWN0TmFtZSk7CiAgICAgICAgIE1CZWFuV3JhcHBlci5pbnN0YW5jZS5yZWdpc3Rlck1CZWFuKFN0cmVhbU1hbmFnZXIuaW5zdGFuY2UsIFN0cmVhbU1hbmFnZXIuT0JKRUNUX05BTUUpOwotCi0gICAgICAgIHNzdGFibGVzVHJhY2tlciA9IG5ldyBTU1RhYmxlc0dsb2JhbFRyYWNrZXIoU1NUYWJsZUZvcm1hdC5UeXBlLmN1cnJlbnQoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYWVtb24oQ2Fzc2FuZHJhRGFlbW9uIGRhZW1vbikKQEAgLTY0MywxMSArNjc0LDExIEBACiAgICAgICAgIGlmICgham9pblJpbmcpCiAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiQ2Fubm90IHNldCBib3RoIGpvaW5fcmluZz1mYWxzZSBhbmQgYXR0ZW1wdCB0byByZXBsYWNlIGEgbm9kZSIpOwogCi0gICAgICAgIGlmICghc2hvdWxkQm9vdHN0cmFwKCkgJiYgIUJvb2xlYW4uZ2V0Qm9vbGVhbigiY2Fzc2FuZHJhLmFsbG93X3Vuc2FmZV9yZXBsYWNlIikpCisgICAgICAgIGlmICghc2hvdWxkQm9vdHN0cmFwKCkgJiYgIUFMTE9XX1VOU0FGRV9SRVBMQUNFLmdldEJvb2xlYW4oKSkKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJSZXBsYWNpbmcgYSBub2RlIHdpdGhvdXQgYm9vdHN0cmFwcGluZyByaXNrcyBpbnZhbGlkYXRpbmcgY29uc2lzdGVuY3kgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3VhcmFudGVlcyBhcyB0aGUgZXhwZWN0ZWQgZGF0YSBtYXkgbm90IGJlIHByZXNlbnQgdW50aWwgcmVwYWlyIGlzIHJ1bi4gIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVG8gcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiwgcGxlYXNlIHJlc3RhcnQgd2l0aCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItRGNhc3NhbmRyYS5hbGxvd191bnNhZmVfcmVwbGFjZT10cnVlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLUQiICsgQUxMT1dfVU5TQUZFX1JFUExBQ0UuZ2V0S2V5KCkgKyAiPXRydWUiKTsKIAogICAgICAgICBJbmV0QWRkcmVzc0FuZFBvcnQgcmVwbGFjZUFkZHJlc3MgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0UmVwbGFjZUFkZHJlc3MoKTsKICAgICAgICAgbG9nZ2VyLmluZm8oIkdhdGhlcmluZyBub2RlIHJlcGxhY2VtZW50IGluZm9ybWF0aW9uIGZvciB7fSIsIHJlcGxhY2VBZGRyZXNzKTsKQEAgLTc2Myw5ICs3OTQsOSBAQAogCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNoZWNrRm9yRW5kcG9pbnRDb2xsaXNpb24oVVVJRCBsb2NhbEhvc3RJZCwgU2V0PEluZXRBZGRyZXNzQW5kUG9ydD4gcGVlcnMpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCiAgICAgewotICAgICAgICBpZiAoQm9vbGVhbi5nZXRCb29sZWFuKCJjYXNzYW5kcmEuYWxsb3dfdW5zYWZlX2pvaW4iKSkKKyAgICAgICAgaWYgKEFMTE9XX1VOU0FGRV9KT0lOLmdldEJvb2xlYW4oKSkKICAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLndhcm4oIlNraXBwaW5nIGVuZHBvaW50IGNvbGxpc2lvbiBjaGVjayBhcyBjYXNzYW5kcmEuYWxsb3dfdW5zYWZlX2pvaW49dHJ1ZSIpOworICAgICAgICAgICAgbG9nZ2VyLndhcm4oIlNraXBwaW5nIGVuZHBvaW50IGNvbGxpc2lvbiBjaGVjayBhcyAiICsgQUxMT1dfVU5TQUZFX0pPSU4uZ2V0S2V5KCkgKyAiPXRydWUiKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC03ODIsOCArODEzLDggQEAKICAgICAgICAgaWYgKCFHb3NzaXBlci5pbnN0YW5jZS5pc1NhZmVGb3JTdGFydHVwKEZCVXRpbGl0aWVzLmdldEJyb2FkY2FzdEFkZHJlc3NBbmRQb3J0KCksIGxvY2FsSG9zdElkLCBzaG91bGRCb290c3RyYXAoKSwgZXBTdGF0ZXMpKQogICAgICAgICB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJBIG5vZGUgd2l0aCBhZGRyZXNzICVzIGFscmVhZHkgZXhpc3RzLCBjYW5jZWxsaW5nIGpvaW4uICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNlIGNhc3NhbmRyYS5yZXBsYWNlX2FkZHJlc3MgaWYgeW91IHdhbnQgdG8gcmVwbGFjZSB0aGlzIG5vZGUuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkJVdGlsaXRpZXMuZ2V0QnJvYWRjYXN0QWRkcmVzc0FuZFBvcnQoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNlICVzIGlmIHlvdSB3YW50IHRvIHJlcGxhY2UgdGhpcyBub2RlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZCVXRpbGl0aWVzLmdldEJyb2FkY2FzdEFkZHJlc3NBbmRQb3J0KCksIFJFUExBQ0VfQUREUkVTUy5nZXRLZXkoKSkpOwogICAgICAgICB9CiAKICAgICAgICAgdmFsaWRhdGVFbmRwb2ludFNuaXRjaChlcFN0YXRlcy52YWx1ZXMoKS5pdGVyYXRvcigpKTsKQEAgLTgwNiw3ICs4MzcsNyBAQAogICAgICAgICAgICAgICAgIGFzc2VydCAocGllY2VzLmxlbmd0aCA+IDApOwogICAgICAgICAgICAgICAgIFN0cmluZyBzdGF0ZSA9IHBpZWNlc1swXTsKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZXF1YWxzKFZlcnNpb25lZFZhbHVlLlNUQVRVU19CT09UU1RSQVBQSU5HKSB8fCBzdGF0ZS5lcXVhbHMoVmVyc2lvbmVkVmFsdWUuU1RBVFVTX0xFQVZJTkcpIHx8IHN0YXRlLmVxdWFscyhWZXJzaW9uZWRWYWx1ZS5TVEFUVVNfTU9WSU5HKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJPdGhlciBib290c3RyYXBwaW5nL2xlYXZpbmcvbW92aW5nIG5vZGVzIGRldGVjdGVkLCBjYW5ub3QgYm9vdHN0cmFwIHdoaWxlIGNhc3NhbmRyYS5jb25zaXN0ZW50LnJhbmdlbW92ZW1lbnQgaXMgdHJ1ZSIpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk90aGVyIGJvb3RzdHJhcHBpbmcvbGVhdmluZy9tb3Zpbmcgbm9kZXMgZGV0ZWN0ZWQsIGNhbm5vdCBib290c3RyYXAgd2hpbGUgIiArIENPTlNJU1RFTlRfUkFOR0VfTU9WRU1FTlQuZ2V0S2V5KCkgKyAiIGlzIHRydWUiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTg2Miw2ICs4OTMsNyBAQAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBpbml0U2VydmVyKGludCBzY2hlbWFUaW1lb3V0TWlsbGlzLCBpbnQgcmluZ1RpbWVvdXRNaWxsaXMpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCiAgICAgewogICAgICAgICBsb2dnZXIuaW5mbygiQ2Fzc2FuZHJhIHZlcnNpb246IHt9IiwgRkJVdGlsaXRpZXMuZ2V0UmVsZWFzZVZlcnNpb25TdHJpbmcoKSk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJHaXQgU0hBOiB7fSIsIEZCVXRpbGl0aWVzLmdldEdpdFNIQSgpKTsKICAgICAgICAgbG9nZ2VyLmluZm8oIkNRTCB2ZXJzaW9uOiB7fSIsIFF1ZXJ5UHJvY2Vzc29yLkNRTF9WRVJTSU9OKTsKICAgICAgICAgbG9nZ2VyLmluZm8oIk5hdGl2ZSBwcm90b2NvbCBzdXBwb3J0ZWQgdmVyc2lvbnM6IHt9IChkZWZhdWx0OiB7fSkiLAogICAgICAgICAgICAgICAgICAgICBTdHJpbmdVdGlscy5qb2luKFByb3RvY29sVmVyc2lvbi5zdXBwb3J0ZWRWZXJzaW9ucygpLCAiLCAiKSwgUHJvdG9jb2xWZXJzaW9uLkNVUlJFTlQpOwpAQCAtODcxLDE0ICs5MDMsMTQgQEAKICAgICAgICAgICAgIC8vIEVuc3VyZSBTdG9yYWdlUHJveHkgaXMgaW5pdGlhbGl6ZWQgb24gc3RhcnQtdXA7IHNlZSBDQVNTQU5EUkEtMzc5Ny4KICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVByb3h5Iik7CiAgICAgICAgICAgICAvLyBhbHNvIEluZGV4U3VtbWFyeU1hbmFnZXIsIHdoaWNoIGlzIG90aGVyd2lzZSB1bnJlZmVyZW5jZWQKLSAgICAgICAgICAgIENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSW5kZXhTdW1tYXJ5TWFuYWdlciIpOworICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5pbmRleHN1bW1hcnkuSW5kZXhTdW1tYXJ5TWFuYWdlciIpOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChCb29sZWFuLnBhcnNlQm9vbGVhbihTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5sb2FkX3Jpbmdfc3RhdGUiLCAidHJ1ZSIpKSkKKyAgICAgICAgaWYgKExPQURfUklOR19TVEFURS5nZXRCb29sZWFuKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJMb2FkaW5nIHBlcnNpc3RlZCByaW5nIHN0YXRlIik7CiAgICAgICAgICAgICBwb3B1bGF0ZVBlZXJUb2tlbk1ldGFkYXRhKCk7CkBAIC05MTEsMTAgKzk0MywxMCBAQAogCiAgICAgICAgIHJlcGxhY2luZyA9IGlzUmVwbGFjaW5nKCk7CiAKLSAgICAgICAgaWYgKCFCb29sZWFuLnBhcnNlQm9vbGVhbihTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5zdGFydF9nb3NzaXAiLCAidHJ1ZSIpKSkKKyAgICAgICAgaWYgKCFTVEFSVF9HT1NTSVAuZ2V0Qm9vbGVhbigpKQogICAgICAgICB7CiAgICAgICAgICAgICBsb2dnZXIuaW5mbygiTm90IHN0YXJ0aW5nIGdvc3NpcCBhcyByZXF1ZXN0ZWQuIik7Ci0gICAgICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgICAgICBjb21wbGV0ZUluaXRpYWxpemF0aW9uKCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtOTUyLDEyICs5ODQsMjAgQEAKICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJOb3Qgam9pbmluZyByaW5nIGFzIHJlcXVlc3RlZC4gVXNlIEpNWCAoU3RvcmFnZVNlcnZpY2UtPmpvaW5SaW5nKCkpIHRvIGluaXRpYXRlIHJpbmcgam9pbmluZyIpOwogICAgICAgICB9CiAKKyAgICAgICAgY29tcGxldGVJbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlSW5pdGlhbGl6YXRpb24oKQorICAgIHsKKyAgICAgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgICAgIHJlZ2lzdGVyTUJlYW5zKCk7CiAgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZVRva2VuTWV0YWRhdGEoKQogICAgIHsKLSAgICAgICAgaWYgKEJvb2xlYW4ucGFyc2VCb29sZWFuKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmxvYWRfcmluZ19zdGF0ZSIsICJ0cnVlIikpKQorICAgICAgICBpZiAoTE9BRF9SSU5HX1NUQVRFLmdldEJvb2xlYW4oKSkKICAgICAgICAgewogICAgICAgICAgICAgcG9wdWxhdGVQZWVyVG9rZW5NZXRhZGF0YSgpOwogICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBub3QgY29tcGxldGVkIGJvb3RzdHJhcHBpbmcsIHdlIHNob3VsZCBub3QgYWRkIG91cnNlbHZlcyBhcyBhIG5vcm1hbCB0b2tlbgpAQCAtOTk0LDkgKzEwMzQsOSBAQAogICAgICAgICBpZiAocmVwbGFjaW5nKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnJlcGxhY2VfYWRkcmVzc19maXJzdF9ib290IiwgbnVsbCkgIT0gbnVsbCAmJiBTeXN0ZW1LZXlzcGFjZS5ib290c3RyYXBDb21wbGV0ZSgpKQorICAgICAgICBpZiAoUkVQTEFDRV9BRERSRVNTX0ZJUlNUX0JPT1QuZ2V0U3RyaW5nKCkgIT0gbnVsbCAmJiBTeXN0ZW1LZXlzcGFjZS5ib290c3RyYXBDb21wbGV0ZSgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuaW5mbygiUmVwbGFjZSBhZGRyZXNzIG9uIGZpcnN0IGJvb3QgcmVxdWVzdGVkOyB0aGlzIG5vZGUgaXMgYWxyZWFkeSBib290c3RyYXBwZWQiKTsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJSZXBsYWNlIGFkZHJlc3Mgb24gdGhlIGZpcnN0IGJvb3QgcmVxdWVzdGVkOyB0aGlzIG5vZGUgaXMgYWxyZWFkeSBib290c3RyYXBwZWQiKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCkBAIC0xMDMyLDE3ICsxMDcyLDIwIEBACiAKICAgICAgICAgICAgIGlmIChTeXN0ZW1LZXlzcGFjZS53YXNEZWNvbW1pc3Npb25lZCgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChCb29sZWFuLmdldEJvb2xlYW4oImNhc3NhbmRyYS5vdmVycmlkZV9kZWNvbW1pc3Npb24iKSkKKyAgICAgICAgICAgICAgICBpZiAoT1ZFUlJJREVfREVDT01NSVNTSU9OLmdldEJvb2xlYW4oKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJUaGlzIG5vZGUgd2FzIGRlY29tbWlzc2lvbmVkLCBidXQgb3ZlcnJpZGluZyBieSBvcGVyYXRvciByZXF1ZXN0LiIpOwogICAgICAgICAgICAgICAgICAgICBTeXN0ZW1LZXlzcGFjZS5zZXRCb290c3RyYXBTdGF0ZShTeXN0ZW1LZXlzcGFjZS5Cb290c3RyYXBTdGF0ZS5DT01QTEVURUQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJUaGlzIG5vZGUgd2FzIGRlY29tbWlzc2lvbmVkIGFuZCB3aWxsIG5vdCByZWpvaW4gdGhlIHJpbmcgdW5sZXNzIGNhc3NhbmRyYS5vdmVycmlkZV9kZWNvbW1pc3Npb249dHJ1ZSBoYXMgYmVlbiBzZXQsIG9yIGFsbCBleGlzdGluZyBkYXRhIGlzIHJlbW92ZWQgYW5kIHRoZSBub2RlIGlzIGJvb3RzdHJhcHBlZCBhZ2FpbiIpOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIlRoaXMgbm9kZSB3YXMgZGVjb21taXNzaW9uZWQgYW5kIHdpbGwgbm90IHJlam9pbiB0aGUgcmluZyB1bmxlc3MgLUQiICsgT1ZFUlJJREVfREVDT01NSVNTSU9OLmdldEtleSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj10cnVlIGhhcyBiZWVuIHNldCwgb3IgYWxsIGV4aXN0aW5nIGRhdGEgaXMgcmVtb3ZlZCBhbmQgdGhlIG5vZGUgaXMgYm9vdHN0cmFwcGVkIGFnYWluIik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFJlcGxhY2VUb2tlbnMoKS5zaXplKCkgPiAwIHx8IERhdGFiYXNlRGVzY3JpcHRvci5nZXRSZXBsYWNlTm9kZSgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlJlcGxhY2UgbWV0aG9kIHJlbW92ZWQ7IHVzZSBjYXNzYW5kcmEucmVwbGFjZV9hZGRyZXNzIGluc3RlYWQiKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUmVwbGFjZSBtZXRob2QgcmVtb3ZlZDsgdXNlICIgKyBSRVBMQUNFX0FERFJFU1MuZ2V0S2V5KCkgKyAiIHN5c3RlbSBwcm9wZXJ0eSBpbnN0ZWFkLiIpOwogCiAgICAgICAgICAgICBNZXNzYWdpbmdTZXJ2aWNlLmluc3RhbmNlKCkubGlzdGVuKCk7CiAKQEAgLTExMDUsNyArMTE0OCw3IEBACiAgICAgICAgICAgICAgICAgaWYgKCEobm90aWZpY2F0aW9uIGluc3RhbmNlb2YgU1NUYWJsZXNWZXJzaW9uc0luVXNlQ2hhbmdlTm90aWZpY2F0aW9uKSkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgICAgICAgICAgU2V0PFZlcnNpb25BbmRUeXBlPiB2ZXJzaW9ucyA9ICgoU1NUYWJsZXNWZXJzaW9uc0luVXNlQ2hhbmdlTm90aWZpY2F0aW9uKW5vdGlmaWNhdGlvbikudmVyc2lvbnNJblVzZTsKKyAgICAgICAgICAgICAgICBTZXQ8VmVyc2lvbj4gdmVyc2lvbnMgPSAoKFNTVGFibGVzVmVyc2lvbnNJblVzZUNoYW5nZU5vdGlmaWNhdGlvbilub3RpZmljYXRpb24pLnZlcnNpb25zSW5Vc2U7CiAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJVcGRhdGluZyBsb2NhbCBzc3RhYmxlcyB2ZXJzaW9uIGluIEdvc3NpcCB0byB7fSIsIHZlcnNpb25zKTsKIAogICAgICAgICAgICAgICAgIEdvc3NpcGVyLmluc3RhbmNlLmFkZExvY2FsQXBwbGljYXRpb25TdGF0ZShBcHBsaWNhdGlvblN0YXRlLlNTVEFCTEVfVkVSU0lPTlMsCkBAIC0xMzIzLDYgKzEzNjYsNyBAQAogCiAgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Um9sZU1hbmFnZXIoKS5zZXR1cCgpOwogICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldEF1dGhlbnRpY2F0b3IoKS5zZXR1cCgpOworICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldEludGVybm9kZUF1dGhlbnRpY2F0b3IoKS5zZXR1cEludGVybm9kZSgpOwogICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldEF1dGhvcml6ZXIoKS5zZXR1cCgpOwogICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldE5ldHdvcmtBdXRob3JpemVyKCkuc2V0dXAoKTsKICAgICAgICAgICAgIEF1dGhDYWNoZVNlcnZpY2UuaW5pdGlhbGl6ZUFuZFJlZ2lzdGVyQ2FjaGVzKCk7CkBAIC0xMzU4LDExICsxNDAyLDE2IEBACiAKICAgICBwdWJsaWMgdm9pZCByZWJ1aWxkKFN0cmluZyBzb3VyY2VEYykKICAgICB7Ci0gICAgICAgIHJlYnVpbGQoc291cmNlRGMsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICByZWJ1aWxkKHNvdXJjZURjLCBudWxsLCBudWxsLCBudWxsLCBmYWxzZSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgcmVidWlsZChTdHJpbmcgc291cmNlRGMsIFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRva2VucywgU3RyaW5nIHNwZWNpZmljU291cmNlcykKICAgICB7CisgICAgICAgIHJlYnVpbGQoc291cmNlRGMsIGtleXNwYWNlLCB0b2tlbnMsIHNwZWNpZmljU291cmNlcywgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYnVpbGQoU3RyaW5nIHNvdXJjZURjLCBTdHJpbmcga2V5c3BhY2UsIFN0cmluZyB0b2tlbnMsIFN0cmluZyBzcGVjaWZpY1NvdXJjZXMsIGJvb2xlYW4gZXhjbHVkZUxvY2FsRGF0YWNlbnRlck5vZGVzKQorICAgIHsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIGNoZWNrIG9uZ29pbmcgcmVidWlsZApAQCAtMTM3MSw2ICsxNDIwLDEyIEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm9kZSBpcyBzdGlsbCByZWJ1aWxkaW5nLiBDaGVjayBub2RldG9vbCBuZXRzdGF0cy4iKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gZmFpbCBpZiBzb3VyY2UgREMgaXMgbG9jYWwgYW5kIC0tZXhjbHVkZS1sb2NhbC1kYyBpcyBzZXQKKyAgICAgICAgICAgIGlmIChzb3VyY2VEYyAhPSBudWxsICYmIHNvdXJjZURjLmVxdWFscyhEYXRhYmFzZURlc2NyaXB0b3IuZ2V0TG9jYWxEYXRhQ2VudGVyKCkpICYmIGV4Y2x1ZGVMb2NhbERhdGFjZW50ZXJOb2RlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3Qgc2V0IHNvdXJjZSBkYXRhIGNlbnRlciB0byBiZSBsb2NhbCBkYXRhIGNlbnRlciwgd2hlbiBleGNsdWRlTG9jYWxEYXRhQ2VudGVyIGZsYWcgaXMgc2V0Iik7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChzb3VyY2VEYyAhPSBudWxsKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIFRva2VuTWV0YWRhdGEuVG9wb2xvZ3kgdG9wb2xvZ3kgPSBnZXRUb2tlbk1ldGFkYXRhKCkuY2xvbmVPbmx5VG9rZW5NYXAoKS5nZXRUb3BvbG9neSgpOwpAQCAtMTQxNCw2ICsxNDY5LDkgQEAKICAgICAgICAgICAgIGlmIChzb3VyY2VEYyAhPSBudWxsKQogICAgICAgICAgICAgICAgIHN0cmVhbWVyLmFkZFNvdXJjZUZpbHRlcihuZXcgUmFuZ2VTdHJlYW1lci5TaW5nbGVEYXRhY2VudGVyRmlsdGVyKERhdGFiYXNlRGVzY3JpcHRvci5nZXRFbmRwb2ludFNuaXRjaCgpLCBzb3VyY2VEYykpOwogCisgICAgICAgICAgICBpZiAoZXhjbHVkZUxvY2FsRGF0YWNlbnRlck5vZGVzKQorICAgICAgICAgICAgICAgIHN0cmVhbWVyLmFkZFNvdXJjZUZpbHRlcihuZXcgUmFuZ2VTdHJlYW1lci5FeGNsdWRlTG9jYWxEYXRhY2VudGVyRmlsdGVyKERhdGFiYXNlRGVzY3JpcHRvci5nZXRFbmRwb2ludFNuaXRjaCgpKSk7CisKICAgICAgICAgICAgIGlmIChrZXlzcGFjZSA9PSBudWxsKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleXNwYWNlTmFtZSA6IFNjaGVtYS5pbnN0YW5jZS5nZXROb25Mb2NhbFN0cmF0ZWd5S2V5c3BhY2VzKCkubmFtZXMoKSkKQEAgLTE5MjIsNyArMTk4MCw4IEBACiAgICAgICAgICAgICBTdHJpbmcgYm9vdHN0cmFwVG9rZW5zID0gU3RyaW5nVXRpbHMuam9pbih0b2tlbk1ldGFkYXRhLmdldEJvb3RzdHJhcFRva2VucygpLnZhbHVlU2V0KCksICcsJyk7CiAgICAgICAgICAgICBTdHJpbmcgbGVhdmluZ1Rva2VucyA9IFN0cmluZ1V0aWxzLmpvaW4odG9rZW5NZXRhZGF0YS5nZXRMZWF2aW5nRW5kcG9pbnRzKCksICcsJyk7CiAgICAgICAgICAgICBTdHJpbmcgbW92aW5nVG9rZW5zID0gU3RyaW5nVXRpbHMuam9pbih0b2tlbk1ldGFkYXRhLmdldE1vdmluZ0VuZHBvaW50cygpLnN0cmVhbSgpLm1hcChlIC0+IGUucmlnaHQpLnRvQXJyYXkoKSwgJywnKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJPdGhlciBib290c3RyYXBwaW5nL2xlYXZpbmcvbW92aW5nIG5vZGVzIGRldGVjdGVkLCBjYW5ub3QgYm9vdHN0cmFwIHdoaWxlIGNhc3NhbmRyYS5jb25zaXN0ZW50LnJhbmdlbW92ZW1lbnQgaXMgdHJ1ZS4gTm9kZXMgZGV0ZWN0ZWQsIGJvb3RzdHJhcHBpbmc6ICVzOyBsZWF2aW5nOiAlczsgbW92aW5nOiAlczsiLCBib290c3RyYXBUb2tlbnMsIGxlYXZpbmdUb2tlbnMsIG1vdmluZ1Rva2VucykpOworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIk90aGVyIGJvb3RzdHJhcHBpbmcvbGVhdmluZy9tb3Zpbmcgbm9kZXMgZGV0ZWN0ZWQsIGNhbm5vdCBib290c3RyYXAgd2hpbGUgJXMgaXMgdHJ1ZS4gTm9kZXMgZGV0ZWN0ZWQsIGJvb3RzdHJhcHBpbmc6ICVzOyBsZWF2aW5nOiAlczsgbW92aW5nOiAlczsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OU0lTVEVOVF9SQU5HRV9NT1ZFTUVOVC5nZXRLZXkoKSwgYm9vdHN0cmFwVG9rZW5zLCBsZWF2aW5nVG9rZW5zLCBtb3ZpbmdUb2tlbnMpKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGdldCBib290c3RyYXAgdG9rZW5zCkBAIC0xOTQwLDExICsxOTk5LDE4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICghaXNSZXBsYWNpbmdTYW1lQWRkcmVzcygpKQogICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEhpc3RvcmljYWxseSBCUk9BRENBU1RfSU5URVJWQUwgd2FzIHVzZWQsIGJ1dCB0aGlzIGlzIHVucmVsYXRlZCB0byByaW5nX2RlbGF5LCBzbyB1c2luZyBpdCB0byBrbm93CisgICAgICAgICAgICAgICAgLy8gaG93IGxvbmcgdG8gc2xlZXAgb25seSB3b3JrcyB3aXRoIHRoZSBkZWZhdWx0IHNldHRpbmdzIChyaW5nX2RlbGF5PTMwcywgYnJvYWRjYXN0PTYwcykuICBGb3IgdXNlcnMKKyAgICAgICAgICAgICAgICAvLyB3aG8gYXJlIGF3YXJlIG9mIHRoaXMgcmVsYXRpb25zaGlwLCB0aGlzIGNvdXBsaW5nIHNob3VsZCBub3QgYmUgYnJva2VuLCBidXQgZm9yIG1vc3QgdXNlcnMgdGhpcworICAgICAgICAgICAgICAgIC8vIHJlbGF0aW9uc2hpcCBpc24ndCBrbm93biBhbmQgaW5zdGVhZCB3ZSBzaG91bGQgcmVseSBvbiB0aGUgcmluZ19kZWxheS4KKyAgICAgICAgICAgICAgICAvLyBTZWUgQ0FTU0FORFJBLTE3Nzc2CisgICAgICAgICAgICAgICAgbG9uZyBzbGVlcERlbGF5TWlsbGlzID0gTWF0aC5tYXgoTG9hZEJyb2FkY2FzdGVyLkJST0FEQ0FTVF9JTlRFUlZBTCwgcmluZ1RpbWVvdXRNaWxsaXMgKiAyKTsKICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFNsZWVwIGFkZGl0aW9uYWxseSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc2VydmVyIGFjdHVhbGx5IGlzIG5vdCBhbGl2ZQogICAgICAgICAgICAgICAgICAgICAvLyBhbmQgZ2l2aW5nIGl0IG1vcmUgdGltZSB0byBnb3NzaXAgaWYgYWxpdmUuCi0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChMb2FkQnJvYWRjYXN0ZXIuQlJPQURDQVNUX0lOVEVSVkFMKTsKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlNsZWVwaW5nIGZvciB7fW1zIHdhaXRpbmcgdG8gbWFrZSBzdXJlIG5vIG5ldyBnb3NzaXAgdXBkYXRlcyBoYXBwZW4gZm9yIHt9Iiwgc2xlZXBEZWxheU1pbGxpcywgRGF0YWJhc2VEZXNjcmlwdG9yLmdldFJlcGxhY2VBZGRyZXNzKCkpOworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoc2xlZXBEZWxheU1pbGxpcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQogICAgICAgICAgICAgICAgIHsKQEAgLTE5NTIsMTQgKzIwMTgsMjMgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3Igb3BlcmF0b3IgZXJyb3JzLi4uCisgICAgICAgICAgICAgICAgbG9uZyBuYW5vRGVsYXkgPSBNSUxMSVNFQ09ORFMudG9OYW5vcyhyaW5nVGltZW91dE1pbGxpcyk7CiAgICAgICAgICAgICAgICAgZm9yIChUb2tlbiB0b2tlbiA6IGJvb3RzdHJhcFRva2VucykKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzQW5kUG9ydCBleGlzdGluZyA9IHRva2VuTWV0YWRhdGEuZ2V0RW5kcG9pbnQodG9rZW4pOwogICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBuYW5vRGVsYXkgPSByaW5nVGltZW91dE1pbGxpcyAqIDEwMDAwMDBMOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEdvc3NpcGVyLmluc3RhbmNlLmdldEVuZHBvaW50U3RhdGVGb3JFbmRwb2ludChleGlzdGluZykuZ2V0VXBkYXRlVGltZXN0YW1wKCkgPiAobmFub1RpbWUoKSAtIG5hbm9EZWxheSkpCisgICAgICAgICAgICAgICAgICAgICAgICBFbmRwb2ludFN0YXRlIGVuZHBvaW50U3RhdGVGb3JFeGlzdGluZyA9IEdvc3NpcGVyLmluc3RhbmNlLmdldEVuZHBvaW50U3RhdGVGb3JFbmRwb2ludChleGlzdGluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHVwZGF0ZVRpbWVzdGFtcCA9IGVuZHBvaW50U3RhdGVGb3JFeGlzdGluZy5nZXRVcGRhdGVUaW1lc3RhbXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgYWxsb3dlZERlbGF5ID0gbmFub1RpbWUoKSAtIG5hbm9EZWxheTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIG5vZGUgd2FzIHVwZGF0ZWQgd2l0aGluIHRoZSByaW5nIGRlbGF5IG9yIHRoZSBub2RlIGlzIGFsaXZlLCB3ZSBzaG91bGQgZmFpbAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZVRpbWVzdGFtcCA+IGFsbG93ZWREZWxheSB8fCBlbmRwb2ludFN0YXRlRm9yRXhpc3RpbmcuaXNBbGl2ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVW5hYmxlIHRvIHJlcGxhY2Ugbm9kZSBmb3IgdG9rZW49e30uIFRoZSBub2RlIGlzIHJlcG9ydGluZyBhcyB7fWFsaXZlIHdpdGggdXBkYXRlVGltZXN0YW1wPXt9LCBhbGxvd2VkRGVsYXk9e30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiwgZW5kcG9pbnRTdGF0ZUZvckV4aXN0aW5nLmlzQWxpdmUoKSA/ICIiIDogIm5vdCAiLCB1cGRhdGVUaW1lc3RhbXAsIGFsbG93ZWREZWxheSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW5ub3QgcmVwbGFjZSBhIGxpdmUgbm9kZS4uLiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbnMuYWRkKGV4aXN0aW5nKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlCkBAIC0yMDI0LDEwICsyMDk5LDEwIEBACiAgICAgICAgIGlmICghR29zc2lwZXIuaW5zdGFuY2Uuc2VlbkFueVNlZWQoKSkKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuYWJsZSB0byBjb250YWN0IGFueSBzZWVkczogIiArIEdvc3NpcGVyLmluc3RhbmNlLmdldFNlZWRzKCkpOwogCi0gICAgICAgIGlmIChCb29sZWFuLmdldEJvb2xlYW4oImNhc3NhbmRyYS5yZXNldF9ib290c3RyYXBfcHJvZ3Jlc3MiKSkKKyAgICAgICAgaWYgKFJFU0VUX0JPT1RTVFJBUF9QUk9HUkVTUy5nZXRCb29sZWFuKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJSZXNldHRpbmcgYm9vdHN0cmFwIHByb2dyZXNzIHRvIHN0YXJ0IGZyZXNoIik7Ci0gICAgICAgICAgICBTeXN0ZW1LZXlzcGFjZS5yZXNldEF2YWlsYWJsZVJhbmdlcygpOworICAgICAgICAgICAgU3lzdGVtS2V5c3BhY2UucmVzZXRBdmFpbGFibGVTdHJlYW1lZFJhbmdlcygpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gRm9yY2UgZGlzayBib3VuZGFyeSBpbnZhbGlkYXRpb24gbm93IHRoYXQgbG9jYWwgdG9rZW5zIGFyZSBzZXQKQEAgLTM2NjYsMTIgKzM3NDEsMTggQEAKICAgICAgICAgICAgIHVwZGF0ZU5ldFZlcnNpb24oZW5kcG9pbnQsIG5ldFZlcnNpb24pOwogICAgIH0KIAotCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRMb2FkU3RyaW5nKCkKICAgICB7CiAgICAgICAgIHJldHVybiBGaWxlVXRpbHMuc3RyaW5naWZ5RmlsZVNpemUoU3RvcmFnZU1ldHJpY3MubG9hZC5nZXRDb3VudCgpKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVuY29tcHJlc3NlZExvYWRTdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEZpbGVVdGlscy5zdHJpbmdpZnlGaWxlU2l6ZShTdG9yYWdlTWV0cmljcy51bmNvbXByZXNzZWRMb2FkLmdldENvdW50KCkpOworICAgIH0KKwogICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldExvYWRNYXBXaXRoUG9ydCgpCiAgICAgewogICAgICAgICByZXR1cm4gZ2V0TG9hZE1hcCh0cnVlKTsKQEAgLTM3NDQsNiArMzgyNSwxMiBAQAogICAgICAgICByZXR1cm4gRkJVdGlsaXRpZXMuZ2V0UmVsZWFzZVZlcnNpb25TdHJpbmcoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEdpdFNIQSgpCisgICAgeworICAgICAgICByZXR1cm4gRkJVdGlsaXRpZXMuZ2V0R2l0U0hBKCk7CisgICAgfQorCiAgICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWFWZXJzaW9uKCkKICAgICB7CiAgICAgICAgIHJldHVybiBTY2hlbWEuaW5zdGFuY2UuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7CkBAIC0zOTA4LDcgKzM5OTUsNyBAQAogICAgICAgICByZXR1cm4gZm9yY2VLZXlzcGFjZUNsZWFudXAoMCwga2V5c3BhY2VOYW1lLCB0YWJsZXMpOwogICAgIH0KIAotICAgIHB1YmxpYyBpbnQgZm9yY2VLZXlzcGFjZUNsZWFudXAoaW50IGpvYnMsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZy4uLiB0YWJsZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHB1YmxpYyBpbnQgZm9yY2VLZXlzcGFjZUNsZWFudXAoaW50IGpvYnMsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZy4uLiB0YWJsZU5hbWVzKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KICAgICB7CiAgICAgICAgIGlmIChTY2hlbWFDb25zdGFudHMuaXNMb2NhbFN5c3RlbUtleXNwYWNlKGtleXNwYWNlTmFtZSkpCiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2xlYW51cCBvZiB0aGUgc3lzdGVtIGtleXNwYWNlIGlzIG5laXRoZXIgbmVjZXNzYXJ5IG5vciB3aXNlIik7CkBAIC0zOTE3LDM5ICs0MDA0LDM4IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm9kZSBpcyBpbnZvbHZlZCBpbiBjbHVzdGVyIG1lbWJlcnNoaXAgY2hhbmdlcy4gTm90IHNhZmUgdG8gcnVuIGNsZWFudXAuIik7CiAKICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzIHN0YXR1cyA9IENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cy5TVUNDRVNTRlVMOwotICAgICAgICBmb3IgKENvbHVtbkZhbWlseVN0b3JlIGNmU3RvcmUgOiBnZXRWYWxpZENvbHVtbkZhbWlsaWVzKGZhbHNlLCBmYWxzZSwga2V5c3BhY2VOYW1lLCB0YWJsZXMpKQorICAgICAgICBsb2dnZXIuaW5mbygiU3RhcnRpbmcge30gb24ge30ue30iLCBPcGVyYXRpb25UeXBlLkNMRUFOVVAsIGtleXNwYWNlTmFtZSwgQXJyYXlzLnRvU3RyaW5nKHRhYmxlTmFtZXMpKTsKKyAgICAgICAgZm9yIChDb2x1bW5GYW1pbHlTdG9yZSBjZlN0b3JlIDogZ2V0VmFsaWRDb2x1bW5GYW1pbGllcyhmYWxzZSwgZmFsc2UsIGtleXNwYWNlTmFtZSwgdGFibGVOYW1lcykpCiAgICAgICAgIHsKICAgICAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cyBvbmVTdGF0dXMgPSBjZlN0b3JlLmZvcmNlQ2xlYW51cChqb2JzKTsKICAgICAgICAgICAgIGlmIChvbmVTdGF0dXMgIT0gQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzLlNVQ0NFU1NGVUwpCiAgICAgICAgICAgICAgICAgc3RhdHVzID0gb25lU3RhdHVzOwogICAgICAgICB9CisgICAgICAgIGxvZ2dlci5pbmZvKCJDb21wbGV0ZWQge30gd2l0aCBzdGF0dXMge30iLCBPcGVyYXRpb25UeXBlLkNMRUFOVVAsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXMuc3RhdHVzQ29kZTsKICAgICB9CiAKLSAgICBwdWJsaWMgaW50IHNjcnViKGJvb2xlYW4gZGlzYWJsZVNuYXBzaG90LCBib29sZWFuIHNraXBDb3JydXB0ZWQsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZy4uLiB0YWJsZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHB1YmxpYyBpbnQgc2NydWIoYm9vbGVhbiBkaXNhYmxlU25hcHNob3QsIGJvb2xlYW4gc2tpcENvcnJ1cHRlZCwgYm9vbGVhbiBjaGVja0RhdGEsIGJvb2xlYW4gcmVpbnNlcnRPdmVyZmxvd2VkVFRMLCBpbnQgam9icywgU3RyaW5nIGtleXNwYWNlTmFtZSwgU3RyaW5nLi4uIHRhYmxlTmFtZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgcmV0dXJuIHNjcnViKGRpc2FibGVTbmFwc2hvdCwgc2tpcENvcnJ1cHRlZCwgdHJ1ZSwgMCwga2V5c3BhY2VOYW1lLCB0YWJsZXMpOworICAgICAgICBJU2NydWJiZXIuT3B0aW9ucyBvcHRpb25zID0gSVNjcnViYmVyLm9wdGlvbnMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNraXBDb3JydXB0ZWQoc2tpcENvcnJ1cHRlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGVja0RhdGEoY2hlY2tEYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlaW5zZXJ0T3ZlcmZsb3dlZFRUTFJvd3MocmVpbnNlcnRPdmVyZmxvd2VkVFRMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIHJldHVybiBzY3J1YihkaXNhYmxlU25hcHNob3QsIG9wdGlvbnMsIGpvYnMsIGtleXNwYWNlTmFtZSwgdGFibGVOYW1lcyk7CiAgICAgfQogCi0gICAgcHVibGljIGludCBzY3J1Yihib29sZWFuIGRpc2FibGVTbmFwc2hvdCwgYm9vbGVhbiBza2lwQ29ycnVwdGVkLCBib29sZWFuIGNoZWNrRGF0YSwgU3RyaW5nIGtleXNwYWNlTmFtZSwgU3RyaW5nLi4uIHRhYmxlcykgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gc2NydWIoZGlzYWJsZVNuYXBzaG90LCBza2lwQ29ycnVwdGVkLCBjaGVja0RhdGEsIDAsIGtleXNwYWNlTmFtZSwgdGFibGVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHNjcnViKGJvb2xlYW4gZGlzYWJsZVNuYXBzaG90LCBib29sZWFuIHNraXBDb3JydXB0ZWQsIGJvb2xlYW4gY2hlY2tEYXRhLCBpbnQgam9icywgU3RyaW5nIGtleXNwYWNlTmFtZSwgU3RyaW5nLi4uIHRhYmxlcykgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gc2NydWIoZGlzYWJsZVNuYXBzaG90LCBza2lwQ29ycnVwdGVkLCBjaGVja0RhdGEsIGZhbHNlLCBqb2JzLCBrZXlzcGFjZU5hbWUsIHRhYmxlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBzY3J1Yihib29sZWFuIGRpc2FibGVTbmFwc2hvdCwgYm9vbGVhbiBza2lwQ29ycnVwdGVkLCBib29sZWFuIGNoZWNrRGF0YSwgYm9vbGVhbiByZWluc2VydE92ZXJmbG93ZWRUVEwsIGludCBqb2JzLCBTdHJpbmcga2V5c3BhY2VOYW1lLCBTdHJpbmcuLi4gdGFibGVzKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICBwdWJsaWMgaW50IHNjcnViKGJvb2xlYW4gZGlzYWJsZVNuYXBzaG90LCBJU2NydWJiZXIuT3B0aW9ucyBvcHRpb25zLCBpbnQgam9icywgU3RyaW5nIGtleXNwYWNlTmFtZSwgU3RyaW5nLi4uIHRhYmxlTmFtZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzIHN0YXR1cyA9IENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cy5TVUNDRVNTRlVMOwotICAgICAgICBmb3IgKENvbHVtbkZhbWlseVN0b3JlIGNmU3RvcmUgOiBnZXRWYWxpZENvbHVtbkZhbWlsaWVzKHRydWUsIGZhbHNlLCBrZXlzcGFjZU5hbWUsIHRhYmxlcykpCisgICAgICAgIGxvZ2dlci5pbmZvKCJTdGFydGluZyB7fSBvbiB7fS57fSIsIE9wZXJhdGlvblR5cGUuU0NSVUIsIGtleXNwYWNlTmFtZSwgQXJyYXlzLnRvU3RyaW5nKHRhYmxlTmFtZXMpKTsKKyAgICAgICAgZm9yIChDb2x1bW5GYW1pbHlTdG9yZSBjZlN0b3JlIDogZ2V0VmFsaWRDb2x1bW5GYW1pbGllcyh0cnVlLCBmYWxzZSwga2V5c3BhY2VOYW1lLCB0YWJsZU5hbWVzKSkKICAgICAgICAgewotICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzIG9uZVN0YXR1cyA9IGNmU3RvcmUuc2NydWIoZGlzYWJsZVNuYXBzaG90LCBza2lwQ29ycnVwdGVkLCByZWluc2VydE92ZXJmbG93ZWRUVEwsIGNoZWNrRGF0YSwgam9icyk7CisgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMgb25lU3RhdHVzID0gY2ZTdG9yZS5zY3J1YihkaXNhYmxlU25hcHNob3QsIG9wdGlvbnMsIGpvYnMpOwogICAgICAgICAgICAgaWYgKG9uZVN0YXR1cyAhPSBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMuU1VDQ0VTU0ZVTCkKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBvbmVTdGF0dXM7CiAgICAgICAgIH0KKyAgICAgICAgbG9nZ2VyLmluZm8oIkNvbXBsZXRlZCB7fSB3aXRoIHN0YXR1cyB7fSIsIE9wZXJhdGlvblR5cGUuU0NSVUIsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXMuc3RhdHVzQ29kZTsKICAgICB9CiAKQEAgLTM5NjIsMTkgKzQwNDgsMjAgQEAKICAgICBwdWJsaWMgaW50IHZlcmlmeShib29sZWFuIGV4dGVuZGVkVmVyaWZ5LCBib29sZWFuIGNoZWNrVmVyc2lvbiwgYm9vbGVhbiBkaXNrRmFpbHVyZVBvbGljeSwgYm9vbGVhbiBtdXRhdGVSZXBhaXJTdGF0dXMsIGJvb2xlYW4gY2hlY2tPd25zVG9rZW5zLCBib29sZWFuIHF1aWNrLCBTdHJpbmcga2V5c3BhY2VOYW1lLCBTdHJpbmcuLi4gdGFibGVOYW1lcykgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCiAgICAgewogICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMgc3RhdHVzID0gQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzLlNVQ0NFU1NGVUw7Ci0gICAgICAgIFZlcmlmaWVyLk9wdGlvbnMgb3B0aW9ucyA9IFZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeShkaXNrRmFpbHVyZVBvbGljeSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4dGVuZGVkVmVyaWZpY2F0aW9uKGV4dGVuZGVkVmVyaWZ5KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hlY2tWZXJzaW9uKGNoZWNrVmVyc2lvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm11dGF0ZVJlcGFpclN0YXR1cyhtdXRhdGVSZXBhaXJTdGF0dXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGVja093bnNUb2tlbnMoY2hlY2tPd25zVG9rZW5zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucXVpY2socXVpY2spLmJ1aWxkKCk7Ci0gICAgICAgIGxvZ2dlci5pbmZvKCJWZXJpZnlpbmcge30ue30gd2l0aCBvcHRpb25zID0ge30iLCBrZXlzcGFjZU5hbWUsIEFycmF5cy50b1N0cmluZyh0YWJsZU5hbWVzKSwgb3B0aW9ucyk7CisgICAgICAgIElWZXJpZmllci5PcHRpb25zIG9wdGlvbnMgPSBJVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KGRpc2tGYWlsdXJlUG9saWN5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4dGVuZGVkVmVyaWZpY2F0aW9uKGV4dGVuZGVkVmVyaWZ5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNoZWNrVmVyc2lvbihjaGVja1ZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubXV0YXRlUmVwYWlyU3RhdHVzKG11dGF0ZVJlcGFpclN0YXR1cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGVja093bnNUb2tlbnMoY2hlY2tPd25zVG9rZW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnF1aWNrKHF1aWNrKS5idWlsZCgpOworICAgICAgICBsb2dnZXIuaW5mbygiU3RhcmluZyB7fSBvbiB7fS57fSB3aXRoIG9wdGlvbnMgPSB7fSIsIE9wZXJhdGlvblR5cGUuVkVSSUZZLCBrZXlzcGFjZU5hbWUsIEFycmF5cy50b1N0cmluZyh0YWJsZU5hbWVzKSwgb3B0aW9ucyk7CiAgICAgICAgIGZvciAoQ29sdW1uRmFtaWx5U3RvcmUgY2ZTdG9yZSA6IGdldFZhbGlkQ29sdW1uRmFtaWxpZXMoZmFsc2UsIGZhbHNlLCBrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZXMpKQogICAgICAgICB7CiAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMgb25lU3RhdHVzID0gY2ZTdG9yZS52ZXJpZnkob3B0aW9ucyk7CiAgICAgICAgICAgICBpZiAob25lU3RhdHVzICE9IENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cy5TVUNDRVNTRlVMKQogICAgICAgICAgICAgICAgIHN0YXR1cyA9IG9uZVN0YXR1czsKICAgICAgICAgfQorICAgICAgICBsb2dnZXIuaW5mbygiQ29tcGxldGVkIHt9IHdpdGggc3RhdHVzIHt9IiwgT3BlcmF0aW9uVHlwZS5WRVJJRlksIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXMuc3RhdHVzQ29kZTsKICAgICB9CiAKQEAgLTQwMDgsMTIgKzQwOTUsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuLi4gdGFibGVOYW1lcykgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCiAgICAgewogICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMgc3RhdHVzID0gQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzLlNVQ0NFU1NGVUw7CisgICAgICAgIGxvZ2dlci5pbmZvKCJTdGFydGluZyB7fSBvbiB7fS57fSIsIE9wZXJhdGlvblR5cGUuVVBHUkFERV9TU1RBQkxFUywga2V5c3BhY2VOYW1lLCBBcnJheXMudG9TdHJpbmcodGFibGVOYW1lcykpOwogICAgICAgICBmb3IgKENvbHVtbkZhbWlseVN0b3JlIGNmU3RvcmUgOiBnZXRWYWxpZENvbHVtbkZhbWlsaWVzKHRydWUsIHRydWUsIGtleXNwYWNlTmFtZSwgdGFibGVOYW1lcykpCiAgICAgICAgIHsKICAgICAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cyBvbmVTdGF0dXMgPSBjZlN0b3JlLnNzdGFibGVzUmV3cml0ZShza2lwSWZDdXJyZW50VmVyc2lvbiwgc2tpcElmTmV3ZXJUaGFuVGltZXN0YW1wLCBza2lwSWZDb21wcmVzc2lvbk1hdGNoZXMsIGpvYnMpOwogICAgICAgICAgICAgaWYgKG9uZVN0YXR1cyAhPSBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMuU1VDQ0VTU0ZVTCkKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBvbmVTdGF0dXM7CiAgICAgICAgIH0KKyAgICAgICAgbG9nZ2VyLmluZm8oIkNvbXBsZXRlZCB7fSB3aXRoIHN0YXR1cyB7fSIsIE9wZXJhdGlvblR5cGUuVVBHUkFERV9TU1RBQkxFUywgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1cy5zdGF0dXNDb2RlOwogICAgIH0KIApAQCAtNDAzOSwzMyArNDEyOCwzNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIGludCByZWxvY2F0ZVNTVGFibGVzKFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZyAuLi4gY29sdW1uRmFtaWxpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHB1YmxpYyBpbnQgcmVsb2NhdGVTU1RhYmxlcyhTdHJpbmcga2V5c3BhY2VOYW1lLCBTdHJpbmcuLi4gdGFibGVOYW1lcykgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCiAgICAgewotICAgICAgICByZXR1cm4gcmVsb2NhdGVTU1RhYmxlcygwLCBrZXlzcGFjZU5hbWUsIGNvbHVtbkZhbWlsaWVzKTsKKyAgICAgICAgcmV0dXJuIHJlbG9jYXRlU1NUYWJsZXMoMCwga2V5c3BhY2VOYW1lLCB0YWJsZU5hbWVzKTsKICAgICB9CiAKLSAgICBwdWJsaWMgaW50IHJlbG9jYXRlU1NUYWJsZXMoaW50IGpvYnMsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZyAuLi4gY29sdW1uRmFtaWxpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHB1YmxpYyBpbnQgcmVsb2NhdGVTU1RhYmxlcyhpbnQgam9icywgU3RyaW5nIGtleXNwYWNlTmFtZSwgU3RyaW5nLi4uIHRhYmxlTmFtZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzIHN0YXR1cyA9IENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cy5TVUNDRVNTRlVMOwotICAgICAgICBmb3IgKENvbHVtbkZhbWlseVN0b3JlIGNmcyA6IGdldFZhbGlkQ29sdW1uRmFtaWxpZXMoZmFsc2UsIGZhbHNlLCBrZXlzcGFjZU5hbWUsIGNvbHVtbkZhbWlsaWVzKSkKKyAgICAgICAgbG9nZ2VyLmluZm8oIlN0YXJ0aW5nIHt9IG9uIHt9Lnt9IiwgT3BlcmF0aW9uVHlwZS5SRUxPQ0FURSwga2V5c3BhY2VOYW1lLCBBcnJheXMudG9TdHJpbmcodGFibGVOYW1lcykpOworICAgICAgICBmb3IgKENvbHVtbkZhbWlseVN0b3JlIGNmcyA6IGdldFZhbGlkQ29sdW1uRmFtaWxpZXMoZmFsc2UsIGZhbHNlLCBrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZXMpKQogICAgICAgICB7CiAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMgb25lU3RhdHVzID0gY2ZzLnJlbG9jYXRlU1NUYWJsZXMoam9icyk7CiAgICAgICAgICAgICBpZiAob25lU3RhdHVzICE9IENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cy5TVUNDRVNTRlVMKQogICAgICAgICAgICAgICAgIHN0YXR1cyA9IG9uZVN0YXR1czsKICAgICAgICAgfQorICAgICAgICBsb2dnZXIuaW5mbygiQ29tcGxldGVkIHt9IHdpdGggc3RhdHVzIHt9IiwgT3BlcmF0aW9uVHlwZS5SRUxPQ0FURSwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1cy5zdGF0dXNDb2RlOwogICAgIH0KIAotICAgIHB1YmxpYyBpbnQgZ2FyYmFnZUNvbGxlY3QoU3RyaW5nIHRvbWJzdG9uZU9wdGlvblN0cmluZywgaW50IGpvYnMsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZyAuLi4gY29sdW1uRmFtaWxpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHB1YmxpYyBpbnQgZ2FyYmFnZUNvbGxlY3QoU3RyaW5nIHRvbWJzdG9uZU9wdGlvblN0cmluZywgaW50IGpvYnMsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZy4uLiB0YWJsZU5hbWVzKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KICAgICB7CiAgICAgICAgIFRvbWJzdG9uZU9wdGlvbiB0b21ic3RvbmVPcHRpb24gPSBUb21ic3RvbmVPcHRpb24udmFsdWVPZih0b21ic3RvbmVPcHRpb25TdHJpbmcpOwogICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMgc3RhdHVzID0gQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzLlNVQ0NFU1NGVUw7Ci0gICAgICAgIGZvciAoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzIDogZ2V0VmFsaWRDb2x1bW5GYW1pbGllcyhmYWxzZSwgZmFsc2UsIGtleXNwYWNlTmFtZSwgY29sdW1uRmFtaWxpZXMpKQorICAgICAgICBsb2dnZXIuaW5mbygiU3RhcnRpbmcge30gb24ge30ue30iLCBPcGVyYXRpb25UeXBlLkdBUkJBR0VfQ09MTEVDVCwga2V5c3BhY2VOYW1lLCBBcnJheXMudG9TdHJpbmcodGFibGVOYW1lcykpOworICAgICAgICBmb3IgKENvbHVtbkZhbWlseVN0b3JlIGNmcyA6IGdldFZhbGlkQ29sdW1uRmFtaWxpZXMoZmFsc2UsIGZhbHNlLCBrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZXMpKQogICAgICAgICB7CiAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMgb25lU3RhdHVzID0gY2ZzLmdhcmJhZ2VDb2xsZWN0KHRvbWJzdG9uZU9wdGlvbiwgam9icyk7CiAgICAgICAgICAgICBpZiAob25lU3RhdHVzICE9IENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cy5TVUNDRVNTRlVMKQogICAgICAgICAgICAgICAgIHN0YXR1cyA9IG9uZVN0YXR1czsKICAgICAgICAgfQorICAgICAgICBsb2dnZXIuaW5mbygiQ29tcGxldGVkIHt9IHdpdGggc3RhdHVzIHt9IiwgT3BlcmF0aW9uVHlwZS5HQVJCQUdFX0NPTExFQ1QsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXMuc3RhdHVzQ29kZTsKICAgICB9CiAKQEAgLTQxNTMsNiArNDI0NiwyNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqKgorICAgICAqIEZvcmNlcyBjb21wYWN0aW9uIGZvciBhIGxpc3Qgb2YgcGFydGl0aW9uIGtleXMgaW4gYSB0YWJsZQorICAgICAqIFRoZSBtZXRob2Qgd2lsbCBpZ25vcmUgdGhlIGdjX2dyYWNlX3NlY29uZHMgZm9yIHRoZSBwYXJ0aXRpb25LZXlzSWdub3JlR2NHcmFjZSBkdXJpbmcgdGhlIGNvbWFwY3Rpb24sCisgICAgICogaW4gb3JkZXIgdG8gcHVyZ2UgdGhlIHRvbWJzdG9uZXMgYW5kIGZyZWUgdXAgc3BhY2UgcXVpY2tlci4KKyAgICAgKiBAcGFyYW0ga2V5c3BhY2VOYW1lIGtleXNwYWNlIG5hbWUKKyAgICAgKiBAcGFyYW0gdGFibGVOYW1lIHRhYmxlIG5hbWUKKyAgICAgKiBAcGFyYW0gcGFydGl0aW9uS2V5c0lnbm9yZUdjR3JhY2UgcGFydGl0aW9uIGtleXMgaWdub3JpbmcgdGhlIGdjX2dyYWNlX3NlY29uZHMKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGFueSBJL08gb3BlcmF0aW9uIGVycm9yCisgICAgICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gd2hlbiBhdHRlbXB0aW5nIHRvIHJldHJpZXZlIHRoZSByZXN1bHQgb2YgYSB0YXNrIHRoYXQgYWJvcnRlZCBieSB0aHJvd2luZyBhbiBleGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHdoZW4gYSB0aHJlYWQgaXMgd2FpdGluZywgc2xlZXBpbmcsIG9yIG90aGVyd2lzZSBvY2N1cGllZCwgYW5kIHRoZSB0aHJlYWQgaXMgaW50ZXJydXB0ZWQsIGVpdGhlciBiZWZvcmUgb3IgZHVyaW5nIHRoZSBhY3Rpdml0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZvcmNlQ29tcGFjdGlvbktleXNJZ25vcmluZ0djR3JhY2UoU3RyaW5nIGtleXNwYWNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YWJsZU5hbWUsIFN0cmluZy4uLiBwYXJ0aXRpb25LZXlzSWdub3JlR2NHcmFjZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZlN0b3JlID0gZ2V0VmFsaWRLZXlzcGFjZShrZXlzcGFjZU5hbWUpLmdldENvbHVtbkZhbWlseVN0b3JlKHRhYmxlTmFtZSk7CisgICAgICAgIGNmU3RvcmUuZm9yY2VDb21wYWN0aW9uS2V5c0lnbm9yaW5nR2NHcmFjZShwYXJ0aXRpb25LZXlzSWdub3JlR2NHcmFjZSk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogVGFrZXMgdGhlIHNuYXBzaG90IGZvciB0aGUgZ2l2ZW4ga2V5c3BhY2VzLiBBIHNuYXBzaG90IG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuCiAgICAgICoKQEAgLTQzMDYsMTUgKzQ0MTcsMjMgQEAKICAgICAgKiBSZW1vdmUgdGhlIHNuYXBzaG90IHdpdGggdGhlIGdpdmVuIG5hbWUgZnJvbSB0aGUgZ2l2ZW4ga2V5c3BhY2VzLgogICAgICAqIElmIG5vIHRhZyBpcyBzcGVjaWZpZWQgd2Ugd2lsbCByZW1vdmUgYWxsIHNuYXBzaG90cy4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhclNuYXBzaG90KFN0cmluZyB0YWcsIFN0cmluZy4uLiBrZXlzcGFjZU5hbWVzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICBwdWJsaWMgdm9pZCBjbGVhclNuYXBzaG90KFN0cmluZyB0YWcsIFN0cmluZy4uLiBrZXlzcGFjZU5hbWVzKQogICAgIHsKLSAgICAgICAgaWYodGFnID09IG51bGwpCisgICAgICAgIGNsZWFyU25hcHNob3QoQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSwgdGFnLCBrZXlzcGFjZU5hbWVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhclNuYXBzaG90KE1hcDxTdHJpbmcsIE9iamVjdD4gb3B0aW9ucywgU3RyaW5nIHRhZywgU3RyaW5nLi4uIGtleXNwYWNlTmFtZXMpCisgICAgeworICAgICAgICBpZiAodGFnID09IG51bGwpCiAgICAgICAgICAgICB0YWcgPSAiIjsKIAorICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKQorICAgICAgICAgICAgb3B0aW9ucyA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisKICAgICAgICAgU2V0PFN0cmluZz4ga2V5c3BhY2VzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICBmb3IgKFN0cmluZyBkYXRhRGlyIDogRGF0YWJhc2VEZXNjcmlwdG9yLmdldEFsbERhdGFGaWxlTG9jYXRpb25zKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZvcihTdHJpbmcga2V5c3BhY2VEaXIgOiBuZXcgRmlsZShkYXRhRGlyKS50cnlMaXN0TmFtZXMoKSkKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleXNwYWNlRGlyIDogbmV3IEZpbGUoZGF0YURpcikudHJ5TGlzdE5hbWVzKCkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy8gT25seSBhZGQgYSBrcyBpZiBpdCBoYXMgYmVlbiBzcGVjaWZpZWQgYXMgYSBwYXJhbSwgYXNzdW1pbmcgcGFyYW1zIHdlcmUgYWN0dWFsbHkgcHJvdmlkZWQuCiAgICAgICAgICAgICAgICAgaWYgKGtleXNwYWNlTmFtZXMubGVuZ3RoID4gMCAmJiAhQXJyYXlzLmFzTGlzdChrZXlzcGFjZU5hbWVzKS5jb250YWlucyhrZXlzcGFjZURpcikpCkBAIC00MzIzLDE2ICs0NDQyLDU4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBPYmplY3Qgb2xkZXJUaGFuID0gb3B0aW9ucy5nZXQoIm9sZGVyX3RoYW4iKTsKKyAgICAgICAgT2JqZWN0IG9sZGVyVGhhblRpbWVzdGFtcCA9IG9wdGlvbnMuZ2V0KCJvbGRlcl90aGFuX3RpbWVzdGFtcCIpOworCisgICAgICAgIGZpbmFsIGxvbmcgY2xlYXJPbGRlclRoYW5UaW1lc3RhbXA7CisgICAgICAgIGlmIChvbGRlclRoYW4gIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IG9sZGVyVGhhbiBpbnN0YW5jZW9mIFN0cmluZyA6ICJpdCBpcyBleHBlY3RlZCB0aGF0IG9sZGVyX3RoYW4gaXMgYW4gaW5zdGFuY2Ugb2YgamF2YS5sYW5nLlN0cmluZyI7CisgICAgICAgICAgICBjbGVhck9sZGVyVGhhblRpbWVzdGFtcCA9IENsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpcygpIC0gbmV3IER1cmF0aW9uU3BlYy5Mb25nU2Vjb25kc0JvdW5kKChTdHJpbmcpIG9sZGVyVGhhbikudG9NaWxsaXNlY29uZHMoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChvbGRlclRoYW5UaW1lc3RhbXAgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IG9sZGVyVGhhblRpbWVzdGFtcCBpbnN0YW5jZW9mIFN0cmluZyA6ICJpdCBpcyBleHBlY3RlZCB0aGF0IG9sZGVyX3RoYW5fdGltZXN0YW1wIGlzIGFuIGluc3RhbmNlIG9mIGphdmEubGFuZy5TdHJpbmciOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xlYXJPbGRlclRoYW5UaW1lc3RhbXAgPSBJbnN0YW50LnBhcnNlKChTdHJpbmcpIG9sZGVyVGhhblRpbWVzdGFtcCkudG9FcG9jaE1pbGxpKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRGF0ZVRpbWVQYXJzZUV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUGFyYW1ldGVyIG9sZGVyX3RoYW5fdGltZXN0YW1wIGhhcyB0byBiZSBhIHZhbGlkIGluc3RhbnQgaW4gSVNPIGZvcm1hdC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBjbGVhck9sZGVyVGhhblRpbWVzdGFtcCA9IDBMOworCiAgICAgICAgIGZvciAoU3RyaW5nIGtleXNwYWNlIDoga2V5c3BhY2VzKQotICAgICAgICAgICAgS2V5c3BhY2UuY2xlYXJTbmFwc2hvdCh0YWcsIGtleXNwYWNlKTsKKyAgICAgICAgICAgIGNsZWFyS2V5c3BhY2VTbmFwc2hvdChrZXlzcGFjZSwgdGFnLCBjbGVhck9sZGVyVGhhblRpbWVzdGFtcCk7CiAKICAgICAgICAgaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQogICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJDbGVhcmVkIG91dCBzbmFwc2hvdCBkaXJlY3RvcmllcyIpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENsZWFyIHNuYXBzaG90cyBmb3IgYSBnaXZlbiBrZXlzcGFjZS4KKyAgICAgKiBAcGFyYW0ga2V5c3BhY2Uga2V5c3BhY2UgdG8gcmVtb3ZlIHNuYXBzaG90cyBmb3IKKyAgICAgKiBAcGFyYW0gdGFnIHRoZSB1c2VyIHN1cHBsaWVkIHNuYXBzaG90IG5hbWUuIElmIGVtcHR5IG9yIG51bGwsIGFsbCB0aGUgc25hcHNob3RzIHdpbGwgYmUgY2xlYW5lZAorICAgICAqIEBwYXJhbSBvbGRlclRoYW5UaW1lc3RhbXAgaWYgYSBzbmFwc2hvdCB3YXMgY3JlYXRlZCBiZWZvcmUgdGhpcyB0aW1lc3RhbXAsIGl0IHdpbGwgYmUgY2xlYXJlZCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGl0cyB2YWx1ZSBpcyAwLCB0aGlzIHBhcmFtZXRlciBpcyBlZmZlY3RpdmVseSBpZ25vcmVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjbGVhcktleXNwYWNlU25hcHNob3QoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFnLCBsb25nIG9sZGVyVGhhblRpbWVzdGFtcCkKKyAgICB7CisgICAgICAgIFNldDxUYWJsZVNuYXBzaG90PiBzbmFwc2hvdHNUb0NsZWFyID0gc25hcHNob3RNYW5hZ2VyLmxvYWRTbmFwc2hvdHMoa2V5c3BhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihUYWJsZVNuYXBzaG90LnNob3VsZENsZWFyU25hcHNob3QodGFnLCBvbGRlclRoYW5UaW1lc3RhbXApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisgICAgICAgIGZvciAoVGFibGVTbmFwc2hvdCBzbmFwc2hvdCA6IHNuYXBzaG90c1RvQ2xlYXIpCisgICAgICAgICAgICBzbmFwc2hvdE1hbmFnZXIuY2xlYXJTbmFwc2hvdChzbmFwc2hvdCk7CisgICAgfQorCiAgICAgcHVibGljIE1hcDxTdHJpbmcsIFRhYnVsYXJEYXRhPiBnZXRTbmFwc2hvdERldGFpbHMoTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zKQogICAgIHsKICAgICAgICAgYm9vbGVhbiBza2lwRXhwaXJpbmcgPSBvcHRpb25zICE9IG51bGwgJiYgQm9vbGVhbi5wYXJzZUJvb2xlYW4ob3B0aW9ucy5nZXRPckRlZmF1bHQoIm5vX3R0bCIsICJmYWxzZSIpKTsKKyAgICAgICAgYm9vbGVhbiBpbmNsdWRlRXBoZW1lcmFsID0gb3B0aW9ucyAhPSBudWxsICYmIEJvb2xlYW4ucGFyc2VCb29sZWFuKG9wdGlvbnMuZ2V0T3JEZWZhdWx0KCJpbmNsdWRlX2VwaGVtZXJhbCIsICJmYWxzZSIpKTsKIAogICAgICAgICBNYXA8U3RyaW5nLCBUYWJ1bGFyRGF0YT4gc25hcHNob3RNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CiAKQEAgLTQzNDAsNiArNDUwMSw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChza2lwRXhwaXJpbmcgJiYgc25hcHNob3QuaXNFeHBpcmluZygpKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCFpbmNsdWRlRXBoZW1lcmFsICYmIHNuYXBzaG90LmlzRXBoZW1lcmFsKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CiAKICAgICAgICAgICAgIFRhYnVsYXJEYXRhU3VwcG9ydCBkYXRhID0gKFRhYnVsYXJEYXRhU3VwcG9ydCkgc25hcHNob3RNYXAuZ2V0KHNuYXBzaG90LmdldFRhZygpKTsKICAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwpCkBAIC00NTc2LDggKzQ3MzksOCBAQAogICAgICAgICBsb2dnZXIuaW5mbygicmVwYWlyaW5nIHBheG9zIGZvciB7fSIsIHJlYXNvbik7CiAKICAgICAgICAgaW50IHJldHJpZXMgPSAwOwotICAgICAgICBpbnQgbWF4UmV0cmllcyA9IEludGVnZXIuZ2V0SW50ZWdlcigiY2Fzc2FuZHJhLnBheG9zX3JlcGFpcl9vbl90b3BvbG9neV9jaGFuZ2VfcmV0cmllcyIsIDEwKTsKLSAgICAgICAgaW50IGRlbGF5U2VjID0gSW50ZWdlci5nZXRJbnRlZ2VyKCJjYXNzYW5kcmEucGF4b3NfcmVwYWlyX29uX3RvcG9sb2d5X2NoYW5nZV9yZXRyeV9kZWxheV9zZWNvbmRzIiwgMTApOworICAgICAgICBpbnQgbWF4UmV0cmllcyA9IFBBWE9TX1JFUEFJUl9PTl9UT1BPTE9HWV9DSEFOR0VfUkVUUklFUy5nZXRJbnQoKTsKKyAgICAgICAgaW50IGRlbGF5U2VjID0gUEFYT1NfUkVQQUlSX09OX1RPUE9MT0dZX0NIQU5HRV9SRVRSWV9ERUxBWV9TRUNPTkRTLmdldEludCgpOwogCiAgICAgICAgIGJvb2xlYW4gY29tcGxldGVkID0gZmFsc2U7CiAgICAgICAgIHdoaWxlICghY29tcGxldGVkKQpAQCAtNDY1MSwxNiArNDgxNCw0NCBAQAogICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC48U3RyaW5nPmJ1aWxkZXIoKS5hZGQocGFpci5sZWZ0Lm5hbWUoKSkuYWRkQWxsKHBhaXIucmlnaHQpLmJ1aWxkKCk7CiAgICAgfQogCisgICAgQERlcHJlY2F0ZWQKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRSZXBhaXJTZXNzaW9uTWF4VHJlZURlcHRoKGludCBkZXB0aCkKICAgICB7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRSZXBhaXJTZXNzaW9uTWF4VHJlZURlcHRoKGRlcHRoKTsKICAgICB9CiAKKyAgICBARGVwcmVjYXRlZAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0UmVwYWlyU2Vzc2lvbk1heFRyZWVEZXB0aCgpCiAgICAgewogICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFJlcGFpclNlc3Npb25NYXhUcmVlRGVwdGgoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXBhaXJTZXNzaW9uTWF4aW11bVRyZWVEZXB0aChpbnQgZGVwdGgpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFJlcGFpclNlc3Npb25NYXhUcmVlRGVwdGgoZGVwdGgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJbiBDQVNTQU5EUkEtMTc2NjgsIEpNWCBzZXR0ZXJzIHRoYXQgZGlkIG5vdCB0aHJvdyBzdGFuZGFyZCBleGNlcHRpb25zIHdlcmUgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBvbmVzIHRoYXQgZG8uCisgICAgICogRm9yIGNvbnNpc3RlbmN5IHB1cnBvc2VzLCB0aGUgcmVzcGVjdGl2ZSBnZXR0ZXIgImdldFJlcGFpclNlc3Npb25NYXhUcmVlRGVwdGgiIHdhcyBhbHNvIGRlcHJlY2F0ZWQgYW5kIHJlcGxhY2VkCisgICAgICogYnkgdGhpcyBtZXRob2QuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRSZXBhaXJTZXNzaW9uTWF4aW11bVRyZWVEZXB0aCgpCisgICAgeworICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFJlcGFpclNlc3Npb25NYXhUcmVlRGVwdGgoKTsKKyAgICB9CisKICAgICAvKiBFbmQgb2YgTUJlYW4gaW50ZXJmYWNlIG1ldGhvZHMgKi8KIAogICAgIC8qKgpAQCAtNDkyOCw2ICs1MTE5LDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgc3RhcnRMZWF2aW5nKCkKICAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZXZlcml0eUR1cmluZ0RlY29tbWlzc2lvbigpLmlmUHJlc2VudChEeW5hbWljRW5kcG9pbnRTbml0Y2g6OmFkZFNldmVyaXR5KTsKICAgICAgICAgR29zc2lwZXIuaW5zdGFuY2UuYWRkTG9jYWxBcHBsaWNhdGlvblN0YXRlKEFwcGxpY2F0aW9uU3RhdGUuU1RBVFVTX1dJVEhfUE9SVCwgdmFsdWVGYWN0b3J5LmxlYXZpbmcoZ2V0TG9jYWxUb2tlbnMoKSkpOwogICAgICAgICBHb3NzaXBlci5pbnN0YW5jZS5hZGRMb2NhbEFwcGxpY2F0aW9uU3RhdGUoQXBwbGljYXRpb25TdGF0ZS5TVEFUVVMsIHZhbHVlRmFjdG9yeS5sZWF2aW5nKGdldExvY2FsVG9rZW5zKCkpKTsKICAgICAgICAgdG9rZW5NZXRhZGF0YS5hZGRMZWF2aW5nRW5kcG9pbnQoRkJVdGlsaXRpZXMuZ2V0QnJvYWRjYXN0QWRkcmVzc0FuZFBvcnQoKSk7CkBAIC01MDc3LDkgKzUyNjksMjAgQEAKICAgICAgICAgbG9nZ2VyLmRlYnVnKCJ3YWl0aW5nIGZvciBiYXRjaCBsb2cgcHJvY2Vzc2luZy4iKTsKICAgICAgICAgYmF0Y2hsb2dSZXBsYXkuZ2V0KCk7CiAKLSAgICAgICAgc2V0TW9kZShNb2RlLkxFQVZJTkcsICJzdHJlYW1pbmcgaGludHMgdG8gb3RoZXIgbm9kZXMiLCB0cnVlKTsKKyAgICAgICAgRnV0dXJlPD8+IGhpbnRzU3VjY2VzcyA9IEltbWVkaWF0ZUZ1dHVyZS5zdWNjZXNzKG51bGwpOwogCi0gICAgICAgIEZ1dHVyZSBoaW50c1N1Y2Nlc3MgPSBzdHJlYW1IaW50cygpOworICAgICAgICBpZiAoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFRyYW5zZmVySGludHNPbkRlY29tbWlzc2lvbigpKSAKKyAgICAgICAgeworICAgICAgICAgICAgc2V0TW9kZShNb2RlLkxFQVZJTkcsICJzdHJlYW1pbmcgaGludHMgdG8gb3RoZXIgbm9kZXMiLCB0cnVlKTsKKyAgICAgICAgICAgIGhpbnRzU3VjY2VzcyA9IHN0cmVhbUhpbnRzKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzZXRNb2RlKE1vZGUuTEVBVklORywgInBhdXNpbmcgZGlzcGF0Y2ggYW5kIGRlbGV0aW5nIGhpbnRzIiwgdHJ1ZSk7CisgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0SGludGVkSGFuZG9mZkVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgSGludHNTZXJ2aWNlLmluc3RhbmNlLnBhdXNlRGlzcGF0Y2goKTsKKyAgICAgICAgICAgIEhpbnRzU2VydmljZS5pbnN0YW5jZS5kZWxldGVBbGxIaW50cygpOworICAgICAgICB9CiAKICAgICAgICAgLy8gd2FpdCBmb3IgdGhlIHRyYW5zZmVyIHJ1bm5hYmxlcyB0byBzaWduYWwgdGhlIGxhdGNoLgogICAgICAgICBsb2dnZXIuZGVidWcoIndhaXRpbmcgZm9yIHN0cmVhbSBhY2tzLiIpOwpAQCAtNjA5NSwxNyArNjI5OCwyMyBAQAogICAgICAgICByZXR1cm4gc2FtcGxlZEtleXM7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8Q29tcG9zaXRlRGF0YT4+IHNhbXBsZVBhcnRpdGlvbnMoaW50IGR1cmF0aW9uLCBpbnQgY2FwYWNpdHksIGludCBjb3VudCwgTGlzdDxTdHJpbmc+IHNhbXBsZXJzKSB0aHJvd3MgT3BlbkRhdGFFeGNlcHRpb24geworICAgICAgICByZXR1cm4gc2FtcGxlUGFydGl0aW9ucyhudWxsLCBkdXJhdGlvbiwgY2FwYWNpdHksIGNvdW50LCBzYW1wbGVycyk7CisgICAgfQorCiAgICAgLyoKICAgICAgKiB7ICJzYW1wbGVyX25hbWUiOiBbIHt0YWJsZTogIiIsIGNvdW50OiBpLCBlcnJvcjogaSwgdmFsdWU6ICIifSwgLi4uIF0gfQogICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PENvbXBvc2l0ZURhdGE+PiBzYW1wbGVQYXJ0aXRpb25zKGludCBkdXJhdGlvbk1pbGxpcywgaW50IGNhcGFjaXR5LCBpbnQgY291bnQsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gc2FtcGxlcnMpIHRocm93cyBPcGVuRGF0YUV4Y2VwdGlvbgorICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PENvbXBvc2l0ZURhdGE+PiBzYW1wbGVQYXJ0aXRpb25zKFN0cmluZyBrZXlzcGFjZSwgaW50IGR1cmF0aW9uTWlsbGlzLCBpbnQgY2FwYWNpdHksIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gc2FtcGxlcnMpIHRocm93cyBPcGVuRGF0YUV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBMaXN0PENvbXBvc2l0ZURhdGE+PiByZXN1bHQgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworICAgICAgICBJdGVyYWJsZTxDb2x1bW5GYW1pbHlTdG9yZT4gdGFibGVzID0gU2FtcGxpbmdNYW5hZ2VyLmdldFRhYmxlcyhrZXlzcGFjZSwgbnVsbCk7CiAgICAgICAgIGZvciAoU3RyaW5nIHNhbXBsZXIgOiBzYW1wbGVycykKICAgICAgICAgewotICAgICAgICAgICAgZm9yIChDb2x1bW5GYW1pbHlTdG9yZSB0YWJsZSA6IENvbHVtbkZhbWlseVN0b3JlLmFsbCgpKQorICAgICAgICAgICAgZm9yIChDb2x1bW5GYW1pbHlTdG9yZSB0YWJsZSA6IHRhYmxlcykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0YWJsZS5iZWdpbkxvY2FsU2FtcGxpbmcoc2FtcGxlciwgY2FwYWNpdHksIGR1cmF0aW9uTWlsbGlzKTsKICAgICAgICAgICAgIH0KQEAgLTYxMTUsNyArNjMyNCw3IEBACiAgICAgICAgIGZvciAoU3RyaW5nIHNhbXBsZXIgOiBzYW1wbGVycykKICAgICAgICAgewogICAgICAgICAgICAgTGlzdDxDb21wb3NpdGVEYXRhPiB0b3BrID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKENvbHVtbkZhbWlseVN0b3JlIHRhYmxlIDogQ29sdW1uRmFtaWx5U3RvcmUuYWxsKCkpCisgICAgICAgICAgICBmb3IgKENvbHVtbkZhbWlseVN0b3JlIHRhYmxlIDogdGFibGVzKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRvcGsuYWRkQWxsKHRhYmxlLmZpbmlzaExvY2FsU2FtcGxpbmcoc2FtcGxlciwgY291bnQpKTsKICAgICAgICAgICAgIH0KQEAgLTYxMzMsNiArNjM0Miw0NCBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIEBPdmVycmlkZSAvLyBOb3RlIGZyb20gcGFyZW50IGphdmFkb2M6IGtzIGFuZCB0YWJsZSBhcmUgbnVsbGFibGUKKyAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFNhbXBsaW5nUGFydGl0aW9ucyhTdHJpbmcga3MsIFN0cmluZyB0YWJsZSwgaW50IGR1cmF0aW9uLCBpbnQgaW50ZXJ2YWwsIGludCBjYXBhY2l0eSwgaW50IGNvdW50LCBMaXN0PFN0cmluZz4gc2FtcGxlcnMpCisgICAgeworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQoZHVyYXRpb24gPiAwLCAiU2FtcGxpbmcgZHVyYXRpb24gJXMgbXVzdCBiZSBwb3NpdGl2ZS4iLCBkdXJhdGlvbik7CisKKyAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50KGludGVydmFsIDw9IDAgfHwgaW50ZXJ2YWwgPj0gZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2FtcGxpbmcgaW50ZXJ2YWwgJXMgc2hvdWxkIGJlIGdyZWF0ZXIgdGhlbiBvciBlcXVhbHMgdG8gZHVyYXRpb24gJXMgaWYgZGVmaW5lZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwsIGR1cmF0aW9uKTsKKworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQoY2FwYWNpdHkgPiAwICYmIGNhcGFjaXR5IDw9IDEwMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2FtcGxpbmcgY2FwYWNpdHkgJXMgbXVzdCBiZSBwb3NpdGl2ZSBhbmQgdGhlIG1heCB2YWx1ZSBpcyAxMDI0IChpbmNsdXNpdmUpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSk7CisKKyAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50KGNvdW50ID4gMCAmJiBjb3VudCA8IGNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNhbXBsaW5nIGNvdW50ICVzIG11c3QgYmUgcG9zaXRpdmUgYW5kIHNtYWxsZXIgdGhhbiBjYXBhY2l0eSAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsIGNhcGFjaXR5KTsKKworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQoIXNhbXBsZXJzLmlzRW1wdHkoKSwgIlNhbXBsZXJzIGNhbm5vdCBiZSBlbXB0eS4iKTsKKworICAgICAgICBTZXQ8U2FtcGxlci5TYW1wbGVyVHlwZT4gYXZhaWxhYmxlID0gRW51bVNldC5hbGxPZihTYW1wbGVyLlNhbXBsZXJUeXBlLmNsYXNzKTsKKyAgICAgICAgc2FtcGxlcnMuZm9yRWFjaCgoeCkgLT4gY2hlY2tBcmd1bWVudChhdmFpbGFibGUuY29udGFpbnMoU2FtcGxlci5TYW1wbGVyVHlwZS52YWx1ZU9mKHgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyBzYW1wbGVyIGlzIG5vdCBhdmFpbGFibGUgZnJvbTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIEFycmF5cy50b1N0cmluZyhTYW1wbGVyLlNhbXBsZXJUeXBlLnZhbHVlcygpKSkpOworICAgICAgICByZXR1cm4gc2FtcGxpbmdNYW5hZ2VyLnJlZ2lzdGVyKGtzLCB0YWJsZSwgZHVyYXRpb24sIGludGVydmFsLCBjYXBhY2l0eSwgY291bnQsIHNhbXBsZXJzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBzdG9wU2FtcGxpbmdQYXJ0aXRpb25zKFN0cmluZyBrcywgU3RyaW5nIHRhYmxlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNhbXBsaW5nTWFuYWdlci51bnJlZ2lzdGVyKGtzLCB0YWJsZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRTYW1wbGVUYXNrcygpCisgICAgeworICAgICAgICByZXR1cm4gc2FtcGxpbmdNYW5hZ2VyLmFsbEpvYnMoKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCByZWJ1aWxkU2Vjb25kYXJ5SW5kZXgoU3RyaW5nIGtzTmFtZSwgU3RyaW5nIGNmTmFtZSwgU3RyaW5nLi4uIGlkeE5hbWVzKQogICAgIHsKICAgICAgICAgU3RyaW5nW10gaW5kaWNlcyA9IGFzTGlzdChpZHhOYW1lcykuc3RyZWFtKCkKQEAgLTYyNzIsMjkgKzY1MTksNzYgQEAKICAgICAgICAgbG9nZ2VyLmluZm8oInVwZGF0ZWQgcmVwbGljYV9maWx0ZXJpbmdfcHJvdGVjdGlvbi5jYWNoZWRfcm93c19mYWlsX3RocmVzaG9sZCB0byB7fSIsIHRocmVzaG9sZCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRDb2x1bW5JbmRleFNpemVJbktpQigpCiAgICAgewogICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbHVtbkluZGV4U2l6ZUluS2lCKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoaW50IGNvbHVtbkluZGV4U2l6ZUluS2lCKQorICAgIHsKKyAgICAgICAgaW50IG9sZFZhbHVlSW5LaUIgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleFNpemVJbktpQihjb2x1bW5JbmRleFNpemVJbktpQik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgbG9nZ2VyLmluZm8oIlVwZGF0ZWQgY29sdW1uX2luZGV4X3NpemUgdG8ge30gS2lCICh3YXMge30gS2lCKSIsIGNvbHVtbkluZGV4U2l6ZUluS2lCLCBvbGRWYWx1ZUluS2lCKTsKKyAgICB9CisKKyAgICBARGVwcmVjYXRlZAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbkluZGV4U2l6ZShpbnQgY29sdW1uSW5kZXhTaXplSW5LQikKICAgICB7CiAgICAgICAgIGludCBvbGRWYWx1ZUluS2lCID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbHVtbkluZGV4U2l6ZUluS2lCKCk7Ci0gICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleFNpemUoY29sdW1uSW5kZXhTaXplSW5LQik7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleFNpemVJbktpQihjb2x1bW5JbmRleFNpemVJbktCKTsKICAgICAgICAgbG9nZ2VyLmluZm8oIlVwZGF0ZWQgY29sdW1uX2luZGV4X3NpemUgdG8ge30gS2lCICh3YXMge30gS2lCKSIsIGNvbHVtbkluZGV4U2l6ZUluS0IsIG9sZFZhbHVlSW5LaUIpOwogICAgIH0KIAorICAgIEBEZXByZWNhdGVkCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRDb2x1bW5JbmRleENhY2hlU2l6ZSgpCiAgICAgewogICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbHVtbkluZGV4Q2FjaGVTaXplSW5LaUIoKTsKICAgICB9CiAKKyAgICBARGVwcmVjYXRlZAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbkluZGV4Q2FjaGVTaXplKGludCBjYWNoZVNpemVJbktCKQogICAgIHsKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4Q2FjaGVTaXplKGNhY2hlU2l6ZUluS0IpOwogICAgICAgICBsb2dnZXIuaW5mbygiVXBkYXRlZCBjb2x1bW5faW5kZXhfY2FjaGVfc2l6ZSB0byB7fSIsIGNhY2hlU2l6ZUluS0IpOwogICAgIH0KIAorICAgIC8qCisgICAgICogSW4gQ0FTU0FORFJBLTE3NjY4LCBKTVggc2V0dGVycyB0aGF0IGRpZCBub3QgdGhyb3cgc3RhbmRhcmQgZXhjZXB0aW9ucyB3ZXJlIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2Ygb25lcyB0aGF0IGRvLgorICAgICAqIEZvciBjb25zaXN0ZW5jeSBwdXJwb3NlcywgdGhlIHJlc3BlY3RpdmUgZ2V0dGVyICJnZXRDb2x1bW5JbmRleENhY2hlU2l6ZSIgd2FzIGFsc28gZGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQgYnkKKyAgICAgKiB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldENvbHVtbkluZGV4Q2FjaGVTaXplSW5LaUIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIERhdGFiYXNlRGVzY3JpcHRvci5nZXRDb2x1bW5JbmRleENhY2hlU2l6ZUluS2lCKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q29sdW1uSW5kZXhDYWNoZVNpemVJbktpQihpbnQgY2FjaGVTaXplSW5LaUIpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4Q2FjaGVTaXplKGNhY2hlU2l6ZUluS2lCKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICBsb2dnZXIuaW5mbygiVXBkYXRlZCBjb2x1bW5faW5kZXhfY2FjaGVfc2l6ZSB0byB7fSIsIGNhY2hlU2l6ZUluS2lCKTsKKyAgICB9CisKICAgICBwdWJsaWMgaW50IGdldEJhdGNoU2l6ZUZhaWx1cmVUaHJlc2hvbGQoKQogICAgIHsKICAgICAgICAgcmV0dXJuIERhdGFiYXNlRGVzY3JpcHRvci5nZXRCYXRjaFNpemVGYWlsVGhyZXNob2xkSW5LaUIoKTsKQEAgLTYzMDYsMTcgKzY2MDAsNDcgQEAKICAgICAgICAgbG9nZ2VyLmluZm8oInVwZGF0ZWQgYmF0Y2hfc2l6ZV9mYWlsX3RocmVzaG9sZCB0byB7fSIsIHRocmVzaG9sZCk7CiAgICAgfQogCisgICAgQERlcHJlY2F0ZWQKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldEJhdGNoU2l6ZVdhcm5UaHJlc2hvbGQoKQogICAgIHsKICAgICAgICAgcmV0dXJuIERhdGFiYXNlRGVzY3JpcHRvci5nZXRCYXRjaFNpemVXYXJuVGhyZXNob2xkSW5LaUIoKTsKICAgICB9CiAKKyAgICBARGVwcmVjYXRlZAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEJhdGNoU2l6ZVdhcm5UaHJlc2hvbGQoaW50IHRocmVzaG9sZCkKICAgICB7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRCYXRjaFNpemVXYXJuVGhyZXNob2xkSW5LaUIodGhyZXNob2xkKTsKICAgICAgICAgbG9nZ2VyLmluZm8oIlVwZGF0ZWQgYmF0Y2hfc2l6ZV93YXJuX3RocmVzaG9sZCB0byB7fSIsIHRocmVzaG9sZCk7CiAgICAgfQogCisgICAgLyoKKyAgICAgKiBJbiBDQVNTQU5EUkEtMTc2NjgsIEpNWCBzZXR0ZXJzIHRoYXQgZGlkIG5vdCB0aHJvdyBzdGFuZGFyZCBleGNlcHRpb25zIHdlcmUgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBvbmVzIHRoYXQgZG8uCisgICAgICogRm9yIGNvbnNpc3RlbmN5IHB1cnBvc2VzLCB0aGUgcmVzcGVjdGl2ZSBnZXR0ZXIgImdldEJhdGNoU2l6ZVdhcm5UaHJlc2hvbGQiIHdhcyBhbHNvIGRlcHJlY2F0ZWQgYW5kIHJlcGxhY2VkIGJ5CisgICAgICogdGhpcyBtZXRob2QuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRCYXRjaFNpemVXYXJuVGhyZXNob2xkSW5LaUIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIERhdGFiYXNlRGVzY3JpcHRvci5nZXRCYXRjaFNpemVXYXJuVGhyZXNob2xkSW5LaUIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRCYXRjaFNpemVXYXJuVGhyZXNob2xkSW5LaUIoaW50IHRocmVzaG9sZEluS2lCKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRCYXRjaFNpemVXYXJuVGhyZXNob2xkSW5LaUIodGhyZXNob2xkSW5LaUIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgbG9nZ2VyLmluZm8oIlVwZGF0ZWQgYmF0Y2hfc2l6ZV93YXJuX3RocmVzaG9sZCB0byB7fSIsIHRocmVzaG9sZEluS2lCKTsKKyAgICB9CisKICAgICBwdWJsaWMgaW50IGdldEluaXRpYWxSYW5nZVRvbWJzdG9uZUxpc3RBbGxvY2F0aW9uU2l6ZSgpCiAgICAgewogICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldEluaXRpYWxSYW5nZVRvbWJzdG9uZUxpc3RBbGxvY2F0aW9uU2l6ZSgpOwpAQCAtNjM1OCw2ICs2NjgyLDE3IEBACiAgICAgICAgIGxvZ2dlci5pbmZvKCJ1cGRhdGVkIGhpbnRlZF9oYW5kb2ZmX3Rocm90dGxlIHRvIHt9IEtpQiIsIHRocm90dGxlSW5LQik7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VHJhbnNmZXJIaW50c09uRGVjb21taXNzaW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0VHJhbnNmZXJIaW50c09uRGVjb21taXNzaW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNmZXJIaW50c09uRGVjb21taXNzaW9uKGJvb2xlYW4gZW5hYmxlZCkKKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRUcmFuc2ZlckhpbnRzT25EZWNvbW1pc3Npb24oZW5hYmxlZCk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJ1cGRhdGVkIHRyYW5zZmVyX2hpbnRzX29uX2RlY29tbWlzc2lvbiB0byB7fSIsIGVuYWJsZWQpOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsZWFyQ29ubmVjdGlvbkhpc3RvcnkoKQogICAgIHsKQEAgLTY5NTMsNCArNzI4OCwzOSBAQAogICAgIHsKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldE1pblRyYWNrZWRQYXJ0aXRpb25Ub21ic3RvbmVDb3VudCh2YWx1ZSk7CiAgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2tpcFN0cmVhbURpc2tTcGFjZUNoZWNrKGJvb2xlYW4gdmFsdWUpCisgICAgeworICAgICAgICBpZiAodmFsdWUgIT0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNraXBTdHJlYW1EaXNrU3BhY2VDaGVjaygpKQorICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkNoYW5naW5nIHNraXBfc3RyZWFtX2Rpc2tfc3BhY2VfY2hlY2sgZnJvbSB7fSB0byB7fSIsIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTa2lwU3RyZWFtRGlza1NwYWNlQ2hlY2soKSwgdmFsdWUpOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0U2tpcFN0cmVhbURpc2tTcGFjZUNoZWNrKHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTa2lwU3RyZWFtRGlza1NwYWNlQ2hlY2soKQorICAgIHsKKyAgICAgICAgcmV0dXJuIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTa2lwU3RyZWFtRGlza1NwYWNlQ2hlY2soKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOb3RpZmljYXRpb25MaXN0ZW5lcihOb3RpZmljYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIExpc3RlbmVyTm90Rm91bmRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmICghc2tpcE5vdGlmaWNhdGlvbkxpc3RlbmVycykKKyAgICAgICAgICAgIHN1cGVyLnJlbW92ZU5vdGlmaWNhdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOb3RpZmljYXRpb25MaXN0ZW5lcihOb3RpZmljYXRpb25MaXN0ZW5lciBsaXN0ZW5lciwgTm90aWZpY2F0aW9uRmlsdGVyIGZpbHRlciwgT2JqZWN0IGhhbmRiYWNrKSB0aHJvd3MgTGlzdGVuZXJOb3RGb3VuZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKCFza2lwTm90aWZpY2F0aW9uTGlzdGVuZXJzKQorICAgICAgICAgICAgc3VwZXIucmVtb3ZlTm90aWZpY2F0aW9uTGlzdGVuZXIobGlzdGVuZXIsIGZpbHRlciwgaGFuZGJhY2spOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZE5vdGlmaWNhdGlvbkxpc3RlbmVyKE5vdGlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkZpbHRlciBmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGhhbmRiYWNrKSB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKCFza2lwTm90aWZpY2F0aW9uTGlzdGVuZXJzKQorICAgICAgICAgICAgc3VwZXIuYWRkTm90aWZpY2F0aW9uTGlzdGVuZXIobGlzdGVuZXIsIGZpbHRlciwgaGFuZGJhY2spOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RvcmFnZVNlcnZpY2VNQmVhbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdG9yYWdlU2VydmljZU1CZWFuLmphdmEKaW5kZXggYWMyZmY2OC4uNTg5N2FmYyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdG9yYWdlU2VydmljZU1CZWFuLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdG9yYWdlU2VydmljZU1CZWFuLmphdmEKQEAgLTEwMyw2ICsxMDMsMTIgQEAKICAgICBwdWJsaWMgU3RyaW5nIGdldFJlbGVhc2VWZXJzaW9uKCk7CiAKICAgICAvKioKKyAgICAgKiBGZXRjaCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgQ2Fzc2FuZHJhIGdpdCBTSEEuCisgICAgICogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgQ2Fzc2FuZHJhIGdpdCBTSEEuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRHaXRTSEEoKTsKKworICAgIC8qKgogICAgICAqIEZldGNoIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IFNjaGVtYSB2ZXJzaW9uLgogICAgICAqIEByZXR1cm4gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFNjaGVtYSB2ZXJzaW9uLgogICAgICAqLwpAQCAtMjA5LDYgKzIxNSw5IEBACiAgICAgLyoqIEh1bWFuLXJlYWRhYmxlIGxvYWQgdmFsdWUgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldExvYWRTdHJpbmcoKTsKIAorICAgIC8qKiBIdW1hbi1yZWFkYWJsZSB1bmNvbXByZXNzZWQgbG9hZCB2YWx1ZSAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5jb21wcmVzc2VkTG9hZFN0cmluZygpOworCiAgICAgLyoqIEh1bWFuLXJlYWRhYmxlIGxvYWQgdmFsdWUuICBLZXlzIGFyZSBJUCBhZGRyZXNzZXMuICovCiAgICAgQERlcHJlY2F0ZWQgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0TG9hZE1hcCgpOwogICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldExvYWRNYXBXaXRoUG9ydCgpOwpAQCAtMjY3LDEwICsyNzYsMjQgQEAKICAgICAvKioKICAgICAgKiBSZW1vdmUgdGhlIHNuYXBzaG90IHdpdGggdGhlIGdpdmVuIG5hbWUgZnJvbSB0aGUgZ2l2ZW4ga2V5c3BhY2VzLgogICAgICAqIElmIG5vIHRhZyBpcyBzcGVjaWZpZWQgd2Ugd2lsbCByZW1vdmUgYWxsIHNuYXBzaG90cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWcgbmFtZSBvZiBzbmFwc2hvdCB0byBjbGVhciwgaWYgbnVsbCBvciBlbXB0eSBzdHJpbmcsIGFsbCBzbmFwc2hvdHMgb2YgZ2l2ZW4ga2V5c3BhY2Ugd2lsbCBiZSBjbGVhcmVkCisgICAgICogQHBhcmFtIGtleXNwYWNlTmFtZXMgbmFtZSBvZiBrZXlzcGFjZXMgdG8gY2xlYXIgc25hcHNob3RzIGZvcgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgY2xlYXJTbmFwc2hvdChTdHJpbmcgdGFnLCBTdHJpbmcuLi4ga2V5c3BhY2VOYW1lcykgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzbmFwc2hvdCB3aXRoIHRoZSBnaXZlbiBuYW1lIGZyb20gdGhlIGdpdmVuIGtleXNwYWNlcy4KKyAgICAgKiBJZiBubyB0YWcgaXMgc3BlY2lmaWVkIHdlIHdpbGwgcmVtb3ZlIGFsbCBzbmFwc2hvdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBtYXAgb2Ygb3B0aW9ucyBmb3IgY2xlYW51cCBvcGVyYXRpb24sIGNvbnN1bHQgbm9kZXRvb2wncyBDbGVhclNuYXBzaG90CisgICAgICogQHBhcmFtIHRhZyBuYW1lIG9mIHNuYXBzaG90IHRvIGNsZWFyLCBpZiBudWxsIG9yIGVtcHR5IHN0cmluZywgYWxsIHNuYXBzaG90cyBvZiBnaXZlbiBrZXlzcGFjZSB3aWxsIGJlIGNsZWFyZWQKKyAgICAgKiBAcGFyYW0ga2V5c3BhY2VOYW1lcyBuYW1lIG9mIGtleXNwYWNlcyB0byBjbGVhciBzbmFwc2hvdHMgZm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJTbmFwc2hvdChNYXA8U3RyaW5nLCBPYmplY3Q+IG9wdGlvbnMsIFN0cmluZyB0YWcsIFN0cmluZy4uLiBrZXlzcGFjZU5hbWVzKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKICAgICAgKiBHZXQgdGhlIGRldGFpbHMgb2YgYWxsIHRoZSBzbmFwc2hvdAogICAgICAqIEByZXR1cm4gQSBtYXAgb2Ygc25hcHNob3ROYW1lIHRvIGFsbCBpdHMgZGV0YWlscyBpbiBUYWJ1bGFyIGZvcm0uCiAgICAgICovCkBAIC0zNDIsNiArMzY1LDEzIEBACiAgICAgcHVibGljIHZvaWQgZm9yY2VLZXlzcGFjZUNvbXBhY3Rpb25Gb3JQYXJ0aXRpb25LZXkoU3RyaW5nIGtleXNwYWNlTmFtZSwgU3RyaW5nIHBhcnRpdGlvbktleSwgU3RyaW5nLi4uIHRhYmxlTmFtZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKIAogICAgIC8qKgorICAgICAqIEZvcmNlcyBjb21wYWN0aW9uIGZvciBhIGxpc3Qgb2YgcGFydGl0aW9uIGtleXMgb24gYSB0YWJsZS4KKyAgICAgKiBUaGUgbWV0aG9kIHdpbGwgaWdub3JlIHRoZSBnY19ncmFjZV9zZWNvbmRzIGZvciB0aGUgcGFydGl0aW9uS2V5c0lnbm9yZUdjR3JhY2UgZHVyaW5nIHRoZSBjb21hcGN0aW9uLAorICAgICAqIGluIG9yZGVyIHRvIHB1cmdlIHRoZSB0b21ic3RvbmVzIGFuZCBmcmVlIHVwIHNwYWNlIHF1aWNrZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZm9yY2VDb21wYWN0aW9uS2V5c0lnbm9yaW5nR2NHcmFjZShTdHJpbmcga2V5c3BhY2VOYW1lLCBTdHJpbmcgdGFibGVOYW1lLCBTdHJpbmcuLi4gcGFydGl0aW9uS2V5c0lnbm9yZUdjR3JhY2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKKworICAgIC8qKgogICAgICAqIFRyaWdnZXIgYSBjbGVhbnVwIG9mIGtleXMgb24gYSBzaW5nbGUga2V5c3BhY2UKICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtMzU1LDExICszODUsMjIgQEAKICAgICAgKiBTY3J1YmJlZCBDRnMgd2lsbCBiZSBzbmFwc2hvdHRlZCBmaXJzdCwgaWYgZGlzYWJsZVNuYXBzaG90IGlzIGZhbHNlCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgaW50IHNjcnViKGJvb2xlYW4gZGlzYWJsZVNuYXBzaG90LCBib29sZWFuIHNraXBDb3JydXB0ZWQsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZy4uLiB0YWJsZU5hbWVzKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb247CisgICAgZGVmYXVsdCBpbnQgc2NydWIoYm9vbGVhbiBkaXNhYmxlU25hcHNob3QsIGJvb2xlYW4gc2tpcENvcnJ1cHRlZCwgU3RyaW5nIGtleXNwYWNlTmFtZSwgU3RyaW5nLi4uIHRhYmxlTmFtZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIHNjcnViKGRpc2FibGVTbmFwc2hvdCwgc2tpcENvcnJ1cHRlZCwgdHJ1ZSwga2V5c3BhY2VOYW1lLCB0YWJsZU5hbWVzKTsKKyAgICB9CisKICAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBpbnQgc2NydWIoYm9vbGVhbiBkaXNhYmxlU25hcHNob3QsIGJvb2xlYW4gc2tpcENvcnJ1cHRlZCwgYm9vbGVhbiBjaGVja0RhdGEsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZy4uLiB0YWJsZU5hbWVzKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb247CisgICAgZGVmYXVsdCBpbnQgc2NydWIoYm9vbGVhbiBkaXNhYmxlU25hcHNob3QsIGJvb2xlYW4gc2tpcENvcnJ1cHRlZCwgYm9vbGVhbiBjaGVja0RhdGEsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZy4uLiB0YWJsZU5hbWVzKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBzY3J1YihkaXNhYmxlU25hcHNob3QsIHNraXBDb3JydXB0ZWQsIGNoZWNrRGF0YSwgMCwga2V5c3BhY2VOYW1lLCB0YWJsZU5hbWVzKTsKKyAgICB9CisKICAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBpbnQgc2NydWIoYm9vbGVhbiBkaXNhYmxlU25hcHNob3QsIGJvb2xlYW4gc2tpcENvcnJ1cHRlZCwgYm9vbGVhbiBjaGVja0RhdGEsIGludCBqb2JzLCBTdHJpbmcga2V5c3BhY2VOYW1lLCBTdHJpbmcuLi4gY29sdW1uRmFtaWxpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKKyAgICBkZWZhdWx0IGludCBzY3J1Yihib29sZWFuIGRpc2FibGVTbmFwc2hvdCwgYm9vbGVhbiBza2lwQ29ycnVwdGVkLCBib29sZWFuIGNoZWNrRGF0YSwgaW50IGpvYnMsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZy4uLiBjb2x1bW5GYW1pbGllcykgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gc2NydWIoZGlzYWJsZVNuYXBzaG90LCBza2lwQ29ycnVwdGVkLCBjaGVja0RhdGEsIGZhbHNlLCBqb2JzLCBrZXlzcGFjZU5hbWUsIGNvbHVtbkZhbWlsaWVzKTsKKyAgICB9CiAKICAgICBwdWJsaWMgaW50IHNjcnViKGJvb2xlYW4gZGlzYWJsZVNuYXBzaG90LCBib29sZWFuIHNraXBDb3JydXB0ZWQsIGJvb2xlYW4gY2hlY2tEYXRhLCBib29sZWFuIHJlaW5zZXJ0T3ZlcmZsb3dlZFRUTCwgaW50IGpvYnMsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZy4uLiBjb2x1bW5GYW1pbGllcykgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uOwogCkBAIC00MTcsMTAgKzQ1OCwyMiBAQAogCiAgICAgcHVibGljIHZvaWQgZm9yY2VUZXJtaW5hdGVBbGxSZXBhaXJTZXNzaW9ucygpOwogCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHNldFJlcGFpclNlc3Npb25NYXhpbXVtVHJlZURlcHRoIGluc3RlYWQgYXMgaXQgd2lsbCBub3QgdGhyb3cgbm9uLXN0YW5kYXJkIGV4Y2VwdGlvbnMKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHNldFJlcGFpclNlc3Npb25NYXhUcmVlRGVwdGgoaW50IGRlcHRoKTsKIAorICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHVzZSBnZXRSZXBhaXJTZXNzaW9uTWF4aW11bVRyZWVEZXB0aCBpbnN0ZWFkCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgaW50IGdldFJlcGFpclNlc3Npb25NYXhUcmVlRGVwdGgoKTsKIAorICAgIHB1YmxpYyB2b2lkIHNldFJlcGFpclNlc3Npb25NYXhpbXVtVHJlZURlcHRoKGludCBkZXB0aCk7CisKKyAgICBwdWJsaWMgaW50IGdldFJlcGFpclNlc3Npb25NYXhpbXVtVHJlZURlcHRoKCk7CisKICAgICAvKioKICAgICAgKiBHZXQgdGhlIHN0YXR1cyBvZiBhIGdpdmVuIHBhcmVudCByZXBhaXIgc2Vzc2lvbi4KICAgICAgKiBAcGFyYW0gY21kIHRoZSBpbnQgcmVmZXJlbmNlIHJldHVybmVkIHdoZW4gaXNzdWluZyB0aGUgcmVwYWlyCkBAIC03NDAsOSArNzkzLDIzIEBACiAgICAgICogQHBhcmFtIGtleXNwYWNlIE5hbWUgb2YgdGhlIGtleXNwYWNlIHdoaWNoIHRvIHJlYnVpbGQgb3IgbnVsbCB0byByZWJ1aWxkIGFsbCBrZXlzcGFjZXMuCiAgICAgICogQHBhcmFtIHRva2VucyBSYW5nZSBvZiB0b2tlbnMgdG8gcmVidWlsZCBvciBudWxsIHRvIHJlYnVpbGQgYWxsIHRva2VuIHJhbmdlcy4gSW4gdGhlIGZvcm1hdCBvZjoKICAgICAgKiAgICAgICAgICAgICAgICIoc3RhcnRfdG9rZW5fMSxlbmRfdG9rZW5fMV0sKHN0YXJ0X3Rva2VuXzIsZW5kX3Rva2VuXzJdLC4uLihzdGFydF90b2tlbl9uLGVuZF90b2tlbl9uXSIKKyAgICAgKiBAcGFyYW0gc3BlY2lmaWNTb3VyY2VzIGxpc3Qgb2Ygc291cmNlcyB0aGF0IGNhbiBiZSB1c2VkIGZvciByZWJ1aWxkaW5nLiBNdXN0IGJlIG90aGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZvcm1hdCBvZiB0aGUgc3RyaW5nIGlzIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVidWlsZChTdHJpbmcgc291cmNlRGMsIFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRva2VucywgU3RyaW5nIHNwZWNpZmljU291cmNlcyk7CiAKKyAgICAvKioKKyAgICAqIFNhbWUgYXMge0BsaW5rICNyZWJ1aWxkKFN0cmluZyl9LCBidXQgb25seSBmb3Igc3BlY2lmaWVkIGtleXNwYWNlIGFuZCByYW5nZXMuIEl0IGV4Y2x1ZGVzIGxvY2FsIGRhdGEgY2VudGVyIG5vZGVzCisgICAgKgorICAgICogQHBhcmFtIHNvdXJjZURjIE5hbWUgb2YgREMgZnJvbSB3aGljaCB0byBzZWxlY3Qgc291cmNlcyBmb3Igc3RyZWFtaW5nIG9yIG51bGwgdG8gcGljayBhbnkgbm9kZQorICAgICogQHBhcmFtIGtleXNwYWNlIE5hbWUgb2YgdGhlIGtleXNwYWNlIHdoaWNoIHRvIHJlYnVpbGQgb3IgbnVsbCB0byByZWJ1aWxkIGFsbCBrZXlzcGFjZXMuCisgICAgKiBAcGFyYW0gdG9rZW5zIFJhbmdlIG9mIHRva2VucyB0byByZWJ1aWxkIG9yIG51bGwgdG8gcmVidWlsZCBhbGwgdG9rZW4gcmFuZ2VzLiBJbiB0aGUgZm9ybWF0IG9mOgorICAgICogICAgICAgICAgICAgICAiKHN0YXJ0X3Rva2VuXzEsZW5kX3Rva2VuXzFdLChzdGFydF90b2tlbl8yLGVuZF90b2tlbl8yXSwuLi4oc3RhcnRfdG9rZW5fbixlbmRfdG9rZW5fbl0iCisgICAgKiBAcGFyYW0gc3BlY2lmaWNTb3VyY2VzIGxpc3Qgb2Ygc291cmNlcyB0aGF0IGNhbiBiZSB1c2VkIGZvciByZWJ1aWxkaW5nLiBNb3N0bHkgb3RoZXIgbm9kZXMgaW4gdGhlIGNsdXN0ZXIuCisgICAgKiBAcGFyYW0gZXhjbHVkZUxvY2FsRGF0YWNlbnRlck5vZGVzIEZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBsb2NhbCBkYXRhIGNlbnRlciBub2RlcyBzaG91bGQgYmUgZXhjbHVkZWQgYXMgc291cmNlcyBmb3Igc3RyZWFtaW5nLgorICAgICovCisgICAgcHVibGljIHZvaWQgcmVidWlsZChTdHJpbmcgc291cmNlRGMsIFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRva2VucywgU3RyaW5nIHNwZWNpZmljU291cmNlcywgYm9vbGVhbiBleGNsdWRlTG9jYWxEYXRhY2VudGVyTm9kZXMpOworCiAgICAgLyoqIFN0YXJ0cyBhIGJ1bGsgbG9hZCBhbmQgYmxvY2tzIHVudGlsIGl0IGNvbXBsZXRlcy4gKi8KICAgICBwdWJsaWMgdm9pZCBidWxrTG9hZChTdHJpbmcgZGlyZWN0b3J5KTsKIApAQCAtNzk1LDYgKzg2MiwzNiBAQAogCiAgICAgcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8Q29tcG9zaXRlRGF0YT4+IHNhbXBsZVBhcnRpdGlvbnMoaW50IGR1cmF0aW9uLCBpbnQgY2FwYWNpdHksIGludCBjb3VudCwgTGlzdDxTdHJpbmc+IHNhbXBsZXJzKSB0aHJvd3MgT3BlbkRhdGFFeGNlcHRpb247CiAKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxDb21wb3NpdGVEYXRhPj4gc2FtcGxlUGFydGl0aW9ucyhTdHJpbmcga2V5c3BhY2UsIGludCBkdXJhdGlvbiwgaW50IGNhcGFjaXR5LCBpbnQgY291bnQsIExpc3Q8U3RyaW5nPiBzYW1wbGVycykgdGhyb3dzIE9wZW5EYXRhRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU3RhcnQgYSBzY2hlZHVsZWQgc2FtcGxpbmcKKyAgICAgKiBAcGFyYW0ga3MgS2V5c3BhY2UuIE51bGxhYmxlLiBJZiBudWxsLCB0aGUgc2NoZWR1bGVkIHNhbXBsaW5nIGlzIG9uIGFsbCBrZXlzcGFjZXMgYW5kIHRhYmxlcworICAgICAqIEBwYXJhbSB0YWJsZSBOdWxsYWJsZS4gSWYgbnVsbCwgdGhlIHNjaGVkdWxlZCBzYW1wbGluZyBpcyBvbiBhbGwgdGFibGVzIG9mIHRoZSBzcGVjaWZpZWQga2V5c3BhY2UKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gRHVyYXRpb24gb2YgZWFjaCBzY2hlZHVsZWQgc2FtcGxpbmcgam9iIGluIG1pbGxpc2Vjb25kcworICAgICAqIEBwYXJhbSBpbnRlcnZhbCBJbnRlcnZhbCBvZiBlYWNoIHNjaGVkdWxlZCBzYW1wbGluZyBqb2IgaW4gbWlsbGlzZWNvbmRzCisgICAgICogQHBhcmFtIGNhcGFjaXR5IENhcGFjaXR5IG9mIHRoZSBzYW1wbGVyLCBoaWdoZXIgZm9yIG1vcmUgYWNjdXJhY3kKKyAgICAgKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHRoZSB0b3Agc2FtcGxlcyB0byBsaXN0CisgICAgICogQHBhcmFtIHNhbXBsZXJzIGEgbGlzdCBvZiBzYW1wbGVycyB0byBlbmFibGUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNjaGVkdWxlZCBzYW1wbGluZyBpcyBzdGFydGVkIHN1Y2Nlc3NmdWxseS4gT3RoZXJ3aXNlIHJldHVybiBmYWxzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0U2FtcGxpbmdQYXJ0aXRpb25zKFN0cmluZyBrcywgU3RyaW5nIHRhYmxlLCBpbnQgZHVyYXRpb24sIGludCBpbnRlcnZhbCwgaW50IGNhcGFjaXR5LCBpbnQgY291bnQsIExpc3Q8U3RyaW5nPiBzYW1wbGVycykgdGhyb3dzIE9wZW5EYXRhRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU3RvcCBhIHNjaGVkdWxlZCBzYW1wbGluZworICAgICAqIEBwYXJhbSBrcyBLZXlzcGFjZS4gTnVsbGFibGUuIElmIG51bGwsIHRoZSBzY2hlZHVsZWQgc2FtcGxpbmcgaXMgb24gYWxsIGtleXNhcGNlcyBhbmQgdGFibGVzCisgICAgICogQHBhcmFtIHRhYmxlIE51bGxhYmxlLiBJZiBudWxsLCB0aGUgc2NoZWR1bGVkIHNhbXBsaW5nIGlzIG9uIGFsbCB0YWJsZXMgb2YgdGhlIHNwZWNpZmllZCBrZXlzcGFjZQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc2NoZWR1bGVkIHNhbXBsaW5nIGlzIHN0b3BwZWQuIEZhbHNlIGlzIHJldHVybmVkIGlmIHRoZSBzYW1wbGluZyB0YXNrIGlzIG5vdCBmb3VuZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN0b3BTYW1wbGluZ1BhcnRpdGlvbnMoU3RyaW5nIGtzLCBTdHJpbmcgdGFibGUpIHRocm93cyBPcGVuRGF0YUV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHF1YWxpZmllZCB0YWJsZSBuYW1lcyB0aGF0IGhhdmUgYWN0aXZlIHNjaGVkdWxlZCBzYW1wbGluZyB0YXNrcy4gVGhlIGZvcm1hdCBvZiB0aGUgbmFtZSBpcyBgS0VZU1BBQ0UuVEFCTEVgCisgICAgICogVGhlIHdpbGQgY2FyZCBzeW1ib2wgKCopIGluZGljYXRlcyBhbGwga2V5c3BhY2UvdGFibGUuIEZvciBleGFtcGxlLCAiKi4qIiBpbmRpY2F0ZXMgYWxsIHRhYmxlcyBpbiBhbGwga2V5c3BhY2VzLiAiZm9vLioiIGluZGljYXRlcworICAgICAqIGFsbCB0YWJsZXMgdW5kZXIga2V5c3BhY2UgJ2ZvbycuICJmb28uYmFyIiBpbmRpY2F0ZXMgdGhlIHNjaGVkdWxlZCBzYW1wbGluZyBpcyBlbmFibGVkIGZvciB0aGUgdGFibGUgJ2JhcicKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFNhbXBsZVRhc2tzKCk7CisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmVkIHRyYWNpbmcgcHJvYmFiaWxpdHkuCiAgICAgICovCkBAIC04MzMsMjkgKzkzMCw3NCBAQAogICAgIC8qKiBTZXRzIHRoZSBudW1iZXIgb2Ygcm93cyBjYWNoZWQgYXQgdGhlIGNvb3JkaW5hdG9yIGJlZm9yZSBmaWx0ZXJpbmcvaW5kZXggcXVlcmllcyBmYWlsIG91dHJpZ2h0LiAqLwogICAgIHB1YmxpYyB2b2lkIHNldENhY2hlZFJlcGxpY2FSb3dzRmFpbFRocmVzaG9sZChpbnQgdGhyZXNob2xkKTsKIAotICAgIC8qKiBSZXR1cm5zIHRoZSBncmFudWxhcml0eSBvZiB0aGUgY29sbGF0aW9uIGluZGV4IG9mIHJvd3Mgd2l0aGluIGEgcGFydGl0aW9uICoqLworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGdyYW51bGFyaXR5IG9mIHRoZSBjb2xsYXRpb24gaW5kZXggb2Ygcm93cyB3aXRoaW4gYSBwYXJ0aXRpb24uCisgICAgICogLTEgc3RhbmRzIGZvciB0aGUgU1NUYWJsZSBmb3JtYXQncyBkZWZhdWx0LgorICAgICAqKi8KICAgICBwdWJsaWMgaW50IGdldENvbHVtbkluZGV4U2l6ZUluS2lCKCk7Ci0gICAgLyoqIFNldHMgdGhlIGdyYW51bGFyaXR5IG9mIHRoZSBjb2xsYXRpb24gaW5kZXggb2Ygcm93cyB3aXRoaW4gYSBwYXJ0aXRpb24gKiovCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBncmFudWxhcml0eSBvZiB0aGUgY29sbGF0aW9uIGluZGV4IG9mIHJvd3Mgd2l0aGluIGEgcGFydGl0aW9uLgorICAgICAqIFVzZSAtMSB0byBzZWxlY3QgdGhlIFNTVGFibGUgZm9ybWF0J3MgZGVmYXVsdC4KKyAgICAgKiovCisgICAgcHVibGljIHZvaWQgc2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoaW50IGNvbHVtbkluZGV4U2l6ZUluS2lCKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGdyYW51bGFyaXR5IG9mIHRoZSBjb2xsYXRpb24gaW5kZXggb2Ygcm93cyB3aXRoaW4gYSBwYXJ0aXRpb24KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Ugc2V0Q29sdW1uSW5kZXhTaXplSW5LaUIgaW5zdGVhZCBhcyBpdCB3aWxsIG5vdCB0aHJvdyBub24tc3RhbmRhcmQgZXhjZXB0aW9ucworICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc2V0Q29sdW1uSW5kZXhTaXplKGludCBjb2x1bW5JbmRleFNpemVJbktCKTsKIAotICAgIC8qKiBSZXR1cm5zIHRoZSB0aHJlc2hvbGQgZm9yIHNraXBwaW5nIHRoZSBjb2x1bW4gaW5kZXggd2hlbiBjYWNoaW5nIHBhcnRpdGlvbiBpbmZvICoqLworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRocmVzaG9sZCBmb3Igc2tpcHBpbmcgdGhlIGNvbHVtbiBpbmRleCB3aGVuIGNhY2hpbmcgcGFydGl0aW9uIGluZm8KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0Q29sdW1uSW5kZXhDYWNoZVNpemVJbktpQgorICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGludCBnZXRDb2x1bW5JbmRleENhY2hlU2l6ZSgpOwotICAgIC8qKiBTZXRzIHRoZSB0aHJlc2hvbGQgZm9yIHNraXBwaW5nIHRoZSBjb2x1bW4gaW5kZXggd2hlbiBjYWNoaW5nIHBhcnRpdGlvbiBpbmZvICoqLworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGhyZXNob2xkIGZvciBza2lwcGluZyB0aGUgY29sdW1uIGluZGV4IHdoZW4gY2FjaGluZyBwYXJ0aXRpb24gaW5mbworICAgICAqIEBkZXByZWNhdGVkIHVzZSBzZXRDb2x1bW5JbmRleENhY2hlU2l6ZUluS2lCIGluc3RlYWQgYXMgaXQgd2lsbCBub3QgdGhyb3cgbm9uLXN0YW5kYXJkIGV4Y2VwdGlvbnMKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbkluZGV4Q2FjaGVTaXplKGludCBjYWNoZVNpemVJbktCKTsKIAorICAgIC8qKiBSZXR1cm5zIHRoZSB0aHJlc2hvbGQgZm9yIHNraXBwaW5nIHRoZSBjb2x1bW4gaW5kZXggd2hlbiBjYWNoaW5nIHBhcnRpdGlvbiBpbmZvICoqLworICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uSW5kZXhDYWNoZVNpemVJbktpQigpOworCisgICAgLyoqIFNldHMgdGhlIHRocmVzaG9sZCBmb3Igc2tpcHBpbmcgdGhlIGNvbHVtbiBpbmRleCB3aGVuIGNhY2hpbmcgcGFydGl0aW9uIGluZm8gKiovCisgICAgcHVibGljIHZvaWQgc2V0Q29sdW1uSW5kZXhDYWNoZVNpemVJbktpQihpbnQgY2FjaGVTaXplSW5LaUIpOworCiAgICAgLyoqIFJldHVybnMgdGhlIHRocmVzaG9sZCBmb3IgcmVqZWN0aW5nIHF1ZXJpZXMgZHVlIHRvIGEgbGFyZ2UgYmF0Y2ggc2l6ZSAqLwogICAgIHB1YmxpYyBpbnQgZ2V0QmF0Y2hTaXplRmFpbHVyZVRocmVzaG9sZCgpOwogICAgIC8qKiBTZXRzIHRoZSB0aHJlc2hvbGQgZm9yIHJlamVjdGluZyBxdWVyaWVzIGR1ZSB0byBhIGxhcmdlIGJhdGNoIHNpemUgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRCYXRjaFNpemVGYWlsdXJlVGhyZXNob2xkKGludCBiYXRjaFNpemVEZWJ1Z1RocmVzaG9sZCk7CiAKLSAgICAvKiogUmV0dXJucyB0aGUgdGhyZXNob2xkIGZvciB3YXJuaW5nIHF1ZXJpZXMgZHVlIHRvIGEgbGFyZ2UgYmF0Y2ggc2l6ZSAqLworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRocmVzaG9sZCBmb3Igd2FybmluZyBxdWVyaWVzIGR1ZSB0byBhIGxhcmdlIGJhdGNoIHNpemUKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0QmF0Y2hTaXplV2FyblRocmVzaG9sZEluS2lCIGluc3RlYWQKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBpbnQgZ2V0QmF0Y2hTaXplV2FyblRocmVzaG9sZCgpOwotICAgIC8qKiBTZXRzIHRoZSB0aHJlc2hvbGQgZm9yIHdhcm5pbmcgcXVlcmllcyBkdWUgdG8gYSBsYXJnZSBiYXRjaCBzaXplICovCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGhyZXNob2xkIGZvciB3YXJuaW5nIHF1ZXJpZXMgZHVlIHRvIGEgbGFyZ2UgYmF0Y2ggc2l6ZQorICAgICAqIEBkZXByZWNhdGVkIHVzZSBzZXRCYXRjaFNpemVXYXJuVGhyZXNob2xkSW5LaUIgaW5zdGVhZCBhcyBpdCB3aWxsIG5vdCB0aHJvdyBub24tc3RhbmRhcmQgZXhjZXB0aW9ucworICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc2V0QmF0Y2hTaXplV2FyblRocmVzaG9sZChpbnQgYmF0Y2hTaXplRGVidWdUaHJlc2hvbGQpOwogCisgICAgLyoqIFJldHVybnMgdGhlIHRocmVzaG9sZCBmb3Igd2FybmluZyBxdWVyaWVzIGR1ZSB0byBhIGxhcmdlIGJhdGNoIHNpemUgKi8KKyAgICBwdWJsaWMgaW50IGdldEJhdGNoU2l6ZVdhcm5UaHJlc2hvbGRJbktpQigpOworICAgIC8qKiBTZXRzIHRoZSB0aHJlc2hvbGQgZm9yIHdhcm5pbmcgcXVlcmllcyBkdWUgdG8gYSBsYXJnZSBiYXRjaCBzaXplICoqLworICAgIHB1YmxpYyB2b2lkIHNldEJhdGNoU2l6ZVdhcm5UaHJlc2hvbGRJbktpQihpbnQgYmF0Y2hTaXplRGVidWdUaHJlc2hvbGQpOworCiAgICAgLyoqIFNldHMgdGhlIGhpbnRlZCBoYW5kb2ZmIHRocm90dGxlIGluIEtpQiBwZXIgc2Vjb25kLCBwZXIgZGVsaXZlcnkgdGhyZWFkLiAqLwogICAgIHB1YmxpYyB2b2lkIHNldEhpbnRlZEhhbmRvZmZUaHJvdHRsZUluS0IoaW50IHRocm90dGxlSW5LQik7CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRUcmFuc2ZlckhpbnRzT25EZWNvbW1pc3Npb24oKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2ZlckhpbnRzT25EZWNvbW1pc3Npb24oYm9vbGVhbiBlbmFibGVkKTsKKwogICAgIC8qKgogICAgICAqIFJlc3VtZSBib290c3RyYXAgc3RyZWFtaW5nIHdoZW4gdGhlcmUgaXMgZmFpbGVkIGRhdGEgc3RyZWFtaW5nLgogICAgICAqCkBAIC0xMDQ2LDQgKzExODgsNyBAQAogICAgIHB1YmxpYyB2b2lkIHNldE1pblRyYWNrZWRQYXJ0aXRpb25TaXplKFN0cmluZyB2YWx1ZSk7CiAgICAgcHVibGljIGxvbmcgZ2V0TWluVHJhY2tlZFBhcnRpdGlvblRvbWJzdG9uZUNvdW50KCk7CiAgICAgcHVibGljIHZvaWQgc2V0TWluVHJhY2tlZFBhcnRpdGlvblRvbWJzdG9uZUNvdW50KGxvbmcgdmFsdWUpOwotfQorCisgICAgcHVibGljIHZvaWQgc2V0U2tpcFN0cmVhbURpc2tTcGFjZUNoZWNrKGJvb2xlYW4gdmFsdWUpOworICAgIHB1YmxpYyBib29sZWFuIGdldFNraXBTdHJlYW1EaXNrU3BhY2VDaGVjaygpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvVHJ1bmNhdGVSZXNwb25zZUhhbmRsZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvVHJ1bmNhdGVSZXNwb25zZUhhbmRsZXIuamF2YQppbmRleCA5ODRiYTVhLi41NGIxMjQxIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1RydW5jYXRlUmVzcG9uc2VIYW5kbGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9UcnVuY2F0ZVJlc3BvbnNlSGFuZGxlci5qYXZhCkBAIC0xNyw3ICsxNyw5IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZTsKIAotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIApAQCAtNDYsNyArNDgsNyBAQAogICAgIHByaXZhdGUgZmluYWwgaW50IHJlc3BvbnNlQ291bnQ7CiAgICAgcHJvdGVjdGVkIGZpbmFsIEF0b21pY0ludGVnZXIgcmVzcG9uc2VzID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHN0YXJ0OwotICAgIHByaXZhdGUgdm9sYXRpbGUgSW5ldEFkZHJlc3MgdHJ1bmNhdGVGYWlsaW5nUmVwbGljYTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxJbmV0QWRkcmVzc0FuZFBvcnQsIFJlcXVlc3RGYWlsdXJlUmVhc29uPiBmYWlsdXJlUmVhc29uQnlFbmRwb2ludCA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CiAKICAgICBwdWJsaWMgVHJ1bmNhdGVSZXNwb25zZUhhbmRsZXIoaW50IHJlc3BvbnNlQ291bnQpCiAgICAgewpAQCAtNjEsMjQgKzYzLDMxIEBACiAgICAgcHVibGljIHZvaWQgZ2V0KCkgdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24KICAgICB7CiAgICAgICAgIGxvbmcgdGltZW91dE5hbm9zID0gZ2V0VHJ1bmNhdGVScGNUaW1lb3V0KE5BTk9TRUNPTkRTKSAtIChuYW5vVGltZSgpIC0gc3RhcnQpOwotICAgICAgICBib29sZWFuIGNvbXBsZXRlZEluVGltZTsKKyAgICAgICAgYm9vbGVhbiBzaWduYWxlZDsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbXBsZXRlZEluVGltZSA9IGNvbmRpdGlvbi5hd2FpdCh0aW1lb3V0TmFub3MsIE5BTk9TRUNPTkRTKTsgLy8gVE9ETyB0cnVuY2F0ZSBuZWVkcyBhIG11Y2ggbG9uZ2VyIHRpbWVvdXQKKyAgICAgICAgICAgIHNpZ25hbGVkID0gY29uZGl0aW9uLmF3YWl0KHRpbWVvdXROYW5vcywgTkFOT1NFQ09ORFMpOyAvLyBUT0RPIHRydW5jYXRlIG5lZWRzIGEgbXVjaCBsb25nZXIgdGltZW91dAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQogICAgICAgICB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgVW5jaGVja2VkSW50ZXJydXB0ZWRFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIWNvbXBsZXRlZEluVGltZSkKLSAgICAgICAgeworICAgICAgICBpZiAoIXNpZ25hbGVkKQogICAgICAgICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oIlRydW5jYXRlIHRpbWVkIG91dCAtIHJlY2VpdmVkIG9ubHkgIiArIHJlc3BvbnNlcy5nZXQoKSArICIgcmVzcG9uc2VzIik7Ci0gICAgICAgIH0KIAotICAgICAgICBpZiAodHJ1bmNhdGVGYWlsaW5nUmVwbGljYSAhPSBudWxsKQorICAgICAgICBpZiAoIWZhaWx1cmVSZWFzb25CeUVuZHBvaW50LmlzRW1wdHkoKSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRydW5jYXRlRXhjZXB0aW9uKCJUcnVuY2F0ZSBmYWlsZWQgb24gcmVwbGljYSAiICsgdHJ1bmNhdGVGYWlsaW5nUmVwbGljYSk7CisgICAgICAgICAgICAvLyBjbG9uZSB0byBtYWtlIHN1cmUgbm8gcmFjZSBjb25kaXRpb24gaGFwcGVucworICAgICAgICAgICAgTWFwPEluZXRBZGRyZXNzQW5kUG9ydCwgUmVxdWVzdEZhaWx1cmVSZWFzb24+IGZhaWx1cmVSZWFzb25CeUVuZHBvaW50ID0gbmV3IEhhc2hNYXA8Pih0aGlzLmZhaWx1cmVSZWFzb25CeUVuZHBvaW50KTsKKyAgICAgICAgICAgIGlmIChSZXF1ZXN0Q2FsbGJhY2suaXNUaW1lb3V0KGZhaWx1cmVSZWFzb25CeUVuZHBvaW50KSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbigiVHJ1bmNhdGUgdGltZWQgb3V0IC0gcmVjZWl2ZWQgb25seSAiICsgcmVzcG9uc2VzLmdldCgpICsgIiByZXNwb25zZXMiKTsKKworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJUcnVuY2F0ZSBmYWlsZWQgb24gIik7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxJbmV0QWRkcmVzc0FuZFBvcnQsIFJlcXVlc3RGYWlsdXJlUmVhc29uPiBlIDogZmFpbHVyZVJlYXNvbkJ5RW5kcG9pbnQuZW50cnlTZXQoKSkKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoInJlcGxpY2EgIikuYXBwZW5kKGUuZ2V0S2V5KCkpLmFwcGVuZCgiIC0+ICIpLmFwcGVuZChlLmdldFZhbHVlKCkpLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIHNiLnNldExlbmd0aChzYi5sZW5ndGgoKSAtIDIpOworICAgICAgICAgICAgdGhyb3cgbmV3IFRydW5jYXRlRXhjZXB0aW9uKHNiLnRvU3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC05NCw3ICsxMDMsNyBAQAogICAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZShJbmV0QWRkcmVzc0FuZFBvcnQgZnJvbSwgUmVxdWVzdEZhaWx1cmVSZWFzb24gZmFpbHVyZVJlYXNvbikKICAgICB7CiAgICAgICAgIC8vIElmIHRoZSB0cnVuY2F0aW9uIGhhc24ndCBzdWNjZWVkZWQgb24gc29tZSByZXBsaWNhLCBhYm9ydCBhbmQgaW5kaWNhdGUgdGhpcyBiYWNrIHRvIHRoZSBjbGllbnQuCi0gICAgICAgIHRydW5jYXRlRmFpbGluZ1JlcGxpY2EgPSBmcm9tLmdldEFkZHJlc3MoKTsKKyAgICAgICAgZmFpbHVyZVJlYXNvbkJ5RW5kcG9pbnQucHV0KGZyb20sIGZhaWx1cmVSZWFzb24pOwogICAgICAgICBjb25kaXRpb24uc2lnbmFsQWxsKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BhZ2VyL1BhZ2luZ1N0YXRlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BhZ2VyL1BhZ2luZ1N0YXRlLmphdmEKaW5kZXggNmUxYTUyZi4uMzY5MWQxNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYWdlci9QYWdpbmdTdGF0ZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGFnZXIvUGFnaW5nU3RhdGUuamF2YQpAQCAtMjIsNyArMjIsNiBAQAogaW1wb3J0IGphdmEudXRpbC4qOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5JbnRzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKQEAgLTEzMCw4ICsxMjksOCBAQAogICAgICAgICBEYXRhT3V0cHV0QnVmZmVyIG91dCA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyRml4ZWQobW9kZXJuU2VyaWFsaXplZFNpemUoKSk7CiAgICAgICAgIHdyaXRlV2l0aFZJbnRMZW5ndGgobnVsbCA9PSBwYXJ0aXRpb25LZXkgPyBFTVBUWV9CWVRFX0JVRkZFUiA6IHBhcnRpdGlvbktleSwgb3V0KTsKICAgICAgICAgd3JpdGVXaXRoVkludExlbmd0aChudWxsID09IHJvd01hcmsgPyBFTVBUWV9CWVRFX0JVRkZFUiA6IHJvd01hcmsubWFyaywgb3V0KTsKLSAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHJlbWFpbmluZyk7Ci0gICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChyZW1haW5pbmdJblBhcnRpdGlvbik7CisgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKHJlbWFpbmluZyk7CisgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKHJlbWFpbmluZ0luUGFydGl0aW9uKTsKICAgICAgICAgcmV0dXJuIG91dC5idWZmZXIoZmFsc2UpOwogICAgIH0KIApAQCAtMjA3LDggKzIwNiw4IEBACiAKICAgICAgICAgQnl0ZUJ1ZmZlciBwYXJ0aXRpb25LZXkgPSByZWFkV2l0aFZJbnRMZW5ndGgoaW4pOwogICAgICAgICBCeXRlQnVmZmVyIHJhd01hcmsgPSByZWFkV2l0aFZJbnRMZW5ndGgoaW4pOwotICAgICAgICBpbnQgcmVtYWluaW5nID0gSW50cy5jaGVja2VkQ2FzdChpbi5yZWFkVW5zaWduZWRWSW50KCkpOwotICAgICAgICBpbnQgcmVtYWluaW5nSW5QYXJ0aXRpb24gPSBJbnRzLmNoZWNrZWRDYXN0KGluLnJlYWRVbnNpZ25lZFZJbnQoKSk7CisgICAgICAgIGludCByZW1haW5pbmcgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKKyAgICAgICAgaW50IHJlbWFpbmluZ0luUGFydGl0aW9uID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAKICAgICAgICAgcmV0dXJuIG5ldyBQYWdpbmdTdGF0ZShwYXJ0aXRpb25LZXkuaGFzUmVtYWluaW5nKCkgPyBwYXJ0aXRpb25LZXkgOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd01hcmsuaGFzUmVtYWluaW5nKCkgPyBuZXcgUm93TWFyayhyYXdNYXJrLCBwcm90b2NvbFZlcnNpb24pIDogbnVsbCwKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvUGF4b3MuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvUGF4b3MuamF2YQppbmRleCBiZjVmOTBlLi5hY2M2MjY3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL1BheG9zLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvcy5qYXZhCkBAIC00OCw2ICs0OCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SZXBsaWNhTGF5b3V0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmVwbGljYUxheW91dC5Gb3JUb2tlbldyaXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmVwbGljYVBsYW4uRm9yUmVhZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNsaWVudFJlcXVlc3RTaXplTWV0cmljczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CkBAIC05OSw2ICsxMDAsOCBAQAogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlNYXA7CiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk5BTk9TRUNPTkRTOwogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5TRUNPTkRTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlBBWE9TX0xPR19UVExfTElORUFSSVpBQklMSVRZX1ZJT0xBVElPTlM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUEFYT1NfTU9ERVJOX1JFTEVBU0U7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWcuUGF4b3NWYXJpYW50LnYyX3dpdGhvdXRfbGluZWFyaXphYmxlX3JlYWRzX29yX3JlamVjdGVkX3dyaXRlczsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2Uub3BlbkFuZEdldFN0b3JlOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlJlcXVlc3RGYWlsdXJlUmVhc29uLlRJTUVPVVQ7CkBAIC0yMTMsOCArMjE2LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUGF4b3MuY2xhc3MpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgQ29uZmlnLlBheG9zVmFyaWFudCBQQVhPU19WQVJJQU5UID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFBheG9zVmFyaWFudCgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENhc3NhbmRyYVZlcnNpb24gTU9ERVJOX1BBWE9TX1JFTEVBU0UgPSBuZXcgQ2Fzc2FuZHJhVmVyc2lvbihTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5wYXhvcy5tb2Rlcm5fcmVsZWFzZSIsICI0LjEiKSk7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9HX1RUTF9MSU5FQVJJWkFCSUxJVFlfVklPTEFUSU9OUyA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnBheG9zLmxvZ190dGxfbGluZWFyaXphYmlsaXR5X3Zpb2xhdGlvbnMiLCAidHJ1ZSIpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDYXNzYW5kcmFWZXJzaW9uIE1PREVSTl9QQVhPU19SRUxFQVNFID0gbmV3IENhc3NhbmRyYVZlcnNpb24oUEFYT1NfTU9ERVJOX1JFTEVBU0UuZ2V0U3RyaW5nKCkpOworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIExPR19UVExfTElORUFSSVpBQklMSVRZX1ZJT0xBVElPTlMgPSBQQVhPU19MT0dfVFRMX0xJTkVBUklaQUJJTElUWV9WSU9MQVRJT05TLmdldEJvb2xlYW4oKTsKIAogICAgIHN0YXRpYyBjbGFzcyBFbGVjdG9yYXRlIGltcGxlbWVudHMgSXRlcmFibGU8SW5ldEFkZHJlc3NBbmRQb3J0PgogICAgIHsKQEAgLTcwOSw2ICs3MTIsOSBAQAogICAgICAgICAgICAgICAgICAgICAvLyBUT0RPICJ0dXJuIG51bGwgdXBkYXRlcyBpbnRvIGRlbGV0ZT8iIC0gd2hhdCBkb2VzIHRoaXMgVE9ETyBldmVuIG1lYW4/CiAgICAgICAgICAgICAgICAgICAgIFBhcnRpdGlvblVwZGF0ZSB1cGRhdGVzID0gcmVxdWVzdC5tYWtlVXBkYXRlcyhjdXJyZW50LCBjbGllbnRTdGF0ZSwgYmVnaW4uYmFsbG90KTsKIAorICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIG1ldHJpY3MgYmVmb3JlIHRyaWdnZXJzIHBvdGVudGlhbGx5IGFkZCBtdXRhdGlvbnMuCisgICAgICAgICAgICAgICAgICAgIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy5yZWNvcmRSb3dBbmRDb2x1bW5Db3VudE1ldHJpY3ModXBkYXRlcyk7CisKICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgdHJpZ2dlcnMgdG8gY2FzIHVwZGF0ZXMuIEEgY29uc2lkZXJhdGlvbiBoZXJlIGlzIHRoYXQKICAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlcnMgZW1pdCBNdXRhdGlvbnMsIGFuZCBzbyBhIGdpdmVuIHRyaWdnZXIgaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgICAgICAgICAgLy8gbWF5IGdlbmVyYXRlIG11dGF0aW9ucyBmb3IgcGFydGl0aW9ucyBvdGhlciB0aGFuIHRoZSBvbmUgdGhpcwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc0NvbW1pdC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc0NvbW1pdC5qYXZhCmluZGV4IDQzMjFmYzkuLjQzZjlkZDEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvUGF4b3NDb21taXQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL1BheG9zQ29tbWl0LmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRXhlY3V0b3JQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db25zaXN0ZW5jeUxldmVsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLk11dGF0aW9uOwpAQCAtNTcsNyArNTgsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUmVxdWVzdEhhbmRsZXIgcmVxdWVzdEhhbmRsZXIgPSBuZXcgUmVxdWVzdEhhbmRsZXIoKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUGF4b3NDb21taXQuY2xhc3MpOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBFTkFCTEVfRENfTE9DQUxfQ09NTUlUID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEuZW5hYmxlX2RjX2xvY2FsX2NvbW1pdCIsICJ0cnVlIikpOworICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gRU5BQkxFX0RDX0xPQ0FMX0NPTU1JVCA9IENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5FTkFCTEVfRENfTE9DQUxfQ09NTUlULmdldEJvb2xlYW4oKTsKIAogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRFbmFibGVEY0xvY2FsQ29tbWl0KCkKICAgICB7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL1BheG9zUmVwYWlyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL1BheG9zUmVwYWlyLmphdmEKaW5kZXggZDg4MzIzYy4uOGFlOGViZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc1JlcGFpci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvUGF4b3NSZXBhaXIuamF2YQpAQCAtNjUsNiArNjUsNyBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRXhlY3V0b3JGYWN0b3J5Lkdsb2JhbC5leGVjdXRvckZhY3Rvcnk7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUEFYT1NfUkVQQUlSX1JFVFJZX1RJTUVPVVRfSU5fTVM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU0tJUF9QQVhPU19SRVBBSVJfVkVSU0lPTl9WQUxJREFUSU9OOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlJlcXVlc3RGYWlsdXJlUmVhc29uLlVOS05PV047CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5WZXJiLlBBWE9TMl9SRVBBSVJfUkVROwogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5OQU5PU0VDT05EUzsKQEAgLTYzNCw3ICs2MzUsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBTS0lQX1ZFUlNJT05fVkFMSURBVElPTiA9IEJvb2xlYW4uZ2V0Qm9vbGVhbigiY2Fzc2FuZHJhLnNraXBfcGF4b3NfcmVwYWlyX3ZlcnNpb25fdmFsaWRhdGlvbiIpOworICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gU0tJUF9WRVJTSU9OX1ZBTElEQVRJT04gPSBTS0lQX1BBWE9TX1JFUEFJUl9WRVJTSU9OX1ZBTElEQVRJT04uZ2V0Qm9vbGVhbigpOwogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFNraXBQYXhvc1JlcGFpckNvbXBhdGliaWxpdHlDaGVjayhib29sZWFuIHYpCiAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc1JlcGFpckhpc3RvcnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvUGF4b3NSZXBhaXJIaXN0b3J5LmphdmEKaW5kZXggMTYyN2ZkYi4uZDk1NDZkNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc1JlcGFpckhpc3RvcnkuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL1BheG9zUmVwYWlySGlzdG9yeS5qYXZhCkBAIC0yOSw2ICsyOSw3IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVCdWZmZXJBY2Nlc3NvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVzVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlR1cGxlVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZ2U7CkBAIC0xODAsNyArMTgxLDcgQEAKICAgICAgICAgQmFsbG90W10gYmFsbG90TG93Qm91bmRzID0gbmV3IEJhbGxvdFt0dXBsZXMuc2l6ZSgpXTsKICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgdHVwbGVzLnNpemUoKSA7ICsraSkKICAgICAgICAgewotICAgICAgICAgICAgQnl0ZUJ1ZmZlcltdIHNwbGl0ID0gVFlQRS5zcGxpdCh0dXBsZXMuZ2V0KGkpKTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXJbXSBzcGxpdCA9IFRZUEUuc3BsaXQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCB0dXBsZXMuZ2V0KGkpKTsKICAgICAgICAgICAgIGlmIChpIDwgdG9rZW5JbmNsdXNpdmVVcHBlckJvdW5kcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgdG9rZW5JbmNsdXNpdmVVcHBlckJvdW5kc1tpXSA9IFRPS0VOX0ZBQ1RPUlkuZnJvbUJ5dGVBcnJheShzcGxpdFswXSk7CiAgICAgICAgICAgICBiYWxsb3RMb3dCb3VuZHNbaV0gPSBCYWxsb3QuZGVzZXJpYWxpemUoc3BsaXRbMV0pOwpAQCAtMzE0LDcgKzMxNSw3IEBACiAgICAgewogICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoUGF4b3NSZXBhaXJIaXN0b3J5IGhpc3RvcnksIERhdGFPdXRwdXRQbHVzIG91dCwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7Ci0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoaGlzdG9yeS5zaXplKCkpOworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoaGlzdG9yeS5zaXplKCkpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoaXN0b3J5LnNpemUoKSA7ICsraSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBUb2tlbi5zZXJpYWxpemVyLnNlcmlhbGl6ZShoaXN0b3J5LnRva2VuSW5jbHVzaXZlVXBwZXJCb3VuZFtpXSwgb3V0LCB2ZXJzaW9uKTsKQEAgLTMyNSw3ICszMjYsNyBAQAogCiAgICAgICAgIHB1YmxpYyBQYXhvc1JlcGFpckhpc3RvcnkgZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbiwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IChpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgIGludCBzaXplID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgICAgICBUb2tlbltdIHRva2VuSW5jbHVzaXZlVXBwZXJCb3VuZHMgPSBuZXcgVG9rZW5bc2l6ZV07CiAgICAgICAgICAgICBCYWxsb3RbXSBiYWxsb3RMb3dCb3VuZHMgPSBuZXcgQmFsbG90W3NpemUgKyAxXTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc1JlcXVlc3RDYWxsYmFjay5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc1JlcXVlc3RDYWxsYmFjay5qYXZhCmluZGV4IDI4MmFlYjIuLmFhZDMyYWMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvUGF4b3NSZXF1ZXN0Q2FsbGJhY2suamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL1BheG9zUmVxdWVzdENhbGxiYWNrLmphdmEKQEAgLTM3LDcgKzM3LDcgQEAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYXhvc1JlcXVlc3RDYWxsYmFjazxUPiBleHRlbmRzIEZhaWx1cmVSZWNvcmRpbmdDYWxsYmFjazxUPgogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQYXhvc1JlcXVlc3RDYWxsYmFjay5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBVU0VfU0VMRl9FWEVDVVRJT04gPSBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUEFYT1NfRVhFQ1VURV9PTl9TRUxGLmdldEJvb2xlYW4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9TRUxGX0VYRUNVVElPTiA9IENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5QQVhPU19VU0VfU0VMRl9FWEVDVVRJT04uZ2V0Qm9vbGVhbigpOwogCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25SZXNwb25zZShUIHJlc3BvbnNlLCBJbmV0QWRkcmVzc0FuZFBvcnQgZnJvbSk7CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvUGF4b3NTdGF0ZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc1N0YXRlLmphdmEKaW5kZXggZTgwMmNkMC4uMjJmMDY0ZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc1N0YXRlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc1N0YXRlLmphdmEKQEAgLTUwLDYgKzUwLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5OZW1lc2lzOwogCiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0LlNFQ09ORFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUEFYT1NfRElTQUJMRV9DT09SRElOQVRPUl9MT0NLSU5HOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwubmFub1RpbWU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWcuUGF4b3NTdGF0ZVB1cmdpbmcuZ2NfZ3JhY2U7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWcuUGF4b3NTdGF0ZVB1cmdpbmcubGVnYWN5OwpAQCAtNjYsNyArNjcsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgUGF4b3NTdGF0ZSBpbXBsZW1lbnRzIFBheG9zT3BlcmF0aW9uTG9jawogewotICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gRElTQUJMRV9DT09SRElOQVRPUl9MT0NLSU5HID0gQm9vbGVhbi5nZXRCb29sZWFuKCJjYXNzYW5kcmEucGF4b3MuZGlzYWJsZV9jb29yZGluYXRvcl9sb2NraW5nIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBESVNBQkxFX0NPT1JESU5BVE9SX0xPQ0tJTkcgPSBQQVhPU19ESVNBQkxFX0NPT1JESU5BVE9SX0xPQ0tJTkcuZ2V0Qm9vbGVhbigpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29uY3VycmVudEhhc2hNYXA8S2V5LCBQYXhvc1N0YXRlPiBBQ1RJVkUgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPEtleSwgU25hcHNob3Q+IFJFQ0VOVCA9IENhZmZlaW5lLm5ld0J1aWxkZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heGltdW1XZWlnaHQoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFBheG9zQ2FjaGVTaXplSW5NaUIoKSA8PCAyMCkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvY2xlYW51cC9QYXhvc0NsZWFudXBTZXNzaW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL2NsZWFudXAvUGF4b3NDbGVhbnVwU2Vzc2lvbi5qYXZhCmluZGV4IDNkNzY1ZWEuLjVmMWVlYTYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvY2xlYW51cC9QYXhvc0NsZWFudXBTZXNzaW9uLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9jbGVhbnVwL1BheG9zQ2xlYW51cFNlc3Npb24uamF2YQpAQCAtNDMsNiArNDMsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuQXN5bmNGdXR1cmU7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5QQVhPU19DTEVBTlVQX1NFU1NJT05fVElNRU9VVF9TRUNPTkRTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuVmVyYi5QQVhPUzJfQ0xFQU5VUF9SRVE7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKIApAQCAtNTYsNyArNTcsNyBAQAogICAgIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfTkFOT1M7CiAgICAgc3RhdGljCiAgICAgewotICAgICAgICBsb25nIHRpbWVvdXRTZWNvbmRzID0gSW50ZWdlci5nZXRJbnRlZ2VyKCJjYXNzYW5kcmEucGF4b3NfY2xlYW51cF9zZXNzaW9uX3RpbWVvdXRfc2Vjb25kcyIsIChpbnQpIFRpbWVVbml0LkhPVVJTLnRvU2Vjb25kcygyKSk7CisgICAgICAgIGxvbmcgdGltZW91dFNlY29uZHMgPSBQQVhPU19DTEVBTlVQX1NFU1NJT05fVElNRU9VVF9TRUNPTkRTLmdldExvbmcoKTsKICAgICAgICAgVElNRU9VVF9OQU5PUyA9IFRpbWVVbml0LlNFQ09ORFMudG9OYW5vcyh0aW1lb3V0U2Vjb25kcyk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL3VuY29tbWl0dGVkL1BheG9zU3RhdGVUcmFja2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL3VuY29tbWl0dGVkL1BheG9zU3RhdGVUcmFja2VyLmphdmEKaW5kZXggZDM1OTRiMy4uNTE0Y2UxNSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy91bmNvbW1pdHRlZC9QYXhvc1N0YXRlVHJhY2tlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvdW5jb21taXR0ZWQvUGF4b3NTdGF0ZVRyYWNrZXIuamF2YQpAQCAtNTMsNiArNTMsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb3NlYWJsZUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRk9SQ0VfUEFYT1NfU1RBVEVfUkVCVUlMRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TS0lQX1BBWE9TX1NUQVRFX1JFQlVJTEQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVFJVTkNBVEVfQkFMTE9UX01FVEFEQVRBOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TeXN0ZW1LZXlzcGFjZS5QQVhPU19SRVBBSVJfSElTVE9SWTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50cy5TWVNURU1fS0VZU1BBQ0VfTkFNRTsKIApAQCAtNjMsMjcgKzY2LDIzIEBACiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFBheG9zU3RhdGVUcmFja2VyLmNsYXNzKTsKIAotICAgIC8vIHdoZW4gc3RhcnRpbmcgd2l0aCBubyBkYXRhLCBza2lwIHJlYnVpbGRpbmcgdW5jb21taXR0ZWQgZGF0YSBmcm9tIHRoZSBwYXhvcyB0YWJsZQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUF9SRUJVSUxEX1BST1AgPSAiY2Fzc2FuZHJhLnNraXBfcGF4b3Nfc3RhdGVfcmVidWlsZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JDRV9SRUJVSUxEX1BST1AgPSAiY2Fzc2FuZHJhLmZvcmNlX3BheG9zX3N0YXRlX3JlYnVpbGQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVTkNBVEVfQkFMTE9UX01FVEFEQVRBX1BST1AgPSAiY2Fzc2FuZHJhLnRydW5jYXRlX2JhbGxvdF9tZXRhZGF0YSI7Ci0KKyAgICAvKiogd2hlbiBzdGFydGluZyB3aXRoIG5vIGRhdGEsIHNraXAgcmVidWlsZGluZyB1bmNvbW1pdHRlZCBkYXRhIGZyb20gdGhlIHBheG9zIHRhYmxlLiAqLwogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2tpcFJlYnVpbGQoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIEJvb2xlYW4uZ2V0Qm9vbGVhbihTS0lQX1JFQlVJTERfUFJPUCk7CisgICAgICAgIHJldHVybiBTS0lQX1BBWE9TX1NUQVRFX1JFQlVJTEQuZ2V0Qm9vbGVhbigpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZm9yY2VSZWJ1aWxkKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBCb29sZWFuLmdldEJvb2xlYW4oRk9SQ0VfUkVCVUlMRF9QUk9QKTsKKyAgICAgICAgcmV0dXJuIEZPUkNFX1BBWE9TX1NUQVRFX1JFQlVJTEQuZ2V0Qm9vbGVhbigpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHJ1bmNhdGVCYWxsb3RNZXRhZGF0YSgpCiAgICAgewotICAgICAgICByZXR1cm4gQm9vbGVhbi5nZXRCb29sZWFuKFRSVU5DQVRFX0JBTExPVF9NRVRBREFUQV9QUk9QKTsKKyAgICAgICAgcmV0dXJuIFRSVU5DQVRFX0JBTExPVF9NRVRBREFUQS5nZXRCb29sZWFuKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJUkVDVE9SWSA9ICJzeXN0ZW0vX3BheG9zX3JlcGFpcl9zdGF0ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJUkVDVE9SWSA9ICJzeXN0ZW0vIiArIFN5c3RlbUtleXNwYWNlLlBBWE9TX1JFUEFJUl9TVEFURTsKIAogICAgIHByaXZhdGUgZmluYWwgUGF4b3NVbmNvbW1pdHRlZFRyYWNrZXIgdW5jb21taXR0ZWQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBQYXhvc0JhbGxvdFRyYWNrZXIgYmFsbG90czsKQEAgLTEzMCw4ICsxMjksOCBAQAogICAgICAgICBib29sZWFuIHJlYnVpbGROZWVkZWQgPSAhaGFzRXhpc3RpbmdEYXRhIHx8IGZvcmNlUmVidWlsZCgpOwogCiAgICAgICAgIGlmICh0cnVuY2F0ZUJhbGxvdE1ldGFkYXRhKCkgJiYgIXJlYnVpbGROZWVkZWQpCi0gICAgICAgICAgICBsb2dnZXIud2Fybigie30gd2FzIHNldCwgYnV0IHt9IHdhcyBub3QgYW5kIG5vIHJlYnVpbGQgaXMgcmVxdWlyZWQuIEJhbGxvdCBkYXRhIHdpbGwgbm90IGJlIHRydW5jYXRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBUUlVOQ0FURV9CQUxMT1RfTUVUQURBVEFfUFJPUCwgRk9SQ0VfUkVCVUlMRF9QUk9QKTsKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCJ7fSB3YXMgc2V0IHRvIHRydWUsIGJ1dCB7fSB3YXMgbm90IGFuZCBubyByZWJ1aWxkIGlzIHJlcXVpcmVkLiBCYWxsb3QgZGF0YSB3aWxsIG5vdCBiZSB0cnVuY2F0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgVFJVTkNBVEVfQkFMTE9UX01FVEFEQVRBLmdldEtleSgpLCBGT1JDRV9QQVhPU19TVEFURV9SRUJVSUxELmdldEtleSgpKTsKIAogICAgICAgICBpZiAocmVidWlsZE5lZWRlZCkKICAgICAgICAgewpAQCAtMTY0LDcgKzE2Myw3IEBACiAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKICAgICBwcml2YXRlIHZvaWQgcmVidWlsZFVuY29tbWl0dGVkRGF0YSgpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgbG9nZ2VyLmluZm8oIkJlZ2lubmluZyB1bmNvbW1pdHRlZCBwYXhvcyBkYXRhIHJlYnVpbGQuIFNldCAtRGNhc3NhbmRyYS5za2lwX3BheG9zX3N0YXRlX3JlYnVpbGQ9dHJ1ZSBhbmQgcmVzdGFydCB0byBza2lwIik7CisgICAgICAgIGxvZ2dlci5pbmZvKCJCZWdpbm5pbmcgdW5jb21taXR0ZWQgcGF4b3MgZGF0YSByZWJ1aWxkLiBTZXQgLUR7fT10cnVlIGFuZCByZXN0YXJ0IHRvIHNraXAiLCBTS0lQX1BBWE9TX1NUQVRFX1JFQlVJTEQuZ2V0S2V5KCkpOwogCiAgICAgICAgIFN0cmluZyBxdWVyeVN0ciA9ICJTRUxFQ1QgKiBGUk9NICIgKyBTWVNURU1fS0VZU1BBQ0VfTkFNRSArICcuJyArIFN5c3RlbUtleXNwYWNlLlBBWE9TOwogICAgICAgICBTZWxlY3RTdGF0ZW1lbnQgc3RtdCA9IChTZWxlY3RTdGF0ZW1lbnQpIFF1ZXJ5UHJvY2Vzc29yLnBhcnNlU3RhdGVtZW50KHF1ZXJ5U3RyKS5wcmVwYXJlKENsaWVudFN0YXRlLmZvckludGVybmFsQ2FsbHMoKSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL3VuY29tbWl0dGVkL1BheG9zVW5jb21taXR0ZWRJbmRleC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy91bmNvbW1pdHRlZC9QYXhvc1VuY29tbWl0dGVkSW5kZXguamF2YQppbmRleCA1ZTNiNTQwLi5iMDM3MDFkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL3VuY29tbWl0dGVkL1BheG9zVW5jb21taXR0ZWRJbmRleC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvdW5jb21taXR0ZWQvUGF4b3NVbmNvbW1pdHRlZEluZGV4LmphdmEKQEAgLTE4LDcgKzE4LDEyIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy51bmNvbW1pdHRlZDsKIAotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpRnVuY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwpAQCAtMjksMTMgKzM0LDI0IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuT3BlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EYXRhUmFuZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlbGV0aW9uVGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SYW5nZVRvbWJzdG9uZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWFkQ29tbWFuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWd1bGFyQW5kU3RhdGljQ29sdW1uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TeXN0ZW1LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Xcml0ZUNvbnRleHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuUm93RmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5WaWV3OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLk1lbXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlBhcnRpdGlvbkl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uVXBkYXRlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvdzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOwpAQCAtNDMsMTQgKzU5LDE0IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguSW5kZXg7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguSW5kZXhSZWdpc3RyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC50cmFuc2FjdGlvbnMuSW5kZXhUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZWFkc0xpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuSW5kZXhNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuSW5kZXhlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9zZWFibGVJdGVyYXRvcjsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuKjsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Q7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHMuU1lTVEVNX0tFWVNQQUNFX05BTUU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UucGF4b3MuUGF4b3NTdGF0ZS5iYWxsb3RUcmFja2VyOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLlBheG9zU3RhdGUudW5jb21taXR0ZWRUcmFja2VyOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy91bmNvbW1pdHRlZC9QYXhvc1VuY29tbWl0dGVkVHJhY2tlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy91bmNvbW1pdHRlZC9QYXhvc1VuY29tbWl0dGVkVHJhY2tlci5qYXZhCmluZGV4IDc3MTJjNzkuLmFlNDY2MmYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvdW5jb21taXR0ZWQvUGF4b3NVbmNvbW1pdHRlZFRyYWNrZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL3VuY29tbWl0dGVkL1BheG9zVW5jb21taXR0ZWRUcmFja2VyLmphdmEKQEAgLTQ5LDYgKzQ5LDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLmNsZWFudXAuUGF4b3NUYWJsZVJlcGFpcnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvc2VhYmxlSXRlcmF0b3I7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5BVVRPX1JFUEFJUl9GUkVRVUVOQ1lfU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ESVNBQkxFX1BBWE9TX0FVVE9fUkVQQUlSUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ESVNBQkxFX1BBWE9TX1NUQVRFX0ZMVVNIOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yLnBheG9zUmVwYWlyRW5hYmxlZDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy51bmNvbW1pdHRlZC5QYXhvc0tleVN0YXRlLm1lcmdlVW5jb21taXR0ZWQ7CiAKQEAgLTY5LDggKzcyLDggQEAKIAogICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIFVwZGF0ZVN1cHBsaWVyIHVwZGF0ZVN1cHBsaWVyOwogCi0gICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGF1dG9SZXBhaXJzRW5hYmxlZCA9ICFCb29sZWFuLmdldEJvb2xlYW4oImNhc3NhbmRyYS5kaXNhYmxlX3BheG9zX2F1dG9fcmVwYWlycyIpOwotICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBzdGF0ZUZsdXNoRW5hYmxlZCA9ICFCb29sZWFuLmdldEJvb2xlYW4oImNhc3NhbmRyYS5kaXNhYmxlX3BheG9zX3N0YXRlX2ZsdXNoIik7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGF1dG9SZXBhaXJzRW5hYmxlZCA9ICFESVNBQkxFX1BBWE9TX0FVVE9fUkVQQUlSUy5nZXRCb29sZWFuKCk7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHN0YXRlRmx1c2hFbmFibGVkID0gIURJU0FCTEVfUEFYT1NfU1RBVEVfRkxVU0guZ2V0Qm9vbGVhbigpOwogCiAgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gYXV0b1JlcGFpclN0YXJ0ZWQgPSBmYWxzZTsKQEAgLTMyNyw3ICszMzAsNyBAQAogICAgIHsKICAgICAgICAgaWYgKGF1dG9SZXBhaXJTdGFydGVkKQogICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpbnQgc2Vjb25kcyA9IEludGVnZXIuZ2V0SW50ZWdlcigiY2Fzc2FuZHJhLmF1dG9fcmVwYWlyX2ZyZXF1ZW5jeV9zZWNvbmRzIiwgKGludCkgVGltZVVuaXQuTUlOVVRFUy50b1NlY29uZHMoNSkpOworICAgICAgICBpbnQgc2Vjb25kcyA9IEFVVE9fUkVQQUlSX0ZSRVFVRU5DWV9TRUNPTkRTLmdldEludCgpOwogICAgICAgICBTY2hlZHVsZWRFeGVjdXRvcnMuc2NoZWR1bGVkVGFza3Muc2NoZWR1bGVBdEZpeGVkUmF0ZSh0aGlzOjptYWludGVuYW5jZSwgc2Vjb25kcywgc2Vjb25kcywgVGltZVVuaXQuU0VDT05EUyk7CiAgICAgICAgIGF1dG9SZXBhaXJTdGFydGVkID0gdHJ1ZTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3JlYWRzL1JlYWRDYWxsYmFjay5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9yZWFkcy9SZWFkQ2FsbGJhY2suamF2YQppbmRleCBlNjllNmJkLi5jMjViMWYwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3JlYWRzL1JlYWRDYWxsYmFjay5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcmVhZHMvUmVhZENhbGxiYWNrLmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnJlYWRzOwogCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKQEAgLTEyMCw2ICsxMjEsMTIgQEAKICAgICAgICAgICovCiAgICAgICAgIGludCByZWNlaXZlZCA9IHJlc29sdmVyLnJlc3BvbnNlcy5zaXplKCk7CiAgICAgICAgIGJvb2xlYW4gZmFpbGVkID0gZmFpbHVyZXMgPiAwICYmIChibG9ja0ZvciA+IHJlY2VpdmVkIHx8ICFyZXNvbHZlci5pc0RhdGFQcmVzZW50KCkpOworICAgICAgICAvLyBJZiBhbGwgbWVzc2FnZXMgY2FtZSBiYWNrIGFzIGEgVElNRU9VVCB0aGVuIHNpZ25hbGVkPXRydWUgYW5kIGZhaWxlZD10cnVlLgorICAgICAgICAvLyBOZWVkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYSB0aW1lb3V0IGFuZCBhIGZhaWx1cmUgKG5ldHdvcmssIGJhZCBkYXRhLCBldGMuKSwgc28gc3RvcmUgYW4gZXh0cmEgZmllbGQuCisgICAgICAgIC8vIHNlZSBDQVNTQU5EUkEtMTc4MjgKKyAgICAgICAgYm9vbGVhbiB0aW1lZG91dCA9ICFzaWduYWxlZDsKKyAgICAgICAgaWYgKGZhaWxlZCkKKyAgICAgICAgICAgIHRpbWVkb3V0ID0gUmVxdWVzdENhbGxiYWNrLmlzVGltZW91dChuZXcgSGFzaE1hcDw+KGZhaWx1cmVSZWFzb25CeUVuZHBvaW50KSk7CiAgICAgICAgIFdhcm5pbmdDb250ZXh0IHdhcm5pbmdzID0gd2FybmluZ0NvbnRleHQ7CiAgICAgICAgIC8vIHNhdmUgdGhlIHNuYXBzaG90IHNvIGFib3J0IHN0YXRlIGlzIG5vdCBjaGFuZ2VkIGJldHdlZW4gbm93IGFuZCB3aGVuIG1heUFib3J0IGdldHMgY2FsbGVkCiAgICAgICAgIFdhcm5pbmdzU25hcHNob3Qgc25hcHNob3QgPSBudWxsOwpAQCAtMTM4LDE5ICsxNDUsMTkgQEAKICAgICAgICAgaWYgKGlzVHJhY2luZygpKQogICAgICAgICB7CiAgICAgICAgICAgICBTdHJpbmcgZ290RGF0YSA9IHJlY2VpdmVkID4gMCA/IChyZXNvbHZlci5pc0RhdGFQcmVzZW50KCkgPyAiIChpbmNsdWRpbmcgZGF0YSkiIDogIiAob25seSBkaWdlc3RzKSIpIDogIiI7Ci0gICAgICAgICAgICBUcmFjaW5nLnRyYWNlKCJ7fTsgcmVjZWl2ZWQge30gb2Yge30gcmVzcG9uc2Vze30iLCBmYWlsZWQgPyAiRmFpbGVkIiA6ICJUaW1lZCBvdXQiLCByZWNlaXZlZCwgYmxvY2tGb3IsIGdvdERhdGEpOworICAgICAgICAgICAgVHJhY2luZy50cmFjZSgie307IHJlY2VpdmVkIHt9IG9mIHt9IHJlc3BvbnNlc3t9IiwgIXRpbWVkb3V0ID8gIkZhaWxlZCIgOiAiVGltZWQgb3V0IiwgcmVjZWl2ZWQsIGJsb2NrRm9yLCBnb3REYXRhKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKICAgICAgICAgewogICAgICAgICAgICAgU3RyaW5nIGdvdERhdGEgPSByZWNlaXZlZCA+IDAgPyAocmVzb2x2ZXIuaXNEYXRhUHJlc2VudCgpID8gIiAoaW5jbHVkaW5nIGRhdGEpIiA6ICIgKG9ubHkgZGlnZXN0cykiKSA6ICIiOwotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJ7fTsgcmVjZWl2ZWQge30gb2Yge30gcmVzcG9uc2Vze30iLCBmYWlsZWQgPyAiRmFpbGVkIiA6ICJUaW1lZCBvdXQiLCByZWNlaXZlZCwgYmxvY2tGb3IsIGdvdERhdGEpOworICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJ7fTsgcmVjZWl2ZWQge30gb2Yge30gcmVzcG9uc2Vze30iLCAhdGltZWRvdXQgPyAiRmFpbGVkIiA6ICJUaW1lZCBvdXQiLCByZWNlaXZlZCwgYmxvY2tGb3IsIGdvdERhdGEpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHNuYXBzaG90ICE9IG51bGwpCiAgICAgICAgICAgICBzbmFwc2hvdC5tYXliZUFib3J0KGNvbW1hbmQsIHJlcGxpY2FQbGFuKCkuY29uc2lzdGVuY3lMZXZlbCgpLCByZWNlaXZlZCwgYmxvY2tGb3IsIHJlc29sdmVyLmlzRGF0YVByZXNlbnQoKSwgZmFpbHVyZVJlYXNvbkJ5RW5kcG9pbnQpOwogCiAgICAgICAgIC8vIFNhbWUgYXMgZm9yIHdyaXRlcywgc2VlIEFic3RyYWN0V3JpdGVSZXNwb25zZUhhbmRsZXIKLSAgICAgICAgdGhyb3cgZmFpbGVkCisgICAgICAgIHRocm93ICF0aW1lZG91dAogICAgICAgICAgICAgPyBuZXcgUmVhZEZhaWx1cmVFeGNlcHRpb24ocmVwbGljYVBsYW4oKS5jb25zaXN0ZW5jeUxldmVsKCksIHJlY2VpdmVkLCBibG9ja0ZvciwgcmVzb2x2ZXIuaXNEYXRhUHJlc2VudCgpLCBmYWlsdXJlUmVhc29uQnlFbmRwb2ludCkKICAgICAgICAgICAgIDogbmV3IFJlYWRUaW1lb3V0RXhjZXB0aW9uKHJlcGxpY2FQbGFuKCkuY29uc2lzdGVuY3lMZXZlbCgpLCByZWNlaXZlZCwgYmxvY2tGb3IsIHJlc29sdmVyLmlzRGF0YVByZXNlbnQoKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9yZWFkcy9yYW5nZS9SYW5nZUNvbW1hbmRzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3JlYWRzL3JhbmdlL1JhbmdlQ29tbWFuZHMuamF2YQppbmRleCA1YjY1NmQ3Li4xYzVjZTdmIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3JlYWRzL3JhbmdlL1JhbmdlQ29tbWFuZHMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3JlYWRzL3JhbmdlL1JhbmdlQ29tbWFuZHMuamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29uc2lzdGVuY3lMZXZlbDsKQEAgLTQ5LDggKzUwLDcgQEAKICAgICAgKiBkb24ndCB3YW50IGEgYnVyc3Qgb2YgcmFuZ2UgcmVxdWVzdHMgdGhhdCB3aWxsIGJhY2sgdXAsIGh1cnRpbmcgYWxsIG90aGVyIHF1ZXJpZXMuIEF0IHRoZSBzYW1lIHRpbWUsCiAgICAgICogd2Ugd2FudCB0byBnaXZlIHJhbmdlIHF1ZXJpZXMgYSBjaGFuY2UgdG8gcnVuIGlmIHJlc291cmNlcyBhcmUgYXZhaWxhYmxlLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQ09OQ1VSUkVOVF9SQU5HRV9SRVFVRVNUUyA9IE1hdGgubWF4KDEsIEludGVnZXIuZ2V0SW50ZWdlcigiY2Fzc2FuZHJhLm1heF9jb25jdXJyZW50X3JhbmdlX3JlcXVlc3RzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkJVdGlsaXRpZXMuZ2V0QXZhaWxhYmxlUHJvY2Vzc29ycygpICogMTApKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NPTkNVUlJFTlRfUkFOR0VfUkVRVUVTVFMgPSBNYXRoLm1heCgxLCBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTUFYX0NPTkNVUlJFTlRfUkFOR0VfUkVRVUVTVFMuZ2V0SW50KEZCVXRpbGl0aWVzLmdldEF2YWlsYWJsZVByb2Nlc3NvcnMoKSAqIDEwKSk7CiAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBjcmVhdGVkIGl0ZXJhdG9ycyB3aWxsIGJlIGNsb3NlZCBpbiBDUUwgbGF5ZXIgdGhyb3VnaCB0aGUgY2hhaW4gb2YgdHJhbnNmb3JtYXRpb25zCiAgICAgcHVibGljIHN0YXRpYyBQYXJ0aXRpb25JdGVyYXRvciBwYXJ0aXRpb25zKFBhcnRpdGlvblJhbmdlUmVhZENvbW1hbmQgY29tbWFuZCwKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcmVhZHMvcmVwYWlyL0Jsb2NraW5nUmVhZFJlcGFpcnMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcmVhZHMvcmVwYWlyL0Jsb2NraW5nUmVhZFJlcGFpcnMuamF2YQppbmRleCA3YTQ4ODJiLi5kZTQ5ZjVhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3JlYWRzL3JlcGFpci9CbG9ja2luZ1JlYWRSZXBhaXJzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9yZWFkcy9yZXBhaXIvQmxvY2tpbmdSZWFkUmVwYWlycy5qYXZhCkBAIC0zMywxNCArMzMsMTQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFjaW5nLlRyYWNpbmc7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5EUk9QX09WRVJTSVpFRF9SRUFEX1JFUEFJUl9NVVRBVElPTlM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLklNdXRhdGlvbi5NQVhfTVVUQVRJT05fU0laRTsKIAogcHVibGljIGNsYXNzIEJsb2NraW5nUmVhZFJlcGFpcnMKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQmxvY2tpbmdSZWFkUmVwYWlycy5jbGFzcyk7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERST1BfT1ZFUlNJWkVEX1JFQURfUkVQQUlSX01VVEFUSU9OUyA9Ci0gICAgICAgIEJvb2xlYW4uZ2V0Qm9vbGVhbigiY2Fzc2FuZHJhLmRyb3Bfb3ZlcnNpemVkX3JlYWRyZXBhaXJfbXV0YXRpb25zIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBTSE9VTERfRFJPUF9PVkVSU0laRURfUkVBRF9SRVBBSVJfTVVUQVRJT05TID0gRFJPUF9PVkVSU0laRURfUkVBRF9SRVBBSVJfTVVUQVRJT05TLmdldEJvb2xlYW4oKTsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIHJlYWQgcmVwYWlyIG11dGF0aW9uIGZyb20gdGhlIGdpdmVuIHVwZGF0ZSwgaWYgdGhlIG11dGF0aW9uIGlzIG5vdCBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bQpAQCAtNjUsNyArNjUsNyBAQAogICAgICAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKG11dGF0aW9uLmdldEtleXNwYWNlTmFtZSgpKTsKICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEgPSB1cGRhdGUubWV0YWRhdGEoKTsKIAotICAgICAgICAgICAgaWYgKERST1BfT1ZFUlNJWkVEX1JFQURfUkVQQUlSX01VVEFUSU9OUykKKyAgICAgICAgICAgIGlmIChTSE9VTERfRFJPUF9PVkVSU0laRURfUkVBRF9SRVBBSVJfTVVUQVRJT05TKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiRW5jb3VudGVyZWQgYW4gb3ZlcnNpemVkICh7fS97fSkgcmVhZCByZXBhaXIgbXV0YXRpb24gZm9yIHRhYmxlIHt9LCBrZXkge30sIG5vZGUge30iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm11dGF0aW9uU2l6ZSwKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcmVhZHMvdGhyZXNob2xkcy9Db29yZGluYXRvcldhcm5pbmdzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3JlYWRzL3RocmVzaG9sZHMvQ29vcmRpbmF0b3JXYXJuaW5ncy5qYXZhCmluZGV4IGZmNWJkNzguLjFiMzE3ZGIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcmVhZHMvdGhyZXNob2xkcy9Db29yZGluYXRvcldhcm5pbmdzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9yZWFkcy90aHJlc2hvbGRzL0Nvb3JkaW5hdG9yV2FybmluZ3MuamF2YQpAQCAtMzMsMTAgKzMzLDEyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNsaWVudFdhcm47CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5SRUFEU19USFJFU0hPTERTX0NPT1JESU5BVE9SX0RFRkVOU0lWRV9DSEVDS1NfRU5BQkxFRDsKKwogcHVibGljIGNsYXNzIENvb3JkaW5hdG9yV2FybmluZ3MKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ29vcmRpbmF0b3JXYXJuaW5ncy5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBFTkFCTEVfREVGRU5TSVZFX0NIRUNLUyA9IEJvb2xlYW4uZ2V0Qm9vbGVhbigiY2Fzc2FuZHJhLnJlYWRzLnRocmVzaG9sZHMuY29vcmRpbmF0b3IuZGVmZW5zaXZlX2NoZWNrc19lbmFibGVkIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBFTkFCTEVfREVGRU5TSVZFX0NIRUNLUyA9IFJFQURTX1RIUkVTSE9MRFNfQ09PUkRJTkFUT1JfREVGRU5TSVZFX0NIRUNLU19FTkFCTEVELmdldEJvb2xlYW4oKTsKIAogICAgIC8vIHdoZW4gLmluaXQoKSBpcyBjYWxsZWQgc2V0IHRoZSBTVEFURSB0byBiZSBJTklUOyB0aGlzIGlzIHRvIGxhenkgYWxsb2NhdGUgdGhlIG1hcCBvbmx5IHdoZW4gd2FybmluZ3MgYXJlIGdlbmVyYXRlZAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxSZWFkQ29tbWFuZCwgV2FybmluZ3NTbmFwc2hvdD4gSU5JVCA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1NuYXBzaG90TG9hZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1NuYXBzaG90TG9hZGVyLmphdmEKaW5kZXggNTIzZTFlNS4uZDMxZGYzNiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9zbmFwc2hvdC9TbmFwc2hvdExvYWRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvU25hcHNob3RMb2FkZXIuamF2YQpAQCAtNzMsNiArNzMsMTEgQEAKICAgICAgICAgdGhpcy5kYXRhRGlyZWN0b3JpZXMgPSBkYXRhRGlyczsKICAgICB9CiAKKyAgICBwdWJsaWMgU25hcHNob3RMb2FkZXIoRGlyZWN0b3JpZXMgZGlyZWN0b3JpZXMpCisgICAgeworICAgICAgICB0aGlzKGRpcmVjdG9yaWVzLmdldENGRGlyZWN0b3JpZXMoKS5zdHJlYW0oKS5tYXAoRmlsZTo6dG9QYXRoKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKyAgICB9CisKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBzdGF0aWMgY2xhc3MgVmlzaXRvciBleHRlbmRzIFNpbXBsZUZpbGVWaXNpdG9yPFBhdGg+CiAgICAgewpAQCAtMTUyLDE3ICsxNTcsMjQgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBTZXQ8VGFibGVTbmFwc2hvdD4gbG9hZFNuYXBzaG90cygpCisgICAgcHVibGljIFNldDxUYWJsZVNuYXBzaG90PiBsb2FkU25hcHNob3RzKFN0cmluZyBrZXlzcGFjZSkKICAgICB7CisgICAgICAgIC8vIGlmIHdlIHN1cHBseSBhIGtleXNwYWNlLCB0aGUgd2Fsa2luZyBtYXggZGVwdGggd2lsbCBiZSBzdWRkZW5seSBzaG9ydGhlcgorICAgICAgICAvLyBiZWNhdXNlIHdlIGFyZSBvbmUgbGV2ZWwgZG93biBpbiB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZQorICAgICAgICBpbnQgbWF4RGVwdGggPSBrZXlzcGFjZSA9PSBudWxsID8gNSA6IDQ7CisKICAgICAgICAgTWFwPFN0cmluZywgVGFibGVTbmFwc2hvdC5CdWlsZGVyPiBzbmFwc2hvdHMgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgIFZpc2l0b3IgdmlzaXRvciA9IG5ldyBWaXNpdG9yKHNuYXBzaG90cyk7CiAKICAgICAgICAgZm9yIChQYXRoIGRhdGFEaXIgOiBkYXRhRGlyZWN0b3JpZXMpCiAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChrZXlzcGFjZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGRhdGFEaXIgPSBkYXRhRGlyLnJlc29sdmUoa2V5c3BhY2UpOworCiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAobmV3IEZpbGUoZGF0YURpcikuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgICAgIEZpbGVzLndhbGtGaWxlVHJlZShkYXRhRGlyLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCA1LCB2aXNpdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgRmlsZXMud2Fsa0ZpbGVUcmVlKGRhdGFEaXIsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCksIG1heERlcHRoLCB2aXNpdG9yKTsKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiU2tpcHBpbmcgbm9uLWV4aXN0aW5nIGRhdGEgZGlyZWN0b3J5IHt9IiwgZGF0YURpcik7CiAgICAgICAgICAgICB9CkBAIC0xNzQsNCArMTg2LDkgQEAKIAogICAgICAgICByZXR1cm4gc25hcHNob3RzLnZhbHVlcygpLnN0cmVhbSgpLm1hcChUYWJsZVNuYXBzaG90LkJ1aWxkZXI6OmJ1aWxkKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CiAgICAgfQorCisgICAgcHVibGljIFNldDxUYWJsZVNuYXBzaG90PiBsb2FkU25hcHNob3RzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBsb2FkU25hcHNob3RzKG51bGwpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvU25hcHNob3RNYW5hZ2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1NuYXBzaG90TWFuYWdlci5qYXZhCmluZGV4IDhlNjMwYzcuLjM5MjVmM2YgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvU25hcHNob3RNYW5hZ2VyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9zbmFwc2hvdC9TbmFwc2hvdE1hbmFnZXIuamF2YQpAQCAtMTA5LDYgKzEwOSwxMSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHN5bmNocm9uaXplZCBTZXQ8VGFibGVTbmFwc2hvdD4gbG9hZFNuYXBzaG90cyhTdHJpbmcga2V5c3BhY2UpCisgICAgeworICAgICAgICByZXR1cm4gc25hcHNob3RMb2FkZXIubG9hZFNuYXBzaG90cyhrZXlzcGFjZSk7CisgICAgfQorCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBTZXQ8VGFibGVTbmFwc2hvdD4gbG9hZFNuYXBzaG90cygpCiAgICAgewogICAgICAgICByZXR1cm4gc25hcHNob3RMb2FkZXIubG9hZFNuYXBzaG90cygpOwpAQCAtMTQ4LDYgKzE1Myw5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBEZWxldGVzIHNuYXBzaG90IGFuZCByZW1vdmUgaXQgZnJvbSBtYW5hZ2VyCisgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyU25hcHNob3QoVGFibGVTbmFwc2hvdCBzbmFwc2hvdCkKICAgICB7CiAgICAgICAgIGZvciAoRmlsZSBzbmFwc2hvdERpciA6IHNuYXBzaG90LmdldERpcmVjdG9yaWVzKCkpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1NuYXBzaG90TWFuaWZlc3QuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvU25hcHNob3RNYW5pZmVzdC5qYXZhCmluZGV4IGJhODQwZWYuLjhlZTczN2MgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvU25hcHNob3RNYW5pZmVzdC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvU25hcHNob3RNYW5pZmVzdC5qYXZhCkBAIC0yOCw3ICsyOCw3IEBACiBpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvblByb3BlcnR5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EdXJhdGlvblNwZWM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpzb25VdGlsczsKIAogLy8gT25seSBzZXJpYWxpemUgZmllbGRzCiBASnNvbkF1dG9EZXRlY3QoZmllbGRWaXNpYmlsaXR5ID0gSnNvbkF1dG9EZXRlY3QuVmlzaWJpbGl0eS5BTlksCkBAIC00NiwxOSArNDYsMjUgQEAKICAgICBASnNvblByb3BlcnR5KCJleHBpcmVzX2F0IikKICAgICBwdWJsaWMgZmluYWwgSW5zdGFudCBleHBpcmVzQXQ7CiAKKyAgICBASnNvblByb3BlcnR5KCJlcGhlbWVyYWwiKQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGVwaGVtZXJhbDsKKwogICAgIC8qKiBuZWVkZWQgZm9yIGphY2tzb24gc2VyaWFsaXphdGlvbiAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByaXZhdGUgU25hcHNob3RNYW5pZmVzdCgpIHsKKyAgICBwcml2YXRlIFNuYXBzaG90TWFuaWZlc3QoKQorICAgIHsKICAgICAgICAgdGhpcy5maWxlcyA9IG51bGw7CiAgICAgICAgIHRoaXMuY3JlYXRlZEF0ID0gbnVsbDsKICAgICAgICAgdGhpcy5leHBpcmVzQXQgPSBudWxsOworICAgICAgICB0aGlzLmVwaGVtZXJhbCA9IGZhbHNlOwogICAgIH0KIAotICAgIHB1YmxpYyBTbmFwc2hvdE1hbmlmZXN0KExpc3Q8U3RyaW5nPiBmaWxlcywgRHVyYXRpb25TcGVjLkludFNlY29uZHNCb3VuZCB0dGwsIEluc3RhbnQgY3JlYXRpb25UaW1lKQorICAgIHB1YmxpYyBTbmFwc2hvdE1hbmlmZXN0KExpc3Q8U3RyaW5nPiBmaWxlcywgRHVyYXRpb25TcGVjLkludFNlY29uZHNCb3VuZCB0dGwsIEluc3RhbnQgY3JlYXRpb25UaW1lLCBib29sZWFuIGVwaGVtZXJhbCkKICAgICB7CiAgICAgICAgIHRoaXMuZmlsZXMgPSBmaWxlczsKICAgICAgICAgdGhpcy5jcmVhdGVkQXQgPSBjcmVhdGlvblRpbWU7CiAgICAgICAgIHRoaXMuZXhwaXJlc0F0ID0gdHRsID09IG51bGwgPyBudWxsIDogY3JlYXRlZEF0LnBsdXNTZWNvbmRzKHR0bC50b1NlY29uZHMoKSk7CisgICAgICAgIHRoaXMuZXBoZW1lcmFsID0gZXBoZW1lcmFsOwogICAgIH0KIAogICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RmlsZXMoKQpAQCAtNzYsMTQgKzgyLDE5IEBACiAgICAgICAgIHJldHVybiBleHBpcmVzQXQ7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaXNFcGhlbWVyYWwoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVwaGVtZXJhbDsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemVUb0pzb25GaWxlKEZpbGUgb3V0cHV0RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBGQlV0aWxpdGllcy5zZXJpYWxpemVUb0pzb25GaWxlKHRoaXMsIG91dHB1dEZpbGUpOworICAgICAgICBKc29uVXRpbHMuc2VyaWFsaXplVG9Kc29uRmlsZSh0aGlzLCBvdXRwdXRGaWxlKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIFNuYXBzaG90TWFuaWZlc3QgZGVzZXJpYWxpemVGcm9tSnNvbkZpbGUoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIHJldHVybiBGQlV0aWxpdGllcy5kZXNlcmlhbGl6ZUZyb21Kc29uRmlsZShTbmFwc2hvdE1hbmlmZXN0LmNsYXNzLCBmaWxlKTsKKyAgICAgICAgcmV0dXJuIEpzb25VdGlscy5kZXNlcmlhbGl6ZUZyb21Kc29uRmlsZShTbmFwc2hvdE1hbmlmZXN0LmNsYXNzLCBmaWxlKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTkyLDEyICsxMDMsMTUgQEAKICAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CiAgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKICAgICAgICAgU25hcHNob3RNYW5pZmVzdCBtYW5pZmVzdCA9IChTbmFwc2hvdE1hbmlmZXN0KSBvOwotICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHMoZmlsZXMsIG1hbmlmZXN0LmZpbGVzKSAmJiBPYmplY3RzLmVxdWFscyhjcmVhdGVkQXQsIG1hbmlmZXN0LmNyZWF0ZWRBdCkgJiYgT2JqZWN0cy5lcXVhbHMoZXhwaXJlc0F0LCBtYW5pZmVzdC5leHBpcmVzQXQpOworICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHMoZmlsZXMsIG1hbmlmZXN0LmZpbGVzKQorICAgICAgICAgICAgICAgJiYgT2JqZWN0cy5lcXVhbHMoY3JlYXRlZEF0LCBtYW5pZmVzdC5jcmVhdGVkQXQpCisgICAgICAgICAgICAgICAmJiBPYmplY3RzLmVxdWFscyhleHBpcmVzQXQsIG1hbmlmZXN0LmV4cGlyZXNBdCkKKyAgICAgICAgICAgICAgICYmIE9iamVjdHMuZXF1YWxzKGVwaGVtZXJhbCwgbWFuaWZlc3QuZXBoZW1lcmFsKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBPYmplY3RzLmhhc2goZmlsZXMsIGNyZWF0ZWRBdCwgZXhwaXJlc0F0KTsKKyAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaChmaWxlcywgY3JlYXRlZEF0LCBleHBpcmVzQXQsIGVwaGVtZXJhbCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9zbmFwc2hvdC9UYWJsZVNuYXBzaG90LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1RhYmxlU25hcHNob3QuamF2YQppbmRleCAwY2ZjZmVhLi5kMTAwOTJhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1RhYmxlU25hcHNob3QuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1RhYmxlU25hcHNob3QuamF2YQpAQCAtMjcsNiArMjcsNyBAQAogaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5VVUlEOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CiAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwpAQCAtNDQsNiArNDUsNyBAQAogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHRhYmxlTmFtZTsKICAgICBwcml2YXRlIGZpbmFsIFVVSUQgdGFibGVJZDsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB0YWc7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGVwaGVtZXJhbDsKIAogICAgIHByaXZhdGUgZmluYWwgSW5zdGFudCBjcmVhdGVkQXQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBJbnN0YW50IGV4cGlyZXNBdDsKQEAgLTUyLDcgKzU0LDcgQEAKIAogICAgIHB1YmxpYyBUYWJsZVNuYXBzaG90KFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZyB0YWJsZU5hbWUsIFVVSUQgdGFibGVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFnLCBJbnN0YW50IGNyZWF0ZWRBdCwgSW5zdGFudCBleHBpcmVzQXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgU2V0PEZpbGU+IHNuYXBzaG90RGlycykKKyAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8RmlsZT4gc25hcHNob3REaXJzLCBib29sZWFuIGVwaGVtZXJhbCkKICAgICB7CiAgICAgICAgIHRoaXMua2V5c3BhY2VOYW1lID0ga2V5c3BhY2VOYW1lOwogICAgICAgICB0aGlzLnRhYmxlTmFtZSA9IHRhYmxlTmFtZTsKQEAgLTYxLDYgKzYzLDcgQEAKICAgICAgICAgdGhpcy5jcmVhdGVkQXQgPSBjcmVhdGVkQXQ7CiAgICAgICAgIHRoaXMuZXhwaXJlc0F0ID0gZXhwaXJlc0F0OwogICAgICAgICB0aGlzLnNuYXBzaG90RGlycyA9IHNuYXBzaG90RGlyczsKKyAgICAgICAgdGhpcy5lcGhlbWVyYWwgPSBlcGhlbWVyYWw7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjMsNiArMTI2LDExIEBACiAgICAgICAgIHJldHVybiBzbmFwc2hvdERpcnMuc3RyZWFtKCkuYW55TWF0Y2goRmlsZTo6ZXhpc3RzKTsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VwaGVtZXJhbCgpCisgICAgeworICAgICAgICByZXR1cm4gZXBoZW1lcmFsOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzRXhwaXJpbmcoKQogICAgIHsKICAgICAgICAgcmV0dXJuIGV4cGlyZXNBdCAhPSBudWxsOwpAQCAtMTkyLDEzICsyMDAsMTMgQEAKICAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWxzKGtleXNwYWNlTmFtZSwgc25hcHNob3Qua2V5c3BhY2VOYW1lKSAmJiBPYmplY3RzLmVxdWFscyh0YWJsZU5hbWUsIHNuYXBzaG90LnRhYmxlTmFtZSkgJiYKICAgICAgICAgICAgICAgIE9iamVjdHMuZXF1YWxzKHRhYmxlSWQsIHNuYXBzaG90LnRhYmxlSWQpICYmIE9iamVjdHMuZXF1YWxzKHRhZywgc25hcHNob3QudGFnKSAmJgogICAgICAgICAgICAgICAgT2JqZWN0cy5lcXVhbHMoY3JlYXRlZEF0LCBzbmFwc2hvdC5jcmVhdGVkQXQpICYmIE9iamVjdHMuZXF1YWxzKGV4cGlyZXNBdCwgc25hcHNob3QuZXhwaXJlc0F0KSAmJgotICAgICAgICAgICAgICAgT2JqZWN0cy5lcXVhbHMoc25hcHNob3REaXJzLCBzbmFwc2hvdC5zbmFwc2hvdERpcnMpOworICAgICAgICAgICAgICAgT2JqZWN0cy5lcXVhbHMoc25hcHNob3REaXJzLCBzbmFwc2hvdC5zbmFwc2hvdERpcnMpICYmIE9iamVjdHMuZXF1YWxzKGVwaGVtZXJhbCwgc25hcHNob3QuZXBoZW1lcmFsKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBPYmplY3RzLmhhc2goa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsIHRhYmxlSWQsIHRhZywgY3JlYXRlZEF0LCBleHBpcmVzQXQsIHNuYXBzaG90RGlycyk7CisgICAgICAgIHJldHVybiBPYmplY3RzLmhhc2goa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsIHRhYmxlSWQsIHRhZywgY3JlYXRlZEF0LCBleHBpcmVzQXQsIHNuYXBzaG90RGlycywgZXBoZW1lcmFsKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTIxMiw2ICsyMjAsNyBAQAogICAgICAgICAgICAgICAgIiwgY3JlYXRlZEF0PSIgKyBjcmVhdGVkQXQgKwogICAgICAgICAgICAgICAgIiwgZXhwaXJlc0F0PSIgKyBleHBpcmVzQXQgKwogICAgICAgICAgICAgICAgIiwgc25hcHNob3REaXJzPSIgKyBzbmFwc2hvdERpcnMgKworICAgICAgICAgICAgICAgIiwgZXBoZW1lcmFsPSIgKyBlcGhlbWVyYWwgKwogICAgICAgICAgICAgICAgJ30nOwogICAgIH0KIApAQCAtMjIzLDYgKzIzMiw3IEBACiAKICAgICAgICAgcHJpdmF0ZSBJbnN0YW50IGNyZWF0ZWRBdCA9IG51bGw7CiAgICAgICAgIHByaXZhdGUgSW5zdGFudCBleHBpcmVzQXQgPSBudWxsOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gZXBoZW1lcmFsOwogCiAgICAgICAgIHByaXZhdGUgZmluYWwgU2V0PEZpbGU+IHNuYXBzaG90RGlycyA9IG5ldyBIYXNoU2V0PD4oKTsKIApAQCAtMjM4LDEyICsyNDgsMTcgQEAKICAgICAgICAgewogICAgICAgICAgICAgc25hcHNob3REaXJzLmFkZChzbmFwc2hvdERpcik7CiAgICAgICAgICAgICBGaWxlIG1hbmlmZXN0RmlsZSA9IG5ldyBGaWxlKHNuYXBzaG90RGlyLCAibWFuaWZlc3QuanNvbiIpOwotICAgICAgICAgICAgaWYgKG1hbmlmZXN0RmlsZS5leGlzdHMoKSAmJiBjcmVhdGVkQXQgPT0gbnVsbCAmJiBleHBpcmVzQXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvYWRUaW1lc3RhbXBzRnJvbU1hbmlmZXN0KG1hbmlmZXN0RmlsZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWFuaWZlc3RGaWxlLmV4aXN0cygpICYmIGNyZWF0ZWRBdCA9PSBudWxsICYmIGV4cGlyZXNBdCA9PSBudWxsKQorICAgICAgICAgICAgICAgIGxvYWRNZXRhZGF0YUZyb21NYW5pZmVzdChtYW5pZmVzdEZpbGUpOworCisgICAgICAgICAgICAvLyBjaGVjayBpZiBhbiBlcGhlbWVyYWwgbWFya2VyIGZpbGUgZXhpc3RzIG9ubHkgaW4gY2FzZSBpdCBpcyBub3QgYWxyZWFkeSBlcGhlbWVyYWwKKyAgICAgICAgICAgIC8vIGJ5IHJlYWRpbmcgaXQgZnJvbSBtYW5pZmVzdAorICAgICAgICAgICAgLy8gVE9ETyByZW1vdmUgdGhpcyBvbiBDYXNzYW5kcmEgNC4zIHJlbGVhc2UsIHNlZSBDQVNTQU5EUkEtMTY5MTEKKyAgICAgICAgICAgIGlmICghZXBoZW1lcmFsICYmIG5ldyBGaWxlKHNuYXBzaG90RGlyLCAiZXBoZW1lcmFsLnNuYXBzaG90IikuZXhpc3RzKCkpCisgICAgICAgICAgICAgICAgZXBoZW1lcmFsID0gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBsb2FkVGltZXN0YW1wc0Zyb21NYW5pZmVzdChGaWxlIG1hbmlmZXN0RmlsZSkKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGxvYWRNZXRhZGF0YUZyb21NYW5pZmVzdChGaWxlIG1hbmlmZXN0RmlsZSkKICAgICAgICAgewogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CkBAIC0yNTEsNiArMjY2LDkgQEAKICAgICAgICAgICAgICAgICBTbmFwc2hvdE1hbmlmZXN0IG1hbmlmZXN0ID0gU25hcHNob3RNYW5pZmVzdC5kZXNlcmlhbGl6ZUZyb21Kc29uRmlsZShtYW5pZmVzdEZpbGUpOwogICAgICAgICAgICAgICAgIGNyZWF0ZWRBdCA9IG1hbmlmZXN0LmNyZWF0ZWRBdDsKICAgICAgICAgICAgICAgICBleHBpcmVzQXQgPSBtYW5pZmVzdC5leHBpcmVzQXQ7CisgICAgICAgICAgICAgICAgLy8gYSBzbmFwc2hvdCBtYXkgYmUgZXBoZW1lcmFsIHdoZW4gaXQgaGFzIGEgbWFya2VyIGZpbGUgKG9sZCB3YXkpIG9yIGZsYWcgaW4gbWFuaWZlc3QgKG5ldyB3YXkpCisgICAgICAgICAgICAgICAgaWYgKCFlcGhlbWVyYWwpCisgICAgICAgICAgICAgICAgICAgIGVwaGVtZXJhbCA9IG1hbmlmZXN0LmVwaGVtZXJhbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQogICAgICAgICAgICAgewpAQCAtMjYwLDcgKzI3OCw3IEBACiAKICAgICAgICAgVGFibGVTbmFwc2hvdCBidWlsZCgpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVTbmFwc2hvdChrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZSwgdGFibGVJZCwgdGFnLCBjcmVhdGVkQXQsIGV4cGlyZXNBdCwgc25hcHNob3REaXJzKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVTbmFwc2hvdChrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZSwgdGFibGVJZCwgdGFnLCBjcmVhdGVkQXQsIGV4cGlyZXNBdCwgc25hcHNob3REaXJzLCBlcGhlbWVyYWwpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zMDUsNCArMzIzLDMwIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGxpdmVEaXIudG9TdHJpbmcoKSwgc25hcHNob3RGaWxlUGF0aC5nZXRGaWxlTmFtZSgpLnRvU3RyaW5nKCkpOwogICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUHJlZGljYXRlPFRhYmxlU25hcHNob3Q+IHNob3VsZENsZWFyU25hcHNob3QoU3RyaW5nIHRhZywgbG9uZyBvbGRlclRoYW5UaW1lc3RhbXApCisgICAgeworICAgICAgICByZXR1cm4gdHMgLT4KKyAgICAgICAgeworICAgICAgICAgICAgLy8gV2hlbiBubyB0YWcgaXMgc3VwcGxpZWQsIGFsbCBzbmFwc2hvdHMgbXVzdCBiZSBjbGVhcmVkCisgICAgICAgICAgICBib29sZWFuIGNsZWFyQWxsID0gdGFnID09IG51bGwgfHwgdGFnLmlzRW1wdHkoKTsKKyAgICAgICAgICAgIGlmICghY2xlYXJBbGwgJiYgdHMuaXNFcGhlbWVyYWwoKSkKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiU2tpcHBpbmcgZGVsZXRpb24gb2YgZXBoZW1lcmFsIHNuYXBzaG90ICd7fScgaW4ga2V5c3BhY2Uge30uICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcGhlbWVyYWwgc25hcHNob3RzIGFyZSBub3QgcmVtb3ZhYmxlIGJ5IGEgdXNlci4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZywgdHMua2V5c3BhY2VOYW1lKTsKKyAgICAgICAgICAgIGJvb2xlYW4gbm90RXBoZW1lcmFsID0gIXRzLmlzRXBoZW1lcmFsKCk7CisgICAgICAgICAgICBib29sZWFuIHNob3VsZENsZWFyVGFnID0gY2xlYXJBbGwgfHwgdHMudGFnLmVxdWFscyh0YWcpOworICAgICAgICAgICAgYm9vbGVhbiBieVRpbWVzdGFtcCA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChvbGRlclRoYW5UaW1lc3RhbXAgPiAwTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbnN0YW50IGNyZWF0ZWRBdCA9IHRzLmdldENyZWF0ZWRBdCgpOworICAgICAgICAgICAgICAgIGlmIChjcmVhdGVkQXQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgYnlUaW1lc3RhbXAgPSBjcmVhdGVkQXQuaXNCZWZvcmUoSW5zdGFudC5vZkVwb2NoTWlsbGkob2xkZXJUaGFuVGltZXN0YW1wKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBub3RFcGhlbWVyYWwgJiYgc2hvdWxkQ2xlYXJUYWcgJiYgYnlUaW1lc3RhbXA7CisgICAgICAgIH07CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvUHJvZ3Jlc3NJbmZvLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvUHJvZ3Jlc3NJbmZvLmphdmEKaW5kZXggMmVkNzhhYy4uMTU5Nzc1YyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1Byb2dyZXNzSW5mby5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9Qcm9ncmVzc0luZm8uamF2YQpAQCAtNjAsNyArNjAsNiBAQAogICAgIHB1YmxpYyBQcm9ncmVzc0luZm8oSW5ldEFkZHJlc3NBbmRQb3J0IHBlZXIsIGludCBzZXNzaW9uSW5kZXgsIFN0cmluZyBmaWxlTmFtZSwgRGlyZWN0aW9uIGRpcmVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgY3VycmVudEJ5dGVzLCAgbG9uZyBkZWx0YUJ5dGVzLCBsb25nIHRvdGFsQnl0ZXMpCiAgICAgewotICAgICAgICBhc3NlcnQgdG90YWxCeXRlcyA+IDA7CiAKICAgICAgICAgdGhpcy5wZWVyID0gcGVlcjsKICAgICAgICAgdGhpcy5zZXNzaW9uSW5kZXggPSBzZXNzaW9uSW5kZXg7CkBAIC03OSw2ICs3OCwxMSBAQAogICAgICAgICByZXR1cm4gY3VycmVudEJ5dGVzID49IHRvdGFsQnl0ZXM7CiAgICAgfQogCisgICAgcHVibGljIGludCBwcm9ncmVzc1BlcmNlbnRhZ2UoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRvdGFsQnl0ZXMgPT0gMCA/IDEwMCA6IChpbnQpICgoMTAwICogY3VycmVudEJ5dGVzKSAvIHRvdGFsQnl0ZXMpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFByb2dyZXNzSW5mbyBpcyBjb25zaWRlcmVkIHRvIGJlIGVxdWFsIG9ubHkgd2hlbiBhbGwgYXR0cmlidXRlcyBleGNlcHQgY3VycmVudEJ5dGVzIGFyZSBlcXVhbC4KICAgICAgKi8KQEAgLTExNCwxMCArMTE4LDEwIEBACiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihmaWxlTmFtZSk7CiAgICAgICAgIHNiLmFwcGVuZCgiICIpLmFwcGVuZChjdXJyZW50Qnl0ZXMpOwogICAgICAgICBzYi5hcHBlbmQoIi8iKS5hcHBlbmQodG90YWxCeXRlcykuYXBwZW5kKCIgYnl0ZXMgIik7Ci0gICAgICAgIHNiLmFwcGVuZCgiKCIpLmFwcGVuZChjdXJyZW50Qnl0ZXMqMTAwL3RvdGFsQnl0ZXMpLmFwcGVuZCgiJSkgIik7CisgICAgICAgIHNiLmFwcGVuZCgiKCIpLmFwcGVuZChwcm9ncmVzc1BlcmNlbnRhZ2UoKSkuYXBwZW5kKCIlKSAiKTsKICAgICAgICAgc2IuYXBwZW5kKGRpcmVjdGlvbiA9PSBEaXJlY3Rpb24uT1VUID8gInNlbnQgdG8gIiA6ICJyZWNlaXZlZCBmcm9tICIpOwogICAgICAgICBzYi5hcHBlbmQoImlkeDoiKS5hcHBlbmQoc2Vzc2lvbkluZGV4KTsKICAgICAgICAgc2IuYXBwZW5kKHBlZXIudG9TdHJpbmcod2l0aFBvcnRzKSk7CiAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU2Vzc2lvbkluZm8uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TZXNzaW9uSW5mby5qYXZhCmluZGV4IGQ5NWQ4NWIuLjkyYWYyNDUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TZXNzaW9uSW5mby5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TZXNzaW9uSW5mby5qYXZhCkBAIC00NywxMiArNDcsMTUgQEAKICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFByb2dyZXNzSW5mbz4gcmVjZWl2aW5nRmlsZXMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOwogICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgUHJvZ3Jlc3NJbmZvPiBzZW5kaW5nRmlsZXMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOwogCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBmYWlsdXJlUmVhc29uOworCiAgICAgcHVibGljIFNlc3Npb25JbmZvKEluZXRTb2NrZXRBZGRyZXNzIHBlZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIGNvbm5lY3RpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248U3RyZWFtU3VtbWFyeT4gcmVjZWl2aW5nU3VtbWFyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmVhbVN1bW1hcnk+IHNlbmRpbmdTdW1tYXJpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVNlc3Npb24uU3RhdGUgc3RhdGUpCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVNlc3Npb24uU3RhdGUgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmYWlsdXJlUmVhc29uKQogICAgIHsKICAgICAgICAgdGhpcy5wZWVyID0gcGVlcjsKICAgICAgICAgdGhpcy5zZXNzaW9uSW5kZXggPSBzZXNzaW9uSW5kZXg7CkBAIC02MCwxMSArNjMsMTIgQEAKICAgICAgICAgdGhpcy5yZWNlaXZpbmdTdW1tYXJpZXMgPSBJbW11dGFibGVTZXQuY29weU9mKHJlY2VpdmluZ1N1bW1hcmllcyk7CiAgICAgICAgIHRoaXMuc2VuZGluZ1N1bW1hcmllcyA9IEltbXV0YWJsZVNldC5jb3B5T2Yoc2VuZGluZ1N1bW1hcmllcyk7CiAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgdGhpcy5mYWlsdXJlUmVhc29uID0gIGZhaWx1cmVSZWFzb247CiAgICAgfQogCiAgICAgcHVibGljIFNlc3Npb25JbmZvKFNlc3Npb25JbmZvIG90aGVyKQogICAgIHsKLSAgICAgICAgdGhpcyhvdGhlci5wZWVyLCBvdGhlci5zZXNzaW9uSW5kZXgsIG90aGVyLmNvbm5lY3RpbmcsIG90aGVyLnJlY2VpdmluZ1N1bW1hcmllcywgb3RoZXIuc2VuZGluZ1N1bW1hcmllcywgb3RoZXIuc3RhdGUpOworICAgICAgICB0aGlzKG90aGVyLnBlZXIsIG90aGVyLnNlc3Npb25JbmRleCwgb3RoZXIuY29ubmVjdGluZywgb3RoZXIucmVjZWl2aW5nU3VtbWFyaWVzLCBvdGhlci5zZW5kaW5nU3VtbWFyaWVzLCBvdGhlci5zdGF0ZSwgb3RoZXIuZmFpbHVyZVJlYXNvbik7CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gaXNGYWlsZWQoKQpAQCAtMjA1LDQgKzIwOSw5IEBACiAgICAgewogICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25TdW1tYXJ5KEZCVXRpbGl0aWVzLmdldEJyb2FkY2FzdEFkZHJlc3NBbmRQb3J0KCksIHBlZXIsIHJlY2VpdmluZ1N1bW1hcmllcywgc2VuZGluZ1N1bW1hcmllcyk7CiAgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRGYWlsdXJlUmVhc29uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWlsdXJlUmVhc29uOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TdHJlYW1Ib29rLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtSG9vay5qYXZhCmluZGV4IDg2YjUxODIuLjg0ZGI0MjAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TdHJlYW1Ib29rLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbUhvb2suamF2YQpAQCAtMjIsNiArMjIsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5tZXNzYWdlcy5PdXRnb2luZ1N0cmVhbU1lc3NhZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TVFJFQU1fSE9PSzsKKwogcHVibGljIGludGVyZmFjZSBTdHJlYW1Ib29rCiB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJlYW1Ib29rIGluc3RhbmNlID0gY3JlYXRlSG9vaygpOwpAQCAtMzIsNyArMzQsNyBAQAogCiAgICAgc3RhdGljIFN0cmVhbUhvb2sgY3JlYXRlSG9vaygpCiAgICAgewotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gIFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnN0cmVhbV9ob29rIik7CisgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBTVFJFQU1fSE9PSy5nZXRTdHJpbmcoKTsKICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gRkJVdGlsaXRpZXMuY29uc3RydWN0KGNsYXNzTmFtZSwgU3RyZWFtSG9vay5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbU1hbmFnZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TdHJlYW1NYW5hZ2VyLmphdmEKaW5kZXggNDA4YjZmNC4uZmVjOGIyZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbU1hbmFnZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtTWFuYWdlci5qYXZhCkBAIC0zMSw2ICszMSw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jYWNoZS5DYWNoZTsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jYWNoZS5DYWNoZUJ1aWxkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY2FjaGUuV2VpZ2hlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlJhdGVMaW1pdGVyOwpAQCAtMjUyLDE4ICsyNTMsMzUgQEAKICAgICAgICAgfQogICAgIH07CiAKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTdHJlYW1pbmdTdGF0ZUFnYWluKFN0cmVhbWluZ1N0YXRlIHN0YXRlKQorICAgIHsKKyAgICAgICAgaWYgKCFEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U3RyZWFtaW5nU3RhdHNFbmFibGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHN0YXRlcy5wdXQoc3RhdGUuaWQoKSwgc3RhdGUpOworICAgIH0KKwogICAgIHB1YmxpYyBTdHJlYW1NYW5hZ2VyKCkKICAgICB7CiAgICAgICAgIER1cmF0aW9uU3BlYy5Mb25nTmFub3NlY29uZHNCb3VuZCBkdXJhdGlvbiA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRTdHJlYW1pbmdTdGF0ZUV4cGlyZXMoKTsKICAgICAgICAgbG9uZyBzaXplQnl0ZXMgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U3RyZWFtaW5nU3RhdGVTaXplKCkudG9CeXRlcygpOwotICAgICAgICBsb25nIG51bUVsZW1lbnRzID0gc2l6ZUJ5dGVzIC8gU3RyZWFtaW5nU3RhdGUuRUxFTUVOVF9TSVpFOwotICAgICAgICBsb2dnZXIuaW5mbygiU3RvcmluZyBzdHJlYW1pbmcgc3RhdGUgZm9yIHt9IG9yIGZvciB7fSBlbGVtZW50cyIsIGR1cmF0aW9uLCBudW1FbGVtZW50cyk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJTdG9yaW5nIHN0cmVhbWluZyBzdGF0ZSBmb3Ige30gb3IgZm9yIHNpemUge30iLCBkdXJhdGlvbiwgc2l6ZUJ5dGVzKTsKICAgICAgICAgc3RhdGVzID0gQ2FjaGVCdWlsZGVyLm5ld0J1aWxkZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhwaXJlQWZ0ZXJXcml0ZShkdXJhdGlvbi5xdWFudGl0eSgpLCBkdXJhdGlvbi51bml0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhpbXVtU2l6ZShudW1FbGVtZW50cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heGltdW1XZWlnaHQoc2l6ZUJ5dGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2VpZ2hlcihuZXcgU3RyZWFtaW5nU3RhdGVXZWlnaGVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0cmVhbWluZ1N0YXRlV2VpZ2hlciBpbXBsZW1lbnRzIFdlaWdoZXI8VGltZVVVSUQsU3RyZWFtaW5nU3RhdGU+CisgICAgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCB3ZWlnaChUaW1lVVVJRCBrZXksIFN0cmVhbWluZ1N0YXRlIHZhbCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBjb3N0T2ZTdHJlYW1pbmdTdGF0ZSA9IHZhbC51bnNoYXJlZEhlYXBTaXplKCkgKyBUaW1lVVVJRC5USU1FVVVJRF9TSVpFOworICAgICAgICAgICAgcmV0dXJuIE1hdGgudG9JbnRFeGFjdChjb3N0T2ZTdHJlYW1pbmdTdGF0ZSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBzdGFydCgpCiAgICAgewogICAgICAgICBhZGRMaXN0ZW5lcihsaXN0ZW5lcik7CkBAIC00NDcsNiArNDY1LDE3IEBACiAgICAgICAgIHJldHVybiBzdHJlYW1SZXN1bHRGdXR1cmUuZ2V0U2Vzc2lvbihwZWVyLCBzZXNzaW9uSW5kZXgpOwogICAgIH0KIAorICAgIHB1YmxpYyBsb25nIGdldFRvdGFsUmVtYWluaW5nT25nb2luZ0J5dGVzKCkKKyAgICB7CisgICAgICAgIGxvbmcgdG90YWwgPSAwOworICAgICAgICBmb3IgKFN0cmVhbVJlc3VsdEZ1dHVyZSBmdXQgOiBJdGVyYWJsZXMuY29uY2F0KGluaXRpYXRvclN0cmVhbXMudmFsdWVzKCksIGZvbGxvd2VyU3RyZWFtcy52YWx1ZXMoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoU2Vzc2lvbkluZm8gc2Vzc2lvbkluZm8gOiBmdXQuZ2V0Q3VycmVudFN0YXRlKCkuc2Vzc2lvbnMpCisgICAgICAgICAgICAgICAgdG90YWwgKz0gc2Vzc2lvbkluZm8uZ2V0VG90YWxTaXplVG9SZWNlaXZlKCkgLSBzZXNzaW9uSW5mby5nZXRUb3RhbFNpemVSZWNlaXZlZCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0b3RhbDsKKyAgICB9CisKICAgICBwdWJsaWMgaW50ZXJmYWNlIFN0cmVhbUxpc3RlbmVyCiAgICAgewogICAgICAgICBkZWZhdWx0IHZvaWQgb25SZWdpc3RlcihTdHJlYW1SZXN1bHRGdXR1cmUgcmVzdWx0KSB7fQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbU9wZXJhdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbU9wZXJhdGlvbi5qYXZhCmluZGV4IDgxNTFiNDcuLjk4YTQwNzAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TdHJlYW1PcGVyYXRpb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtT3BlcmF0aW9uLmphdmEKQEAgLTE5LDQzICsxOSw0MyBAQAogCiBwdWJsaWMgZW51bSBTdHJlYW1PcGVyYXRpb24KIHsKLSAgICBPVEhFUigiT3RoZXIiKSwgLy8gRmFsbGJhY2sgdG8gYXZvaWQgbnVsbCB0eXBlcyB3aGVuIGRlc2VyaWFsaXppbmcgZnJvbSBzdHJpbmcKLSAgICBSRVNUT1JFX1JFUExJQ0FfQ09VTlQoIlJlc3RvcmUgcmVwbGljYSBjb3VudCIsIGZhbHNlKSwgLy8gSGFuZGxlcyByZW1vdmVOb2RlCi0gICAgREVDT01NSVNTSU9OKCJVbmJvb3RzdHJhcCIsIGZhbHNlKSwKLSAgICBSRUxPQ0FUSU9OKCJSZWxvY2F0aW9uIiwgZmFsc2UpLAotICAgIEJPT1RTVFJBUCgiQm9vdHN0cmFwIiwgZmFsc2UpLAotICAgIFJFQlVJTEQoIlJlYnVpbGQiLCBmYWxzZSksCi0gICAgQlVMS19MT0FEKCJCdWxrIExvYWQiKSwKLSAgICBSRVBBSVIoIlJlcGFpciIpOworICAgIE9USEVSKCJPdGhlciIsIHRydWUsIGZhbHNlKSwgLy8gRmFsbGJhY2sgdG8gYXZvaWQgbnVsbCB0eXBlcyB3aGVuIGRlc2VyaWFsaXppbmcgZnJvbSBzdHJpbmcKKyAgICBSRVNUT1JFX1JFUExJQ0FfQ09VTlQoIlJlc3RvcmUgcmVwbGljYSBjb3VudCIsIGZhbHNlLCBmYWxzZSksIC8vIEhhbmRsZXMgcmVtb3ZlTm9kZQorICAgIERFQ09NTUlTU0lPTigiVW5ib290c3RyYXAiLCBmYWxzZSwgdHJ1ZSksCisgICAgUkVMT0NBVElPTigiUmVsb2NhdGlvbiIsIGZhbHNlLCB0cnVlKSwKKyAgICBCT09UU1RSQVAoIkJvb3RzdHJhcCIsIGZhbHNlLCB0cnVlKSwKKyAgICBSRUJVSUxEKCJSZWJ1aWxkIiwgZmFsc2UsIHRydWUpLAorICAgIEJVTEtfTE9BRCgiQnVsayBMb2FkIiwgdHJ1ZSwgZmFsc2UpLAorICAgIFJFUEFJUigiUmVwYWlyIiwgdHJ1ZSwgZmFsc2UpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb247CiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlcXVpcmVzVmlld0J1aWxkOwotCi0KLSAgICBTdHJlYW1PcGVyYXRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgIHRoaXMoZGVzY3JpcHRpb24sIHRydWUpOwotICAgIH0KKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4ga2VlcFNTVGFibGVMZXZlbDsKIAogICAgIC8qKgogICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgb3BlcmF0aW9uIGRlc2NyaXB0aW9uCiAgICAgICogQHBhcmFtIHJlcXVpcmVzVmlld0J1aWxkIFdoZXRoZXIgdGhpcyBvcGVyYXRpb24gcmVxdWlyZXMgdmlld3MgdG8gYmUgdXBkYXRlZCBpZiBpdCBpbnZvbHZlcyBhIGJhc2UgdGFibGUKICAgICAgKi8KLSAgICBTdHJlYW1PcGVyYXRpb24oU3RyaW5nIGRlc2NyaXB0aW9uLCBib29sZWFuIHJlcXVpcmVzVmlld0J1aWxkKSB7CisgICAgU3RyZWFtT3BlcmF0aW9uKFN0cmluZyBkZXNjcmlwdGlvbiwgYm9vbGVhbiByZXF1aXJlc1ZpZXdCdWlsZCwgYm9vbGVhbiBrZWVwU1NUYWJsZUxldmVsKQorICAgIHsKICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwogICAgICAgICB0aGlzLnJlcXVpcmVzVmlld0J1aWxkID0gcmVxdWlyZXNWaWV3QnVpbGQ7CisgICAgICAgIHRoaXMua2VlcFNTVGFibGVMZXZlbCA9IGtlZXBTU1RhYmxlTGV2ZWw7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBTdHJlYW1PcGVyYXRpb24gZnJvbVN0cmluZyhTdHJpbmcgdGV4dCkgewotICAgICAgICBmb3IgKFN0cmVhbU9wZXJhdGlvbiBiIDogU3RyZWFtT3BlcmF0aW9uLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoYi5kZXNjcmlwdGlvbi5lcXVhbHNJZ25vcmVDYXNlKHRleHQpKSB7CisgICAgcHVibGljIHN0YXRpYyBTdHJlYW1PcGVyYXRpb24gZnJvbVN0cmluZyhTdHJpbmcgdGV4dCkKKyAgICB7CisgICAgICAgIGZvciAoU3RyZWFtT3BlcmF0aW9uIGIgOiBTdHJlYW1PcGVyYXRpb24udmFsdWVzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiLmRlc2NyaXB0aW9uLmVxdWFsc0lnbm9yZUNhc2UodGV4dCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGI7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gT1RIRVI7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKKyAgICB7CiAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKICAgICB9CiAKQEAgLTY2LDQgKzY2LDkgQEAKICAgICB7CiAgICAgICAgIHJldHVybiB0aGlzLnJlcXVpcmVzVmlld0J1aWxkOwogICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGtlZXBTU1RhYmxlTGV2ZWwoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGtlZXBTU1RhYmxlTGV2ZWw7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbVJlc3VsdEZ1dHVyZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbVJlc3VsdEZ1dHVyZS5qYXZhCmluZGV4IGI0MzIwM2QuLjUyNzdiOWQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TdHJlYW1SZXN1bHRGdXR1cmUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtUmVzdWx0RnV0dXJlLmphdmEKQEAgLTIzOSw4ICsyMzksMTYgQEAKICAgICAgICAgICAgIFN0cmVhbVN0YXRlIGZpbmFsU3RhdGUgPSBnZXRDdXJyZW50U3RhdGUoKTsKICAgICAgICAgICAgIGlmIChmaW5hbFN0YXRlLmhhc0ZhaWxlZFNlc3Npb24oKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiW1N0cmVhbSAje31dIFN0cmVhbSBmYWlsZWQiLCBwbGFuSWQpOwotICAgICAgICAgICAgICAgIHRyeUZhaWx1cmUobmV3IFN0cmVhbUV4Y2VwdGlvbihmaW5hbFN0YXRlLCAiU3RyZWFtIGZhaWxlZCIpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCJTdHJlYW0gZmFpbGVkOiAiKTsKKyAgICAgICAgICAgICAgICBmb3IgKFNlc3Npb25JbmZvIGluZm8gOiBmaW5hbFN0YXRlLnNlc3Npb25zKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5pc0ZhaWxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoIlxuU2Vzc2lvbiBwZWVyICIpLmFwcGVuZChpbmZvLnBlZXIpLmFwcGVuZCgnICcpLmFwcGVuZChpbmZvLmZhaWx1cmVSZWFzb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHN0cmluZ0J1aWxkZXIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiW1N0cmVhbSAje31dIHt9IiwgcGxhbklkLCBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB0cnlGYWlsdXJlKG5ldyBTdHJlYW1FeGNlcHRpb24oZmluYWxTdGF0ZSwgbWVzc2FnZSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSBpZiAoZmluYWxTdGF0ZS5oYXNBYm9ydGVkU2Vzc2lvbigpKQogICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbVNlc3Npb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TdHJlYW1TZXNzaW9uLmphdmEKaW5kZXggODExNzE3Zi4uZTE3MGNhNiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbVNlc3Npb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtU2Vzc2lvbi5qYXZhCkBAIC0yMCwxNiArMjAsMjIgQEAKIGltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5Tb2NrZXRUaW1lb3V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZENoYW5uZWxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlU3RvcmU7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIApAQCAtNDAsMzEgKzQ2LDM2IEBACiAKIGltcG9ydCBpby5uZXR0eS5jaGFubmVsLkNoYW5uZWw7CiBpbXBvcnQgaW8ubmV0dHkudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsgLy9jaGVja3N0eWxlOiBwZXJtaXQgdGhpcyBpbXBvcnQKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmFuZ2VzQXRFbmRwb2ludDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuRnV0dXJlQ29tYmluZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5nbXMuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SYW5nZXNBdEVuZHBvaW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmVwbGljYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlN0cmVhbWluZ01ldHJpY3M7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5BY3RpdmVSZXBhaXJTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5hc3luYy5TdHJlYW1pbmdNdWx0aXBsZXhlZENoYW5uZWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLm1lc3NhZ2VzLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSlZNU3RhYmlsaXR5SW5zcGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk5vU3BhbUxvZ2dlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkZ1dHVyZUNvbWJpbmVyOwogCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLmFsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfU1RSRUFNSU5HX0RFQlVHX1NUQUNLVFJBQ0VfTElNSVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQuaG9zdEFkZHJlc3NBbmRQb3J0OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllcy5nZXRCcm9hZGNhc3RBZGRyZXNzQW5kUG9ydDsKQEAgLTE0NCw5ICsxNTUsMTAgQEAKICAqICh2aWEge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlfSwgd2hpbGUgdGhlIGFjdHVhbCBmaWxlcyB0aGVtc2VsdmVzIGFyZSBzZW50IGJ5IGEgc3BlY2lhbAogICogInN0cmVhbWluZyIgY29ubmVjdGlvbiB0eXBlLiBTZWUge0BsaW5rIFN0cmVhbWluZ011bHRpcGxleGVkQ2hhbm5lbH0gZm9yIGRldGFpbHMuIEJlY2F1c2Ugb2YgdGhlIGFzeW5jaHJvbm91cwogICovCi1wdWJsaWMgY2xhc3MgU3RyZWFtU2Vzc2lvbiBpbXBsZW1lbnRzIElFbmRwb2ludFN0YXRlQ2hhbmdlU3Vic2NyaWJlcgorcHVibGljIGNsYXNzIFN0cmVhbVNlc3Npb24KIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU3RyZWFtU2Vzc2lvbi5jbGFzcyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFQlVHX1NUQUNLVFJBQ0VfTElNSVQgPSBDQVNTQU5EUkFfU1RSRUFNSU5HX0RFQlVHX1NUQUNLVFJBQ0VfTElNSVQuZ2V0SW50KCk7CiAKICAgICBwdWJsaWMgZW51bSBQcmVwYXJlRGlyZWN0aW9uIHsgU0VORCwgQUNLIH0KIApAQCAtMTkzLDYgKzIwNSw4IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBUaW1lVVVJRCBwZW5kaW5nUmVwYWlyOwogICAgIHByaXZhdGUgZmluYWwgUHJldmlld0tpbmQgcHJldmlld0tpbmQ7CiAKKyAgICBwdWJsaWMgU3RyaW5nIGZhaWx1cmVSZWFzb247CisKIC8qKgogICogU3RhdGUgVHJhbnNpdGlvbjoKICAqCkBAIC0yNzUsNyArMjg5LDE1IEBACiAKICAgICBwdWJsaWMgU3RyZWFtT3BlcmF0aW9uIHN0cmVhbU9wZXJhdGlvbigpCiAgICAgewotICAgICAgICByZXR1cm4gc3RyZWFtUmVzdWx0ID09IG51bGwgPyBudWxsIDogc3RyZWFtUmVzdWx0LnN0cmVhbU9wZXJhdGlvbjsKKyAgICAgICAgaWYgKHN0cmVhbVJlc3VsdCA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBsb2dnZXIud2FybigiU3RyZWFtUmVzdWx0RnV0dXJlIG5vdCBpbml0aWFsaXplZCB7fSB7fSIsIGNoYW5uZWwuY29ubmVjdGVkVG8oKSwgaXNGb2xsb3dlciA/ICJmb2xsb3dlciIgOiAiaW5pdGlhdG9yIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJlYW1SZXN1bHQuc3RyZWFtT3BlcmF0aW9uOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIFN0cmVhbU9wZXJhdGlvbiBnZXRTdHJlYW1PcGVyYXRpb24oKQpAQCAtNDk2LDEzICs1MTgsMjAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3luY2hyb25pemVkIEZ1dHVyZTw/PiBjbG9zZVNlc3Npb24oU3RhdGUgZmluYWxTdGF0ZSkKKyAgICBwcml2YXRlIEZ1dHVyZTw/PiBjbG9zZVNlc3Npb24oU3RhdGUgZmluYWxTdGF0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBjbG9zZVNlc3Npb24oZmluYWxTdGF0ZSwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgRnV0dXJlPD8+IGNsb3NlU2Vzc2lvbihTdGF0ZSBmaW5hbFN0YXRlLCBTdHJpbmcgZmFpbHVyZVJlYXNvbikKICAgICB7CiAgICAgICAgIC8vIGl0J3Mgc2Vzc2lvbiBpcyBhbHJlYWR5IGNsb3NlZAogICAgICAgICBpZiAoY2xvc2VGdXR1cmUgIT0gbnVsbCkKICAgICAgICAgICAgIHJldHVybiBjbG9zZUZ1dHVyZTsKIAogICAgICAgICBzdGF0ZShmaW5hbFN0YXRlKTsKKyAgICAgICAgLy90aGlzIHJlZmVycyB0byBTdHJlYW1JbmZvCisgICAgICAgIHRoaXMuZmFpbHVyZVJlYXNvbiA9IGZhaWx1cmVSZWFzb247CiAKICAgICAgICAgTGlzdDxGdXR1cmU8Pz4+IGZ1dHVyZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIApAQCAtNjU1LDcgKzY4NCw2IEBACiAgICAgICAgICAgICBpZiAoc3RhdGUuZmluYWxTdGF0ZSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIltTdHJlYW0gI3t9XSBTb2NrZXQgY2xvc2VkIGFmdGVyIHNlc3Npb24gY29tcGxldGVkIHdpdGggc3RhdGUge30iLCBwbGFuSWQoKSwgc3RhdGUpOwotCiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCkBAIC02NjQsOCArNjkyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbklkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZXIuZ2V0SG9zdEFkZHJlc3NBbmRQb3J0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNsb3NlU2Vzc2lvbihTdGF0ZS5GQUlMRUQpOworICAgICAgICAgICAgICAgIHJldHVybiBjbG9zZVNlc3Npb24oU3RhdGUuRkFJTEVELCAiRmFpbGVkIGJlY2F1c2UgdGhlcmUgd2FzIGFuICIgKyBlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpICsgIiB3aXRoIHN0YXRlPSIgKyBzdGF0ZS5uYW1lKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTY3Niw4ICs3MDMsOSBAQAogICAgICAgICAgICAgc3RhdGUoU3RhdGUuRkFJTEVEKTsgLy8gbWFrZSBzdXJlIHN1YnNlcXVlbnQgZXJyb3IgaGFuZGxpbmcgc2VlcyB0aGUgc2Vzc2lvbiBpbiBhIGZpbmFsIHN0YXRlIAogICAgICAgICAgICAgY2hhbm5lbC5zZW5kQ29udHJvbE1lc3NhZ2UobmV3IFNlc3Npb25GYWlsZWRNZXNzYWdlKCkpLmF3YWl0VW5pbnRlcnJ1cHRpYmx5KCk7CiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2xvc2VTZXNzaW9uKFN0YXRlLkZBSUxFRCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgZmFpbHVyZVJlYXNvbiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJGYWlsZWQgYmVjYXVzZSBvZiBhbiB1bmtub3duIGV4Y2VwdGlvblxuIik7CisgICAgICAgIGJvdW5kU3RhY2tUcmFjZShlLCBERUJVR19TVEFDS1RSQUNFX0xJTUlULCBmYWlsdXJlUmVhc29uKTsKKyAgICAgICAgcmV0dXJuIGNsb3NlU2Vzc2lvbihTdGF0ZS5GQUlMRUQsIGZhaWx1cmVSZWFzb24udG9TdHJpbmcoKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGxvZ0Vycm9yKFRocm93YWJsZSBlKQpAQCAtNzMwLDYgKzc1OCw4IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVBc3luYyhDb2xsZWN0aW9uPFN0cmVhbVJlcXVlc3Q+IHJlcXVlc3RzLCBDb2xsZWN0aW9uPFN0cmVhbVN1bW1hcnk+IHN1bW1hcmllcykKICAgICB7CisgICAgICAgIGlmIChTdHJlYW1PcGVyYXRpb24uUkVQQUlSID09IHN0cmVhbU9wZXJhdGlvbigpKQorICAgICAgICAgICAgY2hlY2tBdmFpbGFibGVEaXNrU3BhY2VBbmRDb21wYWN0aW9ucyhzdW1tYXJpZXMpOwogICAgICAgICBmb3IgKFN0cmVhbVJlcXVlc3QgcmVxdWVzdCA6IHJlcXVlc3RzKQogICAgICAgICAgICAgYWRkVHJhbnNmZXJSYW5nZXMocmVxdWVzdC5rZXlzcGFjZSwgUmFuZ2VzQXRFbmRwb2ludC5jb25jYXQocmVxdWVzdC5mdWxsLCByZXF1ZXN0LnRyYW5zaWVudFJlcGxpY2FzKSwgcmVxdWVzdC5jb2x1bW5GYW1pbGllcywgdHJ1ZSk7IC8vIGFsd2F5cyBmbHVzaCBvbiBzdHJlYW0gcmVxdWVzdAogICAgICAgICBmb3IgKFN0cmVhbVN1bW1hcnkgc3VtbWFyeSA6IHN1bW1hcmllcykKQEAgLTc1OCw2ICs3ODgsOCBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVTeW5BY2soUHJlcGFyZVN5bkFja01lc3NhZ2UgbXNnKQogICAgIHsKKyAgICAgICAgaWYgKFN0cmVhbU9wZXJhdGlvbi5SRVBBSVIgPT0gc3RyZWFtT3BlcmF0aW9uKCkpCisgICAgICAgICAgICBjaGVja0F2YWlsYWJsZURpc2tTcGFjZUFuZENvbXBhY3Rpb25zKG1zZy5zdW1tYXJpZXMpOwogICAgICAgICBpZiAoIW1zZy5zdW1tYXJpZXMuaXNFbXB0eSgpKQogICAgICAgICB7CiAgICAgICAgICAgICBmb3IgKFN0cmVhbVN1bW1hcnkgc3VtbWFyeSA6IG1zZy5zdW1tYXJpZXMpCkBAIC03ODIsNiArODE0LDE2MyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEluIHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgYW4gZXJyb3IgY2hlY2tpbmcgZGlzayBzcGFjZSB3ZSBhbGxvdyB0aGUgT3BlcmF0aW9uIHRvIGNvbnRpbnVlLgorICAgICAqIEluIHRoZSBjYXNlIHdoZXJlIHdlIGRvIF9ub3RfIGhhdmUgYXZhaWxhYmxlIHNwYWNlLCB0aGlzIG1ldGhvZCByYWlzZXMgYSBSVEUuCisgICAgICogVE9ETzogQ29uc2lkZXIgcmV2aXNpbmcgdGhpcyB0byByZXR1cm5pbmcgYSBib29sZWFuIGFuZCBhbGxvd2luZyBjYWxsZXJzIHVwc3RyZWFtIHRvIGhhbmRsZSB0aGF0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja0F2YWlsYWJsZURpc2tTcGFjZUFuZENvbXBhY3Rpb25zKENvbGxlY3Rpb248U3RyZWFtU3VtbWFyeT4gc3VtbWFyaWVzKQorICAgIHsKKyAgICAgICAgaWYgKERhdGFiYXNlRGVzY3JpcHRvci5nZXRTa2lwU3RyZWFtRGlza1NwYWNlQ2hlY2soKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBib29sZWFuIGhhc0F2YWlsYWJsZVNwYWNlID0gdHJ1ZTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgaGFzQXZhaWxhYmxlU3BhY2UgPSBjaGVja0F2YWlsYWJsZURpc2tTcGFjZUFuZENvbXBhY3Rpb25zKHN1bW1hcmllcywgcGxhbklkKCksIHBlZXIuZ2V0SG9zdEFkZHJlc3ModHJ1ZSksIHBlbmRpbmdSZXBhaXIgIT0gbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIltTdHJlYW0gI3t9XSBDb3VsZCBub3QgY2hlY2sgYXZhaWxhYmxlIGRpc2sgc3BhY2UgYW5kIGNvbXBhY3Rpb25zIGZvciB7fSwgc3VtbWFyaWVzID0ge30iLCBwbGFuSWQoKSwgdGhpcywgc3VtbWFyaWVzLCBlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWhhc0F2YWlsYWJsZVNwYWNlKQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiTm90IGVub3VnaCBkaXNrIHNwYWNlIGZvciBzdHJlYW0gJXMpLCBzdW1tYXJpZXM9JXMiLCB0aGlzLCBzdW1tYXJpZXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlcyBzdXJlIHRoYXQgd2UgZXhwZWN0IHRvIGhhdmUgZW5vdWdoIGRpc2sgc3BhY2UgYXZhaWxhYmxlIGZvciB0aGUgbmV3IHN0cmVhbXMsIHRha2luZyBpbnRvIGNvbnNpZGVyYXRpb24KKyAgICAgKiB0aGUgb25nb2luZyBjb21wYWN0aW9ucyBhbmQgc3RyZWFtcy4KKyAgICAgKi8KKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tBdmFpbGFibGVEaXNrU3BhY2VBbmRDb21wYWN0aW9ucyhDb2xsZWN0aW9uPFN0cmVhbVN1bW1hcnk+IHN1bW1hcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgVGltZVVVSUQgcGxhbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBTdHJpbmcgcmVtb3RlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzRm9ySW5jcmVtZW50YWwpCisgICAgeworICAgICAgICBNYXA8VGFibGVJZCwgTG9uZz4gcGVyVGFibGVJZEluY29taW5nQnl0ZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIE1hcDxUYWJsZUlkLCBJbnRlZ2VyPiBwZXJUYWJsZUlkSW5jb21pbmdGaWxlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgbG9uZyBuZXdTdHJlYW1Ub3RhbCA9IDA7CisgICAgICAgIGZvciAoU3RyZWFtU3VtbWFyeSBzdW1tYXJ5IDogc3VtbWFyaWVzKQorICAgICAgICB7CisgICAgICAgICAgICBwZXJUYWJsZUlkSW5jb21pbmdGaWxlcy5tZXJnZShzdW1tYXJ5LnRhYmxlSWQsIHN1bW1hcnkuZmlsZXMsIEludGVnZXI6OnN1bSk7CisgICAgICAgICAgICBwZXJUYWJsZUlkSW5jb21pbmdCeXRlcy5tZXJnZShzdW1tYXJ5LnRhYmxlSWQsIHN1bW1hcnkudG90YWxTaXplLCBMb25nOjpzdW0pOworICAgICAgICAgICAgbmV3U3RyZWFtVG90YWwgKz0gc3VtbWFyeS50b3RhbFNpemU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBlclRhYmxlSWRJbmNvbWluZ0J5dGVzLmlzRW1wdHkoKSB8fCBuZXdTdHJlYW1Ub3RhbCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgcmV0dXJuIGNoZWNrRGlza1NwYWNlKHBlclRhYmxlSWRJbmNvbWluZ0J5dGVzLCBwbGFuSWQsIERpcmVjdG9yaWVzOjpnZXRGaWxlU3RvcmUpICYmCisgICAgICAgICAgICAgICBjaGVja1BlbmRpbmdDb21wYWN0aW9ucyhwZXJUYWJsZUlkSW5jb21pbmdCeXRlcywgcGVyVGFibGVJZEluY29taW5nRmlsZXMsIHBsYW5JZCwgcmVtb3RlQWRkcmVzcywgaXNGb3JJbmNyZW1lbnRhbCwgbmV3U3RyZWFtVG90YWwpOworICAgIH0KKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHN0YXRpYyBib29sZWFuIGNoZWNrRGlza1NwYWNlKE1hcDxUYWJsZUlkLCBMb25nPiBwZXJUYWJsZUlkSW5jb21pbmdCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVVVJRCBwbGFuSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb248RmlsZSwgRmlsZVN0b3JlPiBmaWxlU3RvcmVNYXBwZXIpCisgICAgeworICAgICAgICBNYXA8RmlsZVN0b3JlLCBMb25nPiBuZXdTdHJlYW1CeXRlc1RvV3JpdGVQZXJGaWxlU3RvcmUgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIFNldDxGaWxlU3RvcmU+IGFsbEZpbGVTdG9yZXMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIC8vIFN1bSB1cCB0aGUgaW5jb21pbmcgYnl0ZXMgcGVyIGZpbGUgc3RvcmUgLSB3ZSBhc3N1bWUgdGhhdCB0aGUgc3RyZWFtIGlzIGV2ZW5seSBkaXN0cmlidXRlZCBvdmVyIHRoZSB3cml0YWJsZQorICAgICAgICAvLyBmaWxlIHN0b3JlcyBmb3IgdGhlIHRhYmxlLgorICAgICAgICBmb3IgKE1hcC5FbnRyeTxUYWJsZUlkLCBMb25nPiBlbnRyeSA6IHBlclRhYmxlSWRJbmNvbWluZ0J5dGVzLmVudHJ5U2V0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IENvbHVtbkZhbWlseVN0b3JlLmdldElmRXhpc3RzKGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgICAgIGlmIChjZnMgPT0gbnVsbCB8fCBwZXJUYWJsZUlkSW5jb21pbmdCeXRlcy5nZXQoZW50cnkuZ2V0S2V5KCkpID09IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIFNldDxGaWxlU3RvcmU+IGFsbFdyaXRlYWJsZUZpbGVTdG9yZXMgPSBjZnMuZ2V0RGlyZWN0b3JpZXMoKS5hbGxGaWxlU3RvcmVzKGZpbGVTdG9yZU1hcHBlcik7CisgICAgICAgICAgICBpZiAoYWxsV3JpdGVhYmxlRmlsZVN0b3Jlcy5pc0VtcHR5KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJbU3RyZWFtICN7fV0gQ291bGQgbm90IGdldCBhbnkgd3JpdGVhYmxlIEZpbGVTdG9yZXMgZm9yIHt9Lnt9IiwgcGxhbklkLCBjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLCBjZnMuZ2V0VGFibGVOYW1lKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWxsRmlsZVN0b3Jlcy5hZGRBbGwoYWxsV3JpdGVhYmxlRmlsZVN0b3Jlcyk7CisgICAgICAgICAgICBsb25nIHRvdGFsQnl0ZXNJblBlckZpbGVTdG9yZSA9IGVudHJ5LmdldFZhbHVlKCkgLyBhbGxXcml0ZWFibGVGaWxlU3RvcmVzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoRmlsZVN0b3JlIGZzIDogYWxsV3JpdGVhYmxlRmlsZVN0b3JlcykKKyAgICAgICAgICAgICAgICBuZXdTdHJlYW1CeXRlc1RvV3JpdGVQZXJGaWxlU3RvcmUubWVyZ2UoZnMsIHRvdGFsQnl0ZXNJblBlckZpbGVTdG9yZSwgTG9uZzo6c3VtKTsKKyAgICAgICAgfQorICAgICAgICBNYXA8RmlsZVN0b3JlLCBMb25nPiB0b3RhbENvbXBhY3Rpb25Xcml0ZVJlbWFpbmluZyA9IERpcmVjdG9yaWVzLnBlckZpbGVTdG9yZShDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuZXN0aW1hdGVkUmVtYWluaW5nV3JpdGVCeXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlU3RvcmVNYXBwZXIpOworICAgICAgICBsb25nIHRvdGFsU3RyZWFtUmVtYWluaW5nID0gU3RyZWFtTWFuYWdlci5pbnN0YW5jZS5nZXRUb3RhbFJlbWFpbmluZ09uZ29pbmdCeXRlcygpOworICAgICAgICBsb25nIHRvdGFsQnl0ZXNTdHJlYW1SZW1haW5pbmdQZXJGaWxlU3RvcmUgPSB0b3RhbFN0cmVhbVJlbWFpbmluZyAvIE1hdGgubWF4KDEsIGFsbEZpbGVTdG9yZXMuc2l6ZSgpKTsKKyAgICAgICAgTWFwPEZpbGVTdG9yZSwgTG9uZz4gYWxsV3JpdGVEYXRhID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxGaWxlU3RvcmUsIExvbmc+IGZzQnl0ZXMgOiBuZXdTdHJlYW1CeXRlc1RvV3JpdGVQZXJGaWxlU3RvcmUuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIGFsbFdyaXRlRGF0YS5wdXQoZnNCeXRlcy5nZXRLZXkoKSwgZnNCeXRlcy5nZXRWYWx1ZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxCeXRlc1N0cmVhbVJlbWFpbmluZ1BlckZpbGVTdG9yZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsQ29tcGFjdGlvbldyaXRlUmVtYWluaW5nLmdldE9yRGVmYXVsdChmc0J5dGVzLmdldEtleSgpLCAwTCkpOworCisgICAgICAgIGlmICghRGlyZWN0b3JpZXMuaGFzRGlza1NwYWNlRm9yQ29tcGFjdGlvbnNBbmRTdHJlYW1zKGFsbFdyaXRlRGF0YSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiW1N0cmVhbSAje31dIE5vdCBlbm91Z2ggZGlzayBzcGFjZSB0byBzdHJlYW0ge30gdG8ge30gKHN0cmVhbSBvbmdvaW5nIHJlbWFpbmluZz17fSwgY29tcGFjdGlvbiBvbmdvaW5nIHJlbWFpbmluZz17fSwgYWxsIG9uZ29pbmcgd3JpdGVzPXt9KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0cmVhbUJ5dGVzVG9Xcml0ZVBlckZpbGVTdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwZXJUYWJsZUlkSW5jb21pbmdCeXRlcy5rZXlTZXQoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChDb2x1bW5GYW1pbHlTdG9yZTo6Z2V0SWZFeGlzdHMpLmZpbHRlcihPYmplY3RzOjpub25OdWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChjZnMgLT4gY2ZzLmtleXNwYWNlLmdldE5hbWUoKSArICcuJyArIGNmcy5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RyZWFtUmVtYWluaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsQ29tcGFjdGlvbldyaXRlUmVtYWluaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFsbFdyaXRlRGF0YSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgc3RhdGljIGJvb2xlYW4gY2hlY2tQZW5kaW5nQ29tcGFjdGlvbnMoTWFwPFRhYmxlSWQsIExvbmc+IHBlclRhYmxlSWRJbmNvbWluZ0J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxUYWJsZUlkLCBJbnRlZ2VyPiBwZXJUYWJsZUlkSW5jb21pbmdGaWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVVVJRCBwbGFuSWQsIFN0cmluZyByZW1vdGVBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNGb3JJbmNyZW1lbnRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIG5ld1N0cmVhbVRvdGFsKQorICAgIHsKKworICAgICAgICBpbnQgcGVuZGluZ0NvbXBhY3Rpb25zQmVmb3JlU3RyZWFtaW5nID0gMDsKKyAgICAgICAgaW50IHBlbmRpbmdDb21wYWN0aW9uc0FmdGVyU3RyZWFtaW5nID0gMDsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHRhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PihwZXJUYWJsZUlkSW5jb21pbmdGaWxlcy5zaXplKCkpOworICAgICAgICBmb3IgKEtleXNwYWNlIGtzIDogS2V5c3BhY2UuYWxsKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1hcDxDb2x1bW5GYW1pbHlTdG9yZSwgVGFibGVJZD4gY2ZTdHJlYW1lZCA9IHBlclRhYmxlSWRJbmNvbWluZ0J5dGVzLmtleVNldCgpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoa3M6Omhhc0NvbHVtbkZhbWlseVN0b3JlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKGtzOjpnZXRDb2x1bW5GYW1pbHlTdG9yZSwgRnVuY3Rpb24uaWRlbnRpdHkoKSkpOworICAgICAgICAgICAgZm9yIChDb2x1bW5GYW1pbHlTdG9yZSBjZnMgOiBrcy5nZXRDb2x1bW5GYW1pbHlTdG9yZXMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyIGNzbSA9IGNmcy5nZXRDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyKCk7CisgICAgICAgICAgICAgICAgaW50IHRhc2tzT3RoZXIgPSBjc20uZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MoKTsKKyAgICAgICAgICAgICAgICBpbnQgdGFza3NTdHJlYW1lZCA9IHRhc2tzT3RoZXI7CisgICAgICAgICAgICAgICAgaWYgKGNmU3RyZWFtZWQuY29udGFpbnNLZXkoY2ZzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRhYmxlSWQgdGFibGVJZCA9IGNmU3RyZWFtZWQuZ2V0KGNmcyk7CisgICAgICAgICAgICAgICAgICAgIHRhc2tzU3RyZWFtZWQgPSBjc20uZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MocGVyVGFibGVJZEluY29taW5nRmlsZXMuZ2V0KHRhYmxlSWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlclRhYmxlSWRJbmNvbWluZ0J5dGVzLmdldCh0YWJsZUlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ZvckluY3JlbWVudGFsKTsKKyAgICAgICAgICAgICAgICAgICAgdGFibGVzLmFkZChTdHJpbmcuZm9ybWF0KCIlcy4lcyIsIGNmcy5rZXlzcGFjZS5nZXROYW1lKCksIGNmcy5uYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBlbmRpbmdDb21wYWN0aW9uc0JlZm9yZVN0cmVhbWluZyArPSB0YXNrc090aGVyOworICAgICAgICAgICAgICAgIHBlbmRpbmdDb21wYWN0aW9uc0FmdGVyU3RyZWFtaW5nICs9IHRhc2tzU3RyZWFtZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0YWJsZXMpOworICAgICAgICBpbnQgcGVuZGluZ1RocmVzaG9sZCA9IEFjdGl2ZVJlcGFpclNlcnZpY2UuaW5zdGFuY2UuZ2V0UmVwYWlyUGVuZGluZ0NvbXBhY3Rpb25SZWplY3RUaHJlc2hvbGQoKTsKKyAgICAgICAgaWYgKHBlbmRpbmdDb21wYWN0aW9uc0FmdGVyU3RyZWFtaW5nID4gcGVuZGluZ1RocmVzaG9sZCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJbU3RyZWFtICN7fV0gUmVqZWN0aW5nIGluY29taW5nIGZpbGVzIGJhc2VkIG9uIHBlbmRpbmcgY29tcGFjdGlvbnMgY2FsY3VsYXRpb24gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgInBlbmRpbmdDb21wYWN0aW9uc0JlZm9yZVN0cmVhbWluZz17fSBwZW5kaW5nQ29tcGFjdGlvbnNBZnRlclN0cmVhbWluZz17fSBwZW5kaW5nVGhyZXNob2xkPXt9IHJlbW90ZUFkZHJlc3M9e30iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5JZCwgcGVuZGluZ0NvbXBhY3Rpb25zQmVmb3JlU3RyZWFtaW5nLCBwZW5kaW5nQ29tcGFjdGlvbnNBZnRlclN0cmVhbWluZywgcGVuZGluZ1RocmVzaG9sZCwgcmVtb3RlQWRkcmVzcyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBsb25nIG5ld1N0cmVhbUZpbGVzID0gcGVyVGFibGVJZEluY29taW5nRmlsZXMudmFsdWVzKCkuc3RyZWFtKCkubWFwVG9JbnQoaSAtPiBpKS5zdW0oKTsKKworICAgICAgICBsb2dnZXIuaW5mbygiW1N0cmVhbSAje31dIEFjY2VwdGluZyBpbmNvbWluZyBmaWxlcyBuZXdTdHJlYW1Ub3RhbFNTVGFibGVzPXt9IG5ld1N0cmVhbVRvdGFsQnl0ZXM9e30gIiArCisgICAgICAgICAgICAgICAgICAgICJwZW5kaW5nQ29tcGFjdGlvbnNCZWZvcmVTdHJlYW1pbmc9e30gcGVuZGluZ0NvbXBhY3Rpb25zQWZ0ZXJTdHJlYW1pbmc9e30gcGVuZGluZ1RocmVzaG9sZD17fSByZW1vdGVBZGRyZXNzPXt9ICIgKworICAgICAgICAgICAgICAgICAgICAic3RyZWFtZWRUYWJsZXM9XCJ7fVwiIiwKKyAgICAgICAgICAgICAgICAgICAgcGxhbklkLCBuZXdTdHJlYW1GaWxlcywgbmV3U3RyZWFtVG90YWwsCisgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdDb21wYWN0aW9uc0JlZm9yZVN0cmVhbWluZywgcGVuZGluZ0NvbXBhY3Rpb25zQWZ0ZXJTdHJlYW1pbmcsIHBlbmRpbmdUaHJlc2hvbGQsIHJlbW90ZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5qb2luKCIsIiwgdGFibGVzKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgogICAgICAqIENhbGwgYmFjayBhZnRlciBzZW5kaW5nIFN0cmVhbU1lc3NhZ2VIZWFkZXIuCiAgICAgICoKICAgICAgKiBAcGFyYW0gbWVzc2FnZSBzZW50IHN0cmVhbSBtZXNzYWdlCkBAIC04MDIsNyArOTkxLDcgQEAKICAgICAgICAgU3RyZWFtVHJhbnNmZXJUYXNrIHRhc2sgPSB0cmFuc2ZlcnMuZ2V0KG1lc3NhZ2UuaGVhZGVyLnRhYmxlSWQpOwogICAgICAgICBpZiAodGFzayAhPSBudWxsKQogICAgICAgICB7Ci0gICAgICAgICAgICB0YXNrLnNjaGVkdWxlVGltZW91dChtZXNzYWdlLmhlYWRlci5zZXF1ZW5jZU51bWJlciwgMTIsIFRpbWVVbml0LkhPVVJTKTsKKyAgICAgICAgICAgIHRhc2suc2NoZWR1bGVUaW1lb3V0KG1lc3NhZ2UuaGVhZGVyLnNlcXVlbmNlTnVtYmVyLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U3RyZWFtVHJhbnNmZXJUYXNrVGltZW91dCgpLnRvTWlsbGlzZWNvbmRzKCksIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTkyOCw3ICsxMTE3LDkgQEAKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2Vzc2lvbkZhaWxlZCgpCiAgICAgewogICAgICAgICBsb2dnZXIuZXJyb3IoIltTdHJlYW0gI3t9XSBSZW1vdGUgcGVlciB7fSBmYWlsZWQgc3RyZWFtIHNlc3Npb24uIiwgcGxhbklkKCksIHBlZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIGNsb3NlU2Vzc2lvbihTdGF0ZS5GQUlMRUQpOworICAgICAgICBTdHJpbmdCdWlsZGVyIHN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiUmVtb3RlIHBlZXIgIikuYXBwZW5kKHBlZXIpLmFwcGVuZCgiIGZhaWxlZCBzdHJlYW0gc2Vzc2lvbiIpOworICAgICAgICBjbG9zZVNlc3Npb24oU3RhdGUuRkFJTEVELCBzdHJpbmdCdWlsZGVyLnRvU3RyaW5nKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTM3LDcgKzExMjgsNyBAQAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXNzaW9uVGltZW91dCgpCiAgICAgewogICAgICAgICBsb2dnZXIuZXJyb3IoIltTdHJlYW0gI3t9XSB0aW1lb3V0IHdpdGgge30uIiwgcGxhbklkKCksIHBlZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIGNsb3NlU2Vzc2lvbihTdGF0ZS5GQUlMRUQpOworICAgICAgICBjbG9zZVNlc3Npb24oU3RhdGUuRkFJTEVELCAiU2Vzc2lvbiB0aW1lZCBvdXQiKTsKICAgICB9CiAKICAgICAvKioKQEAgLTk1MSw3ICsxMTQyLDcgQEAKICAgICAgICAgTGlzdDxTdHJlYW1TdW1tYXJ5PiB0cmFuc2ZlclN1bW1hcmllcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOwogICAgICAgICBmb3IgKFN0cmVhbVRhc2sgdHJhbnNmZXIgOiB0cmFuc2ZlcnMudmFsdWVzKCkpCiAgICAgICAgICAgICB0cmFuc2ZlclN1bW1hcmllcy5hZGQodHJhbnNmZXIuZ2V0U3VtbWFyeSgpKTsKLSAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uSW5mbyhjaGFubmVsLnBlZXIoKSwgaW5kZXgsIGNoYW5uZWwuY29ubmVjdGVkVG8oKSwgcmVjZWl2aW5nU3VtbWFyaWVzLCB0cmFuc2ZlclN1bW1hcmllcywgc3RhdGUpOworICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25JbmZvKGNoYW5uZWwucGVlcigpLCBpbmRleCwgY2hhbm5lbC5jb25uZWN0ZWRUbygpLCByZWNlaXZpbmdTdW1tYXJpZXMsIHRyYW5zZmVyU3VtbWFyaWVzLCBzdGF0ZSwgZmFpbHVyZVJlYXNvbik7CiAgICAgfQogCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHRhc2tDb21wbGV0ZWQoU3RyZWFtUmVjZWl2ZVRhc2sgY29tcGxldGVkVGFzaykKQEAgLTk2NiwxOCArMTE1Nyw2IEBACiAgICAgICAgIG1heWJlQ29tcGxldGVkKCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgb25SZW1vdmUoSW5ldEFkZHJlc3NBbmRQb3J0IGVuZHBvaW50KQotICAgIHsKLSAgICAgICAgbG9nZ2VyLmVycm9yKCJbU3RyZWFtICN7fV0gU2Vzc2lvbiBmYWlsZWQgYmVjYXVzZSByZW1vdGUgcGVlciB7fSBoYXMgbGVmdC4iLCBwbGFuSWQoKSwgcGVlci50b1N0cmluZygpKTsKLSAgICAgICAgY2xvc2VTZXNzaW9uKFN0YXRlLkZBSUxFRCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25SZXN0YXJ0KEluZXRBZGRyZXNzQW5kUG9ydCBlbmRwb2ludCwgRW5kcG9pbnRTdGF0ZSBlcFN0YXRlKQotICAgIHsKLSAgICAgICAgbG9nZ2VyLmVycm9yKCJbU3RyZWFtICN7fV0gU2Vzc2lvbiBmYWlsZWQgYmVjYXVzZSByZW1vdGUgcGVlciB7fSB3YXMgcmVzdGFydGVkLiIsIHBsYW5JZCgpLCBwZWVyLnRvU3RyaW5nKCkpOwotICAgICAgICBjbG9zZVNlc3Npb24oU3RhdGUuRkFJTEVEKTsKLSAgICB9Ci0KICAgICBwcml2YXRlIHZvaWQgY29tcGxldGVQcmV2aWV3KCkKICAgICB7CiAgICAgICAgIHRyeQpAQCAtMTEzMCw3ICsxMzA5LDcgQEAKICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiW1N0cmVhbSAje31dIFN0cmVhbSBzZXNzaW9uIHdpdGggcGVlciB7fSBpcyBhbHJlYWR5IGluIGEgZmluYWwgc3RhdGUgb24gYWJvcnQuIiwgcGxhbklkKCksIHBlZXIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0KKyAgICAgICAgICAgIAogICAgICAgICBsb2dnZXIuaW5mbygiW1N0cmVhbSAje31dIEFib3J0aW5nIHN0cmVhbSBzZXNzaW9uIHdpdGggcGVlciB7fS4uLiIsIHBsYW5JZCgpLCBwZWVyKTsKIAogICAgICAgICBpZiAoY2hhbm5lbC5jb25uZWN0ZWQoKSkKQEAgLTExNDUsNCArMTMyNCw1MyBAQAogICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJbU3RyZWFtICN7fV0gRXJyb3IgYWJvcnRpbmcgc3RyZWFtIHNlc3Npb24gd2l0aCBwZWVyIHt9IiwgcGxhbklkKCksIHBlZXIpOwogICAgICAgICB9CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gIlN0cmVhbVNlc3Npb257IiArCisgICAgICAgICAgICAgICAic3RyZWFtT3BlcmF0aW9uPSIgKyBzdHJlYW1PcGVyYXRpb24gKworICAgICAgICAgICAgICAgIiwgcGVlcj0iICsgcGVlciArCisgICAgICAgICAgICAgICAiLCBjaGFubmVsPSIgKyBjaGFubmVsICsKKyAgICAgICAgICAgICAgICIsIHJlcXVlc3RzPSIgKyByZXF1ZXN0cyArCisgICAgICAgICAgICAgICAiLCB0cmFuc2ZlcnM9IiArIHRyYW5zZmVycyArCisgICAgICAgICAgICAgICAiLCBpc0ZvbGxvd2VyPSIgKyBpc0ZvbGxvd2VyICsKKyAgICAgICAgICAgICAgICIsIHBlbmRpbmdSZXBhaXI9IiArIHBlbmRpbmdSZXBhaXIgKworICAgICAgICAgICAgICAgIiwgcHJldmlld0tpbmQ9IiArIHByZXZpZXdLaW5kICsKKyAgICAgICAgICAgICAgICIsIHN0YXRlPSIgKyBzdGF0ZSArCisgICAgICAgICAgICAgICAnfSc7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdCdWlsZGVyIGJvdW5kU3RhY2tUcmFjZShUaHJvd2FibGUgZSwgaW50IGxpbWl0LCBTdHJpbmdCdWlsZGVyIG91dCkKKyAgICB7CisgICAgICAgIFNldDxUaHJvd2FibGU+IHZpc2l0ZWQgPSBDb2xsZWN0aW9ucy5uZXdTZXRGcm9tTWFwKG5ldyBJZGVudGl0eUhhc2hNYXA8PigpKTsKKyAgICAgICAgcmV0dXJuIGJvdW5kU3RhY2tUcmFjZShlLCBsaW1pdCwgbGltaXQsIHZpc2l0ZWQsIG91dCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdCdWlsZGVyIGJvdW5kU3RhY2tUcmFjZShUaHJvd2FibGUgZSwgaW50IGxpbWl0LCBpbnQgY291bnRlciwgU2V0PFRocm93YWJsZT4gdmlzaXRlZCwgU3RyaW5nQnVpbGRlciBvdXQpCisgICAgeworICAgICAgICBpZiAoZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG91dDsKKworICAgICAgICBpZiAoIXZpc2l0ZWQuYWRkKGUpKQorICAgICAgICAgICAgcmV0dXJuIG91dC5hcHBlbmQoIltDSVJDVUxBUiBSRUZFUkVOQ0U6ICIpLmFwcGVuZChlLmdldENsYXNzKCkuZ2V0TmFtZSgpKS5hcHBlbmQoIjogIikuYXBwZW5kKGUuZ2V0TWVzc2FnZSgpKS5hcHBlbmQoIl0iKS5hcHBlbmQoJ1xuJyk7CisgICAgICAgIHZpc2l0ZWQuYWRkKGUpOworCisgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50W10gc3RhY2tUcmFjZSA9IGUuZ2V0U3RhY2tUcmFjZSgpOworICAgICAgICBvdXQuYXBwZW5kKGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpLmFwcGVuZCgnXG4nKTsKKworICAgICAgICAvLyBXaGVuIGRlYWxpbmcgd2l0aCB0aGUgbGVhZiwgaWdub3JlIGhvdyBtYW55IHN0YWNrIHRyYWNlcyB3ZXJlIGFscmVhZHkgd3JpdHRlbiwgYW5kIGFsbG93IHRoZSBtYXguCisgICAgICAgIC8vIFRoaXMgaXMgaGVyZSBhcyB0aGUgbGVhZiB0ZW5kcyB0byBzaG93IHdoZXJlIHRoZSBpc3N1ZSBzdGFydGVkLCBzbyB0ZW5kcyB0byBiZSBpbXBhY3RmdWwgZm9yIGRlYnVnZ2luZworICAgICAgICBpZiAoZS5nZXRDYXVzZSgpID09IG51bGwpCisgICAgICAgICAgICBjb3VudGVyID0gbGltaXQ7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDAsIHNpemUgPSBNYXRoLm1pbihlLmdldFN0YWNrVHJhY2UoKS5sZW5ndGgsIGxpbWl0KTsgaSA8IHNpemUgJiYgY291bnRlciA+IDA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgb3V0LmFwcGVuZCgnXHQnKS5hcHBlbmQoc3RhY2tUcmFjZVtpXSkuYXBwZW5kKCdcbicpOworICAgICAgICAgICAgY291bnRlci0tOworICAgICAgICB9CisKKyAgICAgICAgYm91bmRTdGFja1RyYWNlKGUuZ2V0Q2F1c2UoKSwgbGltaXQsIGNvdW50ZXIsIHZpc2l0ZWQsIG91dCk7CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbVN0YXRlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtU3RhdGUuamF2YQppbmRleCA4OGViNzZkLi42OWJhNjk4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtU3RhdGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtU3RhdGUuamF2YQpAQCAtNTYsNCArNTYsOCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIExpc3RzLm5ld0FycmF5TGlzdChJdGVyYWJsZXMudHJhbnNmb3JtKHNlc3Npb25zLCBTZXNzaW9uSW5mbzo6Y3JlYXRlU3VtbWFyeSkpOwogICAgIH0KKworICAgIHB1YmxpYyBTZXQ8U2Vzc2lvbkluZm8+IHNlc3Npb25zKCkgeworICAgICAgICByZXR1cm4gc2Vzc2lvbnM7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbVRyYW5zZmVyVGFzay5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbVRyYW5zZmVyVGFzay5qYXZhCmluZGV4IDQ1ZmJjYzYuLjA3MjEzMTYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TdHJlYW1UcmFuc2ZlclRhc2suamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtVHJhbnNmZXJUYXNrLmphdmEKQEAgLTE0Myw4ICsxNDMsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBzdHJlYW1zLmNsZWFyKCk7Ci0gICAgICAgIGlmIChmYWlsICE9IG51bGwpCi0gICAgICAgICAgICBUaHJvd2FibGVzLnByb3BhZ2F0ZShmYWlsKTsKKyAgICAgICAgaWYgKGZhaWwgIT0gbnVsbCkgeworICAgICAgICAgICAgVGhyb3dhYmxlcy50aHJvd0lmVW5jaGVja2VkKGZhaWwpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZmFpbCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRUb3RhbE51bWJlck9mRmlsZXMoKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbWluZ1N0YXRlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtaW5nU3RhdGUuamF2YQppbmRleCBjMmVlZDFlLi5hYWVjZWIyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtaW5nU3RhdGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtaW5nU3RhdGUuamF2YQpAQCAtMzQsNiArMzQsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5JTWVhc3VyYWJsZU1lbW9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsLlNpbXBsZURhdGFTZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMubm9kZXRvb2wuZm9ybWF0dGVyLlRhYmxlQnVpbGRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jazsKQEAgLTQzLDExICs0NCwxMSBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlELkdlbmVyYXRvci5uZXh0VGltZVVVSUQ7CiAKLXB1YmxpYyBjbGFzcyBTdHJlYW1pbmdTdGF0ZSBpbXBsZW1lbnRzIFN0cmVhbUV2ZW50SGFuZGxlcgorcHVibGljIGNsYXNzIFN0cmVhbWluZ1N0YXRlIGltcGxlbWVudHMgU3RyZWFtRXZlbnRIYW5kbGVyLCBJTWVhc3VyYWJsZU1lbW9yeQogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTdHJlYW1pbmdTdGF0ZS5jbGFzcyk7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRUxFTUVOVF9TSVpFID0gT2JqZWN0U2l6ZXMubWVhc3VyZURlZXAobmV3IFN0cmVhbWluZ1N0YXRlKG5leHRUaW1lVVVJRCgpLCBTdHJlYW1PcGVyYXRpb24uT1RIRVIsIGZhbHNlKSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVNUFRZID0gT2JqZWN0U2l6ZXMubWVhc3VyZURlZXAobmV3IFN0cmVhbWluZ1N0YXRlKG5leHRUaW1lVVVJRCgpLCBTdHJlYW1PcGVyYXRpb24uT1RIRVIsIGZhbHNlKSk7CiAKICAgICBwdWJsaWMgZW51bSBTdGF0dXMKICAgICB7SU5JVCwgU1RBUlQsIFNVQ0NFU1MsIEZBSUxVUkV9CkBAIC03MCw2ICs3MSwxNCBAQAogICAgIC8vIEFQSSBmb3Igc3RhdGUgY2hhbmdlcwogICAgIHB1YmxpYyBmaW5hbCBQaGFzZSBwaGFzZSA9IG5ldyBQaGFzZSgpOwogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgdW5zaGFyZWRIZWFwU2l6ZSgpCisgICAgeworICAgICAgICBsb25nIGNvc3RPZlBlZXJzID0gcGVlcnMoKS5zaXplKCkgKiAoT2JqZWN0U2l6ZXMuSVBWNl9TT0NLRVRfQUREUkVTU19TSVpFICsgNDgpOyAvLyA0OCByZXByZXNlbnRzIHRoZSBkYXRhc3RydWN0dXJlIGNvc3QgY29tcHV0ZWQgYnkgdGhlIEpPTAorICAgICAgICBsb25nIGNvc3RPZkNvbXBsZXRlTWVzc2FnZSA9IE9iamVjdFNpemVzLnNpemVPZihjb21wbGV0ZU1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBjb3N0T2ZQZWVycyArIGNvc3RPZkNvbXBsZXRlTWVzc2FnZSArIEVNUFRZOworICAgIH0KKwogICAgIHB1YmxpYyBTdHJlYW1pbmdTdGF0ZShTdHJlYW1SZXN1bHRGdXR1cmUgcmVzdWx0KQogICAgIHsKICAgICAgICAgdGhpcyhyZXN1bHQucGxhbklkLCByZXN1bHQuc3RyZWFtT3BlcmF0aW9uLCByZXN1bHQuZ2V0Q29vcmRpbmF0b3IoKS5pc0ZvbGxvd2VyKCkpOwpAQCAtMTA0LDYgKzExMywxMSBAQAogICAgICAgICByZXR1cm4gdGhpcy5wZWVyczsKICAgICB9CiAKKyAgICBwdWJsaWMgU3RyaW5nIGNvbXBsZXRlTWVzc2FnZSgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZU1lc3NhZ2U7CisgICAgfQorCiAgICAgcHVibGljIFN0YXR1cyBzdGF0dXMoKQogICAgIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTI4Myw2ICsyOTcsOCBAQAogICAgIHsKICAgICAgICAgY29tcGxldGVNZXNzYWdlID0gVGhyb3dhYmxlcy5nZXRTdGFja1RyYWNlQXNTdHJpbmcodGhyb3dhYmxlKTsKICAgICAgICAgdXBkYXRlU3RhdGUoU3RhdHVzLkZBSUxVUkUpOworICAgICAgICAvL3dlIGtub3cgdGhlIHNpemUgaXMgbm93IHZlcnkgZGlmZmVyZW50IGZyb20gdGhlIGVzdGltYXRlIHNvIHJlY29tcHV0ZSBieSBhZGRpbmcgYWdhaW4KKyAgICAgICAgU3RyZWFtTWFuYWdlci5pbnN0YW5jZS5hZGRTdHJlYW1pbmdTdGF0ZUFnYWluKHRoaXMpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgdXBkYXRlU3RhdGUoU3RhdHVzIHN0YXRlKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL2FzeW5jL05ldHR5U3RyZWFtaW5nQ29ubmVjdGlvbkZhY3RvcnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9hc3luYy9OZXR0eVN0cmVhbWluZ0Nvbm5lY3Rpb25GYWN0b3J5LmphdmEKaW5kZXggNmE1N2UzOS4uNTI5YjM5NiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL2FzeW5jL05ldHR5U3RyZWFtaW5nQ29ubmVjdGlvbkZhY3RvcnkuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvYXN5bmMvTmV0dHlTdHJlYW1pbmdDb25uZWN0aW9uRmFjdG9yeS5qYXZhCkBAIC0yMCw2ICsyMCw5IEBACiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiAKQEAgLTM1LDcgKzM4LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbWluZ0NoYW5uZWw7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlBZGRyZXNzOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuSW50ZXJub2RlQ29ubmVjdGlvblV0aWxzLmlzU1NMRXJyb3I7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5PdXRib3VuZENvbm5lY3Rpb25Jbml0aWF0b3IuaW5pdGlhdGVTdHJlYW1pbmc7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5PdXRib3VuZENvbm5lY3Rpb25Jbml0aWF0b3IuU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk91dGJvdW5kQ29ubmVjdGlvbkluaXRpYXRvci5Tc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlLlNFUlZFUl9DT05GSUc7CiAKIHB1YmxpYyBjbGFzcyBOZXR0eVN0cmVhbWluZ0Nvbm5lY3Rpb25GYWN0b3J5IGltcGxlbWVudHMgU3RyZWFtaW5nQ2hhbm5lbC5GYWN0b3J5CiB7CkBAIC00NSwyNyArNTEsMzggQEAKICAgICBwdWJsaWMgc3RhdGljIE5ldHR5U3RyZWFtaW5nQ2hhbm5lbCBjb25uZWN0KE91dGJvdW5kQ29ubmVjdGlvblNldHRpbmdzIHRlbXBsYXRlLCBpbnQgbWVzc2FnaW5nVmVyc2lvbiwgU3RyZWFtaW5nQ2hhbm5lbC5LaW5kIGtpbmQpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgRXZlbnRMb29wIGV2ZW50TG9vcCA9IE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS5zb2NrZXRGYWN0b3J5Lm91dGJvdW5kU3RyZWFtaW5nR3JvdXAoKS5uZXh0KCk7CisgICAgICAgIE91dGJvdW5kQ29ubmVjdGlvblNldHRpbmdzIHNldHRpbmdzID0gdGVtcGxhdGUud2l0aERlZmF1bHRzKENvbm5lY3Rpb25DYXRlZ29yeS5TVFJFQU1JTkcpOworICAgICAgICBMaXN0PFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGU+IHNzbEZhbGxiYWNrcyA9IHNldHRpbmdzLndpdGhFbmNyeXB0aW9uKCkgJiYgc2V0dGluZ3MuZW5jcnlwdGlvbi5nZXRPcHRpb25hbCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBcnJheXMuYXNMaXN0KFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUudmFsdWVzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KFNFUlZFUl9DT05GSUcpOwogCi0gICAgICAgIGludCBhdHRlbXB0cyA9IDA7Ci0gICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBudWxsOworICAgICAgICBmb3IgKGZpbmFsIFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUgc3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZSA6IHNzbEZhbGxiYWNrcykKICAgICAgICAgewotICAgICAgICAgICAgRnV0dXJlPFJlc3VsdDxTdHJlYW1pbmdTdWNjZXNzPj4gcmVzdWx0ID0gaW5pdGlhdGVTdHJlYW1pbmcoZXZlbnRMb29wLCB0ZW1wbGF0ZS53aXRoRGVmYXVsdHMoQ29ubmVjdGlvbkNhdGVnb3J5LlNUUkVBTUlORyksIG1lc3NhZ2luZ1ZlcnNpb24pOwotICAgICAgICAgICAgcmVzdWx0LmF3YWl0VW5pbnRlcnJ1cHRpYmx5KCk7IC8vIGluaXRpYXRlIGhhcyBpdHMgb3duIHRpbWVvdXQsIHNvIHRoaXMgaXMgImd1YXJhbnRlZWQiIHRvIHJldHVybiByZWxhdGl2ZWx5IHByb21wdGx5Ci0gICAgICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTkVDVF9BVFRFTVBUUzsgaSsrKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENoYW5uZWwgY2hhbm5lbCA9IHJlc3VsdC5nZXROb3coKS5zdWNjZXNzKCkuY2hhbm5lbDsKLSAgICAgICAgICAgICAgICBOZXR0eVN0cmVhbWluZ0NoYW5uZWwgc3RyZWFtaW5nQ2hhbm5lbCA9IG5ldyBOZXR0eVN0cmVhbWluZ0NoYW5uZWwobWVzc2FnaW5nVmVyc2lvbiwgY2hhbm5lbCwga2luZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGtpbmQgPT0gU3RyZWFtaW5nQ2hhbm5lbC5LaW5kLkNPTlRST0wpCisgICAgICAgICAgICAgICAgRnV0dXJlPFJlc3VsdDxTdHJlYW1pbmdTdWNjZXNzPj4gcmVzdWx0ID0gaW5pdGlhdGVTdHJlYW1pbmcoZXZlbnRMb29wLCBzZXR0aW5ncywgc3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZSwgbWVzc2FnaW5nVmVyc2lvbik7CisgICAgICAgICAgICAgICAgcmVzdWx0LmF3YWl0VW5pbnRlcnJ1cHRpYmx5KCk7IC8vIGluaXRpYXRlIGhhcyBpdHMgb3duIHRpbWVvdXQsIHNvIHRoaXMgaXMgImd1YXJhbnRlZWQiIHRvIHJldHVybiByZWxhdGl2ZWx5IHByb21wdGx5CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENoYW5uZWxQaXBlbGluZSBwaXBlbGluZSA9IGNoYW5uZWwucGlwZWxpbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUuYWRkTGFzdCgic3RyZWFtIiwgc3RyZWFtaW5nQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgIENoYW5uZWwgY2hhbm5lbCA9IHJlc3VsdC5nZXROb3coKS5zdWNjZXNzKCkuY2hhbm5lbDsKKyAgICAgICAgICAgICAgICAgICAgTmV0dHlTdHJlYW1pbmdDaGFubmVsIHN0cmVhbWluZ0NoYW5uZWwgPSBuZXcgTmV0dHlTdHJlYW1pbmdDaGFubmVsKG1lc3NhZ2luZ1ZlcnNpb24sIGNoYW5uZWwsIGtpbmQpOworICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA9PSBTdHJlYW1pbmdDaGFubmVsLktpbmQuQ09OVFJPTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbFBpcGVsaW5lIHBpcGVsaW5lID0gY2hhbm5lbC5waXBlbGluZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUuYWRkTGFzdCgic3RyZWFtIiwgc3RyZWFtaW5nQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmVhbWluZ0NoYW5uZWw7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW1pbmdDaGFubmVsOworICAgICAgICAgICAgICAgIGNhdXNlID0gcmVzdWx0LmNhdXNlKCk7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgrK2F0dGVtcHRzID09IE1BWF9DT05ORUNUX0FUVEVNUFRTKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiZmFpbGVkIHRvIGNvbm5lY3QgdG8gIiArIHRlbXBsYXRlLnRvICsgIiBmb3Igc3RyZWFtaW5nIGRhdGEiLCByZXN1bHQuY2F1c2UoKSk7CisgICAgICAgICAgICBpZiAoIWlzU1NMRXJyb3IoY2F1c2UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrIG9ubHkgd2hlbiB0aGUgZXJyb3IgaXMgU1NMIHJlbGF0ZWQsIG90aGVyd2lzZSByZXRyaWVzIGFyZSBleGhhdXN0ZWQsIHNvIGZhaWwKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oImZhaWxlZCB0byBjb25uZWN0IHRvICIgKyB0ZW1wbGF0ZS50byArICIgZm9yIHN0cmVhbWluZyBkYXRhIiwgY2F1c2UpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL2FzeW5jL1N0cmVhbWluZ011bHRpcGxleGVkQ2hhbm5lbC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL2FzeW5jL1N0cmVhbWluZ011bHRpcGxleGVkQ2hhbm5lbC5qYXZhCmluZGV4IDU2MGZlZTkuLjRlYmIzOTEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9hc3luYy9TdHJlYW1pbmdNdWx0aXBsZXhlZENoYW5uZWwuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvYXN5bmMvU3RyZWFtaW5nTXVsdGlwbGV4ZWRDaGFubmVsLmphdmEKQEAgLTUzLDE0ICs1MywxMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuVW5jaGVja2VkSW50ZXJydXB0ZWRFeGNlcHRpb247CiAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzLmdldFJvb3RDYXVzZTsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLkludGVnZXIucGFyc2VJbnQ7CiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3lzdGVtLmdldFByb3BlcnR5OwogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuVGhyZWFkLmN1cnJlbnRUaHJlYWQ7CiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lio7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvckZhY3RvcnkuR2xvYmFsLmV4ZWN1dG9yRmFjdG9yeTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZy5QUk9QRVJUWV9QUkVGSVg7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU1RSRUFNSU5HX1NFU1NJT05fUEFSQUxMRUxUUkFOU0ZFUlM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1TZXNzaW9uLmNyZWF0ZUxvZ1RhZzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLm1lc3NhZ2VzLlN0cmVhbU1lc3NhZ2Uuc2VyaWFsaXplOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcubWVzc2FnZXMuU3RyZWFtTWVzc2FnZS5zZXJpYWxpemVkU2l6ZTsKQEAgLTkxLDcgKzg5LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU3RyZWFtaW5nTXVsdGlwbGV4ZWRDaGFubmVsLmNsYXNzKTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BWF9QQVJBTExFTF9UUkFOU0ZFUlMgPSBnZXRBdmFpbGFibGVQcm9jZXNzb3JzKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9QQVJBTExFTF9UUkFOU0ZFUlMgPSBwYXJzZUludChnZXRQcm9wZXJ0eShQUk9QRVJUWV9QUkVGSVggKyAic3RyZWFtaW5nLnNlc3Npb24ucGFyYWxsZWxUcmFuc2ZlcnMiLCBJbnRlZ2VyLnRvU3RyaW5nKERFRkFVTFRfTUFYX1BBUkFMTEVMX1RSQU5TRkVSUykpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1BBUkFMTEVMX1RSQU5TRkVSUyA9IFNUUkVBTUlOR19TRVNTSU9OX1BBUkFMTEVMVFJBTlNGRVJTLmdldEludChERUZBVUxUX01BWF9QQVJBTExFTF9UUkFOU0ZFUlMpOwogCiAgICAgLy8gYSBzaW1wbGUgbWVjaGFuc2ltIGZvciBhbGxvd2luZyBhIGRlZ3JlZSBvZiBmYWlybmVzcyBhY3Jvc3MgbXVsdGlwbGUgc2Vzc2lvbnMKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZW1hcGhvcmUgZmlsZVRyYW5zZmVyU2VtYXBob3JlID0gbmV3RmFpclNlbWFwaG9yZShERUZBVUxUX01BWF9QQVJBTExFTF9UUkFOU0ZFUlMpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL21hbmFnZW1lbnQvUHJvZ3Jlc3NJbmZvQ29tcG9zaXRlRGF0YS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL21hbmFnZW1lbnQvUHJvZ3Jlc3NJbmZvQ29tcG9zaXRlRGF0YS5qYXZhCmluZGV4IDcyYWI4NDQuLjM4ZmYzMWUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9tYW5hZ2VtZW50L1Byb2dyZXNzSW5mb0NvbXBvc2l0ZURhdGEuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvbWFuYWdlbWVudC9Qcm9ncmVzc0luZm9Db21wb3NpdGVEYXRhLmphdmEKQEAgLTIyLDggKzIyLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLio7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7Ci0KIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuUHJvZ3Jlc3NJbmZvOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwpAQCAtNjgsNyArNjYsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChPcGVuRGF0YUV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC05MSw3ICs4OSw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKE9wZW5EYXRhRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTExMCw3ICsxMDgsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL21hbmFnZW1lbnQvU2Vzc2lvbkNvbXBsZXRlRXZlbnRDb21wb3NpdGVEYXRhLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvbWFuYWdlbWVudC9TZXNzaW9uQ29tcGxldGVFdmVudENvbXBvc2l0ZURhdGEuamF2YQppbmRleCA2NjViNGNkLi4xYTZmZWE1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvbWFuYWdlbWVudC9TZXNzaW9uQ29tcGxldGVFdmVudENvbXBvc2l0ZURhdGEuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvbWFuYWdlbWVudC9TZXNzaW9uQ29tcGxldGVFdmVudENvbXBvc2l0ZURhdGEuamF2YQpAQCAtMjEsOCArMjEsNiBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uKjsKIAotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlczsKLQogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1FdmVudDsKIAogcHVibGljIGNsYXNzIFNlc3Npb25Db21wbGV0ZUV2ZW50Q29tcG9zaXRlRGF0YQpAQCAtNTMsNyArNTEsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChPcGVuRGF0YUV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC03MCw3ICs2OCw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKE9wZW5EYXRhRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvbWFuYWdlbWVudC9TZXNzaW9uSW5mb0NvbXBvc2l0ZURhdGEuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9tYW5hZ2VtZW50L1Nlc3Npb25JbmZvQ29tcG9zaXRlRGF0YS5qYXZhCmluZGV4IGYzOWIzMjEuLmVhYTM3YmIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9tYW5hZ2VtZW50L1Nlc3Npb25JbmZvQ29tcG9zaXRlRGF0YS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9tYW5hZ2VtZW50L1Nlc3Npb25JbmZvQ29tcG9zaXRlRGF0YS5qYXZhCkBAIC0yMiw3ICsyMiw2IEBACiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uKjsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CiAKQEAgLTgzLDcgKzgyLDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoT3BlbkRhdGFFeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5wcm9wYWdhdGUoZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTIxLDcgKzEyMCw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKE9wZW5EYXRhRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEzOCw3ICsxMzcsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgICAgIEZ1bmN0aW9uPENvbXBvc2l0ZURhdGEsIFN0cmVhbVN1bW1hcnk+IHRvU3RyZWFtU3VtbWFyeSA9IG5ldyBGdW5jdGlvbjxDb21wb3NpdGVEYXRhLCBTdHJlYW1TdW1tYXJ5PigpCiAgICAgICAgIHsKQEAgLTE1Miw3ICsxNTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUFycmF5T2ZDb21wb3NpdGVEYXRhKChDb21wb3NpdGVEYXRhW10pIHZhbHVlc1s1XSwgdG9TdHJlYW1TdW1tYXJ5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tQXJyYXlPZkNvbXBvc2l0ZURhdGEoKENvbXBvc2l0ZURhdGFbXSkgdmFsdWVzWzZdLCB0b1N0cmVhbVN1bW1hcnkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVNlc3Npb24uU3RhdGUudmFsdWVPZigoU3RyaW5nKSB2YWx1ZXNbN10pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1TZXNzaW9uLlN0YXRlLnZhbHVlT2YoKFN0cmluZykgdmFsdWVzWzddKSwgbnVsbCk7IC8vIG51bGwgaXMgaGVyZSB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQogICAgICAgICBGdW5jdGlvbjxDb21wb3NpdGVEYXRhLCBQcm9ncmVzc0luZm8+IHRvUHJvZ3Jlc3NJbmZvID0gbmV3IEZ1bmN0aW9uPENvbXBvc2l0ZURhdGEsIFByb2dyZXNzSW5mbz4oKQogICAgICAgICB7CiAgICAgICAgICAgICBwdWJsaWMgUHJvZ3Jlc3NJbmZvIGFwcGx5KENvbXBvc2l0ZURhdGEgaW5wdXQpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvbWFuYWdlbWVudC9TdHJlYW1TdGF0ZUNvbXBvc2l0ZURhdGEuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9tYW5hZ2VtZW50L1N0cmVhbVN0YXRlQ29tcG9zaXRlRGF0YS5qYXZhCmluZGV4IDVlZTRmMzIuLmMwNDIwNWYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9tYW5hZ2VtZW50L1N0cmVhbVN0YXRlQ29tcG9zaXRlRGF0YS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9tYW5hZ2VtZW50L1N0cmVhbVN0YXRlQ29tcG9zaXRlRGF0YS5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uKjsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwpAQCAtNjcsNyArNjYsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChPcGVuRGF0YUV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMTQsNyArMTEzLDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoT3BlbkRhdGFFeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5wcm9wYWdhdGUoZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL21hbmFnZW1lbnQvU3RyZWFtU3VtbWFyeUNvbXBvc2l0ZURhdGEuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9tYW5hZ2VtZW50L1N0cmVhbVN1bW1hcnlDb21wb3NpdGVEYXRhLmphdmEKaW5kZXggYTFmMjQ5Ni4uMDVhMGFmYyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL21hbmFnZW1lbnQvU3RyZWFtU3VtbWFyeUNvbXBvc2l0ZURhdGEuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvbWFuYWdlbWVudC9TdHJlYW1TdW1tYXJ5Q29tcG9zaXRlRGF0YS5qYXZhCkBAIC0yMSw4ICsyMSw2IEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi4qOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlSWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbVN1bW1hcnk7CiAKQEAgLTUzLDcgKzUxLDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoT3BlbkRhdGFFeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5wcm9wYWdhdGUoZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjksNyArNjcsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChPcGVuRGF0YUV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9Cb290c3RyYXBNb25pdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9Cb290c3RyYXBNb25pdG9yLmphdmEKaW5kZXggNGQ1ODYzOC4uMTJkYTU2ZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvQm9vdHN0cmFwTW9uaXRvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL0Jvb3RzdHJhcE1vbml0b3IuamF2YQpAQCAtMzQsNiArMzQsNyBAQAogICAgIHByaXZhdGUgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCBISDptbTpzcyxTU1MiKTsKICAgICBwcml2YXRlIGZpbmFsIFByaW50U3RyZWFtIG91dDsKICAgICBwcml2YXRlIGZpbmFsIENvbmRpdGlvbiBjb25kaXRpb24gPSBuZXdPbmVUaW1lQ29uZGl0aW9uKCk7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBFeGNlcHRpb24gZXJyb3I7CiAKICAgICBwdWJsaWMgQm9vdHN0cmFwTW9uaXRvcihQcmludFN0cmVhbSBvdXQpCiAgICAgewpAQCAtNjYsNyArNjcsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGhhbmRsZUNvbm5lY3Rpb25GYWlsZWQobG9uZyB0aW1lc3RhbXAsIFN0cmluZyBtZXNzYWdlKQogICAgIHsKLSAgICAgICAgRXhjZXB0aW9uIGVycm9yID0gbmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlslc10gSk1YIGNvbm5lY3Rpb24gY2xvc2VkLiAoJXMpIiwKKyAgICAgICAgZXJyb3IgPSBuZXcgSU9FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiWyVzXSBKTVggY29ubmVjdGlvbiBjbG9zZWQuICglcykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdC5mb3JtYXQodGltZXN0YW1wKSwgbWVzc2FnZSkpOwogICAgICAgICBvdXQucHJpbnRsbihlcnJvci5nZXRNZXNzYWdlKCkpOwogICAgICAgICBjb25kaXRpb24uc2lnbmFsQWxsKCk7CkBAIC04Miw5ICs4MywxOSBAQAogICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UgKyAiIChwcm9ncmVzczogIiArIChpbnQpZXZlbnQuZ2V0UHJvZ3Jlc3NQZXJjZW50YWdlKCkgKyAiJSkiOwogICAgICAgICB9CiAgICAgICAgIG91dC5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICBpZiAodHlwZSA9PSBQcm9ncmVzc0V2ZW50VHlwZS5FUlJPUikKKyAgICAgICAgeworICAgICAgICAgICAgZXJyb3IgPSBuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJCb290c3RyYXAgcmVzdW1lIGhhcyBmYWlsZWQgd2l0aCBlcnJvcjogJXMiLCBtZXNzYWdlKSk7CisgICAgICAgICAgICBjb25kaXRpb24uc2lnbmFsQWxsKCk7CisgICAgICAgIH0KICAgICAgICAgaWYgKHR5cGUgPT0gUHJvZ3Jlc3NFdmVudFR5cGUuQ09NUExFVEUpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbmRpdGlvbi5zaWduYWxBbGwoKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHB1YmxpYyBFeGNlcHRpb24gZ2V0RXJyb3IoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL0J1bGtMb2FkQ29ubmVjdGlvbkZhY3RvcnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL0J1bGtMb2FkQ29ubmVjdGlvbkZhY3RvcnkuamF2YQppbmRleCBlZWYwZWY0Li5iMjgyOTMyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9CdWxrTG9hZENvbm5lY3Rpb25GYWN0b3J5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvQnVsa0xvYWRDb25uZWN0aW9uRmFjdG9yeS5qYXZhCkBAIC01Myw3ICs1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdpbmdWZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1pbmdDaGFubmVsLktpbmQga2luZCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICAvLyBUaGUgcHJlZmVycmVkIGFkZHJlc3MgaXMgYWx3YXlzIG92ZXJ3cml0dGVuIGluIGNyZWF0ZSgpLiBUaGlzIG1ldGhvZCBvdmVycmlkZSBvbmx5IGV4aXN0cyBzbyB3ZSBjYW4gYXZvaWQgCisgICAgICAgIC8vIFRoZSBwcmVmZXJyZWQgYWRkcmVzcyBpcyBhbHdheXMgb3ZlcndyaXR0ZW4gaW4gY3JlYXRlKCkuIFRoaXMgbWV0aG9kIG92ZXJyaWRlIG9ubHkgZXhpc3RzIHNvIHdlIGNhbiBhdm9pZAogICAgICAgICAvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIE5ldHR5U3RyZWFtaW5nQ29ubmVjdGlvbkZhY3RvcnkgaW1wbGVtZW50YXRpb24uCiAgICAgICAgIE91dGJvdW5kQ29ubmVjdGlvblNldHRpbmdzIHRlbXBsYXRlID0gbmV3IE91dGJvdW5kQ29ubmVjdGlvblNldHRpbmdzKGdldEJ5QWRkcmVzcyh0byksIGdldEJ5QWRkcmVzcyhwcmVmZXJyZWQpKTsKICAgICAgICAgcmV0dXJuIGNyZWF0ZSh0ZW1wbGF0ZSwgbWVzc2FnaW5nVmVyc2lvbiwga2luZCk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9CdWxrTG9hZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9CdWxrTG9hZGVyLmphdmEKaW5kZXggZWJkZDA3Mi4uOGQ1YTFkNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvQnVsa0xvYWRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL0J1bGtMb2FkZXIuamF2YQpAQCAtNzIsNyArNzIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRTU0xPcHRpb25zKG9wdGlvbnMuY2xpZW50RW5jT3B0aW9ucykpLAogICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29ubmVjdGlvbnNQZXJIb3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50YXJnZXRLZXlzcGFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnRhcmdldEtleXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50YXJnZXRUYWJsZSk7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRTdHJlYW1UaHJvdWdocHV0T3V0Ym91bmRCeXRlc1BlclNlYyhvcHRpb25zLnRocm90dGxlQnl0ZXMpOwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0SW50ZXJEQ1N0cmVhbVRocm91Z2hwdXRPdXRib3VuZEJ5dGVzUGVyU2VjKG9wdGlvbnMuaW50ZXJEY1Rocm90dGxlQnl0ZXMpOwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0RW50aXJlU1NUYWJsZVN0cmVhbVRocm91Z2hwdXRPdXRib3VuZE1lYmlieXRlc1BlclNlYyhvcHRpb25zLmVudGlyZVNTVGFibGVUaHJvdHRsZU1lYmlieXRlcyk7CkBAIC05MCw3ICs5MSw2IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZnV0dXJlID0gbG9hZGVyLnN0cmVhbShvcHRpb25zLmlnbm9yZXMsIGluZGljYXRvcik7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgfQogICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL0dlbmVyYXRlVG9rZW5zLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9HZW5lcmF0ZVRva2Vucy5qYXZhCmluZGV4IGE2ODg4ZDcuLjU2MGE1M2YgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL0dlbmVyYXRlVG9rZW5zLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvR2VuZXJhdGVUb2tlbnMuamF2YQpAQCAtMjYsNyArMjYsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuT3B0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuT3B0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLlBhcnNlRXhjZXB0aW9uOwotCiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBjaC5xb3MubG9nYmFjay5jbGFzc2ljLkxldmVsOwpAQCAtMTA3LDcgKzEwNiw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQogICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIud2FybigiRXJyb3IgcnVubmluZyB0b29sLiIsIHQpOworICAgICAgICAgICAgbG9nZ2VyLndhcm4odCwgIkVycm9yIHJ1bm5pbmcgdG9vbC4iKTsKICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTUyLDUgKzE1MSw0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAiT3B0aW9ucyBhcmU6IjsKICAgICAgICAgbmV3IEhlbHBGb3JtYXR0ZXIoKS5wcmludEhlbHAodXNhZ2UsIGhlYWRlciwgb3B0aW9ucywgIiIpOwogICAgIH0KLX0KLQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL0hhc2hQYXNzd29yZC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvSGFzaFBhc3N3b3JkLmphdmEKaW5kZXggZGRjMGE3Mi4uZjIyOTg1OCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvSGFzaFBhc3N3b3JkLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvSGFzaFBhc3N3b3JkLmphdmEKQEAgLTU3LDcgKzU3LDcgQEAKICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCA9IG51bGw7CiAgICAgICAgICAgICBpZiAoY21kLmhhc09wdGlvbihFTlZfVkFSKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwYXNzd29yZCA9IFN5c3RlbS5nZXRlbnYoY21kLmdldE9wdGlvblZhbHVlKEVOVl9WQVIpKTsKKyAgICAgICAgICAgICAgICBwYXNzd29yZCA9IFN5c3RlbS5nZXRlbnYoY21kLmdldE9wdGlvblZhbHVlKEVOVl9WQVIpKTsgLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgbmVhcmJ5ICdibG9ja1N5c3RlbVByb3BlcnR5VXNhZ2UnCiAgICAgICAgICAgICAgICAgaWYgKHBhc3N3b3JkID09IG51bGwpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oU3RyaW5nLmZvcm1hdCgiRW52aXJvbm1lbnQgdmFyaWFibGUgJyVzJyBpcyB1bmRlZmluZWQuIiwgY21kLmdldE9wdGlvblZhbHVlKEVOVl9WQVIpKSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9KTVhUb29sLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9KTVhUb29sLmphdmEKaW5kZXggZDA1NDcxNi4uZGNjOWY2YSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvSk1YVG9vbC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL0pNWFRvb2wuamF2YQpAQCAtNjIsNyArNjIsNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0cy5TZXRWaWV3OwogCiBpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmUudHlwZS5UeXBlUmVmZXJlbmNlOwotaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CiBpbXBvcnQgaW8uYWlybGlmdC5haXJsaW5lLkFyZ3VtZW50czsKIGltcG9ydCBpby5haXJsaWZ0LmFpcmxpbmUuQ2xpOwogaW1wb3J0IGlvLmFpcmxpZnQuYWlybGluZS5Db21tYW5kOwpAQCAtNzEsNiArNzAsNyBAQAogaW1wb3J0IGlvLmFpcmxpZnQuYWlybGluZS5PcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUlucHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Kc29uVXRpbHM7CiBpbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLlR5cGVEZXNjcmlwdGlvbjsKIGltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuWWFtbDsKIGltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuY29uc3RydWN0b3IuQ29uc3RydWN0b3I7CkBAIC0xNTcsOCArMTU3LDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB2b2lkIGR1bXAoT3V0cHV0U3RyZWFtIG91dHB1dCwgTWFwPFN0cmluZywgSW5mbz4gbWFwKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1hcHBlci53cml0ZVZhbHVlKG91dHB1dCwgbWFwKTsKKyAgICAgICAgICAgICAgICAgICAgSnNvblV0aWxzLkpTT05fT0JKRUNUX1BSRVRUWV9XUklURVIud3JpdGVWYWx1ZShvdXRwdXQsIG1hcCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSwKICAgICAgICAgICAgIHlhbWwKQEAgLTM3Myw4ICszNzIsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIEluZm8+IGxvYWQoSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0TWFwcGVyIG1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcHBlci5yZWFkVmFsdWUoaW5wdXQsIG5ldyBUeXBlUmVmZXJlbmNlPE1hcDxTdHJpbmcsIEluZm8+PigpIHt9KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpzb25VdGlscy5KU09OX09CSkVDVF9NQVBQRVIucmVhZFZhbHVlKGlucHV0LCBuZXcgVHlwZVJlZmVyZW5jZTxNYXA8U3RyaW5nLCBJbmZvPj4oKSB7fSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSwKICAgICAgICAgICAgIHlhbWwKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL0xvYWRlck9wdGlvbnMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL0xvYWRlck9wdGlvbnMuamF2YQppbmRleCA3NzI5OTU1Li5lOWExZjhiIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9Mb2FkZXJPcHRpb25zLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvTG9hZGVyT3B0aW9ucy5qYXZhCkBAIC0yOSw3ICsyOSw2IEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5uZXQuSG9zdEFuZFBvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5Db21tYW5kTGluZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLkNvbW1hbmRMaW5lUGFyc2VyOwpAQCAtOTMsNiArOTIsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElSRV9TU1RBQkxFX0lOVEVSX0RDX1RIUk9UVExFX01FQklCWVRFUyA9ICJlbnRpcmUtc3N0YWJsZS1pbnRlci1kYy10aHJvdHRsZS1taWIiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xfTkFNRSA9ICJzc3RhYmxlbG9hZGVyIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfS0VZU1BBQ0UgPSAidGFyZ2V0LWtleXNwYWNlIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfVEFCTEUgPSAidGFyZ2V0LXRhYmxlIjsKIAogICAgIC8qIGNsaWVudCBlbmNyeXB0aW9uIG9wdGlvbnMgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0xfVFJVU1RTVE9SRSA9ICJ0cnVzdHN0b3JlIjsKQEAgLTEyNCw2ICsxMjQsNyBAQAogICAgIHB1YmxpYyBmaW5hbCBTZXQ8SW5ldFNvY2tldEFkZHJlc3M+IGhvc3RzOwogICAgIHB1YmxpYyBmaW5hbCBTZXQ8SW5ldEFkZHJlc3NBbmRQb3J0PiBpZ25vcmVzOwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgdGFyZ2V0S2V5c3BhY2U7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyB0YXJnZXRUYWJsZTsKIAogICAgIExvYWRlck9wdGlvbnMoQnVpbGRlciBidWlsZGVyKQogICAgIHsKQEAgLTE0Nyw2ICsxNDgsNyBAQAogICAgICAgICBob3N0cyA9IGJ1aWxkZXIuaG9zdHM7CiAgICAgICAgIGlnbm9yZXMgPSBidWlsZGVyLmlnbm9yZXM7CiAgICAgICAgIHRhcmdldEtleXNwYWNlID0gYnVpbGRlci50YXJnZXRLZXlzcGFjZTsKKyAgICAgICAgdGFyZ2V0VGFibGUgPSBidWlsZGVyLnRhcmdldFRhYmxlOwogICAgIH0KIAogICAgIHN0YXRpYyBjbGFzcyBCdWlsZGVyCkBAIC0xNzUsNiArMTc3LDcgQEAKICAgICAgICAgU2V0PEluZXRTb2NrZXRBZGRyZXNzPiBob3N0cyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgU2V0PEluZXRBZGRyZXNzQW5kUG9ydD4gaWdub3JlcyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgU3RyaW5nIHRhcmdldEtleXNwYWNlOworICAgICAgICBTdHJpbmcgdGFyZ2V0VGFibGU7CiAKICAgICAgICAgQnVpbGRlcigpCiAgICAgICAgIHsKQEAgLTE5OCw3ICsyMDEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGhyb3dhYmxlcy5wcm9wYWdhdGUoZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBuZXcgTG9hZGVyT3B0aW9ucyh0aGlzKTsKQEAgLTM4OSw2ICszOTIsMTggQEAKICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgdGFyZ2V0S2V5c3BhY2UoU3RyaW5nIGtleXNwYWNlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnRhcmdldEtleXNwYWNlID0ga2V5c3BhY2U7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHRhcmdldFRhYmxlKFN0cmluZyB0YWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50YXJnZXRLZXlzcGFjZSA9IHRhYmxlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgQnVpbGRlciBwYXJzZUFyZ3MoU3RyaW5nIGNtZEFyZ3NbXSkKICAgICAgICAgewogICAgICAgICAgICAgQ29tbWFuZExpbmVQYXJzZXIgcGFyc2VyID0gbmV3IEdudVBhcnNlcigpOwpAQCAtNjU3LDEwICs2NzIsMTYgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHRhcmdldEtleXNwYWNlID0gY21kLmdldE9wdGlvblZhbHVlKFRBUkdFVF9LRVlTUEFDRSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0JsYW5rKHRhcmdldEtleXNwYWNlKSkKLSAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNc2coIkVtcHR5IGtleXNwYWNlIGlzIG5vdCBzdXBwb3J0ZWQuIiwgb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY21kLmhhc09wdGlvbihUQVJHRVRfVEFCTEUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VGFibGUgPSBjbWQuZ2V0T3B0aW9uVmFsdWUoVEFSR0VUX1RBQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzQmxhbmsodGFyZ2V0VGFibGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNc2coIkVtcHR5IHRhYmxlIGlzIG5vdCBzdXBwb3J0ZWQuIiwgb3B0aW9ucyk7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoUGFyc2VFeGNlcHRpb24gfCBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCkBAIC03NzEsNiArNzkyLDcgQEAKICAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24oImNpcGhlcnMiLCBTU0xfQ0lQSEVSX1NVSVRFUywgIkNJUEhFUi1TVUlURVMiLCAiQ2xpZW50IFNTTDogY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZW5jcnlwdGlvbiBzdWl0ZXMgdG8gdXNlIik7CiAgICAgICAgIG9wdGlvbnMuYWRkT3B0aW9uKCJmIiwgQ09ORklHX1BBVEgsICJwYXRoIHRvIGNvbmZpZyBmaWxlIiwgImNhc3NhbmRyYS55YW1sIGZpbGUgcGF0aCBmb3Igc3RyZWFtaW5nIHRocm91Z2hwdXQgYW5kIGNsaWVudC9zZXJ2ZXIgU1NMLiIpOwogICAgICAgICBvcHRpb25zLmFkZE9wdGlvbigiayIsIFRBUkdFVF9LRVlTUEFDRSwgInRhcmdldCBrZXlzcGFjZSBuYW1lIiwgInRhcmdldCBrZXlzcGFjZSBuYW1lIik7CisgICAgICAgIG9wdGlvbnMuYWRkT3B0aW9uKCJ0YiIsIFRBUkdFVF9UQUJMRSwgInRhcmdldCB0YWJsZSBuYW1lIiwgInRhcmdldCB0YWJsZSBuYW1lIik7CiAgICAgICAgIHJldHVybiBvcHRpb25zOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvTm9kZVByb2JlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9Ob2RlUHJvYmUuamF2YQppbmRleCA0YTJmNDNkLi5lMzBlYmQ1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9Ob2RlUHJvYmUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9Ob2RlUHJvYmUuamF2YQpAQCAtMTE1LDYgKzExNSw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMubm9kZXRvb2wuR2V0VGltZW91dDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5OYXRpdmVMaWJyYXJ5OwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTk9ERVRPT0xfSk1YX05PVElGSUNBVElPTl9QT0xMX0lOVEVSVkFMX1NFQ09ORFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU1NMX0VOQUJMRTsKKwogLyoqCiAgKiBKTVggY2xpZW50IG9wZXJhdGlvbnMgZm9yIENhc3NhbmRyYS4KICAqLwpAQCAtMTI0LDcgKzEyNyw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNzT2JqTmFtZSA9ICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjp0eXBlPVN0b3JhZ2VTZXJ2aWNlIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZGVmYXVsdFBvcnQgPSA3MTk5OwogCi0gICAgc3RhdGljIGxvbmcgSk1YX05PVElGSUNBVElPTl9QT0xMX0lOVEVSVkFMX1NFQ09ORFMgPSBMb25nLmdldExvbmcoImNhc3NhbmRyYS5ub2RldG9vbC5qbXhfbm90aWZpY2F0aW9uX3BvbGxfaW50ZXJ2YWxfc2Vjb25kcyIsIFRpbWVVbml0LlNFQ09ORFMuY29udmVydCg1LCBUaW1lVW5pdC5NSU5VVEVTKSk7CisgICAgc3RhdGljIGxvbmcgSk1YX05PVElGSUNBVElPTl9QT0xMX0lOVEVSVkFMX1NFQ09ORFMgPSBOT0RFVE9PTF9KTVhfTk9USUZJQ0FUSU9OX1BPTExfSU5URVJWQUxfU0VDT05EUy5nZXRMb25nKCk7CiAKICAgICBmaW5hbCBTdHJpbmcgaG9zdDsKICAgICBmaW5hbCBpbnQgcG9ydDsKQEAgLTI5Myw3ICsyOTYsNyBAQAogCiAgICAgcHJpdmF0ZSBSTUlDbGllbnRTb2NrZXRGYWN0b3J5IGdldFJNSUNsaWVudFNvY2tldEZhY3RvcnkoKQogICAgIHsKLSAgICAgICAgaWYgKEJvb2xlYW4ucGFyc2VCb29sZWFuKFN5c3RlbS5nZXRQcm9wZXJ0eSgic3NsLmVuYWJsZSIpKSkKKyAgICAgICAgaWYgKFNTTF9FTkFCTEUuZ2V0Qm9vbGVhbigpKQogICAgICAgICAgICAgcmV0dXJuIG5ldyBTc2xSTUlDbGllbnRTb2NrZXRGYWN0b3J5KCk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHJldHVybiBSTUlTb2NrZXRGYWN0b3J5LmdldERlZmF1bHRTb2NrZXRGYWN0b3J5KCk7CkBAIC00NjAsNiArNDYzLDExIEBACiAgICAgICAgIHNzUHJveHkuZm9yY2VLZXlzcGFjZUNvbXBhY3Rpb25Gb3JQYXJ0aXRpb25LZXkoa2V5c3BhY2VOYW1lLCBwYXJ0aXRpb25LZXksIHRhYmxlTmFtZXMpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIGZvcmNlQ29tcGFjdGlvbktleXNJZ25vcmluZ0djR3JhY2UoU3RyaW5nIGtleXNwYWNlTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSwgU3RyaW5nLi4uIHBhcnRpdGlvbktleXNJZ25vcmVHY0dyYWNlKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHNzUHJveHkuZm9yY2VDb21wYWN0aW9uS2V5c0lnbm9yaW5nR2NHcmFjZShrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZSwgcGFydGl0aW9uS2V5c0lnbm9yZUdjR3JhY2UpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGZvcmNlS2V5c3BhY2VGbHVzaChTdHJpbmcga2V5c3BhY2VOYW1lLCBTdHJpbmcuLi4gdGFibGVOYW1lcykgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCiAgICAgewogICAgICAgICBzc1Byb3h5LmZvcmNlS2V5c3BhY2VGbHVzaChrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZXMpOwpAQCAtNDk4LDkgKzUwNiwyOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PENvbXBvc2l0ZURhdGE+PiBnZXRQYXJ0aXRpb25TYW1wbGUoaW50IGNhcGFjaXR5LCBpbnQgZHVyYXRpb25NaWxsaXMsIGludCBjb3VudCwgTGlzdDxTdHJpbmc+IHNhbXBsZXJzKSB0aHJvd3MgT3BlbkRhdGFFeGNlcHRpb24KKworICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZVNjaGVkdWxlZFNhbXBsaW5nKFN0cmluZyBrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHVyYXRpb25NaWxsaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGludGVydmFsTWlsbGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBzYW1wbGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNob3VsZFN0b3ApIHRocm93cyBPcGVuRGF0YUV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgcmV0dXJuIHNzUHJveHkuc2FtcGxlUGFydGl0aW9ucyhkdXJhdGlvbk1pbGxpcywgY2FwYWNpdHksIGNvdW50LCBzYW1wbGVycyk7CisgICAgICAgIHJldHVybiBzaG91bGRTdG9wID8KKyAgICAgICAgICAgICAgIHNzUHJveHkuc3RvcFNhbXBsaW5nUGFydGl0aW9ucyhrcywgdGFibGUpIDoKKyAgICAgICAgICAgICAgIHNzUHJveHkuc3RhcnRTYW1wbGluZ1BhcnRpdGlvbnMoa3MsIHRhYmxlLCBkdXJhdGlvbk1pbGxpcywgaW50ZXJ2YWxNaWxsaXMsIGNhcGFjaXR5LCBjb3VudCwgc2FtcGxlcnMpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0U2FtcGxlVGFza3MoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNzUHJveHkuZ2V0U2FtcGxlVGFza3MoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxDb21wb3NpdGVEYXRhPj4gZ2V0UGFydGl0aW9uU2FtcGxlKFN0cmluZyBrcywgaW50IGNhcGFjaXR5LCBpbnQgZHVyYXRpb25NaWxsaXMsIGludCBjb3VudCwgTGlzdDxTdHJpbmc+IHNhbXBsZXJzKSB0aHJvd3MgT3BlbkRhdGFFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBzc1Byb3h5LnNhbXBsZVBhcnRpdGlvbnMoa3MsIGR1cmF0aW9uTWlsbGlzLCBjYXBhY2l0eSwgY291bnQsIHNhbXBsZXJzKTsKICAgICB9CiAKICAgICBwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxDb21wb3NpdGVEYXRhPj4gZ2V0UGFydGl0aW9uU2FtcGxlKFN0cmluZyBrcywgU3RyaW5nIGNmLCBpbnQgY2FwYWNpdHksIGludCBkdXJhdGlvbk1pbGxpcywgaW50IGNvdW50LCBMaXN0PFN0cmluZz4gc2FtcGxlcnMpIHRocm93cyBPcGVuRGF0YUV4Y2VwdGlvbgpAQCAtNzUwLDExICs3NzgsMjEgQEAKICAgICAgICAgcmV0dXJuIHNzUHJveHkuZ2V0TG9hZFN0cmluZygpOwogICAgIH0KIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5jb21wcmVzc2VkTG9hZFN0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gc3NQcm94eS5nZXRVbmNvbXByZXNzZWRMb2FkU3RyaW5nKCk7CisgICAgfQorCiAgICAgcHVibGljIFN0cmluZyBnZXRSZWxlYXNlVmVyc2lvbigpCiAgICAgewogICAgICAgICByZXR1cm4gc3NQcm94eS5nZXRSZWxlYXNlVmVyc2lvbigpOwogICAgIH0KIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0R2l0U0hBKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzc1Byb3h5LmdldEdpdFNIQSgpOworICAgIH0KKwogICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudEdlbmVyYXRpb25OdW1iZXIoKQogICAgIHsKICAgICAgICAgcmV0dXJuIHNzUHJveHkuZ2V0Q3VycmVudEdlbmVyYXRpb25OdW1iZXIoKTsKQEAgLTgyNywxMSArODY1LDMxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlIGFsbCB0aGUgZXhpc3Rpbmcgc25hcHNob3RzLgorICAgICAqIFJlbW92ZSBhbGwgdGhlIGV4aXN0aW5nIHNuYXBzaG90cyBvZiBnaXZlbiB0YWcgZm9yIHByb3ZpZGVkIGtleXNwYWNlcy4KKyAgICAgKiBXaGVuIG5vIGtleXNwYWNlcyBhcmUgc3BlY2lmaWVkLCB0YWtlIGFsbCBrZXlzcGFjZXMgaW50byBhY2NvdW50LiBXaGVuIHRhZyBpcyBub3Qgc3BlY2lmaWVkIChudWxsIG9yIGVtcHR5IHN0cmluZyksCisgICAgICogdGFrZSBhbGwgdGFncyBpbnRvIGFjY291bnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFnIHRhZyBvZiBzbmFwc2hvdCB0byBjbGVhcgorICAgICAqIEBwYXJhbSBrZXlzcGFjZXMga2V5c3BhY2VzIHRvIGNsZWFyIHNuYXBzaG90cyBmb3IKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIGNsZWFyU25hcHNob3QoU3RyaW5nIHRhZywgU3RyaW5nLi4uIGtleXNwYWNlcykgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBzc1Byb3h5LmNsZWFyU25hcHNob3QodGFnLCBrZXlzcGFjZXMpOworICAgICAgICBjbGVhclNuYXBzaG90KENvbGxlY3Rpb25zLmVtcHR5TWFwKCksIHRhZywga2V5c3BhY2VzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYWxsIHRoZSBleGlzdGluZyBzbmFwc2hvdHMgb2YgZ2l2ZW4gdGFnIGZvciBwcm92aWRlZCBrZXlzcGFjZXMuCisgICAgICogV2hlbiBubyBrZXlzcGFjZXMgYXJlIHNwZWNpZmllZCwgdGFrZSBhbGwga2V5c3BhY2VzIGludG8gYWNjb3VudC4gV2hlbiB0YWcgaXMgbm90IHNwZWNpZmllZCAobnVsbCBvciBlbXB0eSBzdHJpbmcpLAorICAgICAqIHRha2UgYWxsIHRhZ3MgaW50byBhY2NvdW50LgorICAgICAqCisgICAgICogQHBhcmFtIG9wdGlvbnMgb3B0aW9ucyB0byBzdXBwbHkgZm9yIHNuYXBzaG90IGNsZWFyaW5nCisgICAgICogQHBhcmFtIHRhZyB0YWcgb2Ygc25hcHNob3QgdG8gY2xlYXIKKyAgICAgKiBAcGFyYW0ga2V5c3BhY2VzIGtleXNwYWNlcyB0byBjbGVhciBzbmFwc2hvdHMgZm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJTbmFwc2hvdChNYXA8U3RyaW5nLCBPYmplY3Q+IG9wdGlvbnMsIFN0cmluZyB0YWcsIFN0cmluZy4uLiBrZXlzcGFjZXMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgc3NQcm94eS5jbGVhclNuYXBzaG90KG9wdGlvbnMsIHRhZywga2V5c3BhY2VzKTsKICAgICB9CiAKICAgICBwdWJsaWMgTWFwPFN0cmluZywgVGFidWxhckRhdGE+IGdldFNuYXBzaG90RGV0YWlscyhNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnMpCkBAIC05ODksNiArMTA0NywxOCBAQAogICAgICAgICByZXR1cm4gY2ZzUHJveHkuZ2V0U1NUYWJsZXNGb3JLZXkoa2V5LCBoZXhGb3JtYXQpOwogICAgIH0KIAorICAgIHB1YmxpYyBNYXA8SW50ZWdlciwgU2V0PFN0cmluZz4+IGdldFNTVGFibGVzV2l0aExldmVsKFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIGNmLCBTdHJpbmcga2V5LCBib29sZWFuIGhleEZvcm1hdCkKKyAgICB7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlTUJlYW4gY2ZzUHJveHkgPSBnZXRDZnNQcm94eShrZXlzcGFjZSwgY2YpOworICAgICAgICByZXR1cm4gY2ZzUHJveHkuZ2V0U1NUYWJsZXNGb3JLZXlXaXRoTGV2ZWwoa2V5LCBoZXhGb3JtYXQpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTGV2ZWxlZENvbXBhY3Rpb24oU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgY2YpCisgICAgeworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZU1CZWFuIGNmc1Byb3h5ID0gZ2V0Q2ZzUHJveHkoa2V5c3BhY2UsIGNmKTsKKyAgICAgICAgcmV0dXJuIGNmc1Byb3h5LmlzTGV2ZWxlZENvbXBhY3Rpb24oKTsKKyAgICB9CisKICAgICBwdWJsaWMgU2V0PFN0cmVhbVN0YXRlPiBnZXRTdHJlYW1TdGF0dXMoKQogICAgIHsKICAgICAgICAgcmV0dXJuIFNldHMubmV3SGFzaFNldChJdGVyYWJsZXMudHJhbnNmb3JtKHN0cmVhbVByb3h5LmdldEN1cnJlbnRTdHJlYW1zKCksIG5ldyBGdW5jdGlvbjxDb21wb3NpdGVEYXRhLCBTdHJlYW1TdGF0ZT4oKQpAQCAtMTUzNCw5ICsxNjA0LDkgQEAKICAgICAgICAgcmV0dXJuIHdpdGhQb3J0ID8gc3NQcm94eS5kZXNjcmliZVJpbmdXaXRoUG9ydEpNWChrZXlzcGFjZU5hbWUpIDogc3NQcm94eS5kZXNjcmliZVJpbmdKTVgoa2V5c3BhY2VOYW1lKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCByZWJ1aWxkKFN0cmluZyBzb3VyY2VEYywgU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdG9rZW5zLCBTdHJpbmcgc3BlY2lmaWNTb3VyY2VzKQorICAgIHB1YmxpYyB2b2lkIHJlYnVpbGQoU3RyaW5nIHNvdXJjZURjLCBTdHJpbmcga2V5c3BhY2UsIFN0cmluZyB0b2tlbnMsIFN0cmluZyBzcGVjaWZpY1NvdXJjZXMsIGJvb2xlYW4gZXhjbHVkZUxvY2FsRGF0YWNlbnRlck5vZGVzKQogICAgIHsKLSAgICAgICAgc3NQcm94eS5yZWJ1aWxkKHNvdXJjZURjLCBrZXlzcGFjZSwgdG9rZW5zLCBzcGVjaWZpY1NvdXJjZXMpOworICAgICAgICBzc1Byb3h5LnJlYnVpbGQoc291cmNlRGMsIGtleXNwYWNlLCB0b2tlbnMsIHNwZWNpZmljU291cmNlcywgZXhjbHVkZUxvY2FsRGF0YWNlbnRlck5vZGVzKTsKICAgICB9CiAKICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHNhbXBsZUtleVJhbmdlKCkKQEAgLTE3NjksNiArMTgzOSw4IEBACiAgICAgICAgICAgICAgICAgY2FzZSAiRXN0aW1hdGVkUGFydGl0aW9uQ291bnQiOgogICAgICAgICAgICAgICAgIGNhc2UgIktleUNhY2hlSGl0UmF0ZSI6CiAgICAgICAgICAgICAgICAgY2FzZSAiTGl2ZVNTVGFibGVDb3VudCI6CisgICAgICAgICAgICAgICAgY2FzZSAiTWF4U1NUYWJsZUR1cmF0aW9uIjoKKyAgICAgICAgICAgICAgICBjYXNlICJNYXhTU1RhYmxlU2l6ZSI6CiAgICAgICAgICAgICAgICAgY2FzZSAiT2xkVmVyc2lvblNTVGFibGVDb3VudCI6CiAgICAgICAgICAgICAgICAgY2FzZSAiTWF4UGFydGl0aW9uU2l6ZSI6CiAgICAgICAgICAgICAgICAgY2FzZSAiTWVhblBhcnRpdGlvblNpemUiOgpAQCAtMTk4OSw2ICsyMDYxLDggQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiUmVzdW1pbmcgYm9vdHN0cmFwIik7CiAgICAgICAgICAgICAgICAgbW9uaXRvci5hd2FpdENvbXBsZXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAobW9uaXRvci5nZXRFcnJvcigpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG1vbml0b3IuZ2V0RXJyb3IoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL05vZGVUb29sLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9Ob2RlVG9vbC5qYXZhCmluZGV4IDhkODdjODguLjU1MDAyNDAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL05vZGVUb29sLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvTm9kZVRvb2wuamF2YQpAQCAtNDUsNiArNDUsOCBAQAogaW1wb3J0IGphdmEudXRpbC5TY2FubmVyOwogaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7CiAKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lkluc3RhbmNlTm90Rm91bmRFeGNlcHRpb247CisKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcjsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7CiAKQEAgLTIyNSw3ICsyMjcsOCBAQAogICAgICAgICAgICAgICAgIFVwZ3JhZGVTU1RhYmxlLmNsYXNzLAogICAgICAgICAgICAgICAgIFZlcmlmeS5jbGFzcywKICAgICAgICAgICAgICAgICBWZXJzaW9uLmNsYXNzLAotICAgICAgICAgICAgICAgIFZpZXdCdWlsZFN0YXR1cy5jbGFzcworICAgICAgICAgICAgICAgIFZpZXdCdWlsZFN0YXR1cy5jbGFzcywKKyAgICAgICAgICAgICAgICBGb3JjZUNvbXBhY3QuY2xhc3MKICAgICAgICAgKTsKIAogICAgICAgICBDbGkuQ2xpQnVpbGRlcjxOb2RlVG9vbENtZFJ1bm5hYmxlPiBidWlsZGVyID0gQ2xpLmJ1aWxkZXIoIm5vZGV0b29sIik7CkBAIC0zMDYsNiArMzA5LDEwIEBACiAKICAgICBwcm90ZWN0ZWQgdm9pZCBlcnIoVGhyb3dhYmxlIGUpCiAgICAgeworICAgICAgICAvLyBDQVNTQU5EUkEtMTE1Mzc6IGZyaWVuZGx5IGVycm9yIG1lc3NhZ2Ugd2hlbiBzZXJ2ZXIgaXMgbm90IHJlYWR5CisgICAgICAgIGlmIChlIGluc3RhbmNlb2YgSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNlcnZlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LCBjYW5ub3QgcnVuIG5vZGV0b29sLiIpOworCiAgICAgICAgIG91dHB1dC5lcnIucHJpbnRsbigiZXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgIG91dHB1dC5lcnIucHJpbnRsbigiLS0gU3RhY2tUcmFjZSAtLSIpOwogICAgICAgICBvdXRwdXQuZXJyLnByaW50bG4oZ2V0U3RhY2tUcmFjZUFzU3RyaW5nKGUpKTsKQEAgLTQ4NCw2ICs0OTEsMTEgQEAKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIGNtZEFyZ3Muc2l6ZSgpIDw9IDEgPyBFTVBUWV9TVFJJTkdfQVJSQVkgOiB0b0FycmF5KGNtZEFyZ3Muc3ViTGlzdCgxLCBjbWRBcmdzLnNpemUoKSksIFN0cmluZy5jbGFzcyk7CiAgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gcGFyc2VQYXJ0aXRpb25LZXlzKExpc3Q8U3RyaW5nPiBjbWRBcmdzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY21kQXJncy5zaXplKCkgPD0gMiA/IEVNUFRZX1NUUklOR19BUlJBWSA6IHRvQXJyYXkoY21kQXJncy5zdWJMaXN0KDIsIGNtZEFyZ3Muc2l6ZSgpKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgU29ydGVkTWFwPFN0cmluZywgU2V0SG9zdFN0YXRXaXRoUG9ydD4gZ2V0T3duZXJzaGlwQnlEY1dpdGhQb3J0KE5vZGVQcm9iZSBwcm9iZSwgYm9vbGVhbiByZXNvbHZlSXAsCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlRXhwaXJlZEJsb2NrZXJzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlRXhwaXJlZEJsb2NrZXJzLmphdmEKaW5kZXggZjVkMjRlZC4uMDRkNzdhOSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZUV4cGlyZWRCbG9ja2Vycy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVFeHBpcmVkQmxvY2tlcnMuamF2YQpAQCAtMjYsMTQgKzI2LDE1IEBACiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5BcnJheUxpc3RNdWx0aW1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpbWFwOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwuY3VycmVudFRpbWVNaWxsaXM7CiAKQEAgLTc0LDEyICs3NSwxMiBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXIgPSBTU1RhYmxlUmVhZGVyLm9wZW4oc3N0YWJsZS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgcmVhZGVyID0gU1NUYWJsZVJlYWRlci5vcGVuKGNmcywgc3N0YWJsZS5nZXRLZXkoKSk7CiAgICAgICAgICAgICAgICAgICAgIHNzdGFibGVzLmFkZChyZWFkZXIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiQ291bGRuJ3Qgb3BlbiBzc3RhYmxlOiAiICsgc3N0YWJsZS5nZXRLZXkoKS5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkrIiAoIit0LmdldE1lc3NhZ2UoKSsiKSIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiQ291bGRuJ3Qgb3BlbiBzc3RhYmxlOiAiICsgc3N0YWJsZS5nZXRLZXkoKS5maWxlRm9yKENvbXBvbmVudHMuREFUQSkgKyAiICgiICsgdC5nZXRNZXNzYWdlKCkgKyAiKSIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZUV4cG9ydC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZUV4cG9ydC5qYXZhCmluZGV4IDc3MTM4MGIuLmRhOTI5OGEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVFeHBvcnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlRXhwb3J0LmphdmEKQEAgLTI1LDggKzI1LDE0IEBACiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuQ29tbWFuZExpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5Db21tYW5kTGluZVBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLkhlbHBGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5PcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5PcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5Qb3NpeFBhcnNlcjsKKwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlBhcnRpdGlvblBvc2l0aW9uOwpAQCAtMzksMTMgKzQ1LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklTU1RhYmxlU2Nhbm5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLktleUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5Db21tYW5kTGluZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLkNvbW1hbmRMaW5lUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuSGVscEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLk9wdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLlBvc2l4UGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIApAQCAtNzEsNyArNzIsNyBAQAogCiAgICAgc3RhdGljCiAgICAgewotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuY2xpZW50SW5pdGlhbGl6YXRpb24oKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnRvb2xJbml0aWFsaXphdGlvbigpOwogCiAgICAgICAgIE9wdGlvbiBvcHRLZXkgPSBuZXcgT3B0aW9uKEtFWV9PUFRJT04sIHRydWUsICJMaXN0IG9mIGluY2x1ZGVkIHBhcnRpdGlvbiBrZXlzIik7CiAgICAgICAgIC8vIE51bWJlciBvZiB0aW1lcyAtayA8a2V5PiBjYW4gYmUgcGFzc2VkIG9uIHRoZSBjb21tYW5kIGxpbmUuCkBAIC0xMzUsMjAgKzEzNiwyMSBAQAogICAgICAgICAgICAgcHJpbnRVc2FnZSgpOwogICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHNzVGFibGVGaWxlTmFtZSA9IG5ldyBGaWxlKGNtZC5nZXRBcmdzKClbMF0pLmFic29sdXRlUGF0aCgpOworICAgICAgICBGaWxlIHNzVGFibGVGaWxlID0gbmV3IEZpbGUoY21kLmdldEFyZ3MoKVswXSk7CiAKLSAgICAgICAgaWYgKCFuZXcgRmlsZShzc1RhYmxlRmlsZU5hbWUpLmV4aXN0cygpKQorICAgICAgICBpZiAoIXNzVGFibGVGaWxlLmV4aXN0cygpKQogICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNhbm5vdCBmaW5kIGZpbGUgIiArIHNzVGFibGVGaWxlTmFtZSk7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNhbm5vdCBmaW5kIGZpbGUgIiArIHNzVGFibGVGaWxlLmFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwogICAgICAgICB9Ci0gICAgICAgIERlc2NyaXB0b3IgZGVzYyA9IERlc2NyaXB0b3IuZnJvbUZpbGVuYW1lKHNzVGFibGVGaWxlTmFtZSk7CisgICAgICAgIERlc2NyaXB0b3IgZGVzYyA9IERlc2NyaXB0b3IuZnJvbUZpbGVXaXRoQ29tcG9uZW50KHNzVGFibGVGaWxlLCBmYWxzZSkubGVmdDsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEgPSBVdGlsLm1ldGFkYXRhRnJvbVNTVGFibGUoZGVzYyk7CisgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBTU1RhYmxlUmVhZGVyLm9wZW5Ob1ZhbGlkYXRpb24obnVsbCwgZGVzYywgVGFibGVNZXRhZGF0YVJlZi5mb3JPZmZsaW5lVG9vbHMobWV0YWRhdGEpKTsKICAgICAgICAgICAgIGlmIChjbWQuaGFzT3B0aW9uKEVOVU1FUkFURV9LRVlTX09QVElPTikpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5IChLZXlJdGVyYXRvciBpdGVyID0gbmV3IEtleUl0ZXJhdG9yKGRlc2MsIG1ldGFkYXRhKSkKKyAgICAgICAgICAgICAgICB0cnkgKEtleUl0ZXJhdG9yIGl0ZXIgPSBzc3RhYmxlLmtleUl0ZXJhdG9yKCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBKc29uVHJhbnNmb3JtZXIua2V5c1RvSnNvbihudWxsLCBVdGlsLml0ZXJUb1N0cmVhbShpdGVyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLmhhc09wdGlvbihSQVdfVElNRVNUQU1QUyksCkBAIC0xNTgsNyArMTYwLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBTU1RhYmxlUmVhZGVyLm9wZW5Ob1ZhbGlkYXRpb24oZGVzYywgVGFibGVNZXRhZGF0YVJlZi5mb3JPZmZsaW5lVG9vbHMobWV0YWRhdGEpKTsKICAgICAgICAgICAgICAgICBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSBzc3RhYmxlLmdldFBhcnRpdGlvbmVyKCk7CiAgICAgICAgICAgICAgICAgZmluYWwgSVNTVGFibGVTY2FubmVyIGN1cnJlbnRTY2FubmVyOwogICAgICAgICAgICAgICAgIGlmICgoa2V5cyAhPSBudWxsKSAmJiAoa2V5cy5sZW5ndGggPiAwKSkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVMZXZlbFJlc2V0dGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlTGV2ZWxSZXNldHRlci5qYXZhCmluZGV4IDk2MThkMzYyLi4wYWE5ZTEwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlTGV2ZWxSZXNldHRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVMZXZlbFJlc2V0dGVyLmphdmEKQEAgLTIxLDE1ICsyMSwxNiBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpcmVjdG9yaWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlN0YXRzQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuU3RhdHNNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpWTVN0YWJpbGl0eUluc3BlY3RvcjsKIAogLyoqCkBAIC05MCwxOSArOTEsMTkgQEAKICAgICAgICAgICAgIGJvb2xlYW4gZm91bmRTU1RhYmxlID0gZmFsc2U7CiAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxEZXNjcmlwdG9yLCBTZXQ8Q29tcG9uZW50Pj4gc3N0YWJsZSA6IGxpc3Rlci5saXN0KCkuZW50cnlTZXQoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc3N0YWJsZS5nZXRWYWx1ZSgpLmNvbnRhaW5zKENvbXBvbmVudC5TVEFUUykpCisgICAgICAgICAgICAgICAgaWYgKHNzdGFibGUuZ2V0VmFsdWUoKS5jb250YWlucyhDb21wb25lbnRzLlNUQVRTKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGZvdW5kU1NUYWJsZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IHNzdGFibGUuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0YXRzTWV0YWRhdGEgbWV0YWRhdGEgPSAoU3RhdHNNZXRhZGF0YSkgZGVzY3JpcHRvci5nZXRNZXRhZGF0YVNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZShkZXNjcmlwdG9yLCBNZXRhZGF0YVR5cGUuU1RBVFMpOworICAgICAgICAgICAgICAgICAgICBTdGF0c01ldGFkYXRhIG1ldGFkYXRhID0gU3RhdHNDb21wb25lbnQubG9hZChkZXNjcmlwdG9yKS5zdGF0c01ldGFkYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YS5zc3RhYmxlTGV2ZWwgPiAwKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiQ2hhbmdpbmcgbGV2ZWwgZnJvbSAiICsgbWV0YWRhdGEuc3N0YWJsZUxldmVsICsgIiB0byAwIG9uICIgKyBkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiQ2hhbmdpbmcgbGV2ZWwgZnJvbSAiICsgbWV0YWRhdGEuc3N0YWJsZUxldmVsICsgIiB0byAwIG9uICIgKyBkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLm11dGF0ZUxldmVsKGRlc2NyaXB0b3IsIDApOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIlNraXBwZWQgIiArIGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpICsgIiBzaW5jZSBpdCBpcyBhbHJlYWR5IG9uIGxldmVsIDAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJTa2lwcGVkICIgKyBkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKSArICIgc2luY2UgaXQgaXMgYWxyZWFkeSBvbiBsZXZlbCAwIik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlTWV0YWRhdGFWaWV3ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVNZXRhZGF0YVZpZXdlci5qYXZhCmluZGV4IGM0YmVmMzUuLjFkOWRkOTEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVNZXRhZGF0YVZpZXdlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVNZXRhZGF0YVZpZXdlci5qYXZhCkBAIC0xNywxNSArMTcsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29sczsKIAotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CkBAIC00MSw2ICszNyw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5Qb3NpeFBhcnNlcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0NvbXBhcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CkBAIC01MSwxNCArNDgsMTMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkNvbXByZXNzaW9uTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuSUNvbXByZXNzb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVNTVGFibGVTY2FubmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSW5kZXhTdW1tYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LkNvbXByZXNzaW9uSW5mb0NvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlN0YXRzQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuQ29tcGFjdGlvbk1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YVR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5TdGF0c01ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuVmFsaWRhdGlvbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKQEAgLTkxLDcgKzg3LDcgQEAKIAogICAgIHN0YXRpYwogICAgIHsKLSAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmNsaWVudEluaXRpYWxpemF0aW9uKCk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci50b29sSW5pdGlhbGl6YXRpb24oKTsKICAgICB9CiAKICAgICBib29sZWFuIGNvbG9yOwpAQCAtMTc1LDcgKzE3MSw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIHByaW50U2Nhbm5lZE92ZXJ2aWV3KERlc2NyaXB0b3IgZGVzY3JpcHRvciwgU3RhdHNNZXRhZGF0YSBzdGF0cykgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBUYWJsZU1ldGFkYXRhIGNmbSA9IFV0aWwubWV0YWRhdGFGcm9tU1NUYWJsZShkZXNjcmlwdG9yKTsKLSAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXIgPSBTU1RhYmxlUmVhZGVyLm9wZW5Ob1ZhbGlkYXRpb24oZGVzY3JpcHRvciwgVGFibGVNZXRhZGF0YVJlZi5mb3JPZmZsaW5lVG9vbHMoY2ZtKSk7CisgICAgICAgIFNTVGFibGVSZWFkZXIgcmVhZGVyID0gU1NUYWJsZVJlYWRlci5vcGVuTm9WYWxpZGF0aW9uKG51bGwsIGRlc2NyaXB0b3IsIFRhYmxlTWV0YWRhdGFSZWYuZm9yT2ZmbGluZVRvb2xzKGNmbSkpOwogICAgICAgICB0cnkgKElTU1RhYmxlU2Nhbm5lciBzY2FubmVyID0gcmVhZGVyLmdldFNjYW5uZXIoKSkKICAgICAgICAgewogICAgICAgICAgICAgbG9uZyBieXRlcyA9IHNjYW5uZXIuZ2V0TGVuZ3RoSW5CeXRlcygpOwpAQCAtMzE2LDIzICszMTIsMjIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBwcmludFNTdGFibGVNZXRhZGF0YShTdHJpbmcgZm5hbWUsIGJvb2xlYW4gc2NhbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgcHJpdmF0ZSB2b2lkIHByaW50U1N0YWJsZU1ldGFkYXRhKEZpbGUgZmlsZSwgYm9vbGVhbiBzY2FuKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IERlc2NyaXB0b3IuZnJvbUZpbGVuYW1lKGZuYW1lKTsKLSAgICAgICAgTWFwPE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFDb21wb25lbnQ+IG1ldGFkYXRhID0gZGVzY3JpcHRvci5nZXRNZXRhZGF0YVNlcmlhbGl6ZXIoKQotICAgICAgICAgICAgICAgIC5kZXNlcmlhbGl6ZShkZXNjcmlwdG9yLCBFbnVtU2V0LmFsbE9mKE1ldGFkYXRhVHlwZS5jbGFzcykpOwotICAgICAgICBWYWxpZGF0aW9uTWV0YWRhdGEgdmFsaWRhdGlvbiA9IChWYWxpZGF0aW9uTWV0YWRhdGEpIG1ldGFkYXRhLmdldChNZXRhZGF0YVR5cGUuVkFMSURBVElPTik7Ci0gICAgICAgIFN0YXRzTWV0YWRhdGEgc3RhdHMgPSAoU3RhdHNNZXRhZGF0YSkgbWV0YWRhdGEuZ2V0KE1ldGFkYXRhVHlwZS5TVEFUUyk7Ci0gICAgICAgIENvbXBhY3Rpb25NZXRhZGF0YSBjb21wYWN0aW9uID0gKENvbXBhY3Rpb25NZXRhZGF0YSkgbWV0YWRhdGEuZ2V0KE1ldGFkYXRhVHlwZS5DT01QQUNUSU9OKTsKLSAgICAgICAgQ29tcHJlc3Npb25NZXRhZGF0YSBjb21wcmVzc2lvbiA9IG51bGw7Ci0gICAgICAgIEZpbGUgY29tcHJlc3Npb25GaWxlID0gbmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuQ09NUFJFU1NJT05fSU5GTykpOwotICAgICAgICBpZiAoY29tcHJlc3Npb25GaWxlLmV4aXN0cygpKQotICAgICAgICAgICAgY29tcHJlc3Npb24gPSBDb21wcmVzc2lvbk1ldGFkYXRhLmNyZWF0ZShmbmFtZSk7Ci0gICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIuQ29tcG9uZW50IGhlYWRlciA9IChTZXJpYWxpemF0aW9uSGVhZGVyLkNvbXBvbmVudCkgbWV0YWRhdGEKLSAgICAgICAgICAgICAgICAuZ2V0KE1ldGFkYXRhVHlwZS5IRUFERVIpOworICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLmZyb21GaWxlV2l0aENvbXBvbmVudChmaWxlLCBmYWxzZSkubGVmdDsKKyAgICAgICAgU3RhdHNDb21wb25lbnQgc3RhdHNDb21wb25lbnQgPSBTdGF0c0NvbXBvbmVudC5sb2FkKGRlc2NyaXB0b3IpOworICAgICAgICBWYWxpZGF0aW9uTWV0YWRhdGEgdmFsaWRhdGlvbiA9IHN0YXRzQ29tcG9uZW50LnZhbGlkYXRpb25NZXRhZGF0YSgpOworICAgICAgICBTdGF0c01ldGFkYXRhIHN0YXRzID0gc3RhdHNDb21wb25lbnQuc3RhdHNNZXRhZGF0YSgpOworICAgICAgICBDb21wYWN0aW9uTWV0YWRhdGEgY29tcGFjdGlvbiA9IHN0YXRzQ29tcG9uZW50LmNvbXBhY3Rpb25NZXRhZGF0YSgpOworICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyLkNvbXBvbmVudCBoZWFkZXIgPSBzdGF0c0NvbXBvbmVudC5zZXJpYWxpemF0aW9uSGVhZGVyKCk7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBJQ29tcHJlc3Nvcj4gY29tcHJlc3NvckNsYXNzID0gbnVsbDsKKyAgICAgICAgdHJ5IChDb21wcmVzc2lvbk1ldGFkYXRhIGNvbXByZXNzaW9uID0gQ29tcHJlc3Npb25JbmZvQ29tcG9uZW50LmxvYWRJZkV4aXN0cyhkZXNjcmlwdG9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgY29tcHJlc3NvckNsYXNzID0gY29tcHJlc3Npb24gIT0gbnVsbCA/IGNvbXByZXNzaW9uLmNvbXByZXNzb3IoKS5nZXRDbGFzcygpIDogbnVsbDsKKyAgICAgICAgfQogCiAgICAgICAgIGZpZWxkKCJTU1RhYmxlIiwgZGVzY3JpcHRvcik7Ci0gICAgICAgIGlmIChzY2FuICYmIGRlc2NyaXB0b3IudmVyc2lvbi5nZXRWZXJzaW9uKCkuY29tcGFyZVRvKCJtYSIpID49IDApCisgICAgICAgIGlmIChzY2FuICYmIGRlc2NyaXB0b3IudmVyc2lvbi52ZXJzaW9uLmNvbXBhcmVUbygibWEiKSA+PSAwKQogICAgICAgICB7CiAgICAgICAgICAgICBwcmludFNjYW5uZWRPdmVydmlldyhkZXNjcmlwdG9yLCBzdGF0cyk7CiAgICAgICAgIH0KQEAgLTM0NywyOSArMzQyLDE5IEBACiAgICAgICAgICAgICBmaWVsZCgiTWF4aW11bSB0aW1lc3RhbXAiLCBzdGF0cy5tYXhUaW1lc3RhbXAsIHRvRGF0ZVN0cmluZyhzdGF0cy5tYXhUaW1lc3RhbXAsIHRzVW5pdCkpOwogICAgICAgICAgICAgZmllbGQoIlNTVGFibGUgbWluIGxvY2FsIGRlbGV0aW9uIHRpbWUiLCBzdGF0cy5taW5Mb2NhbERlbGV0aW9uVGltZSwgZGVsZXRpb24oc3RhdHMubWluTG9jYWxEZWxldGlvblRpbWUpKTsKICAgICAgICAgICAgIGZpZWxkKCJTU1RhYmxlIG1heCBsb2NhbCBkZWxldGlvbiB0aW1lIiwgc3RhdHMubWF4TG9jYWxEZWxldGlvblRpbWUsIGRlbGV0aW9uKHN0YXRzLm1heExvY2FsRGVsZXRpb25UaW1lKSk7Ci0gICAgICAgICAgICBmaWVsZCgiQ29tcHJlc3NvciIsIGNvbXByZXNzaW9uICE9IG51bGwgPyBjb21wcmVzc2lvbi5jb21wcmVzc29yKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgOiAiLSIpOwotICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uICE9IG51bGwpCisgICAgICAgICAgICBmaWVsZCgiQ29tcHJlc3NvciIsIGNvbXByZXNzb3JDbGFzcyAhPSBudWxsID8gY29tcHJlc3NvckNsYXNzLmdldE5hbWUoKSA6ICItIik7CisgICAgICAgICAgICBpZiAoY29tcHJlc3NvckNsYXNzICE9IG51bGwpCiAgICAgICAgICAgICAgICAgZmllbGQoIkNvbXByZXNzaW9uIHJhdGlvIiwgc3RhdHMuY29tcHJlc3Npb25SYXRpbyk7CiAgICAgICAgICAgICBmaWVsZCgiVFRMIG1pbiIsIHN0YXRzLm1pblRUTCwgdG9EdXJhdGlvblN0cmluZyhzdGF0cy5taW5UVEwsIFRpbWVVbml0LlNFQ09ORFMpKTsKICAgICAgICAgICAgIGZpZWxkKCJUVEwgbWF4Iiwgc3RhdHMubWF4VFRMLCB0b0R1cmF0aW9uU3RyaW5nKHN0YXRzLm1heFRUTCwgVGltZVVuaXQuU0VDT05EUykpOwogCiAgICAgICAgICAgICBpZiAodmFsaWRhdGlvbiAhPSBudWxsICYmIGhlYWRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHByaW50TWluTWF4VG9rZW4oZGVzY3JpcHRvciwgRkJVdGlsaXRpZXMubmV3UGFydGl0aW9uZXIoZGVzY3JpcHRvciksIGhlYWRlci5nZXRLZXlUeXBlKCkpOworICAgICAgICAgICAgICAgIHByaW50TWluTWF4VG9rZW4oZGVzY3JpcHRvciwgRkJVdGlsaXRpZXMubmV3UGFydGl0aW9uZXIoZGVzY3JpcHRvciksIGhlYWRlci5nZXRLZXlUeXBlKCksIHN0YXRzKTsKIAotICAgICAgICAgICAgaWYgKGhlYWRlciAhPSBudWxsICYmIGhlYWRlci5nZXRDbHVzdGVyaW5nVHlwZXMoKS5zaXplKCkgPT0gc3RhdHMubWluQ2x1c3RlcmluZ1ZhbHVlcy5zaXplKCkpCisgICAgICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGNsdXN0ZXJpbmdUeXBlcyA9IGhlYWRlci5nZXRDbHVzdGVyaW5nVHlwZXMoKTsKLSAgICAgICAgICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IG1pbkNsdXN0ZXJpbmdWYWx1ZXMgPSBzdGF0cy5taW5DbHVzdGVyaW5nVmFsdWVzOwotICAgICAgICAgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gbWF4Q2x1c3RlcmluZ1ZhbHVlcyA9IHN0YXRzLm1heENsdXN0ZXJpbmdWYWx1ZXM7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gbWluVmFsdWVzID0gbmV3IFN0cmluZ1tjbHVzdGVyaW5nVHlwZXMuc2l6ZSgpXTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBtYXhWYWx1ZXMgPSBuZXcgU3RyaW5nW2NsdXN0ZXJpbmdUeXBlcy5zaXplKCldOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2x1c3RlcmluZ1R5cGVzLnNpemUoKTsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWluVmFsdWVzW2ldID0gY2x1c3RlcmluZ1R5cGVzLmdldChpKS5nZXRTdHJpbmcobWluQ2x1c3RlcmluZ1ZhbHVlcy5nZXQoaSkpOwotICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZXNbaV0gPSBjbHVzdGVyaW5nVHlwZXMuZ2V0KGkpLmdldFN0cmluZyhtYXhDbHVzdGVyaW5nVmFsdWVzLmdldChpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpZWxkKCJtaW5DbHVzdGVyaW5nVmFsdWVzIiwgQXJyYXlzLnRvU3RyaW5nKG1pblZhbHVlcykpOwotICAgICAgICAgICAgICAgIGZpZWxkKCJtYXhDbHVzdGVyaW5nVmFsdWVzIiwgQXJyYXlzLnRvU3RyaW5nKG1heFZhbHVlcykpOworICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBuZXcgQ2x1c3RlcmluZ0NvbXBhcmF0b3IoaGVhZGVyLmdldENsdXN0ZXJpbmdUeXBlcygpKTsKKyAgICAgICAgICAgICAgICBmaWVsZCgiQ292ZXJlZCBjbHVzdGVyaW5ncyIsIHN0YXRzLmNvdmVyZWRDbHVzdGVyaW5nLnRvU3RyaW5nKGNvbXBhcmF0b3IpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZpZWxkKCJFc3RpbWF0ZWQgZHJvcHBhYmxlIHRvbWJzdG9uZXMiLAogICAgICAgICAgICAgICAgICAgc3RhdHMuZ2V0RXN0aW1hdGVkRHJvcHBhYmxlVG9tYnN0b25lUmF0aW8oKGludCkgKGN1cnJlbnRUaW1lTWlsbGlzKCkgLyAxMDAwKSAtIHRoaXMuZ2MpKTsKQEAgLTQ3NSwxNyArNDYwLDIzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgcHJpbnRNaW5NYXhUb2tlbihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lciwgQWJzdHJhY3RUeXBlPD8+IGtleVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICBwcml2YXRlIHZvaWQgcHJpbnRNaW5NYXhUb2tlbihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lciwgQWJzdHJhY3RUeXBlPD8+IGtleVR5cGUsIFN0YXRzTWV0YWRhdGEgc3RhdHNNZXRhZGF0YSkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIEZpbGUgc3VtbWFyaWVzRmlsZSA9IG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlNVTU1BUlkpKTsKLSAgICAgICAgaWYgKCFzdW1tYXJpZXNGaWxlLmV4aXN0cygpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHRyeSAoRGF0YUlucHV0U3RyZWFtIGlTdHJlYW0gPSBuZXcgRGF0YUlucHV0U3RyZWFtKEZpbGVzLm5ld0lucHV0U3RyZWFtKHN1bW1hcmllc0ZpbGUudG9QYXRoKCkpKSkKKyAgICAgICAgaWYgKGRlc2NyaXB0b3IudmVyc2lvbi5oYXNLZXlSYW5nZSgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBQYWlyPERlY29yYXRlZEtleSwgRGVjb3JhdGVkS2V5PiBmaXJzdExhc3QgPSBuZXcgSW5kZXhTdW1tYXJ5LkluZGV4U3VtbWFyeVNlcmlhbGl6ZXIoKQotICAgICAgICAgICAgICAgICAgICAuZGVzZXJpYWxpemVGaXJzdExhc3RLZXkoaVN0cmVhbSwgcGFydGl0aW9uZXIpOworICAgICAgICAgICAgaWYgKHN0YXRzTWV0YWRhdGEuZmlyc3RLZXkgPT0gbnVsbCB8fCBzdGF0c01ldGFkYXRhLmxhc3RLZXkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGZpZWxkKCJGaXJzdCB0b2tlbiIsIHBhcnRpdGlvbmVyLmdldFRva2VuKHN0YXRzTWV0YWRhdGEuZmlyc3RLZXkpLCBrZXlUeXBlLmdldFN0cmluZyhzdGF0c01ldGFkYXRhLmZpcnN0S2V5KSk7CisgICAgICAgICAgICBmaWVsZCgiTGFzdCB0b2tlbiIsIHBhcnRpdGlvbmVyLmdldFRva2VuKHN0YXRzTWV0YWRhdGEubGFzdEtleSksIGtleVR5cGUuZ2V0U3RyaW5nKHN0YXRzTWV0YWRhdGEubGFzdEtleSkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgUGFpcjxEZWNvcmF0ZWRLZXksIERlY29yYXRlZEtleT4gZmlyc3RMYXN0ID0gZGVzY3JpcHRvci5nZXRGb3JtYXQoKS5nZXRSZWFkZXJGYWN0b3J5KCkucmVhZEtleVJhbmdlKGRlc2NyaXB0b3IsIHBhcnRpdGlvbmVyKTsKKyAgICAgICAgICAgIGlmIChmaXJzdExhc3QgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKICAgICAgICAgICAgIGZpZWxkKCJGaXJzdCB0b2tlbiIsIGZpcnN0TGFzdC5sZWZ0LmdldFRva2VuKCksIGtleVR5cGUuZ2V0U3RyaW5nKGZpcnN0TGFzdC5sZWZ0LmdldEtleSgpKSk7CiAgICAgICAgICAgICBmaWVsZCgiTGFzdCB0b2tlbiIsIGZpcnN0TGFzdC5yaWdodC5nZXRUb2tlbigpLCBrZXlUeXBlLmdldFN0cmluZyhmaXJzdExhc3QucmlnaHQuZ2V0S2V5KCkpKTsKICAgICAgICAgfQpAQCAtNTQ1LDcgKzUzNiw3IEBACiAgICAgICAgICAgICBGaWxlIHNzdGFibGUgPSBuZXcgRmlsZShmbmFtZSk7CiAgICAgICAgICAgICBpZiAoc3N0YWJsZS5leGlzdHMoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZXRhd3JpdGVyLnByaW50U1N0YWJsZU1ldGFkYXRhKHNzdGFibGUuYWJzb2x1dGVQYXRoKCksIGZ1bGxTY2FuKTsKKyAgICAgICAgICAgICAgICBtZXRhd3JpdGVyLnByaW50U1N0YWJsZU1ldGFkYXRhKHNzdGFibGUsIGZ1bGxTY2FuKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVPZmZsaW5lUmVsZXZlbC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZU9mZmxpbmVSZWxldmVsLmphdmEKaW5kZXggZTRlMzQzZi4uMTZmYWE5MiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZU9mZmxpbmVSZWxldmVsLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZU9mZmxpbmVSZWxldmVsLmphdmEKQEAgLTMzLDE2ICszMywxNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTXVsdGltYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRNdWx0aW1hcDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0LkNvbXBvbmVudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKIAogLyoqCiAgKiBDcmVhdGUgYSBkZWNlbnQgbGV2ZWxpbmcgZm9yIHRoZSBnaXZlbiBrZXlzcGFjZS9jb2x1bW4gZmFtaWx5CkBAIC0xMTYsMTMgKzExNywxNCBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXIgPSBTU1RhYmxlUmVhZGVyLm9wZW4oc3N0YWJsZS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgcmVhZGVyID0gU1NUYWJsZVJlYWRlci5vcGVuKGNmcywgc3N0YWJsZS5nZXRLZXkoKSk7CiAgICAgICAgICAgICAgICAgICAgIHNzdGFibGVNdWx0aW1hcC5wdXQocmVhZGVyLmRlc2NyaXB0b3IuZGlyZWN0b3J5LCByZWFkZXIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiQ291bGRuJ3Qgb3BlbiBzc3RhYmxlOiAiK3NzdGFibGUuZ2V0S2V5KCkuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpKTsKLSAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlcy5wcm9wYWdhdGUodCk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJDb3VsZG4ndCBvcGVuIHNzdGFibGU6ICIrc3N0YWJsZS5nZXRLZXkoKS5maWxlRm9yKENvbXBvbmVudHMuREFUQSkpOworICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGVzLnRocm93SWZVbmNoZWNrZWQodCk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZVBhcnRpdGlvbnMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVQYXJ0aXRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUxMzg1MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVQYXJ0aXRpb25zLmphdmEKQEAgLTAsMCArMSw4ODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5VVUlEOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Ub0xvbmdGdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLkNvbW1hbmRMaW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuQ29tbWFuZExpbmVQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5IZWxwRm9ybWF0dGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuUG9zaXhQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5tYXRoLk51bWJlclV0aWxzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFTdG9yYWdlU3BlYzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5MaXZlbmVzc0luZm87CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUGFydGl0aW9uUG9zaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ29sdW1uRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNvbXBsZXhDb2x1bW5EYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUmFuZ2VUb21ic3RvbmVNYXJrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5BYnN0cmFjdEJvdW5kczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQm91bmRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU1NUYWJsZVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jazsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Fc3RpbWF0ZWRIaXN0b2dyYW07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKKworcHVibGljIGNsYXNzIFNTVGFibGVQYXJ0aXRpb25zCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9PUFRJT04gPSAiayI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0xVREVfS0VZX09QVElPTiA9ICJ4IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDVVJTSVZFX09QVElPTiA9ICJyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU05BUFNIT1RTX09QVElPTiA9ICJzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS1VQU19PUFRJT04gPSAiYiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRJVElPTlNfT05MWV9PUFRJT04gPSAieSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJWkVfVEhSRVNIT0xEX09QVElPTiA9ICJ0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9NQlNUT05FX1RIUkVTSE9MRF9PUFRJT04gPSAibyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENFTExfVEhSRVNIT0xEX09QVElPTiA9ICJjIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9XX1RIUkVTSE9MRF9PUFRJT04gPSAidyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENTVl9PUFRJT04gPSAibSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVUlJFTlRfVElNRVNUQU1QX09QVElPTiA9ICJ1IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUYWJsZUlkIEVNUFRZX1RBQkxFX0lEID0gVGFibGVJZC5mcm9tVVVJRChuZXcgVVVJRCgwTCwgMEwpKTsKKworICAgIHN0YXRpYworICAgIHsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmNsaWVudEluaXRpYWxpemF0aW9uKCk7CisKKyAgICAgICAgT3B0aW9uIG9wdEtleSA9IG5ldyBPcHRpb24oS0VZX09QVElPTiwgImtleSIsIHRydWUsICJQYXJ0aXRpb24ga2V5cyB0byBpbmNsdWRlIik7CisgICAgICAgIC8vIE51bWJlciBvZiB0aW1lcyAtayA8a2V5PiBjYW4gYmUgcGFzc2VkIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgICAgIG9wdEtleS5zZXRBcmdzKE9wdGlvbi5VTkxJTUlURURfVkFMVUVTKTsKKyAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24ob3B0S2V5KTsKKworICAgICAgICBPcHRpb24gZXhjbHVkZUtleSA9IG5ldyBPcHRpb24oRVhDTFVERV9LRVlfT1BUSU9OLCAiZXhjbHVkZS1rZXkiLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4Y2x1ZGVkIHBhcnRpdGlvbiBrZXkocykgZnJvbSBwYXJ0aXRpb24gZGV0YWlsZWQgcm93L2NlbGwvdG9tYnN0b25lICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZm9ybWF0aW9uIChpcnJlbGV2YW50LCBpZiAtLXBhcnRpdGlvbnMtb25seSBpcyBnaXZlbikiKTsKKyAgICAgICAgZXhjbHVkZUtleS5zZXRBcmdzKE9wdGlvbi5VTkxJTUlURURfVkFMVUVTKTsgLy8gTnVtYmVyIG9mIHRpbWVzIC14IDxrZXk+IGNhbiBiZSBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24oZXhjbHVkZUtleSk7CisKKyAgICAgICAgT3B0aW9uIHRocmVzaG9sZEtleSA9IG5ldyBPcHRpb24oU0laRV9USFJFU0hPTERfT1BUSU9OLCAibWluLXNpemUiLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFydGl0aW9uIHNpemUgdGhyZXNob2xkLCBleHByZXNzZWQgYXMgZWl0aGVyIHRoZSBudW1iZXIgb2YgYnl0ZXMgb3IgYSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpemUgd2l0aCB1bml0IG9mIHRoZSBmb3JtIDEwS2lCLCAyME1pQiwgMzBHaUIsIGV0Yy4iKTsKKyAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24odGhyZXNob2xkS2V5KTsKKworICAgICAgICBPcHRpb24gdG9tYnN0b25lS2V5ID0gbmV3IE9wdGlvbihUT01CU1RPTkVfVEhSRVNIT0xEX09QVElPTiwgIm1pbi10b21ic3RvbmVzIiwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnRpdGlvbiB0b21ic3RvbmUgY291bnQgdGhyZXNob2xkIik7CisgICAgICAgIG9wdGlvbnMuYWRkT3B0aW9uKHRvbWJzdG9uZUtleSk7CisKKyAgICAgICAgT3B0aW9uIGNlbGxLZXkgPSBuZXcgT3B0aW9uKENFTExfVEhSRVNIT0xEX09QVElPTiwgIm1pbi1jZWxscyIsIHRydWUsICJwYXJ0aXRpb24gY2VsbCBjb3VudCB0aHJlc2hvbGQiKTsKKyAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24oY2VsbEtleSk7CisKKyAgICAgICAgT3B0aW9uIHJvd0tleSA9IG5ldyBPcHRpb24oUk9XX1RIUkVTSE9MRF9PUFRJT04sICJtaW4tcm93cyIsIHRydWUsICJwYXJ0aXRpb24gcm93IGNvdW50IHRocmVzaG9sZCIpOworICAgICAgICBvcHRpb25zLmFkZE9wdGlvbihyb3dLZXkpOworCisgICAgICAgIE9wdGlvbiBjdXJyZW50VGltZXN0YW1wS2V5ID0gbmV3IE9wdGlvbihDVVJSRU5UX1RJTUVTVEFNUF9PUFRJT04sICJjdXJyZW50LXRpbWVzdGFtcCIsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZXN0YW1wIChzZWNvbmRzIHNpbmNlIGVwb2NoLCB1bml0IHRpbWUpIGZvciBUVEwgZXhwaXJlZCBjYWxjdWxhdGlvbiIpOworICAgICAgICBvcHRpb25zLmFkZE9wdGlvbihjdXJyZW50VGltZXN0YW1wS2V5KTsKKworICAgICAgICBPcHRpb24gcmVjdXJzaXZlS2V5ID0gbmV3IE9wdGlvbihSRUNVUlNJVkVfT1BUSU9OLCAicmVjdXJzaXZlIiwgZmFsc2UsICJzY2FuIGZvciBzc3RhYmxlcyByZWN1cnNpdmVseSIpOworICAgICAgICBvcHRpb25zLmFkZE9wdGlvbihyZWN1cnNpdmVLZXkpOworCisgICAgICAgIE9wdGlvbiBzbmFwc2hvdHNLZXkgPSBuZXcgT3B0aW9uKFNOQVBTSE9UU19PUFRJT04sICJzbmFwc2hvdHMiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluY2x1ZGUgc25hcHNob3RzIHByZXNlbnQgaW4gZGF0YSBkaXJlY3RvcmllcyAocmVjdXJzaXZlIHNjYW5zKSIpOworICAgICAgICBvcHRpb25zLmFkZE9wdGlvbihzbmFwc2hvdHNLZXkpOworCisgICAgICAgIE9wdGlvbiBiYWNrdXBzS2V5ID0gbmV3IE9wdGlvbihCQUNLVVBTX09QVElPTiwgImJhY2t1cHMiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNsdWRlIGJhY2t1cHMgcHJlc2VudCBpbiBkYXRhIGRpcmVjdG9yaWVzIChyZWN1cnNpdmUgc2NhbnMpIik7CisgICAgICAgIG9wdGlvbnMuYWRkT3B0aW9uKGJhY2t1cHNLZXkpOworCisgICAgICAgIE9wdGlvbiBwYXJ0aXRpb25zT25seUtleSA9IG5ldyBPcHRpb24oUEFSVElUSU9OU19PTkxZX09QVElPTiwgInBhcnRpdGlvbnMtb25seSIsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEbyBub3QgcHJvY2VzcyBwZXItcGFydGl0aW9uIGRldGFpbGVkIHJvdy9jZWxsL3RvbWJzdG9uZSBpbmZvcm1hdGlvbiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9ubHkgYnJpZWYgaW5mb3JtYXRpb24iKTsKKyAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24ocGFydGl0aW9uc09ubHlLZXkpOworCisgICAgICAgIE9wdGlvbiBjc3ZLZXkgPSBuZXcgT3B0aW9uKENTVl9PUFRJT04sICJjc3YiLCBmYWxzZSwgIkNTViBvdXRwdXQgKG1hY2hpbmUgcmVhZGFibGUpIik7CisgICAgICAgIG9wdGlvbnMuYWRkT3B0aW9uKGNzdktleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYXJndW1lbnRzIHNwZWNpZnlpbmcgYSBsaXN0IG9mIFNTVGFibGVzIG9yIGRpcmVjdG9yaWVzLCBwcmludCBpbmZvcm1hdGlvbiBhYm91dCBTU1RhYmxlIHBhcnRpdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJncyBjb21tYW5kIGxpbmVzIGFyZ3VtZW50cworICAgICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBvbiBjb25maWd1cmF0aW9uIGZhaWx1cmUgKHdyb25nIHBhcmFtcyBnaXZlbikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIENvbW1hbmRMaW5lUGFyc2VyIHBhcnNlciA9IG5ldyBQb3NpeFBhcnNlcigpOworICAgICAgICBDb21tYW5kTGluZSBjbWQ7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBjbWQgPSBwYXJzZXIucGFyc2Uob3B0aW9ucywgYXJncyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbWQuZ2V0QXJncygpLmxlbmd0aCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIllvdSBtdXN0IHN1cHBseSBhdCBsZWFzdCBvbmUgc3N0YWJsZSBvciBkaXJlY3RvcnkiKTsKKyAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGVjID0gcHJvY2Vzc0FyZ3VtZW50cyhjbWQpOworCisgICAgICAgIFN5c3RlbS5leGl0KGVjKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50VXNhZ2UoKQorICAgIHsKKyAgICAgICAgU3RyaW5nIHVzYWdlID0gU3RyaW5nLmZvcm1hdCgic3N0YWJsZXBhcnRpdGlvbnMgPG9wdGlvbnM+IDxzc3RhYmxlIGZpbGVzIG9yIGRpcmVjdG9yaWVzPiVuIik7CisgICAgICAgIFN0cmluZyBoZWFkZXIgPSAiUHJpbnQgcGFydGl0aW9uIHN0YXRpc3RpY3Mgb2Ygb25lIG9yIG1vcmUgc3N0YWJsZXMuIjsKKyAgICAgICAgbmV3IEhlbHBGb3JtYXR0ZXIoKS5wcmludEhlbHAodXNhZ2UsIGhlYWRlciwgb3B0aW9ucywgIiIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBwcm9jZXNzQXJndW1lbnRzKENvbW1hbmRMaW5lIGNtZCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBTdHJpbmdbXSBrZXlzID0gY21kLmdldE9wdGlvblZhbHVlcyhLRVlfT1BUSU9OKTsKKyAgICAgICAgU2V0PFN0cmluZz4gZXhjbHVkZXMgPSBjbWQuZ2V0T3B0aW9uVmFsdWVzKEVYQ0xVREVfS0VZX09QVElPTikgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSW1tdXRhYmxlU2V0LmNvcHlPZihjbWQuZ2V0T3B0aW9uVmFsdWVzKEVYQ0xVREVfS0VZX09QVElPTikpOworCisgICAgICAgIGJvb2xlYW4gc2NhblJlY3Vyc2l2ZSA9IGNtZC5oYXNPcHRpb24oUkVDVVJTSVZFX09QVElPTik7CisgICAgICAgIGJvb2xlYW4gd2l0aFNuYXBzaG90cyA9IGNtZC5oYXNPcHRpb24oU05BUFNIT1RTX09QVElPTik7CisgICAgICAgIGJvb2xlYW4gd2l0aEJhY2t1cHMgPSBjbWQuaGFzT3B0aW9uKEJBQ0tVUFNfT1BUSU9OKTsKKyAgICAgICAgYm9vbGVhbiBjc3YgPSBjbWQuaGFzT3B0aW9uKENTVl9PUFRJT04pOworICAgICAgICBib29sZWFuIHBhcnRpdGlvbnNPbmx5ID0gY21kLmhhc09wdGlvbihQQVJUSVRJT05TX09OTFlfT1BUSU9OKTsKKworICAgICAgICBsb25nIHNpemVUaHJlc2hvbGQgPSBMb25nLk1BWF9WQUxVRTsKKyAgICAgICAgaW50IGNlbGxDb3VudFRocmVzaG9sZCA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICBpbnQgcm93Q291bnRUaHJlc2hvbGQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgaW50IHRvbWJzdG9uZUNvdW50VGhyZXNob2xkID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgIGxvbmcgY3VycmVudFRpbWUgPSBDbG9jay5HbG9iYWwuY3VycmVudFRpbWVNaWxsaXMoKSAvIDEwMDBMOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY21kLmhhc09wdGlvbihTSVpFX1RIUkVTSE9MRF9PUFRJT04pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyB0aHJlc2hvbGQgPSBjbWQuZ2V0T3B0aW9uVmFsdWUoU0laRV9USFJFU0hPTERfT1BUSU9OKTsKKyAgICAgICAgICAgICAgICBzaXplVGhyZXNob2xkID0gTnVtYmVyVXRpbHMuaXNQYXJzYWJsZSh0aHJlc2hvbGQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTG9uZy5wYXJzZUxvbmcodGhyZXNob2xkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQodGhyZXNob2xkKS50b0J5dGVzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY21kLmhhc09wdGlvbihDRUxMX1RIUkVTSE9MRF9PUFRJT04pKQorICAgICAgICAgICAgICAgIGNlbGxDb3VudFRocmVzaG9sZCA9IEludGVnZXIucGFyc2VJbnQoY21kLmdldE9wdGlvblZhbHVlKENFTExfVEhSRVNIT0xEX09QVElPTikpOworICAgICAgICAgICAgaWYgKGNtZC5oYXNPcHRpb24oUk9XX1RIUkVTSE9MRF9PUFRJT04pKQorICAgICAgICAgICAgICAgIHJvd0NvdW50VGhyZXNob2xkID0gSW50ZWdlci5wYXJzZUludChjbWQuZ2V0T3B0aW9uVmFsdWUoUk9XX1RIUkVTSE9MRF9PUFRJT04pKTsKKyAgICAgICAgICAgIGlmIChjbWQuaGFzT3B0aW9uKFRPTUJTVE9ORV9USFJFU0hPTERfT1BUSU9OKSkKKyAgICAgICAgICAgICAgICB0b21ic3RvbmVDb3VudFRocmVzaG9sZCA9IEludGVnZXIucGFyc2VJbnQoY21kLmdldE9wdGlvblZhbHVlKFRPTUJTVE9ORV9USFJFU0hPTERfT1BUSU9OKSk7CisgICAgICAgICAgICBpZiAoY21kLmhhc09wdGlvbihDVVJSRU5UX1RJTUVTVEFNUF9PUFRJT04pKQorICAgICAgICAgICAgICAgIGN1cnJlbnRUaW1lID0gSW50ZWdlci5wYXJzZUludChjbWQuZ2V0T3B0aW9uVmFsdWUoQ1VSUkVOVF9USU1FU1RBTVBfT1BUSU9OKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50ZigiSW52YWxpZCB0aHJlc2hvbGQgYXJndW1lbnQ6ICVzJW4iLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzaXplVGhyZXNob2xkIDwgMCB8fCBjZWxsQ291bnRUaHJlc2hvbGQgPCAwIHx8IHRvbWJzdG9uZUNvdW50VGhyZXNob2xkIDwgMCB8fCBjdXJyZW50VGltZSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTmVnYXRpdmUgdmFsdWVzIGFyZSBub3QgYWxsb3dlZCIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBMaXN0PEZpbGU+IGRpcmVjdG9yaWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8RXh0ZW5kZWREZXNjcmlwdG9yPiBkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIGlmICghYXJndW1lbnRzVG9GaWxlcyhjbWQuZ2V0QXJncygpLCBkZXNjcmlwdG9ycywgZGlyZWN0b3JpZXMpKQorICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgZm9yIChGaWxlIGRpcmVjdG9yeSA6IGRpcmVjdG9yaWVzKQorICAgICAgICB7CisgICAgICAgICAgICBwcm9jZXNzRGlyZWN0b3J5KHNjYW5SZWN1cnNpdmUsIHdpdGhTbmFwc2hvdHMsIHdpdGhCYWNrdXBzLCBkaXJlY3RvcnksIGRlc2NyaXB0b3JzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjc3YpCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImtleSxrZXlCaW5hcnksbGl2ZSxvZmZzZXQsc2l6ZSxyb3dDb3VudCxjZWxsQ291bnQsIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvbWJzdG9uZUNvdW50LHJvd1RvbWJzdG9uZUNvdW50LHJhbmdlVG9tYnN0b25lQ291bnQsY29tcGxleFRvbWJzdG9uZUNvdW50LCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjZWxsVG9tYnN0b25lQ291bnQscm93VHRsRXhwaXJlZCxjZWxsVHRsRXhwaXJlZCwiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlyZWN0b3J5LGtleXNwYWNlLHRhYmxlLGluZGV4LCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzbmFwc2hvdCxiYWNrdXAsZ2VuZXJhdGlvbixmb3JtYXQsdmVyc2lvbiIpOworCisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoZGVzY3JpcHRvcnMpOworCisgICAgICAgIGZvciAoRXh0ZW5kZWREZXNjcmlwdG9yIGRlc2MgOiBkZXNjcmlwdG9ycykKKyAgICAgICAgeworICAgICAgICAgICAgcHJvY2Vzc1NTVGFibGUoa2V5cywgZXhjbHVkZXMsIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplVGhyZXNob2xkLCBjZWxsQ291bnRUaHJlc2hvbGQsIHJvd0NvdW50VGhyZXNob2xkLCB0b21ic3RvbmVDb3VudFRocmVzaG9sZCwgcGFydGl0aW9uc09ubHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3YsIGN1cnJlbnRUaW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc0RpcmVjdG9yeShib29sZWFuIHNjYW5SZWN1cnNpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gd2l0aFNuYXBzaG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB3aXRoQmFja3VwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8RXh0ZW5kZWREZXNjcmlwdG9yPiBkZXNjcmlwdG9ycykKKyAgICB7CisgICAgICAgIEZpbGVbXSBmaWxlcyA9IGRpci50cnlMaXN0KCk7CisgICAgICAgIGlmIChmaWxlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGZvciAoRmlsZSBmaWxlIDogZmlsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaWxlLmlzRmlsZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERlc2NyaXB0b3IuY29tcG9uZW50RnJvbUZpbGUoZmlsZSkgIT0gQmlnRm9ybWF0LkNvbXBvbmVudHMuREFUQSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkRGVzY3JpcHRvciBkZXNjID0gRXh0ZW5kZWREZXNjcmlwdG9yLmd1ZXNzRnJvbUZpbGUoZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjLnNuYXBzaG90ICE9IG51bGwgJiYgIXdpdGhTbmFwc2hvdHMpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2MuYmFja3VwICE9IG51bGwgJiYgIXdpdGhCYWNrdXBzKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnMuYWRkKGRlc2MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhhdCBlcnJvciB3aGVuIHNjYW5uaW5nIGRpcmVjdG9yaWVzCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNjYW5SZWN1cnNpdmUgJiYgZmlsZS5pc0RpcmVjdG9yeSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByb2Nlc3NEaXJlY3RvcnkodHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhTbmFwc2hvdHMsIHdpdGhCYWNrdXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gYXJndW1lbnRzVG9GaWxlcyhTdHJpbmdbXSBhcmdzLCBMaXN0PEV4dGVuZGVkRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnMsIExpc3Q8RmlsZT4gZGlyZWN0b3JpZXMpCisgICAgeworICAgICAgICBib29sZWFuIGVyciA9IGZhbHNlOworICAgICAgICBmb3IgKFN0cmluZyBhcmcgOiBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShhcmcpOworICAgICAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRmKCJBcmd1bWVudCAnJXMnIGRvZXMgbm90IHJlc29sdmUgdG8gYSBmaWxlIG9yIGRpcmVjdG9yeSVuIiwgYXJnKTsKKyAgICAgICAgICAgICAgICBlcnIgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWZpbGUuaXNSZWFkYWJsZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRmKCJBcmd1bWVudCAnJXMnIGlzIG5vdCBhIHJlYWRhYmxlIGZpbGUgb3IgZGlyZWN0b3J5IChjaGVjayBwZXJtaXNzaW9ucyklbiIsIGFyZyk7CisgICAgICAgICAgICAgICAgZXJyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZpbGUuaXNGaWxlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9ycy5hZGQoRXh0ZW5kZWREZXNjcmlwdG9yLmd1ZXNzRnJvbUZpbGUoZmlsZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50ZigiQXJndW1lbnQgJyVzJyBpcyBub3QgYW4gc3N0YWJsZSVuIiwgYXJnKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKQorICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzLmFkZChmaWxlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIWVycjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NTU1RhYmxlKFN0cmluZ1tdIGtleXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBleGNsdWRlZEtleXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZERlc2NyaXB0b3IgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgc2l6ZVRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjZWxsQ291bnRUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93Q291bnRUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9tYnN0b25lQ291bnRUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHBhcnRpdGlvbnNPbmx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjc3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGN1cnJlbnRUaW1lKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEgPSBVdGlsLm1ldGFkYXRhRnJvbVNTVGFibGUoZGVzYy5kZXNjcmlwdG9yKTsKKyAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gU1NUYWJsZVJlYWRlci5vcGVuTm9WYWxpZGF0aW9uKG51bGwsIGRlc2MuZGVzY3JpcHRvciwgVGFibGVNZXRhZGF0YVJlZi5mb3JPZmZsaW5lVG9vbHMobWV0YWRhdGEpKTsKKworICAgICAgICBpZiAoIWNzdikKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIlblByb2Nlc3NpbmcgJXMgKCVzIHVuY29tcHJlc3NlZCwgJXMgb24gZGlzayklbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldHR5UHJpbnRNZW1vcnkoc3N0YWJsZS51bmNvbXByZXNzZWRMZW5ndGgoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV0dHlQcmludE1lbW9yeShzc3RhYmxlLm9uRGlza0xlbmd0aCgpKSk7CisKKyAgICAgICAgTGlzdDxQYXJ0aXRpb25TdGF0cz4gbWF0Y2hlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBTU1RhYmxlU3RhdHMgc3N0YWJsZVN0YXRzID0gbmV3IFNTVGFibGVTdGF0cygpOworCisgICAgICAgIHRyeSAoSVNTVGFibGVTY2FubmVyIHNjYW5uZXIgPSBidWlsZFNjYW5uZXIoc3N0YWJsZSwgbWV0YWRhdGEsIGtleXMsIGV4Y2x1ZGVkS2V5cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlIChzY2FubmVyLmhhc05leHQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkgKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBwYXJ0aXRpb24gPSBzY2FubmVyLm5leHQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIga2V5ID0gcGFydGl0aW9uLnBhcnRpdGlvbktleSgpLmdldEtleSgpOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzRXhjbHVkZWQgPSBleGNsdWRlZEtleXMuY29udGFpbnMobWV0YWRhdGEucGFydGl0aW9uS2V5VHlwZS5nZXRTdHJpbmcoa2V5KSk7CisKKyAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uU3RhdHMgcGFydGl0aW9uU3RhdHMgPSBuZXcgUGFydGl0aW9uU3RhdHMoa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubmVyLmdldEN1cnJlbnRQb3NpdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb24ucGFydGl0aW9uTGV2ZWxEZWxldGlvbigpLmlzTGl2ZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBDb25zdW1lIHRoZSBwYXJ0aXRpb24gdG8gcG9wdWxhdGUgdGhlIHN0YXRzLgorICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGFydGl0aW9uLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVW5maWx0ZXJlZCB1bmZpbHRlcmVkID0gcGFydGl0aW9uLm5leHQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCBhbnkgZGV0YWlscyBpZiB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIG9uIGl0cyBzaXplIG9yIGlmIGl0J3MgZXhjbHVkZWQuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnRpdGlvbnNPbmx5ICYmICFpc0V4Y2x1ZGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvblN0YXRzLmFkZFVuZmlsdGVyZWQoZGVzYywgY3VycmVudFRpbWUsIHVuZmlsdGVyZWQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3JkIHRoZSBwYXJ0aXRvbiBzaXplCisgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvblN0YXRzLmVuZE9mUGFydGl0aW9uKHNjYW5uZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChpc0V4Y2x1ZGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgc3N0YWJsZVN0YXRzLmFkZFBhcnRpdGlvbihwYXJ0aXRpb25TdGF0cyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRpdGlvblN0YXRzLnNpemUgPCBzaXplVGhyZXNob2xkICYmCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25TdGF0cy5yb3dDb3VudCA8IHJvd0NvdW50VGhyZXNob2xkICYmCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25TdGF0cy5jZWxsQ291bnQgPCBjZWxsQ291bnRUaHJlc2hvbGQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvblN0YXRzLnRvbWJzdG9uZUNvdW50KCkgPCB0b21ic3RvbmVDb3VudFRocmVzaG9sZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMuYWRkKHBhcnRpdGlvblN0YXRzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNzdikKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvblN0YXRzLnByaW50UGFydGl0aW9uSW5mb0NTVihtZXRhZGF0YSwgZGVzYyk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvblN0YXRzLnByaW50UGFydGl0aW9uSW5mbyhtZXRhZGF0YSwgcGFydGl0aW9uc09ubHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50ZigiRmFpbHVyZSBwcm9jZXNzaW5nIHNzdGFibGUgJXM6ICVzJW4iLCBkZXNjLmRlc2NyaXB0b3IsIGUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgc3N0YWJsZS5zZWxmUmVmKCkucmVsZWFzZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjc3YpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50U3VtbWFyeShtZXRhZGF0YSwgZGVzYywgc3N0YWJsZVN0YXRzLCBtYXRjaGVzLCBwYXJ0aXRpb25zT25seSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcHJldHR5UHJpbnRNZW1vcnkobG9uZyBieXRlcykKKyAgICB7CisgICAgICAgIHJldHVybiBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShieXRlcywgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgSVNTVGFibGVTY2FubmVyIGJ1aWxkU2Nhbm5lcihTU1RhYmxlUmVhZGVyIHNzdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10ga2V5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IGV4Y2x1ZGVkS2V5cykKKyAgICB7CisgICAgICAgIGlmIChrZXlzICE9IG51bGwgJiYga2V5cy5sZW5ndGggPiAwKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3N0YWJsZS5nZXRTY2FubmVyKEFycmF5cy5zdHJlYW0oa2V5cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoa2V5IC0+ICFleGNsdWRlZEtleXMuY29udGFpbnMoa2V5KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAobWV0YWRhdGEucGFydGl0aW9uS2V5VHlwZTo6ZnJvbVN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoayAtPiBzc3RhYmxlLmdldFBhcnRpdGlvbmVyKCkuZGVjb3JhdGVLZXkoaykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc29ydGVkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoRGVjb3JhdGVkS2V5OjpnZXRUb2tlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAodG9rZW4gLT4gbmV3IEJvdW5kczw+KHRva2VuLm1pbktleUJvdW5kKCksIHRva2VuLm1heEtleUJvdW5kKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy48QWJzdHJhY3RCb3VuZHM8UGFydGl0aW9uUG9zaXRpb24+PnRvTGlzdCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLml0ZXJhdG9yKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50ZigiQ2Fubm90IHVzZSBvbmUgb3IgbW9yZSBwYXJ0aXRpb24ga2V5cyBpbiAlcyBmb3IgdGhlIHBhcnRpdGlvbiBrZXkgdHlwZSAoJyVzJykgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mIHRoZSB1bmRlcmx5aW5nIHRhYmxlOiAlcyVuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoa2V5cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEucGFydGl0aW9uS2V5VHlwZS5hc0NRTDNUeXBlKCksIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzc3RhYmxlLmdldFNjYW5uZXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50U3VtbWFyeShUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkRGVzY3JpcHRvciBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVTdGF0cyBzdGF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFBhcnRpdGlvblN0YXRzPiBtYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcGFydGl0aW9uc09ubHkpCisgICAgeworICAgICAgICAvLyBQcmludCBoZWFkZXIKKyAgICAgICAgaWYgKCFtYXRjaGVzLmlzRW1wdHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIlN1bW1hcnkgb2YgJXM6JW4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEZpbGU6ICVzJW4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICVkIHBhcnRpdGlvbnMgbWF0Y2glbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgS2V5czoiLCBkZXNjLCBkZXNjLmRlc2NyaXB0b3IuZmlsZUZvcihCaWdGb3JtYXQuQ29tcG9uZW50cy5EQVRBKSwgbWF0Y2hlcy5zaXplKCkpOworCisgICAgICAgICAgICBmb3IgKFBhcnRpdGlvblN0YXRzIG1hdGNoIDogbWF0Y2hlcykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIiArIG1heWJlRXNjYXBlS2V5Rm9yU3VtbWFyeShtZXRhZGF0YSwgbWF0Y2gua2V5KSk7CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJpbnQgc3RhdHMgdGFibGUgY29sdW1ucworICAgICAgICBTdHJpbmcgZm9ybWF0OworICAgICAgICBpZiAocGFydGl0aW9uc09ubHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgICAgICAgICAlMjBzJW4iLCAiUGFydGl0aW9uIHNpemUiKTsKKyAgICAgICAgICAgIGZvcm1hdCA9ICIgICUtNXMgICUyMHMlbiI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICAgICAgICAgJTIwcyAlMjBzICUyMHMgJTIwcyVuIiwgIlBhcnRpdGlvbiBzaXplIiwgIlJvdyBjb3VudCIsICJDZWxsIGNvdW50IiwgIlRvbWJzdG9uZSBjb3VudCIpOworICAgICAgICAgICAgZm9ybWF0ID0gIiAgJS01cyAgJTIwcyAlMjBkICUyMGQgJTIwZCVuIjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByaW50IGFwcHJveGltYXRlIHBlcmNlbnRpbGVzIGZyb20gdGhlIGhpc3RvZ3JhbXMKKyAgICAgICAgcHJpbnRQZXJjZW50aWxlKHBhcnRpdGlvbnNPbmx5LCBzdGF0cywgZm9ybWF0LCAifnA1MCIsIGggLT4gaC5wZXJjZW50aWxlKC41ZCkpOworICAgICAgICBwcmludFBlcmNlbnRpbGUocGFydGl0aW9uc09ubHksIHN0YXRzLCBmb3JtYXQsICJ+cDc1IiwgaCAtPiBoLnBlcmNlbnRpbGUoLjc1ZCkpOworICAgICAgICBwcmludFBlcmNlbnRpbGUocGFydGl0aW9uc09ubHksIHN0YXRzLCBmb3JtYXQsICJ+cDkwIiwgaCAtPiBoLnBlcmNlbnRpbGUoLjkwZCkpOworICAgICAgICBwcmludFBlcmNlbnRpbGUocGFydGl0aW9uc09ubHksIHN0YXRzLCBmb3JtYXQsICJ+cDk1IiwgaCAtPiBoLnBlcmNlbnRpbGUoLjk1ZCkpOworICAgICAgICBwcmludFBlcmNlbnRpbGUocGFydGl0aW9uc09ubHksIHN0YXRzLCBmb3JtYXQsICJ+cDk5IiwgaCAtPiBoLnBlcmNlbnRpbGUoLjk5ZCkpOworICAgICAgICBwcmludFBlcmNlbnRpbGUocGFydGl0aW9uc09ubHksIHN0YXRzLCBmb3JtYXQsICJ+cDk5OSIsIGggLT4gaC5wZXJjZW50aWxlKC45OTlkKSk7CisKKyAgICAgICAgLy8gUHJpbnQgYWNjdXJhdGUgbWV0cmljcyAobWluL21heC9jb3VudCkKKyAgICAgICAgaWYgKHBhcnRpdGlvbnNPbmx5KQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50Zihmb3JtYXQsICJtaW4iLCBwcmV0dHlQcmludE1lbW9yeShzdGF0cy5taW5TaXplKSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50Zihmb3JtYXQsICJtYXgiLCBwcmV0dHlQcmludE1lbW9yeShzdGF0cy5tYXhTaXplKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50Zihmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWluIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXR0eVByaW50TWVtb3J5KHN0YXRzLm1pblNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMubWluUm93Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5taW5DZWxsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5taW5Ub21ic3RvbmVDb3VudCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50Zihmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXR0eVByaW50TWVtb3J5KHN0YXRzLm1heFNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMubWF4Um93Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5tYXhDZWxsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5tYXhUb21ic3RvbmVDb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAgY291bnQgICUyMGQlbiIsIHN0YXRzLnBhcnRpdGlvblNpemVIaXN0b2dyYW0uY291bnQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFBlcmNlbnRpbGUoYm9vbGVhbiBwYXJ0aXRpb25zT25seSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlU3RhdHMgc3RhdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvTG9uZ0Z1bmN0aW9uPEVzdGltYXRlZEhpc3RvZ3JhbT4gdmFsdWUpCisgICAgeworICAgICAgICBpZiAocGFydGl0aW9uc09ubHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXR0eVByaW50TWVtb3J5KHZhbHVlLmFwcGx5QXNMb25nKHN0YXRzLnBhcnRpdGlvblNpemVIaXN0b2dyYW0pKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50Zihmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV0dHlQcmludE1lbW9yeSh2YWx1ZS5hcHBseUFzTG9uZyhzdGF0cy5wYXJ0aXRpb25TaXplSGlzdG9ncmFtKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5hcHBseUFzTG9uZyhzdGF0cy5yb3dDb3VudEhpc3RvZ3JhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5hcHBseUFzTG9uZyhzdGF0cy5jZWxsQ291bnRIaXN0b2dyYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuYXBwbHlBc0xvbmcoc3RhdHMudG9tYnN0b25lQ291bnRIaXN0b2dyYW0pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBtYXliZUVzY2FwZUtleUZvclN1bW1hcnkoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgQnl0ZUJ1ZmZlciBrZXkpCisgICAgeworICAgICAgICBTdHJpbmcgcyA9IG1ldGFkYXRhLnBhcnRpdGlvbktleVR5cGUuZ2V0U3RyaW5nKGtleSk7CisgICAgICAgIGlmIChzLmluZGV4T2YoJyAnKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICByZXR1cm4gIlwiIiArIFN0cmluZ1V0aWxzLnJlcGxhY2UocywgIlwiIiwgIlwiXCIiKSArICJcIiI7CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIFNTVGFibGVTdGF0cworICAgIHsKKyAgICAgICAgLy8gRUggb2YgMTU1IGNhbiB0cmFjayBhIG1heCB2YWx1ZSBvZiAzNTIwNTcxNTQ4NDEyIGkuZS4gMy41VEIKKyAgICAgICAgRXN0aW1hdGVkSGlzdG9ncmFtIHBhcnRpdGlvblNpemVIaXN0b2dyYW0gPSBuZXcgRXN0aW1hdGVkSGlzdG9ncmFtKDE1NSwgdHJ1ZSk7CisKKyAgICAgICAgLy8gRUggb2YgMTE4IGNhbiB0cmFjayBhIG1heCB2YWx1ZSBvZiA0MTM5MTEwOTgxLCBpLmUuLCA+IDRCIHJvd3MsIGNlbGxzIG9yIHRvbWJzdG9uZXMKKyAgICAgICAgRXN0aW1hdGVkSGlzdG9ncmFtIHJvd0NvdW50SGlzdG9ncmFtID0gbmV3IEVzdGltYXRlZEhpc3RvZ3JhbSgxMTgsIHRydWUpOworICAgICAgICBFc3RpbWF0ZWRIaXN0b2dyYW0gY2VsbENvdW50SGlzdG9ncmFtID0gbmV3IEVzdGltYXRlZEhpc3RvZ3JhbSgxMTgsIHRydWUpOworICAgICAgICBFc3RpbWF0ZWRIaXN0b2dyYW0gdG9tYnN0b25lQ291bnRIaXN0b2dyYW0gPSBuZXcgRXN0aW1hdGVkSGlzdG9ncmFtKDExOCwgdHJ1ZSk7CisKKyAgICAgICAgbG9uZyBtaW5TaXplID0gMDsKKyAgICAgICAgbG9uZyBtYXhTaXplID0gMDsKKworICAgICAgICBpbnQgbWluUm93Q291bnQgPSAwOworICAgICAgICBpbnQgbWF4Um93Q291bnQgPSAwOworCisgICAgICAgIGludCBtaW5DZWxsQ291bnQgPSAwOworICAgICAgICBpbnQgbWF4Q2VsbENvdW50ID0gMDsKKworICAgICAgICBpbnQgbWluVG9tYnN0b25lQ291bnQgPSAwOworICAgICAgICBpbnQgbWF4VG9tYnN0b25lQ291bnQgPSAwOworCisgICAgICAgIHZvaWQgYWRkUGFydGl0aW9uKFBhcnRpdGlvblN0YXRzIHN0YXRzKQorICAgICAgICB7CisgICAgICAgICAgICBwYXJ0aXRpb25TaXplSGlzdG9ncmFtLmFkZChzdGF0cy5zaXplKTsKKyAgICAgICAgICAgIHJvd0NvdW50SGlzdG9ncmFtLmFkZChzdGF0cy5yb3dDb3VudCk7CisgICAgICAgICAgICBjZWxsQ291bnRIaXN0b2dyYW0uYWRkKHN0YXRzLmNlbGxDb3VudCk7CisgICAgICAgICAgICB0b21ic3RvbmVDb3VudEhpc3RvZ3JhbS5hZGQoc3RhdHMudG9tYnN0b25lQ291bnQoKSk7CisKKyAgICAgICAgICAgIGlmIChtaW5TaXplID09IDAgfHwgc3RhdHMuc2l6ZSA8IG1pblNpemUpCisgICAgICAgICAgICAgICAgbWluU2l6ZSA9IHN0YXRzLnNpemU7CisgICAgICAgICAgICBpZiAoc3RhdHMuc2l6ZSA+IG1heFNpemUpCisgICAgICAgICAgICAgICAgbWF4U2l6ZSA9IHN0YXRzLnNpemU7CisKKyAgICAgICAgICAgIGlmIChtaW5Sb3dDb3VudCA9PSAwIHx8IHN0YXRzLnJvd0NvdW50IDwgbWluUm93Q291bnQpCisgICAgICAgICAgICAgICAgbWluUm93Q291bnQgPSBzdGF0cy5yb3dDb3VudDsKKyAgICAgICAgICAgIGlmIChzdGF0cy5yb3dDb3VudCA+IG1heFJvd0NvdW50KQorICAgICAgICAgICAgICAgIG1heFJvd0NvdW50ID0gc3RhdHMucm93Q291bnQ7CisKKyAgICAgICAgICAgIGlmIChtaW5DZWxsQ291bnQgPT0gMCB8fCBzdGF0cy5jZWxsQ291bnQgPCBtaW5DZWxsQ291bnQpCisgICAgICAgICAgICAgICAgbWluQ2VsbENvdW50ID0gc3RhdHMuY2VsbENvdW50OworICAgICAgICAgICAgaWYgKHN0YXRzLmNlbGxDb3VudCA+IG1heENlbGxDb3VudCkKKyAgICAgICAgICAgICAgICBtYXhDZWxsQ291bnQgPSBzdGF0cy5jZWxsQ291bnQ7CisKKyAgICAgICAgICAgIGlmIChtaW5Ub21ic3RvbmVDb3VudCA9PSAwIHx8IHN0YXRzLnRvbWJzdG9uZUNvdW50KCkgPCBtaW5Ub21ic3RvbmVDb3VudCkKKyAgICAgICAgICAgICAgICBtaW5Ub21ic3RvbmVDb3VudCA9IHN0YXRzLnRvbWJzdG9uZUNvdW50KCk7CisgICAgICAgICAgICBpZiAoc3RhdHMudG9tYnN0b25lQ291bnQoKSA+IG1heFRvbWJzdG9uZUNvdW50KQorICAgICAgICAgICAgICAgIG1heFRvbWJzdG9uZUNvdW50ID0gc3RhdHMudG9tYnN0b25lQ291bnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBQYXJ0aXRpb25TdGF0cworICAgIHsKKyAgICAgICAgZmluYWwgQnl0ZUJ1ZmZlciBrZXk7CisgICAgICAgIGZpbmFsIGxvbmcgb2Zmc2V0OworICAgICAgICBmaW5hbCBib29sZWFuIGxpdmU7CisKKyAgICAgICAgbG9uZyBzaXplID0gLTE7CisgICAgICAgIGludCByb3dDb3VudCA9IDA7CisgICAgICAgIGludCBjZWxsQ291bnQgPSAwOworICAgICAgICBpbnQgcm93VG9tYnN0b25lQ291bnQgPSAwOworICAgICAgICBpbnQgcmFuZ2VUb21ic3RvbmVDb3VudCA9IDA7CisgICAgICAgIGludCBjb21wbGV4VG9tYnN0b25lQ291bnQgPSAwOworICAgICAgICBpbnQgY2VsbFRvbWJzdG9uZUNvdW50ID0gMDsKKyAgICAgICAgaW50IHJvd1R0bEV4cGlyZWQgPSAwOworICAgICAgICBpbnQgY2VsbFR0bEV4cGlyZWQgPSAwOworCisgICAgICAgIFBhcnRpdGlvblN0YXRzKEJ5dGVCdWZmZXIga2V5LCBsb25nIG9mZnNldCwgYm9vbGVhbiBsaXZlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICAgICAgdGhpcy5saXZlID0gbGl2ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZW5kT2ZQYXJ0aXRpb24obG9uZyBwb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZSA9IHBvc2l0aW9uIC0gb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgaW50IHRvbWJzdG9uZUNvdW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHJvd1RvbWJzdG9uZUNvdW50ICsgcmFuZ2VUb21ic3RvbmVDb3VudCArIGNvbXBsZXhUb21ic3RvbmVDb3VudCArIGNlbGxUb21ic3RvbmVDb3VudCArIHJvd1R0bEV4cGlyZWQgKyBjZWxsVHRsRXhwaXJlZDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYWRkVW5maWx0ZXJlZChFeHRlbmRlZERlc2NyaXB0b3IgZGVzYywgbG9uZyBjdXJyZW50VGltZSwgVW5maWx0ZXJlZCB1bmZpbHRlcmVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodW5maWx0ZXJlZCBpbnN0YW5jZW9mIFJvdykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSb3cgcm93ID0gKFJvdykgdW5maWx0ZXJlZDsKKyAgICAgICAgICAgICAgICByb3dDb3VudCsrOworCisgICAgICAgICAgICAgICAgaWYgKCFyb3cuZGVsZXRpb24oKS5pc0xpdmUoKSkKKyAgICAgICAgICAgICAgICAgICAgcm93VG9tYnN0b25lQ291bnQrKzsKKworICAgICAgICAgICAgICAgIExpdmVuZXNzSW5mbyBsaXZlSW5mbyA9IHJvdy5wcmltYXJ5S2V5TGl2ZW5lc3NJbmZvKCk7CisgICAgICAgICAgICAgICAgaWYgKCFsaXZlSW5mby5pc0VtcHR5KCkgJiYgbGl2ZUluZm8uaXNFeHBpcmluZygpICYmIGxpdmVJbmZvLmxvY2FsRXhwaXJhdGlvblRpbWUoKSA8IGN1cnJlbnRUaW1lKQorICAgICAgICAgICAgICAgICAgICByb3dUdGxFeHBpcmVkKys7CisKKyAgICAgICAgICAgICAgICBmb3IgKENvbHVtbkRhdGEgY2QgOiByb3cpCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIGlmIChjZC5jb2x1bW4oKS5pc1NpbXBsZSgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRDZWxsKChpbnQpIGN1cnJlbnRUaW1lLCBsaXZlSW5mbywgKENlbGw8Pz4pIGNkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbXBsZXhDb2x1bW5EYXRhIGNvbXBsZXhEYXRhID0gKENvbXBsZXhDb2x1bW5EYXRhKSBjZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29tcGxleERhdGEuY29tcGxleERlbGV0aW9uKCkuaXNMaXZlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleFRvbWJzdG9uZUNvdW50Kys7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQ2VsbDw/PiBjZWxsIDogY29tcGxleERhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQ2VsbCgoaW50KSBjdXJyZW50VGltZSwgbGl2ZUluZm8sIGNlbGwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodW5maWx0ZXJlZCBpbnN0YW5jZW9mIFJhbmdlVG9tYnN0b25lTWFya2VyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJhbmdlVG9tYnN0b25lQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVua25vd24ga2luZCAiICsgdW5maWx0ZXJlZC5raW5kKCkgKyAiIGluIHNzdGFibGUgIiArIGRlc2MuZGVzY3JpcHRvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgYWRkQ2VsbChpbnQgY3VycmVudFRpbWUsIExpdmVuZXNzSW5mbyBsaXZlSW5mbywgQ2VsbDw/PiBjZWxsKQorICAgICAgICB7CisgICAgICAgICAgICBjZWxsQ291bnQrKzsKKyAgICAgICAgICAgIGlmIChjZWxsLmlzVG9tYnN0b25lKCkpCisgICAgICAgICAgICAgICAgY2VsbFRvbWJzdG9uZUNvdW50Kys7CisgICAgICAgICAgICBpZiAoY2VsbC5pc0V4cGlyaW5nKCkgJiYgKGxpdmVJbmZvLmlzRW1wdHkoKSB8fCBjZWxsLnR0bCgpICE9IGxpdmVJbmZvLnR0bCgpKSAmJiAhY2VsbC5pc0xpdmUoY3VycmVudFRpbWUpKQorICAgICAgICAgICAgICAgIGNlbGxUdGxFeHBpcmVkKys7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHByaW50UGFydGl0aW9uSW5mbyhUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBib29sZWFuIHBhcnRpdGlvbnNPbmx5KQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gbWV0YWRhdGEucGFydGl0aW9uS2V5VHlwZS5nZXRTdHJpbmcodGhpcy5rZXkpOworICAgICAgICAgICAgaWYgKHBhcnRpdGlvbnNPbmx5KQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIFBhcnRpdGlvbjogJyVzJyAoJXMpICVzLCBzaXplOiAlcyVuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleCh0aGlzLmtleSksIGxpdmUgPyAibGl2ZSIgOiAibm90IGxpdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXR0eVByaW50TWVtb3J5KHNpemUpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICBQYXJ0aXRpb246ICclcycgKCVzKSAlcywgc2l6ZTogJXMsIHJvd3M6ICVkLCBjZWxsczogJWQsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b21ic3RvbmVzOiAlZCAocm93OiVkLCByYW5nZTolZCwgY29tcGxleDolZCwgY2VsbDolZCwgcm93LVRUTGQ6JWQsIGNlbGwtVFRMZDolZCklbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgodGhpcy5rZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmUgPyAibGl2ZSIgOiAibm90IGxpdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXR0eVByaW50TWVtb3J5KHNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b21ic3RvbmVDb3VudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1RvbWJzdG9uZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlVG9tYnN0b25lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleFRvbWJzdG9uZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxUb21ic3RvbmVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dUdGxFeHBpcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxUdGxFeHBpcmVkKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcHJpbnRQYXJ0aXRpb25JbmZvQ1NWKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsIEV4dGVuZGVkRGVzY3JpcHRvciBkZXNjKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiXCIlc1wiLCVzLCVzLCVkLCVkLCVkLCVkLCVkLCVkLCVkLCVkLCVkLCVkLCVkLCVzLCVzLCVzLCVzLCVzLCVzLCVzLCVzLCVzJW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5YmVFc2NhcGVLZXlGb3JTdW1tYXJ5KG1ldGFkYXRhLCBrZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChrZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZSA/ICJ0cnVlIiA6ICJmYWxzZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dDb3VudCwgY2VsbENvdW50LCB0b21ic3RvbmVDb3VudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93VG9tYnN0b25lQ291bnQsIHJhbmdlVG9tYnN0b25lQ291bnQsIGNvbXBsZXhUb21ic3RvbmVDb3VudCwgY2VsbFRvbWJzdG9uZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93VHRsRXhwaXJlZCwgY2VsbFR0bEV4cGlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLmRlc2NyaXB0b3IuZmlsZUZvcihCaWdGb3JtYXQuQ29tcG9uZW50cy5EQVRBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdE51bGwoZGVzYy5rZXlzcGFjZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3ROdWxsKGRlc2MudGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90TnVsbChkZXNjLmluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdE51bGwoZGVzYy5zbmFwc2hvdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3ROdWxsKGRlc2MuYmFja3VwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MuZGVzY3JpcHRvci5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MuZGVzY3JpcHRvci52ZXJzaW9uLmZvcm1hdC5uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLmRlc2NyaXB0b3IudmVyc2lvbi52ZXJzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBFeHRlbmRlZERlc2NyaXB0b3IgaW1wbGVtZW50cyBDb21wYXJhYmxlPEV4dGVuZGVkRGVzY3JpcHRvcj4KKyAgICB7CisgICAgICAgIGZpbmFsIFN0cmluZyBrZXlzcGFjZTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRhYmxlOworICAgICAgICBmaW5hbCBTdHJpbmcgaW5kZXg7CisgICAgICAgIGZpbmFsIFN0cmluZyBzbmFwc2hvdDsKKyAgICAgICAgZmluYWwgU3RyaW5nIGJhY2t1cDsKKyAgICAgICAgZmluYWwgVGFibGVJZCB0YWJsZUlkOworICAgICAgICBmaW5hbCBEZXNjcmlwdG9yIGRlc2NyaXB0b3I7CisKKyAgICAgICAgRXh0ZW5kZWREZXNjcmlwdG9yKFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlLCBUYWJsZUlkIHRhYmxlSWQsIFN0cmluZyBpbmRleCwgU3RyaW5nIHNuYXBzaG90LCBTdHJpbmcgYmFja3VwLCBEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMua2V5c3BhY2UgPSBrZXlzcGFjZTsKKyAgICAgICAgICAgIHRoaXMudGFibGUgPSB0YWJsZTsKKyAgICAgICAgICAgIHRoaXMudGFibGVJZCA9IHRhYmxlSWQ7CisgICAgICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisgICAgICAgICAgICB0aGlzLnNuYXBzaG90ID0gc25hcHNob3Q7CisgICAgICAgICAgICB0aGlzLmJhY2t1cCA9IGJhY2t1cDsKKyAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgaWYgKGJhY2t1cCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiQmFja3VwOiIpLmFwcGVuZChiYWNrdXApLmFwcGVuZCgnICcpOworICAgICAgICAgICAgaWYgKHNuYXBzaG90ICE9IG51bGwpCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJTbmFwc2hvdDoiKS5hcHBlbmQoc25hcHNob3QpLmFwcGVuZCgnICcpOworICAgICAgICAgICAgaWYgKGtleXNwYWNlICE9IG51bGwpCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGtleXNwYWNlKS5hcHBlbmQoJy4nKTsKKyAgICAgICAgICAgIGlmICh0YWJsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh0YWJsZSk7CisgICAgICAgICAgICBpZiAoaW5kZXggIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJy4nKS5hcHBlbmQoaW5kZXgpOworICAgICAgICAgICAgaWYgKHRhYmxlSWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJy0nKS5hcHBlbmQodGFibGVJZC50b0hleFN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBzYi5hcHBlbmQoIiAjIikKKyAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZGVzY3JpcHRvci5pZCkKKyAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAoIikKKyAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZGVzY3JpcHRvci52ZXJzaW9uLmZvcm1hdC5uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCctJykKKyAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZGVzY3JpcHRvci52ZXJzaW9uLnZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCcpJykKKyAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIEV4dGVuZGVkRGVzY3JpcHRvciBndWVzc0Zyb21GaWxlKEZpbGUgZkFyZykKKyAgICAgICAgeworICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gRGVzY3JpcHRvci5mcm9tRmlsZShmQXJnKTsKKworICAgICAgICAgICAgU3RyaW5nIHNuYXBzaG90ID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBiYWNrdXAgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIGluZGV4ID0gbnVsbDsKKworICAgICAgICAgICAgRmlsZSBwYXJlbnQgPSBmQXJnLnBhcmVudCgpOworICAgICAgICAgICAgRmlsZSBncmFuZHBhcmVudCA9IHBhcmVudC5wYXJlbnQoKTsKKworICAgICAgICAgICAgaWYgKHBhcmVudC5uYW1lKCkubGVuZ3RoKCkgPiAxICYmIHBhcmVudC5uYW1lKCkuc3RhcnRzV2l0aCgiLiIpICYmIHBhcmVudC5uYW1lKCkuY2hhckF0KDEpICE9ICcuJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IHBhcmVudC5uYW1lKCkuc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQoKTsKKyAgICAgICAgICAgICAgICBncmFuZHBhcmVudCA9IHBhcmVudC5wYXJlbnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhcmVudC5uYW1lKCkuZXF1YWxzKERpcmVjdG9yaWVzLkJBQ0tVUFNfU1VCRElSKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiYWNrdXAgPSBwYXJlbnQubmFtZSgpOworICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQoKTsKKyAgICAgICAgICAgICAgICBncmFuZHBhcmVudCA9IHBhcmVudC5wYXJlbnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGdyYW5kcGFyZW50Lm5hbWUoKS5lcXVhbHMoRGlyZWN0b3JpZXMuU05BUFNIT1RfU1VCRElSKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbmFwc2hvdCA9IHBhcmVudC5uYW1lKCk7CisgICAgICAgICAgICAgICAgcGFyZW50ID0gZ3JhbmRwYXJlbnQucGFyZW50KCk7CisgICAgICAgICAgICAgICAgZ3JhbmRwYXJlbnQgPSBwYXJlbnQucGFyZW50KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBUYWJsZUlkPiB0YWJsZU5hbWVBbmRJZCA9IFRhYmxlSWQudGFibGVOYW1lQW5kSWRGcm9tRmlsZW5hbWUocGFyZW50Lm5hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKHRhYmxlTmFtZUFuZElkICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4dGVuZGVkRGVzY3JpcHRvcihncmFuZHBhcmVudC5uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZUFuZElkLmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZUFuZElkLnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHNob3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBub24tcGFyc2VhYmxlIHRhYmxlLUlEcworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IEV4dGVuZGVkRGVzY3JpcHRvcihudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBzaG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oRXh0ZW5kZWREZXNjcmlwdG9yIG8pCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjID0gZGVzY3JpcHRvci5kaXJlY3RvcnkudG9TdHJpbmcoKS5jb21wYXJlVG8oby5kZXNjcmlwdG9yLmRpcmVjdG9yeS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGlmIChjICE9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgICAgICBjID0gbm90TnVsbChrZXlzcGFjZSkuY29tcGFyZVRvKG5vdE51bGwoby5rZXlzcGFjZSkpOworICAgICAgICAgICAgaWYgKGMgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgICAgIGMgPSBub3ROdWxsKHRhYmxlKS5jb21wYXJlVG8obm90TnVsbChvLnRhYmxlKSk7CisgICAgICAgICAgICBpZiAoYyAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgYyA9IG5vdE51bGwodGFibGVJZCkudG9TdHJpbmcoKS5jb21wYXJlVG8obm90TnVsbChvLnRhYmxlSWQpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgaWYgKGMgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgICAgIGMgPSBub3ROdWxsKGluZGV4KS5jb21wYXJlVG8obm90TnVsbChvLmluZGV4KSk7CisgICAgICAgICAgICBpZiAoYyAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgYyA9IG5vdE51bGwoc25hcHNob3QpLmNvbXBhcmVUbyhub3ROdWxsKG8uc25hcHNob3QpKTsKKyAgICAgICAgICAgIGlmIChjICE9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgICAgICBjID0gbm90TnVsbChiYWNrdXApLmNvbXBhcmVUbyhub3ROdWxsKG8uYmFja3VwKSk7CisgICAgICAgICAgICBpZiAoYyAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgYyA9IG5vdE51bGwoZGVzY3JpcHRvci5pZC50b1N0cmluZygpKS5jb21wYXJlVG8obm90TnVsbChvLmRlc2NyaXB0b3IuaWQudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgaWYgKGMgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLmNvbXBhcmUoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcyksIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG8pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBub3ROdWxsKFN0cmluZyBzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHMgIT0gbnVsbCA/IHMgOiAiIjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBUYWJsZUlkIG5vdE51bGwoVGFibGVJZCBzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHMgIT0gbnVsbCA/IHMgOiBFTVBUWV9UQUJMRV9JRDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlUmVwYWlyZWRBdFNldHRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZVJlcGFpcmVkQXRTZXR0ZXIuamF2YQppbmRleCAxMjg5ZTdlLi5mNWVlM2RmIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlUmVwYWlyZWRBdFNldHRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVSZXBhaXJlZEF0U2V0dGVyLmphdmEKQEAgLTI2LDIwICsyNiw4IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBTZXQgcmVwYWlyZWRBdCBzdGF0dXMgb24gYSBnaXZlbiBzZXQgb2Ygc3N0YWJsZXMuCi0gKgotICogSWYgeW91IHBhc3MgLS1pcy1yZXBhaXJlZCwgaXQgd2lsbCBzZXQgdGhlIHJlcGFpcmVkQXQgdGltZSB0byB0aGUgbGFzdCBtb2RpZmllZCB0aW1lLgotICoKLSAqIElmIHlvdSBrbm93IHlvdSByYW4gcmVwYWlyIDIgd2Vla3MgYWdvLCB5b3UgY2FuIGRvIHNvbWV0aGluZyBsaWtlCi0gKgotICoge0Bjb2RlCi0gKiBzc3RhYmxlcmVwYWlyc2V0IC0taXMtcmVwYWlyZWQgLWYgPChmaW5kIC92YXIvbGliL2Nhc3NhbmRyYS9kYXRhLy4uLi8gLWluYW1lICIqRGF0YS5kYioiIC1tdGltZSArMTQpCi0gKiB9Ci0gKi8KK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0LkNvbXBvbmVudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogCiBwdWJsaWMgY2xhc3MgU1NUYWJsZVJlcGFpcmVkQXRTZXR0ZXIKQEAgLTgxLDcgKzY5LDcgQEAKIAogICAgICAgICBmb3IgKFN0cmluZyBmbmFtZTogZmlsZU5hbWVzKQogICAgICAgICB7Ci0gICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLmZyb21GaWxlbmFtZShmbmFtZSk7CisgICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLmZyb21GaWxlV2l0aENvbXBvbmVudChuZXcgRmlsZShmbmFtZSksIGZhbHNlKS5sZWZ0OwogICAgICAgICAgICAgaWYgKCFkZXNjcmlwdG9yLnZlcnNpb24uaXNDb21wYXRpYmxlKCkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJTU1RhYmxlICIgKyBmbmFtZSArICIgaXMgaW4gYSBvbGQgYW5kIHVuc3VwcG9ydGVkIGZvcm1hdCIpOwpAQCAtOTAsNyArNzgsNyBAQAogCiAgICAgICAgICAgICBpZiAoc2V0SXNSZXBhaXJlZCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWxlVGltZSBmID0gRmlsZXMuZ2V0TGFzdE1vZGlmaWVkVGltZShuZXcgRmlsZShkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSkudG9QYXRoKCkpOworICAgICAgICAgICAgICAgIEZpbGVUaW1lIGYgPSBGaWxlcy5nZXRMYXN0TW9kaWZpZWRUaW1lKGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpLnRvUGF0aCgpKTsKICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLm11dGF0ZVJlcGFpck1ldGFkYXRhKGRlc2NyaXB0b3IsIGYudG9NaWxsaXMoKSwgbnVsbCwgZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVNjcnViYmVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TdGFuZGFsb25lU2NydWJiZXIuamF2YQppbmRleCA0NDg0YjY5Li4yNmNjMzYzIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TdGFuZGFsb25lU2NydWJiZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TdGFuZGFsb25lU2NydWJiZXIuamF2YQpAQCAtMjUsNyArMjUsNiBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5Db21tYW5kTGluZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLkNvbW1hbmRMaW5lUGFyc2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuR251UGFyc2VyOwpAQCAtNDIsMTggKzQxLDIyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5MZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uTGV2ZWxlZE1hbmlmZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLlNjcnViYmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU2NydWJiZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlSGVhZGVyRml4OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuQnVsa0xvYWRlci5DbWRMaW5lT3B0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5KVk1TdGFiaWxpdHlJbnNwZWN0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT3V0cHV0SGFuZGxlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9VVElMX0FMTE9XX1RPT0xfUkVJTklUX0ZPUl9URVNUOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwuY3VycmVudFRpbWVNaWxsaXM7CiAKIHB1YmxpYyBjbGFzcyBTdGFuZGFsb25lU2NydWJiZXIKQEAgLTc4LDcgKzgxLDcgQEAKICAgICB7CiAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnMucGFyc2VBcmdzKGFyZ3MpOwogCi0gICAgICAgIGlmIChCb29sZWFuLmdldEJvb2xlYW4oVXRpbC5BTExPV19UT09MX1JFSU5JVF9GT1JfVEVTVCkpCisgICAgICAgIGlmIChURVNUX1VUSUxfQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QuZ2V0Qm9vbGVhbigpKQogICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnRvb2xJbml0aWFsaXphdGlvbihmYWxzZSk7IC8vTmVjZXNzYXJ5IGZvciB0ZXN0aW5nCiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIFV0aWwuaW5pdERhdGFiYXNlRGVzY3JpcHRvcigpOwpAQCAtMTIwLDcgKzEyMyw3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZW50cnkuZ2V0S2V5KCk7CiAgICAgICAgICAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFjb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudC5EQVRBKSkKKyAgICAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50cy5EQVRBKSkKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAKICAgICAgICAgICAgICAgICBsaXN0UmVzdWx0LmFkZChQYWlyLmNyZWF0ZShkZXNjcmlwdG9yLCBjb21wb25lbnRzKSk7CkBAIC0xNDMsNyArMTQ2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaGVhZGVyRml4QnVpbGRlciA9IGhlYWRlckZpeEJ1aWxkZXIuZHJ5UnVuKCk7CiAKICAgICAgICAgICAgICAgICBmb3IgKFBhaXI8RGVzY3JpcHRvciwgU2V0PENvbXBvbmVudD4+IHAgOiBsaXN0UmVzdWx0KQotICAgICAgICAgICAgICAgICAgICBoZWFkZXJGaXhCdWlsZGVyLndpdGhQYXRoKEZpbGUuZ2V0UGF0aChwLmxlZnQuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpKSk7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlckZpeEJ1aWxkZXIud2l0aFBhdGgocC5sZWZ0LmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKS50b1BhdGgoKSk7CiAKICAgICAgICAgICAgICAgICBTU1RhYmxlSGVhZGVyRml4IGhlYWRlckZpeCA9IGhlYWRlckZpeEJ1aWxkZXIuYnVpbGQoKTsKICAgICAgICAgICAgICAgICB0cnkKQEAgLTE5Nyw3ICsyMDAsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IHBhaXIubGVmdDsKICAgICAgICAgICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gcGFpci5yaWdodDsKLSAgICAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50LkRBVEEpKQorICAgICAgICAgICAgICAgIGlmICghY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnRzLkRBVEEpKQogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICAgICAgICAgIHRyeQpAQCAtMjIxLDcgKzIyNCw5IEBACiAgICAgICAgICAgICAgICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gTGlmZWN5Y2xlVHJhbnNhY3Rpb24ub2ZmbGluZShPcGVyYXRpb25UeXBlLlNDUlVCLCBzc3RhYmxlKSkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgdHhuLm9ic29sZXRlT3JpZ2luYWxzKCk7IC8vIG1ha2Ugc3VyZSBvcmlnaW5hbHMgYXJlIGRlbGV0ZWQgYW5kIGF2b2lkIE5QRSBpZiBpbmRleCBpcyBtaXNzaW5nLCBDQVNTQU5EUkEtOTU5MQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IChTY3J1YmJlciBzY3J1YmJlciA9IG5ldyBTY3J1YmJlcihjZnMsIHR4biwgb3B0aW9ucy5za2lwQ29ycnVwdGVkLCBoYW5kbGVyLCAhb3B0aW9ucy5ub1ZhbGlkYXRlLCBvcHRpb25zLnJlaW5zZXJPdmVyZmxvd2VkVFRMKSkKKworICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZUZvcm1hdCBmb3JtYXQgPSBzc3RhYmxlLmRlc2NyaXB0b3IuZ2V0Rm9ybWF0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgKElTY3J1YmJlciBzY3J1YmJlciA9IGZvcm1hdC5nZXRTY3J1YmJlcihjZnMsIHR4biwgaGFuZGxlciwgb3B0aW9ucy5idWlsZCgpKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3J1YmJlci5zY3J1YigpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMjc1LDcgKzI4MCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBPcHRpb25zCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgT3B0aW9ucyBleHRlbmRzIElTY3J1YmJlci5PcHRpb25zLkJ1aWxkZXIKICAgICB7CiAgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcga2V5c3BhY2VOYW1lOwogICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGNmTmFtZTsKQEAgLTI4Myw5ICsyODgsNiBAQAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBkZWJ1ZzsKICAgICAgICAgcHVibGljIGJvb2xlYW4gdmVyYm9zZTsKICAgICAgICAgcHVibGljIGJvb2xlYW4gbWFuaWZlc3RDaGVja09ubHk7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIHNraXBDb3JydXB0ZWQ7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIG5vVmFsaWRhdGU7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlaW5zZXJPdmVyZmxvd2VkVFRMOwogICAgICAgICBwdWJsaWMgSGVhZGVyRml4TW9kZSBoZWFkZXJGaXhNb2RlID0gSGVhZGVyRml4TW9kZS5WQUxJREFURTsKIAogICAgICAgICBlbnVtIEhlYWRlckZpeE1vZGUKQEAgLTM0NCw5ICszNDYsOSBAQAogICAgICAgICAgICAgICAgIG9wdHMuZGVidWcgPSBjbWQuaGFzT3B0aW9uKERFQlVHX09QVElPTik7CiAgICAgICAgICAgICAgICAgb3B0cy52ZXJib3NlID0gY21kLmhhc09wdGlvbihWRVJCT1NFX09QVElPTik7CiAgICAgICAgICAgICAgICAgb3B0cy5tYW5pZmVzdENoZWNrT25seSA9IGNtZC5oYXNPcHRpb24oTUFOSUZFU1RfQ0hFQ0tfT1BUSU9OKTsKLSAgICAgICAgICAgICAgICBvcHRzLnNraXBDb3JydXB0ZWQgPSBjbWQuaGFzT3B0aW9uKFNLSVBfQ09SUlVQVEVEX09QVElPTik7Ci0gICAgICAgICAgICAgICAgb3B0cy5ub1ZhbGlkYXRlID0gY21kLmhhc09wdGlvbihOT19WQUxJREFURV9PUFRJT04pOwotICAgICAgICAgICAgICAgIG9wdHMucmVpbnNlck92ZXJmbG93ZWRUVEwgPSBjbWQuaGFzT3B0aW9uKFJFSU5TRVJUX09WRVJGTE9XRURfVFRMX09QVElPTik7CisgICAgICAgICAgICAgICAgb3B0cy5za2lwQ29ycnVwdGVkKGNtZC5oYXNPcHRpb24oU0tJUF9DT1JSVVBURURfT1BUSU9OKSk7CisgICAgICAgICAgICAgICAgb3B0cy5jaGVja0RhdGEoIWNtZC5oYXNPcHRpb24oTk9fVkFMSURBVEVfT1BUSU9OKSk7CisgICAgICAgICAgICAgICAgb3B0cy5yZWluc2VydE92ZXJmbG93ZWRUVExSb3dzKGNtZC5oYXNPcHRpb24oUkVJTlNFUlRfT1ZFUkZMT1dFRF9UVExfT1BUSU9OKSk7CiAgICAgICAgICAgICAgICAgaWYgKGNtZC5oYXNPcHRpb24oSEVBREVSRklYX09QVElPTikpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICB0cnkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1N0YW5kYWxvbmVTcGxpdHRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVNwbGl0dGVyLmphdmEKaW5kZXggZWZhZGI1Ni4uZjlmMjQ4YSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVNwbGl0dGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVNwbGl0dGVyLmphdmEKQEAgLTE4LDI1ICsxOCwzOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzOwogCi1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLkNvbW1hbmRMaW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuQ29tbWFuZExpbmVQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5HbnVQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5IZWxwRm9ybWF0dGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuUGFyc2VFeGNlcHRpb247CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLlNTVGFibGVTcGxpdHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5KVk1TdGFiaWxpdHlJbnNwZWN0b3I7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX1VUSUxfQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1Q7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLkJ1bGtMb2FkZXIuQ21kTGluZU9wdGlvbnM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpczsKIApAQCAtNTAsMTAgKzYzLDEwIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX1NOQVBTSE9UX09QVElPTiA9ICJuby1zbmFwc2hvdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJWkVfT1BUSU9OID0gInNpemUiOwogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQogICAgIHsKICAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9ucy5wYXJzZUFyZ3MoYXJncyk7Ci0gICAgICAgIGlmIChCb29sZWFuLmdldEJvb2xlYW4oVXRpbC5BTExPV19UT09MX1JFSU5JVF9GT1JfVEVTVCkpCisgICAgICAgIGlmIChURVNUX1VUSUxfQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QuZ2V0Qm9vbGVhbigpKQogICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnRvb2xJbml0aWFsaXphdGlvbihmYWxzZSk7IC8vTmVjZXNzYXJ5IGZvciB0ZXN0aW5nCiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIFV0aWwuaW5pdERhdGFiYXNlRGVzY3JpcHRvcigpOwpAQCAtNzQsNyArODcsNyBAQAogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBTU1RhYmxlLnRyeURlc2NyaXB0b3JGcm9tRmlsZW5hbWUoZmlsZSk7CisgICAgICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gU1NUYWJsZS50cnlEZXNjcmlwdG9yRnJvbUZpbGUoZmlsZSk7CiAgICAgICAgICAgICAgICAgaWYgKGRlc2MgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNraXBwaW5nIG5vbiBzc3RhYmxlIGZpbGUgIiArIGZpbGUpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTkwLDIxICsxMDMsNyBAQAogICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFjZk5hbWUuZXF1YWxzKGRlc2MuY2ZuYW1lKSkKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQWxsIHNzdGFibGVzIG11c3QgYmUgcGFydCBvZiB0aGUgc2FtZSB0YWJsZSIpOwogCi0gICAgICAgICAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IG5ldyBIYXNoU2V0PENvbXBvbmVudD4oQXJyYXlzLmFzTGlzdChuZXcgQ29tcG9uZW50W117Ci0gICAgICAgICAgICAgICAgICAgIENvbXBvbmVudC5EQVRBLAotICAgICAgICAgICAgICAgICAgICBDb21wb25lbnQuUFJJTUFSWV9JTkRFWCwKLSAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50LkZJTFRFUiwKLSAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50LkNPTVBSRVNTSU9OX0lORk8sCi0gICAgICAgICAgICAgICAgICAgIENvbXBvbmVudC5TVEFUUwotICAgICAgICAgICAgICAgIH0pKTsKLQotICAgICAgICAgICAgICAgIEl0ZXJhdG9yPENvbXBvbmVudD4gaXRlciA9IGNvbXBvbmVudHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50IGNvbXBvbmVudCA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIShuZXcgRmlsZShkZXNjLmZpbGVuYW1lRm9yKGNvbXBvbmVudCkpLmV4aXN0cygpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhcnNlZEZpbGVuYW1lcy5wdXQoZGVzYywgY29tcG9uZW50cyk7CisgICAgICAgICAgICAgICAgcGFyc2VkRmlsZW5hbWVzLnB1dChkZXNjLCBkZXNjLmdldENvbXBvbmVudHMoQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSwgZGVzYy5nZXRGb3JtYXQoKS5iYXRjaENvbXBvbmVudHMoKSkpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoa3NOYW1lID09IG51bGwgfHwgY2ZOYW1lID09IG51bGwpCkBAIC0xMjUsOCArMTI0LDggQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IFNTVGFibGVSZWFkZXIub3Blbk5vVmFsaWRhdGlvbihmbi5nZXRLZXkoKSwgZm4uZ2V0VmFsdWUoKSwgY2ZzKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NTVGFibGVMYXJnZXJFbm91Z2goc3N0YWJsZSwgb3B0aW9ucy5zaXplSW5NQikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJTa2lwcGluZyAlczogaXQncyBzaXplICglLjNmIE1CKSBpcyBsZXNzIHRoYW4gdGhlIHNwbGl0IHNpemUgKCVkIE1CKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuZ2V0RmlsZW5hbWUoKSwgKChzc3RhYmxlLm9uRGlza0xlbmd0aCgpICogMS4wZCkgLyAxMDI0TCkgLyAxMDI0TCwgb3B0aW9ucy5zaXplSW5NQikpOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIlNraXBwaW5nICVzOiBpdCdzIHNpemUgKCUuM2YgTUIpIGlzIGxlc3MgdGhhbiB0aGUgc3BsaXQgc2l6ZSAoJWQgTUIpJW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5nZXRGaWxlbmFtZSgpLCAoKHNzdGFibGUub25EaXNrTGVuZ3RoKCkgKiAxLjBkKSAvIDEwMjRMKSAvIDEwMjRMLCBvcHRpb25zLnNpemVJbk1CKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNzdGFibGVzLmFkZChzc3RhYmxlKTsKQEAgLTE0MCw3ICsxMzksNyBAQAogICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIEpWTVN0YWJpbGl0eUluc3BlY3Rvci5pbnNwZWN0VGhyb3dhYmxlKGUpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oU3RyaW5nLmZvcm1hdCgiRXJyb3IgTG9hZGluZyAlczogJXMiLCBmbi5nZXRLZXkoKSwgZS5nZXRNZXNzYWdlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGYoIkVycm9yIExvYWRpbmcgJXM6ICVzJW4iLCBmbi5nZXRLZXkoKSwgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5kZWJ1ZykKICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwogICAgICAgICAgICAgICAgIH0KQEAgLTE1MCw3ICsxNDksNyBAQAogICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG9wdGlvbnMuc25hcHNob3QpCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIlByZS1zcGxpdCBzc3RhYmxlcyBzbmFwc2hvdHRlZCBpbnRvIHNuYXBzaG90ICVzIiwgc25hcHNob3ROYW1lKSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIlByZS1zcGxpdCBzc3RhYmxlcyBzbmFwc2hvdHRlZCBpbnRvIHNuYXBzaG90ICVzJW4iLCBzbmFwc2hvdE5hbWUpOwogCiAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzKQogICAgICAgICAgICAgewpAQCAtMTYwLDcgKzE1OSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJFcnJvciBzcGxpdHRpbmcgJXM6ICVzIiwgc3N0YWJsZSwgZS5nZXRNZXNzYWdlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGYoIkVycm9yIHNwbGl0dGluZyAlczogJXMlbiIsIHNzdGFibGUsIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGVidWcpCiAgICAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKIApAQCAtMjAwLDcgKzE5OSw3IEBACiAgICAgICAgICAgICB0aGlzLmZpbGVuYW1lcyA9IGZpbGVuYW1lczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9ucyBwYXJzZUFyZ3MoU3RyaW5nIGNtZEFyZ3NbXSkKKyAgICAgICAgcHVibGljIHN0YXRpYyBPcHRpb25zIHBhcnNlQXJncyhTdHJpbmdbXSBjbWRBcmdzKQogICAgICAgICB7CiAgICAgICAgICAgICBDb21tYW5kTGluZVBhcnNlciBwYXJzZXIgPSBuZXcgR251UGFyc2VyKCk7CiAgICAgICAgICAgICBDbWRMaW5lT3B0aW9ucyBvcHRpb25zID0gZ2V0Q21kTGluZU9wdGlvbnMoKTsKQEAgLTI1MSwxOSArMjUwLDE4IEBACiAgICAgICAgICAgICBvcHRpb25zLmFkZE9wdGlvbihudWxsLCBERUJVR19PUFRJT04sICAgICAgICAgICJkaXNwbGF5IHN0YWNrIHRyYWNlcyIpOwogICAgICAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24oImgiLCAgSEVMUF9PUFRJT04sICAgICAgICAgICAiZGlzcGxheSB0aGlzIGhlbHAgbWVzc2FnZSIpOwogICAgICAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24obnVsbCwgTk9fU05BUFNIT1RfT1BUSU9OLCAgICAiZG9uJ3Qgc25hcHNob3QgdGhlIHNzdGFibGVzIGJlZm9yZSBzcGxpdHRpbmciKTsKLSAgICAgICAgICAgIG9wdGlvbnMuYWRkT3B0aW9uKCJzIiwgIFNJWkVfT1BUSU9OLCAic2l6ZSIsICAgIm1heGltdW0gc2l6ZSBpbiBNQiBmb3IgdGhlIG91dHB1dCBzc3RhYmxlcyAoZGVmYXVsdDogIiArIERFRkFVTFRfU1NUQUJMRV9TSVpFICsgIikiKTsKKyAgICAgICAgICAgIG9wdGlvbnMuYWRkT3B0aW9uKCJzIiwgIFNJWkVfT1BUSU9OLCAic2l6ZSIsICJtYXhpbXVtIHNpemUgaW4gTUIgZm9yIHRoZSBvdXRwdXQgc3N0YWJsZXMgKGRlZmF1bHQ6ICIgKyBERUZBVUxUX1NTVEFCTEVfU0laRSArICcpJyk7CiAgICAgICAgICAgICByZXR1cm4gb3B0aW9uczsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFVzYWdlKENtZExpbmVPcHRpb25zIG9wdGlvbnMpCiAgICAgICAgIHsKICAgICAgICAgICAgIFN0cmluZyB1c2FnZSA9IFN0cmluZy5mb3JtYXQoIiVzIFtvcHRpb25zXSA8ZmlsZW5hbWU+IFs8ZmlsZW5hbWU+XSoiLCBUT09MX05BTUUpOwotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBoZWFkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgaGVhZGVyLmFwcGVuZCgiLS1cbiIpOwotICAgICAgICAgICAgaGVhZGVyLmFwcGVuZCgiU3BsaXQgdGhlIHByb3ZpZGVkIHNzdGFibGVzIGZpbGVzIGluIHNzdGFibGVzIG9mIG1heGltdW0gcHJvdmlkZWQgZmlsZSBzaXplIChzZWUgb3B0aW9uIC0tIiArIFNJWkVfT1BUSU9OICsgIikuIiApOwotICAgICAgICAgICAgaGVhZGVyLmFwcGVuZCgiXG4tLVxuIik7Ci0gICAgICAgICAgICBoZWFkZXIuYXBwZW5kKCJPcHRpb25zIGFyZToiKTsKLSAgICAgICAgICAgIG5ldyBIZWxwRm9ybWF0dGVyKCkucHJpbnRIZWxwKHVzYWdlLCBoZWFkZXIudG9TdHJpbmcoKSwgb3B0aW9ucywgIiIpOworICAgICAgICAgICAgU3RyaW5nIGhlYWRlciA9ICItLVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNwbGl0IHRoZSBwcm92aWRlZCBzc3RhYmxlcyBmaWxlcyBpbiBzc3RhYmxlcyBvZiBtYXhpbXVtIHByb3ZpZGVkIGZpbGUgc2l6ZSAoc2VlIG9wdGlvbiAtLSIgKyBTSVpFX09QVElPTiArICIpLiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbi0tXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3B0aW9ucyBhcmU6IjsKKyAgICAgICAgICAgIG5ldyBIZWxwRm9ybWF0dGVyKCkucHJpbnRIZWxwKHVzYWdlLCBoZWFkZXIsIG9wdGlvbnMsICIiKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1N0YW5kYWxvbmVVcGdyYWRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVVwZ3JhZGVyLmphdmEKaW5kZXggYTdjMDk5Yy4uMTAwOWMzZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVVwZ3JhZGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVVwZ3JhZGVyLmphdmEKQEAgLTE3LDEwICsxNywxNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzOwogCi1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5Db21tYW5kTGluZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLkNvbW1hbmRMaW5lUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuR251UGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuSGVscEZvcm1hdHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLlBhcnNlRXhjZXB0aW9uOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKQEAgLTMwLDEzICszNywxNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLlVwZ3JhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpWTVN0YWJpbGl0eUluc3BlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PdXRwdXRIYW5kbGVyOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9VVElMX0FMTE9XX1RPT0xfUkVJTklUX0ZPUl9URVNUOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5CdWxrTG9hZGVyLkNtZExpbmVPcHRpb25zOwogCiBwdWJsaWMgY2xhc3MgU3RhbmRhbG9uZVVwZ3JhZGVyCkBAIC00OSw3ICs1Nyw3IEBACiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkKICAgICB7CiAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnMucGFyc2VBcmdzKGFyZ3MpOwotICAgICAgICBpZiAoQm9vbGVhbi5nZXRCb29sZWFuKFV0aWwuQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QpKQorICAgICAgICBpZiAoVEVTVF9VVElMX0FMTE9XX1RPT0xfUkVJTklUX0ZPUl9URVNULmdldEJvb2xlYW4oKSkKICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci50b29sSW5pdGlhbGl6YXRpb24oZmFsc2UpOyAvL05lY2Vzc2FyeSBmb3IgdGVzdGluZwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBVdGlsLmluaXREYXRhYmFzZURlc2NyaXB0b3IoKTsKQEAgLTgwLDEzICs4OCwxMyBAQAogICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8RGVzY3JpcHRvciwgU2V0PENvbXBvbmVudD4+IGVudHJ5IDogbGlzdGVyLnNvcnRlZExpc3QoKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50LkRBVEEpIHx8ICFjb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudC5QUklNQVJZX0lOREVYKSkKKyAgICAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudHMuY29udGFpbnNBbGwoZW50cnkuZ2V0S2V5KCkuZ2V0Rm9ybWF0KCkucHJpbWFyeUNvbXBvbmVudHMoKSkpCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBTU1RhYmxlUmVhZGVyLm9wZW5Ob1ZhbGlkYXRpb24oZW50cnkuZ2V0S2V5KCksIGNvbXBvbmVudHMsIGNmcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzc3RhYmxlLmRlc2NyaXB0b3IudmVyc2lvbi5lcXVhbHMoU1NUYWJsZUZvcm1hdC5UeXBlLmN1cnJlbnQoKS5pbmZvLmdldExhdGVzdFZlcnNpb24oKSkpCisgICAgICAgICAgICAgICAgICAgIGlmIChzc3RhYmxlLmRlc2NyaXB0b3IudmVyc2lvbi5lcXVhbHMoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpLmdldExhdGVzdFZlcnNpb24oKSkpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuc2VsZlJlZigpLnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVZlcmlmaWVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TdGFuZGFsb25lVmVyaWZpZXIuamF2YQppbmRleCBkNzU1NGRkLi41NDdhMWUwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TdGFuZGFsb25lVmVyaWZpZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TdGFuZGFsb25lVmVyaWZpZXIuamF2YQpAQCAtMzksMTcgKzM5LDE5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLlZlcmlmaWVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5NdXJtdXIzUGFydGl0aW9uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JVmVyaWZpZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpWTVN0YWJpbGl0eUluc3BlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PdXRwdXRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRocm93YWJsZXM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX1VUSUxfQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1Q7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLkJ1bGtMb2FkZXIuQ21kTGluZU9wdGlvbnM7CiAKIHB1YmxpYyBjbGFzcyBTdGFuZGFsb25lVmVyaWZpZXIKQEAgLTc4LDYgKzgwLDggQEAKIAogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNzdGFibGV2ZXJpZnkgdXNpbmcgdGhlIGZvbGxvd2luZyBvcHRpb25zOiAiICsgb3B0aW9ucyk7CiAKKyAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBpbnQgZXhpdENvZGUgPSAwOwogICAgICAgICB0cnkKICAgICAgICAgewogICAgICAgICAgICAgLy8gbG9hZCBrZXlzcGFjZSBkZXNjcmlwdGlvbnMuCkBAIC05NywxMyArMTAxLDExIEBACiAgICAgICAgICAgICBPdXRwdXRIYW5kbGVyIGhhbmRsZXIgPSBuZXcgT3V0cHV0SGFuZGxlci5TeXN0ZW1PdXRwdXQob3B0aW9ucy52ZXJib3NlLCBvcHRpb25zLmRlYnVnKTsKICAgICAgICAgICAgIERpcmVjdG9yaWVzLlNTVGFibGVMaXN0ZXIgbGlzdGVyID0gY2ZzLmdldERpcmVjdG9yaWVzKCkuc3N0YWJsZUxpc3RlcihEaXJlY3Rvcmllcy5PblR4bkVyci5USFJPVykuc2tpcFRlbXBvcmFyeSh0cnVlKTsKIAotICAgICAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCiAgICAgICAgICAgICAvLyBWZXJpZnkgc3N0YWJsZXMKICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PERlc2NyaXB0b3IsIFNldDxDb21wb25lbnQ+PiBlbnRyeSA6IGxpc3Rlci5saXN0KCkuZW50cnlTZXQoKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50LkRBVEEpIHx8ICFjb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudC5QUklNQVJZX0lOREVYKSkKKyAgICAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudHMuY29udGFpbnNBbGwoZW50cnkuZ2V0S2V5KCkuZ2V0Rm9ybWF0KCkucHJpbWFyeUNvbXBvbmVudHMoKSkpCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgICAgICAgICAgdHJ5CkBAIC0xMTcsNDUgKzExOSw1NiBAQAogICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oU3RyaW5nLmZvcm1hdCgiRXJyb3IgTG9hZGluZyAlczogJXMiLCBlbnRyeS5nZXRLZXkoKSwgZS5nZXRNZXNzYWdlKCkpKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGVidWcpCiAgICAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICAgICAgICAgIGV4aXRDb2RlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFZlcmlmaWVyLk9wdGlvbnMgdmVyaWZ5T3B0aW9ucyA9IFZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeShmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5leHRlbmRlZFZlcmlmaWNhdGlvbihvcHRpb25zLmV4dGVuZGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNoZWNrVmVyc2lvbihvcHRpb25zLmNoZWNrVmVyc2lvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tdXRhdGVSZXBhaXJTdGF0dXMob3B0aW9ucy5tdXRhdGVSZXBhaXJTdGF0dXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hlY2tPd25zVG9rZW5zKCFvcHRpb25zLnRva2Vucy5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9rZW5Mb29rdXAoaWdub3JlIC0+IG9wdGlvbnMudG9rZW5zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICBJVmVyaWZpZXIuT3B0aW9ucyB2ZXJpZnlPcHRpb25zID0gSVZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeShmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXh0ZW5kZWRWZXJpZmljYXRpb24ob3B0aW9ucy5leHRlbmRlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hlY2tWZXJzaW9uKG9wdGlvbnMuY2hlY2tWZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tdXRhdGVSZXBhaXJTdGF0dXMob3B0aW9ucy5tdXRhdGVSZXBhaXJTdGF0dXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNoZWNrT3duc1Rva2Vucyghb3B0aW9ucy50b2tlbnMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b2tlbkxvb2t1cChpZ25vcmUgLT4gb3B0aW9ucy50b2tlbnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAgICAgICAgICAgICBoYW5kbGVyLm91dHB1dCgiUnVubmluZyB2ZXJpZmllciB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9uczogIiArIHZlcmlmeU9wdGlvbnMpOwogICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgaGFuZGxlciwgdHJ1ZSwgdmVyaWZ5T3B0aW9ucykpCisgICAgICAgICAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgaGFuZGxlciwgdHJ1ZSwgdmVyaWZ5T3B0aW9ucykpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlci53YXJuKFN0cmluZy5mb3JtYXQoIkVycm9yIHZlcmlmeWluZyAlczogJXMiLCBzc3RhYmxlLCBlLmdldE1lc3NhZ2UoKSksIGUpOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLndhcm4oZSwgU3RyaW5nLmZvcm1hdCgiRXJyb3IgdmVyaWZ5aW5nICVzOiAlcyIsIHNzdGFibGUsIGUuZ2V0TWVzc2FnZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgIGhhc0ZhaWxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5maW5pc2hDb21wYWN0aW9uc0FuZFNodXRkb3duKDUsIFRpbWVVbml0Lk1JTlVURVMpOwogCi0gICAgICAgICAgICBTeXN0ZW0uZXhpdCggaGFzRmFpbGVkID8gMSA6IDAgKTsgLy8gV2UgbmVlZCB0aGF0IHRvIHN0b3Agbm9uIGRhZW1vbml6ZWQgdGhyZWFkcworICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHJlYWRlciA6IHNzdGFibGVzKQorICAgICAgICAgICAgICAgIFRocm93YWJsZXMucGVyZm9ybSgoVGhyb3dhYmxlKSBudWxsLCAoKSAtPiByZWFkZXIuc2VsZlJlZigpLmNsb3NlKCkpOworCisgICAgICAgICAgICBleGl0Q29kZSA9IGhhc0ZhaWxlZCA/IDEgOiAwOyAvLyBXZSBuZWVkIHRoYXQgdG8gc3RvcCBub24gZGFlbW9uaXplZCB0aHJlYWRzCiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQogICAgICAgICB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGVidWcpCiAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgICAgIGV4aXRDb2RlID0gMTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciByZWFkZXIgOiBzc3RhYmxlcykKKyAgICAgICAgICAgICAgICBUaHJvd2FibGVzLnBlcmZvcm0oKFRocm93YWJsZSkgbnVsbCwgKCkgLT4gcmVhZGVyLnNlbGZSZWYoKS5jbG9zZSgpKTsKKworICAgICAgICAgICAgU3lzdGVtLmV4aXQoZXhpdENvZGUpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0RGF0YWJhc2VEZXNjcmlwdG9yRm9yVG9vbCgpIHsKLSAgICAgICAgaWYgKEJvb2xlYW4uZ2V0Qm9vbGVhbihVdGlsLkFMTE9XX1RPT0xfUkVJTklUX0ZPUl9URVNUKSkKKyAgICAgICAgaWYgKFRFU1RfVVRJTF9BTExPV19UT09MX1JFSU5JVF9GT1JfVEVTVC5nZXRCb29sZWFuKCkpCiAgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IudG9vbEluaXRpYWxpemF0aW9uKGZhbHNlKTsgLy9OZWNlc3NhcnkgZm9yIHRlc3RpbmcKICAgICAgICAgZWxzZQogICAgICAgICAgICAgVXRpbC5pbml0RGF0YWJhc2VEZXNjcmlwdG9yKCk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9VdGlsLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9VdGlsLmphdmEKaW5kZXggMzc1Nzc1NC4uOGEyNTRlMiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvVXRpbC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1V0aWwuamF2YQpAQCAtMTgsMjIgKzE4LDIyIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHM7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7Ci0KIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuU3BsaXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLlNwbGl0ZXJhdG9yczsKIGltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Mb25nRnVuY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW1TdXBwb3J0OwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ29sdW1uSWRlbnRpZmllcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOwpAQCAtNDEsMjAgKzQxLDE4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU3RhdHNDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YVR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnN0cmVhbWhpc3QuVG9tYnN0b25lSGlzdG9ncmFtOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OwogCiBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKIHB1YmxpYyBmaW5hbCBjbGFzcyBVdGlsCiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QgPSBVdGlsLmNsYXNzLmdldE5hbWUoKSArICJBTExPV19UT09MX1JFSU5JVF9GT1JfVEVTVCI7IC8vIE5lY2Vzc2FyeSBmb3IgdGVzdGluZwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTRVQgPSAiXHUwMDFCWzBtIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEJMVUUgPSAiXHUwMDFCWzM0bSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBDWUFOID0gIlx1MDAxQlszNm0iOwpAQCAtMzEwLDEyICszMDgsMTEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGFGcm9tU1NUYWJsZShEZXNjcmlwdG9yIGRlc2MpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgaWYgKGRlc2MudmVyc2lvbi5nZXRWZXJzaW9uKCkuY29tcGFyZVRvKCJtYSIpIDwgMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigicHJlLTMuMCBTU1RhYmxlIGlzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgIGlmICghZGVzYy52ZXJzaW9uLmlzQ29tcGF0aWJsZSgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBTU1RhYmxlIHZlcnNpb24gIiArIGRlc2MuZ2V0Rm9ybWF0KCkubmFtZSgpICsgIi8iICsgZGVzYy52ZXJzaW9uKTsKIAotICAgICAgICBFbnVtU2V0PE1ldGFkYXRhVHlwZT4gdHlwZXMgPSBFbnVtU2V0Lm9mKE1ldGFkYXRhVHlwZS5TVEFUUywgTWV0YWRhdGFUeXBlLkhFQURFUik7Ci0gICAgICAgIE1hcDxNZXRhZGF0YVR5cGUsIE1ldGFkYXRhQ29tcG9uZW50PiBzc3RhYmxlTWV0YWRhdGEgPSBkZXNjLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLmRlc2VyaWFsaXplKGRlc2MsIHR5cGVzKTsKLSAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlci5Db21wb25lbnQgaGVhZGVyID0gKFNlcmlhbGl6YXRpb25IZWFkZXIuQ29tcG9uZW50KSBzc3RhYmxlTWV0YWRhdGEuZ2V0KE1ldGFkYXRhVHlwZS5IRUFERVIpOworICAgICAgICBTdGF0c0NvbXBvbmVudCBzdGF0c0NvbXBvbmVudCA9IFN0YXRzQ29tcG9uZW50LmxvYWQoZGVzYywgTWV0YWRhdGFUeXBlLlNUQVRTLCBNZXRhZGF0YVR5cGUuSEVBREVSKTsKKyAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlci5Db21wb25lbnQgaGVhZGVyID0gc3RhdHNDb21wb25lbnQuc2VyaWFsaXphdGlvbkhlYWRlcigpOwogCiAgICAgICAgIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IEZCVXRpbGl0aWVzLm5ld1BhcnRpdGlvbmVyKGRlc2MpOwogCkBAIC0zMzcsNCArMzM0LDQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9Cb290c3RyYXBSZXN1bWUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0Jvb3RzdHJhcFJlc3VtZS5qYXZhCmluZGV4IGIwMDU4MTguLmE1NWNkZWQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0Jvb3RzdHJhcFJlc3VtZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0Jvb3RzdHJhcFJlc3VtZS5qYXZhCkBAIC0yMiwxNyArMjIsMjcgQEAKIGltcG9ydCBqYXZhLmlvLklPRXJyb3I7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAoraW1wb3J0IGlvLmFpcmxpZnQuYWlybGluZS5PcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuTm9kZVByb2JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLk5vZGVUb29sLk5vZGVUb29sQ21kOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUkVTRVRfQk9PVFNUUkFQX1BST0dSRVNTOworCiBAQ29tbWFuZChuYW1lID0gInJlc3VtZSIsIGRlc2NyaXB0aW9uID0gIlJlc3VtZSBib290c3RyYXAgc3RyZWFtaW5nIikKIHB1YmxpYyBjbGFzcyBCb290c3RyYXBSZXN1bWUgZXh0ZW5kcyBOb2RlVG9vbENtZAogeworICAgIEBPcHRpb24odGl0bGUgPSAiZm9yY2UiLAorICAgICAgICAgICAgbmFtZSA9IHsgIi1mIiwgIi0tZm9yY2UifSwKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIlVzZSAtLWZvcmNlIHRvIHJlc3VtZSBib290c3RyYXAgcmVnYXJkbGVzcyBvZiBjYXNzYW5kcmEucmVzZXRfYm9vdHN0cmFwX3Byb2dyZXNzIGVudmlyb25tZW50IHZhcmlhYmxlLiBXQVJOSU5HOiBUaGlzIGlzIHBvdGVudGlhbGx5IGRhbmdlcm91cywgc2VlIENBU1NBTkRSQS0xNzY3OSIpCisgICAgYm9vbGVhbiBmb3JjZSA9IGZhbHNlOworCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShOb2RlUHJvYmUgcHJvYmUpCiAgICAgewogICAgICAgICB0cnkKICAgICAgICAgeworICAgICAgICAgICAgaWYgKCghUkVTRVRfQk9PVFNUUkFQX1BST0dSRVNTLmlzUHJlc2VudCgpIHx8IFJFU0VUX0JPT1RTVFJBUF9QUk9HUkVTUy5nZXRCb29sZWFuKCkpICYmICFmb3JjZSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiJ25vZGV0b29sIGJvb3RzdHJhcCByZXN1bWUnIGlzIGRpc2FibGVkLiIpOwogICAgICAgICAgICAgcHJvYmUucmVzdW1lQm9vdHN0cmFwKHByb2JlLm91dHB1dCgpLm91dCk7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9DbGVhclNuYXBzaG90LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9DbGVhclNuYXBzaG90LmphdmEKaW5kZXggZmI2OWIyNS4uODY2Yjg1ZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvQ2xlYXJTbmFwc2hvdC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0NsZWFyU25hcHNob3QuamF2YQpAQCAtMjUsOSArMjUsMTQgQEAKIGltcG9ydCBpby5haXJsaWZ0LmFpcmxpbmUuT3B0aW9uOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRpbWUuSW5zdGFudDsKK2ltcG9ydCBqYXZhLnRpbWUuZm9ybWF0LkRhdGVUaW1lUGFyc2VFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkR1cmF0aW9uU3BlYzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ob2RlUHJvYmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuTm9kZVRvb2wuTm9kZVRvb2xDbWQ7CiAKQEAgLTQzLDE0ICs0OCw0NSBAQAogICAgIEBPcHRpb24odGl0bGUgPSAiY2xlYXJfYWxsX3NuYXBzaG90cyIsIG5hbWUgPSAiLS1hbGwiLCBkZXNjcmlwdGlvbiA9ICJSZW1vdmVzIGFsbCBzbmFwc2hvdHMiKQogICAgIHByaXZhdGUgYm9vbGVhbiBjbGVhckFsbFNuYXBzaG90cyA9IGZhbHNlOwogCisgICAgQE9wdGlvbih0aXRsZSA9ICJvbGRlcl90aGFuIiwgbmFtZSA9ICItLW9sZGVyLXRoYW4iLCBkZXNjcmlwdGlvbiA9ICJDbGVhciBzbmFwc2hvdHMgb2xkZXIgdGhhbiBzcGVjaWZpZWQgdGltZSBwZXJpb2QuIikKKyAgICBwcml2YXRlIFN0cmluZyBvbGRlclRoYW47CisKKyAgICBAT3B0aW9uKHRpdGxlID0gIm9sZGVyX3RoYW5fdGltZXN0YW1wIiwgbmFtZSA9ICItLW9sZGVyLXRoYW4tdGltZXN0YW1wIiwKKyAgICBkZXNjcmlwdGlvbiA9ICJDbGVhciBzbmFwc2hvdHMgb2xkZXIgdGhhbiBzcGVjaWZpZWQgdGltZXN0YW1wLiBJdCBoYXMgdG8gYmUgYSBzdHJpbmcgaW4gSVNPIGZvcm1hdCwgZm9yIGV4YW1wbGUgJzIwMjItMTItMDNUMTA6MTU6MzBaJyIpCisgICAgcHJpdmF0ZSBTdHJpbmcgb2xkZXJUaGFuVGltZXN0YW1wOworCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShOb2RlUHJvYmUgcHJvYmUpCiAgICAgewotICAgICAgICBpZihzbmFwc2hvdE5hbWUuaXNFbXB0eSgpICYmICFjbGVhckFsbFNuYXBzaG90cykKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTcGVjaWZ5IHNuYXBzaG90IG5hbWUgb3IgLS1hbGwiKTsKKyAgICAgICAgaWYgKHNuYXBzaG90TmFtZS5pc0VtcHR5KCkgJiYgIWNsZWFyQWxsU25hcHNob3RzKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3BlY2lmeSBzbmFwc2hvdCBuYW1lIG9yIC0tYWxsIik7CiAKLSAgICAgICAgaWYoIXNuYXBzaG90TmFtZS5pc0VtcHR5KCkgJiYgY2xlYXJBbGxTbmFwc2hvdHMpCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU3BlY2lmeSBvbmx5IG9uZSBvZiBzbmFwc2hvdCBuYW1lIG9yIC0tYWxsIik7CisgICAgICAgIGlmICghc25hcHNob3ROYW1lLmlzRW1wdHkoKSAmJiBjbGVhckFsbFNuYXBzaG90cykKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNwZWNpZnkgb25seSBvbmUgb2Ygc25hcHNob3QgbmFtZSBvciAtLWFsbCIpOworCisgICAgICAgIGlmIChvbGRlclRoYW4gIT0gbnVsbCAmJiBvbGRlclRoYW5UaW1lc3RhbXAgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNwZWNpZnkgb25seSBvbmUgb2YgLS1vbGRlci10aGFuIG9yIC0tb2xkZXItdGhhbi10aW1lc3RhbXAiKTsKKworICAgICAgICBpZiAoIXNuYXBzaG90TmFtZS5pc0VtcHR5KCkgJiYgb2xkZXJUaGFuICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTcGVjaWZ5aW5nIHNuYXBzaG90IG5hbWUgdG9nZXRoZXIgd2l0aCAtLW9sZGVyLXRoYW4gZmxhZyBpcyBub3QgYWxsb3dlZCIpOworCisgICAgICAgIGlmICghc25hcHNob3ROYW1lLmlzRW1wdHkoKSAmJiBvbGRlclRoYW5UaW1lc3RhbXAgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNwZWNpZnlpbmcgc25hcHNob3QgbmFtZSB0b2dldGhlciB3aXRoIC0tb2xkZXItdGhhbi10aW1lc3RhbXAgZmxhZyBpcyBub3QgYWxsb3dlZCIpOworCisgICAgICAgIGlmIChvbGRlclRoYW5UaW1lc3RhbXAgIT0gbnVsbCkKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluc3RhbnQucGFyc2Uob2xkZXJUaGFuVGltZXN0YW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChEYXRlVGltZVBhcnNlRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhcmFtZXRlciAtLW9sZGVyLXRoYW4tdGltZXN0YW1wIGhhcyB0byBiZSBhIHZhbGlkIGluc3RhbnQgaW4gSVNPIGZvcm1hdC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBMb25nIG9sZGVyVGhhbkluU2Vjb25kcyA9IG51bGw7CisgICAgICAgIGlmIChvbGRlclRoYW4gIT0gbnVsbCkKKyAgICAgICAgICAgIC8vIGZhaWwgZmFzdCB3aGVuIGl0IGlzIG5vdCB2YWxpZAorICAgICAgICAgICAgb2xkZXJUaGFuSW5TZWNvbmRzID0gbmV3IER1cmF0aW9uU3BlYy5Mb25nU2Vjb25kc0JvdW5kKG9sZGVyVGhhbikudG9TZWNvbmRzKCk7CiAKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAKQEAgLTU5LDE4ICs5NSwzMiBAQAogICAgICAgICBpZiAoa2V5c3BhY2VzLmlzRW1wdHkoKSkKICAgICAgICAgICAgIHNiLmFwcGVuZCgiW2FsbCBrZXlzcGFjZXNdIik7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiWyIpLmFwcGVuZChqb2luKGtleXNwYWNlcywgIiwgIikpLmFwcGVuZCgiXSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKCdbJykuYXBwZW5kKGpvaW4oa2V5c3BhY2VzLCAiLCAiKSkuYXBwZW5kKCddJyk7CiAKICAgICAgICAgaWYgKHNuYXBzaG90TmFtZS5pc0VtcHR5KCkpCiAgICAgICAgICAgICBzYi5hcHBlbmQoIiB3aXRoIFthbGwgc25hcHNob3RzXSIpOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICBzYi5hcHBlbmQoIiB3aXRoIHNuYXBzaG90IG5hbWUgWyIpLmFwcGVuZChzbmFwc2hvdE5hbWUpLmFwcGVuZCgiXSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIgd2l0aCBzbmFwc2hvdCBuYW1lIFsiKS5hcHBlbmQoc25hcHNob3ROYW1lKS5hcHBlbmQoJ10nKTsKIAotICAgICAgICBwcm9iZS5vdXRwdXQoKS5vdXQucHJpbnRsbihzYi50b1N0cmluZygpKTsKKyAgICAgICAgaWYgKG9sZGVyVGhhbkluU2Vjb25kcyAhPSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgb2xkZXIgdGhhbiAiKQorICAgICAgICAgICAgICAuYXBwZW5kKG9sZGVyVGhhbkluU2Vjb25kcykKKyAgICAgICAgICAgICAgLmFwcGVuZCgiIHNlY29uZHMuIik7CisKKyAgICAgICAgaWYgKG9sZGVyVGhhblRpbWVzdGFtcCAhPSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgb2xkZXIgdGhhbiB0aW1lc3RhbXAgIikuYXBwZW5kKG9sZGVyVGhhblRpbWVzdGFtcCk7CisKKyAgICAgICAgcHJvYmUub3V0cHV0KCkub3V0LnByaW50bG4oc2IpOwogCiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBwcm9iZS5jbGVhclNuYXBzaG90KHNuYXBzaG90TmFtZSwgdG9BcnJheShrZXlzcGFjZXMsIFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgaWYgKG9sZGVyVGhhbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KCJvbGRlcl90aGFuIiwgb2xkZXJUaGFuKTsKKyAgICAgICAgICAgIGlmIChvbGRlclRoYW5UaW1lc3RhbXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dCgib2xkZXJfdGhhbl90aW1lc3RhbXAiLCBvbGRlclRoYW5UaW1lc3RhbXApOworCisgICAgICAgICAgICBwcm9iZS5jbGVhclNuYXBzaG90KHBhcmFtZXRlcnMsIHNuYXBzaG90TmFtZSwgdG9BcnJheShrZXlzcGFjZXMsIFN0cmluZy5jbGFzcykpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKQogICAgICAgICB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIGNsZWFyaW5nIHNuYXBzaG90cyIsIGUpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvQ29tcGFjdGlvblN0YXRzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9Db21wYWN0aW9uU3RhdHMuamF2YQppbmRleCA3OTllZjU2Li5hZWRjOGYyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9Db21wYWN0aW9uU3RhdHMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9Db21wYWN0aW9uU3RhdHMuamF2YQpAQCAtOTEsNyArOTEsNyBAQAogICAgICAgICAgICAgVGFibGVCdWlsZGVyIHRhYmxlID0gbmV3IFRhYmxlQnVpbGRlcigpOwogCiAgICAgICAgICAgICBpZiAodnRhYmxlT3V0cHV0KQotICAgICAgICAgICAgICAgIHRhYmxlLmFkZCgia2V5c3BhY2UiLCAidGFibGUiLCAidGFzayBpZCIsICJjb21wbGV0aW9uIHJhdGlvIiwgImtpbmQiLCAicHJvZ3Jlc3MiLCAic3N0YWJsZXMiLCAidG90YWwiLCAidW5pdCIpOworICAgICAgICAgICAgICAgIHRhYmxlLmFkZCgia2V5c3BhY2UiLCAidGFibGUiLCAidGFzayBpZCIsICJjb21wbGV0aW9uIHJhdGlvIiwgImtpbmQiLCAicHJvZ3Jlc3MiLCAic3N0YWJsZXMiLCAidG90YWwiLCAidW5pdCIsICJ0YXJnZXQgZGlyZWN0b3J5Iik7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgdGFibGUuYWRkKCJpZCIsICJjb21wYWN0aW9uIHR5cGUiLCAia2V5c3BhY2UiLCAidGFibGUiLCAiY29tcGxldGVkIiwgInRvdGFsIiwgInVuaXQiLCAicHJvZ3Jlc3MiKTsKIApAQCAtMTEwLDcgKzExMCwxMCBAQAogICAgICAgICAgICAgICAgIFN0cmluZyBwZXJjZW50Q29tcGxldGUgPSB0b3RhbCA9PSAwID8gIm4vYSIgOiBuZXcgRGVjaW1hbEZvcm1hdCgiMC4wMCIpLmZvcm1hdCgoZG91YmxlKSBjb21wbGV0ZWQgLyB0b3RhbCAqIDEwMCkgKyAiJSI7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gYy5nZXQoQ29tcGFjdGlvbkluZm8uQ09NUEFDVElPTl9JRCk7CiAgICAgICAgICAgICAgICAgaWYgKHZ0YWJsZU91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgdGFibGUuYWRkKGtleXNwYWNlLCBjb2x1bW5GYW1pbHksIGlkLCBwZXJjZW50Q29tcGxldGUsIHRhc2tUeXBlLCBwcm9ncmVzc1N0ciwgU3RyaW5nLnZhbHVlT2YodGFibGVzLmxlbmd0aCksIHRvdGFsU3RyLCB1bml0KTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXREaXJlY3RvcnkgPSBjLmdldChDb21wYWN0aW9uSW5mby5UQVJHRVRfRElSRUNUT1JZKTsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUuYWRkKGtleXNwYWNlLCBjb2x1bW5GYW1pbHksIGlkLCBwZXJjZW50Q29tcGxldGUsIHRhc2tUeXBlLCBwcm9ncmVzc1N0ciwgU3RyaW5nLnZhbHVlT2YodGFibGVzLmxlbmd0aCksIHRvdGFsU3RyLCB1bml0LCB0YXJnZXREaXJlY3RvcnkpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHRhYmxlLmFkZChpZCwgdGFza1R5cGUsIGtleXNwYWNlLCBjb2x1bW5GYW1pbHksIHByb2dyZXNzU3RyLCB0b3RhbFN0ciwgdW5pdCwgcGVyY2VudENvbXBsZXRlKTsKIApAQCAtMTI4LDQgKzEzMSw0IEBACiAgICAgICAgIH0KICAgICB9CiAKLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9EZXNjcmliZUNsdXN0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0Rlc2NyaWJlQ2x1c3Rlci5qYXZhCmluZGV4IDMzYTBhNGQuLmY4NTVlNjIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0Rlc2NyaWJlQ2x1c3Rlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0Rlc2NyaWJlQ2x1c3Rlci5qYXZhCkBAIC0zMiw4ICszMiw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuTm9kZVRvb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuTm9kZVRvb2wuTm9kZVRvb2xDbWQ7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7Ci0KIEBDb21tYW5kKG5hbWUgPSAiZGVzY3JpYmVjbHVzdGVyIiwgZGVzY3JpcHRpb24gPSAiUHJpbnQgdGhlIG5hbWUsIHNuaXRjaCwgcGFydGl0aW9uZXIgYW5kIHNjaGVtYSB2ZXJzaW9uIG9mIGEgY2x1c3RlciIpCiBwdWJsaWMgY2xhc3MgRGVzY3JpYmVDbHVzdGVyIGV4dGVuZHMgTm9kZVRvb2xDbWQKIHsKQEAgLTYyLDkgKzYwLDkgQEAKICAgICAgICAgLy8gZGlzcGxheSBzY2hlbWEgdmVyc2lvbiBmb3IgZWFjaCBub2RlCiAgICAgICAgIG91dC5wcmludGxuKCJcdFNjaGVtYSB2ZXJzaW9uczoiKTsKICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBzY2hlbWFWZXJzaW9ucyA9IHByaW50UG9ydCA/IHByb2JlLmdldFNwUHJveHkoKS5nZXRTY2hlbWFWZXJzaW9uc1dpdGhQb3J0KCkgOiBwcm9iZS5nZXRTcFByb3h5KCkuZ2V0U2NoZW1hVmVyc2lvbnMoKTsKLSAgICAgICAgZm9yIChTdHJpbmcgdmVyc2lvbiA6IHNjaGVtYVZlcnNpb25zLmtleVNldCgpKQorICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZW50cnkgOiBzY2hlbWFWZXJzaW9ucy5lbnRyeVNldCgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihmb3JtYXQoIlx0XHQlczogJXMlbiIsIHZlcnNpb24sIHNjaGVtYVZlcnNpb25zLmdldCh2ZXJzaW9uKSkpOworICAgICAgICAgICAgb3V0LnByaW50ZigiXHRcdCVzOiAlcyVuJW4iLCBlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBDb2xsZWN0IHN0YXR1cyBpbmZvcm1hdGlvbiBvZiBhbGwgbm9kZXMKQEAgLTg2LDYgKzg0LDcgQEAKICAgICAgICAgb3V0LnByaW50bG4oIlx0VW5yZWFjaGFibGU6ICIgKyB1bnJlYWNoYWJsZU5vZGVzLnNpemUoKSk7CiAKICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiB0b2tlbnNUb0VuZHBvaW50cyA9IHByb2JlLmdldFRva2VuVG9FbmRwb2ludE1hcCh3aXRoUG9ydCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgZXJyb3JzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgTWFwPFN0cmluZywgRmxvYXQ+IG93bmVyc2hpcHMgPSBudWxsOwogICAgICAgICB0cnkKICAgICAgICAgewpAQCAtOTMsMTIgKzkyLDIwIEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkKICAgICAgICAgewotICAgICAgICAgICAgb3duZXJzaGlwcyA9IHByb2JlLmdldE93bmVyc2hpcFdpdGhQb3J0KCk7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbigiRXJyb3I6ICIgKyBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3duZXJzaGlwcyA9IHByb2JlLmdldE93bmVyc2hpcFdpdGhQb3J0KCk7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiTm90ZTogIikuYXBwZW5kKGV4LmdldE1lc3NhZ2UoKSkuYXBwZW5kKCIlbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dC5wcmludGYoIiVuRXJyb3I6ICVzJW4iLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkKICAgICAgICAgewotICAgICAgICAgICAgb3V0LnByaW50bG4oIiVuRXJyb3I6ICIgKyBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgb3V0LnByaW50ZigiJW5FcnJvcjogJXMlbiIsIGV4LmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKICAgICAgICAgfQogCkBAIC0xMDcsNyArMTE0LDcgQEAKICAgICAgICAgb3V0LnByaW50bG4oIlxuRGF0YSBDZW50ZXJzOiAiKTsKICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTZXRIb3N0U3RhdFdpdGhQb3J0PiBkYyA6IGRjcy5lbnRyeVNldCgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBvdXQucHJpbnQoIlx0IiArIGRjLmdldEtleSgpKTsKKyAgICAgICAgICAgIG91dC5wcmludCgnXHQnICsgZGMuZ2V0S2V5KCkpOwogCiAgICAgICAgICAgICBBcnJheUxpc3RNdWx0aW1hcDxJbmV0QWRkcmVzc0FuZFBvcnQsIEhvc3RTdGF0V2l0aFBvcnQ+IGhvc3RUb1Rva2VucyA9IEFycmF5TGlzdE11bHRpbWFwLmNyZWF0ZSgpOwogICAgICAgICAgICAgZm9yIChIb3N0U3RhdFdpdGhQb3J0IHN0YXQgOiBkYy5nZXRWYWx1ZSgpKQpAQCAtMTI5LDkgKzEzNiw5IEBACiAgICAgICAgIC8vIGRpc3BsYXkgZGF0YWJhc2UgdmVyc2lvbiBmb3IgZWFjaCBub2RlCiAgICAgICAgIG91dC5wcmludGxuKCJcbkRhdGFiYXNlIHZlcnNpb25zOiIpOwogICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGRhdGFiYXNlVmVyc2lvbnMgPSBwcm9iZS5nZXRHb3NzUHJveHkoKS5nZXRSZWxlYXNlVmVyc2lvbnNXaXRoUG9ydCgpOwotICAgICAgICBmb3IgKFN0cmluZyB2ZXJzaW9uIDogZGF0YWJhc2VWZXJzaW9ucy5rZXlTZXQoKSkKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGVudHJ5IDogZGF0YWJhc2VWZXJzaW9ucy5lbnRyeVNldCgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihmb3JtYXQoIlx0JXM6ICVzJW4iLCB2ZXJzaW9uLCBkYXRhYmFzZVZlcnNpb25zLmdldCh2ZXJzaW9uKSkpOworICAgICAgICAgICAgb3V0LnByaW50ZigiXHQlczogJXMlbiVuIiwgZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwogICAgICAgICB9CiAKICAgICAgICAgb3V0LnByaW50bG4oIktleXNwYWNlczoiKTsKQEAgLTE0Miw3ICsxNDksMTAgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigic29tZXRoaW5nIHdlbnQgd3JvbmcgZm9yIGtleXNwYWNlOiAiICsga2V5c3BhY2VOYW1lKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dC5wcmludGxuKCJcdCIgKyBrZXlzcGFjZU5hbWUgKyAiIC0+IFJlcGxpY2F0aW9uIGNsYXNzOiAiICsgcmVwbGljYXRpb25JbmZvKTsKKyAgICAgICAgICAgIG91dC5wcmludGYoIlx0JXMgLT4gUmVwbGljYXRpb24gY2xhc3M6ICVzJW4iLCBrZXlzcGFjZU5hbWUsIHJlcGxpY2F0aW9uSW5mbyk7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCgpICE9IDApCisgICAgICAgICAgICBvdXQucHJpbnRmKCIlbiIgKyBlcnJvcnMpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0ZvcmNlQ29tcGFjdC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvRm9yY2VDb21wYWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyNjVlNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0ZvcmNlQ29tcGFjdC5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMubm9kZXRvb2w7CisKK2ltcG9ydCBpby5haXJsaWZ0LmFpcmxpbmUuQXJndW1lbnRzOworaW1wb3J0IGlvLmFpcmxpZnQuYWlybGluZS5Db21tYW5kOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLk5vZGVQcm9iZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ob2RlVG9vbC5Ob2RlVG9vbENtZDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudDsKKworQENvbW1hbmQobmFtZSA9ICJmb3JjZWNvbXBhY3QiLCBkZXNjcmlwdGlvbiA9ICJGb3JjZSBhIChtYWpvcikgY29tcGFjdGlvbiBvbiBhIHRhYmxlIikKK3B1YmxpYyBjbGFzcyBGb3JjZUNvbXBhY3QgZXh0ZW5kcyBOb2RlVG9vbENtZAoreworICAgIEBBcmd1bWVudHModXNhZ2UgPSAiWzxrZXlzcGFjZT4gPHRhYmxlPiA8a2V5cz5dIiwgZGVzY3JpcHRpb24gPSAiVGhlIGtleXNwYWNlLCB0YWJsZSwgYW5kIGEgbGlzdCBvZiBwYXJ0aXRpb24ga2V5cyBpZ25vcmluZyB0aGUgZ2NfZ3JhY2Vfc2Vjb25kcyIpCisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gYXJncyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZShOb2RlUHJvYmUgcHJvYmUpCisgICAgeworICAgICAgICAvLyBDaGVjayBpZiB0aGUgaW5wdXQgaGFzIHZhbGlkIHNpemUKKyAgICAgICAgY2hlY2tBcmd1bWVudChhcmdzLnNpemUoKSA+PSAzLCAiZm9yY2Vjb21wYWN0IHJlcXVpcmVzIGtleXNwYWNlLCB0YWJsZSBhbmQga2V5cyBhcmdzIik7CisKKyAgICAgICAgLy8gV2UgcmVseSBvbiBsb3dlci1sZXZlbCBBUElzIHRvIGNoZWNrIGFuZCB0aHJvdyBleGNlcHRpb25zIGlmIHRoZSBpbnB1dCBrZXlzcGFjZSBvciB0YWJsZSBuYW1lIGFyZSBpbnZhbGlkCisgICAgICAgIFN0cmluZyBrZXlzcGFjZU5hbWUgPSBhcmdzLmdldCgwKTsKKyAgICAgICAgU3RyaW5nIHRhYmxlTmFtZSA9IGFyZ3MuZ2V0KDEpOworICAgICAgICBTdHJpbmdbXSBwYXJ0aXRpb25LZXlzSWdub3JlR2NHcmFjZSA9IHBhcnNlUGFydGl0aW9uS2V5cyhhcmdzKTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcHJvYmUuZm9yY2VDb21wYWN0aW9uS2V5c0lnbm9yaW5nR2NHcmFjZShrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZSwgcGFydGl0aW9uS2V5c0lnbm9yZUdjR3JhY2UpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIG9jY3VycmVkIGR1cmluZyBjb21wYWN0aW9uIGtleXMiLCBlKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9HZXRTU1RhYmxlcy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvR2V0U1NUYWJsZXMuamF2YQppbmRleCBmMWUyMTE3Li42NTdlMGVjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9HZXRTU1RhYmxlcy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0dldFNTVGFibGVzLmphdmEKQEAgLTIzLDYgKzIzLDggQEAKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgaW8uYWlybGlmdC5haXJsaW5lLk9wdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ob2RlUHJvYmU7CkBAIC0zNiw2ICszOCw5IEBACiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIlNwZWNpZnkgdGhlIGtleSBpbiBoZXhhZGVjaW1hbCBzdHJpbmcgZm9ybWF0IikKICAgICBwcml2YXRlIGJvb2xlYW4gaGV4Rm9ybWF0ID0gZmFsc2U7CiAKKyAgICBAT3B0aW9uKG5hbWU9eyItbCIsICItLXNob3ctbGV2ZWxzIn0sIGRlc2NyaXB0aW9uPSJJZiB0aGUgdGFibGUgaXMgdXNpbmcgbGV2ZWxlZCBjb21wYWN0aW9uIHRoZSBsZXZlbCBvZiBlYWNoIHNzdGFibGUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IChEZWZhdWx0OiBmYWxzZSkiKQorICAgIHByaXZhdGUgYm9vbGVhbiBzaG93TGV2ZWxzID0gZmFsc2U7CisKICAgICBAQXJndW1lbnRzKHVzYWdlID0gIjxrZXlzcGFjZT4gPGNmbmFtZT4gPGtleT4iLCBkZXNjcmlwdGlvbiA9ICJUaGUga2V5c3BhY2UsIHRoZSBjb2x1bW4gZmFtaWx5LCBhbmQgdGhlIGtleSIpCiAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gYXJncyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCkBAIC00NywxMCArNTIsMTkgQEAKICAgICAgICAgU3RyaW5nIGNmID0gYXJncy5nZXQoMSk7CiAgICAgICAgIFN0cmluZyBrZXkgPSBhcmdzLmdldCgyKTsKIAotICAgICAgICBMaXN0PFN0cmluZz4gc3N0YWJsZXMgPSBwcm9iZS5nZXRTU1RhYmxlcyhrcywgY2YsIGtleSwgaGV4Rm9ybWF0KTsKLSAgICAgICAgZm9yIChTdHJpbmcgc3N0YWJsZSA6IHNzdGFibGVzKQorICAgICAgICBpZiAoc2hvd0xldmVscyAmJiBwcm9iZS5pc0xldmVsZWRDb21wYWN0aW9uKGtzLCBjZikpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHByb2JlLm91dHB1dCgpLm91dC5wcmludGxuKHNzdGFibGUpOworICAgICAgICAgICAgTWFwPEludGVnZXIsIFNldDxTdHJpbmc+PiBzc3RhYmxlcyA9IHByb2JlLmdldFNTVGFibGVzV2l0aExldmVsKGtzLCBjZiwga2V5LCBoZXhGb3JtYXQpOworICAgICAgICAgICAgZm9yIChJbnRlZ2VyIGxldmVsIDogc3N0YWJsZXMua2V5U2V0KCkpCisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgc3N0YWJsZSA6IHNzdGFibGVzLmdldChsZXZlbCkpCisgICAgICAgICAgICAgICAgICAgIHByb2JlLm91dHB1dCgpLm91dC5wcmludGxuKGxldmVsICsgIjogIiArIHNzdGFibGUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHNzdGFibGVzID0gcHJvYmUuZ2V0U1NUYWJsZXMoa3MsIGNmLCBrZXksIGhleEZvcm1hdCk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBzc3RhYmxlIDogc3N0YWJsZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJvYmUub3V0cHV0KCkub3V0LnByaW50bG4oc3N0YWJsZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9JbmZvLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9JbmZvLmphdmEKaW5kZXggZGI3Mjc3ZS4uNWUwZDg3YyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvSW5mby5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0luZm8uamF2YQpAQCAtNTEsNiArNTEsOCBAQAogICAgICAgICBvdXQucHJpbnRmKCIlLTIzczogJXMlbiIsICJHb3NzaXAgYWN0aXZlIiwgZ29zc2lwSW5pdGlhbGl6ZWQpOwogICAgICAgICBvdXQucHJpbnRmKCIlLTIzczogJXMlbiIsICJOYXRpdmUgVHJhbnNwb3J0IGFjdGl2ZSIsIHByb2JlLmlzTmF0aXZlVHJhbnNwb3J0UnVubmluZygpKTsKICAgICAgICAgb3V0LnByaW50ZigiJS0yM3M6ICVzJW4iLCAiTG9hZCIsIHByb2JlLmdldExvYWRTdHJpbmcoKSk7CisgICAgICAgIG91dC5wcmludGYoIiUtMjNzOiAlcyVuIiwgIlVuY29tcHJlc3NlZCBsb2FkIiwgcHJvYmUuZ2V0VW5jb21wcmVzc2VkTG9hZFN0cmluZygpKTsKKwogICAgICAgICBpZiAoZ29zc2lwSW5pdGlhbGl6ZWQpCiAgICAgICAgICAgICBvdXQucHJpbnRmKCIlLTIzczogJXMlbiIsICJHZW5lcmF0aW9uIE5vIiwgcHJvYmUuZ2V0Q3VycmVudEdlbmVyYXRpb25OdW1iZXIoKSk7CiAgICAgICAgIGVsc2UKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0xpc3RTbmFwc2hvdHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0xpc3RTbmFwc2hvdHMuamF2YQppbmRleCBiNzBhN2E5Li44MDNmZTVhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9MaXN0U25hcHNob3RzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvTGlzdFNuYXBzaG90cy5qYXZhCkBAIC00MCw2ICs0MCwxMSBAQAogICAgIGRlc2NyaXB0aW9uID0gIlNraXAgc25hcHNob3RzIHdpdGggVFRMIikKICAgICBwcml2YXRlIGJvb2xlYW4gbm9UVEwgPSBmYWxzZTsKIAorICAgIEBPcHRpb24odGl0bGUgPSAiZXBoZW1lcmFsIiwKKyAgICBuYW1lID0geyAiLWUiLCAiLS1lcGhlbWVyYWwiIH0sCisgICAgZGVzY3JpcHRpb24gPSAiSW5jbHVkZSBlcGhlbWVtZXJhbCBzbmFwc2hvdHMiKQorICAgIHByaXZhdGUgYm9vbGVhbiBpbmNsdWRlRXBoZW1lcmFsID0gZmFsc2U7CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKE5vZGVQcm9iZSBwcm9iZSkKICAgICB7CkBAIC01MCw2ICs1NSw3IEBACiAKICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgICAgIG9wdGlvbnMucHV0KCJub190dGwiLCBCb29sZWFuLnRvU3RyaW5nKG5vVFRMKSk7CisgICAgICAgICAgICBvcHRpb25zLnB1dCgiaW5jbHVkZV9lcGhlbWVyYWwiLCBCb29sZWFuLnRvU3RyaW5nKGluY2x1ZGVFcGhlbWVyYWwpKTsKIAogICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgVGFidWxhckRhdGE+IHNuYXBzaG90RGV0YWlscyA9IHByb2JlLmdldFNuYXBzaG90RGV0YWlscyhvcHRpb25zKTsKICAgICAgICAgICAgIGlmIChzbmFwc2hvdERldGFpbHMuaXNFbXB0eSgpKQpAQCAtNjIsNyArNjgsMTEgQEAKICAgICAgICAgICAgIFRhYmxlQnVpbGRlciB0YWJsZSA9IG5ldyBUYWJsZUJ1aWxkZXIoKTsKICAgICAgICAgICAgIC8vIGRpc3BsYXkgY29sdW1uIG5hbWVzIG9ubHkgb25jZQogICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGluZGV4TmFtZXMgPSBzbmFwc2hvdERldGFpbHMuZW50cnlTZXQoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRWYWx1ZSgpLmdldFRhYnVsYXJUeXBlKCkuZ2V0SW5kZXhOYW1lcygpOwotICAgICAgICAgICAgdGFibGUuYWRkKGluZGV4TmFtZXMudG9BcnJheShuZXcgU3RyaW5nW2luZGV4TmFtZXMuc2l6ZSgpXSkpOworCisgICAgICAgICAgICBpZiAoaW5jbHVkZUVwaGVtZXJhbCkKKyAgICAgICAgICAgICAgICB0YWJsZS5hZGQoaW5kZXhOYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbaW5kZXhOYW1lcy5zaXplKCldKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGFibGUuYWRkKGluZGV4TmFtZXMuc3ViTGlzdCgwLCBpbmRleE5hbWVzLnNpemUoKSAtIDEpLnRvQXJyYXkobmV3IFN0cmluZ1tpbmRleE5hbWVzLnNpemUoKSAtIDFdKSk7CiAKICAgICAgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgVGFidWxhckRhdGE+IHNuYXBzaG90RGV0YWlsIDogc25hcHNob3REZXRhaWxzLmVudHJ5U2V0KCkpCiAgICAgICAgICAgICB7CkBAIC03MCwxMiArODAsMTUgQEAKICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBlYWNoVmFsdWUgOiB2YWx1ZXMpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PD8+IHZhbHVlID0gKExpc3Q8Pz4pIGVhY2hWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgdGFibGUuYWRkKHZhbHVlLnRvQXJyYXkobmV3IFN0cmluZ1t2YWx1ZS5zaXplKCldKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlRXBoZW1lcmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuYWRkKHZhbHVlLnRvQXJyYXkobmV3IFN0cmluZ1t2YWx1ZS5zaXplKCldKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLmFkZCh2YWx1ZS5zdWJMaXN0KDAsIHZhbHVlLnNpemUoKSAtIDEpLnRvQXJyYXkobmV3IFN0cmluZ1t2YWx1ZS5zaXplKCkgLSAxXSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRhYmxlLnByaW50VG8ob3V0KTsKIAotICAgICAgICAgICAgb3V0LnByaW50bG4oIlxuVG90YWwgVHJ1ZURpc2tTcGFjZVVzZWQ6ICIgKyBGaWxlVXRpbHMuc3RyaW5naWZ5RmlsZVNpemUodHJ1ZVNuYXBzaG90c1NpemUpICsgIlxuIik7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiXG5Ub3RhbCBUcnVlRGlza1NwYWNlVXNlZDogIiArIEZpbGVVdGlscy5zdHJpbmdpZnlGaWxlU2l6ZSh0cnVlU25hcHNob3RzU2l6ZSkgKyAnXG4nKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1Byb2ZpbGVMb2FkLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9Qcm9maWxlTG9hZC5qYXZhCmluZGV4IDQ4N2YxNGEuLjQ1Y2FkZTcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1Byb2ZpbGVMb2FkLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvUHJvZmlsZUxvYWQuamF2YQpAQCAtMTcsMzYgKzE3LDM2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMubm9kZXRvb2w7CiAKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlscy5qb2luOwotCiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKLQogaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLkNvbXBvc2l0ZURhdGE7CiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uT3BlbkRhdGFFeGNlcHRpb247CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlNhbXBsZXIuU2FtcGxlclR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuTm9kZVByb2JlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLk5vZGVUb29sLk5vZGVUb29sQ21kOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLm5vZGV0b29sLmZvcm1hdHRlci5UYWJsZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKLQogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CiAKIGltcG9ydCBpby5haXJsaWZ0LmFpcmxpbmUuQXJndW1lbnRzOwogaW1wb3J0IGlvLmFpcmxpZnQuYWlybGluZS5Db21tYW5kOwogaW1wb3J0IGlvLmFpcmxpZnQuYWlybGluZS5PcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5TYW1wbGVyLlNhbXBsZXJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuU2FtcGxpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLk5vZGVQcm9iZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ob2RlVG9vbC5Ob2RlVG9vbENtZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzLmpvaW47CiAKIEBDb21tYW5kKG5hbWUgPSAicHJvZmlsZWxvYWQiLCBkZXNjcmlwdGlvbiA9ICJMb3cgZm9vdHByaW50IHByb2ZpbGluZyBvZiBhY3Rpdml0eSBmb3IgYSBwZXJpb2Qgb2YgdGltZSIpCiBwdWJsaWMgY2xhc3MgUHJvZmlsZUxvYWQgZXh0ZW5kcyBOb2RlVG9vbENtZAogewotICAgIEBBcmd1bWVudHModXNhZ2UgPSAiPGtleXNwYWNlPiA8Y2ZuYW1lPiA8ZHVyYXRpb24+IiwgZGVzY3JpcHRpb24gPSAiVGhlIGtleXNwYWNlLCBjb2x1bW4gZmFtaWx5IG5hbWUsIGFuZCBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMiKQorICAgIEBBcmd1bWVudHModXNhZ2UgPSAiPGtleXNwYWNlPiA8Y2ZuYW1lPiA8ZHVyYXRpb24+IiwgZGVzY3JpcHRpb24gPSAiVGhlIGtleXNwYWNlLCBjb2x1bW4gZmFtaWx5IG5hbWUsIGFuZCBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgKERlZmF1bHQ6IDEwMDAwKSIpCiAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gYXJncyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgQE9wdGlvbihuYW1lID0gIi1zIiwgZGVzY3JpcHRpb24gPSAiQ2FwYWNpdHkgb2YgdGhlIHNhbXBsZXIsIGhpZ2hlciBmb3IgbW9yZSBhY2N1cmFjeSAoRGVmYXVsdDogMjU2KSIpCkBAIC01OCwyNyArNTgsNTkgQEAKICAgICBAT3B0aW9uKG5hbWUgPSAiLWEiLCBkZXNjcmlwdGlvbiA9ICJDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBzYW1wbGVycyB0byB1c2UgKERlZmF1bHQ6IGFsbCkiKQogICAgIHByaXZhdGUgU3RyaW5nIHNhbXBsZXJzID0gam9pbihTYW1wbGVyVHlwZS52YWx1ZXMoKSwgJywnKTsKIAorICAgIEBPcHRpb24obmFtZSA9IHsiLWkiLCAiLS1pbnRlcnZhbCJ9LCBkZXNjcmlwdGlvbiA9ICJTY2hlZHVsZSBhIG5ldyBqb2IgdGhhdCBzYW1wbGVzIGV2ZXJ5IGludGVydmFsIG1pbGxpc2Vjb25kcyAoRGVmYXVsdDogZGlzYWJsZWQpIGluIHRoZSBiYWNrZ3JvdW5kIikKKyAgICBwcml2YXRlIGludCBpbnRlcnZhbE1pbGxpcyA9IC0xOyAvLyAtMSBmb3IgZGlzYWJsZWQuCisKKyAgICBAT3B0aW9uKG5hbWUgPSB7Ii10IiwgIi0tc3RvcCJ9LCBkZXNjcmlwdGlvbiA9ICJTdG9wIHRoZSBzY2hlZHVsZWQgc2FtcGxpbmcgam9iIGlkZW50aWZpZWQgYnkgPGtleXNwYWNlPiBhbmQgPGNmbmFtZT4uIEpvYnMgYXJlIHN0b3BwZWQgdW50aWwgdGhlIGxhc3Qgc2NoZWR1bGVzIGNvbXBsZXRlLiIpCisgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZFN0b3AgPSBmYWxzZTsKKworICAgIEBPcHRpb24obmFtZSA9IHsiLWwiLCAiLS1saXN0In0sIGRlc2NyaXB0aW9uID0gIkxpc3QgdGhlIHNjaGVkdWxlZCBzYW1wbGluZyBqb2JzIikKKyAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkTGlzdCA9IGZhbHNlOworCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShOb2RlUHJvYmUgcHJvYmUpCiAgICAgewotICAgICAgICBjaGVja0FyZ3VtZW50KGFyZ3Muc2l6ZSgpID09IDMgfHwgYXJncy5zaXplKCkgPT0gMSB8fCBhcmdzLnNpemUoKSA9PSAwLCAiSW52YWxpZCBhcmd1bWVudHMsIGVpdGhlciBba2V5c3BhY2UgdGFibGUgZHVyYXRpb25dIG9yIFtkdXJhdGlvbl0gb3Igbm8gYXJncyIpOwotICAgICAgICBjaGVja0FyZ3VtZW50KHRvcENvdW50IDwgY2FwYWNpdHksICJUb3BLIGNvdW50ICgtaykgb3B0aW9uIG11c3QgYmUgc21hbGxlciB0aGVuIHRoZSBzdW1tYXJ5IGNhcGFjaXR5ICgtcykiKTsKKyAgICAgICAgY2hlY2tBcmd1bWVudChhcmdzLnNpemUoKSA9PSAzIHx8IGFyZ3Muc2l6ZSgpID09IDIgfHwgYXJncy5zaXplKCkgPT0gMSB8fCBhcmdzLnNpemUoKSA9PSAwLAorICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGFyZ3VtZW50cywgZWl0aGVyIFtrZXlzcGFjZSB0YWJsZS8qIGR1cmF0aW9uXSBvciBba2V5c3BhY2UgdGFibGUvKl0gb3IgW2R1cmF0aW9uXSBvciBubyBhcmdzLlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgIk9wdGlvbmFsbHksIHVzZSAqIHRvIHJlcHJlc2VudCBhbGwgdGFibGVzIHVuZGVyIHRoZSBrZXlzcGFjZS4iKTsKKyAgICAgICAgY2hlY2tBcmd1bWVudCh0b3BDb3VudCA+IDAsICJUb3BLIGNvdW50ICgtaykgb3B0aW9uIG11c3QgaGF2ZSBwb3NpdGl2ZSB2YWx1ZSIpOworICAgICAgICBjaGVja0FyZ3VtZW50KHRvcENvdW50IDwgY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgIlRvcEsgY291bnQgKC1rKSBvcHRpb24gbXVzdCBiZSBzbWFsbGVyIHRoZW4gdGhlIHN1bW1hcnkgY2FwYWNpdHkgKC1zKSIpOworICAgICAgICBjaGVja0FyZ3VtZW50KGNhcGFjaXR5IDw9IDEwMjQsICJDYXBhY2l0eSAoLXMpIGNhbm5vdCBleGNlZWQgMTAyNC4iKTsKICAgICAgICAgU3RyaW5nIGtleXNwYWNlID0gbnVsbDsKICAgICAgICAgU3RyaW5nIHRhYmxlID0gbnVsbDsKLSAgICAgICAgSW50ZWdlciBkdXJhdGlvbk1pbGxpcyA9IDEwMDAwOwotICAgICAgICBpZihhcmdzLnNpemUoKSA9PSAzKQorICAgICAgICBpbnQgZHVyYXRpb25NaWxsaXMgPSAxMDAwMDsKKyAgICAgICAgLyogVGhlcmUgYXJlIDMgcG9zc2libGUgb3V0Y29tZXMgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgYXJncy4KKyAgICAgICAgICogLSBrZXlzcGFjZSA9PSBudWxsICYmIHRhYmxlID09IG51bGwuIFdlIG5lZWQgdG8gc2FtcGxlIGFsbCB0YWJsZXMKKyAgICAgICAgICogLSBrZXlzcGFjZSA9PSBLRVlTUEFDRSAmJiB0YWJsZSA9PSAqLiBXZSBuZWVkIHRvIHNhbXBsZSBhbGwgdGFibGVzIHVuZGVyIHRoZSBzcGVjaWZpZWQgS0VZU1BBQ0UKKyAgICAgICAgICogLSBrZXlzcGFjZSA9IEtFWVNQQUNFICYmIHRhYmxlID09IFRBQkxFLiBTYW1wbGUgdGhlIHNwZWNpZmljIEtFWVNQQUNFLnRhYmxlIGNvbWJpbmF0aW9uCisgICAgICAgICAqLworICAgICAgICBpZiAoYXJncy5zaXplKCkgPT0gMykKICAgICAgICAgewogICAgICAgICAgICAga2V5c3BhY2UgPSBhcmdzLmdldCgwKTsKICAgICAgICAgICAgIHRhYmxlID0gYXJncy5nZXQoMSk7Ci0gICAgICAgICAgICBkdXJhdGlvbk1pbGxpcyA9IEludGVnZXIudmFsdWVPZihhcmdzLmdldCgyKSk7CisgICAgICAgICAgICBkdXJhdGlvbk1pbGxpcyA9IEludGVnZXIucGFyc2VJbnQoYXJncy5nZXQoMikpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGtleXNwYWNlID0gYXJncy5nZXQoMCk7CisgICAgICAgICAgICB0YWJsZSA9IGFyZ3MuZ2V0KDEpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID09IDEpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGR1cmF0aW9uTWlsbGlzID0gSW50ZWdlci52YWx1ZU9mKGFyZ3MuZ2V0KDApKTsKKyAgICAgICAgICAgIGR1cmF0aW9uTWlsbGlzID0gSW50ZWdlci5wYXJzZUludChhcmdzLmdldCgwKSk7CiAgICAgICAgIH0KKyAgICAgICAga2V5c3BhY2UgPSBudWxsaWZ5V2lsZGNhcmQoa2V5c3BhY2UpOworICAgICAgICB0YWJsZSA9IG51bGxpZnlXaWxkY2FyZCh0YWJsZSk7CisKKyAgICAgICAgY2hlY2tBcmd1bWVudChkdXJhdGlvbk1pbGxpcyA+IDAsICJEdXJhdGlvbjogJXMgbXVzdCBiZSBwb3NpdGl2ZSIsIGR1cmF0aW9uTWlsbGlzKTsKKworICAgICAgICBjaGVja0FyZ3VtZW50KCFoYXNJbnRlcnZhbCgpIHx8IGludGVydmFsTWlsbGlzID49IGR1cmF0aW9uTWlsbGlzLAorICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHNjaGVkdWxlZCBzYW1wbGluZyBpbnRlcnZhbC4gRXhwZWN0aW5nIGludGVydmFsID49IGR1cmF0aW9uLCBidXQgaW50ZXJ2YWw6ICVzIG1zOyBkdXJhdGlvbjogJXMgbXMiLAorICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsTWlsbGlzLCBkdXJhdGlvbk1pbGxpcyk7CiAgICAgICAgIC8vIGdlbmVyYXRlIHRoZSBsaXN0IG9mIHNhbXBsZXJzCiAgICAgICAgIExpc3Q8U3RyaW5nPiB0YXJnZXRzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBhdmFpbGFibGUgPSBBcnJheXMuc3RyZWFtKFNhbXBsZXJUeXBlLnZhbHVlcygpKS5tYXAoRW51bTo6dG9TdHJpbmcpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIFNldDxTdHJpbmc+IGF2YWlsYWJsZSA9IEFycmF5cy5zdHJlYW0oU2FtcGxlclR5cGUudmFsdWVzKCkpLm1hcChFbnVtOjp0b1N0cmluZykuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOwogICAgICAgICBmb3IgKFN0cmluZyBzIDogc2FtcGxlcnMuc3BsaXQoIiwiKSkKICAgICAgICAgewogICAgICAgICAgICAgU3RyaW5nIHNhbXBsZXIgPSBzLnRyaW0oKS50b1VwcGVyQ2FzZSgpOwpAQCAtODYsMTA4ICsxMTgsNzAgQEAKICAgICAgICAgICAgIHRhcmdldHMuYWRkKHNhbXBsZXIpOwogICAgICAgICB9CiAKKyAgICAgICAgUHJpbnRTdHJlYW0gb3V0ID0gcHJvYmUub3V0cHV0KCkub3V0OworCiAgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8Q29tcG9zaXRlRGF0YT4+IHJlc3VsdHM7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoa2V5c3BhY2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXN1bHRzID0gcHJvYmUuZ2V0UGFydGl0aW9uU2FtcGxlKGNhcGFjaXR5LCBkdXJhdGlvbk1pbGxpcywgdG9wQ291bnQsIHRhcmdldHMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHNjaGVkdWxlZCBzYW1wbGluZ3MsIGkuZS4gc3RhcnQgb3Igc3RvcAorICAgICAgICAgICAgaWYgKGhhc0ludGVydmFsKCkgfHwgc2hvdWxkU3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBrZXlzcGFjZSBhbmQgdGFibGUgYXJlIG51bGxhYmxlCisgICAgICAgICAgICAgICAgYm9vbGVhbiBvcFN1Y2Nlc3MgPSBwcm9iZS5oYW5kbGVTY2hlZHVsZWRTYW1wbGluZyhrZXlzcGFjZSwgdGFibGUsIGNhcGFjaXR5LCB0b3BDb3VudCwgZHVyYXRpb25NaWxsaXMsIGludGVydmFsTWlsbGlzLCB0YXJnZXRzLCBzaG91bGRTdG9wKTsKKyAgICAgICAgICAgICAgICBpZiAoIW9wU3VjY2VzcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTdG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50ZigiVW5hYmxlIHRvIHN0b3AgdGhlIG5vbi1leGlzdGVudCBzY2hlZHVsZWQgc2FtcGxpbmcgZm9yIGtleXNwYWNlOiAlcywgdGFibGU6ICVzJW4iLCBrZXlzcGFjZSwgdGFibGUpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRmKCJVbmFibGUgdG8gc2NoZWR1bGUgc2FtcGxpbmcgZm9yIGtleXNwYWNlOiAlcywgdGFibGU6ICVzIGR1ZSB0byBleGlzdGluZyBzYW1wbGluZ3MuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RvcCB0aGUgZXhpc3Rpbmcgc2FtcGxpbmcgam9icyBmaXJzdC4lbiIsIGtleXNwYWNlLCB0YWJsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHNob3VsZExpc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gc2FtcGxlVGFza3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICBpbnQgbWF4S3NMZW5ndGggPSAiS0VZU1BBQ0UiLmxlbmd0aCgpOworICAgICAgICAgICAgICAgIGludCBtYXhUYmxMZW5ndGggPSAiVEFCTEUiLmxlbmd0aCgpOworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGZ1bGxUYWJsZU5hbWUgOiBwcm9iZS5nZXRTYW1wbGVUYXNrcygpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcGFydHMgPSBmdWxsVGFibGVOYW1lLnNwbGl0KCJcXC4iKTsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tTdGF0ZShwYXJ0cy5sZW5ndGggPT0gMiwgIlVuYWJsZSB0byBwYXJzZSB0aGUgZnVsbCB0YWJsZSBuYW1lOiAlcyIsIGZ1bGxUYWJsZU5hbWUpOworICAgICAgICAgICAgICAgICAgICBzYW1wbGVUYXNrcy5hZGQoUGFpci5jcmVhdGUocGFydHNbMF0sIHBhcnRzWzFdKSk7CisgICAgICAgICAgICAgICAgICAgIG1heEtzTGVuZ3RoID0gTWF0aC5tYXgobWF4S3NMZW5ndGgsIHBhcnRzWzBdLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gcHJpbnQgdGhlIGhlYWRlciBsaW5lIGFuZCBwdXQgZW5vdWdoIHNwYWNlIGJldHdlZW4gS0VZU1BBQ0UgQU5EIFRBQkxFLgorICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lRm9ybWF0ID0gIiUiICsgbWF4S3NMZW5ndGggKyAicyAlIiArIG1heFRibExlbmd0aCArICJzJW4iOworICAgICAgICAgICAgICAgIG91dC5wcmludGYobGluZUZvcm1hdCwgIktFWVNQQUNFIiwgIlRBQkxFIik7CisgICAgICAgICAgICAgICAgc2FtcGxlVGFza3MuZm9yRWFjaChwYWlyIC0+IG91dC5wcmludGYobGluZUZvcm1hdCwgcGFpci5sZWZ0LCBwYWlyLnJpZ2h0KSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBwcm9iZS5nZXRQYXJ0aXRpb25TYW1wbGUoa2V5c3BhY2UsIHRhYmxlLCBjYXBhY2l0eSwgZHVyYXRpb25NaWxsaXMsIHRvcENvdW50LCB0YXJnZXRzKTsKLQotICAgICAgICB9IGNhdGNoIChPcGVuRGF0YUV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGJsb2NraW5nIHNhbXBsZSBhbGwgdGhlIHRhYmxlcyBvciBhbGwgdGhlIHRhYmxlcyB1bmRlciBhIGtleXNwYWNlCisgICAgICAgICAgICAgICAgaWYgKGtleXNwYWNlID09IG51bGwgfHwgdGFibGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHByb2JlLmdldFBhcnRpdGlvblNhbXBsZShrZXlzcGFjZSwgY2FwYWNpdHksIGR1cmF0aW9uTWlsbGlzLCB0b3BDb3VudCwgdGFyZ2V0cyk7CisgICAgICAgICAgICAgICAgZWxzZSAvLyBibG9ja2luZyBzYW1wbGUgdGhlIHNwZWNpZmljIHRhYmxlCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBwcm9iZS5nZXRQYXJ0aXRpb25TYW1wbGUoa2V5c3BhY2UsIHRhYmxlLCBjYXBhY2l0eSwgZHVyYXRpb25NaWxsaXMsIHRvcENvdW50LCB0YXJnZXRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoT3BlbkRhdGFFeGNlcHRpb24gZSkKICAgICAgICAgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KIAogICAgICAgICBBdG9taWNCb29sZWFuIGZpcnN0ID0gbmV3IEF0b21pY0Jvb2xlYW4odHJ1ZSk7Ci0gICAgICAgIFJlc3VsdEJ1aWxkZXIgcmIgPSBuZXcgUmVzdWx0QnVpbGRlcihmaXJzdCwgcmVzdWx0cywgdGFyZ2V0cyk7Ci0KLSAgICAgICAgZm9yKFN0cmluZyBzYW1wbGVyIDogTGlzdHMubmV3QXJyYXlMaXN0KCJSRUFEUyIsICJXUklURVMiLCAiQ0FTX0NPTlRFTlRJT05TIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJiLmZvclR5cGUoU2FtcGxlclR5cGUudmFsdWVPZihzYW1wbGVyKSwgIkZyZXF1ZW5jeSBvZiAiICsgc2FtcGxlci50b0xvd2VyQ2FzZSgpLnJlcGxhY2VBbGwoIl8iLCAiICIpICsgIiBieSBwYXJ0aXRpb24iKQotICAgICAgICAgICAgLmFkZENvbHVtbigiVGFibGUiLCAidGFibGUiKQotICAgICAgICAgICAgLmFkZENvbHVtbigiUGFydGl0aW9uIiwgInZhbHVlIikKLSAgICAgICAgICAgIC5hZGRDb2x1bW4oIkNvdW50IiwgImNvdW50IikKLSAgICAgICAgICAgIC5hZGRDb2x1bW4oIisvLSIsICJlcnJvciIpCi0gICAgICAgICAgICAucHJpbnQocHJvYmUub3V0cHV0KCkub3V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJiLmZvclR5cGUoU2FtcGxlclR5cGUuV1JJVEVfU0laRSwgIk1heCBtdXRhdGlvbiBzaXplIGJ5IHBhcnRpdGlvbiIpCi0gICAgICAgICAgICAuYWRkQ29sdW1uKCJUYWJsZSIsICJ0YWJsZSIpCi0gICAgICAgICAgICAuYWRkQ29sdW1uKCJQYXJ0aXRpb24iLCAidmFsdWUiKQotICAgICAgICAgICAgLmFkZENvbHVtbigiQnl0ZXMiLCAiY291bnQiKQotICAgICAgICAgICAgLnByaW50KHByb2JlLm91dHB1dCgpLm91dCk7Ci0KLSAgICAgICAgcmIuZm9yVHlwZShTYW1wbGVyVHlwZS5MT0NBTF9SRUFEX1RJTUUsICJMb25nZXN0IHJlYWQgcXVlcnkgdGltZXMiKQotICAgICAgICAgICAgLmFkZENvbHVtbigiUXVlcnkiLCAidmFsdWUiKQotICAgICAgICAgICAgLmFkZENvbHVtbigiTWljcm9zZWNvbmRzIiwgImNvdW50IikKLSAgICAgICAgICAgIC5wcmludChwcm9iZS5vdXRwdXQoKS5vdXQpOworICAgICAgICBTYW1wbGluZ01hbmFnZXIuUmVzdWx0QnVpbGRlciByYiA9IG5ldyBTYW1wbGluZ01hbmFnZXIuUmVzdWx0QnVpbGRlcihmaXJzdCwgcmVzdWx0cywgdGFyZ2V0cyk7CisgICAgICAgIG91dC5wcmludGxuKFNhbXBsaW5nTWFuYWdlci5mb3JtYXRSZXN1bHQocmIpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGNsYXNzIFJlc3VsdEJ1aWxkZXIKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzSW50ZXJ2YWwoKQogICAgIHsKLSAgICAgICAgcHJpdmF0ZSBTYW1wbGVyVHlwZSB0eXBlOwotICAgICAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLSAgICAgICAgcHJpdmF0ZSBBdG9taWNCb29sZWFuIGZpcnN0OwotICAgICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8Q29tcG9zaXRlRGF0YT4+IHJlc3VsdHM7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHRhcmdldHM7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gZGF0YUtleXM7CisgICAgICAgIHJldHVybiBpbnRlcnZhbE1pbGxpcyAhPSAtMTsKKyAgICB9CiAKLSAgICAgICAgcHVibGljIFJlc3VsdEJ1aWxkZXIoQXRvbWljQm9vbGVhbiBmaXJzdCwgTWFwPFN0cmluZywgTGlzdDxDb21wb3NpdGVEYXRhPj4gcmVzdWx0cywgTGlzdDxTdHJpbmc+IHRhcmdldHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7Ci0gICAgICAgICAgICB0aGlzLnJlc3VsdHMgPSByZXN1bHRzOwotICAgICAgICAgICAgdGhpcy50YXJnZXRzID0gdGFyZ2V0czsKLSAgICAgICAgICAgIHRoaXMuZGF0YUtleXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIHRoaXMuZGF0YUtleXMuYWRkKFBhaXIuY3JlYXRlKCIgICIsICIgICIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBSZXN1bHRCdWlsZGVyIGZvclR5cGUoU2FtcGxlclR5cGUgdHlwZSwgU3RyaW5nIGRlc2NyaXB0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXN1bHRCdWlsZGVyIHJiID0gbmV3IFJlc3VsdEJ1aWxkZXIoZmlyc3QsIHJlc3VsdHMsIHRhcmdldHMpOwotICAgICAgICAgICAgcmIudHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICByYi5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgICAgICAgICAgcmV0dXJuIHJiOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFJlc3VsdEJ1aWxkZXIgYWRkQ29sdW1uKFN0cmluZyB0aXRsZSwgU3RyaW5nIGtleSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5kYXRhS2V5cy5hZGQoUGFpci5jcmVhdGUodGl0bGUsIGtleSkpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXQoQ29tcG9zaXRlRGF0YSBjZCwgU3RyaW5nIGtleSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNkLmNvbnRhaW5zS2V5KGtleSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNkLmdldChrZXkpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICByZXR1cm4ga2V5OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcHJpbnQoUHJpbnRTdHJlYW0gb3V0U3RyZWFtKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0cy5jb250YWlucyh0eXBlLnRvU3RyaW5nKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghZmlyc3QuZ2V0KCkpCi0gICAgICAgICAgICAgICAgICAgIG91dFN0cmVhbS5wcmludGxuKCk7Ci0gICAgICAgICAgICAgICAgZmlyc3Quc2V0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICBvdXRTdHJlYW0ucHJpbnRsbihkZXNjcmlwdGlvbiArICc6Jyk7Ci0gICAgICAgICAgICAgICAgVGFibGVCdWlsZGVyIG91dCA9IG5ldyBUYWJsZUJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBvdXQuYWRkKGRhdGFLZXlzLnN0cmVhbSgpLm1hcChwIC0+IHAubGVmdCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKS50b0FycmF5KG5ldyBTdHJpbmdbXSB7fSkpOwotICAgICAgICAgICAgICAgIExpc3Q8Q29tcG9zaXRlRGF0YT4gdG9wayA9IHJlc3VsdHMuZ2V0KHR5cGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChDb21wb3NpdGVEYXRhIGNkIDogdG9waykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5hZGQoZGF0YUtleXMuc3RyZWFtKCkubWFwKHAgLT4gZ2V0KGNkLCBwLnJpZ2h0KSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKS50b0FycmF5KG5ldyBTdHJpbmdbXSB7fSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodG9way5zaXplKCkgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG91dFN0cmVhbS5wcmludGxuKCIgICBOb3RoaW5nIHJlY29yZGVkIGR1cmluZyBzYW1wbGluZyBwZXJpb2QuLi4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50VG8ob3V0U3RyZWFtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBwcml2YXRlIFN0cmluZyBudWxsaWZ5V2lsZGNhcmQoU3RyaW5nIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgJiYgaW5wdXQuZXF1YWxzKCIqIikgPyBudWxsIDogaW5wdXQ7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvUmVidWlsZC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvUmVidWlsZC5qYXZhCmluZGV4IGExNmU4ZjIuLmVkNGU5N2MgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1JlYnVpbGQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9SZWJ1aWxkLmphdmEKQEAgLTI4LDcgKzI4LDcgQEAKIHB1YmxpYyBjbGFzcyBSZWJ1aWxkIGV4dGVuZHMgTm9kZVRvb2xDbWQKIHsKICAgICBAQXJndW1lbnRzKHVzYWdlID0gIjxzcmMtZGMtbmFtZT4iLAotICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiTmFtZSBvZiBEQyBmcm9tIHdoaWNoIHRvIHNlbGVjdCBzb3VyY2VzIGZvciBzdHJlYW1pbmcuIEJ5IGRlZmF1bHQsIHBpY2sgYW55IERDIikKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIk5hbWUgb2YgREMgZnJvbSB3aGljaCB0byBzZWxlY3Qgc291cmNlcyBmb3Igc3RyZWFtaW5nLiBCeSBkZWZhdWx0LCBwaWNrIGFueSBEQyAoZXhjZXB0IGxvY2FsIERDIHdoZW4gLS1leGNsdWRlLWxvY2FsLWRjIGlzIHNldCkiKQogICAgIHByaXZhdGUgU3RyaW5nIHNvdXJjZURhdGFDZW50ZXJOYW1lID0gbnVsbDsKIAogICAgIEBPcHRpb24odGl0bGUgPSAic3BlY2lmaWNfa2V5c3BhY2UiLApAQCAtNDYsNiArNDYsMTEgQEAKICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIlVzZSAtcyB0byBzcGVjaWZ5IGhvc3RzIHRoYXQgdGhpcyBub2RlIHNob3VsZCBzdHJlYW0gZnJvbSB3aGVuIC10cyBpcyB1c2VkLiBNdWx0aXBsZSBob3N0cyBzaG91bGQgYmUgc2VwYXJhdGVkIHVzaW5nIGNvbW1hcyAoZS5nLiAxMjcuMC4wLjEsMTI3LjAuMC4yLC4uLikiKQogICAgIHByaXZhdGUgU3RyaW5nIHNwZWNpZmljU291cmNlcyA9IG51bGw7CiAKKyAgICBAT3B0aW9uKHRpdGxlID0gImV4Y2x1ZGVfbG9jYWxfZGMiLAorICAgICAgICAgICAgbmFtZSA9IHsiLS1leGNsdWRlLWxvY2FsLWRjIn0sCisgICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJVc2UgLS1leGNsdWRlLWxvY2FsLWRjIHRvIGV4Y2x1ZGUgbm9kZXMgaW4gbG9jYWwgZGF0YSBjZW50ZXIgYXMgc291cmNlIGZvciBzdHJlYW1pbmcuIikKKyAgICBwcml2YXRlIGJvb2xlYW4gZXhjbHVkZUxvY2FsRGF0YWNlbnRlck5vZGVzID0gZmFsc2U7CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKE5vZGVQcm9iZSBwcm9iZSkKICAgICB7CkBAIC01NSw2ICs2MCw2IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3Qgc3BlY2lmeSB0b2tlbnMgd2l0aG91dCBrZXlzcGFjZS4iKTsKICAgICAgICAgfQogCi0gICAgICAgIHByb2JlLnJlYnVpbGQoc291cmNlRGF0YUNlbnRlck5hbWUsIGtleXNwYWNlLCB0b2tlbnMsIHNwZWNpZmljU291cmNlcyk7CisgICAgICAgIHByb2JlLnJlYnVpbGQoc291cmNlRGF0YUNlbnRlck5hbWUsIGtleXNwYWNlLCB0b2tlbnMsIHNwZWNpZmljU291cmNlcywgZXhjbHVkZUxvY2FsRGF0YWNlbnRlck5vZGVzKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9SaW5nLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9SaW5nLmphdmEKaW5kZXggY2NjNzkxMi4uZWI3NjQ1ZDYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1JpbmcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9SaW5nLmphdmEKQEAgLTg1LDIxICs4NSwyOSBAQAogICAgICAgICBib29sZWFuIHNob3dFZmZlY3RpdmVPd25lcnNoaXAgPSB0cnVlOwogCiAgICAgICAgIC8vIENhbGN1bGF0ZSBwZXItdG9rZW4gb3duZXJzaGlwIG9mIHRoZSByaW5nCi0gICAgICAgIE1hcDxTdHJpbmcsIEZsb2F0PiBvd25lcnNoaXBzOworICAgICAgICBNYXA8U3RyaW5nLCBGbG9hdD4gb3duZXJzaGlwcyA9IG51bGw7CiAgICAgICAgIHRyeQogICAgICAgICB7CiAgICAgICAgICAgICBvd25lcnNoaXBzID0gcHJvYmUuZWZmZWN0aXZlT3duZXJzaGlwV2l0aFBvcnQoa2V5c3BhY2UpOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG93bmVyc2hpcHMgPSBwcm9iZS5nZXRPd25lcnNoaXBXaXRoUG9ydCgpOwotICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiTm90ZTogIikuYXBwZW5kKGV4LmdldE1lc3NhZ2UoKSkuYXBwZW5kKCIlbiIpOwotICAgICAgICAgICAgc2hvd0VmZmVjdGl2ZU93bmVyc2hpcCA9IGZhbHNlOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3duZXJzaGlwcyA9IHByb2JlLmdldE93bmVyc2hpcFdpdGhQb3J0KCk7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiTm90ZTogIikuYXBwZW5kKGV4LmdldE1lc3NhZ2UoKSkuYXBwZW5kKCIlbiIpOworICAgICAgICAgICAgICAgIHNob3dFZmZlY3RpdmVPd25lcnNoaXAgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRmKCIlbkVycm9yOiAlcyVuIiwgZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KQogICAgICAgICB7CiAgICAgICAgICAgICBvdXQucHJpbnRmKCIlbkVycm9yOiAlcyVuIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwogICAgICAgICB9CiAKICAgICAgICAgb3V0LnByaW50bG4oKTsKQEAgLTExMiw3ICsxMjAsNyBAQAogICAgICAgICAgICAgb3V0LnByaW50bG4oIiAgVG8gdmlldyBzdGF0dXMgcmVsYXRlZCBpbmZvIG9mIGEgbm9kZSB1c2UgXCJub2RldG9vbCBzdGF0dXNcIiBpbnN0ZWFkLlxuIik7CiAgICAgICAgIH0KIAotICAgICAgICBvdXQucHJpbnRmKCIlbiAgIiArIGVycm9ycy50b1N0cmluZygpKTsKKyAgICAgICAgb3V0LnByaW50ZigiJW4gICIgKyBlcnJvcnMpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBwcmludERjKFN0cmluZyBmb3JtYXQsIFN0cmluZyBkYywKQEAgLTE2Nyw5ICsxNzUsNyBAQAogICAgICAgICAgICAgZWxzZSBpZiAobW92aW5nTm9kZXMuY29udGFpbnMoZW5kcG9pbnQpKQogICAgICAgICAgICAgICAgIHN0YXRlID0gIk1vdmluZyI7CiAKLSAgICAgICAgICAgIFN0cmluZyBsb2FkID0gbG9hZE1hcC5jb250YWluc0tleShlbmRwb2ludCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPyBsb2FkTWFwLmdldChlbmRwb2ludCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiPyI7CisgICAgICAgICAgICBTdHJpbmcgbG9hZCA9IGxvYWRNYXAuZ2V0T3JEZWZhdWx0KGVuZHBvaW50LCAiPyIpOwogICAgICAgICAgICAgU3RyaW5nIG93bnMgPSBzdGF0Lm93bnMgIT0gbnVsbCAmJiBzaG93RWZmZWN0aXZlT3duZXJzaGlwPyBuZXcgRGVjaW1hbEZvcm1hdCgiIyMwLjAwJSIpLmZvcm1hdChzdGF0Lm93bnMpIDogIj8iOwogICAgICAgICAgICAgb3V0LnByaW50Zihmb3JtYXQsIHN0YXQuaXBPckRucyhwcmludFBvcnQpLCByYWNrLCBzdGF0dXMsIHN0YXRlLCBsb2FkLCBvd25zLCBzdGF0LnRva2VuKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU3RhdHVzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TdGF0dXMuamF2YQppbmRleCAzNjlhZmZjLi5hODljYTY0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TdGF0dXMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TdGF0dXMuamF2YQpAQCAtNzksOCArNzksMTYgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG93bmVyc2hpcHMgPSBwcm9iZS5nZXRPd25lcnNoaXBXaXRoUG9ydCgpOwotICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiTm90ZTogIikuYXBwZW5kKGUuZ2V0TWVzc2FnZSgpKS5hcHBlbmQoIiVuIik7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvd25lcnNoaXBzID0gcHJvYmUuZ2V0T3duZXJzaGlwV2l0aFBvcnQoKTsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJOb3RlOiAiKS5hcHBlbmQoZS5nZXRNZXNzYWdlKCkpLmFwcGVuZCgiJW4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50ZigiJW5FcnJvcjogJXMlbiIsIGV4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvVGFibGVTdGF0cy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvVGFibGVTdGF0cy5qYXZhCmluZGV4IDRhMzNjNjQuLmMxYTc2YTAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1RhYmxlU3RhdHMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9UYWJsZVN0YXRzLmphdmEKQEAgLTYwLDcgKzYwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICsgIm1lbXRhYmxlX29mZl9oZWFwX21lbW9yeV91c2VkLCBtZW10YWJsZV9zd2l0Y2hfY291bnQsIG51bWJlcl9vZl9wYXJ0aXRpb25zX2VzdGltYXRlLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICArICJvZmZfaGVhcF9tZW1vcnlfdXNlZF90b3RhbCwgcGVuZGluZ19mbHVzaGVzLCBwZXJjZW50X3JlcGFpcmVkLCByZWFkX2xhdGVuY3ksIHJlYWRzLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICArICJzcGFjZV91c2VkX2J5X3NuYXBzaG90c190b3RhbCwgc3BhY2VfdXNlZF9saXZlLCBzcGFjZV91c2VkX3RvdGFsLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJzc3RhYmxlX2NvbXByZXNzaW9uX3JhdGlvLCBzc3RhYmxlX2NvdW50LCB0YWJsZV9uYW1lLCB3cml0ZV9sYXRlbmN5LCB3cml0ZXMpIikKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInNzdGFibGVfY29tcHJlc3Npb25fcmF0aW8sIHNzdGFibGVfY291bnQsIHRhYmxlX25hbWUsIHdyaXRlX2xhdGVuY3ksIHdyaXRlcywgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhfc3N0YWJsZV9zaXplLCBsb2NhbF9yZWFkX3dyaXRlX3JhdGlvLCB0d2NzX21heF9kdXJhdGlvbikiKQogICAgIHByaXZhdGUgU3RyaW5nIHNvcnRLZXkgPSAiIjsKIAogICAgIEBPcHRpb24odGl0bGUgPSAidG9wIiwKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1ZlcnNpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1ZlcnNpb24uamF2YQppbmRleCBmOTU5MDdhLi42NTU2YTA0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9WZXJzaW9uLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvVmVyc2lvbi5qYXZhCkBAIC0xOCwxNiArMTgsMjMgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMubm9kZXRvb2w7CiAKIGltcG9ydCBpby5haXJsaWZ0LmFpcmxpbmUuQ29tbWFuZDsKLQoraW1wb3J0IGlvLmFpcmxpZnQuYWlybGluZS5PcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuTm9kZVByb2JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLk5vZGVUb29sLk5vZGVUb29sQ21kOwogCiBAQ29tbWFuZChuYW1lID0gInZlcnNpb24iLCBkZXNjcmlwdGlvbiA9ICJQcmludCBjYXNzYW5kcmEgdmVyc2lvbiIpCiBwdWJsaWMgY2xhc3MgVmVyc2lvbiBleHRlbmRzIE5vZGVUb29sQ21kCiB7CisgICAgQE9wdGlvbih0aXRsZSA9ICJ2ZXJib3NlIiwKKyAgICAgICAgICAgIG5hbWUgPSB7Ii12IiwgIi0tdmVyYm9zZSJ9LAorICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiSW5jbHVkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIikKKyAgICBwcml2YXRlIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOworCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShOb2RlUHJvYmUgcHJvYmUpCiAgICAgewogICAgICAgICBwcm9iZS5vdXRwdXQoKS5vdXQucHJpbnRsbigiUmVsZWFzZVZlcnNpb246ICIgKyBwcm9iZS5nZXRSZWxlYXNlVmVyc2lvbigpKTsKKyAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICBwcm9iZS5vdXRwdXQoKS5vdXQucHJpbnRsbigiR2l0U0hBOiAiICsgcHJvYmUuZ2V0R2l0U0hBKCkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL0NvbXBhY3Rpb25IaXN0b3J5SG9sZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9Db21wYWN0aW9uSGlzdG9yeUhvbGRlci5qYXZhCmluZGV4IDg3OTlmZmIuLjM2MmJjNjcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL0NvbXBhY3Rpb25IaXN0b3J5SG9sZGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvc3RhdHMvQ29tcGFjdGlvbkhpc3RvcnlIb2xkZXIuamF2YQpAQCAtNTQsOCArNTQsOSBAQAogICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgYnl0ZXNJbjsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGJ5dGVzT3V0OwogICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByb3dNZXJnZWQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNvbXBhY3Rpb25Qcm9wZXJ0aWVzOwogCi0gICAgICAgIENvbXBhY3Rpb25IaXN0b3J5Um93KFN0cmluZyBpZCwgU3RyaW5nIGtzTmFtZSwgU3RyaW5nIGNmTmFtZSwgbG9uZyBjb21wYWN0ZWRBdCwgbG9uZyBieXRlc0luLCBsb25nIGJ5dGVzT3V0LCBTdHJpbmcgcm93TWVyZ2VkKQorICAgICAgICBDb21wYWN0aW9uSGlzdG9yeVJvdyhTdHJpbmcgaWQsIFN0cmluZyBrc05hbWUsIFN0cmluZyBjZk5hbWUsIGxvbmcgY29tcGFjdGVkQXQsIGxvbmcgYnl0ZXNJbiwgbG9uZyBieXRlc091dCwgU3RyaW5nIHJvd01lcmdlZCwgU3RyaW5nIGNvbXBhY3Rpb25Qcm9wZXJ0aWVzKQogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgICAgICB0aGlzLmtzTmFtZSA9IGtzTmFtZTsKQEAgLTY0LDYgKzY1LDcgQEAKICAgICAgICAgICAgIHRoaXMuYnl0ZXNJbiA9IGJ5dGVzSW47CiAgICAgICAgICAgICB0aGlzLmJ5dGVzT3V0ID0gYnl0ZXNPdXQ7CiAgICAgICAgICAgICB0aGlzLnJvd01lcmdlZCA9IHJvd01lcmdlZDsKKyAgICAgICAgICAgIHRoaXMuY29tcGFjdGlvblByb3BlcnRpZXMgPSBjb21wYWN0aW9uUHJvcGVydGllczsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKENvbXBhY3Rpb25IaXN0b3J5SG9sZGVyLkNvbXBhY3Rpb25IaXN0b3J5Um93IGNocikKQEAgLTgzLDYgKzg1LDcgQEAKICAgICAgICAgICAgIGNvbXBhY3Rpb24ucHV0KCJieXRlc19pbiIsIHRoaXMuYnl0ZXNJbik7CiAgICAgICAgICAgICBjb21wYWN0aW9uLnB1dCgiYnl0ZXNfb3V0IiwgdGhpcy5ieXRlc091dCk7CiAgICAgICAgICAgICBjb21wYWN0aW9uLnB1dCgicm93c19tZXJnZWQiLCB0aGlzLnJvd01lcmdlZCk7CisgICAgICAgICAgICBjb21wYWN0aW9uLnB1dCgiY29tcGFjdGlvbl9wcm9wZXJ0aWVzIiwgdGhpcy5jb21wYWN0aW9uUHJvcGVydGllcyk7CiAgICAgICAgICAgICByZXR1cm4gY29tcGFjdGlvbjsKICAgICAgICAgfQogICAgIH0KQEAgLTExMCw3ICsxMTMsOCBAQAogICAgICAgICAgICAgICAgIChMb25nKXZhbHVlLmdldCgzKSwKICAgICAgICAgICAgICAgICAoTG9uZyl2YWx1ZS5nZXQoNCksCiAgICAgICAgICAgICAgICAgKExvbmcpdmFsdWUuZ2V0KDUpLAotICAgICAgICAgICAgICAgIChTdHJpbmcpdmFsdWUuZ2V0KDYpCisgICAgICAgICAgICAgICAgKFN0cmluZyl2YWx1ZS5nZXQoNiksCisgICAgICAgICAgICAgICAgKFN0cmluZyl2YWx1ZS5nZXQoNykKICAgICAgICAgICAgICk7CiAgICAgICAgICAgICBjaHJMaXN0LmFkZChjaHIpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9Db21wYWN0aW9uSGlzdG9yeVByaW50ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL0NvbXBhY3Rpb25IaXN0b3J5UHJpbnRlci5qYXZhCmluZGV4IDk3ZWQxYzQuLmMyYjYyZWUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL0NvbXBhY3Rpb25IaXN0b3J5UHJpbnRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL0NvbXBhY3Rpb25IaXN0b3J5UHJpbnRlci5qYXZhCkBAIC02NSw3ICs2NSw3IEBACiAgICAgICAgICAgICBmb3IgKE9iamVjdCBjaHIgOiBjb21wYWN0aW9uSGlzdG9yaWVzKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIE1hcCB2YWx1ZSA9IGNociBpbnN0YW5jZW9mIE1hcDw/LCA/PiA/IChNYXApY2hyIDogQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBvYmogPSBuZXcgU3RyaW5nWzddOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIG9iaiA9IG5ldyBTdHJpbmdbOF07CiAgICAgICAgICAgICAgICAgb2JqWzBdID0gKFN0cmluZyl2YWx1ZS5nZXQoImlkIik7CiAgICAgICAgICAgICAgICAgb2JqWzFdID0gKFN0cmluZyl2YWx1ZS5nZXQoImtleXNwYWNlX25hbWUiKTsKICAgICAgICAgICAgICAgICBvYmpbMl0gPSAoU3RyaW5nKXZhbHVlLmdldCgiY29sdW1uZmFtaWx5X25hbWUiKTsKQEAgLTczLDYgKzczLDcgQEAKICAgICAgICAgICAgICAgICBvYmpbNF0gPSB2YWx1ZS5nZXQoImJ5dGVzX2luIikudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICBvYmpbNV0gPSB2YWx1ZS5nZXQoImJ5dGVzX291dCIpLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgb2JqWzZdID0gKFN0cmluZyl2YWx1ZS5nZXQoInJvd3NfbWVyZ2VkIik7CisgICAgICAgICAgICAgICAgb2JqWzddID0gKFN0cmluZyl2YWx1ZS5nZXQoImNvbXBhY3Rpb25fcHJvcGVydGllcyIpOwogICAgICAgICAgICAgICAgIHRhYmxlLmFkZChvYmopOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdGFibGUucHJpbnRUbyhvdXQpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvc3RhdHMvU3RhdHNQcmludGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9TdGF0c1ByaW50ZXIuamF2YQppbmRleCAwMzcyMjdiLi44NmQ3YWY3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9TdGF0c1ByaW50ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9TdGF0c1ByaW50ZXIuamF2YQpAQCAtMTgsMTAgKzE4LDEwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMubm9kZXRvb2wuc3RhdHM7CiAKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAotaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSnNvblV0aWxzOwogaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5EdW1wZXJPcHRpb25zOwogaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5ZYW1sOwogCkBAIC00MCwxNyArNDAsMTcgQEAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHByaW50KFQgZGF0YSwgUHJpbnRTdHJlYW0gb3V0KQogICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3RNYXBwZXIgbWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGpzb24gPSBtYXBwZXIud3JpdGVyV2l0aERlZmF1bHRQcmV0dHlQcmludGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53cml0ZVZhbHVlQXNTdHJpbmcoZGF0YS5jb252ZXJ0Mk1hcCgpKTsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihqc29uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGUpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRmlyc3QgbmVlZCB0byBnZXQgYSBNYXAgcmVwcmVzZW50YXRpb24gb2Ygc3RhdHMKKyAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gc3RhdHMgPSBkYXRhLmNvbnZlcnQyTWFwKCk7CisgICAgICAgICAgICAvLyBidXQgdGhlbiBhbHNvIG5lZWQgc2xpZ2h0IG1hc3NhZ2luZyB0byBjb2VyY2UgTmFOIHZhbHVlcyBpbnRvIG51bGxzCisgICAgICAgICAgICBmb3IgKE9iamVjdCBzdGF0RW50cnkgOiBzdGF0cy52YWx1ZXMoKSkKKyAgICAgICAgICAgICAgICBpZiAoc3RhdEVudHJ5IGluc3RhbmNlb2YgTWFwPD8sPz4pCisgICAgICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6ICgoTWFwPFN0cmluZywgT2JqZWN0Pikgc3RhdEVudHJ5KS5lbnRyeVNldCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBEb3VibGUgJiYgIURvdWJsZS5pc0Zpbml0ZSgoRG91YmxlKSBlbnRyeS5nZXRWYWx1ZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5zZXRWYWx1ZShudWxsKTsKKworICAgICAgICAgICAgLy8gYW5kIHRoZW4gd2UgY2FuIHNlcmlhbGl6ZQorICAgICAgICAgICAgb3V0LnByaW50bG4oSnNvblV0aWxzLndyaXRlQXNQcmV0dHlKc29uU3RyaW5nKHN0YXRzKSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1N0YXRzVGFibGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1N0YXRzVGFibGUuamF2YQppbmRleCA4YjUwOTBiLi4yNDg0NTcwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9TdGF0c1RhYmxlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvc3RhdHMvU3RhdHNUYWJsZS5qYXZhCkBAIC0zMSw2ICszMSw3IEBACiAgICAgcHVibGljIGJvb2xlYW4gaXNMZXZlbGVkU3N0YWJsZSA9IGZhbHNlOwogICAgIHB1YmxpYyBPYmplY3Qgc3N0YWJsZUNvdW50OwogICAgIHB1YmxpYyBPYmplY3Qgb2xkU1NUYWJsZUNvdW50OworICAgIHB1YmxpYyBMb25nIG1heFNTVGFibGVTaXplOwogICAgIHB1YmxpYyBTdHJpbmcgc3BhY2VVc2VkTGl2ZTsKICAgICBwdWJsaWMgU3RyaW5nIHNwYWNlVXNlZFRvdGFsOwogICAgIHB1YmxpYyBTdHJpbmcgc3BhY2VVc2VkQnlTbmFwc2hvdHNUb3RhbDsKQEAgLTcxLDEwICs3MiwxNCBAQAogICAgIHB1YmxpYyBTdHJpbmcgZHJvcHBlZE11dGF0aW9uczsKICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHNzdGFibGVzSW5FYWNoTGV2ZWwgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHNzdGFibGVCeXRlc0luRWFjaExldmVsID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHVibGljIGludFtdIHNzdGFibGVDb3VudFBlclRXQ1NCdWNrZXQgPSBudWxsOwogICAgIHB1YmxpYyBCb29sZWFuIGlzSW5Db3JyZWN0TG9jYXRpb24gPSBudWxsOyAvLyBudWxsOiBvcHRpb24gbm90IGFjdGl2ZQogICAgIHB1YmxpYyBkb3VibGUgZHJvcHBhYmxlVG9tYnN0b25lUmF0aW87CiAgICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gdG9wU2l6ZVBhcnRpdGlvbnM7CiAgICAgcHVibGljIE1hcDxTdHJpbmcsIExvbmc+IHRvcFRvbWJzdG9uZVBhcnRpdGlvbnM7CiAgICAgcHVibGljIFN0cmluZyB0b3BTaXplUGFydGl0aW9uc0xhc3RVcGRhdGU7CiAgICAgcHVibGljIFN0cmluZyB0b3BUb21ic3RvbmVQYXJ0aXRpb25zTGFzdFVwZGF0ZTsKKyAgICBwdWJsaWMgZG91YmxlIGxvY2FsUmVhZFdyaXRlUmF0aW87CisgICAgcHVibGljIExvbmcgdHdjc0R1cmF0aW9uSW5NaWxsaXM7CisgICAgcHVibGljIFN0cmluZyB0d2NzOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvc3RhdHMvU3RhdHNUYWJsZUNvbXBhcmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1N0YXRzVGFibGVDb21wYXJhdG9yLmphdmEKaW5kZXggMTdiNWM2MS4uYTdkYWJiMiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvc3RhdHMvU3RhdHNUYWJsZUNvbXBhcmF0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9TdGF0c1RhYmxlQ29tcGFyYXRvci5qYXZhCkBAIC02NSw3ICs2NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBlbmRpbmdfZmx1c2hlcyIsICJwZXJjZW50X3JlcGFpcmVkIiwgInJlYWRfbGF0ZW5jeSIsICJyZWFkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwYWNlX3VzZWRfYnlfc25hcHNob3RzX3RvdGFsIiwgInNwYWNlX3VzZWRfbGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwYWNlX3VzZWRfdG90YWwiLCAic3N0YWJsZV9jb21wcmVzc2lvbl9yYXRpbyIsICJzc3RhYmxlX2NvdW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFibGVfbmFtZSIsICJ3cml0ZV9sYXRlbmN5IiwgIndyaXRlcyIgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFibGVfbmFtZSIsICJ3cml0ZV9sYXRlbmN5IiwgIndyaXRlcyIsICJtYXhfc3N0YWJsZV9zaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9jYWxfcmVhZF93cml0ZV9yYXRpbyIsICJ0d2NzX21heF9kdXJhdGlvbiJ9OwogCiAgICAgcHVibGljIFN0YXRzVGFibGVDb21wYXJhdG9yKFN0cmluZyBzb3J0S2V5LCBib29sZWFuIGh1bWFuUmVhZGFibGUpCiAgICAgewpAQCAtMjI5LDYgKzIzMCwxMCBAQAogICAgICAgICB7CiAgICAgICAgICAgICByZXN1bHQgPSBjb21wYXJlRG91YmxlcyhzdHgubG9jYWxXcml0ZUxhdGVuY3lNcywgc3R5LmxvY2FsV3JpdGVMYXRlbmN5TXMpOwogICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNvcnRLZXkuZXF1YWxzKCJsb2NhbF9yZWFkX3dyaXRlX3JhdGlvIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGNvbXBhcmVEb3VibGVzKHN0eC5sb2NhbFJlYWRXcml0ZVJhdGlvLCBzdHkubG9jYWxSZWFkV3JpdGVSYXRpbyk7CisgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoc29ydEtleS5lcXVhbHMoIm1heGltdW1fbGl2ZV9jZWxsc19wZXJfc2xpY2VfbGFzdF9maXZlX21pbnV0ZXMiKSkKICAgICAgICAgewogICAgICAgICAgICAgcmVzdWx0ID0gc2lnbiAqIExvbmcudmFsdWVPZihzdHgubWF4aW11bUxpdmVDZWxsc1BlclNsaWNlTGFzdEZpdmVNaW51dGVzKQpAQCAtMjk1LDYgKzMwMCwyMSBAQAogICAgICAgICB7CiAgICAgICAgICAgICByZXN1bHQgPSBjb21wYXJlRG91YmxlcyhzdHgucGVyY2VudFJlcGFpcmVkLCBzdHkucGVyY2VudFJlcGFpcmVkKTsKICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzb3J0S2V5LmVxdWFscygibWF4X3NzdGFibGVfc2l6ZSIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBzaWduICogc3R4Lm1heFNTVGFibGVTaXplLmNvbXBhcmVUbyhzdHkubWF4U1NUYWJsZVNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNvcnRLZXkuZXF1YWxzKCJ0d2NzX21heF9kdXJhdGlvbiIpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3R4LnR3Y3NEdXJhdGlvbkluTWlsbGlzICE9IG51bGwgJiYgc3R5LnR3Y3NEdXJhdGlvbkluTWlsbGlzID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNpZ247CisgICAgICAgICAgICBlbHNlIGlmIChzdHgudHdjc0R1cmF0aW9uSW5NaWxsaXMgPT0gbnVsbCAmJiBzdHkudHdjc0R1cmF0aW9uSW5NaWxsaXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2lnbiAqIC0xOworICAgICAgICAgICAgZWxzZSBpZiAoc3R4LnR3Y3NEdXJhdGlvbkluTWlsbGlzID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2lnbiAqIHN0eC50d2NzRHVyYXRpb25Jbk1pbGxpcy5jb21wYXJlVG8oc3R5LnR3Y3NEdXJhdGlvbkluTWlsbGlzKTsKKyAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChzb3J0S2V5LmVxdWFscygic3BhY2VfdXNlZF9ieV9zbmFwc2hvdHNfdG90YWwiKSkKICAgICAgICAgewogICAgICAgICAgICAgcmVzdWx0ID0gY29tcGFyZUZpbGVTaXplcyhzdHguc3BhY2VVc2VkQnlTbmFwc2hvdHNUb3RhbCwKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1RhYmxlU3RhdHNIb2xkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1RhYmxlU3RhdHNIb2xkZXIuamF2YQppbmRleCA2MDEzMmQxLi44MDY2MDYxMSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvc3RhdHMvVGFibGVTdGF0c0hvbGRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1RhYmxlU3RhdHNIb2xkZXIuamF2YQpAQCAtMjUsNyArMjUsMTIgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkFycmF5TGlzdE11bHRpbWFwOwogCiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5JbnN0YW5jZU5vdEZvdW5kRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnRpbWUuRHVyYXRpb25Gb3JtYXRVdGlsczsKKwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5UaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy4qOwpAQCAtMzMsNyArMzgsNyBAQAogcHVibGljIGNsYXNzIFRhYmxlU3RhdHNIb2xkZXIgaW1wbGVtZW50cyBTdGF0c0hvbGRlcgogewogICAgIHB1YmxpYyBmaW5hbCBMaXN0PFN0YXRzS2V5c3BhY2U+IGtleXNwYWNlczsKLSAgICBwdWJsaWMgZmluYWwgaW50IG51bWJlck9mVGFibGVzOworICAgIHB1YmxpYyBpbnQgbnVtYmVyT2ZUYWJsZXMgPSAwOwogICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGh1bWFuUmVhZGFibGU7CiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBzb3J0S2V5OwogICAgIHB1YmxpYyBmaW5hbCBpbnQgdG9wOwpAQCAtNDgsMTQgKzUzLDcgQEAKICAgICAgICAgdGhpcy5sb2NhdGlvbkNoZWNrID0gbG9jYXRpb25DaGVjazsKIAogICAgICAgICBpZiAoIXRoaXMuaXNUZXN0VGFibGVTdGF0c0hvbGRlcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm51bWJlck9mVGFibGVzID0gcHJvYmUuZ2V0TnVtYmVyT2ZUYWJsZXMoKTsKICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUtleXNwYWNlcyhwcm9iZSwgaWdub3JlLCB0YWJsZU5hbWVzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubnVtYmVyT2ZUYWJsZXMgPSAwOwotICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMjMsNiArMTIxLDggQEAKICAgICAgICAgbXBUYWJsZS5wdXQoIm9sZF9zc3RhYmxlX2NvdW50IiwgdGFibGUub2xkU1NUYWJsZUNvdW50KTsKICAgICAgICAgbXBUYWJsZS5wdXQoInNzdGFibGVzX2luX2VhY2hfbGV2ZWwiLCB0YWJsZS5zc3RhYmxlc0luRWFjaExldmVsKTsKICAgICAgICAgbXBUYWJsZS5wdXQoInNzdGFibGVfYnl0ZXNfaW5fZWFjaF9sZXZlbCIsIHRhYmxlLnNzdGFibGVCeXRlc0luRWFjaExldmVsKTsKKyAgICAgICAgbXBUYWJsZS5wdXQoIm1heF9zc3RhYmxlX3NpemUiLCB0YWJsZS5tYXhTU1RhYmxlU2l6ZSk7CisgICAgICAgIG1wVGFibGUucHV0KCJ0d2NzIiwgdGFibGUudHdjcyk7CiAgICAgICAgIG1wVGFibGUucHV0KCJzcGFjZV91c2VkX2xpdmUiLCB0YWJsZS5zcGFjZVVzZWRMaXZlKTsKICAgICAgICAgbXBUYWJsZS5wdXQoInNwYWNlX3VzZWRfdG90YWwiLCB0YWJsZS5zcGFjZVVzZWRUb3RhbCk7CiAgICAgICAgIG1wVGFibGUucHV0KCJzcGFjZV91c2VkX2J5X3NuYXBzaG90c190b3RhbCIsIHRhYmxlLnNwYWNlVXNlZEJ5U25hcHNob3RzVG90YWwpOwpAQCAtMTM5LDYgKzEzOSw3IEBACiAgICAgICAgIG1wVGFibGUucHV0KCJsb2NhbF9yZWFkX2xhdGVuY3lfbXMiLCBTdHJpbmcuZm9ybWF0KCIlMDEuM2YiLCB0YWJsZS5sb2NhbFJlYWRMYXRlbmN5TXMpKTsKICAgICAgICAgbXBUYWJsZS5wdXQoImxvY2FsX3dyaXRlX2NvdW50IiwgdGFibGUubG9jYWxXcml0ZUNvdW50KTsKICAgICAgICAgbXBUYWJsZS5wdXQoImxvY2FsX3dyaXRlX2xhdGVuY3lfbXMiLCBTdHJpbmcuZm9ybWF0KCIlMDEuM2YiLCB0YWJsZS5sb2NhbFdyaXRlTGF0ZW5jeU1zKSk7CisgICAgICAgIG1wVGFibGUucHV0KCJsb2NhbF9yZWFkX3dyaXRlX3JhdGlvIiwgU3RyaW5nLmZvcm1hdCgiJTAxLjVmIiwgdGFibGUubG9jYWxSZWFkV3JpdGVSYXRpbykpOwogICAgICAgICBtcFRhYmxlLnB1dCgicGVuZGluZ19mbHVzaGVzIiwgdGFibGUucGVuZGluZ0ZsdXNoZXMpOwogICAgICAgICBtcFRhYmxlLnB1dCgicGVyY2VudF9yZXBhaXJlZCIsIHRhYmxlLnBlcmNlbnRSZXBhaXJlZCk7CiAgICAgICAgIG1wVGFibGUucHV0KCJieXRlc19yZXBhaXJlZCIsIHRhYmxlLmJ5dGVzUmVwYWlyZWQpOwpAQCAtMjA1LDYgKzIwNiw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBudW1iZXJPZlRhYmxlcyA9IHNlbGVjdGVkVGFibGVNYmVhbnMuc2l6ZSgpOworCiAgICAgICAgIC8vIG1ha2Ugc3VyZSBhbGwgc3BlY2lmaWVkIGtleXNwYWNlIGFuZCB0YWJsZXMgZXhpc3QKICAgICAgICAgZmlsdGVyLnZlcmlmeUtleXNwYWNlcyhwcm9iZS5nZXRLZXlzcGFjZXMoKSk7CiAgICAgICAgIGZpbHRlci52ZXJpZnlUYWJsZXMoKTsKQEAgLTIyNyw2ICsyMzAsOCBAQAogICAgICAgICAgICAgICAgIHN0YXRzVGFibGUuaXNJbmRleCA9IHRhYmxlTmFtZS5jb250YWlucygiLiIpOwogICAgICAgICAgICAgICAgIHN0YXRzVGFibGUuc3N0YWJsZUNvdW50ID0gcHJvYmUuZ2V0Q29sdW1uRmFtaWx5TWV0cmljKGtleXNwYWNlTmFtZSwgdGFibGVOYW1lLCAiTGl2ZVNTVGFibGVDb3VudCIpOwogICAgICAgICAgICAgICAgIHN0YXRzVGFibGUub2xkU1NUYWJsZUNvdW50ID0gcHJvYmUuZ2V0Q29sdW1uRmFtaWx5TWV0cmljKGtleXNwYWNlTmFtZSwgdGFibGVOYW1lLCAiT2xkVmVyc2lvblNTVGFibGVDb3VudCIpOworICAgICAgICAgICAgICAgIExvbmcgc3N0YWJsZVNpemUgPSAoTG9uZykgcHJvYmUuZ2V0Q29sdW1uRmFtaWx5TWV0cmljKGtleXNwYWNlTmFtZSwgdGFibGVOYW1lLCAiTWF4U1NUYWJsZVNpemUiKTsKKyAgICAgICAgICAgICAgICBzdGF0c1RhYmxlLm1heFNTVGFibGVTaXplID0gc3N0YWJsZVNpemUgPT0gbnVsbCA/IDAgOiBzc3RhYmxlU2l6ZTsKIAogICAgICAgICAgICAgICAgIGludFtdIGxldmVsZWRTU3RhYmxlcyA9IHRhYmxlLmdldFNTVGFibGVDb3VudFBlckxldmVsKCk7CiAgICAgICAgICAgICAgICAgaWYgKGxldmVsZWRTU3RhYmxlcyAhPSBudWxsKQpAQCAtMjQzLDYgKzI0OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0c1RhYmxlLnNzdGFibGVzSW5FYWNoTGV2ZWwuYWRkKGNvdW50ICsgKChjb3VudCA+IG1heENvdW50KSA/ICIvIiArIG1heENvdW50IDogIiIpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0c1RhYmxlLnNzdGFibGVDb3VudFBlclRXQ1NCdWNrZXQgPSB0YWJsZS5nZXRTU1RhYmxlQ291bnRQZXJUV0NTQnVja2V0KCk7CiAKICAgICAgICAgICAgICAgICBsb25nW10gbGV2ZWxlZFNTVGFibGVzQnl0ZXMgPSB0YWJsZS5nZXRQZXJMZXZlbFNpemVCeXRlcygpOwogICAgICAgICAgICAgICAgIGlmIChsZXZlbGVkU1NUYWJsZXNCeXRlcyAhPSBudWxsKQpAQCAtMjkwLDYgKzI5Niw5IEBACiAgICAgICAgICAgICAgICAgc3RhdHNUYWJsZS5zcGFjZVVzZWRMaXZlID0gZm9ybWF0KChMb25nKSBwcm9iZS5nZXRDb2x1bW5GYW1pbHlNZXRyaWMoa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsICJMaXZlRGlza1NwYWNlVXNlZCIpLCBodW1hblJlYWRhYmxlKTsKICAgICAgICAgICAgICAgICBzdGF0c1RhYmxlLnNwYWNlVXNlZFRvdGFsID0gZm9ybWF0KChMb25nKSBwcm9iZS5nZXRDb2x1bW5GYW1pbHlNZXRyaWMoa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsICJUb3RhbERpc2tTcGFjZVVzZWQiKSwgaHVtYW5SZWFkYWJsZSk7CiAgICAgICAgICAgICAgICAgc3RhdHNUYWJsZS5zcGFjZVVzZWRCeVNuYXBzaG90c1RvdGFsID0gZm9ybWF0KChMb25nKSBwcm9iZS5nZXRDb2x1bW5GYW1pbHlNZXRyaWMoa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsICJTbmFwc2hvdHNTaXplIiksIGh1bWFuUmVhZGFibGUpOworCisgICAgICAgICAgICAgICAgbWF5YmVBZGRUV0NTV2luZG93V2l0aE1heER1cmF0aW9uKHN0YXRzVGFibGUsIHByb2JlLCBrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZSk7CisKICAgICAgICAgICAgICAgICBpZiAob2ZmSGVhcFNpemUgIT0gbnVsbCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHN0YXRzVGFibGUub2ZmSGVhcFVzZWQgPSB0cnVlOwpAQCAtMzMwLDYgKzMzOSw5IEBACiAKICAgICAgICAgICAgICAgICBkb3VibGUgbG9jYWxXcml0ZUxhdGVuY3kgPSAoKENhc3NhbmRyYU1ldHJpY3NSZWdpc3RyeS5KbXhUaW1lck1CZWFuKSBwcm9iZS5nZXRDb2x1bW5GYW1pbHlNZXRyaWMoa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsICJXcml0ZUxhdGVuY3kiKSkuZ2V0TWVhbigpIC8gMTAwMDsKICAgICAgICAgICAgICAgICBkb3VibGUgbG9jYWxXTGF0ZW5jeSA9IGxvY2FsV3JpdGVMYXRlbmN5ID4gMCA/IGxvY2FsV3JpdGVMYXRlbmN5IDogRG91YmxlLk5hTjsKKworICAgICAgICAgICAgICAgIHN0YXRzVGFibGUubG9jYWxSZWFkV3JpdGVSYXRpbyA9IHN0YXRzVGFibGUubG9jYWxXcml0ZUNvdW50ID4gMCA/IHN0YXRzVGFibGUubG9jYWxSZWFkQ291bnQgLyAoZG91YmxlKSBzdGF0c1RhYmxlLmxvY2FsV3JpdGVDb3VudCA6IDA7CisKICAgICAgICAgICAgICAgICBzdGF0c1RhYmxlLmxvY2FsV3JpdGVMYXRlbmN5TXMgPSBsb2NhbFdMYXRlbmN5OwogICAgICAgICAgICAgICAgIHN0YXRzVGFibGUucGVuZGluZ0ZsdXNoZXMgPSBwcm9iZS5nZXRDb2x1bW5GYW1pbHlNZXRyaWMoa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsICJQZW5kaW5nRmx1c2hlcyIpOwogCkBAIC0zNzksNiArMzkxLDI3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgbWF5YmVBZGRUV0NTV2luZG93V2l0aE1heER1cmF0aW9uKFN0YXRzVGFibGUgc3RhdHNUYWJsZSwgTm9kZVByb2JlIHByb2JlLCBTdHJpbmcga2V5c3BhY2VOYW1lLCBTdHJpbmcgdGFibGVOYW1lKQorICAgIHsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBjb21wYWN0aW9uUGFyYW1ldGVycyA9IHByb2JlLmdldENmc1Byb3h5KHN0YXRzVGFibGUua2V5c3BhY2VOYW1lLCBzdGF0c1RhYmxlLnRhYmxlTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbXBhY3Rpb25QYXJhbWV0ZXJzKCk7CisKKyAgICAgICAgaWYgKGNvbXBhY3Rpb25QYXJhbWV0ZXJzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgU3RyaW5nIGNvbXBhY3RvciA9IGNvbXBhY3Rpb25QYXJhbWV0ZXJzLmdldCgiY2xhc3MiKTsKKworICAgICAgICBpZiAoY29tcGFjdG9yID09IG51bGwgfHwgIWNvbXBhY3Rvci5lbmRzV2l0aChUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzLmdldFNpbXBsZU5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgU3RyaW5nIHVuaXQgPSBjb21wYWN0aW9uUGFyYW1ldGVycy5nZXQoVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuQ09NUEFDVElPTl9XSU5ET1dfVU5JVF9LRVkpOworICAgICAgICBTdHJpbmcgc2l6ZSA9IGNvbXBhY3Rpb25QYXJhbWV0ZXJzLmdldChUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5DT01QQUNUSU9OX1dJTkRPV19TSVpFX0tFWSk7CisKKyAgICAgICAgc3RhdHNUYWJsZS50d2NzRHVyYXRpb25Jbk1pbGxpcyA9IChMb25nKSBwcm9iZS5nZXRDb2x1bW5GYW1pbHlNZXRyaWMoa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsICJNYXhTU1RhYmxlRHVyYXRpb24iKTsKKyAgICAgICAgU3RyaW5nIG1heER1cmF0aW9uID0gbWlsbGlzVG9EdXJhdGlvbihzdGF0c1RhYmxlLnR3Y3NEdXJhdGlvbkluTWlsbGlzKTsKKyAgICAgICAgc3RhdHNUYWJsZS50d2NzID0gU3RyaW5nLmZvcm1hdCgiJXMgJXMsIG1heCBkdXJhdGlvbjogJXMiLCBzaXplLCB1bml0LCBtYXhEdXJhdGlvbik7CisgICAgfQorCiAgICAgcHJpdmF0ZSBTdHJpbmcgZm9ybWF0KGxvbmcgYnl0ZXMsIGJvb2xlYW4gaHVtYW5SZWFkYWJsZSkKICAgICB7CiAgICAgICAgIHJldHVybiBodW1hblJlYWRhYmxlID8gRmlsZVV0aWxzLnN0cmluZ2lmeUZpbGVTaXplKGJ5dGVzKSA6IExvbmcudG9TdHJpbmcoYnl0ZXMpOwpAQCAtNDAwLDYgKzQzMywxMSBAQAogICAgICAgICByZXR1cm4gZGYuZm9ybWF0KG5ldyBEYXRlKG1pbGxpcykpOwogICAgIH0KIAorICAgIHByaXZhdGUgU3RyaW5nIG1pbGxpc1RvRHVyYXRpb24obG9uZyBtaWxsaXMpCisgICAgeworICAgICAgICByZXR1cm4gRHVyYXRpb25Gb3JtYXRVdGlscy5mb3JtYXREdXJhdGlvbldvcmRzKG1pbGxpcywgdHJ1ZSwgdHJ1ZSk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogU29ydCBhbmQgZmlsdGVyIHRoaXMgVGFibGVTdGF0SG9sZGVyJ3MgdGFibGVzIGFzIHNwZWNpZmllZCBieSBpdHMgc29ydEtleSBhbmQgdG9wIGF0dHJpYnV0ZXMuCiAgICAgICovCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9UYWJsZVN0YXRzUHJpbnRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvc3RhdHMvVGFibGVTdGF0c1ByaW50ZXIuamF2YQppbmRleCA3ZjE3YzIxLi5jMzBhYjZkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9UYWJsZVN0YXRzUHJpbnRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1RhYmxlU3RhdHNQcmludGVyLmphdmEKQEAgLTUwLDYgKzUwLDkgQEAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHByaW50KFRhYmxlU3RhdHNIb2xkZXIgZGF0YSwgUHJpbnRTdHJlYW0gb3V0KQogICAgICAgICB7CisgICAgICAgICAgICBpZiAoZGF0YS5udW1iZXJPZlRhYmxlcyA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKwogICAgICAgICAgICAgb3V0LnByaW50bG4oIlRvdGFsIG51bWJlciBvZiB0YWJsZXM6ICIgKyBkYXRhLm51bWJlck9mVGFibGVzKTsKICAgICAgICAgICAgIG91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tIik7CiAKQEAgLTU3LDcgKzYwLDcgQEAKICAgICAgICAgICAgIGZvciAoU3RhdHNLZXlzcGFjZSBrZXlzcGFjZSA6IGtleXNwYWNlcykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBwcmludCBlYWNoIGtleXNwYWNlJ3MgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiS2V5c3BhY2UgOiAiICsga2V5c3BhY2UubmFtZSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIktleXNwYWNlOiAiICsga2V5c3BhY2UubmFtZSk7CiAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIlx0UmVhZCBDb3VudDogIiArIGtleXNwYWNlLnJlYWRDb3VudCk7CiAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIlx0UmVhZCBMYXRlbmN5OiAiICsga2V5c3BhY2UucmVhZExhdGVuY3koKSArICIgbXMiKTsKICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiXHRXcml0ZSBDb3VudDogIiArIGtleXNwYWNlLndyaXRlQ291bnQpOwpAQCAtNjYsNiArNjksOSBAQAogCiAgICAgICAgICAgICAgICAgLy8gcHJpbnQgZWFjaCB0YWJsZSdzIGluZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgTGlzdDxTdGF0c1RhYmxlPiB0YWJsZXMgPSBrZXlzcGFjZS50YWJsZXM7CisgICAgICAgICAgICAgICAgaWYgKHRhYmxlcy5zaXplKCkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKICAgICAgICAgICAgICAgICBmb3IgKFN0YXRzVGFibGUgdGFibGUgOiB0YWJsZXMpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwcmludFN0YXRzVGFibGUodGFibGUsIHRhYmxlLnRhYmxlTmFtZSwgIlx0XHQiLCBvdXQpOwpAQCAtNzksNiArODUsOSBAQAogICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIlRhYmxlIiArICh0YWJsZS5pc0luZGV4ID8gIiAoaW5kZXgpOiAiIDogIjogIikgKyB0YWJsZURpc3BsYXlOYW1lKTsKICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJTU1RhYmxlIGNvdW50OiAiICsgdGFibGUuc3N0YWJsZUNvdW50KTsKICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJPbGQgU1NUYWJsZSBjb3VudDogIiArIHRhYmxlLm9sZFNTVGFibGVDb3VudCk7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiTWF4IFNTVGFibGUgc2l6ZTogIiArIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KHRhYmxlLm1heFNTVGFibGVTaXplKSk7CisgICAgICAgICAgICBpZiAodGFibGUudHdjcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJTU1RhYmxlcyBUaW1lIFdpbmRvdzogIiArIHRhYmxlLnR3Y3MpOwogICAgICAgICAgICAgaWYgKHRhYmxlLmlzTGV2ZWxlZFNzdGFibGUpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIlNTVGFibGVzIGluIGVhY2ggbGV2ZWw6IFsiICsgU3RyaW5nLmpvaW4oIiwgIiwKQEAgLTkzLDcgKzEwMiw3IEBACiAKICAgICAgICAgICAgIGlmICh0YWJsZS5vZmZIZWFwVXNlZCkKICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiT2ZmIGhlYXAgbWVtb3J5IHVzZWQgKHRvdGFsKTogIiArIHRhYmxlLm9mZkhlYXBNZW1vcnlVc2VkVG90YWwpOwotICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIlNTVGFibGUgQ29tcHJlc3Npb24gUmF0aW86ICIgKyB0YWJsZS5zc3RhYmxlQ29tcHJlc3Npb25SYXRpbyk7CisgICAgICAgICAgICBvdXQucHJpbnRmKGluZGVudCArICJTU1RhYmxlIENvbXByZXNzaW9uIFJhdGlvOiAlMDEuNWYlbiIsIHRhYmxlLnNzdGFibGVDb21wcmVzc2lvblJhdGlvKTsKICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJOdW1iZXIgb2YgcGFydGl0aW9ucyAoZXN0aW1hdGUpOiAiICsgdGFibGUubnVtYmVyT2ZQYXJ0aXRpb25zRXN0aW1hdGUpOwogICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIk1lbXRhYmxlIGNlbGwgY291bnQ6ICIgKyB0YWJsZS5tZW10YWJsZUNlbGxDb3VudCk7CiAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiTWVtdGFibGUgZGF0YSBzaXplOiAiICsgdGFibGUubWVtdGFibGVEYXRhU2l6ZSk7CkBAIC0xMDUsNiArMTE0LDkgQEAKICAgICAgICAgICAgIG91dC5wcmludGYoaW5kZW50ICsgIkxvY2FsIHJlYWQgbGF0ZW5jeTogJTAxLjNmIG1zJW4iLCB0YWJsZS5sb2NhbFJlYWRMYXRlbmN5TXMpOwogICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIkxvY2FsIHdyaXRlIGNvdW50OiAiICsgdGFibGUubG9jYWxXcml0ZUNvdW50KTsKICAgICAgICAgICAgIG91dC5wcmludGYoaW5kZW50ICsgIkxvY2FsIHdyaXRlIGxhdGVuY3k6ICUwMS4zZiBtcyVuIiwgdGFibGUubG9jYWxXcml0ZUxhdGVuY3lNcyk7CisKKyAgICAgICAgICAgIG91dC5wcmludGYoaW5kZW50ICsgIkxvY2FsIHJlYWQvd3JpdGUgcmF0aW86ICUwMS41ZiVuIiwgdGFibGUubG9jYWxSZWFkV3JpdGVSYXRpbyk7CisKICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJQZW5kaW5nIGZsdXNoZXM6ICIgKyB0YWJsZS5wZW5kaW5nRmx1c2hlcyk7CiAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiUGVyY2VudCByZXBhaXJlZDogIiArIHRhYmxlLnBlcmNlbnRSZXBhaXJlZCk7CiAKQEAgLTE2NCw2ICsxNzYsMTAgQEAKICAgICAgICAgcHVibGljIHZvaWQgcHJpbnQoVGFibGVTdGF0c0hvbGRlciBkYXRhLCBQcmludFN0cmVhbSBvdXQpCiAgICAgICAgIHsKICAgICAgICAgICAgIExpc3Q8U3RhdHNUYWJsZT4gdGFibGVzID0gZGF0YS5nZXRTb3J0ZWRGaWx0ZXJlZFRhYmxlcygpOworCisgICAgICAgICAgICBpZiAodGFibGVzLnNpemUoKSA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKwogICAgICAgICAgICAgU3RyaW5nIHRvdGFsVGFibGVzU3VtbWFyeSA9IFN0cmluZy5mb3JtYXQoIlRvdGFsIG51bWJlciBvZiB0YWJsZXM6ICVkIiwgZGF0YS5udW1iZXJPZlRhYmxlcyk7CiAgICAgICAgICAgICBpZiAoZGF0YS50b3AgPiAwKQogICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhY2luZy9UcmFjZVN0YXRlSW1wbC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhY2luZy9UcmFjZVN0YXRlSW1wbC5qYXZhCmluZGV4IGY4NjkxZWUuLjExMzQyMGQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYWNpbmcvVHJhY2VTdGF0ZUltcGwuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFjaW5nL1RyYWNlU3RhdGVJbXBsLmphdmEKQEAgLTI4LDYgKzI4LDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuU3RhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5NdXRhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLk92ZXJsb2FkZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CkBAIC01MCw4ICs1MSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRyYWNlU3RhdGVJbXBsLmNsYXNzKTsKIAogICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHB1YmxpYyBzdGF0aWMgaW50IFdBSVRfRk9SX1BFTkRJTkdfRVZFTlRTX1RJTUVPVVRfU0VDUyA9Ci0gICAgICBJbnRlZ2VyLnBhcnNlSW50KFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLndhaXRfZm9yX3RyYWNpbmdfZXZlbnRzX3RpbWVvdXRfc2VjcyIsICIwIikpOworICAgIHB1YmxpYyBzdGF0aWMgaW50IFdBSVRfRk9SX1BFTkRJTkdfRVZFTlRTX1RJTUVPVVRfU0VDUyA9IENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5XQUlUX0ZPUl9UUkFDSU5HX0VWRU5UU19USU1FT1VUX1NFQ1MuZ2V0SW50KCk7CiAKICAgICBwcml2YXRlIGZpbmFsIFNldDxGdXR1cmU8Pz4+IHBlbmRpbmdGdXR1cmVzID0gQ29uY3VycmVudEhhc2hNYXAubmV3S2V5U2V0KCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYWNpbmcvVHJhY2luZy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhY2luZy9UcmFjaW5nLmphdmEKaW5kZXggNWM4MjBkYi4uNzNjZjJlYiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhY2luZy9UcmFjaW5nLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhY2luZy9UcmFjaW5nLmphdmEKQEAgLTQyLDYgKzQyLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5KVk1TdGFiaWxpdHlJbnNwZWN0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DVVNUT01fVFJBQ0lOR19DTEFTUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJRDsKIAogLyoqCkBAIC0xMTAsMTMgKzExMSwxNCBAQAogICAgIHN0YXRpYwogICAgIHsKICAgICAgICAgVHJhY2luZyB0cmFjaW5nID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGN1c3RvbVRyYWNpbmdDbGFzcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmN1c3RvbV90cmFjaW5nX2NsYXNzIik7CisgICAgICAgIFN0cmluZyBjdXN0b21UcmFjaW5nQ2xhc3MgPSBDVVNUT01fVFJBQ0lOR19DTEFTUy5nZXRTdHJpbmcoKTsKICAgICAgICAgaWYgKG51bGwgIT0gY3VzdG9tVHJhY2luZ0NsYXNzKQogICAgICAgICB7CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0cmFjaW5nID0gRkJVdGlsaXRpZXMuY29uc3RydWN0KGN1c3RvbVRyYWNpbmdDbGFzcywgIlRyYWNpbmciKTsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiVXNpbmcge30gYXMgdHJhY2luZyBxdWVyaWVzIChhcyByZXF1ZXN0ZWQgd2l0aCAtRGNhc3NhbmRyYS5jdXN0b21fdHJhY2luZ19jbGFzcykiLCBjdXN0b21UcmFjaW5nQ2xhc3MpOworICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJVc2luZyB0aGUge30gY2xhc3MgdG8gdHJhY2UgcXVlcmllcyAoYXMgcmVxdWVzdGVkIGJ5IHRoZSB7fSBzeXN0ZW0gcHJvcGVydHkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21UcmFjaW5nQ2xhc3MsIENVU1RPTV9UUkFDSU5HX0NMQVNTLmdldEtleSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9DQlV0aWwuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9DQlV0aWwuamF2YQppbmRleCA2Y2FiNjM4Li5kNDdmMGNlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvQ0JVdGlsLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L0NCVXRpbC5qYXZhCkBAIC0zMiwyMCArMzIsMjEgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5VVUlEOwotCiBpbXBvcnQgaW8ubmV0dHkuYnVmZmVyLkJ5dGVCdWY7CiBpbXBvcnQgaW8ubmV0dHkuYnVmZmVyLkJ5dGVCdWZBbGxvY2F0b3I7CiBpbXBvcnQgaW8ubmV0dHkuYnVmZmVyLkJ5dGVCdWZVdGlsOwogaW1wb3J0IGlvLm5ldHR5LmJ1ZmZlci5Qb29sZWRCeXRlQnVmQWxsb2NhdG9yOwogaW1wb3J0IGlvLm5ldHR5LmJ1ZmZlci5VbnBvb2xlZEJ5dGVCdWZBbGxvY2F0b3I7CiBpbXBvcnQgaW8ubmV0dHkudXRpbC5jb25jdXJyZW50LkZhc3RUaHJlYWRMb2NhbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbnNpc3RlbmN5TGV2ZWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVVVJREdlbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuTWVtb3J5VXRpbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9ORVRUWV9VU0VfSEVBUF9BTExPQ0FUT1I7CiAKIC8qKgogICogQnl0ZUJ1ZiB1dGlsaXR5IG1ldGhvZHMuCkBAIC01Niw3ICs1Nyw3IEBACiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDQlV0aWwKIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gVVNFX0hFQVBfQUxMT0NBVE9SID0gQm9vbGVhbi5nZXRCb29sZWFuKENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAibmV0dHlfdXNlX2hlYXBfYWxsb2NhdG9yIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9IRUFQX0FMTE9DQVRPUiA9IENBU1NBTkRSQV9ORVRUWV9VU0VfSEVBUF9BTExPQ0FUT1IuZ2V0Qm9vbGVhbigpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQnl0ZUJ1ZkFsbG9jYXRvciBhbGxvY2F0b3IgPSBVU0VfSEVBUF9BTExPQ0FUT1IgPyBuZXcgVW5wb29sZWRCeXRlQnVmQWxsb2NhdG9yKGZhbHNlKSA6IG5ldyBQb29sZWRCeXRlQnVmQWxsb2NhdG9yKHRydWUpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVVUlEX1NJWkUgPSAxNjsKIApAQCAtNjksNiArNzAsMTUgQEAKICAgICAgICAgfQogICAgIH07CiAKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBGYXN0VGhyZWFkTG9jYWw8Qnl0ZUJ1ZmZlcj4gbG9jYWxEaXJlY3RCdWZmZXIgPSBuZXcgRmFzdFRocmVhZExvY2FsPEJ5dGVCdWZmZXI+KCkKKyAgICB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciBpbml0aWFsVmFsdWUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTWVtb3J5VXRpbC5nZXRIb2xsb3dEaXJlY3RCeXRlQnVmZmVyKCk7CisgICAgICAgIH0KKyAgICB9OworCiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgRmFzdFRocmVhZExvY2FsPENoYXJCdWZmZXI+IFRMX0NIQVJfQlVGRkVSID0gbmV3IEZhc3RUaHJlYWRMb2NhbDw+KCk7CiAKICAgICBwcml2YXRlIENCVXRpbCgpIHt9CkBAIC00NzgsNyArNDg4LDM1IEBACiAgICAgICAgIGNiLndyaXRlSW50KHJlbWFpbmluZyk7CiAKICAgICAgICAgaWYgKHJlbWFpbmluZyA+IDApCi0gICAgICAgICAgICBjYi53cml0ZUJ5dGVzKGJ5dGVzLmR1cGxpY2F0ZSgpKTsKKyAgICAgICAgICAgIGFkZEJ5dGVzKGJ5dGVzLCBjYik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEJ5dGVzKEJ5dGVCdWZmZXIgc3JjLCBCeXRlQnVmIGRlc3QpCisgICAgeworICAgICAgICBpZiAoc3JjLnJlbWFpbmluZygpID09IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaW50IGxlbmd0aCA9IHNyYy5yZW1haW5pbmcoKTsKKworICAgICAgICBpZiAoc3JjLmhhc0FycmF5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEhlYXAgYnVmZmVycyBhcmUgY29waWVkIHVzaW5nIGEgcmF3IGFycmF5IGluc3RlYWQgb2Ygc2hhcmVkIGhlYXAgYnVmZmVyIGFuZCBNZW1vcnlVdGlsLnVuc2FmZSB0byBhdm9pZCBhIENNUyBidWcsIHdoaWNoIGNhdXNlcyB0aGUgSlZNIHRvIGNyYXNoIHdpdGggdGhlIGZvbGx3aW5nOgorICAgICAgICAgICAgLy8gIyBQcm9ibGVtYXRpYyBmcmFtZToKKyAgICAgICAgICAgIC8vICMgViAgW2xpYmp2bS5keWxpYisweDYzZTg1OF0gIHZvaWQgUGFyU2NhbkNsb3N1cmU6OmRvX29vcF93b3JrPHVuc2lnbmVkIGludD4odW5zaWduZWQgaW50KiwgYm9vbCwgYm9vbCkrMHg5NAorICAgICAgICAgICAgLy8gTW9yZSBkZXRhaWxzIGNhbiBiZSBmb3VuZCBoZXJlOiBodHRwczovL2J1Z3Mub3Blbmpkay5vcmcvYnJvd3NlL0pESy04MjIyNzk4CisgICAgICAgICAgICBieXRlW10gYXJyYXkgPSBzcmMuYXJyYXkoKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlcyhhcnJheSwgc3JjLmFycmF5T2Zmc2V0KCkgKyBzcmMucG9zaXRpb24oKSwgbGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzcmMuaXNEaXJlY3QoKSkKKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBsb2NhbCA9IGdldExvY2FsRGlyZWN0QnVmZmVyKCk7CisgICAgICAgICAgICBNZW1vcnlVdGlsLmR1cGxpY2F0ZURpcmVjdEJ5dGVCdWZmZXIoc3JjLCBsb2NhbCk7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZXMobG9jYWwpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGVzKHNyYy5kdXBsaWNhdGUoKSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGludCBzaXplT2ZWYWx1ZShieXRlW10gYnl0ZXMpCkBAIC02MTQsNCArNjUyLDggQEAKICAgICAgICAgcmV0dXJuIGJ5dGVzOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIEJ5dGVCdWZmZXIgZ2V0TG9jYWxEaXJlY3RCdWZmZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsRGlyZWN0QnVmZmVyLmdldCgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9EaXNwYXRjaGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvRGlzcGF0Y2hlci5qYXZhCmluZGV4IGRhNzljM2QuLmYyMWFjYzIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9EaXNwYXRjaGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L0Rpc3BhdGNoZXIuamF2YQpAQCAtMjMsMTYgKzIzLDE4IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DbGllbnRNZXRyaWNzOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBpby5uZXR0eS5jaGFubmVsLkNoYW5uZWw7CiBpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5FdmVudExvb3A7CiBpbXBvcnQgaW8ubmV0dHkudXRpbC5BdHRyaWJ1dGVLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5EZWJ1Z2dhYmxlVGFzay5SdW5uYWJsZURlYnVnZ2FibGVUYXNrOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuTG9jYWxBd2FyZUV4ZWN1dG9yUGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2xpZW50TWV0cmljczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuRnJhbWVFbmNvZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2xpZW50V2FybjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlF1ZXJ5U3RhdGU7CkBAIC00MiwxOSArNDQsMzkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQubWVzc2FnZXMuRXJyb3JNZXNzYWdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5tZXNzYWdlcy5FdmVudE1lc3NhZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSlZNU3RhYmlsaXR5SW5zcGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk1vbm90b25pY0Nsb2NrOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk5vU3BhbUxvZ2dlcjsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LlNoYXJlZEV4ZWN1dG9yUG9vbC5TSEFSRUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKIAogcHVibGljIGNsYXNzIERpc3BhdGNoZXIKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRGlzcGF0Y2hlci5jbGFzcyk7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxBd2FyZUV4ZWN1dG9yUGx1cyByZXF1ZXN0RXhlY3V0b3IgPSBTSEFSRUQubmV3RXhlY3V0b3IoRGF0YWJhc2VEZXNjcmlwdG9yLmdldE5hdGl2ZVRyYW5zcG9ydE1heFRocmVhZHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3I6OnNldE5hdGl2ZVRyYW5zcG9ydE1heFRocmVhZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hdGl2ZS1UcmFuc3BvcnQtUmVxdWVzdHMiKTsKKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHN0YXRpYyBmaW5hbCBMb2NhbEF3YXJlRXhlY3V0b3JQbHVzIHJlcXVlc3RFeGVjdXRvciA9IFNIQVJFRC5uZXdFeGVjdXRvcihEYXRhYmFzZURlc2NyaXB0b3IuZ2V0TmF0aXZlVHJhbnNwb3J0TWF4VGhyZWFkcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3I6OnNldE5hdGl2ZVRyYW5zcG9ydE1heFRocmVhZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmF0aXZlLVRyYW5zcG9ydC1SZXF1ZXN0cyIpOworCisgICAgLyoqIENBU1NBTkRSQS0xNzgxMjogUmF0ZS1saW1pdCBuZXcgY2xpZW50IGNvbm5lY3Rpb24gc2V0dXAgdG8gYXZvaWQgb3ZlcndoZWxtaW5nIGR1cmluZyBiY3J5cHQKKyAgICAgKgorICAgICAqIGF1dGhFeGVjdXRvciBpcyBhIHNlcGFyYXRlIHRocmVhZCBwb29sIGZvciBoYW5kbGluZyByZXF1ZXN0cyBvbiBjb25uZWN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgYXV0aGVudGljYXRlZC4KKyAgICAgKiBDYWxscyB0byBBVVRIRU5USUNBVEUgY2FuIGJlIGV4cGVuc2l2ZSBpZiB0aGUgbnVtYmVyIG9mIHJvdW5kcyBmb3IgYmNyeXB0IGlzIGNvbmZpZ3VyZWQgdG8gYSBoaWdoIHZhbHVlLAorICAgICAqIHNvIGR1cmluZyBhIGNvbm5lY3Rpb24gc3Rvcm0gY2hlY2tpbmcgdGhlIHBhc3N3b3JkIGhhc2ggd291bGQgc3RhcnZlIGV4aXN0aW5nIGNvbm5lY3RlZCBjbGllbnRzIGZvciBDUFUgYW5kCisgICAgICogdHJpZ2dlciB0aW1lb3V0cyBpZiBvbiB0aGUgc2FtZSB0aHJlYWQgcG9vbCBhcyBzdGFuZGFyZCByZXF1ZXN0cy4KKyAgICAgKgorICAgICAqIE1vdmluZyBhdXRoZW50aWNhdGlvbiByZXF1ZXN0cyB0byBhIHNtYWxsLCBzZXBhcmF0ZSBwb29sIHByZXZlbnRzIHN0YXJ2YXRpb24gaGFuZGxpbmcgYWxsIG90aGVyCisgICAgICogcmVxdWVzdHMuIElmIHRoZSBhdXRoRXhlY3V0b3IgcG9vbCBiYWNrcyB1cCwgaXQgbWF5IGNhdXNlIGF1dGhlbnRpY2F0aW9uIHRpbWVvdXRzIGJ1dCB0aGUgY2xpZW50cyBzaG91bGQKKyAgICAgKiBiYWNrIG9mZiBhbmQgcmV0cnkgd2hpbGUgdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbSBjb250aW51ZXMgdG8gbWFrZSBwcm9ncmVzcy4KKyAgICAgKgorICAgICAqIFNldHRpbmcgbGVzcyB0aGFuIDEgd2lsbCBzZXJ2aWNlIGF1dGggcmVxdWVzdHMgb24gdGhlIHN0YW5kYXJkIHtAbGluayBEaXNwYXRjaGVyI3JlcXVlc3RFeGVjdXRvcn0KKyAgICAgKi8KKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBzdGF0aWMgZmluYWwgTG9jYWxBd2FyZUV4ZWN1dG9yUGx1cyBhdXRoRXhlY3V0b3IgPSBTSEFSRUQubmV3RXhlY3V0b3IoTWF0aC5tYXgoMSwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldE5hdGl2ZVRyYW5zcG9ydE1heEF1dGhUaHJlYWRzKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3I6OnNldE5hdGl2ZVRyYW5zcG9ydE1heEF1dGhUaHJlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hdGl2ZS1UcmFuc3BvcnQtQXV0aC1SZXF1ZXN0cyIpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uY3VycmVudE1hcDxFdmVudExvb3AsIEZsdXNoZXI+IGZsdXNoZXJMb29rdXAgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOwogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiB1c2VMZWdhY3lGbHVzaGVyOwpAQCAtNzksMTcgKzEwMSw2NyBAQAogCiAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2goQ2hhbm5lbCBjaGFubmVsLCBNZXNzYWdlLlJlcXVlc3QgcmVxdWVzdCwgRmx1c2hJdGVtQ29udmVydGVyIGZvckZsdXNoZXIsIE92ZXJsb2FkIGJhY2twcmVzc3VyZSkKICAgICB7Ci0gICAgICAgIHJlcXVlc3RFeGVjdXRvci5zdWJtaXQoKCkgLT4gcHJvY2Vzc1JlcXVlc3QoY2hhbm5lbCwgcmVxdWVzdCwgZm9yRmx1c2hlciwgYmFja3ByZXNzdXJlKSk7CisgICAgICAgIC8vIGlmIG5hdGl2ZV90cmFuc3BvcnRfbWF4X2F1dGhfdGhyZWFkcyBpcyA8IDEsIGRvbid0IGRlbGVnYXRlIHRvIG5ldyBwb29sIG9uIGF1dGggbWVzc2FnZXMKKyAgICAgICAgYm9vbGVhbiBpc0F1dGhRdWVyeSA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXROYXRpdmVUcmFuc3BvcnRNYXhBdXRoVGhyZWFkcygpID4gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcXVlc3QudHlwZSA9PSBNZXNzYWdlLlR5cGUuQVVUSF9SRVNQT05TRSB8fCByZXF1ZXN0LnR5cGUgPT0gTWVzc2FnZS5UeXBlLkNSRURFTlRJQUxTKTsKKworICAgICAgICAvLyBJbXBvcnRhbnRseSwgdGhlIGF1dGhFeGVjdXRvciB3aWxsIGhhbmRsZSB0aGUgQVVUSEVOVElDQVRFIG1lc3NhZ2Ugd2hpY2ggbWF5IGJlIENQVSBpbnRlbnNpdmUuCisgICAgICAgIExvY2FsQXdhcmVFeGVjdXRvclBsdXMgZXhlY3V0b3IgPSBpc0F1dGhRdWVyeSA/IGF1dGhFeGVjdXRvciA6IHJlcXVlc3RFeGVjdXRvcjsKKworICAgICAgICBleGVjdXRvci5zdWJtaXQobmV3IFJlcXVlc3RQcm9jZXNzb3IoY2hhbm5lbCwgcmVxdWVzdCwgZm9yRmx1c2hlciwgYmFja3ByZXNzdXJlKSk7CiAgICAgICAgIENsaWVudE1ldHJpY3MuaW5zdGFuY2UubWFya1JlcXVlc3REaXNwYXRjaGVkKCk7CiAgICAgfQogCisgICAgcHVibGljIGNsYXNzIFJlcXVlc3RQcm9jZXNzb3IgaW1wbGVtZW50cyBSdW5uYWJsZURlYnVnZ2FibGVUYXNrCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIENoYW5uZWwgY2hhbm5lbDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZXNzYWdlLlJlcXVlc3QgcmVxdWVzdDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBGbHVzaEl0ZW1Db252ZXJ0ZXIgZm9yRmx1c2hlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPdmVybG9hZCBiYWNrcHJlc3N1cmU7CisgICAgICAgIAorICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgYXBwcm94Q3JlYXRpb25UaW1lTmFub3MgPSBNb25vdG9uaWNDbG9jay5HbG9iYWwuYXBwcm94VGltZS5ub3coKTsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBsb25nIGFwcHJveFN0YXJ0VGltZU5hbm9zOworICAgICAgICAKKyAgICAgICAgcHVibGljIFJlcXVlc3RQcm9jZXNzb3IoQ2hhbm5lbCBjaGFubmVsLCBNZXNzYWdlLlJlcXVlc3QgcmVxdWVzdCwgRmx1c2hJdGVtQ29udmVydGVyIGZvckZsdXNoZXIsIE92ZXJsb2FkIGJhY2twcmVzc3VyZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDsKKyAgICAgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgICAgICB0aGlzLmZvckZsdXNoZXIgPSBmb3JGbHVzaGVyOworICAgICAgICAgICAgdGhpcy5iYWNrcHJlc3N1cmUgPSBiYWNrcHJlc3N1cmU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBwcm94U3RhcnRUaW1lTmFub3MgPSBNb25vdG9uaWNDbG9jay5HbG9iYWwuYXBwcm94VGltZS5ub3coKTsKKyAgICAgICAgICAgIHByb2Nlc3NSZXF1ZXN0KGNoYW5uZWwsIHJlcXVlc3QsIGZvckZsdXNoZXIsIGJhY2twcmVzc3VyZSwgYXBwcm94U3RhcnRUaW1lTmFub3MpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGNyZWF0aW9uVGltZU5hbm9zKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGFwcHJveENyZWF0aW9uVGltZU5hbm9zOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIHN0YXJ0VGltZU5hbm9zKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGFwcHJveFN0YXJ0VGltZU5hbm9zOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb24oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogTm90ZTogdGhpcyBtZXRob2QgbWF5IGJlIGV4ZWN1dGVkIG9uIHRoZSBuZXR0eSBldmVudCBsb29wLCBkdXJpbmcgaW5pdGlhbCBwcm90b2NvbCBuZWdvdGlhdGlvbjsgdGhlIGNhbGxlciBpcwogICAgICAqIHJlc3BvbnNpYmxlIGZvciBjbGVhbmluZyB1cCBhbnkgZ2xvYmFsIG9yIHRocmVhZC1sb2NhbCBzdGF0ZS4gKGV4LiB0cmFjaW5nLCBjbGllbnQgd2FybmluZ3MsIGV0Yy4pLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE1lc3NhZ2UuUmVzcG9uc2UgcHJvY2Vzc1JlcXVlc3QoU2VydmVyQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBNZXNzYWdlLlJlcXVlc3QgcmVxdWVzdCwgT3ZlcmxvYWQgYmFja3ByZXNzdXJlKQorICAgIHByaXZhdGUgc3RhdGljIE1lc3NhZ2UuUmVzcG9uc2UgcHJvY2Vzc1JlcXVlc3QoU2VydmVyQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBNZXNzYWdlLlJlcXVlc3QgcmVxdWVzdCwgT3ZlcmxvYWQgYmFja3ByZXNzdXJlLCBsb25nIHN0YXJ0VGltZU5hbm9zKQogICAgIHsKLSAgICAgICAgbG9uZyBxdWVyeVN0YXJ0TmFub1RpbWUgPSBuYW5vVGltZSgpOwogICAgICAgICBpZiAoY29ubmVjdGlvbi5nZXRWZXJzaW9uKCkuaXNHcmVhdGVyT3JFcXVhbFRvKFByb3RvY29sVmVyc2lvbi5WNCkpCiAgICAgICAgICAgICBDbGllbnRXYXJuLmluc3RhbmNlLmNhcHR1cmVXYXJuaW5ncygpOwogCkBAIC0xMTksNyArMTkxLDcgQEAKIAogICAgICAgICBNZXNzYWdlLmxvZ2dlci50cmFjZSgiUmVjZWl2ZWQ6IHt9LCB2PXt9IiwgcmVxdWVzdCwgY29ubmVjdGlvbi5nZXRWZXJzaW9uKCkpOwogICAgICAgICBjb25uZWN0aW9uLnJlcXVlc3RzLmluYygpOwotICAgICAgICBNZXNzYWdlLlJlc3BvbnNlIHJlc3BvbnNlID0gcmVxdWVzdC5leGVjdXRlKHFzdGF0ZSwgcXVlcnlTdGFydE5hbm9UaW1lKTsKKyAgICAgICAgTWVzc2FnZS5SZXNwb25zZSByZXNwb25zZSA9IHJlcXVlc3QuZXhlY3V0ZShxc3RhdGUsIHN0YXJ0VGltZU5hbm9zKTsKIAogICAgICAgICBpZiAocmVxdWVzdC5pc1RyYWNrYWJsZSgpKQogICAgICAgICAgICAgQ29vcmRpbmF0b3JXYXJuaW5ncy5kb25lKCk7CkBAIC0xMzAsMTUgKzIwMiwxNSBAQAogICAgICAgICBjb25uZWN0aW9uLmFwcGx5U3RhdGVUcmFuc2l0aW9uKHJlcXVlc3QudHlwZSwgcmVzcG9uc2UudHlwZSk7CiAgICAgICAgIHJldHVybiByZXNwb25zZTsKICAgICB9Ci0KKyAgICAKICAgICAvKioKICAgICAgKiBOb3RlOiB0aGlzIG1ldGhvZCBtYXkgYmUgZXhlY3V0ZWQgb24gdGhlIG5ldHR5IGV2ZW50IGxvb3AuCiAgICAgICovCi0gICAgc3RhdGljIE1lc3NhZ2UuUmVzcG9uc2UgcHJvY2Vzc1JlcXVlc3QoQ2hhbm5lbCBjaGFubmVsLCBNZXNzYWdlLlJlcXVlc3QgcmVxdWVzdCwgT3ZlcmxvYWQgYmFja3ByZXNzdXJlKQorICAgIHN0YXRpYyBNZXNzYWdlLlJlc3BvbnNlIHByb2Nlc3NSZXF1ZXN0KENoYW5uZWwgY2hhbm5lbCwgTWVzc2FnZS5SZXF1ZXN0IHJlcXVlc3QsIE92ZXJsb2FkIGJhY2twcmVzc3VyZSwgbG9uZyBhcHByb3hTdGFydFRpbWVOYW5vcykKICAgICB7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc1JlcXVlc3QoKFNlcnZlckNvbm5lY3Rpb24pIHJlcXVlc3QuY29ubmVjdGlvbigpLCByZXF1ZXN0LCBiYWNrcHJlc3N1cmUpOworICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXF1ZXN0KChTZXJ2ZXJDb25uZWN0aW9uKSByZXF1ZXN0LmNvbm5lY3Rpb24oKSwgcmVxdWVzdCwgYmFja3ByZXNzdXJlLCBhcHByb3hTdGFydFRpbWVOYW5vcyk7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQogICAgICAgICB7CkBAIC0xNjMsOSArMjM1LDkgQEAKICAgICAvKioKICAgICAgKiBOb3RlOiB0aGlzIG1ldGhvZCBpcyBub3QgZXhwZWN0ZWQgdG8gZXhlY3V0ZSBvbiB0aGUgbmV0dHkgZXZlbnQgbG9vcC4KICAgICAgKi8KLSAgICB2b2lkIHByb2Nlc3NSZXF1ZXN0KENoYW5uZWwgY2hhbm5lbCwgTWVzc2FnZS5SZXF1ZXN0IHJlcXVlc3QsIEZsdXNoSXRlbUNvbnZlcnRlciBmb3JGbHVzaGVyLCBPdmVybG9hZCBiYWNrcHJlc3N1cmUpCisgICAgdm9pZCBwcm9jZXNzUmVxdWVzdChDaGFubmVsIGNoYW5uZWwsIE1lc3NhZ2UuUmVxdWVzdCByZXF1ZXN0LCBGbHVzaEl0ZW1Db252ZXJ0ZXIgZm9yRmx1c2hlciwgT3ZlcmxvYWQgYmFja3ByZXNzdXJlLCBsb25nIGFwcHJveFN0YXJ0VGltZU5hbm9zKQogICAgIHsKLSAgICAgICAgTWVzc2FnZS5SZXNwb25zZSByZXNwb25zZSA9IHByb2Nlc3NSZXF1ZXN0KGNoYW5uZWwsIHJlcXVlc3QsIGJhY2twcmVzc3VyZSk7CisgICAgICAgIE1lc3NhZ2UuUmVzcG9uc2UgcmVzcG9uc2UgPSBwcm9jZXNzUmVxdWVzdChjaGFubmVsLCByZXF1ZXN0LCBiYWNrcHJlc3N1cmUsIGFwcHJveFN0YXJ0VGltZU5hbm9zKTsKICAgICAgICAgRmx1c2hJdGVtPD8+IHRvRmx1c2ggPSBmb3JGbHVzaGVyLnRvRmx1c2hJdGVtKGNoYW5uZWwsIHJlcXVlc3QsIHJlc3BvbnNlKTsKICAgICAgICAgTWVzc2FnZS5sb2dnZXIudHJhY2UoIlJlc3BvbmRpbmc6IHt9LCB2PXt9IiwgcmVzcG9uc2UsIHJlcXVlc3QuY29ubmVjdGlvbigpLmdldFZlcnNpb24oKSk7CiAgICAgICAgIGZsdXNoKHRvRmx1c2gpOwpAQCAtMTg5LDE5ICsyNjEsMTYgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaHV0ZG93bigpCiAgICAgewotICAgICAgICBpZiAocmVxdWVzdEV4ZWN1dG9yICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcXVlc3RFeGVjdXRvci5zaHV0ZG93bigpOwotICAgICAgICB9CisgICAgICAgIHJlcXVlc3RFeGVjdXRvci5zaHV0ZG93bigpOworICAgICAgICBhdXRoRXhlY3V0b3Iuc2h1dGRvd24oKTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIERpc3BhdGNoZXIgZm9yIEV2ZW50TWVzc2FnZXMuIEluIHtAbGluayBTZXJ2ZXIuQ29ubmVjdGlvblRyYWNrZXIjc2VuZChFdmVudCl9LCB0aGUgc3RyYXRlZ3kKICAgICAgKiBmb3IgZGVsaXZlcmluZyBldmVudHMgdG8gcmVnaXN0ZXJlZCBjbGllbnRzIGlzIGRlcGVuZGVudCBvbiBwcm90b2NvbCB2ZXJzaW9uIGFuZCB0aGUgY29uZmlndXJhdGlvbgogICAgICAqIG9mIHRoZSBwaXBlbGluZS4gRm9yIHY1IGFuZCBuZXdlciBjb25uZWN0aW9ucywgdGhlIGV2ZW50IG1lc3NhZ2UgaXMgZW5jb2RlZCBpbnRvIGFuIEVudmVsb3BlLAogICAgICAqIHdyYXBwZWQgaW4gYSBGbHVzaEl0ZW0gYW5kIHRoZW4gZGVsaXZlcmVkIHZpYSB0aGUgcGlwZWxpbmUncyBmbHVzaGVyLCBpbiBhIHNpbWlsYXIgd2F5IHRvCi0gICAgICogYSBSZXNwb25zZSByZXR1cm5lZCBmcm9tIHtAbGluayAjcHJvY2Vzc1JlcXVlc3QoQ2hhbm5lbCwgTWVzc2FnZS5SZXF1ZXN0LCBGbHVzaEl0ZW1Db252ZXJ0ZXIsIE92ZXJsb2FkKX0uCisgICAgICogYSBSZXNwb25zZSByZXR1cm5lZCBmcm9tIHtAbGluayAjcHJvY2Vzc1JlcXVlc3QoQ2hhbm5lbCwgTWVzc2FnZS5SZXF1ZXN0LCBGbHVzaEl0ZW1Db252ZXJ0ZXIsIE92ZXJsb2FkLCBsb25nKX0uCiAgICAgICogSXQncyB3b3J0aCBub3RpbmcgdGhhdCBldmVudHMgYXJlIG5vdCBnZW5lcmFsbHkgZmlyZWQgYXMgYSBkaXJlY3QgcmVzcG9uc2UgdG8gYSBjbGllbnQgcmVxdWVzdCwKICAgICAgKiBzbyB0aGlzIGZsdXNoIGl0ZW0gaGFzIGEgbnVsbCByZXF1ZXN0IGF0dHJpYnV0ZS4gVGhlIGRpc3BhdGNoZXIgaXRzZWxmIGlzIGNyZWF0ZWQgd2hlbiB0aGUKICAgICAgKiBwaXBlbGluZSBpcyBmaXJzdCBjb25maWd1cmVkIGR1cmluZyBwcm90b2NvbCBuZWdvdGlhdGlvbiBhbmQgaXMgYXR0YWNoZWQgdG8gdGhlIGNoYW5uZWwgZm9yCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvSW5pdGlhbENvbm5lY3Rpb25IYW5kbGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvSW5pdGlhbENvbm5lY3Rpb25IYW5kbGVyLmphdmEKaW5kZXggNzVjYjcyZS4uZTRjZmY5OSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L0luaXRpYWxDb25uZWN0aW9uSGFuZGxlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9Jbml0aWFsQ29ubmVjdGlvbkhhbmRsZXIuamF2YQpAQCAtMjYsNiArMjYsNyBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuQ2xpZW50UmVzb3VyY2VMaW1pdHMuT3ZlcmxvYWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTW9ub3RvbmljQ2xvY2s7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIApAQCAtMTQ4LDcgKzE0OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gbmV3IFZvaWRDaGFubmVsUHJvbWlzZShjdHguY2hhbm5lbCgpLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlLlJlc3BvbnNlIHJlc3BvbnNlID0gRGlzcGF0Y2hlci5wcm9jZXNzUmVxdWVzdChjdHguY2hhbm5lbCgpLCBzdGFydHVwLCBPdmVybG9hZC5OT05FKTsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBhcHByb3hTdGFydFRpbWVOYW5vcyA9IE1vbm90b25pY0Nsb2NrLkdsb2JhbC5hcHByb3hUaW1lLm5vdygpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlLlJlc3BvbnNlIHJlc3BvbnNlID0gRGlzcGF0Y2hlci5wcm9jZXNzUmVxdWVzdChjdHguY2hhbm5lbCgpLCBzdGFydHVwLCBPdmVybG9hZC5OT05FLCBhcHByb3hTdGFydFRpbWVOYW5vcyk7CisKICAgICAgICAgICAgICAgICAgICAgb3V0Ym91bmQgPSByZXNwb25zZS5lbmNvZGUoaW5ib3VuZC5oZWFkZXIudmVyc2lvbik7CiAgICAgICAgICAgICAgICAgICAgIGN0eC53cml0ZUFuZEZsdXNoKG91dGJvdW5kLCBwcm9taXNlKTsKICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJDb25maWd1cmVkIHBpcGVsaW5lOiB7fSIsIGN0eC5waXBlbGluZSgpKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9NZXNzYWdlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvTWVzc2FnZS5qYXZhCmluZGV4IDc1Yzk5N2UuLjgyMDE1YzEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9NZXNzYWdlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L01lc3NhZ2UuamF2YQpAQCAtMzYsNiArMzYsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYWNpbmcuVHJhY2luZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQubWVzc2FnZXMuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlF1ZXJ5U3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUmVmbGVjdGlvblV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlELkdlbmVyYXRvci5uZXh0VGltZVVVSUQ7CkBAIC0xMzIsNyArMTMzLDcgQEAKICAgICAgICAgICAgIENvZGVjPD8+IG9yaWdpbmFsID0gdGhpcy5jb2RlYzsKICAgICAgICAgICAgIEZpZWxkIGZpZWxkID0gVHlwZS5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJjb2RlYyIpOwogICAgICAgICAgICAgZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgIEZpZWxkIG1vZGlmaWVycyA9IEZpZWxkLmNsYXNzLmdldERlY2xhcmVkRmllbGQoIm1vZGlmaWVycyIpOworICAgICAgICAgICAgRmllbGQgbW9kaWZpZXJzID0gUmVmbGVjdGlvblV0aWxzLmdldE1vZGlmaWVyc0ZpZWxkKCk7CiAgICAgICAgICAgICBtb2RpZmllcnMuc2V0QWNjZXNzaWJsZSh0cnVlKTsKICAgICAgICAgICAgIG1vZGlmaWVycy5zZXRJbnQoZmllbGQsIGZpZWxkLmdldE1vZGlmaWVycygpICYgfk1vZGlmaWVyLkZJTkFMKTsKICAgICAgICAgICAgIGZpZWxkLnNldCh0aGlzLCBjb2RlYyk7CkBAIC0xOTMsNyArMTk0LDggQEAKICAgICAgICAgdGhpcy5jdXN0b21QYXlsb2FkID0gY3VzdG9tUGF5bG9hZDsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIGRlYnVnU3RyaW5nKCkKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKICAgICB7CiAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIoJXM6JXM6JXMpIiwgdHlwZSwgc3RyZWFtSWQsIGNvbm5lY3Rpb24gPT0gbnVsbCA/ICJudWxsIiA6ICBjb25uZWN0aW9uLmdldFZlcnNpb24oKS5hc0ludCgpKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvUGlwZWxpbmVDb25maWd1cmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9QaXBlbGluZUNvbmZpZ3VyYXRvci5qYXZhCmluZGV4IDgxZmYxMzYuLmZmNTI0NzggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9QaXBlbGluZUNvbmZpZ3VyYXRvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9QaXBlbGluZUNvbmZpZ3VyYXRvci5qYXZhCkBAIC00OCw2ICs0OCw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VjdXJpdHkuU1NMRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQubWVzc2FnZXMuU3RhcnR1cE1lc3NhZ2U7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX1VOU0FGRV9WRVJCT1NFX0RFQlVHX0NMSUVOVF9QUk9UT0NPTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlNvY2tldEZhY3RvcnkubmV3U3NsSGFuZGxlcjsKKwogLyoqCiAgKiBUYWtlcyBjYXJlIG9mIGludGlhbGl6aW5nIGEgTmV0dHkgQ2hhbm5lbCBhbmQgUGlwZWxpbmUgZm9yIGNsaWVudCBwcm90b2NvbCBjb25uZWN0aW9ucy4KICAqIFRoZSBwaXBlbGluZSBpcyBmaXJzdCBzZXQgdXAgd2l0aCBzb21lIGNvbW1vbiBoYW5kbGVycyBmb3IgY29ubmVjdGlvbiBsaW1pdGluZywgZHJvcHBpbmcKQEAgLTYxLDcgKzY0LDcgQEAKIAogICAgIC8vIE5vdCB0byBiZSB1c2VkIGluIHByb2R1Y3Rpb24sIHRoaXMgY2F1c2VzIGEgTmV0dHkgbG9nZ2luZyBoYW5kbGVyIHRvIGJlIGFkZGVkIHRvIHRoZSBwaXBlbGluZSwKICAgICAvLyB3aGljaCB3aWxsIHRocm90dGxlIGEgc3lzdGVtIHVuZGVyIGFueSBub3JtYWwgbG9hZC4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gQm9vbGVhbi5nZXRCb29sZWFuKCJjYXNzYW5kcmEudW5zYWZlX3ZlcmJvc2VfZGVidWdfY2xpZW50X3Byb3RvY29sIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IFRFU1RfVU5TQUZFX1ZFUkJPU0VfREVCVUdfQ0xJRU5UX1BST1RPQ09MLmdldEJvb2xlYW4oKTsKIAogICAgIC8vIFN0YXRlbGVzcyBoYW5kbGVycwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbm5lY3Rpb25MaW1pdEhhbmRsZXIgY29ubmVjdGlvbkxpbWl0SGFuZGxlciA9IG5ldyBDb25uZWN0aW9uTGltaXRIYW5kbGVyKCk7CkBAIC0xODEsNyArMTg0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbm5lY3Rpb24gdXNlcyBTU0wvVExTLCByZXBsYWNlIHRoZSBkZXRlY3Rpb24gaGFuZGxlciB3aXRoIGEgU3NsSGFuZGxlciBhbmQgc28gdXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuY3J5cHRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNzbEhhbmRsZXIgc3NsSGFuZGxlciA9IHNzbENvbnRleHQubmV3SGFuZGxlcihjaGFubmVsLmFsbG9jKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBwZWVyID0gZW5jcnlwdGlvbk9wdGlvbnMucmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24gPyAoSW5ldFNvY2tldEFkZHJlc3MpIGNoYW5uZWwucmVtb3RlQWRkcmVzcygpIDogbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3NsSGFuZGxlciBzc2xIYW5kbGVyID0gbmV3U3NsSGFuZGxlcihjaGFubmVsLCBzc2xDb250ZXh0LCBwZWVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEhhbmRsZXJDb250ZXh0LnBpcGVsaW5lKCkucmVwbGFjZShTU0xfSEFORExFUiwgU1NMX0hBTkRMRVIsIHNzbEhhbmRsZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCkBAIC0xOTksNyArMjAzLDggQEAKICAgICAgICAgICAgICAgICAgICAgU3NsQ29udGV4dCBzc2xDb250ZXh0ID0gU1NMRmFjdG9yeS5nZXRPckNyZWF0ZVNzbENvbnRleHQoZW5jcnlwdGlvbk9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25PcHRpb25zLnJlcXVpcmVfY2xpZW50X2F1dGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTc2xDb250ZXh0RmFjdG9yeS5Tb2NrZXRUeXBlLlNFUlZFUik7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5uZWwucGlwZWxpbmUoKS5hZGRGaXJzdChTU0xfSEFORExFUiwgc3NsQ29udGV4dC5uZXdIYW5kbGVyKGNoYW5uZWwuYWxsb2MoKSkpOworICAgICAgICAgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBwZWVyID0gZW5jcnlwdGlvbk9wdGlvbnMucmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24gPyAoSW5ldFNvY2tldEFkZHJlc3MpIGNoYW5uZWwucmVtb3RlQWRkcmVzcygpIDogbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC5waXBlbGluZSgpLmFkZEZpcnN0KFNTTF9IQU5ETEVSLCBuZXdTc2xIYW5kbGVyKGNoYW5uZWwsIHNzbENvbnRleHQsIHBlZXIpKTsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgVExTIGVuY3J5cHRpb24gcG9saWN5OiAiICsgdGhpcy50bHNFbmNyeXB0aW9uUG9saWN5KTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9Qcm90b2NvbFZlcnNpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9Qcm90b2NvbFZlcnNpb24uamF2YQppbmRleCBmYzk3Y2M4Li42MDc4ZmIyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvUHJvdG9jb2xWZXJzaW9uLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L1Byb3RvY29sVmVyc2lvbi5qYXZhCkBAIC03NSw3ICs3NSwxMCBAQAogICAgIC8qKiBPbGQgdW5zdXBwb3J0ZWQgdmVyc2lvbnMsIHRoaXMgaXMgT0sgYXMgbG9uZyBhcyB3ZSBuZXZlciBhZGQgbmV3ZXIgdW5zdXBwb3J0ZWQgdmVyc2lvbnMgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIEVudW1TZXQ8UHJvdG9jb2xWZXJzaW9uPiBVTlNVUFBPUlRFRCA9IEVudW1TZXQuY29tcGxlbWVudE9mKFNVUFBPUlRFRCk7CiAKLSAgICAvKiogVGhlIHByZWZlcnJlZCB2ZXJzaW9ucyAqLworICAgIC8qKiBUaGUgcHJlZmVycmVkIHZlcnNpb24uCisgICAgICoKKyAgICAgKiBXaGVuIHVwZGF0aW5nIHRoaXMgcmVtZW1iZXIgdG8gYWxzbyB1cGRhdGUgdGhlIE1VTFRJX1VQR1JBREVTIGluIGNhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzL3VwZ3JhZGVfdGhyb3VnaF92ZXJzaW9uc190ZXN0LnB5CisgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBQcm90b2NvbFZlcnNpb24gQ1VSUkVOVCA9IFY1OwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgT3B0aW9uYWw8UHJvdG9jb2xWZXJzaW9uPiBCRVRBID0gT3B0aW9uYWwub2YoVjYpOwogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvU2VydmVyQ29ubmVjdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L1NlcnZlckNvbm5lY3Rpb24uamF2YQppbmRleCAwNmU3ODQyLi5kZDZmYTMxIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvU2VydmVyQ29ubmVjdGlvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9TZXJ2ZXJDb25uZWN0aW9uLmphdmEKQEAgLTE3LDggKzE3LDggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQ7CiAKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CiBpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKIAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CkBAIC0xMjEsMTEgKzEyMSwxMSBAQAogICAgICAgICByZXR1cm4gc2FzbE5lZ290aWF0b3I7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBYNTA5Q2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMoKQorICAgIHByaXZhdGUgQ2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMoKQogICAgIHsKICAgICAgICAgU3NsSGFuZGxlciBzc2xIYW5kbGVyID0gKFNzbEhhbmRsZXIpIGNoYW5uZWwoKS5waXBlbGluZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KCJzc2wiKTsKLSAgICAgICAgWDUwOUNlcnRpZmljYXRlW10gY2VydGlmaWNhdGVzID0gbnVsbDsKKyAgICAgICAgQ2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMgPSBudWxsOwogCiAgICAgICAgIGlmIChzc2xIYW5kbGVyICE9IG51bGwpCiAgICAgICAgIHsKQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlcyA9IHNzbEhhbmRsZXIuZW5naW5lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNlc3Npb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGVlckNlcnRpZmljYXRlQ2hhaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBlZXJDZXJ0aWZpY2F0ZXMoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbiBlKQogICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L1NpbXBsZUNsaWVudC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L1NpbXBsZUNsaWVudC5qYXZhCmluZGV4IDQzYmI4YWQuLjJiNTdkMTAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9TaW1wbGVDbGllbnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvU2ltcGxlQ2xpZW50LmphdmEKQEAgLTUyLDYgKzUyLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQubWVzc2FnZXMuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlVuY2hlY2tlZEludGVycnVwdGVkRXhjZXB0aW9uOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5Tb2NrZXRGYWN0b3J5Lm5ld1NzbEhhbmRsZXI7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5DUUxNZXNzYWdlSGFuZGxlci5lbnZlbG9wZVNpemU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5GbHVzaGVyLk1BWF9GUkFNRURfUEFZTE9BRF9TSVpFOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50Lk5vbkJsb2NraW5nUmF0ZUxpbWl0ZXIuTk9fT1BfTElNSVRFUjsKQEAgLTYyNCw3ICs2MjUsOCBAQAogICAgICAgICAgICAgc3VwZXIuaW5pdENoYW5uZWwoY2hhbm5lbCk7CiAgICAgICAgICAgICBTc2xDb250ZXh0IHNzbENvbnRleHQgPSBTU0xGYWN0b3J5LmdldE9yQ3JlYXRlU3NsQ29udGV4dChlbmNyeXB0aW9uT3B0aW9ucywgZW5jcnlwdGlvbk9wdGlvbnMucmVxdWlyZV9jbGllbnRfYXV0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTc2xDb250ZXh0RmFjdG9yeS5Tb2NrZXRUeXBlLkNMSUVOVCk7Ci0gICAgICAgICAgICBjaGFubmVsLnBpcGVsaW5lKCkuYWRkRmlyc3QoInNzbCIsIHNzbENvbnRleHQubmV3SGFuZGxlcihjaGFubmVsLmFsbG9jKCkpKTsKKyAgICAgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIHBlZXIgPSBlbmNyeXB0aW9uT3B0aW9ucy5yZXF1aXJlX2VuZHBvaW50X3ZlcmlmaWNhdGlvbiA/IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhob3N0LCBwb3J0KSA6IG51bGw7CisgICAgICAgICAgICBjaGFubmVsLnBpcGVsaW5lKCkuYWRkRmlyc3QoInNzbCIsIG5ld1NzbEhhbmRsZXIoY2hhbm5lbCwgc3NsQ29udGV4dCwgcGVlcikpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvbWVzc2FnZXMvUXVlcnlNZXNzYWdlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvbWVzc2FnZXMvUXVlcnlNZXNzYWdlLmphdmEKaW5kZXggOWEyOTZlNC4uYzI5NTIxNiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L21lc3NhZ2VzL1F1ZXJ5TWVzc2FnZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9tZXNzYWdlcy9RdWVyeU1lc3NhZ2UuamF2YQpAQCAtMTQ4LDYgKzE0OCw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCiAgICAgewotICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiUVVFUlkgJXMgW3BhZ2VTaXplID0gJWRdIiwgcXVlcnksIG9wdGlvbnMuZ2V0UGFnZVNpemUoKSk7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJRVUVSWSAlcyBbcGFnZVNpemUgPSAlZF0gYXQgY29uc2lzdGVuY3kgJXMiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnksIG9wdGlvbnMuZ2V0UGFnZVNpemUoKSwgb3B0aW9ucy5nZXRDb25zaXN0ZW5jeSgpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9BbHdheXNQcmVzZW50RmlsdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9BbHdheXNQcmVzZW50RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNDZlODQuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvQWx3YXlzUHJlc2VudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlJlZjsKLQotcHVibGljIGNsYXNzIEFsd2F5c1ByZXNlbnRGaWx0ZXIgaW1wbGVtZW50cyBJRmlsdGVyCi17Ci0gICAgcHVibGljIGJvb2xlYW4gaXNQcmVzZW50KEZpbHRlcktleSBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGQoRmlsdGVyS2V5IGtleSkgeyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7IH0KLQotICAgIHB1YmxpYyBJRmlsdGVyIHNoYXJlZENvcHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFRocm93YWJsZSBjbG9zZShUaHJvd2FibGUgYWNjdW11bGF0ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhY2N1bXVsYXRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFRvKFJlZi5JZGVudGl0eUNvbGxlY3Rpb24gaWRlbnRpdGllcykKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgc2VyaWFsaXplZFNpemUoKSB7IHJldHVybiAwOyB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBvZmZIZWFwU2l6ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9CbG9vbUZpbHRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvQmxvb21GaWx0ZXIuamF2YQppbmRleCBiZjQ4ZDQzLi5hOTVkMTMxIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9CbG9vbUZpbHRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0Jsb29tRmlsdGVyLmphdmEKQEAgLTE3LDEwICsxNywxMyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzOwogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogCiBpbXBvcnQgaW8ubmV0dHkudXRpbC5jb25jdXJyZW50LkZhc3RUaHJlYWRMb2NhbDsKIGltcG9ydCBuZXQubmljb3VsYWouY29tcGlsZWNvbW1hbmQuYW5ub3RhdGlvbnMuSW5saW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFN0cmVhbVBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWY7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5XcmFwcGVkU2hhcmVkQ2xvc2VhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm9icy5JQml0U2V0OwpAQCAtMjksNiArMzIsNyBAQAogewogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEZhc3RUaHJlYWRMb2NhbDxsb25nW10+IHJldXNhYmxlSW5kZXhlcyA9IG5ldyBGYXN0VGhyZWFkTG9jYWw8bG9uZ1tdPigpCiAgICAgeworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIGxvbmdbXSBpbml0aWFsVmFsdWUoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IGxvbmdbMjFdOwpAQCAtNTIsOSArNTYsMTUgQEAKICAgICAgICAgdGhpcy5iaXRzZXQgPSBjb3B5LmJpdHNldDsKICAgICB9CiAKLSAgICBwdWJsaWMgbG9uZyBzZXJpYWxpemVkU2l6ZSgpCisgICAgcHVibGljIGxvbmcgc2VyaWFsaXplZFNpemUoYm9vbGVhbiBvbGQpCiAgICAgewotICAgICAgICByZXR1cm4gQmxvb21GaWx0ZXJTZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKHRoaXMpOworICAgICAgICByZXR1cm4gQmxvb21GaWx0ZXJTZXJpYWxpemVyLmZvclZlcnNpb24ob2xkKS5zZXJpYWxpemVkU2l6ZSh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoRGF0YU91dHB1dFN0cmVhbVBsdXMgb3V0LCBib29sZWFuIG9sZCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBCbG9vbUZpbHRlclNlcmlhbGl6ZXIuZm9yVmVyc2lvbihvbGQpLnNlcmlhbGl6ZSh0aGlzLCBvdXQpOwogICAgIH0KIAogICAgIC8vIE11cm11ciBpcyBmYXN0ZXIgdGhhbiBhbiBTSEEtYmFzZWQgYXBwcm9hY2ggYW5kIHByb3ZpZGVzIGFzLWdvb2QgY29sbGlzaW9uCkBAIC0xMDEsNiArMTExLDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZChGaWx0ZXJLZXkga2V5KQogICAgIHsKICAgICAgICAgbG9uZ1tdIGluZGV4ZXMgPSBpbmRleGVzKGtleSk7CkBAIC0xMTAsNiArMTIxLDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzUHJlc2VudChGaWx0ZXJLZXkga2V5KQogICAgIHsKICAgICAgICAgbG9uZ1tdIGluZGV4ZXMgPSBpbmRleGVzKGtleSk7CkBAIC0xMjMsMTIgKzEzNSwxNCBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbGVhcigpCiAgICAgewogICAgICAgICBiaXRzZXQuY2xlYXIoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgSUZpbHRlciBzaGFyZWRDb3B5KCkKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQmxvb21GaWx0ZXIgc2hhcmVkQ29weSgpCiAgICAgewogICAgICAgICByZXR1cm4gbmV3IEJsb29tRmlsdGVyKHRoaXMpOwogICAgIH0KQEAgLTEzOSwxMSArMTUzLDE5IEBACiAgICAgICAgIHJldHVybiBiaXRzZXQub2ZmSGVhcFNpemUoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luZm9ybWF0aXZlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBiaXRzZXQub2ZmSGVhcFNpemUoKSA+IDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCiAgICAgewogICAgICAgICByZXR1cm4gIkJsb29tRmlsdGVyW2hhc2hDb3VudD0iICsgaGFzaENvdW50ICsgIjtjYXBhY2l0eT0iICsgYml0c2V0LmNhcGFjaXR5KCkgKyAnXSc7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkVG8oUmVmLklkZW50aXR5Q29sbGVjdGlvbiBpZGVudGl0aWVzKQogICAgIHsKICAgICAgICAgc3VwZXIuYWRkVG8oaWRlbnRpdGllcyk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9CbG9vbUZpbHRlclNlcmlhbGl6ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0Jsb29tRmlsdGVyU2VyaWFsaXplci5qYXZhCmluZGV4IDNkZjQzMTQuLmU0YjM0YTQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0Jsb29tRmlsdGVyU2VyaWFsaXplci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0Jsb29tRmlsdGVyU2VyaWFsaXplci5qYXZhCkBAIC0xNyw0NyArMTcsNjUgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlsczsKIAotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0OwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLklHZW5lcmljU2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXMuRGF0YUlucHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRTdHJlYW1QbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm9icy5JQml0U2V0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm9icy5PZmZIZWFwQml0U2V0OwogCi1wdWJsaWMgZmluYWwgY2xhc3MgQmxvb21GaWx0ZXJTZXJpYWxpemVyCitwdWJsaWMgZmluYWwgY2xhc3MgQmxvb21GaWx0ZXJTZXJpYWxpemVyIGltcGxlbWVudHMgSUdlbmVyaWNTZXJpYWxpemVyPEJsb29tRmlsdGVyLCBEYXRhSW5wdXRTdHJlYW1QbHVzLCBEYXRhT3V0cHV0U3RyZWFtUGx1cz4KIHsKLSAgICBwcml2YXRlIEJsb29tRmlsdGVyU2VyaWFsaXplcigpCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBCbG9vbUZpbHRlclNlcmlhbGl6ZXIgbmV3Rm9ybWF0SW5zdGFuY2UgPSBuZXcgQmxvb21GaWx0ZXJTZXJpYWxpemVyKGZhbHNlKTsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIEJsb29tRmlsdGVyU2VyaWFsaXplciBvbGRGb3JtYXRJbnN0YW5jZSA9IG5ldyBCbG9vbUZpbHRlclNlcmlhbGl6ZXIodHJ1ZSk7CisKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gb2xkRm9ybWF0OworCisgICAgcHJpdmF0ZSA8VD4gQmxvb21GaWx0ZXJTZXJpYWxpemVyKGJvb2xlYW4gb2xkRm9ybWF0KQogICAgIHsKKyAgICAgICAgdGhpcy5vbGRGb3JtYXQgPSBvbGRGb3JtYXQ7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZShCbG9vbUZpbHRlciBiZiwgRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICBwdWJsaWMgc3RhdGljIEJsb29tRmlsdGVyU2VyaWFsaXplciBmb3JWZXJzaW9uKGJvb2xlYW4gb2xkU2VyaWFsaXphdGlvbkZvcm1hdCkKICAgICB7CisgICAgICAgIGlmIChvbGRTZXJpYWxpemF0aW9uRm9ybWF0KQorICAgICAgICAgICAgcmV0dXJuIG9sZEZvcm1hdEluc3RhbmNlOworCisgICAgICAgIHJldHVybiBuZXdGb3JtYXRJbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoQmxvb21GaWx0ZXIgYmYsIERhdGFPdXRwdXRTdHJlYW1QbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBhc3NlcnQgIW9sZEZvcm1hdCA6ICJGaWx0ZXIgc2hvdWxkIG5vdCBiZSBzZXJpYWxpemVkIGluIG9sZCBmb3JtYXQiOwogICAgICAgICBvdXQud3JpdGVJbnQoYmYuaGFzaENvdW50KTsKICAgICAgICAgYmYuYml0c2V0LnNlcmlhbGl6ZShvdXQpOwogICAgIH0KIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCi0gICAgcHVibGljIHN0YXRpYyA8SSBleHRlbmRzIElucHV0U3RyZWFtICYgRGF0YUlucHV0PiBCbG9vbUZpbHRlciBkZXNlcmlhbGl6ZShJIGluLCBib29sZWFuIG9sZEJmRm9ybWF0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGludCBoYXNoZXMgPSBpbi5yZWFkSW50KCk7Ci0gICAgICAgIElCaXRTZXQgYnMgPSBPZmZIZWFwQml0U2V0LmRlc2VyaWFsaXplKGluLCBvbGRCZkZvcm1hdCk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBCbG9vbUZpbHRlcihoYXNoZXMsIGJzKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBDYWxjdWxhdGVzIGEgc2VyaWFsaXplZCBzaXplIG9mIHRoZSBnaXZlbiBCbG9vbSBGaWx0ZXIKLSAgICAgKiBAcGFyYW0gYmYgQmxvb20gZmlsdGVyIHRvIGNhbGN1bGF0ZSBzZXJpYWxpemVkIHNpemUKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLklTZXJpYWxpemVyI3NlcmlhbGl6ZShPYmplY3QsIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXMpCiAgICAgICoKKyAgICAgKiBAcGFyYW0gYmYgQmxvb20gZmlsdGVyIHRvIGNhbGN1bGF0ZSBzZXJpYWxpemVkIHNpemUKICAgICAgKiBAcmV0dXJuIHNlcmlhbGl6ZWQgc2l6ZSBvZiB0aGUgZ2l2ZW4gYmxvb20gZmlsdGVyCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5JU2VyaWFsaXplciNzZXJpYWxpemUoT2JqZWN0LCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzKQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBzZXJpYWxpemVkU2l6ZShCbG9vbUZpbHRlciBiZikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBzZXJpYWxpemVkU2l6ZShCbG9vbUZpbHRlciBiZikKICAgICB7CiAgICAgICAgIGludCBzaXplID0gVHlwZVNpemVzLnNpemVvZihiZi5oYXNoQ291bnQpOyAvLyBoYXNoIGNvdW50CiAgICAgICAgIHNpemUgKz0gYmYuYml0c2V0LnNlcmlhbGl6ZWRTaXplKCk7CiAgICAgICAgIHJldHVybiBzaXplOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCisgICAgcHVibGljIEJsb29tRmlsdGVyIGRlc2VyaWFsaXplKERhdGFJbnB1dFN0cmVhbVBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaW50IGhhc2hlcyA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgSUJpdFNldCBicyA9IE9mZkhlYXBCaXRTZXQuZGVzZXJpYWxpemUoaW4sIG9sZEZvcm1hdCk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBCbG9vbUZpbHRlcihoYXNoZXMsIGJzKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9CeXRlQXJyYXlVdGlsLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9CeXRlQXJyYXlVdGlsLmphdmEKaW5kZXggOGM4NGVlNS4uZjBlNzk3YyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvQnl0ZUFycmF5VXRpbC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0J5dGVBcnJheVV0aWwuamF2YQpAQCAtMjM0LDcgKzIzNCw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVXaXRoVkludExlbmd0aChieXRlW10gYnl0ZXMsIERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoYnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoYnl0ZXMubGVuZ3RoKTsKICAgICAgICAgb3V0LndyaXRlKGJ5dGVzKTsKICAgICB9CiAKQEAgLTI1OSw3ICsyNTksNyBAQAogCiAgICAgcHVibGljIHN0YXRpYyBieXRlW10gcmVhZFdpdGhWSW50TGVuZ3RoKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgaW50IGxlbmd0aCA9IChpbnQpaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICBpbnQgbGVuZ3RoID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgIGlmIChsZW5ndGggPCAwKQogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3JydXB0IChuZWdhdGl2ZSkgdmFsdWUgbGVuZ3RoIGVuY291bnRlcmVkIik7CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0J5dGVCdWZmZXJVdGlsLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9CeXRlQnVmZmVyVXRpbC5qYXZhCmluZGV4IGJhN2QxYmUuLjc5MGZmMmEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0J5dGVCdWZmZXJVdGlsLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvQnl0ZUJ1ZmZlclV0aWwuamF2YQpAQCAtMjMsOSArMjMsMTMgQEAKICAqIGFmdGVyd2FyZCwgYW5kIGVuc3VyZSB0aGUgdGVzdHMgc3RpbGwgcGFzcy4KICAqLwogCi1pbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0OworaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CkBAIC0zNCw4ICszOCw4IEBACiAKIGltcG9ydCBuZXQubmljb3VsYWouY29tcGlsZWNvbW1hbmQuYW5ub3RhdGlvbnMuSW5saW5lOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQnVmZmVyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKIApAQCAtMzM4LDcgKzM0Miw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVXaXRoVkludExlbmd0aChCeXRlQnVmZmVyIGJ5dGVzLCBEYXRhT3V0cHV0UGx1cyBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGJ5dGVzLnJlbWFpbmluZygpKTsKKyAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoYnl0ZXMucmVtYWluaW5nKCkpOwogICAgICAgICBvdXQud3JpdGUoYnl0ZXMpOwogICAgIH0KIApAQCAtMzY0LDcgKzM2OCw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXIgcmVhZFdpdGhWSW50TGVuZ3RoKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgaW50IGxlbmd0aCA9IChpbnQpaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICBpbnQgbGVuZ3RoID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgIGlmIChsZW5ndGggPCAwKQogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3JydXB0IChuZWdhdGl2ZSkgdmFsdWUgbGVuZ3RoIGVuY291bnRlcmVkIik7CiAKQEAgLTM4NSw3ICszODksNyBAQAogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNraXBXaXRoVkludExlbmd0aChEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIGludCBsZW5ndGggPSAoaW50KWluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgaW50IGxlbmd0aCA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogICAgICAgICBpZiAobGVuZ3RoIDwgMCkKICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ29ycnVwdCAobmVnYXRpdmUpIHZhbHVlIGxlbmd0aCBlbmNvdW50ZXJlZCIpOwogCkBAIC02ODEsMTMgKzY4NSwxNCBAQAogCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNhbk1pbmltaXplKEJ5dGVCdWZmZXIgYnVmKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGJ1ZiAhPSBudWxsICYmIChidWYuY2FwYWNpdHkoKSA+IGJ1Zi5yZW1haW5pbmcoKSB8fCAhYnVmLmhhc0FycmF5KCkpOworICAgICAgICByZXR1cm4gYnVmICE9IG51bGwgJiYgKCFidWYuaGFzQXJyYXkoKSB8fCBidWYuYXJyYXkoKS5sZW5ndGggPiBidWYucmVtYWluaW5nKCkpOworICAgICAgICAvLyBOb3RlOiBidWYuYXJyYXkoKS5sZW5ndGggaXMgZGlmZmVyZW50IGZyb20gYnVmLmNhcGFjaXR5KCkgZm9yIHNsaWNlZCBidWZmZXJzLgogICAgIH0KIAogICAgIC8qKiB0cmltcyBzaXplIG9mIGJ5dGVidWZmZXIgdG8gZXhhY3RseSBudW1iZXIgb2YgYnl0ZXMgaW4gaXQsIHRvIGRvIG5vdCBob2xkIHRvbyBtdWNoIG1lbW9yeSAqLwogICAgIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlciBtaW5pbWFsQnVmZmVyRm9yKEJ5dGVCdWZmZXIgYnVmKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGJ1Zi5jYXBhY2l0eSgpID4gYnVmLnJlbWFpbmluZygpIHx8ICFidWYuaGFzQXJyYXkoKSA/IEJ5dGVCdWZmZXIud3JhcChnZXRBcnJheShidWYpKSA6IGJ1ZjsKKyAgICAgICAgcmV0dXJuICFidWYuaGFzQXJyYXkoKSB8fCBidWYuYXJyYXkoKS5sZW5ndGggPiBidWYucmVtYWluaW5nKCkgPyBCeXRlQnVmZmVyLndyYXAoZ2V0QXJyYXkoYnVmKSkgOiBidWY7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyW10gbWluaW1pemVCdWZmZXJzKEJ5dGVCdWZmZXJbXSBzcmMpCkBAIC04NjUsNCArODcwLDM1IEBACiAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBidWZmZXIgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGlucHV0IG1hdGNoZXMgZ2l2ZW4gYnVmZmVyLgorICAgICAqIElmIHRydWUsIHRoZSBpbnB1dCBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgb2YgdGhlIGNvbnN1bWVkIGJ1ZmZlci4KKyAgICAgKiBJZiBmYWxzZSwgdGhlIHBvc2l0aW9uIG9mIHRoZSBpbnB1dCBpcyB1bmRlZmluZWQuCisgICAgICogPHA+CisgICAgICogVGhlIG1hdGNoZWQgYnVmZmVyIGlzIHVuY2hhbmdlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHNXaXRoU2hvcnRMZW5ndGgoRGF0YUlucHV0IGluLCBCeXRlQnVmZmVyIHRvTWF0Y2gpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaW50IGxlbmd0aCA9IHJlYWRTaG9ydExlbmd0aChpbik7CisgICAgICAgIGlmIChsZW5ndGggIT0gdG9NYXRjaC5yZW1haW5pbmcoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaW50IGxpbWl0ID0gdG9NYXRjaC5saW1pdCgpOworICAgICAgICBmb3IgKGludCBpID0gdG9NYXRjaC5wb3NpdGlvbigpOyBpIDwgbGltaXQ7ICsraSkKKyAgICAgICAgICAgIGlmICh0b01hdGNoLmdldChpKSAhPSBpbi5yZWFkQnl0ZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVhZEZ1bGx5KEZpbGVDaGFubmVsIGNoYW5uZWwsIEJ5dGVCdWZmZXIgZHN0LCBsb25nIHBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHdoaWxlIChkc3QuaGFzUmVtYWluaW5nKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCByZWFkID0gY2hhbm5lbC5yZWFkKGRzdCwgcG9zaXRpb24pOworICAgICAgICAgICAgaWYgKHJlYWQgPT0gLTEpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbigpOworICAgICAgICAgICAgcG9zaXRpb24gKz0gcmVhZDsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9Db2xsZWN0aW9uU2VyaWFsaXplci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvQ29sbGVjdGlvblNlcmlhbGl6ZXIuamF2YQppbmRleCA0ZjhlOGIwLi45ZGU2NDUwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9Db2xsZWN0aW9uU2VyaWFsaXplci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0NvbGxlY3Rpb25TZXJpYWxpemVyLmphdmEKQEAgLTQwLDcgKzQwLDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgPFY+IHZvaWQgc2VyaWFsaXplQ29sbGVjdGlvbihJVmVyc2lvbmVkU2VyaWFsaXplcjxWPiB2YWx1ZVNlcmlhbGl6ZXIsIENvbGxlY3Rpb248Vj4gdmFsdWVzLCBEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludCh2YWx1ZXMuc2l6ZSgpKTsKKyAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIodmFsdWVzLnNpemUoKSk7CiAgICAgICAgIGZvciAoViB2YWx1ZSA6IHZhbHVlcykKICAgICAgICAgICAgIHZhbHVlU2VyaWFsaXplci5zZXJpYWxpemUodmFsdWUsIG91dCwgdmVyc2lvbik7CiAgICAgfQpAQCAtNDgsMTQgKzQ4LDE0IEBACiAgICAgcHVibGljIHN0YXRpYyA8ViwgTCBleHRlbmRzIExpc3Q8Vj4gJiBSYW5kb21BY2Nlc3M+IHZvaWQgc2VyaWFsaXplTGlzdChJVmVyc2lvbmVkU2VyaWFsaXplcjxWPiB2YWx1ZVNlcmlhbGl6ZXIsIEwgdmFsdWVzLCBEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIGludCBzaXplID0gdmFsdWVzLnNpemUoKTsKLSAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHNpemUpOworICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihzaXplKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgc2l6ZSA7ICsraSkKICAgICAgICAgICAgIHZhbHVlU2VyaWFsaXplci5zZXJpYWxpemUodmFsdWVzLmdldChpKSwgb3V0LCB2ZXJzaW9uKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIDxLLCBWPiB2b2lkIHNlcmlhbGl6ZU1hcChJVmVyc2lvbmVkU2VyaWFsaXplcjxLPiBrZXlTZXJpYWxpemVyLCBJVmVyc2lvbmVkU2VyaWFsaXplcjxWPiB2YWx1ZVNlcmlhbGl6ZXIsIE1hcDxLLCBWPiBtYXAsIERhdGFPdXRwdXRQbHVzIG91dCwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KG1hcC5zaXplKCkpOworICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihtYXAuc2l6ZSgpKTsKICAgICAgICAgZm9yIChNYXAuRW50cnk8SywgVj4gZSA6IG1hcC5lbnRyeVNldCgpKQogICAgICAgICB7CiAgICAgICAgICAgICBrZXlTZXJpYWxpemVyLnNlcmlhbGl6ZShlLmdldEtleSgpLCBvdXQsIHZlcnNpb24pOwpAQCAtNjUsNyArNjUsNyBAQAogCiAgICAgcHVibGljIHN0YXRpYyA8ViwgQyBleHRlbmRzIENvbGxlY3Rpb248PyBzdXBlciBWPj4gQyBkZXNlcmlhbGl6ZUNvbGxlY3Rpb24oSVZlcnNpb25lZFNlcmlhbGl6ZXI8Vj4gc2VyaWFsaXplciwgSW50RnVuY3Rpb248Qz4gZmFjdG9yeSwgRGF0YUlucHV0UGx1cyBpbiwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgaW50IHNpemUgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgIGludCBzaXplID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgIEMgcmVzdWx0ID0gZmFjdG9yeS5hcHBseShzaXplKTsKICAgICAgICAgd2hpbGUgKHNpemUtLSA+IDApCiAgICAgICAgICAgICByZXN1bHQuYWRkKHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIHZlcnNpb24pKTsKQEAgLTc0LDcgKzc0LDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgPEssIFYsIE0gZXh0ZW5kcyBNYXA8SywgVj4+IE0gZGVzZXJpYWxpemVNYXAoSVZlcnNpb25lZFNlcmlhbGl6ZXI8Sz4ga2V5U2VyaWFsaXplciwgSVZlcnNpb25lZFNlcmlhbGl6ZXI8Vj4gdmFsdWVTZXJpYWxpemVyLCBJbnRGdW5jdGlvbjxNPiBmYWN0b3J5LCBEYXRhSW5wdXRQbHVzIGluLCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBpbnQgc2l6ZSA9IChpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgaW50IHNpemUgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKICAgICAgICAgTSByZXN1bHQgPSBmYWN0b3J5LmFwcGx5KHNpemUpOwogICAgICAgICB3aGlsZSAoc2l6ZS0tID4gMCkKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvQ29tcGFyYWJsZXMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0NvbXBhcmFibGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEyYWRlOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0NvbXBhcmFibGVzLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKKworLyoqCisgKiBVdGlsaXR5IG1ldGhvZHMgbGlua2VkIHRvIGNvbXBhcmluZyBjb21wYXJhYmxlIHZhbHVlcy4KKyAqLworcHVibGljIGNsYXNzIENvbXBhcmFibGVzCit7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiAyIGNvbXBhcmFibGUgdmFsdWVzLiBPbiB0aWVzLCByZXR1cm5zIHRoZSBmaXJzdCBhcmd1bWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIFQ+PiBUIG1heChUIGEsIFQgYikKKyAgICB7CisgICAgICAgIHJldHVybiBhLmNvbXBhcmVUbyhiKSA8IDAgPyBiIDogYTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG9mIDIgdmFsdWVzIGdpdmVuIGEgY29tcGFyYXRvciBvZiB0aG9zZSB2YWx1ZXMuIE9uIHRpZXMsIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPEMsIFQgZXh0ZW5kcyBDPiBUIG1heChUIGEsIFQgYiwgQ29tcGFyYXRvcjxDPiBjb21wYXJhdG9yKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IuY29tcGFyZShhLCBiKSA8IDAgPyBiIDogYTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIDIgY29tcGFyYWJsZSB2YWx1ZXMuIE9uIHRpZXMsIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgVD4+IFQgbWluKFQgYSwgVCBiKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGEuY29tcGFyZVRvKGIpID4gMCA/IGIgOiBhOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1pbmltdW0gb2YgMiB2YWx1ZXMgZ2l2ZW4gYSBjb21wYXJhdG9yIG9mIHRob3NlIHZhbHVlcy4gT24gdGllcywgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8QywgVCBleHRlbmRzIEM+IFQgbWluKFQgYSwgVCBiLCBDb21wYXJhdG9yPEM+IGNvbXBhcmF0b3IpCisgICAgeworICAgICAgICByZXR1cm4gY29tcGFyYXRvci5jb21wYXJlKGEsIGIpID4gMCA/IGIgOiBhOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9EaWFnbm9zdGljU25hcHNob3RTZXJ2aWNlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9EaWFnbm9zdGljU25hcHNob3RTZXJ2aWNlLmphdmEKaW5kZXggYWIyZDY3ZS4uMTY4Mjg1ZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvRGlhZ25vc3RpY1NuYXBzaG90U2VydmljZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0RpYWdub3N0aWNTbmFwc2hvdFNlcnZpY2UuamF2YQpAQCAtMjAsNiArMjAsOCBAQAogCiBpbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZTsKIGltcG9ydCBqYXZhLnRpbWUuZm9ybWF0LkRhdGVUaW1lRm9ybWF0dGVyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC4qOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOwogCkBAIC0yOSw2ICszMSw5IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Cb3VuZHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZTsKQEAgLTM2LDggKzQxLDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlSWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ESUFHTk9TVElDX1NOQVBTSE9UX0lOVEVSVkFMX05BTk9TOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwubmFub1RpbWU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRXhlY3V0b3JGYWN0b3J5Lkdsb2JhbC5leGVjdXRvckZhY3Rvcnk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5QYXJhbVR5cGUuU05BUFNIT1RfUkFOR0VTOwogCiAvKioKICAqIFByb3ZpZGVzIGEgbWVhbnMgdG8gdGFrZSBzbmFwc2hvdHMgd2hlbiB0cmlnZ2VyZWQgYnkgYW5vbWFsb3VzIGV2ZW50cyBvciB3aGVuIHRoZSBicmVha2luZyBvZiBpbnZhcmlhbnRzIGlzCkBAIC02OCw2ICs3NSw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBBSVJFRF9EQVRBX01JU01BVENIX1NOQVBTSE9UX1BSRUZJWCA9ICJSZXBhaXJlZERhdGFNaXNtYXRjaC0iOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERVUExJQ0FURV9ST1dTX0RFVEVDVEVEX1NOQVBTSE9UX1BSRUZJWCA9ICJEdXBsaWNhdGVSb3dzLSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9TTkFQU0hPVF9SQU5HRV9DT1VOVCA9IDEwMDsgLy8gb3RoZXJ3aXNlLCBzbmFwc2hvdCBldmVyeXRoaW5nCiAKICAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yIGV4ZWN1dG9yOwogCkBAIC03NiwzNCArODQsMzQgQEAKICAgICAgICAgdGhpcy5leGVjdXRvciA9IGV4ZWN1dG9yOwogICAgIH0KIAotICAgIC8vIElzc3VlIGF0IG1vc3QgMSBzbmFwc2hvdCByZXF1ZXN0IHBlciBtaW51dGUgZm9yIGFueSBnaXZlbiB0YWJsZS4KLSAgICAvLyBSZXBsaWNhcyB3aWxsIG9ubHkgY3JlYXRlIG9uZSBzbmFwc2hvdCBwZXIgZGF5LCBidXQgdGhpcyBzdG9wcyB1cwotICAgIC8vIGZyb20gc3dhbXBpbmcgdGhlIG5ldHdvcmsuCi0gICAgLy8gT3ZlcnJpZGFibGUgdmlhIHN5c3RlbSBwcm9wZXJ0eSBmb3IgdGVzdGluZy4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNOQVBTSE9UX0lOVEVSVkFMX05BTk9TID0gVGltZVVuaXQuTUlOVVRFUy50b05hbm9zKDEpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERhdGVUaW1lRm9ybWF0dGVyIERBVEVfRk9STUFUID0gRGF0ZVRpbWVGb3JtYXR0ZXIuQkFTSUNfSVNPX0RBVEU7CiAgICAgcHJpdmF0ZSBmaW5hbCBDb25jdXJyZW50SGFzaE1hcDxUYWJsZUlkLCBBdG9taWNMb25nPiBsYXN0U25hcHNob3RUaW1lcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CiAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVwYWlyZWREYXRhTWlzbWF0Y2goVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgSXRlcmFibGU8SW5ldEFkZHJlc3NBbmRQb3J0PiByZXBsaWNhcykKKyAgICB7CisgICAgICAgIHJlcGFpcmVkRGF0YU1pc21hdGNoKG1ldGFkYXRhLCByZXBsaWNhcywgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBhaXJlZERhdGFNaXNtYXRjaChUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBJdGVyYWJsZTxJbmV0QWRkcmVzc0FuZFBvcnQ+IHJlcGxpY2FzLCBMaXN0PFJhbmdlPFRva2VuPj4gcmFuZ2VzKQorICAgIHsKKyAgICAgICAgaW5zdGFuY2UubWF5YmVUcmlnZ2VyU25hcHNob3QobWV0YWRhdGEsIFJFUEFJUkVEX0RBVEFfTUlTTUFUQ0hfU05BUFNIT1RfUFJFRklYLCByZXBsaWNhcywgcmFuZ2VzKTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVwbGljYXRlUm93cyhUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBJdGVyYWJsZTxJbmV0QWRkcmVzc0FuZFBvcnQ+IHJlcGxpY2FzKQogICAgIHsKICAgICAgICAgaW5zdGFuY2UubWF5YmVUcmlnZ2VyU25hcHNob3QobWV0YWRhdGEsIERVUExJQ0FURV9ST1dTX0RFVEVDVEVEX1NOQVBTSE9UX1BSRUZJWCwgcmVwbGljYXMpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBhaXJlZERhdGFNaXNtYXRjaChUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBJdGVyYWJsZTxJbmV0QWRkcmVzc0FuZFBvcnQ+IHJlcGxpY2FzKQotICAgIHsKLSAgICAgICAgaW5zdGFuY2UubWF5YmVUcmlnZ2VyU25hcHNob3QobWV0YWRhdGEsIFJFUEFJUkVEX0RBVEFfTUlTTUFUQ0hfU05BUFNIT1RfUFJFRklYLCByZXBsaWNhcyk7Ci0gICAgfQotCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGlhZ25vc3RpY1NuYXBzaG90UmVxdWVzdChTbmFwc2hvdENvbW1hbmQgY29tbWFuZCkKICAgICB7CiAgICAgICAgIHJldHVybiBjb21tYW5kLnNuYXBzaG90X25hbWUuc3RhcnRzV2l0aChSRVBBSVJFRF9EQVRBX01JU01BVENIX1NOQVBTSE9UX1BSRUZJWCkKICAgICAgICAgICAgIHx8IGNvbW1hbmQuc25hcHNob3RfbmFtZS5zdGFydHNXaXRoKERVUExJQ0FURV9ST1dTX0RFVEVDVEVEX1NOQVBTSE9UX1BSRUZJWCk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNuYXBzaG90KFNuYXBzaG90Q29tbWFuZCBjb21tYW5kLCBJbmV0QWRkcmVzc0FuZFBvcnQgaW5pdGlhdG9yKQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzbmFwc2hvdChTbmFwc2hvdENvbW1hbmQgY29tbWFuZCwgTGlzdDxSYW5nZTxUb2tlbj4+IHJhbmdlcywgSW5ldEFkZHJlc3NBbmRQb3J0IGluaXRpYXRvcikKICAgICB7CiAgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudChpc0RpYWdub3N0aWNTbmFwc2hvdFJlcXVlc3QoY29tbWFuZCkpOwotICAgICAgICBpbnN0YW5jZS5tYXliZVNuYXBzaG90KGNvbW1hbmQsIGluaXRpYXRvcik7CisgICAgICAgIGluc3RhbmNlLm1heWJlU25hcHNob3QoY29tbWFuZCwgcmFuZ2VzLCBpbml0aWF0b3IpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNuYXBzaG90TmFtZShTdHJpbmcgcHJlZml4KQpAQCAtMTE5LDEwICsxMjcsMTUgQEAKIAogICAgIHByaXZhdGUgdm9pZCBtYXliZVRyaWdnZXJTbmFwc2hvdChUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBTdHJpbmcgcHJlZml4LCBJdGVyYWJsZTxJbmV0QWRkcmVzc0FuZFBvcnQ+IGVuZHBvaW50cykKICAgICB7CisgICAgICAgIG1heWJlVHJpZ2dlclNuYXBzaG90KG1ldGFkYXRhLCBwcmVmaXgsIGVuZHBvaW50cywgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBtYXliZVRyaWdnZXJTbmFwc2hvdChUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBTdHJpbmcgcHJlZml4LCBJdGVyYWJsZTxJbmV0QWRkcmVzc0FuZFBvcnQ+IGVuZHBvaW50cywgTGlzdDxSYW5nZTxUb2tlbj4+IHJhbmdlcykKKyAgICB7CiAgICAgICAgIGxvbmcgbm93ID0gbmFub1RpbWUoKTsKICAgICAgICAgQXRvbWljTG9uZyBjYWNoZWQgPSBsYXN0U25hcHNob3RUaW1lcy5jb21wdXRlSWZBYnNlbnQobWV0YWRhdGEuaWQsIHUgLT4gbmV3IEF0b21pY0xvbmcoMCkpOwogICAgICAgICBsb25nIGxhc3QgPSBjYWNoZWQuZ2V0KCk7Ci0gICAgICAgIGxvbmcgaW50ZXJ2YWwgPSBMb25nLmdldExvbmcoImNhc3NhbmRyYS5kaWFnbm9zdGljX3NuYXBzaG90X2ludGVydmFsX25hbm9zIiwgU05BUFNIT1RfSU5URVJWQUxfTkFOT1MpOworICAgICAgICBsb25nIGludGVydmFsID0gRElBR05PU1RJQ19TTkFQU0hPVF9JTlRFUlZBTF9OQU5PUy5nZXRMb25nKCk7CiAgICAgICAgIGlmIChub3cgLSBsYXN0ID4gaW50ZXJ2YWwgJiYgY2FjaGVkLmNvbXBhcmVBbmRTZXQobGFzdCwgbm93KSkKICAgICAgICAgewogICAgICAgICAgICAgTWVzc2FnZTxTbmFwc2hvdENvbW1hbmQ+IG1zZyA9IE1lc3NhZ2Uub3V0KFZlcmIuU05BUFNIT1RfUkVRLApAQCAtMTMwLDYgKzE0Myw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U25hcHNob3ROYW1lKHByZWZpeCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpOworCisgICAgICAgICAgICBpZiAoIXJhbmdlcy5pc0VtcHR5KCkgJiYgcmFuZ2VzLnNpemUoKSA8IE1BWF9TTkFQU0hPVF9SQU5HRV9DT1VOVCkKKyAgICAgICAgICAgICAgICBtc2cgPSBtc2cud2l0aFBhcmFtKFNOQVBTSE9UX1JBTkdFUywgcmFuZ2VzKTsKICAgICAgICAgICAgIGZvciAoSW5ldEFkZHJlc3NBbmRQb3J0IHJlcGxpY2EgOiBlbmRwb2ludHMpCiAgICAgICAgICAgICAgICAgTWVzc2FnaW5nU2VydmljZS5pbnN0YW5jZSgpLnNlbmQobXNnLCByZXBsaWNhKTsKICAgICAgICAgfQpAQCAtMTM5LDE5ICsxNTUsMjEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBtYXliZVNuYXBzaG90KFNuYXBzaG90Q29tbWFuZCBjb21tYW5kLCBJbmV0QWRkcmVzc0FuZFBvcnQgaW5pdGlhdG9yKQorICAgIHByaXZhdGUgdm9pZCBtYXliZVNuYXBzaG90KFNuYXBzaG90Q29tbWFuZCBjb21tYW5kLCBMaXN0PFJhbmdlPFRva2VuPj4gcmFuZ2VzLCBJbmV0QWRkcmVzc0FuZFBvcnQgaW5pdGlhdG9yKQogICAgIHsKLSAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZShuZXcgRGlhZ25vc3RpY1NuYXBzaG90VGFzayhjb21tYW5kLCBpbml0aWF0b3IpKTsKKyAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZShuZXcgRGlhZ25vc3RpY1NuYXBzaG90VGFzayhjb21tYW5kLCByYW5nZXMsIGluaXRpYXRvcikpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERpYWdub3N0aWNTbmFwc2hvdFRhc2sgaW1wbGVtZW50cyBSdW5uYWJsZQogICAgIHsKICAgICAgICAgZmluYWwgU25hcHNob3RDb21tYW5kIGNvbW1hbmQ7CiAgICAgICAgIGZpbmFsIEluZXRBZGRyZXNzQW5kUG9ydCBmcm9tOworICAgICAgICBmaW5hbCBMaXN0PFJhbmdlPFRva2VuPj4gcmFuZ2VzOwogCi0gICAgICAgIERpYWdub3N0aWNTbmFwc2hvdFRhc2soU25hcHNob3RDb21tYW5kIGNvbW1hbmQsIEluZXRBZGRyZXNzQW5kUG9ydCBmcm9tKQorICAgICAgICBEaWFnbm9zdGljU25hcHNob3RUYXNrKFNuYXBzaG90Q29tbWFuZCBjb21tYW5kLCBMaXN0PFJhbmdlPFRva2VuPj4gcmFuZ2VzLCBJbmV0QWRkcmVzc0FuZFBvcnQgZnJvbSkKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDsKKyAgICAgICAgICAgIHRoaXMucmFuZ2VzID0gcmFuZ2VzOwogICAgICAgICAgICAgdGhpcy5mcm9tID0gZnJvbTsKICAgICAgICAgfQogCkBAIC0xODUsNyArMjAzLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC5rZXlzcGFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLmNvbHVtbl9mYW1pbHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC5zbmFwc2hvdF9uYW1lKTsKLSAgICAgICAgICAgICAgICBjZnMuc25hcHNob3QoY29tbWFuZC5zbmFwc2hvdF9uYW1lKTsKKworICAgICAgICAgICAgICAgIGlmIChyYW5nZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICBjZnMuc25hcHNob3QoY29tbWFuZC5zbmFwc2hvdF9uYW1lKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjZnMuc25hcHNob3QoY29tbWFuZC5zbmFwc2hvdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNzdGFibGUpIC0+IGNoZWNrSW50ZXJzZWN0aW9uKHJhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmZpcnN0LmdldFRva2VuKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5sYXN0LmdldFRva2VuKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCiAgICAgICAgICAgICB7CkBAIC0xOTYsNCArMjI0LDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrSW50ZXJzZWN0aW9uKExpc3Q8UmFuZ2U8VG9rZW4+PiBub3JtYWxpemVkUmFuZ2VzLCBUb2tlbiBmaXJzdCwgVG9rZW4gbGFzdCkKKyAgICB7CisgICAgICAgIEJvdW5kczxUb2tlbj4gYm91bmRzID0gbmV3IEJvdW5kczw+KGZpcnN0LCBsYXN0KTsKKyAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRSYW5nZXMuc3RyZWFtKCkuYW55TWF0Y2gocmFuZ2UgLT4gcmFuZ2UuaW50ZXJzZWN0cyhib3VuZHMpKTsKKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0ZCVXRpbGl0aWVzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9GQlV0aWxpdGllcy5qYXZhCmluZGV4IDZkMjEwY2UuLjkwODZkNmIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0ZCVXRpbGl0aWVzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvRkJVdGlsaXRpZXMuamF2YQpAQCAtMTcsNyArMTcsNiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzOwogCi0KIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKQEAgLTI3LDM3ICsyNiw0MiBAQAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEubmV0Lio7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZTsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGltZS5JbnN0YW50OwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5OYXZpZ2FibGVTZXQ7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOwogaW1wb3J0IGphdmEudXRpbC56aXAuQ2hlY2tzdW07Ci0KIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk5vbm51bGw7CiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuSm9pbmVyOwotCi1pbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLlNlcmlhbGl6YXRpb25GZWF0dXJlOwotaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhdHlwZS5qc3IzMTAuSmF2YVRpbWVNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUlucHV0U3RyZWFtUGx1czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVPdXRwdXRTdHJlYW1QbHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuKjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKLWltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uY29yZS5Kc29uRmFjdG9yeTsKLWltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuT2JqZWN0TWFwcGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1ZGl0LklBdWRpdExvZ2dlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLkFsbG93QWxsTmV0d29ya0F1dGhvcml6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5JQXV0aGVudGljYXRvcjsKQEAgLTY2LDcgKzcwLDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLklSb2xlTWFuYWdlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkxvY2FsUGFydGl0aW9uZXI7CkBAIC03NSw0MSArNzgsNDMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uSVZlcnNpb25lZFNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU3RhdHNDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5WYWxpZGF0aW9uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0QnVmZmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dEJ1ZmZlckZpeGVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZWN1cml0eS5JU3NsQ29udGV4dEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5GdXR1cmVDb21iaW5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlVuY2hlY2tlZEludGVycnVwdGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfQVZBSUxBQkxFX1BST0NFU1NPUlM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuR0lUX1NIQTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5MSU5FX1NFUEFSQVRPUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5PU19OQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJFTEVBU0VfVkVSU0lPTjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5UUklHR0VSU19ESVI7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVVNFUl9IT01FOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGUuV3JpdGVNb2RlLk9WRVJXUklURTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLmN1cnJlbnRUaW1lTWlsbGlzOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwubmFub1RpbWU7CiAKLQogcHVibGljIGNsYXNzIEZCVXRpbGl0aWVzCiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0TWFwcGVyIGpzb25NYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKG5ldyBKc29uRmFjdG9yeSgpKTsKLQogICAgIHN0YXRpYwogICAgIHsKICAgICAgICAgcHJldmVudElsbGVnYWxBY2Nlc3NXYXJuaW5ncygpOwotICAgICAgICBqc29uTWFwcGVyLnJlZ2lzdGVyTW9kdWxlKG5ldyBKYXZhVGltZU1vZHVsZSgpKTsKLSAgICAgICAganNvbk1hcHBlci5kaXNhYmxlKFNlcmlhbGl6YXRpb25GZWF0dXJlLldSSVRFX0RBVEVTX0FTX1RJTUVTVEFNUFMpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihGQlV0aWxpdGllcy5jbGFzcyk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5LTk9XTl9SRUxFQVNFX1ZFUlNJT04gPSAiVW5rbm93biI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5LTk9XTl9HSVRfU0hBID0gIlVua25vd24iOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRXTyA9IG5ldyBCaWdJbnRlZ2VyKCIyIik7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVFJJR0dFUl9ESVIgPSAidHJpZ2dlcnMiOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRVJBVElOR19TWVNURU0gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS50b0xvd2VyQ2FzZSgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVSQVRJTkdfU1lTVEVNID0gT1NfTkFNRS5nZXRTdHJpbmcoKS50b0xvd2VyQ2FzZSgpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0xpbnV4ID0gT1BFUkFUSU5HX1NZU1RFTS5jb250YWlucygibGludXgiKTsKIAogICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIEluZXRBZGRyZXNzIGxvY2FsSW5ldEFkZHJlc3M7CkBAIC0xMjEsNyArMTI2LDcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIFN0cmluZyBwcmV2aW91c1JlbGVhc2VWZXJzaW9uU3RyaW5nOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGF2YWlsYWJsZVByb2Nlc3NvcnMgPSBJbnRlZ2VyLmdldEludGVnZXIoImNhc3NhbmRyYS5hdmFpbGFibGVfcHJvY2Vzc29ycyIsIERhdGFiYXNlRGVzY3JpcHRvci5nZXRBdmFpbGFibGVQcm9jZXNzb3JzKCkpOworICAgIHByaXZhdGUgc3RhdGljIGludCBhdmFpbGFibGVQcm9jZXNzb3JzID0gQ0FTU0FORFJBX0FWQUlMQUJMRV9QUk9DRVNTT1JTLmdldEludChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0QXZhaWxhYmxlUHJvY2Vzc29ycygpKTsKIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBdmFpbGFibGVQcm9jZXNzb3JzKGludCB2YWx1ZSkKICAgICB7CkBAIC0xMzgsNiArMTQzLDggQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9VTlNJR05FRF9TSE9SVCA9IDB4RkZGRjsKIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTTV9CWVRFQ09ERV9WRVJTSU9OID0gT3Bjb2Rlcy5BU005OworCiAgICAgcHVibGljIHN0YXRpYyBNZXNzYWdlRGlnZXN0IG5ld01lc3NhZ2VEaWdlc3QoU3RyaW5nIGFsZ29yaXRobSkKICAgICB7CiAgICAgICAgIHRyeQpAQCAtMzkxLDkgKzM5OCw5IEBACiAgICAgcHVibGljIHN0YXRpYyBGaWxlIGNhc3NhbmRyYVRyaWdnZXJEaXIoKQogICAgIHsKICAgICAgICAgRmlsZSB0cmlnZ2VyRGlyID0gbnVsbDsKLSAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnRyaWdnZXJzX2RpciIpICE9IG51bGwpCisgICAgICAgIGlmIChUUklHR0VSU19ESVIuZ2V0U3RyaW5nKCkgIT0gbnVsbCkKICAgICAgICAgewotICAgICAgICAgICAgdHJpZ2dlckRpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnRyaWdnZXJzX2RpciIpKTsKKyAgICAgICAgICAgIHRyaWdnZXJEaXIgPSBuZXcgRmlsZShUUklHR0VSU19ESVIuZ2V0U3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewpAQCAtNDE5LDI2ICs0MjYsNDIgQEAKICAgICAgICAgcmV0dXJuIHByZXZpb3VzUmVsZWFzZVZlcnNpb25TdHJpbmc7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVsZWFzZVZlcnNpb25TdHJpbmcoKQorICAgIHByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgZ2V0VmVyc2lvblByb3BlcnRpZXMoKQogICAgIHsKICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpbiA9IEZCVXRpbGl0aWVzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgib3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL3ZlcnNpb24ucHJvcGVydGllcyIpKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoaW4gPT0gbnVsbCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEucmVsZWFzZVZlcnNpb24iLCBVTktOT1dOX1JFTEVBU0VfVkVSU0lPTik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICAgICAgIHByb3BzLmxvYWQoaW4pOwotICAgICAgICAgICAgcmV0dXJuIHByb3BzLmdldFByb3BlcnR5KCJDYXNzYW5kcmFWZXJzaW9uIik7CisgICAgICAgICAgICByZXR1cm4gcHJvcHM7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQogICAgICAgICB7CiAgICAgICAgICAgICBKVk1TdGFiaWxpdHlJbnNwZWN0b3IuaW5zcGVjdFRocm93YWJsZShlKTsKICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJVbmFibGUgdG8gbG9hZCB2ZXJzaW9uLnByb3BlcnRpZXMiLCBlKTsKLSAgICAgICAgICAgIHJldHVybiAiZGVidWcgdmVyc2lvbiI7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlbGVhc2VWZXJzaW9uU3RyaW5nKCkKKyAgICB7CisgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBnZXRWZXJzaW9uUHJvcGVydGllcygpOworICAgICAgICBpZiAocHJvcHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBSRUxFQVNFX1ZFUlNJT04uZ2V0U3RyaW5nKFVOS05PV05fUkVMRUFTRV9WRVJTSU9OKTsKKyAgICAgICAgcmV0dXJuIHByb3BzLmdldFByb3BlcnR5KCJDYXNzYW5kcmFWZXJzaW9uIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R2l0U0hBKCkKKyAgICB7CisgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBnZXRWZXJzaW9uUHJvcGVydGllcygpOworICAgICAgICBpZiAocHJvcHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBHSVRfU0hBLmdldFN0cmluZyhVTktOT1dOX0dJVF9TSEEpOworICAgICAgICByZXR1cm4gcHJvcHMuZ2V0UHJvcGVydHkoIkdpdFNIQSIsIFVOS05PV05fR0lUX1NIQSk7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVsZWFzZVZlcnNpb25NYWpvcigpCiAgICAgewogICAgICAgICBTdHJpbmcgcmVsZWFzZVZlcnNpb24gPSBGQlV0aWxpdGllcy5nZXRSZWxlYXNlVmVyc2lvblN0cmluZygpOwpAQCAtNTg4LDExICs2MTEsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSVBhcnRpdGlvbmVyIG5ld1BhcnRpdGlvbmVyKERlc2NyaXB0b3IgZGVzYykgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBFbnVtU2V0PE1ldGFkYXRhVHlwZT4gdHlwZXMgPSBFbnVtU2V0Lm9mKE1ldGFkYXRhVHlwZS5WQUxJREFUSU9OLCBNZXRhZGF0YVR5cGUuSEVBREVSKTsKLSAgICAgICAgTWFwPE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFDb21wb25lbnQ+IHNzdGFibGVNZXRhZGF0YSA9IGRlc2MuZ2V0TWV0YWRhdGFTZXJpYWxpemVyKCkuZGVzZXJpYWxpemUoZGVzYywgdHlwZXMpOwotICAgICAgICBWYWxpZGF0aW9uTWV0YWRhdGEgdmFsaWRhdGlvbk1ldGFkYXRhID0gKFZhbGlkYXRpb25NZXRhZGF0YSkgc3N0YWJsZU1ldGFkYXRhLmdldChNZXRhZGF0YVR5cGUuVkFMSURBVElPTik7Ci0gICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIuQ29tcG9uZW50IGhlYWRlciA9IChTZXJpYWxpemF0aW9uSGVhZGVyLkNvbXBvbmVudCkgc3N0YWJsZU1ldGFkYXRhLmdldChNZXRhZGF0YVR5cGUuSEVBREVSKTsKLSAgICAgICAgcmV0dXJuIG5ld1BhcnRpdGlvbmVyKHZhbGlkYXRpb25NZXRhZGF0YS5wYXJ0aXRpb25lciwgT3B0aW9uYWwub2YoaGVhZGVyLmdldEtleVR5cGUoKSkpOworICAgICAgICBTdGF0c0NvbXBvbmVudCBzdGF0c0NvbXBvbmVudCA9IFN0YXRzQ29tcG9uZW50LmxvYWQoZGVzYywgTWV0YWRhdGFUeXBlLlZBTElEQVRJT04sIE1ldGFkYXRhVHlwZS5IRUFERVIpOworICAgICAgICByZXR1cm4gbmV3UGFydGl0aW9uZXIoc3RhdHNDb21wb25lbnQudmFsaWRhdGlvbk1ldGFkYXRhKCkucGFydGl0aW9uZXIsIE9wdGlvbmFsLm9mKHN0YXRzQ29tcG9uZW50LnNlcmlhbGl6YXRpb25IZWFkZXIoKS5nZXRLZXlUeXBlKCkpKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIElQYXJ0aXRpb25lciBuZXdQYXJ0aXRpb25lcihTdHJpbmcgcGFydGl0aW9uZXJDbGFzc05hbWUpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCkBAIC04MDcsNTggKzgyNyw2IEBACiAgICAgICAgIHJldHVybiBuZXcgV3JhcHBlZENsb3NlYWJsZUl0ZXJhdG9yPFQ+KGl0ZXJhdG9yKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZnJvbUpzb25NYXAoU3RyaW5nIGpzb24pCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGpzb25NYXBwZXIucmVhZFZhbHVlKGpzb24sIE1hcC5jbGFzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZnJvbUpzb25MaXN0KFN0cmluZyBqc29uKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBqc29uTWFwcGVyLnJlYWRWYWx1ZShqc29uLCBMaXN0LmNsYXNzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBqc29uKE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGpzb25NYXBwZXIud3JpdGVWYWx1ZUFzU3RyaW5nKG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZVRvSnNvbkZpbGUoT2JqZWN0IG9iamVjdCwgRmlsZSBvdXRwdXRGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeSAoRmlsZU91dHB1dFN0cmVhbVBsdXMgb3V0ID0gb3V0cHV0RmlsZS5uZXdPdXRwdXRTdHJlYW0oT1ZFUldSSVRFKSkKLSAgICAgICAgewotICAgICAgICAgICAganNvbk1hcHBlci53cml0ZVZhbHVlKChPdXRwdXRTdHJlYW0pIG91dCwgb2JqZWN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgZGVzZXJpYWxpemVGcm9tSnNvbkZpbGUoQ2xhc3M8VD4gdENsYXNzLCBGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW1QbHVzIGluID0gZmlsZS5uZXdJbnB1dFN0cmVhbSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4ganNvbk1hcHBlci5yZWFkVmFsdWUoKElucHV0U3RyZWFtKSBpbiwgdENsYXNzKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXR0eVByaW50TWVtb3J5KGxvbmcgc2l6ZSkKICAgICB7CiAgICAgICAgIHJldHVybiBwcmV0dHlQcmludE1lbW9yeShzaXplLCBmYWxzZSk7CkBAIC0xMTQxLDQgKzExMDksMzAgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICAgICB9Ci19CisKKyAgICBAU2FmZVZhcmFyZ3MKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBJbW11dGFibGVMaXN0PFQ+IGltbXV0YWJsZUxpc3RXaXRoRmlsdGVyZWROdWxscyhULi4uIHZhbHVlcykKKyAgICB7CisgICAgICAgIEltbXV0YWJsZUxpc3QuQnVpbGRlcjxUPiBidWlsZGVyID0gSW1tdXRhYmxlTGlzdC5idWlsZGVyV2l0aEV4cGVjdGVkU2l6ZSh2YWx1ZXMubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZXNbaV0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFkZCh2YWx1ZXNbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlUXVpZXRseShPYmplY3QgbykKKyAgICB7CisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBBdXRvQ2xvc2VhYmxlKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgICgoQXV0b0Nsb3NlYWJsZSkgbykuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCJDbG9zaW5nIHt9IGhhZCBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbiIsIG8sIGUpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0ZpbHRlckZhY3RvcnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0ZpbHRlckZhY3RvcnkuamF2YQppbmRleCA0Y2YwY2JmLi42Mjc2YTNhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9GaWx0ZXJGYWN0b3J5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvRmlsdGVyRmFjdG9yeS5qYXZhCkBAIC0xNywxNSArMTcsMTkgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlsczsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlJlZjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5vYnMuSUJpdFNldDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5vYnMuT2ZmSGVhcEJpdFNldDsKIAogcHVibGljIGNsYXNzIEZpbHRlckZhY3RvcnkKIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElGaWx0ZXIgQWx3YXlzUHJlc2VudCA9IG5ldyBBbHdheXNQcmVzZW50RmlsdGVyKCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJRmlsdGVyIEFsd2F5c1ByZXNlbnQgPSBBbHdheXNQcmVzZW50RmlsdGVyLmluc3RhbmNlOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEZpbHRlckZhY3RvcnkuY2xhc3MpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQklUU0VUX0VYQ0VTUyA9IDIwOwpAQCAtNTcsNyArNjEsNyBAQAogICAgIHsKICAgICAgICAgYXNzZXJ0IG1heEZhbHNlUG9zUHJvYmFiaWxpdHkgPD0gMS4wIDogIkludmFsaWQgcHJvYmFiaWxpdHkiOwogICAgICAgICBpZiAobWF4RmFsc2VQb3NQcm9iYWJpbGl0eSA9PSAxLjApCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFsd2F5c1ByZXNlbnRGaWx0ZXIoKTsKKyAgICAgICAgICAgIHJldHVybiBGaWx0ZXJGYWN0b3J5LkFsd2F5c1ByZXNlbnQ7CiAgICAgICAgIGludCBidWNrZXRzUGVyRWxlbWVudCA9IEJsb29tQ2FsY3VsYXRpb25zLm1heEJ1Y2tldHNQZXJFbGVtZW50KG51bUVsZW1lbnRzKTsKICAgICAgICAgQmxvb21DYWxjdWxhdGlvbnMuQmxvb21TcGVjaWZpY2F0aW9uIHNwZWMgPSBCbG9vbUNhbGN1bGF0aW9ucy5jb21wdXRlQmxvb21TcGVjKGJ1Y2tldHNQZXJFbGVtZW50LCBtYXhGYWxzZVBvc1Byb2JhYmlsaXR5KTsKICAgICAgICAgcmV0dXJuIGNyZWF0ZUZpbHRlcihzcGVjLkssIG51bUVsZW1lbnRzLCBzcGVjLmJ1Y2tldHNQZXJFbGVtZW50KTsKQEAgLTcwLDQgKzc0LDU2IEBACiAgICAgICAgIElCaXRTZXQgYml0c2V0ID0gbmV3IE9mZkhlYXBCaXRTZXQobnVtQml0cyk7CiAgICAgICAgIHJldHVybiBuZXcgQmxvb21GaWx0ZXIoaGFzaCwgYml0c2V0KTsKICAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBbHdheXNQcmVzZW50RmlsdGVyIGltcGxlbWVudHMgSUZpbHRlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBbHdheXNQcmVzZW50RmlsdGVyIGluc3RhbmNlID0gbmV3IEFsd2F5c1ByZXNlbnRGaWx0ZXIoKTsKKworICAgICAgICBwcml2YXRlIEFsd2F5c1ByZXNlbnRGaWx0ZXIoKSB7IH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ByZXNlbnQoRmlsdGVyS2V5IGtleSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGQoRmlsdGVyS2V5IGtleSkgeyB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7IH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsgfQorCisgICAgICAgIHB1YmxpYyBJRmlsdGVyIHNoYXJlZENvcHkoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUaHJvd2FibGUgY2xvc2UoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkVG8oUmVmLklkZW50aXR5Q29sbGVjdGlvbiBpZGVudGl0aWVzKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBzZXJpYWxpemVkU2l6ZShib29sZWFuIG9sZFNlcmlhbGl6YXRpb25Gb3JtYXQpIHsgcmV0dXJuIDA7IH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKERhdGFPdXRwdXRTdHJlYW1QbHVzIG91dCwgYm9vbGVhbiBvbGRTZXJpYWxpemF0aW9uRm9ybWF0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm8tb3AKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBvZmZIZWFwU2l6ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzSW5mb3JtYXRpdmUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9HdWlkR2VuZXJhdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9HdWlkR2VuZXJhdG9yLmphdmEKaW5kZXggNDY4NDNiNC4uZTA2MjcwZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvR3VpZEdlbmVyYXRvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0d1aWRHZW5lcmF0b3IuamF2YQpAQCAtMzQsNyArMzQsNyBAQAogICAgIHsKICAgICAgICAgaWYgKCFKQVZBX1NFQ1VSSVRZX0VHRC5pc1ByZXNlbnQoKSkKICAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZhLnNlY3VyaXR5LmVnZCIsICJmaWxlOi9kZXYvdXJhbmRvbSIpOworICAgICAgICAgICAgSkFWQV9TRUNVUklUWV9FR0Quc2V0U3RyaW5nKCJmaWxlOi9kZXYvdXJhbmRvbSIpOwogICAgICAgICB9CiAgICAgICAgIG15U2VjdXJlUmFuZCA9IG5ldyBTZWN1cmVSYW5kb20oKTsKICAgICAgICAgbG9uZyBzZWN1cmVJbml0aWFsaXplciA9IG15U2VjdXJlUmFuZC5uZXh0TG9uZygpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvSGVhcFV0aWxzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9IZWFwVXRpbHMuamF2YQppbmRleCBjMDkxMGQ4Li4zOGE2OTY5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9IZWFwVXRpbHMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9IZWFwVXRpbHMuamF2YQpAQCAtMjIsMTUgKzIyLDI0IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEubGFuZy5tYW5hZ2VtZW50Lk1hbmFnZW1lbnRGYWN0b3J5OworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVN0b3JlOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Mb2NrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuQXJyYXlVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudGV4dC5TdHJCdWlsZGVyOwotCiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAoraW1wb3J0IGNvbS5zdW4ubWFuYWdlbWVudC5Ib3RTcG90RGlhZ25vc3RpY01YQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlBhdGhVdGlsczsKKwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRFbnYuSkFWQV9IT01FOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwuY3VycmVudFRpbWVNaWxsaXM7CiAKIC8qKgogICogVXRpbGl0eSB0byBsb2cgaGVhcCBoaXN0b2dyYW0uCkBAIC00MCw2ICs0OSw4IEBACiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEhlYXBVdGlscy5jbGFzcyk7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NrIERVTVBfTE9DSyA9IG5ldyBSZWVudHJhbnRMb2NrKCk7CisKICAgICAvKioKICAgICAgKiBHZW5lcmF0ZXMgYSBIRUFQIGhpc3RvZ3JhbSBpbiB0aGUgbG9nIGZpbGUuCiAgICAgICovCkBAIC03NCw2ICs4NSw3MiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEByZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSBjcmVhdGVkIGhlYXAgZHVtcCBmaWxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWF5YmVDcmVhdGVIZWFwRHVtcCgpCisgICAgeworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBvbmx5IG9uZSBoZWFwIGR1bXAgY2FuIGJlIGluIHByb2dyZXNzIGFjcm9zcyBhbGwgdGhyZWFkcywgYW5kIGFib3J0IGZvcgorICAgICAgICAvLyB0aHJlYWRzIHRoYXQgY2Fubm90IGltbWVkaWF0ZWx5IGFjcXVpcmUgdGhlIGxvY2ssIGFsbG93aW5nIHRoZW0gdG8gZmFpbCBub3JtYWxseS4KKyAgICAgICAgaWYgKERVTVBfTE9DSy50cnlMb2NrKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0RHVtcEhlYXBPblVuY2F1Z2h0RXhjZXB0aW9uKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNQmVhblNlcnZlciBzZXJ2ZXIgPSBNYW5hZ2VtZW50RmFjdG9yeS5nZXRQbGF0Zm9ybU1CZWFuU2VydmVyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgUGF0aCBhYnNvbHV0ZUJhc2VQYXRoID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldEhlYXBEdW1wUGF0aCgpOworICAgICAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBwb2ludCB3aXRoIHRoaXMgdmFsdWUgbnVsbCBhcyB3ZSBpbml0aWFsaXplIHRoZSBib29sIG9ubHkgYWZ0ZXIgY29uZmlybWluZworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgLVhYIHBhcmFtIC8gLnlhbWwgY29uZiBpcyBwcmVzZW50IG9uIGluaXRpYWwgaW5pdCBhbmQgdGhlIEpNWCBlbnRyeSBwb2ludCwgYnV0IHN0aWxsIHdvcnRoIGNoZWNraW5nLgorICAgICAgICAgICAgICAgICAgICBpZiAoYWJzb2x1dGVCYXNlUGF0aCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0RHVtcEhlYXBPblVuY2F1Z2h0RXhjZXB0aW9uKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIGhlYXAgZHVtcCB1bmxlc3MgLVhYOkhlYXBEdW1wUGF0aCBvciBjYXNzYW5kcmEueWFtbDpoZWFwX2R1bXBfcGF0aCBpcyBzcGVjaWZpZWQuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBsb25nIG1heE1lbW9yeUJ5dGVzID0gUnVudGltZS5nZXRSdW50aW1lKCkubWF4TWVtb3J5KCk7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgZnJlZVNwYWNlQnl0ZXMgPSBQYXRoVXRpbHMudHJ5R2V0U3BhY2UoYWJzb2x1dGVCYXNlUGF0aCwgRmlsZVN0b3JlOjpnZXRVbmFsbG9jYXRlZFNwYWNlKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBBYm9ydCBpZiB0aGVyZSBpc24ndCBlbm91Z2ggcm9vbSBvbiB0aGUgdGFyZ2V0IGRpc2sgdG8gZHVtcCB0aGUgZW50aXJlIGhlYXAgYW5kIHRoZW4gY29weSBpdC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyZWVTcGFjZUJ5dGVzIDwgMiAqIG1heE1lbW9yeUJ5dGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBhbGxvY2F0ZWQgc3BhY2UgZm9yIGEgaGVhcCBkdW1wIHNuYXBzaG90LiBUaGVyZSBhcmUgb25seSAiICsgZnJlZVNwYWNlQnl0ZXMgKyAiIGJ5dGVzIGZyZWUgYXQgIiArIGFic29sdXRlQmFzZVBhdGggKyAnLicpOworCisgICAgICAgICAgICAgICAgICAgIEhvdFNwb3REaWFnbm9zdGljTVhCZWFuIG14QmVhbiA9IE1hbmFnZW1lbnRGYWN0b3J5Lm5ld1BsYXRmb3JtTVhCZWFuUHJveHkoc2VydmVyLCAiY29tLnN1bi5tYW5hZ2VtZW50OnR5cGU9SG90U3BvdERpYWdub3N0aWMiLCBIb3RTcG90RGlhZ25vc3RpY01YQmVhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IFN0cmluZy5mb3JtYXQoInBpZCVzLWVwb2NoJXMuaHByb2YiLCBIZWFwVXRpbHMuZ2V0UHJvY2Vzc0lkKCkudG9TdHJpbmcoKSwgY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdWxsUGF0aCA9IEZpbGUuZ2V0UGF0aChhYnNvbHV0ZUJhc2VQYXRoLnRvU3RyaW5nKCksIGZpbGVuYW1lKS50b1N0cmluZygpOworCisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJXcml0aW5nIGhlYXAgZHVtcCB0byB7fSBvbiBwYXJ0aXRpb24gdy8ge30gZnJlZSBieXRlcy4uLiIsIGFic29sdXRlQmFzZVBhdGgsIGZyZWVTcGFjZUJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgbXhCZWFuLmR1bXBIZWFwKGZ1bGxQYXRoLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJIZWFwIGR1bXAgd3JpdHRlbiB0byB7fSIsIGZ1bGxQYXRoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIGZ1cnRoZXIgaGVhcCBkdW1wIGNyZWF0aW9ucyB1bnRpbCBleHBsaWNpdGx5IHJlLWVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXREdW1wSGVhcE9uVW5jYXVnaHRFeGNlcHRpb24oZmFsc2UpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdWxsUGF0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJIZWFwIGR1bXAgY3JlYXRpb24gb24gdW5jYXVnaHQgZXhjZXB0aW9ucyBpcyBkaXNhYmxlZC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIlVuYWJsZSB0byBjcmVhdGUgaGVhcCBkdW1wLiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERVTVBfTE9DSy51bmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiSGVhcCBkdW1wIGNyZWF0aW9uIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MuIFJlcXVlc3QgYWJvcnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHJpZXZlIHRoZSBwYXRoIHRvIHRoZSBKQ01EIGV4ZWN1dGFibGUuCiAgICAgICogQHJldHVybiB0aGUgcGF0aCB0byB0aGUgSkNNRCBleGVjdXRhYmxlIG9yIG51bGwgaWYgaXQgY2Fubm90IGJlIGZvdW5kLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvSUZpbHRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvSUZpbHRlci5qYXZhCmluZGV4IGI1ZWIyYzQuLmYwNmFlNmUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0lGaWx0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9JRmlsdGVyLmphdmEKQEAgLTE3LDE0ICsxNywyNiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzOwogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFN0cmVhbVBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5TaGFyZWRDbG9zZWFibGU7CiAKIHB1YmxpYyBpbnRlcmZhY2UgSUZpbHRlciBleHRlbmRzIFNoYXJlZENsb3NlYWJsZQogewogICAgIGludGVyZmFjZSBGaWx0ZXJLZXkKICAgICB7Ci0gICAgICAgIC8qKiBQbGFjZXMgdGhlIG11cm11cjMgaGFzaCBvZiB0aGUga2V5IGluIHRoZSBnaXZlbiBsb25nIGFycmF5IG9mIHNpemUgYXQgbGVhc3QgdHdvLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogUGxhY2VzIHRoZSBtdXJtdXIzIGhhc2ggb2YgdGhlIGtleSBpbiB0aGUgZ2l2ZW4gbG9uZyBhcnJheSBvZiBzaXplIGF0IGxlYXN0IHR3by4KKyAgICAgICAgICovCiAgICAgICAgIHZvaWQgZmlsdGVySGFzaChsb25nW10gZGVzdCk7CisKKyAgICAgICAgZGVmYXVsdCBzaG9ydCBmaWx0ZXJIYXNoTG93ZXJCaXRzKCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZ1tdIGRlc3QgPSBuZXcgbG9uZ1syXTsKKyAgICAgICAgICAgIGZpbHRlckhhc2goZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gKHNob3J0KSBkZXN0WzFdOworICAgICAgICB9CiAgICAgfQogCiAgICAgdm9pZCBhZGQoRmlsdGVyS2V5IGtleSk7CkBAIC0zMyw3ICs0NSw5IEBACiAKICAgICB2b2lkIGNsZWFyKCk7CiAKLSAgICBsb25nIHNlcmlhbGl6ZWRTaXplKCk7CisgICAgbG9uZyBzZXJpYWxpemVkU2l6ZShib29sZWFuIG9sZFNlcmlhbGl6YXRpb25Gb3JtYXQpOworCisgICAgdm9pZCBzZXJpYWxpemUoRGF0YU91dHB1dFN0cmVhbVBsdXMgb3V0LCBib29sZWFuIG9sZFNlcmlhbGl6YXRpb25Gb3JtYXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIHZvaWQgY2xvc2UoKTsKIApAQCAtNDEsNyArNTUsMTAgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGFtb3VudCBvZiBtZW1vcnkgaW4gYnl0ZXMgdXNlZCBvZmYgaGVhcC4KKyAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgaW4gYnl0ZXMgdXNlZCBvZmYgaGVhcAogICAgICAqLwogICAgIGxvbmcgb2ZmSGVhcFNpemUoKTsKKworICAgIGJvb2xlYW4gaXNJbmZvcm1hdGl2ZSgpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvSk1YU2VydmVyVXRpbHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0pNWFNlcnZlclV0aWxzLmphdmEKaW5kZXggNDlmZjVhMC4uNDVjYWY2ZSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvSk1YU2VydmVyVXRpbHMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9KTVhTZXJ2ZXJVdGlscy5qYXZhCkBAIC01Niw2ICs1Niw4IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLmpteC5BdXRoZW50aWNhdGlvblByb3h5OwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX0pNWF9BVVRIT1JJWkVSOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9KTVhfUkVNT1RFX0xPR0lOX0NPTkZJRzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DT01fU1VOX01BTkFHRU1FTlRfSk1YUkVNT1RFX0FDQ0VTU19GSUxFOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNPTV9TVU5fTUFOQUdFTUVOVF9KTVhSRU1PVEVfQVVUSEVOVElDQVRFOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNPTV9TVU5fTUFOQUdFTUVOVF9KTVhSRU1PVEVfUEFTU1dPUkRfRklMRTsKQEAgLTY0LDYgKzY2LDkgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DT01fU1VOX01BTkFHRU1FTlRfSk1YUkVNT1RFX1NTTF9FTkFCTEVEX0NJUEhFUl9TVUlURVM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09NX1NVTl9NQU5BR0VNRU5UX0pNWFJFTU9URV9TU0xfRU5BQkxFRF9QUk9UT0NPTFM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09NX1NVTl9NQU5BR0VNRU5UX0pNWFJFTU9URV9TU0xfTkVFRF9DTElFTlRfQVVUSDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5KQVZBWF9STUlfU1NMX0NMSUVOVF9FTkFCTEVEX0NJUEhFUl9TVUlURVM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSkFWQVhfUk1JX1NTTF9DTElFTlRfRU5BQkxFRF9QUk9UT0NPTFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSkFWQV9STUlfU0VSVkVSX0hPU1ROQU1FOwogCiBwdWJsaWMgY2xhc3MgSk1YU2VydmVyVXRpbHMKIHsKQEAgLTg0LDcgKzg5LDcgQEAKICAgICAgICAgaWYgKGxvY2FsKQogICAgICAgICB7CiAgICAgICAgICAgICBzZXJ2ZXJBZGRyZXNzID0gSW5ldEFkZHJlc3MuZ2V0TG9vcGJhY2tBZGRyZXNzKCk7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmEucm1pLnNlcnZlci5ob3N0bmFtZSIsIHNlcnZlckFkZHJlc3MuZ2V0SG9zdEFkZHJlc3MoKSk7CisgICAgICAgICAgICBKQVZBX1JNSV9TRVJWRVJfSE9TVE5BTUUuc2V0U3RyaW5nKHNlcnZlckFkZHJlc3MuZ2V0SG9zdEFkZHJlc3MoKSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBDb25maWd1cmUgdGhlIFJNSSBjbGllbnQgJiBzZXJ2ZXIgc29ja2V0IGZhY3RvcmllcywgaW5jbHVkaW5nIFNTTCBjb25maWcuCkBAIC0xNjgsNyArMTczLDcgQEAKICAgICAgICAgLy8gYmVmb3JlIGNyZWF0aW5nIHRoZSBhdXRoZW50aWNhdG9yLiBJZiBubyBwYXNzd29yZCBmaWxlIGhhcyBiZWVuCiAgICAgICAgIC8vIGV4cGxpY2l0bHkgc2V0LCBpdCdzIHJlYWQgZnJvbSB0aGUgZGVmYXVsdCBsb2NhdGlvbgogICAgICAgICAvLyAkSkFWQV9IT01FL2xpYi9tYW5hZ2VtZW50L2pteHJlbW90ZS5wYXNzd29yZAotICAgICAgICBTdHJpbmcgY29uZmlnRW50cnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5qbXgucmVtb3RlLmxvZ2luLmNvbmZpZyIpOworICAgICAgICBTdHJpbmcgY29uZmlnRW50cnkgPSBDQVNTQU5EUkFfSk1YX1JFTU9URV9MT0dJTl9DT05GSUcuZ2V0U3RyaW5nKCk7CiAgICAgICAgIGlmIChjb25maWdFbnRyeSAhPSBudWxsKQogICAgICAgICB7CiAgICAgICAgICAgICBlbnYucHV0KEpNWENvbm5lY3RvclNlcnZlci5BVVRIRU5USUNBVE9SLCBuZXcgQXV0aGVudGljYXRpb25Qcm94eShjb25maWdFbnRyeSkpOwpAQCAtMTk2LDcgKzIwMSw3IEBACiAgICAgICAgIC8vIGNhbiBiZSBzZXQgYXMgdGhlIEpNWENvbm5lY3RvclNlcnZlcidzIE1CZWFuU2VydmVyRm9yd2FyZGVyLgogICAgICAgICAvLyBJZiBubyBjdXN0b20gcHJveHkgaXMgc3VwcGxpZWQsIGNoZWNrIHN5c3RlbSBwcm9wZXJ0aWVzIGZvciB0aGUgbG9jYXRpb24gb2YgdGhlCiAgICAgICAgIC8vIHN0YW5kYXJkIGFjY2VzcyBmaWxlICYgc3Rhc2ggaXQgaW4gZW52Ci0gICAgICAgIFN0cmluZyBhdXRoelByb3h5Q2xhc3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5qbXguYXV0aG9yaXplciIpOworICAgICAgICBTdHJpbmcgYXV0aHpQcm94eUNsYXNzID0gQ0FTU0FORFJBX0pNWF9BVVRIT1JJWkVSLmdldFN0cmluZygpOwogICAgICAgICBpZiAoYXV0aHpQcm94eUNsYXNzICE9IG51bGwpCiAgICAgICAgIHsKICAgICAgICAgICAgIGZpbmFsIEludm9jYXRpb25IYW5kbGVyIGhhbmRsZXIgPSBGQlV0aWxpdGllcy5jb25zdHJ1Y3QoYXV0aHpQcm94eUNsYXNzLCAiSk1YIGF1dGh6IHByb3h5Iik7CkBAIC0yMjYsNyArMjMxLDcgQEAKICAgICAgICAgICAgIFN0cmluZyBwcm90b2NvbExpc3QgPSBDT01fU1VOX01BTkFHRU1FTlRfSk1YUkVNT1RFX1NTTF9FTkFCTEVEX1BST1RPQ09MUy5nZXRTdHJpbmcoKTsKICAgICAgICAgICAgIGlmIChwcm90b2NvbExpc3QgIT0gbnVsbCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4LnJtaS5zc2wuY2xpZW50LmVuYWJsZWRQcm90b2NvbHMiLCBwcm90b2NvbExpc3QpOworICAgICAgICAgICAgICAgIEpBVkFYX1JNSV9TU0xfQ0xJRU5UX0VOQUJMRURfUFJPVE9DT0xTLnNldFN0cmluZyhwcm90b2NvbExpc3QpOwogICAgICAgICAgICAgICAgIHByb3RvY29scyA9IFN0cmluZ1V0aWxzLnNwbGl0KHByb3RvY29sTGlzdCwgJywnKTsKICAgICAgICAgICAgIH0KIApAQCAtMjM0LDcgKzIzOSw3IEBACiAgICAgICAgICAgICBTdHJpbmcgY2lwaGVyTGlzdCA9IENPTV9TVU5fTUFOQUdFTUVOVF9KTVhSRU1PVEVfU1NMX0VOQUJMRURfQ0lQSEVSX1NVSVRFUy5nZXRTdHJpbmcoKTsKICAgICAgICAgICAgIGlmIChjaXBoZXJMaXN0ICE9IG51bGwpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5ybWkuc3NsLmNsaWVudC5lbmFibGVkQ2lwaGVyU3VpdGVzIiwgY2lwaGVyTGlzdCk7CisgICAgICAgICAgICAgICAgSkFWQVhfUk1JX1NTTF9DTElFTlRfRU5BQkxFRF9DSVBIRVJfU1VJVEVTLnNldFN0cmluZyhjaXBoZXJMaXN0KTsKICAgICAgICAgICAgICAgICBjaXBoZXJzID0gU3RyaW5nVXRpbHMuc3BsaXQoY2lwaGVyTGlzdCwgJywnKTsKICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvSlZNU3RhYmlsaXR5SW5zcGVjdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9KVk1TdGFiaWxpdHlJbnNwZWN0b3IuamF2YQppbmRleCAxZDNjMDlmLi5hMzk2ZWY5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9KVk1TdGFiaWxpdHlJbnNwZWN0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9KVk1TdGFiaWxpdHlJbnNwZWN0b3IuamF2YQpAQCAtNDYsNiArNDYsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5VbmNoZWNrZWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlBSSU5UX0hFQVBfSElTVE9HUkFNX09OX09VVF9PRl9NRU1PUllfRVJST1I7CisKIC8qKgogICogUmVzcG9uc2libGUgZm9yIGRlY2lkaW5nIHdoZXRoZXIgdG8ga2lsbCB0aGUgSlZNIGlmIGl0IGdldHMgaW4gYW4gInVuc3RhYmxlIiBzdGF0ZSAodGhpbmsgT09NKS4KICAqLwpAQCAtMTA1LDcgKzEwNyw3IEBACiAgICAgICAgIGJvb2xlYW4gaXNVbnN0YWJsZSA9IGZhbHNlOwogICAgICAgICBpZiAodCBpbnN0YW5jZW9mIE91dE9mTWVtb3J5RXJyb3IpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChCb29sZWFuLmdldEJvb2xlYW4oImNhc3NhbmRyYS5wcmludEhlYXBIaXN0b2dyYW1Pbk91dE9mTWVtb3J5RXJyb3IiKSkKKyAgICAgICAgICAgIGlmIChQUklOVF9IRUFQX0hJU1RPR1JBTV9PTl9PVVRfT0ZfTUVNT1JZX0VSUk9SLmdldEJvb2xlYW4oKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGF2b2lkIHByaW50aW5nIG11bHRpcGxlIHRpbWUgdGhlIGhlYXAgaGlzdG9ncmFtIGlmIG11bHRpcGxlIE9PTSBlcnJvcnMgaGFwcGVuIGluIGEgc2hvcnQKICAgICAgICAgICAgICAgICAvLyB0aW1lIHNwYW4uCkBAIC0xMzMsNiArMTM1LDkgQEAKICAgICAgICAgICAgIGlzVW5zdGFibGUgPSB0cnVlOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gQW55dGhpbmcgb3RoZXIgdGhhbiBhbiBPT00sIHdlIHNob3VsZCB0cnkgYW5kIGhlYXAgZHVtcCB0byBjYXB0dXJlIHdoYXQncyBnb2luZyBvbiBpZiBjb25maWd1cmVkIHRvIGRvIHNvCisgICAgICAgIEhlYXBVdGlscy5tYXliZUNyZWF0ZUhlYXBEdW1wKCk7CisKICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbikKICAgICAgICAgICAgIHRocm93IG5ldyBVbmNoZWNrZWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbigoSW50ZXJydXB0ZWRFeGNlcHRpb24pIHQpOwogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9Kc29uVXRpbHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0pzb25VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZGMxM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9Kc29uVXRpbHMuamF2YQpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlsczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlLkpzb25GYWN0b3J5OworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlLnV0aWwuQnVmZmVyUmVjeWNsZXJzOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLk9iamVjdFdyaXRlcjsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuU2VyaWFsaXphdGlvbkZlYXR1cmU7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGF0eXBlLmpzcjMxMC5KYXZhVGltZU1vZHVsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSW5wdXRTdHJlYW1QbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZU91dHB1dFN0cmVhbVBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGUuV3JpdGVNb2RlLk9WRVJXUklURTsKKworcHVibGljIGZpbmFsIGNsYXNzIEpzb25VdGlscworeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0TWFwcGVyIEpTT05fT0JKRUNUX01BUFBFUiA9IG5ldyBPYmplY3RNYXBwZXIobmV3IEpzb25GYWN0b3J5KCkpOyAvLyBjaGVja3N0eWxlOiBwZXJtaXQgdGhpcyBpbnN0YW50aWF0aW9uCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RXcml0ZXIgSlNPTl9PQkpFQ1RfUFJFVFRZX1dSSVRFUjsKKworICAgIHN0YXRpYworICAgIHsKKyAgICAgICAgSlNPTl9PQkpFQ1RfTUFQUEVSLnJlZ2lzdGVyTW9kdWxlKG5ldyBKYXZhVGltZU1vZHVsZSgpKTsKKyAgICAgICAgSlNPTl9PQkpFQ1RfTUFQUEVSLmRpc2FibGUoU2VyaWFsaXphdGlvbkZlYXR1cmUuV1JJVEVfREFURVNfQVNfVElNRVNUQU1QUyk7CisgICAgICAgIEpTT05fT0JKRUNUX1BSRVRUWV9XUklURVIgPSBKU09OX09CSkVDVF9NQVBQRVIud3JpdGVyV2l0aERlZmF1bHRQcmV0dHlQcmludGVyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBKc29uVXRpbHMoKQorICAgIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdW90ZXMgc3RyaW5nIGNvbnRlbnRzIHVzaW5nIHN0YW5kYXJkIEpTT04gcXVvdGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBxdW90ZUFzSnNvblN0cmluZyhTdHJpbmcgcykKKyAgICB7CisgICAgICAgIC8vIEluIGZ1dHVyZSBzaG91bGQgdXBkYXRlIHRvIGRpcmVjdGx5IHVzZSBgSnNvblN0cmluZ0VuY29kZXIuZ2V0SW5zdGFuY2UoKWAgYnV0IGZvciBub3c6CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKEJ1ZmZlclJlY3ljbGVycy5nZXRKc29uU3RyaW5nRW5jb2RlcigpLnF1b3RlQXNTdHJpbmcocykpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGRlY29kZUpzb24oYnl0ZVtdIGpzb24pCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEpTT05fT0JKRUNUX01BUFBFUi5yZWFkVmFsdWUoanNvbiwgT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKCJFcnJvciBkZWNvZGluZyBKU09OIGJ5dGVzOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGRlY29kZUpzb24oU3RyaW5nIGpzb24pCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEpTT05fT0JKRUNUX01BUFBFUi5yZWFkVmFsdWUoanNvbiwgT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKCJFcnJvciBkZWNvZGluZyBKU09OIHN0cmluZzogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSB3cml0ZUFzSnNvbkJ5dGVzKE9iamVjdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSlNPTl9PQkpFQ1RfTUFQUEVSLndyaXRlVmFsdWVBc0J5dGVzKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKCJFcnJvciB3cml0aW5nIGFzIEpTT046ICIgKyBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgd3JpdGVBc0pzb25TdHJpbmcoT2JqZWN0IHZhbHVlKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBKU09OX09CSkVDVF9NQVBQRVIud3JpdGVWYWx1ZUFzU3RyaW5nKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKCJFcnJvciB3cml0aW5nIGFzIEpTT046ICIgKyBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgd3JpdGVBc1ByZXR0eUpzb25TdHJpbmcoT2JqZWN0IHZhbHVlKSB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBKU09OX09CSkVDVF9QUkVUVFlfV1JJVEVSLndyaXRlVmFsdWVBc1N0cmluZyh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiRXJyb3Igd3JpdGluZyBhcyBKU09OOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IE1hcDxTdHJpbmcsIFQ+IGZyb21Kc29uTWFwKFN0cmluZyBqc29uKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBKU09OX09CSkVDVF9NQVBQRVIucmVhZFZhbHVlKGpzb24sIE1hcC5jbGFzcyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiRXJyb3IgZGVjb2RpbmcgSlNPTiBzdHJpbmc6ICIgKyBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8VD4gTWFwPFN0cmluZywgVD4gZnJvbUpzb25NYXAoYnl0ZVtdIGJ5dGVzKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBKU09OX09CSkVDVF9NQVBQRVIucmVhZFZhbHVlKGJ5dGVzLCBNYXAuY2xhc3MpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oIkVycm9yIGRlY29kaW5nIEpTT046ICIgKyBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZnJvbUpzb25MaXN0KGJ5dGVbXSBieXRlcykKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSlNPTl9PQkpFQ1RfTUFQUEVSLnJlYWRWYWx1ZShieXRlcywgTGlzdC5jbGFzcyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiRXJyb3IgZGVjb2RpbmcgSlNPTjogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBmcm9tSnNvbkxpc3QoU3RyaW5nIGpzb24pCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEpTT05fT0JKRUNUX01BUFBFUi5yZWFkVmFsdWUoanNvbiwgTGlzdC5jbGFzcyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiRXJyb3IgZGVjb2RpbmcgSlNPTjogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VyaWFsaXplVG9Kc29uRmlsZShPYmplY3Qgb2JqZWN0LCBGaWxlIG91dHB1dEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChGaWxlT3V0cHV0U3RyZWFtUGx1cyBvdXQgPSBvdXRwdXRGaWxlLm5ld091dHB1dFN0cmVhbShPVkVSV1JJVEUpKQorICAgICAgICB7CisgICAgICAgICAgICBKU09OX09CSkVDVF9QUkVUVFlfV1JJVEVSLndyaXRlVmFsdWUoKE91dHB1dFN0cmVhbSkgb3V0LCBvYmplY3QpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCBkZXNlcmlhbGl6ZUZyb21Kc29uRmlsZShDbGFzczxUPiB0Q2xhc3MsIEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKEZpbGVJbnB1dFN0cmVhbVBsdXMgaW4gPSBmaWxlLm5ld0lucHV0U3RyZWFtKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBKU09OX09CSkVDVF9NQVBQRVIucmVhZFZhbHVlKChJbnB1dFN0cmVhbSkgaW4sIHRDbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVzIHVucXVvdGluZyBhbmQgY2FzZS1pbnNlbnNpdGl2aXR5IGluIG1hcCBrZXlzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBoYW5kbGVDYXNlU2Vuc2l0aXZpdHkoTWFwPFN0cmluZywgT2JqZWN0PiB2YWx1ZU1hcCkKKyAgICB7CisgICAgICAgIGZvciAoU3RyaW5nIG1hcEtleSA6IG5ldyBBcnJheUxpc3Q8Pih2YWx1ZU1hcC5rZXlTZXQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlmIGl0J3Mgc3Vycm91bmRlZCBieSBxdW90ZXMsIHJlbW92ZSB0aGVtIGFuZCBwcmVzZXJ2ZSB0aGUgY2FzZQorICAgICAgICAgICAgaWYgKG1hcEtleS5zdGFydHNXaXRoKCJcIiIpICYmIG1hcEtleS5lbmRzV2l0aCgiXCIiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWx1ZU1hcC5wdXQobWFwS2V5LnN1YnN0cmluZygxLCBtYXBLZXkubGVuZ3RoKCkgLSAxKSwgdmFsdWVNYXAucmVtb3ZlKG1hcEtleSkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGxvd2VyY2FzZSBpdCBpZiBuZWVkZWQKKyAgICAgICAgICAgIFN0cmluZyBsb3dlcmVkID0gbWFwS2V5LnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7CisgICAgICAgICAgICBpZiAoIW1hcEtleS5lcXVhbHMobG93ZXJlZCkpCisgICAgICAgICAgICAgICAgdmFsdWVNYXAucHV0KGxvd2VyZWQsIHZhbHVlTWFwLnJlbW92ZShtYXBLZXkpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL01lcmdlSXRlcmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL01lcmdlSXRlcmF0b3IuamF2YQppbmRleCA2NzEzZGQwLi4yNzIzODk2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9NZXJnZUl0ZXJhdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvTWVyZ2VJdGVyYXRvci5qYXZhCkBAIC0zOTUsMTAgKzM5NSwxMSBAQAogCiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0xvd2VyQm91bmQoKQogICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgaXRlbSAhPSBudWxsOwogICAgICAgICAgICAgcmV0dXJuIGl0ZW0gPT0gbG93ZXJCb3VuZDsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbnN1bWUoUmVkdWNlciByZWR1Y2VyKQorICAgICAgICBwdWJsaWMgPE91dD4gdm9pZCBjb25zdW1lKFJlZHVjZXI8SW4sIE91dD4gcmVkdWNlcikKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGlzTG93ZXJCb3VuZCgpKQogICAgICAgICAgICAgewpAQCAtNDg4LDQgKzQ4OSw0IEBACiAgICAgICAgICAgICByZXR1cm4gKE91dCkgc291cmNlLm5leHQoKTsKICAgICAgICAgfQogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9Nb25vdG9uaWNDbG9jay5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvTW9ub3RvbmljQ2xvY2suamF2YQppbmRleCBhZDllZTgxLi43YmU1NGMwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9Nb25vdG9uaWNDbG9jay5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL01vbm90b25pY0Nsb2NrLmphdmEKQEAgLTI3LDExICsyNywxMiBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSUxMSVNFQ09ORFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQVBQUk9YSU1BVEVfVElNRV9QUkVDSVNJT05fTVM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0xPQ0tfTU9OT1RPTklDX0FQUFJPWDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DTE9DS19NT05PVE9OSUNfUFJFQ0lTRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5OQU5PVElNRVRPTUlMTElTX1RJTUVTVEFNUF9VUERBVEVfSU5URVJWQUw7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2hhcmVkLlNjb3BlLlNJTVVMQVRJT047CiAKQEAgLTEzOSw4ICsxNDAsNyBAQAogICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVwb2NoU2FtcGxpbmdDbG9jayBpbXBsZW1lbnRzIE1vbm90b25pY0Nsb2NrCiAgICAgewogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQWJzdHJhY3RFcG9jaFNhbXBsaW5nQ2xvY2suY2xhc3MpOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBEQVRFX0lOVEVSVkFMX1BST1BFUlRZID0gQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJOQU5PVElNRVRPTUlMTElTX1RJTUVTVEFNUF9VUERBVEVfSU5URVJWQUwiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFVQREFURV9JTlRFUlZBTF9NUyA9IExvbmcuZ2V0TG9uZyhVUERBVEVfSU5URVJWQUxfUFJPUEVSVFksIDEwMDAwKTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBVUERBVEVfSU5URVJWQUxfTVMgPSBOQU5PVElNRVRPTUlMTElTX1RJTUVTVEFNUF9VUERBVEVfSU5URVJWQUwuZ2V0TG9uZygpOwogCiAgICAgICAgIEBWaXNpYmxlRm9yVGVzdGluZwogICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFsbW9zdFNhbWVUaW1lIGltcGxlbWVudHMgTW9ub3RvbmljQ2xvY2tUcmFuc2xhdGlvbgpAQCAtMjgxLDcgKzI4MSw3IEBACiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTYW1wbGVkQ2xvY2sgaW1wbGVtZW50cyBNb25vdG9uaWNDbG9jawogICAgIHsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNhbXBsZWRDbG9jay5jbGFzcyk7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVUERBVEVfSU5URVJWQUxfTVMgPSBNYXRoLm1heCgxLCBJbnRlZ2VyLnBhcnNlSW50KFN5c3RlbS5nZXRQcm9wZXJ0eShDb25maWcuUFJPUEVSVFlfUFJFRklYICsgImFwcHJveGltYXRlX3RpbWVfcHJlY2lzaW9uX21zIiwgIjIiKSkpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX0lOVEVSVkFMX01TID0gTWF0aC5tYXgoMSwgQVBQUk9YSU1BVEVfVElNRV9QUkVDSVNJT05fTVMuZ2V0SW50KCkpOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEVSUk9SX05BTk9TID0gTUlMTElTRUNPTkRTLnRvTmFub3MoVVBEQVRFX0lOVEVSVkFMX01TKTsKIAogICAgICAgICBwcml2YXRlIGZpbmFsIE1vbm90b25pY0Nsb2NrIHByZWNpc2U7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9OYXRpdmVTU1RhYmxlTG9hZGVyQ2xpZW50LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9OYXRpdmVTU1RhYmxlTG9hZGVyQ2xpZW50LmphdmEKaW5kZXggZGRiM2VhNi4uMTlkY2MyMyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvTmF0aXZlU1NUYWJsZUxvYWRlckNsaWVudC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL05hdGl2ZVNTVGFibGVMb2FkZXJDbGllbnQuamF2YQpAQCAtMjEyLDcgKzIxMiw3IEBACiAKICAgICAgICAgaW50IHBvc2l0aW9uID0gcm93LmdldEludCgicG9zaXRpb24iKTsKICAgICAgICAgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhLktpbmQga2luZCA9IENvbHVtbk1ldGFkYXRhLktpbmQudmFsdWVPZihyb3cuZ2V0U3RyaW5nKCJraW5kIikudG9VcHBlckNhc2UoKSk7Ci0gICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoa2V5c3BhY2UsIHRhYmxlLCBuYW1lLCB0eXBlLCBwb3NpdGlvbiwga2luZCk7CisgICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoa2V5c3BhY2UsIHRhYmxlLCBuYW1lLCB0eXBlLCBwb3NpdGlvbiwga2luZCwgbnVsbCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgRHJvcHBlZENvbHVtbiBjcmVhdGVEcm9wcGVkQ29sdW1uRnJvbVJvdyhSb3cgcm93LCBTdHJpbmcga2V5c3BhY2UsIFN0cmluZyB0YWJsZSkKQEAgLTIyMCw3ICsyMjAsNyBAQAogICAgICAgICBTdHJpbmcgbmFtZSA9IHJvdy5nZXRTdHJpbmcoImNvbHVtbl9uYW1lIik7CiAgICAgICAgIEFic3RyYWN0VHlwZTw/PiB0eXBlID0gQ1FMVHlwZVBhcnNlci5wYXJzZShrZXlzcGFjZSwgcm93LmdldFN0cmluZygidHlwZSIpLCBUeXBlcy5ub25lKCkpOwogICAgICAgICBDb2x1bW5NZXRhZGF0YS5LaW5kIGtpbmQgPSBDb2x1bW5NZXRhZGF0YS5LaW5kLnZhbHVlT2Yocm93LmdldFN0cmluZygia2luZCIpLnRvVXBwZXJDYXNlKCkpOwotICAgICAgICBDb2x1bW5NZXRhZGF0YSBjb2x1bW4gPSBuZXcgQ29sdW1uTWV0YWRhdGEoa2V5c3BhY2UsIHRhYmxlLCBDb2x1bW5JZGVudGlmaWVyLmdldEludGVybmVkKG5hbWUsIHRydWUpLCB0eXBlLCBDb2x1bW5NZXRhZGF0YS5OT19QT1NJVElPTiwga2luZCk7CisgICAgICAgIENvbHVtbk1ldGFkYXRhIGNvbHVtbiA9IG5ldyBDb2x1bW5NZXRhZGF0YShrZXlzcGFjZSwgdGFibGUsIENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQobmFtZSwgdHJ1ZSksIHR5cGUsIENvbHVtbk1ldGFkYXRhLk5PX1BPU0lUSU9OLCBraW5kLCBudWxsKTsKICAgICAgICAgbG9uZyBkcm9wcGVkVGltZSA9IHJvdy5nZXRUaW1lc3RhbXAoImRyb3BwZWRfdGltZSIpLmdldFRpbWUoKTsKICAgICAgICAgcmV0dXJuIG5ldyBEcm9wcGVkQ29sdW1uKGNvbHVtbiwgZHJvcHBlZFRpbWUpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL09iamVjdFNpemVzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9PYmplY3RTaXplcy5qYXZhCmluZGV4IDA3MDY2Y2YuLjJkOTQ5ODMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL09iamVjdFNpemVzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvT2JqZWN0U2l6ZXMuamF2YQpAQCAtMTksNiArMTksOSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzOwogCitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIAogaW1wb3J0IG9yZy5naXRodWIuamFtbS5NZW1vcnlMYXlvdXRTcGVjaWZpY2F0aW9uOwpAQCAtMzEsNiArMzQsNyBAQAogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1lbW9yeU1ldGVyIG1ldGVyID0gbmV3IE1lbW9yeU1ldGVyKCkud2l0aEd1ZXNzaW5nKE1lbW9yeU1ldGVyLkd1ZXNzLkZBTExCQUNLX1VOU0FGRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlnbm9yZUtub3duU2luZ2xldG9ucygpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1lbW9yeU1ldGVyIG9taXRTaGFyZWRNZXRlciA9IG1ldGVyLm9taXRTaGFyZWRCdWZmZXJPdmVyaGVhZCgpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBFTVBUWV9IRUFQX0JVRkZFUl9TSVpFID0gbWVhc3VyZShCeXRlQnVmZmVyVXRpbC5FTVBUWV9CWVRFX0JVRkZFUik7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBFTVBUWV9CWVRFX0FSUkFZX1NJWkUgPSBtZWFzdXJlKG5ldyBieXRlWzBdKTsKQEAgLTM4LDYgKzQyLDggQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRElSRUNUX0JVRkZFUl9IRUFQX1NJWkUgPSBtZWFzdXJlKEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoMCkpOwogCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIElQVjZfU09DS0VUX0FERFJFU1NfU0laRSA9IE9iamVjdFNpemVzLm1lYXN1cmVEZWVwKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhnZXRJcHZBZGRyZXNzKDE2KSwgNDIpKTsKKwogICAgIC8qKgogICAgICAqIE1lbW9yeSBhIGJ5dGUgYXJyYXkgY29uc3VtZXMKICAgICAgKgpAQCAtMjE3LDEwICsyMjMsMzggQEAKIAogICAgIC8qKgogICAgICAqIEBwYXJhbSBwb2pvIHRoZSBvYmplY3QgdG8gbWVhc3VyZQorICAgICAqIEByZXR1cm4gVGhlIHNpemUgb24gdGhlIGhlYXAgb2YgdGhlIGluc3RhbmNlIGFuZCBhbGwgcmV0YWluZWQgaGVhcCByZWZlcmVuY2VkIGJ5IGl0LCBleGNsdWRpbmcgcG9ydGlvbnMgb2YKKyAgICAgKiBCeXRlQnVmZmVyIHRoYXQgYXJlIG5vdCBkaXJlY3RseSByZWZlcmVuY2VkIGJ5IGl0IGJ1dCBpbmNsdWRpbmcgYW55IG90aGVyIHJlZmVyZW5jZWQgdGhhdCBtYXkgYWxzbyBiZSByZXRhaW5lZAorICAgICAqIGJ5IG90aGVyIG9iamVjdHMuIFRoaXMgYWxzbyBpbmNsdWRlcyBieXRlcyByZWZlcmVuY2VkIGluIGRpcmVjdCBieXRlIGJ1ZmZlcnMsIGFuZCBtYXkgZG91YmxlLWNvdW50IG1lbW9yeSBpZgorICAgICAqIGl0IGlzIHJlZmVyZW5jZWQgYnkgbXVsdGlwbGUgQnl0ZUJ1ZmZlciBjb3BpZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBsb25nIG1lYXN1cmVEZWVwT21pdFNoYXJlZChPYmplY3QgcG9qbykKKyAgICB7CisgICAgICAgIHJldHVybiBvbWl0U2hhcmVkTWV0ZXIubWVhc3VyZURlZXAocG9qbyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHBvam8gdGhlIG9iamVjdCB0byBtZWFzdXJlCiAgICAgICogQHJldHVybiB0aGUgc2l6ZSBvbiB0aGUgaGVhcCBvZiB0aGUgaW5zdGFuY2Ugb25seSwgZXhjbHVkaW5nIGFueSByZWZlcmVuY2VkIG9iamVjdHMKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGxvbmcgbWVhc3VyZShPYmplY3QgcG9qbykKICAgICB7CiAgICAgICAgIHJldHVybiBtZXRlci5tZWFzdXJlKHBvam8pOwogICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEluZXRBZGRyZXNzIGdldElwdkFkZHJlc3MoaW50IHNpemUpCisgICAgeworICAgICAgICBpZiAoc2l6ZSA9PSAxNiB8fCBzaXplID09NCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEluZXRBZGRyZXNzLmdldEJ5QWRkcmVzcyhuZXcgYnl0ZVtzaXplXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHNpemUgb2YgYSBieXRlIGFycmF5IHdoZW4gZ2V0dGluZyBhbmQgaXB2IGFkZHJlc3M6ICIgKyBzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkV4Y3BlY3RlZCBhIGJ5dGUgYXJyYXkgc2l6ZSBvZiA0IG9yIDE2IGZvciBhbiBpcHYgYWRkcmVzcyBidXQgZ290OiAiICsgc2l6ZSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvT3V0cHV0SGFuZGxlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvT3V0cHV0SGFuZGxlci5qYXZhCmluZGV4IDgyMDE2MGQuLjc2ZWIzNDUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL091dHB1dEhhbmRsZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9PdXRwdXRIYW5kbGVyLmphdmEKQEAgLTI2LDIwICsyNiwzNiBAQAogcHVibGljIGludGVyZmFjZSBPdXRwdXRIYW5kbGVyCiB7CiAgICAgLy8gY2FsbGVkIHdoZW4gYW4gaW1wb3J0YW50IGluZm8gbmVlZCB0byBiZSBkaXNwbGF5ZWQKLSAgICBwdWJsaWMgdm9pZCBvdXRwdXQoU3RyaW5nIG1zZyk7Ci0KLSAgICAvLyBjYWxsZWQgd2hlbiBhIGxlc3MgaW1wb3J0YW50IGluZm8gbmVlZCB0byBiZSBkaXNwbGF5ZWQKLSAgICBwdWJsaWMgdm9pZCBkZWJ1ZyhTdHJpbmcgbXNnKTsKLQotICAgIC8vIGNhbGxlZCB3aGVuIHRoZSB1c2VyIG5lZWRzIHRvIGJlIHdhcm4KLSAgICBwdWJsaWMgdm9pZCB3YXJuKFN0cmluZyBtc2cpOwotICAgIHB1YmxpYyB2b2lkIHdhcm4oU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRoKTsKLSAgICBwdWJsaWMgZGVmYXVsdCB2b2lkIHdhcm4oVGhyb3dhYmxlIHRoKQorICAgIHZvaWQgb3V0cHV0KFN0cmluZyBtc2cpOworICAgIGRlZmF1bHQgdm9pZCBvdXRwdXQoU3RyaW5nIG1zZywgT2JqZWN0IC4uLiBhcmdzKQogICAgIHsKLSAgICAgICAgd2Fybih0aC5nZXRNZXNzYWdlKCksIHRoKTsKKyAgICAgICAgb3V0cHV0KFN0cmluZy5mb3JtYXQobXNnLCBhcmdzKSk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBMb2dPdXRwdXQgaW1wbGVtZW50cyBPdXRwdXRIYW5kbGVyCisgICAgLy8gY2FsbGVkIHdoZW4gYSBsZXNzIGltcG9ydGFudCBpbmZvIG5lZWQgdG8gYmUgZGlzcGxheWVkCisgICAgdm9pZCBkZWJ1ZyhTdHJpbmcgbXNnKTsKKyAgICBkZWZhdWx0IHZvaWQgZGVidWcoU3RyaW5nIG1zZywgT2JqZWN0IC4uLiBhcmdzKQorICAgIHsKKyAgICAgICAgZGVidWcoU3RyaW5nLmZvcm1hdChtc2csIGFyZ3MpKTsKKyAgICB9CisKKyAgICAvLyBjYWxsZWQgd2hlbiB0aGUgdXNlciBuZWVkcyB0byBiZSB3YXJuCisgICAgdm9pZCB3YXJuKFN0cmluZyBtc2cpOworICAgIHZvaWQgd2FybihUaHJvd2FibGUgdGgsIFN0cmluZyBtc2cpOworICAgIGRlZmF1bHQgdm9pZCB3YXJuKFRocm93YWJsZSB0aCkKKyAgICB7CisgICAgICAgIHdhcm4odGgsIHRoLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICAgIGRlZmF1bHQgdm9pZCB3YXJuKFRocm93YWJsZSB0aCwgU3RyaW5nIG1zZywgT2JqZWN0Li4uIGFyZ3MpCisgICAgeworICAgICAgICB3YXJuKHRoLCBTdHJpbmcuZm9ybWF0KG1zZywgYXJncykpOworICAgIH0KKyAgICBkZWZhdWx0IHZvaWQgd2FybihTdHJpbmcgbXNnLCBPYmplY3QgLi4uIGFyZ3MpCisgICAgeworICAgICAgICB3YXJuKFN0cmluZy5mb3JtYXQobXNnLCBhcmdzKSk7CisgICAgfQorCisgICAgY2xhc3MgTG9nT3V0cHV0IGltcGxlbWVudHMgT3V0cHV0SGFuZGxlcgogICAgIHsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKExvZ091dHB1dC5jbGFzcyk7CiAKQEAgLTU4LDEzICs3NCwxMyBAQAogICAgICAgICAgICAgbG9nZ2VyLndhcm4obXNnKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHdhcm4oU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRoKQorICAgICAgICBwdWJsaWMgdm9pZCB3YXJuKFRocm93YWJsZSB0aCwgU3RyaW5nIG1zZykKICAgICAgICAgewogICAgICAgICAgICAgbG9nZ2VyLndhcm4obXNnLCB0aCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN5c3RlbU91dHB1dCBpbXBsZW1lbnRzIE91dHB1dEhhbmRsZXIKKyAgICBjbGFzcyBTeXN0ZW1PdXRwdXQgaW1wbGVtZW50cyBPdXRwdXRIYW5kbGVyCiAgICAgewogICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBkZWJ1ZzsKICAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gcHJpbnRTdGFjazsKQEAgLTk1LDE0ICsxMTEsMTQgQEAKIAogICAgICAgICBwdWJsaWMgdm9pZCB3YXJuKFN0cmluZyBtc2cpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHdhcm4obXNnLCBudWxsKTsKKyAgICAgICAgICAgIHdhcm4oKFRocm93YWJsZSkgbnVsbCwgbXNnKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHdhcm4oU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRoKQorICAgICAgICBwdWJsaWMgdm9pZCB3YXJuKFRocm93YWJsZSB0aCwgU3RyaW5nIG1zZykKICAgICAgICAgewogICAgICAgICAgICAgd2Fybk91dC5wcmludGxuKCJXQVJOSU5HOiAiICsgbXNnKTsKICAgICAgICAgICAgIGlmIChwcmludFN0YWNrICYmIHRoICE9IG51bGwpCiAgICAgICAgICAgICAgICAgdGgucHJpbnRTdGFja1RyYWNlKHdhcm5PdXQpOwogICAgICAgICB9CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1Jhbmdlc1NlcmlhbGl6ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1Jhbmdlc1NlcmlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzA3NTAzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvUmFuZ2VzU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uSVZlcnNpb25lZFNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CisKK3B1YmxpYyBjbGFzcyBSYW5nZXNTZXJpYWxpemVyIGltcGxlbWVudHMgSVZlcnNpb25lZFNlcmlhbGl6ZXI8Q29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+PgoreworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUmFuZ2VzU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IFJhbmdlc1NlcmlhbGl6ZXIoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4gcmFuZ2VzLCBEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIG91dC53cml0ZUludChyYW5nZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChSYW5nZTxUb2tlbj4gciA6IHJhbmdlcykKKyAgICAgICAgeworICAgICAgICAgICAgVG9rZW4uc2VyaWFsaXplci5zZXJpYWxpemUoci5sZWZ0LCBvdXQsIHZlcnNpb24pOworICAgICAgICAgICAgVG9rZW4uc2VyaWFsaXplci5zZXJpYWxpemUoci5yaWdodCwgb3V0LCB2ZXJzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4gZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbiwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaW50IGNvdW50ID0gaW4ucmVhZEludCgpOworICAgICAgICBMaXN0PFJhbmdlPFRva2VuPj4gcmFuZ2VzID0gbmV3IEFycmF5TGlzdDw+KGNvdW50KTsKKyAgICAgICAgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFBhcnRpdGlvbmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgVG9rZW4gc3RhcnQgPSBUb2tlbi5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCBwYXJ0aXRpb25lciwgdmVyc2lvbik7CisgICAgICAgICAgICBUb2tlbiBlbmQgPSBUb2tlbi5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCBwYXJ0aXRpb25lciwgdmVyc2lvbik7CisgICAgICAgICAgICByYW5nZXMuYWRkKG5ldyBSYW5nZTw+KHN0YXJ0LCBlbmQpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmFuZ2VzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIHNlcmlhbGl6ZWRTaXplKENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+PiByYW5nZXMsIGludCB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgaW50IHNpemUgPSBUeXBlU2l6ZXMuc2l6ZW9mKHJhbmdlcy5zaXplKCkpOworICAgICAgICBpZiAocmFuZ2VzLnNpemUoKSA+IDApCisgICAgICAgICAgICBzaXplICs9IHJhbmdlcy5zaXplKCkgKiAyICogVG9rZW4uc2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShyYW5nZXMuaXRlcmF0b3IoKS5uZXh0KCkubGVmdCwgdmVyc2lvbik7CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1JlZmxlY3Rpb25VdGlscy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvUmVmbGVjdGlvblV0aWxzLmphdmEKaW5kZXggYmQ2MDVkYi4uYmY2YWQyYyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvUmVmbGVjdGlvblV0aWxzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvUmVmbGVjdGlvblV0aWxzLmphdmEKQEAgLTIxLDcgKzIxLDE4IEBACiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwogCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGlvblV0aWxzIHsKK3B1YmxpYyBjbGFzcyBSZWZsZWN0aW9uVXRpbHMKK3sKKyAgICBwcml2YXRlIFJlZmxlY3Rpb25VdGlscygpCisgICAgeworCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBGaWVsZCBnZXRNb2RpZmllcnNGaWVsZCgpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldEZpZWxkKEZpZWxkLmNsYXNzLCAibW9kaWZpZXJzIik7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBGaWVsZCBnZXRGaWVsZChDbGFzczw/PiBjbGF6eiwgU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uCiAgICAgewogICAgICAgICAvLyBiZWxvdyBjb2RlIHdvcmtzIGJlZm9yZSBKYXZhIDEyCkBAIC01Miw0ICs2Myw0IEBACiAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICB9CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1NoYXJlZC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvU2hhcmVkLmphdmEKaW5kZXggZTU3NmM4Ni4uNjQzMzYyNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvU2hhcmVkLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvU2hhcmVkLmphdmEKQEAgLTI0LDcgKzI0LDcgQEAKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CiAKIC8qKgotICogVGVsbHMganZtLWR0ZXN0IHRoYXQgYSBjbGFzcyBzaG91bGQgYmUgc2hhcmVkIGFjY3Jvc3MgYWxsIHtAbGluayBDbGFzc0xvYWRlcn1zLgorICogVGVsbHMganZtLWR0ZXN0IHRoYXQgYSBjbGFzcyBzaG91bGQgYmUgc2hhcmVkIGFjcm9zcyBhbGwge0BsaW5rIENsYXNzTG9hZGVyfXMuCiAgKgogICogSnZtLWR0ZXN0IHJlbGllcyBvbiBjbGFzc2xvYWRlciBpc29sYXRpb24gdG8gcnVuIG11bHRpcGxlIGNhc3NhbmRyYSBpbnN0YW5jZXMgaW4gdGhlIHNhbWUgSlZNLCB0aGlzIG1ha2VzIGl0CiAgKiBzbyBzb21lIGNsYXNzZXMgZG8gbm90IGdldCBzaGFyZWQgKG91dHNpZGUgYSBibGVzc3NlZCBzZXQgb2YgY2xhc3Nlcy9wYWNrYWdlcykuIFdoZW4gdGhlIGRlZmF1bHQgYmVoYXZpb3IKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1N0YXR1c0xvZ2dlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvU3RhdHVzTG9nZ2VyLmphdmEKaW5kZXggZGNiMTEzNS4uMDg1MDIyNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvU3RhdHVzTG9nZ2VyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvU3RhdHVzTG9nZ2VyLmphdmEKQEAgLTE5LDE3ICsxOSwxOSBAQAogCiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DYXNzYW5kcmFNZXRyaWNzUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5UaHJlYWRQb29sTWV0cmljczsKLQogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5BdXRvU2F2aW5nQ2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuSVJvd0NhY2hlRW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuS2V5Q2FjaGVLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuUm93Q2FjaGVLZXk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dJbmRleEVudHJ5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFJvd0luZGV4RW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DYXNzYW5kcmFNZXRyaWNzUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5UaHJlYWRQb29sTWV0cmljczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNhY2hlU2VydmljZTsKIApAQCAtOTIsNyArOTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdpbmdTZXJ2aWNlIiwgIm4vYSIsIHBlbmRpbmdMYXJnZU1lc3NhZ2VzICsgIi8iICsgcGVuZGluZ1NtYWxsTWVzc2FnZXMpKTsKIAogICAgICAgICAvLyBHbG9iYWwga2V5L3JvdyBjYWNoZSBpbmZvcm1hdGlvbgotICAgICAgICBBdXRvU2F2aW5nQ2FjaGU8S2V5Q2FjaGVLZXksIFJvd0luZGV4RW50cnk+IGtleUNhY2hlID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlOworICAgICAgICBBdXRvU2F2aW5nQ2FjaGU8S2V5Q2FjaGVLZXksIEFic3RyYWN0Um93SW5kZXhFbnRyeT4ga2V5Q2FjaGUgPSBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGU7CiAgICAgICAgIEF1dG9TYXZpbmdDYWNoZTxSb3dDYWNoZUtleSwgSVJvd0NhY2hlRW50cnk+IHJvd0NhY2hlID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLnJvd0NhY2hlOwogCiAgICAgICAgIGludCBrZXlDYWNoZUtleXNUb1NhdmUgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0S2V5Q2FjaGVLZXlzVG9TYXZlKCk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9TeW5jVXRpbC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvU3luY1V0aWwuamF2YQppbmRleCA2MDU1ODU5Li4xYWRjNGZjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9TeW5jVXRpbC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1N5bmNVdGlsLmphdmEKQEAgLTI3LDEwICsyNywxMyBAQAogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKLQogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudEVudjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuTWVtb3J5VXRpbDsKKwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKQEAgLTg3LDggKzkwLDggQEAKICAgICAgICAgZmRVc2VDb3VudEZpZWxkID0gZmRVc2VDb3VudFRlbXA7CiAKICAgICAgICAgLy9JZiBza2lwcGluZyBzeW5jaW5nIGlzIHJlcXVlc3RlZCBieSBhbnkgbWVhbnMgdGhlbiBza2lwIHRoZW0uCi0gICAgICAgIGJvb2xlYW4gc2tpcFN5bmNQcm9wZXJ0eSA9IEJvb2xlYW4uZ2V0Qm9vbGVhbihDb25maWcuUFJPUEVSVFlfUFJFRklYICsgInNraXBfc3luYyIpOwotICAgICAgICBib29sZWFuIHNraXBTeW5jRW52ID0gQm9vbGVhbi52YWx1ZU9mKFN5c3RlbS5nZXRlbnYoKS5nZXRPckRlZmF1bHQoIkNBU1NBTkRSQV9TS0lQX1NZTkMiLCAiZmFsc2UiKSk7CisgICAgICAgIGJvb2xlYW4gc2tpcFN5bmNQcm9wZXJ0eSA9IENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0NBU1NBTkRSQV9TS0lQX1NZTkMuZ2V0Qm9vbGVhbigpOworICAgICAgICBib29sZWFuIHNraXBTeW5jRW52ID0gQ2Fzc2FuZHJhUmVsZXZhbnRFbnYuQ0FTU0FORFJBX1NLSVBfU1lOQy5nZXRCb29sZWFuKCk7CiAgICAgICAgIFNLSVBfU1lOQyA9IHNraXBTeW5jUHJvcGVydHkgfHwgc2tpcFN5bmNFbnY7CiAgICAgICAgIGlmIChTS0lQX1NZTkMpCiAgICAgICAgIHsKQEAgLTk5LDYgKzEwMiwxMiBAQAogICAgIHB1YmxpYyBzdGF0aWMgTWFwcGVkQnl0ZUJ1ZmZlciBmb3JjZShNYXBwZWRCeXRlQnVmZmVyIGJ1ZikKICAgICB7CiAgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKGJ1Zik7CisgICAgICAgIE9iamVjdCBhdHRhY2htZW50ID0gTWVtb3J5VXRpbC5nZXRBdHRhY2htZW50KGJ1Zik7CisgICAgICAgIGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgUnVubmFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgICgoUnVubmFibGUpIGF0dGFjaG1lbnQpLnJ1bigpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgfQogICAgICAgICBpZiAoU0tJUF9TWU5DKQogICAgICAgICB7CiAgICAgICAgICAgICBPYmplY3QgZmQgPSBudWxsOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvVGhyb3dhYmxlcy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvVGhyb3dhYmxlcy5qYXZhCmluZGV4IDgzMzdhNTYuLmQ2MzY3MTEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1Rocm93YWJsZXMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9UaHJvd2FibGVzLmphdmEKQEAgLTE4LDE5ICsxOCwyNSBAQAogKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTm9ubnVsbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTUmVhZEVycm9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTV3JpdGVFcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5VbmNoZWNrZWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKIAogcHVibGljIGZpbmFsIGNsYXNzIFRocm93YWJsZXMKQEAgLTE4NCw2ICsxOTAsNTkgQEAKICAgICAgICAgfSkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEBzZWUge0BsaW5rICNjbG9zZUFuZEFkZFN1cHByZXNzZWQoVGhyb3dhYmxlLCBJdGVyYWJsZSl9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlQW5kQWRkU3VwcHJlc3NlZChATm9ubnVsbCBUaHJvd2FibGUgdCwgQXV0b0Nsb3NlYWJsZS4uLiBjbG9zZWFibGVzKQorICAgIHsKKyAgICAgICAgY2xvc2VBbmRBZGRTdXBwcmVzc2VkKHQsIEFycmF5cy5hc0xpc3QoY2xvc2VhYmxlcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERvIHdoYXQge0BsaW5rICNjbG9zZUFuZEFkZFN1cHByZXNzZWQoVGhyb3dhYmxlLCBJdGVyYWJsZSl9IGRvZXMsIGFkZGl0aW9uYWxseSBmaWx0ZXJpbmcgb3V0IGFsbCBudWxsIGNsb3NhYmxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VOb25OdWxsQW5kQWRkU3VwcHJlc3NlZChATm9ubnVsbCBUaHJvd2FibGUgdCwgQXV0b0Nsb3NlYWJsZS4uLiBjbG9zZWFibGVzKQorICAgIHsKKyAgICAgICAgY2xvc2VBbmRBZGRTdXBwcmVzc2VkKHQsIEl0ZXJhYmxlcy5maWx0ZXIoQXJyYXlzLmFzTGlzdChjbG9zZWFibGVzKSwgT2JqZWN0czo6bm9uTnVsbCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyBhbGwgY2xvc2FibGVzIGluIHRoZSBwcm92aWRlZCBjb2xsZWN0aW9ucyBhbmQgYWNjdW11bGF0ZXMgdGhlIHBvc3NpYmxlIGV4Y2VwdGlvbnMgdGhyb3duIHdoZW4gY2xvc2luZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY2N1bXVsYXRlIG5vbi1udWxsIGV4Y2VwdGlvbiB0byBhY2N1bXVsYXRlIGVycm9ycyB0aHJvd24gd2hlbiBjbG9zaW5nIHRoZSBwcm92aWRlZCByZXNvdXJjZXMKKyAgICAgKiBAcGFyYW0gY2xvc2VhYmxlcyBjbG9zZWFibGVzIHRvIGJlIGNsb3NlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZUFuZEFkZFN1cHByZXNzZWQoQE5vbm51bGwgVGhyb3dhYmxlIGFjY3VtdWxhdGUsIEl0ZXJhYmxlPEF1dG9DbG9zZWFibGU+IGNsb3NlYWJsZXMpCisgICAgeworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChhY2N1bXVsYXRlKTsKKyAgICAgICAgZm9yIChBdXRvQ2xvc2VhYmxlIGNsb3NlYWJsZSA6IGNsb3NlYWJsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsb3NlYWJsZS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhY2N1bXVsYXRlLmFkZFN1cHByZXNzZWQoZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VlIHtAbGluayAjY2xvc2UoVGhyb3dhYmxlLCBJdGVyYWJsZSl9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUaHJvd2FibGUgY2xvc2UoVGhyb3dhYmxlIGFjY3VtdWxhdGUsIEF1dG9DbG9zZWFibGUgLi4uIGNsb3NlYWJsZXMpCisgICAgeworICAgICAgICByZXR1cm4gY2xvc2UoYWNjdW11bGF0ZSwgQXJyYXlzLmFzTGlzdChjbG9zZWFibGVzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIGFsbCB0aGUgcmVzb3VyY2VzIGluIHRoZSBwcm92aWRlZCBjb2xsZWN0aW9ucyBhbmQgYWNjdW11bGF0ZXMgdGhlIHBvc3NpYmxlIGV4Y2VwdGlvbnMgdGhyb3duIHdoZW4gY2xvc2luZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY2N1bXVsYXRlIHRoZSBpbml0aWFsIHZhbHVlIGZvciB0aGUgZXhjZXB0aW9uIGFjY3VtdWxhdG9yLCBjYW4gYmUge0Bjb2RlIG51bGx9CisgICAgICogQHBhcmFtIGNsb3NlYWJsZXMgY2xvc2VhYmxlcyB0byBiZSBjbG9zZWQKKyAgICAgKiBAcmV0dXJuIHtAY29kZSBudWxsfSwge0BwYXJhbSBhY2N1bXVsYXRlfSBvciB0aGUgZmlyc3QgZXhjZXB0aW9uIHRocm93biB3aGVuIGNsb3NpbmcgdGhlIHByb3ZpZGVkIHJlc291cmNlcworICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgVGhyb3dhYmxlIGNsb3NlKFRocm93YWJsZSBhY2N1bXVsYXRlLCBJdGVyYWJsZTw/IGV4dGVuZHMgQXV0b0Nsb3NlYWJsZT4gY2xvc2VhYmxlcykKICAgICB7CiAgICAgICAgIGZvciAoQXV0b0Nsb3NlYWJsZSBjbG9zZWFibGUgOiBjbG9zZWFibGVzKQpAQCAtMjY3LDQgKzMyNiwxMSBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIHVuY2hlY2tlZCh1bndyYXBwZWQodCkpOwogICAgIH0KKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBbnlDYXVzZShUaHJvd2FibGUgZXJyLCBDbGFzczw/IGV4dGVuZHMgVGhyb3dhYmxlPiBjYXVzZSkKKyAgICB7CisgICAgICAgIGlmICghYW55Q2F1c2VNYXRjaGVzKGVyciwgY2F1c2U6OmlzSW5zdGFuY2UpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJUaGUgZXhjZXB0aW9uIGlzIG5vdCBjYXVzZWQgYnkgIiArIGNhdXNlLmdldE5hbWUoKSwgZXJyKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9UaW1lVVVJRC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvVGltZVVVSUQuamF2YQppbmRleCA4ZDc5MDk2Li5kOTkzZjE3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9UaW1lVVVJRC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1RpbWVVVUlELmphdmEKQEAgLTUzLDYgKzUzLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5UeXBlU2VyaWFsaXplcjsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSUNST1NFQ09ORFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX1VOU0FGRV9USU1FX1VVSURfTk9ERTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ERVRFUk1JTklTTV9VTlNBRkVfVVVJRF9OT0RFOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbC5FTVBUWV9CWVRFX0JVRkZFUjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLmN1cnJlbnRUaW1lTWlsbGlzOwpAQCAtODIsNiArODMsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUlOX0NMT0NLX1NFUV9BTkRfTk9ERSA9IDB4ODA4MDgwODA4MDgwODA4MEw7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNQVhfQ0xPQ0tfU0VRX0FORF9OT0RFID0gMHg3ZjdmN2Y3ZjdmN2Y3ZjdmTDsKIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBUSU1FVVVJRF9TSVpFID0gT2JqZWN0U2l6ZXMubWVhc3VyZURlZXAobmV3IFRpbWVVVUlEKDEwLCAxMCkpOwogCiAgICAgZmluYWwgbG9uZyB1dWlkVGltZXN0YW1wLCBsc2I7CiAKQEAgLTQzOCw5ICs0NDAsOCBAQAogICAgICAgICAgICAgaWYgKERFVEVSTUlOSVNNX1VOU0FGRV9VVUlEX05PREUuZ2V0Qm9vbGVhbigpKQogICAgICAgICAgICAgICAgIHJldHVybiBGQlV0aWxpdGllcy5nZXRCcm9hZGNhc3RBZGRyZXNzQW5kUG9ydCgpLmFkZHJlc3NCeXRlc1szXTsKIAotICAgICAgICAgICAgTG9uZyBzcGVjaWZpZWQgPSBMb25nLmdldExvbmcoImNhc3NhbmRyYS51bnNhZmUudGltZXV1aWRub2RlIik7Ci0gICAgICAgICAgICBpZiAoc3BlY2lmaWVkICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHNwZWNpZmllZAorICAgICAgICAgICAgaWYgKENBU1NBTkRSQV9VTlNBRkVfVElNRV9VVUlEX05PREUuaXNQcmVzZW50KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIENBU1NBTkRSQV9VTlNBRkVfVElNRV9VVUlEX05PREUuZ2V0TG9uZygpCiAgICAgICAgICAgICAgICAgICAgICAgIF4gRkJVdGlsaXRpZXMuZ2V0QnJvYWRjYXN0QWRkcmVzc0FuZFBvcnQoKS5hZGRyZXNzQnl0ZXNbM10KICAgICAgICAgICAgICAgICAgICAgICAgXiAoRkJVdGlsaXRpZXMuZ2V0QnJvYWRjYXN0QWRkcmVzc0FuZFBvcnQoKS5hZGRyZXNzQnl0ZXNbMl0gPDwgOCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1dyYXBwZWRSdW5uYWJsZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvV3JhcHBlZFJ1bm5hYmxlLmphdmEKaW5kZXggMWRlN2E0Ni4uOTgxZTAyNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvV3JhcHBlZFJ1bm5hYmxlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvV3JhcHBlZFJ1bm5hYmxlLmphdmEKQEAgLTE3LDggKzE3LDYgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlsczsKIAotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlczsKLQogcHVibGljIGFic3RyYWN0IGNsYXNzIFdyYXBwZWRSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlCiB7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVuKCkKQEAgLTI3LDkgKzI1LDEzIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHJ1bk1heVRocm93KCk7CiAgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9iaW5sb2cvQmluTG9nLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9iaW5sb2cvQmluTG9nLmphdmEKaW5kZXggNDNmZjY3ZS4uOGIwZTAyNTcwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9iaW5sb2cvQmluTG9nLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYmlubG9nL0JpbkxvZy5qYXZhCkBAIC0zNSw2ICszNSw3IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAoraW1wb3J0IG5ldC5vcGVuaGZ0LmNocm9uaWNsZS5jb3JlLmlvLkJhY2tncm91bmRSZXNvdXJjZVJlbGVhc2VyOwogaW1wb3J0IG5ldC5vcGVuaGZ0LmNocm9uaWNsZS5xdWV1ZS5DaHJvbmljbGVRdWV1ZTsKIGltcG9ydCBuZXQub3BlbmhmdC5jaHJvbmljbGUucXVldWUuaW1wbC5zaW5nbGUuU2luZ2xlQ2hyb25pY2xlUXVldWU7CiBpbXBvcnQgbmV0Lm9wZW5oZnQuY2hyb25pY2xlLnF1ZXVlLmltcGwuc2luZ2xlLlNpbmdsZUNocm9uaWNsZVF1ZXVlQnVpbGRlcjsKQEAgLTQyLDYgKzQzLDcgQEAKIGltcG9ydCBuZXQub3BlbmhmdC5jaHJvbmljbGUucXVldWUuUm9sbEN5Y2xlczsKIGltcG9ydCBuZXQub3BlbmhmdC5jaHJvbmljbGUud2lyZS5XaXJlT3V0OwogaW1wb3J0IG5ldC5vcGVuaGZ0LmNocm9uaWNsZS53aXJlLldyaXRlTWFyc2hhbGxhYmxlOworaW1wb3J0IG5ldC5vcGVuaGZ0LnBvc2l4LlBvc2l4QVBJOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuTmFtZWRUaHJlYWRGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTRXJyb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSlZNU3RhYmlsaXR5SW5zcGVjdG9yOwpAQCAtNTEsNiArNTMsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuV2VpZ2h0ZWRRdWV1ZTsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DSFJPTklDTEVfQU5OT1VOQ0VSX0RJU0FCTEU7CiAKIC8qKgogICogQmluIGxvZyBpcyBhIGlzIHF1aWNrIGFuZCBkaXJ0eSBiaW5hcnkgbG9nIHRoYXQgaXMga2luZCBvZiBhIE5JSCB2ZXJzaW9uIG9mIGJpbmFyeSBsb2dnaW5nIHdpdGggYSB0cmFkaXRpb25hbCBsb2dnaW5nCkBAIC03NSw2ICs3OCwxMyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSAidmVyc2lvbiI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRSA9ICJ0eXBlIjsKIAorICAgIHN0YXRpYworICAgIHsKKyAgICAgICAgLy8gQXZvaWQgdGhlIGNocm9uaWNsZSBhbm5vdW5jZW1lbnQgd2hpY2ggaXMgY29tbWVyY2lhbCBhZHZlcnRpc2VtZW50LCBhbmQgZGVidWcgaW5mbyB3ZSBhbHJlYWR5IHByaW50IGF0IHN0YXJ0dXAKKyAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL09wZW5IRlQvQ2hyb25pY2xlLUNvcmUvYmxvYi9jaHJvbmljbGUtY29yZS0yLjIzLjM2L3NyYy9tYWluL2phdmEvbmV0L29wZW5oZnQvY2hyb25pY2xlL2NvcmUvYW5ub3VuY2VyL0Fubm91bmNlci5qYXZhI0wzMi1MMzMKKyAgICAgICAgQ0hST05JQ0xFX0FOTk9VTkNFUl9ESVNBQkxFLnNldEJvb2xlYW4odHJ1ZSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBDaHJvbmljbGVRdWV1ZSBxdWV1ZTsKICAgICBwcml2YXRlIEV4Y2VycHRBcHBlbmRlciBhcHBlbmRlcjsKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKQEAgLTEyMiw2ICsxMzIsNyBAQAogCiAgICAgcHJpdmF0ZSBCaW5Mb2coUGF0aCBwYXRoLCBCaW5Mb2dPcHRpb25zIG9wdGlvbnMsIEJpbkxvZ0FyY2hpdmVyIGFyY2hpdmVyKQogICAgIHsKKyAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwoUG9zaXhBUEkucG9zaXgoKSwgIkNhbm5vdCBpbml0aWFsaXplIE9wZW5IRlQgUG9zaXgiKTsKICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwocGF0aCwgInBhdGggd2FzIG51bGwiKTsKICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwob3B0aW9ucy5yb2xsX2N5Y2xlLCAicm9sbF9jeWNsZSB3YXMgbnVsbCIpOwogICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQob3B0aW9ucy5tYXhfcXVldWVfd2VpZ2h0ID4gMCwgIm1heF9xdWV1ZV93ZWlnaHQgbXVzdCBiZSA+IDAiKTsKQEAgLTEzNSw3ICsxNDYsNiBAQAogICAgICAgICBhcHBlbmRlciA9IHF1ZXVlLmFjcXVpcmVBcHBlbmRlcigpOwogICAgICAgICB0aGlzLmJsb2NraW5nID0gb3B0aW9ucy5ibG9jazsKICAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKLQogICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwogICAgIH0KIApAQCAtMTcwLDYgKzE4MCw3IEBACiAKICAgICAgICAgc2hvdWxkQ29udGludWUgPSBmYWxzZTsKICAgICAgICAgc2FtcGxlUXVldWUucHV0KE5PX09QKTsKKyAgICAgICAgQmFja2dyb3VuZFJlc291cmNlUmVsZWFzZXIuc3RvcCgpOwogICAgICAgICBiaW5Mb2dUaHJlYWQuam9pbigpOwogICAgICAgICBhcHBlbmRlci5jbG9zZSgpOwogICAgICAgICBhcHBlbmRlciA9IG51bGw7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9idHJlZS9CVHJlZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnRyZWUvQlRyZWUuamF2YQppbmRleCBhMDI2ZjcwLi4yZDhmZWZiIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9idHJlZS9CVHJlZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J0cmVlL0JUcmVlLmphdmEKQEAgLTM3LDYgKzM3LDcgQEAKIAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuTWF0aC5tYXg7CiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5NYXRoLm1pbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5CVFJFRV9CUkFOQ0hfU0hJRlQ7CiAKIHB1YmxpYyBjbGFzcyBCVHJlZQogewpAQCAtNjIsNyArNjMsNyBAQAogICAgICAqIHN1YnRyZWVzIHdoZW4gbW9kaWZ5aW5nIHRoZSB0cmVlLCBzaW5jZSB0aGUgbW9kaWZpZWQgdHJlZSB3b3VsZCBuZWVkIG5ldyBwYXJlbnQgcmVmZXJlbmNlcykuCiAgICAgICogSW5zdGVhZCwgd2Ugc3RvcmUgdGhlc2UgcmVmZXJlbmNlcyBpbiBhIFBhdGggYXMgbmVlZGVkIHdoZW4gbmF2aWdhdGluZyB0aGUgdHJlZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCUkFOQ0hfU0hJRlQgPSBJbnRlZ2VyLmdldEludGVnZXIoImNhc3NhbmRyYS5idHJlZS5icmFuY2hzaGlmdCIsIDUpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJSQU5DSF9TSElGVCA9IEJUUkVFX0JSQU5DSF9TSElGVC5nZXRJbnQoKTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCUkFOQ0hfRkFDVE9SID0gMSA8PCBCUkFOQ0hfU0hJRlQ7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0tFWVMgPSBCUkFOQ0hfRkFDVE9SIC8gMiAtIDE7CkBAIC05NDksNiArOTUwLDkgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBzaXplT2ZTdHJ1Y3R1cmVPbkhlYXAoT2JqZWN0W10gdHJlZSkKICAgICB7CisgICAgICAgIGlmICh0cmVlID09IEVNUFRZX0xFQUYpCisgICAgICAgICAgICByZXR1cm4gMDsKKwogICAgICAgICBsb25nIHNpemUgPSBPYmplY3RTaXplcy5zaXplT2ZBcnJheSh0cmVlKTsKICAgICAgICAgaWYgKGlzTGVhZih0cmVlKSkKICAgICAgICAgICAgIHJldHVybiBzaXplOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvQnl0ZUNvbXBhcmFibGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J5dGVjb21wYXJhYmxlL0J5dGVDb21wYXJhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRmNDI1YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J5dGVjb21wYXJhYmxlL0J5dGVDb21wYXJhYmxlLmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGU7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCisvKioKKyAqIEludGVyZmFjZSBpbmRpY2F0aW5nIGEgdmFsdWUgY2FuIGJlIHJlcHJlc2VudGVkL2lkZW50aWZpZWQgYnkgYSBjb21wYXJhYmxlIHtAbGluayBCeXRlU291cmNlfS4KKyAqCisgKiBBbGwgQ2Fzc2FuZHJhIHR5cGVzIHRoYXQgY2FuIGJlIHVzZWQgYXMgcGFydCBvZiBhIHByaW1hcnkga2V5IGhhdmUgYSBjb3JyZXNwb25kaW5nIGJ5dGUtY29tcGFyYWJsZSB0cmFuc2xhdGlvbiwKKyAqIGRldGFpbGVkIGluIEJ5dGVDb21wYXJhYmxlLm1kLiBCeXRlLWNvbXBhcmFibGUgcmVwcmVzZW50YXRpb25zIGFyZSB1c2VkIGluIHNvbWUgbWVtdGFibGUgYXMgd2VsbCBhcyBwcmltYXJ5IGFuZAorICogc2Vjb25kYXJ5IGluZGV4IGltcGxlbWVudGF0aW9ucy4KKyAqLworcHVibGljIGludGVyZmFjZSBCeXRlQ29tcGFyYWJsZQoreworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzb3VyY2UgdGhhdCBnZW5lcmF0ZXMgdGhlIGJ5dGUtY29tcGFyYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUgYnl0ZSBieSBieXRlLgorICAgICAqLworICAgIEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmVyc2lvbiB2ZXJzaW9uKTsKKworICAgIGVudW0gVmVyc2lvbgorICAgIHsKKyAgICAgICAgTEVHQUNZLCAvLyBFbmNvZGluZyB1c2VkIGluIGxlZ2FjeSBzc3RhYmxlIGZvcm1hdDsgZm9yd2FyZCAodmFsdWUgdG8gYnl0ZS1jb21wYXJhYmxlKSB0cmFuc2xhdGlvbiBvbmx5CisgICAgICAgIE9TUzUwLCAgLy8gQ0FTU0FORFJBIDUuMCBlbmNvZGluZworICAgIH0KKworICAgIEJ5dGVDb21wYXJhYmxlIEVNUFRZID0gKFZlcnNpb24gdmVyc2lvbikgLT4gQnl0ZVNvdXJjZS5FTVBUWTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBmcm9tIHRoZSBieXRlLWNvbXBhcmFibGUgcmVwcmVzZW50YXRpb24uIFVzZWQgZm9yIGRlYnVnZ2luZy4KKyAgICAgKi8KKyAgICBkZWZhdWx0IFN0cmluZyBieXRlQ29tcGFyYWJsZUFzU3RyaW5nKFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIEJ5dGVTb3VyY2Ugc3RyZWFtID0gYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbik7CisgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAibnVsbCI7CisgICAgICAgIGZvciAoaW50IGIgPSBzdHJlYW0ubmV4dCgpOyBiICE9IEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTTsgYiA9IHN0cmVhbS5uZXh0KCkpCisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKChiID4+IDQpICYgMHhGKSkuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoYiAmIDB4RikpOworICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgIH0KKworICAgIC8vIFNpbXBsZSBmYWN0b3JpZXMgdXNlZCBmb3IgdGVzdGluZworCisgICAgc3RhdGljIEJ5dGVDb21wYXJhYmxlIG9mKFN0cmluZyBzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHYgLT4gQnl0ZVNvdXJjZS5vZihzLCB2KTsKKyAgICB9CisKKyAgICBzdGF0aWMgQnl0ZUNvbXBhcmFibGUgb2YobG9uZyB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiB2IC0+IEJ5dGVTb3VyY2Uub2YodmFsdWUpOworICAgIH0KKworICAgIHN0YXRpYyBCeXRlQ29tcGFyYWJsZSBvZihpbnQgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gdiAtPiBCeXRlU291cmNlLm9mKHZhbHVlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQnl0ZUNvbXBhcmFibGUgZml4ZWRMZW5ndGgoQnl0ZUJ1ZmZlciBieXRlcykKKyAgICB7CisgICAgICAgIHJldHVybiB2IC0+IEJ5dGVTb3VyY2UuZml4ZWRMZW5ndGgoYnl0ZXMpOworICAgIH0KKworICAgIHN0YXRpYyBCeXRlQ29tcGFyYWJsZSBmaXhlZExlbmd0aChieXRlW10gYnl0ZXMpCisgICAgeworICAgICAgICByZXR1cm4gdiAtPiBCeXRlU291cmNlLmZpeGVkTGVuZ3RoKGJ5dGVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc2VwYXJhdG9yIGZvciB0d28gYnl0ZSBzb3VyY2VzLCBpLmUuIHNvbWV0aGluZyB0aGF0IGlzIGRlZmluaXRlbHkgPiBwcmV2TWF4LCBhbmQgPD0gY3Vyck1pbiwgYXNzdW1pbmcKKyAgICAgKiBwcmV2TWF4IDwgY3Vyck1pbi4KKyAgICAgKiBUaGlzIHJldHVybnMgdGhlIHNob3J0ZXN0IHByZWZpeCBvZiBjdXJyTWluIHRoYXQgaXMgZ3JlYXRlciB0aGFuIHByZXZNYXguCisgICAgICovCisgICAgc3RhdGljIEJ5dGVDb21wYXJhYmxlIHNlcGFyYXRvclByZWZpeChCeXRlQ29tcGFyYWJsZSBwcmV2TWF4LCBCeXRlQ29tcGFyYWJsZSBjdXJyTWluKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZlcnNpb24gLT4gQnl0ZVNvdXJjZS5zZXBhcmF0b3JQcmVmaXgocHJldk1heC5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSwgY3Vyck1pbi5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNlcGFyYXRvciBmb3IgdHdvIGJ5dGUgY29tcGFyYWJsZSwgaS5lLiBzb21ldGhpbmcgdGhhdCBpcyBkZWZpbml0ZWx5ID4gcHJldk1heCwgYW5kIDw9IGN1cnJNaW4sIGFzc3VtaW5nCisgICAgICogcHJldk1heCA8IGN1cnJNaW4uCisgICAgICogVGhpcyBpcyBhIHN0cmVhbSBvZiBsZW5ndGggMSBsb25nZXIgdGhhbiB0aGUgY29tbW9uIHByZWZpeCBvZiB0aGUgdHdvIHN0cmVhbXMsIHdpdGggbGFzdCBieXRlIG9uZSBoaWdoZXIgdGhhbiB0aGUKKyAgICAgKiBwcmV2TWF4IHN0cmVhbS4KKyAgICAgKi8KKyAgICBzdGF0aWMgQnl0ZUNvbXBhcmFibGUgc2VwYXJhdG9yR3QoQnl0ZUNvbXBhcmFibGUgcHJldk1heCwgQnl0ZUNvbXBhcmFibGUgY3Vyck1pbikKKyAgICB7CisgICAgICAgIHJldHVybiB2ZXJzaW9uIC0+IEJ5dGVTb3VyY2Uuc2VwYXJhdG9yR3QocHJldk1heC5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSwgY3Vyck1pbi5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSk7CisgICAgfQorCisgICAgc3RhdGljIEJ5dGVDb21wYXJhYmxlIGN1dChCeXRlQ29tcGFyYWJsZSBzcmMsIGludCBjdXRvZmYpCisgICAgeworICAgICAgICByZXR1cm4gdmVyc2lvbiAtPiBCeXRlU291cmNlLmN1dChzcmMuYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbiksIGN1dG9mZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsZW5ndGggb2YgYSBieXRlIGNvbXBhcmFibGUsIG5vdCBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0b3IgYnl0ZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW50IGxlbmd0aChCeXRlQ29tcGFyYWJsZSBzcmMsIFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIGludCBsID0gMDsKKyAgICAgICAgQnl0ZVNvdXJjZSBzID0gc3JjLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pOworICAgICAgICB3aGlsZSAocy5uZXh0KCkgIT0gQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgKytsOworICAgICAgICByZXR1cm4gbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHR3byBieXRlLWNvbXBhcmFibGUgdmFsdWVzIGJ5IHRoZWlyIGJ5dGUtY29tcGFyYWJsZSByZXByZXNlbnRhdGlvbi4gVXNlZCBmb3IgdGVzdHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxleGljb2dyYXBoaWMgdW5zaWduZWQgYnl0ZSBjb21wYXJpc29uIG9mIHRoZSBieXRlLWNvbXBhcmFibGUgcmVwcmVzZW50YXRpb25zIG9mIHRoZQorICAgICAqICAgICAgICAgdHdvIGFyZ3VtZW50cworICAgICAqLworICAgIHN0YXRpYyBpbnQgY29tcGFyZShCeXRlQ29tcGFyYWJsZSBieXRlczEsIEJ5dGVDb21wYXJhYmxlIGJ5dGVzMiwgVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgQnl0ZVNvdXJjZSBzMSA9IGJ5dGVzMS5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKTsKKyAgICAgICAgQnl0ZVNvdXJjZSBzMiA9IGJ5dGVzMi5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKTsKKworICAgICAgICBpZiAoczEgPT0gbnVsbCB8fCBzMiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uY29tcGFyZShzMSAhPSBudWxsLCBzMiAhPSBudWxsKTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGIxID0gczEubmV4dCgpOworICAgICAgICAgICAgaW50IGIyID0gczIubmV4dCgpOworICAgICAgICAgICAgaW50IGNtcCA9IEludGVnZXIuY29tcGFyZShiMSwgYjIpOworICAgICAgICAgICAgaWYgKGNtcCAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBjbXA7CisgICAgICAgICAgICBpZiAoYjEgPT0gQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtaW5pbXVtIHByZWZpeCB0aGF0IGRpZmZlcmVudGlhdGVzIHRoZSB0d28gZ2l2ZW4gYnl0ZS1jb21wYXJhYmxlIHJlcHJlc2VudGF0aW9ucy4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW50IGRpZmZQb2ludChCeXRlQ29tcGFyYWJsZSBieXRlczEsIEJ5dGVDb21wYXJhYmxlIGJ5dGVzMiwgVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgQnl0ZVNvdXJjZSBzMSA9IGJ5dGVzMS5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKTsKKyAgICAgICAgQnl0ZVNvdXJjZSBzMiA9IGJ5dGVzMi5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKTsKKyAgICAgICAgaW50IHBvcyA9IDE7CisgICAgICAgIGludCBiOworICAgICAgICB3aGlsZSAoKGIgPSBzMS5uZXh0KCkpID09IHMyLm5leHQoKSAmJiBiICE9IEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICsrcG9zOworICAgICAgICByZXR1cm4gcG9zOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J5dGVjb21wYXJhYmxlL0J5dGVDb21wYXJhYmxlLm1kIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvQnl0ZUNvbXBhcmFibGUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAxMmUyNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J5dGVjb21wYXJhYmxlL0J5dGVDb21wYXJhYmxlLm1kCkBAIC0wLDAgKzEsNzEyIEBACis8IS0tLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKyMgQnl0ZS1jb21wYXJhYmxlIHRyYW5zbGF0aW9uIG9mIHR5cGVzIChCeXRlQ29tcGFyYWJsZS9CeXRlU291cmNlKQorCisjIyBQcm9ibGVtIC8gTW90aXZhdGlvbgorCitDYXNzYW5kcmEgaGFzIGEgdmVyeSBoZWF2eSByZWxpYW5jZSBvbiBjb21wYXJpc29ucyDigJQgdGhleSBhcmUgdXNlZCB0aHJvdWdob3V0IHJlYWQgYW5kIHdyaXRlIHBhdGhzLCBjb29yZGluYXRpb24sCitjb21wYWN0aW9uLCBldGMuIHRvIGJlIGFibGUgdG8gb3JkZXIgYW5kIG1lcmdlIHJlc3VsdHMuIEl0IGFsc28gc3VwcG9ydHMgYSByYW5nZSBvZiB0eXBlcyB3aGljaCBvZnRlbiByZXF1aXJlIHRoZQorY29tcGFyZWQgb2JqZWN0IHRvIGJlIGNvbXBsZXRlbHkgaW4gbWVtb3J5IHRvIG9yZGVyIGNvcnJlY3RseSwgd2hpY2ggaW4gdHVybiBoYXMgbmVjZXNzaXRhdGVkIGludGVyZmFjZXMgd2hlcmUKK2NvbXBhcmlzb25zIGNhbiBvbmx5IGJlIGFwcGxpZWQgaWYgdGhlIGNvbXBhcmVkIG9iamVjdHMgYXJlIGNvbXBsZXRlbHkgbG9hZGVkLgorCitUaGlzIGhhcyBzb21lIHJhdGhlciBwYWluZnVsIGltcGxpY2F0aW9ucyBvbiB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGRhdGFiYXNlLCBib3RoIGluIHRlcm1zIG9mIHRoZSB0aW1lIGl0IHRha2VzIHRvIGxvYWQsCitjb21wYXJlIGFuZCBnYXJiYWdlIGNvbGxlY3QsIGFzIHdlbGwgYXMgaW4gdGVybXMgb2YgdGhlIHNwYWNlIHJlcXVpcmVkIHRvIGhvbGQgY29tcGxldGUga2V5cyBpbiBvbi1kaXNrIGluZGljZXMgYW5kCitkZXNlcmlhbGl6ZWQgdmVyc2lvbnMgaW4gaW4tbWVtb3J5IGRhdGEgc3RydWN0dXJlcy4gSW4gYWRkaXRpb24gdG8gdGhpcywgdGhlIHJlbGlhbmNlIG9uIGNvbXBhcmlzb25zIGZvcmNlcyBDYXNzYW5kcmEgdG8KK3VzZSBvbmx5IGNvbXBhcmlzb24tYmFzZWQgc3RydWN0dXJlcywgd2hpY2ggYXJlbuKAmXQgdGhlIG1vc3QgZWZmaWNpZW50LgorCitUaGVyZSBpcyBubyB3YXkgdG8gZXNjYXBlIHRoZSBuZWVkIHRvIGNvbXBhcmUgYW5kIG9yZGVyIG9iamVjdHMgaW4gQ2Fzc2FuZHJhLCBidXQgdGhlIG1hY2hpbmVyeSBmb3IgZG9pbmcgdGhpcyBjYW4gYmUKK2RvbmUgbXVjaCBtb3JlIHNtYXJ0bHkgaWYgd2UgaW1wb3NlIHNvbWUgc2ltcGxlIHN0cnVjdHVyZSBpbiB0aGUgb2JqZWN0cyB3ZSBkZWFsIHdpdGgg4oCUIGJ5dGUgb3JkZXJpbmcuCisKK1RoZSB0ZXJtIOKAnGJ5dGUgb3JkZXLigJ0gYXMgdXNlZCBpbiB0aGlzIGRvY3VtZW50IHJlZmVycyB0byB0aGUgcHJvcGVydHkgb2YgYmVpbmcgb3JkZXJlZCB2aWEgbGV4aWNvZ3JhcGhpYyBjb21wYXJlIG9uIHRoZQordW5zaWduZWQgdmFsdWVzIG9mIHRoZSBieXRlIGNvbnRlbnRzLiBTb21lIG9mIHRoZSB0eXBlcyBpbiBDYXNzYW5kcmEgYWxyZWFkeSBoYXZlIHRoaXMgcHJvcGVydHkgKGUuZy4gc3RyaW5ncywgYmxvYnMpLAorYnV0IG90aGVyIG1vc3QgaGVhdmlseSB1c2VkIG9uZXMgKGUuZy4gaW50ZWdlcnMsIHV1aWRzKSBkb27igJl0LgorCitXaGVuIGJ5dGUgb3JkZXIgaXMgdW5pdmVyc2FsbHkgYXZhaWxhYmxlIGZvciB0aGUgdHlwZXMgdXNlZCBmb3Iga2V5cywgc2V2ZXJhbCBrZXkgYWR2YW50YWdlcyBjYW4gYmUgcHV0IHRvIHVzZToKKworLSBDb21wYXJpc29ucyBjYW4gYmUgZG9uZSB1c2luZyBhIHNpbmdsZSBzaW1wbGUgbWV0aG9kLCBjb3JlIG1hY2hpbmVyeSBkb2VzbuKAmXQgbmVlZCB0byBrbm93IGFueXRoaW5nIGFib3V0IHR5cGVzLgorLSBQcmVmaXggZGlmZmVyZW5jZXMgYXJlIGVub3VnaCB0byBkZWZpbmUgb3JkZXI7IHVuaXF1ZSBwcmVmaXhlcyBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGNvbXBsZXRlIGtleXMuCistIFRyaWVzIGNhbiBiZSB1c2VkIHRvIHN0b3JlLCBxdWVyeSBhbmQgaXRlcmF0ZSBvdmVyIHJhbmdlcyBvZiBrZXlzLCBwcm92aWRpbmcgZmFzdCBsb29rdXAgYW5kIHByZWZpeCBjb21wcmVzc2lvbi4KKy0gTWVyZ2luZyBjYW4gYmUgcGVyZm9ybWVkIGJ5IG1lcmdpbmcgdHJpZXMsIHNpZ25pZmljYW50bHkgcmVkdWNpbmcgdGhlIG51bWJlciBvZiBuZWNlc3NhcnkgY29tcGFyaXNvbnMuCisKKyMjIE9yZGVyaW5nIHRoZSB0eXBlcworCitBcyB3ZSB3YW50IHRvIGtlZXAgYWxsIGV4aXN0aW5nIGZ1bmN0aW9uYWxpdHkgaW4gQ2Fzc2FuZHJhLCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gZGVhbCB3aXRoIGV4aXN0aW5nCitub24tYnl0ZS1vcmRlci1jb21wYXJhYmxlIHR5cGVzLiBUaGlzIHJlcXVpcmVzIHNvbWUgZm9ybSBvZiBjb252ZXJzaW9uIG9mIGVhY2ggdmFsdWUgdG8gYSBzZXF1ZW5jZSBvZiBieXRlcyB0aGF0IGNhbiBiZQorYnl0ZS1vcmRlciBjb21wYXJlZCAoYWxzbyBjYWxsZWQgImJ5dGUtY29tcGFyYWJsZSIpLCBhcyB3ZWxsIGFzIHRoZSBpbnZlcnNlIGNvbnZlcnNpb24gZnJvbSBieXRlLWNvbXBhcmFibGUgdG8gdmFsdWUuCisKK0FzIG9uZSBvZiB0aGUgbWFpbiBhZHZhbnRhZ2VzIG9mIGJ5dGUgb3JkZXIgaXMgdGhlIGFiaWxpdHkgdG8gZGVjaWRlIGNvbXBhcmlzb25zIGVhcmx5LCB3aXRob3V0IGhhdmluZyB0byByZWFkIHRoZSB3aG9sZQorb2YgdGhlIGlucHV0IHNlcXVlbmNlLCBieXRlLW9yZGVyZWQgaW50ZXJwcmV0YXRpb25zIG9mIHZhbHVlcyBhcmUgcmVwcmVzZW50ZWQgYXMgc291cmNlcyBvZiBieXRlcyB3aXRoIHVua25vd24gbGVuZ3RoLAordXNpbmcgdGhlIGludGVyZmFjZSBgQnl0ZVNvdXJjZWAuIFRoZSBpbnRlcmZhY2UgZGVjbGFyZXMgb25lIG1ldGhvZCwgYG5leHQoKWAgd2hpY2ggcHJvZHVjZXMgdGhlIG5leHQgYnl0ZSBvZiB0aGUKK3N0cmVhbSwgb3IgYEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTWAgaWYgdGhlIHN0cmVhbSBpcyBleGhhdXN0ZWQuCisKK2BFTkRfT0ZfU1RSRUFNYCBpcyBjaG9zZW4gYXMgYC0xYCAoYChpbnQpIC0xYCwgd2hpY2ggaXMgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgcG9zc2libGUgYnl0ZSB2YWx1ZXMpLCB0byBtYWtlIGNvbXBhcmluZwordHdvIGJ5dGUgc291cmNlcyBhcyB0cml2aWFsIChhbmQgdGh1cyBmYXN0KSBhcyBwb3NzaWJsZS4KKworVG8gYmUgYWJsZSB0byBjb21wbGV0ZWx5IGFic3RyYWN0IHR5cGUgaW5mb3JtYXRpb24gYXdheSBmcm9tIHRoZSBzdG9yYWdlIG1hY2hpbmVyeSwgd2UgYWxzbyBmbGF0dGVuIGNvbXBsZXggdHlwZXMgaW50bworc2luZ2xlIGJ5dGUgc2VxdWVuY2VzLiBUbyBkbyB0aGlzLCB3ZSBhZGQgc2VwYXJhdG9yIGJ5dGVzIGluIGZyb250LCBiZXR3ZWVuIGNvbXBvbmVudHMsIGFuZCBhdCB0aGUgZW5kIGFuZCBkbyBzb21lCitlbmNvZGluZyBvZiB2YXJpYWJsZS1sZW5ndGggc2VxdWVuY2VzLgorCitUaGUgb3RoZXIgaW50ZXJmYWNlIHByb3ZpZGVkIGJ5IHRoaXMgcGFja2FnZSBgQnl0ZUNvbXBhcmFibGVgLCBpcyBhbiBlbnRpdHkgd2hvc2UgYnl0ZS1vcmRlcmVkIGludGVycHJldGF0aW9uIGNhbiBiZQorcmVxdWVzdGVkLiBUaGUgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGBEZWNvcmF0ZWRLZXlgLCBhbmQgY2FuIGJlIHJlcXVlc3RlZCBmb3IgY2x1c3RlcmluZyBrZXlzIGFuZCBib3VuZHMgdXNpbmcKK2BDbHVzdGVyaW5nQ29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlYC4gVGhlIGludmVyc2UgdHJhbnNsYXRpb24gaXMgcHJvdmlkZWQgYnkKK2BCdWZmZXIvTmF0aXZlRGVjb3JhdGVkS2V5LmZyb21CeXRlQ29tcGFyYWJsZWAgYW5kIGBDbHVzdGVyaW5nQ29tcGFyYXRvci5jbHVzdGVyaW5nL2JvdW5kL2JvdW5kYXJ5RnJvbUJ5dGVDb21wYXJhYmxlYC4KKworVGhlIChyYXRoZXIgdGVjaG5pY2FsKSBwYXJhZ3JhcGhzIGJlbG93IGRldGFpbCB0aGUgZW5jb2Rpbmcgd2UgaGF2ZSBjaG9zZW4gZm9yIHRoZSB2YXJpb3VzIHR5cGVzLiBGb3Igc2ltcGxpY2l0eSB3ZQorb25seSBkaXNjdXNzIHRoZSBiaWRpcmVjdGlvbmFsIGBPU1M1MGAgdmVyc2lvbiBvZiB0aGUgdHJhbnNsYXRpb24uIFRoZSBpbXBsZW1lbnRhdGlvbnMgaW4gY29kZSBvZiB0aGUgdmFyaW91cyBtYXBwaW5ncworYXJlIGluIHRoZSByZWxlYXZhbnQgYEFic3RyYWN0VHlwZWAgc3ViY2xhc3MuCisKKyMjIyBEZXNpcmVkIHByb3BlcnRpZXMKKworR2VuZXJhbGx5LCB3ZSBkZXNpcmUgdGhlIGZvbGxvd2luZyB0d28gcHJvcGVydGllcyBmcm9tIHRoZSBieXRlLW9yZGVyZWQgdHJhbnNsYXRpb25zIG9mIHZhbHVlcyB3ZSB1c2UgaW4gdGhlIGRhdGFiYXNlOgorCistIENvbXBhcmlzb24gZXF1aXZhbGVuY2UgKDEpOiAgCisgICAgPG1hdGggeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiPgorICAgICAgPHNlbWFudGljcz4KKyAgICAgICAgPG1zdHlsZSBkaXNwbGF5c3R5bGU9InRydWUiPgorICAgICAgICAgIDxtbz4mI3gyMjAwOzwvbW8+CisgICAgICAgICAgPG1pPng8L21pPgorICAgICAgICAgIDxtbz4sPC9tbz4KKyAgICAgICAgICA8bWk+eTwvbWk+CisgICAgICAgICAgPG1vPiYjeDIyMDg7PC9tbz4KKyAgICAgICAgICA8bWk+VDwvbWk+CisgICAgICAgICAgPG1vPiw8L21vPgorICAgICAgICAgIDxtcm93PgorICAgICAgICAgICAgPG10ZXh0PmNvbXBhcmVCeXRlc1Vuc2lnbmVkPC9tdGV4dD4KKyAgICAgICAgICA8L21yb3c+CisgICAgICAgICAgPG1yb3c+CisgICAgICAgICAgICA8bW8+KDwvbW8+CisgICAgICAgICAgICA8bWk+VDwvbWk+CisgICAgICAgICAgICA8bW8+LjwvbW8+CisgICAgICAgICAgICA8bXJvdz4KKyAgICAgICAgICAgICAgPG10ZXh0PmJ5dGVPcmRlcmVkPC9tdGV4dD4KKyAgICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgICAgIDxtcm93PgorICAgICAgICAgICAgICA8bW8+KDwvbW8+CisgICAgICAgICAgICAgIDxtaT54PC9taT4KKyAgICAgICAgICAgICAgPG1vPik8L21vPgorICAgICAgICAgICAgPC9tcm93PgorICAgICAgICAgICAgPG1vPiw8L21vPgorICAgICAgICAgICAgPG1pPlQ8L21pPgorICAgICAgICAgICAgPG1vPi48L21vPgorICAgICAgICAgICAgPG1yb3c+CisgICAgICAgICAgICAgIDxtdGV4dD5ieXRlT3JkZXJlZDwvbXRleHQ+CisgICAgICAgICAgICA8L21yb3c+CisgICAgICAgICAgICA8bXJvdz4KKyAgICAgICAgICAgICAgPG1vPig8L21vPgorICAgICAgICAgICAgICA8bWk+eTwvbWk+CisgICAgICAgICAgICAgIDxtbz4pPC9tbz4KKyAgICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgICAgIDxtbz4pPC9tbz4KKyAgICAgICAgICA8L21yb3c+CisgICAgICAgICAgPG1vPj08L21vPgorICAgICAgICAgIDxtaT5UPC9taT4KKyAgICAgICAgICA8bW8+LjwvbW8+CisgICAgICAgICAgPG1yb3c+CisgICAgICAgICAgICA8bXRleHQ+Y29tcGFyZTwvbXRleHQ+CisgICAgICAgICAgPC9tcm93PgorICAgICAgICAgIDxtcm93PgorICAgICAgICAgICAgPG1vPig8L21vPgorICAgICAgICAgICAgPG1pPng8L21pPgorICAgICAgICAgICAgPG1vPiw8L21vPgorICAgICAgICAgICAgPG1pPnk8L21pPgorICAgICAgICAgICAgPG1vPik8L21vPgorICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgPC9tc3R5bGU+CisgICAgICAgIDwhLS0gPGFubm90YXRpb24gZW5jb2Rpbmc9InRleHQveC1hc2NpaW1hdGgiPmZvcmFsbCB4LHkgaW4gVCwgImNvbXBhcmVCeXRlc1Vuc2lnbmVkIihULiJieXRlT3JkZXJlZCIoeCksIFQuImJ5dGVPcmRlcmVkIih5KSk9VC4iY29tcGFyZSIoeCwgeSk8L2Fubm90YXRpb24+IC0tPgorICAgICAgPC9zZW1hbnRpY3M+CisgICAgPC9tYXRoPgorLSBQcmVmaXgtZnJlZWRvbSAoMik6ICAKKyAgICA8bWF0aCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCI+CisgICAgICA8c2VtYW50aWNzPgorICAgICAgICA8bXN0eWxlIGRpc3BsYXlzdHlsZT0idHJ1ZSI+CisgICAgICAgICAgPG1vPiYjeDIyMDA7PC9tbz4KKyAgICAgICAgICA8bWk+eDwvbWk+CisgICAgICAgICAgPG1vPiw8L21vPgorICAgICAgICAgIDxtaT55PC9taT4KKyAgICAgICAgICA8bW8+JiN4MjIwODs8L21vPgorICAgICAgICAgIDxtaT5UPC9taT4KKyAgICAgICAgICA8bW8+LDwvbW8+CisgICAgICAgICAgPG1pPlQ8L21pPgorICAgICAgICAgIDxtbz4uPC9tbz4KKyAgICAgICAgICA8bXJvdz4KKyAgICAgICAgICAgIDxtdGV4dD5ieXRlT3JkZXJlZDwvbXRleHQ+CisgICAgICAgICAgPC9tcm93PgorICAgICAgICAgIDxtcm93PgorICAgICAgICAgICAgPG1vPig8L21vPgorICAgICAgICAgICAgPG1pPng8L21pPgorICAgICAgICAgICAgPG1vPik8L21vPgorICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgICA8bXJvdz4KKyAgICAgICAgICAgIDxtc3BhY2Ugd2lkdGg9IjFleCIgLz4KKyAgICAgICAgICAgIDxtdGV4dD4gaXMgbm90IGEgcHJlZml4IG9mIDwvbXRleHQ+CisgICAgICAgICAgICA8bXNwYWNlIHdpZHRoPSIxZXgiIC8+CisgICAgICAgICAgPC9tcm93PgorICAgICAgICAgIDxtaT5UPC9taT4KKyAgICAgICAgICA8bW8+LjwvbW8+CisgICAgICAgICAgPG1yb3c+CisgICAgICAgICAgICA8bXRleHQ+Ynl0ZU9yZGVyZWQ8L210ZXh0PgorICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgICA8bXJvdz4KKyAgICAgICAgICAgIDxtbz4oPC9tbz4KKyAgICAgICAgICAgIDxtaT55PC9taT4KKyAgICAgICAgICAgIDxtbz4pPC9tbz4KKyAgICAgICAgICA8L21yb3c+CisgICAgICAgIDwvbXN0eWxlPgorICAgICAgICA8IS0tIDxhbm5vdGF0aW9uIGVuY29kaW5nPSJ0ZXh0L3gtYXNjaWltYXRoIj5mb3JhbGwgeCx5IGluIFQsIFQuImJ5dGVPcmRlcmVkIih4KSAiIGlzIG5vdCBhIHByZWZpeCBvZiAiIFQuImJ5dGVPcmRlcmVkIih5KTwvYW5ub3RhdGlvbj4gLS0+CisgICAgICA8L3NlbWFudGljcz4KKyAgICA8L21hdGg+CisKK1RoZSBmb3JtZXIgaXMgdGhlIGVzc2VudGlhbCByZXF1aXJlbWVudCwgYW5kIHRoZSBsYXR0ZXIgYWxsb3dzIGNvbnN0cnVjdGlvbiBvZiBlbmNvZGluZ3Mgb2Ygc2VxdWVuY2VzIG9mIG11bHRpcGxlCit2YWx1ZXMsIGFzIHdlbGwgYXMgYSBsaXR0bGUgbW9yZSBlZmZpY2llbmN5IGluIHRoZSBkYXRhIHN0cnVjdHVyZXMuCisKK1RvIG1vcmUgZWZmaWNpZW50bHkgZW5jb2RlIGJ5dGUtb3JkZXJlZCBibG9icywgaG93ZXZlciwgd2UgdXNlIGEgc2xpZ2h0bHkgdHdlYWtlZCB2ZXJzaW9uIG9mIHRoZSBhYm92ZSByZXF1aXJlbWVudHM6CisKKy0gQ29tcGFyaXNvbiBlcXVpdmFsZW5jZSAoMyk6ICAKKyAgICA8bWF0aCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCI+CisgICAgICA8c2VtYW50aWNzPgorICAgICAgICA8bXN0eWxlIGRpc3BsYXlzdHlsZT0idHJ1ZSI+CisgICAgICAgICAgPG1vPiYjeDIyMDA7PC9tbz4KKyAgICAgICAgICA8bWk+eDwvbWk+CisgICAgICAgICAgPG1vPiw8L21vPgorICAgICAgICAgIDxtaT55PC9taT4KKyAgICAgICAgICA8bW8+JiN4MjIwODs8L21vPgorICAgICAgICAgIDxtaT5UPC9taT4KKyAgICAgICAgICA8bW8+LDwvbW8+CisgICAgICAgICAgPG1vPiYjeDIyMDA7PC9tbz4KKyAgICAgICAgICA8bXN1Yj4KKyAgICAgICAgICAgIDxtaT5iPC9taT4KKyAgICAgICAgICAgIDxtbj4xPC9tbj4KKyAgICAgICAgICA8L21zdWI+CisgICAgICAgICAgPG1vPiw8L21vPgorICAgICAgICAgIDxtc3ViPgorICAgICAgICAgICAgPG1pPmI8L21pPgorICAgICAgICAgICAgPG1uPjI8L21uPgorICAgICAgICAgIDwvbXN1Yj4KKyAgICAgICAgICA8bW8+JiN4MjIwODs8L21vPgorICAgICAgICAgIDxtcm93PgorICAgICAgICAgICAgPG1vPls8L21vPgorICAgICAgICAgICAgPG1uPjB4MTA8L21uPgorICAgICAgICAgICAgPG1vPi08L21vPgorICAgICAgICAgICAgPG1uPjB4RUY8L21uPgorICAgICAgICAgICAgPG1vPl08L21vPgorICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgICA8bW8+LDwvbW8+CisgICAgICAgICAgICA8bXRleHQ+PGJyLz48L210ZXh0PgorICAgICAgICAgIDxtcm93PgorICAgICAgICAgICAgPG10ZXh0PmNvbXBhcmVCeXRlc1Vuc2lnbmVkPC9tdGV4dD4KKyAgICAgICAgICA8L21yb3c+CisgICAgICAgICAgPG1yb3c+CisgICAgICAgICAgICA8bW8+KDwvbW8+CisgICAgICAgICAgICA8bWk+VDwvbWk+CisgICAgICAgICAgICA8bW8+LjwvbW8+CisgICAgICAgICAgICA8bXJvdz4KKyAgICAgICAgICAgICAgPG10ZXh0PmJ5dGVPcmRlcmVkPC9tdGV4dD4KKyAgICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgICAgIDxtcm93PgorICAgICAgICAgICAgICA8bW8+KDwvbW8+CisgICAgICAgICAgICAgIDxtaT54PC9taT4KKyAgICAgICAgICAgICAgPG1vPik8L21vPgorICAgICAgICAgICAgPC9tcm93PgorICAgICAgICAgICAgPG1vPis8L21vPgorICAgICAgICAgICAgPG1zdWI+CisgICAgICAgICAgICAgIDxtaT5iPC9taT4KKyAgICAgICAgICAgICAgPG1uPjE8L21uPgorICAgICAgICAgICAgPC9tc3ViPgorICAgICAgICAgICAgPG1vPiw8L21vPgorICAgICAgICAgICAgPG1pPlQ8L21pPgorICAgICAgICAgICAgPG1vPi48L21vPgorICAgICAgICAgICAgPG1yb3c+CisgICAgICAgICAgICAgIDxtdGV4dD5ieXRlT3JkZXJlZDwvbXRleHQ+CisgICAgICAgICAgICA8L21yb3c+CisgICAgICAgICAgICA8bXJvdz4KKyAgICAgICAgICAgICAgPG1vPig8L21vPgorICAgICAgICAgICAgICA8bWk+eTwvbWk+CisgICAgICAgICAgICAgIDxtbz4pPC9tbz4KKyAgICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgICAgIDxtbz4rPC9tbz4KKyAgICAgICAgICAgIDxtc3ViPgorICAgICAgICAgICAgICA8bWk+YjwvbWk+CisgICAgICAgICAgICAgIDxtbj4yPC9tbj4KKyAgICAgICAgICAgIDwvbXN1Yj4KKyAgICAgICAgICAgIDxtbz4pPC9tbz4KKyAgICAgICAgICA8L21yb3c+CisgICAgICAgICAgPG1vPj08L21vPgorICAgICAgICAgIDxtaT5UPC9taT4KKyAgICAgICAgICA8bW8+LjwvbW8+CisgICAgICAgICAgPG1yb3c+CisgICAgICAgICAgICA8bXRleHQ+Y29tcGFyZTwvbXRleHQ+CisgICAgICAgICAgPC9tcm93PgorICAgICAgICAgIDxtcm93PgorICAgICAgICAgICAgPG1vPig8L21vPgorICAgICAgICAgICAgPG1pPng8L21pPgorICAgICAgICAgICAgPG1vPiw8L21vPgorICAgICAgICAgICAgPG1pPnk8L21pPgorICAgICAgICAgICAgPG1vPik8L21vPgorICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgPC9tc3R5bGU+CisgICAgICAgIDwhLS0gPGFubm90YXRpb24gZW5jb2Rpbmc9InRleHQveC1hc2NpaW1hdGgiPmZvcmFsbCB4LHkgaW4gVCwgZm9yYWxsIGJfMSwgYl8yIGluIFsweDEwLTB4RUZdLAorICAgICJjb21wYXJlQnl0ZXNVbnNpZ25lZCIoVC4iYnl0ZU9yZGVyZWQiKHgpK2JfMSwgVC4iYnl0ZU9yZGVyZWQiKHkpK2JfMik9VC4iY29tcGFyZSIoeCwgeSk8L2Fubm90YXRpb24+IC0tPgorICAgICAgPC9zZW1hbnRpY3M+CisgICAgPC9tYXRoPgorLSBXZWFrIHByZWZpeC1mcmVlZG9tICg0KTogIAorICAgIDxtYXRoIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIj4KKyAgICAgIDxzZW1hbnRpY3M+CisgICAgICAgIDxtc3R5bGUgZGlzcGxheXN0eWxlPSJ0cnVlIj4KKyAgICAgICAgICA8bW8+JiN4MjIwMDs8L21vPgorICAgICAgICAgIDxtaT54PC9taT4KKyAgICAgICAgICA8bW8+LDwvbW8+CisgICAgICAgICAgPG1pPnk8L21pPgorICAgICAgICAgIDxtbz4mI3gyMjA4OzwvbW8+CisgICAgICAgICAgPG1pPlQ8L21pPgorICAgICAgICAgIDxtbz4sPC9tbz4KKyAgICAgICAgICA8bW8+JiN4MjIwMDs8L21vPgorICAgICAgICAgIDxtaT5iPC9taT4KKyAgICAgICAgICA8bW8+JiN4MjIwODs8L21vPgorICAgICAgICAgIDxtcm93PgorICAgICAgICAgICAgPG1vPls8L21vPgorICAgICAgICAgICAgPG1uPjB4MTA8L21uPgorICAgICAgICAgICAgPG1vPi08L21vPgorICAgICAgICAgICAgPG1uPjB4RUY8L21uPgorICAgICAgICAgICAgPG1vPl08L21vPgorICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgICA8bW8+LDwvbW8+CisgICAgICAgICAgICA8bXRleHQ+PGJyLz48L210ZXh0PgorICAgICAgICAgIDxtcm93PgorICAgICAgICAgICAgPG1vPig8L21vPgorICAgICAgICAgICAgPG1pPlQ8L21pPgorICAgICAgICAgICAgPG1vPi48L21vPgorICAgICAgICAgICAgPG1yb3c+CisgICAgICAgICAgICAgIDxtdGV4dD5ieXRlT3JkZXJlZDwvbXRleHQ+CisgICAgICAgICAgICA8L21yb3c+CisgICAgICAgICAgICA8bXJvdz4KKyAgICAgICAgICAgICAgPG1vPig8L21vPgorICAgICAgICAgICAgICA8bWk+eDwvbWk+CisgICAgICAgICAgICAgIDxtbz4pPC9tbz4KKyAgICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgICAgIDxtbz4rPC9tbz4KKyAgICAgICAgICAgIDxtaT5iPC9taT4KKyAgICAgICAgICAgIDxtbz4pPC9tbz4KKyAgICAgICAgICA8L21yb3c+CisgICAgICAgICAgPG1yb3c+CisgICAgICAgICAgICA8bXNwYWNlIHdpZHRoPSIxZXgiIC8+CisgICAgICAgICAgICA8bXRleHQ+IGlzIG5vdCBhIHByZWZpeCBvZiA8L210ZXh0PgorICAgICAgICAgICAgPG1zcGFjZSB3aWR0aD0iMWV4IiAvPgorICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgICA8bWk+VDwvbWk+CisgICAgICAgICAgPG1vPi48L21vPgorICAgICAgICAgIDxtcm93PgorICAgICAgICAgICAgPG10ZXh0PmJ5dGVPcmRlcmVkPC9tdGV4dD4KKyAgICAgICAgICA8L21yb3c+CisgICAgICAgICAgPG1yb3c+CisgICAgICAgICAgICA8bW8+KDwvbW8+CisgICAgICAgICAgICA8bWk+eTwvbWk+CisgICAgICAgICAgICA8bW8+KTwvbW8+CisgICAgICAgICAgPC9tcm93PgorICAgICAgICA8L21zdHlsZT4KKyAgICAgICAgPCEtLSA8YW5ub3RhdGlvbiBlbmNvZGluZz0idGV4dC94LWFzY2lpbWF0aCI+Zm9yYWxsIHgseSBpbiBULCBmb3JhbGwgYiBpbiBbMHgxMC0weEVGXSwKKyAgICAoVC4iYnl0ZU9yZGVyZWQiKHgpK2IpICIgaXMgbm90IGEgcHJlZml4IG9mICIgVC4iYnl0ZU9yZGVyZWQiKHkpPC9hbm5vdGF0aW9uPiAtLT4KKyAgICAgIDwvc2VtYW50aWNzPgorICAgIDwvbWF0aD4KKworVGhlc2UgdmVyc2lvbnMgYWxsb3cgdGhlIGFkZGl0aW9uIG9mIGEgc2VwYXJhdG9yIGJ5dGUgYWZ0ZXIgZWFjaCB2YWx1ZSwgYW5kIGd1YXJhbnRlZSB0aGF0IHRoZSBjb21iaW5hdGlvbiB3aXRoCitzZXBhcmF0b3IgZnVsZmlsbHMgdGhlIG9yaWdpbmFsIHJlcXVpcmVtZW50cy4gKDMpIGlzIHNvbWV3aGF0IHN0cm9uZ2VyIHRoYW4gKDEpIGJ1dCBpcyBuZWNlc3NhcmlseSB0cnVlIGlmICgyKSBpcyBhbHNvCitpbiBmb3JjZSwgd2hpbGUgKDQpIHRyaXZpYWxseSBmb2xsb3dzIGZyb20gKDIpLgorCisjIyBGaXhlZCBsZW5ndGggdW5zaWduZWQgaW50ZWdlcnMgKE11cm11ciB0b2tlbiwgZGF0ZS90aW1lKQorCitUaGlzIGlzIHRoZSB0cml2aWFsIGNhc2UsIGFzIHdlIGNhbiBzaW1wbHkgdXNlIHRoZSBpbnB1dCBieXRlcyBpbiBiaWctZW5kaWFuIG9yZGVyLiBUaGUgY29tcGFyaXNvbiByZXN1bHQgaXMgdGhlIHNhbWUsCithbmQgZml4ZWQgbGVuZ3RoIHZhbHVlcyBhcmUgdHJpdmlhbGx5IHByZWZpeCBmcmVlLCBpLmUuICgxKSBhbmQgKDIpIGFyZSBzYXRpc2ZpZWQsIGFuZCB0aHVzICgzKSBhbmQgKDQpIGZvbGxvdyBmcm9tIHRoZQorb2JzZXJ2YXRpb24gYWJvdmUuCisKKyMjIEZpeGVkLWxlbmd0aCBzaWduZWQgaW50ZWdlcnMgKGJ5dGUsIHNob3J0LCBpbnQsIGxlZ2FjeSBiaWdpbnQpCisKK0FzIGFib3ZlLCBidXQgd2UgbmVlZCB0byBpbnZlcnQgdGhlIHNpZ24gYml0IG9mIHRoZSBudW1iZXIgdG8gcHV0IG5lZ2F0aXZlIG51bWJlcnMgYmVmb3JlIHBvc2l0aXZlcy4gVGhpcyBtYXBzCitgTUlOX1ZBTFVFYCB0byBgMHgwMGAuLi4sIGAtMWAgdG8gYDB4N0bigKZgLCBgMGAgdG8gYDB4ODDigKZgLCBhbmQgYE1BWF9WQUxVRWAgdG8gYDB4RkbigKZgOyBjb21wYXJpbmcgdGhlIHJlc3VsdGluZyBudW1iZXIKK2FzIGFuIHVuc2lnbmVkIGludGVnZXIgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBjb21wYXJpbmcgdGhlIHNvdXJjZSBzaWduZWQuCisKK0V4YW1wbGVzOgorCisKK3wgVHlwZSBhbmQgdmFsdWUgfCBieXRlcyAgICAgICAgICAgICAgICAgICB8IGVuY29kZXMgYXMgICAgICAgICAgICAgIHwKK3wgLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKK3wgaW50IDEgICAgICAgICAgfCAwMCAwMCAwMCAwMSAgICAgICAgICAgICB8IDgwIDAwIDAwIDAxICAgICAgICAgICAgIHwKK3wgc2hvcnQgLTEgICAgICAgfCBGRiBGRiAgICAgICAgICAgICAgICAgICB8IDdGIEZGICAgICAgICAgICAgICAgICAgIHwKK3wgYnl0ZSAwICAgICAgICAgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IDgwICAgICAgICAgICAgICAgICAgICAgIHwKK3wgYnl0ZSAtMiAgICAgICAgfCBGRSAgICAgICAgICAgICAgICAgICAgICB8IDdFICAgICAgICAgICAgICAgICAgICAgIHwKK3wgaW50IE1BWF9WQUxVRSAgfCA3RiBGRiBGRiBGRiAgICAgICAgICAgICB8IEZGIEZGIEZGIEZGICAgICAgICAgICAgIHwKK3wgbG9uZyBNSU5fVkFMVUUgfCA4MCAwMCAwMCAwMCAwMCAwMCAwMCAwMCB8IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIHwKKworIyMgVmFyaWFibGUtbGVuZ3RoIGVuY29kaW5nIG9mIGludGVnZXJzIChjdXJyZW50IGJpZ2ludCkKKworQW5vdGhlciB3YXkgdG8gZW5jb2RlIGludGVnZXJzIHRoYXQgbWF5IHNhdmUgc2lnbmlmaWNhbnQgYW1vdW50cyBvZiBzcGFjZSB3aGVuIHNtYWxsZXIgbnVtYmVycyBhcmUgb2Z0ZW4gaW4gdXNlLCBidXQKK3N0aWxsIHBlcm1pdHMgbGFyZ2UgdmFsdWVzIHRvIGJlIGVmZmljaWVudGx5IGVuY29kZWQsIGlzIHRvIHVzZSBhbiBlbmNvZGluZyBzY2hlbWUgc2ltaWxhciB0byBVVEYtOC4KKworRm9yIHVuc2lnbmVkIG51bWJlcnMgdGhpcyBjYW4gYmUgZG9uZSBieSBzdGFydGluZyB0aGUgbnVtYmVyIHdpdGggYXMgbWFueSAxcyBpbiBtb3N0IHNpZ25pZmljYW50IGJpdHMgYXMgdGhlcmUgYXJlCithZGRpdGlvbmFsIGJ5dGVzIGluIHRoZSBlbmNvZGluZywgZm9sbG93ZWQgYnkgYSAwLCBhbmQgdGhlIGJpdHMgb2YgdGhlIG51bWJlci4gTnVtYmVycyBiZXR3ZWVuIDAgYW5kIDEyNyBhcmUgZW5jb2RlZAoraW4gb25lIGJ5dGUsIGFuZCBlYWNoIGFkZGl0aW9uYWwgYnl0ZSBhZGRzIDcgbW9yZSBiaXRzLiBWYWx1ZXMgdGhhdCB1c2UgYWxsIDggYnl0ZXMgZG8gbm90IG5lZWQgYSA5dGggYml0IG9mIDAgYW5kIGNhbgordGh1cyBmaXQgOSBieXRlcy4gQmVjYXVzZSBsb25nZXIgbnVtYmVycyBoYXZlIG1vcmUgMXMgaW4gdGhlaXIgTVNCcywgdGhleSBjb21wYXJlCitoaWdoZXIgdGhhbiBzaG9ydGVyIG9uZXMgKGFuZCB3ZSBhbHdheXMgdXNlIHRoZSBzaG9ydGVzdCByZXByZXNlbnRhdGlvbikuIEJlY2F1c2UgdGhlIGxlbmd0aCBpcyBzcGVjaWZpZWQgdGhyb3VnaCB0aGVzZQoraW5pdGlhbCBiaXRzLCBubyB2YWx1ZSBjYW4gYmUgYSBwcmVmaXggb2YgYW5vdGhlci4KKworCit8IFZhbHVlICAgICAgICAgICAgfCBieXRlcyAgICAgICAgICAgICAgICAgICB8IGVuY29kZXMgYXMgICAgICAgICAgICAgICAgIHwKK3wgLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorfCAwICAgICAgICAgICAgICAgIHwgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgfCAwMCAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IDEgICAgICAgICAgICAgICAgfCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMSB8IDAxICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgMTI3ICgyXjctMSkgICAgICB8IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDdGIHwgN0YgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAxMjggKDJeNykgICAgICAgIHwgMDAgMDAgMDAgMDAgMDAgMDAgMDAgODAgfCA4MCA4MCAgICAgICAgICAgICAgICAgICAgICB8Cit8IDE2MzgzICgyXjE0IC0gMSkgfCAwMCAwMCAwMCAwMCAwMCAwMCAzRiBGRiB8IEJGIEZGICAgICAgICAgICAgICAgICAgICAgIHwKK3wgMTYzODQgKDJeMTQpICAgICB8IDAwIDAwIDAwIDAwIDAwIDAwIDQwIDAwIHwgQzAgNDAgMDAgICAgICAgICAgICAgICAgICAgfAorfCAyXjMxIC0gMSAgICAgICAgIHwgMDAgMDAgMDAgMDAgN0YgRkYgRkYgRkYgfCBGMCA3RiBGRiBGRiBGRiAgICAgICAgICAgICB8Cit8IDJeMzEgICAgICAgICAgICAgfCAwMCAwMCAwMCAwMCA4MCAwMCAwMCAwMCB8IEYwIDgwIDAwIDAwIDAwICAgICAgICAgICAgIHwKK3wgMl41NiAtIDEgICAgICAgICB8IDAwIEZGIEZGIEZGIEZGIEZGIEZGIEZGIHwgRkUgRkYgRkYgRkYgRkYgRkYgRkYgRkYgICAgfAorfCAyXjU2ICAgICAgICAgICAgIHwgMDEgMDAgMDAgMDAgMDAgMDAgMDAgMDAgfCBGRiAwMSAwMCAwMCAwMCAwMCAwMCAwMCAwMCB8Cit8IDJeNjQtIDEgICAgICAgICAgfCBGRiBGRiBGRiBGRiBGRiBGRiBGRiBGRiB8IEZGIEZGIEZGIEZGIEZGIEZGIEZGIEZGIEZGIHwKKworVG8gZW5jb2RlIHNpZ25lZCBudW1iZXJzLCB3ZSBtdXN0IHN0YXJ0IHdpdGggdGhlIHNpZ24gYml0LCBhbmQgbXVzdCBhbHNvIGVuc3VyZSB0aGF0IGxvbmdlciBuZWdhdGl2ZSBudW1iZXJzIHNvcnQKK3NtYWxsZXIgdGhhbiBzaG9ydGVyIG9uZXMuIFRoZSBmaXJzdCBiaXQgb2YgdGhlIGVuY29kaW5nIGlzIHRoZSBpbnZlcnRlZCBzaWduIChpLmUuIDEgZm9yIHBvc2l0aXZlLCAwIGZvciBuZWdhdGl2ZSksCitmb2xsb3dlZCBieSB0aGUgbGVuZ3RoIGVuY29kZWQgYXMgYSBzZXF1ZW5jZSBvZiBiaXRzIHRoYXQgbWF0Y2hlcyB0aGUgaW52ZXJ0ZWQgc2lnbiwgZm9sbG93ZWQgYnkgYSBiaXQgdGhhdCBkaWZmZXJzCisobGlrZSBhYm92ZSwgbm90IG5lY2Vzc2FyeSBmb3IgOS1ieXRlIGVuY29kaW5ncykgYW5kIHRoZSBiaXRzIG9mIHRoZSBudW1iZXIncyB0d28ncyBjb21wbGVtZW50LgorCisKK3wgVmFsdWUgICAgICAgICAgICAgfCBieXRlcyAgICAgICAgICAgICAgICAgICB8IGVuY29kZXMgYXMgICAgICAgICAgICAgICAgIHwKK3wgLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKK3wgMSAgICAgICAgICAgICAgICAgfCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMSB8IDgxICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgLTEgICAgICAgICAgICAgICAgfCBGRiBGRiBGRiBGRiBGRiBGRiBGRiBGRiB8IDdGICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgMCAgICAgICAgICAgICAgICAgfCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCB8IDgwICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgNjMgICAgICAgICAgICAgICAgfCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAzRiB8IEJGICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgLTY0ICAgICAgICAgICAgICAgfCBGRiBGRiBGRiBGRiBGRiBGRiBGRiBDMCB8IDQwICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgNjQgICAgICAgICAgICAgICAgfCAwMCAwMCAwMCAwMCAwMCAwMCAwMCA0MCB8IEMwIDQwICAgICAgICAgICAgICAgICAgICAgIHwKK3wgLTY1ICAgICAgICAgICAgICAgfCBGRiBGRiBGRiBGRiBGRiBGRiBGRiBCRiB8IDNGIEJGICAgICAgICAgICAgICAgICAgICAgIHwKK3wgODE5MSAgICAgICAgICAgICAgfCAwMCAwMCAwMCAwMCAwMCAwMCAxRiBGRiB8IERGIEZGICAgICAgICAgICAgICAgICAgICAgIHwKK3wgODE5MiAgICAgICAgICAgICAgfCAwMCAwMCAwMCAwMCAwMCAwMCAyMCAwMCB8IEUwIDIwIDAwICAgICAgICAgICAgICAgICAgIHwKK3wgSW50ZWdlci5NQVhfVkFMVUUgfCAwMCAwMCAwMCAwMCA3RiBGRiBGRiBGRiB8IEY4IDdGIEZGIEZGIEZGICAgICAgICAgICAgIHwKK3wgTG9uZy5NSU5fVkFMVUUgICAgfCA4MCAwMCAwMCAwMCAwMCAwMCAwMCAwMCB8IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIHwKKworIyMgRml4ZWQtc2l6ZSBmbG9hdGluZy1wb2ludCBudW1iZXJzIChmbG9hdCwgZG91YmxlKQorCitJRUVFLTc1NCB3YXMgZGVzaWduZWQgd2l0aCBieXRlLWJ5LWJ5dGUgY29tcGFyaXNvbnMgaW4gbWluZCwgYW5kIHByb3ZpZGVzIGFuIGltcG9ydGFudCBndWFyYW50ZWUgYWJvdXQgdGhlIGJ5dGVzIG9mIGEKK2Zsb2F0aW5nIHBvaW50IG51bWJlcjoKKyogSWYgeCBhbmQgeSBhcmUgb2YgdGhlIHNhbWUgc2lnbiwgYnl0ZXMoeCkg4omlIGJ5dGVzKHkpIOKHlCB8eHwg4omlIHx5fC4KKworVGh1cywgdG8gYmUgYWJsZSB0byBvcmRlciBmbG9hdGluZyBwb2ludCBudW1iZXJzIGFzIHVuc2lnbmVkIGludGVnZXJzLCB3ZSBjYW46CisKKyogRmxpcCB0aGUgc2lnbiBiaXQgc28gbmVnYXRpdmVzIGFyZSBzbWFsbGVyIHRoYW4gcG9zaXRpdmUgbnVtYmVycy4KKyogSWYgdGhlIG51bWJlciB3YXMgbmVnYXRpdmUsIGFsc28gZmxpcCBhbGwgdGhlIG90aGVyIGJpdHMgc28gbGFyZ2VyIG1hZ25pdHVkZXMgYmVjb21lIHNtYWxsZXIgaW50ZWdlcnMuCisKK1RoaXMgbWF0Y2hlcyBleGFjdGx5IHRoZSBiZWhhdmlvdXIgb2YgYERvdWJsZS5jb21wYXJlYCwgd2hpY2ggZG9lc27igJl0IGZ1bGx5IGFncmVlIHdpdGggbnVtZXJpY2FsIGNvbXBhcmlzb25zIChzZWUgc3BlYykKK2luIG9yZGVyIHRvIGRlZmluZSBhIG5hdHVyYWwgb3JkZXIgb3ZlciB0aGUgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4KKworRXhhbXBsZXM6CisKKworfCBUeXBlIGFuZCB2YWx1ZSB8IGJ5dGVzICAgICAgICAgICAgICAgICAgIHwgZW5jb2RlcyBhcyAgICAgICAgICAgICAgfAorfCAtLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorfCBmbG9hdCArMS4wICAgICB8IDNGIDgwIDAwIDAwICAgICAgICAgICAgIHwgQkYgODAgMDAgMDAgICAgICAgICAgICAgfAorfCBmbG9hdCArMC4wICAgICB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgODAgMDAgMDAgMDAgICAgICAgICAgICAgfAorfCBmbG9hdCAtMC4wICAgICB8IDgwIDAwIDAwIDAwICAgICAgICAgICAgIHwgN0YgRkYgRkYgRkYgICAgICAgICAgICAgfAorfCBmbG9hdCAtMS4wICAgICB8IEJGIDgwIDAwIDAwICAgICAgICAgICAgIHwgNDAgN0YgRkYgRkYgICAgICAgICAgICAgfAorfCBkb3VibGUgKzEuMCAgICB8IDNGIEYwIDAwIDAwIDAwIDAwIDAwIDAwIHwgQkYgRjAgMDAgMDAgMDAgMDAgMDAgMDAgfAorfCBkb3VibGUgK0luZiAgICB8IDdGIEYwIDAwIDAwIDAwIDAwIDAwIDAwIHwgRkYgRjAgMDAgMDAgMDAgMDAgMDAgMDAgfAorfCBkb3VibGUgLUluZiAgICB8IEZGIEYwIDAwIDAwIDAwIDAwIDAwIDAwIHwgMDAgMEYgRkYgRkYgRkYgRkYgRkYgRkYgfAorfCBkb3VibGUgTmFOICAgICB8IDdGIEY4IDAwIDAwIDAwIDAwIDAwIDAwIHwgRkYgRjggMDAgMDAgMDAgMDAgMDAgMDAgfAorCisjIyBVVUlEcworCitVVUlEcyBhcmUgZml4ZWQtbGVuZ3RoIHVuc2lnbmVkIGludGVnZXJzLCB3aGVyZSB0aGUgVVVJRCB2ZXJzaW9uL3R5cGUgaXMgY29tcGFyZWQgZmlyc3QsIGFuZCB3aGVyZSBiaXRzIG5lZWQgdG8gYmUKK3Jlb3JkZXJlZCBmb3IgdGhlIHRpbWUgVVVJRHMuIFRvIGNyZWF0ZSBhIGJ5dGUtb3JkZXJlZCByZXByZXNlbnRhdGlvbiwgd2UgcmVvcmRlciB0aGUgYnl0ZXM6IHB1bGwgdGhlIHZlcnNpb24gZGlnaXQKK2ZpcnN0LCB0aGVuIHRoZSByZXN0IG9mIHRoZSBkaWdpdHMsIHVzaW5nIHRoZSBzcGVjaWFsIHRpbWUgb3JkZXIgaWYgdGhlIHZlcnNpb24gaXMgZXF1YWwgdG8gb25lLgorCitFeGFtcGxlczoKKworCit8IFR5cGUgYW5kIHZhbHVlIHwgYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZW5jb2RlcyBhcyAgICAgICAgICAgICAgICAgICAgICAgfAorfCAtLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKK3wgUmFuZG9tICh2NCkgICAgfCBjYzUyMDg4Mi05NTA3LTQ0ZmItOGZjOS1iMzQ5ZWNkZWU2NTggfCA0Y2M1MjA4ODI5NTA3NGZiOGZjOWIzNDllY2RlZTY1OCB8Cit8IFRpbWUgKHYxKSAgICAgIHwgMmE5MmQ3NTAtZDhkYy0xMWU2LWEyZGUtY2Y4ZWNkNGNmMDUzIHwgMTFlNmQ4ZGMyYTkyZDc1MGEyZGVjZjhlY2Q0Y2YwNTMgfAorCisjIyBNdWx0aS1jb21wb25lbnQgc2VxdWVuY2VzIChQYXJ0aXRpb24gb3IgQ2x1c3RlcmluZyBrZXlzLCB0dXBsZXMpLCBib3VuZHMgYW5kIG51bGxzCisKK0FzIG1lbnRpb25lZCBhYm92ZSwgd2UgZW5jb2RlIHNlcXVlbmNlcyBieSBhZGRpbmcgc2VwYXJhdG9yIGJ5dGVzIGluIGZyb250LCBiZXR3ZWVuIGNvbXBvbmVudHMsIGFuZCBhIHRlcm1pbmF0b3IgYXQgdGhlCitlbmQuIFRoZSB2YWx1ZXMgd2UgY2hvc2UgZm9yIHRoZSBzZXBhcmF0b3IgYW5kIHRlcm1pbmF0b3IgYXJlIGAweDQwYCBhbmQgYDB4MzhgLCBhbmQgdGhleSBzZXJ2ZSBzZXZlcmFsIHB1cnBvc2VzOgorCistIFBlcm1pdHMgcGFydGlhbGx5IHNwZWNpZmllZCBib3VuZHMsIHdpdGggc3RyaWN0L2V4Y2x1c2l2ZSBvciBub24tc3RyaWN0L2luY2x1c2l2ZSBzZW1hbnRpY3MuIFRoaXMgaXMgZG9uZSBieSBmaW5pc2hpbmcKKyAgYSBib3VuZCB3aXRoIGEgdGVybWluYXRvciB2YWx1ZSB0aGF0IGlzIHNtYWxsZXIvZ3JlYXRlciB0aGFuIHRoZSBzZXBhcmF0b3IgYW5kIHRlcm1pbmF0b3IuIFdlIGNhbiB1c2UgYDB4MjBgIGZvciBgPGAvYOKJpWAKKyAgYW5kIGAweDYwYCBmb3IgYOKJpGAvYD5gLgorLSBQZXJtaXRzIGVuY29kaW5nIG9mIGBudWxsYCBhbmQgYGVtcHR5YCB2YWx1ZXMuIFdlIHVzZSBgMHgzRWAgYXMgdGhlIHNlcGFyYXRvciBmb3IgbnVsbHMgYW5kIGAweDNGYCBmb3IgZW1wdHksCisgIGZvbGxvd2VkIGJ5IG5vIHZhbHVlIGJ5dGVzLiBUaGlzIGlzIGFsd2F5cyBzbWFsbGVyIHRoYW4gYSBzZXF1ZW5jZSB3aXRoIG5vbi1udWxsIHZhbHVlIGZvciB0aGlzIGNvbXBvbmVudCwgYnV0IG5vdAorICBzbWFsbGVyIHRoYW4gYSBzZXF1ZW5jZSB0aGF0IGVuZHMgaW4gdGhpcyBjb21wb25lbnQuCistIEhlbHBzIGlkZW50aWZ5IHRoZSBlbmRpbmcgb2YgdmFyaWFibGUtbGVuZ3RoIGNvbXBvbmVudHMgKHNlZSBiZWxvdykuCisKK0V4YW1wbGVzOgorCisKK3wgVHlwZXMgYW5kIHZhbHVlcyAgICAgICAgIHwgYnl0ZXMgICAgICAgICAgICAgICAgICB8IGVuY29kZXMgYXMgICAgICAgICAgICAgICAgICAgICB8Cit8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorfCAoc2hvcnQgMSwgZmxvYXQgMS4wKSAgICAgfCAwMCAwMSwgM0YgODAgMDAgMDAgICAgIHwgNDDCtzgwIDAxwrc0MMK3QkYgODAgMDAgMDDCtzM4IHwKK3wgKHNob3J0IC0xLCBudWxsKSAgICAgICAgIHwgRkYgRkYsIOKAlCAgICAgICAgICAgICAgfCA0MMK3N0YgRkbCtzNFwrczOCAgICAgICAgICAgICAgfAorfCDiiaUgKHNob3J0IDAsIGZsb2F0IC1JbmYpIHwgMDAgMDAsIEZGIDgwIDAwIDAwLCA+PSB8IDQwwrc4MCAwMMK3NDDCtzAwIDdGIEZGIEZGwrcyMCB8Cit8IDwgKHNob3J0IE1JTikgICAgICAgICAgICB8IDgwIDAwLCA8PSAgICAgICAgICAgICAgfCA0MMK3MDAgMDDCtzIwICAgICAgICAgICAgICAgICAgfAorfCBcPiAobnVsbCkgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgM0XCtzYwICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgQk9UVE9NICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8IDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IFRPUCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgfCA2MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCisoVGhlIG1pZGRsZSBkb3QgwrcgZG9lc24ndCBleGlzdCBpbiB0aGUgZW5jb2RpbmcsIGl04oCZcyBqdXN0IGEgdmlzdWFsaXNhdGlvbiBvZiB0aGUgYm91bmRhcmllcyBpbiB0aGUgZXhhbXBsZXMuKQorCitTaW5jZToKKworLSBhbGwgc2VwYXJhdG9ycyBpbiB1c2UgYXJlIHdpdGhpbiBgMHgxMGAtYDB4RUZgLCBhbmQKKy0gd2UgdXNlIHRoZSBzYW1lIHNlcGFyYXRvciBmb3IgaW50ZXJuYWwgY29tcG9uZW50cywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIG51bGxzIHdoaWNoIHdlIGVuY29kZSB3aXRoIGEgc21hbGxlcgorICBzZXBhcmF0b3IKKy0gdGhlIHNlcXVlbmNlIGhhcyBhIGZpeGVkIG51bWJlciBvZiBjb21wb25lbnRzIG9yIHdlIHVzZSBhIGRpZmZlcmVudCB0cmFpbGluZyB2YWx1ZSB3aGVuZXZlciBpdCBjYW4gYmUgc2hvcnRlcgorCit0aGUgcHJvcGVydGllcyAoMykgYW5kICg0KSBndWFyYW50ZWUgdGhhdCB0aGUgYnl0ZSBjb21wYXJpc29uIG9mIHRoZSBlbmNvZGluZyBnb2VzIGluIHRoZSBzYW1lIGRpcmVjdGlvbiBhcyB0aGUKK2xleGljb2dyYXBoaWNhbCBjb21wYXJpc29uIG9mIHRoZSBzZXF1ZW5jZS4gSW4gY29tYmluYXRpb24gd2l0aCB0aGUgdGhpcmQgcG9pbnQgYWJvdmUsICg0KSBhbHNvIGVuc3VyZXMgdGhhdCBubyBlbmNvZGluZworaXMgYSBwcmVmaXggb2YgYW5vdGhlci4gU2luY2Ugd2UgaGF2ZSAoMSkgYW5kICgyKSwgKDMpIGFuZCAoNCkgYXJlIGFsc28gc2F0aXNmaWVkLgorCitOb3RlIHRoYXQgdGhpcyBtZWFucyB0aGF0IHRoZSBlbmNvZGluZ3Mgb2YgYWxsIHBhcnRpdGlvbiBhbmQgY2x1c3RlcmluZyBrZXlzIHVzZWQgaW4gdGhlIGRhdGFiYXNlIHdpbGwgYmUgcHJlZml4LWZyZWUuCisKKyMjIFZhcmlhYmxlLWxlbmd0aCBieXRlIGNvbXBhcmFibGVzIChBU0NJSSwgVVRGLTggc3RyaW5ncywgYmxvYnMsIEluZXRBZGRyZXNzKQorCitJbiBpc29sYXRpb24sIHRoZXNlIGNhbiBiZSBjb21wYXJlZCBkaXJlY3RseSB3aXRob3V0IHJlaW50ZXJwcmV0YXRpb24uIEhvd2V2ZXIsIG9uY2Ugd2UgcGxhY2UgdGhlc2UgaW5zaWRlIGEgZmxhdHRlbmVkCitzZXF1ZW5jZSBvZiB2YWx1ZXMgd2UgbmVlZCB0byBjbGVhcmx5IGRlZmluZSB0aGUgYm91bmRhcmllcyBiZXR3ZWVuIHZhbHVlcyB3aGlsZSBtYWludGFpbmluZyBvcmRlci4gVG8gZG8gdGhpcyB3ZSB1c2UgYW4KK2VuZC1vZi12YWx1ZSBtYXJrZXI7IHNpbmNlIHNob3J0ZXIgdmFsdWVzIG11c3QgYmUgc21hbGxlciB0aGFuIGxvbmdlciwgdGhpcyBtYXJrZXIgbXVzdCBiZSAwIGFuZCB3ZSBuZWVkIHRvIGZpbmQgYSB3YXkKK3RvIGVuY29kZS9lc2NhcGUgYWN0dWFsIDBzIGluIHRoZSBpbnB1dCBzZXF1ZW5jZS4KKworVGhlIG1ldGhvZCB3ZSBjaG9zZSBmb3IgdGhpcyBpcyB0aGUgZm9sbG93aW5nOgorCistIElmIHRoZSBpbnB1dCBkb2VzIG5vdCBlbmQgb24gYDAwYCwgYSBgMDBgIGJ5dGUgaXMgYXBwZW5kZWQgYXQgdGhlIGVuZC4KKy0gSWYgdGhlIGlucHV0IGNvbnRhaW5zIGEgYDAwYCBieXRlLCBpdCBpcyBlbmNvZGVkIGFzIGAwMCBGRmAuCistIElmIHRoZSBpbnB1dCBjb250YWlucyBhIHNlcXVlbmNlIG9mICpuKiBgMDBgIGJ5dGVzLCB0aGV5IGFyZSBlbmNvZGVkIGFzIGAwMGAgYEZFYCAoKm4qLTEgdGltZXMpIGBGRmAKKyAgKHNvIHRoYXQgd2UgZG9u4oCZdCBkb3VibGUgdGhlIHNpemUgb2YgYDAwYCBibG9icykuCistIElmIHRoZSBpbnB1dCBlbmRzIGluIGAwMGAsIHRoZSBsYXN0IGBGRmAgaXMgY2hhbmdlZCB0byBgRkVgCisgICh0byBlbnN1cmUgaXTigJlzIHNtYWxsZXIgdGhhbiB0aGUgc2FtZSB2YWx1ZSB3aXRoIGAwMGAgYXBwZW5kZWQpLgorCitFeGFtcGxlczoKKworCit8IGJ5dGVzL3NlcXVlbmNlICAgICB8IGVuY29kZXMgYXMgICAgICAgICAgICAgICB8Cit8IC0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Cit8IDIyIDAwICAgICAgICAgICAgICB8IDIyIDAwIEZFICAgICAgICAgICAgICAgICB8Cit8IDIyIDAwIDAwIDMzICAgICAgICB8IDIyIDAwIEZFIEZGIDMzIDAwICAgICAgICB8Cit8IDIyIDAwIDExICAgICAgICAgICB8IDIyIDAwIEZGIDExIDAwICAgICAgICAgICB8Cit8IChibG9iIDIyLCBzaG9ydCAwKSB8IDQwwrcyMiAwMMK3NDDCtzgwIDAwwrc0MCB8Cit8IOKJpSAoYmxvYiAyMiAwMCkgICAgfCA0MMK3MjIgMDAgRkXCtzIwICAgICAgICAgfAorfCDiiaQgKGJsb2IgMjIgMDAgMDApIHwgNDDCtzIyIDAwIEZFIEZFwrc2MCAgICAgIHwKKworV2l0aGluIHRoZSBlbmNvZGluZywgYSBgMDBgIGJ5dGUgY2FuIG9ubHkgYmUgZm9sbG93ZWQgYnkgYSBgRkVgIG9yIGBGRmAgYnl0ZSwgYW5kIGhlbmNlIGlmIGFuIGVuY29kaW5nIGlzIGEgcHJlZml4IG9mCithbm90aGVyLCB0aGUgbGF0dGVyIGhhcyB0byBoYXZlIGEgYEZFYCBvciBgRkZgIGFzIHRoZSBuZXh0IGJ5dGUsIHdoaWNoIGVuc3VyZXMgYm90aCAoNCkgKGFkZGluZyBgMTBgLWBFRmAgdG8gdGhlIGZvcm1lcgorbWFrZXMgaXQgbm8gbG9uZ2VyIGEgcHJlZml4IG9mIHRoZSBsYXR0ZXIpIGFuZCAoMykgKGFkZGluZyBgMTBgLWBFRmAgdG8gdGhlIGZvcm1lciBtYWtlcyBpdCBzbWFsbGVyIHRoYW4gdGhlIGxhdHRlcjsgaW4KK3RoaXMgY2FzZSB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGZvcm1lciBpcyBhIHByZWZpeCBvZiB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGxhdHRlcikuCisKKyMjIFZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VycyAodmFyaW50LCBSYW5kb21QYXJ0aXRpb25lciB0b2tlbiksIGxlZ2FjeSBlbmNvZGluZworCitJZiBpbnRlZ2VycyBvZiB1bmJvdW5kZWQgbGVuZ3RoIGFyZSBndWFyYW50ZWVkIHRvIHN0YXJ0IHdpdGggYSBub24temVybyBkaWdpdCwgdG8gY29tcGFyZSB0aGVtIHdlIGNhbiBmaXJzdCB1c2UgYSBzaWduZWQKK2xlbmd0aCwgYXMgbnVtYmVycyB3aXRoIGxvbmdlciByZXByZXNlbnRhdGlvbnMgaGF2ZSBoaWdoZXIgbWFnbml0dWRlcy4gT25seSBpZiB0aGUgbGVuZ3RocyBtYXRjaCB3ZSBuZWVkIHRvIGNvbXBhcmUgdGhlCitzZXF1ZW5jZSBvZiBkaWdpdHMsIHdoaWNoIG5vdyBoYXMgYSBrbm93biBsZW5ndGguCisKKyhOb3RlOiBUaGUgbWVhbmluZyBvZiDigJxkaWdpdOKAnSBoZXJlIGlzIG5vdCB0aGUgc2FtZSBhcyDigJxkZWNpbWFsIGRpZ2l04oCdLiBXZSBvcGVyYXRlIHdpdGggbnVtYmVycyBzdG9yZWQgYXMgYnl0ZXMsIHRodXMgaXQKK21ha2VzIG1vc3Qgc2Vuc2UgdG8gdHJlYXQgdGhlIG51bWJlcnMgYXMgZW5jb2RlZCBpbiBiYXNlLTI1Niwgd2hlcmUgZWFjaCBkaWdpdCBpcyBhIGJ5dGUuKQorCitUaGlzIHRyYW5zbGF0ZXMgdG8gdGhlIGZvbGxvd2luZyBlbmNvZGluZyBvZiB2YXJpbnRzOgorCistIFN0cmlwIGFueSBsZWFkaW5nIHplcm9zLiBOb3RlIHRoYXQgZm9yIG5lZ2F0aXZlIG51bWJlcnMsIGBCaWdJbnRlZ2VyYCBlbmNvZGVzIGxlYWRpbmcgMCBhcyBgMHhGRmAuCistIElmIHRoZSBsZW5ndGggaXMgMTI4IG9yIGdyZWF0ZXIsIGxlYWQgd2l0aCBhIGJ5dGUgb2YgYDB4RkZgIChwb3NpdGl2ZSkgb3IgYDB4MDBgIChuZWdhdGl2ZSkgZm9yIGV2ZXJ5IDEyOCB1bnRpbCB0aGVyZQorICBhcmUgbGVzcyB0aGFuIDEyOCBsZWZ0LgorLSBFbmNvZGUgdGhlIHNpZ24gYW5kIChyZW1haW5pbmcpIGxlbmd0aCBvZiB0aGUgbnVtYmVyIGFzIGEgYnl0ZToKKyAgLSBgMHg4MCArIChsZW5ndGggLSAxKWAgZm9yIHBvc2l0aXZlIG51bWJlcnMgKHNvIHRoYXQgZ3JlYXRlciBtYWduaXR1ZGUgaXMgaGlnaGVyKTsKKyAgLSBgMHg3RiAtIChsZW5ndGggLSAxKWAgZm9yIG5lZ2F0aXZlIG51bWJlcnMgKHNvIHRoYXQgZ3JlYXRlciBtYWduaXR1ZGUgaXMgbG93ZXIsIGFuZCBhbGwgbmVnYXRpdmVzIGFyZSBsb3dlciB0aGFuCisgICAgcG9zaXRpdmVzKS4KKy0gUGFzdGUgdGhlIGJ5dGVzIG9mIHRoZSBudW1iZXIsIDLigJlzIGNvbXBsZW1lbnQgZW5jb2RlZCBmb3IgbmVnYXRpdmUgbnVtYmVycyAoYEJpZ0ludGVnZXJgIGFscmVhZHkgYXBwbGllcyB0aGUgMuKAmXMKKyAgY29tcGxlbWVudCkuCisKK1NpbmNlIHdoZW4gY29tcGFyaW5nIHR3byBudW1iZXJzIHdlIGVpdGhlciBoYXZlIGEgZGlmZmVyZW5jZSBpbiB0aGUgbGVuZ3RoIHByZWZpeCwgb3IgdGhlIGxlbmd0aHMgYXJlIHRoZSBzYW1lIGlmIHdlCituZWVkIHRvIGNvbXBhcmUgdGhlIGNvbnRlbnQgYnl0ZXMsIHRoZXJlIGlzIG5vIHJpc2sgdGhhdCBhIGxvbmdlciBudW1iZXIgY2FuIGJlIGNvbmZ1c2VkIHdpdGggYSBzaG9ydGVyIGNvbWJpbmVkIGluIGEKK211bHRpLWNvbXBvbmVudCBzZXF1ZW5jZS4gSW4gb3RoZXIgd29yZHMsIG5vIHZhbHVlIGNhbiBiZSBhIHByZWZpeCBvZiBhbm90aGVyLCB0aHVzIHdlIGhhdmUgKDEpIGFuZCAoMikgYW5kIHRodXMgKDMpIGFuZCAoNCkKK2FzIHdlbGwuCisKK0V4YW1wbGVzOgorCisKK3wgICB2YWx1ZSB8IGJ5dGVzICAgICAgICAgICAgfCBlbmNvZGVzIGFzICAgICAgICAgICAgICB8Cit8IC0tLS0tLTogfCAtLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorfCAgICAgICAwIHwgMDAgICAgICAgICAgICAgICB8IDgwwrcwMCAgICAgICAgICAgICAgICAgIHwKK3wgICAgICAgMSB8IDAxICAgICAgICAgICAgICAgfCA4MMK3MDEgICAgICAgICAgICAgICAgICB8Cit8ICAgICAgLTEgfCBGRiAgICAgICAgICAgICAgIHwgN0bCt0ZGICAgICAgICAgICAgICAgICAgfAorfCAgICAgMjU1IHwgMDAgRkYgICAgICAgICAgICB8IDgwwrdGRiAgICAgICAgICAgICAgICAgIHwKK3wgICAgLTI1NiB8IEZGIDAwICAgICAgICAgICAgfCA3RsK3MDAgICAgICAgICAgICAgICAgICB8Cit8ICAgICAyNTYgfCAwMSAwMCAgICAgICAgICAgIHwgODHCtzAxIDAwICAgICAgICAgICAgICAgfAorfCAgICAyXjE2IHwgMDEgMDAgMDAgICAgICAgICB8IDgywrcwMSAwMCAwMCAgICAgICAgICAgIHwKK3wgICAtMl4zMiB8IEZGIDAwIDAwIDAwIDAwICAgfCA3Q8K3MDAgMDAgMDAgMDAgICAgICAgICB8Cit8ICAyXjEwMjQgfCAwMSAwMCgxMjggdGltZXMpIHwgRkYgODDCtzAxIDAwKDEyOCB0aW1lcykgfAorfCAtMl4yMDQ4IHwgRkYgMDAoMjU2IHRpbWVzKSB8IDAwIDAwIDgwwrcwMCgyNTYgdGltZXMpIHwKKworKE1pZGRsZSBkb3Qgwrcgc2hvd3MgdGhlIHRyYW5zaXRpb24gcG9pbnQgYmV0d2VlbiBsZW5ndGggYW5kIGRpZ2l0cy4pCisKKyMjIFZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VycywgY3VycmVudCBlbmNvZGluZworCitCZWNhdXNlIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VycyBhcmUgYWxzbyBvZnRlbiB1c2VkIHRvIHN0b3JlIHNtYWxsZXIgcmFuZ2UgaW50ZWdlcnMsIGl0IG1ha2VzIHNlbnNlIHRvIGFsc28gYXBwbHkKK3RoZSB2YXJpYWJsZS1sZW5ndGggaW50ZWdlciBlbmNvZGluZy4gVGh1cywgdGhlIGN1cnJlbnQgdmFyaW50IHNjaGVtZSBjaG9vc2VzIHRvOgorCistIFN0cmlwIGFueSBsZWFkaW5nIHplcm9zLiBOb3RlIHRoYXQgZm9yIG5lZ2F0aXZlIG51bWJlcnMsIGBCaWdJbnRlZ2VyYCBlbmNvZGVzIGxlYWRpbmcgMCBhcyBgMHhGRmAuCistIE1hcCBudW1iZXJzIGRpcmVjdGx5IHRvIHRoZWlyIFt2YXJpYWJsZS1sZW5ndGggaW50ZWdlciBlbmNvZGluZ10oI3ZhcmlhYmxlLWxlbmd0aC1lbmNvZGluZy1vZi1pbnRlZ2Vycy1jdXJyZW50LWJpZ2ludCksCisgIGlmIHRoZXkgaGF2ZSA2IGJ5dGVzIG9yIGxlc3MuCistIE90aGVyd2lzZSwgZW5jb2RlIGFzOgorICAtIGEgc2lnbiBieXRlICgwMCBmb3IgbmVnYXRpdmUgbnVtYmVycywgRkYgZm9yIHBvc2l0aXZlLCBkaXN0aW5jdCBmcm9tIHRoZSBsZWFkaW5nIGJ5dGUgb2YgdGhlIHZhcmlhYmxlLWxlbmd0aAorICAgIGVuY29kaW5nIGFib3ZlKQorICAtIGEgdmFyaWFibGUtbGVuZ3RoIGVuY29kZWQgbnVtYmVyIG9mIGJ5dGVzIGFkanVzdGVkIGJ5IC03IChzbyB0aGF0IHRoZSBzbWFsbGVzdCBsZW5ndGggdGhpcyBlbmNvZGluZyB1c2VzIG1hcHMgdG8KKyAgICAwKSwgaW52ZXJ0ZWQgZm9yIG5lZ2F0aXZlIG51bWJlcnMgKHNvIHRoYXQgZ3JlYXRlciBsZW5ndGggY29tcGFyZXMgc21hbGxlcikKKyAgLSB0aGUgYnl0ZXMgb2YgdGhlIG51bWJlciwgdHdvJ3MgY29tcGxlbWVudCBlbmNvZGVkLgorICAgIFdlIG5ldmVyIHVzZSBhIGxvbmdlciBlbmNvZGluZyAoZS5nLiB1c2luZyB0aGUgc2Vjb25kIG1ldGhvZCBpZiB2YXJpYWJsZS1sZW5ndGggc3VmZmljZXMgb3Igd2l0aCBhZGRlZCAwMCBsZWFkaW5nCisgICAgYnl0ZXMpIGlmIGEgc2hvcnRlciBvbmUgc3VmZmljZXMuCisKK0J5IHRoZSBzYW1lIHJlYXNvbmluZyBhcyBhYm92ZSwgYW5kIHRoZSBmYWN0IHRoYXQgdGhlIHNpZ24gYnl0ZSBjYW5ub3QgYmUgY29uZnVzZWQgd2l0aCBhIHZhcmlhYmxlLWxlbmd0aCBlbmNvZGluZworZmlyc3QgYnl0ZSwgbm8gdmFsdWUgY2FuIGJlIGEgcHJlZml4IG9mIGFub3RoZXIuIEFzIHRoZSBzaWduIGJ5dGUgY29tcGFyZXMgc21hbGxlciBmb3IgbmVnYXRpdmUgKHJlc3BlY3RpdmVseSBiaWdnZXIKK2ZvciBwb3NpdGl2ZSBudW1iZXJzKSB0aGFuIGFueSB2YXJpYWJsZS1sZW5ndGggZW5jb2RlZCBpbnRlZ2VyLCB0aGUgY29tcGFyaXNvbiBvcmRlciBpcyBtYWludGFpbmVkIHdoZW4gb25lIG51bWJlcgordXNlcyB2YXJpYWJsZS1sZW5ndGggZW5jb2RpbmcsIGFuZCB0aGUgb3RoZXIgZG9lc24ndC4gTG9uZ2VyIG51bWJlcnMgY29tcGFyZSBzbWFsbGVyIHdoZW4gbmVnYXRpdmUgKGJlY2F1c2Ugb2YgdGhlCitpbnZlcnRlZCBsZW5ndGggYnl0ZXMpLCBhbmQgYmlnZ2VyIHdoZW4gcG9zaXRpdmUuCisKK0V4YW1wbGVzOgorCisKK3wgICB2YWx1ZSB8IGJ5dGVzICAgICAgICAgICAgICAgICAgIHwgZW5jb2RlcyBhcyAgICAgICAgICAgICAgICAgICAgICB8Cit8IC0tLS0tLTogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorfCAgICAgICAwIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCA4MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgICAgICAgMSB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgODEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICAgICAgLTEgfCBGRiAgICAgICAgICAgICAgICAgICAgICB8IDdGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAgICAgMjU1IHwgMDAgRkYgICAgICAgICAgICAgICAgICAgfCBDMCBGRiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgICAgLTI1NiB8IEZGIDAwICAgICAgICAgICAgICAgICAgIHwgM0YgMDAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICAgICAyNTYgfCAwMSAwMCAgICAgICAgICAgICAgICAgICB8IEMxIDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAgICAyXjE2IHwgMDEgMDAgMDAgICAgICAgICAgICAgICAgfCBFMSAwMCAwMCAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgICAtMl4zMiB8IEZGIDAwIDAwIDAwIDAwICAgICAgICAgIHwgMDcgMDAgMDAgMDAgMDAgICAgICAgICAgICAgICAgICB8Cit8ICAyXjU2LTEgfCAwMCBGRiBGRiBGRiBGRiBGRiBGRiBGRiB8IEZFIEZGIEZGIEZGIEZGIEZGIEZGIEZGICAgICAgICAgfAorfCAgIC0yXjU2IHwgRkYgMDAgMDAgMDAgMDAgMDAgMDAgMDAgfCAwMSAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgICAgICAgIHwKK3wgICAgMl41NiB8IDAxIDAwIDAwIDAwIDAwIDAwIDAwIDAwIHwgRkbCtzAwwrcwMSAwMCAwMCAwMCAwMCAwMCAwMCAwMCB8Cit8IC0yXjU2LTEgfCBGRSBGRiBGRiBGRiBGRiBGRiBGRiBGRiB8IDAwwrdGRsK3RkUgRkYgRkYgRkYgRkYgRkYgRkYgRkYgfAorfCAgMl4xMDI0IHwgMDEgMDAoMTI4IHRpbWVzKSAgICAgICAgfCBGRsK3N0HCtzAxIDAwKDEyOCB0aW1lcykgICAgICAgIHwKK3wgLTJeMjA0OCB8IEZGIDAwKDI1NiB0aW1lcykgICAgICAgIHwgMDDCtzdGIDA2wrcwMCgyNTYgdGltZXMpICAgICAgICB8CisKKyhNaWRkbGUgZG90IMK3IHNob3dzIHRoZSB0cmFuc2l0aW9uIHBvaW50IGJldHdlZW4gbGVuZ3RoIGFuZCBkaWdpdHMuKQorCisjIyBWYXJpYWJsZS1sZW5ndGggZmxvYXRpbmctcG9pbnQgZGVjaW1hbHMgKGRlY2ltYWwpCisKK1ZhcmlhYmxlLWxlbmd0aCBmbG9hdHMgYXJlIG1vcmUgY29tcGxpY2F0ZWQsIGJ1dCB3ZSBjYW4gdHJlYXQgdGhlbSBzaW1pbGFybHkgdG8gSUVFRS03NTQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgYnkKK25vcm1hbGl6aW5nIHRoZW0gYnkgc3BsaXR0aW5nIHRoZW0gaW50byBzaWduLCBtYW50aXNzYSBhbmQgc2lnbmVkIGV4cG9uZW50IHN1Y2ggdGhhdCB0aGUgbWFudGlzc2EgaXMgYSBudW1iZXIgYmVsb3cgMQord2l0aCBhIG5vbi16ZXJvIGxlYWRpbmcgZGlnaXQuIFdlIGNhbiB0aGVuIGNvbXBhcmUgc2lnbiwgZXhwb25lbnQgYW5kIG1hbnRpc3NhIGluIHNlcXVlbmNlICh3aGVyZSB0aGUgY29tcGFyaXNvbiBvZgorZXhwb25lbnQgYW5kIG1hbnRpc3NhIGFyZSB3aXRoIHJldmVyc2VkIG1lYW5pbmcgaWYgdGhlIHNpZ24gaXMgbmVnYXRpdmUpIGFuZCB0aGF0IGdpdmVzIHVzIHRoZSBkZWNpbWFsIG9yZGVyaW5nLgorCitBIGJpdCBvZiBleHRyYSBjYXJlIG11c3QgYmUgZXhlcmNpc2VkIHdoZW4gZW5jb2RpbmcgZGVjaW1hbHMuIFNpbmNlIGZyYWN0aW9ucyBsaWtlIGAwLjFgIGNhbm5vdCBiZSBwZXJmZWN0bHkgZW5jb2RlZCBpbgorYmluYXJ5LCBkZWNpbWFscyAoYW5kIG1hbnRpc3NhcykgY2Fubm90IGJlIGVuY29kZWQgaW4gYmluYXJ5IG9yIGJhc2UtMjU2IGNvcnJlY3RseS4gQSBkZWNpbWFsIGJhc2UgbXVzdCBiZSB1c2VkOyBzaW5jZQord2UgZGVhbCB3aXRoIGJ5dGVzLCBpdCBtYWtlcyBtb3N0IHNlbnNlIHRvIG1ha2UgdGhpbmdzIGEgbGl0dGxlIG1vcmUgZWZmaWNpZW50IGJ5IHVzaW5nIGJhc2UtMTAwLiBGbG9hdGluZy1wb2ludAorZW5jb2RpbmcgYW5kIHRoZSBjb21wYXJpc29uIGlkZWEgZnJvbSB0aGUgcHJldmlvdXMgcGFyYWdyYXBoIHdvcmsgaW4gYW55IG51bWJlciBiYXNlLgorCitgQmlnRGVjaW1hbGAgcHJlc2VudHMgYSBmdXJ0aGVyIGNoYWxsZW5nZSwgYXMgaXQgZW5jb2RlcyBkZWNpbWFscyB1c2luZyBhIG1peHR1cmUgb2YgYmFzZXM6IG51bWJlcnMgaGF2ZSBhIGJpbmFyeS0KK2VuY29kZWQgaW50ZWdlciBwYXJ0IGFuZCBhIGRlY2ltYWwgcG93ZXItb2YtdGVuIHNjYWxlLiBUaGUgYnl0ZXMgcHJvZHVjZWQgYnkgYSBgQmlnRGVjaW1hbGAgYXJlIHRodXMgbm90IHN1aXRhYmxlIGZvcgorZGlyZWN0IGNvbnZlcnNpb24gdG8gYnl0ZSBjb21wYXJhYmxlIGFuZCB3ZSBtdXN0IGZpcnN0IGluc3RhbnRpYXRlIHRoZSBieXRlcyBhcyBhIGBCaWdEZWNpbWFsYCwgYW5kIHRoZW4gYXBwbHkgdGhlCitjbGFzc+KAmXMgbWV0aG9kcyB0byBvcGVyYXRlIG9uIGl0IGFzIGEgbnVtYmVyLgorCitXZSB0aGVuIHVzZSB0aGUgZm9sbG93aW5nIGVuY29kaW5nOgorCistIElmIHRoZSBudW1iZXIgaXMgMCwgdGhlIGVuY29kaW5nIGlzIGEgc2luZ2xlIGAweDgwYCBieXRlLgorLSBDb252ZXJ0IHRoZSBpbnB1dCB0byBzaWduZWQgbWFudGlzc2EgYW5kIHNpZ25lZCBleHBvbmVudCBpbiBiYXNlLTEwMC4gSWYgdGhlIHZhbHVlIGlzIG5lZ2F0aXZlLCBpbnZlcnQgdGhlIHNpZ24gb2YgdGhlCisgIGV4cG9uZW50IHRvIGZvcm0gdGhlICJtb2R1bGF0ZWQgZXhwb25lbnQiLgorLSBPdXRwdXQgYSBieXRlIGVuY29kaW5nOgorICAtIHRoZSBzaWduIG9mIHRoZSBudW1iZXIgZW5jb2RlZCBhcyBgMHg4MGAgaWYgcG9zaXRpdmUgYW5kIGAweDAwYCBpZiBuZWdhdGl2ZSwKKyAgLSB0aGUgZXhwb25lbnQgbGVuZ3RoIChzdHJpcHBpbmcgbGVhZGluZyAwcykgaW4gYnl0ZXMgYXMgYDB4NDAgKyBtb2R1bGF0ZWRfZXhwb25lbnRfbGVuZ3RoYCwgd2hlcmUgdGhlIGxlbmd0aCBpcyBnaXZlbgorICAgIHdpdGggdGhlIHNpZ24gb2YgdGhlIG1vZHVsYXRlZCBleHBvbmVudC4KKy0gT3V0cHV0IGBleHBvbmVudF9sZW5ndGhgIGJ5dGVzIG9mIG1vZHVsYXRlZCBleHBvbmVudCwgMuKAmXMgY29tcGxlbWVudCBlbmNvZGVkIHNvIHRoYXQgbmVnYXRpdmUgdmFsdWVzIGFyZSBjb3JyZWN0bHkKKyAgb3JkZXJlZC4KKy0gT3V0cHV0IGAweDgwICsgbGVhZGluZyBzaWduZWQgYnl0ZSBvZiBtYW50aXNzYWAsIHdoaWNoIGlzIG9idGFpbmVkIGJ5IG11bHRpcGx5aW5nIHRoZSBtYW50aXNzYSBieSAxMDAgYW5kIHJvdW5kaW5nIHRvCisgIC3iiJ4uIFRoZSByb3VuZGluZyBpcyBkb25lIHNvIHRoYXQgdGhlIHJlbWFpbmRlciBvZiB0aGUgbWFudGlzc2EgYmVjb21lcyBwb3NpdGl2ZSwgYW5kIHRodXMgZXZlcnkgbmV3IGJ5dGUgYWRkcyBzb21lCisgIHZhbHVlIHRvIGl0LCBtYWtpbmcgc2hvcnRlciBzZXF1ZW5jZXMgbG93ZXIgaW4gdmFsdWUuCistIFVwZGF0ZSB0aGUgbWFudGlzc2EgdG8gYmUgdGhlIHJlbWFpbmRlciBhZnRlciB0aGUgcm91bmRpbmcgYWJvdmUuIFRoZSByZXN1bHQgaXMgZ3VhcmFudGVlZCB0byBiZSAwIG9yIGdyZWF0ZXIuCistIFdoaWxlIHRoZSBtYW50aXNzYSBpcyBub24temVybywgb3V0cHV0IGAweDgwICsgbGVhZGluZyBieXRlYCBhcyBhYm92ZSBhbmQgdXBkYXRlIHRoZSBtYW50aXNzYSB0byBiZSB0aGUgcmVtYWluZGVyLgorLSBPdXRwdXQgYDB4MDBgLgorCitBcyBhIGRlc2NyaXB0aW9uIG9mIGhvdyB0aGlzIHByb2R1Y2VzIHRoZSBjb3JyZWN0IG9yZGVyaW5nLCBjb25zaWRlciB0aGUgcmVzdWx0IG9mIGNvbXBhcmlzb24gaW4gdGhlIGZpcnN0IGRpZmZlcmluZworYnl0ZToKKworLSBEaWZmZXJlbmNlIGluIHRoZSBmaXJzdCBieXRlIGNhbiBiZSBjYXVzZWQgYnk6CisgIC0gRGlmZmVyZW5jZSBpbiBzaWduIG9mIHRoZSBudW1iZXIgb3IgYmVpbmcgemVybywgd2hpY2ggeWllbGRzIHRoZSBjb3JyZWN0IG9yZGVyaW5nIGJlY2F1c2UKKyAgICAtIE5lZ2F0aXZlIG51bWJlcnMgc3RhcnQgd2l0aCBgMHgzY2AgLSBgMHg0NGAKKyAgICAtIFplcm8gc3RhcnRzIHdpdGggYDB4ODBgCisgICAgLSBQb3NpdGl2ZSBudW1iZXJzIHN0YXJ0IHdpdGggYDB4YmNgIC0gYDB4YzRgCisgIC0gRGlmZmVyZW5jZSBpbiBzaWduIG9mIHRoZSBleHBvbmVudCBtb2R1bGF0ZWQgd2l0aCB0aGUgc2lnbiBvZiB0aGUgbnVtYmVyLiBJbiBhIHBvc2l0aXZlIG51bWJlciBuZWdhdGl2ZSBleHBvbmVudHMKKyAgICBtZWFuIHNtYWxsZXIgdmFsdWVzLCB3aGlsZSBpbiBhIG5lZ2F0aXZlIG51bWJlciBpdOKAmXMgdGhlIG9wcG9zaXRlLCB0aHVzIHRoZSBtb2R1bGF0aW9uIHdpdGggdGhlIG51bWJlcuKAmXMgc2lnbgorICAgIGVuc3VyZXMgdGhlIGNvcnJlY3Qgb3JkZXJpbmcuCisgIC0gRGlmZmVyZW5jZSBpbiBtb2R1bGF0ZWQgbGVuZ3RoIG9mIHRoZSBleHBvbmVudDogYWdhaW4sIHNpbmNlIHdlIGdhdmUgdGhlIGxlbmd0aCBhIHNpZ24gdGhhdCBpcyBmb3JtZWQgZnJvbSBib3RoCisgICAgdGhlIHNpZ24gb2YgdGhlIGV4cG9uZW50IGFuZCB0aGUgc2lnbiBvZiB0aGUgbnVtYmVyLCBzbWFsbGVyIG51bWJlcnMgbWVhbiBzbWFsbGVyIGV4cG9uZW50IGluIHRoZSBwb3NpdGl2ZSBudW1iZXIKKyAgICBjYXNlLCBhbmQgYmlnZ2VyIGV4cG9uZW50IGluIHRoZSBuZWdhdGl2ZSBudW1iZXIgY2FzZS4gSW4gZWl0aGVyIGNhc2UgdGhpcyBwcm92aWRlcyB0aGUgY29ycmVjdCBvcmRlcmluZy4KKy0gRGlmZmVyZW5jZSBpbiBvbmUgb2YgdGhlIGJ5dGVzIG9mIHRoZSBtb2R1bGF0ZWQgZXhwb25lbnQgKHdob3NlIGxlbmd0aCBhbmQgc2lnbiBhcmUgbm93IGVxdWFsIGZvciBib3RoIGNvbXBhcmVkCisgIG51bWJlcnMpOgorICAtIFNtYWxsZXIgYnl0ZSBtZWFucyBhIHNtYWxsZXIgbW9kdWxhdGVkIGV4cG9uZW50LiBJbiB0aGUgcG9zaXRpdmUgY2FzZSB0aGlzIG1lYW5zIGEgc21hbGxlciBleHBvbmVudCwgdGh1cyBhIHNtYWxsZXIKKyAgICBudW1iZXIuIEluIHRoZSBuZWdhdGl2ZSBjYXNlIHRoaXMgbWVhbnMgdGhlIGV4cG9uZW50IGlzIGJpZ2dlciwgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBudW1iZXIgYXMgd2VsbCwgYW5kIHRodXMKKyAgICB0aGUgbnVtYmVyIGlzIHNtYWxsZXIuCistIEl0IGlzIG5vdCBwb3NzaWJsZSBmb3IgdGhlIGRpZmZlcmVuY2UgdG8gbWl4IG9uZSBudW1iZXLigJlzIGV4cG9uZW50IHdpdGggYW5vdGhlcuKAmXMgbWFudGlzc2EgKGFzIHN1Y2ggbnVtYmVycyB3b3VsZCBoYXZlCisgIGRpZmZlcmVudCBsZWFkaW5nIGJ5dGVzKS4KKy0gRGlmZmVyZW5jZSBpbiBhIG1hbnRpc3NhIGJ5dGUgcHJlc2VudCBpbiBib3RoIGlucHV0czoKKyAgLSBTbWFsbGVyIGJ5dGUgbWVhbnMgc21hbGxlciBzaWduZWQgbWFudGlzc2EgYW5kIGhlbmNlIHNtYWxsZXIgbnVtYmVyIHdoZW4gdGhlIGV4cG9uZW50cyBhcmUgZXF1YWwuCistIE9uZSBtYW50aXNzYSBlbmRpbmcgYmVmb3JlIGFub3RoZXI6CisgIC0gVGhpcyB3aWxsIHJlc3VsdCBpbiB0aGUgc2hvcnRlciBiZWluZyB0cmVhdGVkIGFzIHNtYWxsZXIgKHNpbmNlIHRoZSB0cmFpbGluZyBieXRlIGlzIGAwMGApLgorICAtIFNpbmNlIGFsbCBtYW50aXNzYXMgaGF2ZSBhdCBsZWFzdCBvbmUgYnl0ZSwgdGhpcyBjYW7igJl0IGhhcHBlbiBpbiB0aGUgbGVhZGluZyBtYW50aXNzYSBieXRlLgorICAtIFRodXMgdGhlIG90aGVyIG51bWJlcuKAmXMgYnl0ZXMgZnJvbSBoZXJlIG9uIGFyZSBub3QgbmVnYXRpdmUsIGFuZCBhdCBsZWFzdCBvbmUgb2YgdGhlbSBtdXN0IGJlIG5vbi16ZXJvLCB3aGljaCBtZWFucworICAgIGl0cyBtYW50aXNzYSBpcyBiaWdnZXIgYW5kIHRodXMgaXQgZW5jb2RlcyBhIGJpZ2dlciBudW1iZXIuCisKK0V4YW1wbGVzOgorCisKK3wgICAgICB2YWx1ZSB8ICBtZXhwIHwgbWFudGlzc2EgfCBtYW50aXNzYSBpbiBieXRlcyB8IGVuY29kZXMgYXMgICAgICAgICAgIHwKK3wgLS0tLS0tLS0tOiB8IC0tLS06IHwgLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKK3wgICAgICAgIDEuMSB8ICAgICAxIHwgMC4wMTEwICAgfCAuICAwMSAxMCAgICAgICAgICB8IEMxwrcwMcK3ODEgOEHCtzAwICAgIHwKK3wgICAgICAgICAgMSB8ICAgICAxIHwgMC4wMSAgICAgfCAuICAwMSAgICAgICAgICAgICB8IEMxwrcwMcK3ODHCtzAwICAgICAgIHwKK3wgICAgICAgMC4wMSB8ICAgICAwIHwgMC4wMSAgICAgfCAuICAwMSAgICAgICAgICAgICB8IEMwwrc4McK3MDAgICAgICAgICAgIHwKK3wgICAgICAgICAgMCB8ICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8IDgwICAgICAgICAgICAgICAgICAgIHwKK3wgICAgICAtMC4wMSB8ICAgICAwIHwgLTAuMDEgICAgfCAuIC0wMSAgICAgICAgICAgICB8IDQwwrc4McK3MDAgICAgICAgICAgIHwKK3wgICAgICAgICAtMSB8ICAgIC0xIHwgLTAuMDEgICAgfCAuIC0wMSAgICAgICAgICAgICB8IDNGwrdGRsK3N0bCtzAwICAgICAgIHwKK3wgICAgICAgLTEuMSB8ICAgIC0xIHwgLTAuMDExMCAgfCAuIC0wMiA5MCAgICAgICAgICB8IDNGwrdGRsK3N0UgREHCtzAwICAgIHwKK3wgICAgICAtOTguOSB8ICAgIC0xIHwgLTAuOTg5MCAgfCAuIC05OSAxMCAgICAgICAgICB8IDNGwrdGRsK3MUQgOEHCtzAwICAgIHwKK3wgICAgICAgIC05OSB8ICAgIC0xIHwgLTAuOTkgICAgfCAuIC05OSAgICAgICAgICAgICB8IDNGwrdGRsK3MUTCtzAwICAgICAgIHwKK3wgICAgICAtOTkuOSB8ICAgIC0xIHwgLTAuOTk5MCAgfCAuLTEwMCAxMCAgICAgICAgICB8IDNGwrdGRsK3MUMgOEHCtzAwICAgIHwKK3wgIC04LjFlMjAwMCB8IC0xMDAxIHwgLTAuMDgxMCAgfCAuIC0wOSA5MCAgICAgICAgICB8IDNFwrdGQyAxN8K3NzcgREHCtzAwIHwKK3wgLTguMWUtMjAwMCB8ICAgOTk5IHwgLTAuMDgxMCAgfCAuIC0wOSA5MCAgICAgICAgICB8IDQywrcwMyBFN8K3NzcgREHCtzAwIHwKK3wgIDguMWUtMjAwMCB8ICAtOTk5IHwgMC4wODEwICAgfCAuICAwOCAxMCAgICAgICAgICB8IEJFwrdGQyAxOcK3ODggOEHCtzAwIHwKK3wgICA4LjFlMjAwMCB8ICAxMDAxIHwgMC4wODEwICAgfCAuICAwOCAxMCAgICAgICAgICB8IEMywrcwMyBFOcK3ODggOEHCtzAwIHwKKworKG1leHAgc3RhbmRzIGZvciDigJxtb2R1bGF0ZWQgZXhwb25lbnTigJ0sIGkuZS4gZXhwb25lbnQgKiBzaWduKQorCitUaGUgdmFsdWVzIGFyZSBwcmVmaXgtZnJlZSwgYmVjYXVzZSBubyBleHBvbmVudOKAmXMgZW5jb2RpbmcgY2FuIGJlIGEgcHJlZml4IG9mIGFub3RoZXIsIGFuZCB0aGUgbWFudGlzc2FzIGNhbiBuZXZlciBoYXZlCithIGAwMGAgYnl0ZSBhdCBhbnkgcGxhY2Ugb3RoZXIgdGhhbiB0aGUgbGFzdCBieXRlLCBhbmQgdGh1cyBhbGwgKDEpLSg0KSBhcmUgc2F0aXNmaWVkLgorCisjIyBOdWxscyBhbmQgZW1wdHkgZW5jb2RpbmdzCisKK1NvbWUgdHlwZXMgaW4gQ2Fzc2FuZHJhIChlLmcuIG51bWJlcnMpIGFkbWl0IG51bGwgdmFsdWVzIHRoYXQgYXJlIHJlcHJlc2VudGVkIGFzIGVtcHR5IGJ5dGUgYnVmZmVycy4gVGhpcyBpcworZGlzdGluY3QgZnJvbSBudWxsIGJ5dGUgYnVmZmVycywgd2hpY2ggY2FuIGFsc28gYXBwZWFyIGluIHNvbWUgY2FzZXMuIFBhcnRpY3VsYXJseSwgbnVsbCB2YWx1ZXMgaW4gY2x1c3RlcmluZworY29sdW1ucywgd2hlbiBhbGxvd2VkIGJ5IHRoZSB0eXBlLCBhcmUgaW50ZXJwcmV0ZWQgYXMgZW1wdHkgYnl0ZSBidWZmZXJzLCBlbmNvZGVkIHdpdGggdGhlIGVtcHR5IHNlcGFyYXRvciBgMHgzRmAuCitVbnNwZWNpZmllZCBjbHVzdGVyaW5nIGNvbHVtbnMgKGF0IHRoZSBlbmQgb2YgYSBjbHVzdGVyaW5nIHNwZWNpZmljYXRpb24pLCBwb3NzaWJsZSB3aXRoIGBDT01QQUNUIFNUT1JBR0VgIG9yIHNlY29uZGFyeQoraW5kZXhlcywgdXNlIHRoZSBudWxsIHNlcGFyYXRvciBgMHgzRWAuCisKKyMjIFJldmVyc2VkIHR5cGVzCisKK1JldmVyc2luZyBhIHR5cGUgaXMgc3RyYWlnaHRmb3J3YXJkOiBmbGlwIGFsbCBiaXRzIG9mIHRoZSBlbmNvZGVkIGJ5dGUgc2VxdWVuY2UuIFNpbmNlIHRoZSBzb3VyY2UgdHlwZSBlbmNvZGluZyBtdXN0CitzYXRpc2Z5ICgzKSBhbmQgKDQpLCB0aGUgZmxpcHBlZCBiaXRzIGFsc28gZG8gZm9yIHRoZSByZXZlcnNlZCBjb21wYXJhdG9yLiAoSXQgaXMgYWxzbyB0cnVlIHRoYXQgaWYgdGhlIHNvdXJjZSB0eXBlCitzYXRpc2ZpZXMgKDEpLSgyKSwgdGhlIHJldmVyc2VkIHdpbGwgc2F0aXNmeSB0aGVzZSB0b28uKQorCitJbiBhIHNlcXVlbmNlIHdlIGFsc28gbXVzdCBjb3JyZWN0IHRoZSBlbXB0eSBlbmNvZGluZyBmb3IgYSByZXZlcnNlZCB0eXBlIChzaW5jZSBpdCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBhbGwgdmFsdWVzKS4KK0luc3RlYWQgb2YgYDB4M0ZgIHdlIHVzZSBgMHg0MWAgYXMgdGhlIHNlcGFyYXRvciBieXRlLiBOdWxsIGVuY29kaW5ncyBhcmUgbm90IG1vZGlmaWVkLCBhcyBudWxscyBjb21wYXJlIHNtYWxsZXIgZXZlbgoraW4gcmV2ZXJzZWQgdHlwZXMuCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9ieXRlY29tcGFyYWJsZS9CeXRlU291cmNlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9ieXRlY29tcGFyYWJsZS9CeXRlU291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNiYjgyOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J5dGVjb21wYXJhYmxlL0J5dGVTb3VyY2UuamF2YQpAQCAtMCwwICsxLDg1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGU7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVmFsdWVBY2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZS5WZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5NZW1vcnlVdGlsOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworCisvKioKKyAqIEEgc3RyZWFtIG9mIGJ5dGVzLCB1c2VkIGZvciBieXRlLW9yZGVyLWNvbXBhcmFibGUgcmVwcmVzZW50YXRpb25zIG9mIGRhdGEsIGFuZCB1dGlsaXRpZXMgdG8gY29udmVydCB2YXJpb3VzIHZhbHVlcworICogdG8gdGhlaXIgYnl0ZS1vcmRlcmVkIHRyYW5zbGF0aW9uLgorICogU2VlIEJ5dGVDb21wYXJhYmxlLm1kIGZvciBkZXRhaWxzIGFib3V0IHRoZSBlbmNvZGluZyBzY2hlbWUuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQnl0ZVNvdXJjZQoreworICAgIC8qKiBDb25zdW1lIHRoZSBuZXh0IGJ5dGUsIHVuc2lnbmVkLiBNdXN0IGJlIGJldHdlZW4gMCBhbmQgMjU1LCBvciBFTkRfT0ZfU1RSRUFNIGlmIHRoZXJlIGFyZSBubyBtb3JlIGJ5dGVzLiAqLworICAgIGludCBuZXh0KCk7CisKKyAgICAvKiogVmFsdWUgcmV0dXJuZWQgaWYgYXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLiAqLworICAgIGludCBFTkRfT0ZfU1RSRUFNID0gLTE7CisKKyAgICBCeXRlU291cmNlIEVNUFRZID0gKCkgLT4gRU5EX09GX1NUUkVBTTsKKworICAgIC8qKgorICAgICAqIEVzY2FwZSB2YWx1ZS4gVXNlZCwgYW1vbmcgb3RoZXIgdGhpbmdzLCB0byBtYXJrIHRoZSBlbmQgb2Ygc3ViY29tcG9uZW50cyAoc28gdGhhdCBzaG9ydGVyIGNvbXBhcmVzIGJlZm9yZSBhbnl0aGluZyBsb25nZXIpLgorICAgICAqIEFjdHVhbCB6ZXJvcyBpbiBpbnB1dCBuZWVkIHRvIGJlIGVzY2FwZWQgaWYgdGhpcyBpcyBpbiB1c2UgKHNlZSB7QGxpbmsgQWJzdHJhY3RFc2NhcGVyfSkuCisgICAgICovCisgICAgaW50IEVTQ0FQRSA9IDB4MDA7CisKKyAgICAvLyBaZXJvcyBhcmUgZW5jb2RlZCBhcyBhIHNlcXVlbmNlIG9mIEVTQ0FQRSwgMCBvciBtb3JlIG9mIEVTQ0FQRURfMF9DT05ULCBFU0NBUEVEXzBfRE9ORSBzbyB6ZXJvZWQgc3BhY2VzIG9ubHkgZ3JvdyBieSAxIGJ5dGUKKyAgICBpbnQgRVNDQVBFRF8wX0NPTlQgPSAweEZFOworICAgIGludCBFU0NBUEVEXzBfRE9ORSA9IDB4RkY7CisKKyAgICAvLyBBbGwgc2VwYXJhdG9ycyBtdXN0IGJlIHdpdGhpbiB0aGVzZSBib3VuZHMKKyAgICBpbnQgTUlOX1NFUEFSQVRPUiA9IDB4MTA7CisgICAgaW50IE1BWF9TRVBBUkFUT1IgPSAweEVGOworCisgICAgLy8gTmV4dCBjb21wb25lbnQgbWFya2VyLgorICAgIGludCBORVhUX0NPTVBPTkVOVCA9IDB4NDA7CisgICAgLy8gTWFya2VyIHVzZWQgdG8gcHJlc2VudCBudWxsIHZhbHVlcyByZXByZXNlbnRlZCBieSBlbXB0eSBidWZmZXJzIChlLmcuIGJ5IEludDMyVHlwZSkKKyAgICBpbnQgTkVYVF9DT01QT05FTlRfRU1QVFkgPSAweDNGOworICAgIGludCBORVhUX0NPTVBPTkVOVF9FTVBUWV9SRVZFUlNFRCA9IDB4NDE7CisgICAgLy8gTWFya2VyIGZvciBudWxsIGNvbXBvbmVudHMgaW4gdHVwbGVzLCBtYXBzLCBzZXRzIGFuZCBjbHVzdGVyaW5nIGtleXMuCisgICAgaW50IE5FWFRfQ09NUE9ORU5UX05VTEwgPSAweDNFOworCisgICAgLy8gU2VjdGlvbiBmb3IgbmV4dCBjb21wb25lbnQgbWFya2VycyB3aGljaCBpcyBub3QgYWxsb3dlZCBmb3IgdXNlCisgICAgaW50IE1JTl9ORVhUX0NPTVBPTkVOVCA9IDB4M0M7CisgICAgaW50IE1BWF9ORVhUX0NPTVBPTkVOVCA9IDB4NDQ7CisKKyAgICAvLyBEZWZhdWx0IHRlcm1pbmF0b3IgYnl0ZSBpbiBzZXF1ZW5jZXMuIFNtYWxsZXIgdGhhbiBORVhUX0NPTVBPTkVOVF9OVUxMLCBidXQgbGFyZ2VyIHRoYW4gTFRfTkVYVF9DT01QT05FTlQgdG8KKyAgICAvLyBlbnN1cmUgbGV4aWNvZ3JhcGhpYyBjb21wYXJlcyBnbyBpbiB0aGUgY29ycmVjdCBkaXJlY3Rpb24KKyAgICBpbnQgVEVSTUlOQVRPUiA9IDB4Mzg7CisgICAgLy8gVGhlc2UgYXJlIHNwZWNpYWwgZW5kaW5ncywgZm9yIGV4Y2x1c2l2ZS9pbmNsdXNpdmUgYm91bmRzIChpLmUuIHNtYWxsZXIgdGhhbiBhbnl0aGluZyB3aXRoIG1vcmUgY29tcG9uZW50cywKKyAgICAvLyBiaWdnZXIgdGhhbiBhbnl0aGluZyB3aXRoIG1vcmUgY29tcG9uZW50cykKKyAgICBpbnQgTFRfTkVYVF9DT01QT05FTlQgPSAweDIwOworICAgIGludCBHVF9ORVhUX0NPTVBPTkVOVCA9IDB4NjA7CisKKyAgICAvLyBVbnN1cHBvcnRlZCwgZm9yIGFydGlmaWNpYWwgYm91bmRzCisgICAgaW50IExUTFRfTkVYVF9DT01QT05FTlQgPSAweDFGOyAvLyBMVF9ORVhUX0NPTVBPTkVOVCAtIDEKKyAgICBpbnQgR1RHVF9ORVhUX0NPTVBPTkVOVCA9IDB4NjE7IC8vIEdUX05FWFRfQ09NUE9ORU5UICsgMQorCisgICAgLy8gU3BlY2lhbCB2YWx1ZSBmb3IgY29tcG9uZW50cyB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZSBub3JtYWwgbWluL21heCBzcGFuLiAoc3RhdGljIHJvd3MpCisgICAgaW50IEVYQ0xVREVEID0gMHgxODsKKworICAgIC8qKgorICAgICAqIEVuY29kZXMgYnl0ZS1hY2Nlc3NpYmxlIGRhdGEgYXMgYSBieXRlLWNvbXBhcmFibGUgc291cmNlIHRoYXQgaGFzIDBzIGVzY2FwZWQgYW5kIGZpbmlzaGVzIGluIGFuIGVzY2FwZWQKKyAgICAgKiBzdGF0ZS4KKyAgICAgKiBUaGlzIHByb3ZpZGVzIGEgd2Vha2x5LXByZWZpeC1mcmVlIGJ5dGUtY29tcGFyYWJsZSB2ZXJzaW9uIG9mIHRoZSBjb250ZW50IHRvIHVzZSBpbiBzZXF1ZW5jZXMuCisgICAgICogKFNlZSB7QGxpbmsgQWJzdHJhY3RFc2NhcGVyfSBmb3IgYSBkZXRhaWxlZCBleHBsYW5hdGlvbi4pCisgICAgICovCisgICAgc3RhdGljIDxWPiBCeXRlU291cmNlIG9mKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSwgVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBY2Nlc3NvckVzY2FwZXI8PihhY2Nlc3NvciwgZGF0YSwgdmVyc2lvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jb2RlcyBhIGJ5dGUgYnVmZmVyIGFzIGEgYnl0ZS1jb21wYXJhYmxlIHNvdXJjZSB0aGF0IGhhcyAwcyBlc2NhcGVkIGFuZCBmaW5pc2hlcyBpbiBhbiBlc2NhcGUuCisgICAgICogVGhpcyBwcm92aWRlcyBhIHdlYWtseS1wcmVmaXgtZnJlZSBieXRlLWNvbXBhcmFibGUgdmVyc2lvbiBvZiB0aGUgY29udGVudCB0byB1c2UgaW4gc2VxdWVuY2VzLgorICAgICAqIChTZWUgQnl0ZVNvdXJjZS5CdWZmZXJFc2NhcGVyL011bHRpIGZvciBleHBsYW5hdGlvbi4pCisgICAgICovCisgICAgc3RhdGljIEJ5dGVTb3VyY2Ugb2YoQnl0ZUJ1ZmZlciBidWYsIFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQnVmZmVyRXNjYXBlcihidWYsIHZlcnNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMgYSBieXRlIGFycmF5IGFzIGEgYnl0ZS1jb21wYXJhYmxlIHNvdXJjZSB0aGF0IGhhcyAwcyBlc2NhcGVkIGFuZCBmaW5pc2hlcyBpbiBhbiBlc2NhcGUuCisgICAgICogVGhpcyBwcm92aWRlcyBhIHByZWZpeC1mcmVlIGJ5dGUtY29tcGFyYWJsZSB2ZXJzaW9uIG9mIHRoZSBjb250ZW50IHRvIHVzZSBpbiBzZXF1ZW5jZXMuCisgICAgICogKFNlZSBCeXRlU291cmNlLkJ1ZmZlckVzY2FwZXIvTXVsdGkgZm9yIGV4cGxhbmF0aW9uLikKKyAgICAgKi8KKyAgICBzdGF0aWMgQnl0ZVNvdXJjZSBvZihieXRlW10gYnVmLCBWZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEFycmF5RXNjYXBlcihidWYsIHZlcnNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMgYSBtZW1vcnkgcmFuZ2UgYXMgYSBieXRlLWNvbXBhcmFibGUgc291cmNlIHRoYXQgaGFzIDBzIGVzY2FwZWQgYW5kIGZpbmlzaGVzIGluIGFuIGVzY2FwZS4KKyAgICAgKiBUaGlzIHByb3ZpZGVzIGEgd2Vha2x5LXByZWZpeC1mcmVlIGJ5dGUtY29tcGFyYWJsZSB2ZXJzaW9uIG9mIHRoZSBjb250ZW50IHRvIHVzZSBpbiBzZXF1ZW5jZXMuCisgICAgICogKFNlZSBCeXRlU291cmNlLkJ1ZmZlckVzY2FwZXIvTXVsdGkgZm9yIGV4cGxhbmF0aW9uLikKKyAgICAgKi8KKyAgICBzdGF0aWMgQnl0ZVNvdXJjZSBvZk1lbW9yeShsb25nIGFkZHJlc3MsIGludCBsZW5ndGgsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgTWVtb3J5RXNjYXBlcihhZGRyZXNzLCBsZW5ndGgsIHZlcnNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbWJpbmVzIGEgY2hhaW4gb2Ygc291cmNlcywgdHVybmluZyB0aGVpciB3ZWFrLXByZWZpeC1mcmVlIGJ5dGUtY29tcGFyYWJsZSByZXByZXNlbnRhdGlvbiBpbnRvIHRoZSBjb21iaW5hdGlvbidzCisgICAgICogcHJlZml4LWZyZWUgYnl0ZS1jb21wYXJhYmxlIHJlcHJlc2VudGF0aW9uLCB3aXRoIHRoZSBpbmNsdWRlZCB0ZXJtaW5hdG9yIGNoYXJhY3Rlci4KKyAgICAgKiBGb3IgY29ycmVjdG5lc3MsIHRoZSB0ZXJtaW5hdG9yIG11c3QgYmUgd2l0aGluIE1JTi1NQVhfU0VQQVJBVE9SIGFuZCBvdXRzaWRlIHRoZSByYW5nZSByZXNlcnZlZCBmb3IKKyAgICAgKiBORVhUX0NPTVBPTkVOVCBtYXJrZXJzLgorICAgICAqIFR5cGljYWxseSBURVJNSU5BVE9SLCBvciBMVC9HVF9ORVhUX0NPTVBPTkVOVCBpZiB1c2VkIGZvciBwYXJ0aWFsbHkgc3BlY2lmaWVkIGJvdW5kcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgQnl0ZVNvdXJjZSB3aXRoVGVybWluYXRvcihpbnQgdGVybWluYXRvciwgQnl0ZVNvdXJjZS4uLiBzcmNzKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHRlcm1pbmF0b3IgPj0gTUlOX1NFUEFSQVRPUiAmJiB0ZXJtaW5hdG9yIDw9IE1BWF9TRVBBUkFUT1I7CisgICAgICAgIGFzc2VydCB0ZXJtaW5hdG9yIDwgTUlOX05FWFRfQ09NUE9ORU5UIHx8IHRlcm1pbmF0b3IgPiBNQVhfTkVYVF9DT01QT05FTlQ7CisgICAgICAgIHJldHVybiBuZXcgTXVsdGkoc3JjcywgdGVybWluYXRvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXMgYWJvdmUsIGJ1dCBwZXJtaXRzIGFueSBzZXBhcmF0b3IuIFRoZSBsZWdhY3kgZm9ybWF0IHdhc24ndCB1c2luZyB3ZWFrIHByZWZpeCBmcmVlZG9tIGFuZCBoYXMgc29tZQorICAgICAqIG5vbi1yZXZlcnNpYmxlIHRyYW5zZm9ybWF0aW9ucy4KKyAgICAgKi8KKyAgICBzdGF0aWMgQnl0ZVNvdXJjZSB3aXRoVGVybWluYXRvckxlZ2FjeShpbnQgdGVybWluYXRvciwgQnl0ZVNvdXJjZS4uLiBzcmNzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNdWx0aShzcmNzLCB0ZXJtaW5hdG9yKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQnl0ZVNvdXJjZSB3aXRoVGVybWluYXRvck1heWJlTGVnYWN5KFZlcnNpb24gdmVyc2lvbiwgaW50IGxlZ2FjeVRlcm1pbmF0b3IsIEJ5dGVTb3VyY2UuLi4gc3JjcykKKyAgICB7CisgICAgICAgIHJldHVybiB2ZXJzaW9uID09IFZlcnNpb24uTEVHQUNZID8gd2l0aFRlcm1pbmF0b3JMZWdhY3kobGVnYWN5VGVybWluYXRvciwgc3JjcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB3aXRoVGVybWluYXRvcihURVJNSU5BVE9SLCBzcmNzKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQnl0ZVNvdXJjZSBvZihTdHJpbmcgcywgVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcnJheUVzY2FwZXIocy5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSwgdmVyc2lvbik7CisgICAgfQorCisgICAgc3RhdGljIEJ5dGVTb3VyY2Ugb2YobG9uZyB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgTnVtYmVyKHZhbHVlIF4gKDFMPDw2MyksIDgpOworICAgIH0KKworICAgIHN0YXRpYyBCeXRlU291cmNlIG9mKGludCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgTnVtYmVyKHZhbHVlIF4gKDFMPDwzMSksIDQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2UgYSBzb3VyY2UgZm9yIGEgc2lnbmVkIGZpeGVkLWxlbmd0aCBudW1iZXIsIGFsc28gdHJhbnNsYXRpbmcgZW1wdHkgdG8gbnVsbC4KKyAgICAgKiBUaGUgZmlyc3QgYnl0ZSBoYXMgaXRzIHNpZ24gYml0IGludmVydGVkLCBhbmQgdGhlIHJlc3QgYXJlIHBhc3NlZCB1bmNoYW5nZWQuCisgICAgICogUHJlc3VtZXMgdGhhdCB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgaXMgYWx3YXlzIGVpdGhlciAwIG9yIGNvbnN0YW50IGZvciB0aGUgdHlwZSwgd2hpY2ggcGVybWl0cyBkZWNvZGluZyBhbmQKKyAgICAgKiBlbnN1cmVzIHRoZSByZXByZXNlbnRhdGlvbiBpcyBwcmVmaXgtZnJlZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgPFY+IEJ5dGVTb3VyY2Ugb3B0aW9uYWxTaWduZWRGaXhlZExlbmd0aE51bWJlcihWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBWIGRhdGEpCisgICAgeworICAgICAgICByZXR1cm4gIWFjY2Vzc29yLmlzRW1wdHkoZGF0YSkgPyBzaWduZWRGaXhlZExlbmd0aE51bWJlcihhY2Nlc3NvciwgZGF0YSkgOiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2UgYSBzb3VyY2UgZm9yIGEgc2lnbmVkIGZpeGVkLWxlbmd0aCBudW1iZXIuCisgICAgICogVGhlIGZpcnN0IGJ5dGUgaGFzIGl0cyBzaWduIGJpdCBpbnZlcnRlZCwgYW5kIHRoZSByZXN0IGFyZSBwYXNzZWQgdW5jaGFuZ2VkLgorICAgICAqIFByZXN1bWVzIHRoYXQgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGlzIGFsd2F5cyBjb25zdGFudCBmb3IgdGhlIHR5cGUuCisgICAgICovCisgICAgc3RhdGljIDxWPiBCeXRlU291cmNlIHNpZ25lZEZpeGVkTGVuZ3RoTnVtYmVyKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgU2lnbmVkRml4ZWRMZW5ndGhOdW1iZXI8PihhY2Nlc3NvciwgZGF0YSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvZHVjZSBhIHNvdXJjZSBmb3IgYSBzaWduZWQgZml4ZWQtbGVuZ3RoIGZsb2F0aW5nLXBvaW50IG51bWJlciwgYWxzbyB0cmFuc2xhdGluZyBlbXB0eSB0byBudWxsLgorICAgICAqIElmIHNpZ24gYml0IGlzIG9uLCByZXR1cm5zIG5lZ2F0ZWQgYnl0ZXMuIElmIG5vdCwgYWRkIHRoZSBzaWduIGJpdCB2YWx1ZS4KKyAgICAgKiAoU2lnbiBvZiBJRUVFIGZsb2F0cyBpcyB0aGUgaGlnaGVzdCBiaXQsIHRoZSByZXN0IGNhbiBiZSBjb21wYXJlZCBpbiBtYWduaXR1ZGUgYnkgYnl0ZSBjb21wYXJpc29uLikKKyAgICAgKiBQcmVzdW1lcyB0aGF0IHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciBpcyBhbHdheXMgZWl0aGVyIDAgb3IgY29uc3RhbnQgZm9yIHRoZSB0eXBlLCB3aGljaCBwZXJtaXRzIGRlY29kaW5nIGFuZAorICAgICAqIGVuc3VyZXMgdGhlIHJlcHJlc2VudGF0aW9uIGlzIHByZWZpeC1mcmVlLgorICAgICAqLworICAgIHN0YXRpYyA8Vj4gQnl0ZVNvdXJjZSBvcHRpb25hbFNpZ25lZEZpeGVkTGVuZ3RoRmxvYXQoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhKQorICAgIHsKKyAgICAgICAgcmV0dXJuICFhY2Nlc3Nvci5pc0VtcHR5KGRhdGEpID8gc2lnbmVkRml4ZWRMZW5ndGhGbG9hdChhY2Nlc3NvciwgZGF0YSkgOiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2UgYSBzb3VyY2UgZm9yIGEgc2lnbmVkIGZpeGVkLWxlbmd0aCBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgICAgICogSWYgc2lnbiBiaXQgaXMgb24sIHJldHVybnMgbmVnYXRlZCBieXRlcy4gSWYgbm90LCBhZGQgdGhlIHNpZ24gYml0IHZhbHVlLgorICAgICAqIChTaWduIG9mIElFRUUgZmxvYXRzIGlzIHRoZSBoaWdoZXN0IGJpdCwgdGhlIHJlc3QgY2FuIGJlIGNvbXBhcmVkIGluIG1hZ25pdHVkZSBieSBieXRlIGNvbXBhcmlzb24uKQorICAgICAqIFByZXN1bWVzIHRoYXQgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGlzIGFsd2F5cyBjb25zdGFudCBmb3IgdGhlIHR5cGUuCisgICAgICovCisgICAgc3RhdGljIDxWPiBCeXRlU291cmNlIHNpZ25lZEZpeGVkTGVuZ3RoRmxvYXQoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTaWduZWRGaXhlZExlbmd0aEZsb2F0PD4oYWNjZXNzb3IsIGRhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2UgYSBzb3VyY2UgZm9yIGEgc2lnbmVkIGludGVnZXIsIHN0b3JlZCB1c2luZyB2YXJpYWJsZSBsZW5ndGggZW5jb2RpbmcuCisgICAgICogVGhlIHJlcHJlc2VudGF0aW9uIHVzZXMgYmV0d2VlbiAxIGFuZCA5IGJ5dGVzLCBpcyBwcmVmaXgtZnJlZSBhbmQgY29tcGFyZXMKKyAgICAgKiBjb3JyZWN0bHkuCisgICAgICovCisgICAgc3RhdGljIEJ5dGVTb3VyY2UgdmFyaWFibGVMZW5ndGhJbnRlZ2VyKGxvbmcgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFZhcmlhYmxlTGVuZ3RoSW50ZWdlcih2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNlcGFyYXRvciBmb3IgdHdvIGJ5dGUgc291cmNlcywgaS5lLiBzb21ldGhpbmcgdGhhdCBpcyBkZWZpbml0ZWx5ID4gcHJldk1heCwgYW5kIDw9IGN1cnJNaW4sIGFzc3VtaW5nCisgICAgICogcHJldk1heCA8IGN1cnJNaW4uCisgICAgICogVGhpcyByZXR1cm5zIHRoZSBzaG9ydGVzdCBwcmVmaXggb2YgY3Vyck1pbiB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBwcmV2TWF4LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZVNvdXJjZSBzZXBhcmF0b3JQcmVmaXgoQnl0ZVNvdXJjZSBwcmV2TWF4LCBCeXRlU291cmNlIGN1cnJNaW4pCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFNlcGFyYXRvcihwcmV2TWF4LCBjdXJyTWluLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc2VwYXJhdG9yIGZvciB0d28gYnl0ZSBzb3VyY2VzLCBpLmUuIHNvbWV0aGluZyB0aGF0IGlzIGRlZmluaXRlbHkgPiBwcmV2TWF4LCBhbmQgPD0gY3Vyck1pbiwgYXNzdW1pbmcKKyAgICAgKiBwcmV2TWF4IDwgY3Vyck1pbi4KKyAgICAgKiBUaGlzIGlzIGEgc291cmNlIG9mIGxlbmd0aCAxIGxvbmdlciB0aGFuIHRoZSBjb21tb24gcHJlZml4IG9mIHRoZSB0d28gc291cmNlcywgd2l0aCBsYXN0IGJ5dGUgb25lIGhpZ2hlciB0aGFuIHRoZQorICAgICAqIHByZXZNYXggc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZVNvdXJjZSBzZXBhcmF0b3JHdChCeXRlU291cmNlIHByZXZNYXgsIEJ5dGVTb3VyY2UgY3Vyck1pbikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgU2VwYXJhdG9yKHByZXZNYXgsIGN1cnJNaW4sIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVTb3VyY2Ugb25lQnl0ZShpbnQgaSkKKyAgICB7CisgICAgICAgIGFzc2VydCBpID49IDAgJiYgaSA8PSAweEZGIDogIkFyZ3VtZW50IG11c3QgYmUgYSB2YWxpZCB1bnNpZ25lZCBieXRlLiI7CisgICAgICAgIHJldHVybiBuZXcgQnl0ZVNvdXJjZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2xlYW4gY29uc3VtZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IG5leHQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjb25zdW1lZCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgY29uc3VtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZVNvdXJjZSBjdXQoQnl0ZVNvdXJjZSBzcmMsIGludCBjdXRvZmYpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEJ5dGVTb3VyY2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcG9zID0gMDsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IG5leHQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBwb3MrKyA8IGN1dG9mZiA/IHNyYy5uZXh0KCkgOiBFTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyYXAgYSBCeXRlU291cmNlIGluIGEgbGVuZ3RoLWZpeGluZyBmYWNhZGUuCisgICAgICoKKyAgICAgKiBJZiB0aGUgbGVuZ3RoIG9mIHtAY29kZSBzcmN9IGlzIGxlc3MgdGhhbiB7QGNvZGUgY3V0b2ZmfSwgdGhlbiBwYWQgaXQgb24gdGhlIHJpZ2h0IHdpdGgge0Bjb2RlIHBhZGRpbmd9IHVudGlsCisgICAgICogdGhlIG92ZXJhbGwgbGVuZ3RoIGVxdWFscyB7QGNvZGUgY3V0b2ZmfS4gIElmIHRoZSBsZW5ndGggb2Yge0Bjb2RlIHNyY30gaXMgZ3JlYXRlciB0aGFuIHtAY29kZSBjdXRvZmZ9LCB0aGVuCisgICAgICogdHJ1bmNhdGUge0Bjb2RlIHNyY30gdG8gdGhhdCBzaXplLiAgRWZmZWN0aXZlbHkgYSBub29wIGlmIHtAY29kZSBzcmN9IGhhcHBlbnMgdG8gaGF2ZSBsZW5ndGgge0Bjb2RlIGN1dG9mZn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjIHRoZSBpbnB1dCBzb3VyY2UgdG8gd3JhcAorICAgICAqIEBwYXJhbSBjdXRvZmYgdGhlIHNpemUgb2YgdGhlIHNvdXJjZSByZXR1cm5lZAorICAgICAqIEBwYXJhbSBwYWRkaW5nIGEgcGFkZGluZyBieXRlIChhbiBpbnQgc3ViamVjdCB0byBhIDB4RkYgbWFzaykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVTb3VyY2UgY3V0T3JSaWdodFBhZChCeXRlU291cmNlIHNyYywgaW50IGN1dG9mZiwgaW50IHBhZGRpbmcpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEJ5dGVTb3VyY2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcG9zID0gMDsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IG5leHQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwb3MrKyA+PSBjdXRvZmYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG5leHQgPSBzcmMubmV4dCgpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXh0ID09IEVORF9PRl9TVFJFQU0gPyBwYWRkaW5nIDogbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFZhcmlhYmxlLWxlbmd0aCBlbmNvZGluZy4gRXNjYXBlcyAwcyBhcyBFU0NBUEUgKyB6ZXJvIG9yIG1vcmUgRVNDQVBFRF8wX0NPTlQgKyBFU0NBUEVEXzBfRE9ORS4KKyAgICAgKiBJZiB0aGUgc291cmNlIGVuZHMgaW4gMCwgd2UgdXNlIEVTQ0FQRURfMF9DT05UIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBlbmNvZGluZyByZW1haW5zIHNtYWxsZXIgdGhhbiB0aGF0IHNvdXJjZQorICAgICAqIHdpdGggYSBmdXJ0aGVyIDAgYXQgdGhlIGVuZC4KKyAgICAgKiBGaW5pc2hlcyBpbiBhbiBlc2NhcGVkIHN0YXRlIChlaXRoZXIgd2l0aCBFU0NBUEUgb3IgRVNDQVBFRF8wX0NPTlQpLCB3aGljaCBpbiB7QGxpbmsgTXVsdGl9IGlzIGZvbGxvd2VkIGJ5CisgICAgICogYSBjb21wb25lbnQgc2VwYXJhdG9yIGJldHdlZW4gMHgxMCBhbmQgMHhGRS4KKyAgICAgKgorICAgICAqIEUuZy4gIkFcMFwwQiIgdHJhbnNsYXRlcyB0byA0MTAwRkVGRjQyMDAKKyAgICAgKiAgICAgICJBXDBCXDAiICAgICAgICAgICAgICAgNDEwMEZGNDIwMEZFICgrMDAgZm9yIHtAbGluayBWZXJzaW9uI0xFR0FDWX0pCisgICAgICogICAgICAiQVwwIiAgICAgICAgICAgICAgICAgIDQxMDBGRSAgICAgICAoKzAwIGZvciB7QGxpbmsgVmVyc2lvbiNMRUdBQ1l9KQorICAgICAqICAgICAgIkFCIiAgICAgICAgICAgICAgICAgICA0MTQyMDAKKyAgICAgKgorICAgICAqIElmIGluIGEgc2luZ2xlIGJ5dGUgc291cmNlLCB0aGUgYnl0ZXMgY291bGQgYmUgc2ltcGx5IHBhc3NlZCB1bmNoYW5nZWQsIGJ1dCB0aGlzIHdvdWxkIG5vdCBhbGxvdyB1cyB0bworICAgICAqIGNvbWJpbmUgY29tcG9uZW50cy4gVGhpcyB0cmFuc2xhdGlvbiBwcmVzZXJ2ZXMgb3JkZXIsIGFuZCBzaW5jZSB0aGUgZW5jb2RpbmcgZm9yIDAgaXMgaGlnaGVyIHRoYW4gdGhlIHNlcGFyYXRvcgorICAgICAqIGFsc28gbWFrZXMgc3VyZSBzaG9ydGVyIGNvbXBvbmVudHMgYXJlIHRyZWF0ZWQgYXMgc21hbGxlci4KKyAgICAgKgorICAgICAqIFRoZSBlbmNvZGluZyBpcyBub3QgcHJlZml4LWZyZWUsIHNpbmNlIGUuZy4gdGhlIGVuY29kaW5nIG9mICJBIiAoNDEwMCkgaXMgYSBwcmVmaXggb2YgdGhlIGVuY29kaW5nIG9mICJBXDAiCisgICAgICogKDQxMDBGRSksIGJ1dCB0aGUgYnl0ZSBmb2xsb3dpbmcgdGhlIHByZWZpeCBpcyBndWFyYW50ZWVkIHRvIGJlIEZFIG9yIEZGLCB3aGljaCBtYWtlcyB0aGUgZW5jb2Rpbmcgd2Vha2x5CisgICAgICogcHJlZml4LWZyZWUuIEFkZGl0aW9uYWxseSwgYW55IHN1Y2ggcHJlZml4IHNlcXVlbmNlIHdpbGwgY29tcGFyZSBzbWFsbGVyIHRoYW4gdGhlIHZhbHVlIHRvIHdoaWNoIGl0IGlzIGEgcHJlZml4LAorICAgICAqIGJlY2F1c2UgYW55IHBlcm1pdHRlZCBzZXBhcmF0b3IgYnl0ZSB3aWxsIGJlIHNtYWxsZXIgdGhhbiB0aGUgYnl0ZSBmb2xsb3dpbmcgdGhlIHByZWZpeC4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQWJzdHJhY3RFc2NhcGVyIGltcGxlbWVudHMgQnl0ZVNvdXJjZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBWZXJzaW9uIHZlcnNpb247CisgICAgICAgIHByaXZhdGUgaW50IGJ1ZnBvczsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGVzY2FwZWQ7CisKKyAgICAgICAgQWJzdHJhY3RFc2NhcGVyKGludCBwb3NpdGlvbiwgVmVyc2lvbiB2ZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmJ1ZnBvcyA9IHBvc2l0aW9uOworICAgICAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgZmluYWwgaW50IG5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnVmcG9zID49IGxpbWl0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZnBvcyA+IGxpbWl0KCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTkRfT0ZfU1RSRUFNOworCisgICAgICAgICAgICAgICAgKytidWZwb3M7CisgICAgICAgICAgICAgICAgaWYgKGVzY2FwZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlc2NhcGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IFZlcnNpb24uTEVHQUNZKQorICAgICAgICAgICAgICAgICAgICAgICAgLS1idWZwb3M7IC8vIHBsYWNlIGFuIEVTQ0FQRSBhdCB0aGUgZW5kIG9mIHNlcXVlbmNlIGVuZGluZyBpbiBFU0NBUEUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVTQ0FQRURfMF9DT05UOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRVNDQVBFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgaW5kZXggPSBidWZwb3MrKzsKKyAgICAgICAgICAgIGludCBiID0gZ2V0KGluZGV4KSAmIDB4RkY7CisgICAgICAgICAgICBpZiAoIWVzY2FwZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGIgPT0gRVNDQVBFKQorICAgICAgICAgICAgICAgICAgICBlc2NhcGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYiA9PSBFU0NBUEUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFU0NBUEVEXzBfQ09OVDsKKyAgICAgICAgICAgICAgICAtLWJ1ZnBvczsKKyAgICAgICAgICAgICAgICBlc2NhcGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVTQ0FQRURfMF9ET05FOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJ5dGUgZ2V0KGludCBpbmRleCk7CisKKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBsaW1pdCgpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBBY2Nlc3NvckVzY2FwZXI8Vj4gZXh0ZW5kcyBBYnN0cmFjdEVzY2FwZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgViBkYXRhOworICAgICAgICBwcml2YXRlIGZpbmFsIFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3I7CisKKyAgICAgICAgcHJpdmF0ZSBBY2Nlc3NvckVzY2FwZXIoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhLCBWZXJzaW9uIHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKDAsIHZlcnNpb24pOworICAgICAgICAgICAgdGhpcy5hY2Nlc3NvciA9IGFjY2Vzc29yOworICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnQgbGltaXQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYWNjZXNzb3Iuc2l6ZShkYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBieXRlIGdldChpbnQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhY2Nlc3Nvci5nZXRCeXRlKGRhdGEsIGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBCdWZmZXJFc2NhcGVyIGV4dGVuZHMgQWJzdHJhY3RFc2NhcGVyCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIEJ5dGVCdWZmZXIgYnVmOworCisgICAgICAgIHByaXZhdGUgQnVmZmVyRXNjYXBlcihCeXRlQnVmZmVyIGJ1ZiwgVmVyc2lvbiB2ZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihidWYucG9zaXRpb24oKSwgdmVyc2lvbik7CisgICAgICAgICAgICB0aGlzLmJ1ZiA9IGJ1ZjsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnQgbGltaXQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYnVmLmxpbWl0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYnl0ZSBnZXQoaW50IGluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYnVmLmdldChpbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQXJyYXlFc2NhcGVyIGV4dGVuZHMgQWJzdHJhY3RFc2NhcGVyCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBidWY7CisKKyAgICAgICAgcHJpdmF0ZSBBcnJheUVzY2FwZXIoYnl0ZVtdIGJ1ZiwgVmVyc2lvbiB2ZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcigwLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIHRoaXMuYnVmID0gYnVmOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBieXRlIGdldChpbnQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBidWZbaW5kZXhdOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBpbnQgbGltaXQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYnVmLmxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBNZW1vcnlFc2NhcGVyIGV4dGVuZHMgQWJzdHJhY3RFc2NhcGVyCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgYWRkcmVzczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbGVuZ3RoOworCisgICAgICAgIE1lbW9yeUVzY2FwZXIobG9uZyBhZGRyZXNzLCBpbnQgbGVuZ3RoLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKDAsIHZlcnNpb24pOworICAgICAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKKyAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGJ5dGUgZ2V0KGludCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE1lbW9yeVV0aWwuZ2V0Qnl0ZShhZGRyZXNzICsgaW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGludCBsaW1pdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaXhlZCBsZW5ndGggc2lnbmVkIG51bWJlciBlbmNvZGluZy4gSW52ZXJ0cyBmaXJzdCBiaXQgKHNvIHRoYXQgbmVnIDwgcG9zKSwgdGhlbiBqdXN0IHBvc3RzIGFsbCBieXRlcyBmcm9tIHRoZQorICAgICAqIGJ1ZmZlci4gQXNzdW1lcyBidWZmZXIgaXMgb2YgY29ycmVjdCBsZW5ndGguCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIFNpZ25lZEZpeGVkTGVuZ3RoTnVtYmVyPFY+IGltcGxlbWVudHMgQnl0ZVNvdXJjZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yOworICAgICAgICBwcml2YXRlIGZpbmFsIFYgZGF0YTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgYnVmcG9zOworCisgICAgICAgIHB1YmxpYyBTaWduZWRGaXhlZExlbmd0aE51bWJlcihWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBWIGRhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuYWNjZXNzb3IgPSBhY2Nlc3NvcjsKKyAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgICAgICAgICB0aGlzLmJ1ZnBvcyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBuZXh0KCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJ1ZnBvcyA+PSBhY2Nlc3Nvci5zaXplKGRhdGEpKQorICAgICAgICAgICAgICAgIHJldHVybiBFTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgaW50IHYgPSBhY2Nlc3Nvci5nZXRCeXRlKGRhdGEsIGJ1ZnBvcykgJiAweEZGOworICAgICAgICAgICAgaWYgKGJ1ZnBvcyA9PSAwKQorICAgICAgICAgICAgICAgIHYgXj0gMHg4MDsKKyAgICAgICAgICAgICsrYnVmcG9zOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYXJpYWJsZS1sZW5ndGggZW5jb2RpbmcgZm9yIHVuc2lnbmVkIGludGVnZXJzLgorICAgICAqIFRoZSBlbmNvZGluZyBpcyBzaW1pbGFyIHRvIFVURi04IGVuY29kaW5nLgorICAgICAqIE51bWJlcnMgYmV0d2VlbiAwIGFuZCAxMjcgYXJlIGVuY29kZWQgaW4gb25lIGJ5dGUsIHVzaW5nIDAgaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0LgorICAgICAqIExhcmdlciB2YWx1ZXMgaGF2ZSAxcyBpbiBhcyBtYW55IG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgYXMgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGJ5dGVzCisgICAgICogaW4gdGhlIHJlcHJlc2VudGF0aW9uLCBmb2xsb3dlZCBieSBhIDAuIFRoaXMgZW5zdXJlcyB0aGF0IGxvbmdlciBudW1iZXJzIGNvbXBhcmUgbGFyZ2VyIHRoYW4gc2hvcnRlcgorICAgICAqIG9uZXMuIFNpbmNlIHdlIG5ldmVyIHVzZSBhIGxvbmdlciByZXByZXNlbnRhdGlvbiB0aGFuIG5lY2Vzc2FyeSwgdGhpcyBpbXBsaWVzIG51bWJlcnMgY29tcGFyZSBjb3JyZWN0bHkuCisgICAgICogQXMgdGhlIG51bWJlciBvZiBieXRlcyBpcyBzcGVjaWZpZWQgaW4gdGhlIGJpdHMgb2YgdGhlIGZpcnN0LCBubyB2YWx1ZSBpcyBhIHByZWZpeCBvZiBhbm90aGVyLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBWYXJpYWJsZUxlbmd0aFVuc2lnbmVkSW50ZWdlciBpbXBsZW1lbnRzIEJ5dGVTb3VyY2UKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgbG9uZyB2YWx1ZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgcG9zID0gLTE7CisKKyAgICAgICAgcHVibGljIFZhcmlhYmxlTGVuZ3RoVW5zaWduZWRJbnRlZ2VyKGxvbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IG5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBiaXRzTWludXNPbmUgPSA2MyAtIChMb25nLm51bWJlck9mTGVhZGluZ1plcm9zKHZhbHVlIHwgMSkpOyAvLyAwIHRvIDYzICh0aGUgfCAxIGlzIHRvIG1ha2Ugc3VyZSAwIG1hcHMgdG8gMCAoMSBiaXQpKQorICAgICAgICAgICAgICAgIGludCBieXRlc01pbnVzT25lID0gYml0c01pbnVzT25lIC8gNzsKKyAgICAgICAgICAgICAgICBpbnQgbWFzayA9IC0yNTYgPj4gYnl0ZXNNaW51c09uZTsgICAvLyBzZXF1ZW5jZSBvZiBieXRlc01pbnVzT25lIDFzIGluIHRoZSBtb3N0LXNpZ25pZmljYW50IGJpdHMKKyAgICAgICAgICAgICAgICBwb3MgPSBieXRlc01pbnVzT25lICogODsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGludCkgKCh2YWx1ZSA+Pj4gcG9zKSB8IG1hc2spICYgMHhGRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvcyAtPSA4OworICAgICAgICAgICAgaWYgKHBvcyA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEVORF9PRl9TVFJFQU07CisgICAgICAgICAgICByZXR1cm4gKGludCkgKHZhbHVlID4+PiBwb3MpICYgMHhGRjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZhcmlhYmxlLWxlbmd0aCBlbmNvZGluZyBmb3Igc2lnbmVkIGludGVnZXJzLgorICAgICAqIFRoZSBlbmNvZGluZyBpcyBiYXNlZCBvbiB0aGUgdW5zaWduZWQgZW5jb2RpbmcgYWJvdmUsIHdoZXJlIHRoZSBmaXJzdCBiaXQgc3RvcmVkIGlzIHRoZSBpbnZlcnRlZCBzaWduLAorICAgICAqIGZvbGxvd2VkIGJ5IGFzIG1hbnkgbWF0Y2hpbmcgYml0cyBhcyB0aGVyZSBhcmUgYWRkaXRpb25hbCBieXRlcyBpbiB0aGUgZW5jb2RpbmcsIGZvbGxvd2VkIGJ5IHRoZSB0d28ncworICAgICAqIGNvbXBsZW1lbnQgb2YgdGhlIG51bWJlci4KKyAgICAgKiBCZWNhdXNlIG9mIHRoZSBpbnZlcnRlZCBzaWduIGJpdCwgbmVnYXRpdmUgbnVtYmVycyBjb21wYXJlIHNtYWxsZXIgdGhhbiBwb3NpdGl2ZXMsIGFuZCBiZWNhdXNlIHRoZSBsZW5ndGgKKyAgICAgKiBiaXRzIG1hdGNoIHRoZSBzaWduLCBsb25nZXIgcG9zaXRpdmUgbnVtYmVycyBjb21wYXJlIGdyZWF0ZXIgYW5kIGxvbmdlciBuZWdhdGl2ZSBvbmVzIGNvbXBhcmUgc21hbGxlci4KKyAgICAgKgorICAgICAqIEV4YW1wbGVzOgorICAgICAqICAgICAgMCAgICAgICAgICAgICAgZW5jb2RlcyBhcyAgICAgICAgICAgODAKKyAgICAgKiAgICAgIDEgICAgICAgICAgICAgIGVuY29kZXMgYXMgICAgICAgICAgIDgxCisgICAgICogICAgIC0xICAgICAgICAgICAgICBlbmNvZGVzIGFzICAgICAgICAgICA3RgorICAgICAqICAgICA2MyAgICAgICAgICAgICAgZW5jb2RlcyBhcyAgICAgICAgICAgQkYKKyAgICAgKiAgICAgNjQgICAgICAgICAgICAgIGVuY29kZXMgYXMgICAgICAgICAgIEMwNDAKKyAgICAgKiAgICAtNjQgICAgICAgICAgICAgIGVuY29kZXMgYXMgICAgICAgICAgIDQwCisgICAgICogICAgLTY1ICAgICAgICAgICAgICBlbmNvZGVzIGFzICAgICAgICAgICAzRkJGCisgICAgICogICAyXjIwLTEgICAgICAgICAgICBlbmNvZGVzIGFzICAgICAgICAgICBFRkZGRkYKKyAgICAgKiAgIDJeMjAgICAgICAgICAgICAgIGVuY29kZXMgYXMgICAgICAgICAgIEYwMTAwMDAwCisgICAgICogIC0yXjIwICAgICAgICAgICAgICBlbmNvZGVzIGFzICAgICAgICAgICAxMDAwMDAKKyAgICAgKiAgIDJeNjQtMSAgICAgICAgICAgIGVuY29kZXMgYXMgICAgICAgICAgIEZGRkZGRkZGRkZGRkZGRkZGRgorICAgICAqICAtMl42NCAgICAgICAgICAgICAgZW5jb2RlcyBhcyAgICAgICAgICAgMDAwMDAwMDAwMDAwMDAwMDAwCisgICAgICoKKyAgICAgKiBBcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGlzIHNwZWNpZmllZCBpbiBiaXRzIDItOSwgbm8gdmFsdWUgaXMgYSBwcmVmaXggb2YgYW5vdGhlci4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgVmFyaWFibGVMZW5ndGhJbnRlZ2VyIGltcGxlbWVudHMgQnl0ZVNvdXJjZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHZhbHVlOworICAgICAgICBwcml2YXRlIGludCBwb3M7CisKKyAgICAgICAgcHVibGljIFZhcmlhYmxlTGVuZ3RoSW50ZWdlcihsb25nIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIG5lZ2F0aXZlTWFzayA9IHZhbHVlID4+IDYzOyAgICAvLyAtMSBmb3IgbmVnYXRpdmUsIDAgZm9yIHBvc2l0aXZlCisgICAgICAgICAgICB2YWx1ZSBePSBuZWdhdGl2ZU1hc2s7CisKKyAgICAgICAgICAgIGludCBiaXRzID0gNjQgLSBMb25nLm51bWJlck9mTGVhZGluZ1plcm9zKHZhbHVlIHwgMSk7IC8vIDEgdG8gNjMgKGNhbid0IGJlIDY0IGJlY2F1c2Ugd2UgZmxpcCBuZWdhdGl2ZSBudW1iZXJzKQorICAgICAgICAgICAgaW50IGJ5dGVzID0gYml0cyAvIDcgKyAxOyAgIC8vIDAtNiBiaXRzIDEgYnl0ZSA3LTEzIDIgYnl0ZXMgZXRjIHRvIDU2LTYzIDkgYnl0ZXMKKyAgICAgICAgICAgIGlmIChieXRlcyA+PSA5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbHVlIHw9IDB4ODAwMDAwMDAwMDAwMDAwMEw7ICAgLy8gOHRoIGJpdCwgd2hpY2ggZG9lc24ndCBmaXQgdGhlIGZpcnN0IGJ5dGUKKyAgICAgICAgICAgICAgICBwb3MgPSBuZWdhdGl2ZU1hc2sgPCAwID8gMjU2IDogLTE7IC8vIG91dCBvZiAwLTY0IHJhbmdlIGludGVnZXIgc3VjaCB0aGF0ICYgMHhGRiBpcyAweDAwIGZvciBuZWdhdGl2ZSBhbmQgMHhGRiBmb3IgcG9zaXRpdmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIG1hc2sgPSAoLTB4MTAwID4+IGJ5dGVzKSAmIDB4RkY7IC8vIG9uZSBpbiBzaWduIGJpdCBhbmQgYXMgbWFueSBtb3JlIGFzIHRoZXJlIGFyZSBleHRyYSBieXRlcworICAgICAgICAgICAgICAgIHBvcyA9IGJ5dGVzICogODsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlIHwgKG1hc2sgPDwgKHBvcyAtIDgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFsdWUgXj0gbmVnYXRpdmVNYXNrOworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgbmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwb3MgPD0gMCB8fCBwb3MgPiA2NCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocG9zID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIDgtYnl0ZSB2YWx1ZSwgcmV0dXJuaW5nIGZpcnN0IGJ5dGUKKyAgICAgICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IHBvcyAmIDB4RkY7IC8vIDB4MDAgZm9yIG5lZ2F0aXZlIG51bWJlcnMsIDB4RkYgZm9yIHBvc2l0aXZlCisgICAgICAgICAgICAgICAgICAgIHBvcyA9IDY0OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvcyAtPSA4OworICAgICAgICAgICAgcmV0dXJuIChpbnQpICh2YWx1ZSA+Pj4gcG9zKSAmIDB4RkY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTnVtYmVyIGltcGxlbWVudHMgQnl0ZVNvdXJjZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHZhbHVlOworICAgICAgICBwcml2YXRlIGludCBwb3M7CisKKyAgICAgICAgcHVibGljIE51bWJlcihsb25nIHZhbHVlLCBpbnQgbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICB0aGlzLnBvcyA9IGxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IG5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEVORF9PRl9TVFJFQU07CisgICAgICAgICAgICByZXR1cm4gKGludCkgKCh2YWx1ZSA+PiAoLS1wb3MgKiA4KSkgJiAweEZGKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpeGVkIGxlbmd0aCBzaWduZWQgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGVuY29kaW5nLiBGaXJzdCBiaXQgaXMgc2lnbi4gSWYgcG9zaXRpdmUsIGFkZCBzaWduIGJpdCB2YWx1ZSB0byBtYWtlCisgICAgICogZ3JlYXRlciB0aGFuIGFsbCBuZWdhdGl2ZXMuIElmIG5vdCwgaW52ZXJ0IGFsbCBjb250ZW50IHRvIG1ha2UgbmVnYXRpdmVzIHdpdGggYmlnZ2VyIG1hZ25pdHVkZSBzbWFsbGVyLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBTaWduZWRGaXhlZExlbmd0aEZsb2F0PFY+IGltcGxlbWVudHMgQnl0ZVNvdXJjZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yOworICAgICAgICBwcml2YXRlIGZpbmFsIFYgZGF0YTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgYnVmcG9zOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaW52ZXJ0OworCisgICAgICAgIHB1YmxpYyBTaWduZWRGaXhlZExlbmd0aEZsb2F0KFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5hY2Nlc3NvciA9IGFjY2Vzc29yOworICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKKyAgICAgICAgICAgIHRoaXMuYnVmcG9zID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IG5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnVmcG9zID49IGFjY2Vzc29yLnNpemUoZGF0YSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVORF9PRl9TVFJFQU07CisgICAgICAgICAgICBpbnQgdiA9IGFjY2Vzc29yLmdldEJ5dGUoZGF0YSwgYnVmcG9zKSAmIDB4RkY7CisgICAgICAgICAgICBpZiAoYnVmcG9zID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW52ZXJ0ID0gdiA+PSAweDgwOworICAgICAgICAgICAgICAgIHYgfD0gMHg4MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbnZlcnQpCisgICAgICAgICAgICAgICAgdiA9IHYgXiAweEZGOworICAgICAgICAgICAgKytidWZwb3M7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbWJpbmF0aW9uIG9mIG11bHRpcGxlIGJ5dGUgc291cmNlcy4gQWRkcyB7QGxpbmsgTkVYVF9DT01QT05FTlR9IGJlZm9yZSBzb3VyY2VzLCBvciB7QGxpbmsgTkVYVF9DT01QT05FTlRfTlVMTH0gaWYgbmV4dCBpcyBudWxsLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBNdWx0aSBpbXBsZW1lbnRzIEJ5dGVTb3VyY2UKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnl0ZVNvdXJjZVtdIHNyY3M7CisgICAgICAgIHByaXZhdGUgaW50IHNyY251bSA9IC0xOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBzZXF1ZW5jZVRlcm1pbmF0b3I7CisKKyAgICAgICAgTXVsdGkoQnl0ZVNvdXJjZVtdIHNyY3MsIGludCBzZXF1ZW5jZVRlcm1pbmF0b3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuc3JjcyA9IHNyY3M7CisgICAgICAgICAgICB0aGlzLnNlcXVlbmNlVGVybWluYXRvciA9IHNlcXVlbmNlVGVybWluYXRvcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IG5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3JjbnVtID09IHNyY3MubGVuZ3RoKQorICAgICAgICAgICAgICAgIHJldHVybiBFTkRfT0ZfU1RSRUFNOworCisgICAgICAgICAgICBpbnQgYiA9IEVORF9PRl9TVFJFQU07CisgICAgICAgICAgICBpZiAoc3JjbnVtID49IDAgJiYgc3Jjc1tzcmNudW1dICE9IG51bGwpCisgICAgICAgICAgICAgICAgYiA9IHNyY3Nbc3JjbnVtXS5uZXh0KCk7CisgICAgICAgICAgICBpZiAoYiA+IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgcmV0dXJuIGI7CisKKyAgICAgICAgICAgICsrc3JjbnVtOworICAgICAgICAgICAgaWYgKHNyY251bSA9PSBzcmNzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VxdWVuY2VUZXJtaW5hdG9yOworICAgICAgICAgICAgaWYgKHNyY3Nbc3JjbnVtXSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBORVhUX0NPTVBPTkVOVF9OVUxMOworICAgICAgICAgICAgcmV0dXJuIE5FWFRfQ09NUE9ORU5UOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IHRoZSBzaG9ydGVzdCBjb21tb24gcHJlZml4IG9mIHByZXZNYXggYW5kIGN1cnJNaW4gdGhhdCBzZXBhcmF0ZXMgdGhvc2UgdHdvIGJ5dGUgc3RyZWFtcy4KKyAgICAgKiBJZiB7QGNvZGUgdXNlQ3VyciA9PSB0cnVlfSB0aGUgbGFzdCBieXRlIG9mIHRoZSByZXR1cm5lZCBzdHJlYW0gY29tZXMgZnJvbSB7QGNvZGUgY3Vyck1pbn0gYW5kIGlzIHRoZSBmaXJzdAorICAgICAqIGJ5dGUgd2hpY2ggaXMgZ3JlYXRlciB0aGFuIGJ5dGUgb24gdGhlIGNvcnJlc3BvbmRpbmcgcG9zaXRpb24gb2Yge0Bjb2RlIHByZXZNYXh9LgorICAgICAqIE90aGVyd2lzZSwgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgcmV0dXJuZWQgc3RyZWFtIGNvbWVzIGZyb20ge0Bjb2RlIHByZXZNYXh9IGFuZCBpcyBpbmNyZW1lbnRlZCBieSBvbmUsIHN0aWxsCisgICAgICogZ3VhcmFudGVlaW5nIHRoYXQgaXQgaXMgPD0gdGhhbiB0aGUgYnl0ZSBvbiB0aGUgY29ycmVzcG9uZGluZyBwb3NpdGlvbiBvZiB7QGNvZGUgY3Vyck1pbn0uCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIFNlcGFyYXRvciBpbXBsZW1lbnRzIEJ5dGVTb3VyY2UKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnl0ZVNvdXJjZSBwcmV2OworICAgICAgICBwcml2YXRlIGZpbmFsIEJ5dGVTb3VyY2UgY3VycjsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGRvbmUgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHVzZUN1cnI7CisKKyAgICAgICAgU2VwYXJhdG9yKEJ5dGVTb3VyY2UgcHJldk1heCwgQnl0ZVNvdXJjZSBjdXJyTWluLCBib29sZWFuIHVzZUN1cnIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucHJldiA9IHByZXZNYXg7CisgICAgICAgICAgICB0aGlzLmN1cnIgPSBjdXJyTWluOworICAgICAgICAgICAgdGhpcy51c2VDdXJyID0gdXNlQ3VycjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IG5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZG9uZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIGludCBwID0gcHJldi5uZXh0KCk7CisgICAgICAgICAgICBpbnQgYyA9IGN1cnIubmV4dCgpOworICAgICAgICAgICAgYXNzZXJ0IHAgPD0gYyA6IHByZXYgKyAiIG5vdCBsZXNzIHRoYW4gIiArIGN1cnI7CisgICAgICAgICAgICBpZiAocCA9PSBjKQorICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gdXNlQ3VyciA/IGMgOiBwICsgMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyA8Vj4gQnl0ZVNvdXJjZSBvcHRpb25hbEZpeGVkTGVuZ3RoKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSkKKyAgICB7CisgICAgICAgIHJldHVybiAhYWNjZXNzb3IuaXNFbXB0eShkYXRhKSA/IGZpeGVkTGVuZ3RoKGFjY2Vzc29yLCBkYXRhKSA6IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBieXRlIHNvdXJjZSBvZiB0aGUgZ2l2ZW4gYnl0ZXMgd2l0aG91dCBhbnkgZW5jb2RpbmcuCisgICAgICogVGhlIHJlc3VsdGluZyBzb3VyY2UgaXMgb25seSBndWFyYW50ZWVkIHRvIGdpdmUgY29ycmVjdCBjb21wYXJpc29uIHJlc3VsdHMgYW5kIGJlIHByZWZpeC1mcmVlIGlmIHRoZQorICAgICAqIHVuZGVybHlpbmcgdHlwZSBoYXMgYSBmaXhlZCBsZW5ndGguCisgICAgICogSW4gdGVzdHMsIHRoaXMgbWV0aG9kIGlzIGFsc28gdXNlZCB0byBnZW5lcmF0ZSBub24tZXNjYXBlZCB0ZXN0IGNhc2VzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFY+IEJ5dGVTb3VyY2UgZml4ZWRMZW5ndGgoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCeXRlU291cmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHBvcyA9IC0xOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbmV4dCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICsrcG9zIDwgYWNjZXNzb3Iuc2l6ZShkYXRhKSA/IGFjY2Vzc29yLmdldEJ5dGUoZGF0YSwgcG9zKSAmIDB4RkYgOiBFTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgYnl0ZSBzb3VyY2Ugb2YgdGhlIGdpdmVuIGJ5dGVzIHdpdGhvdXQgYW55IGVuY29kaW5nLgorICAgICAqIFRoZSByZXN1bHRpbmcgc291cmNlIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBnaXZlIGNvcnJlY3QgY29tcGFyaXNvbiByZXN1bHRzIGFuZCBiZSBwcmVmaXgtZnJlZSBpZiB0aGUKKyAgICAgKiB1bmRlcmx5aW5nIHR5cGUgaGFzIGEgZml4ZWQgbGVuZ3RoLgorICAgICAqIEluIHRlc3RzLCB0aGlzIG1ldGhvZCBpcyBhbHNvIHVzZWQgdG8gZ2VuZXJhdGUgbm9uLWVzY2FwZWQgdGVzdCBjYXNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVTb3VyY2UgZml4ZWRMZW5ndGgoQnl0ZUJ1ZmZlciBiKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCeXRlU291cmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHBvcyA9IGIucG9zaXRpb24oKSAtIDE7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGludCBuZXh0KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKytwb3MgPCBiLmxpbWl0KCkgPyBiLmdldChwb3MpICYgMHhGRiA6IEVORF9PRl9TVFJFQU07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBieXRlIHNvdXJjZSBvZiB0aGUgZ2l2ZW4gYnl0ZXMgd2l0aG91dCBhbnkgZW5jb2RpbmcuCisgICAgICogSWYgdXNlZCBpbiBhIHNlcXVlbmNlLCB0aGUgcmVzdWx0aW5nIHNvdXJjZSBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gZ2l2ZSBjb3JyZWN0IGNvbXBhcmlzb24gcmVzdWx0cyBpZiB0aGUKKyAgICAgKiB1bmRlcmx5aW5nIHR5cGUgaGFzIGEgZml4ZWQgbGVuZ3RoLgorICAgICAqIEluIHRlc3RzLCB0aGlzIG1ldGhvZCBpcyBhbHNvIHVzZWQgdG8gZ2VuZXJhdGUgbm9uLWVzY2FwZWQgdGVzdCBjYXNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVTb3VyY2UgZml4ZWRMZW5ndGgoYnl0ZVtdIGIpCisgICAgeworICAgICAgICByZXR1cm4gZml4ZWRMZW5ndGgoYiwgMCwgYi5sZW5ndGgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZVNvdXJjZSBmaXhlZExlbmd0aChieXRlW10gYiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICB7CisgICAgICAgIGNoZWNrQXJndW1lbnQob2Zmc2V0ID49IDAgJiYgb2Zmc2V0IDw9IGIubGVuZ3RoKTsKKyAgICAgICAgY2hlY2tBcmd1bWVudChsZW5ndGggPj0gMCAmJiBvZmZzZXQgKyBsZW5ndGggPD0gYi5sZW5ndGgpOworCisgICAgICAgIHJldHVybiBuZXcgQnl0ZVNvdXJjZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBwb3MgPSBvZmZzZXQgLSAxOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbmV4dCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICsrcG9zIDwgb2Zmc2V0ICsgbGVuZ3RoID8gYltwb3NdICYgMHhGRiA6IEVORF9PRl9TVFJFQU07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFBlZWthYmxlIGltcGxlbWVudHMgQnl0ZVNvdXJjZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEJ5dGVTb3VyY2Ugd3JhcHBlZDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgcGVla2VkID0gTk9ORTsKKworICAgICAgICBwdWJsaWMgUGVla2FibGUoQnl0ZVNvdXJjZSB3cmFwcGVkKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgbmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwZWVrZWQgIT0gTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdmFsID0gcGVla2VkOworICAgICAgICAgICAgICAgIHBlZWtlZCA9IE5PTkU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5uZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHBlZWsoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGVla2VkID09IE5PTkUpCisgICAgICAgICAgICAgICAgcGVla2VkID0gd3JhcHBlZC5uZXh0KCk7CisgICAgICAgICAgICByZXR1cm4gcGVla2VkOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQZWVrYWJsZSBwZWVrYWJsZShCeXRlU291cmNlIHApCisgICAgeworICAgICAgICAvLyBXaGVuIGdpdmVuIGEgbnVsbCBzb3VyY2UsIHdlJ3JlIGJldHRlciBvZmYgbm90IHdyYXBwaW5nIGl0IGFuZCBqdXN0IHJldHVybmluZyBudWxsLiBUaGlzIHdheSBleGlzdGluZworICAgICAgICAvLyBjb2RlIHRoYXQgZG9lc24ndCBrbm93IGFib3V0IEJ5dGVTb3VyY2UuUGVla2FibGUsIGJ1dCBoYW5kbGVzIGNvcnJlY3RseSBudWxsIEJ5dGVTb3VyY2VzIHdvbid0IGJlIHRocm93bgorICAgICAgICAvLyBvZmYgYnkgYSBub24tbnVsbCBpbnN0YW5jZSB0aGF0IHNlbWFudGljYWxseSBzaG91bGQgaGF2ZSBiZWVuIG51bGwuCisgICAgICAgIGlmIChwID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIChwIGluc3RhbmNlb2YgUGVla2FibGUpCisgICAgICAgICAgICAgICA/IChQZWVrYWJsZSkgcAorICAgICAgICAgICAgICAgOiBuZXcgUGVla2FibGUocCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J5dGVjb21wYXJhYmxlL0J5dGVTb3VyY2VJbnZlcnNlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9ieXRlY29tcGFyYWJsZS9CeXRlU291cmNlSW52ZXJzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YjY2NzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9ieXRlY29tcGFyYWJsZS9CeXRlU291cmNlSW52ZXJzZS5qYXZhCkBAIC0wLDAgKzEsNDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZTsKKworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5WYWx1ZUFjY2Vzc29yOworCisvKioKKyAqIENvbnRhaW5zIGludmVyc2UgdHJhbnNmb3JtYXRpb24gdXRpbGl0aWVzIGZvciB7QGxpbmsgQnl0ZVNvdXJjZX1zLgorICoKKyAqIFNlZSBCeXRlQ29tcGFyYWJsZS5tZCBmb3IgZGV0YWlscyBhYm91dCB0aGUgZW5jb2Rpbmcgc2NoZW1lLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQnl0ZVNvdXJjZUludmVyc2UKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9CVUZGRVJfQ0FQQUNJVFkgPSAzMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQllURV9BTExfQklUUyA9IDB4RkY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJZVEVfTk9fQklUUyA9IDB4MDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJZVEVfU0lHTl9CSVQgPSAxIDw8IDc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNIT1JUX1NJR05fQklUID0gMSA8PCAxNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5UX1NJR05fQklUID0gMSA8PCAzMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIExPTkdfU0lHTl9CSVQgPSAxTCA8PCA2MzsKKworICAgIC8qKgorICAgICAqIENvbnN1bWUgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcyBhbmQgcHJvZHVjZSBhIGxvbmcgZnJvbSB0aGVtLCBlZmZlY3RpdmVseSB0cmVhdGluZyB0aGUgYnl0ZXMgYXMgYSBiaWctZW5kaWFuCisgICAgICogdW5zaWduZWQgZW5jb2Rpbmcgb2YgdGhlIG51bWJlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0VW5zaWduZWRGaXhlZExlbmd0aEFzTG9uZyhCeXRlU291cmNlIGJ5dGVTb3VyY2UsIGludCBsZW5ndGgpCisgICAgeworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChieXRlU291cmNlKTsKKyAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50KGxlbmd0aCA+PSAxICYmIGxlbmd0aCA8PSA4LCAiQmV0d2VlbiAxIGFuZCA4IGJ5dGVzIGNhbiBiZSByZWFkIGF0IGEgdGltZSIpOworCisgICAgICAgIGxvbmcgcmVzdWx0ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkKKyAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPDwgOCkgfCBnZXRBbmRDaGVja0J5dGUoYnl0ZVNvdXJjZSwgaSwgbGVuZ3RoKTsgIC8vIG5vdGU6IHRoaXMgbXVzdCB1c2UgdGhlIHVuc2lnbmVkIGJ5dGUgdmFsdWUKKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2UgdGhlIGJ5dGVzIGZvciBhbiBlbmNvZGVkIHNpZ25lZCBmaXhlZC1sZW5ndGggbnVtYmVyLgorICAgICAqIFRoZSBmaXJzdCBieXRlIGhhcyBpdHMgc2lnbiBiaXQgaW52ZXJ0ZWQsIGFuZCB0aGUgcmVzdCBhcmUgcGFzc2VkIHVuY2hhbmdlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxWPiBWIGdldFNpZ25lZEZpeGVkTGVuZ3RoKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UgYnl0ZVNvdXJjZSwgaW50IGxlbmd0aCkKKyAgICB7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKGJ5dGVTb3VyY2UpOworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQobGVuZ3RoID49IDEsICJBdCBsZWFzdCAxIGJ5dGUgc2hvdWxkIGJlIHJlYWQiKTsKKworICAgICAgICBWIHJlc3VsdCA9IGFjY2Vzc29yLmFsbG9jYXRlKGxlbmd0aCk7CisgICAgICAgIC8vIFRoZSBmaXJzdCBieXRlIG5lZWRzIHRvIGhhdmUgaXRzIHNpZ24gZmxpcHBlZAorICAgICAgICBhY2Nlc3Nvci5wdXRCeXRlKHJlc3VsdCwgMCwgKGJ5dGUpIChnZXRBbmRDaGVja0J5dGUoYnl0ZVNvdXJjZSwgMCwgbGVuZ3RoKSBeIEJZVEVfU0lHTl9CSVQpKTsKKyAgICAgICAgLy8gYW5kIHRoZSByZXN0IGNhbiBiZSByZXRyaWV2ZWQgdW5jaGFuZ2VkLgorICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGxlbmd0aDsgKytpKQorICAgICAgICAgICAgYWNjZXNzb3IucHV0Qnl0ZShyZXN1bHQsIGksIChieXRlKSBnZXRBbmRDaGVja0J5dGUoYnl0ZVNvdXJjZSwgaSwgbGVuZ3RoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvZHVjZSB0aGUgYnl0ZXMgZm9yIGFuIGVuY29kZWQgc2lnbmVkIGZpeGVkLWxlbmd0aCBudW1iZXIsIGFsc28gdHJhbnNsYXRpbmcgbnVsbCB0byBlbXB0eSBidWZmZXIuCisgICAgICogVGhlIGZpcnN0IGJ5dGUgaGFzIGl0cyBzaWduIGJpdCBpbnZlcnRlZCwgYW5kIHRoZSByZXN0IGFyZSBwYXNzZWQgdW5jaGFuZ2VkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFY+IFYgZ2V0T3B0aW9uYWxTaWduZWRGaXhlZExlbmd0aChWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBCeXRlU291cmNlIGJ5dGVTb3VyY2UsIGludCBsZW5ndGgpCisgICAgeworICAgICAgICByZXR1cm4gYnl0ZVNvdXJjZSA9PSBudWxsID8gYWNjZXNzb3IuZW1wdHkoKSA6IGdldFNpZ25lZEZpeGVkTGVuZ3RoKGFjY2Vzc29yLCBieXRlU291cmNlLCBsZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2UgdGhlIGJ5dGVzIGZvciBhbiBlbmNvZGVkIHNpZ25lZCBmaXhlZC1sZW5ndGggZmxvYXRpbmctcG9pbnQgbnVtYmVyLgorICAgICAqIElmIHNpZ24gYml0IGlzIG9uLCByZXR1cm5zIG5lZ2F0ZWQgYnl0ZXMuIElmIG5vdCwgY2xlYXJzIHRoZSBzaWduIGJpdCBhbmQgcGFzc2VzIHRoZSByZXN0IG9mIHRoZSBieXRlcyB1bmNoYW5nZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8Vj4gViBnZXRTaWduZWRGaXhlZExlbmd0aEZsb2F0KFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UgYnl0ZVNvdXJjZSwgaW50IGxlbmd0aCkKKyAgICB7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKGJ5dGVTb3VyY2UpOworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQobGVuZ3RoID49IDEsICJBdCBsZWFzdCAxIGJ5dGUgc2hvdWxkIGJlIHJlYWQiKTsKKworICAgICAgICBWIHJlc3VsdCA9IGFjY2Vzc29yLmFsbG9jYXRlKGxlbmd0aCk7CisKKyAgICAgICAgaW50IHhvcjsKKyAgICAgICAgaW50IGZpcnN0ID0gZ2V0QW5kQ2hlY2tCeXRlKGJ5dGVTb3VyY2UsIDAsIGxlbmd0aCk7CisgICAgICAgIGlmIChmaXJzdCA8IDB4ODApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5lZ2F0aXZlIG51bWJlci4gSW52ZXJ0IGFsbCBiaXRzLgorICAgICAgICAgICAgeG9yID0gQllURV9BTExfQklUUzsKKyAgICAgICAgICAgIGZpcnN0IF49IHhvcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFBvc2l0aXZlIG51bWJlci4gSW52ZXJ0IG9ubHkgdGhlIHNpZ24gYml0LgorICAgICAgICAgICAgeG9yID0gQllURV9OT19CSVRTOworICAgICAgICAgICAgZmlyc3QgXj0gQllURV9TSUdOX0JJVDsKKyAgICAgICAgfQorICAgICAgICBhY2Nlc3Nvci5wdXRCeXRlKHJlc3VsdCwgMCwgKGJ5dGUpIGZpcnN0KTsKKworICAgICAgICAvLyB4b3IgaXMgbm93IGFwcGxpZWQgdG8gdGhlIHJlc3Qgb2YgdGhlIGJ5dGVzIHRvIGZsaXAgdGhlaXIgYml0cyBpZiBuZWNlc3NhcnkuCisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuZ3RoOyArK2kpCisgICAgICAgICAgICBhY2Nlc3Nvci5wdXRCeXRlKHJlc3VsdCwgaSwgKGJ5dGUpIChnZXRBbmRDaGVja0J5dGUoYnl0ZVNvdXJjZSwgaSwgbGVuZ3RoKSBeIHhvcikpOworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvZHVjZSB0aGUgYnl0ZXMgZm9yIGFuIGVuY29kZWQgc2lnbmVkIGZpeGVkLWxlbmd0aCBmbG9hdGluZy1wb2ludCBudW1iZXIsIGFsc28gdHJhbnNsYXRpbmcgbnVsbCB0byBhbiBlbXB0eQorICAgICAqIGJ1ZmZlci4KKyAgICAgKiBJZiBzaWduIGJpdCBpcyBvbiwgcmV0dXJucyBuZWdhdGVkIGJ5dGVzLiBJZiBub3QsIGNsZWFycyB0aGUgc2lnbiBiaXQgYW5kIHBhc3NlcyB0aGUgcmVzdCBvZiB0aGUgYnl0ZXMgdW5jaGFuZ2VkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFY+IFYgZ2V0T3B0aW9uYWxTaWduZWRGaXhlZExlbmd0aEZsb2F0KFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UgYnl0ZVNvdXJjZSwgaW50IGxlbmd0aCkKKyAgICB7CisgICAgICAgIHJldHVybiBieXRlU291cmNlID09IG51bGwgPyBhY2Nlc3Nvci5lbXB0eSgpIDogZ2V0U2lnbmVkRml4ZWRMZW5ndGhGbG9hdChhY2Nlc3NvciwgYnl0ZVNvdXJjZSwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdW1lIHRoZSBuZXh0IGxlbmd0aCBieXRlcyBmcm9tIHRoZSBzb3VyY2UgdW5jaGFuZ2VkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFY+IFYgZ2V0Rml4ZWRMZW5ndGgoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgQnl0ZVNvdXJjZSBieXRlU291cmNlLCBpbnQgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwoYnl0ZVNvdXJjZSk7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudChsZW5ndGggPj0gMSwgIkF0IGxlYXN0IDEgYnl0ZSBzaG91bGQgYmUgcmVhZCIpOworCisgICAgICAgIFYgcmVzdWx0ID0gYWNjZXNzb3IuYWxsb2NhdGUobGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkKKyAgICAgICAgICAgIGFjY2Vzc29yLnB1dEJ5dGUocmVzdWx0LCBpLCAoYnl0ZSkgZ2V0QW5kQ2hlY2tCeXRlKGJ5dGVTb3VyY2UsIGksIGxlbmd0aCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN1bWUgdGhlIG5leHQgbGVuZ3RoIGJ5dGVzIGZyb20gdGhlIHNvdXJjZSB1bmNoYW5nZWQsIGFsc28gdHJhbnNsYXRpbmcgbnVsbCB0byBhbiBlbXB0eSBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8Vj4gViBnZXRPcHRpb25hbEZpeGVkTGVuZ3RoKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UgYnl0ZVNvdXJjZSwgaW50IGxlbmd0aCkKKyAgICB7CisgICAgICAgIHJldHVybiBieXRlU291cmNlID09IG51bGwgPyBhY2Nlc3Nvci5lbXB0eSgpIDogZ2V0Rml4ZWRMZW5ndGgoYWNjZXNzb3IsIGJ5dGVTb3VyY2UsIGxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3VtZSB0aGUgbmV4dCB7QGNvZGUgaW50fSBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBnaXZlbiB7QGxpbmsgQnl0ZVNvdXJjZX0uIFRoZSBzb3VyY2UgcG9zaXRpb24gaXMKKyAgICAgKiBtb2RpZmllZCBhY2NvcmRpbmdseSAobW92ZWQgNCBieXRlcyBmb3J3YXJkKS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgc291cmNlIGlzIG5vdCBzdHJpY3RseSByZXF1aXJlZCB0byByZXByZXNlbnQganVzdCB0aGUgZW5jb2Rpbmcgb2YgYW4ge0Bjb2RlIGludH0gdmFsdWUsIHNvIHRoZW9yZXRpY2FsbHkKKyAgICAgKiB0aGlzIEFQSSBjb3VsZCBiZSB1c2VkIGZvciByZWFkaW5nIGRhdGEgaW4gNC1ieXRlIHN0cmlkZXMuIE5ldmVydGhlbGVzcyBpdHMgdXNhZ2UgaXMgZmFpcmx5IGxpbWl0ZWQgYmVjYXVzZToKKyAgICAgKiA8b2w+CisgICAgICogICAgIDxsaT4uLi5pdCBwcmVzdXBwb3NlcyBzaWduZWQgZml4ZWQtbGVuZ3RoIGVuY29kaW5nIGZvciB0aGUgZW5jb2Rpbmcgb2YgdGhlIG9yaWdpbmFsIHZhbHVlPC9saT4KKyAgICAgKiAgICAgPGxpPi4uLml0IGRlY29kZXMgdGhlIGRhdGEgcmV0dXJuZWQgb24gZWFjaCBzdHJpZGUgYXMgYW4ge0Bjb2RlIGludH0gKGkuZS4gaXQgaW52ZXJ0cyBpdHMgbGVhZGluZyBiaXQpPC9saT4KKyAgICAgKiAgICAgPGxpPi4uLml0IGRvZXNuJ3QgcHJvdmlkZSBhbnkgbWVhbmluZ2Z1bCBndWFyYW50ZWVzICh3aXRoIHJlZ2FyZCB0byB0aHJvd2luZykgaW4gY2FzZSB0aGVyZSBhcmUgbm90IGVub3VnaAorICAgICAqICAgICBieXRlcyB0byByZWFkLCBpbiBjYXNlIGEgc3BlY2lhbCBlc2NhcGUgdmFsdWUgd2FzIG5vdCBpbnRlcnByZXRlZCBhcyBzdWNoLCBldGMuPC9saT4KKyAgICAgKiA8L29sPgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBieXRlU291cmNlIEEgbm9uLW51bGwgYnl0ZSBzb3VyY2UsIGNvbnRhaW5pbmcgYXQgbGVhc3QgNCBieXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRTaWduZWRJbnQoQnl0ZVNvdXJjZSBieXRlU291cmNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChpbnQpIGdldFVuc2lnbmVkRml4ZWRMZW5ndGhBc0xvbmcoYnl0ZVNvdXJjZSwgNCkgXiBJTlRfU0lHTl9CSVQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3VtZSB0aGUgbmV4dCB7QGNvZGUgbG9uZ30gZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgZ2l2ZW4ge0BsaW5rIEJ5dGVTb3VyY2V9LiBUaGUgc291cmNlIHBvc2l0aW9uIGlzCisgICAgICogbW9kaWZpZWQgYWNjb3JkaW5nbHkgKG1vdmVkIDggYnl0ZXMgZm9yd2FyZCkuCisgICAgICogPHA+CisgICAgICogVGhlIHNvdXJjZSBpcyBub3Qgc3RyaWN0bHkgcmVxdWlyZWQgdG8gcmVwcmVzZW50IGp1c3QgdGhlIGVuY29kaW5nIG9mIGEge0Bjb2RlIGxvbmd9IHZhbHVlLCBzbyB0aGVvcmV0aWNhbGx5CisgICAgICogdGhpcyBBUEkgY291bGQgYmUgdXNlZCBmb3IgcmVhZGluZyBkYXRhIGluIDgtYnl0ZSBzdHJpZGVzLiBOZXZlcnRoZWxlc3MgaXRzIHVzYWdlIGlzIGZhaXJseSBsaW1pdGVkIGJlY2F1c2U6CisgICAgICogPG9sPgorICAgICAqICAgICA8bGk+Li4uaXQgcHJlc3VwcG9zZXMgc2lnbmVkIGZpeGVkLWxlbmd0aCBlbmNvZGluZyBmb3IgdGhlIGVuY29kaW5nIG9mIHRoZSBvcmlnaW5hbCB2YWx1ZTwvbGk+CisgICAgICogICAgIDxsaT4uLi5pdCBkZWNvZGVzIHRoZSBkYXRhIHJldHVybmVkIG9uIGVhY2ggc3RyaWRlIGFzIGEge0Bjb2RlIGxvbmd9IChpLmUuIGl0IGludmVydHMgaXRzIGxlYWRpbmcgYml0KTwvbGk+CisgICAgICogICAgIDxsaT4uLi5pdCBkb2Vzbid0IHByb3ZpZGUgYW55IG1lYW5pbmdmdWwgZ3VhcmFudGVlcyAod2l0aCByZWdhcmQgdG8gdGhyb3dpbmcpIGluIGNhc2UgdGhlcmUgYXJlIG5vdCBlbm91Z2gKKyAgICAgKiAgICAgYnl0ZXMgdG8gcmVhZCwgaW4gY2FzZSBhIHNwZWNpYWwgZXNjYXBlIHZhbHVlIHdhcyBub3QgaW50ZXJwcmV0ZWQgYXMgc3VjaCwgZXRjLjwvbGk+CisgICAgICogPC9vbD4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gYnl0ZVNvdXJjZSBBIG5vbi1udWxsIGJ5dGUgc291cmNlLCBjb250YWluaW5nIGF0IGxlYXN0IDggYnl0ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBsb25nIGdldFNpZ25lZExvbmcoQnl0ZVNvdXJjZSBieXRlU291cmNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldFVuc2lnbmVkRml4ZWRMZW5ndGhBc0xvbmcoYnl0ZVNvdXJjZSwgOCkgXiBMT05HX1NJR05fQklUOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiB7QGxpbmsgQnl0ZVNvdXJjZX0gdG8gYSB7QGNvZGUgYnl0ZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnl0ZVNvdXJjZSBBIG5vbi1udWxsIGJ5dGUgc291cmNlLCBjb250YWluaW5nIGF0IGxlYXN0IDEgYnl0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJ5dGUgZ2V0U2lnbmVkQnl0ZShCeXRlU291cmNlIGJ5dGVTb3VyY2UpCisgICAgeworICAgICAgICByZXR1cm4gKGJ5dGUpIChnZXRBbmRDaGVja0J5dGUoUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwoYnl0ZVNvdXJjZSksIDAsIDEpIF4gQllURV9TSUdOX0JJVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhlIGdpdmVuIHtAbGluayBCeXRlU291cmNlfSB0byBhIHtAY29kZSBzaG9ydH0uIEFsbCB0ZXJtcyBhbmQgY29uZGl0aW9ucyB2YWxpZCBmb3IKKyAgICAgKiB7QGxpbmsgI2dldFNpZ25lZEludChCeXRlU291cmNlKX0gYW5kIHtAbGluayAjZ2V0U2lnbmVkTG9uZyhCeXRlU291cmNlKX0gdHJhbnNsYXRlIHRvIHRoaXMgYXMgd2VsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBieXRlU291cmNlIEEgbm9uLW51bGwgYnl0ZSBzb3VyY2UsIGNvbnRhaW5pbmcgYXQgbGVhc3QgMiBieXRlcy4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFNpZ25lZEludChCeXRlU291cmNlKQorICAgICAqIEBzZWUgI2dldFNpZ25lZExvbmcoQnl0ZVNvdXJjZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHNob3J0IGdldFNpZ25lZFNob3J0KEJ5dGVTb3VyY2UgYnl0ZVNvdXJjZSkKKyAgICB7CisgICAgICAgIHJldHVybiAoc2hvcnQpIChnZXRVbnNpZ25lZEZpeGVkTGVuZ3RoQXNMb25nKGJ5dGVTb3VyY2UsIDIpIF4gU0hPUlRfU0lHTl9CSVQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlY29kZSBhIHZhcmlhYmxlLWxlbmd0aCBzaWduZWQgaW50ZWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0VmFyaWFibGVMZW5ndGhJbnRlZ2VyKEJ5dGVTb3VyY2UgYnl0ZVNvdXJjZSkKKyAgICB7CisgICAgICAgIGludCBzaWduQW5kTWFzayA9IGdldEFuZENoZWNrQnl0ZShieXRlU291cmNlKTsKKworICAgICAgICBsb25nIHN1bSA9IDA7CisgICAgICAgIGludCBieXRlczsKKyAgICAgICAgLy8gRm9yIGV2ZXJ5IGJpdCBhZnRlciB0aGUgc2lnbiB0aGF0IG1hdGNoZXMgdGhlIHNpZ24sIHJlYWQgb25lIG1vcmUgYnl0ZS4KKyAgICAgICAgZm9yIChieXRlcyA9IDA7IGJ5dGVzIDwgNyAmJiBzYW1lQnl0ZVNpZ24oc2lnbkFuZE1hc2sgPDwgKGJ5dGVzICsgMSksIHNpZ25BbmRNYXNrKTsgKytieXRlcykKKyAgICAgICAgICAgIHN1bSA9IChzdW0gPDwgOCkgfCBnZXRBbmRDaGVja0J5dGUoYnl0ZVNvdXJjZSk7CisKKyAgICAgICAgLy8gVGhlIGVpZ2h0aCBsZW5ndGggYml0IGlzIHN0b3JlZCBpbiB0aGUgc2Vjb25kIGJ5dGUuCisgICAgICAgIGlmIChieXRlcyA9PSA3ICYmIHNhbWVCeXRlU2lnbigoaW50KSAoc3VtID4+IDQ4KSwgc2lnbkFuZE1hc2spKQorICAgICAgICAgICAgcmV0dXJuICgoc3VtIDw8IDgpIHwgZ2V0QW5kQ2hlY2tCeXRlKGJ5dGVTb3VyY2UpKSBeIExPTkdfU0lHTl9CSVQ7ICAgIC8vIDktYnl0ZSBlbmNvZGluZywgdXNlIGJ5dGVzIDItOSB3aXRoIGludmVydGVkIHNpZ24KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzdW0gfD0gKCgobG9uZykgc2lnbkFuZE1hc2spIDw8IGJ5dGVzICogOCk7ICAgICAvLyBhZGQgdGhlIHJlc3Qgb2YgdGhlIGJpdHMKKyAgICAgICAgICAgIGxvbmcgc2lnbk1hc2sgPSAtMHg0MEwgPDwgYnl0ZXMgKiA3OyAgICAgICAgICAgIC8vIG1hc2sgb2YgdGhlIGJpdHMgdGhhdCBzaG91bGQgYmUgcmVwbGFjZWQgYnkgdGhlIHNpZ24KKyAgICAgICAgICAgIGxvbmcgc2lnbiA9IChieXRlKSAoc2lnbkFuZE1hc2sgXiAweDgwKSA+PiA3OyAgIC8vIC0xIGlmIG5lZ2F0aXZlICgwIGxlYWRpbmcgYml0KSwgMCBvdGhlcndpc2UKKyAgICAgICAgICAgIHJldHVybiBzdW0gJiB+c2lnbk1hc2sgfCBzaWduICYgc2lnbk1hc2s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvZGUgYSB2YXJpYWJsZS1sZW5ndGggdW5zaWduZWQgaW50ZWdlciwgcGFzc2luZyBhbGwgYnl0ZXMgcmVhZCB0aHJvdWdoIFhPUiB3aXRoIHRoZSBnaXZlbiB4b3JXaXRoIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIFVzZWQgaW4gQmlnSW50ZWdlciBlbmNvZGluZyB0byByZWFkIG51bWJlciBsZW5ndGgsIHdoZXJlIG5lZ2F0aXZlIG51bWJlcnMgaGF2ZSB0aGVpciBsZW5ndGggbmVnYXRlZAorICAgICAqIChpLmUuIHhvcldpdGggPSAweEZGKSB0byBlbnN1cmUgY29ycmVjdCBvcmRlcmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0VmFyaWFibGVMZW5ndGhVbnNpZ25lZEludGVnZXJYb3JpbmcoQnl0ZVNvdXJjZSBieXRlU291cmNlLCBpbnQgeG9yV2l0aCkKKyAgICB7CisgICAgICAgIGludCBzaWduQW5kTWFzayA9IGdldEFuZENoZWNrQnl0ZShieXRlU291cmNlKSBeIHhvcldpdGg7CisKKyAgICAgICAgbG9uZyBzdW0gPSAwOworICAgICAgICBpbnQgYnl0ZXM7CisgICAgICAgIC8vIFJlYWQgYW4gZXh0cmEgYnl0ZSB3aGlsZSB0aGUgbmV4dCBtb3N0IHNpZ25pZmljYW50IGJpdCBpcyAxLgorICAgICAgICBmb3IgKGJ5dGVzID0gMDsgYnl0ZXMgPD0gNyAmJiAoKHNpZ25BbmRNYXNrIDw8IGJ5dGVzKSAmIDB4ODApICE9IDA7ICsrYnl0ZXMpCisgICAgICAgICAgICBzdW0gPSAoc3VtIDw8IDgpIHwgZ2V0QW5kQ2hlY2tCeXRlKGJ5dGVTb3VyY2UpIF4geG9yV2l0aDsKKworICAgICAgICAvLyBTdHJpcCB0aGUgbGVuZ3RoIGJpdHMgZnJvbSB0aGUgbGVhZGluZyBieXRlLgorICAgICAgICBzaWduQW5kTWFzayAmPSB+KC0yNTYgPj4gYnl0ZXMpOworICAgICAgICByZXR1cm4gc3VtIHwgKCgobG9uZykgc2lnbkFuZE1hc2spIDw8IGJ5dGVzICogOCk7ICAgICAvLyBBZGQgdGhlIHJlc3Qgb2YgdGhlIGJpdHMgb2YgdGhlIGxlYWRpbmcgYnl0ZS4KKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gcGFyYW1ldGVycyB0cmVhdGVkIGFzIGJ5dGVzIGhhdmUgdGhlIHNhbWUgc2lnbi4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNhbWVCeXRlU2lnbihpbnQgYSwgaW50IGIpCisgICAgeworICAgICAgICByZXR1cm4gKChhIF4gYikgJiAweDgwKSA9PSAwOworICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldEFuZENoZWNrQnl0ZShCeXRlU291cmNlIGJ5dGVTb3VyY2UpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0QW5kQ2hlY2tCeXRlKGJ5dGVTb3VyY2UsIC0xLCAtMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldEFuZENoZWNrQnl0ZShCeXRlU291cmNlIGJ5dGVTb3VyY2UsIGludCBwb3MsIGludCBsZW5ndGgpCisgICAgeworICAgICAgICBpbnQgZGF0YSA9IGJ5dGVTb3VyY2UubmV4dCgpOworICAgICAgICBpZiAoZGF0YSA9PSBCeXRlU291cmNlLkVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIGxlbmd0aCA+IDAgPyBTdHJpbmcuZm9ybWF0KCJVbmV4cGVjdGVkIGVuZCBvZiBzdHJlYW0gcmVhY2hlZCBhZnRlciAlZCBieXRlcyAoZXhwZWN0ZWQgPj0gJWQpIiwgcG9zLCBsZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJVbmV4cGVjdGVkIGVuZCBvZiBzdHJlYW0iKTsKKyAgICAgICAgYXNzZXJ0IGRhdGEgPj0gQllURV9OT19CSVRTICYmIGRhdGEgPD0gQllURV9BTExfQklUUworICAgICAgICAgICAgOiAiQSBCeXRlU291cmNlIG11c3QgcHJvZHVjZSB1bnNpZ25lZCBieXRlcyBhbmQgZW5kIGluIEVORF9PRl9TVFJFQU0iOworICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBhIHNpbmdsZSB2YXJpYWJsZS1sZW5ndGggYnl0ZSBzZXF1ZW5jZSAoYmxvYiwgc3RyaW5nLCAuLi4pIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBzY2hlbWUgZGVzY3JpYmVkCisgICAgICogaW4gQnl0ZUNvbXBhcmFibGUubWQsIGRlY29kaW5nIGl0IGJhY2sgdG8gaXRzIG9yaWdpbmFsLCB1bmVzY2FwZWQgZm9ybS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBieXRlU291cmNlIFRoZSBzb3VyY2Ugb2YgdGhlIHZhcmlhYmxlLWxlbmd0aCBieXRlcyBzZXF1ZW5jZS4KKyAgICAgKiBAcmV0dXJuIEEgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBvcmlnaW5hbCwgdW5lc2NhcGVkIGJ5dGVzIG9mIHRoZSBnaXZlbiBzb3VyY2UuIFVuZXNjYXBlZCBoZXJlIG1lYW5zCisgICAgICogbm90IGluY2x1ZGluZyBhbnkgb2YgdGhlIGVzY2FwZSBzZXF1ZW5jZXMgb2YgdGhlIGVuY29kaW5nIHNjaGVtZSB1c2VkIGZvciB2YXJpYWJsZS1sZW5ndGggYnl0ZSBzZXF1ZW5jZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gZ2V0VW5lc2NhcGVkQnl0ZXMoQnl0ZVNvdXJjZS5QZWVrYWJsZSBieXRlU291cmNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJ5dGVTb3VyY2UgPT0gbnVsbCA/IG51bGwgOiByZWFkQnl0ZXModW5lc2NhcGUoYnl0ZVNvdXJjZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzIGFib3ZlLCBidXQgY29udmVydHMgdGhlIHJlc3VsdCB0byBhIEJ5dGVTb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCeXRlU291cmNlIHVuZXNjYXBlKEJ5dGVTb3VyY2UuUGVla2FibGUgYnl0ZVNvdXJjZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQnl0ZVNvdXJjZSgpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZXNjYXBlZCA9IGZhbHNlOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbmV4dCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFlc2NhcGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRhdGEgPSBieXRlU291cmNlLm5leHQoKTsgLy8gd2UgY29uc3VtZSB0aGlzIGJ5dGUgbm8gbWF0dGVyIHdoYXQgaXQgaXMKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgPiBCeXRlU291cmNlLkVTQ0FQRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOyAgICAgICAgLy8gbW9zdCB1c2VkIHBhdGggbGVhZHMgaGVyZQorCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBkYXRhICE9IEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSA6ICJJbnZhbGlkIGVzY2FwZWQgYnl0ZSBzZXF1ZW5jZSI7CisgICAgICAgICAgICAgICAgICAgIGVzY2FwZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCBuZXh0ID0gYnl0ZVNvdXJjZS5wZWVrKCk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChuZXh0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFTkRfT0ZfU1RSRUFNOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGVuZCBvZiBhIGJ5dGUtY29tcGFyYWJsZSBvdXRzaWRlIG9mIGEgbXVsdGktY29tcG9uZW50IHNlcXVlbmNlLiBObyBtYXR0ZXIgd2hhdCB3ZSBoYXZlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWVuIG9yIHBlZWtlZCBiZWZvcmUsIHdlIHNob3VsZCBzdG9wIG5vdy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVTb3VyY2UubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRVNDQVBFRF8wX0RPTkU6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZW5kIG9mIDEgb3IgbW9yZSBjb25zZWN1dGl2ZSAweDAwIHZhbHVlIGJ5dGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVNvdXJjZS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVNDQVBFOworICAgICAgICAgICAgICAgICAgICBjYXNlIEVTQ0FQRURfMF9DT05UOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXNjYXBlZCBzZXF1ZW5jZSBjb250aW51ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVTb3VyY2UubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVTQ0FQRTsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuIEVTQ0FQRSBvciBFU0NBUEVEXzBfQ09OVCB3b24ndCBiZSBmb2xsb3dlZCBieSBlaXRoZXIgYW5vdGhlciBFU0NBUEVEXzBfQ09OVCwgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVTQ0FQRURfMF9ET05FLCBvciBhbiBFTkRfT0ZfU1RSRUFNIG9ubHkgd2hlbiB0aGUgYnl0ZS1jb21wYXJhYmxlIGlzIHBhcnQgb2YgYSBtdWx0aS1jb21wb25lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcXVlbmNlIGFuZCB3ZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZW5jb2RlZCBieXRlLWNvbXBhcmFibGUuIEluIHRoaXMgY2FzZSwgdGhlIGJ5dGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUganVzdCBwZWVrZWQgaXMgdGhlIHNlcGFyYXRvciBvciB0ZXJtaW5hdG9yIGJ5dGUgYmV0d2VlbiBvciBhdCB0aGUgZW5kIG9mIGNvbXBvbmVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICh3aGljaCBieSBjb250YWN0IG11c3QgYmUgMHgxMCAtIDB4RkUsIHdoaWNoIGNhbm5vdCBjb25mbGljdCB3aXRoIG91ciBzcGVjaWFsIGJ5dGVzKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBuZXh0ID49IEJ5dGVTb3VyY2UuTUlOX1NFUEFSQVRPUiAmJiBuZXh0IDw9IEJ5dGVTb3VyY2UuTUFYX1NFUEFSQVRPUiA6IG5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmxpa2UgYWJvdmUsIHdlIGRvbid0IGNvbnN1bWUgdGhpcyBieXRlICh0aGUgc2VxdWVuY2UgZGVjb2RpbmcgbmVlZHMgaXQpLgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBieXRlcyBvZiB0aGUgZ2l2ZW4gc291cmNlIGludG8gYSBieXRlIGFycmF5LiBEb2Vzbid0IGRvIGFueSB0cmFuc2Zvcm1hdGlvbiBvbiB0aGUgYnl0ZXMsIGp1c3QgcmVhZHMKKyAgICAgKiB0aGVtIHVudGlsIGl0IHJlYWRzIGFuIHtAbGluayBCeXRlU291cmNlI0VORF9PRl9TVFJFQU19IGJ5dGUsIGFmdGVyIHdoaWNoIGl0IHJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSByZWFkCisgICAgICogYnl0ZXMsIDxzdHJvbmc+ZXhjbHVkaW5nIHRoZSB7QGxpbmsgQnl0ZVNvdXJjZSNFTkRfT0ZfU1RSRUFNfTwvc3Ryb25nPi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBzaXplcyBhIHRlbnRhdGl2ZSBpbnRlcm5hbCBidWZmZXIgYXJyYXkgYXQge0Bjb2RlIGluaXRpYWxCdWZmZXJDYXBhY2l0eX0uICBIb3dldmVyLCBpZgorICAgICAqIHtAY29kZSBieXRlU291cmNlfSBleGNlZWRzIHRoaXMgc2l6ZSwgdGhlIGJ1ZmZlciBhcnJheSBpcyByZWNyZWF0ZWQgd2l0aCBkb3VibGVkIGNhcGFjaXR5IGFzIG1hbnkgdGltZXMgYXMKKyAgICAgKiBuZWNlc3NhcnkuICBJZiwgYWZ0ZXIge0Bjb2RlIGJ5dGVTb3VyY2V9IGlzIGZ1bGx5IGV4aGF1c3RlZCwgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gaXQgZG9lcyBub3QgZXhhY3RseQorICAgICAqIG1hdGNoIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIHRlbnRhdGl2ZSBidWZmZXIgYXJyYXksIHRoZW4gaXQgaXMgY29waWVkIGludG8gYW5vdGhlciBhcnJheSBzaXplZCB0byBmaXQgdGhlCisgICAgICogbnVtYmVyIG9mIGJ5dGVzIHJlYWQ7IG90aGVyd2lzZSwgaXQgaXMgcmV0dXJuZWQgd2l0aG91dCB0aGF0IGZpbmFsIGNvcHkgc3RlcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBieXRlU291cmNlIFRoZSBzb3VyY2Ugd2hpY2ggYnl0ZXMgd2UncmUgaW50ZXJlc3RlZCBpbi4KKyAgICAgKiBAcGFyYW0gaW5pdGlhbEJ1ZmZlckNhcGFjaXR5IFRoZSBpbml0aWFsIHNpemUgb2YgdGhlIGludGVybmFsIGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJuIEEgYnl0ZSBhcnJheSBjb250YWluaW5nIGV4YWN0bHkgYWxsIHRoZSByZWFkIGJ5dGVzLiBJbiBjYXNlIG9mIGEge0Bjb2RlIG51bGx9IHNvdXJjZSwgdGhlIHJldHVybmVkIGJ5dGUKKyAgICAgKiBhcnJheSB3aWxsIGJlIGVtcHR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHJlYWRCeXRlcyhCeXRlU291cmNlIGJ5dGVTb3VyY2UsIGZpbmFsIGludCBpbml0aWFsQnVmZmVyQ2FwYWNpdHkpCisgICAgeworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChieXRlU291cmNlKTsKKworICAgICAgICBpbnQgcmVhZEJ5dGVzID0gMDsKKyAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW2luaXRpYWxCdWZmZXJDYXBhY2l0eV07CisgICAgICAgIGludCBkYXRhOworICAgICAgICB3aGlsZSAoKGRhdGEgPSBieXRlU291cmNlLm5leHQoKSkgIT0gQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNKQorICAgICAgICB7CisgICAgICAgICAgICBidWYgPSBlbnN1cmVDYXBhY2l0eShidWYsIHJlYWRCeXRlcyk7CisgICAgICAgICAgICBidWZbcmVhZEJ5dGVzKytdID0gKGJ5dGUpIGRhdGE7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVhZEJ5dGVzICE9IGJ1Zi5sZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZiA9IEFycmF5cy5jb3B5T2YoYnVmLCByZWFkQnl0ZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIGJ5dGVzIG9mIHRoZSBnaXZlbiBzb3VyY2UgaW50byBhIGJ5dGUgYXJyYXkuIERvZXNuJ3QgZG8gYW55IHRyYW5zZm9ybWF0aW9uIG9uIHRoZSBieXRlcywganVzdCByZWFkcworICAgICAqIHRoZW0gdW50aWwgaXQgcmVhZHMgYW4ge0BsaW5rIEJ5dGVTb3VyY2UjRU5EX09GX1NUUkVBTX0gYnl0ZSwgYWZ0ZXIgd2hpY2ggaXQgcmV0dXJucyBhbiBhcnJheSBvZiBhbGwgdGhlIHJlYWQKKyAgICAgKiBieXRlcywgPHN0cm9uZz5leGNsdWRpbmcgdGhlIHtAbGluayBCeXRlU291cmNlI0VORF9PRl9TVFJFQU19PC9zdHJvbmc+LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byB7QGxpbmsgI3JlYWRCeXRlcyhCeXRlU291cmNlLCBpbnQpfSB3aGVyZSB0aGUgc2Vjb25kIGFjdHVhbCBwYXJhbWV0ZXIgaXMKKyAgICAgKiB7QGxpbmtwbGFpbiAjSU5JVElBTF9CVUZGRVJfQ0FQQUNJVFl9ICh7QHZhbHVlIElOSVRJQUxfQlVGRkVSX0NBUEFDSVRZfSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnl0ZVNvdXJjZSBUaGUgc291cmNlIHdoaWNoIGJ5dGVzIHdlJ3JlIGludGVyZXN0ZWQgaW4uCisgICAgICogQHJldHVybiBBIGJ5dGUgYXJyYXkgY29udGFpbmluZyBleGFjdGx5IGFsbCB0aGUgcmVhZCBieXRlcy4gSW4gY2FzZSBvZiBhIHtAY29kZSBudWxsfSBzb3VyY2UsIHRoZSByZXR1cm5lZCBieXRlCisgICAgICogYXJyYXkgd2lsbCBiZSBlbXB0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSByZWFkQnl0ZXMoQnl0ZVNvdXJjZSBieXRlU291cmNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlYWRCeXRlcyhieXRlU291cmNlLCBJTklUSUFMX0JVRkZFUl9DQVBBQ0lUWSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyB0aGUgZ2l2ZW4gYnVmZmVyIGhhcyBjYXBhY2l0eSBmb3IgdGFraW5nIGRhdGEgd2l0aCB0aGUgZ2l2ZW4gbGVuZ3RoIC0gaWYgaXQgZG9lc24ndCwgaXQgcmV0dXJucyBhIGNvcHkKKyAgICAgKiBvZiB0aGUgYnVmZmVyLCBidXQgd2l0aCBkb3VibGUgdGhlIGNhcGFjaXR5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBlbnN1cmVDYXBhY2l0eShieXRlW10gYnVmLCBpbnQgZGF0YUxlbmd0aEluQnl0ZXMpCisgICAgeworICAgICAgICBpZiAoZGF0YUxlbmd0aEluQnl0ZXMgPT0gYnVmLmxlbmd0aCkKKyAgICAgICAgICAgIC8vIFdlIHdvbid0IGdhaW4gbXVjaCB3aXRoIGd1YXJkaW5nIGFnYWluc3Qgb3ZlcmZsb3cuIFdlJ2xsIG92ZXJmbG93IHdoZW4gZGF0YUxlbmd0aEluQnl0ZXMgPj0gMSA8PCAzMCwKKyAgICAgICAgICAgIC8vIGFuZCBpZiB3ZSBkbyBndWFyZCwgd2UnbGwgYmUgYWJsZSB0byBleHRlbmQgdGhlIGNhcGFjaXR5IHRvIEludGVnZXIuTUFYX1ZBTFVFICh3aGljaCBpcyAxIDw8IDMxIC0gMSkuCisgICAgICAgICAgICAvLyBDb250cm9sbGluZyB0aGUgZXhjZXB0aW9uIHRoYXQgd2lsbCBiZSB0aHJvd24gc2hvdWxkbid0IG1hdHRlciB0aGF0IG11Y2gsIGFuZCAgaW4gcHJhY3RpY2UsIHdlIGFsbW9zdAorICAgICAgICAgICAgLy8gc3VyZWx5IHdvbid0IGJlIHJlYWRpbmcgZ2lnYWJ5dGVzIG9mIEJ5dGVTb3VyY2UgZGF0YSBhdCBvbmNlLgorICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5jb3B5T2YoYnVmLCBkYXRhTGVuZ3RoSW5CeXRlcyAqIDIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiB7QGxpbmsgQnl0ZVNvdXJjZX0gdG8gYSBVVEYtOCB7QGxpbmsgU3RyaW5nfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBieXRlU291cmNlIFRoZSBzb3VyY2Ugd2UncmUgaW50ZXJlc3RlZCBpbi4KKyAgICAgKiBAcmV0dXJuIEEgVVRGLTggc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoQnl0ZVNvdXJjZS5QZWVrYWJsZSBieXRlU291cmNlKQorICAgIHsKKyAgICAgICAgaWYgKGJ5dGVTb3VyY2UgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIGJ5dGVbXSBkYXRhID0gZ2V0VW5lc2NhcGVkQnl0ZXMoYnl0ZVNvdXJjZSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoZGF0YSwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBNdWx0aS1jb21wb25lbnQgc2VxdWVuY2UgdXRpbGl0aWVzLgorICAgICAqLworCisgICAgLyoqCisgICAgICogQSB1dGlsaXR5IGZvciBjb25zdW1pbmcgY29tcG9uZW50cyBmcm9tIGEgcGVla2FibGUgbXVsdGktY29tcG9uZW50IHNlcXVlbmNlLgorICAgICAqIEl0IHVzZXMgdGhlIGNvbXBvbmVudCBzZXBhcmF0b3JzLCBzbyB0aGUgZ2l2ZW4gc2VxdWVuY2UgbmVlZHMgdG8gaGF2ZSBpdHMgbGFzdCBjb21wb25lbnQgZnVsbHkgY29uc3VtZWQsIGluCisgICAgICogb3JkZXIgZm9yIHRoZSBuZXh0IGNvbnN1bWFibGUgYnl0ZSB0byBiZSBhIHNlcGFyYXRvci4gSWRlbnRpZnlpbmcgdGhlIGVuZCBvZiB0aGUgY29tcG9uZW50IHRoYXQgd2lsbCB0aGVuIGJlCisgICAgICogY29uc3VtZWQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjb25zdW1lciAodGhlIHVzZXIgb2YgdGhpcyBtZXRob2QpLgorICAgICAqIEBwYXJhbSBzb3VyY2UgQSBwZWVrYWJsZSBtdWx0aS1jb21wb25lbnQgc2VxdWVuY2UsIHdoaWNoIG5leHQgYnl0ZSBpcyBhIGNvbXBvbmVudCBzZXBhcmF0b3IuCisgICAgICogQHJldHVybiB0aGUgZ2l2ZW4gbXVsdGktY29tcG9uZW50IHNlcXVlbmNlIGlmIGl0cyBuZXh0IGNvbXBvbmVudCBpcyBub3QgbnVsbCwgb3Ige0Bjb2RlIG51bGx9IGlmIGl0IGlzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZVNvdXJjZS5QZWVrYWJsZSBuZXh0Q29tcG9uZW50U291cmNlKEJ5dGVTb3VyY2UuUGVla2FibGUgc291cmNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5leHRDb21wb25lbnRTb3VyY2Uoc291cmNlLCBzb3VyY2UubmV4dCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHV0aWxpdHkgZm9yIGNvbnN1bWluZyBjb21wb25lbnRzIGZyb20gYSBwZWVrYWJsZSBtdWx0aS1jb21wb25lbnQgc2VxdWVuY2UsIHZlcnkgc2ltaWxhciB0bworICAgICAqIHtAbGluayAjbmV4dENvbXBvbmVudFNvdXJjZShCeXRlU291cmNlLlBlZWthYmxlKX0gLSB0aGUgZGlmZmVyZW5jZSBiZWluZyB0aGF0IGhlcmUgdGhlIHNlcGFyYXRvciBjYW4gYmUgcGFzc2VkCisgICAgICogaW4gY2FzZSBpdCBoYWQgdG8gYmUgY29uc3VtZWQgYmVmb3JlaGFuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVTb3VyY2UuUGVla2FibGUgbmV4dENvbXBvbmVudFNvdXJjZShCeXRlU291cmNlLlBlZWthYmxlIHNvdXJjZSwgaW50IHNlcGFyYXRvcikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXh0Q29tcG9uZW50TnVsbChzZXBhcmF0b3IpCisgICAgICAgICAgICAgICA/IG51bGwKKyAgICAgICAgICAgICAgIDogc291cmNlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBuZXh0Q29tcG9uZW50TnVsbChpbnQgc2VwYXJhdG9yKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNlcGFyYXRvciA9PSBCeXRlU291cmNlLk5FWFRfQ09NUE9ORU5UX05VTEwgfHwgc2VwYXJhdG9yID09IEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlRfRU1QVFkKKyAgICAgICAgICAgICAgIHx8IHNlcGFyYXRvciA9PSBCeXRlU291cmNlLk5FWFRfQ09NUE9ORU5UX0VNUFRZX1JFVkVSU0VEOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2NvbmN1cnJlbnQvQWJzdHJhY3RGdXR1cmUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2NvbmN1cnJlbnQvQWJzdHJhY3RGdXR1cmUuamF2YQppbmRleCA4M2NkN2QzLi4wMDIwZTFhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9jb25jdXJyZW50L0Fic3RyYWN0RnV0dXJlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvY29uY3VycmVudC9BYnN0cmFjdEZ1dHVyZS5qYXZhCkBAIC00OTQsMTEgKzQ5NCwxMSBAQAogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQogICAgIHsKICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24oKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlID0gc3RhdGUoKTsKKyAgICAgICAgU3RyaW5nIHN0YXRlID0gc3RhdGVJbmZvKCk7CiAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbiA9PSBudWxsID8gc3RhdGUgOiAoc3RhdGUgKyAnICcgKyBkZXNjcmlwdGlvbik7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGUoKQorICAgIHByaXZhdGUgU3RyaW5nIHN0YXRlSW5mbygpCiAgICAgewogICAgICAgICBPYmplY3QgcmVzdWx0ID0gdGhpcy5yZXN1bHQ7CiAgICAgICAgIGlmIChpc1N1Y2Nlc3MocmVzdWx0KSkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2NvbmN1cnJlbnQvTGlnaHR3ZWlnaHRSZWN5Y2xlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvY29uY3VycmVudC9MaWdodHdlaWdodFJlY3ljbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNmMGQ0NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2NvbmN1cnJlbnQvTGlnaHR3ZWlnaHRSZWN5Y2xlci5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheURlcXVlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworCitpbnRlcmZhY2UgTGlnaHR3ZWlnaHRSZWN5Y2xlclBvb2xIb2xkZXI8VD4KK3sKKyAgICBBcnJheURlcXVlPFQ+IGdldCgpOworfQorCisvKioKKyAqIEEgc2ltcGxlIHRocmVhZCBsb2NhbCBvYmplY3QgcmV1c2UgZmFjaWxpdHkgd2l0aCBsaW1pdGVkIGNhcGFjaXR5IGFuZCBubyBhdHRlbXB0IGF0IHJlYmFsYW5jaW5nIHBvb2xpbmcgYmV0d2VlbgorICogdGhyZWFkcy4gVGhpcyBpcyBtZWFudCB0byBiZSBwdXQgaW4gcGxhY2Ugd2hlcmUgY2h1cm4gaXMgaGlnaCwgYnV0IHNpbmdsZSBvYmplY3QgYWxsb2NhdGlvbiBhbmQgZm9vdHByaW50IGFyZSBub3QKKyAqIHNvIGhpZ2ggdG8ganVzdGlmeSBhIG1vcmUgc29waGlzdGljYXRlZCBhcHByb2FjaC4KKyAqCisgKiBAcGFyYW0gPFQ+CisgKiBAc2VlIFRocmVhZExvY2FscyNjcmVhdGVMaWdodHdlaWdodFJlY3ljbGVyKGludCkKKyAqLworcHVibGljIGludGVyZmFjZSBMaWdodHdlaWdodFJlY3ljbGVyPFQ+IGV4dGVuZHMgTGlnaHR3ZWlnaHRSZWN5Y2xlclBvb2xIb2xkZXI8VD4KK3sKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGEgcmV1c2FibGUgaW5zdGFuY2UsIG9yIG51bGwgaWYgbm9uZSBpcyBhdmFpbGFibGUKKyAgICAgKi8KKyAgICBkZWZhdWx0IFQgcmV1c2UoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldCgpLnBvbGxGaXJzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSByZXVzYWJsZSBpbnN0YW5jZSwgb3IgYWxsb2NhdGUgb25lIHZpYSB0aGUgcHJvdmlkZWQgc3VwcGxpZXIKKyAgICAgKi8KKyAgICBkZWZhdWx0IFQgcmV1c2VPckFsbG9jYXRlKFN1cHBsaWVyPFQ+IHN1cHBsaWVyKQorICAgIHsKKyAgICAgICAgZmluYWwgVCByZXVzZSA9IHJldXNlKCk7CisgICAgICAgIHJldHVybiByZXVzZSAhPSBudWxsID8gcmV1c2UgOiBzdXBwbGllci5nZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdCB0byBiZSByZWN5Y2xlZCwgaWYgdCBpcyBhIGNvbGxlY3Rpb24gaXQgd2lsbCBiZSBjbGVhcmVkIGJlZm9yZSByZWN5Y2xpbmcsIGJ1dCBub3QgY2xlYXJlZCBpZiBub3QKKyAgICAgKiAgICAgICAgICByZWN5Y2xlZAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0IHdhcyByZWN5Y2xlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgZGVmYXVsdCBib29sZWFuIHRyeVJlY3ljbGUoVCB0KQorICAgIHsKKyAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbCh0KTsKKworICAgICAgICBmaW5hbCBBcnJheURlcXVlPFQ+IHBvb2wgPSBnZXQoKTsKKyAgICAgICAgaWYgKHBvb2wuc2l6ZSgpIDwgY2FwYWNpdHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKQorICAgICAgICAgICAgICAgICgoQ29sbGVjdGlvbjw/PikgdCkuY2xlYXIoKTsKKyAgICAgICAgICAgIHBvb2wub2ZmZXJGaXJzdCh0KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBjdXJyZW50IGNvdW50IG9mIGF2YWlsYWJsZSBpbnN0YW5jZXMgZm9yIHJldXNlCisgICAgICovCisgICAgZGVmYXVsdCBpbnQgYXZhaWxhYmxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXQoKS5zaXplKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIG1heGltdW0gY2FwYWNpdHkgb2YgdGhlIHJlY3ljbGVyCisgICAgICovCisgICAgaW50IGNhcGFjaXR5KCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvY29uY3VycmVudC9SZWYuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2NvbmN1cnJlbnQvUmVmLmphdmEKaW5kZXggOTA2NTBjZi4uMWUyN2RjNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvY29uY3VycmVudC9SZWYuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9jb25jdXJyZW50L1JlZi5qYXZhCkBAIC01NSw2ICs1NSw3IEBACiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvckZhY3RvcnkuR2xvYmFsLmV4ZWN1dG9yRmFjdG9yeTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5JbmZpbml0ZUxvb3BFeGVjdXRvci5TaW11bGF0b3JTYWZlLlVOU0FGRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0RFQlVHX1JFRl9DT1VOVDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2hhcmVkLlNjb3BlLlNJTVVMQVRJT047CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRocm93YWJsZXMubWF5YmVGYWlsOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzLm1lcmdlOwpAQCAtOTMsNyArOTQsNyBAQAogcHVibGljIGZpbmFsIGNsYXNzIFJlZjxUPiBpbXBsZW1lbnRzIFJlZkNvdW50ZWQ8VD4KIHsKICAgICBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFJlZi5jbGFzcyk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0VOQUJMRUQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5kZWJ1Z3JlZmNvdW50IiwgImZhbHNlIikuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19FTkFCTEVEID0gVEVTVF9ERUJVR19SRUZfQ09VTlQuZ2V0Qm9vbGVhbigpOwogICAgIHN0YXRpYyBPbkxlYWsgT05fTEVBSzsKIAogICAgIEBTaGFyZWQoc2NvcGUgPSBTSU1VTEFUSU9OKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvY29uY3VycmVudC9SZWZzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9jb25jdXJyZW50L1JlZnMuamF2YQppbmRleCBlNWQ5YzM3Li5mYjYwNjdlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9jb25jdXJyZW50L1JlZnMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9jb25jdXJyZW50L1JlZnMuamF2YQpAQCAtMjAsOCArMjAsMTMgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50OwogCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247CkBAIC0yMDQsNyArMjA5LDcgQEAKICAgICAvKioKICAgICAgKiBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIGFsbCBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0cywgb3Igbm9uZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBSZWZDb3VudGVkPFQ+PiBSZWZzPFQ+IHRyeVJlZihJdGVyYWJsZTxUPiByZWZlcmVuY2UpCisgICAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIFJlZkNvdW50ZWQ8VD4+IFJlZnM8VD4gdHJ5UmVmKEl0ZXJhYmxlPD8gZXh0ZW5kcyBUPiByZWZlcmVuY2UpCiAgICAgewogICAgICAgICBIYXNoTWFwPFQsIFJlZjxUPj4gcmVmcyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgZm9yIChUIHJjIDogcmVmZXJlbmNlKQpAQCAtMjIwLDcgKzIyNSw3IEBACiAgICAgICAgIHJldHVybiBuZXcgUmVmczxUPihyZWZzKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgUmVmQ291bnRlZDxUPj4gUmVmczxUPiByZWYoSXRlcmFibGU8VD4gcmVmZXJlbmNlKQorICAgIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBSZWZDb3VudGVkPFQ+PiBSZWZzPFQ+IHJlZihJdGVyYWJsZTw/IGV4dGVuZHMgVD4gcmVmZXJlbmNlKQogICAgIHsKICAgICAgICAgUmVmczxUPiByZWZzID0gdHJ5UmVmKHJlZmVyZW5jZSk7CiAgICAgICAgIGlmIChyZWZzICE9IG51bGwpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9jb25jdXJyZW50L1NoYXJlZENsb3NlYWJsZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvY29uY3VycmVudC9TaGFyZWRDbG9zZWFibGUuamF2YQppbmRleCBkNjQzZDFkLi4yNDNlOTRhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9jb25jdXJyZW50L1NoYXJlZENsb3NlYWJsZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2NvbmN1cnJlbnQvU2hhcmVkQ2xvc2VhYmxlLmphdmEKQEAgLTM0LDQgKzM0LDEyIEBACiAgICAgcHVibGljIFRocm93YWJsZSBjbG9zZShUaHJvd2FibGUgYWNjdW11bGF0ZSk7CiAKICAgICBwdWJsaWMgdm9pZCBhZGRUbyhSZWYuSWRlbnRpdHlDb2xsZWN0aW9uIGlkZW50aXRpZXMpOwotfQorCisgICAgc3RhdGljIDxUIGV4dGVuZHMgU2hhcmVkQ2xvc2VhYmxlPiBUIHNoYXJlZENvcHlPck51bGwoVCBzaGFyZWRDbG9zZWFibGUpCisgICAgeworICAgICAgICBpZiAoc2hhcmVkQ2xvc2VhYmxlICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKFQpIHNoYXJlZENsb3NlYWJsZS5zaGFyZWRDb3B5KCk7CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2NvbmN1cnJlbnQvVGhyZWFkTG9jYWxzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9jb25jdXJyZW50L1RocmVhZExvY2Fscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OGJhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9jb25jdXJyZW50L1RocmVhZExvY2Fscy5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheURlcXVlOworCitpbXBvcnQgaW8ubmV0dHkudXRpbC5jb25jdXJyZW50LkZhc3RUaHJlYWRMb2NhbDsKKworcHVibGljIGZpbmFsIGNsYXNzIFRocmVhZExvY2FscworeworICAgIHByaXZhdGUgVGhyZWFkTG9jYWxzKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8VD4gTGlnaHR3ZWlnaHRSZWN5Y2xlcjxUPiBjcmVhdGVMaWdodHdlaWdodFJlY3ljbGVyKGludCBsaW1pdCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRmFzdFRocmVhZExvY2FsTGlnaHR3ZWlnaHRSZWN5Y2xlcjw+KGxpbWl0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHtAbGluayBMaWdodHdlaWdodFJlY3ljbGVyfSB3aGljaCBpcyBiYWNrZWQgYnkgYSB7QGxpbmsgRmFzdFRocmVhZExvY2FsfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBGYXN0VGhyZWFkTG9jYWxMaWdodHdlaWdodFJlY3ljbGVyPFQ+IGV4dGVuZHMgRmFzdFRocmVhZExvY2FsPEFycmF5RGVxdWU8VD4+IGltcGxlbWVudHMgTGlnaHR3ZWlnaHRSZWN5Y2xlcjxUPgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgY2FwYWNpdHk7CisKKyAgICAgICAgcHVibGljIEZhc3RUaHJlYWRMb2NhbExpZ2h0d2VpZ2h0UmVjeWNsZXIoaW50IGNhcGFjaXR5KQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgdGhpcy5jYXBhY2l0eSA9IGNhcGFjaXR5OworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIEFycmF5RGVxdWU8VD4gaW5pdGlhbFZhbHVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheURlcXVlPD4oY2FwYWNpdHkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gbWF4aW11bSBjYXBhY2l0eSBvZiB0aGUgcmVjeWNsZXIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgY2FwYWNpdHkoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY2FwYWNpdHk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvbG9nZ2luZy9Mb2diYWNrTG9nZ2luZ1N1cHBvcnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2xvZ2dpbmcvTG9nYmFja0xvZ2dpbmdTdXBwb3J0LmphdmEKaW5kZXggZWRhOTE1My4uZTcxMGQ0NCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvbG9nZ2luZy9Mb2diYWNrTG9nZ2luZ1N1cHBvcnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9sb2dnaW5nL0xvZ2JhY2tMb2dnaW5nU3VwcG9ydC5qYXZhCkBAIC0yMCw4ICsyMCwxMSBAQAogCiBpbXBvcnQgamF2YS5sYW5nLm1hbmFnZW1lbnQuTWFuYWdlbWVudEZhY3Rvcnk7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOwogCiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTVg7CiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOwpAQCAtNTcsNiArNjAsOCBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uU3RhcnR1cCgpCiAgICAgeworICAgICAgICBjaGVja09ubHlPbmVWaXJ0dWFsVGFibGVBcHBlbmRlcigpOworCiAgICAgICAgIC8vIFRoZSBkZWZhdWx0IGxvZ2JhY2sgY29uZmlndXJhdGlvbiBpbiBjb25mL2xvZ2JhY2sueG1sIGFsbG93cyByZWxvYWRpbmcgdGhlCiAgICAgICAgIC8vIGNvbmZpZ3VyYXRpb24gd2hlbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGhhcyBjaGFuZ2VkIChldmVyeSA2MCBzZWNvbmRzIGJ5IGRlZmF1bHQpLgogICAgICAgICAvLyBUaGlzIHJlcXVpcmVzIGxvZ2JhY2sgdG8gdXNlIGZpbGUgSS9PIEFQSXMuIEJ1dCBmaWxlIEkvTyBpcyBub3QgYWxsb3dlZCBmcm9tIFVERnMuCkBAIC0xMzIsNiArMTM3LDQ2IEBACiAgICAgICAgIHJldHVybiBsb2dMZXZlbE1hcHM7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9wdGlvbmFsPEFwcGVuZGVyPD8+PiBnZXRBcHBlbmRlcihDbGFzczw/PiBhcHBlbmRlckNsYXNzLCBTdHJpbmcgbmFtZSkKKyAgICB7CisgICAgICAgIExvZ2dlckNvbnRleHQgbGMgPSAoTG9nZ2VyQ29udGV4dCkgTG9nZ2VyRmFjdG9yeS5nZXRJTG9nZ2VyRmFjdG9yeSgpOworICAgICAgICBmb3IgKExvZ2dlciBsb2dCYWNrTG9nZ2VyIDogbGMuZ2V0TG9nZ2VyTGlzdCgpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPEFwcGVuZGVyPElMb2dnaW5nRXZlbnQ+PiBpdGVyYXRvciA9IGxvZ0JhY2tMb2dnZXIuaXRlcmF0b3JGb3JBcHBlbmRlcnMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBcHBlbmRlcjxJTG9nZ2luZ0V2ZW50PiBhcHBlbmRlciA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYXBwZW5kZXIuZ2V0Q2xhc3MoKSA9PSBhcHBlbmRlckNsYXNzICYmIGFwcGVuZGVyLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihhcHBlbmRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tPbmx5T25lVmlydHVhbFRhYmxlQXBwZW5kZXIoKQorICAgIHsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgTG9nZ2VyQ29udGV4dCBsYyA9IChMb2dnZXJDb250ZXh0KSBMb2dnZXJGYWN0b3J5LmdldElMb2dnZXJGYWN0b3J5KCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsQXBwZW5kZXJOYW1lcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKExvZ2dlciBsb2dCYWNrTG9nZ2VyIDogbGMuZ2V0TG9nZ2VyTGlzdCgpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPEFwcGVuZGVyPElMb2dnaW5nRXZlbnQ+PiBpdGVyYXRvciA9IGxvZ0JhY2tMb2dnZXIuaXRlcmF0b3JGb3JBcHBlbmRlcnMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBcHBlbmRlcjw/PiBhcHBlbmRlciA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYXBwZW5kZXIgaW5zdGFuY2VvZiBWaXJ0dWFsVGFibGVBcHBlbmRlcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZpcnR1YWxBcHBlbmRlck5hbWVzLmFkZChhcHBlbmRlci5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb3VudCA+IDEpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlRoZXJlIGFyZSBtdWx0aXBsZSBhcHBlbmRlcnMgb2YgY2xhc3MgJXMgb2YgbmFtZXMgJXMuIFRoZXJlIGlzIG9ubHkgb25lIGFwcGVuZGVyIG9mIHN1Y2ggY2xhc3MgYWxsb3dlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpcnR1YWxUYWJsZUFwcGVuZGVyLmNsYXNzLmdldE5hbWUoKSwgU3RyaW5nLmpvaW4oIiwiLCB2aXJ0dWFsQXBwZW5kZXJOYW1lcykpKTsKKyAgICB9CisKICAgICBwcml2YXRlIGJvb2xlYW4gaGFzQXBwZW5kZXJzKExvZ2dlciBsb2dCYWNrTG9nZ2VyKQogICAgIHsKICAgICAgICAgSXRlcmF0b3I8QXBwZW5kZXI8SUxvZ2dpbmdFdmVudD4+IGl0ID0gbG9nQmFja0xvZ2dlci5pdGVyYXRvckZvckFwcGVuZGVycygpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvbG9nZ2luZy9Mb2dnaW5nU3VwcG9ydC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvbG9nZ2luZy9Mb2dnaW5nU3VwcG9ydC5qYXZhCmluZGV4IDhlYTgzYmUuLjM1ZTExOTcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2xvZ2dpbmcvTG9nZ2luZ1N1cHBvcnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9sb2dnaW5nL0xvZ2dpbmdTdXBwb3J0LmphdmEKQEAgLTE5LDYgKzE5LDkgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubG9nZ2luZzsKIAogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgY2gucW9zLmxvZ2JhY2suY29yZS5BcHBlbmRlcjsKIAogLyoqCiAgKiBDb21tb24gYWJzdHJhY3Rpb24gb2YgZnVuY3Rpb25hbGl0eSB3aGljaCBjYW4gYmUgaW1wbGVtZW50ZWQgZm9yIGRpZmZlcmVudCBsb2dnaW5nIGJhY2tlbmQgaW1wbGVtZW50YXRpb25zIChzbGY0aiBiaW5kaW5ncykuCkBAIC00OSw0ICs1Miw5IEBACiAgICAgICogQHJldHVybiBhIG1hcCBvZiBsb2dnZXIgbmFtZXMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgbG9nIGxldmVsIGFzIHN0cmluZyByZXByZXNlbnRhdGlvbnMuCiAgICAgICovCiAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRMb2dnaW5nTGV2ZWxzKCk7CisKKyAgICBkZWZhdWx0IE9wdGlvbmFsPEFwcGVuZGVyPD8+PiBnZXRBcHBlbmRlcihDbGFzczw/PiBhcHBlbmRlckNsYXNzLCBTdHJpbmcgYXBwZW5kZXJOYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvbG9nZ2luZy9WaXJ0dWFsVGFibGVBcHBlbmRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvbG9nZ2luZy9WaXJ0dWFsVGFibGVBcHBlbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MjBiMjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9sb2dnaW5nL1ZpcnR1YWxUYWJsZUFwcGVuZGVyLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubG9nZ2luZzsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CisKK2ltcG9ydCBjaC5xb3MubG9nYmFjay5jbGFzc2ljLnNwaS5Mb2dnaW5nRXZlbnQ7CitpbXBvcnQgY2gucW9zLmxvZ2JhY2suY29yZS5BcHBlbmRlckJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXVkaXQuRmlsZUF1ZGl0TG9nZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWwuTG9nTWVzc2FnZXNUYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsLlZpcnR1YWxLZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsLlZpcnR1YWxLZXlzcGFjZVJlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWwuVmlydHVhbFRhYmxlOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWwuTG9nTWVzc2FnZXNUYWJsZS5MT0dTX1ZJUlRVQUxfVEFCTEVfREVGQVVMVF9ST1dTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsLkxvZ01lc3NhZ2VzVGFibGUuVEFCTEVfTkFNRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50cy5WSVJUVUFMX1ZJRVdTOworCisvKioKKyAqIEFwcGVuZHMgQ2Fzc2FuZHJhIGxvZ3MgdG8gdmlydHVhbCB0YWJsZSBzeXN0ZW1fdmlld3Muc3lzdGVtX2xvZ3MKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFZpcnR1YWxUYWJsZUFwcGVuZGVyIGV4dGVuZHMgQXBwZW5kZXJCYXNlPExvZ2dpbmdFdmVudD4KK3sKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBFTkRFUl9OQU1FID0gIkNRTExPRyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBmb3JiaWRkZW5Mb2dnZXJzID0gSW1tdXRhYmxlU2V0Lm9mKEZpbGVBdWRpdExvZ2dlci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBMb2dNZXNzYWdlc1RhYmxlIGxvZ3M7CisKKyAgICAvLyBmb3IgaG9sZGluZyBtZXNzYWdlcyB1bnRpbCB2aXJ0dWFsIHJlZ2lzdHJ5IGNvbnRhaW5zIGxvZ3MgdmlydHVhbCB0YWJsZQorICAgIC8vIGFzIGl0IHRha2VzIHNvbWUgdGltZSBkdXJpbmcgc3RhcnR1cCBvZiBhIG5vZGUgdG8gaW5pdGlhbGlzZSB2aXJ0dWFsIHRhYmxlcyBidXQgbWVzc2FnZXMgYXJlCisgICAgLy8gbG9nZ2VkIGFscmVhZHkKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8TG9nZ2luZ0V2ZW50PiBtZXNzYWdlQnVmZmVyID0gbmV3IExpbmtlZExpc3Q8PigpOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgYXBwZW5kKExvZ2dpbmdFdmVudCBldmVudE9iamVjdCkKKyAgICB7CisgICAgICAgIGlmICghZm9yYmlkZGVuTG9nZ2Vycy5jb250YWlucyhldmVudE9iamVjdC5nZXRMb2dnZXJOYW1lKCkpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobG9ncyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ3MgPSBnZXRWaXJ0dWFsVGFibGUoKTsKKyAgICAgICAgICAgICAgICBpZiAobG9ncyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBhZGRUb0J1ZmZlcihldmVudE9iamVjdCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBsb2dzLmFkZChldmVudE9iamVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbG9ncy5hZGQoZXZlbnRPYmplY3QpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RvcCgpCisgICAgeworICAgICAgICBtZXNzYWdlQnVmZmVyLmNsZWFyKCk7CisgICAgICAgIHN1cGVyLnN0b3AoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbHVzaGVzIGFsbCBsb2dzIHdoaWNoIHdlcmUgYXBwZW5kZWQgYmVmb3JlIHZpcnR1YWwgdGFibGUgd2FzIHJlZ2lzdGVyZWQuCisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2Fzc2FuZHJhRGFlbW9uI3NldHVwVmlydHVhbEtleXNwYWNlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZsdXNoQnVmZmVyKCkKKyAgICB7CisgICAgICAgIE9wdGlvbmFsLm9mTnVsbGFibGUoZ2V0VmlydHVhbFRhYmxlKCkpLmlmUHJlc2VudCh2dGFibGUgLT4geworICAgICAgICAgICAgbWVzc2FnZUJ1ZmZlci5mb3JFYWNoKHZ0YWJsZTo6YWRkKTsKKyAgICAgICAgICAgIG1lc3NhZ2VCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMb2dNZXNzYWdlc1RhYmxlIGdldFZpcnR1YWxUYWJsZSgpCisgICAgeworICAgICAgICBWaXJ0dWFsS2V5c3BhY2Uga2V5c3BhY2UgPSBWaXJ0dWFsS2V5c3BhY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRLZXlzcGFjZU51bGxhYmxlKFZJUlRVQUxfVklFV1MpOworCisgICAgICAgIGlmIChrZXlzcGFjZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgT3B0aW9uYWw8VmlydHVhbFRhYmxlPiBsb2dzVGFibGUgPSBrZXlzcGFjZS50YWJsZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHZ0IC0+IHZ0Lm5hbWUoKS5lcXVhbHMoVEFCTEVfTkFNRSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZEZpcnN0KCk7CisKKyAgICAgICAgaWYgKCFsb2dzVGFibGUuaXNQcmVzZW50KCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBWaXJ0dWFsVGFibGUgdnQgPSBsb2dzVGFibGUuZ2V0KCk7CisKKyAgICAgICAgaWYgKCEodnQgaW5zdGFuY2VvZiBMb2dNZXNzYWdlc1RhYmxlKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiVmlydHVhbCB0YWJsZSAlcy4lcyBpcyBub3QgYmFja2VkIGJ5IGFuIGluc3RhbmNlIG9mICVzIGJ1dCBieSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVklSVFVBTF9WSUVXUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUJMRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ01lc3NhZ2VzVGFibGUuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7CisKKyAgICAgICAgcmV0dXJuIChMb2dNZXNzYWdlc1RhYmxlKSB2dDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkVG9CdWZmZXIoTG9nZ2luZ0V2ZW50IGV2ZW50T2JqZWN0KQorICAgIHsKKyAgICAgICAgLy8gd2UgcmVzdHJpY3QgaG93IG1hbnkgbG9nZ2luZyBldmVudHMgd2UgY2FuIHB1dCBpbnRvIGJ1ZmZlciwKKyAgICAgICAgLy8gc28gd2UgYXJlIG5vdCBncm93aW5nIHdpdGhvdXQgYW55IGJvdW5kIHdoZW4gdGhpbmdzIGdvIHNvdXRoCisgICAgICAgIGlmIChtZXNzYWdlQnVmZmVyLnNpemUoKSA8IExPR1NfVklSVFVBTF9UQUJMRV9ERUZBVUxUX1JPV1MpCisgICAgICAgICAgICBtZXNzYWdlQnVmZmVyLmFkZChldmVudE9iamVjdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvbWVtb3J5L0Vuc3VyZU9uSGVhcC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvbWVtb3J5L0Vuc3VyZU9uSGVhcC5qYXZhCmluZGV4IGQ2NmMwMmMuLjM0YjllYWEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL21lbW9yeS9FbnN1cmVPbkhlYXAuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9tZW1vcnkvRW5zdXJlT25IZWFwLmphdmEKQEAgLTMyLDYgKzMyLDggQEAKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIEVuc3VyZU9uSGVhcCBleHRlbmRzIFRyYW5zZm9ybWF0aW9uCiB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnN1cmVPbkhlYXAgTk9PUCA9IG5ldyBOb09wKCk7CisKICAgICBwdWJsaWMgYWJzdHJhY3QgRGVjb3JhdGVkS2V5IGFwcGx5VG9QYXJ0aXRpb25LZXkoRGVjb3JhdGVkS2V5IGtleSk7CiAgICAgcHVibGljIGFic3RyYWN0IFVuZmlsdGVyZWRSb3dJdGVyYXRvciBhcHBseVRvUGFydGl0aW9uKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBwYXJ0aXRpb24pOwogICAgIHB1YmxpYyBhYnN0cmFjdCBTZWFyY2hJdGVyYXRvcjxDbHVzdGVyaW5nPD8+LCBSb3c+IGFwcGx5VG9QYXJ0aXRpb24oU2VhcmNoSXRlcmF0b3I8Q2x1c3RlcmluZzw/PiwgUm93PiBwYXJ0aXRpb24pOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvbWVtb3J5L0hlYXBQb29sLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9tZW1vcnkvSGVhcFBvb2wuamF2YQppbmRleCA1MzJkMTFmLi42NTk3MTVkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9tZW1vcnkvSGVhcFBvb2wuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9tZW1vcnkvSGVhcFBvb2wuamF2YQpAQCAtMzAsOCArMzAsNiBAQAogCiBwdWJsaWMgY2xhc3MgSGVhcFBvb2wgZXh0ZW5kcyBNZW10YWJsZVBvb2wKIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFbnN1cmVPbkhlYXAgRU5TVVJFX05PT1AgPSBuZXcgRW5zdXJlT25IZWFwLk5vT3AoKTsKLQogICAgIHB1YmxpYyBIZWFwUG9vbChsb25nIG1heE9uSGVhcE1lbW9yeSwgZmxvYXQgY2xlYW51cFRocmVzaG9sZCwgTWVtdGFibGVDbGVhbmVyIGNsZWFuZXIpCiAgICAgewogICAgICAgICBzdXBlcihtYXhPbkhlYXBNZW1vcnksIDAsIGNsZWFudXBUaHJlc2hvbGQsIGNsZWFuZXIpOwpAQCAtNTksNyArNTcsNyBAQAogCiAgICAgICAgIHB1YmxpYyBFbnN1cmVPbkhlYXAgZW5zdXJlT25IZWFwKCkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEVOU1VSRV9OT09QOworICAgICAgICAgICAgcmV0dXJuIEVuc3VyZU9uSGVhcC5OT09QOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIENsb25lciBjbG9uZXIoT3BPcmRlci5Hcm91cCBvcEdyb3VwKQpAQCAtMTI0LDcgKzEyMiw3IEBACiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBFbnN1cmVPbkhlYXAgZW5zdXJlT25IZWFwKCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRU5TVVJFX05PT1A7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVuc3VyZU9uSGVhcC5OT09QOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBwdWJsaWMgQ2xvbmVyIGNsb25lcihPcE9yZGVyLkdyb3VwIG9wR3JvdXApCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy92aW50L1ZJbnRDb2RpbmcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL3ZpbnQvVkludENvZGluZy5qYXZhCmluZGV4IDg1NDNlNmYuLmMyNDU1YmIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL3ZpbnQvVkludENvZGluZy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL3ZpbnQvVkludENvZGluZy5qYXZhCkBAIC03Myw2ICs3MywyMSBAQAogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NJWkUgPSAxMDsKIAorICAgIC8qKgorICAgICAqIFRocm93IHdoZW4gYXR0ZW1wdGluZyB0byBkZWNvZGUgYSB2aW50IGFuZCB0aGUgb3V0cHV0IHR5cGUKKyAgICAgKiBkb2Vzbid0IGhhdmUgZW5vdWdoIHNwYWNlIHRvIGZpdCB0aGUgdmFsdWUgdGhhdCB3YXMgZGVjb2RlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVkludE91dE9mUmFuZ2VFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyB2YWx1ZTsKKworICAgICAgICBwcml2YXRlIFZJbnRPdXRPZlJhbmdlRXhjZXB0aW9uKGxvbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKHZhbHVlICsgIiBpcyBvdXQgb2YgcmFuZ2UgZm9yIGEgMzItYml0IGludGVnZXIiKTsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgbG9uZyByZWFkVW5zaWduZWRWSW50KERhdGFJbnB1dCBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBpbnQgZmlyc3RCeXRlID0gaW5wdXQucmVhZEJ5dGUoKTsKQEAgLTEwMSwxNCArMTE2LDI0IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmVhZCB1cCB0byBhIDMyLWJpdCBpbnRlZ2VyIGJhY2ssIHVzaW5nIHRoZSB1bnNpZ25lZCAobm8gemlnemFnKSBlbmNvZGluZy4KKyAgICAgKgogICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgdGhlIHNhbWUgYXMge0BsaW5rICNyZWFkVW5zaWduZWRWSW50KERhdGFJbnB1dCl9LAogICAgICAqIGV4Y2VwdCB0aGF0IHdlIGRvICpub3QqIGJsb2NrIGlmIHRoZXJlIGFyZSBub3QgZW5vdWdoIGJ5dGVzIGluIHRoZSBidWZmZXIKICAgICAgKiB0byByZWNvbnN0cnVjdCB0aGUgdmFsdWUuCiAgICAgICoKLSAgICAgKiBXQVJOSU5HOiB0aGlzIG1ldGhvZCBpcyBvbmx5IHNhZmUgZm9yIHZpbnRzIHdlIGtub3cgdG8gYmUgcmVwcmVzZW50YWJsZSBieSBhIHBvc2l0aXZlIGxvbmcgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIC0xIGlmIHRoZXJlIGFyZSBub3QgZW5vdWdoIGJ5dGVzIGluIHRoZSBpbnB1dCB0byByZWFkIHRoZSB2YWx1ZTsgZWxzZSwgdGhlIHZpbnQgdW5zaWduZWQgdmFsdWUuCisgICAgICogQHRocm93cyBWSW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiBJZiB0aGUgdmludCBkb2Vzbid0IGZpdCBpbnRvIGEgMzItYml0IGludGVnZXIKICAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRVbnNpZ25lZFZJbnQzMihCeXRlQnVmZmVyIGlucHV0LCBpbnQgcmVhZGVySW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gY2hlY2tlZENhc3QoZ2V0VW5zaWduZWRWSW50KGlucHV0LCByZWFkZXJJbmRleCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFZJbnQzMihCeXRlQnVmZmVyIGlucHV0LCBpbnQgcmVhZGVySW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gY2hlY2tlZENhc3QoZGVjb2RlWmlnWmFnNjQoZ2V0VW5zaWduZWRWSW50KGlucHV0LCByZWFkZXJJbmRleCkpKTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0VW5zaWduZWRWSW50KEJ5dGVCdWZmZXIgaW5wdXQsIGludCByZWFkZXJJbmRleCkKICAgICB7CiAgICAgICAgIHJldHVybiBnZXRVbnNpZ25lZFZJbnQoaW5wdXQsIHJlYWRlckluZGV4LCBpbnB1dC5saW1pdCgpKTsKQEAgLTE2NSw2ICsxOTAsMzIgQEAKICAgICAgICAgcmV0dXJuIGRlY29kZVppZ1phZzY0KHJlYWRVbnNpZ25lZFZJbnQoaW5wdXQpKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZWFkIHVwIHRvIGEgc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIGJhY2suCisgICAgICoKKyAgICAgKiBBc3N1bWVzIHRoZSB2aW50IHdhcyB3cml0dGVuIHVzaW5nIHtAbGluayAjd3JpdGVWSW50MzIoaW50LCBEYXRhT3V0cHV0UGx1cyl9IG9yIHNpbWlsYXIKKyAgICAgKiB0aGF0IHppZ3phZyBlbmNvZGVzIHRoZSBpbnRlZ2VyLgorICAgICAqCisgICAgICogQHRocm93cyBWSW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiBJZiB0aGUgdmludCBkb2Vzbid0IGZpdCBpbnRvIGEgMzItYml0IGludGVnZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCByZWFkVkludDMyKERhdGFJbnB1dCBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gY2hlY2tlZENhc3QoZGVjb2RlWmlnWmFnNjQocmVhZFVuc2lnbmVkVkludChpbnB1dCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHVwIHRvIGEgMzItYml0IGludGVnZXIuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoZSBvcmlnaW5hbCBpbnRlZ2VyIHdhcyB3cml0dGVuIHVzaW5nIHtAbGluayAjd3JpdGVVbnNpZ25lZFZJbnQzMihpbnQsIERhdGFPdXRwdXRQbHVzKX0KKyAgICAgKiBvciBzaW1pbGFyIHRoYXQgZG9lc24ndCB6aWd6YWcgZW5jb2RlcyB0aGUgdmludC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVkludE91dE9mUmFuZ2VFeGNlcHRpb24gSWYgdGhlIHZpbnQgZG9lc24ndCBmaXQgaW50byBhIDMyLWJpdCBpbnRlZ2VyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgcmVhZFVuc2lnbmVkVkludDMyKERhdGFJbnB1dCBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gY2hlY2tlZENhc3QocmVhZFVuc2lnbmVkVkludChpbnB1dCkpOworICAgIH0KKwogICAgIC8vICYgdGhpcyB3aXRoIHRoZSBmaXJzdCBieXRlIHRvIGdpdmUgdGhlIHZhbHVlIHBhcnQgZm9yIGEgZ2l2ZW4gZXh0cmFCeXRlc1RvUmVhZCBlbmNvZGVkIGluIHRoZSBieXRlCiAgICAgcHVibGljIHN0YXRpYyBpbnQgZmlyc3RCeXRlVmFsdWVNYXNrKGludCBleHRyYUJ5dGVzVG9SZWFkKQogICAgIHsKQEAgLTE4Niw2ICsyMzcsMTIgQEAKICAgICAgICAgcmV0dXJuIEludGVnZXIubnVtYmVyT2ZMZWFkaW5nWmVyb3MofmZpcnN0Qnl0ZSkgLSAyNDsKICAgICB9CiAKKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVVuc2lnbmVkVkludChpbnQgdmFsdWUsIERhdGFPdXRwdXRQbHVzIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVzZSB3cml0ZVVuc2lnbmVkVkludDMyL3JlYWRVbnNpZ25lZFZJbnQzMiIpOworICAgIH0KKwogICAgIEBJbmxpbmUKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVVbnNpZ25lZFZJbnQobG9uZyB2YWx1ZSwgRGF0YU91dHB1dFBsdXMgb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CkBAIC0yMDAsNyArMjU3LDcgQEAKICAgICAgICAgICAgIGludCBleHRyYUJ5dGVzID0gc2l6ZSAtIDE7CiAgICAgICAgICAgICBsb25nIG1hc2sgPSAobG9uZylWSW50Q29kaW5nLmVuY29kZUV4dHJhQnl0ZXNUb1JlYWQoZXh0cmFCeXRlcykgPDwgNTY7CiAgICAgICAgICAgICBsb25nIHJlZ2lzdGVyID0gKHZhbHVlIDw8IHNoaWZ0KSB8IG1hc2s7Ci0gICAgICAgICAgICBvdXRwdXQud3JpdGVCeXRlcyhyZWdpc3Rlciwgc2l6ZSk7CisgICAgICAgICAgICBvdXRwdXQud3JpdGVNb3N0U2lnbmlmaWNhbnRCeXRlcyhyZWdpc3Rlciwgc2l6ZSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSA5KQogICAgICAgICB7CkBAIC0yMTMsNiArMjcwLDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVVbnNpZ25lZFZJbnQzMihpbnQgdmFsdWUsIERhdGFPdXRwdXRQbHVzIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB3cml0ZVVuc2lnbmVkVkludCgobG9uZyl2YWx1ZSwgb3V0cHV0KTsKKyAgICB9CisKKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVVuc2lnbmVkVkludChpbnQgdmFsdWUsIEJ5dGVCdWZmZXIgb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVXNlIHdyaXRlVW5zaWduZWRWSW50MzIvZ2V0VW5zaWduZWRWSW50MzIiKTsKKyAgICB9CisKICAgICBASW5saW5lCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlVW5zaWduZWRWSW50KGxvbmcgdmFsdWUsIEJ5dGVCdWZmZXIgb3V0cHV0KQogICAgIHsKQEAgLTI1MSwxNyArMzE5LDQ3IEBACiAgICAgfQogCiAgICAgQElubGluZQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVVuc2lnbmVkVkludDMyKGludCB2YWx1ZSwgQnl0ZUJ1ZmZlciBvdXRwdXQpCisgICAgeworICAgICAgICB3cml0ZVVuc2lnbmVkVkludCgobG9uZyl2YWx1ZSwgb3V0cHV0KTsKKyAgICB9CisKKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVZJbnQoaW50IHZhbHVlLCBEYXRhT3V0cHV0UGx1cyBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVc2Ugd3JpdGVWSW50MzIvcmVhZFZJbnQzMiIpOworICAgIH0KKworICAgIEBJbmxpbmUKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVWSW50KGxvbmcgdmFsdWUsIERhdGFPdXRwdXRQbHVzIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICB3cml0ZVVuc2lnbmVkVkludChlbmNvZGVaaWdaYWc2NCh2YWx1ZSksIG91dHB1dCk7CiAgICAgfQogCiAgICAgQElubGluZQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVZJbnQobG9uZyB2YWx1ZSwgQnl0ZUJ1ZmZlciBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVZJbnQzMihpbnQgdmFsdWUsIERhdGFPdXRwdXRQbHVzIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB3cml0ZVZJbnQoKGxvbmcpdmFsdWUsIG91dHB1dCk7CisgICAgfQorCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVWSW50KGludCB2YWx1ZSwgQnl0ZUJ1ZmZlciBvdXRwdXQpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVzZSB3cml0ZVZJbnQzMi9nZXRWSW50MzIiKTsKKyAgICB9CisKKyAgICBASW5saW5lCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlVkludChsb25nIHZhbHVlLCBCeXRlQnVmZmVyIG91dHB1dCkKICAgICB7CiAgICAgICAgIHdyaXRlVW5zaWduZWRWSW50KGVuY29kZVppZ1phZzY0KHZhbHVlKSwgb3V0cHV0KTsKICAgICB9CiAKKyAgICBASW5saW5lCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlVkludDMyKGludCB2YWx1ZSwgQnl0ZUJ1ZmZlciBvdXRwdXQpCisgICAgeworICAgICAgICB3cml0ZVZJbnQoKGxvbmcpdmFsdWUsIG91dHB1dCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQHJldHVybiBhIFRFTVBPUkFSWSBUSFJFQUQgTE9DQUwgQlVGRkVSIGNvbnRhaW5pbmcgdGhlIGVuY29kZWQgYnl0ZXMgb2YgdGhlIHZhbHVlCiAgICAgICogVGhpcyBieXRlW10gbXVzdCBiZSBkaXNjYXJkZWQgYnkgdGhlIGNhbGxlciBpbW1lZGlhdGVseSwgYW5kIHN5bmNocm9ub3VzbHkKQEAgLTMyNiw0ICs0MjQsMTIgQEAKICAgICAgICAgLy8gdGhlIGZvcm11bGEgYmVsb3cgaXMgaGFuZC1waWNrZWQgdG8gbWF0Y2ggdGhlIG9yaWdpbmFsIDkgLSAoKG1hZ25pdHVkZSAtIDEpIC8gNykKICAgICAgICAgcmV0dXJuICg2MzkgLSBtYWduaXR1ZGUgKiA5KSA+PiA2OwogICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNoZWNrZWRDYXN0KGxvbmcgdmFsdWUpCisgICAgeworICAgICAgICBpbnQgcmVzdWx0ID0gKGludCl2YWx1ZTsKKyAgICAgICAgaWYgKChsb25nKXJlc3VsdCAhPSB2YWx1ZSkKKyAgICAgICAgICAgIHRocm93IG5ldyBWSW50T3V0T2ZSYW5nZUV4Y2VwdGlvbih2YWx1ZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0JEZhY3RvcnkgYi9zcmMvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQkRmFjdG9yeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTAzN2M1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0JEZhY3RvcnkKQEAgLTAsMCArMSwyIEBACitvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0JEJpZ0Zvcm1hdEZhY3RvcnkKK29yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aS5CdGlGb3JtYXQkQnRpRm9ybWF0RmFjdG9yeQpkaWZmIC0tZ2l0IGEvdGVzdC9hbnR0YXNrcy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hbnR0YXNrcy9KZGtQcm9wZXJ0aWVzLmphdmEgYi90ZXN0L2FudHRhc2tzL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2FudHRhc2tzL0pka1Byb3BlcnRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTVkMjAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hbnR0YXNrcy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hbnR0YXNrcy9KZGtQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hbnR0YXNrczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKKworcHVibGljIGNsYXNzIEpka1Byb3BlcnRpZXMgZXh0ZW5kcyBUYXNrCit7CisKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKKyAgICB7CisgICAgICAgIFByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKKyAgICAgICAgcHJvamVjdC5zZXROZXdQcm9wZXJ0eSgiamF2YS52ZXJzaW9uLiIgKyBwcm9qZWN0LmdldFByb3BlcnR5KCJhbnQuamF2YS52ZXJzaW9uIikucmVwbGFjZSgiMS4iLCAiIiksICJ0cnVlIik7CisgICAgICAgIHByb2plY3Quc2V0TmV3UHJvcGVydHkoInVzZS1qZGsiICsgcHJvamVjdC5nZXRQcm9wZXJ0eSgiYW50LmphdmEudmVyc2lvbiIpLnJlcGxhY2UoIjEuIiwgIiIpLCAidHJ1ZSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvYnVybi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvTWVzc2FnZUdlbmVyYXRvci5qYXZhIGIvdGVzdC9idXJuL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9NZXNzYWdlR2VuZXJhdG9yLmphdmEKaW5kZXggNDNlYTE2ZS4uODBlNjQ3YyAxMDA2NDQKLS0tIGEvdGVzdC9idXJuL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9NZXNzYWdlR2VuZXJhdG9yLmphdmEKKysrIGIvdGVzdC9idXJuL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9NZXNzYWdlR2VuZXJhdG9yLmphdmEKQEAgLTE0OSw3ICsxNDksNyBAQAogICAgIHsKICAgICAgICAgaW50IGxlbmd0aCA9IG1lc3NhZ2luZ1ZlcnNpb24gPCBWRVJTSU9OXzQwCiAgICAgICAgICAgICAgICAgICAgICA/IGluLnJlYWRJbnQoKQotICAgICAgICAgICAgICAgICAgICAgOiAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICAgICAgICAgICA6IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogICAgICAgICBsb25nIGlkID0gaW4ucmVhZExvbmcoKTsKICAgICAgICAgaWYgKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpID09IEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKQogICAgICAgICAgICAgaWQgPSBMb25nLnJldmVyc2VCeXRlcyhpZCk7CkBAIC0xNjIsNyArMTYyLDcgQEAKICAgICAgICAgaWYgKG1lc3NhZ2luZ1ZlcnNpb24gPCBWRVJTSU9OXzQwKQogICAgICAgICAgICAgb3V0LndyaXRlSW50KHBheWxvYWQubGVuZ3RoKTsKICAgICAgICAgZWxzZQotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHBheWxvYWQubGVuZ3RoKTsKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKHBheWxvYWQubGVuZ3RoKTsKICAgICB9CiAKICAgICBzdGF0aWMgbG9uZyBzZXJpYWxpemVkU2l6ZShieXRlW10gcGF5bG9hZCwgaW50IG1lc3NhZ2luZ1ZlcnNpb24pCmRpZmYgLS1naXQgYS90ZXN0L2J1cm4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L1NpbXBsZUNsaWVudFBlcmZUZXN0LmphdmEgYi90ZXN0L2J1cm4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L1NpbXBsZUNsaWVudFBlcmZUZXN0LmphdmEKaW5kZXggYTA1MDI0NS4uZTYwNDY5NyAxMDA2NDQKLS0tIGEvdGVzdC9idXJuL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9TaW1wbGVDbGllbnRQZXJmVGVzdC5qYXZhCisrKyBiL3Rlc3QvYnVybi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvU2ltcGxlQ2xpZW50UGVyZlRlc3QuamF2YQpAQCAtMzAsNyArMzAsNyBAQAogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5SYXRlTGltaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubWF0aC5zdGF0LmRlc2NyaXB0aXZlLkRlc2NyaXB0aXZlU3RhdGlzdGljczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubWF0aDMuc3RhdC5kZXNjcmlwdGl2ZS5EZXNjcmlwdGl2ZVN0YXRpc3RpY3M7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdC9idXJuL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0xvbmdCVHJlZVRlc3QuamF2YSBiL3Rlc3QvYnVybi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9Mb25nQlRyZWVUZXN0LmphdmEKaW5kZXggMDFiNDQ5My4uOWFhMTNmOSAxMDA2NDQKLS0tIGEvdGVzdC9idXJuL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0xvbmdCVHJlZVRlc3QuamF2YQorKysgYi90ZXN0L2J1cm4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvTG9uZ0JUcmVlVGVzdC5qYXZhCkBAIC01Miw2ICs1Miw3IEBACiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLnRyYW5zZm9ybTsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbXBhcmF0b3IubmF0dXJhbE9yZGVyOwogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQ29tcGFyYXRvci5yZXZlcnNlT3JkZXI7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQlRSRUVfRkFOX0ZBQ1RPUjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnRyZWUuQlRyZWUuaXRlcmFibGU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CkBAIC0xOTAsNyArMTkxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiB1cGRhdGUgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSW50ZWdlciBpIDogc2VsZWN0aW9uLnRlc3RLZXlzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlLnB1dChpLCBuZXcgSW50ZWdlcihpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUucHV0KGksIEludGVnZXIudmFsdWVPZihpKSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRpbmdGdW5jdGlvbiBmdW5jdGlvbiA9IG5ldyBDb3VudGluZ0Z1bmN0aW9uKCh4KSAtPiB4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gb3JpZ2luYWwgPSBzZWxlY3Rpb24udGVzdEFzU2V0LnRyZWUoKTsKQEAgLTIxMCw3ICsyMTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPEludGVnZXIsIEludGVnZXI+IHVwZGF0ZSA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJbnRlZ2VyIGkgOiBzZWxlY3Rpb24udGVzdEtleXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUucHV0KGksIG5ldyBJbnRlZ2VyKGkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZS5wdXQoaSwgSW50ZWdlci52YWx1ZU9mKGkpKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudGluZ0Z1bmN0aW9uIGZ1bmN0aW9uID0gbmV3IENvdW50aW5nRnVuY3Rpb24oKHgpIC0+IHVwZGF0ZS5nZXRPckRlZmF1bHQoeCwgeCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBvcmlnaW5hbCA9IHNlbGVjdGlvbi50ZXN0QXNTZXQudHJlZSgpOwpAQCAtMjMwLDcgKzIzMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gdXBkYXRlID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEludGVnZXIgaSA6IHNlbGVjdGlvbi50ZXN0S2V5cykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZS5wdXQoaSwgbmV3IEludGVnZXIoaSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlLnB1dChpLCBJbnRlZ2VyLnZhbHVlT2YoaSkpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50aW5nRnVuY3Rpb24gZnVuY3Rpb24gPSBuZXcgQ291bnRpbmdGdW5jdGlvbih1cGRhdGU6OmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIG9yaWdpbmFsID0gc2VsZWN0aW9uLnRlc3RBc1NldC50cmVlKCk7CkBAIC0yNDksNyArMjUwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiB1cGRhdGUgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSW50ZWdlciBpIDogc2VsZWN0aW9uLnRlc3RLZXlzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlLnB1dChpLCBuZXcgSW50ZWdlcihpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUucHV0KGksIEludGVnZXIudmFsdWVPZihpKSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRpbmdGdW5jdGlvbiBmdW5jdGlvbiA9IG5ldyBDb3VudGluZ0Z1bmN0aW9uKCh4KSAtPiB1cGRhdGUuY29udGFpbnNLZXkoeCkgPyBudWxsIDogeCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIG9yaWdpbmFsID0gc2VsZWN0aW9uLnRlc3RBc1NldC50cmVlKCk7CkBAIC0xMTM1LDcgKzExMzYsNyBAQAogICAgICAgICBmb3IgKFN0cmluZyBhcmcgOiBhcmdzKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoImZhbj0iKSkKLSAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5idHJlZS5mYW5mYWN0b3IiLCBhcmcuc3Vic3RyaW5nKDQpKTsKKyAgICAgICAgICAgICAgICBCVFJFRV9GQU5fRkFDVE9SLnNldFN0cmluZyhhcmcuc3Vic3RyaW5nKDQpKTsKICAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5zdGFydHNXaXRoKCJtaW49IikpCiAgICAgICAgICAgICAgICAgbWluVHJlZVNpemUgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZy5zdWJzdHJpbmcoNCkpOwogICAgICAgICAgICAgZWxzZSBpZiAoYXJnLnN0YXJ0c1dpdGgoIm1heD0iKSkKZGlmZiAtLWdpdCBhL3Rlc3QvY29uZi9jYXNzYW5kcmEtbXVybXVyLnlhbWwgYi90ZXN0L2NvbmYvY2Fzc2FuZHJhLW11cm11ci55YW1sCmluZGV4IGMwYzJhZTcuLjM4NWVkNDYgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29uZi9jYXNzYW5kcmEtbXVybXVyLnlhbWwKKysrIGIvdGVzdC9jb25mL2Nhc3NhbmRyYS1tdXJtdXIueWFtbApAQCAtMzksNiArMzksNiBAQAogcm93X2NhY2hlX2NsYXNzX25hbWU6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLk9IQ1Byb3ZpZGVyCiByb3dfY2FjaGVfc2l6ZTogMTZNaUIKIHVzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZDogdHJ1ZQotc2NyaXB0ZWRfdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkOiB0cnVlCitzY3JpcHRlZF91c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQ6IGZhbHNlCiBzYXNpX2luZGV4ZXNfZW5hYmxlZDogdHJ1ZQogbWF0ZXJpYWxpemVkX3ZpZXdzX2VuYWJsZWQ6IHRydWUKZGlmZiAtLWdpdCBhL3Rlc3QvY29uZi9jYXNzYW5kcmEtb2xkLnlhbWwgYi90ZXN0L2NvbmYvY2Fzc2FuZHJhLW9sZC55YW1sCmluZGV4IDg2OTgzYWMuLjEwOTgxYzIgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29uZi9jYXNzYW5kcmEtb2xkLnlhbWwKKysrIGIvdGVzdC9jb25mL2Nhc3NhbmRyYS1vbGQueWFtbApAQCAtNDMsNyArNDMsNyBAQAogcm93X2NhY2hlX2NsYXNzX25hbWU6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLk9IQ1Byb3ZpZGVyCiByb3dfY2FjaGVfc2l6ZV9pbl9tYjogMTYKIGVuYWJsZV91c2VyX2RlZmluZWRfZnVuY3Rpb25zOiB0cnVlCi1lbmFibGVfc2NyaXB0ZWRfdXNlcl9kZWZpbmVkX2Z1bmN0aW9uczogdHJ1ZQorZW5hYmxlX3NjcmlwdGVkX3VzZXJfZGVmaW5lZF9mdW5jdGlvbnM6IGZhbHNlCiBwcmVwYXJlZF9zdGF0ZW1lbnRzX2NhY2hlX3NpemVfbWI6CiBjb3JydXB0ZWRfdG9tYnN0b25lX3N0cmF0ZWd5OiBleGNlcHRpb24KIHN0cmVhbV9lbnRpcmVfc3N0YWJsZXM6IHRydWUKZGlmZiAtLWdpdCBhL3Rlc3QvY29uZi9jYXNzYW5kcmEtcGVtLWprcy1zc2xjb250ZXh0ZmFjdG9yeS55YW1sIGIvdGVzdC9jb25mL2Nhc3NhbmRyYS1wZW0tamtzLXNzbGNvbnRleHRmYWN0b3J5LnlhbWwKaW5kZXggMWYxMGU2Yy4uYWQ5ZDk5OCAxMDA2NDQKLS0tIGEvdGVzdC9jb25mL2Nhc3NhbmRyYS1wZW0tamtzLXNzbGNvbnRleHRmYWN0b3J5LnlhbWwKKysrIGIvdGVzdC9jb25mL2Nhc3NhbmRyYS1wZW0tamtzLXNzbGNvbnRleHRmYWN0b3J5LnlhbWwKQEAgLTE0MCw3ICsxNDAsNyBAQAogcm93X2NhY2hlX2NsYXNzX25hbWU6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLk9IQ1Byb3ZpZGVyCiByb3dfY2FjaGVfc2l6ZTogMTZNaUIKIHVzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZDogdHJ1ZQotc2NyaXB0ZWRfdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkOiB0cnVlCitzY3JpcHRlZF91c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQ6IGZhbHNlCiBwcmVwYXJlZF9zdGF0ZW1lbnRzX2NhY2hlX3NpemU6IDFNaUIKIGNvcnJ1cHRlZF90b21ic3RvbmVfc3RyYXRlZ3k6IGV4Y2VwdGlvbgogc3RyZWFtX2VudGlyZV9zc3RhYmxlczogdHJ1ZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb25mL2Nhc3NhbmRyYS1wZW0tc3NsY29udGV4dGZhY3RvcnktaW52YWxpZGNvbmZpZ3VyYXRpb24ueWFtbCBiL3Rlc3QvY29uZi9jYXNzYW5kcmEtcGVtLXNzbGNvbnRleHRmYWN0b3J5LWludmFsaWRjb25maWd1cmF0aW9uLnlhbWwKaW5kZXggOGM3ZDkxMC4uMTVhYWFlMCAxMDA2NDQKLS0tIGEvdGVzdC9jb25mL2Nhc3NhbmRyYS1wZW0tc3NsY29udGV4dGZhY3RvcnktaW52YWxpZGNvbmZpZ3VyYXRpb24ueWFtbAorKysgYi90ZXN0L2NvbmYvY2Fzc2FuZHJhLXBlbS1zc2xjb250ZXh0ZmFjdG9yeS1pbnZhbGlkY29uZmlndXJhdGlvbi55YW1sCkBAIC0xMzcsNyArMTM3LDcgQEAKIHJvd19jYWNoZV9jbGFzc19uYW1lOiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5PSENQcm92aWRlcgogcm93X2NhY2hlX3NpemU6IDE2TWlCCiB1c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQ6IHRydWUKLXNjcmlwdGVkX3VzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZDogdHJ1ZQorc2NyaXB0ZWRfdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkOiBmYWxzZQogcHJlcGFyZWRfc3RhdGVtZW50c19jYWNoZV9zaXplOiAxTWlCCiBjb3JydXB0ZWRfdG9tYnN0b25lX3N0cmF0ZWd5OiBleGNlcHRpb24KIHN0cmVhbV9lbnRpcmVfc3N0YWJsZXM6IHRydWUKZGlmZiAtLWdpdCBhL3Rlc3QvY29uZi9jYXNzYW5kcmEtcGVtLXNzbGNvbnRleHRmYWN0b3J5LnlhbWwgYi90ZXN0L2NvbmYvY2Fzc2FuZHJhLXBlbS1zc2xjb250ZXh0ZmFjdG9yeS55YW1sCmluZGV4IDI2ZDBmMWYuLjM2ZGFlY2QgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29uZi9jYXNzYW5kcmEtcGVtLXNzbGNvbnRleHRmYWN0b3J5LnlhbWwKKysrIGIvdGVzdC9jb25mL2Nhc3NhbmRyYS1wZW0tc3NsY29udGV4dGZhY3RvcnkueWFtbApAQCAtMTQxLDcgKzE0MSw3IEBACiByb3dfY2FjaGVfY2xhc3NfbmFtZTogb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuT0hDUHJvdmlkZXIKIHJvd19jYWNoZV9zaXplOiAxNk1pQgogdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkOiB0cnVlCi1zY3JpcHRlZF91c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQ6IHRydWUKK3NjcmlwdGVkX3VzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZDogZmFsc2UKIHByZXBhcmVkX3N0YXRlbWVudHNfY2FjaGVfc2l6ZTogMU1pQgogY29ycnVwdGVkX3RvbWJzdG9uZV9zdHJhdGVneTogZXhjZXB0aW9uCiBzdHJlYW1fZW50aXJlX3NzdGFibGVzOiB0cnVlCmRpZmYgLS1naXQgYS90ZXN0L2NvbmYvY2Fzc2FuZHJhLXNlZWRzLnlhbWwgYi90ZXN0L2NvbmYvY2Fzc2FuZHJhLXNlZWRzLnlhbWwKaW5kZXggMWMzOGY4ZS4uMmEyMDZmMSAxMDA2NDQKLS0tIGEvdGVzdC9jb25mL2Nhc3NhbmRyYS1zZWVkcy55YW1sCisrKyBiL3Rlc3QvY29uZi9jYXNzYW5kcmEtc2VlZHMueWFtbApAQCAtNDAsNCArNDAsNCBAQAogcm93X2NhY2hlX2NsYXNzX25hbWU6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLk9IQ1Byb3ZpZGVyCiByb3dfY2FjaGVfc2l6ZTogMTZNaUIKIHVzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZDogdHJ1ZQotc2NyaXB0ZWRfdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkOiB0cnVlCitzY3JpcHRlZF91c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQ6IGZhbHNlCmRpZmYgLS1naXQgYS90ZXN0L2NvbmYvY2Fzc2FuZHJhLXNzbGNvbnRleHRmYWN0b3J5LWludmFsaWRjb25maWd1cmF0aW9uLnlhbWwgYi90ZXN0L2NvbmYvY2Fzc2FuZHJhLXNzbGNvbnRleHRmYWN0b3J5LWludmFsaWRjb25maWd1cmF0aW9uLnlhbWwKaW5kZXggZDM5NzBjYi4uNmU2YjIxZiAxMDA2NDQKLS0tIGEvdGVzdC9jb25mL2Nhc3NhbmRyYS1zc2xjb250ZXh0ZmFjdG9yeS1pbnZhbGlkY29uZmlndXJhdGlvbi55YW1sCisrKyBiL3Rlc3QvY29uZi9jYXNzYW5kcmEtc3NsY29udGV4dGZhY3RvcnktaW52YWxpZGNvbmZpZ3VyYXRpb24ueWFtbApAQCAtNzIsNyArNzIsNyBAQAogcm93X2NhY2hlX2NsYXNzX25hbWU6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLk9IQ1Byb3ZpZGVyCiByb3dfY2FjaGVfc2l6ZTogMTZNaUIKIHVzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZDogdHJ1ZQotc2NyaXB0ZWRfdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkOiB0cnVlCitzY3JpcHRlZF91c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQ6IGZhbHNlCiBwcmVwYXJlZF9zdGF0ZW1lbnRzX2NhY2hlX3NpemU6IDFNaUIKIGNvcnJ1cHRlZF90b21ic3RvbmVfc3RyYXRlZ3k6IGV4Y2VwdGlvbgogc3RyZWFtX2VudGlyZV9zc3RhYmxlczogdHJ1ZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb25mL2Nhc3NhbmRyYS1zc2xjb250ZXh0ZmFjdG9yeS55YW1sIGIvdGVzdC9jb25mL2Nhc3NhbmRyYS1zc2xjb250ZXh0ZmFjdG9yeS55YW1sCmluZGV4IGZkZTRiZmQuLmFkZDE2NjYgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29uZi9jYXNzYW5kcmEtc3NsY29udGV4dGZhY3RvcnkueWFtbAorKysgYi90ZXN0L2NvbmYvY2Fzc2FuZHJhLXNzbGNvbnRleHRmYWN0b3J5LnlhbWwKQEAgLTc1LDcgKzc1LDcgQEAKIHJvd19jYWNoZV9jbGFzc19uYW1lOiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5PSENQcm92aWRlcgogcm93X2NhY2hlX3NpemU6IDE2TWlCCiB1c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQ6IHRydWUKLXNjcmlwdGVkX3VzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZDogdHJ1ZQorc2NyaXB0ZWRfdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkOiBmYWxzZQogcHJlcGFyZWRfc3RhdGVtZW50c19jYWNoZV9zaXplOiAxTWlCCiBjb3JydXB0ZWRfdG9tYnN0b25lX3N0cmF0ZWd5OiBleGNlcHRpb24KIHN0cmVhbV9lbnRpcmVfc3N0YWJsZXM6IHRydWUKZGlmZiAtLWdpdCBhL3Rlc3QvY29uZi9jYXNzYW5kcmEueWFtbCBiL3Rlc3QvY29uZi9jYXNzYW5kcmEueWFtbAppbmRleCA4OWM1Njg1Li42ZTMwNTlhIDEwMDY0NAotLS0gYS90ZXN0L2NvbmYvY2Fzc2FuZHJhLnlhbWwKKysrIGIvdGVzdC9jb25mL2Nhc3NhbmRyYS55YW1sCkBAIC00Myw3ICs0Myw3IEBACiByb3dfY2FjaGVfY2xhc3NfbmFtZTogb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuT0hDUHJvdmlkZXIKIHJvd19jYWNoZV9zaXplOiAxNk1pQgogdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkOiB0cnVlCi1zY3JpcHRlZF91c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQ6IHRydWUKK3NjcmlwdGVkX3VzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZDogZmFsc2UKIHByZXBhcmVkX3N0YXRlbWVudHNfY2FjaGVfc2l6ZTogMU1pQgogY29ycnVwdGVkX3RvbWJzdG9uZV9zdHJhdGVneTogZXhjZXB0aW9uCiBzdHJlYW1fZW50aXJlX3NzdGFibGVzOiB0cnVlCkBAIC01Niw2ICs1Niw5IEBACiAgIGFsbG93X25vZGV0b29sX2FyY2hpdmVfY29tbWFuZDogdHJ1ZQogYXV0b19oaW50c19jbGVhbnVwX2VuYWJsZWQ6IHRydWUKIAoraGVhcF9kdW1wX3BhdGg6IGJ1aWxkL3Rlc3QKK2R1bXBfaGVhcF9vbl91bmNhdWdodF9leGNlcHRpb246IHRydWUKKwogcmVhZF90aHJlc2hvbGRzX2VuYWJsZWQ6IHRydWUKIGNvb3JkaW5hdG9yX3JlYWRfc2l6ZV93YXJuX3RocmVzaG9sZDogMTAyNEtpQgogY29vcmRpbmF0b3JfcmVhZF9zaXplX2ZhaWxfdGhyZXNob2xkOiA0MDk2S2lCCkBAIC02NywxMyArNzAsMTUgQEAKIG1lbXRhYmxlOgogICAgIGNvbmZpZ3VyYXRpb25zOgogICAgICAgICBza2lwbGlzdDoKLSAgICAgICAgICAgIGluaGVyaXRzOiBkZWZhdWx0CiAgICAgICAgICAgICBjbGFzc19uYW1lOiBTa2lwTGlzdE1lbXRhYmxlCisgICAgICAgIHRyaWU6CisgICAgICAgICAgICBjbGFzc19uYW1lOiBUcmllTWVtdGFibGUKKyAgICAgICAgICAgIHBhcmFtZXRlcnM6CisgICAgICAgICAgICAgICAgc2hhcmRzOiA0CiAgICAgICAgIHNraXBsaXN0X3NoYXJkZWQ6CiAgICAgICAgICAgICBjbGFzc19uYW1lOiBTaGFyZGVkU2tpcExpc3RNZW10YWJsZQogICAgICAgICAgICAgcGFyYW1ldGVyczoKICAgICAgICAgICAgICAgICBzZXJpYWxpemVfd3JpdGVzOiBmYWxzZQotICAgICAgICAgICAgICAgIHNoYXJkczogNAogICAgICAgICBza2lwbGlzdF9zaGFyZGVkX2xvY2tpbmc6CiAgICAgICAgICAgICBpbmhlcml0czogc2tpcGxpc3Rfc2hhcmRlZAogICAgICAgICAgICAgcGFyYW1ldGVyczoKQEAgLTgxLDcgKzg2LDYgQEAKICAgICAgICAgc2tpcGxpc3RfcmVtYXBwZWQ6CiAgICAgICAgICAgICBpbmhlcml0czogc2tpcGxpc3QKICAgICAgICAgdGVzdF9mdWxsbmFtZToKLSAgICAgICAgICAgIGluaGVyaXRzOiBkZWZhdWx0CiAgICAgICAgICAgICBjbGFzc19uYW1lOiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZS5UZXN0TWVtdGFibGUKICAgICAgICAgdGVzdF9zaG9ydG5hbWU6CiAgICAgICAgICAgICBjbGFzc19uYW1lOiBUZXN0TWVtdGFibGUKQEAgLTEwNSwzICsxMDksNyBAQAogICAgICAgICAgICAgY2xhc3NfbmFtZTogb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy52YWxpZGF0aW9uLm9wZXJhdGlvbnMuQ3JlYXRlVGVzdCRJbnZhbGlkTWVtdGFibGVGYWN0b3J5TWV0aG9kCiAgICAgICAgIHRlc3RfaW52YWxpZF9mYWN0b3J5X2ZpZWxkOgogICAgICAgICAgICAgY2xhc3NfbmFtZTogb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy52YWxpZGF0aW9uLm9wZXJhdGlvbnMuQ3JlYXRlVGVzdCRJbnZhbGlkTWVtdGFibGVGYWN0b3J5RmllbGQKKyAgICAgICAgdGVzdF9tZW10YWJsZV9tZXRyaWNzOgorICAgICAgICAgICAgY2xhc3NfbmFtZTogVHJpZU1lbXRhYmxlCisjIE5vdGU6IGtlZXAgdGhlIG1lbXRhYmxlIGNvbmZpZ3VyYXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSwgc28gdGhhdCB0aGUgZGVmYXVsdCBtYXBwaW5nIGNhbiBiZSBjaGFuZ2VkIHdpdGhvdXQKKyMgZHVwbGljYXRpbmcgdGhlIHdob2xlIHNlY3Rpb24gYWJvdmUuCmRpZmYgLS1naXQgYS90ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0LnRydXN0c3RvcmUgYi90ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0LnRydXN0c3RvcmUKaW5kZXggNDljZjMzMi4uYWIwMWFmMyAxMDA2NDQKLS0tIGEvdGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdC50cnVzdHN0b3JlCisrKyBiL3Rlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3QudHJ1c3RzdG9yZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0X2VuZHBvaW50X3ZlcmlmeS5rZXlzdG9yZSBiL3Rlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3RfZW5kcG9pbnRfdmVyaWZ5LmtleXN0b3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MTM4NWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0X2VuZHBvaW50X3ZlcmlmeS5rZXlzdG9yZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0X291dGJvdW5kLmtleXN0b3JlIGIvdGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdF9vdXRib3VuZC5rZXlzdG9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGJmNDY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdF9vdXRib3VuZC5rZXlzdG9yZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvbmYvbG9nYmFjay1kdGVzdF93aXRoX3Z0YWJsZV9hcHBlbmRlci54bWwgYi90ZXN0L2NvbmYvbG9nYmFjay1kdGVzdF93aXRoX3Z0YWJsZV9hcHBlbmRlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlmZDEwOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29uZi9sb2diYWNrLWR0ZXN0X3dpdGhfdnRhYmxlX2FwcGVuZGVyLnhtbApAQCAtMCwwICsxLDY2IEBACis8IS0tCisgIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIH4gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICB+CisgIH4gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICB+CisgIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAtLT4KKworPGNvbmZpZ3VyYXRpb24gZGVidWc9ImZhbHNlIiBzY2FuPSJ0cnVlIiBzY2FuUGVyaW9kPSI2MCBzZWNvbmRzIj4KKyAgICA8ZGVmaW5lIG5hbWU9ImNsdXN0ZXJfaWQiIGNsYXNzPSJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5pbXBsLkNsdXN0ZXJJRERlZmluZXIiIC8+CisgICAgPGRlZmluZSBuYW1lPSJpbnN0YW5jZV9pZCIgY2xhc3M9Im9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmltcGwuSW5zdGFuY2VJRERlZmluZXIiIC8+CisKKyAgICA8IS0tIFNodXRkb3duIGhvb2sgZW5zdXJlcyB0aGF0IGFzeW5jIGFwcGVuZGVyIGZsdXNoZXMgLS0+CisgICAgPHNodXRkb3duSG9vayBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5ob29rLkRlbGF5aW5nU2h1dGRvd25Ib29rIi8+CisKKyAgICA8YXBwZW5kZXIgbmFtZT0iSU5TVEFOQ0VGSUxFIiBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5GaWxlQXBwZW5kZXIiPgorICAgICAgICA8ZmlsZT4uL2J1aWxkL3Rlc3QvbG9ncy8ke2Nhc3NhbmRyYS50ZXN0dGFnfS8ke3N1aXRlbmFtZX0vJHtjbHVzdGVyX2lkfS8ke2luc3RhbmNlX2lkfS9zeXN0ZW0ubG9nPC9maWxlPgorICAgICAgICA8ZW5jb2Rlcj4KKyAgICAgICAgICAgIDxwYXR0ZXJuPiUtNWxldmVsIFsldGhyZWFkXSAke2luc3RhbmNlX2lkfSAlZGF0ZXtJU084NjAxfSAlbXNnJW48L3BhdHRlcm4+CisgICAgICAgIDwvZW5jb2Rlcj4KKyAgICAgICAgPGltbWVkaWF0ZUZsdXNoPnRydWU8L2ltbWVkaWF0ZUZsdXNoPgorICAgIDwvYXBwZW5kZXI+CisKKyAgICA8YXBwZW5kZXIgbmFtZT0iSU5TVEFOQ0VTVERFUlIiIHRhcmdldD0iU3lzdGVtLmVyciIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUuQ29uc29sZUFwcGVuZGVyIj4KKyAgICAgICAgPGVuY29kZXI+CisgICAgICAgICAgICA8cGF0dGVybj4lLTVsZXZlbCAlZGF0ZXtISDptbTpzcyxTU1N9ICVtc2clbjwvcGF0dGVybj4KKyAgICAgICAgPC9lbmNvZGVyPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLmZpbHRlci5UaHJlc2hvbGRGaWx0ZXIiPgorICAgICAgICAgICAgPGxldmVsPldBUk48L2xldmVsPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L2FwcGVuZGVyPgorCisgICAgPGFwcGVuZGVyIG5hbWU9IklOU1RBTkNFU1RET1VUIiB0YXJnZXQ9IlN5c3RlbS5vdXQiIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLkNvbnNvbGVBcHBlbmRlciI+CisgICAgICAgIDxlbmNvZGVyPgorICAgICAgICAgICAgPHBhdHRlcm4+JS01bGV2ZWwgWyV0aHJlYWRdICR7aW5zdGFuY2VfaWR9ICVkYXRle0lTTzg2MDF9ICVGOiVMIC0gJW1zZyVuPC9wYXR0ZXJuPgorICAgICAgICA8L2VuY29kZXI+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNsYXNzaWMuZmlsdGVyLlRocmVzaG9sZEZpbHRlciI+CisgICAgICAgICAgICA8bGV2ZWw+REVCVUc8L2xldmVsPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L2FwcGVuZGVyPgorCisgICAgPGxvZ2dlciBuYW1lPSJvcmcuYXBhY2hlLmhhZG9vcCIgbGV2ZWw9IldBUk4iLz4KKworICAgIDxhcHBlbmRlciBuYW1lPSJDUUxMT0ciIGNsYXNzPSJvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5sb2dnaW5nLlZpcnR1YWxUYWJsZUFwcGVuZGVyIj4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5maWx0ZXIuVGhyZXNob2xkRmlsdGVyIj4KKyAgICAgICAgICAgIDxsZXZlbD5JTkZPPC9sZXZlbD4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9hcHBlbmRlcj4KKworICAgIDxyb290IGxldmVsPSJERUJVRyI+CisgICAgICAgIDxhcHBlbmRlci1yZWYgcmVmPSJJTlNUQU5DRUZJTEUiIC8+IDwhLS0gdXNlIGJsb2NraW5nIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucyB3aXRoIGFwcGVuZGluZyBhbmQgc2VhcmNoaW5nIC0tPgorICAgICAgICA8YXBwZW5kZXItcmVmIHJlZj0iSU5TVEFOQ0VTVERFUlIiIC8+CisgICAgICAgIDxhcHBlbmRlci1yZWYgcmVmPSJJTlNUQU5DRVNURE9VVCIgLz4KKyAgICAgICAgPGFwcGVuZGVyLXJlZiByZWY9IkNRTExPRyIgLz4KKyAgICA8L3Jvb3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0L2NvbmYvbG9nYmFjay1kdGVzdF93aXRoX3Z0YWJsZV9hcHBlbmRlcl9pbnZhbGlkLnhtbCBiL3Rlc3QvY29uZi9sb2diYWNrLWR0ZXN0X3dpdGhfdnRhYmxlX2FwcGVuZGVyX2ludmFsaWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMzBjMTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvbmYvbG9nYmFjay1kdGVzdF93aXRoX3Z0YWJsZV9hcHBlbmRlcl9pbnZhbGlkLnhtbApAQCAtMCwwICsxLDczIEBACis8IS0tCisgIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIH4gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICB+CisgIH4gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICB+CisgIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAtLT4KKworPGNvbmZpZ3VyYXRpb24gZGVidWc9ImZhbHNlIiBzY2FuPSJ0cnVlIiBzY2FuUGVyaW9kPSI2MCBzZWNvbmRzIj4KKyAgICA8ZGVmaW5lIG5hbWU9ImNsdXN0ZXJfaWQiIGNsYXNzPSJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5pbXBsLkNsdXN0ZXJJRERlZmluZXIiIC8+CisgICAgPGRlZmluZSBuYW1lPSJpbnN0YW5jZV9pZCIgY2xhc3M9Im9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmltcGwuSW5zdGFuY2VJRERlZmluZXIiIC8+CisKKyAgICA8IS0tIFNodXRkb3duIGhvb2sgZW5zdXJlcyB0aGF0IGFzeW5jIGFwcGVuZGVyIGZsdXNoZXMgLS0+CisgICAgPHNodXRkb3duSG9vayBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5ob29rLkRlbGF5aW5nU2h1dGRvd25Ib29rIi8+CisKKyAgICA8YXBwZW5kZXIgbmFtZT0iSU5TVEFOQ0VGSUxFIiBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5GaWxlQXBwZW5kZXIiPgorICAgICAgICA8ZmlsZT4uL2J1aWxkL3Rlc3QvbG9ncy8ke2Nhc3NhbmRyYS50ZXN0dGFnfS8ke3N1aXRlbmFtZX0vJHtjbHVzdGVyX2lkfS8ke2luc3RhbmNlX2lkfS9zeXN0ZW0ubG9nPC9maWxlPgorICAgICAgICA8ZW5jb2Rlcj4KKyAgICAgICAgICAgIDxwYXR0ZXJuPiUtNWxldmVsIFsldGhyZWFkXSAke2luc3RhbmNlX2lkfSAlZGF0ZXtJU084NjAxfSAlbXNnJW48L3BhdHRlcm4+CisgICAgICAgIDwvZW5jb2Rlcj4KKyAgICAgICAgPGltbWVkaWF0ZUZsdXNoPnRydWU8L2ltbWVkaWF0ZUZsdXNoPgorICAgIDwvYXBwZW5kZXI+CisKKyAgICA8YXBwZW5kZXIgbmFtZT0iSU5TVEFOQ0VTVERFUlIiIHRhcmdldD0iU3lzdGVtLmVyciIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUuQ29uc29sZUFwcGVuZGVyIj4KKyAgICAgICAgPGVuY29kZXI+CisgICAgICAgICAgICA8cGF0dGVybj4lLTVsZXZlbCAlZGF0ZXtISDptbTpzcyxTU1N9ICVtc2clbjwvcGF0dGVybj4KKyAgICAgICAgPC9lbmNvZGVyPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLmZpbHRlci5UaHJlc2hvbGRGaWx0ZXIiPgorICAgICAgICAgICAgPGxldmVsPldBUk48L2xldmVsPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L2FwcGVuZGVyPgorCisgICAgPGFwcGVuZGVyIG5hbWU9IklOU1RBTkNFU1RET1VUIiB0YXJnZXQ9IlN5c3RlbS5vdXQiIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLkNvbnNvbGVBcHBlbmRlciI+CisgICAgICAgIDxlbmNvZGVyPgorICAgICAgICAgICAgPHBhdHRlcm4+JS01bGV2ZWwgWyV0aHJlYWRdICR7aW5zdGFuY2VfaWR9ICVkYXRle0lTTzg2MDF9ICVGOiVMIC0gJW1zZyVuPC9wYXR0ZXJuPgorICAgICAgICA8L2VuY29kZXI+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNsYXNzaWMuZmlsdGVyLlRocmVzaG9sZEZpbHRlciI+CisgICAgICAgICAgICA8bGV2ZWw+REVCVUc8L2xldmVsPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L2FwcGVuZGVyPgorCisgICAgPGxvZ2dlciBuYW1lPSJvcmcuYXBhY2hlLmhhZG9vcCIgbGV2ZWw9IldBUk4iLz4KKworICAgIDxhcHBlbmRlciBuYW1lPSJDUUxMT0ciIGNsYXNzPSJvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5sb2dnaW5nLlZpcnR1YWxUYWJsZUFwcGVuZGVyIj4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5maWx0ZXIuVGhyZXNob2xkRmlsdGVyIj4KKyAgICAgICAgICAgIDxsZXZlbD5JTkZPPC9sZXZlbD4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9hcHBlbmRlcj4KKworICAgIDxhcHBlbmRlciBuYW1lPSJDUUxMT0cyIiBjbGFzcz0ib3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubG9nZ2luZy5WaXJ0dWFsVGFibGVBcHBlbmRlciI+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNsYXNzaWMuZmlsdGVyLlRocmVzaG9sZEZpbHRlciI+CisgICAgICAgICAgICA8bGV2ZWw+SU5GTzwvbGV2ZWw+CisgICAgICAgIDwvZmlsdGVyPgorICAgIDwvYXBwZW5kZXI+CisKKyAgICA8cm9vdCBsZXZlbD0iREVCVUciPgorICAgICAgICA8YXBwZW5kZXItcmVmIHJlZj0iSU5TVEFOQ0VGSUxFIiAvPiA8IS0tIHVzZSBibG9ja2luZyB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMgd2l0aCBhcHBlbmRpbmcgYW5kIHNlYXJjaGluZyAtLT4KKyAgICAgICAgPGFwcGVuZGVyLXJlZiByZWY9IklOU1RBTkNFU1RERVJSIiAvPgorICAgICAgICA8YXBwZW5kZXItcmVmIHJlZj0iSU5TVEFOQ0VTVERPVVQiIC8+CisgICAgICAgIDxhcHBlbmRlci1yZWYgcmVmPSJDUUxMT0ciIC8+CisgICAgICAgIDxhcHBlbmRlci1yZWYgcmVmPSJDUUxMT0cyIiAvPiA8IS0tIGludmFsaWQsIHdlIGNhbiBub3QgaGF2ZSBtdWx0aXBsZSBhcHBlbmRlcnMgb2YgVmlydHVhbFRhYmxlQXBwZW5kZXIgY2xhc3MgLS0+CisgICAgPC9yb290PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdC9jb25mL3RyaWVfbWVtdGFibGUueWFtbCBiL3Rlc3QvY29uZi90cmllX21lbXRhYmxlLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzY2E4MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29uZi90cmllX21lbXRhYmxlLnlhbWwKQEAgLTAsMCArMSwyNSBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIE5vdGU6IHRoaXMgYXR0YWNoZXMgYXQgdGhlIGVuZCBvZiBjYXNzYW5kcmEueWFtbCwgd2hlcmUgdGhlIG1lbXRhYmxlIGNvbmZpZ3VyYXRpb24gc2V0dGluZyBtdXN0IGJlLgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaW5oZXJpdHM6IHRyaWUKKworIyBDaGFuZ2UgdGhlIGRlZmF1bHQgU1NUYWJsZSBmb3JtYXQgdG8gQlRJLgorIyBOb3RlOiBUaGlzIGNhbiBhbHNvIGJlIGFjaGlldmVkIGJ5IHBhc3NpbmcgLURjYXNzYW5kcmEuc3N0YWJsZS5mb3JtYXQuZGVmYXVsdD1idGkKK3NzdGFibGU6CisgIHNlbGVjdGVkX2Zvcm1hdDogYnRpCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0L2RhLTEtYnRpLUNvbXByZXNzaW9uSW5mby5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfY2x1c3QvZGEtMS1idGktQ29tcHJlc3Npb25JbmZvLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMDc1YTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0L2RhLTEtYnRpLUNvbXByZXNzaW9uSW5mby5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0L2RhLTEtYnRpLURhdGEuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0L2RhLTEtYnRpLURhdGEuZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkwOWQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfY2x1c3QvZGEtMS1idGktRGF0YS5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0L2RhLTEtYnRpLURpZ2VzdC5jcmMzMiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfY2x1c3QvZGEtMS1idGktRGlnZXN0LmNyYzMyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliN2I5ZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0L2RhLTEtYnRpLURpZ2VzdC5jcmMzMgpAQCAtMCwwICsxIEBACiszNTAxNjk2NjczClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdC9kYS0xLWJ0aS1GaWx0ZXIuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0L2RhLTEtYnRpLUZpbHRlci5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODY4ZTVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdC9kYS0xLWJ0aS1GaWx0ZXIuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdC9kYS0xLWJ0aS1QYXJ0aXRpb25zLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdC9kYS0xLWJ0aS1QYXJ0aXRpb25zLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZjFiMDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0L2RhLTEtYnRpLVBhcnRpdGlvbnMuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdC9kYS0xLWJ0aS1Sb3dzLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdC9kYS0xLWJ0aS1Sb3dzLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZGVmYWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0L2RhLTEtYnRpLVJvd3MuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdC9kYS0xLWJ0aS1TdGF0aXN0aWNzLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdC9kYS0xLWJ0aS1TdGF0aXN0aWNzLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzODAxOGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0L2RhLTEtYnRpLVN0YXRpc3RpY3MuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdC9kYS0xLWJ0aS1UT0MudHh0IGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdC9kYS0xLWJ0aS1UT0MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ODkxMGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0L2RhLTEtYnRpLVRPQy50eHQKQEAgLTAsMCArMSw4IEBACitEYXRhLmRiCitTdGF0aXN0aWNzLmRiCitEaWdlc3QuY3JjMzIKK1RPQy50eHQKK0NvbXByZXNzaW9uSW5mby5kYgorRmlsdGVyLmRiCitQYXJ0aXRpb25zLmRiCitSb3dzLmRiCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0X2NvdW50ZXIvZGEtMS1idGktQ29tcHJlc3Npb25JbmZvLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLUNvbXByZXNzaW9uSW5mby5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmZhNmVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLUNvbXByZXNzaW9uSW5mby5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0X2NvdW50ZXIvZGEtMS1idGktRGF0YS5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfY2x1c3RfY291bnRlci9kYS0xLWJ0aS1EYXRhLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMWEwNWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0X2NvdW50ZXIvZGEtMS1idGktRGF0YS5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0X2NvdW50ZXIvZGEtMS1idGktRGlnZXN0LmNyYzMyIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLURpZ2VzdC5jcmMzMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjYxMjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLURpZ2VzdC5jcmMzMgpAQCAtMCwwICsxIEBACisxNzQ4ODI2MDg2ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLUZpbHRlci5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfY2x1c3RfY291bnRlci9kYS0xLWJ0aS1GaWx0ZXIuZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2OGU1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfY2x1c3RfY291bnRlci9kYS0xLWJ0aS1GaWx0ZXIuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLVBhcnRpdGlvbnMuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0X2NvdW50ZXIvZGEtMS1idGktUGFydGl0aW9ucy5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWYxYjAxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLVBhcnRpdGlvbnMuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLVJvd3MuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0X2NvdW50ZXIvZGEtMS1idGktUm93cy5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTM0N2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLVJvd3MuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLVN0YXRpc3RpY3MuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0X2NvdW50ZXIvZGEtMS1idGktU3RhdGlzdGljcy5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODIyMTc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLVN0YXRpc3RpY3MuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLVRPQy50eHQgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0X2NvdW50ZXIvZGEtMS1idGktVE9DLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTg5MTBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLVRPQy50eHQKQEAgLTAsMCArMSw4IEBACitEYXRhLmRiCitTdGF0aXN0aWNzLmRiCitEaWdlc3QuY3JjMzIKK1RPQy50eHQKK0NvbXByZXNzaW9uSW5mby5kYgorRmlsdGVyLmRiCitQYXJ0aXRpb25zLmRiCitSb3dzLmRiCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZS9kYS0xLWJ0aS1Db21wcmVzc2lvbkluZm8uZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZS9kYS0xLWJ0aS1Db21wcmVzc2lvbkluZm8uZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY2ODMxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlL2RhLTEtYnRpLUNvbXByZXNzaW9uSW5mby5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZS9kYS0xLWJ0aS1EYXRhLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGUvZGEtMS1idGktRGF0YS5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGJhOTI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGUvZGEtMS1idGktRGF0YS5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZS9kYS0xLWJ0aS1EaWdlc3QuY3JjMzIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZS9kYS0xLWJ0aS1EaWdlc3QuY3JjMzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkMjViZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlL2RhLTEtYnRpLURpZ2VzdC5jcmMzMgpAQCAtMCwwICsxIEBACis0MTA0MzI3MjM3ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGUvZGEtMS1idGktRmlsdGVyLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGUvZGEtMS1idGktRmlsdGVyLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NjhlNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZS9kYS0xLWJ0aS1GaWx0ZXIuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGUvZGEtMS1idGktUGFydGl0aW9ucy5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlL2RhLTEtYnRpLVBhcnRpdGlvbnMuZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwYjRlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlL2RhLTEtYnRpLVBhcnRpdGlvbnMuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL2RiLldyaXRlUmVzcG9uc2UuYmluIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGUvZGEtMS1idGktUm93cy5kYgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL2RiLldyaXRlUmVzcG9uc2UuYmluCnJlbmFtZSB0byB0ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZS9kYS0xLWJ0aS1Sb3dzLmRiCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZS9kYS0xLWJ0aS1TdGF0aXN0aWNzLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGUvZGEtMS1idGktU3RhdGlzdGljcy5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTAwN2I4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGUvZGEtMS1idGktU3RhdGlzdGljcy5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZS9kYS0xLWJ0aS1UT0MudHh0IGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGUvZGEtMS1idGktVE9DLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTg5MTBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGUvZGEtMS1idGktVE9DLnR4dApAQCAtMCwwICsxLDggQEAKK0RhdGEuZGIKK1N0YXRpc3RpY3MuZGIKK0RpZ2VzdC5jcmMzMgorVE9DLnR4dAorQ29tcHJlc3Npb25JbmZvLmRiCitGaWx0ZXIuZGIKK1BhcnRpdGlvbnMuZGIKK1Jvd3MuZGIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktQ29tcHJlc3Npb25JbmZvLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGVfY291bnRlci9kYS0xLWJ0aS1Db21wcmVzc2lvbkluZm8uZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiOWFhMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktQ29tcHJlc3Npb25JbmZvLmRiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktRGF0YS5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktRGF0YS5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWIzNmYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGVfY291bnRlci9kYS0xLWJ0aS1EYXRhLmRiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktRGlnZXN0LmNyYzMyIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGVfY291bnRlci9kYS0xLWJ0aS1EaWdlc3QuY3JjMzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE3YWNlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktRGlnZXN0LmNyYzMyCkBAIC0wLDAgKzEgQEAKKzExMDIxOTI0ODgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZV9jb3VudGVyL2RhLTEtYnRpLUZpbHRlci5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktRmlsdGVyLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NjhlNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZV9jb3VudGVyL2RhLTEtYnRpLUZpbHRlci5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZV9jb3VudGVyL2RhLTEtYnRpLVBhcnRpdGlvbnMuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZV9jb3VudGVyL2RhLTEtYnRpLVBhcnRpdGlvbnMuZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzczZDNjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktUGFydGl0aW9ucy5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvZGIuV3JpdGVSZXNwb25zZS5iaW4gYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZV9jb3VudGVyL2RhLTEtYnRpLVJvd3MuZGIKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvZGIuV3JpdGVSZXNwb25zZS5iaW4KY29weSB0byB0ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZV9jb3VudGVyL2RhLTEtYnRpLVJvd3MuZGIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktU3RhdGlzdGljcy5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktU3RhdGlzdGljcy5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjgyNTc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGVfY291bnRlci9kYS0xLWJ0aS1TdGF0aXN0aWNzLmRiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktVE9DLnR4dCBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktVE9DLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTg5MTBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGVfY291bnRlci9kYS0xLWJ0aS1UT0MudHh0CkBAIC0wLDAgKzEsOCBAQAorRGF0YS5kYgorU3RhdGlzdGljcy5kYgorRGlnZXN0LmNyYzMyCitUT0MudHh0CitDb21wcmVzc2lvbkluZm8uZGIKK0ZpbHRlci5kYgorUGFydGl0aW9ucy5kYgorUm93cy5kYgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1Db21wcmVzc2lvbkluZm8uZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX2NsdXN0L25jLTEtYmlnLUNvbXByZXNzaW9uSW5mby5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWJmMGE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1Db21wcmVzc2lvbkluZm8uZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1EYXRhLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1EYXRhLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYjVkYWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX2NsdXN0L25jLTEtYmlnLURhdGEuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1EaWdlc3QuY3JjMzIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX2NsdXN0L25jLTEtYmlnLURpZ2VzdC5jcmMzMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzU1NGZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1EaWdlc3QuY3JjMzIKQEAgLTAsMCArMSBAQAorNTE2MzUxNDU4ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1GaWx0ZXIuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX2NsdXN0L25jLTEtYmlnLUZpbHRlci5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODY4ZTVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1GaWx0ZXIuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1JbmRleC5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3QvbmMtMS1iaWctSW5kZXguZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyM2JlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3QvbmMtMS1iaWctSW5kZXguZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1TdGF0aXN0aWNzLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1TdGF0aXN0aWNzLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMTM1NWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX2NsdXN0L25jLTEtYmlnLVN0YXRpc3RpY3MuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1TdW1tYXJ5LmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1TdW1tYXJ5LmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMjRlMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX2NsdXN0L25jLTEtYmlnLVN1bW1hcnkuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1UT0MudHh0IGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1UT0MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYTkxMmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX2NsdXN0L25jLTEtYmlnLVRPQy50eHQKQEAgLTAsMCArMSw4IEBACitUT0MudHh0CitEYXRhLmRiCitTdGF0aXN0aWNzLmRiCitTdW1tYXJ5LmRiCitGaWx0ZXIuZGIKK0RpZ2VzdC5jcmMzMgorSW5kZXguZGIKK0NvbXByZXNzaW9uSW5mby5kYgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdF9jb3VudGVyL25jLTEtYmlnLUNvbXByZXNzaW9uSW5mby5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1Db21wcmVzc2lvbkluZm8uZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhYjhkMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1Db21wcmVzc2lvbkluZm8uZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdF9jb3VudGVyL25jLTEtYmlnLURhdGEuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX2NsdXN0X2NvdW50ZXIvbmMtMS1iaWctRGF0YS5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjEyZDNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdF9jb3VudGVyL25jLTEtYmlnLURhdGEuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdF9jb3VudGVyL25jLTEtYmlnLURpZ2VzdC5jcmMzMiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1EaWdlc3QuY3JjMzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UwYmYzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1EaWdlc3QuY3JjMzIKQEAgLTAsMCArMSBAQAorMzY3NzE1MjQxMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1GaWx0ZXIuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX2NsdXN0X2NvdW50ZXIvbmMtMS1iaWctRmlsdGVyLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NjhlNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX2NsdXN0X2NvdW50ZXIvbmMtMS1iaWctRmlsdGVyLmRiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1JbmRleC5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1JbmRleC5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGZkYjNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdF9jb3VudGVyL25jLTEtYmlnLUluZGV4LmRiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1TdGF0aXN0aWNzLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdF9jb3VudGVyL25jLTEtYmlnLVN0YXRpc3RpY3MuZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEzYWIwNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1TdGF0aXN0aWNzLmRiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1TdW1tYXJ5LmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdF9jb3VudGVyL25jLTEtYmlnLVN1bW1hcnkuZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyNGUwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1TdW1tYXJ5LmRiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1UT0MudHh0IGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdF9jb3VudGVyL25jLTEtYmlnLVRPQy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVhOTEyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1UT0MudHh0CkBAIC0wLDAgKzEsOCBAQAorVE9DLnR4dAorRGF0YS5kYgorU3RhdGlzdGljcy5kYgorU3VtbWFyeS5kYgorRmlsdGVyLmRiCitEaWdlc3QuY3JjMzIKK0luZGV4LmRiCitDb21wcmVzc2lvbkluZm8uZGIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlL25jLTEtYmlnLUNvbXByZXNzaW9uSW5mby5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlL25jLTEtYmlnLUNvbXByZXNzaW9uSW5mby5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjY4MzE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGUvbmMtMS1iaWctQ29tcHJlc3Npb25JbmZvLmRiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlL25jLTEtYmlnLURhdGEuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZS9uYy0xLWJpZy1EYXRhLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNTM1ODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZS9uYy0xLWJpZy1EYXRhLmRiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlL25jLTEtYmlnLURpZ2VzdC5jcmMzMiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlL25jLTEtYmlnLURpZ2VzdC5jcmMzMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2Y2Mjk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGUvbmMtMS1iaWctRGlnZXN0LmNyYzMyCkBAIC0wLDAgKzEgQEAKKzExNTU2MjUyMzkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZS9uYy0xLWJpZy1GaWx0ZXIuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZS9uYy0xLWJpZy1GaWx0ZXIuZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2OGU1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlL25jLTEtYmlnLUZpbHRlci5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZS9uYy0xLWJpZy1JbmRleC5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlL25jLTEtYmlnLUluZGV4LmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMDk0YmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZS9uYy0xLWJpZy1JbmRleC5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZS9uYy0xLWJpZy1TdGF0aXN0aWNzLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGUvbmMtMS1iaWctU3RhdGlzdGljcy5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTk0MGQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGUvbmMtMS1iaWctU3RhdGlzdGljcy5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZS9uYy0xLWJpZy1TdW1tYXJ5LmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGUvbmMtMS1iaWctU3VtbWFyeS5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjI0ZTA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGUvbmMtMS1iaWctU3VtbWFyeS5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZS9uYy0xLWJpZy1UT0MudHh0IGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGUvbmMtMS1iaWctVE9DLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWE5MTJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGUvbmMtMS1iaWctVE9DLnR4dApAQCAtMCwwICsxLDggQEAKK1RPQy50eHQKK0RhdGEuZGIKK1N0YXRpc3RpY3MuZGIKK1N1bW1hcnkuZGIKK0ZpbHRlci5kYgorRGlnZXN0LmNyYzMyCitJbmRleC5kYgorQ29tcHJlc3Npb25JbmZvLmRiCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZV9jb3VudGVyL25jLTEtYmlnLUNvbXByZXNzaW9uSW5mby5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlX2NvdW50ZXIvbmMtMS1iaWctQ29tcHJlc3Npb25JbmZvLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYjlhYTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZV9jb3VudGVyL25jLTEtYmlnLUNvbXByZXNzaW9uSW5mby5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZV9jb3VudGVyL25jLTEtYmlnLURhdGEuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZV9jb3VudGVyL25jLTEtYmlnLURhdGEuZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQzMWUzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlX2NvdW50ZXIvbmMtMS1iaWctRGF0YS5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZV9jb3VudGVyL25jLTEtYmlnLURpZ2VzdC5jcmMzMiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlX2NvdW50ZXIvbmMtMS1iaWctRGlnZXN0LmNyYzMyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NjQxMTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZV9jb3VudGVyL25jLTEtYmlnLURpZ2VzdC5jcmMzMgpAQCAtMCwwICsxIEBACis0MDQ1OTM3NzAxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGVfY291bnRlci9uYy0xLWJpZy1GaWx0ZXIuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZV9jb3VudGVyL25jLTEtYmlnLUZpbHRlci5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODY4ZTVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGVfY291bnRlci9uYy0xLWJpZy1GaWx0ZXIuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGVfY291bnRlci9uYy0xLWJpZy1JbmRleC5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlX2NvdW50ZXIvbmMtMS1iaWctSW5kZXguZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllNjVjYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlX2NvdW50ZXIvbmMtMS1iaWctSW5kZXguZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGVfY291bnRlci9uYy0xLWJpZy1TdGF0aXN0aWNzLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGVfY291bnRlci9uYy0xLWJpZy1TdGF0aXN0aWNzLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZDc5ZjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZV9jb3VudGVyL25jLTEtYmlnLVN0YXRpc3RpY3MuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGVfY291bnRlci9uYy0xLWJpZy1TdW1tYXJ5LmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGVfY291bnRlci9uYy0xLWJpZy1TdW1tYXJ5LmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMjRlMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZV9jb3VudGVyL25jLTEtYmlnLVN1bW1hcnkuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGVfY291bnRlci9uYy0xLWJpZy1UT0MudHh0IGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGVfY291bnRlci9uYy0xLWJpZy1UT0MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYTkxMmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZV9jb3VudGVyL25jLTEtYmlnLVRPQy50eHQKQEAgLTAsMCArMSw4IEBACitUT0MudHh0CitEYXRhLmRiCitTdGF0aXN0aWNzLmRiCitTdW1tYXJ5LmRiCitGaWx0ZXIuZGIKK0RpZ2VzdC5jcmMzMgorSW5kZXguZGIKK0NvbXByZXNzaW9uSW5mby5kYgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L2RiLlJhbmdlU2xpY2VDb21tYW5kLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9kYi5SYW5nZVNsaWNlQ29tbWFuZC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YTBiMDUuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L2RiLlJhbmdlU2xpY2VDb21tYW5kLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9kYi5Sb3cuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L2RiLlJvdy5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZGU4YmIuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L2RiLlJvdy5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvZGIuUm93TXV0YXRpb24uYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L2RiLlJvd011dGF0aW9uLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ2NTIyMC4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvZGIuUm93TXV0YXRpb24uYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L2RiLlNsaWNlQnlOYW1lc1JlYWRDb21tYW5kLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9kYi5TbGljZUJ5TmFtZXNSZWFkQ29tbWFuZC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODkyZDUuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L2RiLlNsaWNlQnlOYW1lc1JlYWRDb21tYW5kLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9kYi5TbGljZUZyb21SZWFkQ29tbWFuZC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvZGIuU2xpY2VGcm9tUmVhZENvbW1hbmQuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTYwZDI0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9kYi5TbGljZUZyb21SZWFkQ29tbWFuZC5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvZGIuVHJ1bmNhdGlvbi5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvZGIuVHJ1bmNhdGlvbi5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNjc5OTUuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L2RiLlRydW5jYXRpb24uYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L2RiLldyaXRlUmVzcG9uc2UuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L2RiLldyaXRlUmVzcG9uc2UuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDc2MjM4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9kYi5Xcml0ZVJlc3BvbnNlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9nbXMuRW5kcG9pbnRTdGF0ZS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvZ21zLkVuZHBvaW50U3RhdGUuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTRiY2VkLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9nbXMuRW5kcG9pbnRTdGF0ZS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvZ21zLkdvc3NpcC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvZ21zLkdvc3NpcC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYjI3YTguLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L2dtcy5Hb3NzaXAuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L3NlcnZpY2UuVHJlZVJlcXVlc3QuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L3NlcnZpY2UuVHJlZVJlcXVlc3QuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQ3ZTJhLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9zZXJ2aWNlLlRyZWVSZXF1ZXN0LmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9zZXJ2aWNlLlRyZWVSZXNwb25zZS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvc2VydmljZS5UcmVlUmVzcG9uc2UuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzM3Nzg1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9zZXJ2aWNlLlRyZWVSZXNwb25zZS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvc3RyZWFtaW5nLlBlbmRpbmdGaWxlLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9zdHJlYW1pbmcuUGVuZGluZ0ZpbGUuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzBkNjFhLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9zdHJlYW1pbmcuUGVuZGluZ0ZpbGUuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L3N0cmVhbWluZy5TdHJlYW1IZWFkZXIuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L3N0cmVhbWluZy5TdHJlYW1IZWFkZXIuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDIxYTY4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9zdHJlYW1pbmcuU3RyZWFtSGVhZGVyLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9zdHJlYW1pbmcuU3RyZWFtUmVwbHkuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L3N0cmVhbWluZy5TdHJlYW1SZXBseS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNzQwNTguLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L3N0cmVhbWluZy5TdHJlYW1SZXBseS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvc3RyZWFtaW5nLlN0cmVhbVJlcXVlc3RNZXNzYWdlLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9zdHJlYW1pbmcuU3RyZWFtUmVxdWVzdE1lc3NhZ2UuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2Y4ZDBlLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9zdHJlYW1pbmcuU3RyZWFtUmVxdWVzdE1lc3NhZ2UuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L3V0aWxzLkJsb29tRmlsdGVyLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy91dGlscy5CbG9vbUZpbHRlci5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZDdmYmEuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L3V0aWxzLkJsb29tRmlsdGVyLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy91dGlscy5Fc3RpbWF0ZWRIaXN0b2dyYW0uYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L3V0aWxzLkVzdGltYXRlZEhpc3RvZ3JhbS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZGQzOWIuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L3V0aWxzLkVzdGltYXRlZEhpc3RvZ3JhbS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvdXRpbHMuTGVnYWN5Qmxvb21GaWx0ZXIuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L3V0aWxzLkxlZ2FjeUJsb29tRmlsdGVyLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFlZjFiOC4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvdXRpbHMuTGVnYWN5Qmxvb21GaWx0ZXIuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLlJhbmdlU2xpY2VDb21tYW5kLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5SYW5nZVNsaWNlQ29tbWFuZC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMjQ5MTUuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLlJhbmdlU2xpY2VDb21tYW5kLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5Sb3cuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLlJvdy5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NTBmNDEuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLlJvdy5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvZGIuUm93TXV0YXRpb24uYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLlJvd011dGF0aW9uLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk5MmNiNS4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvZGIuUm93TXV0YXRpb24uYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLlNsaWNlQnlOYW1lc1JlYWRDb21tYW5kLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5TbGljZUJ5TmFtZXNSZWFkQ29tbWFuZC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODkyZDUuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLlNsaWNlQnlOYW1lc1JlYWRDb21tYW5kLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5TbGljZUZyb21SZWFkQ29tbWFuZC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvZGIuU2xpY2VGcm9tUmVhZENvbW1hbmQuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTYwZDI0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5TbGljZUZyb21SZWFkQ29tbWFuZC5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvZGIuVHJ1bmNhdGlvbi5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvZGIuVHJ1bmNhdGlvbi5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNjc5OTUuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLlRydW5jYXRpb24uYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLldyaXRlUmVzcG9uc2UuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLldyaXRlUmVzcG9uc2UuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDc2MjM4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5Xcml0ZVJlc3BvbnNlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5taWdyYXRpb24uS2V5c3BhY2UxLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5taWdyYXRpb24uS2V5c3BhY2UxLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIzOWM1ZS4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvZGIubWlncmF0aW9uLktleXNwYWNlMS5iaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi23bC9EbDdJblI1Y0dVaU9pSnlaV052Y21RaUxDSnVZVzFsSWpvaVRXbG5jbUYwYVc5dUlpd2libUZ0WlhOd1lXTmxJam9pYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV2xuY21GMGFXOXVMbUYyY204aUxDSm1hV1ZzWkhNaU9sdDdJbTVoYldVaU9pSnZiR1JmZG1WeWMybHZiaUlzSW5SNWNHVWlPbnNpZEhsd1pTSTZJbVpwZUdWa0lpd2libUZ0WlNJNklsVlZTVVFpTENKdVlXMWxjM0JoWTJVaU9pSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzUxZEdsc2N5NWhkbkp2SWl3aWMybDZaU0k2TVRaOWZTeDdJbTVoYldVaU9pSnVaWGRmZG1WeWMybHZiaUlzSW5SNWNHVWlPaUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1MWRHbHNjeTVoZG5KdkxsVlZTVVFpZlN4N0ltNWhiV1VpT2lKeWIzZGZiWFYwWVhScGIyNGlMQ0owZVhCbElqb2lZbmwwWlhNaWZTeDdJbTVoYldVaU9pSmpiR0Z6YzI1aGJXVWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2liV2xuY21GMGFXOXVJaXdpZEhsd1pTSTZXM3NpZEhsd1pTSTZJbkpsWTI5eVpDSXNJbTVoYldVaU9pSkJaR1JEYjJ4MWJXNUdZVzFwYkhraUxDSm1hV1ZzWkhNaU9sdDdJbTVoYldVaU9pSmpaaUlzSW5SNWNHVWlPbnNpZEhsd1pTSTZJbkpsWTI5eVpDSXNJbTVoYldVaU9pSkRaa1JsWmlJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltdGxlWE53WVdObElpd2lkSGx3WlNJNkluTjBjbWx1WnlKOUxIc2libUZ0WlNJNkltNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pWTI5c2RXMXVYM1I1Y0dVaUxDSjBlWEJsSWpwYkluTjBjbWx1WnlJc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaVkyOXRjR0Z5WVhSdmNsOTBlWEJsSWl3aWRIbHdaU0k2V3lKemRISnBibWNpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5OMVltTnZiWEJoY21GMGIzSmZkSGx3WlNJc0luUjVjR1VpT2xzaWMzUnlhVzVuSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKamIyMXRaVzUwSWl3aWRIbHdaU0k2V3lKemRISnBibWNpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5emFYcGxJaXdpZEhsd1pTSTZXeUprYjNWaWJHVWlMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbXRsZVY5allXTm9aVjl6YVhwbElpd2lkSGx3WlNJNld5SmtiM1ZpYkdVaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluSmxZV1JmY21Wd1lXbHlYMk5vWVc1alpTSXNJblI1Y0dVaU9sc2laRzkxWW14bElpd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSnlaWEJzYVdOaGRHVmZiMjVmZDNKcGRHVWlMQ0owZVhCbElqb2lZbTl2YkdWaGJpSXNJbVJsWm1GMWJIUWlPbVpoYkhObGZTeDdJbTVoYldVaU9pSm5ZMTluY21GalpWOXpaV052Ym1Seklpd2lkSGx3WlNJNld5SnBiblFpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW1SbFptRjFiSFJmZG1Gc2FXUmhkR2x2Ymw5amJHRnpjeUlzSW5SNWNHVWlPbHNpYm5Wc2JDSXNJbk4wY21sdVp5SmRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSnJaWGxmZG1Gc2FXUmhkR2x2Ymw5amJHRnpjeUlzSW5SNWNHVWlPbHNpYm5Wc2JDSXNJbk4wY21sdVp5SmRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSnRhVzVmWTI5dGNHRmpkR2x2Ymw5MGFISmxjMmh2YkdRaUxDSjBlWEJsSWpwYkltNTFiR3dpTENKcGJuUWlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMHNleUp1WVcxbElqb2liV0Y0WDJOdmJYQmhZM1JwYjI1ZmRHaHlaWE5vYjJ4a0lpd2lkSGx3WlNJNld5SnVkV3hzSWl3aWFXNTBJbDBzSW1SbFptRjFiSFFpT201MWJHeDlMSHNpYm1GdFpTSTZJbkp2ZDE5allXTm9aVjl6WVhabFgzQmxjbWx2WkY5cGJsOXpaV052Ym1Seklpd2lkSGx3WlNJNld5SnBiblFpTENKdWRXeHNJbDBzSW1SbFptRjFiSFFpT2pCOUxIc2libUZ0WlNJNkltdGxlVjlqWVdOb1pWOXpZWFpsWDNCbGNtbHZaRjlwYmw5elpXTnZibVJ6SWl3aWRIbHdaU0k2V3lKcGJuUWlMQ0p1ZFd4c0lsMHNJbVJsWm1GMWJIUWlPak0yTURCOUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXJaWGx6WDNSdlgzTmhkbVVpTENKMGVYQmxJanBiSW01MWJHd2lMQ0pwYm5RaVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaWJXVnlaMlZmYzJoaGNtUnpYMk5vWVc1alpTSXNJblI1Y0dVaU9sc2liblZzYkNJc0ltUnZkV0pzWlNKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKcFpDSXNJblI1Y0dVaU9sc2lhVzUwSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKamIyeDFiVzVmYldWMFlXUmhkR0VpTENKMGVYQmxJanBiZXlKMGVYQmxJam9pWVhKeVlYa2lMQ0pwZEdWdGN5STZleUowZVhCbElqb2ljbVZqYjNKa0lpd2libUZ0WlNJNklrTnZiSFZ0YmtSbFppSXNJbVpwWld4a2N5STZXM3NpYm1GdFpTSTZJbTVoYldVaUxDSjBlWEJsSWpvaVlubDBaWE1pZlN4N0ltNWhiV1VpT2lKMllXeHBaR0YwYVc5dVgyTnNZWE56SWl3aWRIbHdaU0k2SW5OMGNtbHVaeUo5TEhzaWJtRnRaU0k2SW1sdVpHVjRYM1I1Y0dVaUxDSjBlWEJsSWpwYmV5SjBlWEJsSWpvaVpXNTFiU0lzSW01aGJXVWlPaUpKYm1SbGVGUjVjR1VpTENKemVXMWliMnh6SWpwYklrdEZXVk1pTENKRFZWTlVUMDBpWFN3aVlXeHBZWE5sY3lJNld5SnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqYjI1bWFXY3VZWFp5Ynk1SmJtUmxlRlI1Y0dVaVhYMHNJbTUxYkd3aVhYMHNleUp1WVcxbElqb2lhVzVrWlhoZmJtRnRaU0lzSW5SNWNHVWlPbHNpYzNSeWFXNW5JaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUpwYm1SbGVGOXZjSFJwYjI1eklpd2lkSGx3WlNJNld5SnVkV3hzSWl4N0luUjVjR1VpT2lKdFlYQWlMQ0oyWVd4MVpYTWlPaUp6ZEhKcGJtY2lmVjBzSW1SbFptRjFiSFFpT201MWJHeDlYU3dpWVd4cFlYTmxjeUk2V3lKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpiMjVtYVdjdVlYWnlieTVEYjJ4MWJXNUVaV1lpWFgxOUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXdjbTkyYVdSbGNpSXNJblI1Y0dVaU9sc2ljM1J5YVc1bklpd2liblZzYkNKZExDSmtaV1poZFd4MElqb2liM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVRMjl1WTNWeWNtVnVkRXhwYm10bFpFaGhjMmhEWVdOb1pWQnliM1pwWkdWeUluMHNleUp1WVcxbElqb2lhMlY1WDJGc2FXRnpJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpd2lZbmwwWlhNaVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaVkyOXRjR0ZqZEdsdmJsOXpkSEpoZEdWbmVTSXNJblI1Y0dVaU9sc2liblZzYkNJc0luTjBjbWx1WnlKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKamIyMXdZV04wYVc5dVgzTjBjbUYwWldkNVgyOXdkR2x2Ym5NaUxDSjBlWEJsSWpwYkltNTFiR3dpTEhzaWRIbHdaU0k2SW0xaGNDSXNJblpoYkhWbGN5STZJbk4wY21sdVp5SjlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMHNleUp1WVcxbElqb2lZMjl0Y0hKbGMzTnBiMjVmYjNCMGFXOXVjeUlzSW5SNWNHVWlPbHNpYm5Wc2JDSXNleUowZVhCbElqb2liV0Z3SWl3aWRtRnNkV1Z6SWpvaWMzUnlhVzVuSW4xZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKaWJHOXZiVjltYVd4MFpYSmZabkJmWTJoaGJtTmxJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpd2laRzkxWW14bElsMHNJbVJsWm1GMWJIUWlPbTUxYkd4OVhTd2lZV3hwWVhObGN5STZXeUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1amIyNW1hV2N1WVhaeWJ5NURaa1JsWmlKZGZYMWRmU3g3SW5SNWNHVWlPaUp5WldOdmNtUWlMQ0p1WVcxbElqb2lSSEp2Y0VOdmJIVnRia1poYldsc2VTSXNJbVpwWld4a2N5STZXM3NpYm1GdFpTSTZJbXR6Ym1GdFpTSXNJblI1Y0dVaU9pSnpkSEpwYm1jaWZTeDdJbTVoYldVaU9pSmpabTVoYldVaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4xZGZTeDdJblI1Y0dVaU9pSnlaV052Y21RaUxDSnVZVzFsSWpvaVFXUmtTMlY1YzNCaFkyVWlMQ0ptYVdWc1pITWlPbHQ3SW01aGJXVWlPaUpyY3lJc0luUjVjR1VpT25zaWRIbHdaU0k2SW5KbFkyOXlaQ0lzSW01aGJXVWlPaUpMYzBSbFppSXNJbVpwWld4a2N5STZXM3NpYm1GdFpTSTZJbTVoYldVaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4wc2V5SnVZVzFsSWpvaWMzUnlZWFJsWjNsZlkyeGhjM01pTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pYzNSeVlYUmxaM2xmYjNCMGFXOXVjeUlzSW5SNWNHVWlPbHQ3SW5SNWNHVWlPaUp0WVhBaUxDSjJZV3gxWlhNaU9pSnpkSEpwYm1jaWZTd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSnlaWEJzYVdOaGRHbHZibDltWVdOMGIzSWlMQ0owZVhCbElqcGJJbWx1ZENJc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaVkyWmZaR1ZtY3lJc0luUjVjR1VpT25zaWRIbHdaU0k2SW1GeWNtRjVJaXdpYVhSbGJYTWlPaUpEWmtSbFppSjlmU3g3SW01aGJXVWlPaUprZFhKaFlteGxYM2R5YVhSbGN5SXNJblI1Y0dVaU9pSmliMjlzWldGdUlpd2laR1ZtWVhWc2RDSTZkSEoxWlgxZExDSmhiR2xoYzJWeklqcGJJbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1OdmJtWnBaeTVoZG5KdkxrdHpSR1ZtSWwxOWZWMTlMSHNpZEhsd1pTSTZJbkpsWTI5eVpDSXNJbTVoYldVaU9pSkVjbTl3UzJWNWMzQmhZMlVpTENKbWFXVnNaSE1pT2x0N0ltNWhiV1VpT2lKcmMyNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjFkZlN4N0luUjVjR1VpT2lKeVpXTnZjbVFpTENKdVlXMWxJam9pVlhCa1lYUmxTMlY1YzNCaFkyVWlMQ0ptYVdWc1pITWlPbHQ3SW01aGJXVWlPaUp2YkdSTGN5SXNJblI1Y0dVaU9pSkxjMFJsWmlKOUxIc2libUZ0WlNJNkltNWxkMHR6SWl3aWRIbHdaU0k2SWt0elJHVm1JbjFkZlN4N0luUjVjR1VpT2lKeVpXTnZjbVFpTENKdVlXMWxJam9pVlhCa1lYUmxRMjlzZFcxdVJtRnRhV3g1SWl3aVptbGxiR1J6SWpwYmV5SnVZVzFsSWpvaWJXVjBZV1JoZEdFaUxDSjBlWEJsSWpvaVEyWkVaV1lpZlYxOVhYMWRmYWhMODFCM1dSSGhBQUQranI3cTJmeW9UQnBnZDFrUjRRQUEvbzYrNnRuOHVzOENBQVp6ZVhOMFpXMEFKR0U0TkdNeFlUWXdMVGMzTlRrdE1URmxNUzB3TURBd0xXWmxPR1ZpWldWaFpEbG1Zd0FBQUFFQUFBQURBUUFBQUFPQUFBQUFnQUFBQUFBQUFBQUFBQUFLQUF0QmRuSnZMMU5qYUdWdFlRQUFBQUUyVDZnUENnQUFDdTk3SW5SNWNHVWlPaUp5WldOdmNtUWlMQ0p1WVcxbElqb2lTM05FWldZaUxDSnVZVzFsYzNCaFkyVWlPaUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRhV2R5WVhScGIyNHVZWFp5YnlJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pYzNSeVlYUmxaM2xmWTJ4aGMzTWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2ljM1J5WVhSbFozbGZiM0IwYVc5dWN5SXNJblI1Y0dVaU9sdDdJblI1Y0dVaU9pSnRZWEFpTENKMllXeDFaWE1pT2lKemRISnBibWNpZlN3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJaUxDSjBlWEJsSWpwYkltbHVkQ0lzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pWTJaZlpHVm1jeUlzSW5SNWNHVWlPbnNpZEhsd1pTSTZJbUZ5Y21GNUlpd2lhWFJsYlhNaU9uc2lkSGx3WlNJNkluSmxZMjl5WkNJc0ltNWhiV1VpT2lKRFprUmxaaUlzSW1acFpXeGtjeUk2VzNzaWJtRnRaU0k2SW10bGVYTndZV05sSWl3aWRIbHdaU0k2SW5OMGNtbHVaeUo5TEhzaWJtRnRaU0k2SW01aGJXVWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2lZMjlzZFcxdVgzUjVjR1VpTENKMGVYQmxJanBiSW5OMGNtbHVaeUlzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pWTI5dGNHRnlZWFJ2Y2w5MGVYQmxJaXdpZEhsd1pTSTZXeUp6ZEhKcGJtY2lMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbk4xWW1OdmJYQmhjbUYwYjNKZmRIbHdaU0lzSW5SNWNHVWlPbHNpYzNSeWFXNW5JaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUpqYjIxdFpXNTBJaXdpZEhsd1pTSTZXeUp6ZEhKcGJtY2lMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbkp2ZDE5allXTm9aVjl6YVhwbElpd2lkSGx3WlNJNld5SmtiM1ZpYkdVaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkltdGxlVjlqWVdOb1pWOXphWHBsSWl3aWRIbHdaU0k2V3lKa2IzVmliR1VpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5KbFlXUmZjbVZ3WVdseVgyTm9ZVzVqWlNJc0luUjVjR1VpT2xzaVpHOTFZbXhsSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKeVpYQnNhV05oZEdWZmIyNWZkM0pwZEdVaUxDSjBlWEJsSWpvaVltOXZiR1ZoYmlJc0ltUmxabUYxYkhRaU9tWmhiSE5sZlN4N0ltNWhiV1VpT2lKblkxOW5jbUZqWlY5elpXTnZibVJ6SWl3aWRIbHdaU0k2V3lKcGJuUWlMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbVJsWm1GMWJIUmZkbUZzYVdSaGRHbHZibDlqYkdGemN5SXNJblI1Y0dVaU9sc2liblZzYkNJc0luTjBjbWx1WnlKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKclpYbGZkbUZzYVdSaGRHbHZibDlqYkdGemN5SXNJblI1Y0dVaU9sc2liblZzYkNJc0luTjBjbWx1WnlKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKdGFXNWZZMjl0Y0dGamRHbHZibDkwYUhKbGMyaHZiR1FpTENKMGVYQmxJanBiSW01MWJHd2lMQ0pwYm5RaVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaWJXRjRYMk52YlhCaFkzUnBiMjVmZEdoeVpYTm9iMnhrSWl3aWRIbHdaU0k2V3lKdWRXeHNJaXdpYVc1MElsMHNJbVJsWm1GMWJIUWlPbTUxYkd4OUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXpZWFpsWDNCbGNtbHZaRjlwYmw5elpXTnZibVJ6SWl3aWRIbHdaU0k2V3lKcGJuUWlMQ0p1ZFd4c0lsMHNJbVJsWm1GMWJIUWlPakI5TEhzaWJtRnRaU0k2SW10bGVWOWpZV05vWlY5ellYWmxYM0JsY21sdlpGOXBibDl6WldOdmJtUnpJaXdpZEhsd1pTSTZXeUpwYm5RaUxDSnVkV3hzSWwwc0ltUmxabUYxYkhRaU9qTTJNREI5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5clpYbHpYM1J2WDNOaGRtVWlMQ0owZVhCbElqcGJJbTUxYkd3aUxDSnBiblFpWFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pYldWeVoyVmZjMmhoY21SelgyTm9ZVzVqWlNJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW1SdmRXSnNaU0pkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUpwWkNJc0luUjVjR1VpT2xzaWFXNTBJaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUpqYjJ4MWJXNWZiV1YwWVdSaGRHRWlMQ0owZVhCbElqcGJleUowZVhCbElqb2lZWEp5WVhraUxDSnBkR1Z0Y3lJNmV5SjBlWEJsSWpvaWNtVmpiM0prSWl3aWJtRnRaU0k2SWtOdmJIVnRia1JsWmlJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltNWhiV1VpTENKMGVYQmxJam9pWW5sMFpYTWlmU3g3SW01aGJXVWlPaUoyWVd4cFpHRjBhVzl1WDJOc1lYTnpJaXdpZEhsd1pTSTZJbk4wY21sdVp5SjlMSHNpYm1GdFpTSTZJbWx1WkdWNFgzUjVjR1VpTENKMGVYQmxJanBiZXlKMGVYQmxJam9pWlc1MWJTSXNJbTVoYldVaU9pSkpibVJsZUZSNWNHVWlMQ0p6ZVcxaWIyeHpJanBiSWt0RldWTWlMQ0pEVlZOVVQwMGlYU3dpWVd4cFlYTmxjeUk2V3lKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpiMjVtYVdjdVlYWnlieTVKYm1SbGVGUjVjR1VpWFgwc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaWFXNWtaWGhmYm1GdFpTSXNJblI1Y0dVaU9sc2ljM1J5YVc1bklpd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSnBibVJsZUY5dmNIUnBiMjV6SWl3aWRIbHdaU0k2V3lKdWRXeHNJaXg3SW5SNWNHVWlPaUp0WVhBaUxDSjJZV3gxWlhNaU9pSnpkSEpwYm1jaWZWMHNJbVJsWm1GMWJIUWlPbTUxYkd4OVhTd2lZV3hwWVhObGN5STZXeUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1amIyNW1hV2N1WVhaeWJ5NURiMngxYlc1RVpXWWlYWDE5TENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5d2NtOTJhV1JsY2lJc0luUjVjR1VpT2xzaWMzUnlhVzVuSWl3aWJuVnNiQ0pkTENKa1pXWmhkV3gwSWpvaWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVEyOXVZM1Z5Y21WdWRFeHBibXRsWkVoaGMyaERZV05vWlZCeWIzWnBaR1Z5SW4wc2V5SnVZVzFsSWpvaWEyVjVYMkZzYVdGeklpd2lkSGx3WlNJNld5SnVkV3hzSWl3aVlubDBaWE1pWFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pWTI5dGNHRmpkR2x2Ymw5emRISmhkR1ZuZVNJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW5OMGNtbHVaeUpkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUpqYjIxd1lXTjBhVzl1WDNOMGNtRjBaV2Q1WDI5d2RHbHZibk1pTENKMGVYQmxJanBiSW01MWJHd2lMSHNpZEhsd1pTSTZJbTFoY0NJc0luWmhiSFZsY3lJNkluTjBjbWx1WnlKOVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaVkyOXRjSEpsYzNOcGIyNWZiM0IwYVc5dWN5SXNJblI1Y0dVaU9sc2liblZzYkNJc2V5SjBlWEJsSWpvaWJXRndJaXdpZG1Gc2RXVnpJam9pYzNSeWFXNW5JbjFkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUppYkc5dmJWOW1hV3gwWlhKZlpuQmZZMmhoYm1ObElpd2lkSGx3WlNJNld5SnVkV3hzSWl3aVpHOTFZbXhsSWwwc0ltUmxabUYxYkhRaU9tNTFiR3g5WFN3aVlXeHBZWE5sY3lJNld5SnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqYjI1bWFXY3VZWFp5Ynk1RFprUmxaaUpkZlgxOUxIc2libUZ0WlNJNkltUjFjbUZpYkdWZmQzSnBkR1Z6SWl3aWRIbHdaU0k2SW1KdmIyeGxZVzRpTENKa1pXWmhkV3gwSWpwMGNuVmxmVjBzSW1Gc2FXRnpaWE1pT2xzaWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMjl1Wm1sbkxtRjJjbTh1UzNORVpXWWlYWDBBRFV0bGVVTmhZMmhsVTNCaFkyVUFBQUFCTmsrb0R3b0FBQVJ3R2t0bGVVTmhZMmhsVTNCaFkyVldiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1Ykc5allYUnZjaTVUYVcxd2JHVlRkSEpoZEdWbmVRQUNKSEpsY0d4cFkyRjBhVzl1WDJaaFkzUnZjZ0l4QUFJR0drdGxlVU5oWTJobFUzQmhZMlVTVTNSaGJtUmhjbVF6QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBOEQ4QW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBcGhBQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBYVMyVjVRMkZqYUdWVGNHRmpaUkpUZEdGdVpHRnlaRElBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUR3UHdDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NrRUFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJwTFpYbERZV05vWlZOd1lXTmxFbE4wWVc1a1lYSmtNUUFRVTNSaGJtUmhjbVFBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT0EvQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BS0lRQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBQUFFQUNVdGxlWE53WVdObE1RQUFBQUUyVDZnUENnQUFKdUFTUzJWNWMzQmhZMlV4Vm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExteHZZMkYwYjNJdVUybHRjR3hsVTNSeVlYUmxaM2tBQWlSeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJQ01RQUNOQkpMWlhsemNHRmpaVEVhVTNWd1pYSkVhWEpsWTNSSFF3QUtVM1Z3WlhJQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFBQUFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3RDBEd0FBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQkpMWlhsemNHRmpaVEVRU21SaVkxVjBaamdBRUZOMFlXNWtZWEprQUZCdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMbFZVUmpoVWVYQmxBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFhZ2hCQUpxWm1abVptYmsvQVFDQXZHa0NVRzl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVZWUkdPRlI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEErQThBQWhCbWIzSjBlWFIzYjFadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa2x1ZEdWblpYSlVlWEJsQWdBUVEyOXNkVzF1TkRJQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBU1MyVjVjM0JoWTJVeEVrcGtZbU5CYzJOcGFRQVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFYTmphV2xVZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWFnaEJBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UVhOamFXbFVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FQNFBBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFFa3RsZVhOd1lXTmxNUXhUZFhCbGNqRUFDbE4xY0dWeUFGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFCUWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVNYjI1blZIbHdaUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BTjRQQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBRWt0bGVYTndZV05sTVNCV1lXeDFaWE5YYVhSb1VYVnZkR1Z6QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJxQ0VFQW1wbVptWm1adVQ4QkFJQzhhUUpRYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNVZWRVk0Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0RjRHdBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRFTVUzVndaWEl5QUFwVGRYQmxjZ0JTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUFVRzl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVRHOXVaMVI1Y0dVQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdEZ0R3QUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpURU1VM1Z3WlhJekFBcFRkWEJsY2dCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VBVUc5eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VURzl1WjFSNWNHVUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3RGlEd0FBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQkpMWlhsemNHRmpaVEVNVTNWd1pYSTBBQXBUZFhCbGNnQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQVVHOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1VlZSR09GUjVjR1VBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0RrRHdBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRFTVUzVndaWEkxQUFwVGRYQmxjZ0JTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QTVnOEFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVXhERk4xY0dWeU5nQUtVM1Z3WlhJQVhtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1VEdWNGFXTmhiRlZWU1VSVWVYQmxBRkJ2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xsVlVSamhVZVhCbEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QTZBOEFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVXhHbE4xY0dWeVEyOTFiblJsY2pFQUNsTjFjR1Z5QUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUJTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHb0lRUUNhbVptWm1abTVQd0VBZ0x4cEFtSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtOdmRXNTBaWEpEYjJ4MWJXNVVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFnQUFBQUFBQVBBL0FQSVBBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFFa3RsZVhOd1lXTmxNUkJLWkdKalRHOXVad0FRVTNSaGJtUmhjbVFBVUc5eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VURzl1WjFSNWNHVUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQnFDRUVBbXBtWm1abVp1VDhCQUlDOGFRSlFiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1TWIyNW5WSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3RDZEd0FBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQkpMWlhsemNHRmpaVEVTVTNSaGJtUmhjbVEwQUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBMWc4QUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBU1MyVjVjM0JoWTJVeEVFbHVaR1Y0WldReUFCQlRkR0Z1WkdGeVpBQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRWE5qYVdsVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QTdBOEFBaEppYVhKMGFHUmhkR1ZRYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNU1iMjVuVkhsd1pRSUFKRFl5TmprM01qYzBOamcyTkRZeE56UTJOUUFBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQkpMWlhsemNHRmpaVEVXU21SaVkwbHVkR1ZuWlhJQUVGTjBZVzVrWVhKa0FGWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtsdWRHVm5aWEpVZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWFnaEJBSnFabVptWm1iay9BUUNBdkdrQ1ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1U1c1MFpXZGxjbFI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEE5ZzhBQWdJcVVHOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1VlZSR09GUjVjR1VDQUJCRGIyeDFiVzQwTWdBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRFU1UzUmhibVJoY21RekFCQlRkR0Z1WkdGeVpBQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QTFBOEFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVXhFRWx1WkdWNFpXUXhBQkJUZEdGdVpHRnlaQUJTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbXBtWm1abVp1VDhCQUlDOGFRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UVhOamFXbFVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEE2ZzhBQWhKaWFYSjBhR1JoZEdWUWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVNYjI1blZIbHdaUUFBQUNRMk1qWTVOekkzTkRZNE5qUTJNVGMwTmpVQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBU1MyVjVjM0JoWTJVeEVsTjBZVzVrWVhKa01nQVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FOSVBBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFFa3RsZVhOd1lXTmxNUkpUZEdGdVpHRnlaREVBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0RRRHdBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRFd1UzUmhibVJoY21SRWVXNWhiV2xqUTI5dGNHOXphWFJsQUJCVGRHRnVaR0Z5WkFDa0FtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UkhsdVlXMXBZME52YlhCdmMybDBaVlI1Y0dVb2REMCtiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1VWFXMWxWVlZKUkZSNWNHVXNZajArYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVXBBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFhZ2hCQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BSUlRQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBRWt0bGVYTndZV05sTVNKVGRHRnVaR0Z5WkVOdmJYQnZjMmwwWlFBUVUzUmhibVJoY21RQTRnSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtOdmJYQnZjMmwwWlZSNWNHVW9iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVc2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVVYVcxbFZWVkpSRlI1Y0dVc2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVKYm5SbFoyVnlWSGx3WlNrQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFCcUNFRUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QWdCQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVXhFa3BrWW1OQ2VYUmxjd0FRVTNSaGJtUmhjbVFBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFhZ2hCQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BUHdQQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBRWt0bGVYTndZV05sTVNCVGRHRnVaR0Z5WkVsdWRHVm5aWEl4QUJCVGRHRnVaR0Z5WkFCV2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVKYm5SbFoyVnlWSGx3WlFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdEdUR3QUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpURVFRMjkxYm5SbGNqRUFFRk4wWVc1a1lYSmtBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHb0lRUUNhbVptWm1abTVQd0VBZ0x4cEFtSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtOdmRXNTBaWEpEYjJ4MWJXNVVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFnQUFBQUFBQVBBL0FQQVBBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFFa3RsZVhOd1lXTmxNUnBUZEdGdVpHRnlaRXh2Ym1jeUFCQlRkR0Z1WkdGeVpBQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QTJnOEFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVXhHbE4wWVc1a1lYSmtURzl1WnpFQUVGTjBZVzVrWVhKa0FGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdEWUR3QUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFBQUJBQWxMWlhsemNHRmpaVElBQUFBQk5rK29Ed29BQUFlcEVrdGxlWE53WVdObE1sWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVzYjJOaGRHOXlMbE5wYlhCc1pWTjBjbUYwWldkNUFBSWtjbVZ3YkdsallYUnBiMjVmWm1GamRHOXlBakVBQWdvU1MyVjVjM0JoWTJVeUVFbHVaR1Y0WldReEFCQlRkR0Z1WkdGeVpBQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRWE5qYVdsVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QWpCQUFBaEppYVhKMGFHUmhkR1ZRYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNU1iMjVuVkhsd1pRQUFBQ1EyTWpZNU56STNORFk0TmpRMk1UYzBOalVBQUFCbWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVUyVnlhV0ZzYVhwcGJtZERZV05vWlZCeWIzWnBaR1Z5QUFKK2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1WTI5dGNHRmpkR2x2Ymk1VGFYcGxWR2xsY21Wa1EyOXRjR0ZqZEdsdmJsTjBjbUYwWldkNUFnQUNBQUFTUzJWNWMzQmhZMlV5RWxOMFlXNWtZWEprTXdBUVUzUmhibVJoY21RQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKcVptWm1abWJrL0FRQ0F2R2tDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUlBa0FBQUFBQUF2Ny8vLzhQQXBxWm1abVptYmsvQUlZUUFBQUFabTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1OaFkyaGxMbE5sY21saGJHbDZhVzVuUTJGamFHVlFjbTkyYVdSbGNnQUNmbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtTnZiWEJoWTNScGIyNHVVMmw2WlZScFpYSmxaRU52YlhCaFkzUnBiMjVUZEhKaGRHVm5lUUlBQWdBQUVrdGxlWE53WVdObE1oSlRkR0Z1WkdGeVpERUFFRk4wWVc1a1lYSmtBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3Q0VFQUFBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQkpMWlhsemNHRmpaVElNVTNWd1pYSXpBQXBUZFhCbGNnQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBaUJBQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBU1MyVjVjM0JoWTJVeURGTjFjR1Z5TkFBS1UzVndaWElBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBRmh2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xsUnBiV1ZWVlVsRVZIbHdaUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BSW9RQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBQUFFQUNVdGxlWE53WVdObE13QUFBQUUyVDZnUENnQUFBMUFTUzJWNWMzQmhZMlV6Vm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExteHZZMkYwYjNJdVUybHRjR3hsVTNSeVlYUmxaM2tBQWlSeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJQ05RQUNCQkpMWlhsemNHRmpaVE1RU1c1a1pYaGxaREVBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1QmMyTnBhVlI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NRRUFBQ0VtSnBjblJvWkdGMFpWQnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGt4dmJtZFVlWEJsQUFBQUpEWXlOamszTWpjME5qZzJORFl4TnpRMk5RQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpUTVNVM1JoYm1SaGNtUXhBQkJUZEdGdVpHRnlaQUJTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbXBtWm1abVp1VDhCQUlDOGFRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEFqaEFBQUFCbWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVUyVnlhV0ZzYVhwcGJtZERZV05vWlZCeWIzWnBaR1Z5QUFKK2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1WTI5dGNHRmpkR2x2Ymk1VGFYcGxWR2xsY21Wa1EyOXRjR0ZqZEdsdmJsTjBjbUYwWldkNUFnQUNBQUFBQVFBSlMyVjVjM0JoWTJVMEFBQUFBVFpQcUE4S0FBQUhoaEpMWlhsemNHRmpaVFJXYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdWJHOWpZWFJ2Y2k1VGFXMXdiR1ZUZEhKaGRHVm5lUUFDSkhKbGNHeHBZMkYwYVc5dVgyWmhZM1J2Y2dJekFBSUtFa3RsZVhOd1lXTmxOQkpUZEdGdVpHRnlaRE1BRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NVRUFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRRU1UzUmhibVJoY21ReEFCQlRkR0Z1WkdGeVpBQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QWtoQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVTBERk4xY0dWeU13QUtVM1Z3WlhJQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BSllRQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBRWt0bGVYTndZV05sTkF4VGRYQmxjalFBQ2xOMWNHVnlBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRQlliM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1VWFXMWxWVlZKUkZSNWNHVUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3Q1lFQUFBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQkpMWlhsemNHRmpaVFFNVTNWd1pYSTFBQXBUZFhCbGNnQlliM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1VWFXMWxWVlZKUkZSNWNHVUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QW1oQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQUFBUUFKUzJWNWMzQmhZMlUxQUFBQUFUWlBxQThLQUFBRERSSkxaWGx6Y0dGalpUVldiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1Ykc5allYUnZjaTVUYVcxd2JHVlRkSEpoZEdWbmVRQUNKSEpsY0d4cFkyRjBhVzl1WDJaaFkzUnZjZ0l5QUFJRUVrdGxlWE53WVdObE5SSlRkR0Z1WkdGeVpERUFFRk4wWVc1a1lYSmtBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3Q2NFQUFBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQkpMWlhsemNHRmpaVFVRUTI5MWJuUmxjakVBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrTnZkVzUwWlhKRGIyeDFiVzVVZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BSjRRQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBQUFFQUNVdGxlWE53WVdObE5nQUFBQUUyVDZnUENnQUFBZllTUzJWNWMzQmhZMlUyVm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExteHZZMkYwYjNJdVUybHRjR3hsVTNSeVlYUmxaM2tBQWlSeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJQ01RQUNBaEpMWlhsemNHRmpaVFlRU1c1a1pYaGxaREVBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1QmMyTnBhVlI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NnRUFBQ0VtSnBjblJvWkdGMFpWQnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGt4dmJtZFVlWEJsQUFBQUpEWXlOamszTWpjME5qZzJORFl4TnpRMk5RQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFBQUJBQkJPYjBOdmJXMXBkR3h2WjFOd1lXTmxBQUFBQVRaUHFBOEtBQUFCdWlCT2IwTnZiVzFwZEd4dloxTndZV05sVm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExteHZZMkYwYjNJdVUybHRjR3hsVTNSeVlYUmxaM2tBQWlSeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJQ01RQUNBaUJPYjBOdmJXMXBkR3h2WjFOd1lXTmxFbE4wWVc1a1lYSmtNUUFRVTNSaGJtUmhjbVFBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BS3dRQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBQUFBQURWSnZkME5oWTJobFUzQmhZMlVBQUFBQk5rK29Ed29BQUFNV0dsSnZkME5oWTJobFUzQmhZMlZXYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdWJHOWpZWFJ2Y2k1VGFXMXdiR1ZUZEhKaGRHVm5lUUFDSkhKbGNHeHBZMkYwYVc5dVgyWmhZM1J2Y2dJeEFBSUVHbEp2ZDBOaFkyaGxVM0JoWTJVUVEyRmphR1ZrUTBZQUVGTjBZVzVrWVhKa0FGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJQUFBQUFBQUFBQUFCWlFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdDcUVBQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCcFNiM2REWVdOb1pWTndZV05sSEVOR1YybDBhRzkxZEVOaFkyaGxBQkJUZEdGdVpHRnlaQUJTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbXBtWm1abVp1VDhCQUlDOGFRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEFxQkFBQUFCbWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVUyVnlhV0ZzYVhwcGJtZERZV05vWlZCeWIzWnBaR1Z5QUFKK2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1WTI5dGNHRmpkR2x2Ymk1VGFYcGxWR2xsY21Wa1EyOXRjR0ZqZEdsdmJsTjBjbUYwWldkNUFnQUNBQUFBQVZwdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0YVdkeVlYUnBiMjR1UVdSa1MyVjVjM0JoWTJVRUVrdGxlWE53WVdObE1WWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVzYjJOaGRHOXlMbE5wYlhCc1pWTjBjbUYwWldkNUFBSWtjbVZ3YkdsallYUnBiMjVmWm1GamRHOXlBakVBQWpRU1MyVjVjM0JoWTJVeEdsTjFjR1Z5UkdseVpXTjBSME1BQ2xOMWNHVnlBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFBQUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBOUE4QUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBU1MyVjVjM0JoWTJVeEVFcGtZbU5WZEdZNEFCQlRkR0Z1WkdGeVpBQlFiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1VlZFWTRWSGx3WlFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdvSVFRQ2FtWm1abVptNVB3RUFnTHhwQWxCdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMbFZVUmpoVWVYQmxBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUlBa0FBQUFBQUF2Ny8vLzhQQXBxWm1abVptYmsvQVBnUEFBSVFabTl5ZEhsMGQyOVdiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1SmJuUmxaMlZ5Vkhsd1pRSUFFRU52YkhWdGJqUXlBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFFa3RsZVhOd1lXTmxNUkpLWkdKalFYTmphV2tBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0Z6WTJscFZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR29JUVFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrRnpZMmxwVkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0QrRHdBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRFTVUzVndaWEl4QUFwVGRYQmxjZ0JTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUFVRzl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVRHOXVaMVI1Y0dVQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdEZUR3QUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpURWdWbUZzZFdWelYybDBhRkYxYjNSbGN3QVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWFnaEJBSnFabVptWm1iay9BUUNBdkdrQ1VHOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1VlZSR09GUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QTNBOEFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVXhERk4xY0dWeU1nQUtVM1Z3WlhJQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQUZCdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa3h2Ym1kVWVYQmxBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbXBtWm1abVp1VDhCQUlDOGFRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEE0QThBQUFCbWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVUyVnlhV0ZzYVhwcGJtZERZV05vWlZCeWIzWnBaR1Z5QUFKK2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1WTI5dGNHRmpkR2x2Ymk1VGFYcGxWR2xsY21Wa1EyOXRjR0ZqZEdsdmJsTjBjbUYwWldkNUFnQUNBQUFTUzJWNWMzQmhZMlV4REZOMWNHVnlNd0FLVTNWd1pYSUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFGQnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGt4dmJtZFVlWEJsQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBNGc4QUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBU1MyVjVjM0JoWTJVeERGTjFjR1Z5TkFBS1UzVndaWElBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBRkJ2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xsVlVSamhVZVhCbEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QTVBOEFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVXhERk4xY0dWeU5RQUtVM1Z3WlhJQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BT1lQQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBRWt0bGVYTndZV05sTVF4VGRYQmxjallBQ2xOMWNHVnlBRjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xreGxlR2xqWVd4VlZVbEVWSGx3WlFCUWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVWVkVZNFZIbHdaUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BT2dQQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBRWt0bGVYTndZV05sTVJwVGRYQmxja052ZFc1MFpYSXhBQXBUZFhCbGNnQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJxQ0VFQW1wbVptWm1adVQ4QkFJQzhhUUppYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNURiM1Z1ZEdWeVEyOXNkVzF1Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0lBQUFBQUFBRHdQd0R5RHdBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRFUVNtUmlZMHh2Ym1jQUVGTjBZVzVrWVhKa0FGQnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGt4dmJtZFVlWEJsQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBYWdoQkFKcVptWm1abWJrL0FRQ0F2R2tDVUc5eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VURzl1WjFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBK2c4QUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBU1MyVjVjM0JoWTJVeEVsTjBZVzVrWVhKa05BQVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FOWVBBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFFa3RsZVhOd1lXTmxNUkJKYm1SbGVHVmtNZ0FRVTNSaGJtUmhjbVFBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtGelkybHBWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BT3dQQUFJU1ltbHlkR2hrWVhSbFVHOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1VEc5dVoxUjVjR1VDQUNRMk1qWTVOekkzTkRZNE5qUTJNVGMwTmpVQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBU1MyVjVjM0JoWTJVeEZrcGtZbU5KYm5SbFoyVnlBQkJUZEdGdVpHRnlaQUJXYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUpiblJsWjJWeVZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR29JUVFDYW1abVptWm01UHdFQWdMeHBBbFp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrbHVkR1ZuWlhKVWVYQmxBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUlBa0FBQUFBQUF2Ny8vLzhQQXBxWm1abVptYmsvQVBZUEFBSUNLbEJ2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xsVlVSamhVZVhCbEFnQVFRMjlzZFcxdU5ESUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVXhFbE4wWVc1a1lYSmtNd0FRVTNSaGJtUmhjbVFBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BTlFQQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBRWt0bGVYTndZV05sTVJCSmJtUmxlR1ZrTVFBUVUzUmhibVJoY21RQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKcVptWm1abWJrL0FRQ0F2R2tDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrRnpZMmxwVkhsd1pRSUlBa0FBQUFBQUF2Ny8vLzhQQXBxWm1abVptYmsvQU9vUEFBSVNZbWx5ZEdoa1lYUmxVRzl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVRHOXVaMVI1Y0dVQUFBQWtOakkyT1RjeU56UTJPRFkwTmpFM05EWTFBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFFa3RsZVhOd1lXTmxNUkpUZEdGdVpHRnlaRElBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0RTRHdBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRFU1UzUmhibVJoY21ReEFCQlRkR0Z1WkdGeVpBQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QTBBOEFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVXhNRk4wWVc1a1lYSmtSSGx1WVcxcFkwTnZiWEJ2YzJsMFpRQVFVM1JoYm1SaGNtUUFwQUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrUjVibUZ0YVdORGIyMXdiM05wZEdWVWVYQmxLSFE5UG05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VWR2x0WlZWVlNVUlVlWEJsTEdJOVBtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsS1FJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdvSVFRQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdDQ0VBQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpURWlVM1JoYm1SaGNtUkRiMjF3YjNOcGRHVUFFRk4wWVc1a1lYSmtBT0lDYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNURiMjF3YjNOcGRHVlVlWEJsS0c5eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxMRzl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVZHbHRaVlZWU1VSVWVYQmxMRzl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVNXNTBaV2RsY2xSNWNHVXBBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFhZ2hCQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BSUFRQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBRWt0bGVYTndZV05sTVJKS1pHSmpRbmwwWlhNQUVGTjBZVzVrWVhKa0FGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdvSVFRQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdEOER3QUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpURWdVM1JoYm1SaGNtUkpiblJsWjJWeU1RQVFVM1JoYm1SaGNtUUFWbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVNXNTBaV2RsY2xSNWNHVUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbXBtWm1abVp1VDhCQUlDOGFRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEE3ZzhBQUFCbWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVUyVnlhV0ZzYVhwcGJtZERZV05vWlZCeWIzWnBaR1Z5QUFKK2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1WTI5dGNHRmpkR2x2Ymk1VGFYcGxWR2xsY21Wa1EyOXRjR0ZqZEdsdmJsTjBjbUYwWldkNUFnQUNBQUFTUzJWNWMzQmhZMlV4RUVOdmRXNTBaWEl4QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJxQ0VFQW1wbVptWm1adVQ4QkFJQzhhUUppYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNURiM1Z1ZEdWeVEyOXNkVzF1Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0lBQUFBQUFBRHdQd0R3RHdBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRFYVUzUmhibVJoY21STWIyNW5NZ0FRVTNSaGJtUmhjbVFBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BTm9QQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBRWt0bGVYTndZV05sTVJwVGRHRnVaR0Z5WkV4dmJtY3hBQkJUZEdGdVpHRnlaQUJTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbXBtWm1abVp1VDhCQUlDOGFRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEEyQThBQUFCbWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVUyVnlhV0ZzYVhwcGJtZERZV05vWlZCeWIzWnBaR1Z5QUFKK2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1WTI5dGNHRmpkR2x2Ymk1VGFYcGxWR2xsY21Wa1EyOXRjR0ZqZEdsdmJsTjBjbUYwWldkNUFnQUNBQUFBQVE9PQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5taWdyYXRpb24uS2V5c3BhY2UyLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5taWdyYXRpb24uS2V5c3BhY2UyLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEyODQ0My4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvZGIubWlncmF0aW9uLktleXNwYWNlMi5iaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1Z2C9EbDdJblI1Y0dVaU9pSnlaV052Y21RaUxDSnVZVzFsSWpvaVRXbG5jbUYwYVc5dUlpd2libUZ0WlhOd1lXTmxJam9pYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV2xuY21GMGFXOXVMbUYyY204aUxDSm1hV1ZzWkhNaU9sdDdJbTVoYldVaU9pSnZiR1JmZG1WeWMybHZiaUlzSW5SNWNHVWlPbnNpZEhsd1pTSTZJbVpwZUdWa0lpd2libUZ0WlNJNklsVlZTVVFpTENKdVlXMWxjM0JoWTJVaU9pSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzUxZEdsc2N5NWhkbkp2SWl3aWMybDZaU0k2TVRaOWZTeDdJbTVoYldVaU9pSnVaWGRmZG1WeWMybHZiaUlzSW5SNWNHVWlPaUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1MWRHbHNjeTVoZG5KdkxsVlZTVVFpZlN4N0ltNWhiV1VpT2lKeWIzZGZiWFYwWVhScGIyNGlMQ0owZVhCbElqb2lZbmwwWlhNaWZTeDdJbTVoYldVaU9pSmpiR0Z6YzI1aGJXVWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2liV2xuY21GMGFXOXVJaXdpZEhsd1pTSTZXM3NpZEhsd1pTSTZJbkpsWTI5eVpDSXNJbTVoYldVaU9pSkJaR1JEYjJ4MWJXNUdZVzFwYkhraUxDSm1hV1ZzWkhNaU9sdDdJbTVoYldVaU9pSmpaaUlzSW5SNWNHVWlPbnNpZEhsd1pTSTZJbkpsWTI5eVpDSXNJbTVoYldVaU9pSkRaa1JsWmlJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltdGxlWE53WVdObElpd2lkSGx3WlNJNkluTjBjbWx1WnlKOUxIc2libUZ0WlNJNkltNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pWTI5c2RXMXVYM1I1Y0dVaUxDSjBlWEJsSWpwYkluTjBjbWx1WnlJc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaVkyOXRjR0Z5WVhSdmNsOTBlWEJsSWl3aWRIbHdaU0k2V3lKemRISnBibWNpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5OMVltTnZiWEJoY21GMGIzSmZkSGx3WlNJc0luUjVjR1VpT2xzaWMzUnlhVzVuSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKamIyMXRaVzUwSWl3aWRIbHdaU0k2V3lKemRISnBibWNpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5emFYcGxJaXdpZEhsd1pTSTZXeUprYjNWaWJHVWlMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbXRsZVY5allXTm9aVjl6YVhwbElpd2lkSGx3WlNJNld5SmtiM1ZpYkdVaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluSmxZV1JmY21Wd1lXbHlYMk5vWVc1alpTSXNJblI1Y0dVaU9sc2laRzkxWW14bElpd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSnlaWEJzYVdOaGRHVmZiMjVmZDNKcGRHVWlMQ0owZVhCbElqb2lZbTl2YkdWaGJpSXNJbVJsWm1GMWJIUWlPbVpoYkhObGZTeDdJbTVoYldVaU9pSm5ZMTluY21GalpWOXpaV052Ym1Seklpd2lkSGx3WlNJNld5SnBiblFpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW1SbFptRjFiSFJmZG1Gc2FXUmhkR2x2Ymw5amJHRnpjeUlzSW5SNWNHVWlPbHNpYm5Wc2JDSXNJbk4wY21sdVp5SmRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSnJaWGxmZG1Gc2FXUmhkR2x2Ymw5amJHRnpjeUlzSW5SNWNHVWlPbHNpYm5Wc2JDSXNJbk4wY21sdVp5SmRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSnRhVzVmWTI5dGNHRmpkR2x2Ymw5MGFISmxjMmh2YkdRaUxDSjBlWEJsSWpwYkltNTFiR3dpTENKcGJuUWlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMHNleUp1WVcxbElqb2liV0Y0WDJOdmJYQmhZM1JwYjI1ZmRHaHlaWE5vYjJ4a0lpd2lkSGx3WlNJNld5SnVkV3hzSWl3aWFXNTBJbDBzSW1SbFptRjFiSFFpT201MWJHeDlMSHNpYm1GdFpTSTZJbkp2ZDE5allXTm9aVjl6WVhabFgzQmxjbWx2WkY5cGJsOXpaV052Ym1Seklpd2lkSGx3WlNJNld5SnBiblFpTENKdWRXeHNJbDBzSW1SbFptRjFiSFFpT2pCOUxIc2libUZ0WlNJNkltdGxlVjlqWVdOb1pWOXpZWFpsWDNCbGNtbHZaRjlwYmw5elpXTnZibVJ6SWl3aWRIbHdaU0k2V3lKcGJuUWlMQ0p1ZFd4c0lsMHNJbVJsWm1GMWJIUWlPak0yTURCOUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXJaWGx6WDNSdlgzTmhkbVVpTENKMGVYQmxJanBiSW01MWJHd2lMQ0pwYm5RaVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaWJXVnlaMlZmYzJoaGNtUnpYMk5vWVc1alpTSXNJblI1Y0dVaU9sc2liblZzYkNJc0ltUnZkV0pzWlNKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKcFpDSXNJblI1Y0dVaU9sc2lhVzUwSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKamIyeDFiVzVmYldWMFlXUmhkR0VpTENKMGVYQmxJanBiZXlKMGVYQmxJam9pWVhKeVlYa2lMQ0pwZEdWdGN5STZleUowZVhCbElqb2ljbVZqYjNKa0lpd2libUZ0WlNJNklrTnZiSFZ0YmtSbFppSXNJbVpwWld4a2N5STZXM3NpYm1GdFpTSTZJbTVoYldVaUxDSjBlWEJsSWpvaVlubDBaWE1pZlN4N0ltNWhiV1VpT2lKMllXeHBaR0YwYVc5dVgyTnNZWE56SWl3aWRIbHdaU0k2SW5OMGNtbHVaeUo5TEhzaWJtRnRaU0k2SW1sdVpHVjRYM1I1Y0dVaUxDSjBlWEJsSWpwYmV5SjBlWEJsSWpvaVpXNTFiU0lzSW01aGJXVWlPaUpKYm1SbGVGUjVjR1VpTENKemVXMWliMnh6SWpwYklrdEZXVk1pTENKRFZWTlVUMDBpWFN3aVlXeHBZWE5sY3lJNld5SnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqYjI1bWFXY3VZWFp5Ynk1SmJtUmxlRlI1Y0dVaVhYMHNJbTUxYkd3aVhYMHNleUp1WVcxbElqb2lhVzVrWlhoZmJtRnRaU0lzSW5SNWNHVWlPbHNpYzNSeWFXNW5JaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUpwYm1SbGVGOXZjSFJwYjI1eklpd2lkSGx3WlNJNld5SnVkV3hzSWl4N0luUjVjR1VpT2lKdFlYQWlMQ0oyWVd4MVpYTWlPaUp6ZEhKcGJtY2lmVjBzSW1SbFptRjFiSFFpT201MWJHeDlYU3dpWVd4cFlYTmxjeUk2V3lKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpiMjVtYVdjdVlYWnlieTVEYjJ4MWJXNUVaV1lpWFgxOUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXdjbTkyYVdSbGNpSXNJblI1Y0dVaU9sc2ljM1J5YVc1bklpd2liblZzYkNKZExDSmtaV1poZFd4MElqb2liM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVRMjl1WTNWeWNtVnVkRXhwYm10bFpFaGhjMmhEWVdOb1pWQnliM1pwWkdWeUluMHNleUp1WVcxbElqb2lhMlY1WDJGc2FXRnpJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpd2lZbmwwWlhNaVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaVkyOXRjR0ZqZEdsdmJsOXpkSEpoZEdWbmVTSXNJblI1Y0dVaU9sc2liblZzYkNJc0luTjBjbWx1WnlKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKamIyMXdZV04wYVc5dVgzTjBjbUYwWldkNVgyOXdkR2x2Ym5NaUxDSjBlWEJsSWpwYkltNTFiR3dpTEhzaWRIbHdaU0k2SW0xaGNDSXNJblpoYkhWbGN5STZJbk4wY21sdVp5SjlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMHNleUp1WVcxbElqb2lZMjl0Y0hKbGMzTnBiMjVmYjNCMGFXOXVjeUlzSW5SNWNHVWlPbHNpYm5Wc2JDSXNleUowZVhCbElqb2liV0Z3SWl3aWRtRnNkV1Z6SWpvaWMzUnlhVzVuSW4xZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKaWJHOXZiVjltYVd4MFpYSmZabkJmWTJoaGJtTmxJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpd2laRzkxWW14bElsMHNJbVJsWm1GMWJIUWlPbTUxYkd4OVhTd2lZV3hwWVhObGN5STZXeUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1amIyNW1hV2N1WVhaeWJ5NURaa1JsWmlKZGZYMWRmU3g3SW5SNWNHVWlPaUp5WldOdmNtUWlMQ0p1WVcxbElqb2lSSEp2Y0VOdmJIVnRia1poYldsc2VTSXNJbVpwWld4a2N5STZXM3NpYm1GdFpTSTZJbXR6Ym1GdFpTSXNJblI1Y0dVaU9pSnpkSEpwYm1jaWZTeDdJbTVoYldVaU9pSmpabTVoYldVaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4xZGZTeDdJblI1Y0dVaU9pSnlaV052Y21RaUxDSnVZVzFsSWpvaVFXUmtTMlY1YzNCaFkyVWlMQ0ptYVdWc1pITWlPbHQ3SW01aGJXVWlPaUpyY3lJc0luUjVjR1VpT25zaWRIbHdaU0k2SW5KbFkyOXlaQ0lzSW01aGJXVWlPaUpMYzBSbFppSXNJbVpwWld4a2N5STZXM3NpYm1GdFpTSTZJbTVoYldVaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4wc2V5SnVZVzFsSWpvaWMzUnlZWFJsWjNsZlkyeGhjM01pTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pYzNSeVlYUmxaM2xmYjNCMGFXOXVjeUlzSW5SNWNHVWlPbHQ3SW5SNWNHVWlPaUp0WVhBaUxDSjJZV3gxWlhNaU9pSnpkSEpwYm1jaWZTd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSnlaWEJzYVdOaGRHbHZibDltWVdOMGIzSWlMQ0owZVhCbElqcGJJbWx1ZENJc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaVkyWmZaR1ZtY3lJc0luUjVjR1VpT25zaWRIbHdaU0k2SW1GeWNtRjVJaXdpYVhSbGJYTWlPaUpEWmtSbFppSjlmU3g3SW01aGJXVWlPaUprZFhKaFlteGxYM2R5YVhSbGN5SXNJblI1Y0dVaU9pSmliMjlzWldGdUlpd2laR1ZtWVhWc2RDSTZkSEoxWlgxZExDSmhiR2xoYzJWeklqcGJJbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1OdmJtWnBaeTVoZG5KdkxrdHpSR1ZtSWwxOWZWMTlMSHNpZEhsd1pTSTZJbkpsWTI5eVpDSXNJbTVoYldVaU9pSkVjbTl3UzJWNWMzQmhZMlVpTENKbWFXVnNaSE1pT2x0N0ltNWhiV1VpT2lKcmMyNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjFkZlN4N0luUjVjR1VpT2lKeVpXTnZjbVFpTENKdVlXMWxJam9pVlhCa1lYUmxTMlY1YzNCaFkyVWlMQ0ptYVdWc1pITWlPbHQ3SW01aGJXVWlPaUp2YkdSTGN5SXNJblI1Y0dVaU9pSkxjMFJsWmlKOUxIc2libUZ0WlNJNkltNWxkMHR6SWl3aWRIbHdaU0k2SWt0elJHVm1JbjFkZlN4N0luUjVjR1VpT2lKeVpXTnZjbVFpTENKdVlXMWxJam9pVlhCa1lYUmxRMjlzZFcxdVJtRnRhV3g1SWl3aVptbGxiR1J6SWpwYmV5SnVZVzFsSWpvaWJXVjBZV1JoZEdFaUxDSjBlWEJsSWpvaVEyWkVaV1lpZlYxOVhYMWRmYWh4QjRCM1dSSGhBQUQranI3cTJmeW9jUWVCZDFrUjRRQUEvbzYrNnRuOHlyTUJBQVp6ZVhOMFpXMEFKR0U0TnpFd056Z3hMVGMzTlRrdE1URmxNUzB3TURBd0xXWmxPR1ZpWldWaFpEbG1Zd0FBQUFFQUFBQURBUUFBQUFPQUFBQUFnQUFBQUFBQUFBQUFBQUFKQUF0QmRuSnZMMU5qYUdWdFlRQUFBQUUyVDZnUCtRQUFDdTk3SW5SNWNHVWlPaUp5WldOdmNtUWlMQ0p1WVcxbElqb2lTM05FWldZaUxDSnVZVzFsYzNCaFkyVWlPaUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRhV2R5WVhScGIyNHVZWFp5YnlJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pYzNSeVlYUmxaM2xmWTJ4aGMzTWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2ljM1J5WVhSbFozbGZiM0IwYVc5dWN5SXNJblI1Y0dVaU9sdDdJblI1Y0dVaU9pSnRZWEFpTENKMllXeDFaWE1pT2lKemRISnBibWNpZlN3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJaUxDSjBlWEJsSWpwYkltbHVkQ0lzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pWTJaZlpHVm1jeUlzSW5SNWNHVWlPbnNpZEhsd1pTSTZJbUZ5Y21GNUlpd2lhWFJsYlhNaU9uc2lkSGx3WlNJNkluSmxZMjl5WkNJc0ltNWhiV1VpT2lKRFprUmxaaUlzSW1acFpXeGtjeUk2VzNzaWJtRnRaU0k2SW10bGVYTndZV05sSWl3aWRIbHdaU0k2SW5OMGNtbHVaeUo5TEhzaWJtRnRaU0k2SW01aGJXVWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2lZMjlzZFcxdVgzUjVjR1VpTENKMGVYQmxJanBiSW5OMGNtbHVaeUlzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pWTI5dGNHRnlZWFJ2Y2w5MGVYQmxJaXdpZEhsd1pTSTZXeUp6ZEhKcGJtY2lMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbk4xWW1OdmJYQmhjbUYwYjNKZmRIbHdaU0lzSW5SNWNHVWlPbHNpYzNSeWFXNW5JaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUpqYjIxdFpXNTBJaXdpZEhsd1pTSTZXeUp6ZEhKcGJtY2lMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbkp2ZDE5allXTm9aVjl6YVhwbElpd2lkSGx3WlNJNld5SmtiM1ZpYkdVaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkltdGxlVjlqWVdOb1pWOXphWHBsSWl3aWRIbHdaU0k2V3lKa2IzVmliR1VpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5KbFlXUmZjbVZ3WVdseVgyTm9ZVzVqWlNJc0luUjVjR1VpT2xzaVpHOTFZbXhsSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKeVpYQnNhV05oZEdWZmIyNWZkM0pwZEdVaUxDSjBlWEJsSWpvaVltOXZiR1ZoYmlJc0ltUmxabUYxYkhRaU9tWmhiSE5sZlN4N0ltNWhiV1VpT2lKblkxOW5jbUZqWlY5elpXTnZibVJ6SWl3aWRIbHdaU0k2V3lKcGJuUWlMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbVJsWm1GMWJIUmZkbUZzYVdSaGRHbHZibDlqYkdGemN5SXNJblI1Y0dVaU9sc2liblZzYkNJc0luTjBjbWx1WnlKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKclpYbGZkbUZzYVdSaGRHbHZibDlqYkdGemN5SXNJblI1Y0dVaU9sc2liblZzYkNJc0luTjBjbWx1WnlKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKdGFXNWZZMjl0Y0dGamRHbHZibDkwYUhKbGMyaHZiR1FpTENKMGVYQmxJanBiSW01MWJHd2lMQ0pwYm5RaVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaWJXRjRYMk52YlhCaFkzUnBiMjVmZEdoeVpYTm9iMnhrSWl3aWRIbHdaU0k2V3lKdWRXeHNJaXdpYVc1MElsMHNJbVJsWm1GMWJIUWlPbTUxYkd4OUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXpZWFpsWDNCbGNtbHZaRjlwYmw5elpXTnZibVJ6SWl3aWRIbHdaU0k2V3lKcGJuUWlMQ0p1ZFd4c0lsMHNJbVJsWm1GMWJIUWlPakI5TEhzaWJtRnRaU0k2SW10bGVWOWpZV05vWlY5ellYWmxYM0JsY21sdlpGOXBibDl6WldOdmJtUnpJaXdpZEhsd1pTSTZXeUpwYm5RaUxDSnVkV3hzSWwwc0ltUmxabUYxYkhRaU9qTTJNREI5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5clpYbHpYM1J2WDNOaGRtVWlMQ0owZVhCbElqcGJJbTUxYkd3aUxDSnBiblFpWFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pYldWeVoyVmZjMmhoY21SelgyTm9ZVzVqWlNJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW1SdmRXSnNaU0pkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUpwWkNJc0luUjVjR1VpT2xzaWFXNTBJaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUpqYjJ4MWJXNWZiV1YwWVdSaGRHRWlMQ0owZVhCbElqcGJleUowZVhCbElqb2lZWEp5WVhraUxDSnBkR1Z0Y3lJNmV5SjBlWEJsSWpvaWNtVmpiM0prSWl3aWJtRnRaU0k2SWtOdmJIVnRia1JsWmlJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltNWhiV1VpTENKMGVYQmxJam9pWW5sMFpYTWlmU3g3SW01aGJXVWlPaUoyWVd4cFpHRjBhVzl1WDJOc1lYTnpJaXdpZEhsd1pTSTZJbk4wY21sdVp5SjlMSHNpYm1GdFpTSTZJbWx1WkdWNFgzUjVjR1VpTENKMGVYQmxJanBiZXlKMGVYQmxJam9pWlc1MWJTSXNJbTVoYldVaU9pSkpibVJsZUZSNWNHVWlMQ0p6ZVcxaWIyeHpJanBiSWt0RldWTWlMQ0pEVlZOVVQwMGlYU3dpWVd4cFlYTmxjeUk2V3lKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpiMjVtYVdjdVlYWnlieTVKYm1SbGVGUjVjR1VpWFgwc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaWFXNWtaWGhmYm1GdFpTSXNJblI1Y0dVaU9sc2ljM1J5YVc1bklpd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSnBibVJsZUY5dmNIUnBiMjV6SWl3aWRIbHdaU0k2V3lKdWRXeHNJaXg3SW5SNWNHVWlPaUp0WVhBaUxDSjJZV3gxWlhNaU9pSnpkSEpwYm1jaWZWMHNJbVJsWm1GMWJIUWlPbTUxYkd4OVhTd2lZV3hwWVhObGN5STZXeUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1amIyNW1hV2N1WVhaeWJ5NURiMngxYlc1RVpXWWlYWDE5TENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5d2NtOTJhV1JsY2lJc0luUjVjR1VpT2xzaWMzUnlhVzVuSWl3aWJuVnNiQ0pkTENKa1pXWmhkV3gwSWpvaWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVEyOXVZM1Z5Y21WdWRFeHBibXRsWkVoaGMyaERZV05vWlZCeWIzWnBaR1Z5SW4wc2V5SnVZVzFsSWpvaWEyVjVYMkZzYVdGeklpd2lkSGx3WlNJNld5SnVkV3hzSWl3aVlubDBaWE1pWFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pWTI5dGNHRmpkR2x2Ymw5emRISmhkR1ZuZVNJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW5OMGNtbHVaeUpkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUpqYjIxd1lXTjBhVzl1WDNOMGNtRjBaV2Q1WDI5d2RHbHZibk1pTENKMGVYQmxJanBiSW01MWJHd2lMSHNpZEhsd1pTSTZJbTFoY0NJc0luWmhiSFZsY3lJNkluTjBjbWx1WnlKOVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaVkyOXRjSEpsYzNOcGIyNWZiM0IwYVc5dWN5SXNJblI1Y0dVaU9sc2liblZzYkNJc2V5SjBlWEJsSWpvaWJXRndJaXdpZG1Gc2RXVnpJam9pYzNSeWFXNW5JbjFkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUppYkc5dmJWOW1hV3gwWlhKZlpuQmZZMmhoYm1ObElpd2lkSGx3WlNJNld5SnVkV3hzSWl3aVpHOTFZbXhsSWwwc0ltUmxabUYxYkhRaU9tNTFiR3g5WFN3aVlXeHBZWE5sY3lJNld5SnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqYjI1bWFXY3VZWFp5Ynk1RFprUmxaaUpkZlgxOUxIc2libUZ0WlNJNkltUjFjbUZpYkdWZmQzSnBkR1Z6SWl3aWRIbHdaU0k2SW1KdmIyeGxZVzRpTENKa1pXWmhkV3gwSWpwMGNuVmxmVjBzSW1Gc2FXRnpaWE1pT2xzaWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMjl1Wm1sbkxtRjJjbTh1UzNORVpXWWlYWDBBRFV0bGVVTmhZMmhsVTNCaFkyVUFBQUFCTmsrb0Qva0FBQVJ3R2t0bGVVTmhZMmhsVTNCaFkyVldiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1Ykc5allYUnZjaTVUYVcxd2JHVlRkSEpoZEdWbmVRQUNKSEpsY0d4cFkyRjBhVzl1WDJaaFkzUnZjZ0l4QUFJR0drdGxlVU5oWTJobFUzQmhZMlVTVTNSaGJtUmhjbVF6QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBOEQ4QW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBcGhBQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBYVMyVjVRMkZqYUdWVGNHRmpaUkpUZEdGdVpHRnlaRElBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUR3UHdDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NrRUFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJwTFpYbERZV05vWlZOd1lXTmxFbE4wWVc1a1lYSmtNUUFRVTNSaGJtUmhjbVFBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT0EvQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BS0lRQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBQUFFQUNVdGxlWE53WVdObE1nQUFBQUUyVDZnUCtRQUFCNmtTUzJWNWMzQmhZMlV5Vm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExteHZZMkYwYjNJdVUybHRjR3hsVTNSeVlYUmxaM2tBQWlSeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJQ01RQUNDaEpMWlhsemNHRmpaVElRU1c1a1pYaGxaREVBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1QmMyTnBhVlI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NNRUFBQ0VtSnBjblJvWkdGMFpWQnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGt4dmJtZFVlWEJsQUFBQUpEWXlOamszTWpjME5qZzJORFl4TnpRMk5RQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpUSVNVM1JoYm1SaGNtUXpBQkJUZEdGdVpHRnlaQUJTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbXBtWm1abVp1VDhCQUlDOGFRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEFoaEFBQUFCbWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVUyVnlhV0ZzYVhwcGJtZERZV05vWlZCeWIzWnBaR1Z5QUFKK2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1WTI5dGNHRmpkR2x2Ymk1VGFYcGxWR2xsY21Wa1EyOXRjR0ZqZEdsdmJsTjBjbUYwWldkNUFnQUNBQUFTUzJWNWMzQmhZMlV5RWxOMFlXNWtZWEprTVFBUVUzUmhibVJoY21RQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKcVptWm1abWJrL0FRQ0F2R2tDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUlBa0FBQUFBQUF2Ny8vLzhQQXBxWm1abVptYmsvQUlRUUFBQUFabTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1OaFkyaGxMbE5sY21saGJHbDZhVzVuUTJGamFHVlFjbTkyYVdSbGNnQUNmbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtTnZiWEJoWTNScGIyNHVVMmw2WlZScFpYSmxaRU52YlhCaFkzUnBiMjVUZEhKaGRHVm5lUUlBQWdBQUVrdGxlWE53WVdObE1neFRkWEJsY2pNQUNsTjFjR1Z5QUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUJTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3Q0lFQUFBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQkpMWlhsemNHRmpaVElNVTNWd1pYSTBBQXBUZFhCbGNnQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQVdHOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1VkdsdFpWVlZTVVJVZVhCbEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QWloQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQUFBUUFKUzJWNWMzQmhZMlV6QUFBQUFUWlBxQS81QUFBRFVCSkxaWGx6Y0dGalpUTldiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1Ykc5allYUnZjaTVUYVcxd2JHVlRkSEpoZEdWbmVRQUNKSEpsY0d4cFkyRjBhVzl1WDJaaFkzUnZjZ0kxQUFJRUVrdGxlWE53WVdObE14QkpibVJsZUdWa01RQVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0Z6WTJscFZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FKQVFBQUlTWW1seWRHaGtZWFJsVUc5eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VURzl1WjFSNWNHVUFBQUFrTmpJMk9UY3lOelEyT0RZME5qRTNORFkxQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBRWt0bGVYTndZV05sTXhKVGRHRnVaR0Z5WkRFQUVGTjBZVzVrWVhKa0FGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdDT0VBQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFBQUJBQWxMWlhsemNHRmpaVFFBQUFBQk5rK29EL2tBQUFlR0VrdGxlWE53WVdObE5GWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVzYjJOaGRHOXlMbE5wYlhCc1pWTjBjbUYwWldkNUFBSWtjbVZ3YkdsallYUnBiMjVmWm1GamRHOXlBak1BQWdvU1MyVjVjM0JoWTJVMEVsTjBZVzVrWVhKa013QVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FKUVFBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFFa3RsZVhOd1lXTmxOQkpUZEdGdVpHRnlaREVBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NTRUFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRRTVUzVndaWEl6QUFwVGRYQmxjZ0JTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QWxoQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVTBERk4xY0dWeU5BQUtVM1Z3WlhJQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQUZodmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMbFJwYldWVlZVbEVWSGx3WlFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKcVptWm1abWJrL0FRQ0F2R2tDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUlBa0FBQUFBQUF2Ny8vLzhQQXBxWm1abVptYmsvQUpnUUFBQUFabTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1OaFkyaGxMbE5sY21saGJHbDZhVzVuUTJGamFHVlFjbTkyYVdSbGNnQUNmbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtTnZiWEJoWTNScGIyNHVVMmw2WlZScFpYSmxaRU52YlhCaFkzUnBiMjVUZEhKaGRHVm5lUUlBQWdBQUVrdGxlWE53WVdObE5BeFRkWEJsY2pVQUNsTjFjR1Z5QUZodmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMbFJwYldWVlZVbEVWSGx3WlFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NhRUFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUFBQkFBbExaWGx6Y0dGalpUVUFBQUFCTmsrb0Qva0FBQU1ORWt0bGVYTndZV05sTlZadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNXNiMk5oZEc5eUxsTnBiWEJzWlZOMGNtRjBaV2Q1QUFJa2NtVndiR2xqWVhScGIyNWZabUZqZEc5eUFqSUFBZ1FTUzJWNWMzQmhZMlUxRWxOMFlXNWtZWEprTVFBUVUzUmhibVJoY21RQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKcVptWm1abWJrL0FRQ0F2R2tDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUlBa0FBQUFBQUF2Ny8vLzhQQXBxWm1abVptYmsvQUp3UUFBQUFabTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1OaFkyaGxMbE5sY21saGJHbDZhVzVuUTJGamFHVlFjbTkyYVdSbGNnQUNmbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtTnZiWEJoWTNScGIyNHVVMmw2WlZScFpYSmxaRU52YlhCaFkzUnBiMjVUZEhKaGRHVm5lUUlBQWdBQUVrdGxlWE53WVdObE5SQkRiM1Z1ZEdWeU1RQVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1ltOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UTI5MWJuUmxja052YkhWdGJsUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QW5oQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQUFBUUFKUzJWNWMzQmhZMlUyQUFBQUFUWlBxQS81QUFBQjloSkxaWGx6Y0dGalpUWldiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1Ykc5allYUnZjaTVUYVcxd2JHVlRkSEpoZEdWbmVRQUNKSEpsY0d4cFkyRjBhVzl1WDJaaFkzUnZjZ0l4QUFJQ0VrdGxlWE53WVdObE5oQkpibVJsZUdWa01RQVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0Z6WTJscFZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FLQVFBQUlTWW1seWRHaGtZWFJsVUc5eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VURzl1WjFSNWNHVUFBQUFrTmpJMk9UY3lOelEyT0RZME5qRTNORFkxQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBQUFFQUVFNXZRMjl0YldsMGJHOW5VM0JoWTJVQUFBQUJOaytvRC9rQUFBRzZJRTV2UTI5dGJXbDBiRzluVTNCaFkyVldiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1Ykc5allYUnZjaTVUYVcxd2JHVlRkSEpoZEdWbmVRQUNKSEpsY0d4cFkyRjBhVzl1WDJaaFkzUnZjZ0l4QUFJQ0lFNXZRMjl0YldsMGJHOW5VM0JoWTJVU1UzUmhibVJoY21ReEFCQlRkR0Z1WkdGeVpBQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QXJCQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQUFBQUFOVW05M1EyRmphR1ZUY0dGalpRQUFBQUUyVDZnUCtRQUFBeFlhVW05M1EyRmphR1ZUY0dGalpWWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVzYjJOaGRHOXlMbE5wYlhCc1pWTjBjbUYwWldkNUFBSWtjbVZ3YkdsallYUnBiMjVmWm1GamRHOXlBakVBQWdRYVVtOTNRMkZqYUdWVGNHRmpaUkJEWVdOb1pXUkRSZ0FRVTNSaGJtUmhjbVFBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ0FBQUFBQUFBQUFBRmxBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BS29RQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBR2xKdmQwTmhZMmhsVTNCaFkyVWNRMFpYYVhSb2IzVjBRMkZqYUdVQUVGTjBZVzVrWVhKa0FGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdDb0VBQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFBQUJXbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMXBaM0poZEdsdmJpNUJaR1JMWlhsemNHRmpaUVFTUzJWNWMzQmhZMlV5Vm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExteHZZMkYwYjNJdVUybHRjR3hsVTNSeVlYUmxaM2tBQWlSeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJQ01RQUNDaEpMWlhsemNHRmpaVElRU1c1a1pYaGxaREVBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1QmMyTnBhVlI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NNRUFBQ0VtSnBjblJvWkdGMFpWQnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGt4dmJtZFVlWEJsQUFBQUpEWXlOamszTWpjME5qZzJORFl4TnpRMk5RQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpUSVNVM1JoYm1SaGNtUXpBQkJUZEdGdVpHRnlaQUJTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbXBtWm1abVp1VDhCQUlDOGFRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEFoaEFBQUFCbWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVUyVnlhV0ZzYVhwcGJtZERZV05vWlZCeWIzWnBaR1Z5QUFKK2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1WTI5dGNHRmpkR2x2Ymk1VGFYcGxWR2xsY21Wa1EyOXRjR0ZqZEdsdmJsTjBjbUYwWldkNUFnQUNBQUFTUzJWNWMzQmhZMlV5RWxOMFlXNWtZWEprTVFBUVUzUmhibVJoY21RQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKcVptWm1abWJrL0FRQ0F2R2tDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUlBa0FBQUFBQUF2Ny8vLzhQQXBxWm1abVptYmsvQUlRUUFBQUFabTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1OaFkyaGxMbE5sY21saGJHbDZhVzVuUTJGamFHVlFjbTkyYVdSbGNnQUNmbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtTnZiWEJoWTNScGIyNHVVMmw2WlZScFpYSmxaRU52YlhCaFkzUnBiMjVUZEhKaGRHVm5lUUlBQWdBQUVrdGxlWE53WVdObE1neFRkWEJsY2pNQUNsTjFjR1Z5QUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUJTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3Q0lFQUFBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQkpMWlhsemNHRmpaVElNVTNWd1pYSTBBQXBUZFhCbGNnQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQVdHOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1VkdsdFpWVlZTVVJVZVhCbEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QWloQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQUFBUT09ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLm1pZ3JhdGlvbi5LZXlzcGFjZTMuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLm1pZ3JhdGlvbi5LZXlzcGFjZTMuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2EwOTJlLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5taWdyYXRpb24uS2V5c3BhY2UzLmJpbgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUm0L0RsN0luUjVjR1VpT2lKeVpXTnZjbVFpTENKdVlXMWxJam9pVFdsbmNtRjBhVzl1SWl3aWJtRnRaWE53WVdObElqb2liM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXbG5jbUYwYVc5dUxtRjJjbThpTENKbWFXVnNaSE1pT2x0N0ltNWhiV1VpT2lKdmJHUmZkbVZ5YzJsdmJpSXNJblI1Y0dVaU9uc2lkSGx3WlNJNkltWnBlR1ZrSWl3aWJtRnRaU0k2SWxWVlNVUWlMQ0p1WVcxbGMzQmhZMlVpT2lKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNTFkR2xzY3k1aGRuSnZJaXdpYzJsNlpTSTZNVFo5ZlN4N0ltNWhiV1VpT2lKdVpYZGZkbVZ5YzJsdmJpSXNJblI1Y0dVaU9pSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzUxZEdsc2N5NWhkbkp2TGxWVlNVUWlmU3g3SW01aGJXVWlPaUp5YjNkZmJYVjBZWFJwYjI0aUxDSjBlWEJsSWpvaVlubDBaWE1pZlN4N0ltNWhiV1VpT2lKamJHRnpjMjVoYldVaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4wc2V5SnVZVzFsSWpvaWJXbG5jbUYwYVc5dUlpd2lkSGx3WlNJNlczc2lkSGx3WlNJNkluSmxZMjl5WkNJc0ltNWhiV1VpT2lKQlpHUkRiMngxYlc1R1lXMXBiSGtpTENKbWFXVnNaSE1pT2x0N0ltNWhiV1VpT2lKalppSXNJblI1Y0dVaU9uc2lkSGx3WlNJNkluSmxZMjl5WkNJc0ltNWhiV1VpT2lKRFprUmxaaUlzSW1acFpXeGtjeUk2VzNzaWJtRnRaU0k2SW10bGVYTndZV05sSWl3aWRIbHdaU0k2SW5OMGNtbHVaeUo5TEhzaWJtRnRaU0k2SW01aGJXVWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2lZMjlzZFcxdVgzUjVjR1VpTENKMGVYQmxJanBiSW5OMGNtbHVaeUlzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pWTI5dGNHRnlZWFJ2Y2w5MGVYQmxJaXdpZEhsd1pTSTZXeUp6ZEhKcGJtY2lMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbk4xWW1OdmJYQmhjbUYwYjNKZmRIbHdaU0lzSW5SNWNHVWlPbHNpYzNSeWFXNW5JaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUpqYjIxdFpXNTBJaXdpZEhsd1pTSTZXeUp6ZEhKcGJtY2lMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbkp2ZDE5allXTm9aVjl6YVhwbElpd2lkSGx3WlNJNld5SmtiM1ZpYkdVaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkltdGxlVjlqWVdOb1pWOXphWHBsSWl3aWRIbHdaU0k2V3lKa2IzVmliR1VpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5KbFlXUmZjbVZ3WVdseVgyTm9ZVzVqWlNJc0luUjVjR1VpT2xzaVpHOTFZbXhsSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKeVpYQnNhV05oZEdWZmIyNWZkM0pwZEdVaUxDSjBlWEJsSWpvaVltOXZiR1ZoYmlJc0ltUmxabUYxYkhRaU9tWmhiSE5sZlN4N0ltNWhiV1VpT2lKblkxOW5jbUZqWlY5elpXTnZibVJ6SWl3aWRIbHdaU0k2V3lKcGJuUWlMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbVJsWm1GMWJIUmZkbUZzYVdSaGRHbHZibDlqYkdGemN5SXNJblI1Y0dVaU9sc2liblZzYkNJc0luTjBjbWx1WnlKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKclpYbGZkbUZzYVdSaGRHbHZibDlqYkdGemN5SXNJblI1Y0dVaU9sc2liblZzYkNJc0luTjBjbWx1WnlKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKdGFXNWZZMjl0Y0dGamRHbHZibDkwYUhKbGMyaHZiR1FpTENKMGVYQmxJanBiSW01MWJHd2lMQ0pwYm5RaVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaWJXRjRYMk52YlhCaFkzUnBiMjVmZEdoeVpYTm9iMnhrSWl3aWRIbHdaU0k2V3lKdWRXeHNJaXdpYVc1MElsMHNJbVJsWm1GMWJIUWlPbTUxYkd4OUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXpZWFpsWDNCbGNtbHZaRjlwYmw5elpXTnZibVJ6SWl3aWRIbHdaU0k2V3lKcGJuUWlMQ0p1ZFd4c0lsMHNJbVJsWm1GMWJIUWlPakI5TEhzaWJtRnRaU0k2SW10bGVWOWpZV05vWlY5ellYWmxYM0JsY21sdlpGOXBibDl6WldOdmJtUnpJaXdpZEhsd1pTSTZXeUpwYm5RaUxDSnVkV3hzSWwwc0ltUmxabUYxYkhRaU9qTTJNREI5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5clpYbHpYM1J2WDNOaGRtVWlMQ0owZVhCbElqcGJJbTUxYkd3aUxDSnBiblFpWFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pYldWeVoyVmZjMmhoY21SelgyTm9ZVzVqWlNJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW1SdmRXSnNaU0pkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUpwWkNJc0luUjVjR1VpT2xzaWFXNTBJaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUpqYjJ4MWJXNWZiV1YwWVdSaGRHRWlMQ0owZVhCbElqcGJleUowZVhCbElqb2lZWEp5WVhraUxDSnBkR1Z0Y3lJNmV5SjBlWEJsSWpvaWNtVmpiM0prSWl3aWJtRnRaU0k2SWtOdmJIVnRia1JsWmlJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltNWhiV1VpTENKMGVYQmxJam9pWW5sMFpYTWlmU3g3SW01aGJXVWlPaUoyWVd4cFpHRjBhVzl1WDJOc1lYTnpJaXdpZEhsd1pTSTZJbk4wY21sdVp5SjlMSHNpYm1GdFpTSTZJbWx1WkdWNFgzUjVjR1VpTENKMGVYQmxJanBiZXlKMGVYQmxJam9pWlc1MWJTSXNJbTVoYldVaU9pSkpibVJsZUZSNWNHVWlMQ0p6ZVcxaWIyeHpJanBiSWt0RldWTWlMQ0pEVlZOVVQwMGlYU3dpWVd4cFlYTmxjeUk2V3lKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpiMjVtYVdjdVlYWnlieTVKYm1SbGVGUjVjR1VpWFgwc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaWFXNWtaWGhmYm1GdFpTSXNJblI1Y0dVaU9sc2ljM1J5YVc1bklpd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSnBibVJsZUY5dmNIUnBiMjV6SWl3aWRIbHdaU0k2V3lKdWRXeHNJaXg3SW5SNWNHVWlPaUp0WVhBaUxDSjJZV3gxWlhNaU9pSnpkSEpwYm1jaWZWMHNJbVJsWm1GMWJIUWlPbTUxYkd4OVhTd2lZV3hwWVhObGN5STZXeUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1amIyNW1hV2N1WVhaeWJ5NURiMngxYlc1RVpXWWlYWDE5TENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5d2NtOTJhV1JsY2lJc0luUjVjR1VpT2xzaWMzUnlhVzVuSWl3aWJuVnNiQ0pkTENKa1pXWmhkV3gwSWpvaWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVEyOXVZM1Z5Y21WdWRFeHBibXRsWkVoaGMyaERZV05vWlZCeWIzWnBaR1Z5SW4wc2V5SnVZVzFsSWpvaWEyVjVYMkZzYVdGeklpd2lkSGx3WlNJNld5SnVkV3hzSWl3aVlubDBaWE1pWFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pWTI5dGNHRmpkR2x2Ymw5emRISmhkR1ZuZVNJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW5OMGNtbHVaeUpkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUpqYjIxd1lXTjBhVzl1WDNOMGNtRjBaV2Q1WDI5d2RHbHZibk1pTENKMGVYQmxJanBiSW01MWJHd2lMSHNpZEhsd1pTSTZJbTFoY0NJc0luWmhiSFZsY3lJNkluTjBjbWx1WnlKOVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaVkyOXRjSEpsYzNOcGIyNWZiM0IwYVc5dWN5SXNJblI1Y0dVaU9sc2liblZzYkNJc2V5SjBlWEJsSWpvaWJXRndJaXdpZG1Gc2RXVnpJam9pYzNSeWFXNW5JbjFkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUppYkc5dmJWOW1hV3gwWlhKZlpuQmZZMmhoYm1ObElpd2lkSGx3WlNJNld5SnVkV3hzSWl3aVpHOTFZbXhsSWwwc0ltUmxabUYxYkhRaU9tNTFiR3g5WFN3aVlXeHBZWE5sY3lJNld5SnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqYjI1bWFXY3VZWFp5Ynk1RFprUmxaaUpkZlgxZGZTeDdJblI1Y0dVaU9pSnlaV052Y21RaUxDSnVZVzFsSWpvaVJISnZjRU52YkhWdGJrWmhiV2xzZVNJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltdHpibUZ0WlNJc0luUjVjR1VpT2lKemRISnBibWNpZlN4N0ltNWhiV1VpT2lKalptNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjFkZlN4N0luUjVjR1VpT2lKeVpXTnZjbVFpTENKdVlXMWxJam9pUVdSa1MyVjVjM0JoWTJVaUxDSm1hV1ZzWkhNaU9sdDdJbTVoYldVaU9pSnJjeUlzSW5SNWNHVWlPbnNpZEhsd1pTSTZJbkpsWTI5eVpDSXNJbTVoYldVaU9pSkxjMFJsWmlJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pYzNSeVlYUmxaM2xmWTJ4aGMzTWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2ljM1J5WVhSbFozbGZiM0IwYVc5dWN5SXNJblI1Y0dVaU9sdDdJblI1Y0dVaU9pSnRZWEFpTENKMllXeDFaWE1pT2lKemRISnBibWNpZlN3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJaUxDSjBlWEJsSWpwYkltbHVkQ0lzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pWTJaZlpHVm1jeUlzSW5SNWNHVWlPbnNpZEhsd1pTSTZJbUZ5Y21GNUlpd2lhWFJsYlhNaU9pSkRaa1JsWmlKOWZTeDdJbTVoYldVaU9pSmtkWEpoWW14bFgzZHlhWFJsY3lJc0luUjVjR1VpT2lKaWIyOXNaV0Z1SWl3aVpHVm1ZWFZzZENJNmRISjFaWDFkTENKaGJHbGhjMlZ6SWpwYkltOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU52Ym1acFp5NWhkbkp2TGt0elJHVm1JbDE5ZlYxOUxIc2lkSGx3WlNJNkluSmxZMjl5WkNJc0ltNWhiV1VpT2lKRWNtOXdTMlY1YzNCaFkyVWlMQ0ptYVdWc1pITWlPbHQ3SW01aGJXVWlPaUpyYzI1aGJXVWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMWRmU3g3SW5SNWNHVWlPaUp5WldOdmNtUWlMQ0p1WVcxbElqb2lWWEJrWVhSbFMyVjVjM0JoWTJVaUxDSm1hV1ZzWkhNaU9sdDdJbTVoYldVaU9pSnZiR1JMY3lJc0luUjVjR1VpT2lKTGMwUmxaaUo5TEhzaWJtRnRaU0k2SW01bGQwdHpJaXdpZEhsd1pTSTZJa3R6UkdWbUluMWRmU3g3SW5SNWNHVWlPaUp5WldOdmNtUWlMQ0p1WVcxbElqb2lWWEJrWVhSbFEyOXNkVzF1Um1GdGFXeDVJaXdpWm1sbGJHUnpJanBiZXlKdVlXMWxJam9pYldWMFlXUmhkR0VpTENKMGVYQmxJam9pUTJaRVpXWWlmVjE5WFgxZGZhaHkzRUIzV1JIaEFBRCtqcjdxMmZ5b2N0eEJkMWtSNFFBQS9vNis2dG44eUpRQkFBWnplWE4wWlcwQUpHRTROekprWXpReExUYzNOVGt0TVRGbE1TMHdNREF3TFdabE9HVmlaV1ZoWkRsbVl3QUFBQUVBQUFBREFRQUFBQU9BQUFBQWdBQUFBQUFBQUFBQUFBQUlBQXRCZG5KdkwxTmphR1Z0WVFBQUFBRTJUNmdRQkFBQUN1OTdJblI1Y0dVaU9pSnlaV052Y21RaUxDSnVZVzFsSWpvaVMzTkVaV1lpTENKdVlXMWxjM0JoWTJVaU9pSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dGFXZHlZWFJwYjI0dVlYWnlieUlzSW1acFpXeGtjeUk2VzNzaWJtRnRaU0k2SW01aGJXVWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2ljM1J5WVhSbFozbGZZMnhoYzNNaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4wc2V5SnVZVzFsSWpvaWMzUnlZWFJsWjNsZmIzQjBhVzl1Y3lJc0luUjVjR1VpT2x0N0luUjVjR1VpT2lKdFlYQWlMQ0oyWVd4MVpYTWlPaUp6ZEhKcGJtY2lmU3dpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUp5WlhCc2FXTmhkR2x2Ymw5bVlXTjBiM0lpTENKMGVYQmxJanBiSW1sdWRDSXNJbTUxYkd3aVhYMHNleUp1WVcxbElqb2lZMlpmWkdWbWN5SXNJblI1Y0dVaU9uc2lkSGx3WlNJNkltRnljbUY1SWl3aWFYUmxiWE1pT25zaWRIbHdaU0k2SW5KbFkyOXlaQ0lzSW01aGJXVWlPaUpEWmtSbFppSXNJbVpwWld4a2N5STZXM3NpYm1GdFpTSTZJbXRsZVhOd1lXTmxJaXdpZEhsd1pTSTZJbk4wY21sdVp5SjlMSHNpYm1GdFpTSTZJbTVoYldVaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4wc2V5SnVZVzFsSWpvaVkyOXNkVzF1WDNSNWNHVWlMQ0owZVhCbElqcGJJbk4wY21sdVp5SXNJbTUxYkd3aVhYMHNleUp1WVcxbElqb2lZMjl0Y0dGeVlYUnZjbDkwZVhCbElpd2lkSGx3WlNJNld5SnpkSEpwYm1jaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluTjFZbU52YlhCaGNtRjBiM0pmZEhsd1pTSXNJblI1Y0dVaU9sc2ljM1J5YVc1bklpd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSmpiMjF0Wlc1MElpd2lkSGx3WlNJNld5SnpkSEpwYm1jaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXphWHBsSWl3aWRIbHdaU0k2V3lKa2IzVmliR1VpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW10bGVWOWpZV05vWlY5emFYcGxJaXdpZEhsd1pTSTZXeUprYjNWaWJHVWlMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbkpsWVdSZmNtVndZV2x5WDJOb1lXNWpaU0lzSW5SNWNHVWlPbHNpWkc5MVlteGxJaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUp5WlhCc2FXTmhkR1ZmYjI1ZmQzSnBkR1VpTENKMGVYQmxJam9pWW05dmJHVmhiaUlzSW1SbFptRjFiSFFpT21aaGJITmxmU3g3SW01aGJXVWlPaUpuWTE5bmNtRmpaVjl6WldOdmJtUnpJaXdpZEhsd1pTSTZXeUpwYm5RaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkltUmxabUYxYkhSZmRtRnNhV1JoZEdsdmJsOWpiR0Z6Y3lJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW5OMGNtbHVaeUpkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUpyWlhsZmRtRnNhV1JoZEdsdmJsOWpiR0Z6Y3lJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW5OMGNtbHVaeUpkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUp0YVc1ZlkyOXRjR0ZqZEdsdmJsOTBhSEpsYzJodmJHUWlMQ0owZVhCbElqcGJJbTUxYkd3aUxDSnBiblFpWFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pYldGNFgyTnZiWEJoWTNScGIyNWZkR2h5WlhOb2IyeGtJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpd2lhVzUwSWwwc0ltUmxabUYxYkhRaU9tNTFiR3g5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5ellYWmxYM0JsY21sdlpGOXBibDl6WldOdmJtUnpJaXdpZEhsd1pTSTZXeUpwYm5RaUxDSnVkV3hzSWwwc0ltUmxabUYxYkhRaU9qQjlMSHNpYm1GdFpTSTZJbXRsZVY5allXTm9aVjl6WVhabFgzQmxjbWx2WkY5cGJsOXpaV052Ym1Seklpd2lkSGx3WlNJNld5SnBiblFpTENKdWRXeHNJbDBzSW1SbFptRjFiSFFpT2pNMk1EQjlMSHNpYm1GdFpTSTZJbkp2ZDE5allXTm9aVjlyWlhselgzUnZYM05oZG1VaUxDSjBlWEJsSWpwYkltNTFiR3dpTENKcGJuUWlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMHNleUp1WVcxbElqb2liV1Z5WjJWZmMyaGhjbVJ6WDJOb1lXNWpaU0lzSW5SNWNHVWlPbHNpYm5Wc2JDSXNJbVJ2ZFdKc1pTSmRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSnBaQ0lzSW5SNWNHVWlPbHNpYVc1MElpd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSmpiMngxYlc1ZmJXVjBZV1JoZEdFaUxDSjBlWEJsSWpwYmV5SjBlWEJsSWpvaVlYSnlZWGtpTENKcGRHVnRjeUk2ZXlKMGVYQmxJam9pY21WamIzSmtJaXdpYm1GdFpTSTZJa052YkhWdGJrUmxaaUlzSW1acFpXeGtjeUk2VzNzaWJtRnRaU0k2SW01aGJXVWlMQ0owZVhCbElqb2lZbmwwWlhNaWZTeDdJbTVoYldVaU9pSjJZV3hwWkdGMGFXOXVYMk5zWVhOeklpd2lkSGx3WlNJNkluTjBjbWx1WnlKOUxIc2libUZ0WlNJNkltbHVaR1Y0WDNSNWNHVWlMQ0owZVhCbElqcGJleUowZVhCbElqb2laVzUxYlNJc0ltNWhiV1VpT2lKSmJtUmxlRlI1Y0dVaUxDSnplVzFpYjJ4eklqcGJJa3RGV1ZNaUxDSkRWVk5VVDAwaVhTd2lZV3hwWVhObGN5STZXeUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1amIyNW1hV2N1WVhaeWJ5NUpibVJsZUZSNWNHVWlYWDBzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pYVc1a1pYaGZibUZ0WlNJc0luUjVjR1VpT2xzaWMzUnlhVzVuSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKcGJtUmxlRjl2Y0hScGIyNXpJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpeDdJblI1Y0dVaU9pSnRZWEFpTENKMllXeDFaWE1pT2lKemRISnBibWNpZlYwc0ltUmxabUYxYkhRaU9tNTFiR3g5WFN3aVlXeHBZWE5sY3lJNld5SnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqYjI1bWFXY3VZWFp5Ynk1RGIyeDFiVzVFWldZaVhYMTlMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbkp2ZDE5allXTm9aVjl3Y205MmFXUmxjaUlzSW5SNWNHVWlPbHNpYzNSeWFXNW5JaXdpYm5Wc2JDSmRMQ0prWldaaGRXeDBJam9pYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1UTI5dVkzVnljbVZ1ZEV4cGJtdGxaRWhoYzJoRFlXTm9aVkJ5YjNacFpHVnlJbjBzZXlKdVlXMWxJam9pYTJWNVgyRnNhV0Z6SWl3aWRIbHdaU0k2V3lKdWRXeHNJaXdpWW5sMFpYTWlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMHNleUp1WVcxbElqb2lZMjl0Y0dGamRHbHZibDl6ZEhKaGRHVm5lU0lzSW5SNWNHVWlPbHNpYm5Wc2JDSXNJbk4wY21sdVp5SmRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSmpiMjF3WVdOMGFXOXVYM04wY21GMFpXZDVYMjl3ZEdsdmJuTWlMQ0owZVhCbElqcGJJbTUxYkd3aUxIc2lkSGx3WlNJNkltMWhjQ0lzSW5aaGJIVmxjeUk2SW5OMGNtbHVaeUo5WFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pWTI5dGNISmxjM05wYjI1ZmIzQjBhVzl1Y3lJc0luUjVjR1VpT2xzaWJuVnNiQ0lzZXlKMGVYQmxJam9pYldGd0lpd2lkbUZzZFdWeklqb2ljM1J5YVc1bkluMWRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSmliRzl2YlY5bWFXeDBaWEpmWm5CZlkyaGhibU5sSWl3aWRIbHdaU0k2V3lKdWRXeHNJaXdpWkc5MVlteGxJbDBzSW1SbFptRjFiSFFpT201MWJHeDlYU3dpWVd4cFlYTmxjeUk2V3lKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpiMjVtYVdjdVlYWnlieTVEWmtSbFppSmRmWDE5TEhzaWJtRnRaU0k2SW1SMWNtRmliR1ZmZDNKcGRHVnpJaXdpZEhsd1pTSTZJbUp2YjJ4bFlXNGlMQ0prWldaaGRXeDBJanAwY25WbGZWMHNJbUZzYVdGelpYTWlPbHNpYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyOXVabWxuTG1GMmNtOHVTM05FWldZaVhYMEFEVXRsZVVOaFkyaGxVM0JoWTJVQUFBQUJOaytvRUFRQUFBUndHa3RsZVVOaFkyaGxVM0JoWTJWV2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXViRzlqWVhSdmNpNVRhVzF3YkdWVGRISmhkR1ZuZVFBQ0pISmxjR3hwWTJGMGFXOXVYMlpoWTNSdmNnSXhBQUlHR2t0bGVVTmhZMmhsVTNCaFkyVVNVM1JoYm1SaGNtUXpBQkJUZEdGdVpHRnlaQUJTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE4RDhBbXBtWm1abVp1VDhCQUlDOGFRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEFwaEFBQUFCbWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVUyVnlhV0ZzYVhwcGJtZERZV05vWlZCeWIzWnBaR1Z5QUFKK2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1WTI5dGNHRmpkR2x2Ymk1VGFYcGxWR2xsY21Wa1EyOXRjR0ZqZEdsdmJsTjBjbUYwWldkNUFnQUNBQUFhUzJWNVEyRmphR1ZUY0dGalpSSlRkR0Z1WkdGeVpESUFFRk4wWVc1a1lYSmtBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRHdQd0NhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3Q2tFQUFBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQnBMWlhsRFlXTm9aVk53WVdObEVsTjBZVzVrWVhKa01RQVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFPQS9BSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FLSVFBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFBQUVBQ1V0bGVYTndZV05sTXdBQUFBRTJUNmdRQkFBQUExQVNTMlY1YzNCaFkyVXpWbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG14dlkyRjBiM0l1VTJsdGNHeGxVM1J5WVhSbFoza0FBaVJ5WlhCc2FXTmhkR2x2Ymw5bVlXTjBiM0lDTlFBQ0JCSkxaWGx6Y0dGalpUTVFTVzVrWlhobFpERUFFRk4wWVc1a1lYSmtBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVCYzJOcGFWUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3Q1FFQUFDRW1KcGNuUm9aR0YwWlZCdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa3h2Ym1kVWVYQmxBQUFBSkRZeU5qazNNamMwTmpnMk5EWXhOelEyTlFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRNU1UzUmhibVJoY21ReEFCQlRkR0Z1WkdGeVpBQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QWpoQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQUFBUUFKUzJWNWMzQmhZMlUwQUFBQUFUWlBxQkFFQUFBSGhoSkxaWGx6Y0dGalpUUldiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1Ykc5allYUnZjaTVUYVcxd2JHVlRkSEpoZEdWbmVRQUNKSEpsY0d4cFkyRjBhVzl1WDJaaFkzUnZjZ0l6QUFJS0VrdGxlWE53WVdObE5CSlRkR0Z1WkdGeVpETUFFRk4wWVc1a1lYSmtBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3Q1VFQUFBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQkpMWlhsemNHRmpaVFFTVTNSaGJtUmhjbVF4QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBa2hBQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBU1MyVjVjM0JoWTJVMERGTjFjR1Z5TXdBS1UzVndaWElBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FKWVFBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFFa3RsZVhOd1lXTmxOQXhUZFhCbGNqUUFDbE4xY0dWeUFGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFCWWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVVYVcxbFZWVkpSRlI1Y0dVQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdDWUVBQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpUUU1VM1Z3WlhJMUFBcFRkWEJsY2dCWWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVVYVcxbFZWVkpSRlI1Y0dVQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBbWhBQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBQUFRQUpTMlY1YzNCaFkyVTFBQUFBQVRaUHFCQUVBQUFERFJKTFpYbHpjR0ZqWlRWV2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXViRzlqWVhSdmNpNVRhVzF3YkdWVGRISmhkR1ZuZVFBQ0pISmxjR3hwWTJGMGFXOXVYMlpoWTNSdmNnSXlBQUlFRWt0bGVYTndZV05sTlJKVGRHRnVaR0Z5WkRFQUVGTjBZVzVrWVhKa0FGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdDY0VBQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpUVVFRMjkxYm5SbGNqRUFFRk4wWVc1a1lYSmtBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFtSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtOdmRXNTBaWEpEYjJ4MWJXNVVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FKNFFBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFBQUVBQ1V0bGVYTndZV05sTmdBQUFBRTJUNmdRQkFBQUFmWVNTMlY1YzNCaFkyVTJWbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG14dlkyRjBiM0l1VTJsdGNHeGxVM1J5WVhSbFoza0FBaVJ5WlhCc2FXTmhkR2x2Ymw5bVlXTjBiM0lDTVFBQ0FoSkxaWGx6Y0dGalpUWVFTVzVrWlhobFpERUFFRk4wWVc1a1lYSmtBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVCYzJOcGFWUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3Q2dFQUFDRW1KcGNuUm9aR0YwWlZCdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa3h2Ym1kVWVYQmxBQUFBSkRZeU5qazNNamMwTmpnMk5EWXhOelEyTlFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUFBQkFCQk9iME52YlcxcGRHeHZaMU53WVdObEFBQUFBVFpQcUJBRUFBQUJ1aUJPYjBOdmJXMXBkR3h2WjFOd1lXTmxWbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG14dlkyRjBiM0l1VTJsdGNHeGxVM1J5WVhSbFoza0FBaVJ5WlhCc2FXTmhkR2x2Ymw5bVlXTjBiM0lDTVFBQ0FpQk9iME52YlcxcGRHeHZaMU53WVdObEVsTjBZVzVrWVhKa01RQVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FLd1FBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFBQUFBRFZKdmQwTmhZMmhsVTNCaFkyVUFBQUFCTmsrb0VBUUFBQU1XR2xKdmQwTmhZMmhsVTNCaFkyVldiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1Ykc5allYUnZjaTVUYVcxd2JHVlRkSEpoZEdWbmVRQUNKSEpsY0d4cFkyRjBhVzl1WDJaaFkzUnZjZ0l4QUFJRUdsSnZkME5oWTJobFUzQmhZMlVRUTJGamFHVmtRMFlBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUJaUUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NxRUFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJwU2IzZERZV05vWlZOd1lXTmxIRU5HVjJsMGFHOTFkRU5oWTJobEFCQlRkR0Z1WkdGeVpBQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QXFCQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQUFBVnB2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRhV2R5WVhScGIyNHVRV1JrUzJWNWMzQmhZMlVFRWt0bGVYTndZV05sTTFadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNXNiMk5oZEc5eUxsTnBiWEJzWlZOMGNtRjBaV2Q1QUFJa2NtVndiR2xqWVhScGIyNWZabUZqZEc5eUFqVUFBZ1FTUzJWNWMzQmhZMlV6RUVsdVpHVjRaV1F4QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFYTmphV2xVZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBa0JBQUFoSmlhWEowYUdSaGRHVlFiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1TWIyNW5WSGx3WlFBQUFDUTJNalk1TnpJM05EWTROalEyTVRjME5qVUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVXpFbE4wWVc1a1lYSmtNUUFRVTNSaGJtUmhjbVFBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BSTRRQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBQUFFPQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5taWdyYXRpb24uS2V5c3BhY2U0LmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5taWdyYXRpb24uS2V5c3BhY2U0LmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUwNWRhNC4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvZGIubWlncmF0aW9uLktleXNwYWNlNC5iaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1KyC9EbDdJblI1Y0dVaU9pSnlaV052Y21RaUxDSnVZVzFsSWpvaVRXbG5jbUYwYVc5dUlpd2libUZ0WlhOd1lXTmxJam9pYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV2xuY21GMGFXOXVMbUYyY204aUxDSm1hV1ZzWkhNaU9sdDdJbTVoYldVaU9pSnZiR1JmZG1WeWMybHZiaUlzSW5SNWNHVWlPbnNpZEhsd1pTSTZJbVpwZUdWa0lpd2libUZ0WlNJNklsVlZTVVFpTENKdVlXMWxjM0JoWTJVaU9pSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzUxZEdsc2N5NWhkbkp2SWl3aWMybDZaU0k2TVRaOWZTeDdJbTVoYldVaU9pSnVaWGRmZG1WeWMybHZiaUlzSW5SNWNHVWlPaUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1MWRHbHNjeTVoZG5KdkxsVlZTVVFpZlN4N0ltNWhiV1VpT2lKeWIzZGZiWFYwWVhScGIyNGlMQ0owZVhCbElqb2lZbmwwWlhNaWZTeDdJbTVoYldVaU9pSmpiR0Z6YzI1aGJXVWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2liV2xuY21GMGFXOXVJaXdpZEhsd1pTSTZXM3NpZEhsd1pTSTZJbkpsWTI5eVpDSXNJbTVoYldVaU9pSkJaR1JEYjJ4MWJXNUdZVzFwYkhraUxDSm1hV1ZzWkhNaU9sdDdJbTVoYldVaU9pSmpaaUlzSW5SNWNHVWlPbnNpZEhsd1pTSTZJbkpsWTI5eVpDSXNJbTVoYldVaU9pSkRaa1JsWmlJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltdGxlWE53WVdObElpd2lkSGx3WlNJNkluTjBjbWx1WnlKOUxIc2libUZ0WlNJNkltNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pWTI5c2RXMXVYM1I1Y0dVaUxDSjBlWEJsSWpwYkluTjBjbWx1WnlJc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaVkyOXRjR0Z5WVhSdmNsOTBlWEJsSWl3aWRIbHdaU0k2V3lKemRISnBibWNpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5OMVltTnZiWEJoY21GMGIzSmZkSGx3WlNJc0luUjVjR1VpT2xzaWMzUnlhVzVuSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKamIyMXRaVzUwSWl3aWRIbHdaU0k2V3lKemRISnBibWNpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5emFYcGxJaXdpZEhsd1pTSTZXeUprYjNWaWJHVWlMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbXRsZVY5allXTm9aVjl6YVhwbElpd2lkSGx3WlNJNld5SmtiM1ZpYkdVaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluSmxZV1JmY21Wd1lXbHlYMk5vWVc1alpTSXNJblI1Y0dVaU9sc2laRzkxWW14bElpd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSnlaWEJzYVdOaGRHVmZiMjVmZDNKcGRHVWlMQ0owZVhCbElqb2lZbTl2YkdWaGJpSXNJbVJsWm1GMWJIUWlPbVpoYkhObGZTeDdJbTVoYldVaU9pSm5ZMTluY21GalpWOXpaV052Ym1Seklpd2lkSGx3WlNJNld5SnBiblFpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW1SbFptRjFiSFJmZG1Gc2FXUmhkR2x2Ymw5amJHRnpjeUlzSW5SNWNHVWlPbHNpYm5Wc2JDSXNJbk4wY21sdVp5SmRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSnJaWGxmZG1Gc2FXUmhkR2x2Ymw5amJHRnpjeUlzSW5SNWNHVWlPbHNpYm5Wc2JDSXNJbk4wY21sdVp5SmRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSnRhVzVmWTI5dGNHRmpkR2x2Ymw5MGFISmxjMmh2YkdRaUxDSjBlWEJsSWpwYkltNTFiR3dpTENKcGJuUWlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMHNleUp1WVcxbElqb2liV0Y0WDJOdmJYQmhZM1JwYjI1ZmRHaHlaWE5vYjJ4a0lpd2lkSGx3WlNJNld5SnVkV3hzSWl3aWFXNTBJbDBzSW1SbFptRjFiSFFpT201MWJHeDlMSHNpYm1GdFpTSTZJbkp2ZDE5allXTm9aVjl6WVhabFgzQmxjbWx2WkY5cGJsOXpaV052Ym1Seklpd2lkSGx3WlNJNld5SnBiblFpTENKdWRXeHNJbDBzSW1SbFptRjFiSFFpT2pCOUxIc2libUZ0WlNJNkltdGxlVjlqWVdOb1pWOXpZWFpsWDNCbGNtbHZaRjlwYmw5elpXTnZibVJ6SWl3aWRIbHdaU0k2V3lKcGJuUWlMQ0p1ZFd4c0lsMHNJbVJsWm1GMWJIUWlPak0yTURCOUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXJaWGx6WDNSdlgzTmhkbVVpTENKMGVYQmxJanBiSW01MWJHd2lMQ0pwYm5RaVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaWJXVnlaMlZmYzJoaGNtUnpYMk5vWVc1alpTSXNJblI1Y0dVaU9sc2liblZzYkNJc0ltUnZkV0pzWlNKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKcFpDSXNJblI1Y0dVaU9sc2lhVzUwSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKamIyeDFiVzVmYldWMFlXUmhkR0VpTENKMGVYQmxJanBiZXlKMGVYQmxJam9pWVhKeVlYa2lMQ0pwZEdWdGN5STZleUowZVhCbElqb2ljbVZqYjNKa0lpd2libUZ0WlNJNklrTnZiSFZ0YmtSbFppSXNJbVpwWld4a2N5STZXM3NpYm1GdFpTSTZJbTVoYldVaUxDSjBlWEJsSWpvaVlubDBaWE1pZlN4N0ltNWhiV1VpT2lKMllXeHBaR0YwYVc5dVgyTnNZWE56SWl3aWRIbHdaU0k2SW5OMGNtbHVaeUo5TEhzaWJtRnRaU0k2SW1sdVpHVjRYM1I1Y0dVaUxDSjBlWEJsSWpwYmV5SjBlWEJsSWpvaVpXNTFiU0lzSW01aGJXVWlPaUpKYm1SbGVGUjVjR1VpTENKemVXMWliMnh6SWpwYklrdEZXVk1pTENKRFZWTlVUMDBpWFN3aVlXeHBZWE5sY3lJNld5SnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqYjI1bWFXY3VZWFp5Ynk1SmJtUmxlRlI1Y0dVaVhYMHNJbTUxYkd3aVhYMHNleUp1WVcxbElqb2lhVzVrWlhoZmJtRnRaU0lzSW5SNWNHVWlPbHNpYzNSeWFXNW5JaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUpwYm1SbGVGOXZjSFJwYjI1eklpd2lkSGx3WlNJNld5SnVkV3hzSWl4N0luUjVjR1VpT2lKdFlYQWlMQ0oyWVd4MVpYTWlPaUp6ZEhKcGJtY2lmVjBzSW1SbFptRjFiSFFpT201MWJHeDlYU3dpWVd4cFlYTmxjeUk2V3lKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpiMjVtYVdjdVlYWnlieTVEYjJ4MWJXNUVaV1lpWFgxOUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXdjbTkyYVdSbGNpSXNJblI1Y0dVaU9sc2ljM1J5YVc1bklpd2liblZzYkNKZExDSmtaV1poZFd4MElqb2liM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVRMjl1WTNWeWNtVnVkRXhwYm10bFpFaGhjMmhEWVdOb1pWQnliM1pwWkdWeUluMHNleUp1WVcxbElqb2lhMlY1WDJGc2FXRnpJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpd2lZbmwwWlhNaVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaVkyOXRjR0ZqZEdsdmJsOXpkSEpoZEdWbmVTSXNJblI1Y0dVaU9sc2liblZzYkNJc0luTjBjbWx1WnlKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKamIyMXdZV04wYVc5dVgzTjBjbUYwWldkNVgyOXdkR2x2Ym5NaUxDSjBlWEJsSWpwYkltNTFiR3dpTEhzaWRIbHdaU0k2SW0xaGNDSXNJblpoYkhWbGN5STZJbk4wY21sdVp5SjlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMHNleUp1WVcxbElqb2lZMjl0Y0hKbGMzTnBiMjVmYjNCMGFXOXVjeUlzSW5SNWNHVWlPbHNpYm5Wc2JDSXNleUowZVhCbElqb2liV0Z3SWl3aWRtRnNkV1Z6SWpvaWMzUnlhVzVuSW4xZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKaWJHOXZiVjltYVd4MFpYSmZabkJmWTJoaGJtTmxJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpd2laRzkxWW14bElsMHNJbVJsWm1GMWJIUWlPbTUxYkd4OVhTd2lZV3hwWVhObGN5STZXeUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1amIyNW1hV2N1WVhaeWJ5NURaa1JsWmlKZGZYMWRmU3g3SW5SNWNHVWlPaUp5WldOdmNtUWlMQ0p1WVcxbElqb2lSSEp2Y0VOdmJIVnRia1poYldsc2VTSXNJbVpwWld4a2N5STZXM3NpYm1GdFpTSTZJbXR6Ym1GdFpTSXNJblI1Y0dVaU9pSnpkSEpwYm1jaWZTeDdJbTVoYldVaU9pSmpabTVoYldVaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4xZGZTeDdJblI1Y0dVaU9pSnlaV052Y21RaUxDSnVZVzFsSWpvaVFXUmtTMlY1YzNCaFkyVWlMQ0ptYVdWc1pITWlPbHQ3SW01aGJXVWlPaUpyY3lJc0luUjVjR1VpT25zaWRIbHdaU0k2SW5KbFkyOXlaQ0lzSW01aGJXVWlPaUpMYzBSbFppSXNJbVpwWld4a2N5STZXM3NpYm1GdFpTSTZJbTVoYldVaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4wc2V5SnVZVzFsSWpvaWMzUnlZWFJsWjNsZlkyeGhjM01pTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pYzNSeVlYUmxaM2xmYjNCMGFXOXVjeUlzSW5SNWNHVWlPbHQ3SW5SNWNHVWlPaUp0WVhBaUxDSjJZV3gxWlhNaU9pSnpkSEpwYm1jaWZTd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSnlaWEJzYVdOaGRHbHZibDltWVdOMGIzSWlMQ0owZVhCbElqcGJJbWx1ZENJc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaVkyWmZaR1ZtY3lJc0luUjVjR1VpT25zaWRIbHdaU0k2SW1GeWNtRjVJaXdpYVhSbGJYTWlPaUpEWmtSbFppSjlmU3g3SW01aGJXVWlPaUprZFhKaFlteGxYM2R5YVhSbGN5SXNJblI1Y0dVaU9pSmliMjlzWldGdUlpd2laR1ZtWVhWc2RDSTZkSEoxWlgxZExDSmhiR2xoYzJWeklqcGJJbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1OdmJtWnBaeTVoZG5KdkxrdHpSR1ZtSWwxOWZWMTlMSHNpZEhsd1pTSTZJbkpsWTI5eVpDSXNJbTVoYldVaU9pSkVjbTl3UzJWNWMzQmhZMlVpTENKbWFXVnNaSE1pT2x0N0ltNWhiV1VpT2lKcmMyNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjFkZlN4N0luUjVjR1VpT2lKeVpXTnZjbVFpTENKdVlXMWxJam9pVlhCa1lYUmxTMlY1YzNCaFkyVWlMQ0ptYVdWc1pITWlPbHQ3SW01aGJXVWlPaUp2YkdSTGN5SXNJblI1Y0dVaU9pSkxjMFJsWmlKOUxIc2libUZ0WlNJNkltNWxkMHR6SWl3aWRIbHdaU0k2SWt0elJHVm1JbjFkZlN4N0luUjVjR1VpT2lKeVpXTnZjbVFpTENKdVlXMWxJam9pVlhCa1lYUmxRMjlzZFcxdVJtRnRhV3g1SWl3aVptbGxiR1J6SWpwYmV5SnVZVzFsSWpvaWJXVjBZV1JoZEdFaUxDSjBlWEJsSWpvaVEyWkVaV1lpZlYxOVhYMWRmYWgwaWZCM1dSSGhBQUQranI3cTJmeW9kSW54ZDFrUjRRQUEvbzYrNnRuOCtJWUJBQVp6ZVhOMFpXMEFKR0U0TnpRNE9XWXhMVGMzTlRrdE1URmxNUzB3TURBd0xXWmxPR1ZpWldWaFpEbG1Zd0FBQUFFQUFBQURBUUFBQUFPQUFBQUFnQUFBQUFBQUFBQUFBQUFIQUF0QmRuSnZMMU5qYUdWdFlRQUFBQUUyVDZnUUR3QUFDdTk3SW5SNWNHVWlPaUp5WldOdmNtUWlMQ0p1WVcxbElqb2lTM05FWldZaUxDSnVZVzFsYzNCaFkyVWlPaUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRhV2R5WVhScGIyNHVZWFp5YnlJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pYzNSeVlYUmxaM2xmWTJ4aGMzTWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2ljM1J5WVhSbFozbGZiM0IwYVc5dWN5SXNJblI1Y0dVaU9sdDdJblI1Y0dVaU9pSnRZWEFpTENKMllXeDFaWE1pT2lKemRISnBibWNpZlN3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJaUxDSjBlWEJsSWpwYkltbHVkQ0lzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pWTJaZlpHVm1jeUlzSW5SNWNHVWlPbnNpZEhsd1pTSTZJbUZ5Y21GNUlpd2lhWFJsYlhNaU9uc2lkSGx3WlNJNkluSmxZMjl5WkNJc0ltNWhiV1VpT2lKRFprUmxaaUlzSW1acFpXeGtjeUk2VzNzaWJtRnRaU0k2SW10bGVYTndZV05sSWl3aWRIbHdaU0k2SW5OMGNtbHVaeUo5TEhzaWJtRnRaU0k2SW01aGJXVWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2lZMjlzZFcxdVgzUjVjR1VpTENKMGVYQmxJanBiSW5OMGNtbHVaeUlzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pWTI5dGNHRnlZWFJ2Y2w5MGVYQmxJaXdpZEhsd1pTSTZXeUp6ZEhKcGJtY2lMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbk4xWW1OdmJYQmhjbUYwYjNKZmRIbHdaU0lzSW5SNWNHVWlPbHNpYzNSeWFXNW5JaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUpqYjIxdFpXNTBJaXdpZEhsd1pTSTZXeUp6ZEhKcGJtY2lMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbkp2ZDE5allXTm9aVjl6YVhwbElpd2lkSGx3WlNJNld5SmtiM1ZpYkdVaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkltdGxlVjlqWVdOb1pWOXphWHBsSWl3aWRIbHdaU0k2V3lKa2IzVmliR1VpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5KbFlXUmZjbVZ3WVdseVgyTm9ZVzVqWlNJc0luUjVjR1VpT2xzaVpHOTFZbXhsSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKeVpYQnNhV05oZEdWZmIyNWZkM0pwZEdVaUxDSjBlWEJsSWpvaVltOXZiR1ZoYmlJc0ltUmxabUYxYkhRaU9tWmhiSE5sZlN4N0ltNWhiV1VpT2lKblkxOW5jbUZqWlY5elpXTnZibVJ6SWl3aWRIbHdaU0k2V3lKcGJuUWlMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbVJsWm1GMWJIUmZkbUZzYVdSaGRHbHZibDlqYkdGemN5SXNJblI1Y0dVaU9sc2liblZzYkNJc0luTjBjbWx1WnlKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKclpYbGZkbUZzYVdSaGRHbHZibDlqYkdGemN5SXNJblI1Y0dVaU9sc2liblZzYkNJc0luTjBjbWx1WnlKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKdGFXNWZZMjl0Y0dGamRHbHZibDkwYUhKbGMyaHZiR1FpTENKMGVYQmxJanBiSW01MWJHd2lMQ0pwYm5RaVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaWJXRjRYMk52YlhCaFkzUnBiMjVmZEdoeVpYTm9iMnhrSWl3aWRIbHdaU0k2V3lKdWRXeHNJaXdpYVc1MElsMHNJbVJsWm1GMWJIUWlPbTUxYkd4OUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXpZWFpsWDNCbGNtbHZaRjlwYmw5elpXTnZibVJ6SWl3aWRIbHdaU0k2V3lKcGJuUWlMQ0p1ZFd4c0lsMHNJbVJsWm1GMWJIUWlPakI5TEhzaWJtRnRaU0k2SW10bGVWOWpZV05vWlY5ellYWmxYM0JsY21sdlpGOXBibDl6WldOdmJtUnpJaXdpZEhsd1pTSTZXeUpwYm5RaUxDSnVkV3hzSWwwc0ltUmxabUYxYkhRaU9qTTJNREI5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5clpYbHpYM1J2WDNOaGRtVWlMQ0owZVhCbElqcGJJbTUxYkd3aUxDSnBiblFpWFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pYldWeVoyVmZjMmhoY21SelgyTm9ZVzVqWlNJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW1SdmRXSnNaU0pkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUpwWkNJc0luUjVjR1VpT2xzaWFXNTBJaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUpqYjJ4MWJXNWZiV1YwWVdSaGRHRWlMQ0owZVhCbElqcGJleUowZVhCbElqb2lZWEp5WVhraUxDSnBkR1Z0Y3lJNmV5SjBlWEJsSWpvaWNtVmpiM0prSWl3aWJtRnRaU0k2SWtOdmJIVnRia1JsWmlJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltNWhiV1VpTENKMGVYQmxJam9pWW5sMFpYTWlmU3g3SW01aGJXVWlPaUoyWVd4cFpHRjBhVzl1WDJOc1lYTnpJaXdpZEhsd1pTSTZJbk4wY21sdVp5SjlMSHNpYm1GdFpTSTZJbWx1WkdWNFgzUjVjR1VpTENKMGVYQmxJanBiZXlKMGVYQmxJam9pWlc1MWJTSXNJbTVoYldVaU9pSkpibVJsZUZSNWNHVWlMQ0p6ZVcxaWIyeHpJanBiSWt0RldWTWlMQ0pEVlZOVVQwMGlYU3dpWVd4cFlYTmxjeUk2V3lKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpiMjVtYVdjdVlYWnlieTVKYm1SbGVGUjVjR1VpWFgwc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaWFXNWtaWGhmYm1GdFpTSXNJblI1Y0dVaU9sc2ljM1J5YVc1bklpd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSnBibVJsZUY5dmNIUnBiMjV6SWl3aWRIbHdaU0k2V3lKdWRXeHNJaXg3SW5SNWNHVWlPaUp0WVhBaUxDSjJZV3gxWlhNaU9pSnpkSEpwYm1jaWZWMHNJbVJsWm1GMWJIUWlPbTUxYkd4OVhTd2lZV3hwWVhObGN5STZXeUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1amIyNW1hV2N1WVhaeWJ5NURiMngxYlc1RVpXWWlYWDE5TENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5d2NtOTJhV1JsY2lJc0luUjVjR1VpT2xzaWMzUnlhVzVuSWl3aWJuVnNiQ0pkTENKa1pXWmhkV3gwSWpvaWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVEyOXVZM1Z5Y21WdWRFeHBibXRsWkVoaGMyaERZV05vWlZCeWIzWnBaR1Z5SW4wc2V5SnVZVzFsSWpvaWEyVjVYMkZzYVdGeklpd2lkSGx3WlNJNld5SnVkV3hzSWl3aVlubDBaWE1pWFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pWTI5dGNHRmpkR2x2Ymw5emRISmhkR1ZuZVNJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW5OMGNtbHVaeUpkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUpqYjIxd1lXTjBhVzl1WDNOMGNtRjBaV2Q1WDI5d2RHbHZibk1pTENKMGVYQmxJanBiSW01MWJHd2lMSHNpZEhsd1pTSTZJbTFoY0NJc0luWmhiSFZsY3lJNkluTjBjbWx1WnlKOVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaVkyOXRjSEpsYzNOcGIyNWZiM0IwYVc5dWN5SXNJblI1Y0dVaU9sc2liblZzYkNJc2V5SjBlWEJsSWpvaWJXRndJaXdpZG1Gc2RXVnpJam9pYzNSeWFXNW5JbjFkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUppYkc5dmJWOW1hV3gwWlhKZlpuQmZZMmhoYm1ObElpd2lkSGx3WlNJNld5SnVkV3hzSWl3aVpHOTFZbXhsSWwwc0ltUmxabUYxYkhRaU9tNTFiR3g5WFN3aVlXeHBZWE5sY3lJNld5SnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqYjI1bWFXY3VZWFp5Ynk1RFprUmxaaUpkZlgxOUxIc2libUZ0WlNJNkltUjFjbUZpYkdWZmQzSnBkR1Z6SWl3aWRIbHdaU0k2SW1KdmIyeGxZVzRpTENKa1pXWmhkV3gwSWpwMGNuVmxmVjBzSW1Gc2FXRnpaWE1pT2xzaWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMjl1Wm1sbkxtRjJjbTh1UzNORVpXWWlYWDBBRFV0bGVVTmhZMmhsVTNCaFkyVUFBQUFCTmsrb0VBOEFBQVJ3R2t0bGVVTmhZMmhsVTNCaFkyVldiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1Ykc5allYUnZjaTVUYVcxd2JHVlRkSEpoZEdWbmVRQUNKSEpsY0d4cFkyRjBhVzl1WDJaaFkzUnZjZ0l4QUFJR0drdGxlVU5oWTJobFUzQmhZMlVTVTNSaGJtUmhjbVF6QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBOEQ4QW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBcGhBQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBYVMyVjVRMkZqYUdWVGNHRmpaUkpUZEdGdVpHRnlaRElBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUR3UHdDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NrRUFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJwTFpYbERZV05vWlZOd1lXTmxFbE4wWVc1a1lYSmtNUUFRVTNSaGJtUmhjbVFBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT0EvQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BS0lRQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBQUFFQUNVdGxlWE53WVdObE5BQUFBQUUyVDZnUUR3QUFCNFlTUzJWNWMzQmhZMlUwVm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExteHZZMkYwYjNJdVUybHRjR3hsVTNSeVlYUmxaM2tBQWlSeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJQ013QUNDaEpMWlhsemNHRmpaVFFTVTNSaGJtUmhjbVF6QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBbEJBQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBU1MyVjVjM0JoWTJVMEVsTjBZVzVrWVhKa01RQVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FKSVFBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFFa3RsZVhOd1lXTmxOQXhUZFhCbGNqTUFDbE4xY0dWeUFGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NXRUFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRRTVUzVndaWEkwQUFwVGRYQmxjZ0JTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUFXRzl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVZHbHRaVlZWU1VSVWVYQmxBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbXBtWm1abVp1VDhCQUlDOGFRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEFtQkFBQUFCbWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVUyVnlhV0ZzYVhwcGJtZERZV05vWlZCeWIzWnBaR1Z5QUFKK2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1WTI5dGNHRmpkR2x2Ymk1VGFYcGxWR2xsY21Wa1EyOXRjR0ZqZEdsdmJsTjBjbUYwWldkNUFnQUNBQUFTUzJWNWMzQmhZMlUwREZOMWNHVnlOUUFLVTNWd1pYSUFXRzl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVZHbHRaVlZWU1VSVWVYQmxBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FKb1FBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFBQUVBQ1V0bGVYTndZV05sTlFBQUFBRTJUNmdRRHdBQUF3MFNTMlY1YzNCaFkyVTFWbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG14dlkyRjBiM0l1VTJsdGNHeGxVM1J5WVhSbFoza0FBaVJ5WlhCc2FXTmhkR2x2Ymw5bVlXTjBiM0lDTWdBQ0JCSkxaWGx6Y0dGalpUVVNVM1JoYm1SaGNtUXhBQkJUZEdGdVpHRnlaQUJTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbXBtWm1abVp1VDhCQUlDOGFRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEFuQkFBQUFCbWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVUyVnlhV0ZzYVhwcGJtZERZV05vWlZCeWIzWnBaR1Z5QUFKK2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1WTI5dGNHRmpkR2x2Ymk1VGFYcGxWR2xsY21Wa1EyOXRjR0ZqZEdsdmJsTjBjbUYwWldkNUFnQUNBQUFTUzJWNWMzQmhZMlUxRUVOdmRXNTBaWEl4QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW1wbVptWm1adVQ4QkFJQzhhUUppYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNURiM1Z1ZEdWeVEyOXNkVzF1Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NlRUFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUFBQkFBbExaWGx6Y0dGalpUWUFBQUFCTmsrb0VBOEFBQUgyRWt0bGVYTndZV05sTmxadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNXNiMk5oZEc5eUxsTnBiWEJzWlZOMGNtRjBaV2Q1QUFJa2NtVndiR2xqWVhScGIyNWZabUZqZEc5eUFqRUFBZ0lTUzJWNWMzQmhZMlUyRUVsdVpHVjRaV1F4QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFYTmphV2xVZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBb0JBQUFoSmlhWEowYUdSaGRHVlFiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1TWIyNW5WSGx3WlFBQUFDUTJNalk1TnpJM05EWTROalEyTVRjME5qVUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQUFBUUFRVG05RGIyMXRhWFJzYjJkVGNHRmpaUUFBQUFFMlQ2Z1FEd0FBQWJvZ1RtOURiMjF0YVhSc2IyZFRjR0ZqWlZadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNXNiMk5oZEc5eUxsTnBiWEJzWlZOMGNtRjBaV2Q1QUFJa2NtVndiR2xqWVhScGIyNWZabUZqZEc5eUFqRUFBZ0lnVG05RGIyMXRhWFJzYjJkVGNHRmpaUkpUZEdGdVpHRnlaREVBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NzRUFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUFBQUFBMVNiM2REWVdOb1pWTndZV05sQUFBQUFUWlBxQkFQQUFBREZocFNiM2REWVdOb1pWTndZV05sVm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExteHZZMkYwYjNJdVUybHRjR3hsVTNSeVlYUmxaM2tBQWlSeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJQ01RQUNCQnBTYjNkRFlXTm9aVk53WVdObEVFTmhZMmhsWkVOR0FCQlRkR0Z1WkdGeVpBQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0FBQUFBQUFBQUFBQVdVQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QXFoQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQWFVbTkzUTJGamFHVlRjR0ZqWlJ4RFJsZHBkR2h2ZFhSRFlXTm9aUUFRVTNSaGJtUmhjbVFBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BS2dRQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBQUFGYWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldsbmNtRjBhVzl1TGtGa1pFdGxlWE53WVdObEJCSkxaWGx6Y0dGalpUUldiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1Ykc5allYUnZjaTVUYVcxd2JHVlRkSEpoZEdWbmVRQUNKSEpsY0d4cFkyRjBhVzl1WDJaaFkzUnZjZ0l6QUFJS0VrdGxlWE53WVdObE5CSlRkR0Z1WkdGeVpETUFFRk4wWVc1a1lYSmtBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3Q1VFQUFBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQkpMWlhsemNHRmpaVFFTVTNSaGJtUmhjbVF4QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBa2hBQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBU1MyVjVjM0JoWTJVMERGTjFjR1Z5TXdBS1UzVndaWElBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FKWVFBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFFa3RsZVhOd1lXTmxOQXhUZFhCbGNqUUFDbE4xY0dWeUFGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFCWWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVVYVcxbFZWVkpSRlI1Y0dVQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdDWUVBQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpUUU1VM1Z3WlhJMUFBcFRkWEJsY2dCWWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVVYVcxbFZWVkpSRlI1Y0dVQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBbWhBQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBQUFRPT0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvZGIubWlncmF0aW9uLktleXNwYWNlNS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvZGIubWlncmF0aW9uLktleXNwYWNlNS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMDcwNGEuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLm1pZ3JhdGlvbi5LZXlzcGFjZTUuYmluCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotOqgvRGw3SW5SNWNHVWlPaUp5WldOdmNtUWlMQ0p1WVcxbElqb2lUV2xuY21GMGFXOXVJaXdpYm1GdFpYTndZV05sSWpvaWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldsbmNtRjBhVzl1TG1GMmNtOGlMQ0ptYVdWc1pITWlPbHQ3SW01aGJXVWlPaUp2YkdSZmRtVnljMmx2YmlJc0luUjVjR1VpT25zaWRIbHdaU0k2SW1acGVHVmtJaXdpYm1GdFpTSTZJbFZWU1VRaUxDSnVZVzFsYzNCaFkyVWlPaUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1MWRHbHNjeTVoZG5Kdklpd2ljMmw2WlNJNk1UWjlmU3g3SW01aGJXVWlPaUp1WlhkZmRtVnljMmx2YmlJc0luUjVjR1VpT2lKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNTFkR2xzY3k1aGRuSnZMbFZWU1VRaWZTeDdJbTVoYldVaU9pSnliM2RmYlhWMFlYUnBiMjRpTENKMGVYQmxJam9pWW5sMFpYTWlmU3g3SW01aGJXVWlPaUpqYkdGemMyNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pYldsbmNtRjBhVzl1SWl3aWRIbHdaU0k2VzNzaWRIbHdaU0k2SW5KbFkyOXlaQ0lzSW01aGJXVWlPaUpCWkdSRGIyeDFiVzVHWVcxcGJIa2lMQ0ptYVdWc1pITWlPbHQ3SW01aGJXVWlPaUpqWmlJc0luUjVjR1VpT25zaWRIbHdaU0k2SW5KbFkyOXlaQ0lzSW01aGJXVWlPaUpEWmtSbFppSXNJbVpwWld4a2N5STZXM3NpYm1GdFpTSTZJbXRsZVhOd1lXTmxJaXdpZEhsd1pTSTZJbk4wY21sdVp5SjlMSHNpYm1GdFpTSTZJbTVoYldVaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4wc2V5SnVZVzFsSWpvaVkyOXNkVzF1WDNSNWNHVWlMQ0owZVhCbElqcGJJbk4wY21sdVp5SXNJbTUxYkd3aVhYMHNleUp1WVcxbElqb2lZMjl0Y0dGeVlYUnZjbDkwZVhCbElpd2lkSGx3WlNJNld5SnpkSEpwYm1jaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluTjFZbU52YlhCaGNtRjBiM0pmZEhsd1pTSXNJblI1Y0dVaU9sc2ljM1J5YVc1bklpd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSmpiMjF0Wlc1MElpd2lkSGx3WlNJNld5SnpkSEpwYm1jaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXphWHBsSWl3aWRIbHdaU0k2V3lKa2IzVmliR1VpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW10bGVWOWpZV05vWlY5emFYcGxJaXdpZEhsd1pTSTZXeUprYjNWaWJHVWlMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbkpsWVdSZmNtVndZV2x5WDJOb1lXNWpaU0lzSW5SNWNHVWlPbHNpWkc5MVlteGxJaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUp5WlhCc2FXTmhkR1ZmYjI1ZmQzSnBkR1VpTENKMGVYQmxJam9pWW05dmJHVmhiaUlzSW1SbFptRjFiSFFpT21aaGJITmxmU3g3SW01aGJXVWlPaUpuWTE5bmNtRmpaVjl6WldOdmJtUnpJaXdpZEhsd1pTSTZXeUpwYm5RaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkltUmxabUYxYkhSZmRtRnNhV1JoZEdsdmJsOWpiR0Z6Y3lJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW5OMGNtbHVaeUpkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUpyWlhsZmRtRnNhV1JoZEdsdmJsOWpiR0Z6Y3lJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW5OMGNtbHVaeUpkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUp0YVc1ZlkyOXRjR0ZqZEdsdmJsOTBhSEpsYzJodmJHUWlMQ0owZVhCbElqcGJJbTUxYkd3aUxDSnBiblFpWFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pYldGNFgyTnZiWEJoWTNScGIyNWZkR2h5WlhOb2IyeGtJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpd2lhVzUwSWwwc0ltUmxabUYxYkhRaU9tNTFiR3g5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5ellYWmxYM0JsY21sdlpGOXBibDl6WldOdmJtUnpJaXdpZEhsd1pTSTZXeUpwYm5RaUxDSnVkV3hzSWwwc0ltUmxabUYxYkhRaU9qQjlMSHNpYm1GdFpTSTZJbXRsZVY5allXTm9aVjl6WVhabFgzQmxjbWx2WkY5cGJsOXpaV052Ym1Seklpd2lkSGx3WlNJNld5SnBiblFpTENKdWRXeHNJbDBzSW1SbFptRjFiSFFpT2pNMk1EQjlMSHNpYm1GdFpTSTZJbkp2ZDE5allXTm9aVjlyWlhselgzUnZYM05oZG1VaUxDSjBlWEJsSWpwYkltNTFiR3dpTENKcGJuUWlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMHNleUp1WVcxbElqb2liV1Z5WjJWZmMyaGhjbVJ6WDJOb1lXNWpaU0lzSW5SNWNHVWlPbHNpYm5Wc2JDSXNJbVJ2ZFdKc1pTSmRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSnBaQ0lzSW5SNWNHVWlPbHNpYVc1MElpd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSmpiMngxYlc1ZmJXVjBZV1JoZEdFaUxDSjBlWEJsSWpwYmV5SjBlWEJsSWpvaVlYSnlZWGtpTENKcGRHVnRjeUk2ZXlKMGVYQmxJam9pY21WamIzSmtJaXdpYm1GdFpTSTZJa052YkhWdGJrUmxaaUlzSW1acFpXeGtjeUk2VzNzaWJtRnRaU0k2SW01aGJXVWlMQ0owZVhCbElqb2lZbmwwWlhNaWZTeDdJbTVoYldVaU9pSjJZV3hwWkdGMGFXOXVYMk5zWVhOeklpd2lkSGx3WlNJNkluTjBjbWx1WnlKOUxIc2libUZ0WlNJNkltbHVaR1Y0WDNSNWNHVWlMQ0owZVhCbElqcGJleUowZVhCbElqb2laVzUxYlNJc0ltNWhiV1VpT2lKSmJtUmxlRlI1Y0dVaUxDSnplVzFpYjJ4eklqcGJJa3RGV1ZNaUxDSkRWVk5VVDAwaVhTd2lZV3hwWVhObGN5STZXeUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1amIyNW1hV2N1WVhaeWJ5NUpibVJsZUZSNWNHVWlYWDBzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pYVc1a1pYaGZibUZ0WlNJc0luUjVjR1VpT2xzaWMzUnlhVzVuSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKcGJtUmxlRjl2Y0hScGIyNXpJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpeDdJblI1Y0dVaU9pSnRZWEFpTENKMllXeDFaWE1pT2lKemRISnBibWNpZlYwc0ltUmxabUYxYkhRaU9tNTFiR3g5WFN3aVlXeHBZWE5sY3lJNld5SnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqYjI1bWFXY3VZWFp5Ynk1RGIyeDFiVzVFWldZaVhYMTlMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbkp2ZDE5allXTm9aVjl3Y205MmFXUmxjaUlzSW5SNWNHVWlPbHNpYzNSeWFXNW5JaXdpYm5Wc2JDSmRMQ0prWldaaGRXeDBJam9pYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1UTI5dVkzVnljbVZ1ZEV4cGJtdGxaRWhoYzJoRFlXTm9aVkJ5YjNacFpHVnlJbjBzZXlKdVlXMWxJam9pYTJWNVgyRnNhV0Z6SWl3aWRIbHdaU0k2V3lKdWRXeHNJaXdpWW5sMFpYTWlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMHNleUp1WVcxbElqb2lZMjl0Y0dGamRHbHZibDl6ZEhKaGRHVm5lU0lzSW5SNWNHVWlPbHNpYm5Wc2JDSXNJbk4wY21sdVp5SmRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSmpiMjF3WVdOMGFXOXVYM04wY21GMFpXZDVYMjl3ZEdsdmJuTWlMQ0owZVhCbElqcGJJbTUxYkd3aUxIc2lkSGx3WlNJNkltMWhjQ0lzSW5aaGJIVmxjeUk2SW5OMGNtbHVaeUo5WFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pWTI5dGNISmxjM05wYjI1ZmIzQjBhVzl1Y3lJc0luUjVjR1VpT2xzaWJuVnNiQ0lzZXlKMGVYQmxJam9pYldGd0lpd2lkbUZzZFdWeklqb2ljM1J5YVc1bkluMWRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSmliRzl2YlY5bWFXeDBaWEpmWm5CZlkyaGhibU5sSWl3aWRIbHdaU0k2V3lKdWRXeHNJaXdpWkc5MVlteGxJbDBzSW1SbFptRjFiSFFpT201MWJHeDlYU3dpWVd4cFlYTmxjeUk2V3lKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpiMjVtYVdjdVlYWnlieTVEWmtSbFppSmRmWDFkZlN4N0luUjVjR1VpT2lKeVpXTnZjbVFpTENKdVlXMWxJam9pUkhKdmNFTnZiSFZ0YmtaaGJXbHNlU0lzSW1acFpXeGtjeUk2VzNzaWJtRnRaU0k2SW10emJtRnRaU0lzSW5SNWNHVWlPaUp6ZEhKcGJtY2lmU3g3SW01aGJXVWlPaUpqWm01aGJXVWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMWRmU3g3SW5SNWNHVWlPaUp5WldOdmNtUWlMQ0p1WVcxbElqb2lRV1JrUzJWNWMzQmhZMlVpTENKbWFXVnNaSE1pT2x0N0ltNWhiV1VpT2lKcmN5SXNJblI1Y0dVaU9uc2lkSGx3WlNJNkluSmxZMjl5WkNJc0ltNWhiV1VpT2lKTGMwUmxaaUlzSW1acFpXeGtjeUk2VzNzaWJtRnRaU0k2SW01aGJXVWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2ljM1J5WVhSbFozbGZZMnhoYzNNaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4wc2V5SnVZVzFsSWpvaWMzUnlZWFJsWjNsZmIzQjBhVzl1Y3lJc0luUjVjR1VpT2x0N0luUjVjR1VpT2lKdFlYQWlMQ0oyWVd4MVpYTWlPaUp6ZEhKcGJtY2lmU3dpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUp5WlhCc2FXTmhkR2x2Ymw5bVlXTjBiM0lpTENKMGVYQmxJanBiSW1sdWRDSXNJbTUxYkd3aVhYMHNleUp1WVcxbElqb2lZMlpmWkdWbWN5SXNJblI1Y0dVaU9uc2lkSGx3WlNJNkltRnljbUY1SWl3aWFYUmxiWE1pT2lKRFprUmxaaUo5ZlN4N0ltNWhiV1VpT2lKa2RYSmhZbXhsWDNkeWFYUmxjeUlzSW5SNWNHVWlPaUppYjI5c1pXRnVJaXdpWkdWbVlYVnNkQ0k2ZEhKMVpYMWRMQ0poYkdsaGMyVnpJanBiSW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTnZibVpwWnk1aGRuSnZMa3R6UkdWbUlsMTlmVjE5TEhzaWRIbHdaU0k2SW5KbFkyOXlaQ0lzSW01aGJXVWlPaUpFY205d1MyVjVjM0JoWTJVaUxDSm1hV1ZzWkhNaU9sdDdJbTVoYldVaU9pSnJjMjVoYldVaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4xZGZTeDdJblI1Y0dVaU9pSnlaV052Y21RaUxDSnVZVzFsSWpvaVZYQmtZWFJsUzJWNWMzQmhZMlVpTENKbWFXVnNaSE1pT2x0N0ltNWhiV1VpT2lKdmJHUkxjeUlzSW5SNWNHVWlPaUpMYzBSbFppSjlMSHNpYm1GdFpTSTZJbTVsZDB0eklpd2lkSGx3WlNJNklrdHpSR1ZtSW4xZGZTeDdJblI1Y0dVaU9pSnlaV052Y21RaUxDSnVZVzFsSWpvaVZYQmtZWFJsUTI5c2RXMXVSbUZ0YVd4NUlpd2labWxsYkdSeklqcGJleUp1WVcxbElqb2liV1YwWVdSaGRHRWlMQ0owZVhCbElqb2lRMlpFWldZaWZWMTlYWDFkZmFoMXduQjNXUkhoQUFEK2pyN3EyZnlvZGVtQWQxa1I0UUFBL282KzZ0bjh2R2dBQm5ONWMzUmxiUUFrWVRnM05XVTVPREF0TnpjMU9TMHhNV1V4TFRBd01EQXRabVU0WldKbFpXRmtPV1pqQUFBQUFRQUFBQU1CQUFBQUE0QUFBQUNBQUFBQUFBQUFBQUFBQUFZQUMwRjJjbTh2VTJOb1pXMWhBQUFBQVRaUHFCQVlBQUFLNzNzaWRIbHdaU0k2SW5KbFkyOXlaQ0lzSW01aGJXVWlPaUpMYzBSbFppSXNJbTVoYldWemNHRmpaU0k2SW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFwWjNKaGRHbHZiaTVoZG5Kdklpd2labWxsYkdSeklqcGJleUp1WVcxbElqb2libUZ0WlNJc0luUjVjR1VpT2lKemRISnBibWNpZlN4N0ltNWhiV1VpT2lKemRISmhkR1ZuZVY5amJHRnpjeUlzSW5SNWNHVWlPaUp6ZEhKcGJtY2lmU3g3SW01aGJXVWlPaUp6ZEhKaGRHVm5lVjl2Y0hScGIyNXpJaXdpZEhsd1pTSTZXM3NpZEhsd1pTSTZJbTFoY0NJc0luWmhiSFZsY3lJNkluTjBjbWx1WnlKOUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluSmxjR3hwWTJGMGFXOXVYMlpoWTNSdmNpSXNJblI1Y0dVaU9sc2lhVzUwSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKalpsOWtaV1p6SWl3aWRIbHdaU0k2ZXlKMGVYQmxJam9pWVhKeVlYa2lMQ0pwZEdWdGN5STZleUowZVhCbElqb2ljbVZqYjNKa0lpd2libUZ0WlNJNklrTm1SR1ZtSWl3aVptbGxiR1J6SWpwYmV5SnVZVzFsSWpvaWEyVjVjM0JoWTJVaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4wc2V5SnVZVzFsSWpvaWJtRnRaU0lzSW5SNWNHVWlPaUp6ZEhKcGJtY2lmU3g3SW01aGJXVWlPaUpqYjJ4MWJXNWZkSGx3WlNJc0luUjVjR1VpT2xzaWMzUnlhVzVuSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKamIyMXdZWEpoZEc5eVgzUjVjR1VpTENKMGVYQmxJanBiSW5OMGNtbHVaeUlzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pYzNWaVkyOXRjR0Z5WVhSdmNsOTBlWEJsSWl3aWRIbHdaU0k2V3lKemRISnBibWNpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW1OdmJXMWxiblFpTENKMGVYQmxJanBiSW5OMGNtbHVaeUlzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pY205M1gyTmhZMmhsWDNOcGVtVWlMQ0owZVhCbElqcGJJbVJ2ZFdKc1pTSXNJbTUxYkd3aVhYMHNleUp1WVcxbElqb2lhMlY1WDJOaFkyaGxYM05wZW1VaUxDSjBlWEJsSWpwYkltUnZkV0pzWlNJc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaWNtVmhaRjl5WlhCaGFYSmZZMmhoYm1ObElpd2lkSGx3WlNJNld5SmtiM1ZpYkdVaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluSmxjR3hwWTJGMFpWOXZibDkzY21sMFpTSXNJblI1Y0dVaU9pSmliMjlzWldGdUlpd2laR1ZtWVhWc2RDSTZabUZzYzJWOUxIc2libUZ0WlNJNkltZGpYMmR5WVdObFgzTmxZMjl1WkhNaUxDSjBlWEJsSWpwYkltbHVkQ0lzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pWkdWbVlYVnNkRjkyWVd4cFpHRjBhVzl1WDJOc1lYTnpJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpd2ljM1J5YVc1bklsMHNJbVJsWm1GMWJIUWlPbTUxYkd4OUxIc2libUZ0WlNJNkltdGxlVjkyWVd4cFpHRjBhVzl1WDJOc1lYTnpJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpd2ljM1J5YVc1bklsMHNJbVJsWm1GMWJIUWlPbTUxYkd4OUxIc2libUZ0WlNJNkltMXBibDlqYjIxd1lXTjBhVzl1WDNSb2NtVnphRzlzWkNJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW1sdWRDSmRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSnRZWGhmWTI5dGNHRmpkR2x2Ymw5MGFISmxjMmh2YkdRaUxDSjBlWEJsSWpwYkltNTFiR3dpTENKcGJuUWlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMHNleUp1WVcxbElqb2ljbTkzWDJOaFkyaGxYM05oZG1WZmNHVnlhVzlrWDJsdVgzTmxZMjl1WkhNaUxDSjBlWEJsSWpwYkltbHVkQ0lzSW01MWJHd2lYU3dpWkdWbVlYVnNkQ0k2TUgwc2V5SnVZVzFsSWpvaWEyVjVYMk5oWTJobFgzTmhkbVZmY0dWeWFXOWtYMmx1WDNObFkyOXVaSE1pTENKMGVYQmxJanBiSW1sdWRDSXNJbTUxYkd3aVhTd2laR1ZtWVhWc2RDSTZNell3TUgwc2V5SnVZVzFsSWpvaWNtOTNYMk5oWTJobFgydGxlWE5mZEc5ZmMyRjJaU0lzSW5SNWNHVWlPbHNpYm5Wc2JDSXNJbWx1ZENKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKdFpYSm5aVjl6YUdGeVpITmZZMmhoYm1ObElpd2lkSGx3WlNJNld5SnVkV3hzSWl3aVpHOTFZbXhsSWwwc0ltUmxabUYxYkhRaU9tNTFiR3g5TEhzaWJtRnRaU0k2SW1sa0lpd2lkSGx3WlNJNld5SnBiblFpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW1OdmJIVnRibDl0WlhSaFpHRjBZU0lzSW5SNWNHVWlPbHQ3SW5SNWNHVWlPaUpoY25KaGVTSXNJbWwwWlcxeklqcDdJblI1Y0dVaU9pSnlaV052Y21RaUxDSnVZVzFsSWpvaVEyOXNkVzF1UkdWbUlpd2labWxsYkdSeklqcGJleUp1WVcxbElqb2libUZ0WlNJc0luUjVjR1VpT2lKaWVYUmxjeUo5TEhzaWJtRnRaU0k2SW5aaGJHbGtZWFJwYjI1ZlkyeGhjM01pTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pYVc1a1pYaGZkSGx3WlNJc0luUjVjR1VpT2x0N0luUjVjR1VpT2lKbGJuVnRJaXdpYm1GdFpTSTZJa2x1WkdWNFZIbHdaU0lzSW5ONWJXSnZiSE1pT2xzaVMwVlpVeUlzSWtOVlUxUlBUU0pkTENKaGJHbGhjMlZ6SWpwYkltOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU52Ym1acFp5NWhkbkp2TGtsdVpHVjRWSGx3WlNKZGZTd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSnBibVJsZUY5dVlXMWxJaXdpZEhsd1pTSTZXeUp6ZEhKcGJtY2lMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbWx1WkdWNFgyOXdkR2x2Ym5NaUxDSjBlWEJsSWpwYkltNTFiR3dpTEhzaWRIbHdaU0k2SW0xaGNDSXNJblpoYkhWbGN5STZJbk4wY21sdVp5SjlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMWRMQ0poYkdsaGMyVnpJanBiSW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTnZibVpwWnk1aGRuSnZMa052YkhWdGJrUmxaaUpkZlgwc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaWNtOTNYMk5oWTJobFgzQnliM1pwWkdWeUlpd2lkSGx3WlNJNld5SnpkSEpwYm1jaUxDSnVkV3hzSWwwc0ltUmxabUYxYkhRaU9pSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNURiMjVqZFhKeVpXNTBUR2x1YTJWa1NHRnphRU5oWTJobFVISnZkbWxrWlhJaWZTeDdJbTVoYldVaU9pSnJaWGxmWVd4cFlYTWlMQ0owZVhCbElqcGJJbTUxYkd3aUxDSmllWFJsY3lKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKamIyMXdZV04wYVc5dVgzTjBjbUYwWldkNUlpd2lkSGx3WlNJNld5SnVkV3hzSWl3aWMzUnlhVzVuSWwwc0ltUmxabUYxYkhRaU9tNTFiR3g5TEhzaWJtRnRaU0k2SW1OdmJYQmhZM1JwYjI1ZmMzUnlZWFJsWjNsZmIzQjBhVzl1Y3lJc0luUjVjR1VpT2xzaWJuVnNiQ0lzZXlKMGVYQmxJam9pYldGd0lpd2lkbUZzZFdWeklqb2ljM1J5YVc1bkluMWRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSmpiMjF3Y21WemMybHZibDl2Y0hScGIyNXpJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpeDdJblI1Y0dVaU9pSnRZWEFpTENKMllXeDFaWE1pT2lKemRISnBibWNpZlYwc0ltUmxabUYxYkhRaU9tNTFiR3g5TEhzaWJtRnRaU0k2SW1Kc2IyOXRYMlpwYkhSbGNsOW1jRjlqYUdGdVkyVWlMQ0owZVhCbElqcGJJbTUxYkd3aUxDSmtiM1ZpYkdVaVhTd2laR1ZtWVhWc2RDSTZiblZzYkgxZExDSmhiR2xoYzJWeklqcGJJbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1OdmJtWnBaeTVoZG5KdkxrTm1SR1ZtSWwxOWZYMHNleUp1WVcxbElqb2laSFZ5WVdKc1pWOTNjbWwwWlhNaUxDSjBlWEJsSWpvaVltOXZiR1ZoYmlJc0ltUmxabUYxYkhRaU9uUnlkV1Y5WFN3aVlXeHBZWE5sY3lJNld5SnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqYjI1bWFXY3VZWFp5Ynk1TGMwUmxaaUpkZlFBTlMyVjVRMkZqYUdWVGNHRmpaUUFBQUFFMlQ2Z1FHQUFBQkhBYVMyVjVRMkZqYUdWVGNHRmpaVlp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1c2IyTmhkRzl5TGxOcGJYQnNaVk4wY21GMFpXZDVBQUlrY21Wd2JHbGpZWFJwYjI1ZlptRmpkRzl5QWpFQUFnWWFTMlY1UTJGamFHVlRjR0ZqWlJKVGRHRnVaR0Z5WkRNQUVGTjBZVzVrWVhKa0FGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEd1B3Q2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdDbUVBQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCcExaWGxEWVdOb1pWTndZV05sRWxOMFlXNWtZWEprTWdBUVUzUmhibVJoY21RQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVBBL0FKcVptWm1abWJrL0FRQ0F2R2tDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUlBa0FBQUFBQUF2Ny8vLzhQQXBxWm1abVptYmsvQUtRUUFBQUFabTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1OaFkyaGxMbE5sY21saGJHbDZhVzVuUTJGamFHVlFjbTkyYVdSbGNnQUNmbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtTnZiWEJoWTNScGIyNHVVMmw2WlZScFpYSmxaRU52YlhCaFkzUnBiMjVUZEhKaGRHVm5lUUlBQWdBQUdrdGxlVU5oWTJobFUzQmhZMlVTVTNSaGJtUmhjbVF4QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBNEQ4QW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBb2hBQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBQUFRQUpTMlY1YzNCaFkyVTFBQUFBQVRaUHFCQVlBQUFERFJKTFpYbHpjR0ZqWlRWV2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXViRzlqWVhSdmNpNVRhVzF3YkdWVGRISmhkR1ZuZVFBQ0pISmxjR3hwWTJGMGFXOXVYMlpoWTNSdmNnSXlBQUlFRWt0bGVYTndZV05sTlJKVGRHRnVaR0Z5WkRFQUVGTjBZVzVrWVhKa0FGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdDY0VBQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpUVVFRMjkxYm5SbGNqRUFFRk4wWVc1a1lYSmtBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFtSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtOdmRXNTBaWEpEYjJ4MWJXNVVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FKNFFBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFBQUVBQ1V0bGVYTndZV05sTmdBQUFBRTJUNmdRR0FBQUFmWVNTMlY1YzNCaFkyVTJWbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG14dlkyRjBiM0l1VTJsdGNHeGxVM1J5WVhSbFoza0FBaVJ5WlhCc2FXTmhkR2x2Ymw5bVlXTjBiM0lDTVFBQ0FoSkxaWGx6Y0dGalpUWVFTVzVrWlhobFpERUFFRk4wWVc1a1lYSmtBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVCYzJOcGFWUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3Q2dFQUFDRW1KcGNuUm9aR0YwWlZCdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa3h2Ym1kVWVYQmxBQUFBSkRZeU5qazNNamMwTmpnMk5EWXhOelEyTlFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUFBQkFCQk9iME52YlcxcGRHeHZaMU53WVdObEFBQUFBVFpQcUJBWUFBQUJ1aUJPYjBOdmJXMXBkR3h2WjFOd1lXTmxWbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG14dlkyRjBiM0l1VTJsdGNHeGxVM1J5WVhSbFoza0FBaVJ5WlhCc2FXTmhkR2x2Ymw5bVlXTjBiM0lDTVFBQ0FpQk9iME52YlcxcGRHeHZaMU53WVdObEVsTjBZVzVrWVhKa01RQVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FLd1FBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFBQUFBRFZKdmQwTmhZMmhsVTNCaFkyVUFBQUFCTmsrb0VCZ0FBQU1XR2xKdmQwTmhZMmhsVTNCaFkyVldiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1Ykc5allYUnZjaTVUYVcxd2JHVlRkSEpoZEdWbmVRQUNKSEpsY0d4cFkyRjBhVzl1WDJaaFkzUnZjZ0l4QUFJRUdsSnZkME5oWTJobFUzQmhZMlVRUTJGamFHVmtRMFlBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUJaUUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NxRUFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJwU2IzZERZV05vWlZOd1lXTmxIRU5HVjJsMGFHOTFkRU5oWTJobEFCQlRkR0Z1WkdGeVpBQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QXFCQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQUFBVnB2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRhV2R5WVhScGIyNHVRV1JrUzJWNWMzQmhZMlVFRWt0bGVYTndZV05sTlZadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNXNiMk5oZEc5eUxsTnBiWEJzWlZOMGNtRjBaV2Q1QUFJa2NtVndiR2xqWVhScGIyNWZabUZqZEc5eUFqSUFBZ1FTUzJWNWMzQmhZMlUxRWxOMFlXNWtZWEprTVFBUVUzUmhibVJoY21RQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKcVptWm1abWJrL0FRQ0F2R2tDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUlBa0FBQUFBQUF2Ny8vLzhQQXBxWm1abVptYmsvQUp3UUFBQUFabTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1OaFkyaGxMbE5sY21saGJHbDZhVzVuUTJGamFHVlFjbTkyYVdSbGNnQUNmbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtTnZiWEJoWTNScGIyNHVVMmw2WlZScFpYSmxaRU52YlhCaFkzUnBiMjVUZEhKaGRHVm5lUUlBQWdBQUVrdGxlWE53WVdObE5SQkRiM1Z1ZEdWeU1RQVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1ltOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UTI5MWJuUmxja052YkhWdGJsUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QW5oQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQUFBUT09ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2dtcy5FbmRwb2ludFN0YXRlLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9nbXMuRW5kcG9pbnRTdGF0ZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzODNjNWEuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2dtcy5FbmRwb2ludFN0YXRlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9nbXMuR29zc2lwLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9nbXMuR29zc2lwLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBiMjdhOC4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvZ21zLkdvc3NpcC5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvc2VydmljZS5UcmVlUmVxdWVzdC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvc2VydmljZS5UcmVlUmVxdWVzdC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMmExYjguLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL3NlcnZpY2UuVHJlZVJlcXVlc3QuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL3NlcnZpY2UuVHJlZVJlc3BvbnNlLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9zZXJ2aWNlLlRyZWVSZXNwb25zZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkOTRlMmQuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL3NlcnZpY2UuVHJlZVJlc3BvbnNlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9zdHJlYW1pbmcuUGVuZGluZ0ZpbGUuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL3N0cmVhbWluZy5QZW5kaW5nRmlsZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYTA4NDQuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL3N0cmVhbWluZy5QZW5kaW5nRmlsZS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvc3RyZWFtaW5nLlN0cmVhbUhlYWRlci5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvc3RyZWFtaW5nLlN0cmVhbUhlYWRlci5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMTQzYjguLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL3N0cmVhbWluZy5TdHJlYW1IZWFkZXIuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL3N0cmVhbWluZy5TdHJlYW1SZXBseS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvc3RyZWFtaW5nLlN0cmVhbVJlcGx5LmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI3NDA1OC4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvc3RyZWFtaW5nLlN0cmVhbVJlcGx5LmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9zdHJlYW1pbmcuU3RyZWFtUmVxdWVzdE1lc3NhZ2UuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL3N0cmVhbWluZy5TdHJlYW1SZXF1ZXN0TWVzc2FnZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMTlhZDkuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL3N0cmVhbWluZy5TdHJlYW1SZXF1ZXN0TWVzc2FnZS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvdXRpbHMuQmxvb21GaWx0ZXIuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL3V0aWxzLkJsb29tRmlsdGVyLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwMzE3MC4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvdXRpbHMuQmxvb21GaWx0ZXIuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL3V0aWxzLkVzdGltYXRlZEhpc3RvZ3JhbS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvdXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkZDM5Yi4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvdXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC91dGlscy5MZWdhY3lCbG9vbUZpbHRlci5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvdXRpbHMuTGVnYWN5Qmxvb21GaWx0ZXIuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWVmMWI4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC91dGlscy5MZWdhY3lCbG9vbUZpbHRlci5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvZGIuUmFuZ2VTbGljZUNvbW1hbmQuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL2RiLlJhbmdlU2xpY2VDb21tYW5kLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjczZDczOC4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvZGIuUmFuZ2VTbGljZUNvbW1hbmQuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL2RiLlJvdy5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvZGIuUm93LmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ1YWQ5ZC4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvZGIuUm93LmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi9kYi5Sb3dNdXRhdGlvbi5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvZGIuUm93TXV0YXRpb24uYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjJkYWVkLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi9kYi5Sb3dNdXRhdGlvbi5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvZGIuU2xpY2VCeU5hbWVzUmVhZENvbW1hbmQuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL2RiLlNsaWNlQnlOYW1lc1JlYWRDb21tYW5kLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI5OTU2ZC4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvZGIuU2xpY2VCeU5hbWVzUmVhZENvbW1hbmQuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL2RiLlNsaWNlRnJvbVJlYWRDb21tYW5kLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi9kYi5TbGljZUZyb21SZWFkQ29tbWFuZC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNjhjZDMuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL2RiLlNsaWNlRnJvbVJlYWRDb21tYW5kLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi9kYi5UcnVuY2F0aW9uLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi9kYi5UcnVuY2F0aW9uLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE2Nzk5NS4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvZGIuVHJ1bmNhdGlvbi5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvZGIuV3JpdGVSZXNwb25zZS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvZGIuV3JpdGVSZXNwb25zZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNzYyMzguLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL2RiLldyaXRlUmVzcG9uc2UuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL2dtcy5FbmRwb2ludFN0YXRlLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi9nbXMuRW5kcG9pbnRTdGF0ZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkODUyNzkuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL2dtcy5FbmRwb2ludFN0YXRlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi9nbXMuR29zc2lwLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi9nbXMuR29zc2lwLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY1YWM1Ny4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvZ21zLkdvc3NpcC5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvc2VydmljZS5UcmVlUmVxdWVzdC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvc2VydmljZS5UcmVlUmVxdWVzdC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMmExYjguLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL3NlcnZpY2UuVHJlZVJlcXVlc3QuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL3NlcnZpY2UuVHJlZVJlc3BvbnNlLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi9zZXJ2aWNlLlRyZWVSZXNwb25zZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZjNjNmYuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL3NlcnZpY2UuVHJlZVJlc3BvbnNlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi9zdHJlYW1pbmcuUGVuZGluZ0ZpbGUuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL3N0cmVhbWluZy5QZW5kaW5nRmlsZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYzhmNzcuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL3N0cmVhbWluZy5QZW5kaW5nRmlsZS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvc3RyZWFtaW5nLlN0cmVhbUhlYWRlci5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvc3RyZWFtaW5nLlN0cmVhbUhlYWRlci5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNWI3YWMuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL3N0cmVhbWluZy5TdHJlYW1IZWFkZXIuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL3N0cmVhbWluZy5TdHJlYW1SZXBseS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvc3RyZWFtaW5nLlN0cmVhbVJlcGx5LmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkzMzMxNi4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvc3RyZWFtaW5nLlN0cmVhbVJlcGx5LmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi9zdHJlYW1pbmcuU3RyZWFtUmVxdWVzdE1lc3NhZ2UuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL3N0cmVhbWluZy5TdHJlYW1SZXF1ZXN0TWVzc2FnZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNTM1NzkuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL3N0cmVhbWluZy5TdHJlYW1SZXF1ZXN0TWVzc2FnZS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvdXRpbHMuQmxvb21GaWx0ZXIuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL3V0aWxzLkJsb29tRmlsdGVyLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0ZTdkZS4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvdXRpbHMuQmxvb21GaWx0ZXIuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL3V0aWxzLkVzdGltYXRlZEhpc3RvZ3JhbS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvdXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkZDM5Yi4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvdXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi91dGlscy5MZWdhY3lCbG9vbUZpbHRlci5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvdXRpbHMuTGVnYWN5Qmxvb21GaWx0ZXIuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWVmMWI4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi91dGlscy5MZWdhY3lCbG9vbUZpbHRlci5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvZGIuUmFuZ2VTbGljZUNvbW1hbmQuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL2RiLlJhbmdlU2xpY2VDb21tYW5kLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk5ZTQyOS4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvZGIuUmFuZ2VTbGljZUNvbW1hbmQuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL2RiLlNsaWNlQnlOYW1lc1JlYWRDb21tYW5kLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9kYi5TbGljZUJ5TmFtZXNSZWFkQ29tbWFuZC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YzMzYTIuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL2RiLlNsaWNlQnlOYW1lc1JlYWRDb21tYW5kLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9kYi5TbGljZUZyb21SZWFkQ29tbWFuZC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvZGIuU2xpY2VGcm9tUmVhZENvbW1hbmQuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmVlZGUzLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9kYi5TbGljZUZyb21SZWFkQ29tbWFuZC5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvZGIuVHJ1bmNhdGlvbi5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvZGIuVHJ1bmNhdGlvbi5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNjc5OTUuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL2RiLlRydW5jYXRpb24uYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL2dtcy5FbmRwb2ludFN0YXRlLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9nbXMuRW5kcG9pbnRTdGF0ZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkODk4OTMuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL2dtcy5FbmRwb2ludFN0YXRlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9nbXMuR29zc2lwLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9nbXMuR29zc2lwLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY1YWM1Ny4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvZ21zLkdvc3NpcC5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvc2VydmljZS5TeW5jQ29tcGxldGUuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL3NlcnZpY2UuU3luY0NvbXBsZXRlLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZjNzJlMS4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvc2VydmljZS5TeW5jQ29tcGxldGUuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL3NlcnZpY2UuU3luY1JlcXVlc3QuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL3NlcnZpY2UuU3luY1JlcXVlc3QuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTE4NDA1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9zZXJ2aWNlLlN5bmNSZXF1ZXN0LmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9zZXJ2aWNlLlZhbGlkYXRpb25Db21wbGV0ZS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvc2VydmljZS5WYWxpZGF0aW9uQ29tcGxldGUuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzhkN2JlLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9zZXJ2aWNlLlZhbGlkYXRpb25Db21wbGV0ZS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvc2VydmljZS5WYWxpZGF0aW9uUmVxdWVzdC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvc2VydmljZS5WYWxpZGF0aW9uUmVxdWVzdC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzRjNDcuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL3NlcnZpY2UuVmFsaWRhdGlvblJlcXVlc3QuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL3N0cmVhbWluZy5QZW5kaW5nRmlsZS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvc3RyZWFtaW5nLlBlbmRpbmdGaWxlLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjOGY3Ny4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvc3RyZWFtaW5nLlBlbmRpbmdGaWxlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9zdHJlYW1pbmcuU3RyZWFtSGVhZGVyLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9zdHJlYW1pbmcuU3RyZWFtSGVhZGVyLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdlNWVkYy4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvc3RyZWFtaW5nLlN0cmVhbUhlYWRlci5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvc3RyZWFtaW5nLlN0cmVhbVJlcGx5LmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9zdHJlYW1pbmcuU3RyZWFtUmVwbHkuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDk0ZWNjLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9zdHJlYW1pbmcuU3RyZWFtUmVwbHkuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL3N0cmVhbWluZy5TdHJlYW1SZXF1ZXN0TWVzc2FnZS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvc3RyZWFtaW5nLlN0cmVhbVJlcXVlc3RNZXNzYWdlLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFhYWY3OC4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvc3RyZWFtaW5nLlN0cmVhbVJlcXVlc3RNZXNzYWdlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC91dGlscy5CbG9vbUZpbHRlci5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvdXRpbHMuQmxvb21GaWx0ZXIuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmY3MmY1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC91dGlscy5CbG9vbUZpbHRlci5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvdXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC91dGlscy5Fc3RpbWF0ZWRIaXN0b2dyYW0uYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWRkMzliLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC91dGlscy5Fc3RpbWF0ZWRIaXN0b2dyYW0uYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL3V0aWxzLkxlZ2FjeUJsb29tRmlsdGVyLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC91dGlscy5MZWdhY3lCbG9vbUZpbHRlci5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZWYxYjguLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL3V0aWxzLkxlZ2FjeUJsb29tRmlsdGVyLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS9kYi5SYW5nZVNsaWNlQ29tbWFuZC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvZGIuUmFuZ2VTbGljZUNvbW1hbmQuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODUyZGYwLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS9kYi5SYW5nZVNsaWNlQ29tbWFuZC5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvZGIuU2xpY2VCeU5hbWVzUmVhZENvbW1hbmQuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4xL2RiLlNsaWNlQnlOYW1lc1JlYWRDb21tYW5kLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTljMzNhMi4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvZGIuU2xpY2VCeU5hbWVzUmVhZENvbW1hbmQuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4xL2RiLlNsaWNlRnJvbVJlYWRDb21tYW5kLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS9kYi5TbGljZUZyb21SZWFkQ29tbWFuZC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZWVkZTMuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4xL2RiLlNsaWNlRnJvbVJlYWRDb21tYW5kLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS9kYi5UcnVuY2F0aW9uLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS9kYi5UcnVuY2F0aW9uLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE2Nzk5NS4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvZGIuVHJ1bmNhdGlvbi5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvZGIuV3JpdGVSZXNwb25zZS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvZGIuV3JpdGVSZXNwb25zZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4xL2RiLldyaXRlUmVzcG9uc2UuYmluCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS9nbXMuRW5kcG9pbnRTdGF0ZS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvZ21zLkVuZHBvaW50U3RhdGUuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODdmYzc3Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS9nbXMuRW5kcG9pbnRTdGF0ZS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvZ21zLkdvc3NpcC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvZ21zLkdvc3NpcC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNWFjNTcuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4xL2dtcy5Hb3NzaXAuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4xL3NlcnZpY2UuU3luY0NvbXBsZXRlLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS9zZXJ2aWNlLlN5bmNDb21wbGV0ZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzM2FiZTIuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4xL3NlcnZpY2UuU3luY0NvbXBsZXRlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS9zZXJ2aWNlLlN5bmNSZXF1ZXN0LmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS9zZXJ2aWNlLlN5bmNSZXF1ZXN0LmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJiOGJmOS4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvc2VydmljZS5TeW5jUmVxdWVzdC5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvc2VydmljZS5WYWxpZGF0aW9uQ29tcGxldGUuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4xL3NlcnZpY2UuVmFsaWRhdGlvbkNvbXBsZXRlLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVmZjQ4Zi4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvc2VydmljZS5WYWxpZGF0aW9uQ29tcGxldGUuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4xL3NlcnZpY2UuVmFsaWRhdGlvblJlcXVlc3QuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4xL3NlcnZpY2UuVmFsaWRhdGlvblJlcXVlc3QuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzc0ZDA1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS9zZXJ2aWNlLlZhbGlkYXRpb25SZXF1ZXN0LmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS91dGlscy5CbG9vbUZpbHRlci5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvdXRpbHMuQmxvb21GaWx0ZXIuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTcwNDJhLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS91dGlscy5CbG9vbUZpbHRlci5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvdXRpbHMuQmxvb21GaWx0ZXIxMDAwLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS91dGlscy5CbG9vbUZpbHRlcjEwMDAuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTk2NzljLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS91dGlscy5CbG9vbUZpbHRlcjEwMDAuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4xL3V0aWxzLkVzdGltYXRlZEhpc3RvZ3JhbS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvdXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkZDM5Yi4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvdXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzMuMC9nbXMuRW5kcG9pbnRTdGF0ZS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8zLjAvZ21zLkVuZHBvaW50U3RhdGUuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjMwYWUxLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzMuMC9nbXMuRW5kcG9pbnRTdGF0ZS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8zLjAvZ21zLkdvc3NpcC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8zLjAvZ21zLkdvc3NpcC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNWFjNTcuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMy4wL2dtcy5Hb3NzaXAuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMy4wL3NlcnZpY2UuU3luY0NvbXBsZXRlLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzMuMC9zZXJ2aWNlLlN5bmNDb21wbGV0ZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZWE0YjQuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMy4wL3NlcnZpY2UuU3luY0NvbXBsZXRlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzMuMC9zZXJ2aWNlLlN5bmNSZXF1ZXN0LmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzMuMC9zZXJ2aWNlLlN5bmNSZXF1ZXN0LmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UwOTc3Ny4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8zLjAvc2VydmljZS5TeW5jUmVxdWVzdC5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8zLjAvc2VydmljZS5WYWxpZGF0aW9uQ29tcGxldGUuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMy4wL3NlcnZpY2UuVmFsaWRhdGlvbkNvbXBsZXRlLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhmMGZiOS4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8zLjAvc2VydmljZS5WYWxpZGF0aW9uQ29tcGxldGUuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMy4wL3NlcnZpY2UuVmFsaWRhdGlvblJlcXVlc3QuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMy4wL3NlcnZpY2UuVmFsaWRhdGlvblJlcXVlc3QuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDA3NjNiLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzMuMC9zZXJ2aWNlLlZhbGlkYXRpb25SZXF1ZXN0LmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzMuMC91dGlscy5CbG9vbUZpbHRlci5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8zLjAvdXRpbHMuQmxvb21GaWx0ZXIuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGJmYjRmLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzMuMC91dGlscy5CbG9vbUZpbHRlci5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8zLjAvdXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzMuMC91dGlscy5Fc3RpbWF0ZWRIaXN0b2dyYW0uYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWRkMzliLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzMuMC91dGlscy5Fc3RpbWF0ZWRIaXN0b2dyYW0uYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4wL2dtcy5FbmRwb2ludFN0YXRlLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMC9nbXMuRW5kcG9pbnRTdGF0ZS5iaW4KaW5kZXggMTdmYzA4OC4uMDgzZGJiNyAxMDA2NDQKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4wL2dtcy5FbmRwb2ludFN0YXRlLmJpbgorKysgYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjAvZ21zLkVuZHBvaW50U3RhdGUuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMC9nbXMuR29zc2lwLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMC9nbXMuR29zc2lwLmJpbgppbmRleCAyZmJkNWQ0Li43YTRmYjU2IDEwMDY0NAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjAvZ21zLkdvc3NpcC5iaW4KKysrIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4wL2dtcy5Hb3NzaXAuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMC9zZXJ2aWNlLlN5bmNDb21wbGV0ZS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjAvc2VydmljZS5TeW5jQ29tcGxldGUuYmluCmluZGV4IDRlOGNhYTYuLjM5YTYyNDMgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMC9zZXJ2aWNlLlN5bmNDb21wbGV0ZS5iaW4KKysrIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4wL3NlcnZpY2UuU3luY0NvbXBsZXRlLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjAvc2VydmljZS5TeW5jUmVxdWVzdC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjAvc2VydmljZS5TeW5jUmVxdWVzdC5iaW4KaW5kZXggMTdiYjAxNC4uZjg1M2IyMCAxMDA2NDQKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4wL3NlcnZpY2UuU3luY1JlcXVlc3QuYmluCisrKyBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMC9zZXJ2aWNlLlN5bmNSZXF1ZXN0LmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjAvc2VydmljZS5WYWxpZGF0aW9uQ29tcGxldGUuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4wL3NlcnZpY2UuVmFsaWRhdGlvbkNvbXBsZXRlLmJpbgppbmRleCA3NDAyYzllLi5iYjRkZTQzIDEwMDY0NAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjAvc2VydmljZS5WYWxpZGF0aW9uQ29tcGxldGUuYmluCisrKyBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMC9zZXJ2aWNlLlZhbGlkYXRpb25Db21wbGV0ZS5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4wL3NlcnZpY2UuVmFsaWRhdGlvblJlcXVlc3QuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4wL3NlcnZpY2UuVmFsaWRhdGlvblJlcXVlc3QuYmluCmluZGV4IGZhNGE5MTMuLjA0YzQ5MmEgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMC9zZXJ2aWNlLlZhbGlkYXRpb25SZXF1ZXN0LmJpbgorKysgYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjAvc2VydmljZS5WYWxpZGF0aW9uUmVxdWVzdC5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4xL2dtcy5FbmRwb2ludFN0YXRlLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMS9nbXMuRW5kcG9pbnRTdGF0ZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4M2RiYjcuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4xL2dtcy5FbmRwb2ludFN0YXRlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMS9nbXMuR29zc2lwLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMS9nbXMuR29zc2lwLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E0ZmI1Ni4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjEvZ21zLkdvc3NpcC5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjEvc2VydmljZS5TeW5jQ29tcGxldGUuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4xL3NlcnZpY2UuU3luY0NvbXBsZXRlLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlhNjI0My4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjEvc2VydmljZS5TeW5jQ29tcGxldGUuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4xL3NlcnZpY2UuU3luY1JlcXVlc3QuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4xL3NlcnZpY2UuU3luY1JlcXVlc3QuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODUzYjIwLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMS9zZXJ2aWNlLlN5bmNSZXF1ZXN0LmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMS9zZXJ2aWNlLlZhbGlkYXRpb25Db21wbGV0ZS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjEvc2VydmljZS5WYWxpZGF0aW9uQ29tcGxldGUuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjRkZTQzLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMS9zZXJ2aWNlLlZhbGlkYXRpb25Db21wbGV0ZS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjEvc2VydmljZS5WYWxpZGF0aW9uUmVxdWVzdC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjEvc2VydmljZS5WYWxpZGF0aW9uUmVxdWVzdC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YzQ5MmEuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4xL3NlcnZpY2UuVmFsaWRhdGlvblJlcXVlc3QuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4xL3V0aWxzLkVzdGltYXRlZEhpc3RvZ3JhbS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjEvdXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3OGVkYS4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjEvdXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvYWN0aW9uL0dvc3NpcEhlbHBlci5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9hY3Rpb24vR29zc2lwSGVscGVyLmphdmEKaW5kZXggNWIyM2I4Ni4uN2E0NjkzNSAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9hY3Rpb24vR29zc2lwSGVscGVyLmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9hY3Rpb24vR29zc2lwSGVscGVyLmphdmEKQEAgLTMyLDYgKzMyLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSW5zdGFuY2U7CkBAIC00NjcsMjUgKzQ2OCwyNCBAQAogICAgICAgICByZXR1cm4gbmV0VmVyc2lvbjsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2l0aFByb3BlcnR5KFN0cmluZyBwcm9wLCBib29sZWFuIHZhbHVlLCBSdW5uYWJsZSByKQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3aXRoUHJvcGVydHkoQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzIHByb3AsIGJvb2xlYW4gdmFsdWUsIFJ1bm5hYmxlIHIpCiAgICAgewogICAgICAgICB3aXRoUHJvcGVydHkocHJvcCwgQm9vbGVhbi50b1N0cmluZyh2YWx1ZSksIHIpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3aXRoUHJvcGVydHkoU3RyaW5nIHByb3AsIFN0cmluZyB2YWx1ZSwgUnVubmFibGUgcikKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2l0aFByb3BlcnR5KENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyBwcm9wLCBTdHJpbmcgdmFsdWUsIFJ1bm5hYmxlIHIpCiAgICAgewotICAgICAgICBTdHJpbmcgYmVmb3JlID0gU3lzdGVtLmdldFByb3BlcnR5KHByb3ApOworICAgICAgICBTdHJpbmcgcHJldiA9IHByb3Auc2V0U3RyaW5nKHZhbHVlKTsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShwcm9wLCB2YWx1ZSk7CiAgICAgICAgICAgICByLnJ1bigpOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsbHkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGJlZm9yZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KHByb3ApOworICAgICAgICAgICAgaWYgKHByZXYgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwcm9wLmNsZWFyVmFsdWUoKTsgLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgbmVhcmJ5ICdjbGVhclZhbHVlU3lzdGVtUHJvcGVydHlVc2FnZScKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkocHJvcCwgYmVmb3JlKTsKKyAgICAgICAgICAgICAgICBwcm9wLnNldFN0cmluZyhwcmV2KTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvYXBpL1Jvdy5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9hcGkvUm93LmphdmEKaW5kZXggMzMyNzJlZC4uOWQwOGNiMiAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9hcGkvUm93LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9hcGkvUm93LmphdmEKQEAgLTYyLDcgKzYyLDcgQEAKICAgICAgICAgdGhpcy5uYW1lSW5kZXggPSBuYW1lSW5kZXg7CiAgICAgfQogCi0gICAgdm9pZCBzZXRSZXN1bHRzKE9iamVjdFtdIHJlc3VsdHMpCisgICAgcHVibGljIHZvaWQgc2V0UmVzdWx0cyhPYmplY3RbXSByZXN1bHRzKQogICAgIHsKICAgICAgICAgdGhpcy5yZXN1bHRzID0gcmVzdWx0czsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL2Z1enovSGFycnlIZWxwZXIuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvZnV6ei9IYXJyeUhlbHBlci5qYXZhCmluZGV4IDI5OTdmYTYuLjY2MTc4ZjIgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvZnV6ei9IYXJyeUhlbHBlci5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvZnV6ei9IYXJyeUhlbHBlci5qYXZhCkBAIC0yNiwxOSArMjYsMjggQEAKIGltcG9ydCBoYXJyeS5tb2RlbC5jbG9jay5PZmZzZXRDbG9jazsKIGltcG9ydCBoYXJyeS5tb2RlbC5zdXQuUHJpbnRsblN1dDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9BTExPV19TSU1QTEVfU1RSQVRFR1k7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX01JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkRJU0FCTEVfVENBQ1RJVkVfT1BFTlNTTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5MT0c0SjJfRElTQUJMRV9KTVg7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTE9HNEoyX0RJU0FCTEVfSk1YX0xFR0FDWTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5MT0c0Sl9TSFVURE9XTl9IT09LX0VOQUJMRUQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuT1JHX0FQQUNIRV9DQVNTQU5EUkFfRElTQUJMRV9NQkVBTl9SRUdJU1RSQVRJT047CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUkVMT0NBVEVEX1NIQURFRF9JT19ORVRUWV9UUkFOU1BPUlRfTk9OQVRJVkU7CisKIHB1YmxpYyBjbGFzcyBIYXJyeUhlbHBlcgogewogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCkKICAgICB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgibG9nNGoyLmRpc2FibGVKbXgiLCAidHJ1ZSIpOyAvLyBzZXR0aW5nIGJvdGggd2F5cyBhcyBjaGFuZ2VzIGJldHdlZW4gdmVyc2lvbnMKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJsb2c0ajIuZGlzYWJsZS5qbXgiLCAidHJ1ZSIpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImxvZzRqLnNodXRkb3duSG9va0VuYWJsZWQiLCAiZmFsc2UiKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuYWxsb3dfc2ltcGxlc3RyYXRlZ3kiLCAidHJ1ZSIpOyAvLyBtYWtlcyBlYXNpZXIgdG8gc2hhcmUgT1NTIHRlc3RzIHdpdGhvdXQgUkYgbGltaXRzCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLm1pbmltdW1fcmVwbGljYXRpb25fZmFjdG9yIiwgIjAiKTsgLy8gbWFrZXMgZWFzaWVyIHRvIHNoYXJlIE9TUyB0ZXN0cyB3aXRob3V0IFJGIGxpbWl0cwotCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmRpc2FibGVfdGNhY3RpdmVfb3BlbnNzbCIsICJ0cnVlIik7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgicmVsb2NhdGVkLnNoYWRlZC5pby5uZXR0eS50cmFuc3BvcnQubm9OYXRpdmUiLCAidHJ1ZSIpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc2FibGVfbWJlYW5fcmVnaXN0cmF0aW9uIiwgInRydWUiKTsKKyAgICAgICAgLy8gc2V0dGluZyBib3RoIHdheXMgYXMgY2hhbmdlcyBiZXR3ZWVuIHZlcnNpb25zCisgICAgICAgIExPRzRKMl9ESVNBQkxFX0pNWC5zZXRCb29sZWFuKHRydWUpOworICAgICAgICBMT0c0SjJfRElTQUJMRV9KTVhfTEVHQUNZLnNldEJvb2xlYW4odHJ1ZSk7CisgICAgICAgIExPRzRKX1NIVVRET1dOX0hPT0tfRU5BQkxFRC5zZXRCb29sZWFuKGZhbHNlKTsKKyAgICAgICAgQ0FTU0FORFJBX0FMTE9XX1NJTVBMRV9TVFJBVEVHWS5zZXRCb29sZWFuKHRydWUpOyAvLyBtYWtlcyBlYXNpZXIgdG8gc2hhcmUgT1NTIHRlc3RzIHdpdGhvdXQgUkYgbGltaXRzCisgICAgICAgIENBU1NBTkRSQV9NSU5JTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUi5zZXRJbnQoMCk7IC8vIG1ha2VzIGVhc2llciB0byBzaGFyZSBPU1MgdGVzdHMgd2l0aG91dCBSRiBsaW1pdHMKKyAgICAgICAgRElTQUJMRV9UQ0FDVElWRV9PUEVOU1NMLnNldEJvb2xlYW4odHJ1ZSk7CisgICAgICAgIFJFTE9DQVRFRF9TSEFERURfSU9fTkVUVFlfVFJBTlNQT1JUX05PTkFUSVZFLnNldEJvb2xlYW4odHJ1ZSk7CisgICAgICAgIE9SR19BUEFDSEVfQ0FTU0FORFJBX0RJU0FCTEVfTUJFQU5fUkVHSVNUUkFUSU9OLnNldEJvb2xlYW4odHJ1ZSk7CiAKICAgICAgICAgSW5Kdm1TdXQuaW5pdCgpOwogICAgICAgICBRdWVyeWluZ05vT3BDaGVja2VyLmluaXQoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvZnV6ei9TU1RhYmxlR2VuZXJhdG9yLmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL2Z1enovU1NUYWJsZUdlbmVyYXRvci5qYXZhCmluZGV4IDYyN2QzNjAuLmM3ZDBmYmIgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvZnV6ei9TU1RhYmxlR2VuZXJhdG9yLmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9mdXp6L1NTVGFibGVHZW5lcmF0b3IuamF2YQpAQCAtMzA2LDcgKzMwNiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFic3RyYWN0TWFya2VyLlJhdyh2YWx1ZXMuc2l6ZSgpIC0gMSkpKTsKICAgICAgICAgfQogCi0gICAgICAgIFN0YXRlbWVudFJlc3RyaWN0aW9ucyByZXN0cmljdGlvbnMgPSBuZXcgU3RhdGVtZW50UmVzdHJpY3Rpb25zKFN0YXRlbWVudFR5cGUuREVMRVRFLAorICAgICAgICBTdGF0ZW1lbnRSZXN0cmljdGlvbnMgcmVzdHJpY3Rpb25zID0gbmV3IFN0YXRlbWVudFJlc3RyaWN0aW9ucyhudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZW1lbnRUeXBlLkRFTEVURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYnVpbGQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlU3BlY2lmaWNhdGlvbnModmFyaWFibGVOYW1lcyksCmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL2ltcGwvQWJzdHJhY3RDbHVzdGVyLmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL2ltcGwvQWJzdHJhY3RDbHVzdGVyLmphdmEKaW5kZXggNDczNzE3Ny4uNzkxMjBhMiAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9pbXBsL0Fic3RyYWN0Q2x1c3Rlci5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvaW1wbC9BYnN0cmFjdENsdXN0ZXIuamF2YQpAQCAtMTg5LDcgKzE4OSw3IEBACiAgICAgICAgICAgICAvLyBJbmRpY2F0ZSB0aGF0IHdlIGFyZSBydW5uaW5nIGluIHRoZSBpbi1qdm0gZHRlc3QgZW52aXJvbm1lbnQKICAgICAgICAgICAgIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5EVEVTVF9JU19JTl9KVk1fRFRFU1Quc2V0Qm9vbGVhbih0cnVlKTsKICAgICAgICAgICAgIC8vIHRob3NlIHByb3BlcnRpZXMgbWF5IGJlIHNldCBmb3IgdW5pdC10ZXN0IG9wdGltaXphdGlvbnM7IHRob3NlIHNob3VsZCBub3QgYmUgdXNlZCB3aGVuIHJ1bm5pbmcgZHRlc3RzCi0gICAgICAgICAgICBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRkxVU0hfTE9DQUxfU0NIRU1BX0NIQU5HRVMucmVzZXQoKTsKKyAgICAgICAgICAgIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0ZMVVNIX0xPQ0FMX1NDSEVNQV9DSEFOR0VTLnJlc2V0KCk7CiAgICAgICAgICAgICBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTk9OX0dSQUNFRlVMX1NIVVRET1dOLnJlc2V0KCk7CiAgICAgICAgIH0KIApAQCAtNjUyLDYgKzY1MiwxNiBAQAogICAgICAgICByZXR1cm4gc3RyZWFtKCkubWFwKElJbnN0YW5jZTo6Y29vcmRpbmF0b3IpOwogICAgIH0KIAorICAgIHB1YmxpYyBMaXN0PEk+IGdldChpbnQuLi4gbm9kZXMpCisgICAgeworICAgICAgICBpZiAobm9kZXMgPT0gbnVsbCB8fCBub2Rlcy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIG5vZGVzIHByb3ZpZGVkIik7CisgICAgICAgIExpc3Q8ST4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8Pihub2Rlcy5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpIDogbm9kZXMpCisgICAgICAgICAgICBsaXN0LmFkZChnZXQoaSkpOworICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBXQVJOSU5HOiB3ZSBpbmRleCBmcm9tIDEgaGVyZSwgZm9yIGNvbnNpc3RlbmN5IHdpdGggaW5ldCBhZGRyZXNzIQogICAgICAqLwpAQCAtNjY1LDE2ICs2NzUsNiBAQAogICAgICAgICByZXR1cm4gaW5zdGFuY2VNYXAuZ2V0KGFkZHIpOwogICAgIH0KIAotICAgIHB1YmxpYyBMaXN0PEk+IGdldChpbnQuLi4gbm9kZXMpCi0gICAgewotICAgICAgICBpZiAobm9kZXMgPT0gbnVsbCB8fCBub2Rlcy5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIG5vZGVzIHByb3ZpZGVkIik7Ci0gICAgICAgIExpc3Q8ST4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8Pihub2Rlcy5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpIDogbm9kZXMpCi0gICAgICAgICAgICBsaXN0LmFkZChnZXQoaSkpOwotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KICAgICBwdWJsaWMgSSBnZXRGaXJzdFJ1bm5pbmdJbnN0YW5jZSgpCiAgICAgewogICAgICAgICByZXR1cm4gc3RyZWFtKCkuZmlsdGVyKGkgLT4gIWkuaXNTaHV0ZG93bigpKS5maW5kRmlyc3QoKS5vckVsc2VUaHJvdygKQEAgLTEwNDUsNiArMTA0NSw4IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKQogICAgIHsKKyAgICAgICAgbG9nZ2VyLmluZm8oIkNsb3NpbmcgY2x1c3RlciB7fSIsIHRoaXMuY2x1c3RlcklkKTsKKyAgICAgICAgRkJVdGlsaXRpZXMuY2xvc2VRdWlldGx5KGluc3RhbmNlSW5pdGlhbGl6ZXIpOwogICAgICAgICBGQlV0aWxpdGllcy53YWl0T25GdXR1cmVzKGluc3RhbmNlcy5zdHJlYW0oKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoaSAtPiAhaS5pc1NodXRkb3duKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChJSW5zdGFuY2U6OnNodXRkb3duKQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9pbXBsL0NvbGxlY3RpbmdSTUlTZXJ2ZXJTb2NrZXRGYWN0b3J5SW1wbC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9pbXBsL0NvbGxlY3RpbmdSTUlTZXJ2ZXJTb2NrZXRGYWN0b3J5SW1wbC5qYXZhCmluZGV4IDVlNjdlYWYuLjBmYzc0MjUgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvaW1wbC9Db2xsZWN0aW5nUk1JU2VydmVyU29ja2V0RmFjdG9yeUltcGwuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL2ltcGwvQ29sbGVjdGluZ1JNSVNlcnZlclNvY2tldEZhY3RvcnlJbXBsLmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCiBpbXBvcnQgamF2YXgubmV0LlNlcnZlclNvY2tldEZhY3Rvcnk7CiAKIApkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9pbXBsL0luc3RhbmNlLmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL2ltcGwvSW5zdGFuY2UuamF2YQppbmRleCA5OTc1YWViLi43MDdkYTQ5IDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL2ltcGwvSW5zdGFuY2UuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL2ltcGwvSW5zdGFuY2UuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlU3lzdGVtOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVN5c3RlbXM7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwpAQCAtNDIsOCArNDMsNiBAQAogaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTGlzdGVuZXJOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbjsKIGltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWENvbm5lY3RvclNlcnZlcjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5ybWkuUk1JSlJNUFNlcnZlckltcGw7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuVW5pbnRlcnJ1cHRpYmxlczsKQEAgLTk4LDggKzk3LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oaW50cy5IaW50c1NlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguU2Vjb25kYXJ5SW5kZXhNYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLklWZXJzaW9uZWRBc3ltbWV0cmljU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkluZGV4U3VtbWFyeU1hbmFnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeS5JbmRleFN1bW1hcnlNYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0QnVmZmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dEJ1ZmZlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOwpAQCAtMTQ1LDE3ICsxNDQsMjAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5EaWFnbm9zdGljU25hcHNob3RTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkV4ZWN1dG9yVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSk1YU2VydmVyVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSlZNU3RhYmlsaXR5SW5zcGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk1CZWFuV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5STUlDbGllbnRTb2NrZXRGYWN0b3J5SW1wbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuUmVmOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmxvZ2dpbmcuTG9nZ2luZ1N1cHBvcnRGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5CdWZmZXJQb29sczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5wcm9ncmVzcy5qbXguSk1YQnJvYWRjYXN0RXhlY3V0b3I7CiAKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlOVVRFUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvckZhY3RvcnkuR2xvYmFsLmV4ZWN1dG9yRmFjdG9yeTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DT05TSVNURU5UX1JBTkdFX01PVkVNRU5UOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNPTlNJU1RFTlRfU0lNVUxUQU5FT1VTX01PVkVTX0FMTE9XOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJJTkdfREVMQVk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9DQVNTQU5EUkFfU1VJVEVOQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfQ0FTU0FORFJBX1RFU1RUQUc7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLkJMQU5LX0dPU1NJUDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmUuR09TU0lQOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZS5KTVg7CkBAIC0xNzEsMTggKzE3MywxMSBAQAogICovCiBwdWJsaWMgY2xhc3MgSW5zdGFuY2UgZXh0ZW5kcyBJc29sYXRlZEV4ZWN1dG9yIGltcGxlbWVudHMgSUludm9rYWJsZUluc3RhbmNlCiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJNSV9LRUVQQUxJVkVfVElNRSA9IDEwMDA7CiAgICAgcHJpdmF0ZSBMb2dnZXIgaW5JbnN0YW5jZWxvZ2dlcjsgLy8gRGVmZXIgY3JlYXRpb24gdW50aWwgcnVubmluZyBpbiB0aGUgaW5zdGFuY2UgY29udGV4dAogICAgIHB1YmxpYyBmaW5hbCBJSW5zdGFuY2VDb25maWcgY29uZmlnOwogICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOwogICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBpbnRlcm5vZGVNZXNzYWdpbmdTdGFydGVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNMb25nIHN0YXJ0ZWRBdCA9IG5ldyBBdG9taWNMb25nKCk7Ci0gICAgcHJpdmF0ZSBKTVhDb25uZWN0b3JTZXJ2ZXIgam14Q29ubmVjdG9yU2VydmVyOwotICAgIHByaXZhdGUgSk1YU2VydmVyVXRpbHMuSm14UmVnaXN0cnkgcmVnaXN0cnk7Ci0gICAgcHJpdmF0ZSBSTUlKUk1QU2VydmVySW1wbCBqbXhSbWlTZXJ2ZXI7Ci0gICAgcHJpdmF0ZSBNQmVhbldyYXBwZXIuSW5zdGFuY2VNQmVhbldyYXBwZXIgd3JhcHBlcjsKLSAgICBwcml2YXRlIFJNSUNsaWVudFNvY2tldEZhY3RvcnlJbXBsIGNsaWVudFNvY2tldEZhY3Rvcnk7Ci0gICAgcHJpdmF0ZSBDb2xsZWN0aW5nUk1JU2VydmVyU29ja2V0RmFjdG9yeUltcGwgc2VydmVyU29ja2V0RmFjdG9yeTsKICAgICBwcml2YXRlIElzb2xhdGVkSm14IGlzb2xhdGVkSm14OwogCiAgICAgQERlcHJlY2F0ZWQKQEAgLTIzMCwxNCArMjI1LDE0IEBACiAgICAgewogICAgICAgICAvLyB0aGUgcGF0aCB1c2VkIGlzIGRlZmluZWQgYnkgdGVzdC9jb25mL2xvZ2JhY2stZHRlc3QueG1sIGFuZCBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmcKICAgICAgICAgLy8gLi9idWlsZC90ZXN0L2xvZ3MvJHtjYXNzYW5kcmEudGVzdHRhZ30vJHtzdWl0ZW5hbWV9LyR7Y2x1c3Rlcl9pZH0vJHtpbnN0YW5jZV9pZH0vc3lzdGVtLmxvZwotICAgICAgICBTdHJpbmcgdGFnID0gU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEudGVzdHRhZyIsICJjYXNzYW5kcmEudGVzdHRhZ19JU19VTkRFRklORUQiKTsKLSAgICAgICAgU3RyaW5nIHN1aXRlID0gU3lzdGVtLmdldFByb3BlcnR5KCJzdWl0ZW5hbWUiLCAic3VpdGVuYW1lX0lTX1VOREVGSU5FRCIpOworICAgICAgICBTdHJpbmcgdGFnID0gVEVTVF9DQVNTQU5EUkFfVEVTVFRBRy5nZXRTdHJpbmcoKTsKKyAgICAgICAgU3RyaW5nIHN1aXRlID0gVEVTVF9DQVNTQU5EUkFfU1VJVEVOQU1FLmdldFN0cmluZygpOwogICAgICAgICBTdHJpbmcgY2x1c3RlcklkID0gQ2x1c3RlcklERGVmaW5lci5nZXRJZCgpOwogICAgICAgICBTdHJpbmcgaW5zdGFuY2VJZCA9IEluc3RhbmNlSUREZWZpbmVyLmdldEluc3RhbmNlSWQoKTsKLSAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoU3RyaW5nLmZvcm1hdCgiYnVpbGQvdGVzdC9sb2dzLyVzLyVzLyVzLyVzL3N5c3RlbS5sb2ciLCB0YWcsIHN1aXRlLCBjbHVzdGVySWQsIGluc3RhbmNlSWQpKTsKKyAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoRmlsZVN5c3RlbXMuZ2V0RGVmYXVsdCgpLCBTdHJpbmcuZm9ybWF0KCJidWlsZC90ZXN0L2xvZ3MvJXMvJXMvJXMvJXMvc3lzdGVtLmxvZyIsIHRhZywgc3VpdGUsIGNsdXN0ZXJJZCwgaW5zdGFuY2VJZCkpOwogICAgICAgICAvLyB3aGVuIGNyZWF0aW5nIGEgY2x1c3RlciBnbG9iYWxseSBpbiBhIHRlc3QgY2xhc3Mgd2UgZ2V0IHRoZSBsb2dzIHdpdGhvdXQgdGhlIHN1aXRlLCB0cnkgZmluZGluZyB0aG9zZSBsb2dzOgogICAgICAgICBpZiAoIWYuZXhpc3RzKCkpCi0gICAgICAgICAgICBmID0gbmV3IEZpbGUoU3RyaW5nLmZvcm1hdCgiYnVpbGQvdGVzdC9sb2dzLyVzLyVzLyVzL3N5c3RlbS5sb2ciLCB0YWcsIGNsdXN0ZXJJZCwgaW5zdGFuY2VJZCkpOworICAgICAgICAgICAgZiA9IG5ldyBGaWxlKEZpbGVTeXN0ZW1zLmdldERlZmF1bHQoKSwgU3RyaW5nLmZvcm1hdCgiYnVpbGQvdGVzdC9sb2dzLyVzLyVzLyVzL3N5c3RlbS5sb2ciLCB0YWcsIGNsdXN0ZXJJZCwgaW5zdGFuY2VJZCkpOwogICAgICAgICBpZiAoIWYuZXhpc3RzKCkpCiAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIlVuYWJsZSB0byBsb2NhdGUgc3lzdGVtLmxvZyB1bmRlciAiICsgbmV3IEZpbGUoImJ1aWxkL3Rlc3QvbG9ncyIpLmFic29sdXRlUGF0aCgpICsgIjsgbWFrZSBzdXJlIElDbHVzdGVyLnNldHVwKCkgaXMgY2FsbGVkIG9yIGV4dGVuZCBUZXN0QmFzZUltcGwgYW5kIGRvIG5vdCBkZWZpbmUgYSBzdGF0aWMgYmVmb3JlQ2xhc3MgZnVuY3Rpb24gd2l0aCBAQmVmb3JlQ2xhc3MiKTsKICAgICAgICAgcmV0dXJuIG5ldyBGaWxlTG9nQWN0aW9uKGYpOwpAQCAtNDU1LDcgKzQ1MCw3IEBACiAgICAgICAgIGJhdGNoLmlkLnNlcmlhbGl6ZShvdXQpOwogICAgICAgICBvdXQud3JpdGVMb25nKGJhdGNoLmNyZWF0aW9uVGltZSk7CiAKLSAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGJhdGNoLmdldEVuY29kZWRNdXRhdGlvbnMoKS5zaXplKCkpOworICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihiYXRjaC5nZXRFbmNvZGVkTXV0YXRpb25zKCkuc2l6ZSgpKTsKIAogICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgbXV0YXRpb24gOiBiYXRjaC5nZXRFbmNvZGVkTXV0YXRpb25zKCkpCiAgICAgICAgIHsKQEAgLTUyMiw3ICs1MTcsMTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBoZWFkZXIudmVyYi5zdGFnZS5leGVjdXRvcigpLmV4ZWN1dGUoRXhlY3V0b3JMb2NhbHMuY3JlYXRlKHN0YXRlKSwgKCkgLT4gTWVzc2FnaW5nU2VydmljZS5pbnN0YW5jZSgpLmluYm91bmRTaW5rLmFjY2VwdChtZXNzYWdlSW4pKTsKKyAgICAgICAgICAgICAgICBFeGVjdXRvclBsdXMgZXhlY3V0b3IgPSBoZWFkZXIudmVyYi5zdGFnZS5leGVjdXRvcigpOworICAgICAgICAgICAgICAgIGlmIChleGVjdXRvci5pc1NodXRkb3duKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNZXNzYWdpbmdTZXJ2aWNlLmluc3RhbmNlKCkubWV0cmljcy5yZWNvcmREcm9wcGVkTWVzc2FnZShtZXNzYWdlSW4sIG1lc3NhZ2VJbi5lbGFwc2VkU2luY2VDcmVhdGVkKFRpbWVVbml0Lk5BTk9TRUNPTkRTKSwgVGltZVVuaXQuTkFOT1NFQ09ORFMpOworICAgICAgICAgICAgICAgICAgICBpbkluc3RhbmNlbG9nZ2VyLndhcm4oIkRyb3BwaW5nIG1lc3NhZ2Uge30gZHVlIHRvIHN0YWdlIHt9IGJlaW5nIHNodXRkb3duIiwgbWVzc2FnZUluLCBoZWFkZXIudmVyYi5zdGFnZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZShFeGVjdXRvckxvY2Fscy5jcmVhdGUoc3RhdGUpLCAoKSAtPiBNZXNzYWdpbmdTZXJ2aWNlLmluc3RhbmNlKCkuaW5ib3VuZFNpbmsuYWNjZXB0KG1lc3NhZ2VJbikpOwogICAgICAgICAgICAgfQogICAgICAgICB9OwogICAgIH0KQEAgLTU5Miw5ICs1OTQsOSBAQAogICAgICAgICAgICAgICAgIGlmIChjb25maWcuaGFzKEdPU1NJUCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYWNreQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5yaW5nX2RlbGF5X21zIiwgIjE1MDAwIik7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmNvbnNpc3RlbnQucmFuZ2Vtb3ZlbWVudCIsICJmYWxzZSIpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5jb25zaXN0ZW50LnNpbXVsdGFuZW91c21vdmVzLmFsbG93IiwgInRydWUiKTsKKyAgICAgICAgICAgICAgICAgICAgUklOR19ERUxBWS5zZXRMb25nKDE1MDAwKTsKKyAgICAgICAgICAgICAgICAgICAgQ09OU0lTVEVOVF9SQU5HRV9NT1ZFTUVOVC5zZXRCb29sZWFuKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgQ09OU0lTVEVOVF9TSU1VTFRBTkVPVVNfTU9WRVNfQUxMT1cuc2V0Qm9vbGVhbih0cnVlKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBta2RpcnMoKTsKQEAgLTYwNyw5ICs2MDksMTIgQEAKICAgICAgICAgICAgICAgICAgICAgc3RhcnRKbXgoKTsKIAogICAgICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOworICAgICAgICAgICAgICAgIExvZ2dpbmdTdXBwb3J0RmFjdG9yeS5nZXRMb2dnaW5nU3VwcG9ydCgpLm9uU3RhcnR1cCgpOworCiAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLnNldEZTRXJyb3JIYW5kbGVyKG5ldyBEZWZhdWx0RlNFcnJvckhhbmRsZXIoKSk7CiAgICAgICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmNyZWF0ZUFsbERpcmVjdG9yaWVzKCk7CiAgICAgICAgICAgICAgICAgQ2Fzc2FuZHJhRGFlbW9uLmdldEluc3RhbmNlRm9yVGVzdGluZygpLm1pZ3JhdGVTeXN0ZW1EYXRhSWZOZWVkZWQoKTsKKyAgICAgICAgICAgICAgICBDYXNzYW5kcmFEYWVtb24ubG9nU3lzdGVtSW5mbyhpbkluc3RhbmNlbG9nZ2VyKTsKICAgICAgICAgICAgICAgICBDb21taXRMb2cuaW5zdGFuY2Uuc3RhcnQoKTsKIAogICAgICAgICAgICAgICAgIENhc3NhbmRyYURhZW1vbi5nZXRJbnN0YW5jZUZvclRlc3RpbmcoKS5ydW5TdGFydHVwQ2hlY2tzKCk7CkBAIC02MzYsNiArNjQxLDkgQEAKICAgICAgICAgICAgICAgICAvLyBTdGFydCB1cCB2aXJ0dWFsIHRhYmxlIHN1cHBvcnQKICAgICAgICAgICAgICAgICBDYXNzYW5kcmFEYWVtb24uZ2V0SW5zdGFuY2VGb3JUZXN0aW5nKCkuc2V0dXBWaXJ0dWFsS2V5c3BhY2VzKCk7CiAKKyAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBkZWJyaXMgaW4gZGF0YSBkaXJlY3RvcmllcworICAgICAgICAgICAgICAgIENhc3NhbmRyYURhZW1vbi5nZXRJbnN0YW5jZUZvclRlc3RpbmcoKS5zY3J1YkRhdGFEaXJlY3RvcmllcygpOworCiAgICAgICAgICAgICAgICAgS2V5c3BhY2Uuc2V0SW5pdGlhbGl6ZWQoKTsKIAogICAgICAgICAgICAgICAgIC8vIFJlcGxheSBhbnkgQ29tbWl0TG9nU2VnbWVudHMgZm91bmQgb24gZGlzawpAQCAtNjgwLDYgKzY4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHByb3BhZ2F0ZU1lc3NhZ2luZ1ZlcnNpb25zKGNsdXN0ZXIpOyAvLyBmYWtlIG1lc3NhZ2luZyBuZWVkcyB0byBrbm93IG1lc3NhZ2luZyB2ZXJzaW9uIGZvciBmaWx0ZXJzCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGludGVybm9kZU1lc3NhZ2luZ1N0YXJ0ZWQgPSB0cnVlOworCiAgICAgICAgICAgICAgICAgSlZNU3RhYmlsaXR5SW5zcGVjdG9yLnJlcGxhY2VLaWxsZXIobmV3IEluc3RhbmNlS2lsbGVyKEluc3RhbmNlLnRoaXM6OnNodXRkb3duKSk7CiAKICAgICAgICAgICAgICAgICAvLyBUT0RPOiB0aGlzIGlzIG1vcmUgdGhhbiBqdXN0IGdvc3NpcApAQCAtNzE5LDYgKzcyOCw3IEBACiAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLnNldE5vcm1hbE1vZGVVbnNhZmUoKTsKICAgICAgICAgICAgICAgICAgICAgR29zc2lwZXIuaW5zdGFuY2UucmVnaXN0ZXIoU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5zdGFydFNuYXBzaG90TWFuYWdlcigpOworICAgICAgICAgICAgICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5jb21wbGV0ZUluaXRpYWxpemF0aW9uKCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gUG9wdWxhdGUgdG9rZW5NZXRhZGF0YSBmb3IgdGhlIHNlY29uZCB0aW1lLApAQCAtOTY0LDkgKzk3NCw5IEBACiAgICAgcHVibGljIE5vZGVUb29sUmVzdWx0IG5vZGV0b29sUmVzdWx0KGJvb2xlYW4gd2l0aE5vdGlmaWNhdGlvbnMsIFN0cmluZy4uLiBjb21tYW5kQW5kQXJncykKICAgICB7CiAgICAgICAgIHJldHVybiBzeW5jKCgpIC0+IHsKLSAgICAgICAgICAgIHRyeSAoQ2FwdHVyaW5nT3V0cHV0IG91dHB1dCA9IG5ldyBDYXB0dXJpbmdPdXRwdXQoKSkKKyAgICAgICAgICAgIHRyeSAoQ2FwdHVyaW5nT3V0cHV0IG91dHB1dCA9IG5ldyBDYXB0dXJpbmdPdXRwdXQoKTsKKyAgICAgICAgICAgICAgICAgRFRlc3ROb2RlVG9vbCBub2RldG9vbCA9IG5ldyBEVGVzdE5vZGVUb29sKHdpdGhOb3RpZmljYXRpb25zLCBvdXRwdXQuZGVsZWdhdGUpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERUZXN0Tm9kZVRvb2wgbm9kZXRvb2wgPSBuZXcgRFRlc3ROb2RlVG9vbCh3aXRoTm90aWZpY2F0aW9ucywgb3V0cHV0LmRlbGVnYXRlKTsKICAgICAgICAgICAgICAgICAvLyBpbnN0YWxsIHNlY3VyaXR5IG1hbmFnZXIgdG8gZ2V0IGluZm9ybWVkIGFib3V0IHRoZSBleGl0LWNvZGUKICAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG5ldyBTZWN1cml0eU1hbmFnZXIoKQogICAgICAgICAgICAgICAgIHsKQEAgLTEwNTAsMTUgKzEwNjAsMTggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRFRlc3ROb2RlVG9vbCBleHRlbmRzIE5vZGVUb29sIHsKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERUZXN0Tm9kZVRvb2wgZXh0ZW5kcyBOb2RlVG9vbCBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUKKyAgICB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgU3RvcmFnZVNlcnZpY2VNQmVhbiBzdG9yYWdlUHJveHk7CiAgICAgICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGluZ05vdGlmaWNhdGlvbkxpc3RlbmVyIG5vdGlmaWNhdGlvbnMgPSBuZXcgQ29sbGVjdGluZ05vdGlmaWNhdGlvbkxpc3RlbmVyKCk7Ci0KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbnRlcm5hbE5vZGVQcm9iZSBpbnRlcm5hbE5vZGVQcm9iZTsKICAgICAgICAgcHJpdmF0ZSBUaHJvd2FibGUgbGF0ZXN0RXJyb3I7CiAKLSAgICAgICAgcHVibGljIERUZXN0Tm9kZVRvb2woYm9vbGVhbiB3aXRoTm90aWZpY2F0aW9ucywgT3V0cHV0IG91dHB1dCkgeworICAgICAgICBwdWJsaWMgRFRlc3ROb2RlVG9vbChib29sZWFuIHdpdGhOb3RpZmljYXRpb25zLCBPdXRwdXQgb3V0cHV0KQorICAgICAgICB7CiAgICAgICAgICAgICBzdXBlcihuZXcgSW50ZXJuYWxOb2RlUHJvYmVGYWN0b3J5KHdpdGhOb3RpZmljYXRpb25zKSwgb3V0cHV0KTsKLSAgICAgICAgICAgIHN0b3JhZ2VQcm94eSA9IG5ldyBJbnRlcm5hbE5vZGVQcm9iZSh3aXRoTm90aWZpY2F0aW9ucykuZ2V0U3RvcmFnZVNlcnZpY2UoKTsKKyAgICAgICAgICAgIGludGVybmFsTm9kZVByb2JlID0gbmV3IEludGVybmFsTm9kZVByb2JlKHdpdGhOb3RpZmljYXRpb25zKTsKKyAgICAgICAgICAgIHN0b3JhZ2VQcm94eSA9IGludGVybmFsTm9kZVByb2JlLmdldFN0b3JhZ2VTZXJ2aWNlKCk7CiAgICAgICAgICAgICBzdG9yYWdlUHJveHkuYWRkTm90aWZpY2F0aW9uTGlzdGVuZXIobm90aWZpY2F0aW9ucywgbnVsbCwgbnVsbCk7CiAgICAgICAgIH0KIApAQCAtMTEwNCw2ICsxMTE3LDEyIEBACiAgICAgICAgICAgICBzdXBlci5lcnIoZSk7CiAgICAgICAgICAgICBsYXRlc3RFcnJvciA9IGU7CiAgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnRlcm5hbE5vZGVQcm9iZS5jbG9zZSgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQ29sbGVjdGluZ05vdGlmaWNhdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgTm90aWZpY2F0aW9uTGlzdGVuZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvaW1wbC9UcmFjaW5nVXRpbC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9pbXBsL1RyYWNpbmdVdGlsLmphdmEKaW5kZXggMDZmZGFiYi4uOWMzNDdlMCAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9pbXBsL1RyYWNpbmdVdGlsLmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9pbXBsL1RyYWNpbmdVdGlsLmphdmEKQEAgLTI3LDcgKzI3LDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuQ29uc2lzdGVuY3lMZXZlbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKIAotCiAvKioKICAqIFV0aWxpdGllcyBmb3IgYWNjZXNzaW5nIHRoZSBzeXN0ZW1fdHJhY2VzIHRhYmxlIGZyb20gaW4tSlZNIGR0ZXN0cwogICovCkBAIC0xMDQsMTQgKzEwMyw0IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRyYWNlczsKICAgICB9Ci0KLSAgICAvLyBTZXQgdXAgdGhlIHdhaXQgZm9yIHRyYWNpbmcgdGltZSBzeXN0ZW0gcHJvcGVydHksIHJldHVybmluZyB0aGUgcHJldmlvdXMgdmFsdWUuCi0gICAgLy8gSGFuZGxlcyBiZWluZyBjYWxsZWQgYWdhaW4gdG8gcmVzZXQgd2l0aCB0aGUgb3JpZ2luYWwgdmFsdWUsIHJlcGxhY2luZyB0aGUgbnVsbAotICAgIC8vIHdpdGggdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2V0V2FpdEZvclRyYWNpbmdFdmVudFRpbWVvdXRTZWNzKFN0cmluZyB0aW1lb3V0SW5TZWNvbmRzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLndhaXRfZm9yX3RyYWNpbmdfZXZlbnRzX3RpbWVvdXRfc2VjcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dEluU2Vjb25kcyA9PSBudWxsID8gIjAiIDogdGltZW91dEluU2Vjb25kcyk7Ci0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL21vY2svbm9kZXRvb2wvSW50ZXJuYWxOb2RlUHJvYmUuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvbW9jay9ub2RldG9vbC9JbnRlcm5hbE5vZGVQcm9iZS5qYXZhCmluZGV4IDA5NzIwNmEuLjM4MWJiMDkgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvbW9jay9ub2RldG9vbC9JbnRlcm5hbE5vZGVQcm9iZS5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvbW9jay9ub2RldG9vbC9JbnRlcm5hbE5vZGVQcm9iZS5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgamF2YS5sYW5nLm1hbmFnZW1lbnQuTWFuYWdlbWVudEZhY3Rvcnk7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5MaXN0ZW5lck5vdEZvdW5kRXhjZXB0aW9uOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aW1hcDsKIApAQCAtNDUsMTQgKzQ0LDEzIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5HQ0luc3BlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VQcm94eTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2VNQmVhbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtTWFuYWdlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ob2RlUHJvYmU7Ci1pbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKIAogcHVibGljIGNsYXNzIEludGVybmFsTm9kZVByb2JlIGV4dGVuZHMgTm9kZVByb2JlCiB7CiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHdpdGhOb3RpZmljYXRpb25zOworICAgIHByaXZhdGUgYm9vbGVhbiBwcmV2aW91c1NraXBOb3RpZmljYXRpb25MaXN0ZW5lcnMgPSBmYWxzZTsKIAogICAgIHB1YmxpYyBJbnRlcm5hbE5vZGVQcm9iZShib29sZWFuIHdpdGhOb3RpZmljYXRpb25zKQogICAgIHsKQEAgLTY2LDI2ICs2NCwxMCBAQAogICAgICAgICBtYmVhblNlcnZlckNvbm4gPSBudWxsOwogICAgICAgICBqbXhjID0gbnVsbDsKIAotICAgICAgICBpZiAod2l0aE5vdGlmaWNhdGlvbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzUHJveHkgPSBTdG9yYWdlU2VydmljZS5pbnN0YW5jZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIG5vdGlmaWNhdGlvbiBhcGlzIHdpdGggYSBuby1vcCBtZXRob2QKLSAgICAgICAgICAgIFN0b3JhZ2VTZXJ2aWNlTUJlYW4gbW9jayA9IE1vY2tpdG8uc3B5KFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlKTsKLSAgICAgICAgICAgIE1vY2tpdG8uZG9Ob3RoaW5nKCkud2hlbihtb2NrKS5hZGROb3RpZmljYXRpb25MaXN0ZW5lcihNb2NraXRvLmFueSgpLCBNb2NraXRvLmFueSgpLCBNb2NraXRvLmFueSgpKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1vY2tpdG8uZG9Ob3RoaW5nKCkud2hlbihtb2NrKS5yZW1vdmVOb3RpZmljYXRpb25MaXN0ZW5lcihNb2NraXRvLmFueSgpLCBNb2NraXRvLmFueSgpLCBNb2NraXRvLmFueSgpKTsKLSAgICAgICAgICAgICAgICBNb2NraXRvLmRvTm90aGluZygpLndoZW4obW9jaykucmVtb3ZlTm90aWZpY2F0aW9uTGlzdGVuZXIoTW9ja2l0by5hbnkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTGlzdGVuZXJOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNzUHJveHkgPSBtb2NrOwotICAgICAgICB9CisgICAgICAgIHByZXZpb3VzU2tpcE5vdGlmaWNhdGlvbkxpc3RlbmVycyA9IFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLnNraXBOb3RpZmljYXRpb25MaXN0ZW5lcnM7CisgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLnNraXBOb3RpZmljYXRpb25MaXN0ZW5lcnMgPSAhd2l0aE5vdGlmaWNhdGlvbnM7CisKKyAgICAgICAgc3NQcm94eSA9IFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlOwogICAgICAgICBtc1Byb3h5ID0gTWVzc2FnaW5nU2VydmljZS5pbnN0YW5jZSgpOwogICAgICAgICBzdHJlYW1Qcm94eSA9IFN0cmVhbU1hbmFnZXIuaW5zdGFuY2U7CiAgICAgICAgIGNvbXBhY3Rpb25Qcm94eSA9IENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlOwpAQCAtMTA1LDcgKzg3LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCiAgICAgewotICAgICAgICAvLyBub3RoaW5nIHRvIGNsb3NlLiBuby1vcAorICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5za2lwTm90aWZpY2F0aW9uTGlzdGVuZXJzID0gcHJldmlvdXNTa2lwTm90aWZpY2F0aW9uTGlzdGVuZXJzOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9zaGFyZWQvQnl0ZW1hbi5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9zaGFyZWQvQnl0ZW1hbi5qYXZhCmluZGV4IGI0ZGQxMGMuLmM1Yzc2ZTMgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvc2hhcmVkL0J5dGVtYW4uamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3NoYXJlZC9CeXRlbWFuLmphdmEKQEAgLTQ3LDExICs0NywxMyBAQAogCiBpbXBvcnQgb3JnLmpib3NzLmJ5dGVtYW4uYWdlbnQuVHJhbnNmb3JtZXI7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0JZVEVNQU5fVFJBTlNGT1JNQVRJT05TX0RFQlVHOworCiBwdWJsaWMgZmluYWwgY2xhc3MgQnl0ZW1hbgogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihCeXRlbWFuLmNsYXNzKTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVFJBTlNGT1JNQVRJT05TID0gQm9vbGVhbi5nZXRCb29sZWFuKCJjYXNzYW5kcmEudGVzdC5ieXRlbWFuLnRyYW5zZm9ybWF0aW9ucy5kZWJ1ZyIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVFJBTlNGT1JNQVRJT05TID0gVEVTVF9CWVRFTUFOX1RSQU5TRk9STUFUSU9OU19ERUJVRy5nZXRCb29sZWFuKCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIE1FVEhPRDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkwgQllURU1BTjsKIApkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9zaGFyZWQvQ2x1c3RlclV0aWxzLmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3NoYXJlZC9DbHVzdGVyVXRpbHMuamF2YQppbmRleCBkYzI4MGYzLi5jMzEzODIxIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3NoYXJlZC9DbHVzdGVyVXRpbHMuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3NoYXJlZC9DbHVzdGVyVXRpbHMuamF2YQpAQCAtNDAsNiArNDAsMTAgQEAKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRnV0dXJlczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtcy5BcHBsaWNhdGlvblN0YXRlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtcy5WZXJzaW9uZWRWYWx1ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIApAQCAtNTksNiArNjMsOSBAQAogCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5VbmludGVycnVwdGlibGVzLnNsZWVwVW5pbnRlcnJ1cHRpYmx5OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkJPT1RTVFJBUF9TQ0hFTUFfREVMQVlfTVM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQlJPQURDQVNUX0lOVEVSVkFMX01TOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJFUExBQ0VfQUREUkVTU19GSVJTVF9CT09UOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJJTkdfREVMQVk7CiBpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKIAogLyoqCkBAIC0yNTEsMTMgKzI1OCwxMyBAQAogCiAgICAgICAgIHJldHVybiBzdGFydChpbnN0LCBwcm9wZXJ0aWVzIC0+IHsKICAgICAgICAgICAgIC8vIGxvd2VyIHRoaXMgc28gdGhlIHJlcGxhY2VtZW50IHdhaXRzIGxlc3MgdGltZQotICAgICAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmJyb2FkY2FzdF9pbnRlcnZhbF9tcyIsIExvbmcudG9TdHJpbmcoVGltZVVuaXQuU0VDT05EUy50b01pbGxpcygzMCkpKTsKKyAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0KEJST0FEQ0FTVF9JTlRFUlZBTF9NUywgTG9uZy50b1N0cmluZyhUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDMwKSkpOwogICAgICAgICAgICAgLy8gZGVmYXVsdCBpcyAzMHMsIGxvd2VyaW5nIGFzIGl0IHNob3VsZCBiZSBmYXN0ZXIKLSAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoImNhc3NhbmRyYS5yaW5nX2RlbGF5X21zIiwgTG9uZy50b1N0cmluZyhUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDEwKSkpOworICAgICAgICAgICAgcHJvcGVydGllcy5zZXQoUklOR19ERUxBWSwgTG9uZy50b1N0cmluZyhUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDEwKSkpOwogICAgICAgICAgICAgcHJvcGVydGllcy5zZXQoQk9PVFNUUkFQX1NDSEVNQV9ERUxBWV9NUywgVGltZVVuaXQuU0VDT05EUy50b01pbGxpcygxMCkpOwogCiAgICAgICAgICAgICAvLyBzdGF0ZSB3aGljaCBub2RlIHRvIHJlcGxhY2UKLSAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoImNhc3NhbmRyYS5yZXBsYWNlX2FkZHJlc3NfZmlyc3RfYm9vdCIsIHRvUmVwbGFjZS5jb25maWcoKS5icm9hZGNhc3RBZGRyZXNzKCkuZ2V0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCkpOworICAgICAgICAgICAgcHJvcGVydGllcy5zZXQoUkVQTEFDRV9BRERSRVNTX0ZJUlNUX0JPT1QsIHRvUmVwbGFjZS5jb25maWcoKS5icm9hZGNhc3RBZGRyZXNzKCkuZ2V0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCkpOwogCiAgICAgICAgICAgICBmbi5hY2NlcHQoaW5zdCwgcHJvcGVydGllcyk7CiAgICAgICAgIH0pOwpAQCAtNTU0LDYgKzU2MSw2MyBAQAogICAgICAgICB9KTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXdhaXRHb3NzaXBTY2hlbWFNYXRjaChJQ2x1c3Rlcjw/IGV4dGVuZHMgIElJbnN0YW5jZT4gY2x1c3RlcikKKyAgICB7CisgICAgICAgIGNsdXN0ZXIuZm9yRWFjaChDbHVzdGVyVXRpbHM6OmF3YWl0R29zc2lwU2NoZW1hTWF0Y2gpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhd2FpdEdvc3NpcFNjaGVtYU1hdGNoKElJbnN0YW5jZSBpbnN0YW5jZSkKKyAgICB7CisgICAgICAgIGlmICghaW5zdGFuY2UuY29uZmlnKCkuaGFzKEZlYXR1cmUuR09TU0lQKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gd2hlbiBnb3Npc3AgaXNuJ3QgZW5hYmxlZCwgZG9uJ3QgYm90aGVyIHdhaXRpbmcgb24gZ29zc2lwIHRvIHNldHRsZS4uLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGF3YWl0R29zc2lwKGluc3RhbmNlLCAiU2NoZW1hIElEcyBkaWQgbm90IG1hdGNoIiwgYWxsIC0+IHsKKyAgICAgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTWFwPFN0cmluZywgU3RyaW5nPj4gZSA6IGFsbC5lbnRyeVNldCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gc3RhdGUgPSBlLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgLy8gaGFzIHRoZSBpbnN0YW5jZSBqb2luZWQ/CisgICAgICAgICAgICAgICAgU3RyaW5nIHN0YXR1cyA9IHN0YXRlLmdldChBcHBsaWNhdGlvblN0YXRlLlNUQVRVU19XSVRIX1BPUlQubmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRlLmdldChBcHBsaWNhdGlvblN0YXRlLlNUQVRVUy5uYW1lKCkpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCB8fCAhc3RhdHVzLmNvbnRhaW5zKFZlcnNpb25lZFZhbHVlLlNUQVRVU19OT1JNQUwpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gaWdub3JlIGluc3RhbmNlcyBub3Qgam9pbmVkIHlldAorICAgICAgICAgICAgICAgIFN0cmluZyBzY2hlbWEgPSBzdGF0ZS5nZXQoIlNDSEVNQSIpOworICAgICAgICAgICAgICAgIGlmIChzY2hlbWEgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJVbmFibGUgdG8gZmluZCBzY2hlbWEgZm9yICIgKyBlLmdldEtleSgpICsgIjsgc3RhdHVzIHdhcyAiICsgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBzY2hlbWEgPSBzY2hlbWEuc3BsaXQoIjoiKVsxXTsKKworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gc2NoZW1hOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICghY3VycmVudC5lcXVhbHMoc2NoZW1hKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGF3YWl0R29zc2lwU3RhdGVNYXRjaChJQ2x1c3Rlcjw/IGV4dGVuZHMgIElJbnN0YW5jZT4gY2x1c3RlciwgSUluc3RhbmNlIGV4cGVjdGVkSW5Hb3NzaXAsIEFwcGxpY2F0aW9uU3RhdGUga2V5KQorICAgIHsKKyAgICAgICAgU2V0PFN0cmluZz4gbWF0Y2hlcyA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoZXMgPSBjbHVzdGVyLnN0cmVhbSgpLm1hcChDbHVzdGVyVXRpbHM6Omdvc3NpcEluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZ2kgLT4gT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChnaS5nZXQoZ2V0QnJvYWRjYXN0QWRkcmVzc1N0cmluZyhleHBlY3RlZEluR29zc2lwKSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKG0gLT4gbS5nZXQoa2V5Lm5hbWUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisgICAgICAgICAgICBpZiAobWF0Y2hlcy5pc0VtcHR5KCkgfHwgbWF0Y2hlcy5zaXplKCkgPT0gMSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBzbGVlcFVuaW50ZXJydXB0aWJseSgxLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIkV4cGVjdGVkIEFwcGxpY2F0aW9uU3RhdGUuIiArIGtleSArICIgdG8gbWF0Y2gsIGJ1dCBzYXcgIiArIG1hdGNoZXMpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEdldCB0aGUgZ29zc2lwIGluZm9ybWF0aW9uIGZyb20gdGhlIG5vZGUuICBDdXJyZW50bHkgb25seSBhZGRyZXNzLCBnZW5lcmF0aW9uLCBhbmQgaGVhcnRiZWF0IGFyZSByZXR1cm5lZAogICAgICAqCmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3NoYXJlZC9XaXRoUHJvcGVydGllcy5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9zaGFyZWQvV2l0aFByb3BlcnRpZXMuamF2YQppbmRleCA4ODk4N2MyLi5kMTdkM2U2IDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3NoYXJlZC9XaXRoUHJvcGVydGllcy5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvc2hhcmVkL1dpdGhQcm9wZXJ0aWVzLmphdmEKQEAgLTIzLDkyICsyMyw3MyBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5jb252ZXJ0VG9TdHJpbmc7CisKIHB1YmxpYyBmaW5hbCBjbGFzcyBXaXRoUHJvcGVydGllcyBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUKIHsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8UHJvcGVydHk+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UnVubmFibGU+IHJvbGxiYWNrID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKICAgICBwdWJsaWMgV2l0aFByb3BlcnRpZXMoKQogICAgIHsKICAgICB9CiAKLSAgICBwdWJsaWMgV2l0aFByb3BlcnRpZXMoU3RyaW5nLi4uIGt2cykKLSAgICB7Ci0gICAgICAgIHdpdGgoa3ZzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3aXRoKFN0cmluZy4uLiBrdnMpCisgICAgcHVibGljIFdpdGhQcm9wZXJ0aWVzIHdpdGgoU3RyaW5nLi4uIGt2cykKICAgICB7CiAgICAgICAgIGFzc2VydCBrdnMubGVuZ3RoICUgMiA9PSAwIDogIklucHV0IG11c3QgaGF2ZSBhbiBldmVuIGFtb3VudCBvZiBpbnB1dHMgYnV0IGdpdmVuICIgKyBrdnMubGVuZ3RoOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBrdnMubGVuZ3RoIC0gMjsgaSA9IGkgKyAyKQotICAgICAgICB7CiAgICAgICAgICAgICB3aXRoKGt2c1tpXSwga3ZzW2kgKyAxXSk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKQorICAgIHB1YmxpYyBXaXRoUHJvcGVydGllcyBzZXQoQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzIHByb3AsIFN0cmluZyB2YWx1ZSkKICAgICB7Ci0gICAgICAgIHdpdGgoa2V5LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiBzZXQocHJvcCwgKCkgLT4gcHJvcC5zZXRTdHJpbmcodmFsdWUpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXQoQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzIHByb3AsIFN0cmluZyB2YWx1ZSkKKyAgICBwdWJsaWMgV2l0aFByb3BlcnRpZXMgc2V0KENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyBwcm9wLCBTdHJpbmcuLi4gdmFsdWVzKQogICAgIHsKLSAgICAgICAgd2l0aChwcm9wLmdldEtleSgpLCB2YWx1ZSk7CisgICAgICAgIHJldHVybiBzZXQocHJvcCwgQXJyYXlzLmFzTGlzdCh2YWx1ZXMpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXQoQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzIHByb3AsIFN0cmluZy4uLiB2YWx1ZXMpCisgICAgcHVibGljIFdpdGhQcm9wZXJ0aWVzIHNldChDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMgcHJvcCwgQ29sbGVjdGlvbjxTdHJpbmc+IHZhbHVlcykKICAgICB7Ci0gICAgICAgIHNldChwcm9wLCBBcnJheXMuYXNMaXN0KHZhbHVlcykpOworICAgICAgICByZXR1cm4gc2V0KHByb3AsIEpvaW5lci5vbigiLCIpLmpvaW4odmFsdWVzKSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0KENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyBwcm9wLCBDb2xsZWN0aW9uPFN0cmluZz4gdmFsdWVzKQorICAgIHB1YmxpYyBXaXRoUHJvcGVydGllcyBzZXQoQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzIHByb3AsIGJvb2xlYW4gdmFsdWUpCiAgICAgewotICAgICAgICBzZXQocHJvcCwgSm9pbmVyLm9uKCIsIikuam9pbih2YWx1ZXMpKTsKKyAgICAgICAgcmV0dXJuIHNldChwcm9wLCAoKSAtPiBwcm9wLnNldEJvb2xlYW4odmFsdWUpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXQoQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzIHByb3AsIGJvb2xlYW4gdmFsdWUpCisgICAgcHVibGljIFdpdGhQcm9wZXJ0aWVzIHNldChDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMgcHJvcCwgbG9uZyB2YWx1ZSkKICAgICB7Ci0gICAgICAgIHNldChwcm9wLCBCb29sZWFuLnRvU3RyaW5nKHZhbHVlKSk7CisgICAgICAgIHJldHVybiBzZXQocHJvcCwgKCkgLT4gcHJvcC5zZXRMb25nKHZhbHVlKSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0KENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyBwcm9wLCBsb25nIHZhbHVlKQorICAgIHByaXZhdGUgdm9pZCB3aXRoKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkKICAgICB7Ci0gICAgICAgIHNldChwcm9wLCBMb25nLnRvU3RyaW5nKHZhbHVlKSk7CisgICAgICAgIFN0cmluZyBwcmV2aW91cyA9IFN5c3RlbS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsgLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgbmVhcmJ5ICdibG9ja1N5c3RlbVByb3BlcnR5VXNhZ2UnCisgICAgICAgIHJvbGxiYWNrLmFkZChwcmV2aW91cyA9PSBudWxsID8gKCkgLT4gU3lzdGVtLmNsZWFyUHJvcGVydHkoa2V5KSA6ICgpIC0+IFN5c3RlbS5zZXRQcm9wZXJ0eShrZXksIHByZXZpb3VzKSk7IC8vIGNoZWNrc3R5bGU6IHN1cHByZXNzIG5lYXJieSAnYmxvY2tTeXN0ZW1Qcm9wZXJ0eVVzYWdlJwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHdpdGgoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKQorICAgIHByaXZhdGUgV2l0aFByb3BlcnRpZXMgc2V0KENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyBwcm9wLCBTdXBwbGllcjxPYmplY3Q+IHByZXYpCiAgICAgewotICAgICAgICBTdHJpbmcgcHJldmlvdXMgPSBTeXN0ZW0uc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKG5ldyBQcm9wZXJ0eShrZXksIHByZXZpb3VzKSk7CisgICAgICAgIFN0cmluZyBwcmV2aW91cyA9IGNvbnZlcnRUb1N0cmluZyhwcmV2LmdldCgpKTsKKyAgICAgICAgcm9sbGJhY2suYWRkKHByZXZpb3VzID09IG51bGwgPyBwcm9wOjpjbGVhclZhbHVlIDogKCkgLT4gcHJvcC5zZXRTdHJpbmcocHJldmlvdXMpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCi0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCiAgICAgewotICAgICAgICBDb2xsZWN0aW9ucy5yZXZlcnNlKHByb3BlcnRpZXMpOwotICAgICAgICBwcm9wZXJ0aWVzLmZvckVhY2gocyAtPiB7Ci0gICAgICAgICAgICBpZiAocy52YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKHMua2V5KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkocy5rZXksIHMudmFsdWUpOwotICAgICAgICB9KTsKLSAgICAgICAgcHJvcGVydGllcy5jbGVhcigpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFByb3BlcnR5Ci0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBrZXk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZhbHVlOwotCi0gICAgICAgIHByaXZhdGUgUHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgfQorICAgICAgICBDb2xsZWN0aW9ucy5yZXZlcnNlKHJvbGxiYWNrKTsKKyAgICAgICAgcm9sbGJhY2suZm9yRWFjaChSdW5uYWJsZTo6cnVuKTsKKyAgICAgICAgcm9sbGJhY2suY2xlYXIoKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvQWxsb3dBdXRvU25hcHNob3RUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvQWxsb3dBdXRvU25hcHNob3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5NDkwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9BbGxvd0F1dG9TbmFwc2hvdFRlc3QuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuSUlzb2xhdGVkRXhlY3V0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyLmJ1aWxkOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuQ29uc2lzdGVuY3lMZXZlbC5BTEw7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLkdPU1NJUDsKK2ltcG9ydCBzdGF0aWMgb3JnLmF3YWl0aWxpdHkuQXdhaXRpbGl0eS5hd2FpdDsKKworcHVibGljIGNsYXNzIEFsbG93QXV0b1NuYXBzaG90VGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbAoreworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsbG93QXV0b1NuYXBzaG90T25BdXRvU25hcHNob3RFbmFibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChDbHVzdGVyIGMgPSBnZXRDbHVzdGVyKHRydWUpKQorICAgICAgICB7CisgICAgICAgICAgICBjLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkNSRUFURSBUQUJMRSAlcy50ZXN0X3RhYmxlIChhIHRleHQgcHJpbWFyeSBrZXksIGIgaW50KSBXSVRIIGFsbG93X2F1dG9fc25hcHNob3QgPSB0cnVlIikpOworICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJEUk9QIFRBQkxFICVzLnRlc3RfdGFibGU7IikpOworCisgICAgICAgICAgICBjaGVja1NuYXBzaG90cyhjLCB0cnVlLCAidGVzdF90YWJsZSIsICJkcm9wcGVkIik7CisKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnRlc3RfdGFibGUyIChhIHRleHQgcHJpbWFyeSBrZXksIGIgaW50KSBXSVRIIGFsbG93X2F1dG9fc25hcHNob3QgPSBmYWxzZSIpKTsKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiRFJPUCBUQUJMRSAlcy50ZXN0X3RhYmxlMjsiKSk7CisKKyAgICAgICAgICAgIGNoZWNrU25hcHNob3RzKGMsIGZhbHNlLCAidGVzdF90YWJsZTIiLCAiZHJvcHBlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsb3dBdXRvU25hcHNob3RPbkF1dG9TbmFwc2hvdERpc2FibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChDbHVzdGVyIGMgPSBnZXRDbHVzdGVyKGZhbHNlKSkKKyAgICAgICAgeworICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgJXMudGVzdF90YWJsZSAoYSB0ZXh0IHByaW1hcnkga2V5LCBiIGludCkgV0lUSCBhbGxvd19hdXRvX3NuYXBzaG90ID0gdHJ1ZSIpKTsKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiRFJPUCBUQUJMRSAlcy50ZXN0X3RhYmxlOyIpKTsKKworICAgICAgICAgICAgY2hlY2tTbmFwc2hvdHMoYywgZmFsc2UsICJ0ZXN0X3RhYmxlIiwgImRyb3BwZWQiKTsKKworICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgJXMudGVzdF90YWJsZTIgKGEgdGV4dCBwcmltYXJ5IGtleSwgYiBpbnQpIFdJVEggYWxsb3dfYXV0b19zbmFwc2hvdCA9IGZhbHNlIikpOworICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJEUk9QIFRBQkxFICVzLnRlc3RfdGFibGUyOyIpKTsKKworICAgICAgICAgICAgY2hlY2tTbmFwc2hvdHMoYywgZmFsc2UsICJ0ZXN0X3RhYmxlMiIsICJkcm9wcGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlQW5kRW5hYmxlQWxsb3dBdXRvU25hcHNob3QoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKENsdXN0ZXIgYyA9IGdldENsdXN0ZXIodHJ1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnRlc3RfdGFibGUgKGEgdGV4dCBwcmltYXJ5IGtleSwgYiBpbnQpIFdJVEggYWxsb3dfYXV0b19zbmFwc2hvdCA9IHRydWUiKSk7CisKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQUxURVIgVEFCTEUgJXMudGVzdF90YWJsZSBXSVRIIGFsbG93X2F1dG9fc25hcHNob3QgPSBmYWxzZSIpKTsKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQUxURVIgVEFCTEUgJXMudGVzdF90YWJsZSBXSVRIIGFsbG93X2F1dG9fc25hcHNob3QgPSB0cnVlIikpOworCisgICAgICAgICAgICBjLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkRST1AgVEFCTEUgJXMudGVzdF90YWJsZTsiKSk7CisKKyAgICAgICAgICAgIGNoZWNrU25hcHNob3RzKGMsIHRydWUsICJ0ZXN0X3RhYmxlIiwgImRyb3BwZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRydW5jYXRlQWxsb3dBdXRvU25hcHNob3QoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKENsdXN0ZXIgYyA9IGdldENsdXN0ZXIodHJ1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGFsbG93X2F1dG9fc25hcHNob3QgPSB0cnVlCisgICAgICAgICAgICBjLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkNSRUFURSBUQUJMRSAlcy50ZXN0X3RhYmxlIChhIHRleHQgcHJpbWFyeSBrZXksIGIgaW50KSBXSVRIIGFsbG93X2F1dG9fc25hcHNob3QgPSB0cnVlIikpOworCisgICAgICAgICAgICBjLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJJTlNFUlQgSU5UTyAlcy50ZXN0X3RhYmxlIChhLCBiKSBWQUxVRVMgKCdhJywgMSk7IiksIEFMTCk7CisKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiVFJVTkNBVEUgVEFCTEUgJXMudGVzdF90YWJsZTsiKSk7CisKKyAgICAgICAgICAgIGNoZWNrU25hcHNob3RzKGMsIHRydWUsICJ0ZXN0X3RhYmxlIiwgInRydW5jYXRlZCIpOworCisgICAgICAgICAgICAvLyBhbGxvd19hdXRvX3NuYXBzaG90ID0gZmFsc2UKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnRlc3RfdGFibGUyIChhIHRleHQgcHJpbWFyeSBrZXksIGIgaW50KSBXSVRIIGFsbG93X2F1dG9fc25hcHNob3QgPSBmYWxzZSIpKTsKKworICAgICAgICAgICAgYy5jb29yZGluYXRvcigxKS5leGVjdXRlKHdpdGhLZXlzcGFjZSgiSU5TRVJUIElOVE8gJXMudGVzdF90YWJsZTIgKGEsIGIpIFZBTFVFUyAoJ2EnLCAxKTsiKSwgQUxMKTsKKworICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJUUlVOQ0FURSBUQUJMRSAlcy50ZXN0X3RhYmxlMjsiKSk7CisKKyAgICAgICAgICAgIGNoZWNrU25hcHNob3RzKGMsIGZhbHNlLCAidGVzdF90YWJsZTIiLCAidHJ1bmNhdGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXRlcmlhbGl6ZWRWaWV3QWxsb3dBdXRvU25hcHNob3QoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKENsdXN0ZXIgYyA9IGdldENsdXN0ZXIodHJ1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG1hdGVyaWFsaXplZCB2aWV3IGFsbG93X2F1dG9fc25hcHNob3QgPSBmYWxzZQorICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgJXMudCAoayBpbnQsIGMxIGludCwgYzIgaW50LCB2MSBpbnQsIHYyIGludCwgUFJJTUFSWSBLRVkgKGssIGMxLCBjMikpIikpOworICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgJXMubXYxIEFTIFNFTEVDVCAqIEZST00gdCBXSEVSRSBrIElTIE5PVCBOVUxMIEFORCBjMSBJUyBOT1QgTlVMTCBBTkQgYzIgSVMgTk9UIE5VTEwgUFJJTUFSWSBLRVkgKGMxLCBrLCBjMikgV0lUSCBhbGxvd19hdXRvX3NuYXBzaG90ID0gZmFsc2UiKSk7CisKKyAgICAgICAgICAgIGMuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnQgKGssIGMxLCBjMiwgdjEsIHYyKSBWQUxVRVMgKDEsIDIsIDMsIDQsIDUpOyIpLCBBTEwpOworCisgICAgICAgICAgICBjLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkRST1AgTUFURVJJQUxJWkVEIFZJRVcgJXMubXYxOyIpKTsKKworICAgICAgICAgICAgY2hlY2tTbmFwc2hvdHMoYywgZmFsc2UsICJtdjEiLCAiZHJvcHBlZCIpOworCisgICAgICAgICAgICAvLyBtYXRlcmlhbGl6ZWQgdmlldyBhbGxvd19hdXRvX3NuYXBzaG90ID0gdHJ1ZQorICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgJXMubXYxIEFTIFNFTEVDVCAqIEZST00gdCBXSEVSRSBrIElTIE5PVCBOVUxMIEFORCBjMSBJUyBOT1QgTlVMTCBBTkQgYzIgSVMgTk9UIE5VTEwgUFJJTUFSWSBLRVkgKGMxLCBrLCBjMikgV0lUSCBhbGxvd19hdXRvX3NuYXBzaG90ID0gdHJ1ZSIpKTsKKworICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJEUk9QIE1BVEVSSUFMSVpFRCBWSUVXICVzLm12MTsiKSk7CisgICAgICAgICAgICBjaGVja1NuYXBzaG90cyhjLCB0cnVlLCAibXYxIiwgImRyb3BwZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQ2x1c3RlciBnZXRDbHVzdGVyKGJvb2xlYW4gYXV0b1NuYXBzaG90RW5hYmxlZCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gaW5pdChidWlsZCgyKS53aXRoQ29uZmlnKGMgLT4gYy53aXRoKEdPU1NJUCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJhdXRvX3NuYXBzaG90IiwgYXV0b1NuYXBzaG90RW5hYmxlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJtYXRlcmlhbGl6ZWRfdmlld3NfZW5hYmxlZCIsIHRydWUpKS5zdGFydCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tTbmFwc2hvdHMoQ2x1c3RlciBjbHVzdGVyLCBib29sZWFuIHNob3VsZENvbnRhaW4sIFN0cmluZyB0YWJsZSwgU3RyaW5nIHNuYXBzaG90UHJlZml4KQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBjbHVzdGVyLnNpemUoKSArIDE7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgaW50IG5vZGUgPSBpOyAvLyBoYXMgdG8gYmUgZWZmZWN0aXZlbHkgZmluYWwgZm9yIHRoZSB1c2FnZSBpbiAidW50aWwiIG1ldGhvZAorICAgICAgICAgICAgYXdhaXQoKS51bnRpbCgoKSAtPiBjbHVzdGVyLmdldChub2RlKS5hcHBsaWVzT25JbnN0YW5jZSgoSUlzb2xhdGVkRXhlY3V0b3IuU2VyaWFsaXphYmxlVHJpRnVuY3Rpb248Qm9vbGVhbiwgU3RyaW5nLCBTdHJpbmcsIEJvb2xlYW4+KSAoc2hvdWxkQ29udGFpblNuYXBzaG90LCB0YWJsZU5hbWUsIHByZWZpeCkgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtPFN0cmluZz4gc3RyZWFtID0gU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuZ2V0U25hcHNob3REZXRhaWxzKENvbGxlY3Rpb25zLmVtcHR5TWFwKCkpLmtleVNldCgpLnN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZGljYXRlPFN0cmluZz4gcHJlZGljYXRlID0gdGFnIC0+IHRhZy5zdGFydHNXaXRoKHByZWZpeCArICctJykgJiYgdGFnLmVuZHNXaXRoKCctJyArIHRhYmxlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2hvdWxkQ29udGFpblNuYXBzaG90ID8gc3RyZWFtLmFueU1hdGNoKHByZWRpY2F0ZSkgOiBzdHJlYW0ubm9uZU1hdGNoKHByZWRpY2F0ZSk7CisgICAgICAgICAgICB9KS5hcHBseShzaG91bGRDb250YWluLCB0YWJsZSwgc25hcHNob3RQcmVmaXgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9BbHRlclRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9BbHRlclRlc3QuamF2YQppbmRleCAyMDYxYzI5MS4uYmM3MTU5YiAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0FsdGVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9BbHRlclRlc3QuamF2YQpAQCAtMzgsMTAgKzM4LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLlNpbXBsZVF1ZXJ5UmVzdWx0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Ub2tlblN1cHBsaWVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5DbHVzdGVyVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudXRpbC5RdWVyeVJlc3VsdFV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSk9JTl9SSU5HOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hY3Rpb24uR29zc2lwSGVscGVyLndpdGhQcm9wZXJ0eTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWwuT05FOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZS5HT1NTSVA7CkBAIC05OSw3ICs5OSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIElJbnN0YW5jZUNvbmZpZyBjb25maWcgPSBjbHVzdGVyLm5ld0luc3RhbmNlQ29uZmlnKCk7CiAgICAgICAgICAgICBJSW52b2thYmxlSW5zdGFuY2UgZ29zc2lwcGluZ09ubHlNZW1iZXIgPSBjbHVzdGVyLmJvb3RzdHJhcChjb25maWcpOwotICAgICAgICAgICAgd2l0aFByb3BlcnR5KCJjYXNzYW5kcmEuam9pbl9yaW5nIiwgQm9vbGVhbi50b1N0cmluZyhmYWxzZSksICgpIC0+IGdvc3NpcHBpbmdPbmx5TWVtYmVyLnN0YXJ0dXAoY2x1c3RlcikpOworICAgICAgICAgICAgd2l0aFByb3BlcnR5KEpPSU5fUklORywgZmFsc2UsICgpIC0+IGdvc3NpcHBpbmdPbmx5TWVtYmVyLnN0YXJ0dXAoY2x1c3RlcikpOwogCiAgICAgICAgICAgICBpbnQgYXR0ZW1wdHMgPSAwOwogICAgICAgICAgICAgLy8gaXQgdGFrZXMgc29tZSB0aW1lIHRoZSB1bmRlcmx5aW5nIHN0cnVjdHVyZSBpcyBwb3B1bGF0ZWQgb3RoZXJ3aXNlIHRoZSB0ZXN0IGlzIGZsYWt5CkBAIC0xNTgsMTIgKzE1OCw4IEBACiAgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiQUxURVIgVEFCTEUgIiArIEtFWVNQQUNFICsgIi50YmwgV0lUSCBtZW10YWJsZSA9ICd0ZXN0Y29uZmlnJyIsIGZhbHNlLCBub2RlMSk7CiAgICAgICAgICAgICAvLyB0aGUgYWJvdmUgc2hvdWxkIHN1Y2NlZWQsIHRoZSBjb25maWd1cmF0aW9uIGlzIGFjY2VwdGFibGUgdG8gbm9kZTEKIAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNjaGVtYTEgPSBRdWVyeVJlc3VsdFV0aWwuZXhwYW5kKG5vZGUxLmV4ZWN1dGVJbnRlcm5hbFdpdGhSZXN1bHQoIlNFTEVDVCAqIEZST00gc3lzdGVtX3NjaGVtYS50YWJsZXMgV0hFUkUga2V5c3BhY2VfbmFtZT0/IiwgS0VZU1BBQ0UpKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzY2hlbWEyID0gUXVlcnlSZXN1bHRVdGlsLmV4cGFuZChub2RlMi5leGVjdXRlSW50ZXJuYWxXaXRoUmVzdWx0KCJTRUxFQ1QgKiBGUk9NIHN5c3RlbV9zY2hlbWEudGFibGVzIFdIRVJFIGtleXNwYWNlX25hbWU9PyIsIEtFWVNQQUNFKSk7Ci0gICAgICAgICAgICBsb2dnZXIuaW5mbygibm9kZTEgc2NoZW1hOiBcbnt9Iiwgc2NoZW1hMSk7Ci0gICAgICAgICAgICBsb2dnZXIuaW5mbygibm9kZTIgc2NoZW1hOiBcbnt9Iiwgc2NoZW1hMik7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHNjaGVtYTEsIHNjaGVtYTIpOwotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGVycm9ySW5Mb2cgPSBub2RlMi5sb2dzKCkuZ3JlcChtYXJrLCAiRVJST1IuKkludmFsaWQgbWVtdGFibGUgY29uZmlndXJhdGlvbi4qIikuZ2V0UmVzdWx0KCk7CisgICAgICAgICAgICBDbHVzdGVyVXRpbHMuYXdhaXRHb3NzaXBTY2hlbWFNYXRjaChjbHVzdGVyKTsKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBlcnJvckluTG9nID0gbm9kZTIubG9ncygpLmdyZXAobWFyaywiRVJST1IuKkludmFsaWQgbWVtdGFibGUgY29uZmlndXJhdGlvbi4qIikuZ2V0UmVzdWx0KCk7CiAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShlcnJvckluTG9nLnNpemUoKSA+IDApOwogICAgICAgICAgICAgbG9nZ2VyLmluZm8oTGlzdHMubGlzdFRvU3RyaW5nKGVycm9ySW5Mb2cpKTsKIApAQCAtMTc1LDkgKzE3MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0Y29uZmlnIiwgSW1tdXRhYmxlTWFwLm9mKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzX25hbWUiLCAiTm90RXhpc3RpbmdNZW10YWJsZSIpKSkpKTsKICAgICAgICAgICAgIG5vZGUzLnN0YXJ0dXAoY2x1c3Rlcik7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2NoZW1hMyA9IFF1ZXJ5UmVzdWx0VXRpbC5leHBhbmQobm9kZTMuZXhlY3V0ZUludGVybmFsV2l0aFJlc3VsdCgiU0VMRUNUICogRlJPTSBzeXN0ZW1fc2NoZW1hLnRhYmxlcyBXSEVSRSBrZXlzcGFjZV9uYW1lPT8iLCBLRVlTUEFDRSkpOwotICAgICAgICAgICAgbG9nZ2VyLmluZm8oIm5vZGUzIHNjaGVtYTogXG57fSIsIHNjaGVtYTMpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhzY2hlbWExLCBzY2hlbWEzKTsKKyAgICAgICAgICAgIENsdXN0ZXJVdGlscy5hd2FpdEdvc3NpcFNjaGVtYU1hdGNoKGNsdXN0ZXIpOwogCiAgICAgICAgICAgICBlcnJvckluTG9nID0gbm9kZTMubG9ncygpLmdyZXAoIkVSUk9SLipJbnZhbGlkIG1lbXRhYmxlIGNvbmZpZ3VyYXRpb24uKiIpLmdldFJlc3VsdCgpOwogICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZXJyb3JJbkxvZy5zaXplKCkgPiAwKTsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9Cb290c3RyYXBCaW5hcnlEaXNhYmxlZFRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9Cb290c3RyYXBCaW5hcnlEaXNhYmxlZFRlc3QuamF2YQppbmRleCAzZjUwYzMwLi42MjdiNjk1IDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvQm9vdHN0cmFwQmluYXJ5RGlzYWJsZWRUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0Jvb3RzdHJhcEJpbmFyeURpc2FibGVkVGVzdC5qYXZhCkBAIC0yNCw3ICsyNCw5IEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOwogCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyOwpAQCAtMzYsMTMgKzM4LDMzIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLlRva2VuU3VwcGxpZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLkJ5dGVtYW47CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLk5ldHdvcmtUb3BvbG9neTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2hhcmVkOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUkVTRVRfQk9PVFNUUkFQX1BST0dSRVNTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJJTkdfREVMQVk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9XUklURV9TVVJWRVk7CisKIC8qKgogICogUmVwbGFjZXMgcHl0aG9uIGR0ZXN0IGJvb3RzdHJhcF90ZXN0LnB5OjpUZXN0Qm9vdHN0cmFwOjp0ZXN0X2Jvb3RzdHJhcF9iaW5hcnlfZGlzYWJsZWQKICAqLwogcHVibGljIGNsYXNzIEJvb3RzdHJhcEJpbmFyeURpc2FibGVkVGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbAogeworICAgIHN0YXRpYyBXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzOworCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZUNsYXNzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgVGVzdEJhc2VJbXBsLmJlZm9yZUNsYXNzKCk7CisgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgV2l0aFByb3BlcnRpZXMoKS5zZXQoUkVTRVRfQk9PVFNUUkFQX1BST0dSRVNTLCBmYWxzZSk7CisgICAgfQorCisgICAgQEFmdGVyQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWZ0ZXJDbGFzcygpCisgICAgeworICAgICAgICBwcm9wZXJ0aWVzLmNsb3NlKCk7CisgICAgfQorCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uCiAgICAgewpAQCAtOTIsOSArMTE0LDkgQEAKICAgICAgICAgY29uZmlnLmZvckVhY2gobm9kZUNvbmZpZzo6c2V0KTsKIAogICAgICAgICAvL1RPRE8gY2FuIHdlIG1ha2UgdGhpcyBtb3JlIGlzb2xhdGVkPwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5yaW5nX2RlbGF5X21zIiwgIjUwMDAiKTsKKyAgICAgICAgUklOR19ERUxBWS5zZXRMb25nKDUwMDApOwogICAgICAgICBpZiAoaXNXcml0ZVN1cnZleSkKLSAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLndyaXRlX3N1cnZleSIsICJ0cnVlIik7CisgICAgICAgICAgICBURVNUX1dSSVRFX1NVUlZFWS5zZXRCb29sZWFuKHRydWUpOwogCiAgICAgICAgIFJld3JpdGVFbmFibGVkLmVuYWJsZSgpOwogICAgICAgICBjbHVzdGVyLmJvb3RzdHJhcChub2RlQ29uZmlnKS5zdGFydHVwKCk7CkBAIC0xMDgsNiArMTMwLDcgQEAKICAgICAgICAgICAgIC5mYWlsdXJlKCkKICAgICAgICAgICAgIC5lcnJvckNvbnRhaW5zKCJDYW5ub3Qgam9pbiB0aGUgcmluZyB1bnRpbCBib290c3RyYXAgY29tcGxldGVzIik7CiAKKyAgICAgICAgbm9kZS5ub2RldG9vbFJlc3VsdCgiYm9vdHN0cmFwIiwgInJlc3VtZSIpLmFzc2VydHMoKS5mYWlsdXJlKCk7CiAgICAgICAgIFJld3JpdGVFbmFibGVkLmRpc2FibGUoKTsKICAgICAgICAgbm9kZS5ub2RldG9vbFJlc3VsdCgiYm9vdHN0cmFwIiwgInJlc3VtZSIpLmFzc2VydHMoKS5zdWNjZXNzKCk7CiAgICAgICAgIGlmIChpc1dyaXRlU3VydmV5KQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0NBU0NvbnRlbnRpb25UZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvQ0FTQ29udGVudGlvblRlc3QuamF2YQppbmRleCBhYWZiYzQ1Li42MGU4ZGIwIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvQ0FTQ29udGVudGlvblRlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvQ0FTQ29udGVudGlvblRlc3QuamF2YQpAQCAtMzUsNiArMzUsNyBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlBBWE9TX1VTRV9TRUxGX0VYRUNVVElPTjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWwuUVVPUlVNOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuVmVyYi5QQVhPUzJfUFJFUEFSRV9SRVE7CiAKQEAgLTQ1LDcgKzQ2LDcgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5wYXhvcy51c2Vfc2VsZl9leGVjdXRpb24iLCAiZmFsc2UiKTsKKyAgICAgICAgUEFYT1NfVVNFX1NFTEZfRVhFQ1VUSU9OLnNldEJvb2xlYW4oZmFsc2UpOwogICAgICAgICBUZXN0QmFzZUltcGwuYmVmb3JlQ2xhc3MoKTsKICAgICAgICAgQ29uc3VtZXI8SUluc3RhbmNlQ29uZmlnPiBjb25mID0gY29uZmlnIC0+IGNvbmZpZwogICAgICAgICAgICAgICAgIC5zZXQoInBheG9zX3ZhcmlhbnQiLCAidjIiKQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0NBU1Rlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9DQVNUZXN0LmphdmEKaW5kZXggOGUyYjhhYy4uZGM3OTI1NiAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0NBU1Rlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvQ0FTVGVzdC5qYXZhCkBAIC0zOSw2ICszOSw3IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlBBWE9TX1VTRV9TRUxGX0VYRUNVVElPTjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWwuQU5ZOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuQ29uc2lzdGVuY3lMZXZlbC5PTkU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Db25zaXN0ZW5jeUxldmVsLkxPQ0FMX1FVT1JVTTsKQEAgLTc2LDcgKzc3LDcgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5wYXhvcy51c2Vfc2VsZl9leGVjdXRpb24iLCAiZmFsc2UiKTsKKyAgICAgICAgUEFYT1NfVVNFX1NFTEZfRVhFQ1VUSU9OLnNldEJvb2xlYW4oZmFsc2UpOwogICAgICAgICBUZXN0QmFzZUltcGwuYmVmb3JlQ2xhc3MoKTsKICAgICAgICAgQ29uc3VtZXI8SUluc3RhbmNlQ29uZmlnPiBjb25mID0gY29uZmlnIC0+IGNvbmZpZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgicGF4b3NfdmFyaWFudCIsICJ2MiIpCmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvQ2x1c3RlclN0b3JhZ2VVc2FnZVRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9DbHVzdGVyU3RvcmFnZVVzYWdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMzc5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvQ2x1c3RlclN0b3JhZ2VVc2FnZVRlc3QuamF2YQpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuSUludm9rYWJsZUluc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSXNvbGF0ZWRFeGVjdXRvci5TZXJpYWxpemFibGVGdW5jdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkRlZmF1bHROYW1lRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLkNsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OworCisvKioKKyAqIFRoaXMgY2xhc3MgdmVyaWZpZXMgdGhlIGJlaGF2aW9yIG9mIG91ciBnbG9iYWwgZGlzayB1c2FnZSBtZXRyaWNzIGFjcm9zcyBkaWZmZXJlbnQgY2x1c3RlciBhbmQgcmVwbGljYXRpb24KKyAqIGNvbmZpZ3VyYXRpb25zLiBJbiBhZGRpdGlvbiwgaXQgdmVyaWZpZXMgdGhhdCB0aGV5IGFyZSBwcm9wZXJseSBleHBvc2VkIHZpYSB0aGUgcHVibGljIG1ldHJpYyByZWdpc3RyeS4KKyAqCisgKiBEaXNrIHVzYWdlIG1ldHJpY3MgYXJlIGNoYXJhY3Rlcml6ZWQgYnkgaG93IHRoZXkgaGFuZGxlIGNvbXByZXNzaW9uIGFuZCByZXBsaWNhdGlvbjoKKyAqCisgKiAiY29tcHJlc3NlZCIgLT4gaW5kaWNhdGVzIHJhdyBkaXNrIHVzYWdlCisgKiAidW5jb21wcmVzc2VkIiAtPiBpbmRpY2F0ZXMgdW5jb21wcmVzc2VkIGZpbGUgc2l6ZSAod2hpY2ggaXMgZXF1aXZhbGVudCB0byAiY29tcHJlc3NlZCIgd2l0aCBubyBjb21wcmVzc2lvbiBlbmFibGVkKQorICogInJlcGxpY2F0ZWQiIC0+IGluY2x1ZGVzIGRpc2sgdXNhZ2UgZm9yIGRhdGEgb3V0c2lkZSB0aGUgbm9kZSdzIHByaW1hcnkgcmFuZ2UKKyAqICJ1bnJlcGxpY2F0ZWQiIC0+IGluZGljYXRlcyBkaXNrIHVzYWdlIHNjYWxlZCBkb3duIGJ5IHJlcGxpY2F0aW9uIGZhY3RvciBhY3Jvc3MgdGhlIGVudGlyZSBjbHVzdGVyCisgKi8KK3B1YmxpYyBjbGFzcyBDbHVzdGVyU3RvcmFnZVVzYWdlVGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbAoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERlZmF1bHROYW1lRmFjdG9yeSBGQUNUT1JZID0gbmV3IERlZmF1bHROYW1lRmFjdG9yeSgiU3RvcmFnZSIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNVVRBVElPTlMgPSAxMDAwOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9SZXBsaWNhdGlvbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIC8vIFdpdGggYSByZXBsaWNhdGlvbiBmYWN0b3Igb2YgMSBmb3Igb3VyIG9ubHkgdXNlciBrZXlzcGFjZSwgc3lzdGVtIGtleXNwYWNlcyB1c2luZyBsb2NhbCByZXBsaWNhdGlvbiwgYW5kCisgICAgICAgIC8vIGVtcHR5IGRpc3RyaWJ1dGVkIHN5c3RlbSB0YWJsZXMsIHJlcGxpY2F0ZWQgYW5kIHVucmVwbGljYXRlZCB2ZXJzaW9ucyBvZiBvdXIgY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkCisgICAgICAgIC8vIG1ldHJpY3Mgc2hvdWxkIGJlIGVxdWl2YWxlbnQuCisKKyAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBpbml0KGJ1aWxkZXIoKS53aXRoTm9kZXMoMikuc3RhcnQoKSwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvcHVsYXRlVXNlcktleXNwYWNlKGNsdXN0ZXIpOworICAgICAgICAgICAgdmVyaWZ5TG9hZE1ldHJpY3NXaXRob3V0UmVwbGljYXRpb24oY2x1c3Rlci5nZXQoMSkpOworICAgICAgICAgICAgdmVyaWZ5TG9hZE1ldHJpY3NXaXRob3V0UmVwbGljYXRpb24oY2x1c3Rlci5nZXQoMikpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUxvYWRNZXRyaWNzV2l0aG91dFJlcGxpY2F0aW9uKElJbnZva2FibGVJbnN0YW5jZSBub2RlKQorICAgIHsKKyAgICAgICAgbG9uZyBjb21wcmVzc2VkTG9hZCA9IGdldExvYWQobm9kZSk7CisgICAgICAgIGxvbmcgdW5jb21wcmVzc2VkTG9hZCA9IGdldFVuY29tcHJlc3NlZExvYWQobm9kZSk7CisgICAgICAgIGFzc2VydFRoYXQoY29tcHJlc3NlZExvYWQpLmlzRXF1YWxUbyhnZXRVbnJlcGxpY2F0ZWRMb2FkKG5vZGUpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh1bmNvbXByZXNzZWRMb2FkKS5pc0VxdWFsVG8oZ2V0VW5yZXBsaWNhdGVkVW5jb21wcmVzc2VkTG9hZChub2RlKSk7CisgICAgICAgIGFzc2VydFRoYXQodW5jb21wcmVzc2VkTG9hZCkuaXNHcmVhdGVyVGhhbihjb21wcmVzc2VkTG9hZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlUmVwbGljYXRpb24oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICAvLyBXaXRoIGEgcmVwbGljYXRpb24gZmFjdG9yIG9mIDIgZm9yIG91ciBvbmx5IHVzZXIga2V5c3BhY2UsIGRpc2sgc3BhY2UgdXNlZCBieSB0aGF0IGtleXNwYWNlIHNob3VsZAorICAgICAgICAvLyBiZSBzY2FsZWQgZG93biBieSBhIGZhY3RvciBvZiAyLCB3aGlsZSBjb250cmlidXRpb25zIGZyb20gc3lzdGVtIGtleXNwYWNlcyBhcmUgdW5hZmZlY3RlZC4KKworICAgICAgICB0cnkgKENsdXN0ZXIgY2x1c3RlciA9IGluaXQoYnVpbGRlcigpLndpdGhOb2RlcygzKS5zdGFydCgpLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcG9wdWxhdGVVc2VyS2V5c3BhY2UoY2x1c3Rlcik7CisKKyAgICAgICAgICAgIHZlcmlmeUxvYWRNZXRyaWNzV2l0aFJlcGxpY2F0aW9uKGNsdXN0ZXIuZ2V0KDEpKTsKKyAgICAgICAgICAgIHZlcmlmeUxvYWRNZXRyaWNzV2l0aFJlcGxpY2F0aW9uKGNsdXN0ZXIuZ2V0KDIpKTsKKyAgICAgICAgICAgIHZlcmlmeUxvYWRNZXRyaWNzV2l0aFJlcGxpY2F0aW9uKGNsdXN0ZXIuZ2V0KDMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpRGF0YWNlbnRlclJlcGxpY2F0aW9uKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgLy8gV2l0aCBhIHJlcGxpY2F0aW9uIGZhY3RvciBvZiAxIGZvciBvdXIgb25seSB1c2VyIGtleXNwYWNlIGluIHR3byBEQ3MsIGRpc2sgc3BhY2UgdXNlZCBieSB0aGF0IGtleXNwYWNlIHNob3VsZAorICAgICAgICAvLyBiZSBzY2FsZWQgZG93biBieSBhIGZhY3RvciBvZiAyLCB3aGlsZSBjb250cmlidXRpb25zIGZyb20gc3lzdGVtIGtleXNwYWNlcyBhcmUgdW5hZmZlY3RlZC4KKworICAgICAgICB0cnkgKENsdXN0ZXIgY2x1c3RlciA9IGJ1aWxkZXIoKS53aXRoREMoIkRDMSIsIDIpLndpdGhEQygiREMyIiwgMikuc3RhcnQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoIkNSRUFURSBLRVlTUEFDRSAiICsgS0VZU1BBQ0UgKyAiIFdJVEggcmVwbGljYXRpb24gPSB7J2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ0RDMSc6IDEsICdEQzInOiAxfTsiKTsKKyAgICAgICAgICAgIHBvcHVsYXRlVXNlcktleXNwYWNlKGNsdXN0ZXIpOworCisgICAgICAgICAgICB2ZXJpZnlMb2FkTWV0cmljc1dpdGhSZXBsaWNhdGlvbihjbHVzdGVyLmdldCgxKSk7CisgICAgICAgICAgICB2ZXJpZnlMb2FkTWV0cmljc1dpdGhSZXBsaWNhdGlvbihjbHVzdGVyLmdldCgyKSk7CisgICAgICAgICAgICB2ZXJpZnlMb2FkTWV0cmljc1dpdGhSZXBsaWNhdGlvbihjbHVzdGVyLmdldCgzKSk7CisgICAgICAgICAgICB2ZXJpZnlMb2FkTWV0cmljc1dpdGhSZXBsaWNhdGlvbihjbHVzdGVyLmdldCg0KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcG9wdWxhdGVVc2VyS2V5c3BhY2UoQ2x1c3RlciBjbHVzdGVyKQorICAgIHsKKyAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgJXMudGJsIChwayBpbnQsIHYgdGV4dCwgUFJJTUFSWSBLRVkgKHBrKSk7IikpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTVVUQVRJT05TOyBpKyspIHsKKyAgICAgICAgICAgIGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnRibCAocGssIHYpIFZBTFVFUyAoPyw/KSIpLCBDb25zaXN0ZW5jeUxldmVsLkFMTCwgaSwgImNvbXByZXNzYWJsZSIpOworICAgICAgICB9CisKKyAgICAgICAgY2x1c3Rlci5mb3JFYWNoKChpKSAtPiBpLmZsdXNoKEtFWVNQQUNFKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUxvYWRNZXRyaWNzV2l0aFJlcGxpY2F0aW9uKElJbnZva2FibGVJbnN0YW5jZSBub2RlKQorICAgIHsKKyAgICAgICAgbG9uZyB1bnJlcGxpY2F0ZWRMb2FkID0gZ2V0VW5yZXBsaWNhdGVkTG9hZChub2RlKTsKKyAgICAgICAgbG9uZyBleHBlY3RlZFVucmVwbGljYXRlZExvYWQgPSBjb21wdXRlVW5yZXBsaWNhdGVkTWV0cmljKG5vZGUsIHRhYmxlIC0+IHRhYmxlLm1ldHJpYy5saXZlRGlza1NwYWNlVXNlZC5nZXRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChleHBlY3RlZFVucmVwbGljYXRlZExvYWQpLmlzRXF1YWxUbyh1bnJlcGxpY2F0ZWRMb2FkKTsKKyAgICAgICAgYXNzZXJ0VGhhdChnZXRMb2FkKG5vZGUpKS5pc0dyZWF0ZXJUaGFuKHVucmVwbGljYXRlZExvYWQpOworCisgICAgICAgIGxvbmcgdW5yZXBsaWNhdGVkVW5jb21wcmVzc2VkTG9hZCA9IGdldFVucmVwbGljYXRlZFVuY29tcHJlc3NlZExvYWQobm9kZSk7CisgICAgICAgIGxvbmcgZXhwZWN0ZWRVbnJlcGxpY2F0ZWRVbmNvbXByZXNzZWRMb2FkID0gY29tcHV0ZVVucmVwbGljYXRlZE1ldHJpYyhub2RlLCB0YWJsZSAtPiB0YWJsZS5tZXRyaWMudW5jb21wcmVzc2VkTGl2ZURpc2tTcGFjZVVzZWQuZ2V0Q291bnQoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZXhwZWN0ZWRVbnJlcGxpY2F0ZWRVbmNvbXByZXNzZWRMb2FkKS5pc0VxdWFsVG8odW5yZXBsaWNhdGVkVW5jb21wcmVzc2VkTG9hZCk7CisgICAgICAgIGFzc2VydFRoYXQoZ2V0VW5jb21wcmVzc2VkTG9hZChub2RlKSkuaXNHcmVhdGVyVGhhbih1bnJlcGxpY2F0ZWRVbmNvbXByZXNzZWRMb2FkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgZ2V0TG9hZChJSW52b2thYmxlSW5zdGFuY2Ugbm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlLm1ldHJpY3MoKS5nZXRDb3VudGVyKEZBQ1RPUlkuY3JlYXRlTWV0cmljTmFtZSgiTG9hZCIpLmdldE1ldHJpY05hbWUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGdldFVuY29tcHJlc3NlZExvYWQoSUludm9rYWJsZUluc3RhbmNlIG5vZGUxKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGUxLm1ldHJpY3MoKS5nZXRDb3VudGVyKEZBQ1RPUlkuY3JlYXRlTWV0cmljTmFtZSgiVW5jb21wcmVzc2VkTG9hZCIpLmdldE1ldHJpY05hbWUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGdldFVucmVwbGljYXRlZExvYWQoSUludm9rYWJsZUluc3RhbmNlIG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gKExvbmcpIG5vZGUubWV0cmljcygpLmdldEdhdWdlKEZBQ1RPUlkuY3JlYXRlTWV0cmljTmFtZSgiVW5yZXBsaWNhdGVkTG9hZCIpLmdldE1ldHJpY05hbWUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGdldFVucmVwbGljYXRlZFVuY29tcHJlc3NlZExvYWQoSUludm9rYWJsZUluc3RhbmNlIG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gKExvbmcpIG5vZGUubWV0cmljcygpLmdldEdhdWdlKEZBQ1RPUlkuY3JlYXRlTWV0cmljTmFtZSgiVW5yZXBsaWNhdGVkVW5jb21wcmVzc2VkTG9hZCIpLmdldE1ldHJpY05hbWUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGNvbXB1dGVVbnJlcGxpY2F0ZWRNZXRyaWMoSUludm9rYWJsZUluc3RhbmNlIG5vZGUsIFNlcmlhbGl6YWJsZUZ1bmN0aW9uPENvbHVtbkZhbWlseVN0b3JlLCBMb25nPiBtZXRyaWMpCisgICAgeworICAgICAgICByZXR1cm4gbm9kZS5jYWxsT25JbnN0YW5jZSgoKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHN1bSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoS2V5c3BhY2Uga2V5c3BhY2UgOiBLZXlzcGFjZS5hbGwoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKENvbHVtbkZhbWlseVN0b3JlIHRhYmxlIDoga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmVzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBtZXRyaWMuYXBwbHkodGFibGUpIC8ga2V5c3BhY2UuZ2V0UmVwbGljYXRpb25TdHJhdGVneSgpLmdldFJlcGxpY2F0aW9uRmFjdG9yKCkuZnVsbFJlcGxpY2FzOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0NvbHVtbk1hc2tUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvQ29sdW1uTWFza1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGQxOTdjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0NvbHVtbk1hc2tUZXN0LmphdmEKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQ29uc2lzdGVuY3lMZXZlbDsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuUmVzdWx0U2V0OworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5TZXNzaW9uOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5TaW1wbGVTdGF0ZW1lbnQ7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlN0YXRlbWVudDsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUucG9saWNpZXMuTG9hZEJhbGFuY2luZ1BvbGljeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLkNhc3NhbmRyYVJvbGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLkNsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklJbnZva2FibGVJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5pbXBsLlJvd1V0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudXRpbC5TaW5nbGVIb3N0TG9hZEJhbGFuY2luZ1BvbGljeTsKKworaW1wb3J0IHN0YXRpYyBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQ2x1c3Rlci5CdWlsZGVyOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlOVVRFUzsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5DYXNzYW5kcmFSb2xlTWFuYWdlci5ERUZBVUxUX1NVUEVSVVNFUl9OQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLkNhc3NhbmRyYVJvbGVNYW5hZ2VyLkRFRkFVTFRfU1VQRVJVU0VSX1BBU1NXT1JEOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZS5HT1NTSVA7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLk5BVElWRV9QUk9UT0NPTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLkFzc2VydFV0aWxzLmFzc2VydFJvd3M7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5Bc3NlcnRVdGlscy5yb3c7CitpbXBvcnQgc3RhdGljIG9yZy5hd2FpdGlsaXR5LkF3YWl0aWxpdHkuYXdhaXQ7CisKKy8qKgorICogVGVzdHMgZm9yIGR5bmFtaWMgZGF0YSBtYXNraW5nLgorICovCitwdWJsaWMgY2xhc3MgQ29sdW1uTWFza1Rlc3QgZXh0ZW5kcyBUZXN0QmFzZUltcGwKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUID0gd2l0aEtleXNwYWNlKCJTRUxFQ1QgKiBGUk9NICVzLnQiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUk5BTUUgPSAiZGRtX3VzZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRCA9ICJkZG1fcGFzc3dvcmQiOworCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBjb2x1bW4gbWFza3MgYXJlIHByb3BhZ2F0ZWQgdG8gYWxsIG5vZGVzIGluIHRoZSBjbHVzdGVyLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hc2tQcm9wYWdhdGlvbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRyeSAoQ2x1c3RlciBjbHVzdGVyID0gY3JlYXRlQ2x1c3RlcldpdGhBdWhlbnRpY2F0aW9uKDMpKQorICAgICAgICB7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkNSRUFURSBUQUJMRSAlcy50IChrIGludCBQUklNQVJZIEtFWSwgdiB0ZXh0IE1BU0tFRCBXSVRIIERFRkFVTFQpIFdJVEggcmVhZF9yZXBhaXI9J05PTkUnIikpOworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkuZXhlY3V0ZUludGVybmFsKHdpdGhLZXlzcGFjZSgiSU5TRVJUIElOVE8gJXMudChrLCB2KSBWQUxVRVMgKDEsICdzZWNyZXQxJykiKSk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgyKS5leGVjdXRlSW50ZXJuYWwod2l0aEtleXNwYWNlKCJJTlNFUlQgSU5UTyAlcy50KGssIHYpIFZBTFVFUyAoMiwgJ3NlY3JldDInKSIpKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDMpLmV4ZWN1dGVJbnRlcm5hbCh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnQoaywgdikgVkFMVUVTICgzLCAnc2VjcmV0MycpIikpOworCisgICAgICAgICAgICBhc3NlcnRSb3dzSW5BbGxDb29yZGluYXRvcnMoY2x1c3Rlciwgcm93KDEsICIqKioqIiksIHJvdygyLCAiKioqKiIpLCByb3coMywgIioqKioiKSk7CisKKyAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQUxURVIgVEFCTEUgJXMudCBBTFRFUiB2IERST1AgTUFTS0VEIikpOworICAgICAgICAgICAgYXNzZXJ0Um93c0luQWxsQ29vcmRpbmF0b3JzKGNsdXN0ZXIsIHJvdygxLCAic2VjcmV0MSIpLCByb3coMiwgInNlY3JldDIiKSwgcm93KDMsICJzZWNyZXQzIikpOworCisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkFMVEVSIFRBQkxFICVzLnQgQUxURVIgdiBNQVNLRUQgV0lUSCBtYXNrX2lubmVyKG51bGwsIDEpIikpOworICAgICAgICAgICAgYXNzZXJ0Um93c0luQWxsQ29vcmRpbmF0b3JzKGNsdXN0ZXIsIHJvdygxLCAiKioqKioqMSIpLCByb3coMiwgIioqKioqKjIiKSwgcm93KDMsICIqKioqKiozIikpOworCisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkFMVEVSIFRBQkxFICVzLnQgQUxURVIgdiBNQVNLRUQgV0lUSCBtYXNrX2lubmVyKDMsIG51bGwpIikpOworICAgICAgICAgICAgYXNzZXJ0Um93c0luQWxsQ29vcmRpbmF0b3JzKGNsdXN0ZXIsIHJvdygxLCAic2VjKioqKiIpLCByb3coMiwgInNlYyoqKioiKSwgcm93KDMsICJzZWMqKioqIikpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBjb2x1bW4gbWFza3MgYXJlIHByb3Blcmx5IGxvYWRlZCBhdCBzdGFydHVwLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hc2tMb2FkaW5nKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBjcmVhdGVDbHVzdGVyV2l0aEF1aGVudGljYXRpb24oMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIElJbnZva2FibGVJbnN0YW5jZSBub2RlID0gY2x1c3Rlci5nZXQoMSk7CisKKyAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIEZVTkNUSU9OICVzLmN1c3RvbV9tYXNrKGNvbHVtbiB0ZXh0LCByZXBsYWNlbWVudCB0ZXh0KSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgdGV4dCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3JldHVybiByZXBsYWNlbWVudDsnIikpOworICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgJXMudCAoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImEgdGV4dCBNQVNLRUQgV0lUSCBERUZBVUxULCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYiB0ZXh0IE1BU0tFRCBXSVRIIG1hc2tfcmVwbGFjZSgncmVkYWN0ZWQnKSwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImMgdGV4dCBNQVNLRUQgV0lUSCBtYXNrX2lubmVyKG51bGwsIDEpLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZCB0ZXh0IE1BU0tFRCBXSVRIIG1hc2tfaW5uZXIoMywgbnVsbCksICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlIHRleHQgTUFTS0VEIFdJVEggJTxzLmN1c3RvbV9tYXNrKCdvYnNjdXJlZCcpLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUFJJTUFSWSBLRVkgKGEsIGIpKSIpKTsKKyAgICAgICAgICAgIFN0cmluZyBpbnNlcnQgPSB3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnQoYSwgYiwgYywgZCwgZSkgVkFMVUVTICg/LCA/LCA/LCA/LCA/KSIpOworICAgICAgICAgICAgbm9kZS5leGVjdXRlSW50ZXJuYWwoaW5zZXJ0LCAic2VjcmV0MSIsICJzZWNyZXQxIiwgInNlY3JldDEiLCAic2VjcmV0MSIsICJzZWNyZXQxIik7CisgICAgICAgICAgICBub2RlLmV4ZWN1dGVJbnRlcm5hbChpbnNlcnQsICJzZWNyZXQyIiwgInNlY3JldDIiLCAic2VjcmV0MiIsICJzZWNyZXQyIiwgInNlY3JldDIiKTsKKyAgICAgICAgICAgIGFzc2VydFJvd3NXaXRoUmVzdGFydChub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygiKioqKiIsICJyZWRhY3RlZCIsICIqKioqKioxIiwgInNlYyoqKioiLCAib2JzY3VyZWQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coIioqKioiLCAicmVkYWN0ZWQiLCAiKioqKioqMiIsICJzZWMqKioqIiwgIm9ic2N1cmVkIikpOworCisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkFMVEVSIFRBQkxFICVzLnQgQUxURVIgYSBEUk9QIE1BU0tFRCIpKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQUxURVIgVEFCTEUgJXMudCBBTFRFUiBiIE1BU0tFRCBXSVRIIG1hc2tfbnVsbCgpIikpOworICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJBTFRFUiBUQUJMRSAlcy50IEFMVEVSIGMgTUFTS0VEIFdJVEggbWFza19pbm5lcihudWxsLCBudWxsLCAnIycpIikpOworICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJBTFRFUiBUQUJMRSAlcy50IEFMVEVSIGQgTUFTS0VEIFdJVEggbWFza19pbm5lcigzLCAxLCAnIycpIikpOworICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJBTFRFUiBUQUJMRSAlcy50IEFMVEVSIGUgTUFTS0VEIFdJVEggJTxzLmN1c3RvbV9tYXNrKCdjZW5zb3JlZCcpIikpOworICAgICAgICAgICAgYXNzZXJ0Um93c1dpdGhSZXN0YXJ0KG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KCJzZWNyZXQxIiwgbnVsbCwgIiMjIyMjIyMiLCAic2VjIyMjMSIsICJjZW5zb3JlZCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygic2VjcmV0MiIsIG51bGwsICIjIyMjIyMjIiwgInNlYyMjIzIiLCAiY2Vuc29yZWQiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBDbHVzdGVyIGNyZWF0ZUNsdXN0ZXJXaXRoQXVoZW50aWNhdGlvbihpbnQgbm9kZUNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIENsdXN0ZXIgY2x1c3RlciA9IGluaXQoQ2x1c3Rlci5idWlsZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoTm9kZXMobm9kZUNvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjb25mIC0+IGNvbmYud2l0aChHT1NTSVAsIE5BVElWRV9QUk9UT0NPTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgiZHluYW1pY19kYXRhX21hc2tpbmdfZW5hYmxlZCIsICJ0cnVlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgidXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkIiwgInRydWUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJhdXRoZW50aWNhdG9yIiwgIlBhc3N3b3JkQXV0aGVudGljYXRvciIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoImF1dGhvcml6ZXIiLCAiQ2Fzc2FuZHJhQXV0aG9yaXplciIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnQoKSk7CisKKyAgICAgICAgLy8gY3JlYXRlIGEgdXNlciB3aXRob3V0IFVOTUFTSyBwZXJtaXNzaW9uCisgICAgICAgIHdpdGhBdXRoZW50aWNhdGVkU2Vzc2lvbihjbHVzdGVyLmdldCgxKSwgREVGQVVMVF9TVVBFUlVTRVJfTkFNRSwgREVGQVVMVF9TVVBFUlVTRVJfUEFTU1dPUkQsIHNlc3Npb24gLT4geworICAgICAgICAgICAgc2Vzc2lvbi5leGVjdXRlKGZvcm1hdCgiQ1JFQVRFIFVTRVIgSUYgTk9UIEVYSVNUUyAlcyBXSVRIIFBBU1NXT1JEICclcyciLCBVU0VSTkFNRSwgUEFTU1dPUkQpKTsKKyAgICAgICAgICAgIHNlc3Npb24uZXhlY3V0ZShmb3JtYXQoIkdSQU5UIEFMTCBPTiBLRVlTUEFDRSAlcyBUTyAlcyIsIEtFWVNQQUNFLCBVU0VSTkFNRSkpOworICAgICAgICAgICAgc2Vzc2lvbi5leGVjdXRlKGZvcm1hdCgiUkVWT0tFIFVOTUFTSyBPTiBLRVlTUEFDRSAlcyBGUk9NICVzIiwgS0VZU1BBQ0UsIFVTRVJOQU1FKSk7CisgICAgICAgIH0pOworCisgICAgICAgIHJldHVybiBjbHVzdGVyOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Um93c0luQWxsQ29vcmRpbmF0b3JzKENsdXN0ZXIgY2x1c3RlciwgT2JqZWN0W10uLi4gZXhwZWN0ZWRSb3dzKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBjbHVzdGVyLnNpemUoKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRSb3dzV2l0aEF1dGhlbnRpY2F0aW9uKGNsdXN0ZXIuZ2V0KGkpLCBleHBlY3RlZFJvd3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRSb3dzV2l0aFJlc3RhcnQoSUludm9rYWJsZUluc3RhbmNlIG5vZGUsIE9iamVjdFtdLi4uIGV4cGVjdGVkUm93cykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgLy8gdGVzdCBxdWVyeWluZyB3aXRoIGluLW1lbW9yeSBjb2x1bW4gZGVmaW5pdGlvbnMKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhBdXRoZW50aWNhdGlvbihub2RlLCBleHBlY3RlZFJvd3MpOworCisgICAgICAgIC8vIHJlc3RhcnQgdGhlIG5vZGVzIHRvIHJlbG9hZCB0aGUgY29sdW1uIGRlZmluaXRpb25zIGZyb20gZGlzaworICAgICAgICBub2RlLnNodXRkb3duKCkuZ2V0KCk7CisgICAgICAgIG5vZGUuc3RhcnR1cCgpOworCisgICAgICAgIC8vIHRlc3QgcXVlcnlpbmcgd2l0aCB0aGUgY29sdW1uIGRlZmluaXRpb25zIGxvYWRlZCBmcm9tIGRpc2sKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhBdXRoZW50aWNhdGlvbihub2RlLCBleHBlY3RlZFJvd3MpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Um93c1dpdGhBdXRoZW50aWNhdGlvbihJSW52b2thYmxlSW5zdGFuY2Ugbm9kZSwgT2JqZWN0W10uLi4gZXhwZWN0ZWRSb3dzKQorICAgIHsKKyAgICAgICAgd2l0aEF1dGhlbnRpY2F0ZWRTZXNzaW9uKG5vZGUsIFVTRVJOQU1FLCBQQVNTV09SRCwgc2Vzc2lvbiAtPiB7CisgICAgICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbmV3IFNpbXBsZVN0YXRlbWVudChTRUxFQ1QpLnNldENvbnNpc3RlbmN5TGV2ZWwoQ29uc2lzdGVuY3lMZXZlbC5BTEwpOworICAgICAgICAgICAgUmVzdWx0U2V0IHJlc3VsdFNldCA9IHNlc3Npb24uZXhlY3V0ZShzdGF0ZW1lbnQpOworICAgICAgICAgICAgYXNzZXJ0Um93cyhSb3dVdGlsLnRvT2JqZWN0cyhyZXN1bHRTZXQpLCBleHBlY3RlZFJvd3MpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdpdGhBdXRoZW50aWNhdGVkU2Vzc2lvbihJSW52b2thYmxlSW5zdGFuY2UgaW5zdGFuY2UsIFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkLCBDb25zdW1lcjxTZXNzaW9uPiBjb25zdW1lcikKKyAgICB7CisgICAgICAgIC8vIHdhaXQgZm9yIGV4aXN0aW5nIHJvbGVzCisgICAgICAgIGF3YWl0KCkucG9sbERlbGF5KDEsIFNFQ09ORFMpCisgICAgICAgICAgICAgICAucG9sbEludGVydmFsKDEsIFNFQ09ORFMpCisgICAgICAgICAgICAgICAuYXRNb3N0KDEsIE1JTlVURVMpCisgICAgICAgICAgICAgICAudW50aWwoKCkgLT4gaW5zdGFuY2UuY2FsbE9uSW5zdGFuY2UoQ2Fzc2FuZHJhUm9sZU1hbmFnZXI6Omhhc0V4aXN0aW5nUm9sZXMpKTsKKworICAgICAgICAvLyB1c2UgYSBsb2FkIGJhbGFuY2luZyBwb2xpY3kgdGhhdCBlbnN1cmVzIHRoYXQgd2UgYWN0dWFsbHkgY29ubmVjdCB0byB0aGUgZGVzaXJlZCBub2RlCisgICAgICAgIEluZXRBZGRyZXNzIGFkZHJlc3MgPSBpbnN0YW5jZS5icm9hZGNhc3RBZGRyZXNzKCkuZ2V0QWRkcmVzcygpOworICAgICAgICBMb2FkQmFsYW5jaW5nUG9saWN5IGxiYyA9IG5ldyBTaW5nbGVIb3N0TG9hZEJhbGFuY2luZ1BvbGljeShhZGRyZXNzKTsKKworICAgICAgICBCdWlsZGVyIGJ1aWxkZXIgPSBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQ2x1c3Rlci5idWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29udGFjdFBvaW50cyhhZGRyZXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoTG9hZEJhbGFuY2luZ1BvbGljeShsYmMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDcmVkZW50aWFscyh1c2VybmFtZSwgcGFzc3dvcmQpOworCisgICAgICAgIHRyeSAoY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkNsdXN0ZXIgY2x1c3RlciA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBjbHVzdGVyLmNvbm5lY3QoKSkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3VtZXIuYWNjZXB0KHNlc3Npb24pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0NvbXBhY3Rpb25EaXNrU3BhY2VUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvQ29tcGFjdGlvbkRpc2tTcGFjZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTlmODdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0NvbXBhY3Rpb25EaXNrU3BhY2VUZXN0LmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlU3RvcmU7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVTdG9yZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUGF0aFV0aWxzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgbmV0LmJ5dGVidWRkeS5CeXRlQnVkZHk7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5keW5hbWljLmxvYWRpbmcuQ2xhc3NMb2FkaW5nU3RyYXRlZ3k7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5pbXBsZW1lbnRhdGlvbi5NZXRob2REZWxlZ2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpcmVjdG9yaWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQWN0aXZlQ29tcGFjdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuQ29uc2lzdGVuY3lMZXZlbDsKKworaW1wb3J0IHN0YXRpYyBuZXQuYnl0ZWJ1ZGR5Lm1hdGNoZXIuRWxlbWVudE1hdGNoZXJzLm5hbWVkOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK3B1YmxpYyBjbGFzcyBDb21wYWN0aW9uRGlza1NwYWNlVGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbAoreworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vU3BhY2VMZWZ0KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkoQ2x1c3RlciBjbHVzdGVyID0gaW5pdChDbHVzdGVyLmJ1aWxkKDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjb25maWcgLT4gY29uZmlnLnNldCgibWluX2ZyZWVfc3BhY2VfcGVyX2RyaXZlX2luX21iIiwgIjAiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoRGF0YURpckNvdW50KDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEluc3RhbmNlSW5pdGlhbGl6ZXIoQkI6Omluc3RhbGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKCJjcmVhdGUgdGFibGUgIitLRVlTUEFDRSsiLnRibCAoaWQgaW50IHByaW1hcnkga2V5LCB4IGludCkgd2l0aCBjb21wYWN0aW9uID0geydjbGFzcyc6J1NpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3knfSIpOworICAgICAgICAgICAgY2x1c3Rlci5jb29yZGluYXRvcigxKS5leGVjdXRlKCJpbnNlcnQgaW50byAiK0tFWVNQQUNFKyIudGJsIChpZCwgeCkgdmFsdWVzICgxLDEpIiwgQ29uc2lzdGVuY3lMZXZlbC5BTEwpOworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkuZmx1c2goS0VZU1BBQ0UpOworICAgICAgICAgICAgY2x1c3Rlci5zZXRVbmNhdWdodEV4Y2VwdGlvbnNGaWx0ZXIoKHQpIC0+IHQuZ2V0TWVzc2FnZSgpICE9IG51bGwgJiYgdC5nZXRNZXNzYWdlKCkuY29udGFpbnMoIk5vdCBlbm91Z2ggc3BhY2UgZm9yIGNvbXBhY3Rpb24iKSAmJiB0LmdldE1lc3NhZ2UoKS5jb250YWlucyhLRVlTUEFDRSsiLnRibCIpKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLnJ1bk9uSW5zdGFuY2UoKCkgLT4geworICAgICAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldENvbHVtbkZhbWlseVN0b3JlKCJ0YmwiKTsKKyAgICAgICAgICAgICAgICBCQi5lc3RpbWF0ZWRSZW1haW5pbmcuc2V0KDIwMDApOworICAgICAgICAgICAgICAgIEJCLmZyZWVTcGFjZS5zZXQoMjAwMCk7CisgICAgICAgICAgICAgICAgQkIuc3N0YWJsZURpciA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5kZXNjcmlwdG9yLmRpcmVjdG9yeTsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNmcy5mb3JjZU1ham9yQ29tcGFjdGlvbigpOworICAgICAgICAgICAgICAgICAgICBmYWlsKCJUaGlzIHNob3VsZCBmYWlsLCB3ZSBoYXZlIDIwMDBiIGZyZWUgc3BhY2UsIDIwMDBiIGVzdGltYXRlZCByZW1haW5pbmcgY29tcGFjdGlvbnMgYW5kIHRoZSBuZXcgY29tcGFjdGlvbiA+IDAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBhbmQgYXZhaWxhYmxlIHNwYWNlIGFnYWluOgorICAgICAgICAgICAgICAgIEJCLmVzdGltYXRlZFJlbWFpbmluZy5zZXQoMTAwMCk7CisgICAgICAgICAgICAgICAgY2ZzLmZvcmNlTWFqb3JDb21wYWN0aW9uKCk7CisKKyAgICAgICAgICAgICAgICBCQi5lc3RpbWF0ZWRSZW1haW5pbmcuc2V0KDIwMDApOworICAgICAgICAgICAgICAgIEJCLmZyZWVTcGFjZS5zZXQoMTAwMDApOworICAgICAgICAgICAgICAgIGNmcy5mb3JjZU1ham9yQ29tcGFjdGlvbigpOworCisgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGZhaWwgaWYgb3RoZXIgZGlyIG9uIHRoZSBzYW1lIGZpbGUgc3RvcmUgcnVucyBvdXQgb2YgZGlzaworICAgICAgICAgICAgICAgIEJCLmZyZWVTcGFjZS5zZXQoMCk7CisgICAgICAgICAgICAgICAgZm9yIChEaXJlY3Rvcmllcy5EYXRhRGlyZWN0b3J5IG5ld0RpciA6IGNmcy5nZXREaXJlY3RvcmllcygpLmdldFdyaXRlYWJsZUxvY2F0aW9ucygpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBuZXdTU1RhYmxlRGlyID0gY2ZzLmdldERpcmVjdG9yaWVzKCkuZ2V0TG9jYXRpb25Gb3JEaXNrKG5ld0Rpcik7CisgICAgICAgICAgICAgICAgICAgIGlmICghQkIuc3N0YWJsZURpci5lcXVhbHMobmV3U1NUYWJsZURpcikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJCLnNzdGFibGVEaXIgPSBjZnMuZ2V0RGlyZWN0b3JpZXMoKS5nZXRMb2NhdGlvbkZvckRpc2sobmV3RGlyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2ZzLmZvcmNlTWFqb3JDb21wYWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoInRoaXMgc2hvdWxkIGZhaWwsIGRhdGEgZGlycyBzaGFyZSBmaWxlc3RvcmUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9pZ25vcmVkCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJCCisgICAgeworICAgICAgICBzdGF0aWMgZmluYWwgQXRvbWljTG9uZyBlc3RpbWF0ZWRSZW1haW5pbmcgPSBuZXcgQXRvbWljTG9uZygpOworICAgICAgICBzdGF0aWMgZmluYWwgQXRvbWljTG9uZyBmcmVlU3BhY2UgPSBuZXcgQXRvbWljTG9uZygpOworICAgICAgICBzdGF0aWMgRmlsZSBzc3RhYmxlRGlyOworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zdGFsbChDbGFzc0xvYWRlciBjbCwgSW50ZWdlciBub2RlKQorICAgICAgICB7CisgICAgICAgICAgICBuZXcgQnl0ZUJ1ZGR5KCkucmViYXNlKEFjdGl2ZUNvbXBhY3Rpb25zLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1ldGhvZChuYW1lZCgiZXN0aW1hdGVkUmVtYWluaW5nV3JpdGVCeXRlcyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludGVyY2VwdChNZXRob2REZWxlZ2F0aW9uLnRvKEJCLmNsYXNzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKGNsLCBDbGFzc0xvYWRpbmdTdHJhdGVneS5EZWZhdWx0LklOSkVDVElPTik7CisKKyAgICAgICAgICAgIG5ldyBCeXRlQnVkZHkoKS5yZWJhc2UoRmlsZVN0b3JlVXRpbHMuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWV0aG9kKG5hbWVkKCJ0cnlHZXRTcGFjZSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludGVyY2VwdChNZXRob2REZWxlZ2F0aW9uLnRvKEJCLmNsYXNzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKGNsLCBDbGFzc0xvYWRpbmdTdHJhdGVneS5EZWZhdWx0LklOSkVDVElPTik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIE1hcDxGaWxlLCBMb25nPiBlc3RpbWF0ZWRSZW1haW5pbmdXcml0ZUJ5dGVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNzdGFibGVEaXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gSW1tdXRhYmxlTWFwLm9mKHNzdGFibGVEaXIsIGVzdGltYXRlZFJlbWFpbmluZy5nZXQoKSk7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgbG9uZyB0cnlHZXRTcGFjZShGaWxlU3RvcmUgZmlsZVN0b3JlLCBQYXRoVXRpbHMuSU9Ub0xvbmdGdW5jdGlvbjxGaWxlU3RvcmU+IGZ1bmN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3N0YWJsZURpciAhPSBudWxsICYmIEZpbGVzLmdldEZpbGVTdG9yZShzc3RhYmxlRGlyLnRvUGF0aCgpKS5lcXVhbHMoZmlsZVN0b3JlKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyZWVTcGFjZS5nZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIExvbmcuTUFYX1ZBTFVFOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9Db21wYWN0aW9uT3ZlcmxhcHBpbmdTU1RhYmxlVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0NvbXBhY3Rpb25PdmVybGFwcGluZ1NTVGFibGVUZXN0LmphdmEKaW5kZXggNmE2NWM5MS4uNDRjYWY4NSAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0NvbXBhY3Rpb25PdmVybGFwcGluZ1NTVGFibGVUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0NvbXBhY3Rpb25PdmVybGFwcGluZ1NTVGFibGVUZXN0LmphdmEKQEAgLTE4LDggKzE4LDEwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdDsKIAoraW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CkBAIC05NiwxMyArOTgsMTMgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGluc3RhbGwoQ2xhc3NMb2FkZXIgY2wsIEludGVnZXIgaSkKICAgICAgICAgewogICAgICAgICAgICAgbmV3IEJ5dGVCdWRkeSgpLnJlYmFzZShEaXJlY3Rvcmllcy5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tZXRob2QobmFtZWQoImhhc0F2YWlsYWJsZURpc2tTcGFjZSIpLmFuZCh0YWtlc0FyZ3VtZW50cygyKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWV0aG9kKG5hbWVkKCJoYXNEaXNrU3BhY2VGb3JDb21wYWN0aW9uc0FuZFN0cmVhbXMiKS5hbmQodGFrZXNBcmd1bWVudHMoMikpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludGVyY2VwdChNZXRob2REZWxlZ2F0aW9uLnRvKEJCLmNsYXNzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKGNsLCBDbGFzc0xvYWRpbmdTdHJhdGVneS5EZWZhdWx0LklOSkVDVElPTik7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQXZhaWxhYmxlRGlza1NwYWNlKGxvbmcgaWdub3JlMSwgbG9uZyBpZ25vcmUyKQorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzRGlza1NwYWNlRm9yQ29tcGFjdGlvbnNBbmRTdHJlYW1zKE1hcDxGaWxlLExvbmc+IGlnbm9yZTEsIE1hcDxGaWxlLExvbmc+IGlnbm9yZTIpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChlbmFibGVkLmdldCgpKQogICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0RhdGFSZXN1cnJlY3Rpb25DaGVja1Rlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9EYXRhUmVzdXJyZWN0aW9uQ2hlY2tUZXN0LmphdmEKaW5kZXggMWIyOTdkYS4uZjQ4Yzg3MiAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0RhdGFSZXN1cnJlY3Rpb25DaGVja1Rlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvRGF0YVJlc3VycmVjdGlvbkNoZWNrVGVzdC5qYXZhCkBAIC0yNSwxMSArMjUsMTEgQEAKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuU3RhcnR1cENoZWNrc09wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuSUludm9rYWJsZUluc3RhbmNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSXNvbGF0ZWRFeGVjdXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5TdGFydHVwRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkRhdGFSZXN1cnJlY3Rpb25DaGVjazsKQEAgLTQwLDYgKzQwLDcgQEAKIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTlVURVM7CiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0LlNFQ09ORFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0hFQ0tfREFUQV9SRVNVUlJFQ1RJT05fSEVBUlRCRUFUX1BFUklPRDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLlN0YXJ0dXBDaGVja3NPcHRpb25zLkVOQUJMRURfUFJPUEVSVFk7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLkNsdXN0ZXIuYnVpbGQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLk5BVElWRV9QUk9UT0NPTDsKQEAgLTU5LDExICs2MCw5IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YVJlc3VycmVjdGlvbkNoZWNrKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgdHJ5CisgICAgICAgIC8vIHNldCBpdCB0byAxIGhvdXIgc28gY2hlY2sgd2lsbCBiZSBub3QgdXBkYXRlZCBhZnRlciBpdCBpcyB3cml0dGVuLCBmb3IgdGVzdCBwdXJwb3NlcworICAgICAgICB0cnkgKFdpdGhQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgV2l0aFByb3BlcnRpZXMoKS5zZXQoQ0hFQ0tfREFUQV9SRVNVUlJFQ1RJT05fSEVBUlRCRUFUX1BFUklPRCwgMzYwMDAwMCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIHNldCBpdCB0byAxIGhvdXIgc28gY2hlY2sgd2lsbCBiZSBub3QgdXBkYXRlZCBhZnRlciBpdCBpcyB3cml0dGVuLCBmb3IgdGVzdCBwdXJwb3NlcwotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DSEVDS19EQVRBX1JFU1VSUkVDVElPTl9IRUFSVEJFQVRfUEVSSU9ELmdldEtleSgpLCAiMzYwMDAwMCIpOwotCiAgICAgICAgICAgICAvLyBzdGFydCB0aGUgbm9kZSB3aXRoIHRoZSBjaGVjayBlbmFibGVkLCBpdCB3aWxsIGp1c3QgcGFzcyBmaW5lIGFzIHRoZXJlIGFyZSBub3QgYW55IHVzZXIgdGFibGVzIHlldAogICAgICAgICAgICAgLy8gYW5kIHN5c3RlbSB0YWJsZXMgYXJlIHlvdW5nIGVub3VnaAogICAgICAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBidWlsZCgpLndpdGhOb2RlcygxKQpAQCAtMTI5LDEwICsxMjgsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhDTFVERURfS0VZU1BBQ0VTX0NPTkZJR19QUk9QRVJUWSwgImtzMyIpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DSEVDS19EQVRBX1JFU1VSUkVDVElPTl9IRUFSVEJFQVRfUEVSSU9ELmdldEtleSgpKTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgVGhyb3dhYmxlIGV4ZWN1dGVDaGVja3NPbkluc3RhbmNlKElJbnZva2FibGVJbnN0YW5jZSBpbnN0YW5jZSwgZmluYWwgU3RyaW5nLi4uIGNvbmZpZykKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9FcGhlbWVyYWxTbmFwc2hvdFRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9FcGhlbWVyYWxTbmFwc2hvdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGU4ZjU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0VwaGVtZXJhbFNuYXBzaG90VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3Q7CisKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkZ1dHVyZXM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSW52b2thYmxlSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklJc29sYXRlZEV4ZWN1dG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnNuYXBzaG90LlNuYXBzaG90TWFuaWZlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWwuT05FOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZS5HT1NTSVA7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLk5BVElWRV9QUk9UT0NPTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmUuTkVUV09SSzsKK2ltcG9ydCBzdGF0aWMgb3JnLmF3YWl0aWxpdHkuQXdhaXRpbGl0eS5hd2FpdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIEVwaGVtZXJhbFNuYXBzaG90VGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbAoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzbmFwc2hvdE5hbWUgPSAic25hcHNob3RuYW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc25hcHNob3ROYW1lMiA9ICJzZWNvbmQtc25hcHNob3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0YWJsZU5hbWUgPSAiY2l0eSI7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydHVwUmVtb3Zlc0VwaGVtZXJhbFNuYXBzaG90T25FcGhlbWVyYWxGbGFnSW5NYW5pZmVzdCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoQ2x1c3RlciBjID0gaW5pdChidWlsZGVyKCkud2l0aE5vZGVzKDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjb25maWcgLT4gY29uZmlnLndpdGgoR09TU0lQLCBORVRXT1JLLCBOQVRJVkVfUFJPVE9DT0wpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBQYWlyPFN0cmluZywgU3RyaW5nW10+IGluaXRpYWxpc2F0aW9uRGF0YSA9IGluaXRpYWxpc2UoYyk7CisKKyAgICAgICAgICAgIHJld3JpdGVNYW5pZmVzdFRvRXBoZW1lcmFsKGluaXRpYWxpc2F0aW9uRGF0YS5sZWZ0LCBpbml0aWFsaXNhdGlvbkRhdGEucmlnaHQpOworCisgICAgICAgICAgICB2ZXJpZnkoYy5nZXQoMSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVE9ETyB0aGlzIHRlc3QgbWlnaHQgYmUgZGVsZXRlZCBvbmNlIHdlIGdldCByaWQgb2YgZXBoZW1lcmFsIG1hcmtlciBmaWxlIGZvciBnb29kIGluIDQuMworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0dXBSZW1vdmVzRXBoZW1lcmFsU25hcHNob3RPbk1hcmtlckZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKENsdXN0ZXIgYyA9IGluaXQoYnVpbGRlcigpLndpdGhOb2RlcygxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25maWcoY29uZmlnIC0+IGNvbmZpZy53aXRoKEdPU1NJUCwgTkVUV09SSywgTkFUSVZFX1BST1RPQ09MKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgUGFpcjxTdHJpbmcsIFN0cmluZ1tdPiBpbml0aWFsaXNhdGlvbkRhdGEgPSBpbml0aWFsaXNlKGMpOworCisgICAgICAgICAgICBTdHJpbmcgdGFibGVJZCA9IGluaXRpYWxpc2F0aW9uRGF0YS5sZWZ0OworICAgICAgICAgICAgU3RyaW5nW10gZGF0YURpcnMgPSBpbml0aWFsaXNhdGlvbkRhdGEucmlnaHQ7CisKKyAgICAgICAgICAgIC8vIHBsYWNlIGVwaGVtZXJhbCBtYXJrZXIgZmlsZSBpbnRvIHNuYXBzaG90IGRpcmVjdG9yeSBwcmV0ZW5kaW5nIGl0IHdhcyBjcmVhdGVkIGFzIGVwaGVtZXJhbAorICAgICAgICAgICAgUGF0aCBlcGhlbWVyYWxNYXJrZXJGaWxlID0gUGF0aHMuZ2V0KGRhdGFEaXJzWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVzb2x2ZShLRVlTUEFDRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc29sdmUoZm9ybWF0KCIlcy0lcyIsIHRhYmxlTmFtZSwgdGFibGVJZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNvbHZlKCJzbmFwc2hvdHMiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVzb2x2ZShzbmFwc2hvdE5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNvbHZlKCJlcGhlbWVyYWwuc25hcHNob3QiKTsKKworICAgICAgICAgICAgRmlsZXMuY3JlYXRlRmlsZShlcGhlbWVyYWxNYXJrZXJGaWxlKTsKKworICAgICAgICAgICAgdmVyaWZ5KGMuZ2V0KDEpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVwaGVtZXJhbFNuYXBzaG90SXNOb3RDbGVhcmFibGVGcm9tTm9kZXRvb2woKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKENsdXN0ZXIgYyA9IGluaXQoYnVpbGRlcigpLndpdGhOb2RlcygxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25maWcoY29uZmlnIC0+IGNvbmZpZy53aXRoKEdPU1NJUCwgTkVUV09SSywgTkFUSVZFX1BST1RPQ09MKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSUludm9rYWJsZUluc3RhbmNlIGluc3RhbmNlID0gYy5nZXQoMSk7CisKKyAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBTdHJpbmdbXT4gaW5pdGlhbGlzYXRpb25EYXRhID0gaW5pdGlhbGlzZShjKTsKKyAgICAgICAgICAgIHJld3JpdGVNYW5pZmVzdFRvRXBoZW1lcmFsKGluaXRpYWxpc2F0aW9uRGF0YS5sZWZ0LCBpbml0aWFsaXNhdGlvbkRhdGEucmlnaHQpOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKGluc3RhbmNlLm5vZGV0b29sUmVzdWx0KCJsaXN0c25hcHNob3RzIiwgIi1lIikuZ2V0U3Rkb3V0KCkuY29udGFpbnMoc25hcHNob3ROYW1lKSk7CisgICAgICAgICAgICBpbnN0YW5jZS5ub2RldG9vbFJlc3VsdCgiY2xlYXJzbmFwc2hvdCIsICItdCIsIHNuYXBzaG90TmFtZSkuYXNzZXJ0cygpLnN1Y2Nlc3MoKTsKKyAgICAgICAgICAgIC8vIGVwaGVtZXJhbCBzbmFwc2hvdCB3YXMgbm90IHJlbW92ZWQgYXMgaXQgY2FuIG5vdCBiZSAoZnJvbSBub2RldG9vbCAvIHVzZXIgb3BlcmF0aW9uKQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpbnN0YW5jZS5ub2RldG9vbFJlc3VsdCgibGlzdHNuYXBzaG90cyIsICItZSIpLmdldFN0ZG91dCgpLmNvbnRhaW5zKHNuYXBzaG90TmFtZSkpOworCisgICAgICAgICAgICBhc3NlcnRGYWxzZShpbnN0YW5jZS5sb2dzKCkuZ3JlcCgiU2tpcHBpbmcgZGVsZXRpb24gb2YgZXBoZW1lcmFsIHNuYXBzaG90ICdzbmFwc2hvdG5hbWUnIGluIGtleXNwYWNlIGRpc3RyaWJ1dGVkX3Rlc3Rfa2V5c3BhY2UuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVwaGVtZXJhbCBzbmFwc2hvdHMgYXJlIG5vdCByZW1vdmFibGUgYnkgYSB1c2VyLiIpLmdldFJlc3VsdCgpLmlzRW1wdHkoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcmluZ0FsbFNuYXBzaG90c0Zyb21Ob2RldG9vbFdpbGxLZWVwRXBoZW1lcmFsU25hcGhvdHNJbnRhY3QoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKENsdXN0ZXIgYyA9IGluaXQoYnVpbGRlcigpLndpdGhOb2RlcygxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25maWcoY29uZmlnIC0+IGNvbmZpZy53aXRoKEdPU1NJUCwgTkVUV09SSywgTkFUSVZFX1BST1RPQ09MKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSUludm9rYWJsZUluc3RhbmNlIGluc3RhbmNlID0gYy5nZXQoMSk7CisKKyAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBTdHJpbmdbXT4gaW5pdGlhbGlzYXRpb25EYXRhID0gaW5pdGlhbGlzZShjKTsKKworICAgICAgICAgICAgcmV3cml0ZU1hbmlmZXN0VG9FcGhlbWVyYWwoaW5pdGlhbGlzYXRpb25EYXRhLmxlZnQsIGluaXRpYWxpc2F0aW9uRGF0YS5yaWdodCk7CisKKyAgICAgICAgICAgIGluc3RhbmNlLm5vZGV0b29sUmVzdWx0KCJjbGVhcnNuYXBzaG90IiwgIi0tYWxsIikuYXNzZXJ0cygpLnN1Y2Nlc3MoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoaW5zdGFuY2Uubm9kZXRvb2xSZXN1bHQoImxpc3RzbmFwc2hvdHMiLCAiLWUiKS5nZXRTdGRvdXQoKS5jb250YWlucyhzbmFwc2hvdE5hbWUpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGluc3RhbmNlLm5vZGV0b29sUmVzdWx0KCJsaXN0c25hcHNob3RzIiwgIi1lIikuZ2V0U3Rkb3V0KCkuY29udGFpbnMoc25hcHNob3ROYW1lMikpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBQYWlyPFN0cmluZywgU3RyaW5nW10+IGluaXRpYWxpc2UoQ2x1c3RlciBjKQorICAgIHsKKyAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAlcy4iICsgdGFibGVOYW1lICsgIiAoY2l0eWlkIGludCBQUklNQVJZIEtFWSwgbmFtZSB0ZXh0KSIpKTsKKyAgICAgICAgYy5jb29yZGluYXRvcigxKS5leGVjdXRlKHdpdGhLZXlzcGFjZSgiSU5TRVJUIElOVE8gJXMuIiArIHRhYmxlTmFtZSArICIoY2l0eWlkLCBuYW1lKSBWQUxVRVMgKDEsICdDYW5iZXJyYScpOyIpLCBPTkUpOworICAgICAgICBJSW52b2thYmxlSW5zdGFuY2UgaW5zdGFuY2UgPSBjLmdldCgxKTsKKworICAgICAgICBpbnN0YW5jZS5mbHVzaChLRVlTUEFDRSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGluc3RhbmNlLm5vZGV0b29sKCJzbmFwc2hvdCIsICIta3QiLCB3aXRoS2V5c3BhY2UoIiVzLiIgKyB0YWJsZU5hbWUpLCAiLXQiLCBzbmFwc2hvdE5hbWUpKTsKKyAgICAgICAgd2FpdEZvclNuYXBzaG90KGluc3RhbmNlLCBzbmFwc2hvdE5hbWUpOworCisgICAgICAgIC8vIHRha2Ugb25lIG1vcmUgc25hcHNob3QsIHRoaXMgb25lIGlzIG5vdCBlcGhlbWVyYWwsCisgICAgICAgIC8vIHN0YXJ0aW5nIENhc3NhbmRyYSB3aWxsIGNsZWFyIGVwaGVtZXJhbHMsIGJ1dCBpdCB3aWxsIG5vdCBhZmZlY3Qgbm9uLWVwaGVtZXJhbCBzbmFwc2hvdHMKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGluc3RhbmNlLm5vZGV0b29sKCJzbmFwc2hvdCIsICIta3QiLCB3aXRoS2V5c3BhY2UoIiVzLiIgKyB0YWJsZU5hbWUpLCAiLXQiLCBzbmFwc2hvdE5hbWUyKSk7CisgICAgICAgIHdhaXRGb3JTbmFwc2hvdChpbnN0YW5jZSwgc25hcHNob3ROYW1lMik7CisKKyAgICAgICAgU3RyaW5nIHRhYmxlSWQgPSBpbnN0YW5jZS5jYWxsT25JbnN0YW5jZSgoSUlzb2xhdGVkRXhlY3V0b3IuU2VyaWFsaXphYmxlQ2FsbGFibGU8U3RyaW5nPikgKCkgLT4geworICAgICAgICAgICAgcmV0dXJuIEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldE1ldGFkYXRhKCkudGFibGVzLmdldCh0YWJsZU5hbWUpLmdldCgpLmlkLmFzVVVJRCgpLnRvU3RyaW5nKCkucmVwbGFjZUFsbCgiLSIsICIiKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgU3RyaW5nW10gZGF0YURpcnMgPSAoU3RyaW5nW10pIGluc3RhbmNlLmNvbmZpZygpLmdldCgiZGF0YV9maWxlX2RpcmVjdG9yaWVzIik7CisKKyAgICAgICAgcmV0dXJuIFBhaXIuY3JlYXRlKHRhYmxlSWQsIGRhdGFEaXJzKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnkoSUludm9rYWJsZUluc3RhbmNlIGluc3RhbmNlKQorICAgIHsKKyAgICAgICAgLy8gYnkgZGVmYXVsdCwgd2UgZG8gbm90IHNlZSBlcGhlbWVyYWxzCisgICAgICAgIGFzc2VydEZhbHNlKGluc3RhbmNlLm5vZGV0b29sUmVzdWx0KCJsaXN0c25hcHNob3RzIikuZ2V0U3Rkb3V0KCkuY29udGFpbnMoc25hcHNob3ROYW1lKSk7CisKKyAgICAgICAgLy8gd2Ugc2VlIHRoZW0gdmlhIC1lIGZsYWcKKyAgICAgICAgYXNzZXJ0VHJ1ZShpbnN0YW5jZS5ub2RldG9vbFJlc3VsdCgibGlzdHNuYXBzaG90cyIsICItZSIpLmdldFN0ZG91dCgpLmNvbnRhaW5zKHNuYXBzaG90TmFtZSkpOworCisgICAgICAgIEZ1dHVyZXMuZ2V0VW5jaGVja2VkKGluc3RhbmNlLnNodXRkb3duKCkpOworCisgICAgICAgIC8vIHN0YXJ0dXAgc2hvdWxkIHJlbW92ZSBlcGhlbWVyYWwgc25hcHNob3QKKyAgICAgICAgaW5zdGFuY2Uuc3RhcnR1cCgpOworCisgICAgICAgIGFzc2VydEZhbHNlKGluc3RhbmNlLm5vZGV0b29sUmVzdWx0KCJsaXN0c25hcHNob3RzIiwgIi1lIikuZ2V0U3Rkb3V0KCkuY29udGFpbnMoc25hcHNob3ROYW1lKSk7CisgICAgICAgIGFzc2VydFRydWUoaW5zdGFuY2Uubm9kZXRvb2xSZXN1bHQoImxpc3RzbmFwc2hvdHMiLCAiLWUiKS5nZXRTdGRvdXQoKS5jb250YWlucyhzbmFwc2hvdE5hbWUyKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JTbmFwc2hvdChJSW52b2thYmxlSW5zdGFuY2UgaW5zdGFuY2UsIFN0cmluZyBzbmFwc2hvdE5hbWUpCisgICAgeworICAgICAgICBhd2FpdCgpLnRpbWVvdXQoMjAsIFNFQ09ORFMpCisgICAgICAgICAgICAgICAucG9sbEludGVydmFsKDEsIFNFQ09ORFMpCisgICAgICAgICAgICAgICAudW50aWwoKCkgLT4gaW5zdGFuY2Uubm9kZXRvb2xSZXN1bHQoImxpc3RzbmFwc2hvdHMiLCAiLWUiKS5nZXRTdGRvdXQoKS5jb250YWlucyhzbmFwc2hvdE5hbWUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmV3cml0ZU1hbmlmZXN0VG9FcGhlbWVyYWwoU3RyaW5nIHRhYmxlSWQsIFN0cmluZ1tdIGRhdGFEaXJzKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyByZXdyaXRlIG1hbmlmZXN0LCBwcmV0ZW5kIHRoYXQgaXQgaXMgZXBoZW1lcmFsCisgICAgICAgIFBhdGggbWFuaWZlc3RQYXRoID0gZmluZE1hbmlmZXN0KGRhdGFEaXJzLCB0YWJsZUlkKTsKKyAgICAgICAgU25hcHNob3RNYW5pZmVzdCBtYW5pZmVzdCA9IFNuYXBzaG90TWFuaWZlc3QuZGVzZXJpYWxpemVGcm9tSnNvbkZpbGUobmV3IEZpbGUobWFuaWZlc3RQYXRoKSk7CisgICAgICAgIFNuYXBzaG90TWFuaWZlc3QgbWFuaWZlc3RXaXRoRXBoZW1lcmFsRmxhZyA9IG5ldyBTbmFwc2hvdE1hbmlmZXN0KG1hbmlmZXN0LmZpbGVzLCBudWxsLCBtYW5pZmVzdC5jcmVhdGVkQXQsIHRydWUpOworICAgICAgICBtYW5pZmVzdFdpdGhFcGhlbWVyYWxGbGFnLnNlcmlhbGl6ZVRvSnNvbkZpbGUobmV3IEZpbGUobWFuaWZlc3RQYXRoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBQYXRoIGZpbmRNYW5pZmVzdChTdHJpbmdbXSBkYXRhRGlycywgU3RyaW5nIHRhYmxlSWQpCisgICAgeworICAgICAgICBmb3IgKFN0cmluZyBkYXRhRGlyIDogZGF0YURpcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBhdGggbWFuaWZlc3QgPSBQYXRocy5nZXQoZGF0YURpcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNvbHZlKEtFWVNQQUNFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc29sdmUoZm9ybWF0KCIlcy0lcyIsIHRhYmxlTmFtZSwgdGFibGVJZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVzb2x2ZSgic25hcHNob3RzIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNvbHZlKHNuYXBzaG90TmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNvbHZlKCJtYW5pZmVzdC5qc29uIik7CisKKyAgICAgICAgICAgIGlmIChGaWxlcy5leGlzdHMobWFuaWZlc3QpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtYW5pZmVzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuYWJsZSB0byBmaW5kIG1hbmlmZXN0ISIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9GYWlsaW5nUmVwYWlyVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0ZhaWxpbmdSZXBhaXJUZXN0LmphdmEKaW5kZXggZWIxY2RmZi4uNDA1Mjc5YSAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0ZhaWxpbmdSZXBhaXJUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0ZhaWxpbmdSZXBhaXJUZXN0LmphdmEKQEAgLTY0LDkgKzY0LDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5pbXBsLkluc3RhbmNlS2lsbGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29ycnVwdFNTVGFibGVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU1NUYWJsZVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5Gb3J3YXJkaW5nU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkc0xpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuQ2hhbm5lbFByb3h5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5WZXJiOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnJlcGFpci5SZXBhaXJQYXJhbGxlbGlzbTsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9GYWlsaW5nUmVzcG9uc2VEb2VzTm90TG9nVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0ZhaWxpbmdSZXNwb25zZURvZXNOb3RMb2dUZXN0LmphdmEKaW5kZXggMTA3MTkzOC4uNDAzMmNjNyAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0ZhaWxpbmdSZXNwb25zZURvZXNOb3RMb2dUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0ZhaWxpbmdSZXNwb25zZURvZXNOb3RMb2dUZXN0LmphdmEKQEAgLTQwLDYgKzQwLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuTG9nQWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Mb2dSZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuUmVxdWVzdEV4ZWN1dGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlJlcXVlc3RWYWxpZGF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2xpZW50U3RhdGU7CkBAIC00OSw2ICs1MCw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTUQ1RGlnZXN0OwogaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DVVNUT01fUVVFUllfSEFORExFUl9DTEFTUzsKKwogLyoqCiAgKiBUaGlzIGNsYXNzIGlzIHJhdGhlciBpbXBlbGVtbnRhdGlvbiBzcGVjaWZpYy4gIEl0IGlzIHBvc3NpYmxlIHRoYXQgY2hhbmdlcyBtYWRlIHdpbGwgY2F1c2UgdGhpcyB0ZXN0cyB0byBmYWlsLAogICogc28gdXBkYXRpbmcgdG8gdGhlIGxhdGVzdCBsb2dpYyBpcyBmaW5lLgpAQCAtNjgsMTMgKzcxLDE1IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaGVyRXJyb3JEb2VzTm90TG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuY3VzdG9tX3F1ZXJ5X2hhbmRsZXJfY2xhc3MiLCBBbHdheXNSZWplY3RFcnJvclF1ZXJ5SGFuZGxlci5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICB0cnkgKENsdXN0ZXIgY2x1c3RlciA9IENsdXN0ZXIuYnVpbGQoMSkKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KENVU1RPTV9RVUVSWV9IQU5ETEVSX0NMQVNTLCBBbHdheXNSZWplY3RFcnJvclF1ZXJ5SGFuZGxlci5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICAgICAgIENsdXN0ZXIgY2x1c3RlciA9IENsdXN0ZXIuYnVpbGQoMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25maWcoYyAtPiBjLndpdGgoRmVhdHVyZS5OQVRJVkVfUFJPVE9DT0wsIEZlYXR1cmUuR09TU0lQKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJjbGllbnRfZXJyb3JfcmVwb3J0aW5nX2V4Y2x1c2lvbnMiLCBJbW11dGFibGVNYXAub2YoInN1Ym5ldHMiLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCIxMjcuMC4wLjEiKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoImNsaWVudF9lcnJvcl9yZXBvcnRpbmdfZXhjbHVzaW9ucyIsIEltbXV0YWJsZU1hcC5vZigic3VibmV0cyIsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIjEyNy4wLjAuMSIpKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydCgpOworCisgICAgICAgICkKICAgICAgICAgeworCiAgICAgICAgICAgICB0cnkgKFNpbXBsZUNsaWVudCBjbGllbnQgPSBTaW1wbGVDbGllbnQuYnVpbGRlcigiMTI3LjAuMC4xIiwgOTA0MikuYnVpbGQoKS5jb25uZWN0KGZhbHNlKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBjbGllbnQuZXhlY3V0ZSgiU0VMRUNUICogRlJPTSBzeXN0ZW0ucGVlcnMiLCBDb25zaXN0ZW5jeUxldmVsLk9ORSk7CkBAIC05MiwxMCArOTcsNiBAQAogICAgICAgICAgICAgbWF0Y2hlcyA9IGxvZ3MuZ3JlcCgiVW5leHBlY3RlZCBleGNlcHRpb24gZHVyaW5nIHJlcXVlc3QiKTsKICAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChtYXRjaGVzLmdldFJlc3VsdCgpKS5pc0VtcHR5KCk7CiAgICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiY2Fzc2FuZHJhLmN1c3RvbV9xdWVyeV9oYW5kbGVyX2NsYXNzIik7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFsd2F5c1JlamVjdEVycm9yUXVlcnlIYW5kbGVyIGltcGxlbWVudHMgUXVlcnlIYW5kbGVyCmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvRmFpbGluZ1RydW5jYXRpb25UZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvRmFpbGluZ1RydW5jYXRpb25UZXN0LmphdmEKaW5kZXggZGQ0MTlkYi4uOWNlMmJmMyAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0ZhaWxpbmdUcnVuY2F0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9GYWlsaW5nVHJ1bmNhdGlvblRlc3QuamF2YQpAQCAtMzAsMTMgKzMwLDEyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWw7CiAKIGltcG9ydCBzdGF0aWMgbmV0LmJ5dGVidWRkeS5tYXRjaGVyLkVsZW1lbnRNYXRjaGVycy5uYW1lZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0JCRkFJTEhFTFBFUl9FTkFCTEVEOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAogcHVibGljIGNsYXNzIEZhaWxpbmdUcnVuY2F0aW9uVGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbAogewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQl9GQUlMX0hFTFBFUl9QUk9QID0gInRlc3QuYmJmYWlsaGVscGVyLmVuYWJsZWQiOwotCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbGluZ1RydW5jYXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CkBAIC00NSw3ICs0NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0KCkpKQogICAgICAgICB7CiAgICAgICAgICAgICBjbHVzdGVyLnNldFVuY2F1Z2h0RXhjZXB0aW9uc0ZpbHRlcih0IC0+ICJ0cnVuY2F0ZUJsb2NraW5nIi5lcXVhbHModC5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShCQl9GQUlMX0hFTFBFUl9QUk9QLCAidHJ1ZSIpOworICAgICAgICAgICAgVEVTVF9CQkZBSUxIRUxQRVJfRU5BQkxFRC5zZXRCb29sZWFuKHRydWUpOwogICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoImNyZWF0ZSB0YWJsZSAiICsgS0VZU1BBQ0UgKyAiLnRibCAoaWQgaW50IHByaW1hcnkga2V5LCB0IGludCkiKTsKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewpAQCAtNzYsNyArNzUsNyBAQAogCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnVuY2F0ZUJsb2NraW5nKCkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKEJvb2xlYW4uZ2V0Qm9vbGVhbihCQl9GQUlMX0hFTFBFUl9QUk9QKSkKKyAgICAgICAgICAgIGlmIChURVNUX0JCRkFJTEhFTFBFUl9FTkFCTEVELmdldEJvb2xlYW4oKSkKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidHJ1bmNhdGVCbG9ja2luZyIpOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0Zyb3plblVEVFRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9Gcm96ZW5VRFRUZXN0LmphdmEKaW5kZXggM2I1NDM5OC4uMzMxNGMyYSAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0Zyb3plblVEVFRlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvRnJvemVuVURUVGVzdC5qYXZhCkBAIC02NSwxNCArNjUsMTQgQEAKICAgICAgICAgewogICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoImNyZWF0ZSB0eXBlICIgKyBLRVlTUEFDRSArICIuYSAoZm9vIHRleHQpIik7CiAgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiY3JlYXRlIHRhYmxlICIgKyBLRVlTUEFDRSArICIueCAoaWQgaW50LCBjayBmcm96ZW48YT4sIGkgaW50LCBwcmltYXJ5IGtleSAoaWQsIGNrKSkiKTsKLSAgICAgICAgICAgIGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSgiaW5zZXJ0IGludG8gIiArIEtFWVNQQUNFICsgIi54IChpZCwgY2ssIGkpIFZBTFVFUyAoMSwgc3lzdGVtLmZyb21qc29uKCd7XCJmb29cIjpcIlwifScpLCAxKSIsIENvbnNpc3RlbmN5TGV2ZWwuQUxMKTsKLSAgICAgICAgICAgIGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSgiaW5zZXJ0IGludG8gIiArIEtFWVNQQUNFICsgIi54IChpZCwgY2ssIGkpIFZBTFVFUyAoMSwgc3lzdGVtLmZyb21qc29uKCd7XCJmb29cIjpcImFcIn0nKSwgMikiLCBDb25zaXN0ZW5jeUxldmVsLkFMTCk7CisgICAgICAgICAgICBjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUoImluc2VydCBpbnRvICIgKyBLRVlTUEFDRSArICIueCAoaWQsIGNrLCBpKSBWQUxVRVMgKDEsIHN5c3RlbS5mcm9tX2pzb24oJ3tcImZvb1wiOlwiXCJ9JyksIDEpIiwgQ29uc2lzdGVuY3lMZXZlbC5BTEwpOworICAgICAgICAgICAgY2x1c3Rlci5jb29yZGluYXRvcigxKS5leGVjdXRlKCJpbnNlcnQgaW50byAiICsgS0VZU1BBQ0UgKyAiLnggKGlkLCBjaywgaSkgVkFMVUVTICgxLCBzeXN0ZW0uZnJvbV9qc29uKCd7XCJmb29cIjpcImFcIn0nKSwgMikiLCBDb25zaXN0ZW5jeUxldmVsLkFMTCk7CiAgICAgICAgICAgICBjbHVzdGVyLmZvckVhY2goaSAtPiBpLmZsdXNoKEtFWVNQQUNFKSk7CiAKICAgICAgICAgICAgIFJ1bm5hYmxlIGNoZWNrID0gKCkgLT4gewotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoY2x1c3Rlci5jb29yZGluYXRvcigxKS5leGVjdXRlKCJzZWxlY3QgaSBmcm9tICIgKyBLRVlTUEFDRSArICIueCBXSEVSRSBpZCA9IDEgYW5kIGNrID0gc3lzdGVtLmZyb21qc29uKCd7XCJmb29cIjpcIlwifScpIiwgQ29uc2lzdGVuY3lMZXZlbC5BTEwpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoY2x1c3Rlci5jb29yZGluYXRvcigxKS5leGVjdXRlKCJzZWxlY3QgaSBmcm9tICIgKyBLRVlTUEFDRSArICIueCBXSEVSRSBpZCA9IDEgYW5kIGNrID0gc3lzdGVtLmZyb21fanNvbigne1wiZm9vXCI6XCJcIn0nKSIsIENvbnNpc3RlbmN5TGV2ZWwuQUxMKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygxKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gIiArIEtFWVNQQUNFICsgIi54IFdIRVJFIGlkID0gMSBhbmQgY2sgPSBzeXN0ZW0uZnJvbWpzb24oJ3tcImZvb1wiOlwiYVwifScpIiwgQ29uc2lzdGVuY3lMZXZlbC5BTEwpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoY2x1c3Rlci5jb29yZGluYXRvcigxKS5leGVjdXRlKCJzZWxlY3QgaSBmcm9tICIgKyBLRVlTUEFDRSArICIueCBXSEVSRSBpZCA9IDEgYW5kIGNrID0gc3lzdGVtLmZyb21fanNvbigne1wiZm9vXCI6XCJhXCJ9JykiLCBDb25zaXN0ZW5jeUxldmVsLkFMTCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coMikpOwogICAgICAgICAgICAgfTsKIApAQCAtODAsMTAgKzgwLDEwIEBACiAgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiYWx0ZXIgdHlwZSAiICsgS0VZU1BBQ0UgKyAiLmEgYWRkIGJhciB0ZXh0Iik7CiAgICAgICAgICAgICBjaGVjay5ydW4oKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gIiArIEtFWVNQQUNFICsgIi54IFdIRVJFIGlkID0gMSBhbmQgY2sgPSBzeXN0ZW0uZnJvbWpzb24oJ3tcImZvb1wiOlwiXCIsXCJiYXJcIjpcIlwifScpIiwgQ29uc2lzdGVuY3lMZXZlbC5BTEwpKTsKLSAgICAgICAgICAgIGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSgiaW5zZXJ0IGludG8gIiArIEtFWVNQQUNFICsgIi54IChpZCwgY2ssIGkpIFZBTFVFUyAoMSwgc3lzdGVtLmZyb21qc29uKCd7XCJmb29cIjpcIlwiLFwiYmFyXCI6XCJcIn0nKSwgMykiLCBDb25zaXN0ZW5jeUxldmVsLkFMTCk7CisgICAgICAgICAgICBhc3NlcnRSb3dzKGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSAiICsgS0VZU1BBQ0UgKyAiLnggV0hFUkUgaWQgPSAxIGFuZCBjayA9IHN5c3RlbS5mcm9tX2pzb24oJ3tcImZvb1wiOlwiXCIsXCJiYXJcIjpcIlwifScpIiwgQ29uc2lzdGVuY3lMZXZlbC5BTEwpKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSgiaW5zZXJ0IGludG8gIiArIEtFWVNQQUNFICsgIi54IChpZCwgY2ssIGkpIFZBTFVFUyAoMSwgc3lzdGVtLmZyb21fanNvbigne1wiZm9vXCI6XCJcIixcImJhclwiOlwiXCJ9JyksIDMpIiwgQ29uc2lzdGVuY3lMZXZlbC5BTEwpOwogICAgICAgICAgICAgY2hlY2sucnVuKCk7Ci0gICAgICAgICAgICBhc3NlcnRSb3dzKGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSAiICsgS0VZU1BBQ0UgKyAiLnggV0hFUkUgaWQgPSAxIGFuZCBjayA9IHN5c3RlbS5mcm9tanNvbigne1wiZm9vXCI6XCJcIixcImJhclwiOlwiXCJ9JykiLCBDb25zaXN0ZW5jeUxldmVsLkFMTCksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSAiICsgS0VZU1BBQ0UgKyAiLnggV0hFUkUgaWQgPSAxIGFuZCBjayA9IHN5c3RlbS5mcm9tX2pzb24oJ3tcImZvb1wiOlwiXCIsXCJiYXJcIjpcIlwifScpIiwgQ29uc2lzdGVuY3lMZXZlbC5BTEwpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coMykpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTQzLDExICsxNDMsMTEgQEAKIAogICAgIHByaXZhdGUgU3RyaW5nIGpzb24oaW50IGkpCiAgICAgewotICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgic3lzdGVtLmZyb21qc29uKCd7XCJmb29cIjpcIiVkXCJ9JykiLCBpKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInN5c3RlbS5mcm9tX2pzb24oJ3tcImZvb1wiOlwiJWRcIn0nKSIsIGkpOwogICAgIH0KIAogICAgIHByaXZhdGUgU3RyaW5nIGpzb24oaW50IGksIGludCBqKQogICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInN5c3RlbS5mcm9tanNvbigne1wiZm9vXCI6XCIlZFwiLCBcImJhclwiOlwiJWRcIn0nKSIsIGksIGopOworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgic3lzdGVtLmZyb21fanNvbigne1wiZm9vXCI6XCIlZFwiLCBcImJhclwiOlwiJWRcIn0nKSIsIGksIGopOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9Hb3NzaXBUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvR29zc2lwVGVzdC5qYXZhCmluZGV4IGM1ZjJhMDcuLjM5MDU0MTEgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9Hb3NzaXBUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0dvc3NpcFRlc3QuamF2YQpAQCAtNTEsNiArNTEsNyBAQAogCiBpbXBvcnQgc3RhdGljIG5ldC5ieXRlYnVkZHkubWF0Y2hlci5FbGVtZW50TWF0Y2hlcnMubmFtZWQ7CiBpbXBvcnQgc3RhdGljIG5ldC5ieXRlYnVkZHkubWF0Y2hlci5FbGVtZW50TWF0Y2hlcnMudGFrZXNBcmd1bWVudHM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSk9JTl9SSU5HOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hY3Rpb24uR29zc2lwSGVscGVyLndpdGhQcm9wZXJ0eTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmUuR09TU0lQOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZS5ORVRXT1JLOwpAQCAtMjk5LDcgKzMwMCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIElJbnN0YW5jZUNvbmZpZyBjb25maWcgPSBjbHVzdGVyLm5ld0luc3RhbmNlQ29uZmlnKCk7CiAgICAgICAgICAgICBJSW52b2thYmxlSW5zdGFuY2UgZ29zc2lwcGluZ09ubHlNZW1iZXIgPSBjbHVzdGVyLmJvb3RzdHJhcChjb25maWcpOwotICAgICAgICAgICAgd2l0aFByb3BlcnR5KCJjYXNzYW5kcmEuam9pbl9yaW5nIiwgQm9vbGVhbi50b1N0cmluZyhmYWxzZSksICgpIC0+IGdvc3NpcHBpbmdPbmx5TWVtYmVyLnN0YXJ0dXAoY2x1c3RlcikpOworICAgICAgICAgICAgd2l0aFByb3BlcnR5KEpPSU5fUklORywgZmFsc2UsICgpIC0+IGdvc3NpcHBpbmdPbmx5TWVtYmVyLnN0YXJ0dXAoY2x1c3RlcikpOwogCiAgICAgICAgICAgICBhc3NlcnRUcnVlKGdvc3NpcHBpbmdPbmx5TWVtYmVyLmNhbGxPbkluc3RhbmNlKChJSXNvbGF0ZWRFeGVjdXRvci5TZXJpYWxpemFibGVDYWxsYWJsZTxCb29sZWFuPikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuaXNHb3NzaXBSdW5uaW5nKCkpKTsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9IaW50ZWRIYW5kb2ZmQWRkUmVtb3ZlTm9kZXNUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvSGludGVkSGFuZG9mZkFkZFJlbW92ZU5vZGVzVGVzdC5qYXZhCmluZGV4IDVjZjFhYjYuLmFkZDZmZGYgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9IaW50ZWRIYW5kb2ZmQWRkUmVtb3ZlTm9kZXNUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0hpbnRlZEhhbmRvZmZBZGRSZW1vdmVOb2Rlc1Rlc3QuamF2YQpAQCAtMjMsMTggKzIzLDIyIEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFjdGlvbi5Hb3NzaXBIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklJbnZva2FibGVJbnN0YW5jZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuVG9rZW5TdXBwbGllcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuTmV0d29ya1RvcG9sb2d5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Db25zaXN0ZW5jeUxldmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuSGludHNTZXJ2aWNlTWV0cmljczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlN0b3JhZ2VNZXRyaWNzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiAKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uc0ZvckNsYXNzVHlwZXMuYXNzZXJ0VGhhdDsKIGltcG9ydCBzdGF0aWMgb3JnLmF3YWl0aWxpdHkuQXdhaXRpbGl0eS5hd2FpdDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYWN0aW9uLkdvc3NpcEhlbHBlci5kZWNvbW1pc3Npb247CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Db25zaXN0ZW5jeUxldmVsLkFMTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWwuVFdPOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZS5HT1NTSVA7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLk5BVElWRV9QUk9UT0NPTDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmUuTkVUV09SSzsKQEAgLTQ2LDYgKzUwLDM5IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBIaW50ZWRIYW5kb2ZmQWRkUmVtb3ZlTm9kZXNUZXN0IGV4dGVuZHMgVGVzdEJhc2VJbXBsCiB7CisgICAgQFN1cHByZXNzV2FybmluZ3MoIkNvbnZlcnQyTWV0aG9kUmVmIikKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZEF2b2lkSGludFRyYW5zZmVyT25EZWNvbW1pc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKENsdXN0ZXIgY2x1c3RlciA9IGluaXQoYnVpbGRlcigpLndpdGhOb2RlcygzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25maWcoY29uZmlnIC0+IGNvbmZpZy5zZXQoInRyYW5zZmVyX2hpbnRzX29uX2RlY29tbWlzc2lvbiIsIGZhbHNlKS53aXRoKEdPU1NJUCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aG91dFZOb2RlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLmRlY29tX25vX2hpbnRzX3Rlc3QgKGtleSBpbnQgUFJJTUFSWSBLRVksIHZhbHVlIGludCkiKSk7CisKKyAgICAgICAgICAgIGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLmRlY29tX25vX2hpbnRzX3Rlc3QgKGtleSwgdmFsdWUpIFZBTFVFUyAoPywgPykiKSwgQUxMLCAwLCAwKTsKKyAgICAgICAgICAgIGxvbmcgaGludHNCZWZvcmVTaHV0ZG93biA9IGNvdW50VG90YWxIaW50cyhjbHVzdGVyLmdldCgxKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGhpbnRzQmVmb3JlU2h1dGRvd24pLmlzRXF1YWxUbygwKTsKKyAgICAgICAgICAgIGxvbmcgaGludHNEZWxpdmVyZWQgPSBjb3VudEhpbnRzRGVsaXZlcmVkKGNsdXN0ZXIuZ2V0KDEpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaGludHNEZWxpdmVyZWQpLmlzRXF1YWxUbygwKTsKKworICAgICAgICAgICAgLy8gU2h1dGRvd24gbm9kZSAzIHNvIGhpbnRzIGNhbiBiZSB3cml0dGVuIGFnYWluc3QgaXQuCisgICAgICAgICAgICBjbHVzdGVyLmdldCgzKS5zaHV0ZG93bigpLmdldCgpOworCisgICAgICAgICAgICBjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJJTlNFUlQgSU5UTyAlcy5kZWNvbV9ub19oaW50c190ZXN0IChrZXksIHZhbHVlKSBWQUxVRVMgKD8sID8pIiksIFRXTywgMCwgMCk7CisgICAgICAgICAgICBBd2FpdGlsaXR5LmF3YWl0KCkudW50aWwoKCkgLT4gY291bnRUb3RhbEhpbnRzKGNsdXN0ZXIuZ2V0KDEpKSA+IDApOworICAgICAgICAgICAgbG9uZyBoaW50c0FmdGVyU2h1dGRvd24gPSBjb3VudFRvdGFsSGludHMoY2x1c3Rlci5nZXQoMSkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChoaW50c0FmdGVyU2h1dGRvd24pLmlzRXF1YWxUbygxKTsKKworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkubm9kZXRvb2xSZXN1bHQoImRlY29tbWlzc2lvbiIsICItLWZvcmNlIikuYXNzZXJ0cygpLnN1Y2Nlc3MoKTsKKyAgICAgICAgICAgIGxvbmcgaGludHNEZWxpdmVyZWRCeURlY29tID0gY291bnRIaW50c0RlbGl2ZXJlZChjbHVzdGVyLmdldCgxKSk7CisgICAgICAgICAgICBTdHJpbmcgbW9kZSA9IGNsdXN0ZXIuZ2V0KDEpLmNhbGxPbkluc3RhbmNlKCgpIC0+IFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmdldE9wZXJhdGlvbk1vZGUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3RvcmFnZVNlcnZpY2UuTW9kZS5ERUNPTU1JU1NJT05FRC50b1N0cmluZygpLCBtb2RlKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaGludHNEZWxpdmVyZWRCeURlY29tKS5pc0VxdWFsVG8oMCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXBsYWNlcyBQeXRob24gZHRlc3Qge0Bjb2RlIGhpbnRlZGhhbmRvZmZfdGVzdC5weTpUZXN0SGludGVkSGFuZG9mZi50ZXN0X2hpbnRlZGhhbmRvZmZfZGVjb20oKX0uCiAgICAgICovCkBAIC0xMzAsNiArMTY3LDEyIEBACiAgICAgICAgIHJldHVybiBpbnN0YW5jZS5jYWxsT25JbnN0YW5jZSgoKSAtPiBTdG9yYWdlTWV0cmljcy50b3RhbEhpbnRzLmdldENvdW50KCkpOwogICAgIH0KIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJDb252ZXJ0Mk1ldGhvZFJlZiIpCisgICAgcHJpdmF0ZSBsb25nIGNvdW50SGludHNEZWxpdmVyZWQoSUludm9rYWJsZUluc3RhbmNlIGluc3RhbmNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlLmNhbGxPbkluc3RhbmNlKCgpIC0+IEhpbnRzU2VydmljZU1ldHJpY3MuaGludHNTdWNjZWVkZWQuZ2V0Q291bnQoKSk7CisgICAgfQorCiAgICAgQFN1cHByZXNzV2FybmluZ3MoIlNhbWVQYXJhbWV0ZXJWYWx1ZSIpCiAgICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlKENsdXN0ZXIgY2x1c3RlciwgU3RyaW5nIHRhYmxlLCBpbnQgY29vcmRpbmF0b3IsIGludCBzdGFydCwgaW50IGNvdW50LCBDb25zaXN0ZW5jeUxldmVsIGNsKQogICAgIHsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9JUE1lbWJlcnNoaXBUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvSVBNZW1iZXJzaGlwVGVzdC5qYXZhCmluZGV4IDQ3NGE4YjcuLjE2YTk3YjAgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9JUE1lbWJlcnNoaXBUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0lQTWVtYmVyc2hpcFRlc3QuamF2YQpAQCAtMzYsNiArMzYsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlRvb2xSdW5uZXI7CiBpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJFUExBQ0VfQUREUkVTUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLkNsdXN0ZXJVdGlscy5hc3NlcnRSaW5nSXM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5DbHVzdGVyVXRpbHMuZ2V0RGlyZWN0b3JpZXM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5DbHVzdGVyVXRpbHMuc3RvcFVuY2hlY2tlZDsKQEAgLTY0LDExICs2NSwxMyBAQAogICAgICAgICAgICAgICAgIGdldERpcmVjdG9yaWVzKG5vZGVUb1JlcGxhY2UpLmZvckVhY2goRmlsZVV0aWxzOjpkZWxldGVSZWN1cnNpdmUpOwogCiAgICAgICAgICAgICAgICAgbm9kZVRvUmVwbGFjZS5jb25maWcoKS5zZXQoImF1dG9fYm9vdHN0cmFwIiwgYXV0b19ib290c3RyYXApOworCiAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBvdmVycmlkZSB0aGUgaG9zdCBpZCBiZWNhdXNlIG90aGVyd2lzZSB0aGUgbm9kZSB3aWxsIG5vdCBiZSBjb25zaWRlcmVkIGFzIGEgbmV3IG5vZGUKICAgICAgICAgICAgICAgICAoKEluc3RhbmNlQ29uZmlnKSBub2RlVG9SZXBsYWNlLmNvbmZpZygpKS5zZXRIb3N0SWQoVVVJRC5yYW5kb21VVUlEKCkpOwogCiAgICAgICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gbm9kZVRvUmVwbGFjZS5zdGFydHVwKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNNZXNzYWdlKCJBIG5vZGUgd2l0aCBhZGRyZXNzIC8xMjcuMC4wLjM6NzAxMiBhbHJlYWR5IGV4aXN0cywgY2FuY2VsbGluZyBqb2luLiBVc2UgY2Fzc2FuZHJhLnJlcGxhY2VfYWRkcmVzcyBpZiB5b3Ugd2FudCB0byByZXBsYWNlIHRoaXMgbm9kZS4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc01lc3NhZ2UoIkEgbm9kZSB3aXRoIGFkZHJlc3MgLzEyNy4wLjAuMzo3MDEyIGFscmVhZHkgZXhpc3RzLCBjYW5jZWxsaW5nIGpvaW4uIFVzZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVQTEFDRV9BRERSRVNTLmdldEtleSgpICsgIiBpZiB5b3Ugd2FudCB0byByZXBsYWNlIHRoaXMgbm9kZS4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9JbnRlcm5vZGVFbmNyeXB0aW9uRW5mb3JjZW1lbnRUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvSW50ZXJub2RlRW5jcnlwdGlvbkVuZm9yY2VtZW50VGVzdC5qYXZhCmluZGV4IDYyZjBhNzMuLjI3YzI2ZmIgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9JbnRlcm5vZGVFbmNyeXB0aW9uRW5mb3JjZW1lbnRUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0ludGVybm9kZUVuY3J5cHRpb25FbmZvcmNlbWVudFRlc3QuamF2YQpAQCAtMTcsMjEgKzE3LDM4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdDsKIAoraW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguQWxsb3dBbGxJbnRlcm5vZGVBdXRoZW50aWNhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguSUludGVybm9kZUF1dGhlbnRpY2F0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSXNvbGF0ZWRFeGVjdXRvci5TZXJpYWxpemFibGVSdW5uYWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuTmV0d29ya1RvcG9sb2d5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuSW5ib3VuZE1lc3NhZ2VIYW5kbGVyczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuT3V0Ym91bmRDb25uZWN0aW9uczsKK2ltcG9ydCBvcmcuYXdhaXRpbGl0eS5Bd2FpdGlsaXR5OwogCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLmdldE9ubHlFbGVtZW50OwogaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKQEAgLTM5LDYgKzU2LDExNCBAQAogCiBwdWJsaWMgZmluYWwgY2xhc3MgSW50ZXJub2RlRW5jcnlwdGlvbkVuZm9yY2VtZW50VGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbAogeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5ib3VuZENvbm5lY3Rpb25zQXJlUmVqZWN0ZWRXaGVuQXV0aEZhaWxzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBSZWplY3RJbmJvdW5kQ29ubmVjdGlvbnMgYXV0aGVudGljYXRvciBpcyBjb25maWd1cmVkIG9ubHkgZm9yIGluc3RhbmNlIDEgb2YgdGhlIGNsdXN0ZXIKKyAgICAgICAgQ2x1c3Rlci5CdWlsZGVyIGJ1aWxkZXIgPSBjcmVhdGVDbHVzdGVyKFJlamVjdEluYm91bmRDb25uZWN0aW9ucy5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpOworICAgICAgICB0cnkgKENsdXN0ZXIgY2x1c3RlciA9IGJ1aWxkZXIuc3RhcnQoKTsgQ2xvc2VhYmxlIGVzID0gZXhlY3V0b3JTZXJ2aWNlOjpzaHV0ZG93bikKKyAgICAgICAgeworICAgICAgICAgICAgZXhlY3V0b3JTZXJ2aWNlLnN1Ym1pdCgoKSAtPiBvcGVuQ29ubmVjdGlvbnMoY2x1c3RlcikpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSW5zdGFuY2UgKDEpIHNob3VsZCBiZSBhYmxlIHRvIG1ha2Ugb3V0Ym91bmQgY29ubmVjdGlvbnMgdG8gaW5zdGFuY2UgKDIpIGJ1dCBJbnN0YW5jZSAoMSkgc2hvdWxkIG5vdCBiZQorICAgICAgICAgICAgICogYWNjZXB0aW5nIGFueSBpbmJvdW5kIGNvbm5lY3Rpb25zLiB3ZSBzaG91bGQgd2FpdCBmb3IgdGhlIGF1dGhlbnRpY2F0aW9uIGZhaWx1cmUgbG9nIG9uIEluc3RhbmNlICgxKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBTZXJpYWxpemFibGVSdW5uYWJsZSBydW5uYWJsZSA9ICgpIC0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIGluYm91bmQgaGFuZGxlcnMgYXMgYXV0aGVudGljYXRpb24gZmFpbHMgJiB3ZSByZW1vdmUgaGFuZGxlcnMuCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS5tZXNzYWdlSGFuZGxlcnMudmFsdWVzKCkuc2l6ZSgpKTsKKworICAgICAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBmYWlsdXJlIGlzIGR1ZSB0byBhdXRoZW50aWNhdGlvbiBmYWlsdXJlCisgICAgICAgICAgICAgICAgZmluYWwgUmVqZWN0SW5ib3VuZENvbm5lY3Rpb25zIGF1dGhlbnRpY2F0b3IgPSAoUmVqZWN0SW5ib3VuZENvbm5lY3Rpb25zKSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0SW50ZXJub2RlQXV0aGVudGljYXRvcigpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYXV0aGVudGljYXRvci5hdXRoZW50aWNhdGlvbkZhaWxlZCk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyBXYWl0IGZvciBhdXRoZW50aWNhdGlvbiB0byBmYWlsCisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5sb2dzKCkud2F0Y2hGb3IoIlVuYWJsZSB0byBhdXRoZW50aWNhdGUgcGVlciIpOworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkucnVuT25JbnN0YW5jZShydW5uYWJsZSk7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE91dGJvdW5kQ29ubmVjdGlvbnNBcmVSZWplY3RlZFdoZW5BdXRoRmFpbHMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIENsdXN0ZXIuQnVpbGRlciBidWlsZGVyID0gY3JlYXRlQ2x1c3RlcihSZWplY3RPdXRib3VuZEF1dGhlbnRpY2F0b3IuY2xhc3MpOworCisgICAgICAgIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKTsKKyAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBidWlsZGVyLnN0YXJ0KCk7IENsb3NlYWJsZSBlcyA9IGV4ZWN1dG9yU2VydmljZTo6c2h1dGRvd24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4ZWN1dG9yU2VydmljZS5zdWJtaXQoKCkgLT4gb3BlbkNvbm5lY3Rpb25zKGNsdXN0ZXIpKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEluc3RhbmNlICgxKSBzaG91bGQgbm90IGJlIGFibGUgdG8gbWFrZSBvdXRib3VuZCBjb25uZWN0aW9ucyB0byBpbnN0YW5jZSAoMikgYnV0IEluc3RhbmNlICgyKSBzaG91bGQgYmUKKyAgICAgICAgICAgICAqIGFjY2VwdGluZyBvdXRib3VuZCBjb25uZWN0aW9ucyBmcm9tIEluc3RhbmNlICgxKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBTZXJpYWxpemFibGVSdW5uYWJsZSBydW5uYWJsZSA9ICgpIC0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIG91dGJvdW5kIGNvbm5lY3Rpb25zIGFzIGF1dGhlbnRpY2F0aW9uIGZhaWxzIG9uIEluc3RhbmNlICgxKS4KKyAgICAgICAgICAgICAgICBPdXRib3VuZENvbm5lY3Rpb25zIG91dGJvdW5kID0gZ2V0T25seUVsZW1lbnQoTWVzc2FnaW5nU2VydmljZS5pbnN0YW5jZSgpLmNoYW5uZWxNYW5hZ2Vycy52YWx1ZXMoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSghb3V0Ym91bmQuc21hbGwuaXNDb25uZWN0ZWQoKSAmJiAhb3V0Ym91bmQubGFyZ2UuaXNDb25uZWN0ZWQoKSAmJiAhb3V0Ym91bmQudXJnZW50LmlzQ29ubmVjdGVkKCkpOworCisgICAgICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGZhaWx1cmUgaXMgZHVlIHRvIGF1dGhlbnRpY2F0aW9uIGZhaWx1cmUKKyAgICAgICAgICAgICAgICBmaW5hbCBSZWplY3RPdXRib3VuZEF1dGhlbnRpY2F0b3IgYXV0aGVudGljYXRvciA9IChSZWplY3RPdXRib3VuZEF1dGhlbnRpY2F0b3IpIERhdGFiYXNlRGVzY3JpcHRvci5nZXRJbnRlcm5vZGVBdXRoZW50aWNhdG9yKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhdXRoZW50aWNhdG9yLmF1dGhlbnRpY2F0aW9uRmFpbGVkKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIGF1dGhlbnRpY2F0aW9uIHRvIGZhaWwKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLmxvZ3MoKS53YXRjaEZvcigiQXV0aGVudGljYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5ydW5Pbkluc3RhbmNlKHJ1bm5hYmxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE91dGJvdW5kQ29ubmVjdGlvbnNBcmVJbnRlcnJ1cHRlZFdoZW5BdXRoRmFpbHMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIENsdXN0ZXIuQnVpbGRlciBidWlsZGVyID0gY3JlYXRlQ2x1c3RlcihBbGxvd0ZpcnN0QW5kUmVqZWN0T3RoZXJPdXRib3VuZEF1dGhlbnRpY2F0b3IuY2xhc3MpOworICAgICAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7CisKKyAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBidWlsZGVyLnN0YXJ0KCk7IENsb3NlYWJsZSBlcyA9IGV4ZWN1dG9yU2VydmljZTo6c2h1dGRvd24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4ZWN1dG9yU2VydmljZS5zdWJtaXQoKCkgLT4gb3BlbkNvbm5lY3Rpb25zKGNsdXN0ZXIpKTsKKworICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgYXV0aGVudGljYXRpb24gaXMgZmFpbGVkIGFuZCBJbnRlcnJ1cHQgaXMgY2FsbGVkIG9uIG91dGJvdW5kIGNvbm5lY3Rpb25zLgorICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkubG9ncygpLndhdGNoRm9yKCJBdXRoZW50aWNhdGlvbiBmYWlsZWQgdG8iKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLmxvZ3MoKS53YXRjaEZvcigiSW50ZXJydXB0ZWQgb3V0Ym91bmQgY29ubmVjdGlvbnMgdG8iKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENoZWNrIGlmIG91dGJvdW5kIGNvbm5lY3Rpb25zIGFyZSB6ZXJvCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFNlcmlhbGl6YWJsZVJ1bm5hYmxlIHJ1bm5hYmxlID0gKCkgLT4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBzdWNjZXNzZnVsIG91dGJvdW5kIGNvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICBmaW5hbCBBbGxvd0ZpcnN0QW5kUmVqZWN0T3RoZXJPdXRib3VuZEF1dGhlbnRpY2F0b3IgYXV0aGVudGljYXRvciA9IChBbGxvd0ZpcnN0QW5kUmVqZWN0T3RoZXJPdXRib3VuZEF1dGhlbnRpY2F0b3IpIERhdGFiYXNlRGVzY3JpcHRvci5nZXRJbnRlcm5vZGVBdXRoZW50aWNhdG9yKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGF1dGhlbnRpY2F0b3Iuc3VjY2Vzc2Z1bE91dGJvdW5kLmdldCgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGF1dGhlbnRpY2F0b3IuZmFpbGVkT3V0Ym91bmQuZ2V0KCkgPiAwKTsKKworICAgICAgICAgICAgICAgIC8vIFRoZXJlIHNob3VsZCBiZSBubyBvdXRib3VuZCBjb25uZWN0aW9ucyBhcyBhdXRoZW50aWNhdGlvbiBmYWlscy4KKyAgICAgICAgICAgICAgICBPdXRib3VuZENvbm5lY3Rpb25zIG91dGJvdW5kID0gZ2V0T25seUVsZW1lbnQoTWVzc2FnaW5nU2VydmljZS5pbnN0YW5jZSgpLmNoYW5uZWxNYW5hZ2Vycy52YWx1ZXMoKSk7CisgICAgICAgICAgICAgICAgQXdhaXRpbGl0eS5hd2FpdCgpLnVudGlsKCgpIC0+ICFvdXRib3VuZC5zbWFsbC5pc0Nvbm5lY3RlZCgpICYmICFvdXRib3VuZC5sYXJnZS5pc0Nvbm5lY3RlZCgpICYmICFvdXRib3VuZC51cmdlbnQuaXNDb25uZWN0ZWQoKSk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkucnVuT25JbnN0YW5jZShydW5uYWJsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aW9uc0FyZUFjY2VwdGVkV2hlbkF1dGhTdWNjZWRzKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB2ZXJpZnlBdXRoZW50aWNhdGlvblN1Y2NlZWRzKEFsbG93QWxsSW50ZXJub2RlQXV0aGVudGljYXRvci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0aGVudGljYXRpb25XaXRoQ2VydGlmaWNhdGVBdXRoZW50aWNhdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB2ZXJpZnlBdXRoZW50aWNhdGlvblN1Y2NlZWRzKENlcnRpZmljYXRlVmVyaWZ5QXV0aGVudGljYXRvci5jbGFzcyk7CisgICAgfQorCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbnNBcmVSZWplY3RlZFdpdGhJbnZhbGlkQ29uZmlnKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKQEAgLTQ5LDE2ICsxNzQsMTggQEAKICAgICAgICAgICAgICAgICBjLndpdGgoRmVhdHVyZS5ORVRXT1JLKTsKICAgICAgICAgICAgICAgICBjLndpdGgoRmVhdHVyZS5OQVRJVkVfUFJPVE9DT0wpOwogCisgICAgICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZW5jcnlwdGlvbiA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgICAgICBlbmNyeXB0aW9uLnB1dCgib3B0aW9uYWwiLCAiZmFsc2UiKTsKKyAgICAgICAgICAgICAgICBlbmNyeXB0aW9uLnB1dCgiaW50ZXJub2RlX2VuY3J5cHRpb24iLCAibm9uZSIpOwogICAgICAgICAgICAgICAgIGlmIChjLm51bSgpID09IDEpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBlbmNyeXB0aW9uID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uLnB1dCgia2V5c3RvcmUiLCAidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdC5rZXlzdG9yZSIpOwogICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uLnB1dCgia2V5c3RvcmVfcGFzc3dvcmQiLCAiY2Fzc2FuZHJhIik7CiAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb24ucHV0KCJ0cnVzdHN0b3JlIiwgInRlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3QudHJ1c3RzdG9yZSIpOwogICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uLnB1dCgidHJ1c3RzdG9yZV9wYXNzd29yZCIsICJjYXNzYW5kcmEiKTsKLSAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbi5wdXQoImludGVybm9kZV9lbmNyeXB0aW9uIiwgImRjIik7Ci0gICAgICAgICAgICAgICAgICAgIGMuc2V0KCJzZXJ2ZXJfZW5jcnlwdGlvbl9vcHRpb25zIiwgZW5jcnlwdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb24ucHV0KCJpbnRlcm5vZGVfZW5jcnlwdGlvbiIsICJhbGwiKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYy5zZXQoInNlcnZlcl9lbmNyeXB0aW9uX29wdGlvbnMiLCBlbmNyeXB0aW9uKTsKICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAud2l0aE5vZGVJZFRvcG9sb2d5KEltbXV0YWJsZU1hcC5vZigxLCBOZXR3b3JrVG9wb2xvZ3kuZGNBbmRSYWNrKCJkYzEiLCAicjFhIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCBOZXR3b3JrVG9wb2xvZ3kuZGNBbmRSYWNrKCJkYzIiLCAicjJhIikpKTsKQEAgLTE1Myw0ICsyODAsMTY0IEBACiAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKCJDUkVBVEUgS0VZU1BBQ0UgdGVzdF9jb25uZWN0aW9uc19mcm9tXzIgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXSVRIIHJlcGxpY2F0aW9uID0geydjbGFzcyc6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InOiAyfTsiLCBmYWxzZSwgY2x1c3Rlci5nZXQoMikpOwogICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlBdXRoZW50aWNhdGlvblN1Y2NlZWRzKGZpbmFsIENsYXNzIGF1dGhlbnRpY2F0b3JDbGFzcykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBDbHVzdGVyLkJ1aWxkZXIgYnVpbGRlciA9IGNyZWF0ZUNsdXN0ZXIoYXV0aGVudGljYXRvckNsYXNzKTsKKyAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBidWlsZGVyLnN0YXJ0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG9wZW5Db25uZWN0aW9ucyhjbHVzdGVyKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGluc3RhbmNlICgxKSBzaG91bGQgY29ubmVjdCB0byBpbnN0YW5jZSAoMikgd2l0aG91dCBhbnkgaXNzdWVzOworICAgICAgICAgICAgICogaW5zdGFuY2UgKDIpIHNob3VsZCBjb25uZWN0IHRvIGluc3RhbmNlICgxKSB3aXRob3V0IGFueSBpc3N1ZXMuCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgU2VyaWFsaXphYmxlUnVubmFibGUgcnVubmFibGUgPSAoKSAtPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlIHNob3VsZCBiZSBpbmJvdW5kIGNvbm5lY3Rpb25zIGFzIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRzLgorICAgICAgICAgICAgICAgIEluYm91bmRNZXNzYWdlSGFuZGxlcnMgaW5ib3VuZCA9IGdldE9ubHlFbGVtZW50KE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS5tZXNzYWdlSGFuZGxlcnMudmFsdWVzKCkpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoaW5ib3VuZC5jb3VudCgpID4gMCk7CisKKyAgICAgICAgICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgb3V0Ym91bmQgY29ubmVjdGlvbnMgYXMgYXV0aGVudGljYXRpb24gc3VjY2VlZHMuCisgICAgICAgICAgICAgICAgT3V0Ym91bmRDb25uZWN0aW9ucyBvdXRib3VuZCA9IGdldE9ubHlFbGVtZW50KE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS5jaGFubmVsTWFuYWdlcnMudmFsdWVzKCkpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUob3V0Ym91bmQuc21hbGwuaXNDb25uZWN0ZWQoKSB8fCBvdXRib3VuZC5sYXJnZS5pc0Nvbm5lY3RlZCgpIHx8IG91dGJvdW5kLnVyZ2VudC5pc0Nvbm5lY3RlZCgpKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLnJ1bk9uSW5zdGFuY2UocnVubmFibGUpOworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMikucnVuT25JbnN0YW5jZShydW5uYWJsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIENsdXN0ZXIuQnVpbGRlciBjcmVhdGVDbHVzdGVyKGZpbmFsIENsYXNzIGF1dGhlbnRpY2F0b3JDbGFzcykKKyAgICB7CisgICAgICAgIHJldHVybiBidWlsZGVyKCkKKyAgICAgICAgLndpdGhOb2RlcygyKQorICAgICAgICAud2l0aENvbmZpZyhjIC0+CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMud2l0aChGZWF0dXJlLk5FVFdPUkspOworICAgICAgICAgICAgICAgICAgICAgICAgYy53aXRoKEZlYXR1cmUuTkFUSVZFX1BST1RPQ09MKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZW5jcnlwdGlvbiA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb24ucHV0KCJrZXlzdG9yZSIsICJ0ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0LmtleXN0b3JlIik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uLnB1dCgia2V5c3RvcmVfcGFzc3dvcmQiLCAiY2Fzc2FuZHJhIik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uLnB1dCgidHJ1c3RzdG9yZSIsICJ0ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0LnRydXN0c3RvcmUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb24ucHV0KCJ0cnVzdHN0b3JlX3Bhc3N3b3JkIiwgImNhc3NhbmRyYSIpOworICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbi5wdXQoImludGVybm9kZV9lbmNyeXB0aW9uIiwgImFsbCIpOworICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbi5wdXQoInJlcXVpcmVfY2xpZW50X2F1dGgiLCAidHJ1ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYy5zZXQoInNlcnZlcl9lbmNyeXB0aW9uX29wdGlvbnMiLCBlbmNyeXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjLm51bSgpID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5zZXQoImludGVybm9kZV9hdXRoZW50aWNhdG9yIiwgYXV0aGVudGljYXRvckNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5zZXQoImludGVybm9kZV9hdXRoZW50aWNhdG9yIiwgQWxsb3dBbGxJbnRlcm5vZGVBdXRoZW50aWNhdG9yLmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgIC53aXRoTm9kZUlkVG9wb2xvZ3koSW1tdXRhYmxlTWFwLm9mKDEsIE5ldHdvcmtUb3BvbG9neS5kY0FuZFJhY2soImRjMSIsICJyMWEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgTmV0d29ya1RvcG9sb2d5LmRjQW5kUmFjaygiZGMyIiwgInIyYSIpKSk7CisgICAgfQorCisgICAgLy8gQXV0aGVudGljYXRvciB0aGF0IHZhbGlkYXRlcyBjZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2VydGlmaWNhdGVWZXJpZnlBdXRoZW50aWNhdG9yIGltcGxlbWVudHMgSUludGVybm9kZUF1dGhlbnRpY2F0b3IKKyAgICB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBhdXRoZW50aWNhdGUoSW5ldEFkZHJlc3MgcmVtb3RlQWRkcmVzcywgaW50IHJlbW90ZVBvcnQsIENlcnRpZmljYXRlW10gY2VydGlmaWNhdGVzLCBJbnRlcm5vZGVDb25uZWN0aW9uRGlyZWN0aW9uIGNvbm5lY3Rpb25UeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29ubmVjdGlvblR5cGUgPT0gSW50ZXJub2RlQ29ubmVjdGlvbkRpcmVjdGlvbi5PVVRCT1VORF9QUkVDT05ORUNUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByZXNlbnRlZCBjZXJ0aWZpY2F0ZXMgZHVyaW5nIGludGVybm9kZSBhdXRoZW50aWNhdGlvbiBhcmUgdGhlIG9uZXMgaW4gdGhlIGtleXN0b3JlcworICAgICAgICAgICAgICAgIC8vIGNvbmZpZ3VyZWQgaW4gdGhlIGNhc3NhbmRyYS55YW1sIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICAgICAgS2V5U3RvcmUga2V5U3RvcmUgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZSgiSktTIik7CisgICAgICAgICAgICAgICAgY2hhcltdIGtleVN0b3JlUGFzc3dvcmQgPSAiY2Fzc2FuZHJhIi50b0NoYXJBcnJheSgpOworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGtleVN0b3JlRGF0YSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oInRlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3Qua2V5c3RvcmUiKTsKKyAgICAgICAgICAgICAgICBrZXlTdG9yZS5sb2FkKGtleVN0b3JlRGF0YSwga2V5U3RvcmVQYXNzd29yZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNlcnRpZmljYXRlcyAhPSBudWxsICYmIGNlcnRpZmljYXRlcy5sZW5ndGggIT0gMCAmJiBrZXlTdG9yZS5nZXRDZXJ0aWZpY2F0ZSgiY2Fzc2FuZHJhX3NzbF90ZXN0IikuZXF1YWxzKGNlcnRpZmljYXRlc1swXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlQ29uZmlndXJhdGlvbigpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCisgICAgICAgIHsKKworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWplY3RDb25uZWN0aW9uc0F1dGhlbnRpY2F0b3IgaW1wbGVtZW50cyBJSW50ZXJub2RlQXV0aGVudGljYXRvcgorICAgIHsKKyAgICAgICAgYm9vbGVhbiBhdXRoZW50aWNhdGlvbkZhaWxlZCA9IGZhbHNlOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBhdXRoZW50aWNhdGUoSW5ldEFkZHJlc3MgcmVtb3RlQWRkcmVzcywgaW50IHJlbW90ZVBvcnQsIENlcnRpZmljYXRlW10gY2VydGlmaWNhdGVzLCBJbnRlcm5vZGVDb25uZWN0aW9uRGlyZWN0aW9uIGNvbm5lY3Rpb25UeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBhdXRoZW50aWNhdGlvbkZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVDb25maWd1cmF0aW9uKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KKyAgICAgICAgeworCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlamVjdEluYm91bmRDb25uZWN0aW9ucyBleHRlbmRzIFJlamVjdENvbm5lY3Rpb25zQXV0aGVudGljYXRvcgorICAgIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGF1dGhlbnRpY2F0ZShJbmV0QWRkcmVzcyByZW1vdGVBZGRyZXNzLCBpbnQgcmVtb3RlUG9ydCwgQ2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMsIEludGVybm9kZUNvbm5lY3Rpb25EaXJlY3Rpb24gY29ubmVjdGlvblR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjb25uZWN0aW9uVHlwZSA9PSBJbnRlcm5vZGVDb25uZWN0aW9uRGlyZWN0aW9uLklOQk9VTkQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmF1dGhlbnRpY2F0ZShyZW1vdGVBZGRyZXNzLCByZW1vdGVQb3J0LCBjZXJ0aWZpY2F0ZXMsIGNvbm5lY3Rpb25UeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWplY3RPdXRib3VuZEF1dGhlbnRpY2F0b3IgZXh0ZW5kcyBSZWplY3RDb25uZWN0aW9uc0F1dGhlbnRpY2F0b3IKKyAgICB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBhdXRoZW50aWNhdGUoSW5ldEFkZHJlc3MgcmVtb3RlQWRkcmVzcywgaW50IHJlbW90ZVBvcnQsIENlcnRpZmljYXRlW10gY2VydGlmaWNhdGVzLCBJbnRlcm5vZGVDb25uZWN0aW9uRGlyZWN0aW9uIGNvbm5lY3Rpb25UeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29ubmVjdGlvblR5cGUgPT0gSW50ZXJub2RlQ29ubmVjdGlvbkRpcmVjdGlvbi5PVVRCT1VORCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuYXV0aGVudGljYXRlKHJlbW90ZUFkZHJlc3MsIHJlbW90ZVBvcnQsIGNlcnRpZmljYXRlcywgY29ubmVjdGlvblR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFsbG93Rmlyc3RBbmRSZWplY3RPdGhlck91dGJvdW5kQXV0aGVudGljYXRvciBleHRlbmRzIFJlamVjdE91dGJvdW5kQXV0aGVudGljYXRvcgorICAgIHsKKyAgICAgICAgQXRvbWljSW50ZWdlciBzdWNjZXNzZnVsT3V0Ym91bmQgPSBuZXcgQXRvbWljSW50ZWdlcigpOworICAgICAgICBBdG9taWNJbnRlZ2VyIGZhaWxlZE91dGJvdW5kID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYXV0aGVudGljYXRlKEluZXRBZGRyZXNzIHJlbW90ZUFkZHJlc3MsIGludCByZW1vdGVQb3J0LCBDZXJ0aWZpY2F0ZVtdIGNlcnRpZmljYXRlcywgSW50ZXJub2RlQ29ubmVjdGlvbkRpcmVjdGlvbiBjb25uZWN0aW9uVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25UeXBlID09IEludGVybm9kZUNvbm5lY3Rpb25EaXJlY3Rpb24uT1VUQk9VTkQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3NmdWxPdXRib3VuZC5jb21wYXJlQW5kU2V0KDAsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZhaWxlZE91dGJvdW5kLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbkZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9KVk1EVGVzdFRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9KVk1EVGVzdFRlc3QuamF2YQppbmRleCAwODlkMTdiLi5mMTFhZDE2IDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvSlZNRFRlc3RUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0pWTURUZXN0VGVzdC5qYXZhCkBAIC05NSw2ICs5NSwxNiBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQganZtQXJndW1lbnRMb2dnaW5nVGVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBDbHVzdGVyLmJ1aWxkKDEpLnN0YXJ0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIExvZ0FjdGlvbiBsb2dzID0gY2x1c3Rlci5nZXQoMSkubG9ncygpOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGxvZ3MuZ3JlcCgiSlZNIEFyZ3VtZW50cyIpLmdldFJlc3VsdCgpKS5pc05vdEVtcHR5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIG5vblNoYXJlZENvbmZpZ0NsYXNzVGVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgTWFwPFN0cmluZyxPYmplY3Q+IGNvbW1pdExvZ0NvbXByZXNzaW9uID0gSW1tdXRhYmxlTWFwLm9mKCJjbGFzc19uYW1lIiwgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkxaNENvbXByZXNzb3IiLApkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0pWTVN0YWJpbGl0eUluc3BlY3RvclRocm93YWJsZVRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9KVk1TdGFiaWxpdHlJbnNwZWN0b3JUaHJvd2FibGVUZXN0LmphdmEKaW5kZXggNjY1ZDU4Yy4uYjYzMTc5YiAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0pWTVN0YWJpbGl0eUluc3BlY3RvclRocm93YWJsZVRlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvSlZNU3RhYmlsaXR5SW5zcGVjdG9yVGhyb3dhYmxlVGVzdC5qYXZhCkBAIC0zNCw3ICszNCw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd0luZGV4RW50cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2xpY2VzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CkBAIC00OCwxMCArNDcsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTRXJyb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNSZWFkRXJyb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db3JydXB0U1NUYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZWFkc0xpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LkZvcndhcmRpbmdTU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRzTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlRGF0YUlucHV0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2Fzc2FuZHJhRGFlbW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKQEAgLTIzMSwyMiArMjI5LDE0IEBACiAgICAgICAgICAgICB0aHJvdyB0aHJvd0ZTRXJyb3IoKTsKICAgICAgICAgfQogCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHJvd0l0ZXJhdG9yKEZpbGVEYXRhSW5wdXQgZmlsZSwgRGVjb3JhdGVkS2V5IGtleSwgUm93SW5kZXhFbnRyeSBpbmRleEVudHJ5LCBTbGljZXMgc2xpY2VzLCBDb2x1bW5GaWx0ZXIgc2VsZWN0ZWRDb2x1bW5zLCBib29sZWFuIHJldmVyc2VkKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc2hvdWxkVGhyb3dDb3JydXB0ZWQpCi0gICAgICAgICAgICAgICAgdGhyb3cgdGhyb3dDb3JydXB0ZWQoKTsKLSAgICAgICAgICAgIHRocm93IHRocm93RlNFcnJvcigpOwotICAgICAgICB9Ci0KICAgICAgICAgcHJpdmF0ZSBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiB0aHJvd0NvcnJ1cHRlZCgpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihuZXcgSU9FeGNlcHRpb24oImZhaWxlZCB0byBnZXQgcG9zaXRpb24iKSwgZGVzY3JpcHRvci5iYXNlRmlsZW5hbWUoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24obmV3IElPRXhjZXB0aW9uKCJmYWlsZWQgdG8gZ2V0IHBvc2l0aW9uIiksIGRlc2NyaXB0b3IuYmFzZUZpbGUoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIEZTRXJyb3IgdGhyb3dGU0Vycm9yKCkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZTUmVhZEVycm9yKG5ldyBJT0V4Y2VwdGlvbigiZmFpbGVkIHRvIGdldCBwb3NpdGlvbiIpLCBkZXNjcmlwdG9yLmJhc2VGaWxlbmFtZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBGU1JlYWRFcnJvcihuZXcgSU9FeGNlcHRpb24oImZhaWxlZCB0byBnZXQgcG9zaXRpb24iKSwgZGVzY3JpcHRvci5iYXNlRmlsZSgpKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9NZXNzYWdlRm9yd2FyZGluZ1Rlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9NZXNzYWdlRm9yd2FyZGluZ1Rlc3QuamF2YQppbmRleCBhNGRkOGU2Li43MDA2Nzk1IDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvTWVzc2FnZUZvcndhcmRpbmdUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L01lc3NhZ2VGb3J3YXJkaW5nVGVzdC5qYXZhCkBAIC0zOSw4ICszOSwxMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLkNsdXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuaW1wbC5Jc29sYXRlZEV4ZWN1dG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmltcGwuVHJhY2luZ1V0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuV0FJVF9GT1JfVFJBQ0lOR19FVkVOVFNfVElNRU9VVF9TRUNTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEOwogCiBwdWJsaWMgY2xhc3MgTWVzc2FnZUZvcndhcmRpbmdUZXN0IGV4dGVuZHMgVGVzdEJhc2VJbXBsCkBAIC00OCwxNSArNTAsMTYgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIG11dGF0aW9uc0ZvcndhcmRlZFRvQWxsUmVwbGljYXNUZXN0KCkKICAgICB7Ci0gICAgICAgIFN0cmluZyBvcmlnaW5hbFRyYWNlVGltZW91dCA9IFRyYWNpbmdVdGlsLnNldFdhaXRGb3JUcmFjaW5nRXZlbnRUaW1lb3V0U2VjcygiMSIpOwogICAgICAgICBmaW5hbCBpbnQgbnVtSW5zZXJ0cyA9IDEwMDsKICAgICAgICAgTWFwPEluZXRBZGRyZXNzLCBJbnRlZ2VyPiBmb3J3YXJkRnJvbUNvdW50cyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgTWFwPEluZXRBZGRyZXNzLCBJbnRlZ2VyPiBjb21taXRDb3VudHMgPSBuZXcgSGFzaE1hcDw+KCk7CiAKLSAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSAoQ2x1c3RlcikgaW5pdChidWlsZGVyKCkKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KFdBSVRfRk9SX1RSQUNJTkdfRVZFTlRTX1RJTUVPVVRfU0VDUywgMSk7CisgICAgICAgICAgICAgQ2x1c3RlciBjbHVzdGVyID0gKENsdXN0ZXIpIGluaXQoYnVpbGRlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhEQygiZGMwIiwgMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aERDKCJkYzEiLCAzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydCgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnQoKSk7CisgICAgICAgICAgICAgKQogICAgICAgICB7CiAgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiQ1JFQVRFIFRBQkxFICIgKyBLRVlTUEFDRSArICIudGJsIChwayBpbnQsIGNrIGludCwgdiB0ZXh0LCBQUklNQVJZIEtFWSAocGssIGNrKSkiKTsKIApAQCAtMTE1LDkgKzExOCw1IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIEFzc2VydC5mYWlsKCJUaHJldyBleGNlcHRpb246ICIgKyBlKTsKICAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFRyYWNpbmdVdGlsLnNldFdhaXRGb3JUcmFjaW5nRXZlbnRUaW1lb3V0U2VjcyhvcmlnaW5hbFRyYWNlVGltZW91dCk7Ci0gICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvTWlncmF0aW9uQ29vcmRpbmF0b3JUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvTWlncmF0aW9uQ29vcmRpbmF0b3JUZXN0LmphdmEKaW5kZXggY2E4OWI0My4uZTc1NzgzZCAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L01pZ3JhdGlvbkNvb3JkaW5hdG9yVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9NaWdyYXRpb25Db29yZGluYXRvclRlc3QuamF2YQpAQCAtMzAsOCArMzAsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuTmV0d29ya1RvcG9sb2d5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DT05TSVNURU5UX1JBTkdFX01PVkVNRU5UOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLklHTk9SRURfU0NIRU1BX0NIRUNLX0VORFBPSU5UUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5JR05PUkVEX1NDSEVNQV9DSEVDS19WRVJTSU9OUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5SRVBMQUNFX0FERFJFU1M7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLkdPU1NJUDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmUuTkVUV09SSzsKIApAQCAtNDEsMTEgKzQzLDkgQEAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKQogICAgIHsKLSAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoImNhc3NhbmRyYS5yZXBsYWNlX2FkZHJlc3MiKTsKLSAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoImNhc3NhbmRyYS5jb25zaXN0ZW50LnJhbmdlbW92ZW1lbnQiKTsKLQotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eShJR05PUkVEX1NDSEVNQV9DSEVDS19WRVJTSU9OUy5nZXRLZXkoKSk7Ci0gICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KElHTk9SRURfU0NIRU1BX0NIRUNLX1ZFUlNJT05TLmdldEtleSgpKTsKKyAgICAgICAgUkVQTEFDRV9BRERSRVNTLmNsZWFyVmFsdWUoKTsgLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgbmVhcmJ5ICdjbGVhclZhbHVlU3lzdGVtUHJvcGVydHlVc2FnZScKKyAgICAgICAgQ09OU0lTVEVOVF9SQU5HRV9NT1ZFTUVOVC5jbGVhclZhbHVlKCk7IC8vIGNoZWNrc3R5bGU6IHN1cHByZXNzIG5lYXJieSAnY2xlYXJWYWx1ZVN5c3RlbVByb3BlcnR5VXNhZ2UnCisgICAgICAgIElHTk9SRURfU0NIRU1BX0NIRUNLX1ZFUlNJT05TLmNsZWFyVmFsdWUoKTsgLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgbmVhcmJ5ICdjbGVhclZhbHVlU3lzdGVtUHJvcGVydHlVc2FnZScKICAgICB9CiAgICAgLyoqCiAgICAgICogV2Ugc2hvdWxkbid0IHdhaXQgb24gdmVyc2lvbnMgb25seSBhdmFpbGFibGUgZnJvbSBhIG5vZGUgYmVpbmcgcmVwbGFjZWQKQEAgLTY3LDcgKzY3LDcgQEAKIAogICAgICAgICAgICAgSUluc3RhbmNlQ29uZmlnIGNvbmZpZyA9IGNsdXN0ZXIubmV3SW5zdGFuY2VDb25maWcoKTsKICAgICAgICAgICAgIGNvbmZpZy5zZXQoImF1dG9fYm9vdHN0cmFwIiwgdHJ1ZSk7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5yZXBsYWNlX2FkZHJlc3MiLCByZXBsYWNlbWVudEFkZHJlc3MuZ2V0SG9zdEFkZHJlc3MoKSk7CisgICAgICAgICAgICBSRVBMQUNFX0FERFJFU1Muc2V0U3RyaW5nKHJlcGxhY2VtZW50QWRkcmVzcy5nZXRIb3N0QWRkcmVzcygpKTsKICAgICAgICAgICAgIGNsdXN0ZXIuYm9vdHN0cmFwKGNvbmZpZykuc3RhcnR1cCgpOwogICAgICAgICB9CiAgICAgfQpAQCAtODksNyArODksNyBAQAogICAgICAgICAgICAgSUluc3RhbmNlQ29uZmlnIGNvbmZpZyA9IGNsdXN0ZXIubmV3SW5zdGFuY2VDb25maWcoKTsKICAgICAgICAgICAgIGNvbmZpZy5zZXQoImF1dG9fYm9vdHN0cmFwIiwgdHJ1ZSk7CiAgICAgICAgICAgICBJR05PUkVEX1NDSEVNQV9DSEVDS19FTkRQT0lOVFMuc2V0U3RyaW5nKGlnbm9yZWRFbmRwb2ludC5nZXRIb3N0QWRkcmVzcygpKTsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmNvbnNpc3RlbnQucmFuZ2Vtb3ZlbWVudCIsICJmYWxzZSIpOworICAgICAgICAgICAgQ09OU0lTVEVOVF9SQU5HRV9NT1ZFTUVOVC5zZXRCb29sZWFuKGZhbHNlKTsKICAgICAgICAgICAgIGNsdXN0ZXIuYm9vdHN0cmFwKGNvbmZpZykuc3RhcnR1cCgpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTE2LDcgKzExNiw3IEBACiAgICAgICAgICAgICBJSW5zdGFuY2VDb25maWcgY29uZmlnID0gY2x1c3Rlci5uZXdJbnN0YW5jZUNvbmZpZygpOwogICAgICAgICAgICAgY29uZmlnLnNldCgiYXV0b19ib290c3RyYXAiLCB0cnVlKTsKICAgICAgICAgICAgIElHTk9SRURfU0NIRU1BX0NIRUNLX1ZFUlNJT05TLnNldFN0cmluZyhpbml0aWFsVmVyc2lvbi50b1N0cmluZygpICsgJywnICsgb2xkVmVyc2lvbik7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5jb25zaXN0ZW50LnJhbmdlbW92ZW1lbnQiLCAiZmFsc2UiKTsKKyAgICAgICAgICAgIENPTlNJU1RFTlRfUkFOR0VfTU9WRU1FTlQuc2V0Qm9vbGVhbihmYWxzZSk7CiAgICAgICAgICAgICBjbHVzdGVyLmJvb3RzdHJhcChjb25maWcpLnN0YXJ0dXAoKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9Nb3ZlVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L01vdmVUZXN0LmphdmEKaW5kZXggZmMxYmNhMy4uY2RiZTFjZCAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L01vdmVUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L01vdmVUZXN0LmphdmEKQEAgLTMxLDYgKzMxLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuTm9kZVRvb2xSZXN1bHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJJTkdfREVMQVk7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLkdPU1NJUDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmUuTkVUV09SSzsKIApAQCAtNDIsNyArNDMsNyBAQAogCiAgICAgc3RhdGljCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5yaW5nX2RlbGF5X21zIiwgIjUwMDAiKTsgLy8gZG93biBmcm9tIDMwcyBkZWZhdWx0CisgICAgICAgIFJJTkdfREVMQVkuc2V0TG9uZyg1MDAwKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgbW92ZShib29sZWFuIGZvcndhcmRzKSB0aHJvd3MgVGhyb3dhYmxlCmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvTXVsdGlwbGVEYXRhRGlyZWN0b3J5VGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L011bHRpcGxlRGF0YURpcmVjdG9yeVRlc3QuamF2YQppbmRleCAwODI2OTU0Li4zMDQxMzZiIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvTXVsdGlwbGVEYXRhRGlyZWN0b3J5VGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9NdWx0aXBsZURhdGFEaXJlY3RvcnlUZXN0LmphdmEKQEAgLTM3LDYgKzM3LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5UT0NDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogCiBwdWJsaWMgY2xhc3MgTXVsdGlwbGVEYXRhRGlyZWN0b3J5VGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbApAQCAtMTUxLDE0ICsxNTIsMTQgQEAKICAgICAgICAgICAgIC8vIGdldHRpbmcgYSBuZXcgZmlsZSBpbmRleCBpbiBvcmRlciB0byBtb3ZlIFNTVGFibGUgYmV0d2VlbiBkaXJlY3Rvcmllcy4KICAgICAgICAgICAgIHNlY29uZCA9IGNmcy5uZXdTU1RhYmxlRGVzY3JpcHRvcihzZWNvbmQuZGlyZWN0b3J5KTsKICAgICAgICAgICAgIC8vIG5vdyB3ZSBqdXN0IG1vdmUgYWxsIHNzdGFibGVzIGZyb20gZmlyc3QgdG8gc2Vjb25kCi0gICAgICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBTU1RhYmxlUmVhZGVyLmNvbXBvbmVudHNGb3IoZmlyc3QpKQorICAgICAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogVE9DQ29tcG9uZW50LmxvYWRPckNyZWF0ZShmaXJzdCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlyc3QuZmlsZW5hbWVGb3IoY29tcG9uZW50KSk7CisgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gZmlyc3QuZmlsZUZvcihjb21wb25lbnQpOwogICAgICAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVzLmNvcHkoZmlsZS50b1BhdGgoKSwgbmV3IEZpbGUoc2Vjb25kLmZpbGVuYW1lRm9yKGNvbXBvbmVudCkpLnRvUGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVzLmNvcHkoZmlsZS50b1BhdGgoKSwgc2Vjb25kLmZpbGVGb3IoY29tcG9uZW50KS50b1BhdGgoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCiAgICAgICAgICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9OYXRpdmVNaXhlZFZlcnNpb25UZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvTmF0aXZlTWl4ZWRWZXJzaW9uVGVzdC5qYXZhCmluZGV4IDI2ZDAxODYuLjI5NjA1ZjAgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9OYXRpdmVNaXhlZFZlcnNpb25UZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L05hdGl2ZU1peGVkVmVyc2lvblRlc3QuamF2YQpAQCAtMzAsOCArMzAsMTEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSW52b2thYmxlSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5JT19ORVRUWV9FVkVOVExPT1BfVEhSRUFEUzsKKwogcHVibGljIGNsYXNzIE5hdGl2ZU1peGVkVmVyc2lvblRlc3QgZXh0ZW5kcyBUZXN0QmFzZUltcGwKIHsKICAgICBAVGVzdApAQCAtMzksMTUgKzQyLDE3IEBACiAgICAgewogICAgICAgICAvLyBtYWtlIHN1cmUgdG8gbGltaXQgdGhlIG5ldHR5IHRocmVhZCBwb29sIHRvIHNpemUgMSwgdGhpcyB3aWxsIG1ha2UgdGhlIHRlc3QgZGV0ZXJtYW5pc3RpYyBhcyBhbGwgd29yawogICAgICAgICAvLyB3aWxsIGhhcHBlbiBvbiB0aGUgc2luZ2xlIHRocmVhZC4KLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJpby5uZXR0eS5ldmVudExvb3BUaHJlYWRzIiwgIjEiKTsKLSAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBDbHVzdGVyLmJ1aWxkKDEpCisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChJT19ORVRUWV9FVkVOVExPT1BfVEhSRUFEUywgMSk7CisgICAgICAgICAgICAgQ2x1c3RlciBjbHVzdGVyID0gQ2x1c3Rlci5idWlsZCgxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjIC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMud2l0aChGZWF0dXJlLnZhbHVlcygpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgicmVhZF90aHJlc2hvbGRzX2VuYWJsZWQiLCB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgibG9jYWxfcmVhZF9zaXplX3dhcm5fdGhyZXNob2xkIiwgIjFLaUIiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnQoKTsKKyAgICAgICAgICAgICApCiAgICAgICAgIHsKKwogICAgICAgICAgICAgaW5pdChjbHVzdGVyKTsKICAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnRibCAocGsgaW50LCBjazEgaW50LCB2YWx1ZSBibG9iLCBQUklNQVJZIEtFWSAocGssIGNrMSkpIikpOwogICAgICAgICAgICAgSUludm9rYWJsZUluc3RhbmNlIG5vZGUgPSBjbHVzdGVyLmdldCgxKTsKQEAgLTc4LDkgKzgzLDUgQEAKICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZXN1bHQgPSBub2RlLmxvZ3MoKS5ncmVwKCJXYXJuaW5ncyBwcmVzZW50IGluIG1lc3NhZ2Ugd2l0aCB2ZXJzaW9uIGxlc3MgdGhhbiIpLmdldFJlc3VsdCgpOwogICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHJlc3VsdCkuaXNFbXB0eSgpOwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoImlvLm5ldHR5LmV2ZW50TG9vcFRocmVhZHMiKTsKLSAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9OYXRpdmVQcm90b2NvbFRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9OYXRpdmVQcm90b2NvbFRlc3QuamF2YQppbmRleCBmOTY1NTcyLi4xMWJhOTk0IDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvTmF0aXZlUHJvdG9jb2xUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L05hdGl2ZVByb3RvY29sVGVzdC5qYXZhCkBAIC0zNCw2ICszNCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklDbHVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmltcGwuUm93VXRpbDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkpPSU5fUklORzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYWN0aW9uLkdvc3NpcEhlbHBlci53aXRoUHJvcGVydHk7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLkdPU1NJUDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmUuTkFUSVZFX1BST1RPQ09MOwpAQCAtMTAzLDcgKzEwNCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIElJbnN0YW5jZUNvbmZpZyBjb25maWcgPSBjbHVzdGVyLm5ld0luc3RhbmNlQ29uZmlnKCk7CiAgICAgICAgICAgICBJSW52b2thYmxlSW5zdGFuY2UgZ29zc2lwcGluZ09ubHlNZW1iZXIgPSBjbHVzdGVyLmJvb3RzdHJhcChjb25maWcpOwotICAgICAgICAgICAgd2l0aFByb3BlcnR5KCJjYXNzYW5kcmEuam9pbl9yaW5nIiwgQm9vbGVhbi50b1N0cmluZyhmYWxzZSksICgpIC0+IGdvc3NpcHBpbmdPbmx5TWVtYmVyLnN0YXJ0dXAoY2x1c3RlcikpOworICAgICAgICAgICAgd2l0aFByb3BlcnR5KEpPSU5fUklORywgZmFsc2UsICgpIC0+IGdvc3NpcHBpbmdPbmx5TWVtYmVyLnN0YXJ0dXAoY2x1c3RlcikpOwogCiAgICAgICAgICAgICBhc3NlcnRUcnVlKGdvc3NpcHBpbmdPbmx5TWVtYmVyLmNhbGxPbkluc3RhbmNlKChJSXNvbGF0ZWRFeGVjdXRvci5TZXJpYWxpemFibGVDYWxsYWJsZTxCb29sZWFuPikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuaXNOYXRpdmVUcmFuc3BvcnRSdW5uaW5nKCkpKTsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9OYXRpdmVUcmFuc3BvcnRFbmNyeXB0aW9uT3B0aW9uc1Rlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9OYXRpdmVUcmFuc3BvcnRFbmNyeXB0aW9uT3B0aW9uc1Rlc3QuamF2YQppbmRleCBjNWE4MTBjLi41ZjJjYWFmIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvTmF0aXZlVHJhbnNwb3J0RW5jcnlwdGlvbk9wdGlvbnNUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L05hdGl2ZVRyYW5zcG9ydEVuY3J5cHRpb25PcHRpb25zVGVzdC5qYXZhCkBAIC0xOCwxOCArMTgsMzMgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0OwogCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIAoraW1wb3J0IGphdmF4Lm5ldC5zc2wuS2V5TWFuYWdlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXJGYWN0b3J5OworCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuU1NMT3B0aW9uczsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuZXhjZXB0aW9ucy5Ob0hvc3RBdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgY29tLmRhdGFzdGF4LnNoYWRlZC5uZXR0eS5oYW5kbGVyLnNzbC5Tc2xDb250ZXh0OworaW1wb3J0IGNvbS5kYXRhc3RheC5zaGFkZWQubmV0dHkuaGFuZGxlci5zc2wuU3NsQ29udGV4dEJ1aWxkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZTsKIAogcHVibGljIGNsYXNzIE5hdGl2ZVRyYW5zcG9ydEVuY3J5cHRpb25PcHRpb25zVGVzdCBleHRlbmRzIEFic3RyYWN0RW5jcnlwdGlvbk9wdGlvbnNJbXBsCiB7CisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gZXhwZWN0ZWRFeGNlcHRpb24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIG5vZGVXaWxsTm90U3RhcnRXaXRoQmFkS2V5c3RvcmUoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewpAQCAtMjE5LDQgKzIzNCw5MCBAQAogICAgICAgICAgICAgYXNzZXJ0Q2Fubm90U3RhcnREdWVUb0NvbmZpZ3VyYXRpb25FeGNlcHRpb24oY2x1c3Rlcik7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRwb2ludFZlcmlmaWNhdGlvbkRpc2FibGVkSXBOb3RJblNBTigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIC8vIFdoZW4gcmVxdWlyZWRfZW5kcG9pbnRfdmVyaWZpY2F0aW9uIGlzIHNldCB0byBmYWxzZSwgY2xpZW50IGNlcnRpZmljYXRlIElwL2hvc3RuYW1lIHNob3VsZCBiZSB2YWxpZGF0ZWQKKyAgICAgICAgLy8gVGhlIGNlcnRpZmljYXRlIGluIGNhc3NhbmRyYV9zc2xfdGVzdF9vdXRib3VuZC5rZXlzdG9yZSBkb2VzIG5vdCBoYXZlIElQL2hvc3RuYW1lIGVtYmVkZWQsIHNvIHdoZW4KKyAgICAgICAgLy8gcmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24gaXMgZmFsc2UsIHRoZSBjb25uZWN0aW9uIHNob3VsZCBiZSBlc3RhYmxpc2hlZAorICAgICAgIHRlc3RFbmRwb2ludFZlcmlmaWNhdGlvbihmYWxzZSwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kcG9pbnRWZXJpZmljYXRpb25FbmFibGVkSXBOb3RJblNBTigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIC8vIFdoZW4gcmVxdWlyZWRfZW5kcG9pbnRfdmVyaWZpY2F0aW9uIGlzIHNldCB0byB0cnVlLCBjbGllbnQgY2VydGlmaWNhdGUgSXAvaG9zdG5hbWUgc2hvdWxkIGJlIHZhbGlkYXRlZAorICAgICAgICAvLyBUaGUgY2VydGlmaWNhdGUgaW4gY2Fzc2FuZHJhX3NzbF90ZXN0X291dGJvdW5kLmtleXN0b3JlIGRvZXMgbm90IGhhdmUgSVAvaG9zdG5hbWUgZW1lYmVkZWQsIHNvIHdoZW4KKyAgICAgICAgLy8gcmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24gaXMgdHJ1ZSwgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZAorICAgICAgICB0ZXN0RW5kcG9pbnRWZXJpZmljYXRpb24odHJ1ZSwgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuZHBvaW50VmVyaWZpY2F0aW9uRW5hYmxlZFdpdGhJUEluU2FuKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgLy8gV2hlbiByZXF1aXJlZF9lbmRwb2ludF92ZXJpZmljYXRpb24gaXMgc2V0IHRvIHRydWUsIGNsaWVudCBjZXJ0aWZpY2F0ZSBJcC9ob3N0bmFtZSBzaG91bGQgYmUgdmFsaWRhdGVkCisgICAgICAgIC8vIFRoZSBjZXJ0aWZpY2F0ZSBpbiBjYXNzYW5kcmFfc3NsX3Rlc3Rfb3V0Ym91bmQua2V5c3RvcmUgaGF2ZSBJUC9ob3N0bmFtZSBlbWViZWRlZCwgc28gd2hlbgorICAgICAgICAvLyByZXF1aXJlX2VuZHBvaW50X3ZlcmlmaWNhdGlvbiBpcyB0cnVlLCB0aGUgY29ubmVjdGlvbiBzaG91bGQgYmUgZXN0YWJsaXNoZWQKKyAgICAgICAgdGVzdEVuZHBvaW50VmVyaWZpY2F0aW9uKHRydWUsIHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0RW5kcG9pbnRWZXJpZmljYXRpb24oYm9vbGVhbiByZXF1aXJlRW5kcG9pbnRWZXJpZmljYXRpb24sIGJvb2xlYW4gaXBJblNBTikgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBidWlsZGVyKCkud2l0aE5vZGVzKDEpLndpdGhDb25maWcoYyAtPiB7CisgICAgICAgICAgICBjLndpdGgoRmVhdHVyZS5OQVRJVkVfUFJPVE9DT0wpOworICAgICAgICAgICAgYy5zZXQoImNsaWVudF9lbmNyeXB0aW9uX29wdGlvbnMiLAorICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlTWFwLmJ1aWxkZXIoKS5wdXRBbGwodmFsaWRLZXlzdG9yZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoImVuYWJsZWQiLCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dCgicmVxdWlyZV9jbGllbnRfYXV0aCIsIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHV0KCJyZXF1aXJlX2VuZHBvaW50X3ZlcmlmaWNhdGlvbiIsIHJlcXVpcmVFbmRwb2ludFZlcmlmaWNhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgfSkuc3RhcnQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgSW5ldEFkZHJlc3MgYWRkcmVzcyA9IGNsdXN0ZXIuZ2V0KDEpLmNvbmZpZygpLmJyb2FkY2FzdEFkZHJlc3MoKS5nZXRBZGRyZXNzKCk7CisgICAgICAgICAgICBTc2xDb250ZXh0QnVpbGRlciBzc2xDb250ZXh0QnVpbGRlciA9IFNzbENvbnRleHRCdWlsZGVyLmZvckNsaWVudCgpOworICAgICAgICAgICAgaWYgKGlwSW5TQU4pCisgICAgICAgICAgICAgICAgc3NsQ29udGV4dEJ1aWxkZXIua2V5TWFuYWdlcihjcmVhdGVLZXlNYW5hZ2VyRmFjdG9yeSgidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdF9lbmRwb2ludF92ZXJpZnkua2V5c3RvcmUiLCAiY2Fzc2FuZHJhIikpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNzbENvbnRleHRCdWlsZGVyLmtleU1hbmFnZXIoY3JlYXRlS2V5TWFuYWdlckZhY3RvcnkoInRlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3Rfb3V0Ym91bmQua2V5c3RvcmUiLCAiY2Fzc2FuZHJhIikpOworCisgICAgICAgICAgICBTc2xDb250ZXh0IHNzbENvbnRleHQgPSBzc2xDb250ZXh0QnVpbGRlci50cnVzdE1hbmFnZXIoY3JlYXRlVHJ1c3RNYW5hZ2VyRmFjdG9yeSgidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdC50cnVzdHN0b3JlIiwgImNhc3NhbmRyYSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgIGZpbmFsIFNTTE9wdGlvbnMgc3NsT3B0aW9ucyA9IHNvY2tldENoYW5uZWwgLT4gc3NsQ29udGV4dC5uZXdIYW5kbGVyKHNvY2tldENoYW5uZWwuYWxsb2MoKSk7CisgICAgICAgICAgICBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQ2x1c3RlciBkcml2ZXJDbHVzdGVyID0gY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkNsdXN0ZXIuYnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29udGFjdFBvaW50KGFkZHJlc3MuZ2V0SG9zdEFkZHJlc3MoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU1NMKHNzbE9wdGlvbnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICAgICAgaWYgKCFpcEluU0FOKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGV4cGVjdGVkRXhjZXB0aW9uLmV4cGVjdChOb0hvc3RBdmFpbGFibGVFeGNlcHRpb24uY2xhc3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkcml2ZXJDbHVzdGVyLmNvbm5lY3QoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgS2V5TWFuYWdlckZhY3RvcnkgY3JlYXRlS2V5TWFuYWdlckZhY3RvcnkoZmluYWwgU3RyaW5nIGtleVN0b3JlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGtleVN0b3JlUGFzc3dvcmQpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oa2V5U3RvcmVQYXRoKTsKKyAgICAgICAgZmluYWwgS2V5U3RvcmUga3MgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZSgiSktTIik7CisgICAgICAgIGtzLmxvYWQoc3RyZWFtLCBrZXlTdG9yZVBhc3N3b3JkLnRvQ2hhckFycmF5KCkpOworICAgICAgICBmaW5hbCBLZXlNYW5hZ2VyRmFjdG9yeSBrbWYgPSBLZXlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZShLZXlNYW5hZ2VyRmFjdG9yeS5nZXREZWZhdWx0QWxnb3JpdGhtKCkpOworICAgICAgICBrbWYuaW5pdChrcywga2V5U3RvcmVQYXNzd29yZC50b0NoYXJBcnJheSgpKTsKKyAgICAgICAgcmV0dXJuIGttZjsKKyAgICB9CisKKyAgICBwcml2YXRlIFRydXN0TWFuYWdlckZhY3RvcnkgY3JlYXRlVHJ1c3RNYW5hZ2VyRmFjdG9yeShmaW5hbCBTdHJpbmcgdHJ1c3RTdG9yZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRydXN0U3RvcmVQYXNzd29yZCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0cnVzdFN0b3JlUGF0aCk7CisgICAgICAgIGZpbmFsIEtleVN0b3JlIHRzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoIkpLUyIpOworICAgICAgICB0cy5sb2FkKHN0cmVhbSwgdHJ1c3RTdG9yZVBhc3N3b3JkLnRvQ2hhckFycmF5KCkpOworICAgICAgICBmaW5hbCBUcnVzdE1hbmFnZXJGYWN0b3J5IHRtZiA9IFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoVHJ1c3RNYW5hZ2VyRmFjdG9yeS5nZXREZWZhdWx0QWxnb3JpdGhtKCkpOworICAgICAgICB0bWYuaW5pdCh0cyk7CisgICAgICAgIHJldHVybiB0bWY7CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvTm9kZVRvb2xUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvTm9kZVRvb2xUZXN0LmphdmEKaW5kZXggOTA4N2Y5Ni4uMjRhNjVlMyAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L05vZGVUb29sVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9Ob2RlVG9vbFRlc3QuamF2YQpAQCAtMTE2LDQgKzExNiwzNSBAQAogICAgICAgICAgICAgcmluZ1Jlc3VsdC5hc3NlcnRzKCkuc3RkZXJyQ29udGFpbnMoImlzIG5vdCBwZXJtaXR0ZWQgYXMgdGhpcyBjYWNoZSBpcyBkaXNhYmxlZCIpOwogICAgICAgICB9CiAgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5mb091dHB1dCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRyeSAoSUNsdXN0ZXI8Pz4gY2x1c3RlciA9IGluaXQoYnVpbGRlcigpLndpdGhOb2RlcygxKS5zdGFydCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgTm9kZVRvb2xSZXN1bHQgcmluZ1Jlc3VsdCA9IGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sUmVzdWx0KCJpbmZvIik7CisgICAgICAgICAgICByaW5nUmVzdWx0LmFzc2VydHMoKS5zdGRvdXRDb250YWlucygiSUQiKTsKKyAgICAgICAgICAgIHJpbmdSZXN1bHQuYXNzZXJ0cygpLnN0ZG91dENvbnRhaW5zKCJHb3NzaXAgYWN0aXZlIik7CisgICAgICAgICAgICByaW5nUmVzdWx0LmFzc2VydHMoKS5zdGRvdXRDb250YWlucygiTmF0aXZlIFRyYW5zcG9ydCBhY3RpdmUiKTsKKyAgICAgICAgICAgIHJpbmdSZXN1bHQuYXNzZXJ0cygpLnN0ZG91dENvbnRhaW5zKCJMb2FkIik7CisgICAgICAgICAgICByaW5nUmVzdWx0LmFzc2VydHMoKS5zdGRvdXRDb250YWlucygiVW5jb21wcmVzc2VkIGxvYWQiKTsKKyAgICAgICAgICAgIHJpbmdSZXN1bHQuYXNzZXJ0cygpLnN0ZG91dENvbnRhaW5zKCJHZW5lcmF0aW9uIik7CisgICAgICAgICAgICByaW5nUmVzdWx0LmFzc2VydHMoKS5zdGRvdXRDb250YWlucygiVXB0aW1lIik7CisgICAgICAgICAgICByaW5nUmVzdWx0LmFzc2VydHMoKS5zdGRvdXRDb250YWlucygiSGVhcCBNZW1vcnkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZlcnNpb25JbmNsdWRlc0dpdFNIQVdoZW5WZXJib3NlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgTk9ERS5ub2RldG9vbFJlc3VsdCgidmVyc2lvbiIpCisgICAgICAgICAgICAuYXNzZXJ0cygpCisgICAgICAgICAgICAuc3VjY2VzcygpCisgICAgICAgICAgICAuc3Rkb3V0Tm90Q29udGFpbnMoIkdpdFNIQToiKTsKKworICAgICAgICBOT0RFLm5vZGV0b29sUmVzdWx0KCJ2ZXJzaW9uIiwgIi0tdmVyYm9zZSIpCisgICAgICAgICAgICAuYXNzZXJ0cygpCisgICAgICAgICAgICAuc3VjY2VzcygpCisgICAgICAgICAgICAuc3Rkb3V0Q29udGFpbnMoIkdpdFNIQToiKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvT3ZlcnNpemVkTXV0YXRpb25UZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvT3ZlcnNpemVkTXV0YXRpb25UZXN0LmphdmEKaW5kZXggMmIwZDBhMC4uZmNkNjAwYyAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L092ZXJzaXplZE11dGF0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9PdmVyc2l6ZWRNdXRhdGlvblRlc3QuamF2YQpAQCAtMzYsNyArMzYsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkNSRUFURSBUQUJMRSAlcy50IChrZXkgaW50IFBSSU1BUlkgS0VZLCB2YWwgYmxvYikiKSk7CiAgICAgICAgICAgICBTdHJpbmcgcGF5bG9hZCA9IFN0cmluZ1V0aWxzLnJlcGVhdCgnMScsIDEwMjQgKiA0OSk7Ci0gICAgICAgICAgICBTdHJpbmcgcXVlcnkgPSAiSU5TRVJUIElOVE8gJXMudCAoa2V5LCB2YWwpIFZBTFVFUyAoMSwgdGV4dEFzQmxvYignIiArIHBheWxvYWQgKyAiJykpIjsKKyAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9ICJJTlNFUlQgSU5UTyAlcy50IChrZXksIHZhbCkgVkFMVUVTICgxLCB0ZXh0X2FzX2Jsb2IoJyIgKyBwYXlsb2FkICsgIicpKSI7CiAgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXRUaHJvd25CeSgoKSAtPiBjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUod2l0aEtleXNwYWNlKHF1ZXJ5KSwgQUxMKSkKICAgICAgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcoIlJlamVjdGVkIGFuIG92ZXJzaXplZCBtdXRhdGlvbiAoIikKICAgICAgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcoIi80OTE1MikgZm9yIGtleXNwYWNlOiBkaXN0cmlidXRlZF90ZXN0X2tleXNwYWNlLiBUb3Aga2V5cyBhcmU6IHQuMSIpOwpAQCAtNTMsOCArNTMsOCBAQAogICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUga3MxLnQgKGtleSBpbnQgUFJJTUFSWSBLRVksIHZhbCBibG9iKSIpKTsKICAgICAgICAgICAgIFN0cmluZyBwYXlsb2FkID0gU3RyaW5nVXRpbHMucmVwZWF0KCcxJywgMTAyNCAqIDQ4KTsKICAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9ICJCRUdJTiBCQVRDSFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8ga3MxLnQgKGtleSwgdmFsKSBWQUxVRVMgKDEsIHRleHRBc0Jsb2IoJyIgKyBwYXlsb2FkICsgIicpKVxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8ga3MxLnQgKGtleSwgdmFsKSBWQUxVRVMgKDIsIHRleHRBc0Jsb2IoJzIyMicpKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8ga3MxLnQgKGtleSwgdmFsKSBWQUxVRVMgKDEsIHRleHRfYXNfYmxvYignIiArIHBheWxvYWQgKyAiJykpXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyBrczEudCAoa2V5LCB2YWwpIFZBTFVFUyAoMiwgdGV4dF9hc19ibG9iKCcyMjInKSlcbiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFQUExZIEJBVENIIjsKICAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UocXVlcnkpLCBBTEwpKQogICAgICAgICAgICAgICAgICAgICAgIC5oYXNNZXNzYWdlQ29udGFpbmluZygiUmVqZWN0ZWQgYW4gb3ZlcnNpemVkIG11dGF0aW9uICgiKQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1BhcnRpdGlvbkRlbnlsaXN0VGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1BhcnRpdGlvbkRlbnlsaXN0VGVzdC5qYXZhCmluZGV4IDM4Mjk4MWYuLmQ4ZTYzNzggMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9QYXJ0aXRpb25EZW55bGlzdFRlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvUGFydGl0aW9uRGVueWxpc3RUZXN0LmphdmEKQEAgLTM0LDYgKzM0LDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VQcm94eTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09OU0lTVEVOVF9SQU5HRV9NT1ZFTUVOVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DT05TSVNURU5UX1NJTVVMVEFORU9VU19NT1ZFU19BTExPVzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5SSU5HX0RFTEFZOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZS5HT1NTSVA7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLk5FVFdPUks7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpczsKQEAgLTU4LDkgKzYxLDkgQEAKICAgICBwdWJsaWMgdm9pZCBjaGVja1N0YXJ0dXBXaXRob3V0VHJpZ2dlcmluZ1VuYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uCiAgICAgewogICAgICAgICBpbnQgbm9kZUNvdW50ID0gNDsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEucmluZ19kZWxheV9tcyIsICI1MDAwIik7IC8vIGRvd24gZnJvbSAzMHMgZGVmYXVsdAotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5jb25zaXN0ZW50LnJhbmdlbW92ZW1lbnQiLCAiZmFsc2UiKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuY29uc2lzdGVudC5zaW11bHRhbmVvdXNtb3Zlcy5hbGxvdyIsICJ0cnVlIik7CisgICAgICAgIFJJTkdfREVMQVkuc2V0TG9uZyg1MDAwKTsgLy8gZG93biBmcm9tIDMwcyBkZWZhdWx0CisgICAgICAgIENPTlNJU1RFTlRfUkFOR0VfTU9WRU1FTlQuc2V0Qm9vbGVhbihmYWxzZSk7CisgICAgICAgIENPTlNJU1RFTlRfU0lNVUxUQU5FT1VTX01PVkVTX0FMTE9XLnNldEJvb2xlYW4odHJ1ZSk7CiAgICAgICAgIHRyeSAoQ2x1c3RlciBjbHVzdGVyID0gQ2x1c3Rlci5idWlsZChub2RlQ291bnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uZmlnKGNvbmZpZyAtPiBjb25maWcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGgoTkVUV09SSykKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9QYXhvc1JlcGFpcjJUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvUGF4b3NSZXBhaXIyVGVzdC5qYXZhCmluZGV4IDU3NGI4NGYuLjQwMDUwYmYgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9QYXhvc1JlcGFpcjJUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1BheG9zUmVwYWlyMlRlc3QuamF2YQpAQCAtMjcsNiArMjcsOCBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYXRvcnM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hd2FpdGlsaXR5LkF3YWl0aWxpdHk7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTYzLDYgKzY1LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuQ29uc2lzdGVuY3lMZXZlbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuSUludm9rYWJsZUluc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5DbHVzdGVyVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5DYXNXcml0ZVRpbWVvdXRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZ21zLkZhaWx1cmVEZXRlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKQEAgLTkxLDYgKzk0LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogCiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0LlNFQ09ORFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQVVUT19SRVBBSVJfRlJFUVVFTkNZX1NFQ09ORFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRElTQUJMRV9QQVhPU19BVVRPX1JFUEFJUlM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHMuU1lTVEVNX0tFWVNQQUNFX05BTUU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UucGF4b3MuQmFsbG90LkZsYWcuR0xPQkFMOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLkJhbGxvdEdlbmVyYXRvci5HbG9iYWwuc3RhbGVCYWxsb3Q7CkBAIC0xMDYsNyArMTExLDcgQEAKIAogICAgIHN0YXRpYwogICAgIHsKLSAgICAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlBBWE9TX0VYRUNVVEVfT05fU0VMRi5zZXRCb29sZWFuKGZhbHNlKTsKKyAgICAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlBBWE9TX1VTRV9TRUxGX0VYRUNVVElPTi5zZXRCb29sZWFuKGZhbHNlKTsKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CiAgICAgfQogCkBAIC0yMzksNyArMjQ0LDcgQEAKICAgICAgICAgKQogICAgICAgICB7CiAgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiQ1JFQVRFIFRBQkxFICIgKyBLRVlTUEFDRSArICcuJyArIFRBQkxFICsgIiAoayBpbnQgcHJpbWFyeSBrZXksIHYgaW50KSIpOwotICAgICAgICAgICAgY2x1c3Rlci5nZXQoMykuc2h1dGRvd24oKS5nZXQoKTsKKyAgICAgICAgICAgIENsdXN0ZXJVdGlscy5zdG9wVW5jaGVja2VkKGNsdXN0ZXIuZ2V0KDMpKTsKICAgICAgICAgICAgIEluZXRBZGRyZXNzQW5kUG9ydCBub2RlMyA9IEluZXRBZGRyZXNzQW5kUG9ydC5nZXRCeUFkZHJlc3MoY2x1c3Rlci5nZXQoMykuYnJvYWRjYXN0QWRkcmVzcygpKTsKIAogICAgICAgICAgICAgLy8gbWFrZSBzdXJlIG5vZGUxIGtub3dzIG5vZGUzIGlzIGRvd24KQEAgLTMzMCwyMSArMzM1LDIwIEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBwYXhvc0F1dG9SZXBhaXIoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5hdXRvX3JlcGFpcl9mcmVxdWVuY3lfc2Vjb25kcyIsICIxIik7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmRpc2FibGVfcGF4b3NfYXV0b19yZXBhaXJzIiwgInRydWUiKTsKLSAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBpbml0KENsdXN0ZXIuY3JlYXRlKDMsIGNmZyAtPiBjZmcKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KEFVVE9fUkVQQUlSX0ZSRVFVRU5DWV9TRUNPTkRTLCAxKS5zZXQoRElTQUJMRV9QQVhPU19BVVRPX1JFUEFJUlMsIHRydWUpOworICAgICAgICAgICAgIENsdXN0ZXIgY2x1c3RlciA9IGluaXQoQ2x1c3Rlci5jcmVhdGUoMywgY2ZnIC0+IGNmZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoInBheG9zX3ZhcmlhbnQiLCAidjIiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoInBheG9zX3JlcGFpcl9lbmFibGVkIiwgdHJ1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJ0cnVuY2F0ZV9yZXF1ZXN0X3RpbWVvdXRfaW5fbXMiLCAxMDAwTCkpKQotICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgidHJ1bmNhdGVfcmVxdWVzdF90aW1lb3V0X2luX21zIiwgMTAwMEwpKSk7CisgICAgICAgICAgICAgKQogICAgICAgICB7CiAgICAgICAgICAgICBjbHVzdGVyLmZvckVhY2goaSAtPiB7CiAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DTE9DS19HTE9CQUwuaXNQcmVzZW50KCkpOwotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjEiLCBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5hdXRvX3JlcGFpcl9mcmVxdWVuY3lfc2Vjb25kcyIpKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEuZGlzYWJsZV9wYXhvc19hdXRvX3JlcGFpcnMiKSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQVVUT19SRVBBSVJfRlJFUVVFTkNZX1NFQ09ORFMuZ2V0SW50KCkpOworICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ESVNBQkxFX1BBWE9TX0FVVE9fUkVQQUlSUy5nZXRCb29sZWFuKCkpOwogICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiQ1JFQVRFIFRBQkxFICIgKyBLRVlTUEFDRSArICcuJyArIFRBQkxFICsgIiAocGsgaW50LCBjayBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkiKTsKLSAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDMpLnNodXRkb3duKCkuZ2V0KCk7CisgICAgICAgICAgICBDbHVzdGVyVXRpbHMuc3RvcFVuY2hlY2tlZChjbHVzdGVyLmdldCgzKSk7CiAgICAgICAgICAgICBjbHVzdGVyLnZlcmJzKFZlcmIuUEFYT1NfQ09NTUlUX1JFUSkuZHJvcCgpOwogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CkBAIC0zNjksNyArMzczLDcgQEAKICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTwyMDsgaSsrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmICghY2x1c3Rlci5nZXQoMSkuY2FsbHNPbkluc3RhbmNlKCgpIC0+IFBheG9zU3RhdGUudW5jb21taXR0ZWRUcmFja2VyKCkuaGFzSW5mbGlnaHRBdXRvUmVwYWlycygpKS5jYWxsKCkKLSAgICAgICAgICAgICAgICAgJiYgIWNsdXN0ZXIuZ2V0KDIpLmNhbGxzT25JbnN0YW5jZSgoKSAtPiBQYXhvc1N0YXRlLnVuY29tbWl0dGVkVHJhY2tlcigpLmhhc0luZmxpZ2h0QXV0b1JlcGFpcnMoKSkuY2FsbCgpKQorICAgICAgICAgICAgICAgICAgICAmJiAhY2x1c3Rlci5nZXQoMikuY2FsbHNPbkluc3RhbmNlKCgpIC0+IFBheG9zU3RhdGUudW5jb21taXR0ZWRUcmFja2VyKCkuaGFzSW5mbGlnaHRBdXRvUmVwYWlycygpKS5jYWxsKCkpCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJXYWl0aW5nIGZvciBhdXRvIHJlcGFpcnMgdG8gZmluaXNoLi4uIik7CiAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwpAQCAtMzc3LDExICszODEsNiBAQAogICAgICAgICAgICAgYXNzZXJ0VW5jb21taXR0ZWQoY2x1c3Rlci5nZXQoMSksIEtFWVNQQUNFLCBUQUJMRSwgMCk7CiAgICAgICAgICAgICBhc3NlcnRVbmNvbW1pdHRlZChjbHVzdGVyLmdldCgyKSwgS0VZU1BBQ0UsIFRBQkxFLCAwKTsKICAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KCJjYXNzYW5kcmEuYXV0b19yZXBhaXJfZnJlcXVlbmN5X3NlY29uZHMiKTsKLSAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KCJjYXNzYW5kcmEuZGlzYWJsZV9wYXhvc19hdXRvX3JlcGFpcnMiKTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvUGF4b3NSZXBhaXJUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvUGF4b3NSZXBhaXJUZXN0LmphdmEKaW5kZXggYmZkNGU5NS4uMzI1MWY4NCAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1BheG9zUmVwYWlyVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9QYXhvc1JlcGFpclRlc3QuamF2YQpAQCAtOTYsNyArOTYsNyBAQAogCiAgICAgc3RhdGljCiAgICAgewotICAgICAgICBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUEFYT1NfRVhFQ1VURV9PTl9TRUxGLnNldEJvb2xlYW4oZmFsc2UpOworICAgICAgICBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUEFYT1NfVVNFX1NFTEZfRVhFQ1VUSU9OLnNldEJvb2xlYW4oZmFsc2UpOwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9QcmV2aWV3UmVwYWlyU25hcHNob3RUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvUHJldmlld1JlcGFpclNuYXBzaG90VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNjc5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvUHJldmlld1JlcGFpclNuYXBzaG90VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQm91bmRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5NdXJtdXIzUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLkNsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklJc29sYXRlZEV4ZWN1dG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWZzOworCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTExJU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlOVVRFUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmUuR09TU0lQOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZS5ORVRXT1JLOworaW1wb3J0IHN0YXRpYyBvcmcuYXdhaXRpbGl0eS5Bd2FpdGlsaXR5LmF3YWl0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZW1wdHlTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5ub3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworCitwdWJsaWMgY2xhc3MgUHJldmlld1JlcGFpclNuYXBzaG90VGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbAoreworICAgIC8qKgorICAgICAqIE1ha2VzIHN1cmUgd2Ugb25seSBzbmFwc2hvdCBzc3RhYmxlcyBjb250YWluaW5nIHRoZSBtaXNtYXRjaGluZyB0b2tlbgorICAgICAqIDxwPgorICAgICAqIDEuIGNyZWF0ZSAxMDAgc3N0YWJsZXMgcGVyIGluc3RhbmNlLCBjb21wYWN0aW9uIGRpc2FibGVkLCBvbmUgdG9rZW4gcGVyIHNzdGFibGUKKyAgICAgKiAyLiBtYWtlIDMgdG9rZW5zIG1pc21hdGNoaW5nIG9uIG5vZGUyLCBvbmUgdG9rZW4gcGVyIHNzdGFibGUKKyAgICAgKiAzLiBydW4gcHJldmlldyByZXBhaXIKKyAgICAgKiA0LiBtYWtlIHN1cmUgdGhhdCBvbmx5IHRoZSBzc3RhYmxlcyBjb250YWluaW5nIHRoZSB0b2tlbiBhcmUgaW4gdGhlIHNuYXBzaG90CisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U25hcHNob3RPZlNTdGFibGVzQ29udGFpbmluZ01pc21hdGNoaW5nVG9rZW5zKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKENsdXN0ZXIgY2x1c3RlciA9IGluaXQoQ2x1c3Rlci5idWlsZCgyKS53aXRoQ29uZmlnKGNvbmZpZyAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zZXQoInNuYXBzaG90X29uX3JlcGFpcmVkX2RhdGFfbWlzbWF0Y2giLCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoKEdPU1NJUCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aChORVRXT1JLKSkuc3RhcnQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldDxJbnRlZ2VyPiB0b2tlbnNUb01pc21hdGNoID0gU2V0cy5uZXdIYXNoU2V0KDEsIDUwLCA5OSk7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoImNyZWF0ZSB0YWJsZSAlcy50YmwgKGlkIGludCBwcmltYXJ5IGtleSkgd2l0aCBjb21wYWN0aW9uID0geydjbGFzcycgOiAnU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneScsICdlbmFibGVkJzpmYWxzZSB9IikpOworICAgICAgICAgICAgLy8gMSB0b2tlbiBwZXIgc3N0YWJsZTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2x1c3Rlci5jb29yZGluYXRvcigxKS5leGVjdXRlKHdpdGhLZXlzcGFjZSgiaW5zZXJ0IGludG8gJXMudGJsIChpZCkgdmFsdWVzICg/KSIpLCBDb25zaXN0ZW5jeUxldmVsLkFMTCwgaSk7CisgICAgICAgICAgICAgICAgY2x1c3Rlci5zdHJlYW0oKS5mb3JFYWNoKGluc3RhbmNlIC0+IGluc3RhbmNlLmZsdXNoKEtFWVNQQUNFKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbHVzdGVyLnN0cmVhbSgpLmZvckVhY2goaW5zdGFuY2UgLT4gaW5zdGFuY2UuZmx1c2goS0VZU1BBQ0UpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IDI7IGkrKykKKyAgICAgICAgICAgICAgICBtYXJrUmVwYWlyZWQoY2x1c3RlciwgaSk7CisKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpCisgICAgICAgICAgICAgICAgICAgLm5vZGV0b29sUmVzdWx0KCJyZXBhaXIiLCAiLXZkIiwgIi1wciIsIEtFWVNQQUNFLCAidGJsIikKKyAgICAgICAgICAgICAgICAgICAuYXNzZXJ0cygpCisgICAgICAgICAgICAgICAgICAgLnN1Y2Nlc3MoKQorICAgICAgICAgICAgICAgICAgIC5zdGRvdXRDb250YWlucygiUmVwYWlyZWQgZGF0YSBpcyBpbiBzeW5jIik7CisKKyAgICAgICAgICAgIFNldDxUb2tlbj4gbWlzbWF0Y2hpbmdUb2tlbnMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgICAgICBmb3IgKEludGVnZXIgdG9rZW4gOiB0b2tlbnNUb01pc21hdGNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDIpLmV4ZWN1dGVJbnRlcm5hbCh3aXRoS2V5c3BhY2UoImluc2VydCBpbnRvICVzLnRibCAoaWQpIHZhbHVlcyAoPykiKSwgdG9rZW4pOworICAgICAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDIpLmZsdXNoKEtFWVNQQUNFKTsKKyAgICAgICAgICAgICAgICBPYmplY3RbXVtdIHJlcyA9IGNsdXN0ZXIuZ2V0KDIpLmV4ZWN1dGVJbnRlcm5hbCh3aXRoS2V5c3BhY2UoInNlbGVjdCB0b2tlbihpZCkgZnJvbSAlcy50Ymwgd2hlcmUgaWQgPSA/IiksIHRva2VuKTsKKyAgICAgICAgICAgICAgICBtaXNtYXRjaGluZ1Rva2Vucy5hZGQobmV3IE11cm11cjNQYXJ0aXRpb25lci5Mb25nVG9rZW4oKGxvbmcpIHJlc1swXVswXSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtYXJrUmVwYWlyZWQoY2x1c3RlciwgMik7CisKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpCisgICAgICAgICAgICAgICAgICAgLm5vZGV0b29sUmVzdWx0KCJyZXBhaXIiLCAiLXZkIiwgS0VZU1BBQ0UsICJ0YmwiKQorICAgICAgICAgICAgICAgICAgIC5hc3NlcnRzKCkKKyAgICAgICAgICAgICAgICAgICAuc3VjY2VzcygpCisgICAgICAgICAgICAgICAgICAgLnN0ZG91dENvbnRhaW5zKCJSZXBhaXJlZCBkYXRhIGlzIGluY29uc2lzdGVudCIpOworCisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5ydW5Pbkluc3RhbmNlKGNoZWNrU25hcHNob3QobWlzbWF0Y2hpbmdUb2tlbnMsIDMpKTsKKyAgICAgICAgICAgIC8vIG5vZGUyIGdvdCB0aGUgZHVwbGljYXRlIG1pc21hdGNoLXRva2VucyBhYm92ZSwgc28gaXQgc2hvdWxkIGV4aXN0IGluIGV4YWN0bHkgNiBzc3RhYmxlcworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMikucnVuT25JbnN0YW5jZShjaGVja1NuYXBzaG90KG1pc21hdGNoaW5nVG9rZW5zLCA2KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIElJc29sYXRlZEV4ZWN1dG9yLlNlcmlhbGl6YWJsZVJ1bm5hYmxlIGNoZWNrU25hcHNob3QoU2V0PFRva2VuPiBtaXNtYXRjaGluZ1Rva2VucywgaW50IGV4cGVjdGVkU25hcHNob3RTaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgpIC0+IHsKKyAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldENvbHVtbkZhbWlseVN0b3JlKCJ0YmwiKTsKKworICAgICAgICAgICAgU3RyaW5nIHNuYXBzaG90VGFnID0gYXdhaXQoKS5hdE1vc3QoMSwgTUlOVVRFUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucG9sbEludGVydmFsKDEwMCwgTUlMTElTRUNPTkRTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bnRpbCgoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHRhZyA6IGNmcy5saXN0U25hcHNob3RzKCkua2V5U2V0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNyZWF0ZSB0aGUgc25hcHNob3Qgc2NoZW1hIGZpbGUgbGFzdCwgc28gd2hlbiB0aGlzIGV4aXN0cyB3ZSBrbm93IHRoZSBzbmFwc2hvdCBpcyBjb21wbGV0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZnMuZ2V0RGlyZWN0b3JpZXMoKS5nZXRTbmFwc2hvdFNjaGVtYUZpbGUodGFnKS5leGlzdHMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG5vdChlbXB0eVN0cmluZygpKSk7CisKKyAgICAgICAgICAgIFNldDxTU1RhYmxlUmVhZGVyPiBpblNuYXBzaG90ID0gbmV3IEhhc2hTZXQ8PigpOworCisgICAgICAgICAgICB0cnkgKFJlZnM8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMgPSBjZnMuZ2V0U25hcHNob3RTU1RhYmxlUmVhZGVycyhzbmFwc2hvdFRhZykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5TbmFwc2hvdC5hZGRBbGwoc3N0YWJsZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTbmFwc2hvdFNpemUsIGluU25hcHNob3Quc2l6ZSgpKTsKKworICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQm91bmRzPFRva2VuPiBzc3RhYmxlQm91bmRzID0gbmV3IEJvdW5kczw+KHNzdGFibGUuZmlyc3QuZ2V0VG9rZW4oKSwgc3N0YWJsZS5sYXN0LmdldFRva2VuKCkpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gc2hvdWxkQmVJblNuYXBzaG90ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChUb2tlbiBtaXNtYXRjaGluZ1Rva2VuIDogbWlzbWF0Y2hpbmdUb2tlbnMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3N0YWJsZUJvdW5kcy5jb250YWlucyhtaXNtYXRjaGluZ1Rva2VuKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc2hvdWxkQmVJblNuYXBzaG90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEJlSW5TbmFwc2hvdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNob3VsZEJlSW5TbmFwc2hvdCwgaW5TbmFwc2hvdC5jb250YWlucyhzc3RhYmxlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG1hcmtSZXBhaXJlZChDbHVzdGVyIGNsdXN0ZXIsIGludCBpbnN0YW5jZSkKKyAgICB7CisgICAgICAgIGNsdXN0ZXIuZ2V0KGluc3RhbmNlKS5ydW5Pbkluc3RhbmNlKCgpIC0+IHsKKyAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldENvbHVtbkZhbWlseVN0b3JlKCJ0YmwiKTsKKyAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogY2ZzLmdldExpdmVTU1RhYmxlcygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5kZXNjcmlwdG9yLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLm11dGF0ZVJlcGFpck1ldGFkYXRhKHNzdGFibGUuZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5yZWxvYWRTU1RhYmxlTWV0YWRhdGEoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9QcmV2aWV3UmVwYWlyVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1ByZXZpZXdSZXBhaXJUZXN0LmphdmEKaW5kZXggOTBlMjlmMi4uYTBiNjQzZiAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1ByZXZpZXdSZXBhaXJUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1ByZXZpZXdSZXBhaXJUZXN0LmphdmEKQEAgLTczLDkgKzczLDcgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmUuTkVUV09SSzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklNZXNzYWdlRmlsdGVycy5NYXRjaGVyOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5pbXBsLkluc3RhbmNlLmRlc2VyaWFsaXplTWVzc2FnZTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5QcmV2aWV3UmVwYWlyVGVzdC5EZWxheUZpcnN0UmVwYWlyVHlwZU1lc3NhZ2VGaWx0ZXIuZmluYWxpemVQcm9wb3NlOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LlByZXZpZXdSZXBhaXJUZXN0LkRlbGF5Rmlyc3RSZXBhaXJUeXBlTWVzc2FnZUZpbHRlci52YWxpZGF0aW9uUmVxdWVzdDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlZlcmIuRklOQUxJWkVfUFJPUE9TRV9NU0c7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5WZXJiLlZBTElEQVRJT05fUkVROwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkNvbmRpdGlvbi5uZXdPbmVUaW1lQ29uZGl0aW9uOwpAQCAtMTg3LDEwICsxODUsMTQgQEAKICAgICAgICAgICAgIHByZXZpZXdSZXBhaXJTdGFydGVkLmF3YWl0KCk7CiAgICAgICAgICAgICAvLyB0aGlzIG5lZWRzIHRvIGZpbmlzaCBiZWZvcmUgdGhlIHByZXZpZXcgcmVwYWlyIGlzIHVucGF1c2VkIG9uIG5vZGUyCiAgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5jYWxsT25JbnN0YW5jZShyZXBhaXIob3B0aW9ucyhmYWxzZSwgZmFsc2UpKSk7CisgICAgICAgICAgICBSZXBhaXJSZXN1bHQgaXJSZXN1bHQgPSBjbHVzdGVyLmdldCgxKS5jYWxsT25JbnN0YW5jZShyZXBhaXIob3B0aW9ucyhmYWxzZSwgZmFsc2UpKSk7CiAgICAgICAgICAgICBjb250aW51ZVByZXZpZXdSZXBhaXIuc2lnbmFsQWxsKCk7CiAgICAgICAgICAgICBSZXBhaXJSZXN1bHQgcnMgPSByc0Z1dHVyZS5nZXQoKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHJzLnN1Y2Nlc3MpOyAvLyBwcmV2aWV3IHJlcGFpciBzaG91bGQgaGF2ZSBmYWlsZWQKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHJzLnN1Y2Nlc3MpOyAvLyBwcmV2aWV3IHJlcGFpciB3YXMgc3RhcnRlZCBiZWZvcmUgSVIsIGJ1dCBoYXMgbG93ZXIgcHJpb3JpdHksIHNvIGl0cyB0YXNrIHdpbGwgZ2V0IGNhbmNlbGxlZAogICAgICAgICAgICAgYXNzZXJ0RmFsc2UocnMud2FzSW5jb25zaXN0ZW50KTsgLy8gYW5kIG5vIG1pc21hdGNoZXMgc2hvdWxkIGhhdmUgYmVlbiByZXBvcnRlZAorCisgICAgICAgICAgICBhc3NlcnRUcnVlKGlyUmVzdWx0LnN1Y2Nlc3MpOyAvLyBJUiB3YXMgc3RhcnRlZCBhZnRlciBwcmV2aWV3IHJlcGFpciwgYnV0IGhhcyBhIGhpZ2hlciBwcmlvcml0eSwgc28gaXQnbGwgYmUgYWxsb3dlZCB0byBmaW5pc2gKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGlyUmVzdWx0Lndhc0luY29uc2lzdGVudCk7CiAgICAgICAgIH0KICAgICAgICAgZmluYWxseQogICAgICAgICB7CkBAIC0yMjYsMzQgKzIyOCwyMSBAQAogICAgICAgICAgICAgICAgICAgIC5tZXNzYWdlc01hdGNoaW5nKHZhbGlkYXRpb25SZXF1ZXN0KHByZXZpZXdSZXBhaXJTdGFydGVkLCBjb250aW51ZVByZXZpZXdSZXBhaXIpKQogICAgICAgICAgICAgICAgICAgIC5kcm9wKCk7CiAKLSAgICAgICAgICAgIENvbmRpdGlvbiBpclJlcGFpclN0YXJ0ZWQgPSBuZXdPbmVUaW1lQ29uZGl0aW9uKCk7Ci0gICAgICAgICAgICBDb25kaXRpb24gY29udGludWVJclJlcGFpciA9IG5ld09uZVRpbWVDb25kaXRpb24oKTsKLSAgICAgICAgICAgIC8vIHRoaXMgYmxvY2tzIHRoZSBJUiBmcm9tIGNvbW1pdHRpbmcsIHNvIHdlIGNhbiByZWVuYWJsZSB0aGUgcHJldmlldwotICAgICAgICAgICAgY2x1c3Rlci5maWx0ZXJzKCkKLSAgICAgICAgICAgICAgICAgICAub3V0Ym91bmQoKQotICAgICAgICAgICAgICAgICAgIC52ZXJicyhGSU5BTElaRV9QUk9QT1NFX01TRy5pZCkKLSAgICAgICAgICAgICAgICAgICAuZnJvbSgxKS50bygyKQotICAgICAgICAgICAgICAgICAgIC5tZXNzYWdlc01hdGNoaW5nKGZpbmFsaXplUHJvcG9zZShpclJlcGFpclN0YXJ0ZWQsIGNvbnRpbnVlSXJSZXBhaXIpKQotICAgICAgICAgICAgICAgICAgIC5kcm9wKCk7Ci0KICAgICAgICAgICAgIEZ1dHVyZTxSZXBhaXJSZXN1bHQ+IHByZXZpZXdSZXN1bHQgPSBjbHVzdGVyLmdldCgxKS5hc3luY0NhbGxzT25JbnN0YW5jZShyZXBhaXIob3B0aW9ucyh0cnVlLCBmYWxzZSkpKS5jYWxsKCk7CiAgICAgICAgICAgICBwcmV2aWV3UmVwYWlyU3RhcnRlZC5hd2FpdCgpOwogCi0gICAgICAgICAgICAvLyB0cmlnZ2VyIElSIGFuZCB3YWl0IHRpbGwgaXRzIHJlYWR5IHRvIGNvbW1pdAorICAgICAgICAgICAgLy8gdHJpZ2dlciBJUiBhbmQgd2FpdCB0aWxsIGl0J3MgcmVhZHkgdG8gY29tbWl0CiAgICAgICAgICAgICBGdXR1cmU8UmVwYWlyUmVzdWx0PiBpclJlc3VsdCA9IGNsdXN0ZXIuZ2V0KDEpLmFzeW5jQ2FsbHNPbkluc3RhbmNlKHJlcGFpcihvcHRpb25zKGZhbHNlLCBmYWxzZSkpKS5jYWxsKCk7Ci0gICAgICAgICAgICBpclJlcGFpclN0YXJ0ZWQuYXdhaXQoKTsKKyAgICAgICAgICAgIFJlcGFpclJlc3VsdCBpciA9IGlyUmVzdWx0LmdldCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpci5zdWNjZXNzKTsgLy8gSVIgd2FzIHN1Ym1pdHRlZCBhZnRlciBwcmV2aWV3IHJlcGFpciBoYXMgYWNxdWlyZWQgc3N0YWJsZXMsIGJ1dCBoYXMgaGlnaGVyIHByaW9yaXR5CisgICAgICAgICAgICBhc3NlcnRGYWxzZShpci53YXNJbmNvbnNpc3RlbnQpOyAvLyBub3QgcHJldmlldywgc28gd2UgZG9uJ3QgY2FyZSBhYm91dCBwcmV2aWV3IG5vdGlmaWNhdGlvbgogCiAgICAgICAgICAgICAvLyB1bmJsb2NrIHByZXZpZXcgcmVwYWlyIGFuZCB3YWl0IGZvciBpdCB0byBjb21wbGV0ZQogICAgICAgICAgICAgY29udGludWVQcmV2aWV3UmVwYWlyLnNpZ25hbEFsbCgpOwogCiAgICAgICAgICAgICBSZXBhaXJSZXN1bHQgcnMgPSBwcmV2aWV3UmVzdWx0LmdldCgpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UocnMuc3VjY2Vzcyk7IC8vIHByZXZpZXcgcmVwYWlyIHNob3VsZCBoYXZlIGZhaWxlZAorICAgICAgICAgICAgYXNzZXJ0RmFsc2UocnMuc3VjY2Vzcyk7IC8vIHByZXZpZXcgcmVwYWlyIHdhcyBzdGFydGVkIGVhcmxpZXIgdGhhbiBJUiBzZXNzaW9uOyBidXQgaGFzIHNtYWxsZXIgcHJpb3JpdHkKICAgICAgICAgICAgIGFzc2VydEZhbHNlKHJzLndhc0luY29uc2lzdGVudCk7IC8vIGFuZCBubyBtaXNtYXRjaGVzIHNob3VsZCBoYXZlIGJlZW4gcmVwb3J0ZWQKLQotICAgICAgICAgICAgY29udGludWVJclJlcGFpci5zaWduYWxBbGwoKTsKLSAgICAgICAgICAgIFJlcGFpclJlc3VsdCBpciA9IGlyUmVzdWx0LmdldCgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpci5zdWNjZXNzKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKGlyLndhc0luY29uc2lzdGVudCk7IC8vIG5vdCBwcmV2aWV3LCBzbyB3ZSBkb24ndCBjYXJlIGFib3V0IHByZXZpZXcgbm90aWZpY2F0aW9uCiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9Qcm9maWxlTG9hZFRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9Qcm9maWxlTG9hZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODNlYTdjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1Byb2ZpbGVMb2FkVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuVW5pbnRlcnJ1cHRpYmxlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Db25zaXN0ZW5jeUxldmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSW52b2thYmxlSW5zdGFuY2U7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworcHVibGljIGNsYXNzIFByb2ZpbGVMb2FkVGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbAoreworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNjaGVkdWxlZFNhbXBsaW5nVGFza0xvZ3MoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoQ2x1c3RlciBjbHVzdGVyID0gaW5pdChDbHVzdGVyLmJ1aWxkKDEpLnN0YXJ0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkNSRUFURSBUQUJMRSAlcy50YmwgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpOyIpKTsKKworICAgICAgICAgICAgLy8gc3RhcnQgdGhlIHNjaGVkdWxlZCBwcm9maWxlbG9hZCB0YXNrIHRoYXQgc2FtcGxlcyBmb3IgMSBzZWNvbmQgYW5kIGV2ZXJ5IHNlY29uZC4KKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sUmVzdWx0KCJwcm9maWxlbG9hZCIsICIxMDAwIiwgIi1pIiwgIjEwMDAiKS5hc3NlcnRzKCkuc3VjY2VzcygpOworCisgICAgICAgICAgICBSYW5kb20gcm5kID0gbmV3IFJhbmRvbSgpOworICAgICAgICAgICAgLy8gODAwICogMm1zID0gMS42IHNlY29uZHMuIEl0IGxvZ3MgZXZlcnkgc2Vjb25kLiBTbyBpdCBsb2dzIGF0IGxlYXN0IG9uY2UuCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDgwMDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJJTlNFUlQgSU5UTyAlcy50YmwgKHBrLCBjaywgdikgVkFMVUVTICg/LD8sPykiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3lMZXZlbC5RVU9SVU0sIHJuZC5uZXh0SW50KCksIHJuZC5uZXh0SW50KCksIGkpOworICAgICAgICAgICAgICAgIFVuaW50ZXJydXB0aWJsZXMuc2xlZXBVbmludGVycnVwdGlibHkoMiwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC0tbGlzdCBzaG91bGQgZGlzcGxheSBhbGwgYWN0aXZlIHRhc2tzLgorICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkT3V0cHV0ID0gU3RyaW5nLmZvcm1hdCgiS0VZU1BBQ0UgVEFCTEUlbiIgKyAiJThzICU1cyIsICIqIiwgIioiKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sUmVzdWx0KCJwcm9maWxlbG9hZCIsICItLWxpc3QiKQorICAgICAgICAgICAgICAgICAgIC5hc3NlcnRzKCkKKyAgICAgICAgICAgICAgICAgICAuc3VjY2VzcygpCisgICAgICAgICAgICAgICAgICAgLnN0ZG91dENvbnRhaW5zKGV4cGVjdGVkT3V0cHV0KTsKKworICAgICAgICAgICAgLy8gbG9vcCBhc3NlcnQgdGhlIGxvZyBjb250YWlucyB0aGUgZnJlcXVlbmN5IHJlYWRvdXQ7IGdpdmUgdGhpcyAxNSBzZWNvbmRzIHdoaWNoIHNob3VsZCBiZSBwbGVudHkgb2YgdGltZQorICAgICAgICAgICAgLy8gZXZlbiBvbiB2ZXJ5IGJhZGx5IHVuZGVycHJvdmlzaW9uZWQgZW52aXJvbm1lbnRzCisgICAgICAgICAgICBpbnQgdGltZW91dCA9IDE1OworICAgICAgICAgICAgYm9vbGVhbiB0ZXN0UGFzc2VkID0gZmFsc2U7CisgICAgICAgICAgICB3aGlsZSAodGltZW91dC0tID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gZnJlcUhlYWRpbmdzID0gY2x1c3Rlci5nZXQoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2dzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ncmVwKCJGcmVxdWVuY3kgb2YgKHJlYWRzfHdyaXRlc3xjYXMgY29udGVudGlvbnMpIGJ5IHBhcnRpdGlvbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgaWYgKGZyZXFIZWFkaW5ncy5zaXplKCkgPiAzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGVzdFBhc3NlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBVbmludGVycnVwdGlibGVzLnNsZWVwVW5pbnRlcnJ1cHRpYmx5KDEsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlRoZSBzY2hlZHVsZWQgdGFzayBzaG91bGQgYXQgbGVhc3QgcnVuIGFuZCBsb2cgb25jZSIsIHRlc3RQYXNzZWQpOworCisgICAgICAgICAgICBMaXN0PFN0cmluZz4gc3RhcnRTYW1wbGluZ0xvZ3MgPSBjbHVzdGVyLmdldCgxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2dzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ3JlcCgiU3RhcnRpbmcgdG8gc2FtcGxlIHRhYmxlcyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJlc3VsdCgpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkl0IHNob3VsZCBzdGFydCBzYW1wbGluZyBhdCBsZWFzdCBvbmNlIiwgc3RhcnRTYW1wbGluZ0xvZ3Muc2l6ZSgpID4gMCk7CisKKyAgICAgICAgICAgIC8vIHN0b3AgdGhlIHNjaGVkdWxlZCBzYW1wbGluZworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkubm9kZXRvb2xSZXN1bHQoInByb2ZpbGVsb2FkIiwgIi0tc3RvcCIpLmFzc2VydHMoKS5zdWNjZXNzKCk7CisKKyAgICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBsYXN0IHNjaGVkdWxlIHRvIGJlIHN0b3BwZWQuIC0tbGlzdCBzaG91bGQgbGlzdCBub3RoaW5nIGFmdGVyIHN0b3BwaW5nCisgICAgICAgICAgICBhc3NlcnRMaXN0RW1wdHkoY2x1c3Rlci5nZXQoMSkpOworCisgICAgICAgICAgICAvLyBzY2hlZHVsZSBvbiB0aGUgc3BlY2lmaWMgdGFibGUKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sUmVzdWx0KCJwcm9maWxlbG9hZCIsIEtFWVNQQUNFLCAidGJsIiwgIjEwMDAiLCAiLWkiLCAiMTAwMCIpLmFzc2VydHMoKS5zdWNjZXNzKCk7CisgICAgICAgICAgICBleHBlY3RlZE91dHB1dCA9IFN0cmluZy5mb3JtYXQoIiUiICsgS0VZU1BBQ0UubGVuZ3RoKCkgKyAicyAlNXMlbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyAlNXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLRVlTUEFDRSIsICJUQUJMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZU1BBQ0UsICJ0YmwiKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sUmVzdWx0KCJwcm9maWxlbG9hZCIsICItLWxpc3QiKQorICAgICAgICAgICAgICAgICAgIC5hc3NlcnRzKCkKKyAgICAgICAgICAgICAgICAgICAuc3VjY2VzcygpCisgICAgICAgICAgICAgICAgICAgLnN0ZG91dENvbnRhaW5zKGV4cGVjdGVkT3V0cHV0KTsKKyAgICAgICAgICAgIC8vIHN0b3AgYWxsIHNob3VsZCBzdG9wIHRoZSB0YXNrIHNjaGVkdWxlZCB3aXRoIHRoZSBzcGVjaWZpYyB0YWJsZQorICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkubm9kZXRvb2xSZXN1bHQoInByb2ZpbGVsb2FkIiwgIi0tc3RvcCIpCisgICAgICAgICAgICAgICAgICAgLmFzc2VydHMoKS5zdWNjZXNzKCk7CisgICAgICAgICAgICBhc3NlcnRMaXN0RW1wdHkoY2x1c3Rlci5nZXQoMSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJldmVudER1cGxpY2F0ZWRTY2hlZHVsZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBpbml0KENsdXN0ZXIuYnVpbGQoMSkuc3RhcnQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnRibCAocGsgaW50LCBjayBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSk7IikpOworCisgICAgICAgICAgICAvLyBOZXcgc2FtcGxpbmc7IHdlIGFyZSBnb29kCisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5ub2RldG9vbFJlc3VsdCgicHJvZmlsZWxvYWQiLCBLRVlTUEFDRSwgInRibCIsICIxMDAwIiwgIi1pIiwgIjEwMDAiKQorICAgICAgICAgICAgICAgICAgIC5hc3NlcnRzKCkKKyAgICAgICAgICAgICAgICAgICAuc3VjY2VzcygpCisgICAgICAgICAgICAgICAgICAgLnN0ZG91dE5vdENvbnRhaW5zKCJVbmFibGUgdG8gc2NoZWR1bGUgc2FtcGxpbmcgZm9yIGtleXNwYWNlIik7CisKKyAgICAgICAgICAgIC8vIER1cGxpY2F0ZWQgc2FtcGxpbmcgKGFnYWluc3QgdGhlIHNhbWUgdGFibGUpIGJ1dCBkaWZmZXJlbnQgaW50ZXJ2YWwuIE5vZGV0b29sIHNob3VsZCByZWplY3QKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sUmVzdWx0KCJwcm9maWxlbG9hZCIsIEtFWVNQQUNFLCAidGJsIiwgIjEwMDAiLCAiLWkiLCAiMTAwMCIpCisgICAgICAgICAgICAgICAgICAgLmFzc2VydHMoKQorICAgICAgICAgICAgICAgICAgIC5zdWNjZXNzKCkKKyAgICAgICAgICAgICAgICAgICAuc3Rkb3V0Q29udGFpbnMoIlVuYWJsZSB0byBzY2hlZHVsZSBzYW1wbGluZyBmb3Iga2V5c3BhY2UiKTsKKworICAgICAgICAgICAgLy8gVGhlICJzYW1wbGluZyBhbGwiIHJlcXVlc3QgY3JlYXRlcyBvdmVybGFwcywgc28gaXQgc2hvdWxkIGJlIHJlamVjdGVkIHRvbworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkubm9kZXRvb2xSZXN1bHQoInByb2ZpbGVsb2FkIiwgIjEwMDAiLCAiLWkiLCAiMTAwMCIpCisgICAgICAgICAgICAgICAgICAgLmFzc2VydHMoKQorICAgICAgICAgICAgICAgICAgIC5zdWNjZXNzKCkKKyAgICAgICAgICAgICAgICAgICAuc3Rkb3V0Q29udGFpbnMoIlVuYWJsZSB0byBzY2hlZHVsZSBzYW1wbGluZyBmb3Iga2V5c3BhY2UiKTsKKworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkubm9kZXRvb2xSZXN1bHQoInByb2ZpbGVsb2FkIiwgS0VZU1BBQ0UsICJ0YmwiLCAiLS1zdG9wIikuYXNzZXJ0cygpLnN1Y2Nlc3MoKTsKKyAgICAgICAgICAgIGFzc2VydExpc3RFbXB0eShjbHVzdGVyLmdldCgxKSk7CisKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sUmVzdWx0KCJwcm9maWxlbG9hZCIsICJub25leGlzdGtzIiwgIm5vbmV4aXN0dGJsIiwgIi0tc3RvcCIpCisgICAgICAgICAgICAgICAgICAgLmFzc2VydHMoKQorICAgICAgICAgICAgICAgICAgIC5zdWNjZXNzKCkKKyAgICAgICAgICAgICAgICAgICAuc3Rkb3V0Q29udGFpbnMoIlVuYWJsZSB0byBzdG9wIHRoZSBub24tZXhpc3RlbnQgc2NoZWR1bGVkIHNhbXBsaW5nIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0TGlzdEVtcHR5KElJbnZva2FibGVJbnN0YW5jZSBpbnN0YW5jZSkKKyAgICB7CisgICAgICAgIFVuaW50ZXJydXB0aWJsZXMuc2xlZXBVbmludGVycnVwdGlibHkoMTUwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiLS1saXN0IHNob3VsZCBsaXN0IG5vdGhpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLRVlTUEFDRSBUQUJMRVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5ub2RldG9vbFJlc3VsdCgicHJvZmlsZWxvYWQiLCAiLS1saXN0IikuZ2V0U3Rkb3V0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9RdWVyaWVzVGFibGVUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvUXVlcmllc1RhYmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZTU2ZTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvUXVlcmllc1RhYmxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLkNsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuU2ltcGxlUXVlcnlSZXN1bHQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBRdWVyaWVzVGFibGVUZXN0IGV4dGVuZHMgVGVzdEJhc2VJbXBsCit7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVRFUkFUSU9OUyA9IDI1NjsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkRXhwb3NlUmVhZHNBbmRXcml0ZXMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICB0cnkgKENsdXN0ZXIgY2x1c3RlciA9IGluaXQoQ2x1c3Rlci5idWlsZCgxKS5zdGFydCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCgxNik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKCJDUkVBVEUgVEFCTEUgIiArIEtFWVNQQUNFICsgIi50YmwgKGsgaW50IHByaW1hcnkga2V5LCB2IGludCkiKTsKKworICAgICAgICAgICAgQXRvbWljSW50ZWdlciByZWFkcyA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgICAgICAgICAgQXRvbWljSW50ZWdlciB3cml0ZXMgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICAgICAgICAgIEF0b21pY0ludGVnZXIgcGF4b3MgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJVEVSQVRJT05TOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGsgPSBpOworICAgICAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2x1c3Rlci5jb29yZGluYXRvcigxKS5leGVjdXRlKCJJTlNFUlQgSU5UTyAiICsgS0VZU1BBQ0UgKyAiLnRibCAoaywgdikgVkFMVUVTICgiICsgayArICIsIDApIiwgQ29uc2lzdGVuY3lMZXZlbC5BTEwpKTsKKyAgICAgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSgiVVBEQVRFICIgKyBLRVlTUEFDRSArICIudGJsIFNFVCB2ID0gMTAgV0hFUkUgayA9ICIgKyAoayAtIDEpICsgIiBJRiB2ID0gMCIsIENvbnNpc3RlbmN5TGV2ZWwuQUxMKSk7CisgICAgICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUoIlNFTEVDVCAqIEZST00gIiArIEtFWVNQQUNFICsgIi50YmwgV0hFUkUgayA9ICIgKyAoayAtIDEpLCBDb25zaXN0ZW5jeUxldmVsLkFMTCkpOworCisgICAgICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU2ltcGxlUXVlcnlSZXN1bHQgcmVzdWx0ID0gY2x1c3Rlci5nZXQoMSkuZXhlY3V0ZUludGVybmFsV2l0aFJlc3VsdCgiU0VMRUNUICogRlJPTSBzeXN0ZW1fdmlld3MucXVlcmllcyIpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlc3VsdC5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJvdyByb3cgPSByZXN1bHQubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRocmVhZElkID0gcm93LmdldCgidGhyZWFkX2lkIikudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXNrID0gcm93LmdldCgidGFzayIpLnRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWRJZC5jb250YWlucygiUmVhZCIpICYmIHRhc2suY29udGFpbnMoIlNFTEVDVCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRzLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhyZWFkSWQuY29udGFpbnMoIk11dGF0aW9uIikgJiYgdGFzay5jb250YWlucygiTXV0YXRpb24iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXMuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aHJlYWRJZC5jb250YWlucygiTXV0YXRpb24iKSAmJiB0YXNrLmNvbnRhaW5zKCJQYXhvcyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheG9zLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGV4ZWN1dG9yLnNodXRkb3duKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dG9yLmF3YWl0VGVybWluYXRpb24oMSwgVGltZVVuaXQuTUlOVVRFUykpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBXZSBzaG91bGQgc2VlIGF0IGxlYXN0IG9uZSByZWFkLCB3cml0ZSwgYW5kIGNvbmRpdGlvbmFsIHVwZGF0ZSBpbiB0aGUgInF1ZXJpZXMiIHRhYmxlLgorICAgICAgICAgICAgYXNzZXJ0VGhhdChyZWFkcy5nZXQoKSkuaXNHcmVhdGVyVGhhbigwKS5pc0xlc3NUaGFuT3JFcXVhbFRvKElURVJBVElPTlMpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCh3cml0ZXMuZ2V0KCkpLmlzR3JlYXRlclRoYW4oMCkuaXNMZXNzVGhhbk9yRXF1YWxUbyhJVEVSQVRJT05TKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocGF4b3MuZ2V0KCkpLmlzR3JlYXRlclRoYW4oMCkuaXNMZXNzVGhhbk9yRXF1YWxUbyhJVEVSQVRJT05TKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9SZWFkUmVwYWlyVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1JlYWRSZXBhaXJUZXN0LmphdmEKaW5kZXggOWE3MGU4OS4uODNjMjgwNiAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1JlYWRSZXBhaXJUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1JlYWRSZXBhaXJUZXN0LmphdmEKQEAgLTM0LDcgKzM0LDYgQEAKIGltcG9ydCBuZXQuYnl0ZWJ1ZGR5LmR5bmFtaWMubG9hZGluZy5DbGFzc0xvYWRpbmdTdHJhdGVneTsKIGltcG9ydCBuZXQuYnl0ZWJ1ZGR5LmltcGxlbWVudGF0aW9uLk1ldGhvZERlbGVnYXRpb247CiBpbXBvcnQgbmV0LmJ5dGVidWRkeS5pbXBsZW1lbnRhdGlvbi5iaW5kLmFubm90YXRpb24uU3VwZXJDYWxsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuTXV0YXRpb247CkBAIC01OSw2ICs1OCw3IEBACiAKIGltcG9ydCBzdGF0aWMgbmV0LmJ5dGVidWRkeS5tYXRjaGVyLkVsZW1lbnRNYXRjaGVycy5uYW1lZDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkFMTE9XX0FMVEVSX1JGX0RVUklOR19SQU5HRV9NT1ZFTUVOVDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2Uub3BlbjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWwuQUxMOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuQ29uc2lzdGVuY3lMZXZlbC5RVU9SVU07CkBAIC0yNTMsNyArMjUzLDcgQEAKICAgICAgICAgICAgIGFzc2VydFJvd3MoY2x1c3Rlci5nZXQoMikuZXhlY3V0ZUludGVybmFsKHF1ZXJ5KSk7CiAKICAgICAgICAgICAgIC8vIGFsdGVyIFJGCi0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJhbGxvd19hbHRlcl9yZl9kdXJpbmdfcmFuZ2VfbW92ZW1lbnQiLCAidHJ1ZSIpOworICAgICAgICAgICAgQUxMT1dfQUxURVJfUkZfRFVSSU5HX1JBTkdFX01PVkVNRU5ULnNldEJvb2xlYW4odHJ1ZSk7CiAgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkFMVEVSIEtFWVNQQUNFICVzIFdJVEggcmVwbGljYXRpb24gPSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieydjbGFzcyc6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InOiAyfSIpKTsKIApkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1JlcGFpckNvb3JkaW5hdG9yQmFzZS5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1JlcGFpckNvb3JkaW5hdG9yQmFzZS5qYXZhCmluZGV4IGYxMjY2ZmEuLjBmYzI1NTQgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9SZXBhaXJDb29yZGluYXRvckJhc2UuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvUmVwYWlyQ29vcmRpbmF0b3JCYXNlLmphdmEKQEAgLTM0LDYgKzM0LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LkRpc3RyaWJ1dGVkUmVwYWlyVXRpbHMuUmVwYWlyUGFyYWxsZWxpc207CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5EaXN0cmlidXRlZFJlcGFpclV0aWxzLlJlcGFpclR5cGU7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5OT0RFVE9PTF9KTVhfTk9USUZJQ0FUSU9OX1BPTExfSU5URVJWQUxfU0VDT05EUzsKKwogcHVibGljIGNsYXNzIFJlcGFpckNvb3JkaW5hdG9yQmFzZSBleHRlbmRzIFRlc3RCYXNlSW1wbAogewogICAgIHByb3RlY3RlZCBzdGF0aWMgQ2x1c3RlciBDTFVTVEVSOwpAQCAtNjcsNyArNjksNyBAQAogICAgICAgICAvLyBUaGlzIG9ubHkgd29ya3MgYmVjYXVzZSB0aGUgd2F5IENJIHdvcmtzCiAgICAgICAgIC8vIEluIENJIGEgbmV3IEpWTSBpcyBzcHVuIHVwIGZvciBlYWNoIHRlc3QgZmlsZSwgc28gdGhpcyBkb2Vzbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgYW5vdGhlciB0ZXN0IGZpbGUKICAgICAgICAgLy8gZ2V0dGluZyB0aGlzIHNldCBmaXJzdAotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5ub2RldG9vbC5qbXhfbm90aWZpY2F0aW9uX3BvbGxfaW50ZXJ2YWxfc2Vjb25kcyIsICIxIik7CisgICAgICAgIE5PREVUT09MX0pNWF9OT1RJRklDQVRJT05fUE9MTF9JTlRFUlZBTF9TRUNPTkRTLnNldExvbmcoMSk7CiAgICAgfQogCiAgICAgQEJlZm9yZUNsYXNzCmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvUmVwYWlyRGlnZXN0VHJhY2tpbmdUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvUmVwYWlyRGlnZXN0VHJhY2tpbmdUZXN0LmphdmEKaW5kZXggZjZkYTg4OC4uYjcwMjg1NSAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1JlcGFpckRpZ2VzdFRyYWNraW5nVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9SZXBhaXJEaWdlc3RUcmFja2luZ1Rlc3QuamF2YQpAQCAtMjAsMTAgKzIwLDggQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkN5Y2xpY0JhcnJpZXI7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CkBAIC0zMSwxNCArMjksNiBAQAogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlVuaW50ZXJydXB0aWJsZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5TRVBFeGVjdXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5BYnN0cmFjdFJlcGxpY2F0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5FbmRwb2ludHNGb3JUb2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLlJlcGxpY2FMYXlvdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SZXBsaWNhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCkBAIC00NiwyMSArMzYsMzIgQEAKIGltcG9ydCBuZXQuYnl0ZWJ1ZGR5LmR5bmFtaWMubG9hZGluZy5DbGFzc0xvYWRpbmdTdHJhdGVneTsKIGltcG9ydCBuZXQuYnl0ZWJ1ZGR5LmltcGxlbWVudGF0aW9uLk1ldGhvZERlbGVnYXRpb247CiBpbXBvcnQgbmV0LmJ5dGVidWRkeS5pbXBsZW1lbnRhdGlvbi5iaW5kLmFubm90YXRpb24uU3VwZXJDYWxsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5TRVBFeGVjdXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWFkQ29tbWFuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWFkRXhlY3V0aW9uQ29udHJvbGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TaW5nbGVQYXJ0aXRpb25SZWFkQ29tbWFuZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuQ29uc2lzdGVuY3lMZXZlbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuSUludm9rYWJsZUluc3RhbmNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSXNvbGF0ZWRFeGVjdXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlN0YXRzQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuU3RhdHNNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkFic3RyYWN0UmVwbGljYXRpb25TdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkVuZHBvaW50c0ZvclRva2VuOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmVwbGljYUxheW91dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLlJlcGxpY2FVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkFjdGl2ZVJlcGFpclNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlUHJveHk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlUHJveHkuTG9jYWxSZWFkUnVubmFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRGlhZ25vc3RpY1NuYXBzaG90U2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOwogCiBpbXBvcnQgc3RhdGljIG5ldC5ieXRlYnVkZHkubWF0Y2hlci5FbGVtZW50TWF0Y2hlcnMubmFtZWQ7CiBpbXBvcnQgc3RhdGljIG5ldC5ieXRlYnVkZHkubWF0Y2hlci5FbGVtZW50TWF0Y2hlcnMudGFrZXNBcmd1bWVudHM7CkBAIC01MTYsMTAgKzUxNyw3IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBzc3RhYmxlcy5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IHNzdGFibGUuZGVzY3JpcHRvcjsKLSAgICAgICAgICAgICAgICAgICAgTWFwPE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFDb21wb25lbnQ+IG1ldGFkYXRhID0gZGVzY3JpcHRvci5nZXRNZXRhZGF0YVNlcmlhbGl6ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2VyaWFsaXplKGRlc2NyaXB0b3IsIEVudW1TZXQub2YoTWV0YWRhdGFUeXBlLlNUQVRTKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RhdHNNZXRhZGF0YSBzdGF0cyA9IChTdGF0c01ldGFkYXRhKSBtZXRhZGF0YS5nZXQoTWV0YWRhdGFUeXBlLlNUQVRTKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHNNZXRhZGF0YSBzdGF0cyA9IFN0YXRzQ29tcG9uZW50LmxvYWQoZGVzY3JpcHRvcikuc3RhdHNNZXRhZGF0YSgpOwogICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJyZXBhaXJlZCBhdCBpcyBzZXQgZm9yIHNzdGFibGU6ICIgKyBkZXNjcmlwdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLnJlcGFpcmVkQXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZlUmVwYWlyU2VydmljZS5VTlJFUEFJUkVEX1NTVEFCTEUpOwpAQCAtNTY4LDEwICs1NjYsNyBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gc3N0YWJsZXMubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBzc3RhYmxlLmRlc2NyaXB0b3I7Ci0gICAgICAgICAgICAgICAgICAgIE1hcDxNZXRhZGF0YVR5cGUsIE1ldGFkYXRhQ29tcG9uZW50PiBtZXRhZGF0YSA9IGRlc2NyaXB0b3IuZ2V0TWV0YWRhdGFTZXJpYWxpemVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNlcmlhbGl6ZShkZXNjcmlwdG9yLCBFbnVtU2V0Lm9mKE1ldGFkYXRhVHlwZS5TVEFUUykpOwotCi0gICAgICAgICAgICAgICAgICAgIFN0YXRzTWV0YWRhdGEgc3RhdHMgPSAoU3RhdHNNZXRhZGF0YSkgbWV0YWRhdGEuZ2V0KE1ldGFkYXRhVHlwZS5TVEFUUyk7CisgICAgICAgICAgICAgICAgICAgIFN0YXRzTWV0YWRhdGEgc3RhdHMgPSBTdGF0c0NvbXBvbmVudC5sb2FkKGRlc2NyaXB0b3IpLnN0YXRzTWV0YWRhdGEoKTsKICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoInJlcGFpcmVkIGF0IGlzIG5vdCBzZXQgZm9yIHNzdGFibGU6ICIgKyBkZXNjcmlwdG9yLCBzdGF0cy5yZXBhaXJlZEF0ID4gMCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1NTVGFibGVJZEdlbmVyYXRpb25UZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvU1NUYWJsZUlkR2VuZXJhdGlvblRlc3QuamF2YQppbmRleCBkZDM3YmQzLi5kYjIyNDRiIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvU1NUYWJsZUlkR2VuZXJhdGlvblRlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvU1NUYWJsZUlkR2VuZXJhdGlvblRlc3QuamF2YQpAQCAtMzYsNyArMzYsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlN5c3RlbUtleXNwYWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQWJzdHJhY3RDb21wYWN0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5EYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLlNpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5UaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5OwpAQCAtMTUxLDcgKzE1MCw2IEBACiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdENvbXBhY3Rpb25TdHJhdGVnaWVzV2l0aE1peGVkU1NUYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewogICAgICAgICB0ZXN0Q29tcGFjdGlvblN0cmF0ZWdpZXNXaXRoTWl4ZWRTU1RhYmxlcyhTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzKTsKICAgICB9CkBAIC00MzIsOCArNDMwLDE2IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFNTVGFibGVzQ291bnQoU2V0PERlc2NyaXB0b3I+IGRlc2NzLCBTdHJpbmcgdGFibGVOYW1lLCBpbnQgZXhwZWN0ZWRTZXFHZW5JZHMsIGludCBleHBlY3RlZFVVSURHZW5JZHMpCiAgICAgewotICAgICAgICBMaXN0PFN0cmluZz4gc2VxU1NUYWJsZXMgPSBkZXNjcy5zdHJlYW0oKS5maWx0ZXIoZGVzYyAtPiBkZXNjLmlkIGluc3RhbmNlb2YgU2VxdWVuY2VCYXNlZFNTVGFibGVJZCkubWFwKERlc2NyaXB0b3I6OmJhc2VGaWxlbmFtZSkuc29ydGVkKCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHV1aWRTU1RhYmxlcyA9IGRlc2NzLnN0cmVhbSgpLmZpbHRlcihkZXNjIC0+IGRlc2MuaWQgaW5zdGFuY2VvZiBVVUlEQmFzZWRTU1RhYmxlSWQpLm1hcChEZXNjcmlwdG9yOjpiYXNlRmlsZW5hbWUpLnNvcnRlZCgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBzZXFTU1RhYmxlcyA9IGRlc2NzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihkZXNjIC0+IGRlc2MuaWQgaW5zdGFuY2VvZiBTZXF1ZW5jZUJhc2VkU1NUYWJsZUlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZGVzY3JpcHRvciAtPiBkZXNjcmlwdG9yLmJhc2VGaWxlKCkudG9TdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc29ydGVkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHV1aWRTU1RhYmxlcyA9IGRlc2NzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZGVzYyAtPiBkZXNjLmlkIGluc3RhbmNlb2YgVVVJREJhc2VkU1NUYWJsZUlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGRlc2NyaXB0b3IgLT4gZGVzY3JpcHRvci5iYXNlRmlsZSgpLnRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zb3J0ZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKICAgICAgICAgYXNzZXJ0VGhhdChzZXFTU1RhYmxlcykuZGVzY3JpYmVkQXMoIlNTVGFibGVzIG9mICVzIHdpdGggc2VxdWVuY2UgYmFzZWQgaWQiLCB0YWJsZU5hbWUpLmhhc1NpemUoZXhwZWN0ZWRTZXFHZW5JZHMpOwogICAgICAgICBhc3NlcnRUaGF0KHV1aWRTU1RhYmxlcykuZGVzY3JpYmVkQXMoIlNTVGFibGVzIG9mICVzIHdpdGggVVVJRCBiYXNlZCBpZCIsIHRhYmxlTmFtZSkuaGFzU2l6ZShleHBlY3RlZFVVSURHZW5JZHMpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9TZWNvbmRhcnlJbmRleENvbXBhY3Rpb25UZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvU2Vjb25kYXJ5SW5kZXhDb21wYWN0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYmMwZTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvU2Vjb25kYXJ5SW5kZXhDb21wYWN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Db25zaXN0ZW5jeUxldmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LmludGVybmFsLkNhc3NhbmRyYUluZGV4OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJRDsKKworcHVibGljIGNsYXNzIFNlY29uZGFyeUluZGV4Q29tcGFjdGlvblRlc3QgZXh0ZW5kcyBUZXN0QmFzZUltcGwKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3QyaUNvbXBhY3Rpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoQ2x1c3RlciBjbHVzdGVyID0gaW5pdChDbHVzdGVyLmJ1aWxkKDEpLnN0YXJ0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoImNyZWF0ZSB0YWJsZSAlcy50YmwgKGlkIGludCwgY2sgaW50LCBzb21ldGhpbmcgaW50LCBlbHNlIGludCwgcHJpbWFyeSBrZXkgKGlkLCBjaykpOyIpKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiY3JlYXRlIGluZGV4IHRibF9pZHggb24gJXMudGJsIChjaykiKSk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykKKyAgICAgICAgICAgICAgICBjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJpbnNlcnQgaW50byAlcy50YmwgKGlkLCBjaywgc29tZXRoaW5nLCBlbHNlKSB2YWx1ZXMgKD8sID8sID8sID8pIiksIENvbnNpc3RlbmN5TGV2ZWwuQUxMLCBpLCBpLCBpLCBpKTsKKworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkucnVuT25JbnN0YW5jZSgoKSAtPiB7CisgICAgICAgICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoInRibCIpOworICAgICAgICAgICAgICAgIENhc3NhbmRyYUluZGV4IGkgPSAoQ2Fzc2FuZHJhSW5kZXgpIGNmcy5pbmRleE1hbmFnZXIuZ2V0SW5kZXhCeU5hbWUoInRibF9pZHgiKTsKKyAgICAgICAgICAgICAgICBpLmdldEluZGV4Q2ZzKCkuZm9yY2VCbG9ja2luZ0ZsdXNoKENvbHVtbkZhbWlseVN0b3JlLkZsdXNoUmVhc29uLlVOSVRfVEVTVFMpOworICAgICAgICAgICAgICAgIFNldDxTU1RhYmxlUmVhZGVyPiBpZHhTU1RhYmxlcyA9IGkuZ2V0SW5kZXhDZnMoKS5nZXRMaXZlU1NUYWJsZXMoKTsKKyAgICAgICAgICAgICAgICAvLyBlbXVsYXRlIG9uZ29pbmcgaW5kZXggY29tcGFjdGlvbjoKKyAgICAgICAgICAgICAgICBDb21wYWN0aW9uSW5mby5Ib2xkZXIgaCA9IG5ldyBNb2NrSG9sZGVyKGkuZ2V0SW5kZXhDZnMoKS5tZXRhZGF0YSgpLCBpZHhTU1RhYmxlcyk7CisgICAgICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmJlZ2luQ29tcGFjdGlvbihoKTsKKyAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuZXN0aW1hdGVkUmVtYWluaW5nV3JpdGVCeXRlcygpOworICAgICAgICAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmFjdGl2ZS5maW5pc2hDb21wYWN0aW9uKGgpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTW9ja0hvbGRlciBleHRlbmRzIENvbXBhY3Rpb25JbmZvLkhvbGRlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXM7CisgICAgICAgIHByaXZhdGUgZmluYWwgVGFibGVNZXRhZGF0YSBtZXRhZGF0YTsKKworICAgICAgICBwdWJsaWMgTW9ja0hvbGRlcihUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBTZXQ8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTsKKyAgICAgICAgICAgIHRoaXMuc3N0YWJsZXMgPSBzc3RhYmxlczsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbXBhY3Rpb25JbmZvIGdldENvbXBhY3Rpb25JbmZvKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wYWN0aW9uSW5mbyhtZXRhZGF0YSwgT3BlcmF0aW9uVHlwZS5DT01QQUNUSU9OLCAwLCAxMDAwLCBuZXh0VGltZVVVSUQoKSwgc3N0YWJsZXMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9TdHJlYW1zRGlza1NwYWNlVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1N0cmVhbXNEaXNrU3BhY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ3MjY2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9TdHJlYW1zRGlza1NwYWNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgbmV0LmJ5dGVidWRkeS5CeXRlQnVkZHk7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5keW5hbWljLmxvYWRpbmcuQ2xhc3NMb2FkaW5nU3RyYXRlZ3k7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5pbXBsZW1lbnRhdGlvbi5NZXRob2REZWxlZ2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5BY3RpdmVDb21wYWN0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtTWFuYWdlcjsKKworaW1wb3J0IHN0YXRpYyBuZXQuYnl0ZWJ1ZGR5Lm1hdGNoZXIuRWxlbWVudE1hdGNoZXJzLm5hbWVkOworaW1wb3J0IHN0YXRpYyBuZXQuYnl0ZWJ1ZGR5Lm1hdGNoZXIuRWxlbWVudE1hdGNoZXJzLnRha2VzQXJndW1lbnRzOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZS5HT1NTSVA7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLk5FVFdPUks7CisKK3B1YmxpYyBjbGFzcyBTdHJlYW1zRGlza1NwYWNlVGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbAoreworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFib3J0U3RyZWFtcygpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeShDbHVzdGVyIGNsdXN0ZXIgPSBpbml0KENsdXN0ZXIuYnVpbGQoMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uZmlnKGNvbmZpZyAtPiBjb25maWcuc2V0KCJoaW50ZWRfaGFuZG9mZl9lbmFibGVkIiwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGgoR09TU0lQKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoKE5FVFdPUkspKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhJbnN0YW5jZUluaXRpYWxpemVyKChjbCwgaWQpIC0+IEJCLmRvSW5zdGFsbChjbCwgaWQsIFN0cmVhbU1hbmFnZXIuY2xhc3MsICJnZXRUb3RhbFJlbWFpbmluZ09uZ29pbmdCeXRlcyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiY3JlYXRlIHRhYmxlICIgKyBLRVlTUEFDRSArICIudGJsIChpZCBpbnQgcHJpbWFyeSBrZXksIHQgaW50KSB3aXRoIGNvbXBhY3Rpb249eydjbGFzcyc6ICdTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5J30iKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykKKyAgICAgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5leGVjdXRlSW50ZXJuYWwoIklOU0VSVCBJTlRPICIgKyBLRVlTUEFDRSArICIudGJsIChpZCwgdCkgdmFsdWVzICg/LD8pIiwgaSwgaSk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5mbHVzaChLRVlTUEFDRSk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgyKS5ydW5Pbkluc3RhbmNlKCgpIC0+IEJCLm9uZ29pbmcuc2V0KExvbmcuTUFYX1ZBTFVFIC8gMikpOworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkubm9kZXRvb2xSZXN1bHQoInJlcGFpciIsICItZnVsbCIpLmFzc2VydHMoKS5mYWlsdXJlKCk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgyKS5ub2RldG9vbFJlc3VsdCgicmVwYWlyIiwgIi1mdWxsIikuYXNzZXJ0cygpLmZhaWx1cmUoKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDIpLnJ1bk9uSW5zdGFuY2UoKCkgLT4gQkIub25nb2luZy5zZXQoMCkpOworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkubm9kZXRvb2xSZXN1bHQoInJlcGFpciIsICItZnVsbCIpLmFzc2VydHMoKS5zdWNjZXNzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBYm9ydFN0cmVhbXNXaGVuT25nb2luZ0NvbXBhY3Rpb25zTGVhdmVJbnN1ZmZpY2llbnRTcGFjZSgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeShDbHVzdGVyIGNsdXN0ZXIgPSBpbml0KENsdXN0ZXIuYnVpbGQoMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uZmlnKGNvbmZpZyAtPiBjb25maWcuc2V0KCJoaW50ZWRfaGFuZG9mZl9lbmFibGVkIiwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGgoR09TU0lQKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoKE5FVFdPUkspKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhJbnN0YW5jZUluaXRpYWxpemVyKChjbCwgaWQpIC0+IEJCLmRvSW5zdGFsbChjbCwgaWQsIEFjdGl2ZUNvbXBhY3Rpb25zLmNsYXNzLCAiZXN0aW1hdGVkUmVtYWluaW5nV3JpdGVCeXRlcyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiY3JlYXRlIHRhYmxlICIgKyBLRVlTUEFDRSArICIudGJsIChpZCBpbnQgcHJpbWFyeSBrZXksIHQgaW50KSB3aXRoIGNvbXBhY3Rpb249eydjbGFzcyc6ICdTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5J30iKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykKKyAgICAgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5leGVjdXRlSW50ZXJuYWwoIklOU0VSVCBJTlRPICIgKyBLRVlTUEFDRSArICIudGJsIChpZCwgdCkgdmFsdWVzICg/LD8pIiwgaSwgaSk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5mbHVzaChLRVlTUEFDRSk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgyKS5ydW5Pbkluc3RhbmNlKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKS5nZXRDb2x1bW5GYW1pbHlTdG9yZSgidGJsIik7CisgICAgICAgICAgICAgICAgQkIuZGF0YWRpciA9IGNmcy5nZXREaXJlY3RvcmllcygpLmdldExvY2F0aW9uRm9yRGlzayhjZnMuZ2V0RGlyZWN0b3JpZXMoKS5nZXRXcml0ZWFibGVMb2NhdGlvbigwKSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDIpLnJ1bk9uSW5zdGFuY2UoKCkgLT4gQkIub25nb2luZy5zZXQoTG9uZy5NQVhfVkFMVUUgLyAyKSk7CisKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sUmVzdWx0KCJyZXBhaXIiLCAiLWZ1bGwiKS5hc3NlcnRzKCkuZmFpbHVyZSgpOworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMikubm9kZXRvb2xSZXN1bHQoInJlcGFpciIsICItZnVsbCIpLmFzc2VydHMoKS5mYWlsdXJlKCk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgyKS5ydW5Pbkluc3RhbmNlKCgpIC0+IEJCLm9uZ29pbmcuc2V0KDApKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sUmVzdWx0KCJyZXBhaXIiLCAiLWZ1bGwiKS5hc3NlcnRzKCkuc3VjY2VzcygpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWJvcnRTdHJlYW1zV2hlblRvb01hbnlQZW5kaW5nQ29tcGFjdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkoQ2x1c3RlciBjbHVzdGVyID0gaW5pdChDbHVzdGVyLmJ1aWxkKDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjb25maWcgLT4gY29uZmlnLnNldCgiaGludGVkX2hhbmRvZmZfZW5hYmxlZCIsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoInJlamVjdF9yZXBhaXJfY29tcGFjdGlvbl90aHJlc2hvbGQiLCAxMDI0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoKEdPU1NJUCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aChORVRXT1JLKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoSW5zdGFuY2VJbml0aWFsaXplcihCQjo6aW5zdGFsbENTTUdldEVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiY3JlYXRlIHRhYmxlICIgKyBLRVlTUEFDRSArICIudGJsIChpZCBpbnQgcHJpbWFyeSBrZXksIHQgaW50KSB3aXRoIGNvbXBhY3Rpb249eydjbGFzcyc6ICdTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5J30iKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykKKyAgICAgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5leGVjdXRlSW50ZXJuYWwoIklOU0VSVCBJTlRPICIgKyBLRVlTUEFDRSArICIudGJsIChpZCwgdCkgdmFsdWVzICg/LD8pIiwgaSwgaSk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5mbHVzaChLRVlTUEFDRSk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgyKS5ydW5Pbkluc3RhbmNlKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBCQi5vbmdvaW5nLnNldChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0UmVwYWlyUGVuZGluZ0NvbXBhY3Rpb25SZWplY3RUaHJlc2hvbGQoKSArIDEpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sUmVzdWx0KCJyZXBhaXIiLCAiLWZ1bGwiKS5hc3NlcnRzKCkuZmFpbHVyZSgpOworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMikubm9kZXRvb2xSZXN1bHQoInJlcGFpciIsICItZnVsbCIpLmFzc2VydHMoKS5mYWlsdXJlKCk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgyKS5ydW5Pbkluc3RhbmNlKCgpIC0+IEJCLm9uZ29pbmcuc2V0KDApKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sUmVzdWx0KCJyZXBhaXIiLCAiLWZ1bGwiKS5hc3NlcnRzKCkuc3VjY2VzcygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCQgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBBdG9taWNMb25nIG9uZ29pbmcgPSBuZXcgQXRvbWljTG9uZygpOworICAgICAgICBwdWJsaWMgc3RhdGljIEZpbGUgZGF0YWRpcjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkb0luc3RhbGwoQ2xhc3NMb2FkZXIgY2wsIGludCBpZCwgQ2xhc3M8Pz4gY2xhenosIFN0cmluZyBtZXRob2QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpZCAhPSAyKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIG5ldyBCeXRlQnVkZHkoKS5yZWJhc2UoY2xhenopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWV0aG9kKG5hbWVkKG1ldGhvZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW50ZXJjZXB0KE1ldGhvZERlbGVnYXRpb24udG8oQkIuY2xhc3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1ha2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxvYWQoY2wsIENsYXNzTG9hZGluZ1N0cmF0ZWd5LkRlZmF1bHQuSU5KRUNUSU9OKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRUb3RhbFJlbWFpbmluZ09uZ29pbmdCeXRlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBvbmdvaW5nLmdldCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBNYXA8RmlsZSwgTG9uZz4gZXN0aW1hdGVkUmVtYWluaW5nV3JpdGVCeXRlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1hcDxGaWxlLCBMb25nPiByZXQgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICBpZiAoZGF0YWRpciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldC5wdXQoZGF0YWRpciwgb25nb2luZy5nZXQoKSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MoaW50IGFkZGl0aW9uYWxTU1RhYmxlcywgbG9uZyBhZGRpdGlvbmFsQnl0ZXMsIGJvb2xlYW4gaXNJbmNyZW1lbnRhbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChpbnQpIG9uZ29pbmcuZ2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluc3RhbGxDU01HZXRFc3RpbWF0ZWRSZW1haW5pbmdUYXNrcyhDbGFzc0xvYWRlciBjbCwgaW50IG5vZGVOdW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChub2RlTnVtYmVyID09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IEJ5dGVCdWRkeSgpLnJlZGVmaW5lKENvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1ldGhvZChuYW1lZCgiZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MiKS5hbmQodGFrZXNBcmd1bWVudHMoMykpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnRlcmNlcHQoTWV0aG9kRGVsZWdhdGlvbi50byhCQi5jbGFzcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1ha2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKGNsLCBDbGFzc0xvYWRpbmdTdHJhdGVneS5EZWZhdWx0LklOSkVDVElPTik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1RhYmxlTGV2ZWxJbmNyZW1lbnRhbEJhY2t1cHNUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvVGFibGVMZXZlbEluY3JlbWVudGFsQmFja3Vwc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTJmODY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1RhYmxlTGV2ZWxJbmNyZW1lbnRhbEJhY2t1cHNUZXN0LmphdmEKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TZXF1ZW5jZUJhc2VkU1NUYWJsZUlkOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWwuZ2V0QmFja3VwczsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3Rlci5idWlsZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWwuQUxMOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LkV4ZWNVdGlsLnJldGhyb3c7CitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgVGFibGVMZXZlbEluY3JlbWVudGFsQmFja3Vwc1Rlc3QgZXh0ZW5kcyBUZXN0QmFzZUltcGwgIAoreworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluY3JlbWVudGFsQmFja3VwRW5hYmxlZENyZWF0ZVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChDbHVzdGVyIGMgPSBnZXRDbHVzdGVyKHRydWUpKQorICAgICAgICB7CisgICAgICAgICAgICBjLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkNSRUFURSBUQUJMRSAlcy50ZXN0X3RhYmxlIChhIHRleHQgcHJpbWFyeSBrZXksIGIgaW50KSBXSVRIIGluY3JlbWVudGFsX2JhY2t1cHMgPSB0cnVlIikpOworICAgICAgICAgICAgZGlzYWJsZUNvbXBhY3Rpb24oYywgS0VZU1BBQ0UsICJ0ZXN0X3RhYmxlIik7CisgICAgICAgICAgICBjLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJJTlNFUlQgSU5UTyAlcy50ZXN0X3RhYmxlIChhLCBiKSBWQUxVRVMgKCdhJywgMSkiKSwgQUxMKTsKKyAgICAgICAgICAgIGZsdXNoKGMsIEtFWVNQQUNFKTsKKyAgICAgICAgICAgIGFzc2VydEJhY2t1cFNTVGFibGVzQ291bnQoYywgMSwgdHJ1ZSwgS0VZU1BBQ0UsICJ0ZXN0X3RhYmxlIik7CisKKyAgICAgICAgICAgIGMuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnRlc3RfdGFibGUgKGEsIGIpIFZBTFVFUyAoJ2EnLCAxKSIpLCBBTEwpOworICAgICAgICAgICAgZmx1c2goYywgS0VZU1BBQ0UpOworICAgICAgICAgICAgYXNzZXJ0QmFja3VwU1NUYWJsZXNDb3VudChjLCAyLCB0cnVlLCBLRVlTUEFDRSwgInRlc3RfdGFibGUiKTsKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiRFJPUCBUQUJMRSAlcy50ZXN0X3RhYmxlIikpOworCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnRlc3RfdGFibGUyIChhIHRleHQgcHJpbWFyeSBrZXksIGIgaW50KSBXSVRIIGluY3JlbWVudGFsX2JhY2t1cHMgPSBmYWxzZSIpKTsKKyAgICAgICAgICAgIGRpc2FibGVDb21wYWN0aW9uKGMsIEtFWVNQQUNFLCAidGVzdF90YWJsZTIiKTsKKyAgICAgICAgICAgIGMuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnRlc3RfdGFibGUyIChhLCBiKSBWQUxVRVMgKCdhJywgMSkiKSwgQUxMKTsKKyAgICAgICAgICAgIGZsdXNoKGMsIEtFWVNQQUNFKTsKKyAgICAgICAgICAgIGFzc2VydEJhY2t1cFNTVGFibGVzQ291bnQoYywgMCwgZmFsc2UsIEtFWVNQQUNFLCAidGVzdF90YWJsZTIiKTsKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiRFJPUCBUQUJMRSAlcy50ZXN0X3RhYmxlMiIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluY3JlbWVudGFsQmFja3VwRW5hYmxlZEFsdGVyVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKENsdXN0ZXIgYyA9IGdldENsdXN0ZXIodHJ1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnRlc3RfdGFibGUgKGEgdGV4dCBwcmltYXJ5IGtleSwgYiBpbnQpIFdJVEggaW5jcmVtZW50YWxfYmFja3VwcyA9IGZhbHNlIikpOworICAgICAgICAgICAgZGlzYWJsZUNvbXBhY3Rpb24oYywgS0VZU1BBQ0UsICJ0ZXN0X3RhYmxlIik7CisgICAgICAgICAgICBjLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJJTlNFUlQgSU5UTyAlcy50ZXN0X3RhYmxlIChhLCBiKSBWQUxVRVMgKCdhJywgMSkiKSwgQUxMKTsKKyAgICAgICAgICAgIGZsdXNoKGMsIEtFWVNQQUNFKTsKKyAgICAgICAgICAgIGFzc2VydEJhY2t1cFNTVGFibGVzQ291bnQoYywgMCwgZmFsc2UsIEtFWVNQQUNFLCAidGVzdF90YWJsZSIpOworCisgICAgICAgICAgICBjLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkFMVEVSIFRBQkxFICVzLnRlc3RfdGFibGUgIFdJVEggaW5jcmVtZW50YWxfYmFja3VwcyA9IHRydWUiKSk7CisgICAgICAgICAgICBjLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJJTlNFUlQgSU5UTyAlcy50ZXN0X3RhYmxlIChhLCBiKSBWQUxVRVMgKCdhJywgMSkiKSwgQUxMKTsKKyAgICAgICAgICAgIGZsdXNoKGMsIEtFWVNQQUNFKTsKKyAgICAgICAgICAgIGFzc2VydEJhY2t1cFNTVGFibGVzQ291bnQoYywgMSwgdHJ1ZSwgS0VZU1BBQ0UsICJ0ZXN0X3RhYmxlIik7CisgICAgICAgICAgICBjLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkRST1AgVEFCTEUgJXMudGVzdF90YWJsZSIpKTsKKworCisgICAgICAgICAgICBjLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkNSRUFURSBUQUJMRSAlcy50ZXN0X3RhYmxlMiAoYSB0ZXh0IHByaW1hcnkga2V5LCBiIGludCkgV0lUSCBpbmNyZW1lbnRhbF9iYWNrdXBzID0gdHJ1ZSIpKTsKKyAgICAgICAgICAgIGRpc2FibGVDb21wYWN0aW9uKGMsIEtFWVNQQUNFLCAidGVzdF90YWJsZTIiKTsKKyAgICAgICAgICAgIGMuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnRlc3RfdGFibGUyIChhLCBiKSBWQUxVRVMgKCdhJywgMSkiKSwgQUxMKTsKKyAgICAgICAgICAgIGZsdXNoKGMsIEtFWVNQQUNFKTsKKyAgICAgICAgICAgIGFzc2VydEJhY2t1cFNTVGFibGVzQ291bnQoYywgMSwgdHJ1ZSwgS0VZU1BBQ0UsICJ0ZXN0X3RhYmxlMiIpOworCisgICAgICAgICAgICBjLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkFMVEVSIFRBQkxFICVzLnRlc3RfdGFibGUyICBXSVRIIGluY3JlbWVudGFsX2JhY2t1cHMgPSBmYWxzZSIpKTsKKyAgICAgICAgICAgIGMuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnRlc3RfdGFibGUyIChhLCBiKSBWQUxVRVMgKCdhJywgMSkiKSwgQUxMKTsKKyAgICAgICAgICAgIGZsdXNoKGMsIEtFWVNQQUNFKTsKKyAgICAgICAgICAgIGFzc2VydEJhY2t1cFNTVGFibGVzQ291bnQoYywgMSwgZmFsc2UsIEtFWVNQQUNFLCAidGVzdF90YWJsZTIiKTsKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiRFJPUCBUQUJMRSAlcy50ZXN0X3RhYmxlMiIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluY3JlbWVudGFsQmFja3VwV2hlbkNyZWF0ZVRhYmxlQnlEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChDbHVzdGVyIGMgPSBnZXRDbHVzdGVyKHRydWUpKQorICAgICAgICB7CisgICAgICAgICAgICAvL2luY3JlbWVudGFsX2JhY2t1cHMgaXMgc2V0IHRvIHRydWUgYnkgZGVmYXVsdAorICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgJXMudGVzdF90YWJsZSAoYSB0ZXh0IHByaW1hcnkga2V5LCBiIGludCkiKSk7CisgICAgICAgICAgICBkaXNhYmxlQ29tcGFjdGlvbihjLCBLRVlTUEFDRSwgInRlc3RfdGFibGUiKTsKKyAgICAgICAgICAgIGMuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnRlc3RfdGFibGUgKGEsIGIpIFZBTFVFUyAoJ2EnLCAxKSIpLCBBTEwpOworICAgICAgICAgICAgZmx1c2goYywgS0VZU1BBQ0UpOworICAgICAgICAgICAgYXNzZXJ0QmFja3VwU1NUYWJsZXNDb3VudChjLCAxLCB0cnVlLCBLRVlTUEFDRSwgInRlc3RfdGFibGUiKTsKKworICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJBTFRFUiBUQUJMRSAlcy50ZXN0X3RhYmxlICBXSVRIIGluY3JlbWVudGFsX2JhY2t1cHMgPSBmYWxzZSIpKTsKKyAgICAgICAgICAgIGMuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnRlc3RfdGFibGUgKGEsIGIpIFZBTFVFUyAoJ2EnLCAxKSIpLCBBTEwpOworICAgICAgICAgICAgZmx1c2goYywgS0VZU1BBQ0UpOworICAgICAgICAgICAgYXNzZXJ0QmFja3VwU1NUYWJsZXNDb3VudChjLCAxLCBmYWxzZSwgS0VZU1BBQ0UsICJ0ZXN0X3RhYmxlIik7CisKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQUxURVIgVEFCTEUgJXMudGVzdF90YWJsZSAgV0lUSCBpbmNyZW1lbnRhbF9iYWNrdXBzID0gdHJ1ZSIpKTsKKyAgICAgICAgICAgIGMuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnRlc3RfdGFibGUgKGEsIGIpIFZBTFVFUyAoJ2EnLCAxKSIpLCBBTEwpOworICAgICAgICAgICAgZmx1c2goYywgS0VZU1BBQ0UpOworICAgICAgICAgICAgYXNzZXJ0QmFja3VwU1NUYWJsZXNDb3VudChjLCAyLCB0cnVlLCBLRVlTUEFDRSwgInRlc3RfdGFibGUiKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJEUk9QIFRBQkxFICVzLnRlc3RfdGFibGUiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIENsdXN0ZXIgZ2V0Q2x1c3Rlcihib29sZWFuIGluY3JlbWVudGFsQmFja3VwcykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gaW5pdChidWlsZCgyKS53aXRoRGF0YURpckNvdW50KDEpLndpdGhDb25maWcoYyAtPiBjLndpdGgoRmVhdHVyZS5HT1NTSVApCisgICAgICAgICAgICAgICAgLnNldCgiaW5jcmVtZW50YWxfYmFja3VwcyIsIGluY3JlbWVudGFsQmFja3VwcykpLnN0YXJ0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmbHVzaChDbHVzdGVyIGNsdXN0ZXIsIFN0cmluZyBrZXlzcGFjZSkgCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGNsdXN0ZXIuc2l6ZSgpICsgMTsgaSsrKQorICAgICAgICAgICAgY2x1c3Rlci5nZXQoaSkuZmx1c2goa2V5c3BhY2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNhYmxlQ29tcGFjdGlvbihDbHVzdGVyIGNsdXN0ZXIsIFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBjbHVzdGVyLnNpemUoKSArIDE7IGkrKykKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KGkpLm5vZGV0b29sKCJkaXNhYmxlYXV0b2NvbXBhY3Rpb24iLCBrZXlzcGFjZSwgdGFibGUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljICB2b2lkIGFzc2VydEJhY2t1cFNTVGFibGVzQ291bnQoQ2x1c3RlciBjbHVzdGVyLCBpbnQgZXhwZWN0ZWRTZXFHZW5JZHMsIGJvb2xlYW4gZW5hYmxlLCBTdHJpbmcga3MsIFN0cmluZy4uLiB0YWJsZU5hbWVzKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBjbHVzdGVyLnNpemUoKSArIDE7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY2x1c3Rlci5nZXQoaSkucnVuT25JbnN0YW5jZShyZXRocm93KCgpIC0+IEFycmF5cy5zdHJlYW0odGFibGVOYW1lcykuZm9yRWFjaCh0YWJsZU5hbWUgLT4gIGFzc2VydFRhYmxlTWV0YUluY3JlbWVudGFsQmFja3VwRW5hYmxlKGtzLCB0YWJsZU5hbWUsIGVuYWJsZSkpKSk7CisgICAgICAgICAgICBjbHVzdGVyLmdldChpKS5ydW5Pbkluc3RhbmNlKHJldGhyb3coKCkgLT4gQXJyYXlzLnN0cmVhbSh0YWJsZU5hbWVzKS5mb3JFYWNoKHRhYmxlTmFtZSAtPiBhc3NlcnRTU1RhYmxlc0NvdW50KGdldEJhY2t1cHMoa3MsIHRhYmxlTmFtZSksIHRhYmxlTmFtZSwgZXhwZWN0ZWRTZXFHZW5JZHMpKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRTU1RhYmxlc0NvdW50KFNldDxEZXNjcmlwdG9yPiBkZXNjcywgU3RyaW5nIHRhYmxlTmFtZSwgaW50IGV4cGVjdGVkU2VxR2VuSWRzKQorICAgIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHNlcVNTVGFibGVzID0gZGVzY3Muc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGRlc2MgLT4gZGVzYy5pZCBpbnN0YW5jZW9mIFNlcXVlbmNlQmFzZWRTU1RhYmxlSWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChkZXNjcmlwdG9yIC0+IGRlc2NyaXB0b3IuYmFzZUZpbGUoKS50b1N0cmluZygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zb3J0ZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICBhc3NlcnRUaGF0KHNlcVNTVGFibGVzKS5kZXNjcmliZWRBcygiU1NUYWJsZXMgb2YgJXMgd2l0aCBzZXF1ZW5jZSBiYXNlZCBpZCIsIHRhYmxlTmFtZSkuaGFzU2l6ZShleHBlY3RlZFNlcUdlbklkcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRUYWJsZU1ldGFJbmNyZW1lbnRhbEJhY2t1cEVuYWJsZShTdHJpbmcga3MsIFN0cmluZyB0YWJsZU5hbWUsIGJvb2xlYW4gZW5hYmxlKQorICAgIHsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY29sdW1uRmFtaWx5U3RvcmUgPSBDb2x1bW5GYW1pbHlTdG9yZS5nZXRJZkV4aXN0cyhrcywgdGFibGVOYW1lKTsKKyAgICAgICAgaWYgKGVuYWJsZSkKKyAgICAgICAgICAgIGFzc2VydFRydWUoY29sdW1uRmFtaWx5U3RvcmUuaXNUYWJsZUluY3JlbWVudGFsQmFja3Vwc0VuYWJsZWQoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGNvbHVtbkZhbWlseVN0b3JlLmlzVGFibGVJbmNyZW1lbnRhbEJhY2t1cHNFbmFibGVkKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9UZXN0QmFzZUltcGwuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9UZXN0QmFzZUltcGwuamF2YQppbmRleCBlOTdhMDgxLi4zNWM1OTA0IDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvVGVzdEJhc2VJbXBsLmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1Rlc3RCYXNlSW1wbC5qYXZhCkBAIC0yNyw2ICsyNyw4IEBACiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CiAKQEAgLTQyLDYgKzQ0LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuRGlzdHJpYnV0ZWRUZXN0QmFzZTsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkJPT1RTVFJBUF9TQ0hFTUFfREVMQVlfTVM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSk9JTl9SSU5HOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hY3Rpb24uR29zc2lwSGVscGVyLndpdGhQcm9wZXJ0eTsKIAogcHVibGljIGNsYXNzIFRlc3RCYXNlSW1wbCBleHRlbmRzIERpc3RyaWJ1dGVkVGVzdEJhc2UKQEAgLTExOSw4ICsxMjIsOCBAQAogICAgICAgICBJSW5zdGFuY2VDb25maWcgY29uZmlnID0gY2x1c3Rlci5uZXdJbnN0YW5jZUNvbmZpZygpOwogICAgICAgICBjb25maWcuc2V0KCJhdXRvX2Jvb3RzdHJhcCIsIHRydWUpOwogICAgICAgICBJSW52b2thYmxlSW5zdGFuY2UgbmV3SW5zdGFuY2UgPSBjbHVzdGVyLmJvb3RzdHJhcChjb25maWcpOwotICAgICAgICB3aXRoUHJvcGVydHkoQk9PVFNUUkFQX1NDSEVNQV9ERUxBWV9NUy5nZXRLZXkoKSwgSW50ZWdlci50b1N0cmluZyg5MCAqIDEwMDApLAotICAgICAgICAgICAgICAgICAgICAgKCkgLT4gd2l0aFByb3BlcnR5KCJjYXNzYW5kcmEuam9pbl9yaW5nIiwgZmFsc2UsICgpIC0+IG5ld0luc3RhbmNlLnN0YXJ0dXAoY2x1c3RlcikpKTsKKyAgICAgICAgd2l0aFByb3BlcnR5KEJPT1RTVFJBUF9TQ0hFTUFfREVMQVlfTVMsIEludGVnZXIudG9TdHJpbmcoOTAgKiAxMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICgpIC0+IHdpdGhQcm9wZXJ0eShKT0lOX1JJTkcsIGZhbHNlLCAoKSAtPiBuZXdJbnN0YW5jZS5zdGFydHVwKGNsdXN0ZXIpKSk7CiAgICAgICAgIG5ld0luc3RhbmNlLm5vZGV0b29sUmVzdWx0KCJqb2luIikuYXNzZXJ0cygpLnN1Y2Nlc3MoKTsKICAgICB9CiAKQEAgLTE5MCw5ICsxOTMsMjAgQEAKICAgICB7CiAgICAgICAgIC8vIFRoZXNlIGtleXNwYWNlcyBhcmUgdW5kZXIgcmVwbGljYXRlZCBieSBkZWZhdWx0LCBzbyBtdXN0IGJlIHVwZGF0ZWQgd2hlbiBkb2luZyBhIG11bHRpLW5vZGUgY2x1c3RlcjsKICAgICAgICAgLy8gZWxzZSBib290c3RyYXAgd2lsbCBmYWlsIHdpdGggJ1VuYWJsZSB0byBmaW5kIHN1ZmZpY2llbnQgc291cmNlcyBmb3Igc3RyZWFtaW5nIHJhbmdlIDxyYW5nZT4gaW4ga2V5c3BhY2UgPG5hbWU+JworICAgICAgICBNYXA8U3RyaW5nLCBMb25nPiBkY0NvdW50cyA9IGNsdXN0ZXIuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChpIC0+IGkuY29uZmlnKCkubG9jYWxEYXRhY2VudGVyKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuZ3JvdXBpbmdCeShGdW5jdGlvbi5pZGVudGl0eSgpLCBDb2xsZWN0b3JzLmNvdW50aW5nKCkpKTsKKyAgICAgICAgU3RyaW5nIHJlcGxpY2EgPSAieydjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneSciOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExvbmc+IGUgOiBkY0NvdW50cy5lbnRyeVNldCgpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgZGMgPSBlLmdldEtleSgpOworICAgICAgICAgICAgaW50IHJmID0gTWF0aC5taW4oZS5nZXRWYWx1ZSgpLmludFZhbHVlKCksIDMpOworICAgICAgICAgICAgcmVwbGljYSArPSAiLCAnIiArIGRjICsgIic6ICIgKyByZjsKKyAgICAgICAgfQorICAgICAgICByZXBsaWNhICs9ICJ9IjsKICAgICAgICAgZm9yIChTdHJpbmcga3MgOiBBcnJheXMuYXNMaXN0KCJzeXN0ZW1fYXV0aCIsICJzeXN0ZW1fdHJhY2VzIikpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKCJBTFRFUiBLRVlTUEFDRSAiICsga3MgKyAiIFdJVEggUkVQTElDQVRJT04gPSB7J2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3Rvcic6ICIgKyBNYXRoLm1pbihjbHVzdGVyLnNpemUoKSwgMykgKyAifSIpOworICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoIkFMVEVSIEtFWVNQQUNFICIgKyBrcyArICIgV0lUSCBSRVBMSUNBVElPTiA9ICIgKyByZXBsaWNhKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGluIHJlYWwgbGl2ZSByZXBhaXIgaXMgbmVlZGVkIGluIHRoaXMgY2FzZSwgYnV0IGluIHRoZSB0ZXN0IGNhc2UgaXQgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHRhYmxlcyBsb29zZQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1RpbWVvdXRBYm9ydFRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9UaW1lb3V0QWJvcnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ5NjUzMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9UaW1lb3V0QWJvcnRUZXN0LmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuQ29uc2lzdGVuY3lMZXZlbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfUkVBRF9JVEVSQVRJT05fREVMQVlfTVM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5wc2phdmEudXRpbC5Bc3NlcnRTdGF0dXMuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIFRpbWVvdXRBYm9ydFRlc3QgZXh0ZW5kcyBUZXN0QmFzZUltcGwKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRpbWVvdXRUZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgVEVTVF9SRUFEX0lURVJBVElPTl9ERUxBWV9NUy5zZXRJbnQoNTAwMCk7CisgICAgICAgIHRyeSAoQ2x1c3RlciBjbHVzdGVyID0gaW5pdChDbHVzdGVyLmJ1aWxkKDEpLnN0YXJ0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoImNyZWF0ZSB0YWJsZSAlcy50YmwgKGlkIGludCwgY2sxIGludCwgY2syIGludCwgZCBpbnQsIHByaW1hcnkga2V5IChpZCwgY2sxLCBjazIpKSIpKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoImRlbGV0ZSBmcm9tICVzLnRibCB1c2luZyB0aW1lc3RhbXAgNSB3aGVyZSBpZCA9IDEgYW5kIGNrMSA9IDc3ICIpLCBDb25zaXN0ZW5jeUxldmVsLkFMTCk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5mbHVzaChLRVlTUEFDRSk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQorICAgICAgICAgICAgICAgIGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoImluc2VydCBpbnRvICVzLnRibCAoaWQsIGNrMSwgY2syLCBkKSB2YWx1ZXMgKDEsNzcsPywxKSB1c2luZyB0aW1lc3RhbXAgMTAiKSwgQ29uc2lzdGVuY3lMZXZlbC5BTEwsIGkpOworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkuZmx1c2goS0VZU1BBQ0UpOworICAgICAgICAgICAgYm9vbGVhbiBjYXVnaHRFeGNlcHRpb24gPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoInNlbGVjdCAqIGZyb20gJXMudGJsIHdoZXJlIGlkPTEgYW5kIGNrMSA9IDc3IiksIENvbnNpc3RlbmN5TGV2ZWwuQUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuY29udGFpbnMoIlJlYWRUaW1lb3V0RXhjZXB0aW9uIikpOworICAgICAgICAgICAgICAgIGNhdWdodEV4Y2VwdGlvbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNhdWdodEV4Y2VwdGlvbik7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gZXJyb3JzID0gY2x1c3Rlci5nZXQoMSkubG9ncygpLmdyZXBGb3JFcnJvcnMoKS5nZXRSZXN1bHQoKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGVycm9ycy50b1N0cmluZygpLCBlcnJvcnMuc3RyZWFtKCkuYW55TWF0Y2gocyAtPiBzLmNvbnRhaW5zKCJvcGVuIFJUIGJvdW5kIikpKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvVXBkYXRlU3lzdGVtQXV0aEFmdGVyRENFeHBhbnNpb25UZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvVXBkYXRlU3lzdGVtQXV0aEFmdGVyRENFeHBhbnNpb25UZXN0LmphdmEKaW5kZXggODc2NTA2Ny4uNTMxM2NlZSAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1VwZGF0ZVN5c3RlbUF1dGhBZnRlckRDRXhwYW5zaW9uVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9VcGRhdGVTeXN0ZW1BdXRoQWZ0ZXJEQ0V4cGFuc2lvblRlc3QuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IGphdmEudXRpbC5VVUlEOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5Db25kaXRpb247CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpAQCAtNDQsNiArNDUsNyBAQAogCiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTlVURVM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguQXV0aEtleXNwYWNlLlJPTEVTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlNVUEVSVVNFUl9TRVRVUF9ERUxBWV9NUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmUuR09TU0lQOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZS5ORVRXT1JLOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuQXNzZXJ0VXRpbHMuYXNzZXJ0Um93czsKQEAgLTExMyw3ICsxMTUsNyBAQAogICAgIHsKICAgICAgICAgLy8gcmVkdWNlIHRoZSB0aW1lIGZyb20gMTBzIHRvIHByZXZlbnQgIkNhbm5vdCBwcm9jZXNzIHJvbGUgcmVsYXRlZCBxdWVyeSBhcyB0aGUgcm9sZSBtYW5hZ2VyIGlzbid0IHlldCBzZXR1cC4iCiAgICAgICAgIC8vIGV4Y2VwdGlvbiBmcm9tIENhc3NhbmRyYVJvbGVNYW5hZ2VyCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnN1cGVydXNlcl9zZXR1cF9kZWxheV9tcyIsICIwIik7CisgICAgICAgIFNVUEVSVVNFUl9TRVRVUF9ERUxBWV9NUy5zZXRMb25nKDApOwogICAgICAgICBUZXN0QmFzZUltcGwuYmVmb3JlQ2xhc3MoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9VcGdyYWRlU1NUYWJsZXNUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvVXBncmFkZVNTVGFibGVzVGVzdC5qYXZhCmluZGV4IGVlODlhODEuLjJiZGNhZjEgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9VcGdyYWRlU1NUYWJsZXNUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1VwZ3JhZGVTU1RhYmxlc1Rlc3QuamF2YQpAQCAtMTksMjIgKzE5LDIwOSBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0OwogCiBpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0YWJsZUZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgbmV0LmJ5dGVidWRkeS5CeXRlQnVkZHk7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5keW5hbWljLmxvYWRpbmcuQ2xhc3NMb2FkaW5nU3RyYXRlZ3k7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5pbXBsZW1lbnRhdGlvbi5NZXRob2REZWxlZ2F0aW9uOworaW1wb3J0IG5ldC5ieXRlYnVkZHkuaW1wbGVtZW50YXRpb24uYmluZC5hbm5vdGF0aW9uLlN1cGVyQ2FsbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkFjdGl2ZUNvbXBhY3Rpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklDbHVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSW52b2thYmxlSW5zdGFuY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkxvZ0FjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CisKK2ltcG9ydCBzdGF0aWMgbmV0LmJ5dGVidWRkeS5tYXRjaGVyLkVsZW1lbnRNYXRjaGVycy5uYW1lZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5Db3VudERvd25MYXRjaC5uZXdDb3VudERvd25MYXRjaDsKIAogcHVibGljIGNsYXNzIFVwZ3JhZGVTU1RhYmxlc1Rlc3QgZXh0ZW5kcyBUZXN0QmFzZUltcGwKIHsKICAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHVwZ3JhZGVTU1RhYmxlc0ludGVycnVwdHNPbmdvaW5nQ29tcGFjdGlvbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRyeSAoSUNsdXN0ZXI8SUludm9rYWJsZUluc3RhbmNlPiBjbHVzdGVyID0gaW5pdChidWlsZGVyKCkud2l0aE5vZGVzKDEpLnN0YXJ0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiQ1JFQVRFIFRBQkxFICIgKyBLRVlTUEFDRSArICIudGJsIChwayBpbnQsIGNrIGludCwgdiB0ZXh0LCBQUklNQVJZIEtFWSAocGssIGNrKSk7Iik7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5hY2NlcHRzT25JbnN0YW5jZSgoU3RyaW5nIGtzKSAtPiB7CisgICAgICAgICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gS2V5c3BhY2Uub3BlbihrcykuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoInRibCIpOworICAgICAgICAgICAgICAgIGNmcy5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5zZXRNYXhpbXVtQ29tcGFjdG9yVGhyZWFkcygxKTsKKyAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5zZXRDb3JlQ29tcGFjdG9yVGhyZWFkcygxKTsKKyAgICAgICAgICAgIH0pLmFjY2VwdChLRVlTUEFDRSk7CisKKyAgICAgICAgICAgIFN0cmluZyBibG9iID0gImJsb2IiOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgICAgICAgICAgYmxvYiArPSBibG9iOworCisgICAgICAgICAgICBmb3IgKGludCBjbnQgPSAwOyBjbnQgPCA1OyBjbnQrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2x1c3Rlci5jb29yZGluYXRvcigxKS5leGVjdXRlKCJJTlNFUlQgSU5UTyAiICsgS0VZU1BBQ0UgKyAiLnRibCAocGssIGNrLCB2KSBWQUxVRVMgKD8sPyw/KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zaXN0ZW5jeUxldmVsLlFVT1JVTSwgKGNudCAqIDEwMDApICsgaSwgaSwgYmxvYik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sKCJmbHVzaCIsIEtFWVNQQUNFLCAidGJsIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExvZ0FjdGlvbiBsb2dBY3Rpb24gPSBjbHVzdGVyLmdldCgxKS5sb2dzKCk7CisgICAgICAgICAgICBsb2dBY3Rpb24ubWFyaygpOworICAgICAgICAgICAgRnV0dXJlPD8+IGZ1dHVyZSA9IGNsdXN0ZXIuZ2V0KDEpLmFzeW5jQWNjZXB0c09uSW5zdGFuY2UoKFN0cmluZyBrcykgLT4geworICAgICAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oa3MpLmdldENvbHVtbkZhbWlseVN0b3JlKCJ0YmwiKTsKKyAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5zdWJtaXRNYXhpbWFsKGNmcywgRkJVdGlsaXRpZXMubm93SW5TZWNvbmRzKCksIGZhbHNlLCBPcGVyYXRpb25UeXBlLkNPTVBBQ1RJT04pOworICAgICAgICAgICAgfSkuYXBwbHkoS0VZU1BBQ0UpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBjbHVzdGVyLmdldCgxKS5ub2RldG9vbCgidXBncmFkZXNzdGFibGVzIiwgIi1hIiwgS0VZU1BBQ0UsICJ0YmwiKSk7CisgICAgICAgICAgICBmdXR1cmUuZ2V0KCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobG9nQWN0aW9uLmdyZXAoIkNvbXBhY3Rpb24gaW50ZXJydXB0ZWQiKS5nZXRSZXN1bHQoKS5pc0VtcHR5KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjb21wYWN0aW9uRG9lc05vdENhbmNlbFVwZ3JhZGVTU1RhYmxlcygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRyeSAoSUNsdXN0ZXI8SUludm9rYWJsZUluc3RhbmNlPiBjbHVzdGVyID0gaW5pdChidWlsZGVyKCkud2l0aE5vZGVzKDEpLnN0YXJ0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiQ1JFQVRFIFRBQkxFICIgKyBLRVlTUEFDRSArICIudGJsIChwayBpbnQsIGNrIGludCwgdiB0ZXh0LCBQUklNQVJZIEtFWSAocGssIGNrKSk7Iik7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5hY2NlcHRzT25JbnN0YW5jZSgoU3RyaW5nIGtzKSAtPiB7CisgICAgICAgICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gS2V5c3BhY2Uub3BlbihrcykuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoInRibCIpOworICAgICAgICAgICAgICAgIGNmcy5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5zZXRNYXhpbXVtQ29tcGFjdG9yVGhyZWFkcygxKTsKKyAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5zZXRDb3JlQ29tcGFjdG9yVGhyZWFkcygxKTsKKyAgICAgICAgICAgIH0pLmFjY2VwdChLRVlTUEFDRSk7CisKKyAgICAgICAgICAgIFN0cmluZyBibG9iID0gImJsb2IiOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgICAgICAgICAgYmxvYiArPSBibG9iOworCisgICAgICAgICAgICBmb3IgKGludCBjbnQgPSAwOyBjbnQgPCA1OyBjbnQrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2x1c3Rlci5jb29yZGluYXRvcigxKS5leGVjdXRlKCJJTlNFUlQgSU5UTyAiICsgS0VZU1BBQ0UgKyAiLnRibCAocGssIGNrLCB2KSBWQUxVRVMgKD8sPyw/KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zaXN0ZW5jeUxldmVsLlFVT1JVTSwgKGNudCAqIDEwMDApICsgaSwgaSwgYmxvYik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sKCJmbHVzaCIsIEtFWVNQQUNFLCAidGJsIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExvZ0FjdGlvbiBsb2dBY3Rpb24gPSBjbHVzdGVyLmdldCgxKS5sb2dzKCk7CisgICAgICAgICAgICBsb2dBY3Rpb24ubWFyaygpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBjbHVzdGVyLmdldCgxKS5ub2RldG9vbCgidXBncmFkZXNzdGFibGVzIiwgIi1hIiwgS0VZU1BBQ0UsICJ0YmwiKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobG9nQWN0aW9uLndhdGNoRm9yKCJDb21wYWN0aW5nIikuZ2V0UmVzdWx0KCkuaXNFbXB0eSgpKTsKKworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkuYWNjZXB0c09uSW5zdGFuY2UoKFN0cmluZyBrcykgLT4geworICAgICAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oa3MpLmdldENvbHVtbkZhbWlseVN0b3JlKCJ0YmwiKTsKKyAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5hbGxPZihDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5zdWJtaXRNYXhpbWFsKGNmcywgRkJVdGlsaXRpZXMubm93SW5TZWNvbmRzKCksIGZhbHNlLCBPcGVyYXRpb25UeXBlLkNPTVBBQ1RJT04pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF3YWl0VW5pbnRlcnJ1cHRpYmx5KDEsIFRpbWVVbml0Lk1JTlVURVMpOworCisgICAgICAgICAgICB9KS5hY2NlcHQoS0VZU1BBQ0UpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobG9nQWN0aW9uLmdyZXAoIkNvbXBhY3Rpb24gaW50ZXJydXB0ZWQiKS5nZXRSZXN1bHQoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGxvZ0FjdGlvbi5ncmVwKCJGaW5pc2hlZCBVcGdyYWRlIHNzdGFibGVzIikuZ2V0UmVzdWx0KCkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShsb2dBY3Rpb24uZ3JlcCgiQ29tcGFjdGVkICguKikgNSBzc3RhYmxlcyB0byIpLmdldFJlc3VsdCgpLmlzRW1wdHkoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNsZWFudXBEb2VzTm90SW50ZXJydXB0VXBncmFkZVNTVGFibGVzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgdHJ5IChJQ2x1c3RlcjxJSW52b2thYmxlSW5zdGFuY2U+IGNsdXN0ZXIgPSBpbml0KGJ1aWxkZXIoKS53aXRoTm9kZXMoMSkud2l0aEluc3RhbmNlSW5pdGlhbGl6ZXIoQkI6Omluc3RhbGwpLnN0YXJ0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiQ1JFQVRFIFRBQkxFICIgKyBLRVlTUEFDRSArICIudGJsIChwayBpbnQsIGNrIGludCwgdiB0ZXh0LCBQUklNQVJZIEtFWSAocGssIGNrKSk7Iik7CisKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLmFjY2VwdHNPbkluc3RhbmNlKChTdHJpbmcga3MpIC0+IHsKKyAgICAgICAgICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKGtzKS5nZXRDb2x1bW5GYW1pbHlTdG9yZSgidGJsIik7CisgICAgICAgICAgICAgICAgY2ZzLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICAgICAgfSkuYWNjZXB0KEtFWVNQQUNFKTsKKworICAgICAgICAgICAgU3RyaW5nIGJsb2IgPSAiYmxvYiI7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgICAgICAgICBibG9iICs9IGJsb2I7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUoIklOU0VSVCBJTlRPICIgKyBLRVlTUEFDRSArICIudGJsIChwaywgY2ssIHYpIFZBTFVFUyAoPyw/LD8pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3lMZXZlbC5RVU9SVU0sIGksIGksIGJsb2IpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5ub2RldG9vbCgiZmx1c2giLCBLRVlTUEFDRSwgInRibCIpOworCisgICAgICAgICAgICBMb2dBY3Rpb24gbG9nQWN0aW9uID0gY2x1c3Rlci5nZXQoMSkubG9ncygpOworICAgICAgICAgICAgbG9nQWN0aW9uLm1hcmsoKTsKKworICAgICAgICAgICAgLy8gU3RhcnQgdXBncmFkaW5nc3N0YWJsZXMgLSB1c2UgQkIgdG8gcGF1c2Ugb25jZSBpbnNpZGUgQWN0aXZlQ29tcGFjdGlvbnMuYmVnaW5Db21wYWN0aW9uCisgICAgICAgICAgICBUaHJlYWQgdXBncmFkZVRocmVhZCA9IG5ldyBUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sKCJ1cGdyYWRlc3N0YWJsZXMiLCAiLWEiLCBLRVlTUEFDRSwgInRibCIpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB1cGdyYWRlVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjbHVzdGVyLmdldCgxKS5jYWxsT25JbnN0YW5jZSgoKSAtPiBCQi5zdGFydGluZy5hd2FpdFVuaW50ZXJydXB0aWJseSgxLCBUaW1lVW5pdC5NSU5VVEVTKSkpOworCisgICAgICAgICAgICAvLyBTdGFydCBhIHNjcnViIGFuZCBtYWtlIHN1cmUgdGhhdCBpdCBmYWlscywgbG9nIGNoZWNrIGxhdGVyIHRvIG1ha2Ugc3VyZSBpdCB3YXMKKyAgICAgICAgICAgIC8vIGJlY2F1c2UgaXQgY2Fubm90IGNhbmNlbCB0aGUgYWN0aXZlIHVwZ3JhZGUgc3N0YWJsZXMKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnROb3RFcXVhbHMoMCwgY2x1c3Rlci5nZXQoMSkubm9kZXRvb2woInNjcnViIiwgS0VZU1BBQ0UsICJ0YmwiKSk7CisKKyAgICAgICAgICAgIC8vIE5vdyByZXN1bWUgdGhlIHVwZ3JhZGUgc3N0YWJsZXMgc28gdGVzdCBjYW4gc2h1dCBkb3duCisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5ydW5Pbkluc3RhbmNlKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBCQi5zdGFydC5kZWNyZW1lbnQoKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgdXBncmFkZVRocmVhZC5qb2luKCk7CisKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShsb2dBY3Rpb24uZ3JlcCgiVW5hYmxlIHRvIGNhbmNlbCBpbi1wcm9ncmVzcyBjb21wYWN0aW9ucywgc2luY2UgdGhleSdyZSBydW5uaW5nIHdpdGggaGlnaGVyIG9yIHNhbWUgcHJpb3JpdHk6IFVwZ3JhZGUgc3N0YWJsZXMiKS5nZXRSZXN1bHQoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGxvZ0FjdGlvbi5ncmVwKCJTdGFydGluZyBTY3J1YiBmb3IgIikuZ2V0UmVzdWx0KCkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShsb2dBY3Rpb24uZ3JlcCgiRmluaXNoZWQgVXBncmFkZSBzc3RhYmxlcyBmb3IgZGlzdHJpYnV0ZWRfdGVzdF9rZXlzcGFjZS50Ymwgc3VjY2Vzc2Z1bGx5IikuZ2V0UmVzdWx0KCkuaXNFbXB0eSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdHJ1bmNhdGVXaGlsZVVwZ3JhZGluZygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRyeSAoSUNsdXN0ZXI8SUludm9rYWJsZUluc3RhbmNlPiBjbHVzdGVyID0gaW5pdChidWlsZGVyKCkud2l0aE5vZGVzKDEpLnN0YXJ0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkNSRUFURSBUQUJMRSAlcy50YmwgKHBrIGludCwgY2sgaW50LCB2IHRleHQsIFBSSU1BUlkgS0VZIChwaywgY2spKSAiKSk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5hY2NlcHRzT25JbnN0YW5jZSgoU3RyaW5nIGtzKSAtPiB7CisgICAgICAgICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gS2V5c3BhY2Uub3BlbihrcykuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoInRibCIpOworICAgICAgICAgICAgICAgIGNmcy5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5zZXRNYXhpbXVtQ29tcGFjdG9yVGhyZWFkcygxKTsKKyAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5zZXRDb3JlQ29tcGFjdG9yVGhyZWFkcygxKTsKKyAgICAgICAgICAgIH0pLmFjY2VwdChLRVlTUEFDRSk7CisKKyAgICAgICAgICAgIFN0cmluZyBibG9iID0gImJsb2IiOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKQorICAgICAgICAgICAgICAgIGJsb2IgKz0gYmxvYjsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDA7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJJTlNFUlQgSU5UTyAlcy50YmwgKHBrLCBjaywgdikgVkFMVUVTICg/LD8sPykiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3lMZXZlbC5RVU9SVU0sIGksIGksIGJsb2IpOworICAgICAgICAgICAgICAgIGlmIChpID4gMCAmJiBpICUgMTAwID09IDApCisgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sKCJmbHVzaCIsIEtFWVNQQUNFLCAidGJsIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExvZ0FjdGlvbiBsb2dBY3Rpb24gPSBjbHVzdGVyLmdldCgxKS5sb2dzKCk7CisgICAgICAgICAgICBsb2dBY3Rpb24ubWFyaygpOworCisgICAgICAgICAgICBGdXR1cmU8Pz4gdXBncmFkZSA9IENvbXBsZXRhYmxlRnV0dXJlLnJ1bkFzeW5jKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5ub2RldG9vbCgidXBncmFkZXNzdGFibGVzIiwgIi1hIiwgS0VZU1BBQ0UsICJ0YmwiKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIlRSVU5DQVRFICVzLnRibCIpKTsKKyAgICAgICAgICAgIHVwZ3JhZGUuZ2V0KCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobG9nQWN0aW9uLmdyZXAoIkNvbXBhY3Rpb24gaW50ZXJydXB0ZWQiKS5nZXRSZXN1bHQoKS5pc0VtcHR5KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCByZXdyaXRlU1NUYWJsZXNUZXN0KCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKICAgICAgICAgdHJ5IChJQ2x1c3RlcjxJSW52b2thYmxlSW5zdGFuY2U+IGNsdXN0ZXIgPSBidWlsZGVyKCkud2l0aE5vZGVzKDEpLndpdGhEYXRhRGlyQ291bnQoMSkuc3RhcnQoKSkKQEAgLTc0LDcgKzI2MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjZnMuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgdGJsIDogY2ZzLmdldExpdmVTU1RhYmxlcygpKQogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFRzID0gTWF0aC5tYXgobWF4VHMsIHRibC5nZXRDcmVhdGlvblRpbWVGb3IoQ29tcG9uZW50LkRBVEEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhUcyA9IE1hdGgubWF4KG1heFRzLCB0YmwuZ2V0RGF0YUNyZWF0aW9uVGltZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXhUczsKICAgICAgICAgICAgICAgICAgICAgfSkuYXBwbHkoS0VZU1BBQ0UpOwpAQCAtOTYsNyArMjgzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBsaXZlU1NUYWJsZXMuc2l6ZSgpID09IDIgOiBTdHJpbmcuZm9ybWF0KCJFeHBlY3RlZCAyIHNzdGFibGVzLCBidXQgZ290ICIgKyBsaXZlU1NUYWJsZXMuc2l6ZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciB0YmwgOiBsaXZlU1NUYWJsZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRibC5nZXRDcmVhdGlvblRpbWVGb3IoQ29tcG9uZW50LkRBVEEpIDw9IG1heFRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YmwuZ2V0RGF0YUNyZWF0aW9uVGltZSgpIDw9IG1heFRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcHBlZCsrOwpAQCAtMTE1LDQgKzMwMiwzOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCQgorICAgIHsKKyAgICAgICAgLy8gV2lsbCBiZSBpbml0aWFsaXplZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgaW5zdGFuY2UgY2xhc3MgbG9hZGVyCisgICAgICAgIHN0YXRpYyBDb3VudERvd25MYXRjaCBzdGFydGluZyA9IG5ld0NvdW50RG93bkxhdGNoKDEpOworICAgICAgICBzdGF0aWMgQ291bnREb3duTGF0Y2ggc3RhcnQgPSBuZXdDb3VudERvd25MYXRjaCgxKTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zdGFsbChDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgSW50ZWdlciBudW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIG5ldyBCeXRlQnVkZHkoKS5yZWJhc2UoQWN0aXZlQ29tcGFjdGlvbnMuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWV0aG9kKG5hbWVkKCJiZWdpbkNvbXBhY3Rpb24iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnRlcmNlcHQoTWV0aG9kRGVsZWdhdGlvbi50byhCQi5jbGFzcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFrZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubG9hZChjbGFzc0xvYWRlciwgQ2xhc3NMb2FkaW5nU3RyYXRlZ3kuRGVmYXVsdC5JTkpFQ1RJT04pOworICAgICAgICB9CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWdpbkNvbXBhY3Rpb24oQ29tcGFjdGlvbkluZm8uSG9sZGVyIGNpLCBAU3VwZXJDYWxsIENhbGxhYmxlPFZvaWQ+IHp1cGVyQ2FsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgenVwZXJDYWxsLmNhbGwoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2kuZ2V0Q29tcGFjdGlvbkluZm8oKS5nZXRUYXNrVHlwZSgpID09IE9wZXJhdGlvblR5cGUuVVBHUkFERV9TU1RBQkxFUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nLmRlY3JlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShzdGFydC5hd2FpdFVuaW50ZXJydXB0aWJseSgxLCBUaW1lVW5pdC5NSU5VVEVTKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1ZpcnR1YWxUYWJsZUxvZ3NUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvVmlydHVhbFRhYmxlTG9nc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWVmNGRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1ZpcnR1YWxUYWJsZUxvZ3NUZXN0LmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGNoLnFvcy5sb2diYWNrLmNsYXNzaWMuTGV2ZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbC5Mb2dNZXNzYWdlc1RhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWwuTG9nTWVzc2FnZXNUYWJsZS5Mb2dNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLkNsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5TaW1wbGVRdWVyeVJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5sb2dnaW5nLlZpcnR1YWxUYWJsZUFwcGVuZGVyOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkxPR0JBQ0tfQ09ORklHVVJBVElPTl9GSUxFOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsLkxvZ01lc3NhZ2VzVGFibGUuTEVWRUxfQ09MVU1OX05BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWwuTG9nTWVzc2FnZXNUYWJsZS5MT0dHRVJfQ09MVU1OX05BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWwuTG9nTWVzc2FnZXNUYWJsZS5NRVNTQUdFX0NPTFVNTl9OQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsLkxvZ01lc3NhZ2VzVGFibGUuT1JERVJfSU5fTUlMTElTRUNPTkRfQ09MVU1OX05BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWwuTG9nTWVzc2FnZXNUYWJsZS5USU1FU1RBTVBfQ09MVU1OX05BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Db25zaXN0ZW5jeUxldmVsLk9ORTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitwdWJsaWMgY2xhc3MgVmlydHVhbFRhYmxlTG9nc1Rlc3QgZXh0ZW5kcyBUZXN0QmFzZUltcGwKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWVGFibGVPdXRwdXQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICB0cnkgKFdpdGhQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgV2l0aFByb3BlcnRpZXMoKS5zZXQoTE9HQkFDS19DT05GSUdVUkFUSU9OX0ZJTEUsICJ0ZXN0L2NvbmYvbG9nYmFjay1kdGVzdF93aXRoX3Z0YWJsZV9hcHBlbmRlci54bWwiKTsKKyAgICAgICAgICAgICBDbHVzdGVyIGNsdXN0ZXIgPSBDbHVzdGVyLmJ1aWxkKDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uZmlnKGMgLT4gYy53aXRoKEZlYXR1cmUudmFsdWVzKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnQoKTsKKyAgICAgICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIExpc3Q8VGVzdGluZ0xvZ01lc3NhZ2U+IHJvd3MgPSBnZXRSb3dzKGNsdXN0ZXIpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2Uocm93cy5pc0VtcHR5KCkpOworCisgICAgICAgICAgICByb3dzLmZvckVhY2gobWVzc2FnZSAtPiBhc3NlcnRUcnVlKExldmVsLnRvTGV2ZWwobWVzc2FnZS5sZXZlbCkuaXNHcmVhdGVyT3JFcXVhbChMZXZlbC5JTkZPKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVBcHBlbmRlcnNGYWlsVG9TdGFydE5vZGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBMT0dCQUNLX0NPTkZJR1VSQVRJT05fRklMRS5zZXRTdHJpbmcoInRlc3QvY29uZi9sb2diYWNrLWR0ZXN0X3dpdGhfdnRhYmxlX2FwcGVuZGVyX2ludmFsaWQueG1sIik7CisKKyAgICAgICAgLy8gTk9URTogQmVjYXVzZSBjbHVzdGVyIHN0YXJ0dXAgaXMgZXhwZWN0ZWQgdG8gZmFpbCBpbiB0aGlzIGNhc2UsIGFuZCBjYW4gbGVhdmUgdGhpbmdzIGluIGEgd2VpcmQgc3RhdGUKKyAgICAgICAgLy8gZm9yIHRoZSBuZXh0IHN0YXRlLCBjcmVhdGUgd2l0aG91dCBzdGFydGluZywgYW5kIHNldCBmYWlsdXJlIGFzIHNodXRkb3duIHRvIGZhbHNlLAorICAgICAgICAvLyBzbyB0aGUgdHJ5LXdpdGgtcmVzb3VyY2VzIGNhbiBjbG9zZSBpbnN0YW5jZXMgcHJvcGVybHkuCisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChMT0dCQUNLX0NPTkZJR1VSQVRJT05fRklMRSwgInRlc3QvY29uZi9sb2diYWNrLWR0ZXN0X3dpdGhfdnRhYmxlX2FwcGVuZGVyX2ludmFsaWQueG1sIik7CisgICAgICAgICAgICAgQ2x1c3RlciBjbHVzdGVyID0gQ2x1c3Rlci5idWlsZCgxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjIC0+IGMud2l0aChGZWF0dXJlLnZhbHVlcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KENvbnN0YW50cy5LRVlfRFRFU1RfQVBJX1NUQVJUVVBfRkFJTFVSRV9BU19TSFVURE9XTiwgZmFsc2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlV2l0aG91dFN0YXJ0aW5nKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsdXN0ZXIuc3RhcnR1cCgpOworICAgICAgICAgICAgZmFpbCgiTm9kZSBzaG91bGQgbm90IHN0YXJ0IGFzIHRoZXJlIGlzIHN1cHBvc2VkIHRvIGJlIGludmFsaWQgbG9nYmFjayBjb25maWd1cmF0aW9uIGZpbGUuIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZvcm1hdCgiVGhlcmUgYXJlIG11bHRpcGxlIGFwcGVuZGVycyBvZiBjbGFzcyAlcyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mIG5hbWVzIENRTExPRyxDUUxMT0cyLiBUaGVyZSBpcyBvbmx5IG9uZSBhcHBlbmRlciBvZiBzdWNoIGNsYXNzIGFsbG93ZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlydHVhbFRhYmxlQXBwZW5kZXIuY2xhc3MuZ2V0TmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PFRlc3RpbmdMb2dNZXNzYWdlPiBnZXRSb3dzKENsdXN0ZXIgY2x1c3RlcikKKyAgICB7CisgICAgICAgIFNpbXBsZVF1ZXJ5UmVzdWx0IHNpbXBsZVF1ZXJ5UmVzdWx0ID0gY2x1c3Rlci5jb29yZGluYXRvcigxKS5leGVjdXRlV2l0aFJlc3VsdChxdWVyeSgic2VsZWN0ICogZnJvbSAlcyIpLCBPTkUpOworICAgICAgICBMaXN0PFRlc3RpbmdMb2dNZXNzYWdlPiByb3dzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHNpbXBsZVF1ZXJ5UmVzdWx0LmZvckVhY2hSZW1haW5pbmcocm93IC0+IHsKKyAgICAgICAgICAgIGxvbmcgdGltZXN0YW1wID0gcm93LmdldFRpbWVzdGFtcChUSU1FU1RBTVBfQ09MVU1OX05BTUUpLmdldFRpbWUoKTsKKyAgICAgICAgICAgIFN0cmluZyBsb2dnZXIgPSByb3cuZ2V0U3RyaW5nKExPR0dFUl9DT0xVTU5fTkFNRSk7CisgICAgICAgICAgICBTdHJpbmcgbGV2ZWwgPSByb3cuZ2V0U3RyaW5nKExFVkVMX0NPTFVNTl9OQU1FKTsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gcm93LmdldFN0cmluZyhNRVNTQUdFX0NPTFVNTl9OQU1FKTsKKyAgICAgICAgICAgIGludCBvcmRlciA9IHJvdy5nZXRJbnRlZ2VyKE9SREVSX0lOX01JTExJU0VDT05EX0NPTFVNTl9OQU1FKTsKKyAgICAgICAgICAgIFRlc3RpbmdMb2dNZXNzYWdlIGxvZ01lc3NhZ2UgPSBuZXcgVGVzdGluZ0xvZ01lc3NhZ2UodGltZXN0YW1wLCBsb2dnZXIsIGxldmVsLCBtZXNzYWdlLCBvcmRlcik7CisgICAgICAgICAgICByb3dzLmFkZChsb2dNZXNzYWdlKTsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiByb3dzOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5KFN0cmluZyB0ZW1wbGF0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBmb3JtYXQodGVtcGxhdGUsIGdldFRhYmxlTmFtZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRUYWJsZU5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZvcm1hdCgiJXMuJXMiLCBTY2hlbWFDb25zdGFudHMuVklSVFVBTF9WSUVXUywgTG9nTWVzc2FnZXNUYWJsZS5UQUJMRV9OQU1FKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0aW5nTG9nTWVzc2FnZSBleHRlbmRzIExvZ01lc3NhZ2UKKyAgICB7CisgICAgICAgIHByaXZhdGUgaW50IG9yZGVyOworCisgICAgICAgIHB1YmxpYyBUZXN0aW5nTG9nTWVzc2FnZShsb25nIHRpbWVzdGFtcCwgU3RyaW5nIGxvZ2dlciwgU3RyaW5nIGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgaW50IG9yZGVyKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcih0aW1lc3RhbXAsIGxvZ2dlciwgbGV2ZWwsIG1lc3NhZ2UpOworICAgICAgICAgICAgdGhpcy5vcmRlciA9IG9yZGVyOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L2NkYy9Ub2dnbGVDRENPblJlcGFpckVuYWJsZWRUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvY2RjL1RvZ2dsZUNEQ09uUmVwYWlyRW5hYmxlZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTljZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L2NkYy9Ub2dnbGVDRENPblJlcGFpckVuYWJsZWRUZXN0LmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LmNkYzsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nU2VnbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3QuVGVzdEJhc2VJbXBsOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5Bc3NlcnRVdGlscy5hc3NlcnRSb3dzOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuQXNzZXJ0VXRpbHMuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLkFzc2VydFV0aWxzLnJvdzsKKworcHVibGljIGNsYXNzIFRvZ2dsZUNEQ09uUmVwYWlyRW5hYmxlZFRlc3QgZXh0ZW5kcyBUZXN0QmFzZUltcGwKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDRENPblJlcGFpcklzRW5hYmxlZCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRlc3RDRENPblJlcGFpckVuYWJsZWQodHJ1ZSwgY2x1c3RlciAtPiB7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgyKS5ydW5Pbkluc3RhbmNlKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBib29sZWFuIGNvbnRhaW5DRENJbkxvZyA9IENvbW1pdExvZy5pbnN0YW5jZS5zZWdtZW50TWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBY3RpdmVTZWdtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFueU1hdGNoKHMgLT4gcy5nZXRDRENTdGF0ZSgpID09IENvbW1pdExvZ1NlZ21lbnQuQ0RDU3RhdGUuQ09OVEFJTlMpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIk11dGF0aW9uIHNob3VsZCBiZSBhZGRlZCB0byBjb21taXQgbG9nIHdoZW4gY2RjX29uX3JlcGFpcl9lbmFibGVkIGlzIHRydWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbkNEQ0luTG9nKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDRENPblJlcGFpcklzRGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICB0ZXN0Q0RDT25SZXBhaXJFbmFibGVkKGZhbHNlLCBjbHVzdGVyIC0+IHsKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDIpLnJ1bk9uSW5zdGFuY2UoKCkgLT4geworICAgICAgICAgICAgICAgIGJvb2xlYW4gY29udGFpbkNEQ0luTG9nID0gQ29tbWl0TG9nLmluc3RhbmNlLnNlZ21lbnRNYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFjdGl2ZVNlZ21lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWxsTWF0Y2gocyAtPiBzLmdldENEQ1N0YXRlKCkgIT0gQ29tbWl0TG9nU2VnbWVudC5DRENTdGF0ZS5DT05UQUlOUyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gbXV0YXRpb24gc2hvdWxkIGJlIGFkZGVkIHRvIGNvbW1pdCBsb2cgd2hlbiBjZGNfb25fcmVwYWlyX2VuYWJsZWQgaXMgZmFsc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbkNEQ0luTG9nKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvLyB0ZXN0IGhlbHBlciB0byByZXBhaXIgZGF0YSBiZXR3ZWVuIG5vZGVzIHdoZW4gY2RjX29uX3JlcGFpcl9lbmFibGVkIGlzIG9uIG9yIG9mZi4KKyAgICBwcml2YXRlIHZvaWQgdGVzdENEQ09uUmVwYWlyRW5hYmxlZChib29sZWFuIGVuYWJsZWQsIENvbnN1bWVyPENsdXN0ZXI+IGFzc2VydGlvbikgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBpbml0KENsdXN0ZXIuYnVpbGQoMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjIC0+IGMuc2V0KCJjZGNfZW5hYmxlZCIsIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgiY2RjX29uX3JlcGFpcl9lbmFibGVkIiwgZW5hYmxlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aChGZWF0dXJlLk5FVFdPUkspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGgoRmVhdHVyZS5HT1NTSVApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgJXMudGJsIChrIElOVCBQUklNQVJZIEtFWSwgdiBJTlQpIFdJVEggY2RjPXRydWUiKSk7CisKKyAgICAgICAgICAgIC8vIERhdGEgb25seSBpbiBub2RlMQorICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkuZXhlY3V0ZUludGVybmFsKHdpdGhLZXlzcGFjZSgiSU5TRVJUIElOVE8gJXMudGJsIChrLCB2KSBWQUxVRVMgKDEsIDEpIikpOworICAgICAgICAgICAgT2JqZWN0W11bXSByZXN1bHQgPSBjbHVzdGVyLmdldCgxKS5leGVjdXRlSW50ZXJuYWwod2l0aEtleXNwYWNlKCJTRUxFQ1QgKiBGUk9NICVzLnRibCBXSEVSRSBrID0gMSIpKTsKKyAgICAgICAgICAgIGFzc2VydFJvd3MocmVzdWx0LCByb3coMSwgMSkpOworICAgICAgICAgICAgcmVzdWx0ID0gY2x1c3Rlci5nZXQoMikuZXhlY3V0ZUludGVybmFsKHdpdGhLZXlzcGFjZSgiU0VMRUNUICogRlJPTSAlcy50YmwgV0hFUkUgayA9IDEiKSk7CisgICAgICAgICAgICBhc3NlcnRSb3dzKHJlc3VsdCk7CisKKyAgICAgICAgICAgIC8vIHJlcGFpcgorICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkuZmx1c2goS0VZU1BBQ0UpOworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMikubm9kZXRvb2woInJlcGFpciIsIEtFWVNQQUNFLCAidGJsIik7CisKKyAgICAgICAgICAgIC8vIHZlcmlmeSBub2RlMiBub3cgaGF2ZSBkYXRhCisgICAgICAgICAgICByZXN1bHQgPSBjbHVzdGVyLmdldCgyKS5leGVjdXRlSW50ZXJuYWwod2l0aEtleXNwYWNlKCJTRUxFQ1QgKiBGUk9NICVzLnRibCBXSEVSRSBrID0gMSIpKTsKKyAgICAgICAgICAgIGFzc2VydFJvd3MocmVzdWx0LCByb3coMSwgMSkpOworCisgICAgICAgICAgICBhc3NlcnRpb24uYWNjZXB0KGNsdXN0ZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L2d1YXJkcmFpbHMvR3VhcmRyYWlsUGFydGl0aW9uU2l6ZVRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9ndWFyZHJhaWxzL0d1YXJkcmFpbFBhcnRpdGlvblNpemVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlZThkNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9ndWFyZHJhaWxzL0d1YXJkcmFpbFBhcnRpdGlvblNpemVUZXN0LmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5ndWFyZHJhaWxzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHMuR3VhcmRyYWlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Db25zaXN0ZW5jeUxldmVsOworCitpbXBvcnQgc3RhdGljIGphdmEubmlvLkJ5dGVCdWZmZXIuYWxsb2NhdGU7CisKKy8qKgorICogVGVzdHMgdGhlIGd1YXJkcmFpbCBmb3IgdGhlIHNpemUgb2YgcGFydGl0aW9uIHNpemUsIHtAbGluayBHdWFyZHJhaWxzI3BhcnRpdGlvblNpemV9LgorICogPHA+CisgKiBUaGlzIHRlc3Qgb25seSBpbmNsdWRlcyB0aGUgYWN0aXZhdGlvbiBvZiB0aGUgZ3VhcmRyYWlsIGR1cmluZyBzc3RhYmxlIHdyaXRlcywgZm9jdXNpbmcgb24gdGhlIGVtbWl0dGVkIGxvZyBtZXNzYWdlcy4KKyAqIFRoZSB0ZXN0cyBmb3IgY29uZmlnLCBjbGllbnQgd2FybmluZ3MgYW5kIGRpYWdub3N0aWMgZXZlbnRzIGFyZSBpbgorICoge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHMuR3VhcmRyYWlsUGFydGl0aW9uU2l6ZVRlc3R9LgorICovCitwdWJsaWMgY2xhc3MgR3VhcmRyYWlsUGFydGl0aW9uU2l6ZVRlc3QgZXh0ZW5kcyBHdWFyZHJhaWxUZXN0ZXIKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FSTl9USFJFU0hPTEQgPSAxMDI0ICogMTAyNDsgLy8gYnl0ZXMgKDEgTWlCKQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGQUlMX1RIUkVTSE9MRCA9IFdBUk5fVEhSRVNIT0xEICogMjsgLy8gYnl0ZXMgKDIgTWlCKQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9OT0RFUyA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9DTFVTVEVSSU5HUyA9IDU7CisKKyAgICBwcml2YXRlIHN0YXRpYyBDbHVzdGVyIGNsdXN0ZXI7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXBDbHVzdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBjbHVzdGVyID0gaW5pdChDbHVzdGVyLmJ1aWxkKE5VTV9OT0RFUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uZmlnKGMgLT4gYy5zZXQoInBhcnRpdGlvbl9zaXplX3dhcm5fdGhyZXNob2xkIiwgV0FSTl9USFJFU0hPTEQgKyAiQiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJwYXJ0aXRpb25fc2l6ZV9mYWlsX3RocmVzaG9sZCIsIEZBSUxfVEhSRVNIT0xEICsgIkIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgiY29tcGFjdGlvbl9sYXJnZV9wYXJ0aXRpb25fd2FybmluZ190aHJlc2hvbGQiLCAiOTk5R2lCIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoIm1lbXRhYmxlX2hlYXBfc3BhY2UiLCAiNTEyTWlCIikpIC8vIGF2b2lkcyBmbHVzaGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnQoKSk7CisgICAgICAgIGNsdXN0ZXIuZGlzYWJsZUF1dG9Db21wYWN0aW9uKEtFWVNQQUNFKTsKKyAgICB9CisKKyAgICBAQWZ0ZXJDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyZG93bkNsdXN0ZXIoKQorICAgIHsKKyAgICAgICAgaWYgKGNsdXN0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIGNsdXN0ZXIuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQ2x1c3RlciBnZXRDbHVzdGVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjbHVzdGVyOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcnRpdGlvblNpemUoKQorICAgIHsKKyAgICAgICAgdGVzdFBhcnRpdGlvblNpemUoV0FSTl9USFJFU0hPTEQsIEZBSUxfVEhSRVNIT0xEKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJ0aXRpb25TaXplV2l0aER5bmFtaWNVcGRhdGUoKQorICAgIHsKKyAgICAgICAgaW50IHdhcm4gPSBXQVJOX1RIUkVTSE9MRCAqIDI7CisgICAgICAgIGludCBmYWlsID0gRkFJTF9USFJFU0hPTEQgKiAyOworICAgICAgICBjbHVzdGVyLmdldCgxKS5ydW5Pbkluc3RhbmNlKCgpIC0+IEd1YXJkcmFpbHMuaW5zdGFuY2Uuc2V0UGFydGl0aW9uU2l6ZVRocmVzaG9sZCh3YXJuICsgIkIiLCBmYWlsICsgIkIiKSk7CisgICAgICAgIHRlc3RQYXJ0aXRpb25TaXplKHdhcm4sIGZhaWwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0UGFydGl0aW9uU2l6ZShpbnQgd2FybiwgaW50IGZhaWwpCisgICAgeworICAgICAgICBzY2hlbWFDaGFuZ2UoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQsIGMgaW50LCB2IGJsb2IsIFBSSU1BUlkgS0VZIChrLCBjKSkiKTsKKworICAgICAgICAvLyBlbXB0eSB0YWJsZQorICAgICAgICBhc3NlcnROb3RXYXJuZWRPbkZsdXNoKCk7CisgICAgICAgIGFzc2VydE5vdFdhcm5lZE9uQ29tcGFjdCgpOworCisgICAgICAgIC8vIGtlZXAgcGFydGl0aW9uIHNpemUgbG93ZXIgdGhhbiB0aHJlc2hvbGRzCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDEsIDEsID8pIiwgYWxsb2NhdGUoMSkpOworICAgICAgICBhc3NlcnROb3RXYXJuZWRPbkZsdXNoKCk7CisgICAgICAgIGFzc2VydE5vdFdhcm5lZE9uQ29tcGFjdCgpOworCisgICAgICAgIC8vIGV4Y2VlZCB3YXJuIHRocmVzaG9sZAorICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IE5VTV9DTFVTVEVSSU5HUzsgYysrKQorICAgICAgICB7CisgICAgICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYywgdikgVkFMVUVTICgxLCA/LCA/KSIsIGMsIGFsbG9jYXRlKHdhcm4gLyBOVU1fQ0xVU1RFUklOR1MpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRXYXJuZWRPbkZsdXNoKGV4cGVjdGVkTWVzc2FnZXMoMSkpOworICAgICAgICBhc3NlcnRXYXJuZWRPbkNvbXBhY3QoZXhwZWN0ZWRNZXNzYWdlcygxKSk7CisKKyAgICAgICAgLy8gZXhjZWVkIGZhaWwgdGhyZXNob2xkCisgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgTlVNX0NMVVNURVJJTkdTICogMTA7IGMrKykKKyAgICAgICAgeworICAgICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGMsIHYpIFZBTFVFUyAoMSwgPywgPykiLCBjLCBhbGxvY2F0ZShmYWlsIC8gTlVNX0NMVVNURVJJTkdTKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RmFpbGVkT25GbHVzaChleHBlY3RlZE1lc3NhZ2VzKDEpKTsKKyAgICAgICAgYXNzZXJ0RmFpbGVkT25Db21wYWN0KGV4cGVjdGVkTWVzc2FnZXMoMSkpOworCisgICAgICAgIC8vIHJlbW92ZSBtb3N0IG9mIHRoZSBkYXRhIHRvIGJlIHVuZGVyIHRoZSB0aHJlc2hvbGQgYWdhaW4KKyAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgayA9IDEgQU5EIGMgPiAxIik7CisgICAgICAgIGFzc2VydE5vdFdhcm5lZE9uRmx1c2goKTsKKyAgICAgICAgYXNzZXJ0Tm90V2FybmVkT25Db21wYWN0KCk7CisKKyAgICAgICAgLy8gZXhjZWVkIHdhcm4gdGhyZXNob2xkIGluIG11bHRpcGxlIHBhcnRpdGlvbnMKKyAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBOVU1fQ0xVU1RFUklOR1M7IGMrKykKKyAgICAgICAgeworICAgICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGMsIHYpIFZBTFVFUyAoMSwgPywgPykiLCBjLCBhbGxvY2F0ZSh3YXJuIC8gTlVNX0NMVVNURVJJTkdTKSk7CisgICAgICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYywgdikgVkFMVUVTICgyLCA/LCA/KSIsIGMsIGFsbG9jYXRlKHdhcm4gLyBOVU1fQ0xVU1RFUklOR1MpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRXYXJuZWRPbkZsdXNoKGV4cGVjdGVkTWVzc2FnZXMoMSwgMikpOworICAgICAgICBhc3NlcnRXYXJuZWRPbkNvbXBhY3QoZXhwZWN0ZWRNZXNzYWdlcygxLCAyKSk7CisKKyAgICAgICAgLy8gZXhjZWVkIHdhcm4gdGhyZXNob2xkIGluIGEgbmV3IHBhcnRpdGlvbgorICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IE5VTV9DTFVTVEVSSU5HUzsgYysrKQorICAgICAgICB7CisgICAgICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYywgdikgVkFMVUVTICgzLCA/LCA/KSIsIGMsIGFsbG9jYXRlKHdhcm4gLyBOVU1fQ0xVU1RFUklOR1MpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRXYXJuZWRPbkZsdXNoKGV4cGVjdGVkTWVzc2FnZXMoMykpOworICAgICAgICBhc3NlcnRXYXJuZWRPbkNvbXBhY3QoZXhwZWN0ZWRNZXNzYWdlcygxLCAyLCAzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGUoU3RyaW5nIHF1ZXJ5LCBPYmplY3QuLi4gYXJncykKKyAgICB7CisgICAgICAgIGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZShmb3JtYXQocXVlcnkpLCBDb25zaXN0ZW5jeUxldmVsLkFMTCwgYXJncyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBleHBlY3RlZE1lc3NhZ2VzKGludC4uLiBrZXlzKQorICAgIHsKKyAgICAgICAgU3RyaW5nW10gbWVzc2FnZXMgPSBuZXcgU3RyaW5nW2tleXMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgbWVzc2FnZXNbaV0gPSBTdHJpbmcuZm9ybWF0KCJHdWFyZHJhaWwgcGFydGl0aW9uX3NpemUgdmlvbGF0ZWQ6IFBhcnRpdGlvbiAlczolZCIsIHF1YWxpZmllZFRhYmxlTmFtZSwga2V5c1tpXSk7CisgICAgICAgIHJldHVybiBtZXNzYWdlczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvaG9zdHJlcGxhY2VtZW50L0ZhaWxlZEJvb3RzdHJhcFRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9ob3N0cmVwbGFjZW1lbnQvRmFpbGVkQm9vdHN0cmFwVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOGU0MjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvaG9zdHJlcGxhY2VtZW50L0ZhaWxlZEJvb3RzdHJhcFRlc3QuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0Lmhvc3RyZXBsYWNlbWVudDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBuZXQuYnl0ZWJ1ZGR5LkJ5dGVCdWRkeTsKK2ltcG9ydCBuZXQuYnl0ZWJ1ZGR5LmR5bmFtaWMubG9hZGluZy5DbGFzc0xvYWRpbmdTdHJhdGVneTsKK2ltcG9ydCBuZXQuYnl0ZWJ1ZGR5LmltcGxlbWVudGF0aW9uLk1ldGhvZERlbGVnYXRpb247CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5pbXBsZW1lbnRhdGlvbi5iaW5kLmFubm90YXRpb24uU3VwZXJDYWxsOworaW1wb3J0IG5ldC5ieXRlYnVkZHkuaW1wbGVtZW50YXRpb24uYmluZC5hbm5vdGF0aW9uLlRoaXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5DYXNzYW5kcmFSb2xlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSW52b2thYmxlSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLk5vZGVUb29sUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Ub2tlblN1cHBsaWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3QuVGVzdEJhc2VJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2xpZW50UmVxdWVzdHNNZXRyaWNzSG9sZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbVJlc3VsdEZ1dHVyZTsKK2ltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOworaW1wb3J0IG9yZy5hd2FpdGlsaXR5LkF3YWl0aWxpdHk7CisKK2ltcG9ydCBzdGF0aWMgbmV0LmJ5dGVidWRkeS5tYXRjaGVyLkVsZW1lbnRNYXRjaGVycy5uYW1lZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TVVBFUlVTRVJfU0VUVVBfREVMQVlfTVM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5DbHVzdGVyVXRpbHMucmVwbGFjZUhvc3RBbmRTdGFydDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLkNsdXN0ZXJVdGlscy5zdG9wVW5jaGVja2VkOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0Lmhvc3RyZXBsYWNlbWVudC5Ib3N0UmVwbGFjZW1lbnRUZXN0LnNldHVwQ2x1c3RlcjsKKworcHVibGljIGNsYXNzIEZhaWxlZEJvb3RzdHJhcFRlc3QgZXh0ZW5kcyBUZXN0QmFzZUltcGwKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRmFpbGVkQm9vdHN0cmFwVGVzdC5jbGFzcyk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9ERV9UT19SRU1PVkUgPSAyOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByb2xlU2V0dXBEb2VzTm90UHJvZHVjZVVuYXZhaWxhYmxlcygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQ2x1c3Rlci5CdWlsZGVyIGJ1aWxkZXIgPSBDbHVzdGVyLmJ1aWxkKDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uZmlnKGMgLT4gYy53aXRoKEZlYXR1cmUudmFsdWVzKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEluc3RhbmNlSW5pdGlhbGl6ZXIoQkI6Omluc3RhbGwpOworICAgICAgICBUb2tlblN1cHBsaWVyIGV2ZW4gPSBUb2tlblN1cHBsaWVyLmV2ZW5seURpc3RyaWJ1dGVkVG9rZW5zKDMsIGJ1aWxkZXIuZ2V0VG9rZW5Db3VudCgpKTsKKyAgICAgICAgYnVpbGRlciA9IGJ1aWxkZXIud2l0aFRva2VuU3VwcGxpZXIoKFRva2VuU3VwcGxpZXIpIG5vZGUgLT4gZXZlbi50b2tlbnMobm9kZSA9PSA0ID8gTk9ERV9UT19SRU1PVkUgOiBub2RlKSk7CisgICAgICAgIHRyeSAoQ2x1c3RlciBjbHVzdGVyID0gYnVpbGRlci5zdGFydCgpKQorICAgICAgICB7CisgICAgICAgICAgICBMaXN0PElJbnZva2FibGVJbnN0YW5jZT4gYWxpdmUgPSBBcnJheXMuYXNMaXN0KGNsdXN0ZXIuZ2V0KDEpLCBjbHVzdGVyLmdldCgzKSk7CisgICAgICAgICAgICBJSW52b2thYmxlSW5zdGFuY2Ugbm9kZVRvUmVtb3ZlID0gY2x1c3Rlci5nZXQoTk9ERV9UT19SRU1PVkUpOworCisgICAgICAgICAgICBzZXR1cENsdXN0ZXIoY2x1c3Rlcik7CisKKyAgICAgICAgICAgIHN0b3BVbmNoZWNrZWQobm9kZVRvUmVtb3ZlKTsKKworICAgICAgICAgICAgLy8gc2hvdWxkIGZhaWwgdG8gam9pbiwgYnV0IHNob3VsZCBzdGFydCB1cCEKKyAgICAgICAgICAgIElJbnZva2FibGVJbnN0YW5jZSBhZGRlZCA9IHJlcGxhY2VIb3N0QW5kU3RhcnQoY2x1c3Rlciwgbm9kZVRvUmVtb3ZlLCBwIC0+IHAuc2V0KFNVUEVSVVNFUl9TRVRVUF9ERUxBWV9NUywgIjEiKSk7CisgICAgICAgICAgICAvLyBsb2cgZ29zc2lwIGZvciBkZWJ1Z2dpbmcKKyAgICAgICAgICAgIGFsaXZlLmZvckVhY2goaSAtPiB7CisgICAgICAgICAgICAgICAgTm9kZVRvb2xSZXN1bHQgcmVzdWx0ID0gaS5ub2RldG9vbFJlc3VsdCgiZ29zc2lwaW5mbyIpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hc3NlcnRzKCkuc3VjY2VzcygpOworICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJnb3NzaXBpbmZvIGZvciBub2Rle31cbnt9IiwgaS5jb25maWcoKS5udW0oKSwgcmVzdWx0LmdldFN0ZG91dCgpKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAvLyBDYXNzYW5kcmFSb2xlTWFuYWdlciBhdHRlbXB0ZWQgdG8gZG8gZGlzdHJpYnV0ZWQgcmVhZHMgd2hpbGUgYm9vdHN0cmFwIHdhcyBzdGlsbCBnb2luZyAoaXQgZmFpbGVkLCBzbyBzdGlsbCBpbiBib290c3RyYXAgbW9kZSkKKyAgICAgICAgICAgIC8vIHNvIG5lZWQgdG8gdmFsaWRhdGUgdGhhdCBpcyBubyBsb25nZXIgaGFwcGVuaW5nIGFuZCB3ZSBpbmNyZW1lbnRpbmcgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DbGllbnRSZXF1ZXN0TWV0cmljcy51bmF2YWlsYWJsZXMKKyAgICAgICAgICAgIC8vIHNsZWVwIGxhcmdlciB0aGFuIG11bHRpcGxlIHJldHJ5IGF0dGVtcHRzLi4uCisgICAgICAgICAgICBBd2FpdGlsaXR5LmF3YWl0KCkKKyAgICAgICAgICAgICAgICAgICAgICAuYXRNb3N0KDEsIFRpbWVVbml0Lk1JTlVURVMpCisgICAgICAgICAgICAgICAgICAgICAgLnVudGlsKCgpIC0+IGFkZGVkLmNhbGxPbkluc3RhbmNlKCgpIC0+IEJCLlNFVFVQX1NDSEVEVUxFX0NPVU5URVIuZ2V0KCkpID49IDQyKTsgLy8gd2h5IDQyPyAganVzdCBuZWVkIHNvbWV0aGluZyBsYXJnZSBlbm91Z2ggdG8gbWFrZSBzdXJlIG11bHRpcGxlIGF0dGVtcHRzIGhhcHBlbmVkCisKKyAgICAgICAgICAgIC8vIGRvIHdlIGhhdmUgYW55IHJlYWQgbWV0cmljcyBoYXZlIHVuYXZhaWxhYmxlcz8KKyAgICAgICAgICAgIGFkZGVkLnJ1bk9uSW5zdGFuY2UoKCkgLT4geworICAgICAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChDbGllbnRSZXF1ZXN0c01ldHJpY3NIb2xkZXIucmVhZE1ldHJpY3MudW5hdmFpbGFibGVzLmdldENvdW50KCkpLmRlc2NyaWJlZEFzKCJyZWFkIHVuYXZhaWxhYmxlcyIpLmlzRXF1YWxUbygwKTsKKyAgICAgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoQ2xpZW50UmVxdWVzdHNNZXRyaWNzSG9sZGVyLmNhc1JlYWRNZXRyaWNzLnVuYXZhaWxhYmxlcy5nZXRDb3VudCgpKS5kZXNjcmliZWRBcygiQ0FTIHJlYWQgdW5hdmFpbGFibGVzIikuaXNFcXVhbFRvKDApOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJCCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zdGFsbChDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgSW50ZWdlciBudW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChudW0gIT0gNCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIG5ldyBCeXRlQnVkZHkoKS5yZWJhc2UoU3RyZWFtUmVzdWx0RnV0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1ldGhvZChuYW1lZCgibWF5YmVDb21wbGV0ZSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludGVyY2VwdChNZXRob2REZWxlZ2F0aW9uLnRvKEJCLmNsYXNzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKGNsYXNzTG9hZGVyLCBDbGFzc0xvYWRpbmdTdHJhdGVneS5EZWZhdWx0LklOSkVDVElPTik7CisKKyAgICAgICAgICAgIG5ldyBCeXRlQnVkZHkoKS5yZWJhc2UoQ2Fzc2FuZHJhUm9sZU1hbmFnZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWV0aG9kKG5hbWVkKCJzY2hlZHVsZVNldHVwVGFzayIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludGVyY2VwdChNZXRob2REZWxlZ2F0aW9uLnRvKEJCLmNsYXNzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKGNsYXNzTG9hZGVyLCBDbGFzc0xvYWRpbmdTdHJhdGVneS5EZWZhdWx0LklOSkVDVElPTik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWF5YmVDb21wbGV0ZShAVGhpcyBTdHJlYW1SZXN1bHRGdXR1cmUgZnV0dXJlKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBmdXR1cmUuZ2V0Q2xhc3MoKS5nZXRTdXBlcmNsYXNzKCkuZ2V0U3VwZXJjbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKCJ0cnlGYWlsdXJlIiwgVGhyb3dhYmxlLmNsYXNzKTsKKyAgICAgICAgICAgIG1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICAgICAgbWV0aG9kLmludm9rZShmdXR1cmUsIG5ldyBTdHJlYW1FeGNlcHRpb24oZnV0dXJlLmdldEN1cnJlbnRTdGF0ZSgpLCAiU3RyZWFtIGZhaWxlZCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgU0VUVVBfU0NIRURVTEVfQ09VTlRFUiA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2NoZWR1bGVTZXR1cFRhc2soZmluYWwgQ2FsbGFibGU8Pz4gc2V0dXBUYXNrLCBAU3VwZXJDYWxsIFJ1bm5hYmxlIGZuKQorICAgICAgICB7CisgICAgICAgICAgICBTRVRVUF9TQ0hFRFVMRV9DT1VOVEVSLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgZm4ucnVuKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvaG9zdHJlcGxhY2VtZW50L0hvc3RSZXBsYWNlbWVudFRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9ob3N0cmVwbGFjZW1lbnQvSG9zdFJlcGxhY2VtZW50VGVzdC5qYXZhCmluZGV4IDNkZTBiZjUuLjgyMTlkNDMgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9ob3N0cmVwbGFjZW1lbnQvSG9zdFJlcGxhY2VtZW50VGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9ob3N0cmVwbGFjZW1lbnQvSG9zdFJlcGxhY2VtZW50VGVzdC5qYXZhCkBAIC0zNSw2ICszNSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLlNpbXBsZVF1ZXJ5UmVzdWx0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Ub2tlblN1cHBsaWVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5Bc3NlcnRVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuQ2x1c3RlclV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3QuVGVzdEJhc2VJbXBsOwogaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CiAKQEAgLTIxMCw2ICsyMTEsOCBAQAogICAgICAgICBmaXhEaXN0cmlidXRlZFNjaGVtYXMoY2x1c3Rlcik7CiAgICAgICAgIGluaXQoY2x1c3Rlcik7CiAKKyAgICAgICAgQ2x1c3RlclV0aWxzLmF3YWl0R29zc2lwU2NoZW1hTWF0Y2goY2x1c3Rlcik7CisKICAgICAgICAgcG9wdWxhdGUoY2x1c3Rlcik7CiAgICAgICAgIGNsdXN0ZXIuZm9yRWFjaChpIC0+IGkuZmx1c2goS0VZU1BBQ0UpKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvbWV0cmljL1RhYmxlTWV0cmljVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L21ldHJpYy9UYWJsZU1ldHJpY1Rlc3QuamF2YQppbmRleCA2NzI1NDk0Li41OGEzZmVlIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvbWV0cmljL1RhYmxlTWV0cmljVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9tZXRyaWMvVGFibGVNZXRyaWNUZXN0LmphdmEKQEAgLTQ5LDcgKzQ5LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFjaW5nLlRyYWNlS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTUJlYW5XcmFwcGVyOwogCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSVNfRElTQUJMRURfTUJFQU5fUkVHSVNUUkFUSU9OOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk9SR19BUEFDSEVfQ0FTU0FORFJBX0RJU0FCTEVfTUJFQU5fUkVHSVNUUkFUSU9OOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk1CRUFOX1JFR0lTVFJBVElPTl9DTEFTUzsKIAogcHVibGljIGNsYXNzIFRhYmxlTWV0cmljVGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbApAQCAtNTcsNyArNTcsNyBAQAogICAgIHN0YXRpYwogICAgIHsKICAgICAgICAgTUJFQU5fUkVHSVNUUkFUSU9OX0NMQVNTLnNldFN0cmluZyhNYXBNQmVhbldyYXBwZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgSVNfRElTQUJMRURfTUJFQU5fUkVHSVNUUkFUSU9OLnNldEJvb2xlYW4oZmFsc2UpOworICAgICAgICBPUkdfQVBBQ0hFX0NBU1NBTkRSQV9ESVNBQkxFX01CRUFOX1JFR0lTVFJBVElPTi5zZXRCb29sZWFuKGZhbHNlKTsKICAgICB9CiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PiBTWVNURU1fVEFCTEVTID0gbnVsbDsKICAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBUQUJMRV9NRVRSSUNfTkFNRVMgPSBJbW11dGFibGVTZXQub2YoIldyaXRlTGF0ZW5jeSIpOwpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L21ldHJpY3MvUmVxdWVzdFRpbWVvdXRUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvbWV0cmljcy9SZXF1ZXN0VGltZW91dFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzk5ZmNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L21ldHJpY3MvUmVxdWVzdFRpbWVvdXRUZXN0LmphdmEKQEAgLTAsMCArMSwyNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5tZXRyaWNzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG5ldC5ieXRlYnVkZHkuQnl0ZUJ1ZGR5OworaW1wb3J0IG5ldC5ieXRlYnVkZHkuZHluYW1pYy5sb2FkaW5nLkNsYXNzTG9hZGluZ1N0cmF0ZWd5OworaW1wb3J0IG5ldC5ieXRlYnVkZHkuaW1wbGVtZW50YXRpb24uTWV0aG9kRGVsZWdhdGlvbjsKK2ltcG9ydCBuZXQuYnl0ZWJ1ZGR5LmltcGxlbWVudGF0aW9uLmJpbmQuYW5ub3RhdGlvbi5TdXBlckNhbGw7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5pbXBsZW1lbnRhdGlvbi5iaW5kLmFubm90YXRpb24uU3VwZXJNZXRob2Q7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5pbXBsZW1lbnRhdGlvbi5iaW5kLmFubm90YXRpb24uVGhpczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc3RhdGVtZW50cy5CYXRjaFN0YXRlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Db25zaXN0ZW5jeUxldmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3QuVGVzdEJhc2VJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuUmVxdWVzdEZhaWx1cmVSZWFzb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2luZ1NlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlJlcXVlc3RDYWxsYmFjazsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Bc3NlcnRpb25VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNhc1dyaXRlVGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlJlYWRUaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuV3JpdGVUaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5WZXJiOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UucGF4b3MuUGF4b3M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5Bd2FpdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5Db25kaXRpb247CitpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKKworaW1wb3J0IHN0YXRpYyBuZXQuYnl0ZWJ1ZGR5Lm1hdGNoZXIuRWxlbWVudE1hdGNoZXJzLm5hbWVkOworaW1wb3J0IHN0YXRpYyBuZXQuYnl0ZWJ1ZGR5Lm1hdGNoZXIuRWxlbWVudE1hdGNoZXJzLnRha2VzQXJndW1lbnRzOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Bc3NlcnRpb25VdGlscy5pc1Rocm93YWJsZTsKKworcHVibGljIGNsYXNzIFJlcXVlc3RUaW1lb3V0VGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbAoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgTkVYVCA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPT1JESU5BVE9SID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBDbHVzdGVyIENMVVNURVI7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQ0xVU1RFUiA9IENsdXN0ZXIuYnVpbGQoMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjIC0+IGMuc2V0KCJ0cnVuY2F0ZV9yZXF1ZXN0X3RpbWVvdXQiLCAiMTBzIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhJbnN0YW5jZUluaXRpYWxpemVyKEJCOjppbnN0YWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydCgpOworICAgICAgICBpbml0KENMVVNURVIpOworICAgICAgICBDTFVTVEVSLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkNSRUFURSBUQUJMRSAlcy50YmwgKHBrIGludCBQUklNQVJZIEtFWSwgdiBpbnQpIikpOworICAgIH0KKworICAgIEBBZnRlckNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFudXAoKQorICAgIHsKKyAgICAgICAgaWYgKENMVVNURVIgIT0gbnVsbCkKKyAgICAgICAgICAgIENMVVNURVIuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgYmVmb3JlKCkKKyAgICB7CisgICAgICAgIENMVVNURVIuZ2V0KENPT1JESU5BVE9SKS5ydW5Pbkluc3RhbmNlKCgpIC0+IE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS5jYWxsYmFja3MudW5zYWZlQ2xlYXIoKSk7CisgICAgICAgIENMVVNURVIuZmlsdGVycygpLnJlc2V0KCk7CisgICAgICAgIEJCLnJlc2V0KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnQoKQorICAgIHsKKyAgICAgICAgQ0xVU1RFUi5maWx0ZXJzKCkudmVyYnMoVmVyYi5NVVRBVElPTl9SRVEuaWQpLnRvKDIpLmRyb3AoKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gQ0xVU1RFUi5jb29yZGluYXRvcihDT09SRElOQVRPUikuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnRibCAocGssIHYpIFZBTFVFUyAoPywgPykiKSwgQ29uc2lzdGVuY3lMZXZlbC5BTEwsIE5FWFQuZ2V0QW5kSW5jcmVtZW50KCksIE5FWFQuZ2V0QW5kSW5jcmVtZW50KCkpKQorICAgICAgICAgICAgICAgICAgLmlzKGlzVGhyb3dhYmxlKFdyaXRlVGltZW91dEV4Y2VwdGlvbi5jbGFzcykpOworICAgICAgICBCQi5hc3NlcnRJc1RpbWVvdXRUcnVlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGUoKQorICAgIHsKKyAgICAgICAgQ0xVU1RFUi5maWx0ZXJzKCkudmVyYnMoVmVyYi5NVVRBVElPTl9SRVEuaWQpLnRvKDIpLmRyb3AoKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gQ0xVU1RFUi5jb29yZGluYXRvcihDT09SRElOQVRPUikuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlVQREFURSAlcy50YmwgU0VUIHY9PyBXSEVSRSBwaz0/IiksIENvbnNpc3RlbmN5TGV2ZWwuQUxMLCBORVhULmdldEFuZEluY3JlbWVudCgpLCBORVhULmdldEFuZEluY3JlbWVudCgpKSkKKyAgICAgICAgICAgICAgICAgIC5pcyhpc1Rocm93YWJsZShXcml0ZVRpbWVvdXRFeGNlcHRpb24uY2xhc3MpKTsKKyAgICAgICAgQkIuYXNzZXJ0SXNUaW1lb3V0VHJ1ZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYmF0Y2hJbnNlcnQoKQorICAgIHsKKyAgICAgICAgQ0xVU1RFUi5maWx0ZXJzKCkudmVyYnMoVmVyYi5NVVRBVElPTl9SRVEuaWQpLnRvKDIpLmRyb3AoKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gQ0xVU1RFUi5jb29yZGluYXRvcihDT09SRElOQVRPUikuZXhlY3V0ZShiYXRjaCh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnRibCAocGssIHYpIFZBTFVFUyAoPywgPykiKSksIENvbnNpc3RlbmN5TGV2ZWwuQUxMLCBORVhULmdldEFuZEluY3JlbWVudCgpLCBORVhULmdldEFuZEluY3JlbWVudCgpKSkKKyAgICAgICAgICAgICAgICAgIC5pcyhpc1Rocm93YWJsZShXcml0ZVRpbWVvdXRFeGNlcHRpb24uY2xhc3MpKTsKKyAgICAgICAgQkIuYXNzZXJ0SXNUaW1lb3V0VHJ1ZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmFuZ2VTZWxlY3QoKQorICAgIHsKKyAgICAgICAgQ0xVU1RFUi5maWx0ZXJzKCkudmVyYnMoVmVyYi5SQU5HRV9SRVEuaWQpLnRvKDIpLmRyb3AoKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gQ0xVU1RFUi5jb29yZGluYXRvcihDT09SRElOQVRPUikuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlNFTEVDVCAqIEZST00gJXMudGJsIiksIENvbnNpc3RlbmN5TGV2ZWwuQUxMKSkKKyAgICAgICAgICAgICAgICAgIC5pcyhpc1Rocm93YWJsZShSZWFkVGltZW91dEV4Y2VwdGlvbi5jbGFzcykpOworICAgICAgICBCQi5hc3NlcnRJc1RpbWVvdXRUcnVlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzZWxlY3QoKQorICAgIHsKKyAgICAgICAgQ0xVU1RFUi5maWx0ZXJzKCkudmVyYnMoVmVyYi5SRUFEX1JFUS5pZCkudG8oMikuZHJvcCgpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXRUaHJvd25CeSgoKSAtPiBDTFVTVEVSLmNvb3JkaW5hdG9yKENPT1JESU5BVE9SKS5leGVjdXRlKHdpdGhLZXlzcGFjZSgiU0VMRUNUICogRlJPTSAlcy50YmwgV0hFUkUgcGs9PyIpLCBDb25zaXN0ZW5jeUxldmVsLkFMTCwgTkVYVC5nZXRBbmRJbmNyZW1lbnQoKSkpCisgICAgICAgICAgICAgICAgICAuaXMoaXNUaHJvd2FibGUoUmVhZFRpbWVvdXRFeGNlcHRpb24uY2xhc3MpKTsKKyAgICAgICAgQkIuYXNzZXJ0SXNUaW1lb3V0VHJ1ZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdHJ1bmNhdGUoKQorICAgIHsKKyAgICAgICAgQ0xVU1RFUi5maWx0ZXJzKCkudmVyYnMoVmVyYi5UUlVOQ0FURV9SRVEuaWQpLnRvKDIpLmRyb3AoKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gQ0xVU1RFUi5jb29yZGluYXRvcihDT09SRElOQVRPUikuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlRSVU5DQVRFICVzLnRibCIpLCBDb25zaXN0ZW5jeUxldmVsLkFMTCkpCisgICAgICAgICAgICAgICAgICAuaXMoQXNzZXJ0aW9uVXRpbHMucm9vdENhdXNlSXMoVGltZW91dEV4Y2VwdGlvbi5jbGFzcykpOworICAgICAgICBCQi5hc3NlcnRJc1RpbWVvdXRUcnVlKCk7CisgICAgfQorCisgICAgLy8gZG9uJ3QgY2FsbCBCQi5hc3NlcnRJc1RpbWVvdXRUcnVlKCk7IGZvciBDQVMsIGFzIGl0IGhhcyBpdHMgb3duIGxvZ2ljCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNhc1YyUHJlcGFyZUluc2VydCgpCisgICAgeworICAgICAgICB3aXRoUGF4b3MoQ29uZmlnLlBheG9zVmFyaWFudC52Mik7CisKKyAgICAgICAgQ0xVU1RFUi5maWx0ZXJzKCkudmVyYnMoVmVyYi5QQVhPUzJfUFJFUEFSRV9SRVEuaWQpLnRvKDIsIDMpLmRyb3AoKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gQ0xVU1RFUi5jb29yZGluYXRvcihDT09SRElOQVRPUikuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnRibCAocGssIHYpIFZBTFVFUyAoPywgPykgSUYgTk9UIEVYSVNUUyIpLCBDb25zaXN0ZW5jeUxldmVsLkFMTCwgTkVYVC5nZXRBbmRJbmNyZW1lbnQoKSwgTkVYVC5nZXRBbmRJbmNyZW1lbnQoKSkpCisgICAgICAgICAgICAgICAgICAuaXMoaXNUaHJvd2FibGUoQ2FzV3JpdGVUaW1lb3V0RXhjZXB0aW9uLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjYXNWMlByZXBhcmVTZWxlY3QoKQorICAgIHsKKyAgICAgICAgd2l0aFBheG9zKENvbmZpZy5QYXhvc1ZhcmlhbnQudjIpOworCisgICAgICAgIENMVVNURVIuZmlsdGVycygpLnZlcmJzKFZlcmIuUEFYT1MyX1BSRVBBUkVfUkVRLmlkKS50bygyLCAzKS5kcm9wKCk7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IENMVVNURVIuY29vcmRpbmF0b3IoQ09PUkRJTkFUT1IpLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJTRUxFQ1QgKiBGUk9NICVzLnRibCBXSEVSRSBwaz0/IiksIENvbnNpc3RlbmN5TGV2ZWwuU0VSSUFMLCBORVhULmdldEFuZEluY3JlbWVudCgpKSkKKyAgICAgICAgICAgICAgICAgIC5pcyhpc1Rocm93YWJsZShSZWFkVGltZW91dEV4Y2VwdGlvbi5jbGFzcykpOyAvLyB3aHkgZG9lcyB3cml0ZSBoYXZlIGl0cyBvd24gdHlwZSBidXQgbm90IHJlYWQ/CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjYXNWMkNvbW1pdEluc2VydCgpCisgICAgeworICAgICAgICB3aXRoUGF4b3MoQ29uZmlnLlBheG9zVmFyaWFudC52Mik7CisKKyAgICAgICAgQ0xVU1RFUi5maWx0ZXJzKCkudmVyYnMoVmVyYi5QQVhPU19DT01NSVRfUkVRLmlkKS50bygyLCAzKS5kcm9wKCk7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IENMVVNURVIuY29vcmRpbmF0b3IoQ09PUkRJTkFUT1IpLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJJTlNFUlQgSU5UTyAlcy50YmwgKHBrLCB2KSBWQUxVRVMgKD8sID8pIElGIE5PVCBFWElTVFMiKSwgQ29uc2lzdGVuY3lMZXZlbC5BTEwsIE5FWFQuZ2V0QW5kSW5jcmVtZW50KCksIE5FWFQuZ2V0QW5kSW5jcmVtZW50KCkpKQorICAgICAgICAgICAgICAgICAgLmlzKGlzVGhyb3dhYmxlKENhc1dyaXRlVGltZW91dEV4Y2VwdGlvbi5jbGFzcykpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd2l0aFBheG9zKENvbmZpZy5QYXhvc1ZhcmlhbnQgdmFyaWFudCkKKyAgICB7CisgICAgICAgIENMVVNURVIuZm9yRWFjaChpIC0+IGkucnVuT25JbnN0YW5jZSgoKSAtPiBQYXhvcy5zZXRQYXhvc1ZhcmlhbnQodmFyaWFudCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmF0Y2goU3RyaW5nIGNxbCkKKyAgICB7CisgICAgICAgIHJldHVybiAiQkVHSU4gIiArIEJhdGNoU3RhdGVtZW50LlR5cGUuVU5MT0dHRUQubmFtZSgpICsgIiBCQVRDSFxuIiArIGNxbCArICJcbkFQUExZIEJBVENIIjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJCCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zdGFsbChDbGFzc0xvYWRlciBjbCwgaW50IG51bSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG51bSAhPSBDT09SRElOQVRPUikKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBuZXcgQnl0ZUJ1ZGR5KCkucmViYXNlKENvbmRpdGlvbi5Bc3luYy5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tZXRob2QobmFtZWQoImF3YWl0IikuYW5kKHRha2VzQXJndW1lbnRzKDIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnRlcmNlcHQoTWV0aG9kRGVsZWdhdGlvbi50byhCQi5jbGFzcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFrZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubG9hZChjbCwgQ2xhc3NMb2FkaW5nU3RyYXRlZ3kuRGVmYXVsdC5JTkpFQ1RJT04pOworCisgICAgICAgICAgICBuZXcgQnl0ZUJ1ZGR5KCkucmViYXNlKFJlcXVlc3RDYWxsYmFjay5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tZXRob2QobmFtZWQoImlzVGltZW91dCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludGVyY2VwdChNZXRob2REZWxlZ2F0aW9uLnRvKEJCLmNsYXNzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKGNsLCBDbGFzc0xvYWRpbmdTdHJhdGVneS5EZWZhdWx0LklOSkVDVElPTik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYXdhaXQobG9uZyB0aW1lLCBUaW1lVW5pdCB1bml0cywgQFRoaXMgQXdhaXRhYmxlIHNlbGYsIEBTdXBlck1ldGhvZCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIHVuZGVybGluZSBjb25kaXRpb24gaXMgbWV0IGJlZm9yZSByZXR1cm5uaW5nIHRydWUKKyAgICAgICAgICAgIC8vIHRoaXMgd2F5IGl0cyBrbm93IHRoYXQgdGhlIHRpbWVvdXRzIHRyaWdnZXJlZCEKKyAgICAgICAgICAgIHdoaWxlICghKChib29sZWFuKSBtZXRob2QuaW52b2tlKHNlbGYsIHRpbWUsIHVuaXRzKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgVElNRU9VVFMgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVGltZW91dChNYXA8SW5ldEFkZHJlc3NBbmRQb3J0LCBSZXF1ZXN0RmFpbHVyZVJlYXNvbj4gZmFpbHVyZVJlYXNvbkJ5RW5kcG9pbnQsIEBTdXBlckNhbGwgQ2FsbGFibGU8Qm9vbGVhbj4gZm4pIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgYm9vbGVhbiB0aW1lb3V0ID0gZm4uY2FsbCgpOworICAgICAgICAgICAgaWYgKHRpbWVvdXQpCisgICAgICAgICAgICAgICAgVElNRU9VVFMuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICByZXR1cm4gdGltZW91dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRJc1RpbWVvdXRUcnVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHRpbWVvdXRzID0gQ0xVU1RFUi5nZXQoQ09PUkRJTkFUT1IpLmNhbGxPbkluc3RhbmNlKCgpIC0+IFRJTUVPVVRTLmdldEFuZFNldCgwKSk7CisgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodGltZW91dHMpLmlzR3JlYXRlclRoYW4oMCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXQoKQorICAgICAgICB7CisgICAgICAgICAgICBDTFVTVEVSLmdldChDT09SRElOQVRPUikucnVuT25JbnN0YW5jZSgoKSAtPiBUSU1FT1VUUy5zZXQoMCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3JpbmcvQm9vdHN0cmFwVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3JpbmcvQm9vdHN0cmFwVGVzdC5qYXZhCmluZGV4IDQyM2U3OGIuLmYzMWUzYTggMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9yaW5nL0Jvb3RzdHJhcFRlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvcmluZy9Cb290c3RyYXBUZXN0LmphdmEKQEAgLTE5LDE2ICsxOSwyNCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LnJpbmc7CiAKIGltcG9ydCBqYXZhLmxhbmcubWFuYWdlbWVudC5NYW5hZ2VtZW50RmFjdG9yeTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uSW50U3RyZWFtOwogCiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkFzc3VtcHRpb25WaW9sYXRlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU3lzdGVtS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Db25zaXN0ZW5jeUxldmVsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JQ2x1c3RlcjsKQEAgLTM2LDkgKzQ0LDE0IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklJbnZva2FibGVJbnN0YW5jZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuVG9rZW5TdXBwbGllcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuTmV0d29ya1RvcG9sb2d5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5XaXRoUHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LlRlc3RCYXNlSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOwogCiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5BcnJheXMuYXNMaXN0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkpPSU5fUklORzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5NSUdSQVRJT05fREVMQVk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUkVTRVRfQk9PVFNUUkFQX1BST0dSRVNTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hY3Rpb24uR29zc2lwSGVscGVyLmJvb3RzdHJhcDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYWN0aW9uLkdvc3NpcEhlbHBlci5wdWxsU2NoZW1hRnJvbTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYWN0aW9uLkdvc3NpcEhlbHBlci5zdGF0dXNUb0Jvb3RzdHJhcDsKQEAgLTUwLDYgKzYzLDggQEAKIHsKICAgICBwcml2YXRlIGxvbmcgc2F2ZWRNaWdyYXRpb25EZWxheTsKIAorICAgIHN0YXRpYyBXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzOworCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIGJlZm9yZVRlc3QoKQogICAgIHsKQEAgLTU5LDE4ICs3NCwxMzkgQEAKICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgcnVubmluZyBtdWx0aXBsZSB0ZXN0IGNhc2VzIGluIHRoZSBjbGFzcywgd2hlcmUgZWFjaCBzdGFydHMgYSBub2RlIGJ1dCBpbiB0aGUgc2FtZSBKVk0sIHRoZQogICAgICAgICAvLyB1cC10aW1lIHdpbGwgYmUgbW9yZSBvciBsZXNzIHJlbGV2YW50IG9ubHkgZm9yIHRoZSBmaXJzdCB0ZXN0LiBJbiBvcmRlciB0byBlbmZvcmNlIHRoZSBzdGFydHVwLWxpa2UgYmVoYXZpb3VyCiAgICAgICAgIC8vIGZvciBlYWNoIHRlc3QgY2FzZSwgdGhlIE1JR1JBVElPTl9ERUxBWSB0aW1lIGlzIGFkanVzdGVkIGFjY29yZGluZ2x5Ci0gICAgICAgIHNhdmVkTWlncmF0aW9uRGVsYXkgPSBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTUlHUkFUSU9OX0RFTEFZLmdldExvbmcoKTsKLSAgICAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk1JR1JBVElPTl9ERUxBWS5zZXRMb25nKE1hbmFnZW1lbnRGYWN0b3J5LmdldFJ1bnRpbWVNWEJlYW4oKS5nZXRVcHRpbWUoKSArIHNhdmVkTWlncmF0aW9uRGVsYXkpOworICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KE1JR1JBVElPTl9ERUxBWSwgTWFuYWdlbWVudEZhY3RvcnkuZ2V0UnVudGltZU1YQmVhbigpLmdldFVwdGltZSgpICsgc2F2ZWRNaWdyYXRpb25EZWxheSk7CiAgICAgfQogCiAgICAgQEFmdGVyCiAgICAgcHVibGljIHZvaWQgYWZ0ZXJUZXN0KCkKICAgICB7Ci0gICAgICAgIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5NSUdSQVRJT05fREVMQVkuc2V0TG9uZyhzYXZlZE1pZ3JhdGlvbkRlbGF5KTsKKyAgICAgICAgcHJvcGVydGllcy5jbG9zZSgpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgYm9vdHN0cmFwVGVzdCgpIHRocm93cyBUaHJvd2FibGUKKyAgICBwdWJsaWMgdm9pZCBib290c3RyYXBXaXRoUmVzdW1lVGVzdCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFJFU0VUX0JPT1RTVFJBUF9QUk9HUkVTUy5zZXRCb29sZWFuKGZhbHNlKTsKKyAgICAgICAgYm9vdHN0cmFwVGVzdCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYm9vdHN0cmFwV2l0aG91dFJlc3VtZVRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBSRVNFVF9CT09UU1RSQVBfUFJPR1JFU1Muc2V0Qm9vbGVhbih0cnVlKTsKKyAgICAgICAgYm9vdHN0cmFwVGVzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmZpcm0gdGhhdCBhIG5vcm1hbCwgbm9uLXJlc3VtZWQgYm9vdHN0cmFwIHdpdGhvdXQgdGhlIHJlc2V0X2Jvb3RzdHJhcF9wcm9ncmVzcyBwYXJhbSBzcGVjaWZpZWQgd29ya3Mgd2l0aG91dCBpc3N1ZS4KKyAgICAgKiBAdGhyb3dzIFRocm93YWJsZQorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYm9vdHN0cmFwVW5zcGVjaWZpZWRSZXN1bWVUZXN0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgUkVTRVRfQk9PVFNUUkFQX1BST0dSRVNTLmNsZWFyVmFsdWUoKTsgLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgbmVhcmJ5ICdjbGVhclZhbHVlU3lzdGVtUHJvcGVydHlVc2FnZScKKyAgICAgICAgYm9vdHN0cmFwVGVzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmZpcm0gdGhhdCwgaW4gdGhlIGFic2VuY2Ugb2YgdGhlIHJlc2V0X2Jvb3RzdHJhcF9wcm9ncmVzcyBwYXJhbSBiZWluZyBzZXQgYW5kIGluIHRoZSBmYWNlIG9mIGEgZm91bmQgcHJpb3IKKyAgICAgKiBwYXJ0aWFsIGJvb3RzdHJhcCwgd2UgZXJyb3Igb3V0IGFuZCBkb24ndCBjb21wbGV0ZSBvdXIgYm9vdHN0cmFwLgorICAgICAqCisgICAgICogVGVzdCB3L291dCB2bm9kZXMgb25seTsgbG9naWMgaXMgaWRlbnRpY2FsIGZvciBib3RoIHJ1biBlbnYgYnV0IHRoZSB0b2tlbiBhbGxvYyBpbiB0aGlzIHRlc3QgZG9lc24ndCB3b3JrIGZvcgorICAgICAqIHZub2RlIGVudiBhbmQgaXQncyBub3Qgd29ydGggdGhlIGxpZnQgdG8gdXBkYXRlIGl0IHRvIHdvcmsgaW4gYm90aCBlbnYuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRocm93YWJsZQorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYm9vdHN0cmFwVW5zcGVjaWZpZWRGYWlsc09uUmVzdW1lVGVzdCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFJFU0VUX0JPT1RTVFJBUF9QUk9HUkVTUy5jbGVhclZhbHVlKCk7IC8vIGNoZWNrc3R5bGU6IHN1cHByZXNzIG5lYXJieSAnY2xlYXJWYWx1ZVN5c3RlbVByb3BlcnR5VXNhZ2UnCisKKyAgICAgICAgLy8gTmVlZCBvdXIgcGFydGl0aW9uZXIgYWN0aXZlIGZvciByYW5nZVRvQnl0ZXMgY29udmVyc2lvbiBiZWxvdworICAgICAgICBDb25maWcgYyA9IERhdGFiYXNlRGVzY3JpcHRvci5sb2FkQ29uZmlnKCk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigoKSAtPiBjKTsKKworICAgICAgICBpbnQgb3JpZ2luYWxOb2RlQ291bnQgPSAyOworICAgICAgICBpbnQgZXhwYW5kZWROb2RlQ291bnQgPSBvcmlnaW5hbE5vZGVDb3VudCArIDE7CisKKyAgICAgICAgYm9vbGVhbiBzYXdFeGNlcHRpb24gPSBmYWxzZTsKKyAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBidWlsZGVyKCkud2l0aE5vZGVzKG9yaWdpbmFsTm9kZUNvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRob3V0Vk5vZGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFRva2VuU3VwcGxpZXIoVG9rZW5TdXBwbGllci5ldmVubHlEaXN0cmlidXRlZFRva2VucyhleHBhbmRlZE5vZGVDb3VudCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhOb2RlSWRUb3BvbG9neShOZXR3b3JrVG9wb2xvZ3kuc2luZ2xlRGNOZXR3b3JrVG9wb2xvZ3koZXhwYW5kZWROb2RlQ291bnQsICJkYzAiLCAicmFjazAiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjb25maWcgLT4gY29uZmlnLndpdGgoTkVUV09SSywgR09TU0lQKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcG9wdWxhdGUoY2x1c3RlciwgMCwgMTAwKTsKKworICAgICAgICAgICAgSUluc3RhbmNlQ29uZmlnIGNvbmZpZyA9IGNsdXN0ZXIubmV3SW5zdGFuY2VDb25maWcoKTsKKyAgICAgICAgICAgIElJbnZva2FibGVJbnN0YW5jZSBuZXdJbnN0YW5jZSA9IGNsdXN0ZXIuYm9vdHN0cmFwKGNvbmZpZyk7CisgICAgICAgICAgICAgICAgd2l0aFByb3BlcnR5KEpPSU5fUklORywgZmFsc2UsICgpIC0+IG5ld0luc3RhbmNlLnN0YXJ0dXAoY2x1c3RlcikpOworCisgICAgICAgICAgICBjbHVzdGVyLmZvckVhY2goc3RhdHVzVG9Cb290c3RyYXAobmV3SW5zdGFuY2UpKTsKKworICAgICAgICAgICAgTGlzdDxUb2tlbj4gdG9rZW5zID0gY2x1c3Rlci50b2tlbnMoKTsKKyAgICAgICAgICAgIGFzc2VydCB0b2tlbnMuc2l6ZSgpID49IDM7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBPdXIgbG9jYWwgdG9rZW5zOgorICAgICAgICAgICAgVG9rZW5zIGluIGNsdXN0ZXIgdG9rZW5zOiBbLTMwNzQ0NTczNDU2MTgyNTg2MDMsIDMwNzQ0NTczNDU2MTgyNTg2MDEsIDkyMjMzNzIwMzY4NTQ3NzU4MDVdCisKKyAgICAgICAgICAgIEZyb20gdGhlIGJvb3RzdHJhcCBwcm9jZXNzOgorICAgICAgICAgICAgZmV0Y2hSZXBsaWNhcyBpbiBvdXIgdGVzdCBrZXlzcGFjZToKKyAgICAgICAgICAgIFtGZXRjaFJlcGxpY2EKKyAgICAgICAgICAgICAgICB7bG9jYWw9RnVsbCgvMTI3LjAuMC4zOjcwMTIsKC0zMDc0NDU3MzQ1NjE4MjU4NjAzLDMwNzQ0NTczNDU2MTgyNTg2MDFdKSwKKyAgICAgICAgICAgICAgICByZW1vdGU9RnVsbCgvMTI3LjAuMC4xOjcwMTIsKC0zMDc0NDU3MzQ1NjE4MjU4NjAzLDMwNzQ0NTczNDU2MTgyNTg2MDFdKX0sCisgICAgICAgICAgICBGZXRjaFJlcGxpY2EKKyAgICAgICAgICAgICAgICB7bG9jYWw9RnVsbCgvMTI3LjAuMC4zOjcwMTIsKDkyMjMzNzIwMzY4NTQ3NzU4MDUsLTMwNzQ0NTczNDU2MTgyNTg2MDNdKSwKKyAgICAgICAgICAgICAgICByZW1vdGU9RnVsbCgvMTI3LjAuMC4xOjcwMTIsKDkyMjMzNzIwMzY4NTQ3NzU4MDUsLTMwNzQ0NTczNDU2MTgyNTg2MDNdKX0sCisgICAgICAgICAgICBGZXRjaFJlcGxpY2EKKyAgICAgICAgICAgICAgICB7bG9jYWw9RnVsbCgvMTI3LjAuMC4zOjcwMTIsKDMwNzQ0NTczNDU2MTgyNTg2MDEsOTIyMzM3MjAzNjg1NDc3NTgwNV0pLAorICAgICAgICAgICAgICAgIHJlbW90ZT1GdWxsKC8xMjcuMC4wLjE6NzAxMiwoMzA3NDQ1NzM0NTYxODI1ODYwMSw5MjIzMzcyMDM2ODU0Nzc1ODA1XSl9XQorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIC8vIEluc2VydCBzb21lIGJvZ3VzIHJhbmdlcyBpbiB0aGUga2V5c3BhY2UgdG8gYmUgYm9vdHN0cmFwcGVkIHRvIHRyaWdnZXIgdGhlIGNoZWNrIG9uIGF2YWlsYWJsZSByYW5nZXMgb24gYm9vdHN0cmFwLgorICAgICAgICAgICAgLy8gTm90ZTogdGhlc2UgaGF2ZSB0byBwcmVjaXNlbHkgb3ZlcmxhcCB3aXRoIHRoZSB0b2tlbiByYW5nZXMgaGl0IGR1cmluZyBzdHJlYW1pbmcgb3IgdGhleSB3b24ndCB0cmlnZ2VyIHRoZQorICAgICAgICAgICAgLy8gYXZhaWxhYmlsaXR5IGxvZ2ljIG9uIGJvb3RzdHJhcCB0byB0aGVuIGV4Y2VwdCBvdXQ7IHdlIGNhbid0IGp1c3QgaGF2ZSBfYW55XyByYW5nZSBmb3IgYSBrZXlzcGFjZSwgYnV0IHJhdGhlciwKKyAgICAgICAgICAgIC8vIG11c3QgaGF2ZSBhIHJhbmdlIHRoYXQgb3ZlcmxhcHMgd2l0aCB3aGF0IHdlJ3JlIHRyeWluZyB0byBzdHJlYW0uCisgICAgICAgICAgICBTZXQ8UmFuZ2UgPFRva2VuPj4gZnVsbFNldCA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgICAgIGZ1bGxTZXQuYWRkKG5ldyBSYW5nZTw+KHRva2Vucy5nZXQoMCksIHRva2Vucy5nZXQoMSkpKTsKKyAgICAgICAgICAgIGZ1bGxTZXQuYWRkKG5ldyBSYW5nZTw+KHRva2Vucy5nZXQoMSksIHRva2Vucy5nZXQoMikpKTsKKyAgICAgICAgICAgIGZ1bGxTZXQuYWRkKG5ldyBSYW5nZTw+KHRva2Vucy5nZXQoMiksIHRva2Vucy5nZXQoMCkpKTsKKworICAgICAgICAgICAgLy8gU2hvdWxkIGJlIGZpbmUgdG8gdHJpZ2dlciBvbiBmdWxsIHJhbmdlcyBvbmx5IGJ1dCBhZGQgYSBwYXJ0aWFsIGZvciBnb29kIG1lYXN1cmUuCisgICAgICAgICAgICBTZXQ8UmFuZ2UgPFRva2VuPj4gcGFydGlhbFNldCA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgICAgIHBhcnRpYWxTZXQuYWRkKG5ldyBSYW5nZTw+KHRva2Vucy5nZXQoMiksIHRva2Vucy5nZXQoMSkpKTsKKworICAgICAgICAgICAgU3RyaW5nIGNxbCA9IFN0cmluZy5mb3JtYXQoIklOU0VSVCBJTlRPICVzLiVzIChrZXlzcGFjZV9uYW1lLCBmdWxsX3JhbmdlcywgdHJhbnNpZW50X3JhbmdlcykgVkFMVUVTICg/LCA/LCA/KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb25zdGFudHMuU1lTVEVNX0tFWVNQQUNFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1LZXlzcGFjZS5BVkFJTEFCTEVfUkFOR0VTX1YyKTsKKworICAgICAgICAgICAgbmV3SW5zdGFuY2UuZXhlY3V0ZUludGVybmFsKGNxbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlTUEFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsU2V0LnN0cmVhbSgpLm1hcChTeXN0ZW1LZXlzcGFjZTo6cmFuZ2VUb0J5dGVzKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbFNldC5zdHJlYW0oKS5tYXAoU3lzdGVtS2V5c3BhY2U6OnJhbmdlVG9CeXRlcykuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKTsKKworICAgICAgICAgICAgLy8gV2UgZXhwZWN0IGJvb3RzdHJhcCB0byB0aHJvdyBhbiBleGNlcHRpb24gb24gbm9kZTMgdy90aGUgc2VlbiByYW5nZXMgd2UndmUgaW5zZXJ0ZWQKKyAgICAgICAgICAgIGNsdXN0ZXIucnVuKGFzTGlzdChwdWxsU2NoZW1hRnJvbShjbHVzdGVyLmdldCgxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5zdGFuY2UuY29uZmlnKCkubnVtKCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChBc3N1bXB0aW9uVmlvbGF0ZWRFeGNlcHRpb24gYXZlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXZSBnZXQgYW4gQXNzdW1wdGlvblZpb2xhdGVkRXhjZXB0aW9uIGlmIHdlJ3JlIGluIGEgdGVzdCBqb2IgY29uZmlndXJlZCB3L3Zub2RlcworICAgICAgICAgICAgdGhyb3cgYXZlOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJ0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJ0ZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoIkRpc2NvdmVyZWQgZXhpc3RpbmcgYm9vdHN0cmFwIGRhdGEiKSkKKyAgICAgICAgICAgICAgICBzYXdFeGNlcHRpb24gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJFeHBlY3RlZCB0byBzZWUgYSBSdW50aW1lRXhjZXB0aW9uIHcvJ0Rpc2NvdmVyZWQgZXhpc3RpbmcgYm9vdHN0cmFwIGRhdGEnIGluIHRoZSBlcnJvciBtZXNzYWdlOyBkaWQgbm90LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNhd0V4Y2VwdGlvbik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGJvb3RzdHJhcFRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBpbnQgb3JpZ2luYWxOb2RlQ291bnQgPSAyOwogICAgICAgICBpbnQgZXhwYW5kZWROb2RlQ291bnQgPSBvcmlnaW5hbE5vZGVDb3VudCArIDE7CkBAIC04NSw3ICsyMjEsNyBAQAogCiAgICAgICAgICAgICBJSW5zdGFuY2VDb25maWcgY29uZmlnID0gY2x1c3Rlci5uZXdJbnN0YW5jZUNvbmZpZygpOwogICAgICAgICAgICAgSUludm9rYWJsZUluc3RhbmNlIG5ld0luc3RhbmNlID0gY2x1c3Rlci5ib290c3RyYXAoY29uZmlnKTsKLSAgICAgICAgICAgIHdpdGhQcm9wZXJ0eSgiY2Fzc2FuZHJhLmpvaW5fcmluZyIsIGZhbHNlLAorICAgICAgICAgICAgd2l0aFByb3BlcnR5KEpPSU5fUklORywgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gbmV3SW5zdGFuY2Uuc3RhcnR1cChjbHVzdGVyKSk7CiAKICAgICAgICAgICAgIGNsdXN0ZXIuZm9yRWFjaChzdGF0dXNUb0Jvb3RzdHJhcChuZXdJbnN0YW5jZSkpOwpAQCAtMTE1LDE0ICsyNTEsMTQgQEAKICAgICAgICAgewogICAgICAgICAgICAgSUluc3RhbmNlQ29uZmlnIGNvbmZpZyA9IGNsdXN0ZXIubmV3SW5zdGFuY2VDb25maWcoKTsKICAgICAgICAgICAgIElJbnZva2FibGVJbnN0YW5jZSBuZXdJbnN0YW5jZSA9IGNsdXN0ZXIuYm9vdHN0cmFwKGNvbmZpZyk7Ci0gICAgICAgICAgICB3aXRoUHJvcGVydHkoImNhc3NhbmRyYS5qb2luX3JpbmciLCBmYWxzZSwKKyAgICAgICAgICAgIHdpdGhQcm9wZXJ0eShKT0lOX1JJTkcsIGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IG5ld0luc3RhbmNlLnN0YXJ0dXAoY2x1c3RlcikpOwogCiAgICAgICAgICAgICBjbHVzdGVyLmZvckVhY2goc3RhdHVzVG9Cb290c3RyYXAobmV3SW5zdGFuY2UpKTsKIAogICAgICAgICAgICAgcG9wdWxhdGUoY2x1c3RlciwgMCwgMTAwKTsKIAotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDAsIG5ld0luc3RhbmNlLmV4ZWN1dGVJbnRlcm5hbCgiU0VMRUNUICpGUk9NICIgKyBLRVlTUEFDRSArICIudGJsIikubGVuZ3RoKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAwLCBuZXdJbnN0YW5jZS5leGVjdXRlSW50ZXJuYWwoIlNFTEVDVCAqIEZST00gIiArIEtFWVNQQUNFICsgIi50YmwiKS5sZW5ndGgpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvcmluZy9DbGVhbnVwRmFpbHVyZVRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9yaW5nL0NsZWFudXBGYWlsdXJlVGVzdC5qYXZhCmluZGV4IDljOGY3MWYuLjhlYzM2MzAgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9yaW5nL0NsZWFudXBGYWlsdXJlVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9yaW5nL0NsZWFudXBGYWlsdXJlVGVzdC5qYXZhCkBAIC0yOCw2ICsyOCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLk5ldHdvcmtUb3BvbG9neTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LlRlc3RCYXNlSW1wbDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkpPSU5fUklORzsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFjdGlvbi5Hb3NzaXBIZWxwZXIuc3RhdHVzVG9Cb290c3RyYXA7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFjdGlvbi5Hb3NzaXBIZWxwZXIuc3RhdHVzVG9EZWNvbW1pc3Npb247CkBAIC04Niw3ICs4Nyw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIElJbnN0YW5jZUNvbmZpZyBjb25maWcgPSBjbHVzdGVyLm5ld0luc3RhbmNlQ29uZmlnKCk7CiAgICAgICAgICAgICBJSW52b2thYmxlSW5zdGFuY2UgYm9vdHN0cmFwcGluZ05vZGUgPSBjbHVzdGVyLmJvb3RzdHJhcChjb25maWcpOwotICAgICAgICAgICAgd2l0aFByb3BlcnR5KCJjYXNzYW5kcmEuam9pbl9yaW5nIiwgZmFsc2UsCisgICAgICAgICAgICB3aXRoUHJvcGVydHkoSk9JTl9SSU5HLCBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBib290c3RyYXBwaW5nTm9kZS5zdGFydHVwKGNsdXN0ZXIpKTsKIAogICAgICAgICAgICAgLy8gU3RhcnQgZGVjb21pc3Npb24gb24gYm9vdHN0cmFwcGluZ05vZGUKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9yaW5nL1BlbmRpbmdXcml0ZXNUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvcmluZy9QZW5kaW5nV3JpdGVzVGVzdC5qYXZhCmluZGV4IDJlNzAyYjIuLjBlMGNmNzYgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9yaW5nL1BlbmRpbmdXcml0ZXNUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3JpbmcvUGVuZGluZ1dyaXRlc1Rlc3QuamF2YQpAQCAtNDEsNiArNDEsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuUGVuZGluZ1JhbmdlQ2FsY3VsYXRvclNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkpPSU5fUklORzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYWN0aW9uLkdvc3NpcEhlbHBlci5ib290c3RyYXA7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFjdGlvbi5Hb3NzaXBIZWxwZXIuZGlzc2VtaW5hdGVHb3NzaXBTdGF0ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYWN0aW9uLkdvc3NpcEhlbHBlci5zdGF0dXNUb0Jvb3RzdHJhcDsKQEAgLTY1LDggKzY2LDcgQEAKICAgICAgICAgICAgIEJvb3RzdHJhcFRlc3QucG9wdWxhdGUoY2x1c3RlciwgMCwgMTAwKTsKICAgICAgICAgICAgIElJbnN0YW5jZUNvbmZpZyBjb25maWcgPSBjbHVzdGVyLm5ld0luc3RhbmNlQ29uZmlnKCk7CiAgICAgICAgICAgICBJSW52b2thYmxlSW5zdGFuY2UgbmV3SW5zdGFuY2UgPSBjbHVzdGVyLmJvb3RzdHJhcChjb25maWcpOwotICAgICAgICAgICAgd2l0aFByb3BlcnR5KCJjYXNzYW5kcmEuam9pbl9yaW5nIiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gbmV3SW5zdGFuY2Uuc3RhcnR1cChjbHVzdGVyKSk7CisgICAgICAgICAgICB3aXRoUHJvcGVydHkoSk9JTl9SSU5HLCBmYWxzZSwgKCkgLT4gbmV3SW5zdGFuY2Uuc3RhcnR1cChjbHVzdGVyKSk7CiAKICAgICAgICAgICAgIGNsdXN0ZXIuZm9yRWFjaChzdGF0dXNUb0Jvb3RzdHJhcChuZXdJbnN0YW5jZSkpOwogICAgICAgICAgICAgY2x1c3Rlci5ydW4oYm9vdHN0cmFwKGZhbHNlLCBEdXJhdGlvbi5vZlNlY29uZHMoNjApLCBEdXJhdGlvbi5vZlNlY29uZHMoNjApKSwgbmV3SW5zdGFuY2UuY29uZmlnKCkubnVtKCkpOwpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3N0cmVhbWluZy9BYnN0cmFjdFN0cmVhbUZhaWx1cmVMb2dzLmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3Qvc3RyZWFtaW5nL0Fic3RyYWN0U3RyZWFtRmFpbHVyZUxvZ3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGFhNmIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3N0cmVhbWluZy9BYnN0cmFjdFN0cmVhbUZhaWx1cmVMb2dzLmphdmEKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3Quc3RyZWFtaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5VVUlEOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5CeXRlQnVkZHk7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5keW5hbWljLmxvYWRpbmcuQ2xhc3NMb2FkaW5nU3RyYXRlZ3k7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5pbXBsZW1lbnRhdGlvbi5NZXRob2REZWxlZ2F0aW9uOworaW1wb3J0IG5ldC5ieXRlYnVkZHkuaW1wbGVtZW50YXRpb24uYmluZC5hbm5vdGF0aW9uLlN1cGVyQ2FsbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5zdHJlYW1pbmcuQ2Fzc2FuZHJhSW5jb21pbmdGaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLkNsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklJbnZva2FibGVJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuTG9nUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5TaW1wbGVRdWVyeVJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LlRlc3RCYXNlSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlJhbmdlQXdhcmVTU1RhYmxlV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVplcm9Db3B5V3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlcjsKK2ltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOworaW1wb3J0IHN0YXRpYyBuZXQuYnl0ZWJ1ZGR5Lm1hdGNoZXIuRWxlbWVudE1hdGNoZXJzLm5hbWVkOworaW1wb3J0IHN0YXRpYyBuZXQuYnl0ZWJ1ZGR5Lm1hdGNoZXIuRWxlbWVudE1hdGNoZXJzLnRha2VzQXJndW1lbnRzOworCitwdWJsaWMgY2xhc3MgQWJzdHJhY3RTdHJlYW1GYWlsdXJlTG9ncyBleHRlbmRzIFRlc3RCYXNlSW1wbAoreworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEFic3RyYWN0U3RyZWFtRmFpbHVyZUxvZ3MuY2xhc3MpOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRkFJTElOR19OT0RFID0gMjsKKworICAgIHByb3RlY3RlZCB2b2lkIHN0cmVhbVRlc3QoYm9vbGVhbiB6ZXJvQ29weVN0cmVhbWluZywgU3RyaW5nIHJlYXNvbiwgSW50ZWdlciBmYWlsZWROb2RlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoQ2x1c3RlciBjbHVzdGVyID0gQ2x1c3Rlci5idWlsZCgyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEluc3RhbmNlSW5pdGlhbGl6ZXIoQkJTdHJlYW1IZWxwZXI6Omluc3RhbGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uZmlnKGMgLT4gYy53aXRoKEZlYXR1cmUudmFsdWVzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoInN0cmVhbV9lbnRpcmVfc3N0YWJsZXMiLCB6ZXJvQ29weVN0cmVhbWluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBkaWUsIHRoaXMgd2lsbCB0cnkgdG8gaGFsdCBKVk0sIHdoaWNoIGlzIGVhc2llciB0byB2YWxpZGF0ZSBpbiB0aGUgdGVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlciBsZXZlbHMgcmVxdWlyZSBjaGVja2luZyBzdGF0ZSBvZiB0aGUgc3Vic3lzdGVtcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJkaXNrX2ZhaWx1cmVfcG9saWN5IiwgImRpZSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW5pdChjbHVzdGVyKTsKKworICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgJXMudGJsIChwayBpbnQgUFJJTUFSWSBLRVkpIikpOworCisgICAgICAgICAgICB0cmlnZ2VyU3RyZWFtaW5nKGNsdXN0ZXIpOworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGRpc2sgZmFpbHVyZSBwb2xpY3kgaXMgbm90IHRyaWdnZXJlZAorCisgICAgICAgICAgICBJSW52b2thYmxlSW5zdGFuY2UgZmFpbGluZ05vZGUgPSBjbHVzdGVyLmdldChmYWlsZWROb2RlKTsKKworICAgICAgICAgICAgc2VhcmNoRm9yTG9nKGZhaWxpbmdOb2RlLCByZWFzb24pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdHJpZ2dlclN0cmVhbWluZyhDbHVzdGVyIGNsdXN0ZXIpCisgICAgeworICAgICAgICBJSW52b2thYmxlSW5zdGFuY2Ugbm9kZTEgPSBjbHVzdGVyLmdldCgxKTsKKyAgICAgICAgSUludm9rYWJsZUluc3RhbmNlIG5vZGUyID0gY2x1c3Rlci5nZXQoMik7CisKKyAgICAgICAgLy8gcmVwYWlyIHdpbGwgZG8gc3RyZWFtaW5nIElGRiB0aGVyZSBpcyBhIG1pc21hdGNoOyBzbyBjYXVzZSBvbmUKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKQorICAgICAgICAgICAgbm9kZTEuZXhlY3V0ZUludGVybmFsKHdpdGhLZXlzcGFjZSgiSU5TRVJUIElOVE8gJXMudGJsIChwaykgVkFMVUVTICg/KSIpLCBpKTsgLy8gdGltZXN0YW1wIHdvbid0IG1hdGNoLCBjYXVzaW5nIGEgbWlzbWF0Y2gKKworICAgICAgICAvLyB0cmlnZ2VyIHN0cmVhbWluZzsgZXhwZWN0ZWQgdG8gZmFpbCBhcyBzdHJlYW1pbmcgc29ja2V0IGNsb3NlZCBpbiB0aGUgbWlkZGxlIChjdXJyZW50bHkgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGV2ZW50KQorICAgICAgICAvL0Jsb2NrcyB1bnRpbCB0aGUgc3RyZWFtIGlzIGNvbXBsZXRlCisgICAgICAgIG5vZGUyLm5vZGV0b29sUmVzdWx0KCJyZXBhaXIiLCAiLWZ1bGwiLCBLRVlTUEFDRSwgInRibCIpLmFzc2VydHMoKS5mYWlsdXJlKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2VhcmNoRm9yTG9nKElJbnZva2FibGVJbnN0YW5jZSBmYWlsaW5nTm9kZSwgU3RyaW5nIHJlYXNvbikKKyAgICB7CisgICAgICAgIHNlYXJjaEZvckxvZyhmYWlsaW5nTm9kZSwgdHJ1ZSwgcmVhc29uKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzZWFyY2hGb3JMb2coSUludm9rYWJsZUluc3RhbmNlIGZhaWxpbmdOb2RlLCBib29sZWFuIGZhaWxJZk5vTWF0Y2gsIFN0cmluZyByZWFzb24pCisgICAgeworICAgICAgICBMb2dSZXN1bHQ8TGlzdDxTdHJpbmc+PiByZXN1bHQgPSBmYWlsaW5nTm9kZS5sb2dzKCkuZ3JlcEZvckVycm9ycygtMSwgUGF0dGVybi5jb21waWxlKCJTdHJlYW0gZmFpbGVkOiIpKTsKKyAgICAgICAgLy8gZ3JlcEZvckVycm9ycyB3aWxsIGluY2x1ZGUgYWxsIEVSUk9SIGxvZ3MgZXZlbiBpZiB0aGV5IGRvbid0IG1hdGNoIHRoZSBwYXR0ZXJuOyBmb3IgdGhpcyByZWFzb24gbmVlZCB0byBmaWx0ZXIgYWZ0ZXIgdGhlIGZhY3QKKyAgICAgICAgTGlzdDxTdHJpbmc+IG1hdGNoZXMgPSByZXN1bHQuZ2V0UmVzdWx0KCk7CisKKyAgICAgICAgbWF0Y2hlcyA9IG1hdGNoZXMuc3RyZWFtKCkuZmlsdGVyKHMgLT4gcy5zdGFydHNXaXRoKCJXQVJOIikpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJTdHJlYW0gZmFpbGVkIGxvZ3MgZm91bmQ6IHt9IiwgU3RyaW5nLmpvaW4oIlxuIiwgbWF0Y2hlcykpOworICAgICAgICBpZiAobWF0Y2hlcy5pc0VtcHR5KCkgJiYgIWZhaWxJZk5vTWF0Y2gpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KG1hdGNoZXMpCisgICAgICAgICAgICAgICAgICAuZGVzY3JpYmVkQXMoIm5vZGUlZCBleHBlY3RlZCB0byBmaW5kICVzIGJ1dCBjb3VsZCBub3QiLCBmYWlsaW5nTm9kZS5jb25maWcoKS5udW0oKSwgcmVhc29uKQorICAgICAgICAgICAgICAgICAgLmhhc1NpemUoMSk7CisgICAgICAgIFN0cmluZyBsb2dMaW5lID0gbWF0Y2hlcy5nZXQoMCk7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChsb2dMaW5lKS5jb250YWlucyhyZWFzb24pOworCisgICAgICAgIE1hdGNoZXIgbWF0Y2ggPSBQYXR0ZXJuLmNvbXBpbGUoIi4qXFxbU3RyZWFtICMoLiopXFxdIikubWF0Y2hlcihsb2dMaW5lKTsKKyAgICAgICAgaWYgKCFtYXRjaC5maW5kKCkpIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVW5hYmxlIHRvIHBhcnNlOiAiICsgbG9nTGluZSk7CisgICAgICAgIFVVSUQgcGxhbklkID0gVVVJRC5mcm9tU3RyaW5nKG1hdGNoLmdyb3VwKDEpKTsKKyAgICAgICAgU2ltcGxlUXVlcnlSZXN1bHQgcXIgPSBmYWlsaW5nTm9kZS5leGVjdXRlSW50ZXJuYWxXaXRoUmVzdWx0KCJTRUxFQ1QgKiBGUk9NIHN5c3RlbV92aWV3cy5zdHJlYW1pbmcgV0hFUkUgaWQ9PyIsIHBsYW5JZCk7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChxci5oYXNOZXh0KCkpLmlzVHJ1ZSgpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQocXIubmV4dCgpLmdldFN0cmluZygiZmFpbHVyZV9jYXVzZSIpKS5jb250YWlucyhyZWFzb24pOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJCU3RyZWFtSGVscGVyCisgICAgeworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgd3JpdGVEaXJlY3RseVRvQ2hhbm5lbChCeXRlQnVmZmVyIGJ1ZiwgQFN1cGVyQ2FsbCBDYWxsYWJsZTxJbnRlZ2VyPiB6dXBlcikgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXNDYWxsZXIoU1NUYWJsZVplcm9Db3B5V3JpdGVyLmNsYXNzLmdldE5hbWUoKSwgIndyaXRlIikpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRFU1QiKTsKKyAgICAgICAgICAgIC8vIGRpZmZlcmVudCBjb250ZXh0OyBwYXNzIHRocm91Z2gKKyAgICAgICAgICAgIHJldHVybiB6dXBlci5jYWxsKCk7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGFwcGVuZChVbmZpbHRlcmVkUm93SXRlcmF0b3IgcGFydGl0aW9uLCBAU3VwZXJDYWxsIENhbGxhYmxlPEJvb2xlYW4+IHp1cGVyKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpc0NhbGxlcihDYXNzYW5kcmFJbmNvbWluZ0ZpbGUuY2xhc3MuZ2V0TmFtZSgpLCAicmVhZCIpKSAvLyBoYW5kbGVzIGNvbXByZXNzZWQgYW5kIG5vbi1jb21wcmVzc2VkCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZENoYW5uZWxFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIC8vIGRpZmZlcmVudCBjb250ZXh0OyBwYXNzIHRocm91Z2gKKyAgICAgICAgICAgIHJldHVybiB6dXBlci5jYWxsKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zdGFsbChDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgSW50ZWdlciBudW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChudW0gIT0gRkFJTElOR19OT0RFKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIG5ldyBCeXRlQnVkZHkoKS5yZWJhc2UoU2VxdWVudGlhbFdyaXRlci5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tZXRob2QobmFtZWQoIndyaXRlRGlyZWN0bHlUb0NoYW5uZWwiKS5hbmQodGFrZXNBcmd1bWVudHMoMSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludGVyY2VwdChNZXRob2REZWxlZ2F0aW9uLnRvKEJCU3RyZWFtSGVscGVyLmNsYXNzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKGNsYXNzTG9hZGVyLCBDbGFzc0xvYWRpbmdTdHJhdGVneS5EZWZhdWx0LklOSkVDVElPTik7CisKKyAgICAgICAgICAgIG5ldyBCeXRlQnVkZHkoKS5yZWJhc2UoUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWV0aG9kKG5hbWVkKCJhcHBlbmQiKS5hbmQodGFrZXNBcmd1bWVudHMoMSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludGVyY2VwdChNZXRob2REZWxlZ2F0aW9uLnRvKEJCU3RyZWFtSGVscGVyLmNsYXNzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKGNsYXNzTG9hZGVyLCBDbGFzc0xvYWRpbmdTdHJhdGVneS5EZWZhdWx0LklOSkVDVElPTik7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0NhbGxlcihTdHJpbmcga2xhc3MsIFN0cmluZyBtZXRob2QpCisgICAgeworICAgICAgICBTdGFja1RyYWNlRWxlbWVudFtdIHN0YWNrID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRTdGFja1RyYWNlKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhY2subGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50IGUgPSBzdGFja1tpXTsKKyAgICAgICAgICAgIGlmIChrbGFzcy5lcXVhbHMoZS5nZXRDbGFzc05hbWUoKSkgJiYgbWV0aG9kLmVxdWFscyhlLmdldE1ldGhvZE5hbWUoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9zdHJlYW1pbmcvQm91bmRFeGNlcHRpb25UZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3Qvc3RyZWFtaW5nL0JvdW5kRXhjZXB0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYzQ0NWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3Qvc3RyZWFtaW5nL0JvdW5kRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LnN0cmVhbWluZzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbVNlc3Npb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBCb3VuZEV4Y2VwdGlvblRlc3QKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElNSVQgPSAyOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlRXhjZXB0aW9uKCkKKyAgICB7CisgICAgICAgIFRocm93YWJsZSBleGNlcHRpb25Ub1Rlc3QgPSBleGNlcHRpb24oInRlc3QgZXhjZXB0aW9uIik7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYm91bmRlZFN0YWNrVHJhY2UgPSBTdHJlYW1TZXNzaW9uLmJvdW5kU3RhY2tUcmFjZShleGNlcHRpb25Ub1Rlc3QsIExJTUlULCBuZXcgU3RyaW5nQnVpbGRlcigpKTsKKworICAgICAgICBTdHJpbmcgZXhwZWN0ZWRTdGFja1RyYWNlID0gImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uOiB0ZXN0IGV4Y2VwdGlvblxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LnN0cmVhbWluZy5Cb3VuZEV4Y2VwdGlvblRlc3QubWV0aG9kKEJvdW5kRXhjZXB0aW9uVGVzdC5qYXZhOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3Quc3RyZWFtaW5nLkJvdW5kRXhjZXB0aW9uVGVzdC5tZXRob2QoQm91bmRFeGNlcHRpb25UZXN0LmphdmE6MSlcbiI7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RhY2tUcmFjZSxib3VuZGVkU3RhY2tUcmFjZS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRFeGNlcHRpb24oKQorICAgIHsKKyAgICAgICAgVGhyb3dhYmxlIGV4Y2VwdGlvblRvVGVzdCA9IGV4Y2VwdGlvbihleGNlcHRpb24oInRoZSBkaXNrIC9mb28vdmFyIGlzIGJhZCIsIGV4Y2VwdGlvbigiQmFkIGRpc2sgc29tZXdoZXJlIikpKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBib3VuZGVkU3RhY2tUcmFjZSA9IFN0cmVhbVNlc3Npb24uYm91bmRTdGFja1RyYWNlKGV4Y2VwdGlvblRvVGVzdCwgTElNSVQsIG5ldyBTdHJpbmdCdWlsZGVyKCkpOworCisgICAgICAgIFN0cmluZyBleHBlY3RlZFN0YWNrVHJhY2UgPSAiamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb246IGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uOiB0aGUgZGlzayAvZm9vL3ZhciBpcyBiYWRcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0b3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5zdHJlYW1pbmcuQm91bmRFeGNlcHRpb25UZXN0Lm1ldGhvZChCb3VuZEV4Y2VwdGlvblRlc3QuamF2YTowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LnN0cmVhbWluZy5Cb3VuZEV4Y2VwdGlvblRlc3QubWV0aG9kKEJvdW5kRXhjZXB0aW9uVGVzdC5qYXZhOjEpXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogdGhlIGRpc2sgL2Zvby92YXIgaXMgYmFkXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogQmFkIGRpc2sgc29tZXdoZXJlXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3Quc3RyZWFtaW5nLkJvdW5kRXhjZXB0aW9uVGVzdC5tZXRob2QoQm91bmRFeGNlcHRpb25UZXN0LmphdmE6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0b3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5zdHJlYW1pbmcuQm91bmRFeGNlcHRpb25UZXN0Lm1ldGhvZChCb3VuZEV4Y2VwdGlvblRlc3QuamF2YToxKVxuIjsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdGFja1RyYWNlLCBib3VuZGVkU3RhY2tUcmFjZS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb25DeWNsZSgpCisgICAgeworICAgICAgICBFeGNlcHRpb24gZTEgPSBleGNlcHRpb24oIlRlc3QgZXhjZXB0aW9uIDEiKTsKKyAgICAgICAgRXhjZXB0aW9uIGUyID0gZXhjZXB0aW9uKCJUZXN0IGV4Y2VwdGlvbiAyIik7CisKKyAgICAgICAgZTEuaW5pdENhdXNlKGUyKTsKKyAgICAgICAgZTIuaW5pdENhdXNlKGUxKTsKKworICAgICAgICBTdHJpbmdCdWlsZGVyIGJvdW5kZWRTdGFja1RyYWNlID0gU3RyZWFtU2Vzc2lvbi5ib3VuZFN0YWNrVHJhY2UoZTEsIExJTUlULCBuZXcgU3RyaW5nQnVpbGRlcigpKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkU3RhY2tUcmFjZSA9ICJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogVGVzdCBleGNlcHRpb24gMVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LnN0cmVhbWluZy5Cb3VuZEV4Y2VwdGlvblRlc3QubWV0aG9kKEJvdW5kRXhjZXB0aW9uVGVzdC5qYXZhOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3Quc3RyZWFtaW5nLkJvdW5kRXhjZXB0aW9uVGVzdC5tZXRob2QoQm91bmRFeGNlcHRpb25UZXN0LmphdmE6MSlcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uOiBUZXN0IGV4Y2VwdGlvbiAyXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbQ0lSQ1VMQVIgUkVGRVJFTkNFOiBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogVGVzdCBleGNlcHRpb24gMV1cbiI7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RhY2tUcmFjZSwgYm91bmRlZFN0YWNrVHJhY2UudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdGFja1RyYWNlKCkKKyAgICB7CisgICAgICAgIFRocm93YWJsZSBleGNlcHRpb25Ub1Rlc3QgPSBleGNlcHRpb24oInRoZXJlIGFyZSB3b3JkcyBoZXJlIiwgMCk7CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciBib3VuZGVkU3RhY2tUcmFjZSA9IFN0cmVhbVNlc3Npb24uYm91bmRTdGFja1RyYWNlKGV4Y2VwdGlvblRvVGVzdCwgTElNSVQsIG5ldyBTdHJpbmdCdWlsZGVyKCkpOworICAgICAgICBTdHJpbmcgZXhwZWN0ZWRTdGFja1RyYWNlID0gImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uOiB0aGVyZSBhcmUgd29yZHMgaGVyZVxuIjsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdGFja1RyYWNlLGJvdW5kZWRTdGFja1RyYWNlLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5TmVzdGVkU3RhY2tUcmFjZSgpCisgICAgeworICAgICAgICBUaHJvd2FibGUgZXhjZXB0aW9uVG9UZXN0ID0gZXhjZXB0aW9uKGV4Y2VwdGlvbigidGhlIGRpc2sgL2Zvby92YXIgaXMgYmFkIiwgZXhjZXB0aW9uKCJCYWQgZGlzayBzb21ld2hlcmUiKSwgMCksIDApOworCisgICAgICAgIFN0cmluZ0J1aWxkZXIgYm91bmRlZFN0YWNrVHJhY2UgPSBTdHJlYW1TZXNzaW9uLmJvdW5kU3RhY2tUcmFjZShleGNlcHRpb25Ub1Rlc3QsIExJTUlULCBuZXcgU3RyaW5nQnVpbGRlcigpKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkU3RhY2tUcmFjZSA9ICJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb246IHRoZSBkaXNrIC9mb28vdmFyIGlzIGJhZFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb246IHRoZSBkaXNrIC9mb28vdmFyIGlzIGJhZFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb246IEJhZCBkaXNrIHNvbWV3aGVyZVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LnN0cmVhbWluZy5Cb3VuZEV4Y2VwdGlvblRlc3QubWV0aG9kKEJvdW5kRXhjZXB0aW9uVGVzdC5qYXZhOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3Quc3RyZWFtaW5nLkJvdW5kRXhjZXB0aW9uVGVzdC5tZXRob2QoQm91bmRFeGNlcHRpb25UZXN0LmphdmE6MSlcbiI7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RhY2tUcmFjZSwgYm91bmRlZFN0YWNrVHJhY2UudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGltaXRMYXJnZXJUaGFuU3RhY2tUcmFjZSgpCisgICAgeworICAgICAgICBUaHJvd2FibGUgZXhjZXB0aW9uVG9UZXN0ID0gZXhjZXB0aW9uKGV4Y2VwdGlvbigidGhlIGRpc2sgL2Zvby92YXIgaXMgYmFkIiwgZXhjZXB0aW9uKCJCYWQgZGlzayBzb21ld2hlcmUiKSksIDEpOworCisgICAgICAgIFN0cmluZ0J1aWxkZXIgYm91bmRlZFN0YWNrVHJhY2UgPSBTdHJlYW1TZXNzaW9uLmJvdW5kU3RhY2tUcmFjZShleGNlcHRpb25Ub1Rlc3QsIExJTUlULCBuZXcgU3RyaW5nQnVpbGRlcigpKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkU3RhY2tUcmFjZSA9ICJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb246IHRoZSBkaXNrIC9mb28vdmFyIGlzIGJhZFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LnN0cmVhbWluZy5Cb3VuZEV4Y2VwdGlvblRlc3QubWV0aG9kKEJvdW5kRXhjZXB0aW9uVGVzdC5qYXZhOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogdGhlIGRpc2sgL2Zvby92YXIgaXMgYmFkXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3Quc3RyZWFtaW5nLkJvdW5kRXhjZXB0aW9uVGVzdC5tZXRob2QoQm91bmRFeGNlcHRpb25UZXN0LmphdmE6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uOiBCYWQgZGlzayBzb21ld2hlcmVcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0b3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5zdHJlYW1pbmcuQm91bmRFeGNlcHRpb25UZXN0Lm1ldGhvZChCb3VuZEV4Y2VwdGlvblRlc3QuamF2YTowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LnN0cmVhbWluZy5Cb3VuZEV4Y2VwdGlvblRlc3QubWV0aG9kKEJvdW5kRXhjZXB0aW9uVGVzdC5qYXZhOjEpXG4iOworCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFN0YWNrVHJhY2UsIGJvdW5kZWRTdGFja1RyYWNlLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0YWNrVHJhY2VFbGVtZW50W10gZnJhbWVzKGludCBsZW5ndGgpCisgICAgeworICAgICAgICBTdGFja1RyYWNlRWxlbWVudFtdIGZyYW1lcyA9IG5ldyBTdGFja1RyYWNlRWxlbWVudFtsZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICAgICAgZnJhbWVzW2ldID0gbmV3IFN0YWNrVHJhY2VFbGVtZW50KEJvdW5kRXhjZXB0aW9uVGVzdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJtZXRob2QiLCBCb3VuZEV4Y2VwdGlvblRlc3QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi5qYXZhIiwgaSk7CisgICAgICAgIHJldHVybiBmcmFtZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24oU3RyaW5nIG1zZykKKyAgICB7CisgICAgICAgIHJldHVybiBleGNlcHRpb24obXNnLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbihTdHJpbmcgbXNnLCBpbnQgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbihtc2csIG51bGwsIGxlbmd0aCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbihudWxsLCBjYXVzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlLCBpbnQgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbihudWxsLCBjYXVzZSwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgY2F1c2UpCisgICAgeworICAgICAgICByZXR1cm4gZXhjZXB0aW9uKG1zZywgY2F1c2UsIExJTUlUICogMik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIGNhdXNlLCBpbnQgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgUnVudGltZUV4Y2VwdGlvbiBlOworICAgICAgICBpZiAobXNnICE9IG51bGwgJiYgY2F1c2UgIT0gbnVsbCkgZSA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1zZywgY2F1c2UpOworICAgICAgICBlbHNlIGlmIChtc2cgIT0gbnVsbCkgZSA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1zZyk7CisgICAgICAgIGVsc2UgaWYgKGNhdXNlICE9IG51bGwpIGUgPSBuZXcgUnVudGltZUV4Y2VwdGlvbihjYXVzZSk7CisgICAgICAgIGVsc2UgZSA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisgICAgICAgIGUuc2V0U3RhY2tUcmFjZShmcmFtZXMobGVuZ3RoKSk7CisgICAgICAgIHJldHVybiBlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9zdHJlYW1pbmcvTENTU3RyZWFtaW5nS2VlcExldmVsVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3N0cmVhbWluZy9MQ1NTdHJlYW1pbmdLZWVwTGV2ZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMxOTc2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9zdHJlYW1pbmcvTENTU3RyZWFtaW5nS2VlcExldmVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3Quc3RyZWFtaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTXVybXVyM1BhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLkNsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklJbnZva2FibGVJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LlRlc3RCYXNlSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLkdPU1NJUDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmUuTkFUSVZFX1BST1RPQ09MOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZS5ORVRXT1JLOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBMQ1NTdHJlYW1pbmdLZWVwTGV2ZWxUZXN0IGV4dGVuZHMgVGVzdEJhc2VJbXBsCit7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb20oKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoQ2x1c3RlciBjbHVzdGVyID0gYnVpbGRlcigpLndpdGhOb2Rlcyg0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uZmlnKGNvbmZpZyAtPiBjb25maWcud2l0aChORVRXT1JLLCBHT1NTSVAsIE5BVElWRV9QUk9UT0NPTCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhvdXRWTm9kZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoRGF0YURpckNvdW50KDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvcHVsYXRlKGNsdXN0ZXIpOworCisgICAgICAgICAgICBjbHVzdGVyLmdldCg0KS5ub2RldG9vbFJlc3VsdCgiZGVjb21taXNzaW9uIikuYXNzZXJ0cygpLnN1Y2Nlc3MoKTsKKworICAgICAgICAgICAgYXNzZXJ0RW1wdHlMMChjbHVzdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1vdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoQ2x1c3RlciBjbHVzdGVyID0gYnVpbGRlcigpLndpdGhOb2Rlcyg0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uZmlnKGNvbmZpZyAtPiBjb25maWcud2l0aChORVRXT1JLLCBHT1NTSVAsIE5BVElWRV9QUk9UT0NPTCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhvdXRWTm9kZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoRGF0YURpckNvdW50KDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvcHVsYXRlKGNsdXN0ZXIpOworCisgICAgICAgICAgICBsb25nIHRva2VuVmFsID0gKChNdXJtdXIzUGFydGl0aW9uZXIuTG9uZ1Rva2VuKWNsdXN0ZXIudG9rZW5zKCkuZ2V0KDMpLmdldFRva2VuKCkpLnRva2VuOworICAgICAgICAgICAgbG9uZyBwcmV2VG9rZW5WYWwgPSAoKE11cm11cjNQYXJ0aXRpb25lci5Mb25nVG9rZW4pY2x1c3Rlci50b2tlbnMoKS5nZXQoMikuZ2V0VG9rZW4oKSkudG9rZW47CisgICAgICAgICAgICAvLyBtb3ZlIG5vZGUgNCB0byB0aGUgbWlkZGxlIHBvaW50IGJldHdlZW4gaXRzIGN1cnJlbnQgcG9zaXRpb24gYW5kIHRoZSBwcmV2aW91cyBub2RlCisgICAgICAgICAgICBsb25nIG5ld1Rva2VuID0gKHRva2VuVmFsICsgcHJldlRva2VuVmFsKSAvIDI7CisgICAgICAgICAgICBjbHVzdGVyLmdldCg0KS5ub2RldG9vbFJlc3VsdCgibW92ZSIsIFN0cmluZy52YWx1ZU9mKG5ld1Rva2VuKSkuYXNzZXJ0cygpLnN1Y2Nlc3MoKTsKKworICAgICAgICAgICAgYXNzZXJ0RW1wdHlMMChjbHVzdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGUoQ2x1c3RlciBjbHVzdGVyKQorICAgIHsKKyAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgS0VZU1BBQ0UgJXMgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJzogMn0iKSk7CisgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLmRlY29tX3Rlc3QgKGlkIGludCBQUklNQVJZIEtFWSwgdmFsdWUgaW50KSB3aXRoIGNvbXBhY3Rpb24gPSB7ICdjbGFzcyc6J0xldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3knLCAnZW5hYmxlZCc6J2ZhbHNlJyB9IikpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTAwOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoImluc2VydCBpbnRvICVzLmRlY29tX3Rlc3QgKGlkLCB2YWx1ZSkgVkFMVUVTICg/LCA/KSIpLCBDb25zaXN0ZW5jeUxldmVsLkFMTCwgaSwgaSk7CisgICAgICAgICAgICBpZiAoaSAlIDEwMCA9PSAwKQorICAgICAgICAgICAgICAgIGNsdXN0ZXIuZm9yRWFjaCgoaW5zdCkgLT4gaW5zdC5mbHVzaChLRVlTUEFDRSkpOworICAgICAgICB9CisgICAgICAgIGNsdXN0ZXIuZm9yRWFjaCgoaSkgLT4gaS5mbHVzaChLRVlTUEFDRSkpOworICAgICAgICByZWxldmVsKGNsdXN0ZXIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVsZXZlbChDbHVzdGVyIGNsdXN0ZXIpCisgICAgeworICAgICAgICBmb3IgKElJbnZva2FibGVJbnN0YW5jZSBpIDogY2x1c3RlcikKKyAgICAgICAgeworICAgICAgICAgICAgaS5ydW5Pbkluc3RhbmNlKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBTZXQ8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKS5nZXRDb2x1bW5GYW1pbHlTdG9yZSgiZGVjb21fdGVzdCIpLmdldExpdmVTU1RhYmxlcygpOworICAgICAgICAgICAgICAgIGludCBsdmwgPSAxOworICAgICAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5tdXRhdGVMZXZlbEFuZFJlbG9hZChsdmwrKyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFbXB0eUwwKGNsdXN0ZXIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RW1wdHlMMChDbHVzdGVyIGNsdXN0ZXIpCisgICAgeworICAgICAgICBmb3IgKElJbnZva2FibGVJbnN0YW5jZSBpIDogY2x1c3RlcikKKyAgICAgICAgeworICAgICAgICAgICAgaS5ydW5Pbkluc3RhbmNlKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldENvbHVtbkZhbWlseVN0b3JlKCJkZWNvbV90ZXN0IikuZ2V0TGl2ZVNTVGFibGVzKCkpCisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoc3N0YWJsZS5nZXRTU1RhYmxlTGV2ZWwoKSA+IDApOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3Qvc3RyZWFtaW5nL1N0cmVhbUNsb3NlSW5NaWRkbGVUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3Qvc3RyZWFtaW5nL1N0cmVhbUNsb3NlSW5NaWRkbGVUZXN0LmphdmEKaW5kZXggZmM1MmFiNi4uZjI3NzJiYyAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3N0cmVhbWluZy9TdHJlYW1DbG9zZUluTWlkZGxlVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9zdHJlYW1pbmcvU3RyZWFtQ2xvc2VJbk1pZGRsZVRlc3QuamF2YQpAQCAtMzcsOCArMzcsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Ub2tlblN1cHBsaWVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5DbHVzdGVyVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5UZXN0QmFzZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ1RhYmxlWmVyb0NvcHlXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5SYW5nZUF3YXJlU1NUYWJsZVdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVaZXJvQ29weVdyaXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNlcXVlbnRpYWxXcml0ZXI7CiBpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKIApAQCAtMTUwLDcgKzE1MCw3IEBACiAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgICAgICBwdWJsaWMgc3RhdGljIGludCB3cml0ZURpcmVjdGx5VG9DaGFubmVsKEJ5dGVCdWZmZXIgYnVmLCBAU3VwZXJDYWxsIENhbGxhYmxlPEludGVnZXI+IHp1cGVyKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpc0NhbGxlcihCaWdUYWJsZVplcm9Db3B5V3JpdGVyLmNsYXNzLmdldE5hbWUoKSwgIndyaXRlIikpCisgICAgICAgICAgICBpZiAoaXNDYWxsZXIoU1NUYWJsZVplcm9Db3B5V3JpdGVyLmNsYXNzLmdldE5hbWUoKSwgIndyaXRlIikpCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZENoYW5uZWxFeGNlcHRpb24oKTsKICAgICAgICAgICAgIC8vIGRpZmZlcmVudCBjb250ZXh0OyBwYXNzIHRocm91Z2gKICAgICAgICAgICAgIHJldHVybiB6dXBlci5jYWxsKCk7CkBAIC0xOTMsNCArMTkzLDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKGNsYXNzTG9hZGVyLCBDbGFzc0xvYWRpbmdTdHJhdGVneS5EZWZhdWx0LklOSkVDVElPTik7CiAgICAgICAgIH0KICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3N0cmVhbWluZy9TdHJlYW1GYWlsdXJlTG9nc0ZhaWx1cmVEdWVUb1Nlc3Npb25GYWlsZWRUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3Qvc3RyZWFtaW5nL1N0cmVhbUZhaWx1cmVMb2dzRmFpbHVyZUR1ZVRvU2Vzc2lvbkZhaWxlZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDRlYTFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3N0cmVhbWluZy9TdHJlYW1GYWlsdXJlTG9nc0ZhaWx1cmVEdWVUb1Nlc3Npb25GYWlsZWRUZXN0LmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LnN0cmVhbWluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIFN0cmVhbUZhaWx1cmVMb2dzRmFpbHVyZUR1ZVRvU2Vzc2lvbkZhaWxlZFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFN0cmVhbUZhaWx1cmVMb2dzCit7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBmYWlsdXJlRHVlVG9TZXNzaW9uRmFpbGVkKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBzdHJlYW1UZXN0KHRydWUsIlJlbW90ZSBwZWVyIC8xMjcuMC4wLjI6NzAxMiBmYWlsZWQgc3RyZWFtIHNlc3Npb24iLCAxKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3Qvc3RyZWFtaW5nL1N0cmVhbUZhaWx1cmVMb2dzRmFpbHVyZUR1ZVRvU2Vzc2lvblRpbWVvdXRUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3Qvc3RyZWFtaW5nL1N0cmVhbUZhaWx1cmVMb2dzRmFpbHVyZUR1ZVRvU2Vzc2lvblRpbWVvdXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ3MzU5NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9zdHJlYW1pbmcvU3RyZWFtRmFpbHVyZUxvZ3NGYWlsdXJlRHVlVG9TZXNzaW9uVGltZW91dFRlc3QuamF2YQpAQCAtMCwwICsxLDE4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LnN0cmVhbWluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Gb3JrSm9pblBvb2w7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuVW5jaGVja2VkVGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG5ldC5ieXRlYnVkZHkuQnl0ZUJ1ZGR5OworaW1wb3J0IG5ldC5ieXRlYnVkZHkuZHluYW1pYy5sb2FkaW5nLkNsYXNzTG9hZGluZ1N0cmF0ZWd5OworaW1wb3J0IG5ldC5ieXRlYnVkZHkuaW1wbGVtZW50YXRpb24uTWV0aG9kRGVsZWdhdGlvbjsKK2ltcG9ydCBuZXQuYnl0ZWJ1ZGR5LmltcGxlbWVudGF0aW9uLmJpbmQuYW5ub3RhdGlvbi5TdXBlckNhbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuc3RyZWFtaW5nLkNhc3NhbmRyYUluY29taW5nRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlWmVyb0NvcHlXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlNoYXJlZDsKK2ltcG9ydCBvcmcuYXdhaXRpbGl0eS5Bd2FpdGlsaXR5OworCitpbXBvcnQgc3RhdGljIG5ldC5ieXRlYnVkZHkubWF0Y2hlci5FbGVtZW50TWF0Y2hlcnMubmFtZWQ7CitpbXBvcnQgc3RhdGljIG5ldC5ieXRlYnVkZHkubWF0Y2hlci5FbGVtZW50TWF0Y2hlcnMudGFrZXNBcmd1bWVudHM7CisKK3B1YmxpYyBjbGFzcyBTdHJlYW1GYWlsdXJlTG9nc0ZhaWx1cmVEdWVUb1Nlc3Npb25UaW1lb3V0VGVzdCBleHRlbmRzIEFic3RyYWN0U3RyZWFtRmFpbHVyZUxvZ3MKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGZhaWx1cmVEdWVUb1Nlc3Npb25UaW1lb3V0KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKENsdXN0ZXIgY2x1c3RlciA9IENsdXN0ZXIuYnVpbGQoMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhJbnN0YW5jZUluaXRpYWxpemVyKEJCU3RyZWFtVGltZW91dEhlbHBlcjo6aW5zdGFsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25maWcoYyAtPiBjLndpdGgoRmVhdHVyZS52YWx1ZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBkaWUsIHRoaXMgd2lsbCB0cnkgdG8gaGFsdCBKVk0sIHdoaWNoIGlzIGVhc2llciB0byB2YWxpZGF0ZSBpbiB0aGUgdGVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlciBsZXZlbHMgcmVxdWlyZSBjaGVja2luZyBzdGF0ZSBvZiB0aGUgc3Vic3lzdGVtcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJzdHJlYW1fdHJhbnNmZXJfdGFza190aW1lb3V0IiwgIjFtcyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnQoKSkKKyAgICAgICAgeworCisgICAgICAgICAgICBpbml0KGNsdXN0ZXIpOworICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgJXMudGJsIChwayBpbnQgUFJJTUFSWSBLRVkpIikpOworCisgICAgICAgICAgICBGb3JrSm9pblBvb2wuY29tbW9uUG9vbCgpLmV4ZWN1dGUoKCkgLT4gdHJpZ2dlclN0cmVhbWluZyhjbHVzdGVyKSk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBd2FpdGlsaXR5LmF3YWl0KCJEaWQgbm90IHNlZSBzdHJlYW0gcnVubmluZyBvciB0aW1lZCBvdXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuYXRNb3N0KDMsIFRpbWVVbml0Lk1JTlVURVMpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC51bnRpbCgoKSAtPiBTdGF0ZS5TVFJFQU1fSVNfUlVOTklORy5hd2FpdChmYWxzZSkgfHwgc2VhcmNoRm9yTG9nKGNsdXN0ZXIuZ2V0KDEpLCBmYWxzZSwgIlNlc3Npb24gdGltZWQgb3V0IikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXRlLlVOQkxPQ0tfU1RSRUFNLnNpZ25hbCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXdhaXRpbGl0eS5hd2FpdCgiVW5hYmxlIHRvIGZpbmQgJ1Nlc3Npb24gdGltZWQgb3V0JyIpCisgICAgICAgICAgICAgICAgICAgICAgLmF0TW9zdCgxLCBUaW1lVW5pdC5NSU5VVEVTKQorICAgICAgICAgICAgICAgICAgICAgIC51bnRpbCgoKSAtPiBzZWFyY2hGb3JMb2coY2x1c3Rlci5nZXQoMSksIGZhbHNlLCAiU2Vzc2lvbiB0aW1lZCBvdXQiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU2hhcmVkCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdGF0ZQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUZXN0Q29uZGl0aW9uIFNUUkVBTV9JU19SVU5OSU5HID0gbmV3IFRlc3RDb25kaXRpb24oKTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUZXN0Q29uZGl0aW9uIFVOQkxPQ0tfU1RSRUFNID0gbmV3IFRlc3RDb25kaXRpb24oKTsKKyAgICB9CisKKyAgICBAU2hhcmVkCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0Q29uZGl0aW9uCisgICAgeworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gc2lnbmFsZWQgPSBmYWxzZTsKKworICAgICAgICBwdWJsaWMgdm9pZCBhd2FpdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0KHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYXdhaXQoYm9vbGVhbiB0aHJvd09uVGltZW91dCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBkZWFkbGluZU5hbm9zID0gQ2xvY2suR2xvYmFsLm5hbm9UaW1lKCkgKyBUaW1lVW5pdC5NSU5VVEVTLnRvTmFub3MoMSk7CisgICAgICAgICAgICB3aGlsZSAoIXNpZ25hbGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvbmcgcmVtYWluaW5nTWlsbGlzID0gVGltZVVuaXQuTkFOT1NFQ09ORFMudG9NaWxsaXMoZGVhZGxpbmVOYW5vcyAtIENsb2NrLkdsb2JhbC5uYW5vVGltZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nTWlsbGlzIDw9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodGhyb3dPblRpbWVvdXQpIHRocm93IG5ldyBVbmNoZWNrZWRUaW1lb3V0RXhjZXB0aW9uKCJDb25kaXRpb24gbm90IG1ldCB3aXRoaW4gMSBtaW51dGUiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBhd2FpdCBtYXkgYmxvY2sgc2lnbmFsIGZyb20gdHJpZ2dlcmluZyBub3RpZnksIHNvIG1ha2Ugc3VyZSBub3QgdG8gYmxvY2sgZm9yIG1vcmUgdGhhbiA1MDBtcworICAgICAgICAgICAgICAgIHJlbWFpbmluZ01pbGxpcyA9IE1hdGgubWluKHJlbWFpbmluZ01pbGxpcywgNTAwKTsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53YWl0KHJlbWFpbmluZ01pbGxpcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2lnbmFsKCkKKyAgICAgICAgeworICAgICAgICAgICAgc2lnbmFsZWQgPSB0cnVlOworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJCU3RyZWFtVGltZW91dEhlbHBlcgorICAgIHsKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IHdyaXRlRGlyZWN0bHlUb0NoYW5uZWwoQnl0ZUJ1ZmZlciBidWYsIEBTdXBlckNhbGwgQ2FsbGFibGU8SW50ZWdlcj4genVwZXIpIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlzQ2FsbGVyKFNTVGFibGVaZXJvQ29weVdyaXRlci5jbGFzcy5nZXROYW1lKCksICJ3cml0ZSIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXRlLlNUUkVBTV9JU19SVU5OSU5HLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIFN0YXRlLlVOQkxPQ0tfU1RSRUFNLmF3YWl0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBkaWZmZXJlbnQgY29udGV4dDsgcGFzcyB0aHJvdWdoCisgICAgICAgICAgICByZXR1cm4genVwZXIuY2FsbCgpOworICAgICAgICB9CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcHBlbmQoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHBhcnRpdGlvbiwgQFN1cGVyQ2FsbCBDYWxsYWJsZTxCb29sZWFuPiB6dXBlcikgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXNDYWxsZXIoQ2Fzc2FuZHJhSW5jb21pbmdGaWxlLmNsYXNzLmdldE5hbWUoKSwgInJlYWQiKSkgLy8gaGFuZGxlcyBjb21wcmVzc2VkIGFuZCBub24tY29tcHJlc3NlZAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXRlLlNUUkVBTV9JU19SVU5OSU5HLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIFN0YXRlLlVOQkxPQ0tfU1RSRUFNLmF3YWl0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBkaWZmZXJlbnQgY29udGV4dDsgcGFzcyB0aHJvdWdoCisgICAgICAgICAgICByZXR1cm4genVwZXIuY2FsbCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGluc3RhbGwoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsIEludGVnZXIgbnVtKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobnVtICE9IEZBSUxJTkdfTk9ERSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBuZXcgQnl0ZUJ1ZGR5KCkucmViYXNlKFNlcXVlbnRpYWxXcml0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWV0aG9kKG5hbWVkKCJ3cml0ZURpcmVjdGx5VG9DaGFubmVsIikuYW5kKHRha2VzQXJndW1lbnRzKDEpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnRlcmNlcHQoTWV0aG9kRGVsZWdhdGlvbi50byhCQlN0cmVhbVRpbWVvdXRIZWxwZXIuY2xhc3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1ha2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxvYWQoY2xhc3NMb2FkZXIsIENsYXNzTG9hZGluZ1N0cmF0ZWd5LkRlZmF1bHQuSU5KRUNUSU9OKTsKKworICAgICAgICAgICAgbmV3IEJ5dGVCdWRkeSgpLnJlYmFzZShSYW5nZUF3YXJlU1NUYWJsZVdyaXRlci5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tZXRob2QobmFtZWQoImFwcGVuZCIpLmFuZCh0YWtlc0FyZ3VtZW50cygxKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW50ZXJjZXB0KE1ldGhvZERlbGVnYXRpb24udG8oQkJTdHJlYW1UaW1lb3V0SGVscGVyLmNsYXNzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKGNsYXNzTG9hZGVyLCBDbGFzc0xvYWRpbmdTdHJhdGVneS5EZWZhdWx0LklOSkVDVElPTik7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9zdHJlYW1pbmcvU3RyZWFtRmFpbHVyZUxvZ3NGYWlsdXJlSW5UaGVNaWRkbGVXaXRoRU9GVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3N0cmVhbWluZy9TdHJlYW1GYWlsdXJlTG9nc0ZhaWx1cmVJblRoZU1pZGRsZVdpdGhFT0ZUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIwZjRmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9zdHJlYW1pbmcvU3RyZWFtRmFpbHVyZUxvZ3NGYWlsdXJlSW5UaGVNaWRkbGVXaXRoRU9GVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5zdHJlYW1pbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBTdHJlYW1GYWlsdXJlTG9nc0ZhaWx1cmVJblRoZU1pZGRsZVdpdGhFT0ZUZXN0IGV4dGVuZHMgQWJzdHJhY3RTdHJlYW1GYWlsdXJlTG9ncworeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZmFpbHVyZUluVGhlTWlkZGxlV2l0aEVPRigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgc3RyZWFtVGVzdChmYWxzZSwgIlNlc3Npb24gcGVlciAvMTI3LjAuMC4xOjcwMTIgRmFpbGVkIGJlY2F1c2UgdGhlcmUgd2FzIGFuIGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZENoYW5uZWxFeGNlcHRpb24gd2l0aCBzdGF0ZT1TVFJFQU1JTkciLCBGQUlMSU5HX05PREUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9zdHJlYW1pbmcvU3RyZWFtRmFpbHVyZUxvZ3NGYWlsdXJlSW5UaGVNaWRkbGVXaXRoVW5rbm93blRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9zdHJlYW1pbmcvU3RyZWFtRmFpbHVyZUxvZ3NGYWlsdXJlSW5UaGVNaWRkbGVXaXRoVW5rbm93blRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDI1MDdiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3N0cmVhbWluZy9TdHJlYW1GYWlsdXJlTG9nc0ZhaWx1cmVJblRoZU1pZGRsZVdpdGhVbmtub3duVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5zdHJlYW1pbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBTdHJlYW1GYWlsdXJlTG9nc0ZhaWx1cmVJblRoZU1pZGRsZVdpdGhVbmtub3duVGVzdCBleHRlbmRzIEFic3RyYWN0U3RyZWFtRmFpbHVyZUxvZ3MKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGZhaWx1cmVJblRoZU1pZGRsZVdpdGhVbmtub3duKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBzdHJlYW1UZXN0KHRydWUsICJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogVEVTVCIsIEZBSUxJTkdfTk9ERSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3RocmVzaG9sZHMvUm93SW5kZXhTaXplV2FybmluZ1Rlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC90aHJlc2hvbGRzL1Jvd0luZGV4U2l6ZVdhcm5pbmdUZXN0LmphdmEKaW5kZXggMzNlNmNkNi4uYTBmN2Y2MCAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3RocmVzaG9sZHMvUm93SW5kZXhTaXplV2FybmluZ1Rlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvdGhyZXNob2xkcy9Sb3dJbmRleFNpemVXYXJuaW5nVGVzdC5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YVN0b3JhZ2VTcGVjOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YVN0b3JhZ2VTcGVjLkRhdGFTdG9yYWdlVW5pdC5LSUJJQllURVM7CiBpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKQEAgLTM3LDEzICszOCwxNiBAQAogICAgIHsKICAgICAgICAgQWJzdHJhY3RDbGllbnRTaXplV2FybmluZy5zZXR1cENsYXNzKCk7CiAKKyAgICAgICAgLy9ub2luc3BlY3Rpb24gQ29udmVydDJNZXRob2RSZWYKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoQ0xVU1RFUi5nZXQoMSkuY2FsbE9uSW5zdGFuY2UoKCkgLT4gQmlnRm9ybWF0LmlzU2VsZWN0ZWQoKSkpOworCiAgICAgICAgIENMVVNURVIuc3RyZWFtKCkuZm9yRWFjaChpIC0+IGkucnVuT25JbnN0YW5jZSgoKSAtPiB7CiAgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Um93SW5kZXhSZWFkU2l6ZVdhcm5UaHJlc2hvbGQobmV3IERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCgxLCBLSUJJQllURVMpKTsKICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRSb3dJbmRleFJlYWRTaXplRmFpbFRocmVzaG9sZChuZXcgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kKDIsIEtJQklCWVRFUykpOwogCiAgICAgICAgICAgICAvLyBoYWNrIHRvIGZvcmNlIG11bHRpcGxlIGluZGV4IGVudHJpZXMKICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleENhY2hlU2l6ZSgxIDw8IDIwKTsKLSAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleFNpemUoMCk7CisgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoMCk7CiAgICAgICAgIH0pKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC90b3BvbG9neS9EZWNvbW1pc3Npb25Bdm9pZFJlYWRUaW1lb3V0c1Rlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC90b3BvbG9neS9EZWNvbW1pc3Npb25Bdm9pZFJlYWRUaW1lb3V0c1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjdmN2YxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3RvcG9sb2d5L0RlY29tbWlzc2lvbkF2b2lkUmVhZFRpbWVvdXRzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC50b3BvbG9neTsKKworcHVibGljIGNsYXNzIERlY29tbWlzc2lvbkF2b2lkUmVhZFRpbWVvdXRzVGVzdCBleHRlbmRzIERlY29tbWlzc2lvbkF2b2lkVGltZW91dHMKK3sKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFF1ZXJ5KFN0cmluZyB0YWJsZSkKKyAgICB7CisgICAgICAgIHJldHVybiAiU0VMRUNUICogRlJPTSAiICsgdGFibGUgKyAiIFdIRVJFIHBrPT8iOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC90b3BvbG9neS9EZWNvbW1pc3Npb25Bdm9pZFRpbWVvdXRzLmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvdG9wb2xvZ3kvRGVjb21taXNzaW9uQXZvaWRUaW1lb3V0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MjA2ZGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvdG9wb2xvZ3kvRGVjb21taXNzaW9uQXZvaWRUaW1lb3V0cy5qYXZhCkBAIC0wLDAgKzEsMjM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3QudG9wb2xvZ3k7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbXBsZXRhYmxlRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgbmV0LmJ5dGVidWRkeS5CeXRlQnVkZHk7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5keW5hbWljLmxvYWRpbmcuQ2xhc3NMb2FkaW5nU3RyYXRlZ3k7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5pbXBsZW1lbnRhdGlvbi5NZXRob2REZWxlZ2F0aW9uOworaW1wb3J0IG5ldC5ieXRlYnVkZHkuaW1wbGVtZW50YXRpb24uYmluZC5hbm5vdGF0aW9uLlN1cGVyQ2FsbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5NdXJtdXIzUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuQ29uc2lzdGVuY3lMZXZlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuSUluc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSW5zdGFuY2VJbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuSUludm9rYWJsZUluc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5TaW1wbGVRdWVyeVJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuQ2x1c3RlclV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3QuVGVzdEJhc2VJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnV0aWwuQ29vcmRpbmF0b3JzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnV0aWwuUXVlcnlSZXN1bHRVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnV0aWwuYnl0ZXJld3JpdGUuU3RhdHVzQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudXRpbC5ieXRlcmV3cml0ZS5TdGF0dXNDaGFuZ2VMaXN0ZW5lci5Ib29rczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC51dGlsLmJ5dGVyZXdyaXRlLlVuZGVhZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlJlYWRUaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuV3JpdGVUaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtcy5BcHBsaWNhdGlvblN0YXRlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuRHluYW1pY0VuZHBvaW50U25pdGNoOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmVwbGljYTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLlJlcGxpY2FDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5WZXJiOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkFzc2VydGlvblV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworCitpbXBvcnQgc3RhdGljIG5ldC5ieXRlYnVkZHkubWF0Y2hlci5FbGVtZW50TWF0Y2hlcnMubmFtZWQ7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZWNvbW1pc3Npb25Bdm9pZFRpbWVvdXRzIGV4dGVuZHMgVGVzdEJhc2VJbXBsCit7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVDT01fTk9ERSA9IDY7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoQ2x1c3RlciBjbHVzdGVyID0gQ2x1c3Rlci5idWlsZCg4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFJhY2tzKDIsIDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoSW5zdGFuY2VJbml0aWFsaXplcihuZXcgQkIoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25maWcoYyAtPiBjLndpdGgoRmVhdHVyZS5HT1NTSVApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoInRyYW5zZmVyX2hpbnRzX29uX2RlY29tbWlzc2lvbiIsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJzZXZlcml0eV9kdXJpbmdfZGVjb21taXNzaW9uIiwgMTAwMDBEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJkeW5hbWljX3NuaXRjaF9iYWRuZXNzX3RocmVzaG9sZCIsIDApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZmFpbHVyZSBoYXBwZW5zIGluIFBlbmRpbmdSYW5nZUNhbGN1bGF0b3JTZXJ2aWNlLnVwZGF0ZSwgc28gdGhlIGtleXNwYWNlIGlzIGJlaW5nIHJlbW92ZWQKKyAgICAgICAgICAgIGNsdXN0ZXIuc2V0VW5jYXVnaHRFeGNlcHRpb25zRmlsdGVyKChpZ25vcmUsIHRocm93YWJsZSkgLT4gISJVbmtub3duIGtleXNwYWNlIHN5c3RlbV9kaXN0cmlidXRlZCIuZXF1YWxzKHRocm93YWJsZS5nZXRNZXNzYWdlKCkpKTsKKworICAgICAgICAgICAgZml4RGlzdHJpYnV0ZWRTY2hlbWFzKGNsdXN0ZXIpOworICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoIkNSRUFURSBLRVlTUEFDRSAiICsgS0VZU1BBQ0UgKyAiIFdJVEggcmVwbGljYXRpb24gPSB7J2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogMywgJ2RhdGFjZW50ZXIyJzogM30iKTsKKyAgICAgICAgICAgIFN0cmluZyB0YWJsZSA9IEtFWVNQQUNFICsgIi50YmwiOworICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoIkNSRUFURSBUQUJMRSAiICsgdGFibGUgKyAiIChwayBibG9iIFBSSU1BUlkgS0VZKSIpOworCisgICAgICAgICAgICBMaXN0PElJbnZva2FibGVJbnN0YW5jZT4gZGMxID0gY2x1c3Rlci5nZXQoMSwgMiwgMywgNCk7CisgICAgICAgICAgICBMaXN0PElJbnZva2FibGVJbnN0YW5jZT4gZGMyID0gY2x1c3Rlci5nZXQoNSwgNiwgNywgOCk7CisgICAgICAgICAgICBJSW52b2thYmxlSW5zdGFuY2UgdG9EZWNvbSA9IGRjMi5nZXQoMSk7CisgICAgICAgICAgICBMaXN0PE11cm11cjNQYXJ0aXRpb25lci5Mb25nVG9rZW4+IHRva2VucyA9IENsdXN0ZXJVdGlscy5nZXRMb2NhbFRva2Vucyh0b0RlY29tKS5zdHJlYW0oKS5tYXAodCAtPiBuZXcgTXVybXVyM1BhcnRpdGlvbmVyLkxvbmdUb2tlbihMb25nLnBhcnNlTG9uZyh0KSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKyAgICAgICAgICAgIGZvciAoTXVybXVyM1BhcnRpdGlvbmVyLkxvbmdUb2tlbiB0b2tlbiA6IHRva2VucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGtleSA9IE11cm11cjNQYXJ0aXRpb25lci5Mb25nVG9rZW4ua2V5Rm9yVG9rZW4odG9rZW4pOworCisgICAgICAgICAgICAgICAgdG9EZWNvbS5jb29yZGluYXRvcigpLmV4ZWN1dGUoIklOU0VSVCBJTlRPICIgKyB0YWJsZSArICIocGspIFZBTFVFUyAoPykiLCBDb25zaXN0ZW5jeUxldmVsLkVBQ0hfUVVPUlVNLCBrZXkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBub2RldG9vbCA9IENvbXBsZXRhYmxlRnV0dXJlLnJ1bkFzeW5jKCgpIC0+IHRvRGVjb20ubm9kZXRvb2xSZXN1bHQoImRlY29tbWlzc2lvbiIpLmFzc2VydHMoKS5zdWNjZXNzKCkpOworCisgICAgICAgICAgICBIb29rcyBzdGF0dXNIb29rcyA9IFN0YXR1c0NoYW5nZUxpc3RlbmVyLmhvb2tzKERFQ09NX05PREUpOworICAgICAgICAgICAgc3RhdHVzSG9va3MubGVhdmluZy5hd2FpdEFuZEVudGVyKCk7CisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgYWxsIG5vZGVzIHNlZSB0aGUgc2V2ZXJpdHkgY2hhbmdlCisgICAgICAgICAgICBDbHVzdGVyVXRpbHMuYXdhaXRHb3NzaXBTdGF0ZU1hdGNoKGNsdXN0ZXIsIGNsdXN0ZXIuZ2V0KERFQ09NX05PREUpLCBBcHBsaWNhdGlvblN0YXRlLlNFVkVSSVRZKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuZm9yRWFjaChpIC0+IGkucnVuT25JbnN0YW5jZSgoKSAtPiAoKER5bmFtaWNFbmRwb2ludFNuaXRjaCkgRGF0YWJhc2VEZXNjcmlwdG9yLmdldEVuZHBvaW50U25pdGNoKCkpLnVwZGF0ZVNjb3JlcygpKSk7CisKKyAgICAgICAgICAgIHN0YXR1c0hvb2tzLmxlYXZlLmF3YWl0KCk7CisgICAgICAgICAgICBjbHVzdGVyLmZpbHRlcnMoKS52ZXJicyhWZXJiLkdPU1NJUF9ESUdFU1RfU1lOLmlkKS5kcm9wKCk7CisgICAgICAgICAgICBzdGF0dXNIb29rcy5sZWF2ZS5lbnRlcigpOworCisgICAgICAgICAgICBub2RldG9vbC5qb2luKCk7CisKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmYWlsdXJlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gZ2V0UXVlcnkodGFibGUpOworICAgICAgICAgICAgZm9yIChNdXJtdXIzUGFydGl0aW9uZXIuTG9uZ1Rva2VuIHRva2VuIDogdG9rZW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIga2V5ID0gTXVybXVyM1BhcnRpdGlvbmVyLkxvbmdUb2tlbi5rZXlGb3JUb2tlbih0b2tlbik7CisKKyAgICAgICAgICAgICAgICBmb3IgKElJbnZva2FibGVJbnN0YW5jZSBpIDogZGMxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChDb25zaXN0ZW5jeUxldmVsIGNsIDogbGV2ZWxzKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvb3JkaW5hdG9ycy53aXRoVHJhY2luZyhpLmNvb3JkaW5hdG9yKCksIHF1ZXJ5LCBjbCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChDb29yZGluYXRvcnMuV2l0aFRyYWNlRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gZS5nZXRDYXVzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBc3NlcnRpb25VdGlscy5pc0luc3RhbmNlb2YoV3JpdGVUaW1lb3V0RXhjZXB0aW9uLmNsYXNzKS5tYXRjaGVzKGNhdXNlKSB8fCBBc3NlcnRpb25VdGlscy5pc0luc3RhbmNlb2YoUmVhZFRpbWVvdXRFeGNlcHRpb24uY2xhc3MpLm1hdGNoZXMoY2F1c2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHRyYWNlTWVzc3NhZ2VzID0gQXJyYXlzLmFzTGlzdCgiU2VuZGluZyBtdXRhdGlvbiB0byByZW1vdGUgcmVwbGljYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRpbmcgZGF0YSBmcm9tIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZGluZyBkaWdlc3QgZnJvbSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVRdWVyeVJlc3VsdCBmaWx0ZXJlZCA9IFF1ZXJ5UmVzdWx0VXRpbC5xdWVyeShlLnRyYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QoImFjdGl2aXR5IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHJvdyAtPiB0cmFjZU1lc3NzYWdlcy5zdHJlYW0oKS5hbnlNYXRjaChyb3cuZ2V0U3RyaW5nKCJhY3Rpdml0eSIpOjpzdGFydHNXaXRoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3NBbmRQb3J0IGRlY29tZU5vZGUgPSBCQi5hZGRyZXNzKChieXRlKSBERUNPTV9OT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGZpbHRlcmVkLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvZyA9IGZpbHRlcmVkLm5leHQoKS5nZXRTdHJpbmcoImFjdGl2aXR5Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmNvbnRhaW5zKGRlY29tZU5vZGUudG9TdHJpbmcoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZXMuYWRkKCJGYWlsdXJlIHdpdGggbm9kZSIgKyBpLmNvbmZpZygpLm51bSgpICsgIiwgY2w9IiArIGNsICsgIjtcblx0IiArIGNhdXNlLmdldE1lc3NhZ2UoKSArICI7XG5cdFRyYWNlIGFjdGl2aXR5PSIgKyBsb2cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFmYWlsdXJlcy5pc0VtcHR5KCkpIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihTdHJpbmcuam9pbigiXG4iLCBmYWlsdXJlcykpOworCisgICAgICAgICAgICAvLyBzaW5jZSBvbmx5IG9uZSB0ZXN0cyBleGlzdHMgcGVyIGZpbGUsIHNodXRkb3duIHdpdGhvdXQgYmxvY2tpbmcgc28gLmNsb3NlIGRvZXMgbm90IHRpbWVvdXQKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZCVXRpbGl0aWVzLndhaXRPbkZ1dHVyZXMoY2x1c3Rlci5zdHJlYW0oKS5tYXAoSUluc3RhbmNlOjpzaHV0ZG93bikuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIFRpbWVVbml0Lk1JTlVURVMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRRdWVyeShTdHJpbmcgdGFibGUpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxDb25zaXN0ZW5jeUxldmVsPiBsZXZlbHMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEVudW1TZXQub2YoQ29uc2lzdGVuY3lMZXZlbC5RVU9SVU0sIENvbnNpc3RlbmN5TGV2ZWwuTE9DQUxfUVVPUlVNLCBDb25zaXN0ZW5jeUxldmVsLkVBQ0hfUVVPUlVNLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zaXN0ZW5jeUxldmVsLk9ORSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCQiBpbXBsZW1lbnRzIElJbnN0YW5jZUluaXRpYWxpemVyLCBBdXRvQ2xvc2VhYmxlCisgICAgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaW5pdGlhbGlzZShDbGFzc0xvYWRlciBjbCwgVGhyZWFkR3JvdXAgZ3JvdXAsIGludCBub2RlLCBpbnQgZ2VuZXJhdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgVW5kZWFkLmluc3RhbGwoY2wpOworICAgICAgICAgICAgbmV3IEJ5dGVCdWRkeSgpLnJlYmFzZShEeW5hbWljRW5kcG9pbnRTbml0Y2guY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWV0aG9kKG5hbWVkKCJzb3J0ZWRCeVByb3hpbWl0eSIpKS5pbnRlcmNlcHQoTWV0aG9kRGVsZWdhdGlvbi50byhCQi5jbGFzcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFrZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubG9hZChjbCwgQ2xhc3NMb2FkaW5nU3RyYXRlZ3kuRGVmYXVsdC5JTkpFQ1RJT04pOworCisgICAgICAgICAgICBpZiAobm9kZSAhPSBERUNPTV9OT0RFKSByZXR1cm47CisgICAgICAgICAgICBTdGF0dXNDaGFuZ2VMaXN0ZW5lci5pbnN0YWxsKGNsLCBub2RlLCBTdGF0dXNDaGFuZ2VMaXN0ZW5lci5TdGF0dXMuTEVBVklORywgU3RhdHVzQ2hhbmdlTGlzdGVuZXIuU3RhdHVzLkxFQVZFKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgVW5kZWFkLmNsb3NlKCk7CisgICAgICAgICAgICBTdGF0dXNDaGFuZ2VMaXN0ZW5lci5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyAgPEMgZXh0ZW5kcyBSZXBsaWNhQ29sbGVjdGlvbjw/IGV4dGVuZHMgQz4+IEMgc29ydGVkQnlQcm94aW1pdHkoZmluYWwgSW5ldEFkZHJlc3NBbmRQb3J0IGFkZHJlc3MsIEMgcmVwbGljYXMsIEBTdXBlckNhbGwgQ2FsbGFibGU8Qz4gcmVhbCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBDIHJlc3VsdCA9IHJlYWwuY2FsbCgpOworICAgICAgICAgICAgaWYgKHJlc3VsdC5zaXplKCkgPiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzQW5kUG9ydCBkZWNvbSA9IGFkZHJlc3MoKGJ5dGUpIERFQ09NX05PREUpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZW5kcG9pbnRzKCkuY29udGFpbnMoZGVjb20pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKER5bmFtaWNFbmRwb2ludFNuaXRjaC5nZXRTZXZlcml0eShkZWNvbSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUmVwbGljYSBsYXN0ID0gcmVzdWx0LmdldChyZXN1bHQuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxhc3QuZW5kcG9pbnQoKS5lcXVhbHMoZGVjb20pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiRXhwZWN0ZWQgZW5kcG9pbnQgIiArIGRlY29tICsgIiB0byBiZSB0aGUgbGFzdCByZXBsaWNhLCBidXQgZm91bmQgIiArIGxhc3QuZW5kcG9pbnQoKSArICI7ICIgKyByZXN1bHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIEluZXRBZGRyZXNzQW5kUG9ydCBhZGRyZXNzKGJ5dGUgbnVtKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSW5ldEFkZHJlc3NBbmRQb3J0LmdldEJ5QWRkcmVzc092ZXJyaWRlRGVmYXVsdHMoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKG5ldyBieXRlW117IDEyNywgMCwgMCwgbnVtIH0pLCA3MDEyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC90b3BvbG9neS9EZWNvbW1pc3Npb25Bdm9pZFdyaXRlVGltZW91dHNUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvdG9wb2xvZ3kvRGVjb21taXNzaW9uQXZvaWRXcml0ZVRpbWVvdXRzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMmViYzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvdG9wb2xvZ3kvRGVjb21taXNzaW9uQXZvaWRXcml0ZVRpbWVvdXRzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC50b3BvbG9neTsKKworcHVibGljIGNsYXNzIERlY29tbWlzc2lvbkF2b2lkV3JpdGVUaW1lb3V0c1Rlc3QgZXh0ZW5kcyBEZWNvbW1pc3Npb25Bdm9pZFRpbWVvdXRzCit7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRRdWVyeShTdHJpbmcgdGFibGUpCisgICAgeworICAgICAgICByZXR1cm4gIklOU0VSVCBJTlRPICIgKyB0YWJsZSArICIocGspIFZBTFVFUyAoPykiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9CYXRjaFVwZ3JhZGVUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvQmF0Y2hVcGdyYWRlVGVzdC5qYXZhCmluZGV4IGRiNWUyZTEuLjdiYTEyZmYgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9CYXRjaFVwZ3JhZGVUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0JhdGNoVXBncmFkZVRlc3QuamF2YQpAQCAtMzMsNyArMzMsNyBAQAogICAgICAgICBuZXcgVGVzdENhc2UoKQogICAgICAgICAubm9kZXMoMikKICAgICAgICAgLm5vZGVzVG9VcGdyYWRlKDIpCi0gICAgICAgIC51cGdyYWRlc0Zyb20odjQwKS5zZXR1cCgoY2x1c3RlcikgLT4geworICAgICAgICAudXBncmFkZXNUb0N1cnJlbnRGcm9tKHY0MCkuc2V0dXAoKGNsdXN0ZXIpIC0+IHsKICAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKCJDUkVBVEUgVEFCTEUgIiArIEtFWVNQQUNFICsgIi51c2VycyAoIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlcmlkIHV1aWQgUFJJTUFSWSBLRVksIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlyc3RuYW1lIGFzY2lpLCIgKwpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlQ29sdW1uRGVsZXRlVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlQ29sdW1uRGVsZXRlVGVzdC5qYXZhCmluZGV4IDcyMGExYjUuLjJhMmVjZTYgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Db21wYWN0U3RvcmFnZUNvbHVtbkRlbGV0ZVRlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvQ29tcGFjdFN0b3JhZ2VDb2x1bW5EZWxldGVUZXN0LmphdmEKQEAgLTMzLDcgKzMzLDcgQEAKICAgICAgICAgbmV3IFRlc3RDYXNlKCkKICAgICAgICAgLm5vZGVzKDIpCiAgICAgICAgIC5ub2Rlc1RvVXBncmFkZSgyKQotICAgICAgICAudXBncmFkZXNGcm9tKHYzMCkKKyAgICAgICAgLnVwZ3JhZGVzVG9DdXJyZW50RnJvbSh2NDApCiAgICAgICAgIC5zZXR1cCgoY2x1c3RlcikgLT4gewogICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoIkNSRUFURSBUQUJMRSAiICsgS0VZU1BBQ0UgKyAiLnRibCAocGsgaW50LCBjayBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkgV0lUSCBDT01QQUNUIFNUT1JBR0UiKTsKICAgICAgICAgfSkKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Db21wYWN0U3RvcmFnZUhpZGRlbkNvbHVtblRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Db21wYWN0U3RvcmFnZUhpZGRlbkNvbHVtblRlc3QuamF2YQppbmRleCA0ZTUyMzZjLi45M2Y3NzBjIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvQ29tcGFjdFN0b3JhZ2VIaWRkZW5Db2x1bW5UZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlSGlkZGVuQ29sdW1uVGVzdC5qYXZhCkBAIC0zMyw3ICszMyw3IEBACiAgICAgICAgIG5ldyBUZXN0Q2FzZSgpCiAgICAgICAgIC5ub2RlcygyKQogICAgICAgICAubm9kZXNUb1VwZ3JhZGUoMikKLSAgICAgICAgLnVwZ3JhZGVzRnJvbSh2MzApCisgICAgICAgIC51cGdyYWRlc1RvQ3VycmVudEZyb20odjQwKQogICAgICAgICAuc2V0dXAoKGNsdXN0ZXIpIC0+IHsKICAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKCJDUkVBVEUgVEFCTEUgIiArIEtFWVNQQUNFICsgIi50YmwgKHBrIGludCwgY2sgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkgV0lUSCBDT01QQUNUIFNUT1JBR0UiKTsKICAgICAgICAgfSkKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Db21wYWN0U3RvcmFnZUltcGxpY2l0TnVsbEluQ2x1c3RlcmluZ1Rlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Db21wYWN0U3RvcmFnZUltcGxpY2l0TnVsbEluQ2x1c3RlcmluZ1Rlc3QuamF2YQppbmRleCA5ZDQ4MjRhLi41MmI3OTJlIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvQ29tcGFjdFN0b3JhZ2VJbXBsaWNpdE51bGxJbkNsdXN0ZXJpbmdUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlSW1wbGljaXROdWxsSW5DbHVzdGVyaW5nVGVzdC5qYXZhCkBAIC0zMyw3ICszMyw3IEBACiAgICAgICAgIG5ldyBUZXN0Q2FzZSgpCiAgICAgICAgIC5ub2RlcygyKQogICAgICAgICAubm9kZXNUb1VwZ3JhZGUoMikKLSAgICAgICAgLnVwZ3JhZGVzRnJvbSh2MzApCisgICAgICAgIC51cGdyYWRlc1RvQ3VycmVudEZyb20odjQwKQogICAgICAgICAuc2V0dXAoKGNsdXN0ZXIpIC0+IHsKICAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKCJDUkVBVEUgVEFCTEUgIiArIEtFWVNQQUNFICsgIi50YmwgKHBrIGludCwgY2sxIGludCwgY2syIGludCwgdiBpbnQsIFBSSU1BUlkgS0VZIChwaywgY2sxLCBjazIpKSBXSVRIIENPTVBBQ1QgU1RPUkFHRSIpOwogICAgICAgICB9KQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlUGFnaW5nVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlUGFnaW5nVGVzdC5qYXZhCmluZGV4IDMwN2Q2ZGQuLjE2NDMxOTAgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Db21wYWN0U3RvcmFnZVBhZ2luZ1Rlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvQ29tcGFjdFN0b3JhZ2VQYWdpbmdUZXN0LmphdmEKQEAgLTMzLDcgKzMzLDcgQEAKICAgICAgICAgbmV3IFRlc3RDYXNlKCkKICAgICAgICAgLm5vZGVzKDIpCiAgICAgICAgIC5ub2Rlc1RvVXBncmFkZSgyKQotICAgICAgICAudXBncmFkZXNGcm9tKHYzMCkKKyAgICAgICAgLnVwZ3JhZGVzVG9DdXJyZW50RnJvbSh2NDApCiAgICAgICAgIC5zZXR1cCgoY2x1c3RlcikgLT4gewogICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoIkNSRUFURSBUQUJMRSAiICsgS0VZU1BBQ0UgKyAiLnRibCAocGsgaW50LCBjayBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkgV0lUSCBDT01QQUNUIFNUT1JBR0UiKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgMTA7IGkrKykKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Db21wYWN0U3RvcmFnZVBhZ2luZ1dpdGhQcm90b2NvbFRlc3Rlci5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlUGFnaW5nV2l0aFByb3RvY29sVGVzdGVyLmphdmEKaW5kZXggNmRkM2JkOS4uNjkxYWQ0ZSAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlUGFnaW5nV2l0aFByb3RvY29sVGVzdGVyLmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlUGFnaW5nV2l0aFByb3RvY29sVGVzdGVyLmphdmEKQEAgLTYxLDcgKzYxLDcgQEAKICAgICAgICAgbmV3IFRlc3RDYXNlKCkKICAgICAgICAgLm5vZGVzKDIpCiAgICAgICAgIC5ub2Rlc1RvVXBncmFkZSgxKQotICAgICAgICAuc2luZ2xlVXBncmFkZShpbml0aWFsVmVyc2lvbigpKQorICAgICAgICAuc2luZ2xlVXBncmFkZVRvQ3VycmVudEZyb20oaW5pdGlhbFZlcnNpb24oKSkKICAgICAgICAgLndpdGhDb25maWcoY29uZmlnIC0+IGNvbmZpZy53aXRoKEdPU1NJUCwgTkVUV09SSywgTkFUSVZFX1BST1RPQ09MKSkKICAgICAgICAgLnNldHVwKGMgLT4gewogICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgJXMudCAocGsgdGV4dCwgY2sgdGV4dCwgdiB0ZXh0LCAiICsKQEAgLTg4LDcgKzg4LDcgQEAKICAgICAgICAgbmV3IFRlc3RDYXNlKCkKICAgICAgICAgLm5vZGVzKDIpCiAgICAgICAgIC5ub2Rlc1RvVXBncmFkZSgxKQotICAgICAgICAuc2luZ2xlVXBncmFkZShpbml0aWFsVmVyc2lvbigpKQorICAgICAgICAuc2luZ2xlVXBncmFkZVRvQ3VycmVudEZyb20oaW5pdGlhbFZlcnNpb24oKSkKICAgICAgICAgLndpdGhDb25maWcoY29uZmlnIC0+IGNvbmZpZy53aXRoKEdPU1NJUCwgTkVUV09SSywgTkFUSVZFX1BST1RPQ09MKSkKICAgICAgICAgLnNldHVwKGMgLT4gewogICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgJXMudCAocGsgdGV4dCwgY2sxIHRleHQsIGNrMiB0ZXh0LCB2IHRleHQsICIgKwpAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgICAgIG5ldyBUZXN0Q2FzZSgpCiAgICAgICAgIC5ub2RlcygyKQogICAgICAgICAubm9kZXNUb1VwZ3JhZGUoMSkKLSAgICAgICAgLnNpbmdsZVVwZ3JhZGUoaW5pdGlhbFZlcnNpb24oKSkKKyAgICAgICAgLnNpbmdsZVVwZ3JhZGVUb0N1cnJlbnRGcm9tKGluaXRpYWxWZXJzaW9uKCkpCiAgICAgICAgIC53aXRoQ29uZmlnKGNvbmZpZyAtPiBjb25maWcud2l0aChHT1NTSVAsIE5FVFdPUkssIE5BVElWRV9QUk9UT0NPTCkpCiAgICAgICAgIC5zZXR1cChjIC0+IHsKICAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnQgKHBrIHRleHQgUFJJTUFSWSBLRVksIHYxIHRleHQsIHYyIHRleHQpIFdJVEggQ09NUEFDVCBTVE9SQUdFIikpOwpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlUGFnaW5nV2l0aFByb3RvY29sVjMwVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlUGFnaW5nV2l0aFByb3RvY29sVjMwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MThhNTE0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Db21wYWN0U3RvcmFnZVBhZ2luZ1dpdGhQcm90b2NvbFYzMFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudXBncmFkZTsKLQotaW1wb3J0IGNvbS52ZHVybW9udC5zZW12ZXI0ai5TZW12ZXI7Ci0KLS8qKgotICoge0BsaW5rIENvbXBhY3RTdG9yYWdlUGFnaW5nV2l0aFByb3RvY29sVGVzdGVyfSBmb3IgdjMwIC0+IENVUlJFTlQgdXBncmFkZSBwYXRoLgotICovCi1wdWJsaWMgY2xhc3MgQ29tcGFjdFN0b3JhZ2VQYWdpbmdXaXRoUHJvdG9jb2xWMzBUZXN0IGV4dGVuZHMgQ29tcGFjdFN0b3JhZ2VQYWdpbmdXaXRoUHJvdG9jb2xUZXN0ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU2VtdmVyIGluaXRpYWxWZXJzaW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2MzA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlUGFnaW5nV2l0aFByb3RvY29sVjNYVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlUGFnaW5nV2l0aFByb3RvY29sVjNYVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDNjMzcyLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Db21wYWN0U3RvcmFnZVBhZ2luZ1dpdGhQcm90b2NvbFYzWFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudXBncmFkZTsKLQotaW1wb3J0IGNvbS52ZHVybW9udC5zZW12ZXI0ai5TZW12ZXI7Ci0KLS8qKgotICoge0BsaW5rIENvbXBhY3RTdG9yYWdlUGFnaW5nV2l0aFByb3RvY29sVGVzdGVyfSBmb3IgdjNYIC0+IENVUlJFTlQgdXBncmFkZSBwYXRoLgotICovCi1wdWJsaWMgY2xhc3MgQ29tcGFjdFN0b3JhZ2VQYWdpbmdXaXRoUHJvdG9jb2xWM1hUZXN0IGV4dGVuZHMgQ29tcGFjdFN0b3JhZ2VQYWdpbmdXaXRoUHJvdG9jb2xUZXN0ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU2VtdmVyIGluaXRpYWxWZXJzaW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2M1g7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlUGFnaW5nV2l0aFByb3RvY29sVjQxVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlUGFnaW5nV2l0aFByb3RvY29sVjQxVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZDdkYzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvQ29tcGFjdFN0b3JhZ2VQYWdpbmdXaXRoUHJvdG9jb2xWNDFUZXN0LmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC51cGdyYWRlOworCitpbXBvcnQgY29tLnZkdXJtb250LnNlbXZlcjRqLlNlbXZlcjsKKworLyoqCisgKiB7QGxpbmsgQ29tcGFjdFN0b3JhZ2VQYWdpbmdXaXRoUHJvdG9jb2xUZXN0ZXJ9IGZvciB2NDEgLT4gQ1VSUkVOVCB1cGdyYWRlIHBhdGguCisgKi8KK3B1YmxpYyBjbGFzcyBDb21wYWN0U3RvcmFnZVBhZ2luZ1dpdGhQcm90b2NvbFY0MVRlc3QgZXh0ZW5kcyBDb21wYWN0U3RvcmFnZVBhZ2luZ1dpdGhQcm90b2NvbFRlc3RlcgoreworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTZW12ZXIgaW5pdGlhbFZlcnNpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHY0MTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvQ29tcGFjdGlvbkhpc3RvcnlTeXN0ZW1UYWJsZVVwZ3JhZGVUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvQ29tcGFjdGlvbkhpc3RvcnlTeXN0ZW1UYWJsZVVwZ3JhZGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNlOTJkZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Db21wYWN0aW9uSGlzdG9yeVN5c3RlbVRhYmxlVXBncmFkZVRlc3QuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnVwZ3JhZGU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCitpbXBvcnQgY29tLnZkdXJtb250LnNlbXZlcjRqLlNlbXZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuVG9vbFJ1bm5lcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSGlzdG9yeVRhYnVsYXJEYXRhLkNPTVBBQ1RJT05fVFlQRV9QUk9QRVJUWTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbEp2bUR0ZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5ub2RldG9vbC5Db21wYWN0aW9uSGlzdG9yeVRlc3QuYXNzZXJ0Q29tcGFjdGlvbkhpc3RvcnlPdXRQdXQ7CisKK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ29tcGFjdGlvbkhpc3RvcnlTeXN0ZW1UYWJsZVVwZ3JhZGVUZXN0IGV4dGVuZHMgVXBncmFkZVRlc3RCYXNlCit7CisgICAgQFBhcmFtZXRlcgorICAgIHB1YmxpYyBTZW12ZXIgdmVyc2lvbjsKKworICAgIEBQYXJhbWV0ZXJzKCkKKyAgICBwdWJsaWMgc3RhdGljIEFycmF5TGlzdDxTZW12ZXI+IHZlcnNpb25zKCkKKyAgICB7CisgICAgICAgIHJldHVybiBMaXN0cy5uZXdBcnJheUxpc3QodjMwLCB2M1gsIHY0MCwgdjQxKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNvbXBhY3Rpb25IaXN0b3J5U3lzdGVtVGFibGVUZXN0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgbmV3IFRlc3RDYXNlKCkKKyAgICAgICAgLm5vZGVzKDEpCisgICAgICAgIC5ub2Rlc1RvVXBncmFkZSgxKQorICAgICAgICAudXBncmFkZXNUb0N1cnJlbnRGcm9tKHZlcnNpb24pCisgICAgICAgIC5zZXR1cCgoY2x1c3RlcikgLT4geworICAgICAgICAgICAgLy9jcmVhdGUgdGFibGUKKyAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKCJDUkVBVEUgVEFCTEUgIiArIEtFWVNQQUNFICsgIi50YiAoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGsgdGV4dCBQUklNQVJZIEtFWSwiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjMSB0ZXh0LCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImMyIGludCwiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjMyBpbnQpIik7CisgICAgICAgICAgICAvLyBkaXNhYmxlIGF1dG8gY29tcGFjdGlvbgorICAgICAgICAgICAgY2x1c3Rlci5zdHJlYW0oKS5mb3JFYWNoKG5vZGUgLT4gbm9kZS5ub2RldG9vbCgiZGlzYWJsZWF1dG9jb21wYWN0aW9uIikpOworICAgICAgICAgICAgLy8gZ2VuZXJhdGUgc3N0YWJsZXMKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpICE9IDEwOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2x1c3Rlci5jb29yZGluYXRvcigxKS5leGVjdXRlKCJJTlNFUlQgSU5UTyAiICsgS0VZU1BBQ0UgKyAiLnRiIChwaywgYzEsIGMyLCBjMykgVkFMVUVTICgncGsiICsgaSArICInLCAnYzEiICsgaSArICInLCAiICsgaSArICcsJyArIGkgKyAnKScsIENvbnNpc3RlbmN5TGV2ZWwuQUxMKTsKKyAgICAgICAgICAgICAgICBjbHVzdGVyLnN0cmVhbSgpLmZvckVhY2gobm9kZSAtPiBub2RlLmZsdXNoKEtFWVNQQUNFKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmb3JjZSBjb21wYWN0CisgICAgICAgICAgICBjbHVzdGVyLnN0cmVhbSgpLmZvckVhY2gobm9kZSAtPiBub2RlLmZvcmNlQ29tcGFjdChLRVlTUEFDRSwgInRiIikpOworICAgICAgICB9KS5ydW5BZnRlckNsdXN0ZXJVcGdyYWRlKChjbHVzdGVyKSAtPiB7CisgICAgICAgICAgICAvLyBkaXNhYmxlIGF1dG8gY29tcGFjdGlvbiBhdCBzdGFydCB1cAorICAgICAgICAgICAgY2x1c3Rlci5zdHJlYW0oKS5mb3JFYWNoKG5vZGUgLT4gbm9kZS5ub2RldG9vbCgiZGlzYWJsZWF1dG9jb21wYWN0aW9uIikpOworICAgICAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2xIaXN0b3J5ID0gaW52b2tlTm9kZXRvb2xKdm1EdGVzdChjbHVzdGVyLmdldCgxKSwgImNvbXBhY3Rpb25oaXN0b3J5Iik7CisgICAgICAgICAgICB0b29sSGlzdG9yeS5hc3NlcnRPbkNsZWFuRXhpdCgpOworICAgICAgICAgICAgLy8gdXBncmFkZWQgc3lzdGVtLmNvbXBhY3Rpb25faGlzdG9yeSBkYXRhIHZlcmlmeQorICAgICAgICAgICAgYXNzZXJ0Q29tcGFjdGlvbkhpc3RvcnlPdXRQdXQodG9vbEhpc3RvcnksIEtFWVNQQUNFLCAidGIiLCBJbW11dGFibGVNYXAub2YoKSk7CisKKyAgICAgICAgICAgIC8vIGZvcmNlIGNvbXBhY3QKKyAgICAgICAgICAgIGNsdXN0ZXIuc3RyZWFtKCkuZm9yRWFjaChub2RlIC0+IG5vZGUubm9kZXRvb2woImNvbXBhY3QiKSk7CisgICAgICAgICAgICB0b29sSGlzdG9yeSA9IGludm9rZU5vZGV0b29sSnZtRHRlc3QoY2x1c3Rlci5nZXQoMSksICJjb21wYWN0aW9uaGlzdG9yeSIpOworICAgICAgICAgICAgdG9vbEhpc3RvcnkuYXNzZXJ0T25DbGVhbkV4aXQoKTsKKyAgICAgICAgICAgIGFzc2VydENvbXBhY3Rpb25IaXN0b3J5T3V0UHV0KHRvb2xIaXN0b3J5LCBLRVlTUEFDRSwgInRiIiwgSW1tdXRhYmxlTWFwLm9mKENPTVBBQ1RJT05fVFlQRV9QUk9QRVJUWSwgT3BlcmF0aW9uVHlwZS5NQUpPUl9DT01QQUNUSU9OLnR5cGUpKTsKKyAgICAgICAgfSkKKyAgICAgICAgLnJ1bigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Ecm9wQ29tcGFjdFN0b3JhZ2VOdWxsQ2x1c3RlcmluZ1ZhbHVlc1Rlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Ecm9wQ29tcGFjdFN0b3JhZ2VOdWxsQ2x1c3RlcmluZ1ZhbHVlc1Rlc3QuamF2YQppbmRleCAxNjU3NzY1Li4yZTU1NzhkIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvRHJvcENvbXBhY3RTdG9yYWdlTnVsbENsdXN0ZXJpbmdWYWx1ZXNUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0Ryb3BDb21wYWN0U3RvcmFnZU51bGxDbHVzdGVyaW5nVmFsdWVzVGVzdC5qYXZhCkBAIC0zMyw3ICszMyw3IEBACiAgICAgcHVibGljIHZvaWQgdGVzdE51bGxDbHVzdGVyaW5nVmFsdWVzKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKICAgICAgICAgbmV3IFRlc3RDYXNlKCkubm9kZXMoMSkKLSAgICAgICAgICAgICAgICAgICAgICAudXBncmFkZXNGcm9tKHYzMCkKKyAgICAgICAgICAgICAgICAgICAgICAudXBncmFkZXNUb0N1cnJlbnRGcm9tKHYzMCkKICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjb25maWcgLT4gY29uZmlnLndpdGgoR09TU0lQLCBORVRXT1JLLCBOQVRJVkVfUFJPVE9DT0wpLnNldCgiZW5hYmxlX2Ryb3BfY29tcGFjdF9zdG9yYWdlIiwgdHJ1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgLnNldHVwKGNsdXN0ZXIgLT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3JlYXRlID0gIkNSRUFURSBUQUJMRSAlcy4lcyhrIGludCwgYzEgaW50LCBjMiBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAoaywgYzEsIGMyKSkgIiArCmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvRHJvcENvbXBhY3RTdG9yYWdlVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0Ryb3BDb21wYWN0U3RvcmFnZVRlc3QuamF2YQppbmRleCBjNjQ1MDg1Li45ODQ2MjY0IDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvRHJvcENvbXBhY3RTdG9yYWdlVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Ecm9wQ29tcGFjdFN0b3JhZ2VUZXN0LmphdmEKQEAgLTM1LDcgKzM1LDcgQEAKICAgICAgICAgbmV3IFRlc3RDYXNlKCkKICAgICAgICAgLm5vZGVzKDIpCiAgICAgICAgIC5ub2Rlc1RvVXBncmFkZSgxLCAyKQotICAgICAgICAudXBncmFkZXNGcm9tKHYzMCkKKyAgICAgICAgLnVwZ3JhZGVzVG9DdXJyZW50RnJvbSh2MzApCiAgICAgICAgIC53aXRoQ29uZmlnKGNvbmZpZyAtPiBjb25maWcud2l0aChHT1NTSVAsIE5FVFdPUkspLnNldCgiZW5hYmxlX2Ryb3BfY29tcGFjdF9zdG9yYWdlIiwgdHJ1ZSkpCiAgICAgICAgIC5zZXR1cCgoY2x1c3RlcikgLT4gewogICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoIkNSRUFURSBUQUJMRSAiICsgS0VZU1BBQ0UgKyAiLnRibCAocGsgaW50LCBjayBpbnQsIFBSSU1BUlkgS0VZIChwaywgY2spKSBXSVRIIENPTVBBQ1QgU1RPUkFHRSIpOwpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0dyb3VwQnlUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvR3JvdXBCeVRlc3QuamF2YQppbmRleCBiMDliODgyLi5iMjk3MWNkIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvR3JvdXBCeVRlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvR3JvdXBCeVRlc3QuamF2YQpAQCAtMzUsNyArMzUsNyBAQAogICAgICAgICAvLyBDQVNTQU5EUkEtMTY1ODI6IGdyb3VwLWJ5IGFjcm9zcyBtaXhlZCB2ZXJzaW9uIGNsdXN0ZXIgd291bGQgZmFpbCB3aXRoIEFycmF5SW5kZXhPdXRPZkJvdW5kRXhjZXB0aW9uCiAgICAgICAgIG5ldyBVcGdyYWRlVGVzdEJhc2UuVGVzdENhc2UoKQogICAgICAgICAubm9kZXMoMikKLSAgICAgICAgLnVwZ3JhZGVzRnJvbSh2M1gpCisgICAgICAgIC51cGdyYWRlc1RvQ3VycmVudEZyb20odjNYKQogICAgICAgICAubm9kZXNUb1VwZ3JhZGUoMSkKICAgICAgICAgLndpdGhDb25maWcoY29uZmlnIC0+IGNvbmZpZy53aXRoKEdPU1NJUCwgTkVUV09SSykpCiAgICAgICAgIC5zZXR1cChjbHVzdGVyIC0+IHsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVBdmFpbGFiaWxpdHlUZXN0QmFzZS5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZUF2YWlsYWJpbGl0eVRlc3RCYXNlLmphdmEKaW5kZXggNGU1MGViMS4uMWNhMjNhZSAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZUF2YWlsYWJpbGl0eVRlc3RCYXNlLmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZUF2YWlsYWJpbGl0eVRlc3RCYXNlLmphdmEKQEAgLTc0LDYgKzc0LDE0IEBACiAgICAgICAgIHRlc3RBdmFpbGFiaWxpdHkodHJ1ZSwgaW5pdGlhbCwgd3JpdGVDb25zaXN0ZW5jeUxldmVsLCByZWFkQ29uc2lzdGVuY3lMZXZlbCk7CiAgICAgfQogCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHRlc3RBdmFpbGFiaWxpdHkoU2VtdmVyIGluaXRpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3lMZXZlbCB3cml0ZUNvbnNpc3RlbmN5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3lMZXZlbCByZWFkQ29uc2lzdGVuY3lMZXZlbCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgdGVzdEF2YWlsYWJpbGl0eSh0cnVlLCBpbml0aWFsLCB3cml0ZUNvbnNpc3RlbmN5TGV2ZWwsIHJlYWRDb25zaXN0ZW5jeUxldmVsKTsKKyAgICAgICAgdGVzdEF2YWlsYWJpbGl0eShmYWxzZSwgaW5pdGlhbCwgd3JpdGVDb25zaXN0ZW5jeUxldmVsLCByZWFkQ29uc2lzdGVuY3lMZXZlbCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0QXZhaWxhYmlsaXR5KGJvb2xlYW4gdXBncmFkZWRDb29yZGluYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtdmVyIGluaXRpYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpc3RlbmN5TGV2ZWwgd3JpdGVDb25zaXN0ZW5jeUxldmVsLApAQCAtODIsNyArOTAsNyBAQAogICAgICAgICBuZXcgVGVzdENhc2UoKQogICAgICAgICAubm9kZXMoTlVNX05PREVTKQogICAgICAgICAubm9kZXNUb1VwZ3JhZGUodXBncmFkZWRDb29yZGluYXRvciA/IDEgOiAyKQotICAgICAgICAudXBncmFkZXMoaW5pdGlhbCwgVXBncmFkZVRlc3RCYXNlLkNVUlJFTlQpCisgICAgICAgIC51cGdyYWRlc1RvQ3VycmVudEZyb20oaW5pdGlhbCkKICAgICAgICAgLndpdGhDb25maWcoY29uZmlnIC0+IGNvbmZpZy5zZXQoInJlYWRfcmVxdWVzdF90aW1lb3V0X2luX21zIiwgU0VDT05EUy50b01pbGxpcyg1KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoIndyaXRlX3JlcXVlc3RfdGltZW91dF9pbl9tcyIsIFNFQ09ORFMudG9NaWxsaXMoNSkpKQogICAgICAgICAvLyB1c2UgcmV0cnkgb2YgMTBtcyBzbyB0aGF0IGVhY2ggY2hlY2sgaXMgY29uc2lzdGVudApAQCAtOTMsNiArMTAxLDcgQEAKICAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnQgKGsgdXVpZCwgYyBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAoaywgYykpIFdJVEggc3BlY3VsYXRpdmVfcmV0cnkgPSAnMTBtcyciKSk7CiAgICAgICAgICAgICBjbHVzdGVyLnNldFVuY2F1Z2h0RXhjZXB0aW9uc0ZpbHRlcih0aHJvd2FibGUgLT4gdGhyb3dhYmxlIGluc3RhbmNlb2YgUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24pOwogICAgICAgICB9KQorICAgICAgICAucnVuQmVmb3JlQ2x1c3RlclVwZ3JhZGUoY2x1c3RlciAtPiBjbHVzdGVyLmZpbHRlcnMoKS5yZXNldCgpKQogICAgICAgICAucnVuQWZ0ZXJOb2RlVXBncmFkZSgoY2x1c3RlciwgbikgLT4gewogCiAgICAgICAgICAgICBJQ29vcmRpbmF0b3IgY29vcmRpbmF0b3IgPSBjbHVzdGVyLmNvb3JkaW5hdG9yKENPT1JESU5BVE9SKTsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVBdmFpbGFiaWxpdHlWM1hPbmVBbGxUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvTWl4ZWRNb2RlQXZhaWxhYmlsaXR5VjNYT25lQWxsVGVzdC5qYXZhCmluZGV4IDhlYTk0ZWEuLjU5NTU0ZDEgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVBdmFpbGFiaWxpdHlWM1hPbmVBbGxUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZUF2YWlsYWJpbGl0eVYzWE9uZUFsbFRlc3QuamF2YQpAQCAtMjUsNyArMjUsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgTWl4ZWRNb2RlQXZhaWxhYmlsaXR5VjNYT25lQWxsVGVzdCBleHRlbmRzIE1peGVkTW9kZUF2YWlsYWJpbGl0eVRlc3RCYXNlCiB7Ci0gICAgcHVibGljIE1peGVkTW9kZUF2YWlsYWJpbGl0eVYzWE9uZUFsbFRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgcHVibGljIE1peGVkTW9kZUF2YWlsYWJpbGl0eVYzWE9uZUFsbFRlc3QoKQogICAgIHsKICAgICAgICAgc3VwZXIodjNYLCBDb25zaXN0ZW5jeUxldmVsLk9ORSwgQ29uc2lzdGVuY3lMZXZlbC5BTEwpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVDb25zaXN0ZW5jeVRlc3RCYXNlLmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvTWl4ZWRNb2RlQ29uc2lzdGVuY3lUZXN0QmFzZS5qYXZhCmluZGV4IGY5OGZjOGEuLjUxOTYyNWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVDb25zaXN0ZW5jeVRlc3RCYXNlLmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZUNvbnNpc3RlbmN5VGVzdEJhc2UuamF2YQpAQCAtNDIsMTEgKzQyLDYgQEAKIHsKICAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgdGVzdENvbnNpc3RlbmN5KFNlbXZlciBpbml0aWFsKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewotICAgICAgICB0ZXN0Q29uc2lzdGVuY3koaW5pdGlhbCwgVXBncmFkZVRlc3RCYXNlLkNVUlJFTlQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCB0ZXN0Q29uc2lzdGVuY3koU2VtdmVyIGluaXRpYWwsIFNlbXZlciB1cGdyYWRlKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewogICAgICAgICBMaXN0PFRlc3Rlcj4gdGVzdGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICB0ZXN0ZXJzLmFkZEFsbChUZXN0ZXIuY3JlYXRlKDEsIEFMTCkpOwogICAgICAgICB0ZXN0ZXJzLmFkZEFsbChUZXN0ZXIuY3JlYXRlKDIsIEFMTCwgUVVPUlVNKSk7CkBAIC01NSw3ICs1MCw3IEBACiAgICAgICAgIG5ldyBUZXN0Q2FzZSgpCiAgICAgICAgIC5ub2RlcygzKQogICAgICAgICAubm9kZXNUb1VwZ3JhZGUoMSkKLSAgICAgICAgLnVwZ3JhZGVzKGluaXRpYWwsIHVwZ3JhZGUpCisgICAgICAgIC51cGdyYWRlc1RvQ3VycmVudEZyb20oaW5pdGlhbCkKICAgICAgICAgLndpdGhDb25maWcoY29uZmlnIC0+IGNvbmZpZy5zZXQoInJlYWRfcmVxdWVzdF90aW1lb3V0X2luX21zIiwgU0VDT05EUy50b01pbGxpcygzMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJ3cml0ZV9yZXF1ZXN0X3RpbWVvdXRfaW5fbXMiLCBTRUNPTkRTLnRvTWlsbGlzKDMwKSkpCiAgICAgICAgIC5zZXR1cChjbHVzdGVyIC0+IHsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVGcm9tM1JlcGxpY2F0aW9uVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZUZyb20zUmVwbGljYXRpb25UZXN0LmphdmEKaW5kZXggNDkwMjM4NS4uNjlkM2RiZSAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZUZyb20zUmVwbGljYXRpb25UZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZUZyb20zUmVwbGljYXRpb25UZXN0LmphdmEKQEAgLTE4LDE5ICsxOCw2NSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnVwZ3JhZGU7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLXB1YmxpYyBjbGFzcyBNaXhlZE1vZGVGcm9tM1JlcGxpY2F0aW9uVGVzdCBleHRlbmRzIE1peGVkTW9kZVJlcGxpY2F0aW9uVGVzdEJhc2UKLXsKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVTdHJhdGVneTMwdG8zWCgpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIHRlc3RTaW1wbGVTdHJhdGVneSh2MzAsIHYzWCk7Ci0gICAgfQoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Db25zaXN0ZW5jeUxldmVsOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5Bc3NlcnRVdGlscy5hc3NlcnRSb3dzOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuQXNzZXJ0VXRpbHMucm93OworCitwdWJsaWMgY2xhc3MgTWl4ZWRNb2RlRnJvbTNSZXBsaWNhdGlvblRlc3QgZXh0ZW5kcyBVcGdyYWRlVGVzdEJhc2UKK3sKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVTdHJhdGVneSgpIHRocm93cyBUaHJvd2FibGUKICAgICB7Ci0gICAgICAgIHRlc3RTaW1wbGVTdHJhdGVneSh2MzApOworICAgICAgICBTdHJpbmcgaW5zZXJ0ID0gIklOU0VSVCBJTlRPIHRlc3Rfc2ltcGxlLm5hbWVzIChrZXksIG5hbWUpIFZBTFVFUyAoPywgPykiOworICAgICAgICBTdHJpbmcgc2VsZWN0ID0gIlNFTEVDVCAqIEZST00gdGVzdF9zaW1wbGUubmFtZXMgV0hFUkUga2V5ID0gPyI7CisKKyAgICAgICAgbmV3IFRlc3RDYXNlKCkKKyAgICAgICAgLm5vZGVzKDMpCisgICAgICAgIC5ub2Rlc1RvVXBncmFkZSgxLCAyKQorICAgICAgICAudXBncmFkZXNUb0N1cnJlbnRGcm9tKHYzMCkKKyAgICAgICAgLnNldHVwKGNsdXN0ZXIgLT4geworICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoIkNSRUFURSBLRVlTUEFDRSB0ZXN0X3NpbXBsZSBXSVRIIHJlcGxpY2F0aW9uID0geydjbGFzcyc6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InOiAyfTsiKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKCJDUkVBVEUgVEFCTEUgdGVzdF9zaW1wbGUubmFtZXMgKGtleSBpbnQgUFJJTUFSWSBLRVksIG5hbWUgdGV4dCkiKTsKKyAgICAgICAgfSkKKyAgICAgICAgLnJ1bkFmdGVyTm9kZVVwZ3JhZGUoKGNsdXN0ZXIsIHVwZ3JhZGVkKSAtPiB7CisgICAgICAgICAgICBMaXN0PExvbmc+IGluaXRpYWxUb2tlbnMgPSBuZXcgQXJyYXlMaXN0PD4oY2x1c3Rlci5zaXplKCkgKyAxKTsKKyAgICAgICAgICAgIGluaXRpYWxUb2tlbnMuYWRkKG51bGwpOyAvLyBUaGUgZmlyc3QgdmFsaWQgdG9rZW4gaXMgYXQgMSB0byBhdm9pZCBvZmZzZXQgbWF0aCBiZWxvdy4KKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gY2x1c3Rlci5zaXplKCk7IGkrKykKKyAgICAgICAgICAgICAgICBpbml0aWFsVG9rZW5zLmFkZChMb25nLnZhbHVlT2YoY2x1c3Rlci5nZXQoaSkuY29uZmlnKCkuZ2V0KCJpbml0aWFsX3Rva2VuIikudG9TdHJpbmcoKSkpOworCisgICAgICAgICAgICBMaXN0PExvbmc+IHZhbGlkVG9rZW5zID0gaW5pdGlhbFRva2Vucy5zdWJMaXN0KDEsIGNsdXN0ZXIuc2l6ZSgpICsgMSk7CisKKyAgICAgICAgICAgIC8vIEV4ZXJjaXNlIGFsbCB0aGUgY29vcmRpbmF0b3JzLi4uCisgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBjbHVzdGVyLnNpemUoKTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIC4uLmFuZCBzYW1wbGUgZW5vdWdoIGtleXMgdGhhdCB3ZSBjb3ZlciB0aGUgcmluZy4KKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQga2V5ID0gaiArIChpICogMTApOworICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSByb3cgPSByb3coa2V5LCAiTmVybyIpOworICAgICAgICAgICAgICAgICAgICBMb25nIHRva2VuID0gdG9rZW5Gcm9tKGtleSk7CisKKyAgICAgICAgICAgICAgICAgICAgY2x1c3Rlci5jb29yZGluYXRvcihpKS5leGVjdXRlKGluc2VydCwgQ29uc2lzdGVuY3lMZXZlbC5BTEwsIHJvdyk7CisKKyAgICAgICAgICAgICAgICAgICAgaW50IG5vZGUgPSBwcmltYXJ5UmVwbGljYSh2YWxpZFRva2VucywgdG9rZW4pOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGNsdXN0ZXIuZ2V0KG5vZGUpLmV4ZWN1dGVJbnRlcm5hbChzZWxlY3QsIGtleSksIHJvdyk7CisKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5leHROb2RlKG5vZGUsIGNsdXN0ZXIuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhjbHVzdGVyLmdldChub2RlKS5leGVjdXRlSW50ZXJuYWwoc2VsZWN0LCBrZXkpLCByb3cpOworCisgICAgICAgICAgICAgICAgICAgIC8vIEF0IFJGPTIsIHRoaXMgbm9kZSBzaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQgdGhlIHdyaXRlLgorICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV4dE5vZGUobm9kZSwgY2x1c3Rlci5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGNsdXN0ZXIuZ2V0KG5vZGUpLmV4ZWN1dGVJbnRlcm5hbChzZWxlY3QsIGtleSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSkKKyAgICAgICAgLnJ1bigpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVHb3NzaXBUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvTWl4ZWRNb2RlR29zc2lwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGM5Njk1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVHb3NzaXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC51cGdyYWRlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpQ29uc3VtZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci1pbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlVuaW50ZXJydXB0aWJsZXM7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5VcGdyYWRlYWJsZUNsdXN0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklNZXNzYWdlRmlsdGVyczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuVmVyYjsKLWltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOwotCi1wdWJsaWMgY2xhc3MgTWl4ZWRNb2RlR29zc2lwVGVzdCBleHRlbmRzIFVwZ3JhZGVUZXN0QmFzZQotewotICAgIFBhdHRlcm4gZXhwZWN0ZWROb3JtYWxTdGF0dXMgPSBQYXR0ZXJuLmNvbXBpbGUoIlNUQVRVUzpcXGQrOk5PUk1BTCwtP1xcZCsiKTsKLSAgICBQYXR0ZXJuIGV4cGVjdGVkTm9ybWFsU3RhdHVzV2l0aFBvcnQgPSBQYXR0ZXJuLmNvbXBpbGUoIlNUQVRVU19XSVRIX1BPUlQ6XFxkKzpOT1JNQUwsLT9cXGQrIik7Ci0gICAgUGF0dGVybiBleHBlY3RlZE5vcm1hbFgzID0gUGF0dGVybi5jb21waWxlKCJYMzpcXGQrOk5PUk1BTCwtP1xcZCsiKTsKLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFN0YXR1c0ZpZWxkU2hvdWxkRXhpc3RJbk9sZFZlcnNpb25Ob2RlcygpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIG5ldyBUZXN0Q2FzZSgpCi0gICAgICAgIC53aXRoQ29uZmlnKGMgLT4gYy53aXRoKEZlYXR1cmUuR09TU0lQLCBGZWF0dXJlLk5FVFdPUkspKQotICAgICAgICAubm9kZXMoMykKLSAgICAgICAgLm5vZGVzVG9VcGdyYWRlT3JkZXJlZCgxLCAyLCAzKQotICAgICAgICAvLyBhbGwgdXBncmFkZXMgZnJvbSB2MzAgdXAsIGV4Y2x1ZGluZyB2MzAtPnYzWCBhbmQgZnJvbSB2NDAKLSAgICAgICAgLnNpbmdsZVVwZ3JhZGUodjMwKQotICAgICAgICAuc2luZ2xlVXBncmFkZSh2M1gpCi0gICAgICAgIC5zZXR1cChjIC0+IHt9KQotICAgICAgICAucnVuQWZ0ZXJOb2RlVXBncmFkZSgoY2x1c3Rlciwgbm9kZSkgLT4gewotICAgICAgICAgICAgaWYgKG5vZGUgPT0gMSkgewotICAgICAgICAgICAgICAgIGNoZWNrUGVlckdvc3NpcEluZm9TaG91bGRDb250YWluTm9ybWFsU3RhdHVzKGNsdXN0ZXIsIDIpOwotICAgICAgICAgICAgICAgIGNoZWNrUGVlckdvc3NpcEluZm9TaG91bGRDb250YWluTm9ybWFsU3RhdHVzKGNsdXN0ZXIsIDMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5vZGUgPT0gMikgewotICAgICAgICAgICAgICAgIGNoZWNrUGVlckdvc3NpcEluZm9TaG91bGRDb250YWluTm9ybWFsU3RhdHVzKGNsdXN0ZXIsIDMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KQotICAgICAgICAucnVuQWZ0ZXJDbHVzdGVyVXBncmFkZShjbHVzdGVyIC0+IHsKLSAgICAgICAgICAgIC8vIHdhaXQgMSBtaW51dGUgZm9yIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5nbXMuR29zc2lwZXIudXBncmFkZUZyb21WZXJzaW9uU3VwcGxpZXJgIHRvIHVwZGF0ZQotICAgICAgICAgICAgVW5pbnRlcnJ1cHRpYmxlcy5zbGVlcFVuaW50ZXJydXB0aWJseSgxLCBUaW1lVW5pdC5NSU5VVEVTKTsKLSAgICAgICAgICAgIGNoZWNrUGVlckdvc3NpcEluZm9PZkFsbE5vZGVzU2hvdWxkQ29udGFpbk5ld1N0YXR1c0FmdGVyVXBncmFkZShjbHVzdGVyKTsKLSAgICAgICAgfSkKLSAgICAgICAgLnJ1bigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbWlsYXIgdG8ge0BsaW5rICN0ZXN0U3RhdHVzRmllbGRTaG91bGRFeGlzdEluT2xkVmVyc2lvbk5vZGVzfSwgYnV0IGluIGFuIGVkZ2UgY2FzZSB0aGF0Ci0gICAgICogMSkgbm9kZTIgYW5kIG5vZGUzIGNhbm5vdCBnb3NzaXAgd2l0aCBlYWNoIG90aGVyLgotICAgICAqIDIpIG5vZGUyIHNlbmRzIFNZTiB0byBub2RlMSBmaXJzdCB3aGVuIHVwZ3JhZGluZy4KLSAgICAgKiAzKSBub2RlMyBpcyBhdCB0aGUgbG93ZXIgdmVyc2lvbiBkdXJpbmcgdGhlIGNsdXN0ZXIgdXBncmFkZQotICAgICAqIEluIHRoaXMgY2FzZSwgbm9kZTMgZ29zc2lwIGluZm8gZG9lcyBub3QgY29udGFpbiBTVEFUVVMgZmllbGQgZm9yIG5vZGUyCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdHVzRmllbGRTaG91bGRFeGlzdEluT2xkVmVyc2lvbk5vZGVzRWRnZUNhc2UoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBBdG9taWNSZWZlcmVuY2U8SU1lc3NhZ2VGaWx0ZXJzLkZpbHRlcj4gbjFHb3NzaXBTeW5CbG9ja2VyID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7Ci0gICAgICAgIG5ldyBUZXN0Q2FzZSgpCi0gICAgICAgIC53aXRoQ29uZmlnKGMgLT4gYy53aXRoKEZlYXR1cmUuR09TU0lQLCBGZWF0dXJlLk5FVFdPUkspKQotICAgICAgICAubm9kZXMoMykKLSAgICAgICAgLm5vZGVzVG9VcGdyYWRlT3JkZXJlZCgxLCAyLCAzKQotICAgICAgICAvLyBhbGwgdXBncmFkZXMgZnJvbSB2MzAgdXAsIGV4Y2x1ZGluZyB2MzAtPnYzWCBhbmQgZnJvbSB2NDAKLSAgICAgICAgLnNpbmdsZVVwZ3JhZGUodjMwKQotICAgICAgICAuc2luZ2xlVXBncmFkZSh2M1gpCi0gICAgICAgIC5zZXR1cChjbHVzdGVyIC0+IHsKLSAgICAgICAgICAgIC8vIG5vZGUyIGFuZCBub2RlMyBnb3NzaXBlciBjYW5ub3QgdGFsayB3aXRoIGVhY2ggb3RoZXIKLSAgICAgICAgICAgIGNsdXN0ZXIuZmlsdGVycygpLnZlcmJzKFZlcmIuR09TU0lQX0RJR0VTVF9TWU4uaWQpLmZyb20oMikudG8oMykuZHJvcCgpOwotICAgICAgICAgICAgY2x1c3Rlci5maWx0ZXJzKCkudmVyYnMoVmVyYi5HT1NTSVBfRElHRVNUX1NZTi5pZCkuZnJvbSgzKS50bygyKS5kcm9wKCk7Ci0gICAgICAgIH0pCi0gICAgICAgIC5ydW5BZnRlck5vZGVVcGdyYWRlKChjbHVzdGVyLCBub2RlKSAtPiB7Ci0gICAgICAgICAgICAvLyBsZXQgbm9kZTIgc2VuZHMgdGhlIFNZTiB0byBub2RlMSBmaXJzdAotICAgICAgICAgICAgaWYgKG5vZGUgPT0gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJTWVzc2FnZUZpbHRlcnMuRmlsdGVyIGZpbHRlciA9IGNsdXN0ZXIuZmlsdGVycygpLnZlcmJzKFZlcmIuR09TU0lQX0RJR0VTVF9TWU4uaWQpLmZyb20oMSkudG8oMikuZHJvcCgpOwotICAgICAgICAgICAgICAgIG4xR29zc2lwU3luQmxvY2tlci5zZXQoZmlsdGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUgPT0gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuMUdvc3NpcFN5bkJsb2NrZXIuZ2V0KCkub2ZmKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5vZGUzR29zc2lwVmlldyA9IGNsdXN0ZXIuZ2V0KDMpLm5vZGV0b29sUmVzdWx0KCJnb3NzaXBpbmZvIikuZ2V0U3Rkb3V0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5vZGUyR29zc2lwU3RhdGUgPSBnZXRHb3NzaXBTdGF0ZU9mTm9kZShub2RlM0dvc3NpcFZpZXcsICIvMTI3LjAuMC4yIik7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KG5vZGUyR29zc2lwU3RhdGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5hcygiVGhlIG5vZGUyJ3MgZ29zc2lwIHN0YXRlIGZyb20gbm9kZTMncyBwZXJzcGVjdGl2ZSBzaG91bGQgY29udGFpbiBzdGF0dXMuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFuZCBpdCBzaG91bGQgY2FycnkgYW4gdW5yZWNvZ25pemVkIGZpZWxkIFgzIHdpdGggTk9STUFMLiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWluc1BhdHRlcm4oZXhwZWN0ZWROb3JtYWxTdGF0dXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWluc1BhdHRlcm4oZXhwZWN0ZWROb3JtYWxYMyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pCi0gICAgICAgIC5ydW5BZnRlckNsdXN0ZXJVcGdyYWRlKGNsdXN0ZXIgLT4gewotICAgICAgICAgICAgLy8gd2FpdCAxIG1pbnV0ZSBmb3IgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtcy5Hb3NzaXBlci51cGdyYWRlRnJvbVZlcnNpb25TdXBwbGllcmAgdG8gdXBkYXRlCi0gICAgICAgICAgICBVbmludGVycnVwdGlibGVzLnNsZWVwVW5pbnRlcnJ1cHRpYmx5KDEsIFRpbWVVbml0Lk1JTlVURVMpOwotICAgICAgICAgICAgY2hlY2tQZWVyR29zc2lwSW5mb09mQWxsTm9kZXNTaG91bGRDb250YWluTmV3U3RhdHVzQWZ0ZXJVcGdyYWRlKGNsdXN0ZXIpOwotICAgICAgICB9KQotICAgICAgICAucnVuKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrUGVlckdvc3NpcEluZm9PZkFsbE5vZGVzU2hvdWxkQ29udGFpbk5ld1N0YXR1c0FmdGVyVXBncmFkZShVcGdyYWRlYWJsZUNsdXN0ZXIgY2x1c3RlcikKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IDM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG4gPSBpOwotICAgICAgICAgICAgY2hlY2tQZWVyR29zc2lwSW5mbyhjbHVzdGVyLCBpLCAoZ29zc2lwSW5mbywgcGVlcnMpIC0+IHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBwIDogcGVlcnMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoZ2V0R29zc2lwU3RhdGVPZk5vZGUoZ29zc2lwSW5mbywgcCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXMoU3RyaW5nLmZvcm1hdCgiJXMgZ29zc2lwIHN0YXRlIGluIG5vZGUlcyBzaG91bGQgbm90IGNvbnRhaW4gU1RBVFVTICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCBzaG91bGQgY29udGFpbiBTVEFUVVNfV0lUSF9QT1JULiIsIHAsIG4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRvZXNOb3RDb250YWluKCJTVEFUVVM6IikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWluc1BhdHRlcm4oZXhwZWN0ZWROb3JtYWxTdGF0dXNXaXRoUG9ydCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tQZWVyR29zc2lwSW5mb1Nob3VsZENvbnRhaW5Ob3JtYWxTdGF0dXMoVXBncmFkZWFibGVDbHVzdGVyIGNsdXN0ZXIsIGludCBub2RlKQotICAgIHsKLSAgICAgICAgY2hlY2tQZWVyR29zc2lwSW5mbyhjbHVzdGVyLCBub2RlLCAoZ29zc2lwSW5mbywgcGVlcnMpIC0+IHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIG4gOiBwZWVycykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoZ2V0R29zc2lwU3RhdGVPZk5vZGUoZ29zc2lwSW5mbywgbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWluc1BhdHRlcm4oZXhwZWN0ZWROb3JtYWxTdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tQZWVyR29zc2lwSW5mbyhVcGdyYWRlYWJsZUNsdXN0ZXIgY2x1c3RlciwgaW50IG5vZGUsIEJpQ29uc3VtZXI8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gdmVyaWZpZXIpCi0gICAgewotICAgICAgICBTZXQ8SW50ZWdlcj4gcGVlcnMgPSBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoMSwgMiwgMykpOwotICAgICAgICBwZWVycy5yZW1vdmUobm9kZSk7Ci0gICAgICAgIFN0cmluZyBnb3NzaXBJbmZvID0gY2x1c3Rlci5nZXQobm9kZSkubm9kZXRvb2xSZXN1bHQoImdvc3NpcGluZm8iKS5nZXRTdGRvdXQoKTsKLSAgICAgICAgdmVyaWZpZXIuYWNjZXB0KGdvc3NpcEluZm8sIHBlZXJzLnN0cmVhbSgpLm1hcChpIC0+ICIxMjcuMC4wLiIgKyBpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEdvc3NpcFN0YXRlT2ZOb2RlKFN0cmluZyByYXdPdXRwdXQsIFN0cmluZyBub2RlSW50ZXJlc3RlZCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyB0ZW1wID0gcmF3T3V0cHV0LnN1YnN0cmluZyhyYXdPdXRwdXQuaW5kZXhPZihub2RlSW50ZXJlc3RlZCkpOwotICAgICAgICBpbnQgbmV4dFNsYXNoSW5kZXggPSB0ZW1wLmluZGV4T2YoJy8nLCAxKTsKLSAgICAgICAgaWYgKG5leHRTbGFzaEluZGV4ICE9IC0xKQotICAgICAgICAgICAgcmV0dXJuIHRlbXAuc3Vic3RyaW5nKDAsIG5leHRTbGFzaEluZGV4KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIHRlbXA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZU1lc3NhZ2VGb3J3YXJkVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZU1lc3NhZ2VGb3J3YXJkVGVzdC5qYXZhCmluZGV4IGQxNTUxZmIuLjU1MDkyYWIgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVNZXNzYWdlRm9yd2FyZFRlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvTWl4ZWRNb2RlTWVzc2FnZUZvcndhcmRUZXN0LmphdmEKQEAgLTEwMyw3ICsxMDMsNyBAQAogICAgICAgICAud2l0aENvbmZpZyhjIC0+IGMud2l0aChGZWF0dXJlLkdPU1NJUCwgRmVhdHVyZS5ORVRXT1JLKSkKICAgICAgICAgLndpdGhCdWlsZGVyKGIgLT4gYi53aXRoUmFja3MobnVtRENzLCAxLCBub2Rlc1BlckRjKSkKICAgICAgICAgLm5vZGVzKG51bURDcyAqIG5vZGVzUGVyRGMpCi0gICAgICAgIC5zaW5nbGVVcGdyYWRlKHYzMCkKKyAgICAgICAgLnVwZ3JhZGVzVG9DdXJyZW50RnJvbSh2NDApCiAgICAgICAgIC5zZXR1cChjbHVzdGVyIC0+IHsKICAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKCJBTFRFUiBLRVlTUEFDRSAiICsgS0VZU1BBQ0UgKwogICAgICAgICAgICAgICAgICIgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAiICsgbnRzQXJncyArICIgfTsiKTsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVSZWFkUmVwYWlyRGVsZXRlVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZVJlYWRSZXBhaXJEZWxldGVUZXN0LmphdmEKaW5kZXggMDE5NTVjNS4uZTYwMzc3OCAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZVJlYWRSZXBhaXJEZWxldGVUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZVJlYWRSZXBhaXJEZWxldGVUZXN0LmphdmEKQEAgLTQ2LDcgKzQ2LDggQEAKICAgICAgICAgYWxsVXBncmFkZXMoMiwgMSkKICAgICAgICAgLnNldHVwKGNsdXN0ZXIgLT4gewogICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgJXMudCAoayBpbnQsIGMgaW50LCB2IGludCwgcyBpbnQgc3RhdGljLCBQUklNQVJZIEtFWSAoaywgYykpIikpOwotCisgICAgICAgIH0pCisgICAgICAgIC5ydW5CZWZvcmVDbHVzdGVyVXBncmFkZShjbHVzdGVyIC0+IHsKICAgICAgICAgICAgIC8vIGluc2VydCB0aGUgcm93cyBpbiBhbGwgdGhlIG5vZGVzCiAgICAgICAgICAgICBTdHJpbmcgaW5zZXJ0ID0gd2l0aEtleXNwYWNlKCJJTlNFUlQgSU5UTyAlcy50IChrLCBjLCB2LCBzKSBWQUxVRVMgKD8sID8sID8sID8pIik7CiAgICAgICAgICAgICBjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUoaW5zZXJ0LCBDb25zaXN0ZW5jeUxldmVsLkFMTCwgcm93MSk7CkBAIC04NSw3ICs4Niw4IEBACiAgICAgICAgIGFsbFVwZ3JhZGVzKDIsIDEpCiAgICAgICAgIC5zZXR1cChjbHVzdGVyIC0+IHsKICAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnQgKGsgaW50LCBjIGludCwgdiBpbnQsIHMgaW50IHN0YXRpYywgUFJJTUFSWSBLRVkgKGssIGMpKSIpKTsKLQorICAgICAgICB9KQorICAgICAgICAucnVuQmVmb3JlQ2x1c3RlclVwZ3JhZGUoY2x1c3RlciAtPiB7CiAgICAgICAgICAgICAvLyBpbnNlcnQgaGFsZiBwYXJ0aXRpb24gaW4gZWFjaCBub2RlCiAgICAgICAgICAgICBTdHJpbmcgaW5zZXJ0ID0gd2l0aEtleXNwYWNlKCJJTlNFUlQgSU5UTyAlcy50IChrLCBjLCB2LCBzKSBWQUxVRVMgKD8sID8sID8sID8pIik7CiAgICAgICAgICAgICBjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUoaW5zZXJ0LCBDb25zaXN0ZW5jeUxldmVsLkFMTCwgcGFydGl0aW9uMVswXSk7CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvTWl4ZWRNb2RlUmVhZFJlcGFpcldyaXRlVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZVJlYWRSZXBhaXJXcml0ZVRlc3QuamF2YQppbmRleCBmY2IwNDgyLi40OTY2ZTVjIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvTWl4ZWRNb2RlUmVhZFJlcGFpcldyaXRlVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVSZWFkUmVwYWlyV3JpdGVUZXN0LmphdmEKQEAgLTQ1LDYgKzQ1LDcgQEAKIAogICAgICAgICBhbGxVcGdyYWRlcygyLCAxKQogICAgICAgICAuc2V0dXAoYyAtPiBjLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkNSRUFURSBUQUJMRSAlcy50IChrIGludCwgYyBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAoaywgYykpIikpKQorICAgICAgICAucnVuQmVmb3JlQ2x1c3RlclVwZ3JhZGUoY2x1c3RlciAtPiBjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJUUlVOQ0FURSAlcy50IiksIENvbnNpc3RlbmN5TGV2ZWwuQUxMKSkKICAgICAgICAgLnJ1bkFmdGVyQ2x1c3RlclVwZ3JhZGUoY2x1c3RlciAtPiB7CiAKICAgICAgICAgICAgIC8vIGluc2VydCByb3dzIGludGVybmFsbHkgaW4gZWFjaCBub2RlCkBAIC03Nyw3ICs3OCw4IEBACiAgICAgICAgIGFsbFVwZ3JhZGVzKDIsIDEpCiAgICAgICAgIC5zZXR1cChjbHVzdGVyIC0+IHsKICAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnQgKGsgaW50LCBjIGludCwgdiBpbnQsIFBSSU1BUlkgS0VZIChrLCBjKSkiKSk7Ci0KKyAgICAgICAgfSkKKyAgICAgICAgLnJ1bkJlZm9yZUNsdXN0ZXJVcGdyYWRlKGNsdXN0ZXIgLT4gewogICAgICAgICAgICAgLy8gaW5zZXJ0IHRoZSBpbml0aWFsIHZlcnNpb24gb2YgdGhlIHJvd3MgaW4gYWxsIHRoZSBub2RlcwogICAgICAgICAgICAgU3RyaW5nIGluc2VydCA9IHdpdGhLZXlzcGFjZSgiSU5TRVJUIElOVE8gJXMudCAoaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSIpOwogICAgICAgICAgICAgY2x1c3Rlci5jb29yZGluYXRvcigxKS5leGVjdXRlKGluc2VydCwgQ29uc2lzdGVuY3lMZXZlbC5BTEwsIHJvdzEpOwpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZVJlYWRUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvTWl4ZWRNb2RlUmVhZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JiY2ZmMC4uMDAwMDAwMAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvTWl4ZWRNb2RlUmVhZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudXBncmFkZTsKLQotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklJbnZva2FibGVJbnN0YW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5nbXMuR29zc2lwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2Fzc2FuZHJhVmVyc2lvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LlJlYWREaWdlc3RDb25zaXN0ZW5jeVRlc3QuQ1JFQVRFX1RBQkxFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LlJlYWREaWdlc3RDb25zaXN0ZW5jeVRlc3QuaW5zZXJ0RGF0YTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5SZWFkRGlnZXN0Q29uc2lzdGVuY3lUZXN0LnRlc3REaWdlc3RDb25zaXN0ZW5jeTsKLQotcHVibGljIGNsYXNzIE1peGVkTW9kZVJlYWRUZXN0IGV4dGVuZHMgVXBncmFkZVRlc3RCYXNlCi17Ci0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBtaXhlZE1vZGVSZWFkQ29sdW1uU3Vic2V0RGlnZXN0Q2hlY2soKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBuZXcgVGVzdENhc2UoKQotICAgICAgICAud2l0aENvbmZpZyhjIC0+IGMud2l0aChGZWF0dXJlLkdPU1NJUCwgRmVhdHVyZS5ORVRXT1JLKSkKLSAgICAgICAgLm5vZGVzKDIpCi0gICAgICAgIC5ub2Rlc1RvVXBncmFkZSgxKQotICAgICAgICAvLyBhbGwgdXBncmFkZXMgZnJvbSB2MzAgdXAsIGV4Y2x1ZGluZyB2MzAtPnYzWCBhbmQgZnJvbSB2NDAKLSAgICAgICAgLnNpbmdsZVVwZ3JhZGUodjMwKQotICAgICAgICAuc2luZ2xlVXBncmFkZSh2M1gpCi0gICAgICAgIC5zZXR1cChjbHVzdGVyIC0+IHsKLSAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKENSRUFURV9UQUJMRSk7Ci0gICAgICAgICAgICBpbnNlcnREYXRhKGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkpOwotICAgICAgICAgICAgdGVzdERpZ2VzdENvbnNpc3RlbmN5KGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkpOwotICAgICAgICAgICAgdGVzdERpZ2VzdENvbnNpc3RlbmN5KGNsdXN0ZXIuY29vcmRpbmF0b3IoMikpOwotICAgICAgICB9KQotICAgICAgICAucnVuQWZ0ZXJDbHVzdGVyVXBncmFkZShjbHVzdGVyIC0+IHsKLSAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gbGV0IGdvc3NpcCBzZXR0bGUgb3IgdGhlIHRlc3Qgd2lsbCBmYWlsCi0gICAgICAgICAgICBpbnQgYXR0ZW1wdHMgPSAxOwotICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gQ29udmVydDJNZXRob2RSZWYKLSAgICAgICAgICAgIHdoaWxlICghKChJSW52b2thYmxlSW5zdGFuY2UpIGNsdXN0ZXIuZ2V0KDEpKS5jYWxsT25JbnN0YW5jZSgoKSAtPiBHb3NzaXBlci5pbnN0YW5jZS5pc1VwZ3JhZGluZ0Zyb21WZXJzaW9uTG93ZXJUaGFuKENhc3NhbmRyYVZlcnNpb24uQ0FTU0FORFJBXzRfMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFHb3NzaXBlci5pbnN0YW5jZS5pc1VwZ3JhZGluZ0Zyb21WZXJzaW9uTG93ZXJUaGFuKG5ldyBDYXNzYW5kcmFWZXJzaW9uKCgiMy4wIikpLmZhbWlseUxvd2VyQm91bmQuZ2V0KCkpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdHMrKyA+IDkwKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiR29zc2lwZXIuaW5zdGFuY2UuaGF2ZU1ham9yVmVyc2lvbjNOb2RlcygpIGNvbnRpbnVhbGx5IHJldHVybnMgZmFsc2UgZGVzcGl0ZSBleHBlY3RpbmcgdG8gYmUgdHJ1ZSIpOwotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBjYXVzZSBhIGRpc2dlc3QgbWlzbWF0Y2ggaW4gbWl4ZWQgbW9kZQotICAgICAgICAgICAgdGVzdERpZ2VzdENvbnNpc3RlbmN5KGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkpOwotICAgICAgICAgICAgdGVzdERpZ2VzdENvbnNpc3RlbmN5KGNsdXN0ZXIuY29vcmRpbmF0b3IoMikpOwotICAgICAgICB9KQotICAgICAgICAucnVuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZVJlcGFpclRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVSZXBhaXJUZXN0LmphdmEKaW5kZXggODEzZDlmMi4uNmUyMmJlNSAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZVJlcGFpclRlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvTWl4ZWRNb2RlUmVwYWlyVGVzdC5qYXZhCkBAIC01NCw3ICs1NCw3IEBACiAgICAgICAgIG5ldyBVcGdyYWRlVGVzdEJhc2UuVGVzdENhc2UoKQogICAgICAgICAubm9kZXMoMikKICAgICAgICAgLm5vZGVzVG9VcGdyYWRlKFVQR1JBREVEX05PREUpCi0gICAgICAgIC5zaW5nbGVVcGdyYWRlKHYzWCkKKyAgICAgICAgLnVwZ3JhZGVzVG9DdXJyZW50RnJvbSh2NDApCiAgICAgICAgIC53aXRoQ29uZmlnKGNvbmZpZyAtPiBjb25maWcud2l0aChORVRXT1JLLCBHT1NTSVApKQogICAgICAgICAuc2V0dXAoY2x1c3RlciAtPiB7CiAgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZShDUkVBVEVfVEFCTEUpOwpAQCAtNzgsMzkgKzc4LDUxIEBACiAgICAgICAgICAgICAgICAgY2x1c3Rlci5nZXQoMikuZmx1c2goS0VZU1BBQ0UpOwogCiAgICAgICAgICAgICAgICAgLy8gaW4gY2FzZSBvZiByZXBhaXJpbmcgdGhlIHVwZ3JhZGVkIG5vZGUgdGhlIHJlcGFpciBzaG91bGQgYmUgcmVqZWN0ZWQgd2l0aCBhIGRlY3JpcHRpdmUgZXJyb3IgaW4gYm90aAotICAgICAgICAgICAgICAgIC8vIG5vZGV0b29sIG91dHB1dCBhbmQgbG9ncyAoc2VlIENBU1NBTkRSQS0xMzk0NCkKLSAgICAgICAgICAgICAgICBpZiAocmVwYWlyZWROb2RlID09IFVQR1JBREVEX05PREUpCisgICAgICAgICAgICAgICAgLy8gbm9kZXRvb2wgb3V0cHV0IGFuZCBsb2dzIChzZWUgQ0FTU0FORFJBLTEzOTQ0KSwgaWYgTWVzc2FnaW5nU2VydmljZS5jdXJyZW50VmVyc2lvbiBoYXMgY2hhbmdlZAorICAgICAgICAgICAgICAgIGlmIChjbHVzdGVyLmdldCgxKS5nZXRNZXNzYWdpbmdWZXJzaW9uKCkgIT0gY2x1c3Rlci5nZXQoMikuZ2V0TWVzc2FnaW5nVmVyc2lvbigpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9ICJSZXBhaXIgaXMgbm90IHN1cHBvcnRlZCBpbiBtaXhlZCBtYWpvciB2ZXJzaW9uIGNsdXN0ZXJzIjsKLSAgICAgICAgICAgICAgICAgICAgY2x1c3Rlci5nZXQocmVwYWlyZWROb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5vZGV0b29sUmVzdWx0KCJyZXBhaXIiLCAiLS1mdWxsIiwgS0VZU1BBQ0UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuYXNzZXJ0cygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuZXJyb3JDb250YWlucyhlcnJvck1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRMb2dIYXMoY2x1c3RlciwgcmVwYWlyZWROb2RlLCBlcnJvck1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVwYWlyZWROb2RlID09IFVQR1JBREVEX05PREUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcGFpciBpcyBvbmx5IG5vdCBzdXBwb3J0ZWQgd2hlbiBNZXNzYWdpbmdTZXJ2aWNlLmN1cnJlbnRfdmVyc2lvbiBkb24ndCBtYXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gIGJ1dCB3ZSBrZWVwIHRoZSBlcnJvciBtZXNzYWdlIHNpbXBsZSBhbmQgdXNlci1mYWNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSAiUmVwYWlyIGlzIG5vdCBzdXBwb3J0ZWQgaW4gbWl4ZWQgbWFqb3IgdmVyc2lvbiBjbHVzdGVycyI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyLmdldChyZXBhaXJlZE5vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5vZGV0b29sUmVzdWx0KCJyZXBhaXIiLCAiLS1mdWxsIiwgS0VZU1BBQ0UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFzc2VydHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcnJvckNvbnRhaW5zKGVycm9yTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRMb2dIYXMoY2x1c3RlciwgcmVwYWlyZWROb2RlLCBlcnJvck1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBub2RlIGlzc3VpbmcgdGhlIHJlcGFpciBpcyB0aGUgbm90IHVwZGF0ZWQgbm9kZSB3ZSBkb24ndCBoYXZlIHNwZWNpZmljIGVycm9yIG1hbmFnZW1lbnQsCisgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoZSByZXBhaXIgd2lsbCBwcm9kdWNlIGEgZmFpbHVyZSBpbiB0aGUgdXBncmFkZWQgbm9kZSwgYW5kIGl0IHdpbGwgdGFrZSBvbmUgaG91ciB0byB0aW1lIG91dCBpbgorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbm90IHVwZ3JhZGVkIG5vZGUuIFNpbmNlIHdlIGRvbid0IHdhbnQgdG8gd2FpdCB0aGF0IGxvbmcsIHdlIG9ubHkgd2FpdCBhIGZldyBzZWNvbmRzIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVwYWlyIGJlZm9yZSB2ZXJpZnlpbmcgdGhlICJ1bmtub3duIHZlcmIgaWQiIGVycm9yIGluIHRoZSB1cGdyYWRlZCBub2RlLgorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVcGdyYWRlYWJsZUluc3RhbmNlIGluc3RhbmNlID0gY2x1c3Rlci5nZXQocmVwYWlyZWROb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZS5zdXBwbHlBc3luYygoKSAtPiBpbnN0YW5jZS5ub2RldG9vbFJlc3VsdCgicmVwYWlyIiwgIi0tZnVsbCIsIEtFWVNQQUNFKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoMTAsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIlJlcGFpciBpbiB0aGUgbm90IHVwZ3JhZGVkIG5vZGUgc2hvdWxkIGhhdmUgdGltZWQgb3V0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGltZW91dEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydExvZ0hhcyhjbHVzdGVyLCBVUEdSQURFRF9OT0RFLCAidW5leHBlY3RlZCBleGNlcHRpb24gY2F1Z2h0IHdoaWxlIHByb2Nlc3NpbmcgaW5ib3VuZCBtZXNzYWdlcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydExvZ0hhcyhjbHVzdGVyLCBVUEdSQURFRF9OT0RFLCAiamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjogVW5rbm93biB2ZXJiIGlkIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgcHJldmlvdXMgZmFpbGVkIHJlcGFpciBoYXNuJ3QgcmVwYWlyZWQgdGhlIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhjbHVzdGVyLmdldCgxKS5leGVjdXRlSW50ZXJuYWwoU0VMRUNULCBrZXkpLCByb3cxKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhjbHVzdGVyLmdldCgyKS5leGVjdXRlSW50ZXJuYWwoU0VMRUNULCBrZXkpLCByb3cyKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIG5vZGUgaXNzdWluZyB0aGUgcmVwYWlyIGlzIHRoZSBub3QgdXBkYXRlZCBub2RlIHdlIGRvbid0IGhhdmUgc3BlY2lmaWMgZXJyb3IgbWFuYWdlbWVudCwKLSAgICAgICAgICAgICAgICAvLyBzbyB0aGUgcmVwYWlyIHdpbGwgcHJvZHVjZSBhIGZhaWx1cmUgaW4gdGhlIHVwZ3JhZGVkIG5vZGUsIGFuZCBpdCB3aWxsIHRha2Ugb25lIGhvdXIgdG8gdGltZSBvdXQgaW4KLSAgICAgICAgICAgICAgICAvLyB0aGUgbm90IHVwZ3JhZGVkIG5vZGUuIFNpbmNlIHdlIGRvbid0IHdhbnQgdG8gd2FpdCB0aGF0IGxvbmcsIHdlIG9ubHkgd2FpdCBhIGZldyBzZWNvbmRzIGZvciB0aGUKLSAgICAgICAgICAgICAgICAvLyByZXBhaXIgYmVmb3JlIHZlcmlmeWluZyB0aGUgInVua25vd24gdmVyYiBpZCIgZXJyb3IgaW4gdGhlIHVwZ3JhZGVkIG5vZGUuCiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElVcGdyYWRlYWJsZUluc3RhbmNlIGluc3RhbmNlID0gY2x1c3Rlci5nZXQocmVwYWlyZWROb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlLnN1cHBseUFzeW5jKCgpIC0+IGluc3RhbmNlLm5vZGV0b29sUmVzdWx0KCJyZXBhaXIiLCAiLS1mdWxsIiwgS0VZU1BBQ0UpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KDEwLCBUaW1lVW5pdC5TRUNPTkRTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIlJlcGFpciBpbiB0aGUgbm90IHVwZ3JhZGVkIG5vZGUgc2hvdWxkIGhhdmUgdGltZWQgb3V0Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0TG9nSGFzKGNsdXN0ZXIsIFVQR1JBREVEX05PREUsICJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiBjYXVnaHQgd2hpbGUgcHJvY2Vzc2luZyBpbmJvdW5kIG1lc3NhZ2VzIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRMb2dIYXMoY2x1c3RlciwgVVBHUkFERURfTk9ERSwgImphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb246IFVua25vd24gdmVyYiBpZCIpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KHJlcGFpcmVkTm9kZSkubm9kZXRvb2xSZXN1bHQoInJlcGFpciIsICItLWZ1bGwiLCBLRVlTUEFDRSk7CisgICAgICAgICAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSByZXBhaXIgcmVwYWlyZWQgdGhlIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhjbHVzdGVyLmdldCgxKS5leGVjdXRlSW50ZXJuYWwoU0VMRUNULCBrZXkpLCByb3cxLCByb3cyKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhjbHVzdGVyLmdldCgyKS5leGVjdXRlSW50ZXJuYWwoU0VMRUNULCBrZXkpLCByb3cxLCByb3cyKTsKICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgcHJldmlvdXMgZmFpbGVkIHJlcGFpciBoYXNuJ3QgcmVwYWlyZWQgdGhlIGRhdGEKLSAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGNsdXN0ZXIuZ2V0KDEpLmV4ZWN1dGVJbnRlcm5hbChTRUxFQ1QsIGtleSksIHJvdzEpOwotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoY2x1c3Rlci5nZXQoMikuZXhlY3V0ZUludGVybmFsKFNFTEVDVCwga2V5KSwgcm93Mik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0pCiAgICAgICAgIC5ydW4oKTsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVSZXBsaWNhdGlvblRlc3RCYXNlLmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvTWl4ZWRNb2RlUmVwbGljYXRpb25UZXN0QmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjJkYTdhLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVSZXBsaWNhdGlvblRlc3RCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnVwZ3JhZGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgY29tLnZkdXJtb250LnNlbXZlcjRqLlNlbXZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Db25zaXN0ZW5jeUxldmVsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5Bc3NlcnRVdGlscy5hc3NlcnRSb3dzOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuQXNzZXJ0VXRpbHMucm93OwotCi0vKioKLSAqIEEgYmFzZSBjbGFzcyBmb3IgdGVzdGluZyBiYXNpYyByZXBsaWNhdGlvbiBvbiBtaXhlZC12ZXJzaW9uIGNsdXN0ZXJzLgotICovCi1wdWJsaWMgY2xhc3MgTWl4ZWRNb2RlUmVwbGljYXRpb25UZXN0QmFzZSBleHRlbmRzIFVwZ3JhZGVUZXN0QmFzZQotewotICAgIHByb3RlY3RlZCB2b2lkIHRlc3RTaW1wbGVTdHJhdGVneShTZW12ZXIgZnJvbSkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgdGVzdFNpbXBsZVN0cmF0ZWd5KGZyb20sIFVwZ3JhZGVUZXN0QmFzZS5DVVJSRU5UKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0U2ltcGxlU3RyYXRlZ3koU2VtdmVyIGZyb20sIFNlbXZlciB0bykgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgU3RyaW5nIGluc2VydCA9ICJJTlNFUlQgSU5UTyB0ZXN0X3NpbXBsZS5uYW1lcyAoa2V5LCBuYW1lKSBWQUxVRVMgKD8sID8pIjsKLSAgICAgICAgU3RyaW5nIHNlbGVjdCA9ICJTRUxFQ1QgKiBGUk9NIHRlc3Rfc2ltcGxlLm5hbWVzIFdIRVJFIGtleSA9ID8iOwotCi0gICAgICAgIG5ldyBUZXN0Q2FzZSgpCi0gICAgICAgIC5ub2RlcygzKQotICAgICAgICAubm9kZXNUb1VwZ3JhZGUoMSwgMikKLSAgICAgICAgLnVwZ3JhZGVzKGZyb20sIHRvKQotICAgICAgICAuc2V0dXAoY2x1c3RlciAtPiB7Ci0gICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiQ1JFQVRFIEtFWVNQQUNFIHRlc3Rfc2ltcGxlIFdJVEggcmVwbGljYXRpb24gPSB7J2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3Rvcic6IDJ9OyIpOwotICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoIkNSRUFURSBUQUJMRSB0ZXN0X3NpbXBsZS5uYW1lcyAoa2V5IGludCBQUklNQVJZIEtFWSwgbmFtZSB0ZXh0KSIpOwotICAgICAgICB9KQotICAgICAgICAucnVuQWZ0ZXJOb2RlVXBncmFkZSgoY2x1c3RlciwgdXBncmFkZWQpIC0+IHsKLSAgICAgICAgICAgIExpc3Q8TG9uZz4gaW5pdGlhbFRva2VucyA9IG5ldyBBcnJheUxpc3Q8PihjbHVzdGVyLnNpemUoKSArIDEpOwotICAgICAgICAgICAgaW5pdGlhbFRva2Vucy5hZGQobnVsbCk7IC8vIFRoZSBmaXJzdCB2YWxpZCB0b2tlbiBpcyBhdCAxIHRvIGF2b2lkIG9mZnNldCBtYXRoIGJlbG93LgotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBjbHVzdGVyLnNpemUoKTsgaSsrKQotICAgICAgICAgICAgICAgIGluaXRpYWxUb2tlbnMuYWRkKExvbmcudmFsdWVPZihjbHVzdGVyLmdldChpKS5jb25maWcoKS5nZXQoImluaXRpYWxfdG9rZW4iKS50b1N0cmluZygpKSk7Ci0KLSAgICAgICAgICAgIExpc3Q8TG9uZz4gdmFsaWRUb2tlbnMgPSBpbml0aWFsVG9rZW5zLnN1Ykxpc3QoMSwgY2x1c3Rlci5zaXplKCkgKyAxKTsKLQotICAgICAgICAgICAgLy8gRXhlcmNpc2UgYWxsIHRoZSBjb29yZGluYXRvcnMuLi4KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IGNsdXN0ZXIuc2l6ZSgpOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gLi4uYW5kIHNhbXBsZSBlbm91Z2gga2V5cyB0aGF0IHdlIGNvdmVyIHRoZSByaW5nLgotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTA7IGorKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBrZXkgPSBqICsgKGkgKiAxMCk7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHJvdyA9IHJvdyhrZXksICJOZXJvIik7Ci0gICAgICAgICAgICAgICAgICAgIExvbmcgdG9rZW4gPSB0b2tlbkZyb20oa2V5KTsKLQotICAgICAgICAgICAgICAgICAgICBjbHVzdGVyLmNvb3JkaW5hdG9yKGkpLmV4ZWN1dGUoaW5zZXJ0LCBDb25zaXN0ZW5jeUxldmVsLkFMTCwgcm93KTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQgbm9kZSA9IHByaW1hcnlSZXBsaWNhKHZhbGlkVG9rZW5zLCB0b2tlbik7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoY2x1c3Rlci5nZXQobm9kZSkuZXhlY3V0ZUludGVybmFsKHNlbGVjdCwga2V5KSwgcm93KTsKLQotICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV4dE5vZGUobm9kZSwgY2x1c3Rlci5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGNsdXN0ZXIuZ2V0KG5vZGUpLmV4ZWN1dGVJbnRlcm5hbChzZWxlY3QsIGtleSksIHJvdyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQXQgUkY9MiwgdGhpcyBub2RlIHNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCB0aGUgd3JpdGUuCi0gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXh0Tm9kZShub2RlLCBjbHVzdGVyLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoY2x1c3Rlci5nZXQobm9kZSkuZXhlY3V0ZUludGVybmFsKHNlbGVjdCwga2V5KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KQotICAgICAgICAucnVuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZVdyaXRldGltZU9yVFRMVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZVdyaXRldGltZU9yVFRMVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NWZmZDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvTWl4ZWRNb2RlV3JpdGV0aW1lT3JUVExUZXN0LmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudXBncmFkZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JQ29vcmRpbmF0b3I7CitpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuQ29uc2lzdGVuY3lMZXZlbC5BTEw7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5Bc3NlcnRVdGlscy5hc3NlcnRSb3dzOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuQXNzZXJ0VXRpbHMucm93OworCisvKioKKyAqIFRlc3RzIHRoZSBDUUwgZnVuY3Rpb25zIHtAY29kZSB3cml0ZXRpbWV9LCB7QGNvZGUgbWF4d3JpdGV0aW1lfSBhbmQge0Bjb2RlIHR0bH0gb24gcm9sbGluZyB1cGdyYWRlLgorICoKKyAqIHtAY29kZSB3cml0ZXRpbWV9IGFuZCB7QGNvZGUgdHRsfSBvbiBzaW5nbGUtY2VsbCBjb2x1bW5zIGlzIGFsd2F5cyBzdXBwb3J0ZWQsIGV2ZW4gaW4gbWl4ZWQgY2x1c3RlcnMuCisgKiB7QGNvZGUgd3JpdGV0aW1lfSBhbmQge0Bjb2RlIHR0bH0gb24gbXVsdGktY2VsbCBjb2x1bW5zIGlzIG5vdCBzdXBwb3J0ZWQgaW4gY29vcmRpbmF0b3Igbm9kZXMgPCA0LjIuCisgKiB7QGNvZGUgbWF4d3JpdGV0aW1lfSBpcyBub3Qgc3VwcG9ydGVkIGluIGNvb3JkaW5hdG9yIG5vZGVzIDwgNC4yLgorICovCitwdWJsaWMgY2xhc3MgTWl4ZWRNb2RlV3JpdGV0aW1lT3JUVExUZXN0IGV4dGVuZHMgVXBncmFkZVRlc3RCYXNlCit7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGV0aW1lT3JUVExEdXJpbmdVcGdyYWRlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgbmV3IFRlc3RDYXNlKCkKKyAgICAgICAgLm5vZGVzKDIpCisgICAgICAgIC5ub2Rlc1RvVXBncmFkZU9yZGVyZWQoMSwgMikKKyAgICAgICAgLnVwZ3JhZGVzVG9DdXJyZW50RnJvbSh2MzApCisgICAgICAgIC5zZXR1cChjbHVzdGVyIC0+IHsKKworICAgICAgICAgICAgSUNvb3JkaW5hdG9yIGNvb3JkaW5hdG9yID0gY2x1c3Rlci5jb29yZGluYXRvcigxKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnQgKGsgaW50IFBSSU1BUlkgS0VZLCB2IGludCwgcyBzZXQ8aW50PiwgZnMgZnJvemVuPHNldDxpbnQ+PikiKSk7CisgICAgICAgICAgICBjb29yZGluYXRvci5leGVjdXRlKHdpdGhLZXlzcGFjZSgiSU5TRVJUIElOVE8gJXMudCAoaywgdiwgcywgZnMpIFZBTFVFUyAoMCwgMCwgezAsIDF9LCB7MCwgMSwgMiwgM30pIFVTSU5HIFRJTUVTVEFNUCAxIEFORCBUVEwgMTAwMCIpLCBBTEwpOworICAgICAgICAgICAgY29vcmRpbmF0b3IuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlVQREFURSAlcy50IFVTSU5HIFRJTUVTVEFNUCAyIEFORCBUVEwgMjAwMCBTRVQgdiA9IDEsIHMgPSBzICsgezIsIDN9IFdIRVJFIGsgPSAwIiksIEFMTCk7CisKKyAgICAgICAgICAgIGFzc2VydFByZTQyQmVoYXZpb3VyKGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkpOworICAgICAgICAgICAgYXNzZXJ0UHJlNDJCZWhhdmlvdXIoY2x1c3Rlci5jb29yZGluYXRvcigyKSk7CisgICAgICAgIH0pCisgICAgICAgIC5ydW5BZnRlck5vZGVVcGdyYWRlKChjbHVzdGVyLCBub2RlKSAtPiB7CisgICAgICAgICAgICBpZiAobm9kZSA9PSAxKSAvLyBvbmx5IG5vZGUxIGlzIHVwZ3JhZGVkLCBhbmQgdGhlIGNsdXN0ZXIgaXMgaW4gbWl4ZWQgbW9kZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydFBvc3Q0MkJlaGF2aW91cihjbHVzdGVyLmNvb3JkaW5hdG9yKDEpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRQcmU0MkJlaGF2aW91cihjbHVzdGVyLmNvb3JkaW5hdG9yKDIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgLy8gYm90aCBub2RlcyBoYXZlIGJlZW4gdXBncmFkZWQsIGFuZCB0aGUgY2x1c3RlciBpc24ndCBpbiBtaXhlZCBtb2RlIGFueW1vcmUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRQb3N0NDJCZWhhdmlvdXIoY2x1c3Rlci5jb29yZGluYXRvcigxKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0UG9zdDQyQmVoYXZpb3VyKGNsdXN0ZXIuY29vcmRpbmF0b3IoMikpOworICAgICAgICAgICAgfQorICAgICAgICB9KQorICAgICAgICAucnVuKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFByZTQyQmVoYXZpb3VyKElDb29yZGluYXRvciBjb29yZGluYXRvcikKKyAgICB7CisgICAgICAgIC8vIHJlZ3VsYXIgY29sdW1uLCBzdXBwb3J0ZWQgZXhjZXB0IGZvciBtYXh3cml0ZXRpbWUKKyAgICAgICAgYXNzZXJ0Um93cyhjb29yZGluYXRvci5leGVjdXRlKHdpdGhLZXlzcGFjZSgiU0VMRUNUIHdyaXRldGltZSh2KSBGUk9NICVzLnQiKSwgQUxMKSwgcm93KDJMKSk7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IGNvb3JkaW5hdG9yLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJTRUxFQ1QgbWF4d3JpdGV0aW1lKHYpIEZST00gJXMudCIpLCBBTEwpKQorICAgICAgICAgICAgICAgICAgLmhhc01lc3NhZ2VDb250YWluaW5nKCJVbmtub3duIGZ1bmN0aW9uICdtYXh3cml0ZXRpbWUnIik7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCgoSW50ZWdlcikgY29vcmRpbmF0b3IuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlNFTEVDVCB0dGwodikgRlJPTSAlcy50IiksIEFMTClbMF1bMF0pCisgICAgICAgICAgICAgICAgICAuaXNMZXNzVGhhbk9yRXF1YWxUbygyMDAwKS5pc0dyZWF0ZXJUaGFuKDIwMDAgLSAzMDApOyAvLyBtYXJnaW4gb2YgZXJyb3Igb2YgNSBtaW51dGVzIHNpbmNlIFRUTHMgZGVjcmVhc2UKKworICAgICAgICAvLyBmcm96ZW4gY29sbGVjdGlvbiwgc3VwcG9ydGVkIGV4Y2VwdCBmb3IgbWF4d3JpdGV0aW1lCisgICAgICAgIGFzc2VydFJvd3MoY29vcmRpbmF0b3IuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlNFTEVDVCB3cml0ZXRpbWUoZnMpIEZST00gJXMudCIpLCBBTEwpLCByb3coMUwpKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gY29vcmRpbmF0b3IuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlNFTEVDVCBtYXh3cml0ZXRpbWUoZnMpIEZST00gJXMudCIpLCBBTEwpKQorICAgICAgICAgICAgICAgICAgLmhhc01lc3NhZ2VDb250YWluaW5nKCJVbmtub3duIGZ1bmN0aW9uICdtYXh3cml0ZXRpbWUnIik7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCgoSW50ZWdlcikgY29vcmRpbmF0b3IuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlNFTEVDVCB0dGwoZnMpIEZST00gJXMudCIpLCBBTEwpWzBdWzBdKQorICAgICAgICAgICAgICAgICAgLmlzTGVzc1RoYW5PckVxdWFsVG8oMTAwMCkuaXNHcmVhdGVyVGhhbigxMDAwIC0gMzAwKTsgLy8gbWFyZ2luIG9mIGVycm9yIG9mIDUgbWludXRlcyBzaW5jZSBUVExzIGRlY3JlYXNlCisKKyAgICAgICAgLy8gbm90LWZyb3plbiBjb2xsZWN0aW9uLCBub3Qgc3VwcG9ydGVkCisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IGNvb3JkaW5hdG9yLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJTRUxFQ1Qgd3JpdGV0aW1lKHMpIEZST00gJXMudCIpLCBBTEwpKQorICAgICAgICAgICAgICAgICAgLmhhc01lc3NhZ2VDb250YWluaW5nKCJDYW5ub3QgdXNlIHNlbGVjdGlvbiBmdW5jdGlvbiB3cml0ZVRpbWUgb24gbm9uLWZyb3plbiBjb2xsZWN0aW9uIHMiKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gY29vcmRpbmF0b3IuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlNFTEVDVCBtYXh3cml0ZXRpbWUocykgRlJPTSAlcy50IiksIEFMTCkpCisgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcoIlVua25vd24gZnVuY3Rpb24gJ21heHdyaXRldGltZSciKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gY29vcmRpbmF0b3IuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlNFTEVDVCB0dGwocykgRlJPTSAlcy50IiksIEFMTCkpCisgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcoIkNhbm5vdCB1c2Ugc2VsZWN0aW9uIGZ1bmN0aW9uIHR0bCBvbiBub24tZnJvemVuIGNvbGxlY3Rpb24gcyIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQb3N0NDJCZWhhdmlvdXIoSUNvb3JkaW5hdG9yIGNvb3JkaW5hdG9yKQorICAgIHsKKyAgICAgICAgLy8gcmVndWxhciBjb2x1bW4sIGZ1bGx5IHN1cHBvcnRlZAorICAgICAgICBhc3NlcnRSb3dzKGNvb3JkaW5hdG9yLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJTRUxFQ1Qgd3JpdGV0aW1lKHYpIEZST00gJXMudCIpLCBBTEwpLCByb3coMkwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhjb29yZGluYXRvci5leGVjdXRlKHdpdGhLZXlzcGFjZSgiU0VMRUNUIG1heHdyaXRldGltZSh2KSBGUk9NICVzLnQiKSwgQUxMKSwgcm93KDJMKSk7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCgoSW50ZWdlcikgY29vcmRpbmF0b3IuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlNFTEVDVCB0dGwodikgRlJPTSAlcy50IiksIEFMTClbMF1bMF0pCisgICAgICAgICAgICAgICAgICAuaXNMZXNzVGhhbk9yRXF1YWxUbygyMDAwKS5pc0dyZWF0ZXJUaGFuKDIwMDAgLSAzMDApOyAvLyBtYXJnaW4gb2YgZXJyb3Igb2YgNSBtaW51dGVzIHNpbmNlIFRUTHMgZGVjcmVhc2UKKworICAgICAgICAvLyBmcm96ZW4gY29sbGVjdGlvbiwgZnVsbHkgc3VwcG9ydGVkCisgICAgICAgIGFzc2VydFJvd3MoY29vcmRpbmF0b3IuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlNFTEVDVCB3cml0ZXRpbWUoZnMpIEZST00gJXMudCIpLCBBTEwpLCByb3coMUwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhjb29yZGluYXRvci5leGVjdXRlKHdpdGhLZXlzcGFjZSgiU0VMRUNUIG1heHdyaXRldGltZShmcykgRlJPTSAlcy50IiksIEFMTCksIHJvdygxTCkpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoKEludGVnZXIpIGNvb3JkaW5hdG9yLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJTRUxFQ1QgdHRsKGZzKSBGUk9NICVzLnQiKSwgQUxMKVswXVswXSkKKyAgICAgICAgICAgICAgICAgIC5pc0xlc3NUaGFuT3JFcXVhbFRvKDEwMDApLmlzR3JlYXRlclRoYW4oMTAwMCAtIDMwMCk7IC8vIG1hcmdpbiBvZiBlcnJvciBvZiA1IG1pbnV0ZXMgc2luY2UgVFRMcyBkZWNyZWFzZQorCisgICAgICAgIC8vIG5vdC1mcm96ZW4gY29sbGVjdGlvbiwgZnVsbHkgc3VwcG9ydGVkCisgICAgICAgIGFzc2VydFJvd3MoY29vcmRpbmF0b3IuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlNFTEVDVCB3cml0ZXRpbWUocykgRlJPTSAlcy50IiksIEFMTCksIHJvdyhBcnJheXMuYXNMaXN0KDFMLCAxTCwgMkwsIDJMKSkpOworICAgICAgICBhc3NlcnRSb3dzKGNvb3JkaW5hdG9yLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJTRUxFQ1QgbWF4d3JpdGV0aW1lKHMpIEZST00gJXMudCIpLCBBTEwpLCByb3coMkwpKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGNvb3JkaW5hdG9yLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJTRUxFQ1QgdHRsKHMpIEZST00gJXMudCIpLCBBTEwpWzBdWzBdKQorICAgICAgICAgICAgICAgICAgLm1hdGNoZXMobCAtPiBsIGluc3RhbmNlb2YgTGlzdCAmJiAoKExpc3Q8Pz4pIGwpLnNpemUoKSA9PSA0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvUHJlNDBNZXNzYWdlRmlsdGVyVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL1ByZTQwTWVzc2FnZUZpbHRlclRlc3QuamF2YQppbmRleCA0Y2NhN2I5Li45MDMwZmRjIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvUHJlNDBNZXNzYWdlRmlsdGVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9QcmU0ME1lc3NhZ2VGaWx0ZXJUZXN0LmphdmEKQEAgLTM0LDkgKzM0LDcgQEAKICAgICAgICAgLm5vZGVzKDIpCiAgICAgICAgIC53aXRoQ29uZmlnKGNvbmZpZ0NvbnN1bWVyKQogICAgICAgICAubm9kZXNUb1VwZ3JhZGUoMSkKLSAgICAgICAgLy8gYWxsIHVwZ3JhZGVzIGZyb20gdjMwIHVwLCBleGNsdWRpbmcgdjMwLT52M1gKLSAgICAgICAgLnNpbmdsZVVwZ3JhZGUodjMwKQotICAgICAgICAudXBncmFkZXNGcm9tKHYzWCkKKyAgICAgICAgLnVwZ3JhZGVzVG9DdXJyZW50RnJvbSh2NDApCiAgICAgICAgIC5zZXR1cCgoY2x1c3RlcikgLT4gewogICAgICAgICAgICAgY2x1c3Rlci5maWx0ZXJzKCkub3V0Ym91bmQoKS5hbGxWZXJicygpLm1lc3NhZ2VzTWF0Y2hpbmcoKGYsdCxtKSAtPiBmYWxzZSkuZHJvcCgpOwogICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoIkNSRUFURSBUQUJMRSAiICsgS0VZU1BBQ0UgKyAiLnRibCAocGsgaW50LCBjayBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkiKTsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9VcGdyYWRlVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL1VwZ3JhZGVUZXN0LmphdmEKaW5kZXggYjE2OTJiOS4uNTVlMWYxZSAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL1VwZ3JhZGVUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL1VwZ3JhZGVUZXN0LmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Db25zaXN0ZW5jeUxldmVsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlOworCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5Bc3NlcnRVdGlscy4qOwogCiBwdWJsaWMgY2xhc3MgVXBncmFkZVRlc3QgZXh0ZW5kcyBVcGdyYWRlVGVzdEJhc2UKQEAgLTMzLDcgKzM0LDcgQEAKICAgICAgICAgLm5vZGVzKDIpCiAgICAgICAgIC5ub2Rlc1RvVXBncmFkZSgxKQogICAgICAgICAud2l0aENvbmZpZygoY2ZnKSAtPiBjZmcud2l0aChGZWF0dXJlLk5FVFdPUkssIEZlYXR1cmUuR09TU0lQKSkKLSAgICAgICAgLnVwZ3JhZGVzRnJvbSh2M1gpCisgICAgICAgIC51cGdyYWRlc1RvQ3VycmVudEZyb20odjNYKQogICAgICAgICAuc2V0dXAoKGNsdXN0ZXIpIC0+IHsKICAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKCJDUkVBVEUgVEFCTEUgIiArIEtFWVNQQUNFICsgIi50YmwgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CiAgICAgICAgICAgICBjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUoIklOU0VSVCBJTlRPICIgKyBLRVlTUEFDRSArICIudGJsIChwaywgY2ssIHYpIFZBTFVFUyAoMSwgMSwgMSkiLCBDb25zaXN0ZW5jeUxldmVsLkFMTCk7CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvVXBncmFkZVRlc3RCYXNlLmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvVXBncmFkZVRlc3RCYXNlLmphdmEKaW5kZXggNWMzMmZjZC4uZTQ0ZWNjNyAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL1VwZ3JhZGVUZXN0QmFzZS5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9VcGdyYWRlVGVzdEJhc2UuamF2YQpAQCAtMTksMTcgKzE5LDIyIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnVwZ3JhZGU7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5OYXZpZ2FibGVTZXQ7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OwogaW1wb3J0IGNvbS52ZHVybW9udC5zZW12ZXI0ai5TZW12ZXI7CiBpbXBvcnQgY29tLnZkdXJtb250LnNlbXZlcjRqLlNlbXZlci5TZW12ZXJUeXBlOwogCiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogCiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKQEAgLTQ0LDEwICs0OSwxMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5UaHJvd2luZ1J1bm5hYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5WZXJzaW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlNpbXBsZUdyYXBoOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5WZXJzaW9ucy5WZXJzaW9uOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuVmVyc2lvbnMuZmluZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2ltcGxlR3JhcGguc29ydGVkVmVydGljZXM7CiAKIHB1YmxpYyBjbGFzcyBVcGdyYWRlVGVzdEJhc2UgZXh0ZW5kcyBEaXN0cmlidXRlZFRlc3RCYXNlCiB7CkBAIC01Niw4ICs2Miw3IEBACiAgICAgQEFmdGVyCiAgICAgcHVibGljIHZvaWQgYWZ0ZXJFYWNoKCkKICAgICB7Ci0gICAgICAgIFN5c3RlbS5ydW5GaW5hbGl6YXRpb24oKTsKLSAgICAgICAgU3lzdGVtLmdjKCk7CisgICAgICAgIHRyaWdnZXJHQygpOwogICAgIH0KIAogICAgIEBCZWZvcmVDbGFzcwpAQCAtODYsMjcgKzkxLDU4IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZW12ZXIgdjNYID0gbmV3IFNlbXZlcigiMy4xMS4wIiwgU2VtdmVyVHlwZS5MT09TRSk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZW12ZXIgdjQwID0gbmV3IFNlbXZlcigiNC4wLWFscGhhMSIsIFNlbXZlclR5cGUuTE9PU0UpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2VtdmVyIHY0MSA9IG5ldyBTZW12ZXIoIjQuMS1hbHBoYTEiLCBTZW12ZXJUeXBlLkxPT1NFKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNlbXZlciB2NTAgPSBuZXcgU2VtdmVyKCI1LjAtYWxwaGExIiwgU2VtdmVyVHlwZS5MT09TRSk7CiAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExpc3Q8UGFpcjxTZW12ZXIsU2VtdmVyPj4gU1VQUE9SVEVEX1VQR1JBREVfUEFUSFMgPSBJbW11dGFibGVMaXN0Lm9mKAotICAgICAgICBQYWlyLmNyZWF0ZSh2MzAsIHYzWCksCi0gICAgICAgIFBhaXIuY3JlYXRlKHYzMCwgdjQwKSwKLSAgICAgICAgUGFpci5jcmVhdGUodjMwLCB2NDEpLAotICAgICAgICBQYWlyLmNyZWF0ZSh2M1gsIHY0MCksCi0gICAgICAgIFBhaXIuY3JlYXRlKHYzWCwgdjQxKSwKLSAgICAgICAgUGFpci5jcmVhdGUodjQwLCB2NDEpKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFNpbXBsZUdyYXBoPFNlbXZlcj4gU1VQUE9SVEVEX1VQR1JBREVfUEFUSFMgPSBuZXcgU2ltcGxlR3JhcGguQnVpbGRlcjxTZW12ZXI+KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRWRnZSh2MzAsIHYzWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRWRnZSh2MzAsIHY0MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRWRnZSh2MzAsIHY0MSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRWRnZSh2M1gsIHY0MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRWRnZSh2M1gsIHY0MSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRWRnZSh2NDAsIHY0MSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRWRnZSh2NDAsIHY1MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRWRnZSh2NDEsIHY1MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKIAogICAgIC8vIHRoZSBsYXN0IGlzIGFsd2F5cyB0aGUgY3VycmVudAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2VtdmVyIENVUlJFTlQgPSBTVVBQT1JURURfVVBHUkFERV9QQVRIUy5nZXQoU1VQUE9SVEVEX1VQR1JBREVfUEFUSFMuc2l6ZSgpIC0gMSkucmlnaHQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZW12ZXIgQ1VSUkVOVCA9IFNpbXBsZUdyYXBoLm1heChTVVBQT1JURURfVVBHUkFERV9QQVRIUyk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZW12ZXIgT0xERVNUID0gU2ltcGxlR3JhcGgubWluKFNVUFBPUlRFRF9VUEdSQURFX1BBVEhTKTsKIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFZlcnNpb25zCiAgICAgewogICAgICAgICBmaW5hbCBWZXJzaW9uIGluaXRpYWw7Ci0gICAgICAgIGZpbmFsIFZlcnNpb24gdXBncmFkZTsKKyAgICAgICAgZmluYWwgTGlzdDxWZXJzaW9uPiB1cGdyYWRlOworICAgICAgICBmaW5hbCBMaXN0PFNlbXZlcj4gdXBncmFkZVZlcnNpb25zOwogCi0gICAgICAgIHB1YmxpYyBUZXN0VmVyc2lvbnMoVmVyc2lvbiBpbml0aWFsLCBWZXJzaW9uIHVwZ3JhZGUpCisgICAgICAgIHB1YmxpYyBUZXN0VmVyc2lvbnMoVmVyc2lvbiBpbml0aWFsLCBMaXN0PFZlcnNpb24+IHVwZ3JhZGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXMuaW5pdGlhbCA9IGluaXRpYWw7CiAgICAgICAgICAgICB0aGlzLnVwZ3JhZGUgPSB1cGdyYWRlOworICAgICAgICAgICAgdGhpcy51cGdyYWRlVmVyc2lvbnMgPSB1cGdyYWRlLnN0cmVhbSgpLm1hcCh2IC0+IHYudmVyc2lvbikuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgVGVzdFZlcnNpb25zIHRoYXQgPSAoVGVzdFZlcnNpb25zKSBvOworICAgICAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWxzKGluaXRpYWwudmVyc2lvbiwgdGhhdC5pbml0aWFsLnZlcnNpb24pICYmIE9iamVjdHMuZXF1YWxzKHVwZ3JhZGVWZXJzaW9ucywgdGhhdC51cGdyYWRlVmVyc2lvbnMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKGluaXRpYWwudmVyc2lvbiwgdXBncmFkZVZlcnNpb25zKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoaW5pdGlhbC52ZXJzaW9uKS5hcHBlbmQoIiAtPiAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh1cGdyYWRlVmVyc2lvbnMpOworICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTExOCw2ICsxNTQsNyBAQAogICAgICAgICBwcml2YXRlIFJ1bk9uQ2x1c3RlciBzZXR1cDsKICAgICAgICAgcHJpdmF0ZSBSdW5PbkNsdXN0ZXJBbmROb2RlIHJ1bkJlZm9yZU5vZGVSZXN0YXJ0OwogICAgICAgICBwcml2YXRlIFJ1bk9uQ2x1c3RlckFuZE5vZGUgcnVuQWZ0ZXJOb2RlVXBncmFkZTsKKyAgICAgICAgcHJpdmF0ZSBSdW5PbkNsdXN0ZXIgcnVuQmVmb3JlQ2x1c3RlclVwZ3JhZGU7CiAgICAgICAgIHByaXZhdGUgUnVuT25DbHVzdGVyIHJ1bkFmdGVyQ2x1c3RlclVwZ3JhZGU7CiAgICAgICAgIHByaXZhdGUgZmluYWwgU2V0PEludGVnZXI+IG5vZGVzVG9VcGdyYWRlID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOwogICAgICAgICBwcml2YXRlIENvbnN1bWVyPElJbnN0YW5jZUNvbmZpZz4gY29uZmlnQ29uc3VtZXI7CkBAIC0xMzksMjkgKzE3Niw4MCBAQAogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAotICAgICAgICAvKiogcGVyZm9ybXMgYWxsIHN1cHBvcnRlZCB1cGdyYWRlIHBhdGhzIHRoYXQgZXhpc3QgaW4gYmV0d2VlbiBmcm9tIGFuZCBDVVJSRU5UIChpbmNsdXNpdmUpICoqLwotICAgICAgICBwdWJsaWMgVGVzdENhc2UgdXBncmFkZXNGcm9tKFNlbXZlciBmcm9tKQorICAgICAgICAvKiogcGVyZm9ybXMgYWxsIHN1cHBvcnRlZCB1cGdyYWRlIHBhdGhzIHRoYXQgZXhpc3QgaW4gYmV0d2VlbiBmcm9tIGFuZCBlbmQgb24gQ1VSUkVOVCAoaW5jbHVzaXZlKQorICAgICAgICAgKiB7QGNvZGUgdXBncmFkZXNUb0N1cnJlbnRGcm9tKDMuMCk7IC8vIHByb2R1Y2VzOiAzLjAgLT4gQ1VSUkVOVCwgMy4xMSAtPiBDVVJSRU5ULCDigKZ9CisgICAgICAgICAqKi8KKyAgICAgICAgcHVibGljIFRlc3RDYXNlIHVwZ3JhZGVzVG9DdXJyZW50RnJvbShTZW12ZXIgZnJvbSkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHVwZ3JhZGVzKGZyb20sIENVUlJFTlQpOworICAgICAgICAgICAgcmV0dXJuIHVwZ3JhZGVzVG8oZnJvbSwgQ1VSUkVOVCk7CiAgICAgICAgIH0KIAotICAgICAgICAvKiogcGVyZm9ybXMgYWxsIHN1cHBvcnRlZCB1cGdyYWRlIHBhdGhzIHRoYXQgZXhpc3QgaW4gYmV0d2VlbiBmcm9tIGFuZCB0byAoaW5jbHVzaXZlKSAqKi8KLSAgICAgICAgcHVibGljIFRlc3RDYXNlIHVwZ3JhZGVzKFNlbXZlciBmcm9tLCBTZW12ZXIgdG8pCisgICAgICAgIC8qKgorICAgICAgICAgKiBwZXJmb3JtcyBhbGwgc3VwcG9ydGVkIHVwZ3JhZGUgcGF0aHMgdG8gdGhlICJ0byIgdGFyZ2V0OyBleGFtcGxlCisgICAgICAgICAqIHtAY29kZSB1cGdyYWRlc1RvKDMuMCwgNC4wKTsgLy8gcHJvZHVjZXM6IDMuMCAtPiA0LjAsIDMuMTEgLT4gNC4wfQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFRlc3RDYXNlIHVwZ3JhZGVzVG8oU2VtdmVyIGZyb20sIFNlbXZlciB0bykKICAgICAgICAgewotICAgICAgICAgICAgU1VQUE9SVEVEX1VQR1JBREVfUEFUSFMuc3RyZWFtKCkKLSAgICAgICAgICAgICAgICAuZmlsdGVyKHVwZ3JhZGVQYXRoIC0+ICh1cGdyYWRlUGF0aC5sZWZ0LmNvbXBhcmVUbyhmcm9tKSA+PSAwICYmIHVwZ3JhZGVQYXRoLnJpZ2h0LmNvbXBhcmVUbyh0bykgPD0gMCkpCi0gICAgICAgICAgICAgICAgLmZvckVhY2hPcmRlcmVkKHVwZ3JhZGVQYXRoIC0+Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZ3JhZGUuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUZXN0VmVyc2lvbnModmVyc2lvbnMuZ2V0TGF0ZXN0KHVwZ3JhZGVQYXRoLmxlZnQpLCB2ZXJzaW9ucy5nZXRMYXRlc3QodXBncmFkZVBhdGgucmlnaHQpKSk7Ci0gICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBMaXN0PFRlc3RWZXJzaW9ucz4gdXBncmFkZSA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgTmF2aWdhYmxlU2V0PFNlbXZlcj4gdmVydGljZXMgPSBzb3J0ZWRWZXJ0aWNlcyhTVVBQT1JURURfVVBHUkFERV9QQVRIUyk7CisgICAgICAgICAgICBmb3IgKFNlbXZlciBzdGFydCA6IHZlcnRpY2VzLnN1YlNldChmcm9tLCB0cnVlLCB0bywgZmFsc2UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG9ubHkgaW5jbHVkZSBwYWlycyB0aGF0IGFyZSBhbGxvd2VkLCBhbmQgc3RhcnQgb3IgZW5kIG9uIENVUlJFTlQKKyAgICAgICAgICAgICAgICBpZiAoU1VQUE9SVEVEX1VQR1JBREVfUEFUSFMuaGFzRWRnZShzdGFydCwgdG8pICYmIGNvbnRhaW5zKHN0YXJ0LCB0bywgQ1VSUkVOVCkpCisgICAgICAgICAgICAgICAgICAgIHVwZ3JhZGUuYWRkKG5ldyBUZXN0VmVyc2lvbnModmVyc2lvbnMuZ2V0TGF0ZXN0KHN0YXJ0KSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh2ZXJzaW9ucy5nZXRMYXRlc3QodG8pKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkFkZGluZyB1cGdyYWRlcyBvZlxue30iLCB1cGdyYWRlLnN0cmVhbSgpLm1hcChUZXN0VmVyc2lvbnM6OnRvU3RyaW5nKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiXG4iKSkpOworICAgICAgICAgICAgdGhpcy51cGdyYWRlLmFkZEFsbCh1cGdyYWRlKTsKICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqIFdpbGwgdGVzdCB0aGlzIHNwZWNpZmljIHVwZ3JhZGUgcGF0aCAqKi8KLSAgICAgICAgcHVibGljIFRlc3RDYXNlIHNpbmdsZVVwZ3JhZGUoU2VtdmVyIGZyb20pCisgICAgICAgIC8qKgorICAgICAgICAgKiBwZXJmb3JtcyBhbGwgc3VwcG9ydGVkIHVwZ3JhZGUgcGF0aHMgZnJvbSB0aGUgImZyb20iIHRhcmdldDsgZXhhbXBsZQorICAgICAgICAgKiB7QGNvZGUgdXBncmFkZXNGcm9tKDQuMCwgNC4yKTsgLy8gcHJvZHVjZXM6IDQuMCAtPiA0LjEsIDQuMCAtPiA0LjJ9CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgVGVzdENhc2UgdXBncmFkZXNGcm9tKFNlbXZlciBmcm9tLCBTZW12ZXIgdG8pCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMudXBncmFkZS5hZGQobmV3IFRlc3RWZXJzaW9ucyh2ZXJzaW9ucy5nZXRMYXRlc3QoZnJvbSksIHZlcnNpb25zLmdldExhdGVzdChDVVJSRU5UKSkpOworICAgICAgICAgICAgTGlzdDxUZXN0VmVyc2lvbnM+IHVwZ3JhZGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgIE5hdmlnYWJsZVNldDxTZW12ZXI+IHZlcnRpY2VzID0gc29ydGVkVmVydGljZXMoU1VQUE9SVEVEX1VQR1JBREVfUEFUSFMpOworICAgICAgICAgICAgZm9yIChTZW12ZXIgZW5kIDogdmVydGljZXMuc3ViU2V0KGZyb20sIGZhbHNlLCB0bywgdHJ1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gb25seSBpbmNsdWRlIHBhaXJzIHRoYXQgYXJlIGFsbG93ZWQsIGFuZCBzdGFydCBvciBlbmQgb24gQ1VSUkVOVAorICAgICAgICAgICAgICAgIGlmIChTVVBQT1JURURfVVBHUkFERV9QQVRIUy5oYXNFZGdlKGZyb20sIGVuZCkgJiYgY29udGFpbnMoZnJvbSwgZW5kLCBDVVJSRU5UKSkKKyAgICAgICAgICAgICAgICAgICAgdXBncmFkZS5hZGQobmV3IFRlc3RWZXJzaW9ucyh2ZXJzaW9ucy5nZXRMYXRlc3QoZnJvbSksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodmVyc2lvbnMuZ2V0TGF0ZXN0KGVuZCkpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2dnZXIuaW5mbygiQWRkaW5nIHVwZ3JhZGVzIG9mXG57fSIsIHVwZ3JhZGUuc3RyZWFtKCkubWFwKFRlc3RWZXJzaW9uczo6dG9TdHJpbmcpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCJcbiIpKSk7CisgICAgICAgICAgICB0aGlzLnVwZ3JhZGUuYWRkQWxsKHVwZ3JhZGUpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogcGVyZm9ybXMgYWxsIHN1cHBvcnRlZCB1cGdyYWRlIHBhdGhzIHRoYXQgZXhpc3QgaW4gYmV0d2VlbiBmcm9tIGFuZCB0byB0aGF0IGluY2x1ZGUgdGhlIGN1cnJlbnQgdmVyc2lvbi4KKyAgICAgICAgICogVGhpcyBjYWxsIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyB7QGNvZGUgdXBncmFkZXNUbyhmcm9tLCBDVVJSRU5UKS51cGdyYWRlc0Zyb20oQ1VSUkVOVCwgdG8pfS4KKyAgICAgICAgICoqLworICAgICAgICBwdWJsaWMgVGVzdENhc2UgdXBncmFkZXMoU2VtdmVyIGZyb20sIFNlbXZlciB0bykKKyAgICAgICAgeworICAgICAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoIlVuYWJsZSB0byBkbyB1cGdyYWRlcygiICsgZnJvbSArICIsICIgKyB0byArICIpOyBkb2VzIG5vdCBjb250YWluIENVUlJFTlQ9IiArIENVUlJFTlQsIGNvbnRhaW5zKGZyb20sIHRvLCBDVVJSRU5UKSk7CisgICAgICAgICAgICBpZiAoZnJvbS5jb21wYXJlVG8oQ1VSUkVOVCkgPCAwKQorICAgICAgICAgICAgICAgIHVwZ3JhZGVzVG8oZnJvbSwgQ1VSUkVOVCk7CisgICAgICAgICAgICBpZiAoQ1VSUkVOVC5jb21wYXJlVG8odG8pIDwgMCkKKyAgICAgICAgICAgICAgICB1cGdyYWRlc0Zyb20oQ1VSUkVOVCwgdG8pOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKFNlbXZlciBmcm9tLCBTZW12ZXIgdG8sIFNlbXZlciB0YXJnZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRhcmdldCA+PSBmcm9tICYmIHRhcmdldCA8PSB0bworICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5jb21wYXJlVG8oZnJvbSkgPj0gMCAmJiB0YXJnZXQuY29tcGFyZVRvKHRvKSA8PSAwOworICAgICAgICB9CisKKyAgICAgICAgLyoqIFdpbGwgdGVzdCB0aGlzIHNwZWNpZmljIHVwZ3JhZGUgcGF0aCAqKi8KKyAgICAgICAgcHVibGljIFRlc3RDYXNlIHNpbmdsZVVwZ3JhZGVUb0N1cnJlbnRGcm9tKFNlbXZlciBmcm9tKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIVNVUFBPUlRFRF9VUEdSQURFX1BBVEhTLmhhc0VkZ2UoZnJvbSwgQ1VSUkVOVCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJVcGdyYWRpbmcgZnJvbSAiICsgZnJvbSArICIgdG8gIiArIENVUlJFTlQgKyAiIGlzbid0IGRpcmVjdGx5IHN1cHBvcnRlZCBhbmQgbXVzdCBnbyB0aHJvdWdoIG90aGVyIHZlcnNpb25zIGZpcnN0OyBzdXBwb3J0ZWQgcGF0aHM6ICIgKyBTVVBQT1JURURfVVBHUkFERV9QQVRIUy5maW5kUGF0aHMoZnJvbSwgQ1VSUkVOVCkpOworICAgICAgICAgICAgVGVzdFZlcnNpb25zIHRlc3RzID0gbmV3IFRlc3RWZXJzaW9ucyh0aGlzLnZlcnNpb25zLmdldExhdGVzdChmcm9tKSwgQXJyYXlzLmFzTGlzdCh0aGlzLnZlcnNpb25zLmdldExhdGVzdChDVVJSRU5UKSkpOworICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkFkZGluZyB1cGdyYWRlIG9mIHt9IiwgdGVzdHMpOworICAgICAgICAgICAgdGhpcy51cGdyYWRlLmFkZCh0ZXN0cyk7CiAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCkBAIC0xODMsNiArMjcxLDEyIEBACiAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyBUZXN0Q2FzZSBydW5CZWZvcmVDbHVzdGVyVXBncmFkZShSdW5PbkNsdXN0ZXIgcnVuQmVmb3JlQ2x1c3RlclVwZ3JhZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucnVuQmVmb3JlQ2x1c3RlclVwZ3JhZGUgPSBydW5CZWZvcmVDbHVzdGVyVXBncmFkZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIFRlc3RDYXNlIHJ1bkFmdGVyQ2x1c3RlclVwZ3JhZGUoUnVuT25DbHVzdGVyIHJ1bkFmdGVyQ2x1c3RlclVwZ3JhZGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXMucnVuQWZ0ZXJDbHVzdGVyVXBncmFkZSA9IHJ1bkFmdGVyQ2x1c3RlclVwZ3JhZGU7CkBAIC0yMTEsNiArMzA1LDggQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKICAgICAgICAgICAgIGlmIChydW5CZWZvcmVOb2RlUmVzdGFydCA9PSBudWxsKQogICAgICAgICAgICAgICAgIHJ1bkJlZm9yZU5vZGVSZXN0YXJ0ID0gKGMsIG4pIC0+IHt9OworICAgICAgICAgICAgaWYgKHJ1bkJlZm9yZUNsdXN0ZXJVcGdyYWRlID09IG51bGwpCisgICAgICAgICAgICAgICAgcnVuQmVmb3JlQ2x1c3RlclVwZ3JhZGUgPSAoYykgLT4ge307CiAgICAgICAgICAgICBpZiAocnVuQWZ0ZXJDbHVzdGVyVXBncmFkZSA9PSBudWxsKQogICAgICAgICAgICAgICAgIHJ1bkFmdGVyQ2x1c3RlclVwZ3JhZGUgPSAoYykgLT4ge307CiAgICAgICAgICAgICBpZiAocnVuQWZ0ZXJOb2RlVXBncmFkZSA9PSBudWxsKQpAQCAtMjE5LDI2ICszMTUsNDQgQEAKICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMTsgbiA8PSBub2RlQ291bnQ7IG4rKykKICAgICAgICAgICAgICAgICAgICAgbm9kZXNUb1VwZ3JhZGUuYWRkKG4pOwogCisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKICAgICAgICAgICAgIGZvciAoVGVzdFZlcnNpb25zIHVwZ3JhZGUgOiB0aGlzLnVwZ3JhZGUpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oInRlc3RpbmcgdXBncmFkZSBmcm9tIHt9IHRvIHt9IiwgdXBncmFkZS5pbml0aWFsLnZlcnNpb24sIHVwZ3JhZGUudXBncmFkZS52ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygidGVzdGluZyB1cGdyYWRlIGZyb20ge30gdG8ge30iLCB1cGdyYWRlLmluaXRpYWwudmVyc2lvbiwgdXBncmFkZS51cGdyYWRlVmVyc2lvbnMpOwogICAgICAgICAgICAgICAgIHRyeSAoVXBncmFkZWFibGVDbHVzdGVyIGNsdXN0ZXIgPSBpbml0KFVwZ3JhZGVhYmxlQ2x1c3Rlci5jcmVhdGUobm9kZUNvdW50LCB1cGdyYWRlLmluaXRpYWwsIGNvbmZpZ0NvbnN1bWVyLCBidWlsZGVyQ29uc3VtZXIpKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHNldHVwLnJ1bihjbHVzdGVyKTsKIAotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuIDogbm9kZXNUb1VwZ3JhZGUpCisgICAgICAgICAgICAgICAgICAgIGZvciAoVmVyc2lvbiBuZXh0VmVyc2lvbiA6IHVwZ3JhZGUudXBncmFkZSkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlci5nZXQobikuc2h1dGRvd24oKS5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KG4pLnNldFZlcnNpb24odXBncmFkZS51cGdyYWRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJlZm9yZU5vZGVSZXN0YXJ0LnJ1bihjbHVzdGVyLCBuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KG4pLnN0YXJ0dXAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkFmdGVyTm9kZVVwZ3JhZGUucnVuKGNsdXN0ZXIsIG4pOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5CZWZvcmVDbHVzdGVyVXBncmFkZS5ydW4oY2x1c3Rlcik7CiAKLSAgICAgICAgICAgICAgICAgICAgcnVuQWZ0ZXJDbHVzdGVyVXBncmFkZS5ydW4oY2x1c3Rlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA6IG5vZGVzVG9VcGdyYWRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlci5nZXQobikuc2h1dGRvd24oKS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckdDKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KG4pLnNldFZlcnNpb24obmV4dFZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5CZWZvcmVOb2RlUmVzdGFydC5ydW4oY2x1c3Rlciwgbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KG4pLnN0YXJ0dXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQWZ0ZXJOb2RlVXBncmFkZS5ydW4oY2x1c3Rlciwgbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQWZ0ZXJDbHVzdGVyVXBncmFkZS5ydW4oY2x1c3Rlcik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyLmNoZWNrQW5kUmVzZXRVbmNhdWdodEV4Y2VwdGlvbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoU3RyaW5nLmZvcm1hdCgiRXJyb3IgaW4gdGVzdCAnJXMnIHdoaWxlIHVwZ3JhZGluZyB0byAnJXMnOyBzdWNjZXNzZnVsIHVwZ3JhZGVzICVzIiwgdXBncmFkZSwgbmV4dFZlcnNpb24udmVyc2lvbiwgdGhpcy51cGdyYWRlLnN0cmVhbSgpLmxpbWl0KG9mZnNldCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSksIHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9mZnNldCsrOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKICAgICAgICAgcHVibGljIFRlc3RDYXNlIG5vZGVzVG9VcGdyYWRlKGludCAuLi4gbm9kZXMpCiAgICAgICAgIHsKICAgICAgICAgICAgIFNldDxJbnRlZ2VyPiBzZXQgPSBuZXcgSGFzaFNldDw+KG5vZGVzLmxlbmd0aCk7CkBAIC0yNjAsMTAgKzM3NCwxNiBAQAogICAgICAgICB9CiAgICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdHJpZ2dlckdDKCkKKyAgICB7CisgICAgICAgIFN5c3RlbS5ydW5GaW5hbGl6YXRpb24oKTsKKyAgICAgICAgU3lzdGVtLmdjKCk7CisgICAgfQorCiAgICAgcHJvdGVjdGVkIFRlc3RDYXNlIGFsbFVwZ3JhZGVzKGludCBub2RlcywgaW50Li4uIHRvVXBncmFkZSkKICAgICB7CiAgICAgICAgIHJldHVybiBuZXcgVGVzdENhc2UoKS5ub2Rlcyhub2RlcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVwZ3JhZGVzRnJvbSh2MzApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51cGdyYWRlc1RvQ3VycmVudEZyb20odjMwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubm9kZXNUb1VwZ3JhZGUodG9VcGdyYWRlKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXRpbC9Db29yZGluYXRvcnMuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXRpbC9Db29yZGluYXRvcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDI2ZTYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91dGlsL0Nvb3JkaW5hdG9ycy5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5VVUlEOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklDb29yZGluYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuU2ltcGxlUXVlcnlSZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CisKK3B1YmxpYyBjbGFzcyBDb29yZGluYXRvcnMKK3sKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdpdGhUcmFjZQorICAgIHsKKyAgICAgICAgcHVibGljIGZpbmFsIFNpbXBsZVF1ZXJ5UmVzdWx0IHJlc3VsdCwgdHJhY2U7CisKKyAgICAgICAgcHVibGljIFdpdGhUcmFjZShTaW1wbGVRdWVyeVJlc3VsdCByZXN1bHQsIFNpbXBsZVF1ZXJ5UmVzdWx0IHRyYWNlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgICAgIHRoaXMudHJhY2UgPSB0cmFjZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgV2l0aFRyYWNlIHdpdGhUcmFjaW5nKElDb29yZGluYXRvciBjb29yZGluYXRvciwgU3RyaW5nIHF1ZXJ5LCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5TGV2ZWwsIE9iamVjdC4uLiBib3VuZFZhbHVlcykKKyAgICB0aHJvd3MgV2l0aFRyYWNlRXhjZXB0aW9uCisgICAgeworICAgICAgICBVVUlEIHNlc3Npb24gPSBUaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVBc1VVSUQoKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFNpbXBsZVF1ZXJ5UmVzdWx0IHJlc3VsdCA9IGNvb3JkaW5hdG9yLmV4ZWN1dGVXaXRoVHJhY2luZ1dpdGhSZXN1bHQoc2Vzc2lvbiwgcXVlcnksIGNvbnNpc3RlbmN5TGV2ZWwsIGJvdW5kVmFsdWVzKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgV2l0aFRyYWNlKHJlc3VsdCwgZ2V0VHJhY2UoY29vcmRpbmF0b3IsIHNlc3Npb24pKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXaXRoVHJhY2VFeGNlcHRpb24odCwgZ2V0VHJhY2UoY29vcmRpbmF0b3IsIHNlc3Npb24pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2ltcGxlUXVlcnlSZXN1bHQgZ2V0VHJhY2UoSUNvb3JkaW5hdG9yIGNvb3JkaW5hdG9yLCBVVUlEIHNlc3Npb24pCisgICAgeworICAgICAgICByZXR1cm4gY29vcmRpbmF0b3IuZXhlY3V0ZVdpdGhSZXN1bHQoIlNFTEVDVCAqIEZST00gc3lzdGVtX3RyYWNlcy5ldmVudHMgV0hFUkUgc2Vzc2lvbl9pZD0/IiwgQ29uc2lzdGVuY3lMZXZlbC5MT0NBTF9RVU9SVU0sIHNlc3Npb24pOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2l0aFRyYWNlRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIGZpbmFsIFNpbXBsZVF1ZXJ5UmVzdWx0IHRyYWNlOworCisgICAgICAgIHB1YmxpYyBXaXRoVHJhY2VFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlLCBTaW1wbGVRdWVyeVJlc3VsdCB0cmFjZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoY2F1c2UpOworICAgICAgICAgICAgdGhpcy50cmFjZSA9IHRyYWNlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91dGlsL1F1ZXJ5UmVzdWx0VXRpbC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91dGlsL1F1ZXJ5UmVzdWx0VXRpbC5qYXZhCmluZGV4IGE1MDJlOGMuLjIzZDg4ZTYgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXRpbC9RdWVyeVJlc3VsdFV0aWwuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3V0aWwvUXVlcnlSZXN1bHRVdGlsLmphdmEKQEAgLTE3LDExICsxNywxNCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnV0aWw7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKIAogaW1wb3J0IGNvbS5nb29nbGUubW9uaXRvcmluZy5ydW50aW1lLmluc3RydW1lbnRhdGlvbi5jb21tb24uY29sbGVjdC5JdGVyYXRvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLlF1ZXJ5UmVzdWx0czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuUm93OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5TaW1wbGVRdWVyeVJlc3VsdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5ub2RldG9vbC5mb3JtYXR0ZXIuVGFibGVCdWlsZGVyOwpAQCAtMzMsNiArMzYsMzggQEAKICAgICB7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG9yZGVyQnkoU2ltcGxlUXVlcnlSZXN1bHQgcXIsIFN0cmluZy4uLiBjb2x1bW5zKQorICAgIHsKKyAgICAgICAgaWYgKGNvbHVtbnMgPT0gbnVsbCB8fCBjb2x1bW5zLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gY29sdW1ucyBkZWZpbmVkIik7CisgICAgICAgIGludFtdIGluZGV4ID0gbmV3IGludFtjb2x1bW5zLmxlbmd0aF07CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOworICAgICAgICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IGNvbHVtbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IHFyLm5hbWVzKCkuaW5kZXhPZihuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoaWR4ID09IC0xKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGNvbHVtbiAiICsgbmFtZSk7CisgICAgICAgICAgICAgICAgaW5kZXhbb2Zmc2V0KytdID0gaWR4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHFyLnJlc2V0KCk7CisgICAgICAgIEFycmF5cy5zb3J0KHFyLnRvT2JqZWN0QXJyYXlzKCksIChhLCBiKSAtPiB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGV4Lmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBpbmRleFtpXTsKKyAgICAgICAgICAgICAgICBPYmplY3QgYW8gPSBhW2lkeF07CisgICAgICAgICAgICAgICAgT2JqZWN0IGJvID0gYltpZHhdOworICAgICAgICAgICAgICAgIGlmIChhbyA9PSBudWxsICYmIGJvID09IG51bGwpIHJldHVybiAwOworICAgICAgICAgICAgICAgIGlmIChhbyA9PSBudWxsKSByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICBpZiAoYm8gPT0gbnVsbCkgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIGludCByYyA9ICgoQ29tcGFyYWJsZSkgYW8pLmNvbXBhcmVUbyhibyk7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IDApIHJldHVybiByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9KTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoU2ltcGxlUXVlcnlSZXN1bHQgcXIsIE9iamVjdC4uLiB2YWx1ZXMpCiAgICAgewogICAgICAgICByZXR1cm4gY29udGFpbnMocXIsIGEgLT4gZXF1YWxzKGEsIHZhbHVlcykpOwpAQCAtMTAwLDYgKzEzNSwxMSBAQAogICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIFF1ZXJ5QnVpbGRlciBxdWVyeShTaW1wbGVRdWVyeVJlc3VsdCByZXN1bHQpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5QnVpbGRlcihyZXN1bHQpOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm93QXNzZXJ0SGVscGVyCiAgICAgewogICAgICAgICBwcml2YXRlIGZpbmFsIFJvdyByb3c7CkBAIC0xODQsNCArMjI0LDczIEBACiAgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoc2l6ZSkuZGVzY3JpYmVkQXMoIlF1ZXJ5UmVzdWx0IGlzIG5vdCBlbXB0eSIpLmlzRXF1YWxUbygwKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUXVlcnlCdWlsZGVyCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIFNpbXBsZVF1ZXJ5UmVzdWx0IGlucHV0OworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBuYW1lcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBwcml2YXRlIFByZWRpY2F0ZTxSb3c+IGZpbHRlciA9IGlnbm9yZSAtPiB0cnVlOworCisgICAgICAgIHB1YmxpYyBRdWVyeUJ1aWxkZXIoU2ltcGxlUXVlcnlSZXN1bHQgaW5wdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBRdWVyeUJ1aWxkZXIgc2VsZWN0KFN0cmluZy4uLiBuYW1lcykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IG5hbWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghaW5wdXQubmFtZXMoKS5jb250YWlucyhuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBjb2x1bW4gIiArIG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5uYW1lcy5jbGVhcigpOworICAgICAgICAgICAgLy8gaWYgbmFtZXMgaXMgZW1wdHksIHRoZW4gdGhpcyBiZWNvbWVzICJTRUxFQ1QgKiIKKyAgICAgICAgICAgIHRoaXMubmFtZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QobmFtZXMpKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFF1ZXJ5QnVpbGRlciBmaWx0ZXIoUHJlZGljYXRlPFJvdz4gZm4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZmlsdGVyID0gZm47CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTaW1wbGVRdWVyeVJlc3VsdCBidWlsZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFF1ZXJ5UmVzdWx0cy5CdWlsZGVyIGJ1aWxkZXIgPSBRdWVyeVJlc3VsdHMuYnVpbGRlcigpOworICAgICAgICAgICAgaWYgKG5hbWVzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmNvbHVtbnMoaW5wdXQubmFtZXMoKS50b0FycmF5KG5ldyBTdHJpbmdbMF0pKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaW5wdXQuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUm93IHJvdyA9IGlucHV0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci50ZXN0KHJvdykpCisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnJvdyhyb3cudG9PYmplY3RBcnJheSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gbmFtZXMgPSB0aGlzLm5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5jb2x1bW5zKG5hbWVzKTsKKyAgICAgICAgICAgICAgICBpbnRbXSBpbmRleCA9IG5ldyBpbnRbbmFtZXMubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogbmFtZXMpCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFtvZmZzZXQrK10gPSBpbnB1dC5uYW1lcygpLmluZGV4T2YobmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFJvdyByb3cgPSBuZXcgUm93KG5hbWVzKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaW5wdXQuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gcmF3ID0gaW5wdXQubmV4dCgpLnRvT2JqZWN0QXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gdXBkYXRlZCA9IG5ldyBPYmplY3RbaW5kZXgubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleC5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRbaV0gPSByYXdbaW5kZXhbaV1dOworICAgICAgICAgICAgICAgICAgICByb3cuc2V0UmVzdWx0cyh1cGRhdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci50ZXN0KHJvdykpCisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnJvdyh1cGRhdGVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91dGlsL1NpbmdsZUhvc3RMb2FkQmFsYW5jaW5nUG9saWN5LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3V0aWwvU2luZ2xlSG9zdExvYWRCYWxhbmNpbmdQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOThiYWFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91dGlsL1NpbmdsZUhvc3RMb2FkQmFsYW5jaW5nUG9saWN5LmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudXRpbDsKKworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmF0b3JzOworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkNsdXN0ZXI7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkhvc3Q7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkhvc3REaXN0YW5jZTsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuU3RhdGVtZW50OworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5wb2xpY2llcy5Mb2FkQmFsYW5jaW5nUG9saWN5OworCisvKioKKyAqIEEgQ1FMIGRyaXZlciB7QGxpbmsgTG9hZEJhbGFuY2luZ1BvbGljeX0gdGhhdCBvbmx5IGNvbm5lY3RzIHRvIGEgZml4ZWQgaG9zdC4KKyAqLworcHVibGljIGNsYXNzIFNpbmdsZUhvc3RMb2FkQmFsYW5jaW5nUG9saWN5IGltcGxlbWVudHMgTG9hZEJhbGFuY2luZ1BvbGljeQoreworICAgIHByaXZhdGUgZmluYWwgSW5ldEFkZHJlc3MgYWRkcmVzczsKKyAgICBwcml2YXRlIEhvc3QgaG9zdDsKKworICAgIHB1YmxpYyBTaW5nbGVIb3N0TG9hZEJhbGFuY2luZ1BvbGljeShJbmV0QWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgTGlzdDxIb3N0PiBob3N0cyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDw+KCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbml0KENsdXN0ZXIgY2x1c3RlciwgQ29sbGVjdGlvbjxIb3N0PiBob3N0cykKKyAgICB7CisgICAgICAgIGhvc3QgPSBob3N0cy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGggLT4gaC5nZXRCcm9hZGNhc3RBZGRyZXNzKCkuZXF1YWxzKGFkZHJlc3MpKS5maW5kRmlyc3QoKQorICAgICAgICAgICAgICAgICAgICAub3JFbHNlVGhyb3coKCkgLT4gbmV3IEFzc2VydGlvbkVycm9yKCJUaGUgaG9zdCBzaG91bGQgYmUgYSBjb250YWN0IHBvaW50IikpOworICAgICAgICB0aGlzLmhvc3RzLmFkZChob3N0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSG9zdERpc3RhbmNlIGRpc3RhbmNlKEhvc3QgaG9zdCkKKyAgICB7CisgICAgICAgIHJldHVybiBIb3N0RGlzdGFuY2UuTE9DQUw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEl0ZXJhdG9yPEhvc3Q+IG5ld1F1ZXJ5UGxhbihTdHJpbmcgbG9nZ2VkS2V5c3BhY2UsIFN0YXRlbWVudCBzdGF0ZW1lbnQpCisgICAgeworICAgICAgICByZXR1cm4gSXRlcmF0b3JzLnNpbmdsZXRvbkl0ZXJhdG9yKGhvc3QpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQWRkKEhvc3QgaG9zdCkKKyAgICB7CisgICAgICAgIC8vIG5vLW9wCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25VcChIb3N0IGhvc3QpCisgICAgeworICAgICAgICAvLyBuby1vcAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRG93bihIb3N0IGhvc3QpCisgICAgeworICAgICAgICAvLyBuby1vcAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVtb3ZlKEhvc3QgaG9zdCkKKyAgICB7CisgICAgICAgIC8vIG5vLW9wCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgIHsKKyAgICAgICAgLy8gbm8tb3AKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91dGlsL1R3b1dheS5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91dGlsL1R3b1dheS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NzdjYzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3V0aWwvVHdvV2F5LmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC51dGlsOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuVW5jaGVja2VkVGltZW91dEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlNoYXJlZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlVuY2hlY2tlZEludGVycnVwdGVkRXhjZXB0aW9uOworCitAU2hhcmVkCitwdWJsaWMgY2xhc3MgVHdvV2F5IGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZQoreworICAgIHByaXZhdGUgdm9sYXRpbGUgQ291bnREb3duTGF0Y2ggZmlyc3QgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgcHJpdmF0ZSBmaW5hbCBDb3VudERvd25MYXRjaCBzZWNvbmQgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICBwdWJsaWMgdm9pZCBhd2FpdEFuZEVudGVyKCkKKyAgICB7CisgICAgICAgIGF3YWl0KCk7CisgICAgICAgIGVudGVyKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXdhaXQoKQorICAgIHsKKyAgICAgICAgYXdhaXQoZmlyc3QpOworICAgICAgICBmaXJzdCA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW50ZXIoKQorICAgIHsKKyAgICAgICAgaWYgKGZpcnN0ICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpcnN0LmNvdW50RG93bigpOworICAgICAgICAgICAgYXdhaXQoc2Vjb25kKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlY29uZC5jb3VudERvd24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhd2FpdChDb3VudERvd25MYXRjaCBsYXRjaCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWxhdGNoLmF3YWl0KDEsIFRpbWVVbml0Lk1JTlVURVMpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmNoZWNrZWRUaW1lb3V0RXhjZXB0aW9uKCJUaW1lb3V0IHdhaXRpbmcgb24gIiArIChsYXRjaCA9PSBzZWNvbmQgPyAic2Vjb25kIiA6ICJmaXJzdCIpICsgIiBsYXRjaCIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5jaGVja2VkSW50ZXJydXB0ZWRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgeworICAgICAgICBpZiAoZmlyc3QgIT0gbnVsbCkKKyAgICAgICAgICAgIGZpcnN0LmNvdW50RG93bigpOworICAgICAgICBmaXJzdCA9IG51bGw7CisgICAgICAgIHNlY29uZC5jb3VudERvd24oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3V0aWwvYnl0ZXJld3JpdGUvU3RhdHVzQ2hhbmdlTGlzdGVuZXIuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXRpbC9ieXRlcmV3cml0ZS9TdGF0dXNDaGFuZ2VMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2Yjg3NzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3V0aWwvYnl0ZXJld3JpdGUvU3RhdHVzQ2hhbmdlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC51dGlsLmJ5dGVyZXdyaXRlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CisKK2ltcG9ydCBuZXQuYnl0ZWJ1ZGR5LkJ5dGVCdWRkeTsKK2ltcG9ydCBuZXQuYnl0ZWJ1ZGR5LmR5bmFtaWMuRHluYW1pY1R5cGU7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5keW5hbWljLmxvYWRpbmcuQ2xhc3NMb2FkaW5nU3RyYXRlZ3k7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5pbXBsZW1lbnRhdGlvbi5NZXRob2REZWxlZ2F0aW9uOworaW1wb3J0IG5ldC5ieXRlYnVkZHkuaW1wbGVtZW50YXRpb24uYmluZC5hbm5vdGF0aW9uLlN1cGVyQ2FsbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5pbXBsLkluc3RhbmNlSUREZWZpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnV0aWwuVHdvV2F5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2hhcmVkOworCitpbXBvcnQgc3RhdGljIG5ldC5ieXRlYnVkZHkubWF0Y2hlci5FbGVtZW50TWF0Y2hlcnMubmFtZWQ7CisKK3B1YmxpYyBjbGFzcyBTdGF0dXNDaGFuZ2VMaXN0ZW5lcgoreworICAgIHB1YmxpYyBlbnVtIFN0YXR1cworICAgIHsKKyAgICAgICAgTEVBVklORygic3RhcnRMZWF2aW5nIiksCisgICAgICAgIExFQVZFKCJsZWF2ZVJpbmciKTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtZXRob2Q7CisKKyAgICAgICAgU3RhdHVzKFN0cmluZyBtZXRob2QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGluc3RhbGwoQ2xhc3NMb2FkZXIgY2wsIGludCBub2RlLCBTdGF0dXMgZmlyc3QsIFN0YXR1cy4uLiByZXN0KQorICAgIHsKKyAgICAgICAgaW5zdGFsbChjbCwgbm9kZSwgRW51bVNldC5vZihmaXJzdCwgcmVzdCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnN0YWxsKENsYXNzTG9hZGVyIGNsLCBpbnQgbm9kZSwgU2V0PFN0YXR1cz4gc3RhdHVzZXMpCisgICAgeworICAgICAgICBpZiAoc3RhdHVzZXMuaXNFbXB0eSgpKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOZWVkIGEgc2V0IG9mIHN0YXR1cyB0byBsaXN0ZW4gdG8iKTsKKworICAgICAgICBTdGF0ZS5ob29rcy5wdXQobm9kZSwgbmV3IEhvb2tzKCkpOworICAgICAgICBEeW5hbWljVHlwZS5CdWlsZGVyPFN0b3JhZ2VTZXJ2aWNlPiBidWlsZGVyID0gbmV3IEJ5dGVCdWRkeSgpLnJlYmFzZShTdG9yYWdlU2VydmljZS5jbGFzcyk7CisgICAgICAgIGZvciAoU3RhdHVzIHMgOiBzdGF0dXNlcykKKyAgICAgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLm1ldGhvZChuYW1lZChzLm1ldGhvZCkpLmludGVyY2VwdChNZXRob2REZWxlZ2F0aW9uLnRvKEJCLmNsYXNzKSk7CisgICAgICAgIGJ1aWxkZXIubWFrZSgpLmxvYWQoY2wsIENsYXNzTG9hZGluZ1N0cmF0ZWd5LkRlZmF1bHQuSU5KRUNUSU9OKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoKQorICAgIHsKKyAgICAgICAgZm9yIChIb29rcyBob29rIDogU3RhdGUuaG9va3MudmFsdWVzKCkpCisgICAgICAgICAgICBob29rLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBIb29rcyBob29rcyhpbnQgbm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBPYmplY3RzLnJlcXVpcmVOb25OdWxsKFN0YXRlLmhvb2tzLmdldChub2RlKSwgIlVua25vd24gbm9kZSIgKyBub2RlKTsKKyAgICB9CisKKyAgICBAU2hhcmVkCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdGF0ZQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgSG9va3M+IGhvb2tzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKKyAgICB9CisKKyAgICBAU2hhcmVkCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIb29rcyBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHdvV2F5IGxlYXZpbmcgPSBuZXcgVHdvV2F5KCk7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHdvV2F5IGxlYXZlID0gbmV3IFR3b1dheSgpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoVHdvV2F5IGNvbmRpdGlvbjogQXJyYXlzLmFzTGlzdChsZWF2aW5nLCBsZWF2ZSkpCisgICAgICAgICAgICAgICAgY29uZGl0aW9uLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJCCisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBpbnQgTk9ERSA9IC0xOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydExlYXZpbmcoQFN1cGVyQ2FsbCBSdW5uYWJsZSB6dXBlcikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gc2VlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2Uuc3RhcnRMZWF2aW5nCisgICAgICAgICAgICBob29rcygpLmxlYXZpbmcuZW50ZXIoKTsKKyAgICAgICAgICAgIHp1cGVyLnJ1bigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGxlYXZlUmluZyhAU3VwZXJDYWxsIFJ1bm5hYmxlIHp1cGVyKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBzZWUgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZS5sZWF2ZVJpbmcKKyAgICAgICAgICAgIGhvb2tzKCkubGVhdmUuZW50ZXIoKTsKKyAgICAgICAgICAgIHp1cGVyLnJ1bigpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgSG9va3MgaG9va3MoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU3RhdGUuaG9va3MuZ2V0KG5vZGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgbm9kZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBub2RlID0gTk9ERTsKKyAgICAgICAgICAgIGlmIChub2RlID09IC0xKQorICAgICAgICAgICAgICAgIG5vZGUgPSBOT0RFID0gSW50ZWdlci5wYXJzZUludChJbnN0YW5jZUlERGVmaW5lci5nZXRJbnN0YW5jZUlkKCkucmVwbGFjZSgibm9kZSIsICIiKSk7CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXRpbC9ieXRlcmV3cml0ZS9VbmRlYWQuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXRpbC9ieXRlcmV3cml0ZS9VbmRlYWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjFkNjVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91dGlsL2J5dGVyZXdyaXRlL1VuZGVhZC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudXRpbC5ieXRlcmV3cml0ZTsKKworaW1wb3J0IG5ldC5ieXRlYnVkZHkuQnl0ZUJ1ZGR5OworaW1wb3J0IG5ldC5ieXRlYnVkZHkuZHluYW1pYy5sb2FkaW5nLkNsYXNzTG9hZGluZ1N0cmF0ZWd5OworaW1wb3J0IG5ldC5ieXRlYnVkZHkuaW1wbGVtZW50YXRpb24uTWV0aG9kRGVsZWdhdGlvbjsKK2ltcG9ydCBuZXQuYnl0ZWJ1ZGR5LmltcGxlbWVudGF0aW9uLmJpbmQuYW5ub3RhdGlvbi5TdXBlckNhbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZ21zLkVuZHBvaW50U3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2hhcmVkOworCitpbXBvcnQgc3RhdGljIG5ldC5ieXRlYnVkZHkubWF0Y2hlci5FbGVtZW50TWF0Y2hlcnMubmFtZWQ7CisKK3B1YmxpYyBjbGFzcyBVbmRlYWQKK3sKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zdGFsbChDbGFzc0xvYWRlciBjbCkKKyAgICB7CisgICAgICAgIG5ldyBCeXRlQnVkZHkoKS5yZWJhc2UoRW5kcG9pbnRTdGF0ZS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgLm1ldGhvZChuYW1lZCgibWFya0RlYWQiKSkuaW50ZXJjZXB0KE1ldGhvZERlbGVnYXRpb24udG8oQkIuY2xhc3MpKQorICAgICAgICAgICAgICAgICAgICAgICAubWFrZSgpCisgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKGNsLCBDbGFzc0xvYWRpbmdTdHJhdGVneS5EZWZhdWx0LklOSkVDVElPTik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlKCkKKyAgICB7CisgICAgICAgIFN0YXRlLmVuYWJsZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBAU2hhcmVkCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdGF0ZQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIGVuYWJsZWQgPSB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQkIKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYXJrRGVhZChAU3VwZXJDYWxsIFJ1bm5hYmxlIHJlYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChTdGF0ZS5lbmFibGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGRvbid0IGxldCBhbnl0aGluZyBnZXQgbWFya2VkIGRlYWQuLi4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWFsLnJ1bigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9Gb3J3YXJkaW5nU1NUYWJsZVJlYWRlci5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9Gb3J3YXJkaW5nU1NUYWJsZVJlYWRlci5qYXZhCmluZGV4IDkwMTJkY2MuLjkxZDQxZmUgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvRm9yd2FyZGluZ1NTVGFibGVSZWFkZXIuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L0ZvcndhcmRpbmdTU1RhYmxlUmVhZGVyLmphdmEKQEAgLTIzLDE2ICsyMywxNCBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlJhdGVMaW1pdGVyOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuSW5zdHJ1bWVudGluZ0NhY2hlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLktleUNhY2hlS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRhdGFSYW5nZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUGFydGl0aW9uUG9zaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93SW5kZXhFbnRyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbGljZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcjsKQEAgLTQzLDE5ICs0MSwyNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQ29tcHJlc3Npb25NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0Um93SW5kZXhFbnRyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU1NUYWJsZVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVZlcmlmaWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuS2V5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5LZXlSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLlN0YXRzTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5DaGFubmVsUHJveHk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5DaGVja2VkRnVuY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW50ZWdyaXR5TWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlRGF0YUlucHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlJlc3RvcmFibGVNZXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Fc3RpbWF0ZWRIaXN0b2dyYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSUZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PdXRwdXRIYW5kbGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuUmVmOwogCkBAIC02MywxNCArNjYsMjUgQEAKIHsKICAgICBwcml2YXRlIGZpbmFsIFNTVGFibGVSZWFkZXIgZGVsZWdhdGU7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCdWlsZGVyIGV4dGVuZHMgU1NUYWJsZVJlYWRlci5CdWlsZGVyPEZvcndhcmRpbmdTU1RhYmxlUmVhZGVyLCBCdWlsZGVyPgorICAgIHsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIoU1NUYWJsZVJlYWRlciBkZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZGVsZWdhdGUuZGVzY3JpcHRvcik7CisgICAgICAgICAgICBkZWxlZ2F0ZS51bmJ1aWxkVG8odGhpcywgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBGb3J3YXJkaW5nU1NUYWJsZVJlYWRlciBidWlsZEludGVybmFsKE93bmVyIG93bmVyKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBGb3J3YXJkaW5nU1NUYWJsZVJlYWRlcihTU1RhYmxlUmVhZGVyIGRlbGVnYXRlKQogICAgIHsKLSAgICAgICAgc3VwZXIoZGVsZWdhdGUuZGVzY3JpcHRvciwgU1NUYWJsZS5jb21wb25lbnRzRm9yKGRlbGVnYXRlLmRlc2NyaXB0b3IpLAotICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhUmVmLmZvck9mZmxpbmVUb29scyhkZWxlZ2F0ZS5tZXRhZGF0YSgpKSwgZGVsZWdhdGUubWF4RGF0YUFnZSwgZGVsZWdhdGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCksCi0gICAgICAgICAgICAgIGRlbGVnYXRlLm9wZW5SZWFzb24sIGRlbGVnYXRlLmhlYWRlciwgZGVsZWdhdGUuaW5kZXhTdW1tYXJ5LCBkZWxlZ2F0ZS5kZmlsZSwgZGVsZWdhdGUuaWZpbGUsIGRlbGVnYXRlLmJmKTsKKyAgICAgICAgc3VwZXIobmV3IEJ1aWxkZXIoZGVsZWdhdGUpLCBkZWxlZ2F0ZS5vd25lcigpLm9yRWxzZShudWxsKSk7CiAgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLSAgICAgICAgdGhpcy5maXJzdCA9IGRlbGVnYXRlLmZpcnN0OwotICAgICAgICB0aGlzLmxhc3QgPSBkZWxlZ2F0ZS5sYXN0OwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtOTIsMTIgKzEwNiwyNCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG1heUNvbnRhaW5Bc3N1bWluZ0tleUlzSW5SYW5nZShEZWNvcmF0ZWRLZXkga2V5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLm1heUNvbnRhaW5Bc3N1bWluZ0tleUlzSW5SYW5nZShrZXkpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldHVwT25saW5lKCkKICAgICB7CiAgICAgICAgIGRlbGVnYXRlLnNldHVwT25saW5lKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBFIGV4dGVuZHMgRXhjZXB0aW9uPiBSIHJ1bldpdGhMb2NrKENoZWNrZWRGdW5jdGlvbjxEZXNjcmlwdG9yLCBSLCBFPiB0YXNrKSB0aHJvd3MgRQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnJ1bldpdGhMb2NrKHRhc2spOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFJlcGxhY2VkKCkKICAgICB7CiAgICAgICAgIGRlbGVnYXRlLnNldFJlcGxhY2VkKCk7CkBAIC0xMjIsMTUgKzE0OCw5IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNTVGFibGVSZWFkZXIgY2xvbmVXaXRoTmV3U3RhcnQoRGVjb3JhdGVkS2V5IG5ld1N0YXJ0LCBSdW5uYWJsZSBydW5PbkNsb3NlKQorICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyIGNsb25lV2l0aE5ld1N0YXJ0KERlY29yYXRlZEtleSBuZXdTdGFydCkKICAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5jbG9uZVdpdGhOZXdTdGFydChuZXdTdGFydCwgcnVuT25DbG9zZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNTVGFibGVSZWFkZXIgY2xvbmVXaXRoTmV3U3VtbWFyeVNhbXBsaW5nTGV2ZWwoQ29sdW1uRmFtaWx5U3RvcmUgcGFyZW50LCBpbnQgc2FtcGxpbmdMZXZlbCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuY2xvbmVXaXRoTmV3U3VtbWFyeVNhbXBsaW5nTGV2ZWwocGFyZW50LCBzYW1wbGluZ0xldmVsKTsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmNsb25lV2l0aE5ld1N0YXJ0KG5ld1N0YXJ0KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE0MCwzOSArMTYwLDIxIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlSW5NZW1vcnlDb21wb25lbnRzKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCk7CisgICAgICAgIGRlbGVnYXRlLnJlbGVhc2VJbk1lbW9yeUNvbXBvbmVudHMoKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRJbmRleFN1bW1hcnlPZmZIZWFwU2l6ZSgpCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEluZGV4U3VtbWFyeU9mZkhlYXBTaXplKCk7CisgICAgICAgIGRlbGVnYXRlLnZhbGlkYXRlKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRNaW5JbmRleEludGVydmFsKCkKKyAgICBwcm90ZWN0ZWQgdm9pZCBjbG9zZUludGVybmFsQ29tcG9uZW50KEF1dG9DbG9zZWFibGUgY2xvc2VhYmxlKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldE1pbkluZGV4SW50ZXJ2YWwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZG91YmxlIGdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlU3VtbWFyeSgpCi0gICAgewotICAgICAgICBkZWxlZ2F0ZS5yZWxlYXNlU3VtbWFyeSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldEluZGV4U2NhblBvc2l0aW9uKFBhcnRpdGlvblBvc2l0aW9uIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRJbmRleFNjYW5Qb3NpdGlvbihrZXkpOworICAgICAgICBkZWxlZ2F0ZS5jbG9zZUludGVybmFsQ29tcG9uZW50KGNsb3NlYWJsZSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xODgsMjQgKzE5MCw2IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElGaWx0ZXIgZ2V0Qmxvb21GaWx0ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEJsb29tRmlsdGVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0Qmxvb21GaWx0ZXJTZXJpYWxpemVkU2l6ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0Qmxvb21GaWx0ZXJTZXJpYWxpemVkU2l6ZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldEJsb29tRmlsdGVyT2ZmSGVhcFNpemUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEJsb29tRmlsdGVyT2ZmSGVhcFNpemUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgbG9uZyBlc3RpbWF0ZWRLZXlzKCkKICAgICB7CiAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5lc3RpbWF0ZWRLZXlzKCk7CkBAIC0yMTgsMjQgKzIwMiw2IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRJbmRleFN1bW1hcnlTaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRJbmRleFN1bW1hcnlTaXplKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRNYXhJbmRleFN1bW1hcnlTaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRNYXhJbmRleFN1bW1hcnlTaXplKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJ5dGVbXSBnZXRJbmRleFN1bW1hcnlLZXkoaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEluZGV4U3VtbWFyeUtleShpbmRleCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEl0ZXJhYmxlPERlY29yYXRlZEtleT4gZ2V0S2V5U2FtcGxlcyhSYW5nZTxUb2tlbj4gcmFuZ2UpCiAgICAgewogICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0S2V5U2FtcGxlcyhyYW5nZSk7CkBAIC0yNDgsMzkgKzIxNCwxNSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBLZXlDYWNoZUtleSBnZXRDYWNoZUtleShEZWNvcmF0ZWRLZXkga2V5KQorICAgIHByb3RlY3RlZCBsb25nIGdldFBvc2l0aW9uKFBhcnRpdGlvblBvc2l0aW9uIGtleSwgT3BlcmF0b3Igb3AsIGJvb2xlYW4gdXBkYXRlU3RhdHMsIFNTVGFibGVSZWFkc0xpc3RlbmVyIGxpc3RlbmVyKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldENhY2hlS2V5KGtleSk7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRQb3NpdGlvbihrZXksIG9wLCB1cGRhdGVTdGF0cywgbGlzdGVuZXIpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNhY2hlS2V5KERlY29yYXRlZEtleSBrZXksIFJvd0luZGV4RW50cnkgaW5mbykKKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSb3dJbmRleEVudHJ5IGdldFJvd0luZGV4RW50cnkoUGFydGl0aW9uUG9zaXRpb24ga2V5LCBPcGVyYXRvciBvcCwgYm9vbGVhbiB1cGRhdGVDYWNoZUFuZFN0YXRzLCBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcikKICAgICB7Ci0gICAgICAgIGRlbGVnYXRlLmNhY2hlS2V5KGtleSwgaW5mbyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJvd0luZGV4RW50cnkgZ2V0Q2FjaGVkUG9zaXRpb24oRGVjb3JhdGVkS2V5IGtleSwgYm9vbGVhbiB1cGRhdGVTdGF0cykKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRDYWNoZWRQb3NpdGlvbihrZXksIHVwZGF0ZVN0YXRzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgUm93SW5kZXhFbnRyeSBnZXRDYWNoZWRQb3NpdGlvbihLZXlDYWNoZUtleSB1bmlmaWVkS2V5LCBib29sZWFuIHVwZGF0ZVN0YXRzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldENhY2hlZFBvc2l0aW9uKHVuaWZpZWRLZXksIHVwZGF0ZVN0YXRzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0tleUNhY2hlRW5hYmxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuaXNLZXlDYWNoZUVuYWJsZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgUm93SW5kZXhFbnRyeSBnZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbiBrZXksIE9wZXJhdG9yIG9wLCBib29sZWFuIHVwZGF0ZUNhY2hlQW5kU3RhdHMsIGJvb2xlYW4gcGVybWl0TWF0Y2hQYXN0TGFzdCwgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0UG9zaXRpb24oa2V5LCBvcCwgdXBkYXRlQ2FjaGVBbmRTdGF0cywgcGVybWl0TWF0Y2hQYXN0TGFzdCwgbGlzdGVuZXIpOworICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0Um93SW5kZXhFbnRyeShrZXksIG9wLCB1cGRhdGVDYWNoZUFuZFN0YXRzLCBsaXN0ZW5lcik7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0yOTAsMTUgKzIzMiwyMSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3Igcm93SXRlcmF0b3IoRmlsZURhdGFJbnB1dCBmaWxlLCBEZWNvcmF0ZWRLZXkga2V5LCBSb3dJbmRleEVudHJ5IGluZGV4RW50cnksIFNsaWNlcyBzbGljZXMsIENvbHVtbkZpbHRlciBzZWxlY3RlZENvbHVtbnMsIGJvb2xlYW4gcmV2ZXJzZWQpCisgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBzaW1wbGVJdGVyYXRvcihGaWxlRGF0YUlucHV0IGZpbGUsIERlY29yYXRlZEtleSBrZXksIGxvbmcgZGF0YVBvc2l0aW9uLCBib29sZWFuIHRvbWJzdG9uZU9ubHkpCiAgICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUucm93SXRlcmF0b3IoZmlsZSwga2V5LCBpbmRleEVudHJ5LCBzbGljZXMsIHNlbGVjdGVkQ29sdW1ucywgcmV2ZXJzZWQpOworICAgICAgICByZXR1cm4gZGVsZWdhdGUuc2ltcGxlSXRlcmF0b3IoZmlsZSwga2V5LCBkYXRhUG9zaXRpb24sIHRvbWJzdG9uZU9ubHkpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3Igc2ltcGxlSXRlcmF0b3IoRmlsZURhdGFJbnB1dCBmaWxlLCBEZWNvcmF0ZWRLZXkga2V5LCBSb3dJbmRleEVudHJ5IGluZGV4RW50cnksIGJvb2xlYW4gdG9tYnN0b25lT25seSkKKyAgICBwdWJsaWMgS2V5UmVhZGVyIGtleVJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnNpbXBsZUl0ZXJhdG9yKGZpbGUsIGtleSwgaW5kZXhFbnRyeSwgdG9tYnN0b25lT25seSk7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5rZXlSZWFkZXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgS2V5SXRlcmF0b3Iga2V5SXRlcmF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5rZXlJdGVyYXRvcigpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMzk4LDkgKzM0Niw5IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gbmV3U2luY2UobG9uZyBhZ2UpCisgICAgcHVibGljIGJvb2xlYW4gbmV3U2luY2UobG9uZyB0aW1lc3RhbXBNaWxsaXMpCiAgICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUubmV3U2luY2UoYWdlKTsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLm5ld1NpbmNlKHRpbWVzdGFtcE1pbGxpcyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC00MTAsMTUgKzM1OCwyMSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUxpbmtzKFN0cmluZyBzbmFwc2hvdERpcmVjdG9yeVBhdGgsIFJhdGVMaW1pdGVyIHJhdGVMaW1pdGVyKQorICAgIHsKKyAgICAgICAgZGVsZWdhdGUuY3JlYXRlTGlua3Moc25hcHNob3REaXJlY3RvcnlQYXRoLCByYXRlTGltaXRlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNSZXBhaXJlZCgpCiAgICAgewogICAgICAgICByZXR1cm4gZGVsZWdhdGUuaXNSZXBhaXJlZCgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBEZWNvcmF0ZWRLZXkga2V5QXQobG9uZyBpbmRleFBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICBwdWJsaWMgRGVjb3JhdGVkS2V5IGtleUF0UG9zaXRpb25Gcm9tU2Vjb25kYXJ5SW5kZXgobG9uZyBrZXlQb3NpdGlvbkZyb21TZWNvbmRhcnlJbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUua2V5QXQoaW5kZXhQb3NpdGlvbik7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5rZXlBdFBvc2l0aW9uRnJvbVNlY29uZGFyeUluZGV4KGtleVBvc2l0aW9uRnJvbVNlY29uZGFyeUluZGV4KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTQ1MiwzNiArNDA2LDYgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRCbG9vbUZpbHRlckZhbHNlUG9zaXRpdmVDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0Qmxvb21GaWx0ZXJGYWxzZVBvc2l0aXZlQ291bnQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRSZWNlbnRCbG9vbUZpbHRlckZhbHNlUG9zaXRpdmVDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0UmVjZW50Qmxvb21GaWx0ZXJGYWxzZVBvc2l0aXZlQ291bnQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRCbG9vbUZpbHRlclRydWVQb3NpdGl2ZUNvdW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRCbG9vbUZpbHRlclRydWVQb3NpdGl2ZUNvdW50KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0UmVjZW50Qmxvb21GaWx0ZXJUcnVlUG9zaXRpdmVDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0UmVjZW50Qmxvb21GaWx0ZXJUcnVlUG9zaXRpdmVDb3VudCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJbnN0cnVtZW50aW5nQ2FjaGU8S2V5Q2FjaGVLZXksIFJvd0luZGV4RW50cnk+IGdldEtleUNhY2hlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRLZXlDYWNoZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBFc3RpbWF0ZWRIaXN0b2dyYW0gZ2V0RXN0aW1hdGVkUGFydGl0aW9uU2l6ZSgpCiAgICAgewogICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0RXN0aW1hdGVkUGFydGl0aW9uU2l6ZSgpOwpAQCAtNTc4LDYgKzUwMiwxOCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG11dGF0ZUxldmVsQW5kUmVsb2FkKGludCBuZXdMZXZlbCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBkZWxlZ2F0ZS5tdXRhdGVMZXZlbEFuZFJlbG9hZChuZXdMZXZlbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbXV0YXRlUmVwYWlyZWRBbmRSZWxvYWQobG9uZyBuZXdSZXBhaXJlZEF0LCBUaW1lVVVJRCBuZXdQZW5kaW5nUmVwYWlyLCBib29sZWFuIGlzVHJhbnNpZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRlbGVnYXRlLm11dGF0ZVJlcGFpcmVkQW5kUmVsb2FkKG5ld1JlcGFpcmVkQXQsIG5ld1BlbmRpbmdSZXBhaXIsIGlzVHJhbnNpZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZWxvYWRTU1RhYmxlTWV0YWRhdGEoKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIGRlbGVnYXRlLnJlbG9hZFNTVGFibGVNZXRhZGF0YSgpOwpAQCAtNjAyLDkgKzUzOCw5IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJhbmRvbUFjY2Vzc1JlYWRlciBvcGVuSW5kZXhSZWFkZXIoKQorICAgIHB1YmxpYyB2b2lkIHRyeVNraXBGaWxlQ2FjaGVCZWZvcmUoRGVjb3JhdGVkS2V5IGtleSkKICAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5vcGVuSW5kZXhSZWFkZXIoKTsKKyAgICAgICAgZGVsZWdhdGUudHJ5U2tpcEZpbGVDYWNoZUJlZm9yZShrZXkpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNjE0LDMzICs1NTAsOSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDaGFubmVsUHJveHkgZ2V0SW5kZXhDaGFubmVsKCkKKyAgICBwdWJsaWMgbG9uZyBnZXREYXRhQ3JlYXRpb25UaW1lKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRJbmRleENoYW5uZWwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRmlsZUhhbmRsZSBnZXRJbmRleEZpbGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEluZGV4RmlsZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldENyZWF0aW9uVGltZUZvcihDb21wb25lbnQgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldENyZWF0aW9uVGltZUZvcihjb21wb25lbnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldEtleUNhY2hlSGl0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRLZXlDYWNoZUhpdCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldEtleUNhY2hlUmVxdWVzdCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0S2V5Q2FjaGVSZXF1ZXN0KCk7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXREYXRhQ3JlYXRpb25UaW1lKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC02NzQsNyArNTg2LDEzIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgdm9pZCBzZXR1cChib29sZWFuIHRyYWNrSG90bmVzcykKKyAgICBwcm90ZWN0ZWQgTGlzdDxBdXRvQ2xvc2VhYmxlPiBzZXR1cEluc3RhbmNlKGJvb2xlYW4gdHJhY2tIb3RuZXNzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnNldHVwSW5zdGFuY2UodHJhY2tIb3RuZXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cChib29sZWFuIHRyYWNrSG90bmVzcykKICAgICB7CiAgICAgICAgIGRlbGVnYXRlLnNldHVwKHRyYWNrSG90bmVzcyk7CiAgICAgfQpAQCAtNzEwLDEyICs2MjgsNiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5kZXhGaWxlbmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0SW5kZXhGaWxlbmFtZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uRmFtaWx5TmFtZSgpCiAgICAgewogICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0Q29sdW1uRmFtaWx5TmFtZSgpOwpAQCAtNzQwLDYgKzY1MiwzMCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGxvZ2ljYWxCeXRlc09uRGlzaygpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUubG9naWNhbEJ5dGVzT25EaXNrKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDb21wb25lbnQ+IGdldENvbXBvbmVudHMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldENvbXBvbmVudHMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHJvd0l0ZXJhdG9yKERlY29yYXRlZEtleSBrZXkpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUucm93SXRlcmF0b3Ioa2V5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBtYXliZVBlcnNpc3RTU1RhYmxlUmVhZE1ldGVyKCkKKyAgICB7CisgICAgICAgIGRlbGVnYXRlLm1heWJlUGVyc2lzdFNTVGFibGVSZWFkTWV0ZXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKICAgICB7CiAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS50b1N0cmluZygpOwpAQCAtNzU2LDQgKzY5Miw0MCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEJvdW5kcygpOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJVmVyaWZpZXIgZ2V0VmVyaWZpZXIoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBPdXRwdXRIYW5kbGVyIG91dHB1dEhhbmRsZXIsIGJvb2xlYW4gaXNPZmZsaW5lLCBJVmVyaWZpZXIuT3B0aW9ucyBvcHRpb25zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFZlcmlmaWVyKGNmcywgb3V0cHV0SGFuZGxlciwgaXNPZmZsaW5lLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlTZWxlY3RlZChTU1RhYmxlUmVhZHNMaXN0ZW5lci5TZWxlY3Rpb25SZWFzb24gcmVhc29uLCBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsb2NhbExpc3RlbmVyLCBPcGVyYXRvciBvcCwgYm9vbGVhbiB1cGRhdGVTdGF0cywgQWJzdHJhY3RSb3dJbmRleEVudHJ5IGVudHJ5KQorICAgIHsKKyAgICAgICAgZGVsZWdhdGUubm90aWZ5U2VsZWN0ZWQocmVhc29uLCBsb2NhbExpc3RlbmVyLCBvcCwgdXBkYXRlU3RhdHMsIGVudHJ5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlTa2lwcGVkKFNTVGFibGVSZWFkc0xpc3RlbmVyLlNraXBwaW5nUmVhc29uIHJlYXNvbiwgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbG9jYWxMaXN0ZW5lciwgT3BlcmF0b3Igb3AsIGJvb2xlYW4gdXBkYXRlU3RhdHMpCisgICAgeworICAgICAgICBkZWxlZ2F0ZS5ub3RpZnlTa2lwcGVkKHJlYXNvbiwgbG9jYWxMaXN0ZW5lciwgb3AsIHVwZGF0ZVN0YXRzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VzdGltYXRpb25JbmZvcm1hdGl2ZSgpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUuaXNFc3RpbWF0aW9uSW5mb3JtYXRpdmUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRGF0YUludGVncml0eU1ldGFkYXRhLkNoZWNrc3VtVmFsaWRhdG9yIG1heWJlR2V0Q2hlY2tzdW1WYWxpZGF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5tYXliZUdldENoZWNrc3VtVmFsaWRhdG9yKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIERhdGFJbnRlZ3JpdHlNZXRhZGF0YS5GaWxlRGlnZXN0VmFsaWRhdG9yIG1heWJlR2V0RGlnZXN0VmFsaWRhdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUubWF5YmVHZXREaWdlc3RWYWxpZGF0b3IoKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L2xvbmcvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Mb25nTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneUNRTFRlc3QuamF2YSBiL3Rlc3QvbG9uZy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0xvbmdMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5Q1FMVGVzdC5qYXZhCmluZGV4IDFkZjdlN2MuLmFkMThkOWYgMTAwNjQ0Ci0tLSBhL3Rlc3QvbG9uZy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0xvbmdMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5Q1FMVGVzdC5qYXZhCisrKyBiL3Rlc3QvbG9uZy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0xvbmdMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5Q1FMVGVzdC5qYXZhCkBAIC0yOSwxMyArMjksMTMgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuVW5pbnRlcnJ1cHRpYmxlczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkhleDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfU1RSSUNUX0xDU19DSEVDS1M7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpczsKIAogcHVibGljIGNsYXNzIExvbmdMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5Q1FMVGVzdCBleHRlbmRzIENRTFRlc3RlcgpAQCAtNDQsNyArNDQsNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgc3RyZXNzVGVzdENvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAidGVzdC5zdHJpY3RfbGNzX2NoZWNrcyIsICJ0cnVlIik7CisgICAgICAgIFRFU1RfU1RSSUNUX0xDU19DSEVDS1Muc2V0Qm9vbGVhbih0cnVlKTsKICAgICAgICAgLy8gZmx1c2gvY29tcGFjdCB0b25zIG9mIHNzdGFibGVzLCBpbnZhbGlkYXRlIHRva2VuIG1ldGFkYXRhIGluIGEgbG9vcCB0byBtYWtlIENTTSByZWxvYWQgdGhlIHN0cmF0ZWdpZXMKICAgICAgICAgY3JlYXRlVGFibGUoImNyZWF0ZSB0YWJsZSAlcyAoaWQgaW50IHByaW1hcnkga2V5LCBpIHRleHQpIHdpdGggY29tcGFjdGlvbiA9IHsnY2xhc3MnOidMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5JywgJ3NzdGFibGVfc2l6ZV9pbl9tYic6MX0iKTsKICAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGVzID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7CmRpZmYgLS1naXQgYS90ZXN0L2xvbmcvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Mb25nTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneVRlc3QuamF2YSBiL3Rlc3QvbG9uZy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0xvbmdMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5VGVzdC5qYXZhCmluZGV4IDczM2U0NmYuLmE3ODBjZjEgMTAwNjQ0Ci0tLSBhL3Rlc3QvbG9uZy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0xvbmdMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5VGVzdC5qYXZhCisrKyBiL3Rlc3QvbG9uZy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0xvbmdMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5VGVzdC5qYXZhCkBAIC0xOTgsOSArMTk4LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0sIHRydWUsIHRydWUpOwotCi0KKyAgICAgICAgfSwgT3BlcmF0aW9uVHlwZS5DT01QQUNUSU9OLCB0cnVlLCB0cnVlKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvdGVzdC9sb25nL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0hlYXBVdGlsc1Rlc3QuamF2YSBiL3Rlc3QvbG9uZy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9IZWFwVXRpbHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjOTFjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbG9uZy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9IZWFwVXRpbHNUZXN0LmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlsczsKKworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBIZWFwVXRpbHNUZXN0Cit7CisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkKKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkRHVtcEhlYXBXaXRoUGF0aEFyZ1NwZWNpZmllZCgpCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0RHVtcEhlYXBPblVuY2F1Z2h0RXhjZXB0aW9uKHRydWUpOworICAgICAgICBTdHJpbmcgcGF0aCA9IEhlYXBVdGlscy5tYXliZUNyZWF0ZUhlYXBEdW1wKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocGF0aCk7CisgICAgICAgIGFzc2VydFRydWUoUGF0aHMuZ2V0KHBhdGgpLnRvRmlsZSgpLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoRGF0YWJhc2VEZXNjcmlwdG9yLmdldER1bXBIZWFwT25VbmNhdWdodEV4Y2VwdGlvbigpKTsKKworICAgICAgICAvLyBBZnRlciB0aGUgZmlyc3QgZHVtcCwgc3Vic2VxdWVudCByZXF1ZXN0cyBzaG91bGQgYmUgbm8tb3BzLi4uCisgICAgICAgIHBhdGggPSBIZWFwVXRpbHMubWF5YmVDcmVhdGVIZWFwRHVtcCgpOworICAgICAgICBhc3NlcnROdWxsKHBhdGgpOworCisgICAgICAgIC8vIC4uLnVudGlsIGNyZWF0aW9uIGlzIG1hbnVhbGx5IHJlLWVuYWJsZWQuCisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXREdW1wSGVhcE9uVW5jYXVnaHRFeGNlcHRpb24odHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUoRGF0YWJhc2VEZXNjcmlwdG9yLmdldER1bXBIZWFwT25VbmNhdWdodEV4Y2VwdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0SGVhcER1bXBQYXRoKCkpOworICAgICAgICBwYXRoID0gSGVhcFV0aWxzLm1heWJlQ3JlYXRlSGVhcER1bXAoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXRoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQYXRocy5nZXQocGF0aCkudG9GaWxlKCkuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRGYWxzZShEYXRhYmFzZURlc2NyaXB0b3IuZ2V0RHVtcEhlYXBPblVuY2F1Z2h0RXhjZXB0aW9uKCkpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L21lbW9yeS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25BbGxvY2F0aW9uVGVzdC5qYXZhIGIvdGVzdC9tZW1vcnkvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uQWxsb2NhdGlvblRlc3QuamF2YQppbmRleCA0ZDY1MmI3Li5lMmE0ZWRlIDEwMDY0NAotLS0gYS90ZXN0L21lbW9yeS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25BbGxvY2F0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3QvbWVtb3J5L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbkFsbG9jYXRpb25UZXN0LmphdmEKQEAgLTM5Myw3ICszOTMsNyBAQAogICAgICAgICBNZWFzdXJlbWVudCBtZWFzdXJlbWVudCA9IGNyZWF0ZU1lYXN1cmVtZW50KCk7CiAgICAgICAgIG1lYXN1cmVtZW50LnN0YXJ0KCk7CiAgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1BbGxvYzsgaSsrKQotICAgICAgICAgICAgbmV3IEludGVnZXIoaSk7CisgICAgICAgICAgICBJbnRlZ2VyLnZhbHVlT2YoaSk7CiAKICAgICAgICAgbWVhc3VyZW1lbnQuc3RvcCgpOwogICAgICAgICBsb2dnZXIuaW5mbygiICoqIHt9IiwgbWVhc3VyZW1lbnQucHJldHR5Qnl0ZXMoKSk7CmRpZmYgLS1naXQgYS90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL0Fic3RyYWN0VHlwZUJ5dGVTb3VyY2VEZWNvZGluZ0JlbmNoLmphdmEgYi90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL0Fic3RyYWN0VHlwZUJ5dGVTb3VyY2VEZWNvZGluZ0JlbmNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ5NjE3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvQWJzdHJhY3RUeXBlQnl0ZVNvdXJjZURlY29kaW5nQmVuY2guamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS50ZXN0Lm1pY3JvYmVuY2g7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpRnVuY3Rpb247CisKK2ltcG9ydCBuZXQubmljb3VsYWouY29tcGlsZWNvbW1hbmQuYW5ub3RhdGlvbnMuSW5saW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZXNUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuRGVjaW1hbFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnRlZ2VyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlR5cGVQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5CZW5jaG1hcms7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLkJlbmNobWFya01vZGU7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLkZvcms7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLkxldmVsOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuTW9kZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuT3V0cHV0VGltZVVuaXQ7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlBhcmFtOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5TY29wZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuU2V0dXA7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlN0YXRlOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5UaHJlYWRzOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5XYXJtdXA7CisKK0BCZW5jaG1hcmtNb2RlKE1vZGUuQXZlcmFnZVRpbWUpCitAT3V0cHV0VGltZVVuaXQoVGltZVVuaXQuTUlDUk9TRUNPTkRTKQorQFdhcm11cChpdGVyYXRpb25zID0gNSwgdGltZSA9IDEpCitATWVhc3VyZW1lbnQoaXRlcmF0aW9ucyA9IDUsIHRpbWUgPSAyKQorQEZvcmsodmFsdWUgPSAxLGp2bUFyZ3NBcHBlbmQgPSB7ICItWG14NEciLCAiLVhtczRHIiwgIi1Eam1oLmV4ZWN1dG9yPUNVU1RPTSIsICItRGptaC5leGVjdXRvci5jbGFzcz1vcmcuYXBhY2hlLmNhc3NhbmRyYS50ZXN0Lm1pY3JvYmVuY2guRmFzdFRocmVhZEV4ZWN1dG9yIn0pCitAVGhyZWFkcygxKQorQFN0YXRlKFNjb3BlLkJlbmNobWFyaykKK3B1YmxpYyBjbGFzcyBBYnN0cmFjdFR5cGVCeXRlU291cmNlRGVjb2RpbmdCZW5jaAoreworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiBMQVRFU1QgPSBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEFic3RyYWN0VHlwZSwgQmlGdW5jdGlvbjxSYW5kb20sIEludGVnZXIsIEJ5dGVTb3VyY2UuUGVla2FibGU+PiBQRUVLQUJMRV9HRU5FUkFUT1JfQllfVFlQRSA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICBzdGF0aWMKKyAgICB7CisgICAgICAgIFBFRUtBQkxFX0dFTkVSQVRPUl9CWV9UWVBFLnB1dChVVEY4VHlwZS5pbnN0YW5jZSwgKHBybmcsIGxlbmd0aCkgLT4KKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIHJhbmRvbUJ5dGVzID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgICAgIHBybmcubmV4dEJ5dGVzKHJhbmRvbUJ5dGVzKTsKKyAgICAgICAgICAgIHJldHVybiBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uub2YobmV3IFN0cmluZyhyYW5kb21CeXRlcywgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCksIExBVEVTVCkpOworICAgICAgICB9KTsKKyAgICAgICAgUEVFS0FCTEVfR0VORVJBVE9SX0JZX1RZUEUucHV0KEJ5dGVzVHlwZS5pbnN0YW5jZSwgKHBybmcsIGxlbmd0aCkgLT4KKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIHJhbmRvbUJ5dGVzID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgICAgIHBybmcubmV4dEJ5dGVzKHJhbmRvbUJ5dGVzKTsKKyAgICAgICAgICAgIHJldHVybiBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uub2YocmFuZG9tQnl0ZXMsIExBVEVTVCkpOworICAgICAgICB9KTsKKyAgICAgICAgUEVFS0FCTEVfR0VORVJBVE9SX0JZX1RZUEUucHV0KEludGVnZXJUeXBlLmluc3RhbmNlLCAocHJuZywgbGVuZ3RoKSAtPgorICAgICAgICB7CisgICAgICAgICAgICBCaWdJbnRlZ2VyIHJhbmRvbVZhcmludCA9IEJpZ0ludGVnZXIudmFsdWVPZihwcm5nLm5leHRMb25nKCkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsZW5ndGggLyA4OyArK2kpCisgICAgICAgICAgICAgICAgcmFuZG9tVmFyaW50ID0gcmFuZG9tVmFyaW50Lm11bHRpcGx5KEJpZ0ludGVnZXIudmFsdWVPZihwcm5nLm5leHRMb25nKCkpKTsKKyAgICAgICAgICAgIHJldHVybiBCeXRlU291cmNlLnBlZWthYmxlKEludGVnZXJUeXBlLmluc3RhbmNlLmFzQ29tcGFyYWJsZUJ5dGVzKEludGVnZXJUeXBlLmluc3RhbmNlLmRlY29tcG9zZShyYW5kb21WYXJpbnQpLCBMQVRFU1QpKTsKKyAgICAgICAgfSk7CisgICAgICAgIFBFRUtBQkxFX0dFTkVSQVRPUl9CWV9UWVBFLnB1dChEZWNpbWFsVHlwZS5pbnN0YW5jZSwgKHBybmcsIGxlbmd0aCkgLT4KKyAgICAgICAgeworICAgICAgICAgICAgQmlnSW50ZWdlciByYW5kb21NYW50aXNzYSA9IEJpZ0ludGVnZXIudmFsdWVPZihwcm5nLm5leHRMb25nKCkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsZW5ndGggLyA4OyArK2kpCisgICAgICAgICAgICAgICAgcmFuZG9tTWFudGlzc2EgPSByYW5kb21NYW50aXNzYS5tdWx0aXBseShCaWdJbnRlZ2VyLnZhbHVlT2YocHJuZy5uZXh0TG9uZygpKSk7CisgICAgICAgICAgICBpbnQgcmFuZG9tU2NhbGUgPSBwcm5nLm5leHRJbnQoSW50ZWdlci5NQVhfVkFMVUUgPj4gMSkgKyBJbnRlZ2VyLk1BWF9WQUxVRSA+PiAxOworICAgICAgICAgICAgQmlnRGVjaW1hbCByYW5kb21EZWNpbWFsID0gbmV3IEJpZ0RlY2ltYWwocmFuZG9tTWFudGlzc2EsIHJhbmRvbVNjYWxlKTsKKyAgICAgICAgICAgIHJldHVybiBCeXRlU291cmNlLnBlZWthYmxlKERlY2ltYWxUeXBlLmluc3RhbmNlLmFzQ29tcGFyYWJsZUJ5dGVzKERlY2ltYWxUeXBlLmluc3RhbmNlLmRlY29tcG9zZShyYW5kb21EZWNpbWFsKSwgTEFURVNUKSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgUmFuZG9tIHBybmcgPSBuZXcgUmFuZG9tKCk7CisKKyAgICBAUGFyYW0oeyIzMiIsICIxMjgiLCAiNTEyIn0pCisgICAgcHJpdmF0ZSBpbnQgbGVuZ3RoOworCisgICAgQFBhcmFtKHsiVVRGOFR5cGUiLCAiQnl0ZXNUeXBlIiwgIkludGVnZXJUeXBlIiwgIkRlY2ltYWxUeXBlIn0pCisgICAgcHJpdmF0ZSBTdHJpbmcgYWJzdHJhY3RUeXBlTmFtZTsKKworICAgIHByaXZhdGUgQWJzdHJhY3RUeXBlIGFic3RyYWN0VHlwZTsKKyAgICBwcml2YXRlIEJpRnVuY3Rpb248UmFuZG9tLCBJbnRlZ2VyLCBCeXRlU291cmNlLlBlZWthYmxlPiBwZWVrYWJsZUdlbmVyYXRvcjsKKworICAgIEBTZXR1cChMZXZlbC5UcmlhbCkKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpCisgICAgeworICAgICAgICBhYnN0cmFjdFR5cGUgPSBUeXBlUGFyc2VyLnBhcnNlKGFic3RyYWN0VHlwZU5hbWUpOworICAgICAgICBwZWVrYWJsZUdlbmVyYXRvciA9IFBFRUtBQkxFX0dFTkVSQVRPUl9CWV9UWVBFLmdldChhYnN0cmFjdFR5cGUpOworICAgIH0KKworICAgIEBJbmxpbmUKKyAgICBwcml2YXRlIEJ5dGVTb3VyY2UuUGVla2FibGUgcmFuZG9tUGVla2FibGVCeXRlcygpCisgICAgeworICAgICAgICByZXR1cm4gcGVla2FibGVHZW5lcmF0b3IuYXBwbHkocHJuZywgbGVuZ3RoKTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIGludCBiYXNlbGluZSgpCisgICAgeworICAgICAgICAvLyBHZXR0aW5nIHRoZSBzb3VyY2UgaXMgbm90IGVub3VnaCBhcyBpdHMgY29udGVudCBpcyBwcm9kdWNlZCBvbiBuZXh0KCkgY2FsbHMuCisgICAgICAgIEJ5dGVTb3VyY2UuUGVla2FibGUgc291cmNlID0gcmFuZG9tUGVla2FibGVCeXRlcygpOworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICB3aGlsZSAoc291cmNlLm5leHQoKSAhPSBCeXRlU291cmNlLkVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICArK2NvdW50OworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgQEJlbmNobWFyaworICAgIHB1YmxpYyBCeXRlQnVmZmVyIGZyb21Db21wYXJhYmxlQnl0ZXMoKQorICAgIHsKKyAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSBwZWVrYWJsZUJ5dGVzID0gcmFuZG9tUGVla2FibGVCeXRlcygpOworICAgICAgICByZXR1cm4gYWJzdHJhY3RUeXBlLmZyb21Db21wYXJhYmxlQnl0ZXMocGVla2FibGVCeXRlcywgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5PU1M1MCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9CbG9vbUZpbHRlclNlcmlhbGl6ZXJCZW5jaC5qYXZhIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9CbG9vbUZpbHRlclNlcmlhbGl6ZXJCZW5jaC5qYXZhCmluZGV4IDMyZTA0OGQuLmIwMzM3MmUgMTAwNjQ0Ci0tLSBhL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvQmxvb21GaWx0ZXJTZXJpYWxpemVyQmVuY2guamF2YQorKysgYi90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL0Jsb29tRmlsdGVyU2VyaWFsaXplckJlbmNoLmphdmEKQEAgLTE4LDcgKzE4LDYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS50ZXN0Lm1pY3JvYmVuY2g7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRTdHJlYW1QbHVzOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKQEAgLTUzLDcgKzUyLDYgQEAKIEBTdGF0ZShTY29wZS5CZW5jaG1hcmspCiBwdWJsaWMgY2xhc3MgQmxvb21GaWx0ZXJTZXJpYWxpemVyQmVuY2gKIHsKLQogICAgIEBQYXJhbSh7IjEiLCAiMTAiLCAiMTAwIiwgIjEwMjQifSkKICAgICBwcml2YXRlIGxvbmcgbnVtRWxlbXNJbks7CiAKQEAgLTY3LDYgKzY1LDggQEAKIAogICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciB0ZXN0VmFsID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW10geyAwLCAxfSk7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCbG9vbUZpbHRlclNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IEJsb29tRmlsdGVyU2VyaWFsaXplci5mb3JWZXJzaW9uKGZhbHNlKTsKKwogICAgIEBCZW5jaG1hcmsKICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemF0aW9uVGVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKQEAgLTc1LDE2ICs3NSwxNiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBCbG9vbUZpbHRlciBmaWx0ZXIgPSAoQmxvb21GaWx0ZXIpIEZpbHRlckZhY3RvcnkuZ2V0RmlsdGVyKG51bUVsZW1zSW5LICogMTAyNCwgMC4wMWQpOwogICAgICAgICAgICAgZmlsdGVyLmFkZCh3cmFwKHRlc3RWYWwpKTsKLSAgICAgICAgICAgIERhdGFPdXRwdXRTdHJlYW1QbHVzIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtUGx1cyhmaWxlKTsKKyAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW1QbHVzIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtUGx1cyhmaWxlKTsKICAgICAgICAgICAgIGlmIChvbGRCZkZvcm1hdCkKICAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uc1Rlc3Quc2VyaWFsaXplT2xkQmZGb3JtYXQoZmlsdGVyLCBvdXQpOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIEJsb29tRmlsdGVyU2VyaWFsaXplci5zZXJpYWxpemUoZmlsdGVyLCBvdXQpOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKGZpbHRlciwgb3V0KTsKICAgICAgICAgICAgIG91dC5jbG9zZSgpOwogICAgICAgICAgICAgZmlsdGVyLmNsb3NlKCk7CiAKICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbVBsdXMgaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtUGx1cyhmaWxlKTsKLSAgICAgICAgICAgIEJsb29tRmlsdGVyIGZpbHRlcjIgPSBCbG9vbUZpbHRlclNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIG9sZEJmRm9ybWF0KTsKKyAgICAgICAgICAgIEJsb29tRmlsdGVyIGZpbHRlcjIgPSBCbG9vbUZpbHRlclNlcmlhbGl6ZXIuZm9yVmVyc2lvbihvbGRCZkZvcm1hdCkuZGVzZXJpYWxpemUoaW4pOwogICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlUXVpZXRseShpbik7CiAgICAgICAgICAgICBmaWx0ZXIyLmNsb3NlKCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvQ2FjaGVMb2FkZXJCZW5jaC5qYXZhIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9DYWNoZUxvYWRlckJlbmNoLmphdmEKaW5kZXggZGU3ODhiNy4uYWZhZmFkNiAxMDA2NDQKLS0tIGEvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9DYWNoZUxvYWRlckJlbmNoLmphdmEKKysrIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9DYWNoZUxvYWRlckJlbmNoLmphdmEKQEAgLTI1LDE1ICsyNSwyMSBAQAogCiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLkF1dG9TYXZpbmdDYWNoZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5LZXlDYWNoZUtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhU3RvcmFnZVNwZWM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5UHJvY2Vzc29yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd0luZGV4RW50cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93VXBkYXRlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQXNjaWlUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQWJzdHJhY3RSb3dJbmRleEVudHJ5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2FjaGVTZXJ2aWNlOwpAQCAtNDUsNiArNTEsNyBAQAogaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5NZWFzdXJlbWVudDsKIGltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuTW9kZTsKIGltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuT3V0cHV0VGltZVVuaXQ7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlBhcmFtOwogaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5TY29wZTsKIGltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuU2V0dXA7CiBpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlN0YXRlOwpAQCAtNTUsMjQgKzYyLDQwIEBACiBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKIEBCZW5jaG1hcmtNb2RlKE1vZGUuU2FtcGxlVGltZSkKIEBPdXRwdXRUaW1lVW5pdChUaW1lVW5pdC5NSUxMSVNFQ09ORFMpCi1AV2FybXVwKGl0ZXJhdGlvbnMgPSAxLCB0aW1lID0gMSwgdGltZVVuaXQgPSBUaW1lVW5pdC5TRUNPTkRTKQotQE1lYXN1cmVtZW50KGl0ZXJhdGlvbnMgPSAyLCB0aW1lID0gMiwgdGltZVVuaXQgPSBUaW1lVW5pdC5TRUNPTkRTKQorQFdhcm11cChpdGVyYXRpb25zID0gMSwgdGltZSA9IDUsIHRpbWVVbml0ID0gVGltZVVuaXQuU0VDT05EUykKK0BNZWFzdXJlbWVudChpdGVyYXRpb25zID0gMSwgdGltZSA9IDEwLCB0aW1lVW5pdCA9IFRpbWVVbml0LlNFQ09ORFMpCiBARm9yayh2YWx1ZSA9IDEpCiBAVGhyZWFkcygxKQogQFN0YXRlKFNjb3BlLkJlbmNobWFyaykKLXB1YmxpYyBjbGFzcyBDYWNoZUxvYWRlckJlbmNoIGV4dGVuZHMgQ1FMVGVzdGVyCitwdWJsaWMgY2xhc3MgQ2FjaGVMb2FkZXJCZW5jaAogewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBudW1TU1RhYmxlcyA9IDEwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IG51bVNTVGFibGVzID0gMTAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBudW1LZXlzUGVyVGFibGUgPSAxMDAwMDsKKwogICAgIHByaXZhdGUgZmluYWwgUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKIAorICAgIEBQYXJhbSh7ICJ0cnVlIiwgImZhbHNlIiB9KQorICAgIGJvb2xlYW4gdXNlVVVJREdlbmVyYXRpb25JZGVudGlmaWVyczsKKwogICAgIEBTZXR1cChMZXZlbC5UcmlhbCkKICAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHRocm93cyBUaHJvd2FibGUKICAgICB7Ci0gICAgICAgIENRTFRlc3Rlci5wcmVwYXJlU2VydmVyKCk7Ci0gICAgICAgIFN0cmluZyBrZXlzcGFjZSA9IGNyZWF0ZUtleXNwYWNlKCJDUkVBVEUgS0VZU1BBQ0UgJXMgd2l0aCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InIDogMSB9IGFuZCBkdXJhYmxlX3dyaXRlcyA9IGZhbHNlIik7Ci0gICAgICAgIFN0cmluZyB0YWJsZTEgPSBjcmVhdGVUYWJsZShrZXlzcGFjZSwgIkNSRUFURSBUQUJMRSAlcyAoa2V5IHRleHQgUFJJTUFSWSBLRVksIHZhbCB0ZXh0KSIpOwotICAgICAgICBTdHJpbmcgdGFibGUyID0gY3JlYXRlVGFibGUoa2V5c3BhY2UsICJDUkVBVEUgVEFCTEUgJXMgKGtleSB0ZXh0IFBSSU1BUlkgS0VZLCB2YWwgdGV4dCkiKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmRhZW1vbkluaXRpYWxpemF0aW9uKCgpIC0+IHsKKyAgICAgICAgICAgIENvbmZpZyBjb25maWcgPSBEYXRhYmFzZURlc2NyaXB0b3IubG9hZENvbmZpZygpOworICAgICAgICAgICAgY29uZmlnLmtleV9jYWNoZV9zaXplID0gbmV3IERhdGFTdG9yYWdlU3BlYy5Mb25nTWViaWJ5dGVzQm91bmQoMjU2KTsKKyAgICAgICAgICAgIGNvbmZpZy51dWlkX3NzdGFibGVfaWRlbnRpZmllcnNfZW5hYmxlZCA9IHVzZVVVSURHZW5lcmF0aW9uSWRlbnRpZmllcnM7CisgICAgICAgICAgICBjb25maWcuZHVtcF9oZWFwX29uX3VuY2F1Z2h0X2V4Y2VwdGlvbiA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICAgICAgfSk7CisgICAgICAgIFNlcnZlclRlc3RVdGlscy5wcmVwYXJlU2VydmVyKCk7CiAKKyAgICAgICAgU3RyaW5nIGtleXNwYWNlID0gImtzIjsKKyAgICAgICAgU3RyaW5nIHRhYmxlMSA9ICJ0YWIxIjsKKyAgICAgICAgU3RyaW5nIHRhYmxlMiA9ICJ0YWIyIjsKKworICAgICAgICBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiQ1JFQVRFIEtFWVNQQUNFICVzIHdpdGggcmVwbGljYXRpb24gPSB7ICdjbGFzcycgOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJyA6IDEgfSBhbmQgZHVyYWJsZV93cml0ZXMgPSBmYWxzZSIsIGtleXNwYWNlKSk7CisgICAgICAgIFF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVJbnRlcm5hbChTdHJpbmcuZm9ybWF0KCJDUkVBVEUgVEFCTEUgJXMuJXMgKGtleSB0ZXh0IFBSSU1BUlkgS0VZLCB2YWwgdGV4dCkiLCBrZXlzcGFjZSwgdGFibGUxKSk7CisgICAgICAgIFF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVJbnRlcm5hbChTdHJpbmcuZm9ybWF0KCJDUkVBVEUgVEFCTEUgJXMuJXMgKGtleSB0ZXh0IFBSSU1BUlkgS0VZLCB2YWwgdGV4dCkiLCBrZXlzcGFjZSwgdGFibGUyKSk7CiAKICAgICAgICAgS2V5c3BhY2Uuc3lzdGVtKCkuZm9yRWFjaChrIC0+IGsuZ2V0Q29sdW1uRmFtaWx5U3RvcmVzKCkuZm9yRWFjaChDb2x1bW5GYW1pbHlTdG9yZTo6ZGlzYWJsZUF1dG9Db21wYWN0aW9uKSk7CiAKQEAgLTg3LDE2ICsxMTAsMTggQEAKICAgICAgICAgY29sdW1uRmFtaWx5U3RvcmVzLmFkZChjZnMxKTsKICAgICAgICAgY29sdW1uRmFtaWx5U3RvcmVzLmFkZChjZnMyKTsKIAotICAgICAgICBsb2dnZXIuaW5mbygiQ3JlYXRpbmcge30gc3N0YWJsZXMiLCBudW1TU1RhYmxlcyk7CiAgICAgICAgIGZvciAoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzOiBjb2x1bW5GYW1pbHlTdG9yZXMpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNmcy50cnVuY2F0ZUJsb2NraW5nKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNTVGFibGVzIDsgaSsrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIENvbHVtbk1ldGFkYXRhIGNvbERlZiA9IENvbHVtbk1ldGFkYXRhLnJlZ3VsYXJDb2x1bW4oY2ZzLm1ldGFkYXRhKCksIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCJ2YWwiKSwgQXNjaWlUeXBlLmluc3RhbmNlKTsKLSAgICAgICAgICAgICAgICBSb3dVcGRhdGVCdWlsZGVyIHJvd0J1aWxkZXIgPSBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyByYW5kb20ubmV4dEludCgpLCAia2V5Iik7Ci0gICAgICAgICAgICAgICAgcm93QnVpbGRlci5hZGQoY29sRGVmLCAidmFsMSIpOwotICAgICAgICAgICAgICAgIHJvd0J1aWxkZXIuYnVpbGQoKS5hcHBseSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbnVtS2V5c1BlclRhYmxlOyBrKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSb3dVcGRhdGVCdWlsZGVyIHJvd0J1aWxkZXIgPSBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyByYW5kb20ubmV4dEludCgpLCAia2V5IiArIGspOworICAgICAgICAgICAgICAgICAgICByb3dCdWlsZGVyLmFkZChjb2xEZWYsICJ2YWwxIik7CisgICAgICAgICAgICAgICAgICAgIHJvd0J1aWxkZXIuYnVpbGQoKS5hcHBseSgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjZnMuZm9yY2VCbG9ja2luZ0ZsdXNoKENvbHVtbkZhbWlseVN0b3JlLkZsdXNoUmVhc29uLlVTRVJfRk9SQ0VEKTsKICAgICAgICAgICAgIH0KIApAQCAtMTA0LDEwICsxMjksMTUgQEAKIAogICAgICAgICAgICAgLy8gcHJlaGVhdCBrZXkgY2FjaGUKICAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogY2ZzLmdldExpdmVTU1RhYmxlcygpKQotICAgICAgICAgICAgICAgIHNzdGFibGUuZ2V0UG9zaXRpb24oVXRpbC5kaygia2V5IiksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbnVtS2V5c1BlclRhYmxlOyBrKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKFV0aWwuZGsoImtleSIgKyBrKSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgQXV0b1NhdmluZ0NhY2hlPEtleUNhY2hlS2V5LCBSb3dJbmRleEVudHJ5PiBrZXlDYWNoZSA9IENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZTsKKyAgICAgICAgQXV0b1NhdmluZ0NhY2hlPEtleUNhY2hlS2V5LCBBYnN0cmFjdFJvd0luZGV4RW50cnk+IGtleUNhY2hlID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlOwogCiAgICAgICAgIC8vIHNlcmlhbGl6ZSB0byBmaWxlCiAgICAgICAgIGtleUNhY2hlLnN1Ym1pdFdyaXRlKGtleUNhY2hlLnNpemUoKSkuZ2V0KCk7CkBAIC0xMTYsMjEgKzE0NiwyMiBAQAogICAgIEBTZXR1cChMZXZlbC5JbnZvY2F0aW9uKQogICAgIHB1YmxpYyB2b2lkIHNldHVwS2V5Q2FjaGUoKQogICAgIHsKLSAgICAgICAgQXV0b1NhdmluZ0NhY2hlPEtleUNhY2hlS2V5LCBSb3dJbmRleEVudHJ5PiBrZXlDYWNoZSA9IENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZTsKKyAgICAgICAgQXV0b1NhdmluZ0NhY2hlPEtleUNhY2hlS2V5LCBBYnN0cmFjdFJvd0luZGV4RW50cnk+IGtleUNhY2hlID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlOwogICAgICAgICBrZXlDYWNoZS5jbGVhcigpOwogICAgIH0KIAogICAgIEBUZWFyRG93bihMZXZlbC5UcmlhbCkKICAgICBwdWJsaWMgdm9pZCB0ZWFyZG93bigpCiAgICAgewotICAgICAgICBDUUxUZXN0ZXIuY2xlYW51cCgpOwogICAgICAgICBDUUxUZXN0ZXIudGVhckRvd25DbGFzcygpOworICAgICAgICBDb21taXRMb2cuaW5zdGFuY2Uuc3RvcFVuc2FmZSh0cnVlKTsKKyAgICAgICAgQ1FMVGVzdGVyLmNsZWFudXAoKTsKICAgICB9CiAKICAgICBAQmVuY2htYXJrCiAgICAgcHVibGljIHZvaWQga2V5Q2FjaGVMb2FkVGVzdCgpIHRocm93cyBUaHJvd2FibGUKICAgICB7Ci0gICAgICAgIEF1dG9TYXZpbmdDYWNoZTxLZXlDYWNoZUtleSwgUm93SW5kZXhFbnRyeT4ga2V5Q2FjaGUgPSBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGU7CisgICAgICAgIEF1dG9TYXZpbmdDYWNoZTxLZXlDYWNoZUtleSwgQWJzdHJhY3RSb3dJbmRleEVudHJ5PiBrZXlDYWNoZSA9IENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZTsKIAogICAgICAgICBrZXlDYWNoZS5sb2FkU2F2ZWRBc3luYygpLmdldCgpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvQ2FjaGluZ0JlbmNoVGVzdC5qYXZhIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9DYWNoaW5nQmVuY2hUZXN0LmphdmEKaW5kZXggYzU4OWNhNS4uYjFmODg3MCAxMDA2NDQKLS0tIGEvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9DYWNoaW5nQmVuY2hUZXN0LmphdmEKKysrIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9DYWNoaW5nQmVuY2hUZXN0LmphdmEKQEAgLTI5LDE1ICsyOSwxNCBAQAogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCi1pbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKLQoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLkNodW5rQ2FjaGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZy5Db21taXRMb2dTeW5jOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWcuRGlza0FjY2Vzc01vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuQ2h1bmtDYWNoZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVW50eXBlZFJlc3VsdFNldDsKQEAgLTIwMSw3ICsyMDAsNyBAQAogICAgIHsKICAgICAgICAgaWQuc2V0KDApOwogICAgICAgICBjb21wYWN0aW9uVGltZU5hbm9zID0gMDsKLSAgICAgICAgQ2h1bmtDYWNoZS5pbnN0YW5jZS5lbmFibGUoY2FjaGVFbmFibGVkKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldEZpbGVDYWNoZUVuYWJsZWQoY2FjaGVFbmFibGVkKTsKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldERpc2tBY2Nlc3NNb2RlKG1vZGUpOwogICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBXSVRIIGNvbXBhY3Rpb24gPSB7ICdjbGFzcycgOiAgJyIgKyBjb21wYWN0aW9uQ2xhc3MgKyAiJyAgfTsiKTsKICAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgV0lUSCBjb21wcmVzc2lvbiA9IHsgJ3NzdGFibGVfY29tcHJlc3Npb24nIDogJyIgKyBjb21wcmVzc29yQ2xhc3MgKyAiJyAgfTsiKTsKQEAgLTM4NSw0ICszODQsNCBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBpbnN0YW5jZXM7CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvTWV0YWRhdGFDb2xsZWN0b3JCZW5jaC5qYXZhIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9NZXRhZGF0YUNvbGxlY3RvckJlbmNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVjZmZhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvTWV0YWRhdGFDb2xsZWN0b3JCZW5jaC5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRlc3QubWljcm9iZW5jaDsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRMb2NhbFJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0JvdW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdCb3VuZGFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nUHJlZml4LktpbmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Mb25nVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkJ1ZmZlckNlbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb2xsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworaW1wb3J0IG9yZy5qY3Rvb2xzLnV0aWwuUG93MjsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuKjsKKworQEJlbmNobWFya01vZGUoTW9kZS5BdmVyYWdlVGltZSkKK0BPdXRwdXRUaW1lVW5pdChUaW1lVW5pdC5OQU5PU0VDT05EUykKK0BXYXJtdXAoaXRlcmF0aW9ucyA9IDEwLCB0aW1lID0gMSkKK0BNZWFzdXJlbWVudChpdGVyYXRpb25zID0gMTAsIHRpbWUgPSAxKQorQEZvcmsoMSkKK0BTdGF0ZShTY29wZS5CZW5jaG1hcmspCitwdWJsaWMgY2xhc3MgTWV0YWRhdGFDb2xsZWN0b3JCZW5jaAoreworICAgIEBQYXJhbSh7ICIxMCIgfSkKKyAgICBpbnQgY2x1c3RlcmluZ0tleU51bTsKKworICAgIEBQYXJhbSh7ICIxMDAwMCIgfSkKKyAgICBpbnQgZGF0YXNldFNpemU7CisgICAgaW50IGRhdHVtSW5kZXg7CisgICAgQ2VsbDw/PltdIGNlbGxzOworICAgIENsdXN0ZXJpbmc8Pz5bXSBjbHVzdGVyaW5nczsKKyAgICBDbHVzdGVyaW5nQm91bmQ8Pz5bXSBjbHVzdGVyaW5nQm91bmRzOworICAgIENsdXN0ZXJpbmdCb3VuZGFyeTw/PltdIGNsdXN0ZXJpbmdCb3VuZGFyaWVzOworICAgIE1ldGFkYXRhQ29sbGVjdG9yIGNvbGxlY3RvcjsKKworICAgIEBTZXR1cAorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkKKyAgICB7CisgICAgICAgIFRhYmxlTWV0YWRhdGEuQnVpbGRlciB0YWJsZU1ldGFkYXRhQnVpbGRlciA9IFRhYmxlTWV0YWRhdGEuYnVpbGRlcigiayIsICJ0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRQYXJ0aXRpb25LZXlDb2x1bW4oInBrIiwgTG9uZ1R5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVndWxhckNvbHVtbigicmMiLCBMb25nVHlwZS5pbnN0YW5jZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2x1c3RlcmluZ0tleU51bTsgaSsrKQorICAgICAgICAgICAgdGFibGVNZXRhZGF0YUJ1aWxkZXIuYWRkQ2x1c3RlcmluZ0NvbHVtbigiY2siICsgaSwgTG9uZ1R5cGUuaW5zdGFuY2UpOworICAgICAgICBUYWJsZU1ldGFkYXRhIHRhYmxlTWV0YWRhdGEgPSB0YWJsZU1ldGFkYXRhQnVpbGRlci5idWlsZCgpOworICAgICAgICBjb2xsZWN0b3IgPSBuZXcgTWV0YWRhdGFDb2xsZWN0b3IodGFibGVNZXRhZGF0YS5jb21wYXJhdG9yKTsKKworICAgICAgICBDb2x1bW5NZXRhZGF0YSBjb2x1bW5NZXRhZGF0YSA9IHRhYmxlTWV0YWRhdGEucmVndWxhckNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgVGhyZWFkTG9jYWxSYW5kb20gY3VycmVudCA9IFRocmVhZExvY2FsUmFuZG9tLmN1cnJlbnQoKTsKKyAgICAgICAgZGF0YXNldFNpemUgPSBQb3cyLnJvdW5kVG9Qb3dlck9mVHdvKGRhdGFzZXRTaXplKTsKKyAgICAgICAgY2VsbHMgPSBuZXcgQ2VsbFtkYXRhc2V0U2l6ZV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YXNldFNpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY2VsbHNbaV0gPSBuZXcgQnVmZmVyQ2VsbChjb2x1bW5NZXRhZGF0YSwgY3VycmVudC5uZXh0TG9uZygwLCBMb25nLk1BWF9WQUxVRSksIGN1cnJlbnQubmV4dEludCgxLCBJbnRlZ2VyLk1BWF9WQUxVRSksIENlbGwuTk9fREVMRVRJT05fVElNRSwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgY2x1c3RlcmluZ3MgPSBuZXcgQ2x1c3RlcmluZ1tkYXRhc2V0U2l6ZV07CisgICAgICAgIGNsdXN0ZXJpbmdCb3VuZHMgPSBuZXcgQ2x1c3RlcmluZ0JvdW5kW2RhdGFzZXRTaXplXTsKKyAgICAgICAgY2x1c3RlcmluZ0JvdW5kYXJpZXMgPSBuZXcgQ2x1c3RlcmluZ0JvdW5kYXJ5W2RhdGFzZXRTaXplXTsKKyAgICAgICAgQnl0ZUJ1ZmZlcltdIGNrcyA9IG5ldyBCeXRlQnVmZmVyW2NsdXN0ZXJpbmdLZXlOdW1dOworICAgICAgICBLaW5kW10gY2x1c3RlcmluZ0JvdW5kS2luZHMgPSBuZXcgS2luZFtdeyBLaW5kLklOQ0xfU1RBUlRfQk9VTkQsIEtpbmQuSU5DTF9FTkRfQk9VTkQsIEtpbmQuRVhDTF9TVEFSVF9CT1VORCwgS2luZC5FWENMX0VORF9CT1VORCB9OworICAgICAgICBLaW5kW10gY2x1c3RlcmluZ0JvdW5kYXJ5S2luZHMgPSBuZXcgS2luZFtdeyBLaW5kLklOQ0xfRU5EX0VYQ0xfU1RBUlRfQk9VTkRBUlksIEtpbmQuRVhDTF9FTkRfSU5DTF9TVEFSVF9CT1VOREFSWSB9OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGFzZXRTaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2x1c3RlcmluZ0tleU51bTsgaisrKQorICAgICAgICAgICAgICAgIGNrc1tqXSA9IExvbmdUeXBlLmluc3RhbmNlLmRlY29tcG9zZShjdXJyZW50Lm5leHRMb25nKCkpOworICAgICAgICAgICAgY2x1c3RlcmluZ3NbaV0gPSBDbHVzdGVyaW5nLm1ha2UoQXJyYXlzLmNvcHlPZihja3MsIGNrcy5sZW5ndGgpKTsKKyAgICAgICAgICAgIGNsdXN0ZXJpbmdCb3VuZHNbaV0gPSBDbHVzdGVyaW5nQm91bmQuY3JlYXRlKGNsdXN0ZXJpbmdCb3VuZEtpbmRzW2kgJSBjbHVzdGVyaW5nQm91bmRLaW5kcy5sZW5ndGhdLCBjbHVzdGVyaW5nc1tpXSk7CisgICAgICAgICAgICBjbHVzdGVyaW5nQm91bmRhcmllc1tpXSA9IENsdXN0ZXJpbmdCb3VuZGFyeS5jcmVhdGUoY2x1c3RlcmluZ0JvdW5kYXJ5S2luZHNbaSAlIGNsdXN0ZXJpbmdCb3VuZGFyeUtpbmRzLmxlbmd0aF0sIGNsdXN0ZXJpbmdzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIFN5c3RlbS5nYygpOworICAgICAgICAvLyBzaHVmZmxlIGFycmF5IGNvbnRlbnRzIHRvIGVuc3VyZSBhIG1vcmUgJ25hdHVyYWwnIGxheW91dAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGFzZXRTaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB0byA9IGN1cnJlbnQubmV4dEludCgwLCBkYXRhc2V0U2l6ZSk7CisgICAgICAgICAgICBDZWxsPD8+IHRlbXAgPSBjZWxsc1tpXTsKKyAgICAgICAgICAgIGNlbGxzW2ldID0gY2VsbHNbdG9dOworICAgICAgICAgICAgY2VsbHNbdG9dID0gdGVtcDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YXNldFNpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHRvID0gY3VycmVudC5uZXh0SW50KDAsIGRhdGFzZXRTaXplKTsKKyAgICAgICAgICAgIENsdXN0ZXJpbmc8Pz4gdGVtcCA9IGNsdXN0ZXJpbmdzW2ldOworICAgICAgICAgICAgY2x1c3RlcmluZ3NbaV0gPSBjbHVzdGVyaW5nc1t0b107CisgICAgICAgICAgICBjbHVzdGVyaW5nc1t0b10gPSB0ZW1wOworICAgICAgICB9CisgICAgfQorCisgICAgQEJlbmNobWFyaworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUNlbGwoKQorICAgIHsKKyAgICAgICAgY29sbGVjdG9yLnVwZGF0ZShuZXh0Q2VsbCgpKTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIHZvaWQgdXBkYXRlQ2x1c3RlcmluZygpCisgICAgeworICAgICAgICBjb2xsZWN0b3IudXBkYXRlQ2x1c3RlcmluZ1ZhbHVlcyhuZXh0Q2x1c3RlcmluZygpKTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIHZvaWQgdXBkYXRlQ2x1c3RlcmluZ0JvdW5kKCkKKyAgICB7CisgICAgICAgIGNvbGxlY3Rvci51cGRhdGVDbHVzdGVyaW5nVmFsdWVzQnlCb3VuZE9yQm91bmRhcnkobmV4dENsdXN0ZXJpbmdCb3VuZCgpKTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIHZvaWQgdXBkYXRlQ2x1c3RlcmluZ0JvdW5kYXJ5KCkKKyAgICB7CisgICAgICAgIGNvbGxlY3Rvci51cGRhdGVDbHVzdGVyaW5nVmFsdWVzQnlCb3VuZE9yQm91bmRhcnkobmV4dENsdXN0ZXJpbmdCb3VuZGFyeSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2VsbDw/PiBuZXh0Q2VsbCgpCisgICAgeworICAgICAgICByZXR1cm4gY2VsbHNbZGF0dW1JbmRleCsrICYgKGNlbGxzLmxlbmd0aCAtIDEpXTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2x1c3RlcmluZzw/PiBuZXh0Q2x1c3RlcmluZygpCisgICAgeworICAgICAgICByZXR1cm4gY2x1c3RlcmluZ3NbZGF0dW1JbmRleCsrICYgKGNsdXN0ZXJpbmdzLmxlbmd0aCAtIDEpXTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2x1c3RlcmluZ0JvdW5kPD8+IG5leHRDbHVzdGVyaW5nQm91bmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNsdXN0ZXJpbmdCb3VuZHNbZGF0dW1JbmRleCsrICYgKGNsdXN0ZXJpbmdCb3VuZHMubGVuZ3RoIC0gMSldOworICAgIH0KKworICAgIHB1YmxpYyBDbHVzdGVyaW5nQm91bmRhcnk8Pz4gbmV4dENsdXN0ZXJpbmdCb3VuZGFyeSgpCisgICAgeworICAgICAgICByZXR1cm4gY2x1c3RlcmluZ0JvdW5kYXJpZXNbZGF0dW1JbmRleCsrICYgKGNsdXN0ZXJpbmdCb3VuZGFyaWVzLmxlbmd0aCAtIDEpXTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9WSW50Q29kaW5nQmVuY2guamF2YSBiL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvVkludENvZGluZ0JlbmNoLmphdmEKaW5kZXggOWM4MjIzNi4uYTYwZDlmMiAxMDA2NDQKLS0tIGEvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9WSW50Q29kaW5nQmVuY2guamF2YQorKysgYi90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL1ZJbnRDb2RpbmdCZW5jaC5qYXZhCkBAIC0xOCw2ICsxOCwxMiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRlc3QubWljcm9iZW5jaDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuQnVmZmVyZWREYXRhT3V0cHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnZpbnQuVkludENvZGluZzsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuKjsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguaW5mcmEuQmxhY2tob2xlOworCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOwpAQCAtMjgsMjMgKzM0LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5CdWZmZXJlZERhdGFPdXRwdXRTdHJlYW1QbHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMudmludC5WSW50Q29kaW5nOwotaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5CZW5jaG1hcms7Ci1pbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLkJlbmNobWFya01vZGU7Ci1pbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLkZvcms7Ci1pbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLk1lYXN1cmVtZW50OwotaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5Nb2RlOwotaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5PdXRwdXRUaW1lVW5pdDsKLWltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuUGFyYW07Ci1pbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlNjb3BlOwotaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5TdGF0ZTsKLWltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuVGVhckRvd247Ci1pbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlRocmVhZHM7Ci1pbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLldhcm11cDsKLWltcG9ydCBvcmcub3Blbmpkay5qbWguaW5mcmEuQmxhY2tob2xlOwotCiBAQmVuY2htYXJrTW9kZShNb2RlLkF2ZXJhZ2VUaW1lKQogQE91dHB1dFRpbWVVbml0KFRpbWVVbml0Lk5BTk9TRUNPTkRTKQogQFdhcm11cChpdGVyYXRpb25zID0gNSwgdGltZSA9IDEsIHRpbWVVbml0ID0gVGltZVVuaXQuU0VDT05EUykKZGlmZiAtLWdpdCBhL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvWmVyb0NvcHlTdHJlYW1pbmdCZW5jaG1hcmsuamF2YSBiL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvWmVyb0NvcHlTdHJlYW1pbmdCZW5jaG1hcmsuamF2YQppbmRleCBiNWJiNDBjLi41OWFjZmM2IDEwMDY0NAotLS0gYS90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL1plcm9Db3B5U3RyZWFtaW5nQmVuY2htYXJrLmphdmEKKysrIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9aZXJvQ29weVN0cmVhbWluZ0JlbmNobWFyay5qYXZhCkBAIC01NCw3ICs1NCw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LkFzeW5jU3RyZWFtaW5nT3V0cHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ2FjaGluZ1BhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLmFzeW5jLk5ldHR5U3RyZWFtaW5nQ29ubmVjdGlvbkZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlByZXZpZXdLaW5kOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TZXNzaW9uSW5mbzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtQ29vcmRpbmF0b3I7CkBAIC02Myw2ICs2Miw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbVJlc3VsdEZ1dHVyZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtU2Vzc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtU3VtbWFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuYXN5bmMuTmV0dHlTdHJlYW1pbmdDb25uZWN0aW9uRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcubWVzc2FnZXMuU3RyZWFtTWVzc2FnZUhlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKQEAgLTEzNCw3ICsxMzQsNiBAQAogCiAgICAgICAgICAgICBDYXNzYW5kcmFTdHJlYW1IZWFkZXIgZW50aXJlU1NUYWJsZVN0cmVhbUhlYWRlciA9CiAgICAgICAgICAgICAgICAgQ2Fzc2FuZHJhU3RyZWFtSGVhZGVyLmJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU1NUYWJsZUZvcm1hdChzc3RhYmxlLmRlc2NyaXB0b3IuZm9ybWF0VHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNTVGFibGVWZXJzaW9uKHNzdGFibGUuZGVzY3JpcHRvci52ZXJzaW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU1NUYWJsZUxldmVsKDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhFc3RpbWF0ZWRLZXlzKHNzdGFibGUuZXN0aW1hdGVkS2V5cygpKQpAQCAtMTU0LDcgKzE1Myw2IEBACiAgICAgICAgICAgICBMaXN0PFJhbmdlPFRva2VuPj4gcmVxdWVzdGVkUmFuZ2VzID0gQXJyYXlzLmFzTGlzdChuZXcgUmFuZ2U8Pihzc3RhYmxlLmZpcnN0Lm1pblZhbHVlKCkuZ2V0VG9rZW4oKSwgc3N0YWJsZS5sYXN0LmdldFRva2VuKCkpKTsKICAgICAgICAgICAgIENhc3NhbmRyYVN0cmVhbUhlYWRlciBwYXJ0aWFsU1NUYWJsZVN0cmVhbUhlYWRlciA9CiAgICAgICAgICAgICBDYXNzYW5kcmFTdHJlYW1IZWFkZXIuYnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNTVGFibGVGb3JtYXQoc3N0YWJsZS5kZXNjcmlwdG9yLmZvcm1hdFR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNTVGFibGVWZXJzaW9uKHNzdGFibGUuZGVzY3JpcHRvci52ZXJzaW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTU1RhYmxlTGV2ZWwoMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoRXN0aW1hdGVkS2V5cyhzc3RhYmxlLmVzdGltYXRlZEtleXMoKSkKQEAgLTIyMSw3ICsyMTksNyBAQAogICAgICAgICAgICAgU3RyZWFtUmVzdWx0RnV0dXJlIGZ1dHVyZSA9IFN0cmVhbVJlc3VsdEZ1dHVyZS5jcmVhdGVJbml0aWF0b3IobmV4dFRpbWVVVUlEKCksIFN0cmVhbU9wZXJhdGlvbi5CT09UU1RSQVAsIENvbGxlY3Rpb25zLjxTdHJlYW1FdmVudEhhbmRsZXI+ZW1wdHlMaXN0KCksIHN0cmVhbUNvb3JkaW5hdG9yKTsKIAogICAgICAgICAgICAgSW5ldEFkZHJlc3NBbmRQb3J0IHBlZXIgPSBGQlV0aWxpdGllcy5nZXRCcm9hZGNhc3RBZGRyZXNzQW5kUG9ydCgpOwotICAgICAgICAgICAgc3RyZWFtQ29vcmRpbmF0b3IuYWRkU2Vzc2lvbkluZm8obmV3IFNlc3Npb25JbmZvKHBlZXIsIDAsIHBlZXIsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgU3RyZWFtU2Vzc2lvbi5TdGF0ZS5JTklUSUFMSVpFRCkpOworICAgICAgICAgICAgc3RyZWFtQ29vcmRpbmF0b3IuYWRkU2Vzc2lvbkluZm8obmV3IFNlc3Npb25JbmZvKHBlZXIsIDAsIHBlZXIsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgU3RyZWFtU2Vzc2lvbi5TdGF0ZS5JTklUSUFMSVpFRCwgbnVsbCkpOwogCiAgICAgICAgICAgICBTdHJlYW1TZXNzaW9uIHNlc3Npb24gPSBzdHJlYW1Db29yZGluYXRvci5nZXRPckNyZWF0ZU91dGJvdW5kU2Vzc2lvbihwZWVyKTsKICAgICAgICAgICAgIHNlc3Npb24uaW5pdChmdXR1cmUpOwpkaWZmIC0tZ2l0IGEvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9idHJlZS9BdG9taWNCVHJlZVBhcnRpdGlvblVwZGF0ZUJlbmNoLmphdmEgYi90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL2J0cmVlL0F0b21pY0JUcmVlUGFydGl0aW9uVXBkYXRlQmVuY2guamF2YQppbmRleCAzNGVjMjlhLi43MDgzODMyIDEwMDY0NAotLS0gYS90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL2J0cmVlL0F0b21pY0JUcmVlUGFydGl0aW9uVXBkYXRlQmVuY2guamF2YQorKysgYi90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL2J0cmVlL0F0b21pY0JUcmVlUGFydGl0aW9uVXBkYXRlQmVuY2guamF2YQpAQCAtNTAsOCArNTAsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQ29tcG9zaXRlVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLk1hcFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5BYnN0cmFjdEJUcmVlUGFydGl0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuQXRvbWljQlRyZWVQYXJ0aXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5CVHJlZVBhcnRpdGlvbkRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5QYXJ0aXRpb25VcGRhdGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5CVHJlZVJvdzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkJ1ZmZlckNlbGw7CkBAIC0yNDAsNyArMjQwLDcgQEAKICAgICAgICAgICAgIHRyeSAoQnVsa0l0ZXJhdG9yPFJvdz4gaXRlciA9IEJ1bGtJdGVyYXRvci5vZihpbnNlcnRCdWZmZXIpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIE9iamVjdFtdIHRyZWUgPSBCVHJlZS5idWlsZChpdGVyLCByb3dDb3VudCwgVXBkYXRlRnVuY3Rpb24ubm9PcCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gUGFydGl0aW9uVXBkYXRlLnVuc2FmZUNvbnN0cnVjdChtZXRhZGF0YSwgZGVjb3JhdGVkS2V5LCBBYnN0cmFjdEJUcmVlUGFydGl0aW9uLnVuc2FmZUNvbnN0cnVjdEhvbGRlcihwYXJ0aXRpb25Db2x1bW5zLCB0cmVlLCBEZWxldGlvbkluZm8uTElWRSwgUm93cy5FTVBUWV9TVEFUSUNfUk9XLCBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTKSwgTk9fREVMRVRJT05fSU5GTywgZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybiBQYXJ0aXRpb25VcGRhdGUudW5zYWZlQ29uc3RydWN0KG1ldGFkYXRhLCBkZWNvcmF0ZWRLZXksIEJUcmVlUGFydGl0aW9uRGF0YS51bnNhZmVDb25zdHJ1Y3QocGFydGl0aW9uQ29sdW1ucywgdHJlZSwgRGVsZXRpb25JbmZvLkxJVkUsIFJvd3MuRU1QVFlfU1RBVElDX1JPVywgRW5jb2RpbmdTdGF0cy5OT19TVEFUUyksIE5PX0RFTEVUSU9OX0lORk8sIGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0zNDIsMTIgKzM0Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBhbGxvY2F0ZShpbnQgc2l6ZSkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW52YWxpZGF0ZU9uID4gMCAmJiAtLWludmFsaWRhdGVPbiA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RCVHJlZVBhcnRpdGlvbi5Ib2xkZXIgaG9sZGVyID0gdXBkYXRlLnVuc2FmZUdldEhvbGRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUJUcmVlLmlzRW1wdHkoaG9sZGVyLnRyZWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlLnVuc2FmZVNldEhvbGRlcihBYnN0cmFjdEJUcmVlUGFydGl0aW9uLnVuc2FmZUNvbnN0cnVjdEhvbGRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIuY29sdW1ucywgQXJyYXlzLmNvcHlPZihob2xkZXIudHJlZSwgaG9sZGVyLnRyZWUubGVuZ3RoKSwgaG9sZGVyLmRlbGV0aW9uSW5mbywgaG9sZGVyLnN0YXRpY1JvdywgaG9sZGVyLnN0YXRzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVHJlZVBhcnRpdGlvbkRhdGEudW5zYWZlSW52YWxpZGF0ZSh1cGRhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCeXRlQnVmZmVyLmFsbG9jYXRlKHNpemUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9OwpAQCAtMzk3LDcgKzM5Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWRMb2NhbFJhbmRvbS5jdXJyZW50KCkubmV4dExvbmcoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW52b2tlQmVmb3JlLmFjY2VwdCh0aGlzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGUuYWRkQWxsV2l0aFNpemVEZWx0YShpbnNlcnRbaW5kZXhdLCBjbG9uZXIsIE5PX09SREVSLmdldEN1cnJlbnQoKSwgVXBkYXRlVHJhbnNhY3Rpb24uTk9fT1ApOworICAgICAgICAgICAgICAgIHVwZGF0ZS5hZGRBbGwoaW5zZXJ0W2luZGV4XSwgY2xvbmVyLCBOT19PUkRFUi5nZXRDdXJyZW50KCksIFVwZGF0ZVRyYW5zYWN0aW9uLk5PX09QKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZpbmFsbHkKQEAgLTQwNSw3ICs0MDAsNyBAQAogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5hZGRBbmRHZXQoMHgxMDAwMDBMKSA9PSAoKCgobG9uZylpZkdlbmVyYXRpb24pIDw8IDQwKSB8ICgoKGxvbmcpaW5zZXJ0Lmxlbmd0aCkgPDwgMjApIHwgaW5zZXJ0Lmxlbmd0aCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBhY3RpdmVUaHJlYWRzLnNldCgwKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlLnVuc2FmZVNldEhvbGRlcihBYnN0cmFjdEJUcmVlUGFydGl0aW9uLnVuc2FmZUdldEVtcHR5SG9sZGVyKCkpOworICAgICAgICAgICAgICAgICAgICB1cGRhdGUudW5zYWZlU2V0SG9sZGVyKEJUcmVlUGFydGl0aW9uRGF0YS51bnNhZmVHZXRFbXB0eSgpKTsKICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGhlIHN0YXRlIGFuZCByb2xsb3ZlciB0aGUgZ2VuZXJhdGlvbgogICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zZXQoKGlmR2VuZXJhdGlvbiArIDFMKSA8PCA0MCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNTY2LDcgKzU2MSwxMyBAQAogICAgIHByaXZhdGUgc3RhdGljIENvbHVtbk1ldGFkYXRhW10gY29sdW1ucyhBYnN0cmFjdFR5cGU8Pz4gdHlwZSwgQ29sdW1uTWV0YWRhdGEuS2luZCBraW5kLCBpbnQgY291bnQsIFN0cmluZyBwcmVmaXgpCiAgICAgewogICAgICAgICByZXR1cm4gSW50U3RyZWFtLnJhbmdlKDAsIGNvdW50KQotICAgICAgICAgICAgICAgICAgICAgICAgLm1hcFRvT2JqKGkgLT4gbmV3IENvbHVtbk1ldGFkYXRhKCIiLCAiIiwgbmV3IENvbHVtbklkZW50aWZpZXIocHJlZml4ICsgaSwgdHJ1ZSksIHR5cGUsIGtpbmQgIT0gQ29sdW1uTWV0YWRhdGEuS2luZC5SRUdVTEFSID8gaSA6IENvbHVtbk1ldGFkYXRhLk5PX1BPU0lUSU9OLCBraW5kKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBUb09iaihpIC0+IG5ldyBDb2x1bW5NZXRhZGF0YSgiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29sdW1uSWRlbnRpZmllcihwcmVmaXggKyBpLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgIT0gQ29sdW1uTWV0YWRhdGEuS2luZC5SRUdVTEFSID8gaSA6IENvbHVtbk1ldGFkYXRhLk5PX1BPU0lUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAudG9BcnJheShDb2x1bW5NZXRhZGF0YVtdOjpuZXcpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9idHJlZS9CVHJlZVRyYW5zZm9ybUJlbmNoLmphdmEgYi90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL2J0cmVlL0JUcmVlVHJhbnNmb3JtQmVuY2guamF2YQppbmRleCA0ZjJmYTc4Li5hNDU5MzE2IDEwMDY0NAotLS0gYS90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL2J0cmVlL0JUcmVlVHJhbnNmb3JtQmVuY2guamF2YQorKysgYi90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL2J0cmVlL0JUcmVlVHJhbnNmb3JtQmVuY2guamF2YQpAQCAtNzAsNyArNzAsNyBAQAogICAgICAgICBzZXR1cCgyICogZGF0YVNpemUpOwogICAgICAgICBkYXRhMiA9IGRhdGEuY2xvbmUoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgZGF0YTIubGVuZ3RoIDsgKytpKQotICAgICAgICAgICAgZGF0YTJbaV0gPSBuZXcgSW50ZWdlcihkYXRhMltpXSk7CisgICAgICAgICAgICBkYXRhMltpXSA9IEludGVnZXIudmFsdWVPZihkYXRhMltpXSk7CiAgICAgfQogCiAgICAgQFN0YXRlKFNjb3BlLlRocmVhZCkKZGlmZiAtLWdpdCBhL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvYnRyZWUvQlRyZWVVcGRhdGVCZW5jaC5qYXZhIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9idHJlZS9CVHJlZVVwZGF0ZUJlbmNoLmphdmEKaW5kZXggZjJiZTg1OS4uYzdhZDgxYyAxMDA2NDQKLS0tIGEvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9idHJlZS9CVHJlZVVwZGF0ZUJlbmNoLmphdmEKKysrIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9idHJlZS9CVHJlZVVwZGF0ZUJlbmNoLmphdmEKQEAgLTgzLDcgKzgzLDcgQEAKICAgICAgICAgc2V0dXAoMiAqIChkYXRhU2l6ZSArIGluc2VydFNpemUpKTsKICAgICAgICAgZGF0YTIgPSBkYXRhLmNsb25lKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGRhdGEyLmxlbmd0aCA7ICsraSkKLSAgICAgICAgICAgIGRhdGEyW2ldID0gbmV3IEludGVnZXIoZGF0YTJbaV0pOworICAgICAgICAgICAgZGF0YTJbaV0gPSBJbnRlZ2VyLnZhbHVlT2YoZGF0YTJbaV0pOwogICAgIH0KIAogICAgIEBTdGF0ZShTY29wZS5UaHJlYWQpCmRpZmYgLS1naXQgYS90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL2luc3RhbmNlL1JlYWRUZXN0LmphdmEgYi90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL2luc3RhbmNlL1JlYWRUZXN0LmphdmEKaW5kZXggNTRmNzIxYi4uNWE4Njg0MiAxMDA2NDQKLS0tIGEvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9pbnN0YW5jZS9SZWFkVGVzdC5qYXZhCisrKyBiL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvaW5zdGFuY2UvUmVhZFRlc3QuamF2YQpAQCAtODAsMTEgKzgwLDIxIEBACiAgICAgICAgICAgICAvLyBkb24ndCBmbHVzaAogICAgICAgICB9CiAKKyAgICAgICAgU3lzdGVtLmVyci5mb3JtYXQoIiVzIHNzdGFibGVzLCB0b3RhbCAlcywgJSxkIHBhcnRpdGlvbnMuIE1lYW4gd3JpdGUgbGF0ZW5jeSAlLjJmIG1zXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShjZnMubWV0cmljLmxpdmVEaXNrU3BhY2VVc2VkLmdldENvdW50KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMubWV0cmljLmVzdGltYXRlZFBhcnRpdGlvbkNvdW50LmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNmcy5tZXRyaWMud3JpdGVMYXRlbmN5LmxhdGVuY3kuZ2V0U25hcHNob3QoKS5nZXRNZWFuKCkpOwogICAgICAgICAvLyBOZWVkZWQgdG8gc3RhYmlsaXplIHNzdGFibGUgY291bnQgZm9yIG9mZi1jYWNoZSBzaXplZCB0ZXN0cyAoZS5nLiBjb3VudCA9IDEwMF8wMDBfMDAwKQogICAgICAgICB3aGlsZSAoY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSA+PSAxNSkKICAgICAgICAgewogICAgICAgICAgICAgY2ZzLmVuYWJsZUF1dG9Db21wYWN0aW9uKHRydWUpOwogICAgICAgICAgICAgY2ZzLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICAgICAgU3lzdGVtLmVyci5mb3JtYXQoIiVzIHNzdGFibGVzLCB0b3RhbCAlcywgJSxkIHBhcnRpdGlvbnMuIE1lYW4gd3JpdGUgbGF0ZW5jeSAlLjJmIG1zXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KGNmcy5tZXRyaWMubGl2ZURpc2tTcGFjZVVzZWQuZ2V0Q291bnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMubWV0cmljLmVzdGltYXRlZFBhcnRpdGlvbkNvdW50LmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMubWV0cmljLndyaXRlTGF0ZW5jeS5sYXRlbmN5LmdldFNuYXBzaG90KCkuZ2V0TWVhbigpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTA5LDcgKzExOSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRocm93YWJsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZSh0aHJvd2FibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZXMudGhyb3dJZlVuY2hlY2tlZCh0aHJvd2FibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHRocm93YWJsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgfQpAQCAtMTQyLDcgKzE1Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRocm93YWJsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZSh0aHJvd2FibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZXMudGhyb3dJZlVuY2hlY2tlZCh0aHJvd2FibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHRocm93YWJsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9pbnN0YW5jZS9TaW1wbGVUYWJsZVdyaXRlci5qYXZhIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9pbnN0YW5jZS9TaW1wbGVUYWJsZVdyaXRlci5qYXZhCmluZGV4IGZiYThkMTYuLmNjNzhlMDMgMTAwNjQ0Ci0tLSBhL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvaW5zdGFuY2UvU2ltcGxlVGFibGVXcml0ZXIuamF2YQorKysgYi90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL2luc3RhbmNlL1NpbXBsZVRhYmxlV3JpdGVyLmphdmEKQEAgLTEzOCw3ICsxMzgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0aHJvd2FibGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5wcm9wYWdhdGUodGhyb3dhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGVzLnRocm93SWZVbmNoZWNrZWQodGhyb3dhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0aHJvd2FibGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgIH0KQEAgLTE2OSw3ICsxNzAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0aHJvd2FibGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5wcm9wYWdhdGUodGhyb3dhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGVzLnRocm93SWZVbmNoZWNrZWQodGhyb3dhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0aHJvd2FibGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvdHJpZXMvQ29tcGFyaXNvblJlYWRCZW5jaC5qYXZhIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC90cmllcy9Db21wYXJpc29uUmVhZEJlbmNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI1MDUxMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvdHJpZXMvQ29tcGFyaXNvblJlYWRCZW5jaC5qYXZhCkBAIC0wLDAgKzEsNTE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS50ZXN0Lm1pY3JvYmVuY2gudHJpZXM7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TWFwOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk5hdmlnYWJsZU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRTa2lwTGlzdE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlDb25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkRlY2ltYWxUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50ZWdlclR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXMuSW5NZW1vcnlUcmllOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkJ1ZmZlclR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUFycmF5VXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2VJbnZlcnNlOworaW1wb3J0IG9yZy5naXRodWIuamFtbS5NZW1vcnlNZXRlcjsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuQmVuY2htYXJrOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5CZW5jaG1hcmtNb2RlOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5Gb3JrOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5MZXZlbDsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuTWVhc3VyZW1lbnQ7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLk1vZGU7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLk91dHB1dFRpbWVVbml0OworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5QYXJhbTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuU2NvcGU7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlNldHVwOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5TdGF0ZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuVGhyZWFkczsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuV2FybXVwOworCitAQmVuY2htYXJrTW9kZShNb2RlLkF2ZXJhZ2VUaW1lKQorQE91dHB1dFRpbWVVbml0KFRpbWVVbml0Lk1JTExJU0VDT05EUykKK0BXYXJtdXAoaXRlcmF0aW9ucyA9IDIsIHRpbWUgPSAxKQorQE1lYXN1cmVtZW50KGl0ZXJhdGlvbnMgPSAzLCB0aW1lID0gMSkKK0BGb3JrKHZhbHVlID0gMSxqdm1BcmdzQXBwZW5kID0geyAiLVhteDRHIiwgIi1YbXM0RyIsICItRGptaC5leGVjdXRvcj1DVVNUT00iLCAiLURqbWguZXhlY3V0b3IuY2xhc3M9b3JnLmFwYWNoZS5jYXNzYW5kcmEudGVzdC5taWNyb2JlbmNoLkZhc3RUaHJlYWRFeGVjdXRvciJ9KQorQFRocmVhZHMoMSkgLy8gbm8gY29uY3VycmVudCB3cml0ZXMKK0BTdGF0ZShTY29wZS5CZW5jaG1hcmspCitwdWJsaWMgY2xhc3MgQ29tcGFyaXNvblJlYWRCZW5jaAoreworICAgIC8vIE5vdGU6IFRvIHNlZSBhIHByaW50b3V0IG9mIHRoZSB1c2FnZSBmb3IgZWFjaCBvYmplY3QsIGFkZCAuZW5hYmxlRGVidWcoKSBoZXJlIChtb3N0IHVzZWZ1bCB3aXRoIHNtYWxsZXIgbnVtYmVyIG9mCisgICAgLy8gcGFydGl0aW9ucykuCisgICAgc3RhdGljIE1lbW9yeU1ldGVyIG1ldGVyID0gbmV3IE1lbW9yeU1ldGVyKCkuaWdub3JlS25vd25TaW5nbGV0b25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoR3Vlc3NpbmcoTWVtb3J5TWV0ZXIuR3Vlc3MuRkFMTEJBQ0tfVU5TQUZFKTsKKworICAgIEBQYXJhbSh7Ik9OX0hFQVAifSkKKyAgICBCdWZmZXJUeXBlIGJ1ZmZlclR5cGUgPSBCdWZmZXJUeXBlLk9GRl9IRUFQOworCisgICAgQFBhcmFtKHsiMTAwMCIsICIxMDAwMDAiLCAiMTAwMDAwMDAifSkKKyAgICBpbnQgY291bnQgPSAxMDAwOworCisgICAgQFBhcmFtKHsiVFJFRV9NQVAiLCAiQ1NMTSIsICJUUklFIn0pCisgICAgTWFwT3B0aW9uIG1hcCA9IE1hcE9wdGlvbi5UUklFOworCisgICAgQFBhcmFtKHsiTE9ORyJ9KQorICAgIFR5cGVPcHRpb24gdHlwZSA9IFR5cGVPcHRpb24uTE9ORzsKKworICAgIGZpbmFsIHN0YXRpYyBJbk1lbW9yeVRyaWUuVXBzZXJ0VHJhbnNmb3JtZXI8Qnl0ZSwgQnl0ZT4gcmVzb2x2ZXIgPSAoeCwgeSkgLT4geTsKKworICAgIEFjY2Vzczw/PiBhY2Nlc3M7CisKKyAgICBAU2V0dXAoTGV2ZWwuVHJpYWwpCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBzd2l0Y2ggKG1hcCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBUUkVFX01BUDoKKyAgICAgICAgICAgICAgICBhY2Nlc3MgPSBuZXcgTmF2aWdhYmxlTWFwQWNjZXNzKG5ldyBUcmVlTWFwKHR5cGUudHlwZS5jb21wYXJhdG9yKCkpLCB0eXBlLnR5cGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDU0xNOgorICAgICAgICAgICAgICAgIGFjY2VzcyA9IG5ldyBOYXZpZ2FibGVNYXBBY2Nlc3MobmV3IENvbmN1cnJlbnRTa2lwTGlzdE1hcCh0eXBlLnR5cGUuY29tcGFyYXRvcigpKSwgdHlwZS50eXBlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVFJJRToKKyAgICAgICAgICAgICAgICBhY2Nlc3MgPSBuZXcgVHJpZUFjY2Vzcyh0eXBlLnR5cGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgxKTsKKworICAgICAgICBTeXN0ZW0ub3V0LmZvcm1hdCgiUHV0dGluZyAlLGRcbiIsIGNvdW50KTsKKyAgICAgICAgbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGZvciAobG9uZyBjdXJyZW50ID0gMDsgY3VycmVudCA8IGNvdW50OyArK2N1cnJlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgbCA9IHJhbmQubmV4dExvbmcoKTsKKyAgICAgICAgICAgIGFjY2Vzcy5wdXQobCwgQnl0ZS52YWx1ZU9mKChieXRlKSAobCA+PiA1NikpKTsKKyAgICAgICAgfQorICAgICAgICB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lOworICAgICAgICBTeXN0ZW0ub3V0LmZvcm1hdCgiVG9vayAlLjNmIHNlY29uZHNcbiIsIHRpbWUgKiAwLjAwMSk7CisgICAgICAgIGFjY2Vzcy5wcmludFNpemUoKTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgVHlwZTxUPgorICAgIHsKKyAgICAgICAgVCBmcm9tTG9uZyhsb25nIGwpOworICAgICAgICBUIGZyb21CeXRlQ29tcGFyYWJsZShCeXRlQ29tcGFyYWJsZSBiYyk7CisgICAgICAgIEJ5dGVDb21wYXJhYmxlIGxvbmdUb0J5dGVDb21wYXJhYmxlKGxvbmcgbCk7CisgICAgICAgIENvbXBhcmF0b3I8VD4gY29tcGFyYXRvcigpOworICAgIH0KKworICAgIHB1YmxpYyBlbnVtIFR5cGVPcHRpb24KKyAgICB7CisgICAgICAgIExPTkcobmV3IExvbmdUeXBlKCkpLAorICAgICAgICBCSUdJTlQobmV3IEJpZ0ludFR5cGUoKSksCisgICAgICAgIERFQ0lNQUwobmV3IEJpZ0RlY2ltYWxUeXBlKCkpLAorICAgICAgICBTVFJJTkdfQkFTRTE2KG5ldyBTdHJpbmdUeXBlKDE2KSksCisgICAgICAgIFNUUklOR19CQVNFMTAobmV3IFN0cmluZ1R5cGUoMTApKSwKKyAgICAgICAgU1RSSU5HX0JBU0U0KG5ldyBTdHJpbmdUeXBlKDQpKSwKKyAgICAgICAgQVJSQVkobmV3IEFycmF5VHlwZSgxKSksCisgICAgICAgIEFSUkFZX1JFUDMobmV3IEFycmF5VHlwZSgzKSksCisgICAgICAgIEFSUkFZX1JFUDcobmV3IEFycmF5VHlwZSg3KSk7CisKKyAgICAgICAgZmluYWwgVHlwZTw/PiB0eXBlOworCisgICAgICAgIFR5cGVPcHRpb24oVHlwZTw/PiB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIExvbmdUeXBlIGltcGxlbWVudHMgVHlwZTxMb25nPgorICAgIHsKKyAgICAgICAgcHVibGljIExvbmcgZnJvbUxvbmcobG9uZyBsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMb25nIGZyb21CeXRlQ29tcGFyYWJsZShCeXRlQ29tcGFyYWJsZSBiYykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2VJbnZlcnNlLmdldFNpZ25lZExvbmcoYmMuYXNDb21wYXJhYmxlQnl0ZXMoQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5PU1M1MCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ5dGVDb21wYXJhYmxlIGxvbmdUb0J5dGVDb21wYXJhYmxlKGxvbmcgbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJ5dGVDb21wYXJhYmxlLm9mKGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbXBhcmF0b3I8TG9uZz4gY29tcGFyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDb21wYXJhdG9yLm5hdHVyYWxPcmRlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEJpZ0ludFR5cGUgaW1wbGVtZW50cyBUeXBlPEJpZ0ludGVnZXI+CisgICAgeworICAgICAgICBwdWJsaWMgQmlnSW50ZWdlciBmcm9tTG9uZyhsb25nIGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCaWdJbnRlZ2VyLnZhbHVlT2YobCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQmlnSW50ZWdlciBmcm9tQnl0ZUNvbXBhcmFibGUoQnl0ZUNvbXBhcmFibGUgYmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyVHlwZS5pbnN0YW5jZS5jb21wb3NlKEludGVnZXJUeXBlLmluc3RhbmNlLmZyb21Db21wYXJhYmxlQnl0ZXMoQnl0ZVNvdXJjZS5wZWVrYWJsZShiYy5hc0NvbXBhcmFibGVCeXRlcyhCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24uT1NTNTApKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCeXRlQ29tcGFyYWJsZSBsb25nVG9CeXRlQ29tcGFyYWJsZShsb25nIGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB2IC0+IEludGVnZXJUeXBlLmluc3RhbmNlLmFzQ29tcGFyYWJsZUJ5dGVzKEludGVnZXJUeXBlLmluc3RhbmNlLmRlY29tcG9zZShmcm9tTG9uZyhsKSksIHYpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbXBhcmF0b3I8QmlnSW50ZWdlcj4gY29tcGFyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDb21wYXJhdG9yLm5hdHVyYWxPcmRlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEJpZ0RlY2ltYWxUeXBlIGltcGxlbWVudHMgVHlwZTxCaWdEZWNpbWFsPgorICAgIHsKKyAgICAgICAgcHVibGljIEJpZ0RlY2ltYWwgZnJvbUxvbmcobG9uZyBsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQmlnRGVjaW1hbC52YWx1ZU9mKGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJpZ0RlY2ltYWwgZnJvbUJ5dGVDb21wYXJhYmxlKEJ5dGVDb21wYXJhYmxlIGJjKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRGVjaW1hbFR5cGUuaW5zdGFuY2UuY29tcG9zZShEZWNpbWFsVHlwZS5pbnN0YW5jZS5mcm9tQ29tcGFyYWJsZUJ5dGVzKEJ5dGVTb3VyY2UucGVla2FibGUoYmMuYXNDb21wYXJhYmxlQnl0ZXMoQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5PU1M1MCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnl0ZUNvbXBhcmFibGUgbG9uZ1RvQnl0ZUNvbXBhcmFibGUobG9uZyBsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdiAtPiBEZWNpbWFsVHlwZS5pbnN0YW5jZS5hc0NvbXBhcmFibGVCeXRlcyhEZWNpbWFsVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoZnJvbUxvbmcobCkpLCB2KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21wYXJhdG9yPEJpZ0RlY2ltYWw+IGNvbXBhcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQ29tcGFyYXRvci5uYXR1cmFsT3JkZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBTdHJpbmdUeXBlIGltcGxlbWVudHMgVHlwZTxTdHJpbmc+CisgICAgeworICAgICAgICBmaW5hbCBpbnQgYmFzZTsKKworICAgICAgICBTdHJpbmdUeXBlKGludCBiYXNlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmJhc2UgPSBiYXNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBmcm9tTG9uZyhsb25nIGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBMb25nLnRvU3RyaW5nKGwsIGJhc2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBmcm9tQnl0ZUNvbXBhcmFibGUoQnl0ZUNvbXBhcmFibGUgYmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKEJ5dGVTb3VyY2VJbnZlcnNlLnJlYWRCeXRlcyhiYy5hc0NvbXBhcmFibGVCeXRlcyhCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwKSksIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ5dGVDb21wYXJhYmxlIGxvbmdUb0J5dGVDb21wYXJhYmxlKGxvbmcgbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJ5dGVDb21wYXJhYmxlLmZpeGVkTGVuZ3RoKGZyb21Mb25nKGwpLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21wYXJhdG9yPFN0cmluZz4gY29tcGFyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDb21wYXJhdG9yLm5hdHVyYWxPcmRlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEFycmF5VHlwZSBpbXBsZW1lbnRzIFR5cGU8Ynl0ZVtdPgorICAgIHsKKyAgICAgICAgZmluYWwgaW50IHJlcHM7CisKKyAgICAgICAgQXJyYXlUeXBlKGludCByZXBzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnJlcHMgPSByZXBzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJ5dGVbXSBmcm9tTG9uZyhsb25nIGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSB2YWx1ZSA9IG5ldyBieXRlWzggKiByZXBzXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmVwczsgKytqKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZVtpICogcmVwcyArIGpdID0gKGJ5dGUpKGwgPj4gKDU2IC0gaSAqIDgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gZnJvbUJ5dGVDb21wYXJhYmxlKEJ5dGVDb21wYXJhYmxlIGJjKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZUludmVyc2UucmVhZEJ5dGVzKGJjLmFzQ29tcGFyYWJsZUJ5dGVzKEJ5dGVDb21wYXJhYmxlLlZlcnNpb24uT1NTNTApKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCeXRlQ29tcGFyYWJsZSBsb25nVG9CeXRlQ29tcGFyYWJsZShsb25nIGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCeXRlQ29tcGFyYWJsZS5maXhlZExlbmd0aChmcm9tTG9uZyhsKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29tcGFyYXRvcjxieXRlW10+IGNvbXBhcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQnl0ZUFycmF5VXRpbDo6Y29tcGFyZVVuc2lnbmVkOworICAgICAgICB9CisgICAgfQorCisgICAgaW50ZXJmYWNlIEFjY2VzczxUPgorICAgIHsKKyAgICAgICAgdm9pZCBwdXQobG9uZyB2LCBieXRlIGIpOworICAgICAgICBieXRlIGdldChsb25nIHYpOworICAgICAgICBJdGVyYWJsZTxCeXRlPiB2YWx1ZXMoKTsKKyAgICAgICAgSXRlcmFibGU8Qnl0ZT4gdmFsdWVzU2xpY2UobG9uZyBsZWZ0LCBib29sZWFuIGluY2x1ZGVMZWZ0LCBsb25nIHJpZ2h0LCBib29sZWFuIGluY2x1ZGVSaWdodCk7CisgICAgICAgIEl0ZXJhYmxlPE1hcC5FbnRyeTxULCBCeXRlPj4gZW50cnlTZXQoKTsKKyAgICAgICAgdm9pZCBjb25zdW1lVmFsdWVzKENvbnN1bWVyPEJ5dGU+IGNvbnN1bWVyKTsKKyAgICAgICAgdm9pZCBjb25zdW1lRW50cmllcyhCaUNvbnN1bWVyPFQsIEJ5dGU+IGNvbnN1bWVyKTsKKyAgICAgICAgdm9pZCBwcmludFNpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZW51bSBNYXBPcHRpb24KKyAgICB7CisgICAgICAgIFRSRUVfTUFQLAorICAgICAgICBDU0xNLAorICAgICAgICBUUklFCisgICAgfQorCisgICAgY2xhc3MgVHJpZUFjY2VzczxUPiBpbXBsZW1lbnRzIEFjY2VzczxUPgorICAgIHsKKyAgICAgICAgZmluYWwgSW5NZW1vcnlUcmllPEJ5dGU+IHRyaWU7CisgICAgICAgIGZpbmFsIFR5cGU8VD4gdHlwZTsKKworICAgICAgICBUcmllQWNjZXNzKFR5cGU8VD4gdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgICAgIHRyaWUgPSBuZXcgSW5NZW1vcnlUcmllPD4oYnVmZmVyVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBwdXQobG9uZyB2LCBieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyaWUucHV0UmVjdXJzaXZlKHR5cGUubG9uZ1RvQnl0ZUNvbXBhcmFibGUodiksIGIsIHJlc29sdmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbk1lbW9yeVRyaWUuU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlIGdldChsb25nIHYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cmllLmdldCh0eXBlLmxvbmdUb0J5dGVDb21wYXJhYmxlKHYpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYWJsZTxCeXRlPiB2YWx1ZXMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJpZS52YWx1ZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYWJsZTxCeXRlPiB2YWx1ZXNTbGljZShsb25nIGxlZnQsIGJvb2xlYW4gaW5jbHVkZUxlZnQsIGxvbmcgcmlnaHQsIGJvb2xlYW4gaW5jbHVkZVJpZ2h0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJpZS5zdWJ0cmllKHR5cGUubG9uZ1RvQnl0ZUNvbXBhcmFibGUobGVmdCksIGluY2x1ZGVMZWZ0LCB0eXBlLmxvbmdUb0J5dGVDb21wYXJhYmxlKHJpZ2h0KSwgaW5jbHVkZVJpZ2h0KQorICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVzKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSXRlcmFibGU8TWFwLkVudHJ5PFQsIEJ5dGU+PiBlbnRyeVNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBJdGVyYWJsZXMudHJhbnNmb3JtKHRyaWUuZW50cnlTZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgZW4gLT4gbmV3IEFic3RyYWN0TWFwLlNpbXBsZUVudHJ5PD4odHlwZS5mcm9tQnl0ZUNvbXBhcmFibGUoZW4uZ2V0S2V5KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbi5nZXRWYWx1ZSgpKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjb25zdW1lVmFsdWVzKENvbnN1bWVyPEJ5dGU+IGNvbnN1bWVyKQorICAgICAgICB7CisgICAgICAgICAgICB0cmllLmZvckVhY2hWYWx1ZShjb25zdW1lcjo6YWNjZXB0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbnN1bWVFbnRyaWVzKEJpQ29uc3VtZXI8VCwgQnl0ZT4gY29uc3VtZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyaWUuZm9yRWFjaEVudHJ5KChrZXksIHZhbHVlKSAtPiBjb25zdW1lci5hY2NlcHQodHlwZS5mcm9tQnl0ZUNvbXBhcmFibGUoa2V5KSwgdmFsdWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHByaW50U2l6ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgZGVlcHNpemUgPSBtZXRlci5tZWFzdXJlRGVlcCh0cmllKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQuZm9ybWF0KCJUcmllIHNpemUgb24gaGVhcCAlLGQgb2ZmIGhlYXAgJSxkIGRlZXAgc2l6ZSAlLGRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmllLnNpemVPbkhlYXAoKSwgdHJpZS5zaXplT2ZmSGVhcCgpLCBkZWVwc2l6ZSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LmZvcm1hdCgicGVyIGVudHJ5IG9uIGhlYXAgJS4yZiBvZmYgaGVhcCAlLjJmIGRlZXAgc2l6ZSAlLjJmXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZS5zaXplT25IZWFwKCkgKiAxLjAgLyBjb3VudCwgdHJpZS5zaXplT2ZmSGVhcCgpICogMS4wIC8gY291bnQsIGRlZXBzaXplICogMS4wIC8gY291bnQpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgTmF2aWdhYmxlTWFwQWNjZXNzPFQ+IGltcGxlbWVudHMgQWNjZXNzPFQ+CisgICAgeworICAgICAgICBmaW5hbCBOYXZpZ2FibGVNYXA8VCwgQnl0ZT4gbmF2aWdhYmxlTWFwOworICAgICAgICBmaW5hbCBUeXBlPFQ+IHR5cGU7CisKKyAgICAgICAgTmF2aWdhYmxlTWFwQWNjZXNzKE5hdmlnYWJsZU1hcDxULCBCeXRlPiBuYXZpZ2FibGVNYXAsIFR5cGU8VD4gdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5uYXZpZ2FibGVNYXAgPSBuYXZpZ2FibGVNYXA7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcHV0KGxvbmcgdiwgYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBuYXZpZ2FibGVNYXAucHV0KHR5cGUuZnJvbUxvbmcodiksIGIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJ5dGUgZ2V0KGxvbmcgdikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5hdmlnYWJsZU1hcC5nZXQodHlwZS5mcm9tTG9uZyh2KSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSXRlcmFibGU8Qnl0ZT4gdmFsdWVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5hdmlnYWJsZU1hcC52YWx1ZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYWJsZTxCeXRlPiB2YWx1ZXNTbGljZShsb25nIGxlZnQsIGJvb2xlYW4gaW5jbHVkZUxlZnQsIGxvbmcgcmlnaHQsIGJvb2xlYW4gaW5jbHVkZVJpZ2h0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmF2aWdhYmxlTWFwLnN1Yk1hcCh0eXBlLmZyb21Mb25nKGxlZnQpLCBpbmNsdWRlTGVmdCwgdHlwZS5mcm9tTG9uZyhyaWdodCksIGluY2x1ZGVSaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVzKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSXRlcmFibGU8TWFwLkVudHJ5PFQsIEJ5dGU+PiBlbnRyeVNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuYXZpZ2FibGVNYXAuZW50cnlTZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbnN1bWVWYWx1ZXMoQ29uc3VtZXI8Qnl0ZT4gY29uc3VtZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5hdmlnYWJsZU1hcC52YWx1ZXMoKS5mb3JFYWNoKGNvbnN1bWVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbnN1bWVFbnRyaWVzKEJpQ29uc3VtZXI8VCwgQnl0ZT4gY29uc3VtZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5hdmlnYWJsZU1hcC5mb3JFYWNoKGNvbnN1bWVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHByaW50U2l6ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgc2l6ZSA9IG1ldGVyLm1lYXN1cmVEZWVwKG5hdmlnYWJsZU1hcCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LmZvcm1hdChtYXAgKyAiIHNpemUgb24gaGVhcCAlLGRcbiIsIHNpemUpOworICAgICAgICAgICAgU3lzdGVtLm91dC5mb3JtYXQoInBlciBlbnRyeSBvbiBoZWFwICUuMmZcbiIsIHNpemUgKiAxLjAgLyBjb3VudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIHZvaWQgZ2V0UmFuZG9tKCkKKyAgICB7CisgICAgICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgxKTsKKworICAgICAgICBmb3IgKGxvbmcgY3VycmVudCA9IDA7IGN1cnJlbnQgPCBjb3VudDsgKytjdXJyZW50KQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGwgPSByYW5kLm5leHRMb25nKCk7CisgICAgICAgICAgICBCeXRlIHJlcyA9IGFjY2Vzcy5nZXQobCk7CisgICAgICAgICAgICBpZiAocmVzLmJ5dGVWYWx1ZSgpICE9IGwgPj4gNTYpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIGludCBpdGVyYXRlVmFsdWVzKCkKKyAgICB7CisgICAgICAgIGludCBzdW0gPSAwOworICAgICAgICBmb3IgKGJ5dGUgYiA6IGFjY2Vzcy52YWx1ZXMoKSkKKyAgICAgICAgICAgIHN1bSArPSBiOworICAgICAgICByZXR1cm4gc3VtOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgaW50IGNvbnN1bWVWYWx1ZXMoKQorICAgIHsKKyAgICAgICAgY2xhc3MgQ291bnRlciBpbXBsZW1lbnRzIENvbnN1bWVyPEJ5dGU+CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzdW0gPSAwOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjY2VwdChCeXRlIGFCeXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN1bSArPSBhQnl0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBDb3VudGVyIGNvdW50ZXIgPSBuZXcgQ291bnRlcigpOworICAgICAgICBhY2Nlc3MuY29uc3VtZVZhbHVlcyhjb3VudGVyKTsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXIuc3VtOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgaW50IGNvbnN1bWVFbnRyaWVzKCkKKyAgICB7CisgICAgICAgIGNsYXNzIENvdW50ZXI8VD4gaW1wbGVtZW50cyBCaUNvbnN1bWVyPFQsIEJ5dGU+CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzdW0gPSAwOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjY2VwdChUIGtleSwgQnl0ZSBhQnl0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdW0gKz0gYUJ5dGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ291bnRlciBjb3VudGVyID0gbmV3IENvdW50ZXIoKTsKKyAgICAgICAgYWNjZXNzLmNvbnN1bWVFbnRyaWVzKGNvdW50ZXIpOworICAgICAgICByZXR1cm4gY291bnRlci5zdW07CisgICAgfQorCisgICAgQEJlbmNobWFyaworICAgIHB1YmxpYyBpbnQgaXRlcmF0ZUVudHJpZXMoKQorICAgIHsKKyAgICAgICAgaW50IHN1bSA9IDA7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PD8sIEJ5dGU+IGVuIDogYWNjZXNzLmVudHJ5U2V0KCkpCisgICAgICAgICAgICBzdW0gKz0gZW4uZ2V0VmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIHN1bTsKKyAgICB9CisKKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgaW50IGdldEJ5SXRlcmF0ZVZhbHVlU2xpY2UoKQorICAgIHsKKyAgICAgICAgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKDEpOworICAgICAgICBpbnQgc3VtID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIHYgPSByYW5kLm5leHRMb25nKCk7CisgICAgICAgICAgICBJdGVyYWJsZTxCeXRlPiB2YWx1ZXMgPSBhY2Nlc3MudmFsdWVzU2xpY2UodiwgdHJ1ZSwgdiwgdHJ1ZSk7CisgICAgICAgICAgICBmb3IgKGJ5dGUgYiA6IHZhbHVlcykKKyAgICAgICAgICAgICAgICBzdW0gKz0gYjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VtOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgaW50IGl0ZXJhdGVWYWx1ZXNMaW1pdGVkKCkKKyAgICB7CisgICAgICAgIGludCBzdW0gPSAwOworICAgICAgICBJdGVyYWJsZTxCeXRlPiB2YWx1ZXMgPSBhY2Nlc3MudmFsdWVzU2xpY2UoMEwsIGZhbHNlLCBMb25nLk1BWF9WQUxVRSAvIDIsIHRydWUpOyAvLyAxLzQKKyAgICAgICAgZm9yIChieXRlIGIgOiB2YWx1ZXMpCisgICAgICAgICAgICBzdW0gKz0gYjsKKyAgICAgICAgcmV0dXJuIHN1bTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL3RyaWVzL0luTWVtb3J5VHJpZVJlYWRCZW5jaC5qYXZhIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC90cmllcy9Jbk1lbW9yeVRyaWVSZWFkQmVuY2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmYyZTRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC90cmllcy9Jbk1lbW9yeVRyaWVSZWFkQmVuY2guamF2YQpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudGVzdC5taWNyb2JlbmNoLnRyaWVzOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaUNvbnN1bWVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXMuSW5NZW1vcnlUcmllOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzLlRyaWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXMuVHJpZUVudHJpZXNXYWxrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQnVmZmVyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuKjsKKworQEJlbmNobWFya01vZGUoTW9kZS5BdmVyYWdlVGltZSkKK0BPdXRwdXRUaW1lVW5pdChUaW1lVW5pdC5NSUxMSVNFQ09ORFMpCitAV2FybXVwKGl0ZXJhdGlvbnMgPSA1LCB0aW1lID0gMSkKK0BNZWFzdXJlbWVudChpdGVyYXRpb25zID0gNSwgdGltZSA9IDEpCitARm9yayh2YWx1ZSA9IDEsanZtQXJnc0FwcGVuZCA9IHsgIi1YbXg0RyIsICItWG1zNEciLCAiLURqbWguZXhlY3V0b3I9Q1VTVE9NIiwgIi1Eam1oLmV4ZWN1dG9yLmNsYXNzPW9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRlc3QubWljcm9iZW5jaC5GYXN0VGhyZWFkRXhlY3V0b3IifSkKK0BUaHJlYWRzKDEpIC8vIG5vIGNvbmN1cnJlbnQgd3JpdGVzCitAU3RhdGUoU2NvcGUuQmVuY2htYXJrKQorcHVibGljIGNsYXNzIEluTWVtb3J5VHJpZVJlYWRCZW5jaAoreworICAgIEBQYXJhbSh7Ik9OX0hFQVAiLCAiT0ZGX0hFQVAifSkKKyAgICBCdWZmZXJUeXBlIGJ1ZmZlclR5cGUgPSBCdWZmZXJUeXBlLk9GRl9IRUFQOworCisgICAgQFBhcmFtKHsiMTAwMCIsICIxMDAwMDAiLCAiMTAwMDAwMDAifSkKKyAgICBpbnQgY291bnQgPSAxMDAwOworCisgICAgZmluYWwgc3RhdGljIEluTWVtb3J5VHJpZS5VcHNlcnRUcmFuc2Zvcm1lcjxCeXRlLCBCeXRlPiByZXNvbHZlciA9ICh4LCB5KSAtPiB5OworCisgICAgSW5NZW1vcnlUcmllPEJ5dGU+IHRyaWU7CisKKyAgICBAU2V0dXAoTGV2ZWwuVHJpYWwpCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICB0cmllID0gbmV3IEluTWVtb3J5VHJpZTw+KGJ1ZmZlclR5cGUpOworICAgICAgICBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oMSk7CisKKyAgICAgICAgU3lzdGVtLm91dC5mb3JtYXQoIlB1dHRpbmcgJSxkXG4iLCBjb3VudCk7CisgICAgICAgIGZvciAobG9uZyBjdXJyZW50ID0gMDsgY3VycmVudCA8IGNvdW50OyArK2N1cnJlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgbCA9IHJhbmQubmV4dExvbmcoKTsKKyAgICAgICAgICAgIHRyaWUucHV0UmVjdXJzaXZlKEJ5dGVDb21wYXJhYmxlLm9mKGwpLCBCeXRlLnZhbHVlT2YoKGJ5dGUpIChsID4+IDU2KSksIHJlc29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LmZvcm1hdCgiVHJpZSBzaXplIG9uIGhlYXAgJSxkIG9mZiBoZWFwICUsZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZS5zaXplT25IZWFwKCksIHRyaWUuc2l6ZU9mZkhlYXAoKSk7CisgICAgICAgIFN5c3RlbS5vdXQuZm9ybWF0KCJwZXIgZW50cnkgb24gaGVhcCAlLjJmIG9mZiBoZWFwICUuMmZcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWUuc2l6ZU9uSGVhcCgpICogMS4wIC8gY291bnQsIHRyaWUuc2l6ZU9mZkhlYXAoKSAqIDEuMCAvIGNvdW50KTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIHZvaWQgZ2V0UmFuZG9tKCkKKyAgICB7CisgICAgICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgxKTsKKworICAgICAgICBmb3IgKGxvbmcgY3VycmVudCA9IDA7IGN1cnJlbnQgPCBjb3VudDsgKytjdXJyZW50KQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGwgPSByYW5kLm5leHRMb25nKCk7CisgICAgICAgICAgICBCeXRlIHJlcyA9IHRyaWUuZ2V0KEJ5dGVDb21wYXJhYmxlLm9mKGwpKTsKKyAgICAgICAgICAgIGlmIChyZXMuYnl0ZVZhbHVlKCkgIT0gbCA+PiA1NikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgaW50IGl0ZXJhdGVWYWx1ZXMoKQorICAgIHsKKyAgICAgICAgaW50IHN1bSA9IDA7CisgICAgICAgIGZvciAoYnl0ZSBiIDogdHJpZS52YWx1ZXMoKSkKKyAgICAgICAgICAgIHN1bSArPSBiOworICAgICAgICByZXR1cm4gc3VtOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgaW50IGNvbnN1bWVWYWx1ZXMoKQorICAgIHsKKyAgICAgICAgY2xhc3MgQ291bnRlciBpbXBsZW1lbnRzIFRyaWUuVmFsdWVDb25zdW1lcjxCeXRlPgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc3VtID0gMDsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoQnl0ZSBhQnl0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdW0gKz0gYUJ5dGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ291bnRlciBjb3VudGVyID0gbmV3IENvdW50ZXIoKTsKKyAgICAgICAgdHJpZS5mb3JFYWNoVmFsdWUoY291bnRlcik7CisgICAgICAgIHJldHVybiBjb3VudGVyLnN1bTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIGludCBjb25zdW1lRW50cmllcygpCisgICAgeworICAgICAgICBjbGFzcyBDb3VudGVyIGltcGxlbWVudHMgQmlDb25zdW1lcjxCeXRlQ29tcGFyYWJsZSwgQnl0ZT4KKyAgICAgICAgeworICAgICAgICAgICAgaW50IHN1bSA9IDA7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KEJ5dGVDb21wYXJhYmxlIGJ5dGVDb21wYXJhYmxlLCBCeXRlIGFCeXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN1bSArPSBhQnl0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBDb3VudGVyIGNvdW50ZXIgPSBuZXcgQ291bnRlcigpOworICAgICAgICB0cmllLmZvckVhY2hFbnRyeShjb3VudGVyKTsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXIuc3VtOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgaW50IHByb2Nlc3NFbnRyaWVzKCkKKyAgICB7CisgICAgICAgIGNsYXNzIENvdW50ZXIgZXh0ZW5kcyBUcmllRW50cmllc1dhbGtlcjxCeXRlLCBWb2lkPgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc3VtID0gMDsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb250ZW50KEJ5dGUgY29udGVudCwgYnl0ZVtdIGJ5dGVzLCBpbnQgYnl0ZUxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdW0gKz0gY29udGVudDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgVm9pZCBjb21wbGV0ZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ291bnRlciBjb3VudGVyID0gbmV3IENvdW50ZXIoKTsKKyAgICAgICAgdHJpZS5wcm9jZXNzKGNvdW50ZXIpOworICAgICAgICByZXR1cm4gY291bnRlci5zdW07CisgICAgfQorCisgICAgQEJlbmNobWFyaworICAgIHB1YmxpYyBpbnQgaXRlcmF0ZVZhbHVlc1Vub3JkZXJlZCgpCisgICAgeworICAgICAgICBpbnQgc3VtID0gMDsKKyAgICAgICAgZm9yIChieXRlIGIgOiB0cmllLnZhbHVlc1Vub3JkZXJlZCgpKQorICAgICAgICAgICAgc3VtICs9IGI7CisgICAgICAgIHJldHVybiBzdW07CisgICAgfQorCisgICAgQEJlbmNobWFyaworICAgIHB1YmxpYyBpbnQgaXRlcmF0ZUVudHJpZXMoKQorICAgIHsKKyAgICAgICAgaW50IHN1bSA9IDA7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PEJ5dGVDb21wYXJhYmxlLCBCeXRlPiBlbiA6IHRyaWUuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIHN1bSArPSBlbi5nZXRWYWx1ZSgpOworICAgICAgICByZXR1cm4gc3VtOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgaW50IGl0ZXJhdGVWYWx1ZXNMaW1pdGVkKCkKKyAgICB7CisgICAgICAgIEl0ZXJhYmxlPEJ5dGU+IHZhbHVlcyA9IHRyaWUuc3VidHJpZShCeXRlQ29tcGFyYWJsZS5vZigwTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUub2YoTG9uZy5NQVhfVkFMVUUgLyAyKSwgICAgICAgICAvLyAxLzQgb2YgYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZXMoKTsKKyAgICAgICAgaW50IHN1bSA9IDA7CisgICAgICAgIGZvciAoYnl0ZSBiIDogdmFsdWVzKQorICAgICAgICAgICAgc3VtICs9IGI7CisgICAgICAgIHJldHVybiBzdW07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC90cmllcy9Jbk1lbW9yeVRyaWVVbmlvbkJlbmNoLmphdmEgYi90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL3RyaWVzL0luTWVtb3J5VHJpZVVuaW9uQmVuY2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzJlMjBmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC90cmllcy9Jbk1lbW9yeVRyaWVVbmlvbkJlbmNoLmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRlc3QubWljcm9iZW5jaC50cmllczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllcy5Jbk1lbW9yeVRyaWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXMuVHJpZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzcy5CdWZmZXJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy4qOworCitAQmVuY2htYXJrTW9kZShNb2RlLkF2ZXJhZ2VUaW1lKQorQE91dHB1dFRpbWVVbml0KFRpbWVVbml0Lk1JTExJU0VDT05EUykKK0BXYXJtdXAoaXRlcmF0aW9ucyA9IDUsIHRpbWUgPSAxKQorQE1lYXN1cmVtZW50KGl0ZXJhdGlvbnMgPSA1LCB0aW1lID0gMSkKK0BGb3JrKHZhbHVlID0gMSxqdm1BcmdzQXBwZW5kID0geyAiLVhteDRHIiwgIi1YbXM0RyIsICItRGptaC5leGVjdXRvcj1DVVNUT00iLCAiLURqbWguZXhlY3V0b3IuY2xhc3M9b3JnLmFwYWNoZS5jYXNzYW5kcmEudGVzdC5taWNyb2JlbmNoLkZhc3RUaHJlYWRFeGVjdXRvciJ9KQorQFRocmVhZHMoMSkgLy8gbm8gY29uY3VycmVudCB3cml0ZXMKK0BTdGF0ZShTY29wZS5CZW5jaG1hcmspCitwdWJsaWMgY2xhc3MgSW5NZW1vcnlUcmllVW5pb25CZW5jaAoreworICAgIEBQYXJhbSh7Ik9OX0hFQVAiLCAiT0ZGX0hFQVAifSkKKyAgICBCdWZmZXJUeXBlIGJ1ZmZlclR5cGUgPSBCdWZmZXJUeXBlLk9GRl9IRUFQOworCisgICAgQFBhcmFtKHsiMTAwMCIsICIxMDAwMDAiLCAiMTAwMDAwMDAifSkKKyAgICBpbnQgY291bnQgPSAxMDAwOworCisgICAgQFBhcmFtKHsiMiIsICIzIiwgIjgifSkKKyAgICBpbnQgc291cmNlcyA9IDI7CisKKyAgICBAUGFyYW0oeyJmYWxzZSIsICJ0cnVlIn0pCisgICAgYm9vbGVhbiBzZXF1ZW50aWFsID0gdHJ1ZTsKKworICAgIGZpbmFsIHN0YXRpYyBJbk1lbW9yeVRyaWUuVXBzZXJ0VHJhbnNmb3JtZXI8Qnl0ZSwgQnl0ZT4gcmVzb2x2ZXIgPSAoeCwgeSkgLT4geTsKKworICAgIFRyaWU8Qnl0ZT4gdHJpZTsKKworICAgIEBTZXR1cChMZXZlbC5UcmlhbCkKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIExpc3Q8SW5NZW1vcnlUcmllPEJ5dGU+PiB0cmllcyA9IG5ldyBBcnJheUxpc3Q8Pihzb3VyY2VzKTsKKyAgICAgICAgU3lzdGVtLm91dC5mb3JtYXQoIlB1dHRpbmcgJSxkIGFtb25nICVkIHRyaWVzXG4iLCBjb3VudCwgc291cmNlcyk7CisgICAgICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgxKTsKKyAgICAgICAgaWYgKHNlcXVlbnRpYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgc3ogPSA2NTUzNiAvIHNvdXJjZXM7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZXM7ICsraSkKKyAgICAgICAgICAgICAgICB0cmllcy5hZGQobmV3IEluTWVtb3J5VHJpZTw+KGJ1ZmZlclR5cGUpKTsKKworICAgICAgICAgICAgZm9yIChsb25nIGN1cnJlbnQgPSAwOyBjdXJyZW50IDwgY291bnQ7ICsrY3VycmVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIGwgPSByYW5kLm5leHRMb25nKCk7CisgICAgICAgICAgICAgICAgSW5NZW1vcnlUcmllPEJ5dGU+IHR0ID0gdHJpZXMuZ2V0KE1hdGgubWluKChpbnQpICgoKGwgPj4gNDgpICsgMzI3NjgpIC8gc3opLCBzb3VyY2VzIC0gMSkpOworICAgICAgICAgICAgICAgIHR0LnB1dFJlY3Vyc2l2ZShCeXRlQ29tcGFyYWJsZS5vZihsKSwgKGJ5dGUpIChsID4+IDU2KSwgcmVzb2x2ZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGN1cnJlbnQgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VzOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5NZW1vcnlUcmllPEJ5dGU+IHRyaWUgPSBuZXcgSW5NZW1vcnlUcmllKGJ1ZmZlclR5cGUpOworICAgICAgICAgICAgICAgIGludCBjdXJyTWF4ID0gdGhpcy5jb3VudCAqIChpICsgMSkgLyBzb3VyY2VzOworCisgICAgICAgICAgICAgICAgZm9yICg7IGN1cnJlbnQgPCBjdXJyTWF4OyArK2N1cnJlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb25nIGwgPSByYW5kLm5leHRMb25nKCk7CisgICAgICAgICAgICAgICAgICAgIHRyaWUucHV0UmVjdXJzaXZlKEJ5dGVDb21wYXJhYmxlLm9mKGwpLCAoYnl0ZSkgKGwgPj4gNTYpLCByZXNvbHZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyaWVzLmFkZCh0cmllKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoSW5NZW1vcnlUcmllPEJ5dGU+IHRyaWUgOiB0cmllcykKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLm91dC5mb3JtYXQoIlRyaWUgc2l6ZSBvbiBoZWFwICUsZCBvZmYgaGVhcCAlLGRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmllLnNpemVPbkhlYXAoKSwgdHJpZS5zaXplT2ZmSGVhcCgpKTsKKyAgICAgICAgfQorICAgICAgICB0cmllID0gVHJpZS5tZXJnZURpc3RpbmN0KHRyaWVzKTsKKworICAgICAgICBTeXN0ZW0ub3V0LmZvcm1hdCgiQWN0dWFsIGNvdW50ICUsZFxuIiwgSXRlcmFibGVzLnNpemUodHJpZS52YWx1ZXMoKSkpOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgaW50IGl0ZXJhdGVWYWx1ZXMoKQorICAgIHsKKyAgICAgICAgaW50IHN1bSA9IDA7CisgICAgICAgIGZvciAoYnl0ZSBiIDogdHJpZS52YWx1ZXMoKSkKKyAgICAgICAgICAgIHN1bSArPSBiOworICAgICAgICByZXR1cm4gc3VtOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgaW50IGl0ZXJhdGVWYWx1ZXNVbm9yZGVyZWQoKQorICAgIHsKKyAgICAgICAgaW50IHN1bSA9IDA7CisgICAgICAgIGZvciAoYnl0ZSBiIDogdHJpZS52YWx1ZXNVbm9yZGVyZWQoKSkKKyAgICAgICAgICAgIHN1bSArPSBiOworICAgICAgICByZXR1cm4gc3VtOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgaW50IGl0ZXJhdGVFbnRyaWVzKCkKKyAgICB7CisgICAgICAgIGludCBzdW0gPSAwOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxCeXRlQ29tcGFyYWJsZSwgQnl0ZT4gZW4gOiB0cmllLmVudHJ5U2V0KCkpCisgICAgICAgICAgICBzdW0gKz0gZW4uZ2V0VmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIHN1bTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIGludCBpdGVyYXRlVmFsdWVzTGltaXRlZCgpCisgICAgeworICAgICAgICBJdGVyYWJsZTxCeXRlPiB2YWx1ZXMgPSB0cmllLnN1YnRyaWUoQnl0ZUNvbXBhcmFibGUub2YoMEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlLm9mKExvbmcuTUFYX1ZBTFVFIC8gMiksICAgICAgICAgLy8gMS80IG9mIGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVzKCk7CisgICAgICAgIGludCBzdW0gPSAwOworICAgICAgICBmb3IgKGJ5dGUgYiA6IHZhbHVlcykKKyAgICAgICAgICAgIHN1bSArPSBiOworICAgICAgICByZXR1cm4gc3VtOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvdHJpZXMvSW5NZW1vcnlUcmllV3JpdGVCZW5jaC5qYXZhIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC90cmllcy9Jbk1lbW9yeVRyaWVXcml0ZUJlbmNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJiZTExZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvdHJpZXMvSW5NZW1vcnlUcmllV3JpdGVCZW5jaC5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS50ZXN0Lm1pY3JvYmVuY2gudHJpZXM7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllcy5Jbk1lbW9yeVRyaWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQnVmZmVyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuKjsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguaW5mcmEuQmxhY2tob2xlOworCitAQmVuY2htYXJrTW9kZShNb2RlLkF2ZXJhZ2VUaW1lKQorQE91dHB1dFRpbWVVbml0KFRpbWVVbml0Lk1JTExJU0VDT05EUykKK0BXYXJtdXAoaXRlcmF0aW9ucyA9IDUsIHRpbWUgPSAxKQorQE1lYXN1cmVtZW50KGl0ZXJhdGlvbnMgPSA1LCB0aW1lID0gMSkKK0BGb3JrKHZhbHVlID0gMSxqdm1BcmdzQXBwZW5kID0geyAiLVhteDRHIiwgIi1YbXM0RyIsICItRGptaC5leGVjdXRvcj1DVVNUT00iLCAiLURqbWguZXhlY3V0b3IuY2xhc3M9b3JnLmFwYWNoZS5jYXNzYW5kcmEudGVzdC5taWNyb2JlbmNoLkZhc3RUaHJlYWRFeGVjdXRvciJ9KQorQFRocmVhZHMoMSkgLy8gbm8gY29uY3VycmVudCB3cml0ZXMKK0BTdGF0ZShTY29wZS5CZW5jaG1hcmspCitwdWJsaWMgY2xhc3MgSW5NZW1vcnlUcmllV3JpdGVCZW5jaAoreworICAgIEBQYXJhbSh7Ik9OX0hFQVAiLCAiT0ZGX0hFQVAifSkKKyAgICBCdWZmZXJUeXBlIGJ1ZmZlclR5cGUgPSBCdWZmZXJUeXBlLk9GRl9IRUFQOworCisgICAgQFBhcmFtKHsiMTAwMCIsICIxMDAwMDAiLCAiMTAwMDAwMDAifSkKKyAgICBpbnQgY291bnQgPSAxMDAwOworCisgICAgQFBhcmFtKHsiOCJ9KQorICAgIGludCBrZXlMZW5ndGggPSA4OworCisgICAgZmluYWwgc3RhdGljIEluTWVtb3J5VHJpZS5VcHNlcnRUcmFuc2Zvcm1lcjxCeXRlLCBCeXRlPiByZXNvbHZlciA9ICh4LCB5KSAtPiB5OworCisgICAgLy8gU2V0IHRoaXMgdG8gdHJ1ZSB0byBwcmludCB0aGUgdHJpZSBzaXplcyBhZnRlciBpbnNlcnRpb25zIGZvciBzYW5pdHkgY2hlY2tpbmcuCisgICAgLy8gVGhpcyBtaWdodCBhZmZlY3QgdGhlIHRpbWluZ3MsIGRvIG5vdCBjb21taXQgd2l0aCB0aGlzIHNldCB0byB0cnVlLgorICAgIGZpbmFsIHN0YXRpYyBib29sZWFuIFBSSU5UX1NJWkVTID0gZmFsc2U7CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIHZvaWQgcHV0U2VxdWVudGlhbChCbGFja2hvbGUgYmgpIHRocm93cyBJbk1lbW9yeVRyaWUuU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEluTWVtb3J5VHJpZTxCeXRlPiB0cmllID0gbmV3IEluTWVtb3J5VHJpZShidWZmZXJUeXBlKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGtleUxlbmd0aCk7CisKKyAgICAgICAgZm9yIChsb25nIGN1cnJlbnQgPSAwOyBjdXJyZW50IDwgY291bnQ7ICsrY3VycmVudCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBsID0gY3VycmVudDsKKyAgICAgICAgICAgIGJ1Zi5wdXRMb25nKGtleUxlbmd0aCAtIDgsIGwpOworICAgICAgICAgICAgdHJpZS5wdXRSZWN1cnNpdmUoQnl0ZUNvbXBhcmFibGUuZml4ZWRMZW5ndGgoYnVmKSwgQnl0ZS52YWx1ZU9mKChieXRlKSAobCA+PiA1NikpLCByZXNvbHZlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFBSSU5UX1NJWkVTKQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRyaWUudmFsdWVzQ291bnQoKSk7CisgICAgICAgIGJoLmNvbnN1bWUodHJpZSk7CisgICAgfQorCisgICAgQEJlbmNobWFyaworICAgIHB1YmxpYyB2b2lkIHB1dFJhbmRvbShCbGFja2hvbGUgYmgpIHRocm93cyBJbk1lbW9yeVRyaWUuU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEluTWVtb3J5VHJpZTxCeXRlPiB0cmllID0gbmV3IEluTWVtb3J5VHJpZShidWZmZXJUeXBlKTsKKyAgICAgICAgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKDEpOworICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVba2V5TGVuZ3RoXTsKKworICAgICAgICBmb3IgKGxvbmcgY3VycmVudCA9IDA7IGN1cnJlbnQgPCBjb3VudDsgKytjdXJyZW50KQorICAgICAgICB7CisgICAgICAgICAgICByYW5kLm5leHRCeXRlcyhidWYpOworICAgICAgICAgICAgdHJpZS5wdXRSZWN1cnNpdmUoQnl0ZUNvbXBhcmFibGUuZml4ZWRMZW5ndGgoYnVmKSwgQnl0ZS52YWx1ZU9mKGJ1ZlswXSksIHJlc29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUFJJTlRfU0laRVMpCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odHJpZS52YWx1ZXNDb3VudCgpKTsKKyAgICAgICAgYmguY29uc3VtZSh0cmllKTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIHZvaWQgYXBwbHlTZXF1ZW50aWFsKEJsYWNraG9sZSBiaCkgdGhyb3dzIEluTWVtb3J5VHJpZS5TcGFjZUV4aGF1c3RlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgSW5NZW1vcnlUcmllPEJ5dGU+IHRyaWUgPSBuZXcgSW5NZW1vcnlUcmllKGJ1ZmZlclR5cGUpOworICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoa2V5TGVuZ3RoKTsKKworICAgICAgICBmb3IgKGxvbmcgY3VycmVudCA9IDA7IGN1cnJlbnQgPCBjb3VudDsgKytjdXJyZW50KQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGwgPSBjdXJyZW50OworICAgICAgICAgICAgYnVmLnB1dExvbmcoa2V5TGVuZ3RoIC0gOCwgbCk7CisgICAgICAgICAgICB0cmllLnB1dFNpbmdsZXRvbihCeXRlQ29tcGFyYWJsZS5maXhlZExlbmd0aChidWYpLCBCeXRlLnZhbHVlT2YoKGJ5dGUpIChsID4+IDU2KSksIHJlc29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUFJJTlRfU0laRVMpCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odHJpZS52YWx1ZXNDb3VudCgpKTsKKyAgICAgICAgYmguY29uc3VtZSh0cmllKTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIHZvaWQgYXBwbHlSYW5kb20oQmxhY2tob2xlIGJoKSB0aHJvd3MgSW5NZW1vcnlUcmllLlNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBJbk1lbW9yeVRyaWU8Qnl0ZT4gdHJpZSA9IG5ldyBJbk1lbW9yeVRyaWUoYnVmZmVyVHlwZSk7CisgICAgICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgxKTsKKyAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW2tleUxlbmd0aF07CisKKyAgICAgICAgZm9yIChsb25nIGN1cnJlbnQgPSAwOyBjdXJyZW50IDwgY291bnQ7ICsrY3VycmVudCkKKyAgICAgICAgeworICAgICAgICAgICAgcmFuZC5uZXh0Qnl0ZXMoYnVmKTsKKyAgICAgICAgICAgIHRyaWUucHV0U2luZ2xldG9uKEJ5dGVDb21wYXJhYmxlLmZpeGVkTGVuZ3RoKGJ1ZiksIEJ5dGUudmFsdWVPZihidWZbMF0pLCByZXNvbHZlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFBSSU5UX1NJWkVTKQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRyaWUudmFsdWVzQ291bnQoKSk7CisgICAgICAgIGJoLmNvbnN1bWUodHJpZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9zaW11bGF0b3IvYXNtL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9hc20vQ2xhc3NUcmFuc2Zvcm1lci5qYXZhIGIvdGVzdC9zaW11bGF0b3IvYXNtL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9hc20vQ2xhc3NUcmFuc2Zvcm1lci5qYXZhCmluZGV4IDZlNmIwZDMuLjc3OGU0NGMgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc2ltdWxhdG9yL2FzbS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvYXNtL0NsYXNzVHJhbnNmb3JtZXIuamF2YQorKysgYi90ZXN0L3NpbXVsYXRvci9hc20vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL2FzbS9DbGFzc1RyYW5zZm9ybWVyLmphdmEKQEAgLTExMCw2ICsxMTAsOCBAQAogICAgIHByaXZhdGUgZmluYWwgRW51bVNldDxGbGFnPiBmbGFnczsKICAgICBwcml2YXRlIGZpbmFsIENvbnN1bWVyPFN0cmluZz4gZGVwZW5kZW50VHlwZXM7CiAKKyAgICBwcml2YXRlIGJvb2xlYW4gdXBkYXRlVmlzaWJpbGl0eSA9IGZhbHNlOworCiAgICAgQ2xhc3NUcmFuc2Zvcm1lcihpbnQgYXBpLCBTdHJpbmcgY2xhc3NOYW1lLCBFbnVtU2V0PEZsYWc+IGZsYWdzLCBDb25zdW1lcjxTdHJpbmc+IGRlcGVuZGVudFR5cGVzKQogICAgIHsKICAgICAgICAgdGhpcyhhcGksIG5ldyBDbGFzc1dyaXRlcigwKSwgY2xhc3NOYW1lLCBmbGFncywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgZGVwZW5kZW50VHlwZXMpOwpAQCAtMTM3LDEyICsxMzksNTggQEAKICAgICAgICAgdGhpcy5tZXRob2RMb2dnZXIgPSBNZXRob2RMb2dnZXIubG9nKGFwaSwgY2xhc3NOYW1lKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzZXRVcGRhdGVWaXNpYmlsaXR5KGJvb2xlYW4gdXBkYXRlVmlzaWJpbGl0eSkKKyAgICB7CisgICAgICAgIHRoaXMudXBkYXRlVmlzaWJpbGl0eSA9IHVwZGF0ZVZpc2liaWxpdHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSmF2YSAxMSBjaGFuZ2VkIHRoZSB3YXkgdGhhdCBjbGFzc2VzIGRlZmluZWQgaW4gdGhlIHNhbWUgc291cmNlIGZpbGUgZ2V0IGFjY2VzcyB0byBwcml2YXRlIHN0YXRlIChzZWUgaHR0cHM6Ly9vcGVuamRrLm9yZy9qZXBzLzE4MSksCisgICAgICogcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGFkYXB0IHRvIHRoaXMsIHRoaXMgbWV0aG9kIGF0dGVtcHRzIHRvIG1ha2UgdGhlIGZpZWxkL21ldGhvZC9jbGFzcyBwdWJsaWMgc28gdGhhdCBhY2Nlc3MKKyAgICAgKiBpcyBub3QgcmVzdHJpY3RlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtYWtlUHVibGljKGludCBhY2Nlc3MpCisgICAgeworICAgICAgICBpZiAoIXVwZGF0ZVZpc2liaWxpdHkpCisgICAgICAgICAgICByZXR1cm4gYWNjZXNzOworICAgICAgICAvLyBsZWF2ZSBub24tdXNlciBjcmVhdGVkIG1ldGhvZHMvZmllbGRzL2V0Yy4gYWxvbmUKKyAgICAgICAgaWYgKGNvbnRhaW5zKGFjY2VzcywgT3Bjb2Rlcy5BQ0NfQlJJREdFKSB8fCBjb250YWlucyhhY2Nlc3MsIE9wY29kZXMuQUNDX1NZTlRIRVRJQykpCisgICAgICAgICAgICByZXR1cm4gYWNjZXNzOworICAgICAgICBpZiAoY29udGFpbnMoYWNjZXNzLCBPcGNvZGVzLkFDQ19QUklWQVRFKSkKKyAgICAgICAgeworICAgICAgICAgICAgYWNjZXNzICY9IH5PcGNvZGVzLkFDQ19QUklWQVRFOworICAgICAgICAgICAgYWNjZXNzIHw9IE9wY29kZXMuQUNDX1BVQkxJQzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjb250YWlucyhhY2Nlc3MsIE9wY29kZXMuQUNDX1BST1RFQ1RFRCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFjY2VzcyAmPSB+T3Bjb2Rlcy5BQ0NfUFJPVEVDVEVEOworICAgICAgICAgICAgYWNjZXNzIHw9IE9wY29kZXMuQUNDX1BVQkxJQzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghY29udGFpbnMoYWNjZXNzLCBPcGNvZGVzLkFDQ19QVUJMSUMpKSAvLyBwYWNrYWdlLXByb3RlY3RlZAorICAgICAgICB7CisgICAgICAgICAgICBhY2Nlc3MgfD0gT3Bjb2Rlcy5BQ0NfUFVCTElDOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhY2Nlc3M7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhpbnQgdmFsdWUsIGludCBtYXNrKQorICAgIHsKKyAgICAgICAgcmV0dXJuICh2YWx1ZSAmIG1hc2spICE9IDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoaW50IHZlcnNpb24sIGludCBhY2Nlc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgc2lnbmF0dXJlLCBTdHJpbmcgc3VwZXJOYW1lLCBTdHJpbmdbXSBpbnRlcmZhY2VzKQorICAgIHsKKyAgICAgICAgc3VwZXIudmlzaXQodmVyc2lvbiwgbWFrZVB1YmxpYyhhY2Nlc3MpLCBuYW1lLCBzaWduYXR1cmUsIHN1cGVyTmFtZSwgaW50ZXJmYWNlcyk7CisKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRmllbGRWaXNpdG9yIHZpc2l0RmllbGQoaW50IGFjY2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdG9yLCBTdHJpbmcgc2lnbmF0dXJlLCBPYmplY3QgdmFsdWUpCiAgICAgewogICAgICAgICBpZiAoZGVwZW5kZW50VHlwZXMgIT0gbnVsbCkKICAgICAgICAgICAgIFV0aWxzLnZpc2l0SWZSZWZUeXBlKGRlc2NyaXB0b3IsIGRlcGVuZGVudFR5cGVzKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnZpc2l0RmllbGQoYWNjZXNzLCBuYW1lLCBkZXNjcmlwdG9yLCBzaWduYXR1cmUsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnZpc2l0RmllbGQobWFrZVB1YmxpYyhhY2Nlc3MpLCBuYW1lLCBkZXNjcmlwdG9yLCBzaWduYXR1cmUsIHZhbHVlKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE3Niw2ICsyMjQsNyBAQAogICAgICAgICAgICAgaXNUb1N0cmluZyA9IHRydWU7CiAgICAgICAgIH0KIAorICAgICAgICBhY2Nlc3MgPSBtYWtlUHVibGljKGFjY2Vzcyk7CiAgICAgICAgIE1ldGhvZFZpc2l0b3IgdmlzaXRvcjsKICAgICAgICAgaWYgKGZsYWdzLmNvbnRhaW5zKE1PTklUT1JTKSAmJiAoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfU1lOQ0hST05JWkVEKSAhPSAwKQogICAgICAgICB7CmRpZmYgLS1naXQgYS90ZXN0L3NpbXVsYXRvci9hc20vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL2FzbS9JbnRlcmNlcHRBZ2VudC5qYXZhIGIvdGVzdC9zaW11bGF0b3IvYXNtL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9hc20vSW50ZXJjZXB0QWdlbnQuamF2YQppbmRleCA4N2NmYWIwLi5jNGJlYWY5IDEwMDY0NAotLS0gYS90ZXN0L3NpbXVsYXRvci9hc20vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL2FzbS9JbnRlcmNlcHRBZ2VudC5qYXZhCisrKyBiL3Rlc3Qvc2ltdWxhdG9yL2FzbS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvYXNtL0ludGVyY2VwdEFnZW50LmphdmEKQEAgLTU0LDYgKzU0LDggQEAKIGltcG9ydCBzdGF0aWMgb3JnLm9iamVjdHdlYi5hc20uT3Bjb2Rlcy5JUkVUVVJOOwogaW1wb3J0IHN0YXRpYyBvcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzLlJFVFVSTjsKIAorLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgYmVsb3cgJ2Jsb2NrU3lzdGVtUHJvcGVydHlVc2FnZScKKwogLyoqCiAgKiBBIG1lY2hhbmlzbSBmb3Igd2VhdmluZyBjbGFzc2VzIGxvYWRlZCBieSB0aGUgYm9vdHN0cmFwIGNsYXNzbG9hZGVyIHRoYXQgd2UgY2Fubm90IG92ZXJyaWRlLgogICogVGhlIGRlc2lnbiBzdXBwb3J0cyB3ZWF2aW5nIG9mIHRoZSBpbnRlcm5hbHMgb2YgdGhlc2UgY2xhc3NlcywgYW5kIGluIGZ1dHVyZSB3ZSBtYXkgd2FudCB0bwpAQCAtMjk2LDEyICsyOTgsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdE1ldGhvZEluc24oSU5WT0tFU1RBVElDLCAiamF2YS9sYW5nL1RocmVhZCIsICJjdXJyZW50VGhyZWFkIiwgIigpTGphdmEvbGFuZy9UaHJlYWQ7IiwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICB2aXNpdG9yLnZpc2l0RmllbGRJbnNuKEdFVFNUQVRJQywgImphdmEvdXRpbC9jb25jdXJyZW50L1RocmVhZExvY2FsUmFuZG9tIiwgIlNFRUQiLCAiSiIpOwogICAgICAgICAgICAgICAgICAgICB2aXNpdG9yLnZpc2l0TWV0aG9kSW5zbihJTlZPS0VTVEFUSUMsICJvcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3Ivc3lzdGVtcy9JbnRlcmNlcHRvck9mU3lzdGVtTWV0aG9kcyRHbG9iYWwiLCAicmFuZG9tU2VlZCIsICIoKUoiLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXRNZXRob2RJbnNuKElOVk9LRVZJUlRVQUwsICJzdW4vbWlzYy9VbnNhZmUiLCAicHV0TG9uZyIsICIoTGphdmEvbGFuZy9PYmplY3Q7SkopViIsIGZhbHNlKTsKKworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdW5zYWZlQ2xhc3MgPSBVdGlscy5kZXNjcmlwdG9yVG9DbGFzc05hbWUodW5zYWZlRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXRNZXRob2RJbnNuKElOVk9LRVZJUlRVQUwsIHVuc2FmZUNsYXNzLCAicHV0TG9uZyIsICIoTGphdmEvbGFuZy9PYmplY3Q7SkopViIsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdEZpZWxkSW5zbihHRVRTVEFUSUMsICJqYXZhL3V0aWwvY29uY3VycmVudC9UaHJlYWRMb2NhbFJhbmRvbSIsIHVuc2FmZUZpZWxkTmFtZSwgdW5zYWZlRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXRNZXRob2RJbnNuKElOVk9LRVNUQVRJQywgImphdmEvbGFuZy9UaHJlYWQiLCAiY3VycmVudFRocmVhZCIsICIoKUxqYXZhL2xhbmcvVGhyZWFkOyIsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdEZpZWxkSW5zbihHRVRTVEFUSUMsICJqYXZhL3V0aWwvY29uY3VycmVudC9UaHJlYWRMb2NhbFJhbmRvbSIsICJQUk9CRSIsICJKIik7CiAgICAgICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXRMZGNJbnNuKDApOwotICAgICAgICAgICAgICAgICAgICB2aXNpdG9yLnZpc2l0TWV0aG9kSW5zbihJTlZPS0VWSVJUVUFMLCAic3VuL21pc2MvVW5zYWZlIiwgInB1dEludCIsICIoTGphdmEvbGFuZy9PYmplY3Q7SkkpViIsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdE1ldGhvZEluc24oSU5WT0tFVklSVFVBTCwgdW5zYWZlQ2xhc3MsICJwdXRJbnQiLCAiKExqYXZhL2xhbmcvT2JqZWN0O0pJKVYiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXRJbnNuKFJFVFVSTik7CiAgICAgICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXRMYWJlbChuZXcgTGFiZWwoKSk7CiAgICAgICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXRNYXhzKDYsIDEpOwpkaWZmIC0tZ2l0IGEvdGVzdC9zaW11bGF0b3IvYXNtL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9hc20vSW50ZXJjZXB0Q2xhc3Nlcy5qYXZhIGIvdGVzdC9zaW11bGF0b3IvYXNtL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9hc20vSW50ZXJjZXB0Q2xhc3Nlcy5qYXZhCmluZGV4IGE1NzA3NGQuLjQ3M2NjMjcgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc2ltdWxhdG9yL2FzbS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvYXNtL0ludGVyY2VwdENsYXNzZXMuamF2YQorKysgYi90ZXN0L3NpbXVsYXRvci9hc20vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL2FzbS9JbnRlcmNlcHRDbGFzc2VzLmphdmEKQEAgLTI0Niw2ICsyNDYsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgQ2xhc3NUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IG5ldyBDbGFzc1RyYW5zZm9ybWVyKGFwaSwgaW50ZXJuYWxOYW1lLCBmbGFncywgbW9uaXRvckRlbGF5Q2hhbmNlLCBuZXcgTmVtZXNpc0dlbmVyYXRvcihhcGksIGludGVybmFsTmFtZSwgbmVtZXNpc0NoYW5jZSksIG5lbWVzaXNGaWVsZFNlbGVjdG9yLCBoYXNoY29kZSwgZGVwZW5kZW50VHlwZXMpOworICAgICAgICB0cmFuc2Zvcm1lci5zZXRVcGRhdGVWaXNpYmlsaXR5KHRydWUpOwogICAgICAgICB0cmFuc2Zvcm1lci5yZWFkQW5kVHJhbnNmb3JtKGlucHV0KTsKIAogICAgICAgICBpZiAoIXRyYW5zZm9ybWVyLmlzVHJhbnNmb3JtZWQoKSkKZGlmZiAtLWdpdCBhL3Rlc3Qvc2ltdWxhdG9yL2FzbS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvYXNtL01ldGhvZExvZ2dlci5qYXZhIGIvdGVzdC9zaW11bGF0b3IvYXNtL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9hc20vTWV0aG9kTG9nZ2VyLmphdmEKaW5kZXggMWU2YTg0NC4uN2U2YTY4OSAxMDA2NDQKLS0tIGEvdGVzdC9zaW11bGF0b3IvYXNtL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9hc20vTWV0aG9kTG9nZ2VyLmphdmEKKysrIGIvdGVzdC9zaW11bGF0b3IvYXNtL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9hc20vTWV0aG9kTG9nZ2VyLmphdmEKQEAgLTM3LDYgKzM3LDggQEAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLmFzbS5NZXRob2RMb2dnZXIuTGV2ZWwuTk9ORTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLmFzbS5NZXRob2RMb2dnZXIuTGV2ZWwudmFsdWVPZjsKIAorLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgYmVsb3cgJ2Jsb2NrU3lzdGVtUHJvcGVydHlVc2FnZScKKwogLy8gVE9ETyAoY29uZmlnKTogc3VwcG9ydCBsb2dnaW5nIG9ubHkgZm9yIHBhY2thZ2VzL2NsYXNzZXMgbWF0Y2hpbmcgYSBwYXR0ZXJuCiBpbnRlcmZhY2UgTWV0aG9kTG9nZ2VyCiB7CmRpZmYgLS1naXQgYS90ZXN0L3NpbXVsYXRvci9hc20vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL2FzbS9VdGlscy5qYXZhIGIvdGVzdC9zaW11bGF0b3IvYXNtL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9hc20vVXRpbHMuamF2YQppbmRleCBiZTJlZjZjLi5kNzEwZmZlIDEwMDY0NAotLS0gYS90ZXN0L3NpbXVsYXRvci9hc20vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL2FzbS9VdGlscy5qYXZhCisrKyBiL3Rlc3Qvc2ltdWxhdG9yL2FzbS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvYXNtL1V0aWxzLmphdmEKQEAgLTI4Nyw0ICsyODcsMTIgQEAKICAgICAgICAgICAgICAgICBmb3JFYWNoLmFjY2VwdChkZXNjcmlwdG9yLnN1YnN0cmluZyhpICsgMSwgZGVzY3JpcHRvci5sZW5ndGgoKSAtIDEpKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2NyaXB0b3JUb0NsYXNzTmFtZShTdHJpbmcgZGVzYykKKyAgICB7CisgICAgICAgIC8vIHNhbXBsZXM6ICJMamRrL2ludGVybmFsL21pc2MvVW5zYWZlOyIsICJMc3VuL21pc2MvVW5zYWZlOyIKKyAgICAgICAgaWYgKCEoZGVzYy5zdGFydHNXaXRoKCJMIikgJiYgZGVzYy5lbmRzV2l0aCgiOyIpKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuYWJsZSB0byBwYXJzZSBkZXNjcmlwdG9yOiAiICsgZGVzYyk7CisgICAgICAgIHJldHVybiBkZXNjLnN1YnN0cmluZygxLCBkZXNjLmxlbmd0aCgpIC0gMSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9zaW11bGF0b3IvbWFpbi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvQWN0aW9uU2NoZWR1bGUuamF2YSBiL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL0FjdGlvblNjaGVkdWxlLmphdmEKaW5kZXggMThmYzg3Ny4uNjExOWU0NyAxMDA2NDQKLS0tIGEvdGVzdC9zaW11bGF0b3IvbWFpbi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvQWN0aW9uU2NoZWR1bGUuamF2YQorKysgYi90ZXN0L3NpbXVsYXRvci9tYWluL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9BY3Rpb25TY2hlZHVsZS5qYXZhCkBAIC00Myw2ICs0Myw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvc2VhYmxlSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfU0lNVUxBVE9SX0RFQlVHOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zaW11bGF0b3IuQWN0aW9uLk1vZGlmaWVyLkRBRU1PTjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLkFjdGlvbi5Nb2RpZmllci5TVFJFQU07CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNpbXVsYXRvci5BY3Rpb24uUGhhc2UuQ09OU0VRVUVOQ0U7CkBAIC0zMDAsNyArMzAxLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlNpbXVsYXRpb24gZmFpbGVkIHRvIG1ha2UgcHJvZ3Jlc3MuIFJ1biB3aXRoIC1EY2Fzc2FuZHJhLnRlc3Quc2ltdWxhdG9yLmRlYnVnPXRydWUgdG8gc2VlIHRoZSBibG9ja2VkIHRhc2sgZ3JhcGguIEJsb2NrZWQgdGFza3M6Iik7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJTaW11bGF0aW9uIGZhaWxlZCB0byBtYWtlIHByb2dyZXNzLiBSdW4gd2l0aCAtRHt9PXRydWUgdG8gc2VlIHRoZSBibG9ja2VkIHRhc2sgZ3JhcGguIEJsb2NrZWQgdGFza3M6IiwgVEVTVF9TSU1VTEFUT1JfREVCVUcuZ2V0S2V5KCkpOwogICAgICAgICAgICAgICAgIGFjdGlvbnMgPSBzZXF1ZW5jZXMudmFsdWVzKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIocyAtPiBzLm9uIGluc3RhbmNlb2YgT3JkZXJPbklkKQpkaWZmIC0tZ2l0IGEvdGVzdC9zaW11bGF0b3IvbWFpbi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvQ2x1c3RlclNpbXVsYXRpb24uamF2YSBiL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL0NsdXN0ZXJTaW11bGF0aW9uLmphdmEKaW5kZXggY2FmNjQyZS4uODkyZTkwNCAxMDA2NDQKLS0tIGEvdGVzdC9zaW11bGF0b3IvbWFpbi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvQ2x1c3RlclNpbXVsYXRpb24uamF2YQorKysgYi90ZXN0L3NpbXVsYXRvci9tYWluL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9DbHVzdGVyU2ltdWxhdGlvbi5qYXZhCkBAIC0yMSw4ICsyMSw4IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVTeXN0ZW07CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC0zNSw4ICszNSw2IEBACiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5qaW1mcy5Db25maWd1cmF0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmppbWZzLkppbWZzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5Bc3luY0Z1bmN0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5GdXR1cmVDYWxsYmFjazsKIApAQCAtNTUsNiArNTMsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmltcGwuRGlyZWN0U3RyZWFtaW5nQ29ubmVjdGlvbkZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuaW1wbC5Jc29sYXRlZEV4ZWN1dG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkxaNENvbXByZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlU3lzdGVtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLkJhbGxvdEdlbmVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLlBheG9zUHJlcGFyZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zaW11bGF0b3IuUmFuZG9tU291cmNlLkNob2ljZXM7CkBAIC02Miw2ICs2MSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLmFzbS5OZW1lc2lzRmllbGRTZWxlY3RvcnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLmNsdXN0ZXIuQ2x1c3RlckFjdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLmNsdXN0ZXIuQ2x1c3RlckFjdGlvbnMuVG9wb2xvZ3lDaGFuZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uZmlsZXN5c3RlbS5MaXN0ZW5hYmxlRmlsZVN5c3RlbTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zaW11bGF0b3Iuc3lzdGVtcy5GYWlsdXJlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zaW11bGF0b3Iuc3lzdGVtcy5JbnRlcmNlcHRlZFdhaXQuQ2FwdHVyZVNpdGVzLkNhcHR1cmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLnN5c3RlbXMuSW50ZXJjZXB0aWJsZVRocmVhZDsKQEAgLTYwNyw3ICs2MDcsNyBAQAogICAgIHB1YmxpYyBmaW5hbCBTaW11bGF0ZWRTeXN0ZW1zIHNpbXVsYXRlZDsKICAgICBwdWJsaWMgZmluYWwgQ2x1c3RlciBjbHVzdGVyOwogICAgIHB1YmxpYyBmaW5hbCBTIHNpbXVsYXRpb247Ci0gICAgcHJpdmF0ZSBmaW5hbCBGaWxlU3lzdGVtIGppbWZzOworICAgIHByaXZhdGUgZmluYWwgTGlzdGVuYWJsZUZpbGVTeXN0ZW0gZnM7CiAgICAgcHJvdGVjdGVkIGZpbmFsIE1hcDxJbnRlZ2VyLCBMaXN0PENsb3NlYWJsZT4+IG9uVW5leHBlY3RlZFNodXRkb3duID0gbmV3IFRyZWVNYXA8PigpOwogICAgIHByb3RlY3RlZCBmaW5hbCBMaXN0PENhbGxhYmxlPFZvaWQ+PiBvblNodXRkb3duID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PD4oKTsKICAgICBwcm90ZWN0ZWQgZmluYWwgVGhyZWFkTG9jYWxSYW5kb21DaGVjayB0aHJlYWRMb2NhbFJhbmRvbUNoZWNrOwpAQCAtNjE4LDkgKzYxOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXVsYXRpb25GYWN0b3J5PFM+IGZhY3RvcnkpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgdGhpcy5yYW5kb20gPSByYW5kb207Ci0gICAgICAgIHRoaXMuamltZnMgID0gSmltZnMubmV3RmlsZVN5c3RlbShMb25nLnRvSGV4U3RyaW5nKHNlZWQpICsgJ3gnICsgdW5pcXVlTnVtLCBDb25maWd1cmF0aW9uLnVuaXgoKS50b0J1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNYXhTaXplKDRMIDw8IDMwKS5zZXRCbG9ja1NpemUoNTEyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgdGhpcy5mcyA9IG5ldyBMaXN0ZW5hYmxlRmlsZVN5c3RlbShGaWxlU3lzdGVtcy5qaW1mcyhMb25nLnRvSGV4U3RyaW5nKHNlZWQpICsgJ3gnICsgdW5pcXVlTnVtKSk7CiAKICAgICAgICAgZmluYWwgU2ltdWxhdGVkTWVzc2FnZURlbGl2ZXJ5IGRlbGl2ZXJ5OwogICAgICAgICBmaW5hbCBTaW11bGF0ZWRFeGVjdXRpb24gZXhlY3V0aW9uOwpAQCAtNjcwLDIzICs2NjgsMjggQEAKIAogICAgICAgICBGYWlsdXJlcyBmYWlsdXJlcyA9IG5ldyBGYWlsdXJlcygpOwogICAgICAgICBUaHJlYWRBbGxvY2F0b3IgdGhyZWFkQWxsb2NhdG9yID0gbmV3IFRocmVhZEFsbG9jYXRvcihyYW5kb20sIGJ1aWxkZXIudGhyZWFkQ291bnQsIG51bU9mTm9kZXMpOworICAgICAgICBMaXN0PFN0cmluZz4gYWxsb3dlZERpc2tBY2Nlc3NNb2RlcyA9IEFycmF5cy5hc0xpc3QoIm1tYXAiLCAibW1hcF9pbmRleF9vbmx5IiwgInN0YW5kYXJkIik7CisgICAgICAgIFN0cmluZyBkaXNrX2FjY2Vzc19tb2RlID0gYWxsb3dlZERpc2tBY2Nlc3NNb2Rlcy5nZXQocmFuZG9tLnVuaWZvcm0oMCwgYWxsb3dlZERpc2tBY2Nlc3NNb2Rlcy5zaXplKCkgLSAxKSk7CisgICAgICAgIGJvb2xlYW4gY29tbWl0bG9nQ29tcHJlc3NlZCA9IHJhbmRvbS5kZWNpZGUoLjVmKTsKICAgICAgICAgY2x1c3RlciA9IHNuaXRjaC5zZXR1cChDbHVzdGVyLmJ1aWxkKG51bU9mTm9kZXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhSb290KGppbWZzLmdldFBhdGgoIi9jYXNzYW5kcmEiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFJvb3QoZnMuZ2V0UGF0aCgiL2Nhc3NhbmRyYSIpKQogICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU2hhcmVkQ2xhc3NlcyhzaGFyZWRDbGFzc1ByZWRpY2F0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjb25maWcgLT4gY29uZmlnVXBkYXRlci5hY2NlcHQodGhyZWFkQWxsb2NhdG9yLnVwZGF0ZShjb25maWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGgoRmVhdHVyZS5CTEFOS19HT1NTSVApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoInJlYWRfcmVxdWVzdF90aW1lb3V0IiwgU3RyaW5nLmZvcm1hdCgiJWRtcyIsIE5BTk9TRUNPTkRTLnRvTWlsbGlzKGJ1aWxkZXIucmVhZFRpbWVvdXROYW5vcykpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJ3cml0ZV9yZXF1ZXN0X3RpbWVvdXQiLCBTdHJpbmcuZm9ybWF0KCIlZG1zIiwgTkFOT1NFQ09ORFMudG9NaWxsaXMoYnVpbGRlci53cml0ZVRpbWVvdXROYW5vcykpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJjYXNfY29udGVudGlvbl90aW1lb3V0IiwgU3RyaW5nLmZvcm1hdCgiJWRtcyIsIE5BTk9TRUNPTkRTLnRvTWlsbGlzKGJ1aWxkZXIuY29udGVudGlvblRpbWVvdXROYW5vcykpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJyZXF1ZXN0X3RpbWVvdXQiLCBTdHJpbmcuZm9ybWF0KCIlZG1zIiwgTkFOT1NFQ09ORFMudG9NaWxsaXMoYnVpbGRlci5yZXF1ZXN0VGltZW91dE5hbm9zKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoIm1lbXRhYmxlX2hlYXBfc3BhY2UiLCAiMU1pQiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoIm1lbXRhYmxlX2FsbG9jYXRpb25fdHlwZSIsIGJ1aWxkZXIubWVtb3J5TGlzdGVuZXIgIT0gbnVsbCA/ICJ1bnNsYWJiZWRfaGVhcF9idWZmZXJzX2xvZ2dlZCIgOiAiaGVhcF9idWZmZXJzIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgiZmlsZV9jYWNoZV9zaXplIiwgIjE2TWlCIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgidXNlX2RldGVybWluaXN0aWNfdGFibGVfaWQiLCB0cnVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJkaXNrX2FjY2Vzc19tb2RlIiwgInN0YW5kYXJkIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgiZmFpbHVyZV9kZXRlY3RvciIsIFNpbXVsYXRlZEZhaWx1cmVEZXRlY3Rvci5JbnN0YW5jZS5jbGFzcy5nZXROYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoImNvbW1pdGxvZ19jb21wcmVzc2lvbiIsIG5ldyBQYXJhbWV0ZXJpemVkQ2xhc3MoTFo0Q29tcHJlc3Nvci5jbGFzcy5nZXROYW1lKCksIGVtcHR5TWFwKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICkpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uZmlnKGNvbmZpZyAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy53aXRoKEZlYXR1cmUuQkxBTktfR09TU0lQKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJyZWFkX3JlcXVlc3RfdGltZW91dCIsIFN0cmluZy5mb3JtYXQoIiVkbXMiLCBOQU5PU0VDT05EUy50b01pbGxpcyhidWlsZGVyLnJlYWRUaW1lb3V0TmFub3MpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgid3JpdGVfcmVxdWVzdF90aW1lb3V0IiwgU3RyaW5nLmZvcm1hdCgiJWRtcyIsIE5BTk9TRUNPTkRTLnRvTWlsbGlzKGJ1aWxkZXIud3JpdGVUaW1lb3V0TmFub3MpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgiY2FzX2NvbnRlbnRpb25fdGltZW91dCIsIFN0cmluZy5mb3JtYXQoIiVkbXMiLCBOQU5PU0VDT05EUy50b01pbGxpcyhidWlsZGVyLmNvbnRlbnRpb25UaW1lb3V0TmFub3MpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgicmVxdWVzdF90aW1lb3V0IiwgU3RyaW5nLmZvcm1hdCgiJWRtcyIsIE5BTk9TRUNPTkRTLnRvTWlsbGlzKGJ1aWxkZXIucmVxdWVzdFRpbWVvdXROYW5vcykpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJtZW10YWJsZV9oZWFwX3NwYWNlIiwgIjFNaUIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJtZW10YWJsZV9hbGxvY2F0aW9uX3R5cGUiLCBidWlsZGVyLm1lbW9yeUxpc3RlbmVyICE9IG51bGwgPyAidW5zbGFiYmVkX2hlYXBfYnVmZmVyc19sb2dnZWQiIDogImhlYXBfYnVmZmVycyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoImZpbGVfY2FjaGVfc2l6ZSIsICIxNk1pQiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoInVzZV9kZXRlcm1pbmlzdGljX3RhYmxlX2lkIiwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgiZGlza19hY2Nlc3NfbW9kZSIsIGRpc2tfYWNjZXNzX21vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoImZhaWx1cmVfZGV0ZWN0b3IiLCBTaW11bGF0ZWRGYWlsdXJlRGV0ZWN0b3IuSW5zdGFuY2UuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1pdGxvZ0NvbXByZXNzZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc2V0KCJjb21taXRsb2dfY29tcHJlc3Npb24iLCBuZXcgUGFyYW1ldGVyaXplZENsYXNzKExaNENvbXByZXNzb3IuY2xhc3MuZ2V0TmFtZSgpLCBlbXB0eU1hcCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1VwZGF0ZXIuYWNjZXB0KHRocmVhZEFsbG9jYXRvci51cGRhdGUoY29uZmlnKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEluc3RhbmNlSW5pdGlhbGl6ZXIobmV3IElJbnN0YW5jZUluaXRpYWxpemVyKCkKICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvdGVzdC9zaW11bGF0b3IvbWFpbi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvU2ltdWxhdGlvblJ1bm5lci5qYXZhIGIvdGVzdC9zaW11bGF0b3IvbWFpbi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvU2ltdWxhdGlvblJ1bm5lci5qYXZhCmluZGV4IDZmMWViMTIuLjMyODg4ZjQgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL1NpbXVsYXRpb25SdW5uZXIuamF2YQorKysgYi90ZXN0L3NpbXVsYXRvci9tYWluL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9TaW11bGF0aW9uUnVubmVyLmphdmEKQEAgLTU0LDE4ICs1NCwyMSBAQAogCiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5BcnJheXMuc3RyZWFtOwogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5OQU5PU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5BTExPV19BTFRFUl9SRl9EVVJJTkdfUkFOR0VfTU9WRU1FTlQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQkFUQ0hfQ09NTUlUX0xPR19TWU5DX0lOVEVSVkFMOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9KTVhfUkVNT1RFX1BPUlQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0xPQ0tfR0xPQkFMOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNMT0NLX01PTk9UT05JQ19BUFBST1g7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0xPQ0tfTU9OT1RPTklDX1BSRUNJU0U7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuREVURVJNSU5JU01fQ09OU0lTVEVOVF9ESVJFQ1RPUllfTElTVElOR1M7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09OU0lTVEVOVF9ESVJFQ1RPUllfTElTVElOR1M7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuREVURVJNSU5JU01fVU5TQUZFX1VVSURfTk9ERTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ESVNBQkxFX1NTVEFCTEVfQUNUSVZJVFlfVFJBQ0tJTkc7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuREVURVJNSU5JU01fU1NUQUJMRV9DT01QUkVTU0lPTl9ERUZBVUxUOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkRURVNUX0FQSV9MT0dfVE9QT0xPR1k7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuR09TU0lQRVJfU0tJUF9XQUlUSU5HX1RPX1NFVFRMRTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5JR05PUkVfTUlTU0lOR19OQVRJVkVfRklMRV9ISU5UUzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5JU19ESVNBQkxFRF9NQkVBTl9SRUdJU1RSQVRJT047CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuT1JHX0FQQUNIRV9DQVNTQU5EUkFfRElTQUJMRV9NQkVBTl9SRUdJU1RSQVRJT047CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTElCSkVNQUxMT0M7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTUVNVEFCTEVfT1ZFUkhFQURfU0laRTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5NSUdSQVRJT05fREVMQVk7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUEFYT1NfUkVQQUlSX1JFVFJZX1RJTUVPVVRfSU5fTVM7CkBAIC05OSwxMiArMTAyLDEyIEBACiAgICAgICAgIHRyeSB7IENsb2NrLkdsb2JhbC5uYW5vVGltZSgpOyB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkge30gLy8gbWFrZSBzdXJlIHN0YXRpYyBpbml0aWFsaXplciBnZXRzIGNhbGxlZAogCiAgICAgICAgIC8vIFRPRE8gKGNsZWFudXApOiBkaXNhYmxlIHVubmVjZXNzYXJ5IHRoaW5ncyBsaWtlIGNvbXBhY3Rpb24gbG9nZ2VyIHRocmVhZHMgZXRjCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmxpYmplbWFsbG9jIiwgIi0iKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuZHRlc3QuYXBpLmxvZy50b3BvbG9neSIsICJmYWxzZSIpOworICAgICAgICBMSUJKRU1BTExPQy5zZXRTdHJpbmcoIi0iKTsKKyAgICAgICAgRFRFU1RfQVBJX0xPR19UT1BPTE9HWS5zZXRCb29sZWFuKGZhbHNlKTsKIAogICAgICAgICAvLyB0aGlzIHByb3BlcnR5IGlzIHVzZWQgdG8gYWxsb3cgbm9uLW1lbWJlcnMgb2YgdGhlIHJpbmcgdG8gZXhpc3QgaW4gZ29zc2lwIHdpdGhvdXQgYnJlYWtpbmcgUkYgY2hhbmdlcwogICAgICAgICAvLyBpdCB3b3VsZCBiZSBuaWNlIG5vdCB0byByZWx5IG9uIHRoaXMsIGJ1dCBob3BlZnVsbHkgd2UnbGwgaGF2ZSBjb25zaXN0ZW50IHJhbmdlIG1vdmVtZW50cyBiZWZvcmUgaXQgbWF0dGVycwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5hbGxvd19hbHRlcl9yZl9kdXJpbmdfcmFuZ2VfbW92ZW1lbnQiLCAidHJ1ZSIpOworICAgICAgICBBTExPV19BTFRFUl9SRl9EVVJJTkdfUkFOR0VfTU9WRU1FTlQuc2V0Qm9vbGVhbih0cnVlKTsKIAogICAgICAgICBmb3IgKENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyBwcm9wZXJ0eSA6IEFycmF5cy5hc0xpc3QoQ0xPQ0tfR0xPQkFMLCBDTE9DS19NT05PVE9OSUNfQVBQUk9YLCBDTE9DS19NT05PVE9OSUNfUFJFQ0lTRSkpCiAgICAgICAgICAgICBwcm9wZXJ0eS5zZXRTdHJpbmcoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNpbXVsYXRvci5zeXN0ZW1zLlNpbXVsYXRlZFRpbWUkR2xvYmFsIik7CkBAIC0xMTgsMTQgKzEyMSwxNCBAQAogICAgICAgICBCQVRDSF9DT01NSVRfTE9HX1NZTkNfSU5URVJWQUwuc2V0SW50KC0xKTsKICAgICAgICAgRElTQUJMRV9TU1RBQkxFX0FDVElWSVRZX1RSQUNLSU5HLnNldEJvb2xlYW4oZmFsc2UpOwogICAgICAgICBERVRFUk1JTklTTV9TU1RBQkxFX0NPTVBSRVNTSU9OX0RFRkFVTFQuc2V0Qm9vbGVhbihmYWxzZSk7IC8vIGNvbXByZXNzaW9uIGNhdXNlcyB2YXJpYXRpb24gaW4gZmlsZSBzaXplIGZvciBlLmcuIFVVSURzLCBJUCBhZGRyZXNzZXMsIHJhbmRvbSBmaWxlIHBhdGhzCi0gICAgICAgIERFVEVSTUlOSVNNX0NPTlNJU1RFTlRfRElSRUNUT1JZX0xJU1RJTkdTLnNldEJvb2xlYW4odHJ1ZSk7CisgICAgICAgIENPTlNJU1RFTlRfRElSRUNUT1JZX0xJU1RJTkdTLnNldEJvb2xlYW4odHJ1ZSk7CiAgICAgICAgIFRFU1RfSUdOT1JFX1NJR0FSLnNldEJvb2xlYW4odHJ1ZSk7CiAgICAgICAgIFNZU1RFTV9BVVRIX0RFRkFVTFRfUkYuc2V0SW50KDMpOwogICAgICAgICBNSUdSQVRJT05fREVMQVkuc2V0SW50KEludGVnZXIuTUFYX1ZBTFVFKTsKICAgICAgICAgRElTQUJMRV9HT1NTSVBfRU5EUE9JTlRfUkVNT1ZBTC5zZXRCb29sZWFuKHRydWUpOwogICAgICAgICBNRU1UQUJMRV9PVkVSSEVBRF9TSVpFLnNldEludCgxMDApOwogICAgICAgICBJR05PUkVfTUlTU0lOR19OQVRJVkVfRklMRV9ISU5UUy5zZXRCb29sZWFuKHRydWUpOwotICAgICAgICBJU19ESVNBQkxFRF9NQkVBTl9SRUdJU1RSQVRJT04uc2V0Qm9vbGVhbih0cnVlKTsKKyAgICAgICAgT1JHX0FQQUNIRV9DQVNTQU5EUkFfRElTQUJMRV9NQkVBTl9SRUdJU1RSQVRJT04uc2V0Qm9vbGVhbih0cnVlKTsKICAgICAgICAgVEVTVF9KVk1fRFRFU1RfRElTQUJMRV9TU0wuc2V0Qm9vbGVhbih0cnVlKTsgLy8gdG8gc3VwcG9ydCBlYXNpbHkgcnVubmluZyB3aXRob3V0IG5ldHR5IGZyb20gZHRlc3QtamFyCiAKICAgICAgICAgaWYgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgaW5zdGFuY2VvZiBJbnRlcmNlcHRpYmxlVGhyZWFkKTsgLy8gbG9hZCBJbnRlcmNlcHRpYmxlVGhyZWFkIGNsYXNzIHRvIGF2b2lkIGluZmluaXRlIGxvb3AgaW4gSW50ZXJjZXB0b3JPZkdsb2JhbE1ldGhvZHMKZGlmZiAtLWdpdCBhL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL2RlYnVnL1JlY29uY2lsZS5qYXZhIGIvdGVzdC9zaW11bGF0b3IvbWFpbi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvZGVidWcvUmVjb25jaWxlLmphdmEKaW5kZXggNWFjZjc2NC4uOGQwZWQ0NiAxMDA2NDQKLS0tIGEvdGVzdC9zaW11bGF0b3IvbWFpbi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvZGVidWcvUmVjb25jaWxlLmphdmEKKysrIGIvdGVzdC9zaW11bGF0b3IvbWFpbi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvZGVidWcvUmVjb25jaWxlLmphdmEKQEAgLTM1LDcgKzM1LDkgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzLkRhdGFJbnB1dFN0cmVhbVBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNpbXVsYXRvci5DbHVzdGVyU2ltdWxhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zaW11bGF0b3IuUmFuZG9tU291cmNlOwpAQCAtODAsNyArODIsNyBAQAogCiAgICAgICAgIFN0cmluZyByZWFkSW50ZXJuZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewotICAgICAgICAgICAgaW50IGlkID0gKGludCkgaW4ucmVhZFZJbnQoKTsKKyAgICAgICAgICAgIGludCBpZCA9IGluLnJlYWRWSW50MzIoKTsKICAgICAgICAgICAgIGlmIChpZCA9PSBzdHJpbmdzLnNpemUoKSkgc3RyaW5ncy5hZGQoaW4ucmVhZFVURigpKTsKICAgICAgICAgICAgIGVsc2UgaWYgKGlkID4gc3RyaW5ncy5zaXplKCkpIHRocm93IGZhaWxXaXRoT09NKCk7CiAgICAgICAgICAgICByZXR1cm4gc3RyaW5ncy5nZXQoaWQpOwpAQCAtMjEwLDcgKzIxMiw3IEBACiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBieXRlIHR5cGUgPSBpbi5yZWFkQnl0ZSgpOwotICAgICAgICAgICAgICAgIGludCBjID0gKGludCkgaW4ucmVhZFZJbnQoKTsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IGluLnJlYWRWSW50MzIoKTsKICAgICAgICAgICAgICAgICBsb25nIHYgPSBpbi5yZWFkTG9uZygpOwogICAgICAgICAgICAgICAgIHRocmVhZHMuY2hlY2tUaHJlYWQoKTsKICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSA3IHx8IGMgIT0gY291bnQgfHwgdmFsdWUgIT0gdikKQEAgLTI0MCwxMSArMjQyLDExIEBACiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBieXRlIHR5cGUgPSBpbi5yZWFkQnl0ZSgpOwotICAgICAgICAgICAgICAgIGludCBjID0gKGludCkgaW4ucmVhZFZJbnQoKTsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IGluLnJlYWRWSW50MzIoKTsKICAgICAgICAgICAgICAgICB0aHJlYWRzLmNoZWNrVGhyZWFkKCk7Ci0gICAgICAgICAgICAgICAgaW50IG1pbjEgPSAoaW50KSBpbi5yZWFkVkludCgpOwotICAgICAgICAgICAgICAgIGludCBtYXgxID0gKGludCkgaW4ucmVhZFZJbnQoKSArIG1pbjE7Ci0gICAgICAgICAgICAgICAgaW50IHYxID0gKGludCkgaW4ucmVhZFZJbnQoKSArIG1pbjE7CisgICAgICAgICAgICAgICAgaW50IG1pbjEgPSBpbi5yZWFkVkludDMyKCk7CisgICAgICAgICAgICAgICAgaW50IG1heDEgPSBpbi5yZWFkVkludDMyKCkgKyBtaW4xOworICAgICAgICAgICAgICAgIGludCB2MSA9IGluLnJlYWRWSW50MzIoKSArIG1pbjE7CiAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gMSB8fCBtaW4gIT0gbWluMSB8fCBtYXggIT0gbWF4MSB8fCB2ICE9IHYxIHx8IGMgIT0gY291bnQpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoU3RyaW5nLmZvcm1hdCgiKCVkLCVkLCVkWyVkLCVkXSkgIT0gKCVkLCVkLCVkWyVkLCVkXSkiLCAxLCBjb3VudCwgdiwgbWluLCBtYXgsIHR5cGUsIGMsIHYxLCBtaW4xLCBtYXgxKSk7CkBAIC0yNzMsNyArMjc1LDcgQEAKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGJ5dGUgdHlwZSA9IGluLnJlYWRCeXRlKCk7Ci0gICAgICAgICAgICAgICAgaW50IGMgPSAoaW50KSBpbi5yZWFkVkludCgpOworICAgICAgICAgICAgICAgIGludCBjID0gaW4ucmVhZFZJbnQzMigpOwogICAgICAgICAgICAgICAgIHRocmVhZHMuY2hlY2tUaHJlYWQoKTsKICAgICAgICAgICAgICAgICBsb25nIG1pbjEgPSBpbi5yZWFkVkludCgpOwogICAgICAgICAgICAgICAgIGxvbmcgbWF4MSA9IGluLnJlYWRWSW50KCkgKyBtaW4xOwpAQCAtMzA2LDcgKzMwOCw3IEBACiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBieXRlIHR5cGUgPSBpbi5yZWFkQnl0ZSgpOwotICAgICAgICAgICAgICAgIGludCBjID0gKGludCkgaW4ucmVhZFZJbnQoKTsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IGluLnJlYWRWSW50MzIoKTsKICAgICAgICAgICAgICAgICB0aHJlYWRzLmNoZWNrVGhyZWFkKCk7CiAgICAgICAgICAgICAgICAgZmxvYXQgdjEgPSBpbi5yZWFkRmxvYXQoKTsKICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSAzIHx8IHYgIT0gdjEgfHwgYyAhPSBjb3VudCkKQEAgLTMzOCw3ICszNDAsNyBAQAogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYnl0ZSB0eXBlID0gaW4ucmVhZEJ5dGUoKTsKLSAgICAgICAgICAgICAgICBpbnQgYyA9IChpbnQpIGluLnJlYWRWSW50KCk7CisgICAgICAgICAgICAgICAgaW50IGMgPSBpbi5yZWFkVkludDMyKCk7CiAgICAgICAgICAgICAgICAgdGhyZWFkcy5jaGVja1RocmVhZCgpOwogICAgICAgICAgICAgICAgIGRvdWJsZSB2MSA9IGluLnJlYWREb3VibGUoKTsKICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSA2IHx8IHYgIT0gdjEgfHwgYyAhPSBjb3VudCkKQEAgLTM2OSw3ICszNzEsNyBAQAogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYnl0ZSB0eXBlID0gaW4ucmVhZEJ5dGUoKTsKLSAgICAgICAgICAgICAgICBpbnQgYyA9IChpbnQpIGluLnJlYWRWSW50KCk7CisgICAgICAgICAgICAgICAgaW50IGMgPSBpbi5yZWFkVkludDMyKCk7CiAgICAgICAgICAgICAgICAgbG9uZyB2MSA9IGluLnJlYWRWSW50KCk7CiAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gNCB8fCBzZWVkICE9IHYxIHx8IGMgIT0gY291bnQpCiAgICAgICAgICAgICAgICAgICAgIHRocm93IGZhaWxXaXRoT09NKCk7CkBAIC0zOTUsNyArMzk3LDcgQEAKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGJ5dGUgdHlwZSA9IGluLnJlYWRCeXRlKCk7Ci0gICAgICAgICAgICAgICAgaW50IGMgPSAoaW50KSBpbi5yZWFkVkludCgpOworICAgICAgICAgICAgICAgIGludCBjID0gaW4ucmVhZFZJbnQzMigpOwogICAgICAgICAgICAgICAgIGxvbmcgdjEgPSBpbi5yZWFkVkludCgpOwogICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IDUgfHwgdiAhPSB2MSB8fCBjICE9IGNvdW50KQogICAgICAgICAgICAgICAgICAgICB0aHJvdyBmYWlsV2l0aE9PTSgpOwpAQCAtNDMzLDggKzQzNSw4IEBACiAgICAgICAgIEZpbGUgdGltZUZpbGUgPSBuZXcgRmlsZShuZXcgRmlsZShsb2FkRnJvbURpciksIExvbmcudG9IZXhTdHJpbmcoc2VlZCkgKyAiLnRpbWUuZ3oiKTsKIAogICAgICAgICB0cnkgKEJ1ZmZlcmVkUmVhZGVyIGV2ZW50SW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBHWklQSW5wdXRTdHJlYW0oZXZlbnRGaWxlLm5ld0lucHV0U3RyZWFtKCkpKSk7Ci0gICAgICAgICAgICAgRGF0YUlucHV0UGx1cy5EYXRhSW5wdXRTdHJlYW1QbHVzIHJuZ0luID0gbmV3IERhdGFJbnB1dFBsdXMuRGF0YUlucHV0U3RyZWFtUGx1cyhybmdGaWxlLmV4aXN0cygpICYmIHdpdGhSbmcgIT0gTk9ORSA/IG5ldyBHWklQSW5wdXRTdHJlYW0ocm5nRmlsZS5uZXdJbnB1dFN0cmVhbSgpKSA6IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSkpOwotICAgICAgICAgICAgIERhdGFJbnB1dFBsdXMuRGF0YUlucHV0U3RyZWFtUGx1cyB0aW1lSW4gPSBuZXcgRGF0YUlucHV0UGx1cy5EYXRhSW5wdXRTdHJlYW1QbHVzKHRpbWVGaWxlLmV4aXN0cygpICYmIHdpdGhUaW1lICE9IE5PTkUgPyBuZXcgR1pJUElucHV0U3RyZWFtKHRpbWVGaWxlLm5ld0lucHV0U3RyZWFtKCkpIDogbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKSkpCisgICAgICAgICAgICAgRGF0YUlucHV0U3RyZWFtUGx1cyBybmdJbiA9IFV0aWwuRGF0YUlucHV0U3RyZWFtUGx1c0ltcGwud3JhcChybmdGaWxlLmV4aXN0cygpICYmIHdpdGhSbmcgIT0gTk9ORSA/IG5ldyBHWklQSW5wdXRTdHJlYW0ocm5nRmlsZS5uZXdJbnB1dFN0cmVhbSgpKSA6IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSkpOworICAgICAgICAgICAgIERhdGFJbnB1dFN0cmVhbVBsdXMgdGltZUluID0gVXRpbC5EYXRhSW5wdXRTdHJlYW1QbHVzSW1wbC53cmFwKHRpbWVGaWxlLmV4aXN0cygpICYmIHdpdGhUaW1lICE9IE5PTkUgPyBuZXcgR1pJUElucHV0U3RyZWFtKHRpbWVGaWxlLm5ld0lucHV0U3RyZWFtKCkpIDogbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJvb2xlYW4gaW5wdXRIYXNXYWl0U2l0ZXMsIGlucHV0SGFzV2FrZVNpdGVzLCBpbnB1dEhhc1JuZ0NhbGxTaXRlcywgaW5wdXRIYXNUaW1lQ2FsbFNpdGVzOwogICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvdGVzdC9zaW11bGF0b3IvbWFpbi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvZGVidWcvUmVjb3JkLmphdmEgYi90ZXN0L3NpbXVsYXRvci9tYWluL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9kZWJ1Zy9SZWNvcmQuamF2YQppbmRleCA3Y2E3YTIwLi40MmM3YjA4IDEwMDY0NAotLS0gYS90ZXN0L3NpbXVsYXRvci9tYWluL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9kZWJ1Zy9SZWNvcmQuamF2YQorKysgYi90ZXN0L3NpbXVsYXRvci9tYWluL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9kZWJ1Zy9SZWNvcmQuamF2YQpAQCAtMTgsMjQgKzE4LDYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zaW11bGF0b3IuZGVidWc7CiAKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQ2hhbm5lbHM7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyOwotaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLWltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5CdWZmZXJlZERhdGFPdXRwdXRTdHJlYW1QbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFN0cmVhbVBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwpAQCAtNDYsMTEgKzI4LDIyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvc2VhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb3NlYWJsZUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuVGhyZWFkczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNoYW5uZWxzOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXI7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUE91dHB1dFN0cmVhbTsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGUuV3JpdGVNb2RlLk9WRVJXUklURTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLlNpbXVsYXRpb25SdW5uZXIuUmVjb3JkT3B0aW9uLk5PTkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNpbXVsYXRvci5TaW11bGF0aW9uUnVubmVyLlJlY29yZE9wdGlvbi5WQUxVRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLlNpbXVsYXRpb25SdW5uZXIuUmVjb3JkT3B0aW9uLldJVEhfQ0FMTFNJVEVTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zaW11bGF0b3IuU2ltdWxhdGlvblJ1bm5lci5SZWNvcmRPcHRpb24uKjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLlNpbXVsYXRvclV0aWxzLmZhaWxXaXRoT09NOwogCiBwdWJsaWMgY2xhc3MgUmVjb3JkCkBAIC0yODIsNyArMjc1LDcgQEAKICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVCeXRlKDcpOwotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVWSW50KGNvdW50KyspOworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVWSW50MzIoY291bnQrKyk7CiAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUxvbmcodmFsdWUpOwogICAgICAgICAgICAgICAgICAgICB0aHJlYWRzLndyaXRlVGhyZWFkKCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMzA5LDExICszMDIsMTEgQEAKICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVCeXRlKDEpOwotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVWSW50KGNvdW50KyspOworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVWSW50MzIoY291bnQrKyk7CiAgICAgICAgICAgICAgICAgICAgIHRocmVhZHMud3JpdGVUaHJlYWQoKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVkludChtaW4pOwotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVWSW50KG1heCAtIG1pbik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVZJbnQodiAtIG1pbik7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVZJbnQzMihtaW4pOworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVWSW50MzIobWF4IC0gbWluKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVkludDMyKHYgLSBtaW4pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQpAQCAtMzM5LDcgKzMzMiw3IEBACiAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlQnl0ZSgyKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVkludChjb3VudCsrKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVkludDMyKGNvdW50KyspOwogICAgICAgICAgICAgICAgICAgICB0aHJlYWRzLndyaXRlVGhyZWFkKCk7CiAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVZJbnQobWluKTsKICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVkludChtYXggLSBtaW4pOwpAQCAtMzY5LDcgKzM2Miw3IEBACiAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlQnl0ZSgzKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVkludChjb3VudCsrKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVkludDMyKGNvdW50KyspOwogICAgICAgICAgICAgICAgICAgICB0aHJlYWRzLndyaXRlVGhyZWFkKCk7CiAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUZsb2F0KHYpOwogICAgICAgICAgICAgICAgIH0KQEAgLTM5Nyw3ICszOTAsNyBAQAogICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUJ5dGUoNik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVZJbnQoY291bnQrKyk7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVZJbnQzMihjb3VudCsrKTsKICAgICAgICAgICAgICAgICAgICAgdGhyZWFkcy53cml0ZVRocmVhZCgpOwogICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVEb3VibGUodik7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDI1LDcgKzQxOCw3IEBACiAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlQnl0ZSg0KTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVkludChjb3VudCsrKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVkludDMyKGNvdW50KyspOwogICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVWSW50KHNlZWQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTQ1MSw3ICs0NDQsNyBAQAogICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUJ5dGUoNSk7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVZJbnQoY291bnQrKyk7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVZJbnQzMihjb3VudCsrKTsKICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlRmxvYXQodik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNTE0LDExICs1MDcsMTEgQEAKICAgICAgICAgICAgIEludGVnZXIgaWQgPSBvYmplY3RzLmdldChvKTsKICAgICAgICAgICAgIGlmIChpZCAhPSBudWxsKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dC53cml0ZVZJbnQoaWQpOworICAgICAgICAgICAgICAgIG91dC53cml0ZVZJbnQzMihpZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlVkludChvYmplY3RzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlVkludDMyKG9iamVjdHMuc2l6ZSgpKTsKICAgICAgICAgICAgICAgICBvdXQud3JpdGVVVEYoby50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICBvYmplY3RzLnB1dChvLCBvYmplY3RzLnNpemUoKSk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS90ZXN0L3NpbXVsYXRvci9tYWluL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9kZWJ1Zy9TZWxmUmVjb25jaWxpbmdSYW5kb20uamF2YSBiL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL2RlYnVnL1NlbGZSZWNvbmNpbGluZ1JhbmRvbS5qYXZhCmluZGV4IDQ0NGVjNDQuLjk5ZGY0YjkgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL2RlYnVnL1NlbGZSZWNvbmNpbGluZ1JhbmRvbS5qYXZhCisrKyBiL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL2RlYnVnL1NlbGZSZWNvbmNpbGluZ1JhbmRvbS5qYXZhCkBAIC0yMCwyNCArMjAsMjkgQEAKIAogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKIAoraW1wb3J0IG9yZy5hZ3JvbmEuY29sbGVjdGlvbnMuTG9uZzJMb25nSGFzaE1hcDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zaW11bGF0b3IuUmFuZG9tU291cmNlOwotaW1wb3J0IG9yZy5oc3FsZGIubGliLkludEtleUxvbmdWYWx1ZUhhc2hNYXA7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLlNpbXVsYXRvclV0aWxzLmZhaWxXaXRoT09NOwogCiBwdWJsaWMgY2xhc3MgU2VsZlJlY29uY2lsaW5nUmFuZG9tIGltcGxlbWVudHMgU3VwcGxpZXI8UmFuZG9tU291cmNlPgogewotICAgIHN0YXRpYyBjbGFzcyBNYXAgZXh0ZW5kcyBJbnRLZXlMb25nVmFsdWVIYXNoTWFwCisgICAgc3RhdGljIGNsYXNzIE1hcCBleHRlbmRzIExvbmcyTG9uZ0hhc2hNYXAKICAgICB7CisgICAgICAgIHB1YmxpYyBNYXAobG9uZyBtaXNzaW5nVmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKG1pc3NpbmdWYWx1ZSk7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBwdXQoaW50IGksIGxvbmcgdikKICAgICAgICAgewogICAgICAgICAgICAgaW50IHNpemUgPSB0aGlzLnNpemUoKTsKLSAgICAgICAgICAgIHN1cGVyLmFkZE9yUmVtb3ZlKChsb25nKWksIChsb25nKXYsIChPYmplY3QpbnVsbCwgKE9iamVjdCludWxsLCBmYWxzZSk7CisgICAgICAgICAgICBzdXBlci5wdXQoaSwgdik7CiAgICAgICAgICAgICByZXR1cm4gc2l6ZSAhPSB0aGlzLnNpemUoKTsKICAgICAgICAgfQogICAgIH0KLSAgICBmaW5hbCBNYXAgbWFwID0gbmV3IE1hcCgpOwotICAgIGxvbmdbXSB0bXAgPSBuZXcgbG9uZ1sxXTsKKworICAgIGZpbmFsIE1hcCBtYXAgPSBuZXcgTWFwKExvbmcuTUlOX1ZBTFVFKTsKICAgICBib29sZWFuIGlzTmV4dFByaW1hcnkgPSB0cnVlOwogCiAgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmVyaWZ5aW5nIGV4dGVuZHMgUmFuZG9tU291cmNlLkFic3RyYWN0CkBAIC0xMTMsMTAgKzExOCwxMSBAQAogICAgICAgICB7CiAgICAgICAgICAgICB2b2lkIG5leHQobG9uZyB2KQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghbWFwLmdldCgrK2N1ciwgdG1wKSkKKyAgICAgICAgICAgICAgICBsb25nIHZhbHVlID0gbWFwLmdldCgrK2N1cik7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IExvbmcuTUlOX1ZBTFVFKQogICAgICAgICAgICAgICAgICAgICB0aHJvdyBmYWlsV2l0aE9PTSgpOwogICAgICAgICAgICAgICAgIG1hcC5yZW1vdmUoY3VyKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wWzBdICE9IHYpCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IHYpCiAgICAgICAgICAgICAgICAgICAgIHRocm93IGZhaWxXaXRoT09NKCk7CiAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL3BheG9zL0JhbGxvdHMuamF2YSBiL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL3BheG9zL0JhbGxvdHMuamF2YQppbmRleCAwOGUxYjJlLi42MGViZjQ3IDEwMDY0NAotLS0gYS90ZXN0L3NpbXVsYXRvci9tYWluL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9wYXhvcy9CYWxsb3RzLmphdmEKKysrIGIvdGVzdC9zaW11bGF0b3IvbWFpbi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvcGF4b3MvQmFsbG90cy5qYXZhCkBAIC00MiwxNyArNDIsMTcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZWFkc0xpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNpbXVsYXRvci5zeXN0ZW1zLk5vbkludGVyY2VwdGlibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLnN5c3RlbXMuTm9uSW50ZXJjZXB0aWJsZS5QZXJtaXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy5Db21taXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy5QYXhvc1N0YXRlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNpbXVsYXRvci5zeXN0ZW1zLk5vbkludGVyY2VwdGlibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLnN5c3RlbXMuTm9uSW50ZXJjZXB0aWJsZS5QZXJtaXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2hhcmVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogCiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5Mb25nLm1heDsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLkFycmF5cy5zdHJlYW07CmRpZmYgLS1naXQgYS90ZXN0L3NpbXVsYXRvci9tYWluL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9wYXhvcy9QYXhvc1NpbXVsYXRpb24uamF2YSBiL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL3BheG9zL1BheG9zU2ltdWxhdGlvbi5qYXZhCmluZGV4IDYzZTg0ZGMuLmE2ZmJjNDQgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL3BheG9zL1BheG9zU2ltdWxhdGlvbi5qYXZhCisrKyBiL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL3BheG9zL1BheG9zU2ltdWxhdGlvbi5qYXZhCkBAIC0yNiwxNyArMjYsMTQgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaUNvbnN1bWVyOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Mb25nU3VwcGxpZXI7Ci0KIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOwotCiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRXhlY3V0b3JGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JQbHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuQ29uc2lzdGVuY3lMZXZlbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuSUludm9rYWJsZUluc3RhbmNlOwpAQCAtNTUsOCArNTIsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuVGhyZWFkczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlVuY2hlY2tlZEludGVycnVwdGVkRXhjZXB0aW9uOwogCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNpbXVsYXRvci5BY3Rpb24uTW9kaWZpZXJzLk5PTkU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9TSU1VTEFUT1JfTElWRU5FU1NfQ0hFQ0s7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNpbXVsYXRvci5BY3Rpb24uTW9kaWZpZXJzLkRJU1BMQVlfT1JJR0lOOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zaW11bGF0b3IuQWN0aW9uLk1vZGlmaWVycy5OT05FOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zaW11bGF0b3IuU2ltdWxhdG9yVXRpbHMuZmFpbFdpdGhPT007CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNpbXVsYXRvci5wYXhvcy5IaXN0b3J5Q2hlY2tlci5jYXVzZWRCeTsKIApAQCAtMTMzLDcgKzEzMSw3IEBACiAgICAgICAgIEF0b21pY0xvbmcgY291bnRlciA9IG5ldyBBdG9taWNMb25nKCk7CiAgICAgICAgIFNjaGVkdWxlZEV4ZWN1dG9yUGx1cyBsaXZlbmVzc0NoZWNrZXIgPSBudWxsOwogICAgICAgICBTY2hlZHVsZWRGdXR1cmU8Pz4gbGl2ZW5lc3MgPSBudWxsOwotICAgICAgICBpZiAoQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfU0lNVUxBVE9SX0xJVkVORVNTX0NIRUNLLmdldEJvb2xlYW4oKSkKKyAgICAgICAgaWYgKFRFU1RfU0lNVUxBVE9SX0xJVkVORVNTX0NIRUNLLmdldEJvb2xlYW4oKSkKICAgICAgICAgewogICAgICAgICAgICAgbGl2ZW5lc3NDaGVja2VyID0gRXhlY3V0b3JGYWN0b3J5Lkdsb2JhbC5leGVjdXRvckZhY3RvcnkoKS5zY2hlZHVsZWQoIlNpbXVsYXRpb25MaXZlbmVzcyIpOwogICAgICAgICAgICAgbGl2ZW5lc3MgPSBsaXZlbmVzc0NoZWNrZXIuc2NoZWR1bGVXaXRoRml4ZWREZWxheShuZXcgUnVubmFibGUoKQpAQCAtMTcwLDcgKzE2OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGN1ciA9IGNvdW50ZXIuZ2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyID09IHByZXYpCiAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJTaW11bGF0aW9uIGFwcGVhcnMgdG8gaGF2ZSBzdGFsbGVkOyB0ZXJtaW5hdGluZy4gVG8gZGlzYWJsZSBzZXQgLURjYXNzYW5kcmEudGVzdC5zaW11bGF0b3IubGl2ZW5lc3NjaGVjaz1mYWxzZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiU2ltdWxhdGlvbiBhcHBlYXJzIHRvIGhhdmUgc3RhbGxlZDsgdGVybWluYXRpbmcuIFRvIGRpc2FibGUgc2V0IC1Ee309ZmFsc2UiLCBURVNUX1NJTVVMQVRPUl9MSVZFTkVTU19DSEVDSy5nZXRLZXkoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2h1dGRvd24uc2V0KDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGZhaWxXaXRoT09NKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0yNjIsOCArMjYwLDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIGxvZyhjYXVzZWRCeVByaW1hcnlLZXkpOwotICAgICAgICBpZiAoY2F1c2VkQnlQcmltYXJ5S2V5ICE9IG51bGwpIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKGNhdXNlZEJ5VGhyb3dhYmxlKTsKLSAgICAgICAgZWxzZSB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShzaW11bGF0ZWQuZmFpbHVyZXMuZ2V0KCkuZ2V0KDApKTsKKyAgICAgICAgVGhyb3dhYmxlIHQgPSAoY2F1c2VkQnlQcmltYXJ5S2V5ICE9IG51bGwpID8gY2F1c2VkQnlUaHJvd2FibGUgOiBzaW11bGF0ZWQuZmFpbHVyZXMuZ2V0KCkuZ2V0KDApOworICAgICAgICBUaHJvd2FibGVzLnRocm93SWZVbmNoZWNrZWQodCk7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHQpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKZGlmZiAtLWdpdCBhL3Rlc3Qvc2ltdWxhdG9yL3Rlc3Qvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL3Rlc3QvU2hvcnRQYXhvc1NpbXVsYXRpb25UZXN0LmphdmEgYi90ZXN0L3NpbXVsYXRvci90ZXN0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci90ZXN0L1Nob3J0UGF4b3NTaW11bGF0aW9uVGVzdC5qYXZhCmluZGV4IDE5ZDY2MDEuLmYxOTVmMWIgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc2ltdWxhdG9yL3Rlc3Qvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL3Rlc3QvU2hvcnRQYXhvc1NpbXVsYXRpb25UZXN0LmphdmEKKysrIGIvdGVzdC9zaW11bGF0b3IvdGVzdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvdGVzdC9TaG9ydFBheG9zU2ltdWxhdGlvblRlc3QuamF2YQpAQCAtNDAsMyArNDAsNCBAQAogICAgICAgICBQYXhvc1NpbXVsYXRpb25SdW5uZXIubWFpbihuZXcgU3RyaW5nW10geyAicmVjb25jaWxlIiwgIi1uIiwgIjMuLjYiLCAiLXQiLCAiMTAwMCIsICItYyIsICIyIiwgIi0tY2x1c3Rlci1hY3Rpb24tbGltaXQiLCAiMiIsICItcyIsICIzMCIsICItLXdpdGgtc2VsZiIgfSk7CiAgICAgfQogfQorCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvQWJzdHJhY3RTZXJpYWxpemF0aW9uc1Rlc3Rlci5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL0Fic3RyYWN0U2VyaWFsaXphdGlvbnNUZXN0ZXIuamF2YQppbmRleCA2NTAzNzA3Li5lYmI3NGE3IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvQWJzdHJhY3RTZXJpYWxpemF0aW9uc1Rlc3Rlci5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9BYnN0cmFjdFNlcmlhbGl6YXRpb25zVGVzdGVyLmphdmEKQEAgLTI3LDE3ICsyNywxOSBAQAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfVkVSU0lPTjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX1NFUklBTElaQVRJT05fV1JJVEVTOworCiBwdWJsaWMgY2xhc3MgQWJzdHJhY3RTZXJpYWxpemF0aW9uc1Rlc3RlcgogewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENVUl9WRVIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS52ZXJzaW9uIiwgIjQuMSIpOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENVUl9WRVIgPSBDQVNTQU5EUkFfVkVSU0lPTi5nZXRTdHJpbmcoIjQuMCIpOwogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgSW50ZWdlcj4gVkVSU0lPTl9NQVAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+ICgpCiAgICAge3sKICAgICAgICAgcHV0KCIzLjAiLCBNZXNzYWdpbmdTZXJ2aWNlLlZFUlNJT05fMzApOwogICAgICAgICBwdXQoIjQuMCIsIE1lc3NhZ2luZ1NlcnZpY2UuVkVSU0lPTl80MCk7Ci0gICAgICAgIHB1dCgiNC4xIiwgTWVzc2FnaW5nU2VydmljZS5WRVJTSU9OXzQxKTsKICAgICB9fTsKIAotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFWEVDVVRFX1dSSVRFUyA9IEJvb2xlYW4uZ2V0Qm9vbGVhbigiY2Fzc2FuZHJhLnRlc3Qtc2VyaWFsaXphdGlvbi13cml0ZXMiKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRVhFQ1VURV9XUklURVMgPSBURVNUX1NFUklBTElaQVRJT05fV1JJVEVTLmdldEJvb2xlYW4oKTsKIAogICAgIHByb3RlY3RlZCBzdGF0aWMgaW50IGdldFZlcnNpb24oKQogICAgIHsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9DYXNzYW5kcmFCcmllZkpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvQ2Fzc2FuZHJhQnJpZWZKVW5pdFJlc3VsdEZvcm1hdHRlci5qYXZhCmluZGV4IDJiZWZiNWMuLmRjOWI4ZjggMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9DYXNzYW5kcmFCcmllZkpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL0Nhc3NhbmRyYUJyaWVmSlVuaXRSZXN1bHRGb3JtYXR0ZXIuamF2YQpAQCAtMzYsNiArMzYsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0NBU1NBTkRSQV9LRUVQQlJJRUZCUklFRjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0NBU1NBTkRSQV9URVNUVEFHOworCiAvKioKICAqIFByaW50cyBwbGFpbiB0ZXh0IG91dHB1dCBvZiB0aGUgdGVzdCB0byBhIHNwZWNpZmllZCBXcml0ZXIuCiAgKiBJbnNwaXJlZCBieSB0aGUgUGxhaW5KVW5pdFJlc3VsdEZvcm1hdHRlci4KQEAgLTQ3LDkgKzUwLDkgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBPTkVfU0VDT05EID0gMTAwMC4wOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRhZyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnRlc3R0YWciLCAiIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRhZyA9IFRFU1RfQ0FTU0FORFJBX1RFU1RUQUcuZ2V0U3RyaW5nKCk7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCb29sZWFuIGtlZXBCcmllZkJyaWVmID0gQm9vbGVhbi5nZXRCb29sZWFuKCJjYXNzYW5kcmEua2VlcEJyaWVmQnJpZWYiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCb29sZWFuIGtlZXBCcmllZkJyaWVmID0gVEVTVF9DQVNTQU5EUkFfS0VFUEJSSUVGQlJJRUYuZ2V0Qm9vbGVhbigpOwogCiAgICAgLyoqCiAgICAgICogV2hlcmUgdG8gd3JpdGUgdGhlIGxvZyB0by4KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9DYXNzYW5kcmFYTUxKVW5pdFJlc3VsdEZvcm1hdHRlci5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL0Nhc3NhbmRyYVhNTEpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEKaW5kZXggZGU4ZmI0ZS4uNmY4MjFjMyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL0Nhc3NhbmRyYVhNTEpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL0Nhc3NhbmRyYVhNTEpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEKQEAgLTUwLDYgKzUwLDkgQEAKIGltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0NBU1NBTkRSQV9TVUlURU5BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9DQVNTQU5EUkFfVEVTVFRBRzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TVU5fSkFWQV9DT01NQU5EOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwuY3VycmVudFRpbWVNaWxsaXM7CiAKIC8qKgpAQCAtNzMsNyArNzYsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRhZyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnRlc3R0YWciLCAiIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRhZyA9IFRFU1RfQ0FTU0FORFJBX1RFU1RUQUcuZ2V0U3RyaW5nKCk7CiAKICAgICAvKgogICAgICAqIFNldCB0aGUgcHJvcGVydHkgZm9yIHRoZSB0ZXN0IHN1aXRlIG5hbWUgc28gdGhhdCBsb2cgY29uZmlndXJhdGlvbiBjYW4gcGljayBpdCB1cApAQCAtODEsOSArODQsOSBAQAogICAgICAqLwogICAgIHN0YXRpYwogICAgIHsKLSAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInN1bi5qYXZhLmNvbW1hbmQiKTsKKyAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSBTVU5fSkFWQV9DT01NQU5ELmdldFN0cmluZygpOwogICAgICAgICBTdHJpbmcgYXJnc1tdID0gY29tbWFuZC5zcGxpdCgiICIpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInN1aXRlbmFtZSIsIGFyZ3NbMV0pOworICAgICAgICBURVNUX0NBU1NBTkRSQV9TVUlURU5BTUUuc2V0U3RyaW5nKGFyZ3NbMV0pOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL0xvZ2JhY2tTdGF0dXNMaXN0ZW5lci5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL0xvZ2JhY2tTdGF0dXNMaXN0ZW5lci5qYXZhCmluZGV4IDcxOWZhZGEuLjgzNGQ1MWYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9Mb2diYWNrU3RhdHVzTGlzdGVuZXIuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvTG9nYmFja1N0YXR1c0xpc3RlbmVyLmphdmEKQEAgLTMzLDggKzMzLDEyIEBACiBpbXBvcnQgY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5zcGkuTG9nZ2VyQ29udGV4dExpc3RlbmVyOwogaW1wb3J0IGNoLnFvcy5sb2diYWNrLmNvcmUuc3RhdHVzLlN0YXR1czsKIGltcG9ydCBjaC5xb3MubG9nYmFjay5jb3JlLnN0YXR1cy5TdGF0dXNMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5JbnN0YW5jZUNsYXNzTG9hZGVyOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU1VOX1NUREVSUl9FTkNPRElORzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TVU5fU1RET1VUX0VOQ09ESU5HOworCiAvKgogICogTGlzdGVuIGZvciBsb2diYWNrIHJlYWRpbmVzcyBhbmQgdGhlbiByZWRpcmVjdCBzdGRvdXQvc3RkZXJyIHRvIGxvZ2JhY2sKICAqLwpAQCAtODQsOSArODgsOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgUHJpbnRTdHJlYW0gd3JhcExvZ2dlcihMb2dnZXIgbG9nZ2VyLCBQcmludFN0cmVhbSBvcmlnaW5hbCwgU3RyaW5nIGVuY29kaW5nUHJvcGVydHksIGJvb2xlYW4gZXJyb3IpIHRocm93cyBFeGNlcHRpb24KKyAgICBwcml2YXRlIHN0YXRpYyBQcmludFN0cmVhbSB3cmFwTG9nZ2VyKExvZ2dlciBsb2dnZXIsIFByaW50U3RyZWFtIG9yaWdpbmFsLCBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMgZW5jb2RpbmdQcm9wZXJ0eSwgYm9vbGVhbiBlcnJvcikgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kaW5nID0gU3lzdGVtLmdldFByb3BlcnR5KGVuY29kaW5nUHJvcGVydHkpOworICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RpbmcgPSBlbmNvZGluZ1Byb3BlcnR5LmdldFN0cmluZygpOwogICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBuZXcgVG9Mb2dnZXJPdXRwdXRTdHJlYW0obG9nZ2VyLCBlbmNvZGluZywgZXJyb3IpOwogICAgICAgICByZXR1cm4gZW5jb2RpbmcgIT0gbnVsbCA/IG5ldyBXcmFwcGVkUHJpbnRTdHJlYW0ob3MsIHRydWUsIGVuY29kaW5nLCBvcmlnaW5hbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgV3JhcHBlZFByaW50U3RyZWFtKG9zLCB0cnVlLCBvcmlnaW5hbCk7CkBAIC00NzUsOSArNDc5LDkgQEAKICAgICAgICAgICAgICAgICBMb2dnZXIgc3Rkb3V0TG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoInN0ZG91dCIpOwogICAgICAgICAgICAgICAgIExvZ2dlciBzdGRlcnJMb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcigic3RkZXJyIik7CiAKLSAgICAgICAgICAgICAgICByZXBsYWNlbWVudE91dCA9IHdyYXBMb2dnZXIoc3Rkb3V0TG9nZ2VyLCBvcmlnaW5hbE91dCwgInN1bi5zdGRvdXQuZW5jb2RpbmciLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRPdXQgPSB3cmFwTG9nZ2VyKHN0ZG91dExvZ2dlciwgb3JpZ2luYWxPdXQsIFNVTl9TVERPVVRfRU5DT0RJTkcsIGZhbHNlKTsKICAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0T3V0KHJlcGxhY2VtZW50T3V0KTsKLSAgICAgICAgICAgICAgICByZXBsYWNlbWVudEVyciA9IHdyYXBMb2dnZXIoc3RkZXJyTG9nZ2VyLCBvcmlnaW5hbEVyciwgInN1bi5zdGRlcnIuZW5jb2RpbmciLCB0cnVlKTsKKyAgICAgICAgICAgICAgICByZXBsYWNlbWVudEVyciA9IHdyYXBMb2dnZXIoc3RkZXJyTG9nZ2VyLCBvcmlnaW5hbEVyciwgU1VOX1NUREVSUl9FTkNPRElORywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgU3lzdGVtLnNldEVycihyZXBsYWNlbWVudEVycik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvU2NoZW1hTG9hZGVyLmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvU2NoZW1hTG9hZGVyLmphdmEKaW5kZXggMzI3OTQ5MC4uZjAxNzhkMSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL1NjaGVtYUxvYWRlci5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9TY2hlbWFMb2FkZXIuamF2YQpAQCAtNTAsNiArNTAsOSBAQAogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5BTExPV19VTlNBRkVfSk9JTjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0NPTVBSRVNTSU9OOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfQ09NUFJFU1NJT05fQUxHTzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLmN1cnJlbnRUaW1lTWlsbGlzOwogCiBwdWJsaWMgY2xhc3MgU2NoZW1hTG9hZGVyCkBAIC04Miw3ICs4NSw3IEBACiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0R29zc2lwZXIoKQogICAgIHsKICAgICAgICAgLy8gc2tpcCBzaGFkb3cgcm91bmQgYW5kIGVuZHBvaW50IGNvbGxpc2lvbiBjaGVjayBpbiB0ZXN0cwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5hbGxvd191bnNhZmVfam9pbiIsICJ0cnVlIik7CisgICAgICAgIEFMTE9XX1VOU0FGRV9KT0lOLnNldEJvb2xlYW4odHJ1ZSk7CiAgICAgICAgIGlmICghR29zc2lwZXIuaW5zdGFuY2UuaXNFbmFibGVkKCkpCiAgICAgICAgICAgICBHb3NzaXBlci5pbnN0YW5jZS5zdGFydCgoaW50KSAoY3VycmVudFRpbWVNaWxsaXMoKSAvIDEwMDApKTsKICAgICB9CkBAIC0yNDksNyArMjUyLDcgQEAKICAgICAgICAgZm9yIChLZXlzcGFjZU1ldGFkYXRhIGtzbSA6IHNjaGVtYSkKICAgICAgICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlTmV3S2V5c3BhY2Uoa3NtKTsKIAotICAgICAgICBpZiAoQm9vbGVhbi5wYXJzZUJvb2xlYW4oU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEudGVzdC5jb21wcmVzc2lvbiIsICJmYWxzZSIpKSkKKyAgICAgICAgaWYgKFRFU1RfQ09NUFJFU1NJT04uZ2V0Qm9vbGVhbigpKQogICAgICAgICAgICAgdXNlQ29tcHJlc3Npb24oc2NoZW1hLCBjb21wcmVzc2lvblBhcmFtcyhDb21wcmVzc2lvblBhcmFtcy5ERUZBVUxUX0NIVU5LX0xFTkdUSCkpOwogICAgIH0KIApAQCAtMjc0LDcgKzI3Nyw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlS2V5c3BhY2UoU3RyaW5nIG5hbWUsIEtleXNwYWNlUGFyYW1zIHBhcmFtcywgVGFibGVzIHRhYmxlcywgVHlwZXMgdHlwZXMpCiAgICAgewotICAgICAgICBTY2hlbWFUZXN0VXRpbC5hbm5vdW5jZU5ld0tleXNwYWNlKEtleXNwYWNlTWV0YWRhdGEuY3JlYXRlKG5hbWUsIHBhcmFtcywgdGFibGVzLCBWaWV3cy5ub25lKCksIHR5cGVzLCBGdW5jdGlvbnMubm9uZSgpKSk7CisgICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlTmV3S2V5c3BhY2UoS2V5c3BhY2VNZXRhZGF0YS5jcmVhdGUobmFtZSwgcGFyYW1zLCB0YWJsZXMsIFZpZXdzLm5vbmUoKSwgdHlwZXMsIFVzZXJGdW5jdGlvbnMubm9uZSgpKSk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwQXV0aChJUm9sZU1hbmFnZXIgcm9sZU1hbmFnZXIsIElBdXRoZW50aWNhdG9yIGF1dGhlbnRpY2F0b3IsIElBdXRob3JpemVyIGF1dGhvcml6ZXIsIElOZXR3b3JrQXV0aG9yaXplciBuZXR3b3JrQXV0aG9yaXplcikKQEAgLTI4Niw2ICsyODksNyBAQAogICAgICAgICBTY2hlbWFUZXN0VXRpbC5hbm5vdW5jZU5ld0tleXNwYWNlKEF1dGhLZXlzcGFjZS5tZXRhZGF0YSgpKTsKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldFJvbGVNYW5hZ2VyKCkuc2V0dXAoKTsKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldEF1dGhlbnRpY2F0b3IoKS5zZXR1cCgpOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0SW50ZXJub2RlQXV0aGVudGljYXRvcigpLnNldHVwSW50ZXJub2RlKCk7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5nZXRBdXRob3JpemVyKCkuc2V0dXAoKTsKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldE5ldHdvcmtBdXRob3JpemVyKCkuc2V0dXAoKTsKICAgICAgICAgU2NoZW1hLmluc3RhbmNlLnJlZ2lzdGVyTGlzdGVuZXIobmV3IEF1dGhTY2hlbWFDaGFuZ2VMaXN0ZW5lcigpKTsKQEAgLTI5OCw3ICszMDIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQoSW50ZWdlclR5cGUuaW5zdGFuY2UuZnJvbVN0cmluZygiNDIiKSwgSW50ZWdlclR5cGUuaW5zdGFuY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURjhUeXBlLmluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbk1ldGFkYXRhLk5PX1BPU0lUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbk1ldGFkYXRhLktpbmQuUkVHVUxBUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEuS2luZC5SRUdVTEFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgQ29sdW1uTWV0YWRhdGEgdXRmOENvbHVtbihTdHJpbmcga3NOYW1lLCBTdHJpbmcgY2ZOYW1lKQpAQCAtMzA4LDcgKzMxMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uSWRlbnRpZmllci5nZXRJbnRlcm5lZCgiZm9ydHl0d28iLCB0cnVlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEY4VHlwZS5pbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5NZXRhZGF0YS5OT19QT1NJVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5NZXRhZGF0YS5LaW5kLlJFR1VMQVIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbk1ldGFkYXRhLktpbmQuUkVHVUxBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIFRhYmxlTWV0YWRhdGEgcGVyUm93SW5kZXhlZENGTUQoU3RyaW5nIGtzTmFtZSwgU3RyaW5nIGNmTmFtZSkKQEAgLTcyMiw3ICs3MjgsNyBAQAogCiAgICAgcHVibGljIHN0YXRpYyBDb21wcmVzc2lvblBhcmFtcyBnZXRDb21wcmVzc2lvblBhcmFtZXRlcnMoSW50ZWdlciBjaHVua1NpemUpCiAgICAgewotICAgICAgICBpZiAoQm9vbGVhbi5wYXJzZUJvb2xlYW4oU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEudGVzdC5jb21wcmVzc2lvbiIsICJmYWxzZSIpKSkKKyAgICAgICAgaWYgKFRFU1RfQ09NUFJFU1NJT04uZ2V0Qm9vbGVhbigpKQogICAgICAgICAgICAgcmV0dXJuIGNodW5rU2l6ZSAhPSBudWxsID8gY29tcHJlc3Npb25QYXJhbXMoY2h1bmtTaXplKSA6IGNvbXByZXNzaW9uUGFyYW1zKENvbXByZXNzaW9uUGFyYW1zLkRFRkFVTFRfQ0hVTktfTEVOR1RIKTsKIAogICAgICAgICByZXR1cm4gQ29tcHJlc3Npb25QYXJhbXMubm9Db21wcmVzc2lvbigpOwpAQCAtNzU2LDcgKzc2Miw3IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBDb21wcmVzc2lvblBhcmFtcyBjb21wcmVzc2lvblBhcmFtcyhpbnQgY2h1bmtMZW5ndGgpCiAgICAgewotICAgICAgICBTdHJpbmcgYWxnbyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnRlc3QuY29tcHJlc3Npb24uYWxnbyIsICJsejQiKS50b0xvd2VyQ2FzZSgpOworICAgICAgICBTdHJpbmcgYWxnbyA9IFRFU1RfQ09NUFJFU1NJT05fQUxHTy5nZXRTdHJpbmcoKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICBzd2l0Y2ggKGFsZ28pCiAgICAgICAgIHsKICAgICAgICAgICAgIGNhc2UgImRlZmxhdGUiOgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL1NlcnZlclRlc3RVdGlscy5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL1NlcnZlclRlc3RVdGlscy5qYXZhCmluZGV4IDEwY2IwODIuLmZhNTlmMGQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9TZXJ2ZXJUZXN0VXRpbHMuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvU2VydmVyVGVzdFV0aWxzLmphdmEKQEAgLTIxLDE2ICsyMSwyMiBAQAogaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXVkaXQuQXVkaXRMb2dNYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU3lzdGVtS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeS5JbmRleFN1bW1hcnlTdXBwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkFic3RyYWN0RW5kcG9pbnRTbml0Y2g7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CkBAIC0yMDMsNCArMjA5LDIyIEBACiAgICAgcHJpdmF0ZSBTZXJ2ZXJUZXN0VXRpbHMoKQogICAgIHsKICAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8QmlnVGFibGVSZWFkZXI+IGdldExpdmVCaWdUYWJsZVJlYWRlcnMoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNmcy5nZXRMaXZlU1NUYWJsZXMoKQorICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJpZ1RhYmxlUmVhZGVyLmNsYXNzOjppc0luc3RhbmNlKQorICAgICAgICAgICAgICAgICAgLm1hcChCaWdUYWJsZVJlYWRlci5jbGFzczo6Y2FzdCkKKyAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFIgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyICYgSW5kZXhTdW1tYXJ5U3VwcG9ydDxSPj4gTGlzdDxSPiBnZXRMaXZlSW5kZXhTdW1tYXJ5U3VwcG9ydGluZ1JlYWRlcnMoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNmcy5nZXRMaXZlU1NUYWJsZXMoKQorICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAuZmlsdGVyKEluZGV4U3VtbWFyeVN1cHBvcnQuY2xhc3M6OmlzSW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAubWFwKHIgLT4gKFIpIHIpCisgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvVXRpbC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL1V0aWwuamF2YQppbmRleCAwNDU5Y2IzLi4zZTM2NjkyIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvVXRpbC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9VdGlsLmphdmEKQEAgLTIwLDkgKzIwLDEyIEBACiAgKi8KIAogaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FcnJvcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiBpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKQEAgLTExMyw2ICsxMTYsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2VxdWVuY2VCYXNlZFNTVGFibGVJZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlVVSURCYXNlZFNTVGFibGVJZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXJXaXRoRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SZXBsaWNhOwpAQCAtMTM2LDYgKzE0MSw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT3V0cHV0SGFuZGxlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOwogaW1wb3J0IG9yZy5hd2FpdGlsaXR5LkF3YWl0aWxpdHk7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKK2ltcG9ydCBvcmcubW9ja2l0by5pbnRlcm5hbC5zdHViYmluZy5kZWZhdWx0YW5zd2Vycy5Gb3J3YXJkc0ludm9jYXRpb25zOwogCiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5lcXVhbFRvOwpAQCAtNDY0LDEwICs0NzEsMTAgQEAKICAgICAgICAgICAgIGFzc2VydCBpdGVyYXRvci5oYXNOZXh0KCkgOiAiRXhwZWN0aW5nIG9uZSByb3cgaW4gb25lIHBhcnRpdGlvbiBidXQgZ290IG5vdGhpbmciOwogICAgICAgICAgICAgdHJ5IChSb3dJdGVyYXRvciBwYXJ0aXRpb24gPSBpdGVyYXRvci5uZXh0KCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0ICFpdGVyYXRvci5oYXNOZXh0KCkgOiAiRXhwZWN0aW5nIGEgc2luZ2xlIHBhcnRpdGlvbiBidXQgZ290IG1vcmUiOwogICAgICAgICAgICAgICAgIGFzc2VydCBwYXJ0aXRpb24uaGFzTmV4dCgpIDogIkV4cGVjdGluZyBvbmUgcm93IGluIG9uZSBwYXJ0aXRpb24gYnV0IGdvdCBhbiBlbXB0eSBwYXJ0aXRpb24iOwogICAgICAgICAgICAgICAgIFJvdyByb3cgPSBwYXJ0aXRpb24ubmV4dCgpOwogICAgICAgICAgICAgICAgIGFzc2VydCAhcGFydGl0aW9uLmhhc05leHQoKSA6ICJFeHBlY3RpbmcgYSBzaW5nbGUgcm93IGJ1dCBnb3QgbW9yZSI7CisgICAgICAgICAgICAgICAgYXNzZXJ0ICFpdGVyYXRvci5oYXNOZXh0KCkgOiAiRXhwZWN0aW5nIGEgc2luZ2xlIHBhcnRpdGlvbiBidXQgZ290IG1vcmUiOwogICAgICAgICAgICAgICAgIHJldHVybiByb3c7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTg1MCw3ICs4NTcsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChzc3QubmFtZSgpLmNvbnRhaW5zKCJEYXRhIikpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIGQgPSBEZXNjcmlwdG9yLmZyb21GaWxlbmFtZShzc3QuYWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIGQgPSBEZXNjcmlwdG9yLmZyb21GaWxlV2l0aENvbXBvbmVudChzc3QsIGZhbHNlKS5sZWZ0OwogICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGxpdmVJZGVudGlmaWVycy5jb250YWlucyhkLmlkKSk7CiAgICAgICAgICAgICAgICAgICAgIGZpbGVDb3VudCsrOwogICAgICAgICAgICAgICAgIH0KQEAgLTg1OSw2ICs4NjYsMTk5IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFNTVGFibGVDb3VudCwgZmlsZUNvdW50KTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXIgZ2VuZXJhdGVNdXJtdXJDb2xsaXNpb24oQnl0ZUJ1ZmZlciBvcmlnaW5hbCwgYnl0ZS4uLiBieXRlc1RvQWRkKQorICAgIHsKKyAgICAgICAgLy8gUm91bmQgc2l6ZSB1cCB0byAxNiwgYW5kIGFkZCBhbm90aGVyIDE2IGJ5dGVzCisgICAgICAgIEJ5dGVCdWZmZXIgY29sbGlzaW9uID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgob3JpZ2luYWwucmVtYWluaW5nKCkgKyBieXRlc1RvQWRkLmxlbmd0aCArIDMxKSAmIC0xNik7CisgICAgICAgIGNvbGxpc2lvbi5wdXQob3JpZ2luYWwpOyAgICAvLyB3ZSBjYW4gdXNlIHRoaXMgYXMgYSBjb3B5IG9mIG9yaWdpbmFsIHdpdGggMHMgYXBwZW5kZWQgYXQgdGhlIGVuZAorCisgICAgICAgIG9yaWdpbmFsLmZsaXAoKTsKKworICAgICAgICBsb25nIGMxID0gMHg4N2MzN2I5MTExNDI1M2Q1TDsKKyAgICAgICAgbG9uZyBjMiA9IDB4NGNmNWFkNDMyNzQ1OTM3Zkw7CisKKyAgICAgICAgbG9uZyBoMSA9IDA7CisgICAgICAgIGxvbmcgaDIgPSAwOworCisgICAgICAgIC8vIEdldCBoYXNoIG9mIG9yaWdpbmFsCisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBvcmlnaW5hbC5saW1pdCgpOworICAgICAgICB3aGlsZSAoaW5kZXggPD0gbGVuZ3RoIC0gMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgazEgPSBMb25nLnJldmVyc2VCeXRlcyhjb2xsaXNpb24uZ2V0TG9uZyhpbmRleCArIDApKTsKKyAgICAgICAgICAgIGxvbmcgazIgPSBMb25nLnJldmVyc2VCeXRlcyhjb2xsaXNpb24uZ2V0TG9uZyhpbmRleCArIDgpKTsKKworICAgICAgICAgICAgLy8gMTYgYnl0ZXMKKyAgICAgICAgICAgIGsxICo9IGMxOworICAgICAgICAgICAgazEgPSByb3RsNjQoazEsIDMxKTsKKyAgICAgICAgICAgIGsxICo9IGMyOworICAgICAgICAgICAgaDEgXj0gazE7CisgICAgICAgICAgICBoMSA9IHJvdGw2NChoMSwgMjcpOworICAgICAgICAgICAgaDEgKz0gaDI7CisgICAgICAgICAgICBoMSA9IGgxICogNSArIDB4NTJkY2U3Mjk7CisgICAgICAgICAgICBrMiAqPSBjMjsKKyAgICAgICAgICAgIGsyID0gcm90bDY0KGsyLCAzMyk7CisgICAgICAgICAgICBrMiAqPSBjMTsKKyAgICAgICAgICAgIGgyIF49IGsyOworICAgICAgICAgICAgaDIgPSByb3RsNjQoaDIsIDMxKTsKKyAgICAgICAgICAgIGgyICs9IGgxOworICAgICAgICAgICAgaDIgPSBoMiAqIDUgKyAweDM4NDk1YWI1OworCisgICAgICAgICAgICBpbmRleCArPSAxNjsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgb2gxID0gaDE7CisgICAgICAgIGxvbmcgb2gyID0gaDI7CisKKyAgICAgICAgLy8gUHJvY2VzcyBmaW5hbCB1bmZpbGxlZCBjaHVuaywgYnV0IG9ubHkgYWRqdXN0IHRoZSBvcmlnaW5hbCBoYXNoIHZhbHVlCisgICAgICAgIGlmIChpbmRleCA8IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBrMSA9IExvbmcucmV2ZXJzZUJ5dGVzKGNvbGxpc2lvbi5nZXRMb25nKGluZGV4ICsgMCkpOworICAgICAgICAgICAgbG9uZyBrMiA9IExvbmcucmV2ZXJzZUJ5dGVzKGNvbGxpc2lvbi5nZXRMb25nKGluZGV4ICsgOCkpOworCisgICAgICAgICAgICAvLyAxNiBieXRlcworICAgICAgICAgICAgazEgKj0gYzE7CisgICAgICAgICAgICBrMSA9IHJvdGw2NChrMSwgMzEpOworICAgICAgICAgICAgazEgKj0gYzI7CisgICAgICAgICAgICBvaDEgXj0gazE7CisKKyAgICAgICAgICAgIGsyICo9IGMyOworICAgICAgICAgICAgazIgPSByb3RsNjQoazIsIDMzKTsKKyAgICAgICAgICAgIGsyICo9IGMxOworICAgICAgICAgICAgb2gyIF49IGsyOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlc2UgYXJlIHRoZSBoYXNoZXMgdGhlIG9yaWdpbmFsIHdvdWxkIHByb3ZpZGUsIGJlZm9yZSBmaW5hbCBtaXhpbmcKKyAgICAgICAgb2gxIF49IG9yaWdpbmFsLmNhcGFjaXR5KCk7CisgICAgICAgIG9oMiBePSBvcmlnaW5hbC5jYXBhY2l0eSgpOworCisgICAgICAgIC8vIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBieXRlcyBiZWZvcmUgdGhlIGxhc3QgMTYgYW5kIGdldCB0aGVpciBoYXNoCisgICAgICAgIGNvbGxpc2lvbi5wdXQoYnl0ZXNUb0FkZCk7CisgICAgICAgIHdoaWxlICgoY29sbGlzaW9uLnBvc2l0aW9uKCkgJiAweDBmKSAhPSAwKQorICAgICAgICAgICAgY29sbGlzaW9uLnB1dCgoYnl0ZSkgMCk7CisKKyAgICAgICAgd2hpbGUgKGluZGV4IDwgY29sbGlzaW9uLnBvc2l0aW9uKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgazEgPSBMb25nLnJldmVyc2VCeXRlcyhjb2xsaXNpb24uZ2V0TG9uZyhpbmRleCArIDApKTsKKyAgICAgICAgICAgIGxvbmcgazIgPSBMb25nLnJldmVyc2VCeXRlcyhjb2xsaXNpb24uZ2V0TG9uZyhpbmRleCArIDgpKTsKKworICAgICAgICAgICAgLy8gMTYgYnl0ZXMKKyAgICAgICAgICAgIGsxICo9IGMxOworICAgICAgICAgICAgazEgPSByb3RsNjQoazEsIDMxKTsKKyAgICAgICAgICAgIGsxICo9IGMyOworICAgICAgICAgICAgaDEgXj0gazE7CisgICAgICAgICAgICBoMSA9IHJvdGw2NChoMSwgMjcpOworICAgICAgICAgICAgaDEgKz0gaDI7CisgICAgICAgICAgICBoMSA9IGgxICogNSArIDB4NTJkY2U3Mjk7CisgICAgICAgICAgICBrMiAqPSBjMjsKKyAgICAgICAgICAgIGsyID0gcm90bDY0KGsyLCAzMyk7CisgICAgICAgICAgICBrMiAqPSBjMTsKKyAgICAgICAgICAgIGgyIF49IGsyOworICAgICAgICAgICAgaDIgPSByb3RsNjQoaDIsIDMxKTsKKyAgICAgICAgICAgIGgyICs9IGgxOworICAgICAgICAgICAgaDIgPSBoMiAqIDUgKyAweDM4NDk1YWI1OworCisgICAgICAgICAgICBpbmRleCArPSAxNjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdvcmtpbmcgYmFja3dhcmRzLCB3ZSBtdXN0IGdldCB0aGlzIGhhc2ggcGFpcgorICAgICAgICBsb25nIHRoMSA9IGgxOworICAgICAgICBsb25nIHRoMiA9IGgyOworCisgICAgICAgIC8vIGFkanVzdCBvaHggd2l0aCBsZW5ndGgKKyAgICAgICAgaDEgPSBvaDEgXiBjb2xsaXNpb24uY2FwYWNpdHkoKTsKKyAgICAgICAgaDIgPSBvaDIgXiBjb2xsaXNpb24uY2FwYWNpdHkoKTsKKworICAgICAgICAvLyBHZXQgbW9kdWxvLWxvbmcgaW52ZXJzZXMgb2YgdGhlIG11bHRpcGxpZXJzIHVzZWQgaW4gdGhlIGNvbXB1dGF0aW9uCisgICAgICAgIGxvbmcgaTVpID0gaW52ZXJzZSg1TCk7CisgICAgICAgIGxvbmcgYzFpID0gaW52ZXJzZShjMSk7CisgICAgICAgIGxvbmcgYzJpID0gaW52ZXJzZShjMik7CisKKyAgICAgICAgLy8gcmV2ZXJ0IG9uZSBzdGVwCisgICAgICAgIGgyIC09IDB4Mzg0OTVhYjU7CisgICAgICAgIGgyICo9IGk1aTsKKyAgICAgICAgaDIgLT0gaDE7CisgICAgICAgIGgyID0gcm90bDY0KGgyLCAzMyk7CisKKyAgICAgICAgaDEgLT0gMHg1MmRjZTcyOTsKKyAgICAgICAgaDEgKj0gaTVpOworICAgICAgICBoMSAtPSB0aDI7ICAvLyB1c2UgaDIgYmVmb3JlIGl0J3MgYWRqdXN0ZWQgd2l0aCBrMgorICAgICAgICBoMSA9IHJvdGw2NChoMSwgMzcpOworCisgICAgICAgIC8vIGV4dHJhY3QgdGhlIHJlcXVpcmVkIG1vZGlmaWVycyBhbmQgYXBwbGllcyB0aGUgaW52ZXJzZSBvZiB0aGVpciB0cmFuc2Zvcm1hdGlvbgorICAgICAgICBsb25nIGsxID0gaDEgXiB0aDE7CisgICAgICAgIGsxID0gYzJpICogazE7CisgICAgICAgIGsxID0gcm90bDY0KGsxLCAzMyk7CisgICAgICAgIGsxID0gYzFpICogazE7CisKKyAgICAgICAgbG9uZyBrMiA9IGgyIF4gdGgyOworICAgICAgICBrMiA9IGMxaSAqIGsyOworICAgICAgICBrMiA9IHJvdGw2NChrMiwgMzEpOworICAgICAgICBrMiA9IGMyaSAqIGsyOworCisgICAgICAgIGNvbGxpc2lvbi5wdXRMb25nKExvbmcucmV2ZXJzZUJ5dGVzKGsxKSk7CisgICAgICAgIGNvbGxpc2lvbi5wdXRMb25nKExvbmcucmV2ZXJzZUJ5dGVzKGsyKSk7CisgICAgICAgIGNvbGxpc2lvbi5mbGlwKCk7CisKKyAgICAgICAgcmV0dXJuIGNvbGxpc2lvbjsKKyAgICB9CisKKyAgICAvLyBBc3N1bWVzIGEgYW5kIGIgYXJlIHBvc2l0aXZlCisgICAgcHJpdmF0ZSBzdGF0aWMgQmlnSW50ZWdlcltdIHhnY2QoQmlnSW50ZWdlciBhLCBCaWdJbnRlZ2VyIGIpIHsKKyAgICAgICAgQmlnSW50ZWdlciB4ID0gYSwgeSA9IGI7CisgICAgICAgIEJpZ0ludGVnZXJbXSBxcmVtOworICAgICAgICBCaWdJbnRlZ2VyW10gcmVzdWx0ID0gbmV3IEJpZ0ludGVnZXJbM107CisgICAgICAgIEJpZ0ludGVnZXIgeDAgPSBCaWdJbnRlZ2VyLk9ORSwgeDEgPSBCaWdJbnRlZ2VyLlpFUk87CisgICAgICAgIEJpZ0ludGVnZXIgeTAgPSBCaWdJbnRlZ2VyLlpFUk8sIHkxID0gQmlnSW50ZWdlci5PTkU7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBxcmVtID0geC5kaXZpZGVBbmRSZW1haW5kZXIoeSk7CisgICAgICAgICAgICB4ID0gcXJlbVsxXTsKKyAgICAgICAgICAgIHgwID0geDAuc3VidHJhY3QoeTAubXVsdGlwbHkocXJlbVswXSkpOworICAgICAgICAgICAgeDEgPSB4MS5zdWJ0cmFjdCh5MS5tdWx0aXBseShxcmVtWzBdKSk7CisgICAgICAgICAgICBpZiAoeC5lcXVhbHMoQmlnSW50ZWdlci5aRVJPKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHRbMF0gPSB5OworICAgICAgICAgICAgICAgIHJlc3VsdFsxXSA9IHkwOworICAgICAgICAgICAgICAgIHJlc3VsdFsyXSA9IHkxOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHFyZW0gPSB5LmRpdmlkZUFuZFJlbWFpbmRlcih4KTsKKyAgICAgICAgICAgIHkgPSBxcmVtWzFdOworICAgICAgICAgICAgeTAgPSB5MC5zdWJ0cmFjdCh4MC5tdWx0aXBseShxcmVtWzBdKSk7CisgICAgICAgICAgICB5MSA9IHkxLnN1YnRyYWN0KHgxLm11bHRpcGx5KHFyZW1bMF0pKTsKKyAgICAgICAgICAgIGlmICh5LmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdFswXSA9IHg7CisgICAgICAgICAgICAgICAgcmVzdWx0WzFdID0geDA7CisgICAgICAgICAgICAgICAgcmVzdWx0WzJdID0geDE7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgYSBtdXBsdGlwbGljYXRpdmUgaW52ZXJzZSBmb3IgdGhlIGdpdmVuIG11bHRpcGxpZXIgZm9yIGxvbmcsIGkuZS4KKyAgICAgKiBzdWNoIHRoYXQgeCAqIGludmVyc2UoeCkgPSAxIHdoZXJlICogaXMgbG9uZyBtdWx0aXBsaWNhdGlvbi4KKyAgICAgKiBJbiBvdGhlciB3b3Jkcywgc3VjaCBhbiBpbnRlZ2VyIHRoYXQgeCAqIGludmVyc2UoeCkgPT0gMSAobW9kIDJeNjQpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBpbnZlcnNlKGxvbmcgbXVsdGlwbGllcikKKyAgICB7CisgICAgICAgIGZpbmFsIEJpZ0ludGVnZXIgbW9kdWx1cyA9IEJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdCg2NCk7CisgICAgICAgIC8vIEFkZCB0aGUgbW9kdWx1cyB0byB0aGUgbXVsdGlwbGllciB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIG5lZ2F0aXZlcyAoYSArIG0gPT0gYSAobW9kIG0pKQorICAgICAgICBCaWdJbnRlZ2VyW10gZ2NkcyA9IHhnY2QoQmlnSW50ZWdlci52YWx1ZU9mKG11bHRpcGxpZXIpLmFkZChtb2R1bHVzKSwgbW9kdWx1cyk7CisgICAgICAgIC8vIHhnY2QgZ2l2ZXMgZywgYSBhbmQgYiwgc3VjaCB0aGF0IGF4ICsgYm0gPSBnCisgICAgICAgIC8vIGllLCBheCA9IGcgKG1vZCBtKS4gUmV0dXJuIGEKKyAgICAgICAgYXNzZXJ0IGdjZHNbMF0uZXF1YWxzKEJpZ0ludGVnZXIuT05FKSA6ICJFdmVuIG51bWJlciAiICsgbXVsdGlwbGllciArICIgaGFzIG5vIGxvbmcgaW52ZXJzZSI7CisgICAgICAgIHJldHVybiBnY2RzWzFdLmxvbmdWYWx1ZUV4YWN0KCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBsb25nIHJvdGw2NChsb25nIHYsIGludCBuKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgodiA8PCBuKSB8ICh2ID4+PiAoNjQgLSBuKSkpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIERpc2FibGUgYmxvb20gZmlsdGVyIG9uIGFsbCBzc3RhYmxlcyBvZiBnaXZlbiB0YWJsZQogICAgICAqLwpAQCAtODY5LDcgKzEwNjksNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNzdGFibGUgPSBzc3RhYmxlLmNsb25lQW5kUmVwbGFjZShGaWx0ZXJGYWN0b3J5LkFsd2F5c1ByZXNlbnQpOworICAgICAgICAgICAgICAgIHNzdGFibGUgPSAoKFNTVGFibGVSZWFkZXJXaXRoRmlsdGVyKSBzc3RhYmxlKS5jbG9uZUFuZFJlcGxhY2UoRmlsdGVyRmFjdG9yeS5BbHdheXNQcmVzZW50KTsKICAgICAgICAgICAgICAgICB0eG4udXBkYXRlKHNzdGFibGUsIHRydWUpOwogICAgICAgICAgICAgICAgIHR4bi5jaGVja3BvaW50KCk7CiAgICAgICAgICAgICB9CkBAIC04NzcsNyArMTA3Nyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgcmVhZGVyIDogY2ZzLmdldExpdmVTU1RhYmxlcygpKQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbHRlckZhY3RvcnkuQWx3YXlzUHJlc2VudCwgcmVhZGVyLmdldEJsb29tRmlsdGVyKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsICgoU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIpIHJlYWRlcikuZ2V0RmlsdGVyT2ZmSGVhcFNpemUoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDQyLDQgKzEyNDIsMjMgQEAKICAgICB7CiAgICAgICAgIHZpZXcuZm9yY2VCbG9ja2luZ0ZsdXNoKENvbHVtbkZhbWlseVN0b3JlLkZsdXNoUmVhc29uLlVOSVRfVEVTVFMpOwogICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGF0YUlucHV0U3RyZWFtUGx1c0ltcGwgZXh0ZW5kcyBEYXRhSW5wdXRTdHJlYW0gaW1wbGVtZW50cyBEYXRhSW5wdXRQbHVzCisgICAgeworICAgICAgICBwcml2YXRlIERhdGFJbnB1dFN0cmVhbVBsdXNJbXBsKElucHV0U3RyZWFtIGluKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihpbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIERhdGFJbnB1dFN0cmVhbVBsdXMgd3JhcChJbnB1dFN0cmVhbSBpbikKKyAgICAgICAgeworICAgICAgICAgICAgRGF0YUlucHV0U3RyZWFtUGx1c0ltcGwgaW1wbCA9IG5ldyBEYXRhSW5wdXRTdHJlYW1QbHVzSW1wbChpbik7CisgICAgICAgICAgICByZXR1cm4gTW9ja2l0by5tb2NrKERhdGFJbnB1dFN0cmVhbVBsdXMuY2xhc3MsIG5ldyBGb3J3YXJkc0ludm9jYXRpb25zKGltcGwpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUnVudGltZUV4Y2VwdGlvbiB0ZXN0TXVzdEJlSW1wbGVtZW50ZWRGb3JTU1RhYmxlRm9ybWF0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRlc3QgbXVzdCBiZSBpbXBsZW1lbnRlZCBmb3Igc3N0YWJsZSBmb3JtYXQgIiArIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1ZGl0L0F1ZGl0TG9nZ2VyQXV0aFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdWRpdC9BdWRpdExvZ2dlckF1dGhUZXN0LmphdmEKaW5kZXggOWEzYzYwNS4uMGNlZDVhMSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1ZGl0L0F1ZGl0TG9nZ2VyQXV0aFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXVkaXQvQXVkaXRMb2dnZXJBdXRoVGVzdC5qYXZhCkBAIC00Miw2ICs0Miw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5FbWJlZGRlZENhc3NhbmRyYVNlcnZpY2U7CiBpbXBvcnQgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVyczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlNVUEVSVVNFUl9TRVRVUF9ERUxBWV9NUzsKIGltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5jb250YWluc1N0cmluZzsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOwpAQCAtNzUsNyArNzYsNyBAQAogICAgICAgICAgICAgY29uZmlnLmF1ZGl0X2xvZ2dpbmdfb3B0aW9ucy5sb2dnZXIgPSBuZXcgUGFyYW1ldGVyaXplZENsYXNzKCJJbk1lbW9yeUF1ZGl0TG9nZ2VyIiwgbnVsbCk7CiAgICAgICAgIH0pOwogCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnN1cGVydXNlcl9zZXR1cF9kZWxheV9tcyIsICIwIik7CisgICAgICAgIFNVUEVSVVNFUl9TRVRVUF9ERUxBWV9NUy5zZXRMb25nKDApOwogICAgICAgICBlbWJlZGRlZCA9IFNlcnZlclRlc3RVdGlscy5zdGFydEVtYmVkZGVkQ2Fzc2FuZHJhU2VydmljZSgpOwogCiAgICAgICAgIGV4ZWN1dGVXaXRoQ3JlZGVudGlhbHMoCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXVkaXQvQXVkaXRMb2dnZXJDbGVhbnVwVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1ZGl0L0F1ZGl0TG9nZ2VyQ2xlYW51cFRlc3QuamF2YQppbmRleCA4OTE4MjdjLi5lYmM1ZWFkIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXVkaXQvQXVkaXRMb2dnZXJDbGVhbnVwVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdWRpdC9BdWRpdExvZ2dlckNsZWFudXBUZXN0LmphdmEKQEAgLTQxLDYgKzQxLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwogCiBpbXBvcnQgc3RhdGljIGphdmEubmlvLmZpbGUuRmlsZXMubGlzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TVVBFUlVTRVJfU0VUVVBfREVMQVlfTVM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIApAQCAtNjksNyArNzAsOCBAQAogICAgICAgICBlbXB0eUNxNEZpbGUgPSBGaWxlcy5jcmVhdGVGaWxlKGF1ZGl0TG9nRGlyUm9vdC50b1BhdGgoKS5yZXNvbHZlKCIyMDIyMDkyOC0xMiIgKyBTaW5nbGVDaHJvbmljbGVRdWV1ZS5TVUZGSVgpKS50b0ZpbGUoKTsKICAgICAgICAgZW1wdHlNZXRhZGF0YUZpbGUgPSBGaWxlcy5jcmVhdGVGaWxlKGF1ZGl0TG9nRGlyUm9vdC50b1BhdGgoKS5yZXNvbHZlKCJtZXRhZGF0YSIgKyBTaW5nbGVUYWJsZVN0b3JlLlNVRkZJWCkpLnRvRmlsZSgpOwogCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnN1cGVydXNlcl9zZXR1cF9kZWxheV9tcyIsICIwIik7CisgICAgICAgIFNVUEVSVVNFUl9TRVRVUF9ERUxBWV9NUy5zZXRMb25nKDApOworCiAgICAgICAgIGVtYmVkZGVkID0gbmV3IEVtYmVkZGVkQ2Fzc2FuZHJhU2VydmljZSgpOwogICAgICAgICBlbWJlZGRlZC5zdGFydCgpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdWRpdC9BdWRpdExvZ2dlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdWRpdC9BdWRpdExvZ2dlclRlc3QuamF2YQppbmRleCAxZWU2NmY3Li45ZGZkMTcxIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXVkaXQvQXVkaXRMb2dnZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1ZGl0L0F1ZGl0TG9nZ2VyVGVzdC5qYXZhCkBAIC00OTYsNyArNDk2LDcgQEAKICAgICB7CiAgICAgICAgIFN0cmluZyB0YmxOYW1lID0gY3JlYXRlVGFibGVOYW1lKCk7CiAKLSAgICAgICAgU3RyaW5nIGNxbCA9ICJDUkVBVEUgRlVOQ1RJT04gSUYgTk9UIEVYSVNUUyAgIiArIEtFWVNQQUNFICsgIi4iICsgdGJsTmFtZSArICIgKGNvbHVtbiBURVhULG51bSBpbnQpIFJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUIFJFVFVSTlMgdGV4dCBMQU5HVUFHRSBqYXZhc2NyaXB0IEFTICQkIGNvbHVtbi5zdWJzdHJpbmcoMCxudW0pICQkIjsKKyAgICAgICAgU3RyaW5nIGNxbCA9ICJDUkVBVEUgRlVOQ1RJT04gSUYgTk9UIEVYSVNUUyAgIiArIEtFWVNQQUNFICsgIi4iICsgdGJsTmFtZSArICIgKGNvbHVtbiBURVhULG51bSBpbnQpIFJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUIFJFVFVSTlMgdGV4dCBMQU5HVUFHRSBqYXZhIEFTICQkIHJldHVybiBjb2x1bW4uc3Vic3RyaW5nKDAsbnVtKTsgJCQiOwogICAgICAgICBleGVjdXRlQW5kQXNzZXJ0KGNxbCwgQXVkaXRMb2dFbnRyeVR5cGUuQ1JFQVRFX0ZVTkNUSU9OKTsKIAogICAgICAgICBjcWwgPSAiRFJPUCBGVU5DVElPTiAiICsgS0VZU1BBQ0UgKyAiLiIgKyB0YmxOYW1lOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvQXV0aENhY2hlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvQXV0aENhY2hlVGVzdC5qYXZhCmluZGV4IDBlMjIzNDYuLjUwYTBhOWMgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL0F1dGhDYWNoZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9BdXRoQ2FjaGVUZXN0LmphdmEKQEAgLTMzLDYgKzMzLDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db25zaXN0ZW5jeUxldmVsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuVW5hdmFpbGFibGVFeGNlcHRpb247CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5BVVRIX0NBQ0hFX1dBUk1JTkdfTUFYX1JFVFJJRVM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQVVUSF9DQUNIRV9XQVJNSU5HX1JFVFJZX0lOVEVSVkFMX01TOwogaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CkBAIC0yNjQsOCArMjY2LDggQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIGhhbmRsZVByb3ZpZGVyRXJyb3JEdXJpbmdXYXJtaW5nKCkKICAgICB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShBdXRoQ2FjaGUuQ0FDSEVfTE9BRF9SRVRSSUVTX1BST1BFUlRZLCAiMyIpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoQXV0aENhY2hlLkNBQ0hFX0xPQURfUkVUUllfSU5URVJWQUxfUFJPUEVSVFksICIwIik7CisgICAgICAgIEFVVEhfQ0FDSEVfV0FSTUlOR19NQVhfUkVUUklFUy5zZXRJbnQoMyk7CisgICAgICAgIEFVVEhfQ0FDSEVfV0FSTUlOR19SRVRSWV9JTlRFUlZBTF9NUy5zZXRMb25nKDApOwogICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGF0dGVtcHRzID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CiAKICAgICAgICAgU3VwcGxpZXI8TWFwPFN0cmluZywgSW50ZWdlcj4+IGJ1bGtMb2FkZXIgPSAoKSAtPiB7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9DcmVhdGVBbmRBbHRlclJvbGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9DcmVhdGVBbmRBbHRlclJvbGVUZXN0LmphdmEKaW5kZXggMzNhZTEyOS4uNmJiODNiMyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvQ3JlYXRlQW5kQWx0ZXJSb2xlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL0NyZWF0ZUFuZEFsdGVyUm9sZVRlc3QuamF2YQpAQCAtMjEsMTEgKzIxLDEwIEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCi1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLmV4Y2VwdGlvbnMuQXV0aGVudGljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5taW5kcm90LmpiY3J5cHQuQkNyeXB0LmdlbnNhbHQ7CiBpbXBvcnQgc3RhdGljIG9yZy5taW5kcm90LmpiY3J5cHQuQkNyeXB0Lmhhc2hwdzsKIApAQCAtMzQsNiArMzMsMTIgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCiAgICAgeworICAgICAgICBTZXJ2ZXJUZXN0VXRpbHMuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0UGVybWlzc2lvbnNWYWxpZGl0eSgwKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFJvbGVzVmFsaWRpdHkoMCk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDcmVkZW50aWFsc1ZhbGlkaXR5KDApOworCiAgICAgICAgIENRTFRlc3Rlci5zZXRVcENsYXNzKCk7CiAgICAgICAgIHJlcXVpcmVBdXRoZW50aWNhdGlvbigpOwogICAgICAgICByZXF1aXJlTmV0d29yaygpOwpAQCAtNjIsMTEgKzY3LDExIEBACiAKICAgICAgICAgdXNlVXNlcih1c2VyMSwgcGxhaW5UZXh0UHdkKTsKIAotICAgICAgICBleGVjdXRlTmV0V2l0aEF1dGhTcGluKCJTRUxFQ1Qga2V5IEZST00gc3lzdGVtLmxvY2FsIik7CisgICAgICAgIGV4ZWN1dGVOZXQoIlNFTEVDVCBrZXkgRlJPTSBzeXN0ZW0ubG9jYWwiKTsKIAogICAgICAgICB1c2VVc2VyKHVzZXIyLCBwbGFpblRleHRQd2QpOwogCi0gICAgICAgIGV4ZWN1dGVOZXRXaXRoQXV0aFNwaW4oIlNFTEVDVCBrZXkgRlJPTSBzeXN0ZW0ubG9jYWwiKTsKKyAgICAgICAgZXhlY3V0ZU5ldCgiU0VMRUNUIGtleSBGUk9NIHN5c3RlbS5sb2NhbCIpOwogCiAgICAgICAgIHVzZVN1cGVyVXNlcigpOwogCkBAIC03OCwxMSArODMsMTEgQEAKIAogICAgICAgICB1c2VVc2VyKHVzZXIxLCBwbGFpblRleHRQd2QyKTsKIAotICAgICAgICBleGVjdXRlTmV0V2l0aEF1dGhTcGluKCJTRUxFQ1Qga2V5IEZST00gc3lzdGVtLmxvY2FsIik7CisgICAgICAgIGV4ZWN1dGVOZXQoIlNFTEVDVCBrZXkgRlJPTSBzeXN0ZW0ubG9jYWwiKTsKIAogICAgICAgICB1c2VVc2VyKHVzZXIyLCBwbGFpblRleHRQd2QyKTsKIAotICAgICAgICBleGVjdXRlTmV0V2l0aEF1dGhTcGluKCJTRUxFQ1Qga2V5IEZST00gc3lzdGVtLmxvY2FsIik7CisgICAgICAgIGV4ZWN1dGVOZXQoIlNFTEVDVCBrZXkgRlJPTSBzeXN0ZW0ubG9jYWwiKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTA1LDExICsxMTAsMTEgQEAKIAogICAgICAgICB1c2VVc2VyKHVzZXIxLCBwbGFpblRleHRQd2QpOwogCi0gICAgICAgIGV4ZWN1dGVOZXRXaXRoQXV0aFNwaW4oIlNFTEVDVCBrZXkgRlJPTSBzeXN0ZW0ubG9jYWwiKTsKKyAgICAgICAgZXhlY3V0ZU5ldCgiU0VMRUNUIGtleSBGUk9NIHN5c3RlbS5sb2NhbCIpOwogCiAgICAgICAgIHVzZVVzZXIodXNlcjIsIHBsYWluVGV4dFB3ZCk7CiAKLSAgICAgICAgZXhlY3V0ZU5ldFdpdGhBdXRoU3BpbigiU0VMRUNUIGtleSBGUk9NIHN5c3RlbS5sb2NhbCIpOworICAgICAgICBleGVjdXRlTmV0KCJTRUxFQ1Qga2V5IEZST00gc3lzdGVtLmxvY2FsIik7CiAKICAgICAgICAgdXNlU3VwZXJVc2VyKCk7CiAKQEAgLTExOCwzMiArMTIzLDEwIEBACiAKICAgICAgICAgdXNlVXNlcih1c2VyMSwgcGxhaW5UZXh0UHdkMik7CiAKLSAgICAgICAgZXhlY3V0ZU5ldFdpdGhBdXRoU3BpbigiU0VMRUNUIGtleSBGUk9NIHN5c3RlbS5sb2NhbCIpOworICAgICAgICBleGVjdXRlTmV0KCJTRUxFQ1Qga2V5IEZST00gc3lzdGVtLmxvY2FsIik7CiAKICAgICAgICAgdXNlVXNlcih1c2VyMiwgcGxhaW5UZXh0UHdkMik7CiAKLSAgICAgICAgZXhlY3V0ZU5ldFdpdGhBdXRoU3BpbigiU0VMRUNUIGtleSBGUk9NIHN5c3RlbS5sb2NhbCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsdGVyaW5nIG9yIGNyZWF0aW5nIGF1dGggbWF5IHRha2Ugc29tZSB0aW1lIHRvIGJlIGVmZmVjdGl2ZQotICAgICAqCi0gICAgICogQHBhcmFtIHF1ZXJ5Ci0gICAgICovCi0gICAgdm9pZCBleGVjdXRlTmV0V2l0aEF1dGhTcGluKFN0cmluZyBxdWVyeSkKLSAgICB7Ci0gICAgICAgIFV0aWwuc3BpbkFzc2VydEVxdWFscyh0cnVlLCAoKSAtPiB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleGVjdXRlTmV0KHF1ZXJ5KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbjogIiArIGUsIGUgaW5zdGFuY2VvZiBBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbik7Ci0gICAgICAgICAgICAgICAgcmVpbml0aWFsaXplTmV0d29yaygpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgMTApOworICAgICAgICBleGVjdXRlTmV0KCJTRUxFQ1Qga2V5IEZST00gc3lzdGVtLmxvY2FsIik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvR3JhbnRBbmRSZXZva2VUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9HcmFudEFuZFJldm9rZVRlc3QuamF2YQppbmRleCA1YzFjMmEwLi5lZWZmMDUyIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9HcmFudEFuZFJldm9rZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9HcmFudEFuZFJldm9rZVRlc3QuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlJlc3VsdFNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOwpAQCAtMzYsNiArMzcsNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcENsYXNzKCkKICAgICB7CisgICAgICAgIFNlcnZlclRlc3RVdGlscy5kYWVtb25Jbml0aWFsaXphdGlvbigpOwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0UGVybWlzc2lvbnNWYWxpZGl0eSgwKTsKICAgICAgICAgQ1FMVGVzdGVyLnNldFVwQ2xhc3MoKTsKICAgICAgICAgcmVxdWlyZUF1dGhlbnRpY2F0aW9uKCk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9QYXNzd29yZEF1dGhlbnRpY2F0b3JUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9QYXNzd29yZEF1dGhlbnRpY2F0b3JUZXN0LmphdmEKaW5kZXggZTEwMzNmZi4uMGE4ZWZjMiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvUGFzc3dvcmRBdXRoZW50aWNhdG9yVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL1Bhc3N3b3JkQXV0aGVudGljYXRvclRlc3QuamF2YQpAQCAtMjYsNiArMjYsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5XaXRoUHJvcGVydGllczsKIGltcG9ydCBvcmcubWluZHJvdC5qYmNyeXB0LkJDcnlwdDsKIAogaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5BdXRoZW50aWNhdG9yOwpAQCAtNDUsMTQgKzQ2LDEzIEBACiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguQ2Fzc2FuZHJhUm9sZU1hbmFnZXIuZ2V0R2Vuc2FsdExvZ1JvdW5kczsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5QYXNzd29yZEF1dGhlbnRpY2F0b3IuU2FzbE5lZ290aWF0b3I7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguUGFzc3dvcmRBdXRoZW50aWNhdG9yLmNoZWNrcHc7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQVVUSF9CQ1JZUFRfR0VOU0FMVF9MT0cyX1JPVU5EUzsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLm1pbmRyb3QuamJjcnlwdC5CQ3J5cHQuZ2Vuc2FsdDsKIGltcG9ydCBzdGF0aWMgb3JnLm1pbmRyb3QuamJjcnlwdC5CQ3J5cHQuaGFzaHB3OwogCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguQ2Fzc2FuZHJhUm9sZU1hbmFnZXIuR0VOU0FMVF9MT0cyX1JPVU5EU19QUk9QRVJUWTsKLQogcHVibGljIGNsYXNzIFBhc3N3b3JkQXV0aGVudGljYXRvclRlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKIHsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXNzd29yZEF1dGhlbnRpY2F0b3IgYXV0aGVudGljYXRvciA9IG5ldyBQYXNzd29yZEF1dGhlbnRpY2F0b3IoKTsKQEAgLTExOSwxOSArMTE5LDEwIEBACiAKICAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZVNhbHRSb3VuZHNQcm9wZXJ0eVRlc3QoSW50ZWdlciByb3VuZHMpCiAgICAgewotICAgICAgICBTdHJpbmcgb2xkUHJvcGVydHkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoR0VOU0FMVF9MT0cyX1JPVU5EU19QUk9QRVJUWSk7Ci0gICAgICAgIHRyeQorICAgICAgICB0cnkgKFdpdGhQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgV2l0aFByb3BlcnRpZXMoKS5zZXQoQVVUSF9CQ1JZUFRfR0VOU0FMVF9MT0cyX1JPVU5EUywgcm91bmRzKSkKICAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KEdFTlNBTFRfTE9HMl9ST1VORFNfUFJPUEVSVFksIHJvdW5kcy50b1N0cmluZygpKTsKICAgICAgICAgICAgIGdldEdlbnNhbHRMb2dSb3VuZHMoKTsKLSAgICAgICAgICAgIEFzc2VydC5mYWlsKCJQcm9wZXJ0eSAiICsgR0VOU0FMVF9MT0cyX1JPVU5EU19QUk9QRVJUWSArICIgbXVzdCBiZSBpbiBpbnRlcnZhbCBbNCwzMF0iKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvbGRQcm9wZXJ0eSAhPSBudWxsKQotICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShHRU5TQUxUX0xPRzJfUk9VTkRTX1BST1BFUlRZLCBvbGRQcm9wZXJ0eSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoR0VOU0FMVF9MT0cyX1JPVU5EU19QUk9QRVJUWSk7CisgICAgICAgICAgICBBc3NlcnQuZmFpbCgiUHJvcGVydHkgIiArIEFVVEhfQkNSWVBUX0dFTlNBTFRfTE9HMl9ST1VORFMuZ2V0S2V5KCkgKyAiIG11c3QgYmUgaW4gaW50ZXJ2YWwgWzQsMzBdIik7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL2pteC9KTVhBdXRoVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvam14L0pNWEF1dGhUZXN0LmphdmEKaW5kZXggM2JjMjhhOS4uZmVjZTQwNSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvam14L0pNWEF1dGhUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvam14L0pNWEF1dGhUZXN0LmphdmEKQEAgLTQzLDYgKzQzLDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmVNQmVhbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5KTVhTZXJ2ZXJVdGlsczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9KTVhfQVVUSE9SSVpFUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfSk1YX1JFTU9URV9MT0dJTl9DT05GSUc7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09NX1NVTl9NQU5BR0VNRU5UX0pNWFJFTU9URV9BVVRIRU5USUNBVEU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSkFWQV9TRUNVUklUWV9BVVRIX0xPR0lOX0NPTkZJRzsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIApAQCAtODYsMTAgKzkwLDEwIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXR1cEpNWFNlcnZlcigpIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIFN0cmluZyBjb25maWcgPSBQYXRocy5nZXQoQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2UoImF1dGgvY2Fzc2FuZHJhLXRlc3QtamFhcy5jb25mIikudG9VUkkoKSkudG9TdHJpbmcoKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLmF1dGhlbnRpY2F0ZSIsICJ0cnVlIik7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YS5zZWN1cml0eS5hdXRoLmxvZ2luLmNvbmZpZyIsIGNvbmZpZyk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmpteC5yZW1vdGUubG9naW4uY29uZmlnIiwgIlRlc3RMb2dpbiIpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5qbXguYXV0aG9yaXplciIsIE5vU3VwZXJVc2VyQXV0aG9yaXphdGlvblByb3h5LmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIENPTV9TVU5fTUFOQUdFTUVOVF9KTVhSRU1PVEVfQVVUSEVOVElDQVRFLnNldEJvb2xlYW4odHJ1ZSk7CisgICAgICAgIEpBVkFfU0VDVVJJVFlfQVVUSF9MT0dJTl9DT05GSUcuc2V0U3RyaW5nKGNvbmZpZyk7CisgICAgICAgIENBU1NBTkRSQV9KTVhfUkVNT1RFX0xPR0lOX0NPTkZJRy5zZXRTdHJpbmcoIlRlc3RMb2dpbiIpOworICAgICAgICBDQVNTQU5EUkFfSk1YX0FVVEhPUklaRVIuc2V0U3RyaW5nKE5vU3VwZXJVc2VyQXV0aG9yaXphdGlvblByb3h5LmNsYXNzLmdldE5hbWUoKSk7CiAgICAgICAgIGpteFNlcnZlciA9IEpNWFNlcnZlclV0aWxzLmNyZWF0ZUpNWFNlcnZlcig5OTk5LCAibG9jYWxob3N0IiwgdHJ1ZSk7CiAgICAgICAgIGpteFNlcnZlci5zdGFydCgpOwogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYmF0Y2hsb2cvQmF0Y2hsb2dNYW5hZ2VyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2JhdGNobG9nL0JhdGNobG9nTWFuYWdlclRlc3QuamF2YQppbmRleCAxZmIzNzM1Li45MGExZDczIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYmF0Y2hsb2cvQmF0Y2hsb2dNYW5hZ2VyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9iYXRjaGxvZy9CYXRjaGxvZ01hbmFnZXJUZXN0LmphdmEKQEAgLTE3MCw3ICsxNzAsNyBAQAogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspCiAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9IFN0cmluZy5mb3JtYXQoIlNFTEVDVCAqIEZST00gXCIlc1wiLlwiJXNcIiBXSEVSRSBrZXkgPSBpbnRBc0Jsb2IoJWQpIiwgS0VZU1BBQ0UxLCBDRl9TVEFOREFSRDEsIGkpOworICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gU3RyaW5nLmZvcm1hdCgiU0VMRUNUICogRlJPTSBcIiVzXCIuXCIlc1wiIFdIRVJFIGtleSA9IGludF9hc19ibG9iKCVkKSIsIEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkQxLCBpKTsKICAgICAgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcmVzdWx0ID0gZXhlY3V0ZUludGVybmFsKHF1ZXJ5KTsKICAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKICAgICAgICAgICAgIGlmIChpIDwgNTApCkBAIC0yNDgsNyArMjQ4LDcgQEAKICAgICAgICAgLy8gV2Ugc2hvdWxkIHNlZSBoYWxmIG9mIFN0YW5kYXJkMi10YXJnZXRlZCBtdXRhdGlvbnMgd3JpdHRlbiBhZnRlciB0aGUgcmVwbGF5IGFuZCBhbGwgb2YgU3RhbmRhcmQzIG11dGF0aW9ucyBhcHBsaWVkLgogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykKICAgICAgICAgewotICAgICAgICAgICAgVW50eXBlZFJlc3VsdFNldCByZXN1bHQgPSBleGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiU0VMRUNUICogRlJPTSBcIiVzXCIuXCIlc1wiIFdIRVJFIGtleSA9IGludEFzQmxvYiglZCkiLCBLRVlTUEFDRTEsIENGX1NUQU5EQVJEMixpKSk7CisgICAgICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IHJlc3VsdCA9IGV4ZWN1dGVJbnRlcm5hbChTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgKiBGUk9NIFwiJXNcIi5cIiVzXCIgV0hFUkUga2V5ID0gaW50X2FzX2Jsb2IoJWQpIiwgS0VZU1BBQ0UxLCBDRl9TVEFOREFSRDIsaSkpOwogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwogICAgICAgICAgICAgaWYgKGkgPj0gNTAwKQogICAgICAgICAgICAgewpAQCAtMjY0LDcgKzI2NCw3IEBACiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyBpKyspCiAgICAgICAgIHsKLSAgICAgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcmVzdWx0ID0gZXhlY3V0ZUludGVybmFsKFN0cmluZy5mb3JtYXQoIlNFTEVDVCAqIEZST00gXCIlc1wiLlwiJXNcIiBXSEVSRSBrZXkgPSBpbnRBc0Jsb2IoJWQpIiwgS0VZU1BBQ0UxLCBDRl9TVEFOREFSRDMsIGkpKTsKKyAgICAgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcmVzdWx0ID0gZXhlY3V0ZUludGVybmFsKFN0cmluZy5mb3JtYXQoIlNFTEVDVCAqIEZST00gXCIlc1wiLlwiJXNcIiBXSEVSRSBrZXkgPSBpbnRfYXNfYmxvYiglZCkiLCBLRVlTUEFDRTEsIENGX1NUQU5EQVJEMywgaSkpOwogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKGkpLCByZXN1bHQub25lKCkuZ2V0Qnl0ZXMoImtleSIpKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygibmFtZSIgKyBpLCByZXN1bHQub25lKCkuZ2V0U3RyaW5nKCJuYW1lIikpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NhY2hlL0F1dG9TYXZpbmdDYWNoZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jYWNoZS9BdXRvU2F2aW5nQ2FjaGVUZXN0LmphdmEKaW5kZXggMDQwNDA5ZS4uNTAxNDVlMSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NhY2hlL0F1dG9TYXZpbmdDYWNoZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY2FjaGUvQXV0b1NhdmluZ0NhY2hlVGVzdC5qYXZhCkBAIC0xNywyMCArMTcsMjUgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Bc2NpaVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dVcGRhdGVCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQXNjaWlUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0Um93SW5kZXhFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUua2V5Y2FjaGUuS2V5Q2FjaGVTdXBwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DYWNoZVNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiAKQEAgLTQ0LDYgKzQ5LDggQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KICAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOworICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShLZXlDYWNoZVN1cHBvcnQuaXNTdXBwb3J0ZWRCeShEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkpKTsKICAgICAgICAgU2NoZW1hTG9hZGVyLnByZXBhcmVTZXJ2ZXIoKTsKICAgICAgICAgU2NoZW1hTG9hZGVyLmNyZWF0ZUtleXNwYWNlKEtFWVNQQUNFMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwKQEAgLTg1LDcgKzkyLDcgQEAKICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpCiAgICAgICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKFV0aWwuZGsoImtleTEiKSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CiAKLSAgICAgICAgQXV0b1NhdmluZ0NhY2hlPEtleUNhY2hlS2V5LCBSb3dJbmRleEVudHJ5PiBrZXlDYWNoZSA9IENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZTsKKyAgICAgICAgQXV0b1NhdmluZ0NhY2hlPEtleUNhY2hlS2V5LCBBYnN0cmFjdFJvd0luZGV4RW50cnk+IGtleUNhY2hlID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlOwogCiAgICAgICAgIC8vIHNlcmlhbGl6ZSB0byBmaWxlCiAgICAgICAgIGtleUNhY2hlLnN1Ym1pdFdyaXRlKGtleUNhY2hlLnNpemUoKSkuZ2V0KCk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0Nhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzVGVzdC5qYXZhCmluZGV4IGRlNmUwZDIuLjdhM2UwY2QgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzVGVzdC5qYXZhCkBAIC0xOCwyNiArMTgsNDEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWc7CiAKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9DQVNTQU5EUkFfUkVMRVZBTlRfUFJPUEVSVElFUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKKworLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgYmVsb3cgJ2Jsb2NrU3lzdGVtUHJvcGVydHlVc2FnZScKKwogcHVibGljIGNsYXNzIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllc1Rlc3QKIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMgVEVTVF9QUk9QID0gQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk9SR19BUEFDSEVfQ0FTU0FORFJBX0NPTkZfQ0FTU0FORFJBX1JFTEVWQU5UX1BST1BFUlRJRVNfVEVTVDsKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKQorICAgIHsKKyAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoVEVTVF9DQVNTQU5EUkFfUkVMRVZBTlRfUFJPUEVSVElFUy5nZXRLZXkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3lzdGVtUHJvcGVydHlpc1NldCgpIHsKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KFRFU1RfQ0FTU0FORFJBX1JFTEVWQU5UX1BST1BFUlRJRVMsICJ0ZXN0IikpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChTeXN0ZW0uZ2V0UHJvcGVydHkoVEVTVF9DQVNTQU5EUkFfUkVMRVZBTlRfUFJPUEVSVElFUy5nZXRLZXkoKSkpLmlzRXF1YWxUbygidGVzdCIpOyAvLyBjaGVja3N0eWxlOiBzdXBwcmVzcyBuZWFyYnkgJ2Jsb2NrU3lzdGVtUHJvcGVydHlVc2FnZScKKyAgICAgICAgfQorICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZygpCiAgICAgewotICAgICAgICB0cnkKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KFRFU1RfQ0FTU0FORFJBX1JFTEVWQU5UX1BST1BFUlRJRVMsICJzb21lLXN0cmluZyIpKQogICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoVEVTVF9QUk9QLmdldEtleSgpLCAic29tZS1zdHJpbmciKTsKLSAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChURVNUX1BST1AuZ2V0U3RyaW5nKCkpLmlzRXF1YWxUbygic29tZS1zdHJpbmciKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KFRFU1RfUFJPUC5nZXRLZXkoKSk7CisgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoVEVTVF9DQVNTQU5EUkFfUkVMRVZBTlRfUFJPUEVSVElFUy5nZXRTdHJpbmcoKSkuaXNFcXVhbFRvKCJzb21lLXN0cmluZyIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00NiwxMDAgKzYxLDg0IEBACiAgICAgewogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFRFU1RfUFJPUC5nZXRLZXkoKSwgInRydWUiKTsKLSAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChURVNUX1BST1AuZ2V0Qm9vbGVhbigpKS5pc0VxdWFsVG8odHJ1ZSk7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoVEVTVF9QUk9QLmdldEtleSgpLCAiZmFsc2UiKTsKLSAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChURVNUX1BST1AuZ2V0Qm9vbGVhbigpKS5pc0VxdWFsVG8oZmFsc2UpOwotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFRFU1RfUFJPUC5nZXRLZXkoKSwgImp1bmsiKTsKLSAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChURVNUX1BST1AuZ2V0Qm9vbGVhbigpKS5pc0VxdWFsVG8oZmFsc2UpOwotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFRFU1RfUFJPUC5nZXRLZXkoKSwgIiIpOwotICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KFRFU1RfUFJPUC5nZXRCb29sZWFuKCkpLmlzRXF1YWxUbyhmYWxzZSk7CisgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoVEVTVF9DQVNTQU5EUkFfUkVMRVZBTlRfUFJPUEVSVElFUy5nZXRLZXkoKSwgInRydWUiKTsKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChURVNUX0NBU1NBTkRSQV9SRUxFVkFOVF9QUk9QRVJUSUVTLmdldEJvb2xlYW4oKSkuaXNFcXVhbFRvKHRydWUpOworICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFRFU1RfQ0FTU0FORFJBX1JFTEVWQU5UX1BST1BFUlRJRVMuZ2V0S2V5KCksICJmYWxzZSIpOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KFRFU1RfQ0FTU0FORFJBX1JFTEVWQU5UX1BST1BFUlRJRVMuZ2V0Qm9vbGVhbigpKS5pc0VxdWFsVG8oZmFsc2UpOworICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFRFU1RfQ0FTU0FORFJBX1JFTEVWQU5UX1BST1BFUlRJRVMuZ2V0S2V5KCksICJqdW5rIik7CisgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoVEVTVF9DQVNTQU5EUkFfUkVMRVZBTlRfUFJPUEVSVElFUy5nZXRCb29sZWFuKCkpLmlzRXF1YWxUbyhmYWxzZSk7CisgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoVEVTVF9DQVNTQU5EUkFfUkVMRVZBTlRfUFJPUEVSVElFUy5nZXRLZXkoKSwgIiIpOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KFRFU1RfQ0FTU0FORFJBX1JFTEVWQU5UX1BST1BFUlRJRVMuZ2V0Qm9vbGVhbigpKS5pc0VxdWFsVG8oZmFsc2UpOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsbHkKICAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoVEVTVF9QUk9QLmdldEtleSgpKTsKKyAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KFRFU1RfQ0FTU0FORFJBX1JFTEVWQU5UX1BST1BFUlRJRVMuZ2V0S2V5KCkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhbl9udWxsKCkKICAgICB7Ci0gICAgICAgIHRyeQorICAgICAgICB0cnkgKFdpdGhQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgV2l0aFByb3BlcnRpZXMoKSkKICAgICAgICAgewotICAgICAgICAgICAgVEVTVF9QUk9QLmdldEJvb2xlYW4oKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KFRFU1RfUFJPUC5nZXRLZXkoKSk7CisgICAgICAgICAgICBURVNUX0NBU1NBTkRSQV9SRUxFVkFOVF9QUk9QRVJUSUVTLmdldEJvb2xlYW4oKTsKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChURVNUX0NBU1NBTkRSQV9SRUxFVkFOVF9QUk9QRVJUSUVTLmdldEJvb2xlYW4oKSkuaXNGYWxzZSgpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjaW1hbCgpCiAgICAgewotICAgICAgICB0cnkKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KFRFU1RfQ0FTU0FORFJBX1JFTEVWQU5UX1BST1BFUlRJRVMsICIxMjM0NTY3ODkiKSkKICAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFRFU1RfUFJPUC5nZXRLZXkoKSwgIjEyMzQ1Njc4OSIpOwotICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KFRFU1RfUFJPUC5nZXRJbnQoKSkuaXNFcXVhbFRvKDEyMzQ1Njc4OSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eShURVNUX1BST1AuZ2V0S2V5KCkpOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KFRFU1RfQ0FTU0FORFJBX1JFTEVWQU5UX1BST1BFUlRJRVMuZ2V0SW50KCkpLmlzRXF1YWxUbygxMjM0NTY3ODkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGV4YWRlY2ltYWwoKQogICAgIHsKLSAgICAgICAgdHJ5CisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChURVNUX0NBU1NBTkRSQV9SRUxFVkFOVF9QUk9QRVJUSUVTLCAiMHgxMjM0NTY3YSIpKQogICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoVEVTVF9QUk9QLmdldEtleSgpLCAiMHgxMjM0NTY3YSIpOwotICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KFRFU1RfUFJPUC5nZXRJbnQoKSkuaXNFcXVhbFRvKDMwNTQxOTg5OCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eShURVNUX1BST1AuZ2V0S2V5KCkpOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KFRFU1RfQ0FTU0FORFJBX1JFTEVWQU5UX1BST1BFUlRJRVMuZ2V0SW50KCkpLmlzRXF1YWxUbygzMDU0MTk4OTgpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0T2N0YWwoKQogICAgIHsKLSAgICAgICAgdHJ5CisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChURVNUX0NBU1NBTkRSQV9SRUxFVkFOVF9QUk9QRVJUSUVTLCAiMDEyMzQ1NjciKSkKICAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFRFU1RfUFJPUC5nZXRLZXkoKSwgIjAxMjM0NTY3Iik7Ci0gICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoVEVTVF9QUk9QLmdldEludCgpKS5pc0VxdWFsVG8oMzQyMzkxKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KFRFU1RfUFJPUC5nZXRLZXkoKSk7CisgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoVEVTVF9DQVNTQU5EUkFfUkVMRVZBTlRfUFJPUEVSVElFUy5nZXRJbnQoKSkuaXNFcXVhbFRvKDM0MjM5MSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBAVGVzdChleHBlY3RlZCA9IENvbmZpZ3VyYXRpb25FeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdEludGVnZXJfZW1wdHkoKQogICAgIHsKLSAgICAgICAgdHJ5CisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChURVNUX0NBU1NBTkRSQV9SRUxFVkFOVF9QUk9QRVJUSUVTLCAiIikpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShURVNUX1BST1AuZ2V0S2V5KCksICIiKTsKLSAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChURVNUX1BST1AuZ2V0SW50KCkpLmlzRXF1YWxUbygzNDIzOTEpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoVEVTVF9QUk9QLmdldEtleSgpKTsKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChURVNUX0NBU1NBTkRSQV9SRUxFVkFOVF9QUk9QRVJUSUVTLmdldEludCgpKS5pc0VxdWFsVG8oMzQyMzkxKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIEBUZXN0KGV4cGVjdGVkID0gTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MpCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyX251bGwoKQogICAgIHsKLSAgICAgICAgdHJ5CisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpKQogICAgICAgICB7Ci0gICAgICAgICAgICBURVNUX1BST1AuZ2V0SW50KCk7CisgICAgICAgICAgICBURVNUX0NBU1NBTkRSQV9SRUxFVkFOVF9QUk9QRVJUSUVTLmdldEludCgpOwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhclByb3BlcnR5KCkKKyAgICB7CisgICAgICAgIGFzc2VydE51bGwoVEVTVF9DQVNTQU5EUkFfUkVMRVZBTlRfUFJPUEVSVElFUy5nZXRTdHJpbmcoKSk7CisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChURVNUX0NBU1NBTkRSQV9SRUxFVkFOVF9QUk9QRVJUSUVTLCAidGVzdCIpKQogICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eShURVNUX1BST1AuZ2V0S2V5KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgVEVTVF9DQVNTQU5EUkFfUkVMRVZBTlRfUFJPUEVSVElFUy5nZXRTdHJpbmcoKSk7CiAgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0TnVsbChURVNUX0NBU1NBTkRSQV9SRUxFVkFOVF9QUk9QRVJUSUVTLmdldFN0cmluZygpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0NvbmZpZ0NvbXBhdGFiaWxpdHlUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0NvbmZpZ0NvbXBhdGFiaWxpdHlUZXN0LmphdmEKaW5kZXggOGQxZTVlMi4uNGE2MjAzMyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9Db25maWdDb21wYXRhYmlsaXR5VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvQ29uZmlnQ29tcGF0YWJpbGl0eVRlc3QuamF2YQpAQCAtMjAwLDE0ICsyMDAsMTQgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIENsYXNzVHJlZSBsb2FkKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIE9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKG5ldyBZQU1MRmFjdG9yeSgpKTsKKyAgICAgICAgT2JqZWN0TWFwcGVyIG1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIobmV3IFlBTUxGYWN0b3J5KCkpOyAvLyBjaGVja3N0eWxlOiBwZXJtaXQgdGhpcyBpbnN0YW50aWF0aW9uCiAgICAgICAgIHJldHVybiBtYXBwZXIucmVhZFZhbHVlKG5ldyBGaWxlKHBhdGgpLCBDbGFzc1RyZWUuY2xhc3MpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wKENsYXNzVHJlZSBjbGFzc1RyZWUsIFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIGxvZ2dlci5pbmZvKCJEdW1waW5nIGNsYXNzIHRvIHt9IiwgcGF0aCk7Ci0gICAgICAgIE9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKG5ldyBZQU1MRmFjdG9yeSgpKTsKKyAgICAgICAgT2JqZWN0TWFwcGVyIG1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIobmV3IFlBTUxGYWN0b3J5KCkpOyAvLyBjaGVja3N0eWxlOiBwZXJtaXQgdGhpcyBpbnN0YW50aWF0aW9uCiAgICAgICAgIG1hcHBlci53cml0ZVZhbHVlKG5ldyBGaWxlKHBhdGgpLCBjbGFzc1RyZWUpOwogCiAgICAgICAgIC8vIHZhbGlkYXRlIHRoYXQgbG9hZCB3b3JrcyBhcyBleHBlY3RlZApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9EYXRhYmFzZURlc2NyaXB0b3JSZWZUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0RhdGFiYXNlRGVzY3JpcHRvclJlZlRlc3QuamF2YQppbmRleCAzZWUwNWNmLi42ZTJjYmUyIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0RhdGFiYXNlRGVzY3JpcHRvclJlZlRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0RhdGFiYXNlRGVzY3JpcHRvclJlZlRlc3QuamF2YQpAQCAtMzcsNyArMzcsNiBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKQEAgLTQ2LDcgKzQ1LDcgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiAvKioKLSAqIFZlcmlmaWVzIHRoYXQge0BsaW5rIERhdGFiYXNlRGVzY3JpcHRvciNjbGllbnRJbml0aWFsaXphdGlvbigpfSB9IGFuZCBhIGNvdXBsZSBvZiA8aT5hcHBseTwvaT4gbWV0aG9kcworICogVmVyaWZpZXMgdGhhdCB7QGxpbmsgRGF0YWJhc2VEZXNjcmlwdG9yI2NsaWVudEluaXRpYWxpemF0aW9uKCl9IGFuZCBhIGNvdXBsZSBvZiA8aT5hcHBseTwvaT4gbWV0aG9kcwogICogZG8gbm90IHNvbWVob3cgbGF6aWx5IGluaXRpYWxpemUgYW55IHVud2FudGVkIHBhcnQgb2YgQ2Fzc2FuZHJhIGxpa2Ugc2NoZW1hLCBjb21taXQgbG9nIG9yIHN0YXJ0CiAgKiB1bmV4cGVjdGVkIHRocmVhZHMuCiAgKgpAQCAtNTYsNiArNTUsMTQgQEAKIHB1YmxpYyBjbGFzcyBEYXRhYmFzZURlc2NyaXB0b3JSZWZUZXN0CiB7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHZhbGlkQ2xhc3NlcyA9IHsKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuQ29uc29sZUFwcGVuZGVyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuQ29uc29sZUFwcGVuZGVyJDEiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5Db25zb2xlQXBwZW5kZXJCZWFuSW5mbyIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLkNvbnNvbGVBcHBlbmRlckN1c3RvbWl6ZXIiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5Mb2diYWNrU3RhdHVzTGlzdGVuZXIiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5Mb2diYWNrU3RhdHVzTGlzdGVuZXIkVG9Mb2dnZXJPdXRwdXRTdHJlYW0iLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5Mb2diYWNrU3RhdHVzTGlzdGVuZXIkV3JhcHBlZFByaW50U3RyZWFtIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuVGVlaW5nQXBwZW5kZXIiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdWRpdC5BdWRpdExvZ09wdGlvbnMiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdWRpdC5CaW5BdWRpdExvZ2dlciIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1ZGl0LkJpbkxvZ0F1ZGl0TG9nZ2VyIiwKQEAgLTYzLDE5ICs3MCwxOCBAQAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLkFsbG93QWxsSW50ZXJub2RlQXV0aGVudGljYXRvciIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguQXV0aENhY2hlJEJ1bGtMb2FkZXIiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLkNhY2hlYWJsZSIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguSUludGVybm9kZUF1dGhlbnRpY2F0b3IiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLklBdXRoZW50aWNhdG9yIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5JQXV0aG9yaXplciIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguSVJvbGVNYW5hZ2VyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5JSW50ZXJub2RlQXV0aGVudGljYXRvciIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguSU5ldHdvcmtBdXRob3JpemVyIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvciIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguSVJvbGVNYW5hZ2VyIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMkUHJvcGVydHlDb252ZXJ0ZXIiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlndXJhdGlvbkxvYWRlciIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWciLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnJDEiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnJENvbW1pdExvZ1N5bmMiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnJENvbW1pdEZhaWx1cmVQb2xpY3kiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnJENvbW1pdExvZ1N5bmMiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnJENvcnJ1cHRlZFRvbWJzdG9uZVN0cmF0ZWd5IiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZyREaXNrQWNjZXNzTW9kZSIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWckRGlza0ZhaWx1cmVQb2xpY3kiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnJERpc2tPcHRpbWl6YXRpb25TdHJhdGVneSIsCkBAIC04NiwxNCArOTIsMTcgQEAKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZyRQYXhvc1N0YXRlUHVyZ2luZyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWckUGF4b3NWYXJpYW50IiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZyRSZXBhaXJDb21tYW5kUG9vbEZ1bGxTdHJhdGVneSIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWckU1NUYWJsZUNvbmZpZyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWckVXNlckZ1bmN0aW9uVGltZW91dFBvbGljeSIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWckQ29ycnVwdGVkVG9tYnN0b25lU3RyYXRlZ3kiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yJEJ5dGVVbml0IiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZ0JlYW5JbmZvIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZ0N1c3RvbWl6ZXIiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlndXJhdGlvbkxvYWRlciIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhUmF0ZVNwZWMiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YVJhdGVTcGVjJERhdGFSYXRlVW5pdCIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhUmF0ZVNwZWMkRGF0YVJhdGVVbml0JDEiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YVJhdGVTcGVjJERhdGFSYXRlVW5pdCQyIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFSYXRlU3BlYyREYXRhUmF0ZVVuaXQkMyIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhUmF0ZVNwZWMkTG9uZ0J5dGVzUGVyU2Vjb25kQm91bmQiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YVN0b3JhZ2VTcGVjIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFTdG9yYWdlU3BlYyREYXRhU3RvcmFnZVVuaXQiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YVN0b3JhZ2VTcGVjJERhdGFTdG9yYWdlVW5pdCQxIiwKQEAgLTEwNSw1MiArMTE0LDYwIEBACiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhU3RvcmFnZVNwZWMkSW50TWViaWJ5dGVzQm91bmQiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YVN0b3JhZ2VTcGVjJExvbmdCeXRlc0JvdW5kIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFTdG9yYWdlU3BlYyRMb25nTWViaWJ5dGVzQm91bmQiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvciRCeXRlVW5pdCIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EdXJhdGlvblNwZWMiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YVJhdGVTcGVjJExvbmdCeXRlc1BlclNlY29uZEJvdW5kIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkR1cmF0aW9uU3BlYyRJbnRNaWxsaXNlY29uZHNCb3VuZCIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EdXJhdGlvblNwZWMkSW50TWludXRlc0JvdW5kIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkR1cmF0aW9uU3BlYyRJbnRTZWNvbmRzQm91bmQiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRHVyYXRpb25TcGVjJExvbmdNaWxsaXNlY29uZHNCb3VuZCIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EdXJhdGlvblNwZWMkTG9uZ01pY3Jvc2Vjb25kc0JvdW5kIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkR1cmF0aW9uU3BlYyRMb25nTmFub3NlY29uZHNCb3VuZCIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EdXJhdGlvblNwZWMkTG9uZ1NlY29uZHNCb3VuZCIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EdXJhdGlvblNwZWMkSW50TWlsbGlzZWNvbmRzQm91bmQiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRHVyYXRpb25TcGVjJEludFNlY29uZHNCb3VuZCIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EdXJhdGlvblNwZWMkSW50TWludXRlc0JvdW5kIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zJENsaWVudEVuY3J5cHRpb25PcHRpb25zIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zJFNlcnZlckVuY3J5cHRpb25PcHRpb25zIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zJFNlcnZlckVuY3J5cHRpb25PcHRpb25zJEludGVybm9kZUVuY3J5cHRpb24iLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRW5jcnlwdGlvbk9wdGlvbnMkU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMkT3V0Z29pbmdFbmNyeXB0ZWRQb3J0U291cmNlIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zJFNlcnZlckVuY3J5cHRpb25PcHRpb25zQmVhbkluZm8iLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRW5jcnlwdGlvbk9wdGlvbnMkU2VydmVyRW5jcnlwdGlvbk9wdGlvbnNDdXN0b21pemVyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zQmVhbkluZm8iLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRW5jcnlwdGlvbk9wdGlvbnNDdXN0b21pemVyIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkd1YXJkcmFpbHNPcHRpb25zIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkd1YXJkcmFpbHNPcHRpb25zJENvbmZpZyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5HdWFyZHJhaWxzT3B0aW9ucyRDb25zaXN0ZW5jeUxldmVscyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5HdWFyZHJhaWxzT3B0aW9ucyRUYWJsZVByb3BlcnRpZXMiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuUGFyYW1ldGVyaXplZENsYXNzIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLlJlcGxpY2FGaWx0ZXJpbmdQcm90ZWN0aW9uT3B0aW9ucyIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5ZYW1sQ29uZmlndXJhdGlvbkxvYWRlciIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5ZYW1sQ29uZmlndXJhdGlvbkxvYWRlciRQcm9wZXJ0aWVzQ2hlY2tlciIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5ZYW1sQ29uZmlndXJhdGlvbkxvYWRlciRQcm9wZXJ0aWVzQ2hlY2tlciQxIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLllhbWxDb25maWd1cmF0aW9uTG9hZGVyJEN1c3RvbUNvbnN0cnVjdG9yIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLlRyYW5zcGFyZW50RGF0YUVuY3J5cHRpb25PcHRpb25zIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLlN0YXJ0dXBDaGVja3NPcHRpb25zIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLlN1Ym5ldEdyb3VwcyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5UcmFja1dhcm5pbmdzIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLlRyYW5zcGFyZW50RGF0YUVuY3J5cHRpb25PcHRpb25zIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLllhbWxDb25maWd1cmF0aW9uTG9hZGVyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLllhbWxDb25maWd1cmF0aW9uTG9hZGVyJEN1c3RvbUNvbnN0cnVjdG9yIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLllhbWxDb25maWd1cmF0aW9uTG9hZGVyJFByb3BlcnRpZXNDaGVja2VyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLllhbWxDb25maWd1cmF0aW9uTG9hZGVyJFByb3BlcnRpZXNDaGVja2VyJDEiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkFsdGVyS2V5c3BhY2VTdGF0ZW1lbnQiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkNyZWF0ZUtleXNwYWNlU3RhdGVtZW50IiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29uc2lzdGVuY3lMZXZlbCIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZy5Db21taXRMb2dTZWdtZW50TWFuYWdlckZhY3RvcnkiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuRGVmYXVsdENvbW1pdExvZ1NlZ21lbnRNZ3JGYWN0b3J5IiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkFic3RyYWN0Q29tbWl0TG9nU2VnbWVudE1hbmFnZXIiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nU2VnbWVudE1hbmFnZXJDREMiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nU2VnbWVudE1hbmFnZXJTdGFuZGFyZCIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZy5Db21taXRMb2ciLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nTUJlYW4iLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nU2VnbWVudE1hbmFnZXJDREMiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nU2VnbWVudE1hbmFnZXJGYWN0b3J5IiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZ1NlZ21lbnRNYW5hZ2VyU3RhbmRhcmQiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuRGVmYXVsdENvbW1pdExvZ1NlZ21lbnRNZ3JGYWN0b3J5IiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZ3VhcmRyYWlscy5HdWFyZHJhaWxzQ29uZmlnIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZ3VhcmRyYWlscy5HdWFyZHJhaWxzQ29uZmlnTUJlYW4iLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzLkd1YXJkcmFpbHNDb25maWckQ29uc2lzdGVuY3lMZXZlbHMiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzLkd1YXJkcmFpbHNDb25maWckVGFibGVQcm9wZXJ0aWVzIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZ3VhcmRyYWlscy5HdWFyZHJhaWxzQ29uZmlnTUJlYW4iLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzLlZhbHVlcyRDb25maWciLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRTb3VyY2UiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklJbnN0YW5jZSIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSXNvbGF0ZWRFeGVjdXRvciIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5JbnN0YW5jZUNsYXNzTG9hZGVyIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuaW1wbC5JbnN0YW5jZUNvbmZpZyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSW52b2thYmxlSW5zdGFuY2UiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuSUlzb2xhdGVkRXhlY3V0b3IiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5pbXBsLkluc3RhbmNlQ29uZmlnIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuaW1wbC5JbnZva2FibGVJbnN0YW5jZSRDYWxsYWJsZU5vRXhjZXB0IiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuaW1wbC5JbnZva2FibGVJbnN0YW5jZSRJbnN0YW5jZUZ1bmN0aW9uIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuaW1wbC5JbnZva2FibGVJbnN0YW5jZSRTZXJpYWxpemFibGVCaUNvbnN1bWVyIiwKQEAgLTE2Myw2NyArMTgwLDk2IEBACiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmltcGwuSW52b2thYmxlSW5zdGFuY2UkVHJpRnVuY3Rpb24iLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5pbXBsLk1lc3NhZ2UiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5pbXBsLk5ldHdvcmtUb3BvbG9neSIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuUmVxdWVzdFZhbGlkYXRpb25FeGNlcHRpb24iLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuSW5zdGFuY2VDbGFzc0xvYWRlciIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ2Fzc2FuZHJhRXhjZXB0aW9uIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuUmVxdWVzdFZhbGlkYXRpb25FeGNlcHRpb24iLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlRyYW5zcG9ydEV4Y2VwdGlvbiIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmZxbC5GdWxsUXVlcnlMb2dnZXIiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5mcWwuRnVsbFF1ZXJ5TG9nZ2VyT3B0aW9ucyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtcy5JRmFpbHVyZURldGVjdG9yIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JRW5kcG9pbnRTbml0Y2giLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU1dyaXRlRXJyb3IiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU0Vycm9yIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNXcml0ZUVycm9yIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuSUNvbXByZXNzb3IiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzcy5JQ29tcHJlc3NvciRVc2VzIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuTFo0Q29tcHJlc3NvciIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50IiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQkVHlwZSIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVNjcnViYmVyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5NZXRyaWNzUHJvdmlkZXJzIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlJEJ1aWxkZXIiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5BYnN0cmFjdFNTVGFibGVGb3JtYXQiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0IiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdCRDb21wb25lbnRzIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdCRDb21wb25lbnRzJFR5cGVzIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdCRGYWN0b3J5IiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdCRLZXlDYWNoZVZhbHVlU2VyaWFsaXplciIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQkU1NUYWJsZVJlYWRlckZhY3RvcnkiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0JFNTVGFibGVXcml0ZXJGYWN0b3J5IiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdCRUeXBlIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlciIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXIkQnVpbGRlciIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlciIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXJXaXRoRmlsdGVyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIkQnVpbGRlciIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNvcnRlZFRhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXIiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlV3JpdGVyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVdyaXRlciRCdWlsZGVyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU29ydGVkVGFibGVXcml0ZXIiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5Tb3J0ZWRUYWJsZVdyaXRlciRCdWlsZGVyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVmVyc2lvbiIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0JEJpZ0Zvcm1hdEZhY3RvcnkiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0JEJpZ1RhYmxlUmVhZGVyRmFjdG9yeSIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQkQmlnVGFibGVXcml0ZXJGYWN0b3J5IiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdCRCaWdWZXJzaW9uIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdCRDb21wb25lbnRzIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdCRDb21wb25lbnRzJFR5cGVzIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ1NTVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlciIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdUYWJsZVJlYWRlciIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdUYWJsZVJlYWRlciRCdWlsZGVyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ1RhYmxlV3JpdGVyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ1RhYmxlV3JpdGVyJEJ1aWxkZXIiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeS5JbmRleFN1bW1hcnlTdXBwb3J0IiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5rZXljYWNoZS5LZXlDYWNoZVN1cHBvcnQiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhVHlwZSIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuQnVmZmVyZWREYXRhT3V0cHV0U3RyZWFtUGx1cyIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmVidWZmZXJpbmdJbnB1dFN0cmVhbSIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUlucHV0U3RyZWFtUGx1cyIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZU91dHB1dFN0cmVhbVBsdXMiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGUiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXMiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXMkRGF0YUlucHV0U3RyZWFtUGx1cyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dEJ1ZmZlciIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dEJ1ZmZlckZpeGVkIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0U3RyZWFtUGx1cyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXMiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXMiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRTdHJlYW1QbHVzIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3kiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNwaW5uaW5nRGlza09wdGltaXphdGlvblN0cmF0ZWd5IiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSW5wdXRTdHJlYW1QbHVzIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlT3V0cHV0U3RyZWFtUGx1cyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUGF0aFV0aWxzJElPVG9Mb25nRnVuY3Rpb24iLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJlYnVmZmVyaW5nSW5wdXRTdHJlYW0iLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNwaW5uaW5nRGlza09wdGltaXphdGlvblN0cmF0ZWd5IiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JRW5kcG9pbnRTbml0Y2giLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydCIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmVwbGljYSIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmVwbGljYUNvbGxlY3Rpb24iLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLlNpbXBsZVNlZWRQcm92aWRlciIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuU2VlZFByb3ZpZGVyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5TaW1wbGVTZWVkUHJvdmlkZXIiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZWN1cml0eS5FbmNyeXB0aW9uQ29udGV4dCIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5LklTc2xDb250ZXh0RmFjdG9yeSIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5LlNTTEZhY3RvcnkiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZWN1cml0eS5FbmNyeXB0aW9uQ29udGV4dCIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2FjaGVTZXJ2aWNlJENhY2hlVHlwZSIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbEV4Y2VwdGlvbiIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJpbmxvZy5CaW5Mb2dPcHRpb25zIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvc2VhYmxlIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvc2VhYmxlSXRlcmF0b3IiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllcyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzJDEiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9zZWFibGVJdGVyYXRvciIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXIiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlVuY2hlY2tlZEludGVycnVwdGVkRXhjZXB0aW9uIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuQ29uc29sZUFwcGVuZGVyIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuQ29uc29sZUFwcGVuZGVyJDEiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5Mb2diYWNrU3RhdHVzTGlzdGVuZXIiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5Mb2diYWNrU3RhdHVzTGlzdGVuZXIkVG9Mb2dnZXJPdXRwdXRTdHJlYW0iLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5Mb2diYWNrU3RhdHVzTGlzdGVuZXIkV3JhcHBlZFByaW50U3RyZWFtIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuVGVlaW5nQXBwZW5kZXIiLAotICAgIC8vIGdlbmVyYXRlZCBjbGFzc2VzCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWdCZWFuSW5mbyIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWdDdXN0b21pemVyIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zQmVhbkluZm8iLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRW5jcnlwdGlvbk9wdGlvbnNDdXN0b21pemVyIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zJFNlcnZlckVuY3J5cHRpb25PcHRpb25zQmVhbkluZm8iLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRW5jcnlwdGlvbk9wdGlvbnMkU2VydmVyRW5jcnlwdGlvbk9wdGlvbnNDdXN0b21pemVyIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuQ29uc29sZUFwcGVuZGVyQmVhbkluZm8iLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5Db25zb2xlQXBwZW5kZXJDdXN0b21pemVyIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkFsdGVyS2V5c3BhY2VTdGF0ZW1lbnQiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkNyZWF0ZUtleXNwYWNlU3RhdGVtZW50IgorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5iaW5sb2cuQmluTG9nT3B0aW9ucyIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuUmVmQ291bnRlZCIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuU2VsZlJlZkNvdW50ZWQiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlRyYW5zYWN0aW9uYWwiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlVuY2hlY2tlZEludGVycnVwdGVkRXhjZXB0aW9uIgogICAgIH07CiAKICAgICBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gY2hlY2tlZENsYXNzZXMgPSBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QodmFsaWRDbGFzc2VzKSk7CkBAIC0zNzAsOCArNDE2LDggQEAKICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICAgICAgZm9yIChQYWlyPFN0cmluZywgRXhjZXB0aW9uPiB2aW9sYXRpb24gOiBuZXcgQXJyYXlMaXN0PD4odmlvbGF0aW9ucykpCiAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJcblxuIikKLSAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlZJT0xBVElPTjogIikuYXBwZW5kKHZpb2xhdGlvbi5sZWZ0KS5hcHBlbmQoJ1xuJykKLSAgICAgICAgICAgICAgICAgIC5hcHBlbmQoVGhyb3dhYmxlcy5nZXRTdGFja1RyYWNlQXNTdHJpbmcodmlvbGF0aW9uLnJpZ2h0KSk7CisgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJWSU9MQVRJT046ICIpLmFwcGVuZCh2aW9sYXRpb24ubGVmdCk7IC8vLmFwcGVuZCgnXG4nKQorICAgICAgICAgICAgICAgICAgLy8uYXBwZW5kKFRocm93YWJsZXMuZ2V0U3RhY2tUcmFjZUFzU3RyaW5nKHZpb2xhdGlvbi5yaWdodCkpOwogICAgICAgICAgICAgU3RyaW5nIG1zZyA9IHNiLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICBlcnIucHJpbnRsbihtc2cpOwogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0RhdGFiYXNlRGVzY3JpcHRvclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvRGF0YWJhc2VEZXNjcmlwdG9yVGVzdC5qYXZhCmluZGV4IDJiNzJjZDcuLmYxZjM5NTggMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvRGF0YWJhc2VEZXNjcmlwdG9yVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvRGF0YWJhc2VEZXNjcmlwdG9yVGVzdC5qYXZhCkBAIC0zNCw5ICszNCwxMyBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQUxMT1dfVU5MSU1JVEVEX0NPTkNVUlJFTlRfVkFMSURBVElPTlM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09ORklHX0xPQURFUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5QQVJUSVRJT05FUjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFTdG9yYWdlU3BlYy5EYXRhU3RvcmFnZVVuaXQuS0lCSUJZVEVTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdFRocm93bkJ5OwpAQCAtNjMsNyArNjcsNyBAQAogCiAgICAgICAgIC8vIE5vdyB0cnkgY3VzdG9tIGxvYWRlcgogICAgICAgICBDb25maWd1cmF0aW9uTG9hZGVyIHRlc3RMb2FkZXIgPSBuZXcgVGVzdExvYWRlcigpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5jb25maWcubG9hZGVyIiwgdGVzdExvYWRlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgIENPTkZJR19MT0FERVIuc2V0U3RyaW5nKHRlc3RMb2FkZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwogCiAgICAgICAgIGNvbmZpZyA9IERhdGFiYXNlRGVzY3JpcHRvci5sb2FkQ29uZmlnKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiQ29uZmlndXJhdGlvbkxvYWRlciBUZXN0IiwgY29uZmlnLmNsdXN0ZXJfbmFtZSk7CkBAIC0yMzMsMTEgKzIzNyw4IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBhcnRpdGlvblByb3BlcnR5T3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewotICAgICAgICBTdHJpbmcga2V5ID0gQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJwYXJ0aXRpb25lciI7Ci0gICAgICAgIFN0cmluZyBwcmV2aW91cyA9IFN5c3RlbS5nZXRQcm9wZXJ0eShrZXkpOwotICAgICAgICB0cnkKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KFBBUlRJVElPTkVSLCAiVGhpc0RvZXNOb3RFeGlzdCIpKQogICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoa2V5LCAiVGhpc0RvZXNOb3RFeGlzdCIpOwogICAgICAgICAgICAgQ29uZmlnIHRlc3RDb25maWcgPSBEYXRhYmFzZURlc2NyaXB0b3IubG9hZENvbmZpZygpOwogICAgICAgICAgICAgdGVzdENvbmZpZy5wYXJ0aXRpb25lciA9ICJNdXJtdXIzUGFydGl0aW9uZXIiOwogCkBAIC0yNTYsMTcgKzI1Nyw2IEBACiAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRoaXNEb2VzTm90RXhpc3QiLCBjYXVzZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHByZXZpb3VzID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5yZW1vdmUoa2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoa2V5LCBwcmV2aW91cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICB9CiAKICAgICBAVGVzdApAQCAtMjk4LDE5ICsyODgsMjIgQEAKIAogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4U2l6ZSgtMSk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSByZWNlaXZlZCBhIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBjb2x1bW5faW5kZXhfc2l6ZSA9IC0xIik7CisgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoLTUpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gY29sdW1uX2luZGV4X3NpemUgPSAtNSIpOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWdub3JlZCkgeyB9Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDA5NiwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbHVtbkluZGV4U2l6ZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDk2LCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29sdW1uSW5kZXhTaXplKDApKTsKIAogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4U2l6ZSgyICogMTAyNCAqIDEwMjQpOworICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4U2l6ZUluS2lCKDIgKiAxMDI0ICogMTAyNCk7CiAgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSByZWNlaXZlZCBhIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gY29sdW1uX2luZGV4X3NpemUgPSAyR2lCIik7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWdub3JlZCkgeyB9Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDA5NiwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbHVtbkluZGV4U2l6ZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDk2LCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29sdW1uSW5kZXhTaXplKDApKTsKKworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoLTEpOyAgLy8gc2V0IHVuZGVmaW5lZAorICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDgxOTIsIERhdGFiYXNlRGVzY3JpcHRvci5nZXRDb2x1bW5JbmRleFNpemUoODE5MikpOwogCiAgICAgICAgIHRyeQogICAgICAgICB7CkBAIC00MTUsNyArNDA4LDcgQEAKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1pQigwKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSByZWNlaXZlZCBhIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZm9yIGRlcHRoIG9mIDkiKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSByZWNlaXZlZCBhIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZm9yIGRlcHRoIG9mIDAiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlnbm9yZWQpIHsgfQogCkBAIC01MDQsNyArNDk3LDcgQEAKICAgICAgICAgY2F0Y2ggKENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKICAgICAgICAgewogICAgICAgICAgICAgYXNzZXJ0VGhhdChlLmdldE1lc3NhZ2UoKSkuaXNFcXVhbFRvKCJUbyBzZXQgY29uY3VycmVudF92YWxpZGF0aW9ucyA+IGNvbmN1cnJlbnRfY29tcGFjdG9ycywgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldCB0aGUgc3lzdGVtIHByb3BlcnR5IGNhc3NhbmRyYS5hbGxvd191bmxpbWl0ZWRfY29uY3VycmVudF92YWxpZGF0aW9ucz10cnVlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldCB0aGUgc3lzdGVtIHByb3BlcnR5IC1EIiArIEFMTE9XX1VOTElNSVRFRF9DT05DVVJSRU5UX1ZBTElEQVRJT05TLmdldEtleSgpICsgIj10cnVlIik7CiAgICAgICAgIH0KIAogICAgICAgICAvLyB1bmxlc3Mgd2UgZGlzYWJsZSB0aGF0IGNoZWNrIChkb25lIHdpdGggYSBzeXN0ZW0gcHJvcGVydHkgYXQgc3RhcnR1cCBvciB2aWEgSk1YKQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9EdXJhdGlvblNwZWNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0R1cmF0aW9uU3BlY1Rlc3QuamF2YQppbmRleCAyMjg0NmZjLi5iMGM3M2RlIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0R1cmF0aW9uU3BlY1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0R1cmF0aW9uU3BlY1Rlc3QuamF2YQpAQCAtMjEzLDYgKzIxMyw3IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgRHVyYXRpb25TcGVjLkludFNlY29uZHNCb3VuZCgiMTBzIiksIER1cmF0aW9uU3BlYy5JbnRTZWNvbmRzQm91bmQuaW5TZWNvbmRzU3RyaW5nKCIxMCIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBEdXJhdGlvblNwZWMuSW50U2Vjb25kc0JvdW5kKCIxMHMiKSwgRHVyYXRpb25TcGVjLkludFNlY29uZHNCb3VuZC5pblNlY29uZHNTdHJpbmcoIjEwcyIpKTsKIAorICAgICAgICBhc3NlcnRFcXVhbHMoMTBMLCBuZXcgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCgiMTB1cyIpLnRvTWljcm9zZWNvbmRzKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMTBMLCBuZXcgRHVyYXRpb25TcGVjLkxvbmdNaWxsaXNlY29uZHNCb3VuZCgiMTBtcyIpLnRvTWlsbGlzZWNvbmRzKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMTBMLCBuZXcgRHVyYXRpb25TcGVjLkxvbmdTZWNvbmRzQm91bmQoIjEwcyIpLnRvU2Vjb25kcygpKTsKICAgICB9CkBAIC0yODQsNiArMjg1LDExIEBACiAgICAgICAgIGFzc2VydFRoYXRUaHJvd25CeSgoKSAtPiBuZXcgRHVyYXRpb25TcGVjLkludE1pbnV0ZXNCb3VuZCgiLTEwcyIpKS5pc0luc3RhbmNlT2YoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcoIkludmFsaWQgZHVyYXRpb246IC0xMHMiKTsKIAorICAgICAgICBhc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gbmV3IER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQoIjEwbnMiKSkuaXNJbnN0YW5jZU9mKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc01lc3NhZ2VDb250YWluaW5nKCJJbnZhbGlkIGR1cmF0aW9uOiAxMG5zIEFjY2VwdGVkIHVuaXRzIik7CisgICAgICAgIGFzc2VydFRoYXRUaHJvd25CeSgoKSAtPiBuZXcgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCgxMCwgTkFOT1NFQ09ORFMpKS5pc0luc3RhbmNlT2YoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcoIkludmFsaWQgZHVyYXRpb246IDEwIE5BTk9TRUNPTkRTIEFjY2VwdGVkIHVuaXRzIik7CisKICAgICAgICAgYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IG5ldyBEdXJhdGlvblNwZWMuTG9uZ01pbGxpc2Vjb25kc0JvdW5kKCIxMG5zIikpLmlzSW5zdGFuY2VPZihJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNNZXNzYWdlQ29udGFpbmluZygiSW52YWxpZCBkdXJhdGlvbjogMTBucyBBY2NlcHRlZCB1bml0cyIpOwogICAgICAgICBhc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gbmV3IER1cmF0aW9uU3BlYy5Mb25nTWlsbGlzZWNvbmRzQm91bmQoMTAsIE5BTk9TRUNPTkRTKSkuaXNJbnN0YW5jZU9mKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvRW5jcnlwdGlvbk9wdGlvbnNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0VuY3J5cHRpb25PcHRpb25zVGVzdC5qYXZhCmluZGV4IGE3NmMyNGEuLjBmZjIxMjQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvRW5jcnlwdGlvbk9wdGlvbnNUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9FbmNyeXB0aW9uT3B0aW9uc1Rlc3QuamF2YQpAQCAtMTI1LDcgKzEyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0aW9uT3B0aW9ucy5UbHNFbmNyeXB0aW9uUG9saWN5IGV4cGVjdGVkKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zVGVzdENhc2UobmV3IEVuY3J5cHRpb25PcHRpb25zLlNlcnZlckVuY3J5cHRpb25PcHRpb25zKG5ldyBQYXJhbWV0ZXJpemVkQ2xhc3MoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5LkRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8PigpKSwga2V5c3RvcmVQYXRoLCAiZHVtbXlwYXNzIiwgImR1bW15dHJ1c3RzdG9yZSIsICJkdW1teXBhc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPD4oKSksIGtleXN0b3JlUGF0aCwgImR1bW15cGFzcyIsIGtleXN0b3JlUGF0aCwgImR1bW15cGFzcyIsICJkdW1teXRydXN0c3RvcmUiLCAiZHVtbXlwYXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIG51bGwsIG51bGwsIG51bGwsICJKS1MiLCBmYWxzZSwgZmFsc2UsIG9wdGlvbmFsLCBpbnRlcm5vZGVFbmNyeXB0aW9uLCBmYWxzZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwbHlDb25maWcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvTG9hZE9sZFlBTUxCYWNrd2FyZENvbXBhdGliaWxpdHlUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0xvYWRPbGRZQU1MQmFja3dhcmRDb21wYXRpYmlsaXR5VGVzdC5qYXZhCmluZGV4IDBlMDI4Y2IuLjg1NTRlZDQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvTG9hZE9sZFlBTUxCYWNrd2FyZENvbXBhdGliaWxpdHlUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9Mb2FkT2xkWUFNTEJhY2t3YXJkQ29tcGF0aWJpbGl0eVRlc3QuamF2YQpAQCAtMjMsNiArMjMsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9DT05GSUc7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CkBAIC0zMyw3ICszNCw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwRGF0YWJhc2VEZXNjcmlwdG9yKCkKICAgICB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmNvbmZpZyIsICJjYXNzYW5kcmEtb2xkLnlhbWwiKTsKKyAgICAgICAgQ0FTU0FORFJBX0NPTkZJRy5zZXRTdHJpbmcoImNhc3NhbmRyYS1vbGQueWFtbCIpOwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKICAgICB9CiAKQEAgLTEwNSw3ICsxMDYsNyBAQAogICAgICAgICBhc3NlcnRFcXVhbHMobmV3IER1cmF0aW9uU3BlYy5JbnRTZWNvbmRzQm91bmQoNjA0ODAwKSwgY29uZmlnLnRyYWNlX3R5cGVfcmVwYWlyX3R0bCk7CiAgICAgICAgIGFzc2VydE51bGwoY29uZmlnLnByZXBhcmVkX3N0YXRlbWVudHNfY2FjaGVfc2l6ZSk7CiAgICAgICAgIGFzc2VydFRydWUoY29uZmlnLnVzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZCk7Ci0gICAgICAgIGFzc2VydFRydWUoY29uZmlnLnNjcmlwdGVkX3VzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZCk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvbmZpZy5zY3JpcHRlZF91c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQpOwogICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5tYXRlcmlhbGl6ZWRfdmlld3NfZW5hYmxlZCk7CiAgICAgICAgIGFzc2VydEZhbHNlKGNvbmZpZy50cmFuc2llbnRfcmVwbGljYXRpb25fZW5hYmxlZCk7CiAgICAgICAgIGFzc2VydFRydWUoY29uZmlnLnNhc2lfaW5kZXhlc19lbmFibGVkKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvT3ZlcnJpZGVDb25maWd1cmF0aW9uTG9hZGVyLmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL092ZXJyaWRlQ29uZmlndXJhdGlvbkxvYWRlci5qYXZhCmluZGV4IDJmZmU5MWIuLjdhOGIxNGUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvT3ZlcnJpZGVDb25maWd1cmF0aW9uTG9hZGVyLmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9PdmVycmlkZUNvbmZpZ3VyYXRpb25Mb2FkZXIuamF2YQpAQCAtMjIsNiArMjIsOCBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09ORklHX0xPQURFUjsKKwogLyoqCiAgKiBIZWxwZXIgY2xhc3MgZm9yIHByb2dyYW1tYXRpY2FsbHkgb3ZlcnJpZGluZyBpbmRpdmlkdWFsIGNvbmZpZyB2YWx1ZXMgYmVmb3JlIERhdGFiYXNlRGVzY3JpcHRvciBpcyBib290c3RyYXBwZWQuCiAgKi8KQEAgLTQwLDcgKzQyLDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBvdmVycmlkZShDb25zdW1lcjxDb25maWc+IG1vZGlmaWVyKQogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAiY29uZmlnLmxvYWRlciIsIE92ZXJyaWRlQ29uZmlndXJhdGlvbkxvYWRlci5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBDT05GSUdfTE9BREVSLnNldFN0cmluZyhPdmVycmlkZUNvbmZpZ3VyYXRpb25Mb2FkZXIuY2xhc3MuZ2V0TmFtZSgpKTsKICAgICAgICAgY29uZmlnTW9kaWZpZXIgPSBtb2RpZmllcjsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL1lhbWxDb25maWd1cmF0aW9uTG9hZGVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9ZYW1sQ29uZmlndXJhdGlvbkxvYWRlclRlc3QuamF2YQppbmRleCAwNmJlMWRjLi5iNDZkMmVhIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL1lhbWxDb25maWd1cmF0aW9uTG9hZGVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvWWFtbENvbmZpZ3VyYXRpb25Mb2FkZXJUZXN0LmphdmEKQEAgLTkxLDIxICs5MSwxOSBAQAogICAgICAgICAvLyB0aGUgcmVhc29uIGlzIHRoYXQgaXRzIG5vdCBhIHNjYWxhciBidXQgYSBjb21wbGV4IHR5cGUgKGNvbGxlY3Rpb24gdHlwZSksIHNvIHRoZSBtYXAgd2UgdXNlIG5lZWRzIHRvIGhhdmUgYSBjb2xsZWN0aW9uIHRvIG1hdGNoLgogICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHdlIGRlZmluZSBhIGNvbW1vbiBzdHJpbmcgcmVwcmVzZW50YXRpb24gZm9yIHRoZXNlIHR5cGVzIHNvIHRoZXkgY2FuIGJlIHdyaXR0ZW4gdG87IHRoaXMKICAgICAgICAgLy8gaXMgYW4gaXNzdWUgdGhhdCBTZXR0aW5nc1RhYmxlIG1heSBuZWVkIHRvIHdvcnJ5IGFib3V0LgotICAgICAgICB0cnkgKFdpdGhQcm9wZXJ0aWVzIGlnbm9yZSA9IG5ldyBXaXRoUHJvcGVydGllcyhDT05GSUdfQUxMT1dfU1lTVEVNX1BST1BFUlRJRVMuZ2V0S2V5KCksICJ0cnVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTVEVNX1BST1BFUlRZX1BSRUZJWCArICJzdG9yYWdlX3BvcnQiLCAiMTIzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTVEVNX1BST1BFUlRZX1BSRUZJWCArICJjb21taXRsb2dfc3luYyIsICJiYXRjaCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZU1RFTV9QUk9QRVJUWV9QUkVGSVggKyAic2VlZF9wcm92aWRlci5jbGFzc19uYW1lIiwgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuU2ltcGxlU2VlZFByb3ZpZGVyIiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QRVJUWV9QUkVGSVggKyAiY2xpZW50X2VuY3J5cHRpb25fb3B0aW9ucy5jaXBoZXJfc3VpdGVzIiwgIltcIkZha2VDaXBoZXJcIl0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNURU1fUFJPUEVSVFlfUFJFRklYICsgImNsaWVudF9lbmNyeXB0aW9uX29wdGlvbnMub3B0aW9uYWwiLCAiZmFsc2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNURU1fUFJPUEVSVFlfUFJFRklYICsgImNsaWVudF9lbmNyeXB0aW9uX29wdGlvbnMuZW5hYmxlZCIsICJ0cnVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTVEVNX1BST1BFUlRZX1BSRUZJWCArICJkb2Vzbm90ZXhpc3QiLCAidHJ1ZSIKLSAgICAgICAgKSkKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBpZ25vcmUgPSBuZXcgV2l0aFByb3BlcnRpZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoQ09ORklHX0FMTE9XX1NZU1RFTV9QUk9QRVJUSUVTLCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoKFNZU1RFTV9QUk9QRVJUWV9QUkVGSVggKyAic3RvcmFnZV9wb3J0IiwgIjEyMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTVEVNX1BST1BFUlRZX1BSRUZJWCArICJjb21taXRsb2dfc3luYyIsICJiYXRjaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTVEVNX1BST1BFUlRZX1BSRUZJWCArICJzZWVkX3Byb3ZpZGVyLmNsYXNzX25hbWUiLCAib3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5TaW1wbGVTZWVkUHJvdmlkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZU1RFTV9QUk9QRVJUWV9QUkVGSVggKyAiY2xpZW50X2VuY3J5cHRpb25fb3B0aW9ucy5vcHRpb25hbCIsIEJvb2xlYW4uRkFMU0UudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNURU1fUFJPUEVSVFlfUFJFRklYICsgImNsaWVudF9lbmNyeXB0aW9uX29wdGlvbnMuZW5hYmxlZCIsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZU1RFTV9QUk9QRVJUWV9QUkVGSVggKyAiZG9lc25vdGV4aXN0IiwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpKQogICAgICAgICB7CiAgICAgICAgICAgICBDb25maWcgY29uZmlnID0gWWFtbENvbmZpZ3VyYXRpb25Mb2FkZXIuZnJvbU1hcChDb2xsZWN0aW9ucy5lbXB0eU1hcCgpLCB0cnVlLCBDb25maWcuY2xhc3MpOwogICAgICAgICAgICAgYXNzZXJ0VGhhdChjb25maWcuc3RvcmFnZV9wb3J0KS5pc0VxdWFsVG8oMTIzKTsKICAgICAgICAgICAgIGFzc2VydFRoYXQoY29uZmlnLmNvbW1pdGxvZ19zeW5jKS5pc0VxdWFsVG8oQ29uZmlnLkNvbW1pdExvZ1N5bmMuYmF0Y2gpOwogICAgICAgICAgICAgYXNzZXJ0VGhhdChjb25maWcuc2VlZF9wcm92aWRlci5jbGFzc19uYW1lKS5pc0VxdWFsVG8oIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuU2ltcGxlU2VlZFByb3ZpZGVyIik7Ci0vLyAgICAgICAgICAgIGFzc2VydFRoYXQoY29uZmlnLmNsaWVudF9lbmNyeXB0aW9uX29wdGlvbnMuY2lwaGVyX3N1aXRlcykuaXNFcXVhbFRvKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIkZha2VDaXBoZXIiKSk7CiAgICAgICAgICAgICBhc3NlcnRUaGF0KGNvbmZpZy5jbGllbnRfZW5jcnlwdGlvbl9vcHRpb25zLm9wdGlvbmFsKS5pc0ZhbHNlKCk7CiAgICAgICAgICAgICBhc3NlcnRUaGF0KGNvbmZpZy5jbGllbnRfZW5jcnlwdGlvbl9vcHRpb25zLmVuYWJsZWQpLmlzVHJ1ZSgpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9Bc3NpZ25tZW50VGVzdGFibGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9Bc3NpZ25tZW50VGVzdGFibGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZjMDBmMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0Fzc2lnbm1lbnRUZXN0YWJsZVRlc3QuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQXNjaWlUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTG9uZ1R5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKKworcHVibGljIGNsYXNzIEFzc2lnbm1lbnRUZXN0YWJsZVRlc3QKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcmVmZXJyZWRDb21wYXRpYmxlVHlwZSgpCisgICAgeworICAgICAgICB0ZXN0R2V0UHJlZmVycmVkQ29tcGF0aWJsZVR5cGUobnVsbCk7CisKKyAgICAgICAgdGVzdEdldFByZWZlcnJlZENvbXBhdGlibGVUeXBlKEFzY2lpVHlwZS5pbnN0YW5jZSwgQXNjaWlUeXBlLmluc3RhbmNlKTsKKyAgICAgICAgdGVzdEdldFByZWZlcnJlZENvbXBhdGlibGVUeXBlKFVURjhUeXBlLmluc3RhbmNlLCBVVEY4VHlwZS5pbnN0YW5jZSk7CisgICAgICAgIHRlc3RHZXRQcmVmZXJyZWRDb21wYXRpYmxlVHlwZShBc2NpaVR5cGUuaW5zdGFuY2UsIEFzY2lpVHlwZS5pbnN0YW5jZSwgQXNjaWlUeXBlLmluc3RhbmNlKTsKKyAgICAgICAgdGVzdEdldFByZWZlcnJlZENvbXBhdGlibGVUeXBlKFVURjhUeXBlLmluc3RhbmNlLCBVVEY4VHlwZS5pbnN0YW5jZSwgVVRGOFR5cGUuaW5zdGFuY2UpOworICAgICAgICB0ZXN0R2V0UHJlZmVycmVkQ29tcGF0aWJsZVR5cGUoVVRGOFR5cGUuaW5zdGFuY2UsIEFzY2lpVHlwZS5pbnN0YW5jZSwgVVRGOFR5cGUuaW5zdGFuY2UpOworICAgICAgICB0ZXN0R2V0UHJlZmVycmVkQ29tcGF0aWJsZVR5cGUoVVRGOFR5cGUuaW5zdGFuY2UsIFVURjhUeXBlLmluc3RhbmNlLCBBc2NpaVR5cGUuaW5zdGFuY2UpOworCisgICAgICAgIHRlc3RHZXRQcmVmZXJyZWRDb21wYXRpYmxlVHlwZShJbnQzMlR5cGUuaW5zdGFuY2UsIEludDMyVHlwZS5pbnN0YW5jZSk7CisgICAgICAgIHRlc3RHZXRQcmVmZXJyZWRDb21wYXRpYmxlVHlwZShMb25nVHlwZS5pbnN0YW5jZSwgTG9uZ1R5cGUuaW5zdGFuY2UpOworICAgICAgICB0ZXN0R2V0UHJlZmVycmVkQ29tcGF0aWJsZVR5cGUoSW50MzJUeXBlLmluc3RhbmNlLCBJbnQzMlR5cGUuaW5zdGFuY2UsIEludDMyVHlwZS5pbnN0YW5jZSk7CisgICAgICAgIHRlc3RHZXRQcmVmZXJyZWRDb21wYXRpYmxlVHlwZShMb25nVHlwZS5pbnN0YW5jZSwgTG9uZ1R5cGUuaW5zdGFuY2UsIExvbmdUeXBlLmluc3RhbmNlKTsKKyAgICAgICAgdGVzdEdldFByZWZlcnJlZENvbXBhdGlibGVUeXBlKG51bGwsIEludDMyVHlwZS5pbnN0YW5jZSwgTG9uZ1R5cGUuaW5zdGFuY2UpOyAvLyBub3QgYXNzaWduYWJsZQorICAgICAgICB0ZXN0R2V0UHJlZmVycmVkQ29tcGF0aWJsZVR5cGUobnVsbCwgTG9uZ1R5cGUuaW5zdGFuY2UsIEludDMyVHlwZS5pbnN0YW5jZSk7IC8vIG5vdCBhc3NpZ25hYmxlCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFByZWZlcnJlZENvbXBhdGlibGVUeXBlKEFic3RyYWN0VHlwZTw/PiB0eXBlLCBBYnN0cmFjdFR5cGU8Pz4uLi4gdHlwZXMpCisgICAgeworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHR5cGUsIEFzc2lnbm1lbnRUZXN0YWJsZS5nZXRDb21wYXRpYmxlVHlwZUlmS25vd24oQXJyYXlzLmFzTGlzdCh0eXBlcykpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9DRENTdGF0ZW1lbnRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9DRENTdGF0ZW1lbnRUZXN0LmphdmEKaW5kZXggZmIyNGFhOS4uNTU4NjViMSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQ0RDU3RhdGVtZW50VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0NEQ1N0YXRlbWVudFRlc3QuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogCiBwdWJsaWMgY2xhc3MgQ0RDU3RhdGVtZW50VGVzdCBleHRlbmRzIENRTFRlc3RlcgpAQCAtMjksNiArMzAsNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcENsYXNzKCkKICAgICB7CisgICAgICAgIFNlcnZlclRlc3RVdGlscy5kYWVtb25Jbml0aWFsaXphdGlvbigpOwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q0RDRW5hYmxlZCh0cnVlKTsKICAgICAgICAgQ1FMVGVzdGVyLnNldFVwQ2xhc3MoKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9DUUwzVHlwZUxpdGVyYWxUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9DUUwzVHlwZUxpdGVyYWxUZXN0LmphdmEKaW5kZXggZjBkMmMxOS4uMGQ3MzczMSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQ1FMM1R5cGVMaXRlcmFsVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0NRTDNUeXBlTGl0ZXJhbFRlc3QuamF2YQpAQCAtNDg0LDcgKzQ4NCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZXhwZWN0ZWQuYXBwZW5kKGJyYWNrZXRDbG9zZSk7Ci0gICAgICAgICAgICBidWZmZXIgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKGJ1ZmZlcnMsIGFkZGVkLnNpemUoKSwgdmVyc2lvbik7CisgICAgICAgICAgICBidWZmZXIgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKGJ1ZmZlcnMsIGFkZGVkLnNpemUoKSk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gbmV3IFZhbHVlKGV4cGVjdGVkLnRvU3RyaW5nKCksIGNvbGxlY3Rpb25UeXBlLmFzQ1FMM1R5cGUoKSwgYnVmZmVyKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0NRTFRlc3Rlci5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQ1FMVGVzdGVyLmphdmEKaW5kZXggMjNiMzkyZi4uNDFiODZmMSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQ1FMVGVzdGVyLmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQ1FMVGVzdGVyLmphdmEKQEAgLTI2LDcgKzI2LDIxIEBACiBpbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5ybWkuc2VydmVyLlJNSVNvY2tldEZhY3Rvcnk7Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKQEAgLTM0LDcgKzQ4LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7Ci0KIGltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyQ29ubmVjdGlvbjsKIGltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhDb25uZWN0b3I7CiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YQ29ubmVjdG9yRmFjdG9yeTsKQEAgLTQ2LDE4ICs1OSwyNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKLQotaW1wb3J0IG9yZy5qdW5pdC4qOwotCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLkdhdWdlOwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS4qOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5DbG9zZUZ1dHVyZTsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQ2x1c3RlcjsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQ29sdW1uRGVmaW5pdGlvbnM7CiBpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkRhdGFUeXBlOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5OZXR0eU9wdGlvbnM7CiBpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlJlc3VsdFNldDsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuUm93OworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5TZXNzaW9uOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5TaW1wbGVTdGF0ZW1lbnQ7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlNvY2tldE9wdGlvbnM7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlN0YXRlbWVudDsKIGltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuZXhjZXB0aW9ucy5VbmF1dGhvcml6ZWRFeGNlcHRpb247Ci0KIGltcG9ydCBjb20uZGF0YXN0YXguc2hhZGVkLm5ldHR5LmNoYW5uZWwuRXZlbnRMb29wR3JvdXA7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlsczsKQEAgLTY5LDUwICs5MSw4NSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguSVJvbGVNYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuU3RhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YVN0b3JhZ2VTcGVjOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TeXN0ZW1LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJvb2xlYW5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlc1R5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Db2xsZWN0aW9uVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkRlY2ltYWxUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuRG91YmxlVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkR1cmF0aW9uVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkZsb2F0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkluZXRBZGRyZXNzVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludGVnZXJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTGlzdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Mb25nVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLk1hcFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5TZXRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuU2hvcnRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVGltZVVVSURUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVGltZXN0YW1wVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlR1cGxlVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVURjhUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVVJRFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbC5WaXJ0dWFsS2V5c3BhY2VSZWdpc3RyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsLlZpcnR1YWxTY2hlbWFLZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTXVybXVyM1BhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuU3ludGF4RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LlNlY29uZGFyeUluZGV4TWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5maWxlc3lzdGVtLkxpc3RlbmFibGVGaWxlU3lzdGVtOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVTeXN0ZW1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuVG9rZW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNhc3NhbmRyYU1ldHJpY3NSZWdpc3RyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNsaWVudE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbk5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5UdXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lk11cm11cjNQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5TeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkluZGV4TWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFUZXN0VXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5UeXBlU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNsaWVudFN0YXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuUXVlcnlTdGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5FdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuTWVzc2FnZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5TZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlNpbXBsZUNsaWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQubWVzc2FnZXMuUmVzdWx0TWVzc2FnZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5KTVhTZXJ2ZXJVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKIGltcG9ydCBvcmcuYXdhaXRpbGl0eS5Bd2FpdGlsaXR5OwogCi1pbXBvcnQgc3RhdGljIGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5Tb2NrZXRPcHRpb25zLkRFRkFVTFRfQ09OTkVDVF9USU1FT1VUX01JTExJUzsKLWltcG9ydCBzdGF0aWMgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlNvY2tldE9wdGlvbnMuREVGQVVMVF9SRUFEX1RJTUVPVVRfTUlMTElTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9KTVhfTE9DQUxfUE9SVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0RSSVZFUl9DT05ORUNUSU9OX1RJTUVPVVRfTVM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9EUklWRVJfUkVBRF9USU1FT1VUX01TOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfUkVVU0VfUFJFUEFSRUQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9ST1dfQ0FDSEVfU0laRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX1VTRV9QUkVQQVJFRDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLmN1cnJlbnRUaW1lTWlsbGlzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKQEAgLTEzMCw5ICsxODcsOSBAQAogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0UgPSAiY3FsX3Rlc3Rfa2V5c3BhY2UiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFX1BFUl9URVNUID0gImNxbF90ZXN0X2tleXNwYWNlX2FsdCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9QUkVQQVJFRF9WQUxVRVMgPSBCb29sZWFuLnZhbHVlT2YoU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEudGVzdC51c2VfcHJlcGFyZWQiLCAidHJ1ZSIpKTsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVVU0VfUFJFUEFSRUQgPSBCb29sZWFuLnZhbHVlT2YoU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEudGVzdC5yZXVzZV9wcmVwYXJlZCIsICJ0cnVlIikpOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgbG9uZyBST1dfQ0FDSEVfU0laRV9JTl9NSUIgPSBuZXcgRGF0YVN0b3JhZ2VTcGVjLkxvbmdNZWJpYnl0ZXNCb3VuZChTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS50ZXN0LnJvd19jYWNoZV9zaXplIiwgIjBNaUIiKSkudG9NZWJpYnl0ZXMoKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVVNFX1BSRVBBUkVEX1ZBTFVFUyA9IFRFU1RfVVNFX1BSRVBBUkVELmdldEJvb2xlYW4oKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVVU0VfUFJFUEFSRUQgPSBURVNUX1JFVVNFX1BSRVBBUkVELmdldEJvb2xlYW4oKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgUk9XX0NBQ0hFX1NJWkVfSU5fTUlCID0gbmV3IERhdGFTdG9yYWdlU3BlYy5Mb25nTWViaWJ5dGVzQm91bmQoVEVTVF9ST1dfQ0FDSEVfU0laRS5nZXRTdHJpbmcoIjBNaUIiKSkudG9NZWJpYnl0ZXMoKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNJbnRlZ2VyIHNlcU51bWJlciA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIFRPT19CSUcgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKEZCVXRpbGl0aWVzLk1BWF9VTlNJR05FRF9TSE9SVCArIDEwMjQpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfQ0VOVEVSID0gU2VydmVyVGVzdFV0aWxzLkRBVEFfQ0VOVEVSOwpAQCAtMTkxLDggKzI0OCw2IEBACiAKICAgICAgICAgbmF0aXZlQWRkciA9IEluZXRBZGRyZXNzLmdldExvb3BiYWNrQWRkcmVzcygpOwogICAgICAgICBuYXRpdmVQb3J0ID0gZ2V0QXV0b21hdGljYWxseUFsbG9jYXRlZFBvcnQobmF0aXZlQWRkcik7Ci0KLSAgICAgICAgU2VydmVyVGVzdFV0aWxzLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4ga2V5c3BhY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CkBAIC0zMTgsNiArMzczLDggQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCiAgICAgeworICAgICAgICBTZXJ2ZXJUZXN0VXRpbHMuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKwogICAgICAgICBpZiAoUk9XX0NBQ0hFX1NJWkVfSU5fTUlCID4gMCkKICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRSb3dDYWNoZVNpemVJbk1pQihST1dfQ0FDSEVfU0laRV9JTl9NSUIpOwogICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5zZXRQYXJ0aXRpb25lclVuc2FmZShNdXJtdXIzUGFydGl0aW9uZXIuaW5zdGFuY2UpOwpAQCAtNDQwLDcgKzQ5Nyw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBidWlsZE5vZGV0b29sQXJncyhMaXN0PFN0cmluZz4gYXJncykKICAgICB7Ci0gICAgICAgIGludCBwb3J0ID0gam14UG9ydCA9PSAwID8gSW50ZWdlci5nZXRJbnRlZ2VyKCJjYXNzYW5kcmEuam14LmxvY2FsLnBvcnQiLCA3MTk5KSA6IGpteFBvcnQ7CisgICAgICAgIGludCBwb3J0ID0gam14UG9ydCA9PSAwID8gQ0FTU0FORFJBX0pNWF9MT0NBTF9QT1JULmdldEludCg3MTk5KSA6IGpteFBvcnQ7CiAgICAgICAgIFN0cmluZyBob3N0ID0gam14SG9zdCA9PSBudWxsID8gIjEyNy4wLjAuMSIgOiBqbXhIb3N0OwogICAgICAgICBMaXN0PFN0cmluZz4gYWxsQXJncyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBhbGxBcmdzLmFkZCgiYmluL25vZGV0b29sIik7CkBAIC01NzMsMTAgKzYzMCw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgQ2x1c3RlciBpbml0Q2xpZW50Q2x1c3RlcihVc2VyIHVzZXIsIFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uKQogICAgIHsKICAgICAgICAgU29ja2V0T3B0aW9ucyBzb2NrZXRPcHRpb25zID0KLSAgICAgICAgICAgICAgICBuZXcgU29ja2V0T3B0aW9ucygpLnNldENvbm5lY3RUaW1lb3V0TWlsbGlzKEludGVnZXIuZ2V0SW50ZWdlcigiY2Fzc2FuZHJhLnRlc3QuZHJpdmVyLmNvbm5lY3Rpb25fdGltZW91dF9tcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9DT05ORUNUX1RJTUVPVVRfTUlMTElTKSkgLy8gZGVmYXVsdCBpcyA1MDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRSZWFkVGltZW91dE1pbGxpcyhJbnRlZ2VyLmdldEludGVnZXIoImNhc3NhbmRyYS50ZXN0LmRyaXZlci5yZWFkX3RpbWVvdXRfbXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUkVBRF9USU1FT1VUX01JTExJUykpOyAvLyBkZWZhdWx0IGlzIDEyMDAwCisgICAgICAgICAgICAgICAgbmV3IFNvY2tldE9wdGlvbnMoKS5zZXRDb25uZWN0VGltZW91dE1pbGxpcyhURVNUX0RSSVZFUl9DT05ORUNUSU9OX1RJTUVPVVRfTVMuZ2V0SW50KCkpIC8vIGRlZmF1bHQgaXMgNTAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UmVhZFRpbWVvdXRNaWxsaXMoVEVTVF9EUklWRVJfUkVBRF9USU1FT1VUX01TLmdldEludCgpKTsgLy8gZGVmYXVsdCBpcyAxMjAwMAogCiAgICAgICAgIGxvZ2dlci5pbmZvKCJUaW1lb3V0czoge30gLyB7fSIsIHNvY2tldE9wdGlvbnMuZ2V0Q29ubmVjdFRpbWVvdXRNaWxsaXMoKSwgc29ja2V0T3B0aW9ucy5nZXRSZWFkVGltZW91dE1pbGxpcygpKTsKIApAQCAtMTI4Niw2ICsxMzQxLDExIEBACiAgICAgICAgIHJldHVybiBzZXNzaW9uTmV0KCkuZXhlY3V0ZShuZXcgU2ltcGxlU3RhdGVtZW50KGZvcm1hdFF1ZXJ5KHF1ZXJ5KSkuc2V0RmV0Y2hTaXplKHBhZ2VTaXplKSk7CiAgICAgfQogCisgICAgcHJvdGVjdGVkIGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5SZXN1bHRTZXQgZXhlY3V0ZU5ldFdpdGhvdXRQYWdpbmcoU3RyaW5nIHF1ZXJ5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGVOZXRXaXRoUGFnaW5nKHF1ZXJ5LCBJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgfQorCiAgICAgcHJvdGVjdGVkIFNlc3Npb24gc2Vzc2lvbk5ldCgpCiAgICAgewogICAgICAgICByZXR1cm4gc2Vzc2lvbk5ldChnZXREZWZhdWx0VmVyc2lvbigpKTsKQEAgLTEzNDIsNyArMTQwMiw3IEBACiAgICAgICAgIHJldHVybiBRdWVyeVByb2Nlc3Nvci5pbnN0YW5jZS5wcmVwYXJlKGZvcm1hdFF1ZXJ5KHF1ZXJ5KSwgQ2xpZW50U3RhdGUuZm9ySW50ZXJuYWxDYWxscygpKTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgVW50eXBlZFJlc3VsdFNldCBleGVjdXRlKFN0cmluZyBxdWVyeSwgT2JqZWN0Li4uIHZhbHVlcykgdGhyb3dzIFRocm93YWJsZQorICAgIHByb3RlY3RlZCBVbnR5cGVkUmVzdWx0U2V0IGV4ZWN1dGUoU3RyaW5nIHF1ZXJ5LCBPYmplY3QuLi4gdmFsdWVzKQogICAgIHsKICAgICAgICAgcmV0dXJuIGV4ZWN1dGVGb3JtYXR0ZWRRdWVyeShmb3JtYXRRdWVyeShxdWVyeSksIHZhbHVlcyk7CiAgICAgfQpAQCAtMTM1Miw3ICsxNDEyLDExIEBACiAgICAgICAgIHJldHVybiBleGVjdXRlRm9ybWF0dGVkUXVlcnkoZm9ybWF0Vmlld1F1ZXJ5KEtFWVNQQUNFLCBxdWVyeSksIHZhbHVlcyk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFVudHlwZWRSZXN1bHRTZXQgZXhlY3V0ZUZvcm1hdHRlZFF1ZXJ5KFN0cmluZyBxdWVyeSwgT2JqZWN0Li4uIHZhbHVlcykgdGhyb3dzIFRocm93YWJsZQorICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSBwcm92aWRlZCBxdWVyeSB1c2luZyB0aGUge0BsaW5rIENsaWVudFN0YXRlI2ZvckludGVybmFsQ2FsbHMoKX0gYXMgdGhlIGV4cGVjdGVkIENsaWVudFN0YXRlLiBOb3RlOgorICAgICAqIHRoaXMgbWVhbnMgcGVybWlzc2lvbnMgY2hlY2tpbmcgd2lsbCBub3QgYXBwbHkgYW5kIHF1ZXJpZXMgd2lsbCBwcm9jZWVkIHJlZ2FyZGxlc3Mgb2Ygcm9sZSBvciBndWFyZHJhaWxzLgorICAgICAqLworICAgIHByb3RlY3RlZCBVbnR5cGVkUmVzdWx0U2V0IGV4ZWN1dGVGb3JtYXR0ZWRRdWVyeShTdHJpbmcgcXVlcnksIE9iamVjdC4uLiB2YWx1ZXMpCiAgICAgewogICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IHJzOwogICAgICAgICBpZiAodXNlUHJlcGFyZWQpCkBAIC0xNzI3LDYgKzE3OTEsMjQgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydENvbHVtbk5hbWVzKFJlc3VsdFNldCByZXN1bHQsIFN0cmluZy4uLiBleHBlY3RlZENvbHVtbk5hbWVzKQorICAgIHsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBBc3NlcnQuZmFpbCgiTm8gcm93cyByZXR1cm5lZCBieSBxdWVyeS4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIENvbHVtbkRlZmluaXRpb25zIGNvbHVtbkRlZmluaXRpb25zID0gcmVzdWx0LmdldENvbHVtbkRlZmluaXRpb25zKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdvdCBsZXNzIGNvbHVtbnMgdGhhbiBleHBlY3RlZC4iLCBleHBlY3RlZENvbHVtbk5hbWVzLmxlbmd0aCwgY29sdW1uRGVmaW5pdGlvbnMuc2l6ZSgpKTsKKworICAgICAgICBmb3IgKGludCBpID0gMCwgbSA9IGNvbHVtbkRlZmluaXRpb25zLnNpemUoKTsgaSA8IG07IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIGNvbHVtbk5hbWUgPSBjb2x1bW5EZWZpbml0aW9ucy5nZXROYW1lKGkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhleHBlY3RlZENvbHVtbk5hbWVzW2ldLCBjb2x1bW5OYW1lKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEFsbFJvd3MoT2JqZWN0W10uLi4gcm93cykgdGhyb3dzIFRocm93YWJsZQogICAgIHsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIiksIHJvd3MpOwpAQCAtMTczNyw2ICsxODE5LDExIEBACiAgICAgICAgIHJldHVybiBleHBlY3RlZDsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdFtdW10gcm93cyhPYmplY3RbXS4uLiByb3dzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJvd3M7CisgICAgfQorCiAgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0RW1wdHkoVW50eXBlZFJlc3VsdFNldCByZXN1bHQpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiAhcmVzdWx0LmlzRW1wdHkoKSkKQEAgLTE3NjgsOCArMTg1NSwxNSBAQAogICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKE9wdGlvbmFsLmVtcHR5KCksIGVycm9yTWVzc2FnZSwgZXhjZXB0aW9uLCBxdWVyeSwgdmFsdWVzKTsKICAgICB9CiAKLSAgICAvLyBpZiBhIHByb3RvY29sIHZlcnNpb24gPiBJbnRlZ2VyLk1JTl9WQUxVRSBpcyBzdXBwbGllZCwgZXhlY3V0ZXMKLSAgICAvLyB0aGUgcXVlcnkgdmlhIHRoZSBqYXZhIGRyaXZlciwgbWltaWNraW5nIGEgcmVhbCBjbGllbnQuCisgICAgLyoqCisgICAgICogQXNzZXJ0cyB0aGF0IHRoZSBxdWVyeSBwcm92aWRlZCB0aHJvd3MgdGhlIGV4Y2VwdGlvbnMgcHJvdmlkZWQuCisgICAgICoKKyAgICAgKiBOT1RFOiBUaGlzIG1ldGhvZCB1c2VzIHtAbGluayBDbGllbnRTdGF0ZSNmb3JJbnRlcm5hbENhbGxzKCl9IHdoaWNoIHNldHMgdGhlIHtAbGluayBDbGllbnRTdGF0ZSNpc0ludGVybmFsfSB2YWx1ZQorICAgICAqIHRvIHRydWUsIG51bGxpZnlpbmcgYW55IHN5c3RlbSBrZXlzcGFjZSBvciBvdGhlciBwZXJtaXNzaW9ucyBjaGVja2luZyBmb3IgdGFibGVzLgorICAgICAqCisgICAgICogSWYgYSBwcm90b2NvbCB2ZXJzaW9uID4gSW50ZWdlci5NSU5fVkFMVUUgaXMgc3VwcGxpZWQsIGV4ZWN1dGVzCisgICAgICogdGhlIHF1ZXJ5IHZpYSB0aGUgamF2YSBkcml2ZXIsIG1pbWlja2luZyBhIHJlYWwgY2xpZW50LgorICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoT3B0aW9uYWw8UHJvdG9jb2xWZXJzaW9uPiBwcm90b2NvbFZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3JNZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFRocm93YWJsZT4gZXhjZXB0aW9uLApAQCAtMjE0OCwxMiArMjI0MiwxMiBAQAogICAgICAgICByZXR1cm4gbmV3IFVzZXJUeXBlVmFsdWUoZmllbGROYW1lcywgZmllbGRWYWx1ZXMpOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBPYmplY3QgbGlzdChPYmplY3QuLi52YWx1ZXMpCisgICAgcHJvdGVjdGVkIExpc3Q8T2JqZWN0PiBsaXN0KE9iamVjdC4uLnZhbHVlcykKICAgICB7CiAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KHZhbHVlcyk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIE9iamVjdCBzZXQoT2JqZWN0Li4udmFsdWVzKQorICAgIHByb3RlY3RlZCBTZXQ8T2JqZWN0PiBzZXQoT2JqZWN0Li4udmFsdWVzKQogICAgIHsKICAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5jb3B5T2YodmFsdWVzKTsKICAgICB9CkBAIC0yNDAzLDQgKzI0OTcsMzIgQEAKICAgICAgICAgICAgICAgICAmJiBPYmplY3RzLmVxdWFsKHBhc3N3b3JkLCB1LnBhc3N3b3JkKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgSW5NZW1vcnkgZXh0ZW5kcyBDUUxUZXN0ZXIKKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgTGlzdGVuYWJsZUZpbGVTeXN0ZW0gZnMgPSBudWxsOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2VkIGJ5IHtAbGluayAjY2xlYW51cEZpbGVTeXN0ZW1MaXN0ZW5lcnMoKX0gdG8ga25vdyBpZiBmaWxlIHN5c3RlbSBsaXN0ZW5lcnMgc2hvdWxkIGJlIHJlbW92ZWQgYXQgdGhlIHN0YXJ0CisgICAgICAgICAqIG9mIGEgdGVzdDsgY2FuIGRpc2FibGUgZm9yIGNhc2VzIHdoZXJlIGxpc3RlbmVycyBhcmUgbmVlZGVkIGNyb3NzIG11dGxpcGxlIHRlc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2xlYW51cEZpbGVTeXN0ZW1MaXN0ZW5lcnMgPSB0cnVlOworCisgICAgICAgIEBCZWZvcmVDbGFzcworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZzID0gRmlsZVN5c3RlbXMubmV3R2xvYmFsSW5NZW1vcnlGaWxlU3lzdGVtKCk7CisgICAgICAgICAgICBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSUdOT1JFX01JU1NJTkdfTkFUSVZFX0ZJTEVfSElOVFMuc2V0Qm9vbGVhbih0cnVlKTsKKyAgICAgICAgICAgIEZpbGVTeXN0ZW1zLm1heWJlQ3JlYXRlVG1wKCk7CisKKyAgICAgICAgICAgIENRTFRlc3Rlci5zZXRVcENsYXNzKCk7CisgICAgICAgIH0KKyAgICAgICAgQEJlZm9yZQorICAgICAgICBwdWJsaWMgdm9pZCBjbGVhbnVwRmlsZVN5c3RlbUxpc3RlbmVycygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghY2xlYW51cEZpbGVTeXN0ZW1MaXN0ZW5lcnMpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgZnMuY2xlYXJMaXN0ZW5lcnMoKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0N1c3RvbU5vd0luU2Vjb25kc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0N1c3RvbU5vd0luU2Vjb25kc1Rlc3QuamF2YQppbmRleCA4NzY4Yjc3Li5jZTliMTAzIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9DdXN0b21Ob3dJblNlY29uZHNUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQ3VzdG9tTm93SW5TZWNvbmRzVGVzdC5qYXZhCkBAIC0yNSw2ICsyNSw3IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2VydmVyVGVzdFV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc3RhdGVtZW50cy5CYXRjaFN0YXRlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuTW9kaWZpY2F0aW9uU3RhdGVtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbnNpc3RlbmN5TGV2ZWw7CkBAIC00Myw2ICs0NCw4IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwQ2xhc3MoKQogICAgIHsKKyAgICAgICAgU2VydmVyVGVzdFV0aWxzLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CisKICAgICAgICAgcHJlcGFyZVNlcnZlcigpOwogICAgICAgICByZXF1aXJlTmV0d29yaygpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0RlY29yYXRlZEtleVByZWZpeGVzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvRGVjb3JhdGVkS2V5UHJlZml4ZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyNmQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0RlY29yYXRlZEtleVByZWZpeGVzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDM7CisKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5CeXRlT3JkZXJlZFBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5UaHJvd2luZ1J1bm5hYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Ub21ic3RvbmVzV2l0aEluZGV4ZWRTU1RhYmxlVGVzdC5tYWtlUmFuZG9tU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyBwcmltYXJ5IGluZGV4IGZvciBwcmVmaXhlcy4gRXhlcmNpc2VzIHBhdGhzIGluIHRoZSBCVEkgcGFydGl0aW9uIGl0ZXJhdG9ycyB0aGF0IGFyZSB2ZXJ5IGhhcmQgdG8gcmVhY2ggdXNpbmcKKyAqIGEgaGFzaGluZyBwYXJ0aXRpb25lci4KKyAqLworcHVibGljIGNsYXNzIERlY29yYXRlZEtleVByZWZpeGVzVGVzdCBleHRlbmRzIENRTFRlc3RlcgoreworICAgIC8vIHRvIGZvcmNlIGluZGV4aW5nLCB3ZSBuZWVkIG1vcmUgdGhhbiAyKmNvbHVtbl9pbmRleF9zaXplICg0ayBmb3IgdGVzdHMpIGJ5dGVzIHBlciBwYXJ0aXRpb24uCisgICAgc3RhdGljIGZpbmFsIGludCBFTlRSWV9TSVpFID0gMTAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgV0lERV9ST1dfQ09VTlQgPSAxMDA7CisKKyAgICBTdHJpbmdbXSBrZXlzOworICAgIFN0cmluZ1tdIHNhbWVQcmVmaXhCZWZvcmU7CisgICAgU3RyaW5nW10gc2FtZVByZWZpeEFmdGVyOworCisgICAgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKCk7CisKKyAgICAvLyBNdXN0IGJlIGNhbGxlZCB0aGUgc2FtZSBhcyBDUUxUZXN0ZXIncyB2ZXJzaW9uIHRvIGVuc3VyZSBpdCBvdmVycmlkZXMgaXQKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKyAgICAgICAgU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2Uuc2V0UGFydGl0aW9uZXJVbnNhZmUoQnl0ZU9yZGVyZWRQYXJ0aXRpb25lci5pbnN0YW5jZSk7CisKKyAgICAgICAgLy8gT25jZSBwZXItSlZNIGlzIGVub3VnaAorICAgICAgICBwcmVwYXJlU2VydmVyKCk7CisgICAgfQorCisgICAgYm9vbGVhbiB3aWRlKGludCBpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGkgJSAyID09IDE7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgcmFuZG9tQ0tleShpbnQgaSkKKyAgICB7CisgICAgICAgIHJldHVybiB3aWRlKGkpID8gcmFuZC5uZXh0SW50KFdJREVfUk9XX0NPVU5UKSA6IDA7CisgICAgfQorCisgICAgdm9pZCBwcmVwYXJlVGFibGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShEYXRhYmFzZURlc2NyaXB0b3IuZ2V0UGFydGl0aW9uZXIoKSBpbnN0YW5jZW9mIEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIpOworCisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIHRleHQsIGNrIGludCwgdjEgaW50LCB2MiB0ZXh0LCBwcmltYXJ5IGtleShwaywgY2spKTsiKTsKKworICAgICAgICBTdHJpbmdbXSBiYXNlS2V5cyA9IG5ldyBTdHJpbmdbXSB7IkEiLCAiQkIiLCAiQ0NDIiwgIkREREQifTsKKyAgICAgICAga2V5cyA9IG5ldyBTdHJpbmdbYmFzZUtleXMubGVuZ3RoXTsKKyAgICAgICAgc2FtZVByZWZpeEJlZm9yZSA9IG5ldyBTdHJpbmdbYmFzZUtleXMubGVuZ3RoXTsKKyAgICAgICAgc2FtZVByZWZpeEFmdGVyID0gbmV3IFN0cmluZ1tiYXNlS2V5cy5sZW5ndGhdOworCisgICAgICAgIC8vIENyZWF0ZSBrZXlzIGFuZCBib3VuZHMgYmVmb3JlIGFuZCBhZnRlciBpdCB3aXRoIHRoZSBzYW1lIHByZWZpeAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJhc2VLZXlzLmxlbmd0aDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gYmFzZUtleXNbaV07CisgICAgICAgICAgICBrZXlzW2ldID0ga2V5ICsgImtleSI7CisgICAgICAgICAgICBzYW1lUHJlZml4QmVmb3JlW2ldID0ga2V5ICsgImJlZm9yZSI7CisgICAgICAgICAgICBzYW1lUHJlZml4QWZ0ZXJbaV0gPSBrZXkgKyAibGFyZ2VyIjsKKyAgICAgICAgICAgIGFkZFBhcnRpdGlvbihrZXlzW2ldLCB3aWRlKGkpID8gV0lERV9ST1dfQ09VTlQgOiAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRQYXJ0aXRpb24oU3RyaW5nIGtleSwgaW50IHJvd0NvdW50KSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd0NvdW50OyArK2kpCisgICAgICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2MSwgdjIpIHZhbHVlcyAoPywgPywgPywgPykiLCBrZXksIGksIDEsIG1ha2VSYW5kb21TdHJpbmcoRU5UUllfU0laRSkpOworICAgIH0KKworICAgIHZvaWQgdGVzdFdpdGhGbHVzaChUaHJvd2luZ1J1bm5hYmxlIHRlc3QpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHByZXBhcmVUYWJsZSgpOworICAgICAgICB0ZXN0LnJ1bigpOworICAgICAgICBmbHVzaCgpOworICAgICAgICB0ZXN0LnJ1bigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByZWZpeExvb2t1cEVRKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgdGVzdFdpdGhGbHVzaCgoKSAtPgorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSBwayA9ID8gQU5EIGNrID0gPyIsIGtleXNbaV0sIHJhbmRvbUNLZXkoaSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGtleXNbaV0pKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSBwayA9ID8iLCBzYW1lUHJlZml4QmVmb3JlW2ldKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUIHBrIEZST00gJXMgV0hFUkUgcGsgPSA/Iiwgc2FtZVByZWZpeEFmdGVyW2ldKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByZWZpeExvb2t1cEdFKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgdGVzdFdpdGhGbHVzaCgoKSAtPgorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPj0gdG9rZW4oPykgTElNSVQgMSIsIGtleXNbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGtleXNbaV0pKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+PSB0b2tlbig/KSBMSU1JVCAxIiwgc2FtZVByZWZpeEJlZm9yZVtpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coa2V5c1tpXSkpOworICAgICAgICAgICAgICAgIGFzc2VydFJldHVybnNOZXh0KGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+PSB0b2tlbig/KSBMSU1JVCAxIiwgc2FtZVByZWZpeEFmdGVyW2ldKSwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHZvaWQgYXNzZXJ0UmV0dXJuc05leHQoVW50eXBlZFJlc3VsdFNldCByZXN1bHQsIGludCBpKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBpZiAoaSA9PSBrZXlzLmxlbmd0aCAtIDEpCisgICAgICAgICAgICBhc3NlcnRFbXB0eShyZXN1bHQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhc3NlcnRSb3dzKHJlc3VsdCwgcm93KGtleXNbaSArIDFdKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlZml4TG9va3VwR1QoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICB0ZXN0V2l0aEZsdXNoKCgpIC0+CisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRSZXR1cm5zTmV4dChleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPiB0b2tlbig/KSBMSU1JVCAxIiwga2V5c1tpXSksIGkpOworICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHBrIEZST00gJXMgV0hFUkUgdG9rZW4ocGspID4gdG9rZW4oPykgTElNSVQgMSIsIHNhbWVQcmVmaXhCZWZvcmVbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGtleXNbaV0pKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRSZXR1cm5zTmV4dChleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPiB0b2tlbig/KSBMSU1JVCAxIiwgc2FtZVByZWZpeEFmdGVyW2ldKSwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByZWZpeEtleVNsaWNlRXhhY3QoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICB0ZXN0V2l0aEZsdXNoKCgpIC0+CisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gaTsgaiA8IGtleXMubGVuZ3RoOyArK2opCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArICI8PiIgKyBqLCBNYXRoLm1heCgwLCBqIC0gaSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZSgiU0VMRUNUIHBrIEZST00gJXMgV0hFUkUgdG9rZW4ocGspID4gdG9rZW4oPykgQU5EIHRva2VuKHBrKSA8IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwga2V5c1tpXSwga2V5c1tqXSkuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGkgKyAiPTw+IiArIGosIGogLSBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZSgiU0VMRUNUIHBrIEZST00gJXMgV0hFUkUgdG9rZW4ocGspID4gdG9rZW4oPykgQU5EIHRva2VuKHBrKSA8PSB0b2tlbig/KSBBTkQgY2sgPSAwIEFMTE9XIEZJTFRFUklORyIsIGtleXNbaV0sIGtleXNbal0pLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIjw+PSIgKyBqLCBqIC0gaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+PSB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDwgdG9rZW4oPykgQU5EIGNrID0gMCBBTExPVyBGSUxURVJJTkciLCBrZXlzW2ldLCBrZXlzW2pdKS5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArICI9PD49IiArIGosIGogLSBpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+PSB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDw9IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwga2V5c1tpXSwga2V5c1tqXSkuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByZWZpeEtleVNsaWNlU2FtZVByZWZpeCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRlc3RXaXRoRmx1c2goKCkgLT4KKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGk7IGogPCBrZXlzLmxlbmd0aDsgKytqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIjxiYT4iICsgaiwgaiAtIGkgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPiB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDwgdG9rZW4oPykgQU5EIGNrID0gMCBBTExPVyBGSUxURVJJTkciLCBzYW1lUHJlZml4QmVmb3JlW2ldLCBzYW1lUHJlZml4QWZ0ZXJbal0pLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGkgKyAiPTxiYT4iICsgaiwgaiAtIGkgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPiB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDw9IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwgc2FtZVByZWZpeEJlZm9yZVtpXSwgc2FtZVByZWZpeEFmdGVyW2pdKS5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIjxiYT49IiArIGosIGogLSBpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZSgiU0VMRUNUIHBrIEZST00gJXMgV0hFUkUgdG9rZW4ocGspID49IHRva2VuKD8pIEFORCB0b2tlbihwaykgPCB0b2tlbig/KSBBTkQgY2sgPSAwIEFMTE9XIEZJTFRFUklORyIsIHNhbWVQcmVmaXhCZWZvcmVbaV0sIHNhbWVQcmVmaXhBZnRlcltqXSkuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArICI9PGJhPj0iICsgaiwgaiAtIGkgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPj0gdG9rZW4oPykgQU5EIHRva2VuKHBrKSA8PSB0b2tlbig/KSBBTkQgY2sgPSAwIEFMTE9XIEZJTFRFUklORyIsIHNhbWVQcmVmaXhCZWZvcmVbaV0sIHNhbWVQcmVmaXhBZnRlcltqXSkuc2l6ZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIjxhYT4iICsgaiwgaiAtIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+IHRva2VuKD8pIEFORCB0b2tlbihwaykgPCB0b2tlbig/KSBBTkQgY2sgPSAwIEFMTE9XIEZJTFRFUklORyIsIHNhbWVQcmVmaXhBZnRlcltpXSwgc2FtZVByZWZpeEFmdGVyW2pdKS5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIj08YWE+IiArIGosIGogLSBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPiB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDw9IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwgc2FtZVByZWZpeEFmdGVyW2ldLCBzYW1lUHJlZml4QWZ0ZXJbal0pLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGkgKyAiPGFhPj0iICsgaiwgaiAtIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+PSB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDwgdG9rZW4oPykgQU5EIGNrID0gMCBBTExPVyBGSUxURVJJTkciLCBzYW1lUHJlZml4QWZ0ZXJbaV0sIHNhbWVQcmVmaXhBZnRlcltqXSkuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArICI9PGFhPj0iICsgaiwgaiAtIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+PSB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDw9IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwgc2FtZVByZWZpeEFmdGVyW2ldLCBzYW1lUHJlZml4QWZ0ZXJbal0pLnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArICI8YmI+IiArIGosIGogLSBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPiB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDwgdG9rZW4oPykgQU5EIGNrID0gMCBBTExPVyBGSUxURVJJTkciLCBzYW1lUHJlZml4QmVmb3JlW2ldLCBzYW1lUHJlZml4QmVmb3JlW2pdKS5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIj08YmI+IiArIGosIGogLSBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPiB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDw9IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwgc2FtZVByZWZpeEJlZm9yZVtpXSwgc2FtZVByZWZpeEJlZm9yZVtqXSkuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArICI8YmI+PSIgKyBqLCBqIC0gaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZSgiU0VMRUNUIHBrIEZST00gJXMgV0hFUkUgdG9rZW4ocGspID49IHRva2VuKD8pIEFORCB0b2tlbihwaykgPCB0b2tlbig/KSBBTkQgY2sgPSAwIEFMTE9XIEZJTFRFUklORyIsIHNhbWVQcmVmaXhCZWZvcmVbaV0sIHNhbWVQcmVmaXhCZWZvcmVbal0pLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGkgKyAiPTxiYj49IiArIGosIGogLSBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPj0gdG9rZW4oPykgQU5EIHRva2VuKHBrKSA8PSB0b2tlbig/KSBBTkQgY2sgPSAwIEFMTE9XIEZJTFRFUklORyIsIHNhbWVQcmVmaXhCZWZvcmVbaV0sIHNhbWVQcmVmaXhCZWZvcmVbal0pLnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArICI8YWI+IiArIGosIE1hdGgubWF4KDAsIGogLSBpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+IHRva2VuKD8pIEFORCB0b2tlbihwaykgPCB0b2tlbig/KSBBTkQgY2sgPSAwIEFMTE9XIEZJTFRFUklORyIsIHNhbWVQcmVmaXhBZnRlcltpXSwgc2FtZVByZWZpeEJlZm9yZVtqXSkuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArICI9PGFiPiIgKyBqLCBNYXRoLm1heCgwLCBqIC0gaSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPiB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDw9IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwgc2FtZVByZWZpeEFmdGVyW2ldLCBzYW1lUHJlZml4QmVmb3JlW2pdKS5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIjxhYj49IiArIGosIE1hdGgubWF4KDAsIGogLSBpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+PSB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDwgdG9rZW4oPykgQU5EIGNrID0gMCBBTExPVyBGSUxURVJJTkciLCBzYW1lUHJlZml4QWZ0ZXJbaV0sIHNhbWVQcmVmaXhCZWZvcmVbal0pLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGkgKyAiPTxhYj49IiArIGosIE1hdGgubWF4KDAsIGogLSBpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+PSB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDw9IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwgc2FtZVByZWZpeEFmdGVyW2ldLCBzYW1lUHJlZml4QmVmb3JlW2pdKS5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlZml4S2V5U2xpY2VNaXhlZCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRlc3RXaXRoRmx1c2goKCkgLT4KKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGk7IGogPCBrZXlzLmxlbmd0aDsgKytqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIjxiaz4iICsgaiwgaiAtIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+IHRva2VuKD8pIEFORCB0b2tlbihwaykgPCB0b2tlbig/KSBBTkQgY2sgPSAwIEFMTE9XIEZJTFRFUklORyIsIHNhbWVQcmVmaXhCZWZvcmVbaV0sIGtleXNbal0pLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGkgKyAiPTxiaz4iICsgaiwgaiAtIGkgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPiB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDw9IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwgc2FtZVByZWZpeEJlZm9yZVtpXSwga2V5c1tqXSkuc2l6ZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIjxhaz4iICsgaiwgTWF0aC5tYXgoMCwgaiAtIGkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZSgiU0VMRUNUIHBrIEZST00gJXMgV0hFUkUgdG9rZW4ocGspID4gdG9rZW4oPykgQU5EIHRva2VuKHBrKSA8IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwgc2FtZVByZWZpeEFmdGVyW2ldLCBrZXlzW2pdKS5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIj08YWs+IiArIGosIGogLSBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPiB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDw9IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwgc2FtZVByZWZpeEFmdGVyW2ldLCBrZXlzW2pdKS5zaXplKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGkgKyAiPGtiPiIgKyBqLCBNYXRoLm1heCgwLCBqIC0gaSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPiB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDwgdG9rZW4oPykgQU5EIGNrID0gMCBBTExPVyBGSUxURVJJTkciLCBrZXlzW2ldLCBzYW1lUHJlZml4QmVmb3JlW2pdKS5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIj08a2I+IiArIGosIGogLSBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPj0gdG9rZW4oPykgQU5EIHRva2VuKHBrKSA8IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwga2V5c1tpXSwgc2FtZVByZWZpeEJlZm9yZVtqXSkuc2l6ZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIjxrYT4iICsgaiwgaiAtIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+IHRva2VuKD8pIEFORCB0b2tlbihwaykgPCB0b2tlbig/KSBBTkQgY2sgPSAwIEFMTE9XIEZJTFRFUklORyIsIGtleXNbaV0sIHNhbWVQcmVmaXhBZnRlcltqXSkuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArICI9PGthPiIgKyBqLCBqIC0gaSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+PSB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDwgdG9rZW4oPykgQU5EIGNrID0gMCBBTExPVyBGSUxURVJJTkciLCBrZXlzW2ldLCBzYW1lUHJlZml4QWZ0ZXJbal0pLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9FbXB0eVZhbHVlc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0VtcHR5VmFsdWVzVGVzdC5qYXZhCmluZGV4IDM2NTJhYzguLmZmN2Y4NjEgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0VtcHR5VmFsdWVzVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0VtcHR5VmFsdWVzVGVzdC5qYXZhCkBAIC0xOSw3ICsxOSw2IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDM7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIApAQCAtNzMsMTcgKzcyLDIwIEBACiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWYgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc1RhYmxlIDogY2ZzLmdldExpdmVTU1RhYmxlcygpKQogICAgICAgICB7Ci0gICAgICAgICAgICB0cnkgKFByaW50U3RyZWFtIG91dCA9IG5ldyBQcmludFN0cmVhbShidWYsIHRydWUpKQorICAgICAgICAgICAgaW50IGV4aXRWYWx1ZSA9IDA7CisgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBQcm9jZXNzQnVpbGRlciBwYiA9IG5ldyBQcm9jZXNzQnVpbGRlcigidG9vbHMvYmluL3NzdGFibGVkdW1wIiwgc3NUYWJsZS5nZXRGaWxlbmFtZSgpKTsKKyAgICAgICAgICAgICAgICBwYi5yZWRpcmVjdEVycm9yU3RyZWFtKHRydWUpOwogICAgICAgICAgICAgICAgIFByb2Nlc3MgcHJvY2VzcyA9IHBiLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzcy53YWl0Rm9yKCk7CisgICAgICAgICAgICAgICAgZXhpdFZhbHVlID0gcHJvY2Vzcy53YWl0Rm9yKCk7CiAgICAgICAgICAgICAgICAgSU9VdGlscy5jb3B5KHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSwgYnVmKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCh0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYnVmLnRvU3RyaW5nKCksIDAsIGV4aXRWYWx1ZSk7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIFN0cmluZyBvdXRTdHJpbmcgPSBuZXcgU3RyaW5nKGJ1Zi50b0J5dGVBcnJheSgpLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0djQ29tcGFjdGlvblRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0djQ29tcGFjdGlvblRlc3QuamF2YQppbmRleCBlZGVkMTQ1Li45MTExMWQxIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9HY0NvbXBhY3Rpb25UZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvR2NDb21wYWN0aW9uVGVzdC5qYXZhCkBAIC01NSw3ICs1NSw3IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFVudHlwZWRSZXN1bHRTZXQgZXhlY3V0ZShTdHJpbmcgcXVlcnksIE9iamVjdC4uLiB2YWx1ZXMpIHRocm93cyBUaHJvd2FibGUKKyAgICBwcm90ZWN0ZWQgVW50eXBlZFJlc3VsdFNldCBleGVjdXRlKFN0cmluZyBxdWVyeSwgT2JqZWN0Li4uIHZhbHVlcykKICAgICB7CiAgICAgICAgIHJldHVybiBleGVjdXRlRm9ybWF0dGVkUXVlcnkoZm9ybWF0UXVlcnkoS0VZU1BBQ0VfUEVSX1RFU1QsIHF1ZXJ5KSwgdmFsdWVzKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9LZXlDYWNoZUNxbFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0tleUNhY2hlQ3FsVGVzdC5qYXZhCmluZGV4IDJiMGEzYzguLjljN2RhYzEgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0tleUNhY2hlQ3FsVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0tleUNhY2hlQ3FsVGVzdC5qYXZhCkBAIC0zMyw2ICszMyw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguSW5kZXg7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5maWx0ZXIuQmxvb21GaWx0ZXJNZXRyaWNzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUua2V5Y2FjaGUuS2V5Q2FjaGVTdXBwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2FjaGVNZXRyaWNzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2Fzc2FuZHJhTWV0cmljc1JlZ2lzdHJ5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5DYWNoaW5nUGFyYW1zOwpAQCAtNDksNiArNTEsNyBAQAogCiBwdWJsaWMgY2xhc3MgS2V5Q2FjaGVDcWxUZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzc3RhYmxlSW1wbENhY2hlc0tleXM7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29tbW9uQ29sdW1uc0RlZiA9CiAgICAgInBhcnRfa2V5X2EgICAgIGludCwiICsKQEAgLTk4LDYgKzEwMSw3IEBACiAgICAgewogICAgICAgICBDYWNoaW5nUGFyYW1zLkRFRkFVTFQgPSBDYWNoaW5nUGFyYW1zLkNBQ0hFX05PVEhJTkc7CiAgICAgICAgIENRTFRlc3Rlci5zZXRVcENsYXNzKCk7CisgICAgICAgIHNzdGFibGVJbXBsQ2FjaGVzS2V5cyA9IEtleUNhY2hlU3VwcG9ydC5pc1N1cHBvcnRlZEJ5KERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTUsNyArMTE5LDcgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgVW50eXBlZFJlc3VsdFNldCBleGVjdXRlKFN0cmluZyBxdWVyeSwgT2JqZWN0Li4uIHZhbHVlcykgdGhyb3dzIFRocm93YWJsZQorICAgIHByb3RlY3RlZCBVbnR5cGVkUmVzdWx0U2V0IGV4ZWN1dGUoU3RyaW5nIHF1ZXJ5LCBPYmplY3QuLi4gdmFsdWVzKQogICAgIHsKICAgICAgICAgcmV0dXJuIGV4ZWN1dGVGb3JtYXR0ZWRRdWVyeShmb3JtYXRRdWVyeShLRVlTUEFDRV9QRVJfVEVTVCwgcXVlcnkpLCB2YWx1ZXMpOwogICAgIH0KQEAgLTI2OCw3ICsyNzIsNyBAQAogICAgICAgICBsb25nIGhpdHMgPSBtZXRyaWNzLmhpdHMuZ2V0Q291bnQoKTsKICAgICAgICAgbG9uZyByZXF1ZXN0cyA9IG1ldHJpY3MucmVxdWVzdHMuZ2V0Q291bnQoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGhpdHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRSZXF1ZXN0cywgcmVxdWVzdHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3N0YWJsZUltcGxDYWNoZXNLZXlzID8gZXhwZWN0ZWRSZXF1ZXN0cyA6IDAsIHJlcXVlc3RzKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspCiAgICAgICAgIHsKQEAgLTI4NSw4ICsyODksOCBAQAogICAgICAgICBtZXRyaWNzID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmdldE1ldHJpY3MoKTsKICAgICAgICAgaGl0cyA9IG1ldHJpY3MuaGl0cy5nZXRDb3VudCgpOwogICAgICAgICByZXF1ZXN0cyA9IG1ldHJpY3MucmVxdWVzdHMuZ2V0Q291bnQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgaGl0cyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJlcXVlc3RzLCByZXF1ZXN0cyk7CisgICAgICAgIGFzc2VydEVxdWFscyhzc3RhYmxlSW1wbENhY2hlc0tleXMgPyAyMDAgOiAwLCBoaXRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNzdGFibGVJbXBsQ2FjaGVzS2V5cyA/IGV4cGVjdGVkUmVxdWVzdHMgOiAwLCByZXF1ZXN0cyk7CiAKICAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLnN1Ym1pdFdyaXRlKEludGVnZXIuTUFYX1ZBTFVFKS5nZXQoKTsKIApAQCAtMzYyLDcgKzM2Niw3IEBACiAgICAgICAgIGxvbmcgaGl0cyA9IG1ldHJpY3MuaGl0cy5nZXRDb3VudCgpOwogICAgICAgICBsb25nIHJlcXVlc3RzID0gbWV0cmljcy5yZXF1ZXN0cy5nZXRDb3VudCgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaGl0cyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZE51bWJlck9mUmVxdWVzdHMsIHJlcXVlc3RzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNzdGFibGVJbXBsQ2FjaGVzS2V5cyA/IGV4cGVjdGVkTnVtYmVyT2ZSZXF1ZXN0cyA6IDAsIHJlcXVlc3RzKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspCiAgICAgICAgIHsKQEAgLTM4MCw4ICszODQsOCBAQAogICAgICAgICBtZXRyaWNzID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmdldE1ldHJpY3MoKTsKICAgICAgICAgaGl0cyA9IG1ldHJpY3MuaGl0cy5nZXRDb3VudCgpOwogICAgICAgICByZXF1ZXN0cyA9IG1ldHJpY3MucmVxdWVzdHMuZ2V0Q291bnQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgaGl0cyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZE51bWJlck9mUmVxdWVzdHMsIHJlcXVlc3RzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNzdGFibGVJbXBsQ2FjaGVzS2V5cyA/IDIwMCA6IDAsIGhpdHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3N0YWJsZUltcGxDYWNoZXNLZXlzID8gZXhwZWN0ZWROdW1iZXJPZlJlcXVlc3RzIDogMCwgcmVxdWVzdHMpOwogCiAgICAgICAgIGRyb3BUYWJsZSgiRFJPUCBUQUJMRSAlcyIpOwogCkBAIC00MjgsNiArNDMyLDcgQEAKIAogICAgICAgICBsb25nIGV4cGVjdGVkTnVtYmVyT2ZSZXF1ZXN0cyA9IDA7CiAKKyAgICAgICAgQ2FjaGVNZXRyaWNzIG1ldHJpY3MgPSBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGUuZ2V0TWV0cmljcygpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspCiAgICAgICAgIHsKICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbF90ZXh0IEZST00gJXMgV0hFUkUgcGFydF9rZXlfYSA9ID8gQU5EIHBhcnRfa2V5X2IgPSA/IiwgaSwgSW50ZWdlci50b09jdGFsU3RyaW5nKGkpKSwKQEAgLTQzNywxMSArNDQyLDEwIEBACiAgICAgICAgICAgICBleHBlY3RlZE51bWJlck9mUmVxdWVzdHMgKz0gcmVjZW50Qmxvb21GaWx0ZXJGYWxzZVBvc2l0aXZlcygpICsgMTsKICAgICAgICAgfQogCi0gICAgICAgIENhY2hlTWV0cmljcyBtZXRyaWNzID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmdldE1ldHJpY3MoKTsKICAgICAgICAgbG9uZyBoaXRzID0gbWV0cmljcy5oaXRzLmdldENvdW50KCk7CiAgICAgICAgIGxvbmcgcmVxdWVzdHMgPSBtZXRyaWNzLnJlcXVlc3RzLmdldENvdW50KCk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBoaXRzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCByZXF1ZXN0cyk7CisgICAgICAgIGFzc2VydEVxdWFscyhzc3RhYmxlSW1wbENhY2hlc0tleXMgPyAxMCA6IDAsIHJlcXVlc3RzKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQogICAgICAgICB7CkBAIC00NTQsOCArNDU4LDggQEAKIAogICAgICAgICBoaXRzID0gbWV0cmljcy5oaXRzLmdldENvdW50KCk7CiAgICAgICAgIHJlcXVlc3RzID0gbWV0cmljcy5yZXF1ZXN0cy5nZXRDb3VudCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIGhpdHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWROdW1iZXJPZlJlcXVlc3RzLCByZXF1ZXN0cyk7CisgICAgICAgIGFzc2VydEVxdWFscyhzc3RhYmxlSW1wbENhY2hlc0tleXMgPyAxMCA6IDAsIGhpdHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3N0YWJsZUltcGxDYWNoZXNLZXlzID8gZXhwZWN0ZWROdW1iZXJPZlJlcXVlc3RzIDogMCwgcmVxdWVzdHMpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC00OTIsNyArNDk2LDcgQEAKICAgICAgICAgbG9uZyBoaXRzID0gbWV0cmljcy5oaXRzLmdldENvdW50KCk7CiAgICAgICAgIGxvbmcgcmVxdWVzdHMgPSBtZXRyaWNzLnJlcXVlc3RzLmdldENvdW50KCk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBoaXRzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCByZXF1ZXN0cyk7CisgICAgICAgIGFzc2VydEVxdWFscyhzc3RhYmxlSW1wbENhY2hlc0tleXMgPyAxMCA6IDAsIHJlcXVlc3RzKTsKIAogICAgICAgICAvLyAxMCBxdWVyaWVzLCBlYWNoIDUwIHJlc3VsdCByb3dzCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykKQEAgLTUwMyw4ICs1MDcsOCBAQAogICAgICAgICBtZXRyaWNzID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmdldE1ldHJpY3MoKTsKICAgICAgICAgaGl0cyA9IG1ldHJpY3MuaGl0cy5nZXRDb3VudCgpOwogICAgICAgICByZXF1ZXN0cyA9IG1ldHJpY3MucmVxdWVzdHMuZ2V0Q291bnQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBoaXRzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEwICsgMTAsIHJlcXVlc3RzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNzdGFibGVJbXBsQ2FjaGVzS2V5cyA/IDEwIDogMCwgaGl0cyk7CisgICAgICAgIGFzc2VydEVxdWFscyhzc3RhYmxlSW1wbENhY2hlc0tleXMgPyAyMCA6IDAsIHJlcXVlc3RzKTsKIAogICAgICAgICAvLyAxMDAgcXVlcmllcyAtIG11c3QgZ2V0IGEgaGl0IGluIGtleS1jYWNoZQogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspCkBAIC01MTksOCArNTIzLDggQEAKICAgICAgICAgbWV0cmljcyA9IENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5nZXRNZXRyaWNzKCk7CiAgICAgICAgIGhpdHMgPSBtZXRyaWNzLmhpdHMuZ2V0Q291bnQoKTsKICAgICAgICAgcmVxdWVzdHMgPSBtZXRyaWNzLnJlcXVlc3RzLmdldENvdW50KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxMCArIDEwMCwgaGl0cyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyMCArIDEwMCwgcmVxdWVzdHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3N0YWJsZUltcGxDYWNoZXNLZXlzID8gMTAgKyAxMDAgOiAwLCBoaXRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNzdGFibGVJbXBsQ2FjaGVzS2V5cyA/IDIwICsgMTAwIDogMCwgcmVxdWVzdHMpOwogCiAgICAgICAgIC8vIDUwMDAgcXVlcmllcyAtIGZpcnN0IDEwIHBhcnRpdGlvbnMgYWxyZWFkeSBpbiBrZXkgY2FjaGUKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykKQEAgLTUzNCw4ICs1MzgsOCBAQAogCiAgICAgICAgIGhpdHMgPSBtZXRyaWNzLmhpdHMuZ2V0Q291bnQoKTsKICAgICAgICAgcmVxdWVzdHMgPSBtZXRyaWNzLnJlcXVlc3RzLmdldENvdW50KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxMTAgKyA0OTEwLCBoaXRzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEyMCArIDU1MDAsIHJlcXVlc3RzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNzdGFibGVJbXBsQ2FjaGVzS2V5cyA/IDExMCArIDQ5MTAgOiAwLCBoaXRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNzdGFibGVJbXBsQ2FjaGVzS2V5cyA/IDEyMCArIDU1MDAgOiAwLCByZXF1ZXN0cyk7CiAgICAgfQogCiAgICAgLy8gSW5zZXJ0cyAxMDAgcGFydGl0aW9ucyBzcGxpdCBvdmVyIDEwIHNzdGFibGVzIChmbHVzaCBhZnRlciAxMCBwYXJ0aXRpb25zKS4KQEAgLTYxNCw2ICs2MTgsOSBAQAogCiAgICAgcHJpdmF0ZSBsb25nIHJlY2VudEJsb29tRmlsdGVyRmFsc2VQb3NpdGl2ZXMoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZShLRVlTUEFDRV9QRVJfVEVTVCkubWV0cmljLnJlY2VudEJsb29tRmlsdGVyRmFsc2VQb3NpdGl2ZXMuZ2V0VmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZShLRVlTUEFDRV9QRVJfVEVTVCkubWV0cmljLmZvcm1hdFNwZWNpZmljR2F1Z2VzLmdldChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoQmxvb21GaWx0ZXJNZXRyaWNzLmluc3RhbmNlLnJlY2VudEJsb29tRmlsdGVyRmFsc2VQb3NpdGl2ZXMubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbHVlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxvbmdWYWx1ZSgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0tleXdvcmRTcGxpdDJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9LZXl3b3JkU3BsaXQyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmU2NTFhLi4wMDAwMDAwCi0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0tleXdvcmRTcGxpdDJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOwotCi0vKioKLSAqIFRoaXMgYmFzZSBjbGFzcyB0ZXN0cyBhbGwga2V5d29yZHMgd2hpY2ggdG9vayBhIGxvbmcgdGltZS4gSGVuY2UgaXQgd2FzIHNwbGl0IGludG8gbXVsdGlwbGUKLSAqIEtleXdvcmRUZXN0U3BsaXROIHRvIHByZXZlbnQgQ0kgdGltaW5nIG91dC4gSWYgdGltZW91dHMgcmVhcHBlYXIgc3BsaXQgaXQgZnVydGhlcgotICovCi1AUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQotcHVibGljIGNsYXNzIEtleXdvcmRTcGxpdDJUZXN0IGV4dGVuZHMgS2V5d29yZFRlc3RCYXNlCi17Ci0gICAgc3RhdGljIGludCBTUExJVCA9IDI7Ci0gICAgc3RhdGljIGludCBUT1RBTF9TUExJVFMgPSAyOwotCi0gICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gImtleXdvcmQgezB9IGlzUmVzZXJ2ZWQgezF9IikKLSAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IGtleXdvcmRzKCkgewotICAgICAgICByZXR1cm4gS2V5d29yZFRlc3RCYXNlLmdldEtleXdvcmRzRm9yU3BsaXQoU1BMSVQsIFRPVEFMX1NQTElUUyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBLZXl3b3JkU3BsaXQyVGVzdChTdHJpbmcga2V5d29yZCwgYm9vbGVhbiBpc1Jlc2VydmVkKQotICAgIHsKLSAgICAgICAgc3VwZXIoa2V5d29yZCwgaXNSZXNlcnZlZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvS2V5d29yZFNwbGl0VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvS2V5d29yZFNwbGl0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MWFhZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9LZXl3b3JkU3BsaXRUZXN0LmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworLyoqCisgKiBUaGlzIGJhc2UgY2xhc3MgdGVzdHMgYWxsIGtleXdvcmRzIHdoaWNoIHRvb2sgYSBsb25nIHRpbWUuIEhlbmNlIGl0IHdhcyBzcGxpdCBpbnRvIG11bHRpcGxlCisgKiBLZXl3b3JkVGVzdFNwbGl0TiB0byBwcmV2ZW50IENJIHRpbWluZyBvdXQuIElmIHRpbWVvdXRzIHJlYXBwZWFyIHNwbGl0IGl0IGZ1cnRoZXIKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBLZXl3b3JkU3BsaXRUZXN0IGV4dGVuZHMgS2V5d29yZFRlc3RCYXNlCit7CisgICAgc3RhdGljIGludCBTUExJVCA9IDI7CisgICAgc3RhdGljIGludCBUT1RBTF9TUExJVFMgPSAyOworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gImtleXdvcmQgezB9IGlzUmVzZXJ2ZWQgezF9IikKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IGtleXdvcmRzKCkgeworICAgICAgICByZXR1cm4gS2V5d29yZFRlc3RCYXNlLmdldEtleXdvcmRzRm9yU3BsaXQoU1BMSVQsIFRPVEFMX1NQTElUUyk7CisgICAgfQorCisgICAgcHVibGljIEtleXdvcmRTcGxpdFRlc3QoU3RyaW5nIGtleXdvcmQsIGJvb2xlYW4gaXNSZXNlcnZlZCkKKyAgICB7CisgICAgICAgIHN1cGVyKGtleXdvcmQsIGlzUmVzZXJ2ZWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL01lbXRhYmxlUXVpY2tUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9NZW10YWJsZVF1aWNrVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTVkYTkyLi4wMDAwMDAwCi0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL01lbXRhYmxlUXVpY2tUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOwotCi1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7Ci0KLUBSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCi1wdWJsaWMgY2xhc3MgTWVtdGFibGVRdWlja1Rlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKLXsKLSAgICBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE1lbXRhYmxlUXVpY2tUZXN0LmNsYXNzKTsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgcGFydGl0aW9ucyA9IDUwXzAwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IHJvd3NQZXJQYXJ0aXRpb24gPSA0OwotCi0gICAgc3RhdGljIGZpbmFsIGludCBkZWxldGVkUGFydGl0aW9uc1N0YXJ0ID0gMjBfMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgZGVsZXRlZFBhcnRpdGlvbnNFbmQgPSBkZWxldGVkUGFydGl0aW9uc1N0YXJ0ICsgMTBfMDAwOwotCi0gICAgc3RhdGljIGZpbmFsIGludCBkZWxldGVkUm93c1N0YXJ0ID0gNDBfMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgZGVsZXRlZFJvd3NFbmQgPSBkZWxldGVkUm93c1N0YXJ0ICsgNV8wMDA7Ci0KLSAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoKQotICAgIHB1YmxpYyBTdHJpbmcgbWVtdGFibGVDbGFzczsKLQotICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ7MH0iKQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3Q+IHBhcmFtZXRlcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEltbXV0YWJsZUxpc3Qub2YoInNraXBsaXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNraXBsaXN0X3NoYXJkZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2tpcGxpc3Rfc2hhcmRlZF9sb2NraW5nIik7Ci0gICAgfQotCi0gICAgQEJlZm9yZUNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwKCkKLSAgICB7Ci0gICAgICAgIENRTFRlc3Rlci5zZXRVcENsYXNzKCk7Ci0gICAgICAgIENRTFRlc3Rlci5wcmVwYXJlU2VydmVyKCk7Ci0gICAgICAgIENRTFRlc3Rlci5kaXNhYmxlUHJlcGFyZWRSZXVzZUZvclRlc3QoKTsKLSAgICAgICAgbG9nZ2VyLmluZm8oInNldHVwQ2xhc3MgZG9uZS4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RNZW10YWJsZSgpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0KLSAgICAgICAgU3RyaW5nIGtleXNwYWNlID0gY3JlYXRlS2V5c3BhY2UoIkNSRUFURSBLRVlTUEFDRSAlcyB3aXRoIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnIDogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3RvcicgOiAxIH0gYW5kIGR1cmFibGVfd3JpdGVzID0gZmFsc2UiKTsKLSAgICAgICAgU3RyaW5nIHRhYmxlID0gY3JlYXRlVGFibGUoa2V5c3BhY2UsICJDUkVBVEUgVEFCTEUgJXMgKCB1c2VyaWQgYmlnaW50LCBwaWNpZCBiaWdpbnQsIGNvbW1lbnRpZCBiaWdpbnQsIFBSSU1BUlkgS0VZKHVzZXJpZCwgcGljaWQpKSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aXRoIGNvbXByZXNzaW9uID0geydlbmFibGVkJzogZmFsc2V9IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFuZCBtZW10YWJsZSA9ICciICsgbWVtdGFibGVDbGFzcyArICInIik7Ci0gICAgICAgIGV4ZWN1dGUoInVzZSAiICsga2V5c3BhY2UgKyAnOycpOwotCi0gICAgICAgIFN0cmluZyB3cml0ZVN0YXRlbWVudCA9ICJJTlNFUlQgSU5UTyAiK3RhYmxlKyIodXNlcmlkLHBpY2lkLGNvbW1lbnRpZClWQUxVRVMoPyw/LD8pIjsKLQotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKGtleXNwYWNlKS5nZXRDb2x1bW5GYW1pbHlTdG9yZSh0YWJsZSk7Ci0gICAgICAgIGNmcy5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotCi0gICAgICAgIGxvbmcgaTsKLSAgICAgICAgbG9uZyBsaW1pdCA9IHBhcnRpdGlvbnM7Ci0gICAgICAgIGxvZ2dlci5pbmZvKCJXcml0aW5nIHt9IHBhcnRpdGlvbnMgb2Yge30gcm93cyIsIHBhcnRpdGlvbnMsIHJvd3NQZXJQYXJ0aXRpb24pOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGltaXQ7ICsraSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChsb25nIGogPSAwOyBqIDwgcm93c1BlclBhcnRpdGlvbjsgKytqKQotICAgICAgICAgICAgICAgIGV4ZWN1dGUod3JpdGVTdGF0ZW1lbnQsIGksIGosIGkgKyBqKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZ2dlci5pbmZvKCJEZWxldGluZyBwYXJ0aXRpb25zIGJldHdlZW4ge30gYW5kIHt9IiwgZGVsZXRlZFBhcnRpdGlvbnNTdGFydCwgZGVsZXRlZFBhcnRpdGlvbnNFbmQpOwotICAgICAgICBmb3IgKGkgPSBkZWxldGVkUGFydGl0aW9uc1N0YXJ0OyBpIDwgZGVsZXRlZFBhcnRpdGlvbnNFbmQ7ICsraSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gbm8gcGFydGl0aW9uIGV4aXN0cywgYnV0IHdlIHdpbGwgY3JlYXRlIGEgdG9tYnN0b25lCi0gICAgICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAiICsgdGFibGUgKyAiIFdIRVJFIHVzZXJpZCA9ID8iLCBpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZ2dlci5pbmZvKCJEZWxldGluZyByb3dzIGJldHdlZW4ge30gYW5kIHt9IiwgZGVsZXRlZFJvd3NTdGFydCwgZGVsZXRlZFJvd3NFbmQpOwotICAgICAgICBmb3IgKGkgPSBkZWxldGVkUm93c1N0YXJ0OyBpIDwgZGVsZXRlZFJvd3NFbmQ7ICsraSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gbm8gcm93IGV4aXN0cywgYnV0IHdlIHdpbGwgY3JlYXRlIGEgdG9tYnN0b25lIChhbmQgcGFydGl0aW9uKQotICAgICAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gIiArIHRhYmxlICsgIiBXSEVSRSB1c2VyaWQgPSA/IEFORCBwaWNpZCA9ID8iLCBpLCAwTCk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2dnZXIuaW5mbygiUmVhZGluZyB7fSBwYXJ0aXRpb25zIiwgcGFydGl0aW9ucyk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW1pdDsgKytpKQotICAgICAgICB7Ci0gICAgICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IHJlc3VsdCA9IGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gIiArIHRhYmxlICsgIiBXSEVSRSB1c2VyaWQgPSA/IiwgaSk7Ci0gICAgICAgICAgICBpZiAoaSA+PSBkZWxldGVkUGFydGl0aW9uc1N0YXJ0ICYmIGkgPCBkZWxldGVkUGFydGl0aW9uc0VuZCkKLSAgICAgICAgICAgICAgICBhc3NlcnRFbXB0eShyZXN1bHQpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPj0gZGVsZXRlZFJvd3NTdGFydCAmJiBpIDwgZGVsZXRlZFJvd3NFbmQpCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gMTsKLSAgICAgICAgICAgICAgICBPYmplY3RbXVtdIHJvd3MgPSBuZXcgT2JqZWN0W3Jvd3NQZXJQYXJ0aXRpb24gLSBzdGFydF1bXTsKLSAgICAgICAgICAgICAgICBmb3IgKGxvbmcgaiA9IHN0YXJ0OyBqIDwgcm93c1BlclBhcnRpdGlvbjsgKytqKQotICAgICAgICAgICAgICAgICAgICByb3dzWyhpbnQpIChqIC0gc3RhcnQpXSA9IHJvdyhpLCBqLCBpICsgaik7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhyZXN1bHQsIHJvd3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGRlbGV0ZWRQYXJ0aXRpb25zID0gZGVsZXRlZFBhcnRpdGlvbnNFbmQgLSBkZWxldGVkUGFydGl0aW9uc1N0YXJ0OwotICAgICAgICBpbnQgZGVsZXRlZFJvd3MgPSBkZWxldGVkUm93c0VuZCAtIGRlbGV0ZWRSb3dzU3RhcnQ7Ci0gICAgICAgIGxvZ2dlci5pbmZvKCJTZWxlY3RpbmcgKiIpOwotICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IHJlc3VsdCA9IGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gIiArIHRhYmxlKTsKLSAgICAgICAgYXNzZXJ0Um93Q291bnQocmVzdWx0LCByb3dzUGVyUGFydGl0aW9uICogKHBhcnRpdGlvbnMgLSBkZWxldGVkUGFydGl0aW9ucykgLSBkZWxldGVkUm93cyk7Ci0KLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotCi0gICAgICAgIGxvZ2dlci5pbmZvKCJTZWxlY3RpbmcgKiIpOwotICAgICAgICByZXN1bHQgPSBleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICIgKyB0YWJsZSk7Ci0gICAgICAgIGFzc2VydFJvd0NvdW50KHJlc3VsdCwgcm93c1BlclBhcnRpdGlvbiAqIChwYXJ0aXRpb25zIC0gZGVsZXRlZFBhcnRpdGlvbnMpIC0gZGVsZXRlZFJvd3MpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9NZW10YWJsZVNpemVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9NZW10YWJsZVNpemVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZmYwNTUuLjAwMDAwMDAKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvTWVtdGFibGVTaXplVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKLWltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKLQotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuTWVtdGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT2JqZWN0U2l6ZXM7Ci0KLUBSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCi1wdWJsaWMgY2xhc3MgTWVtdGFibGVTaXplVGVzdCBleHRlbmRzIENRTFRlc3RlcgotewotICAgIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTWVtdGFibGVTaXplVGVzdC5jbGFzcyk7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IHBhcnRpdGlvbnMgPSA1MF8wMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCByb3dzUGVyUGFydGl0aW9uID0gNDsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgZGVsZXRlZFBhcnRpdGlvbnMgPSAxMF8wMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBkZWxldGVkUm93cyA9IDVfMDAwOwotCi0gICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyKDApCi0gICAgcHVibGljIFN0cmluZyBtZW10YWJsZUNsYXNzOwotCi0gICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyKDEpCi0gICAgcHVibGljIGludCBkaWZmZXJlbmNlUGVyUGFydGl0aW9uOwotCi0gICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gInswfSIpCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiBwYXJhbWV0ZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBJbW11dGFibGVMaXN0Lm9mKG5ldyBPYmplY3RbXXsic2tpcGxpc3QiLCA1MH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsic2tpcGxpc3Rfc2hhcmRlZCIsIDYwfSk7Ci0gICAgfQotCi0gICAgLy8gbXVzdCBiZSB3aXRoaW4gNTAgYnl0ZXMgcGVyIHBhcnRpdGlvbiBvZiB0aGUgYWN0dWFsIHNpemUKLSAgICBmaW5hbCBsb25nIE1BWF9ESUZGRVJFTkNFX1BBUlRJVElPTlMgPSAocGFydGl0aW9ucyArIGRlbGV0ZWRQYXJ0aXRpb25zICsgZGVsZXRlZFJvd3MpOwotCi0gICAgQEJlZm9yZUNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwKCkKLSAgICB7Ci0gICAgICAgIENRTFRlc3Rlci5zZXRVcENsYXNzKCk7Ci0gICAgICAgIENRTFRlc3Rlci5wcmVwYXJlU2VydmVyKCk7Ci0gICAgICAgIENRTFRlc3Rlci5kaXNhYmxlUHJlcGFyZWRSZXVzZUZvclRlc3QoKTsKLSAgICAgICAgbG9nZ2VyLmluZm8oInNldHVwQ2xhc3MgZG9uZS4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTaXplKCkKLSAgICB7Ci0gICAgICAgIFV0aWwuZmxha3lUZXN0KHRoaXM6OnRlc3RTaXplRmxha3ksIDIsICJGYWlscyBvY2Nhc2lvbmFsbHksIHNlZSBDQVNTQU5EUkEtMTY2ODQiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFNpemVGbGFreSgpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGtleXNwYWNlID0gY3JlYXRlS2V5c3BhY2UoIkNSRUFURSBLRVlTUEFDRSAlcyB3aXRoIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnIDogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3RvcicgOiAxIH0gYW5kIGR1cmFibGVfd3JpdGVzID0gZmFsc2UiKTsKLSAgICAgICAgICAgIFN0cmluZyB0YWJsZSA9IGNyZWF0ZVRhYmxlKGtleXNwYWNlLCAiQ1JFQVRFIFRBQkxFICVzICggdXNlcmlkIGJpZ2ludCwgcGljaWQgYmlnaW50LCBjb21tZW50aWQgYmlnaW50LCBQUklNQVJZIEtFWSh1c2VyaWQsIHBpY2lkKSkiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggY29tcHJlc3Npb24gPSB7J2VuYWJsZWQnOiBmYWxzZX0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFuZCBtZW10YWJsZSA9ICciICsgbWVtdGFibGVDbGFzcyArICInIik7Ci0gICAgICAgICAgICBleGVjdXRlKCJ1c2UgIiArIGtleXNwYWNlICsgJzsnKTsKLQotICAgICAgICAgICAgU3RyaW5nIHdyaXRlU3RhdGVtZW50ID0gIklOU0VSVCBJTlRPICIgKyB0YWJsZSArICIodXNlcmlkLHBpY2lkLGNvbW1lbnRpZClWQUxVRVMoPyw/LD8pIjsKLQotICAgICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gS2V5c3BhY2Uub3BlbihrZXlzcGFjZSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUodGFibGUpOwotICAgICAgICAgICAgY2ZzLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwotICAgICAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotCi0gICAgICAgICAgICBsb25nIGRlZXBTaXplQmVmb3JlID0gT2JqZWN0U2l6ZXMubWVhc3VyZURlZXAoY2ZzLmdldFRyYWNrZXIoKS5nZXRWaWV3KCkuZ2V0Q3VycmVudE1lbXRhYmxlKCkpOwotICAgICAgICAgICAgbG9nZ2VyLmluZm8oIk1lbXRhYmxlIGRlZXAgc2l6ZSBiZWZvcmUge31cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShkZWVwU2l6ZUJlZm9yZSkpOwotICAgICAgICAgICAgbG9uZyBpOwotICAgICAgICAgICAgbG9uZyBsaW1pdCA9IHBhcnRpdGlvbnM7Ci0gICAgICAgICAgICBsb2dnZXIuaW5mbygiV3JpdGluZyB7fSBwYXJ0aXRpb25zIG9mIHt9IHJvd3MiLCBwYXJ0aXRpb25zLCByb3dzUGVyUGFydGl0aW9uKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW1pdDsgKytpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAobG9uZyBqID0gMDsgaiA8IHJvd3NQZXJQYXJ0aXRpb247ICsraikKLSAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZSh3cml0ZVN0YXRlbWVudCwgaSwgaiwgaSArIGopOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsb2dnZXIuaW5mbygiRGVsZXRpbmcge30gcGFydGl0aW9ucyIsIGRlbGV0ZWRQYXJ0aXRpb25zKTsKLSAgICAgICAgICAgIGxpbWl0ICs9IGRlbGV0ZWRQYXJ0aXRpb25zOwotICAgICAgICAgICAgZm9yICg7IGkgPCBsaW1pdDsgKytpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG5vIHBhcnRpdGlvbiBleGlzdHMsIGJ1dCB3ZSB3aWxsIGNyZWF0ZSBhIHRvbWJzdG9uZQotICAgICAgICAgICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICIgKyB0YWJsZSArICIgV0hFUkUgdXNlcmlkID0gPyIsIGkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsb2dnZXIuaW5mbygiRGVsZXRpbmcge30gcm93cyIsIGRlbGV0ZWRSb3dzKTsKLSAgICAgICAgICAgIGxpbWl0ICs9IGRlbGV0ZWRSb3dzOwotICAgICAgICAgICAgZm9yICg7IGkgPCBsaW1pdDsgKytpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG5vIHJvdyBleGlzdHMsIGJ1dCB3ZSB3aWxsIGNyZWF0ZSBhIHRvbWJzdG9uZSAoYW5kIHBhcnRpdGlvbikKLSAgICAgICAgICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAiICsgdGFibGUgKyAiIFdIRVJFIHVzZXJpZCA9ID8gQU5EIHBpY2lkID0gPyIsIGksIDBMKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJXYXJuaW5nOiAiICsgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSArICIgc3N0YWJsZXMgY3JlYXRlZC4iKTsKLQotICAgICAgICAgICAgTWVtdGFibGUgbWVtdGFibGUgPSBjZnMuZ2V0VHJhY2tlcigpLmdldFZpZXcoKS5nZXRDdXJyZW50TWVtdGFibGUoKTsKLSAgICAgICAgICAgIE1lbXRhYmxlLk1lbW9yeVVzYWdlIHVzYWdlID0gTWVtdGFibGUuZ2V0TWVtb3J5VXNhZ2UobWVtdGFibGUpOwotICAgICAgICAgICAgbG9uZyBhY3R1YWxIZWFwID0gdXNhZ2Uub3duc09uSGVhcDsKLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJNZW10YWJsZSBpbiB7fSBtb2RlOiB7fSBvcHMsIHt9IHNlcmlhbGl6ZWQgYnl0ZXMsIHt9XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldE1lbXRhYmxlQWxsb2NhdGlvblR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbXRhYmxlLm9wZXJhdGlvbkNvdW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShtZW10YWJsZS5nZXRMaXZlRGF0YVNpemUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSk7Ci0KLSAgICAgICAgICAgIGxvbmcgZGVlcFNpemVBZnRlciA9IE9iamVjdFNpemVzLm1lYXN1cmVEZWVwKG1lbXRhYmxlKTsKLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJNZW10YWJsZSBkZWVwIHNpemUge31cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShkZWVwU2l6ZUFmdGVyKSk7Ci0KLSAgICAgICAgICAgIGxvbmcgZXhwZWN0ZWRIZWFwID0gZGVlcFNpemVBZnRlciAtIGRlZXBTaXplQmVmb3JlOwotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KCJFeHBlY3RlZCBoZWFwIHVzYWdlIGNsb3NlIHRvICVzLCBnb3QgJXMuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KGV4cGVjdGVkSGVhcCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoYWN0dWFsSGVhcCkpOwotICAgICAgICAgICAgbG9nZ2VyLmluZm8obWVzc2FnZSk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLCBNYXRoLmFicyhhY3R1YWxIZWFwIC0gZXhwZWN0ZWRIZWFwKSA8PSBNQVhfRElGRkVSRU5DRV9QQVJUSVRJT05TICogZGlmZmVyZW5jZVBlclBhcnRpdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0aHJvd2FibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRocm93YWJsZXMucHJvcGFnYXRlKHRocm93YWJsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvUGFnaW5nVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvUGFnaW5nVGVzdC5qYXZhCmluZGV4IGEzMzg3YzQuLjc1ZDczZTUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1BhZ2luZ1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9QYWdpbmdUZXN0LmphdmEKQEAgLTM4LDYgKzM4LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX0NPTkZJRzsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKQEAgLTU3LDcgKzU4LDcgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5jb25maWciLCAiY2Fzc2FuZHJhLW11cm11ci55YW1sIik7CisgICAgICAgIENBU1NBTkRSQV9DT05GSUcuc2V0U3RyaW5nKCJjYXNzYW5kcmEtbXVybXVyLnlhbWwiKTsKIAogICAgICAgICBjYXNzYW5kcmEgPSBTZXJ2ZXJUZXN0VXRpbHMuc3RhcnRFbWJlZGRlZENhc3NhbmRyYVNlcnZpY2UoKTsKIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvUXVlcnlXaXRoSW5kZXhlZFNTVGFibGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9RdWVyeVdpdGhJbmRleGVkU1NUYWJsZVRlc3QuamF2YQppbmRleCAwMWEyYWZkLi42MzU2MmI3IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9RdWVyeVdpdGhJbmRleGVkU1NUYWJsZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9RdWVyeVdpdGhJbmRleGVkU1NUYWJsZVRlc3QuamF2YQpAQCAtMTcsMTMgKzE3LDE0IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMzsKIAotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci0KIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd0luZGV4RW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUGFydGl0aW9uUG9zaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFJvd0luZGV4RW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5Gb3J3YXJkaW5nU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogCkBAIC01OSw3ICs2MCwyMSBAQAogICAgICAgICBib29sZWFuIGhhc0luZGV4ZWQgPSBmYWxzZTsKICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5nZXRMaXZlU1NUYWJsZXMoKSkKICAgICAgICAgewotICAgICAgICAgICAgUm93SW5kZXhFbnRyeSBpbmRleEVudHJ5ID0gc3N0YWJsZS5nZXRQb3NpdGlvbihkaywgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgICAgICBjbGFzcyBJbmRleEVudHJ5QWNjZXNzb3IgZXh0ZW5kcyBGb3J3YXJkaW5nU1NUYWJsZVJlYWRlcgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHB1YmxpYyBJbmRleEVudHJ5QWNjZXNzb3IoU1NUYWJsZVJlYWRlciBkZWxlZ2F0ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyKGRlbGVnYXRlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgQWJzdHJhY3RSb3dJbmRleEVudHJ5IGdldFJvd0luZGV4RW50cnkoUGFydGl0aW9uUG9zaXRpb24ga2V5LCBPcGVyYXRvciBvcCwgYm9vbGVhbiB1cGRhdGVDYWNoZUFuZFN0YXRzLCBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRSb3dJbmRleEVudHJ5KGtleSwgb3AsIHVwZGF0ZUNhY2hlQW5kU3RhdHMsIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEluZGV4RW50cnlBY2Nlc3NvciBhY2Nlc3NvciA9IG5ldyBJbmRleEVudHJ5QWNjZXNzb3Ioc3N0YWJsZSk7CisgICAgICAgICAgICBBYnN0cmFjdFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSA9IGFjY2Vzc29yLmdldFJvd0luZGV4RW50cnkoZGssIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEsIGZhbHNlLCBTU1RhYmxlUmVhZHNMaXN0ZW5lci5OT09QX0xJU1RFTkVSKTsKICAgICAgICAgICAgIGhhc0luZGV4ZWQgfD0gaW5kZXhFbnRyeSAhPSBudWxsICYmIGluZGV4RW50cnkuaXNJbmRleGVkKCk7CiAgICAgICAgIH0KICAgICAgICAgYXNzZXJ0IGhhc0luZGV4ZWQ7CkBAIC03MCwxNSArODUsNCBAQAogICAgICAgICBhc3NlcnRSb3dDb3VudChleGVjdXRlKCJTRUxFQ1QgRElTVElOQ1QgcyBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIDEpOwogICAgICAgICBhc3NlcnRSb3dDb3VudChleGVjdXRlKCJTRUxFQ1QgRElTVElOQ1QgcyBGUk9NICVzIFdIRVJFIGsgPSA/IE9SREVSIEJZIHQgREVTQyIsIDApLCAxKTsKICAgICB9Ci0KLSAgICAvLyBDcmVhdGVzIGEgcmFuZG9tIHN0cmluZyAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlUmFuZG9tU3QoaW50IGxlbmd0aCkKLSAgICB7Ci0gICAgICAgIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7Ci0gICAgICAgIGNoYXJbXSBjaGFycyA9IG5ldyBjaGFyWzI2XTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBmb3IgKGNoYXIgYyA9ICdhJzsgYyA8PSAneic7IGMrKykKLSAgICAgICAgICAgIGNoYXJzW2krK10gPSBjOwotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhjaGFycyk7Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVG9tYnN0b25lc1dpdGhJbmRleGVkU1NUYWJsZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1RvbWJzdG9uZXNXaXRoSW5kZXhlZFNTVGFibGVUZXN0LmphdmEKaW5kZXggZjlhYzhkMS4uMWQ4ODhmZiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVG9tYnN0b25lc1dpdGhJbmRleGVkU1NUYWJsZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9Ub21ic3RvbmVzV2l0aEluZGV4ZWRTU1RhYmxlVGVzdC5qYXZhCkBAIC0xOSwxMyArMTksMTggQEAKIAogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CiAKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdQcmVmaXg7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlRGF0YUlucHV0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5Sb3dJbmRleEVudHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aS5CdGlGb3JtYXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiAKIHB1YmxpYyBjbGFzcyBUb21ic3RvbmVzV2l0aEluZGV4ZWRTU1RhYmxlVGVzdCBleHRlbmRzIENRTFRlc3RlcgpAQCAtNDQsNiArNDksNyBAQAogCiAgICAgcHVibGljIHZvaWQgdGVzdFRvbWJzdG9uZUJvdW5kYXJpZXNJbkluZGV4KFN0cmluZyBjYWNoZUtleXMpIHRocm93cyBUaHJvd2FibGUKICAgICB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJUaGlzIHRlc3QgcmVxdWlyZXMgdGhhdCB0aGUgZGVmYXVsdCBTU1RhYmxlIGZvcm1hdCBpcyBCSUciLCBCaWdGb3JtYXQuaXNTZWxlY3RlZCgpKTsKICAgICAgICAgLy8gVGhhdCB0ZXN0IHJlcHJvZHVjZXMgdGhlIGJ1ZyBmcm9tIENBU1NBTkRSQS0xMTE1OCB3aGVyZSBhIHJhbmdlIHRvbWJzdG9uZSBib3VuZGFyeSBpbiB0aGUgY29sdW1uIGluZGV4IHdvdWxkCiAgICAgICAgIC8vIGNhdXNlIGFuIGFzc2VydGlvbiBmYWlsdXJlLgogCkBAIC03NCwxOSArODAsMTYgQEAKICAgICAgICAgICAgIGludCBpbmRleGVkUm93ID0gLTE7CiAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLmdldExpdmVTU1RhYmxlcygpKQogICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJpZ1RhYmxlUmVhZGVyIHJlYWRlciA9IChCaWdUYWJsZVJlYWRlcikgc3N0YWJsZTsKICAgICAgICAgICAgICAgICAvLyBUaGUgbGluZSBiZWxvdyBmYWlsZWQgd2l0aCBrZXkgY2FjaGluZyBvZmYgKENBU1NBTkRSQS0xMTE1OCkKLSAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgICAgICBSb3dJbmRleEVudHJ5IGluZGV4RW50cnkgPSBzc3RhYmxlLmdldFBvc2l0aW9uKGRrLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKTsKKyAgICAgICAgICAgICAgICBSb3dJbmRleEVudHJ5IGluZGV4RW50cnkgPSByZWFkZXIuZ2V0Um93SW5kZXhFbnRyeShkaywgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CiAgICAgICAgICAgICAgICAgaWYgKGluZGV4RW50cnkgIT0gbnVsbCAmJiBpbmRleEVudHJ5LmlzSW5kZXhlZCgpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IChGaWxlRGF0YUlucHV0IHJlYWRlciA9IHNzdGFibGUub3BlbkluZGV4UmVhZGVyKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJvd0luZGV4RW50cnkuSW5kZXhJbmZvUmV0cmlldmVyIGluZm9SZXRyaWV2ZXIgPSBpbmRleEVudHJ5Lm9wZW5XaXRoSW5kZXgoc3N0YWJsZS5nZXRJbmRleEZpbGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbHVzdGVyaW5nUHJlZml4PD8+IGZpcnN0TmFtZSA9IGluZm9SZXRyaWV2ZXIuY29sdW1uc0luZGV4KDEpLmZpcnN0TmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdE5hbWUua2luZCgpLmlzQm91bmRhcnkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBkZWxldGlvbkxvb3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleGVkUm93ID0gSW50MzJUeXBlLmluc3RhbmNlLmNvbXBvc2UoZmlyc3ROYW1lLmJ1ZmZlckF0KDApKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBSb3dJbmRleEVudHJ5LkluZGV4SW5mb1JldHJpZXZlciBpbmZvUmV0cmlldmVyID0gaW5kZXhFbnRyeS5vcGVuV2l0aEluZGV4KHJlYWRlci5nZXRJbmRleEZpbGUoKSk7CisgICAgICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Pz4gZmlyc3ROYW1lID0gaW5mb1JldHJpZXZlci5jb2x1bW5zSW5kZXgoMSkuZmlyc3ROYW1lOworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3ROYW1lLmtpbmQoKS5pc0JvdW5kYXJ5KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBkZWxldGlvbkxvb3A7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ZWRSb3cgPSBJbnQzMlR5cGUuaW5zdGFuY2UuY29tcG9zZShmaXJzdE5hbWUuYnVmZmVyQXQoMCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGFzc2VydCBpbmRleGVkUm93ID49IDA7CkBAIC0xMDgsNiArMTExLDc4IEBACiAgICAgICAgIGFzc2VydFJvd0NvdW50KGV4ZWN1dGUoIlNFTEVDVCBESVNUSU5DVCBzIEZST00gJXMgV0hFUkUgayA9ID8gT1JERVIgQlkgdCBERVNDIiwgMCksIDEpOwogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjdGl2ZVRvbWJzdG9uZUluSW5kZXhDYWNoZWQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBBc3N1bWUuYXNzdW1lRmFsc2UoIkJUSSBmb3JtYXQgZG9lcyBub3QgdXNlIGtleSBjYWNoZSIsIEJ0aUZvcm1hdC5pc1NlbGVjdGVkKCkpOworICAgICAgICB0ZXN0QWN0aXZlVG9tYnN0b25lSW5JbmRleCgiQUxMIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aXZlVG9tYnN0b25lSW5JbmRleE5vdENhY2hlZCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRlc3RBY3RpdmVUb21ic3RvbmVJbkluZGV4KCJOT05FIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFjdGl2ZVRvbWJzdG9uZUluSW5kZXgoU3RyaW5nIGNhY2hlS2V5cykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgaW50IFJPV1MgPSAxMDAwOworICAgICAgICBpbnQgVkFMVUVfTEVOR1RIID0gMTAwOworCisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50LCB0IGludCwgdjEgdGV4dCwgdjIgdGV4dCwgdjMgdGV4dCwgdjQgdGV4dCwgUFJJTUFSWSBLRVkgKGssIHQpKSBXSVRIIGNhY2hpbmcgPSB7ICdrZXlzJyA6ICciICsgY2FjaGVLZXlzICsgIicgfSIpOworICAgICAgICBTdHJpbmcgdGV4dCA9IG1ha2VSYW5kb21TdHJpbmcoVkFMVUVfTEVOR1RIKTsKKworICAgICAgICAvLyBXcml0ZSBhIGxhcmdlLWVub3VnaCBwYXJ0aXRpb24gdG8gYmUgaW5kZXhlZC4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBST1dTOyBpKyspCisgICAgICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyhrLCB0LCB2MSkgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMSIsIDAsIGksIHRleHQpOworICAgICAgICAvLyBBZGQgdjIgdGhhdCBzaG91bGQgc3Vydml2ZSBwYXJ0IG9mIHRoZSBkZWxldGlvbiB3ZSBsYXRlciBpbnNlcnQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBST1dTOyBpKyspCisgICAgICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyhrLCB0LCB2MikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMyIsIDAsIGksIHRleHQpOworICAgICAgICBmbHVzaCgpOworCisgICAgICAgIC8vIE5vdyBkZWxldGUgcGFydHMgb2YgdGhpcyBwYXJ0aXRpb24sIGJ1dCBhZGQgZW5vdWdoIG5ldyBkYXRhIHRvIG1ha2Ugc3VyZSB0aGUgZGVsZXRpb24gc3BhbnMgaW5kZXggYmxvY2tzCisgICAgICAgIGludCBtaW5EZWxldGVkMSA9IFJPV1MvMTA7CisgICAgICAgIGludCBtYXhEZWxldGVkMSA9IDUgKiBST1dTLzEwOworICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBVU0lORyBUSU1FU1RBTVAgMiBXSEVSRSBrID0gMCBBTkQgdCA+PSA/IEFORCB0IDwgPyIsIG1pbkRlbGV0ZWQxLCBtYXhEZWxldGVkMSk7CisKKyAgICAgICAgLy8gRGVsZXRlIGFnYWluIHRvIG1ha2UgYSBib3VuZGFyeQorICAgICAgICBpbnQgbWluRGVsZXRlZDIgPSA0ICogUk9XUy8xMDsKKyAgICAgICAgaW50IG1heERlbGV0ZWQyID0gOSAqIFJPV1MvMTA7CisgICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICVzIFVTSU5HIFRJTUVTVEFNUCA0IFdIRVJFIGsgPSAwIEFORCB0ID49ID8gQU5EIHQgPCA/IiwgbWluRGVsZXRlZDIsIG1heERlbGV0ZWQyKTsKKworICAgICAgICAvLyBBZGQgdjMgc3Vydml2aW5nIHRoYXQgZGVsZXRpb24gdG9vIGFuZCBhbHNvIGVuc3VyaW5nIHRoZSB0d28gZGVsZXRpb25zIHNwYW4gaW5kZXggYmxvY2tzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUk9XUzsgaSsrKQorICAgICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMoaywgdCwgdjMpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDUiLCAwLCBpLCB0ZXh0KTsKKyAgICAgICAgZmx1c2goKTsKKworICAgICAgICAvLyB0ZXN0IGRlbGV0aW9ucyB3b3JrZWQKKyAgICAgICAgdmVyaWZ5RXhwZWN0ZWRBY3RpdmVUb21ic3RvbmVSb3dzKFJPV1MsIHRleHQsIG1pbkRlbGV0ZWQxLCBtaW5EZWxldGVkMiwgbWF4RGVsZXRlZDIpOworCisgICAgICAgIC8vIFRlc3QgYWdhaW4gY29tcGFjdGVkLiBUaGlzIGlzIG11Y2ggZWFzaWVyIHRvIHBhc3MgYW5kIGRvZXNuJ3QgYWN0dWFsbHkgdGVzdCBhY3RpdmUgdG9tYnN0b25lcyBpbiBpbmRleAorICAgICAgICBjb21wYWN0KCk7CisgICAgICAgIHZlcmlmeUV4cGVjdGVkQWN0aXZlVG9tYnN0b25lUm93cyhST1dTLCB0ZXh0LCBtaW5EZWxldGVkMSwgbWluRGVsZXRlZDIsIG1heERlbGV0ZWQyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5RXhwZWN0ZWRBY3RpdmVUb21ic3RvbmVSb3dzKGludCBST1dTLCBTdHJpbmcgdGV4dCwgaW50IG1pbkRlbGV0ZWQxLCBpbnQgbWluRGVsZXRlZDIsIGludCBtYXhEZWxldGVkMikgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0Um93Q291bnQoZXhlY3V0ZSgiU0VMRUNUIHQgRlJPTSAlcyBXSEVSRSBrID0gPyBBTkQgdjEgPSA/IEFMTE9XIEZJTFRFUklORyIsIDAsIHRleHQpLCBST1dTIC0gKG1heERlbGV0ZWQyIC0gbWluRGVsZXRlZDEpKTsKKyAgICAgICAgYXNzZXJ0Um93Q291bnQoZXhlY3V0ZSgiU0VMRUNUIHQgRlJPTSAlcyBXSEVSRSBrID0gPyBBTkQgdjEgPSA/IE9SREVSIEJZIHQgREVTQyBBTExPVyBGSUxURVJJTkciLCAwLCB0ZXh0KSwgUk9XUyAtIChtYXhEZWxldGVkMiAtIG1pbkRlbGV0ZWQxKSk7CisgICAgICAgIGFzc2VydFJvd0NvdW50KGV4ZWN1dGUoIlNFTEVDVCB0IEZST00gJXMgV0hFUkUgayA9ID8gQU5EIHYyID0gPyBBTExPVyBGSUxURVJJTkciLCAwLCB0ZXh0KSwgUk9XUyAtIChtYXhEZWxldGVkMiAtIG1pbkRlbGV0ZWQyKSk7CisgICAgICAgIGFzc2VydFJvd0NvdW50KGV4ZWN1dGUoIlNFTEVDVCB0IEZST00gJXMgV0hFUkUgayA9ID8gQU5EIHYyID0gPyBPUkRFUiBCWSB0IERFU0MgQUxMT1cgRklMVEVSSU5HIiwgMCwgdGV4dCksIFJPV1MgLSAobWF4RGVsZXRlZDIgLSBtaW5EZWxldGVkMikpOworICAgICAgICBhc3NlcnRSb3dDb3VudChleGVjdXRlKCJTRUxFQ1QgdCBGUk9NICVzIFdIRVJFIGsgPSA/IEFORCB2MyA9ID8gQUxMT1cgRklMVEVSSU5HIiwgMCwgdGV4dCksIFJPV1MpOworICAgICAgICBhc3NlcnRSb3dDb3VudChleGVjdXRlKCJTRUxFQ1QgdCBGUk9NICVzIFdIRVJFIGsgPSA/IEFORCB2MyA9ID8gT1JERVIgQlkgdCBERVNDIEFMTE9XIEZJTFRFUklORyIsIDAsIHRleHQpLCBST1dTKTsKKyAgICAgICAgLy8gdGVzdCBpbmRleCB5aWVsZHMgdGhlIGNvcnJlY3QgYWN0aXZlIGRlbGV0aW9ucworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFJPV1M7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHYxRXhwZWN0ZWQgPSBpIDwgbWluRGVsZXRlZDEgfHwgaSA+PSBtYXhEZWxldGVkMiA/IHRleHQgOiBudWxsOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHYyRXhwZWN0ZWQgPSBpIDwgbWluRGVsZXRlZDIgfHwgaSA+PSBtYXhEZWxldGVkMiA/IHRleHQgOiBudWxsOworICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgdjEsdjIsdjMgRlJPTSAlcyBXSEVSRSBrID0gPyBBTkQgdCA+PSA/IExJTUlUIDEiLCAwLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcm93KHYxRXhwZWN0ZWQsIHYyRXhwZWN0ZWQsIHRleHQpKTsKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHYxLHYyLHYzIEZST00gJXMgV0hFUkUgayA9ID8gQU5EIHQgPD0gPyBPUkRFUiBCWSB0IERFU0MgTElNSVQgMSIsIDAsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICByb3codjFFeHBlY3RlZCwgdjJFeHBlY3RlZCwgdGV4dCkpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZVJhbmRvbVN0cmluZyhpbnQgbGVuZ3RoKQogICAgIHsKICAgICAgICAgUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1ZpZXdGaWx0ZXJpbmcxVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVmlld0ZpbHRlcmluZzFUZXN0LmphdmEKaW5kZXggNDdkNWI4ZS4uOTNiMDkyNCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVmlld0ZpbHRlcmluZzFUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVmlld0ZpbHRlcmluZzFUZXN0LmphdmEKQEAgLTMxLDYgKzMxLDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTVZfQUxMT1dfRklMVEVSSU5HX05PTktFWV9DT0xVTU5TX1VOU0FGRTsKKwogLyogVmlld0ZpbHRlcmluZ1Rlc3QgY2xhc3MgaGFzIGJlZW4gc3BsaXQgaW50byBtdWx0aXBsZSBvbmVzIGJlY2F1c2Ugb2YgdGltZW91dCBpc3N1ZXMgKENBU1NBTkRSQS0xNjY3MCwgQ0FTU0FORFJBLTE3MTY3KQogICogQW55IGNoYW5nZXMgaGVyZSBjaGVjayBpZiB0aGV5IGFwcGx5IHRvIHRoZSBvdGhlciBjbGFzc2VzCiAgKiAtIFZpZXdGaWx0ZXJpbmdQS1Rlc3QKQEAgLTQ2LDEzICs0OCwxMyBAQAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydHVwKCkKICAgICB7CiAgICAgICAgIFZpZXdBYnN0cmFjdFBhcmFtZXRlcml6ZWRUZXN0LnN0YXJ0dXAoKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEubXYuYWxsb3dfZmlsdGVyaW5nX25vbmtleV9jb2x1bW5zX3Vuc2FmZSIsICJ0cnVlIik7CisgICAgICAgIE1WX0FMTE9XX0ZJTFRFUklOR19OT05LRVlfQ09MVU1OU19VTlNBRkUuc2V0Qm9vbGVhbih0cnVlKTsKICAgICB9CiAKICAgICBAQWZ0ZXJDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyRG93bigpCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5tdi5hbGxvd19maWx0ZXJpbmdfbm9ua2V5X2NvbHVtbnNfdW5zYWZlIiwgImZhbHNlIik7CisgICAgICAgIE1WX0FMTE9XX0ZJTFRFUklOR19OT05LRVlfQ09MVU1OU19VTlNBRkUuc2V0Qm9vbGVhbihmYWxzZSk7CiAgICAgfQogCiAgICAgLy8gVE9ETyB3aWxsIHJldmlzZSB0aGUgbm9uLXBrIGZpbHRlciBjb25kaXRpb24gaW4gTVYsIHNlZSBDQVNTQU5EUkEtMTE1MDAKQEAgLTM2Myw3ICszNjUsNyBAQAogICAgICAgICAiQ1JFQVRFIE1BVEVSSUFMSVpFRCBWSUVXICVzIEFTIFNFTEVDVCAqIEZST00gJXMgV0hFUkUgYSBJUyBOT1QgTlVMTCBBTkQgYiBJUyBOT1QgTlVMTCBBTkQgZCBpcyBOT1QgTlVMTCBQUklNQVJZIEtFWSAoKGEsIGIpLCBjLCBkKSIsCiAgICAgICAgICJDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgJXMgQVMgU0VMRUNUICogRlJPTSAlcyBXSEVSRSBhIElTIE5PVCBOVUxMIEFORCBiIElTIE5PVCBOVUxMIEFORCBjIGlzIE5PVCBOVUxMIFBSSU1BUlkgS0VZICgoYSwgYiksIGMsIGQpIiwKICAgICAgICAgIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGEgPSA/IEFORCBiIElTIE5PVCBOVUxMIEFORCBjIGlzIE5PVCBOVUxMIFBSSU1BUlkgS0VZICgoYSwgYiksIGMsIGQpIiwKLSAgICAgICAgIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGEgPSBibG9iQXNJbnQoPykgQU5EIGIgSVMgTk9UIE5VTEwgQU5EIGMgaXMgTk9UIE5VTEwgUFJJTUFSWSBLRVkgKChhLCBiKSwgYywgZCkiLAorICAgICAgICAiQ1JFQVRFIE1BVEVSSUFMSVpFRCBWSUVXICVzIEFTIFNFTEVDVCAqIEZST00gJXMgV0hFUkUgYSA9IGJsb2JfYXNfaW50KD8pIEFORCBiIElTIE5PVCBOVUxMIEFORCBjIGlzIE5PVCBOVUxMIFBSSU1BUlkgS0VZICgoYSwgYiksIGMsIGQpIiwKICAgICAgICAgIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgKiBGUk9NICVzIFBSSU1BUlkgS0VZIChhLCBiLCBjLCBkKSIKICAgICAgICAgKTsKIApAQCAtMzkxLDcgKzM5Myw3IEBACiAgICAgICAgICJDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgJXMgQVMgU0VMRUNUICogRlJPTSAlcyBXSEVSRSBhID0gMSBBTkQgYiA9IDEgQU5EIChjLCBkKSA+ICgxLCAxKSBQUklNQVJZIEtFWSAoKGEsIGIpLCBjLCBkKSIsCiAgICAgICAgICJDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgJXMgQVMgU0VMRUNUICogRlJPTSAlcyBXSEVSRSBhID0gMSBBTkQgYiA9IDEgQU5EIChjLCBkKSBJTiAoKDEsIDEpLCAoMiwgMikpIFBSSU1BUlkgS0VZICgoYSwgYiksIGMsIGQpIiwKICAgICAgICAgIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGEgPSAoaW50KSAxIEFORCBiID0gMSBBTkQgYyA9IDEgQU5EIGQgPSAxIFBSSU1BUlkgS0VZICgoYSwgYiksIGMsIGQpIiwKLSAgICAgICAgIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGEgPSBibG9iQXNJbnQoaW50QXNCbG9iKDEpKSBBTkQgYiA9IDEgQU5EIGMgPSAxIEFORCBkID0gMSBQUklNQVJZIEtFWSAoKGEsIGIpLCBjLCBkKSIKKyAgICAgICAgIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGEgPSBibG9iX2FzX2ludChpbnRfYXNfYmxvYigxKSkgQU5EIGIgPSAxIEFORCBjID0gMSBBTkQgZCA9IDEgUFJJTUFSWSBLRVkgKChhLCBiKSwgYywgZCkiCiAgICAgICAgICk7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnb29kU3RhdGVtZW50cy5zaXplKCk7IGkrKykKQEAgLTQ2Miw3ICs0NjQsNyBAQAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYiwgYykgVkFMVUVTICg/LCA/LCA/KSIsIDEsIDEsIDMpOwogCiAgICAgICAgIGNyZWF0ZVZpZXcoIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgKiBGUk9NICVzICIgKwotICAgICAgICAgICAgICAgICAgICJXSEVSRSBhID0gYmxvYkFzSW50KGludEFzQmxvYigxKSkgQU5EIGIgSVMgTk9UIE5VTEwgIiArCisgICAgICAgICAgICAgICAgICAgIldIRVJFIGEgPSBibG9iX2FzX2ludChpbnRfYXNfYmxvYigxKSkgQU5EIGIgSVMgTk9UIE5VTEwgIiArCiAgICAgICAgICAgICAgICAgICAgIlBSSU1BUlkgS0VZIChhLCBiKSIpOwogCiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZVZpZXcoIlNFTEVDVCBhLCBiLCBjIEZST00gJXMiKSwKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1ZpZXdQS1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1ZpZXdQS1Rlc3QuamF2YQppbmRleCA2YWIyN2VmLi4xYzJiOWE2IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9WaWV3UEtUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVmlld1BLVGVzdC5qYXZhCkBAIC0yNTMsOCArMjUzLDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBhc2NpaXZhbCwgYmlnaW50dmFsKSBWQUxVRVMgKD8sID8sIGZyb21Kc29uKD8pKSIsIDAsICJhc2NpaSB0ZXh0IiwgIjEyMzEyMzEyMzEyMyIpOwotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgYXNjaWl2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiYXNjaWkgdGV4dFwiIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBhc2NpaXZhbCwgYmlnaW50dmFsKSBWQUxVRVMgKD8sID8sIGZyb21fanNvbig/KSkiLCAwLCAiYXNjaWkgdGV4dCIsICIxMjMxMjMxMjMxMjMiKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGFzY2lpdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCJhc2NpaSB0ZXh0XCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYmlnaW50dmFsIEZST00gJXMgV0hFUkUgayA9ID8gYW5kIGFzY2lpdmFsID0gPyIsIDAsICJhc2NpaSB0ZXh0IiksIHJvdygxMjMxMjMxMjMxMjNMKSk7CiAKICAgICAgICAgLy9DaGVjayB0aGUgTVYKQEAgLTI2NSw3ICsyNjUsNyBAQAogCiAKICAgICAgICAgLy9VUERBVEUgQkFTRQotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgYXNjaWl2YWwsIGJpZ2ludHZhbCkgVkFMVUVTICg/LCA/LCBmcm9tSnNvbig/KSkiLCAwLCAiYXNjaWkgdGV4dCIsICIxIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBhc2NpaXZhbCwgYmlnaW50dmFsKSBWQUxVRVMgKD8sID8sIGZyb21fanNvbig/KSkiLCAwLCAiYXNjaWkgdGV4dCIsICIxIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGJpZ2ludHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IGFuZCBhc2NpaXZhbCA9ID8iLCAwLCAiYXNjaWkgdGV4dCIpLCByb3coMUwpKTsKIAogICAgICAgICAvL0NoZWNrIHRoZSBNVgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVmlld1NjaGVtYVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1ZpZXdTY2hlbWFUZXN0LmphdmEKaW5kZXggMDlkN2UxNS4uYjU4Nzc3ZSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVmlld1NjaGVtYVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9WaWV3U2NoZW1hVGVzdC5qYXZhCkBAIC0yNTQsMzEzICsyNTQsMzEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLyBmcm9tSnNvbigpIGNhbiBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgcmVjZWl2ZXIgdHlwZSBpcyBrbm93bgotICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiZnJvbUpzb24oKSBjYW5ub3QgYmUgdXNlZCBpbiB0aGUgc2VsZWN0aW9uIGNsYXVzZSIsICJTRUxFQ1QgZnJvbUpzb24oYXNjaWl2YWwpIEZST00gJXMiLCAwLCAwKTsKKyAgICAgICAgLy8gZnJvbV9qc29uKCkgY2FuIG9ubHkgYmUgdXNlZCB3aGVuIHRoZSByZWNlaXZlciB0eXBlIGlzIGtub3duCisgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJmcm9tX2pzb24oKSBjYW5ub3QgYmUgdXNlZCBpbiB0aGUgc2VsZWN0aW9uIGNsYXVzZSIsICJTRUxFQ1QgZnJvbV9qc29uKGFzY2lpdmFsKSBGUk9NICVzIiwgMCwgMCk7CiAKICAgICAgICAgU3RyaW5nIGZ1bmMxID0gY3JlYXRlRnVuY3Rpb24oS0VZU1BBQ0UsICJpbnQiLCAiQ1JFQVRFIEZVTkNUSU9OICVzIChhIGludCkgQ0FMTEVEIE9OIE5VTEwgSU5QVVQgUkVUVVJOUyB0ZXh0IExBTkdVQUdFIGphdmEgQVMgJCQgcmV0dXJuIGEudG9TdHJpbmcoKTsgJCQiKTsKICAgICAgICAgY3JlYXRlRnVuY3Rpb25PdmVybG9hZChmdW5jMSwgImludCIsICJDUkVBVEUgRlVOQ1RJT04gJXMgKGEgdGV4dCkgQ0FMTEVEIE9OIE5VTEwgSU5QVVQgUkVUVVJOUyB0ZXh0IExBTkdVQUdFIGphdmEgQVMgJCQgcmV0dXJuIG5ldyBTdHJpbmcoYSk7ICQkIik7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBhc2NpaSA9PT09PT09PT09PT09PT09Ci0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBhc2NpaXZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCJhc2NpaSB0ZXh0XCIiKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGFzY2lpdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCJhc2NpaSB0ZXh0XCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgImFzY2lpIHRleHQiKSk7CiAKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGFzY2lpdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcImFzY2lpIFxcXCIgdGV4dFwiIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBhc2NpaXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiYXNjaWkgXFxcIiB0ZXh0XCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgImFzY2lpIFwiIHRleHQiKSk7CiAKLSAgICAgICAgLy8gdGVzdCB0aGF0IHdlIGNhbiB1c2UgZnJvbUpzb24oKSBpbiBvdGhlciB2YWxpZCBwbGFjZXMgaW4gcXVlcmllcwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBhc2NpaXZhbCBGUk9NICVzIFdIRVJFIGsgPSBmcm9tSnNvbig/KSIsICIwIiksIHJvdygiYXNjaWkgXCIgdGV4dCIpKTsKKyAgICAgICAgLy8gdGVzdCB0aGF0IHdlIGNhbiB1c2UgZnJvbV9qc29uKCkgaW4gb3RoZXIgdmFsaWQgcGxhY2VzIGluIHF1ZXJpZXMKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYXNjaWl2YWwgRlJPTSAlcyBXSEVSRSBrID0gZnJvbV9qc29uKD8pIiwgIjAiKSwgcm93KCJhc2NpaSBcIiB0ZXh0IikpOwogCiAgICAgICAgIC8vQ2hlY2sgdGhlIE1WCiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHVkdHZhbCBmcm9tIG12X2FzY2lpdmFsIFdIRVJFIGFzY2lpdmFsID0gPyIsICJhc2NpaSB0ZXh0IikpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB1ZHR2YWwgZnJvbSBtdl9hc2NpaXZhbCBXSEVSRSBhc2NpaXZhbCA9ID8iLCAiYXNjaWkgXCIgdGV4dCIpLCByb3coMCwgbnVsbCkpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIlVQREFURSAlcyBTRVQgYXNjaWl2YWwgPSBmcm9tSnNvbig/KSBXSEVSRSBrID0gZnJvbUpzb24oPykiLCAiXCJhc2NpaSBcXFwiIHRleHRcIiIsICIwIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIlVQREFURSAlcyBTRVQgYXNjaWl2YWwgPSBmcm9tX2pzb24oPykgV0hFUkUgayA9IGZyb21fanNvbig/KSIsICJcImFzY2lpIFxcXCIgdGV4dFwiIiwgIjAiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdWR0dmFsIGZyb20gbXZfYXNjaWl2YWwgV0hFUkUgYXNjaWl2YWwgPSA/IiwgImFzY2lpIFwiIHRleHQiKSwgcm93KDAsIG51bGwpKTsKIAotICAgICAgICB1cGRhdGVWaWV3KCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrID0gZnJvbUpzb24oPykiLCAiMCIpOworICAgICAgICB1cGRhdGVWaWV3KCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrID0gZnJvbV9qc29uKD8pIiwgIjAiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdWR0dmFsIGZyb20gbXZfYXNjaWl2YWwgV0hFUkUgYXNjaWl2YWwgPSA/IiwgImFzY2lpIFwiIHRleHQiKSk7CiAKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGFzY2lpdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcImFzY2lpIHRleHRcIiIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgYXNjaWl2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcImFzY2lpIHRleHRcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB1ZHR2YWwgZnJvbSBtdl9hc2NpaXZhbCBXSEVSRSBhc2NpaXZhbCA9ID8iLCAiYXNjaWkgdGV4dCIpLCByb3coMCwgbnVsbCkpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gYmlnaW50ID09PT09PT09PT09PT09PT0KLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGJpZ2ludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzMTIzMTIzMTIzIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBiaWdpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMxMjMxMjMxMjMiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYmlnaW50dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIDEyMzEyMzEyMzEyM0wpKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl9iaWdpbnR2YWwgV0hFUkUgYmlnaW50dmFsID0gPyIsIDEyMzEyMzEyMzEyM0wpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBibG9iID09PT09PT09PT09PT09PT0KLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGJsb2J2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiMHgwMDAwMDAwMVwiIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBibG9idmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCIweDAwMDAwMDAxXCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYmxvYnZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBCeXRlQnVmZmVyVXRpbC5ieXRlcygxKSkpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2Jsb2J2YWwgV0hFUkUgYmxvYnZhbCA9ID8iLCBCeXRlQnVmZmVyVXRpbC5ieXRlcygxKSksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IGJvb2xlYW4gPT09PT09PT09PT09PT09PQotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgYm9vbGVhbnZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAidHJ1ZSIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgYm9vbGVhbnZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgInRydWUiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYm9vbGVhbnZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCB0cnVlKSk7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfYm9vbGVhbnZhbCBXSEVSRSBib29sZWFudmFsID0gPyIsIHRydWUpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CiAKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGJvb2xlYW52YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgImZhbHNlIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBib29sZWFudmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiZmFsc2UiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYm9vbGVhbnZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBmYWxzZSkpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2Jvb2xlYW52YWwgV0hFUkUgYm9vbGVhbnZhbCA9ID8iLCB0cnVlKSk7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfYm9vbGVhbnZhbCBXSEVSRSBib29sZWFudmFsID0gPyIsIGZhbHNlKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gZGF0ZSA9PT09PT09PT09PT09PT09Ci0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBkYXRldmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjE5ODctMDMtMjNcIiIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZGF0ZXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiMTk4Ny0wMy0yM1wiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGRhdGV2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgU2ltcGxlRGF0ZVNlcmlhbGl6ZXIuZGF0ZVN0cmluZ1RvRGF5cygiMTk4Ny0wMy0yMyIpKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfZGF0ZXZhbCBXSEVSRSBkYXRldmFsID0gZnJvbUpzb24oPykiLCAiXCIxOTg3LTAzLTIzXCIiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2RhdGV2YWwgV0hFUkUgZGF0ZXZhbCA9IGZyb21fanNvbig/KSIsICJcIjE5ODctMDMtMjNcIiIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBkZWNpbWFsID09PT09PT09PT09PT09PT0KLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGRlY2ltYWx2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIjEyMzEyMy4xMjMxMjMiKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGRlY2ltYWx2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMxMjMuMTIzMTIzIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGRlY2ltYWx2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbmV3IEJpZ0RlY2ltYWwoIjEyMzEyMy4xMjMxMjMiKSkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2RlY2ltYWx2YWwgV0hFUkUgZGVjaW1hbHZhbCA9IGZyb21Kc29uKD8pIiwgIjEyMzEyMy4xMjMxMjMiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2RlY2ltYWx2YWwgV0hFUkUgZGVjaW1hbHZhbCA9IGZyb21fanNvbig/KSIsICIxMjMxMjMuMTIzMTIzIiksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKIAotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZGVjaW1hbHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzMTIzIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBkZWNpbWFsdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzMTIzIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGRlY2ltYWx2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbmV3IEJpZ0RlY2ltYWwoIjEyMzEyMyIpKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfZGVjaW1hbHZhbCBXSEVSRSBkZWNpbWFsdmFsID0gZnJvbUpzb24oPykiLCAiMTIzMTIzLjEyMzEyMyIpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl9kZWNpbWFsdmFsIFdIRVJFIGRlY2ltYWx2YWwgPSBmcm9tSnNvbig/KSIsICIxMjMxMjMiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2RlY2ltYWx2YWwgV0hFUkUgZGVjaW1hbHZhbCA9IGZyb21fanNvbig/KSIsICIxMjMxMjMuMTIzMTIzIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2RlY2ltYWx2YWwgV0hFUkUgZGVjaW1hbHZhbCA9IGZyb21fanNvbig/KSIsICIxMjMxMjMiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOwogCiAgICAgICAgIC8vIGFjY2VwdCBzdHJpbmdzIGZvciBudW1iZXJzIHRoYXQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGFzIGRvdWJsZXMKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGRlY2ltYWx2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiMTIzMTIzLjEyMzEyM1wiIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBkZWNpbWFsdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCIxMjMxMjMuMTIzMTIzXCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZGVjaW1hbHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBuZXcgQmlnRGVjaW1hbCgiMTIzMTIzLjEyMzEyMyIpKSk7CiAKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGRlY2ltYWx2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiLTEuMjNFLTEyXCIiKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGRlY2ltYWx2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIi0xLjIzRS0xMlwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGRlY2ltYWx2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbmV3IEJpZ0RlY2ltYWwoIi0xLjIzRS0xMiIpKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfZGVjaW1hbHZhbCBXSEVSRSBkZWNpbWFsdmFsID0gZnJvbUpzb24oPykiLCAiXCItMS4yM0UtMTJcIiIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfZGVjaW1hbHZhbCBXSEVSRSBkZWNpbWFsdmFsID0gZnJvbV9qc29uKD8pIiwgIlwiLTEuMjNFLTEyXCIiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gZG91YmxlID09PT09PT09PT09PT09PT0KLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGRvdWJsZXZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzMTIzLjEyMzEyMyIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZG91YmxldmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzMTIzLjEyMzEyMyIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBkb3VibGV2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgMTIzMTIzLjEyMzEyM2QpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl9kb3VibGV2YWwgV0hFUkUgZG91YmxldmFsID0gZnJvbUpzb24oPykiLCAiMTIzMTIzLjEyMzEyMyIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfZG91YmxldmFsIFdIRVJFIGRvdWJsZXZhbCA9IGZyb21fanNvbig/KSIsICIxMjMxMjMuMTIzMTIzIiksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKIAotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZG91YmxldmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjMxMjMiKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGRvdWJsZXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIjEyMzEyMyIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBkb3VibGV2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgMTIzMTIzLjBkKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfZG91YmxldmFsIFdIRVJFIGRvdWJsZXZhbCA9IGZyb21Kc29uKD8pIiwgIjEyMzEyMyIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfZG91YmxldmFsIFdIRVJFIGRvdWJsZXZhbCA9IGZyb21fanNvbig/KSIsICIxMjMxMjMiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gZmxvYXQgPT09PT09PT09PT09PT09PQotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZmxvYXR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIjEyMzEyMy4xMjMxMjMiKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGZsb2F0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzMTIzLjEyMzEyMyIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmbG9hdHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAxMjMxMjMuMTIzMTIzZikpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2Zsb2F0dmFsIFdIRVJFIGZsb2F0dmFsID0gZnJvbUpzb24oPykiLCAiMTIzMTIzLjEyMzEyMyIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfZmxvYXR2YWwgV0hFUkUgZmxvYXR2YWwgPSBmcm9tX2pzb24oPykiLCAiMTIzMTIzLjEyMzEyMyIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CiAKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGZsb2F0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjMxMjMiKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGZsb2F0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzMTIzIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGZsb2F0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIDEyMzEyMy4wZikpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2Zsb2F0dmFsIFdIRVJFIGZsb2F0dmFsID0gZnJvbUpzb24oPykiLCAiMTIzMTIzIiksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl9mbG9hdHZhbCBXSEVSRSBmbG9hdHZhbCA9IGZyb21fanNvbig/KSIsICIxMjMxMjMiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gaW5ldCA9PT09PT09PT09PT09PT09Ci0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBpbmV0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjEyNy4wLjAuMVwiIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBpbmV0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCIxMjcuMC4wLjFcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBpbmV0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIEluZXRBZGRyZXNzLmdldEJ5TmFtZSgiMTI3LjAuMC4xIikpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl9pbmV0dmFsIFdIRVJFIGluZXR2YWwgPSBmcm9tSnNvbig/KSIsICJcIjEyNy4wLjAuMVwiIiksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl9pbmV0dmFsIFdIRVJFIGluZXR2YWwgPSBmcm9tX2pzb24oPykiLCAiXCIxMjcuMC4wLjFcIiIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CiAKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGluZXR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiOjoxXCIiKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGluZXR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjo6MVwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGluZXR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCI6OjEiKSkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2luZXR2YWwgV0hFUkUgaW5ldHZhbCA9IGZyb21Kc29uKD8pIiwgIlwiMTI3LjAuMC4xXCIiKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfaW5ldHZhbCBXSEVSRSBpbmV0dmFsID0gZnJvbUpzb24oPykiLCAiXCI6OjFcIiIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfaW5ldHZhbCBXSEVSRSBpbmV0dmFsID0gZnJvbV9qc29uKD8pIiwgIlwiMTI3LjAuMC4xXCIiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfaW5ldHZhbCBXSEVSRSBpbmV0dmFsID0gZnJvbV9qc29uKD8pIiwgIlwiOjoxXCIiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gaW50ID09PT09PT09PT09PT09PT0KLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzMTIzIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMxMjMiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgaW50dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIDEyMzEyMykpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2ludHZhbCBXSEVSRSBpbnR2YWwgPSBmcm9tSnNvbig/KSIsICIxMjMxMjMiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2ludHZhbCBXSEVSRSBpbnR2YWwgPSBmcm9tX2pzb24oPykiLCAiMTIzMTIzIiksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IHRleHQgKHZhcmNoYXIpID09PT09PT09PT09PT09PT0KLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHRleHR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwic29tZSBcXFwiIHRleHRcIiIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdGV4dHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwic29tZSBcXFwiIHRleHRcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0ZXh0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJzb21lIFwiIHRleHQiKSk7CiAKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHRleHR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiXFx1MjAxM1wiIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCB0ZXh0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCJcXHUyMDEzXCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXHUyMDEzIikpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21Kc29uKD8pIiwgIlwiXFx1MjAxM1wiIiksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tX2pzb24oPykiLCAiXCJcXHUyMDEzXCIiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCB0ZXh0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcImFiY2RcIiIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdGV4dHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiYWJjZFwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRleHR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgImFiY2QiKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbUpzb24oPykiLCAiXCJhYmNkXCIiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21fanNvbig/KSIsICJcImFiY2RcIiIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSB0aW1lID09PT09PT09PT09PT09PT0KLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHRpbWV2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiMDc6MzU6MDcuMDAwMTExMjIyXCIiKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHRpbWV2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjA3OjM1OjA3LjAwMDExMTIyMlwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRpbWV2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgVGltZVNlcmlhbGl6ZXIudGltZVN0cmluZ1RvTG9uZygiMDc6MzU6MDcuMDAwMTExMjIyIikpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl90aW1ldmFsIFdIRVJFIHRpbWV2YWwgPSBmcm9tSnNvbig/KSIsICJcIjA3OjM1OjA3LjAwMDExMTIyMlwiIiksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl90aW1ldmFsIFdIRVJFIHRpbWV2YWwgPSBmcm9tX2pzb24oPykiLCAiXCIwNzozNTowNy4wMDAxMTEyMjJcIiIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSB0aW1lc3RhbXAgPT09PT09PT09PT09PT09PQotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXN0YW1wdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjMxMjMxMjMxMjMiKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHRpbWVzdGFtcHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIjEyMzEyMzEyMzEyMyIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0aW1lc3RhbXB2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbmV3IERhdGUoMTIzMTIzMTIzMTIzTCkpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl90aW1lc3RhbXB2YWwgV0hFUkUgdGltZXN0YW1wdmFsID0gZnJvbUpzb24oPykiLCAiMTIzMTIzMTIzMTIzIiksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl90aW1lc3RhbXB2YWwgV0hFUkUgdGltZXN0YW1wdmFsID0gZnJvbV9qc29uKD8pIiwgIjEyMzEyMzEyMzEyMyIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CiAKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHRpbWVzdGFtcHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCIyMDE0LTAxLTAxXCIiKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHRpbWVzdGFtcHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiMjAxNC0wMS0wMVwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRpbWVzdGFtcHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieS1NLWQiKS5wYXJzZSgiMjAxNC0wMS0wMSIpKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfdGltZXN0YW1wdmFsIFdIRVJFIHRpbWVzdGFtcHZhbCA9IGZyb21Kc29uKD8pIiwgIlwiMjAxNC0wMS0wMVwiIiksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl90aW1lc3RhbXB2YWwgV0hFUkUgdGltZXN0YW1wdmFsID0gZnJvbV9qc29uKD8pIiwgIlwiMjAxNC0wMS0wMVwiIiksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IHRpbWV1dWlkID09PT09PT09PT09PT09PT0KLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHRpbWV1dWlkdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCB0aW1ldXVpZHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGltZXV1aWR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTkiKSkpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCB0aW1ldXVpZHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCI2QkREQzg5QS01NjQ0LTExRTQtOTdGQy01Njg0N0FGRTk3OTlcIiIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXV1aWR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjZCRERDODlBLTU2NDQtMTFFNC05N0ZDLTU2ODQ3QUZFOTc5OVwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRpbWV1dWlkdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl90aW1ldXVpZHZhbCBXSEVSRSB0aW1ldXVpZHZhbCA9IGZyb21Kc29uKD8pIiwgIlwiNkJEREM4OUEtNTY0NC0xMUU0LTk3RkMtNTY4NDdBRkU5Nzk5XCIiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X3RpbWV1dWlkdmFsIFdIRVJFIHRpbWV1dWlkdmFsID0gZnJvbV9qc29uKD8pIiwgIlwiNkJEREM4OUEtNTY0NC0xMUU0LTk3RkMtNTY4NDdBRkU5Nzk5XCIiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gdXVpZHZhbCA9PT09PT09PT09PT09PT09Ci0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCB1dWlkdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCB1dWlkdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB1dWlkdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKTsKIAotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdXVpZHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCI2QkREQzg5QS01NjQ0LTExRTQtOTdGQy01Njg0N0FGRTk3OTlcIiIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdXVpZHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiNkJEREM4OUEtNTY0NC0xMUU0LTk3RkMtNTY4NDdBRkU5Nzk5XCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdXVpZHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfdXVpZHZhbCBXSEVSRSB1dWlkdmFsID0gZnJvbUpzb24oPykiLCAiXCI2QkREQzg5QS01NjQ0LTExRTQtOTdGQy01Njg0N0FGRTk3OTlcIiIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfdXVpZHZhbCBXSEVSRSB1dWlkdmFsID0gZnJvbV9qc29uKD8pIiwgIlwiNkJEREM4OUEtNTY0NC0xMUU0LTk3RkMtNTY4NDdBRkU5Nzk5XCIiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gdmFyaW50ID09PT09PT09PT09PT09PT0KLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHZhcmludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzMTIzMTIzMTIzIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCB2YXJpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMxMjMxMjMxMjMiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdmFyaW50dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG5ldyBCaWdJbnRlZ2VyKCIxMjMxMjMxMjMxMjMiKSkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X3ZhcmludHZhbCBXSEVSRSB2YXJpbnR2YWwgPSBmcm9tSnNvbig/KSIsICIxMjMxMjMxMjMxMjMiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X3ZhcmludHZhbCBXSEVSRSB2YXJpbnR2YWwgPSBmcm9tX2pzb24oPykiLCAiMTIzMTIzMTIzMTIzIiksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKIAogICAgICAgICAvLyBhY2NlcHQgc3RyaW5ncyBmb3IgbnVtYmVycyB0aGF0IGNhbm5vdCBiZSByZXByZXNlbnRlZCBhcyBsb25ncwotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdmFyaW50dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTBcIiIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdmFyaW50dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwXCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdmFyaW50dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG5ldyBCaWdJbnRlZ2VyKCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIikpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl92YXJpbnR2YWwgV0hFUkUgdmFyaW50dmFsID0gZnJvbUpzb24oPykiLCAiXCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwXCIiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X3ZhcmludHZhbCBXSEVSRSB2YXJpbnR2YWwgPSBmcm9tX2pzb24oPykiLCAiXCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwXCIiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gbGlzdHMgPT09PT09PT09PT09PT09PQotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgbGlzdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiWzEsIDIsIDNdIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBsaXN0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiWzEsIDIsIDNdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGxpc3R2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbGlzdCgxLCAyLCAzKSkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBsaXN0dmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbUpzb24oPykiLCAiXCJhYmNkXCIiKSwgcm93KDAsIGxpc3QoMSwgMiwgMykpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbGlzdHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21fanNvbig/KSIsICJcImFiY2RcIiIpLCByb3coMCwgbGlzdCgxLCAyLCAzKSkpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBsaXN0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJbMV0iKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGxpc3R2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJbMV0iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbGlzdHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBsaXN0KDEpKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGxpc3R2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tSnNvbig/KSIsICJcImFiY2RcIiIpLCByb3coMCwgbGlzdCgxKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBsaXN0dmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbV9qc29uKD8pIiwgIlwiYWJjZFwiIiksIHJvdygwLCBsaXN0KDEpKSk7CiAKLSAgICAgICAgdXBkYXRlVmlldygiVVBEQVRFICVzIFNFVCBsaXN0dmFsID0gbGlzdHZhbCArIGZyb21Kc29uKD8pIFdIRVJFIGsgPSA/IiwgIlsyXSIsIDApOworICAgICAgICB1cGRhdGVWaWV3KCJVUERBVEUgJXMgU0VUIGxpc3R2YWwgPSBsaXN0dmFsICsgZnJvbV9qc29uKD8pIFdIRVJFIGsgPSA/IiwgIlsyXSIsIDApOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBsaXN0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIGxpc3QoMSwgMikpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbGlzdHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21Kc29uKD8pIiwgIlwiYWJjZFwiIiksIHJvdygwLCBsaXN0KDEsIDIpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGxpc3R2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tX2pzb24oPykiLCAiXCJhYmNkXCIiKSwgcm93KDAsIGxpc3QoMSwgMikpKTsKIAotICAgICAgICB1cGRhdGVWaWV3KCJVUERBVEUgJXMgU0VUIGxpc3R2YWwgPSBmcm9tSnNvbig/KSArIGxpc3R2YWwgV0hFUkUgayA9ID8iLCAiWzBdIiwgMCk7CisgICAgICAgIHVwZGF0ZVZpZXcoIlVQREFURSAlcyBTRVQgbGlzdHZhbCA9IGZyb21fanNvbig/KSArIGxpc3R2YWwgV0hFUkUgayA9ID8iLCAiWzBdIiwgMCk7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGxpc3R2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbGlzdCgwLCAxLCAyKSkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBsaXN0dmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbUpzb24oPykiLCAiXCJhYmNkXCIiKSwgcm93KDAsIGxpc3QoMCwgMSwgMikpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbGlzdHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21fanNvbig/KSIsICJcImFiY2RcIiIpLCByb3coMCwgbGlzdCgwLCAxLCAyKSkpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIlVQREFURSAlcyBTRVQgbGlzdHZhbFsxXSA9IGZyb21Kc29uKD8pIFdIRVJFIGsgPSA/IiwgIjEwIiwgMCk7CisgICAgICAgIHVwZGF0ZVZpZXcoIlVQREFURSAlcyBTRVQgbGlzdHZhbFsxXSA9IGZyb21fanNvbig/KSBXSEVSRSBrID0gPyIsICIxMCIsIDApOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBsaXN0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIGxpc3QoMCwgMTAsIDIpKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGxpc3R2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tSnNvbig/KSIsICJcImFiY2RcIiIpLCByb3coMCwgbGlzdCgwLCAxMCwgMikpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbGlzdHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21fanNvbig/KSIsICJcImFiY2RcIiIpLCByb3coMCwgbGlzdCgwLCAxMCwgMikpKTsKIAogICAgICAgICB1cGRhdGVWaWV3KCJERUxFVEUgbGlzdHZhbFsxXSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCk7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGxpc3R2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbGlzdCgwLCAyKSkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBsaXN0dmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbUpzb24oPykiLCAiXCJhYmNkXCIiKSwgcm93KDAsIGxpc3QoMCwgMikpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbGlzdHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21fanNvbig/KSIsICJcImFiY2RcIiIpLCByb3coMCwgbGlzdCgwLCAyKSkpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBsaXN0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJbXSIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgbGlzdHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIltdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGxpc3R2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbnVsbCkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBsaXN0dmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbUpzb24oPykiLCAiXCJhYmNkXCIiKSwgcm93KDAsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbGlzdHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21fanNvbig/KSIsICJcImFiY2RcIiIpLCByb3coMCwgbnVsbCkpOwogCiAgICAgICAgIC8vIGZyb3plbgotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVubGlzdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiWzEsIDIsIDNdIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5saXN0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiWzEsIDIsIDNdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGZyb3plbmxpc3R2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbGlzdCgxLCAyLCAzKSkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmcm96ZW5saXN0dmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbUpzb24oPykiLCAiXCJhYmNkXCIiKSwgcm93KDAsIGxpc3QoMSwgMiwgMykpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBmcm9tIG12X2Zyb3plbmxpc3R2YWwgd2hlcmUgZnJvemVubGlzdHZhbCA9IGZyb21Kc29uKD8pIiwgIlsxLCAyLCAzXSIpLCByb3coMCwgImFiY2QiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGZyb3plbmxpc3R2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tX2pzb24oPykiLCAiXCJhYmNkXCIiKSwgcm93KDAsIGxpc3QoMSwgMiwgMykpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBmcm9tIG12X2Zyb3plbmxpc3R2YWwgd2hlcmUgZnJvemVubGlzdHZhbCA9IGZyb21fanNvbig/KSIsICJbMSwgMiwgM10iKSwgcm93KDAsICJhYmNkIikpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5saXN0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJbMywgMiwgMV0iKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGZyb3plbmxpc3R2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJbMywgMiwgMV0iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZnJvemVubGlzdHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBsaXN0KDMsIDIsIDEpKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRleHR2YWwgZnJvbSBtdl9mcm96ZW5saXN0dmFsIHdoZXJlIGZyb3plbmxpc3R2YWwgPSBmcm9tSnNvbig/KSIsICJbMSwgMiwgM10iKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRleHR2YWwgZnJvbSBtdl9mcm96ZW5saXN0dmFsIHdoZXJlIGZyb3plbmxpc3R2YWwgPSBmcm9tSnNvbig/KSIsICJbMywgMiwgMV0iKSwgcm93KDAsICJhYmNkIikpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmcm96ZW5saXN0dmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbUpzb24oPykiLCAiXCJhYmNkXCIiKSwgcm93KDAsIGxpc3QoMywgMiwgMSkpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBmcm9tIG12X2Zyb3plbmxpc3R2YWwgd2hlcmUgZnJvemVubGlzdHZhbCA9IGZyb21fanNvbig/KSIsICJbMSwgMiwgM10iKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRleHR2YWwgZnJvbSBtdl9mcm96ZW5saXN0dmFsIHdoZXJlIGZyb3plbmxpc3R2YWwgPSBmcm9tX2pzb24oPykiLCAiWzMsIDIsIDFdIiksIHJvdygwLCAiYWJjZCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZnJvemVubGlzdHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21fanNvbig/KSIsICJcImFiY2RcIiIpLCByb3coMCwgbGlzdCgzLCAyLCAxKSkpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5saXN0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJbXSIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVubGlzdHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIltdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGZyb3plbmxpc3R2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbGlzdCgpKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGZyb3plbmxpc3R2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tSnNvbig/KSIsICJcImFiY2RcIiIpLCByb3coMCwgbGlzdCgpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGZyb3plbmxpc3R2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tX2pzb24oPykiLCAiXCJhYmNkXCIiKSwgcm93KDAsIGxpc3QoKSkpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gc2V0cyA9PT09PT09PT09PT09PT09Ci0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBzZXR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwKICAgICAgICAgICAgICAgICAgICAwLCAiW1wiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk4XCIsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCJdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHNldHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsIHNldChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OCIpLCAoVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTkiKSkpKQogICAgICAgICApOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBzZXR2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tSnNvbig/KSIsICJcImFiY2RcIiIpLAorICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBzZXR2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tX2pzb24oPykiLCAiXCJhYmNkXCIiKSwKICAgICAgICAgICAgICAgICAgICByb3coMCwgc2V0KFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk4IiksIChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKSkpKTsKIAogICAgICAgICAvLyBkdXBsaWNhdGVzIGFyZSBva2F5LCBqdXN0IGxpa2UgaW4gQ1FMCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBzZXR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwKICAgICAgICAgICAgICAgICAgICAwLCAiW1wiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk4XCIsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk4XCIsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCJdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHNldHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsIHNldChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OCIpLCAoVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTkiKSkpKQogICAgICAgICApOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBzZXR2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tSnNvbig/KSIsICJcImFiY2RcIiIpLAorICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBzZXR2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tX2pzb24oPykiLCAiXCJhYmNkXCIiKSwKICAgICAgICAgICAgICAgICAgICByb3coMCwgc2V0KFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk4IiksIChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKSkpKTsKIAotICAgICAgICB1cGRhdGVWaWV3KCJVUERBVEUgJXMgU0VUIHNldHZhbCA9IHNldHZhbCArIGZyb21Kc29uKD8pIFdIRVJFIGsgPSA/IiwgIltcIjZiZGRjODlhLTU2NDQtMDAwMC05N2ZjLTU2ODQ3YWZlOTc5OVwiXSIsIDApOworICAgICAgICB1cGRhdGVWaWV3KCJVUERBVEUgJXMgU0VUIHNldHZhbCA9IHNldHZhbCArIGZyb21fanNvbig/KSBXSEVSRSBrID0gPyIsICJbXCI2YmRkYzg5YS01NjQ0LTAwMDAtOTdmYy01Njg0N2FmZTk3OTlcIl0iLCAwKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1Qgaywgc2V0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKICAgICAgICAgICAgICAgICAgICByb3coMCwgc2V0KFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0wMDAwLTk3ZmMtNTY4NDdhZmU5Nzk5IiksIFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk4IiksIChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKSkpCiAgICAgICAgICk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHNldHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21Kc29uKD8pIiwgIlwiYWJjZFwiIiksCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHNldHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21fanNvbig/KSIsICJcImFiY2RcIiIpLAogICAgICAgICAgICAgICAgICAgIHJvdygwLCBzZXQoVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTAwMDAtOTdmYy01Njg0N2FmZTk3OTkiKSwgVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTgiKSwgKFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKSkpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIlVQREFURSAlcyBTRVQgc2V0dmFsID0gc2V0dmFsIC0gZnJvbUpzb24oPykgV0hFUkUgayA9ID8iLCAiW1wiNmJkZGM4OWEtNTY0NC0wMDAwLTk3ZmMtNTY4NDdhZmU5Nzk5XCJdIiwgMCk7CisgICAgICAgIHVwZGF0ZVZpZXcoIlVQREFURSAlcyBTRVQgc2V0dmFsID0gc2V0dmFsIC0gZnJvbV9qc29uKD8pIFdIRVJFIGsgPSA/IiwgIltcIjZiZGRjODlhLTU2NDQtMDAwMC05N2ZjLTU2ODQ3YWZlOTc5OVwiXSIsIDApOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBzZXR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLAogICAgICAgICAgICAgICAgICAgIHJvdygwLCBzZXQoVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTgiKSwgKFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKSkKICAgICAgICAgKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1Qgaywgc2V0dmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbUpzb24oPykiLCAiXCJhYmNkXCIiKSwKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1Qgaywgc2V0dmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbV9qc29uKD8pIiwgIlwiYWJjZFwiIiksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsIHNldChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OCIpLCAoVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTkiKSkpKSk7CiAKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiW10iKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIltdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHNldHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBudWxsKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHNldHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21Kc29uKD8pIiwgIlwiYWJjZFwiIiksCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHNldHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21fanNvbig/KSIsICJcImFiY2RcIiIpLAogICAgICAgICAgICAgICAgICAgIHJvdygwLCBudWxsKSk7CiAKIAogICAgICAgICAvLyBmcm96ZW4KLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGZyb3plbnNldHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLAorICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVuc2V0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLAogICAgICAgICAgICAgICAgICAgIDAsICJbXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OThcIiwgXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIl0iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZnJvemVuc2V0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKICAgICAgICAgICAgICAgICAgICByb3coMCwgc2V0KFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk4IiksIChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKSkpCiAgICAgICAgICk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGZyb3plbnNldHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21Kc29uKD8pIiwgIlwiYWJjZFwiIiksCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGZyb3plbnNldHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21fanNvbig/KSIsICJcImFiY2RcIiIpLAogICAgICAgICAgICAgICAgICAgIHJvdygwLCBzZXQoVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTgiKSwgKFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKSkpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5zZXR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGZyb3plbnNldHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwKICAgICAgICAgICAgICAgICAgICAwLCAiW1wiNmJkZGM4OWEtMDAwMC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk4XCJdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGZyb3plbnNldHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsIHNldChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTAwMDAtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpLCAoVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTgiKSkpKQogICAgICAgICApOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmcm96ZW5zZXR2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tSnNvbig/KSIsICJcImFiY2RcIiIpLAorICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmcm96ZW5zZXR2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tX2pzb24oPykiLCAiXCJhYmNkXCIiKSwKICAgICAgICAgICAgICAgICAgICByb3coMCwgc2V0KFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtMDAwMC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IiksIChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OCIpKSkpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IG1hcHMgPT09PT09PT09PT09PT09PQotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgbWFwdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ7XCJhXCI6IDEsIFwiYlwiOiAyfSIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgbWFwdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAie1wiYVwiOiAxLCBcImJcIjogMn0iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbWFwdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG1hcCgiYSIsIDEsICJiIiwgMikpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbWFwdmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbUpzb24oPykiLCAiXCJhYmNkXCIiKSwgcm93KDAsIG1hcCgiYSIsIDEsICJiIiwgMikpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbWFwdmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbV9qc29uKD8pIiwgIlwiYWJjZFwiIiksIHJvdygwLCBtYXAoImEiLCAxLCAiYiIsIDIpKSk7CiAKICAgICAgICAgdXBkYXRlVmlldygiVVBEQVRFICVzIFNFVCBtYXB2YWxbP10gPSA/ICBXSEVSRSBrID0gPyIsICJjIiwgMywgMCk7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIG1hcHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsIG1hcCgiYSIsIDEsICJiIiwgMiwgImMiLCAzKSkKICAgICAgICAgKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbWFwdmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbUpzb24oPykiLCAiXCJhYmNkXCIiKSwKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbWFwdmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbV9qc29uKD8pIiwgIlwiYWJjZFwiIiksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsIG1hcCgiYSIsIDEsICJiIiwgMiwgImMiLCAzKSkpOwogCiAgICAgICAgIHVwZGF0ZVZpZXcoIlVQREFURSAlcyBTRVQgbWFwdmFsWz9dID0gPyAgV0hFUkUgayA9ID8iLCAiYiIsIDEwLCAwKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbWFwdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKICAgICAgICAgICAgICAgICAgICByb3coMCwgbWFwKCJhIiwgMSwgImIiLCAxMCwgImMiLCAzKSkKICAgICAgICAgKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbWFwdmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbUpzb24oPykiLCAiXCJhYmNkXCIiKSwKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbWFwdmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbV9qc29uKD8pIiwgIlwiYWJjZFwiIiksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsIG1hcCgiYSIsIDEsICJiIiwgMTAsICJjIiwgMykpKTsKIAogICAgICAgICB1cGRhdGVWaWV3KCJERUxFVEUgbWFwdmFsWz9dIEZST00gJXMgV0hFUkUgayA9ID8iLCAiYiIsIDApOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBtYXB2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLAogICAgICAgICAgICAgICAgICAgIHJvdygwLCBtYXAoImEiLCAxLCAiYyIsIDMpKQogICAgICAgICApOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBtYXB2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tSnNvbig/KSIsICJcImFiY2RcIiIpLAorICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBtYXB2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tX2pzb24oPykiLCAiXCJhYmNkXCIiKSwKICAgICAgICAgICAgICAgICAgICByb3coMCwgbWFwKCJhIiwgMSwgImMiLCAzKSkpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBtYXB2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgInt9Iik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBtYXB2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJ7fSIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBtYXB2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbnVsbCkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBtYXB2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tSnNvbig/KSIsICJcImFiY2RcIiIpLAorICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBtYXB2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tX2pzb24oPykiLCAiXCJhYmNkXCIiKSwKICAgICAgICAgICAgICAgICAgICByb3coMCwgbnVsbCkpOwogCiAgICAgICAgIC8vIGZyb3plbgotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVubWFwdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ7XCJhXCI6IDEsIFwiYlwiOiAyfSIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVubWFwdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAie1wiYVwiOiAxLCBcImJcIjogMn0iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZnJvemVubWFwdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG1hcCgiYSIsIDEsICJiIiwgMikpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBGUk9NIG12X2Zyb3plbm1hcHZhbCBXSEVSRSBmcm96ZW5tYXB2YWwgPSBmcm9tSnNvbig/KSIsICJ7XCJhXCI6IDEsIFwiYlwiOiAyfSIpLCByb3coMCwgImFiY2QiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRleHR2YWwgRlJPTSBtdl9mcm96ZW5tYXB2YWwgV0hFUkUgZnJvemVubWFwdmFsID0gZnJvbV9qc29uKD8pIiwgIntcImFcIjogMSwgXCJiXCI6IDJ9IiksIHJvdygwLCAiYWJjZCIpKTsKIAotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVubWFwdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ7XCJiXCI6IDIsIFwiYVwiOiAzfSIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVubWFwdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAie1wiYlwiOiAyLCBcImFcIjogM30iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZnJvemVubWFwdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG1hcCgiYSIsIDMsICJiIiwgMikpKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZnJvemVubWFwdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG1hcCgiYSIsIDMsICJiIiwgMikpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IHR1cGxlcyA9PT09PT09PT09PT09PT09Ci0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCB0dXBsZXZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiWzEsIFwiZm9vYmFyXCIsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCJdIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCB0dXBsZXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlsxLCBcImZvb2JhclwiLCBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiXSIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0dXBsZXZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsIHR1cGxlKDEsICJmb29iYXIiLCBVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKSkKICAgICAgICAgKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBGUk9NIG12X3R1cGxldmFsIFdIRVJFIHR1cGxldmFsID0gPyIsIHR1cGxlKDEsICJmb29iYXIiLCBVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKSksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsICJhYmNkIikpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCB0dXBsZXZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiWzEsIG51bGwsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCJdIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCB0dXBsZXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlsxLCBudWxsLCBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiXSIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0dXBsZXZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsIHR1cGxlKDEsIG51bGwsIFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKQogICAgICAgICApOwpAQCAtNTY5LDM3ICs1NjksMzcgQEAKICAgICAgICAgICAgICAgICAgICByb3coMCwgImFiY2QiKSk7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBVRFRzID09PT09PT09PT09PT09PT0KLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHVkdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAie1wiYVwiOiAxLCBcImJcIjogXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiwgXCJjXCI6IFtcImZvb1wiLCBcImJhclwiXX0iKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHVkdHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIntcImFcIjogMSwgXCJiXCI6IFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIsIFwiY1wiOiBbXCJmb29cIiwgXCJiYXJcIl19Iik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHVkdHZhbC5hLCB1ZHR2YWwuYiwgdWR0dmFsLmMgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLAogICAgICAgICAgICAgICAgICAgIHJvdygwLCAxLCBVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpLCBzZXQoImJhciIsICJmb28iKSkKICAgICAgICAgKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBGUk9NIG12X3VkdHZhbCBXSEVSRSB1ZHR2YWwgPSBmcm9tSnNvbig/KSIsICJ7XCJhXCI6IDEsIFwiYlwiOiBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiLCBcImNcIjogW1wiZm9vXCIsIFwiYmFyXCJdfSIpLAorICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0ZXh0dmFsIEZST00gbXZfdWR0dmFsIFdIRVJFIHVkdHZhbCA9IGZyb21fanNvbig/KSIsICJ7XCJhXCI6IDEsIFwiYlwiOiBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiLCBcImNcIjogW1wiZm9vXCIsIFwiYmFyXCJdfSIpLAogICAgICAgICAgICAgICAgICAgIHJvdygwLCAiYWJjZCIpKTsKIAogICAgICAgICAvLyBvcmRlciBvZiBmaWVsZHMgc2hvdWxkbid0IG1hdHRlcgotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdWR0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ7XCJiXCI6IFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIsIFwiYVwiOiAxLCBcImNcIjogW1wiZm9vXCIsIFwiYmFyXCJdfSIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdWR0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAie1wiYlwiOiBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiLCBcImFcIjogMSwgXCJjXCI6IFtcImZvb1wiLCBcImJhclwiXX0iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdWR0dmFsLmEsIHVkdHZhbC5iLCB1ZHR2YWwuYyBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsIDEsIFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IiksIHNldCgiYmFyIiwgImZvbyIpKQogICAgICAgICApOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0ZXh0dmFsIEZST00gbXZfdWR0dmFsIFdIRVJFIHVkdHZhbCA9IGZyb21Kc29uKD8pIiwgIntcImFcIjogMSwgXCJiXCI6IFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIsIFwiY1wiOiBbXCJmb29cIiwgXCJiYXJcIl19IiksCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRleHR2YWwgRlJPTSBtdl91ZHR2YWwgV0hFUkUgdWR0dmFsID0gZnJvbV9qc29uKD8pIiwgIntcImFcIjogMSwgXCJiXCI6IFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIsIFwiY1wiOiBbXCJmb29cIiwgXCJiYXJcIl19IiksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsICJhYmNkIikpOwogCiAgICAgICAgIC8vIHRlc3QgbnVsbHMKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHVkdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAie1wiYVwiOiBudWxsLCBcImJcIjogXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiwgXCJjXCI6IFtcImZvb1wiLCBcImJhclwiXX0iKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHVkdHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIntcImFcIjogbnVsbCwgXCJiXCI6IFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIsIFwiY1wiOiBbXCJmb29cIiwgXCJiYXJcIl19Iik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHVkdHZhbC5hLCB1ZHR2YWwuYiwgdWR0dmFsLmMgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLAogICAgICAgICAgICAgICAgICAgIHJvdygwLCBudWxsLCBVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpLCBzZXQoImJhciIsICJmb28iKSkKICAgICAgICAgKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBGUk9NIG12X3VkdHZhbCBXSEVSRSB1ZHR2YWwgPSBmcm9tSnNvbig/KSIsICJ7XCJhXCI6IDEsIFwiYlwiOiBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiLCBcImNcIjogW1wiZm9vXCIsIFwiYmFyXCJdfSIpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBGUk9NIG12X3VkdHZhbCBXSEVSRSB1ZHR2YWwgPSBmcm9tSnNvbig/KSIsICJ7XCJhXCI6IG51bGwsIFwiYlwiOiBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiLCBcImNcIjogW1wiZm9vXCIsIFwiYmFyXCJdfSIpLAorICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0ZXh0dmFsIEZST00gbXZfdWR0dmFsIFdIRVJFIHVkdHZhbCA9IGZyb21fanNvbig/KSIsICJ7XCJhXCI6IDEsIFwiYlwiOiBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiLCBcImNcIjogW1wiZm9vXCIsIFwiYmFyXCJdfSIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBGUk9NIG12X3VkdHZhbCBXSEVSRSB1ZHR2YWwgPSBmcm9tX2pzb24oPykiLCAie1wiYVwiOiBudWxsLCBcImJcIjogXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiwgXCJjXCI6IFtcImZvb1wiLCBcImJhclwiXX0iKSwKICAgICAgICAgICAgICAgICAgICByb3coMCwgImFiY2QiKSk7CiAKICAgICAgICAgLy8gdGVzdCBtaXNzaW5nIGZpZWxkcwotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdWR0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ7XCJhXCI6IDEsIFwiYlwiOiBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwifSIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdWR0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAie1wiYVwiOiAxLCBcImJcIjogXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIn0iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdWR0dmFsLmEsIHVkdHZhbC5iLCB1ZHR2YWwuYyBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsIDEsIFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IiksIG51bGwpCiAgICAgICAgICk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRleHR2YWwgRlJPTSBtdl91ZHR2YWwgV0hFUkUgdWR0dmFsID0gZnJvbUpzb24oPykiLCAie1wiYVwiOiBudWxsLCBcImJcIjogXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiwgXCJjXCI6IFtcImZvb1wiLCBcImJhclwiXX0iKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRleHR2YWwgRlJPTSBtdl91ZHR2YWwgV0hFUkUgdWR0dmFsID0gZnJvbUpzb24oPykiLCAie1wiYVwiOiAxLCBcImJcIjogXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIn0iKSwKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBGUk9NIG12X3VkdHZhbCBXSEVSRSB1ZHR2YWwgPSBmcm9tX2pzb24oPykiLCAie1wiYVwiOiBudWxsLCBcImJcIjogXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiwgXCJjXCI6IFtcImZvb1wiLCBcImJhclwiXX0iKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRleHR2YWwgRlJPTSBtdl91ZHR2YWwgV0hFUkUgdWR0dmFsID0gZnJvbV9qc29uKD8pIiwgIntcImFcIjogMSwgXCJiXCI6IFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCJ9IiksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsICJhYmNkIikpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVmlld1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1ZpZXdUZXN0LmphdmEKaW5kZXggZDgyZmQzMi4uYTI3OTNmZCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVmlld1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9WaWV3VGVzdC5qYXZhCkBAIC0yMzIsMTIgKzIzMiwxMiBAQAogCiAgICAgICAgIGNyZWF0ZVZpZXcoIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgSVMgTk9UIE5VTEwgQU5EIGludHZhbCBJUyBOT1QgTlVMTCBQUklNQVJZIEtFWSAoaW50dmFsLCBrKSIpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBpbnR2YWwsIGxpc3R2YWwpIFZBTFVFUyAoPywgPywgZnJvbUpzb24oPykpIiwgMCwgMCwgIlsxLCAyLCAzXSIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgaW50dmFsLCBsaXN0dmFsKSBWQUxVRVMgKD8sID8sIGZyb21fanNvbig/KSkiLCAwLCAwLCAiWzEsIDIsIDNdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGxpc3R2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbGlzdCgxLCAyLCAzKSkpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGVWaWV3KCJTRUxFQ1QgaywgbGlzdHZhbCBmcm9tICVzIFdIRVJFIGludHZhbCA9ID8iLCAwKSwgcm93KDAsIGxpc3QoMSwgMiwgMykpKTsKIAogICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgaW50dmFsKSBWQUxVRVMgKD8sID8pIiwgMSwgMSk7Ci0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBsaXN0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDEsICJbMSwgMiwgM10iKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGxpc3R2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDEsICJbMSwgMiwgM10iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbGlzdHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMSksIHJvdygxLCBsaXN0KDEsIDIsIDMpKSk7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZVZpZXcoIlNFTEVDVCBrLCBsaXN0dmFsIGZyb20gJXMgV0hFUkUgaW50dmFsID0gPyIsIDEpLCByb3coMSwgbGlzdCgxLCAyLCAzKSkpOwogICAgIH0KQEAgLTI0OSw3ICsyNDksNyBAQAogCiAgICAgICAgIGNyZWF0ZVZpZXcoIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgSVMgTk9UIE5VTEwgQU5EIGxpc3R2YWwgSVMgTk9UIE5VTEwgUFJJTUFSWSBLRVkgKGssIGxpc3R2YWwpIik7CiAKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGludHZhbCwgbGlzdHZhbCkgVkFMVUVTICg/LCA/LCBmcm9tSnNvbig/KSkiLAorICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgaW50dmFsLCBsaXN0dmFsKSBWQUxVRVMgKD8sID8sIGZyb21fanNvbig/KSkiLAogICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAiW1tcImFcIixcIjFcIl0sIFtcImJcIixcIjJcIl0sIFtcImNcIixcIjNcIl1dIik7CkBAIC0yNjEsNyArMjYxLDcgQEAKICAgICAgICAgICAgICAgICAgICByb3coMCwgbGlzdCh0dXBsZSgiYSIsICIxIiksIHR1cGxlKCJiIiwgIjIiKSwgdHVwbGUoImMiLCAiMyIpKSkpOwogCiAgICAgICAgIC8vIHVwZGF0ZSBsaXN0dmFsIHdpdGggdGhlIHNhbWUgdmFsdWUgYW5kIGl0IHdpbGwgYmUgY29tcGFyZWQgaW4gdmlldyBnZW5lcmF0b3IKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGxpc3R2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGxpc3R2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsCiAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAiW1tcImFcIixcIjFcIl0sIFtcImJcIixcIjJcIl0sIFtcImNcIixcIjNcIl1dIik7CiAgICAgICAgIC8vIHZlcmlmeSByZXN1bHQKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9DYXN0RmN0c1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9DYXN0RmN0c1Rlc3QuamF2YQppbmRleCA2ZWZiZGMwLi43ZmUzYjYxIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvQ2FzdEZjdHNUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0Nhc3RGY3RzVGVzdC5qYXZhCkBAIC0zMjYsNyArMzI2LDcgQEAKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgdiBGUk9NICVzIiksIHJvdygzKSk7CiAKICAgICAgICAgLy8gQ2FzdCBvZiBwbGFjZWhvbGRlciB3aXRob3V0IHR5cGUgaGludAotICAgICAgICBhc3NlcnRJbnZhbGlkUmVxdWVzdE1lc3NhZ2UoIkFtYmlndW91cyBjYWxsIHRvIGZ1bmN0aW9uIHN5c3RlbS5jYXN0QXNJbnQiLAorICAgICAgICBhc3NlcnRJbnZhbGlkUmVxdWVzdE1lc3NhZ2UoIkFtYmlndW91cyBjYWxsIHRvIGZ1bmN0aW9uIHN5c3RlbS5jYXN0X2FzX2ludCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHYpIFZBTFVFUyAoMSwgQ0FTVCg/IEFTIGludCkpIiwgMy40Zik7CiAKICAgICAgICAgLy8gVHlwZSBoaW50IG9mIGNhc3QKQEAgLTM2Myw3ICszNjMsNyBAQAogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCB2IEZST00gJXMiKSwgcm93KDMpKTsKIAogICAgICAgICAvLyBDYXN0IG9mIHBsYWNlaG9sZGVyIHdpdGhvdXQgdHlwZSBoaW50Ci0gICAgICAgIGFzc2VydEludmFsaWRSZXF1ZXN0TWVzc2FnZSgiQW1iaWd1b3VzIGNhbGwgdG8gZnVuY3Rpb24gc3lzdGVtLmNhc3RBc0ludCIsCisgICAgICAgIGFzc2VydEludmFsaWRSZXF1ZXN0TWVzc2FnZSgiQW1iaWd1b3VzIGNhbGwgdG8gZnVuY3Rpb24gc3lzdGVtLmNhc3RfYXNfaW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVUERBVEUgJXMgU0VUIHYgPSBDQVNUKD8gQVMgaW50KSBXSEVSRSBrID0gMSIsIDMuNGYpOwogCiAgICAgICAgIC8vIFR5cGUgaGludCBvZiBjYXN0CkBAIC00MDUsNyArNDA1LDcgQEAKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgdiBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMyksIHJvdygzKSk7CiAKICAgICAgICAgLy8gQ2FzdCBvZiBwbGFjZWhvbGRlciB3aXRob3V0IHR5cGUgaGludAotICAgICAgICBhc3NlcnRJbnZhbGlkUmVxdWVzdE1lc3NhZ2UoIkFtYmlndW91cyBjYWxsIHRvIGZ1bmN0aW9uIHN5c3RlbS5jYXN0QXNJbnQiLAorICAgICAgICBhc3NlcnRJbnZhbGlkUmVxdWVzdE1lc3NhZ2UoIkFtYmlndW91cyBjYWxsIHRvIGZ1bmN0aW9uIHN5c3RlbS5jYXN0X2FzX2ludCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVBEQVRFICVzIFNFVCB2ID0gPyBXSEVSRSBrID0gQ0FTVCg/IEFTIGludCkiLCAzLCAzLjRmKTsKIAogICAgICAgICAvLyBUeXBlIGhpbnQgb2YgY2FzdApAQCAtNDQ0LDcgKzQ0NCw3IEBACiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGsgRlJPTSAlcyBXSEVSRSBrID0gQ0FTVCgoZmxvYXQpID8gQVMgaW50KSIsIDMuNGYpLCByb3coMykpOwogCiAgICAgICAgIC8vIENhc3Qgb2YgcGxhY2Vob2xkZXIgd2l0aG91dCB0eXBlIGhpbnQKLSAgICAgICAgYXNzZXJ0SW52YWxpZFJlcXVlc3RNZXNzYWdlKCJBbWJpZ3VvdXMgY2FsbCB0byBmdW5jdGlvbiBzeXN0ZW0uY2FzdEFzSW50IiwKKyAgICAgICAgYXNzZXJ0SW52YWxpZFJlcXVlc3RNZXNzYWdlKCJBbWJpZ3VvdXMgY2FsbCB0byBmdW5jdGlvbiBzeXN0ZW0uY2FzdF9hc19pbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFTEVDVCBrIEZST00gJXMgV0hFUkUgayA9IENBU1QoPyBBUyBpbnQpIiwgMy40Zik7CiAKICAgICAgICAgLy8gVHlwZSBoaW50IG9mIGNhc3QKQEAgLTQ4Myw3ICs0ODMsNyBAQAogICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMykpOwogCiAgICAgICAgIC8vIENhc3Qgb2YgcGxhY2Vob2xkZXIgd2l0aG91dCB0eXBlIGhpbnQKLSAgICAgICAgYXNzZXJ0SW52YWxpZFJlcXVlc3RNZXNzYWdlKCJBbWJpZ3VvdXMgY2FsbCB0byBmdW5jdGlvbiBzeXN0ZW0uY2FzdEFzSW50IiwKKyAgICAgICAgYXNzZXJ0SW52YWxpZFJlcXVlc3RNZXNzYWdlKCJBbWJpZ3VvdXMgY2FsbCB0byBmdW5jdGlvbiBzeXN0ZW0uY2FzdF9hc19pbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRFTEVURSBGUk9NICVzIFdIRVJFIGsgPSBDQVNUKD8gQVMgaW50KSIsIDMuNGYpOwogCiAgICAgICAgIC8vIFR5cGUgaGludCBvZiBjYXN0CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvQ29sbGVjdGlvbkZjdHNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvQ29sbGVjdGlvbkZjdHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFkMjk5ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9Db2xsZWN0aW9uRmN0c1Rlc3QuamF2YQpAQCAtMCwwICsxLDU5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9uczsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEubWF0aC5Sb3VuZGluZ01vZGU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5OdW1iZXJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CisKKy8qKgorICogVGVzdHMgZm9yIHRoZSBmdW5jdGlvbnMgZGVmaW5lZCBvbiB7QGxpbmsgQ29sbGVjdGlvbkZjdHN9LgorICovCitwdWJsaWMgY2xhc3MgQ29sbGVjdGlvbkZjdHNUZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBiaWdpbnQxID0gbmV3IEJpZ0ludGVnZXIoIjEyMzQ1Njc4OTAxMjM0NTY3ODkwIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBiaWdpbnQyID0gbmV3IEJpZ0ludGVnZXIoIjIzNDU2Nzg5MDEyMzQ1Njc4OTAxIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBiaWdkZWNpbWFsMSA9IG5ldyBCaWdEZWNpbWFsKCIxMjM0NTY3ODkwLjEyMzQ1Njc4OTAiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIGJpZ2RlY2ltYWwyID0gbmV3IEJpZ0RlY2ltYWwoIjIzNDU2Nzg5MDEuMjM0NTY3ODkwMSIpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90TnVtZXJpY0NvbGxlY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdiB1dWlkLCBsIGxpc3Q8dGV4dD4sIHMgc2V0PGJvb2xlYW4+LCBmbCBmcm96ZW48bGlzdDx0ZXh0Pj4sIGZzIGZyb3plbjxzZXQ8Ym9vbGVhbj4+KSIpOworCisgICAgICAgIC8vIHN1bQorICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKCJGdW5jdGlvbiBzeXN0ZW0uY29sbGVjdGlvbl9zdW0gcmVxdWlyZXMgYSBudW1lcmljIHNldC9saXN0IGFyZ3VtZW50LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGZvdW5kIGFyZ3VtZW50IHYgb2YgdHlwZSB1dWlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VMRUNUIGNvbGxlY3Rpb25fc3VtKHYpIEZST00gJXMiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZSgiRnVuY3Rpb24gc3lzdGVtLmNvbGxlY3Rpb25fc3VtIHJlcXVpcmVzIGEgbnVtZXJpYyBzZXQvbGlzdCBhcmd1bWVudCwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBmb3VuZCBhcmd1bWVudCBsIG9mIHR5cGUgbGlzdDx0ZXh0PiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFTEVDVCBjb2xsZWN0aW9uX3N1bShsKSBGUk9NICVzIik7CisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoIkZ1bmN0aW9uIHN5c3RlbS5jb2xsZWN0aW9uX3N1bSByZXF1aXJlcyBhIG51bWVyaWMgc2V0L2xpc3QgYXJndW1lbnQsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgZm91bmQgYXJndW1lbnQgcyBvZiB0eXBlIHNldDxib29sZWFuPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFTEVDVCBjb2xsZWN0aW9uX3N1bShzKSBGUk9NICVzIik7CisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoIkZ1bmN0aW9uIHN5c3RlbS5jb2xsZWN0aW9uX3N1bSByZXF1aXJlcyBhIG51bWVyaWMgc2V0L2xpc3QgYXJndW1lbnQsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgZm91bmQgYXJndW1lbnQgZmwgb2YgdHlwZSBmcm96ZW48bGlzdDx0ZXh0Pj4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTRUxFQ1QgY29sbGVjdGlvbl9zdW0oZmwpIEZST00gJXMiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZSgiRnVuY3Rpb24gc3lzdGVtLmNvbGxlY3Rpb25fc3VtIHJlcXVpcmVzIGEgbnVtZXJpYyBzZXQvbGlzdCBhcmd1bWVudCwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBmb3VuZCBhcmd1bWVudCBmcyBvZiB0eXBlIGZyb3plbjxzZXQ8Ym9vbGVhbj4+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VMRUNUIGNvbGxlY3Rpb25fc3VtKGZzKSBGUk9NICVzIik7CisKKyAgICAgICAgLy8gYXZnCisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoIkZ1bmN0aW9uIHN5c3RlbS5jb2xsZWN0aW9uX2F2ZyByZXF1aXJlcyBhIG51bWVyaWMgc2V0L2xpc3QgYXJndW1lbnQsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgZm91bmQgYXJndW1lbnQgdiBvZiB0eXBlIHV1aWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTRUxFQ1QgY29sbGVjdGlvbl9hdmcodikgRlJPTSAlcyIpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKCJGdW5jdGlvbiBzeXN0ZW0uY29sbGVjdGlvbl9hdmcgcmVxdWlyZXMgYSBudW1lcmljIHNldC9saXN0IGFyZ3VtZW50LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGZvdW5kIGFyZ3VtZW50IGwgb2YgdHlwZSBsaXN0PHRleHQ+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VMRUNUIGNvbGxlY3Rpb25fYXZnKGwpIEZST00gJXMiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZSgiRnVuY3Rpb24gc3lzdGVtLmNvbGxlY3Rpb25fYXZnIHJlcXVpcmVzIGEgbnVtZXJpYyBzZXQvbGlzdCBhcmd1bWVudCwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBmb3VuZCBhcmd1bWVudCBzIG9mIHR5cGUgc2V0PGJvb2xlYW4+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VMRUNUIGNvbGxlY3Rpb25fYXZnKHMpIEZST00gJXMiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZSgiRnVuY3Rpb24gc3lzdGVtLmNvbGxlY3Rpb25fYXZnIHJlcXVpcmVzIGEgbnVtZXJpYyBzZXQvbGlzdCBhcmd1bWVudCwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBmb3VuZCBhcmd1bWVudCBmbCBvZiB0eXBlIGZyb3plbjxsaXN0PHRleHQ+PiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFTEVDVCBjb2xsZWN0aW9uX2F2ZyhmbCkgRlJPTSAlcyIpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKCJGdW5jdGlvbiBzeXN0ZW0uY29sbGVjdGlvbl9hdmcgcmVxdWlyZXMgYSBudW1lcmljIHNldC9saXN0IGFyZ3VtZW50LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGZvdW5kIGFyZ3VtZW50IGZzIG9mIHR5cGUgZnJvemVuPHNldDxib29sZWFuPj4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTRUxFQ1QgY29sbGVjdGlvbl9hdmcoZnMpIEZST00gJXMiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaW55SW50KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoQ1FMM1R5cGUuTmF0aXZlLlRJTllJTlQpOworCisgICAgICAgIC8vIGVtcHR5IGNvbGxlY3Rpb25zCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF9rZXlzKG0pLCBtYXBfdmFsdWVzKG0pLCBtYXBfa2V5cyhmbSksIG1hcF92YWx1ZXMoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgc2V0KCksIGxpc3QoKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGwpLCBjb2xsZWN0aW9uX2NvdW50KHMpLCBjb2xsZWN0aW9uX2NvdW50KG0pLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xsZWN0aW9uX2NvdW50KGZsKSwgY29sbGVjdGlvbl9jb3VudChmcyksIGNvbGxlY3Rpb25fY291bnQoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgbnVsbCwgMCwgMCwgMCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21pbihsKSwgY29sbGVjdGlvbl9taW4ocyksIGNvbGxlY3Rpb25fbWluKGZsKSwgY29sbGVjdGlvbl9taW4oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21heChsKSwgY29sbGVjdGlvbl9tYXgocyksIGNvbGxlY3Rpb25fbWF4KGZsKSwgY29sbGVjdGlvbl9tYXgoZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX3N1bShsKSwgY29sbGVjdGlvbl9zdW0ocyksIGNvbGxlY3Rpb25fc3VtKGZsKSwgY29sbGVjdGlvbl9zdW0oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgKGJ5dGUpIDAsIChieXRlKSAwKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fYXZnKGwpLCBjb2xsZWN0aW9uX2F2ZyhzKSwgY29sbGVjdGlvbl9hdmcoZmwpLCBjb2xsZWN0aW9uX2F2ZyhmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhudWxsLCBudWxsLCAoYnl0ZSkgMCwgKGJ5dGUpIDApKTsKKworICAgICAgICAvLyBub3QgZW1wdHkgY29sbGVjdGlvbnMKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwsIGZsLCBzLCBmcywgbSwgZm0pICBWQUxVRVMgKDEsID8sID8sID8sID8sID8sID8pIiwKKyAgICAgICAgICAgICAgICBsaXN0KChieXRlKSAxLCAoYnl0ZSkgMiksIHNldCgoYnl0ZSkgMSwgKGJ5dGUpIDIpLAorICAgICAgICAgICAgICAgIGxpc3QoKGJ5dGUpIDEsIChieXRlKSAyKSwgc2V0KChieXRlKSAxLCAoYnl0ZSkgMiksCisgICAgICAgICAgICAgICAgbWFwKChieXRlKSAxLCAoYnl0ZSkgMiwgKGJ5dGUpIDMsIChieXRlKSA0KSwKKyAgICAgICAgICAgICAgICBtYXAoKGJ5dGUpIDEsIChieXRlKSAyLCAoYnl0ZSkgMywgKGJ5dGUpIDQpKTsKKworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfa2V5cyhtKSwgbWFwX2tleXMoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coc2V0KChieXRlKSAxLCAoYnl0ZSkgMyksIHNldCgoYnl0ZSkgMSwgKGJ5dGUpIDMpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF92YWx1ZXMobSksIG1hcF92YWx1ZXMoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobGlzdCgoYnl0ZSkgMiwgKGJ5dGUpIDQpLCBsaXN0KChieXRlKSAyLCAoYnl0ZSkgNCkpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9jb3VudChsKSwgY29sbGVjdGlvbl9jb3VudChzKSwgY29sbGVjdGlvbl9jb3VudChtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KDIsIDIsIDIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9jb3VudChmbCksIGNvbGxlY3Rpb25fY291bnQoZnMpLCBjb2xsZWN0aW9uX2NvdW50KGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KDIsIDIsIDIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9taW4obCksIGNvbGxlY3Rpb25fbWluKHMpLCBjb2xsZWN0aW9uX21pbihmbCksIGNvbGxlY3Rpb25fbWluKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KChieXRlKSAxLCAoYnl0ZSkgMSwgKGJ5dGUpIDEsIChieXRlKSAxKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fbWF4KGwpLCBjb2xsZWN0aW9uX21heChzKSwgY29sbGVjdGlvbl9tYXgoZmwpLCBjb2xsZWN0aW9uX21heChmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygoYnl0ZSkgMiwgKGJ5dGUpIDIsIChieXRlKSAyLCAoYnl0ZSkgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX3N1bShsKSwgY29sbGVjdGlvbl9zdW0ocyksIGNvbGxlY3Rpb25fc3VtKGZsKSwgY29sbGVjdGlvbl9zdW0oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coKGJ5dGUpIDMsIChieXRlKSAzLCAoYnl0ZSkgMywgKGJ5dGUpIDMpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9hdmcobCksIGNvbGxlY3Rpb25fYXZnKHMpLCBjb2xsZWN0aW9uX2F2ZyhmbCksIGNvbGxlY3Rpb25fYXZnKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KChieXRlKSAxLCAoYnl0ZSkgMSwgKGJ5dGUpIDEsIChieXRlKSAxKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U21hbGxJbnQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZShDUUwzVHlwZS5OYXRpdmUuU01BTExJTlQpOworCisgICAgICAgIC8vIGVtcHR5IGNvbGxlY3Rpb25zCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF9rZXlzKG0pLCBtYXBfdmFsdWVzKG0pLCBtYXBfa2V5cyhmbSksIG1hcF92YWx1ZXMoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgc2V0KCksIGxpc3QoKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGwpLCBjb2xsZWN0aW9uX2NvdW50KHMpLCBjb2xsZWN0aW9uX2NvdW50KG0pLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xsZWN0aW9uX2NvdW50KGZsKSwgY29sbGVjdGlvbl9jb3VudChmcyksIGNvbGxlY3Rpb25fY291bnQoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgbnVsbCwgMCwgMCwgMCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21pbihsKSwgY29sbGVjdGlvbl9taW4ocyksIGNvbGxlY3Rpb25fbWluKGZsKSwgY29sbGVjdGlvbl9taW4oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21heChsKSwgY29sbGVjdGlvbl9tYXgocyksIGNvbGxlY3Rpb25fbWF4KGZsKSwgY29sbGVjdGlvbl9tYXgoZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX3N1bShsKSwgY29sbGVjdGlvbl9zdW0ocyksIGNvbGxlY3Rpb25fc3VtKGZsKSwgY29sbGVjdGlvbl9zdW0oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgKHNob3J0KSAwLCAoc2hvcnQpIDApKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9hdmcobCksIGNvbGxlY3Rpb25fYXZnKHMpLCBjb2xsZWN0aW9uX2F2ZyhmbCksIGNvbGxlY3Rpb25fYXZnKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIChzaG9ydCkgMCwgKHNob3J0KSAwKSk7CisKKyAgICAgICAgLy8gbm90IGVtcHR5IGNvbGxlY3Rpb25zCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsLCBmbCwgcywgZnMsIG0sIGZtKSAgVkFMVUVTICgxLCA/LCA/LCA/LCA/LCA/LCA/KSIsCisgICAgICAgICAgICAgICAgbGlzdCgoc2hvcnQpIDEsIChzaG9ydCkgMiksIHNldCgoc2hvcnQpIDEsIChzaG9ydCkgMiksCisgICAgICAgICAgICAgICAgbGlzdCgoc2hvcnQpIDEsIChzaG9ydCkgMiksIHNldCgoc2hvcnQpIDEsIChzaG9ydCkgMiksCisgICAgICAgICAgICAgICAgbWFwKChzaG9ydCkgMSwgKHNob3J0KSAyLCAoc2hvcnQpIDMsIChzaG9ydCkgNCksCisgICAgICAgICAgICAgICAgbWFwKChzaG9ydCkgMSwgKHNob3J0KSAyLCAoc2hvcnQpIDMsIChzaG9ydCkgNCkpOworCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF9rZXlzKG0pLCBtYXBfa2V5cyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhzZXQoKHNob3J0KSAxLCAoc2hvcnQpIDMpLCBzZXQoKHNob3J0KSAxLCAoc2hvcnQpIDMpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF92YWx1ZXMobSksIG1hcF92YWx1ZXMoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobGlzdCgoc2hvcnQpIDIsIChzaG9ydCkgNCksIGxpc3QoKHNob3J0KSAyLCAoc2hvcnQpIDQpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQobCksIGNvbGxlY3Rpb25fY291bnQocyksIGNvbGxlY3Rpb25fY291bnQobSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCAyLCAyKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQoZmwpLCBjb2xsZWN0aW9uX2NvdW50KGZzKSwgY29sbGVjdGlvbl9jb3VudChmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCAyLCAyKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fbWluKGwpLCBjb2xsZWN0aW9uX21pbihzKSwgY29sbGVjdGlvbl9taW4oZmwpLCBjb2xsZWN0aW9uX21pbihmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygoc2hvcnQpIDEsIChzaG9ydCkgMSwgKHNob3J0KSAxLCAoc2hvcnQpIDEpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9tYXgobCksIGNvbGxlY3Rpb25fbWF4KHMpLCBjb2xsZWN0aW9uX21heChmbCksIGNvbGxlY3Rpb25fbWF4KGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KChzaG9ydCkgMiwgKHNob3J0KSAyLCAoc2hvcnQpIDIsIChzaG9ydCkgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX3N1bShsKSwgY29sbGVjdGlvbl9zdW0ocyksIGNvbGxlY3Rpb25fc3VtKGZsKSwgY29sbGVjdGlvbl9zdW0oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coKHNob3J0KSAzLCAoc2hvcnQpIDMsIChzaG9ydCkgMywgKHNob3J0KSAzKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fYXZnKGwpLCBjb2xsZWN0aW9uX2F2ZyhzKSwgY29sbGVjdGlvbl9hdmcoZmwpLCBjb2xsZWN0aW9uX2F2ZyhmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygoc2hvcnQpIDEsIChzaG9ydCkgMSwgKHNob3J0KSAxLCAoc2hvcnQpIDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZShDUUwzVHlwZS5OYXRpdmUuSU5UKTsKKworICAgICAgICAvLyBlbXB0eSBjb2xsZWN0aW9ucworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfa2V5cyhtKSwgbWFwX3ZhbHVlcyhtKSwgbWFwX2tleXMoZm0pLCBtYXBfdmFsdWVzKGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIHNldCgpLCBsaXN0KCkpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9jb3VudChsKSwgY29sbGVjdGlvbl9jb3VudChzKSwgY29sbGVjdGlvbl9jb3VudChtKSwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sbGVjdGlvbl9jb3VudChmbCksIGNvbGxlY3Rpb25fY291bnQoZnMpLCBjb2xsZWN0aW9uX2NvdW50KGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIDAsIDAsIDApKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9taW4obCksIGNvbGxlY3Rpb25fbWluKHMpLCBjb2xsZWN0aW9uX21pbihmbCksIGNvbGxlY3Rpb25fbWluKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9tYXgobCksIGNvbGxlY3Rpb25fbWF4KHMpLCBjb2xsZWN0aW9uX21heChmbCksIGNvbGxlY3Rpb25fbWF4KGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9zdW0obCksIGNvbGxlY3Rpb25fc3VtKHMpLCBjb2xsZWN0aW9uX3N1bShmbCksIGNvbGxlY3Rpb25fc3VtKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIDAsIDApKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9hdmcobCksIGNvbGxlY3Rpb25fYXZnKHMpLCBjb2xsZWN0aW9uX2F2ZyhmbCksIGNvbGxlY3Rpb25fYXZnKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIDAsIDApKTsKKworICAgICAgICAvLyBub3QgZW1wdHkgY29sbGVjdGlvbnMKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwsIGZsLCBzLCBmcywgbSwgZm0pICBWQUxVRVMgKDEsID8sID8sID8sID8sID8sID8pIiwKKyAgICAgICAgICAgICAgICBsaXN0KDEsIDIpLCBzZXQoMSwgMiksIGxpc3QoMSwgMiksIHNldCgxLCAyKSwgbWFwKDEsIDIsIDMsIDQpLCBtYXAoMSwgMiwgMywgNCkpOworCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF9rZXlzKG0pLCBtYXBfa2V5cyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhzZXQoMSwgMyksIHNldCgxLCAzKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfdmFsdWVzKG0pLCBtYXBfdmFsdWVzKGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KGxpc3QoMiwgNCksIGxpc3QoMiwgNCkpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9jb3VudChsKSwgY29sbGVjdGlvbl9jb3VudChzKSwgY29sbGVjdGlvbl9jb3VudChtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KDIsIDIsIDIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9jb3VudChmbCksIGNvbGxlY3Rpb25fY291bnQoZnMpLCBjb2xsZWN0aW9uX2NvdW50KGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KDIsIDIsIDIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9taW4obCksIGNvbGxlY3Rpb25fbWluKHMpLCBjb2xsZWN0aW9uX21pbihmbCksIGNvbGxlY3Rpb25fbWluKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KDEsIDEsIDEsIDEpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9tYXgobCksIGNvbGxlY3Rpb25fbWF4KHMpLCBjb2xsZWN0aW9uX21heChmbCksIGNvbGxlY3Rpb25fbWF4KGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KDIsIDIsIDIsIDIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9zdW0obCksIGNvbGxlY3Rpb25fc3VtKHMpLCBjb2xsZWN0aW9uX3N1bShmbCksIGNvbGxlY3Rpb25fc3VtKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KDMsIDMsIDMsIDMpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9hdmcobCksIGNvbGxlY3Rpb25fYXZnKHMpLCBjb2xsZWN0aW9uX2F2ZyhmbCksIGNvbGxlY3Rpb25fYXZnKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KDEsIDEsIDEsIDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCaWdJbnQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZShDUUwzVHlwZS5OYXRpdmUuQklHSU5UKTsKKworICAgICAgICAvLyBlbXB0eSBjb2xsZWN0aW9ucworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfa2V5cyhtKSwgbWFwX3ZhbHVlcyhtKSwgbWFwX2tleXMoZm0pLCBtYXBfdmFsdWVzKGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIHNldCgpLCBsaXN0KCkpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9jb3VudChsKSwgY29sbGVjdGlvbl9jb3VudChzKSwgY29sbGVjdGlvbl9jb3VudChtKSwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sbGVjdGlvbl9jb3VudChmbCksIGNvbGxlY3Rpb25fY291bnQoZnMpLCBjb2xsZWN0aW9uX2NvdW50KGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIDAsIDAsIDApKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9taW4obCksIGNvbGxlY3Rpb25fbWluKHMpLCBjb2xsZWN0aW9uX21pbihmbCksIGNvbGxlY3Rpb25fbWluKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9tYXgobCksIGNvbGxlY3Rpb25fbWF4KHMpLCBjb2xsZWN0aW9uX21heChmbCksIGNvbGxlY3Rpb25fbWF4KGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9zdW0obCksIGNvbGxlY3Rpb25fc3VtKHMpLCBjb2xsZWN0aW9uX3N1bShmbCksIGNvbGxlY3Rpb25fc3VtKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIDBMLCAwTCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2F2ZyhsKSwgY29sbGVjdGlvbl9hdmcocyksIGNvbGxlY3Rpb25fYXZnKGZsKSwgY29sbGVjdGlvbl9hdmcoZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgMEwsIDBMKSk7CisKKyAgICAgICAgLy8gbm90IGVtcHR5IGNvbGxlY3Rpb25zCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsLCBmbCwgcywgZnMsIG0sIGZtKSAgVkFMVUVTICgxLCA/LCA/LCA/LCA/LCA/LCA/KSIsCisgICAgICAgICAgICAgICAgbGlzdCgxTCwgMkwpLCBzZXQoMUwsIDJMKSwgbGlzdCgxTCwgMkwpLCBzZXQoMUwsIDJMKSwgbWFwKDFMLCAyTCwgM0wsIDRMKSwgbWFwKDFMLCAyTCwgM0wsIDRMKSk7CisKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWFwX2tleXMobSksIG1hcF9rZXlzKGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KHNldCgxTCwgM0wpLCBzZXQoMUwsIDNMKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfdmFsdWVzKG0pLCBtYXBfdmFsdWVzKGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KGxpc3QoMkwsIDRMKSwgbGlzdCgyTCwgNEwpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQobCksIGNvbGxlY3Rpb25fY291bnQocyksIGNvbGxlY3Rpb25fY291bnQobSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCAyLCAyKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQoZmwpLCBjb2xsZWN0aW9uX2NvdW50KGZzKSwgY29sbGVjdGlvbl9jb3VudChmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCAyLCAyKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fbWluKGwpLCBjb2xsZWN0aW9uX21pbihzKSwgY29sbGVjdGlvbl9taW4oZmwpLCBjb2xsZWN0aW9uX21pbihmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygxTCwgMUwsIDFMLCAxTCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21heChsKSwgY29sbGVjdGlvbl9tYXgocyksIGNvbGxlY3Rpb25fbWF4KGZsKSwgY29sbGVjdGlvbl9tYXgoZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMkwsIDJMLCAyTCwgMkwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9zdW0obCksIGNvbGxlY3Rpb25fc3VtKHMpLCBjb2xsZWN0aW9uX3N1bShmbCksIGNvbGxlY3Rpb25fc3VtKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KDNMLCAzTCwgM0wsIDNMKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fYXZnKGwpLCBjb2xsZWN0aW9uX2F2ZyhzKSwgY29sbGVjdGlvbl9hdmcoZmwpLCBjb2xsZWN0aW9uX2F2ZyhmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygxTCwgMUwsIDFMLCAxTCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZsb2F0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoQ1FMM1R5cGUuTmF0aXZlLkZMT0FUKTsKKworICAgICAgICAvLyBlbXB0eSBjb2xsZWN0aW9ucworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfa2V5cyhtKSwgbWFwX3ZhbHVlcyhtKSwgbWFwX2tleXMoZm0pLCBtYXBfdmFsdWVzKGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIHNldCgpLCBsaXN0KCkpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9jb3VudChsKSwgY29sbGVjdGlvbl9jb3VudChzKSwgY29sbGVjdGlvbl9jb3VudChtKSwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sbGVjdGlvbl9jb3VudChmbCksIGNvbGxlY3Rpb25fY291bnQoZnMpLCBjb2xsZWN0aW9uX2NvdW50KGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIDAsIDAsIDApKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9taW4obCksIGNvbGxlY3Rpb25fbWluKHMpLCBjb2xsZWN0aW9uX21pbihmbCksIGNvbGxlY3Rpb25fbWluKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9tYXgobCksIGNvbGxlY3Rpb25fbWF4KHMpLCBjb2xsZWN0aW9uX21heChmbCksIGNvbGxlY3Rpb25fbWF4KGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9zdW0obCksIGNvbGxlY3Rpb25fc3VtKHMpLCBjb2xsZWN0aW9uX3N1bShmbCksIGNvbGxlY3Rpb25fc3VtKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIDBmLCAwZikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2F2ZyhsKSwgY29sbGVjdGlvbl9hdmcocyksIGNvbGxlY3Rpb25fYXZnKGZsKSwgY29sbGVjdGlvbl9hdmcoZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgMGYsIDBmKSk7CisKKyAgICAgICAgLy8gbm90IGVtcHR5IGNvbGxlY3Rpb25zCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsLCBmbCwgcywgZnMsIG0sIGZtKSAgVkFMVUVTICgxLCA/LCA/LCA/LCA/LCA/LCA/KSIsCisgICAgICAgICAgICAgICAgbGlzdCgxLjIzZiwgMi4zNGYpLCBsaXN0KDEuMjNmLCAyLjM0ZiksCisgICAgICAgICAgICAgICAgc2V0KDEuMjNmLCAyLjM0ZiksIHNldCgxLjIzZiwgMi4zNGYpLAorICAgICAgICAgICAgICAgIG1hcCgxLjIzZiwgMi4zNGYsIDMuNDVmLCA0LjU2ZiksIG1hcCgxLjIzZiwgMi4zNGYsIDMuNDVmLCA0LjU2ZikpOworCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF9rZXlzKG0pLCBtYXBfa2V5cyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhzZXQoMS4yM2YsIDMuNDVmKSwgc2V0KDEuMjNmLCAzLjQ1ZikpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWFwX3ZhbHVlcyhtKSwgbWFwX3ZhbHVlcyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhsaXN0KDIuMzRmLCA0LjU2ZiksIGxpc3QoMi4zNGYsIDQuNTZmKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGwpLCBjb2xsZWN0aW9uX2NvdW50KHMpLCBjb2xsZWN0aW9uX2NvdW50KG0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMiwgMiwgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGZsKSwgY29sbGVjdGlvbl9jb3VudChmcyksIGNvbGxlY3Rpb25fY291bnQoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMiwgMiwgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21pbihsKSwgY29sbGVjdGlvbl9taW4ocyksIGNvbGxlY3Rpb25fbWluKGZsKSwgY29sbGVjdGlvbl9taW4oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMS4yM2YsIDEuMjNmLCAxLjIzZiwgMS4yM2YpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9tYXgobCksIGNvbGxlY3Rpb25fbWF4KHMpLCBjb2xsZWN0aW9uX21heChmbCksIGNvbGxlY3Rpb25fbWF4KGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KDIuMzRmLCAyLjM0ZiwgMi4zNGYsIDIuMzRmKSk7CisKKyAgICAgICAgZmxvYXQgc3VtID0gMS4yM2YgKyAyLjM0ZjsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9zdW0obCksIGNvbGxlY3Rpb25fc3VtKHMpLCBjb2xsZWN0aW9uX3N1bShmbCksIGNvbGxlY3Rpb25fc3VtKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KHN1bSwgc3VtLCBzdW0sIHN1bSkpOworCisgICAgICAgIGZsb2F0IGF2ZyA9ICgxLjIzZiArIDIuMzRmKSAvIDI7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fYXZnKGwpLCBjb2xsZWN0aW9uX2F2ZyhzKSwgY29sbGVjdGlvbl9hdmcoZmwpLCBjb2xsZWN0aW9uX2F2ZyhmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhhdmcsIGF2ZywgYXZnLCBhdmcpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZShDUUwzVHlwZS5OYXRpdmUuRE9VQkxFKTsKKworICAgICAgICAvLyBlbXB0eSBjb2xsZWN0aW9ucworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfa2V5cyhtKSwgbWFwX3ZhbHVlcyhtKSwgbWFwX2tleXMoZm0pLCBtYXBfdmFsdWVzKGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIHNldCgpLCBsaXN0KCkpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9jb3VudChsKSwgY29sbGVjdGlvbl9jb3VudChzKSwgY29sbGVjdGlvbl9jb3VudChtKSwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sbGVjdGlvbl9jb3VudChmbCksIGNvbGxlY3Rpb25fY291bnQoZnMpLCBjb2xsZWN0aW9uX2NvdW50KGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIDAsIDAsIDApKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9taW4obCksIGNvbGxlY3Rpb25fbWluKHMpLCBjb2xsZWN0aW9uX21pbihmbCksIGNvbGxlY3Rpb25fbWluKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9tYXgobCksIGNvbGxlY3Rpb25fbWF4KHMpLCBjb2xsZWN0aW9uX21heChmbCksIGNvbGxlY3Rpb25fbWF4KGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9zdW0obCksIGNvbGxlY3Rpb25fc3VtKHMpLCBjb2xsZWN0aW9uX3N1bShmbCksIGNvbGxlY3Rpb25fc3VtKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIDBkLCAwZCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2F2ZyhsKSwgY29sbGVjdGlvbl9hdmcocyksIGNvbGxlY3Rpb25fYXZnKGZsKSwgY29sbGVjdGlvbl9hdmcoZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgMGQsIDBkKSk7CisKKyAgICAgICAgLy8gbm90IGVtcHR5IGNvbGxlY3Rpb25zCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsLCBmbCwgcywgZnMsIG0sIGZtKSAgVkFMVUVTICgxLCA/LCA/LCA/LCA/LCA/LCA/KSIsCisgICAgICAgICAgICAgICAgbGlzdCgxLjIzZCwgMi4zNGQpLCBsaXN0KDEuMjNkLCAyLjM0ZCksCisgICAgICAgICAgICAgICAgc2V0KDEuMjNkLCAyLjM0ZCksIHNldCgxLjIzZCwgMi4zNGQpLAorICAgICAgICAgICAgICAgIG1hcCgxLjIzZCwgMi4zNGQsIDMuNDVkLCA0LjU2ZCksIG1hcCgxLjIzZCwgMi4zNGQsIDMuNDVkLCA0LjU2ZCkpOworCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF9rZXlzKG0pLCBtYXBfa2V5cyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhzZXQoMS4yM2QsIDMuNDVkKSwgc2V0KDEuMjNkLCAzLjQ1ZCkpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWFwX3ZhbHVlcyhtKSwgbWFwX3ZhbHVlcyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhsaXN0KDIuMzRkLCA0LjU2ZCksIGxpc3QoMi4zNGQsIDQuNTZkKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGwpLCBjb2xsZWN0aW9uX2NvdW50KHMpLCBjb2xsZWN0aW9uX2NvdW50KG0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMiwgMiwgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGZsKSwgY29sbGVjdGlvbl9jb3VudChmcyksIGNvbGxlY3Rpb25fY291bnQoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMiwgMiwgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21pbihsKSwgY29sbGVjdGlvbl9taW4ocyksIGNvbGxlY3Rpb25fbWluKGZsKSwgY29sbGVjdGlvbl9taW4oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMS4yM2QsIDEuMjNkLCAxLjIzZCwgMS4yM2QpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9tYXgobCksIGNvbGxlY3Rpb25fbWF4KHMpLCBjb2xsZWN0aW9uX21heChmbCksIGNvbGxlY3Rpb25fbWF4KGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KDIuMzRkLCAyLjM0ZCwgMi4zNGQsIDIuMzRkKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fc3VtKGwpLCBjb2xsZWN0aW9uX3N1bShzKSwgY29sbGVjdGlvbl9zdW0oZmwpLCBjb2xsZWN0aW9uX3N1bShmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygzLjU3ZCwgMy41N2QsIDMuNTdkLCAzLjU3ZCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2F2ZyhsKSwgY29sbGVjdGlvbl9hdmcocyksIGNvbGxlY3Rpb25fYXZnKGZsKSwgY29sbGVjdGlvbl9hdmcoZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMS43ODVkLCAxLjc4NWQsIDEuNzg1ZCwgMS43ODVkKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFySW50KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoQ1FMM1R5cGUuTmF0aXZlLlZBUklOVCk7CisKKyAgICAgICAgLy8gZW1wdHkgY29sbGVjdGlvbnMKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWFwX2tleXMobSksIG1hcF92YWx1ZXMobSksIG1hcF9rZXlzKGZtKSwgbWFwX3ZhbHVlcyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhudWxsLCBudWxsLCBzZXQoKSwgbGlzdCgpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQobCksIGNvbGxlY3Rpb25fY291bnQocyksIGNvbGxlY3Rpb25fY291bnQobSksICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGxlY3Rpb25fY291bnQoZmwpLCBjb2xsZWN0aW9uX2NvdW50KGZzKSwgY29sbGVjdGlvbl9jb3VudChmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhudWxsLCBudWxsLCBudWxsLCAwLCAwLCAwKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fbWluKGwpLCBjb2xsZWN0aW9uX21pbihzKSwgY29sbGVjdGlvbl9taW4oZmwpLCBjb2xsZWN0aW9uX21pbihmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhudWxsLCBudWxsLCBudWxsLCBudWxsKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fbWF4KGwpLCBjb2xsZWN0aW9uX21heChzKSwgY29sbGVjdGlvbl9tYXgoZmwpLCBjb2xsZWN0aW9uX21heChmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhudWxsLCBudWxsLCBudWxsLCBudWxsKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fc3VtKGwpLCBjb2xsZWN0aW9uX3N1bShzKSwgY29sbGVjdGlvbl9zdW0oZmwpLCBjb2xsZWN0aW9uX3N1bShmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhudWxsLCBudWxsLCBCaWdJbnRlZ2VyLlpFUk8sIEJpZ0ludGVnZXIuWkVSTykpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2F2ZyhsKSwgY29sbGVjdGlvbl9hdmcocyksIGNvbGxlY3Rpb25fYXZnKGZsKSwgY29sbGVjdGlvbl9hdmcoZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgQmlnSW50ZWdlci5aRVJPLCBCaWdJbnRlZ2VyLlpFUk8pKTsKKworICAgICAgICAvLyBub3QgZW1wdHkgY29sbGVjdGlvbnMKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwsIGZsLCBzLCBmcywgbSwgZm0pICBWQUxVRVMgKDEsID8sID8sID8sID8sID8sID8pIiwKKyAgICAgICAgICAgICAgICBsaXN0KGJpZ2ludDEsIGJpZ2ludDIpLCBsaXN0KGJpZ2ludDEsIGJpZ2ludDIpLAorICAgICAgICAgICAgICAgIHNldChiaWdpbnQxLCBiaWdpbnQyKSwgc2V0KGJpZ2ludDEsIGJpZ2ludDIpLAorICAgICAgICAgICAgICAgIG1hcChiaWdpbnQxLCBiaWdpbnQyLCBiaWdpbnQyLCBiaWdpbnQxKSwgbWFwKGJpZ2ludDEsIGJpZ2ludDIsIGJpZ2ludDIsIGJpZ2ludDEpKTsKKworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfa2V5cyhtKSwgbWFwX2tleXMoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coc2V0KGJpZ2ludDEsIGJpZ2ludDIpLCBzZXQoYmlnaW50MSwgYmlnaW50MikpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWFwX3ZhbHVlcyhtKSwgbWFwX3ZhbHVlcyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhsaXN0KGJpZ2ludDIsIGJpZ2ludDEpLCBsaXN0KGJpZ2ludDIsIGJpZ2ludDEpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQobCksIGNvbGxlY3Rpb25fY291bnQocyksIGNvbGxlY3Rpb25fY291bnQobSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCAyLCAyKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQoZmwpLCBjb2xsZWN0aW9uX2NvdW50KGZzKSwgY29sbGVjdGlvbl9jb3VudChmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCAyLCAyKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fbWluKGwpLCBjb2xsZWN0aW9uX21pbihzKSwgY29sbGVjdGlvbl9taW4oZmwpLCBjb2xsZWN0aW9uX21pbihmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhiaWdpbnQxLCBiaWdpbnQxLCBiaWdpbnQxLCBiaWdpbnQxKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fbWF4KGwpLCBjb2xsZWN0aW9uX21heChzKSwgY29sbGVjdGlvbl9tYXgoZmwpLCBjb2xsZWN0aW9uX21heChmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhiaWdpbnQyLCBiaWdpbnQyLCBiaWdpbnQyLCBiaWdpbnQyKSk7CisKKyAgICAgICAgQmlnSW50ZWdlciBzdW0gPSBiaWdpbnQxLmFkZChiaWdpbnQyKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9zdW0obCksIGNvbGxlY3Rpb25fc3VtKHMpLCBjb2xsZWN0aW9uX3N1bShmbCksIGNvbGxlY3Rpb25fc3VtKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KHN1bSwgc3VtLCBzdW0sIHN1bSkpOworCisgICAgICAgIEJpZ0ludGVnZXIgYXZnID0gYmlnaW50MS5hZGQoYmlnaW50MikuZGl2aWRlKEJpZ0ludGVnZXIudmFsdWVPZigyKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fYXZnKGwpLCBjb2xsZWN0aW9uX2F2ZyhzKSwgY29sbGVjdGlvbl9hdmcoZmwpLCBjb2xsZWN0aW9uX2F2ZyhmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhhdmcsIGF2ZywgYXZnLCBhdmcpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWNpbWFsKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoQ1FMM1R5cGUuTmF0aXZlLkRFQ0lNQUwpOworCisgICAgICAgIC8vIGVtcHR5IGNvbGxlY3Rpb25zCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF9rZXlzKG0pLCBtYXBfdmFsdWVzKG0pLCBtYXBfa2V5cyhmbSksIG1hcF92YWx1ZXMoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgc2V0KCksIGxpc3QoKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGwpLCBjb2xsZWN0aW9uX2NvdW50KHMpLCBjb2xsZWN0aW9uX2NvdW50KG0pLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xsZWN0aW9uX2NvdW50KGZsKSwgY29sbGVjdGlvbl9jb3VudChmcyksIGNvbGxlY3Rpb25fY291bnQoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgbnVsbCwgMCwgMCwgMCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21pbihsKSwgY29sbGVjdGlvbl9taW4ocyksIGNvbGxlY3Rpb25fbWluKGZsKSwgY29sbGVjdGlvbl9taW4oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21heChsKSwgY29sbGVjdGlvbl9tYXgocyksIGNvbGxlY3Rpb25fbWF4KGZsKSwgY29sbGVjdGlvbl9tYXgoZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX3N1bShsKSwgY29sbGVjdGlvbl9zdW0ocyksIGNvbGxlY3Rpb25fc3VtKGZsKSwgY29sbGVjdGlvbl9zdW0oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgQmlnRGVjaW1hbC5aRVJPLCBCaWdEZWNpbWFsLlpFUk8pKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9hdmcobCksIGNvbGxlY3Rpb25fYXZnKHMpLCBjb2xsZWN0aW9uX2F2ZyhmbCksIGNvbGxlY3Rpb25fYXZnKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIEJpZ0RlY2ltYWwuWkVSTywgQmlnRGVjaW1hbC5aRVJPKSk7CisKKyAgICAgICAgLy8gbm90IGVtcHR5IGNvbGxlY3Rpb25zCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsLCBmbCwgcywgZnMsIG0sIGZtKSAgVkFMVUVTICgxLCA/LCA/LCA/LCA/LCA/LCA/KSIsCisgICAgICAgICAgICAgICAgbGlzdChiaWdkZWNpbWFsMSwgYmlnZGVjaW1hbDIpLCBsaXN0KGJpZ2RlY2ltYWwxLCBiaWdkZWNpbWFsMiksCisgICAgICAgICAgICAgICAgc2V0KGJpZ2RlY2ltYWwxLCBiaWdkZWNpbWFsMiksIHNldChiaWdkZWNpbWFsMSwgYmlnZGVjaW1hbDIpLAorICAgICAgICAgICAgICAgIG1hcChiaWdkZWNpbWFsMSwgYmlnZGVjaW1hbDIsIGJpZ2RlY2ltYWwyLCBiaWdkZWNpbWFsMSksCisgICAgICAgICAgICAgICAgbWFwKGJpZ2RlY2ltYWwxLCBiaWdkZWNpbWFsMiwgYmlnZGVjaW1hbDIsIGJpZ2RlY2ltYWwxKSk7CisKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWFwX2tleXMobSksIG1hcF9rZXlzKGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KHNldChiaWdkZWNpbWFsMSwgYmlnZGVjaW1hbDIpLCBzZXQoYmlnZGVjaW1hbDEsIGJpZ2RlY2ltYWwyKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfdmFsdWVzKG0pLCBtYXBfdmFsdWVzKGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KGxpc3QoYmlnZGVjaW1hbDIsIGJpZ2RlY2ltYWwxKSwgbGlzdChiaWdkZWNpbWFsMiwgYmlnZGVjaW1hbDEpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQobCksIGNvbGxlY3Rpb25fY291bnQocyksIGNvbGxlY3Rpb25fY291bnQobSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCAyLCAyKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQoZmwpLCBjb2xsZWN0aW9uX2NvdW50KGZzKSwgY29sbGVjdGlvbl9jb3VudChmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCAyLCAyKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fbWluKGwpLCBjb2xsZWN0aW9uX21pbihzKSwgY29sbGVjdGlvbl9taW4oZmwpLCBjb2xsZWN0aW9uX21pbihmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhiaWdkZWNpbWFsMSwgYmlnZGVjaW1hbDEsIGJpZ2RlY2ltYWwxLCBiaWdkZWNpbWFsMSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21heChsKSwgY29sbGVjdGlvbl9tYXgocyksIGNvbGxlY3Rpb25fbWF4KGZsKSwgY29sbGVjdGlvbl9tYXgoZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coYmlnZGVjaW1hbDIsIGJpZ2RlY2ltYWwyLCBiaWdkZWNpbWFsMiwgYmlnZGVjaW1hbDIpKTsKKworICAgICAgICBCaWdEZWNpbWFsIHN1bSA9IGJpZ2RlY2ltYWwxLmFkZChiaWdkZWNpbWFsMik7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fc3VtKGwpLCBjb2xsZWN0aW9uX3N1bShzKSwgY29sbGVjdGlvbl9zdW0oZmwpLCBjb2xsZWN0aW9uX3N1bShmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhzdW0sIHN1bSwgc3VtLCBzdW0pKTsKKworICAgICAgICBCaWdEZWNpbWFsIGF2ZyA9IGJpZ2RlY2ltYWwxLmFkZChiaWdkZWNpbWFsMikuZGl2aWRlKEJpZ0RlY2ltYWwudmFsdWVPZigyKSwgUm91bmRpbmdNb2RlLkhBTEZfRVZFTik7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fYXZnKGwpLCBjb2xsZWN0aW9uX2F2ZyhzKSwgY29sbGVjdGlvbl9hdmcoZmwpLCBjb2xsZWN0aW9uX2F2ZyhmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhhdmcsIGF2ZywgYXZnLCBhdmcpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc2NpaSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKENRTDNUeXBlLk5hdGl2ZS5BU0NJSSk7CisKKyAgICAgICAgLy8gZW1wdHkgY29sbGVjdGlvbnMKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWFwX2tleXMobSksIG1hcF92YWx1ZXMobSksIG1hcF9rZXlzKGZtKSwgbWFwX3ZhbHVlcyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhudWxsLCBudWxsLCBzZXQoKSwgbGlzdCgpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQobCksIGNvbGxlY3Rpb25fY291bnQocyksIGNvbGxlY3Rpb25fY291bnQobSksICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGxlY3Rpb25fY291bnQoZmwpLCBjb2xsZWN0aW9uX2NvdW50KGZzKSwgY29sbGVjdGlvbl9jb3VudChmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhudWxsLCBudWxsLCBudWxsLCAwLCAwLCAwKSk7CisKKyAgICAgICAgLy8gbm90IGVtcHR5IGNvbGxlY3Rpb25zCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsLCBmbCwgcywgZnMsIG0sIGZtKSAgVkFMVUVTICgxLCA/LCA/LCA/LCA/LCA/LCA/KSIsCisgICAgICAgICAgICAgICAgbGlzdCgiYWJjIiwgImJjZCIpLCBzZXQoImFiYyIsICJiY2QiKSwKKyAgICAgICAgICAgICAgICBsaXN0KCJhYmMiLCAiYmNkIiksIHNldCgiYWJjIiwgImJjZCIpLAorICAgICAgICAgICAgICAgIG1hcCgiYWJjIiwgImJjZCIsICJjZGUiLCAiZGVmIiksIG1hcCgiYWJjIiwgImJjZCIsICJjZGUiLCAiZGVmIikpOworCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF9rZXlzKG0pLCBtYXBfa2V5cyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhzZXQoImFiYyIsICJjZGUiKSwgc2V0KCJhYmMiLCAiY2RlIikpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWFwX3ZhbHVlcyhtKSwgbWFwX3ZhbHVlcyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhsaXN0KCJiY2QiLCAiZGVmIiksIGxpc3QoImJjZCIsICJkZWYiKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGwpLCBjb2xsZWN0aW9uX2NvdW50KHMpLCBjb2xsZWN0aW9uX2NvdW50KG0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMiwgMiwgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGZsKSwgY29sbGVjdGlvbl9jb3VudChmcyksIGNvbGxlY3Rpb25fY291bnQoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMiwgMiwgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21pbihsKSwgY29sbGVjdGlvbl9taW4ocyksIGNvbGxlY3Rpb25fbWluKGZsKSwgY29sbGVjdGlvbl9taW4oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coImFiYyIsICJhYmMiLCAiYWJjIiwgImFiYyIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9tYXgobCksIGNvbGxlY3Rpb25fbWF4KHMpLCBjb2xsZWN0aW9uX21heChmbCksIGNvbGxlY3Rpb25fbWF4KGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KCJiY2QiLCAiYmNkIiwgImJjZCIsICJiY2QiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGV4dCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKENRTDNUeXBlLk5hdGl2ZS5URVhUKTsKKworICAgICAgICAvLyBlbXB0eSBjb2xsZWN0aW9ucworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfa2V5cyhtKSwgbWFwX3ZhbHVlcyhtKSwgbWFwX2tleXMoZm0pLCBtYXBfdmFsdWVzKGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIHNldCgpLCBsaXN0KCkpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9jb3VudChsKSwgY29sbGVjdGlvbl9jb3VudChzKSwgY29sbGVjdGlvbl9jb3VudChtKSwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sbGVjdGlvbl9jb3VudChmbCksIGNvbGxlY3Rpb25fY291bnQoZnMpLCBjb2xsZWN0aW9uX2NvdW50KGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIDAsIDAsIDApKTsKKworICAgICAgICAvLyBub3QgZW1wdHkgY29sbGVjdGlvbnMKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwsIGZsLCBzLCBmcywgbSwgZm0pICBWQUxVRVMgKDEsID8sID8sID8sID8sID8sID8pIiwKKyAgICAgICAgICAgICAgICBsaXN0KCLDoWJjIiwgImJjZCIpLCBzZXQoIsOhYmMiLCAiYmNkIiksCisgICAgICAgICAgICAgICAgbGlzdCgiw6FiYyIsICJiY2QiKSwgc2V0KCLDoWJjIiwgImJjZCIpLAorICAgICAgICAgICAgICAgIG1hcCgiw6FiYyIsICJiY2QiLCAiY2TDqSIsICJkw6lmIiksIG1hcCgiw6FiYyIsICJiY2QiLCAiY2TDqSIsICJkw6lmIikpOworCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF9rZXlzKG0pLCBtYXBfa2V5cyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhzZXQoIsOhYmMiLCAiY2TDqSIpLCBzZXQoIsOhYmMiLCAiY2TDqSIpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF92YWx1ZXMobSksIG1hcF92YWx1ZXMoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobGlzdCgiZMOpZiIsICJiY2QiKSwgbGlzdCgiZMOpZiIsICJiY2QiKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGwpLCBjb2xsZWN0aW9uX2NvdW50KHMpLCBjb2xsZWN0aW9uX2NvdW50KG0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMiwgMiwgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGZsKSwgY29sbGVjdGlvbl9jb3VudChmcyksIGNvbGxlY3Rpb25fY291bnQoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMiwgMiwgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21pbihsKSwgY29sbGVjdGlvbl9taW4ocyksIGNvbGxlY3Rpb25fbWluKGZsKSwgY29sbGVjdGlvbl9taW4oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coImJjZCIsICJiY2QiLCAiYmNkIiwgImJjZCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9tYXgobCksIGNvbGxlY3Rpb25fbWF4KHMpLCBjb2xsZWN0aW9uX21heChmbCksIGNvbGxlY3Rpb25fbWF4KGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KCLDoWJjIiwgIsOhYmMiLCAiw6FiYyIsICLDoWJjIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJvb2xlYW4oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZShDUUwzVHlwZS5OYXRpdmUuQk9PTEVBTik7CisKKyAgICAgICAgLy8gZW1wdHkgY29sbGVjdGlvbnMKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWFwX2tleXMobSksIG1hcF92YWx1ZXMobSksIG1hcF9rZXlzKGZtKSwgbWFwX3ZhbHVlcyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhudWxsLCBudWxsLCBzZXQoKSwgbGlzdCgpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQobCksIGNvbGxlY3Rpb25fY291bnQocyksIGNvbGxlY3Rpb25fY291bnQobSksICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGxlY3Rpb25fY291bnQoZmwpLCBjb2xsZWN0aW9uX2NvdW50KGZzKSwgY29sbGVjdGlvbl9jb3VudChmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhudWxsLCBudWxsLCBudWxsLCAwLCAwLCAwKSk7CisKKyAgICAgICAgLy8gbm90IGVtcHR5IGNvbGxlY3Rpb25zCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsLCBmbCwgcywgZnMsIG0sIGZtKSAgVkFMVUVTICgxLCA/LCA/LCA/LCA/LCA/LCA/KSIsCisgICAgICAgICAgICAgICAgbGlzdCh0cnVlLCBmYWxzZSksIHNldCh0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbGlzdCh0cnVlLCBmYWxzZSksIHNldCh0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFwKHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSksIG1hcCh0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUpKTsKKworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfa2V5cyhtKSwgbWFwX2tleXMoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coc2V0KHRydWUsIGZhbHNlKSwgc2V0KHRydWUsIGZhbHNlKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfdmFsdWVzKG0pLCBtYXBfdmFsdWVzKGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KGxpc3QodHJ1ZSwgZmFsc2UpLCBsaXN0KHRydWUsIGZhbHNlKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGwpLCBjb2xsZWN0aW9uX2NvdW50KHMpLCBjb2xsZWN0aW9uX2NvdW50KG0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMiwgMiwgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGZsKSwgY29sbGVjdGlvbl9jb3VudChmcyksIGNvbGxlY3Rpb25fY291bnQoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMiwgMiwgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21pbihsKSwgY29sbGVjdGlvbl9taW4ocyksIGNvbGxlY3Rpb25fbWluKGZsKSwgY29sbGVjdGlvbl9taW4oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9tYXgobCksIGNvbGxlY3Rpb25fbWF4KHMpLCBjb2xsZWN0aW9uX21heChmbCksIGNvbGxlY3Rpb25fbWF4KGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KHRydWUsIHRydWUsIHRydWUsIHRydWUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlVGFibGUoQ1FMM1R5cGUuTmF0aXZlIHR5cGUpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKFN0cmluZy5mb3JtYXQoIkNSRUFURSBUQUJMRSAlJXMgKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgayBpbnQgUFJJTUFSWSBLRVksICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbCBsaXN0PCVzPiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzIHNldDwlPHM+LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG0gbWFwPCU8cywgJTxzPiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmbCBmcm96ZW48bGlzdDwlPHM+PiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmcyBmcm96ZW48c2V0PCU8cz4+LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZtIGZyb3plbjxtYXA8JTxzLCAlPHM+PikiLCB0eXBlKSk7CisKKyAgICAgICAgLy8gdGVzdCBmdW5jdGlvbnMgd2l0aCBhbiBlbXB0eSB0YWJsZQorICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgbWFwX2tleXMobSksIG1hcF9rZXlzKGZtKSwgbWFwX3ZhbHVlcyhtKSwgbWFwX3ZhbHVlcyhmbSkgRlJPTSAlcyIpKTsKKyAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQobCksIGNvbGxlY3Rpb25fY291bnQocyksIGNvbGxlY3Rpb25fY291bnQobSkgRlJPTSAlcyIpKTsKKyAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQoZmwpLCBjb2xsZWN0aW9uX2NvdW50KGZzKSwgY29sbGVjdGlvbl9jb3VudChmbSkgRlJPTSAlcyIpKTsKKyAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fbWluKGwpLCBjb2xsZWN0aW9uX21pbihzKSwgY29sbGVjdGlvbl9taW4oZmwpLCBjb2xsZWN0aW9uX21pbihmcykgRlJPTSAlcyIpKTsKKyAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fbWF4KGwpLCBjb2xsZWN0aW9uX21heChzKSwgY29sbGVjdGlvbl9tYXgoZmwpLCBjb2xsZWN0aW9uX21heChmcykgRlJPTSAlcyIpKTsKKworICAgICAgICBTdHJpbmcgZXJyb3JNc2cgPSAicmVxdWlyZXMgYSBudW1lcmljIHNldC9saXN0IGFyZ3VtZW50IjsKKyAgICAgICAgaWYgKHR5cGUuZ2V0VHlwZSgpIGluc3RhbmNlb2YgTnVtYmVyVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fc3VtKGwpLCBjb2xsZWN0aW9uX3N1bShzKSwgY29sbGVjdGlvbl9zdW0oZmwpLCBjb2xsZWN0aW9uX3N1bShmcykgRlJPTSAlcyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2F2ZyhsKSwgY29sbGVjdGlvbl9hdmcocyksIGNvbGxlY3Rpb25fYXZnKGZsKSwgY29sbGVjdGlvbl9hdmcoZnMpIEZST00gJXMiKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKGVycm9yTXNnLCBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywgIlNFTEVDVCBjb2xsZWN0aW9uX3N1bShsKSBGUk9NICVzIik7CisgICAgICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKGVycm9yTXNnLCBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywgIlNFTEVDVCBjb2xsZWN0aW9uX2F2ZyhsKSBGUk9NICVzIik7CisgICAgICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKGVycm9yTXNnLCBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywgIlNFTEVDVCBjb2xsZWN0aW9uX3N1bShzKSBGUk9NICVzIik7CisgICAgICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKGVycm9yTXNnLCBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywgIlNFTEVDVCBjb2xsZWN0aW9uX2F2ZyhzKSBGUk9NICVzIik7CisgICAgICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKGVycm9yTXNnLCBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywgIlNFTEVDVCBjb2xsZWN0aW9uX3N1bShmbCkgRlJPTSAlcyIpOworICAgICAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZShlcnJvck1zZywgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsICJTRUxFQ1QgY29sbGVjdGlvbl9hdmcoZmwpIEZST00gJXMiKTsKKyAgICAgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoZXJyb3JNc2csIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLCAiU0VMRUNUIGNvbGxlY3Rpb25fc3VtKGZzKSBGUk9NICVzIik7CisgICAgICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKGVycm9yTXNnLCBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywgIlNFTEVDVCBjb2xsZWN0aW9uX2F2ZyhmcykgRlJPTSAlcyIpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoZXJyb3JNc2csIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLCAiU0VMRUNUIGNvbGxlY3Rpb25fc3VtKG0pIEZST00gJXMiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZShlcnJvck1zZywgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsICJTRUxFQ1QgY29sbGVjdGlvbl9hdmcobSkgRlJPTSAlcyIpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKGVycm9yTXNnLCBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywgIlNFTEVDVCBjb2xsZWN0aW9uX3N1bShmbSkgRlJPTSAlcyIpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKGVycm9yTXNnLCBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywgIlNFTEVDVCBjb2xsZWN0aW9uX2F2ZyhmbSkgRlJPTSAlcyIpOworCisgICAgICAgIC8vIHByZXBhcmUgZW1wdHkgY29sbGVjdGlvbnMKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwsIGZsLCBzLCBmcywgbSwgZm0pIFZBTFVFUyAoMSwgPywgPywgPywgPywgPywgPykiLAorICAgICAgICAgICAgICAgIGxpc3QoKSwgbGlzdCgpLCBzZXQoKSwgc2V0KCksIG1hcCgpLCBtYXAoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0Z1bmN0aW9uRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9GdW5jdGlvbkZhY3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwN2QxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9GdW5jdGlvbkZhY3RvcnlUZXN0LmphdmEKQEAgLTAsMCArMSw0MTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnM7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5VVUlEOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5EdXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlVudHlwZWRSZXN1bHRTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOworCitwdWJsaWMgY2xhc3MgRnVuY3Rpb25GYWN0b3J5VGVzdCBleHRlbmRzIENRTFRlc3RlcgoreworICAgIC8qKgorICAgICAqIEEgZnVuY3Rpb24gdGhhdCBqdXN0IHJldHVybnMgaXRzIG9ubHkgYXJndW1lbnQgd2l0aG91dCBhbnkgY2hhbmdlcy4KKyAgICAgKiBDYWxscyB0byB0aGlzIGZ1bmN0aW9uIHdpbGwgdHJ5IHRvIGluZmVyIHRoZSB0eXBlIG9mIGl0cyBhcmd1bWVudCwgaWYgbWlzc2luZywgZnJvbSB0aGUgZnVuY3Rpb24ncyByZWNlaXZlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGdW5jdGlvbkZhY3RvcnkgSURFTlRJVFkgPSBuZXcgRnVuY3Rpb25GYWN0b3J5KCJpZGVudGl0eSIsIEZ1bmN0aW9uUGFyYW1ldGVyLmFueVR5cGUodHJ1ZSkpCisgICAgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIE5hdGl2ZUZ1bmN0aW9uIGRvR2V0T3JDcmVhdGVGdW5jdGlvbihMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMsIEFic3RyYWN0VHlwZTw/PiByZWNlaXZlclR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTmF0aXZlU2NhbGFyRnVuY3Rpb24obmFtZS5uYW1lLCBhcmdUeXBlcy5nZXQoMCksIGFyZ1R5cGVzLmdldCgwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleGVjdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbCwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnMuZ2V0KDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBpdHMgb25seSBhcmd1bWVudC4KKyAgICAgKiBDYWxscyB0byB0aGlzIGZ1bmN0aW9uIHdvbid0IHRyeSB0byBpbmZlciB0aGUgdHlwZSBvZiBpdHMgYXJndW1lbnQsIGlmIG1pc3NpbmcsIGZyb20gdGhlIGZ1bmN0aW9uJ3MgcmVjZWl2ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRnVuY3Rpb25GYWN0b3J5IFRPX1NUUklORyA9IG5ldyBGdW5jdGlvbkZhY3RvcnkoInRvc3RyaW5nIiwgRnVuY3Rpb25QYXJhbWV0ZXIuYW55VHlwZShmYWxzZSkpCisgICAgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIE5hdGl2ZUZ1bmN0aW9uIGRvR2V0T3JDcmVhdGVGdW5jdGlvbihMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMsIEFic3RyYWN0VHlwZTw/PiByZWNlaXZlclR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTmF0aXZlU2NhbGFyRnVuY3Rpb24obmFtZS5uYW1lLCBVVEY4VHlwZS5pbnN0YW5jZSwgYXJnVHlwZXMuZ2V0KDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gcGFyYW1ldGVycy5nZXQoMCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVURjhUeXBlLmluc3RhbmNlLmRlY29tcG9zZShhcmdUeXBlcy5nZXQoMCkuY29tcG9zZSh2YWx1ZSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVVUlEIHV1aWQgPSBVVUlELmZyb21TdHJpbmcoIjYyYzNlOTZmLTU1Y2QtNDkzYi04YzhlLTVhMTg4ODNhMTY5OCIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRpbWVVVUlEIHRpbWVVVUlEID0gVGltZVVVSUQuZnJvbVN0cmluZygiMDAzNDY2NDItMmQyZi0xMWVkLWEyNjEtMDI0MmFjMTIwMDAyIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBiaWdpbnQgPSBuZXcgQmlnSW50ZWdlcigiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIGJpZ2RlY2ltYWwgPSBuZXcgQmlnRGVjaW1hbCgiMTIzNDU2Nzg5MC4xMjM0NTY3ODkwIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZSBkYXRlID0gbmV3IERhdGUoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEdXJhdGlvbiBkdXJhdGlvbiA9IER1cmF0aW9uLm5ld0luc3RhbmNlKDEsIDIsIDMpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEluZXRBZGRyZXNzIGluZXQgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoMCkuZ2V0QWRkcmVzcygpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgYmxvYiA9IEJ5dGVCdWZmZXJVdGlsLmhleFRvQnl0ZXMoIkFCQ0RFRiIpOworCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZUNsYXNzKCkKKyAgICB7CisgICAgICAgIE5hdGl2ZUZ1bmN0aW9ucy5pbnN0YW5jZS5hZGQoSURFTlRJVFkpOworICAgICAgICBOYXRpdmVGdW5jdGlvbnMuaW5zdGFuY2UuYWRkKFRPX1NUUklORyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZE51bWJlck9mQXJndW1lbnRzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVkpIik7CisgICAgICAgIFN0cmluZyBtc2cgPSAiSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBmdW5jdGlvbiBzeXN0ZW0uaWRlbnRpdHkoYW55KSI7CisgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKG1zZywgIlNFTEVDVCBpZGVudGl0eSgpIEZST00gJXMiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UobXNnLCAiU0VMRUNUIGlkZW50aXR5KDEsIDIpIEZST00gJXMiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UobXNnLCAiU0VMRUNUIGlkZW50aXR5KCcxJywgJzInLCAnMycpIEZST00gJXMiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbmtub3duRnVuY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSkiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlVua25vd24gZnVuY3Rpb24gJ3Vua25vd24nIiwgIlNFTEVDVCB1bmtub3duKCkgRlJPTSAlcyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVR5cGVzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksICIgKworICAgICAgICAgICAgICAgICAgICAidGlueWludCB0aW55aW50LCAiICsKKyAgICAgICAgICAgICAgICAgICAgInNtYWxsaW50IHNtYWxsaW50LCAiICsKKyAgICAgICAgICAgICAgICAgICAgImludCBpbnQsICIgKworICAgICAgICAgICAgICAgICAgICAiYmlnaW50IGJpZ2ludCwgIiArCisgICAgICAgICAgICAgICAgICAgICJmbG9hdCBmbG9hdCwgIiArCisgICAgICAgICAgICAgICAgICAgICJkb3VibGUgZG91YmxlLCAiICsKKyAgICAgICAgICAgICAgICAgICAgInZhcmludCB2YXJpbnQsICIgKworICAgICAgICAgICAgICAgICAgICAiZGVjaW1hbCBkZWNpbWFsLCAiICsKKyAgICAgICAgICAgICAgICAgICAgInRleHQgdGV4dCwgIiArCisgICAgICAgICAgICAgICAgICAgICJhc2NpaSBhc2NpaSwgIiArCisgICAgICAgICAgICAgICAgICAgICJib29sZWFuIGJvb2xlYW4sICIgKworICAgICAgICAgICAgICAgICAgICAiZGF0ZSBkYXRlLCAiICsKKyAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCB0aW1lc3RhbXAsICIgKworICAgICAgICAgICAgICAgICAgICAiZHVyYXRpb24gZHVyYXRpb24sICIgKworICAgICAgICAgICAgICAgICAgICAidXVpZCB1dWlkLCAiICsKKyAgICAgICAgICAgICAgICAgICAgInRpbWV1dWlkIHRpbWV1dWlkLCIgKworICAgICAgICAgICAgICAgICAgICAiaW5ldCBpbmV0LCIgKworICAgICAgICAgICAgICAgICAgICAiYmxvYiBibG9iKSIpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBlbXB0eSB0YWJsZQorICAgICAgICBTdHJpbmcgc2VsZWN0ID0gIlNFTEVDVCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJpZGVudGl0eSh0aW55aW50KSwgIGlkZW50aXR5KHNtYWxsaW50KSwgaWRlbnRpdHkoaW50KSwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiaWRlbnRpdHkoYmlnaW50KSwgaWRlbnRpdHkoZmxvYXQpLCBpZGVudGl0eShkb3VibGUpLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJpZGVudGl0eSh2YXJpbnQpLCBpZGVudGl0eShkZWNpbWFsKSwgaWRlbnRpdHkodGV4dCksICIgKworICAgICAgICAgICAgICAgICAgICAgICAgImlkZW50aXR5KGFzY2lpKSwgaWRlbnRpdHkoYm9vbGVhbiksIGlkZW50aXR5KGRhdGUpLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJpZGVudGl0eSh0aW1lc3RhbXApLCBpZGVudGl0eShkdXJhdGlvbiksIGlkZW50aXR5KHV1aWQpLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJpZGVudGl0eSh0aW1ldXVpZCksIGlkZW50aXR5KGluZXQpLCBpZGVudGl0eShibG9iKSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJGUk9NICVzIjsKKyAgICAgICAgVW50eXBlZFJlc3VsdFNldCBycyA9IGV4ZWN1dGUoc2VsZWN0KTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMocnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0uaWRlbnRpdHkodGlueWludCkiLCAic3lzdGVtLmlkZW50aXR5KHNtYWxsaW50KSIsICJzeXN0ZW0uaWRlbnRpdHkoaW50KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0uaWRlbnRpdHkoYmlnaW50KSIsICJzeXN0ZW0uaWRlbnRpdHkoZmxvYXQpIiwgInN5c3RlbS5pZGVudGl0eShkb3VibGUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInN5c3RlbS5pZGVudGl0eSh2YXJpbnQpIiwgInN5c3RlbS5pZGVudGl0eShkZWNpbWFsKSIsICJzeXN0ZW0uaWRlbnRpdHkodGV4dCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic3lzdGVtLmlkZW50aXR5KGFzY2lpKSIsICJzeXN0ZW0uaWRlbnRpdHkoYm9vbGVhbikiLCAic3lzdGVtLmlkZW50aXR5KGRhdGUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInN5c3RlbS5pZGVudGl0eSh0aW1lc3RhbXApIiwgInN5c3RlbS5pZGVudGl0eShkdXJhdGlvbikiLCAic3lzdGVtLmlkZW50aXR5KHV1aWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInN5c3RlbS5pZGVudGl0eSh0aW1ldXVpZCkiLCAic3lzdGVtLmlkZW50aXR5KGluZXQpIiwgInN5c3RlbS5pZGVudGl0eShibG9iKSIpOworICAgICAgICBhc3NlcnRFbXB0eShycyk7CisKKyAgICAgICAgLy8gVGVzdCB3aXRoIG5vdC1lbXB0eSB0YWJsZQorICAgICAgICBPYmplY3RbXSByb3cgPSByb3coKGJ5dGUpIDEsIChzaG9ydCkgMSwgMTIzLCAxMjNMLCAxLjIzZiwgMS4yM2QsIGJpZ2ludCwgYmlnZGVjaW1hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICLDoWJjIiwgImFiYyIsIHRydWUsIDEsIGRhdGUsIGR1cmF0aW9uLCB1dWlkLCB0aW1lVVVJRCwgaW5ldCwgYmxvYik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0aW55aW50LCBzbWFsbGludCwgaW50LCBiaWdpbnQsIGZsb2F0LCBkb3VibGUsIHZhcmludCwgZGVjaW1hbCwgIiArCisgICAgICAgICAgICAgICAgInRleHQsIGFzY2lpLCBib29sZWFuLCBkYXRlLCB0aW1lc3RhbXAsIGR1cmF0aW9uLCB1dWlkLCB0aW1ldXVpZCwgaW5ldCwgYmxvYikgIiArCisgICAgICAgICAgICAgICAgIlZBTFVFUyAoMSwgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPykiLCByb3cpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoc2VsZWN0KSwgcm93KTsKKworICAgICAgICAvLyBUZXN0IHdpdGggYmluZCBtYXJrZXJzCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0aW55aW50LCBzbWFsbGludCwgaW50LCBiaWdpbnQsIGZsb2F0LCBkb3VibGUsIHZhcmludCwgZGVjaW1hbCwgIiArCisgICAgICAgICAgICAgICAgInRleHQsIGFzY2lpLCBib29sZWFuLCBkYXRlLCB0aW1lc3RhbXAsIGR1cmF0aW9uLCB1dWlkLCB0aW1ldXVpZCwgaW5ldCwgYmxvYikgIiArCisgICAgICAgICAgICAgICAgIlZBTFVFUyAoMSwgIiArCisgICAgICAgICAgICAgICAgImlkZW50aXR5KD8pLCBpZGVudGl0eSg/KSwgaWRlbnRpdHkoPyksIGlkZW50aXR5KD8pLCBpZGVudGl0eSg/KSwgaWRlbnRpdHkoPyksICIgKworICAgICAgICAgICAgICAgICJpZGVudGl0eSg/KSwgaWRlbnRpdHkoPyksIGlkZW50aXR5KD8pLCBpZGVudGl0eSg/KSwgaWRlbnRpdHkoPyksIGlkZW50aXR5KD8pLCAiICsKKyAgICAgICAgICAgICAgICAiaWRlbnRpdHkoPyksIGlkZW50aXR5KD8pLCBpZGVudGl0eSg/KSwgaWRlbnRpdHkoPyksIGlkZW50aXR5KD8pLCBpZGVudGl0eSg/KSkiLCByb3cpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoc2VsZWN0KSwgcm93KTsKKworICAgICAgICAvLyBUZXN0IGxpdGVyYWxzCisgICAgICAgIHRlc3RMaXRlcmFsKCIodGlueWludCkgMSIsIChieXRlKSAxKTsKKyAgICAgICAgdGVzdExpdGVyYWwoIihzbWFsbGludCkgMSIsIChzaG9ydCkgMSk7CisgICAgICAgIHRlc3RMaXRlcmFsKDEyMyk7CisgICAgICAgIHRlc3RMaXRlcmFsKDEyMzQ1Njc4OTAxMjNMKTsKKyAgICAgICAgdGVzdExpdGVyYWwoMS4yMyk7CisgICAgICAgIHRlc3RMaXRlcmFsKDEyMzQ1NjcuMTIzNDU2N0QpOworICAgICAgICB0ZXN0TGl0ZXJhbChiaWdpbnQpOworICAgICAgICB0ZXN0TGl0ZXJhbChiaWdkZWNpbWFsKTsKKyAgICAgICAgdGVzdExpdGVyYWwoIidhYmMnIiwgImFiYyIpOworICAgICAgICB0ZXN0TGl0ZXJhbCgiJ8OhYmMnIiwgIsOhYmMiKTsKKyAgICAgICAgdGVzdExpdGVyYWwodHJ1ZSk7CisgICAgICAgIHRlc3RMaXRlcmFsKGZhbHNlKTsKKyAgICAgICAgdGVzdExpdGVyYWwoIih0aW1lc3RhbXApICcxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMCswMDAwJyIsIG5ldyBEYXRlKDApKTsKKyAgICAgICAgdGVzdExpdGVyYWwoIih0aW1lKSAnMDA6MDA6MDAuMDAwMDAwJyIsIDBMKTsKKyAgICAgICAgdGVzdExpdGVyYWwoZHVyYXRpb24pOworICAgICAgICB0ZXN0TGl0ZXJhbCh1dWlkKTsKKyAgICAgICAgdGVzdExpdGVyYWwodGltZVVVSUQpOworICAgICAgICB0ZXN0TGl0ZXJhbCgiKGluZXQpICcwLjAuMC4wJyIsIGluZXQpOworICAgICAgICB0ZXN0TGl0ZXJhbCgiMHgiICsgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChibG9iKSwgYmxvYik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0cygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCBzIHNldDxpbnQ+LCBmcyBmcm96ZW48c2V0PGludD4+KSIpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBlbXB0eSB0YWJsZQorICAgICAgICBTdHJpbmcgc2VsZWN0ID0gIlNFTEVDVCBpZGVudGl0eShzKSwgaWRlbnRpdHkoZnMpIEZST00gJXMiOworICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IHJzID0gZXhlY3V0ZShzZWxlY3QpOworICAgICAgICBhc3NlcnRDb2x1bW5OYW1lcyhycywgInN5c3RlbS5pZGVudGl0eShzKSIsICJzeXN0ZW0uaWRlbnRpdHkoZnMpIik7CisgICAgICAgIGFzc2VydEVtcHR5KHJzKTsKKworICAgICAgICAvLyBUZXN0IHdpdGggbm90LWVtcHR5IHRhYmxlCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBzLCBmcykgVkFMVUVTICgxLCB7MSwgMn0sIHsxLCAyfSkiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHMsIGZzKSBWQUxVRVMgKDIsIHsxLCAyLCAzfSwgezEsIDIsIDN9KSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgcywgZnMpIFZBTFVFUyAoMywgezIsIDF9LCB7MiwgMX0pIik7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShzZWxlY3QpLAorICAgICAgICAgICAgICAgICAgIHJvdyhzZXQoMSwgMiksIHNldCgxLCAyKSksCisgICAgICAgICAgICAgICAgICAgcm93KHNldCgxLCAyLCAzKSwgc2V0KDEsIDIsIDMpKSwKKyAgICAgICAgICAgICAgICAgICByb3coc2V0KDIsIDEpLCBzZXQoMiwgMSkpKTsKKworICAgICAgICAvLyBUZXN0IHdpdGggYmluZCBtYXJrZXJzCisgICAgICAgIE9iamVjdFtdIHJvdyA9IHJvdyhzZXQoMSwgMiwgMyksIHNldCg0LCA1LCA2KSk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBzLCBmcykgVkFMVUVTICg0LCBpZGVudGl0eSg/KSwgaWRlbnRpdHkoPykpIiwgcm93KTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgcywgZnMgRlJPTSAlcyBXSEVSRSBrID0gNCIpLCByb3cpOworCisgICAgICAgIC8vIFRlc3QgbGl0ZXJhbHMKKyAgICAgICAgdGVzdExpdGVyYWxGYWlscygiW10iKTsKKyAgICAgICAgdGVzdExpdGVyYWwoInsxLCAxMjM0NTY3ODkwfSIsIHNldCgxLCAxMjM0NTY3ODkwKSk7CisgICAgICAgIHRlc3RMaXRlcmFsKFN0cmluZy5mb3JtYXQoInsxLCAlc30iLCBiaWdpbnQpLCBzZXQoQmlnSW50ZWdlci5PTkUsIGJpZ2ludCkpOworICAgICAgICB0ZXN0TGl0ZXJhbCgieydhYmMnfSIsIHNldCgiYWJjIikpOworICAgICAgICB0ZXN0TGl0ZXJhbCgieyfDoWJjJ30iLCBzZXQoIsOhYmMiKSk7CisgICAgICAgIHRlc3RMaXRlcmFsKCJ7J2FiYycsICfDoWJjJ30iLCBzZXQoImFiYyIsICLDoWJjIikpOworICAgICAgICB0ZXN0TGl0ZXJhbCgieyfDoWJjJywgJ2FiYyd9Iiwgc2V0KCLDoWJjIiwgImFiYyIpKTsKKyAgICAgICAgdGVzdExpdGVyYWwoInt0cnVlfSIsIHNldCh0cnVlKSk7CisgICAgICAgIHRlc3RMaXRlcmFsKCJ7ZmFsc2V9Iiwgc2V0KGZhbHNlKSk7CisgICAgICAgIHRlc3RMaXRlcmFsKFN0cmluZy5mb3JtYXQoInslc30iLCB1dWlkKSwgc2V0KHV1aWQpKTsKKyAgICAgICAgdGVzdExpdGVyYWwoU3RyaW5nLmZvcm1hdCgieyVzfSIsIHRpbWVVVUlEKSwgc2V0KHRpbWVVVUlEKSk7CisgICAgICAgIHRlc3RMaXRlcmFsKFN0cmluZy5mb3JtYXQoInslcywgJXN9IiwgdXVpZCwgdGltZVVVSUQpLCBzZXQodXVpZCwgdGltZVVVSUQuYXNVVUlEKCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0cygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCBsIGxpc3Q8aW50PiwgZmwgZnJvemVuPGxpc3Q8aW50Pj4pIik7CisKKyAgICAgICAgLy8gVGVzdCB3aXRoIGVtcHR5IHRhYmxlCisgICAgICAgIFN0cmluZyBzZWxlY3QgPSAiU0VMRUNUIGlkZW50aXR5KGwpLCBpZGVudGl0eShmbCkgRlJPTSAlcyI7CisgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcnMgPSBleGVjdXRlKHNlbGVjdCk7CisgICAgICAgIGFzc2VydENvbHVtbk5hbWVzKHJzLCAic3lzdGVtLmlkZW50aXR5KGwpIiwgInN5c3RlbS5pZGVudGl0eShmbCkiKTsKKyAgICAgICAgYXNzZXJ0RW1wdHkocnMpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBub3QtZW1wdHkgdGFibGUKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwsIGZsKSBWQUxVRVMgKDEsIFsxLCAyXSwgWzEsIDJdKSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbCwgZmwpIFZBTFVFUyAoMiwgWzEsIDIsIDNdLCBbMSwgMiwgM10pIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsLCBmbCkgVkFMVUVTICgzLCBbMiwgMV0sIFsyLCAxXSkiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKHNlbGVjdCksCisgICAgICAgICAgICAgICAgICAgcm93KGxpc3QoMSwgMiksIGxpc3QoMSwgMikpLAorICAgICAgICAgICAgICAgICAgIHJvdyhsaXN0KDEsIDIsIDMpLCBsaXN0KDEsIDIsIDMpKSwKKyAgICAgICAgICAgICAgICAgICByb3cobGlzdCgyLCAxKSwgbGlzdCgyLCAxKSkpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBiaW5kIG1hcmtlcnMKKyAgICAgICAgT2JqZWN0W10gcm93ID0gcm93KGxpc3QoMSwgMiwgMyksIGxpc3QoNCwgNSwgNikpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbCwgZmwpIFZBTFVFUyAoNCwgaWRlbnRpdHkoPyksIGlkZW50aXR5KD8pKSIsIHJvdyk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGwsIGZsIEZST00gJXMgV0hFUkUgayA9IDQiKSwgcm93KTsKKworICAgICAgICAvLyBUZXN0IGxpdGVyYWxzCisgICAgICAgIHRlc3RMaXRlcmFsRmFpbHMoIltdIik7CisgICAgICAgIHRlc3RMaXRlcmFsKCJbMSwgMTIzNDU2Nzg5MF0iLCBsaXN0KDEsIDEyMzQ1Njc4OTApKTsKKyAgICAgICAgdGVzdExpdGVyYWwoU3RyaW5nLmZvcm1hdCgiWzEsICVzXSIsIGJpZ2ludCksIGxpc3QoQmlnSW50ZWdlci5PTkUsIGJpZ2ludCkpOworICAgICAgICB0ZXN0TGl0ZXJhbCgiWydhYmMnXSIsIGxpc3QoImFiYyIpKTsKKyAgICAgICAgdGVzdExpdGVyYWwoIlsnw6FiYyddIiwgbGlzdCgiw6FiYyIpKTsKKyAgICAgICAgdGVzdExpdGVyYWwoIlsnYWJjJywgJ8OhYmMnXSIsIGxpc3QoImFiYyIsICLDoWJjIikpOworICAgICAgICB0ZXN0TGl0ZXJhbCgiWyfDoWJjJywgJ2FiYyddIiwgbGlzdCgiw6FiYyIsICJhYmMiKSk7CisgICAgICAgIHRlc3RMaXRlcmFsKCJbdHJ1ZV0iLCBsaXN0KHRydWUpKTsKKyAgICAgICAgdGVzdExpdGVyYWwoIltmYWxzZV0iLCBsaXN0KGZhbHNlKSk7CisgICAgICAgIHRlc3RMaXRlcmFsKFN0cmluZy5mb3JtYXQoIlslc10iLCB1dWlkKSwgbGlzdCh1dWlkKSk7CisgICAgICAgIHRlc3RMaXRlcmFsKFN0cmluZy5mb3JtYXQoIlslc10iLCB0aW1lVVVJRCksIGxpc3QodGltZVVVSUQpKTsKKyAgICAgICAgdGVzdExpdGVyYWwoU3RyaW5nLmZvcm1hdCgiWyVzLCAlc10iLCB1dWlkLCB0aW1lVVVJRCksIGxpc3QodXVpZCwgdGltZVVVSUQuYXNVVUlEKCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXBzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIG0gbWFwPGludCwgaW50PiwgZm0gZnJvemVuPG1hcDxpbnQsIGludD4+KSIpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBlbXB0eSB0YWJsZQorICAgICAgICBTdHJpbmcgc2VsZWN0ID0gIlNFTEVDVCBpZGVudGl0eShtKSwgaWRlbnRpdHkoZm0pIEZST00gJXMiOworICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IHJzID0gZXhlY3V0ZShzZWxlY3QpOworICAgICAgICBhc3NlcnRDb2x1bW5OYW1lcyhycywgInN5c3RlbS5pZGVudGl0eShtKSIsICJzeXN0ZW0uaWRlbnRpdHkoZm0pIik7CisgICAgICAgIGFzc2VydEVtcHR5KHJzKTsKKworICAgICAgICAvLyBUZXN0IHdpdGggbm90LWVtcHR5IHRhYmxlCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBtLCBmbSkgVkFMVUVTICgxLCB7MToxMCwgMjoyMH0sIHsxOjEwLCAyOjIwfSkiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIG0sIGZtKSBWQUxVRVMgKDIsIHsxOjEwLCAyOjIwLCAzOjMwfSwgezE6MTAsIDI6MjAsIDM6MzB9KSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbSwgZm0pIFZBTFVFUyAoMywgezI6MjAsIDE6MTB9LCB7MjoyMCwgMToxMH0pIik7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShzZWxlY3QpLAorICAgICAgICAgICAgICAgICAgIHJvdyhtYXAoMSwgMTAsIDIsIDIwKSwgbWFwKDEsIDEwLCAyLCAyMCkpLAorICAgICAgICAgICAgICAgICAgIHJvdyhtYXAoMSwgMTAsIDIsIDIwLCAzLCAzMCksIG1hcCgxLCAxMCwgMiwgMjAsIDMsIDMwKSksCisgICAgICAgICAgICAgICAgICAgcm93KG1hcCgxLCAxMCwgMiwgMjApLCBtYXAoMSwgMTAsIDIsIDIwKSkpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBiaW5kIG1hcmtlcnMKKyAgICAgICAgT2JqZWN0W10gcm93ID0gcm93KG1hcCgxLCAxMCwgMiwgMjApLCBtYXAoMywgMzAsIDQsIDQwKSk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBtLCBmbSkgVkFMVUVTICg0LCBpZGVudGl0eSg/KSwgaWRlbnRpdHkoPykpIiwgcm93KTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbSwgZm0gRlJPTSAlcyBXSEVSRSBrID0gNCIpLCByb3cpOworCisgICAgICAgIC8vIFRlc3QgbGl0ZXJhbHMKKyAgICAgICAgdGVzdExpdGVyYWxGYWlscygie30iKTsKKyAgICAgICAgdGVzdExpdGVyYWxGYWlscygiezE6IDEwLCAyOiAyMH0iKTsKKyAgICAgICAgdGVzdExpdGVyYWwoIihtYXA8aW50LCBpbnQ+KSB7MTogMTAsIDI6IDIwfSIsIG1hcCgxLCAxMCwgMiwgMjApKTsKKyAgICAgICAgdGVzdExpdGVyYWwoIihtYXA8aW50LCB0ZXh0PikgezE6ICdhYmMnLCAyOiAnw6FiYyd9IiwgbWFwKDEsICJhYmMiLCAyLCAiw6FiYyIpKTsKKyAgICAgICAgdGVzdExpdGVyYWwoIihtYXA8dGV4dCwgaW50PikgeydhYmMnOiAxLCAnw6FiYyc6IDJ9IiwgbWFwKCJhYmMiLCAxLCAiw6FiYyIsIDIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUdXBsZXMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdCB0dXBsZTxpbnQsIHRleHQsIGJvb2xlYW4+KSIpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBlbXB0eSB0YWJsZQorICAgICAgICBTdHJpbmcgc2VsZWN0ID0gIlNFTEVDVCBpZGVudGl0eSh0KSBGUk9NICVzIjsKKyAgICAgICAgVW50eXBlZFJlc3VsdFNldCBycyA9IGV4ZWN1dGUoc2VsZWN0KTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMocnMsICJzeXN0ZW0uaWRlbnRpdHkodCkiKTsKKyAgICAgICAgYXNzZXJ0RW1wdHkocnMpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBub3QtZW1wdHkgdGFibGUKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoMSwgKDEsICdhJywgZmFsc2UpKSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICgyLCAoMiwgJ2InLCB0cnVlKSkiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoMywgKDMsIG51bGwsIHRydWUpKSIpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoc2VsZWN0KSwKKyAgICAgICAgICAgICAgICAgICByb3codHVwbGUoMSwgImEiLCBmYWxzZSkpLAorICAgICAgICAgICAgICAgICAgIHJvdyh0dXBsZSgyLCAiYiIsIHRydWUpKSwKKyAgICAgICAgICAgICAgICAgICByb3codHVwbGUoMywgbnVsbCwgdHJ1ZSkpKTsKKworICAgICAgICAvLyBUZXN0IHdpdGggYmluZCBtYXJrZXJzCisgICAgICAgIE9iamVjdFtdIHJvdyA9IHJvdyh0dXBsZSg0LCAiZCIsIGZhbHNlKSk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDQsIGlkZW50aXR5KD8pKSIsIHJvdyk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHQgRlJPTSAlcyBXSEVSRSBrID0gNCIpLCByb3cpOworCisgICAgICAgIC8vIFRlc3QgbGl0ZXJhbHMKKyAgICAgICAgdGVzdExpdGVyYWxGYWlscygiKDEpIik7CisgICAgICAgIHRlc3RMaXRlcmFsKCIodHVwbGU8aW50PikgKDEpIiwgdHVwbGUoMSkpOworICAgICAgICB0ZXN0TGl0ZXJhbCgiKDEsICdhJykiLCB0dXBsZSgxLCAiYSIpKTsKKyAgICAgICAgdGVzdExpdGVyYWwoIigxLCAnYScsIGZhbHNlKSIsIHR1cGxlKDEsICJhIiwgZmFsc2UpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVRFRzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgU3RyaW5nIHVkdCA9IGNyZWF0ZVR5cGUoIkNSRUFURSBUWVBFICVzICh4IGludCkiKTsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIHUgZnJvemVuPCIgKyB1ZHQgKyAiPiwgZnUgZnJvemVuPCIgKyB1ZHQgKyAiPikiKTsKKworICAgICAgICAvLyBUZXN0IHdpdGggZW1wdHkgdGFibGUKKyAgICAgICAgU3RyaW5nIHNlbGVjdCA9ICJTRUxFQ1QgaWRlbnRpdHkodSksIGlkZW50aXR5KGZ1KSBGUk9NICVzIjsKKyAgICAgICAgVW50eXBlZFJlc3VsdFNldCBycyA9IGV4ZWN1dGUoc2VsZWN0KTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMocnMsICJzeXN0ZW0uaWRlbnRpdHkodSkiLCAic3lzdGVtLmlkZW50aXR5KGZ1KSIpOworICAgICAgICBhc3NlcnRFbXB0eShycyk7CisKKyAgICAgICAgLy8gVGVzdCB3aXRoIG5vdC1lbXB0eSB0YWJsZQorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdSwgZnUpIFZBTFVFUyAoMSwge3g6IDJ9LCBudWxsKSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdSwgZnUpIFZBTFVFUyAoMiwge3g6IDR9LCB7eDogNn0pIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB1LCBmdSkgVkFMVUVTICg0LCBudWxsLCB7eDogOH0pIik7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShzZWxlY3QpLAorICAgICAgICAgICAgICAgICAgIHJvdyh1c2VyVHlwZSgieCIsIDIpLCBudWxsKSwKKyAgICAgICAgICAgICAgICAgICByb3codXNlclR5cGUoIngiLCA0KSwgdXNlclR5cGUoIngiLCA2KSksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIHVzZXJUeXBlKCJ4IiwgOCkpKTsKKworICAgICAgICAvLyBUZXN0IHdpdGggYmluZCBtYXJrZXJzCisgICAgICAgIE9iamVjdFtdIHJvdyA9IHJvdyh1c2VyVHlwZSgieCIsIDQpLCB1c2VyVHlwZSgieCIsIDUpKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHUsIGZ1KSBWQUxVRVMgKDQsIGlkZW50aXR5KD8pLCBpZGVudGl0eSg/KSkiLCByb3cpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCB1LCBmdSBGUk9NICVzIFdIRVJFIGsgPSA0IiksIHJvdyk7CisKKyAgICAgICAgLy8gVGVzdCBsaXRlcmFscworICAgICAgICB0ZXN0TGl0ZXJhbEZhaWxzKCJ7fSIpOworICAgICAgICB0ZXN0TGl0ZXJhbEZhaWxzKCJ7eDogMTB9Iik7CisgICAgICAgIHRlc3RMaXRlcmFsKCcoJyArIHVkdCArICIpe3g6IDEwfSIsIHR1cGxlKDEwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkQ2FsbHMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdiBpbnQsIHQgdGV4dCkiKTsKKworICAgICAgICAvLyBUZXN0IGZ1bmN0aW9uIHRoYXQgaW5mZXJzIHBhcmFtZXRlciB0eXBlIGZyb20gcmVjZWl2ZXIgdHlwZQorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgxLCBpZGVudGl0eShpZGVudGl0eSgyKSkpIik7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHYgRlJPTSAlcyBXSEVSRSBrID0gMSIpLCByb3coMikpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgxLCBpZGVudGl0eShpZGVudGl0eSgoaW50KSA/KSkpIiwgMyk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHYgRlJPTSAlcyBXSEVSRSBrID0gMSIpLCByb3coMykpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBpZGVudGl0eShpZGVudGl0eSh2KSkgRlJPTSAlcyBXSEVSRSBrID0gMSIpLCByb3coMykpOworCisgICAgICAgIC8vIFRlc3QgZnVuY3Rpb24gdGhhdCBkb2VzIG5vdCBpbmZlciBwYXJhbWV0ZXIgdHlwZSBmcm9tIHJlY2VpdmVyIHR5cGUKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoMSwgdG9zdHJpbmcodG9zdHJpbmcoNCkpKSIpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCB0IEZST00gJXMgV0hFUkUgayA9IDEiKSwgcm93KCI0IikpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICgxLCB0b3N0cmluZyh0b3N0cmluZygoaW50KSA/KSkpIiwgNSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHRvc3RyaW5nKHRvc3RyaW5nKHQpKSBGUk9NICVzIFdIRVJFIGsgPSAxIiksIHJvdygiNSIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdExpdGVyYWwoT2JqZWN0IGxpdGVyYWwpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRlc3RMaXRlcmFsKGxpdGVyYWwsIGxpdGVyYWwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0TGl0ZXJhbChPYmplY3QgZnVuY3Rpb25BcmdzLCBPYmplY3QgZXhwZWN0ZWRSZXN1bHQpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgJXMoJXMpIEZST00gJSVzIExJTUlUIDEiLCBJREVOVElUWS5uYW1lKCksIGZ1bmN0aW9uQXJncykpLAorICAgICAgICAgICAgICAgICAgIHJvdyhleHBlY3RlZFJlc3VsdCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0TGl0ZXJhbEZhaWxzKE9iamVjdCBmdW5jdGlvbkFyZ3MpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJDYW5ub3QgaW5mZXIgdHlwZSBvZiBhcmd1bWVudCAiICsgZnVuY3Rpb25BcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgJXMoJXMpIEZST00gJSVzIiwgSURFTlRJVFkubmFtZSgpLCBmdW5jdGlvbkFyZ3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvTWF0aEZjdHNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvTWF0aEZjdHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFlZmMwYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9NYXRoRmN0c1Rlc3QuamF2YQpAQCAtMCwwICsxLDMzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9uczsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQ291bnRlckNvbHVtblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Eb3VibGVUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuRmxvYXRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50ZWdlclR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkRlY2ltYWxUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTG9uZ1R5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5OdW1iZXJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuU2hvcnRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBNYXRoRmN0c1Rlc3QKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBYnMoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKDEsIEludDMyVHlwZS5pbnN0YW5jZSwgMSk7CisgICAgICAgIGFzc2VydEFic0VxdWFscygwLCBJbnQzMlR5cGUuaW5zdGFuY2UsIDApOworICAgICAgICBhc3NlcnRBYnNFcXVhbHMoMywgSW50MzJUeXBlLmluc3RhbmNlLCAtMyk7CisKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKChieXRlKSAxLCBCeXRlVHlwZS5pbnN0YW5jZSwgKGJ5dGUpIDEpOworICAgICAgICBhc3NlcnRBYnNFcXVhbHMoKGJ5dGUpIDAsIEJ5dGVUeXBlLmluc3RhbmNlLCAoYnl0ZSkgMCk7CisgICAgICAgIGFzc2VydEFic0VxdWFscygoYnl0ZSkgMywgQnl0ZVR5cGUuaW5zdGFuY2UsIChieXRlKSAtMyk7CisKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKChzaG9ydCkgMSwgU2hvcnRUeXBlLmluc3RhbmNlLCAoc2hvcnQpIDEpOworICAgICAgICBhc3NlcnRBYnNFcXVhbHMoKHNob3J0KSAwLCBTaG9ydFR5cGUuaW5zdGFuY2UsIChzaG9ydCkgMCk7CisgICAgICAgIGFzc2VydEFic0VxdWFscygoc2hvcnQpIDMsIFNob3J0VHlwZS5pbnN0YW5jZSwgKHNob3J0KSAtMyk7CisKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKDFGLCBGbG9hdFR5cGUuaW5zdGFuY2UsIDFGKTsKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKDEuNUYsIEZsb2F0VHlwZS5pbnN0YW5jZSwgMS41Rik7CisgICAgICAgIGFzc2VydEFic0VxdWFscygwRiwgRmxvYXRUeXBlLmluc3RhbmNlLCAwRik7CisgICAgICAgIGFzc2VydEFic0VxdWFscygzRiwgRmxvYXRUeXBlLmluc3RhbmNlLCAtM0YpOworICAgICAgICBhc3NlcnRBYnNFcXVhbHMoMy43RiwgRmxvYXRUeXBlLmluc3RhbmNlLCAtMy43Rik7CisKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKDFMLCBMb25nVHlwZS5pbnN0YW5jZSwgMUwpOworICAgICAgICBhc3NlcnRBYnNFcXVhbHMoMEwsIExvbmdUeXBlLmluc3RhbmNlLCAwTCk7CisgICAgICAgIGFzc2VydEFic0VxdWFscygzTCwgTG9uZ1R5cGUuaW5zdGFuY2UsIC0zTCk7CisKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKDFMLCBDb3VudGVyQ29sdW1uVHlwZS5pbnN0YW5jZSwgMUwpOworICAgICAgICBhc3NlcnRBYnNFcXVhbHMoMEwsIENvdW50ZXJDb2x1bW5UeXBlLmluc3RhbmNlLCAwTCk7CisgICAgICAgIGFzc2VydEFic0VxdWFscygzTCwgQ291bnRlckNvbHVtblR5cGUuaW5zdGFuY2UsIC0zTCk7CisKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKDEuMCwgRG91YmxlVHlwZS5pbnN0YW5jZSwgMS4wKTsKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKDEuNSwgRG91YmxlVHlwZS5pbnN0YW5jZSwgMS41KTsKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKDAuMCwgRG91YmxlVHlwZS5pbnN0YW5jZSwgMC4wKTsKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKDMuMCwgRG91YmxlVHlwZS5pbnN0YW5jZSwgLTMuMCk7CisgICAgICAgIGFzc2VydEFic0VxdWFscygzLjcsIERvdWJsZVR5cGUuaW5zdGFuY2UsIC0zLjcpOworCisgICAgICAgIGFzc2VydEFic0VxdWFscyhCaWdJbnRlZ2VyLk9ORSwgSW50ZWdlclR5cGUuaW5zdGFuY2UsIEJpZ0ludGVnZXIuT05FKTsKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKEJpZ0ludGVnZXIuWkVSTywgSW50ZWdlclR5cGUuaW5zdGFuY2UsIEJpZ0ludGVnZXIuWkVSTyk7CisgICAgICAgIGFzc2VydEFic0VxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoMyksIEludGVnZXJUeXBlLmluc3RhbmNlLCBCaWdJbnRlZ2VyLnZhbHVlT2YoLTMpKTsKKworICAgICAgICBhc3NlcnRBYnNFcXVhbHMoQmlnRGVjaW1hbC5PTkUsIERlY2ltYWxUeXBlLmluc3RhbmNlLCBCaWdEZWNpbWFsLk9ORSk7CisgICAgICAgIGFzc2VydEFic0VxdWFscyhCaWdEZWNpbWFsLnZhbHVlT2YoMS41KSwgRGVjaW1hbFR5cGUuaW5zdGFuY2UsIEJpZ0RlY2ltYWwudmFsdWVPZigxLjUpKTsKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKEJpZ0RlY2ltYWwuWkVSTywgRGVjaW1hbFR5cGUuaW5zdGFuY2UsIEJpZ0RlY2ltYWwuWkVSTyk7CisgICAgICAgIGFzc2VydEFic0VxdWFscyhCaWdEZWNpbWFsLnZhbHVlT2YoMyksIERlY2ltYWxUeXBlLmluc3RhbmNlLCBCaWdEZWNpbWFsLnZhbHVlT2YoLTMpKTsKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKEJpZ0RlY2ltYWwudmFsdWVPZigzLjcpLCBEZWNpbWFsVHlwZS5pbnN0YW5jZSwgQmlnRGVjaW1hbC52YWx1ZU9mKC0zLjcpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUIGV4dGVuZHMgTnVtYmVyPiB2b2lkIGFzc2VydEFic0VxdWFscyhUIGV4cGVjdGVkLCBOdW1iZXJUeXBlPFQ+IGlucHV0VHlwZSwgVCBpbnB1dFZhbHVlKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RmN0RXF1YWxzKE1hdGhGY3RzLmFic0ZjdChpbnB1dFR5cGUpLCBleHBlY3RlZCwgaW5wdXRUeXBlLCBpbnB1dFZhbHVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHAoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKChpbnQpIE1hdGgucG93KE1hdGguRSwgNSksIEludDMyVHlwZS5pbnN0YW5jZSwgNSk7CisgICAgICAgIGFzc2VydEV4cEVxdWFscygoaW50KSBNYXRoLkUsIEludDMyVHlwZS5pbnN0YW5jZSwgMSk7CisgICAgICAgIGFzc2VydEV4cEVxdWFscygxLCBJbnQzMlR5cGUuaW5zdGFuY2UsIDApOworICAgICAgICBhc3NlcnRFeHBFcXVhbHMoKGludCkgTWF0aC5wb3coTWF0aC5FLCAtMSksIEludDMyVHlwZS5pbnN0YW5jZSwgLTEpOworCisgICAgICAgIGFzc2VydEV4cEVxdWFscygoYnl0ZSkgTWF0aC5wb3coTWF0aC5FLCA1KSwgQnl0ZVR5cGUuaW5zdGFuY2UsIChieXRlKSA1KTsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKChieXRlKSBNYXRoLkUsIEJ5dGVUeXBlLmluc3RhbmNlLCAoYnl0ZSkgMSk7CisgICAgICAgIGFzc2VydEV4cEVxdWFscygoYnl0ZSkgMSwgQnl0ZVR5cGUuaW5zdGFuY2UsIChieXRlKSAwKTsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKChieXRlKSBNYXRoLnBvdyhNYXRoLkUsIC0xKSwgQnl0ZVR5cGUuaW5zdGFuY2UsIChieXRlKSAtMSk7CisKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKChzaG9ydCkgTWF0aC5wb3coTWF0aC5FLCA1KSwgU2hvcnRUeXBlLmluc3RhbmNlLCAoc2hvcnQpIDUpOworICAgICAgICBhc3NlcnRFeHBFcXVhbHMoKHNob3J0KSBNYXRoLkUsIFNob3J0VHlwZS5pbnN0YW5jZSwgKHNob3J0KSAxKTsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKChzaG9ydCkgMSwgU2hvcnRUeXBlLmluc3RhbmNlLCAoc2hvcnQpIDApOworICAgICAgICBhc3NlcnRFeHBFcXVhbHMoKHNob3J0KSBNYXRoLnBvdyhNYXRoLkUsIC0xKSwgU2hvcnRUeXBlLmluc3RhbmNlLCAoc2hvcnQpIC0xKTsKKworICAgICAgICBhc3NlcnRFeHBFcXVhbHMoKGZsb2F0KSBNYXRoLnBvdyhNYXRoLkUsIDUpLCBGbG9hdFR5cGUuaW5zdGFuY2UsIDVGKTsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKChmbG9hdCkgTWF0aC5FLCBGbG9hdFR5cGUuaW5zdGFuY2UsIDFGKTsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKDFGLCBGbG9hdFR5cGUuaW5zdGFuY2UsIDBGKTsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKChmbG9hdCkgTWF0aC5wb3coTWF0aC5FLCAtMSksIEZsb2F0VHlwZS5pbnN0YW5jZSwgLTFGKTsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKChmbG9hdCkgTWF0aC5wb3coTWF0aC5FLCAtMi41KSwgRmxvYXRUeXBlLmluc3RhbmNlLCAtMi41Rik7CisKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKChsb25nKSBNYXRoLnBvdyhNYXRoLkUsIDUpLCBMb25nVHlwZS5pbnN0YW5jZSwgNUwpOworICAgICAgICBhc3NlcnRFeHBFcXVhbHMoKGxvbmcpIE1hdGguRSwgTG9uZ1R5cGUuaW5zdGFuY2UsIDFMKTsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKDFMLCBMb25nVHlwZS5pbnN0YW5jZSwgMEwpOworICAgICAgICBhc3NlcnRFeHBFcXVhbHMoKGxvbmcpIE1hdGgucG93KE1hdGguRSwgLTEpLCBMb25nVHlwZS5pbnN0YW5jZSwgLTFMKTsKKworICAgICAgICBhc3NlcnRFeHBFcXVhbHMoKGxvbmcpIE1hdGgucG93KE1hdGguRSwgNSksIENvdW50ZXJDb2x1bW5UeXBlLmluc3RhbmNlLCA1TCk7CisgICAgICAgIGFzc2VydEV4cEVxdWFscygobG9uZykgTWF0aC5FLCBDb3VudGVyQ29sdW1uVHlwZS5pbnN0YW5jZSwgMUwpOworICAgICAgICBhc3NlcnRFeHBFcXVhbHMoMUwsIENvdW50ZXJDb2x1bW5UeXBlLmluc3RhbmNlLCAwTCk7CisgICAgICAgIGFzc2VydEV4cEVxdWFscygobG9uZykgTWF0aC5wb3coTWF0aC5FLCAtMSksIENvdW50ZXJDb2x1bW5UeXBlLmluc3RhbmNlLCAtMUwpOworCisgICAgICAgIGFzc2VydEV4cEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoKGxvbmcpIE1hdGgucG93KE1hdGguRSwgNSkpLCBJbnRlZ2VyVHlwZS5pbnN0YW5jZSwgQmlnSW50ZWdlci52YWx1ZU9mKDUpKTsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigobG9uZykgTWF0aC5FKSwgSW50ZWdlclR5cGUuaW5zdGFuY2UsIEJpZ0ludGVnZXIudmFsdWVPZigxKSk7CisgICAgICAgIGFzc2VydEV4cEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoMSksIEludGVnZXJUeXBlLmluc3RhbmNlLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMCkpOworICAgICAgICBhc3NlcnRFeHBFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKChsb25nKSBNYXRoLnBvdyhNYXRoLkUsIC0xKSksIEludGVnZXJUeXBlLmluc3RhbmNlLCBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpKTsKKworICAgICAgICBhc3NlcnRFeHBFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjE0OC40MTMxNTkxMDI1NzY2MDM0MjExMTU1ODAwNDA1NSIpLCBEZWNpbWFsVHlwZS5pbnN0YW5jZSwgQmlnRGVjaW1hbC52YWx1ZU9mKDUpKTsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIyLjcxODI4MTgyODQ1OTA0NTIzNTM2MDI4NzQ3MTM1MjciKSwgRGVjaW1hbFR5cGUuaW5zdGFuY2UsIEJpZ0RlY2ltYWwudmFsdWVPZigxKSk7CisgICAgICAgIGFzc2VydEV4cEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiMSIpLCBEZWNpbWFsVHlwZS5pbnN0YW5jZSwgQmlnRGVjaW1hbC52YWx1ZU9mKDApKTsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIwLjM2Nzg3OTQ0MTE3MTQ0MjMyMTU5NTUyMzc3MDE2MTQ2IiksIERlY2ltYWxUeXBlLmluc3RhbmNlLCBCaWdEZWNpbWFsLnZhbHVlT2YoLTEpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUIGV4dGVuZHMgTnVtYmVyPiB2b2lkIGFzc2VydEV4cEVxdWFscyhUIGV4cGVjdGVkLCBOdW1iZXJUeXBlPFQ+IGlucHV0VHlwZSwgVCBpbnB1dFZhbHVlKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RmN0RXF1YWxzKE1hdGhGY3RzLmV4cEZjdChpbnB1dFR5cGUpLCBleHBlY3RlZCwgaW5wdXRUeXBlLCBpbnB1dFZhbHVlKTsKKyAgICB9CisKKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nKCkKKyAgICB7CisgICAgICAgIGFzc2VydExvZ0VxdWFscygoaW50KSBNYXRoLmxvZyg1KSwgSW50MzJUeXBlLmluc3RhbmNlLCA1KTsKKyAgICAgICAgYXNzZXJ0TG9nRXF1YWxzKDAsIEludDMyVHlwZS5pbnN0YW5jZSwgKGludCkgTWF0aC5FKTsKKyAgICAgICAgYXNzZXJ0TG9nRXF1YWxzKDAsIEludDMyVHlwZS5pbnN0YW5jZSwgMSk7CisgICAgICAgIGFzc2VydExvZ0VxdWFscygoaW50KSBNYXRoLmxvZygtMSksIEludDMyVHlwZS5pbnN0YW5jZSwgLTEpOworCisgICAgICAgIGFzc2VydExvZ0VxdWFscygoYnl0ZSkgTWF0aC5sb2coNSksIEJ5dGVUeXBlLmluc3RhbmNlLCAoYnl0ZSkgNSk7CisgICAgICAgIGFzc2VydExvZ0VxdWFscygoYnl0ZSkgMCwgQnl0ZVR5cGUuaW5zdGFuY2UsIChieXRlKSBNYXRoLkUpOworICAgICAgICBhc3NlcnRMb2dFcXVhbHMoKGJ5dGUpIDAsIEJ5dGVUeXBlLmluc3RhbmNlLCAoYnl0ZSkgMSk7CisgICAgICAgIGFzc2VydExvZ0VxdWFscygoYnl0ZSkgTWF0aC5sb2coLTEpLCBCeXRlVHlwZS5pbnN0YW5jZSwgKGJ5dGUpIC0xKTsKKworICAgICAgICBhc3NlcnRMb2dFcXVhbHMoKHNob3J0KSBNYXRoLmxvZyg1KSwgU2hvcnRUeXBlLmluc3RhbmNlLCAoc2hvcnQpIDUpOworICAgICAgICBhc3NlcnRMb2dFcXVhbHMoKHNob3J0KSAwLCBTaG9ydFR5cGUuaW5zdGFuY2UsIChzaG9ydCkgTWF0aC5FKTsKKyAgICAgICAgYXNzZXJ0TG9nRXF1YWxzKChzaG9ydCkgMCwgU2hvcnRUeXBlLmluc3RhbmNlLCAoc2hvcnQpIDEpOworICAgICAgICBhc3NlcnRMb2dFcXVhbHMoKHNob3J0KSBNYXRoLmxvZygtMSksIFNob3J0VHlwZS5pbnN0YW5jZSwgKHNob3J0KSAtMSk7CisKKyAgICAgICAgYXNzZXJ0TG9nRXF1YWxzKChmbG9hdCkgTWF0aC5sb2coNS41RiksIEZsb2F0VHlwZS5pbnN0YW5jZSwgNS41RiwgMC4wMDAwMDAxKTsKKyAgICAgICAgYXNzZXJ0TG9nRXF1YWxzKDFGLCBGbG9hdFR5cGUuaW5zdGFuY2UsIChmbG9hdCkgTWF0aC5FLCAwLjAwMDAwMDEpOworICAgICAgICBhc3NlcnRMb2dFcXVhbHMoMEYsIEZsb2F0VHlwZS5pbnN0YW5jZSwgMUYsIDAuMDAwMDAwMSk7CisgICAgICAgIGFzc2VydExvZ0VxdWFscygoZmxvYXQpIE1hdGgubG9nKC0xRiksIEZsb2F0VHlwZS5pbnN0YW5jZSwgLTFGLCAwLjAwMDAwMDEpOworCisKKyAgICAgICAgYXNzZXJ0TG9nRXF1YWxzKChsb25nKSBNYXRoLmxvZyg1KSwgTG9uZ1R5cGUuaW5zdGFuY2UsIDVMKTsKKyAgICAgICAgYXNzZXJ0TG9nRXF1YWxzKDBMLCBMb25nVHlwZS5pbnN0YW5jZSwgKGxvbmcpIE1hdGguRSk7CisgICAgICAgIGFzc2VydExvZ0VxdWFscygwTCwgTG9uZ1R5cGUuaW5zdGFuY2UsIDFMKTsKKyAgICAgICAgYXNzZXJ0TG9nRXF1YWxzKChsb25nKSBNYXRoLmxvZygtMSksIExvbmdUeXBlLmluc3RhbmNlLCAtMUwpOworCisgICAgICAgIGFzc2VydExvZ0VxdWFscygobG9uZykgTWF0aC5sb2coNSksIENvdW50ZXJDb2x1bW5UeXBlLmluc3RhbmNlLCA1TCk7CisgICAgICAgIGFzc2VydExvZ0VxdWFscygwTCwgQ291bnRlckNvbHVtblR5cGUuaW5zdGFuY2UsIChsb25nKSBNYXRoLkUpOworICAgICAgICBhc3NlcnRMb2dFcXVhbHMoMEwsIENvdW50ZXJDb2x1bW5UeXBlLmluc3RhbmNlLCAxTCk7CisgICAgICAgIGFzc2VydExvZ0VxdWFscygobG9uZykgTWF0aC5sb2coLTEpLCBDb3VudGVyQ29sdW1uVHlwZS5pbnN0YW5jZSwgLTFMKTsKKworICAgICAgICBhc3NlcnRMb2dFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKChsb25nKSBNYXRoLmxvZyg1KSksIEludGVnZXJUeXBlLmluc3RhbmNlLCBCaWdJbnRlZ2VyLnZhbHVlT2YoNSkpOworICAgICAgICBhc3NlcnRMb2dFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDApLCBJbnRlZ2VyVHlwZS5pbnN0YW5jZSwgQmlnSW50ZWdlci52YWx1ZU9mKChsb25nKSBNYXRoLkUpKTsKKyAgICAgICAgYXNzZXJ0TG9nRXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigwKSwgSW50ZWdlclR5cGUuaW5zdGFuY2UsIEJpZ0ludGVnZXIudmFsdWVPZigxKSk7CisKKyAgICAgICAgYXNzZXJ0TG9nRXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIxLjYwOTQzNzkxMjQzNDEwMDM3NDYwMDc1OTMzMzIyNjIiKSwgRGVjaW1hbFR5cGUuaW5zdGFuY2UsIEJpZ0RlY2ltYWwudmFsdWVPZig1KSk7CisgICAgICAgIGFzc2VydExvZ0VxdWFscyhuZXcgQmlnRGVjaW1hbCgiMCIpLCBEZWNpbWFsVHlwZS5pbnN0YW5jZSwgQmlnRGVjaW1hbC52YWx1ZU9mKDEpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUIGV4dGVuZHMgTnVtYmVyPiB2b2lkIGFzc2VydExvZ0VxdWFscyhUIGV4cGVjdGVkLCBOdW1iZXJUeXBlPFQ+IGlucHV0VHlwZSwgVCBpbnB1dFZhbHVlKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RmN0RXF1YWxzKE1hdGhGY3RzLmxvZ0ZjdChpbnB1dFR5cGUpLCBleHBlY3RlZCwgaW5wdXRUeXBlLCBpbnB1dFZhbHVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUIGV4dGVuZHMgTnVtYmVyPiB2b2lkIGFzc2VydExvZ0VxdWFscyhUIGV4cGVjdGVkLCBOdW1iZXJUeXBlPFQ+IGlucHV0VHlwZSwgVCBpbnB1dFZhbHVlLCBkb3VibGUgZGVsdGEpCisgICAgeworICAgICAgICBhc3NlcnRGY3RFcXVhbHMoTWF0aEZjdHMubG9nRmN0KGlucHV0VHlwZSksIGV4cGVjdGVkLCBpbnB1dFR5cGUsIGlucHV0VmFsdWUsIGRlbHRhKTsKKyAgICB9CisgICAgCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nMTAoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0TG9nMTBFcXVhbHMoKGludCkgTWF0aC5sb2cxMCg1KSwgSW50MzJUeXBlLmluc3RhbmNlLCA1KTsKKyAgICAgICAgYXNzZXJ0TG9nMTBFcXVhbHMoMCwgSW50MzJUeXBlLmluc3RhbmNlLCAoaW50KSBNYXRoLkUpOworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscygwLCBJbnQzMlR5cGUuaW5zdGFuY2UsIDEpOworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscygoaW50KSBNYXRoLmxvZzEwKC0xKSwgSW50MzJUeXBlLmluc3RhbmNlLCAtMSk7CisKKyAgICAgICAgYXNzZXJ0TG9nMTBFcXVhbHMoKGJ5dGUpIE1hdGgubG9nMTAoNSksIEJ5dGVUeXBlLmluc3RhbmNlLCAoYnl0ZSkgNSk7CisgICAgICAgIGFzc2VydExvZzEwRXF1YWxzKChieXRlKSAwLCBCeXRlVHlwZS5pbnN0YW5jZSwgKGJ5dGUpIE1hdGguRSk7CisgICAgICAgIGFzc2VydExvZzEwRXF1YWxzKChieXRlKSAwLCBCeXRlVHlwZS5pbnN0YW5jZSwgKGJ5dGUpIDEpOworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscygoYnl0ZSkgTWF0aC5sb2cxMCgtMSksIEJ5dGVUeXBlLmluc3RhbmNlLCAoYnl0ZSkgLTEpOworCisgICAgICAgIGFzc2VydExvZzEwRXF1YWxzKChzaG9ydCkgTWF0aC5sb2cxMCg1KSwgU2hvcnRUeXBlLmluc3RhbmNlLCAoc2hvcnQpIDUpOworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscygoc2hvcnQpIDAsIFNob3J0VHlwZS5pbnN0YW5jZSwgKHNob3J0KSBNYXRoLkUpOworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscygoc2hvcnQpIDAsIFNob3J0VHlwZS5pbnN0YW5jZSwgKHNob3J0KSAxKTsKKyAgICAgICAgYXNzZXJ0TG9nMTBFcXVhbHMoKHNob3J0KSBNYXRoLmxvZzEwKC0xKSwgU2hvcnRUeXBlLmluc3RhbmNlLCAoc2hvcnQpIC0xKTsKKworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscygoZmxvYXQpIE1hdGgubG9nMTAoNS41RiksIEZsb2F0VHlwZS5pbnN0YW5jZSwgNS41RiwgMC4wMDAwMDAxKTsKKyAgICAgICAgYXNzZXJ0TG9nMTBFcXVhbHMoMUYsIEZsb2F0VHlwZS5pbnN0YW5jZSwgMTBGLCAwLjAwMDAwMDEpOworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscygwRiwgRmxvYXRUeXBlLmluc3RhbmNlLCAxRiwgMC4wMDAwMDAxKTsKKyAgICAgICAgYXNzZXJ0TG9nMTBFcXVhbHMoKGZsb2F0KSBNYXRoLmxvZzEwKC0xRiksIEZsb2F0VHlwZS5pbnN0YW5jZSwgLTFGLCAwLjAwMDAwMDEpOworCisKKyAgICAgICAgYXNzZXJ0TG9nMTBFcXVhbHMoKGxvbmcpIE1hdGgubG9nMTAoNSksIExvbmdUeXBlLmluc3RhbmNlLCA1TCk7CisgICAgICAgIGFzc2VydExvZzEwRXF1YWxzKDBMLCBMb25nVHlwZS5pbnN0YW5jZSwgKGxvbmcpIE1hdGguRSk7CisgICAgICAgIGFzc2VydExvZzEwRXF1YWxzKDBMLCBMb25nVHlwZS5pbnN0YW5jZSwgMUwpOworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscygobG9uZykgTWF0aC5sb2cxMCgtMSksIExvbmdUeXBlLmluc3RhbmNlLCAtMUwpOworCisgICAgICAgIGFzc2VydExvZzEwRXF1YWxzKChsb25nKSBNYXRoLmxvZzEwKDUpLCBDb3VudGVyQ29sdW1uVHlwZS5pbnN0YW5jZSwgNUwpOworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscygwTCwgQ291bnRlckNvbHVtblR5cGUuaW5zdGFuY2UsIChsb25nKSBNYXRoLkUpOworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscygwTCwgQ291bnRlckNvbHVtblR5cGUuaW5zdGFuY2UsIDFMKTsKKyAgICAgICAgYXNzZXJ0TG9nMTBFcXVhbHMoKGxvbmcpIE1hdGgubG9nMTAoLTEpLCBDb3VudGVyQ29sdW1uVHlwZS5pbnN0YW5jZSwgLTFMKTsKKworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoKGxvbmcpIE1hdGgubG9nMTAoNSkpLCBJbnRlZ2VyVHlwZS5pbnN0YW5jZSwgQmlnSW50ZWdlci52YWx1ZU9mKDUpKTsKKyAgICAgICAgYXNzZXJ0TG9nMTBFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDApLCBJbnRlZ2VyVHlwZS5pbnN0YW5jZSwgQmlnSW50ZWdlci52YWx1ZU9mKChsb25nKSBNYXRoLkUpKTsKKyAgICAgICAgYXNzZXJ0TG9nMTBFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDApLCBJbnRlZ2VyVHlwZS5pbnN0YW5jZSwgQmlnSW50ZWdlci52YWx1ZU9mKDEpKTsKKworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiMC42OTg5NzAwMDQzMzYwMTg4MDQ3ODYyNjExMDUyNzU1MSIpLCBEZWNpbWFsVHlwZS5pbnN0YW5jZSwgQmlnRGVjaW1hbC52YWx1ZU9mKDUpKTsKKyAgICAgICAgYXNzZXJ0TG9nMTBFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjAiKSwgRGVjaW1hbFR5cGUuaW5zdGFuY2UsIEJpZ0RlY2ltYWwudmFsdWVPZigxKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSA8VCBleHRlbmRzIE51bWJlcj4gdm9pZCBhc3NlcnRMb2cxMEVxdWFscyhUIGV4cGVjdGVkLCBOdW1iZXJUeXBlPFQ+IGlucHV0VHlwZSwgVCBpbnB1dFZhbHVlKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RmN0RXF1YWxzKE1hdGhGY3RzLmxvZzEwRmN0KGlucHV0VHlwZSksIGV4cGVjdGVkLCBpbnB1dFR5cGUsIGlucHV0VmFsdWUpOworICAgIH0KKworICAgIHByaXZhdGUgPFQgZXh0ZW5kcyBOdW1iZXI+IHZvaWQgYXNzZXJ0TG9nMTBFcXVhbHMoVCBleHBlY3RlZCwgTnVtYmVyVHlwZTxUPiBpbnB1dFR5cGUsIFQgaW5wdXRWYWx1ZSwgZG91YmxlIGRlbHRhKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RmN0RXF1YWxzKE1hdGhGY3RzLmxvZzEwRmN0KGlucHV0VHlwZSksIGV4cGVjdGVkLCBpbnB1dFR5cGUsIGlucHV0VmFsdWUsIGRlbHRhKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSb3VuZCgpCisgICAgeworICAgICAgICBhc3NlcnRSb3VuZEVxdWFscyg1LCBJbnQzMlR5cGUuaW5zdGFuY2UsIDUpOworICAgICAgICBhc3NlcnRSb3VuZEVxdWFscygwLCBJbnQzMlR5cGUuaW5zdGFuY2UsIDApOworICAgICAgICBhc3NlcnRSb3VuZEVxdWFscygtMSwgSW50MzJUeXBlLmluc3RhbmNlLCAtMSk7CisKKyAgICAgICAgYXNzZXJ0Um91bmRFcXVhbHMoKGJ5dGUpIDUsIEJ5dGVUeXBlLmluc3RhbmNlLCAoYnl0ZSkgNSk7CisgICAgICAgIGFzc2VydFJvdW5kRXF1YWxzKChieXRlKSAwLCBCeXRlVHlwZS5pbnN0YW5jZSwgKGJ5dGUpIDApOworICAgICAgICBhc3NlcnRSb3VuZEVxdWFscygoYnl0ZSkgLTEsIEJ5dGVUeXBlLmluc3RhbmNlLCAoYnl0ZSkgLTEpOworCisgICAgICAgIGFzc2VydFJvdW5kRXF1YWxzKChzaG9ydCkgNSwgU2hvcnRUeXBlLmluc3RhbmNlLCAoc2hvcnQpIDUpOworICAgICAgICBhc3NlcnRSb3VuZEVxdWFscygoc2hvcnQpIDAsIFNob3J0VHlwZS5pbnN0YW5jZSwgKHNob3J0KSAwKTsKKyAgICAgICAgYXNzZXJ0Um91bmRFcXVhbHMoKHNob3J0KSAtMSwgU2hvcnRUeXBlLmluc3RhbmNlLCAoc2hvcnQpIC0xKTsKKworICAgICAgICBhc3NlcnRSb3VuZEVxdWFscygoZmxvYXQpIE1hdGgucm91bmQoNS41RiksIEZsb2F0VHlwZS5pbnN0YW5jZSwgNS41Rik7CisgICAgICAgIGFzc2VydFJvdW5kRXF1YWxzKDFGLCBGbG9hdFR5cGUuaW5zdGFuY2UsIDFGKTsKKyAgICAgICAgYXNzZXJ0Um91bmRFcXVhbHMoMEYsIEZsb2F0VHlwZS5pbnN0YW5jZSwgMEYpOworICAgICAgICBhc3NlcnRSb3VuZEVxdWFscygoZmxvYXQpIE1hdGgucm91bmQoLTEuNUYpLCBGbG9hdFR5cGUuaW5zdGFuY2UsIC0xLjVGKTsKKworCisgICAgICAgIGFzc2VydFJvdW5kRXF1YWxzKDVMLCBMb25nVHlwZS5pbnN0YW5jZSwgNUwpOworICAgICAgICBhc3NlcnRSb3VuZEVxdWFscygwTCwgTG9uZ1R5cGUuaW5zdGFuY2UsIDBMKTsKKyAgICAgICAgYXNzZXJ0Um91bmRFcXVhbHMoLTFMLCBMb25nVHlwZS5pbnN0YW5jZSwgLTFMKTsKKworICAgICAgICBhc3NlcnRSb3VuZEVxdWFscyg1TCwgQ291bnRlckNvbHVtblR5cGUuaW5zdGFuY2UsIDVMKTsKKyAgICAgICAgYXNzZXJ0Um91bmRFcXVhbHMoMEwsIENvdW50ZXJDb2x1bW5UeXBlLmluc3RhbmNlLCAwTCk7CisgICAgICAgIGFzc2VydFJvdW5kRXF1YWxzKC0xTCwgQ291bnRlckNvbHVtblR5cGUuaW5zdGFuY2UsIC0xTCk7CisKKyAgICAgICAgYXNzZXJ0Um91bmRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDUpLCBJbnRlZ2VyVHlwZS5pbnN0YW5jZSwgQmlnSW50ZWdlci52YWx1ZU9mKDUpKTsKKyAgICAgICAgYXNzZXJ0Um91bmRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDApLCBJbnRlZ2VyVHlwZS5pbnN0YW5jZSwgQmlnSW50ZWdlci52YWx1ZU9mKDApKTsKKyAgICAgICAgYXNzZXJ0Um91bmRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKC0xKSwgSW50ZWdlclR5cGUuaW5zdGFuY2UsIEJpZ0ludGVnZXIudmFsdWVPZigtMSkpOworCisgICAgICAgIGFzc2VydFJvdW5kRXF1YWxzKG5ldyBCaWdEZWNpbWFsKCI2IiksIERlY2ltYWxUeXBlLmluc3RhbmNlLCBCaWdEZWNpbWFsLnZhbHVlT2YoNS41KSk7CisgICAgICAgIGFzc2VydFJvdW5kRXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIxIiksIERlY2ltYWxUeXBlLmluc3RhbmNlLCBCaWdEZWNpbWFsLnZhbHVlT2YoMSkpOworICAgICAgICBhc3NlcnRSb3VuZEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiMCIpLCBEZWNpbWFsVHlwZS5pbnN0YW5jZSwgQmlnRGVjaW1hbC52YWx1ZU9mKDApKTsKKyAgICAgICAgYXNzZXJ0Um91bmRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIi0yIiksIERlY2ltYWxUeXBlLmluc3RhbmNlLCBCaWdEZWNpbWFsLnZhbHVlT2YoLTEuNSkpOworICAgIH0KKworICAgIHByaXZhdGUgPFQgZXh0ZW5kcyBOdW1iZXI+IHZvaWQgYXNzZXJ0Um91bmRFcXVhbHMoVCBleHBlY3RlZCwgTnVtYmVyVHlwZTxUPiBpbnB1dFR5cGUsIFQgaW5wdXRWYWx1ZSkKKyAgICB7CisgICAgICAgIGFzc2VydEZjdEVxdWFscyhNYXRoRmN0cy5yb3VuZEZjdChpbnB1dFR5cGUpLCBleHBlY3RlZCwgaW5wdXRUeXBlLCBpbnB1dFZhbHVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBCeXRlQnVmZmVyIGV4ZWN1dGVGdW5jdGlvbihGdW5jdGlvbiBmdW5jdGlvbiwgQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1zID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChpbnB1dCk7CisgICAgICAgIHJldHVybiAoKFNjYWxhckZ1bmN0aW9uKSBmdW5jdGlvbikuZXhlY3V0ZShQcm90b2NvbFZlcnNpb24uQ1VSUkVOVCwgcGFyYW1zKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUIGV4dGVuZHMgTnVtYmVyPiB2b2lkIGFzc2VydEZjdEVxdWFscyhOYXRpdmVGdW5jdGlvbiBmY3QsIFQgZXhwZWN0ZWQsIE51bWJlclR5cGU8VD4gaW5wdXRUeXBlLCBUIGlucHV0VmFsdWUpCisgICAgeworICAgICAgICBCeXRlQnVmZmVyIGlucHV0ID0gaW5wdXRUeXBlLmRlY29tcG9zZShpbnB1dFZhbHVlKTsKKyAgICAgICAgaWYgKGV4cGVjdGVkIGluc3RhbmNlb2YgQmlnRGVjaW1hbCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhpcyBibG9jayBpcyB0byBkZWFsIHdpdGggdGhlIGVkZ2VjYXNlIHdoZXJlIHR3byBCaWdEZWNpbWFscycgdmFsdWVzIGFyZSBlcXVhbCBidXQgbm90IHRoZWlyIHNjYWxlLgorICAgICAgICAgICAgQmlnRGVjaW1hbCBiZEV4cGVjdGVkID0gKEJpZ0RlY2ltYWwpIGV4cGVjdGVkOworICAgICAgICAgICAgQmlnRGVjaW1hbCBiZElucHV0VmFsdWUgPSAoQmlnRGVjaW1hbCkgaW5wdXRUeXBlLmNvbXBvc2UoZXhlY3V0ZUZ1bmN0aW9uKGZjdCwgaW5wdXQpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhiZEV4cGVjdGVkLmNvbXBhcmVUbyhiZElucHV0VmFsdWUpLCAwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgaW5wdXRUeXBlLmNvbXBvc2UoZXhlY3V0ZUZ1bmN0aW9uKGZjdCwgaW5wdXQpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIDxUIGV4dGVuZHMgTnVtYmVyPiB2b2lkIGFzc2VydEZjdEVxdWFscyhOYXRpdmVGdW5jdGlvbiBmY3QsIFQgZXhwZWN0ZWQsIE51bWJlclR5cGU8VD4gaW5wdXRUeXBlLCBUIGlucHV0VmFsdWUsIGRvdWJsZSBkZWx0YSkKKyAgICB7CisgICAgICAgIEJ5dGVCdWZmZXIgaW5wdXQgPSBpbnB1dFR5cGUuZGVjb21wb3NlKGlucHV0VmFsdWUpOworICAgICAgICBUIGFjdHVhbCA9IGlucHV0VHlwZS5jb21wb3NlKGV4ZWN1dGVGdW5jdGlvbihmY3QsIGlucHV0KSk7CisgICAgICAgIGlmIChEb3VibGUuaXNOYU4oZXhwZWN0ZWQuZG91YmxlVmFsdWUoKSkpIHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKERvdWJsZS5pc05hTihhY3R1YWwuZG91YmxlVmFsdWUoKSkpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoTWF0aC5hYnMoZXhwZWN0ZWQuZG91YmxlVmFsdWUoKSAtIGFjdHVhbC5kb3VibGVWYWx1ZSgpKSA8PSBkZWx0YSk7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9OYXRpdmVGdW5jdGlvbnNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvTmF0aXZlRnVuY3Rpb25zVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZjM1NDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvTmF0aXZlRnVuY3Rpb25zVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHM7CitpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKKworcHVibGljIGNsYXNzIE5hdGl2ZUZ1bmN0aW9uc1Rlc3QKK3sKKyAgICAvKioKKyAgICAgKiBNYXAgYXNzb2NpYXRpbmcgb2xkIGZ1bmN0aW9ucyB0aGF0IGRvbid0IHNhdGlzZnkgdGhlIG5hbWluZyBjb252ZW50aW9ucyBhZG9wdGVkIGJ5IENBU1NBTkRSQS0xODAzNyB0byB0aGVpcgorICAgICAqIG5ldyBuYW1lcyBhY2NvcmRpbmcgdG8gdGhvc2UgY29udmVudGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBMRUdBQ1lfRlVOQ1RJT05fTkFNRVMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKQorICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgcHV0KCJjYXN0QXNBc2NpaSIsICJjYXN0X2FzX2FzY2lpIik7CisgICAgICAgICAgICBwdXQoImNhc3RBc0JpZ2ludCIsICJjYXN0X2FzX2JpZ2ludCIpOworICAgICAgICAgICAgcHV0KCJjYXN0QXNEYXRlIiwgImNhc3RfYXNfZGF0ZSIpOworICAgICAgICAgICAgcHV0KCJjYXN0QXNEZWNpbWFsIiwgImNhc3RfYXNfZGVjaW1hbCIpOworICAgICAgICAgICAgcHV0KCJjYXN0QXNEb3VibGUiLCAiY2FzdF9hc19kb3VibGUiKTsKKyAgICAgICAgICAgIHB1dCgiY2FzdEFzRmxvYXQiLCAiY2FzdF9hc19mbG9hdCIpOworICAgICAgICAgICAgcHV0KCJjYXN0QXNJbnQiLCAiY2FzdF9hc19pbnQiKTsKKyAgICAgICAgICAgIHB1dCgiY2FzdEFzU21hbGxpbnQiLCAiY2FzdF9hc19zbWFsbGludCIpOworICAgICAgICAgICAgcHV0KCJjYXN0QXNUZXh0IiwgImNhc3RfYXNfdGV4dCIpOworICAgICAgICAgICAgcHV0KCJjYXN0QXNUaW1lc3RhbXAiLCAiY2FzdF9hc190aW1lc3RhbXAiKTsKKyAgICAgICAgICAgIHB1dCgiY2FzdEFzVGlueWludCIsICJjYXN0X2FzX3RpbnlpbnQiKTsKKyAgICAgICAgICAgIHB1dCgiY2FzdEFzVmFyaW50IiwgImNhc3RfYXNfdmFyaW50Iik7CisgICAgICAgICAgICBwdXQoImJsb2Jhc2FzY2lpIiwgImJsb2JfYXNfYXNjaWkiKTsKKyAgICAgICAgICAgIHB1dCgiYmxvYmFzYmlnaW50IiwgImJsb2JfYXNfYmlnaW50Iik7CisgICAgICAgICAgICBwdXQoImJsb2Jhc2Jvb2xlYW4iLCAiYmxvYl9hc19ib29sZWFuIik7CisgICAgICAgICAgICBwdXQoImJsb2Jhc2NvdW50ZXIiLCAiYmxvYl9hc19jb3VudGVyIik7CisgICAgICAgICAgICBwdXQoImJsb2Jhc2RhdGUiLCAiYmxvYl9hc19kYXRlIik7CisgICAgICAgICAgICBwdXQoImJsb2Jhc2RlY2ltYWwiLCAiYmxvYl9hc19kZWNpbWFsIik7CisgICAgICAgICAgICBwdXQoImJsb2Jhc2RvdWJsZSIsICJibG9iX2FzX2RvdWJsZSIpOworICAgICAgICAgICAgcHV0KCJibG9iYXNkdXJhdGlvbiIsICJibG9iX2FzX2R1cmF0aW9uIik7CisgICAgICAgICAgICBwdXQoImJsb2Jhc2VtcHR5IiwgImJsb2JfYXNfZW1wdHkiKTsKKyAgICAgICAgICAgIHB1dCgiYmxvYmFzZmxvYXQiLCAiYmxvYl9hc19mbG9hdCIpOworICAgICAgICAgICAgcHV0KCJibG9iYXNpbmV0IiwgImJsb2JfYXNfaW5ldCIpOworICAgICAgICAgICAgcHV0KCJibG9iYXNpbnQiLCAiYmxvYl9hc19pbnQiKTsKKyAgICAgICAgICAgIHB1dCgiYmxvYmFzc21hbGxpbnQiLCAiYmxvYl9hc19zbWFsbGludCIpOworICAgICAgICAgICAgcHV0KCJibG9iYXN0ZXh0IiwgImJsb2JfYXNfdGV4dCIpOworICAgICAgICAgICAgcHV0KCJibG9iYXN0aW1lIiwgImJsb2JfYXNfdGltZSIpOworICAgICAgICAgICAgcHV0KCJibG9iYXN0aW1lc3RhbXAiLCAiYmxvYl9hc190aW1lc3RhbXAiKTsKKyAgICAgICAgICAgIHB1dCgiYmxvYmFzdGltZXV1aWQiLCAiYmxvYl9hc190aW1ldXVpZCIpOworICAgICAgICAgICAgcHV0KCJibG9iYXN0aW55aW50IiwgImJsb2JfYXNfdGlueWludCIpOworICAgICAgICAgICAgcHV0KCJibG9iYXN1dWlkIiwgImJsb2JfYXNfdXVpZCIpOworICAgICAgICAgICAgcHV0KCJibG9iYXN2YXJjaGFyIiwgImJsb2JfYXNfdmFyY2hhciIpOworICAgICAgICAgICAgcHV0KCJibG9iYXN2YXJpbnQiLCAiYmxvYl9hc192YXJpbnQiKTsKKyAgICAgICAgICAgIHB1dCgiYXNjaWlhc2Jsb2IiLCAiYXNjaWlfYXNfYmxvYiIpOworICAgICAgICAgICAgcHV0KCJiaWdpbnRhc2Jsb2IiLCAiYmlnaW50X2FzX2Jsb2IiKTsKKyAgICAgICAgICAgIHB1dCgiYm9vbGVhbmFzYmxvYiIsICJib29sZWFuX2FzX2Jsb2IiKTsKKyAgICAgICAgICAgIHB1dCgiY291bnRlcmFzYmxvYiIsICJjb3VudGVyX2FzX2Jsb2IiKTsKKyAgICAgICAgICAgIHB1dCgiZGF0ZWFzYmxvYiIsICJkYXRlX2FzX2Jsb2IiKTsKKyAgICAgICAgICAgIHB1dCgiZGVjaW1hbGFzYmxvYiIsICJkZWNpbWFsX2FzX2Jsb2IiKTsKKyAgICAgICAgICAgIHB1dCgiZG91YmxlYXNibG9iIiwgImRvdWJsZV9hc19ibG9iIik7CisgICAgICAgICAgICBwdXQoImR1cmF0aW9uYXNibG9iIiwgImR1cmF0aW9uX2FzX2Jsb2IiKTsKKyAgICAgICAgICAgIHB1dCgiZW1wdHlhc2Jsb2IiLCAiZW1wdHlfYXNfYmxvYiIpOworICAgICAgICAgICAgcHV0KCJmbG9hdGFzYmxvYiIsICJmbG9hdF9hc19ibG9iIik7CisgICAgICAgICAgICBwdXQoImluZXRhc2Jsb2IiLCAiaW5ldF9hc19ibG9iIik7CisgICAgICAgICAgICBwdXQoImludGFzYmxvYiIsICJpbnRfYXNfYmxvYiIpOworICAgICAgICAgICAgcHV0KCJzbWFsbGludGFzYmxvYiIsICJzbWFsbGludF9hc19ibG9iIik7CisgICAgICAgICAgICBwdXQoInRleHRhc2Jsb2IiLCAidGV4dF9hc19ibG9iIik7CisgICAgICAgICAgICBwdXQoInRpbWVhc2Jsb2IiLCAidGltZV9hc19ibG9iIik7CisgICAgICAgICAgICBwdXQoInRpbWVzdGFtcGFzYmxvYiIsICJ0aW1lc3RhbXBfYXNfYmxvYiIpOworICAgICAgICAgICAgcHV0KCJ0aW1ldXVpZGFzYmxvYiIsICJ0aW1ldXVpZF9hc19ibG9iIik7CisgICAgICAgICAgICBwdXQoInRpbnlpbnRhc2Jsb2IiLCAidGlueWludF9hc19ibG9iIik7CisgICAgICAgICAgICBwdXQoInV1aWRhc2Jsb2IiLCAidXVpZF9hc19ibG9iIik7CisgICAgICAgICAgICBwdXQoInZhcmNoYXJhc2Jsb2IiLCAidmFyY2hhcl9hc19ibG9iIik7CisgICAgICAgICAgICBwdXQoInZhcmludGFzYmxvYiIsICJ2YXJpbnRfYXNfYmxvYiIpOworICAgICAgICAgICAgcHV0KCJjb3VudFJvd3MiLCAiY291bnRfcm93cyIpOworICAgICAgICAgICAgcHV0KCJtYXh0aW1ldXVpZCIsICJtYXhfdGltZXV1aWQiKTsKKyAgICAgICAgICAgIHB1dCgibWludGltZXV1aWQiLCAibWluX3RpbWV1dWlkIik7CisgICAgICAgICAgICBwdXQoImN1cnJlbnRkYXRlIiwgImN1cnJlbnRfZGF0ZSIpOworICAgICAgICAgICAgcHV0KCJjdXJyZW50dGltZSIsICJjdXJyZW50X3RpbWUiKTsKKyAgICAgICAgICAgIHB1dCgiY3VycmVudHRpbWVzdGFtcCIsICJjdXJyZW50X3RpbWVzdGFtcCIpOworICAgICAgICAgICAgcHV0KCJjdXJyZW50dGltZXV1aWQiLCAiY3VycmVudF90aW1ldXVpZCIpOworICAgICAgICAgICAgcHV0KCJ0b2RhdGUiLCAidG9fZGF0ZSIpOworICAgICAgICAgICAgcHV0KCJ0b3RpbWVzdGFtcCIsICJ0b190aW1lc3RhbXAiKTsKKyAgICAgICAgICAgIHB1dCgidG91bml4dGltZXN0YW1wIiwgInRvX3VuaXhfdGltZXN0YW1wIik7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogTWFwIGFzc29jaWF0aW5nIG9sZCBmdW5jdGlvbnMgZmFjdG9yaWVzIHRoYXQgZG9uJ3Qgc2F0aXNmeSB0aGUgbmFtaW5nIGNvbnZlbnRpb25zIGFkb3B0ZWQgYnkgQ0FTU0FORFJBLTE4MDM3IHRvCisgICAgICogdGhlaXIgbmV3IG5hbWVzIGFjY29yZGluZyB0byB0aG9zZSBjb252ZW50aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IExFR0FDWV9GVU5DVElPTl9GQUNUT1JZX05BTUVTID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIHB1dCgidG9qc29uIiwgInRvX2pzb24iKTsKKyAgICAgICAgICAgIHB1dCgiZnJvbWpzb24iLCAiZnJvbV9qc29uIik7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogVmVyaWZ5IHRoYXQgdGhlIG9sZCBmdW5jdGlvbnMgdGhhdCBkb24ndCBzYXRpc2Z5IHRoZSBuYW1pbmcgY29udmVudGlvbnMgYWRvcHRlZCBieSBDQVNTQU5EUkEtMTgwMzcgaGF2ZSBhCisgICAgICogcmVwbGFjZW1lbnQgZnVuY3Rpb24gdGhhdCBzYXRpc2ZpZXMgdGhvc2UgY29udmVudGlvbnMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVwcmVjdGVkRnVuY3Rpb25OYW1lcygpCisgICAgeworICAgICAgICBOYXRpdmVGdW5jdGlvbnMgbmF0aXZlRnVuY3Rpb25zID0gTmF0aXZlRnVuY3Rpb25zLmluc3RhbmNlOworICAgICAgICBMRUdBQ1lfRlVOQ1RJT05fTkFNRVMuZm9yRWFjaCgob2xkTmFtZSwgbmV3TmFtZSkgLT4geworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KG5hdGl2ZUZ1bmN0aW9ucy5nZXRGdW5jdGlvbnMoRnVuY3Rpb25OYW1lLm5hdGl2ZUZ1bmN0aW9uKG9sZE5hbWUpKSkuaXNOb3RFbXB0eSgpOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KG5hdGl2ZUZ1bmN0aW9ucy5nZXRGdW5jdGlvbnMoRnVuY3Rpb25OYW1lLm5hdGl2ZUZ1bmN0aW9uKG5ld05hbWUpKSkuaXNOb3RFbXB0eSgpOworICAgICAgICB9KTsKKworICAgICAgICBmb3IgKE5hdGl2ZUZ1bmN0aW9uIGZ1bmN0aW9uIDogbmF0aXZlRnVuY3Rpb25zLmdldEZ1bmN0aW9ucygpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGZ1bmN0aW9uLm5hbWUubmFtZTsKKworICAgICAgICAgICAgaWYgKHNhdGlzZmllc0NvbnZlbnRpb25zKGZ1bmN0aW9uLm5hbWUpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoTEVHQUNZX0ZVTkNUSU9OX05BTUVTKS5jb250YWluc0tleShuYW1lKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uTmFtZSBuZXdOYW1lID0gRnVuY3Rpb25OYW1lLm5hdGl2ZUZ1bmN0aW9uKExFR0FDWV9GVU5DVElPTl9OQU1FUy5nZXQobmFtZSkpOworCisgICAgICAgICAgICBGdW5jdGlvbiBuZXdGdW5jdGlvbiA9IEZ1bmN0aW9uUmVzb2x2ZXIuZ2V0KFNjaGVtYUNvbnN0YW50cy5TWVNURU1fS0VZU1BBQ0VfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uYXJnVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLnJldHVyblR5cGUpOworCisgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQobmV3RnVuY3Rpb24pLmlzTm90TnVsbCgpOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGZ1bmN0aW9uKS5pc05vdEVxdWFsVG8obmV3RnVuY3Rpb24pOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGZ1bmN0aW9uKS5pc0VxdWFsVG8oKChOYXRpdmVGdW5jdGlvbikgbmV3RnVuY3Rpb24pLndpdGhMZWdhY3lOYW1lKCkpOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGZ1bmN0aW9uLmFyZ1R5cGVzKCkpLmlzRXF1YWxUbyhuZXdGdW5jdGlvbi5hcmdUeXBlcygpKTsKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChmdW5jdGlvbi5yZXR1cm5UeXBlKCkpLmlzRXF1YWxUbyhuZXdGdW5jdGlvbi5yZXR1cm5UeXBlKCkpOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGZ1bmN0aW9uLmdldENsYXNzKCkpLmlzRXF1YWxUbyhuZXdGdW5jdGlvbi5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChmdW5jdGlvbi5uYW1lKCkubmFtZS50b0xvd2VyQ2FzZSgpKQorICAgICAgICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oU3RyaW5nVXRpbHMucmVtb3ZlKG5ld0Z1bmN0aW9uLm5hbWUoKS5uYW1lLCAnXycpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmeSB0aGF0IHRoZSBvbGQgZnVuY3Rpb25zIGZ1bmN0aW9uIGZhY3RvcmllcyB0aGF0IGRvbid0IHNhdGlzZnkgdGhlIG5hbWluZyBjb252ZW50aW9ucyBhZG9wdGVkIGJ5CisgICAgICogQ0FTU0FORFJBLTE4MDM3IGhhdmUgYSByZXBsYWNlbWVudCBmdW5jdGlvbiBmYWN0b3J5IHRoYXQgc2F0aXNmaWVzIHRob3NlIGNvbnZlbnRpb25zLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlcHJlY3RlZEZ1bmN0aW9uRmFjdG9yeU5hbWVzKCkKKyAgICB7CisgICAgICAgIE5hdGl2ZUZ1bmN0aW9ucyBuYXRpdmVGdW5jdGlvbnMgPSBOYXRpdmVGdW5jdGlvbnMuaW5zdGFuY2U7CisgICAgICAgIExFR0FDWV9GVU5DVElPTl9GQUNUT1JZX05BTUVTLmZvckVhY2goKG9sZE5hbWUsIG5ld05hbWUpIC0+IHsKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChuYXRpdmVGdW5jdGlvbnMuZ2V0RmFjdG9yaWVzKEZ1bmN0aW9uTmFtZS5uYXRpdmVGdW5jdGlvbihvbGROYW1lKSkpLmlzTm90RW1wdHkoKTsKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChuYXRpdmVGdW5jdGlvbnMuZ2V0RmFjdG9yaWVzKEZ1bmN0aW9uTmFtZS5uYXRpdmVGdW5jdGlvbihuZXdOYW1lKSkpLmlzTm90RW1wdHkoKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgZm9yIChGdW5jdGlvbkZhY3RvcnkgZmFjdG9yeSA6IG5hdGl2ZUZ1bmN0aW9ucy5nZXRGYWN0b3JpZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBmYWN0b3J5Lm5hbWUubmFtZTsKKworICAgICAgICAgICAgaWYgKHNhdGlzZmllc0NvbnZlbnRpb25zKGZhY3RvcnkubmFtZSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChMRUdBQ1lfRlVOQ1RJT05fRkFDVE9SWV9OQU1FUykuY29udGFpbnNLZXkobmFtZSk7CisgICAgICAgICAgICBGdW5jdGlvbk5hbWUgbmV3TmFtZSA9IEZ1bmN0aW9uTmFtZS5uYXRpdmVGdW5jdGlvbihMRUdBQ1lfRlVOQ1RJT05fRkFDVE9SWV9OQU1FUy5nZXQobmFtZSkpOworICAgICAgICAgICAgQ29sbGVjdGlvbjxGdW5jdGlvbkZhY3Rvcnk+IG5ld0ZhY3RvcmllcyA9IE5hdGl2ZUZ1bmN0aW9ucy5pbnN0YW5jZS5nZXRGYWN0b3JpZXMobmV3TmFtZSk7CisKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChuZXdGYWN0b3JpZXMpLmhhc1NpemUoMSk7CisgICAgICAgICAgICBGdW5jdGlvbkZhY3RvcnkgbmV3RmFjdG9yeSA9IG5ld0ZhY3Rvcmllcy5pdGVyYXRvcigpLm5leHQoKTsKKworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGZhY3RvcnkpLmlzTm90RXF1YWxUbyhuZXdGYWN0b3J5KTsKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChmYWN0b3J5Lm5hbWUpLmlzTm90RXF1YWxUbyhuZXdGYWN0b3J5Lm5hbWUpOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGZhY3RvcnkucGFyYW1ldGVycykuaXNFcXVhbFRvKG5ld0ZhY3RvcnkucGFyYW1ldGVycyk7CisgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoZmFjdG9yeS5nZXRDbGFzcygpKS5pc0VxdWFsVG8obmV3RmFjdG9yeS5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChmYWN0b3J5Lm5hbWUoKS5uYW1lLnRvTG93ZXJDYXNlKCkpCisgICAgICAgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhTdHJpbmdVdGlscy5yZW1vdmUobmV3RmFjdG9yeS5uYW1lKCkubmFtZSwgJ18nKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNhdGlzZmllc0NvbnZlbnRpb25zKEZ1bmN0aW9uTmFtZSBmdW5jdGlvbk5hbWUpCisgICAgeworICAgICAgICBTdHJpbmcgbmFtZSA9IGZ1bmN0aW9uTmFtZS5uYW1lOworICAgICAgICByZXR1cm4gbmFtZS5lcXVhbHMobmFtZS50b0xvd2VyQ2FzZSgpKSAmJgorICAgICAgICAgICAgICAgIUxFR0FDWV9GVU5DVElPTl9OQU1FUy5jb250YWluc0tleShuYW1lKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVGltZUZjdHNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVGltZUZjdHNUZXN0LmphdmEKaW5kZXggYTEyNGU2MC4uYjBjYzFlMCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1RpbWVGY3RzVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9UaW1lRmN0c1Rlc3QuamF2YQpAQCAtODgsMTYgKzg4LDYgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REYXRlT2YoKQotICAgIHsKLQotICAgICAgICBsb25nIHRpbWVJbk1pbGxpcyA9IERBVEVfVElNRS50b0luc3RhbnQoKS50b0Vwb2NoTWlsbGkoKTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBpbnB1dCA9IEJ5dGVCdWZmZXIud3JhcChhdFVuaXhNaWxsaXNBc0J5dGVzKHRpbWVJbk1pbGxpcywgMCkpOwotICAgICAgICBCeXRlQnVmZmVyIG91dHB1dCA9IGV4ZWN1dGVGdW5jdGlvbihUaW1lRmN0cy5kYXRlT2ZGY3QsIGlucHV0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKERhdGUuZnJvbShEQVRFX1RJTUUudG9JbnN0YW50KCkpLCBUaW1lc3RhbXBUeXBlLmluc3RhbmNlLmNvbXBvc2Uob3V0cHV0KSk7Ci0gICAgfQotCi0gICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZVV1aWRUb1RpbWVzdGFtcCgpCiAgICAgewogICAgICAgICBsb25nIHRpbWVJbk1pbGxpcyA9IERBVEVfVElNRS50b0luc3RhbnQoKS50b0Vwb2NoTWlsbGkoKTsKQEAgLTEwNywxNSArOTcsNiBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFVuaXhUaW1lc3RhbXBPZkZjdCgpCi0gICAgewotICAgICAgICBsb25nIHRpbWVJbk1pbGxpcyA9IERBVEVfVElNRS50b0luc3RhbnQoKS50b0Vwb2NoTWlsbGkoKTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBpbnB1dCA9IEJ5dGVCdWZmZXIud3JhcChhdFVuaXhNaWxsaXNBc0J5dGVzKHRpbWVJbk1pbGxpcywgMCkpOwotICAgICAgICBCeXRlQnVmZmVyIG91dHB1dCA9IGV4ZWN1dGVGdW5jdGlvbihUaW1lRmN0cy51bml4VGltZXN0YW1wT2ZGY3QsIGlucHV0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRpbWVJbk1pbGxpcywgTG9uZ1R5cGUuaW5zdGFuY2UuY29tcG9zZShvdXRwdXQpLmxvbmdWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lVXVpZFRvVW5peFRpbWVzdGFtcCgpCiAgICAgewogICAgICAgICBsb25nIHRpbWVJbk1pbGxpcyA9IERBVEVfVElNRS50b0luc3RhbnQoKS50b0Vwb2NoTWlsbGkoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tJbkFueVBvc2l0aW9uVGVzdGVyLmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrSW5BbnlQb3NpdGlvblRlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MmFhYzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrSW5BbnlQb3NpdGlvblRlc3Rlci5qYXZhCkBAIC0wLDAgKzEsMjY3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmc7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CisKKy8qKgorICoge0BsaW5rIENvbHVtbk1hc2tUZXN0ZXJ9IHZlcmlmeWluZyB0aGF0IG1hc2tzIGNhbiBiZSBhcHBsaWVkIHRvIGNvbHVtbnMgaW4gYW55IHBvc2l0aW9uIChwYXJ0aXRpb24ga2V5IGNvbHVtbnMsCisgKiBjbHVzdGVyaW5nIGtleSBjb2x1bW5zLCBzdGF0aWMgY29sdW1ucyBhbmQgcmVndWxhciBjb2x1bW5zKS4gVGhlIGNvbHVtbnMgb2YgYW55IGRlcGVuZGluZyBtYXRlcmlhbGl6ZWQgdmlld3Mgc2hvdWxkCisgKiBiZSB1ZHBhdGVkIGFjY29yZGluZ2x5LgorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGFic3RyYWN0IGNsYXNzIENvbHVtbk1hc2tJbkFueVBvc2l0aW9uVGVzdGVyIGV4dGVuZHMgQ29sdW1uTWFza1Rlc3RlcgoreworICAgIC8qKiBUaGUgY29sdW1uIG1hc2sgYXMgZXhwcmVzc2VkIGluIENRTCBzdGF0ZW1lbnRzIHJpZ2h0IGFmdGVyIHRoZSB7QGNvZGUgTUFTS0VEIFdJVEh9IGtleXdvcmRzLiAqLworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcgorICAgIHB1YmxpYyBTdHJpbmcgbWFzazsKKworICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgbWFza2VkIGNvbHVtbiAqLworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcigxKQorICAgIHB1YmxpYyBTdHJpbmcgdHlwZTsKKworICAgIC8qKiBUaGUgdHlwZXMgb2YgdGhlIHRlc3RlZCBtYXNraW5nIGZ1bmN0aW9uIHBhcnRpYWwgYXJndW1lbnRzLiAqLworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcigyKQorICAgIHB1YmxpYyBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJndW1lbnRUeXBlczsKKworICAgIC8qKiBUaGUgc2VyaWFsaXplZCB2YWx1ZXMgb2YgdGhlIHRlc3RlZCBtYXNraW5nIGZ1bmN0aW9uIHBhcnRpYWwgYXJndW1lbnRzLiAqLworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcigzKQorICAgIHB1YmxpYyBMaXN0PEJ5dGVCdWZmZXI+IGFyZ3VtZW50VmFsdWVzOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVGFibGVXaXRoTWFza2VkQ29sdW1ucygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIC8vIE5vdGhpbmcgaXMgbWFza2VkCisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50LCBjIGludCwgciBpbnQsIHMgaW50IHN0YXRpYywgUFJJTUFSWSBLRVkoaywgYykpIik7CisgICAgICAgIGFzc2VydFRhYmxlQ29sdW1uc0FyZU5vdE1hc2tlZCgiayIsICJjIiwgInIiLCAicyIpOworCisgICAgICAgIC8vIE1hc2tlZCBwYXJ0aXRpb24ga2V5CisgICAgICAgIGNyZWF0ZVRhYmxlKGZvcm1hdCgiQ1JFQVRFIFRBQkxFICUlcyAoayAlcyBNQVNLRUQgV0lUSCAlcyBQUklNQVJZIEtFWSwgciBpbnQpIiwgdHlwZSwgbWFzaykpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVNYXNrZWQoImsiKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTm90TWFza2VkKCJyIik7CisKKyAgICAgICAgLy8gTWFza2VkIHBhcnRpdGlvbiBrZXkgY29tcG9uZW50CisgICAgICAgIGNyZWF0ZVRhYmxlKGZvcm1hdCgiQ1JFQVRFIFRBQkxFICUlcyAoazEgaW50LCBrMiAlcyBNQVNLRUQgV0lUSCAlcywgciBpbnQsIFBSSU1BUlkgS0VZKGsxLCBrMikpIiwgdHlwZSwgbWFzaykpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVNYXNrZWQoImsyIik7CisgICAgICAgIGFzc2VydFRhYmxlQ29sdW1uc0FyZU5vdE1hc2tlZCgiazEiLCAiciIpOworCisgICAgICAgIC8vIE1hc2tlZCBjbHVzdGVyaW5nIGtleQorICAgICAgICBjcmVhdGVUYWJsZShmb3JtYXQoIkNSRUFURSBUQUJMRSAlJXMgKGsgaW50LCBjICVzIE1BU0tFRCBXSVRIICVzLCByIGludCwgUFJJTUFSWSBLRVkgKGssIGMpKSIsIHR5cGUsIG1hc2spKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTWFza2VkKCJjIik7CisgICAgICAgIGFzc2VydFRhYmxlQ29sdW1uc0FyZU5vdE1hc2tlZCgiayIsICJyIik7CisKKyAgICAgICAgLy8gTWFza2VkIGNsdXN0ZXJpbmcga2V5IHdpdGggcmV2ZXJzZSBvcmRlcgorICAgICAgICBjcmVhdGVUYWJsZShmb3JtYXQoIkNSRUFURSBUQUJMRSAlJXMgKGsgaW50LCBjICVzIE1BU0tFRCBXSVRIICVzLCByIGludCwgUFJJTUFSWSBLRVkgKGssIGMpKSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJXSVRIIENMVVNURVJJTkcgT1JERVIgQlkgKGMgREVTQykiLCB0eXBlLCBtYXNrKSk7CisgICAgICAgIGFzc2VydFRhYmxlQ29sdW1uc0FyZU1hc2tlZCgiYyIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoImsiLCAiciIpOworCisgICAgICAgIC8vIE1hc2tlZCBjbHVzdGVyaW5nIGtleSBjb21wb25lbnQKKyAgICAgICAgY3JlYXRlVGFibGUoZm9ybWF0KCJDUkVBVEUgVEFCTEUgJSVzIChrIGludCwgYzEgaW50LCBjMiAlcyBNQVNLRUQgV0lUSCAlcywgciBpbnQsIFBSSU1BUlkgS0VZIChrLCBjMSwgYzIpKSIsIHR5cGUsIG1hc2spKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTWFza2VkKCJjMiIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoImsiLCAiYzEiLCAiciIpOworCisgICAgICAgIC8vIE1hc2tlZCByZWd1bGFyIGNvbHVtbgorICAgICAgICBjcmVhdGVUYWJsZShmb3JtYXQoIkNSRUFURSBUQUJMRSAlJXMgKGsgaW50IFBSSU1BUlkgS0VZLCByMSAlcyBNQVNLRUQgV0lUSCAlcywgcjIgaW50KSIsIHR5cGUsIG1hc2spKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTWFza2VkKCJyMSIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoImsiLCAicjIiKTsKKworICAgICAgICAvLyBNYXNrZWQgc3RhdGljIGNvbHVtbgorICAgICAgICBjcmVhdGVUYWJsZShmb3JtYXQoIkNSRUFURSBUQUJMRSAlJXMgKGsgaW50LCBjIGludCwgciBpbnQsIHMgJXMgU1RBVElDIE1BU0tFRCBXSVRIICVzLCBQUklNQVJZIEtFWSAoaywgYykpIiwgdHlwZSwgbWFzaykpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVNYXNrZWQoInMiKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTm90TWFza2VkKCJrIiwgImMiLCAiciIpOworCisgICAgICAgIC8vIE11bHRpcGxlIG1hc2tlZCBjb2x1bW5zCisgICAgICAgIGNyZWF0ZVRhYmxlKGZvcm1hdCgiQ1JFQVRFIFRBQkxFICUlcyAoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiazEgaW50LCBrMiAlcyBNQVNLRUQgV0lUSCAlcywgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYzEgaW50LCBjMiAlcyBNQVNLRUQgV0lUSCAlcywgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAicjEgaW50LCByMiAlcyBNQVNLRUQgV0lUSCAlcywgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiczEgaW50IHN0YXRpYywgczIgJXMgc3RhdGljIE1BU0tFRCBXSVRIICVzLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJQUklNQVJZIEtFWSgoazEsIGsyKSwgYzEsIGMyKSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgbWFzaywgdHlwZSwgbWFzaywgdHlwZSwgbWFzaywgdHlwZSwgbWFzaykpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVNYXNrZWQoImsyIiwgImMyIiwgInIyIiwgInMyIik7CisgICAgICAgIGFzc2VydFRhYmxlQ29sdW1uc0FyZU5vdE1hc2tlZCgiazEiLCAiYzEiLCAicjEiLCAiczEiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVUYWJsZVdpdGhNYXNrZWRDb2x1bW5zQW5kTWF0ZXJpYWxpemVkVmlldygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKGZvcm1hdCgiQ1JFQVRFIFRBQkxFICUlcyAoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiazEgaW50LCBrMiAlcyBNQVNLRUQgV0lUSCAlcywgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYzEgaW50LCBjMiAlcyBNQVNLRUQgV0lUSCAlcywgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAicjEgaW50LCByMiAlcyBNQVNLRUQgV0lUSCAlcywgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiczEgaW50IHN0YXRpYywgczIgJXMgc3RhdGljIE1BU0tFRCBXSVRIICVzLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJQUklNQVJZIEtFWSgoazEsIGsyKSwgYzEsIGMyKSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgbWFzaywgdHlwZSwgbWFzaywgdHlwZSwgbWFzaywgdHlwZSwgbWFzaykpOworICAgICAgICBjcmVhdGVWaWV3KCJDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgJXMgQVMgU0VMRUNUIGsxLCBrMiwgYzEsIGMyLCByMSwgcjIgRlJPTSAlcyAiICsKKyAgICAgICAgICAgICAgICAgICAiV0hFUkUgazEgSVMgTk9UIE5VTEwgQU5EIGsyIElTIE5PVCBOVUxMICIgKworICAgICAgICAgICAgICAgICAgICJBTkQgYzEgSVMgTk9UIE5VTEwgQU5EIGMyIElTIE5PVCBOVUxMICIgKworICAgICAgICAgICAgICAgICAgICJBTkQgcjEgSVMgTk9UIE5VTEwgQU5EIHIyIElTIE5PVCBOVUxMICIgKworICAgICAgICAgICAgICAgICAgICJQUklNQVJZIEtFWSAocjIsIGMyLCBjMSwgazIsIGsxKSIpOworCisgICAgICAgIGFzc2VydFRhYmxlQ29sdW1uc0FyZU1hc2tlZCgiazIiLCAiYzIiLCAicjIiLCAiczIiKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTm90TWFza2VkKCJrMSIsICJjMSIsICJyMSIsICJzMSIpOworCisgICAgICAgIGFzc2VydFZpZXdDb2x1bW5zQXJlTWFza2VkKCJrMiIsICJjMiIsICJyMiIpOworICAgICAgICBhc3NlcnRWaWV3Q29sdW1uc0FyZU5vdE1hc2tlZCgiazEiLCAiYzEiLCAicjEiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbHRlclRhYmxlV2l0aE1hc2tlZENvbHVtbnMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICAvLyBDcmVhdGUgdGhlIHRhYmxlIHRvIGJlIGFsdGVyZWQKKyAgICAgICAgY3JlYXRlVGFibGUoZm9ybWF0KCJDUkVBVEUgVEFCTEUgJSVzIChrICVzLCBjICU8cywgcjEgJTxzLCByMiAlPHMgTUFTS0VEIFdJVEggJXMsIHIzICVzLCBzICU8cyBzdGF0aWMsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBSSU1BUlkgS0VZIChrLCBjKSkiLCB0eXBlLCBtYXNrLCB0eXBlKSk7CisgICAgICAgIGFzc2VydFRhYmxlQ29sdW1uc0FyZU1hc2tlZCgicjIiKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTm90TWFza2VkKCJrIiwgImMiLCAicjEiLCAicjMiLCAicyIpOworCisgICAgICAgIC8vIEFkZCBuZXcgbWFza2VkIGNvbHVtbgorICAgICAgICBhbHRlclRhYmxlKGZvcm1hdCgiQUxURVIgVEFCTEUgJSVzIEFERCByNCAlcyBNQVNLRUQgV0lUSCAlcyIsIHR5cGUsIG1hc2spKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTWFza2VkKCJyMiIsICJyNCIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoImsiLCAiYyIsICJyMSIsICJyMyIsICJzIik7CisKKyAgICAgICAgLy8gU2V0IG1hc2sgZm9yIGFuIGV4aXN0aW5nIGJ1dCB1bm1hc2tlZCBjb2x1bW4KKyAgICAgICAgYWx0ZXJUYWJsZShmb3JtYXQoIkFMVEVSIFRBQkxFICUlcyBBTFRFUiByMSBNQVNLRUQgV0lUSCAlcyIsIG1hc2spKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTWFza2VkKCJyMSIsICJyMiIsICJyNCIpOworCisgICAgICAgIC8vIFVubWFzayBhIG1hc2tlZCBjb2x1bW4KKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgcjEgRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgcjIgRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTWFza2VkKCJyNCIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoInIxIiwgInIyIiwgInIzIik7CisKKyAgICAgICAgLy8gTWFzayBhbmQgZGlzYWJsZSBtYXNrIGZvciBwcmltYXJ5IGtleQorICAgICAgICBhbHRlclRhYmxlKGZvcm1hdCgiQUxURVIgVEFCTEUgJSVzIEFMVEVSIGsgTUFTS0VEIFdJVEggJXMiLCBtYXNrKSk7CisgICAgICAgIGFzc2VydFRhYmxlQ29sdW1uc0FyZU1hc2tlZCgiayIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBrIERST1AgTUFTS0VEIik7CisgICAgICAgIGFzc2VydFRhYmxlQ29sdW1uc0FyZU5vdE1hc2tlZCgiayIpOworCisgICAgICAgIC8vIE1hc2sgYW5kIGRpc2FibGUgbWFzayBmb3IgY2x1c3RlcmluZyBrZXkKKyAgICAgICAgYWx0ZXJUYWJsZShmb3JtYXQoIkFMVEVSIFRBQkxFICUlcyBBTFRFUiBjIE1BU0tFRCBXSVRIICVzIiwgbWFzaykpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVNYXNrZWQoImMiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgYyBEUk9QIE1BU0tFRCIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoImMiKTsKKworICAgICAgICAvLyBNYXNrIGFuZCBkaXNhYmxlIG1hc2sgZm9yIHN0YXRpYyBjb2x1bW4KKyAgICAgICAgYWx0ZXJUYWJsZShmb3JtYXQoIkFMVEVSIFRBQkxFICUlcyBBTFRFUiBzIE1BU0tFRCBXSVRIICVzIiwgbWFzaykpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVNYXNrZWQoInMiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgcyBEUk9QIE1BU0tFRCIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoInMiKTsKKworICAgICAgICAvLyBBZGQgbXVsdGlwbGUgbWFza2VkIGNvbHVtbnMgd2l0aGluIHRoZSBzYW1lIHF1ZXJ5CisgICAgICAgIGFsdGVyVGFibGUoZm9ybWF0KCJBTFRFUiBUQUJMRSAlJXMgQUREICgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInI1ICVzIE1BU0tFRCBXSVRIICVzLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInI2ICVzLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInI3ICVzIE1BU0tFRCBXSVRIICVzLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInI4ICVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIG1hc2ssIHR5cGUsIHR5cGUsIG1hc2ssIHR5cGUpKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTWFza2VkKCJyNSIsICJyNyIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoInI2IiwgInI4Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWx0ZXJUYWJsZVdpdGhNYXNrZWRDb2x1bW5zQW5kTWF0ZXJpYWxpemVkVmlldygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKGZvcm1hdCgiQ1JFQVRFIFRBQkxFICUlcyAoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiayAlcywgYyAlPHMsIHIxICU8cywgcjIgJTxzLCBzMSAlPHMgc3RhdGljLCBzMiAlPHMgc3RhdGljLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJQUklNQVJZIEtFWShrLCBjKSkiLCB0eXBlKSk7CisgICAgICAgIGNyZWF0ZVZpZXcoIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgaywgYywgcjIgRlJPTSAlcyAiICsKKyAgICAgICAgICAgICAgICAgICAiV0hFUkUgayBJUyBOT1QgTlVMTCBBTkQgYyBJUyBOT1QgTlVMTCAiICsKKyAgICAgICAgICAgICAgICAgICAiQU5EIHIxIElTIE5PVCBOVUxMIEFORCByMiBJUyBOT1QgTlVMTCAiICsKKyAgICAgICAgICAgICAgICAgICAiUFJJTUFSWSBLRVkgKHIyLCBjLCBrKSIpOworCisgICAgICAgIC8vIEFkZGluZyBhIGNvbHVtbiB0byB0aGUgdGFibGUgZG9lc24ndCBoYXZlIGFuIGVmZmVjdCBvbiB0aGUgdmlldworICAgICAgICBhbHRlclRhYmxlKGZvcm1hdCgiQUxURVIgVEFCTEUgJSVzIEFERCByMyAlcyBNQVNLRUQgV0lUSCAlcyIsIHR5cGUsIG1hc2spKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTWFza2VkKCJyMyIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoImsiLCAiYyIsICJyMSIsICJyMiIsICJzMSIsICJzMiIpOworICAgICAgICBhc3NlcnRWaWV3Q29sdW1uc0FyZU5vdE1hc2tlZCgiayIsICJjIiwgInIyIik7CisKKyAgICAgICAgLy8gTWFza2luZyBhIGNvbHVtbiB0aGF0IGlzIG5vdCBwYXJ0IG9mIHRoZSB2aWV3IGRvZXNuJ3QgaGF2ZSBhbiBlZmZlY3Qgb24gdGhlIHZpZXcKKyAgICAgICAgYWx0ZXJUYWJsZShmb3JtYXQoIkFMVEVSIFRBQkxFICUlcyBBTFRFUiByMSBNQVNLRUQgV0lUSCAlcyIsIG1hc2spKTsKKyAgICAgICAgYWx0ZXJUYWJsZShmb3JtYXQoIkFMVEVSIFRBQkxFICUlcyBBTFRFUiBzMSBNQVNLRUQgV0lUSCAlcyIsIG1hc2spKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTWFza2VkKCJyMSIsICJyMyIsICJzMSIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoImsiLCAiYyIsICJyMiIsICJzMiIpOworICAgICAgICBhc3NlcnRWaWV3Q29sdW1uc0FyZU5vdE1hc2tlZCgiayIsICJjIiwgInIyIik7CisKKyAgICAgICAgLy8gTWFza2luZyBhIGNvbHVtbiB0aGF0IGlzIHBhcnQgb2YgdGhlIHZpZXcgc2hvdWxkIGhhdmUgYW4gZWZmZWN0IG9uIHRoZSB2aWV3CisgICAgICAgIGFsdGVyVGFibGUoZm9ybWF0KCJBTFRFUiBUQUJMRSAlJXMgQUxURVIgcjIgTUFTS0VEIFdJVEggJXMiLCBtYXNrKSk7CisgICAgICAgIGFzc2VydFRhYmxlQ29sdW1uc0FyZU1hc2tlZCgicjEiLCAicjIiLCAicjMiLCAiczEiKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTm90TWFza2VkKCJrIiwgImMiLCAiczIiKTsKKyAgICAgICAgYXNzZXJ0Vmlld0NvbHVtbnNBcmVNYXNrZWQoInIyIik7CisgICAgICAgIGFzc2VydFZpZXdDb2x1bW5zQXJlTm90TWFza2VkKCJrIiwgImMiKTsKKworICAgICAgICAvLyBNYXNrIHRoZSByZXN0IG9mIHRoZSBjb2x1bW5zCisgICAgICAgIGFsdGVyVGFibGUoZm9ybWF0KCJBTFRFUiBUQUJMRSAlJXMgQUxURVIgayBNQVNLRUQgV0lUSCAlcyIsIG1hc2spKTsKKyAgICAgICAgYWx0ZXJUYWJsZShmb3JtYXQoIkFMVEVSIFRBQkxFICUlcyBBTFRFUiBjIE1BU0tFRCBXSVRIICVzIiwgbWFzaykpOworICAgICAgICBhbHRlclRhYmxlKGZvcm1hdCgiQUxURVIgVEFCTEUgJSVzIEFMVEVSIHMyIE1BU0tFRCBXSVRIICVzIiwgbWFzaykpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVNYXNrZWQoImsiLCAiYyIsICJyMSIsICJyMiIsICJyMyIsICJzMSIsICJzMiIpOworICAgICAgICBhc3NlcnRWaWV3Q29sdW1uc0FyZU1hc2tlZCgiayIsICJjIiwgInIyIik7CisKKyAgICAgICAgLy8gVW5tYXNrIGEgY29sdW1uIHRoYXQgaXMgcGFydCBvZiB0aGUgdmlldworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiByMiBEUk9QIE1BU0tFRCIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVNYXNrZWQoImsiLCAiYyIsICJyMSIsICJyMyIsICJzMSIsICJzMiIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoInIyIik7CisgICAgICAgIGFzc2VydFZpZXdDb2x1bW5zQXJlTWFza2VkKCJrIiwgImMiKTsKKyAgICAgICAgYXNzZXJ0Vmlld0NvbHVtbnNBcmVOb3RNYXNrZWQoInIyIik7CisKKyAgICAgICAgLy8gVW5tYXNrIHRoZSByZXN0IG9mIHRoZSBjb2x1bW5zCisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIGsgRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgYyBEUk9QIE1BU0tFRCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiByMSBEUk9QIE1BU0tFRCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiByMyBEUk9QIE1BU0tFRCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBzMSBEUk9QIE1BU0tFRCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBzMiBEUk9QIE1BU0tFRCIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoImsiLCAiYyIsICJyMSIsICJyMiIsICJyMyIsICJzMSIsICJzMiIpOworICAgICAgICBhc3NlcnRWaWV3Q29sdW1uc0FyZU5vdE1hc2tlZCgiayIsICJjIiwgInIyIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZnVuY3Rpb25OYW1lKCkKKyAgICB7CisgICAgICAgIGlmIChtYXNrLmVxdWFscygiREVGQVVMVCIpKQorICAgICAgICAgICAgcmV0dXJuICJtYXNrX2RlZmF1bHQiOworCisgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5yZW1vdmUoU3RyaW5nVXRpbHMuc3Vic3RyaW5nQmVmb3JlKG1hc2ssICIoIiksIEtFWVNQQUNFICsgIi4iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTWFza2VkKFN0cmluZy4uLiBjb2x1bW5zKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBmb3IgKFN0cmluZyBjb2x1bW4gOiBjb2x1bW5zKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRDb2x1bW5Jc01hc2tlZChjdXJyZW50VGFibGUoKSwgY29sdW1uLCBmdW5jdGlvbk5hbWUoKSwgYXJndW1lbnRUeXBlcywgYXJndW1lbnRWYWx1ZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFZpZXdDb2x1bW5zQXJlTWFza2VkKFN0cmluZy4uLiBjb2x1bW5zKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBmb3IgKFN0cmluZyBjb2x1bW4gOiBjb2x1bW5zKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRDb2x1bW5Jc01hc2tlZChjdXJyZW50VmlldygpLCBjb2x1bW4sIGZ1bmN0aW9uTmFtZSgpLCBhcmd1bWVudFR5cGVzLCBhcmd1bWVudFZhbHVlcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrSW5BbnlQb3NpdGlvbldpdGhEZWZhdWx0VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza0luQW55UG9zaXRpb25XaXRoRGVmYXVsdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjliZjNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza0luQW55UG9zaXRpb25XaXRoRGVmYXVsdFRlc3QuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0OworCisvKioKKyAqIHtAbGluayBDb2x1bW5NYXNrSW5BbnlQb3NpdGlvblRlc3Rlcn0gZm9yIHtAbGluayBEZWZhdWx0TWFza2luZ0Z1bmN0aW9ufS4KKyAqLworcHVibGljIGNsYXNzIENvbHVtbk1hc2tJbkFueVBvc2l0aW9uV2l0aERlZmF1bHRUZXN0IGV4dGVuZHMgQ29sdW1uTWFza0luQW55UG9zaXRpb25UZXN0ZXIKK3sKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAibWFzaz17MH0sIHR5cGU9ezF9IikKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IG9wdGlvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117CisgICAgICAgIHsgIkRFRkFVTFQiLCAiaW50IiwgZW1wdHlMaXN0KCksIGVtcHR5TGlzdCgpIH0sCisgICAgICAgIHsgIkRFRkFVTFQiLCAidGV4dCIsIGVtcHR5TGlzdCgpLCBlbXB0eUxpc3QoKSB9LAorICAgICAgICB7ICJERUZBVUxUIiwgImZyb3plbjxsaXN0PHV1aWQ+PiIsIGVtcHR5TGlzdCgpLCBlbXB0eUxpc3QoKSB9LAorICAgICAgICB7ICJtYXNrX2RlZmF1bHQoKSIsICJpbnQiLCBlbXB0eUxpc3QoKSwgZW1wdHlMaXN0KCkgfSwKKyAgICAgICAgeyAibWFza19kZWZhdWx0KCkiLCAidGV4dCIsIGVtcHR5TGlzdCgpLCBlbXB0eUxpc3QoKSB9LAorICAgICAgICB7ICJtYXNrX2RlZmF1bHQoKSIsICJmcm96ZW48bGlzdDx1dWlkPj4iLCBlbXB0eUxpc3QoKSwgZW1wdHlMaXN0KCkgfSwKKyAgICAgICAgfSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza0luQW55UG9zaXRpb25XaXRoTnVsbFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tJbkFueVBvc2l0aW9uV2l0aE51bGxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUxZTJhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tJbkFueVBvc2l0aW9uV2l0aE51bGxUZXN0LmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdDsKKworLyoqCisgKiB7QGxpbmsgQ29sdW1uTWFza0luQW55UG9zaXRpb25UZXN0ZXJ9IGZvciB7QGxpbmsgTnVsbE1hc2tpbmdGdW5jdGlvbn0uCisgKi8KK3B1YmxpYyBjbGFzcyBDb2x1bW5NYXNrSW5BbnlQb3NpdGlvbldpdGhOdWxsVGVzdCBleHRlbmRzIENvbHVtbk1hc2tJbkFueVBvc2l0aW9uVGVzdGVyCit7CisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIm1hc2s9ezB9LCB0eXBlPXsxfSIpCisgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPE9iamVjdFtdPiBvcHRpb25zKCkKKyAgICB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdeworICAgICAgICB7ICJtYXNrX251bGwoKSIsICJpbnQiLCBlbXB0eUxpc3QoKSwgZW1wdHlMaXN0KCkgfSwKKyAgICAgICAgeyAibWFza19udWxsKCkiLCAidGV4dCIsIGVtcHR5TGlzdCgpLCBlbXB0eUxpc3QoKSB9LAorICAgICAgICB7ICJtYXNrX251bGwoKSIsICJmcm96ZW48bGlzdDx1dWlkPj4iLCBlbXB0eUxpc3QoKSwgZW1wdHlMaXN0KCkgfSwKKyAgICAgICAgfSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza0luQW55UG9zaXRpb25XaXRoUGFydGlhbFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tJbkFueVBvc2l0aW9uV2l0aFBhcnRpYWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IwNDc5YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tJbkFueVBvc2l0aW9uV2l0aFBhcnRpYWxUZXN0LmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVURjhUeXBlOworCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5BcnJheXMuYXNMaXN0OworCisvKioKKyAqIHtAbGluayBDb2x1bW5NYXNrSW5BbnlQb3NpdGlvblRlc3Rlcn0gZm9yIHtAbGluayBQYXJ0aWFsTWFza2luZ0Z1bmN0aW9ufS4KKyAqLworcHVibGljIGNsYXNzIENvbHVtbk1hc2tJbkFueVBvc2l0aW9uV2l0aFBhcnRpYWxUZXN0IGV4dGVuZHMgQ29sdW1uTWFza0luQW55UG9zaXRpb25UZXN0ZXIKK3sKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAibWFzaz17MH0sIHR5cGU9ezF9IikKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IG9wdGlvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117CisgICAgICAgIHsgIm1hc2tfaW5uZXIoMSwgMikiLCAidGV4dCIsCisgICAgICAgICAgYXNMaXN0KEludDMyVHlwZS5pbnN0YW5jZSwgSW50MzJUeXBlLmluc3RhbmNlKSwKKyAgICAgICAgICBhc0xpc3QoSW50MzJUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgxKSwgSW50MzJUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgyKSkgfSwKKyAgICAgICAgeyAibWFza19vdXRlcigxLCAyKSIsICJ0ZXh0IiwKKyAgICAgICAgICBhc0xpc3QoSW50MzJUeXBlLmluc3RhbmNlLCBJbnQzMlR5cGUuaW5zdGFuY2UpLAorICAgICAgICAgIGFzTGlzdChJbnQzMlR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKDEpLCBJbnQzMlR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKDIpKSB9LAorICAgICAgICB7ICJtYXNrX2lubmVyKDEsIDIsICcjJykiLCAidGV4dCIsCisgICAgICAgICAgYXNMaXN0KEludDMyVHlwZS5pbnN0YW5jZSwgSW50MzJUeXBlLmluc3RhbmNlLCBVVEY4VHlwZS5pbnN0YW5jZSksCisgICAgICAgICAgYXNMaXN0KEludDMyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoMSksIEludDMyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoMiksIFVURjhUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgiIyIpKSB9LAorICAgICAgICB7ICJtYXNrX291dGVyKDEsIDIsICcjJykiLCAidGV4dCIsCisgICAgICAgICAgYXNMaXN0KEludDMyVHlwZS5pbnN0YW5jZSwgSW50MzJUeXBlLmluc3RhbmNlLCBVVEY4VHlwZS5pbnN0YW5jZSksCisgICAgICAgICAgYXNMaXN0KEludDMyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoMSksIEludDMyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoMiksIFVURjhUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgiIyIpKSB9CisgICAgICAgIH0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tJbkFueVBvc2l0aW9uV2l0aFJlcGxhY2VUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrSW5BbnlQb3NpdGlvbldpdGhSZXBsYWNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYzUxNGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrSW5BbnlQb3NpdGlvbldpdGhSZXBsYWNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMubWFza2luZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnQzMlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5MaXN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVURjhUeXBlOworCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3Q7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5Db2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0OworCisvKioKKyAqIHtAbGluayBDb2x1bW5NYXNrSW5BbnlQb3NpdGlvblRlc3Rlcn0gZm9yIHtAbGluayBSZXBsYWNlTWFza2luZ0Z1bmN0aW9ufS4KKyAqLworcHVibGljIGNsYXNzIENvbHVtbk1hc2tJbkFueVBvc2l0aW9uV2l0aFJlcGxhY2VUZXN0IGV4dGVuZHMgQ29sdW1uTWFza0luQW55UG9zaXRpb25UZXN0ZXIKK3sKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAibWFzaz17MH0sIHR5cGU9ezF9IikKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IG9wdGlvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117CisgICAgICAgIHsgIm1hc2tfcmVwbGFjZSgwKSIsICJpbnQiLAorICAgICAgICAgIHNpbmdsZXRvbkxpc3QoSW50MzJUeXBlLmluc3RhbmNlKSwKKyAgICAgICAgICBzaW5nbGV0b25MaXN0KEludDMyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoMCkpIH0sCisgICAgICAgIHsgIm1hc2tfcmVwbGFjZSgncmVkYWN0ZWQnKSIsICJ0ZXh0IiwKKyAgICAgICAgICBzaW5nbGV0b25MaXN0KFVURjhUeXBlLmluc3RhbmNlKSwKKyAgICAgICAgICBzaW5nbGV0b25MaXN0KFVURjhUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgicmVkYWN0ZWQiKSkgfSwKKyAgICAgICAgeyAibWFza19yZXBsYWNlKFtdKSIsICJmcm96ZW48bGlzdDxpbnQ+PiIsCisgICAgICAgICAgc2luZ2xldG9uTGlzdChMaXN0VHlwZS5nZXRJbnN0YW5jZShJbnQzMlR5cGUuaW5zdGFuY2UsIGZhbHNlKSksCisgICAgICAgICAgc2luZ2xldG9uTGlzdChMaXN0VHlwZS5nZXRJbnN0YW5jZShJbnQzMlR5cGUuaW5zdGFuY2UsIGZhbHNlKS5kZWNvbXBvc2UoZW1wdHlMaXN0KCkpKSB9LAorICAgICAgICB9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrSW5BbnlQb3NpdGlvbldpdGhVREZUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrSW5BbnlQb3NpdGlvbldpdGhVREZUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDllNTAyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tJbkFueVBvc2l0aW9uV2l0aFVERlRlc3QuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnQzMlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKKworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdDsKKworLyoqCisgKiB7QGxpbmsgQ29sdW1uTWFza0luQW55UG9zaXRpb25UZXN0ZXJ9IGZvciB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLgorICovCitwdWJsaWMgY2xhc3MgQ29sdW1uTWFza0luQW55UG9zaXRpb25XaXRoVURGVGVzdCBleHRlbmRzIENvbHVtbk1hc2tJbkFueVBvc2l0aW9uVGVzdGVyCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUkVQTEFDRV9GVU5DVElPTiA9IEtFWVNQQUNFICsgIi5tYXNrX3RleHRfcmVwbGFjZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVF9SRVBMQUNFX0ZVTkNUSU9OID0gS0VZU1BBQ0UgKyAiLm1hc2tfaW50X3JlcGxhY2UiOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwU2NoZW1hKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlRnVuY3Rpb24oS0VZU1BBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0LCB0ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBGVU5DVElPTiBJRiBOT1QgRVhJU1RTICIgKyBURVhUX1JFUExBQ0VfRlVOQ1RJT04gKyAiIChjb2x1bW4gdGV4dCwgcmVwbGFjZW1lbnQgdGV4dCkgIiArCisgICAgICAgICAgICAgICAgICAgICAgICJDQUxMRUQgT04gTlVMTCBJTlBVVCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgdGV4dCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmEgIiArCisgICAgICAgICAgICAgICAgICAgICAgICJBUyAncmV0dXJuIHJlcGxhY2VtZW50OyciKTsKKyAgICAgICAgY3JlYXRlRnVuY3Rpb24oS0VZU1BBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICJpbnQsIGludCIsCisgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgRlVOQ1RJT04gSUYgTk9UIEVYSVNUUyAiICsgSU5UX1JFUExBQ0VfRlVOQ1RJT04gKyAiIChjb2x1bW4gaW50LCByZXBsYWNlbWVudCBpbnQpICIgKworICAgICAgICAgICAgICAgICAgICAgICAiQ0FMTEVEIE9OIE5VTEwgSU5QVVQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGludCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmEgIiArCisgICAgICAgICAgICAgICAgICAgICAgICJBUyAncmV0dXJuIHJlcGxhY2VtZW50OyciKTsKKyAgICB9CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAibWFzaz17MH0sIHR5cGU9ezF9IikKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IG9wdGlvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117CisgICAgICAgIHsgVEVYVF9SRVBMQUNFX0ZVTkNUSU9OICsgIigncmVkYWN0ZWQnKSIsICJ0ZXh0IiwKKyAgICAgICAgICBzaW5nbGV0b25MaXN0KFVURjhUeXBlLmluc3RhbmNlKSwKKyAgICAgICAgICBzaW5nbGV0b25MaXN0KFVURjhUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgicmVkYWN0ZWQiKSkgfSwKKyAgICAgICAgeyBJTlRfUkVQTEFDRV9GVU5DVElPTiArICIoMCkiLCAiaW50IiwKKyAgICAgICAgICBzaW5nbGV0b25MaXN0KEludDMyVHlwZS5pbnN0YW5jZSksCisgICAgICAgICAgc2luZ2xldG9uTGlzdChJbnQzMlR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKDApKSB9CisgICAgICAgIH0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tOYXRpdmVUeXBlc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tOYXRpdmVUeXBlc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTUxNTI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza05hdGl2ZVR5cGVzVGVzdC5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMubWFza2luZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGU7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3Q7CisKKy8qKgorICoge0BsaW5rIENvbHVtbk1hc2tUZXN0ZXJ9IHZlcmlmeWluZyB0aGF0IHdlIGNhbiBhdHRhY2ggY29sdW1uIG1hc2tzIHRvIHRhYmxlIGNvbHVtbnMgd2l0aCBhbnkgbmF0aXZlIGRhdGEgdHlwZS4KKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBDb2x1bW5NYXNrTmF0aXZlVHlwZXNUZXN0IGV4dGVuZHMgQ29sdW1uTWFza1Rlc3RlcgoreworICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgY29sdW1uLiAqLworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcgorICAgIHB1YmxpYyBDUUwzVHlwZS5OYXRpdmUgdHlwZTsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ0eXBlPXswfSIpCisgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPE9iamVjdFtdPiBvcHRpb25zKCkKKyAgICB7CisgICAgICAgIExpc3Q8T2JqZWN0W10+IHBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChDUUwzVHlwZS5OYXRpdmUgdHlwZSA6IENRTDNUeXBlLk5hdGl2ZS52YWx1ZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHR5cGUgIT0gQ1FMM1R5cGUuTmF0aXZlLkVNUFRZKQorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuYWRkKG5ldyBPYmplY3RbXXsgdHlwZSB9KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYXRpdmVEYXRhVHlwZXMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBTdHJpbmcgZGVmID0gZm9ybWF0KCIlcyBNQVNLRUQgV0lUSCBERUZBVUxUIiwgdHlwZSk7CisgICAgICAgIFN0cmluZyBrZXlEZWYgPSB0eXBlID09IENRTDNUeXBlLk5hdGl2ZS5DT1VOVEVSIHx8IHR5cGUgPT0gQ1FMM1R5cGUuTmF0aXZlLkRVUkFUSU9OCisgICAgICAgICAgICAgICAgICAgICAgICA/ICJpbnQgTUFTS0VEIFdJVEggREVGQVVMVCIgOiBkZWY7CisgICAgICAgIFN0cmluZyBzdGF0aWNEZWYgPSBmb3JtYXQoIiVzIFNUQVRJQyBNQVNLRUQgV0lUSCBERUZBVUxUIiwgdHlwZSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRhYmxlIHdpdGggbWFza3MKKyAgICAgICAgU3RyaW5nIHRhYmxlID0gY3JlYXRlVGFibGUoZm9ybWF0KCJDUkVBVEUgVEFCTEUgJSVzIChrICVzLCBjICU8cywgciAlcywgcyAlcywgUFJJTUFSWSBLRVkoaywgYykpIiwga2V5RGVmLCBkZWYsIHN0YXRpY0RlZikpOworICAgICAgICBhc3NlcnRDb2x1bW5Jc01hc2tlZCh0YWJsZSwgImsiLCAibWFza19kZWZhdWx0IiwgZW1wdHlMaXN0KCksIGVtcHR5TGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uSXNNYXNrZWQodGFibGUsICJjIiwgIm1hc2tfZGVmYXVsdCIsIGVtcHR5TGlzdCgpLCBlbXB0eUxpc3QoKSk7CisgICAgICAgIGFzc2VydENvbHVtbklzTWFza2VkKHRhYmxlLCAiciIsICJtYXNrX2RlZmF1bHQiLCBlbXB0eUxpc3QoKSwgZW1wdHlMaXN0KCkpOworICAgICAgICBhc3NlcnRDb2x1bW5Jc01hc2tlZCh0YWJsZSwgInMiLCAibWFza19kZWZhdWx0IiwgZW1wdHlMaXN0KCksIGVtcHR5TGlzdCgpKTsKKworICAgICAgICAvLyBBbHRlciBjb2x1bW4gbWFza3MKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgayBNQVNLRUQgV0lUSCBtYXNrX251bGwoKSIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBjIE1BU0tFRCBXSVRIIG1hc2tfbnVsbCgpIik7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIHIgTUFTS0VEIFdJVEggbWFza19udWxsKCkiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgcyBNQVNLRUQgV0lUSCBtYXNrX251bGwoKSIpOworICAgICAgICBhc3NlcnRDb2x1bW5Jc01hc2tlZCh0YWJsZSwgImsiLCAibWFza19udWxsIiwgZW1wdHlMaXN0KCksIGVtcHR5TGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uSXNNYXNrZWQodGFibGUsICJjIiwgIm1hc2tfbnVsbCIsIGVtcHR5TGlzdCgpLCBlbXB0eUxpc3QoKSk7CisgICAgICAgIGFzc2VydENvbHVtbklzTWFza2VkKHRhYmxlLCAiciIsICJtYXNrX251bGwiLCBlbXB0eUxpc3QoKSwgZW1wdHlMaXN0KCkpOworICAgICAgICBhc3NlcnRDb2x1bW5Jc01hc2tlZCh0YWJsZSwgInMiLCAibWFza19udWxsIiwgZW1wdHlMaXN0KCksIGVtcHR5TGlzdCgpKTsKKworICAgICAgICAvLyBEcm9wIG1hc2tzCisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIGsgRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgYyBEUk9QIE1BU0tFRCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiByIERST1AgTUFTS0VEIik7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIHMgRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTm90TWFza2VkKCJrIiwgImMiLCAiciIsICJzIik7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrUXVlcnlUZXN0ZXIuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tRdWVyeVRlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YTg3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrUXVlcnlUZXN0ZXIuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5SZXN1bHRTZXQ7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CisKKy8qKgorICogVGVzdCBxdWVyaWVzIG9uIGNvbHVtbnMgdGhhdCBoYXZlIGF0dGFjaGVkIGEgZHluYW1pYyBkYXRhIG1hc2tpbmcgZnVuY3Rpb24uCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29sdW1uTWFza1F1ZXJ5VGVzdGVyIGV4dGVuZHMgQ29sdW1uTWFza1Rlc3RlcgoreworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcgorICAgIHB1YmxpYyBTdHJpbmcgb3JkZXI7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoMSkKKyAgICBwdWJsaWMgU3RyaW5nIG1hc2s7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoMikKKyAgICBwdWJsaWMgU3RyaW5nIGNvbHVtblR5cGU7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoMykKKyAgICBwdWJsaWMgT2JqZWN0IGNvbHVtblZhbHVlOworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyKDQpCisgICAgcHVibGljIE9iamVjdCBtYXNrZWRWYWx1ZTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cFNjaGVtYSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKCIgKworICAgICAgICAgICAgICAgICAgICBmb3JtYXQoImsxICVzLCBrMiAlPHMgTUFTS0VEIFdJVEggJXMsICIsIGNvbHVtblR5cGUsIG1hc2spICsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJjMSAlcywgYzIgJTxzIE1BU0tFRCBXSVRIICVzLCAiLCBjb2x1bW5UeXBlLCBtYXNrKSArCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgicjEgJXMsIHIyICU8cyBNQVNLRUQgV0lUSCAlcywgIiwgY29sdW1uVHlwZSwgbWFzaykgKworICAgICAgICAgICAgICAgICAgICBmb3JtYXQoInMxICVzIHN0YXRpYywgczIgJTxzIHN0YXRpYyBNQVNLRUQgV0lUSCAlcywgIiwgY29sdW1uVHlwZSwgbWFzaykgKworICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIlBSSU1BUlkgS0VZKChrMSwgazIpLCBjMSwgYzIpKSBXSVRIIENMVVNURVJJTkcgT1JERVIgQlkgKGMxICVzLCBjMiAlPHMpIiwgb3JkZXIpKTsKKworICAgICAgICBjcmVhdGVWaWV3KCJDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgJXMgQVMgU0VMRUNUIGsyLCBrMSwgYzIsIGMxLCByMiwgcjEgRlJPTSAlcyAiICsKKyAgICAgICAgICAgICAgICAgICAiV0hFUkUgazEgSVMgTk9UIE5VTEwgQU5EIGsyIElTIE5PVCBOVUxMICIgKworICAgICAgICAgICAgICAgICAgICJBTkQgYzEgSVMgTk9UIE5VTEwgQU5EIGMyIElTIE5PVCBOVUxMICIgKworICAgICAgICAgICAgICAgICAgICJBTkQgcjEgSVMgTk9UIE5VTEwgQU5EIHIyIElTIE5PVCBOVUxMICIgKworICAgICAgICAgICAgICAgICAgICJQUklNQVJZIEtFWSAoKGMyLCBjMSksIGsyLCBrMSkiKTsKKworICAgICAgICBleGVjdXRlTmV0KCJJTlNFUlQgSU5UTyAlcyhrMSwgazIsIGMxLCBjMiwgcjEsIHIyLCBzMSwgczIpIFZBTFVFUyAoPywgPywgPywgPywgPywgPywgPywgPykiLAorICAgICAgICAgICAgICAgICAgIGNvbHVtblZhbHVlLCBjb2x1bW5WYWx1ZSwgY29sdW1uVmFsdWUsIGNvbHVtblZhbHVlLCBjb2x1bW5WYWx1ZSwgY29sdW1uVmFsdWUsIGNvbHVtblZhbHVlLCBjb2x1bW5WYWx1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0V2l0aFdpbGNhcmQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBSZXN1bHRTZXQgcnMgPSBleGVjdXRlTmV0KCJTRUxFQ1QgKiBGUk9NICVzIik7CisgICAgICAgIGFzc2VydENvbHVtbk5hbWVzKHJzLCAiazEiLCAiazIiLCAiYzEiLCAiYzIiLCAiczEiLCAiczIiLCAicjEiLCAicjIiKTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChycywgcm93KGNvbHVtblZhbHVlLCBtYXNrZWRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtblZhbHVlLCBtYXNrZWRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtblZhbHVlLCBtYXNrZWRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtblZhbHVlLCBtYXNrZWRWYWx1ZSkpOworCisgICAgICAgIHJzID0gZXhlY3V0ZU5ldChmb3JtYXQoIlNFTEVDVCAqIEZST00gJXMuJXMiLCBLRVlTUEFDRSwgY3VycmVudFZpZXcoKSkpOworICAgICAgICBhc3NlcnRDb2x1bW5OYW1lcyhycywgImMyIiwgImMxIiwgImsyIiwgImsxIiwgInIxIiwgInIyIik7CisgICAgICAgIGFzc2VydFJvd3NOZXQocnMsIHJvdyhtYXNrZWRWYWx1ZSwgY29sdW1uVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrZWRWYWx1ZSwgY29sdW1uVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5WYWx1ZSwgbWFza2VkVmFsdWUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3RXaXRoQWxsQ29sdW1uTmFtZXMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBSZXN1bHRTZXQgcnMgPSBleGVjdXRlTmV0KCJTRUxFQ1QgYzIsIGMxLCBrMiwgazEsIHIyLCByMSwgczIsIHMxIEZST00gJXMiKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMocnMsICJjMiIsICJjMSIsICJrMiIsICJrMSIsICJyMiIsICJyMSIsICJzMiIsICJzMSIpOworICAgICAgICBhc3NlcnRSb3dzTmV0KHJzLCByb3cobWFza2VkVmFsdWUsIGNvbHVtblZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza2VkVmFsdWUsIGNvbHVtblZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza2VkVmFsdWUsIGNvbHVtblZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza2VkVmFsdWUsIGNvbHVtblZhbHVlKSk7CisKKyAgICAgICAgcnMgPSBleGVjdXRlTmV0KGZvcm1hdCgiU0VMRUNUIGMyLCBjMSwgazIsIGsxLCByMiwgcjEgRlJPTSAlcy4lcyIsIEtFWVNQQUNFLCBjdXJyZW50VmlldygpKSk7CisgICAgICAgIGFzc2VydENvbHVtbk5hbWVzKHJzLCAiYzIiLCAiYzEiLCAiazIiLCAiazEiLCAicjIiLCAicjEiKTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChycywgcm93KG1hc2tlZFZhbHVlLCBjb2x1bW5WYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tlZFZhbHVlLCBjb2x1bW5WYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tlZFZhbHVlLCBjb2x1bW5WYWx1ZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdE9ubHlNYXNrZWRDb2x1bW5zKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gZXhlY3V0ZU5ldCgiU0VMRUNUIGsyLCBjMiwgczIsIHIyIEZST00gJXMiKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMocnMsICJrMiIsICJjMiIsICJzMiIsICJyMiIpOworICAgICAgICBhc3NlcnRSb3dzTmV0KHJzLCByb3cobWFza2VkVmFsdWUsIG1hc2tlZFZhbHVlLCBtYXNrZWRWYWx1ZSwgbWFza2VkVmFsdWUpKTsKKworICAgICAgICBycyA9IGV4ZWN1dGVOZXQoZm9ybWF0KCJTRUxFQ1QgazIsIGMyLCByMiBGUk9NICVzLiVzIiwgS0VZU1BBQ0UsIGN1cnJlbnRWaWV3KCkpKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMocnMsICJrMiIsICJjMiIsICJyMiIpOworICAgICAgICBhc3NlcnRSb3dzTmV0KHJzLCByb3cobWFza2VkVmFsdWUsIG1hc2tlZFZhbHVlLCBtYXNrZWRWYWx1ZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdE9ubHlOb3RNYXNrZWRDb2x1bW5zKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gZXhlY3V0ZU5ldCgiU0VMRUNUIGsxLCBjMSwgczEsIHIxIEZST00gJXMiKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMocnMsICJrMSIsICJjMSIsICJzMSIsICJyMSIpOworICAgICAgICBhc3NlcnRSb3dzTmV0KHJzLCByb3coY29sdW1uVmFsdWUsIGNvbHVtblZhbHVlLCBjb2x1bW5WYWx1ZSwgY29sdW1uVmFsdWUpKTsKKworICAgICAgICBycyA9IGV4ZWN1dGVOZXQoZm9ybWF0KCJTRUxFQ1QgazEsIGMxLCByMSBGUk9NICVzLiVzIiwgS0VZU1BBQ0UsIGN1cnJlbnRWaWV3KCkpKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMocnMsICJrMSIsICJjMSIsICJyMSIpOworICAgICAgICBhc3NlcnRSb3dzTmV0KHJzLCByb3coY29sdW1uVmFsdWUsIGNvbHVtblZhbHVlLCBjb2x1bW5WYWx1ZSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tRdWVyeVdpdGhEZWZhdWx0VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1F1ZXJ5V2l0aERlZmF1bHRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlZjJhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tRdWVyeVdpdGhEZWZhdWx0VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMubWFza2luZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKKy8qKgorICoge0BsaW5rIENvbHVtbk1hc2tRdWVyeVRlc3Rlcn0gZm9yIHtAbGluayBEZWZhdWx0TWFza2luZ0Z1bmN0aW9ufS4KKyAqLworcHVibGljIGNsYXNzIENvbHVtbk1hc2tRdWVyeVdpdGhEZWZhdWx0VGVzdCBleHRlbmRzIENvbHVtbk1hc2tRdWVyeVRlc3RlcgoreworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJvcmRlcj17MH0sIG1hc2s9ezF9LCB0eXBlPXsyfSwgdmFsdWU9ezN9IikKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IG9wdGlvbnMoKQorICAgIHsKKyAgICAgICAgTGlzdDxPYmplY3RbXT4gb3B0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKFN0cmluZyBvcmRlciA6IEFycmF5cy5hc0xpc3QoIkFTQyIsICJERVNDIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIG9wdGlvbnMuYWRkKG5ldyBPYmplY3RbXXsgb3JkZXIsICJERUZBVUxUIiwgInRleHQiLCAiYWJjIiwgIioqKioiIH0pOworICAgICAgICAgICAgb3B0aW9ucy5hZGQobmV3IE9iamVjdFtdeyBvcmRlciwgIkRFRkFVTFQiLCAiaW50IiwgMTIzLCAwIH0pOworICAgICAgICAgICAgb3B0aW9ucy5hZGQobmV3IE9iamVjdFtdeyBvcmRlciwgIm1hc2tfZGVmYXVsdCgpIiwgInRleHQiLCAiYWJjIiwgIioqKioiIH0pOworICAgICAgICAgICAgb3B0aW9ucy5hZGQobmV3IE9iamVjdFtdeyBvcmRlciwgIm1hc2tfZGVmYXVsdCgpIiwgImludCIsIDEyMywgMCwgfSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9wdGlvbnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1F1ZXJ5V2l0aE51bGxUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrUXVlcnlXaXRoTnVsbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmU0MGJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1F1ZXJ5V2l0aE51bGxUZXN0LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworLyoqCisgKiB7QGxpbmsgQ29sdW1uTWFza1F1ZXJ5VGVzdGVyfSBmb3Ige0BsaW5rIE51bGxNYXNraW5nRnVuY3Rpb259LgorICovCitwdWJsaWMgY2xhc3MgQ29sdW1uTWFza1F1ZXJ5V2l0aE51bGxUZXN0IGV4dGVuZHMgQ29sdW1uTWFza1F1ZXJ5VGVzdGVyCit7CisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIm9yZGVyPXswfSwgbWFzaz17MX0sIHR5cGU9ezJ9LCB2YWx1ZT17M30iKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gb3B0aW9ucygpCisgICAgeworICAgICAgICBMaXN0PE9iamVjdFtdPiBvcHRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIG9yZGVyIDogQXJyYXlzLmFzTGlzdCgiQVNDIiwgIkRFU0MiKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3B0aW9ucy5hZGQobmV3IE9iamVjdFtdeyBvcmRlciwgIm1hc2tfbnVsbCgpIiwgInRleHQiLCAiYWJjIiwgbnVsbCB9KTsKKyAgICAgICAgICAgIG9wdGlvbnMuYWRkKG5ldyBPYmplY3RbXXsgb3JkZXIsICJtYXNrX251bGwoKSIsICJpbnQiLCAxMjMsIG51bGwgfSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9wdGlvbnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1F1ZXJ5V2l0aFBhcnRpYWxUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrUXVlcnlXaXRoUGFydGlhbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWE0MjM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1F1ZXJ5V2l0aFBhcnRpYWxUZXN0LmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworLyoqCisgKiB7QGxpbmsgQ29sdW1uTWFza1F1ZXJ5VGVzdGVyfSBmb3Ige0BsaW5rIFBhcnRpYWxNYXNraW5nRnVuY3Rpb259LgorICovCitwdWJsaWMgY2xhc3MgQ29sdW1uTWFza1F1ZXJ5V2l0aFBhcnRpYWxUZXN0IGV4dGVuZHMgQ29sdW1uTWFza1F1ZXJ5VGVzdGVyCit7CisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIm9yZGVyPXswfSwgbWFzaz17MX0sIHR5cGU9ezJ9LCB2YWx1ZT17M30iKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gb3B0aW9ucygpCisgICAgeworICAgICAgICBMaXN0PE9iamVjdFtdPiBvcHRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIG9yZGVyIDogQXJyYXlzLmFzTGlzdCgiQVNDIiwgIkRFU0MiKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3B0aW9ucy5hZGQobmV3IE9iamVjdFtdeyBvcmRlciwgIm1hc2tfaW5uZXIobnVsbCwgbnVsbCkiLCAidGV4dCIsICJhYmNkZWYiLCAiKioqKioqIiB9KTsKKyAgICAgICAgICAgIG9wdGlvbnMuYWRkKG5ldyBPYmplY3RbXXsgb3JkZXIsICJtYXNrX2lubmVyKDEsIDIpIiwgInRleHQiLCAiYWJjZGVmIiwgImEqKiplZiIgfSk7CisgICAgICAgICAgICBvcHRpb25zLmFkZChuZXcgT2JqZWN0W117IG9yZGVyLCAibWFza19pbm5lcigxLCAyLCAnIycpIiwgInRleHQiLCAiYWJjZGVmIiwgImEjIyNlZiIgfSk7CisgICAgICAgICAgICBvcHRpb25zLmFkZChuZXcgT2JqZWN0W117IG9yZGVyLCAibWFza19vdXRlcigxLCBudWxsKSIsICJ0ZXh0IiwgImFiY2RlZiIsICIqYmNkZWYiIH0pOworICAgICAgICAgICAgb3B0aW9ucy5hZGQobmV3IE9iamVjdFtdeyBvcmRlciwgIm1hc2tfb3V0ZXIoMSwgMikiLCAidGV4dCIsICJhYmNkZWYiLCAiKmJjZCoqIiB9KTsKKyAgICAgICAgICAgIG9wdGlvbnMuYWRkKG5ldyBPYmplY3RbXXsgb3JkZXIsICJtYXNrX291dGVyKDEsIDIsICcjJykiLCAidGV4dCIsICJhYmNkZWYiLCAiI2JjZCMjIiwgfSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9wdGlvbnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1F1ZXJ5V2l0aFJlcGxhY2VUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrUXVlcnlXaXRoUmVwbGFjZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTNhNTcwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1F1ZXJ5V2l0aFJlcGxhY2VUZXN0LmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworLyoqCisgKiB7QGxpbmsgQ29sdW1uTWFza1F1ZXJ5VGVzdGVyfSBmb3Ige0BsaW5rIFJlcGxhY2VNYXNraW5nRnVuY3Rpb259LgorICovCitwdWJsaWMgY2xhc3MgQ29sdW1uTWFza1F1ZXJ5V2l0aFJlcGxhY2VUZXN0IGV4dGVuZHMgQ29sdW1uTWFza1F1ZXJ5VGVzdGVyCit7CisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIm9yZGVyPXswfSwgbWFzaz17MX0sIHR5cGU9ezJ9LCB2YWx1ZT17M30iKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gb3B0aW9ucygpCisgICAgeworICAgICAgICBMaXN0PE9iamVjdFtdPiBvcHRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIG9yZGVyIDogQXJyYXlzLmFzTGlzdCgiQVNDIiwgIkRFU0MiKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3B0aW9ucy5hZGQobmV3IE9iamVjdFtdeyBvcmRlciwgIm1hc2tfcmVwbGFjZShudWxsKSIsICJpbnQiLCAxMjMsIG51bGwgfSk7CisgICAgICAgICAgICBvcHRpb25zLmFkZChuZXcgT2JqZWN0W117IG9yZGVyLCAibWFza19yZXBsYWNlKCdyZWRhY3RlZCcpIiwgImFzY2lpIiwgImFiYyIsICJyZWRhY3RlZCIgfSk7CisgICAgICAgICAgICBvcHRpb25zLmFkZChuZXcgT2JqZWN0W117IG9yZGVyLCAibWFza19yZXBsYWNlKCdyZWRhY3RlZCcpIiwgInRleHQiLCAiYWJjIiwgInJlZGFjdGVkIiB9KTsKKyAgICAgICAgICAgIG9wdGlvbnMuYWRkKG5ldyBPYmplY3RbXXsgb3JkZXIsICJtYXNrX3JlcGxhY2UoMCkiLCAiaW50IiwgMTIzLCAwIH0pOworICAgICAgICAgICAgb3B0aW9ucy5hZGQobmV3IE9iamVjdFtdeyBvcmRlciwgIm1hc2tfcmVwbGFjZSgwKSIsICJiaWdpbnQiLCAxMjNMLCAwTCB9KTsKKyAgICAgICAgICAgIG9wdGlvbnMuYWRkKG5ldyBPYmplY3RbXXsgb3JkZXIsICJtYXNrX3JlcGxhY2UoMCkiLCAidmFyaW50IiwgQmlnSW50ZWdlci52YWx1ZU9mKDEyMyksIEJpZ0ludGVnZXIuWkVSTyB9KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3B0aW9uczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrUXVlcnlXaXRoVURGVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1F1ZXJ5V2l0aFVERlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmI5MGI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1F1ZXJ5V2l0aFVERlRlc3QuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKKy8qKgorICoge0BsaW5rIENvbHVtbk1hc2tRdWVyeVRlc3Rlcn0gZm9yIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBDb2x1bW5NYXNrUXVlcnlXaXRoVURGVGVzdCBleHRlbmRzIENvbHVtbk1hc2tRdWVyeVRlc3RlcgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JFUExBQ0VfRlVOQ1RJT04gPSBLRVlTUEFDRSArICIubWFza190ZXh0X3JlcGxhY2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRfUkVQTEFDRV9GVU5DVElPTiA9IEtFWVNQQUNFICsgIi5tYXNrX2ludF9yZXBsYWNlIjsKKworICAgIEBCZWZvcmUKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cFNjaGVtYSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAidGV4dCwgdGV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgRlVOQ1RJT04gSUYgTk9UIEVYSVNUUyAiICsgVEVYVF9SRVBMQUNFX0ZVTkNUSU9OICsgIiAoY29sdW1uIHRleHQsIHJlcGxhY2VtZW50IHRleHQpICIgKworICAgICAgICAgICAgICAgICAgICAgICAiQ0FMTEVEIE9OIE5VTEwgSU5QVVQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIHRleHQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhICIgKworICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3JldHVybiByZXBsYWNlbWVudDsnIik7CisgICAgICAgIGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAiaW50LCBpbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OIElGIE5PVCBFWElTVFMgIiArIElOVF9SRVBMQUNFX0ZVTkNUSU9OICsgIiAoY29sdW1uIGludCwgcmVwbGFjZW1lbnQgaW50KSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIkNBTExFRCBPTiBOVUxMIElOUFVUICIgKworICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBpbnQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhICIgKworICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3JldHVybiByZXBsYWNlbWVudDsnIik7CisgICAgICAgIHN1cGVyLnNldHVwU2NoZW1hKCk7CisgICAgfQorCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIm9yZGVyPXswfSwgbWFzaz17MX0sIHR5cGU9ezJ9LCB2YWx1ZT17M30iKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gb3B0aW9ucygpCisgICAgeworICAgICAgICBMaXN0PE9iamVjdFtdPiBvcHRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIG9yZGVyIDogQXJyYXlzLmFzTGlzdCgiQVNDIiwgIkRFU0MiKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3B0aW9ucy5hZGQobmV3IE9iamVjdFtdeyBvcmRlciwgVEVYVF9SRVBMQUNFX0ZVTkNUSU9OICsgIigncmVkYWN0ZWQnKSIsICJ0ZXh0IiwgImFiYyIsICJyZWRhY3RlZCIgfSk7CisgICAgICAgICAgICBvcHRpb25zLmFkZChuZXcgT2JqZWN0W117IG9yZGVyLCBURVhUX1JFUExBQ0VfRlVOQ1RJT04gKyAiKCdzZWNyZXQnKSIsICJ0ZXh0IiwgImFiYyIsICJzZWNyZXQiIH0pOworICAgICAgICAgICAgb3B0aW9ucy5hZGQobmV3IE9iamVjdFtdeyBvcmRlciwgSU5UX1JFUExBQ0VfRlVOQ1RJT04gKyAiKDApIiwgImludCIsIDEyMywgMCB9KTsKKyAgICAgICAgICAgIG9wdGlvbnMuYWRkKG5ldyBPYmplY3RbXXsgb3JkZXIsIElOVF9SRVBMQUNFX0ZVTkNUSU9OICsgIigtMSkiLCAiaW50IiwgMTIzLCAtMSB9KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3B0aW9uczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2UxMGUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1Rlc3QuamF2YQpAQCAtMCwwICsxLDU4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQm91bmRTdGF0ZW1lbnQ7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlByZXBhcmVkU3RhdGVtZW50OworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUwzVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb25QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuTmF0aXZlRnVuY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuTmF0aXZlRnVuY3Rpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmcuQ29sdW1uTWFzay5ESVNBQkxFRF9FUlJPUl9NRVNTQUdFOworCisvKioKKyAqIFRlc3RzIHNjaGVtYSBhbHRlcmluZyBxdWVyaWVzICh7QGNvZGUgQ1JFQVRFIFRBQkxFfSwge0Bjb2RlIEFMVEVSIFRBQkxFfSwgZXRjLikgdGhhdCBhdHRhY2gvZGV0dGFjaCBkeW5hbWljIGRhdGEKKyAqIG1hc2tpbmcgZnVuY3Rpb25zIHRvIGNvbHVtbiBkZWZpbml0aW9ucy4KKyAqLworcHVibGljIGNsYXNzIENvbHVtbk1hc2tUZXN0IGV4dGVuZHMgQ29sdW1uTWFza1Rlc3RlcgoreworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25zKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgLy8gQ3JlYXRlIHRhYmxlIHdpdGggbWFza3MKKyAgICAgICAgU3RyaW5nIHRhYmxlID0gY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicyBzZXQ8aW50PiBNQVNLRUQgV0lUSCBERUZBVUxULCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImwgbGlzdDxpbnQ+IE1BU0tFRCBXSVRIIERFRkFVTFQsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibSBtYXA8aW50LCBpbnQ+IE1BU0tFRCBXSVRIIERFRkFVTFQsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnMgZnJvemVuPHNldDxpbnQ+PiBNQVNLRUQgV0lUSCBERUZBVUxULCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsIGZyb3plbjxsaXN0PGludD4+IE1BU0tFRCBXSVRIIERFRkFVTFQsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm0gZnJvemVuPG1hcDxpbnQsIGludD4+IE1BU0tFRCBXSVRIIERFRkFVTFQpIik7CisgICAgICAgIGFzc2VydENvbHVtbklzTWFza2VkKHRhYmxlLCAicyIsICJtYXNrX2RlZmF1bHQiLCBlbXB0eUxpc3QoKSwgZW1wdHlMaXN0KCkpOworICAgICAgICBhc3NlcnRDb2x1bW5Jc01hc2tlZCh0YWJsZSwgImwiLCAibWFza19kZWZhdWx0IiwgZW1wdHlMaXN0KCksIGVtcHR5TGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uSXNNYXNrZWQodGFibGUsICJtIiwgIm1hc2tfZGVmYXVsdCIsIGVtcHR5TGlzdCgpLCBlbXB0eUxpc3QoKSk7CisgICAgICAgIGFzc2VydENvbHVtbklzTWFza2VkKHRhYmxlLCAiZnMiLCAibWFza19kZWZhdWx0IiwgZW1wdHlMaXN0KCksIGVtcHR5TGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uSXNNYXNrZWQodGFibGUsICJmbCIsICJtYXNrX2RlZmF1bHQiLCBlbXB0eUxpc3QoKSwgZW1wdHlMaXN0KCkpOworICAgICAgICBhc3NlcnRDb2x1bW5Jc01hc2tlZCh0YWJsZSwgImZtIiwgIm1hc2tfZGVmYXVsdCIsIGVtcHR5TGlzdCgpLCBlbXB0eUxpc3QoKSk7CisKKyAgICAgICAgLy8gQWx0ZXIgY29sdW1uIG1hc2tzCisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIHMgTUFTS0VEIFdJVEggbWFza19udWxsKCkiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgbCBNQVNLRUQgV0lUSCBtYXNrX251bGwoKSIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBtIE1BU0tFRCBXSVRIIG1hc2tfbnVsbCgpIik7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIGZzIE1BU0tFRCBXSVRIIG1hc2tfbnVsbCgpIik7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIGZsIE1BU0tFRCBXSVRIIG1hc2tfbnVsbCgpIik7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIGZtIE1BU0tFRCBXSVRIIG1hc2tfbnVsbCgpIik7CisgICAgICAgIGFzc2VydENvbHVtbklzTWFza2VkKHRhYmxlLCAicyIsICJtYXNrX251bGwiLCBlbXB0eUxpc3QoKSwgZW1wdHlMaXN0KCkpOworICAgICAgICBhc3NlcnRDb2x1bW5Jc01hc2tlZCh0YWJsZSwgImwiLCAibWFza19udWxsIiwgZW1wdHlMaXN0KCksIGVtcHR5TGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uSXNNYXNrZWQodGFibGUsICJtIiwgIm1hc2tfbnVsbCIsIGVtcHR5TGlzdCgpLCBlbXB0eUxpc3QoKSk7CisgICAgICAgIGFzc2VydENvbHVtbklzTWFza2VkKHRhYmxlLCAiZnMiLCAibWFza19udWxsIiwgZW1wdHlMaXN0KCksIGVtcHR5TGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uSXNNYXNrZWQodGFibGUsICJmbCIsICJtYXNrX251bGwiLCBlbXB0eUxpc3QoKSwgZW1wdHlMaXN0KCkpOworICAgICAgICBhc3NlcnRDb2x1bW5Jc01hc2tlZCh0YWJsZSwgImZtIiwgIm1hc2tfbnVsbCIsIGVtcHR5TGlzdCgpLCBlbXB0eUxpc3QoKSk7CisKKyAgICAgICAgLy8gRHJvcCBtYXNrcworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBzIERST1AgTUFTS0VEIik7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIGwgRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgbSBEUk9QIE1BU0tFRCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBmcyBEUk9QIE1BU0tFRCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBmbCBEUk9QIE1BU0tFRCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBmbSBEUk9QIE1BU0tFRCIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoInMiLCAibCIsICJtIiwgImZzIiwgImZsIiwgImZtIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VURUcygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFN0cmluZyB0eXBlID0gY3JlYXRlVHlwZSgiQ1JFQVRFIFRZUEUgJXMgKGExIHZhcmludCwgYTIgdmFyaW50LCBhMyB2YXJpbnQpOyIpOworCisgICAgICAgIC8vIENyZWF0ZSB0YWJsZSB3aXRoIG1hc2sKKyAgICAgICAgU3RyaW5nIHRhYmxlID0gY3JlYXRlVGFibGUoZm9ybWF0KCJDUkVBVEUgVEFCTEUgJSVzIChrIGludCBQUklNQVJZIEtFWSwgdiAlcyBNQVNLRUQgV0lUSCBERUZBVUxUKSIsIHR5cGUpKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uSXNNYXNrZWQodGFibGUsICJ2IiwgIm1hc2tfZGVmYXVsdCIsIGVtcHR5TGlzdCgpLCBlbXB0eUxpc3QoKSk7CisKKyAgICAgICAgLy8gQWx0ZXIgY29sdW1uIG1hc2sKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgdiBNQVNLRUQgV0lUSCBtYXNrX251bGwoKSIpOworICAgICAgICBhc3NlcnRDb2x1bW5Jc01hc2tlZCh0YWJsZSwgInYiLCAibWFza19udWxsIiwgZW1wdHlMaXN0KCksIGVtcHR5TGlzdCgpKTsKKworICAgICAgICAvLyBEcm9wIG1hc2sKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgdiBEUk9QIE1BU0tFRCIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoInYiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbHRlclRhYmxlQWRkTWFza2luZ1RvTm9uRXhpc3RpbmdDb2x1bW4oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBTdHJpbmcgdGFibGUgPSBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdiB0ZXh0KSIpOworICAgICAgICBleGVjdXRlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBJRiBFWElTVFMgdW5rbm93biBNQVNLRUQgV0lUSCBERUZBVUxUIik7CisgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKGZvcm1hdCgiQ29sdW1uIHdpdGggbmFtZSAndW5rbm93bicgZG9lc24ndCBleGlzdCBvbiB0YWJsZSAnJXMnIiwgdGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRRdWVyeSgiQUxURVIgVEFCTEUgJXMgQUxURVIgdW5rbm93biBNQVNLRUQgV0lUSCBERUZBVUxUIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsdGVyVGFibGVSZW1vdmVNYXNraW5nRnJvbU5vbkV4aXN0aW5nQ29sdW1uKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgU3RyaW5nIHRhYmxlID0gY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIHYgdGV4dCkiKTsKKyAgICAgICAgZXhlY3V0ZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgSUYgRVhJU1RTIHVua25vd24gRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoZm9ybWF0KCJDb2x1bW4gd2l0aCBuYW1lICd1bmtub3duJyBkb2Vzbid0IGV4aXN0IG9uIHRhYmxlICclcyciLCB0YWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdFF1ZXJ5KCJBTFRFUiBUQUJMRSAlcyBBTFRFUiB1bmtub3duIERST1AgTUFTS0VEIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsdGVyVGFibGVSZW1vdmVNYXNrRnJvbVVubWFza2VkQ29sdW1uKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIHYgdGV4dCkiKTsKKyAgICAgICAgZXhlY3V0ZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgdiBEUk9QIE1BU0tFRCIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoInYiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkTWFza2luZ0Z1bmN0aW9uTmFtZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIC8vIGNyZWF0ZSB0YWJsZQorICAgICAgICBjcmVhdGVUYWJsZU5hbWUoKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlVuYWJsZSB0byBmaW5kIG1hc2tpbmcgZnVuY3Rpb24gZm9yIHYsIG5vIGRlY2xhcmVkIGZ1bmN0aW9uIG1hdGNoZXMgdGhlIHNpZ25hdHVyZSBtYXNrX21pc3NpbmcoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdFF1ZXJ5KCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB2IGludCBNQVNLRUQgV0lUSCBtYXNrX21pc3NpbmcoKSkiKSk7CisKKyAgICAgICAgLy8gYWx0ZXIgdGFibGUKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIHYgaW50KSIpOworICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVW5hYmxlIHRvIGZpbmQgbWFza2luZyBmdW5jdGlvbiBmb3Igdiwgbm8gZGVjbGFyZWQgZnVuY3Rpb24gbWF0Y2hlcyB0aGUgc2lnbmF0dXJlIG1hc2tfbWlzc2luZygpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFMVEVSIFRBQkxFICVzIEFMVEVSIHYgTUFTS0VEIFdJVEggbWFza19taXNzaW5nKCkiKTsKKworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoImsiLCAidiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRNYXNraW5nRnVuY3Rpb25Bcmd1bWVudHMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICAvLyBjcmVhdGUgdGFibGUKKyAgICAgICAgY3JlYXRlVGFibGVOYW1lKCk7CisgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uIHN5c3RlbS5tYXNrX2RlZmF1bHQoYW55KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdFF1ZXJ5KCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB2IGludCBNQVNLRUQgV0lUSCBtYXNrX2RlZmF1bHQoMSkpIikpOworCisgICAgICAgIC8vIGFsdGVyIHRhYmxlCisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB2IGludCkiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb24gc3lzdGVtLm1hc2tfZGVmYXVsdChhbnkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFMVEVSIFRBQkxFICVzIEFMVEVSIHYgTUFTS0VEIFdJVEggbWFza19kZWZhdWx0KDEpIik7CisKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTm90TWFza2VkKCJrIiwgInYiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkTWFza2luZ0Z1bmN0aW9uQXJndW1lbnRUeXBlcygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIC8vIGNyZWF0ZSB0YWJsZQorICAgICAgICBjcmVhdGVUYWJsZU5hbWUoKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkZ1bmN0aW9uIHN5c3RlbS5tYXNrX2lubmVyIHJlcXVpcmVzIGFuIGFyZ3VtZW50IG9mIHR5cGUgaW50LCBidXQgZm91bmQgYXJndW1lbnQgJ2EnIG9mIHR5cGUgYXNjaWkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRRdWVyeSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdiB0ZXh0IE1BU0tFRCBXSVRIIG1hc2tfaW5uZXIoJ2EnLCAnYicpKSIpKTsKKworICAgICAgICAvLyBhbHRlciB0YWJsZQorICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdiB0ZXh0KSIpOworICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiRnVuY3Rpb24gc3lzdGVtLm1hc2tfaW5uZXIgcmVxdWlyZXMgYW4gYXJndW1lbnQgb2YgdHlwZSBpbnQsIGJ1dCBmb3VuZCBhcmd1bWVudCAnYScgb2YgdHlwZSBhc2NpaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBTFRFUiBUQUJMRSAlcyBBTFRFUiB2IE1BU0tFRCBXSVRIIG1hc2tfaW5uZXIoJ2EnLCAnYicpIik7CisgICAgICAgIGFzc2VydFRhYmxlQ29sdW1uc0FyZU5vdE1hc2tlZCgiayIsICJ2Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29sdW1uTWFza2luZ1dpdGhOb3RNYXNraW5nRnVuY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICAvLyBjcmVhdGUgdGFibGUKKyAgICAgICAgY3JlYXRlVGFibGVOYW1lKCk7CisgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJOb3QtbWFza2luZyBmdW5jdGlvbiB0b2pzb24oKSBjYW5ub3QgYmUgdXNlZCBmb3IgbWFza2luZyB0YWJsZSBjb2x1bW5zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0UXVlcnkoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIHYgdGV4dCBNQVNLRUQgV0lUSCB0b2pzb24oKSkiKSk7CisKKyAgICAgICAgLy8gYWx0ZXIgdGFibGUKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIHYgdGV4dCkiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIk5vdC1tYXNraW5nIGZ1bmN0aW9uIHRvanNvbigpIGNhbm5vdCBiZSB1c2VkIGZvciBtYXNraW5nIHRhYmxlIGNvbHVtbnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUxURVIgVEFCTEUgJXMgQUxURVIgdiBNQVNLRUQgV0lUSCB0b2pzb24oKSIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoImsiLCAidiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlcGFyZWRTdGF0ZW1lbnQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdiB0ZXh0IE1BU0tFRCBXSVRIIERFRkFVTFQpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDAsICdzZW5zaXRpdmUnKSIpOworCisgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IHNlc3Npb25OZXQoKTsKKyAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZWQgPSBzZXNzaW9uLnByZXBhcmUoZm9ybWF0UXVlcnkoIlNFTEVDVCB2IEZST00gJXMgV0hFUkUgayA9ID8iKSk7CisgICAgICAgIEJvdW5kU3RhdGVtZW50IGJvdW5kID0gcHJlcGFyZWQuYmluZCgwKTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChzZXNzaW9uLmV4ZWN1dGUoYm91bmQpLCByb3coIioqKioiKSk7CisKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgdiBEUk9QIE1BU0tFRCIpOworICAgICAgICBhc3NlcnRSb3dzTmV0KHNlc3Npb24uZXhlY3V0ZShib3VuZCksIHJvdygic2Vuc2l0aXZlIikpOworCisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIHYgTUFTS0VEIFdJVEggbWFza19yZXBsYWNlKCdyZWRhY3RlZCcpIik7CisgICAgICAgIGFzc2VydFJvd3NOZXQoc2Vzc2lvbi5leGVjdXRlKGJvdW5kKSwgcm93KCJyZWRhY3RlZCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWaWV3cygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50LCBjIGludCwgdiB0ZXh0IE1BU0tFRCBXSVRIIG1hc2tfcmVwbGFjZSgncmVkYWN0ZWQnKSwgUFJJTUFSWSBLRVkgKGssIGMpKSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYywgdikgVkFMVUVTICgwLCAwLCAnc2Vuc2l0aXZlJykiKTsKKyAgICAgICAgU3RyaW5nIHZpZXcgPSBjcmVhdGVWaWV3KCJDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgJXMgQVMgU0VMRUNUICogRlJPTSAlcyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXSEVSRSBrIElTIE5PVCBOVUxMIEFORCBjIElTIE5PVCBOVUxMIEFORCB2IElTIE5PVCBOVUxMICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBSSU1BUlkgS0VZICh2LCBrLCBjKSIpOworICAgICAgICB3YWl0Rm9yVmlld011dGF0aW9ucygpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQoZm9ybWF0KCJTRUxFQ1QgdiBGUk9NICVzLiVzIiwgS0VZU1BBQ0UsIHZpZXcpKSwgcm93KCJyZWRhY3RlZCIpKTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KGZvcm1hdCgiU0VMRUNUIHYgRlJPTSAlcy4lcyBXSEVSRSB2PSdzZW5zaXRpdmUnIiwgS0VZU1BBQ0UsIHZpZXcpKSwgcm93KCJyZWRhY3RlZCIpKTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KGZvcm1hdCgiU0VMRUNUIHYgRlJPTSAlcy4lcyBXSEVSRSB2PSdyZWRhY3RlZCciLCBLRVlTUEFDRSwgdmlldykpKTsKKworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiB2IERST1AgTUFTS0VEIik7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldChmb3JtYXQoIlNFTEVDVCB2IEZST00gJXMuJXMiLCBLRVlTUEFDRSwgdmlldykpLCByb3coInNlbnNpdGl2ZSIpKTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KGZvcm1hdCgiU0VMRUNUIHYgRlJPTSAlcy4lcyBXSEVSRSB2PSdzZW5zaXRpdmUnIiwgS0VZU1BBQ0UsIHZpZXcpKSwgcm93KCJzZW5zaXRpdmUiKSk7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldChmb3JtYXQoIlNFTEVDVCB2IEZST00gJXMuJXMgV0hFUkUgdj0ncmVkYWN0ZWQnIiwgS0VZU1BBQ0UsIHZpZXcpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVwYXJlZFN0YXRlbWVudE9uVmlldygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50LCBjIGludCwgdiB0ZXh0IE1BU0tFRCBXSVRIIERFRkFVTFQsIFBSSU1BUlkgS0VZIChrLCBjKSkiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGMsIHYpIFZBTFVFUyAoMCwgMCwgJ3NlbnNpdGl2ZScpIik7CisgICAgICAgIFN0cmluZyB2aWV3ID0gY3JlYXRlVmlldygiQ1JFQVRFIE1BVEVSSUFMSVpFRCBWSUVXICVzIEFTIFNFTEVDVCAqIEZST00gJXMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0hFUkUgayBJUyBOT1QgTlVMTCBBTkQgYyBJUyBOT1QgTlVMTCBBTkQgdiBJUyBOT1QgTlVMTCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQUklNQVJZIEtFWSAodiwgaywgYykiKTsKKyAgICAgICAgd2FpdEZvclZpZXdNdXRhdGlvbnMoKTsKKworICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBzZXNzaW9uTmV0KCk7CisgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHByZXBhcmVkID0gc2Vzc2lvbi5wcmVwYXJlKGZvcm1hdCgiU0VMRUNUIHYgRlJPTSAlcy4lcyBXSEVSRSB2PT8iLCBLRVlTUEFDRSwgdmlldykpOworICAgICAgICBCb3VuZFN0YXRlbWVudCBib3VuZCA9IHByZXBhcmVkLmJpbmQoInNlbnNpdGl2ZSIpOworICAgICAgICBhc3NlcnRSb3dzTmV0KHNlc3Npb24uZXhlY3V0ZShib3VuZCksIHJvdygiKioqKiIpKTsKKworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiB2IERST1AgTUFTS0VEIik7CisgICAgICAgIGFzc2VydFJvd3NOZXQoc2Vzc2lvbi5leGVjdXRlKGJvdW5kKSwgcm93KCJzZW5zaXRpdmUiKSk7CisKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgdiBNQVNLRUQgV0lUSCBtYXNrX3JlcGxhY2UoJ3JlZGFjdGVkJykiKTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChzZXNzaW9uLmV4ZWN1dGUoYm91bmQpLCByb3coInJlZGFjdGVkIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdyb3VwQnkoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCwgYyBpbnQsIHYgdGV4dCwgUFJJTUFSWSBLRVkgKGssIGMpKSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYywgdikgVkFMVUVTICgwLCAwLCAnc2Vuc2l0aXZlJykiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGMsIHYpIFZBTFVFUyAoMCwgMSwgJ3NlbnNpdGl2ZScpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDEsIDAsICdzZW5zaXRpdmUnKSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYywgdikgVkFMVUVTICgxLCAxLCAnc2Vuc2l0aXZlJykiKTsKKworICAgICAgICAvLyB3aXRob3V0IG1hc2tzCisgICAgICAgIFN0cmluZyBxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICVzIEdST1VQIEJZIGsiOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQocXVlcnkpLCByb3coMSwgMCwgInNlbnNpdGl2ZSIpLCByb3coMCwgMCwgInNlbnNpdGl2ZSIpKTsKKworICAgICAgICAvLyB3aXRoIG1hc2tlZCByZWd1bGFyIGNvbHVtbgorICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiB2IE1BU0tFRCBXSVRIIG1hc2tfcmVwbGFjZSgncmVkYWN0ZWQnKSIpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQocXVlcnkpLCByb3coMSwgMCwgInJlZGFjdGVkIiksIHJvdygwLCAwLCAicmVkYWN0ZWQiKSk7CisKKyAgICAgICAgLy8gd2l0aCBtYXNrZWQgY2x1c3RlcmluZyBrZXkKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgYyBNQVNLRUQgV0lUSCBtYXNrX3JlcGxhY2UoLTEpIik7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldChxdWVyeSksIHJvdygxLCAtMSwgInJlZGFjdGVkIiksIHJvdygwLCAtMSwgInJlZGFjdGVkIikpOworCisgICAgICAgIC8vIHdpdGggbWFza2VkIHBhcnRpdGlvbiBrZXkKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgayBNQVNLRUQgV0lUSCBtYXNrX3JlcGxhY2UoLTEpIik7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldChxdWVyeSksIHJvdygtMSwgLTEsICJyZWRhY3RlZCIpLCByb3coLTEsIC0xLCAicmVkYWN0ZWQiKSk7CisKKyAgICAgICAgLy8gYWdhaW4gd2l0aG91dCBtYXNrcworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBrIERST1AgTUFTS0VEIik7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIGMgRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgdiBEUk9QIE1BU0tFRCIpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQocXVlcnkpLCByb3coMSwgMCwgInNlbnNpdGl2ZSIpLCByb3coMCwgMCwgInNlbnNpdGl2ZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYWdpbmcoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCwgYyBpbnQsIHYgdGV4dCwgUFJJTUFSWSBLRVkgKGssIGMpKSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYywgdikgVkFMVUVTICgwLCAwLCAnc2Vuc2l0aXZlJykiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGMsIHYpIFZBTFVFUyAoMCwgMSwgJ3NlbnNpdGl2ZScpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDEsIDAsICdzZW5zaXRpdmUnKSIpOworCisgICAgICAgIC8vIHdpdGhvdXQgbWFza3MKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMiLCByb3coMSwgMCwgInNlbnNpdGl2ZSIpLCByb3coMCwgMCwgInNlbnNpdGl2ZSIpLCByb3coMCwgMSwgInNlbnNpdGl2ZSIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDEiLCByb3coMSwgMCwgInNlbnNpdGl2ZSIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDAiLCByb3coMCwgMCwgInNlbnNpdGl2ZSIpLCByb3coMCwgMSwgInNlbnNpdGl2ZSIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDAgQU5EIGMgPSAxIiwgcm93KDAsIDEsICJzZW5zaXRpdmUiKSk7CisKKyAgICAgICAgLy8gd2l0aCBtYXNrZWQgcmVndWxhciBjb2x1bW4KKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgdiBNQVNLRUQgV0lUSCBtYXNrX3JlcGxhY2UoJ3JlZGFjdGVkJykiKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMiLCByb3coMSwgMCwgInJlZGFjdGVkIiksIHJvdygwLCAwLCAicmVkYWN0ZWQiKSwgcm93KDAsIDEsICJyZWRhY3RlZCIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDEiLCByb3coMSwgMCwgInJlZGFjdGVkIikpOworICAgICAgICBhc3NlcnRSb3dzV2l0aFBhZ2luZygiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gMCIsIHJvdygwLCAwLCAicmVkYWN0ZWQiKSwgcm93KDAsIDEsICJyZWRhY3RlZCIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDAgQU5EIGMgPSAxIiwgcm93KDAsIDEsICJyZWRhY3RlZCIpKTsKKworICAgICAgICAvLyB3aXRoIG1hc2tlZCBjbHVzdGVyaW5nIGtleQorICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBjIE1BU0tFRCBXSVRIIG1hc2tfcmVwbGFjZSgtMSkiKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMiLCByb3coMSwgLTEsICJyZWRhY3RlZCIpLCByb3coMCwgLTEsICJyZWRhY3RlZCIpLCByb3coMCwgLTEsICJyZWRhY3RlZCIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDEiLCByb3coMSwgLTEsICJyZWRhY3RlZCIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDAiLCByb3coMCwgLTEsICJyZWRhY3RlZCIpLCByb3coMCwgLTEsICJyZWRhY3RlZCIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDAgQU5EIGMgPSAxIiwgcm93KDAsIC0xLCAicmVkYWN0ZWQiKSk7CisKKyAgICAgICAgLy8gd2l0aCBtYXNrZWQgcGFydGl0aW9uIGtleQorICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBrIE1BU0tFRCBXSVRIIG1hc2tfcmVwbGFjZSgtMSkiKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMiLCByb3coLTEsIC0xLCAicmVkYWN0ZWQiKSwgcm93KC0xLCAtMSwgInJlZGFjdGVkIiksIHJvdygtMSwgLTEsICJyZWRhY3RlZCIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDEiLCByb3coLTEsIC0xLCAicmVkYWN0ZWQiKSk7CisgICAgICAgIGFzc2VydFJvd3NXaXRoUGFnaW5nKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPSAwIiwgcm93KC0xLCAtMSwgInJlZGFjdGVkIiksIHJvdygtMSwgLTEsICJyZWRhY3RlZCIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDAgQU5EIGMgPSAxIiwgcm93KC0xLCAtMSwgInJlZGFjdGVkIikpOworCisgICAgICAgIC8vIGFnYWluIHdpdGhvdXQgbWFza3MKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgayBEUk9QIE1BU0tFRCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBjIERST1AgTUFTS0VEIik7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIHYgRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMiLCByb3coMSwgMCwgInNlbnNpdGl2ZSIpLCByb3coMCwgMCwgInNlbnNpdGl2ZSIpLCByb3coMCwgMSwgInNlbnNpdGl2ZSIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDEiLCByb3coMSwgMCwgInNlbnNpdGl2ZSIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDAiLCByb3coMCwgMCwgInNlbnNpdGl2ZSIpLCByb3coMCwgMSwgInNlbnNpdGl2ZSIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDAgQU5EIGMgPSAxIiwgcm93KDAsIDEsICJzZW5zaXRpdmUiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCByb3dzIGFyZSBhbHdheXMgb3JkZXJlZCBhY2NvcmRpbmcgdG8gdGhlIGNsZWFyIHZhbHVlcyBvZiB0aGUgY29sdW1ucywgZXZlbiBmb3IgdGhlIHBvc3Qtb3JkZXJpbmcgZG9uZQorICAgICAqIGZvciBxdWVyaWVzIHdpdGgge0Bjb2RlIElOfSByZXN0cmljdGlvbnMgYW5kIHtAY29kZSBPUkRFUiBCWX0gY2xhdXNlcy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0T3JkZXJpbmcoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCwgYyBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAoaywgYykpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDAsIDAsIDApIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDAsIDEsIDEpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDEsIDAsIDMpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDEsIDEsIDQpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDIsIDAsIDYpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDIsIDEsIDcpIik7CisgICAgICAgIE5hdGl2ZUZ1bmN0aW9ucy5pbnN0YW5jZS5hZGQoTkVHQVRJVkUpOworCisgICAgICAgIC8vIFRlc3Qgb3JkZXJpbmcgd2l0aG91dCBtYXNraW5nLCBqdXN0IGZvciByZWZlcmVuY2UKKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgIHJvdygwLCAxLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICByb3coMSwgMCwgMyksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIDEsIDQpLAorICAgICAgICAgICAgICAgICAgICAgIHJvdygyLCAwLCA2KSwKKyAgICAgICAgICAgICAgICAgICAgICByb3coMiwgMSwgNykpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRob3V0UGFnaW5nKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIE9SREVSIEJZIGMgQVNDIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCAwLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICByb3coMiwgMCwgNiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIDEsIDEpLAorICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCAxLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICByb3coMiwgMSwgNykpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRob3V0UGFnaW5nKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIE9SREVSIEJZIGMgREVTQyIpLAorICAgICAgICAgICAgICAgICAgICAgIHJvdygwLCAxLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICByb3coMSwgMSwgNCksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIDEsIDcpLAorICAgICAgICAgICAgICAgICAgICAgIHJvdygwLCAwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICByb3coMSwgMCwgMyksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIDAsIDYpKTsKKworICAgICAgICAvLyBUZXN0IG9yZGVyaW5nIHdpdGggbWFudWFsbHkgYXBwbGllZCBtYXNraW5nIGZ1bmN0aW9uLCBqdXN0IGZvciByZWZlcmVuY2UKKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KCJTRUxFQ1QgaywgbWFza19uZWdhdGl2ZShjKSwgdiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0wLCAwKSwgLy8gKDAsIDAsIDApCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0xLCAxKSwgLy8gKDAsIDEsIDEpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0wLCAzKSwgLy8gKDEsIDAsIDMpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0xLCA0KSwgLy8gKDEsIDEsIDQpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0wLCA2KSwgLy8gKDIsIDAsIDYpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0xLCA3KSk7IC8vICgyLCAxLCA3KQorICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRob3V0UGFnaW5nKCJTRUxFQ1QgaywgbWFza19uZWdhdGl2ZShjKSwgdiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIE9SREVSIEJZIGMgQVNDIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0wLCAwKSwgLy8gKDAsIDAsIDApCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0wLCAzKSwgLy8gKDEsIDAsIDMpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0wLCA2KSwgLy8gKDIsIDAsIDYpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0xLCAxKSwgLy8gKDAsIDEsIDEpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0xLCA0KSwgLy8gKDEsIDEsIDQpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0xLCA3KSk7IC8vICgyLCAxLCA3KQorICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRob3V0UGFnaW5nKCJTRUxFQ1QgaywgbWFza19uZWdhdGl2ZShjKSwgdiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIE9SREVSIEJZIGMgREVTQyIpLAorICAgICAgICAgICAgICAgICAgICAgIHJvdygwLCAtMSwgMSksIC8vICgwLCAxLCAxKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCAtMSwgNCksIC8vICgxLCAxLCA0KQorICAgICAgICAgICAgICAgICAgICAgIHJvdygyLCAtMSwgNyksIC8vICgyLCAxLCA3KQorICAgICAgICAgICAgICAgICAgICAgIHJvdygwLCAtMCwgMCksIC8vICgwLCAwLCAwKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCAtMCwgMyksIC8vICgxLCAwLCAzKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygyLCAtMCwgNikpOyAvLyAoMiwgMCwgNikKKworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBjIE1BU0tFRCBXSVRIIG1hc2tfbmVnYXRpdmUoKSIpOworCisgICAgICAgIC8vIFRlc3Qgb3JkZXJpbmcgb2Ygd2lsZGNhcmQgcXVlcmllcyB3aXRoIG1hc2tlZCBjb2x1bW4KKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0wLCAwKSwgLy8gKDAsIDAsIDApCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0xLCAxKSwgLy8gKDAsIDEsIDEpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0wLCAzKSwgLy8gKDEsIDAsIDMpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0xLCA0KSwgLy8gKDEsIDEsIDQpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0wLCA2KSwgLy8gKDIsIDAsIDYpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0xLCA3KSk7IC8vICgyLCAxLCA3KQorICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRob3V0UGFnaW5nKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIE9SREVSIEJZIGMgQVNDIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0wLCAwKSwgLy8gKDAsIDAsIDApCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0wLCAzKSwgLy8gKDEsIDAsIDMpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0wLCA2KSwgLy8gKDIsIDAsIDYpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0xLCAxKSwgLy8gKDAsIDEsIDEpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0xLCA0KSwgLy8gKDEsIDEsIDQpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0xLCA3KSk7IC8vICgyLCAxLCA3KQorICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRob3V0UGFnaW5nKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIE9SREVSIEJZIGMgREVTQyIpLAorICAgICAgICAgICAgICAgICAgICAgIHJvdygwLCAtMSwgMSksIC8vICgwLCAxLCAxKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCAtMSwgNCksIC8vICgxLCAxLCA0KQorICAgICAgICAgICAgICAgICAgICAgIHJvdygyLCAtMSwgNyksIC8vICgyLCAxLCA3KQorICAgICAgICAgICAgICAgICAgICAgIHJvdygwLCAtMCwgMCksIC8vICgwLCAwLCAwKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCAtMCwgMyksIC8vICgxLCAwLCAzKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygyLCAtMCwgNikpOyAvLyAoMiwgMCwgNikKKworICAgICAgICAvLyBUZXN0IG9yZGVyaW5nIG9mIGNvbHVtbiBzZWxlY3Rpb24gcXVlcmllcyB3aXRoIG1hc2tlZCBjb2x1bW4KKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KCJTRUxFQ1QgaywgYywgdiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0wLCAwKSwgLy8gKDAsIDAsIDApCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0xLCAxKSwgLy8gKDAsIDEsIDEpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0wLCAzKSwgLy8gKDEsIDAsIDMpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0xLCA0KSwgLy8gKDEsIDEsIDQpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0wLCA2KSwgLy8gKDIsIDAsIDYpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0xLCA3KSk7IC8vICgyLCAxLCA3KQorICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRob3V0UGFnaW5nKCJTRUxFQ1QgaywgYywgdiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIE9SREVSIEJZIGMgQVNDIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0wLCAwKSwgLy8gKDAsIDAsIDApCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0wLCAzKSwgLy8gKDEsIDAsIDMpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0wLCA2KSwgLy8gKDIsIDAsIDYpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0xLCAxKSwgLy8gKDAsIDEsIDEpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0xLCA0KSwgLy8gKDEsIDEsIDQpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0xLCA3KSk7IC8vICgyLCAxLCA3KQorICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRob3V0UGFnaW5nKCJTRUxFQ1QgaywgYywgdiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIE9SREVSIEJZIGMgREVTQyIpLAorICAgICAgICAgICAgICAgICAgICAgIHJvdygwLCAtMSwgMSksIC8vICgwLCAxLCAxKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCAtMSwgNCksIC8vICgxLCAxLCA0KQorICAgICAgICAgICAgICAgICAgICAgIHJvdygyLCAtMSwgNyksIC8vICgyLCAxLCA3KQorICAgICAgICAgICAgICAgICAgICAgIHJvdygwLCAtMCwgMCksIC8vICgwLCAwLCAwKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCAtMCwgMyksIC8vICgxLCAwLCAzKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygyLCAtMCwgNikpOyAvLyAoMiwgMCwgNikKKworICAgICAgICAvLyBUZXN0IG9yZGVyaW5nIG9mIGNvbHVtbiBzZWxlY3Rpb24gcXVlcmllcyB3aXRoIG1hc2tlZCBjb2x1bW4sIHdpdGhvdXQgc2VsZWN0aW5nIHRoZSBvcmRlcmVkIGNvbHVtbgorICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQoIlNFTEVDVCBrLCB2IEZST00gJXMgV0hFUkUgayBJTiAoMCwgMSwgMikiKSwKKyAgICAgICAgICAgICAgICAgICAgICByb3coMCwgMCksIC8vICgwLCAwLCAwKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygwLCAxKSwgLy8gKDAsIDEsIDEpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIDMpLCAvLyAoMSwgMCwgMykKKyAgICAgICAgICAgICAgICAgICAgICByb3coMSwgNCksIC8vICgxLCAxLCA0KQorICAgICAgICAgICAgICAgICAgICAgIHJvdygyLCA2KSwgLy8gKDIsIDAsIDYpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIDcpKTsgLy8gKDIsIDEsIDcpCisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldFdpdGhvdXRQYWdpbmcoIlNFTEVDVCBrLCB2IEZST00gJXMgV0hFUkUgayBJTiAoMCwgMSwgMikgT1JERVIgQlkgYyBBU0MiKSwKKyAgICAgICAgICAgICAgICAgICAgICByb3coMCwgMCksIC8vICgwLCAwLCAwKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCAzKSwgLy8gKDEsIDAsIDMpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIDYpLCAvLyAoMiwgMCwgNikKKyAgICAgICAgICAgICAgICAgICAgICByb3coMCwgMSksIC8vICgwLCAxLCAxKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCA0KSwgLy8gKDEsIDEsIDQpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIDcpKTsgLy8gKDIsIDEsIDcpCisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldFdpdGhvdXRQYWdpbmcoIlNFTEVDVCBrLCB2IEZST00gJXMgV0hFUkUgayBJTiAoMCwgMSwgMikgT1JERVIgQlkgYyBERVNDIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIDEpLCAvLyAoMCwgMSwgMSkKKyAgICAgICAgICAgICAgICAgICAgICByb3coMSwgNCksIC8vICgxLCAxLCA0KQorICAgICAgICAgICAgICAgICAgICAgIHJvdygyLCA3KSwgLy8gKDIsIDEsIDcpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIDApLCAvLyAoMCwgMCwgMCkKKyAgICAgICAgICAgICAgICAgICAgICByb3coMSwgMyksIC8vICgxLCAwLCAzKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygyLCA2KSk7IC8vICgyLCAwLCA2KQorCisgICAgICAgIC8vIFRlc3Qgb3JkZXJpbmcgb2Ygd2lsZGNhcmQgSlNPTiBxdWVyaWVzIHdpdGggbWFza2VkIGNvbHVtbgorICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQoIlNFTEVDVCBKU09OICogRlJPTSAlcyBXSEVSRSBrIElOICgwLCAxLCAyKSIpLAorICAgICAgICAgICAgICAgICAgICAgIHJvdygie1wia1wiOiAwLCBcImNcIjogMCwgXCJ2XCI6IDB9IiksIC8vICgwLCAwLCAwKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygie1wia1wiOiAwLCBcImNcIjogLTEsIFwidlwiOiAxfSIpLCAvLyAoMCwgMSwgMSkKKyAgICAgICAgICAgICAgICAgICAgICByb3coIntcImtcIjogMSwgXCJjXCI6IDAsIFwidlwiOiAzfSIpLCAvLyAoMSwgMCwgMykKKyAgICAgICAgICAgICAgICAgICAgICByb3coIntcImtcIjogMSwgXCJjXCI6IC0xLCBcInZcIjogNH0iKSwgLy8gKDEsIDEsIDQpCisgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrXCI6IDIsIFwiY1wiOiAwLCBcInZcIjogNn0iKSwgLy8gKDIsIDAsIDYpCisgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrXCI6IDIsIFwiY1wiOiAtMSwgXCJ2XCI6IDd9IikpOyAvLyAoMiwgMSwgNykKKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0V2l0aG91dFBhZ2luZygiU0VMRUNUIEpTT04gKiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIE9SREVSIEJZIGMgQVNDIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrXCI6IDAsIFwiY1wiOiAwLCBcInZcIjogMH0iKSwgLy8gKDAsIDAsIDApCisgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrXCI6IDEsIFwiY1wiOiAwLCBcInZcIjogM30iKSwgLy8gKDEsIDAsIDMpCisgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrXCI6IDIsIFwiY1wiOiAwLCBcInZcIjogNn0iKSwgLy8gKDIsIDAsIDYpCisgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrXCI6IDAsIFwiY1wiOiAtMSwgXCJ2XCI6IDF9IiksIC8vICgwLCAxLCAxKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygie1wia1wiOiAxLCBcImNcIjogLTEsIFwidlwiOiA0fSIpLCAvLyAoMSwgMSwgNCkKKyAgICAgICAgICAgICAgICAgICAgICByb3coIntcImtcIjogMiwgXCJjXCI6IC0xLCBcInZcIjogN30iKSk7IC8vICgyLCAxLCA3KQorICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRob3V0UGFnaW5nKCJTRUxFQ1QgSlNPTiAqIEZST00gJXMgV0hFUkUgayBJTiAoMCwgMSwgMikgT1JERVIgQlkgYyBERVNDIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrXCI6IDAsIFwiY1wiOiAtMSwgXCJ2XCI6IDF9IiksIC8vICgwLCAxLCAxKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygie1wia1wiOiAxLCBcImNcIjogLTEsIFwidlwiOiA0fSIpLCAvLyAoMSwgMSwgNCkKKyAgICAgICAgICAgICAgICAgICAgICByb3coIntcImtcIjogMiwgXCJjXCI6IC0xLCBcInZcIjogN30iKSwgLy8gKDIsIDEsIDcpCisgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrXCI6IDAsIFwiY1wiOiAwLCBcInZcIjogMH0iKSwgLy8gKDAsIDAsIDApCisgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrXCI6IDEsIFwiY1wiOiAwLCBcInZcIjogM30iKSwgLy8gKDEsIDAsIDMpCisgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrXCI6IDIsIFwiY1wiOiAwLCBcInZcIjogNn0iKSk7IC8vICgyLCAwLCA2KQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZUZsYWcoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICAvLyB2ZXJpZnkgdGhhdCB3ZSBjYW5ub3QgY3JlYXRlIHRhYmxlcyB3aXRoIG1hc2tlZCBjb2x1bW5zIGlmIERETSBpcyBkaXNhYmxlZAorICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0RHluYW1pY0RhdGFNYXNraW5nRW5hYmxlZChmYWxzZSk7CisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoRElTQUJMRURfRVJST1JfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIFRBQkxFIHQgKGsgaW50IFBSSU1BUlkgS0VZLCB2IHRleHQgTUFTS0VEIFdJVEggREVGQVVMVCkiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZShESVNBQkxFRF9FUlJPUl9NRVNTQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgVEFCTEUgdCAoayBpbnQgTUFTS0VEIFdJVEggREVGQVVMVCBQUklNQVJZIEtFWSwgdiB0ZXh0KSIpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKERJU0FCTEVEX0VSUk9SX01FU1NBR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBUQUJMRSB0IChrIGludCwgYyBpbnQgTUFTS0VEIFdJVEggREVGQVVMVCwgdiB0ZXh0LCBQUklNQVJZIEtFWShrLCBjKSkiKTsKKworICAgICAgICAvLyB2ZXJpZnkgdGhhdCB3ZSBjYW5ub3QgbWFzayBhbiBleGlzdGluZyBjb2x1bW4gaWYgRERNIGlzIGRpc2FibGVkCisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50LCBjIGludCwgcyBpbnQgc3RhdGljLCByIGludCwgUFJJTUFSWSBLRVkoaywgYykpIik7CisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoRElTQUJMRURfRVJST1JfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUxURVIgVEFCTEUgJXMgQUxURVIgayBNQVNLRUQgV0lUSCBERUZBVUxUIik7CisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoRElTQUJMRURfRVJST1JfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUxURVIgVEFCTEUgJXMgQUxURVIgYyBNQVNLRUQgV0lUSCBERUZBVUxUIik7CisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoRElTQUJMRURfRVJST1JfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUxURVIgVEFCTEUgJXMgQUxURVIgcyBNQVNLRUQgV0lUSCBERUZBVUxUIik7CisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoRElTQUJMRURfRVJST1JfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUxURVIgVEFCTEUgJXMgQUxURVIgciBNQVNLRUQgV0lUSCBERUZBVUxUIik7CisKKyAgICAgICAgLy8gZW5hYmxlIERETSBhbmQgYWRkIHNvbWUgbWFza2VkIGRhdGEKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldER5bmFtaWNEYXRhTWFza2luZ0VuYWJsZWQodHJ1ZSk7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIGsgTUFTS0VEIFdJVEggREVGQVVMVCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBjIE1BU0tFRCBXSVRIIERFRkFVTFQiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgcyBNQVNLRUQgV0lUSCBERUZBVUxUIik7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIHIgTUFTS0VEIFdJVEggREVGQVVMVCIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYywgcywgcikgVkFMVUVTICgxLCAyLCAzLCA0KSIpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQoIlNFTEVDVCAqIEZST00gJXMiKSwgcm93KDAsIDAsIDAsIDApKTsKKworICAgICAgICAvLyB2ZXJpZnkgdGhhdCBjb2x1bW4gbWFza3MgYXJlIG5vdCBhcHBsaWVkIGlmIERETSBpcyBkaXNhYmxlZAorICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0RHluYW1pY0RhdGFNYXNraW5nRW5hYmxlZChmYWxzZSk7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldCgiU0VMRUNUICogRlJPTSAlcyIpLCByb3coMSwgMiwgMywgNCkpOworCisgICAgICAgIC8vIHZlcmlmeSB0aGF0IHdlIGNhbiBkcm9wIGNvbHVtbiBtYXNrcyBldmVuIGlmIERETSBpcyBkaXNhYmxlZAorICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBrIERST1AgTUFTS0VEIik7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIGMgRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgcyBEUk9QIE1BU0tFRCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiByIERST1AgTUFTS0VEIik7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXREeW5hbWljRGF0YU1hc2tpbmdFbmFibGVkKHRydWUpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQoIlNFTEVDVCAqIEZST00gJXMiKSwgcm93KDEsIDIsIDMsIDQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Um93c1dpdGhQYWdpbmcoU3RyaW5nIHF1ZXJ5LCBPYmplY3RbXS4uLiByb3dzKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgcGFnZVNpemUgOiBBcnJheXMuYXNMaXN0KDEsIDIsIDMsIDQsIDUsIDEwMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldFdpdGhQYWdpbmcocXVlcnksIHBhZ2VTaXplKSwgcm93cyk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGxpbWl0IDogQXJyYXlzLmFzTGlzdCgxLCAyLCAzLCA0LCA1LCAxMDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldFdpdGhQYWdpbmcocXVlcnkgKyAiIExJTUlUICIgKyBsaW1pdCwgcGFnZVNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmNvcHlPZlJhbmdlKHJvd3MsIDAsIE1hdGgubWluKGxpbWl0LCByb3dzLmxlbmd0aCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZ1bmN0aW9uRmFjdG9yeSBORUdBVElWRSA9IG5ldyBGdW5jdGlvbkZhY3RvcnkoIm1hc2tfbmVnYXRpdmUiLCBGdW5jdGlvblBhcmFtZXRlci5maXhlZChDUUwzVHlwZS5OYXRpdmUuSU5UKSkKKyAgICB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgTmF0aXZlRnVuY3Rpb24gZG9HZXRPckNyZWF0ZUZ1bmN0aW9uKExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBhcmdUeXBlcywgQWJzdHJhY3RUeXBlPD8+IHJlY2VpdmVyVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXNraW5nRnVuY3Rpb24obmFtZSwgYXJnVHlwZXMuZ2V0KDApLCBhcmdUeXBlcy5nZXQoMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIE1hc2tlciBtYXNrZXIoQnl0ZUJ1ZmZlci4uLiBwYXJhbWV0ZXJzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJiIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIHZhbHVlID0gSW50MzJUeXBlLmluc3RhbmNlLmNvbXBvc2UoYmIpICogLTE7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW50MzJUeXBlLmluc3RhbmNlLmRlY29tcG9zZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgIH07Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrVGVzdGVyLmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrVGVzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNmOGIwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tUZXN0ZXIuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNvbHVtbklkZW50aWZpZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5VbnR5cGVkUmVzdWx0U2V0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLlNjYWxhckZ1bmN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuUmV2ZXJzZWRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUtleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFLZXlzcGFjZVRhYmxlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVXNlckZ1bmN0aW9uczsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIFRlc3RzIHRhYmxlIGNvbHVtbnMgd2l0aCBhdHRhY2hlZCBkeW5hbWljIGRhdGEgbWFza2luZyBmdW5jdGlvbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBDb2x1bW5NYXNrVGVzdGVyIGV4dGVuZHMgQ1FMVGVzdGVyCit7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUk5BTUUgPSAiZGRtX3VzZXIiOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEID0gImRkbV9wYXNzd29yZCI7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKQorICAgIHsKKyAgICAgICAgQ1FMVGVzdGVyLnNldFVwQ2xhc3MoKTsKKyAgICAgICAgcmVxdWlyZUF1dGhlbnRpY2F0aW9uKCk7CisgICAgICAgIHJlcXVpcmVOZXR3b3JrKCk7CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIGJlZm9yZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXREeW5hbWljRGF0YU1hc2tpbmdFbmFibGVkKHRydWUpOworICAgICAgICB1c2VTdXBlclVzZXIoKTsKKyAgICAgICAgZXhlY3V0ZU5ldChmb3JtYXQoIkNSRUFURSBVU0VSIElGIE5PVCBFWElTVFMgJXMgV0lUSCBQQVNTV09SRCAnJXMnIiwgVVNFUk5BTUUsIFBBU1NXT1JEKSk7CisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJHUkFOVCBBTEwgT04gS0VZU1BBQ0UgJXMgVE8gJXMiLCBLRVlTUEFDRSwgVVNFUk5BTUUpKTsKKyAgICAgICAgZXhlY3V0ZU5ldChmb3JtYXQoIlJFVk9LRSBVTk1BU0sgT04gS0VZU1BBQ0UgJXMgRlJPTSAlcyIsIEtFWVNQQUNFLCBVU0VSTkFNRSkpOworICAgICAgICB1c2VVc2VyKFVTRVJOQU1FLCBQQVNTV09SRCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTm90TWFza2VkKFN0cmluZy4uLiBjb2x1bW5zKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBmb3IgKFN0cmluZyBjb2x1bW4gOiBjb2x1bW5zKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRDb2x1bW5Jc05vdE1hc2tlZChjdXJyZW50VGFibGUoKSwgY29sdW1uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFZpZXdDb2x1bW5zQXJlTm90TWFza2VkKFN0cmluZy4uLiBjb2x1bW5zKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBmb3IgKFN0cmluZyBjb2x1bW4gOiBjb2x1bW5zKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRDb2x1bW5Jc05vdE1hc2tlZChjdXJyZW50VmlldygpLCBjb2x1bW4pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Q29sdW1uSXNOb3RNYXNrZWQoU3RyaW5nIHRhYmxlLCBTdHJpbmcgY29sdW1uKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBDb2x1bW5NYXNrIG1hc2sgPSBnZXRDb2x1bW5NYXNrKHRhYmxlLCBjb2x1bW4pOworICAgICAgICBhc3NlcnROdWxsKGZvcm1hdCgiTWFzayBmb3IgY29sdW1uICclcyciLCBjb2x1bW4pLCBtYXNrKTsKKworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoZm9ybWF0KCJTRUxFQ1QgKiBGUk9NICVzLiVzIFdIRVJFIGtleXNwYWNlX25hbWUgPSA/IEFORCB0YWJsZV9uYW1lID0gPyBBTkQgY29sdW1uX25hbWUgPSA/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb25zdGFudHMuU0NIRU1BX0tFWVNQQUNFX05BTUUsIFNjaGVtYUtleXNwYWNlVGFibGVzLkNPTFVNTl9NQVNLUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlTUEFDRSwgdGFibGUsIGNvbHVtbikpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydENvbHVtbklzTWFza2VkKFN0cmluZyB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdW5jdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IHBhcnRpYWxBcmd1bWVudFR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFydGlhbEFyZ3VtZW50VmFsdWVzKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBLZXlzcGFjZU1ldGFkYXRhIGtleXNwYWNlTWV0YWRhdGEgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKS5nZXRNZXRhZGF0YSgpOworICAgICAgICBUYWJsZU1ldGFkYXRhIHRhYmxlTWV0YWRhdGEgPSBrZXlzcGFjZU1ldGFkYXRhLmdldFRhYmxlT3JWaWV3TnVsbGFibGUodGFibGUpOworICAgICAgICBhc3NlcnROb3ROdWxsKHRhYmxlTWV0YWRhdGEpOworICAgICAgICBDb2x1bW5NZXRhZGF0YSBjb2x1bW5NZXRhZGF0YSA9IHRhYmxlTWV0YWRhdGEuZ2V0Q29sdW1uKENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQoY29sdW1uLCBmYWxzZSkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbHVtbk1ldGFkYXRhKTsKKyAgICAgICAgQWJzdHJhY3RUeXBlPD8+IGNvbHVtblR5cGUgPSBjb2x1bW5NZXRhZGF0YS50eXBlOworCisgICAgICAgIC8vIFZlcmlmeSB0aGUgY29sdW1uIG1hc2sgaW4gdGhlIGluLW1lbW9yeSBzY2hlbWEKKyAgICAgICAgQ29sdW1uTWFzayBtYXNrID0gZ2V0Q29sdW1uTWFzayh0YWJsZSwgY29sdW1uKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtYXNrKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYXNrLnBhcnRpYWxBcmd1bWVudFR5cGVzKCkpLmlzRXF1YWxUbyhjb2x1bW5UeXBlLmlzUmV2ZXJzZWQoKSAmJiBmdW5jdGlvbk5hbWUuZXF1YWxzKCJtYXNrX3JlcGxhY2UiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChSZXZlcnNlZFR5cGUuZ2V0SW5zdGFuY2UocGFydGlhbEFyZ3VtZW50VHlwZXMuZ2V0KDApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBhcnRpYWxBcmd1bWVudFR5cGVzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYXNrLnBhcnRpYWxBcmd1bWVudFZhbHVlcygpKS5pc0VxdWFsVG8ocGFydGlhbEFyZ3VtZW50VmFsdWVzKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhlIGZ1bmN0aW9uIGluIHRoZSBjb2x1bW4gbWFzaworICAgICAgICBTY2FsYXJGdW5jdGlvbiBmdW5jdGlvbiA9IG1hc2suZnVuY3Rpb247CisgICAgICAgIGFzc2VydE5vdE51bGwoZnVuY3Rpb24pOworICAgICAgICBhc3NlcnRUaGF0KGZ1bmN0aW9uLm5hbWUoKS5uYW1lKS5pc0VxdWFsVG8oZnVuY3Rpb25OYW1lKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmdW5jdGlvbi5hcmdUeXBlcygpLmdldCgwKS5hc0NRTDNUeXBlKCkpLmlzRXF1YWxUbyhjb2x1bW5NZXRhZGF0YS50eXBlLmFzQ1FMM1R5cGUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZnVuY3Rpb24uYXJnVHlwZXMoKS5zaXplKCkpLmlzRXF1YWxUbyhwYXJ0aWFsQXJndW1lbnRUeXBlcy5zaXplKCkgKyAxKTsKKworICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgcGVyc2lzdGVkIGNvbHVtbiBtZXRhZGF0YQorICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IGNvbHVtblJvd3MgPSBleGVjdXRlKCJTRUxFQ1QgKiBGUk9NIHN5c3RlbV9zY2hlbWEuY29sdW1ucyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0hFUkUga2V5c3BhY2VfbmFtZSA9ID8gQU5EIHRhYmxlX25hbWUgPSA/IEFORCBjb2x1bW5fbmFtZSA9ID8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWVNQQUNFLCB0YWJsZSwgY29sdW1uKTsKKyAgICAgICAgQ29sdW1uTWV0YWRhdGEgcGVyc2lzdGVkQ29sdW1uID0gU2NoZW1hS2V5c3BhY2UuY3JlYXRlQ29sdW1uRnJvbVJvdyhjb2x1bW5Sb3dzLm9uZSgpLCBrZXlzcGFjZU1ldGFkYXRhLnR5cGVzLCBVc2VyRnVuY3Rpb25zLm5vbmUoKSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoZSBjb2x1bW4gbWFzayBpbiB0aGUgcGVyc2lzdGVkIHNjaGVtYQorICAgICAgICBDb2x1bW5NYXNrIHNhdmVkTWFzayA9IHBlcnNpc3RlZENvbHVtbi5nZXRNYXNrKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoc2F2ZWRNYXNrKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYXNrKS5pc0VxdWFsVG8oc2F2ZWRNYXNrKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYXNrLmZ1bmN0aW9uLmFyZ1R5cGVzKCkpLmlzRXF1YWxUbyhzYXZlZE1hc2suZnVuY3Rpb24uYXJnVHlwZXMoKSk7CisgICAgfQorCisgICAgQE51bGxhYmxlCisgICAgcHJvdGVjdGVkIENvbHVtbk1hc2sgZ2V0Q29sdW1uTWFzayhTdHJpbmcgdGFibGUsIFN0cmluZyBjb2x1bW4pCisgICAgeworICAgICAgICBUYWJsZU1ldGFkYXRhIHRhYmxlTWV0YWRhdGEgPSBTY2hlbWEuaW5zdGFuY2UuZ2V0VGFibGVNZXRhZGF0YShLRVlTUEFDRSwgdGFibGUpOworICAgICAgICBhc3NlcnROb3ROdWxsKHRhYmxlTWV0YWRhdGEpOworICAgICAgICBDb2x1bW5NZXRhZGF0YSBjb2x1bW5NZXRhZGF0YSA9IHRhYmxlTWV0YWRhdGEuZ2V0Q29sdW1uKENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQoY29sdW1uLCBmYWxzZSkpOworCisgICAgICAgIGlmIChjb2x1bW5NZXRhZGF0YSA9PSBudWxsKQorICAgICAgICAgICAgZmFpbChmb3JtYXQoIlVua25vd24gY29sdW1uICclcyciLCBjb2x1bW4pKTsKKworICAgICAgICByZXR1cm4gY29sdW1uTWV0YWRhdGEuZ2V0TWFzaygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tXaXRoVHlwZUFsdGVyaW5nRnVuY3Rpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrV2l0aFR5cGVBbHRlcmluZ0Z1bmN0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MzUwYTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrV2l0aFR5cGVBbHRlcmluZ0Z1bmN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGU7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGUuTmF0aXZlLkFTQ0lJOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTDNUeXBlLk5hdGl2ZS5CSUdJTlQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGUuTmF0aXZlLkJMT0I7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGUuTmF0aXZlLklOVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUwzVHlwZS5OYXRpdmUuVEVYVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUwzVHlwZS5OYXRpdmUuVkFSSU5UOworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXRUaHJvd25CeTsKKworLyoqCisgKiB7QGxpbmsgQ29sdW1uTWFza1Rlc3Rlcn0gZm9yIG1hc2tzIHVzaW5nIGZ1bmN0aW9ucyB0aGF0IG1pZ2h0IHJldHVybiB2YWx1ZXMgd2l0aCBhIHR5cGUgZGlmZmVyZW50IHRvIHRoZSB0eXBlIG9mIHRoZQorICogbWFza2VkIGNvbHVtbi4gVGhvc2UgcXVlcmllcyBzaG91bGQgZmFpbC4KKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBDb2x1bW5NYXNrV2l0aFR5cGVBbHRlcmluZ0Z1bmN0aW9uVGVzdCBleHRlbmRzIENvbHVtbk1hc2tUZXN0ZXIKK3sKKyAgICAvKiogVGhlIGNvbHVtbiBtYXNrIGFzIGV4cHJlc3NlZCBpbiBDUUwgc3RhdGVtZW50cyByaWdodCBhZnRlciB0aGUge0Bjb2RlIE1BU0tFRCBXSVRIfSBrZXl3b3Jkcy4gKi8KKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIKKyAgICBwdWJsaWMgU3RyaW5nIG1hc2s7CisKKyAgICAvKiogVGhlIHR5cGUgb2YgdGhlIG1hc2tlZCBjb2x1bW4uICovCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyKDEpCisgICAgcHVibGljIENRTDNUeXBlLk5hdGl2ZSB0eXBlOworCisgICAgLyoqIFRoZSB0eXBlIHJldHVybmVkIGJ5IHRoZSB0ZXN0ZWQgbWFza2luZyBmdW5jdGlvbi4gKi8KKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoMikKKyAgICBwdWJsaWMgQ1FMM1R5cGUgcmV0dXJuZWRUeXBlOworCisgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZFN1Y2NlZWQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JNZXNzYWdlOworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIm1hc2s9ezB9IHR5cGU9ezF9IikKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IG9wdGlvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117CisgICAgICAgIHsgIm1hc2tfZGVmYXVsdCgpIiwgSU5ULCBJTlQgfSwKKyAgICAgICAgeyAibWFza19kZWZhdWx0KCkiLCBURVhULCBURVhUIH0sCisgICAgICAgIHsgIm1hc2tfbnVsbCgpIiwgSU5ULCBJTlQgfSwKKyAgICAgICAgeyAibWFza19udWxsKCkiLCBURVhULCBURVhUIH0sCisgICAgICAgIHsgIm1hc2tfaGFzaCgpIiwgSU5ULCBCTE9CIH0sCisgICAgICAgIHsgIm1hc2tfaGFzaCgnU0hBLTUxMicpIiwgSU5ULCBCTE9CIH0sCisgICAgICAgIHsgIm1hc2tfaW5uZXIoMSwyKSIsIFRFWFQsIFRFWFQgfSwKKyAgICAgICAgeyAibWFza19vdXRlcigxLDIpIiwgVEVYVCwgVEVYVCB9LAorICAgICAgICB7ICJtYXNrX3JlcGxhY2UoMCkiLCBJTlQsIElOVCB9LAorICAgICAgICB7ICJtYXNrX3JlcGxhY2UoMCkiLCBCSUdJTlQsIEJJR0lOVCB9LAorICAgICAgICB7ICJtYXNrX3JlcGxhY2UoMCkiLCBWQVJJTlQsIFZBUklOVCB9LAorICAgICAgICB7ICJtYXNrX3JlcGxhY2UoJ3JlZGFjdGVkJykiLCBBU0NJSSwgQVNDSUkgfSwKKyAgICAgICAgeyAibWFza19yZXBsYWNlKCdyZWRhY3RlZCcpIiwgVEVYVCwgVEVYVCB9IH0pOworICAgIH0KKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cEV4cGVjdGVkUmVzdWx0cygpCisgICAgeworICAgICAgICBzaG91bGRTdWNjZWVkID0gcmV0dXJuZWRUeXBlID09IHR5cGU7CisgICAgICAgIGVycm9yTWVzc2FnZSA9IHNob3VsZFN1Y2NlZWQgPyBudWxsIDogZm9ybWF0KCJNYXNraW5nIGZ1bmN0aW9uICVzIHJldHVybiB0eXBlIGlzICVzLiIsIG1hc2ssIHJldHVybmVkVHlwZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZUFsdGVyaW5nRnVuY3Rpb25PbkNyZWF0ZVRhYmxlKCkKKyAgICB7CisgICAgICAgIHRlc3RPbkNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMuJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB2ICVzIE1BU0tFRCBXSVRIICVzKSIpOworICAgICAgICB0ZXN0T25DcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzLiVzIChrICVzIE1BU0tFRCBXSVRIICVzIFBSSU1BUlkgS0VZLCB2IGludCkiKTsKKyAgICAgICAgdGVzdE9uQ3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcy4lcyAoazEgaW50LCBrMiAlcyBNQVNLRUQgV0lUSCAlcywgUFJJTUFSWSBLRVkoKGsxLCBrMikpKSIpOworICAgICAgICB0ZXN0T25DcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzLiVzIChrIGludCwgYyAlcyBNQVNLRUQgV0lUSCAlcywgUFJJTUFSWSBLRVkoaywgYykpIFdJVEggQ0xVU1RFUklORyBPUkRFUiBCWSAoYyBBU0MpIik7CisgICAgICAgIHRlc3RPbkNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMuJXMgKGsgaW50LCBjICVzIE1BU0tFRCBXSVRIICVzLCBQUklNQVJZIEtFWShrLCBjKSkgV0lUSCBDTFVTVEVSSU5HIE9SREVSIEJZIChjIERFU0MpIik7CisgICAgICAgIHRlc3RPbkNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMuJXMgKGsgaW50LCBjIGludCwgcyAlcyBTVEFUSUMgTUFTS0VEIFdJVEggJXMsIFBSSU1BUlkgS0VZKGssIGMpKSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0T25DcmVhdGVUYWJsZShTdHJpbmcgcXVlcnkpCisgICAgeworICAgICAgICBTdHJpbmcgZm9ybWF0dGVkUXVlcnkgPSBmb3JtYXQocXVlcnksIEtFWVNQQUNFLCBjcmVhdGVUYWJsZU5hbWUoKSwgdHlwZSwgbWFzayk7CisgICAgICAgIGlmIChzaG91bGRTdWNjZWVkKQorICAgICAgICAgICAgY3JlYXRlVGFibGUoZm9ybWF0dGVkUXVlcnkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gZXhlY3V0ZShmb3JtYXR0ZWRRdWVyeSkpLmhhc01lc3NhZ2VDb250YWluaW5nKGVycm9yTWVzc2FnZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZUFsdGVyaW5nRnVuY3Rpb25Pbk1hc2tDb2x1bW4oKQorICAgIHsKKyAgICAgICAgdGVzdE9uQWx0ZXJDb2x1bW4oIkNSRUFURSBUQUJMRSAlcy4lcyAoayBpbnQgUFJJTUFSWSBLRVksIHYgJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkFMVEVSIFRBQkxFICVzLiVzIEFMVEVSIHYgTUFTS0VEIFdJVEggJXMiKTsKKyAgICAgICAgdGVzdE9uQWx0ZXJDb2x1bW4oIkNSRUFURSBUQUJMRSAlcy4lcyAoayAlcyBQUklNQVJZIEtFWSwgdiBpbnQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkFMVEVSIFRBQkxFICVzLiVzIEFMVEVSIGsgTUFTS0VEIFdJVEggJXMiKTsKKyAgICAgICAgdGVzdE9uQWx0ZXJDb2x1bW4oIkNSRUFURSBUQUJMRSAlcy4lcyAoazEgaW50LCBrMiAlcywgUFJJTUFSWSBLRVkoKGsxLCBrMikpKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJBTFRFUiBUQUJMRSAlcy4lcyBBTFRFUiBrMiBNQVNLRUQgV0lUSCAlcyIpOworICAgICAgICB0ZXN0T25BbHRlckNvbHVtbigiQ1JFQVRFIFRBQkxFICVzLiVzIChrIGludCwgYyAlcywgUFJJTUFSWSBLRVkoaywgYykpIFdJVEggQ0xVU1RFUklORyBPUkRFUiBCWSAoYyBBU0MpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkFMVEVSIFRBQkxFICVzLiVzIEFMVEVSIGMgTUFTS0VEIFdJVEggJXMiKTsKKyAgICAgICAgdGVzdE9uQWx0ZXJDb2x1bW4oIkNSRUFURSBUQUJMRSAlcy4lcyAoayBpbnQsIGMgJXMsIFBSSU1BUlkgS0VZKGssIGMpKSBXSVRIIENMVVNURVJJTkcgT1JERVIgQlkgKGMgREVTQykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQUxURVIgVEFCTEUgJXMuJXMgQUxURVIgYyBNQVNLRUQgV0lUSCAlcyIpOworICAgICAgICB0ZXN0T25BbHRlckNvbHVtbigiQ1JFQVRFIFRBQkxFICVzLiVzIChrIGludCwgYyBpbnQsIHMgJXMgU1RBVElDLCBQUklNQVJZIEtFWShrLCBjKSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQUxURVIgVEFCTEUgJXMuJXMgQUxURVIgcyBNQVNLRUQgV0lUSCAlcyIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0T25BbHRlckNvbHVtbihTdHJpbmcgY3JlYXRlUXVlcnksIFN0cmluZyBhbHRlclF1ZXJ5KQorICAgIHsKKyAgICAgICAgU3RyaW5nIHRhYmxlID0gY3JlYXRlVGFibGVOYW1lKCk7CisgICAgICAgIGNyZWF0ZVRhYmxlKGZvcm1hdChjcmVhdGVRdWVyeSwgS0VZU1BBQ0UsIHRhYmxlLCB0eXBlKSk7CisKKyAgICAgICAgU3RyaW5nIGZvcm1hdHRlZFF1ZXJ5ID0gZm9ybWF0KGFsdGVyUXVlcnksIEtFWVNQQUNFLCB0YWJsZSwgbWFzayk7CisgICAgICAgIGlmIChzaG91bGRTdWNjZWVkKQorICAgICAgICAgICAgYWx0ZXJUYWJsZShmb3JtYXR0ZWRRdWVyeSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFzc2VydFRoYXRUaHJvd25CeSgoKSAtPiBleGVjdXRlKGZvcm1hdHRlZFF1ZXJ5KSkuaGFzTWVzc2FnZUNvbnRhaW5pbmcoZXJyb3JNZXNzYWdlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlQWx0ZXJpbmdGdW5jdGlvbk9uQWRkQ29sdW1uKCkKKyAgICB7CisgICAgICAgIFN0cmluZyB0YWJsZSA9IGNyZWF0ZVRhYmxlKGZvcm1hdCgiQ1JFQVRFIFRBQkxFICUlcyAoayBpbnQgUFJJTUFSWSBLRVksIHYgJXMpIiwgdHlwZSkpOworICAgICAgICBTdHJpbmcgcXVlcnkgPSBmb3JtYXQoIkFMVEVSIFRBQkxFICVzLiVzIEFERCBuICVzIE1BU0tFRCBXSVRIICVzIiwgS0VZU1BBQ0UsIHRhYmxlLCB0eXBlLCBtYXNrKTsKKyAgICAgICAgaWYgKHNob3VsZFN1Y2NlZWQpCisgICAgICAgICAgICBhbHRlclRhYmxlKHF1ZXJ5KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IGV4ZWN1dGUocXVlcnkpKS5oYXNNZXNzYWdlQ29udGFpbmluZyhlcnJvck1lc3NhZ2UpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1dpdGhVREZUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrV2l0aFVERlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjI2YTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1dpdGhVREZUZXN0LmphdmEKQEAgLTAsMCArMSwyODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMubWFza2luZzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkJvdW5kU3RhdGVtZW50OworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworCisvKioKKyAqIHtAbGluayBDb2x1bW5NYXNrVGVzdGVyfSBmb3IgY29sdW1uIG1hc2tzIHVzaW5nIGEgVURGLgorICovCitwdWJsaWMgY2xhc3MgQ29sdW1uTWFza1dpdGhVREZUZXN0IGV4dGVuZHMgQ29sdW1uTWFza1Rlc3RlcgoreworICAgIEBUZXN0CisgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VURGKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgLy8gY3JlYXRlIGEgdGFibGUgbWFza2VkIHdpdGggYSBVREYgYW5kIHdpdGggYSBtYXRlcmlhbGl6ZWQgdmlldworICAgICAgICBTdHJpbmcgZnVuY3Rpb24gPSBjcmVhdGVBZGRGdW5jdGlvbigpOworICAgICAgICBjcmVhdGVUYWJsZShmb3JtYXQoIkNSRUFURSBUQUJMRSAlJXMgKGsgaW50LCBjIGludCwgdiBpbnQgTUFTS0VEIFdJVEggJXMoNyksIFBSSU1BUlkgS0VZIChrLCBjKSkiLCBmdW5jdGlvbikpOworICAgICAgICBTdHJpbmcgdmlldyA9IGNyZWF0ZVZpZXcoIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgKiBGUk9NICVzICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldIRVJFIGsgSVMgTk9UIE5VTEwgQU5EIGMgSVMgTk9UIE5VTEwgQU5EIHYgSVMgTk9UIE5VTEwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUFJJTUFSWSBLRVkgKHYsIGssIGMpIik7CisKKyAgICAgICAgLy8gYWRkIHNvbWUgZGF0YQorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYywgdikgVkFMVUVTICgwLCAwLCAxMCkiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGMsIHYpIFZBTFVFUyAoMCwgMSwgMjApIik7CisgICAgICAgIE9iamVjdFtdW10gY2xlYXJSb3dzID0gcm93cyhyb3coMCwgMCwgMTApLCByb3coMCwgMSwgMjApKTsKKyAgICAgICAgT2JqZWN0W11bXSBtYXNrZWRSb3dzID0gcm93cyhyb3coMCwgMCwgMTcpLCByb3coMCwgMSwgMjcpKTsKKyAgICAgICAgd2FpdEZvclZpZXdNdXRhdGlvbnMoKTsKKworICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBzZXNzaW9uTmV0KCk7CisKKyAgICAgICAgLy8gcXVlcnkgdGhlIHRhYmxlIGFuZCB2ZXJpZnkgdGhhdCB0aGUgY29sdW1uIG1hc2sgaXMgYXBwbGllZAorICAgICAgICBTdHJpbmcgdGFibGVRdWVyeSA9ICJTRUxFQ1QgaywgYywgdiBGUk9NICVzIjsKKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KHRhYmxlUXVlcnkpLCBtYXNrZWRSb3dzKTsKKyAgICAgICAgQm91bmRTdGF0ZW1lbnQgdGFibGVQcmVwYXJlZCA9IHNlc3Npb24ucHJlcGFyZShmb3JtYXRRdWVyeSh0YWJsZVF1ZXJ5KSkuYmluZCgpOworICAgICAgICBhc3NlcnRSb3dzTmV0KHNlc3Npb24uZXhlY3V0ZSh0YWJsZVByZXBhcmVkKSwgbWFza2VkUm93cyk7CisKKyAgICAgICAgLy8gcXVlcnkgdGhlIHZpZXcgYW5kIHZlcmlmeSB0aGF0IHRoZSBjb2x1bW4gbWFzayBpcyBhcHBsaWVkCisgICAgICAgIFN0cmluZyB2aWV3UXVlcnkgPSBmb3JtYXQoIlNFTEVDVCBrLCBjLCB2IEZST00gJXMuJXMiLCBLRVlTUEFDRSwgdmlldyk7CisgICAgICAgIEJvdW5kU3RhdGVtZW50IHZpZXdQcmVwYXJlZCA9IHNlc3Npb24ucHJlcGFyZShmb3JtYXRRdWVyeSh0YWJsZVF1ZXJ5KSkuYmluZCgpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQodmlld1F1ZXJ5KSwgbWFza2VkUm93cyk7CisgICAgICAgIGFzc2VydFJvd3NOZXQoc2Vzc2lvbi5leGVjdXRlKHZpZXdQcmVwYXJlZCksIG1hc2tlZFJvd3MpOworCisgICAgICAgIC8vIGRyb3AgdGhlIGNvbHVtbiBtYXNrIGFuZCB2ZXJpZnkgdGhhdCB0aGUgY29sdW1uIGlzIG5vdCBtYXNrZWQgYW55bW9yZQorICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiB2IERST1AgTUFTS0VEIik7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldCh0YWJsZVF1ZXJ5KSwgY2xlYXJSb3dzKTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KHZpZXdRdWVyeSksIGNsZWFyUm93cyk7CisgICAgICAgIGFzc2VydFJvd3NOZXQoc2Vzc2lvbi5leGVjdXRlKHRhYmxlUHJlcGFyZWQpLCBjbGVhclJvd3MpOworICAgICAgICBhc3NlcnRSb3dzTmV0KHNlc3Npb24uZXhlY3V0ZSh2aWV3UHJlcGFyZWQpLCBjbGVhclJvd3MpOworCisgICAgICAgIC8vIG1hc2sgdGhlIGNvbHVtbiBhZ2FpbiwgYnV0IHRoaXMgdGltZSB3aXRoIGEgZGlmZmVyZW50IGFyZ3VtZW50CisgICAgICAgIGFsdGVyVGFibGUoZm9ybWF0KCJBTFRFUiBUQUJMRSAlJXMgQUxURVIgdiBNQVNLRUQgV0lUSCAlcyg4KSIsIGZ1bmN0aW9uKSk7CisgICAgICAgIG1hc2tlZFJvd3MgPSByb3dzKHJvdygwLCAwLCAxOCksIHJvdygwLCAxLCAyOCkpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQodGFibGVRdWVyeSksIG1hc2tlZFJvd3MpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQodmlld1F1ZXJ5KSwgbWFza2VkUm93cyk7CisgICAgICAgIGFzc2VydFJvd3NOZXQoc2Vzc2lvbi5leGVjdXRlKHRhYmxlUHJlcGFyZWQpLCBtYXNrZWRSb3dzKTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChzZXNzaW9uLmV4ZWN1dGUodmlld1ByZXBhcmVkKSwgbWFza2VkUm93cyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VURGV2l0aFJldmVyc2VkKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgLy8gY3JlYXRlIGEgdGFibGUgbWFza2VkIHdpdGggYSBVREYgYW5kIHdpdGggYSBtYXRlcmlhbGl6ZWQgdmlldworICAgICAgICBTdHJpbmcgZnVuY3Rpb24gPSBjcmVhdGVBZGRGdW5jdGlvbigpOworICAgICAgICBjcmVhdGVUYWJsZShmb3JtYXQoIkNSRUFURSBUQUJMRSAlJXMgKGsgaW50LCBjIGludCBNQVNLRUQgV0lUSCAlcygxMDApLCB2IGludCwgUFJJTUFSWSBLRVkgKGssIGMpKSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJXSVRIIENMVVNURVJJTkcgT1JERVIgQlkgKGMgREVTQykiLCBmdW5jdGlvbikpOworICAgICAgICBTdHJpbmcgdmlldyA9IGNyZWF0ZVZpZXcoIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgKiBGUk9NICVzICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldIRVJFIGsgSVMgTk9UIE5VTEwgQU5EIGMgSVMgTk9UIE5VTEwgQU5EIHYgSVMgTk9UIE5VTEwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUFJJTUFSWSBLRVkgKHYsIGMsIEspICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldJVEggQ0xVU1RFUklORyBPUkRFUiBCWSAoYyBERVNDLCBrIEFTQykiKTsKKworICAgICAgICAvLyBhZGQgc29tZSBkYXRhCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDAsIDEsIDApIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDAsIDIsIDApIik7CisgICAgICAgIE9iamVjdFtdW10gY2xlYXJSb3dzID0gcm93cyhyb3coMCwgMiwgMCksIHJvdygwLCAxLCAwKSk7CisgICAgICAgIE9iamVjdFtdW10gbWFza2VkUm93cyA9IHJvd3Mocm93KDAsIDEwMiwgMCksIHJvdygwLCAxMDEsIDApKTsKKyAgICAgICAgd2FpdEZvclZpZXdNdXRhdGlvbnMoKTsKKworICAgICAgICAvLyBxdWVyeSB0aGUgdGFibGUgYW5kIHZlcmlmeSB0aGF0IHRoZSBjb2x1bW4gbWFzayBpcyBhcHBsaWVkCisgICAgICAgIFN0cmluZyB0YWJsZVF1ZXJ5ID0gIlNFTEVDVCBrLCBjLCB2IEZST00gJXMiOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQodGFibGVRdWVyeSksIG1hc2tlZFJvd3MpOworCisgICAgICAgIC8vIHF1ZXJ5IHRoZSB2aWV3IGFuZCB2ZXJpZnkgdGhhdCB0aGUgY29sdW1uIG1hc2sgaXMgYXBwbGllZAorICAgICAgICBTdHJpbmcgdmlld1F1ZXJ5ID0gZm9ybWF0KCJTRUxFQ1QgaywgYywgdiBGUk9NICVzLiVzIiwgS0VZU1BBQ0UsIHZpZXcpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQodmlld1F1ZXJ5KSwgbWFza2VkUm93cyk7CisKKyAgICAgICAgLy8gZHJvcCB0aGUgY29sdW1uIG1hc2sgYW5kIHZlcmlmeSB0aGF0IHRoZSBjb2x1bW4gaXMgbm90IG1hc2tlZCBhbnltb3JlCisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIGMgRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KHRhYmxlUXVlcnkpLCBjbGVhclJvd3MpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQodmlld1F1ZXJ5KSwgY2xlYXJSb3dzKTsKKworICAgICAgICAvLyBtYXNrIHRoZSBjb2x1bW4gYWdhaW4sIGJ1dCB0aGlzIHRpbWUgd2l0aCBhIGRpZmZlcmVudCBhcmd1bWVudAorICAgICAgICBhbHRlclRhYmxlKGZvcm1hdCgiQUxURVIgVEFCTEUgJSVzIEFMVEVSIGMgTUFTS0VEIFdJVEggJXMoMTAwMCkiLCBmdW5jdGlvbikpOworICAgICAgICBtYXNrZWRSb3dzID0gcm93cyhyb3coMCwgMTAwMiwgMCksIHJvdygwLCAxMDAxLCAwKSk7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldCh0YWJsZVF1ZXJ5KSwgbWFza2VkUm93cyk7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldCh2aWV3UXVlcnkpLCBtYXNrZWRSb3dzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZmllcyB0aGF0IHF1ZXJpZXMgZHJvcHBpbmcgYSBVREYgdGhhdCBpcyB1c2VkIGZvciBtYXNraW5nIGNvbHVtbnMgYXJlIHJlamVjdGVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERyb3BVREZXaXRoRGVwZW5kZW50TWFza3MoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBTdHJpbmcgZnVuY3Rpb24gPSBjcmVhdGVBZGRGdW5jdGlvbigpOworICAgICAgICBTdHJpbmcgbWFzayA9IGZvcm1hdCgiTUFTS0VEIFdJVEggJXMoNykiLCBmdW5jdGlvbik7CisgICAgICAgIFN0cmluZyB0YWJsZTEgPSBjcmVhdGVUYWJsZShmb3JtYXQoIkNSRUFURSBUQUJMRSAlJXMgKGsgaW50ICVzIFBSSU1BUlkgS0VZLCB2IGludCAlPHMpIiwgbWFzaykpOworICAgICAgICBTdHJpbmcgdGFibGUyID0gY3JlYXRlVGFibGUoZm9ybWF0KCJDUkVBVEUgVEFCTEUgJSVzIChrIGludCAlcywgYyBpbnQgJTxzLCB2IGludCAlPHMsIHMgaW50IHN0YXRpYyAlPHMsIFBSSU1BUlkgS0VZIChrLCBjKSkiLCBtYXNrKSk7CisKKyAgICAgICAgU3RyaW5nIGRyb3BGdW5jdGlvblF1ZXJ5ID0gZm9ybWF0KCJEUk9QIEZVTkNUSU9OICVzIiwgZnVuY3Rpb24pOworCisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gZm9ybWF0KCJGdW5jdGlvbiAnJXMnIGlzIHN0aWxsIHJlZmVyZW5jZWQgYnkgY29sdW1uIG1hc2tzIGluIHRhYmxlcyAlcywgJXMiLCBmdW5jdGlvbiwgdGFibGUxLCB0YWJsZTIpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKG1lc3NhZ2UsIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLCBkcm9wRnVuY3Rpb25RdWVyeSk7CisKKyAgICAgICAgYWx0ZXJUYWJsZShmb3JtYXQoIkFMVEVSIFRBQkxFICVzLiVzIEFMVEVSIGsgRFJPUCBNQVNLRUQiLCBLRVlTUEFDRSwgdGFibGUxKSk7CisgICAgICAgIGFsdGVyVGFibGUoZm9ybWF0KCJBTFRFUiBUQUJMRSAlcy4lcyBBTFRFUiBrIERST1AgTUFTS0VEIiwgS0VZU1BBQ0UsIHRhYmxlMikpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKG1lc3NhZ2UsIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLCBkcm9wRnVuY3Rpb25RdWVyeSk7CisKKyAgICAgICAgYWx0ZXJUYWJsZShmb3JtYXQoIkFMVEVSIFRBQkxFICVzLiVzIEFMVEVSIHYgRFJPUCBNQVNLRUQiLCBLRVlTUEFDRSwgdGFibGUxKSk7CisgICAgICAgIGFsdGVyVGFibGUoZm9ybWF0KCJBTFRFUiBUQUJMRSAlcy4lcyBBTFRFUiB2IERST1AgTUFTS0VEIiwgS0VZU1BBQ0UsIHRhYmxlMikpOworICAgICAgICBtZXNzYWdlID0gZm9ybWF0KCJGdW5jdGlvbiAnJXMnIGlzIHN0aWxsIHJlZmVyZW5jZWQgYnkgY29sdW1uIG1hc2tzIGluIHRhYmxlcyAlcyIsIGZ1bmN0aW9uLCB0YWJsZTIpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKG1lc3NhZ2UsIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLCBkcm9wRnVuY3Rpb25RdWVyeSk7CisKKyAgICAgICAgYWx0ZXJUYWJsZShmb3JtYXQoIkFMVEVSIFRBQkxFICVzLiVzIEFMVEVSIGMgRFJPUCBNQVNLRUQiLCBLRVlTUEFDRSwgdGFibGUyKSk7CisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UobWVzc2FnZSwgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsIGRyb3BGdW5jdGlvblF1ZXJ5KTsKKworICAgICAgICBhbHRlclRhYmxlKGZvcm1hdCgiQUxURVIgVEFCTEUgJXMuJXMgQUxURVIgcyBEUk9QIE1BU0tFRCIsIEtFWVNQQUNFLCB0YWJsZTIpKTsKKyAgICAgICAgc2NoZW1hQ2hhbmdlKGRyb3BGdW5jdGlvblF1ZXJ5KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nVURGKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0TWFza2luZ0ZhaWxzKCJVbmFibGUgdG8gZmluZCBtYXNraW5nIGZ1bmN0aW9uIGZvciB2LCBubyBkZWNsYXJlZCBmdW5jdGlvbiBtYXRjaGVzIHRoZSBzaWduYXR1cmUgJXMoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWlzc2luZ191ZGYiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVREZXaXRoTm9Bcmd1bWVudHMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRNYXNraW5nRmFpbHMoIkludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiBjYWxsIHRvIGZ1bmN0aW9uICVzOiAwIHJlcXVpcmVkIGJ1dCAxIHByb3ZpZGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OICVzICgpICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNBTExFRCBPTiBOVUxMIElOUFVUICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgaW50ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmEgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3JldHVybiA0MjsnIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVERldpdGhXcm9uZ0FyZ3VtZW50Q291bnQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRNYXNraW5nRmFpbHMoIkludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiBjYWxsIHRvIGZ1bmN0aW9uICVzOiAyIHJlcXVpcmVkIGJ1dCAzIHByb3ZpZGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUFkZEZ1bmN0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDEsIDMpIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VURGV2l0aFdyb25nQXJndW1lbnRUeXBlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0TWFza2luZ0ZhaWxzKCJUeXBlIGVycm9yOiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgYmUgcGFzc2VkIGFzIGFyZ3VtZW50IDAgb2YgZnVuY3Rpb24gJXMgb2YgdHlwZSB0ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBGVU5DVElPTiAlcyAoYSB0ZXh0KSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDQUxMRUQgT04gTlVMTCBJTlBVVCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIHRleHQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAncmV0dXJuIFwicmVkYWN0ZWRcIjsnIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVERldpdGhXcm9uZ1JldHVyblR5cGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRNYXNraW5nRmFpbHMoIk1hc2tpbmcgZnVuY3Rpb24gJXMoKSByZXR1cm4gdHlwZSBpcyB0ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OICVzIChhIGludCkgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0FMTEVEIE9OIE5VTEwgSU5QVVQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyB0ZXh0ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmEgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3JldHVybiBcInJlZGFjdGVkXCI7JyIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVREZJbk90aGVyS2V5c3BhY2UoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRNYXNraW5nRmFpbHMoIk1hc2tpbmcgZnVuY3Rpb24gJXMoKSBkb2Vzbid0IGJlbG9uZyB0byB0aGUgc2FtZSBrZXlzcGFjZSBhcyB0aGUgdGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRnVuY3Rpb24oS0VZU1BBQ0VfUEVSX1RFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgRlVOQ1RJT04gJXMgKGlucHV0IGludCkgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0FMTEVEIE9OIE5VTEwgSU5QVVQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBpbnQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAncmV0dXJuIEludGVnZXIudmFsdWVPZihpbnB1dCk7JyIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVREEoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBTdHJpbmcgZlN0YXRlID0gY3JlYXRlQWRkRnVuY3Rpb24oKTsKKyAgICAgICAgU3RyaW5nIGZGaW5hbCA9IGNyZWF0ZUlkZW50aXR5RnVuY3Rpb24oKTsKKyAgICAgICAgYXNzZXJ0TWFza2luZ0ZhaWxzKCJBZ2dyZWdhdGUgZnVuY3Rpb24gJXMoKSBjYW5ub3QgYmUgdXNlZCBmb3IgbWFza2luZyB0YWJsZSBjb2x1bW5zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUFnZ3JlZ2F0ZShLRVlTUEFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEFHR1JFR0FURSAlcyhpbnQpICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTRlVOQyAiICsgc2hvcnRGdW5jdGlvbk5hbWUoZlN0YXRlKSArICIgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNUWVBFIGludCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRklOQUxGVU5DICIgKyBzaG9ydEZ1bmN0aW9uTmFtZShmRmluYWwpICsgIiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5JVENPTkQgNDIiKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydE1hc2tpbmdGYWlscyhTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGZ1bmN0aW9uKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRNYXNraW5nRmFpbHMobWVzc2FnZSwgZnVuY3Rpb24sICIoKSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRNYXNraW5nRmFpbHMoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBmdW5jdGlvbiwgU3RyaW5nIGFyZ3VtZW50cykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgbWVzc2FnZSA9IGZvcm1hdChtZXNzYWdlLCBmdW5jdGlvbik7CisKKyAgICAgICAgLy8gY3JlYXRlIHRhYmxlIHNob3VsZCBmYWlsCisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IGV4ZWN1dGUoZm9ybWF0KCJDUkVBVEUgVEFCTEUgJXMuJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB2IGludCBNQVNLRUQgV0lUSCAlcyVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWVNQQUNFLCBjcmVhdGVUYWJsZU5hbWUoKSwgZnVuY3Rpb24sIGFyZ3VtZW50cykpKQorICAgICAgICAgICAgICAgICAgLmlzSW5zdGFuY2VPZihJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcykKKyAgICAgICAgICAgICAgICAgIC5oYXNNZXNzYWdlQ29udGFpbmluZyhtZXNzYWdlKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjdXJyZW50VGFibGVNZXRhZGF0YSgpKTsKKworICAgICAgICAvLyBhbHRlciB0YWJsZSBzaG91bGQgZmFpbAorICAgICAgICBTdHJpbmcgdGFibGUgPSBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdiBpbnQpIik7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IGV4ZWN1dGUoZm9ybWF0KCJBTFRFUiBUQUJMRSAlcy4lcyBBTFRFUiB2IE1BU0tFRCBXSVRIICVzJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlTUEFDRSwgdGFibGUsIGZ1bmN0aW9uLCBhcmd1bWVudHMpKSkKKyAgICAgICAgICAgICAgICAgIC5pc0luc3RhbmNlT2YoSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MpCisgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcobWVzc2FnZSk7CisgICAgICAgIGFzc2VydENvbHVtbklzTm90TWFza2VkKHRhYmxlLCAidiIpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZUFkZEZ1bmN0aW9uKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludCwgaW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgRlVOQ1RJT04gJXMgKGEgaW50LCBiIGludCkgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0FMTEVEIE9OIE5VTEwgSU5QVVQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBpbnQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAncmV0dXJuIEludGVnZXIudmFsdWVPZihhKSArIEludGVnZXIudmFsdWVPZihiKTsnIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlSWRlbnRpdHlGdW5jdGlvbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHJldHVybiBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQsIGludCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OICVzIChhIGludCkgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0FMTEVEIE9OIE5VTEwgSU5QVVQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBpbnQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAncmV0dXJuIGE7JyIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0RlZmF1bHRNYXNraW5nRnVuY3Rpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9EZWZhdWx0TWFza2luZ0Z1bmN0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZTRhYjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9EZWZhdWx0TWFza2luZ0Z1bmN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMubWFza2luZzsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGU7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CisKKy8qKgorICogVGVzdHMgZm9yIHtAbGluayBEZWZhdWx0TWFza2luZ0Z1bmN0aW9ufS4KKyAqLworcHVibGljIGNsYXNzIERlZmF1bHRNYXNraW5nRnVuY3Rpb25UZXN0IGV4dGVuZHMgTWFza2luZ0Z1bmN0aW9uVGVzdGVyCit7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVzdE1hc2tpbmdPbkNvbHVtbihTdHJpbmcgbmFtZSwgQ1FMM1R5cGUgdHlwZSwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoZm9ybWF0KCJTRUxFQ1QgbWFza19kZWZhdWx0KCVzKSBGUk9NICUlcyIsIG5hbWUpKSwKKyAgICAgICAgICAgICAgICAgICByb3codHlwZS5nZXRUeXBlKCkuZ2V0TWFza2VkVmFsdWUoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0hhc2hNYXNraW5nRnVuY3Rpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9IYXNoTWFza2luZ0Z1bmN0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZmU3NTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9IYXNoTWFza2luZ0Z1bmN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMubWFza2luZzsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5Db2x1bW5EZWZpbml0aW9uczsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuRGF0YVR5cGU7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlJlc3VsdFNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTDNUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKKworLyoqCisgKiBUZXN0cyBmb3Ige0BsaW5rIEhhc2hNYXNraW5nRnVuY3Rpb259LgorICovCitwdWJsaWMgY2xhc3MgSGFzaE1hc2tpbmdGdW5jdGlvblRlc3QgZXh0ZW5kcyBNYXNraW5nRnVuY3Rpb25UZXN0ZXIKK3sKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKQorICAgIHsKKyAgICAgICAgcmVxdWlyZU5ldHdvcmsoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0TWFza2luZ09uQ29sdW1uKFN0cmluZyBuYW1lLCBDUUwzVHlwZSB0eXBlLCBPYmplY3QgdmFsdWUpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIEJ5dGVCdWZmZXIgc2VyaWFsaXplZFZhbHVlID0gc2VyaWFsaXplZFZhbHVlKHR5cGUsIHZhbHVlKTsKKworICAgICAgICAvLyB3aXRoIGRlZmF1bHQgYWxnb3JpdGhtCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShmb3JtYXQoIlNFTEVDVCBtYXNrX2hhc2goJXMpIEZST00gJSVzIiwgbmFtZSkpLAorICAgICAgICAgICAgICAgICAgIHJvdyhIYXNoTWFza2luZ0Z1bmN0aW9uLmhhc2goSGFzaE1hc2tpbmdGdW5jdGlvbi5tZXNzYWdlRGlnZXN0KEhhc2hNYXNraW5nRnVuY3Rpb24uREVGQVVMVF9BTEdPUklUSE0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFZhbHVlKSkpOworCisgICAgICAgIC8vIHdpdGggbnVsbCBhbGdvcml0aG0KKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKGZvcm1hdCgiU0VMRUNUIG1hc2tfaGFzaCglcywgbnVsbCkgRlJPTSAlJXMiLCBuYW1lKSksCisgICAgICAgICAgICAgICAgICAgcm93KEhhc2hNYXNraW5nRnVuY3Rpb24uaGFzaChIYXNoTWFza2luZ0Z1bmN0aW9uLm1lc3NhZ2VEaWdlc3QoSGFzaE1hc2tpbmdGdW5jdGlvbi5ERUZBVUxUX0FMR09SSVRITSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkVmFsdWUpKSk7CisKKyAgICAgICAgLy8gd2l0aCBtYW51YWxseSBzcGVjaWZpZWQgYWxnb3JpdGhtCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShmb3JtYXQoIlNFTEVDVCBtYXNrX2hhc2goJXMsICdTSEEtNTEyJykgRlJPTSAlJXMiLCBuYW1lKSksCisgICAgICAgICAgICAgICAgICAgcm93KEhhc2hNYXNraW5nRnVuY3Rpb24uaGFzaChIYXNoTWFza2luZ0Z1bmN0aW9uLm1lc3NhZ2VEaWdlc3QoIlNIQS01MTIiKSwgc2VyaWFsaXplZFZhbHVlKSkpOworCisgICAgICAgIC8vIHdpdGggbm90IGZvdW5kIEFTQ0lJIGFsZ29yaXRobQorICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKCJIYXNoIGFsZ29yaXRobSBub3QgZm91bmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiU0VMRUNUIG1hc2tfaGFzaCglcywgJ3Vua25vd24tYWxnb3JpdGhtJykgRlJPTSAlJXMiLCBuYW1lKSk7CisKKyAgICAgICAgLy8gd2l0aCBub3QgZm91bmQgVVRGLTggYWxnb3JpdGhtCisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoIkhhc2ggYWxnb3JpdGhtIG5vdCBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJTRUxFQ1QgbWFza19oYXNoKCVzLCAnw6HDqcOtw7PDuicpIEZST00gJSVzIiwgbmFtZSkpOworCisgICAgICAgIC8vIHRlc3QgcmVzdWx0IHNldCBtZXRhZGF0YSwgaXQgc2hvdWxkIGFsd2F5cyBiZSBvZiB0eXBlIGJsb2IKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gZXhlY3V0ZU5ldChmb3JtYXQoIlNFTEVDVCBtYXNrX2hhc2goJXMpIEZST00gJSVzIiwgbmFtZSkpOworICAgICAgICBDb2x1bW5EZWZpbml0aW9ucyBkZWZpbml0aW9ucyA9IHJzLmdldENvbHVtbkRlZmluaXRpb25zKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgZGVmaW5pdGlvbnMuc2l6ZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhEYXRhVHlwZS5ibG9iKCksIGRlZmluaXRpb25zLmdldFR5cGUoMCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZvcm1hdCgiJXMubWFza19oYXNoKCVzKSIsIFNjaGVtYUNvbnN0YW50cy5TWVNURU1fS0VZU1BBQ0VfTkFNRSwgbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbnMuZ2V0TmFtZSgwKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBCeXRlQnVmZmVyIHNlcmlhbGl6ZWRWYWx1ZShDUUwzVHlwZSB0eXBlLCBPYmplY3QgdmFsdWUpCisgICAgeworICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eU11bHRpQ2VsbCh0eXBlLCB2YWx1ZSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICByZXR1cm4gbWFrZUJ5dGVCdWZmZXIodmFsdWUsIHR5cGUuZ2V0VHlwZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9NYXNraW5nRnVuY3Rpb25UZXN0ZXIuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL01hc2tpbmdGdW5jdGlvblRlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NWYyYzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9NYXNraW5nRnVuY3Rpb25UZXN0ZXIuamF2YQpAQCAtMCwwICsxLDI4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUwzVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkR1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQ29sbGVjdGlvblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnQzMlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5MaXN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLk1hcFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5TZXRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVHVwbGVUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Vc2VyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLlNpbXBsZURhdGVTZXJpYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworCisvKioKKyAqIEFic3RyYWN0IGNsYXNzIGZvciB0ZXN0aW5nIGEgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIE1hc2tpbmdGdW5jdGlvbn0uCisgKiA8cD4KKyAqIEl0IHRlc3RzIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgZnVuY3Rpb24gYXMgZGVmaW5lZCBieSB7QGxpbmsgI3Rlc3RNYXNraW5nT25Db2x1bW4oU3RyaW5nLCBDUUwzVHlwZSwgT2JqZWN0KX0KKyAqIG9uIGFsbCBDUUwgZGF0YSB0eXBlcyBvbiBhbGwgdGhlIHBvc3NpYmxlIHBvc2l0aW9ucyBhbGxvd2VkIGZvciB0aGF0IHR5cGUgKHByaW1hcnkga2V5LCByZWd1bGFyIGFuZCBzdGF0aWMgY29sdW1ucykuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNYXNraW5nRnVuY3Rpb25UZXN0ZXIgZXh0ZW5kcyBDUUxUZXN0ZXIKK3sKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGUgbmF0aXZlIG1hc2tpbmcgZnVuY3Rpb24gZm9yIGFsbCBDUUwgbmF0aXZlIGRhdGEgdHlwZXMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFza2luZ09uTmF0aXZlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgZm9yIChDUUwzVHlwZS5OYXRpdmUgdHlwZSA6IENRTDNUeXBlLk5hdGl2ZS52YWx1ZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh0eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgRU1QVFk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09VTlRFUjoKKyAgICAgICAgICAgICAgICAgICAgdGVzdE1hc2tpbmdPbkNvdW50ZXJDb2x1bW4oMEwsIC0xTCwgMUwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRFWFQ6CisgICAgICAgICAgICAgICAgY2FzZSBBU0NJSToKKyAgICAgICAgICAgICAgICBjYXNlIFZBUkNIQVI6CisgICAgICAgICAgICAgICAgICAgIHRlc3RNYXNraW5nT25BbGxDb2x1bW5zKHR5cGUsICJjb25maWRlbnRpYWwiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCT09MRUFOOgorICAgICAgICAgICAgICAgICAgICB0ZXN0TWFza2luZ09uQWxsQ29sdW1ucyh0eXBlLCB0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVElOWUlOVDoKKyAgICAgICAgICAgICAgICAgICAgdGVzdE1hc2tpbmdPbkFsbENvbHVtbnModHlwZSwgKGJ5dGUpIDAsIChieXRlKSAyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTTUFMTElOVDoKKyAgICAgICAgICAgICAgICAgICAgdGVzdE1hc2tpbmdPbkFsbENvbHVtbnModHlwZSwgKHNob3J0KSAwLCAoc2hvcnQpIDIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElOVDoKKyAgICAgICAgICAgICAgICAgICAgdGVzdE1hc2tpbmdPbkFsbENvbHVtbnModHlwZSwgMiwgSW50ZWdlci5NSU5fVkFMVUUsIEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCSUdJTlQ6CisgICAgICAgICAgICAgICAgICAgIHRlc3RNYXNraW5nT25BbGxDb2x1bW5zKHR5cGUsIDJMLCBMb25nLk1JTl9WQUxVRSwgTG9uZy5NQVhfVkFMVUUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICAgICAgICAgICAgICB0ZXN0TWFza2luZ09uQWxsQ29sdW1ucyh0eXBlLCAyLjNmLCBGbG9hdC5NSU5fVkFMVUUsIEZsb2F0Lk1BWF9WQUxVRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgICAgICAgICAgICAgICB0ZXN0TWFza2luZ09uQWxsQ29sdW1ucyh0eXBlLCAyLjNkLCBEb3VibGUuTUlOX1ZBTFVFLCBEb3VibGUuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBWQVJJTlQ6CisgICAgICAgICAgICAgICAgICAgIHRlc3RNYXNraW5nT25BbGxDb2x1bW5zKHR5cGUsIEJpZ0ludGVnZXIudmFsdWVPZigtMSksIEJpZ0ludGVnZXIudmFsdWVPZigwKSwgQmlnSW50ZWdlci52YWx1ZU9mKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBERUNJTUFMOgorICAgICAgICAgICAgICAgICAgICB0ZXN0TWFza2luZ09uQWxsQ29sdW1ucyh0eXBlLCBCaWdEZWNpbWFsLnZhbHVlT2YoMi4zKSwgQmlnRGVjaW1hbC52YWx1ZU9mKDApLCBCaWdEZWNpbWFsLnZhbHVlT2YoLTIuMykpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERBVEU6CisgICAgICAgICAgICAgICAgICAgIHRlc3RNYXNraW5nT25BbGxDb2x1bW5zKHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZURhdGVTZXJpYWxpemVyLnRpbWVJbk1pbGxpc1RvRGF5KDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVEYXRlU2VyaWFsaXplci50aW1lSW5NaWxsaXNUb0RheShMb25nLk1BWF9WQUxVRSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERVUkFUSU9OOgorICAgICAgICAgICAgICAgICAgICB0ZXN0TWFza2luZ09uTm90S2V5Q29sdW1ucyh0eXBlLCBEdXJhdGlvbi5uZXdJbnN0YW5jZSgxLCAyLCAzKSwgRHVyYXRpb24ubmV3SW5zdGFuY2UoMywgMiwgMSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRJTUU6CisgICAgICAgICAgICAgICAgICAgIHRlc3RNYXNraW5nT25BbGxDb2x1bW5zKENRTDNUeXBlLk5hdGl2ZS5USU1FLCAyTCwgKGxvbmcpIEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUSU1FU1RBTVA6CisgICAgICAgICAgICAgICAgICAgIHRlc3RNYXNraW5nT25BbGxDb2x1bW5zKENRTDNUeXBlLk5hdGl2ZS5USU1FU1RBTVAsIG5ldyBEYXRlKDIpLCBuZXcgRGF0ZShJbnRlZ2VyLk1BWF9WQUxVRSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFVVSUQ6CisgICAgICAgICAgICAgICAgICAgIHRlc3RNYXNraW5nT25BbGxDb2x1bW5zKHR5cGUsIFVVSUQucmFuZG9tVVVJRCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUSU1FVVVJRDoKKyAgICAgICAgICAgICAgICAgICAgdGVzdE1hc2tpbmdPbkFsbENvbHVtbnModHlwZSwgVGltZVVVSUQubWluQXRVbml4TWlsbGlzKDIpLCBUaW1lVVVJRC5taW5BdFVuaXhNaWxsaXMoTG9uZy5NQVhfVkFMVUUpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJTkVUOgorICAgICAgICAgICAgICAgICAgICB0ZXN0TWFza2luZ09uQWxsQ29sdW1ucyh0eXBlLCBuZXcgSW5ldFNvY2tldEFkZHJlc3MoMCkuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCTE9COgorICAgICAgICAgICAgICAgICAgICB0ZXN0TWFza2luZ09uQWxsQ29sdW1ucyh0eXBlLCBVVEY4VHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoImNvbmZpZGVudGlhbCIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJUeXBlICIgKyB0eXBlICsgIiBzaG91bGQgYmUgdGVzdGVkIGZvciBtYXNraW5nIGZ1bmN0aW9ucyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIG5hdGl2ZSBtYXNraW5nIGZ1bmN0aW9uIGZvciBjb2xsZWN0aW9ucy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXNraW5nT25Db2xsZWN0aW9uKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgLy8gc2V0CisgICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IG5ldyBPYmplY3RbXXsgc2V0KCksIHNldCgxLCAyLCAzKSB9OworICAgICAgICB0ZXN0TWFza2luZ09uQWxsQ29sdW1ucyhTZXRUeXBlLmdldEluc3RhbmNlKEludDMyVHlwZS5pbnN0YW5jZSwgZmFsc2UpLmFzQ1FMM1R5cGUoKSwgdmFsdWVzKTsKKyAgICAgICAgdGVzdE1hc2tpbmdPbk5vdEtleUNvbHVtbnMoU2V0VHlwZS5nZXRJbnN0YW5jZShJbnQzMlR5cGUuaW5zdGFuY2UsIHRydWUpLmFzQ1FMM1R5cGUoKSwgdmFsdWVzKTsKKworICAgICAgICAvLyBsaXN0CisgICAgICAgIHZhbHVlcyA9IG5ldyBPYmplY3RbXXsgbGlzdCgpLCBsaXN0KDEsIDIsIDMpIH07CisgICAgICAgIHRlc3RNYXNraW5nT25BbGxDb2x1bW5zKExpc3RUeXBlLmdldEluc3RhbmNlKEludDMyVHlwZS5pbnN0YW5jZSwgZmFsc2UpLmFzQ1FMM1R5cGUoKSwgdmFsdWVzKTsKKyAgICAgICAgdGVzdE1hc2tpbmdPbk5vdEtleUNvbHVtbnMoTGlzdFR5cGUuZ2V0SW5zdGFuY2UoSW50MzJUeXBlLmluc3RhbmNlLCB0cnVlKS5hc0NRTDNUeXBlKCksIHZhbHVlcyk7CisKKyAgICAgICAgLy8gbWFwCisgICAgICAgIHZhbHVlcyA9IG5ldyBPYmplY3RbXXsgbWFwKCksIG1hcCgxLCAxMCwgMiwgMjAsIDMsIDMwKSB9OworICAgICAgICB0ZXN0TWFza2luZ09uQWxsQ29sdW1ucyhNYXBUeXBlLmdldEluc3RhbmNlKEludDMyVHlwZS5pbnN0YW5jZSwgSW50MzJUeXBlLmluc3RhbmNlLCBmYWxzZSkuYXNDUUwzVHlwZSgpLCB2YWx1ZXMpOworICAgICAgICB0ZXN0TWFza2luZ09uTm90S2V5Q29sdW1ucyhNYXBUeXBlLmdldEluc3RhbmNlKEludDMyVHlwZS5pbnN0YW5jZSwgSW50MzJUeXBlLmluc3RhbmNlLCB0cnVlKS5hc0NRTDNUeXBlKCksIHZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIG5hdGl2ZSBtYXNraW5nIGZ1bmN0aW9uIGZvciB0dXBsZXMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFza2luZ09uVHVwbGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICB0ZXN0TWFza2luZ09uQWxsQ29sdW1ucyhuZXcgVHVwbGVUeXBlKEltbXV0YWJsZUxpc3Qub2YoSW50MzJUeXBlLmluc3RhbmNlLCBJbnQzMlR5cGUuaW5zdGFuY2UpKS5hc0NRTDNUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlKDEsIDEwKSwgdHVwbGUoMiwgMjApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGUgbmF0aXZlIG1hc2tpbmcgZnVuY3Rpb24gZm9yIFVEVHMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFza2luZ09uVURUKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBjcmVhdGVUeXBlKCJDUkVBVEUgVFlQRSAlcyAoYSBpbnQsIGIgdGV4dCkiKTsKKworICAgICAgICBLZXlzcGFjZU1ldGFkYXRhIGtzID0gU2NoZW1hLmluc3RhbmNlLmdldEtleXNwYWNlTWV0YWRhdGEoa2V5c3BhY2UoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGtzKTsKKworICAgICAgICBVc2VyVHlwZSB1ZHQgPSBrcy50eXBlcy5nZXQoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMobmFtZSkpLm9yRWxzZVRocm93KEFzc2VydGlvbkVycm9yOjpuZXcpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCh1ZHQpOworCisgICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IG5ldyBPYmplY3RbXXsgdXNlclR5cGUoImEiLCAxLCAiYiIsICJBbGljZSIpLCB1c2VyVHlwZSgiYSIsIDIsICJiIiwgIkJvYiIpIH07CisgICAgICAgIHRlc3RNYXNraW5nT25Ob3RLZXlDb2x1bW5zKHVkdC5hc0NRTDNUeXBlKCksIHZhbHVlcyk7CisgICAgICAgIHRlc3RNYXNraW5nT25BbGxDb2x1bW5zKHVkdC5mcmVlemUoKS5hc0NRTDNUeXBlKCksIHZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIG5hdGl2ZSBtYXNraW5nIGZ1bmN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbiB0eXBlIGFuZCB2YWx1ZXMgb24gYWxsIHBvc3NpYmxlIHR5cGVzIG9mIGNvbHVtbi4KKyAgICAgKiBUaGF0IGlzLCB3aGVuIHRoZSBjb2x1bW4gaXMgcGFydCBvZiB0aGUgcHJpbWFyeSBrZXksIG9yIGEgcmVndWxhciBjb2x1bW4sIG9yIGEgc3RhdGljIGNvbHVtbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSB0ZXN0ZWQgY29sdW1uCisgICAgICogQHBhcmFtIHZhbHVlcyB0aGUgdmFsdWVzIG9mIHRoZSB0ZXN0ZWQgY29sdW1uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RNYXNraW5nT25BbGxDb2x1bW5zKENRTDNUeXBlIHR5cGUsIE9iamVjdC4uLiB2YWx1ZXMpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKGZvcm1hdCgiQ1JFQVRFIFRBQkxFICUlcyAocGsgJXMsIGNrICU8cywgcyAlPHMgc3RhdGljLCB2ICU8cywgUFJJTUFSWSBLRVkgKHBrLCBjaykpIiwgdHlwZSkpOworCisgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogdmFsdWVzKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUZXN0IG51bGwgdmFsdWVzCisgICAgICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyhwaywgY2spIFZBTFVFUyAoPywgPykiLCB2YWx1ZSwgdmFsdWUpOworICAgICAgICAgICAgdGVzdE1hc2tpbmdPbkNvbHVtbigicyIsIHR5cGUsIG51bGwpOworICAgICAgICAgICAgdGVzdE1hc2tpbmdPbkNvbHVtbigidiIsIHR5cGUsIG51bGwpOworCisgICAgICAgICAgICAvLyBUZXN0IG5vdC1udWxsIHZhbHVlcworICAgICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMocGssIGNrLCBzLCB2KSBWQUxVRVMgKD8sID8sID8sID8pIiwgdmFsdWUsIHZhbHVlLCB2YWx1ZSwgdmFsdWUpOworICAgICAgICAgICAgdGVzdE1hc2tpbmdPbkNvbHVtbigicGsiLCB0eXBlLCB2YWx1ZSk7CisgICAgICAgICAgICB0ZXN0TWFza2luZ09uQ29sdW1uKCJjayIsIHR5cGUsIHZhbHVlKTsKKyAgICAgICAgICAgIHRlc3RNYXNraW5nT25Db2x1bW4oInMiLCB0eXBlLCB2YWx1ZSk7CisgICAgICAgICAgICB0ZXN0TWFza2luZ09uQ29sdW1uKCJ2IiwgdHlwZSwgdmFsdWUpOworCisgICAgICAgICAgICAvLyBDbGVhbnVwCisgICAgICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBwaz0/IiwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIG5hdGl2ZSBtYXNraW5nIGZ1bmN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbiB0eXBlIGFuZCB2YWx1ZXMgd2hlbiB0aGUgY29sdW1uIGlzbid0IHBhcnQgb2YgdGhlCisgICAgICogcHJpbWFyeSBrZXkuIFRoYXQgaXMsIHdoZW4gdGhlIGNvbHVtbiBpcyBlaXRoZXIgYSByZWd1bGFyIGNvbHVtbiBvciBhIHN0YXRpYyBjb2x1bW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgdGVzdGVkIGNvbHVtbgorICAgICAqIEBwYXJhbSB2YWx1ZXMgdGhlIHZhbHVlcyBvZiB0aGUgdGVzdGVkIGNvbHVtbgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0ZXN0TWFza2luZ09uTm90S2V5Q29sdW1ucyhDUUwzVHlwZSB0eXBlLCBPYmplY3QuLi4gdmFsdWVzKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZShmb3JtYXQoIkNSRUFURSBUQUJMRSAlJXMgKHBrIGludCwgY2sgaW50LCBzICVzIHN0YXRpYywgdiAlPHMsIFBSSU1BUlkgS0VZIChwaywgY2spKSIsIHR5cGUpKTsKKworICAgICAgICAvLyBUZXN0IG51bGwgdmFsdWVzCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzKHBrLCBjaykgVkFMVUVTICgwLCAwKSIpOworICAgICAgICB0ZXN0TWFza2luZ09uQ29sdW1uKCJzIiwgdHlwZSwgbnVsbCk7CisgICAgICAgIHRlc3RNYXNraW5nT25Db2x1bW4oInYiLCB0eXBlLCBudWxsKTsKKworICAgICAgICAvLyBUZXN0IG5vdC1udWxsIHZhbHVlcworICAgICAgICBmb3IgKE9iamVjdCB2YWx1ZSA6IHZhbHVlcykKKyAgICAgICAgeworICAgICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMocGssIGNrLCBzLCB2KSBWQUxVRVMgKDAsIDAsID8sID8pIiwgdmFsdWUsIHZhbHVlKTsKKyAgICAgICAgICAgIHRlc3RNYXNraW5nT25Db2x1bW4oInMiLCB0eXBlLCB2YWx1ZSk7CisgICAgICAgICAgICB0ZXN0TWFza2luZ09uQ29sdW1uKCJ2IiwgdHlwZSwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIG5hdGl2ZSBtYXNraW5nIGZ1bmN0aW9uIG9uIHRoZSBzcGVjaWZpZWQgY291bnRlciBjb2x1bW4gdmFsdWVzIGluIGFsbCB0aGUgcG9zaXRpb25zIHdoZXJlIGl0IGNhbiBhcHBlYXIuCisgICAgICogVGhhdCBpcywgd2hlbiB0aGUgY291bnRlciBjb2x1bW4gaXMgZWl0aGVyIGEgcmVndWxhciBjb2x1bW4gb3IgYSBzdGF0aWMgY29sdW1uLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlcyB0aGUgdmFsdWVzIG9mIHRoZSB0ZXN0ZWQgY291bnRlciBjb2x1bW4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdGVzdE1hc2tpbmdPbkNvdW50ZXJDb2x1bW4oT2JqZWN0Li4uIHZhbHVlcykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjayBpbnQsIHMgY291bnRlciBzdGF0aWMsIHYgY291bnRlciwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogdmFsdWVzKQorICAgICAgICB7CisgICAgICAgICAgICBleGVjdXRlKCJVUERBVEUgJXMgU0VUIHYgPSB2ICsgPywgcyA9IHMgKyA/IFdIRVJFIHBrID0gMCBBTkQgY2sgPSAwIiwgdmFsdWUsIHZhbHVlKTsKKyAgICAgICAgICAgIHRlc3RNYXNraW5nT25Db2x1bW4oInMiLCBDUUwzVHlwZS5OYXRpdmUuQ09VTlRFUiwgdmFsdWUpOworICAgICAgICAgICAgdGVzdE1hc2tpbmdPbkNvbHVtbigidiIsIENRTDNUeXBlLk5hdGl2ZS5DT1VOVEVSLCB2YWx1ZSk7CisgICAgICAgICAgICBleGVjdXRlKCJUUlVOQ0FURSAlcyIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIG5hdGl2ZSBtYXNraW5nIGZ1bmN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbiB0eXBlIGFuZCB2YWx1ZS4KKyAgICAgKiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgdGFibGUgaXMgYWxyZWFkeSBjcmVhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHRlc3RlZCBjb2x1bW4KKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgdGVzdGVkIGNvbHVtbgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHRlc3RlZCBjb2x1bW4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB0ZXN0TWFza2luZ09uQ29sdW1uKFN0cmluZyBuYW1lLCBDUUwzVHlwZSB0eXBlLCBPYmplY3QgdmFsdWUpIHRocm93cyBUaHJvd2FibGU7CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc051bGxPckVtcHR5TXVsdGlDZWxsKENRTDNUeXBlIHR5cGUsIE9iamVjdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgQWJzdHJhY3RUeXBlPD8+IGRhdGFUeXBlID0gdHlwZS5nZXRUeXBlKCk7CisgICAgICAgIGlmIChkYXRhVHlwZS5pc011bHRpQ2VsbCgpICYmIGRhdGFUeXBlLmlzQ29sbGVjdGlvbigpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKCgoQ29sbGVjdGlvblR5cGU8Pz4pIGRhdGFUeXBlKS5raW5kID09IENvbGxlY3Rpb25UeXBlLktpbmQuTUFQKQorICAgICAgICAgICAgICAgICAgID8gKChNYXA8PywgPz4pIHZhbHVlKS5pc0VtcHR5KCkKKyAgICAgICAgICAgICAgICAgICA6ICgoQ29sbGVjdGlvbjw/PikgdmFsdWUpLmlzRW1wdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9OdWxsTWFza2luZ0Z1bmN0aW9uVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvTnVsbE1hc2tpbmdGdW5jdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGY3M2ViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvTnVsbE1hc2tpbmdGdW5jdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmc7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTDNUeXBlOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworCisvKioKKyAqIFRlc3RzIGZvciB7QGxpbmsgTnVsbE1hc2tpbmdGdW5jdGlvbn0uCisgKi8KK3B1YmxpYyBjbGFzcyBOdWxsTWFza2luZ0Z1bmN0aW9uVGVzdCBleHRlbmRzIE1hc2tpbmdGdW5jdGlvblRlc3RlcgoreworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlc3RNYXNraW5nT25Db2x1bW4oU3RyaW5nIG5hbWUsIENRTDNUeXBlIHR5cGUsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKGZvcm1hdCgiU0VMRUNUIG1hc2tfbnVsbCglcykgRlJPTSAlJXMiLCBuYW1lKSksCisgICAgICAgICAgICAgICAgICAgcm93KChPYmplY3QpIG51bGwpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9QYXJ0aWFsTWFza2luZ0Z1bmN0aW9uVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvUGFydGlhbE1hc2tpbmdGdW5jdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWY3NWE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvUGFydGlhbE1hc2tpbmdGdW5jdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5Db2x1bW5EZWZpbml0aW9uczsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuRGF0YVR5cGU7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlJlc3VsdFNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTDNUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuU3RyaW5nVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHM7CitpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKKworLyoqCisgKiBUZXN0cyBmb3Ige0BsaW5rIFBhcnRpYWxNYXNraW5nRnVuY3Rpb259LgorICovCitwdWJsaWMgY2xhc3MgUGFydGlhbE1hc2tpbmdGdW5jdGlvblRlc3QgZXh0ZW5kcyBNYXNraW5nRnVuY3Rpb25UZXN0ZXIKK3sKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0TWFza2luZ09uQ29sdW1uKFN0cmluZyBuYW1lLCBDUUwzVHlwZSB0eXBlLCBPYmplY3QgdmFsdWUpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRlc3RNYXNraW5nT25Db2x1bW4oUGFydGlhbE1hc2tpbmdGdW5jdGlvbi5UeXBlLklOTkVSLCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgICAgIHRlc3RNYXNraW5nT25Db2x1bW4oUGFydGlhbE1hc2tpbmdGdW5jdGlvbi5UeXBlLk9VVEVSLCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdGVzdE1hc2tpbmdPbkNvbHVtbihQYXJ0aWFsTWFza2luZ0Z1bmN0aW9uLlR5cGUgbWFza2VyLCBTdHJpbmcgbmFtZSwgQ1FMM1R5cGUgdHlwZSwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBTdHJpbmcgZnVuY3Rpb25OYW1lID0gU2NoZW1hQ29uc3RhbnRzLlNZU1RFTV9LRVlTUEFDRV9OQU1FICsgIi5tYXNrXyIgKyBtYXNrZXIubmFtZSgpLnRvTG93ZXJDYXNlKCk7CisKKyAgICAgICAgaWYgKHR5cGUuZ2V0VHlwZSgpIGluc3RhbmNlb2YgU3RyaW5nVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nVHlwZSBzdHJpbmdUeXBlID0gKFN0cmluZ1R5cGUpIHR5cGUuZ2V0VHlwZSgpOworICAgICAgICAgICAgU3RyaW5nIHN0cmluZ1ZhbHVlID0gKFN0cmluZykgdmFsdWU7CisKKyAgICAgICAgICAgIC8vIC4uLiB3aXRoIGRlZmF1bHQgcGFkZGluZworICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKGZvcm1hdCgiU0VMRUNUICVzKCVzLCAxLCAyKSBGUk9NICUlcyIsIGZ1bmN0aW9uTmFtZSwgbmFtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICByb3cobWFza2VyLm1hc2soc3RyaW5nVmFsdWUsIDEsIDIsIFBhcnRpYWxNYXNraW5nRnVuY3Rpb24uREVGQVVMVF9QQURESU5HX0NIQVIpKSk7CisKKyAgICAgICAgICAgIC8vIC4uLiB3aXRoIG1hbnVhbGx5IHNwZWNpZmllZCBBU0NJSSBwYWRkaW5nCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoZm9ybWF0KCJTRUxFQ1QgJXMoJXMsIDEsIDIsICcjJykgRlJPTSAlJXMiLCBmdW5jdGlvbk5hbWUsIG5hbWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcm93KG1hc2tlci5tYXNrKHN0cmluZ1ZhbHVlLCAxLCAyLCAnIycpKSk7CisKKyAgICAgICAgICAgIC8vIC4uLiB3aXRoIG1hbnVhbGx5IHNwZWNpZmllZCBVVEYtOCBwYWRkaW5nCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoZm9ybWF0KCJTRUxFQ1QgJXMoKHRleHQpICVzLCAxLCAyLCAnw6knKSBGUk9NICUlcyIsIGZ1bmN0aW9uTmFtZSwgbmFtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICByb3cobWFza2VyLm1hc2soc3RyaW5nVmFsdWUsIDEsIDIsICfDqScpKSk7CisKKyAgICAgICAgICAgIC8vIC4uLiB3aXRoIG5vdCBzaW5nbGUtY2hhcmFjdGVyIHBhZGRpbmcKKyAgICAgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoInNob3VsZCBiZSBzaW5nbGUtY2hhcmFjdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiU0VMRUNUICVzKCVzLCAxLCAyLCAndG9vX2xvbmcnKSBGUk9NICUlcyIsIGZ1bmN0aW9uTmFtZSwgbmFtZSkpOworCisgICAgICAgICAgICAvLyAuLi4gd2l0aCBudWxsIHBhZGRpbmcKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShmb3JtYXQoIlNFTEVDVCAlcyglcywgMSwgMiwgbnVsbCkgRlJPTSAlJXMiLCBmdW5jdGlvbk5hbWUsIG5hbWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcm93KG1hc2tlci5tYXNrKHN0cmluZ1ZhbHVlLCAxLCAyLCBQYXJ0aWFsTWFza2luZ0Z1bmN0aW9uLkRFRkFVTFRfUEFERElOR19DSEFSKSkpOworCisgICAgICAgICAgICAvLyAuLi4gd2l0aCBudWxsIGJlZ2luCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoZm9ybWF0KCJTRUxFQ1QgJXMoJXMsIG51bGwsIDIpIEZST00gJSVzIiwgZnVuY3Rpb25OYW1lLCBuYW1lKSksCisgICAgICAgICAgICAgICAgICAgICAgIHJvdyhtYXNrZXIubWFzayhzdHJpbmdWYWx1ZSwgMCwgMiwgUGFydGlhbE1hc2tpbmdGdW5jdGlvbi5ERUZBVUxUX1BBRERJTkdfQ0hBUikpKTsKKworICAgICAgICAgICAgLy8gLi4uIHdpdGggbnVsbCBlbmQKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShmb3JtYXQoIlNFTEVDVCAlcyglcywgMSwgbnVsbCkgRlJPTSAlJXMiLCBmdW5jdGlvbk5hbWUsIG5hbWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcm93KG1hc2tlci5tYXNrKHN0cmluZ1ZhbHVlLCAxLCAwLCBQYXJ0aWFsTWFza2luZ0Z1bmN0aW9uLkRFRkFVTFRfUEFERElOR19DSEFSKSkpOworCisgICAgICAgICAgICAvLyB0ZXN0IHJlc3VsdCBzZXQgbWV0YWRhdGEsIGl0IHNob3VsZCBhbHdheXMgYmUgb2YgdHlwZSB0ZXh0LCByZWdhcmRsZXNzIG9mIHRoZSB0eXBlIG9mIHRoZSBjb2x1bW4KKyAgICAgICAgICAgIFJlc3VsdFNldCBycyA9IGV4ZWN1dGVOZXQoZm9ybWF0KCJTRUxFQ1QgJXMoJXMsIDEsIDIpIEZST00gJSVzIiwgZnVuY3Rpb25OYW1lLCBuYW1lKSk7CisgICAgICAgICAgICBDb2x1bW5EZWZpbml0aW9ucyBkZWZpbml0aW9ucyA9IHJzLmdldENvbHVtbkRlZmluaXRpb25zKCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGRlZmluaXRpb25zLnNpemUoKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGRyaXZlckRhdGFUeXBlKHN0cmluZ1R5cGUpLCBkZWZpbml0aW9ucy5nZXRUeXBlKDApKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZm9ybWF0KCIlcyglcywgMSwgMikiLCBmdW5jdGlvbk5hbWUsIG5hbWUpLCBkZWZpbml0aW9ucy5nZXROYW1lKDApKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoZm9ybWF0KCJGdW5jdGlvbiAlcyByZXF1aXJlcyBhbiBhcmd1bWVudCBvZiB0eXBlIFt0ZXh0fHZhcmNoYXJ8YXNjaWldLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgZm91bmQgYXJndW1lbnQgJXMgb2YgdHlwZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbk5hbWUsIG5hbWUsIHR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJTRUxFQ1QgJXMoJXMsIDEsIDIpIEZST00gJSVzIiwgZnVuY3Rpb25OYW1lLCBuYW1lKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBEYXRhVHlwZSBkcml2ZXJEYXRhVHlwZShTdHJpbmdUeXBlIHR5cGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKChDUUwzVHlwZS5OYXRpdmUpIHR5cGUuYXNDUUwzVHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEFTQ0lJOgorICAgICAgICAgICAgICAgIHJldHVybiBEYXRhVHlwZS5hc2NpaSgpOworICAgICAgICAgICAgY2FzZSBWQVJDSEFSOgorICAgICAgICAgICAgICAgIHJldHVybiBEYXRhVHlwZS52YXJjaGFyKCk7CisgICAgICAgICAgICBjYXNlIFRFWFQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIERhdGFUeXBlLnRleHQoKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXNraW5nKCkKKyAgICB7CisgICAgICAgIC8vIG51bGwgdmFsdWUKKyAgICAgICAgdGVzdE1hc2tpbmcobnVsbCwgMCwgMCwgJyonLCBudWxsLCBudWxsKTsKKyAgICAgICAgdGVzdE1hc2tpbmcobnVsbCwgOSwgOSwgJyonLCBudWxsLCBudWxsKTsKKyAgICAgICAgdGVzdE1hc2tpbmcobnVsbCwgMCwgMCwgJyMnLCBudWxsLCBudWxsKTsKKyAgICAgICAgdGVzdE1hc2tpbmcobnVsbCwgOSwgOSwgJyMnLCBudWxsLCBudWxsKTsKKworICAgICAgICAvLyBlbXB0eSB2YWx1ZQorICAgICAgICB0ZXN0TWFza2luZygiIiwgMCwgMCwgJyonLCAiIiwgIiIpOworICAgICAgICB0ZXN0TWFza2luZygiIiwgOSwgOSwgJyonLCAiIiwgIiIpOworICAgICAgICB0ZXN0TWFza2luZygiIiwgMCwgMCwgJyMnLCAiIiwgIiIpOworICAgICAgICB0ZXN0TWFza2luZygiIiwgOSwgOSwgJyMnLCAiIiwgIiIpOworCisgICAgICAgIC8vIHNpbmdsZS1jaGFyIHZhbHVlCisgICAgICAgIHRlc3RNYXNraW5nKCJhIiwgMCwgMCwgJyonLCAiKiIsICJhIik7CisgICAgICAgIHRlc3RNYXNraW5nKCJhIiwgMSwgMSwgJyonLCAiYSIsICIqIik7CisgICAgICAgIHRlc3RNYXNraW5nKCJhIiwgMTAsIDEwLCAnKicsICJhIiwgIioiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImEiLCAwLCAwLCAnIycsICIjIiwgImEiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImEiLCAxLCAxLCAnIycsICJhIiwgIiMiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImEiLCAxMCwgMTAsICcjJywgImEiLCAiIyIpOworCisgICAgICAgIC8vIHJlZ3VsYXIgdmFsdWUKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMCwgMCwgJyonLCAiKioqKioiLCAiYWJjZGUiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMCwgMSwgJyonLCAiKioqKmUiLCAiYWJjZCoiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMCwgMiwgJyonLCAiKioqZGUiLCAiYWJjKioiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMCwgMywgJyonLCAiKipjZGUiLCAiYWIqKioiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMCwgNCwgJyonLCAiKmJjZGUiLCAiYSoqKioiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMCwgNSwgJyonLCAiYWJjZGUiLCAiKioqKioiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMCwgNiwgJyonLCAiYWJjZGUiLCAiKioqKioiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMSwgMCwgJyonLCAiYSoqKioiLCAiKmJjZGUiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMiwgMCwgJyonLCAiYWIqKioiLCAiKipjZGUiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMywgMCwgJyonLCAiYWJjKioiLCAiKioqZGUiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgNCwgMCwgJyonLCAiYWJjZCoiLCAiKioqKmUiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgNSwgMCwgJyonLCAiYWJjZGUiLCAiKioqKioiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgNiwgMCwgJyonLCAiYWJjZGUiLCAiKioqKioiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMSwgMSwgJyonLCAiYSoqKmUiLCAiKmJjZCoiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMiwgMiwgJyonLCAiYWIqZGUiLCAiKipjKioiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMywgMywgJyonLCAiYWJjZGUiLCAiKioqKioiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgNCwgNCwgJyonLCAiYWJjZGUiLCAiKioqKioiKTsKKworICAgICAgICAvLyBzcGVjaWFsIGNoYXJhY3RlcnMKKyAgICAgICAgdGVzdE1hc2tpbmcoIsOhI8Otw7LDvCIsIDAsIDAsICcqJywgIioqKioqIiwgIsOhI8Otw7LDvCIpOworICAgICAgICB0ZXN0TWFza2luZygiw6Ejw63DssO8IiwgMSwgMSwgJyonLCAiw6EqKirDvCIsICIqI8Otw7IqIik7CisgICAgICAgIHRlc3RNYXNraW5nKCLDoSPDrcOyw7wiLCA1LCA1LCAnKicsICLDoSPDrcOyw7wiLCAiKioqKioiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3RNYXNraW5nKFN0cmluZyB1bm1hc2tlZFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcGFkZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbm5lck1hc2tlZFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG91dGVyTWFza2VkVmFsdWUpCisgICAgeworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoUGFydGlhbE1hc2tpbmdGdW5jdGlvbi5UeXBlLklOTkVSLm1hc2sodW5tYXNrZWRWYWx1ZSwgYmVnaW4sIGVuZCwgcGFkZGluZykpCisgICAgICAgICAgICAgICAgICAuaXNJbihpbm5lck1hc2tlZFZhbHVlKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KFBhcnRpYWxNYXNraW5nRnVuY3Rpb24uVHlwZS5PVVRFUi5tYXNrKHVubWFza2VkVmFsdWUsIGJlZ2luLCBlbmQsIHBhZGRpbmcpKQorICAgICAgICAgICAgICAgICAgLmlzSW4ob3V0ZXJNYXNrZWRWYWx1ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvUmVwbGFjZU1hc2tpbmdGdW5jdGlvblRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL1JlcGxhY2VNYXNraW5nRnVuY3Rpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwMTI1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL1JlcGxhY2VNYXNraW5nRnVuY3Rpb25UZXN0LmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKKworLyoqCisgKiBUZXN0cyBmb3Ige0BsaW5rIFJlcGxhY2VNYXNraW5nRnVuY3Rpb259LgorICovCitwdWJsaWMgY2xhc3MgUmVwbGFjZU1hc2tpbmdGdW5jdGlvblRlc3QgZXh0ZW5kcyBNYXNraW5nRnVuY3Rpb25UZXN0ZXIKK3sKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0TWFza2luZ09uQ29sdW1uKFN0cmluZyBuYW1lLCBDUUwzVHlwZSB0eXBlLCBPYmplY3QgdmFsdWUpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIC8vIG51bGwgcmVwbGFjZW1lbnQgYXJndW1lbnQKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKGZvcm1hdCgiU0VMRUNUIG1hc2tfcmVwbGFjZSglcywgPykgRlJPTSAlJXMiLCBuYW1lKSwgKE9iamVjdCkgbnVsbCksCisgICAgICAgICAgICAgICAgICAgcm93KChPYmplY3QpIG51bGwpKTsKKworICAgICAgICAvLyBub3QtbnVsbCByZXBsYWNlbWVudCBhcmd1bWVudAorICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdCA9IHR5cGUuZ2V0VHlwZSgpOworICAgICAgICBPYmplY3QgcmVwbGFjZW1lbnRWYWx1ZSA9IHQuY29tcG9zZSh0LmdldE1hc2tlZFZhbHVlKCkpOworICAgICAgICBTdHJpbmcgcXVlcnkgPSBmb3JtYXQoIlNFTEVDVCBtYXNrX3JlcGxhY2UoJXMsID8pIEZST00gJSVzIiwgbmFtZSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShxdWVyeSwgcmVwbGFjZW1lbnRWYWx1ZSksIHJvdyhyZXBsYWNlbWVudFZhbHVlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVdpdGhEaWZmZXJlbnRUeXBlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIHYgdmFyaW50KSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyhrKSBWQUxVRVMgKDApIik7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hc2tfcmVwbGFjZSh2LCAxKSBGUk9NICVzIiksIHJvdyhCaWdJbnRlZ2VyLk9ORSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXNrX3JlcGxhY2UodiwgKGludCkgMSkgRlJPTSAlcyIpLCByb3coQmlnSW50ZWdlci5PTkUpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWFza19yZXBsYWNlKHYsIChiaWdpbnQpIDEpIEZST00gJXMiKSwgcm93KEJpZ0ludGVnZXIuT05FKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hc2tfcmVwbGFjZSh2LCAodmFyaW50KSAxKSBGUk9NICVzIiksIHJvdyhCaWdJbnRlZ2VyLk9ORSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXNrX3JlcGxhY2UodiwgPykgRlJPTSAlcyIsIDEpLCByb3coQmlnSW50ZWdlci5PTkUpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWFza19yZXBsYWNlKHYsID8pIEZST00gJXMiLCAxTCksIHJvdyhCaWdJbnRlZ2VyLk9ORSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXNrX3JlcGxhY2UodiwgPykgRlJPTSAlcyIsIEJpZ0ludGVnZXIuT05FKSwgcm93KEJpZ0ludGVnZXIuT05FKSk7CisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoIlR5cGUgZXJyb3I6IDEuMiBjYW5ub3QgYmUgcGFzc2VkIGFzIGFyZ3VtZW50IDEgb2YgZnVuY3Rpb24gc3lzdGVtLm1hc2tfcmVwbGFjZSBvZiB0eXBlIHZhcmludCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsICJTRUxFQ1QgbWFza19yZXBsYWNlKHYsIDEuMikgRlJPTSAlcyIpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKCJUeXBlIGVycm9yOiAnc2VjcmV0JyBjYW5ub3QgYmUgcGFzc2VkIGFzIGFyZ3VtZW50IDEgb2YgZnVuY3Rpb24gc3lzdGVtLm1hc2tfcmVwbGFjZSBvZiB0eXBlIHZhcmludCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsICJTRUxFQ1QgbWFza19yZXBsYWNlKHYsICdzZWNyZXQnKSBGUk9NICVzIik7CisKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIHYgdmFyY2hhcikiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMoaykgVkFMVUVTICgwKSIpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXNrX3JlcGxhY2UodiwgJ3NlY3JldCcpIEZST00gJXMiKSwgcm93KCJzZWNyZXQiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hc2tfcmVwbGFjZSh2LCAoYXNjaWkpICdzZWNyZXQnKSBGUk9NICVzIiksIHJvdygic2VjcmV0IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXNrX3JlcGxhY2UodiwgKHRleHQpICdzZWNyZXQnKSBGUk9NICVzIiksIHJvdygic2VjcmV0IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXNrX3JlcGxhY2UodiwgKHZhcmNoYXIpICdzZWNyZXQnKSBGUk9NICVzIiksIHJvdygic2VjcmV0IikpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKCJUeXBlIGVycm9yOiAxIGNhbm5vdCBiZSBwYXNzZWQgYXMgYXJndW1lbnQgMSBvZiBmdW5jdGlvbiBzeXN0ZW0ubWFza19yZXBsYWNlIG9mIHR5cGUgdGV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsICJTRUxFQ1QgbWFza19yZXBsYWNlKHYsIDEpIEZST00gJXMiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9TZWxlY3RNYXNrZWRQZXJtaXNzaW9uVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvU2VsZWN0TWFza2VkUGVybWlzc2lvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTYwNmZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvU2VsZWN0TWFza2VkUGVybWlzc2lvblRlc3QuamF2YQpAQCAtMCwwICsxLDM2NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKK2ltcG9ydCBvcmcuYXdhaXRpbGl0eS5jb3JlLlRocm93aW5nUnVubmFibGU7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CisKKy8qKgorICogVGVzdHMgdGhlIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLlBlcm1pc3Npb24jU0VMRUNUX01BU0tFRH0gcGVybWlzc2lvbi4KKyAqLworcHVibGljIGNsYXNzIFNlbGVjdE1hc2tlZFBlcm1pc3Npb25UZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gQ0xFQVJfUk9XID0gcm93KDcsIDcsIDcsIDcpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVIgPSAiZGRtX3VzZXIiOyAvLyB1c2VyIHRoYXQgd2lsbCBoYXZlIHRoZWlyIHBlcm1pc3Npb25zIGNoYW5nZWQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkQgPSAiZGRtX3Bhc3N3b3JkIjsKKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0RHluYW1pY0RhdGFNYXNraW5nRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFBlcm1pc3Npb25zVmFsaWRpdHkoMCk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRSb2xlc1ZhbGlkaXR5KDApOworICAgICAgICBDUUxUZXN0ZXIuc2V0VXBDbGFzcygpOworICAgICAgICByZXF1aXJlQXV0aGVudGljYXRpb24oKTsKKyAgICAgICAgcmVxdWlyZU5ldHdvcmsoKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgYmVmb3JlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgdXNlU3VwZXJVc2VyKCk7CisKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQsIGMgaW50LCBzIGludCBzdGF0aWMsIHYgaW50LCBQUklNQVJZIEtFWSAoaywgYykpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoIklOU0VSVCBJTlRPICVzKGssIGMsIHMsIHYpIFZBTFVFUyAoPywgPywgPywgPykiLCBDTEVBUl9ST1cpOworCisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJDUkVBVEUgVVNFUiBJRiBOT1QgRVhJU1RTICVzIFdJVEggUEFTU1dPUkQgJyVzJyIsIFVTRVIsIFBBU1NXT1JEKSk7CisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJHUkFOVCBTRUxFQ1QgT04gQUxMIEtFWVNQQUNFUyBUTyAlcyIsIFVTRVIpKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCBhZnRlcigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHVzZVN1cGVyVXNlcigpOworICAgICAgICBleGVjdXRlTmV0KCJEUk9QIFVTRVIgSUYgRVhJU1RTICIgKyBVU0VSKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgayBEUk9QIE1BU0tFRCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBjIERST1AgTUFTS0VEIik7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIHMgRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgdiBEUk9QIE1BU0tFRCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcnRpdGlvbktleUNvbHVtbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIGsgTUFTS0VEIFdJVEggREVGQVVMVCIpOworICAgICAgICBPYmplY3RbXSBtYXNrZWRSb3cgPSByb3coMCwgNywgNywgNyk7CisKKyAgICAgICAgLy8gdGVzdCBxdWVyaWVzIHdpdGggZGVmYXVsdCBwZXJtaXNzaW9ucyAobm8gVU5NQVNLIG5vciBTRUxFQ1RfTUFTS0VEKQorICAgICAgICB0ZXN0UGFydGl0aW9uS2V5Q29sdW1uV2l0aERlZmF1bHRQZXJtaXNzaW9ucyhtYXNrZWRSb3cpOworCisgICAgICAgIC8vIHRlc3QgcXVlcmllcyB3aXRoIG9ubHkgU0VMRUNUX01BU0tFRCBwZXJtaXNzaW9uCisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJHUkFOVCBTRUxFQ1RfTUFTS0VEIE9OIEFMTCBLRVlTUEFDRVMgVE8gJXMiLCBVU0VSKSk7CisgICAgICAgIHRlc3RQYXJ0aXRpb25LZXlDb2x1bW5XaXRoT25seVNlbGVjdE1hc2tlZChtYXNrZWRSb3cpOworCisgICAgICAgIC8vIHRlc3QgcXVlcmllcyB3aXRoIG9ubHkgVU5NQVNLIHBlcm1pc3Npb24gKHdoaWNoIGluY2x1ZGVzIFNFTEVDVF9NQVNLRUQpCisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJSRVZPS0UgU0VMRUNUX01BU0tFRCBPTiBBTEwgS0VZU1BBQ0VTIEZST00gJXMiLCBVU0VSKSk7CisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJHUkFOVCBVTk1BU0sgT04gQUxMIEtFWVNQQUNFUyBUTyAlcyIsIFVTRVIpKTsKKyAgICAgICAgdGVzdFBhcnRpdGlvbktleUNvbHVtbldpdGhVbm1hc2soKTsKKworICAgICAgICAvLyB0ZXN0IHF1ZXJpZXMgd2l0aCBib3RoIFVOTUFTSyBhbmQgU0VMRUNUX01BU0tFRCBwZXJtaXNzaW9ucworICAgICAgICBleGVjdXRlTmV0KGZvcm1hdCgiR1JBTlQgVU5NQVNLLCBTRUxFQ1RfTUFTS0VEIE9OIEFMTCBLRVlTUEFDRVMgVE8gJXMiLCBVU0VSKSk7CisgICAgICAgIHRlc3RQYXJ0aXRpb25LZXlDb2x1bW5XaXRoVW5tYXNrKCk7CisKKyAgICAgICAgLy8gdGVzdCBxdWVyaWVzIGFnYWluIHdpdGhvdXQgYm90aCBVTk1BU0sgYW5kIFNFTEVDVF9NQVNLRUQgcGVybWlzc2lvbnMKKyAgICAgICAgZXhlY3V0ZU5ldChmb3JtYXQoIlJFVk9LRSBVTk1BU0ssIFNFTEVDVF9NQVNLRUQgT04gQUxMIEtFWVNQQUNFUyBGUk9NICVzIiwgVVNFUikpOworICAgICAgICB0ZXN0UGFydGl0aW9uS2V5Q29sdW1uV2l0aERlZmF1bHRQZXJtaXNzaW9ucyhtYXNrZWRSb3cpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0UGFydGl0aW9uS2V5Q29sdW1uV2l0aERlZmF1bHRQZXJtaXNzaW9ucyhPYmplY3RbXSBtYXNrZWRSb3cpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFdpdGhVc2VyKCgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYyA9IDcgQUxMT1cgRklMVEVSSU5HIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB2ID0gNyBBTExPVyBGSUxURVJJTkciLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHMgPSA3IEFMTE9XIEZJTFRFUklORyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRVbmF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gNyIsICJba10iKTsKKyAgICAgICAgICAgIGFzc2VydFVuYXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPj0gNyBBTExPVyBGSUxURVJJTkciLCAiW2tdIik7CisgICAgICAgICAgICBhc3NlcnRVbmF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gNyBBTkQgYyA9IDciLCAiW2tdIik7CisgICAgICAgICAgICBhc3NlcnRVbmF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gNyBBTkQgdiA9IDcgQUxMT1cgRklMVEVSSU5HIiwgIltrXSIpOworICAgICAgICAgICAgYXNzZXJ0VW5hdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdG9rZW4oaykgPSB0b2tlbig3KSIsICJba10iKTsKKyAgICAgICAgICAgIGFzc2VydFVuYXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHRva2VuKGspID49IHRva2VuKDcpIiwgIltrXSIpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFBhcnRpdGlvbktleUNvbHVtbldpdGhPbmx5U2VsZWN0TWFza2VkKE9iamVjdFtdIG1hc2tlZFJvdykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0V2l0aFVzZXIoKCkgLT4geworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBjID0gNyBBTExPVyBGSUxURVJJTkciLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHYgPSA3IEFMTE9XIEZJTFRFUklORyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcyA9IDcgQUxMT1cgRklMVEVSSU5HIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gNyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA+PSA3IEFMTE9XIEZJTFRFUklORyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDcgQU5EIGMgPSA3IiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gNyBBTkQgdiA9IDcgQUxMT1cgRklMVEVSSU5HIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB0b2tlbihrKSA9IHRva2VuKDcpIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB0b2tlbihrKSA+PSB0b2tlbig3KSIsIG1hc2tlZFJvdyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0UGFydGl0aW9uS2V5Q29sdW1uV2l0aFVubWFzaygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFdpdGhVc2VyKCgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYyA9IDcgQUxMT1cgRklMVEVSSU5HIiwgQ0xFQVJfUk9XKTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB2ID0gNyBBTExPVyBGSUxURVJJTkciLCBDTEVBUl9ST1cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHMgPSA3IEFMTE9XIEZJTFRFUklORyIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDciLCBDTEVBUl9ST1cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPj0gNyBBTExPVyBGSUxURVJJTkciLCBDTEVBUl9ST1cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPSA3IEFORCBjID0gNyIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDcgQU5EIHYgPSA3IEFMTE9XIEZJTFRFUklORyIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdG9rZW4oaykgPSB0b2tlbig3KSIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdG9rZW4oaykgPj0gdG9rZW4oNykiLCBDTEVBUl9ST1cpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbHVzdGVyaW5nS2V5Q29sdW1uKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgYyBNQVNLRUQgV0lUSCBERUZBVUxUIik7CisgICAgICAgIE9iamVjdFtdIG1hc2tlZFJvdyA9IHJvdyg3LCAwLCA3LCA3KTsKKworICAgICAgICAvLyB0ZXN0IHF1ZXJpZXMgd2l0aCBkZWZhdWx0IHBlcm1pc3Npb25zIChubyBVTk1BU0sgbm9yIFNFTEVDVF9NQVNLRUQpCisgICAgICAgIHRlc3RDbHVzdGVyaW5nS2V5Q29sdW1uV2l0aERlZmF1bHRQZXJtaXNzaW9ucyhtYXNrZWRSb3cpOworCisgICAgICAgIC8vIHRlc3QgcXVlcmllcyB3aXRoIG9ubHkgU0VMRUNUX01BU0tFRCBwZXJtaXNzaW9uCisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJHUkFOVCBTRUxFQ1RfTUFTS0VEIE9OIEFMTCBLRVlTUEFDRVMgVE8gJXMiLCBVU0VSKSk7CisgICAgICAgIHRlc3RDbHVzdGVyaW5nS2V5Q29sdW1uV2l0aE9ubHlTZWxlY3RNYXNrZWQobWFza2VkUm93KTsKKworICAgICAgICAvLyB0ZXN0IHF1ZXJpZXMgd2l0aCBvbmx5IFVOTUFTSyBwZXJtaXNzaW9uICh3aGljaCBpbmNsdWRlcyBTRUxFQ1RfTUFTS0VEKQorICAgICAgICBleGVjdXRlTmV0KGZvcm1hdCgiUkVWT0tFIFNFTEVDVF9NQVNLRUQgT04gQUxMIEtFWVNQQUNFUyBGUk9NICVzIiwgVVNFUikpOworICAgICAgICBleGVjdXRlTmV0KGZvcm1hdCgiR1JBTlQgVU5NQVNLIE9OIEFMTCBLRVlTUEFDRVMgVE8gJXMiLCBVU0VSKSk7CisgICAgICAgIHRlc3RDbHVzdGVyaW5nS2V5Q29sdW1uV2l0aFVubWFzaygpOworCisgICAgICAgIC8vIHRlc3QgcXVlcmllcyB3aXRoIGJvdGggVU5NQVNLIGFuZCBTRUxFQ1RfTUFTS0VEIHBlcm1pc3Npb25zCisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJHUkFOVCBVTk1BU0ssIFNFTEVDVF9NQVNLRUQgT04gQUxMIEtFWVNQQUNFUyBUTyAlcyIsIFVTRVIpKTsKKyAgICAgICAgdGVzdENsdXN0ZXJpbmdLZXlDb2x1bW5XaXRoVW5tYXNrKCk7CisKKyAgICAgICAgLy8gdGVzdCBxdWVyaWVzIGFnYWluIHdpdGhvdXQgYm90aCBVTk1BU0sgYW5kIFNFTEVDVF9NQVNLRUQgcGVybWlzc2lvbnMKKyAgICAgICAgZXhlY3V0ZU5ldChmb3JtYXQoIlJFVk9LRSBVTk1BU0ssIFNFTEVDVF9NQVNLRUQgT04gQUxMIEtFWVNQQUNFUyBGUk9NICVzIiwgVVNFUikpOworICAgICAgICB0ZXN0Q2x1c3RlcmluZ0tleUNvbHVtbldpdGhEZWZhdWx0UGVybWlzc2lvbnMobWFza2VkUm93KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdENsdXN0ZXJpbmdLZXlDb2x1bW5XaXRoRGVmYXVsdFBlcm1pc3Npb25zKE9iamVjdFtdIG1hc2tlZFJvdykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0V2l0aFVzZXIoKCkgLT4geworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gNyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdiA9IDcgQUxMT1cgRklMVEVSSU5HIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBzID0gNyBBTExPVyBGSUxURVJJTkciLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHRva2VuKGspID0gdG9rZW4oNykiLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0VW5hdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYyA9IDcgQUxMT1cgRklMVEVSSU5HIiwgIltjXSIpOworICAgICAgICAgICAgYXNzZXJ0VW5hdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDcgQU5EIGMgPSA3IiwgIltjXSIpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdENsdXN0ZXJpbmdLZXlDb2x1bW5XaXRoT25seVNlbGVjdE1hc2tlZChPYmplY3RbXSBtYXNrZWRSb3cpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFdpdGhVc2VyKCgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDciLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHYgPSA3IEFMTE9XIEZJTFRFUklORyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcyA9IDcgQUxMT1cgRklMVEVSSU5HIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB0b2tlbihrKSA9IHRva2VuKDcpIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBjID0gNyBBTExPVyBGSUxURVJJTkciLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPSA3IEFORCBjID0gNyIsIG1hc2tlZFJvdyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0Q2x1c3RlcmluZ0tleUNvbHVtbldpdGhVbm1hc2soKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRXaXRoVXNlcigoKSAtPiB7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMiLCBDTEVBUl9ST1cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPSA3IiwgQ0xFQVJfUk9XKTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB2ID0gNyBBTExPVyBGSUxURVJJTkciLCBDTEVBUl9ST1cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHMgPSA3IEFMTE9XIEZJTFRFUklORyIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdG9rZW4oaykgPSB0b2tlbig3KSIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYyA9IDcgQUxMT1cgRklMVEVSSU5HIiwgQ0xFQVJfUk9XKTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gNyBBTkQgYyA9IDciLCBDTEVBUl9ST1cpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0aWNDb2x1bW4oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBzIE1BU0tFRCBXSVRIIERFRkFVTFQiKTsKKyAgICAgICAgT2JqZWN0W10gbWFza2VkUm93ID0gcm93KDcsIDcsIDAsIDcpOworCisgICAgICAgIC8vIHRlc3QgcXVlcmllcyB3aXRoIGRlZmF1bHQgcGVybWlzc2lvbnMgKG5vIFVOTUFTSyBub3IgU0VMRUNUX01BU0tFRCkKKyAgICAgICAgdGVzdFN0YXRpY0NvbHVtbldpdGhEZWZhdWx0UGVybWlzc2lvbnMobWFza2VkUm93KTsKKworICAgICAgICAvLyB0ZXN0IHF1ZXJpZXMgd2l0aCBvbmx5IFNFTEVDVF9NQVNLRUQgcGVybWlzc2lvbgorICAgICAgICBleGVjdXRlTmV0KGZvcm1hdCgiR1JBTlQgU0VMRUNUX01BU0tFRCBPTiBBTEwgS0VZU1BBQ0VTIFRPICVzIiwgVVNFUikpOworICAgICAgICB0ZXN0U3RhdGljQ29sdW1uV2l0aE9ubHlTZWxlY3RNYXNrZWQobWFza2VkUm93KTsKKworICAgICAgICAvLyB0ZXN0IHF1ZXJpZXMgd2l0aCBvbmx5IFVOTUFTSyBwZXJtaXNzaW9uICh3aGljaCBpbmNsdWRlcyBTRUxFQ1RfTUFTS0VEKQorICAgICAgICBleGVjdXRlTmV0KGZvcm1hdCgiUkVWT0tFIFNFTEVDVF9NQVNLRUQgT04gQUxMIEtFWVNQQUNFUyBGUk9NICVzIiwgVVNFUikpOworICAgICAgICBleGVjdXRlTmV0KGZvcm1hdCgiR1JBTlQgVU5NQVNLIE9OIEFMTCBLRVlTUEFDRVMgVE8gJXMiLCBVU0VSKSk7CisgICAgICAgIHRlc3RTdGF0aWNDb2x1bW5XaXRoVW5tYXNrKCk7CisKKyAgICAgICAgLy8gdGVzdCBxdWVyaWVzIHdpdGggYm90aCBVTk1BU0sgYW5kIFNFTEVDVF9NQVNLRUQgcGVybWlzc2lvbnMKKyAgICAgICAgZXhlY3V0ZU5ldChmb3JtYXQoIkdSQU5UIFVOTUFTSywgU0VMRUNUX01BU0tFRCBPTiBBTEwgS0VZU1BBQ0VTIFRPICVzIiwgVVNFUikpOworICAgICAgICB0ZXN0U3RhdGljQ29sdW1uV2l0aFVubWFzaygpOworCisgICAgICAgIC8vIHRlc3QgcXVlcmllcyBhZ2FpbiB3aXRob3V0IGJvdGggVU5NQVNLIGFuZCBTRUxFQ1RfTUFTS0VEIHBlcm1pc3Npb25zCisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJSRVZPS0UgVU5NQVNLLCBTRUxFQ1RfTUFTS0VEIE9OIEFMTCBLRVlTUEFDRVMgRlJPTSAlcyIsIFVTRVIpKTsKKyAgICAgICAgdGVzdFN0YXRpY0NvbHVtbldpdGhEZWZhdWx0UGVybWlzc2lvbnMobWFza2VkUm93KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFN0YXRpY0NvbHVtbldpdGhEZWZhdWx0UGVybWlzc2lvbnMoT2JqZWN0W10gbWFza2VkUm93KSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRXaXRoVXNlcigoKSAtPiB7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMiLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHRva2VuKGspID0gdG9rZW4oNykiLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPSA3IiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gNyBBTkQgYyA9IDciLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGMgPSA3IEFMTE9XIEZJTFRFUklORyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdiA9IDcgQUxMT1cgRklMVEVSSU5HIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydFVuYXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHMgPSA3IEFMTE9XIEZJTFRFUklORyIsICJbc10iKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RTdGF0aWNDb2x1bW5XaXRoT25seVNlbGVjdE1hc2tlZChPYmplY3RbXSBtYXNrZWRSb3cpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFdpdGhVc2VyKCgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdG9rZW4oaykgPSB0b2tlbig3KSIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDciLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPSA3IEFORCBjID0gNyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYyA9IDcgQUxMT1cgRklMVEVSSU5HIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBzID0gNyBBTExPVyBGSUxURVJJTkciLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHYgPSA3IEFMTE9XIEZJTFRFUklORyIsIG1hc2tlZFJvdyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0U3RhdGljQ29sdW1uV2l0aFVubWFzaygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFdpdGhVc2VyKCgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdG9rZW4oaykgPSB0b2tlbig3KSIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDciLCBDTEVBUl9ST1cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPSA3IEFORCBjID0gNyIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYyA9IDcgQUxMT1cgRklMVEVSSU5HIiwgQ0xFQVJfUk9XKTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBzID0gNyBBTExPVyBGSUxURVJJTkciLCBDTEVBUl9ST1cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHYgPSA3IEFMTE9XIEZJTFRFUklORyIsIENMRUFSX1JPVyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25zKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgdiBNQVNLRUQgV0lUSCBERUZBVUxUIik7CisgICAgICAgIE9iamVjdFtdIG1hc2tlZFJvdyA9IHJvdyg3LCA3LCA3LCAwKTsKKworICAgICAgICAvLyB0ZXN0IHF1ZXJpZXMgd2l0aCBkZWZhdWx0IHBlcm1pc3Npb25zIChubyBVTk1BU0sgbm9yIFNFTEVDVF9NQVNLRUQpCisgICAgICAgIHRlc3RDb2xsZWN0aW9uc1dpdGhEZWZhdWx0UGVybWlzc2lvbnMobWFza2VkUm93KTsKKworICAgICAgICAvLyB0ZXN0IHF1ZXJpZXMgd2l0aCBvbmx5IFNFTEVDVF9NQVNLRUQgcGVybWlzc2lvbgorICAgICAgICBleGVjdXRlTmV0KGZvcm1hdCgiR1JBTlQgU0VMRUNUX01BU0tFRCBPTiBBTEwgS0VZU1BBQ0VTIFRPICVzIiwgVVNFUikpOworICAgICAgICB0ZXN0Q29sbGVjdGlvbnNXaXRoT25seVNlbGVjdE1hc2tlZChtYXNrZWRSb3cpOworCisgICAgICAgIC8vIHRlc3QgcXVlcmllcyB3aXRoIG9ubHkgVU5NQVNLIHBlcm1pc3Npb24gKHdoaWNoIGluY2x1ZGVzIFNFTEVDVF9NQVNLRUQpCisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJSRVZPS0UgU0VMRUNUX01BU0tFRCBPTiBBTEwgS0VZU1BBQ0VTIEZST00gJXMiLCBVU0VSKSk7CisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJHUkFOVCBVTk1BU0sgT04gQUxMIEtFWVNQQUNFUyBUTyAlcyIsIFVTRVIpKTsKKyAgICAgICAgdGVzdENvbGxlY3Rpb25zV2l0aFVubWFzaygpOworCisgICAgICAgIC8vIHRlc3QgcXVlcmllcyB3aXRoIGJvdGggVU5NQVNLIGFuZCBTRUxFQ1RfTUFTS0VEIHBlcm1pc3Npb25zCisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJHUkFOVCBVTk1BU0ssIFNFTEVDVF9NQVNLRUQgT04gQUxMIEtFWVNQQUNFUyBUTyAlcyIsIFVTRVIpKTsKKyAgICAgICAgdGVzdENvbGxlY3Rpb25zV2l0aFVubWFzaygpOworCisgICAgICAgIC8vIHRlc3QgcXVlcmllcyBhZ2FpbiB3aXRob3V0IGJvdGggVU5NQVNLIGFuZCBTRUxFQ1RfTUFTS0VEIHBlcm1pc3Npb25zCisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJSRVZPS0UgVU5NQVNLLCBTRUxFQ1RfTUFTS0VEIE9OIEFMTCBLRVlTUEFDRVMgRlJPTSAlcyIsIFVTRVIpKTsKKyAgICAgICAgdGVzdENvbGxlY3Rpb25zV2l0aERlZmF1bHRQZXJtaXNzaW9ucyhtYXNrZWRSb3cpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0Q29sbGVjdGlvbnNXaXRoRGVmYXVsdFBlcm1pc3Npb25zKE9iamVjdFtdIG1hc2tlZFJvdykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0V2l0aFVzZXIoKCkgLT4geworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB0b2tlbihrKSA9IHRva2VuKDcpIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gNyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDcgQU5EIGMgPSA3IiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBjID0gNyBBTExPVyBGSUxURVJJTkciLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHMgPSA3IEFMTE9XIEZJTFRFUklORyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRVbmF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB2ID0gNyBBTExPVyBGSUxURVJJTkciLCAiW3ZdIik7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0Q29sbGVjdGlvbnNXaXRoT25seVNlbGVjdE1hc2tlZChPYmplY3RbXSBtYXNrZWRSb3cpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFdpdGhVc2VyKCgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdG9rZW4oaykgPSB0b2tlbig3KSIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDciLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPSA3IEFORCBjID0gNyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYyA9IDcgQUxMT1cgRklMVEVSSU5HIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBzID0gNyBBTExPVyBGSUxURVJJTkciLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHYgPSA3IEFMTE9XIEZJTFRFUklORyIsIG1hc2tlZFJvdyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0Q29sbGVjdGlvbnNXaXRoVW5tYXNrKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0V2l0aFVzZXIoKCkgLT4geworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIiwgQ0xFQVJfUk9XKTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB0b2tlbihrKSA9IHRva2VuKDcpIiwgQ0xFQVJfUk9XKTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gNyIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDcgQU5EIGMgPSA3IiwgQ0xFQVJfUk9XKTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBjID0gNyBBTExPVyBGSUxURVJJTkciLCBDTEVBUl9ST1cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHMgPSA3IEFMTE9XIEZJTFRFUklORyIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdiA9IDcgQUxMT1cgRklMVEVSSU5HIiwgQ0xFQVJfUk9XKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEF1dGhvcml6ZWRRdWVyeShTdHJpbmcgcXVlcnksIE9iamVjdFtdLi4uIHJvd3MpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldChxdWVyeSksIHJvd3MpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRVbmF1dGhvcml6ZWRRdWVyeShTdHJpbmcgcXVlcnksIFN0cmluZyB1bmF1dGhvcml6ZWRDb2x1bW5zKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZU5ldChmb3JtYXQoIlVzZXIgJXMgaGFzIG5vIFVOTUFTSyBub3IgU0VMRUNUX01BU0tFRCBwZXJtaXNzaW9uIG9uIHRhYmxlICVzLiVzLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgcXVlcnkgbWFza2VkIGNvbHVtbnMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFUiwgS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCB1bmF1dGhvcml6ZWRDb2x1bW5zKSwgcXVlcnkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRXaXRoVXNlcihUaHJvd2luZ1J1bm5hYmxlIGFzc2VydGlvbikgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgdXNlVXNlcihVU0VSLCBQQVNTV09SRCk7CisgICAgICAgIGFzc2VydGlvbi5ydW4oKTsKKyAgICAgICAgdXNlU3VwZXJVc2VyKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvVW5tYXNrUGVybWlzc2lvblRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL1VubWFza1Blcm1pc3Npb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExY2RjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL1VubWFza1Blcm1pc3Npb25UZXN0LmphdmEKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMubWFza2luZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworCisvKioKKyAqIFRlc3RzIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5QZXJtaXNzaW9uI1VOTUFTS30gcGVybWlzc2lvbi4KKyAqIDxwPgorICogVGhlIHBlcm1pc3Npb24gaXMgdGVzdGVkIGZvciBhIHJlZ3VsYXIgdXNlciB3aXRoIHRoZSB7QGNvZGUgVU5NQVNLfSBwZXJtaXNzaW9ucyBvbiBkaWZmZXJlbnQgcmVzb3VyY2VzLAorICogd2hpbGUgYWxzbyB2ZXJpZnlpbmcgdGhlIGFic2VuY2Ugb2Ygc2lkZSBlZmZlY3RzIG9uIG90aGVyIG9yZGluYXJ5IHVzZXJzLCBzdXBlcnVzZXJzIGFuZCBpbnRlcm5hbCBxdWVyaWVzLgorICovCitwdWJsaWMgY2xhc3MgVW5tYXNrUGVybWlzc2lvblRlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0tFWVNQQUNFID0gIkNSRUFURSBLRVlTUEFDRSBJRiBOT1QgRVhJU1RTICVzIFdJVEggcmVwbGljYXRpb24gPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJzogJzEnfSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9UQUJMRSA9ICJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAlcy4lcyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihrIGludCwgYyBpbnQsIHYgdGV4dCBNQVNLRUQgV0lUSCBtYXNrX3JlcGxhY2UoJ3JlZGFjdGVkJyksICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUFJJTUFSWSBLRVkgKGssIGMpKSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0VSVCA9ICJJTlNFUlQgSU5UTyAlcy4lcyAoaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9XSUxEQ0FSRCA9ICJTRUxFQ1QgKiBGUk9NICVzLiVzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX0NPTFVNTlMgPSAiU0VMRUNUIGssIGMsIHYgRlJPTSAlcy4lcyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBDTEVBUl9ST1cgPSByb3coMCwgMCwgInNlbnNpdGl2ZSIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIE1BU0tFRF9ST1cgPSByb3coMCwgMCwgInJlZGFjdGVkIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0VfMSA9ICJtYXNrX2tleXNwYWNlXzEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTUEFDRV8yID0gIm1hc2tfa2V5c3BhY2VfMiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFXzEgPSAibWFza190YWJsZV8xIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfMiA9ICJtYXNrX3RhYmxlXzIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVIgPSAiZGRtX3VzZXIiOyAvLyB1c2VyIHRoYXQgd2lsbCBoYXZlIHRoZWlyIHBlcm1pc3Npb25zIGNoYW5nZWQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1RIRVJfVVNFUiA9ICJkZG1fb3JkaW5hcnlfdXNlciI7IC8vIHVzZXIgdGhhdCB3b24ndCBoYXZlIHRoZWlyIHBlcm1pc3Npb25zIGFsdGVyZWQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkQgPSAiZGRtX3Bhc3N3b3JkIjsKKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0RHluYW1pY0RhdGFNYXNraW5nRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFBlcm1pc3Npb25zVmFsaWRpdHkoMCk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRSb2xlc1ZhbGlkaXR5KDApOworICAgICAgICBDUUxUZXN0ZXIuc2V0VXBDbGFzcygpOworICAgICAgICByZXF1aXJlQXV0aGVudGljYXRpb24oKTsKKyAgICAgICAgcmVxdWlyZU5ldHdvcmsoKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgYmVmb3JlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgdXNlU3VwZXJVc2VyKCk7CisKKyAgICAgICAgc2NoZW1hQ2hhbmdlKGZvcm1hdChDUkVBVEVfS0VZU1BBQ0UsIEtFWVNQQUNFXzEpKTsKKyAgICAgICAgc2NoZW1hQ2hhbmdlKGZvcm1hdChDUkVBVEVfS0VZU1BBQ0UsIEtFWVNQQUNFXzIpKTsKKworICAgICAgICBjcmVhdGVUYWJsZShmb3JtYXQoQ1JFQVRFX1RBQkxFLCBLRVlTUEFDRV8xLCBUQUJMRV8xKSk7CisgICAgICAgIGNyZWF0ZVRhYmxlKGZvcm1hdChDUkVBVEVfVEFCTEUsIEtFWVNQQUNFXzEsIFRBQkxFXzIpKTsKKyAgICAgICAgY3JlYXRlVGFibGUoZm9ybWF0KENSRUFURV9UQUJMRSwgS0VZU1BBQ0VfMiwgVEFCTEVfMSkpOworCisgICAgICAgIGV4ZWN1dGUoZm9ybWF0KElOU0VSVCwgS0VZU1BBQ0VfMSwgVEFCTEVfMSksIENMRUFSX1JPVyk7CisgICAgICAgIGV4ZWN1dGUoZm9ybWF0KElOU0VSVCwgS0VZU1BBQ0VfMSwgVEFCTEVfMiksIENMRUFSX1JPVyk7CisgICAgICAgIGV4ZWN1dGUoZm9ybWF0KElOU0VSVCwgS0VZU1BBQ0VfMiwgVEFCTEVfMSksIENMRUFSX1JPVyk7CisKKyAgICAgICAgZm9yIChTdHJpbmcgdXNlciA6IEFycmF5cy5hc0xpc3QoVVNFUiwgT1RIRVJfVVNFUikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJDUkVBVEUgVVNFUiBJRiBOT1QgRVhJU1RTICVzIFdJVEggUEFTU1dPUkQgJyVzJyIsIHVzZXIsIFBBU1NXT1JEKSk7CisgICAgICAgICAgICBleGVjdXRlTmV0KGZvcm1hdCgiR1JBTlQgU0VMRUNUIE9OIEFMTCBLRVlTUEFDRVMgVE8gJXMiLCB1c2VyKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCBhZnRlcigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHVzZVN1cGVyVXNlcigpOworICAgICAgICBleGVjdXRlTmV0KCJEUk9QIFVTRVIgSUYgRVhJU1RTICIgKyBVU0VSKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbm1hc2tEZWZhdWx0cygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIC8vIG9yZGluYXJ5IHVzZXIgd2l0aG91dCBjaGFuZ2VkIHBlcm1pc3Npb25zIHNob3VsZCBzZWUgbWFza2VkIGRhdGEKKyAgICAgICAgdXNlVXNlcihPVEhFUl9VU0VSLCBQQVNTV09SRCk7CisgICAgICAgIGFzc2VydE1hc2tlZChLRVlTUEFDRV8xLCBUQUJMRV8xKTsKKyAgICAgICAgYXNzZXJ0TWFza2VkKEtFWVNQQUNFXzEsIFRBQkxFXzIpOworICAgICAgICBhc3NlcnRNYXNrZWQoS0VZU1BBQ0VfMiwgVEFCTEVfMSk7CisKKyAgICAgICAgLy8gc3VwZXIgdXNlciBzaG91bGQgc2VlIHVubWFza2VkIGRhdGEKKyAgICAgICAgdXNlU3VwZXJVc2VyKCk7CisgICAgICAgIGFzc2VydENsZWFyKEtFWVNQQUNFXzEsIFRBQkxFXzEpOworICAgICAgICBhc3NlcnRDbGVhcihLRVlTUEFDRV8xLCBUQUJMRV8yKTsKKyAgICAgICAgYXNzZXJ0Q2xlYXIoS0VZU1BBQ0VfMiwgVEFCTEVfMSk7CisKKyAgICAgICAgLy8gaW50ZXJuYWwgdXNlciBzaG91bGQgc2VlIHVubWFza2VkIGRhdGEKKyAgICAgICAgYXNzZXJ0Q2xlYXJJbnRlcm5hbChLRVlTUEFDRV8xLCBUQUJMRV8xKTsKKyAgICAgICAgYXNzZXJ0Q2xlYXJJbnRlcm5hbChLRVlTUEFDRV8xLCBUQUJMRV8yKTsKKyAgICAgICAgYXNzZXJ0Q2xlYXJJbnRlcm5hbChLRVlTUEFDRV8yLCBUQUJMRV8xKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbm1hc2tPbkFsbEtleXNwYWNlcygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFBlcm1pc3Npb25zKGZvcm1hdCgiR1JBTlQgVU5NQVNLIE9OIEFMTCBLRVlTUEFDRVMgVE8gJXMiLCBVU0VSKSwgKCkgLT4geworICAgICAgICAgICAgYXNzZXJ0Q2xlYXIoS0VZU1BBQ0VfMSwgVEFCTEVfMSk7CisgICAgICAgICAgICBhc3NlcnRDbGVhcihLRVlTUEFDRV8xLCBUQUJMRV8yKTsKKyAgICAgICAgICAgIGFzc2VydENsZWFyKEtFWVNQQUNFXzIsIFRBQkxFXzEpOworICAgICAgICB9KTsKKworICAgICAgICBhc3NlcnRQZXJtaXNzaW9ucyhmb3JtYXQoIlJFVk9LRSBVTk1BU0sgT04gQUxMIEtFWVNQQUNFUyBGUk9NICVzIiwgVVNFUiksICgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydE1hc2tlZChLRVlTUEFDRV8xLCBUQUJMRV8xKTsKKyAgICAgICAgICAgIGFzc2VydE1hc2tlZChLRVlTUEFDRV8xLCBUQUJMRV8yKTsKKyAgICAgICAgICAgIGFzc2VydE1hc2tlZChLRVlTUEFDRV8yLCBUQUJMRV8xKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5tYXNrT25LZXlzcGFjZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFBlcm1pc3Npb25zKGZvcm1hdCgiR1JBTlQgVU5NQVNLIE9OIEtFWVNQQUNFICVzIFRPICVzIiwgS0VZU1BBQ0VfMSwgVVNFUiksICgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydENsZWFyKEtFWVNQQUNFXzEsIFRBQkxFXzEpOworICAgICAgICAgICAgYXNzZXJ0Q2xlYXIoS0VZU1BBQ0VfMSwgVEFCTEVfMik7CisgICAgICAgICAgICBhc3NlcnRNYXNrZWQoS0VZU1BBQ0VfMiwgVEFCTEVfMSk7CisgICAgICAgIH0pOworCisgICAgICAgIGFzc2VydFBlcm1pc3Npb25zKGZvcm1hdCgiUkVWT0tFIFVOTUFTSyBPTiBLRVlTUEFDRSAlcyBGUk9NICVzIiwgS0VZU1BBQ0VfMSwgVVNFUiksICgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydE1hc2tlZChLRVlTUEFDRV8xLCBUQUJMRV8xKTsKKyAgICAgICAgICAgIGFzc2VydE1hc2tlZChLRVlTUEFDRV8xLCBUQUJMRV8yKTsKKyAgICAgICAgICAgIGFzc2VydE1hc2tlZChLRVlTUEFDRV8yLCBUQUJMRV8xKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5tYXNrT25UYWJsZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFBlcm1pc3Npb25zKGZvcm1hdCgiR1JBTlQgVU5NQVNLIE9OIFRBQkxFICVzLiVzIFRPICVzIiwgS0VZU1BBQ0VfMSwgVEFCTEVfMSwgVVNFUiksICgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydENsZWFyKEtFWVNQQUNFXzEsIFRBQkxFXzEpOworICAgICAgICAgICAgYXNzZXJ0TWFza2VkKEtFWVNQQUNFXzEsIFRBQkxFXzIpOworICAgICAgICAgICAgYXNzZXJ0TWFza2VkKEtFWVNQQUNFXzIsIFRBQkxFXzEpOworICAgICAgICB9KTsKKworICAgICAgICBhc3NlcnRQZXJtaXNzaW9ucyhmb3JtYXQoIlJFVk9LRSBVTk1BU0sgT04gVEFCTEUgJXMuJXMgRlJPTSAlcyIsIEtFWVNQQUNFXzEsIFRBQkxFXzEsIFVTRVIpLCAoKSAtPiB7CisgICAgICAgICAgICBhc3NlcnRNYXNrZWQoS0VZU1BBQ0VfMSwgVEFCTEVfMSk7CisgICAgICAgICAgICBhc3NlcnRNYXNrZWQoS0VZU1BBQ0VfMSwgVEFCTEVfMik7CisgICAgICAgICAgICBhc3NlcnRNYXNrZWQoS0VZU1BBQ0VfMiwgVEFCTEVfMSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQZXJtaXNzaW9ucyhTdHJpbmcgYWx0ZXJQZXJtaXNzaW9uc1F1ZXJ5LCBUaHJvd2luZ1J1bm5hYmxlIGFzc2VydGlvbikgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgLy8gYWx0ZXIgcGVybWlzc2lvbnMgYXMgc3VwZXJ1c2VyCisgICAgICAgIHVzZVN1cGVyVXNlcigpOworICAgICAgICBleGVjdXRlTmV0KGFsdGVyUGVybWlzc2lvbnNRdWVyeSk7CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoZSB0ZXN0ZWQgdXNlciBwZXJtaXNzaW9ucworICAgICAgICB1c2VVc2VyKFVTRVIsIFBBU1NXT1JEKTsKKyAgICAgICAgYXNzZXJ0aW9uLnJ1bigpOworCisgICAgICAgIC8vIHRoZSBvcmRpbmFyeSB1c2VyIHdpdGhvdXQgbW9kaWZpZWQgcGVybWlzc2lvbnMgc2hvdWxkIGtlZXAgc2VlaW5nIG1hc2tlZCBkYXRhCisgICAgICAgIHVzZVVzZXIoT1RIRVJfVVNFUiwgUEFTU1dPUkQpOworICAgICAgICBhc3NlcnRNYXNrZWQoS0VZU1BBQ0VfMSwgVEFCTEVfMSk7CisgICAgICAgIGFzc2VydE1hc2tlZChLRVlTUEFDRV8xLCBUQUJMRV8yKTsKKyAgICAgICAgYXNzZXJ0TWFza2VkKEtFWVNQQUNFXzIsIFRBQkxFXzEpOworCisgICAgICAgIC8vIHN1cGVyIHVzZXIgc2hvdWxkIGtlZXAgc2VlaW5nIHVubWFza2VkIGRhdGEKKyAgICAgICAgdXNlU3VwZXJVc2VyKCk7CisgICAgICAgIGFzc2VydENsZWFyKEtFWVNQQUNFXzEsIFRBQkxFXzEpOworICAgICAgICBhc3NlcnRDbGVhcihLRVlTUEFDRV8xLCBUQUJMRV8yKTsKKyAgICAgICAgYXNzZXJ0Q2xlYXIoS0VZU1BBQ0VfMiwgVEFCTEVfMSk7CisKKyAgICAgICAgLy8gaW50ZXJuYWwgdXNlciBzaG91bGQga2VlcCBzZWVpbmcgdW5tYXNrZWQgZGF0YQorICAgICAgICBhc3NlcnRDbGVhckludGVybmFsKEtFWVNQQUNFXzEsIFRBQkxFXzEpOworICAgICAgICBhc3NlcnRDbGVhckludGVybmFsKEtFWVNQQUNFXzEsIFRBQkxFXzIpOworICAgICAgICBhc3NlcnRDbGVhckludGVybmFsKEtFWVNQQUNFXzIsIFRBQkxFXzEpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRNYXNrZWQoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldChmb3JtYXQoU0VMRUNUX1dJTERDQVJELCBrZXlzcGFjZSwgdGFibGUpKSwgTUFTS0VEX1JPVyk7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldChmb3JtYXQoU0VMRUNUX0NPTFVNTlMsIGtleXNwYWNlLCB0YWJsZSkpLCBNQVNLRURfUk9XKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Q2xlYXIoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldChmb3JtYXQoU0VMRUNUX1dJTERDQVJELCBrZXlzcGFjZSwgdGFibGUpKSwgQ0xFQVJfUk9XKTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KGZvcm1hdChTRUxFQ1RfQ09MVU1OUywga2V5c3BhY2UsIHRhYmxlKSksIENMRUFSX1JPVyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydENsZWFySW50ZXJuYWwoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShmb3JtYXQoU0VMRUNUX1dJTERDQVJELCBrZXlzcGFjZSwgdGFibGUpKSwgQ0xFQVJfUk9XKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKGZvcm1hdChTRUxFQ1RfQ09MVU1OUywga2V5c3BhY2UsIHRhYmxlKSksIENMRUFSX1JPVyk7CisgICAgfQorCisgICAgQEZ1bmN0aW9uYWxJbnRlcmZhY2UKKyAgICBwcml2YXRlIGludGVyZmFjZSBUaHJvd2luZ1J1bm5hYmxlCisgICAgeworICAgICAgICB2b2lkIHJ1bigpIHRocm93cyBUaHJvd2FibGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1NlbGVjdGlvbkNvbHVtbk1hcHBpbmdUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2VsZWN0aW9uQ29sdW1uTWFwcGluZ1Rlc3QuamF2YQppbmRleCBkNmRlNWZmLi4yMzM5ZjVkIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2VsZWN0aW9uQ29sdW1uTWFwcGluZ1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2VsZWN0aW9uQ29sdW1uTWFwcGluZ1Rlc3QuamF2YQpAQCAtMjYsNiArMjYsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwpAQCAtNTQsNiArNTUsOCBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcENsYXNzKCkgICAgIC8vIG92ZXJyaWRlcyBDUUxUZXN0ZXIuc2V0VXBDbGFzcygpCiAgICAgeworICAgICAgICBTZXJ2ZXJUZXN0VXRpbHMuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0UGFydGl0aW9uZXJVbnNhZmUoQnl0ZU9yZGVyZWRQYXJ0aXRpb25lci5pbnN0YW5jZSk7CiAKICAgICAgICAgcHJlcGFyZVNlcnZlcigpOwpAQCAtMjI3LDE0ICsyMzAsMTQgQEAKIAogICAgIHByaXZhdGUgdm9pZCB0ZXN0RnVuY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewotICAgICAgICAvLyBhIGZ1bmN0aW9uIHN1Y2ggYXMgaW50YXNibG9iKDxjb2w+KSBpcyByZXByZXNlbnRlZCBpbiBSZXN1bHRTZXQuTWV0YWRhdGEKKyAgICAgICAgLy8gYSBmdW5jdGlvbiBzdWNoIGFzIGludF9hc19ibG9iKDxjb2w+KSBpcyByZXByZXNlbnRlZCBpbiBSZXN1bHRTZXQuTWV0YWRhdGEKICAgICAgICAgLy8gYnkgYSBDb2x1bW5TcGVjaWZpY2F0aW9uIHdpdGggdGhlIGZ1bmN0aW9uIG5hbWUgcGx1cyBhcmdzIGFuZCB0aGUgdHlwZSBzZXQKICAgICAgICAgLy8gdG8gdGhlIGZ1bmN0aW9uJ3MgcmV0dXJuIHR5cGUKLSAgICAgICAgQ29sdW1uU3BlY2lmaWNhdGlvbiBmblNwZWMgPSBjb2x1bW5TcGVjaWZpY2F0aW9uKCJzeXN0ZW0uaW50YXNibG9iKHYxKSIsIEJ5dGVzVHlwZS5pbnN0YW5jZSk7CisgICAgICAgIENvbHVtblNwZWNpZmljYXRpb24gZm5TcGVjID0gY29sdW1uU3BlY2lmaWNhdGlvbigic3lzdGVtLmludF9hc19ibG9iKHYxKSIsIEJ5dGVzVHlwZS5pbnN0YW5jZSk7CiAgICAgICAgIFNlbGVjdGlvbkNvbHVtbk1hcHBpbmcgZXhwZWN0ZWQgPSBTZWxlY3Rpb25Db2x1bW5NYXBwaW5nLm5ld01hcHBpbmcoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRNYXBwaW5nKGZuU3BlYywgY29sdW1uRGVmaW5pdGlvbigidjEiKSk7CiAKLSAgICAgICAgdmVyaWZ5KGV4cGVjdGVkLCAiU0VMRUNUIGludGFzYmxvYih2MSkgRlJPTSAlcyIpOworICAgICAgICB2ZXJpZnkoZXhwZWN0ZWQsICJTRUxFQ1QgaW50X2FzX2Jsb2IodjEpIEZST00gJXMiKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdGVzdE5vQXJnRnVuY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlCkBAIC0zMjYsNyArMzI5LDcgQEAKICAgICAgICAgU2VsZWN0aW9uQ29sdW1uTWFwcGluZyBleHBlY3RlZCA9IFNlbGVjdGlvbkNvbHVtbk1hcHBpbmcubmV3TWFwcGluZygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZE1hcHBpbmcoZm5TcGVjLCBjb2x1bW5EZWZpbml0aW9uKCJ2MSIpKTsKIAotICAgICAgICB2ZXJpZnkoZXhwZWN0ZWQsICJTRUxFQ1QgaW50YXNibG9iKHYxKSBBUyBmbl9hbGlhcyBGUk9NICVzIik7CisgICAgICAgIHZlcmlmeShleHBlY3RlZCwgIlNFTEVDVCBpbnRfYXNfYmxvYih2MSkgQVMgZm5fYWxpYXMgRlJPTSAlcyIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3ROb0FyZ3VtZW50RnVuY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlCkBAIC0zNDEsMTkgKzM0NCwxOSBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRGdW5jdGlvbnNXaXRoQXJndW1lbnRzKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKICAgICAgICAgU2VsZWN0aW9uQ29sdW1ucyBleHBlY3RlZCA9IFNlbGVjdGlvbkNvbHVtbk1hcHBpbmcubmV3TWFwcGluZygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZE1hcHBpbmcoY29sdW1uU3BlY2lmaWNhdGlvbigic3lzdGVtLmJsb2Jhc2ludChzeXN0ZW0uaW50YXNibG9iKHYxKSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRNYXBwaW5nKGNvbHVtblNwZWNpZmljYXRpb24oInN5c3RlbS5ibG9iX2FzX2ludChzeXN0ZW0uaW50X2FzX2Jsb2IodjEpKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQzMlR5cGUuaW5zdGFuY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkRlZmluaXRpb24oInYxIikpOwotICAgICAgICB2ZXJpZnkoZXhwZWN0ZWQsICJTRUxFQ1QgYmxvYmFzaW50KGludGFzYmxvYih2MSkpIEZST00gJXMiKTsKKyAgICAgICAgdmVyaWZ5KGV4cGVjdGVkLCAiU0VMRUNUIGJsb2JfYXNfaW50KGludF9hc19ibG9iKHYxKSkgRlJPTSAlcyIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRGdW5jdGlvbnMoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBTZWxlY3Rpb25Db2x1bW5zIGV4cGVjdGVkID0gU2VsZWN0aW9uQ29sdW1uTWFwcGluZy5uZXdNYXBwaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkTWFwcGluZyhjb2x1bW5TcGVjaWZpY2F0aW9uKCJzeXN0ZW0udG91bml4dGltZXN0YW1wKHN5c3RlbS5ub3coKSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRNYXBwaW5nKGNvbHVtblNwZWNpZmljYXRpb24oInN5c3RlbS50b191bml4X3RpbWVzdGFtcChzeXN0ZW0ubm93KCkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmdUeXBlLmluc3RhbmNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMX0RFRik7Ci0gICAgICAgIHZlcmlmeShleHBlY3RlZCwgIlNFTEVDVCB0b3VuaXh0aW1lc3RhbXAobm93KCkpIEZST00gJXMiKTsKKyAgICAgICAgdmVyaWZ5KGV4cGVjdGVkLCAiU0VMRUNUIHRvX3VuaXhfdGltZXN0YW1wKG5vdygpKSBGUk9NICVzIik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZUZ1bmN0aW9uc1dpdGhvdXRBbGlhc2VzKCkgdGhyb3dzIFRocm93YWJsZQpAQCAtMzYxLDExICszNjQsMTEgQEAKICAgICAgICAgLy8gd2hlcmUgZHVwbGljYXRlIGZ1bmN0aW9ucyBhcmUgcHJlc2VudCwgdGhlIENvbHVtblNwZWNpZmljYXRpb24gbGlzdCB3aWxsCiAgICAgICAgIC8vIGNvbnRhaW4gYW4gZW50cnkgcGVyLWR1cGxpY2F0ZSBidXQgdGhlIG1hcHBpbmdzIHdpbGwgYmUgZGVkdXBsaWNhdGVkIChpLmUuCiAgICAgICAgIC8vIGEgc2luZ2xlIG1hcHBpbmcgay92IHBhaXIgcmVnYXJkbGVzcyBvZiB0aGUgbnVtYmVyIG9mIGR1cGxpY2F0ZXMpCi0gICAgICAgIENvbHVtblNwZWNpZmljYXRpb24gc3BlYyA9IGNvbHVtblNwZWNpZmljYXRpb24oInN5c3RlbS5pbnRhc2Jsb2IodjEpIiwgQnl0ZXNUeXBlLmluc3RhbmNlKTsKKyAgICAgICAgQ29sdW1uU3BlY2lmaWNhdGlvbiBzcGVjID0gY29sdW1uU3BlY2lmaWNhdGlvbigic3lzdGVtLmludF9hc19ibG9iKHYxKSIsIEJ5dGVzVHlwZS5pbnN0YW5jZSk7CiAgICAgICAgIFNlbGVjdGlvbkNvbHVtbnMgZXhwZWN0ZWQgPSBTZWxlY3Rpb25Db2x1bW5NYXBwaW5nLm5ld01hcHBpbmcoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRNYXBwaW5nKHNwZWMsIGNvbHVtbkRlZmluaXRpb24oInYxIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZE1hcHBpbmcoc3BlYywgY29sdW1uRGVmaW5pdGlvbigidjEiKSk7Ci0gICAgICAgIHZlcmlmeShleHBlY3RlZCwgIlNFTEVDVCBpbnRhc2Jsb2IodjEpLCBpbnRhc2Jsb2IodjEpIEZST00gJXMiKTsKKyAgICAgICAgdmVyaWZ5KGV4cGVjdGVkLCAiU0VMRUNUIGludF9hc19ibG9iKHYxKSwgaW50X2FzX2Jsb2IodjEpIEZST00gJXMiKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlRnVuY3Rpb25zV2l0aEFsaWFzZXMoKSB0aHJvd3MgVGhyb3dhYmxlCkBAIC0zNzgsNyArMzgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5EZWZpbml0aW9uKCJ2MSIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRNYXBwaW5nKGNvbHVtblNwZWNpZmljYXRpb24oImJsb2JfMiIsIEJ5dGVzVHlwZS5pbnN0YW5jZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uRGVmaW5pdGlvbigidjEiKSk7Ci0gICAgICAgIHZlcmlmeShleHBlY3RlZCwgIlNFTEVDVCBpbnRhc2Jsb2IodjEpIEFTIGJsb2JfMSwgaW50YXNibG9iKHYxKSBBUyBibG9iXzIgRlJPTSAlcyIpOworICAgICAgICB2ZXJpZnkoZXhwZWN0ZWQsICJTRUxFQ1QgaW50X2FzX2Jsb2IodjEpIEFTIGJsb2JfMSwgaW50X2FzX2Jsb2IodjEpIEFTIGJsb2JfMiBGUk9NICVzIik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdERpc3RpbmN0KCkgdGhyb3dzIFRocm93YWJsZQpAQCAtNTM0LDggKzUzNyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQ1JFQVRFIEZVTkNUSU9OICVzIChhIGludCwgYiBpbnQpIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBSRVRVUk5TIGludCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIExBTkdVQUdFIGphdmFzY3JpcHQiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBUyAnYSArIGInIikpLm5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgTEFOR1VBR0UgamF2YSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEFTICcgcmV0dXJuIGEgKyBiOyciKSkubmFtZTsKIAogICAgICAgICBTdHJpbmcgYUZ1bmMgPSBjcmVhdGVBZ2dyZWdhdGUoS0VZU1BBQ0UsICJpbnQsIGludCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIENSRUFURSBBR0dSRUdBVEUgJXMgKGludCkiICsKQEAgLTU0NywxNSArNTUwLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBDUkVBVEUgRlVOQ1RJT04gJXMgKGEgaW50KSIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFJFVFVSTlMgaW50IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBMQU5HVUFHRSBqYXZhc2NyaXB0IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBUyAnYSsxJyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgTEFOR1VBR0UgamF2YSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQVMgJyByZXR1cm4gYSArIDE7JyIpOwogCiAgICAgICAgIFN0cmluZyBzcUZ1bmMgPSBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRSwgImludCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIENSRUFURSBGVU5DVElPTiAlcyAoYSBpbnQpIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFJFVFVSTlMgaW50IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIExBTkdVQUdFIGphdmFzY3JpcHQiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQVMgJ2EqYSciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgTEFOR1VBR0UgamF2YSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBUyAnIHJldHVybiBhICogYTsnIik7CiAKICAgICAgICAgQ29sdW1uTWV0YWRhdGEgdjEgPSBjb2x1bW5EZWZpbml0aW9uKCJ2MSIpOwogICAgICAgICBTZWxlY3Rpb25Db2x1bW5zIGV4cGVjdGVkID0gU2VsZWN0aW9uQ29sdW1uTWFwcGluZy5uZXdNYXBwaW5nKCkKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9TZWxlY3RvclNlcmlhbGl6YXRpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2VsZWN0b3JTZXJpYWxpemF0aW9uVGVzdC5qYXZhCmluZGV4IGVlNGRkMzUuLjUzMGNiNjcgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9TZWxlY3RvclNlcmlhbGl6YXRpb25UZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1NlbGVjdG9yU2VyaWFsaXphdGlvblRlc3QuamF2YQpAQCAtMzYsNiArMzYsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0QnVmZmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dEJ1ZmZlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKQEAgLTYwLDggKzYxLDEwIEBACiAgICAgICAgIGNoZWNrU2VyaWFsaXphdGlvbih0YWJsZS5nZXRDb2x1bW4obmV3IENvbHVtbklkZW50aWZpZXIoImMxIiwgZmFsc2UpKSwgdGFibGUpOwogCiAgICAgICAgIC8vIFRlc3QgV3JpdGV0aW1lT3JUVExTZWxlY3RvciBzZXJpYWxpemF0aW9uCi0gICAgICAgIGNoZWNrU2VyaWFsaXphdGlvbihuZXcgU2VsZWN0YWJsZS5Xcml0ZXRpbWVPclRUTCh0YWJsZS5nZXRDb2x1bW4obmV3IENvbHVtbklkZW50aWZpZXIoInYiLCBmYWxzZSkpLCB0cnVlKSwgdGFibGUpOwotICAgICAgICBjaGVja1NlcmlhbGl6YXRpb24obmV3IFNlbGVjdGFibGUuV3JpdGV0aW1lT3JUVEwodGFibGUuZ2V0Q29sdW1uKG5ldyBDb2x1bW5JZGVudGlmaWVyKCJ2IiwgZmFsc2UpKSwgZmFsc2UpLCB0YWJsZSk7CisgICAgICAgIENvbHVtbk1ldGFkYXRhIGNvbHVtbiA9IHRhYmxlLmdldENvbHVtbihuZXcgQ29sdW1uSWRlbnRpZmllcigidiIsIGZhbHNlKSk7CisgICAgICAgIGNoZWNrU2VyaWFsaXphdGlvbihuZXcgU2VsZWN0YWJsZS5Xcml0ZXRpbWVPclRUTChjb2x1bW4sIGNvbHVtbiwgU2VsZWN0YWJsZS5Xcml0ZXRpbWVPclRUTC5LaW5kLldSSVRFX1RJTUUpLCB0YWJsZSk7CisgICAgICAgIGNoZWNrU2VyaWFsaXphdGlvbihuZXcgU2VsZWN0YWJsZS5Xcml0ZXRpbWVPclRUTChjb2x1bW4sIGNvbHVtbiwgU2VsZWN0YWJsZS5Xcml0ZXRpbWVPclRUTC5LaW5kLlRUTCksIHRhYmxlKTsKKyAgICAgICAgY2hlY2tTZXJpYWxpemF0aW9uKG5ldyBTZWxlY3RhYmxlLldyaXRldGltZU9yVFRMKGNvbHVtbiwgY29sdW1uLCBTZWxlY3RhYmxlLldyaXRldGltZU9yVFRMLktpbmQuTUFYX1dSSVRFX1RJTUUpLCB0YWJsZSk7CiAKICAgICAgICAgLy8gVGVzdCBMaXN0U2VsZWN0b3Igc2VyaWFsaXphdGlvbgogICAgICAgICBjaGVja1NlcmlhbGl6YXRpb24obmV3IFNlbGVjdGFibGUuV2l0aExpc3QoYXNMaXN0KHRhYmxlLmdldENvbHVtbihuZXcgQ29sdW1uSWRlbnRpZmllcigidiIsIGZhbHNlKSksCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL0Rlc2NyaWJlU3RhdGVtZW50VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9EZXNjcmliZVN0YXRlbWVudFRlc3QuamF2YQppbmRleCA1MmJiM2MzLi40MjJmY2Q0IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL0Rlc2NyaWJlU3RhdGVtZW50VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvRGVzY3JpYmVTdGF0ZW1lbnRUZXN0LmphdmEKQEAgLTM5LDEyICszOSwxNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuVG9rZW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50cy4qOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIApAQCAtNzkwLDYgKzc5Miw1NiBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlc2NyaWJlVGFibGVXaXRoQ29sdW1uTWFza3MoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICByZXF1aXJlTmV0d29yaygpOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0RHluYW1pY0RhdGFNYXNraW5nRW5hYmxlZCh0cnVlKTsKKworICAgICAgICBTdHJpbmcgdGFibGUgPSBjcmVhdGVUYWJsZShLRVlTUEFDRV9QRVJfVEVTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBUQUJMRSAlcyAoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHBrMSB0ZXh0LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgcGsyIGludCBNQVNLRUQgV0lUSCBERUZBVUxULCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgY2sxIGludCwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIGNrMiBpbnQgTUFTS0VEIFdJVEggbWFza19kZWZhdWx0KCksIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHMxIGRlY2ltYWwgc3RhdGljLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgczIgZGVjaW1hbCBzdGF0aWMgTUFTS0VEIFdJVEggbWFza19udWxsKCksICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB2MSB0ZXh0LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdjIgdGV4dCBNQVNLRUQgV0lUSCBtYXNrX2lubmVyKDEsIG51bGwpLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBSSU1BUlkgS0VZICgocGsxLCBwazIpLCBjazEsIGNrMiApKSIpOworCisgICAgICAgIFRhYmxlTWV0YWRhdGEgdGFibGVNZXRhZGF0YSA9IFNjaGVtYS5pbnN0YW5jZS5nZXRUYWJsZU1ldGFkYXRhKEtFWVNQQUNFX1BFUl9URVNULCB0YWJsZSk7CisgICAgICAgIGFzc2VydE5vdE51bGwodGFibGVNZXRhZGF0YSk7CisKKyAgICAgICAgU3RyaW5nIHRhYmxlQ3JlYXRlU3RhdGVtZW50ID0gIkNSRUFURSBUQUJMRSAiICsgS0VZU1BBQ0VfUEVSX1RFU1QgKyAiLiIgKyB0YWJsZSArICIgKFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgcGsxIHRleHQsXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBwazIgaW50IE1BU0tFRCBXSVRIIHN5c3RlbS5tYXNrX2RlZmF1bHQoKSxcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGNrMSBpbnQsXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBjazIgaW50IE1BU0tFRCBXSVRIIHN5c3RlbS5tYXNrX2RlZmF1bHQoKSxcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHMxIGRlY2ltYWwgc3RhdGljLFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgczIgZGVjaW1hbCBzdGF0aWMgTUFTS0VEIFdJVEggc3lzdGVtLm1hc2tfbnVsbCgpLFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgdjEgdGV4dCxcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHYyIHRleHQgTUFTS0VEIFdJVEggc3lzdGVtLm1hc2tfaW5uZXIoMSwgbnVsbCksXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBQUklNQVJZIEtFWSAoKHBrMSwgcGsyKSwgY2sxLCBjazIpXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgV0lUSCBJRCA9ICIgKyB0YWJsZU1ldGFkYXRhLmlkICsgIlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgQU5EIENMVVNURVJJTkcgT1JERVIgQlkgKGNrMSBBU0MsIGNrMiBBU0MpXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBBTkQgIiArIHRhYmxlUGFyYW1ldGVyc0NxbCgpOworCisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZURlc2NyaWJlTmV0KCJERVNDUklCRSBUQUJMRSAiICsgS0VZU1BBQ0VfUEVSX1RFU1QgKyAiLiIgKyB0YWJsZSArICIgV0lUSCBJTlRFUk5BTFMiKSwKKyAgICAgICAgICAgICAgICAgICAgICByb3coS0VZU1BBQ0VfUEVSX1RFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNyZWF0ZVN0YXRlbWVudCkpOworCisgICAgICAgIC8vIG1hc2tzIHNob3VsZCBiZSBsaXN0ZWQgZXZlbiBpZiBERE0gaXMgZGlzYWJsZWQKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldER5bmFtaWNEYXRhTWFza2luZ0VuYWJsZWQoZmFsc2UpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVEZXNjcmliZU5ldCgiREVTQ1JJQkUgVEFCTEUgIiArIEtFWVNQQUNFX1BFUl9URVNUICsgIi4iICsgdGFibGUgKyAiIFdJVEggSU5URVJOQUxTIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KEtFWVNQQUNFX1BFUl9URVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAidGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDcmVhdGVTdGF0ZW1lbnQpKTsKKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RVc2luZ1Jlc2VydmVkSW5DcmVhdGVUeXBlKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKICAgICAgICAgU3RyaW5nIHR5cGUgPSBjcmVhdGVUeXBlKEtFWVNQQUNFX1BFUl9URVNULCAiQ1JFQVRFIFRZUEUgJXMgKFwidG9rZW5cIiB0ZXh0LCBcImRlc2NcIiB0ZXh0KTsiKTsKQEAgLTk2OSw2ICsxMDIxLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdGFibGVQYXJhbWV0ZXJzQ3FsKCkKICAgICB7CiAgICAgICAgIHJldHVybiAiYWRkaXRpb25hbF93cml0ZV9wb2xpY3kgPSAnOTlwJ1xuIiArCisgICAgICAgICAgICAgICAiICAgIEFORCBhbGxvd19hdXRvX3NuYXBzaG90ID0gdHJ1ZVxuIiArCiAgICAgICAgICAgICAgICAiICAgIEFORCBibG9vbV9maWx0ZXJfZnBfY2hhbmNlID0gMC4wMVxuIiArCiAgICAgICAgICAgICAgICAiICAgIEFORCBjYWNoaW5nID0geydrZXlzJzogJ0FMTCcsICdyb3dzX3Blcl9wYXJ0aXRpb24nOiAnTk9ORSd9XG4iICsKICAgICAgICAgICAgICAgICIgICAgQU5EIGNkYyA9IGZhbHNlXG4iICsKQEAgLTk4MCw2ICsxMDMzLDcgQEAKICAgICAgICAgICAgICAgICIgICAgQU5EIGRlZmF1bHRfdGltZV90b19saXZlID0gMFxuIiArCiAgICAgICAgICAgICAgICAiICAgIEFORCBleHRlbnNpb25zID0ge31cbiIgKwogICAgICAgICAgICAgICAgIiAgICBBTkQgZ2NfZ3JhY2Vfc2Vjb25kcyA9IDg2NDAwMFxuIiArCisgICAgICAgICAgICAgICAiICAgIEFORCBpbmNyZW1lbnRhbF9iYWNrdXBzID0gdHJ1ZVxuIiArIAogICAgICAgICAgICAgICAgIiAgICBBTkQgbWF4X2luZGV4X2ludGVydmFsID0gMjA0OFxuIiArCiAgICAgICAgICAgICAgICAiICAgIEFORCBtZW10YWJsZV9mbHVzaF9wZXJpb2RfaW5fbXMgPSAwXG4iICsKICAgICAgICAgICAgICAgICIgICAgQU5EIG1pbl9pbmRleF9pbnRlcnZhbCA9IDEyOFxuIiArCkBAIC05OTAsNiArMTA0NCw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG12UGFyYW1ldGVyc0NxbCgpCiAgICAgewogICAgICAgICByZXR1cm4gImFkZGl0aW9uYWxfd3JpdGVfcG9saWN5ID0gJzk5cCdcbiIgKworICAgICAgICAgICAgICAgIiAgICBBTkQgYWxsb3dfYXV0b19zbmFwc2hvdCA9IHRydWVcbiIgKwogICAgICAgICAgICAgICAgIiAgICBBTkQgYmxvb21fZmlsdGVyX2ZwX2NoYW5jZSA9IDAuMDFcbiIgKwogICAgICAgICAgICAgICAgIiAgICBBTkQgY2FjaGluZyA9IHsna2V5cyc6ICdBTEwnLCAncm93c19wZXJfcGFydGl0aW9uJzogJ05PTkUnfVxuIiArCiAgICAgICAgICAgICAgICAiICAgIEFORCBjZGMgPSBmYWxzZVxuIiArCkBAIC0xMDAwLDYgKzEwNTUsNyBAQAogICAgICAgICAgICAgICAgIiAgICBBTkQgY3JjX2NoZWNrX2NoYW5jZSA9IDEuMFxuIiArCiAgICAgICAgICAgICAgICAiICAgIEFORCBleHRlbnNpb25zID0ge31cbiIgKwogICAgICAgICAgICAgICAgIiAgICBBTkQgZ2NfZ3JhY2Vfc2Vjb25kcyA9IDg2NDAwMFxuIiArCisgICAgICAgICAgICAgICAiICAgIEFORCBpbmNyZW1lbnRhbF9iYWNrdXBzID0gdHJ1ZVxuIiArCiAgICAgICAgICAgICAgICAiICAgIEFORCBtYXhfaW5kZXhfaW50ZXJ2YWwgPSAyMDQ4XG4iICsKICAgICAgICAgICAgICAgICIgICAgQU5EIG1lbXRhYmxlX2ZsdXNoX3BlcmlvZF9pbl9tcyA9IDBcbiIgKwogICAgICAgICAgICAgICAgIiAgICBBTkQgbWluX2luZGV4X2ludGVydmFsID0gMTI4XG4iICsKQEAgLTEwNDQsOSArMTEwMCw0IEBACiAgICAgICAgICAgICBleGVjdXRlTmV0KHYsICJVU0UgIiArIHVzZUtzKTsKICAgICAgICAgcmV0dXJuIHY7CiAgICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W11bXSByb3dzKE9iamVjdFtdLi4uIHJvd3MpCi0gICAgewotICAgICAgICByZXR1cm4gcm93czsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL0NvbGxlY3Rpb25zVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9Db2xsZWN0aW9uc1Rlc3QuamF2YQppbmRleCBmZWRiNGU1Li5lNmVmMTYzIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL0NvbGxlY3Rpb25zVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvQ29sbGVjdGlvbnNUZXN0LmphdmEKQEAgLTU3NywxOCArNTc3LDYgQEAKICAgICAgICAgZXhlY3V0ZSgiQUxURVIgVEFCTEUgJXMgQUREIGFsaXN0IGxpc3Q8dGV4dD4iKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBNaWdyYXRlZCBmcm9tIGNxbF90ZXN0cy5weTpUZXN0Q1FMLmNvbGxlY3Rpb25fZnVuY3Rpb25fdGVzdCgpCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RnVuY3Rpb25zT25Db2xsZWN0aW9ucygpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCBsIHNldDxpbnQ+KSIpOwotCi0gICAgICAgIGFzc2VydEludmFsaWQoIlNFTEVDVCB0dGwobCkgRlJPTSAlcyBXSEVSRSBrID0gMCIpOwotICAgICAgICBhc3NlcnRJbnZhbGlkKCJTRUxFQ1Qgd3JpdGV0aW1lKGwpIEZST00gJXMgV0hFUkUgayA9IDAiKTsKLSAgICB9Ci0KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RJblJlc3RyaWN0aW9uV2l0aENvbGxlY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9Gcm96ZW5Db2xsZWN0aW9uc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvRnJvemVuQ29sbGVjdGlvbnNUZXN0LmphdmEKaW5kZXggNWNiZmI0Yy4uYzRjZGNhMSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9Gcm96ZW5Db2xsZWN0aW9uc1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL0Zyb3plbkNvbGxlY3Rpb25zVGVzdC5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2VydmVyVGVzdFV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMucmVzdHJpY3Rpb25zLlN0YXRlbWVudFJlc3RyaWN0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7CkBAIC00Myw2ICs0NCw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwQ2xhc3MoKSAgICAgLy8gb3ZlcnJpZGVzIENRTFRlc3Rlci5zZXRVcENsYXNzKCkKICAgICB7CisgICAgICAgIFNlcnZlclRlc3RVdGlscy5kYWVtb25Jbml0aWFsaXphdGlvbigpOwogICAgICAgICAvLyBTZWxlY3RpbmcgcGFydGl0aW9uZXIgZm9yIGEgdGFibGUgaXMgbm90IGV4cG9zZWQgb24gQ1JFQVRFIFRBQkxFLgogICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5zZXRQYXJ0aXRpb25lclVuc2FmZShCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLmluc3RhbmNlKTsKIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9Kc29uVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9Kc29uVGVzdC5qYXZhCmluZGV4IDgxMGVlNWEuLmY5N2I0ZmEgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvSnNvblRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL0pzb25UZXN0LmphdmEKQEAgLTE3LDggKzE3LDggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnZhbGlkYXRpb24uZW50aXRpZXM7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkpzb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5EdXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlVudHlwZWRSZXN1bHRTZXQ7CkBAIC0yOCw2ICsyOCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuVGltZVNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Kc29uVXRpbHM7CiAKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKQEAgLTQ2LDEwICs0NywxMSBAQAogCiBwdWJsaWMgY2xhc3MgSnNvblRlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKIHsKLSAgICAvLyBUaGlzIG1ldGhvZCB3aWxsIGJlIHJhbiBpbnN0ZWFkIG9mIHRoZSBDUUxUZXN0ZXIjc2V0VXBDbGFzcworICAgIC8vIFRoaXMgbWV0aG9kIHdpbGwgYmUgcnVuIGluc3RlYWQgb2YgdGhlIENRTFRlc3RlciNzZXRVcENsYXNzCiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwQ2xhc3MoKQogICAgIHsKKyAgICAgICAgU2VydmVyVGVzdFV0aWxzLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CiAgICAgICAgIGlmIChST1dfQ0FDSEVfU0laRV9JTl9NSUIgPiAwKQogICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFJvd0NhY2hlU2l6ZUluTWlCKFJPV19DQUNIRV9TSVpFX0lOX01JQik7CiAKQEAgLTgwLDggKzgyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygie1wiazFcIjogW1wiIiArIHV1aWQgKyAiXCIsIDJdLCBcImMxXCI6IFtcIiIgKyB1dWlkICsgIlwiLCAzXSwgXCJ2YWx1ZVwiOiAzfSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrMVwiOiBbXCIiICsgdXVpZCArICJcIiwgMl0sIFwiYzFcIjogW1wiIiArIHV1aWQgKyAiXCIsIDRdLCBcInZhbHVlXCI6IDR9IikpOwogCi0gICAgICAgICAgICAvLyBTRUxFQ1QgdG9Kc29uKGNvbHVtbikKLSAgICAgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldFdpdGhQYWdpbmcoIlNFTEVDVCB0b0pzb24oazEpLCB0b0pzb24oYzEpLCB0b0pzb24odmFsdWUpIEZST00gJXMiLCBwYWdlU2l6ZSksCisgICAgICAgICAgICAvLyBTRUxFQ1QgdG9fanNvbihjb2x1bW4pCisgICAgICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRoUGFnaW5nKCJTRUxFQ1QgdG9fanNvbihrMSksIHRvX2pzb24oYzEpLCB0b19qc29uKHZhbHVlKSBGUk9NICVzIiwgcGFnZVNpemUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICByb3coIltcIiIgKyB1dWlkICsgIlwiLCAyXSIsICJbXCIiICsgdXVpZCArICJcIiwgMV0iLCAiMSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICByb3coIltcIiIgKyB1dWlkICsgIlwiLCAyXSIsICJbXCIiICsgdXVpZCArICJcIiwgMl0iLCAiMiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICByb3coIltcIiIgKyB1dWlkICsgIlwiLCAyXSIsICJbXCIiICsgdXVpZCArICJcIiwgM10iLCAiMyIpLApAQCAtMTEwLDggKzExMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygie1wiazFcIjoge1wiMVwiOiBbXCIiICsgdXVpZCArICJcIiwgMV0sIFwiMlwiOiBbXCIiICsgdXVpZCArICJcIiwgMl19LCBcImMxXCI6IFtcIiIgKyB1dWlkICsgIlwiLCAzXSwgXCJ2YWx1ZVwiOiAzfSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICByb3coIntcImsxXCI6IHtcIjFcIjogW1wiIiArIHV1aWQgKyAiXCIsIDFdLCBcIjJcIjogW1wiIiArIHV1aWQgKyAiXCIsIDJdfSwgXCJjMVwiOiBbXCIiICsgdXVpZCArICJcIiwgNF0sIFwidmFsdWVcIjogNH0iKSk7CiAKLSAgICAgICAgICAgIC8vIFNFTEVDVCB0b0pzb24oY29sdW1uKQotICAgICAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0V2l0aFBhZ2luZygiU0VMRUNUIHRvSnNvbihrMSksIHRvSnNvbihjMSksIHRvSnNvbih2YWx1ZSkgRlJPTSAlcyIsIHBhZ2VTaXplKSwKKyAgICAgICAgICAgIC8vIFNFTEVDVCB0b19qc29uKGNvbHVtbikKKyAgICAgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldFdpdGhQYWdpbmcoIlNFTEVDVCB0b19qc29uKGsxKSwgdG9fanNvbihjMSksIHRvX2pzb24odmFsdWUpIEZST00gJXMiLCBwYWdlU2l6ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygie1wiMVwiOiBbXCIiICsgdXVpZCArICJcIiwgMV0sIFwiMlwiOiBbXCIiICsgdXVpZCArICJcIiwgMl19IiwgIltcIiIgKyB1dWlkICsgIlwiLCAxXSIsICIxIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygie1wiMVwiOiBbXCIiICsgdXVpZCArICJcIiwgMV0sIFwiMlwiOiBbXCIiICsgdXVpZCArICJcIiwgMl19IiwgIltcIiIgKyB1dWlkICsgIlwiLCAyXSIsICIyIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygie1wiMVwiOiBbXCIiICsgdXVpZCArICJcIiwgMV0sIFwiMlwiOiBbXCIiICsgdXVpZCArICJcIiwgMl19IiwgIltcIiIgKyB1dWlkICsgIlwiLCAzXSIsICIzIiksCkBAIC0xNDAsOCArMTQyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrMVwiOiBbW1sxLCAyXSwgMV0sIFtbMiwgM10sIDJdXSwgXCJjMVwiOiBbXCIiICsgdXVpZCArICJcIiwgM10sIFwidmFsdWVcIjogM30iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrMVwiOiBbW1sxLCAyXSwgMV0sIFtbMiwgM10sIDJdXSwgXCJjMVwiOiBbXCIiICsgdXVpZCArICJcIiwgNF0sIFwidmFsdWVcIjogNH0iKSk7CiAKLSAgICAgICAgICAgIC8vIFNFTEVDVCB0b0pzb24oY29sdW1uKQotICAgICAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0V2l0aFBhZ2luZygiU0VMRUNUIHRvSnNvbihrMSksIHRvSnNvbihjMSksIHRvSnNvbih2YWx1ZSkgRlJPTSAlcyIsIHBhZ2VTaXplKSwKKyAgICAgICAgICAgIC8vIFNFTEVDVCB0b19qc29uKGNvbHVtbikKKyAgICAgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldFdpdGhQYWdpbmcoIlNFTEVDVCB0b19qc29uKGsxKSwgdG9fanNvbihjMSksIHRvX2pzb24odmFsdWUpIEZST00gJXMiLCBwYWdlU2l6ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygiW1tbMSwgMl0sIDFdLCBbWzIsIDNdLCAyXV0iLCAiW1wiIiArIHV1aWQgKyAiXCIsIDFdIiwgIjEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KCJbW1sxLCAyXSwgMV0sIFtbMiwgM10sIDJdXSIsICJbXCIiICsgdXVpZCArICJcIiwgMl0iLCAiMiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICByb3coIltbWzEsIDJdLCAxXSwgW1syLCAzXSwgMl1dIiwgIltcIiIgKyB1dWlkICsgIlwiLCAzXSIsICIzIiksCkBAIC0xNzAsOCArMTcyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICByb3coIntcImsxXCI6IFtbXCIiICsgdXVpZCArICJcIiwgMl0sIFtcIiIgKyB1dWlkICsgIlwiLCAzXV0sIFwiYzFcIjogW1wiIiArIHV1aWQgKyAiXCIsIDNdLCBcInZhbHVlXCI6IDN9IiksCiAgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrMVwiOiBbW1wiIiArIHV1aWQgKyAiXCIsIDJdLCBbXCIiICsgdXVpZCArICJcIiwgM11dLCBcImMxXCI6IFtcIiIgKyB1dWlkICsgIlwiLCA0XSwgXCJ2YWx1ZVwiOiA0fSIpKTsKIAotICAgICAgICAvLyBTRUxFQ1QgdG9Kc29uKGNvbHVtbikKLSAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0V2l0aFBhZ2luZygiU0VMRUNUIHRvSnNvbihrMSksIHRvSnNvbihjMSksIHRvSnNvbih2YWx1ZSkgRlJPTSAlcyIsIHBhZ2VTaXplKSwKKyAgICAgICAgLy8gU0VMRUNUIHRvX2pzb24oY29sdW1uKQorICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRoUGFnaW5nKCJTRUxFQ1QgdG9fanNvbihrMSksIHRvX2pzb24oYzEpLCB0b19qc29uKHZhbHVlKSBGUk9NICVzIiwgcGFnZVNpemUpLAogICAgICAgICAgICAgICAgICAgICAgIHJvdygiW1tcIiIgKyB1dWlkICsgIlwiLCAyXSwgW1wiIiArIHV1aWQgKyAiXCIsIDNdXSIsICJbXCIiICsgdXVpZCArICJcIiwgMV0iLCAiMSIpLAogICAgICAgICAgICAgICAgICAgICAgIHJvdygiW1tcIiIgKyB1dWlkICsgIlwiLCAyXSwgW1wiIiArIHV1aWQgKyAiXCIsIDNdXSIsICJbXCIiICsgdXVpZCArICJcIiwgMl0iLCAiMiIpLAogICAgICAgICAgICAgICAgICAgICAgIHJvdygiW1tcIiIgKyB1dWlkICsgIlwiLCAyXSwgW1wiIiArIHV1aWQgKyAiXCIsIDNdXSIsICJbXCIiICsgdXVpZCArICJcIiwgM10iLCAiMyIpLApAQCAtMjAyLDggKzIwNCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygie1wiazFcIjoge1wiYVwiOiAxLCBcImJcIjogMiwgXCJjXCI6IFtcIjFcIiwgXCIyXCJdfSwgXCJjMVwiOiBbXCIiICsgdXVpZCArICJcIiwgM10sIFwidmFsdWVcIjogM30iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrMVwiOiB7XCJhXCI6IDEsIFwiYlwiOiAyLCBcImNcIjogW1wiMVwiLCBcIjJcIl19LCBcImMxXCI6IFtcIiIgKyB1dWlkICsgIlwiLCA0XSwgXCJ2YWx1ZVwiOiA0fSIpKTsKIAotICAgICAgICAgICAgLy8gU0VMRUNUIHRvSnNvbihjb2x1bW4pCi0gICAgICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRoUGFnaW5nKCJTRUxFQ1QgdG9Kc29uKGsxKSwgdG9Kc29uKGMxKSwgdG9Kc29uKHZhbHVlKSBGUk9NICVzIiwgcGFnZVNpemUpLAorICAgICAgICAgICAgLy8gU0VMRUNUIHRvX2pzb24oY29sdW1uKQorICAgICAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0V2l0aFBhZ2luZygiU0VMRUNUIHRvX2pzb24oazEpLCB0b19qc29uKGMxKSwgdG9fanNvbih2YWx1ZSkgRlJPTSAlcyIsIHBhZ2VTaXplKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJhXCI6IDEsIFwiYlwiOiAyLCBcImNcIjogW1wiMVwiLCBcIjJcIl19IiwgIltcIiIgKyB1dWlkICsgIlwiLCAxXSIsICIxIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygie1wiYVwiOiAxLCBcImJcIjogMiwgXCJjXCI6IFtcIjFcIiwgXCIyXCJdfSIsICJbXCIiICsgdXVpZCArICJcIiwgMl0iLCAiMiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICByb3coIntcImFcIjogMSwgXCJiXCI6IDIsIFwiY1wiOiBbXCIxXCIsIFwiMlwiXX0iLCAiW1wiIiArIHV1aWQgKyAiXCIsIDNdIiwgIjMiKSwKQEAgLTI0Niw0NjggKzI0OCw0NjggQEAKICAgICAgICAgICAgICAgICAidWR0dmFsIGZyb3plbjwiICsgdHlwZU5hbWUgKyAiPiwiICsKICAgICAgICAgICAgICAgICAiZHVyYXRpb252YWwgZHVyYXRpb24pIik7CiAKLSAgICAgICAgLy8gZnJvbUpzb24oKSBjYW4gb25seSBiZSB1c2VkIHdoZW4gdGhlIHJlY2VpdmVyIHR5cGUgaXMga25vd24KLSAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoImZyb21Kc29uKCkgY2Fubm90IGJlIHVzZWQgaW4gdGhlIHNlbGVjdGlvbiBjbGF1c2UiLCAiU0VMRUNUIGZyb21Kc29uKGFzY2lpdmFsKSBGUk9NICVzIiwgMCwgMCk7CisgICAgICAgIC8vIGZyb21fanNvbigpIGNhbiBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgcmVjZWl2ZXIgdHlwZSBpcyBrbm93bgorICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiZnJvbV9qc29uKCkgY2Fubm90IGJlIHVzZWQgaW4gdGhlIHNlbGVjdGlvbiBjbGF1c2UiLCAiU0VMRUNUIGZyb21fanNvbih0ZXh0dmFsKSBGUk9NICVzIiwgMCwgMCk7CiAKICAgICAgICAgU3RyaW5nIGZ1bmMxID0gY3JlYXRlRnVuY3Rpb24oS0VZU1BBQ0UsICJpbnQiLCAiQ1JFQVRFIEZVTkNUSU9OICVzIChhIGludCkgQ0FMTEVEIE9OIE5VTEwgSU5QVVQgUkVUVVJOUyB0ZXh0IExBTkdVQUdFIGphdmEgQVMgJCQgcmV0dXJuIGEudG9TdHJpbmcoKTsgJCQiKTsKICAgICAgICAgY3JlYXRlRnVuY3Rpb25PdmVybG9hZChmdW5jMSwgImludCIsICJDUkVBVEUgRlVOQ1RJT04gJXMgKGEgdGV4dCkgQ0FMTEVEIE9OIE5VTEwgSU5QVVQgUkVUVVJOUyB0ZXh0IExBTkdVQUdFIGphdmEgQVMgJCQgcmV0dXJuIG5ldyBTdHJpbmcoYSk7ICQkIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkFtYmlndW91cyBjYWxsIHRvIGZ1bmN0aW9uIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRleHR2YWwpIFZBTFVFUyAoPywgIiArIGZ1bmMxICsgIihmcm9tSnNvbig/KSkpIiwgMCwgIjEyMyIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdGV4dHZhbCkgVkFMVUVTICg/LCAiICsgZnVuYzEgKyAiKGZyb21fanNvbig/KSkpIiwgMCwgIjEyMyIpOwogCiAgICAgICAgIC8vIGZhaWxzIEpTT04gcGFyc2luZwogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiQ291bGQgbm90IGRlY29kZSBKU09OIHN0cmluZyAnXHUwMzhFXHUwMzk0XHUwM0I0XHUwM0UwJyIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBhc2NpaXZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXHUwMzhFXHUwMzk0XHUwM0I0XHUwM0UwIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBhc2NpaXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlx1MDM4RVx1MDM5NFx1MDNCNFx1MDNFMCIpOwogCiAgICAgICAgIC8vIGhhbmRsZSBudWxscwotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYXNjaWl2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgbnVsbCk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBhc2NpaXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgbnVsbCk7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG51bGwpKTsKIAotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVubWFwdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsIG51bGwpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVubWFwdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCBudWxsKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZnJvemVubWFwdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG51bGwpKTsKIAotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdWR0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsIG51bGwpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdWR0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCBudWxsKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdWR0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG51bGwpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IGFzY2lpID09PT09PT09PT09PT09PT0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGFzY2lpdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcImFzY2lpIHRleHRcIiIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYXNjaWl2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcImFzY2lpIHRleHRcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKIAotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYXNjaWl2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiYXNjaWkgXFxcIiB0ZXh0XCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGFzY2lpdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCJhc2NpaSBcXFwiIHRleHRcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiYXNjaWkgXCIgdGV4dCIpKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiSW52YWxpZCBBU0NJSSBjaGFyYWN0ZXIgaW4gc3RyaW5nIGxpdGVyYWwiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYXNjaWl2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiXFx1MWZmZlxcdTIwMTNcXHUzM0I0XFx1MjAxNFwiIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBhc2NpaXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiXFx1MWZmZlxcdTIwMTNcXHUzM0I0XFx1MjAxNFwiIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkV4cGVjdGVkIGFuIGFzY2lpIHN0cmluZywgYnV0IGdvdCBhIEludGVnZXIiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYXNjaWl2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIjEyMyIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYXNjaWl2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMiKTsKIAotICAgICAgICAvLyB0ZXN0IHRoYXQgd2UgY2FuIHVzZSBmcm9tSnNvbigpIGluIG90aGVyIHZhbGlkIHBsYWNlcyBpbiBxdWVyaWVzCi0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGFzY2lpdmFsIEZST00gJXMgV0hFUkUgayA9IGZyb21Kc29uKD8pIiwgIjAiKSwgcm93KCJhc2NpaSBcIiB0ZXh0IikpOwotICAgICAgICBleGVjdXRlKCJVUERBVEUgJXMgU0VUIGFzY2lpdmFsID0gZnJvbUpzb24oPykgV0hFUkUgayA9IGZyb21Kc29uKD8pIiwgIlwiYXNjaWkgXFxcIiB0ZXh0XCIiLCAiMCIpOwotICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrID0gZnJvbUpzb24oPykiLCAiMCIpOworICAgICAgICAvLyB0ZXN0IHRoYXQgd2UgY2FuIHVzZSBmcm9tX2pzb24oKSBpbiBvdGhlciB2YWxpZCBwbGFjZXMgaW4gcXVlcmllcworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBhc2NpaXZhbCBGUk9NICVzIFdIRVJFIGsgPSBmcm9tX2pzb24oPykiLCAiMCIpLCByb3coImFzY2lpIFwiIHRleHQiKSk7CisgICAgICAgIGV4ZWN1dGUoIlVQREFURSAlcyBTRVQgYXNjaWl2YWwgPSBmcm9tX2pzb24oPykgV0hFUkUgayA9IGZyb21fanNvbig/KSIsICJcImFzY2lpIFxcXCIgdGV4dFwiIiwgIjAiKTsKKyAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgayA9IGZyb21fanNvbig/KSIsICIwIik7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBiaWdpbnQgPT09PT09PT09PT09PT09PQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYmlnaW50dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjMxMjMxMjMxMjMiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGJpZ2ludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIjEyMzEyMzEyMzEyMyIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBiaWdpbnR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgMTIzMTIzMTIzMTIzTCkpOwogCiAgICAgICAgIC8vIHN0cmluZ3MgYXJlIGFsc28gYWNjZXB0ZWQKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGJpZ2ludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCIxMjMxMjMxMjMxMjNcIiIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYmlnaW50dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCIxMjMxMjMxMjMxMjNcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBiaWdpbnR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgMTIzMTIzMTIzMTIzTCkpOwogCiAgICAgICAgIC8vIG92ZXJmbG93IChMb25nLk1BWF9WQUxVRSArIDEpCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJFeHBlY3RlZCBhIGJpZ2ludCB2YWx1ZSwgYnV0IGdvdCBhIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGJpZ2ludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiOTIyMzM3MjAzNjg1NDc3NTgwOCIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYmlnaW50dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiOTIyMzM3MjAzNjg1NDc3NTgwOCIpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJFeHBlY3RlZCBhIGJpZ2ludCB2YWx1ZSwgYnV0IGdvdCBhIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGJpZ2ludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzLjQ1NiIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYmlnaW50dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzLjQ1NiIpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJVbmFibGUgdG8gbWFrZSBsb25nIGZyb20iLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYmlnaW50dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcImFiY1wiIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBiaWdpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcImFiY1wiIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkV4cGVjdGVkIGEgYmlnaW50IHZhbHVlLCBidXQgZ290IGEiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYmlnaW50dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJbXCJhYmNcIl0iKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGJpZ2ludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIltcImFiY1wiXSIpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gYmxvYiA9PT09PT09PT09PT09PT09Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBibG9idmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjB4MDAwMDAwMDFcIiIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYmxvYnZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiMHgwMDAwMDAwMVwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGJsb2J2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoMSkpKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVmFsdWUgJ3h5enonIGlzIG5vdCBhIHZhbGlkIGJsb2IgcmVwcmVzZW50YXRpb24iLAotICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBibG9idmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcInh5enpcIiIpOworICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBibG9idmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCJ4eXp6XCIiKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGJsb2IgaXMgbWlzc2luZyAweCBwcmVmaXg6IDEyMyIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBibG9idmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjEyM1wiIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBibG9idmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCIxMjNcIiIpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJWYWx1ZSAnMHgxMjMnIGlzIG5vdCBhIHZhbGlkIGJsb2IgcmVwcmVzZW50YXRpb24iLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYmxvYnZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCIweDEyM1wiIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBibG9idmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCIweDEyM1wiIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlZhbHVlICcxMjMnIGlzIG5vdCBhIHZhbGlkIGJsb2IgcmVwcmVzZW50YXRpb24iLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYmxvYnZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBibG9idmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzIik7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBib29sZWFuID09PT09PT09PT09PT09PT0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGJvb2xlYW52YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgInRydWUiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGJvb2xlYW52YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJ0cnVlIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGJvb2xlYW52YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgdHJ1ZSkpOwogCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBib29sZWFudmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJmYWxzZSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYm9vbGVhbnZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgImZhbHNlIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGJvb2xlYW52YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgZmFsc2UpKTsKIAogICAgICAgICAvLyBzdHJpbmdzIGFyZSBhbHNvIGFjY2VwdGVkCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBib29sZWFudmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcImZhbHNlXCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGJvb2xlYW52YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcImZhbHNlXCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYm9vbGVhbnZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBmYWxzZSkpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJVbmFibGUgdG8gbWFrZSBib29sZWFuIGZyb20iLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYm9vbGVhbnZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCJhYmNcIiIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYm9vbGVhbnZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiYWJjXCIiKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiRXhwZWN0ZWQgYSBib29sZWFuIHZhbHVlLCBidXQgZ290IGEgSW50ZWdlciIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBib29sZWFudmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjMiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGJvb2xlYW52YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMiKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IGRhdGUgPT09PT09PT09PT09PT09PQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZGF0ZXZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCIxOTg3LTAzLTIzXCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGRhdGV2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjE5ODctMDMtMjNcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBkYXRldmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIFNpbXBsZURhdGVTZXJpYWxpemVyLmRhdGVTdHJpbmdUb0RheXMoIjE5ODctMDMtMjMiKSkpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJFeHBlY3RlZCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGRhdGUiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgZGF0ZXZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBkYXRldmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlVuYWJsZSB0byBjb2VyY2UgJ3h5eicgdG8gYSBmb3JtYXR0ZWQgZGF0ZSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBkYXRldmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcInh5elwiIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBkYXRldmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCJ4eXpcIiIpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gZGVjaW1hbCA9PT09PT09PT09PT09PT09Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBkZWNpbWFsdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjMxMjMuMTIzMTIzIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBkZWNpbWFsdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzMTIzLjEyMzEyMyIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBkZWNpbWFsdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG5ldyBCaWdEZWNpbWFsKCIxMjMxMjMuMTIzMTIzIikpKTsKIAotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZGVjaW1hbHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzMTIzIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBkZWNpbWFsdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzMTIzIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGRlY2ltYWx2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbmV3IEJpZ0RlY2ltYWwoIjEyMzEyMyIpKSk7CiAKICAgICAgICAgLy8gYWNjZXB0IHN0cmluZ3MgZm9yIG51bWJlcnMgdGhhdCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXMgZG91YmxlcwotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZGVjaW1hbHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCIxMjMxMjMuMTIzMTIzXCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGRlY2ltYWx2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjEyMzEyMy4xMjMxMjNcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBkZWNpbWFsdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG5ldyBCaWdEZWNpbWFsKCIxMjMxMjMuMTIzMTIzIikpKTsKIAotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZGVjaW1hbHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCItMS4yM0UtMTJcIiIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZGVjaW1hbHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiLTEuMjNFLTEyXCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZGVjaW1hbHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBuZXcgQmlnRGVjaW1hbCgiLTEuMjNFLTEyIikpKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVmFsdWUgJ3h5enonIGlzIG5vdCBhIHZhbGlkIHJlcHJlc2VudGF0aW9uIG9mIGEgZGVjaW1hbCB2YWx1ZSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBkZWNpbWFsdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcInh5enpcIiIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgZGVjaW1hbHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwieHl6elwiIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlZhbHVlICd0cnVlJyBpcyBub3QgYSB2YWxpZCByZXByZXNlbnRhdGlvbiBvZiBhIGRlY2ltYWwgdmFsdWUiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgZGVjaW1hbHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAidHJ1ZSIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgZGVjaW1hbHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgInRydWUiKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IGRvdWJsZSA9PT09PT09PT09PT09PT09Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBkb3VibGV2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIjEyMzEyMy4xMjMxMjMiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGRvdWJsZXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIjEyMzEyMy4xMjMxMjMiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZG91YmxldmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIDEyMzEyMy4xMjMxMjNkKSk7CiAKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGRvdWJsZXZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzMTIzIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBkb3VibGV2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMxMjMiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZG91YmxldmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIDEyMzEyMy4wZCkpOwogCiAgICAgICAgIC8vIHN0cmluZ3MgYXJlIGFsc28gYWNjZXB0ZWQKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGRvdWJsZXZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCIxMjMxMjNcIiIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZG91YmxldmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCIxMjMxMjNcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBkb3VibGV2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgMTIzMTIzLjBkKSk7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlVuYWJsZSB0byBtYWtlIGRvdWJsZSBmcm9tIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGRvdWJsZXZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCJ4eXp6XCIiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGRvdWJsZXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwieHl6elwiIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkV4cGVjdGVkIGEgZG91YmxlIHZhbHVlLCBidXQgZ290IiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGRvdWJsZXZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAidHJ1ZSIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgZG91YmxldmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAidHJ1ZSIpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gZmxvYXQgPT09PT09PT09PT09PT09PQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZmxvYXR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIjEyMzEyMy4xMjMxMjMiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGZsb2F0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzMTIzLjEyMzEyMyIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmbG9hdHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAxMjMxMjMuMTIzMTIzZikpOwogCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmbG9hdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzMTIzIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmbG9hdHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIjEyMzEyMyIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmbG9hdHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAxMjMxMjMuMGYpKTsKIAogICAgICAgICAvLyBzdHJpbmdzIGFyZSBhbHNvIGFjY2VwdGVkCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmbG9hdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCIxMjMxMjMuMFwiIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmbG9hdHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiMTIzMTIzLjBcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmbG9hdHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAxMjMxMjMuMGYpKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVW5hYmxlIHRvIG1ha2UgZmxvYXQgZnJvbSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBmbG9hdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCJ4eXp6XCIiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGZsb2F0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCJ4eXp6XCIiKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiRXhwZWN0ZWQgYSBmbG9hdCB2YWx1ZSwgYnV0IGdvdCBhIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGZsb2F0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ0cnVlIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBmbG9hdHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgInRydWUiKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IGluZXQgPT09PT09PT09PT09PT09PQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgaW5ldHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCIxMjcuMC4wLjFcIiIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgaW5ldHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiMTI3LjAuMC4xXCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgaW5ldHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoIjEyNy4wLjAuMSIpKSk7CiAKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGluZXR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiOjoxXCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGluZXR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjo6MVwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGluZXR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCI6OjEiKSkpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJVbmFibGUgdG8gbWFrZSBpbmV0IGFkZHJlc3MgZnJvbSAneHl6eiciLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgaW5ldHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCJ4eXp6XCIiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGluZXR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcInh5enpcIiIpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJFeHBlY3RlZCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBpbmV0IHZhbHVlLCBidXQgZ290IGEgSW50ZWdlciIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBpbmV0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjMiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGluZXR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMiKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IGludCA9PT09PT09PT09PT09PT09Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBpbnR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIjEyMzEyMyIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgaW50dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzMTIzIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGludHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAxMjMxMjMpKTsKIAogICAgICAgICAvLyBzdHJpbmdzIGFyZSBhbHNvIGFjY2VwdGVkCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBpbnR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiMTIzMTIzXCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiMTIzMTIzXCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgaW50dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIDEyMzEyMykpOwogCiAgICAgICAgIC8vIGludCBvdmVyZmxvdyAoMiBeIDMyLCBvciBJbnRlZ2VyLk1BWF9JTlQgKyAxKQogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiRXhwZWN0ZWQgYW4gaW50IHZhbHVlLCBidXQgZ290IGEiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgaW50dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIyMTQ3NDgzNjQ4Iik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIyMTQ3NDgzNjQ4Iik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkV4cGVjdGVkIGFuIGludCB2YWx1ZSwgYnV0IGdvdCBhIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzLjQ1NiIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgaW50dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzLjQ1NiIpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJVbmFibGUgdG8gbWFrZSBpbnQgZnJvbSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBpbnR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwieHl6elwiIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcInh5enpcIiIpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJFeHBlY3RlZCBhbiBpbnQgdmFsdWUsIGJ1dCBnb3QgYSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBpbnR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgInRydWUiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgInRydWUiKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IHNtYWxsaW50ID09PT09PT09PT09PT09PT0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHNtYWxsaW50dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIzMjc2NyIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgc21hbGxpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIzMjc2NyIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBzbWFsbGludHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAoc2hvcnQpIDMyNzY3KSk7CiAKICAgICAgICAgLy8gc3RyaW5ncyBhcmUgYWxzbyBhY2NlcHRlZAotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgc21hbGxpbnR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiMzI3NjdcIiIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgc21hbGxpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjMyNzY3XCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1Qgaywgc21hbGxpbnR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgKHNob3J0KSAzMjc2NykpOwogCiAgICAgICAgIC8vIHNtYWxsaW50IG92ZXJmbG93IChTaG9ydC5NQVhfVkFMVUUgKyAxKQogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVW5hYmxlIHRvIG1ha2Ugc2hvcnQgZnJvbSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBzbWFsbGludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMzI3NjgiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHNtYWxsaW50dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMzI3NjgiKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVW5hYmxlIHRvIG1ha2Ugc2hvcnQgZnJvbSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBzbWFsbGludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzLjQ1NiIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgc21hbGxpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMuNDU2Iik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlVuYWJsZSB0byBtYWtlIHNob3J0IGZyb20iLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgc21hbGxpbnR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwieHl6elwiIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBzbWFsbGludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwieHl6elwiIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkV4cGVjdGVkIGEgc2hvcnQgdmFsdWUsIGJ1dCBnb3QgYSBCb29sZWFuIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHNtYWxsaW50dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ0cnVlIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBzbWFsbGludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgInRydWUiKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IHRpbnlpbnQgPT09PT09PT09PT09PT09PQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGlueWludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTI3Iik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0aW55aW50dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTI3Iik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRpbnlpbnR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgKGJ5dGUpIDEyNykpOwogCiAgICAgICAgIC8vIHN0cmluZ3MgYXJlIGFsc28gYWNjZXB0ZWQKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRpbnlpbnR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiMTI3XCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRpbnlpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjEyN1wiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRpbnlpbnR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgKGJ5dGUpIDEyNykpOwogCiAgICAgICAgIC8vIHRpbnlpbnQgb3ZlcmZsb3cgKEJ5dGUuTUFYX1ZBTFVFICsgMSkKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlVuYWJsZSB0byBtYWtlIGJ5dGUgZnJvbSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCB0aW55aW50dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjgiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRpbnlpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjgiKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVW5hYmxlIHRvIG1ha2UgYnl0ZSBmcm9tIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRpbnlpbnR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIjEyMy40NTYiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRpbnlpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMuNDU2Iik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlVuYWJsZSB0byBtYWtlIGJ5dGUgZnJvbSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCB0aW55aW50dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcInh5enpcIiIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdGlueWludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwieHl6elwiIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkV4cGVjdGVkIGEgYnl0ZSB2YWx1ZSwgYnV0IGdvdCBhIEJvb2xlYW4iLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdGlueWludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAidHJ1ZSIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdGlueWludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgInRydWUiKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IHRleHQgKHZhcmNoYXIpID09PT09PT09PT09PT09PT0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRleHR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiXCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRleHR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIlwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRleHR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIiIpKTsKIAotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGV4dHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCJhYmNkXCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRleHR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcImFiY2RcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0ZXh0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJhYmNkIikpOwogCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0ZXh0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcInNvbWUgXFxcIiB0ZXh0XCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRleHR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcInNvbWUgXFxcIiB0ZXh0XCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAic29tZSBcIiB0ZXh0IikpOwogCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0ZXh0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIlxcdTIwMTNcIiIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGV4dHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiXFx1MjAxM1wiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRleHR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlx1MjAxMyIpKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiRXhwZWN0ZWQgYSBVVEYtOCBzdHJpbmcsIGJ1dCBnb3QgYSBJbnRlZ2VyIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRleHR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIjEyMyIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdGV4dHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIjEyMyIpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gdGltZSA9PT09PT09PT09PT09PT09Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0aW1ldmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjA3OjM1OjA3LjAwMDExMTIyMlwiIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0aW1ldmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCIwNzozNTowNy4wMDAxMTEyMjJcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0aW1ldmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIFRpbWVTZXJpYWxpemVyLnRpbWVTdHJpbmdUb0xvbmcoIjA3OjM1OjA3LjAwMDExMTIyMiIpKSk7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkV4cGVjdGVkIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgdGltZSB2YWx1ZSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCB0aW1ldmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjM0NTYiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRpbWV2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjM0NTYiKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVW5hYmxlIHRvIGNvZXJjZSAneHl6JyB0byBhIGZvcm1hdHRlZCB0aW1lIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRpbWV2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwieHl6XCIiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRpbWV2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcInh5elwiIik7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSB0aW1lc3RhbXAgPT09PT09PT09PT09PT09PQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXN0YW1wdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjMxMjMxMjMxMjMiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRpbWVzdGFtcHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIjEyMzEyMzEyMzEyMyIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0aW1lc3RhbXB2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbmV3IERhdGUoMTIzMTIzMTIzMTIzTCkpKTsKIAotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXN0YW1wdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjIwMTQtMDEtMDFcIiIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXN0YW1wdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCIyMDE0LTAxLTAxXCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGltZXN0YW1wdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5LU0tZCIpLnBhcnNlKCIyMDE0LTAxLTAxIikpKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiRXhwZWN0ZWQgYSBsb25nIG9yIGEgZGF0ZXN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHRpbWVzdGFtcCB2YWx1ZSwgYnV0IGdvdCBhIERvdWJsZSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCB0aW1lc3RhbXB2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIjEyMy40NTYiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRpbWVzdGFtcHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIjEyMy40NTYiKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVW5hYmxlIHRvIHBhcnNlIGEgZGF0ZS90aW1lIGZyb20gJ2FiY2QnIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRpbWVzdGFtcHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCJhYmNkXCIiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRpbWVzdGFtcHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiYWJjZFwiIik7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSB0aW1ldXVpZCA9PT09PT09PT09PT09PT09Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0aW1ldXVpZHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXV1aWR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRpbWV1dWlkdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKTsKIAotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXV1aWR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiNkJEREM4OUEtNTY0NC0xMUU0LTk3RkMtNTY4NDdBRkU5Nzk5XCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRpbWV1dWlkdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCI2QkREQzg5QS01NjQ0LTExRTQtOTdGQy01Njg0N0FGRTk3OTlcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0aW1ldXVpZHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKSk7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlRpbWVVVUlEIHN1cHBvcnRzIG9ubHkgdmVyc2lvbiAxIFVVSURzIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRpbWV1dWlkdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCB0aW1ldXVpZHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIiKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiRXhwZWN0ZWQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB0aW1ldXVpZCwgYnV0IGdvdCBhIEludGVnZXIiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXV1aWR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIjEyMyIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXV1aWR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMiKTsKIAogICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSB1dWlkdmFsID09PT09PT09PT09PT09PT0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHV1aWR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHV1aWR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHV1aWR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTkiKSkpOwogCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB1dWlkdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjZCRERDODlBLTU2NDQtMTFFNC05N0ZDLTU2ODQ3QUZFOTc5OVwiIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB1dWlkdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCI2QkREQzg5QS01NjQ0LTExRTQtOTdGQy01Njg0N0FGRTk3OTlcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB1dWlkdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVW5hYmxlIHRvIG1ha2UgVVVJRCBmcm9tIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHV1aWR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiMDAwMDAwMDAtMDAwMC0wMDAwLXp6enotMDAwMDAwMDAwMDAwXCIiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHV1aWR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjAwMDAwMDAwLTAwMDAtMDAwMC16enp6LTAwMDAwMDAwMDAwMFwiIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkV4cGVjdGVkIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgdXVpZCwgYnV0IGdvdCBhIEludGVnZXIiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdXVpZHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCB1dWlkdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzIik7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSB2YXJpbnQgPT09PT09PT09PT09PT09PQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdmFyaW50dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjMxMjMxMjMxMjMiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHZhcmludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIjEyMzEyMzEyMzEyMyIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB2YXJpbnR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbmV3IEJpZ0ludGVnZXIoIjEyMzEyMzEyMzEyMyIpKSk7CiAKICAgICAgICAgLy8gYWNjZXB0IHN0cmluZ3MgZm9yIG51bWJlcnMgdGhhdCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXMgbG9uZ3MKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHZhcmludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwXCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHZhcmludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MFwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHZhcmludHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBuZXcgQmlnSW50ZWdlcigiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIpKSk7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlZhbHVlICcxMjMxMjMuMTIzJyBpcyBub3QgYSB2YWxpZCByZXByZXNlbnRhdGlvbiBvZiBhIHZhcmludCB2YWx1ZSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCB2YXJpbnR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIjEyMzEyMy4xMjMiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHZhcmludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIjEyMzEyMy4xMjMiKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVmFsdWUgJ3h5enonIGlzIG5vdCBhIHZhbGlkIHJlcHJlc2VudGF0aW9uIG9mIGEgdmFyaW50IHZhbHVlIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHZhcmludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCJ4eXp6XCIiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHZhcmludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwieHl6elwiIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlZhbHVlICcnIGlzIG5vdCBhIHZhbGlkIHJlcHJlc2VudGF0aW9uIG9mIGEgdmFyaW50IHZhbHVlIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHZhcmludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCJcIiIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdmFyaW50dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCJcIiIpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJWYWx1ZSAndHJ1ZScgaXMgbm90IGEgdmFsaWQgcmVwcmVzZW50YXRpb24gb2YgYSB2YXJpbnQgdmFsdWUiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdmFyaW50dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ0cnVlIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCB2YXJpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJ0cnVlIik7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBsaXN0cyA9PT09PT09PT09PT09PT09Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsaXN0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJbMSwgMiwgM10iKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGxpc3R2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJbMSwgMiwgM10iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbGlzdHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBsaXN0KDEsIDIsIDMpKSk7CiAKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGxpc3R2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIltdIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsaXN0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiW10iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbGlzdHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBudWxsKSk7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkV4cGVjdGVkIGEgbGlzdCwgYnV0IGdvdCBhIEludGVnZXIiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgbGlzdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBsaXN0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlVuYWJsZSB0byBtYWtlIGludCBmcm9tIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGxpc3R2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIltcImFiY1wiXSIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgbGlzdHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIltcImFiY1wiXSIpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJJbnZhbGlkIG51bGwgZWxlbWVudCBpbiBsaXN0IiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGxpc3R2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIltudWxsXSIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgbGlzdHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIltudWxsXSIpOwogCiAgICAgICAgIC8vIGZyb3plbgotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVubGlzdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiWzEsIDIsIDNdIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5saXN0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiWzEsIDIsIDNdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGZyb3plbmxpc3R2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbGlzdCgxLCAyLCAzKSkpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gc2V0cyA9PT09PT09PT09PT09PT09Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBzZXR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwKICAgICAgICAgICAgICAgICAwLCAiW1wiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk4XCIsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCJdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHNldHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCiAgICAgICAgICAgICAgICAgcm93KDAsIHNldChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OCIpLCAoVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTkiKSkpKQogICAgICAgICApOwogCiAgICAgICAgIC8vIGR1cGxpY2F0ZXMgYXJlIG9rYXksIGp1c3QgbGlrZSBpbiBDUUwKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLAorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgc2V0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLAogICAgICAgICAgICAgICAgIDAsICJbXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OThcIiwgXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OThcIiwgXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIl0iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1Qgaywgc2V0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKICAgICAgICAgICAgICAgICByb3coMCwgc2V0KFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk4IiksIChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKSkpCiAgICAgICAgICk7CiAKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiW10iKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIltdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHNldHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBudWxsKSk7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkV4cGVjdGVkIGEgbGlzdCAocmVwcmVzZW50aW5nIGEgc2V0KSwgYnV0IGdvdCBhIEludGVnZXIiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgc2V0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjMiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIjEyMyIpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJVbmFibGUgdG8gbWFrZSBVVUlEIGZyb20iLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgc2V0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJbXCJhYmNcIl0iKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIltcImFiY1wiXSIpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJJbnZhbGlkIG51bGwgZWxlbWVudCBpbiBzZXQiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgc2V0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJbbnVsbF0iKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIltudWxsXSIpOwogCiAgICAgICAgIC8vIGZyb3plbgotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVuc2V0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5zZXR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsCiAgICAgICAgICAgICAgICAgMCwgIltcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OFwiLCBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiXSIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmcm96ZW5zZXR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLAogICAgICAgICAgICAgICAgIHJvdygwLCBzZXQoVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTgiKSwgKFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKSkKICAgICAgICAgKTsKIAotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVuc2V0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5zZXR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsCiAgICAgICAgICAgICAgICAgMCwgIltcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiLCBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OFwiXSIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmcm96ZW5zZXR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLAogICAgICAgICAgICAgICAgIHJvdygwLCBzZXQoVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTgiKSwgKFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKSkKICAgICAgICAgKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IG1hcHMgPT09PT09PT09PT09PT09PQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbWFwdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ7XCJhXCI6IDEsIFwiYlwiOiAyfSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbWFwdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAie1wiYVwiOiAxLCBcImJcIjogMn0iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbWFwdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG1hcCgiYSIsIDEsICJiIiwgMikpKTsKIAotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbWFwdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ7fSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbWFwdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAie30iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbWFwdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG51bGwpKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiRXhwZWN0ZWQgYSBtYXAsIGJ1dCBnb3QgYSBJbnRlZ2VyIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIG1hcHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBtYXB2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMiKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiSW52YWxpZCBBU0NJSSBjaGFyYWN0ZXIgaW4gc3RyaW5nIGxpdGVyYWwiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgbWFwdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ7XCJcXHUxZmZmXFx1MjAxM1xcdTMzQjRcXHUyMDE0XCI6IDF9Iik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBtYXB2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJ7XCJcXHUxZmZmXFx1MjAxM1xcdTMzQjRcXHUyMDE0XCI6IDF9Iik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkludmFsaWQgbnVsbCB2YWx1ZSBpbiBtYXAiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgbWFwdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ7XCJhXCI6IG51bGx9Iik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBtYXB2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJ7XCJhXCI6IG51bGx9Iik7CiAKICAgICAgICAgLy8gZnJvemVuCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5tYXB2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIntcImFcIjogMSwgXCJiXCI6IDJ9Iik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5tYXB2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJ7XCJhXCI6IDEsIFwiYlwiOiAyfSIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmcm96ZW5tYXB2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbWFwKCJhIiwgMSwgImIiLCAyKSkpOwogCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5tYXB2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIntcImJcIjogMiwgXCJhXCI6IDF9Iik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5tYXB2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJ7XCJiXCI6IDIsIFwiYVwiOiAxfSIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmcm96ZW5tYXB2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbWFwKCJhIiwgMSwgImIiLCAyKSkpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gdHVwbGVzID09PT09PT09PT09PT09PT0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHR1cGxldmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJbMSwgXCJmb29iYXJcIiwgXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIl0iKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHR1cGxldmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiWzEsIFwiZm9vYmFyXCIsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCJdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHR1cGxldmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKICAgICAgICAgICAgIHJvdygwLCB0dXBsZSgxLCAiZm9vYmFyIiwgVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTkiKSkpCiAgICAgICAgICk7CiAKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHR1cGxldmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJbMSwgbnVsbCwgXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIl0iKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHR1cGxldmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiWzEsIG51bGwsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCJdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHR1cGxldmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKICAgICAgICAgICAgICAgICByb3coMCwgdHVwbGUoMSwgbnVsbCwgVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTkiKSkpCiAgICAgICAgICk7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlR1cGxlIGNvbnRhaW5zIGV4dHJhIGl0ZW1zIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHR1cGxldmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsCisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCB0dXBsZXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwKICAgICAgICAgICAgICAgICAwLCAiWzEsIFwiZm9vYmFyXCIsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIsIDEsIDIsIDNdIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlR1cGxlIGlzIG1pc3NpbmcgaXRlbXMiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdHVwbGV2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHR1cGxldmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLAogICAgICAgICAgICAgICAgIDAsICJbMSwgXCJmb29iYXJcIl0iKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVW5hYmxlIHRvIG1ha2UgaW50IGZyb20iLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdHVwbGV2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHR1cGxldmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLAogICAgICAgICAgICAgICAgIDAsICJbXCJub3QgYW4gaW50XCIsIFwiZm9vYmFyXCIsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCJdIik7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBVRFRzID09PT09PT09PT09PT09PT0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHVkdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAie1wiYVwiOiAxLCBcImJcIjogXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiwgXCJjXCI6IFtcImZvb1wiLCBcImJhclwiXX0iKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHVkdHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIntcImFcIjogMSwgXCJiXCI6IFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIsIFwiY1wiOiBbXCJmb29cIiwgXCJiYXJcIl19Iik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHVkdHZhbC5hLCB1ZHR2YWwuYiwgdWR0dmFsLmMgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLAogICAgICAgICAgICAgICAgIHJvdygwLCAxLCBVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpLCBzZXQoImJhciIsICJmb28iKSkKICAgICAgICAgKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IGR1cmF0aW9uID09PT09PT09PT09PT09PT0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGR1cmF0aW9udmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjUzdXNcIiIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZHVyYXRpb252YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjUzdXNcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBkdXJhdGlvbnZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBEdXJhdGlvbi5uZXdJbnN0YW5jZSgwLCAwLCA1MzAwMEwpKSk7CiAKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGR1cmF0aW9udmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIlAyV1wiIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBkdXJhdGlvbnZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiUDJXXCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZHVyYXRpb252YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgRHVyYXRpb24ubmV3SW5zdGFuY2UoMCwgMTQsIDApKSk7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlVuYWJsZSB0byBjb252ZXJ0ICd4eXonIHRvIGEgZHVyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGR1cmF0aW9udmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcInh5elwiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgZHVyYXRpb252YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcInh5elwiIik7CiAKICAgICAgICAgLy8gb3JkZXIgb2YgZmllbGRzIHNob3VsZG4ndCBtYXR0ZXIKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHVkdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAie1wiYlwiOiBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiLCBcImFcIjogMSwgXCJjXCI6IFtcImZvb1wiLCBcImJhclwiXX0iKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHVkdHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIntcImJcIjogXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiwgXCJhXCI6IDEsIFwiY1wiOiBbXCJmb29cIiwgXCJiYXJcIl19Iik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHVkdHZhbC5hLCB1ZHR2YWwuYiwgdWR0dmFsLmMgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLAogICAgICAgICAgICAgICAgIHJvdygwLCAxLCBVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpLCBzZXQoImJhciIsICJmb28iKSkKICAgICAgICAgKTsKIAogICAgICAgICAvLyB0ZXN0IG51bGxzCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB1ZHR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIntcImFcIjogbnVsbCwgXCJiXCI6IFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIsIFwiY1wiOiBbXCJmb29cIiwgXCJiYXJcIl19Iik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB1ZHR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJ7XCJhXCI6IG51bGwsIFwiYlwiOiBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiLCBcImNcIjogW1wiZm9vXCIsIFwiYmFyXCJdfSIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB1ZHR2YWwuYSwgdWR0dmFsLmIsIHVkdHZhbC5jIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKICAgICAgICAgICAgICAgICByb3coMCwgbnVsbCwgVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTkiKSwgc2V0KCJiYXIiLCAiZm9vIikpCiAgICAgICAgICk7CiAKICAgICAgICAgLy8gdGVzdCBtaXNzaW5nIGZpZWxkcwotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdWR0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ7XCJhXCI6IDEsIFwiYlwiOiBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwifSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdWR0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAie1wiYVwiOiAxLCBcImJcIjogXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIn0iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdWR0dmFsLmEsIHVkdHZhbC5iLCB1ZHR2YWwuYyBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCiAgICAgICAgICAgICAgICAgcm93KDAsIDEsIFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IiksIG51bGwpCiAgICAgICAgICk7CiAKLSAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlVua25vd24gZmllbGQiLCAiSU5TRVJUIElOVE8gJXMgKGssIHVkdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAie1wieHh4XCI6IDF9Iik7CisgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJVbmtub3duIGZpZWxkIiwgIklOU0VSVCBJTlRPICVzIChrLCB1ZHR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJ7XCJ4eHhcIjogMX0iKTsKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlVuYWJsZSB0byBtYWtlIGludCBmcm9tIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHVkdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAie1wiYVwiOiBcImZvb2JhclwifSIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdWR0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAie1wiYVwiOiBcImZvb2JhclwifSIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC03NDUsMjEyICs3NDcsMjI0IEBACiAgICAgICAgICAgICAgICAgInVkdHZhbCBmcm96ZW48IiArIHR5cGVOYW1lICsgIj4sIiArCiAgICAgICAgICAgICAgICAgImR1cmF0aW9udmFsIGR1cmF0aW9uKSIpOwogCi0gICAgICAgIC8vIHRvSnNvbigpIGNhbiBvbmx5IGJlIHVzZWQgaW4gc2VsZWN0aW9ucwotICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgidG9Kc29uKCkgbWF5IG9ubHkgYmUgdXNlZCB3aXRoaW4gdGhlIHNlbGVjdGlvbiBjbGF1c2UiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYXNjaWl2YWwpIFZBTFVFUyAoPywgdG9Kc29uKD8pKSIsIDAsIDApOwotICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgidG9Kc29uKCkgbWF5IG9ubHkgYmUgdXNlZCB3aXRoaW4gdGhlIHNlbGVjdGlvbiBjbGF1c2UiLAotICAgICAgICAgICAgICAgICJVUERBVEUgJXMgU0VUIGFzY2lpdmFsID0gdG9Kc29uKD8pIFdIRVJFIGsgPSA/IiwgMCwgMCk7Ci0gICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJ0b0pzb24oKSBtYXkgb25seSBiZSB1c2VkIHdpdGhpbiB0aGUgc2VsZWN0aW9uIGNsYXVzZSIsCi0gICAgICAgICAgICAgICAgIkRFTEVURSBGUk9NICVzIFdIRVJFIGsgPSBmcm9tSnNvbih0b0pzb24oPykpIiwgMCk7CisgICAgICAgIC8vIHRvX2pzb24oKSBjYW4gYmUgdXNlZCBvdXQgb2YgdGhlIHNlbGVjdGlvbiBjbGF1c2UgKHdpdGggbGl0ZXJhbHMpCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0ZXh0dmFsKSBWQUxVRVMgKD8sIHRvX2pzb24oMTIzNCkpIiwgMCk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHRleHR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coIjEyMzQiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHRleHR2YWwgRlJPTSAlcyBXSEVSRSB0ZXh0dmFsID0gdG9fanNvbigxMjM0KSBBTExPVyBGSUxURVJJTkciKSwgcm93KCIxMjM0IikpOworICAgICAgICBleGVjdXRlKCJVUERBVEUgJXMgU0VUIHRleHR2YWwgPSB0b19qc29uKC0xMjM0KSBXSEVSRSBrID0gPyIsIDApOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCB0ZXh0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KCItMTIzNCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgdGV4dHZhbCBGUk9NICVzIFdIRVJFIHRleHR2YWwgPSB0b19qc29uKC0xMjM0KSBBTExPVyBGSUxURVJJTkciKSwgcm93KCItMTIzNCIpKTsKKyAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgayA9IGZyb21fanNvbih0b19qc29uKDApKSIpOworICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgdGV4dHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCkpOworCisgICAgICAgIC8vIHRvX2pzb24oKSBjYW4gYmUgdXNlZCBvdXQgb2YgdGhlIHNlbGVjdGlvbiBjbGF1c2UgKHdpdGggbWFya2VycykKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRleHR2YWwpIFZBTFVFUyAoPywgdG9fanNvbigoaW50KSA/KSkiLCAwLCAxMjMxMjMpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCB0ZXh0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KCIxMjMxMjMiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHRleHR2YWwgRlJPTSAlcyBXSEVSRSB0ZXh0dmFsID0gdG9fanNvbigoaW50KSA/KSBBTExPVyBGSUxURVJJTkciLCAxMjMxMjMpLCByb3coIjEyMzEyMyIpKTsKKyAgICAgICAgZXhlY3V0ZSgiVVBEQVRFICVzIFNFVCB0ZXh0dmFsID0gdG9fanNvbigoaW50KSA/KSBXSEVSRSBrID0gPyIsIC0xMjMxMjMsIDApOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCB0ZXh0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KCItMTIzMTIzIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCB0ZXh0dmFsIEZST00gJXMgV0hFUkUgdGV4dHZhbCA9IHRvX2pzb24oKGludCkgPykgQUxMT1cgRklMVEVSSU5HIiwgLTEyMzEyMyksIHJvdygiLTEyMzEyMyIpKTsKKyAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgayA9IGZyb21fanNvbih0b19qc29uKChpbnQpID8pKSIsIDApOworICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgdGV4dHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCkpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gYXNjaWkgPT09PT09PT09PT09PT09PQogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYXNjaWl2YWwpIFZBTFVFUyAoPywgPykiLCAwLCAiYXNjaWkgdGV4dCIpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24oYXNjaWl2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJcImFzY2lpIHRleHRcIiIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihhc2NpaXZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiYXNjaWkgdGV4dFwiIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBhc2NpaXZhbCkgVkFMVUVTICg/LCA/KSIsIDAsICIiKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKGFzY2lpdmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCJcIiIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihhc2NpaXZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiXCIiKSk7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBiaWdpbnQgPT09PT09PT09PT09PT09PQogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYmlnaW50dmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgMTIzMTIzMTIzMTIzTCk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihiaWdpbnR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICIxMjMxMjMxMjMxMjMiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24oYmlnaW50dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiMTIzMTIzMTIzMTIzIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBiaWdpbnR2YWwpIFZBTFVFUyAoPywgPykiLCAwLCAwTCk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihiaWdpbnR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICIwIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKGJpZ2ludHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIjAiKSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGJpZ2ludHZhbCkgVkFMVUVTICg/LCA/KSIsIDAsIC0xMjMxMjMxMjMxMjNMKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKGJpZ2ludHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIi0xMjMxMjMxMjMxMjMiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24oYmlnaW50dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiLTEyMzEyMzEyMzEyMyIpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IGJsb2IgPT09PT09PT09PT09PT09PQogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYmxvYnZhbCkgVkFMVUVTICg/LCA/KSIsIDAsIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKDEpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKGJsb2J2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJcIjB4MDAwMDAwMDFcIiIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihibG9idmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCIweDAwMDAwMDAxXCIiKSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGJsb2J2YWwpIFZBTFVFUyAoPywgPykiLCAwLCBCeXRlQnVmZmVyVXRpbC5FTVBUWV9CWVRFX0JVRkZFUik7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihibG9idmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCIweFwiIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKGJsb2J2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJcIjB4XCIiKSk7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBib29sZWFuID09PT09PT09PT09PT09PT0KICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGJvb2xlYW52YWwpIFZBTFVFUyAoPywgPykiLCAwLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKGJvb2xlYW52YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJ0cnVlIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKGJvb2xlYW52YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJ0cnVlIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBib29sZWFudmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgZmFsc2UpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24oYm9vbGVhbnZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgImZhbHNlIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKGJvb2xlYW52YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJmYWxzZSIpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IGRhdGUgPT09PT09PT09PT09PT09PQogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZGF0ZXZhbCkgVkFMVUVTICg/LCA/KSIsIDAsIFNpbXBsZURhdGVTZXJpYWxpemVyLmRhdGVTdHJpbmdUb0RheXMoIjE5ODctMDMtMjMiKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihkYXRldmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCIxOTg3LTAzLTIzXCIiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24oZGF0ZXZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiMTk4Ny0wMy0yM1wiIikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gZGVjaW1hbCA9PT09PT09PT09PT09PT09CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBkZWNpbWFsdmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgbmV3IEJpZ0RlY2ltYWwoIjEyMzEyMy4xMjMxMjMiKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihkZWNpbWFsdmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiMTIzMTIzLjEyMzEyMyIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihkZWNpbWFsdmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiMTIzMTIzLjEyMzEyMyIpKTsKIAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZGVjaW1hbHZhbCkgVkFMVUVTICg/LCA/KSIsIDAsIG5ldyBCaWdEZWNpbWFsKCItMS4yM0UtMTIiKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihkZWNpbWFsdmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiLTEuMjNFLTEyIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKGRlY2ltYWx2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICItMS4yM0UtMTIiKSk7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBkb3VibGUgPT09PT09PT09PT09PT09PQogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZG91YmxldmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgMTIzMTIzLjEyMzEyM2QpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24oZG91YmxldmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiMTIzMTIzLjEyMzEyMyIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihkb3VibGV2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICIxMjMxMjMuMTIzMTIzIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBkb3VibGV2YWwpIFZBTFVFUyAoPywgPykiLCAwLCAxMjMxMjNkKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKGRvdWJsZXZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIjEyMzEyMy4wIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKGRvdWJsZXZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIjEyMzEyMy4wIikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gZmxvYXQgPT09PT09PT09PT09PT09PQogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZmxvYXR2YWwpIFZBTFVFUyAoPywgPykiLCAwLCAxMjMuMTIzZik7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihmbG9hdHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIjEyMy4xMjMiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24oZmxvYXR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICIxMjMuMTIzIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmbG9hdHZhbCkgVkFMVUVTICg/LCA/KSIsIDAsIDEyMzEyM2YpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24oZmxvYXR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICIxMjMxMjMuMCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihmbG9hdHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIjEyMzEyMy4wIikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gaW5ldCA9PT09PT09PT09PT09PT09CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBpbmV0dmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCIxMjcuMC4wLjEiKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihpbmV0dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCIxMjcuMC4wLjFcIiIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihpbmV0dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCIxMjcuMC4wLjFcIiIpKTsKIAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgaW5ldHZhbCkgVkFMVUVTICg/LCA/KSIsIDAsIEluZXRBZGRyZXNzLmdldEJ5TmFtZSgiOjoxIikpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24oaW5ldHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiMDowOjA6MDowOjA6MDoxXCIiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24oaW5ldHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiMDowOjA6MDowOjA6MDoxXCIiKSk7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBpbnQgPT09PT09PT09PT09PT09PQogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgaW50dmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgMTIzMTIzKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKGludHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIjEyMzEyMyIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihpbnR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICIxMjMxMjMiKSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGludHZhbCkgVkFMVUVTICg/LCA/KSIsIDAsIDApOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24oaW50dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiMCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihpbnR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICIwIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBpbnR2YWwpIFZBTFVFUyAoPywgPykiLCAwLCAtMTIzMTIzKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKGludHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIi0xMjMxMjMiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24oaW50dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiLTEyMzEyMyIpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IHNtYWxsaW50ID09PT09PT09PT09PT09PT0KICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHNtYWxsaW50dmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgKHNob3J0KSAzMjc2Nyk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihzbWFsbGludHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIjMyNzY3IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKHNtYWxsaW50dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiMzI3NjciKSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHNtYWxsaW50dmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgKHNob3J0KSAwKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKHNtYWxsaW50dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiMCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihzbWFsbGludHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIjAiKSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHNtYWxsaW50dmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgKHNob3J0KSAtMzI3NjgpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24oc21hbGxpbnR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICItMzI3NjgiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24oc21hbGxpbnR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICItMzI3NjgiKSk7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSB0aW55aW50ID09PT09PT09PT09PT09PT0KICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRpbnlpbnR2YWwpIFZBTFVFUyAoPywgPykiLCAwLCAoYnl0ZSkgMTI3KTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKHRpbnlpbnR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICIxMjciKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24odGlueWludHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIjEyNyIpKTsKIAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGlueWludHZhbCkgVkFMVUVTICg/LCA/KSIsIDAsIChieXRlKSAwKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKHRpbnlpbnR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICIwIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKHRpbnlpbnR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICIwIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0aW55aW50dmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgKGJ5dGUpIC0xMjgpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24odGlueWludHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIi0xMjgiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24odGlueWludHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIi0xMjgiKSk7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSB0ZXh0ICh2YXJjaGFyKSA9PT09PT09PT09PT09PT09CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0ZXh0dmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgIiIpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24odGV4dHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiXCIiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24odGV4dHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiXCIiKSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRleHR2YWwpIFZBTFVFUyAoPywgPykiLCAwLCAiYWJjZCIpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24odGV4dHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiYWJjZFwiIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKHRleHR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJcImFiY2RcIiIpKTsKIAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGV4dHZhbCkgVkFMVUVTICg/LCA/KSIsIDAsICJcdTg0MjIiKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKHRleHR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJcIlx1ODQyMlwiIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKHRleHR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJcIlx1ODQyMlwiIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0ZXh0dmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgIlx1MDAwMCIpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24odGV4dHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiXFx1MDAwMFwiIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKHRleHR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJcIlxcdTAwMDBcIiIpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IHRpbWUgPT09PT09PT09PT09PT09PQogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXZhbCkgVkFMVUVTICg/LCA/KSIsIDAsIDEyM0wpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24odGltZXZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiMDA6MDA6MDAuMDAwMDAwMTIzXCIiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24odGltZXZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiMDA6MDA6MDAuMDAwMDAwMTIzXCIiKSk7CiAKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRpbWV2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiMDc6MzU6MDcuMDAwMTExMjIyXCIiKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKHRpbWV2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJcIjA3OjM1OjA3LjAwMDExMTIyMlwiIikpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiMDc6MzU6MDcuMDAwMTExMjIyXCIiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbih0aW1ldmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCIwNzozNTowNy4wMDAxMTEyMjJcIiIpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IHRpbWVzdGFtcCA9PT09PT09PT09PT09PT09CiAgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInktTS1kIik7CiAgICAgICAgIHNkZi5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiVURUIikpOwogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXN0YW1wdmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgc2RmLnBhcnNlKCIyMDE0LTAxLTAxIikpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24odGltZXN0YW1wdmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCIyMDE0LTAxLTAxIDAwOjAwOjAwLjAwMFpcIiIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbih0aW1lc3RhbXB2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJcIjIwMTQtMDEtMDEgMDA6MDA6MDAuMDAwWlwiIikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gdGltZXV1aWQgPT09PT09PT09PT09PT09PQogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXV1aWR2YWwpIFZBTFVFUyAoPywgPykiLCAwLCBVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKHRpbWV1dWlkdmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbih0aW1ldXVpZHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIiKSk7CiAKICAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gdXVpZHZhbCA9PT09PT09PT09PT09PT09CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB1dWlkdmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTkiKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbih1dWlkdmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbih1dWlkdmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiIpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IHZhcmludCA9PT09PT09PT09PT09PT09CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB2YXJpbnR2YWwpIFZBTFVFUyAoPywgPykiLCAwLCBuZXcgQmlnSW50ZWdlcigiMTIzMTIzMTIzMTIzMTIzMTIzMTIzIikpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24odmFyaW50dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiMTIzMTIzMTIzMTIzMTIzMTIzMTIzIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKHZhcmludHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIjEyMzEyMzEyMzEyMzEyMzEyMzEyMyIpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IGxpc3RzID09PT09PT09PT09PT09PT0KICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGxpc3R2YWwpIFZBTFVFUyAoPywgPykiLCAwLCBsaXN0KDEsIDIsIDMpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKGxpc3R2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJbMSwgMiwgM10iKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24obGlzdHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlsxLCAyLCAzXSIpKTsKIAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbGlzdHZhbCkgVkFMVUVTICg/LCA/KSIsIDAsIGxpc3QoKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihsaXN0dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAibnVsbCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihsaXN0dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAibnVsbCIpKTsKIAogICAgICAgICAvLyBmcm96ZW4KICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGZyb3plbmxpc3R2YWwpIFZBTFVFUyAoPywgPykiLCAwLCBsaXN0KDEsIDIsIDMpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKGZyb3plbmxpc3R2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJbMSwgMiwgM10iKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24oZnJvemVubGlzdHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlsxLCAyLCAzXSIpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IHNldHMgPT09PT09PT09PT09PT09PQogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgc2V0dmFsKSBWQUxVRVMgKD8sID8pIiwKICAgICAgICAgICAgICAgICAwLCBzZXQoVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTgiKSwgKFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihzZXR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihzZXR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKICAgICAgICAgICAgICAgICByb3coMCwgIltcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OFwiLCBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiXSIpCiAgICAgICAgICk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCA/KSIsIDAsIHNldCgpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKHNldHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIm51bGwiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24oc2V0dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAibnVsbCIpKTsKIAogICAgICAgICAvLyBmcm96ZW4KICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGZyb3plbnNldHZhbCkgVkFMVUVTICg/LCA/KSIsCiAgICAgICAgICAgICAgICAgMCwgc2V0KFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk4IiksIChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKSkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24oZnJvemVuc2V0dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24oZnJvemVuc2V0dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCiAgICAgICAgICAgICAgICAgcm93KDAsICJbXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OThcIiwgXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIl0iKQogICAgICAgICApOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gbWFwcyA9PT09PT09PT09PT09PT09CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBtYXB2YWwpIFZBTFVFUyAoPywgPykiLCAwLCBtYXAoImEiLCAxLCAiYiIsIDIpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKG1hcHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIntcImFcIjogMSwgXCJiXCI6IDJ9IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKG1hcHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIntcImFcIjogMSwgXCJiXCI6IDJ9IikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBtYXB2YWwpIFZBTFVFUyAoPywgPykiLCAwLCBtYXAoKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihtYXB2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJudWxsIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKG1hcHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIm51bGwiKSk7CiAKICAgICAgICAgLy8gZnJvemVuCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5tYXB2YWwpIFZBTFVFUyAoPywgPykiLCAwLCBtYXAoImEiLCAxLCAiYiIsIDIpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKGZyb3plbm1hcHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIntcImFcIjogMSwgXCJiXCI6IDJ9IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKGZyb3plbm1hcHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIntcImFcIjogMSwgXCJiXCI6IDJ9IikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gdHVwbGVzID09PT09PT09PT09PT09PT0KICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHR1cGxldmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgdHVwbGUoMSwgImZvb2JhciIsIFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKHR1cGxldmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24odHVwbGV2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKICAgICAgICAgICAgIHJvdygwLCAiWzEsIFwiZm9vYmFyXCIsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCJdIikKICAgICAgICAgKTsKIAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdHVwbGV2YWwpIFZBTFVFUyAoPywgPykiLCAwLCB0dXBsZSgxLCAiZm9vYmFyIiwgbnVsbCkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24odHVwbGV2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbih0dXBsZXZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLAogICAgICAgICAgICAgICAgIHJvdygwLCAiWzEsIFwiZm9vYmFyXCIsIG51bGxdIikKICAgICAgICAgKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IFVEVHMgPT09PT09PT09PT09PT09PQogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdWR0dmFsKSBWQUxVRVMgKD8sIHthOiA/LCBiOiA/LCBjOiA/fSkiLCAwLCAxLCBVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpLCBzZXQoImZvbyIsICJiYXIiKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbih1ZHR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbih1ZHR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKICAgICAgICAgICAgICAgICByb3coMCwgIntcImFcIjogMSwgXCJiXCI6IFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIsIFwiY1wiOiBbXCJiYXJcIiwgXCJmb29cIl19IikKICAgICAgICAgKTsKIAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdWR0dmFsKSBWQUxVRVMgKD8sIHthOiA/LCBiOiA/fSkiLCAwLCAxLCBVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKHVkdHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLAorICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKHVkdHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLAogICAgICAgICAgICAgICAgIHJvdygwLCAie1wiYVwiOiAxLCBcImJcIjogXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiwgXCJjXCI6IG51bGx9IikKICAgICAgICAgKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IGR1cmF0aW9uID09PT09PT09PT09PT09PT0KICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGR1cmF0aW9udmFsKSBWQUxVRVMgKD8sIDEywrVzKSIsIDApOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24oZHVyYXRpb252YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJcIjEydXNcIiIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihkdXJhdGlvbnZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiMTJ1c1wiIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBkdXJhdGlvbnZhbCkgVkFMVUVTICg/LCBQMVkxTTJEVDEwSDVNKSIsIDApOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24oZHVyYXRpb252YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJcIjF5MW1vMmQxMGg1bVwiIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKGR1cmF0aW9udmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCIxeTFtbzJkMTBoNW1cIiIpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTAyNCw4ICsxMDM4LDggQEAKICAgICAgICAgICAgICAgICByb3coIntcImZvb1wiOiAyfSIpCiAgICAgICAgICk7CiAKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgSlNPTiB0b0pzb24oYmxvYkFzSW50KGludEFzQmxvYih2KSkpIEZST00gJXMgTElNSVQgMSIpLAotICAgICAgICAgICAgICAgIHJvdygie1wic3lzdGVtLnRvanNvbihzeXN0ZW0uYmxvYmFzaW50KHN5c3RlbS5pbnRhc2Jsb2IodikpKVwiOiBcIjBcIn0iKQorICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBKU09OIHRvX2pzb24oYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IodikpKSBGUk9NICVzIExJTUlUIDEiKSwKKyAgICAgICAgICAgICAgICByb3coIntcInN5c3RlbS50b19qc29uKHN5c3RlbS5ibG9iX2FzX2ludChzeXN0ZW0uaW50X2FzX2Jsb2IodikpKVwiOiBcIjBcIn0iKQogICAgICAgICApOwogICAgIH0KIApAQCAtMTI2OCwxMSArMTI4MiwxMSBAQAogCiAgICAgICAgIC8vIG1hcDxzZXQ8dGV4dD4sIHRleHQ+IGtleXMKICAgICAgICAgU3RyaW5nIGlubmVyS2V5MSA9ICJbXCIwXCIsIFwiMVwiXSI7Ci0gICAgICAgIFN0cmluZyBmdWxsS2V5MSA9IFN0cmluZy5mb3JtYXQoIntcIiVzXCI6IFwiJXNcIn0iLCBKc29uLnF1b3RlQXNKc29uU3RyaW5nKGlubmVyS2V5MSksICJhIik7Ci0gICAgICAgIFN0cmluZyBzdHJpbmdLZXkxID0gSnNvbi5xdW90ZUFzSnNvblN0cmluZyhmdWxsS2V5MSk7CisgICAgICAgIFN0cmluZyBmdWxsS2V5MSA9IFN0cmluZy5mb3JtYXQoIntcIiVzXCI6IFwiJXNcIn0iLCBKc29uVXRpbHMucXVvdGVBc0pzb25TdHJpbmcoaW5uZXJLZXkxKSwgImEiKTsKKyAgICAgICAgU3RyaW5nIHN0cmluZ0tleTEgPSBKc29uVXRpbHMucXVvdGVBc0pzb25TdHJpbmcoZnVsbEtleTEpOwogICAgICAgICBTdHJpbmcgaW5uZXJLZXkyID0gIltcIjNcIiwgXCI0XCJdIjsKLSAgICAgICAgU3RyaW5nIGZ1bGxLZXkyID0gU3RyaW5nLmZvcm1hdCgie1wiJXNcIjogXCIlc1wifSIsIEpzb24ucXVvdGVBc0pzb25TdHJpbmcoaW5uZXJLZXkyKSwgImIiKTsKLSAgICAgICAgU3RyaW5nIHN0cmluZ0tleTIgPSBKc29uLnF1b3RlQXNKc29uU3RyaW5nKGZ1bGxLZXkyKTsKKyAgICAgICAgU3RyaW5nIGZ1bGxLZXkyID0gU3RyaW5nLmZvcm1hdCgie1wiJXNcIjogXCIlc1wifSIsIEpzb25VdGlscy5xdW90ZUFzSnNvblN0cmluZyhpbm5lcktleTIpLCAiYiIpOworICAgICAgICBTdHJpbmcgc3RyaW5nS2V5MiA9IEpzb25VdGlscy5xdW90ZUFzSnNvblN0cmluZyhmdWxsS2V5Mik7CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIEpTT04gPyIsICJ7XCJrXCI6IDAsIFwibmVzdGVkc2V0bWFwXCI6IHtcIiIgKyBzdHJpbmdLZXkxICsgIlwiOiB0cnVlLCBcIiIgKyBzdHJpbmdLZXkyICsgIlwiOiBmYWxzZX19Iik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIEpTT04gaywgbmVzdGVkc2V0bWFwIEZST00gJXMiKSwgcm93KCJ7XCJrXCI6IDAsIFwibmVzdGVkc2V0bWFwXCI6IHtcIiIgKyBzdHJpbmdLZXkxICsgIlwiOiB0cnVlLCBcIiIgKyBzdHJpbmdLZXkyICsgIlwiOiBmYWxzZX19IikpOwogCkBAIC0xMzU3LDExICsxMzcxLDExIEBACiAgICAgICAgIH07CiAKICAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbChudW1UaHJlYWRzKTsKLSAgICAgICAgTGlzdDxGdXR1cmU+IGZ1dHVyZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxGdXR1cmU8Pz4+IGZ1dHVyZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1UaHJlYWRzOyBpKyspCiAgICAgICAgICAgICBmdXR1cmVzLmFkZChleGVjdXRvci5zdWJtaXQod29ya2VyKSk7CiAKLSAgICAgICAgZm9yIChGdXR1cmUgZnV0dXJlIDogZnV0dXJlcykKKyAgICAgICAgZm9yIChGdXR1cmU8Pz4gZnV0dXJlIDogZnV0dXJlcykKICAgICAgICAgICAgIGZ1dHVyZS5nZXQoMzAsIFRpbWVVbml0LlNFQ09ORFMpOwogCiAgICAgICAgIGV4ZWN1dG9yLnNodXRkb3duKCk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1NlY29uZGFyeUluZGV4VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9TZWNvbmRhcnlJbmRleFRlc3QuamF2YQppbmRleCAzNGI4MDVkLi43N2M2MTFiIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1NlY29uZGFyeUluZGV4VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvU2Vjb25kYXJ5SW5kZXhUZXN0LmphdmEKQEAgLTExODQsMzkgKzExODQsMzkgQEAKIAogICAgICAgICBiZWZvcmVBbmRBZnRlckZsdXNoKCgpIC0+IHsKICAgICAgICAgICAgIC8vIFRlc3QgY2x1c3RlcmluZyBjb2x1bW5zIHJlc3RyaWN0aW9ucwotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjID0gdGV4dEFzQmxvYignJyk7IikpOworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPSB0ZXh0X2FzX2Jsb2IoJycpOyIpKTsKIAotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPSAodGV4dEFzQmxvYignJykpOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPSAodGV4dF9hc19ibG9iKCcnKSk7IikpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyBJTiAodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjIElOICh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjKSBJTiAoKHRleHRBc0Jsb2IoJycpKSwgKHRleHRBc0Jsb2IoJzEnKSkpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpIElOICgodGV4dF9hc19ibG9iKCcnKSksICh0ZXh0X2FzX2Jsb2IoJzEnKSkpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjID4gdGV4dEFzQmxvYignJykgQU5EIHYgPSB0ZXh0QXNCbG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRfYXNfYmxvYignJykgQU5EIHYgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTExPVyBGSUxURVJJTkc7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMiIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjID49IHRleHRBc0Jsb2IoJycpIEFORCB2ID0gdGV4dEFzQmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPj0gdGV4dF9hc19ibG9iKCcnKSBBTkQgdiA9IHRleHRfYXNfYmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIxIikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjKSA+PSAodGV4dEFzQmxvYignJykpIEFORCB2ID0gdGV4dEFzQmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjKSA+PSAodGV4dF9hc19ibG9iKCcnKSkgQU5EIHYgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTExPVyBGSUxURVJJTkc7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMiIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA8PSB0ZXh0QXNCbG9iKCcnKSBBTkQgdiA9IHRleHRBc0Jsb2IoJzEnKSBBTExPVyBGSUxURVJJTkc7IikpOworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPD0gdGV4dF9hc19ibG9iKCcnKSBBTkQgdiA9IHRleHRfYXNfYmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMpIDw9ICh0ZXh0QXNCbG9iKCcnKSkgQU5EIHYgPSB0ZXh0QXNCbG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPD0gKHRleHRfYXNfYmxvYignJykpIEFORCB2ID0gdGV4dF9hc19ibG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpKTsKIAotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPCAodGV4dEFzQmxvYignJykpIEFORCB2ID0gdGV4dEFzQmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSk7CisgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpIDwgKHRleHRfYXNfYmxvYignJykpIEFORCB2ID0gdGV4dF9hc19ibG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpKTsKIAotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjIDwgdGV4dEFzQmxvYignJykgQU5EIHYgPSB0ZXh0QXNCbG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjIDwgdGV4dF9hc19ibG9iKCcnKSBBTkQgdiA9IHRleHRfYXNfYmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRBc0Jsb2IoJycpIEFORCBjIDwgdGV4dEFzQmxvYignJykgQU5EIHYgPSB0ZXh0QXNCbG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjID4gdGV4dF9hc19ibG9iKCcnKSBBTkQgYyA8IHRleHRfYXNfYmxvYignJykgQU5EIHYgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTExPVyBGSUxURVJJTkc7IikpOwogCi0gICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjKSA+ICh0ZXh0QXNCbG9iKCcnKSkgQU5EIChjKSA8ICh0ZXh0QXNCbG9iKCcnKSkgQU5EIHYgPSB0ZXh0QXNCbG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPiAodGV4dF9hc19ibG9iKCcnKSkgQU5EIChjKSA8ICh0ZXh0X2FzX2Jsb2IoJycpKSBBTkQgdiA9IHRleHRfYXNfYmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSk7CiAgICAgICAgIH0pOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSIsCkBAIC0xMjI0LDUwICsxMjI0LDUwIEBACiAKICAgICAgICAgYmVmb3JlQW5kQWZ0ZXJGbHVzaCgoKSAtPiB7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjID0gdGV4dEFzQmxvYignJyk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjID0gdGV4dF9hc19ibG9iKCcnKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjKSA9ICh0ZXh0QXNCbG9iKCcnKSk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPSAodGV4dF9hc19ibG9iKCcnKSk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjIElOICh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgSU4gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgSU4gKCh0ZXh0QXNCbG9iKCcnKSksICh0ZXh0QXNCbG9iKCcxJykpKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjKSBJTiAoKHRleHRfYXNfYmxvYignJykpLCAodGV4dF9hc19ibG9iKCcxJykpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjID4gdGV4dEFzQmxvYignJykgQU5EIHYgPSB0ZXh0QXNCbG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRfYXNfYmxvYignJykgQU5EIHYgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTExPVyBGSUxURVJJTkc7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMiIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjID49IHRleHRBc0Jsb2IoJycpIEFORCB2ID0gdGV4dEFzQmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPj0gdGV4dF9hc19ibG9iKCcnKSBBTkQgdiA9IHRleHRfYXNfYmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMpID49ICh0ZXh0QXNCbG9iKCcnKSkgQU5EIHYgPSB0ZXh0QXNCbG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpID49ICh0ZXh0X2FzX2Jsb2IoJycpKSBBTkQgdiA9IHRleHRfYXNfYmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA8PSB0ZXh0QXNCbG9iKCcnKSBBTkQgdiA9IHRleHRBc0Jsb2IoJzEnKSBBTExPVyBGSUxURVJJTkc7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjIDw9IHRleHRfYXNfYmxvYignJykgQU5EIHYgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTExPVyBGSUxURVJJTkc7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPD0gKHRleHRBc0Jsb2IoJycpKSBBTkQgdiA9IHRleHRBc0Jsb2IoJzEnKSBBTExPVyBGSUxURVJJTkc7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPD0gKHRleHRfYXNfYmxvYignJykpIEFORCB2ID0gdGV4dF9hc19ibG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgPCB0ZXh0QXNCbG9iKCcnKSBBTkQgdiA9IHRleHRBc0Jsb2IoJzEnKSBBTExPVyBGSUxURVJJTkc7IikpOworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPCB0ZXh0X2FzX2Jsb2IoJycpIEFORCB2ID0gdGV4dF9hc19ibG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpKTsKIAotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPCAodGV4dEFzQmxvYignJykpIEFORCB2ID0gdGV4dEFzQmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSk7CisgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpIDwgKHRleHRfYXNfYmxvYignJykpIEFORCB2ID0gdGV4dF9hc19ibG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpKTsKIAotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjID49IHRleHRBc0Jsb2IoJycpIEFORCBjIDwgdGV4dEFzQmxvYignJykgQU5EIHYgPSB0ZXh0QXNCbG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjID49IHRleHRfYXNfYmxvYignJykgQU5EIGMgPCB0ZXh0X2FzX2Jsb2IoJycpIEFORCB2ID0gdGV4dF9hc19ibG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpKTsKIAotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPj0gKHRleHRBc0Jsb2IoJycpKSBBTkQgYyA8IHRleHRBc0Jsb2IoJycpIEFORCB2ID0gdGV4dEFzQmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSk7CisgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpID49ICh0ZXh0X2FzX2Jsb2IoJycpKSBBTkQgYyA8IHRleHRfYXNfYmxvYignJykgQU5EIHYgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTExPVyBGSUxURVJJTkc7IikpOwogCiAgICAgICAgICAgICAvLyBUZXN0IHJlc3RyaWN0aW9ucyBvbiBub24tcHJpbWFyeSBrZXkgdmFsdWUKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgdiA9IHRleHRBc0Jsb2IoJycpOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCB2ID0gdGV4dF9hc19ibG9iKCcnKTsiKSk7CiAgICAgICAgIH0pOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSIsCkBAIC0xMjc1LDcgKzEyNzUsNyBAQAogCiAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgdiA9IHRleHRBc0Jsb2IoJycpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgdiA9IHRleHRfYXNfYmxvYignJyk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIzIiksIEVNUFRZX0JZVEVfQlVGRkVSKSk7CiAgICAgICAgIH0pOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVGltZXN0YW1wVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9UaW1lc3RhbXBUZXN0LmphdmEKaW5kZXggMTMwOTBhNi4uOTRiYWY4MiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9UaW1lc3RhbXBUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9UaW1lc3RhbXBUZXN0LmphdmEKQEAgLTE3LDExICsxNywxNiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMudmFsaWRhdGlvbi5lbnRpdGllczsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKQEAgLTY2LDcgKzcxLDcgQEAKIAogCiAgICAgICAgIC8vIHdyYXAgd3JpdGV0aW1lKCksIHR0bCgpIGluIG90aGVyIGZ1bmN0aW9ucyAodGVzdCBmb3IgQ0FTU0FORFJBLTg0NTEpCi0gICAgICAgIHJlcyA9IGdldFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGMsIGJsb2JBc0JpZ2ludChiaWdpbnRBc0Jsb2Iod3JpdGV0aW1lKGMpKSksIHR0bChjKSBGUk9NICVzIikpOworICAgICAgICByZXMgPSBnZXRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBjLCBibG9iX2FzX2JpZ2ludChiaWdpbnRfYXNfYmxvYih3cml0ZXRpbWUoYykpKSwgdHRsKGMpIEZST00gJXMiKSk7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgcmVzLmxlbmd0aCk7CiAKICAgICAgICAgZm9yIChPYmplY3RbXSByIDogcmVzKQpAQCAtNzgsNyArODMsNyBAQAogICAgICAgICAgICAgICAgIGFzc2VydFRydWUoclszXSBpbnN0YW5jZW9mIEludGVnZXIgfHwgclsyXSBpbnN0YW5jZW9mIExvbmcpOwogICAgICAgICB9CiAKLSAgICAgICAgcmVzID0gZ2V0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYywgd3JpdGV0aW1lKGMpLCBibG9iQXNJbnQoaW50QXNCbG9iKHR0bChjKSkpIEZST00gJXMiKSk7CisgICAgICAgIHJlcyA9IGdldFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGMsIHdyaXRldGltZShjKSwgYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IodHRsKGMpKSkgRlJPTSAlcyIpKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCByZXMubGVuZ3RoKTsKIAogCkBAIC05Nyw2ICsxMDIsODQgQEAKICAgICAgICAgICAgICAgICAgICByb3coMSwgbnVsbCwgbnVsbCkpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBzZXR1cFNjaGVtYUZvck1heFRpbWVzdGFtcCgpCisgICAgeworICAgICAgICBTdHJpbmcgbXlUeXBlID0gY3JlYXRlVHlwZSgiQ1JFQVRFIFRZUEUgJXMgKGEgaW50LCBiIGludCkiKTsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIGEgdGV4dCwgIiArCisgICAgICAgICAgICAgICAgICAgICJsIGxpc3Q8aW50PiwgZmwgZnJvemVuPGxpc3Q8aW50Pj4sIiArCisgICAgICAgICAgICAgICAgICAgICJzIHNldDxpbnQ+LCBmcyBmcm96ZW48c2V0PGludD4+LCIgKworICAgICAgICAgICAgICAgICAgICAibSBtYXA8aW50LCB0ZXh0PiwgZm0gZnJvemVuPG1hcDxpbnQsIHRleHQ+PiwiICsKKyAgICAgICAgICAgICAgICAgICAgInQgIiArIG15VHlwZSArICIsIGZ0IGZyb3plbjwiICsgbXlUeXBlICsgIj4pIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FsbE1heFRpbWVzdGFtcE9uRW1wdHlDb2xsZWN0aW9uUmV0dXJuc051bGwoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBzZXR1cFNjaGVtYUZvck1heFRpbWVzdGFtcCgpOworCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrKSBWQUxVRVMgKDEpIik7CisgICAgICAgIE9iamVjdFtdW10gcmVzID0gZ2V0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWF4d3JpdGV0aW1lKGEpLCBtYXh3cml0ZXRpbWUobCksIG1heHdyaXRldGltZShmbCksIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXh3cml0ZXRpbWUocyksIG1heHdyaXRldGltZShmcyksIG1heHdyaXRldGltZShtKSwgbWF4d3JpdGV0aW1lKGZtKSwiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heHdyaXRldGltZSh0KSwgbWF4d3JpdGV0aW1lKGZ0KSBGUk9NICVzIFdIRVJFIGs9MSIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzLmxlbmd0aCk7CisgICAgICAgIGZvciAoT2JqZWN0IHYgOiByZXNbMF0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydE51bGwoIkFsbCB0aGUgbXVsdGktY2VsbCBkYXRhIGFyZSBlbXB0eSAod2UgZGlkIG5vdCBpbnNlcnQpLCBjYWxsaW5nIG1heHdyaXRldGltZSBzaG91bGQgcmV0dXJuIG51bGwiLAorICAgICAgICAgICAgICAgICAgICAgICB2KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1heFRpbWVzdGFtcCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHNldHVwU2NoZW1hRm9yTWF4VGltZXN0YW1wKCk7CisKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGEsIGwsIGZsLCBzLCBmcywgbSwgZm0sIHQsIGZ0KSBWQUxVRVMgIiArCisgICAgICAgICAgICAgICAgIigxLCAndGVzdCcsIFsxXSwgWzJdLCB7MX0sIHsyfSwgezEgOiAnYSd9LCB7MiA6ICdiJ30sIHthIDogMSwgYiA6IDEgfSwge2EgOiAyLCBiIDogMn0pIFVTSU5HIFRJTUVTVEFNUCAxIik7CisKKyAgICAgICAgLy8gZW51bWVyYXRlIHRocm91Z2ggYWxsIG11bHRpLWNlbGwgdHlwZXMgYW5kIG1ha2Ugc3VyZSBtYXh3cml0ZXRpbWUgcmVmbGVjdHMgdGhlIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICB0ZXN0TWF4VGltZXN0YW1wV2l0aENvbHVtblVwZGF0ZShBcnJheXMuYXNMaXN0KAorICAgICAgICAgICBQYWlyLmNyZWF0ZSgxLCAiVVBEQVRFICVzIFVTSU5HIFRJTUVTVEFNUCAxMCBTRVQgbCA9IGwgKyBbMTBdIFdIRVJFIGsgPSAxIiksCisgICAgICAgICAgIFBhaXIuY3JlYXRlKDMsICJVUERBVEUgJXMgVVNJTkcgVElNRVNUQU1QIDExIFNFVCBzID0gcyArIHsxMH0gV0hFUkUgayA9IDEiKSwKKyAgICAgICAgICAgUGFpci5jcmVhdGUoNSwgIlVQREFURSAlcyBVU0lORyBUSU1FU1RBTVAgMTIgU0VUIG0gPSBtICsgezEwIDogJ2MnfSBXSEVSRSBrID0gMSIpLAorICAgICAgICAgICBQYWlyLmNyZWF0ZSg3LCAiVVBEQVRFICVzIFVTSU5HIFRJTUVTVEFNUCAxMyBTRVQgdC5hID0gMTAgV0hFUkUgayA9IDEiKQorICAgICAgICApKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdE1heFRpbWVzdGFtcFdpdGhDb2x1bW5VcGRhdGUoTGlzdDxQYWlyPEludGVnZXIsIFN0cmluZz4+IHVwZGF0ZVN0YXRlbWVudHMpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGZvciAoUGFpcjxJbnRlZ2VyLCBTdHJpbmc+IHVwZGF0ZSA6IHVwZGF0ZVN0YXRlbWVudHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBmaWVsZFBvcyA9IHVwZGF0ZS5sZWZ0KCk7CisgICAgICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gdXBkYXRlLnJpZ2h0KCk7CisKKyAgICAgICAgICAgIC8vIHJ1biB0aGUgdXBkYXRlIHN0YXRlbWVudCBhbmQgdXBkYXRlIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGNvbHVtbgorICAgICAgICAgICAgZXhlY3V0ZShzdGF0ZW1lbnQpOworCisgICAgICAgICAgICBPYmplY3RbXVtdIHJlcyA9IGdldFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1heHdyaXRldGltZShhKSwgbWF4d3JpdGV0aW1lKGwpLCBtYXh3cml0ZXRpbWUoZmwpLCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heHdyaXRldGltZShzKSwgbWF4d3JpdGV0aW1lKGZzKSwgbWF4d3JpdGV0aW1lKG0pLCBtYXh3cml0ZXRpbWUoZm0pLCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heHdyaXRldGltZSh0KSwgbWF4d3JpdGV0aW1lKGZ0KSBGUk9NICVzIFdIRVJFIGs9MSIpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgcmVzLmxlbmd0aCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJtYXh3cml0ZXRpbWUgc2hvdWxkIHdvcmsgb24gYm90aCBzaW5nbGUgY2VsbCBhbmQgY29tcGxleCBjb2x1bW5zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwgcmVzWzBdLmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKE9iamVjdCB0cyA6IHJlc1swXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHRzIGluc3RhbmNlb2YgTG9uZyk7IC8vIGFsbCB0aGUgcmVzdWx0IGZpZWxkcyBhcmUgdGltZXN0YW1wcworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb25nIHVwZGF0ZWRUcyA9IChsb25nKSByZXNbMF1bZmllbGRQb3NdOyAvLyBtYXh3cml0ZXRpbWUgdGhlIHVwZGF0ZWQgY29sdW1uCisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzWzBdLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvbmcgdHMgPSAobG9uZykgcmVzWzBdW2ldOworICAgICAgICAgICAgICAgIGlmIChpICE9IGZpZWxkUG9zKQorICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJUaGUgdXBkYXRlZCBjb2x1bW4gc2hvdWxkIGhhdmUgYSBsYXJnZSBtYXh3cml0ZXRpbWUgc2luY2UgaXQgaXMgdXBkYXRlZCBsYXRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMgPCB1cGRhdGVkVHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogTWlncmF0ZWQgZnJvbSBjcWxfdGVzdHMucHk6VGVzdENRTC5pbnZhbGlkX2N1c3RvbV90aW1lc3RhbXBfdGVzdCgpCiAgICAgICovCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1RpbWV1dWlkVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9UaW1ldXVpZFRlc3QuamF2YQppbmRleCA5MzE0NTFlLi4xMzNlZDRlIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1RpbWV1dWlkVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVGltZXV1aWRUZXN0LmphdmEKQEAgLTU1LDE3ICs1NSwxOCBAQAogCiAgICAgICAgIGFzc2VydFJvd0NvdW50KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDAgQU5EIHQgPSA/Iiwgcm93c1swXVsxXSksIDEpOwogCi0gICAgICAgIGFzc2VydEludmFsaWQoIlNFTEVDVCBkYXRlT2YoaykgRlJPTSAlcyBXSEVSRSBrID0gMCBBTkQgdCA9ID8iLCByb3dzWzBdWzFdKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoImsgY2Fubm90IGJlIHBhc3NlZCBhcyBhcmd1bWVudCAwIG9mIGZ1bmN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFTEVDVCBtaW5fdGltZXV1aWQoaykgRlJPTSAlcyBXSEVSRSBrID0gMCBBTkQgdCA9ID8iLCByb3dzWzBdWzFdKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykKICAgICAgICAgewogICAgICAgICAgICAgbG9uZyB0aW1lc3RhbXAgPSAoKFRpbWVVVUlEKSByb3dzW2ldWzFdKS51bml4KE1JTExJU0VDT05EUyk7Ci0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBkYXRlT2YodCksIHVuaXhUaW1lc3RhbXBPZih0KSBGUk9NICVzIFdIRVJFIGsgPSAwIEFORCB0ID0gPyIsIHJvd3NbaV1bMV0pLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgdG9fdGltZXN0YW1wKHQpLCB0b191bml4X3RpbWVzdGFtcCh0KSBGUk9NICVzIFdIRVJFIGsgPSAwIEFORCB0ID0gPyIsIHJvd3NbaV1bMV0pLAogICAgICAgICAgICAgICAgICAgICAgICByb3cobmV3IERhdGUodGltZXN0YW1wKSwgdGltZXN0YW1wKSk7CiAgICAgICAgIH0KIAotICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgdCBGUk9NICVzIFdIRVJFIGsgPSAwIEFORCB0ID4gbWF4VGltZXV1aWQoMTIzNDU2NykgQU5EIHQgPCBtaW5UaW1ldXVpZCgnMjAxMi0xMS0wNyAxODoxODoyMi0wODAwJykiKSk7Ci0gICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCB0IEZST00gJXMgV0hFUkUgayA9IDAgQU5EIHQgPiBtYXhUaW1ldXVpZCgxNTY0ODMwMTgyMDAwKSBBTkQgdCA8IG1pblRpbWV1dWlkKCcyMDEyLTExLTA3IDE4OjE4OjIyLTA4MDAnKSIpKTsKKyAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUIHQgRlJPTSAlcyBXSEVSRSBrID0gMCBBTkQgdCA+IG1heF90aW1ldXVpZCgxMjM0NTY3KSBBTkQgdCA8IG1pbl90aW1ldXVpZCgnMjAxMi0xMS0wNyAxODoxODoyMi0wODAwJykiKSk7CisgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCB0IEZST00gJXMgV0hFUkUgayA9IDAgQU5EIHQgPiBtYXhfdGltZXV1aWQoMTU2NDgzMDE4MjAwMCkgQU5EIHQgPCBtaW5fdGltZXV1aWQoJzIwMTItMTEtMDcgMTg6MTg6MjItMDgwMCcpIikpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9UdXBsZVR5cGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1R1cGxlVHlwZVRlc3QuamF2YQppbmRleCA5ZjUzZGI0Li44ZTgzZmQyIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1R1cGxlVHlwZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1R1cGxlVHlwZVRlc3QuamF2YQpAQCAtMzMsNiArMzMsNyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5VbnR5cGVkUmVzdWx0U2V0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZUJ1ZmZlckFjY2Vzc29yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVHVwbGVUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkFic3RyYWN0VHlwZUdlbmVyYXRvcnMuVHlwZVN1cHBvcnQ7CiBpbXBvcnQgb3JnLnF1aWNrdGhlb3JpZXMuY29yZS5HZW47CkBAIC0yNjYsNyArMjY3LDcgQEAKICAgICAgICAgICAgIGZvciAoQnl0ZUJ1ZmZlciB2YWx1ZSA6IHRlc3RjYXNlLnVuaXF1ZVJvd3MpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbWFwLnB1dCh2YWx1ZSwgY291bnQpOwotICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJbXSB0dXBsZUJ1ZmZlcnMgPSB0dXBsZVR5cGUuc3BsaXQodmFsdWUpOworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJbXSB0dXBsZUJ1ZmZlcnMgPSB0dXBsZVR5cGUuc3BsaXQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCB2YWx1ZSk7CiAKICAgICAgICAgICAgICAgICAvLyB1c2UgY2FzdCB0byBhdm9pZCB3YXJuaW5nCiAgICAgICAgICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGlkLCB2YWx1ZSkgVkFMVUVTICg/LCA/KSIsIHR1cGxlKChPYmplY3RbXSkgdHVwbGVCdWZmZXJzKSwgY291bnQpOwpAQCAtMzA0LDcgKzMwNSw3IEBACiAgICAgICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgdmFsdWUgOiB0ZXN0Y2FzZS51bmlxdWVSb3dzKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG1hcC5wdXQodmFsdWUsIGNvdW50KTsKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyW10gdHVwbGVCdWZmZXJzID0gdHVwbGVUeXBlLnNwbGl0KHZhbHVlKTsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyW10gdHVwbGVCdWZmZXJzID0gdHVwbGVUeXBlLnNwbGl0KEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgdmFsdWUpOwogCiAgICAgICAgICAgICAgICAgLy8gdXNlIGNhc3QgdG8gYXZvaWQgd2FybmluZwogICAgICAgICAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgY2ssIHZhbHVlKSBWQUxVRVMgKD8sID8sID8pIiwgMSwgdHVwbGUoKE9iamVjdFtdKSB0dXBsZUJ1ZmZlcnMpLCBjb3VudCk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1R5cGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1R5cGVUZXN0LmphdmEKaW5kZXggY2ViOTZiNi4uMTE5YTBmZSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9UeXBlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVHlwZVRlc3QuamF2YQpAQCAtNDksMTIgKzQ5LDggQEAKICAgICB7CiAgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGEgaW50LCBiIHRpbWVzdGFtcCwgYyBiaWdpbnQsIGQgdmFyaW50LCBQUklNQVJZIEtFWSAoYSwgYiwgYywgZCkpIik7CiAKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGEsIGIsIGMsIGQpIFZBTFVFUyAoMCwgdG9Vbml4VGltZXN0YW1wKG5vdygpKSwgdG9UaW1lc3RhbXAobm93KCkpLCB0b1RpbWVzdGFtcChub3coKSkpIik7Ci0gICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcmVzdWx0cyA9IGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYT0wIEFORCBiIDw9IHRvVW5peFRpbWVzdGFtcChub3coKSkiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdHMuc2l6ZSgpKTsKLQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYiwgYywgZCkgVkFMVUVTICgxLCB1bml4VGltZXN0YW1wT2Yobm93KCkpLCBkYXRlT2Yobm93KCkpLCBkYXRlT2Yobm93KCkpKSIpOwotICAgICAgICByZXN1bHRzID0gZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBhPTEgQU5EIGIgPD0gdG9Vbml4VGltZXN0YW1wKG5vdygpKSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYiwgYywgZCkgVkFMVUVTICgwLCB0b191bml4X3RpbWVzdGFtcChub3coKSksIHRvX3RpbWVzdGFtcChub3coKSksIHRvX3RpbWVzdGFtcChub3coKSkpIik7CisgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcmVzdWx0cyA9IGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYT0wIEFORCBiIDw9IHRvX3VuaXhfdGltZXN0YW1wKG5vdygpKSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzdWx0cy5zaXplKCkpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9VRkF1dGhUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGQXV0aFRlc3QuamF2YQppbmRleCA0YTJkNzFmLi45NjgxODI3IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGQXV0aFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGQXV0aFRlc3QuamF2YQpAQCAtMjgsOSArMjgsOSBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuVXNlckZ1bmN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uTmFtZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuQmF0Y2hTdGF0ZW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLk1vZGlmaWNhdGlvblN0YXRlbWVudDsKQEAgLTMxMSwxNCArMzExLDE0IEBACiAgICAgcHVibGljIHZvaWQgc3lzdGVtRnVuY3Rpb25zUmVxdWlyZU5vRXhwbGljaXRQcml2aWxlZ2VzKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKICAgICAgICAgLy8gd2l0aCB0ZXJtaW5hbCBhcmd1bWVudHMsIHNvIGV2YWx1YXRlZCBhdCBwcmVwYXJlIHRpbWUKLSAgICAgICAgU3RyaW5nIGNxbCA9IFN0cmluZy5mb3JtYXQoIlVQREFURSAlcyBTRVQgdjIgPSAwIFdIRVJFIGsgPSBibG9iYXNpbnQoaW50YXNibG9iKDApKSBhbmQgdjEgPSAwIiwKKyAgICAgICAgU3RyaW5nIGNxbCA9IFN0cmluZy5mb3JtYXQoIlVQREFURSAlcyBTRVQgdjIgPSAwIFdIRVJFIGsgPSBibG9iX2FzX2ludChpbnRfYXNfYmxvYigwKSkgYW5kIHYxID0gMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWVNQQUNFICsgIi4iICsgY3VycmVudFRhYmxlKCkpOwogICAgICAgICBnZXRTdGF0ZW1lbnQoY3FsKS5hdXRob3JpemUoY2xpZW50U3RhdGUpOwogCiAgICAgICAgIC8vIHdpdGggbm9uLXRlcm1pbmFsIGFyZ3VtZW50cywgc28gZXZhbHVhdGVkIGF0IGV4ZWN1dGlvbgogICAgICAgICBTdHJpbmcgZnVuY3Rpb25OYW1lID0gY3JlYXRlU2ltcGxlRnVuY3Rpb24oKTsKICAgICAgICAgZ3JhbnRFeGVjdXRlT25GdW5jdGlvbihmdW5jdGlvbk5hbWUpOwotICAgICAgICBjcWwgPSBTdHJpbmcuZm9ybWF0KCJVUERBVEUgJXMgU0VUIHYyID0gMCBXSEVSRSBrID0gYmxvYmFzaW50KGludGFzYmxvYiglcykpIGFuZCB2MSA9IDAiLAorICAgICAgICBjcWwgPSBTdHJpbmcuZm9ybWF0KCJVUERBVEUgJXMgU0VUIHYyID0gMCBXSEVSRSBrID0gYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IoJXMpKSBhbmQgdjEgPSAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlTUEFDRSArICIuIiArIGN1cnJlbnRUYWJsZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQ2FsbChmdW5jdGlvbk5hbWUpKTsKICAgICAgICAgZ2V0U3RhdGVtZW50KGNxbCkuYXV0aG9yaXplKGNsaWVudFN0YXRlKTsKQEAgLTYzNSw3ICs2MzUsNyBAQAogICAgICAgICAvLyBJdCBpcyBoZXJlIHRvIGF2b2lkIGhhdmluZyB0byBkdXBsaWNhdGUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgQ3FsUGFyc2VyCiAgICAgICAgIC8vIGZvciB0cmFuc2Zvcm1pbmcgY3FsIHR5cGVzIGludG8gQWJzdHJhY3RUeXBlcwogICAgICAgICBGdW5jdGlvbk5hbWUgZm4gPSBwYXJzZUZ1bmN0aW9uTmFtZShmdW5jdGlvbk5hbWUpOwotICAgICAgICBDb2xsZWN0aW9uPEZ1bmN0aW9uPiBmdW5jdGlvbnMgPSBTY2hlbWEuaW5zdGFuY2UuZ2V0RnVuY3Rpb25zKGZuKTsKKyAgICAgICAgQ29sbGVjdGlvbjxVc2VyRnVuY3Rpb24+IGZ1bmN0aW9ucyA9IFNjaGVtYS5pbnN0YW5jZS5nZXRVc2VyRnVuY3Rpb25zKGZuKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkV4cGVjdGVkIGEgc2luZ2xlIGZ1bmN0aW9uIGRlZmluaXRpb24gZm9yICVzLCBidXQgZm91bmQgJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbk5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucy5zaXplKCkpLApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9VRkphdmFUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGSmF2YVRlc3QuamF2YQppbmRleCA0N2YxY2JmLi5hZDU5YjRjIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGSmF2YVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGSmF2YVRlc3QuamF2YQpAQCAtNjU3LDcgKzY1Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJCRyZXR1cm4gIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICB1ZHQuZ2V0U3RyaW5nKFwidHh0XCIpOyQkOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTmFtZTFyZXBsYWNlLCB0eXBlKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgU2NoZW1hLmluc3RhbmNlLmdldEZ1bmN0aW9ucyhwYXJzZUZ1bmN0aW9uTmFtZShmTmFtZTFyZXBsYWNlKSkuc2l6ZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBTY2hlbWEuaW5zdGFuY2UuZ2V0VXNlckZ1bmN0aW9ucyhwYXJzZUZ1bmN0aW9uTmFtZShmTmFtZTFyZXBsYWNlKSkuc2l6ZSgpKTsKICAgICAgICAgZXhlY3V0ZShTdHJpbmcuZm9ybWF0KCJDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiAlcyggdWR0ICVzICkgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0FMTEVEIE9OIE5VTEwgSU5QVVQgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBpbnQgIiArCkBAIC02NjUsNyArNjY1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAkJHJldHVybiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgIEludGVnZXIudmFsdWVPZih1ZHQuZ2V0SW50KFwiaVwiKSk7JCQ7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZOYW1lMnJlcGxhY2UsIHR5cGUpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBTY2hlbWEuaW5zdGFuY2UuZ2V0RnVuY3Rpb25zKHBhcnNlRnVuY3Rpb25OYW1lKGZOYW1lMnJlcGxhY2UpKS5zaXplKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIFNjaGVtYS5pbnN0YW5jZS5nZXRVc2VyRnVuY3Rpb25zKHBhcnNlRnVuY3Rpb25OYW1lKGZOYW1lMnJlcGxhY2UpKS5zaXplKCkpOwogICAgICAgICBleGVjdXRlKFN0cmluZy5mb3JtYXQoIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICVzKCB1ZHQgJXMgKSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDQUxMRUQgT04gTlVMTCBJTlBVVCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGRvdWJsZSAiICsKQEAgLTY3Myw3ICs2NzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICQkcmV0dXJuICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgRG91YmxlLnZhbHVlT2YodWR0LmdldERvdWJsZShcImFkZGVkXCIpKTskJDsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZk5hbWUzcmVwbGFjZSwgdHlwZSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIFNjaGVtYS5pbnN0YW5jZS5nZXRGdW5jdGlvbnMocGFyc2VGdW5jdGlvbk5hbWUoZk5hbWUzcmVwbGFjZSkpLnNpemUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgU2NoZW1hLmluc3RhbmNlLmdldFVzZXJGdW5jdGlvbnMocGFyc2VGdW5jdGlvbk5hbWUoZk5hbWUzcmVwbGFjZSkpLnNpemUoKSk7CiAgICAgICAgIGV4ZWN1dGUoU3RyaW5nLmZvcm1hdCgiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gJXMoIHVkdCAlcyApICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgJXMgIiArCkBAIC02ODEsNyArNjgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAkJHJldHVybiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgIHVkdDskJDsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZk5hbWU0cmVwbGFjZSwgdHlwZSwgdHlwZSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIFNjaGVtYS5pbnN0YW5jZS5nZXRGdW5jdGlvbnMocGFyc2VGdW5jdGlvbk5hbWUoZk5hbWU0cmVwbGFjZSkpLnNpemUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgU2NoZW1hLmluc3RhbmNlLmdldFVzZXJGdW5jdGlvbnMocGFyc2VGdW5jdGlvbk5hbWUoZk5hbWU0cmVwbGFjZSkpLnNpemUoKSk7CiAKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgIiArIGZOYW1lMXJlcGxhY2UgKyAiKHVkdCkgRlJPTSAlcyBXSEVSRSBrZXkgPSAyIiksCiAgICAgICAgICAgICAgICAgICAgcm93KCJ0d28iKSk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGUHVyZVNjcmlwdFR1cGxlQ29sbGVjdGlvblRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVUZQdXJlU2NyaXB0VHVwbGVDb2xsZWN0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTgwMWIzLi4wMDAwMDAwCi0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVUZQdXJlU2NyaXB0VHVwbGVDb2xsZWN0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy52YWxpZGF0aW9uLmVudGl0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5EYXRhVHlwZTsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuVHVwbGVUeXBlOwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5UdXBsZVZhbHVlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBVRlB1cmVTY3JpcHRUdXBsZUNvbGxlY3Rpb25UZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCi17Ci0gICAgLy8gSnVzdCBKYXZhU2NyaXB0IFVERnMgdG8gY2hlY2sgaG93IFVERiAtIGVzcGVjaWFsbHkgc2VjdXJpdHkvY2xhc3MtbG9hZGluZy9zYW5kYm94aW5nIHN0dWZmIC0KLSAgICAvLyBiZWhhdmVzLCBpZiBubyBKYXZhIFVERiBoYXMgYmVlbiBleGVjdXRlZCBiZWZvcmUuCi0KLSAgICAvLyBEbyBub3QgYWRkIGFueSBvdGhlciB0ZXN0IGhlcmUhCi0gICAgLy8gU2VlIENBU1NBTkRSQS0xMDE0MQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SmF2YXNjcmlwdFR1cGxlVHlwZUNvbGxlY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBTdHJpbmcgdHVwbGVUeXBlRGVmID0gInR1cGxlPGRvdWJsZSwgbGlzdDxkb3VibGU+LCBzZXQ8dGV4dD4sIG1hcDxpbnQsIGJvb2xlYW4+PiI7Ci0gICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGtleSBpbnQgcHJpbWFyeSBrZXksIHR1cCBmcm96ZW48IiArIHR1cGxlVHlwZURlZiArICI+KSIpOwotCi0gICAgICAgIFN0cmluZyBmVHVwMSA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFX1BFUl9URVNULCB0dXBsZVR5cGVEZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgRlVOQ1RJT04gJXMoIHR1cCAiICsgdHVwbGVUeXBlRGVmICsgIiApICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIHR1cGxlPGRvdWJsZSwgbGlzdDxkb3VibGU+LCBzZXQ8dGV4dD4sIG1hcDxpbnQsIGJvb2xlYW4+PiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHRcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJCQiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICB0dXA7JCQ7Iik7Ci0gICAgICAgIFN0cmluZyBmVHVwMiA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFX1BFUl9URVNULCB0dXBsZVR5cGVEZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgRlVOQ1RJT04gJXMoIHR1cCAiICsgdHVwbGVUeXBlRGVmICsgIiApICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGRvdWJsZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHRcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJCQiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICB0dXAuZ2V0RG91YmxlKDApOyQkOyIpOwotICAgICAgICBTdHJpbmcgZlR1cDMgPSBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRV9QRVJfVEVTVCwgdHVwbGVUeXBlRGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OICVzKCB0dXAgIiArIHR1cGxlVHlwZURlZiArICIgKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBsaXN0PGRvdWJsZT4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICQkIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgdHVwLmdldExpc3QoMSwgamF2YS5sYW5nLkRvdWJsZS5jbGFzcyk7JCQ7Iik7Ci0gICAgICAgIFN0cmluZyBmVHVwNCA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFX1BFUl9URVNULCB0dXBsZVR5cGVEZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgRlVOQ1RJT04gJXMoIHR1cCAiICsgdHVwbGVUeXBlRGVmICsgIiApICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIHNldDx0ZXh0PiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHRcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJCQiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICB0dXAuZ2V0U2V0KDIsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MpOyQkOyIpOwotICAgICAgICBTdHJpbmcgZlR1cDUgPSBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRV9QRVJfVEVTVCwgdHVwbGVUeXBlRGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OICVzKCB0dXAgIiArIHR1cGxlVHlwZURlZiArICIgKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBtYXA8aW50LCBib29sZWFuPiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHRcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJCQiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICB0dXAuZ2V0TWFwKDMsIGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLCBqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcyk7JCQ7Iik7Ci0KLSAgICAgICAgTGlzdDxEb3VibGU+IGxpc3QgPSBBcnJheXMuYXNMaXN0KDFkLCAyZCwgM2QpOwotICAgICAgICBTZXQ8U3RyaW5nPiBzZXQgPSBuZXcgVHJlZVNldDw+KEFycmF5cy5hc0xpc3QoIm9uZSIsICJ0aHJlZSIsICJ0d28iKSk7Ci0gICAgICAgIE1hcDxJbnRlZ2VyLCBCb29sZWFuPiBtYXAgPSBuZXcgVHJlZU1hcDw+KCk7Ci0gICAgICAgIG1hcC5wdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIG1hcC5wdXQoMiwgZmFsc2UpOwotICAgICAgICBtYXAucHV0KDMsIHRydWUpOwotCi0gICAgICAgIE9iamVjdCB0ID0gdHVwbGUoMWQsIGxpc3QsIHNldCwgbWFwKTsKLQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoa2V5LCB0dXApIFZBTFVFUyAoMSwgPykiLCB0KTsKLQotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAiICsgZlR1cDEgKyAiKHR1cCkgRlJPTSAlcyBXSEVSRSBrZXkgPSAxIiksCi0gICAgICAgICAgICAgICAgICAgcm93KHQpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgIiArIGZUdXAyICsgIih0dXApIEZST00gJXMgV0hFUkUga2V5ID0gMSIpLAotICAgICAgICAgICAgICAgICAgIHJvdygxZCkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAiICsgZlR1cDMgKyAiKHR1cCkgRlJPTSAlcyBXSEVSRSBrZXkgPSAxIiksCi0gICAgICAgICAgICAgICAgICAgcm93KGxpc3QpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgIiArIGZUdXA0ICsgIih0dXApIEZST00gJXMgV0hFUkUga2V5ID0gMSIpLAotICAgICAgICAgICAgICAgICAgIHJvdyhzZXQpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgIiArIGZUdXA1ICsgIih0dXApIEZST00gJXMgV0hFUkUga2V5ID0gMSIpLAotICAgICAgICAgICAgICAgICAgIHJvdyhtYXApKTsKLQotICAgICAgICAvLyBzYW1lIHRlc3QgLSBidXQgdmlhIG5hdGl2ZSBwcm90b2NvbAotICAgICAgICAvLyB3ZSB1c2UgcHJvdG9jb2wgVjMgaGVyZSB0byBlbmNvZGUgdGhlIGV4cGVjdGVkIHZlcnNpb24gYmVjYXVzZSB0aGUgc2VydmVyCi0gICAgICAgIC8vIGFsd2F5cyBzZXJpYWxpemVzIENvbGxlY3Rpb25zIHVzaW5nIFYzIC0gc2VlIENvbGxlY3Rpb25TZXJpYWxpemVyJ3MKLSAgICAgICAgLy8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSBtZXRob2RzLgotICAgICAgICBUdXBsZVR5cGUgdFR5cGUgPSB0dXBsZVR5cGVPZihQcm90b2NvbFZlcnNpb24uVjMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFUeXBlLmNkb3VibGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVR5cGUubGlzdChEYXRhVHlwZS5jZG91YmxlKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZS5zZXQoRGF0YVR5cGUudGV4dCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVR5cGUubWFwKERhdGFUeXBlLmNpbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFUeXBlLmNib29sZWFuKCkpKTsKLSAgICAgICAgVHVwbGVWYWx1ZSB0dXAgPSB0VHlwZS5uZXdWYWx1ZSgxZCwgbGlzdCwgc2V0LCBtYXApOwotICAgICAgICBmb3IgKFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uIDogUFJPVE9DT0xfVkVSU0lPTlMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydFJvd3NOZXQodmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZU5ldCh2ZXJzaW9uLCAiU0VMRUNUICIgKyBmVHVwMSArICIodHVwKSBGUk9NICVzIFdIRVJFIGtleSA9IDEiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KHR1cCkpOwotICAgICAgICAgICAgYXNzZXJ0Um93c05ldCh2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlTmV0KHZlcnNpb24sICJTRUxFQ1QgIiArIGZUdXAyICsgIih0dXApIEZST00gJXMgV0hFUkUga2V5ID0gMSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICByb3coMWQpKTsKLSAgICAgICAgICAgIGFzc2VydFJvd3NOZXQodmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZU5ldCh2ZXJzaW9uLCAiU0VMRUNUICIgKyBmVHVwMyArICIodHVwKSBGUk9NICVzIFdIRVJFIGtleSA9IDEiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGxpc3QpKTsKLSAgICAgICAgICAgIGFzc2VydFJvd3NOZXQodmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZU5ldCh2ZXJzaW9uLCAiU0VMRUNUICIgKyBmVHVwNCArICIodHVwKSBGUk9NICVzIFdIRVJFIGtleSA9IDEiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KHNldCkpOwotICAgICAgICAgICAgYXNzZXJ0Um93c05ldCh2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlTmV0KHZlcnNpb24sICJTRUxFQ1QgIiArIGZUdXA1ICsgIih0dXApIEZST00gJXMgV0hFUkUga2V5ID0gMSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICByb3cobWFwKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGU2NyaXB0VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9VRlNjcmlwdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzM2U2Zi4uMDAwMDAwMAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGU2NyaXB0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy52YWxpZGF0aW9uLmVudGl0aWVzOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlVVSUQ7Ci0KLWltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlVudHlwZWRSZXN1bHRTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb25OYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuRnVuY3Rpb25FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEOwotCi1wdWJsaWMgY2xhc3MgVUZTY3JpcHRUZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCi17Ci0gICAgLy8gSnVzdCBKYXZhU2NyaXB0IFVERnMgdG8gY2hlY2sgaG93IFVERiAtIGVzcGVjaWFsbHkgc2VjdXJpdHkvY2xhc3MtbG9hZGluZy9zYW5kYm94aW5nIHN0dWZmIC0KLSAgICAvLyBiZWhhdmVzLCBpZiBubyBKYXZhIFVERiBoYXMgYmVlbiBleGVjdXRlZCBiZWZvcmUuCi0KLSAgICAvLyBEbyBub3QgYWRkIGFueSBvdGhlciB0ZXN0IGhlcmUgLSBlc3BlY2lhbGx5IG5vbmUgdXNpbmcgSmF2YSBVREZzCi0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXZhc2NyaXB0U2ltcGxlQ29sbGVjdGlvbnMoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrZXkgaW50IHByaW1hcnkga2V5LCBsc3QgbGlzdDxkb3VibGU+LCBzdCBzZXQ8dGV4dD4sIG1wIG1hcDxpbnQsIGJvb2xlYW4+KSIpOwotCi0gICAgICAgIFN0cmluZyBmTmFtZTEgPSBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRV9QRVJfVEVTVCwgImxpc3Q8ZG91YmxlPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OICVzKCBsc3QgbGlzdDxkb3VibGU+ICkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBsaXN0PGRvdWJsZT4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ2xzdDsnOyIpOwotICAgICAgICBTdHJpbmcgZk5hbWUyID0gY3JlYXRlRnVuY3Rpb24oS0VZU1BBQ0VfUEVSX1RFU1QsICJzZXQ8dGV4dD4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBGVU5DVElPTiAlcyggc3Qgc2V0PHRleHQ+ICkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBzZXQ8dGV4dD4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3N0Oyc7Iik7Ci0gICAgICAgIFN0cmluZyBmTmFtZTMgPSBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRV9QRVJfVEVTVCwgIm1hcDxpbnQsIGJvb2xlYW4+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgRlVOQ1RJT04gJXMoIG1wIG1hcDxpbnQsIGJvb2xlYW4+ICkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBtYXA8aW50LCBib29sZWFuPiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnbXA7JzsiKTsKLQotICAgICAgICBMaXN0PERvdWJsZT4gbGlzdCA9IEFycmF5cy5hc0xpc3QoMWQsIDJkLCAzZCk7Ci0gICAgICAgIFNldDxTdHJpbmc+IHNldCA9IG5ldyBUcmVlU2V0PD4oQXJyYXlzLmFzTGlzdCgib25lIiwgInRocmVlIiwgInR3byIpKTsKLSAgICAgICAgTWFwPEludGVnZXIsIEJvb2xlYW4+IG1hcCA9IG5ldyBUcmVlTWFwPD4oKTsKLSAgICAgICAgbWFwLnB1dCgxLCB0cnVlKTsKLSAgICAgICAgbWFwLnB1dCgyLCBmYWxzZSk7Ci0gICAgICAgIG1hcC5wdXQoMywgdHJ1ZSk7Ci0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGtleSwgbHN0LCBzdCwgbXApIFZBTFVFUyAoMSwgPywgPywgPykiLCBsaXN0LCBzZXQsIG1hcCk7Ci0KLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbHN0LCBzdCwgbXAgRlJPTSAlcyBXSEVSRSBrZXkgPSAxIiksCi0gICAgICAgICAgICAgICAgICAgcm93KGxpc3QsIHNldCwgbWFwKSk7Ci0KLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgIiArIGZOYW1lMSArICIobHN0KSwgIiArIGZOYW1lMiArICIoc3QpLCAiICsgZk5hbWUzICsgIihtcCkgRlJPTSAlcyBXSEVSRSBrZXkgPSAxIiksCi0gICAgICAgICAgICAgICAgICAgcm93KGxpc3QsIHNldCwgbWFwKSk7Ci0KLSAgICAgICAgZm9yIChQcm90b2NvbFZlcnNpb24gdmVyc2lvbiA6IFBST1RPQ09MX1ZFUlNJT05TKQotICAgICAgICAgICAgYXNzZXJ0Um93c05ldCh2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlTmV0KHZlcnNpb24sICJTRUxFQ1QgIiArIGZOYW1lMSArICIobHN0KSwgIiArIGZOYW1lMiArICIoc3QpLCAiICsgZk5hbWUzICsgIihtcCkgRlJPTSAlcyBXSEVSRSBrZXkgPSAxIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhsaXN0LCBzZXQsIG1hcCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEphdmFzY3JpcHRUdXBsZVR5cGUoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrZXkgaW50IHByaW1hcnkga2V5LCB0dXAgZnJvemVuPHR1cGxlPGRvdWJsZSwgdGV4dCwgaW50LCBib29sZWFuPj4pIik7Ci0KLSAgICAgICAgU3RyaW5nIGZOYW1lID0gY3JlYXRlRnVuY3Rpb24oS0VZU1BBQ0VfUEVSX1RFU1QsICJ0dXBsZTxkb3VibGUsIHRleHQsIGludCwgYm9vbGVhbj4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OICVzKCB0dXAgdHVwbGU8ZG91YmxlLCB0ZXh0LCBpbnQsIGJvb2xlYW4+ICkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgdHVwbGU8ZG91YmxlLCB0ZXh0LCBpbnQsIGJvb2xlYW4+ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAkJHR1cDskJDsiKTsKLQotICAgICAgICBPYmplY3QgdCA9IHR1cGxlKDFkLCAiZm9vIiwgMiwgdHJ1ZSk7Ci0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGtleSwgdHVwKSBWQUxVRVMgKDEsID8pIiwgdCk7Ci0KLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgdHVwIEZST00gJXMgV0hFUkUga2V5ID0gMSIpLAotICAgICAgICAgICAgICAgICAgIHJvdyh0KSk7Ci0KLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgIiArIGZOYW1lICsgIih0dXApIEZST00gJXMgV0hFUkUga2V5ID0gMSIpLAotICAgICAgICAgICAgICAgICAgIHJvdyh0KSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SmF2YXNjcmlwdFVzZXJUeXBlKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgU3RyaW5nIHR5cGUgPSBjcmVhdGVUeXBlKCJDUkVBVEUgVFlQRSAlcyAodHh0IHRleHQsIGkgaW50KSIpOwotCi0gICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGtleSBpbnQgcHJpbWFyeSBrZXksIHVkdCBmcm96ZW48IiArIHR5cGUgKyAiPikiKTsKLQotICAgICAgICBTdHJpbmcgZlVkdDEgPSBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRSwgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBGVU5DVElPTiAlcyggdWR0ICIgKyB0eXBlICsgIiApICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TICIgKyB0eXBlICsgJyAnICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHRcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJCQiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgdWR0OyQkOyIpOwotICAgICAgICBTdHJpbmcgZlVkdDIgPSBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRSwgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBGVU5DVElPTiAlcyggdWR0ICIgKyB0eXBlICsgIiApICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIHRleHQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICQkIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgIHVkdC5nZXRTdHJpbmcoXCJ0eHRcIik7JCQ7Iik7Ci0gICAgICAgIFN0cmluZyBmVWR0MyA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OICVzKCB1ZHQgIiArIHR5cGUgKyAiICkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgaW50ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAkJCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICB1ZHQuZ2V0SW50KFwiaVwiKTskJDsiKTsKLQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoa2V5LCB1ZHQpIFZBTFVFUyAoMSwge3R4dDogJ29uZScsIGk6MX0pIik7Ci0KLSAgICAgICAgVW50eXBlZFJlc3VsdFNldCByb3dzID0gZXhlY3V0ZSgiU0VMRUNUICIgKyBmVWR0MSArICIodWR0KSBGUk9NICVzIFdIRVJFIGtleSA9IDEiKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCByb3dzLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICIgKyBmVWR0MiArICIodWR0KSBGUk9NICVzIFdIRVJFIGtleSA9IDEiKSwKLSAgICAgICAgICAgICAgICAgICByb3coIm9uZSIpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgIiArIGZVZHQzICsgIih1ZHQpIEZST00gJXMgV0hFUkUga2V5ID0gMSIpLAotICAgICAgICAgICAgICAgICAgIHJvdygxKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SmF2YXNjcmlwdFVUQ29sbGVjdGlvbnMoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBTdHJpbmcgdHlwZSA9IGNyZWF0ZVR5cGUoIkNSRUFURSBUWVBFICVzICh0eHQgdGV4dCwgaSBpbnQpIik7Ci0KLSAgICAgICAgY3JlYXRlVGFibGUoU3RyaW5nLmZvcm1hdCgiQ1JFQVRFIFRBQkxFICUlcyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGtleSBpbnQgcHJpbWFyeSBrZXksIGxzdCBsaXN0PGZyb3plbjwlcz4+LCBzdCBzZXQ8ZnJvemVuPCVzPj4sIG1wIG1hcDxpbnQsIGZyb3plbjwlcz4+KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgdHlwZSwgdHlwZSkpOwotCi0gICAgICAgIFN0cmluZyBmTmFtZSA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLCAibGlzdDxmcm96ZW48IiArIHR5cGUgKyAiPj4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OICVzKCBsc3QgbGlzdDxmcm96ZW48IiArIHR5cGUgKyAiPj4gKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyB0ZXh0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAkJCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBsc3QuZ2V0KDEpLmdldFN0cmluZyhcInR4dFwiKTskJDsiKTsKLSAgICAgICAgY3JlYXRlRnVuY3Rpb25PdmVybG9hZChmTmFtZSwgInNldDxmcm96ZW48IiArIHR5cGUgKyAiPj4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgRlVOQ1RJT04gJXMoIHN0IHNldDxmcm96ZW48IiArIHR5cGUgKyAiPj4gKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgdGV4dCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICQkIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgc3QuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0U3RyaW5nKFwidHh0XCIpOyQkOyIpOwotICAgICAgICBjcmVhdGVGdW5jdGlvbk92ZXJsb2FkKGZOYW1lLCAibWFwPGludCwgZnJvemVuPCIgKyB0eXBlICsgIj4+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OICVzKCBtcCBtYXA8aW50LCBmcm96ZW48IiArIHR5cGUgKyAiPj4gKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgdGV4dCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICQkIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgbXAuZ2V0KGphdmEubGFuZy5JbnRlZ2VyLnZhbHVlT2YoMykpLmdldFN0cmluZyhcInR4dFwiKTskJDsiKTsKLQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoa2V5LCBsc3QsIHN0LCBtcCkgdmFsdWVzICgxLCAiICsKLSAgICAgICAgICAgICAgICAvLyBsaXN0PGZyb3plbjxVRFQ+PgotICAgICAgICAgICAgICAgICJbIHt0eHQ6ICdvbmUnLCBpOjF9LCB7dHh0OiAndGhyZWUnLCBpOjF9LCB7dHh0OiAnb25lJywgaToxfSBdICwgIiArCi0gICAgICAgICAgICAgICAgLy8gc2V0PGZyb3plbjxVRFQ+PgotICAgICAgICAgICAgICAgICJ7IHt0eHQ6ICdvbmUnLCBpOjF9LCB7dHh0OiAndGhyZWUnLCBpOjN9LCB7dHh0OiAndHdvJywgaToyfSB9LCAiICsKLSAgICAgICAgICAgICAgICAvLyBtYXA8aW50LCBmcm96ZW48VURUPj4KLSAgICAgICAgICAgICAgICAieyAxOiB7dHh0OiAnb25lJywgaToxfSwgMjoge3R4dDogJ29uZScsIGk6M30sIDM6IHt0eHQ6ICd0d28nLCBpOjJ9IH0pIik7Ci0KLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgIiArIGZOYW1lICsgIihsc3QpIEZST00gJXMgV0hFUkUga2V5ID0gMSIpLAotICAgICAgICAgICAgICAgICAgIHJvdygidGhyZWUiKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICIgKyBmTmFtZSArICIoc3QpIEZST00gJXMgV0hFUkUga2V5ID0gMSIpLAotICAgICAgICAgICAgICAgICAgIHJvdygib25lIikpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAiICsgZk5hbWUgKyAiKG1wKSBGUk9NICVzIFdIRVJFIGtleSA9IDEiKSwKLSAgICAgICAgICAgICAgICAgICByb3coInR3byIpKTsKLQotICAgICAgICBTdHJpbmcgY3FsU2VsZWN0ID0gIlNFTEVDVCAiICsgZk5hbWUgKyAiKGxzdCksICIgKyBmTmFtZSArICIoc3QpLCAiICsgZk5hbWUgKyAiKG1wKSBGUk9NICVzIFdIRVJFIGtleSA9IDEiOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoY3FsU2VsZWN0KSwKLSAgICAgICAgICAgICAgICAgICByb3coInRocmVlIiwgIm9uZSIsICJ0d28iKSk7Ci0KLSAgICAgICAgLy8gc2FtZSB0ZXN0IC0gYnV0IHZpYSBuYXRpdmUgcHJvdG9jb2wKLSAgICAgICAgZm9yIChQcm90b2NvbFZlcnNpb24gdmVyc2lvbiA6IFBST1RPQ09MX1ZFUlNJT05TKQotICAgICAgICAgICAgYXNzZXJ0Um93c05ldCh2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlTmV0KHZlcnNpb24sIGNxbFNlbGVjdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygidGhyZWUiLCAib25lIiwgInR3byIpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXZhc2NyaXB0RnVuY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrZXkgaW50IHByaW1hcnkga2V5LCB2YWwgZG91YmxlKSIpOwotCi0gICAgICAgIFN0cmluZyBmdW5jdGlvbkJvZHkgPSAnXG4nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIE1hdGguc2luKHZhbCk7XG4iOwotCi0gICAgICAgIFN0cmluZyBmTmFtZSA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLCAiZG91YmxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICVzKHZhbCBkb3VibGUpICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGRvdWJsZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHRcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJyIgKyBmdW5jdGlvbkJvZHkgKyAiJzsiKTsKLQotICAgICAgICBGdW5jdGlvbk5hbWUgZk5hbWVOYW1lID0gcGFyc2VGdW5jdGlvbk5hbWUoZk5hbWUpOwotCi0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGxhbmd1YWdlLCBib2R5IEZST00gc3lzdGVtX3NjaGVtYS5mdW5jdGlvbnMgV0hFUkUga2V5c3BhY2VfbmFtZT0/IEFORCBmdW5jdGlvbl9uYW1lPT8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZk5hbWVOYW1lLmtleXNwYWNlLCBmTmFtZU5hbWUubmFtZSksCi0gICAgICAgICAgICAgICAgICAgcm93KCJqYXZhc2NyaXB0IiwgZnVuY3Rpb25Cb2R5KSk7Ci0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGtleSwgdmFsKSBWQUxVRVMgKD8sID8pIiwgMSwgMWQpOwotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoa2V5LCB2YWwpIFZBTFVFUyAoPywgPykiLCAyLCAyZCk7Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrZXksIHZhbCkgVkFMVUVTICg/LCA/KSIsIDMsIDNkKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1Qga2V5LCB2YWwsICIgKyBmTmFtZSArICIodmFsKSBGUk9NICVzIiksCi0gICAgICAgICAgICAgICAgICAgcm93KDEsIDFkLCBNYXRoLnNpbigxZCkpLAotICAgICAgICAgICAgICAgICAgIHJvdygyLCAyZCwgTWF0aC5zaW4oMmQpKSwKLSAgICAgICAgICAgICAgICAgICByb3coMywgM2QsIE1hdGguc2luKDNkKSkKLSAgICAgICAgKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXZhc2NyaXB0QmFkUmV0dXJuVHlwZSgpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGtleSBpbnQgcHJpbWFyeSBrZXksIHZhbCBkb3VibGUpIik7Ci0KLSAgICAgICAgU3RyaW5nIGZOYW1lID0gY3JlYXRlRnVuY3Rpb24oS0VZU1BBQ0UsICJkb3VibGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gJXModmFsIGRvdWJsZSkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgZG91YmxlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnXCJzdHJpbmdcIjsnOyIpOwotCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrZXksIHZhbCkgVkFMVUVTICg/LCA/KSIsIDEsIDFkKTsKLSAgICAgICAgLy8gdGhyb3dzIElSRSB3aXRoIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiSW52YWxpZCB2YWx1ZSBmb3IgQ1FMIHR5cGUgZG91YmxlIiwgIlNFTEVDVCBrZXksIHZhbCwgIiArIGZOYW1lICsgIih2YWwpIEZST00gJXMiKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXZhc2NyaXB0VGhyb3coKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrZXkgaW50IHByaW1hcnkga2V5LCB2YWwgZG91YmxlKSIpOwotCi0gICAgICAgIFN0cmluZyBmTmFtZSA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLCAiZG91YmxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICVzKHZhbCBkb3VibGUpICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGRvdWJsZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHRcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3Rocm93IFwiZm9vbFwiOyc7Iik7Ci0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGtleSwgdmFsKSBWQUxVRVMgKD8sID8pIiwgMSwgMWQpOwotICAgICAgICAvLyB0aHJvd3MgSVJFIHdpdGggU2NyaXB0RXhjZXB0aW9uCi0gICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoImZvb2wiLCBGdW5jdGlvbkV4ZWN1dGlvbkV4Y2VwdGlvbi5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VMRUNUIGtleSwgdmFsLCAiICsgZk5hbWUgKyAiKHZhbCkgRlJPTSAlcyIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNjcmlwdFJldHVyblR5cGVDYXN0aW5nKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoa2V5IGludCBwcmltYXJ5IGtleSwgdmFsIGRvdWJsZSkiKTsKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGtleSwgdmFsKSBWQUxVRVMgKD8sID8pIiwgMSwgMWQpOwotCi0gICAgICAgIE9iamVjdFtdW10gdmFyaWF0aW9ucyA9IHsKLSAgICAgICAgbmV3IE9iamVjdFtdICAgIHsgICAidHJ1ZSIsICAgICAiYm9vbGVhbiIsICB0cnVlICAgIH0sCi0gICAgICAgIG5ldyBPYmplY3RbXSAgICB7ICAgImZhbHNlIiwgICAgImJvb2xlYW4iLCAgZmFsc2UgICB9LAotICAgICAgICBuZXcgT2JqZWN0W10gICAgeyAgICIxMDAiLCAgICAgICJ0aW55aW50IiwgIChieXRlKTEwMCB9LAotICAgICAgICBuZXcgT2JqZWN0W10gICAgeyAgICIxMDAuIiwgICAgICJ0aW55aW50IiwgIChieXRlKTEwMCB9LAotICAgICAgICBuZXcgT2JqZWN0W10gICAgeyAgICIxMDAiLCAgICAgICJzbWFsbGludCIsIChzaG9ydCkxMDAgfSwKLSAgICAgICAgbmV3IE9iamVjdFtdICAgIHsgICAiMTAwLiIsICAgICAic21hbGxpbnQiLCAoc2hvcnQpMTAwIH0sCi0gICAgICAgIG5ldyBPYmplY3RbXSAgICB7ICAgIjEwMCIsICAgICAgImludCIsICAgICAgMTAwICAgICB9LAotICAgICAgICBuZXcgT2JqZWN0W10gICAgeyAgICIxMDAuIiwgICAgICJpbnQiLCAgICAgIDEwMCAgICAgfSwKLSAgICAgICAgbmV3IE9iamVjdFtdICAgIHsgICAiMTAwIiwgICAgICAiZG91YmxlIiwgICAxMDBkICAgIH0sCi0gICAgICAgIG5ldyBPYmplY3RbXSAgICB7ICAgIjEwMC4iLCAgICAgImRvdWJsZSIsICAgMTAwZCAgICB9LAotICAgICAgICBuZXcgT2JqZWN0W10gICAgeyAgICIxMDAiLCAgICAgICJiaWdpbnQiLCAgIDEwMEwgICAgfSwKLSAgICAgICAgbmV3IE9iamVjdFtdICAgIHsgICAiMTAwLiIsICAgICAiYmlnaW50IiwgICAxMDBMICAgIH0sCi0gICAgICAgIG5ldyBPYmplY3RbXSAgICB7ICIxMDAiLCAidmFyaW50IiwgQmlnSW50ZWdlci52YWx1ZU9mKDEwMEwpICAgIH0sCi0gICAgICAgIG5ldyBPYmplY3RbXSAgICB7ICAgIjEwMC4iLCAgICAgInZhcmludCIsICAgQmlnSW50ZWdlci52YWx1ZU9mKDEwMEwpICAgIH0sCi0gICAgICAgIG5ldyBPYmplY3RbXSAgICB7ICJwYXJzZUludChcIjEwMFwiKTsiLCAiZGVjaW1hbCIsIEJpZ0RlY2ltYWwudmFsdWVPZigxMDBkKSAgICB9LAotICAgICAgICBuZXcgT2JqZWN0W10gICAgeyAgICIxMDAuIiwgICAgICJkZWNpbWFsIiwgIEJpZ0RlY2ltYWwudmFsdWVPZigxMDBkKSAgICB9LAotICAgICAgICB9OwotCi0gICAgICAgIGZvciAoT2JqZWN0W10gdmFyaWF0aW9uIDogdmFyaWF0aW9ucykKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IGZ1bmN0aW9uQm9keSA9IHZhcmlhdGlvblswXTsKLSAgICAgICAgICAgIE9iamVjdCByZXR1cm5UeXBlID0gdmFyaWF0aW9uWzFdOwotICAgICAgICAgICAgT2JqZWN0IGV4cGVjdGVkUmVzdWx0ID0gdmFyaWF0aW9uWzJdOwotCi0gICAgICAgICAgICBTdHJpbmcgZk5hbWUgPSBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRSwgImRvdWJsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gJXModmFsIGRvdWJsZSkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyAiICtyZXR1cm5UeXBlICsgJyAnICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICciICsgZnVuY3Rpb25Cb2R5ICsgIjsnOyIpOwotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1Qga2V5LCB2YWwsICIgKyBmTmFtZSArICIodmFsKSBGUk9NICVzIiksCi0gICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCAxZCwgZXhwZWN0ZWRSZXN1bHQpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNjcmlwdFBhcmFtUmV0dXJuVHlwZXMoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBVVUlEIHJ1dWlkID0gVVVJRC5yYW5kb21VVUlEKCk7Ci0gICAgICAgIFRpbWVVVUlEIHR1dWlkID0gbmV4dFRpbWVVVUlEKCk7Ci0KLSAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoa2V5IGludCBwcmltYXJ5IGtleSwgIiArCi0gICAgICAgICAgICAgICAgICAgICJ0aXZhbCB0aW55aW50LCBzaXZhbCBzbWFsbGludCwgaXZhbCBpbnQsIGx2YWwgYmlnaW50LCBmdmFsIGZsb2F0LCBkdmFsIGRvdWJsZSwgdnZhbCB2YXJpbnQsIGRkdmFsIGRlY2ltYWwsICIgKwotICAgICAgICAgICAgICAgICAgICAidGltdmFsIHRpbWUsIGR0dmFsIGRhdGUsIHRzdmFsIHRpbWVzdGFtcCwgdXZhbCB1dWlkLCB0dXZhbCB0aW1ldXVpZCkiKTsKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGtleSwgdGl2YWwsIHNpdmFsLCBpdmFsLCBsdmFsLCBmdmFsLCBkdmFsLCB2dmFsLCBkZHZhbCwgdGltdmFsLCBkdHZhbCwgdHN2YWwsIHV2YWwsIHR1dmFsKSBWQUxVRVMgIiArCi0gICAgICAgICAgICAgICAgIig/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/KSIsIDEsCi0gICAgICAgICAgICAgICAgKGJ5dGUpMSwgKHNob3J0KTEsIDEsIDFMLCAxZiwgMWQsIEJpZ0ludGVnZXIudmFsdWVPZigxTCksIEJpZ0RlY2ltYWwudmFsdWVPZigxZCksIDFMLCBJbnRlZ2VyLk1BWF9WQUxVRSwgbmV3IERhdGUoMSksIHJ1dWlkLCB0dXVpZCk7Ci0KLSAgICAgICAgT2JqZWN0W11bXSB2YXJpYXRpb25zID0gewotICAgICAgICBuZXcgT2JqZWN0W10geyAgInRpbnlpbnQiLCAgInRpdmFsIiwgICAgKGJ5dGUpMSwgICAgICAgICAgICAgICAgKGJ5dGUpMiAgfSwKLSAgICAgICAgbmV3IE9iamVjdFtdIHsgICJzbWFsbGludCIsICJzaXZhbCIsICAgIChzaG9ydCkxLCAgICAgICAgICAgICAgIChzaG9ydCkyICB9LAotICAgICAgICBuZXcgT2JqZWN0W10geyAgImludCIsICAgICAgIml2YWwiLCAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgMiAgfSwKLSAgICAgICAgbmV3IE9iamVjdFtdIHsgICJiaWdpbnQiLCAgICJsdmFsIiwgICAgIDFMLCAgICAgICAgICAgICAgICAgICAgIDJMICB9LAotICAgICAgICBuZXcgT2JqZWN0W10geyAgImZsb2F0IiwgICAgImZ2YWwiLCAgICAgMWYsICAgICAgICAgICAgICAgICAgICAgMmYgIH0sCi0gICAgICAgIG5ldyBPYmplY3RbXSB7ICAiZG91YmxlIiwgICAiZHZhbCIsICAgICAxZCwgICAgICAgICAgICAgICAgICAgICAyZCAgfSwKLSAgICAgICAgbmV3IE9iamVjdFtdIHsgICJ2YXJpbnQiLCAgICJ2dmFsIiwgICAgIEJpZ0ludGVnZXIudmFsdWVPZigxTCksIEJpZ0ludGVnZXIudmFsdWVPZigyTCkgIH0sCi0gICAgICAgIG5ldyBPYmplY3RbXSB7ICAiZGVjaW1hbCIsICAiZGR2YWwiLCAgICBCaWdEZWNpbWFsLnZhbHVlT2YoMWQpLCBCaWdEZWNpbWFsLnZhbHVlT2YoMmQpICB9LAotICAgICAgICBuZXcgT2JqZWN0W10geyAgInRpbWUiLCAgICAgInRpbXZhbCIsICAgMUwsICAgICAgICAgICAgICAgICAgICAgMkwgIH0sCi0gICAgICAgIH07Ci0KLSAgICAgICAgZm9yIChPYmplY3RbXSB2YXJpYXRpb24gOiB2YXJpYXRpb25zKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgdHlwZSA9IHZhcmlhdGlvblswXTsKLSAgICAgICAgICAgIE9iamVjdCBjb2wgPSB2YXJpYXRpb25bMV07Ci0gICAgICAgICAgICBPYmplY3QgZXhwZWN0ZWQxID0gdmFyaWF0aW9uWzJdOwotICAgICAgICAgICAgT2JqZWN0IGV4cGVjdGVkMiA9IHZhcmlhdGlvblszXTsKLSAgICAgICAgICAgIFN0cmluZyBmTmFtZSA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLCB0eXBlLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gJXModmFsICIgKyB0eXBlICsgIikgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyAiICsgdHlwZSArICcgJyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAndmFsKzE7JzsiKTsKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGtleSwgIiArIGNvbCArICIsICIgKyBmTmFtZSArICcoJyArIGNvbCArICIpIEZST00gJXMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIGV4cGVjdGVkMSwgZXhwZWN0ZWQyKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2YXJpYXRpb25zID0gbmV3IE9iamVjdFtdW10gewotICAgICAgICBuZXcgT2JqZWN0W10geyAgInRpbWVzdGFtcCIsInRzdmFsIiwgICAgbmV3IERhdGUoMSksICAgICAgICAgICAgbmV3IERhdGUoMSkgIH0sCi0gICAgICAgIG5ldyBPYmplY3RbXSB7ICAidXVpZCIsICAgICAidXZhbCIsICAgICBydXVpZCwgICAgICAgICAgICAgICAgICBydXVpZCAgfSwKLSAgICAgICAgbmV3IE9iamVjdFtdIHsgICJ0aW1ldXVpZCIsICJ0dXZhbCIsICAgIHR1dWlkLCAgICAgICAgICAgICAgICAgIHR1dWlkICB9LAotICAgICAgICBuZXcgT2JqZWN0W10geyAgImRhdGUiLCAgICAgImR0dmFsIiwgICAgSW50ZWdlci5NQVhfVkFMVUUsICAgICAgSW50ZWdlci5NQVhfVkFMVUUgfSwKLSAgICAgICAgfTsKLQotICAgICAgICBmb3IgKE9iamVjdFtdIHZhcmlhdGlvbiA6IHZhcmlhdGlvbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCB0eXBlID0gdmFyaWF0aW9uWzBdOwotICAgICAgICAgICAgT2JqZWN0IGNvbCA9IHZhcmlhdGlvblsxXTsKLSAgICAgICAgICAgIE9iamVjdCBleHBlY3RlZDEgPSB2YXJpYXRpb25bMl07Ci0gICAgICAgICAgICBPYmplY3QgZXhwZWN0ZWQyID0gdmFyaWF0aW9uWzNdOwotICAgICAgICAgICAgU3RyaW5nIGZOYW1lID0gY3JlYXRlRnVuY3Rpb24oS0VZU1BBQ0UsIHR5cGUudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiAlcyh2YWwgIiArIHR5cGUgKyAiKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TICIgKyB0eXBlICsgJyAnICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICd2YWw7JzsiKTsKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGtleSwgIiArIGNvbCArICIsICIgKyBmTmFtZSArICcoJyArIGNvbCArICIpIEZST00gJXMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIGV4cGVjdGVkMSwgZXhwZWN0ZWQyKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXZhc2NyaXB0RGlzYWJsZWQoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrZXkgaW50IHByaW1hcnkga2V5LCB2YWwgZG91YmxlKSIpOwotCi0gICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5lbmFibGVTY3JpcHRlZFVzZXJEZWZpbmVkRnVuY3Rpb25zKGZhbHNlKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydEludmFsaWQoIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICIgKyBLRVlTUEFDRSArICIuYXNzZXJ0Tm90RW5hYmxlZCh2YWwgZG91YmxlKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBkb3VibGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICdNYXRoLnNpbih2YWwpOyc7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZW5hYmxlU2NyaXB0ZWRVc2VyRGVmaW5lZEZ1bmN0aW9ucyh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEphdmFzY3JpcHRDb21waWxlRmFpbHVyZSgpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJGYWlsZWQgdG8gY29tcGlsZSBmdW5jdGlvbiAnY3FsX3Rlc3Rfa2V5c3BhY2Uuc2NyaW52JyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiAiICsgS0VZU1BBQ0UgKyAiLnNjcmludih2YWwgZG91YmxlKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBkb3VibGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICdmb28gYmFyJzsiKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTY3JpcHRJbnZhbGlkTGFuZ3VhZ2UoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiSW52YWxpZCBsYW5ndWFnZSAnYXJ0aWZpY2lhbF9pbnRlbGxpZ2VuY2UnIGZvciBmdW5jdGlvbiAnY3FsX3Rlc3Rfa2V5c3BhY2Uuc2NyaW52JyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiAiICsgS0VZU1BBQ0UgKyAiLnNjcmludih2YWwgZG91YmxlKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBkb3VibGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBhcnRpZmljaWFsX2ludGVsbGlnZW5jZVxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAncXVlc3Rpb24gZm9yIDQyPyc7Iik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9VRlNlY3VyaXR5VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9VRlNlY3VyaXR5VGVzdC5qYXZhCmluZGV4IDc0MjJkYjQzLi5mZTFlYzcwIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGU2VjdXJpdHlUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9VRlNlY3VyaXR5VGVzdC5qYXZhCkBAIC00OCwxMyArNDgsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGRvdWJsZSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBKQVZBXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnU3lzdGVtLmdldFByb3BlcnR5KFwiZm9vLmJhci5iYXpcIik7IHJldHVybiAwZDsnOyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICdTeXN0ZW0uZ2V0UHJvcGVydHkoXCJmb28uYmFyLmJhelwiKTsgcmV0dXJuIDBkOyc7Iik7IC8vIGNoZWNrc3R5bGU6IHN1cHByZXNzIG5lYXJieSAnYmxvY2tTeXN0ZW1Qcm9wZXJ0eVVzYWdlJwogICAgICAgICAgICAgZXhlY3V0ZSgiU0VMRUNUICIgKyBmTmFtZSArICIoZHZhbCkgRlJPTSAlcyBXSEVSRSBrZXk9MSIpOwogICAgICAgICAgICAgQXNzZXJ0LmZhaWwoKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoRnVuY3Rpb25FeGVjdXRpb25FeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0QWNjZXNzQ29udHJvbEV4Y2VwdGlvbigiU3lzdGVtLmdldFByb3BlcnR5KFwiZm9vLmJhci5iYXpcIik7IHJldHVybiAwZDsiLCBlKTsKKyAgICAgICAgICAgIGFzc2VydEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oIlN5c3RlbS5nZXRQcm9wZXJ0eShcImZvby5iYXIuYmF6XCIpOyByZXR1cm4gMGQ7IiwgZSk7IC8vIGNoZWNrc3R5bGU6IHN1cHByZXNzIG5lYXJieSAnYmxvY2tTeXN0ZW1Qcm9wZXJ0eVVzYWdlJwogICAgICAgICB9CiAKICAgICAgICAgU3RyaW5nW10gY2ZuU291cmNlcyA9CkBAIC0xMzAsNzQgKzEzMCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgSkFWQVxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJyIgKyB0eXBlQW5kU291cmNlWzFdICsgIic7Iik7CiAgICAgICAgIH0KLQotICAgICAgICAvLyBKYXZhU2NyaXB0IFVERnMKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGZOYW1lID0gY3JlYXRlRnVuY3Rpb24oS0VZU1BBQ0VfUEVSX1RFU1QsICJkb3VibGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICVzKHZhbCBkb3VibGUpICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgZG91YmxlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHRcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICdvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmlzU2h1dGRvd24oKTsgMDsnOyIpOwotICAgICAgICAgICAgZXhlY3V0ZSgiU0VMRUNUICIgKyBmTmFtZSArICIoZHZhbCkgRlJPTSAlcyBXSEVSRSBrZXk9MSIpOwotICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIkphdmFzY3JpcHQgc2VjdXJpdHkgY2hlY2sgZmFpbGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEZ1bmN0aW9uRXhlY3V0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oIiIsIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gamF2YXNjcmlwdCA9Ci0gICAgICAgIHsKLSAgICAgICAgImphdmEubGFuZy5tYW5hZ2VtZW50Lk1hbmFnbWVudEZhY3RvcnkuZ2V0VGhyZWFkTVhCZWFuKCk7IDA7IiwKLSAgICAgICAgIm5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShcIi90bXAvZm9vXCIpOyAwOyIsCi0gICAgICAgICJuZXcgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtKFwiL3RtcC9mb29cIik7IDA7IiwKLSAgICAgICAgImphdmEubmlvLmZpbGUuRmlsZVN5c3RlbXMuZ2V0RGVmYXVsdCgpLmNyZWF0ZUZpbGVFeGNsdXNpdmVseShcIi4vZm9vX2Jhcl9iYXpcIik7IDA7IiwKLSAgICAgICAgImphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsLm9wZW4oamF2YS5uaW8uZmlsZS5GaWxlU3lzdGVtcy5nZXREZWZhdWx0KCkuZ2V0UGF0aChcIi9ldGMvcGFzc3dkXCIpKTsgMDsiLAotICAgICAgICAiamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbC5vcGVuKCk7IDA7IiwKLSAgICAgICAgIm5ldyBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQoKS5iaW5kKG51bGwpOyAwOyIsCi0gICAgICAgICJ2YXIgdGhyZWFkID0gbmV3IGphdmEubGFuZy5UaHJlYWQoKTsgdGhyZWFkLnN0YXJ0KCk7IDA7IiwKLSAgICAgICAgImphdmEubGFuZy5TeXN0ZW0uZ2V0UHJvcGVydHkoXCJmb28uYmFyLmJhelwiKTsgMDsiLAotICAgICAgICAiamF2YS5sYW5nLlJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoXCIvdG1wL2Zvb1wiKTsgMDsiLAotICAgICAgICAiamF2YS5sYW5nLlJ1bnRpbWUuZ2V0UnVudGltZSgpLmxvYWRMaWJyYXJ5KFwiZm9vYmFyXCIpOyAwOyIsCi0gICAgICAgICJqYXZhLmxhbmcuUnVudGltZS5nZXRSdW50aW1lKCkubG9hZExpYnJhcnkoXCJmb29iYXJcIik7IDA7IiwKLSAgICAgICAgLy8gVE9ETyB0aGVzZSAodWdseSkgY2FsbHMgYXJlIHN0aWxsIHBvc3NpYmxlIC0gdGhlc2UgY2FuIGNvbnN1bWUgQ1BVIChhcyBvbmUgY291bGQgZG8gd2l0aCBhbiBldmlsIGxvb3AsIHRvbykKLS8vICAgICAgICAiamF2YS5sYW5nLlJ1bnRpbWUuZ2V0UnVudGltZSgpLnRyYWNlTWV0aG9kQ2FsbHModHJ1ZSk7IDA7IiwKLS8vICAgICAgICAiamF2YS5sYW5nLlJ1bnRpbWUuZ2V0UnVudGltZSgpLmdjKCk7IDA7IiwKLS8vICAgICAgICAiamF2YS5sYW5nLlJ1bnRpbWUuZ2V0UnVudGltZSgpOyAwOyIsCi0gICAgICAgIH07Ci0KLSAgICAgICAgZm9yIChTdHJpbmcgc2NyaXB0IDogamF2YXNjcmlwdCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZOYW1lID0gY3JlYXRlRnVuY3Rpb24oS0VZU1BBQ0VfUEVSX1RFU1QsICJkb3VibGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiAlcyh2YWwgZG91YmxlKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgZG91YmxlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJyIgKyBzY3JpcHQgKyAiJzsiKTsKLSAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgIiArIGZOYW1lICsgIihkdmFsKSBGUk9NICVzIFdIRVJFIGtleT0xIik7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIkphdmFzY3JpcHQgc2VjdXJpdHkgY2hlY2sgZmFpbGVkOiAiICsgc2NyaXB0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChGdW5jdGlvbkV4ZWN1dGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oc2NyaXB0LCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiamF2YS5sYW5nLkNsYXNzLmZvck5hbWUoXCJqYXZhLmxhbmcuU3lzdGVtXCIpOyAwOyI7Ci0gICAgICAgIFN0cmluZyBmTmFtZSA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFX1BFUl9URVNULCAiZG91YmxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICVzKHZhbCBkb3VibGUpICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGRvdWJsZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHRcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJyIgKyBzY3JpcHQgKyAiJzsiKTsKLSAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZSgiSmF2YSByZWZsZWN0aW9uIG5vdCBzdXBwb3J0ZWQgd2hlbiBjbGFzcyBmaWx0ZXIgaXMgcHJlc2VudCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25FeGVjdXRpb25FeGNlcHRpb24uY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFTEVDVCAiICsgZk5hbWUgKyAiKGR2YWwpIEZST00gJXMgV0hFUkUga2V5PTEiKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oU3RyaW5nIHNjcmlwdCwgRnVuY3Rpb25FeGVjdXRpb25FeGNlcHRpb24gZSkKQEAgLTI1MCwxNiArMTgyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnbG9uZyB0PVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKzUwMDsgd2hpbGUgKHQ+U3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpIHsgfTsgcmV0dXJuIDBkOyc7Iik7CiAgICAgICAgICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoInJhbiBsb25nZXIgdGhhbiAyNTBtcyIsICJTRUxFQ1QgIiArIGZOYW1lICsgIihkdmFsKSBGUk9NICVzIFdIRVJFIGtleT0xIik7CiAKLSAgICAgICAgICAgICAgICAvLyBKYXZhc2NyaXB0IFVERgotCi0gICAgICAgICAgICAgICAgZk5hbWUgPSBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRV9QRVJfVEVTVCwgImRvdWJsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gJXModmFsIGRvdWJsZSkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBkb3VibGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgSkFWQVNDUklQVFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3ZhciB0PWphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSs1MDA7IHdoaWxlICh0PmphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkgeyB9OyAwOyc7Iik7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoInJhbiBsb25nZXIgdGhhbiAyNTBtcyIsICJTRUxFQ1QgIiArIGZOYW1lICsgIihkdmFsKSBGUk9NICVzIFdIRVJFIGtleT0xIik7Ci0KICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoRXJyb3IgfCBSdW50aW1lRXhjZXB0aW9uIGUpCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9VRlRlc3QuamF2YQppbmRleCBlODZiM2RmLi4xYTllNmQyIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVUZUZXN0LmphdmEKQEAgLTg3LDE3ICs4NywxNyBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNjaGVtYUNoYW5nZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hQ2hhbmdlKCkKICAgICB7CiAgICAgICAgIFN0cmluZyBmID0gY3JlYXRlRnVuY3Rpb25OYW1lKEtFWVNQQUNFKTsKICAgICAgICAgU3RyaW5nIGZ1bmN0aW9uTmFtZSA9IHNob3J0RnVuY3Rpb25OYW1lKGYpOwogICAgICAgICByZWdpc3RlckZ1bmN0aW9uKGYsICJkb3VibGUsIGRvdWJsZSIpOwogCi0gICAgICAgIGFzc2VydFNjaGVtYUNoYW5nZSgiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gIiArIGYgKyAiKHN0YXRlIGRvdWJsZSwgdmFsIGRvdWJsZSkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCisgICAgICAgIGFzc2VydFNjaGVtYUNoYW5nZSgiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gIiArIGYgKyAiKHN0YXRlIGRvdWJsZSwgdmFsIGRvdWJsZSkiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJDQUxMRUQgT04gTlVMTCBJTlBVVCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGRvdWJsZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICdcInN0cmluZ1wiOyc7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICcgcmV0dXJuIERvdWJsZS52YWx1ZU9mKE1hdGgubWF4KHN0YXRlLmRvdWJsZVZhbHVlKCksIHZhbC5kb3VibGVWYWx1ZSgpKSk7ICc7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZS5DUkVBVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0LkZVTkNUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZU1BBQ0UsIGZ1bmN0aW9uTmFtZSwKQEAgLTEwOCwyMiArMTA4LDIyIEBACiAgICAgICAgIGFzc2VydFNjaGVtYUNoYW5nZSgiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gIiArIGYgKyAiKHN0YXRlIGludCwgdmFsIGludCkgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBpbnQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnXCJzdHJpbmdcIjsnOyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnIHJldHVybiBJbnRlZ2VyLnZhbHVlT2YoTWF0aC5tYXgoc3RhdGUsIHZhbCkpOyc7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZS5DUkVBVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0LkZVTkNUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZU1BBQ0UsIGZ1bmN0aW9uTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQiLCAiaW50Iik7CiAKLSAgICAgICAgYXNzZXJ0U2NoZW1hQ2hhbmdlKCJDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiAiICsgZiArICIoc3RhdGUgaW50LCB2YWwgaW50KSAiICsKKyAgICAgICAgLyphc3NlcnRTY2hlbWFDaGFuZ2UoIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICIgKyBmICsgIihzdGF0ZSBpbnQsIHZhbCBpbnQpICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgaW50ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ1wic3RyaW5nMVwiOyc7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICcgcmV0dXJuIEludGVnZXIudmFsdWVPZihNYXRoLm1heChzdGF0ZSwgdmFsKSk7JzsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlLlVQREFURUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXQuRlVOQ1RJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlTUEFDRSwgZnVuY3Rpb25OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImludCIsICJpbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQiLCAiaW50Iik7Ki8KIAogICAgICAgICBhc3NlcnRTY2hlbWFDaGFuZ2UoIkRST1AgRlVOQ1RJT04gIiArIGYgKyAiKGRvdWJsZSwgZG91YmxlKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2UuRFJPUFBFRCwgVGFyZ2V0LkZVTkNUSU9OLApAQCAtMTM3LDggKzEzNyw4IEBACiAgICAgICAgIGFzc2VydFNjaGVtYUNoYW5nZSgiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gIiArIGZsICsgIihzdGF0ZSBsaXN0PHR1cGxlPGludCwgaW50Pj4sIHZhbCBkb3VibGUpICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgZG91YmxlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ1wic3RyaW5nXCI7JzsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmEgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJyByZXR1cm4gdmFsOyc7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZS5DUkVBVEVELCBUYXJnZXQuRlVOQ1RJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlTUEFDRSwgc2hvcnRGdW5jdGlvbk5hbWUoZmwpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3Q8dHVwbGU8aW50LCBpbnQ+PiIsICJkb3VibGUiKTsKQEAgLTE1Niw3ICsxNTYsNyBAQAogCiAgICAgICAgIEZ1bmN0aW9uTmFtZSBmU2luTmFtZSA9IHBhcnNlRnVuY3Rpb25OYW1lKGZTaW4pOwogCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgU2NoZW1hLmluc3RhbmNlLmdldEZ1bmN0aW9ucyhwYXJzZUZ1bmN0aW9uTmFtZShmU2luKSkuc2l6ZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBTY2hlbWEuaW5zdGFuY2UuZ2V0VXNlckZ1bmN0aW9ucyhwYXJzZUZ1bmN0aW9uTmFtZShmU2luKSkuc2l6ZSgpKTsKIAogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBmdW5jdGlvbl9uYW1lLCBsYW5ndWFnZSBGUk9NIHN5c3RlbV9zY2hlbWEuZnVuY3Rpb25zIFdIRVJFIGtleXNwYWNlX25hbWU9PyIsIEtFWVNQQUNFX1BFUl9URVNUKSwKICAgICAgICAgICAgICAgICAgICByb3coZlNpbk5hbWUubmFtZSwgImphdmEiKSk7CkBAIC0xNjUsNyArMTY1LDcgQEAKIAogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBmdW5jdGlvbl9uYW1lLCBsYW5ndWFnZSBGUk9NIHN5c3RlbV9zY2hlbWEuZnVuY3Rpb25zIFdIRVJFIGtleXNwYWNlX25hbWU9PyIsIEtFWVNQQUNFX1BFUl9URVNUKSk7CiAKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBTY2hlbWEuaW5zdGFuY2UuZ2V0RnVuY3Rpb25zKGZTaW5OYW1lKS5zaXplKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIFNjaGVtYS5pbnN0YW5jZS5nZXRVc2VyRnVuY3Rpb25zKGZTaW5OYW1lKS5zaXplKCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xODIsNyArMTgyLDcgQEAKIAogICAgICAgICBGdW5jdGlvbk5hbWUgZlNpbk5hbWUgPSBwYXJzZUZ1bmN0aW9uTmFtZShmU2luKTsKIAotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIFNjaGVtYS5pbnN0YW5jZS5nZXRGdW5jdGlvbnMocGFyc2VGdW5jdGlvbk5hbWUoZlNpbikpLnNpemUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgU2NoZW1hLmluc3RhbmNlLmdldFVzZXJGdW5jdGlvbnMocGFyc2VGdW5jdGlvbk5hbWUoZlNpbikpLnNpemUoKSk7CiAKICAgICAgICAgLy8gY3JlYXRlIGEgcGFpcnMgb2YgU2VsZWN0IGFuZCBJbnNlcnRzLiBPbmUgc3RhdGVtZW50IGluIGVhY2ggcGFpciB1c2VzIHRoZSBmdW5jdGlvbiBzbyB3aGVuIHdlCiAgICAgICAgIC8vIGRyb3AgaXQgdGhvc2Ugc3RhdGVtZW50cyBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZSBpbiBRdWVyeVByb2Nlc3Nvci4gVGhlIG90aGVyIHN0YXRlbWVudHMKQEAgLTIyMCw3ICsyMjAsNyBAQAogICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhICIgKwogICAgICAgICAgICAgICAgICJBUyAncmV0dXJuIERvdWJsZS52YWx1ZU9mKE1hdGguc2luKGlucHV0KSk7JyIpOwogCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgU2NoZW1hLmluc3RhbmNlLmdldEZ1bmN0aW9ucyhmU2luTmFtZSkuc2l6ZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBTY2hlbWEuaW5zdGFuY2UuZ2V0VXNlckZ1bmN0aW9ucyhmU2luTmFtZSkuc2l6ZSgpKTsKIAogICAgICAgICBwcmVwYXJlZFNlbGVjdDE9IFF1ZXJ5UHJvY2Vzc29yLmluc3RhbmNlLnByZXBhcmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlNFTEVDVCBrZXksICVzKGQpIEZST00gJXMuJXMiLCBmU2luLCBLRVlTUEFDRSwgY3VycmVudFRhYmxlKCkpLApAQCAtMzMzLDkgKzMzMyw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBGVU5DVElPTiAlcyAoIGlucHV0IGRvdWJsZSApICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDQUxMRUQgT04gTlVMTCBJTlBVVCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBkb3VibGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICdpbnB1dCciKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBTY2hlbWEuaW5zdGFuY2UuZ2V0RnVuY3Rpb25zKHBhcnNlRnVuY3Rpb25OYW1lKGZ1bmN0aW9uKSkuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3JldHVybiBEb3VibGUudmFsdWVPZihNYXRoLmxvZyhpbnB1dC5kb3VibGVWYWx1ZSgpKSk7JyIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIFNjaGVtYS5pbnN0YW5jZS5nZXRVc2VyRnVuY3Rpb25zKHBhcnNlRnVuY3Rpb25OYW1lKGZ1bmN0aW9uKSkuc2l6ZSgpKTsKIAogICAgICAgICBMaXN0PFJlc3VsdE1lc3NhZ2UuUHJlcGFyZWQ+IHByZXBhcmVkID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIC8vIHByZXBhcmUgc3RhdGVtZW50cyB3aGljaCB1c2UgdGhlIGZ1bmN0aW9uIHRvIHByb3ZpZGUgYSBEZWxheWVkVmFsdWUKQEAgLTQzOCw3ICs0MzgsNyBAQAogICAgICAgICBleGVjdXRlKCJEUk9QIEZVTkNUSU9OIElGIEVYSVNUUyAiICsgZlNpbik7CiAKICAgICAgICAgLy8gY2FuJ3QgZHJvcCBuYXRpdmUgZnVuY3Rpb25zCi0gICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJTeXN0ZW0ga2V5c3BhY2UgJ3N5c3RlbScgaXMgbm90IHVzZXItbW9kaWZpYWJsZSIsICJEUk9QIEZVTkNUSU9OIHRvdGltZXN0YW1wIik7CisgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJTeXN0ZW0ga2V5c3BhY2UgJ3N5c3RlbScgaXMgbm90IHVzZXItbW9kaWZpYWJsZSIsICJEUk9QIEZVTkNUSU9OIHRvX3RpbWVzdGFtcCIpOwogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiU3lzdGVtIGtleXNwYWNlICdzeXN0ZW0nIGlzIG5vdCB1c2VyLW1vZGlmaWFibGUiLCAiRFJPUCBGVU5DVElPTiB1dWlkIik7CiAKICAgICAgICAgLy8gc2luKCkgbm8gbG9uZ2VyIGV4aXN0cwpAQCAtNjY1LDcgKzY2NSw3IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RnVuY3Rpb25JblN5c3RlbUtTKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKLSAgICAgICAgZXhlY3V0ZSgiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gIiArIEtFWVNQQUNFICsgIi50b3RpbWVzdGFtcCh2YWwgdGltZXV1aWQpICIgKworICAgICAgICBleGVjdXRlKCJDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiAiICsgS0VZU1BBQ0UgKyAiLnRvX3RpbWVzdGFtcCh2YWwgdGltZXV1aWQpICIgKwogICAgICAgICAgICAgICAgICJSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVCAiICsKICAgICAgICAgICAgICAgICAiUkVUVVJOUyB0aW1lc3RhbXAgIiArCiAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIEpBVkFcbiIgKwpAQCAtNjc5LDcgKzY3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBKQVZBXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICdyZXR1cm4gbnVsbDsnOyIpOwogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiU3lzdGVtIGtleXNwYWNlICdzeXN0ZW0nIGlzIG5vdCB1c2VyLW1vZGlmaWFibGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gc3lzdGVtLnRvdGltZXN0YW1wKHZhbCB0aW1ldXVpZCkgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBzeXN0ZW0udG9fdGltZXN0YW1wKHZhbCB0aW1ldXVpZCkgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgdGltZXN0YW1wICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgSkFWQVxuIiArCkBAIC02OTYsNyArNjk2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIEpBVkFcbiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3JldHVybiBudWxsOyc7Iik7CiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJTeXN0ZW0ga2V5c3BhY2UgJ3N5c3RlbScgaXMgbm90IHVzZXItbW9kaWZpYWJsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiB0b3RpbWVzdGFtcCh2YWwgdGltZXV1aWQpICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gdG9fdGltZXN0YW1wKHZhbCB0aW1ldXVpZCkgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgdGltZXN0YW1wICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgSkFWQVxuIiArCkBAIC03NjksNyArNzY5LDcgQEAKIAogICAgICAgICBGdW5jdGlvbk5hbWUgZk5hbWVOYW1lID0gcGFyc2VGdW5jdGlvbk5hbWUoZk5hbWUpOwogCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgU2NoZW1hLmluc3RhbmNlLmdldEZ1bmN0aW9ucyhmTmFtZU5hbWUpLnNpemUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgU2NoZW1hLmluc3RhbmNlLmdldFVzZXJGdW5jdGlvbnMoZk5hbWVOYW1lKS5zaXplKCkpOwogCiAgICAgICAgIFJlc3VsdE1lc3NhZ2UuUHJlcGFyZWQgcHJlcGFyZWQgPSBRdWVyeVByb2Nlc3Nvci5pbnN0YW5jZS5wcmVwYXJlKFN0cmluZy5mb3JtYXQoIlNFTEVDVCBrZXksICVzKHVkdCkgRlJPTSAlcy4lcyIsIGZOYW1lLCBLRVlTUEFDRSwgY3VycmVudFRhYmxlKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRTdGF0ZS5mb3JJbnRlcm5hbENhbGxzKCkpOwpAQCAtNzg2LDE4ICs3ODYsMTcgQEAKICAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwoUXVlcnlQcm9jZXNzb3IuaW5zdGFuY2UuZ2V0UHJlcGFyZWQocHJlcGFyZWQuc3RhdGVtZW50SWQpKTsKIAogICAgICAgICAvLyBmdW5jdGlvbiBzdGF5cwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIFNjaGVtYS5pbnN0YW5jZS5nZXRGdW5jdGlvbnMoZk5hbWVOYW1lKS5zaXplKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIFNjaGVtYS5pbnN0YW5jZS5nZXRVc2VyRnVuY3Rpb25zKGZOYW1lTmFtZSkuc2l6ZSgpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVBcmdOYW1lcygpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJEdXBsaWNhdGUgYXJndW1lbnQgbmFtZXMgZm9yIGdpdmVuIGZ1bmN0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICIgKyBLRVlTUEFDRSArICIuc2NyaW52KHZhbCBkb3VibGUsIHZhbCB0ZXh0KSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyB0ZXh0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnXCJmb28gYmFyXCI7JzsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICIgKyBLRVlTUEFDRSArICIuc2NyaW52KGlucHV0IGRvdWJsZSwgaW5wdXQgaW50KSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNBTExFRCBPTiBOVUxMIElOUFVUICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBkb3VibGUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhIEFTICdyZXR1cm4gTWF0aC5tYXgoaW5wdXQsIGlucHV0KSc7Iik7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTg1NSw3ICs4NTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3Rocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7JzsiKTsKIAogICAgICAgICBLZXlzcGFjZU1ldGFkYXRhIGtzbSA9IFNjaGVtYS5pbnN0YW5jZS5nZXRLZXlzcGFjZU1ldGFkYXRhKEtFWVNQQUNFX1BFUl9URVNUKTsKLSAgICAgICAgVURGdW5jdGlvbiBmID0gKFVERnVuY3Rpb24pIGtzbS5mdW5jdGlvbnMuZ2V0KHBhcnNlRnVuY3Rpb25OYW1lKGZOYW1lKSkuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIFVERnVuY3Rpb24gZiA9IChVREZ1bmN0aW9uKSBrc20udXNlckZ1bmN0aW9ucy5nZXQocGFyc2VGdW5jdGlvbk5hbWUoZk5hbWUpKS5pdGVyYXRvcigpLm5leHQoKTsKIAogICAgICAgICBVREZ1bmN0aW9uIGJyb2tlbiA9IFVERnVuY3Rpb24uY3JlYXRlQnJva2VuRnVuY3Rpb24oZi5uYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmFyZ05hbWVzKCksCkBAIC04NjUsNyArODY0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuYm9keSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKCJmb28gYmFyIGlzIGJyb2tlbiIpKTsKLSAgICAgICAgU2NoZW1hVGVzdFV0aWwuYWRkT3JVcGRhdGVLZXlzcGFjZShrc20ud2l0aFN3YXBwZWQoa3NtLmZ1bmN0aW9ucy53aXRob3V0KGYubmFtZSgpLCBmLmFyZ1R5cGVzKCkpLndpdGgoYnJva2VuKSksIGZhbHNlKTsKKyAgICAgICAgU2NoZW1hVGVzdFV0aWwuYWRkT3JVcGRhdGVLZXlzcGFjZShrc20ud2l0aFN3YXBwZWQoa3NtLnVzZXJGdW5jdGlvbnMud2l0aG91dChmLm5hbWUoKSwgZi5hcmdUeXBlcygpKS53aXRoKGJyb2tlbikpLCBmYWxzZSk7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZSgiZm9vIGJhciBpcyBicm9rZW4iLCBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VMRUNUIGtleSwgIiArIGZOYW1lICsgIihkdmFsKSBGUk9NICVzIik7CkBAIC05MDgsNyArOTA3LDcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdHJpbmcoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrZXkgaW50IHByaW1hcnkga2V5LCBzdmFsIHRleHQsIGF2YWwgYXNjaWksIGJ2YWwgYmxvYiwgZW1wdHlfaW50IGludCkiKTsKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGtleSwgc3ZhbCwgYXZhbCwgYnZhbCwgZW1wdHlfaW50KSBWQUxVRVMgKD8sID8sID8sID8sIGJsb2JBc0ludCgweCkpIiwgMSwgIiIsICIiLCBCeXRlQnVmZmVyLmFsbG9jYXRlKDApKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGtleSwgc3ZhbCwgYXZhbCwgYnZhbCwgZW1wdHlfaW50KSBWQUxVRVMgKD8sID8sID8sID8sIGJsb2JfYXNfaW50KDB4KSkiLCAxLCAiIiwgIiIsIEJ5dGVCdWZmZXIuYWxsb2NhdGUoMCkpOwogCiAgICAgICAgIFN0cmluZyBmTmFtZVNSQyA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFX1BFUl9URVNULCAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiAlcyh2YWwgdGV4dCkgIiArCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VzZXJUeXBlc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVXNlclR5cGVzVGVzdC5qYXZhCmluZGV4IDBiMDVlOGYuLjBkOTk0OTQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVXNlclR5cGVzVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVXNlclR5cGVzVGVzdC5qYXZhCkBAIC0yMiw2ICsyMiw3IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2VydmVyVGVzdFV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5CeXRlT3JkZXJlZFBhcnRpdGlvbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CkBAIC0zMiw2ICszMyw4IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwQ2xhc3MoKSAgICAgLy8gb3ZlcnJpZGVzIENRTFRlc3Rlci5zZXRVcENsYXNzKCkKICAgICB7CisgICAgICAgIFNlcnZlclRlc3RVdGlscy5kYWVtb25Jbml0aWFsaXphdGlvbigpOworCiAgICAgICAgIC8vIFNlbGVjdGluZyBwYXJ0aXRpb25lciBmb3IgYSB0YWJsZSBpcyBub3QgZXhwb3NlZCBvbiBDUkVBVEUgVEFCTEUuCiAgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLnNldFBhcnRpdGlvbmVyVW5zYWZlKEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuaW5zdGFuY2UpOwogCkBAIC0yMDAsNiArMjAzLDU2IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbHNJbkludFVEVCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFN0cmluZyBteVR5cGUgPSBLRVlTUEFDRSArICcuJyArIGNyZWF0ZVR5cGUoIkNSRUFURSBUWVBFICVzIChhIGludCkiKTsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoYSBpbnQgUFJJTUFSWSBLRVksIGIgZnJvemVuPCIgKyBteVR5cGUgKyAiPikiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGEsIGIpIFZBTFVFUyAoMSwgPykiLCB1c2VyVHlwZSgiYSIsIDEpKTsKKworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBiLmEgRlJPTSAlcyIpLCByb3coMSkpOworCisgICAgICAgIGZsdXNoKCk7CisKKyAgICAgICAgc2NoZW1hQ2hhbmdlKCJBTFRFUiBUWVBFICIgKyBteVR5cGUgKyAiIEFERCBiIGludCIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYikgVkFMVUVTICgyLCB7YTogMiwgYjogMn0pIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChhLCBiKSBWQUxVRVMgKDMsIHtiOiAzfSkiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGEsIGIpIFZBTFVFUyAoNCwge2E6IG51bGwsIGI6IDR9KSIpOworCisgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBiLmEsIGIuYiBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coMSwgbnVsbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coMiwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgNCkpCisgICAgICAgICk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbHNJblRleHRVRFQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBTdHJpbmcgbXlUeXBlID0gS0VZU1BBQ0UgKyAnLicgKyBjcmVhdGVUeXBlKCJDUkVBVEUgVFlQRSAlcyAoYSB0ZXh0KSIpOworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChhIGludCBQUklNQVJZIEtFWSwgYiBmcm96ZW48IiArIG15VHlwZSArICI+KSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYikgVkFMVUVTICgxLCB7YTogJyd9KSIpOworCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGIuYSBGUk9NICVzIiksIHJvdygiIikpOworCisgICAgICAgIGZsdXNoKCk7CisKKyAgICAgICAgc2NoZW1hQ2hhbmdlKCJBTFRFUiBUWVBFICIgKyBteVR5cGUgKyAiIEFERCBiIHRleHQiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGEsIGIpIFZBTFVFUyAoMiwge2E6ICcnLCBiOiAnJ30pIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChhLCBiKSBWQUxVRVMgKDMsIHtiOiAnJ30pIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChhLCBiKSBWQUxVRVMgKDQsIHthOiBudWxsLCBiOiAnJ30pIik7CisKKyAgICAgICAgYmVmb3JlQW5kQWZ0ZXJGbHVzaCgoKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGIuYSwgYi5iIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygiIiwgbnVsbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coIiIsICIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhudWxsLCAiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgIiIpKQorICAgICAgICApOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFsdGVyTm9uRnJvemVuVURUKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKICAgICAgICAgU3RyaW5nIG15VHlwZSA9IEtFWVNQQUNFICsgJy4nICsgY3JlYXRlVHlwZSgiQ1JFQVRFIFRZUEUgJXMgKGEgaW50LCBiIHRleHQpIik7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1ZpcnR1YWxUYWJsZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVmlydHVhbFRhYmxlVGVzdC5qYXZhCmluZGV4IDVkM2IxMzQuLmIyZGE2ZTUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVmlydHVhbFRhYmxlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVmlydHVhbFRhYmxlVGVzdC5qYXZhCkBAIC0zOCw2ICszOCw4IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLmV4Y2VwdGlvbnMuSW52YWxpZFF1ZXJ5RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5NdXRhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKQEAgLTU2LDcgKzU4LDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmlnZ2Vycy5JVHJpZ2dlcjsKIAogCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIHB1YmxpYyBjbGFzcyBWaXJ0dWFsVGFibGVUZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCkBAIC02Niw2ICs3MCw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZUMl9OQU1FID0gInZ0MiI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZUM19OQU1FID0gInZ0MyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZUNF9OQU1FID0gInZ0NCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZUNV9OQU1FID0gInZ0NSI7CiAKICAgICAvLyBBcyBsb25nIGFzIHdlIGV4ZWN1dGUgdGVzdCBxdWVyaWVzIHVzaW5nIGV4ZWN1dGUgKGFuZCBub3QgZXhlY3V0ZU5ldCkgdGhlIHZpcnR1YWwgdGFibGVzIGltcGxlbWVudGF0aW9uCiAgICAgLy8gZG8gbm90IG5lZWQgdG8gYmUgdGhyZWFkLXNhZmUuIFdlIGNob29zZSB0byBkbyBpdCB0byBhdm9pZCBpc3N1ZXMgaWYgdGhlIHRlc3QgZnJhbWV3b3JrIHdhcyBjaGFuZ2VkIG9yIHNvbWVib2R5CkBAIC0yMDQsNiArMjA5LDggQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCiAgICAgeworICAgICAgICBTZXJ2ZXJUZXN0VXRpbHMuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKwogICAgICAgICBUYWJsZU1ldGFkYXRhIHZ0MU1ldGFkYXRhID0gVGFibGVNZXRhZGF0YS5idWlsZGVyKEtTX05BTUUsIFZUMV9OQU1FKQogICAgICAgICAgICAgICAgIC5raW5kKFRhYmxlTWV0YWRhdGEuS2luZC5WSVJUVUFMKQogICAgICAgICAgICAgICAgIC5hZGRQYXJ0aXRpb25LZXlDb2x1bW4oInBrIiwgVVRGOFR5cGUuaW5zdGFuY2UpCkBAIC0zNDMsNyArMzUwLDI3IEBACiAKICAgICAgICAgfTsKIAotICAgICAgICBWaXJ0dWFsS2V5c3BhY2VSZWdpc3RyeS5pbnN0YW5jZS5yZWdpc3RlcihuZXcgVmlydHVhbEtleXNwYWNlKEtTX05BTUUsIEltbXV0YWJsZUxpc3Qub2YodnQxLCB2dDIsIHZ0MywgdnQ0KSkpOworICAgICAgICBWaXJ0dWFsVGFibGUgdnQ1ID0gbmV3IEFic3RyYWN0VmlydHVhbFRhYmxlKFRhYmxlTWV0YWRhdGEuYnVpbGRlcihLU19OQU1FLCBWVDVfTkFNRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmtpbmQoVGFibGVNZXRhZGF0YS5LaW5kLlZJUlRVQUwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRQYXJ0aXRpb25LZXlDb2x1bW4oInBrIiwgVVRGOFR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbHVzdGVyaW5nQ29sdW1uKCJjIiwgVVRGOFR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWd1bGFyQ29sdW1uKCJ2MSIsIEludDMyVHlwZS5pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZ3VsYXJDb2x1bW4oInYyIiwgTG9uZ1R5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgRGF0YVNldCBkYXRhKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZURhdGFTZXQobWV0YWRhdGEoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWxsb3dGaWx0ZXJpbmdJbXBsaWNpdGx5KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgVmlydHVhbEtleXNwYWNlUmVnaXN0cnkuaW5zdGFuY2UucmVnaXN0ZXIobmV3IFZpcnR1YWxLZXlzcGFjZShLU19OQU1FLCBJbW11dGFibGVMaXN0Lm9mKHZ0MSwgdnQyLCB2dDMsIHZ0NCwgdnQ1KSkpOwogCiAgICAgICAgIENRTFRlc3Rlci5zZXRVcENsYXNzKCk7CiAgICAgfQpAQCAtMTAyNSw2ICsxMDUyLDQ2IEBACiAgICAgICAgIGFzc2VydEpNWEZhaWxzKCgpIC0+IG1iZWFuLmdldEF1dG9Db21wYWN0aW9uU3RhdHVzKEtTX05BTUUsIFZUMV9OQU1FKSk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWxsb3dlZEZpbHRlcmluZ09uUmVndWxhckNvbHVtbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBleGVjdXRlTmV0KGZvcm1hdCgiU0VMRUNUICogRlJPTSAlcy4lcyBXSEVSRSB2MiA9IDUiLCBLU19OQU1FLCBWVDVfTkFNRSkpOworICAgICAgICAgICAgZmFpbChmb3JtYXQoInNob3VsZCBmYWlsIGFzICVzLiVzIGlzIG5vdCBhbGxvd2VkIHRvIGJlIGZpbHRlcmVkIG9uIGltcGxpY2l0bHkuIiwgS1NfTkFNRSwgVlQ1X05BTUUpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW52YWxpZFF1ZXJ5RXhjZXB0aW9uIGV4KQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGV4LmdldE1lc3NhZ2UoKS5jb250YWlucygiQ2Fubm90IGV4ZWN1dGUgdGhpcyBxdWVyeSBhcyBpdCBtaWdodCBpbnZvbHZlIGRhdGEgZmlsdGVyaW5nIGFuZCB0aHVzIG1heSBoYXZlIHVucHJlZGljdGFibGUgcGVyZm9ybWFuY2UiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhbGxvd2VkRmlsdGVyaW5nT25DbHVzdGVyaW5nQ29sdW1uKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJTRUxFQ1QgKiBGUk9NICVzLiVzIFdIRVJFIGMgPSAnYWJjJyIsIEtTX05BTUUsIFZUNV9OQU1FKSk7CisgICAgICAgICAgICBmYWlsKGZvcm1hdCgic2hvdWxkIGZhaWwgYXMgJXMuJXMgaXMgbm90IGFsbG93ZWQgdG8gYmUgZmlsdGVyZWQgb24gaW1wbGljaXRseS4iLCBLU19OQU1FLCBWVDVfTkFNRSkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbnZhbGlkUXVlcnlFeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZXguZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJDYW5ub3QgZXhlY3V0ZSB0aGlzIHF1ZXJ5IGFzIGl0IG1pZ2h0IGludm9sdmUgZGF0YSBmaWx0ZXJpbmcgYW5kIHRodXMgbWF5IGhhdmUgdW5wcmVkaWN0YWJsZSBwZXJmb3JtYW5jZSIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsbG93ZWRGaWx0ZXJpbmdPblJlZ3VsYXJDb2x1bW4oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBleGVjdXRlTmV0KGZvcm1hdCgiU0VMRUNUICogRlJPTSAlcy4lcyBXSEVSRSB2MiA9IDUiLCBLU19OQU1FLCBWVDFfTkFNRSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsbG93ZWRGaWx0ZXJpbmdPbkNsdXN0ZXJpbmdDb2x1bW4oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBleGVjdXRlTmV0KGZvcm1hdCgiU0VMRUNUICogRlJPTSAlcy4lcyBXSEVSRSBjID0gJ2FiYyciLCBLU19OQU1FLCBWVDFfTkFNRSkpOworICAgIH0KKwogICAgIEBGdW5jdGlvbmFsSW50ZXJmYWNlCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50ZXJmYWNlIFRocm93aW5nUnVubmFibGUKICAgICB7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1dyaXRldGltZU9yVFRMVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9Xcml0ZXRpbWVPclRUTFRlc3QuamF2YQppbmRleCBjYzZjNjYzLi41NzExOTZkIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1dyaXRldGltZU9yVFRMVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvV3JpdGV0aW1lT3JUVExUZXN0LmphdmEKQEAgLTE4LDE3ICsxOCwyNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMudmFsaWRhdGlvbi5lbnRpdGllczsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVW50eXBlZFJlc3VsdFNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOwogCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CiAKKy8qKgorICogVGVzdHMgZm9yIENRTCdzIHtAY29kZSBXUklURVRJTUV9LCB7QGNvZGUgTUFYV1JJVEVUSU1FfSBhbmQge0Bjb2RlIFRUTH0gc2VsZWN0aW9uIGZ1bmN0aW9ucy4KKyAqLwogcHVibGljIGNsYXNzIFdyaXRldGltZU9yVFRMVGVzdCBleHRlbmRzIENRTFRlc3RlcgogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRVNUQU1QXzEgPSAxOwpAQCAtNzAsNyArODAsNDIgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdCgpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCBsIGxpc3Q8aW50PikiKTsKLSAgICAgICAgYXNzZXJ0SW52YWxpZE11bHRpQ2VsbFNlbGVjdGlvbigibCIsIHRydWUpOworCisgICAgICAgIC8vIE51bGwgY29sdW1uCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrKSBWQUxVRVMgKDEpIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICAvLyBDcmVhdGUgZW1wdHkKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwpIFZBTFVFUyAoMSwgW10pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICAvLyBDcmVhdGUgd2l0aCBhIHNpbmdsZSBlbGVtZW50IHdpdGhvdXQgVFRMCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsKSBWQUxVRVMgKDEsIFsxXSkgVVNJTkcgVElNRVNUQU1QID8iLCBUSU1FU1RBTVBfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibCIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEpLCB0dGxzKE5PX1RUTCkpOworCisgICAgICAgIC8vIEFkZCBhIG5ldyBlbGVtZW50IHRvIHRoZSBsaXN0IHdpdGggYSBuZXcgdGltZXN0YW1wIGFuZCBhIFRUTAorICAgICAgICBleGVjdXRlKCJVUERBVEUgJXMgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IFNFVCBsPWwrWzJdIFdIRVJFIGs9MSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibCIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhOT19UVEwsIFRUTF8yKSk7CisKKyAgICAgICAgYXNzZXJ0SW52YWxpZExpc3RFbGVtZW50U2VsZWN0aW9uKCJsWzBdIiwgImwiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZExpc3RTbGljZVNlbGVjdGlvbigibFsuLjBdIiwgImwiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZExpc3RTbGljZVNlbGVjdGlvbigibFswLi5dIiwgImwiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZExpc3RTbGljZVNlbGVjdGlvbigibFsxLi4xXSIsICJsIik7CisgICAgICAgIGFzc2VydEludmFsaWRMaXN0U2xpY2VTZWxlY3Rpb24oImxbMS4uMl0iLCAibCIpOworCisgICAgICAgIC8vIFJlYWQgbXVsdGlwbGUgcm93cyB0byB2ZXJpZnkgc2VsZWN0b3IgcmVzZXQKKyAgICAgICAgZXhlY3V0ZSgiVFJVTkNBVEUgVEFCTEUgJXMiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwpIFZBTFVFUyAoMSwgWzEsIDIsIDNdKSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8xKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwpIFZBTFVFUyAoMiwgWzEsIDJdKSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8yKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwpIFZBTFVFUyAoMywgWzFdKSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8xKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwpIFZBTFVFUyAoNCwgW10pIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbCkgVkFMVUVTICg1LCBudWxsKSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8yKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRShsKSBGUk9NICVzIiwKKyAgICAgICAgICAgICAgICAgICByb3coNSwgTk9fVElNRVNUQU1QKSwKKyAgICAgICAgICAgICAgICAgICByb3coMSwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8xKSksCisgICAgICAgICAgICAgICAgICAgcm93KDIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzIsIFRJTUVTVEFNUF8yKSksCisgICAgICAgICAgICAgICAgICAgcm93KDQsIE5PX1RJTUVTVEFNUCksCisgICAgICAgICAgICAgICAgICAgcm93KDMsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTg2LDYgKzEzMSw5IEBACiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDEsIFtdKSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOwogICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInYiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOwogCisgICAgICAgIC8vIHRydW5jYXRlLCBzaW5jZSBwcmV2aW91cyBjb2x1bW5zIHdvdWxkIHdpbiBvbiByZWNvbmNpbGxpYXRpb24gYmVjYXVzZSBvZiB0aGVpciBUVEwgKENBU1NBTkRSQS0xNDU5MikKKyAgICAgICAgZXhlY3V0ZSgiVFJVTkNBVEUgVEFCTEUgJXMiKTsKKwogICAgICAgICAvLyBVcGRhdGUgd2l0aCBhIHNpbmdsZSBlbGVtZW50IHdpdGhvdXQgVFRMCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDEsIFsxXSkgVVNJTkcgVElNRVNUQU1QID8iLCBUSU1FU1RBTVBfMSk7CiAgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidiIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOwpAQCAtOTMsMTMgKzE0MSwxMTkgQEAKICAgICAgICAgLy8gQWRkIGEgbmV3IGVsZW1lbnQgdG8gdGhlIGxpc3Qgd2l0aCBhIG5ldyB0aW1lc3RhbXAgYW5kIGEgVFRMCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDEsIFsxLCAyLCAzXSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKICAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2IiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKworICAgICAgICBhc3NlcnRJbnZhbGlkTGlzdEVsZW1lbnRTZWxlY3Rpb24oInZbMV0iLCAidiIpOworICAgICAgICBhc3NlcnRJbnZhbGlkTGlzdFNsaWNlU2VsZWN0aW9uKCJ2Wy4uMF0iLCAidiIpOworICAgICAgICBhc3NlcnRJbnZhbGlkTGlzdFNsaWNlU2VsZWN0aW9uKCJ2WzAuLl0iLCAidiIpOworICAgICAgICBhc3NlcnRJbnZhbGlkTGlzdFNsaWNlU2VsZWN0aW9uKCJ2WzEuLjFdIiwgInYiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZExpc3RTbGljZVNlbGVjdGlvbigidlsxLi4yXSIsICJ2Iik7CisKKyAgICAgICAgLy8gUmVhZCBtdWx0aXBsZSByb3dzIHRvIHZlcmlmeSBzZWxlY3RvciByZXNldAorICAgICAgICBleGVjdXRlKCJUUlVOQ0FURSBUQUJMRSAlcyIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgxLCBbMSwgMiwgM10pIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzEpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgyLCBbMSwgMl0pIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgzLCBbMV0pIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzEpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICg0LCBbXSkgVVNJTkcgVElNRVNUQU1QID8iLCBUSU1FU1RBTVBfMik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDUsIG51bGwpIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzIpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgaywgV1JJVEVUSU1FKHYpIEZST00gJXMiLAorICAgICAgICAgICAgICAgICAgIHJvdyg1LCBOT19USU1FU1RBTVApLAorICAgICAgICAgICAgICAgICAgIHJvdygxLCBUSU1FU1RBTVBfMSksCisgICAgICAgICAgICAgICAgICAgcm93KDIsIFRJTUVTVEFNUF8yKSwKKyAgICAgICAgICAgICAgICAgICByb3coNCwgVElNRVNUQU1QXzIpLAorICAgICAgICAgICAgICAgICAgIHJvdygzLCBUSU1FU1RBTVBfMSkpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNldCgpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCBzIHNldDxpbnQ+KSIpOwotICAgICAgICBhc3NlcnRJbnZhbGlkTXVsdGlDZWxsU2VsZWN0aW9uKCJzIiwgdHJ1ZSk7CisKKyAgICAgICAgLy8gTnVsbCBjb2x1bW4KKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGspIFZBTFVFUyAoMSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1suLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMC4uXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzAuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIENyZWF0ZSBlbXB0eQorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgcykgVkFMVUVTICgxLCB7fSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1suLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMC4uXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzAuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIFVwZGF0ZSB3aXRoIGEgc2luZ2xlIGVsZW1lbnQgd2l0aG91dCBUVEwKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHMpIFZBTFVFUyAoMSwgezF9KSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1swXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzFdIiwgVElNRVNUQU1QXzEsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1syXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWy4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1suLjFdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1suLjJdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1swLi5dIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1sxLi5dIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1syLi5dIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMC4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1swLi4xXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEpLCB0dGxzKE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMS4uMV0iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xKSwgdHRscyhOT19UVEwpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzEuLjJdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1syLi4yXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICAvLyBBZGQgYSBuZXcgZWxlbWVudCB0byB0aGUgc2V0IHdpdGggYSBuZXcgdGltZXN0YW1wIGFuZCBhIFRUTAorICAgICAgICBleGVjdXRlKCJVUERBVEUgJXMgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IFNFVCBzPXMrezJ9IFdIRVJFIGs9MSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgicyIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhOT19UVEwsIFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1swXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzFdIiwgVElNRVNUQU1QXzEsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1syXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1szXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWy4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1suLjFdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1suLjJdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzIpLCB0dGxzKE5PX1RUTCwgVFRMXzIpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWy4uM10iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMiksIHR0bHMoTk9fVFRMLCBUVExfMikpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMC4uXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhOT19UVEwsIFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1sxLi5dIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzIpLCB0dGxzKE5PX1RUTCwgVFRMXzIpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzIuLl0iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8yKSwgdHRscyhUVExfMikpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMy4uXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzAuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMC4uMV0iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xKSwgdHRscyhOT19UVEwpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzAuLjJdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzIpLCB0dGxzKE5PX1RUTCwgVFRMXzIpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzAuLjNdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzIpLCB0dGxzKE5PX1RUTCwgVFRMXzIpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzEuLjFdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1sxLi4yXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhOT19UVEwsIFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1sxLi4zXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhOT19UVEwsIFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1syLi4yXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzIpLCB0dGxzKFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1syLi4zXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzIpLCB0dGxzKFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1szLi4zXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzMuLjRdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIENvbWJpbmUgdGltZXN0YW1wIHNlbGVjdGlvbiB3aXRoIG90aGVyIHNlbGVjdGlvbnMgYW5kIG9yZGVycworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgaywgV1JJVEVUSU1FKHNbMV0pIEZST00gJXMiLCByb3coMSwgVElNRVNUQU1QXzEpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIFdSSVRFVElNRShzWzFdKSwgayBGUk9NICVzIiwgcm93KFRJTUVTVEFNUF8xLCAxKSk7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCBXUklURVRJTUUoc1sxXSksIFdSSVRFVElNRShzWzJdKSBGUk9NICVzIiwgcm93KFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMikpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgV1JJVEVUSU1FKHNbMl0pLCBXUklURVRJTUUoc1sxXSkgRlJPTSAlcyIsIHJvdyhUSU1FU1RBTVBfMiwgVElNRVNUQU1QXzEpKTsKKworICAgICAgICAvLyBSZWFkIG11bHRpcGxlIHJvd3MgdG8gdmVyaWZ5IHNlbGVjdG9yIHJlc2V0CisgICAgICAgIGV4ZWN1dGUoIlRSVU5DQVRFIFRBQkxFICVzIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBzKSBWQUxVRVMgKDEsIHsxLCAyLCAzfSkgVVNJTkcgVElNRVNUQU1QID8iLCBUSU1FU1RBTVBfMSk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBzKSBWQUxVRVMgKDIsIHsxLCAyfSkgVVNJTkcgVElNRVNUQU1QID8iLCBUSU1FU1RBTVBfMik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBzKSBWQUxVRVMgKDMsIHsxfSkgVVNJTkcgVElNRVNUQU1QID8iLCBUSU1FU1RBTVBfMSk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBzKSBWQUxVRVMgKDQsIHt9KSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8yKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHMpIFZBTFVFUyAoNSwgbnVsbCkgVVNJTkcgVElNRVNUQU1QID8iLCBUSU1FU1RBTVBfMik7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCBrLCBXUklURVRJTUUocykgRlJPTSAlcyIsCisgICAgICAgICAgICAgICAgICAgcm93KDUsIE5PX1RJTUVTVEFNUCksCisgICAgICAgICAgICAgICAgICAgcm93KDEsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMSkpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8yLCBUSU1FU1RBTVBfMikpLAorICAgICAgICAgICAgICAgICAgIHJvdyg0LCBOT19USU1FU1RBTVApLAorICAgICAgICAgICAgICAgICAgIHJvdygzLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xKSkpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgaywgV1JJVEVUSU1FKHNbMV0pIEZST00gJXMiLAorICAgICAgICAgICAgICAgICAgIHJvdyg1LCBOT19USU1FU1RBTVApLAorICAgICAgICAgICAgICAgICAgIHJvdygxLCBUSU1FU1RBTVBfMSksCisgICAgICAgICAgICAgICAgICAgcm93KDIsIFRJTUVTVEFNUF8yKSwKKyAgICAgICAgICAgICAgICAgICByb3coNCwgTk9fVElNRVNUQU1QKSwKKyAgICAgICAgICAgICAgICAgICByb3coMywgVElNRVNUQU1QXzEpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTEwLDI1ICsyNjQsMTgyIEBACiAgICAgICAgIC8vIE51bGwgY29sdW1uCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrKSBWQUxVRVMgKDEpIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CiAgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgicyIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbLi4wXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzAuLl0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1swLi4wXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKIAogICAgICAgICAvLyBDcmVhdGUgZW1wdHkKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHMpIFZBTFVFUyAoMSwge30pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CiAgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgicyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1suLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMC4uXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMC4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgLy8gdHJ1bmNhdGUsIHNpbmNlIHByZXZpb3VzIGNvbHVtbnMgd291bGQgd2luIG9uIHJlY29uY2lsbGlhdGlvbiBiZWNhdXNlIG9mIHRoZWlyIFRUTCAoQ0FTU0FORFJBLTE0NTkyKQorICAgICAgICBleGVjdXRlKCJUUlVOQ0FURSBUQUJMRSAlcyIpOwogCiAgICAgICAgIC8vIFVwZGF0ZSB3aXRoIGEgc2luZ2xlIGVsZW1lbnQgd2l0aG91dCBUVEwKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHMpIFZBTFVFUyAoMSwgezF9KSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8xKTsKICAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzIiwgVElNRVNUQU1QXzEsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1swXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzFdIiwgVElNRVNUQU1QXzEsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1syXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWy4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1suLjFdIiwgVElNRVNUQU1QXzEsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1suLjJdIiwgVElNRVNUQU1QXzEsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1swLi5dIiwgVElNRVNUQU1QXzEsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1sxLi5dIiwgVElNRVNUQU1QXzEsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1syLi5dIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMC4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1swLi4xXSIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMC4uMl0iLCBUSU1FU1RBTVBfMSwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzEuLjFdIiwgVElNRVNUQU1QXzEsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1sxLi4yXSIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMi4uMl0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1syLi4zXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKIAogICAgICAgICAvLyBBZGQgYSBuZXcgZWxlbWVudCB0byB0aGUgc2V0IHdpdGggYSBuZXcgdGltZXN0YW1wIGFuZCBhIFRUTAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgcykgVkFMVUVTICgxLCB7MSwgMn0pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8yLCBUVExfMik7CiAgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgicyIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1swXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzFdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzJdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzNdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbLi4wXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWy4uMV0iLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbLi4yXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1suLjNdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzAuLl0iLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMS4uXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1syLi5dIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzMuLl0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1swLi4wXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzAuLjFdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzAuLjJdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzAuLjNdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzEuLjFdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzEuLjJdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzEuLjNdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzIuLjJdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzIuLjNdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzMuLjNdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMy4uNF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgLy8gUmVhZCBtdWx0aXBsZSByb3dzIHRvIHZlcmlmeSBzZWxlY3RvciByZXNldAorICAgICAgICBleGVjdXRlKCJUUlVOQ0FURSBUQUJMRSAlcyIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgcykgVkFMVUVTICgxLCB7MSwgMiwgM30pIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzEpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgcykgVkFMVUVTICgyLCB7MSwgMn0pIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgcykgVkFMVUVTICgzLCB7MX0pIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzEpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgcykgVkFMVUVTICg0LCB7fSkgVVNJTkcgVElNRVNUQU1QID8iLCBUSU1FU1RBTVBfMik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBzKSBWQUxVRVMgKDUsIG51bGwpIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzIpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgaywgV1JJVEVUSU1FKHMpIEZST00gJXMiLAorICAgICAgICAgICAgICAgICAgIHJvdyg1LCBOT19USU1FU1RBTVApLAorICAgICAgICAgICAgICAgICAgIHJvdygxLCBUSU1FU1RBTVBfMSksCisgICAgICAgICAgICAgICAgICAgcm93KDIsIFRJTUVTVEFNUF8yKSwKKyAgICAgICAgICAgICAgICAgICByb3coNCwgVElNRVNUQU1QXzIpLAorICAgICAgICAgICAgICAgICAgIHJvdygzLCBUSU1FU1RBTVBfMSkpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgaywgV1JJVEVUSU1FKHNbMV0pIEZST00gJXMiLAorICAgICAgICAgICAgICAgICAgIHJvdyg1LCBOT19USU1FU1RBTVApLAorICAgICAgICAgICAgICAgICAgIHJvdygxLCBUSU1FU1RBTVBfMSksCisgICAgICAgICAgICAgICAgICAgcm93KDIsIFRJTUVTVEFNUF8yKSwKKyAgICAgICAgICAgICAgICAgICByb3coNCwgTk9fVElNRVNUQU1QKSwKKyAgICAgICAgICAgICAgICAgICByb3coMywgVElNRVNUQU1QXzEpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RNYXAoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgbSBtYXA8aW50LCBpbnQ+KSIpOwotICAgICAgICBhc3NlcnRJbnZhbGlkTXVsdGlDZWxsU2VsZWN0aW9uKCJtIiwgdHJ1ZSk7CisKKyAgICAgICAgLy8gTnVsbCBjb2x1bW4KKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGspIFZBTFVFUyAoMSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMC4uXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzAuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIENyZWF0ZSBlbXB0eQorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbSkgVkFMVUVTICgxLCB7fSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMC4uXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzAuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIFVwZGF0ZSB3aXRoIGEgc2luZ2xlIGVsZW1lbnQgd2l0aG91dCBUVEwKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIG0pIFZBTFVFUyAoMSwgezE6MTB9KSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsxXSIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMl0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bLi4xXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEpLCB0dGxzKE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bLi4yXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEpLCB0dGxzKE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMC4uXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEpLCB0dGxzKE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMS4uXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEpLCB0dGxzKE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMi4uXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzAuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMC4uMV0iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xKSwgdHRscyhOT19UVEwpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzAuLjJdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsxLi4xXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEpLCB0dGxzKE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMS4uMl0iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xKSwgdHRscyhOT19UVEwpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzIuLjJdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMi4uM10iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgLy8gQWRkIGEgbmV3IGVsZW1lbnQgdG8gdGhlIG1hcCB3aXRoIGEgbmV3IHRpbWVzdGFtcCBhbmQgYSBUVEwKKyAgICAgICAgZXhlY3V0ZSgiVVBEQVRFICVzIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyBTRVQgbT1tK3syOjIwfSBXSEVSRSBrPTEiLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm0iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMiksIHR0bHMoTk9fVFRMLCBUVExfMikpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsxXSIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMl0iLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bM10iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bLi4xXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEpLCB0dGxzKE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bLi4yXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhOT19UVEwsIFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsuLjNdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzIpLCB0dGxzKE5PX1RUTCwgVFRMXzIpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzAuLl0iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMiksIHR0bHMoTk9fVFRMLCBUVExfMikpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMS4uXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhOT19UVEwsIFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsyLi5dIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMiksIHR0bHMoVFRMXzIpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzMuLl0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVswLi4wXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzAuLjFdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVswLi4yXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhOT19UVEwsIFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVswLi4zXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhOT19UVEwsIFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsxLi4xXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEpLCB0dGxzKE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMS4uMl0iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMiksIHR0bHMoTk9fVFRMLCBUVExfMikpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMS4uM10iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMiksIHR0bHMoTk9fVFRMLCBUVExfMikpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMi4uMl0iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8yKSwgdHRscyhUVExfMikpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMi4uM10iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8yKSwgdHRscyhUVExfMikpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMy4uM10iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVszLi40XSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICAvLyBDb21iaW5lIHRpbWVzdGFtcCBzZWxlY3Rpb24gd2l0aCBvdGhlciBzZWxlY3Rpb25zIGFuZCBvcmRlcnMKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRShtWzFdKSBGUk9NICVzIiwgcm93KDEsIFRJTUVTVEFNUF8xKSk7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCBXUklURVRJTUUobVsxXSksIGsgRlJPTSAlcyIsIHJvdyhUSU1FU1RBTVBfMSwgMSkpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgV1JJVEVUSU1FKG1bMV0pLCBXUklURVRJTUUobVsyXSkgRlJPTSAlcyIsIHJvdyhUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzIpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIFdSSVRFVElNRShtWzJdKSwgV1JJVEVUSU1FKG1bMV0pIEZST00gJXMiLCByb3coVElNRVNUQU1QXzIsIFRJTUVTVEFNUF8xKSk7CisKKyAgICAgICAgLy8gUmVhZCBtdWx0aXBsZSByb3dzIHRvIHZlcmlmeSBzZWxlY3RvciByZXNldAorICAgICAgICBleGVjdXRlKCJUUlVOQ0FURSBUQUJMRSAlcyIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbSkgVkFMVUVTICgxLCB7MToxMCwgMjoyMCwgMzozMH0pIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzEpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbSkgVkFMVUVTICgyLCB7MToxMCwgMjoyMH0pIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbSkgVkFMVUVTICgzLCB7MToxMH0pIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzEpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbSkgVkFMVUVTICg0LCB7fSkgVVNJTkcgVElNRVNUQU1QID8iLCBUSU1FU1RBTVBfMik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBtKSBWQUxVRVMgKDUsIG51bGwpIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzIpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgaywgV1JJVEVUSU1FKG0pIEZST00gJXMiLAorICAgICAgICAgICAgICAgICAgIHJvdyg1LCBOT19USU1FU1RBTVApLAorICAgICAgICAgICAgICAgICAgIHJvdygxLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzEpKSwKKyAgICAgICAgICAgICAgICAgICByb3coMiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMiwgVElNRVNUQU1QXzIpKSwKKyAgICAgICAgICAgICAgICAgICByb3coNCwgTk9fVElNRVNUQU1QKSwKKyAgICAgICAgICAgICAgICAgICByb3coMywgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSkpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRShtWzFdKSBGUk9NICVzIiwKKyAgICAgICAgICAgICAgICAgICByb3coNSwgTk9fVElNRVNUQU1QKSwKKyAgICAgICAgICAgICAgICAgICByb3coMSwgVElNRVNUQU1QXzEpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCBUSU1FU1RBTVBfMiksCisgICAgICAgICAgICAgICAgICAgcm93KDQsIE5PX1RJTUVTVEFNUCksCisgICAgICAgICAgICAgICAgICAgcm93KDMsIFRJTUVTVEFNUF8xKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTEzOSwxOCArNDUwLDI0NCBAQAogICAgICAgICAvLyBOdWxsIGNvbHVtbgogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaykgVkFMVUVTICgxKSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOwogICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVswXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWy4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVswLi5dIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMC4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CiAKICAgICAgICAgLy8gQ3JlYXRlIGVtcHR5CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBtKSBWQUxVRVMgKDEsIHt9KSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOwogICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm0iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMC4uXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzAuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIHRydW5jYXRlLCBzaW5jZSBwcmV2aW91cyBjb2x1bW5zIHdvdWxkIHdpbiBvbiByZWNvbmNpbGxpYXRpb24gYmVjYXVzZSBvZiB0aGVpciBUVEwgKENBU1NBTkRSQS0xNDU5MikKKyAgICAgICAgZXhlY3V0ZSgiVFJVTkNBVEUgVEFCTEUgJXMiKTsKIAogICAgICAgICAvLyBDcmVhdGUgd2l0aCBhIHNpbmdsZSBlbGVtZW50IHdpdGhvdXQgVFRMCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBtKSBWQUxVRVMgKDEsIHsxOjEwfSkgVVNJTkcgVElNRVNUQU1QID8iLCBUSU1FU1RBTVBfMSk7CiAgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibSIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsxXSIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMl0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bLi4xXSIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bLi4yXSIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMC4uXSIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMS4uXSIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMi4uXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzAuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMC4uMV0iLCBUSU1FU1RBTVBfMSwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzAuLjJdIiwgVElNRVNUQU1QXzEsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsxLi4xXSIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMS4uMl0iLCBUSU1FU1RBTVBfMSwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzIuLjJdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMi4uM10iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CiAKICAgICAgICAgLy8gQWRkIGEgbmV3IGVsZW1lbnQgdG8gdGhlIG1hcCB3aXRoIGEgbmV3IHRpbWVzdGFtcCBhbmQgYSBUVEwKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIG0pIFZBTFVFUyAoMSwgezE6MTAsIDI6MjB9KSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMiwgVFRMXzIpOwogICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm0iLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsxXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsyXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVszXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWy4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsuLjFdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWy4uMl0iLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bLi4zXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVswLi5dIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzEuLl0iLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMi4uXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVszLi5dIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMC4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVswLi4xXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVswLi4yXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVswLi4zXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsxLi4xXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsxLi4yXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsxLi4zXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsyLi4yXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsyLi4zXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVszLi4zXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzMuLjRdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIFJlYWQgbXVsdGlwbGUgcm93cyB0byB2ZXJpZnkgc2VsZWN0b3IgcmVzZXQKKyAgICAgICAgZXhlY3V0ZSgiVFJVTkNBVEUgVEFCTEUgJXMiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIG0pIFZBTFVFUyAoMSwgezE6MTAsIDI6MjAsIDM6MzB9KSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8xKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIG0pIFZBTFVFUyAoMiwgezE6MTAsIDI6MjB9KSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8yKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIG0pIFZBTFVFUyAoMywgezE6MTB9KSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8xKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIG0pIFZBTFVFUyAoNCwge30pIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbSkgVkFMVUVTICg1LCBudWxsKSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8yKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRShtKSBGUk9NICVzIiwKKyAgICAgICAgICAgICAgICAgICByb3coNSwgTk9fVElNRVNUQU1QKSwKKyAgICAgICAgICAgICAgICAgICByb3coMSwgVElNRVNUQU1QXzEpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCBUSU1FU1RBTVBfMiksCisgICAgICAgICAgICAgICAgICAgcm93KDQsIFRJTUVTVEFNUF8yKSwKKyAgICAgICAgICAgICAgICAgICByb3coMywgVElNRVNUQU1QXzEpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRShtWzFdKSBGUk9NICVzIiwKKyAgICAgICAgICAgICAgICAgICByb3coNSwgTk9fVElNRVNUQU1QKSwKKyAgICAgICAgICAgICAgICAgICByb3coMSwgVElNRVNUQU1QXzEpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCBUSU1FU1RBTVBfMiksCisgICAgICAgICAgICAgICAgICAgcm93KDQsIE5PX1RJTUVTVEFNUCksCisgICAgICAgICAgICAgICAgICAgcm93KDMsIFRJTUVTVEFNUF8xKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkQ29sbGVjdGlvbnMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdiBtYXA8aW50LGZyb3plbjxzZXQ8aW50Pj4+KSIpOworCisgICAgICAgIC8vIE51bGwgY29sdW1uCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrKSBWQUxVRVMgKDEpIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMF1bMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHYpIFZBTFVFUyAoMSwgezE6ezEsMn19KSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBleGVjdXRlKCJVUERBVEUgJXMgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IFNFVCB2PXYrezI6ezEsIDJ9fSBXSEVSRSBrPTEiLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworCisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidiIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhUVExfMSwgVFRMXzIpKTsKKworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsxXSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsyXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlszXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMC4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswLi4xXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEpLCB0dGxzKFRUTF8xKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswLi4yXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhUVExfMSwgVFRMXzIpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzAuLjNdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzIpLCB0dGxzKFRUTF8xLCBUVExfMikpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMS4uM10iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMiksIHR0bHMoVFRMXzEsIFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsyLi4zXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzIpLCB0dGxzKFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlszLi4zXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMF1bMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswXVsxXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzBdWzJdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMF1bM10iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzFdWzBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMV1bMV0iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMV1bMl0iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMV1bM10iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzJdWzBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMl1bMV0iLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMl1bMl0iLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMl1bM10iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzNdWzBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbM11bMV0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlszXVsyXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzNdWzNdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswXVswLi4wXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzBdWzAuLjFdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMF1bMS4uMl0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswXVsyLi4zXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzBdWzMuLjRdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsxXVswLi4wXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzFdWzAuLjFdIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzFdWzEuLjJdIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzFdWzIuLjNdIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzFdWzMuLjRdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsyXVswLi4wXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzJdWzAuLjFdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzJdWzEuLjJdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzJdWzIuLjNdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzJdWzMuLjRdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlszXVswLi4wXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzNdWzAuLjFdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbM11bMS4uMl0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlszXVsyLi4zXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzNdWzMuLjRdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswLi4xXVswXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzAuLjFdWzFdIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzAuLjFdWzJdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMC4uMl1bMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswLi4yXVsxXSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswLi4yXVsyXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswLi4yXVszXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGcm96ZW5OZXN0ZWRDb2xsZWN0aW9ucygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB2IGZyb3plbjxtYXA8aW50LGZyb3plbjxzZXQ8aW50Pj4+PikiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHYpIFZBTFVFUyAoMSwgezE6ezEsMn0sIDI6ezEsMn19KSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworCisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidiIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMV0iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMl0iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbM10iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzBdWzBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMF1bMV0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswXVsyXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzBdWzNdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsxXVswXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzFdWzFdIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzFdWzJdIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzFdWzNdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsyXVswXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzJdWzFdIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzJdWzJdIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzJdWzNdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlszXVswXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzNdWzFdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbM11bMl0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlszXVszXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMF1bMC4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswXVswLi4xXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzBdWzEuLjJdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMF1bMi4uM10iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswXVszLi40XSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMV1bMC4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsxXVswLi4xXSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsxXVsxLi4yXSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsxXVsyLi4zXSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsxXVszLi40XSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMl1bMC4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsyXVswLi4xXSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsyXVsxLi4yXSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsyXVsyLi4zXSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsyXVszLi40XSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbM11bMC4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlszXVswLi4xXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzNdWzEuLjJdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbM11bMi4uM10iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlszXVszLi40XSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMC4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswLi4xXSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsxLi4yXSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsyLi4zXSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlszLi40XSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMC4uMF1bMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswLi4wXVsxXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzAuLjFdWzBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMC4uMV1bMV0iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMC4uMV1bMl0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsxLi4yXVswXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzEuLjJdWzFdIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzEuLjJdWzJdIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzEuLjJdWzNdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xNTgsNyArNjk1LDU4IEBACiAgICAgewogICAgICAgICBTdHJpbmcgdHlwZSA9IGNyZWF0ZVR5cGUoIkNSRUFURSBUWVBFICVzIChmMSBpbnQsIGYyIGludCkiKTsKICAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIHQgIiArIHR5cGUgKyAnKScpOwotICAgICAgICBhc3NlcnRJbnZhbGlkTXVsdGlDZWxsU2VsZWN0aW9uKCJ0IiwgZmFsc2UpOworCisgICAgICAgIC8vIE51bGwgY29sdW1uCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrKSBWQUxVRVMgKDApIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgLy8gQm90aCBmaWVsZHMgYXJlIGVtcHR5CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDAsIHtmMTpudWxsLCBmMjpudWxsfSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9MCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgIms9MCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9MCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRSh0LmYxKSwgV1JJVEVUSU1FKHQuZjIpIEZST00gJXMgV0hFUkUgaz0wIiwgcm93KDAsIE5PX1RJTUVTVEFNUCwgTk9fVElNRVNUQU1QKSk7CisKKyAgICAgICAgLy8gT25seSB0aGUgZmlyc3QgZmllbGQgaXMgc2V0CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDEsIHtmMToxLCBmMjpudWxsfSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9MSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIE5PX1RJTUVTVEFNUCksIHR0bHMoVFRMXzEsIE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0xIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9MSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRSh0LmYxKSwgV1JJVEVUSU1FKHQuZjIpIEZST00gJXMgV0hFUkUgaz0xIiwgcm93KDEsIFRJTUVTVEFNUF8xLCBOT19USU1FU1RBTVApKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRSh0LmYyKSwgV1JJVEVUSU1FKHQuZjEpIEZST00gJXMgV0hFUkUgaz0xIiwgcm93KDEsIE5PX1RJTUVTVEFNUCwgVElNRVNUQU1QXzEpKTsKKworICAgICAgICAvLyBPbmx5IHRoZSBzZWNvbmQgZmllbGQgaXMgc2V0CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDIsIHtmMTpudWxsLCBmMjoyfSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9MiIsIHRpbWVzdGFtcHMoTk9fVElNRVNUQU1QLCBUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMLCBUVExfMSkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0yIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz0yIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRSh0LmYxKSwgV1JJVEVUSU1FKHQuZjIpIEZST00gJXMgV0hFUkUgaz0yIiwgcm93KDIsIE5PX1RJTUVTVEFNUCwgVElNRVNUQU1QXzEpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRSh0LmYyKSwgV1JJVEVUSU1FKHQuZjEpIEZST00gJXMgV0hFUkUgaz0yIiwgcm93KDIsIFRJTUVTVEFNUF8xLCBOT19USU1FU1RBTVApKTsKKworICAgICAgICAvLyBCb3RoIGZpZWxkcyBhcmUgc2V0CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDMsIHtmMToxLCBmMjoyfSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9MyIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8xKSwgdHRscyhUVExfMSwgVFRMXzEpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgIms9MyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMiIsICJrPTMiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgaywgV1JJVEVUSU1FKHQuZjEpLCBXUklURVRJTUUodC5mMikgRlJPTSAlcyBXSEVSRSBrPTMiLCByb3coMywgVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8xKSk7CisKKyAgICAgICAgLy8gSGF2aW5nIG9ubHkgdGhlIGZpcnN0IGZpZWxkIHNldCwgdXBkYXRlIHRoZSBzZWNvbmQgZmllbGQKKyAgICAgICAgZXhlY3V0ZSgiVVBEQVRFICVzIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyBTRVQgdC5mMj0yIFdIRVJFIGs9MSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsICJrPTEiLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMiksIHR0bHMoVFRMXzEsIFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMSIsICJrPTEiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz0xIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRSh0LmYxKSwgV1JJVEVUSU1FKHQuZjIpIEZST00gJXMgV0hFUkUgaz0xIiwgcm93KDEsIFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMikpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgaywgV1JJVEVUSU1FKHQuZjIpLCBXUklURVRJTUUodC5mMSkgRlJPTSAlcyBXSEVSRSBrPTEiLCByb3coMSwgVElNRVNUQU1QXzIsIFRJTUVTVEFNUF8xKSk7CisKKyAgICAgICAgLy8gSGF2aW5nIG9ubHkgdGhlIHNlY29uZCBmaWVsZCBzZXQsIHVwZGF0ZSB0aGUgc2Vjb25kIGZpZWxkCisgICAgICAgIGV4ZWN1dGUoIlVQREFURSAlcyBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8gU0VUIHQuZjE9MSBXSEVSRSBrPTIiLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQiLCAiaz0yIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMiwgVElNRVNUQU1QXzEpLCB0dGxzKFRUTF8yLCBUVExfMSkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0yIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9MiIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCBrLCBXUklURVRJTUUodC5mMSksIFdSSVRFVElNRSh0LmYyKSBGUk9NICVzIFdIRVJFIGs9MiIsIHJvdygyLCBUSU1FU1RBTVBfMiwgVElNRVNUQU1QXzEpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRSh0LmYyKSwgV1JJVEVUSU1FKHQuZjEpIEZST00gJXMgV0hFUkUgaz0yIiwgcm93KDIsIFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMikpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xNzAsMjIgKzc1OCwzNDMgQEAKICAgICAgICAgLy8gTnVsbCBjb2x1bW4KICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGspIFZBTFVFUyAoMCkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKICAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKIAogICAgICAgICAvLyBCb3RoIGZpZWxkcyBhcmUgZW1wdHkKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoMCwge2YxOm51bGwsIGYyOm51bGx9KSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOwogICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQiLCAiaz0wIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgIms9MCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9MCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRSh0LmYxKSwgV1JJVEVUSU1FKHQuZjIpIEZST00gJXMgV0hFUkUgaz0wIiwgcm93KDAsIE5PX1RJTUVTVEFNUCwgTk9fVElNRVNUQU1QKSk7CiAKICAgICAgICAgLy8gT25seSB0aGUgZmlyc3QgZmllbGQgaXMgc2V0CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDEsIHtmMToxLCBmMjpudWxsfSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKICAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9MSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMSIsICJrPTEiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz0xIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgaywgV1JJVEVUSU1FKHQuZjEpLCBXUklURVRJTUUodC5mMikgRlJPTSAlcyBXSEVSRSBrPTEiLCByb3coMSwgVElNRVNUQU1QXzEsIE5PX1RJTUVTVEFNUCkpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgaywgV1JJVEVUSU1FKHQuZjIpLCBXUklURVRJTUUodC5mMSkgRlJPTSAlcyBXSEVSRSBrPTEiLCByb3coMSwgTk9fVElNRVNUQU1QLCBUSU1FU1RBTVBfMSkpOwogCiAgICAgICAgIC8vIE9ubHkgdGhlIHNlY29uZCBmaWVsZCBpcyBzZXQKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoMiwge2YxOm51bGwsIGYyOjJ9KSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOwogICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQiLCAiaz0yIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgIms9MiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9MiIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCBrLCBXUklURVRJTUUodC5mMSksIFdSSVRFVElNRSh0LmYyKSBGUk9NICVzIFdIRVJFIGs9MiIsIHJvdygyLCBOT19USU1FU1RBTVAsIFRJTUVTVEFNUF8xKSk7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCBrLCBXUklURVRJTUUodC5mMiksIFdSSVRFVElNRSh0LmYxKSBGUk9NICVzIFdIRVJFIGs9MiIsIHJvdygyLCBUSU1FU1RBTVBfMSwgTk9fVElNRVNUQU1QKSk7CiAKICAgICAgICAgLy8gQm90aCBmaWVsZHMgYXJlIHNldAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICgzLCB7ZjE6MSwgZjI6Mn0pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CiAgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsICJrPTMiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0zIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9MyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCBrLCBXUklURVRJTUUodC5mMSksIFdSSVRFVElNRSh0LmYyKSBGUk9NICVzIFdIRVJFIGs9MyIsIHJvdygzLCBUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRVRFRzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgU3RyaW5nIG5lc3RlZFR5cGUgPSBjcmVhdGVUeXBlKCJDUkVBVEUgVFlQRSAlcyAoZjEgaW50LCBmMiBpbnQpIik7CisgICAgICAgIFN0cmluZyB0eXBlID0gY3JlYXRlVHlwZShmb3JtYXQoIkNSRUFURSBUWVBFICUlcyAoZjEgZnJvemVuPCVzPiwgZjIgZnJvemVuPCU8cz4pIiwgbmVzdGVkVHlwZSkpOworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdCAiICsgdHlwZSArICcpJyk7CisKKyAgICAgICAgLy8gQm90aCBmaWVsZHMgYXJlIGVtcHR5CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDEsIHtmMTpudWxsLCBmMjpudWxsfSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9MSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgIms9MSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYxIiwgIms9MSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYyIiwgIms9MSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9MSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYxIiwgIms9MSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYyIiwgIms9MSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICAvLyBPbmx5IHRoZSBmaXJzdCBmaWVsZCBpcyBzZXQsIG5vIG5lc3RlZCBmaWVsZCBpcyBzZXQKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoMiwge2YxOntmMTpudWxsLGYyOm51bGx9LCBmMjpudWxsfSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9MiIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIE5PX1RJTUVTVEFNUCksIHR0bHMoVFRMXzEsIE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0yIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYxIiwgIms9MiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYyIiwgIms9MiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9MiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYxIiwgIms9MiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYyIiwgIms9MiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICAvLyBPbmx5IHRoZSBmaXJzdCBmaWVsZCBpcyBzZXQsIG9ubHkgdGhlIGZpcnN0IG5lc3RlZCBmaWVsZCBpcyBzZXQKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoMywge2YxOntmMToxLGYyOm51bGx9LCBmMjpudWxsfSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9MiIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIE5PX1RJTUVTVEFNUCksIHR0bHMoVFRMXzEsIE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0zIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYxIiwgIms9MyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMiIsICJrPTMiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMiIsICJrPTMiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMSIsICJrPTMiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMiIsICJrPTMiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgLy8gT25seSB0aGUgZmlyc3QgZmllbGQgaXMgc2V0LCBvbmx5IHRoZSBzZWNvbmQgbmVzdGVkIGZpZWxkIGlzIHNldAorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICg0LCB7ZjE6e2YxOm51bGwsZjI6Mn0sIGYyOm51bGx9KSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQiLCAiaz00IiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSwgTk9fVElNRVNUQU1QKSwgdHRscyhUVExfMSwgTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMSIsICJrPTQiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjEiLCAiaz00IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjIiLCAiaz00IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9NCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYxIiwgIms9NCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYyIiwgIms9NCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICAvLyBPbmx5IHRoZSBmaXJzdCBmaWVsZCBpcyBzZXQsIGJvdGggbmVzdGVkIGZpZWxkIGFyZSBzZXQKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoNSwge2YxOntmMToxLGYyOjJ9LCBmMjpudWxsfSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9NSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIE5PX1RJTUVTVEFNUCksIHR0bHMoVFRMXzEsIE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz01IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYxIiwgIms9NSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMiIsICJrPTUiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz01IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjEiLCAiaz01IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjIiLCAiaz01IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIE9ubHkgdGhlIHNlY29uZCBmaWVsZCBpcyBzZXQsIG5vIG5lc3RlZCBmaWVsZCBpcyBzZXQKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoNiwge2YxOm51bGwsIGYyOntmMTpudWxsLGYyOm51bGx9fSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9NiIsIHRpbWVzdGFtcHMoTk9fVElNRVNUQU1QLCBUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMLCBUVExfMSkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz02IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjEiLCAiaz02IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjIiLCAiaz02IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz02IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYxIiwgIms9NiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYyIiwgIms9NiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICAvLyBPbmx5IHRoZSBzZWNvbmQgZmllbGQgaXMgc2V0LCBvbmx5IHRoZSBmaXJzdCBuZXN0ZWQgZmllbGQgaXMgc2V0CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDcsIHtmMTpudWxsLCBmMjp7ZjE6MSxmMjpudWxsfX0pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsICJrPTciLCB0aW1lc3RhbXBzKE5PX1RJTUVTVEFNUCwgVElNRVNUQU1QXzEpLCB0dGxzKE5PX1RUTCwgVFRMXzEpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgIms9NyIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYxIiwgIms9NyIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYyIiwgIms9NyIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9NyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMSIsICJrPTciLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjIiLCAiaz03IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIE9ubHkgdGhlIHNlY29uZCBmaWVsZCBpcyBzZXQsIG9ubHkgdGhlIHNlY29uZCBuZXN0ZWQgZmllbGQgaXMgc2V0CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDgsIHtmMTpudWxsLCBmMjp7ZjE6bnVsbCxmMjoyfX0pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsICJrPTgiLCB0aW1lc3RhbXBzKE5PX1RJTUVTVEFNUCwgVElNRVNUQU1QXzEpLCB0dGxzKE5PX1RUTCwgVFRMXzEpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgIms9OCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYxIiwgIms9OCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYyIiwgIms9OCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9OCIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMSIsICJrPTgiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMiIsICJrPTgiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworCisgICAgICAgIC8vIE9ubHkgdGhlIHNlY29uZCBmaWVsZCBpcyBzZXQsIGJvdGggbmVzdGVkIGZpZWxkIGFyZSBzZXQKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoOSwge2YxOm51bGwsIGYyOntmMToxLGYyOjJ9fSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9OSIsIHRpbWVzdGFtcHMoTk9fVElNRVNUQU1QLCBUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMLCBUVExfMSkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz05IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjEiLCAiaz05IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjIiLCAiaz05IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz05IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYxIiwgIms9OSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMiIsICJrPTkiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworCisgICAgICAgIC8vIEJvdGggZmllbGRzIGFyZSBzZXQsIGFsdGVybmF0ZSBmaWVsZHMgYXJlIHNldAorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICgxMCwge2YxOntmMToxfX0pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGV4ZWN1dGUoIlVQREFURSAlcyBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8gU0VUIHQuZjI9e2YyOjJ9IFdIRVJFIGs9MTAiLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQiLCAiaz0xMCIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhUVExfMSwgVFRMXzIpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgIms9MTAiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjEiLCAiaz0xMCIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMiIsICJrPTEwIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz0xMCIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMSIsICJrPTEwIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjIiLCAiaz0xMCIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisKKyAgICAgICAgLy8gQm90aCBmaWVsZHMgYXJlIHNldCwgYWx0ZXJuYXRlIGZpZWxkcyBhcmUgc2V0CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDExLCB7ZjE6e2YyOjJ9fSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgZXhlY3V0ZSgiVVBEQVRFICVzIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyBTRVQgdC5mMj17ZjE6Mn0gV0hFUkUgaz0xMSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsICJrPTExIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzIpLCB0dGxzKFRUTF8xLCBUVExfMikpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0xMSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMSIsICJrPTExIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjIiLCAiaz0xMSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMiIsICJrPTExIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYxIiwgIms9MTEiLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjIiLCAiaz0xMSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICAvLyBCb3RoIGZpZWxkcyBhcmUgc2V0LCBhbGwgZmllbGRzIGFyZSBzZXQKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoMTIsIHtmMTp7ZjE6MSxmMjoyfX0pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGV4ZWN1dGUoIlVQREFURSAlcyBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8gU0VUIHQuZjI9e2YxOjEsZjI6Mn0gV0hFUkUgaz0xMiIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsICJrPTEyIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzIpLCB0dGxzKFRUTF8xLCBUVExfMikpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0xMiIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMSIsICJrPTEyIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYyIiwgIms9MTIiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz0xMiIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMSIsICJrPTEyIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYyIiwgIms9MTIiLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZyb3plbk5lc3RlZFVEVHMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBTdHJpbmcgbmVzdGVkVHlwZSA9IGNyZWF0ZVR5cGUoIkNSRUFURSBUWVBFICVzIChmMSBpbnQsIGYyIGludCkiKTsKKyAgICAgICAgU3RyaW5nIHR5cGUgPSBjcmVhdGVUeXBlKGZvcm1hdCgiQ1JFQVRFIFRZUEUgJSVzIChmMSBmcm96ZW48JXM+LCBmMiBmcm96ZW48JTxzPikiLCBuZXN0ZWRUeXBlKSk7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB0IGZyb3plbjwiICsgdHlwZSArICI+KSIpOworCisgICAgICAgIC8vIEJvdGggZmllbGRzIGFyZSBlbXB0eQorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICgxLCB7ZjE6bnVsbCwgZjI6bnVsbH0pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsICJrPTEiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0xIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjEiLCAiaz0xIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjIiLCAiaz0xIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz0xIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjEiLCAiaz0xIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjIiLCAiaz0xIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIE9ubHkgdGhlIGZpcnN0IGZpZWxkIGlzIHNldCwgbm8gbmVzdGVkIGZpZWxkIGlzIHNldAorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICgyLCB7ZjE6e2YxOm51bGwsZjI6bnVsbH0sIGYyOm51bGx9KSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQiLCAiaz0yIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgIms9MiIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMSIsICJrPTIiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMiIsICJrPTIiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMiIsICJrPTIiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMSIsICJrPTIiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMiIsICJrPTIiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgLy8gT25seSB0aGUgZmlyc3QgZmllbGQgaXMgc2V0LCBvbmx5IHRoZSBmaXJzdCBuZXN0ZWQgZmllbGQgaXMgc2V0CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDMsIHtmMTp7ZjE6MSxmMjpudWxsfSwgZjI6bnVsbH0pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsICJrPTMiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0zIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYxIiwgIms9MyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMiIsICJrPTMiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMiIsICJrPTMiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMSIsICJrPTMiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMiIsICJrPTMiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgLy8gT25seSB0aGUgZmlyc3QgZmllbGQgaXMgc2V0LCBvbmx5IHRoZSBzZWNvbmQgbmVzdGVkIGZpZWxkIGlzIHNldAorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICg0LCB7ZjE6e2YxOm51bGwsZjI6Mn0sIGYyOm51bGx9KSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQiLCAiaz00IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgIms9NCIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMSIsICJrPTQiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMiIsICJrPTQiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz00IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjEiLCAiaz00IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjIiLCAiaz00IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIE9ubHkgdGhlIGZpcnN0IGZpZWxkIGlzIHNldCwgYm90aCBuZXN0ZWQgZmllbGQgYXJlIHNldAorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICg1LCB7ZjE6e2YxOjEsZjI6Mn0sIGYyOm51bGx9KSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQiLCAiaz01IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgIms9NSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMSIsICJrPTUiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjIiLCAiaz01IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9NSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYxIiwgIms9NSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYyIiwgIms9NSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICAvLyBPbmx5IHRoZSBzZWNvbmQgZmllbGQgaXMgc2V0LCBubyBuZXN0ZWQgZmllbGQgaXMgc2V0CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDYsIHtmMTpudWxsLCBmMjp7ZjE6bnVsbCxmMjpudWxsfX0pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsICJrPTYiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz02IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjEiLCAiaz02IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjIiLCAiaz02IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz02IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYxIiwgIms9NiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYyIiwgIms9NiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICAvLyBPbmx5IHRoZSBzZWNvbmQgZmllbGQgaXMgc2V0LCBvbmx5IHRoZSBmaXJzdCBuZXN0ZWQgZmllbGQgaXMgc2V0CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDcsIHtmMTpudWxsLCBmMjp7ZjE6MSxmMjpudWxsfX0pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsICJrPTciLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz03IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjEiLCAiaz03IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjIiLCAiaz03IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz03IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYxIiwgIms9NyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMiIsICJrPTciLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgLy8gT25seSB0aGUgc2Vjb25kIGZpZWxkIGlzIHNldCwgb25seSB0aGUgc2Vjb25kIG5lc3RlZCBmaWVsZCBpcyBzZXQKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoOCwge2YxOm51bGwsIGYyOntmMTpudWxsLGYyOjJ9fSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9OCIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMSIsICJrPTgiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMSIsICJrPTgiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMiIsICJrPTgiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMiIsICJrPTgiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjEiLCAiaz04IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjIiLCAiaz04IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKworICAgICAgICAvLyBPbmx5IHRoZSBzZWNvbmQgZmllbGQgaXMgc2V0LCBib3RoIG5lc3RlZCBmaWVsZCBhcmUgc2V0CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDksIHtmMTpudWxsLCBmMjp7ZjE6MSxmMjoyfX0pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsICJrPTkiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz05IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjEiLCAiaz05IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjIiLCAiaz05IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz05IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYxIiwgIms9OSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMiIsICJrPTkiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworCisgICAgICAgIC8vIEJvdGggZmllbGRzIGFyZSBzZXQsIGFsdGVybmF0ZSBmaWVsZHMgYXJlIHNldAorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICgxMCwge2YxOntmMToxfSwgZjI6e2YyOjJ9fSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9MTAiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0xMCIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMSIsICJrPTEwIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYyIiwgIms9MTAiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMiIsICJrPTEwIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYxIiwgIms9MTAiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMiIsICJrPTEwIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgLy8gQm90aCBmaWVsZHMgYXJlIHNldCwgYWx0ZXJuYXRlIGZpZWxkcyBhcmUgc2V0CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDExLCB7ZjE6e2YyOjJ9LCBmMjp7ZjE6MX19KSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQiLCAiaz0xMSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMSIsICJrPTExIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYxIiwgIms9MTEiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMiIsICJrPTExIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9MTEiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjEiLCAiaz0xMSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMiIsICJrPTExIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIEJvdGggZmllbGRzIGFyZSBzZXQsIGFsbCBmaWVsZHMgYXJlIHNldAorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICgxMiwge2YxOntmMToxLGYyOjJ9LGYyOntmMToxLGYyOjJ9fSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9MTIiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0xMiIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMSIsICJrPTEyIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYyIiwgIms9MTIiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz0xMiIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMSIsICJrPTEyIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYyIiwgIms9MTIiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZ1bmN0aW9ucygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB2IGludCwgcyBzZXQ8aW50PiwgZnMgZnJvemVuPHNldDxpbnQ+PikiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHYsIHMsIGZzKSBWQUxVRVMgKDAsIDAsIHsxLCAyLCAzfSwgezEsIDIsIDN9KSBVU0lORyBUSU1FU1RBTVAgMSBBTkQgVFRMIDEwMDAiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHYsIHMsIGZzKSBWQUxVRVMgKDEsIDEsIHsxMCwgMjAsIDMwfSwgezEwLCAyMCwgMzB9KSBVU0lORyBUSU1FU1RBTVAgMTAgQU5EIFRUTCAxMDAwIik7CisgICAgICAgIGV4ZWN1dGUoIlVQREFURSAlcyBVU0lORyBUSU1FU1RBTVAgMiBBTkQgVFRMIDIwMDAgU0VUIHMgPSBzICsgezIsIDN9IFdIRVJFIGsgPSAwIik7CisgICAgICAgIGV4ZWN1dGUoIlVQREFURSAlcyBVU0lORyBUSU1FU1RBTVAgMjAgQU5EIFRUTCAyMDAwIFNFVCBzID0gcyArIHsyMCwgMzB9IFdIRVJFIGsgPSAxIik7CisKKyAgICAgICAgLy8gUmVndWxhciBjb2x1bW4KKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIG1pbih2KSBGUk9NICVzIiwgcm93KDApKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIG1heCh2KSBGUk9NICVzIiwgcm93KDEpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIHdyaXRldGltZSh2KSBGUk9NICVzIiwgcm93KDEwTCksIHJvdygxTCkpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgbWluKHdyaXRldGltZSh2KSkgRlJPTSAlcyIsIHJvdygxTCkpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgbWF4KHdyaXRldGltZSh2KSkgRlJPTSAlcyIsIHJvdygxMEwpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIG1pbihtYXh3cml0ZXRpbWUodikpIEZST00gJXMiLCByb3coMUwpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIG1heChtYXh3cml0ZXRpbWUodikpIEZST00gJXMiLCByb3coMTBMKSk7CisKKyAgICAgICAgLy8gRnJvemVuIGNvbGxlY3Rpb24KKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIG1pbihmcykgRlJPTSAlcyIsIHJvdyhzZXQoMSwgMiwgMykpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIG1heChmcykgRlJPTSAlcyIsIHJvdyhzZXQoMTAsIDIwLCAzMCkpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIHdyaXRldGltZShmcykgRlJPTSAlcyIsIHJvdygxMEwpLCByb3coMUwpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIG1pbih3cml0ZXRpbWUoZnMpKSBGUk9NICVzIiwgcm93KDFMKSk7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCBtYXgod3JpdGV0aW1lKGZzKSkgRlJPTSAlcyIsIHJvdygxMEwpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIG1pbihtYXh3cml0ZXRpbWUoZnMpKSBGUk9NICVzIiwgcm93KDFMKSk7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCBtYXgobWF4d3JpdGV0aW1lKGZzKSkgRlJPTSAlcyIsIHJvdygxMEwpKTsKKworICAgICAgICAvLyBNdWx0aS1jZWxsIGNvbGxlY3Rpb24KKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIG1pbihzKSBGUk9NICVzIiwgcm93KHNldCgxLCAyLCAzKSkpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgbWF4KHMpIEZST00gJXMiLCByb3coc2V0KDEwLCAyMCwgMzApKSk7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCB3cml0ZXRpbWUocykgRlJPTSAlcyIsIHJvdyhsaXN0KDEwTCwgMjBMLCAyMEwpKSwgcm93KGxpc3QoMUwsIDJMLCAyTCkpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIG1pbih3cml0ZXRpbWUocykpIEZST00gJXMiLCByb3cobGlzdCgxTCwgMkwsIDJMKSkpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgbWF4KHdyaXRldGltZShzKSkgRlJPTSAlcyIsIHJvdyhsaXN0KDEwTCwgMjBMLCAyMEwpKSk7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCBtaW4obWF4d3JpdGV0aW1lKHMpKSBGUk9NICVzIiwgcm93KDJMKSk7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCBtYXgobWF4d3JpdGV0aW1lKHMpKSBGUk9NICVzIiwgcm93KDIwTCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8SW50ZWdlcj4gdHRscyhJbnRlZ2VyLi4uIGEpCisgICAgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChhKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PExvbmc+IHRpbWVzdGFtcHMoTG9uZy4uLiBhKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoYSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFJvd3MoU3RyaW5nIHF1ZXJ5LCBPYmplY3RbXS4uLiByb3dzKSB0aHJvd3MgVGhyb3dhYmxlCkBAIC0xOTgsMjMgKzExMDcsMzQgQEAKICAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKGNvbHVtbiwgbnVsbCwgdGltZXN0YW1wLCB0dGwpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoU3RyaW5nIGNvbHVtbiwgTGlzdDxMb25nPiB0aW1lc3RhbXBzLCBMaXN0PEludGVnZXI+IHR0bHMpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTChjb2x1bW4sIG51bGwsIHRpbWVzdGFtcHMsIHR0bHMpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoU3RyaW5nIGNvbHVtbiwgU3RyaW5nIHdoZXJlLCBMb25nIHRpbWVzdGFtcCwgSW50ZWdlciB0dGwpCiAgICAgdGhyb3dzIFRocm93YWJsZQogICAgIHsKICAgICAgICAgd2hlcmUgPSB3aGVyZSA9PSBudWxsID8gIiIgOiAiIFdIRVJFICIgKyB3aGVyZTsKIAogICAgICAgICAvLyBWZXJpZnkgd3JpdGUgdGltZQotICAgICAgICBTdHJpbmcgd3JpdGV0aW1lUXVlcnkgPSBTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgV1JJVEVUSU1FKCVzKSBGUk9NICUlcyAlcyIsIGNvbHVtbiwgd2hlcmUpOwotICAgICAgICBhc3NlcnRSb3dzKHdyaXRldGltZVF1ZXJ5LCByb3codGltZXN0YW1wKSk7CisgICAgICAgIGFzc2VydFJvd3MoZm9ybWF0KCJTRUxFQ1QgV1JJVEVUSU1FKCVzKSBGUk9NICUlcyAlcyIsIGNvbHVtbiwgd2hlcmUpLCByb3codGltZXN0YW1wKSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IG1heCB3cml0ZSB0aW1lCisgICAgICAgIGFzc2VydFJvd3MoZm9ybWF0KCJTRUxFQ1QgTUFYV1JJVEVUSU1FKCVzKSBGUk9NICUlcyAlcyIsIGNvbHVtbiwgd2hlcmUpLCByb3codGltZXN0YW1wKSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHdyaXRlIHRpbWUgYW5kIG1heCB3cml0ZSB0aW1lIHRvZ2V0aGVyCisgICAgICAgIGFzc2VydFJvd3MoZm9ybWF0KCJTRUxFQ1QgV1JJVEVUSU1FKCVzKSwgTUFYV1JJVEVUSU1FKCVzKSBGUk9NICUlcyAlcyIsIGNvbHVtbiwgY29sdW1uLCB3aGVyZSksCisgICAgICAgICAgICAgICAgICAgcm93KHRpbWVzdGFtcCwgdGltZXN0YW1wKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHR0bAotICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IHJzID0gZXhlY3V0ZShTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgVFRMKCVzKSBGUk9NICUlcyAlcyIsIGNvbHVtbiwgd2hlcmUpKTsKKyAgICAgICAgVW50eXBlZFJlc3VsdFNldCBycyA9IGV4ZWN1dGUoZm9ybWF0KCJTRUxFQ1QgVFRMKCVzKSBGUk9NICUlcyAlcyIsIGNvbHVtbiwgd2hlcmUpKTsKICAgICAgICAgYXNzZXJ0Um93Q291bnQocnMsIDEpOwogICAgICAgICBVbnR5cGVkUmVzdWx0U2V0LlJvdyByb3cgPSBycy5vbmUoKTsKLSAgICAgICAgU3RyaW5nIHR0bENvbHVtbiA9IFN0cmluZy5mb3JtYXQoInR0bCglcykiLCBjb2x1bW4pOworICAgICAgICBTdHJpbmcgdHRsQ29sdW1uID0gZm9ybWF0KCJ0dGwoJXMpIiwgY29sdW1uKTsKICAgICAgICAgaWYgKHR0bCA9PSBudWxsKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnRUVEwodHRsLCBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHJvdy5oYXModHRsQ29sdW1uKSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CkBAIC0yMjIsNiArMTE0Miw0NSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFdyaXRldGltZUFuZFRUTChTdHJpbmcgY29sdW1uLCBTdHJpbmcgd2hlcmUsIExpc3Q8TG9uZz4gdGltZXN0YW1wcywgTGlzdDxJbnRlZ2VyPiB0dGxzKQorICAgIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHdoZXJlID0gd2hlcmUgPT0gbnVsbCA/ICIiIDogIiBXSEVSRSAiICsgd2hlcmU7CisKKyAgICAgICAgLy8gVmVyaWZ5IHdyaXRlIHRpbWUKKyAgICAgICAgYXNzZXJ0Um93cyhmb3JtYXQoIlNFTEVDVCBXUklURVRJTUUoJXMpIEZST00gJSVzICVzIiwgY29sdW1uLCB3aGVyZSksIHJvdyh0aW1lc3RhbXBzKSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IG1heCB3cml0ZSB0aW1lCisgICAgICAgIExvbmcgbWF4VGltZXN0YW1wID0gdGltZXN0YW1wcy5zdHJlYW0oKS5maWx0ZXIoT2JqZWN0czo6bm9uTnVsbCkubWF4KExvbmc6OmNvbXBhcmUpLm9yRWxzZShudWxsKTsKKyAgICAgICAgYXNzZXJ0Um93cyhmb3JtYXQoIlNFTEVDVCBNQVhXUklURVRJTUUoJXMpIEZST00gJSVzICVzIiwgY29sdW1uLCB3aGVyZSksIHJvdyhtYXhUaW1lc3RhbXApKTsKKworICAgICAgICAvLyBWZXJpZnkgd3JpdGUgdGltZSBhbmQgbWF4IHdyaXRlIHRpbWUgdG9nZXRoZXIKKyAgICAgICAgYXNzZXJ0Um93cyhmb3JtYXQoIlNFTEVDVCBXUklURVRJTUUoJXMpLCBNQVhXUklURVRJTUUoJXMpIEZST00gJSVzICVzIiwgY29sdW1uLCBjb2x1bW4sIHdoZXJlKSwKKyAgICAgICAgICAgICAgICAgICByb3codGltZXN0YW1wcywgbWF4VGltZXN0YW1wKSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHR0bAorICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IHJzID0gZXhlY3V0ZShmb3JtYXQoIlNFTEVDVCBUVEwoJXMpIEZST00gJSVzICVzIiwgY29sdW1uLCB3aGVyZSkpOworICAgICAgICBhc3NlcnRSb3dDb3VudChycywgMSk7CisgICAgICAgIFVudHlwZWRSZXN1bHRTZXQuUm93IHJvdyA9IHJzLm9uZSgpOworICAgICAgICBTdHJpbmcgdHRsQ29sdW1uID0gZm9ybWF0KCJ0dGwoJXMpIiwgY29sdW1uKTsKKyAgICAgICAgaWYgKHR0bHMgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0RmFsc2Uocm93Lmhhcyh0dGxDb2x1bW4pKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIExpc3Q8SW50ZWdlcj4gYWN0dWFsVFRMcyA9IHJvdy5nZXRMaXN0KHR0bENvbHVtbiwgSW50MzJUeXBlLmluc3RhbmNlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0dGxzLnNpemUoKSwgYWN0dWFsVFRMcy5zaXplKCkpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjdHVhbFRUTHMuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW50ZWdlciBleHBlY3RlZFRUTCA9IHR0bHMuZ2V0KGkpOworICAgICAgICAgICAgICAgIEludGVnZXIgYWN0dWFsVFRMID0gYWN0dWFsVFRMcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VFRMKGV4cGVjdGVkVFRMLCBhY3R1YWxUVEwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogU2luY2UgdGhlIHJldHVybmVkIFRUTCBpcyB0aGUgcmVtYWluaW5nIHNlY29uZHMgc2luY2UgbGFzdCB1cGRhdGUsIGl0IGNvdWxkIGJlIGxvd2VyIHRoYW4gdGhlCiAgICAgICogc3BlY2lmaWVkIFRUTCBkZXBlbmRpbmcgb24gdGhlIHRlc3QgZXhlY3V0aW9uIHRpbWUsIHNlIHdlIGFsbG93IHVwIHRvIG9uZS1taW51dGUgZGlmZmVyZW5jZQpAQCAtMjQyLDIzICsxMjAxLDQyIEBACiAKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0SW52YWxpZFByaW1hcnlLZXlTZWxlY3Rpb24oU3RyaW5nIGNvbHVtbikgdGhyb3dzIFRocm93YWJsZQogICAgIHsKLSAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZSgiQ2Fubm90IHVzZSBzZWxlY3Rpb24gZnVuY3Rpb24gd3JpdGVUaW1lIG9uIFBSSU1BUlkgS0VZIHBhcnQgIiArIGNvbHVtbiwKKyAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZSgiQ2Fubm90IHVzZSBzZWxlY3Rpb24gZnVuY3Rpb24gd3JpdGV0aW1lIG9uIFBSSU1BUlkgS0VZIHBhcnQgIiArIGNvbHVtbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgV1JJVEVUSU1FKCVzKSBGUk9NICUlcyIsIGNvbHVtbikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiU0VMRUNUIFdSSVRFVElNRSglcykgRlJPTSAlJXMiLCBjb2x1bW4pKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZSgiQ2Fubm90IHVzZSBzZWxlY3Rpb24gZnVuY3Rpb24gbWF4d3JpdGV0aW1lIG9uIFBSSU1BUlkgS0VZIHBhcnQgIiArIGNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIlNFTEVDVCBNQVhXUklURVRJTUUoJXMpIEZST00gJSVzIiwgY29sdW1uKSk7CiAgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoIkNhbm5vdCB1c2Ugc2VsZWN0aW9uIGZ1bmN0aW9uIHR0bCBvbiBQUklNQVJZIEtFWSBwYXJ0ICIgKyBjb2x1bW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiU0VMRUNUIFRUTCglcykgRlJPTSAlJXMiLCBjb2x1bW4pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIlNFTEVDVCBUVEwoJXMpIEZST00gJSVzIiwgY29sdW1uKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydEludmFsaWRNdWx0aUNlbGxTZWxlY3Rpb24oU3RyaW5nIGNvbHVtbiwgYm9vbGVhbiBpc0NvbGxlY3Rpb24pIHRocm93cyBUaHJvd2FibGUKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0SW52YWxpZExpc3RFbGVtZW50U2VsZWN0aW9uKFN0cmluZyBjb2x1bW4sIFN0cmluZyBsaXN0KSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGZvcm1hdCgiQ2Fubm90IHVzZSBzZWxlY3Rpb24gZnVuY3Rpb24gJSVzIG9uIG5vbi1mcm96ZW4gJXMgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NvbGxlY3Rpb24gPyAiY29sbGVjdGlvbiIgOiAiVURUIiwgY29sdW1uKTsKLSAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZShmb3JtYXQobWVzc2FnZSwgIndyaXRlVGltZSIpLAorICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGZvcm1hdCgiRWxlbWVudCBzZWxlY3Rpb24gaXMgb25seSBhbGxvd2VkIG9uIHNldHMgYW5kIG1hcHMsIGJ1dCAlcyBpcyBhIGxpc3QiLCBsaXN0KTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZShtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlNFTEVDVCBXUklURVRJTUUoJXMpIEZST00gJSVzIiwgY29sdW1uKSk7Ci0gICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoZm9ybWF0KG1lc3NhZ2UsICJ0dGwiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIlNFTEVDVCBXUklURVRJTUUoJXMpIEZST00gJSVzIiwgY29sdW1uKSk7CisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UobWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgVFRMKCVzKSBGUk9NICUlcyIsIGNvbHVtbikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiU0VMRUNUIE1BWFdSSVRFVElNRSglcykgRlJPTSAlJXMiLCBjb2x1bW4pKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZShtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiU0VMRUNUIFRUTCglcykgRlJPTSAlJXMiLCBjb2x1bW4pKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0SW52YWxpZExpc3RTbGljZVNlbGVjdGlvbihTdHJpbmcgY29sdW1uLCBTdHJpbmcgbGlzdCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBmb3JtYXQoIlNsaWNlIHNlbGVjdGlvbiBpcyBvbmx5IGFsbG93ZWQgb24gc2V0cyBhbmQgbWFwcywgYnV0ICVzIGlzIGEgbGlzdCIsIGxpc3QpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJTRUxFQ1QgV1JJVEVUSU1FKCVzKSBGUk9NICUlcyIsIGNvbHVtbikpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJTRUxFQ1QgTUFYV1JJVEVUSU1FKCVzKSBGUk9NICUlcyIsIGNvbHVtbikpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJTRUxFQ1QgVFRMKCVzKSBGUk9NICUlcyIsIGNvbHVtbikpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vbWlzY2VsbGFuZW91cy9PdmVyZmxvd1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vbWlzY2VsbGFuZW91cy9PdmVyZmxvd1Rlc3QuamF2YQppbmRleCAwZDllMDQzLi45MDkyZjk0IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL21pc2NlbGxhbmVvdXMvT3ZlcmZsb3dUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9taXNjZWxsYW5lb3VzL092ZXJmbG93VGVzdC5qYXZhCkBAIC0xNzAsOCArMTcwLDggQEAKICAgICB7CiAgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCBpIHZhcmludCwgYiBibG9iKSIpOwogCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBpLCBiKSBWQUxVRVMgKDAsIGJsb2JBc1ZhcmludChiaWdpbnRBc0Jsb2IoMykpLCB0ZXh0QXNCbG9iKCdmb29iYXInKSkiKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaSwgYmxvYkFzVGV4dChiKSBGUk9NICVzIFdIRVJFIGsgPSAwIiksCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBpLCBiKSBWQUxVRVMgKDAsIGJsb2JfYXNfdmFyaW50KGJpZ2ludF9hc19ibG9iKDMpKSwgdGV4dF9hc19ibG9iKCdmb29iYXInKSkiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaSwgYmxvYl9hc190ZXh0KGIpIEZST00gJXMgV0hFUkUgayA9IDAiKSwKICAgICAgICAgICAgICAgICAgICByb3coQmlnSW50ZWdlci52YWx1ZU9mKDMpLCAiZm9vYmFyIikpOwogICAgIH0KIApAQCAtMjMwLDcgKzIzMCw3IEBACiAgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB0IHRpbWV1dWlkLCkiKTsKIAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaykgVkFMVUVTICgwKSIpOwotICAgICAgICBPYmplY3RbXVtdIHJvd3MgPSBnZXRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBkYXRlT2YodCkgRlJPTSAlcyBXSEVSRSBrPTAiKSk7CisgICAgICAgIE9iamVjdFtdW10gcm93cyA9IGdldFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHRvX3RpbWVzdGFtcCh0KSBGUk9NICVzIFdIRVJFIGs9MCIpKTsKICAgICAgICAgYXNzZXJ0TnVsbChyb3dzWzBdWzBdKTsKICAgICB9CiAKQEAgLTI4OCw5ICsyODgsOSBAQAogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdiBpbnQpIik7CiAKICAgICAgICAgLy8gIEEgYmxvYiB0aGF0IGlzIG5vdCA0IGJ5dGVzIHNob3VsZCBiZSByZWplY3RlZAotICAgICAgICBhc3NlcnRJbnZhbGlkKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgwLCBibG9iQXNJbnQoMHgwMSkpIik7CisgICAgICAgIGFzc2VydEludmFsaWQoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDAsIGJsb2JfYXNfaW50KDB4MDEpKSIpOwogCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDAsIGJsb2JBc0ludCgweDAwMDAwMDAxKSkiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHYpIFZBTFVFUyAoMCwgYmxvYl9hc19pbnQoMHgwMDAwMDAwMSkpIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgic2VsZWN0IHYgZnJvbSAlcyB3aGVyZSBrPTAiKSwgcm93KDEpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL21pc2NlbGxhbmVvdXMvU1NUYWJsZXNJdGVyYXRlZFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vbWlzY2VsbGFuZW91cy9TU1RhYmxlc0l0ZXJhdGVkVGVzdC5qYXZhCmluZGV4IGZmMGU1NDYuLmExMjIzYzEgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vbWlzY2VsbGFuZW91cy9TU1RhYmxlc0l0ZXJhdGVkVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vbWlzY2VsbGFuZW91cy9TU1RhYmxlc0l0ZXJhdGVkVGVzdC5qYXZhCkBAIC0yMCwxMiArMjAsMTYgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnZhbGlkYXRpb24ubWlzY2VsbGFuZW91czsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5VbnR5cGVkUmVzdWx0U2V0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNsZWFyYWJsZUhpc3RvZ3JhbTsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKQEAgLTUwLDYgKzU0LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICBudW1TU1RhYmxlc0l0ZXJhdGVkKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUFuZENoZWNrUmFuZ2VRdWVyeShTdHJpbmcgcXVlcnksIGludCBudW1TU1RhYmxlcywgT2JqZWN0W10uLi4gcm93cykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgbG9nZ2VyLmluZm8oIkV4ZWN1dGluZyBxdWVyeToge30gd2l0aCBwYXJhbWV0ZXJzOiB7fSIsIHF1ZXJ5LCBBcnJheXMudG9TdHJpbmcocm93cykpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoS0VZU1BBQ0VfUEVSX1RFU1QpOworCisgICAgICAgICgoQ2xlYXJhYmxlSGlzdG9ncmFtKSBjZnMubWV0cmljLnNzdGFibGVzUGVyUmFuZ2VSZWFkSGlzdG9ncmFtLmNmKS5jbGVhcigpOyAvLyByZXNldHMgY291bnRzCisKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKHF1ZXJ5KSwgcm93cyk7CisKKyAgICAgICAgbG9uZyBudW1TU1RhYmxlc0l0ZXJhdGVkID0gY2ZzLm1ldHJpYy5zc3RhYmxlc1BlclJhbmdlUmVhZEhpc3RvZ3JhbS5jZi5nZXRTbmFwc2hvdCgpLmdldE1heCgpOyAvLyBtYXggc3N0YWJsZXMgcmVhZAorICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiRXhwZWN0ZWQgJWQgc3N0YWJsZXMgaXRlcmF0ZWQgYnV0IGdvdCAlZCBpbnN0ZWFkLCB3aXRoICVkIGxpdmUgc3N0YWJsZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TU1RhYmxlcywgbnVtU1NUYWJsZXNJdGVyYXRlZCwgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSksCisgICAgICAgICAgICAgICAgICAgICBudW1TU1RhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgIG51bVNTVGFibGVzSXRlcmF0ZWQpOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlVGFibGUoU3RyaW5nIHF1ZXJ5KQogICAgIHsKQEAgLTU5LDcgKzc5LDcgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgVW50eXBlZFJlc3VsdFNldCBleGVjdXRlKFN0cmluZyBxdWVyeSwgT2JqZWN0Li4uIHZhbHVlcykgdGhyb3dzIFRocm93YWJsZQorICAgIHByb3RlY3RlZCBVbnR5cGVkUmVzdWx0U2V0IGV4ZWN1dGUoU3RyaW5nIHF1ZXJ5LCBPYmplY3QuLi4gdmFsdWVzKQogICAgIHsKICAgICAgICAgcmV0dXJuIGV4ZWN1dGVGb3JtYXR0ZWRRdWVyeShmb3JtYXRRdWVyeShLRVlTUEFDRV9QRVJfVEVTVCwgcXVlcnkpLCB2YWx1ZXMpOwogICAgIH0KQEAgLTM1NCw3ICszNzQsNyBAQAogICAgIHByaXZhdGUgdm9pZCB0ZXN0RGVsZXRpb25PbkluZGV4ZWRTU1RhYmxlREVTQyhib29sZWFuIGRlbGV0ZVdpdGhSYW5nZSkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKICAgICAgICAgLy8gcmVkdWNlIHRoZSBjb2x1bW4gaW5kZXggc2l6ZSBzbyB0aGF0IGNvbHVtbnMgZ2V0IGluZGV4ZWQgZHVyaW5nIGZsdXNoCi0gICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleFNpemUoMSk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleFNpemVJbktpQigxKTsKIAogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChpZCBpbnQsIGNvbCBpbnQsIHZhbCB0ZXh0LCBQUklNQVJZIEtFWSAoaWQsIGNvbCkpIFdJVEggQ0xVU1RFUklORyBPUkRFUiBCWSAoY29sIERFU0MpIik7CiAKQEAgLTQwMiw3ICs0MjIsNyBAQAogICAgIHByaXZhdGUgdm9pZCB0ZXN0RGVsZXRpb25PbkluZGV4ZWRTU1RhYmxlQVNDKGJvb2xlYW4gZGVsZXRlV2l0aFJhbmdlKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICAvLyByZWR1Y2UgdGhlIGNvbHVtbiBpbmRleCBzaXplIHNvIHRoYXQgY29sdW1ucyBnZXQgaW5kZXhlZCBkdXJpbmcgZmx1c2gKLSAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4U2l6ZSgxKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4U2l6ZUluS2lCKDEpOwogCiAgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGlkIGludCwgY29sIGludCwgdmFsIHRleHQsIFBSSU1BUlkgS0VZIChpZCwgY29sKSkgV0lUSCBDTFVTVEVSSU5HIE9SREVSIEJZIChjb2wgQVNDKSIpOwogCkBAIC00MzEsMTMgKzQ1MSwxOSBAQAogICAgICAgICB9CiAgICAgICAgIGZsdXNoKCk7CiAKKyAgICAgICAgLy8gVGhlIGNvZGUgaGFzIHRvIHJlYWQgdGhlIDFzdCBhbmQgM3JkIHNzdGFibGVzIHRvIHNlZSB0aGF0IGV2ZXJ5dGhpbmcgYmVmb3JlIHRoZSAybmQgc3N0YWJsZSBpcyBkZWxldGVkLCBhbmQKKyAgICAgICAgLy8gb3ZlcmFsbCBoYXMgdG8gcmVhZCB0aGUgMyBzc3RhYmxlcwogICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9MSBMSU1JVCAxIiwgMywgcm93KDEsIDEwMDEsICIxMDAxIikpOwogICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9MSBMSU1JVCAyIiwgMywgcm93KDEsIDEwMDEsICIxMDAxIiksIHJvdygxLCAxMDAyLCAiMTAwMiIpKTsKIAogICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9MSIsIDMsIGFsbFJvd3MpOwotICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9MSBBTkQgY29sID4gMTAwMCBMSU1JVCAxIiwgMiwgcm93KDEsIDEwMDEsICIxMDAxIikpOworCisgICAgICAgIC8vIFRoZSAxc3QgYW5kIDNyZCBzc3RhYmxlcyBoYXZlIGRhdGEgb25seSB1cCB0byAxMDAwLCBzbyB0aGV5IHdpbGwgYmUgc2tpcHBlZAorICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9MSBBTkQgY29sID4gMTAwMCBMSU1JVCAxIiwgMSwgcm93KDEsIDEwMDEsICIxMDAxIikpOworICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9MSBBTkQgY29sID4gMTAwMCIsIDEsIGFsbFJvd3MpOworCisgICAgICAgIC8vIFRoZSBjb25kaXRpb24gbWFrZXMgbm8gZGlmZmVyZW5jZSB0byB0aGUgY29kZSwgYW5kIGFsbCAzIHNzdGFibGVzIGhhdmUgdG8gcmVhZAogICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9MSBBTkQgY29sIDw9IDIwMDAgTElNSVQgMSIsIDMsIHJvdygxLCAxMDAxLCAiMTAwMSIpKTsKLSAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGlkPTEgQU5EIGNvbCA+IDEwMDAiLCAyLCBhbGxSb3dzKTsKICAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGlkPTEgQU5EIGNvbCA8PSAyMDAwIiwgMywgYWxsUm93cyk7CiAgICAgfQogCkBAIC00NTEsNyArNDc3LDcgQEAKICAgICBwcml2YXRlIHZvaWQgdGVzdERlbGV0aW9uT25PdmVybGFwcGluZ0luZGV4ZWRTU1RhYmxlKGJvb2xlYW4gZGVsZXRlV2l0aFJhbmdlKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICAvLyByZWR1Y2UgdGhlIGNvbHVtbiBpbmRleCBzaXplIHNvIHRoYXQgY29sdW1ucyBnZXQgaW5kZXhlZCBkdXJpbmcgZmx1c2gKLSAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4U2l6ZSgxKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4U2l6ZUluS2lCKDEpOwogCiAgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGlkIGludCwgY29sIGludCwgdmFsMSB0ZXh0LCB2YWwyIHRleHQsIFBSSU1BUlkgS0VZIChpZCwgY29sKSkgV0lUSCBDTFVTVEVSSU5HIE9SREVSIEJZIChjb2wgQVNDKSIpOwogCkBAIC01MTUsMTQgKzU0MSwzMCBAQAogICAgICAgICAgICAgICAgIGFsbFJvd3NbaWR4XSA9IHJvdygxLCBpLCBJbnRlZ2VyLnRvU3RyaW5nKGkpLCBJbnRlZ2VyLnRvU3RyaW5nKGkpKTsKICAgICAgICAgfQogCi0gICAgICAgIGV4ZWN1dGVBbmRDaGVjaygiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBpZD0xIExJTUlUIDEiLCAyLCByb3coMSwgMSwgIjEiLCAiMSIpKTsKLSAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGlkPTEgTElNSVQgMiIsIDIsIHJvdygxLCAxLCAiMSIsICIxIiksIHJvdygxLCAyLCAiMiIsIG51bGwpKTsKKyAgICAgICAgLy8gVGhlIDUwMHRoIGZpcnN0IHJvd3MgYXJlIGluIHRoZSBmaXJzdCBzc3RhYmxlIChhbmQgdGhlcmUgaXMgbm8gcGFydGl0aW9uIGRlbGV0aW9uL3N0YXRpYyByb3cpLCBzbyB0aGUgJ2xvd2VyCisgICAgICAgIC8vIGJvdW5kJyBvcHRpbWl6YXRpb24gd2lsbCBraWNrIGluIGFuZCB3ZSdsbCBvbmx5IHJlYWQgdGhlIDFzdCBzc3RhYmxlLgorICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9MSBMSU1JVCAxIiwgMSwgcm93KDEsIDEsICIxIiwgIjEiKSk7CisgICAgICAgIGV4ZWN1dGVBbmRDaGVjaygiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBpZD0xIExJTUlUIDIiLCAxLCByb3coMSwgMSwgIjEiLCAiMSIpLCByb3coMSwgMiwgIjIiLCBudWxsKSk7CiAKKyAgICAgICAgLy8gR2V0dGluZyBldmVyeXRoaW5nIG9idmlvdXNseSByZXF1aXJlcyByZWFkaW5nIGJvdGggc3N0YWJsZXMKICAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGlkPTEiLCAyLCBhbGxSb3dzKTsKKworICAgICAgICAvLyBUaGUgJ2xvd2VyIGJvdW5kJyBvcHRpbWl6YXRpb24gZG9uJ3QgaGVscCB1cyBiZWNhdXNlIHdoaWxlIHRoZSByb3cgdG8gZmV0Y2ggaXMgaW4gdGhlIDFzdCBzc3RhYmxlLCB0aGUgbG93ZXIKKyAgICAgICAgLy8gYm91bmQgZm9yIHRoZSAybmQgc3N0YWJsZSBpcyA1MDEsIHdoaWNoIGlzIGxvd2VyIHRoYW4gMTAwMC4KICAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGlkPTEgQU5EIGNvbCA+IDEwMDAgTElNSVQgMSIsIDIsIHJvdygxLCAxMDAxLCAiMTAwMSIsICIxMDAxIikpOwotICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9MSBBTkQgY29sIDw9IDIwMDAgTElNSVQgMSIsIDIsIHJvdygxLCAxLCAiMSIsICIxIikpOworCisgICAgICAgIC8vIFNvbWV3aGF0IHNpbWlsYXIgdG8gdGhlIHByZXZpb3VzIG9uZTogdGhlIHJvdyBpcyBpbiB0aCAybmQgc3N0YWJsZSBpbiB0aGlzIGNhc2UsIGJ1dCBhcyB0aGUgbG93ZXIgYm91bmQgZm9yCisgICAgICAgIC8vIHRoZSBmaXJzdCBzc3RhYmxlIGlzIDEsIHRoaXMgZG9lc24ndCBoZWxwLgogICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9MSBBTkQgY29sID4gNTAwIExJTUlUIDEiLCAyLCByb3coMSwgNzUxLCAiNzUxIiwgIjc1MSIpKTsKLSAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGlkPTEgQU5EIGNvbCA8PSA1MDAgTElNSVQgMSIsIDIsIHJvdygxLCAxLCAiMSIsICIxIikpOworCisgICAgICAgIC8vIFRoZSAnY29sIDw9ID8nIGNvbmRpdGlvbiBpbiBib3RoIHF1ZXJpZXMgZG9lc24ndCBpbXBhY3QgdGhlIHJlYWQgcGF0aCwgd2hpY2ggY2FuIHN0aWxsIG1ha2UgdXNlIG9mIHRoZSBsb3dlcgorICAgICAgICAvLyBib3VuZCBvcHRpbWl6YXRpb24gYW5kIHJlYWQgb25seSB0aGUgZmlyc3Qgc3N0YWJsZS4KKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGlkPTEgQU5EIGNvbCA8PSAyMDAwIExJTUlUIDEiLCAxLCByb3coMSwgMSwgIjEiLCAiMSIpKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGlkPTEgQU5EIGNvbCA8PSA1MDAgTElNSVQgMSIsIDEsIHJvdygxLCAxLCAiMSIsICIxIikpOworCisgICAgICAgIC8vIE1ha2luZyBzdXJlIHRoZSAnbG93ZXIgYm91bmQnIG9wdGltaXphdGlvbiBhbHNvIHdvcmsgaW4gcmV2ZXJzZSBxdWVyaWVzIChpbiB3aGljaCBpdCdzIG1vcmUgb2YgYSAndXBwZXIKKyAgICAgICAgLy8gYm91bmQnIG9wdGltaXphdGlvbikuCisgICAgICAgIGV4ZWN1dGVBbmRDaGVjaygiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBpZD0xIEFORCBjb2wgPD0gMjAwMCBPUkRFUiBCWSBjb2wgREVTQyBMSU1JVCAxIiwgMSwgcm93KDEsIDIwMDAsICIyMDAwIiwgbnVsbCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC05OTYsNyArMTAzOCw3IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFjdEFuZE5vbkNvbXBhY3RUYWJsZVdpdGhDb3VudGVyKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKLSAgICAgICAgZm9yIChTdHJpbmcgd2l0aCA6IG5ldyBTdHJpbmdbXXsiIiwgIiBXSVRIIENPTVBBQ1QgU1RPUkFHRSJ9KQorICAgICAgICBmb3IgKFN0cmluZyB3aXRoIDogbmV3IFN0cmluZ1tdeyAiIiwgIiBXSVRIIENPTVBBQ1QgU1RPUkFHRSIgfSkKICAgICAgICAgewogICAgICAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjIGludCwgY291bnQgY291bnRlciwgUFJJTUFSWSBLRVkocGssIGMpKSIgKyB3aXRoKTsKIApAQCAtMTAzOCw3ICsxMDgwLDcgQEAKICAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgcywgdiBGUk9NICVzIFdIRVJFIHBrID0gMyBBTkQgYyA9IDMiLCAzLCByb3coMywgc2V0KDEpKSk7CiAgICAgICAgIGV4ZWN1dGVBbmRDaGVjaygiU0VMRUNUIHYgRlJPTSAlcyBXSEVSRSBwayA9IDEgQU5EIGMgPSAxIiwgMywgcm93KHNldCgzKSkpOwogICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCB2IEZST00gJXMgV0hFUkUgcGsgPSAyIEFORCBjID0gMSIsIDIsIHJvdyhzZXQoMykpKTsKLSAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgdiBGUk9NICVzIFdIRVJFIHBrID0gMyBBTkQgYyA9IDMiLCAzLCByb3coc2V0KDEpKSk7CisgICAgICAgIGV4ZWN1dGVBbmRDaGVjaygiU0VMRUNUIHYgRlJPTSAlcyBXSEVSRSBwayA9IDMgQU5EIGMgPSAzIiwgMSwgcm93KHNldCgxKSkpOwogICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCBzIEZST00gJXMgV0hFUkUgcGsgPSAxIiwgMywgcm93KChJbnRlZ2VyKSBudWxsKSk7CiAgICAgICAgIGV4ZWN1dGVBbmRDaGVjaygiU0VMRUNUIHMgRlJPTSAlcyBXSEVSRSBwayA9IDIiLCAyLCByb3coMSksIHJvdygxKSk7CiAgICAgICAgIGV4ZWN1dGVBbmRDaGVjaygiU0VMRUNUIERJU1RJTkNUIHMgRlJPTSAlcyBXSEVSRSBwayA9IDIiLCAyLCByb3coMSkpOwpAQCAtMTA4Nyw3ICsxMTI5LDcgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYWN0QW5kTm9uQ29tcGFjdFRhYmxlV2l0aFBhcnRpdGlvblRvbWJzdG9uZXMoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewotICAgICAgICBmb3IgKEJvb2xlYW4gY29tcGFjdCAgOiBuZXcgQm9vbGVhbltdIHtCb29sZWFuLkZBTFNFLCBCb29sZWFuLlRSVUV9KQorICAgICAgICBmb3IgKEJvb2xlYW4gY29tcGFjdCA6IG5ldyBCb29sZWFuW117IEJvb2xlYW4uRkFMU0UsIEJvb2xlYW4uVFJVRSB9KQogICAgICAgICB7CiAgICAgICAgICAgICBTdHJpbmcgd2l0aCA9IGNvbXBhY3QgPyAiIFdJVEggQ09NUEFDVCBTVE9SQUdFIiA6ICIiOwogICAgICAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50IFBSSU1BUlkgS0VZLCB2MSBpbnQsIHYyIGludCkiICsgd2l0aCk7CkBAIC0xNjQyLDQgKzE2ODQsMTU3IEBACiAgICAgICAgIGV4ZWN1dGVBbmRDaGVjaygiU0VMRUNUIHYxIEZST00gJXMgV0hFUkUgcGsgPSA1IiwgMSk7CiAgICAgICAgIGV4ZWN1dGVBbmRDaGVjaygiU0VMRUNUIHYyIEZST00gJXMgV0hFUkUgcGsgPSA1IiwgMSk7CiAgICAgfQotfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2tpcHBpbmdCeVNsaWNlSW5TaW5nbGVQYXJ0aXRpb25SZWFkcygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgYyBpbnQsIHYgaW50LCBQUklNQVJZIEtFWShwaywgYykpIik7CisKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwgMSwgMSwgMSk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIDEsIDIsIDIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCAxLCAzLCAzKTsKKyAgICAgICAgZmx1c2goKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZShLRVlTUEFDRV9QRVJfVEVTVCkuZ2V0TGl2ZVNTVGFibGVzKCkuc2l6ZSgpKTsKKworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCAxLCAyLCA0KTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwgMSwgMywgNSk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIDEsIDQsIDYpOworICAgICAgICBmbHVzaCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKEtFWVNQQUNFX1BFUl9URVNUKS5nZXRMaXZlU1NUYWJsZXMoKS5zaXplKCkpOworCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIDEsIDMsIDcpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCAxLCA0LCA4KTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwgMSwgNSwgOSk7CisgICAgICAgIGZsdXNoKCk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoS0VZU1BBQ0VfUEVSX1RFU1QpLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CisKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwgMSwgNCwgMTApOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCAxLCA1LCAxMSk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIDEsIDYsIDEyKTsKKyAgICAgICAgZmx1c2goKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZShLRVlTUEFDRV9QRVJfVEVTVCkuZ2V0TGl2ZVNTVGFibGVzKCkuc2l6ZSgpKTsKKworICAgICAgICAvLyBwb2ludCBxdWVyeSAtIHRlc3Qgd2hldGhlciBzc3RhYmxlcyBhcmUgc2tpcHBlZCBkdWUgdG8gbm90IGNvdmVyaW5nIHRoZSByZXF1ZXN0ZWQgc2xpY2UKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgYyA9IDAiLCAwKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgYyA9IDEiLCAxLCByb3coMSwgMSwgMSkpOworICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSAxIEFORCBjID0gMiIsIDIsIHJvdygxLCAyLCA0KSk7CisgICAgICAgIGV4ZWN1dGVBbmRDaGVjaygiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IDEgQU5EIGMgPSAzIiwgMywgcm93KDEsIDMsIDcpKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgYyA9IDQiLCAzLCByb3coMSwgNCwgMTApKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgYyA9IDUiLCAyLCByb3coMSwgNSwgMTEpKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgYyA9IDYiLCAxLCByb3coMSwgNiwgMTIpKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgYyA9IDciLCAwKTsKKworICAgICAgICAvLyByYW5nZSBxdWVyeSAtIHRlc3Qgd2hldGhlciBzc3RhYmxlcyBhcmUgc2tpcHBlZCBkdWUgdG8gbm90IGNvdmVyaW5nIHRoZSByZXF1ZXN0ZSBzbGljZQorICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSAxIEFORCBjID4gLTEwIEFORCBjIDw9IDAiLCAwKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgYyA+IC0xMCBBTkQgYyA8IDEiLCAwKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgYyA+IC0xMCBBTkQgYyA8PSAxIiwgMSwgcm93KDEsIDEsIDEpKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgYyA+IDEgQU5EIGMgPCAzIiwgMiwgcm93KDEsIDIsIDQpKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgYyA+PSA2IiwgMSwgcm93KDEsIDYsIDEyKSk7CisgICAgICAgIGV4ZWN1dGVBbmRDaGVjaygiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IDEgQU5EIGMgPiA2IiwgMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2tpcHBpbmdCeVNsaWNlSW5QYXJ0aXRpb25SYW5nZVJlYWRzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjIGludCwgdiBpbnQsIFBSSU1BUlkgS0VZKHBrLCBjKSkiKTsKKworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCAxLCAxLCAxKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwgMSwgMiwgMik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIDEsIDMsIDMpOworICAgICAgICBmbHVzaCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKEtFWVNQQUNFX1BFUl9URVNUKS5nZXRMaXZlU1NUYWJsZXMoKS5zaXplKCkpOworCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIDEsIDIsIDQpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCAxLCAzLCA1KTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwgMSwgNCwgNik7CisgICAgICAgIGZsdXNoKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoS0VZU1BBQ0VfUEVSX1RFU1QpLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CisKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwgMSwgMywgNyk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIDEsIDQsIDgpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCAxLCA1LCA5KTsKKyAgICAgICAgZmx1c2goKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZShLRVlTUEFDRV9QRVJfVEVTVCkuZ2V0TGl2ZVNTVGFibGVzKCkuc2l6ZSgpKTsKKworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCAxLCA0LCAxMCk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIDEsIDUsIDExKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwgMSwgNiwgMTIpOworICAgICAgICBmbHVzaCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKEtFWVNQQUNFX1BFUl9URVNUKS5nZXRMaXZlU1NUYWJsZXMoKS5zaXplKCkpOworCisgICAgICAgIC8vIHBvaW50IHF1ZXJ5IC0gdGVzdCB3aGV0aGVyIHNzdGFibGVzIGFyZSBza2lwcGVkIGR1ZSB0byBub3QgY292ZXJpbmcgdGhlIHJlcXVlc3RlZCBzbGljZQorICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGMgPSAwIEFMTE9XIEZJTFRFUklORyIsIDApOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGMgPSAxIEFMTE9XIEZJTFRFUklORyIsIDEsIHJvdygxLCAxLCAxKSk7CisgICAgICAgIGV4ZWN1dGVBbmRDaGVja1JhbmdlUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYyA9IDIgQUxMT1cgRklMVEVSSU5HIiwgMiwgcm93KDEsIDIsIDQpKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrUmFuZ2VRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBjID0gMyBBTExPVyBGSUxURVJJTkciLCAzLCByb3coMSwgMywgNykpOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGMgPSA0IEFMTE9XIEZJTFRFUklORyIsIDMsIHJvdygxLCA0LCAxMCkpOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGMgPSA1IEFMTE9XIEZJTFRFUklORyIsIDIsIHJvdygxLCA1LCAxMSkpOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGMgPSA2IEFMTE9XIEZJTFRFUklORyIsIDEsIHJvdygxLCA2LCAxMikpOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGMgPSA3IEFMTE9XIEZJTFRFUklORyIsIDApOworCisgICAgICAgIC8vIHJhbmdlIHF1ZXJ5IC0gdGVzdCB3aGV0aGVyIHNzdGFibGVzIGFyZSBza2lwcGVkIGR1ZSB0byBub3QgY292ZXJpbmcgdGhlIHJlcXVlc3RlIHNsaWNlCisgICAgICAgIGV4ZWN1dGVBbmRDaGVja1JhbmdlUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYyA+IC0xMCBBTkQgYyA8PSAwIEFMTE9XIEZJTFRFUklORyIsIDApOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGMgPiAtMTAgQU5EIGMgPCAxIEFMTE9XIEZJTFRFUklORyIsIDApOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGMgPiAtMTAgQU5EIGMgPD0gMSBBTExPVyBGSUxURVJJTkciLCAxLCByb3coMSwgMSwgMSkpOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGMgPiAxIEFORCBjIDwgMyBBTExPVyBGSUxURVJJTkciLCAyLCByb3coMSwgMiwgNCkpOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGMgPj0gNiBBTExPVyBGSUxURVJJTkciLCAxLCByb3coMSwgNiwgMTIpKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrUmFuZ2VRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBjID4gNiBBTExPVyBGSUxURVJJTkciLCAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTa2lwcGluZ0J5S2V5UmFuZ2VJblBhcnRpdGlvblJhbmdlUmVhZHMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBEZWNvcmF0ZWRLZXlbXSBrZXlzID0gbmV3IERlY29yYXRlZEtleVs4XTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAga2V5c1tpXSA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRQYXJ0aXRpb25lcigpLmRlY29yYXRlS2V5KEludDMyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoaSkpOworICAgICAgICBBcnJheXMuc29ydChrZXlzKTsKKworICAgICAgICBpbnRbXSBrID0gbmV3IGludFtrZXlzLmxlbmd0aF07CisgICAgICAgIFN0cmluZ1tdIHQgPSBuZXcgU3RyaW5nW2tleXMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0ga2V5c1tpXTsKKyAgICAgICAgICAgIGtbaV0gPSBJbnQzMlR5cGUuaW5zdGFuY2UuY29tcG9zZShrZXkuZ2V0S2V5KCkpOworICAgICAgICAgICAgdFtpXSA9IGtleS5nZXRUb2tlbigpLmdldFRva2VuVmFsdWUoKS50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjIGludCwgdiBpbnQsIFBSSU1BUlkgS0VZKHBrLCBjKSkiKTsKKworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCBrWzFdLCAxLCAxKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwga1syXSwgMiwgMik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIGtbM10sIDMsIDMpOworICAgICAgICBmbHVzaCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKEtFWVNQQUNFX1BFUl9URVNUKS5nZXRMaXZlU1NUYWJsZXMoKS5zaXplKCkpOworCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIGtbMl0sIDIsIDQpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCBrWzNdLCAzLCA1KTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwga1s0XSwgNCwgNik7CisgICAgICAgIGZsdXNoKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoS0VZU1BBQ0VfUEVSX1RFU1QpLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CisKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwga1szXSwgMywgNyk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIGtbNF0sIDQsIDgpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCBrWzVdLCA1LCA5KTsKKyAgICAgICAgZmx1c2goKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZShLRVlTUEFDRV9QRVJfVEVTVCkuZ2V0TGl2ZVNTVGFibGVzKCkuc2l6ZSgpKTsKKworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCBrWzRdLCA0LCAxMCk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIGtbNV0sIDUsIDExKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwga1s2XSwgNiwgMTIpOworICAgICAgICBmbHVzaCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKEtFWVNQQUNFX1BFUl9URVNUKS5nZXRMaXZlU1NUYWJsZXMoKS5zaXplKCkpOworCisgICAgICAgIC8vIHJhbmdlIHF1ZXJ5IC0gdGVzdCB3aGV0aGVyIHNzdGFibGVzIGFyZSBza2lwcGVkIGR1ZSB0byBub3QgY292ZXJpbmcgdGhlIHJlcXVlc3RlZCBzbGljZQorICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIFRPS0VOIChwaykgPD0gIiArIHRbMF0sIDApOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIFRPS0VOIChwaykgPCAiICsgdFsxXSwgMCk7CisgICAgICAgIGV4ZWN1dGVBbmRDaGVja1JhbmdlUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgVE9LRU4ocGspID49ICIgKyB0WzFdICsgIiBBTkQgVE9LRU4gKHBrKSA8ICIgKyB0WzJdLCAxLCByb3coa1sxXSwgMSwgMSkpOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIFRPS0VOKHBrKSA+PSAiICsgdFsyXSArICIgQU5EIFRPS0VOIChwaykgPCAiICsgdFszXSwgMiwgcm93KGtbMl0sIDIsIDQpKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrUmFuZ2VRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBUT0tFTihwaykgPj0gIiArIHRbM10gKyAiIEFORCBUT0tFTiAocGspIDwgIiArIHRbNF0sIDMsIHJvdyhrWzNdLCAzLCA3KSk7CisgICAgICAgIGV4ZWN1dGVBbmRDaGVja1JhbmdlUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgVE9LRU4ocGspID49ICIgKyB0WzNdICsgIiBBTkQgVE9LRU4gKHBrKSA8PSAiICsgdFs0XSwgNCwgcm93KGtbM10sIDMsIDcpLCByb3coa1s0XSwgNCwgMTApKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrUmFuZ2VRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBUT0tFTihwaykgPj0gIiArIHRbNF0gKyAiIEFORCBUT0tFTiAocGspIDwgIiArIHRbNV0sIDMsIHJvdyhrWzRdLCA0LCAxMCkpOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIFRPS0VOKHBrKSA+PSAiICsgdFs1XSArICIgQU5EIFRPS0VOIChwaykgPCAiICsgdFs2XSwgMiwgcm93KGtbNV0sIDUsIDExKSk7CisgICAgICAgIGV4ZWN1dGVBbmRDaGVja1JhbmdlUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgVE9LRU4ocGspID49ICIgKyB0WzZdICsgIiBBTkQgVE9LRU4gKHBrKSA8ICIgKyB0WzddLCAxLCByb3coa1s2XSwgNiwgMTIpKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrUmFuZ2VRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBUT0tFTihwaykgPiAiICsgdFs2XSwgMCk7CisgICAgICAgIGV4ZWN1dGVBbmRDaGVja1JhbmdlUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgVE9LRU4ocGspID49ICIgKyB0WzddLCAwKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0FnZ3JlZ2F0aW9uVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0FnZ3JlZ2F0aW9uVGVzdC5qYXZhCmluZGV4IDRiOGU1ZTkuLmZiMzdmM2YgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9BZ2dyZWdhdGlvblRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvQWdncmVnYXRpb25UZXN0LmphdmEKQEAgLTI0MSw2ICsyNDEsMTE0IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWdncmVnYXRlV2l0aFNldHMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgcyBzZXQ8aW50PiwgZnMgZnJvemVuPHNldDxpbnQ+PikiKTsKKworICAgICAgICAvLyBUZXN0IHdpdGggZW1wdHkgdGFibGUKKyAgICAgICAgU3RyaW5nIHNlbGVjdCA9ICJTRUxFQ1QgY291bnQocyksIGNvdW50KGZzKSwgbWluKHMpLCBtaW4oZnMpLCBtYXgocyksIG1heChmcykgRlJPTSAlcyI7CisgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcnMgPSBleGVjdXRlKHNlbGVjdCk7CisgICAgICAgIGFzc2VydENvbHVtbk5hbWVzKHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic3lzdGVtLmNvdW50KHMpIiwgInN5c3RlbS5jb3VudChmcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic3lzdGVtLm1pbihzKSIsICJzeXN0ZW0ubWluKGZzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0ubWF4KHMpIiwgInN5c3RlbS5tYXgoZnMpIik7CisgICAgICAgIGFzc2VydFJvd3MocnMsIHJvdygwTCwgMEwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpKTsKKworICAgICAgICAvLyBUZXN0IHdpdGggbm90LWVtcHR5IHRhYmxlCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBzLCBmcykgVkFMVUVTICgxLCB7MSwgMn0sIHsxLCAyfSkiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHMsIGZzKSBWQUxVRVMgKDIsIHsxLCAyLCAzfSwgezEsIDIsIDN9KSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgcywgZnMpIFZBTFVFUyAoMywgezIsIDF9LCB7MiwgMX0pIik7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShzZWxlY3QpLCByb3coM0wsIDNMLCBzZXQoMSwgMiksIHNldCgxLCAyKSwgc2V0KDEsIDIsIDMpLCBzZXQoMSwgMiwgMykpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZ2dyZWdhdGVXaXRoTGlzdHMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgbCBsaXN0PGludD4sIGZsIGZyb3plbjxsaXN0PGludD4+KSIpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBlbXB0eSB0YWJsZQorICAgICAgICBTdHJpbmcgc2VsZWN0ID0gIlNFTEVDVCBjb3VudChsKSwgY291bnQoZmwpLCBtaW4obCksIG1pbihmbCksIG1heChsKSwgbWF4KGZsKSBGUk9NICVzIjsKKyAgICAgICAgVW50eXBlZFJlc3VsdFNldCBycyA9IGV4ZWN1dGUoc2VsZWN0KTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMocnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0uY291bnQobCkiLCAic3lzdGVtLmNvdW50KGZsKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0ubWluKGwpIiwgInN5c3RlbS5taW4oZmwpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInN5c3RlbS5tYXgobCkiLCAic3lzdGVtLm1heChmbCkiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhycywgcm93KDBMLCAwTCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBub3QtZW1wdHkgdGFibGUKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwsIGZsKSBWQUxVRVMgKDEsIFsxLCAyXSwgWzEsIDJdKSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbCwgZmwpIFZBTFVFUyAoMiwgWzEsIDIsIDNdLCBbMSwgMiwgM10pIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsLCBmbCkgVkFMVUVTICgzLCBbMiwgMV0sIFsyLCAxXSkiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKHNlbGVjdCksCisgICAgICAgICAgICAgICAgICAgcm93KDNMLCAzTCwgbGlzdCgxLCAyKSwgbGlzdCgxLCAyKSwgbGlzdCgyLCAxKSwgbGlzdCgyLCAxKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFnZ3JlZ2F0ZVdpdGhNYXBzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIG0gbWFwPGludCwgaW50PiwgZm0gZnJvemVuPG1hcDxpbnQsIGludD4+KSIpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBlbXB0eSB0YWJsZQorICAgICAgICBTdHJpbmcgc2VsZWN0ID0gIlNFTEVDVCBjb3VudChtKSwgY291bnQoZm0pLCBtaW4obSksIG1pbihmbSksIG1heChtKSwgbWF4KGZtKSBGUk9NICVzIjsKKyAgICAgICAgVW50eXBlZFJlc3VsdFNldCBycyA9IGV4ZWN1dGUoc2VsZWN0KTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMocnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0uY291bnQobSkiLCAic3lzdGVtLmNvdW50KGZtKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0ubWluKG0pIiwgInN5c3RlbS5taW4oZm0pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInN5c3RlbS5tYXgobSkiLCAic3lzdGVtLm1heChmbSkiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhycywgcm93KDBMLCAwTCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBub3QtZW1wdHkgdGFibGUKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIG0sIGZtKSBWQUxVRVMgKDEsIHsxOjEwLCAyOjIwfSwgezE6MTAsIDI6MjB9KSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbSwgZm0pIFZBTFVFUyAoMiwgezE6MTAsIDI6MjAsIDM6MzB9LCB7MToxMCwgMjoyMCwgMzozMH0pIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBtLCBmbSkgVkFMVUVTICgzLCB7MjoyMCwgMToxMH0sIHsyOjIwLCAxOjEwfSkiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKHNlbGVjdCksCisgICAgICAgICAgICAgICAgICAgcm93KDNMLCAzTCwKKyAgICAgICAgICAgICAgICAgICAgICAgbWFwKDEsIDEwLCAyLCAyMCksIG1hcCgxLCAxMCwgMiwgMjApLAorICAgICAgICAgICAgICAgICAgICAgICBtYXAoMSwgMTAsIDIsIDIwLCAzLCAzMCksIG1hcCgxLCAxMCwgMiwgMjAsIDMsIDMwKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFnZ3JlZ2F0ZVdpdGhUdXBsZXMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdCB0dXBsZTxpbnQsIHRleHQsIGJvb2xlYW4+KSIpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBlbXB0eSB0YWJsZQorICAgICAgICBTdHJpbmcgc2VsZWN0ID0gIlNFTEVDVCBjb3VudCh0KSwgbWluKHQpLCBtYXgodCkgRlJPTSAlcyI7CisgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcnMgPSBleGVjdXRlKHNlbGVjdCk7CisgICAgICAgIGFzc2VydENvbHVtbk5hbWVzKHJzLCAic3lzdGVtLmNvdW50KHQpIiwgInN5c3RlbS5taW4odCkiLCAic3lzdGVtLm1heCh0KSIpOworICAgICAgICBhc3NlcnRSb3dzKHJzLCByb3coMEwsIG51bGwsIG51bGwpKTsKKworICAgICAgICAvLyBUZXN0IHdpdGggbm90LWVtcHR5IHRhYmxlCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDEsICgxLCAnYScsIGZhbHNlKSkiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoMiwgKDIsICdiJywgdHJ1ZSkpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDMsICgzLCBudWxsLCB0cnVlKSkiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKHNlbGVjdCksIHJvdygzTCwgdHVwbGUoMSwgImEiLCBmYWxzZSksIHR1cGxlKDMsIG51bGwsIHRydWUpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWdncmVnYXRlV2l0aFVEVHMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBTdHJpbmcgdWR0ID0gY3JlYXRlVHlwZSgiQ1JFQVRFIFRZUEUgJXMgKHggaW50KSIpOworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdSBmcm96ZW48IiArIHVkdCArICI+LCBmdSBmcm96ZW48IiArIHVkdCArICI+KSIpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBlbXB0eSB0YWJsZQorICAgICAgICBTdHJpbmcgc2VsZWN0ID0gIlNFTEVDVCBjb3VudCh1KSwgY291bnQoZnUpLCBtaW4odSksIG1pbihmdSksIG1heCh1KSwgbWF4KGZ1KSBGUk9NICVzIjsKKyAgICAgICAgVW50eXBlZFJlc3VsdFNldCBycyA9IGV4ZWN1dGUoc2VsZWN0KTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMocnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0uY291bnQodSkiLCAic3lzdGVtLmNvdW50KGZ1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0ubWluKHUpIiwgInN5c3RlbS5taW4oZnUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInN5c3RlbS5tYXgodSkiLCAic3lzdGVtLm1heChmdSkiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhycywgcm93KDBMLCAwTCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBub3QtZW1wdHkgdGFibGUKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHUsIGZ1KSBWQUxVRVMgKDEsIHt4OiAyfSwgbnVsbCkiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHUsIGZ1KSBWQUxVRVMgKDIsIHt4OiA0fSwge3g6IDZ9KSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdSwgZnUpIFZBTFVFUyAoMywgbnVsbCwge3g6IDh9KSIpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoc2VsZWN0KSwKKyAgICAgICAgICAgICAgICAgICByb3coMkwsIDJMLCB1c2VyVHlwZSgieCIsIDIpLCB1c2VyVHlwZSgieCIsIDYpLCB1c2VyVHlwZSgieCIsIDQpLCB1c2VyVHlwZSgieCIsIDgpKSk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWdncmVnYXRlV2l0aFVkdEZpZWxkcygpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIFN0cmluZyBteVR5cGUgPSBjcmVhdGVUeXBlKCJDUkVBVEUgVFlQRSAlcyAoeCBpbnQpIik7CkBAIC0yNTksOCArMzY3LDggQEAKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY291bnQoYi54KSwgbWF4KGIueCkgYXMgbWF4LCBiLngsIGMueCBhcyBmaXJzdCBGUk9NICVzIiksCiAgICAgICAgICAgICAgICAgICAgcm93KDNMLCA4LCAyLCBudWxsKSk7CiAKLSAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkludmFsaWQgZmllbGQgc2VsZWN0aW9uOiBzeXN0ZW0ubWF4KGIpIG9mIHR5cGUgYmxvYiBpcyBub3QgYSB1c2VyIHR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VMRUNUIG1heChiKS54IGFzIG1heCBGUk9NICVzIik7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvdW50KGIpLCBtaW4oYikueCwgbWF4KGIpLngsIGNvdW50KGMpLCBtaW4oYykueCwgbWF4KGMpLnggRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygzTCwgMiwgOCwgMkwsIDYsIDEyKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTM2OSwyNSArNDc3LDI1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBKQVZBICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3JldHVybiBEb3VibGUudmFsdWVPZihNYXRoLmNvcHlTaWduKG1hZ25pdHVkZSwgc2lnbikpOyc7Iik7CiAKLSAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMoZXhlY3V0ZSgiU0VMRUNUIG1heChhKSwgbWF4KHRvVW5peFRpbWVzdGFtcChiKSkgRlJPTSAlcyIpLCAic3lzdGVtLm1heChhKSIsICJzeXN0ZW0ubWF4KHN5c3RlbS50b3VuaXh0aW1lc3RhbXAoYikpIik7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1heChhKSwgbWF4KHRvVW5peFRpbWVzdGFtcChiKSkgRlJPTSAlcyIpLCByb3cobnVsbCwgbnVsbCkpOwotICAgICAgICBhc3NlcnRDb2x1bW5OYW1lcyhleGVjdXRlKCJTRUxFQ1QgbWF4KGEpLCB0b1VuaXhUaW1lc3RhbXAobWF4KGIpKSBGUk9NICVzIiksICJzeXN0ZW0ubWF4KGEpIiwgInN5c3RlbS50b3VuaXh0aW1lc3RhbXAoc3lzdGVtLm1heChiKSkiKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWF4KGEpLCB0b1VuaXhUaW1lc3RhbXAobWF4KGIpKSBGUk9NICVzIiksIHJvdyhudWxsLCBudWxsKSk7CisgICAgICAgIGFzc2VydENvbHVtbk5hbWVzKGV4ZWN1dGUoIlNFTEVDVCBtYXgoYSksIG1heCh0b191bml4X3RpbWVzdGFtcChiKSkgRlJPTSAlcyIpLCAic3lzdGVtLm1heChhKSIsICJzeXN0ZW0ubWF4KHN5c3RlbS50b191bml4X3RpbWVzdGFtcChiKSkiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWF4KGEpLCBtYXgodG9fdW5peF90aW1lc3RhbXAoYikpIEZST00gJXMiKSwgcm93KG51bGwsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMoZXhlY3V0ZSgiU0VMRUNUIG1heChhKSwgdG9fdW5peF90aW1lc3RhbXAobWF4KGIpKSBGUk9NICVzIiksICJzeXN0ZW0ubWF4KGEpIiwgInN5c3RlbS50b191bml4X3RpbWVzdGFtcChzeXN0ZW0ubWF4KGIpKSIpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXgoYSksIHRvX3VuaXhfdGltZXN0YW1wKG1heChiKSkgRlJPTSAlcyIpLCByb3cobnVsbCwgbnVsbCkpOwogCiAgICAgICAgIGFzc2VydENvbHVtbk5hbWVzKGV4ZWN1dGUoIlNFTEVDVCBtYXgoIiArIGNvcHlTaWduICsgIihjLCBkKSkgRlJPTSAlcyIpLCAic3lzdGVtLm1heCgiICsgY29weVNpZ24gKyAiKGMsIGQpKSIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXgoIiArIGNvcHlTaWduICsgIihjLCBkKSkgRlJPTSAlcyIpLCByb3coKE9iamVjdCkgbnVsbCkpOwogCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChhLCBiLCBjLCBkKSBWQUxVRVMgKDEsIG1heFRpbWV1dWlkKCcyMDExLTAyLTAzIDA0OjA1OjAwKzAwMDAnKSwgLTEuMiwgMi4xKSIpOwotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYiwgYywgZCkgVkFMVUVTICgyLCBtYXhUaW1ldXVpZCgnMjAxMS0wMi0wMyAwNDowNjowMCswMDAwJyksIDEuMywgLTMuNCkiKTsKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGEsIGIsIGMsIGQpIFZBTFVFUyAoMywgbWF4VGltZXV1aWQoJzIwMTEtMDItMDMgMDQ6MTA6MDArMDAwMCcpLCAxLjQsIDEuMikiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGEsIGIsIGMsIGQpIFZBTFVFUyAoMSwgbWF4X3RpbWV1dWlkKCcyMDExLTAyLTAzIDA0OjA1OjAwKzAwMDAnKSwgLTEuMiwgMi4xKSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYiwgYywgZCkgVkFMVUVTICgyLCBtYXhfdGltZXV1aWQoJzIwMTEtMDItMDMgMDQ6MDY6MDArMDAwMCcpLCAxLjMsIC0zLjQpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChhLCBiLCBjLCBkKSBWQUxVRVMgKDMsIG1heF90aW1ldXVpZCgnMjAxMS0wMi0wMyAwNDoxMDowMCswMDAwJyksIDEuNCwgMS4yKSIpOwogCiAgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQgaGg6bW06c3MiKTsKICAgICAgICAgZm9ybWF0LnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSk7CiAgICAgICAgIERhdGUgZGF0ZSA9IGZvcm1hdC5wYXJzZSgiMjAxMS0wMi0wMyAwNDoxMDowMCIpOwogICAgICAgICBkYXRlID0gRGF0ZVV0aWxzLnRydW5jYXRlKGRhdGUsIENhbGVuZGFyLk1JTExJU0VDT05EKTsKIAotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXgoYSksIG1heCh0b1VuaXhUaW1lc3RhbXAoYikpIEZST00gJXMiKSwgcm93KDMsIGRhdGUuZ2V0VGltZSgpKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1heChhKSwgdG9Vbml4VGltZXN0YW1wKG1heChiKSkgRlJPTSAlcyIpLCByb3coMywgZGF0ZS5nZXRUaW1lKCkpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWF4KGEpLCBtYXgodG9fdW5peF90aW1lc3RhbXAoYikpIEZST00gJXMiKSwgcm93KDMsIGRhdGUuZ2V0VGltZSgpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1heChhKSwgdG9fdW5peF90aW1lc3RhbXAobWF4KGIpKSBGUk9NICVzIiksIHJvdygzLCBkYXRlLmdldFRpbWUoKSkpOwogCiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICIgKyBjb3B5U2lnbiArICIobWF4KGMpLCBtaW4oYykpIEZST00gJXMiKSwgcm93KC0xLjQpKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgIiArIGNvcHlTaWduICsgIihjLCBkKSBGUk9NICVzIiksIHJvdygxLjIpLCByb3coLTEuMyksIHJvdygxLjQpKTsKQEAgLTQwNCwxNiArNTEyLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICVzKHN0YXRlIGRvdWJsZSwgdmFsIGRvdWJsZSkgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGRvdWJsZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ1wic3RyaW5nXCI7JzsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJyByZXR1cm4gc3RhdGU7JzsiKTsKIAogICAgICAgICBjcmVhdGVGdW5jdGlvbk92ZXJsb2FkKGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRvdWJsZSwgZG91YmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gJXMoc3RhdGUgaW50LCB2YWwgaW50KSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgaW50ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnXCJzdHJpbmdcIjsnOyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAncmV0dXJuIHN0YXRlOyc7Iik7CiAKICAgICAgICAgU3RyaW5nIGEgPSBjcmVhdGVBZ2dyZWdhdGVOYW1lKEtFWVNQQUNFKTsKICAgICAgICAgU3RyaW5nIGFnZ3JlZ2F0ZU5hbWUgPSBzaG9ydEZ1bmN0aW9uTmFtZShhKTsKQEAgLTQ1Niw4ICs1NjQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gJXMoc3RhdGUgZG91YmxlLCB2YWwgbGlzdDx0dXBsZTxpbnQsIGludD4+KSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBkb3VibGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ1wic3RyaW5nXCI7JzsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmEgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnIHJldHVybiBzdGF0ZTsnOyIpOwogCiAgICAgICAgIFN0cmluZyBhMSA9IGNyZWF0ZUFnZ3JlZ2F0ZU5hbWUoS0VZU1BBQ0UpOwogICAgICAgICByZWdpc3RlckFnZ3JlZ2F0ZShhMSwgImxpc3Q8dHVwbGU8aW50LCBpbnQ+PiIpOwpAQCAtNDc5LDE2ICs1ODcsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gJXMoc3RhdGUgZG91YmxlLCB2YWwgZG91YmxlKSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgZG91YmxlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnXCJzdHJpbmdcIjsnOyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAncmV0dXJuIHN0YXRlOyc7Iik7CiAKICAgICAgICAgY3JlYXRlRnVuY3Rpb25PdmVybG9hZChmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkb3VibGUsIGRvdWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICVzKHN0YXRlIGludCwgdmFsIGludCkgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGludCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ1wic3RyaW5nXCI7JzsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJyByZXR1cm4gc3RhdGU7JzsiKTsKIAogICAgICAgICAvLyBEUk9QIEFHR1JFR0FURSBtdXN0IG5vdCBzdWNjZWVkIGFnYWluc3QgYSBzY2FsYXIKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIm1hdGNoZXMgbXVsdGlwbGUgZnVuY3Rpb24gZGVmaW5pdGlvbnMiLCAiRFJPUCBBR0dSRUdBVEUgIiArIGYpOwpAQCAtNTMxLDggKzYzOSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICVzKHN0YXRlIGRvdWJsZSwgdmFsIGRvdWJsZSkgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGRvdWJsZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ1wic3RyaW5nXCI7JzsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJyByZXR1cm4gc3RhdGU7JzsiKTsKIAogICAgICAgICBTdHJpbmcgYSA9IGNyZWF0ZUFnZ3JlZ2F0ZShLRVlTUEFDRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRvdWJsZSIsCkBAIC0xMDMxLDgxICsxMTM5LDYgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXZhc2NyaXB0QWdncmVnYXRlKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoYSBpbnQgcHJpbWFyeSBrZXksIGIgaW50KSIpOwotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYikgVkFMVUVTICgxLCAxKSIpOwotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYikgVkFMVUVTICgyLCAyKSIpOwotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYikgVkFMVUVTICgzLCAzKSIpOwotCi0gICAgICAgIFN0cmluZyBmU3RhdGUgPSBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQsIGludCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OICVzKGEgaW50LCBiIGludCkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBpbnQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnYSArIGI7JyIpOwotCi0gICAgICAgIFN0cmluZyBmRmluYWwgPSBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBGVU5DVElPTiAlcyhhIGludCkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyB0ZXh0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ1wiXCIrYSciKTsKLQotICAgICAgICBTdHJpbmcgYSA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgQUdHUkVHQVRFICVzKGludCkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNGVU5DICIgKyBzaG9ydEZ1bmN0aW9uTmFtZShmU3RhdGUpICsgIiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1RZUEUgaW50ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGSU5BTEZVTkMgIiArIHNob3J0RnVuY3Rpb25OYW1lKGZGaW5hbCkgKyAiICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJTklUQ09ORCA0MiIpOwotCi0gICAgICAgIC8vIDQyICsgMSArIDIgKyAzID0gNDgKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgIiArIGEgKyAiKGIpIEZST00gJXMiKSwgcm93KCI0OCIpKTsKLQotICAgICAgICBleGVjdXRlKCJEUk9QIEFHR1JFR0FURSAiICsgYSArICIoaW50KSIpOwotCi0gICAgICAgIGV4ZWN1dGUoIkRST1AgRlVOQ1RJT04gIiArIGZGaW5hbCArICIoaW50KSIpOwotICAgICAgICBleGVjdXRlKCJEUk9QIEZVTkNUSU9OICIgKyBmU3RhdGUgKyAiKGludCwgaW50KSIpOwotCi0gICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJVbmtub3duIGZ1bmN0aW9uIiwgIlNFTEVDVCAiICsgYSArICIoYikgRlJPTSAlcyIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEphdmFzY3JpcHRBZ2dyZWdhdGVTaW1wbGUoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChhIGludCBwcmltYXJ5IGtleSwgYiBpbnQpIik7Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChhLCBiKSBWQUxVRVMgKDEsIDEpIik7Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChhLCBiKSBWQUxVRVMgKDIsIDIpIik7Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChhLCBiKSBWQUxVRVMgKDMsIDMpIik7Ci0KLSAgICAgICAgU3RyaW5nIGZTdGF0ZSA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludCwgaW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgRlVOQ1RJT04gJXMoYSBpbnQsIGIgaW50KSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDQUxMRUQgT04gTlVMTCBJTlBVVCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGludCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICdhICsgYjsnIik7Ci0KLSAgICAgICAgU3RyaW5nIGEgPSBjcmVhdGVBZ2dyZWdhdGUoS0VZU1BBQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQsIGludCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgQUdHUkVHQVRFICVzKGludCkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTRlVOQyAiICsgc2hvcnRGdW5jdGlvbk5hbWUoZlN0YXRlKSArICIgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTVFlQRSBpbnQgIik7Ci0KLSAgICAgICAgLy8gMSArIDIgKyAzID0gNgotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAiICsgYSArICIoYikgRlJPTSAlcyIpLCByb3coNikpOwotCi0gICAgICAgIGV4ZWN1dGUoIkRST1AgQUdHUkVHQVRFICIgKyBhICsgIihpbnQpIik7Ci0KLSAgICAgICAgZXhlY3V0ZSgiRFJPUCBGVU5DVElPTiAiICsgZlN0YXRlICsgIihpbnQsIGludCkiKTsKLQotICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVW5rbm93biBmdW5jdGlvbiIsICJTRUxFQ1QgIiArIGEgKyAiKGIpIEZST00gJXMiKTsKLSAgICB9Ci0KLSAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGdW5jdGlvbkRyb3BQcmVwYXJlZFN0YXRlbWVudCgpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIFN0cmluZyBvdGhlcktTID0gImNxbHRlc3RfZm9vIjsKQEAgLTExMjAsOCArMTE1Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBGVU5DVElPTiAlcyhhIGludCwgYiBpbnQpICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDQUxMRUQgT04gTlVMTCBJTlBVVCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBpbnQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICdhICsgYjsnIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmEgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICcgcmV0dXJuIGEgKyBiOyciKTsKIAogICAgICAgICAgICAgU3RyaW5nIGEgPSBjcmVhdGVBZ2dyZWdhdGUob3RoZXJLUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQiLApAQCAtMTE2Myw4ICsxMTk2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgRlVOQ1RJT04gJXMoYSBpbnQsIGIgaW50KSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDQUxMRUQgT04gTlVMTCBJTlBVVCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGludCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICdhICsgYjsnIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnIHJldHVybiBhICsgYjsnIik7CiAKICAgICAgICAgU3RyaW5nIGEgPSBjcmVhdGVBZ2dyZWdhdGUoS0VZU1BBQ0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQiLApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0FsdGVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0FsdGVyVGVzdC5qYXZhCmluZGV4IGZkZGQ1OWIuLjE4ODE3MDcgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9BbHRlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvQWx0ZXJUZXN0LmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwpAQCAtMjksNyArMzAsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLk1lbXRhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLlNraXBMaXN0TWVtdGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuVGVzdE1lbXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5PcmRlclByZXNlcnZpbmdQYXJ0aXRpb25lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlN5bnRheEV4Y2VwdGlvbjsKQEAgLTI2OCw5ICsyNjgsOSBAQAogICAgICAgICBJbmV0QWRkcmVzc0FuZFBvcnQgbG9jYWwgPSBGQlV0aWxpdGllcy5nZXRCcm9hZGNhc3RBZGRyZXNzQW5kUG9ydCgpOwogICAgICAgICBJbmV0QWRkcmVzc0FuZFBvcnQgcmVtb3RlID0gSW5ldEFkZHJlc3NBbmRQb3J0LmdldEJ5TmFtZSgiMTI3LjAuMC40Iik7CiAgICAgICAgIG1ldGFkYXRhLnVwZGF0ZUhvc3RJZChVVUlELnJhbmRvbVVVSUQoKSwgbG9jYWwpOwotICAgICAgICBtZXRhZGF0YS51cGRhdGVOb3JtYWxUb2tlbihuZXcgT3JkZXJQcmVzZXJ2aW5nUGFydGl0aW9uZXIuU3RyaW5nVG9rZW4oIkEiKSwgbG9jYWwpOworICAgICAgICBtZXRhZGF0YS51cGRhdGVOb3JtYWxUb2tlbihVdGlsLnRva2VuKCJBIiksIGxvY2FsKTsKICAgICAgICAgbWV0YWRhdGEudXBkYXRlSG9zdElkKFVVSUQucmFuZG9tVVVJRCgpLCByZW1vdGUpOwotICAgICAgICBtZXRhZGF0YS51cGRhdGVOb3JtYWxUb2tlbihuZXcgT3JkZXJQcmVzZXJ2aW5nUGFydGl0aW9uZXIuU3RyaW5nVG9rZW4oIkIiKSwgcmVtb3RlKTsKKyAgICAgICAgbWV0YWRhdGEudXBkYXRlTm9ybWFsVG9rZW4oVXRpbC50b2tlbigiQiIpLCByZW1vdGUpOwogCiAgICAgICAgIC8vIFdpdGggdHdvIGRhdGFjZW50ZXJzIHdlIHNob3VsZCByZXNwZWN0IGFueXRoaW5nIHBhc3NlZCBpbiBhcyBhIG1hbnVhbCBvdmVycmlkZQogICAgICAgICBTdHJpbmcga3MxID0gY3JlYXRlS2V5c3BhY2UoIkNSRUFURSBLRVlTUEFDRSAlcyBXSVRIIHJlcGxpY2F0aW9uPXsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InIDogMSwgJyIgKyBEQVRBX0NFTlRFUl9SRU1PVEUgKyAiJzogM30iKTsKQEAgLTMyNiw5ICszMjYsOSBAQAogICAgICAgICBJbmV0QWRkcmVzc0FuZFBvcnQgbG9jYWwgPSBGQlV0aWxpdGllcy5nZXRCcm9hZGNhc3RBZGRyZXNzQW5kUG9ydCgpOwogICAgICAgICBJbmV0QWRkcmVzc0FuZFBvcnQgcmVtb3RlID0gSW5ldEFkZHJlc3NBbmRQb3J0LmdldEJ5TmFtZSgiMTI3LjAuMC40Iik7CiAgICAgICAgIG1ldGFkYXRhLnVwZGF0ZUhvc3RJZChVVUlELnJhbmRvbVVVSUQoKSwgbG9jYWwpOwotICAgICAgICBtZXRhZGF0YS51cGRhdGVOb3JtYWxUb2tlbihuZXcgT3JkZXJQcmVzZXJ2aW5nUGFydGl0aW9uZXIuU3RyaW5nVG9rZW4oIkEiKSwgbG9jYWwpOworICAgICAgICBtZXRhZGF0YS51cGRhdGVOb3JtYWxUb2tlbihVdGlsLnRva2VuKCJBIiksIGxvY2FsKTsKICAgICAgICAgbWV0YWRhdGEudXBkYXRlSG9zdElkKFVVSUQucmFuZG9tVVVJRCgpLCByZW1vdGUpOwotICAgICAgICBtZXRhZGF0YS51cGRhdGVOb3JtYWxUb2tlbihuZXcgT3JkZXJQcmVzZXJ2aW5nUGFydGl0aW9uZXIuU3RyaW5nVG9rZW4oIkIiKSwgcmVtb3RlKTsKKyAgICAgICAgbWV0YWRhdGEudXBkYXRlTm9ybWFsVG9rZW4oVXRpbC50b2tlbigiQiIpLCByZW1vdGUpOwogCiAgICAgICAgIC8vIExldCdzIGNyZWF0ZSBhIGtleXNwYWNlIGZpcnN0IHdpdGggU2ltcGxlU3RyYXRlZ3kKICAgICAgICAgU3RyaW5nIGtzMSA9IGNyZWF0ZUtleXNwYWNlKCJDUkVBVEUgS0VZU1BBQ0UgJXMgV0lUSCByZXBsaWNhdGlvbj17ICdjbGFzcycgOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJyA6IDJ9Iik7CkBAIC0zNjMsOSArMzYzLDkgQEAKICAgICAgICAgSW5ldEFkZHJlc3NBbmRQb3J0IGxvY2FsID0gRkJVdGlsaXRpZXMuZ2V0QnJvYWRjYXN0QWRkcmVzc0FuZFBvcnQoKTsKICAgICAgICAgSW5ldEFkZHJlc3NBbmRQb3J0IHJlbW90ZSA9IEluZXRBZGRyZXNzQW5kUG9ydC5nZXRCeU5hbWUoIjEyNy4wLjAuNCIpOwogICAgICAgICBtZXRhZGF0YS51cGRhdGVIb3N0SWQoVVVJRC5yYW5kb21VVUlEKCksIGxvY2FsKTsKLSAgICAgICAgbWV0YWRhdGEudXBkYXRlTm9ybWFsVG9rZW4obmV3IE9yZGVyUHJlc2VydmluZ1BhcnRpdGlvbmVyLlN0cmluZ1Rva2VuKCJBIiksIGxvY2FsKTsKKyAgICAgICAgbWV0YWRhdGEudXBkYXRlTm9ybWFsVG9rZW4oVXRpbC50b2tlbigiQSIpLCBsb2NhbCk7CiAgICAgICAgIG1ldGFkYXRhLnVwZGF0ZUhvc3RJZChVVUlELnJhbmRvbVVVSUQoKSwgcmVtb3RlKTsKLSAgICAgICAgbWV0YWRhdGEudXBkYXRlTm9ybWFsVG9rZW4obmV3IE9yZGVyUHJlc2VydmluZ1BhcnRpdGlvbmVyLlN0cmluZ1Rva2VuKCJCIiksIHJlbW90ZSk7CisgICAgICAgIG1ldGFkYXRhLnVwZGF0ZU5vcm1hbFRva2VuKFV0aWwudG9rZW4oIkIiKSwgcmVtb3RlKTsKIAogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0RGVmYXVsdEtleXNwYWNlUkYoMyk7CiAKQEAgLTU2MCw2ICs1NjAsNyBAQAogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChhIHRleHQsIGIgaW50LCBjIGludCwgcHJpbWFyeSBrZXkgKGEsIGIpKSIpOwogICAgICAgICBhc3NlcnRTYW1lKE1lbXRhYmxlUGFyYW1zLkRFRkFVTFQuZmFjdG9yeSgpLCBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5tZXRhZGF0YSgpLnBhcmFtcy5tZW10YWJsZS5mYWN0b3J5KCkpOwogICAgICAgICBhc3NlcnRTY2hlbWFPcHRpb24oIm1lbXRhYmxlIiwgbnVsbCk7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBNZW10YWJsZT4gZGVmYXVsdENsYXNzID0gZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkuZ2V0VHJhY2tlcigpLmdldFZpZXcoKS5nZXRDdXJyZW50TWVtdGFibGUoKS5nZXRDbGFzcygpOwogCiAgICAgICAgIHRlc3RNZW10YWJsZUNvbmZpZygic2tpcGxpc3QiLCBTa2lwTGlzdE1lbXRhYmxlLkZBQ1RPUlksIFNraXBMaXN0TWVtdGFibGUuY2xhc3MpOwogICAgICAgICB0ZXN0TWVtdGFibGVDb25maWcoInRlc3RfZnVsbG5hbWUiLCBUZXN0TWVtdGFibGUuRkFDVE9SWSwgU2tpcExpc3RNZW10YWJsZS5jbGFzcyk7CkBAIC01NzAsNyArNTcxLDcgQEAKICAgICAgICAgICAgICAgICAgICArICIgV0lUSCBjb21wcmVzc2lvbiA9IHsnY2xhc3MnOiAnTFo0Q29tcHJlc3Nvcid9OyIpOwogICAgICAgICBhc3NlcnRTY2hlbWFPcHRpb24oIm1lbXRhYmxlIiwgInRlc3Rfc2hvcnRuYW1lIik7CiAKLSAgICAgICAgdGVzdE1lbXRhYmxlQ29uZmlnKCJkZWZhdWx0IiwgTWVtdGFibGVQYXJhbXMuREVGQVVMVC5mYWN0b3J5KCksIFNraXBMaXN0TWVtdGFibGUuY2xhc3MpOworICAgICAgICB0ZXN0TWVtdGFibGVDb25maWcoImRlZmF1bHQiLCBNZW10YWJsZVBhcmFtcy5ERUZBVUxULmZhY3RvcnkoKSwgZGVmYXVsdENsYXNzKTsKIAogCiAgICAgICAgIGFzc2VydEFsdGVyVGFibGVUaHJvd3NFeGNlcHRpb24oQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcywKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9Db21wYWN0U3RvcmFnZVNwbGl0MVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9Db21wYWN0U3RvcmFnZVNwbGl0MVRlc3QuamF2YQppbmRleCA4MGJmNTFjLi4yMTRkNzc2IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvQ29tcGFjdFN0b3JhZ2VTcGxpdDFUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0NvbXBhY3RTdG9yYWdlU3BsaXQxVGVzdC5qYXZhCkBAIC03NzgsMTEgKzc3OCwxMSBAQAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIHYpIFZBTFVFUyAoPywgPykiLCBieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIikpOwogCiAgICAgICAgIC8vIFRlc3QgcmVzdHJpY3Rpb25zIG9uIG5vbi1wcmltYXJ5IGtleSB2YWx1ZQotICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIHYgPSB0ZXh0QXNCbG9iKCcnKTsiKSk7CisgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCB2ID0gdGV4dF9hc19ibG9iKCcnKTsiKSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCB2KSBWQUxVRVMgKD8sID8pIiwgYnl0ZXMoImZvbzEyNCIpLCBFTVBUWV9CWVRFX0JVRkZFUik7CiAKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHYgPSB0ZXh0QXNCbG9iKCcnKTsiKSwKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHYgPSB0ZXh0X2FzX2Jsb2IoJycpOyIpLAogICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTI0IiksIEVNUFRZX0JZVEVfQlVGRkVSKSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvQ29tcGFjdFN0b3JhZ2VTcGxpdDJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvQ29tcGFjdFN0b3JhZ2VTcGxpdDJUZXN0LmphdmEKaW5kZXggZTM5OWZlYi4uMWM0ZmViMyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0NvbXBhY3RTdG9yYWdlU3BsaXQyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9Db21wYWN0U3RvcmFnZVNwbGl0MlRlc3QuamF2YQpAQCAtMTYzOSw0OSArMTYzOSw0OSBAQAogCiAgICAgICAgICAgICBiZWZvcmVBbmRBZnRlckZsdXNoKCgpIC0+IHsKIAotICAgICAgICAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJLZXkgbWF5IG5vdCBiZSBlbXB0eSIsICJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignJyk7Iik7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIktleSBtYXkgbm90IGJlIGVtcHR5IiwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgSU4gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpOworICAgICAgICAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJLZXkgbWF5IG5vdCBiZSBlbXB0eSIsICJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCcnKTsiKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiS2V5IG1heSBub3QgYmUgZW1wdHkiLCAiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayBJTiAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpOyIpOwogCiAgICAgICAgICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIktleSBtYXkgbm90IGJlIGVtcHR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSk7CiAKICAgICAgICAgICAgICAgICAvLyBUZXN0IGNsdXN0ZXJpbmcgY29sdW1ucyByZXN0cmljdGlvbnMKLSAgICAgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgPSB0ZXh0QXNCbG9iKCcnKTsiKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPSB0ZXh0X2FzX2Jsb2IoJycpOyIpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMpID0gKHRleHRBc0Jsb2IoJycpKTsiKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjKSA9ICh0ZXh0X2FzX2Jsb2IoJycpKTsiKSk7CiAKLSAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyBJTiAodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSk7IiksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyBJTiAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjKSBJTiAoKHRleHRBc0Jsb2IoJycpKSwgKHRleHRBc0Jsb2IoJzEnKSkpOyIpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjKSBJTiAoKHRleHRfYXNfYmxvYignJykpLCAodGV4dF9hc19ibG9iKCcxJykpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjID4gdGV4dEFzQmxvYignJyk7IiksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRfYXNfYmxvYignJyk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPiAodGV4dEFzQmxvYignJykpOyIpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjKSA+ICh0ZXh0X2FzX2Jsb2IoJycpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgPj0gdGV4dEFzQmxvYignJyk7IiksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+PSB0ZXh0X2FzX2Jsb2IoJycpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSk7CiAKLSAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMpID49ICh0ZXh0QXNCbG9iKCcnKSk7IiksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpID49ICh0ZXh0X2FzX2Jsb2IoJycpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjIDw9IHRleHRBc0Jsb2IoJycpOyIpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA8PSB0ZXh0X2FzX2Jsb2IoJycpOyIpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMpIDw9ICh0ZXh0QXNCbG9iKCcnKSk7IikpOworICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPD0gKHRleHRfYXNfYmxvYignJykpOyIpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA8IHRleHRBc0Jsb2IoJycpOyIpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA8IHRleHRfYXNfYmxvYignJyk7IikpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPCAodGV4dEFzQmxvYignJykpOyIpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpIDwgKHRleHRfYXNfYmxvYignJykpOyIpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRBc0Jsb2IoJycpIEFORCBjIDwgdGV4dEFzQmxvYignJyk7IikpOworICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjID4gdGV4dF9hc19ibG9iKCcnKSBBTkQgYyA8IHRleHRfYXNfYmxvYignJyk7IikpOwogICAgICAgICAgICAgfSk7CiAKICAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRhaW5zKCJDT01QQUNUIikpCkBAIC0xNjk2LDYwICsxNjk2LDYwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiNCIpKTsKIAogICAgICAgICAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewotICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA9IHRleHRBc0Jsb2IoJycpOyIpLAorICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjID0gdGV4dF9hc19ibG9iKCcnKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjQiKSkpOwogCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPSAodGV4dEFzQmxvYignJykpOyIpLAorICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPSAodGV4dF9hc19ibG9iKCcnKSk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCI0IikpKTsKIAotICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyBJTiAodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSk7IiksCisgICAgICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgSU4gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjQiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgSU4gKCh0ZXh0QXNCbG9iKCcnKSksICh0ZXh0QXNCbG9iKCcxJykpKTsiKSwKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpIElOICgodGV4dF9hc19ibG9iKCcnKSksICh0ZXh0X2FzX2Jsb2IoJzEnKSkpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiNCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgPiB0ZXh0QXNCbG9iKCcnKTsiKSwKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRfYXNfYmxvYignJyk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPiAodGV4dEFzQmxvYignJykpOyIpLAorICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPiAodGV4dF9hc19ibG9iKCcnKSk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjID49IHRleHRBc0Jsb2IoJycpOyIpLAorICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjID49IHRleHRfYXNfYmxvYignJyk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCI0IikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpKTsKIAotICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMpID49ICh0ZXh0QXNCbG9iKCcnKSk7IiksCisgICAgICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjKSA+PSAodGV4dF9hc19ibG9iKCcnKSk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCI0IikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpKTsKIAotICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA8PSB0ZXh0QXNCbG9iKCcnKTsiKSwKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA8PSB0ZXh0X2FzX2Jsb2IoJycpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiNCIpKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjKSA8PSAodGV4dEFzQmxvYignJykpOyIpLAorICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPD0gKHRleHRfYXNfYmxvYignJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiNCIpKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjIDwgdGV4dEFzQmxvYignJyk7IikpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA8IHRleHRfYXNfYmxvYignJyk7IikpOwogCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMpIDwgKHRleHRBc0Jsb2IoJycpKTsiKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPCAodGV4dF9hc19ibG9iKCcnKSk7IikpOwogCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+PSB0ZXh0QXNCbG9iKCcnKSBBTkQgYyA8IHRleHRBc0Jsb2IoJycpOyIpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPj0gdGV4dF9hc19ibG9iKCcnKSBBTkQgYyA8IHRleHRfYXNfYmxvYignJyk7IikpOwogICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBUZXN0IHJlc3RyaWN0aW9ucyBvbiBub24tcHJpbWFyeSBrZXkgdmFsdWUKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgdiA9IHRleHRBc0Jsb2IoJycpIEFMTE9XIEZJTFRFUklORzsiKSk7CisgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgdiA9IHRleHRfYXNfYmxvYignJykgQUxMT1cgRklMVEVSSU5HOyIpKTsKIAogICAgICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIiwKICAgICAgICAgICAgICAgICAgICAgYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMyIpLCBFTVBUWV9CWVRFX0JVRkZFUik7CiAKICAgICAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCB2ID0gdGV4dEFzQmxvYignJykgQUxMT1cgRklMVEVSSU5HOyIpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIHYgPSB0ZXh0X2FzX2Jsb2IoJycpIEFMTE9XIEZJTFRFUklORzsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIzIiksIEVNUFRZX0JZVEVfQlVGRkVSKSk7CiAgICAgICAgICAgICB9KTsKICAgICAgICAgfQpAQCAtMTc2NCw3NiArMTc2NCw3NiBAQAogCiAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewogCi0gICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dEFzQmxvYignJyk7IikpOworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dF9hc19ibG9iKCcnKTsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0QXNCbG9iKCcxJykgQU5EIGMyID0gdGV4dEFzQmxvYignJyk7IikpOworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dF9hc19ibG9iKCcxJykgQU5EIGMyID0gdGV4dF9hc19ibG9iKCcnKTsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPSAodGV4dEFzQmxvYignMScpLCB0ZXh0QXNCbG9iKCcnKSk7IikpOworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpID0gKHRleHRfYXNfYmxvYignMScpLCB0ZXh0X2FzX2Jsb2IoJycpKTsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjMSBJTiAodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSkgQU5EIGMyID0gdGV4dEFzQmxvYignMScpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYzEgSU4gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKSBBTkQgYzIgPSB0ZXh0X2FzX2Jsb2IoJzEnKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0QXNCbG9iKCcxJykgQU5EIGMyIElOICh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dF9hc19ibG9iKCcxJykgQU5EIGMyIElOICh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpIElOICgodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSksICh0ZXh0QXNCbG9iKCcxJyksIHRleHRBc0Jsb2IoJzEnKSkpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgSU4gKCh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSksICh0ZXh0X2FzX2Jsb2IoJzEnKSwgdGV4dF9hc19ibG9iKCcxJykpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgPiB0ZXh0QXNCbG9iKCcnKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID4gdGV4dF9hc19ibG9iKCcnKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dEFzQmxvYignMScpIEFORCBjMiA+IHRleHRBc0Jsb2IoJycpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTkQgYzIgPiB0ZXh0X2FzX2Jsb2IoJycpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPiAodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSA+ICh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA9IHRleHRBc0Jsb2IoJzEnKSBBTkQgYzIgPj0gdGV4dEFzQmxvYignJyk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA9IHRleHRfYXNfYmxvYignMScpIEFORCBjMiA+PSB0ZXh0X2FzX2Jsb2IoJycpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dEFzQmxvYignMScpIEFORCBjMiA8PSB0ZXh0QXNCbG9iKCcnKTsiKSk7CisgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTkQgYzIgPD0gdGV4dF9hc19ibG9iKCcnKTsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPD0gKHRleHRBc0Jsb2IoJzEnKSwgdGV4dEFzQmxvYignJykpOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSA8PSAodGV4dF9hc19ibG9iKCcxJyksIHRleHRfYXNfYmxvYignJykpOyIpKTsKICAgICAgICAgfSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjMSwgYzIsIHYpIFZBTFVFUyAoPywgPywgPywgPykiLAogICAgICAgICAgICAgICAgIGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCI0IikpOwogCiAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dEFzQmxvYignJyk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA9IHRleHRfYXNfYmxvYignJyk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiMSIpLCBieXRlcygiNCIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA9IHRleHRBc0Jsb2IoJycpIEFORCBjMiA9IHRleHRBc0Jsb2IoJzEnKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dF9hc19ibG9iKCcnKSBBTkQgYzIgPSB0ZXh0X2FzX2Jsb2IoJzEnKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCI0IikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpID0gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPSAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjQiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgSU4gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpIEFORCBjMiA9IHRleHRBc0Jsb2IoJzEnKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxIElOICh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSkgQU5EIGMyID0gdGV4dF9hc19ibG9iKCcxJyk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiMSIpLCBieXRlcygiNCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgSU4gKCh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKSwgKHRleHRBc0Jsb2IoJzEnKSwgdGV4dEFzQmxvYignMScpKSk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSBJTiAoKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKSwgKHRleHRfYXNfYmxvYignMScpLCB0ZXh0X2FzX2Jsb2IoJzEnKSkpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjQiKSksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpID4gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPiAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPj0gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPj0gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCI0IikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPD0gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPD0gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCI0IikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSA8ICh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKTsiKSk7CisgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPCAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpOyIpKTsKICAgICAgICAgfSk7CiAgICAgfQogCkBAIC0xODU3LDE3ICsxODU3LDE3IEBACiAKICAgICAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgPiB0ZXh0QXNCbG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRfYXNfYmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+PSB0ZXh0QXNCbG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+PSB0ZXh0X2FzX2Jsb2IoJycpIiArIG9yZGVyaW5nQ2xhdXNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjIDwgdGV4dEFzQmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA8IHRleHRfYXNfYmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA8PSB0ZXh0QXNCbG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSkpOworICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjIDw9IHRleHRfYXNfYmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpKTsKICAgICAgICAgICAgIH0pOwogCiAgICAgICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiSW52YWxpZCBlbXB0eSBvciBudWxsIHZhbHVlIGZvciBjb2x1bW4gYyIsCkBAIC0xODkyLDE5ICsxODkyLDE5IEBACiAKICAgICAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID4gdGV4dEFzQmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID4gdGV4dF9hc19ibG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA9IHRleHRBc0Jsb2IoJzEnKSBBTkQgYzIgPiB0ZXh0QXNCbG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTkQgYzIgPiB0ZXh0X2FzX2Jsb2IoJycpIiArIG9yZGVyaW5nQ2xhdXNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpID4gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpIiArIG9yZGVyaW5nQ2xhdXNlKSwKKyAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSA+ICh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSkiICsgb3JkZXJpbmdDbGF1c2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0QXNCbG9iKCcxJykgQU5EIGMyID49IHRleHRBc0Jsb2IoJycpIiArIG9yZGVyaW5nQ2xhdXNlKSwKKyAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA9IHRleHRfYXNfYmxvYignMScpIEFORCBjMiA+PSB0ZXh0X2FzX2Jsb2IoJycpIiArIG9yZGVyaW5nQ2xhdXNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogICAgICAgICAgICAgfSk7CkBAIC0xOTE0LDE5ICsxOTE0LDE5IEBACiAKICAgICAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxIElOICh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKSBBTkQgYzIgPSB0ZXh0QXNCbG9iKCcxJykiICsgb3JkZXJpbmdDbGF1c2UpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxIElOICh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSkgQU5EIGMyID0gdGV4dF9hc19ibG9iKCcxJykiICsgb3JkZXJpbmdDbGF1c2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjQiKSkpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpIElOICgodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSksICh0ZXh0QXNCbG9iKCcxJyksIHRleHRBc0Jsb2IoJzEnKSkpIiArIG9yZGVyaW5nQ2xhdXNlKSwKKyAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSBJTiAoKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKSwgKHRleHRfYXNfYmxvYignMScpLCB0ZXh0X2FzX2Jsb2IoJzEnKSkpIiArIG9yZGVyaW5nQ2xhdXNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCI0IikpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSA+ICh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPiAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpIiArIG9yZGVyaW5nQ2xhdXNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpID49ICh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPj0gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKSIgKyBvcmRlcmluZ0NsYXVzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCI0IikpKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9DcmVhdGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvQ3JlYXRlVGVzdC5qYXZhCmluZGV4IDY4NzUxY2QuLmMyYTg2NTMgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9DcmVhdGVUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0NyZWF0ZVRlc3QuamF2YQpAQCAtMTcsMTYgKzE3LDYgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnZhbGlkYXRpb24ub3BlcmF0aW9uczsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVVVJRDsKLQotaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuRHVyYXRpb247CkBAIC0zNCw2ICsyNCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuTWVtdGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuU2tpcExpc3RNZW10YWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZS5UZXN0TWVtdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuVHJpZU1lbXRhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOwpAQCAtNDMsMjUgKzM0LDIzIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JRW5kcG9pbnRTbml0Y2g7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SZXBsaWNhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5NZW10YWJsZVBhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUtleXNwYWNlVGFibGVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJpZ2dlcnMuSVRyaWdnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5EdXJhdGlvbi5OQU5PU19QRVJfSE9VUjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5EdXJhdGlvbi5OQU5PU19QRVJfTUlDUk87Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuRHVyYXRpb24uTkFOT1NfUEVSX01JTExJOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkR1cmF0aW9uLk5BTk9TX1BFUl9NSU5VVEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkR1cmF0aW9uLio7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKIAogcHVibGljIGNsYXNzIENyZWF0ZVRlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKIHsKQEAgLTYxMywxNCArNjAyLDE2IEBACiAgICAgewogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChhIHRleHQsIGIgaW50LCBjIGludCwgcHJpbWFyeSBrZXkgKGEsIGIpKSIpOwogICAgICAgICBhc3NlcnRTYW1lKE1lbXRhYmxlUGFyYW1zLkRFRkFVTFQuZmFjdG9yeSgpLCBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5tZXRhZGF0YSgpLnBhcmFtcy5tZW10YWJsZS5mYWN0b3J5KCkpOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgTWVtdGFibGU+IGRlZmF1bHRDbGFzcyA9IGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLmdldFRyYWNrZXIoKS5nZXRWaWV3KCkuZ2V0Q3VycmVudE1lbXRhYmxlKCkuZ2V0Q2xhc3MoKTsKIAogICAgICAgICBhc3NlcnRTY2hlbWFPcHRpb24oIm1lbXRhYmxlIiwgbnVsbCk7CiAKICAgICAgICAgdGVzdE1lbXRhYmxlQ29uZmlnKCJza2lwbGlzdCIsIFNraXBMaXN0TWVtdGFibGUuRkFDVE9SWSwgU2tpcExpc3RNZW10YWJsZS5jbGFzcyk7CisgICAgICAgIHRlc3RNZW10YWJsZUNvbmZpZygidHJpZSIsIE1lbXRhYmxlUGFyYW1zLmdldCgidHJpZSIpLmZhY3RvcnkoKSwgVHJpZU1lbXRhYmxlLmNsYXNzKTsKICAgICAgICAgdGVzdE1lbXRhYmxlQ29uZmlnKCJza2lwbGlzdF9yZW1hcHBlZCIsIFNraXBMaXN0TWVtdGFibGUuRkFDVE9SWSwgU2tpcExpc3RNZW10YWJsZS5jbGFzcyk7CiAgICAgICAgIHRlc3RNZW10YWJsZUNvbmZpZygidGVzdF9mdWxsbmFtZSIsIFRlc3RNZW10YWJsZS5GQUNUT1JZLCBTa2lwTGlzdE1lbXRhYmxlLmNsYXNzKTsKICAgICAgICAgdGVzdE1lbXRhYmxlQ29uZmlnKCJ0ZXN0X3Nob3J0bmFtZSIsIFNraXBMaXN0TWVtdGFibGUuRkFDVE9SWSwgU2tpcExpc3RNZW10YWJsZS5jbGFzcyk7Ci0gICAgICAgIHRlc3RNZW10YWJsZUNvbmZpZygiZGVmYXVsdCIsIE1lbXRhYmxlUGFyYW1zLkRFRkFVTFQuZmFjdG9yeSgpLCBTa2lwTGlzdE1lbXRhYmxlLmNsYXNzKTsKKyAgICAgICAgdGVzdE1lbXRhYmxlQ29uZmlnKCJkZWZhdWx0IiwgTWVtdGFibGVQYXJhbXMuREVGQVVMVC5mYWN0b3J5KCksIGRlZmF1bHRDbGFzcyk7CiAKICAgICAgICAgYXNzZXJ0VGhyb3dzQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiVGhlICdjbGFzc19uYW1lJyBvcHRpb24gbXVzdCBiZSBzcGVjaWZpZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIFRBQkxFICVzIChhIHRleHQsIGIgaW50LCBjIGludCwgcHJpbWFyeSBrZXkgKGEsIGIpKSIKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9EZWxldGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvRGVsZXRlVGVzdC5qYXZhCmluZGV4IDk4MGI3OTEuLjY0NWJlY2QgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9EZWxldGVUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0RlbGV0ZVRlc3QuamF2YQpAQCAtMTE3MSwxMiArMTE3MSwxMiBAQAogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBibG9iLCBjIGJsb2IsIHYgYmxvYiwgUFJJTUFSWSBLRVkgKHBrLCBjKSkiKTsKIAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykiLCBieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiMSIpKTsKLSAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA9IHRleHRBc0Jsb2IoJycpOyIpOworICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPSB0ZXh0X2FzX2Jsb2IoJycpOyIpOwogCiAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMiKSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIiwgYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjEiKSk7Ci0gICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgSU4gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpOworICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgSU4gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKTsiKTsKIAogICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIikpOwogCkBAIC0xMTg0LDI3ICsxMTg0LDI3IEBACiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSIsIGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSk7CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSIsIGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSk7CiAKLSAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRBc0Jsb2IoJycpIik7CisgICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRfYXNfYmxvYignJykiKTsKIAogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMiKSwKICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgPj0gdGV4dEFzQmxvYignJykiKTsKKyAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjID49IHRleHRfYXNfYmxvYignJykiKTsKIAogICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSIsIGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSk7CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSIsIGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSk7CiAKLSAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRBc0Jsb2IoJycpIik7CisgICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRfYXNfYmxvYignJykiKTsKIAogICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSIsIGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSk7CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSIsIGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSk7CiAKLSAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA8PSB0ZXh0QXNCbG9iKCcnKSIpOwotICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjIDwgdGV4dEFzQmxvYignJykiKTsKKyAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjIDw9IHRleHRfYXNfYmxvYignJykiKTsKKyAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjIDwgdGV4dF9hc19ibG9iKCcnKSIpOwogCiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyIpLAogICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLApAQCAtMTIxNywxMiArMTIxNywxMiBAQAogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBibG9iLCBjMSBibG9iLCBjMiBibG9iLCB2IGJsb2IsIFBSSU1BUlkgS0VZIChwaywgYzEsIGMyKSkiKTsKIAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMxLCBjMiwgdikgVkFMVUVTICg/LCA/LCA/LCA/KSIsIGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpOwotICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA9IHRleHRBc0Jsb2IoJycpOyIpOworICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dF9hc19ibG9iKCcnKTsiKTsKIAogICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYzEsIGMyLCB2KSBWQUxVRVMgKD8sID8sID8sID8pIiwgYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSk7Ci0gICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxIElOICh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKSBBTkQgYzIgPSB0ZXh0QXNCbG9iKCcxJyk7Iik7CisgICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYzEgSU4gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKSBBTkQgYzIgPSB0ZXh0X2FzX2Jsb2IoJzEnKTsiKTsKIAogICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIikpOwogCkBAIC0xMjMwLDI3ICsxMjMwLDI3IEBACiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYzEsIGMyLCB2KSBWQUxVRVMgKD8sID8sID8sID8pIiwgYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKTsKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjMSwgYzIsIHYpIFZBTFVFUyAoPywgPywgPywgPykiLCBieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIzIikpOwogCi0gICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID4gdGV4dEFzQmxvYignJykiKTsKKyAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA+IHRleHRfYXNfYmxvYignJykiKTsKIAogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMiKSwKICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjAiKSkpOwogCi0gICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID49IHRleHRBc0Jsb2IoJycpIik7CisgICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYzEgPj0gdGV4dF9hc19ibG9iKCcnKSIpOwogCiAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMiKSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjMSwgYzIsIHYpIFZBTFVFUyAoPywgPywgPywgPykiLCBieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpOwogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMxLCBjMiwgdikgVkFMVUVTICg/LCA/LCA/LCA/KSIsIGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjMiKSk7CiAKLSAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgPiB0ZXh0QXNCbG9iKCcnKSIpOworICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID4gdGV4dF9hc19ibG9iKCcnKSIpOwogCiAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMiKSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjMSwgYzIsIHYpIFZBTFVFUyAoPywgPywgPywgPykiLCBieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpOwogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMxLCBjMiwgdikgVkFMVUVTICg/LCA/LCA/LCA/KSIsIGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjMiKSk7CiAKLSAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgPD0gdGV4dEFzQmxvYignJykiKTsKLSAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgPCB0ZXh0QXNCbG9iKCcnKSIpOworICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxIDw9IHRleHRfYXNfYmxvYignJykiKTsKKyAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA8IHRleHRfYXNfYmxvYignJykiKTsKIAogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMiKSwKICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9JbnNlcnRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvSW5zZXJ0VGVzdC5qYXZhCmluZGV4IDRlMzNhZTMuLmY2ZTcxYWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9JbnNlcnRUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0luc2VydFRlc3QuamF2YQpAQCAtMTgsNiArMTgsOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMudmFsaWRhdGlvbi5vcGVyYXRpb25zOwogCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKwogaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKQEAgLTY4LDYgKzcwLDE1IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlUVEwoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdiBpbnQpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDAsIDApIFVTSU5HIFRUTCA/IiwgKE9iamVjdCkgbnVsbCk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDEsIDEpIFVTSU5HIFRUTCA/IiwgQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlWzBdKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHYsIHR0bCh2KSBGUk9NICVzIiksIHJvdygxLCAxLCBudWxsKSwgcm93KDAsIDAsIG51bGwpKTsKKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnNlcnRXaXRoVW5zZXQoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgcyB0ZXh0LCBpIGludCkiKTsKQEAgLTg3LDcgKzk4LDcgQEAKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiSW52YWxpZCB1bnNldCB2YWx1ZSBmb3IgY29sdW1uIGsiLCAiVVBEQVRFICVzIFNFVCBpID0gMCBXSEVSRSBrID0gPyIsIHVuc2V0KCkpOwogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiSW52YWxpZCB1bnNldCB2YWx1ZSBmb3IgY29sdW1uIGsiLCAiREVMRVRFIEZST00gJXMgV0hFUkUgayA9ID8iLCB1bnNldCgpKTsKLSAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkludmFsaWQgdW5zZXQgdmFsdWUgZm9yIGFyZ3VtZW50IGluIGNhbGwgdG8gZnVuY3Rpb24gYmxvYmFzaW50IiwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IGJsb2JBc0ludCg/KSIsIHVuc2V0KCkpOworICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiSW52YWxpZCB1bnNldCB2YWx1ZSBmb3IgYXJndW1lbnQgaW4gY2FsbCB0byBmdW5jdGlvbiBibG9iX2FzX2ludCIsICJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPSBibG9iX2FzX2ludCg/KSIsIHVuc2V0KCkpOwogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvSW5zZXJ0VXBkYXRlSWZDb25kaXRpb25Db2xsZWN0aW9uc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9JbnNlcnRVcGRhdGVJZkNvbmRpdGlvbkNvbGxlY3Rpb25zVGVzdC5qYXZhCmluZGV4IGMwYTUxMzkuLmZlNDA3M2MgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9JbnNlcnRVcGRhdGVJZkNvbmRpdGlvbkNvbGxlY3Rpb25zVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9JbnNlcnRVcGRhdGVJZkNvbmRpdGlvbkNvbGxlY3Rpb25zVGVzdC5qYXZhCkBAIC0yOSw2ICsyOSw3IEBACiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlN5bnRheEV4Y2VwdGlvbjsKQEAgLTUxLDYgKzUyLDggQEAKICAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAie2luZGV4fTogY2x1c3Rlck1pblZlcnNpb249ezB9IikKICAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IGRhdGEoKQogICAgIHsKKyAgICAgICAgU2VydmVyVGVzdFV0aWxzLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CisKICAgICAgICAgcmV0dXJuIEluc2VydFVwZGF0ZUlmQ29uZGl0aW9uVGVzdC5kYXRhKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvSW5zZXJ0VXBkYXRlSWZDb25kaXRpb25TdGF0aWNzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0luc2VydFVwZGF0ZUlmQ29uZGl0aW9uU3RhdGljc1Rlc3QuamF2YQppbmRleCBiOWM5Y2UzLi4zMjcwZmMxIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvSW5zZXJ0VXBkYXRlSWZDb25kaXRpb25TdGF0aWNzVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9JbnNlcnRVcGRhdGVJZkNvbmRpdGlvblN0YXRpY3NUZXN0LmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKIAogLyogSW5zZXJ0VXBkYXRlSWZDb25kaXRpb25Db2xsZWN0aW9uc1Rlc3QgY2xhc3MgaGFzIGJlZW4gc3BsaXQgaW50byBtdWx0aXBsZSBvbmVzIGJlY2F1c2Ugb2YgdGltZW91dCBpc3N1ZXMgKENBU1NBTkRSQS0xNjY3MCkKQEAgLTQ3LDYgKzQ4LDcgQEAKICAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAie2luZGV4fTogY2x1c3Rlck1pblZlcnNpb249ezB9IikKICAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IGRhdGEoKQogICAgIHsKKyAgICAgICAgU2VydmVyVGVzdFV0aWxzLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CiAgICAgICAgIHJldHVybiBJbnNlcnRVcGRhdGVJZkNvbmRpdGlvblRlc3QuZGF0YSgpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0luc2VydFVwZGF0ZUlmQ29uZGl0aW9uVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0luc2VydFVwZGF0ZUlmQ29uZGl0aW9uVGVzdC5qYXZhCmluZGV4IDg0MjllYzAuLmM2MTc1NDQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9JbnNlcnRVcGRhdGVJZkNvbmRpdGlvblRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvSW5zZXJ0VXBkYXRlSWZDb25kaXRpb25UZXN0LmphdmEKQEAgLTI4LDYgKzI4LDcgQEAKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuRHVyYXRpb247CkBAIC02MSw2ICs2Miw3IEBACiAgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIntpbmRleH06IGNsdXN0ZXJNaW5WZXJzaW9uPXswfSIpCiAgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPE9iamVjdFtdPiBkYXRhKCkKICAgICB7CisgICAgICAgIFNlcnZlclRlc3RVdGlscy5kYWVtb25Jbml0aWFsaXphdGlvbigpOwogICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W117ICIzLjAiLCAoUnVubmFibGUpICgpIC0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaXI8Qm9vbGVhbiwgQ2Fzc2FuZHJhVmVyc2lvbj4gcmVzID0gR29zc2lwZXIuaW5zdGFuY2UuaXNVcGdyYWRpbmdGcm9tVmVyc2lvbkxvd2VyVGhhbkMxNzY1MyhuZXcgQ2Fzc2FuZHJhVmVyc2lvbigiMy4xMSIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGVidWdNc2dDQVNTQU5EUkExNzY1MyhyZXMpLCByZXMubGVmdCk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvU2VsZWN0R3JvdXBCeVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9TZWxlY3RHcm91cEJ5VGVzdC5qYXZhCmluZGV4IGY0Njc4M2IuLjBhMGFlY2IgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9TZWxlY3RHcm91cEJ5VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9TZWxlY3RHcm91cEJ5VGVzdC5qYXZhCkBAIC0yMjUxLDcgKzIyNTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIHRvVGltZXN0YW1wKCIyMDE2LTA5LTI3IDE2OjI1OjAwIFVUQyIpLCAxMCwgMTAsIDFMKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygyLCB0b1RpbWVzdGFtcCgiMjAxNi0wOS0yNyAxNjozMDowMCBVVEMiKSwgMTEsIDExLCAxTCkpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgcGssIGZsb29yKHRvVGltZXN0YW1wKHRpbWUpLCA1bSIgKyBzdGFydGluZ1RpbWUgKyAiKSwgbWluKHYpLCBtYXgodiksIGNvdW50KHYpIEZST00gJXMgR1JPVVAgQlkgcGssIGZsb29yKHRvVGltZXN0YW1wKHRpbWUpLCA1bSIgKyBzdGFydGluZ1RpbWUgKyAiKSIpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHBrLCBmbG9vcih0b190aW1lc3RhbXAodGltZSksIDVtIiArIHN0YXJ0aW5nVGltZSArICIpLCBtaW4odiksIG1heCh2KSwgY291bnQodikgRlJPTSAlcyBHUk9VUCBCWSBwaywgZmxvb3IodG9fdGltZXN0YW1wKHRpbWUpLCA1bSIgKyBzdGFydGluZ1RpbWUgKyAiKSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIHRvVGltZXN0YW1wKCIyMDE2LTA5LTI3IDE2OjEwOjAwIFVUQyIpLCAxLCAzLCAzTCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coMSwgdG9UaW1lc3RhbXAoIjIwMTYtMDktMjcgMTY6MTU6MDAgVVRDIiksIDQsIDQsIDFMKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCB0b1RpbWVzdGFtcCgiMjAxNi0wOS0yNyAxNjoyMDowMCBVVEMiKSwgNSwgNiwgMkwpLApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL1NlbGVjdExpbWl0VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL1NlbGVjdExpbWl0VGVzdC5qYXZhCmluZGV4IDJlNDE5ZTEuLjM0N2JjMWQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9TZWxlY3RMaW1pdFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvU2VsZWN0TGltaXRUZXN0LmphdmEKQEAgLTIzLDYgKzIzLDcgQEAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQnl0ZU9yZGVyZWRQYXJ0aXRpb25lcjsKQEAgLTM0LDYgKzM1LDggQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCiAgICAgeworICAgICAgICBTZXJ2ZXJUZXN0VXRpbHMuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKwogICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5zZXRQYXJ0aXRpb25lclVuc2FmZShCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLmluc3RhbmNlKTsKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFBhcnRpdGlvbmVyVW5zYWZlKEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuaW5zdGFuY2UpOwogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvU2VsZWN0T3JkZXJCeVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9TZWxlY3RPcmRlckJ5VGVzdC5qYXZhCmluZGV4IDhhM2FlMDMuLjBjYmUyMjEgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9TZWxlY3RPcmRlckJ5VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9TZWxlY3RPcmRlckJ5VGVzdC5qYXZhCkBAIC03MywxNyArNzMsMTcgQEAKIAogICAgICAgICBiZWZvcmVBbmRBZnRlckZsdXNoKCgpIC0+IHsKICAgICAgICAgICAgIC8vIG9yZGVyIGJ5IHRoZSBvbmx5IGNvbHVtbiBpbiB0aGUgc2VsZWN0aW9uCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBibG9iQXNJbnQoaW50QXNCbG9iKGIpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIEFTQyIsIDApLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IoYikpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGIgQVNDIiwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdygwKSwgcm93KDEpLCByb3coMikpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBibG9iQXNJbnQoaW50QXNCbG9iKGIpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIERFU0MiLCAwKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGJsb2JfYXNfaW50KGludF9hc19ibG9iKGIpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIERFU0MiLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KDIpLCByb3coMSksIHJvdygwKSk7CiAKICAgICAgICAgICAgIC8vIG9yZGVyIGJ5IGEgY29sdW1uIG5vdCBpbiB0aGUgc2VsZWN0aW9uCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBibG9iQXNJbnQoaW50QXNCbG9iKGMpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIEFTQyIsIDApLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IoYykpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGIgQVNDIiwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdygwKSwgcm93KDEpLCByb3coMikpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBibG9iQXNJbnQoaW50QXNCbG9iKGMpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIERFU0MiLCAwKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGJsb2JfYXNfaW50KGludF9hc19ibG9iKGMpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIERFU0MiLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KDIpLCByb3coMSksIHJvdygwKSk7CiAKICAgICAgICAgICAgIGFzc2VydEludmFsaWQoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGMgQVNDIiwgMCk7CkBAIC0xMDksNyArMTA5LDcgQEAKICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGMuYSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIERFU0MiLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KDIpLCByb3coMSksIHJvdygwKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGJsb2JBc0ludChpbnRBc0Jsb2IoYy5hKSkgRlJPTSAlcyBXSEVSRSBhPT8gT1JERVIgQlkgYiBERVNDIiwgMCksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBibG9iX2FzX2ludChpbnRfYXNfYmxvYihjLmEpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIERFU0MiLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KDIpLCByb3coMSksIHJvdygwKSk7CiAgICAgICAgIH0pOwogICAgICAgICBkcm9wVGFibGUoIkRST1AgVEFCTEUgJXMiKTsKQEAgLTE5OCwzOSArMTk4LDM5IEBACiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChhLCBiLCBjLCBkKSBWQUxVRVMgKD8sID8sID8sID8pIiwgMCwgMSwgMiwgNSk7CiAKICAgICAgICAgYmVmb3JlQW5kQWZ0ZXJGbHVzaCgoKSAtPiB7Ci0gICAgICAgICAgICBhc3NlcnRJbnZhbGlkKCJTRUxFQ1QgYmxvYkFzSW50KGludEFzQmxvYihiKSkgRlJPTSAlcyBXSEVSRSBhPT8gT1JERVIgQlkgYyBBU0MiLCAwKTsKLSAgICAgICAgICAgIGFzc2VydEludmFsaWQoIlNFTEVDVCBibG9iQXNJbnQoaW50QXNCbG9iKGIpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBjIERFU0MiLCAwKTsKLSAgICAgICAgICAgIGFzc2VydEludmFsaWQoIlNFTEVDVCBibG9iQXNJbnQoaW50QXNCbG9iKGIpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIEFTQywgYyBERVNDIiwgMCk7Ci0gICAgICAgICAgICBhc3NlcnRJbnZhbGlkKCJTRUxFQ1QgYmxvYkFzSW50KGludEFzQmxvYihiKSkgRlJPTSAlcyBXSEVSRSBhPT8gT1JERVIgQlkgYiBERVNDLCBjIEFTQyIsIDApOwotICAgICAgICAgICAgYXNzZXJ0SW52YWxpZCgiU0VMRUNUIGJsb2JBc0ludChpbnRBc0Jsb2IoYikpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGQgQVNDIiwgMCk7CisgICAgICAgICAgICBhc3NlcnRJbnZhbGlkKCJTRUxFQ1QgYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IoYikpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGMgQVNDIiwgMCk7CisgICAgICAgICAgICBhc3NlcnRJbnZhbGlkKCJTRUxFQ1QgYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IoYikpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGMgREVTQyIsIDApOworICAgICAgICAgICAgYXNzZXJ0SW52YWxpZCgiU0VMRUNUIGJsb2JfYXNfaW50KGludF9hc19ibG9iKGIpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIEFTQywgYyBERVNDIiwgMCk7CisgICAgICAgICAgICBhc3NlcnRJbnZhbGlkKCJTRUxFQ1QgYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IoYikpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGIgREVTQywgYyBBU0MiLCAwKTsKKyAgICAgICAgICAgIGFzc2VydEludmFsaWQoIlNFTEVDVCBibG9iX2FzX2ludChpbnRfYXNfYmxvYihiKSkgRlJPTSAlcyBXSEVSRSBhPT8gT1JERVIgQlkgZCBBU0MiLCAwKTsKIAogICAgICAgICAgICAgLy8gc2VsZWN0IGFuZCBvcmRlciBieSBiCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBibG9iQXNJbnQoaW50QXNCbG9iKGIpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIEFTQyIsIDApLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IoYikpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGIgQVNDIiwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdygwKSwgcm93KDApLCByb3coMCksIHJvdygxKSwgcm93KDEpLCByb3coMSkpOwotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYmxvYkFzSW50KGludEFzQmxvYihiKSkgRlJPTSAlcyBXSEVSRSBhPT8gT1JERVIgQlkgYiBERVNDIiwgMCksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBibG9iX2FzX2ludChpbnRfYXNfYmxvYihiKSkgRlJPTSAlcyBXSEVSRSBhPT8gT1JERVIgQlkgYiBERVNDIiwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdygxKSwgcm93KDEpLCByb3coMSksIHJvdygwKSwgcm93KDApLCByb3coMCkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBiLCBibG9iQXNJbnQoaW50QXNCbG9iKGIpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIEFTQyIsIDApLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYiwgYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IoYikpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGIgQVNDIiwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdygwLCAwKSwgcm93KDAsIDApLCByb3coMCwgMCksIHJvdygxLCAxKSwgcm93KDEsIDEpLCByb3coMSwgMSkpOwotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYiwgYmxvYkFzSW50KGludEFzQmxvYihiKSkgRlJPTSAlcyBXSEVSRSBhPT8gT1JERVIgQlkgYiBERVNDIiwgMCksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBiLCBibG9iX2FzX2ludChpbnRfYXNfYmxvYihiKSkgRlJPTSAlcyBXSEVSRSBhPT8gT1JERVIgQlkgYiBERVNDIiwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCAxKSwgcm93KDEsIDEpLCByb3coMSwgMSksIHJvdygwLCAwKSwgcm93KDAsIDApLCByb3coMCwgMCkpOwogCiAgICAgICAgICAgICAvLyBzZWxlY3QgYywgb3JkZXIgYnkgYgotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYmxvYkFzSW50KGludEFzQmxvYihjKSkgRlJPTSAlcyBXSEVSRSBhPT8gT1JERVIgQlkgYiBBU0MiLCAwKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGJsb2JfYXNfaW50KGludF9hc19ibG9iKGMpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIEFTQyIsIDApLAogICAgICAgICAgICAgICAgICAgICAgICByb3coMCksIHJvdygxKSwgcm93KDIpLCByb3coMCksIHJvdygxKSwgcm93KDIpKTsKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGJsb2JBc0ludChpbnRBc0Jsb2IoYykpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGIgREVTQyIsIDApLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IoYykpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGIgREVTQyIsIDApLAogICAgICAgICAgICAgICAgICAgICAgICByb3coMiksIHJvdygxKSwgcm93KDApLCByb3coMiksIHJvdygxKSwgcm93KDApKTsKIAogICAgICAgICAgICAgLy8gc2VsZWN0IGMsIG9yZGVyIGJ5IGIsIGMKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGJsb2JBc0ludChpbnRBc0Jsb2IoYykpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGIgQVNDLCBjIEFTQyIsIDApLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IoYykpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGIgQVNDLCBjIEFTQyIsIDApLAogICAgICAgICAgICAgICAgICAgICAgICByb3coMCksIHJvdygxKSwgcm93KDIpLCByb3coMCksIHJvdygxKSwgcm93KDIpKTsKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGJsb2JBc0ludChpbnRBc0Jsb2IoYykpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGIgREVTQywgYyBERVNDIiwgMCksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBibG9iX2FzX2ludChpbnRfYXNfYmxvYihjKSkgRlJPTSAlcyBXSEVSRSBhPT8gT1JERVIgQlkgYiBERVNDLCBjIERFU0MiLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KDIpLCByb3coMSksIHJvdygwKSwgcm93KDIpLCByb3coMSksIHJvdygwKSk7CiAKICAgICAgICAgICAgIC8vIHNlbGVjdCBkLCBvcmRlciBieSBiLCBjCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBibG9iQXNJbnQoaW50QXNCbG9iKGQpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIEFTQywgYyBBU0MiLCAwKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGJsb2JfYXNfaW50KGludF9hc19ibG9iKGQpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIEFTQywgYyBBU0MiLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KDApLCByb3coMSksIHJvdygyKSwgcm93KDMpLCByb3coNCksIHJvdyg1KSk7Ci0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBibG9iQXNJbnQoaW50QXNCbG9iKGQpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIERFU0MsIGMgREVTQyIsIDApLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IoZCkpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGIgREVTQywgYyBERVNDIiwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyg1KSwgcm93KDQpLCByb3coMyksIHJvdygyKSwgcm93KDEpLCByb3coMCkpOwogICAgICAgICB9KTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvU2VsZWN0U2luZ2xlQ29sdW1uUmVsYXRpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvU2VsZWN0U2luZ2xlQ29sdW1uUmVsYXRpb25UZXN0LmphdmEKaW5kZXggMTdjN2U4Ny4uYWUzMTZlMCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL1NlbGVjdFNpbmdsZUNvbHVtblJlbGF0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9TZWxlY3RTaW5nbGVDb2x1bW5SZWxhdGlvblRlc3QuamF2YQpAQCAtNTQxLDggKzU0MSw4IEBACiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkludmFsaWQgdW5zZXQgdmFsdWUgZm9yIGFyZ3VtZW50IGluIGNhbGwgdG8gZnVuY3Rpb24gdG9rZW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB0b2tlbihrKSA+PSB0b2tlbig/KSIsIHVuc2V0KCkpOwotICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiSW52YWxpZCB1bnNldCB2YWx1ZSBmb3IgYXJndW1lbnQgaW4gY2FsbCB0byBmdW5jdGlvbiBibG9iYXNpbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gYmxvYkFzSW50KD8pIiwgdW5zZXQoKSk7CisgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJJbnZhbGlkIHVuc2V0IHZhbHVlIGZvciBhcmd1bWVudCBpbiBjYWxsIHRvIGZ1bmN0aW9uIGJsb2JfYXNfaW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IGJsb2JfYXNfaW50KD8pIiwgdW5zZXQoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9TZWxlY3RUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvU2VsZWN0VGVzdC5qYXZhCmluZGV4IDdiYmFhODUuLjhlM2E3NTYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9TZWxlY3RUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL1NlbGVjdFRlc3QuamF2YQpAQCAtOTIzLDcgKzkyMyw3IEBACiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKQogICAgICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoPywgbm93KCkpIiwgaSk7CiAKLSAgICAgICAgZXhlY3V0ZSgiU0VMRUNUIGRhdGVPZih0KSBGUk9NICVzIik7CisgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCB0b190aW1lc3RhbXAodCkgRlJPTSAlcyIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTU5LDcgKzk1OSw3IEBACiAgICAgICAgIGFzc2VydFRydWUodHRsID09IDkgfHwgdHRsID09IDEwKTsKIAogICAgICAgICAvLyB0ZXN0IGFsaWFzaW5nIGEgcmVndWxhciBmdW5jdGlvbgotICAgICAgICBycyA9IGV4ZWN1dGUoIlNFTEVDVCBpbnRBc0Jsb2IoaWQpIEFTIGlkX2Jsb2IgRlJPTSAlcyBXSEVSRSBpZCA9IDAiKTsKKyAgICAgICAgcnMgPSBleGVjdXRlKCJTRUxFQ1QgaW50X2FzX2Jsb2IoaWQpIEFTIGlkX2Jsb2IgRlJPTSAlcyBXSEVSRSBpZCA9IDAiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJpZF9ibG9iIiwgcnMubWV0YWRhdGEoKS5nZXQoMCkubmFtZS50b1N0cmluZygpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVs0XSksIHJzLm9uZSgpLmdldEJsb2IocnMubWV0YWRhdGEoKS5nZXQoMCkubmFtZS50b1N0cmluZygpKSk7CiAKQEAgLTExMTAsNyArMTExMCw3IEBACiAgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKCBrIGludCwgdiBpbnQsIFBSSU1BUlkgS0VZIChrLCB2KSkiKTsKIAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgwLCAwKSIpOwotICAgICAgICAKKwogICAgICAgICBmbHVzaCgpOwogCiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHYgRlJPTSAlcyBXSEVSRSBrPTAgQU5EIHYgSU4gKDEsIDApIiksCkBAIC0xMjU1LDcgKzEyNTUsNyBAQAogICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBhID0gMiBBTkQgYiA9IDIiKTsKIAogICAgICAgICBiZWZvcmVBbmRBZnRlckZsdXNoKCgpIC0+IHsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAvLyBDaGVja3MgZmlsdGVyaW5nCiAgICAgICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZShTdGF0ZW1lbnRSZXN0cmljdGlvbnMuUkVRVUlSRVNfQUxMT1dfRklMVEVSSU5HX01FU1NBR0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBjID0gNCBBTkQgZCA9IDgiKTsKQEAgLTIzMjgsNyArMjMyOCw3IEBACiAgICAgICAgIC8vIFRlc3QgZm9yIENBU1NBTkRSQS0xMTMxMCBjb21wYXRpYmlsaXR5IHdpdGggMmkKICAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoYSB0ZXh0LCBiIGludCwgYyB0ZXh0LCBkIGludCwgUFJJTUFSWSBLRVkgKGEsIGIsIGMpKTsiKTsKICAgICAgICAgY3JlYXRlSW5kZXgoIkNSRUFURSBJTkRFWCBPTiAlcyhjKSIpOwotICAgICAgICAKKwogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYiwgYywgZCkgVkFMVUVTICg/LCA/LCA/LCA/KSIsICJhIiwgMCwgImIiLCAxKTsKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGEsIGIsIGMsIGQpIFZBTFVFUyAoPywgPywgPywgPykiLCAiYSIsIDEsICJiIiwgMik7CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChhLCBiLCBjLCBkKSBWQUxVRVMgKD8sID8sID8sID8pIiwgImEiLCAyLCAiYiIsIDMpOwpAQCAtMjUxMyw0OSArMjUxMyw0OSBAQAogCiAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewogCi0gICAgICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiS2V5IG1heSBub3QgYmUgZW1wdHkiLCAiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJycpOyIpOwotICAgICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIktleSBtYXkgbm90IGJlIGVtcHR5IiwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgSU4gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpOworICAgICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIktleSBtYXkgbm90IGJlIGVtcHR5IiwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJycpOyIpOworICAgICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIktleSBtYXkgbm90IGJlIGVtcHR5IiwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgSU4gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKTsiKTsKIAogICAgICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIktleSBtYXkgbm90IGJlIGVtcHR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpOwogCiAgICAgICAgICAgICAvLyBUZXN0IGNsdXN0ZXJpbmcgY29sdW1ucyByZXN0cmljdGlvbnMKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA9IHRleHRBc0Jsb2IoJycpOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjID0gdGV4dF9hc19ibG9iKCcnKTsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMpID0gKHRleHRBc0Jsb2IoJycpKTsiKSk7CisgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpID0gKHRleHRfYXNfYmxvYignJykpOyIpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgSU4gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyBJTiAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgSU4gKCh0ZXh0QXNCbG9iKCcnKSksICh0ZXh0QXNCbG9iKCcxJykpKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjKSBJTiAoKHRleHRfYXNfYmxvYignJykpLCAodGV4dF9hc19ibG9iKCcxJykpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRBc0Jsb2IoJycpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRfYXNfYmxvYignJyk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPiAodGV4dEFzQmxvYignJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpID4gKHRleHRfYXNfYmxvYignJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+PSB0ZXh0QXNCbG9iKCcnKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPj0gdGV4dF9hc19ibG9iKCcnKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjKSA+PSAodGV4dEFzQmxvYignJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpID49ICh0ZXh0X2FzX2Jsb2IoJycpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjIDw9IHRleHRBc0Jsb2IoJycpOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjIDw9IHRleHRfYXNfYmxvYignJyk7IikpOwogCi0gICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjKSA8PSAodGV4dEFzQmxvYignJykpOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPD0gKHRleHRfYXNfYmxvYignJykpOyIpKTsKIAotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjIDwgdGV4dEFzQmxvYignJyk7IikpOworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPCB0ZXh0X2FzX2Jsb2IoJycpOyIpKTsKIAotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPCAodGV4dEFzQmxvYignJykpOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPCAodGV4dF9hc19ibG9iKCcnKSk7IikpOwogCi0gICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgPiB0ZXh0QXNCbG9iKCcnKSBBTkQgYyA8IHRleHRBc0Jsb2IoJycpOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjID4gdGV4dF9hc19ibG9iKCcnKSBBTkQgYyA8IHRleHRfYXNfYmxvYignJyk7IikpOwogICAgICAgICB9KTsKIAogCkBAIC0yNTYzLDU5ICsyNTYzLDU5IEBACiAgICAgICAgICAgICAgICAgYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjQiKSk7CiAKICAgICAgICAgYmVmb3JlQW5kQWZ0ZXJGbHVzaCgoKSAtPiB7Ci0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA9IHRleHRBc0Jsb2IoJycpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA9IHRleHRfYXNfYmxvYignJyk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiNCIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPSAodGV4dEFzQmxvYignJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpID0gKHRleHRfYXNfYmxvYignJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjQiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyBJTiAodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjIElOICh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiNCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMpIElOICgodGV4dEFzQmxvYignJykpLCAodGV4dEFzQmxvYignMScpKSk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgSU4gKCh0ZXh0X2FzX2Jsb2IoJycpKSwgKHRleHRfYXNfYmxvYignMScpKSk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiNCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRBc0Jsb2IoJycpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRfYXNfYmxvYignJyk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPiAodGV4dEFzQmxvYignJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpID4gKHRleHRfYXNfYmxvYignJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+PSB0ZXh0QXNCbG9iKCcnKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPj0gdGV4dF9hc19ibG9iKCcnKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCI0IikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMpID49ICh0ZXh0QXNCbG9iKCcnKSk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPj0gKHRleHRfYXNfYmxvYignJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjQiKSksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjIDw9IHRleHRBc0Jsb2IoJycpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA8PSB0ZXh0X2FzX2Jsb2IoJycpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjQiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMpIDw9ICh0ZXh0QXNCbG9iKCcnKSk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPD0gKHRleHRfYXNfYmxvYignJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjQiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgPCB0ZXh0QXNCbG9iKCcnKTsiKSk7CisgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA8IHRleHRfYXNfYmxvYignJyk7IikpOwogCi0gICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjKSA8ICh0ZXh0QXNCbG9iKCcnKSk7IikpOworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjKSA8ICh0ZXh0X2FzX2Jsb2IoJycpKTsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+PSB0ZXh0QXNCbG9iKCcnKSBBTkQgYyA8IHRleHRBc0Jsb2IoJycpOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjID49IHRleHRfYXNfYmxvYignJykgQU5EIGMgPCB0ZXh0X2FzX2Jsb2IoJycpOyIpKTsKICAgICAgICAgfSk7CiAKICAgICAgICAgLy8gVGVzdCByZXN0cmljdGlvbnMgb24gbm9uLXByaW1hcnkga2V5IHZhbHVlCi0gICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgdiA9IHRleHRBc0Jsb2IoJycpIEFMTE9XIEZJTFRFUklORzsiKSk7CisgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCB2ID0gdGV4dF9hc19ibG9iKCcnKSBBTExPVyBGSUxURVJJTkc7IikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSIsCiAgICAgICAgICAgICAgICAgYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMyIpLCBFTVBUWV9CWVRFX0JVRkZFUik7CiAKICAgICAgICAgYmVmb3JlQW5kQWZ0ZXJGbHVzaCgoKSAtPiB7Ci0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgdiA9IHRleHRBc0Jsb2IoJycpIEFMTE9XIEZJTFRFUklORzsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIHYgPSB0ZXh0X2FzX2Jsb2IoJycpIEFMTE9XIEZJTFRFUklORzsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjMiKSwgRU1QVFlfQllURV9CVUZGRVIpKTsKICAgICAgICAgfSk7CiAgICAgfQpAQCAtMjYyOSw3NiArMjYyOSw3NiBAQAogCiAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewogCi0gICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dEFzQmxvYignJyk7IikpOworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dF9hc19ibG9iKCcnKTsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0QXNCbG9iKCcxJykgQU5EIGMyID0gdGV4dEFzQmxvYignJyk7IikpOworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dF9hc19ibG9iKCcxJykgQU5EIGMyID0gdGV4dF9hc19ibG9iKCcnKTsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPSAodGV4dEFzQmxvYignMScpLCB0ZXh0QXNCbG9iKCcnKSk7IikpOworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpID0gKHRleHRfYXNfYmxvYignMScpLCB0ZXh0X2FzX2Jsb2IoJycpKTsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjMSBJTiAodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSkgQU5EIGMyID0gdGV4dEFzQmxvYignMScpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYzEgSU4gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKSBBTkQgYzIgPSB0ZXh0X2FzX2Jsb2IoJzEnKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0QXNCbG9iKCcxJykgQU5EIGMyIElOICh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dF9hc19ibG9iKCcxJykgQU5EIGMyIElOICh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpIElOICgodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSksICh0ZXh0QXNCbG9iKCcxJyksIHRleHRBc0Jsb2IoJzEnKSkpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgSU4gKCh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSksICh0ZXh0X2FzX2Jsb2IoJzEnKSwgdGV4dF9hc19ibG9iKCcxJykpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgPiB0ZXh0QXNCbG9iKCcnKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID4gdGV4dF9hc19ibG9iKCcnKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dEFzQmxvYignMScpIEFORCBjMiA+IHRleHRBc0Jsb2IoJycpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTkQgYzIgPiB0ZXh0X2FzX2Jsb2IoJycpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPiAodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSA+ICh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA9IHRleHRBc0Jsb2IoJzEnKSBBTkQgYzIgPj0gdGV4dEFzQmxvYignJyk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA9IHRleHRfYXNfYmxvYignMScpIEFORCBjMiA+PSB0ZXh0X2FzX2Jsb2IoJycpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dEFzQmxvYignMScpIEFORCBjMiA8PSB0ZXh0QXNCbG9iKCcnKTsiKSk7CisgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTkQgYzIgPD0gdGV4dF9hc19ibG9iKCcnKTsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPD0gKHRleHRBc0Jsb2IoJzEnKSwgdGV4dEFzQmxvYignJykpOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSA8PSAodGV4dF9hc19ibG9iKCcxJyksIHRleHRfYXNfYmxvYignJykpOyIpKTsKICAgICAgICAgfSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjMSwgYzIsIHYpIFZBTFVFUyAoPywgPywgPywgPykiLAogICAgICAgICAgICAgICAgIGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCI0IikpOwogCiAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dEFzQmxvYignJyk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA9IHRleHRfYXNfYmxvYignJyk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiMSIpLCBieXRlcygiNCIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA9IHRleHRBc0Jsb2IoJycpIEFORCBjMiA9IHRleHRBc0Jsb2IoJzEnKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dF9hc19ibG9iKCcnKSBBTkQgYzIgPSB0ZXh0X2FzX2Jsb2IoJzEnKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCI0IikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpID0gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPSAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjQiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgSU4gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpIEFORCBjMiA9IHRleHRBc0Jsb2IoJzEnKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxIElOICh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSkgQU5EIGMyID0gdGV4dF9hc19ibG9iKCcxJyk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiMSIpLCBieXRlcygiNCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgSU4gKCh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKSwgKHRleHRBc0Jsb2IoJzEnKSwgdGV4dEFzQmxvYignMScpKSk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSBJTiAoKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKSwgKHRleHRfYXNfYmxvYignMScpLCB0ZXh0X2FzX2Jsb2IoJzEnKSkpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjQiKSksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpID4gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPiAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPj0gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPj0gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCI0IikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPD0gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPD0gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCI0IikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSA8ICh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKTsiKSk7CisgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPCAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpOyIpKTsKICAgICAgICAgfSk7CiAgICAgfQogCkBAIC0yNzIyLDE3ICsyNzIyLDE3IEBACiAKICAgICAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgPiB0ZXh0QXNCbG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRfYXNfYmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+PSB0ZXh0QXNCbG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+PSB0ZXh0X2FzX2Jsb2IoJycpIiArIG9yZGVyaW5nQ2xhdXNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjIDwgdGV4dEFzQmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA8IHRleHRfYXNfYmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA8PSB0ZXh0QXNCbG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSkpOworICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjIDw9IHRleHRfYXNfYmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpKTsKICAgICAgICAgICAgIH0pOwogCiAgICAgICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykiLApAQCAtMjc0MCwyMiArMjc0MCwyMiBAQAogCiAgICAgICAgICAgICBiZWZvcmVBbmRBZnRlckZsdXNoKCgpIC0+IHsKIAotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjIElOICh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyBJTiAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpIiArIG9yZGVyaW5nQ2xhdXNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCI0IikpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjID4gdGV4dEFzQmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPiB0ZXh0X2FzX2Jsb2IoJycpIiArIG9yZGVyaW5nQ2xhdXNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgPj0gdGV4dEFzQmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPj0gdGV4dF9hc19ibG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCI0IikpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA8IHRleHRBc0Jsb2IoJycpIiArIG9yZGVyaW5nQ2xhdXNlKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPCB0ZXh0X2FzX2Jsb2IoJycpIiArIG9yZGVyaW5nQ2xhdXNlKSk7CiAKLSAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA8PSB0ZXh0QXNCbG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA8PSB0ZXh0X2FzX2Jsb2IoJycpIiArIG9yZGVyaW5nQ2xhdXNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiNCIpKSk7CiAgICAgICAgICAgICB9KTsKICAgICAgICAgfQpAQCAtMjc3NSwxOSArMjc3NSwxOSBAQAogCiAgICAgICAgICAgICBiZWZvcmVBbmRBZnRlckZsdXNoKCgpIC0+IHsKIAotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA+IHRleHRBc0Jsb2IoJycpIiArIG9yZGVyaW5nQ2xhdXNlKSwKKyAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA+IHRleHRfYXNfYmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0QXNCbG9iKCcxJykgQU5EIGMyID4gdGV4dEFzQmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dF9hc19ibG9iKCcxJykgQU5EIGMyID4gdGV4dF9hc19ibG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSA+ICh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPiAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpIiArIG9yZGVyaW5nQ2xhdXNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dEFzQmxvYignMScpIEFORCBjMiA+PSB0ZXh0QXNCbG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTkQgYzIgPj0gdGV4dF9hc19ibG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpKTsKICAgICAgICAgICAgIH0pOwpAQCAtMjc5NywxOSArMjc5NywxOSBAQAogCiAgICAgICAgICAgICBiZWZvcmVBbmRBZnRlckZsdXNoKCgpIC0+IHsKIAotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjMSBJTiAodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSkgQU5EIGMyID0gdGV4dEFzQmxvYignMScpIiArIG9yZGVyaW5nQ2xhdXNlKSwKKyAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjMSBJTiAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpIEFORCBjMiA9IHRleHRfYXNfYmxvYignMScpIiArIG9yZGVyaW5nQ2xhdXNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCI0IikpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSBJTiAoKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpLCAodGV4dEFzQmxvYignMScpLCB0ZXh0QXNCbG9iKCcxJykpKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgSU4gKCh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSksICh0ZXh0X2FzX2Jsb2IoJzEnKSwgdGV4dF9hc19ibG9iKCcxJykpKSIgKyBvcmRlcmluZ0NsYXVzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiMSIpLCBieXRlcygiNCIpKSk7CiAKLSAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPiAodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSkiICsgb3JkZXJpbmdDbGF1c2UpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpID4gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKSIgKyBvcmRlcmluZ0NsYXVzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSA+PSAodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSkiICsgb3JkZXJpbmdDbGF1c2UpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpID49ICh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSkiICsgb3JkZXJpbmdDbGF1c2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiMSIpLCBieXRlcygiNCIpKSk7CkBAIC0zMTkxLDQgKzMxOTEsNDAgQEAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGsxLCBrMikgVkFMVUVTICh1dWlkKCksICdrMicpIik7CiAgICAgICAgIGFzc2VydFJvd0NvdW50KGV4ZWN1dGUoIlNFTEVDVCBzeXN0ZW0udG9rZW4oazEsIGsyKSBGUk9NICVzIiksIDEpOwogICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFF1b3RlZE1hcFRleHREYXRhKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAiICsgS0VZU1BBQ0UgKyAiLnQxIChpZCBpbnQsIGRhdGEgdGV4dCwgUFJJTUFSWSBLRVkgKGlkKSkiKTsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAiICsgS0VZU1BBQ0UgKyAiLnQyIChpZCBpbnQsIGRhdGEgbWFwPGludCwgdGV4dD4sIFBSSU1BUlkgS0VZIChpZCkpIik7CisKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gIiArIEtFWVNQQUNFICsgIi50MSAoaWQsIGRhdGEpIFZBTFVFUyAoMSwgJ0knJ20gbmV3YicpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICIgKyBLRVlTUEFDRSArICIudDIgKGlkLCBkYXRhKSBWQUxVRVMgKDEsIHsxOidJJydtIG5ld2InfSkiKTsKKworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBkYXRhIEZST00gIiArIEtFWVNQQUNFICsgIi50MSIpLCByb3coIkknbSBuZXdiIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBkYXRhIEZST00gIiArIEtFWVNQQUNFICsgIi50MiIpLCByb3coIG1hcCgxLCAiSSdtIG5ld2IiKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFF1b3RlZFNpbXBsZUNvbGxlY3Rpb25zRGF0YSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgIiArIEtFWVNQQUNFICsgIi50MyAoaWQgaW50LCBzZXRfZGF0YSBzZXQ8dGV4dD4sIGxpc3RfZGF0YSBsaXN0PHRleHQ+LCB0dXBsZV9kYXRhIHR1cGxlPGludCwgdGV4dD4sIFBSSU1BUlkgS0VZIChpZCkpIik7CisKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gIiArIEtFWVNQQUNFICsgIi50MyAoaWQsIHNldF9kYXRhLCBsaXN0X2RhdGEsIHR1cGxlX2RhdGEpIHZhbHVlcygxLCB7J0knJ20gbmV3Yid9LCBbJ0knJ20gbmV3YiddLCAoMSwgJ0knJ20gbmV3YicpKSIpOworCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHNldF9kYXRhIEZST00gIiArIEtFWVNQQUNFICsgIi50MyIpLCByb3coc2V0KCJJJ20gbmV3YiIpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGxpc3RfZGF0YSBGUk9NICIgKyBLRVlTUEFDRSArICIudDMiKSwgcm93KGxpc3QoIkknbSBuZXdiIikpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgdHVwbGVfZGF0YSBGUk9NICIgKyBLRVlTUEFDRSArICIudDMiKSwgcm93KHR1cGxlKDEsICJJJ20gbmV3YiIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVvdGVkVURURGF0YSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVR5cGUoIkNSRUFURSBUWVBFICIgKyBLRVlTUEFDRSArICIucmFuZG9tIChkYXRhIHRleHQpIik7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgIiArIEtFWVNQQUNFICsgIi50NCAoaWQgaW50LCB1ZHRfZGF0YSBmcm96ZW48cmFuZG9tPiwgUFJJTUFSWSBLRVkgKGlkKSkiKTsKKworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAiICsgS0VZU1BBQ0UgKyAiLnQ0IChpZCwgdWR0X2RhdGEpIHZhbHVlcygxLCB7ZGF0YTogJ0knJ20gbmV3Yid9KSIpOworCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHVkdF9kYXRhIEZST00gIiArIEtFWVNQQUNFICsgIi50NCIpLCByb3codXNlclR5cGUoInJhbmRvbSIsICJJJ20gbmV3YiIpKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL1RUTFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9UVExUZXN0LmphdmEKaW5kZXggOWVmMjUyMC4uN2I2NmUzMSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL1RUTFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvVFRMVGVzdC5qYXZhCkBAIC0yMSwxMiArMjEsMTEgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQXR0cmlidXRlczsKQEAgLTM2LDcgKzM1LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRXhwaXJhdGlvbkRhdGVPdmVyZmxvd0hhbmRsaW5nOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQWJzdHJhY3RDZWxsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5XaXRoUHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVNjcnViYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVJbnB1dFN0cmVhbVBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlT3V0cHV0U3RyZWFtUGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5TdGFuZGFsb25lU2NydWJiZXI7CkBAIC00NCw2ICs0Niw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuVG9vbFJ1bm5lci5Ub29sUmVzdWx0OwogaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX1VUSUxfQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1Q7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKQEAgLTM3OSw3ICszODIsNyBAQAogCiAgICAgICAgIGlmIChydW5TY3J1YikKICAgICAgICAgewotICAgICAgICAgICAgY2ZzLnNjcnViKHRydWUsIGZhbHNlLCB0cnVlLCByZWluc2VydE92ZXJmbG93ZWRUVEwsIDEpOworICAgICAgICAgICAgY2ZzLnNjcnViKHRydWUsIElTY3J1YmJlci5vcHRpb25zKCkuY2hlY2tEYXRhKCkucmVpbnNlcnRPdmVyZmxvd2VkVFRMUm93cyhyZWluc2VydE92ZXJmbG93ZWRUVEwpLmJ1aWxkKCksIDEpOwogCiAgICAgICAgICAgICBpZiAocmVpbnNlcnRPdmVyZmxvd2VkVFRMKQogICAgICAgICAgICAgewpAQCAtNDAyLDkgKzQwNSw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKHJ1blNTdGFibGVTY3J1YikKICAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlV0aWwuQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QsICJ0cnVlIik7IC8vIE5lY2Vzc2FyeSBmb3IgdGVzdGluZwotCi0gICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChURVNUX1VUSUxfQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QsIHRydWUpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIFRvb2xSZXN1bHQgdG9vbDsKICAgICAgICAgICAgICAgICBpZiAocmVpbnNlcnRPdmVyZmxvd2VkVFRMKQpAQCAtNDE5LDEwICs0MjAsNiBAQAogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJObyB2YWxpZCBwYXJ0aXRpb25zIGZvdW5kIHdoaWxlIHNjcnViYmluZyIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlV0aWwuQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QpOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgdHJ5CkBAIC00NzUsNCArNDcyLDQgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgICAgcmV0dXJuIGNsdXN0ZXJpbmcgPyBDT01QTEVYX0NMVVNURVJJTkcgOiBDT01QTEVYX05PQ0xVU1RFUklORzsKICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NlbGxUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2VsbFRlc3QuamF2YQppbmRleCA0MTAwYzU0Li4yNjBjZTk0IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2VsbFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2VsbFRlc3QuamF2YQpAQCAtNzYsNyArNzYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQobmFtZSwgZmFsc2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEuTk9fUE9TSVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEuS2luZC5SRUdVTEFSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5NZXRhZGF0YS5LaW5kLlJFR1VMQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9DbHVzdGVyaW5nQm91bmRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZ0JvdW5kVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGZjYzIwLi4wMDAwMDAwCi0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9DbHVzdGVyaW5nQm91bmRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiOwotCi1pbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIENsdXN0ZXJpbmdCb3VuZFRlc3QKLXsKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGFycmF5VG9wQW5kQm90dG9tKCkKLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKEFycmF5Q2x1c3RlcmluZ0JvdW5kLkJPVFRPTS5pc0JvdHRvbSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKEFycmF5Q2x1c3RlcmluZ0JvdW5kLkJPVFRPTS5pc1RvcCgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoQXJyYXlDbHVzdGVyaW5nQm91bmQuVE9QLmlzVG9wKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoQXJyYXlDbHVzdGVyaW5nQm91bmQuVE9QLmlzQm90dG9tKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgYnVmZmVyVG9wQW5kQm90dG9tKCkKLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZC5CT1RUT00uaXNCb3R0b20oKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShCdWZmZXJDbHVzdGVyaW5nQm91bmQuQk9UVE9NLmlzVG9wKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShCdWZmZXJDbHVzdGVyaW5nQm91bmQuVE9QLmlzVG9wKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoQnVmZmVyQ2x1c3RlcmluZ0JvdW5kLlRPUC5pc0JvdHRvbSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZ0hlYXBTaXplVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NsdXN0ZXJpbmdIZWFwU2l6ZVRlc3QuamF2YQppbmRleCBlOTdmMDY3Li4zYmE0YWU2IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZ0hlYXBTaXplVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9DbHVzdGVyaW5nSGVhcFNpemVUZXN0LmphdmEKQEAgLTYxLDYgKzYxLDIyIEBACiAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChtaW4pLmlzTGVzc1RoYW5PckVxdWFsVG8obWF4KTsKICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b25DbHVzdGVyaW5nSGVhcFNpemUoKQorICAgIHsKKyAgICAgICAgQ2x1c3RlcmluZzw/PiBjbHVzdGVyaW5nID0gdGhpcy5jbHVzdGVyaW5nLmFjY2Vzc29yKCkuZmFjdG9yeSgpLnN0YXRpY0NsdXN0ZXJpbmcoKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGNsdXN0ZXJpbmcudW5zaGFyZWRIZWFwU2l6ZSgpKQorICAgICAgICAgICAgICAgICAgLmlzRXF1YWxUbygwKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGNsdXN0ZXJpbmcudW5zaGFyZWRIZWFwU2l6ZUV4Y2x1ZGluZ0RhdGEoKSkKKyAgICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oMCk7CisKKyAgICAgICAgY2x1c3RlcmluZyA9IHRoaXMuY2x1c3RlcmluZy5hY2Nlc3NvcigpLmZhY3RvcnkoKS5jbHVzdGVyaW5nKCk7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChjbHVzdGVyaW5nLnVuc2hhcmVkSGVhcFNpemUoKSkKKyAgICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oMCk7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChjbHVzdGVyaW5nLnVuc2hhcmVkSGVhcFNpemVFeGNsdWRpbmdEYXRhKCkpCisgICAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKDApOworICAgIH0KKwogICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ7MH0iKQogICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gZGF0YSgpIHsKICAgICAgICAgYnl0ZVtdIHJhd0J5dGVzID0geyAwLCAxLCAyLCAzLCA0LCA1LCA2IH07CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZ1ByZWZpeFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9DbHVzdGVyaW5nUHJlZml4VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOTViMjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZ1ByZWZpeFRlc3QuamF2YQpAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkTG9jYWxSYW5kb207CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlQXJyYXlBY2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVCdWZmZXJBY2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlZhbHVlQWNjZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5JbW1lZGlhdGVGdXR1cmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5Lk1lbXRhYmxlUG9vbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuTmF0aXZlQWxsb2NhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5OYXRpdmVQb29sOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5TbGFiQWxsb2NhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5TbGFiUG9vbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgQ2x1c3RlcmluZ1ByZWZpeFRlc3QKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFycmF5VG9wQW5kQm90dG9tKCkKKyAgICB7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKEFycmF5Q2x1c3RlcmluZ0JvdW5kLkJPVFRPTS5pc0JvdHRvbSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKEFycmF5Q2x1c3RlcmluZ0JvdW5kLkJPVFRPTS5pc1RvcCgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoQXJyYXlDbHVzdGVyaW5nQm91bmQuVE9QLmlzVG9wKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoQXJyYXlDbHVzdGVyaW5nQm91bmQuVE9QLmlzQm90dG9tKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYnVmZmVyVG9wQW5kQm90dG9tKCkKKyAgICB7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZC5CT1RUT00uaXNCb3R0b20oKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShCdWZmZXJDbHVzdGVyaW5nQm91bmQuQk9UVE9NLmlzVG9wKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShCdWZmZXJDbHVzdGVyaW5nQm91bmQuVE9QLmlzVG9wKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoQnVmZmVyQ2x1c3RlcmluZ0JvdW5kLlRPUC5pc0JvdHRvbSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXRhaW5hYmxlQXJyYXkoKQorICAgIHsKKyAgICAgICAgdGVzdFJldGFpbmFibGUoQnl0ZUFycmF5QWNjZXNzb3IuaW5zdGFuY2UuZmFjdG9yeSgpLCB4IC0+IG5ldyBieXRlW11bXSB7eC5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KX0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJldGFpbmFibGVPbkhlYXAoKQorICAgIHsKKyAgICAgICAgdGVzdFJldGFpbmFibGUoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLmZhY3RvcnkoKSwgeCAtPiBuZXcgQnl0ZUJ1ZmZlcltdIHtCeXRlQnVmZmVyVXRpbC5ieXRlcyh4KX0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJldGFpbmFibGVPbkhlYXBTbGljZWQoKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgcHJlcGVuZCA9IDA7IHByZXBlbmQgPCAzOyArK3ByZXBlbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGFwcGVuZCA9IDA7IGFwcGVuZCA8IDM7ICsrYXBwZW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RSZXRhaW5hYmxlKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZS5mYWN0b3J5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2luZ0FsbG9jYXRvcihwcmVwZW5kLCBhcHBlbmQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgRnVuY3Rpb248U3RyaW5nLCBCeXRlQnVmZmVyW10+IHNsaWNpbmdBbGxvY2F0b3IoaW50IHByZXBlbmQsIGludCBhcHBlbmQpCisgICAgeworICAgICAgICByZXR1cm4geCAtPgorICAgICAgICB7CisgICAgICAgICAgICBCeXRlQnVmZmVyIGJ5dGVzID0gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoeCk7CisgICAgICAgICAgICBCeXRlQnVmZmVyIHNsaWNlZCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoYnl0ZXMucmVtYWluaW5nKCkgKyBwcmVwZW5kICsgYXBwZW5kKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJlcGVuZDsgKytpKQorICAgICAgICAgICAgICAgIHNsaWNlZC5wdXQoKGJ5dGUpIFRocmVhZExvY2FsUmFuZG9tLmN1cnJlbnQoKS5uZXh0SW50KCkpOworICAgICAgICAgICAgc2xpY2VkLnB1dChieXRlcyk7CisgICAgICAgICAgICBieXRlcy5mbGlwKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFwcGVuZDsgKytpKQorICAgICAgICAgICAgICAgIHNsaWNlZC5wdXQoKGJ5dGUpIFRocmVhZExvY2FsUmFuZG9tLmN1cnJlbnQoKS5uZXh0SW50KCkpOworICAgICAgICAgICAgc2xpY2VkLnBvc2l0aW9uKHByZXBlbmQpLmxpbWl0KHByZXBlbmQgKyBieXRlcy5yZW1haW5pbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVCdWZmZXJbXXsgc2xpY2VkLnNsaWNlKCkgfTsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXRhaW5hYmxlT2ZmSGVhcCgpCisgICAgeworICAgICAgICB0ZXN0UmV0YWluYWJsZShCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UuZmFjdG9yeSgpLCB4IC0+CisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgaCA9IEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKHgpOworICAgICAgICAgICAgQnl0ZUJ1ZmZlciB2ID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChoLnJlbWFpbmluZygpKTsKKyAgICAgICAgICAgIHYucHV0KGgpOworICAgICAgICAgICAgdi5mbGlwKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVCdWZmZXJbXSB7dn07CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJldGFpbmFibGVPbkhlYXBTbGFiKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uCisgICAgeworICAgICAgICB0ZXN0UmV0YWluYWJsZVNsYWIodHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmV0YWluYWJsZU9mZkhlYXBTbGFiKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uCisgICAgeworICAgICAgICB0ZXN0UmV0YWluYWJsZVNsYWIoZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXRhaW5hYmxlU2xhYihib29sZWFuIG9uSGVhcCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uCisgICAgeworICAgICAgICBNZW10YWJsZVBvb2wgcG9vbCA9IG5ldyBTbGFiUG9vbCgxTCA8PCAyNCwgb25IZWFwID8gMCA6IDFMIDw8IDI0LCAxLjBmLCAoKSAtPiBJbW1lZGlhdGVGdXR1cmUuc3VjY2VzcyhmYWxzZSkpOworICAgICAgICBTbGFiQWxsb2NhdG9yIGFsbG9jYXRvciA9ICgoU2xhYkFsbG9jYXRvcikgcG9vbC5uZXdBbGxvY2F0b3IoInRlc3QiKSk7CisgICAgICAgIGFzc2VydCAhYWxsb2NhdG9yLmFsbG9jYXRlKDEpLmlzRGlyZWN0KCkgPT0gb25IZWFwOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgdGVzdFJldGFpbmFibGUoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLmZhY3RvcnkoKSwgeCAtPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgaCA9IEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKHgpOworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgdiA9IGFsbG9jYXRvci5hbGxvY2F0ZShoLnJlbWFpbmluZygpKTsKKyAgICAgICAgICAgICAgICB2LnB1dChoKTsKKyAgICAgICAgICAgICAgICB2LmZsaXAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVCdWZmZXJbXSB7dn07CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIHBvb2wuc2h1dGRvd25BbmRXYWl0KDEwLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJldGFpbmFibGVOYXRpdmUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIE1lbXRhYmxlUG9vbCBwb29sID0gbmV3IE5hdGl2ZVBvb2woMUwgPDwgMjQsMUwgPDwgMjQsIDEuMGYsICgpIC0+IEltbWVkaWF0ZUZ1dHVyZS5zdWNjZXNzKGZhbHNlKSk7CisgICAgICAgIE5hdGl2ZUFsbG9jYXRvciBhbGxvY2F0b3IgPSAoTmF0aXZlQWxsb2NhdG9yKSBwb29sLm5ld0FsbG9jYXRvcigidGVzdCIpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgdGVzdFJldGFpbmFibGUoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLmZhY3RvcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLT4gbmV3IEJ5dGVCdWZmZXJbXSB7Qnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoeCl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtPiB4LmtpbmQoKSA9PSBDbHVzdGVyaW5nUHJlZml4LktpbmQuQ0xVU1RFUklORworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBOYXRpdmVDbHVzdGVyaW5nKGFsbG9jYXRvciwgbnVsbCwgKENsdXN0ZXJpbmc8Pz4pIHgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogeCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBwb29sLnNodXRkb3duQW5kV2FpdCgxMCwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgPFY+IHZvaWQgdGVzdFJldGFpbmFibGUoVmFsdWVBY2Nlc3Nvci5PYmplY3RGYWN0b3J5PFY+IGZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uPFN0cmluZywgVltdPiBhbGxvY2F0b3IpCisgICAgeworICAgICAgICB0ZXN0UmV0YWluYWJsZShmYWN0b3J5LCBhbGxvY2F0b3IsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyA8Vj4gdm9pZCB0ZXN0UmV0YWluYWJsZShWYWx1ZUFjY2Vzc29yLk9iamVjdEZhY3Rvcnk8Vj4gZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb248U3RyaW5nLCBWW10+IGFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb248Q2x1c3RlcmluZ1ByZWZpeDxWPiwgQ2x1c3RlcmluZ1ByZWZpeDxWPj4gbWFwcGVyKQorICAgIHsKKyAgICAgICAgQ2x1c3RlcmluZ1ByZWZpeDxWPltdIGNsdXN0ZXJpbmdzID0gbmV3IENsdXN0ZXJpbmdQcmVmaXhbXQorICAgICAgICB7CisgICAgICAgICAgICBmYWN0b3J5LmNsdXN0ZXJpbmcoKSwKKyAgICAgICAgICAgIGZhY3Rvcnkuc3RhdGljQ2x1c3RlcmluZygpLAorICAgICAgICAgICAgZmFjdG9yeS5jbHVzdGVyaW5nKGFsbG9jYXRvci5hcHBseSgidGVzdCIpKSwKKyAgICAgICAgICAgIGZhY3RvcnkuYm91bmQoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLklOQ0xfU1RBUlRfQk9VTkQsIGFsbG9jYXRvci5hcHBseSgidGVzdEEiKSksCisgICAgICAgICAgICBmYWN0b3J5LmJvdW5kKENsdXN0ZXJpbmdQcmVmaXguS2luZC5JTkNMX0VORF9CT1VORCwgYWxsb2NhdG9yLmFwcGx5KCJ0ZXN0QiIpKSwKKyAgICAgICAgICAgIGZhY3RvcnkuYm91bmQoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLkVYQ0xfU1RBUlRfQk9VTkQsIGFsbG9jYXRvci5hcHBseSgidGVzdEMiKSksCisgICAgICAgICAgICBmYWN0b3J5LmJvdW5kKENsdXN0ZXJpbmdQcmVmaXguS2luZC5FWENMX0VORF9CT1VORCwgYWxsb2NhdG9yLmFwcGx5KCJ0ZXN0RCIpKSwKKyAgICAgICAgICAgIGZhY3RvcnkuYm91bmRhcnkoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLkVYQ0xfRU5EX0lOQ0xfU1RBUlRfQk9VTkRBUlksIGFsbG9jYXRvci5hcHBseSgidGVzdEUiKSksCisgICAgICAgICAgICBmYWN0b3J5LmJvdW5kYXJ5KENsdXN0ZXJpbmdQcmVmaXguS2luZC5JTkNMX0VORF9FWENMX1NUQVJUX0JPVU5EQVJZLCBhbGxvY2F0b3IuYXBwbHkoInRlc3RGIikpLAorICAgICAgICB9OworCisgICAgICAgIGlmIChtYXBwZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIGNsdXN0ZXJpbmdzID0gQXJyYXlzLnN0cmVhbShjbHVzdGVyaW5ncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChtYXBwZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0FycmF5KENsdXN0ZXJpbmdQcmVmaXhbXTo6bmV3KTsKKworICAgICAgICB0ZXN0UmV0YWluYWJsZShjbHVzdGVyaW5ncyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJldGFpbmFibGUoQ2x1c3RlcmluZ1ByZWZpeDw/PltdIGNsdXN0ZXJpbmdzKQorICAgIHsKKyAgICAgICAgZm9yIChDbHVzdGVyaW5nUHJlZml4PD8+IGNsdXN0ZXJpbmcgOiBjbHVzdGVyaW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgQ2x1c3RlcmluZ1ByZWZpeDw/PiByZXRhaW5hYmxlID0gY2x1c3RlcmluZy5yZXRhaW5hYmxlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3RlcmluZywgcmV0YWluYWJsZSk7CisgICAgICAgICAgICBhc3NlcnRDbHVzdGVyaW5nSXNSZXRhaW5hYmxlKHJldGFpbmFibGUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0Q2x1c3RlcmluZ0lzUmV0YWluYWJsZShDbHVzdGVyaW5nUHJlZml4PD8+IGNsdXN0ZXJpbmcpCisgICAgeworICAgICAgICBpZiAoY2x1c3RlcmluZyBpbnN0YW5jZW9mIEFic3RyYWN0QXJyYXlDbHVzdGVyaW5nUHJlZml4KQorICAgICAgICAgICAgcmV0dXJuOyAvLyBoYXMgdG8gYmUgb24taGVhcCBhbmQgbWluaW1pemVkCisKKyAgICAgICAgYXNzZXJ0VHJ1ZShjbHVzdGVyaW5nIGluc3RhbmNlb2YgQWJzdHJhY3RCdWZmZXJDbHVzdGVyaW5nUHJlZml4KTsKKyAgICAgICAgQWJzdHJhY3RCdWZmZXJDbHVzdGVyaW5nUHJlZml4IGFiY2YgPSAoQWJzdHJhY3RCdWZmZXJDbHVzdGVyaW5nUHJlZml4KSBjbHVzdGVyaW5nOworICAgICAgICBCeXRlQnVmZmVyW10gYnVmZmVycyA9IGFiY2YuZ2V0QnVmZmVyQXJyYXkoKTsKKyAgICAgICAgZm9yIChCeXRlQnVmZmVyIGIgOiBidWZmZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShiLmlzRGlyZWN0KCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiLmhhc0FycmF5KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGIuY2FwYWNpdHkoKSwgYi5yZW1haW5pbmcoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYi5hcnJheU9mZnNldCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhiLmNhcGFjaXR5KCksIGIuYXJyYXkoKS5sZW5ndGgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NvbHVtbkZhbWlseVN0b3JlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NvbHVtbkZhbWlseVN0b3JlVGVzdC5qYXZhCmluZGV4IDRkODcxZmMuLjg4NTVjZWIgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Db2x1bW5GYW1pbHlTdG9yZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ29sdW1uRmFtaWx5U3RvcmVUZXN0LmphdmEKQEAgLTYzLDggKzYzLDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXgudHJhbnNhY3Rpb25zLlVwZGF0ZVRyYW5zYWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZWFkc0xpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2NydWJUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkc0xpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNsZWFyYWJsZUhpc3RvZ3JhbTsKQEAgLTIwMCw3ICsyMDIsNyBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZVN0YW5kYXJkUm93U3RpY2tzQWZ0ZXJGbHVzaCgpIHRocm93cyBUaHJvd2FibGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlU3RhbmRhcmRSb3dTdGlja3NBZnRlckZsdXNoKCkKICAgICB7CiAgICAgICAgIC8vIHRlc3QgdG8gbWFrZSBzdXJlIGZsdXNoaW5nIGFmdGVyIGEgZGVsZXRlIGRvZXNuJ3QgcmVzdXJyZWN0IGRlbHRlZCBjb2xzLgogICAgICAgICBTdHJpbmcga2V5c3BhY2VOYW1lID0gS0VZU1BBQ0UxOwpAQCAtMjU4LDcgKzI2MCw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJFcGhlbWVyYWxTbmFwc2hvdHMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgcHVibGljIHZvaWQgdGVzdENsZWFyRXBoZW1lcmFsU25hcHNob3RzKCkKICAgICB7CiAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UxKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDRl9JTkRFWDEpOwogCkBAIC0zNDcsOSArMzQ5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWVNQQUNFMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGX1NUQU5EQVJEMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVTU1RhYmxlLmRlc2NyaXB0b3IuaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlU1NUYWJsZS5kZXNjcmlwdG9yLmZvcm1hdFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZVNTVGFibGUuZGVzY3JpcHRvci52ZXJzaW9uLmZvcm1hdCk7CiAgICAgICAgICAgICBmb3IgKENvbXBvbmVudCBjIDogbGl2ZVNTVGFibGUuZ2V0Q29tcG9uZW50cygpKQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkNhbm5vdCBmaW5kIGJhY2tlZC11cCBmaWxlOiIgKyBkZXNjLmZpbGVuYW1lRm9yKGMpLCBuZXcgRmlsZShkZXNjLmZpbGVuYW1lRm9yKGMpKS5leGlzdHMoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2Fubm90IGZpbmQgYmFja2VkLXVwIGZpbGU6IiArIGRlc2MuZmlsZUZvcihjKSwgZGVzYy5maWxlRm9yKGMpLmV4aXN0cygpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTc4LDggKzU4MCw4IEBACiAKICAgICAgICAgU2V0PFN0cmluZz4gb3JpZ2luYWxGaWxlcyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgSXRlcmFibGVzLnRvTGlzdChjZnMuY29uY2F0V2l0aEluZGV4ZXMoKSkuc3RyZWFtKCkKLSAgICAgICAgICAgICAgICAgLmZsYXRNYXAoYyAtPiBjLmdldExpdmVTU1RhYmxlcygpLnN0cmVhbSgpLm1hcCh0IC0+IHQuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpKQotICAgICAgICAgICAgICAgICAuZm9yRWFjaChvcmlnaW5hbEZpbGVzOjphZGQpOworICAgICAgICAgICAgICAgICAuZmxhdE1hcChjIC0+IGMuZ2V0TGl2ZVNTVGFibGVzKCkuc3RyZWFtKCkubWFwKHQgLT4gdC5kZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKSkpCisgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGUgLT4gb3JpZ2luYWxGaWxlcy5hZGQoZS50b1N0cmluZygpKSk7CiAgICAgICAgIGFzc2VydFRoYXQob3JpZ2luYWxGaWxlcy5zdHJlYW0oKS5hbnlNYXRjaChmIC0+IGYuZW5kc1dpdGgoaW5kZXhUYWJsZUZpbGUpKSkuaXNUcnVlKCk7CiAgICAgICAgIGFzc2VydFRoYXQob3JpZ2luYWxGaWxlcy5zdHJlYW0oKS5hbnlNYXRjaChmIC0+IGYuZW5kc1dpdGgoYmFzZVRhYmxlRmlsZSkpKS5pc1RydWUoKTsKICAgICB9CkBAIC02NjcsOSArNjY5LDkgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNzVGFibGVzLnNpemUoKSk7CiAgICAgICAgIFNTVGFibGVSZWFkZXIgc3NUYWJsZSA9IHNzVGFibGVzLml0ZXJhdG9yKCkubmV4dCgpOwogCi0gICAgICAgIFN0cmluZyBkYXRhRmlsZU5hbWUgPSBzc1RhYmxlLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpOwotICAgICAgICBTdHJpbmcgdG1wRGF0YUZpbGVOYW1lID0gc3NUYWJsZS5kZXNjcmlwdG9yLnRtcEZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKTsKLSAgICAgICAgbmV3IEZpbGUoZGF0YUZpbGVOYW1lKS50cnlNb3ZlKG5ldyBGaWxlKHRtcERhdGFGaWxlTmFtZSkpOworICAgICAgICBGaWxlIGRhdGFGaWxlID0gc3NUYWJsZS5kZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKTsKKyAgICAgICAgRmlsZSB0bXBEYXRhRmlsZSA9IHNzVGFibGUuZGVzY3JpcHRvci50bXBGaWxlRm9yKENvbXBvbmVudHMuREFUQSk7CisgICAgICAgIGRhdGFGaWxlLnRyeU1vdmUodG1wRGF0YUZpbGUpOwogCiAgICAgICAgIHNzVGFibGUuc2VsZlJlZigpLnJlbGVhc2UoKTsKIApAQCAtNzAxLDYgKzcwMywxMTIgQEAKICAgICAgICAgewogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIHB1dChQYXJ0aXRpb25VcGRhdGUgdXBkYXRlLCBVcGRhdGVUcmFuc2FjdGlvbiBpbmRleGVyLCBHcm91cCBvcEdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIHBhcnRpdGlvbkNvdW50KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRMaXZlRGF0YVNpemUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZE1lbW9yeVVzYWdlVG8oTWVtb3J5VXNhZ2UgdXNhZ2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgbWFya0V4dHJhT25IZWFwVXNlZChsb25nIGFkZGl0aW9uYWxTcGFjZSwgR3JvdXAgb3BHcm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBtYXJrRXh0cmFPZmZIZWFwVXNlZChsb25nIGFkZGl0aW9uYWxTcGFjZSwgR3JvdXAgb3BHcm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgRmx1c2hhYmxlUGFydGl0aW9uU2V0PD8+IGdldEZsdXNoU2V0KFBhcnRpdGlvblBvc2l0aW9uIGZyb20sIFBhcnRpdGlvblBvc2l0aW9uIHRvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN3aXRjaE91dChCYXJyaWVyIHdyaXRlQmFycmllciwgQXRvbWljUmVmZXJlbmNlPENvbW1pdExvZ1Bvc2l0aW9uPiBjb21taXRMb2dVcHBlckJvdW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRpc2NhcmQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdHMoR3JvdXAgb3BHcm91cCwgQ29tbWl0TG9nUG9zaXRpb24gY29tbWl0TG9nUG9zaXRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBDb21taXRMb2dQb3NpdGlvbiBnZXRBcHByb3hpbWF0ZUNvbW1pdExvZ0xvd2VyQm91bmQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBDb21taXRMb2dQb3NpdGlvbiBnZXRDb21taXRMb2dMb3dlckJvdW5kKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgTGFzdENvbW1pdExvZ1Bvc2l0aW9uIGdldEZpbmFsQ29tbWl0TG9nVXBwZXJCb3VuZCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gbWF5Q29udGFpbkRhdGFCZWZvcmUoQ29tbWl0TG9nUG9zaXRpb24gcG9zaXRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2xlYW4oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRTd2l0Y2goRmx1c2hSZWFzb24gcmVhc29uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBtZXRhZGF0YVVwZGF0ZWQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGxvY2FsUmFuZ2VzVXBkYXRlZCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcGVyZm9ybVNuYXBzaG90KFN0cmluZyBzbmFwc2hvdE5hbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciByb3dJdGVyYXRvcihEZWNvcmF0ZWRLZXkga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbGljZXMgc2xpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5GaWx0ZXIgY29sdW1uRmlsdGVyLApAQCAtNzE2LDExMyArODI0LDYgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzd2l0Y2hPdXQoQmFycmllciB3cml0ZUJhcnJpZXIsIEF0b21pY1JlZmVyZW5jZTxDb21taXRMb2dQb3NpdGlvbj4gY29tbWl0TG9nVXBwZXJCb3VuZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRTd2l0Y2goRmx1c2hSZWFzb24gcmVhc29uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgbG9uZyBwdXQoUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSwgVXBkYXRlVHJhbnNhY3Rpb24gaW5kZXhlciwgR3JvdXAgb3BHcm91cCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwZXJmb3JtU25hcHNob3QoU3RyaW5nIHNuYXBzaG90TmFtZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgbG9uZyBwYXJ0aXRpb25Db3VudCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgbWV0YWRhdGFVcGRhdGVkKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXlDb250YWluRGF0YUJlZm9yZShDb21taXRMb2dQb3NpdGlvbiBwb3NpdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgbWFya0V4dHJhT25IZWFwVXNlZChsb25nIGFkZGl0aW9uYWxTcGFjZSwgR3JvdXAgb3BHcm91cCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtYXJrRXh0cmFPZmZIZWFwVXNlZChsb25nIGFkZGl0aW9uYWxTcGFjZSwgR3JvdXAgb3BHcm91cCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBsb2NhbFJhbmdlc1VwZGF0ZWQoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2xlYW4oKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRMaXZlRGF0YVNpemUoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBGbHVzaGFibGVQYXJ0aXRpb25TZXQ8Pz4gZ2V0Rmx1c2hTZXQoUGFydGl0aW9uUG9zaXRpb24gZnJvbSwgUGFydGl0aW9uUG9zaXRpb24gdG8pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBMYXN0Q29tbWl0TG9nUG9zaXRpb24gZ2V0RmluYWxDb21taXRMb2dVcHBlckJvdW5kKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ29tbWl0TG9nUG9zaXRpb24gZ2V0Q29tbWl0TG9nTG93ZXJCb3VuZCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1pdExvZ1Bvc2l0aW9uIGdldEFwcHJveGltYXRlQ29tbWl0TG9nTG93ZXJCb3VuZCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgZGlzY2FyZCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkTWVtb3J5VXNhZ2VUbyhNZW1vcnlVc2FnZSB1c2FnZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHRzKEdyb3VwIG9wR3JvdXAsIENvbW1pdExvZ1Bvc2l0aW9uIGNvbW1pdExvZ1Bvc2l0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ29sdW1uc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Db2x1bW5zVGVzdC5qYXZhCmluZGV4IDM3ZWRjYmMuLjRjOGJjYzAgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Db2x1bW5zVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Db2x1bW5zVGVzdC5qYXZhCkBAIC00OTYsNyArNDk2LDcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIENvbHVtbk1ldGFkYXRhIGRlZihTdHJpbmcgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHR5cGUsIENvbHVtbk1ldGFkYXRhLktpbmQga2luZCkKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoVEFCTEVfTUVUQURBVEEsIGJ5dGVzKG5hbWUpLCB0eXBlLCBDb2x1bW5NZXRhZGF0YS5OT19QT1NJVElPTiwga2luZCk7CisgICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoVEFCTEVfTUVUQURBVEEsIGJ5dGVzKG5hbWUpLCB0eXBlLCBDb2x1bW5NZXRhZGF0YS5OT19QT1NJVElPTiwga2luZCwgbnVsbCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgVGFibGVNZXRhZGF0YSBtb2NrKENvbHVtbnMgY29sdW1ucykKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Db3JydXB0UHJpbWFyeUluZGV4VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NvcnJ1cHRQcmltYXJ5SW5kZXhUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE5ZjlmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Db3JydXB0UHJpbWFyeUluZGV4VGVzdC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5VbnR5cGVkUmVzdWx0U2V0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmZpbGVzeXN0ZW0uTGlzdGVuYWJsZUZpbGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db3JydXB0U1NUYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5idGkuQnRpRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdFRocm93bkJ5OworCitwdWJsaWMgY2xhc3MgQ29ycnVwdFByaW1hcnlJbmRleFRlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIuSW5NZW1vcnkKK3sKKyAgICBwcm90ZWN0ZWQgTGlzdGVuYWJsZUZpbGVTeXN0ZW0uUGF0aEZpbHRlciBpc0N1cnJlbnRUYWJsZUluZGV4RmlsZShTdHJpbmcga2V5c3BhY2UsIFN0cmluZyBlbmRzV2l0aCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXRoIC0+IHsKKyAgICAgICAgICAgIGlmICghcGF0aC5nZXRGaWxlTmFtZSgpLnRvU3RyaW5nKCkuZW5kc1dpdGgoZW5kc1dpdGgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzYyA9IERlc2NyaXB0b3IuZnJvbUZpbGUobmV3IEZpbGUocGF0aCkpOworICAgICAgICAgICAgaWYgKCFkZXNjLmtzbmFtZS5lcXVhbHMoa2V5c3BhY2UpICYmIGRlc2MuY2ZuYW1lLmVxdWFscyhjdXJyZW50VGFibGUoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH07CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBiaWdQcmltYXJ5SW5kZXhEb2VzTm90RGV0ZWN0RGlza0NvcnJ1cHRpb24oKQorICAgIHsKKyAgICAgICAgLy8gU2V0IGxpc3RlbmVyIGVhcmx5LCBiZWZvcmUgdGhlIGZpbGUgaXMgb3BlbmVkOyBtbWFwIGFjY2VzcyBjYW4gbm90IGJlIGxpc3RlbmVkIHRvLCBzbyBuZWVkIHRvIG9ic2VydmUgdGhlIG9wZW4sIHdoaWNoIGhhcHBlbnMgb24gZmx1c2gKKyAgICAgICAgaWYgKEJpZ0Zvcm1hdC5pc1NlbGVjdGVkKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZzLm9uUG9zdFJlYWQoaXNDdXJyZW50VGFibGVJbmRleEZpbGUoa2V5c3BhY2UoKSwgIkluZGV4LmRiIiksIChwYXRoLCBjaGFubmVsLCBwb3NpdGlvbiwgZHN0LCByZWFkKSAtPiB7CisgICAgICAgICAgICAgICAgLy8gUmVhZGluZyB0aGUgUHJpbWFyeSBpbmRleCBmb3IgdGhlIHRlc3QhCisgICAgICAgICAgICAgICAgLy8gZm9ybWF0CisgICAgICAgICAgICAgICAgLy8gMiBieXRlczogbGVuZ3RoIG9mIGJ5dGVzIGZvciBQSworICAgICAgICAgICAgICAgIC8vIDQgYnl0ZXM6IHBrIGFzIGFuIGludDMyCisgICAgICAgICAgICAgICAgLy8gdmFyaWFibGUgYnl0ZXMgKHNlZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuUm93SW5kZXhFbnRyeS5JbmRleFNlcmlhbGl6ZXIuZGVzZXJpYWxpemUob3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlRGF0YUlucHV0KSkKKyAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KHBvc2l0aW9uKS5kZXNjcmliZWRBcygiVW5leHBlY3RlZCBhY2Nlc3MsIHNob3VsZCBzdGFydCByZWFkIGZyb20gc3RhcnQgb2YgZmlsZSIpLmlzRXF1YWxUbygwKTsKKworICAgICAgICAgICAgICAgIC8vIHNpbXVsYXRlIGJpdCByb3QgYnkgaGF2aW5nIDEgYnl0ZSBjaGFuZ2UuLi4gYnV0IG1ha2Ugc3VyZSBpdCdzIHRoZSBwayEKKyAgICAgICAgICAgICAgICBkc3QucHV0KDIsIEJ5dGUuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEJ0aUZvcm1hdC5pc1NlbGVjdGVkKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZzLm9uUG9zdFJlYWQoaXNDdXJyZW50VGFibGVJbmRleEZpbGUoa2V5c3BhY2UoKSwgIlBhcnRpdGlvbnMuZGIiKSwgKHBhdGgsIGNoYW5uZWwsIHBvc2l0aW9uLCBkc3QsIHJlYWQpIC0+IHsKKyAgICAgICAgICAgICAgICAvLyBzaW11bGF0ZSBiaXQgcm90IGJ5IGhhdmluZyAxIGJ5dGUgY2hhbmdlLi4uCisgICAgICAgICAgICAgICAgLy8gZmlyc3QgcmVhZCBzaG91bGQgYmUgaW4gdGhlIGZvb3RlciAtLSBnaXZlIGl0IGFuIGludmFsaWQgcm9vdCBwb3NpdGlvbgorICAgICAgICAgICAgICAgIC8vIFRPRE86IENoYW5nZSB0aGlzIHRvIG1vZGlmeSBzb21ldGhpbmcgaW4gYSBtb3JlIHVuZGV0ZWN0YWJsZSBwb3NpdGlvbiBpbiB0aGUgZmlsZSB3aGVuIGNoZWNrc3VtbWluZyBpcyBpbXBsZW1lbnRlZAorICAgICAgICAgICAgICAgIGRzdC5wdXQoMiwgQnl0ZS5NQVhfVkFMVUUpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgVXRpbC50ZXN0TXVzdEJlSW1wbGVtZW50ZWRGb3JTU1RhYmxlRm9ybWF0KCk7CisKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoaWQgaW50IFBSSU1BUlkgS0VZLCB2YWx1ZSBpbnQpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChpZCwgdmFsdWUpIFZBTFVFUyAoPywgPykiLCAwLCAwKTsKKyAgICAgICAgZmx1c2goKTsKKworICAgICAgICBpZiAoQmlnRm9ybWF0LmlzU2VsZWN0ZWQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgVW50eXBlZFJlc3VsdFNldCBycyA9IGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9PyIsIDApOworICAgICAgICAgICAgLy8gdGhpcyBhc3NlcnQgY2hlY2sgaXMgaGVyZSB0byBnZXQgdGhlIHRlc3QgdG8gYmUgZ3JlZW4uLi4gaWYgdGhlIGZvcm1hdCBpcyBmaXhlZCBhbmQgdGhpcyBkYXRhIGxvc3MgaXMgbm90CisgICAgICAgICAgICAvLyBoYXBwZW5pbmcgYW55bW9yZSwgdGhlbiB0aGlzIGNoZWNrIHNob3VsZCBiZSB1cGRhdGVkCisgICAgICAgICAgICBhc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gYXNzZXJ0Um93cyhycywgcm93KDAsIDApKSkuaGFzTWVzc2FnZSgiR290IGxlc3Mgcm93cyB0aGFuIGV4cGVjdGVkLiBFeHBlY3RlZCAxIGJ1dCBnb3QgMCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9PyIsIDApKS5pc0luc3RhbmNlT2YoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0RpcmVjdG9yaWVzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0RpcmVjdG9yaWVzVGVzdC5qYXZhCmluZGV4IGM3MDE1MTYuLjcxYTQ5Y2YgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9EaXJlY3Rvcmllc1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvRGlyZWN0b3JpZXNUZXN0LmphdmEKQEAgLTE4LDggKzE4LDExIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVTdG9yZTsKIGltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5GaWxlQXR0cmlidXRlVmlldzsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5GaWxlU3RvcmVBdHRyaWJ1dGVWaWV3OwogaW1wb3J0IGphdmEudGltZS5JbnN0YW50OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKQEAgLTMzLDE3ICszNiwxNyBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlsczsKLQogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpAQCAtNTIsNyArNTUsNiBAQAogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIGltcG9ydCBvcmcuc2xmNGouTURDOwogLy8gT3VyIHZlcnNpb24gb2YgU2ZsNGogc2VlbXMgdG8gYmUgbWlzc2luZyB0aGUgTGlzdEFwcGVuZGVyIGNsYXNzLgpAQCAtNjMsNiArNjUsNyBAQAogaW1wb3J0IGNoLnFvcy5sb2diYWNrLmNsYXNzaWMuc3BpLklMb2dnaW5nRXZlbnQ7CiBpbXBvcnQgY2gucW9zLmxvZ2JhY2suY29yZS5yZWFkLkxpc3RBcHBlbmRlcjsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5BdXRoS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZy5EaXNrRmFpbHVyZVBvbGljeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwpAQCAtNzksNyArODIsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZUlkOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2VxdWVuY2VCYXNlZFNTVGFibGVJZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlVVSURCYXNlZFNTVGFibGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQuQ29tcG9uZW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlT3V0cHV0U3RyZWFtUGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKQEAgLTExMCwxNSArMTEzLDI0IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJGYWtlVGFibGUiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNOQVBTSE9UMSA9ICJzbmFwc2hvdDEiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNOQVBTSE9UMiA9ICJzbmFwc2hvdDIiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNOQVBTSE9UMyA9ICJzbmFwc2hvdDMiOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX1NOQVBTSE9UX05BTUUgPSAiNDIiOworCisKICAgICBwcml2YXRlIHN0YXRpYyBGaWxlIHRlbXBEYXRhRGlyOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLUyA9ICJrcyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gVEFCTEVTOwogICAgIHByaXZhdGUgc3RhdGljIFNldDxUYWJsZU1ldGFkYXRhPiBDRk07CiAgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgTGlzdDxGaWxlPj4gc3N0YWJsZXNCeVRhYmxlTmFtZTsKIAotICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcigwKQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRENJRCA9ICJ0ZXN0LURpcmVjdG9yaWVzVGVzdC1pZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgQXRvbWljSW50ZWdlciBkaXlUaHJlYWRJZCA9IG5ldyBBdG9taWNJbnRlZ2VyKDEpOworICAgIHByaXZhdGUgaW50IG15RGl5SWQgPSAtMTsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyOworICAgIHByaXZhdGUgTGlzdEFwcGVuZGVyPElMb2dnaW5nRXZlbnQ+IGxpc3RBcHBlbmRlcjsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcgogICAgIHB1YmxpYyBTU1RhYmxlSWQuQnVpbGRlcjw/IGV4dGVuZHMgU1NUYWJsZUlkPiBpZEJ1aWxkZXI7CiAKICAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoMSkKQEAgLTEzMSwxMyArMTQzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBVVUlEQmFzZWRTU1RhYmxlSWQuQnVpbGRlci5pbnN0YW5jZSwgVXRpbC5uZXdVVUlER2VuKCkgfSk7CiAgICAgfQogCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTURDSUQgPSAidGVzdC1EaXJlY3Rvcmllc1Rlc3QtaWQiOwotICAgIHByaXZhdGUgc3RhdGljIEF0b21pY0ludGVnZXIgZGl5VGhyZWFkSWQgPSBuZXcgQXRvbWljSW50ZWdlcigxKTsKLSAgICBwcml2YXRlIGludCBteURpeUlkID0gLTE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlcjsKLSAgICBwcml2YXRlIExpc3RBcHBlbmRlcjxJTG9nZ2luZ0V2ZW50PiBsaXN0QXBwZW5kZXI7Ci0KICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKQogICAgIHsKQEAgLTE3Miw3ICsxNzcsNyBAQAogICAgIEBBZnRlckNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGFmdGVyQ2xhc3MoKQogICAgIHsKLSAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZVJlY3Vyc2l2ZSh0ZW1wRGF0YURpcik7CisgICAgICAgIHRlbXBEYXRhRGlyLmRlbGV0ZVJlY3Vyc2l2ZSgpOwogICAgIH0KIAogICAgIEBBZnRlcgpAQCAtMTg2LDE3ICsxOTEsNyBAQAogICAgICAgICByZXR1cm4gbmV3IERhdGFEaXJlY3RvcnlbXSB7IG5ldyBEYXRhRGlyZWN0b3J5KGxvY2F0aW9uKSB9OwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIERhdGFEaXJlY3RvcnlbXSB0b0RhdGFEaXJlY3RvcmllcyhGaWxlW10gbG9jYXRpb25zKQotICAgIHsKLSAgICAgICAgRGF0YURpcmVjdG9yeVtdIGRpcnMgPSBuZXcgRGF0YURpcmVjdG9yeVtsb2NhdGlvbnMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxvY2F0aW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZGlyc1tpXSA9IG5ldyBEYXRhRGlyZWN0b3J5KGxvY2F0aW9uc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRpcnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RGaWxlcygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RmlsZXMoKQogICAgIHsKICAgICAgICAgZm9yIChUYWJsZU1ldGFkYXRhIGNmbSA6IENGTSkKICAgICAgICAgewpAQCAtMjE4LDI1ICsyMTMsMjcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGNsYXNzIEZha2VTbmFwc2hvdCB7CisgICAgc3RhdGljIGNsYXNzIEZha2VTbmFwc2hvdCB7CiAgICAgICAgIGZpbmFsIFRhYmxlTWV0YWRhdGEgdGFibGU7CiAgICAgICAgIGZpbmFsIFN0cmluZyB0YWc7CiAgICAgICAgIGZpbmFsIEZpbGUgc25hcHNob3REaXI7CiAgICAgICAgIGZpbmFsIFNuYXBzaG90TWFuaWZlc3QgbWFuaWZlc3Q7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZXBoZW1lcmFsOwogCi0gICAgICAgIEZha2VTbmFwc2hvdChUYWJsZU1ldGFkYXRhIHRhYmxlLCBTdHJpbmcgdGFnLCBGaWxlIHNuYXBzaG90RGlyLCBTbmFwc2hvdE1hbmlmZXN0IG1hbmlmZXN0KQorICAgICAgICBGYWtlU25hcHNob3QoVGFibGVNZXRhZGF0YSB0YWJsZSwgU3RyaW5nIHRhZywgRmlsZSBzbmFwc2hvdERpciwgU25hcHNob3RNYW5pZmVzdCBtYW5pZmVzdCwgYm9vbGVhbiBlcGhlbWVyYWwpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXMudGFibGUgPSB0YWJsZTsKICAgICAgICAgICAgIHRoaXMudGFnID0gdGFnOwogICAgICAgICAgICAgdGhpcy5zbmFwc2hvdERpciA9IHNuYXBzaG90RGlyOwogICAgICAgICAgICAgdGhpcy5tYW5pZmVzdCA9IG1hbmlmZXN0OworICAgICAgICAgICAgdGhpcy5lcGhlbWVyYWwgPSBlcGhlbWVyYWw7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgVGFibGVTbmFwc2hvdCBhc1RhYmxlU25hcHNob3QoKQogICAgICAgICB7CiAgICAgICAgICAgICBJbnN0YW50IGNyZWF0ZWRBdCA9IG1hbmlmZXN0ID09IG51bGwgPyBudWxsIDogbWFuaWZlc3QuY3JlYXRlZEF0OwogICAgICAgICAgICAgSW5zdGFudCBleHBpcmVzQXQgPSBtYW5pZmVzdCA9PSBudWxsID8gbnVsbCA6IG1hbmlmZXN0LmV4cGlyZXNBdDsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVTbmFwc2hvdCh0YWJsZS5rZXlzcGFjZSwgdGFibGUubmFtZSwgdGFibGUuaWQuYXNVVUlEKCksIHRhZywgY3JlYXRlZEF0LCBleHBpcmVzQXQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihzbmFwc2hvdERpcikpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZVNuYXBzaG90KHRhYmxlLmtleXNwYWNlLCB0YWJsZS5uYW1lLCB0YWJsZS5pZC5hc1VVSUQoKSwgdGFnLCBjcmVhdGVkQXQsIGV4cGlyZXNBdCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKHNuYXBzaG90RGlyKSwgZXBoZW1lcmFsKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjQ4LDM5ICsyNDUsNDMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgRmFrZVNuYXBzaG90IGNyZWF0ZUZha2VTbmFwc2hvdChUYWJsZU1ldGFkYXRhIHRhYmxlLCBTdHJpbmcgdGFnLCBib29sZWFuIGNyZWF0ZU1hbmlmZXN0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICBwdWJsaWMgRmFrZVNuYXBzaG90IGNyZWF0ZUZha2VTbmFwc2hvdChUYWJsZU1ldGFkYXRhIHRhYmxlLCBTdHJpbmcgdGFnLCBib29sZWFuIGNyZWF0ZU1hbmlmZXN0LCBib29sZWFuIGVwaGVtZXJhbCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBGaWxlIHRhYmxlRGlyID0gY2ZEaXIodGFibGUpOwogICAgICAgICB0YWJsZURpci50cnlDcmVhdGVEaXJlY3RvcmllcygpOwogICAgICAgICBGaWxlIHNuYXBzaG90RGlyID0gbmV3IEZpbGUodGFibGVEaXIsIERpcmVjdG9yaWVzLlNOQVBTSE9UX1NVQkRJUiArIEZpbGUucGF0aFNlcGFyYXRvcigpICsgdGFnKTsKICAgICAgICAgc25hcHNob3REaXIudHJ5Q3JlYXRlRGlyZWN0b3JpZXMoKTsKIAotICAgICAgICBEZXNjcmlwdG9yIHNzdGFibGVEZXNjID0gbmV3IERlc2NyaXB0b3Ioc25hcHNob3REaXIsIEtTLCB0YWJsZS5uYW1lLCBzc3RhYmxlSWQoMSksIFNTVGFibGVGb3JtYXQuVHlwZS5CSUcpOworICAgICAgICBEZXNjcmlwdG9yIHNzdGFibGVEZXNjID0gbmV3IERlc2NyaXB0b3Ioc25hcHNob3REaXIsIEtTLCB0YWJsZS5uYW1lLCBzc3RhYmxlSWQoMSksIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSk7CiAgICAgICAgIGNyZWF0ZUZha2VTU1RhYmxlKHNzdGFibGVEZXNjKTsKIAogICAgICAgICBTbmFwc2hvdE1hbmlmZXN0IG1hbmlmZXN0ID0gbnVsbDsKICAgICAgICAgaWYgKGNyZWF0ZU1hbmlmZXN0KQogICAgICAgICB7CiAgICAgICAgICAgICBGaWxlIG1hbmlmZXN0RmlsZSA9IERpcmVjdG9yaWVzLmdldFNuYXBzaG90TWFuaWZlc3RGaWxlKHNuYXBzaG90RGlyKTsKLSAgICAgICAgICAgIG1hbmlmZXN0ID0gbmV3IFNuYXBzaG90TWFuaWZlc3QoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChzc3RhYmxlRGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpLCBuZXcgRHVyYXRpb25TcGVjLkludFNlY29uZHNCb3VuZCgiMW0iKSwgbm93KCkpOworICAgICAgICAgICAgbWFuaWZlc3QgPSBuZXcgU25hcHNob3RNYW5pZmVzdChDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHNzdGFibGVEZXNjLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKS5hYnNvbHV0ZVBhdGgoKSksIG5ldyBEdXJhdGlvblNwZWMuSW50U2Vjb25kc0JvdW5kKCIxbSIpLCBub3coKSwgZXBoZW1lcmFsKTsKICAgICAgICAgICAgIG1hbmlmZXN0LnNlcmlhbGl6ZVRvSnNvbkZpbGUobWFuaWZlc3RGaWxlKTsKICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChlcGhlbWVyYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVzLmNyZWF0ZUZpbGUoc25hcHNob3REaXIudG9QYXRoKCkucmVzb2x2ZSgiZXBoZW1lcmFsLnNuYXBzaG90IikpOworICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIG5ldyBGYWtlU25hcHNob3QodGFibGUsIHRhZywgc25hcHNob3REaXIsIG1hbmlmZXN0KTsKKyAgICAgICAgcmV0dXJuIG5ldyBGYWtlU25hcHNob3QodGFibGUsIHRhZywgc25hcHNob3REaXIsIG1hbmlmZXN0LCBlcGhlbWVyYWwpOwogICAgIH0KIAogICAgIHByaXZhdGUgTGlzdDxGaWxlPiBjcmVhdGVGYWtlU1NUYWJsZShGaWxlIGRpciwgU3RyaW5nIGNmLCBpbnQgZ2VuKQogICAgIHsKLSAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gbmV3IERlc2NyaXB0b3IoZGlyLCBLUywgY2YsIHNzdGFibGVJZChnZW4pLCBTU1RhYmxlRm9ybWF0LlR5cGUuQklHKTsKKyAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gbmV3IERlc2NyaXB0b3IoZGlyLCBLUywgY2YsIHNzdGFibGVJZChnZW4pLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkpOwogICAgICAgICByZXR1cm4gY3JlYXRlRmFrZVNTVGFibGUoZGVzYyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBMaXN0PEZpbGU+IGNyZWF0ZUZha2VTU1RhYmxlKERlc2NyaXB0b3IgZGVzYykKICAgICB7CiAgICAgICAgIExpc3Q8RmlsZT4gY29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3Q8PigzKTsKLSAgICAgICAgZm9yIChDb21wb25lbnQgYyA6IG5ldyBDb21wb25lbnRbXXsgQ29tcG9uZW50LkRBVEEsIENvbXBvbmVudC5QUklNQVJZX0lOREVYLCBDb21wb25lbnQuRklMVEVSIH0pCisgICAgICAgIGZvciAoQ29tcG9uZW50IGMgOiBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkudXBsb2FkQ29tcG9uZW50cygpKQogICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShkZXNjLmZpbGVuYW1lRm9yKGMpKTsKKyAgICAgICAgICAgIEZpbGUgZiA9IGRlc2MuZmlsZUZvcihjKTsKICAgICAgICAgICAgIGYuY3JlYXRlRmlsZUlmTm90RXhpc3RzKCk7CiAgICAgICAgICAgICBjb21wb25lbnRzLmFkZChmKTsKICAgICAgICAgfQpAQCAtMzA2LDE0ICszMDcsMTQgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFyZERpcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhbmRhcmREaXJzKCkKICAgICB7CiAgICAgICAgIGZvciAoVGFibGVNZXRhZGF0YSBjZm0gOiBDRk0pCiAgICAgICAgIHsKICAgICAgICAgICAgIERpcmVjdG9yaWVzIGRpcmVjdG9yaWVzID0gbmV3IERpcmVjdG9yaWVzKGNmbSwgdG9EYXRhRGlyZWN0b3JpZXModGVtcERhdGFEaXIpKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjZkRpcihjZm0pLCBkaXJlY3Rvcmllcy5nZXREaXJlY3RvcnlGb3JOZXdTU1RhYmxlcygpKTsKIAotICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gbmV3IERlc2NyaXB0b3IoY2ZEaXIoY2ZtKSwgS1MsIGNmbS5uYW1lLCBzc3RhYmxlSWQoMSksIFNTVGFibGVGb3JtYXQuVHlwZS5CSUcpOworICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gbmV3IERlc2NyaXB0b3IoY2ZEaXIoY2ZtKSwgS1MsIGNmbS5uYW1lLCBzc3RhYmxlSWQoMSksIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSk7CiAgICAgICAgICAgICBGaWxlIHNuYXBzaG90RGlyID0gbmV3IEZpbGUoY2ZEaXIoY2ZtKSwgRmlsZS5wYXRoU2VwYXJhdG9yKCkgKyBEaXJlY3Rvcmllcy5TTkFQU0hPVF9TVUJESVIgKyBGaWxlLnBhdGhTZXBhcmF0b3IoKSArIExFR0FDWV9TTkFQU0hPVF9OQU1FKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhzbmFwc2hvdERpci50b0Nhbm9uaWNhbCgpLCBEaXJlY3Rvcmllcy5nZXRTbmFwc2hvdERpcmVjdG9yeShkZXNjLCBMRUdBQ1lfU05BUFNIT1RfTkFNRSkpOwogCkBAIC0zMzMsMjIgKzMzNCwyNyBAQAogICAgICAgICBhc3NlcnRUaGF0KGRpcmVjdG9yaWVzLmxpc3RTbmFwc2hvdHMoKSkuaXNFbXB0eSgpOwogCiAgICAgICAgIC8vIENyZWF0ZSBzbmFwc2hvdCB3aXRoIGFuZCB3aXRob3V0IG1hbmlmZXN0Ci0gICAgICAgIEZha2VTbmFwc2hvdCBzbmFwc2hvdDEgPSBjcmVhdGVGYWtlU25hcHNob3QoZmFrZVRhYmxlLCBTTkFQU0hPVDEsIHRydWUpOwotICAgICAgICBGYWtlU25hcHNob3Qgc25hcHNob3QyID0gY3JlYXRlRmFrZVNuYXBzaG90KGZha2VUYWJsZSwgU05BUFNIT1QyLCBmYWxzZSk7CisgICAgICAgIEZha2VTbmFwc2hvdCBzbmFwc2hvdDEgPSBjcmVhdGVGYWtlU25hcHNob3QoZmFrZVRhYmxlLCBTTkFQU0hPVDEsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgRmFrZVNuYXBzaG90IHNuYXBzaG90MiA9IGNyZWF0ZUZha2VTbmFwc2hvdChmYWtlVGFibGUsIFNOQVBTSE9UMiwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgLy8gZXBoZW1lcmFsIHdpdGhvdXQgbWFuaWZzdAorICAgICAgICBGYWtlU25hcHNob3Qgc25hcHNob3QzID0gY3JlYXRlRmFrZVNuYXBzaG90KGZha2VUYWJsZSwgU05BUFNIT1QzLCBmYWxzZSwgdHJ1ZSk7CiAKICAgICAgICAgLy8gQm90aCBzbmFwc2hvdHMgc2hvdWxkIGJlIHByZXNlbnQKICAgICAgICAgTWFwPFN0cmluZywgVGFibGVTbmFwc2hvdD4gc25hcHNob3RzID0gZGlyZWN0b3JpZXMubGlzdFNuYXBzaG90cygpOwotICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90cy5rZXlTZXQoKSkuaXNFcXVhbFRvKFNldHMubmV3SGFzaFNldChTTkFQU0hPVDEsIFNOQVBTSE9UMikpOworICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90cy5rZXlTZXQoKSkuaXNFcXVhbFRvKFNldHMubmV3SGFzaFNldChTTkFQU0hPVDEsIFNOQVBTSE9UMiwgU05BUFNIT1QzKSk7CiAgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzLmdldChTTkFQU0hPVDEpKS5pc0VxdWFsVG8oc25hcHNob3QxLmFzVGFibGVTbmFwc2hvdCgpKTsKICAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMuZ2V0KFNOQVBTSE9UMikpLmlzRXF1YWxUbyhzbmFwc2hvdDIuYXNUYWJsZVNuYXBzaG90KCkpOworICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90cy5nZXQoU05BUFNIT1QzKSkuaXNFcXVhbFRvKHNuYXBzaG90My5hc1RhYmxlU25hcHNob3QoKSk7CiAKICAgICAgICAgLy8gTm93IHJlbW92ZSBzbmFwc2hvdDEKLSAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZVJlY3Vyc2l2ZShzbmFwc2hvdDEuc25hcHNob3REaXIpOworICAgICAgICBzbmFwc2hvdDEuc25hcHNob3REaXIuZGVsZXRlUmVjdXJzaXZlKCk7CiAKLSAgICAgICAgLy8gT25seSBzbmFwc2hvdCAyIHNob3VsZCBiZSBwcmVzZW50CisgICAgICAgIC8vIE9ubHkgc25hcHNob3QgMiBhbmQgMyBzaG91bGQgYmUgcHJlc2VudAogICAgICAgICBzbmFwc2hvdHMgPSBkaXJlY3Rvcmllcy5saXN0U25hcHNob3RzKCk7Ci0gICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzLmtleVNldCgpKS5pc0VxdWFsVG8oU2V0cy5uZXdIYXNoU2V0KFNOQVBTSE9UMikpOworICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90cy5rZXlTZXQoKSkuaXNFcXVhbFRvKFNldHMubmV3SGFzaFNldChTTkFQU0hPVDIsIFNOQVBTSE9UMykpOwogICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90cy5nZXQoU05BUFNIT1QyKSkuaXNFcXVhbFRvKHNuYXBzaG90Mi5hc1RhYmxlU25hcHNob3QoKSk7CisgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzLmdldChTTkFQU0hPVDMpKS5pc0VxdWFsVG8oc25hcHNob3QzLmFzVGFibGVTbmFwc2hvdCgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMuZ2V0KFNOQVBTSE9UMykuaXNFcGhlbWVyYWwoKSkuaXNUcnVlKCk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTM1OSwyMSArMzY1LDIzIEBACiAgICAgICAgIGFzc2VydFRoYXQoZGlyZWN0b3JpZXMubGlzdFNuYXBzaG90RGlyc0J5VGFnKCkpLmlzRW1wdHkoKTsKIAogICAgICAgICAvLyBDcmVhdGUgc25hcHNob3Qgd2l0aCBhbmQgd2l0aG91dCBtYW5pZmVzdAotICAgICAgICBGYWtlU25hcHNob3Qgc25hcHNob3QxID0gY3JlYXRlRmFrZVNuYXBzaG90KGZha2VUYWJsZSwgU05BUFNIT1QxLCB0cnVlKTsKLSAgICAgICAgRmFrZVNuYXBzaG90IHNuYXBzaG90MiA9IGNyZWF0ZUZha2VTbmFwc2hvdChmYWtlVGFibGUsIFNOQVBTSE9UMiwgZmFsc2UpOworICAgICAgICBGYWtlU25hcHNob3Qgc25hcHNob3QxID0gY3JlYXRlRmFrZVNuYXBzaG90KGZha2VUYWJsZSwgU05BUFNIT1QxLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIEZha2VTbmFwc2hvdCBzbmFwc2hvdDIgPSBjcmVhdGVGYWtlU25hcHNob3QoZmFrZVRhYmxlLCBTTkFQU0hPVDIsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIEZha2VTbmFwc2hvdCBzbmFwc2hvdDMgPSBjcmVhdGVGYWtlU25hcHNob3QoZmFrZVRhYmxlLCBTTkFQU0hPVDMsIGZhbHNlLCB0cnVlKTsKIAogICAgICAgICAvLyBCb3RoIHNuYXBzaG90cyBzaG91bGQgYmUgcHJlc2VudAogICAgICAgICBNYXA8U3RyaW5nLCBTZXQ8RmlsZT4+IHNuYXBzaG90RGlycyA9IGRpcmVjdG9yaWVzLmxpc3RTbmFwc2hvdERpcnNCeVRhZygpOwotICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90RGlycy5rZXlTZXQoKSkuaXNFcXVhbFRvKFNldHMubmV3SGFzaFNldChTTkFQU0hPVDEsIFNOQVBTSE9UMikpOworICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90RGlycy5rZXlTZXQoKSkuaXNFcXVhbFRvKFNldHMubmV3SGFzaFNldChTTkFQU0hPVDEsIFNOQVBTSE9UMiwgU05BUFNIT1QzKSk7CiAgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3REaXJzLmdldChTTkFQU0hPVDEpKS5hbGxNYXRjaChzbmFwc2hvdERpciAtPiBzbmFwc2hvdERpci5lcXVhbHMoc25hcHNob3QxLnNuYXBzaG90RGlyKSk7CiAgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3REaXJzLmdldChTTkFQU0hPVDIpKS5hbGxNYXRjaChzbmFwc2hvdERpciAtPiBzbmFwc2hvdERpci5lcXVhbHMoc25hcHNob3QyLnNuYXBzaG90RGlyKSk7CisgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3REaXJzLmdldChTTkFQU0hPVDMpKS5hbGxNYXRjaChzbmFwc2hvdERpciAtPiBzbmFwc2hvdERpci5lcXVhbHMoc25hcHNob3QzLnNuYXBzaG90RGlyKSk7CiAKICAgICAgICAgLy8gTm93IHJlbW92ZSBzbmFwc2hvdDEKLSAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZVJlY3Vyc2l2ZShzbmFwc2hvdDEuc25hcHNob3REaXIpOworICAgICAgICBzbmFwc2hvdDEuc25hcHNob3REaXIuZGVsZXRlUmVjdXJzaXZlKCk7CiAKLSAgICAgICAgLy8gT25seSBzbmFwc2hvdCAyIHNob3VsZCBiZSBwcmVzZW50CisgICAgICAgIC8vIE9ubHkgc25hcHNob3QgMiBhbmQgMyBzaG91bGQgYmUgcHJlc2VudAogICAgICAgICBzbmFwc2hvdERpcnMgPSBkaXJlY3Rvcmllcy5saXN0U25hcHNob3REaXJzQnlUYWcoKTsKLSAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdERpcnMua2V5U2V0KCkpLmlzRXF1YWxUbyhTZXRzLm5ld0hhc2hTZXQoU05BUFNIT1QyKSk7CisgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3REaXJzLmtleVNldCgpKS5pc0VxdWFsVG8oU2V0cy5uZXdIYXNoU2V0KFNOQVBTSE9UMiwgU05BUFNIT1QzKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTM4Miw3ICszOTAsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBTdHJpbmcgdGFnID0gInRlc3QiOwogICAgICAgICAgICAgRGlyZWN0b3JpZXMgZGlyZWN0b3JpZXMgPSBuZXcgRGlyZWN0b3JpZXMoY2ZtLCB0b0RhdGFEaXJlY3Rvcmllcyh0ZW1wRGF0YURpcikpOwotICAgICAgICAgICAgRGVzY3JpcHRvciBwYXJlbnREZXNjID0gbmV3IERlc2NyaXB0b3IoZGlyZWN0b3JpZXMuZ2V0RGlyZWN0b3J5Rm9yTmV3U1NUYWJsZXMoKSwgS1MsIGNmbS5uYW1lLCBzc3RhYmxlSWQoMCksIFNTVGFibGVGb3JtYXQuVHlwZS5CSUcpOworICAgICAgICAgICAgRGVzY3JpcHRvciBwYXJlbnREZXNjID0gbmV3IERlc2NyaXB0b3IoZGlyZWN0b3JpZXMuZ2V0RGlyZWN0b3J5Rm9yTmV3U1NUYWJsZXMoKSwgS1MsIGNmbS5uYW1lLCBzc3RhYmxlSWQoMCksIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSk7CiAgICAgICAgICAgICBGaWxlIHBhcmVudFNuYXBzaG90RGlyZWN0b3J5ID0gRGlyZWN0b3JpZXMuZ2V0U25hcHNob3REaXJlY3RvcnkocGFyZW50RGVzYywgdGFnKTsKIAogICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGZpbGVzID0gbmV3IExpbmtlZExpc3Q8PigpOwpAQCAtMzkwLDcgKzM5OCw3IEBACiAKICAgICAgICAgICAgIEZpbGUgbWFuaWZlc3RGaWxlID0gZGlyZWN0b3JpZXMuZ2V0U25hcHNob3RNYW5pZmVzdEZpbGUodGFnKTsKIAotICAgICAgICAgICAgU25hcHNob3RNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBTbmFwc2hvdE1hbmlmZXN0KGZpbGVzLCBuZXcgRHVyYXRpb25TcGVjLkludFNlY29uZHNCb3VuZCgiMW0iKSwgbm93KCkpOworICAgICAgICAgICAgU25hcHNob3RNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBTbmFwc2hvdE1hbmlmZXN0KGZpbGVzLCBuZXcgRHVyYXRpb25TcGVjLkludFNlY29uZHNCb3VuZCgiMW0iKSwgbm93KCksIGZhbHNlKTsKICAgICAgICAgICAgIG1hbmlmZXN0LnNlcmlhbGl6ZVRvSnNvbkZpbGUobWFuaWZlc3RGaWxlKTsKIAogICAgICAgICAgICAgU2V0PEZpbGU+IGRpcnMgPSBuZXcgSGFzaFNldDw+KCk7CkBAIC00MjksOCArNDM3LDggQEAKICAgICAgICAgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNmRGlyKElOREVYX0NGTSksIGRpcik7CiAgICAgICAgIH0KLSAgICAgICAgRGVzY3JpcHRvciBwYXJlbnREZXNjID0gbmV3IERlc2NyaXB0b3IocGFyZW50RGlyZWN0b3JpZXMuZ2V0RGlyZWN0b3J5Rm9yTmV3U1NUYWJsZXMoKSwgS1MsIFBBUkVOVF9DRk0ubmFtZSwgc3N0YWJsZUlkKDApLCBTU1RhYmxlRm9ybWF0LlR5cGUuQklHKTsKLSAgICAgICAgRGVzY3JpcHRvciBpbmRleERlc2MgPSBuZXcgRGVzY3JpcHRvcihpbmRleERpcmVjdG9yaWVzLmdldERpcmVjdG9yeUZvck5ld1NTVGFibGVzKCksIEtTLCBJTkRFWF9DRk0ubmFtZSwgc3N0YWJsZUlkKDApLCBTU1RhYmxlRm9ybWF0LlR5cGUuQklHKTsKKyAgICAgICAgRGVzY3JpcHRvciBwYXJlbnREZXNjID0gbmV3IERlc2NyaXB0b3IocGFyZW50RGlyZWN0b3JpZXMuZ2V0RGlyZWN0b3J5Rm9yTmV3U1NUYWJsZXMoKSwgS1MsIFBBUkVOVF9DRk0ubmFtZSwgc3N0YWJsZUlkKDApLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkpOworICAgICAgICBEZXNjcmlwdG9yIGluZGV4RGVzYyA9IG5ldyBEZXNjcmlwdG9yKGluZGV4RGlyZWN0b3JpZXMuZ2V0RGlyZWN0b3J5Rm9yTmV3U1NUYWJsZXMoKSwgS1MsIElOREVYX0NGTS5uYW1lLCBzc3RhYmxlSWQoMCksIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSk7CiAKICAgICAgICAgLy8gc25hcHNob3QgZGlyIHNob3VsZCBiZSBjcmVhdGVkIHVuZGVyIGl0cyBwYXJlbnQncwogICAgICAgICBGaWxlIHBhcmVudFNuYXBzaG90RGlyZWN0b3J5ID0gRGlyZWN0b3JpZXMuZ2V0U25hcHNob3REaXJlY3RvcnkocGFyZW50RGVzYywgInRlc3QiKTsKQEAgLTQ0MywxMCArNDUxLDEwIEBACiAgICAgICAgIGFzc2VydFRydWUoaW5kZXhEaXJlY3Rvcmllcy5zbmFwc2hvdEV4aXN0cygidGVzdCIpKTsKIAogICAgICAgICAvLyBjaGVjayB0cnVlIHNuYXBzaG90IHNpemUKLSAgICAgICAgRGVzY3JpcHRvciBwYXJlbnRTbmFwc2hvdCA9IG5ldyBEZXNjcmlwdG9yKHBhcmVudFNuYXBzaG90RGlyZWN0b3J5LCBLUywgUEFSRU5UX0NGTS5uYW1lLCBzc3RhYmxlSWQoMCksIFNTVGFibGVGb3JtYXQuVHlwZS5CSUcpOwotICAgICAgICBjcmVhdGVGaWxlKHBhcmVudFNuYXBzaG90LmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSwgMzApOwotICAgICAgICBEZXNjcmlwdG9yIGluZGV4U25hcHNob3QgPSBuZXcgRGVzY3JpcHRvcihpbmRleFNuYXBzaG90RGlyZWN0b3J5LCBLUywgSU5ERVhfQ0ZNLm5hbWUsIHNzdGFibGVJZCgwKSwgU1NUYWJsZUZvcm1hdC5UeXBlLkJJRyk7Ci0gICAgICAgIGNyZWF0ZUZpbGUoaW5kZXhTbmFwc2hvdC5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSksIDQwKTsKKyAgICAgICAgRGVzY3JpcHRvciBwYXJlbnRTbmFwc2hvdCA9IG5ldyBEZXNjcmlwdG9yKHBhcmVudFNuYXBzaG90RGlyZWN0b3J5LCBLUywgUEFSRU5UX0NGTS5uYW1lLCBzc3RhYmxlSWQoMCksIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSk7CisgICAgICAgIGNyZWF0ZUZpbGUocGFyZW50U25hcHNob3QuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpLCAzMCk7CisgICAgICAgIERlc2NyaXB0b3IgaW5kZXhTbmFwc2hvdCA9IG5ldyBEZXNjcmlwdG9yKGluZGV4U25hcHNob3REaXJlY3RvcnksIEtTLCBJTkRFWF9DRk0ubmFtZSwgc3N0YWJsZUlkKDApLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkpOworICAgICAgICBjcmVhdGVGaWxlKGluZGV4U25hcHNob3QuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpLCA0MCk7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDMwLCBwYXJlbnREaXJlY3Rvcmllcy50cnVlU25hcHNob3RzU2l6ZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDQwLCBpbmRleERpcmVjdG9yaWVzLnRydWVTbmFwc2hvdHNTaXplKCkpOwpAQCAtNDYzLDE2ICs0NzEsMTUgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmVudEJhY2t1cERpcmVjdG9yeSwgaW5kZXhCYWNrdXBEaXJlY3RvcnkucGFyZW50KCkpOwogICAgIH0KIAotICAgIHByaXZhdGUgRmlsZSBjcmVhdGVGaWxlKFN0cmluZyBmaWxlTmFtZSwgaW50IHNpemUpCisgICAgcHJpdmF0ZSBGaWxlIGNyZWF0ZUZpbGUoRmlsZSBmaWxlLCBpbnQgc2l6ZSkKICAgICB7Ci0gICAgICAgIEZpbGUgbmV3RmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLSAgICAgICAgdHJ5IChGaWxlT3V0cHV0U3RyZWFtUGx1cyB3cml0ZXIgPSBuZXcgRmlsZU91dHB1dFN0cmVhbVBsdXMobmV3RmlsZSk7KQorICAgICAgICB0cnkgKEZpbGVPdXRwdXRTdHJlYW1QbHVzIHdyaXRlciA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtUGx1cyhmaWxlKTspCiAgICAgICAgIHsKICAgICAgICAgICAgIHdyaXRlci53cml0ZShuZXcgYnl0ZVtzaXplXSk7CiAgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlKSB7fQotICAgICAgICByZXR1cm4gbmV3RmlsZTsKKyAgICAgICAgcmV0dXJuIGZpbGU7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTUyNSw3ICs1MzIsNyBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFRlbXBvcmFyeUZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGVtcG9yYXJ5RmlsZSgpCiAgICAgewogICAgICAgICBmb3IgKFRhYmxlTWV0YWRhdGEgY2ZtIDogQ0ZNKQogICAgICAgICB7CkBAIC01ODksMTEgKzU5NiwxMCBAQAogICAgICAgICAgICAgZmluYWwgRGlyZWN0b3JpZXMgZGlyZWN0b3JpZXMgPSBuZXcgRGlyZWN0b3JpZXMoY2ZtLCB0b0RhdGFEaXJlY3Rvcmllcyh0ZW1wRGF0YURpcikpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNmRGlyKGNmbSksIGRpcmVjdG9yaWVzLmdldERpcmVjdG9yeUZvck5ld1NTVGFibGVzKCkpOwogICAgICAgICAgICAgZmluYWwgU3RyaW5nIG4gPSBMb25nLnRvU3RyaW5nKG5hbm9UaW1lKCkpOwotICAgICAgICAgICAgQ2FsbGFibGU8RmlsZT4gZGlyZWN0b3J5R2V0dGVyID0gbmV3IENhbGxhYmxlPEZpbGU+KCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBGaWxlIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gbmV3IERlc2NyaXB0b3IoY2ZEaXIoY2ZtKSwgS1MsIGNmbS5uYW1lLCBzc3RhYmxlSWQoMSksIFNTVGFibGVGb3JtYXQuVHlwZS5CSUcpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGlyZWN0b3JpZXMuZ2V0U25hcHNob3REaXJlY3RvcnkoZGVzYywgbik7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgQ2FsbGFibGU8RmlsZT4gZGlyZWN0b3J5R2V0dGVyID0gKCkgLT4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBuZXcgRGVzY3JpcHRvcihjZkRpcihjZm0pLCBLUywgY2ZtLm5hbWUsIHNzdGFibGVJZCgxKSwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRGlyZWN0b3JpZXMuZ2V0U25hcHNob3REaXJlY3RvcnkoZGVzYywgbik7CiAgICAgICAgICAgICB9OwogICAgICAgICAgICAgTGlzdDxGdXR1cmU8RmlsZT4+IGludm9rZWQgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKDIpLmludm9rZUFsbChBcnJheXMuYXNMaXN0KGRpcmVjdG9yeUdldHRlciwgZGlyZWN0b3J5R2V0dGVyKSk7CiAgICAgICAgICAgICBmb3IoRnV0dXJlPEZpbGU+IGZ1dDppbnZva2VkKSB7CkBAIC03NTcsNyArNzYzLDcgQEAKICAgICAgICAgICAgIERpcmVjdG9yaWVzIGRpcnMgPSBuZXcgRGlyZWN0b3JpZXMoY2ZtLCBwYXRocyk7CiAgICAgICAgICAgICBmb3IgKERhdGFEaXJlY3RvcnkgZGlyIDogcGF0aHMpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRvciBkID0gRGVzY3JpcHRvci5mcm9tRmlsZW5hbWUobmV3IEZpbGUoZGlyLmxvY2F0aW9uLCBnZXROZXdGaWxlbmFtZShjZm0sIGZhbHNlKSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgRGVzY3JpcHRvciBkID0gRGVzY3JpcHRvci5mcm9tRmlsZShuZXcgRmlsZShkaXIubG9jYXRpb24sIGdldE5ld0ZpbGVuYW1lKGNmbSwgZmFsc2UpKSk7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHAgPSBkaXJzLmdldERhdGFEaXJlY3RvcnlGb3JGaWxlKGQpLmxvY2F0aW9uLmFic29sdXRlUGF0aCgpICsgRmlsZS5wYXRoU2VwYXJhdG9yKCk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwLnN0YXJ0c1dpdGgoZGlyLmxvY2F0aW9uLmFic29sdXRlUGF0aCgpICsgRmlsZS5wYXRoU2VwYXJhdG9yKCkpKTsKICAgICAgICAgICAgIH0KQEAgLTc4Niw5ICs3OTIsOSBAQAogICAgICAgICBmb3IgKFRhYmxlTWV0YWRhdGEgdG0gOiBDRk0pCiAgICAgICAgIHsKICAgICAgICAgICAgIERpcmVjdG9yaWVzIGRpcnMgPSBuZXcgRGlyZWN0b3JpZXModG0sIFNldHMubmV3SGFzaFNldChkZDEsIGRkMikpOwotICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gRGVzY3JpcHRvci5mcm9tRmlsZW5hbWUobmV3IEZpbGUoZGRpcjEucmVzb2x2ZShnZXROZXdGaWxlbmFtZSh0bSwgZmFsc2UpKSkpOworICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gRGVzY3JpcHRvci5mcm9tRmlsZShuZXcgRmlsZShkZGlyMS5yZXNvbHZlKGdldE5ld0ZpbGVuYW1lKHRtLCBmYWxzZSkpKSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEZpbGUoZGRpcjEpLCBkaXJzLmdldERhdGFEaXJlY3RvcnlGb3JGaWxlKGRlc2MpLmxvY2F0aW9uKTsKLSAgICAgICAgICAgIGRlc2MgPSBEZXNjcmlwdG9yLmZyb21GaWxlbmFtZShuZXcgRmlsZShkZGlyMi5yZXNvbHZlKGdldE5ld0ZpbGVuYW1lKHRtLCBmYWxzZSkpKSk7CisgICAgICAgICAgICBkZXNjID0gRGVzY3JpcHRvci5mcm9tRmlsZShuZXcgRmlsZShkZGlyMi5yZXNvbHZlKGdldE5ld0ZpbGVuYW1lKHRtLCBmYWxzZSkpKSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEZpbGUoZGRpcjIpLCBkaXJzLmdldERhdGFEaXJlY3RvcnlGb3JGaWxlKGRlc2MpLmxvY2F0aW9uKTsKICAgICAgICAgfQogICAgIH0KQEAgLTgzNiw5ICs4NDIsOSBAQAogICAgICAgICBmb3IgKFRhYmxlTWV0YWRhdGEgdG0gOiBDRk0pCiAgICAgICAgIHsKICAgICAgICAgICAgIERpcmVjdG9yaWVzIGRpcnMgPSBuZXcgRGlyZWN0b3JpZXModG0sIFNldHMubmV3SGFzaFNldChkZDEsIGRkMikpOwotICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gRGVzY3JpcHRvci5mcm9tRmlsZW5hbWUobmV3IEZpbGUoZGRpcjEucmVzb2x2ZShnZXROZXdGaWxlbmFtZSh0bSwgb2xkU3R5bGUpKSkpOworICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gRGVzY3JpcHRvci5mcm9tRmlsZShuZXcgRmlsZShkZGlyMS5yZXNvbHZlKGdldE5ld0ZpbGVuYW1lKHRtLCBvbGRTdHlsZSkpKSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEZpbGUoZGRpcjEpLCBkaXJzLmdldERhdGFEaXJlY3RvcnlGb3JGaWxlKGRlc2MpLmxvY2F0aW9uKTsKLSAgICAgICAgICAgIGRlc2MgPSBEZXNjcmlwdG9yLmZyb21GaWxlbmFtZShuZXcgRmlsZShkZGlyMi5yZXNvbHZlKGdldE5ld0ZpbGVuYW1lKHRtLCBvbGRTdHlsZSkpKSk7CisgICAgICAgICAgICBkZXNjID0gRGVzY3JpcHRvci5mcm9tRmlsZShuZXcgRmlsZShkZGlyMi5yZXNvbHZlKGdldE5ld0ZpbGVuYW1lKHRtLCBvbGRTdHlsZSkpKSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEZpbGUoZGRpcjIpLCBkaXJzLmdldERhdGFEaXJlY3RvcnlGb3JGaWxlKGRlc2MpLmxvY2F0aW9uKTsKICAgICAgICAgfQogICAgIH0KQEAgLTg4OSwzMSArODk1LDI4IEBACiAgICAgICAgIGFzc2VydEZhbHNlKGl0ZXIuaGFzTmV4dCgpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIFN0cmluZyBnZXROZXdGaWxlbmFtZShUYWJsZU1ldGFkYXRhIHRtLCBib29sZWFuIG9sZFN0eWxlKQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZyZWVDb21wYWN0aW9uU3BhY2UoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIHRtLmtleXNwYWNlICsgRmlsZS5wYXRoU2VwYXJhdG9yKCkgKyB0bS5uYW1lICsgKG9sZFN0eWxlID8gIiIgOiBDb21wb25lbnQuc2VwYXJhdG9yICsgdG0uaWQudG9IZXhTdHJpbmcoKSkgKyAiL25hLTEtYmlnLURhdGEuZGIiOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdDxEaXJlY3Rvcmllcy5EYXRhRGlyZWN0b3J5Q2FuZGlkYXRlPiBnZXRXcml0ZWFibGVEaXJlY3RvcmllcyhEYXRhRGlyZWN0b3J5W10gZGF0YURpcmVjdG9yaWVzLCBsb25nIHdyaXRlU2l6ZSkKLSAgICB7Ci0gICAgICAgIC8vIGNvcGllZCBmcm9tIERpcmVjdG9yaWVzLmdldFdyaXRlYWJsZUxvY2F0aW9uKGxvbmcpCi0gICAgICAgIExpc3Q8RGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeUNhbmRpZGF0ZT4gY2FuZGlkYXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCi0gICAgICAgIGxvbmcgdG90YWxBdmFpbGFibGUgPSAwTDsKLQotICAgICAgICBmb3IgKERhdGFEaXJlY3RvcnkgZGF0YURpciA6IGRhdGFEaXJlY3RvcmllcykKKyAgICAgICAgZG91YmxlIG9sZE1heFNwYWNlRm9yQ29tcGFjdGlvbnMgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0TWF4U3BhY2VGb3JDb21wYWN0aW9uc1BlckRyaXZlKCk7CisgICAgICAgIGxvbmcgb2xkRnJlZVNwYWNlID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldE1pbkZyZWVTcGFjZVBlckRyaXZlSW5NZWJpYnl0ZXMoKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldE1heFNwYWNlRm9yQ29tcGFjdGlvbnNQZXJEcml2ZSgxMDAuMCk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRNaW5GcmVlU3BhY2VQZXJEcml2ZUluTWViaWJ5dGVzKDApOworICAgICAgICBGaWxlU3RvcmUgZnN0b3JlID0gbmV3IEZha2VGaWxlU3RvcmUoKTsKKyAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnlDYW5kaWRhdGUgY2FuZGlkYXRlID0gbmV3IERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnlDYW5kaWRhdGUoZGF0YURpcik7Ci0gICAgICAgICAgICAvLyBleGNsdWRlIGRpcmVjdG9yeSBpZiBpdHMgdG90YWwgd3JpdGVTaXplIGRvZXMgbm90IGZpdCB0byBkYXRhIGRpcmVjdG9yeQotICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZS5hdmFpbGFibGVTcGFjZSA8IHdyaXRlU2l6ZSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGNhbmRpZGF0ZXMuYWRkKGNhbmRpZGF0ZSk7Ci0gICAgICAgICAgICB0b3RhbEF2YWlsYWJsZSArPSBjYW5kaWRhdGUuYXZhaWxhYmxlU3BhY2U7CisgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0TWF4U3BhY2VGb3JDb21wYWN0aW9uc1BlckRyaXZlKDEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgRGlyZWN0b3JpZXMuZ2V0QXZhaWxhYmxlU3BhY2VGb3JDb21wYWN0aW9ucyhmc3RvcmUpKTsKKyAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRNYXhTcGFjZUZvckNvbXBhY3Rpb25zUGVyRHJpdmUoLjUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDUwLCBEaXJlY3Rvcmllcy5nZXRBdmFpbGFibGVTcGFjZUZvckNvbXBhY3Rpb25zKGZzdG9yZSkpOworICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldE1heFNwYWNlRm9yQ29tcGFjdGlvbnNQZXJEcml2ZSgwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBEaXJlY3Rvcmllcy5nZXRBdmFpbGFibGVTcGFjZUZvckNvbXBhY3Rpb25zKGZzdG9yZSkpOwogICAgICAgICB9Ci0KLSAgICAgICAgRGlyZWN0b3JpZXMuc29ydFdyaXRlYWJsZUNhbmRpZGF0ZXMoY2FuZGlkYXRlcywgdG90YWxBdmFpbGFibGUpOwotCi0gICAgICAgIHJldHVybiBjYW5kaWRhdGVzOworICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRNYXhTcGFjZUZvckNvbXBhY3Rpb25zUGVyRHJpdmUob2xkTWF4U3BhY2VGb3JDb21wYWN0aW9ucyk7CisgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0TWluRnJlZVNwYWNlUGVyRHJpdmVJbk1lYmlieXRlcyhvbGRGcmVlU3BhY2UgLyBGaWxlVXRpbHMuT05FX01JQik7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIGludCBnZXREaXlUaHJlYWRJZCgpCkBAIC05NDQsMTEgKzk0NywxMCBAQAogICAgIHByaXZhdGUgTGlzdDxJTG9nZ2luZ0V2ZW50PiBmaWx0ZXJMb2dCeURpeUlkKExpc3Q8SUxvZ2dpbmdFdmVudD4gbG9nKQogICAgIHsKICAgICAgICAgQXJyYXlMaXN0PElMb2dnaW5nRXZlbnQ+IGZpbHRlcmVkTG9nID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGZvciAoSUxvZ2dpbmdFdmVudCBldmVudCA6IGxvZykKKyAgICAgICAgZm9yKElMb2dnaW5nRXZlbnQgZXZlbnQgOiBsb2cpCiAgICAgICAgIHsKICAgICAgICAgICAgIGludCBtZGNJZCA9IEludGVnZXIucGFyc2VJbnQoZXZlbnQuZ2V0TURDUHJvcGVydHlNYXAoKS5nZXQodGhpcy5NRENJRCkpOwotICAgICAgICAgICAgaWYgKG1kY0lkID09IG15RGl5SWQpCi0gICAgICAgICAgICB7CisgICAgICAgICAgICBpZihtZGNJZCA9PSBteURpeUlkKXsKICAgICAgICAgICAgICAgICBmaWx0ZXJlZExvZy5hZGQoZXZlbnQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC05NjAsMTAxICs5NjIsMTkxIEBACiAgICAgICAgIGludCBmb3VuZD0wOwogICAgICAgICBmb3IoSUxvZ2dpbmdFdmVudCBlOiBsb2cpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlLmdldEZvcm1hdHRlZE1lc3NhZ2UoKSk7CiAgICAgICAgICAgICBpZihlLmdldEZvcm1hdHRlZE1lc3NhZ2UoKS5lbmRzV2l0aChleHBlY3RlZE1lc3NhZ2UpKQotICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChlLmdldExldmVsKCkgPT0gZXhwZWN0ZWRMZXZlbCkKICAgICAgICAgICAgICAgICAgICAgZm91bmQrKzsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZENvdW50LCBmb3VuZCk7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQXZhaWxhYmxlRGlza1NwYWNlKCkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQXZhaWxhYmxlU3BhY2UoKQogICAgIHsKLSAgICAgICAgRGF0YURpcmVjdG9yeVtdIGRhdGFEaXJlY3RvcmllcyA9IG5ldyBEYXRhRGlyZWN0b3J5W10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRhRGlyZWN0b3J5KG5ldyBGaWxlKCIvbmVhcmx5RnVsbERpcjEiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRBdmFpbGFibGVTcGFjZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTFMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0YURpcmVjdG9yeShuZXcgRmlsZSgiL3VuaWZvcm1EaXIyIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0QXZhaWxhYmxlU3BhY2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDk5OUw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRhRGlyZWN0b3J5KG5ldyBGaWxlKCIvdmVyeUZ1bGxEaXIiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRBdmFpbGFibGVTcGFjZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgZG91YmxlIG9sZE1heFNwYWNlRm9yQ29tcGFjdGlvbnMgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0TWF4U3BhY2VGb3JDb21wYWN0aW9uc1BlckRyaXZlKCk7CisgICAgICAgIGxvbmcgb2xkRnJlZVNwYWNlID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldE1pbkZyZWVTcGFjZVBlckRyaXZlSW5NZWJpYnl0ZXMoKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldE1heFNwYWNlRm9yQ29tcGFjdGlvbnNQZXJEcml2ZSgxLjApOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0TWluRnJlZVNwYWNlUGVyRHJpdmVJbk1lYmlieXRlcygwKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIEZha2VGaWxlU3RvcmUgZnMxID0gbmV3IEZha2VGaWxlU3RvcmUoKTsKKyAgICAgICAgICAgIEZha2VGaWxlU3RvcmUgZnMyID0gbmV3IEZha2VGaWxlU3RvcmUoKTsKKyAgICAgICAgICAgIEZha2VGaWxlU3RvcmUgZnMzID0gbmV3IEZha2VGaWxlU3RvcmUoKTsKKyAgICAgICAgICAgIE1hcDxGaWxlU3RvcmUsIExvbmc+IHdyaXRlcyA9IG5ldyBIYXNoTWFwPD4oKTsKIAotICAgICAgICBEaXJlY3RvcmllcyBkID0gbmV3IERpcmVjdG9yaWVzKCAoKFRhYmxlTWV0YWRhdGEpIENGTS50b0FycmF5KClbMF0pLCBkYXRhRGlyZWN0b3JpZXMpOworICAgICAgICAgICAgZnMxLnVzYWJsZVNwYWNlID0gMzA7CisgICAgICAgICAgICBmczIudXNhYmxlU3BhY2UgPSAzMDsKKyAgICAgICAgICAgIGZzMy51c2FibGVTcGFjZSA9IDMwOwogCi0gICAgICAgIGFzc2VydFRydWUoZC5oYXNBdmFpbGFibGVEaXNrU3BhY2UoMSwyKSk7Ci0gICAgICAgIGFzc2VydFRydWUoZC5oYXNBdmFpbGFibGVEaXNrU3BhY2UoMTAsOTkpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoZC5oYXNBdmFpbGFibGVEaXNrU3BhY2UoMTAsMTAyNCkpOwotICAgICAgICBhc3NlcnRGYWxzZShkLmhhc0F2YWlsYWJsZURpc2tTcGFjZSgxMDI0LDEwMjQqMTAyNCkpOworICAgICAgICAgICAgd3JpdGVzLnB1dChmczEsIDIwTCk7CisgICAgICAgICAgICB3cml0ZXMucHV0KGZzMiwgMjBMKTsKKyAgICAgICAgICAgIHdyaXRlcy5wdXQoZnMzLCAyMEwpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShEaXJlY3Rvcmllcy5oYXNEaXNrU3BhY2VGb3JDb21wYWN0aW9uc0FuZFN0cmVhbXMod3JpdGVzKSk7CiAKLSAgICAgICAgTGlzdDxJTG9nZ2luZ0V2ZW50PiBmaWx0ZXJlZExvZyA9IGxpc3RBcHBlbmRlci5saXN0OwotICAgICAgICAvL0xpc3Q8SUxvZ2dpbmdFdmVudD4gZmlsdGVyZWRMb2cgPSBmaWx0ZXJMb2dCeURpeUlkKGxpc3RBcHBlbmRlci5saXN0KTsKLSAgICAgICAgLy8gTG9nIG1lc3NhZ2VzIGNhbiBiZSBvdXQgb2Ygb3JkZXIsIGV2ZW4gZm9yIHRoZSBzaW5nbGUgdGhyZWFkLiAoZSB0dWkgQXN5bmNBcHBlbmRlcj8pCi0gICAgICAgIC8vIFdlIGNhbiBkZWFsIHdpdGggaXQsIGl0J3Mgc3VmZmljaWVudCB0byBqdXN0IGNoZWNrIHRoYXQgYWxsIG1lc3NhZ2VzIGV4aXN0IGluIHRoZSByZXN1bHQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIzLCBmaWx0ZXJlZExvZy5zaXplKCkpOwotICAgICAgICBTdHJpbmcgbG9nTXNnRm9ybWF0ID0gIkRhdGFEaXJlY3RvcnkgJXMgaGFzICVkIGJ5dGVzIGF2YWlsYWJsZSwgY2hlY2tpbmcgaWYgd2UgY2FuIHdyaXRlICVkIGJ5dGVzIjsKLSAgICAgICAgU3RyaW5nIGxvZ01zZyA9IFN0cmluZy5mb3JtYXQobG9nTXNnRm9ybWF0LCAiL25lYXJseUZ1bGxEaXIxIiwgMTEsIDIpOwotICAgICAgICBjaGVja0Zvcm1hdHRlZE1lc3NhZ2UoZmlsdGVyZWRMb2csIExldmVsLkRFQlVHLCBsb2dNc2csIDEpOwotICAgICAgICBsb2dNc2cgPSBTdHJpbmcuZm9ybWF0KGxvZ01zZ0Zvcm1hdCwgIi91bmlmb3JtRGlyMiIsIDk5OSwgMik7Ci0gICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuREVCVUcsIGxvZ01zZywgMSk7Ci0gICAgICAgIGxvZ01zZyA9IFN0cmluZy5mb3JtYXQobG9nTXNnRm9ybWF0LCAiL3ZlcnlGdWxsRGlyIiwgNCwgMik7Ci0gICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuREVCVUcsIGxvZ01zZywgMSk7Ci0gICAgICAgIGxvZ01zZyA9IFN0cmluZy5mb3JtYXQobG9nTXNnRm9ybWF0LCAiL25lYXJseUZ1bGxEaXIxIiwgMTEsIDIpOwotICAgICAgICBjaGVja0Zvcm1hdHRlZE1lc3NhZ2UoZmlsdGVyZWRMb2csIExldmVsLkRFQlVHLCBsb2dNc2csIDEpOwotICAgICAgICBsb2dNc2cgPSBTdHJpbmcuZm9ybWF0KGxvZ01zZ0Zvcm1hdCwgIi91bmlmb3JtRGlyMiIsIDk5OSwgOSk7Ci0gICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuREVCVUcsIGxvZ01zZywgMSk7Ci0gICAgICAgIGxvZ01zZyA9IFN0cmluZy5mb3JtYXQobG9nTXNnRm9ybWF0LCAiL3ZlcnlGdWxsRGlyIiwgNCwgOSk7Ci0gICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuREVCVUcsIGxvZ01zZywgMSk7Ci0gICAgICAgIGxvZ01zZyA9IFN0cmluZy5mb3JtYXQobG9nTXNnRm9ybWF0LCAiL25lYXJseUZ1bGxEaXIxIiwgMTEsIDEwMik7Ci0gICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuREVCVUcsIGxvZ01zZywgMSk7Ci0gICAgICAgIGxvZ01zZyA9IFN0cmluZy5mb3JtYXQobG9nTXNnRm9ybWF0LCAiL3VuaWZvcm1EaXIyIiwgOTk5LCAxMDIpOwotICAgICAgICBjaGVja0Zvcm1hdHRlZE1lc3NhZ2UoZmlsdGVyZWRMb2csIExldmVsLkRFQlVHLCBsb2dNc2csIDEpOwotICAgICAgICBsb2dNc2cgPSBTdHJpbmcuZm9ybWF0KGxvZ01zZ0Zvcm1hdCwgIi92ZXJ5RnVsbERpciIsIDQsIDEwMik7Ci0gICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuREVCVUcsIGxvZ01zZywgMSk7Ci0gICAgICAgIGxvZ01zZyA9IFN0cmluZy5mb3JtYXQobG9nTXNnRm9ybWF0LCAiL25lYXJseUZ1bGxEaXIxIiwgMTEsIDEwMjQpOwotICAgICAgICBjaGVja0Zvcm1hdHRlZE1lc3NhZ2UoZmlsdGVyZWRMb2csIExldmVsLkRFQlVHLCBsb2dNc2csIDEpOwotICAgICAgICBsb2dNc2cgPSBTdHJpbmcuZm9ybWF0KGxvZ01zZ0Zvcm1hdCwgIi91bmlmb3JtRGlyMiIsIDk5OSwgMTAyNCk7Ci0gICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuREVCVUcsIGxvZ01zZywgMSk7Ci0gICAgICAgIGxvZ01zZyA9IFN0cmluZy5mb3JtYXQobG9nTXNnRm9ybWF0LCAiL3ZlcnlGdWxsRGlyIiwgNCwgMTAyNCk7Ci0gICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuREVCVUcsIGxvZ01zZywgMSk7CisgICAgICAgICAgICBmczEudXNhYmxlU3BhY2UgPSAxOTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKERpcmVjdG9yaWVzLmhhc0Rpc2tTcGFjZUZvckNvbXBhY3Rpb25zQW5kU3RyZWFtcyh3cml0ZXMpKTsKIAotICAgICAgICBsb2dNc2dGb3JtYXQgPSAiRGF0YURpcmVjdG9yeSAlcyBjYW4ndCBiZSB1c2VkIGZvciBjb21wYWN0aW9uLiBPbmx5ICVzIGlzIGF2YWlsYWJsZSwgYnV0ICVzIGlzIHRoZSBtaW5pbXVtIHdyaXRlIHNpemUuIjsKLSAgICAgICAgbG9nTXNnID0gU3RyaW5nLmZvcm1hdChsb2dNc2dGb3JtYXQsICIvdmVyeUZ1bGxEaXIiLCAiNCBieXRlcyIsICI5IGJ5dGVzIik7Ci0gICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuV0FSTiwgbG9nTXNnLCAxKTsKLSAgICAgICAgbG9nTXNnID0gU3RyaW5nLmZvcm1hdChsb2dNc2dGb3JtYXQsICIvbmVhcmx5RnVsbERpcjEiLCAiMTEgYnl0ZXMiLCAiMTAyIGJ5dGVzIik7Ci0gICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuV0FSTiwgbG9nTXNnLCAxKTsKLSAgICAgICAgbG9nTXNnID0gU3RyaW5nLmZvcm1hdChsb2dNc2dGb3JtYXQsICIvdmVyeUZ1bGxEaXIiLCAiNCBieXRlcyIsICIxMDIgYnl0ZXMiKTsKLSAgICAgICAgY2hlY2tGb3JtYXR0ZWRNZXNzYWdlKGZpbHRlcmVkTG9nLCBMZXZlbC5XQVJOLCBsb2dNc2csIDEpOwotICAgICAgICBsb2dNc2cgPSBTdHJpbmcuZm9ybWF0KGxvZ01zZ0Zvcm1hdCwgIi9uZWFybHlGdWxsRGlyMSIsICIxMSBieXRlcyIsICIxIEtpQiIpOwotICAgICAgICBjaGVja0Zvcm1hdHRlZE1lc3NhZ2UoZmlsdGVyZWRMb2csIExldmVsLldBUk4sIGxvZ01zZywgMSk7Ci0gICAgICAgIGxvZ01zZyA9IFN0cmluZy5mb3JtYXQobG9nTXNnRm9ybWF0LCAiL3VuaWZvcm1EaXIyIiwgIjk5OSBieXRlcyIsICIxIEtpQiIpOwotICAgICAgICBjaGVja0Zvcm1hdHRlZE1lc3NhZ2UoZmlsdGVyZWRMb2csIExldmVsLldBUk4sIGxvZ01zZywgMSk7Ci0gICAgICAgIGxvZ01zZyA9IFN0cmluZy5mb3JtYXQobG9nTXNnRm9ybWF0LCAiL3ZlcnlGdWxsRGlyIiwgIjQgYnl0ZXMiLCAiMSBLaUIiKTsKLSAgICAgICAgY2hlY2tGb3JtYXR0ZWRNZXNzYWdlKGZpbHRlcmVkTG9nLCBMZXZlbC5XQVJOLCBsb2dNc2csIDEpOworICAgICAgICAgICAgd3JpdGVzLnB1dChmczIsIDI1TCoxMDI0KjEwMjQrOSk7CisgICAgICAgICAgICBmczIudXNhYmxlU3BhY2UgPSAyMEwqMTAyNCoxMDI0LTk7CisgICAgICAgICAgICB3cml0ZXMucHV0KGZzMywgOTk5TCoxMDI0KjEwMjQqMTAyNCs5KTsKKyAgICAgICAgICAgIGZzMi51c2FibGVTcGFjZSA9IDIwTCoxMDI0Kzk5OworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoRGlyZWN0b3JpZXMuaGFzRGlza1NwYWNlRm9yQ29tcGFjdGlvbnNBbmRTdHJlYW1zKHdyaXRlcykpOwogCi0gICAgICAgIGxvZ01zZ0Zvcm1hdCA9ICJBY3Jvc3MgJXMgdGhlcmUncyBvbmx5ICVzIGF2YWlsYWJsZSwgYnV0ICVzIGlzIG5lZWRlZC4iOwotICAgICAgICBsb2dNc2cgPSBTdHJpbmcuZm9ybWF0KGxvZ01zZ0Zvcm1hdCwgIlsvbmVhcmx5RnVsbERpcjEsL3VuaWZvcm1EaXIyLC92ZXJ5RnVsbERpcl0iLCAiOTk5IGJ5dGVzIiwgIjEgS2lCIik7Ci0gICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuV0FSTiwgbG9nTXNnLCAxKTsKLSAgICAgICAgbG9nTXNnID0gU3RyaW5nLmZvcm1hdChsb2dNc2dGb3JtYXQsICJbL25lYXJseUZ1bGxEaXIxLC91bmlmb3JtRGlyMiwvdmVyeUZ1bGxEaXJdIiwgIjAgYnl0ZXMiLCAiMSBNaUIiKTsKLSAgICAgICAgY2hlY2tGb3JtYXR0ZWRNZXNzYWdlKGZpbHRlcmVkTG9nLCBMZXZlbC5XQVJOLCBsb2dNc2csIDEpOworICAgICAgICAgICAgZnMxLnVzYWJsZVNwYWNlID0gMzA7CisgICAgICAgICAgICBmczIudXNhYmxlU3BhY2UgPSAzMDsKKyAgICAgICAgICAgIGZzMy51c2FibGVTcGFjZSA9IDMwTCoxMDI0KjEwMjQqMTAyNCoxMDI0OworCisgICAgICAgICAgICB3cml0ZXMucHV0KGZzMSwgMjBMKTsKKyAgICAgICAgICAgIHdyaXRlcy5wdXQoZnMyLCAyMEwpOworICAgICAgICAgICAgd3JpdGVzLnB1dChmczMsIDMwTCoxMDI0KjEwMjQqMTAyNCoxMDI0KzEpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoRGlyZWN0b3JpZXMuaGFzRGlza1NwYWNlRm9yQ29tcGFjdGlvbnNBbmRTdHJlYW1zKHdyaXRlcykpOworCisgICAgICAgICAgICBMaXN0PElMb2dnaW5nRXZlbnQ+IGZpbHRlcmVkTG9nID0gZmlsdGVyTG9nQnlEaXlJZChsaXN0QXBwZW5kZXIubGlzdCk7CisgICAgICAgICAgICAvLyBMb2cgbWVzc2FnZXMgY2FuIGJlIG91dCBvZiBvcmRlciwgZXZlbiBmb3IgdGhlIHNpbmdsZSB0aHJlYWQuIChlIHR1aSBBc3luY0FwcGVuZGVyPykKKyAgICAgICAgICAgIC8vIFdlIGNhbiBkZWFsIHdpdGggaXQsIGl0J3Mgc3VmZmljaWVudCB0byBqdXN0IGNoZWNrIHRoYXQgYWxsIG1lc3NhZ2VzIGV4aXN0IGluIHRoZSByZXN1bHQKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxNywgZmlsdGVyZWRMb2cuc2l6ZSgpKTsKKworICAgICAgICAgICAgU3RyaW5nIGxvZ01zZyA9ICIzMCBieXRlcyBhdmFpbGFibGUsIGNoZWNraW5nIGlmIHdlIGNhbiB3cml0ZSAyMCBieXRlcyI7CisgICAgICAgICAgICBjaGVja0Zvcm1hdHRlZE1lc3NhZ2UoZmlsdGVyZWRMb2csIExldmVsLkRFQlVHLCBsb2dNc2csIDcpOworICAgICAgICAgICAgbG9nTXNnID0gIjE5IGJ5dGVzIGF2YWlsYWJsZSwgY2hlY2tpbmcgaWYgd2UgY2FuIHdyaXRlIDIwIGJ5dGVzIjsKKyAgICAgICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuREVCVUcsIGxvZ01zZywgMik7CisKKworICAgICAgICAgICAgbG9nTXNnID0gIjE5IGJ5dGVzIGF2YWlsYWJsZSwgYnV0IDIwIGJ5dGVzIGlzIG5lZWRlZCI7CisgICAgICAgICAgICBjaGVja0Zvcm1hdHRlZE1lc3NhZ2UoZmlsdGVyZWRMb2csIExldmVsLldBUk4sIGxvZ01zZywgMik7CisgICAgICAgICAgICBsb2dNc2cgPSAiaGFzIG9ubHkgMjAuMSBLaUIgYXZhaWxhYmxlLCBidXQgMjUgTWlCIGlzIG5lZWRlZCI7CisgICAgICAgICAgICBjaGVja0Zvcm1hdHRlZE1lc3NhZ2UoZmlsdGVyZWRMb2csIExldmVsLldBUk4sIGxvZ01zZywgMSk7CisgICAgICAgICAgICBsb2dNc2cgPSAiaGFzIG9ubHkgMzAgYnl0ZXMgYXZhaWxhYmxlLCBidXQgOTk5IEdpQiBpcyBuZWVkZWQiOworICAgICAgICAgICAgY2hlY2tGb3JtYXR0ZWRNZXNzYWdlKGZpbHRlcmVkTG9nLCBMZXZlbC5XQVJOLCBsb2dNc2csIDEpOworICAgICAgICAgICAgbG9nTXNnID0gImhhcyBvbmx5IDMwIFRpQiBhdmFpbGFibGUsIGJ1dCAzMCBUaUIgaXMgbmVlZGVkIjsKKyAgICAgICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuV0FSTiwgbG9nTXNnLCAxKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRNYXhTcGFjZUZvckNvbXBhY3Rpb25zUGVyRHJpdmUob2xkTWF4U3BhY2VGb3JDb21wYWN0aW9ucyk7CisgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0TWluRnJlZVNwYWNlUGVyRHJpdmVJbk1lYmlieXRlcyhvbGRGcmVlU3BhY2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQXZhaWxhYmxlU3BhY2VTdW1taW5nKCkKKyAgICB7CisgICAgICAgIGRvdWJsZSBvbGRNYXhTcGFjZUZvckNvbXBhY3Rpb25zID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldE1heFNwYWNlRm9yQ29tcGFjdGlvbnNQZXJEcml2ZSgpOworICAgICAgICBsb25nIG9sZEZyZWVTcGFjZSA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRNaW5GcmVlU3BhY2VQZXJEcml2ZUluTWViaWJ5dGVzKCk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRNYXhTcGFjZUZvckNvbXBhY3Rpb25zUGVyRHJpdmUoMS4wKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldE1pbkZyZWVTcGFjZVBlckRyaXZlSW5NZWJpYnl0ZXMoMCk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBGYWtlRmlsZVN0b3JlIGZzMSA9IG5ldyBGYWtlRmlsZVN0b3JlKCk7CisgICAgICAgICAgICBGYWtlRmlsZVN0b3JlIGZzMiA9IG5ldyBGYWtlRmlsZVN0b3JlKCk7CisgICAgICAgICAgICBNYXA8RmlsZSwgTG9uZz4gZXhwZWN0ZWROZXdXcml0ZVNpemVzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgTWFwPEZpbGUsIExvbmc+IHRvdGFsQ29tcGFjdGlvbldyaXRlUmVtYWluaW5nID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgICAgICBmczEudXNhYmxlU3BhY2UgPSAxMDA7CisgICAgICAgICAgICBmczIudXNhYmxlU3BhY2UgPSAxMDA7CisKKyAgICAgICAgICAgIEZpbGUgZjEgPSBuZXcgRmlsZSgiZjEiKTsKKyAgICAgICAgICAgIEZpbGUgZjIgPSBuZXcgRmlsZSgiZjIiKTsKKyAgICAgICAgICAgIEZpbGUgZjMgPSBuZXcgRmlsZSgiZjMiKTsKKworICAgICAgICAgICAgZXhwZWN0ZWROZXdXcml0ZVNpemVzLnB1dChmMSwgMjBMKTsKKyAgICAgICAgICAgIGV4cGVjdGVkTmV3V3JpdGVTaXplcy5wdXQoZjIsIDIwTCk7CisgICAgICAgICAgICBleHBlY3RlZE5ld1dyaXRlU2l6ZXMucHV0KGYzLCAyMEwpOworCisgICAgICAgICAgICB0b3RhbENvbXBhY3Rpb25Xcml0ZVJlbWFpbmluZy5wdXQoZjEsIDIwTCk7CisgICAgICAgICAgICB0b3RhbENvbXBhY3Rpb25Xcml0ZVJlbWFpbmluZy5wdXQoZjIsIDIwTCk7CisgICAgICAgICAgICB0b3RhbENvbXBhY3Rpb25Xcml0ZVJlbWFpbmluZy5wdXQoZjMsIDIwTCk7CisgICAgICAgICAgICBGdW5jdGlvbjxGaWxlLCBGaWxlU3RvcmU+IGZpbGVzdG9yZU1hcHBlciA9IChmKSAtPiB7CisgICAgICAgICAgICAgICAgaWYgKGYgPT0gZjEgfHwgZiA9PSBmMikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZzMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZnMyOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoRGlyZWN0b3JpZXMuaGFzRGlza1NwYWNlRm9yQ29tcGFjdGlvbnNBbmRTdHJlYW1zKGV4cGVjdGVkTmV3V3JpdGVTaXplcywgdG90YWxDb21wYWN0aW9uV3JpdGVSZW1haW5pbmcsIGZpbGVzdG9yZU1hcHBlcikpOworICAgICAgICAgICAgZnMxLnVzYWJsZVNwYWNlID0gNzk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShEaXJlY3Rvcmllcy5oYXNEaXNrU3BhY2VGb3JDb21wYWN0aW9uc0FuZFN0cmVhbXMoZXhwZWN0ZWROZXdXcml0ZVNpemVzLCB0b3RhbENvbXBhY3Rpb25Xcml0ZVJlbWFpbmluZywgZmlsZXN0b3JlTWFwcGVyKSk7CisgICAgICAgICAgICBmczEudXNhYmxlU3BhY2UgPSA4MTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoRGlyZWN0b3JpZXMuaGFzRGlza1NwYWNlRm9yQ29tcGFjdGlvbnNBbmRTdHJlYW1zKGV4cGVjdGVkTmV3V3JpdGVTaXplcywgdG90YWxDb21wYWN0aW9uV3JpdGVSZW1haW5pbmcsIGZpbGVzdG9yZU1hcHBlcikpOworCisgICAgICAgICAgICBleHBlY3RlZE5ld1dyaXRlU2l6ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIGV4cGVjdGVkTmV3V3JpdGVTaXplcy5wdXQoZjEsIDEwMEwpOworICAgICAgICAgICAgdG90YWxDb21wYWN0aW9uV3JpdGVSZW1haW5pbmcuY2xlYXIoKTsKKyAgICAgICAgICAgIHRvdGFsQ29tcGFjdGlvbldyaXRlUmVtYWluaW5nLnB1dChmMiwgMTAwTCk7CisgICAgICAgICAgICBmczEudXNhYmxlU3BhY2UgPSAxNTA7CisKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKERpcmVjdG9yaWVzLmhhc0Rpc2tTcGFjZUZvckNvbXBhY3Rpb25zQW5kU3RyZWFtcyhleHBlY3RlZE5ld1dyaXRlU2l6ZXMsIHRvdGFsQ29tcGFjdGlvbldyaXRlUmVtYWluaW5nLCBmaWxlc3RvcmVNYXBwZXIpKTsKKyAgICAgICAgICAgIGV4cGVjdGVkTmV3V3JpdGVTaXplcy5jbGVhcigpOworICAgICAgICAgICAgZXhwZWN0ZWROZXdXcml0ZVNpemVzLnB1dChmMSwgMTAwTCk7CisgICAgICAgICAgICB0b3RhbENvbXBhY3Rpb25Xcml0ZVJlbWFpbmluZy5jbGVhcigpOworICAgICAgICAgICAgdG90YWxDb21wYWN0aW9uV3JpdGVSZW1haW5pbmcucHV0KGYzLCA1MDBMKTsKKyAgICAgICAgICAgIGZzMS51c2FibGVTcGFjZSA9IDE1MDsKKyAgICAgICAgICAgIGZzMi51c2FibGVTcGFjZSA9IDQwMDsgLy8gdG9vIGxpdHRsZSBzcGFjZSBmb3IgdGhlIG9uZ29pbmcgY29tcGFjdGlvbiwgYnV0IHRoaXMgZmlsZXN0b3JlIGRvZXMgbm90IGFmZmVjdCB0aGUgbmV3IGNvbXBhY3Rpb24gc28gaXQgc2hvdWxkIGJlIGFsbG93ZWQKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShEaXJlY3Rvcmllcy5oYXNEaXNrU3BhY2VGb3JDb21wYWN0aW9uc0FuZFN0cmVhbXMoZXhwZWN0ZWROZXdXcml0ZVNpemVzLCB0b3RhbENvbXBhY3Rpb25Xcml0ZVJlbWFpbmluZywgZmlsZXN0b3JlTWFwcGVyKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0TWF4U3BhY2VGb3JDb21wYWN0aW9uc1BlckRyaXZlKG9sZE1heFNwYWNlRm9yQ29tcGFjdGlvbnMpOworICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldE1pbkZyZWVTcGFjZVBlckRyaXZlSW5NZWJpYnl0ZXMob2xkRnJlZVNwYWNlIC8gRmlsZVV0aWxzLk9ORV9NSUIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TmV3RmlsZW5hbWUoVGFibGVNZXRhZGF0YSB0bSwgYm9vbGVhbiBvbGRTdHlsZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0bS5rZXlzcGFjZSArIEZpbGUucGF0aFNlcGFyYXRvcigpICsgdG0ubmFtZSArIChvbGRTdHlsZSA/ICIiIDogQ29tcG9uZW50LnNlcGFyYXRvciArIHRtLmlkLnRvSGV4U3RyaW5nKCkpICsgIi9uYS0xLWJpZy1EYXRhLmRiIjsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8RGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeUNhbmRpZGF0ZT4gZ2V0V3JpdGVhYmxlRGlyZWN0b3JpZXMoRGF0YURpcmVjdG9yeVtdIGRhdGFEaXJlY3RvcmllcywgbG9uZyB3cml0ZVNpemUpCisgICAgeworICAgICAgICAvLyBjb3BpZWQgZnJvbSBEaXJlY3Rvcmllcy5nZXRXcml0ZWFibGVMb2NhdGlvbihsb25nKQorICAgICAgICBMaXN0PERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnlDYW5kaWRhdGU+IGNhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICBsb25nIHRvdGFsQXZhaWxhYmxlID0gMEw7CisKKyAgICAgICAgZm9yIChEYXRhRGlyZWN0b3J5IGRhdGFEaXIgOiBkYXRhRGlyZWN0b3JpZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnlDYW5kaWRhdGUgY2FuZGlkYXRlID0gbmV3IERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnlDYW5kaWRhdGUoZGF0YURpcik7CisgICAgICAgICAgICAvLyBleGNsdWRlIGRpcmVjdG9yeSBpZiBpdHMgdG90YWwgd3JpdGVTaXplIGRvZXMgbm90IGZpdCB0byBkYXRhIGRpcmVjdG9yeQorICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZS5hdmFpbGFibGVTcGFjZSA8IHdyaXRlU2l6ZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGNhbmRpZGF0ZXMuYWRkKGNhbmRpZGF0ZSk7CisgICAgICAgICAgICB0b3RhbEF2YWlsYWJsZSArPSBjYW5kaWRhdGUuYXZhaWxhYmxlU3BhY2U7CisgICAgICAgIH0KKworICAgICAgICBEaXJlY3Rvcmllcy5zb3J0V3JpdGVhYmxlQ2FuZGlkYXRlcyhjYW5kaWRhdGVzLCB0b3RhbEF2YWlsYWJsZSk7CisKKyAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZXM7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWtlRmlsZVN0b3JlIGV4dGVuZHMgRmlsZVN0b3JlCisgICAgeworICAgICAgICBwdWJsaWMgbG9uZyB1c2FibGVTcGFjZSA9IDEwMDsKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0VXNhYmxlU3BhY2UoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdXNhYmxlU3BhY2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFN0cmluZyBuYW1lKCkge3JldHVybiBudWxsO30KKyAgICAgICAgcHVibGljIFN0cmluZyB0eXBlKCkge3JldHVybiBudWxsO30KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHtyZXR1cm4gZmFsc2U7fQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRUb3RhbFNwYWNlKCkge3JldHVybiAwO30KKyAgICAgICAgcHVibGljIGxvbmcgZ2V0VW5hbGxvY2F0ZWRTcGFjZSgpIHtyZXR1cm4gMDt9CisgICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzRmlsZUF0dHJpYnV0ZVZpZXcoQ2xhc3M8PyBleHRlbmRzIEZpbGVBdHRyaWJ1dGVWaWV3PiB0eXBlKSB7cmV0dXJuIGZhbHNlO30KKyAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNGaWxlQXR0cmlidXRlVmlldyhTdHJpbmcgbmFtZSkge3JldHVybiBmYWxzZTt9CisgICAgICAgIHB1YmxpYyA8ViBleHRlbmRzIEZpbGVTdG9yZUF0dHJpYnV0ZVZpZXc+IFYgZ2V0RmlsZVN0b3JlQXR0cmlidXRlVmlldyhDbGFzczxWPiB0eXBlKSB7cmV0dXJuIG51bGw7fQorICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlKSB7cmV0dXJuIG51bGw7fQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gIk1vY2tGaWxlU3RvcmUiOworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0Rpc2tCb3VuZGFyeU1hbmFnZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvRGlza0JvdW5kYXJ5TWFuYWdlclRlc3QuamF2YQppbmRleCBjZGY5YTlhLi5mMDQzYzBiIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvRGlza0JvdW5kYXJ5TWFuYWdlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvRGlza0JvdW5kYXJ5TWFuYWdlclRlc3QuamF2YQpAQCAtMTksOCArMTksMTEgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGI7CiAKIGltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpAQCAtMjksMTAgKzMyLDE2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQm9vdFN0cmFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lk11cm11cjNQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5Ub2tlbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Nb2NrU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKQEAgLTQ1LDYgKzU0LDggQEAKICAgICBwcml2YXRlIERpc2tCb3VuZGFyeU1hbmFnZXIgZGJtOwogICAgIHByaXZhdGUgTW9ja0NGUyBtb2NrOwogICAgIHByaXZhdGUgRGlyZWN0b3JpZXMgZGlyczsKKyAgICBwcml2YXRlIExpc3Q8RGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeT4gZGF0YWRpcnM7CisgICAgcHJpdmF0ZSBMaXN0PEZpbGU+IHRhYmxlRGlyczsKIAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXR1cCgpCkBAIC01MywxMSArNjQsMTMgQEAKICAgICAgICAgVG9rZW5NZXRhZGF0YSBtZXRhZGF0YSA9IFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmdldFRva2VuTWV0YWRhdGEoKTsKICAgICAgICAgbWV0YWRhdGEudXBkYXRlTm9ybWFsVG9rZW5zKEJvb3RTdHJhcHBlci5nZXRSYW5kb21Ub2tlbnMobWV0YWRhdGEsIDEwKSwgRkJVdGlsaXRpZXMuZ2V0QnJvYWRjYXN0QWRkcmVzc0FuZFBvcnQoKSk7CiAgICAgICAgIGNyZWF0ZVRhYmxlKCJjcmVhdGUgdGFibGUgJXMgKGlkIGludCBwcmltYXJ5IGtleSwgeCB0ZXh0KSIpOwotICAgICAgICBkaXJzID0gbmV3IERpcmVjdG9yaWVzKGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLm1ldGFkYXRhKCksIExpc3RzLm5ld0FycmF5TGlzdChuZXcgRGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeShuZXcgRmlsZSgiL3RtcC8xIikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnkobmV3IEZpbGUoIi90bXAvMiIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaXJlY3Rvcmllcy5EYXRhRGlyZWN0b3J5KG5ldyBGaWxlKCIvdG1wLzMiKSkpKTsKKyAgICAgICAgZGF0YWRpcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QobmV3IERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnkobmV3IEZpbGUoIi90bXAvMSIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnkobmV3IEZpbGUoIi90bXAvMiIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnkobmV3IEZpbGUoIi90bXAvMyIpKSk7CisgICAgICAgIGRpcnMgPSBuZXcgRGlyZWN0b3JpZXMoZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkubWV0YWRhdGEoKSwgZGF0YWRpcnMpOwogICAgICAgICBtb2NrID0gbmV3IE1vY2tDRlMoZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCksIGRpcnMpOwogICAgICAgICBkYm0gPSBtb2NrLmRpc2tCb3VuZGFyeU1hbmFnZXI7CisgICAgICAgIHRhYmxlRGlycyA9IGRhdGFkaXJzLnN0cmVhbSgpLm1hcChkZGlyIC0+IG1vY2suZ2V0RGlyZWN0b3JpZXMoKS5nZXRMb2NhdGlvbkZvckRpc2soZGRpcikpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTEwNSw2ICsxMTgsNzYgQEAKIAogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldERpc2tzSW5Cb3VuZHMoKQorICAgIHsKKyAgICAgICAgTGlzdDxQYXJ0aXRpb25Qb3NpdGlvbj4gcHBzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgcHBzLmFkZChwcCgxMDApKTsKKyAgICAgICAgcHBzLmFkZChwcCgyMDApKTsKKyAgICAgICAgcHBzLmFkZChwcChMb25nLk1BWF9WQUxVRSkpOyAvLyBsYXN0IHBvc2l0aW9uIGlzIGFsd2F5cyB0aGUgbWF4IHRva2VuCisKKyAgICAgICAgRGlza0JvdW5kYXJpZXMgZGlza0JvdW5kYXJpZXMgPSBuZXcgRGlza0JvdW5kYXJpZXMobW9jaywgZGlycy5nZXRXcml0ZWFibGVMb2NhdGlvbnMoKSwgcHBzLCAwLCAwKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKExpc3RzLm5ld0FycmF5TGlzdChkYXRhZGlycy5nZXQoMCkpLCAgICAgICAgICAgICAgICAgIGRpc2tCb3VuZGFyaWVzLmdldERpc2tzSW5Cb3VuZHMoZGsoMTApLCAgZGsoNTApKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTGlzdHMubmV3QXJyYXlMaXN0KGRhdGFkaXJzLmdldCgyKSksICAgICAgICAgICAgICAgICAgZGlza0JvdW5kYXJpZXMuZ2V0RGlza3NJbkJvdW5kcyhkaygyNTApLCBkayg1MDApKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTGlzdHMubmV3QXJyYXlMaXN0KGRhdGFkaXJzKSwgICAgICAgICAgICAgICAgICAgICAgICAgZGlza0JvdW5kYXJpZXMuZ2V0RGlza3NJbkJvdW5kcyhkaygwKSwgICBkaygyNTApKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTGlzdHMubmV3QXJyYXlMaXN0KGRhdGFkaXJzKSwgICAgICAgICAgICAgICAgICAgICAgICAgZGlza0JvdW5kYXJpZXMuZ2V0RGlza3NJbkJvdW5kcyhkaygwKSwgICBkaygyNTApKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTGlzdHMubmV3QXJyYXlMaXN0KGRhdGFkaXJzLmdldCgxKSwgZGF0YWRpcnMuZ2V0KDIpKSwgZGlza0JvdW5kYXJpZXMuZ2V0RGlza3NJbkJvdW5kcyhkaygxNTApLCBkaygyNTApKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTGlzdHMubmV3QXJyYXlMaXN0KGRhdGFkaXJzKSwgICAgICAgICAgICAgICAgICAgICAgICAgZGlza0JvdW5kYXJpZXMuZ2V0RGlza3NJbkJvdW5kcyhudWxsLCAgICAgICBkaygyNTApKSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhMaXN0cy5uZXdBcnJheUxpc3QoZGF0YWRpcnMuZ2V0KDApKSwgICAgICAgICAgICAgICAgICBkaXNrQm91bmRhcmllcy5nZXREaXNrc0luQm91bmRzKGRrKDApLCAgIGRrKDk5KSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKExpc3RzLm5ld0FycmF5TGlzdChkYXRhZGlycy5nZXQoMCkpLCAgICAgICAgICAgICAgICAgIGRpc2tCb3VuZGFyaWVzLmdldERpc2tzSW5Cb3VuZHMoZGsoMCksICAgZGsoMTAwKSkpOyAvLyBwcCgxMDApIGlzIG1heEtleUJvdW5kLCBzbyBkaygxMDApIDwgcHAoMTAwKQorICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKExpc3RzLm5ld0FycmF5TGlzdChkYXRhZGlycy5nZXQoMCksIGRhdGFkaXJzLmdldCgxKSksIGRpc2tCb3VuZGFyaWVzLmdldERpc2tzSW5Cb3VuZHMoZGsoMTAwKSwgZGsoMjAwKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKExpc3RzLm5ld0FycmF5TGlzdChkYXRhZGlycy5nZXQoMSkpLCAgICAgICAgICAgICAgICAgIGRpc2tCb3VuZGFyaWVzLmdldERpc2tzSW5Cb3VuZHMoZGsoMTAxKSwgZGsoMTAxKSkpOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RGF0YURpcmVjdG9yaWVzRm9yRmlsZXMoKQorICAgIHsKKyAgICAgICAgaW50IGdlbiA9IDE7CisgICAgICAgIExpc3Q8TXVybXVyM1BhcnRpdGlvbmVyLkxvbmdUb2tlbj4gdG9rZW5zID0gbW9jay5nZXREaXNrQm91bmRhcmllcygpLnBvc2l0aW9ucy5zdHJlYW0oKS5tYXAodCAtPiAoTXVybXVyM1BhcnRpdGlvbmVyLkxvbmdUb2tlbil0LmdldFRva2VuKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IE11cm11cjNQYXJ0aXRpb25lci5pbnN0YW5jZTsKKworICAgICAgICBNdXJtdXIzUGFydGl0aW9uZXIuTG9uZ1Rva2VuIHNzdGFibGVGaXJzdERpc2sxID0gKE11cm11cjNQYXJ0aXRpb25lci5Mb25nVG9rZW4pIHBhcnRpdGlvbmVyLm1pZHBvaW50KHBhcnRpdGlvbmVyLmdldE1pbmltdW1Ub2tlbigpLCB0b2tlbnMuZ2V0KDApKTsKKyAgICAgICAgTXVybXVyM1BhcnRpdGlvbmVyLkxvbmdUb2tlbiBzc3RhYmxlRW5kRGlzazEgICA9IChNdXJtdXIzUGFydGl0aW9uZXIuTG9uZ1Rva2VuKSBwYXJ0aXRpb25lci5taWRwb2ludChzc3RhYmxlRmlyc3REaXNrMSwgICAgICAgICAgICAgdG9rZW5zLmdldCgwKSk7CisgICAgICAgIE11cm11cjNQYXJ0aXRpb25lci5Mb25nVG9rZW4gc3N0YWJsZUVuZERpc2syICAgPSAoTXVybXVyM1BhcnRpdGlvbmVyLkxvbmdUb2tlbikgcGFydGl0aW9uZXIubWlkcG9pbnQodG9rZW5zLmdldCgwKSwgICAgICAgICAgICAgICAgIHRva2Vucy5nZXQoMSkpOworICAgICAgICBNdXJtdXIzUGFydGl0aW9uZXIuTG9uZ1Rva2VuIHNzdGFibGVGaXJzdERpc2syID0gKE11cm11cjNQYXJ0aXRpb25lci5Mb25nVG9rZW4pIHBhcnRpdGlvbmVyLm1pZHBvaW50KHRva2Vucy5nZXQoMCksICAgICAgICAgICAgICAgICBzc3RhYmxlRW5kRGlzazIpOworCisgICAgICAgIFNTVGFibGVSZWFkZXIgY29udGFpbmVkRGlzazEgPSBNb2NrU2NoZW1hLnNzdGFibGUoZ2VuKyssIChsb25nKXNzdGFibGVGaXJzdERpc2sxLmdldFRva2VuVmFsdWUoKSwgKGxvbmcpc3N0YWJsZUVuZERpc2sxLmdldFRva2VuVmFsdWUoKSwgMCwgbW9jayk7CisgICAgICAgIFNTVGFibGVSZWFkZXIgc3RhcnREaXNrMUVuZERpc2syID0gTW9ja1NjaGVtYS5zc3RhYmxlKGdlbisrLCAobG9uZylzc3RhYmxlRmlyc3REaXNrMS5nZXRUb2tlblZhbHVlKCksIChsb25nKXNzdGFibGVFbmREaXNrMi5nZXRUb2tlblZhbHVlKCksIDAsIG1vY2spOworICAgICAgICBTU1RhYmxlUmVhZGVyIGNvbnRhaW5lZERpc2syID0gTW9ja1NjaGVtYS5zc3RhYmxlKGdlbisrLCAobG9uZylzc3RhYmxlRmlyc3REaXNrMi5nZXRUb2tlblZhbHVlKCksIChsb25nKXNzdGFibGVFbmREaXNrMi5nZXRUb2tlblZhbHVlKCksIDAsIG1vY2spOworCisgICAgICAgIFNTVGFibGVSZWFkZXIgZGlzazFCb3VuZGFyeSA9IE1vY2tTY2hlbWEuc3N0YWJsZShnZW4rKywgKGxvbmcpc3N0YWJsZUZpcnN0RGlzazEuZ2V0VG9rZW5WYWx1ZSgpLCAobG9uZyl0b2tlbnMuZ2V0KDApLmdldFRva2VuVmFsdWUoKSwgMCwgbW9jayk7CisgICAgICAgIFNTVGFibGVSZWFkZXIgZGlzazJGdWxsID0gTW9ja1NjaGVtYS5zc3RhYmxlKGdlbisrLCAobG9uZyl0b2tlbnMuZ2V0KDApLmluY3JlYXNlU2xpZ2h0bHkoKS5nZXRUb2tlblZhbHVlKCksIChsb25nKXRva2Vucy5nZXQoMSkuZ2V0VG9rZW5WYWx1ZSgpLCAwLCBtb2NrKTsKKyAgICAgICAgU1NUYWJsZVJlYWRlciBkaXNrM0Z1bGwgPSBNb2NrU2NoZW1hLnNzdGFibGUoZ2VuKyssIChsb25nKXRva2Vucy5nZXQoMSkuaW5jcmVhc2VTbGlnaHRseSgpLmdldFRva2VuVmFsdWUoKSwgKGxvbmcpcGFydGl0aW9uZXIuZ2V0TWF4aW11bVRva2VuKCkuZ2V0VG9rZW5WYWx1ZSgpLCAwLCBtb2NrKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRhYmxlRGlycywgbW9jay5nZXREaXJlY3Rvcmllc0ZvckZpbGVzKEltbXV0YWJsZVNldC5vZigpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTGlzdHMubmV3QXJyYXlMaXN0KHRhYmxlRGlycy5nZXQoMCkpLCBtb2NrLmdldERpcmVjdG9yaWVzRm9yRmlsZXMoSW1tdXRhYmxlU2V0Lm9mKGNvbnRhaW5lZERpc2sxKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKExpc3RzLm5ld0FycmF5TGlzdCh0YWJsZURpcnMuZ2V0KDApLCB0YWJsZURpcnMuZ2V0KDEpKSwgbW9jay5nZXREaXJlY3Rvcmllc0ZvckZpbGVzKEltbXV0YWJsZVNldC5vZihjb250YWluZWREaXNrMSwgc3RhcnREaXNrMUVuZERpc2syKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKExpc3RzLm5ld0FycmF5TGlzdCh0YWJsZURpcnMuZ2V0KDEpKSwgbW9jay5nZXREaXJlY3Rvcmllc0ZvckZpbGVzKEltbXV0YWJsZVNldC5vZihjb250YWluZWREaXNrMikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhMaXN0cy5uZXdBcnJheUxpc3QodGFibGVEaXJzLmdldCgwKSwgdGFibGVEaXJzLmdldCgxKSksIG1vY2suZ2V0RGlyZWN0b3JpZXNGb3JGaWxlcyhJbW11dGFibGVTZXQub2YoY29udGFpbmVkRGlzazEsIGNvbnRhaW5lZERpc2syKSkpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTGlzdHMubmV3QXJyYXlMaXN0KHRhYmxlRGlycy5nZXQoMCkpLCBtb2NrLmdldERpcmVjdG9yaWVzRm9yRmlsZXMoSW1tdXRhYmxlU2V0Lm9mKGRpc2sxQm91bmRhcnkpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTGlzdHMubmV3QXJyYXlMaXN0KHRhYmxlRGlycy5nZXQoMSkpLCBtb2NrLmdldERpcmVjdG9yaWVzRm9yRmlsZXMoSW1tdXRhYmxlU2V0Lm9mKGRpc2syRnVsbCkpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRhYmxlRGlycywgbW9jay5nZXREaXJlY3Rvcmllc0ZvckZpbGVzKEltbXV0YWJsZVNldC5vZihjb250YWluZWREaXNrMSwgZGlzazNGdWxsKSkpOworICAgIH0KKworICAgIHByaXZhdGUgUGFydGl0aW9uUG9zaXRpb24gcHAobG9uZyB0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHQodCkubWF4S2V5Qm91bmQoKTsKKyAgICB9CisgICAgcHJpdmF0ZSBUb2tlbiB0KGxvbmcgdCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgTXVybXVyM1BhcnRpdGlvbmVyLkxvbmdUb2tlbih0KTsKKyAgICB9CisgICAgcHJpdmF0ZSBEZWNvcmF0ZWRLZXkgZGsobG9uZyB0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJEZWNvcmF0ZWRLZXkodCh0KSwgQnl0ZUJ1ZmZlclV0aWwuRU1QVFlfQllURV9CVUZGRVIpOworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzKExpc3Q8RGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeT4gZGlyMSwgRGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeVtdIGRpcjIpCiAgICAgewogICAgICAgICBpZiAoZGlyMS5zaXplKCkgIT0gZGlyMi5sZW5ndGgpCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvSW1wb3J0VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0ltcG9ydFRlc3QuamF2YQppbmRleCBmZjg0M2ZhLi45ZGMwNmYwIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvSW1wb3J0VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9JbXBvcnRUZXN0LmphdmEKQEAgLTQwLDcgKzQwLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlVudHlwZWRSZXN1bHRTZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Cb290U3RyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OwpAQCAtMjM2LDcgKzIzNiw3IEBACiAgICAgICAgICAgICBzc3RhYmxlLnNlbGZSZWYoKS5yZWxlYXNlKCk7CiAgICAgICAgICAgICBmb3IgKEZpbGUgZiA6IHNzdGFibGUuZGVzY3JpcHRvci5kaXJlY3RvcnkudHJ5TGlzdCgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChmLnRvU3RyaW5nKCkuY29udGFpbnMoc3N0YWJsZS5kZXNjcmlwdG9yLmJhc2VGaWxlbmFtZSgpKSkKKyAgICAgICAgICAgICAgICBpZiAoZi50b1N0cmluZygpLmNvbnRhaW5zKHNzdGFibGUuZGVzY3JpcHRvci5iYXNlRmlsZSgpLnRvU3RyaW5nKCkpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtb3ZlICIgKyBmLnRvUGF0aCgpICsgIiB0byAiICsgYmFja3VwZGlyKTsKICAgICAgICAgICAgICAgICAgICAgRmlsZSBtb3ZlRmlsZVRvID0gbmV3IEZpbGUoYmFja3VwZGlyLCBmLm5hbWUoKSk7CkBAIC0zMTQsOCArMzE0LDggQEAKIAogICAgICAgICBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5jbGVhclVuc2FmZSgpOwogCi0gICAgICAgIFN0cmluZyBmaWxlbmFtZVRvQ29ycnVwdCA9IHNzdGFibGVUb0NvcnJ1cHQuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuU1RBVFMpOwotICAgICAgICB0cnkgKEZpbGVDaGFubmVsIGZpbGVDaGFubmVsID0gbmV3IEZpbGUoZmlsZW5hbWVUb0NvcnJ1cHQpLm5ld1JlYWRXcml0ZUNoYW5uZWwoKSkKKyAgICAgICAgRmlsZSBmaWxlVG9Db3JydXB0ID0gc3N0YWJsZVRvQ29ycnVwdC5kZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5TVEFUUyk7CisgICAgICAgIHRyeSAoRmlsZUNoYW5uZWwgZmlsZUNoYW5uZWwgPSBmaWxlVG9Db3JydXB0Lm5ld1JlYWRXcml0ZUNoYW5uZWwoKSkKICAgICAgICAgewogICAgICAgICAgICAgZmlsZUNoYW5uZWwucG9zaXRpb24oMCk7CiAgICAgICAgICAgICBmaWxlQ2hhbm5lbC53cml0ZShCeXRlQnVmZmVyVXRpbC5ieXRlcyhTdHJpbmdVdGlscy5yZXBlYXQoJ3onLCAyKSkpOwpAQCAtNTc0LDggKzU3NCw4IEBACiAgICAgICAgIHNzdGFibGVzLmZvckVhY2gocyAtPiBzLnNlbGZSZWYoKS5yZWxlYXNlKCkpOwogICAgICAgICAvLyBjb3JydXB0IHRoZSBzc3RhYmxlIHdoaWNoIGlzIHN0aWxsIGluIHRoZSBkYXRhIGRpcmVjdG9yeQogICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGVUb0NvcnJ1cHQgPSBzc3RhYmxlcy5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIGZpbGVuYW1lVG9Db3JydXB0ID0gc3N0YWJsZVRvQ29ycnVwdC5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5TVEFUUyk7Ci0gICAgICAgIHRyeSAoRmlsZUNoYW5uZWwgZmlsZUNoYW5uZWwgPSBuZXcgRmlsZShmaWxlbmFtZVRvQ29ycnVwdCkubmV3UmVhZFdyaXRlQ2hhbm5lbCgpKQorICAgICAgICBGaWxlIGZpbGVUb0NvcnJ1cHQgPSBzc3RhYmxlVG9Db3JydXB0LmRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlNUQVRTKTsKKyAgICAgICAgdHJ5IChGaWxlQ2hhbm5lbCBmaWxlQ2hhbm5lbCA9IGZpbGVUb0NvcnJ1cHQubmV3UmVhZFdyaXRlQ2hhbm5lbCgpKQogICAgICAgICB7CiAgICAgICAgICAgICBmaWxlQ2hhbm5lbC5wb3NpdGlvbigwKTsKICAgICAgICAgICAgIGZpbGVDaGFubmVsLndyaXRlKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKFN0cmluZ1V0aWxzLnJlcGVhdCgneicsIDIpKSk7CkBAIC02MTUsNyArNjE1LDcgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIwLCByb3dDb3VudCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEZpbGVzLCBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5nZXRMaXZlU1NUYWJsZXMoKSk7CiAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogZXhwZWN0ZWRGaWxlcykKLSAgICAgICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUoc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSkuZXhpc3RzKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpLmV4aXN0cygpKTsKICAgICAgICAgZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkudHJ1bmNhdGVCbG9ja2luZygpOwogICAgICAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbi53YWl0Rm9yRGVsZXRpb25zKCk7CiAgICAgICAgIGZvciAoRmlsZSBmIDogc3N0YWJsZVRvQ29ycnVwdC5kZXNjcmlwdG9yLmRpcmVjdG9yeS50cnlMaXN0KCkpIC8vIGNsZWFuIHVwIHRoZSBjb3JydXB0IGZpbGVzIHdoaWNoIHRydW5jYXRlIGRvZXMgbm90IGhhbmRsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0tleUNhY2hlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0tleUNhY2hlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzVmMWExLi4wMDAwMDAwCi0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9LZXlDYWNoZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuQXV0b1NhdmluZ0NhY2hlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLklDYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5LZXlDYWNoZUtleTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2FjaGVTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWZzOwotaW1wb3J0IG9yZy5oYW1jcmVzdC5NYXRjaGVyczsKLWltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOwotaW1wb3J0IG9yZy5tb2NraXRvLmludGVybmFsLnN0dWJiaW5nLmFuc3dlcnMuQW5zd2Vyc1dpdGhEZWxheTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnk7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uZG9BbnN3ZXI7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKLQotcHVibGljIGNsYXNzIEtleUNhY2hlVGVzdAotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTUEFDRTEgPSAiS2V5Q2FjaGVUZXN0MSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFMiA9ICJLZXlDYWNoZVRlc3QyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0ZBTUlMWTEgPSAiU3RhbmRhcmQxIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0ZBTUlMWTIgPSAiU3RhbmRhcmQyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0ZBTUlMWTMgPSAiU3RhbmRhcmQzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0ZBTUlMWTQgPSAiU3RhbmRhcmQ0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0ZBTUlMWTUgPSAiU3RhbmRhcmQ1IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0ZBTUlMWTYgPSAiU3RhbmRhcmQ2IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0ZBTUlMWTcgPSAiU3RhbmRhcmQ3IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0ZBTUlMWTggPSAiU3RhbmRhcmQ4IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0ZBTUlMWTkgPSAiU3RhbmRhcmQ5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0ZBTUlMWTEwID0gIlN0YW5kYXJkMTAiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9GQU1JTFlfSzJfMSA9ICJTdGFuZGFyZDEiOwotCi0KLSAgICBAQmVmb3JlQ2xhc3MKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFNjaGVtYUxvYWRlci5wcmVwYXJlU2VydmVyKCk7Ci0gICAgICAgIFNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZShLRVlTUEFDRTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ09MVU1OX0ZBTUlMWTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENPTFVNTl9GQU1JTFkyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBDT0xVTU5fRkFNSUxZMyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ09MVU1OX0ZBTUlMWTQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENPTFVNTl9GQU1JTFk1KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBDT0xVTU5fRkFNSUxZNiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ09MVU1OX0ZBTUlMWTcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENPTFVNTl9GQU1JTFk4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBDT0xVTU5fRkFNSUxZOSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ09MVU1OX0ZBTUlMWTEwKSk7Ci0KLSAgICAgICAgU2NoZW1hTG9hZGVyLmNyZWF0ZUtleXNwYWNlKEtFWVNQQUNFMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UyLCBDT0xVTU5fRkFNSUxZX0syXzEpKTsKLQotICAgIH0KLQotICAgIEBBZnRlckNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFudXAoKQotICAgIHsKLSAgICAgICAgU2NoZW1hTG9hZGVyLmNsZWFudXBTYXZlZENhY2hlcygpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEtleUNhY2hlTG9hZFNoYWxsb3dJbmRleEVudHJ5KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4Q2FjaGVTaXplKDApOwotICAgICAgICB0ZXN0S2V5Q2FjaGVMb2FkKENPTFVNTl9GQU1JTFkyKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlDYWNoZUxvYWRJbmRleEluZm9PbkhlYXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhDYWNoZVNpemUoOCk7Ci0gICAgICAgIHRlc3RLZXlDYWNoZUxvYWQoQ09MVU1OX0ZBTUlMWTUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0S2V5Q2FjaGVMb2FkKFN0cmluZyBjZikgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0KLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgc3RvcmUgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2YpOwotCi0gICAgICAgIC8vIGVtcHR5IHRoZSBjYWNoZQotICAgICAgICBDYWNoZVNlcnZpY2UuaW5zdGFuY2UuaW52YWxpZGF0ZUtleUNhY2hlKCk7Ci0gICAgICAgIGFzc2VydEtleUNhY2hlU2l6ZSgwLCBLRVlTUEFDRTEsIGNmKTsKLQotICAgICAgICAvLyBpbnNlcnQgZGF0YSBhbmQgZm9yY2UgdG8gZGlzawotICAgICAgICBTY2hlbWFMb2FkZXIuaW5zZXJ0RGF0YShLRVlTUEFDRTEsIGNmLCAwLCAxMDApOwotICAgICAgICBVdGlsLmZsdXNoKHN0b3JlKTsKLQotICAgICAgICAvLyBwb3B1bGF0ZSB0aGUgY2FjaGUKLSAgICAgICAgcmVhZERhdGEoS0VZU1BBQ0UxLCBjZiwgMCwgMTAwKTsKLSAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKDEwMCwgS0VZU1BBQ0UxLCBjZik7Ci0KLSAgICAgICAgLy8gcmVhbGx5PyBvdXIgY2FjaGVzIGRvbid0IGltcGxlbWVudCB0aGUgbWFwIGludGVyZmFjZT8gKGhlbmNlIG5vIC5hZGRBbGwpCi0gICAgICAgIE1hcDxLZXlDYWNoZUtleSwgUm93SW5kZXhFbnRyeT4gc2F2ZWRNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIE1hcDxLZXlDYWNoZUtleSwgUm93SW5kZXhFbnRyeS5JbmRleEluZm9SZXRyaWV2ZXI+IHNhdmVkSW5mb01hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgZm9yIChJdGVyYXRvcjxLZXlDYWNoZUtleT4gaXRlciA9IENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5rZXlJdGVyYXRvcigpOwotICAgICAgICAgICAgIGl0ZXIuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgS2V5Q2FjaGVLZXkgayA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYgKGsuZGVzYy5rc25hbWUuZXF1YWxzKEtFWVNQQUNFMSkgJiYgay5kZXNjLmNmbmFtZS5lcXVhbHMoY2YpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJvd0luZGV4RW50cnkgcmllID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmdldChrKTsKLSAgICAgICAgICAgICAgICBzYXZlZE1hcC5wdXQoaywgcmllKTsKLSAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdHIgPSByZWFkZXJGb3JLZXkoayk7Ci0gICAgICAgICAgICAgICAgc2F2ZWRJbmZvTWFwLnB1dChrLCByaWUub3BlbldpdGhJbmRleChzc3RyLmdldEluZGV4RmlsZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmb3JjZSB0aGUgY2FjaGUgdG8gZGlzawotICAgICAgICBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGUuc3VibWl0V3JpdGUoSW50ZWdlci5NQVhfVkFMVUUpLmdldCgpOwotCi0gICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5pbnZhbGlkYXRlS2V5Q2FjaGUoKTsKLSAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKDAsIEtFWVNQQUNFMSwgY2YpOwotCi0gICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5sb2FkU2F2ZWQoKTsKLSAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKHNhdmVkTWFwLnNpemUoKSwgS0VZU1BBQ0UxLCBjZik7Ci0KLSAgICAgICAgLy8gcHJvYmFibHkgaXQncyBiZXR0ZXIgdG8gYWRkIGVxdWFscy9oYXNoQ29kZSB0byBSb3dJbmRleEVudHJ5Li4uCi0gICAgICAgIGZvciAoTWFwLkVudHJ5PEtleUNhY2hlS2V5LCBSb3dJbmRleEVudHJ5PiBlbnRyeSA6IHNhdmVkTWFwLmVudHJ5U2V0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJvd0luZGV4RW50cnkgZXhwZWN0ZWQgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgUm93SW5kZXhFbnRyeSBhY3R1YWwgPSBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGUuZ2V0KGVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5wb3NpdGlvbiwgYWN0dWFsLnBvc2l0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5jb2x1bW5zSW5kZXhDb3VudCgpLCBhY3R1YWwuY29sdW1uc0luZGV4Q291bnQoKSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLmNvbHVtbnNJbmRleENvdW50KCk7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIGFjdHVhbFNzdHIgPSByZWFkZXJGb3JLZXkoZW50cnkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgIHRyeSAoUm93SW5kZXhFbnRyeS5JbmRleEluZm9SZXRyaWV2ZXIgYWN0dWFsSWlyID0gYWN0dWFsLm9wZW5XaXRoSW5kZXgoYWN0dWFsU3N0ci5nZXRJbmRleEZpbGUoKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBSb3dJbmRleEVudHJ5LkluZGV4SW5mb1JldHJpZXZlciBleHBlY3RlZElpciA9IHNhdmVkSW5mb01hcC5nZXQoZW50cnkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRJaXIuY29sdW1uc0luZGV4KGkpLCBhY3R1YWxJaXIuY29sdW1uc0luZGV4KGkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXhwZWN0ZWQuaXNJbmRleGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmRlbGV0aW9uVGltZSgpLCBhY3R1YWwuZGVsZXRpb25UaW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc2F2ZWRJbmZvTWFwLnZhbHVlcygpLmZvckVhY2goaWlyIC0+IHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChpaXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgaWlyLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU1NUYWJsZVJlYWRlciByZWFkZXJGb3JLZXkoS2V5Q2FjaGVLZXkgaykKLSAgICB7Ci0gICAgICAgIHJldHVybiBDb2x1bW5GYW1pbHlTdG9yZS5nZXRJZkV4aXN0cyhrLmRlc2Mua3NuYW1lLCBrLmRlc2MuY2ZuYW1lKS5nZXRMaXZlU1NUYWJsZXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihzc3RyZWFkZXIgLT4gc3N0cmVhZGVyLmRlc2NyaXB0b3IuaWQgPT0gay5kZXNjLmlkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZEZpcnN0KCkuZ2V0KCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5Q2FjaGVMb2FkV2l0aExvc3RUYWJsZVNoYWxsb3dJbmRleEVudHJ5KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4Q2FjaGVTaXplKDApOwotICAgICAgICB0ZXN0S2V5Q2FjaGVMb2FkV2l0aExvc3RUYWJsZShDT0xVTU5fRkFNSUxZMyk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5Q2FjaGVMb2FkV2l0aExvc3RUYWJsZUluZGV4SW5mb09uSGVhcCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleENhY2hlU2l6ZSg4KTsKLSAgICAgICAgdGVzdEtleUNhY2hlTG9hZFdpdGhMb3N0VGFibGUoQ09MVU1OX0ZBTUlMWTYpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0S2V5Q2FjaGVMb2FkV2l0aExvc3RUYWJsZShTdHJpbmcgY2YpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwotCi0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRTEpLmdldENvbHVtbkZhbWlseVN0b3JlKGNmKTsKLQotICAgICAgICAvLyBlbXB0eSB0aGUgY2FjaGUKLSAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmludmFsaWRhdGVLZXlDYWNoZSgpOwotICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoMCwgS0VZU1BBQ0UxLCBjZik7Ci0KLSAgICAgICAgLy8gaW5zZXJ0IGRhdGEgYW5kIGZvcmNlIHRvIGRpc2sKLSAgICAgICAgU2NoZW1hTG9hZGVyLmluc2VydERhdGEoS0VZU1BBQ0UxLCBjZiwgMCwgMTAwKTsKLSAgICAgICAgVXRpbC5mbHVzaChzdG9yZSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBmaXJzdEZsdXNoVGFibGVzID0gSW1tdXRhYmxlTGlzdC5jb3B5T2Yoc3RvcmUuZ2V0TGl2ZVNTVGFibGVzKCkpOwotCi0gICAgICAgIC8vIHBvcHVsYXRlIHRoZSBjYWNoZQotICAgICAgICByZWFkRGF0YShLRVlTUEFDRTEsIGNmLCAwLCAxMDApOwotICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoMTAwLCBLRVlTUEFDRTEsIGNmKTsKLQotICAgICAgICAvLyBpbnNlcnQgc29tZSBuZXcgZGF0YSBhbmQgZm9yY2UgdG8gZGlzawotICAgICAgICBTY2hlbWFMb2FkZXIuaW5zZXJ0RGF0YShLRVlTUEFDRTEsIGNmLCAxMDAsIDUwKTsKLSAgICAgICAgVXRpbC5mbHVzaChzdG9yZSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgdGhhdCBpdCdzIGZpbmUKLSAgICAgICAgcmVhZERhdGEoS0VZU1BBQ0UxLCBjZiwgMTAwLCA1MCk7Ci0gICAgICAgIGFzc2VydEtleUNhY2hlU2l6ZSgxNTAsIEtFWVNQQUNFMSwgY2YpOwotCi0gICAgICAgIC8vIGZvcmNlIHRoZSBjYWNoZSB0byBkaXNrCi0gICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5zdWJtaXRXcml0ZShJbnRlZ2VyLk1BWF9WQUxVRSkuZ2V0KCk7Ci0KLSAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmludmFsaWRhdGVLZXlDYWNoZSgpOwotICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoMCwgS0VZU1BBQ0UxLCBjZik7Ci0KLSAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgY29udGVudCBpcyB3cml0dGVuIGNvcnJlY3RseQotICAgICAgICBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGUubG9hZFNhdmVkKCk7Ci0gICAgICAgIGFzc2VydEtleUNhY2hlU2l6ZSgxNTAsIEtFWVNQQUNFMSwgY2YpOwotCi0gICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5pbnZhbGlkYXRlS2V5Q2FjaGUoKTsKLSAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKDAsIEtFWVNQQUNFMSwgY2YpOwotCi0gICAgICAgIC8vIG5vdyByZW1vdmUgdGhlIGZpcnN0IHNzdGFibGUgZnJvbSB0aGUgc3RvcmUgdG8gc2ltdWxhdGUgbG9zaW5nIHRoZSBmaWxlCi0gICAgICAgIHN0b3JlLm1hcmtPYnNvbGV0ZShmaXJzdEZsdXNoVGFibGVzLCBPcGVyYXRpb25UeXBlLlVOS05PV04pOwotCi0gICAgICAgIC8vIGNoZWNrIHRoYXQgcmVhZGluZyBub3cgY29ycmVjdGx5IHNraXBzIG92ZXIgbG9zdCB0YWJsZSBhbmQgcmVhZHMgdGhlIHJlc3QgKENBU1NBTkRSQS0xMDIxOSkKLSAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmxvYWRTYXZlZCgpOwotICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoNTAsIEtFWVNQQUNFMSwgY2YpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEtleUNhY2hlU2hhbGxvd0luZGV4RW50cnkoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4Q2FjaGVTaXplKDApOwotICAgICAgICB0ZXN0S2V5Q2FjaGUoQ09MVU1OX0ZBTUlMWTEpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEtleUNhY2hlSW5kZXhJbmZvT25IZWFwKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleENhY2hlU2l6ZSg4KTsKLSAgICAgICAgdGVzdEtleUNhY2hlKENPTFVNTl9GQU1JTFk0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEtleUNhY2hlKFN0cmluZyBjZikgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwotCi0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRTEpOwotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZik7Ci0KLSAgICAgICAgLy8ganVzdCB0byBtYWtlIHN1cmUgdGhhdCBldmVyeXRoaW5nIGlzIGNsZWFuCi0gICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5pbnZhbGlkYXRlS2V5Q2FjaGUoKTsKLQotICAgICAgICAvLyBLZXlDYWNoZSBzaG91bGQgc3RhcnQgYXQgc2l6ZSAwIGlmIHdlJ3JlIGNhY2hpbmcgWCUgb2YgemVybyBkYXRhLgotICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoMCwgS0VZU1BBQ0UxLCBjZik7Ci0KLSAgICAgICAgTXV0YXRpb24gcm07Ci0KLSAgICAgICAgLy8gaW5zZXJ0cwotICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgMCwgImtleTEiKS5jbHVzdGVyaW5nKCIxIikuYnVpbGQoKS5hcHBseVVuc2FmZSgpOwotICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgMCwgImtleTIiKS5jbHVzdGVyaW5nKCIyIikuYnVpbGQoKS5hcHBseVVuc2FmZSgpOwotCi0gICAgICAgIC8vIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIFNTVGFibGUKLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotCi0gICAgICAgIC8vIHJlYWRzIHRvIGNhY2hlIGtleSBwb3NpdGlvbgotICAgICAgICBVdGlsLmdldEFsbChVdGlsLmNtZChjZnMsICJrZXkxIikuYnVpbGQoKSk7Ci0gICAgICAgIFV0aWwuZ2V0QWxsKFV0aWwuY21kKGNmcywgImtleTIiKS5idWlsZCgpKTsKLQotICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoMiwgS0VZU1BBQ0UxLCBjZik7Ci0KLSAgICAgICAgU2V0PFNTVGFibGVSZWFkZXI+IHJlYWRlcnMgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCk7Ci0gICAgICAgIFJlZnM8U1NUYWJsZVJlYWRlcj4gcmVmcyA9IFJlZnMudHJ5UmVmKHJlYWRlcnMpOwotICAgICAgICBpZiAocmVmcyA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIFV0aWwuY29tcGFjdEFsbChjZnMsIEludGVnZXIuTUFYX1ZBTFVFKS5nZXQoKTsKLSAgICAgICAgYm9vbGVhbiBub0Vhcmx5T3BlbiA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU1RhYmxlUHJlZW1wdGl2ZU9wZW5JbnRlcnZhbEluTWlCKCkgPCAwOwotCi0gICAgICAgIC8vIGFmdGVyIGNvbXBhY3Rpb24gY2FjaGUgc2hvdWxkIGhhdmUgZW50cmllcyBmb3IgbmV3IFNTVGFibGVzLAotICAgICAgICAvLyBidXQgc2luY2Ugd2UgaGF2ZSBrZXB0IGEgcmVmZXJlbmNlIHRvIHRoZSBvbGQgc3N0YWJsZXMsCi0gICAgICAgIC8vIGlmIHdlIGhhZCAyIGtleXMgaW4gY2FjaGUgcHJldmlvdXNseSBpdCBzaG91bGQgYmVjb21lIDQKLSAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKG5vRWFybHlPcGVuID8gMiA6IDQsIEtFWVNQQUNFMSwgY2YpOwotCi0gICAgICAgIHJlZnMucmVsZWFzZSgpOwotCi0gICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uLndhaXRGb3JEZWxldGlvbnMoKTsKLQotICAgICAgICAvLyBhZnRlciByZWxlYXNpbmcgdGhlIHJlZmVyZW5jZSB0aGlzIHNob3VsZCBkcm9wIHRvIDIKLSAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKDIsIEtFWVNQQUNFMSwgY2YpOwotCi0gICAgICAgIC8vIHJlLXJlYWQgc2FtZSBrZXlzIHRvIHZlcmlmeSB0aGF0IGtleSBjYWNoZSBkaWRuJ3QgZ3JvdyBmdXJ0aGVyCi0gICAgICAgIFV0aWwuZ2V0QWxsKFV0aWwuY21kKGNmcywgImtleTEiKS5idWlsZCgpKTsKLSAgICAgICAgVXRpbC5nZXRBbGwoVXRpbC5jbWQoY2ZzLCAia2V5MiIpLmJ1aWxkKCkpOwotCi0gICAgICAgIGFzc2VydEtleUNhY2hlU2l6ZShub0Vhcmx5T3BlbiA/IDQgOiAyLCBLRVlTUEFDRTEsIGNmKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlDYWNoZUxvYWRaZXJvQ2FjaGVMb2FkVGltZSgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDYWNoZUxvYWRUaW1lb3V0KDApOwotICAgICAgICBTdHJpbmcgY2YgPSBDT0xVTU5fRkFNSUxZNzsKLQotICAgICAgICBjcmVhdGVBbmRJbnZhbGlkYXRlQ2FjaGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChQYWlyLmNyZWF0ZShLRVlTUEFDRTEsIGNmKSksIDEwMCk7Ci0KLSAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmxvYWRTYXZlZCgpOwotCi0gICAgICAgIC8vIEhlcmUgbWF4IHRpbWUgdG8gbG9hZCBjYWNoZSBpcyB6ZXJvIHdoaWNoIG1lYW5zIG5vIHRpbWUgbGVmdCB0byBsb2FkIGNhY2hlLiBTbyB0aGUga2V5Q2FjaGUgc2l6ZSBzaG91bGQKLSAgICAgICAgLy8gYmUgemVybyBhZnRlciBsb2FkU2F2ZWQoKS4KLSAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKDAsIEtFWVNQQUNFMSwgY2YpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEtleUNhY2hlTG9hZFR3b1RhYmxlc1RpbWUoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q2FjaGVMb2FkVGltZW91dCg2MCk7Ci0gICAgICAgIFN0cmluZyBjb2x1bW5GYW1pbHkxID0gQ09MVU1OX0ZBTUlMWTg7Ci0gICAgICAgIFN0cmluZyBjb2x1bW5GYW1pbHkyID0gQ09MVU1OX0ZBTUlMWV9LMl8xOwotICAgICAgICBpbnQgbnVtYmVyT2ZSb3dzID0gMTAwOwotICAgICAgICBMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiB0YWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oMik7Ci0gICAgICAgIHRhYmxlcy5hZGQoUGFpci5jcmVhdGUoS0VZU1BBQ0UxLCBjb2x1bW5GYW1pbHkxKSk7Ci0gICAgICAgIHRhYmxlcy5hZGQoUGFpci5jcmVhdGUoS0VZU1BBQ0UyLCBjb2x1bW5GYW1pbHkyKSk7Ci0KLSAgICAgICAgY3JlYXRlQW5kSW52YWxpZGF0ZUNhY2hlKHRhYmxlcywgbnVtYmVyT2ZSb3dzKTsKLQotICAgICAgICBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGUubG9hZFNhdmVkKCk7Ci0KLSAgICAgICAgLy8gSGVyZSBtYXggdGltZSB0byBsb2FkIGNhY2hlIGlzIG5lZ2F0aXZlIHdoaWNoIG1lYW5zIG5vIHRpbWUgbGVmdCB0byBsb2FkIGNhY2hlLiBTbyB0aGUga2V5Q2FjaGUgc2l6ZSBzaG91bGQKLSAgICAgICAgLy8gYmUgemVybyBhZnRlciBsb2FkLgotICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUobnVtYmVyT2ZSb3dzLCBLRVlTUEFDRTEsIGNvbHVtbkZhbWlseTEpOwotICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUobnVtYmVyT2ZSb3dzLCBLRVlTUEFDRTIsIGNvbHVtbkZhbWlseTIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJyYXd0eXBlcyIgfSkKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlDYWNoZUxvYWRDYWNoZUxvYWRUaW1lRXhjZWVkaW5nTGltaXQoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q2FjaGVMb2FkVGltZW91dCgyKTsKLSAgICAgICAgaW50IGRlbGF5TWlsbGlzID0gMTAwMDsKLSAgICAgICAgaW50IG51bWJlck9mUm93cyA9IDEwMDsKLQotICAgICAgICBTdHJpbmcgY2YgPSBDT0xVTU5fRkFNSUxZOTsKLQotICAgICAgICBjcmVhdGVBbmRJbnZhbGlkYXRlQ2FjaGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChQYWlyLmNyZWF0ZShLRVlTUEFDRTEsIGNmKSksIG51bWJlck9mUm93cyk7Ci0KLSAgICAgICAgLy8gVGVzdGluZyBjYWNoZSBsb2FkLiBIZXJlIHVzaW5nIGN1c3RvbSBidWlsdCBBdXRvU2F2aW5nQ2FjaGUgaW5zdGFuY2UgYXMgc2ltdWxhdGluZyBkZWxheSBpcyBub3QgcG9zc2libGUgd2l0aAotICAgICAgICAvLyAnQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlJy4gJ0F1dG9TYXZpbmdDYWNoZS5sb2FkU2F2ZWQoKScgaXMgcmV0dXJuaW5nIG5vLm9mIGVudHJpZXMgbG9hZGVkIHNvIHdlIGRvbid0IG5lZWQKLSAgICAgICAgLy8gdG8gaW5zdGFudGlhdGUgSUNhY2hlLmNsYXNzLgotICAgICAgICBDYWNoZVNlcnZpY2UuS2V5Q2FjaGVTZXJpYWxpemVyIGtleUNhY2hlU2VyaWFsaXplciA9IG5ldyBDYWNoZVNlcnZpY2UuS2V5Q2FjaGVTZXJpYWxpemVyKCk7Ci0gICAgICAgIENhY2hlU2VydmljZS5LZXlDYWNoZVNlcmlhbGl6ZXIga2V5Q2FjaGVTZXJpYWxpemVyU3B5ID0gTW9ja2l0by5zcHkoa2V5Q2FjaGVTZXJpYWxpemVyKTsKLSAgICAgICAgQXV0b1NhdmluZ0NhY2hlIGF1dG9TYXZpbmdDYWNoZSA9IG5ldyBBdXRvU2F2aW5nQ2FjaGUobW9jayhJQ2FjaGUuY2xhc3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVNlcnZpY2UuQ2FjaGVUeXBlLktFWV9DQUNIRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5Q2FjaGVTZXJpYWxpemVyU3B5KTsKLQotICAgICAgICBkb0Fuc3dlcihuZXcgQW5zd2Vyc1dpdGhEZWxheShkZWxheU1pbGxpcywgYW5zd2VyIC0+IGtleUNhY2hlU2VyaWFsaXplci5kZXNlcmlhbGl6ZShhbnN3ZXIuZ2V0QXJndW1lbnQoMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuc3dlci5nZXRBcmd1bWVudCgxKSkgKSkKLSAgICAgICAgICAgICAgIC53aGVuKGtleUNhY2hlU2VyaWFsaXplclNweSkuZGVzZXJpYWxpemUoYW55KERhdGFJbnB1dFBsdXMuY2xhc3MpLCBhbnkoQ29sdW1uRmFtaWx5U3RvcmUuY2xhc3MpKTsKLQotICAgICAgICBsb25nIG1heEV4cGVjdGVkS2V5Q2FjaGUgPSBNYXRoLm1pbihudW1iZXJPZlJvd3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKyBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKERhdGFiYXNlRGVzY3JpcHRvci5nZXRDYWNoZUxvYWRUaW1lb3V0KCkpIC8gZGVsYXlNaWxsaXMpOwotCi0gICAgICAgIGxvbmcga2V5c0xvYWRlZCA9IGF1dG9TYXZpbmdDYWNoZS5sb2FkU2F2ZWQoKTsKLSAgICAgICAgYXNzZXJ0VGhhdChrZXlzTG9hZGVkLCBNYXRjaGVycy5sZXNzVGhhbk9yRXF1YWxUbyhtYXhFeHBlY3RlZEtleUNhY2hlKSk7Ci0gICAgICAgIGFzc2VydE5vdEVxdWFscygwLCBrZXlzTG9hZGVkKTsKLSAgICAgICAgTW9ja2l0by52ZXJpZnkoa2V5Q2FjaGVTZXJpYWxpemVyU3B5LCBNb2NraXRvLnRpbWVzKDEpKS5jbGVhbnVwQWZ0ZXJEZXNlcmlhbGl6ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVBbmRJbnZhbGlkYXRlQ2FjaGUoTGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gdGFibGVzLCBpbnQgbnVtYmVyT2ZSb3dzKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0KLSAgICAgICAgLy8gZW1wdHkgdGhlIGNhY2hlCi0gICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5pbnZhbGlkYXRlS2V5Q2FjaGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5zaXplKCkpOwotCi0gICAgICAgIGZvcihQYWlyPFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IHRhYmxlcykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGtleXNwYWNlID0gZW50cnkubGVmdCgpOwotICAgICAgICAgICAgU3RyaW5nIGNmID0gZW50cnkucmlnaHQoKTsKLSAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlID0gS2V5c3BhY2Uub3BlbihrZXlzcGFjZSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2YpOwotCi0gICAgICAgICAgICAvLyBpbnNlcnQgZGF0YSBhbmQgZm9yY2UgdG8gZGlzawotICAgICAgICAgICAgU2NoZW1hTG9hZGVyLmluc2VydERhdGEoa2V5c3BhY2UsIGNmLCAwLCBudW1iZXJPZlJvd3MpOwotICAgICAgICAgICAgVXRpbC5mbHVzaChzdG9yZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yKFBhaXI8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogdGFibGVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5c3BhY2UgPSBlbnRyeS5sZWZ0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgY2YgPSBlbnRyeS5yaWdodCgpOwotICAgICAgICAgICAgLy8gcG9wdWxhdGUgdGhlIGNhY2hlCi0gICAgICAgICAgICByZWFkRGF0YShrZXlzcGFjZSwgY2YsIDAsIG51bWJlck9mUm93cyk7Ci0gICAgICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUobnVtYmVyT2ZSb3dzLCBrZXlzcGFjZSwgY2YpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZm9yY2UgdGhlIGNhY2hlIHRvIGRpc2sKLSAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLnN1Ym1pdFdyaXRlKENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5zaXplKCkpLmdldCgpOwotCi0gICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5pbnZhbGlkYXRlS2V5Q2FjaGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5zaXplKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVhZERhdGEoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgY29sdW1uRmFtaWx5LCBpbnQgc3RhcnRSb3csIGludCBudW1iZXJPZlJvd3MpCi0gICAgewotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBzdG9yZSA9IEtleXNwYWNlLm9wZW4oa2V5c3BhY2UpLmdldENvbHVtbkZhbWlseVN0b3JlKGNvbHVtbkZhbWlseSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZSb3dzOyBpKyspCi0gICAgICAgICAgICBVdGlsLmdldEFsbChVdGlsLmNtZChzdG9yZSwgImtleSIgKyAoaSArIHN0YXJ0Um93KSkuaW5jbHVkZVJvdygiY29sIiArIChpICsgc3RhcnRSb3cpKS5idWlsZCgpKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRLZXlDYWNoZVNpemUoaW50IGV4cGVjdGVkLCBTdHJpbmcga2V5c3BhY2UsIFN0cmluZyBjb2x1bW5GYW1pbHkpCi0gICAgewotICAgICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3I8S2V5Q2FjaGVLZXk+IGl0ZXIgPSBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGUua2V5SXRlcmF0b3IoKTsKLSAgICAgICAgICAgICBpdGVyLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEtleUNhY2hlS2V5IGsgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChrLmRlc2Mua3NuYW1lLmVxdWFscyhrZXlzcGFjZSkgJiYgay5kZXNjLmNmbmFtZS5lcXVhbHMoY29sdW1uRmFtaWx5KSkKLSAgICAgICAgICAgICAgICBzaXplKys7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzaXplKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvS2V5c3BhY2VUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvS2V5c3BhY2VUZXN0LmphdmEKaW5kZXggMjQ0NWZlMy4uMmM1ZTc5MyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0tleXNwYWNlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9LZXlzcGFjZVRlc3QuamF2YQpAQCAtMTksMjggKzE5LDM2IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiOwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7Ci1pbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Db2x1bW5JZGVudGlmaWVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVW50eXBlZFJlc3VsdFNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5DbHVzdGVyaW5nSW5kZXhTbGljZUZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5EYXRhTGltaXRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Sb3dGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5QYXJ0aXRpb25JdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3c7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3dJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFJvd0luZGV4RW50cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DbGVhcmFibGVIaXN0b2dyYW07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKK2ltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiBwdWJsaWMgY2xhc3MgS2V5c3BhY2VUZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCiB7CkBAIC01Myw3ICs2MSw3IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFVudHlwZWRSZXN1bHRTZXQgZXhlY3V0ZShTdHJpbmcgcXVlcnksIE9iamVjdC4uLiB2YWx1ZXMpIHRocm93cyBUaHJvd2FibGUKKyAgICBwcm90ZWN0ZWQgVW50eXBlZFJlc3VsdFNldCBleGVjdXRlKFN0cmluZyBxdWVyeSwgT2JqZWN0Li4uIHZhbHVlcykKICAgICB7CiAgICAgICAgIHJldHVybiBleGVjdXRlRm9ybWF0dGVkUXVlcnkoZm9ybWF0UXVlcnkoS0VZU1BBQ0VfUEVSX1RFU1QsIHF1ZXJ5KSwgdmFsdWVzKTsKICAgICB9CkBAIC00MDcsOCArNDE1LDExIEBACiAKICAgICAgICAgLy8gdmVyaWZ5IHRoYXQgd2UgZG8gaW5kZWVkIGhhdmUgbXVsdGlwbGUgaW5kZXggZW50cmllcwogICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIFJvd0luZGV4RW50cnk8Pz4gaW5kZXhFbnRyeSA9IHNzdGFibGUuZ2V0UG9zaXRpb24oVXRpbC5kaygiMCIpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKTsKLSAgICAgICAgYXNzZXJ0IGluZGV4RW50cnkuY29sdW1uc0luZGV4Q291bnQoKSA+IDI7CisgICAgICAgIGlmIChzc3RhYmxlIGluc3RhbmNlb2YgQmlnVGFibGVSZWFkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFic3RyYWN0Um93SW5kZXhFbnRyeSBpbmRleEVudHJ5ID0gKChCaWdUYWJsZVJlYWRlcikgc3N0YWJsZSkuZ2V0Um93SW5kZXhFbnRyeShVdGlsLmRrKCIwIiksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOworICAgICAgICAgICAgYXNzZXJ0IGluZGV4RW50cnkuYmxvY2tDb3VudCgpID4gMjsKKyAgICAgICAgfQogCiAgICAgICAgIHZhbGlkYXRlU2xpY2VMYXJnZShjZnMpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9OYXRpdmVDZWxsVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL05hdGl2ZUNlbGxUZXN0LmphdmEKaW5kZXggYzcwYmIzYi4uMTkwYmRjZSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL05hdGl2ZUNlbGxUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL05hdGl2ZUNlbGxUZXN0LmphdmEKQEAgLTExOCw3ICsxMTgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQodXVpZC50b1N0cmluZygpLCBmYWxzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXggPyBuZXcgU2V0VHlwZTw+KEJ5dGVzVHlwZS5pbnN0YW5jZSwgdHJ1ZSkgOiBCeXRlc1R5cGUuaW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEuS2luZC5SRUdVTEFSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5NZXRhZGF0YS5LaW5kLlJFR1VMQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgQ2VsbDw/PiBybmRjZWxsKENvbHVtbk1ldGFkYXRhIGNvbCkKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9SZWFkQ29tbWFuZFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9SZWFkQ29tbWFuZFRlc3QuamF2YQppbmRleCA0M2E3OTUyLi5iZjI3MmI4IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvUmVhZENvbW1hbmRUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1JlYWRDb21tYW5kVGVzdC5qYXZhCkBAIC01Niw2ICs1Niw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5RdWVyeUNhbmNlbGxlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0QnVmZmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dEJ1ZmZlcjsKQEAgLTIzMiw3ICsyMzMsMTYgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIFV0aWwuZ2V0QWxsKHJlYWRDb21tYW5kKS5zaXplKCkpOwogCiAgICAgICAgIHJlYWRDb21tYW5kLmFib3J0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBVdGlsLmdldEFsbChyZWFkQ29tbWFuZCkuc2l6ZSgpKTsKKyAgICAgICAgYm9vbGVhbiBjYW5jZWxsZWQgPSBmYWxzZTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFV0aWwuZ2V0QWxsKHJlYWRDb21tYW5kKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUXVlcnlDYW5jZWxsZWRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FuY2VsbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKGNhbmNlbGxlZCk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTI2Myw3ICsyNzMsMTYgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBhcnRpdGlvbnMuZ2V0KDApLnJvd0NvdW50KCkpOwogCiAgICAgICAgIHJlYWRDb21tYW5kLmFib3J0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBVdGlsLmdldEFsbChyZWFkQ29tbWFuZCkuc2l6ZSgpKTsKKyAgICAgICAgYm9vbGVhbiBjYW5jZWxsZWQgPSBmYWxzZTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFV0aWwuZ2V0QWxsKHJlYWRDb21tYW5kKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUXVlcnlDYW5jZWxsZWRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FuY2VsbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKGNhbmNlbGxlZCk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTI5NCw3ICszMTMsMTYgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBhcnRpdGlvbnMuZ2V0KDApLnJvd0NvdW50KCkpOwogCiAgICAgICAgIHJlYWRDb21tYW5kLmFib3J0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBVdGlsLmdldEFsbChyZWFkQ29tbWFuZCkuc2l6ZSgpKTsKKyAgICAgICAgYm9vbGVhbiBjYW5jZWxsZWQgPSBmYWxzZTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFV0aWwuZ2V0QWxsKHJlYWRDb21tYW5kKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUXVlcnlDYW5jZWxsZWRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FuY2VsbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKGNhbmNlbGxlZCk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9SZXBhaXJlZERhdGFUb21ic3RvbmVzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1JlcGFpcmVkRGF0YVRvbWJzdG9uZXNUZXN0LmphdmEKaW5kZXggYmIyNzJhZi4uZGMyZWFhZSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1JlcGFpcmVkRGF0YVRvbWJzdG9uZXNUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1JlcGFpcmVkRGF0YVRvbWJzdG9uZXNUZXN0LmphdmEKQEAgLTMxLDYgKzMxLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CkBAIC0yNjEsNiArMjYyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJvd0l0ZXIuaGFzTmV4dCgpKSByb3dJdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMzEyLDQgKzMxNyw0IEBACiAgICAgICAgIHNzdGFibGUucmVsb2FkU1NUYWJsZU1ldGFkYXRhKCk7CiAgICAgICAgIGNmcy5nZXRUcmFja2VyKCkubm90aWZ5U1NUYWJsZVJlcGFpcmVkU3RhdHVzQ2hhbmdlZChDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3N0YWJsZSkpOwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvUm93Q2FjaGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvUm93Q2FjaGVUZXN0LmphdmEKaW5kZXggMGJmOGM1ZC4uNGIzN2U2OSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1Jvd0NhY2hlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Sb3dDYWNoZVRlc3QuamF2YQpAQCAtNTQsNiArNTQsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX09SR19DQUZGSU5JVEFTX09IQ19TRUdNRU5UQ09VTlQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKIAogcHVibGljIGNsYXNzIFJvd0NhY2hlVGVzdApAQCAtNjYsNyArNjcsNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVTY2hlbWEoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJvcmcuY2FmZmluaXRhcy5vaGMuc2VnbWVudENvdW50IiwgIjE2Iik7CisgICAgICAgIFRFU1RfT1JHX0NBRkZJTklUQVNfT0hDX1NFR01FTlRDT1VOVC5zZXRJbnQoMTYpOwogICAgICAgICBTY2hlbWFMb2FkZXIucHJlcGFyZVNlcnZlcigpOwogICAgICAgICBTY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2UoS0VZU1BBQ0VfQ0FDSEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5c3BhY2VQYXJhbXMuc2ltcGxlKDEpLApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1Jvd0luZGV4RW50cnlUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvUm93SW5kZXhFbnRyeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmYjU3ZC4uMDAwMDAwMAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvUm93SW5kZXhFbnRyeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuSW50czsKLWltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5JTWVhc3VyYWJsZU1lbW9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkNyZWF0ZVRhYmxlU3RhdGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29sdW1uaXRlcmF0b3IuQWJzdHJhY3RTU1RhYmxlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Mb25nVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLkltbXV0YWJsZUJUcmVlUGFydGl0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQWJzdHJhY3RVbmZpbHRlcmVkUm93SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5CVHJlZVJvdzsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkJ1ZmZlckNlbGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Db2x1bW5EYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuRW5jb2RpbmdTdGF0czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJhbmdlVG9tYnN0b25lTWFya2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuU2VyaWFsaXphdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTXVybXVyM1BhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkluZGV4SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRmx1c2hPYnNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLkxvbmdTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk9iamVjdFNpemVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ0cmVlLkJUcmVlOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLXB1YmxpYyBjbGFzcyBSb3dJbmRleEVudHJ5VGVzdCBleHRlbmRzIENRTFRlc3RlcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBjbHVzdGVyVHlwZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KExvbmdUeXBlLmluc3RhbmNlKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wID0gbmV3IENsdXN0ZXJpbmdDb21wYXJhdG9yKGNsdXN0ZXJUeXBlcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gZHVtbXlfMTAwayA9IG5ldyBieXRlWzEwMDAwMF07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDbHVzdGVyaW5nPD8+IGNuKGxvbmcgbCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBVdGlsLmNsdXN0ZXJpbmcoY29tcCwgbCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QzExMjA2QWdhaW5zdFByZXZpb3VzQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhDYWNoZVNpemUoOTk5OTkpOwotICAgICAgICB0ZXN0QzExMjA2QWdhaW5zdFByZXZpb3VzKCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QzExMjA2QWdhaW5zdFByZXZpb3VzU2hhbGxvdygpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleENhY2hlU2l6ZSgwKTsKLSAgICAgICAgdGVzdEMxMTIwNkFnYWluc3RQcmV2aW91cygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdEMxMTIwNkFnYWluc3RQcmV2aW91cygpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIHBhcnRpdGlvbiB3aXRob3V0IEluZGV4SW5mbwotICAgICAgICB0cnkgKERvdWJsZVNlcmlhbGl6ZXIgZG91YmxlU2VyaWFsaXplciA9IG5ldyBEb3VibGVTZXJpYWxpemVyKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRvdWJsZVNlcmlhbGl6ZXIuYnVpbGQobnVsbCwgcGFydGl0aW9uS2V5KDQyTCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY24oNDIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMEwpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRvdWJsZVNlcmlhbGl6ZXIucmllT2xkU2VyaWFsaXplZCwgZG91YmxlU2VyaWFsaXplci5yaWVOZXdTZXJpYWxpemVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHBhcnRpdGlvbiB3aXRoIG11bHRpcGxlIEluZGV4SW5mbwotICAgICAgICB0cnkgKERvdWJsZVNlcmlhbGl6ZXIgZG91YmxlU2VyaWFsaXplciA9IG5ldyBEb3VibGVTZXJpYWxpemVyKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRvdWJsZVNlcmlhbGl6ZXIuYnVpbGQobnVsbCwgcGFydGl0aW9uS2V5KDQyTCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoY24oNDIpLCBjbig0MyksIGNuKDQ0KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBMKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhkb3VibGVTZXJpYWxpemVyLnJpZU9sZFNlcmlhbGl6ZWQsIGRvdWJsZVNlcmlhbGl6ZXIucmllTmV3U2VyaWFsaXplZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwYXJ0aXRpb24gd2l0aCBtdWx0aXBsZSBJbmRleEluZm8KLSAgICAgICAgdHJ5IChEb3VibGVTZXJpYWxpemVyIGRvdWJsZVNlcmlhbGl6ZXIgPSBuZXcgRG91YmxlU2VyaWFsaXplcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBkb3VibGVTZXJpYWxpemVyLmJ1aWxkKG51bGwsIHBhcnRpdGlvbktleSg0MkwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KGNuKDQyKSwgY24oNDMpLCBjbig0NCksIGNuKDQ1KSwgY24oNDYpLCBjbig0NyksIGNuKDQ4KSwgY24oNDkpLCBjbig1MCksIGNuKDUxKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBMKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhkb3VibGVTZXJpYWxpemVyLnJpZU9sZFNlcmlhbGl6ZWQsIGRvdWJsZVNlcmlhbGl6ZXIucmllTmV3U2VyaWFsaXplZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5KGxvbmcgbCkKLSAgICB7Ci0gICAgICAgIEJ5dGVCdWZmZXIga2V5ID0gTG9uZ1NlcmlhbGl6ZXIuaW5zdGFuY2Uuc2VyaWFsaXplKGwpOwotICAgICAgICBUb2tlbiB0b2tlbiA9IE11cm11cjNQYXJ0aXRpb25lci5pbnN0YW5jZS5nZXRUb2tlbihrZXkpOwotICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlckRlY29yYXRlZEtleSh0b2tlbiwga2V5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEb3VibGVTZXJpYWxpemVyIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZQotICAgIHsKLSAgICAgICAgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSA9Ci0gICAgICAgICAgICBDcmVhdGVUYWJsZVN0YXRlbWVudC5wYXJzZSgiQ1JFQVRFIFRBQkxFIHBpcGUuZGV2X251bGwgKHBrIGJpZ2ludCwgY2sgYmlnaW50LCB2YWwgdGV4dCwgUFJJTUFSWSBLRVkocGssIGNrKSkiLCAiZm9vIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICAgICAgVmVyc2lvbiB2ZXJzaW9uID0gQmlnRm9ybWF0LmxhdGVzdFZlcnNpb247Ci0KLSAgICAgICAgRGVsZXRpb25UaW1lIGRlbGV0aW9uSW5mbyA9IG5ldyBEZWxldGlvblRpbWUoRkJVdGlsaXRpZXMudGltZXN0YW1wTWljcm9zKCksIEZCVXRpbGl0aWVzLm5vd0luU2Vjb25kcygpKTsKLSAgICAgICAgTGl2ZW5lc3NJbmZvIHByaW1hcnlLZXlMaXZlbmVzc0luZm8gPSBMaXZlbmVzc0luZm8uRU1QVFk7Ci0gICAgICAgIFJvdy5EZWxldGlvbiBkZWxldGlvbiA9IFJvdy5EZWxldGlvbi5MSVZFOwotCi0gICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyID0gbmV3IFNlcmlhbGl6YXRpb25IZWFkZXIodHJ1ZSwgbWV0YWRhdGEsIG1ldGFkYXRhLnJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zKCksIEVuY29kaW5nU3RhdHMuTk9fU1RBVFMpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBDLTExMjA2ICsgb2xkIHNlcmlhbGl6ZXIgaW5zdGFuY2VzCi0gICAgICAgIFJvd0luZGV4RW50cnkuSW5kZXhTZXJpYWxpemVyIHJpZVNlcmlhbGl6ZXIgPSBuZXcgUm93SW5kZXhFbnRyeS5TZXJpYWxpemVyKHZlcnNpb24sIGhlYWRlcik7Ci0gICAgICAgIFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkuU2VyaWFsaXplciBvbGRTZXJpYWxpemVyID0gbmV3IFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkuU2VyaWFsaXplcihtZXRhZGF0YSwgdmVyc2lvbiwgaGVhZGVyKTsKLQotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyZXNvdXJjZSIsICJJT1Jlc291cmNlT3BlbmVkQnV0Tm90U2FmZWx5Q2xvc2VkIiB9KQotICAgICAgICBmaW5hbCBEYXRhT3V0cHV0QnVmZmVyIHJpZU91dHB1dCA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKDEwMjQpOwotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyZXNvdXJjZSIsICJJT1Jlc291cmNlT3BlbmVkQnV0Tm90U2FmZWx5Q2xvc2VkIiB9KQotICAgICAgICBmaW5hbCBEYXRhT3V0cHV0QnVmZmVyIG9sZE91dHB1dCA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKDEwMjQpOwotCi0gICAgICAgIGZpbmFsIFNlcXVlbnRpYWxXcml0ZXIgZGF0YVdyaXRlck5ldzsKLSAgICAgICAgZmluYWwgU2VxdWVudGlhbFdyaXRlciBkYXRhV3JpdGVyT2xkOwotICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5JbmRleCBjb2x1bW5JbmRleDsKLQotICAgICAgICBSb3dJbmRleEVudHJ5IHJpZU5ldzsKLSAgICAgICAgQnl0ZUJ1ZmZlciByaWVOZXdTZXJpYWxpemVkOwotICAgICAgICBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5IHJpZU9sZDsKLSAgICAgICAgQnl0ZUJ1ZmZlciByaWVPbGRTZXJpYWxpemVkOwotCi0gICAgICAgIERvdWJsZVNlcmlhbGl6ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgU2VxdWVudGlhbFdyaXRlck9wdGlvbiBvcHRpb24gPSBTZXF1ZW50aWFsV3JpdGVyT3B0aW9uLm5ld0J1aWxkZXIoKS5idWZmZXJTaXplKDEwMjQpLmJ1aWxkKCk7Ci0gICAgICAgICAgICBGaWxlIGYgPSBGaWxlVXRpbHMuY3JlYXRlVGVtcEZpbGUoIlJvd0luZGV4RW50cnlUZXN0LSIsICJkYiIpOwotICAgICAgICAgICAgZGF0YVdyaXRlck5ldyA9IG5ldyBTZXF1ZW50aWFsV3JpdGVyKGYsIG9wdGlvbik7Ci0gICAgICAgICAgICBjb2x1bW5JbmRleCA9IG5ldyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5JbmRleChoZWFkZXIsIGRhdGFXcml0ZXJOZXcsIHZlcnNpb24sIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmllU2VyaWFsaXplci5pbmRleEluZm9TZXJpYWxpemVyKCkpOwotCi0gICAgICAgICAgICBmID0gRmlsZVV0aWxzLmNyZWF0ZVRlbXBGaWxlKCJSb3dJbmRleEVudHJ5VGVzdC0iLCAiZGIiKTsKLSAgICAgICAgICAgIGRhdGFXcml0ZXJPbGQgPSBuZXcgU2VxdWVudGlhbFdyaXRlcihmLCBvcHRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRhdGFXcml0ZXJOZXcuY2xvc2UoKTsKLSAgICAgICAgICAgIGRhdGFXcml0ZXJPbGQuY2xvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYnVpbGQoUm93IHN0YXRpY1JvdywgRGVjb3JhdGVkS2V5IHBhcnRpdGlvbktleSwKLSAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPENsdXN0ZXJpbmc8Pz4+IGNsdXN0ZXJpbmdzLCBsb25nIHN0YXJ0UG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0KLSAgICAgICAgICAgIEl0ZXJhdG9yPENsdXN0ZXJpbmc8Pz4+IGNsdXN0ZXJpbmdJdGVyID0gY2x1c3RlcmluZ3MuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGNvbHVtbkluZGV4LmJ1aWxkUm93SW5kZXgobWFrZVJvd0l0ZXIoc3RhdGljUm93LCBwYXJ0aXRpb25LZXksIGNsdXN0ZXJpbmdJdGVyLCBkYXRhV3JpdGVyTmV3KSk7Ci0gICAgICAgICAgICByaWVOZXcgPSBSb3dJbmRleEVudHJ5LmNyZWF0ZShzdGFydFBvc2l0aW9uLCAwTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0aW9uSW5mbywgY29sdW1uSW5kZXguaGVhZGVyTGVuZ3RoLCBjb2x1bW5JbmRleC5jb2x1bW5JbmRleENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXguaW5kZXhJbmZvU2VyaWFsaXplZFNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4LmluZGV4U2FtcGxlcygpLCBjb2x1bW5JbmRleC5vZmZzZXRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWVTZXJpYWxpemVyLmluZGV4SW5mb1NlcmlhbGl6ZXIoKSk7Ci0gICAgICAgICAgICByaWVTZXJpYWxpemVyLnNlcmlhbGl6ZShyaWVOZXcsIHJpZU91dHB1dCwgY29sdW1uSW5kZXguYnVmZmVyKCkpOwotICAgICAgICAgICAgcmllTmV3U2VyaWFsaXplZCA9IHJpZU91dHB1dC5idWZmZXIoKS5kdXBsaWNhdGUoKTsKLQotICAgICAgICAgICAgSXRlcmF0b3I8Q2x1c3RlcmluZzw/Pj4gY2x1c3RlcmluZ0l0ZXIyID0gY2x1c3RlcmluZ3MuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIENvbHVtbkluZGV4IGNvbHVtbkluZGV4ID0gUm93SW5kZXhFbnRyeVRlc3QuQ29sdW1uSW5kZXgud3JpdGVBbmRCdWlsZEluZGV4KG1ha2VSb3dJdGVyKHN0YXRpY1JvdywgcGFydGl0aW9uS2V5LCBjbHVzdGVyaW5nSXRlcjIsIGRhdGFXcml0ZXJPbGQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVdyaXRlck9sZCwgaGVhZGVyLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCBCaWdGb3JtYXQubGF0ZXN0VmVyc2lvbik7Ci0gICAgICAgICAgICByaWVPbGQgPSBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5LmNyZWF0ZShzdGFydFBvc2l0aW9uLCBkZWxldGlvbkluZm8sIGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgIG9sZFNlcmlhbGl6ZXIuc2VyaWFsaXplKHJpZU9sZCwgb2xkT3V0cHV0KTsKLSAgICAgICAgICAgIHJpZU9sZFNlcmlhbGl6ZWQgPSBvbGRPdXRwdXQuYnVmZmVyKCkuZHVwbGljYXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIEFic3RyYWN0VW5maWx0ZXJlZFJvd0l0ZXJhdG9yIG1ha2VSb3dJdGVyKFJvdyBzdGF0aWNSb3csIERlY29yYXRlZEtleSBwYXJ0aXRpb25LZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8Q2x1c3RlcmluZzw/Pj4gY2x1c3RlcmluZ0l0ZXIsIFNlcXVlbnRpYWxXcml0ZXIgZGF0YVdyaXRlcikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdFVuZmlsdGVyZWRSb3dJdGVyYXRvcihtZXRhZGF0YSwgcGFydGl0aW9uS2V5LCBkZWxldGlvbkluZm8sIG1ldGFkYXRhLnJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY1JvdywgZmFsc2UsIG5ldyBFbmNvZGluZ1N0YXRzKDAsIDAsIDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkIGNvbXB1dGVOZXh0KCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghY2x1c3RlcmluZ0l0ZXIuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuZE9mRGF0YSgpOwotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgc29tZSBmYWtlIGJ5dGVzIHRvIHRoZSBkYXRhIGZpbGUgdG8gZm9yY2Ugd3JpdGluZyB0aGUgSW5kZXhJbmZvIG9iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVdyaXRlci53cml0ZShkdW1teV8xMDBrKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkUm93KGNsdXN0ZXJpbmdJdGVyLm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgVW5maWx0ZXJlZCBidWlsZFJvdyhDbHVzdGVyaW5nPD8+IGNsdXN0ZXJpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJUcmVlLkJ1aWxkZXI8Q29sdW1uRGF0YT4gYnVpbGRlciA9IEJUcmVlLmJ1aWxkZXIoQ29sdW1uRGF0YS5jb21wYXJhdG9yKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYWRkKEJ1ZmZlckNlbGwubGl2ZShtZXRhZGF0YS5yZWd1bGFyQW5kU3RhdGljQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIuYWxsb2NhdGUoMCkpKTsKLSAgICAgICAgICAgIHJldHVybiBCVHJlZVJvdy5jcmVhdGUoY2x1c3RlcmluZywgcHJpbWFyeUtleUxpdmVuZXNzSW5mbywgZGVsZXRpb24sIGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmUgQy0xMTIwNiBjb2RlLgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBDb2x1bW5JbmRleAotICAgIHsKLSAgICAgICAgZmluYWwgbG9uZyBwYXJ0aXRpb25IZWFkZXJMZW5ndGg7Ci0gICAgICAgIGZpbmFsIExpc3Q8SW5kZXhJbmZvPiBjb2x1bW5zSW5kZXg7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sdW1uSW5kZXggRU1QVFkgPSBuZXcgQ29sdW1uSW5kZXgoLTEsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLQotICAgICAgICBwcml2YXRlIENvbHVtbkluZGV4KGxvbmcgcGFydGl0aW9uSGVhZGVyTGVuZ3RoLCBMaXN0PEluZGV4SW5mbz4gY29sdW1uc0luZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgY29sdW1uc0luZGV4ICE9IG51bGw7Ci0KLSAgICAgICAgICAgIHRoaXMucGFydGl0aW9uSGVhZGVyTGVuZ3RoID0gcGFydGl0aW9uSGVhZGVyTGVuZ3RoOwotICAgICAgICAgICAgdGhpcy5jb2x1bW5zSW5kZXggPSBjb2x1bW5zSW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgQ29sdW1uSW5kZXggd3JpdGVBbmRCdWlsZEluZGV4KFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW50aWFsV3JpdGVyIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPFNTVGFibGVGbHVzaE9ic2VydmVyPiBvYnNlcnZlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFpdGVyYXRvci5pc0VtcHR5KCk7Ci0KLSAgICAgICAgICAgIEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBCdWlsZGVyKGl0ZXJhdG9yLCBvdXRwdXQsIGhlYWRlciwgb2JzZXJ2ZXJzLCB2ZXJzaW9uLmNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uKCkpOwotICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ29sdW1uSW5kZXggbm90aGluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBFTVBUWTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBIZWxwIHRvIGNyZWF0ZSBhbiBpbmRleCBmb3IgYSBjb2x1bW4gZmFtaWx5IGJhc2VkIG9uIHNpemUgb2YgY29sdW1ucywKLSAgICAgICAgICogYW5kIHdyaXRlIHNhaWQgY29sdW1ucyB0byBkaXNrLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQnVpbGRlcgotICAgICAgICB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvcjsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgU2VxdWVudGlhbFdyaXRlciB3cml0ZXI7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIFNlcmlhbGl6YXRpb25IZWxwZXIgaGVscGVyOwotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlcjsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgaW50IHZlcnNpb247Ci0KLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxJbmRleEluZm8+IGNvbHVtbnNJbmRleCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGluaXRpYWxQb3NpdGlvbjsKLSAgICAgICAgICAgIHByaXZhdGUgbG9uZyBoZWFkZXJMZW5ndGggPSAtMTsKLQotICAgICAgICAgICAgcHJpdmF0ZSBsb25nIHN0YXJ0UG9zaXRpb24gPSAtMTsKLQotICAgICAgICAgICAgcHJpdmF0ZSBpbnQgd3JpdHRlbjsKLSAgICAgICAgICAgIHByaXZhdGUgbG9uZyBwcmV2aW91c1Jvd1N0YXJ0OwotCi0gICAgICAgICAgICBwcml2YXRlIENsdXN0ZXJpbmdQcmVmaXg8Pz4gZmlyc3RDbHVzdGVyaW5nOwotICAgICAgICAgICAgcHJpdmF0ZSBDbHVzdGVyaW5nUHJlZml4PD8+IGxhc3RDbHVzdGVyaW5nOwotCi0gICAgICAgICAgICBwcml2YXRlIERlbGV0aW9uVGltZSBvcGVuTWFya2VyOwotCi0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248U1NUYWJsZUZsdXNoT2JzZXJ2ZXI+IG9ic2VydmVyczsKLQotICAgICAgICAgICAgQnVpbGRlcihVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW50aWFsV3JpdGVyIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxTU1RhYmxlRmx1c2hPYnNlcnZlcj4gb2JzZXJ2ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZlcnNpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotICAgICAgICAgICAgICAgIHRoaXMud3JpdGVyID0gd3JpdGVyOwotICAgICAgICAgICAgICAgIHRoaXMuaGVscGVyID0gbmV3IFNlcmlhbGl6YXRpb25IZWxwZXIoaGVhZGVyKTsKLSAgICAgICAgICAgICAgICB0aGlzLmhlYWRlciA9IGhlYWRlcjsKLSAgICAgICAgICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotICAgICAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzID0gb2JzZXJ2ZXJzID09IG51bGwgPyBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSA6IG9ic2VydmVyczsKLSAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxQb3NpdGlvbiA9IHdyaXRlci5wb3NpdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVQYXJ0aXRpb25IZWFkZXIoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC53cml0ZVdpdGhTaG9ydExlbmd0aChpdGVyYXRvci5wYXJ0aXRpb25LZXkoKS5nZXRLZXkoKSwgd3JpdGVyKTsKLSAgICAgICAgICAgICAgICBEZWxldGlvblRpbWUuc2VyaWFsaXplci5zZXJpYWxpemUoaXRlcmF0b3IucGFydGl0aW9uTGV2ZWxEZWxldGlvbigpLCB3cml0ZXIpOwotICAgICAgICAgICAgICAgIGlmIChoZWFkZXIuaGFzU3RhdGljKCkpCi0gICAgICAgICAgICAgICAgICAgIFVuZmlsdGVyZWRTZXJpYWxpemVyLnNlcmlhbGl6ZXIuc2VyaWFsaXplU3RhdGljUm93KGl0ZXJhdG9yLnN0YXRpY1JvdygpLCBoZWxwZXIsIHdyaXRlciwgdmVyc2lvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBDb2x1bW5JbmRleCBidWlsZCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlUGFydGl0aW9uSGVhZGVyKGl0ZXJhdG9yKTsKLSAgICAgICAgICAgICAgICB0aGlzLmhlYWRlckxlbmd0aCA9IHdyaXRlci5wb3NpdGlvbigpIC0gaW5pdGlhbFBvc2l0aW9uOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICAgICAgYWRkKGl0ZXJhdG9yLm5leHQoKSk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBsb25nIGN1cnJlbnRQb3NpdGlvbigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHdyaXRlci5wb3NpdGlvbigpIC0gaW5pdGlhbFBvc2l0aW9uOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgYWRkSW5kZXhCbG9jaygpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSW5kZXhJbmZvIGNJbmRleEluZm8gPSBuZXcgSW5kZXhJbmZvKGZpcnN0Q2x1c3RlcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdENsdXN0ZXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbigpIC0gc3RhcnRQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Blbk1hcmtlcik7Ci0gICAgICAgICAgICAgICAgY29sdW1uc0luZGV4LmFkZChjSW5kZXhJbmZvKTsKLSAgICAgICAgICAgICAgICBmaXJzdENsdXN0ZXJpbmcgPSBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgYWRkKFVuZmlsdGVyZWQgdW5maWx0ZXJlZCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZyBwb3MgPSBjdXJyZW50UG9zaXRpb24oKTsKLQotICAgICAgICAgICAgICAgIGlmIChmaXJzdENsdXN0ZXJpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEJlZ2lubmluZyBvZiBhbiBpbmRleCBibG9jay4gUmVtZW1iZXIgdGhlIHN0YXJ0IGFuZCBwb3NpdGlvbgotICAgICAgICAgICAgICAgICAgICBmaXJzdENsdXN0ZXJpbmcgPSB1bmZpbHRlcmVkLmNsdXN0ZXJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRQb3NpdGlvbiA9IHBvczsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBVbmZpbHRlcmVkU2VyaWFsaXplci5zZXJpYWxpemVyLnNlcmlhbGl6ZSh1bmZpbHRlcmVkLCBoZWxwZXIsIHdyaXRlciwgcG9zIC0gcHJldmlvdXNSb3dTdGFydCwgdmVyc2lvbik7Ci0KLSAgICAgICAgICAgICAgICAvLyBub3RpZnkgb2JzZXJ2ZXJzIGFib3V0IGVhY2ggbmV3IHJvdwotICAgICAgICAgICAgICAgIGlmICghb2JzZXJ2ZXJzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXJzLmZvckVhY2goKG8pIC0+IG8ubmV4dFVuZmlsdGVyZWRDbHVzdGVyKHVuZmlsdGVyZWQpKTsKLQotICAgICAgICAgICAgICAgIGxhc3RDbHVzdGVyaW5nID0gdW5maWx0ZXJlZC5jbHVzdGVyaW5nKCk7Ci0gICAgICAgICAgICAgICAgcHJldmlvdXNSb3dTdGFydCA9IHBvczsKLSAgICAgICAgICAgICAgICArK3dyaXR0ZW47Ci0KLSAgICAgICAgICAgICAgICBpZiAodW5maWx0ZXJlZC5raW5kKCkgPT0gVW5maWx0ZXJlZC5LaW5kLlJBTkdFX1RPTUJTVE9ORV9NQVJLRVIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBSYW5nZVRvbWJzdG9uZU1hcmtlciBtYXJrZXIgPSAoUmFuZ2VUb21ic3RvbmVNYXJrZXIpdW5maWx0ZXJlZDsKLSAgICAgICAgICAgICAgICAgICAgb3Blbk1hcmtlciA9IG1hcmtlci5pc09wZW4oZmFsc2UpID8gbWFya2VyLm9wZW5EZWxldGlvblRpbWUoZmFsc2UpIDogbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoaXQgdGhlIGNvbHVtbiBpbmRleCBzaXplIHRoYXQgd2UgaGF2ZSB0byBpbmRleCBhZnRlciwgZ28gYWhlYWQgYW5kIGluZGV4IGl0LgotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UG9zaXRpb24oKSAtIHN0YXJ0UG9zaXRpb24gPj0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbHVtbkluZGV4U2l6ZSgpKQotICAgICAgICAgICAgICAgICAgICBhZGRJbmRleEJsb2NrKCk7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBDb2x1bW5JbmRleCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFVuZmlsdGVyZWRTZXJpYWxpemVyLnNlcmlhbGl6ZXIud3JpdGVFbmRPZlBhcnRpdGlvbih3cml0ZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB3ZSBhZGQgbm8gcm93cywganVzdCBhIHRvcCBsZXZlbCBkZWxldGlvbgotICAgICAgICAgICAgICAgIGlmICh3cml0dGVuID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBSb3dJbmRleEVudHJ5VGVzdC5Db2x1bW5JbmRleC5FTVBUWTsKLQotICAgICAgICAgICAgICAgIC8vIHRoZSBsYXN0IGNvbHVtbiBtYXkgaGF2ZSBmYWxsZW4gb24gYW4gaW5kZXggYm91bmRhcnkgYWxyZWFkeS4gIGlmIG5vdCwgaW5kZXggaXQgZXhwbGljaXRseS4KLSAgICAgICAgICAgICAgICBpZiAoZmlyc3RDbHVzdGVyaW5nICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGFkZEluZGV4QmxvY2soKTsKLQotICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBhbHdheXMgaGF2ZSBhdCBsZWFzdCBvbmUgY29tcHV0ZWQgaW5kZXggYmxvY2ssIGJ1dCB3ZSBvbmx5IHdyaXRlIGl0IG91dCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gdGhhdC4KLSAgICAgICAgICAgICAgICBhc3NlcnQgIWNvbHVtbnNJbmRleC5pc0VtcHR5KCkgJiYgaGVhZGVyTGVuZ3RoID49IDA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5JbmRleChoZWFkZXJMZW5ndGgsIGNvbHVtbnNJbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVkU2l6ZSgpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIFN0cmluZyB0YWJsZU5hbWUgPSBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChhIGludCwgYiB0ZXh0LCBjIGludCwgUFJJTUFSWSBLRVkoYSwgYikpIik7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldENvbHVtbkZhbWlseVN0b3JlKHRhYmxlTmFtZSk7Ci0KLSAgICAgICAgUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeSBzaW1wbGUgPSBuZXcgUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeSgxMjMpOwotCi0gICAgICAgIERhdGFPdXRwdXRCdWZmZXIgYnVmZmVyID0gbmV3IERhdGFPdXRwdXRCdWZmZXIoKTsKLSAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIgPSBuZXcgU2VyaWFsaXphdGlvbkhlYWRlcih0cnVlLCBjZnMubWV0YWRhdGEoKSwgY2ZzLm1ldGFkYXRhKCkucmVndWxhckFuZFN0YXRpY0NvbHVtbnMoKSwgRW5jb2RpbmdTdGF0cy5OT19TVEFUUyk7Ci0gICAgICAgIFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkuU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkuU2VyaWFsaXplcihjZnMubWV0YWRhdGEoKSwgQmlnRm9ybWF0LmxhdGVzdFZlcnNpb24sIGhlYWRlcik7Ci0KLSAgICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUoc2ltcGxlLCBidWZmZXIpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhidWZmZXIuZ2V0TGVuZ3RoKCksIHNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoc2ltcGxlKSk7Ci0KLSAgICAgICAgLy8gd3JpdGUgZW5vdWdoIHJvd3MgdG8gZW5zdXJlIHdlIGdldCBhIGZldyBjb2x1bW4gaW5kZXggZW50cmllcwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29sdW1uSW5kZXhTaXplKCkgLyA0OyBpKyspCi0gICAgICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYiwgYykgVkFMVUVTICg/LCA/LCA/KSIsIDAsIFN0cmluZy52YWx1ZU9mKGkpLCBpKTsKLQotICAgICAgICBJbW11dGFibGVCVHJlZVBhcnRpdGlvbiBwYXJ0aXRpb24gPSBVdGlsLmdldE9ubHlQYXJ0aXRpb25VbmZpbHRlcmVkKFV0aWwuY21kKGNmcykuYnVpbGQoKSk7Ci0KLSAgICAgICAgRmlsZSB0ZW1wRmlsZSA9IEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZSgicm93X2luZGV4X2VudHJ5X3Rlc3QiLCBudWxsKTsKLSAgICAgICAgdGVtcEZpbGUuZGVsZXRlT25FeGl0KCk7Ci0gICAgICAgIFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyID0gbmV3IFNlcXVlbnRpYWxXcml0ZXIodGVtcEZpbGUpOwotICAgICAgICBDb2x1bW5JbmRleCBjb2x1bW5JbmRleCA9IFJvd0luZGV4RW50cnlUZXN0LkNvbHVtbkluZGV4LndyaXRlQW5kQnVpbGRJbmRleChwYXJ0aXRpb24udW5maWx0ZXJlZEl0ZXJhdG9yKCksIHdyaXRlciwgaGVhZGVyLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCBCaWdGb3JtYXQubGF0ZXN0VmVyc2lvbik7Ci0gICAgICAgIFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkgd2l0aEluZGV4ID0gUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeS5jcmVhdGUoMHhkZWFkYmVlZiwgRGVsZXRpb25UaW1lLkxJVkUsIGNvbHVtbkluZGV4KTsKLSAgICAgICAgSW5kZXhJbmZvLlNlcmlhbGl6ZXIgaW5kZXhTZXJpYWxpemVyID0gSW5kZXhJbmZvLnNlcmlhbGl6ZXIoQmlnRm9ybWF0LmxhdGVzdFZlcnNpb24sIGhlYWRlcik7Ci0KLSAgICAgICAgLy8gc2FuaXR5IGNoZWNrCi0gICAgICAgIGFzc2VydFRydWUoY29sdW1uSW5kZXguY29sdW1uc0luZGV4LnNpemUoKSA+PSAzKTsKLQotICAgICAgICBidWZmZXIgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlcigpOwotICAgICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZSh3aXRoSW5kZXgsIGJ1ZmZlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhidWZmZXIuZ2V0TGVuZ3RoKCksIHNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUod2l0aEluZGV4KSk7Ci0KLSAgICAgICAgLy8gc2VyaWFsaXphdGlvbiBjaGVjawotCi0gICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBidWZmZXIuYnVmZmVyKCk7Ci0gICAgICAgIERhdGFJbnB1dEJ1ZmZlciBpbnB1dCA9IG5ldyBEYXRhSW5wdXRCdWZmZXIoYmIsIGZhbHNlKTsKLSAgICAgICAgc2VyaWFsaXphdGlvbkNoZWNrKHdpdGhJbmRleCwgaW5kZXhTZXJpYWxpemVyLCBiYiwgaW5wdXQpOwotCi0gICAgICAgIC8vIHRlc3Qgd2l0aCBhbiBvdXRwdXQgc3RyZWFtIHRoYXQgZG9lc24ndCBzdXBwb3J0IGEgZmlsZS1wb2ludGVyCi0gICAgICAgIGJ1ZmZlciA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzUG9zaXRpb24oKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGxvbmcgcG9zaXRpb24oKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZSh3aXRoSW5kZXgsIGJ1ZmZlcik7Ci0gICAgICAgIGJiID0gYnVmZmVyLmJ1ZmZlcigpOwotICAgICAgICBpbnB1dCA9IG5ldyBEYXRhSW5wdXRCdWZmZXIoYmIsIGZhbHNlKTsKLSAgICAgICAgc2VyaWFsaXphdGlvbkNoZWNrKHdpdGhJbmRleCwgaW5kZXhTZXJpYWxpemVyLCBiYiwgaW5wdXQpOwotCi0gICAgICAgIC8vCi0KLSAgICAgICAgYmIgPSBidWZmZXIuYnVmZmVyKCk7Ci0gICAgICAgIGlucHV0ID0gbmV3IERhdGFJbnB1dEJ1ZmZlcihiYiwgZmFsc2UpOwotICAgICAgICBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5LlNlcmlhbGl6ZXIuc2tpcChpbnB1dCwgQmlnRm9ybWF0LmxhdGVzdFZlcnNpb24pOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIGJiLnJlbWFpbmluZygpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNlcmlhbGl6YXRpb25DaGVjayhQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5IHdpdGhJbmRleCwgSW5kZXhJbmZvLlNlcmlhbGl6ZXIgaW5kZXhTZXJpYWxpemVyLCBCeXRlQnVmZmVyIGJiLCBEYXRhSW5wdXRCdWZmZXIgaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygweGRlYWRiZWVmLCBpbnB1dC5yZWFkVW5zaWduZWRWSW50KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHdpdGhJbmRleC5wcm9tb3RlZFNpemUoaW5kZXhTZXJpYWxpemVyKSwgaW5wdXQucmVhZFVuc2lnbmVkVkludCgpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHdpdGhJbmRleC5oZWFkZXJMZW5ndGgoKSwgaW5wdXQucmVhZFVuc2lnbmVkVkludCgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh3aXRoSW5kZXguZGVsZXRpb25UaW1lKCksIERlbGV0aW9uVGltZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGlucHV0KSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMod2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLnNpemUoKSwgaW5wdXQucmVhZFVuc2lnbmVkVkludCgpKTsKLQotICAgICAgICBpbnQgb2Zmc2V0ID0gYmIucG9zaXRpb24oKTsKLSAgICAgICAgaW50W10gb2Zmc2V0cyA9IG5ldyBpbnRbd2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLnNpemUoKV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLnNpemUoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgcG9zID0gYmIucG9zaXRpb24oKTsKLSAgICAgICAgICAgIG9mZnNldHNbaV0gPSBwb3MgLSBvZmZzZXQ7Ci0gICAgICAgICAgICBJbmRleEluZm8gaW5mbyA9IGluZGV4U2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbnB1dCk7Ci0gICAgICAgICAgICBpbnQgZW5kID0gYmIucG9zaXRpb24oKTsKLQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhpbmRleFNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoaW5mbyksIGVuZCAtIHBvcyk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMod2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLmdldChpKS5vZmZzZXQsIGluZm8ub2Zmc2V0KTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMod2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLmdldChpKS53aWR0aCwgaW5mby53aWR0aCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHdpdGhJbmRleC5jb2x1bW5zSW5kZXgoKS5nZXQoaSkuZW5kT3Blbk1hcmtlciwgaW5mby5lbmRPcGVuTWFya2VyKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMod2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLmdldChpKS5maXJzdE5hbWUsIGluZm8uZmlyc3ROYW1lKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMod2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLmdldChpKS5sYXN0TmFtZSwgaW5mby5sYXN0TmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpdGhJbmRleC5jb2x1bW5zSW5kZXgoKS5zaXplKCk7IGkrKykKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMob2Zmc2V0c1tpXSwgaW5wdXQucmVhZEludCgpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIGJiLnJlbWFpbmluZygpKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeSBpbXBsZW1lbnRzIElNZWFzdXJhYmxlTWVtb3J5Ci0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEVNUFRZX1NJWkUgPSBPYmplY3RTaXplcy5tZWFzdXJlKG5ldyBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5KDApKTsKLQotICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyBwb3NpdGlvbjsKLQotICAgICAgICBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5KGxvbmcgcG9zaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBpbnQgcHJvbW90ZWRTaXplKEluZGV4SW5mby5TZXJpYWxpemVyIGlkeFNlcmlhbGl6ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5IGNyZWF0ZShsb25nIHBvc2l0aW9uLCBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lLCBDb2x1bW5JbmRleCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGluZGV4ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgZGVsZXRpb25UaW1lICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIHdlIG9ubHkgY29uc2lkZXIgdGhlIGNvbHVtbnMgc3VtbWFyeSB3aGVuIGRldGVybWluaW5nIHdoZXRoZXIgdG8gY3JlYXRlIGFuIEluZGV4ZWRFbnRyeSwKLSAgICAgICAgICAgIC8vIHNpbmNlIGlmIHRoZXJlIGFyZSBpbnN1ZmZpY2llbnQgY29sdW1ucyB0byBiZSB3b3J0aCBpbmRleGluZyB3ZSdyZSBnb2luZyB0byBzZWVrIHRvCi0gICAgICAgICAgICAvLyB0aGUgYmVnaW5uaW5nIG9mIHRoZSByb3cgYW55d2F5LCBzbyB3ZSBtaWdodCBhcyB3ZWxsIHJlYWQgdGhlIHRvbWJzdG9uZSB0aGVyZSBhcyB3ZWxsLgotICAgICAgICAgICAgaWYgKGluZGV4LmNvbHVtbnNJbmRleC5zaXplKCkgPiAxKQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeS5JbmRleGVkRW50cnkocG9zaXRpb24sIGRlbGV0aW9uVGltZSwgaW5kZXgucGFydGl0aW9uSGVhZGVyTGVuZ3RoLCBpbmRleC5jb2x1bW5zSW5kZXgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeShwb3NpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgaW5kZXggZW50cnkgY29udGFpbnMgdGhlIHJvdy1sZXZlbCB0b21ic3RvbmUgYW5kIGNvbHVtbiBzdW1tYXJ5LiAgT3RoZXJ3aXNlLAotICAgICAgICAgKiBjYWxsZXIgc2hvdWxkIGZldGNoIHRoZXNlIGZyb20gdGhlIHJvdyBoZWFkZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0luZGV4ZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gIWNvbHVtbnNJbmRleCgpLmlzRW1wdHkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lKCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGxlbmd0aCBvZiB0aGUgcm93IGhlYWRlciAocGFydGl0aW9uIGtleSwgcGFydGl0aW9uIGRlbGV0aW9uIGFuZCBzdGF0aWMgcm93KS4KLSAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBvbmx5IHByb3ZpZGVkIGZvciBpbmRleGVkIGVudHJpZXMgYW5kIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cKLSAgICAgICAgICoge0Bjb2RlIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufSBpZiB7QGNvZGUgIWlzSW5kZXhlZCgpfS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBsb25nIGhlYWRlckxlbmd0aCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIExpc3Q8SW5kZXhJbmZvPiBjb2x1bW5zSW5kZXgoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyB1bnNoYXJlZEhlYXBTaXplKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX1NJWkU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNlcmlhbGl6ZXIKLSAgICAgICAgewotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbmRleEluZm8uU2VyaWFsaXplciBpZHhTZXJpYWxpemVyOwotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBWZXJzaW9uIHZlcnNpb247Ci0KLSAgICAgICAgICAgIFNlcmlhbGl6ZXIoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgVmVyc2lvbiB2ZXJzaW9uLCBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmlkeFNlcmlhbGl6ZXIgPSBJbmRleEluZm8uc2VyaWFsaXplcih2ZXJzaW9uLCBoZWFkZXIpOwotICAgICAgICAgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5IHJpZSwgRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQocmllLnBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQocmllLnByb21vdGVkU2l6ZShpZHhTZXJpYWxpemVyKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmllLmlzSW5kZXhlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHJpZS5oZWFkZXJMZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIERlbGV0aW9uVGltZS5zZXJpYWxpemVyLnNlcmlhbGl6ZShyaWUuZGVsZXRpb25UaW1lKCksIG91dCk7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChyaWUuY29sdW1uc0luZGV4KCkuc2l6ZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgYW5kIHdyaXRlIHRoZSBvZmZzZXRzIHRvIHRoZSBJbmRleEluZm8gb2JqZWN0cy4KLQotICAgICAgICAgICAgICAgICAgICBpbnRbXSBvZmZzZXRzID0gbmV3IGludFtyaWUuY29sdW1uc0luZGV4KCkuc2l6ZSgpXTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAob3V0Lmhhc1Bvc2l0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE91dCBpcyB1c3VhbGx5IGEgU2VxdWVudGlhbFdyaXRlciwgc28gdXNpbmcgdGhlIGZpbGUtcG9pbnRlciBpcyBmaW5lIHRvIGdlbmVyYXRlIHRoZSBvZmZzZXRzLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBEYXRhT3V0cHV0QnVmZmVyIGFsc28gd29ya3MuCi0gICAgICAgICAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gb3V0LnBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEluZGV4SW5mbyBpbmZvIDogcmllLmNvbHVtbnNJbmRleCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldHNbaV0gPSBpID09IDAgPyAwIDogKGludCkob3V0LnBvc2l0aW9uKCkgLSBzdGFydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeFNlcmlhbGl6ZXIuc2VyaWFsaXplKGluZm8sIG91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3Qgc3VyZSB0aGlzIGJyYW5jaCB3aWxsIGV2ZXIgYmUgbmVlZGVkLCBidXQgaWYgaXQgaXMgY2FsbGVkLCBpdCBoYXMgdG8gY2FsY3VsYXRlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VyaWFsaXplZCBzaXplcyBpbnN0ZWFkIG9mIHNpbXBseSB1c2luZyB0aGUgZmlsZS1wb2ludGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEluZGV4SW5mbyBpbmZvIDogcmllLmNvbHVtbnNJbmRleCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldHNbaSsrXSA9IG9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHhTZXJpYWxpemVyLnNlcmlhbGl6ZShpbmZvLCBvdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBpZHhTZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKGluZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgb2ZmIDogb2Zmc2V0cykKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUludChvZmYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkgZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZyBwb3NpdGlvbiA9IGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKLQotICAgICAgICAgICAgICAgIGludCBzaXplID0gKGludClpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNpemUgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyBoZWFkZXJMZW5ndGggPSBpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUgPSBEZWxldGlvblRpbWUuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbik7Ci0gICAgICAgICAgICAgICAgICAgIGludCBlbnRyaWVzID0gKGludClpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8SW5kZXhJbmZvPiBjb2x1bW5zSW5kZXggPSBuZXcgQXJyYXlMaXN0PD4oZW50cmllcyk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllczsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc0luZGV4LmFkZChpZHhTZXJpYWxpemVyLmRlc2VyaWFsaXplKGluKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW4uc2tpcEJ5dGVzRnVsbHkoZW50cmllcyAqIFR5cGVTaXplcy5zaXplb2YoMCkpOwotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeS5JbmRleGVkRW50cnkocG9zaXRpb24sIGRlbGV0aW9uVGltZSwgaGVhZGVyTGVuZ3RoLCBjb2x1bW5zSW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkocG9zaXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmVhZHMgb25seSB0aGUgZGF0YSAncG9zaXRpb24nIG9mIHRoZSBpbmRleCBlbnRyeSBhbmQgcmV0dXJucyBpdC4gTm90ZSB0aGF0IHRoaXMgbGVmdCAnaW4nIGluIHRoZSBtaWRkbGUKLSAgICAgICAgICAgIC8vIG9mIHJlYWRpbmcgYW4gZW50cnksIHNvIHRoaXMgaXMgb25seSB1c2VmdWwgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIGFuZCBpbiBtb3N0IGNhc2UgJ2Rlc2VyaWFsaXplJwotICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KLSAgICAgICAgICAgIHN0YXRpYyBsb25nIHJlYWRQb3NpdGlvbihEYXRhSW5wdXRQbHVzIGluLCBWZXJzaW9uIHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBza2lwKERhdGFJbnB1dFBsdXMgaW4sIFZlcnNpb24gdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVhZFBvc2l0aW9uKGluLCB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICBza2lwUHJvbW90ZWRJbmRleChpbiwgdmVyc2lvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2tpcFByb21vdGVkSW5kZXgoRGF0YUlucHV0UGx1cyBpbiwgVmVyc2lvbiB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IChpbnQpaW4ucmVhZFVuc2lnbmVkVkludCgpOwotICAgICAgICAgICAgICAgIGlmIChzaXplIDw9IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgICAgIGluLnNraXBCeXRlc0Z1bGx5KHNpemUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgaW50IHNlcmlhbGl6ZWRTaXplKFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkgcmllKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBpbmRleGVkU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKHJpZS5pc0luZGV4ZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8SW5kZXhJbmZvPiBpbmRleCA9IHJpZS5jb2x1bW5zSW5kZXgoKTsKLQotICAgICAgICAgICAgICAgICAgICBpbmRleGVkU2l6ZSArPSBUeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50KHJpZS5oZWFkZXJMZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ZWRTaXplICs9IERlbGV0aW9uVGltZS5zZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKHJpZS5kZWxldGlvblRpbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ZWRTaXplICs9IFR5cGVTaXplcy5zaXplb2ZVbnNpZ25lZFZJbnQoaW5kZXguc2l6ZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKEluZGV4SW5mbyBpbmZvIDogaW5kZXgpCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleGVkU2l6ZSArPSBpZHhTZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKGluZm8pOwotCi0gICAgICAgICAgICAgICAgICAgIGluZGV4ZWRTaXplICs9IGluZGV4LnNpemUoKSAqIFR5cGVTaXplcy5zaXplb2YoMCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIFR5cGVTaXplcy5zaXplb2ZVbnNpZ25lZFZJbnQocmllLnBvc2l0aW9uKSArIFR5cGVTaXplcy5zaXplb2ZVbnNpZ25lZFZJbnQoaW5kZXhlZFNpemUpICsgaW5kZXhlZFNpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQW4gZW50cnkgaW4gdGhlIHJvdyBpbmRleCBmb3IgYSByb3cgd2hvc2UgY29sdW1ucyBhcmUgaW5kZXhlZC4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEluZGV4ZWRFbnRyeSBleHRlbmRzIFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkKLSAgICAgICAgewotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lOwotCi0gICAgICAgICAgICAvLyBUaGUgb2Zmc2V0IGluIHRoZSBmaWxlIHdoZW4gdGhlIGluZGV4IGVudHJ5IGVuZAotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGhlYWRlckxlbmd0aDsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxJbmRleEluZm8+IGNvbHVtbnNJbmRleDsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQkFTRV9TSVpFID0KLSAgICAgICAgICAgIE9iamVjdFNpemVzLm1lYXN1cmUobmV3IEluZGV4ZWRFbnRyeSgwLCBEZWxldGlvblRpbWUuTElWRSwgMCwgQXJyYXlzLmFzTGlzdChudWxsLCBudWxsKSkpCi0gICAgICAgICAgICArIE9iamVjdFNpemVzLm1lYXN1cmUobmV3IEFycmF5TGlzdDw+KDEpKTsKLQotICAgICAgICAgICAgcHJpdmF0ZSBJbmRleGVkRW50cnkobG9uZyBwb3NpdGlvbiwgRGVsZXRpb25UaW1lIGRlbGV0aW9uVGltZSwgbG9uZyBoZWFkZXJMZW5ndGgsIExpc3Q8SW5kZXhJbmZvPiBjb2x1bW5zSW5kZXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIocG9zaXRpb24pOwotICAgICAgICAgICAgICAgIGFzc2VydCBkZWxldGlvblRpbWUgIT0gbnVsbDsKLSAgICAgICAgICAgICAgICBhc3NlcnQgY29sdW1uc0luZGV4ICE9IG51bGwgJiYgY29sdW1uc0luZGV4LnNpemUoKSA+IDE7Ci0gICAgICAgICAgICAgICAgdGhpcy5kZWxldGlvblRpbWUgPSBkZWxldGlvblRpbWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJMZW5ndGggPSBoZWFkZXJMZW5ndGg7Ci0gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5zSW5kZXggPSBjb2x1bW5zSW5kZXg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBkZWxldGlvblRpbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGxvbmcgaGVhZGVyTGVuZ3RoKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGVhZGVyTGVuZ3RoOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBMaXN0PEluZGV4SW5mbz4gY29sdW1uc0luZGV4KCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uc0luZGV4OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBpbnQgcHJvbW90ZWRTaXplKEluZGV4SW5mby5TZXJpYWxpemVyIGlkeFNlcmlhbGl6ZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZyBzaXplID0gVHlwZVNpemVzLnNpemVvZlVuc2lnbmVkVkludChoZWFkZXJMZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBEZWxldGlvblRpbWUuc2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShkZWxldGlvblRpbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBUeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50KGNvbHVtbnNJbmRleC5zaXplKCkpOyAvLyBudW1iZXIgb2YgZW50cmllcwotICAgICAgICAgICAgICAgIGZvciAoSW5kZXhJbmZvIGluZm8gOiBjb2x1bW5zSW5kZXgpCi0gICAgICAgICAgICAgICAgICAgIHNpemUgKz0gaWR4U2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShpbmZvKTsKLQotICAgICAgICAgICAgICAgIHNpemUgKz0gY29sdW1uc0luZGV4LnNpemUoKSAqIFR5cGVTaXplcy5zaXplb2YoMCk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gSW50cy5jaGVja2VkQ2FzdChzaXplKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgbG9uZyB1bnNoYXJlZEhlYXBTaXplKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25nIGVudHJ5U2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChJbmRleEluZm8gaWR4IDogY29sdW1uc0luZGV4KQotICAgICAgICAgICAgICAgICAgICBlbnRyeVNpemUgKz0gaWR4LnVuc2hhcmVkSGVhcFNpemUoKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBCQVNFX1NJWkUKLSAgICAgICAgICAgICAgICAgICAgICAgKyBlbnRyeVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgKyBkZWxldGlvblRpbWUudW5zaGFyZWRIZWFwU2l6ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICsgT2JqZWN0U2l6ZXMuc2l6ZU9mUmVmZXJlbmNlQXJyYXkoY29sdW1uc0luZGV4LnNpemUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRleEZvcigpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRGVsZXRpb25UaW1lIGRlbGV0aW9uSW5mbyA9IG5ldyBEZWxldGlvblRpbWUoRkJVdGlsaXRpZXMudGltZXN0YW1wTWljcm9zKCksIEZCVXRpbGl0aWVzLm5vd0luU2Vjb25kcygpKTsKLQotICAgICAgICBMaXN0PEluZGV4SW5mbz4gaW5kZXhlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBpbmRleGVzLmFkZChuZXcgSW5kZXhJbmZvKGNuKDBMKSwgY24oNUwpLCAwLCAwLCBkZWxldGlvbkluZm8pKTsKLSAgICAgICAgaW5kZXhlcy5hZGQobmV3IEluZGV4SW5mbyhjbigxMEwpLCBjbigxNUwpLCAwLCAwLCBkZWxldGlvbkluZm8pKTsKLSAgICAgICAgaW5kZXhlcy5hZGQobmV3IEluZGV4SW5mbyhjbigyMEwpLCBjbigyNUwpLCAwLCAwLCBkZWxldGlvbkluZm8pKTsKLQotICAgICAgICBSb3dJbmRleEVudHJ5IHJpZSA9IG5ldyBSb3dJbmRleEVudHJ5KDBMKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgSW5kZXhJbmZvUmV0cmlldmVyIG9wZW5XaXRoSW5kZXgoRmlsZUhhbmRsZSBpbmRleEZpbGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbmRleEluZm9SZXRyaWV2ZXIoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIEluZGV4SW5mbyBjb2x1bW5zSW5kZXgoaW50IGluZGV4KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhlcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgaW50IGNvbHVtbnNJbmRleENvdW50KCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhlcy5zaXplKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBBYnN0cmFjdFNTVGFibGVJdGVyYXRvci5JbmRleFN0YXRlIGluZGV4U3RhdGUgPSBuZXcgQWJzdHJhY3RTU1RhYmxlSXRlcmF0b3IuSW5kZXhTdGF0ZSgKLSAgICAgICAgICAgIG51bGwsIGNvbXAsIHJpZSwgZmFsc2UsIG51bGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigtMUwpLCAtMSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaW5kZXhTdGF0ZS5pbmRleEZvcihjbig1TCksIC0xKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDEyTCksIC0xKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDE3TCksIC0xKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDEwMEwpLCAtMSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigxMDBMKSwgMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigxMDBMKSwgMSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigxMDBMKSwgMikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigxMDBMKSwgMykpOwotCi0gICAgICAgIGluZGV4U3RhdGUgPSBuZXcgQWJzdHJhY3RTU1RhYmxlSXRlcmF0b3IuSW5kZXhTdGF0ZSgKLSAgICAgICAgICAgIG51bGwsIGNvbXAsIHJpZSwgdHJ1ZSwgbnVsbAotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygtMSwgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigtMUwpLCAtMSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaW5kZXhTdGF0ZS5pbmRleEZvcihjbig1TCksIDMpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGluZGV4U3RhdGUuaW5kZXhGb3IoY24oNUwpLCAyKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDE3TCksIDMpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGluZGV4U3RhdGUuaW5kZXhGb3IoY24oMTAwTCksIDMpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGluZGV4U3RhdGUuaW5kZXhGb3IoY24oMTAwTCksIDQpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGluZGV4U3RhdGUuaW5kZXhGb3IoY24oMTJMKSwgMykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigxMkwpLCAyKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDEwMEwpLCAxKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDEwMEwpLCAyKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NjaGVtYUNRTEhlbHBlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TY2hlbWFDUUxIZWxwZXJUZXN0LmphdmEKaW5kZXggNjNlZjg2MS4uNDEyNDRjYSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NjaGVtYUNRTEhlbHBlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU2NoZW1hQ1FMSGVscGVyVGVzdC5qYXZhCkBAIC0yMiwxMSArMjIsMTEgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5pby5GaWxlczsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVJlYWRlcjsKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuSnNvbk5vZGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLnNjaGVtYS5JbmRleFRhcmdldDsKQEAgLTM3LDkgKzM3LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnJlYWRzLlNwZWN1bGF0aXZlUmV0cnlQb2xpY3k7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05BcnJheTsKLWltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTk9iamVjdDsKLWltcG9ydCBvcmcuanNvbi5zaW1wbGUucGFyc2VyLkpTT05QYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSnNvblV0aWxzOwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CkBAIC0yOTcsNiArMjk1LDcgQEAKICAgICAgICAgYXNzZXJ0VGhhdChTY2hlbWFDUUxIZWxwZXIuZ2V0VGFibGVNZXRhZGF0YUFzQ1FMKGNmcy5tZXRhZGF0YSgpLCBjZnMua2V5c3BhY2UuZ2V0TWV0YWRhdGEoKSksCiAgICAgICAgICAgICAgICAgICAgY29udGFpbnNTdHJpbmcoIkNMVVNURVJJTkcgT1JERVIgQlkgKGNsMSBBU0MpXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIEFORCBhZGRpdGlvbmFsX3dyaXRlX3BvbGljeSA9ICdBTFdBWVMnXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIEFORCBhbGxvd19hdXRvX3NuYXBzaG90ID0gdHJ1ZVxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBBTkQgYmxvb21fZmlsdGVyX2ZwX2NoYW5jZSA9IDEuMFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBBTkQgY2FjaGluZyA9IHsna2V5cyc6ICdBTEwnLCAncm93c19wZXJfcGFydGl0aW9uJzogJ05PTkUnfVxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBBTkQgY2RjID0gZmFsc2VcbiIgKwpAQCAtMzA4LDYgKzMwNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBBTkQgZGVmYXVsdF90aW1lX3RvX2xpdmUgPSA0XG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIEFORCBleHRlbnNpb25zID0geydleHQxJzogMHg3NjYxNmMzMX1cbiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgQU5EIGdjX2dyYWNlX3NlY29uZHMgPSA1XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIEFORCBpbmNyZW1lbnRhbF9iYWNrdXBzID0gdHJ1ZVxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBBTkQgbWF4X2luZGV4X2ludGVydmFsID0gN1xuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBBTkQgbWVtdGFibGVfZmx1c2hfcGVyaW9kX2luX21zID0gOFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBBTkQgbWluX2luZGV4X2ludGVydmFsID0gNlxuIiArCkBAIC00NDYsOSArNDQ2LDEwIEBACiAKICAgICAgICAgYXNzZXJ0VGhhdChzY2hlbWEsIGNvbnRhaW5zU3RyaW5nKCJDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyAiICsgdGFibGVOYW1lICsgIl9yZWcyX2lkeCBPTiAiICsga2V5c3BhY2UoKSArICcuJyArIHRhYmxlTmFtZSArICIgKHJlZzIpOyIpKTsKIAotICAgICAgICBKU09OT2JqZWN0IG1hbmlmZXN0ID0gKEpTT05PYmplY3QpIG5ldyBKU09OUGFyc2VyKCkucGFyc2UobmV3IEZpbGVSZWFkZXIoY2ZzLmdldERpcmVjdG9yaWVzKCkuZ2V0U25hcHNob3RNYW5pZmVzdEZpbGUoU05BUFNIT1QpKSk7Ci0gICAgICAgIEpTT05BcnJheSBmaWxlcyA9IChKU09OQXJyYXkpIG1hbmlmZXN0LmdldCgiZmlsZXMiKTsKKyAgICAgICAgSnNvbk5vZGUgbWFuaWZlc3QgPSBKc29uVXRpbHMuSlNPTl9PQkpFQ1RfTUFQUEVSLnJlYWRUcmVlKGNmcy5nZXREaXJlY3RvcmllcygpLmdldFNuYXBzaG90TWFuaWZlc3RGaWxlKFNOQVBTSE9UKS50b0phdmFJT0ZpbGUoKSk7CisgICAgICAgIEpzb25Ob2RlIGZpbGVzID0gbWFuaWZlc3QuZ2V0KCJmaWxlcyIpOwogICAgICAgICAvLyB0d28gZmlsZXMsIHRoZSBzZWNvbmQgaXMgaW5kZXgKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZmlsZXMuaXNBcnJheSgpKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBmaWxlcy5zaXplKCkpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NjcnViVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NjcnViVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmU5MTY1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TY3J1YlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjsKLQotaW1wb3J0IGphdmEuaW8uSU9FcnJvcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKLWltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKLWltcG9ydCBqYXZhLm5pby5maWxlLlN0YW5kYXJkT3Blbk9wdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOwotCi1pbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXBkYXRlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLkNodW5rQ2FjaGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLk9wZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuUXVlcnlQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5VbnR5cGVkUmVzdWx0U2V0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uU2NydWJiZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZU5ld1RyYWNrZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVVJRFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5QYXJ0aXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5QYXJ0aXRpb25VcGRhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5FbmNvZGluZ1N0YXRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5CeXRlT3JkZXJlZFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lk11cm11cjNQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5SZXF1ZXN0RXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuV3JpdGVUaW1lb3V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkNvbXByZXNzaW9uTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db3JydXB0U1NUYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlTXVsdGlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmV3cml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlVHhuV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2ltcGxlU1NUYWJsZU11bHRpV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnVGFibGVXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbGxlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyLmNvdW50ZXJDRk1EOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlci5nZXRDb21wcmVzc2lvblBhcmFtZXRlcnM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlci5sb2FkU2NoZW1hOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EOwotaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7Ci0KLXB1YmxpYyBjbGFzcyBTY3J1YlRlc3QKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX0xFR0FDWV9TU1RBQkxFX1JPT1RfUFJPUCA9ICJpbnZhbGlkLWxlZ2FjeS1zc3RhYmxlLXJvb3QiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0YgPSAiU3RhbmRhcmQxIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1VOVEVSX0NGID0gIkNvdW50ZXIxIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9VVUlEID0gIlVVSURLZXlzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9JTkRFWDEgPSAiSW5kZXhlZDEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGX0lOREVYMiA9ICJJbmRleGVkMiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfSU5ERVgxX0JZVEVPUkRFUkVEID0gIkluZGV4ZWQxX29yZGVyZWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGX0lOREVYMl9CWVRFT1JERVJFRCA9ICJJbmRleGVkMl9vcmRlcmVkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfSU5ERVggPSAiYmlydGhkYXRlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfTk9OX0lOREVYID0gIm5vdGJpcnRoZGF0ZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgQ09NUFJFU1NJT05fQ0hVTktfTEVOR1RIID0gNDA5NjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgc2VxID0gbmV3IEF0b21pY0ludGVnZXIoKTsKLQotICAgIFN0cmluZyBrc05hbWU7Ci0gICAgS2V5c3BhY2Uga2V5c3BhY2U7Ci0KLSAgICBAQmVmb3JlQ2xhc3MKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGxvYWRTY2hlbWEoKTsKLSAgICB9Ci0KLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0dXAoKQotICAgIHsKLSAgICAgICAga3NOYW1lID0gInNjcnViX3Rlc3RfIiArIHNlcS5pbmNyZW1lbnRBbmRHZXQoKTsKLSAgICAgICAgY3JlYXRlS2V5c3BhY2Uoa3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkQ0ZNRChrc05hbWUsIENGKSwKLSAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckNGTUQoa3NOYW1lLCBDT1VOVEVSX0NGKS5jb21wcmVzc2lvbihnZXRDb21wcmVzc2lvblBhcmFtZXRlcnMoQ09NUFJFU1NJT05fQ0hVTktfTEVOR1RIKSksCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkQ0ZNRChrc05hbWUsIENGX1VVSUQsIDAsIFVVSURUeXBlLmluc3RhbmNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLmtleXNJbmRleENGTUQoa3NOYW1lLCBDRl9JTkRFWDEsIHRydWUpLAotICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuY29tcG9zaXRlSW5kZXhDRk1EKGtzTmFtZSwgQ0ZfSU5ERVgyLCB0cnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLmtleXNJbmRleENGTUQoa3NOYW1lLCBDRl9JTkRFWDFfQllURU9SREVSRUQsIHRydWUpLnBhcnRpdGlvbmVyKEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuaW5zdGFuY2UpLAotICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuY29tcG9zaXRlSW5kZXhDRk1EKGtzTmFtZSwgQ0ZfSU5ERVgyX0JZVEVPUkRFUkVELCB0cnVlKS5wYXJ0aXRpb25lcihCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLmluc3RhbmNlKSk7Ci0gICAgICAgIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc05hbWUpOwotCi0gICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkob3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuVXRpbC5BTExPV19UT09MX1JFSU5JVF9GT1JfVEVTVCwgInRydWUiKTsgLy8gTmVjZXNzYXJ5IGZvciB0ZXN0aW5nCi0gICAgfQotCi0gICAgQEFmdGVyQ2xhc3MKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJDbGFzc0VudigpCi0gICAgewotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eShvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5VdGlsLkFMTE9XX1RPT0xfUkVJTklUX0ZPUl9URVNUKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTY3J1Yk9uZVBhcnRpdGlvbigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YpOwotCi0gICAgICAgIC8vIGluc2VydCBkYXRhIGFuZCB2ZXJpZnkgd2UgZ2V0IGl0IGJhY2sgdy8gcmFuZ2UgcXVlcnkKLSAgICAgICAgZmlsbENGKGNmcywgMSk7Ci0gICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxKTsKLQotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5wZXJmb3JtU2NydWIoY2ZzLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIDIpOwotCi0gICAgICAgIC8vIGNoZWNrIGRhdGEgaXMgc3RpbGwgdGhlcmUKLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNjcnViTGFzdEJyb2tlblBhcnRpdGlvbigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IENvbHVtbkZhbWlseVN0b3JlLmdldElmRXhpc3RzKGtzTmFtZSwgQ0YpOwotCi0gICAgICAgIC8vIGluc2VydCBkYXRhIGFuZCB2ZXJpZnkgd2UgZ2V0IGl0IGJhY2sgdy8gcmFuZ2UgcXVlcnkKLSAgICAgICAgZmlsbENGKGNmcywgMSk7Ci0gICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxKTsKLQotICAgICAgICBTZXQ8U1NUYWJsZVJlYWRlcj4gbGl2ZVNTVGFibGVzID0gY2ZzLmdldExpdmVTU1RhYmxlcygpOwotICAgICAgICBhc3NlcnRUaGF0KGxpdmVTU1RhYmxlcykuaGFzU2l6ZSgxKTsKLSAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gbGl2ZVNTVGFibGVzLml0ZXJhdG9yKCkubmV4dCgpLmdldEZpbGVuYW1lKCk7Ci0gICAgICAgIEZpbGVzLndyaXRlKFBhdGhzLmdldChmaWxlTmFtZSksIG5ldyBieXRlWzEwXSwgU3RhbmRhcmRPcGVuT3B0aW9uLkNSRUFURSwgU3RhbmRhcmRPcGVuT3B0aW9uLlRSVU5DQVRFX0VYSVNUSU5HKTsKLSAgICAgICAgQ2h1bmtDYWNoZS5pbnN0YW5jZS5pbnZhbGlkYXRlRmlsZShmaWxlTmFtZSk7Ci0KLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UucGVyZm9ybVNjcnViKGNmcywgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIDIpOwotCi0gICAgICAgIC8vIGNoZWNrIGRhdGEgaXMgc3RpbGwgdGhlcmUKLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDApOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNjcnViQ29ycnVwdGVkQ291bnRlclBhcnRpdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3JpdGVUaW1lb3V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBXaGVuIGNvbXByZXNzaW9uIGlzIGVuYWJsZWQsIGZvciB0ZXN0aW5nIGNvcnJ1cHRlZCBjaHVua3Mgd2UgbmVlZCBlbm91Z2ggcGFydGl0aW9ucyB0byBjb3ZlcgotICAgICAgICAvLyBhdCBsZWFzdCAzIGNodW5rcyBvZiBzaXplIENPTVBSRVNTSU9OX0NIVU5LX0xFTkdUSAotICAgICAgICBpbnQgbnVtUGFydGl0aW9ucyA9IDEwMDA7Ci0KLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENPVU5URVJfQ0YpOwotICAgICAgICBjZnMudHJ1bmNhdGVCbG9ja2luZygpOwotICAgICAgICBmaWxsQ291bnRlckNGKGNmcywgbnVtUGFydGl0aW9ucyk7Ci0KLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIG51bVBhcnRpdGlvbnMpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuc2l6ZSgpKTsKLQotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLSAgICAgICAgLy9tYWtlIHN1cmUgdG8gb3ZlcnJpZGUgYXQgbW9zdCAxIGNodW5rIHdoZW4gY29tcHJlc3Npb24gaXMgZW5hYmxlZAotICAgICAgICBvdmVycmlkZVdpdGhHYXJiYWdlKHNzdGFibGUsIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCIwIiksIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCIxIikpOwotCi0gICAgICAgIC8vIHdpdGggc2tpcENvcnJ1cHRlZCA9PSBmYWxzZSwgdGhlIHNjcnViIGlzIGV4cGVjdGVkIHRvIGZhaWwKLSAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHNzdGFibGUpLCBPcGVyYXRpb25UeXBlLlNDUlVCKTsKLSAgICAgICAgICAgICBTY3J1YmJlciBzY3J1YmJlciA9IG5ldyBTY3J1YmJlcihjZnMsIHR4biwgZmFsc2UsIHRydWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzY3J1YmJlci5zY3J1YigpOwotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiB0byBiZSB0aHJvd24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FcnJvciBlcnIpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZXJyLmdldENhdXNlKCkgaW5zdGFuY2VvZiBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB3aXRoIHNraXBDb3JydXB0ZWQgPT0gdHJ1ZSwgdGhlIGNvcnJ1cHQgcm93cyB3aWxsIGJlIHNraXBwZWQKLSAgICAgICAgU2NydWJiZXIuU2NydWJSZXN1bHQgc2NydWJSZXN1bHQ7Ci0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChzc3RhYmxlKSwgT3BlcmF0aW9uVHlwZS5TQ1JVQik7Ci0gICAgICAgICAgICAgU2NydWJiZXIgc2NydWJiZXIgPSBuZXcgU2NydWJiZXIoY2ZzLCB0eG4sIHRydWUsIHRydWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzY3J1YlJlc3VsdCA9IHNjcnViYmVyLnNjcnViV2l0aFJlc3VsdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzY3J1YlJlc3VsdCk7Ci0KLSAgICAgICAgYm9vbGVhbiBjb21wcmVzc2lvbiA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnRlc3QuY29tcHJlc3Npb24iLCAiZmFsc2UiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBzY3J1YlJlc3VsdC5lbXB0eVBhcnRpdGlvbnMpOwotICAgICAgICBpZiAoY29tcHJlc3Npb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1QYXJ0aXRpb25zLCBzY3J1YlJlc3VsdC5iYWRQYXJ0aXRpb25zICsgc2NydWJSZXN1bHQuZ29vZFBhcnRpdGlvbnMpOwotICAgICAgICAgICAgLy9iZWNhdXNlIHdlIG9ubHkgY29ycnVwdGVkIDEgY2h1bmsgYW5kIHdlIGNob3NlIGVub3VnaCBwYXJ0aXRpb25zIHRvIGNvdmVyIGF0IGxlYXN0IDMgY2h1bmtzCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHNjcnViUmVzdWx0Lmdvb2RQYXJ0aXRpb25zID49IHNjcnViUmVzdWx0LmJhZFBhcnRpdGlvbnMgKiAyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBzY3J1YlJlc3VsdC5iYWRQYXJ0aXRpb25zKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1QYXJ0aXRpb25zLTEsIHNjcnViUmVzdWx0Lmdvb2RQYXJ0aXRpb25zKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7Ci0KLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIHNjcnViUmVzdWx0Lmdvb2RQYXJ0aXRpb25zKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTY3J1YkNvcnJ1cHRlZFJvd0luU21hbGxGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXcml0ZVRpbWVvdXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIGNhbm5vdCB0ZXN0IHRoaXMgd2l0aCBjb21wcmVzc2lvbgotICAgICAgICBhc3N1bWVUcnVlKCFCb29sZWFuLnBhcnNlQm9vbGVhbihTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS50ZXN0LmNvbXByZXNzaW9uIiwgImZhbHNlIikpKTsKLQotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09VTlRFUl9DRik7Ci0KLSAgICAgICAgZmlsbENvdW50ZXJDRihjZnMsIDIpOwotCi0gICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAyKTsKLQotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLSAgICAgICAgLy8gb3ZlcndyaXRlIG9uZSByb3cgd2l0aCBnYXJiYWdlCi0gICAgICAgIG92ZXJyaWRlV2l0aEdhcmJhZ2Uoc3N0YWJsZSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjAiKSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjEiKSk7Ci0KLSAgICAgICAgLy8gd2l0aCBza2lwQ29ycnVwdGVkID09IGZhbHNlLCB0aGUgc2NydWIgaXMgZXhwZWN0ZWQgdG8gZmFpbAotICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qoc3N0YWJsZSksIE9wZXJhdGlvblR5cGUuU0NSVUIpOwotICAgICAgICAgICAgIFNjcnViYmVyIHNjcnViYmVyID0gbmV3IFNjcnViYmVyKGNmcywgdHhuLCBmYWxzZSwgdHJ1ZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHdpdGggc2tpcENvcnJ1cHRlZCA9PSB0cnVlLCB0aGUgY29ycnVwdCByb3cgd2lsbCBiZSBza2lwcGVkCi0gICAgICAgICAgICBzY3J1YmJlci5zY3J1YigpOwotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiB0byBiZSB0aHJvd24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FcnJvciBlcnIpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZXJyLmdldENhdXNlKCkgaW5zdGFuY2VvZiBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qoc3N0YWJsZSksIE9wZXJhdGlvblR5cGUuU0NSVUIpOwotICAgICAgICAgICAgIFNjcnViYmVyIHNjcnViYmVyID0gbmV3IFNjcnViYmVyKGNmcywgdHhuLCB0cnVlLCB0cnVlKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gd2l0aCBza2lwQ29ycnVwdGVkID09IHRydWUsIHRoZSBjb3JydXB0IHJvdyB3aWxsIGJlIHNraXBwZWQKLSAgICAgICAgICAgIHNjcnViYmVyLnNjcnViKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7Ci0gICAgICAgIC8vIHZlcmlmeSB0aGF0IHdlIGNhbiByZWFkIGFsbCBvZiB0aGUgcm93cywgYW5kIHRoZXJlIGlzIG5vdyBvbmUgbGVzcyByb3cKLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNjcnViT25lUm93V2l0aENvcnJ1cHRlZEtleSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gY2Fubm90IHRlc3QgdGhpcyB3aXRoIGNvbXByZXNzaW9uCi0gICAgICAgIGFzc3VtZVRydWUoIUJvb2xlYW4ucGFyc2VCb29sZWFuKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnRlc3QuY29tcHJlc3Npb24iLCAiZmFsc2UiKSkpOwotCi0gICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDRik7Ci0KLSAgICAgICAgLy8gaW5zZXJ0IGRhdGEgYW5kIHZlcmlmeSB3ZSBnZXQgaXQgYmFjayB3LyByYW5nZSBxdWVyeQotICAgICAgICBmaWxsQ0YoY2ZzLCA0KTsKLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDQpOwotCi0gICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgb3ZlcnJpZGVXaXRoR2FyYmFnZShzc3RhYmxlLCAwLCAyKTsKLQotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5wZXJmb3JtU2NydWIoY2ZzLCBmYWxzZSwgdHJ1ZSwgMik7Ci0KLSAgICAgICAgLy8gY2hlY2sgZGF0YSBpcyBzdGlsbCB0aGVyZQotICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgNCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJDb3JydXB0ZWRDb3VudGVyUm93Tm9FYXJseU9wZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdyaXRlVGltZW91dEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBvbGREaXNhYmxlZFZhbCA9IFNTVGFibGVSZXdyaXRlci5kaXNhYmxlRWFybHlPcGVuaW5nRm9yVGVzdHM7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBTU1RhYmxlUmV3cml0ZXIuZGlzYWJsZUVhcmx5T3BlbmluZ0ZvclRlc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgIHRlc3RTY3J1YkNvcnJ1cHRlZENvdW50ZXJQYXJ0aXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFNTVGFibGVSZXdyaXRlci5kaXNhYmxlRWFybHlPcGVuaW5nRm9yVGVzdHMgPSBvbGREaXNhYmxlZFZhbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNjcnViTXVsdGlSb3coKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGKTsKLQotICAgICAgICAvLyBpbnNlcnQgZGF0YSBhbmQgdmVyaWZ5IHdlIGdldCBpdCBiYWNrIHcvIHJhbmdlIHF1ZXJ5Ci0gICAgICAgIGZpbGxDRihjZnMsIDEwKTsKLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEwKTsKLQotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5wZXJmb3JtU2NydWIoY2ZzLCBmYWxzZSwgdHJ1ZSwgMik7Ci0KLSAgICAgICAgLy8gY2hlY2sgZGF0YSBpcyBzdGlsbCB0aGVyZQotICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMTApOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNjcnViTm9JbmRleCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YpOwotCi0gICAgICAgIC8vIGluc2VydCBkYXRhIGFuZCB2ZXJpZnkgd2UgZ2V0IGl0IGJhY2sgdy8gcmFuZ2UgcXVlcnkKLSAgICAgICAgZmlsbENGKGNmcywgMTApOwotICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMTApOwotCi0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogY2ZzLmdldExpdmVTU1RhYmxlcygpKQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRmlsZShzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlBSSU1BUllfSU5ERVgpKS50cnlEZWxldGUoKSk7Ci0KLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UucGVyZm9ybVNjcnViKGNmcywgZmFsc2UsIHRydWUsIDIpOwotCi0gICAgICAgIC8vIGNoZWNrIGRhdGEgaXMgc3RpbGwgdGhlcmUKLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEwKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTY3J1Yk91dE9mT3JkZXIoKQotICAgIHsKLSAgICAgICAgLy8gVGhpcyB0ZXN0IGFzc3VtZXMgQnl0ZU9yZGVyUGFydGl0aW9uZXIgdG8gY3JlYXRlIG91dC1vZi1vcmRlciBTU1RhYmxlCi0gICAgICAgIElQYXJ0aXRpb25lciBvbGRQYXJ0aXRpb25lciA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRQYXJ0aXRpb25lcigpOwotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0UGFydGl0aW9uZXJVbnNhZmUobmV3IEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIoKSk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIG91dC1vZi1vcmRlciBTU1RhYmxlCi0gICAgICAgIEZpbGUgdGVtcERpciA9IEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZSgiU2NydWJUZXN0LnRlc3RTY3J1Yk91dE9mT3JkZXIiLCAiIikucGFyZW50KCk7Ci0gICAgICAgIC8vIGNyZWF0ZSBrcy9jZiBkaXJlY3RvcnkKLSAgICAgICAgRmlsZSB0ZW1wRGF0YURpciA9IG5ldyBGaWxlKHRlbXBEaXIsIFN0cmluZy5qb2luKEZpbGUucGF0aFNlcGFyYXRvcigpLCBrc05hbWUsIENGKSk7Ci0gICAgICAgIGFzc2VydFRydWUodGVtcERhdGFEaXIudHJ5Q3JlYXRlRGlyZWN0b3JpZXMoKSk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGKTsKLQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGtleXMgPSBBcnJheXMuYXNMaXN0KCJ0IiwgImEiLCAiYiIsICJ6IiwgImMiLCAieSIsICJkIik7Ci0gICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBjZnMubmV3U1NUYWJsZURlc2NyaXB0b3IodGVtcERhdGFEaXIpOwotCi0gICAgICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IExpZmVjeWNsZVRyYW5zYWN0aW9uLm9mZmxpbmUoT3BlcmF0aW9uVHlwZS5XUklURSk7Ci0gICAgICAgICAgICAgICAgIFNTVGFibGVUeG5Xcml0ZXIgd3JpdGVyID0gbmV3IFNTVGFibGVUeG5Xcml0ZXIodHhuLCBjcmVhdGVUZXN0V3JpdGVyKGRlc2MsIGtleXMuc2l6ZSgpLCBjZnMubWV0YWRhdGEsIHR4bikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGsgOiBrZXlzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSA9IFVwZGF0ZUJ1aWxkZXIuY3JlYXRlKGNmcy5tZXRhZGF0YSgpLCBVdGlsLmRrKGspKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXdSb3coInNvbWVOYW1lIikuYWRkKCJ2YWwiLCAic29tZVZhbHVlIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLQotICAgICAgICAgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKHVwZGF0ZS51bmZpbHRlcmVkSXRlcmF0b3IoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdyaXRlci5maW5pc2goZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyLm9wZW4oZGVzYywgY2ZzLm1ldGFkYXRhKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJTU1RSIHZhbGlkYXRpb24gc2hvdWxkIGhhdmUgY2F1Z2h0IHRoZSBvdXQtb2Ytb3JkZXIgcm93cyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGlzZSkKLSAgICAgICAgICAgIHsgLyogdGhpcyBpcyBleHBlY3RlZCAqLyB9Ci0KLSAgICAgICAgICAgIC8vIG9wZW4gd2l0aG91dCB2YWxpZGF0aW9uIGZvciBzY3J1YmJpbmcKLSAgICAgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgICAgICBpZiAobmV3IEZpbGUoZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuQ09NUFJFU1NJT05fSU5GTykpLmV4aXN0cygpKQotICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudC5DT01QUkVTU0lPTl9JTkZPKTsKLSAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudC5EQVRBKTsKLSAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudC5QUklNQVJZX0lOREVYKTsKLSAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudC5GSUxURVIpOwotICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoQ29tcG9uZW50LlNUQVRTKTsKLSAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudC5TVU1NQVJZKTsKLSAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudC5UT0MpOwotCi0gICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBTU1RhYmxlUmVhZGVyLm9wZW5Ob1ZhbGlkYXRpb24oZGVzYywgY29tcG9uZW50cywgY2ZzKTsKLSAgICAgICAgICAgIGlmIChzc3RhYmxlLmxhc3QuY29tcGFyZVRvKHNzdGFibGUuZmlyc3QpIDwgMCkKLSAgICAgICAgICAgICAgICBzc3RhYmxlLmxhc3QgPSBzc3RhYmxlLmZpcnN0OwotCi0gICAgICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHNjcnViVHhuID0gTGlmZWN5Y2xlVHJhbnNhY3Rpb24ub2ZmbGluZShPcGVyYXRpb25UeXBlLlNDUlVCLCBzc3RhYmxlKTsKLSAgICAgICAgICAgICAgICAgU2NydWJiZXIgc2NydWJiZXIgPSBuZXcgU2NydWJiZXIoY2ZzLCBzY3J1YlR4biwgZmFsc2UsIHRydWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNjcnViYmVyLnNjcnViKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbi53YWl0Rm9yRGVsZXRpb25zKCk7Ci0gICAgICAgICAgICBjZnMubG9hZE5ld1NTVGFibGVzKCk7Ci0gICAgICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgNyk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuZGVsZXRlUmVjdXJzaXZlKHRlbXBEYXRhRGlyKTsKLSAgICAgICAgICAgIC8vIHJlc2V0IHBhcnRpdGlvbmVyCi0gICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0UGFydGl0aW9uZXJVbnNhZmUob2xkUGFydGl0aW9uZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgb3ZlcnJpZGVXaXRoR2FyYmFnZShTU1RhYmxlUmVhZGVyIHNzdGFibGUsIEJ5dGVCdWZmZXIga2V5MSwgQnl0ZUJ1ZmZlciBrZXkyKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gY29tcHJlc3Npb24gPSBCb29sZWFuLnBhcnNlQm9vbGVhbihTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS50ZXN0LmNvbXByZXNzaW9uIiwgImZhbHNlIikpOwotICAgICAgICBsb25nIHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uOwotCi0gICAgICAgIGlmIChjb21wcmVzc2lvbikKLSAgICAgICAgeyAvLyBvdmVyd3JpdGUgd2l0aCBnYXJiYWdlIHRoZSBjb21wcmVzc2lvbiBjaHVua3MgZnJvbSBrZXkxIHRvIGtleTIKLSAgICAgICAgICAgIENvbXByZXNzaW9uTWV0YWRhdGEgY29tcERhdGEgPSBDb21wcmVzc2lvbk1ldGFkYXRhLmNyZWF0ZShzc3RhYmxlLmdldEZpbGVuYW1lKCkpOwotCi0gICAgICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhLkNodW5rIGNodW5rMSA9IGNvbXBEYXRhLmNodW5rRm9yKAotICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKFBhcnRpdGlvblBvc2l0aW9uLkZvcktleS5nZXQoa2V5MSwgc3N0YWJsZS5nZXRQYXJ0aXRpb25lcigpKSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSkucG9zaXRpb24pOwotICAgICAgICAgICAgQ29tcHJlc3Npb25NZXRhZGF0YS5DaHVuayBjaHVuazIgPSBjb21wRGF0YS5jaHVua0ZvcigKLSAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbi5Gb3JLZXkuZ2V0KGtleTIsIHNzdGFibGUuZ2V0UGFydGl0aW9uZXIoKSksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpLnBvc2l0aW9uKTsKLQotICAgICAgICAgICAgc3RhcnRQb3NpdGlvbiA9IE1hdGgubWluKGNodW5rMS5vZmZzZXQsIGNodW5rMi5vZmZzZXQpOwotICAgICAgICAgICAgZW5kUG9zaXRpb24gPSBNYXRoLm1heChjaHVuazEub2Zmc2V0ICsgY2h1bmsxLmxlbmd0aCwgY2h1bmsyLm9mZnNldCArIGNodW5rMi5sZW5ndGgpOwotCi0gICAgICAgICAgICBjb21wRGF0YS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeyAvLyBvdmVyd3JpdGUgd2l0aCBnYXJiYWdlIGZyb20ga2V5MSB0byBrZXkyCi0gICAgICAgICAgICBsb25nIHJvdzBTdGFydCA9IHNzdGFibGUuZ2V0UG9zaXRpb24oUGFydGl0aW9uUG9zaXRpb24uRm9yS2V5LmdldChrZXkxLCBzc3RhYmxlLmdldFBhcnRpdGlvbmVyKCkpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKS5wb3NpdGlvbjsKLSAgICAgICAgICAgIGxvbmcgcm93MVN0YXJ0ID0gc3N0YWJsZS5nZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbi5Gb3JLZXkuZ2V0KGtleTIsIHNzdGFibGUuZ2V0UGFydGl0aW9uZXIoKSksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpLnBvc2l0aW9uOwotICAgICAgICAgICAgc3RhcnRQb3NpdGlvbiA9IE1hdGgubWluKHJvdzBTdGFydCwgcm93MVN0YXJ0KTsKLSAgICAgICAgICAgIGVuZFBvc2l0aW9uID0gTWF0aC5tYXgocm93MFN0YXJ0LCByb3cxU3RhcnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3ZlcnJpZGVXaXRoR2FyYmFnZShzc3RhYmxlLCBzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBvdmVycmlkZVdpdGhHYXJiYWdlKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgbG9uZyBzdGFydFBvc2l0aW9uLCBsb25nIGVuZFBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeSAoRmlsZUNoYW5uZWwgZmlsZUNoYW5uZWwgPSBuZXcgRmlsZShzc3RhYmxlLmdldEZpbGVuYW1lKCkpLm5ld1JlYWRXcml0ZUNoYW5uZWwoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZmlsZUNoYW5uZWwucG9zaXRpb24oc3RhcnRQb3NpdGlvbik7Ci0gICAgICAgICAgICBmaWxlQ2hhbm5lbC53cml0ZShCeXRlQnVmZmVyVXRpbC5ieXRlcyhTdHJpbmdVdGlscy5yZXBlYXQoJ3onLCAoaW50KSAoZW5kUG9zaXRpb24gLSBzdGFydFBvc2l0aW9uKSkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQ2h1bmtDYWNoZS5pbnN0YW5jZSAhPSBudWxsKQotICAgICAgICAgICAgQ2h1bmtDYWNoZS5pbnN0YW5jZS5pbnZhbGlkYXRlRmlsZShzc3RhYmxlLmdldEZpbGVuYW1lKCkpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGFzc2VydE9yZGVyZWRBbGwoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBpbnQgZXhwZWN0ZWRTaXplKQotICAgIHsKLSAgICAgICAgYXNzZXJ0T3JkZXJlZChVdGlsLmNtZChjZnMpLmJ1aWxkKCksIGV4cGVjdGVkU2l6ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRPcmRlcmVkKFJlYWRDb21tYW5kIGNtZCwgaW50IGV4cGVjdGVkU2l6ZSkKLSAgICB7Ci0gICAgICAgIGludCBzaXplID0gMDsKLSAgICAgICAgRGVjb3JhdGVkS2V5IHByZXYgPSBudWxsOwotICAgICAgICBmb3IgKFBhcnRpdGlvbiBwYXJ0aXRpb24gOiBVdGlsLmdldEFsbFVuZmlsdGVyZWQoY21kKSkKLSAgICAgICAgewotICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGN1cnJlbnQgPSBwYXJ0aXRpb24ucGFydGl0aW9uS2V5KCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJrZXkgIiArIGN1cnJlbnQgKyAiIGRvZXMgbm90IHNvcnQgYWZ0ZXIgcHJldmlvdXMga2V5ICIgKyBwcmV2LCBwcmV2ID09IG51bGwgfHwgcHJldi5jb21wYXJlVG8oY3VycmVudCkgPCAwKTsKLSAgICAgICAgICAgIHByZXYgPSBjdXJyZW50OwotICAgICAgICAgICAgKytzaXplOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFNpemUsIHNpemUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBmaWxsQ0YoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBpbnQgcGFydGl0aW9uc1BlclNTVGFibGUpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpdGlvbnNQZXJTU1RhYmxlOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFBhcnRpdGlvblVwZGF0ZSB1cGRhdGUgPSBVcGRhdGVCdWlsZGVyLmNyZWF0ZShjZnMubWV0YWRhdGEoKSwgU3RyaW5nLnZhbHVlT2YoaSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXdSb3coInIxIikuYWRkKCJ2YWwiLCAiMSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXdSb3coInIxIikuYWRkKCJ2YWwiLCAiMSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotCi0gICAgICAgICAgICBuZXcgTXV0YXRpb24odXBkYXRlKS5hcHBseVVuc2FmZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsSW5kZXhDRihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIGJvb2xlYW4gY29tcG9zaXRlLCBsb25nIC4uLiB2YWx1ZXMpCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdmFsdWVzLmxlbmd0aCAlIDIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkgKz0yKQotICAgICAgICB7Ci0gICAgICAgICAgICBVcGRhdGVCdWlsZGVyIGJ1aWxkZXIgPSBVcGRhdGVCdWlsZGVyLmNyZWF0ZShjZnMubWV0YWRhdGEoKSwgU3RyaW5nLnZhbHVlT2YoaSkpOwotICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLm5ld1JvdygiYyIgKyBpKQotICAgICAgICAgICAgICAgICAgICAgICAuYWRkKENPTF9JTkRFWCwgdmFsdWVzW2ldKQotICAgICAgICAgICAgICAgICAgICAgICAuYWRkKENPTF9OT05fSU5ERVgsIHZhbHVlc1tpICsgMV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIubmV3Um93KCkKLSAgICAgICAgICAgICAgICAgICAgICAgLmFkZChDT0xfSU5ERVgsIHZhbHVlc1tpXSkKLSAgICAgICAgICAgICAgICAgICAgICAgLmFkZChDT0xfTk9OX0lOREVYLCB2YWx1ZXNbaSArIDFdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5ldyBNdXRhdGlvbihidWlsZGVyLmJ1aWxkKCkpLmFwcGx5VW5zYWZlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBVdGlsLmZsdXNoKGNmcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGZpbGxDb3VudGVyQ0YoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBpbnQgcGFydGl0aW9uc1BlclNTVGFibGUpIHRocm93cyBXcml0ZVRpbWVvdXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydGl0aW9uc1BlclNTVGFibGU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSA9IFVwZGF0ZUJ1aWxkZXIuY3JlYXRlKGNmcy5tZXRhZGF0YSgpLCBTdHJpbmcudmFsdWVPZihpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5ld1JvdygicjEiKS5hZGQoInZhbCIsIDEwMEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgbmV3IENvdW50ZXJNdXRhdGlvbihuZXcgTXV0YXRpb24odXBkYXRlKSwgQ29uc2lzdGVuY3lMZXZlbC5PTkUpLmFwcGx5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBVdGlsLmZsdXNoKGNmcyk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJDb2x1bW5WYWxpZGF0aW9uKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBSZXF1ZXN0RXhlY3V0aW9uRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFF1ZXJ5UHJvY2Vzc29yLnByb2Nlc3MoU3RyaW5nLmZvcm1hdCgiQ1JFQVRFIFRBQkxFIFwiJXNcIi50ZXN0X2NvbXBhY3Rfc3RhdGljX2NvbHVtbnMgKGEgYmlnaW50LCBiIHRpbWV1dWlkLCBjIGJvb2xlYW4gc3RhdGljLCBkIHRleHQsIFBSSU1BUlkgS0VZIChhLCBiKSkiLCBrc05hbWUpLCBDb25zaXN0ZW5jeUxldmVsLk9ORSk7Ci0KLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoInRlc3RfY29tcGFjdF9zdGF0aWNfY29sdW1ucyIpOwotCi0gICAgICAgIFF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVJbnRlcm5hbChTdHJpbmcuZm9ybWF0KCJJTlNFUlQgSU5UTyBcIiVzXCIudGVzdF9jb21wYWN0X3N0YXRpY19jb2x1bW5zIChhLCBiLCBjLCBkKSBWQUxVRVMgKDEyMywgYzNkYjA3ZTgtYjYwMi0xMWUzLWJjNmItZTBiOWE1NGE2ZDkzLCB0cnVlLCAnZm9vYmFyJykiLCBrc05hbWUpKTsKLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5wZXJmb3JtU2NydWIoY2ZzLCBmYWxzZSwgdHJ1ZSwgMik7Ci0KLSAgICAgICAgUXVlcnlQcm9jZXNzb3IucHJvY2VzcyhTdHJpbmcuZm9ybWF0KCJDUkVBVEUgVEFCTEUgXCIlc1wiLnRlc3Rfc2NydWJfdmFsaWRhdGlvbiAoYSB0ZXh0IHByaW1hcnkga2V5LCBiIGludCkiLCBrc05hbWUpLCBDb25zaXN0ZW5jeUxldmVsLk9ORSk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmczIgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZSgidGVzdF9zY3J1Yl92YWxpZGF0aW9uIik7Ci0KLSAgICAgICAgbmV3IE11dGF0aW9uKFVwZGF0ZUJ1aWxkZXIuY3JlYXRlKGNmczIubWV0YWRhdGEoKSwgImtleSIpLm5ld1JvdygpLmFkZCgiYiIsIEludDMyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoMSkpLmJ1aWxkKCkpLmFwcGx5KCk7Ci0gICAgICAgIFV0aWwuZmx1c2goY2ZzMik7Ci0KLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UucGVyZm9ybVNjcnViKGNmczIsIGZhbHNlLCBmYWxzZSwgMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9yIENBU1NBTkRSQS02ODkyIHRvbywgY2hlY2sgdGhhdCBmb3IgYSBjb21wYWN0IHRhYmxlIHdpdGggb25lIGNsdXN0ZXIgY29sdW1uLCB3ZSBjYW4gaW5zZXJ0IHdoYXRldmVyCi0gICAgICogd2Ugd2FudCBhcyB2YWx1ZSBmb3IgdGhlIGNsdXN0ZXJpbmcgY29sdW1uLCBpbmNsdWRpbmcgc29tZXRoaW5nIHRoYXQgd291bGQgY29uZmxpY3Qgd2l0aCBhIENRTCBjb2x1bW4gZGVmaW5pdGlvbi4KLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0aW9uQ29tcGFjdFN0b3JhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBRdWVyeVByb2Nlc3Nvci5wcm9jZXNzKFN0cmluZy5mb3JtYXQoIkNSRUFURSBUQUJMRSBcIiVzXCIudGVzdF9jb21wYWN0X2R5bmFtaWNfY29sdW1ucyAoYSBpbnQsIGIgdGV4dCwgYyB0ZXh0LCBQUklNQVJZIEtFWSAoYSwgYikpIFdJVEggQ09NUEFDVCBTVE9SQUdFIiwga3NOYW1lKSwgQ29uc2lzdGVuY3lMZXZlbC5PTkUpOwotCi0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKCJ0ZXN0X2NvbXBhY3RfZHluYW1pY19jb2x1bW5zIik7Ci0KLSAgICAgICAgUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsKFN0cmluZy5mb3JtYXQoIklOU0VSVCBJTlRPIFwiJXNcIi50ZXN0X2NvbXBhY3RfZHluYW1pY19jb2x1bW5zIChhLCBiLCBjKSBWQUxVRVMgKDAsICdhJywgJ2ZvbycpIiwga3NOYW1lKSk7Ci0gICAgICAgIFF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVJbnRlcm5hbChTdHJpbmcuZm9ybWF0KCJJTlNFUlQgSU5UTyBcIiVzXCIudGVzdF9jb21wYWN0X2R5bmFtaWNfY29sdW1ucyAoYSwgYiwgYykgVkFMVUVTICgwLCAnYicsICdiYXInKSIsIGtzTmFtZSkpOwotICAgICAgICBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gXCIlc1wiLnRlc3RfY29tcGFjdF9keW5hbWljX2NvbHVtbnMgKGEsIGIsIGMpIFZBTFVFUyAoMCwgJ2MnLCAnYm9vJykiLCBrc05hbWUpKTsKLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5wZXJmb3JtU2NydWIoY2ZzLCB0cnVlLCB0cnVlLCAyKTsKLQotICAgICAgICAvLyBTY3J1YiBpcyBzaWxlbnQsIGJ1dCBpdCB3aWxsIHJlbW92ZSBicm9rZW4gcmVjb3Jkcy4gU28gcmVhZGluZyBldmVyeXRoaW5nIGJhY2sgdG8gbWFrZSBzdXJlIG5vdGhpbmcgdG8gInNjcnViYmVkIGF3YXkiCi0gICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcnMgPSBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiU0VMRUNUICogRlJPTSBcIiVzXCIudGVzdF9jb21wYWN0X2R5bmFtaWNfY29sdW1ucyIsIGtzTmFtZSkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJzLnNpemUoKSk7Ci0KLSAgICAgICAgSXRlcmF0b3I8VW50eXBlZFJlc3VsdFNldC5Sb3c+IGl0ZXIgPSBycy5pdGVyYXRvcigpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIGl0ZXIubmV4dCgpLmdldFN0cmluZygiYyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCBpdGVyLm5leHQoKS5nZXRTdHJpbmcoImMiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYm9vIiwgaXRlci5uZXh0KCkuZ2V0U3RyaW5nKCJjIikpOwotICAgIH0KLQotICAgIEBUZXN0IC8qIENBU1NBTkRSQS01MTc0ICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNjcnViS2V5c0luZGV4X3ByZXNlcnZlT3JkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vSWYgdGhlIHBhcnRpdGlvbmVyIHByZXNlcnZlcyB0aGUgb3JkZXIgdGhlbiBTZWNvbmRhcnlJbmRleCB1c2VzIEJ5dGVzVHlwZSBjb21wYXJhdG9yLAotICAgICAgICAvLyBvdGhlcndpc2UgaXQgdXNlcyBMb2NhbEJ5UGFydGl0aW9uZXJUeXBlCi0gICAgICAgIHRlc3RTY3J1YkluZGV4KENGX0lOREVYMV9CWVRFT1JERVJFRCwgQ09MX0lOREVYLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgQFRlc3QgLyogQ0FTU0FORFJBLTUxNzQgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJDb21wb3NpdGVJbmRleF9wcmVzZXJ2ZU9yZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0ZXN0U2NydWJJbmRleChDRl9JTkRFWDJfQllURU9SREVSRUQsIENPTF9JTkRFWCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgQFRlc3QgLyogQ0FTU0FORFJBLTUxNzQgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJLZXlzSW5kZXgoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRlc3RTY3J1YkluZGV4KENGX0lOREVYMSwgQ09MX0lOREVYLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgQFRlc3QgLyogQ0FTU0FORFJBLTUxNzQgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJDb21wb3NpdGVJbmRleCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGVzdFNjcnViSW5kZXgoQ0ZfSU5ERVgyLCBDT0xfSU5ERVgsIHRydWUsIHRydWUpOwotICAgIH0KLQotICAgIEBUZXN0IC8qIENBU1NBTkRSQS01MTc0ICovCi0gICAgcHVibGljIHZvaWQgdGVzdEZhaWxTY3J1YktleXNJbmRleCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGVzdFNjcnViSW5kZXgoQ0ZfSU5ERVgxLCBDT0xfSU5ERVgsIGZhbHNlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgQFRlc3QgLyogQ0FTU0FORFJBLTUxNzQgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbFNjcnViQ29tcG9zaXRlSW5kZXgoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRlc3RTY3J1YkluZGV4KENGX0lOREVYMiwgQ09MX0lOREVYLCB0cnVlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgQFRlc3QgLyogQ0FTU0FORFJBLTUxNzQgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJUd2ljZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGVzdFNjcnViSW5kZXgoQ0ZfSU5ERVgyLCBDT0xfSU5ERVgsIHRydWUsIHRydWUsIHRydWUpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJTYW1lUGFyYW1ldGVyVmFsdWUiKQotICAgIHByaXZhdGUgdm9pZCB0ZXN0U2NydWJJbmRleChTdHJpbmcgY2ZOYW1lLCBTdHJpbmcgY29sTmFtZSwgYm9vbGVhbiBjb21wb3NpdGUsIGJvb2xlYW4gLi4uIHNjcnVicykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKGNmTmFtZSk7Ci0KLSAgICAgICAgaW50IG51bVJvd3MgPSAxMDAwOwotICAgICAgICBsb25nW10gY29sVmFsdWVzID0gbmV3IGxvbmcgW251bVJvd3MgKiAyXTsgLy8gZWFjaCByb3cgaGFzIHR3byBjb2x1bW5zCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sVmFsdWVzLmxlbmd0aDsgaSs9MikKLSAgICAgICAgewotICAgICAgICAgICAgY29sVmFsdWVzW2ldID0gKGkgJSA0ID09IDAgPyAxTCA6IDJMKTsgLy8gaW5kZXggY29sdW1uCi0gICAgICAgICAgICBjb2xWYWx1ZXNbaSsxXSA9IDNMOyAvL290aGVyIGNvbHVtbgotICAgICAgICB9Ci0gICAgICAgIGZpbGxJbmRleENGKGNmcywgY29tcG9zaXRlLCBjb2xWYWx1ZXMpOwotCi0gICAgICAgIC8vIGNoZWNrIGluZGV4Ci0KLSAgICAgICAgYXNzZXJ0T3JkZXJlZChVdGlsLmNtZChjZnMpLmZpbHRlck9uKGNvbE5hbWUsIE9wZXJhdG9yLkVRLCAxTCkuYnVpbGQoKSwgbnVtUm93cyAvIDIpOwotCi0gICAgICAgIC8vIHNjcnViIGluZGV4Ci0gICAgICAgIFNldDxDb2x1bW5GYW1pbHlTdG9yZT4gaW5kZXhDZnNzID0gY2ZzLmluZGV4TWFuYWdlci5nZXRBbGxJbmRleENvbHVtbkZhbWlseVN0b3JlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaW5kZXhDZnNzLnNpemUoKSk7Ci0gICAgICAgIGZvcihDb2x1bW5GYW1pbHlTdG9yZSBpbmRleENmcyA6IGluZGV4Q2ZzcykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY3J1YnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBmYWlsdXJlID0gIXNjcnVic1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoZmFpbHVyZSkKLSAgICAgICAgICAgICAgICB7IC8vbWFrZSBzdXJlIHRoZSBuZXh0IHNjcnViIGZhaWxzCi0gICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlV2l0aEdhcmJhZ2UoaW5kZXhDZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCksIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKDFMKSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoMkwpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzIHJlc3VsdCA9IGluZGV4Q2ZzLnNjcnViKGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLDApOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhmYWlsdXJlID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzLkFCT1JURUQgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMuU1VDQ0VTU0ZVTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8gY2hlY2sgaW5kZXggaXMgc3RpbGwgd29ya2luZwotICAgICAgICBhc3NlcnRPcmRlcmVkKFV0aWwuY21kKGNmcykuZmlsdGVyT24oY29sTmFtZSwgT3BlcmF0b3IuRVEsIDFMKS5idWlsZCgpLCBudW1Sb3dzIC8gMik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU1NUYWJsZU11bHRpV3JpdGVyIGNyZWF0ZVRlc3RXcml0ZXIoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBsb25nIGtleUNvdW50LCBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhLCBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4pCi0gICAgewotICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciA9IG5ldyBTZXJpYWxpemF0aW9uSGVhZGVyKHRydWUsIG1ldGFkYXRhLmdldCgpLCBtZXRhZGF0YS5nZXQoKS5yZWd1bGFyQW5kU3RhdGljQ29sdW1ucygpLCBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTKTsKLSAgICAgICAgTWV0YWRhdGFDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IE1ldGFkYXRhQ29sbGVjdG9yKG1ldGFkYXRhLmdldCgpLmNvbXBhcmF0b3IpLnNzdGFibGVMZXZlbCgwKTsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0TXVsdGlXcml0ZXIobmV3IFRlc3RXcml0ZXIoZGVzY3JpcHRvciwga2V5Q291bnQsIDAsIG51bGwsIGZhbHNlLCBtZXRhZGF0YSwgY29sbGVjdG9yLCBoZWFkZXIsIHR4biksIHR4bik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdE11bHRpV3JpdGVyIGV4dGVuZHMgU2ltcGxlU1NUYWJsZU11bHRpV3JpdGVyCi0gICAgewotICAgICAgICBUZXN0TXVsdGlXcml0ZXIoU1NUYWJsZVdyaXRlciB3cml0ZXIsIExpZmVjeWNsZU5ld1RyYWNrZXIgbGlmZWN5Y2xlTmV3VHJhY2tlcikKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIod3JpdGVyLCBsaWZlY3ljbGVOZXdUcmFja2VyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3Qgd3JpdGVyIHRoYXQgYWxsb3dzIHRvIHdyaXRlIG91dCBvZiBvcmRlciBTU1RhYmxlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RXcml0ZXIgZXh0ZW5kcyBCaWdUYWJsZVdyaXRlcgotICAgIHsKLSAgICAgICAgVGVzdFdyaXRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGxvbmcga2V5Q291bnQsIGxvbmcgcmVwYWlyZWRBdCwgVGltZVVVSUQgcGVuZGluZ1JlcGFpciwgYm9vbGVhbiBpc1RyYW5zaWVudCwgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICBNZXRhZGF0YUNvbGxlY3RvciBjb2xsZWN0b3IsIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyLCBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKGRlc2NyaXB0b3IsIGtleUNvdW50LCByZXBhaXJlZEF0LCBwZW5kaW5nUmVwYWlyLCBpc1RyYW5zaWVudCwgbWV0YWRhdGEsIGNvbGxlY3RvciwgaGVhZGVyLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCB0eG4pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBsb25nIGJlZm9yZUFwcGVuZChEZWNvcmF0ZWRLZXkgZGVjb3JhdGVkS2V5KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZGF0YUZpbGUucG9zaXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHdpdGggaW52YWxpZCBzc3RhYmxlcyAoY29udGFpbmluZyBkdXBsaWNhdGUgZW50cmllcyBpbiAyLjAgYW5kIDMuMCBzdG9yYWdlIGZvcm1hdCksCi0gICAgICogdGhhdCB3ZXJlIGNhdXNlZCBieSB1cGdyYWRpbmcgZnJvbSAyLnggd2l0aCBkdXBsaWNhdGUgcmFuZ2UgdG9tYnN0b25lcy4KLSAgICAgKgotICAgICAqIFNlZSBDQVNTQU5EUkEtMTIxNDQgZm9yIGRldGFpbHMuCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyT3V0RHVwbGljYXRlcygpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIElQYXJ0aXRpb25lciBvbGRQYXJ0ID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFBhcnRpdGlvbmVyKCk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0UGFydGl0aW9uZXJVbnNhZmUoTXVybXVyM1BhcnRpdGlvbmVyLmluc3RhbmNlKTsKLSAgICAgICAgICAgIFF1ZXJ5UHJvY2Vzc29yLnByb2Nlc3MoU3RyaW5nLmZvcm1hdCgiQ1JFQVRFIFRBQkxFIFwiJXNcIi5jZl93aXRoX2R1cGxpY2F0ZXNfM18wIChhIGludCwgYiBpbnQsIGMgaW50LCBQUklNQVJZIEtFWSAoYSwgYikpIiwga3NOYW1lKSwgQ29uc2lzdGVuY3lMZXZlbC5PTkUpOwotCi0gICAgICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZSgiY2Zfd2l0aF9kdXBsaWNhdGVzXzNfMCIpOwotCi0gICAgICAgICAgICBQYXRoIGxlZ2FjeVNTVGFibGVSb290ID0gUGF0aHMuZ2V0KFN5c3RlbS5nZXRQcm9wZXJ0eShJTlZBTElEX0xFR0FDWV9TU1RBQkxFX1JPT1RfUFJPUCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLZXlzcGFjZTEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Zfd2l0aF9kdXBsaWNhdGVzXzNfMCIpOwotCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBmaWxlbmFtZSA6IG5ldyBTdHJpbmdbXXsgIm1iLTMtYmlnLUNvbXByZXNzaW9uSW5mby5kYiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1iLTMtYmlnLURpZ2VzdC5jcmMzMiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1iLTMtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWItMy1iaWctU3VtbWFyeS5kYiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1iLTMtYmlnLURhdGEuZGIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYi0zLWJpZy1GaWx0ZXIuZGIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYi0zLWJpZy1TdGF0aXN0aWNzLmRiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWItMy1iaWctVE9DLnR4dCIgfSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWxlcy5jb3B5KFBhdGhzLmdldChsZWdhY3lTU1RhYmxlUm9vdC50b1N0cmluZygpLCBmaWxlbmFtZSksIGNmcy5nZXREaXJlY3RvcmllcygpLmdldERpcmVjdG9yeUZvck5ld1NTVGFibGVzKCkudG9QYXRoKCkucmVzb2x2ZShmaWxlbmFtZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjZnMubG9hZE5ld1NTVGFibGVzKCk7Ci0KLSAgICAgICAgICAgIGNmcy5zY3J1Yih0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAxKTsKLQotICAgICAgICAgICAgVW50eXBlZFJlc3VsdFNldCBycyA9IFF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVJbnRlcm5hbChTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgKiBGUk9NIFwiJXNcIi5jZl93aXRoX2R1cGxpY2F0ZXNfM18wIiwga3NOYW1lKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJzKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBycy5zaXplKCkpOwotCi0gICAgICAgICAgICBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiREVMRVRFIEZST00gXCIlc1wiLmNmX3dpdGhfZHVwbGljYXRlc18zXzAgV0hFUkUgYT0xIEFORCBiID0yIiwga3NOYW1lKSk7Ci0gICAgICAgICAgICBycyA9IFF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVJbnRlcm5hbChTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgKiBGUk9NIFwiJXNcIi5jZl93aXRoX2R1cGxpY2F0ZXNfM18wIiwga3NOYW1lKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJzKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBycy5zaXplKCkpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFBhcnRpdGlvbmVyVW5zYWZlKG9sZFBhcnQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NjcnViVG9vbFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TY3J1YlRvb2xUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MDgxMGMuLjAwMDAwMDAKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NjcnViVG9vbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiOwotCi1pbXBvcnQgamF2YS5pby5JT0Vycm9yOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVVJRFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuV3JpdGVUaW1lb3V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29ycnVwdFNTVGFibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuU3RhbmRhbG9uZVNjcnViYmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlRvb2xSdW5uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7Ci1pbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIuY291bnRlckNGTUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyLmdldENvbXByZXNzaW9uUGFyYW1ldGVyczsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyLmxvYWRTY2hlbWE7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNjcnViVGVzdC5DRl9JTkRFWDE7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNjcnViVGVzdC5DRl9JTkRFWDFfQllURU9SREVSRUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNjcnViVGVzdC5DRl9JTkRFWDI7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNjcnViVGVzdC5DRl9JTkRFWDJfQllURU9SREVSRUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNjcnViVGVzdC5DRl9VVUlEOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TY3J1YlRlc3QuQ09NUFJFU1NJT05fQ0hVTktfTEVOR1RIOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TY3J1YlRlc3QuQ09VTlRFUl9DRjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2NydWJUZXN0LmFzc2VydE9yZGVyZWRBbGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNjcnViVGVzdC5maWxsQ0Y7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNjcnViVGVzdC5maWxsQ291bnRlckNGOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TY3J1YlRlc3Qub3ZlcnJpZGVXaXRoR2FyYmFnZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotCi1wdWJsaWMgY2xhc3MgU2NydWJUb29sVGVzdAotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRiA9ICJzY3J1Yl90b29sX3Rlc3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgc2VxID0gbmV3IEF0b21pY0ludGVnZXIoKTsKLQotICAgIFN0cmluZyBrc05hbWU7Ci0gICAgS2V5c3BhY2Uga2V5c3BhY2U7Ci0gICAgQEJlZm9yZUNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVNjaGVtYSgpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBsb2FkU2NoZW1hKCk7Ci0gICAgfQotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldHVwKCkKLSAgICB7Ci0gICAgICAgIGtzTmFtZSA9ICJzY3J1Yl90ZXN0XyIgKyBzZXEuaW5jcmVtZW50QW5kR2V0KCk7Ci0gICAgICAgIGNyZWF0ZUtleXNwYWNlKGtzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgS2V5c3BhY2VQYXJhbXMuc2ltcGxlKDEpLAotICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZENGTUQoa3NOYW1lLCBDRiksCi0gICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJDRk1EKGtzTmFtZSwgQ09VTlRFUl9DRikuY29tcHJlc3Npb24oZ2V0Q29tcHJlc3Npb25QYXJhbWV0ZXJzKENPTVBSRVNTSU9OX0NIVU5LX0xFTkdUSCkpLAotICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZENGTUQoa3NOYW1lLCBDRl9VVUlELCAwLCBVVUlEVHlwZS5pbnN0YW5jZSksCi0gICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5rZXlzSW5kZXhDRk1EKGtzTmFtZSwgQ0ZfSU5ERVgxLCB0cnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLmNvbXBvc2l0ZUluZGV4Q0ZNRChrc05hbWUsIENGX0lOREVYMiwgdHJ1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5rZXlzSW5kZXhDRk1EKGtzTmFtZSwgQ0ZfSU5ERVgxX0JZVEVPUkRFUkVELCB0cnVlKS5wYXJ0aXRpb25lcihCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLmluc3RhbmNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLmNvbXBvc2l0ZUluZGV4Q0ZNRChrc05hbWUsIENGX0lOREVYMl9CWVRFT1JERVJFRCwgdHJ1ZSkucGFydGl0aW9uZXIoQnl0ZU9yZGVyZWRQYXJ0aXRpb25lci5pbnN0YW5jZSkpOwotICAgICAgICBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NOYW1lKTsKLQotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlV0aWwuQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QsICJ0cnVlIik7IC8vIE5lY2Vzc2FyeSBmb3IgdGVzdGluZwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNjcnViT25lUGFydGl0aW9uV2l0aFRvb2woKQotICAgIHsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YpOwotCi0gICAgICAgIC8vIGluc2VydCBkYXRhIGFuZCB2ZXJpZnkgd2UgZ2V0IGl0IGJhY2sgdy8gcmFuZ2UgcXVlcnkKLSAgICAgICAgZmlsbENGKGNmcywgMSk7Ci0gICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxKTsKLQotICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlQ2xhc3MoU3RhbmRhbG9uZVNjcnViYmVyLmNsYXNzLCBrc05hbWUsIENGKTsKLSAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJQcmUtc2NydWIgc3N0YWJsZXMgc25hcHNob3R0ZWQgaW50byIpOwotICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIjEgcGFydGl0aW9ucyBpbiBuZXcgc3N0YWJsZSBhbmQgMCBlbXB0eSIpOwotICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7Ci0KLSAgICAgICAgLy8gY2hlY2sgZGF0YSBpcyBzdGlsbCB0aGVyZQotICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2tpcFNjcnViQ29ycnVwdGVkQ291bnRlclBhcnRpdGlvbldpdGhUb29sKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXcml0ZVRpbWVvdXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENPVU5URVJfQ0YpOwotICAgICAgICBpbnQgbnVtUGFydGl0aW9ucyA9IDEwMDA7Ci0KLSAgICAgICAgZmlsbENvdW50ZXJDRihjZnMsIG51bVBhcnRpdGlvbnMpOwotICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgbnVtUGFydGl0aW9ucyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuc2l6ZSgpKTsKLSAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0gICAgICAgIG92ZXJyaWRlV2l0aEdhcmJhZ2Uoc3N0YWJsZSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjAiKSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjEiKSk7Ci0KLSAgICAgICAgLy8gd2l0aCBza2lwQ29ycnVwdGVkID09IHRydWUsIHRoZSBjb3JydXB0IHJvd3Mgd2lsbCBiZSBza2lwcGVkCi0gICAgICAgIFRvb2xSdW5uZXIuVG9vbFJlc3VsdCB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VDbGFzcyhTdGFuZGFsb25lU2NydWJiZXIuY2xhc3MsICItcyIsIGtzTmFtZSwgQ09VTlRFUl9DRik7Ci0gICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiMCBlbXB0eSIpOwotICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoInBhcnRpdGlvbnMgdGhhdCB3ZXJlIHNraXBwZWQiKTsKLSAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROb1NraXBTY3J1YkNvcnJ1cHRlZENvdW50ZXJQYXJ0aXRpb25XaXRoVG9vbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3JpdGVUaW1lb3V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDT1VOVEVSX0NGKTsKLSAgICAgICAgaW50IG51bVBhcnRpdGlvbnMgPSAxMDAwOwotCi0gICAgICAgIGZpbGxDb3VudGVyQ0YoY2ZzLCBudW1QYXJ0aXRpb25zKTsKLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIG51bVBhcnRpdGlvbnMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7Ci0gICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotICAgICAgICBvdmVycmlkZVdpdGhHYXJiYWdlKHNzdGFibGUsIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCIwIiksIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCIxIikpOwotCi0gICAgICAgIC8vIHdpdGggc2tpcENvcnJ1cHRlZCA9PSBmYWxzZSwgdGhlIHNjcnViIGlzIGV4cGVjdGVkIHRvIGZhaWwKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFRvb2xSdW5uZXIuaW52b2tlQ2xhc3MoU3RhbmRhbG9uZVNjcnViYmVyLmNsYXNzLCBrc05hbWUsIENPVU5URVJfQ0YpOwotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiB0byBiZSB0aHJvd24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FcnJvciBlcnIpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZXJyLmdldENhdXNlKCkgaW5zdGFuY2VvZiBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0NoZWNrU2NydWJNdWx0aVBhcnRpdGlvbldpdGhUb29sKCkKLSAgICB7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGKTsKLQotICAgICAgICAvLyBpbnNlcnQgZGF0YSBhbmQgdmVyaWZ5IHdlIGdldCBpdCBiYWNrIHcvIHJhbmdlIHF1ZXJ5Ci0gICAgICAgIGZpbGxDRihjZnMsIDEwKTsKLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEwKTsKLQotICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlQ2xhc3MoU3RhbmRhbG9uZVNjcnViYmVyLmNsYXNzLCAiLW4iLCBrc05hbWUsIENGKTsKLSAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJQcmUtc2NydWIgc3N0YWJsZXMgc25hcHNob3R0ZWQgaW50byIpOwotICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIjEwIHBhcnRpdGlvbnMgaW4gbmV3IHNzdGFibGUgYW5kIDAgZW1wdHkiKTsKLSAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwotCi0gICAgICAgIC8vIGNoZWNrIGRhdGEgaXMgc3RpbGwgdGhlcmUKLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEwKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkZXJGaXhWYWxpZGF0ZU9ubHlXaXRoVG9vbCgpCi0gICAgewotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDRik7Ci0KLSAgICAgICAgZmlsbENGKGNmcywgMSk7Ci0gICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxKTsKLQotICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlQ2xhc3MoU3RhbmRhbG9uZVNjcnViYmVyLmNsYXNzLCAiLWUiLCAidmFsaWRhdGVfb25seSIsIGtzTmFtZSwgQ0YpOwotICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIk5vdCBjb250aW51aW5nIHdpdGggc2NydWIsIHNpbmNlICctLWhlYWRlci1maXggdmFsaWRhdGUtb25seScgd2FzIHNwZWNpZmllZC4iKTsKLSAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwotICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyRml4VmFsaWRhdGVXaXRoVG9vbCgpCi0gICAgewotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDRik7Ci0KLSAgICAgICAgZmlsbENGKGNmcywgMSk7Ci0gICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxKTsKLQotICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlQ2xhc3MoU3RhbmRhbG9uZVNjcnViYmVyLmNsYXNzLCAiLWUiLCAidmFsaWRhdGUiLCBrc05hbWUsIENGKTsKLSAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJQcmUtc2NydWIgc3N0YWJsZXMgc25hcHNob3R0ZWQgaW50byIpOwotICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIjEgcGFydGl0aW9ucyBpbiBuZXcgc3N0YWJsZSBhbmQgMCBlbXB0eSIpOwotICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7Ci0gICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkZXJGaXhGaXhPbmx5V2l0aFRvb2woKQotICAgIHsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YpOwotCi0gICAgICAgIGZpbGxDRihjZnMsIDEpOwotICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMSk7Ci0KLSAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZUNsYXNzKFN0YW5kYWxvbmVTY3J1YmJlci5jbGFzcywgIi1lIiwgImZpeC1vbmx5Iiwga3NOYW1lLCBDRik7Ci0gICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiTm90IGNvbnRpbnVpbmcgd2l0aCBzY3J1Yiwgc2luY2UgJy0taGVhZGVyLWZpeCBmaXgtb25seScgd2FzIHNwZWNpZmllZC4iKTsKLSAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwotICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyRml4V2l0aFRvb2woKQotICAgIHsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YpOwotCi0gICAgICAgIGZpbGxDRihjZnMsIDEpOwotICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMSk7Ci0KLSAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZUNsYXNzKFN0YW5kYWxvbmVTY3J1YmJlci5jbGFzcywgIi1lIiwgImZpeCIsIGtzTmFtZSwgQ0YpOwotICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIlByZS1zY3J1YiBzc3RhYmxlcyBzbmFwc2hvdHRlZCBpbnRvIik7Ci0gICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiMSBwYXJ0aXRpb25zIGluIG5ldyBzc3RhYmxlIGFuZCAwIGVtcHR5Iik7Ci0gICAgICAgIHRvb2wuYXNzZXJ0T25DbGVhbkV4aXQoKTsKLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEhlYWRlckZpeE5vQ2hlY2tzV2l0aFRvb2woKQotICAgIHsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YpOwotCi0gICAgICAgIGZpbGxDRihjZnMsIDEpOwotICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMSk7Ci0KLSAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZUNsYXNzKFN0YW5kYWxvbmVTY3J1YmJlci5jbGFzcywgIi1lIiwgIm9mZiIsIGtzTmFtZSwgQ0YpOwotICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIlByZS1zY3J1YiBzc3RhYmxlcyBzbmFwc2hvdHRlZCBpbnRvIik7Ci0gICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiMSBwYXJ0aXRpb25zIGluIG5ldyBzc3RhYmxlIGFuZCAwIGVtcHR5Iik7Ci0gICAgICAgIHRvb2wuYXNzZXJ0T25DbGVhbkV4aXQoKTsKLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TZXJpYWxpemF0aW9uSGVhZGVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NlcmlhbGl6YXRpb25IZWFkZXJUZXN0LmphdmEKaW5kZXggOGY3ZTI0Yi4uZDc3ZTFmZSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NlcmlhbGl6YXRpb25IZWFkZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NlcmlhbGl6YXRpb25IZWFkZXJUZXN0LmphdmEKQEAgLTE4LDcgKzE4LDE2IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGI7CiAKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlGdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uRmlsZXM7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKQEAgLTM4LDIzICs0NywxMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ1RhYmxlV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb2xsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKLWltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpRnVuY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIAogcHVibGljIGNsYXNzIFNlcmlhbGl6YXRpb25IZWFkZXJUZXN0CiB7CkBAIC02OCw5ICs2Niw4IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdHRlbkFzRGlmZmVyZW50S2luZCgpIHRocm93cyBFeGNlcHRpb24KICAgICB7CisgICAgICAgIFNTVGFibGVGb3JtYXQ8PywgPz4gZm9ybWF0ID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpOwogICAgICAgICBmaW5hbCBTdHJpbmcgdGFibGVOYW1lID0gInRlc3RXcml0dGVuQXNEaWZmZXJlbnRLaW5kIjsKLS8vICAgICAgICBmaW5hbCBTdHJpbmcgc2NoZW1hQ3FsV2l0aFN0YXRpYyA9IFN0cmluZy5mb3JtYXQoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQsIGMgaW50LCB2IGludCBzdGF0aWMsIFBSSU1BUlkgS0VZKGssIGMpKSIsIHRhYmxlTmFtZSk7Ci0vLyAgICAgICAgZmluYWwgU3RyaW5nIHNjaGVtYUNxbFdpdGhSZWd1bGFyID0gU3RyaW5nLmZvcm1hdCgiQ1JFQVRFIFRBQkxFICVzIChrIGludCwgYyBpbnQsIHYgaW50LCBQUklNQVJZIEtFWShrLCBjKSkiLCB0YWJsZU5hbWUpOwogICAgICAgICBDb2x1bW5JZGVudGlmaWVyIHYgPSBDb2x1bW5JZGVudGlmaWVyLmdldEludGVybmVkKCJ2IiwgZmFsc2UpOwogICAgICAgICBUYWJsZU1ldGFkYXRhIHNjaGVtYVdpdGhTdGF0aWMgPSBUYWJsZU1ldGFkYXRhLmJ1aWxkZXIoS0VZU1BBQ0UsIHRhYmxlTmFtZSkKICAgICAgICAgICAgICAgICAuYWRkUGFydGl0aW9uS2V5Q29sdW1uKCJrIiwgSW50MzJUeXBlLmluc3RhbmNlKQpAQCAtODcsMTYgKzg0LDI2IEBACiAgICAgICAgIHNjaGVtYVdpdGhTdGF0aWMgPSBzY2hlbWFXaXRoU3RhdGljLnVuYnVpbGQoKS5yZWNvcmRDb2x1bW5Ecm9wKGNvbHVtblJlZ3VsYXIsIDBMKS5idWlsZCgpOwogICAgICAgICBzY2hlbWFXaXRoUmVndWxhciA9IHNjaGVtYVdpdGhSZWd1bGFyLnVuYnVpbGQoKS5yZWNvcmRDb2x1bW5Ecm9wKGNvbHVtblN0YXRpYywgMEwpLmJ1aWxkKCk7CiAKKyAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXJXaXRoU3RhdGljID0gbnVsbDsKKyAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXJXaXRoUmVndWxhciA9IG51bGw7CiAgICAgICAgIFN1cHBsaWVyPFNlcXVlbmNlQmFzZWRTU1RhYmxlSWQ+IGlkID0gVXRpbC5uZXdTZXFHZW4oKTsKICAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShGaWxlcy5jcmVhdGVUZW1wRGlyKCkpOwogICAgICAgICB0cnkKICAgICAgICAgewogICAgICAgICAgICAgQmlGdW5jdGlvbjxUYWJsZU1ldGFkYXRhLCBGdW5jdGlvbjxCeXRlQnVmZmVyLCBDbHVzdGVyaW5nPD8+PiwgQ2FsbGFibGU8RGVzY3JpcHRvcj4+IHdyaXRlciA9IChzY2hlbWEsIGNsdXN0ZXJpbmdGdW5jdGlvbikgLT4gKCkgLT4gewotICAgICAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBEZXNjcmlwdG9yKEJpZ0Zvcm1hdC5sYXRlc3RWZXJzaW9uLCBkaXIsIHNjaGVtYS5rZXlzcGFjZSwgc2NoZW1hLm5hbWUsIGlkLmdldCgpLCBTU1RhYmxlRm9ybWF0LlR5cGUuQklHKTsKKyAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvcihmb3JtYXQuZ2V0TGF0ZXN0VmVyc2lvbigpLCBkaXIsIHNjaGVtYS5rZXlzcGFjZSwgc2NoZW1hLm5hbWUsIGlkLmdldCgpKTsKIAogICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyID0gU2VyaWFsaXphdGlvbkhlYWRlci5tYWtlV2l0aG91dFN0YXRzKHNjaGVtYSk7CiAgICAgICAgICAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBMaWZlY3ljbGVUcmFuc2FjdGlvbi5vZmZsaW5lKE9wZXJhdGlvblR5cGUuV1JJVEUpOwotICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVdyaXRlciBzc3RhYmxlV3JpdGVyID0gQmlnVGFibGVXcml0ZXIuY3JlYXRlKFRhYmxlTWV0YWRhdGFSZWYuZm9yT2ZmbGluZVRvb2xzKHNjaGVtYSksIGRlc2NyaXB0b3IsIDEsIDBMLCBudWxsLCBmYWxzZSwgMCwgaGVhZGVyLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgIHR4bikpCisgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlV3JpdGVyIHNzdGFibGVXcml0ZXIgPSBkZXNjcmlwdG9yLmdldEZvcm1hdCgpLmdldFdyaXRlckZhY3RvcnkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZGVyKGRlc2NyaXB0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRhYmxlTWV0YWRhdGFSZWYoVGFibGVNZXRhZGF0YVJlZi5mb3JPZmZsaW5lVG9vbHMoc2NoZW1hKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0S2V5Q291bnQoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2VyaWFsaXphdGlvbkhlYWRlcihoZWFkZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZsdXNoT2JzZXJ2ZXJzKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNZXRhZGF0YUNvbGxlY3RvcihuZXcgTWV0YWRhdGFDb2xsZWN0b3Ioc2NoZW1hLmNvbXBhcmF0b3IpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGREZWZhdWx0Q29tcG9uZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKHR4biwgbnVsbCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBDb2x1bW5NZXRhZGF0YSBjZCA9IHNjaGVtYS5nZXRDb2x1bW4odik7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IDUgOyArK2kpIHsKQEAgLTExNCw4ICsxMjEsOCBAQAogCiAgICAgICAgICAgICBEZXNjcmlwdG9yIHNzdGFibGVXaXRoUmVndWxhciA9IHdyaXRlci5hcHBseShzY2hlbWFXaXRoUmVndWxhciwgQnVmZmVyQ2x1c3RlcmluZzo6bmV3KS5jYWxsKCk7CiAgICAgICAgICAgICBEZXNjcmlwdG9yIHNzdGFibGVXaXRoU3RhdGljID0gd3JpdGVyLmFwcGx5KHNjaGVtYVdpdGhTdGF0aWMsIHZhbHVlIC0+IENsdXN0ZXJpbmcuU1RBVElDX0NMVVNURVJJTkcpLmNhbGwoKTsKLSAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgcmVhZGVyV2l0aFN0YXRpYyA9IFNTVGFibGVSZWFkZXIub3Blbk5vVmFsaWRhdGlvbihzc3RhYmxlV2l0aFN0YXRpYywgVGFibGVNZXRhZGF0YVJlZi5mb3JPZmZsaW5lVG9vbHMoc2NoZW1hV2l0aFJlZ3VsYXIpKTsKLSAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgcmVhZGVyV2l0aFJlZ3VsYXIgPSBTU1RhYmxlUmVhZGVyLm9wZW5Ob1ZhbGlkYXRpb24oc3N0YWJsZVdpdGhSZWd1bGFyLCBUYWJsZU1ldGFkYXRhUmVmLmZvck9mZmxpbmVUb29scyhzY2hlbWFXaXRoU3RhdGljKSk7CisgICAgICAgICAgICByZWFkZXJXaXRoU3RhdGljID0gU1NUYWJsZVJlYWRlci5vcGVuTm9WYWxpZGF0aW9uKG51bGwsIHNzdGFibGVXaXRoU3RhdGljLCBUYWJsZU1ldGFkYXRhUmVmLmZvck9mZmxpbmVUb29scyhzY2hlbWFXaXRoUmVndWxhcikpOworICAgICAgICAgICAgcmVhZGVyV2l0aFJlZ3VsYXIgPSBTU1RhYmxlUmVhZGVyLm9wZW5Ob1ZhbGlkYXRpb24obnVsbCwgc3N0YWJsZVdpdGhSZWd1bGFyLCBUYWJsZU1ldGFkYXRhUmVmLmZvck9mZmxpbmVUb29scyhzY2hlbWFXaXRoU3RhdGljKSk7CiAKICAgICAgICAgICAgIHRyeSAoSVNTVGFibGVTY2FubmVyIHBhcnRpdGlvbnMgPSByZWFkZXJXaXRoU3RhdGljLmdldFNjYW5uZXIoKSkgewogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IDUgOyArK2kpCkBAIC0xNDEsNiArMTQ4LDEwIEBACiAgICAgICAgIH0KICAgICAgICAgZmluYWxseQogICAgICAgICB7CisgICAgICAgICAgICBpZiAocmVhZGVyV2l0aFN0YXRpYyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlYWRlcldpdGhTdGF0aWMuc2VsZlJlZigpLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAocmVhZGVyV2l0aFJlZ3VsYXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZWFkZXJXaXRoUmVndWxhci5zZWxmUmVmKCkuY2xvc2UoKTsKICAgICAgICAgICAgIEZpbGVVdGlscy5kZWxldGVSZWN1cnNpdmUoZGlyKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TbmFwc2hvdFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TbmFwc2hvdFRlc3QuamF2YQppbmRleCBhYTcyNmVjLi5mZGZkZDZiIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU25hcHNob3RUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NuYXBzaG90VGVzdC5qYXZhCkBAIC0yNCw3ICsyNCw3IEBACiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0LkNvbXBvbmVudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiAKQEAgLTM4LDcgKzM4LDcgQEAKICAgICAgICAgZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkuZm9yY2VCbG9ja2luZ0ZsdXNoKENvbHVtbkZhbWlseVN0b3JlLkZsdXNoUmVhc29uLlVOSVRfVEVTVFMpOwogICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLmdldExpdmVTU1RhYmxlcygpKQogICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIHRvYyA9IG5ldyBGaWxlKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuVE9DKSk7CisgICAgICAgICAgICBGaWxlIHRvYyA9IHNzdGFibGUuZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuVE9DKTsKICAgICAgICAgICAgIEZpbGVzLndyaXRlKHRvYy50b1BhdGgoKSwgbmV3IGJ5dGVbMF0sIFN0YW5kYXJkT3Blbk9wdGlvbi5UUlVOQ0FURV9FWElTVElORyk7CiAgICAgICAgIH0KICAgICAgICAgZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkuc25hcHNob3QoImhlbGxvIik7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU3lzdGVtS2V5c3BhY2VNaWdyYXRvcjQxVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1N5c3RlbUtleXNwYWNlTWlncmF0b3I0MVRlc3QuamF2YQppbmRleCBiNTQzNjc5Li4yYTE1NjFiIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU3lzdGVtS2V5c3BhY2VNaWdyYXRvcjQxVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TeXN0ZW1LZXlzcGFjZU1pZ3JhdG9yNDFUZXN0LmphdmEKQEAgLTIwLDYgKzIwLDggQEAKIAogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOwpAQCAtMzIsNiArMzQsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVW50eXBlZFJlc3VsdFNldDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVzVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkxvbmdUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVGltZVVVSURUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwpAQCAtNDIsNiArNDUsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpczsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXMubm93OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIApAQCAtMjY0LDQgKzI2OSw1NSBAQAogICAgICAgICB9CiAgICAgICAgIGFzc2VydEVxdWFscygxLCByb3dDb3VudCk7CiAgICAgfQorICAgIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1pZ3JhdGVDb21wYWN0aW9uSGlzdG9yeSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFN0cmluZyB0YWJsZSA9IFN0cmluZy5mb3JtYXQoIiVzLiVzIiwgU2NoZW1hQ29uc3RhbnRzLlNZU1RFTV9LRVlTUEFDRV9OQU1FLCBTeXN0ZW1LZXlzcGFjZS5DT01QQUNUSU9OX0hJU1RPUlkpOworICAgICAgICBTdHJpbmcgaW5zZXJ0ID0gU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gJXMgKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiaWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYnl0ZXNfaW4sICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYnl0ZXNfb3V0LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNvbHVtbmZhbWlseV9uYW1lLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNvbXBhY3RlZF9hdCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJrZXlzcGFjZV9uYW1lLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInJvd3NfbWVyZ2VkKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB2YWx1ZXMgKCA/LCA/LCA/LCA/LCA/LCA/LCA/ICkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSk7CisgICAgICAgIFRpbWVVVUlEIGNvbXBhY3Rpb25JZCA9IFRpbWVVVUlELkdlbmVyYXRvci5hdFVuaXhNaWxsaXMoY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIERhdGUgY29tcGFjdEF0ICA9IERhdGUuZnJvbShub3coKSk7CisgICAgICAgIE1hcDxJbnRlZ2VyLCBMb25nPiByb3dzTWVyZ2VkID0gSW1tdXRhYmxlTWFwLm9mKDYsIDFMKTsKKyAgICAgICAgZXhlY3V0ZShpbnNlcnQsCisgICAgICAgICAgICAgICAgY29tcGFjdGlvbklkLAorICAgICAgICAgICAgICAgIDEwTCwKKyAgICAgICAgICAgICAgICA1TCwKKyAgICAgICAgICAgICAgICAidGFibGUiLAorICAgICAgICAgICAgICAgIGNvbXBhY3RBdCwKKyAgICAgICAgICAgICAgICAia2V5c3BhY2UiLAorICAgICAgICAgICAgICAgIHJvd3NNZXJnZWQpOworICAgICAgICBTeXN0ZW1LZXlzcGFjZU1pZ3JhdG9yNDEubWlncmF0ZUNvbXBhY3Rpb25IaXN0b3J5KCk7CisKKyAgICAgICAgaW50IHJvd0NvdW50ID0gMDsKKyAgICAgICAgZm9yIChVbnR5cGVkUmVzdWx0U2V0LlJvdyByb3cgOiBleGVjdXRlKFN0cmluZy5mb3JtYXQoIlNFTEVDVCAqIEZST00gJXMgd2hlcmUga2V5c3BhY2VfbmFtZSA9ICdrZXlzcGFjZScgYW5kIGNvbHVtbmZhbWlseV9uYW1lID0gJ3RhYmxlJyBhbGxvdyBmaWx0ZXJpbmciLCB0YWJsZSkpKQorICAgICAgICB7CisgICAgICAgICAgICByb3dDb3VudCsrOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbXBhY3Rpb25JZCwgcm93LmdldFRpbWVVVUlEKCJpZCIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMEwsIHJvdy5nZXRMb25nKCJieXRlc19pbiIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg1TCwgcm93LmdldExvbmcoImJ5dGVzX291dCIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidGFibGUiLCByb3cuZ2V0U3RyaW5nKCJjb2x1bW5mYW1pbHlfbmFtZSIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb21wYWN0QXQsIHJvdy5nZXRUaW1lc3RhbXAoImNvbXBhY3RlZF9hdCIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygia2V5c3BhY2UiLCByb3cuZ2V0U3RyaW5nKCJrZXlzcGFjZV9uYW1lIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJvd3NNZXJnZWQsIHJvdy5nZXRNYXAoInJvd3NfbWVyZ2VkIiwgSW50MzJUeXBlLmluc3RhbmNlLCBMb25nVHlwZS5pbnN0YW5jZSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZU1hcC5vZigpLCByb3cuZ2V0TWFwKCJjb21wYWN0aW9uX3Byb3BlcnRpZXMiLCBVVEY4VHlwZS5pbnN0YW5jZSwgVVRGOFR5cGUuaW5zdGFuY2UpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcm93Q291bnQpOworCisgICAgICAgIC8vVGVzdCBudWxscy9taXNzaW5nIGRvbid0IHByZXZlbnQgdGhlIHJvdyBmcm9tIHByb3BhZ2F0aW5nCisgICAgICAgIGV4ZWN1dGUoU3RyaW5nLmZvcm1hdCgiVFJVTkNBVEUgJXMiLCB0YWJsZSkpOworICAgICAgICAKKyAgICAgICAgZXhlY3V0ZShTdHJpbmcuZm9ybWF0KCJJTlNFUlQgSU5UTyAlcyAoaWQpIFZBTFVFUyAoPykiLCB0YWJsZSksIGNvbXBhY3Rpb25JZCk7CisgICAgICAgIFN5c3RlbUtleXNwYWNlTWlncmF0b3I0MS5taWdyYXRlQ29tcGFjdGlvbkhpc3RvcnkoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZXhlY3V0ZShTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgKiBGUk9NICVzIiwgdGFibGUpKS5zaXplKCkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TeXN0ZW1LZXlzcGFjZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TeXN0ZW1LZXlzcGFjZVRlc3QuamF2YQppbmRleCBiZjU5YjYyLi4wYmFkZTRiIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU3lzdGVtS2V5c3BhY2VUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1N5c3RlbUtleXNwYWNlVGVzdC5qYXZhCkBAIC0zMyw2ICszMyw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNhc3NhbmRyYVZlcnNpb247CkBAIC0xMDUsMTQgKzEwNiwxNCBAQAogICAgICAgICAvLyBGaXJzdCwgY2hlY2sgdGhhdCBpbiB0aGUgYWJzZW5jZSBvZiBhbnkgcHJldmlvdXMgaW5zdGFsbGVkIHZlcnNpb24sIHdlIGRvbid0IGNyZWF0ZSBzbmFwc2hvdHMKICAgICAgICAgZm9yIChDb2x1bW5GYW1pbHlTdG9yZSBjZnMgOiBLZXlzcGFjZS5vcGVuKFNjaGVtYUNvbnN0YW50cy5TWVNURU1fS0VZU1BBQ0VfTkFNRSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmVzKCkpCiAgICAgICAgICAgICBjZnMuY2xlYXJVbnNhZmUoKTsKLSAgICAgICAgS2V5c3BhY2UuY2xlYXJTbmFwc2hvdChudWxsLCBTY2hlbWFDb25zdGFudHMuU1lTVEVNX0tFWVNQQUNFX05BTUUpOworICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5jbGVhclNuYXBzaG90KENvbGxlY3Rpb25zLmVtcHR5TWFwKCksIG51bGwsIFNjaGVtYUNvbnN0YW50cy5TWVNURU1fS0VZU1BBQ0VfTkFNRSk7CiAKICAgICAgICAgU3lzdGVtS2V5c3BhY2Uuc25hcHNob3RPblZlcnNpb25DaGFuZ2UoKTsKICAgICAgICAgYXNzZXJ0RGVsZXRlZCgpOwogCiAgICAgICAgIC8vIG5vdyBzZXR1cCBzeXN0ZW0ubG9jYWwgYXMgaWYgd2UncmUgdXBncmFkaW5nIGZyb20gYSBwcmV2aW91cyB2ZXJzaW9uCiAgICAgICAgIHNldHVwUmVsZWFzZVZlcnNpb24oZ2V0T2xkZXJWZXJzaW9uU3RyaW5nKCkpOwotICAgICAgICBLZXlzcGFjZS5jbGVhclNuYXBzaG90KG51bGwsIFNjaGVtYUNvbnN0YW50cy5TWVNURU1fS0VZU1BBQ0VfTkFNRSk7CisgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmNsZWFyU25hcHNob3QoQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSwgbnVsbCwgU2NoZW1hQ29uc3RhbnRzLlNZU1RFTV9LRVlTUEFDRV9OQU1FKTsKICAgICAgICAgYXNzZXJ0RGVsZXRlZCgpOwogCiAgICAgICAgIC8vIENvbXBhcmUgdmVyc2lvbnMgYWdhaW4gJiB2ZXJpZnkgdGhhdCBzbmFwc2hvdHMgd2VyZSBjcmVhdGVkIGZvciBhbGwgdGFibGVzIGluIHRoZSBzeXN0ZW0ga3MKQEAgLTEyNSw3ICsxMjYsNyBAQAogCiAgICAgICAgIC8vIGNsZWFyIG91dCB0aGUgc25hcHNob3RzICYgc2V0IHRoZSBwcmV2aW91cyByZWNvcmRlZCB2ZXJzaW9uIGVxdWFsIHRvIHRoZSBsYXRlc3QsIHdlIHNob3VsZG4ndAogICAgICAgICAvLyBzZWUgYW55IG5ldyBzbmFwc2hvdHMgY3JlYXRlZCB0aGlzIHRpbWUuCi0gICAgICAgIEtleXNwYWNlLmNsZWFyU25hcHNob3QobnVsbCwgU2NoZW1hQ29uc3RhbnRzLlNZU1RFTV9LRVlTUEFDRV9OQU1FKTsKKyAgICAgICAgU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuY2xlYXJTbmFwc2hvdChDb2xsZWN0aW9ucy5lbXB0eU1hcCgpLCBudWxsLCBTY2hlbWFDb25zdGFudHMuU1lTVEVNX0tFWVNQQUNFX05BTUUpOwogICAgICAgICBzZXR1cFJlbGVhc2VWZXJzaW9uKEZCVXRpbGl0aWVzLmdldFJlbGVhc2VWZXJzaW9uU3RyaW5nKCkpOwogCiAgICAgICAgIFN5c3RlbUtleXNwYWNlLnNuYXBzaG90T25WZXJzaW9uQ2hhbmdlKCk7CkBAIC0xMzQsNyArMTM1LDcgQEAKICAgICAgICAgLy8gMTAgZmlsZXMgZXhwZWN0ZWQuCiAgICAgICAgIGFzc2VydERlbGV0ZWQoKTsKIAotICAgICAgICBLZXlzcGFjZS5jbGVhclNuYXBzaG90KG51bGwsIFNjaGVtYUNvbnN0YW50cy5TWVNURU1fS0VZU1BBQ0VfTkFNRSk7CisgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmNsZWFyU25hcHNob3QoQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSwgbnVsbCwgU2NoZW1hQ29uc3RhbnRzLlNZU1RFTV9LRVlTUEFDRV9OQU1FKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1ZlcmlmeVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9WZXJpZnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ODgzN2EuLjAwMDAwMDAKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1ZlcmlmeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKLWltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOwotaW1wb3J0IGphdmEudXRpbC56aXAuQ2hlY2tlZElucHV0U3RyZWFtOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5DaGFyc2V0czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXBkYXRlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmJhdGNobG9nLkJhdGNoOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmJhdGNobG9nLkJhdGNobG9nTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5DaHVua0NhY2hlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5WZXJpZmllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVVSURUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5CeXRlT3JkZXJlZFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5NdXJtdXIzUGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Xcml0ZVRpbWVvdXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNXcml0ZUVycm9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29ycnVwdFNTVGFibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSW5wdXRTdHJlYW1QbHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmFuZG9tQWNjZXNzUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuVG9rZW5NZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29tcHJlc3Npb25QYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyLmNvdW50ZXJDRk1EOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlci5sb2FkU2NoZW1hOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KLS8qKgotICogVGVzdCBmb3Ige0BsaW5rIFZlcmlmaWVyfS4KLSAqIAotICogTm90ZTogdGhlIGNvbXBsZXRlIGNvdmVyYWdlIGlzIGNvbXBvc2VkIG9mOgotICogLSB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuU3RhbmRhbG9uZVZlcmlmaWVyT25TU1RhYmxlc1Rlc3R9Ci0gKiAtIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5TdGFuZGFsb25lVmVyaWZpZXJUZXN0fQotICogLSB7QGxpbmsgVmVyaWZ5VGVzdH0KLSAqLwotcHVibGljIGNsYXNzIFZlcmlmeVRlc3QKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTUEFDRSA9ICJLZXlzcGFjZTEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGID0gIlN0YW5kYXJkMSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0YyID0gIlN0YW5kYXJkMiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0YzID0gIlN0YW5kYXJkMyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0Y0ID0gIlN0YW5kYXJkNCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09VTlRFUl9DRiA9ICJDb3VudGVyMSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09VTlRFUl9DRjIgPSAiQ291bnRlcjIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPVU5URVJfQ0YzID0gIkNvdW50ZXIzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1VOVEVSX0NGNCA9ICJDb3VudGVyNCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09SUlVQVF9DRiA9ICJDb3JydXB0MSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09SUlVQVF9DRjIgPSAiQ29ycnVwdDIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUlJVUFRDT1VOVEVSX0NGID0gIkNvdW50ZXJDb3JydXB0MSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09SUlVQVENPVU5URVJfQ0YyID0gIkNvdW50ZXJDb3JydXB0MiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9VVUlEID0gIlVVSURLZXlzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRl9BTFdBWVNfUFJFU0VOVCA9ICJCZkFsd2F5c1ByZXNlbnQiOwotCi0gICAgQEJlZm9yZUNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVNjaGVtYSgpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb21wcmVzc2lvblBhcmFtcyBjb21wcmVzc2lvblBhcmFtZXRlcnMgPSBDb21wcmVzc2lvblBhcmFtcy5zbmFwcHkoMzI3NjgpOwotCi0gICAgICAgIGxvYWRTY2hlbWEoKTsKLSAgICAgICAgY3JlYXRlS2V5c3BhY2UoS0VZU1BBQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRDRk1EKEtFWVNQQUNFLCBDRikuY29tcHJlc3Npb24oY29tcHJlc3Npb25QYXJhbWV0ZXJzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRDRk1EKEtFWVNQQUNFLCBDRjIpLmNvbXByZXNzaW9uKGNvbXByZXNzaW9uUGFyYW1ldGVycyksCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkQ0ZNRChLRVlTUEFDRSwgQ0YzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRDRk1EKEtFWVNQQUNFLCBDRjQpLAotICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZENGTUQoS0VZU1BBQ0UsIENPUlJVUFRfQ0YpLAotICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZENGTUQoS0VZU1BBQ0UsIENPUlJVUFRfQ0YyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckNGTUQoS0VZU1BBQ0UsIENPVU5URVJfQ0YpLmNvbXByZXNzaW9uKGNvbXByZXNzaW9uUGFyYW1ldGVycyksCi0gICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJDRk1EKEtFWVNQQUNFLCBDT1VOVEVSX0NGMikuY29tcHJlc3Npb24oY29tcHJlc3Npb25QYXJhbWV0ZXJzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckNGTUQoS0VZU1BBQ0UsIENPVU5URVJfQ0YzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckNGTUQoS0VZU1BBQ0UsIENPVU5URVJfQ0Y0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckNGTUQoS0VZU1BBQ0UsIENPUlJVUFRDT1VOVEVSX0NGKSwKLSAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckNGTUQoS0VZU1BBQ0UsIENPUlJVUFRDT1VOVEVSX0NGMiksCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkQ0ZNRChLRVlTUEFDRSwgQ0ZfVVVJRCwgMCwgVVVJRFR5cGUuaW5zdGFuY2UpLAotICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZENGTUQoS0VZU1BBQ0UsIEJGX0FMV0FZU19QUkVTRU5UKS5ibG9vbUZpbHRlckZwQ2hhbmNlKDEuMCkpOwotICAgIH0KLQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5Q29ycmVjdCgpCi0gICAgewotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YpOwotCi0gICAgICAgIGZpbGxDRihjZnMsIDIpOwotCi0gICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgZmFsc2UsIFZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5idWlsZCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGVycikKLSAgICAgICAgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5Q291bnRlckNvcnJlY3QoKQotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENPVU5URVJfQ0YpOwotCi0gICAgICAgIGZpbGxDb3VudGVyQ0YoY2ZzLCAyKTsKLQotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIHRyeSAoVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoY2ZzLCBzc3RhYmxlLCBmYWxzZSwgVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbmRlZFZlcmlmeUNvcnJlY3QoKQotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGMik7Ci0KLSAgICAgICAgZmlsbENGKGNmcywgMik7Ci0KLSAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgZmFsc2UsIFZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5idWlsZCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGVycikKLSAgICAgICAgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5kZWRWZXJpZnlDb3VudGVyQ29ycmVjdCgpCi0gICAgewotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09VTlRFUl9DRjIpOwotCi0gICAgICAgIGZpbGxDb3VudGVyQ0YoY2ZzLCAyKTsKLQotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLSAgICAgICAgdHJ5IChWZXJpZmllciB2ZXJpZmllciA9IG5ldyBWZXJpZmllcihjZnMsIHNzdGFibGUsIGZhbHNlLCBWZXJpZmllci5vcHRpb25zKCkuaW52b2tlRGlza0ZhaWx1cmVQb2xpY3kodHJ1ZSkuZXh0ZW5kZWRWZXJpZmljYXRpb24odHJ1ZSkuYnVpbGQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeUNvcnJlY3RVbmNvbXByZXNzZWQoKQotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGMyk7Ci0KLSAgICAgICAgZmlsbENGKGNmcywgMik7Ci0KLSAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0gICAgICAgIHRyeSAoVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoY2ZzLCBzc3RhYmxlLCBmYWxzZSwgVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlDb3VudGVyQ29ycmVjdFVuY29tcHJlc3NlZCgpCi0gICAgewotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09VTlRFUl9DRjMpOwotCi0gICAgICAgIGZpbGxDb3VudGVyQ0YoY2ZzLCAyKTsKLQotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLSAgICAgICAgdHJ5IChWZXJpZmllciB2ZXJpZmllciA9IG5ldyBWZXJpZmllcihjZnMsIHNzdGFibGUsIGZhbHNlLCBWZXJpZmllci5vcHRpb25zKCkuaW52b2tlRGlza0ZhaWx1cmVQb2xpY3kodHJ1ZSkuYnVpbGQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEV4dGVuZGVkVmVyaWZ5Q29ycmVjdFVuY29tcHJlc3NlZCgpCi0gICAgewotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0Y0KTsKLQotICAgICAgICBmaWxsQ0YoY2ZzLCAyKTsKLQotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLSAgICAgICAgdHJ5IChWZXJpZmllciB2ZXJpZmllciA9IG5ldyBWZXJpZmllcihjZnMsIHNzdGFibGUsIGZhbHNlLCBWZXJpZmllci5vcHRpb25zKCkuZXh0ZW5kZWRWZXJpZmljYXRpb24odHJ1ZSkuaW52b2tlRGlza0ZhaWx1cmVQb2xpY3kodHJ1ZSkuYnVpbGQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEV4dGVuZGVkVmVyaWZ5Q291bnRlckNvcnJlY3RVbmNvbXByZXNzZWQoKQotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENPVU5URVJfQ0Y0KTsKLQotICAgICAgICBmaWxsQ291bnRlckNGKGNmcywgMik7Ci0KLSAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0gICAgICAgIHRyeSAoVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoY2ZzLCBzc3RhYmxlLCBmYWxzZSwgVmVyaWZpZXIub3B0aW9ucygpLmV4dGVuZGVkVmVyaWZpY2F0aW9uKHRydWUpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeUluY29ycmVjdERpZ2VzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3JpdGVUaW1lb3V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09SUlVQVF9DRik7Ci0KLSAgICAgICAgZmlsbENGKGNmcywgMik7Ci0KLSAgICAgICAgVXRpbC5nZXRBbGwoVXRpbC5jbWQoY2ZzKS5idWlsZCgpKTsKLQotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQotICAgICAgICB0cnkgKFJhbmRvbUFjY2Vzc1JlYWRlciBmaWxlID0gUmFuZG9tQWNjZXNzUmVhZGVyLm9wZW4obmV3IEZpbGUoc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5ESUdFU1QpKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExvbmcgY29ycmVjdENoZWNrc3VtID0gZmlsZS5yZWFkTG9uZygpOwotCi0gICAgICAgICAgICB3cml0ZUNoZWNrc3VtKCsrY29ycmVjdENoZWNrc3VtLCBzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRJR0VTVCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IChWZXJpZmllciB2ZXJpZmllciA9IG5ldyBWZXJpZmllcihjZnMsIHNzdGFibGUsIGZhbHNlLCBWZXJpZmllci5vcHRpb25zKCkuaW52b2tlRGlza0ZhaWx1cmVQb2xpY3kodHJ1ZSkuYnVpbGQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOwotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiB0byBiZSB0aHJvd24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKSB7fQotCi0gICAgICAgIHRyeSAoVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoY2ZzLCBzc3RhYmxlLCBmYWxzZSwgVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KGZhbHNlKS5idWlsZCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIFJ1bnRpbWVFeGNlcHRpb24gdG8gYmUgdGhyb3duIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXJyKSB7fQotICAgIH0KLQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5Q29ycnVwdFJvd0NvcnJlY3REaWdlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdyaXRlVGltZW91dEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENPUlJVUFRfQ0YyKTsKLQotICAgICAgICBmaWxsQ0YoY2ZzLCAyKTsKLQotICAgICAgICBVdGlsLmdldEFsbChVdGlsLmNtZChjZnMpLmJ1aWxkKCkpOwotCi0gICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotICAgICAgICAvLyBvdmVyd3JpdGUgb25lIHJvdyB3aXRoIGdhcmJhZ2UKLSAgICAgICAgbG9uZyByb3cwU3RhcnQgPSBzc3RhYmxlLmdldFBvc2l0aW9uKFBhcnRpdGlvblBvc2l0aW9uLkZvcktleS5nZXQoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjAiKSwgY2ZzLmdldFBhcnRpdGlvbmVyKCkpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKS5wb3NpdGlvbjsKLSAgICAgICAgbG9uZyByb3cxU3RhcnQgPSBzc3RhYmxlLmdldFBvc2l0aW9uKFBhcnRpdGlvblBvc2l0aW9uLkZvcktleS5nZXQoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjEiKSwgY2ZzLmdldFBhcnRpdGlvbmVyKCkpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKS5wb3NpdGlvbjsKLSAgICAgICAgbG9uZyBzdGFydFBvc2l0aW9uID0gcm93MFN0YXJ0IDwgcm93MVN0YXJ0ID8gcm93MFN0YXJ0IDogcm93MVN0YXJ0OwotICAgICAgICBsb25nIGVuZFBvc2l0aW9uID0gcm93MFN0YXJ0IDwgcm93MVN0YXJ0ID8gcm93MVN0YXJ0IDogcm93MFN0YXJ0OwotCi0gICAgICAgIEZpbGVDaGFubmVsIGZpbGUgPSBuZXcgRmlsZShzc3RhYmxlLmdldEZpbGVuYW1lKCkpLm5ld1JlYWRXcml0ZUNoYW5uZWwoKTsKLSAgICAgICAgZmlsZS5wb3NpdGlvbihzdGFydFBvc2l0aW9uKTsKLSAgICAgICAgZmlsZS53cml0ZShCeXRlQnVmZmVyVXRpbC5ieXRlcyhTdHJpbmdVdGlscy5yZXBlYXQoJ3onLCAyKSkpOwotICAgICAgICBmaWxlLmNsb3NlKCk7Ci0gICAgICAgIGlmIChDaHVua0NhY2hlLmluc3RhbmNlICE9IG51bGwpCi0gICAgICAgICAgICBDaHVua0NhY2hlLmluc3RhbmNlLmludmFsaWRhdGVGaWxlKHNzdGFibGUuZ2V0RmlsZW5hbWUoKSk7Ci0KLSAgICAgICAgLy8gVXBkYXRlIHRoZSBEaWdlc3QgdG8gaGF2ZSB0aGUgcmlnaHQgQ2hlY2tzdW0KLSAgICAgICAgd3JpdGVDaGVja3N1bShzaW1wbGVGdWxsQ2hlY2tzdW0oc3N0YWJsZS5nZXRGaWxlbmFtZSgpKSwgc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5ESUdFU1QpKTsKLQotICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgZmFsc2UsIFZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5idWlsZCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gRmlyc3QgYSBzaW1wbGUgdmVyaWZ5IGNoZWNraW5nIGRpZ2VzdCwgd2hpY2ggc2hvdWxkIHN1Y2NlZWQKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJTaW1wbGUgdmVyaWZ5IHNob3VsZCBoYXZlIHN1Y2NlZWRlZCBhcyBkaWdlc3QgbWF0Y2hlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRyeSAoVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoY2ZzLCBzc3RhYmxlLCBmYWxzZSwgVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmV4dGVuZGVkVmVyaWZpY2F0aW9uKHRydWUpLmJ1aWxkKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBOb3cgdHJ5IGV4dGVuZGVkIHZlcmlmeQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBlcnIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiB0byBiZSB0aHJvd24iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeUJyb2tlblNTVGFibGVNZXRhZGF0YSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3JpdGVUaW1lb3V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09SUlVQVF9DRjIpOwotICAgICAgICBjZnMudHJ1bmNhdGVCbG9ja2luZygpOwotICAgICAgICBmaWxsQ0YoY2ZzLCAyKTsKLQotICAgICAgICBVdGlsLmdldEFsbChVdGlsLmNtZChjZnMpLmJ1aWxkKCkpOwotCi0gICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotICAgICAgICBTdHJpbmcgZmlsZW5hbWVUb0NvcnJ1cHQgPSBzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlNUQVRTKTsKLSAgICAgICAgRmlsZUNoYW5uZWwgZmlsZSA9IG5ldyBGaWxlKGZpbGVuYW1lVG9Db3JydXB0KS5uZXdSZWFkV3JpdGVDaGFubmVsKCk7Ci0gICAgICAgIGZpbGUucG9zaXRpb24oMCk7Ci0gICAgICAgIGZpbGUud3JpdGUoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoU3RyaW5nVXRpbHMucmVwZWF0KCd6JywgMikpKTsKLSAgICAgICAgZmlsZS5jbG9zZSgpOwotICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgZmFsc2UsIFZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5idWlsZCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIHRvIGJlIHRocm93biIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBlcnIpCi0gICAgICAgIHt9Ci0gICAgICAgIHRyeSAoVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoY2ZzLCBzc3RhYmxlLCBmYWxzZSwgVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KGZhbHNlKS5idWlsZCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIFJ1bnRpbWVFeGNlcHRpb24gdG8gYmUgdGhyb3duIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGVycikgeyBmYWlsKCJ3cm9uZyBleGNlcHRpb24gdGhyb3duIik7IH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXJyKQotICAgICAgICB7fQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeU11dGF0ZVJlcGFpclN0YXR1cygpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3JpdGVUaW1lb3V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09SUlVQVF9DRjIpOwotICAgICAgICBjZnMudHJ1bmNhdGVCbG9ja2luZygpOwotICAgICAgICBmaWxsQ0YoY2ZzLCAyKTsKLQotICAgICAgICBVdGlsLmdldEFsbChVdGlsLmNtZChjZnMpLmJ1aWxkKCkpOwotCi0gICAgICAgIC8vIG1ha2UgdGhlIHNzdGFibGUgcmVwYWlyZWQ6Ci0gICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgc3N0YWJsZS5kZXNjcmlwdG9yLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLm11dGF0ZVJlcGFpck1ldGFkYXRhKHNzdGFibGUuZGVzY3JpcHRvciwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksIHNzdGFibGUuZ2V0UGVuZGluZ1JlcGFpcigpLCBzc3RhYmxlLmlzVHJhbnNpZW50KCkpOwotICAgICAgICBzc3RhYmxlLnJlbG9hZFNTVGFibGVNZXRhZGF0YSgpOwotCi0gICAgICAgIC8vIGJyZWFrIHRoZSBzc3RhYmxlOgotICAgICAgICBMb25nIGNvcnJlY3RDaGVja3N1bTsKLSAgICAgICAgdHJ5IChSYW5kb21BY2Nlc3NSZWFkZXIgZmlsZSA9IFJhbmRvbUFjY2Vzc1JlYWRlci5vcGVuKG5ldyBGaWxlKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuRElHRVNUKSkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb3JyZWN0Q2hlY2tzdW0gPSBmaWxlLnJlYWRMb25nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgd3JpdGVDaGVja3N1bSgrK2NvcnJlY3RDaGVja3N1bSwgc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5ESUdFU1QpKTsKLSAgICAgICAgdHJ5IChWZXJpZmllciB2ZXJpZmllciA9IG5ldyBWZXJpZmllcihjZnMsIHNzdGFibGUsIGZhbHNlLCBWZXJpZmllci5vcHRpb25zKCkubXV0YXRlUmVwYWlyU3RhdHVzKGZhbHNlKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5idWlsZCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIHRvIGJlIHRocm93biIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBlcnIpCi0gICAgICAgIHt9Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzc3RhYmxlLmlzUmVwYWlyZWQoKSk7Ci0KLSAgICAgICAgLy8gbm93IHRoZSByZXBhaXIgc3RhdHVzIHNob3VsZCBiZSBjaGFuZ2VkOgotICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgZmFsc2UsIFZlcmlmaWVyLm9wdGlvbnMoKS5tdXRhdGVSZXBhaXJTdGF0dXModHJ1ZSkuaW52b2tlRGlza0ZhaWx1cmVQb2xpY3kodHJ1ZSkuYnVpbGQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOwotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiB0byBiZSB0aHJvd24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKQotICAgICAgICB7fQotICAgICAgICBhc3NlcnRGYWxzZShzc3RhYmxlLmlzUmVwYWlyZWQoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QoZXhwZWN0ZWQgPSBSdW50aW1lRXhjZXB0aW9uLmNsYXNzKQotICAgIHB1YmxpYyB2b2lkIHRlc3RPdXRPZlJhbmdlVG9rZW5zKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpOwotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDRik7Ci0gICAgICAgIGZpbGxDRihjZnMsIDEwMCk7Ci0gICAgICAgIFRva2VuTWV0YWRhdGEgdG1kID0gU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuZ2V0VG9rZW5NZXRhZGF0YSgpOwotICAgICAgICBieXRlW10gdGsxID0gbmV3IGJ5dGVbMV0sIHRrMiA9IG5ldyBieXRlWzFdOwotICAgICAgICB0azFbMF0gPSAyOwotICAgICAgICB0azJbMF0gPSAxOwotICAgICAgICB0bWQudXBkYXRlTm9ybWFsVG9rZW4obmV3IEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuQnl0ZXNUb2tlbih0azEpLCBJbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlOYW1lKCIxMjcuMC4wLjEiKSk7Ci0gICAgICAgIHRtZC51cGRhdGVOb3JtYWxUb2tlbihuZXcgQnl0ZU9yZGVyZWRQYXJ0aXRpb25lci5CeXRlc1Rva2VuKHRrMiksIEluZXRBZGRyZXNzQW5kUG9ydC5nZXRCeU5hbWUoIjEyNy4wLjAuMiIpKTsKLQotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIHRyeSAoVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoY2ZzLCBzc3RhYmxlLCBmYWxzZSwgVmVyaWZpZXIub3B0aW9ucygpLmNoZWNrT3duc1Rva2Vucyh0cnVlKS5leHRlbmRlZFZlcmlmaWNhdGlvbih0cnVlKS5idWlsZCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5nZXRUb2tlbk1ldGFkYXRhKCkuY2xlYXJVbnNhZmUoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXV0YXRlUmVwYWlyKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09SUlVQVF9DRjIpOwotCi0gICAgICAgIGZpbGxDRihjZnMsIDIpOwotCi0gICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgc3N0YWJsZS5kZXNjcmlwdG9yLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLm11dGF0ZVJlcGFpck1ldGFkYXRhKHNzdGFibGUuZGVzY3JpcHRvciwgMSwgc3N0YWJsZS5nZXRQZW5kaW5nUmVwYWlyKCksIHNzdGFibGUuaXNUcmFuc2llbnQoKSk7Ci0gICAgICAgIHNzdGFibGUucmVsb2FkU1NUYWJsZU1ldGFkYXRhKCk7Ci0gICAgICAgIGNmcy5nZXRUcmFja2VyKCkubm90aWZ5U1NUYWJsZVJlcGFpcmVkU3RhdHVzQ2hhbmdlZChDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3N0YWJsZSkpOwotICAgICAgICBhc3NlcnRUcnVlKHNzdGFibGUuaXNSZXBhaXJlZCgpKTsKLSAgICAgICAgY2ZzLmZvcmNlTWFqb3JDb21wYWN0aW9uKCk7Ci0KLSAgICAgICAgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgTG9uZyBjb3JyZWN0Q2hlY2tzdW07Ci0gICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzUmVhZGVyIGZpbGUgPSBSYW5kb21BY2Nlc3NSZWFkZXIub3BlbihuZXcgRmlsZShzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRJR0VTVCkpKSkKLSAgICAgICAgewotICAgICAgICAgICAgY29ycmVjdENoZWNrc3VtID0gZmlsZS5yZWFkTG9uZygpOwotICAgICAgICB9Ci0gICAgICAgIHdyaXRlQ2hlY2tzdW0oKytjb3JyZWN0Q2hlY2tzdW0sIHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuRElHRVNUKSk7Ci0gICAgICAgIHRyeSAoVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoY2ZzLCBzc3RhYmxlLCBmYWxzZSwgVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLm11dGF0ZVJlcGFpclN0YXR1cyh0cnVlKS5idWlsZCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgICAgICBmYWlsKCJzaG91bGQgYmUgY29ycnVwdCIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBlKQotICAgICAgICB7fQotICAgICAgICBhc3NlcnRGYWxzZShzc3RhYmxlLmlzUmVwYWlyZWQoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5SW5kZXgoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRlc3RCcm9rZW5Db21wb25lbnRIZWxwZXIoQ29tcG9uZW50LlBSSU1BUllfSU5ERVgpOwotICAgIH0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlCZigpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGVzdEJyb2tlbkNvbXBvbmVudEhlbHBlcihDb21wb25lbnQuRklMVEVSKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlJbmRleFN1bW1hcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRlc3RCcm9rZW5Db21wb25lbnRIZWxwZXIoQ29tcG9uZW50LlNVTU1BUlkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0QnJva2VuQ29tcG9uZW50SGVscGVyKENvbXBvbmVudCBjb21wb25lbnRUb0JyZWFrKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwotICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpOwotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDT1JSVVBUX0NGMik7Ci0KLSAgICAgICAgZmlsbENGKGNmcywgMik7Ci0KLSAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgZmFsc2UsIFZlcmlmaWVyLm9wdGlvbnMoKS5idWlsZCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7IC8vc3RpbGwgbm90IGNvcnJ1cHQsIHNob3VsZCBwYXNzCi0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGZpbGVuYW1lVG9Db3JydXB0ID0gc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKGNvbXBvbmVudFRvQnJlYWspOwotICAgICAgICB0cnkoRmlsZUNoYW5uZWwgZmlsZUNoYW5uZWwgPSBuZXcgRmlsZShmaWxlbmFtZVRvQ29ycnVwdCkubmV3UmVhZFdyaXRlQ2hhbm5lbCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWxlQ2hhbm5lbC50cnVuY2F0ZSgzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSAoVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoY2ZzLCBzc3RhYmxlLCBmYWxzZSwgVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKLSAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBleGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2V4cGVjdGVkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RRdWljaygpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENPUlJVUFRfQ0YpOwotCi0gICAgICAgIGZpbGxDRihjZnMsIDIpOwotCi0gICAgICAgIFV0aWwuZ2V0QWxsKFV0aWwuY21kKGNmcykuYnVpbGQoKSk7Ci0KLSAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0KLSAgICAgICAgdHJ5IChSYW5kb21BY2Nlc3NSZWFkZXIgZmlsZSA9IFJhbmRvbUFjY2Vzc1JlYWRlci5vcGVuKG5ldyBGaWxlKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuRElHRVNUKSkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBMb25nIGNvcnJlY3RDaGVja3N1bSA9IGZpbGUucmVhZExvbmcoKTsKLQotICAgICAgICAgICAgd3JpdGVDaGVja3N1bSgrK2NvcnJlY3RDaGVja3N1bSwgc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5ESUdFU1QpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSAoVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoY2ZzLCBzc3RhYmxlLCBmYWxzZSwgVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGEgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gdG8gYmUgdGhyb3duIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGVycikge30KLQotICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgZmFsc2UsIFZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5xdWljayh0cnVlKS5idWlsZCgpKSkgLy8gd2l0aCBxdWljayA9IHRydWUgd2UgZG9uJ3QgdmVyaWZ5IHRoZSBkaWdlc3QKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgZmFsc2UsIFZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5idWlsZCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIFJ1bnRpbWVFeGNlcHRpb24gdG8gYmUgdGhyb3duIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGVycikge30KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSYW5nZU93bkhlbHBlcigpCi0gICAgewotICAgICAgICBMaXN0PFJhbmdlPFRva2VuPj4gbm9ybWFsaXplZCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBub3JtYWxpemVkLmFkZChyKExvbmcuTUlOX1ZBTFVFLCBMb25nLk1JTl9WQUxVRSArIDEpKTsKLSAgICAgICAgbm9ybWFsaXplZC5hZGQocihMb25nLk1JTl9WQUxVRSArIDUsIExvbmcuTUlOX1ZBTFVFICsgNikpOwotICAgICAgICBub3JtYWxpemVkLmFkZChyKExvbmcuTUlOX1ZBTFVFICsgMTAsIExvbmcuTUlOX1ZBTFVFICsgMTEpKTsKLSAgICAgICAgbm9ybWFsaXplZC5hZGQocigwLDEwKSk7Ci0gICAgICAgIG5vcm1hbGl6ZWQuYWRkKHIoMTAsMTEpKTsKLSAgICAgICAgbm9ybWFsaXplZC5hZGQocigyMCwyNSkpOwotICAgICAgICBub3JtYWxpemVkLmFkZChyKDI2LDIwMCkpOwotCi0gICAgICAgIFZlcmlmaWVyLlJhbmdlT3duSGVscGVyIHJvaCA9IG5ldyBWZXJpZmllci5SYW5nZU93bkhlbHBlcihub3JtYWxpemVkKTsKLQotICAgICAgICByb2gudmFsaWRhdGUoZGsoMSkpOwotICAgICAgICByb2gudmFsaWRhdGUoZGsoMTApKTsKLSAgICAgICAgcm9oLnZhbGlkYXRlKGRrKDExKSk7Ci0gICAgICAgIHJvaC52YWxpZGF0ZShkaygyMSkpOwotICAgICAgICByb2gudmFsaWRhdGUoZGsoMjUpKTsKLSAgICAgICAgYm9vbGVhbiBnb3RFeGNlcHRpb24gPSBmYWxzZTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJvaC52YWxpZGF0ZShkaygyNikpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgZ290RXhjZXB0aW9uID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGdvdEV4Y2VwdGlvbik7Ci0gICAgfQotCi0gICAgQFRlc3QoZXhwZWN0ZWQgPSBBc3NlcnRpb25FcnJvci5jbGFzcykKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmFuZ2VPd25IZWxwZXJCYWRUb2tlbigpCi0gICAgewotICAgICAgICBMaXN0PFJhbmdlPFRva2VuPj4gbm9ybWFsaXplZCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBub3JtYWxpemVkLmFkZChyKDAsMTApKTsKLSAgICAgICAgVmVyaWZpZXIuUmFuZ2VPd25IZWxwZXIgcm9oID0gbmV3IFZlcmlmaWVyLlJhbmdlT3duSGVscGVyKG5vcm1hbGl6ZWQpOwotICAgICAgICByb2gudmFsaWRhdGUoZGsoMSkpOwotICAgICAgICAvLyBjYWxsIHdpdGggc21hbGxlciB0b2tlbiB0byBnZXQgZXhjZXB0aW9uCi0gICAgICAgIHJvaC52YWxpZGF0ZShkaygwKSk7Ci0gICAgfQotCi0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSYW5nZU93bkhlbHBlck5vcm1hbGl6ZSgpCi0gICAgewotICAgICAgICBMaXN0PFJhbmdlPFRva2VuPj4gbm9ybWFsaXplZCA9IFJhbmdlLm5vcm1hbGl6ZShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHIoMCwwKSkpOwotICAgICAgICBWZXJpZmllci5SYW5nZU93bkhlbHBlciByb2ggPSBuZXcgVmVyaWZpZXIuUmFuZ2VPd25IZWxwZXIobm9ybWFsaXplZCk7Ci0gICAgICAgIHJvaC52YWxpZGF0ZShkayhMb25nLk1JTl9WQUxVRSkpOwotICAgICAgICByb2gudmFsaWRhdGUoZGsoMCkpOwotICAgICAgICByb2gudmFsaWRhdGUoZGsoTG9uZy5NQVhfVkFMVUUpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSYW5nZU93bkhlbHBlck5vcm1hbGl6ZVdyYXAoKQotICAgIHsKLSAgICAgICAgTGlzdDxSYW5nZTxUb2tlbj4+IG5vcm1hbGl6ZWQgPSBSYW5nZS5ub3JtYWxpemUoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChyKExvbmcuTUFYX1ZBTFVFIC0gMTAwMCxMb25nLk1JTl9WQUxVRSArIDEwMDApKSk7Ci0gICAgICAgIFZlcmlmaWVyLlJhbmdlT3duSGVscGVyIHJvaCA9IG5ldyBWZXJpZmllci5SYW5nZU93bkhlbHBlcihub3JtYWxpemVkKTsKLSAgICAgICAgcm9oLnZhbGlkYXRlKGRrKExvbmcuTUlOX1ZBTFVFKSk7Ci0gICAgICAgIHJvaC52YWxpZGF0ZShkayhMb25nLk1BWF9WQUxVRSkpOwotICAgICAgICBib29sZWFuIGdvdEV4Y2VwdGlvbiA9IGZhbHNlOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcm9oLnZhbGlkYXRlKGRrKDI2KSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICB7Ci0gICAgICAgICAgICBnb3RFeGNlcHRpb24gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoZ290RXhjZXB0aW9uKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVJhbmdlcygpCi0gICAgewotICAgICAgICBuZXcgVmVyaWZpZXIuUmFuZ2VPd25IZWxwZXIoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpLnZhbGlkYXRlKGRrKDEpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlMb2NhbFBhcnRpdGlvbmVyKCkgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uCi0gICAgewotICAgICAgICBUb2tlbk1ldGFkYXRhIHRtZCA9IFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmdldFRva2VuTWV0YWRhdGEoKTsKLSAgICAgICAgYnl0ZVtdIHRrMSA9IG5ldyBieXRlWzFdLCB0azIgPSBuZXcgYnl0ZVsxXTsKLSAgICAgICAgdGsxWzBdID0gMjsKLSAgICAgICAgdGsyWzBdID0gMTsKLSAgICAgICAgdG1kLnVwZGF0ZU5vcm1hbFRva2VuKG5ldyBCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLkJ5dGVzVG9rZW4odGsxKSwgSW5ldEFkZHJlc3NBbmRQb3J0LmdldEJ5TmFtZSgiMTI3LjAuMC4xIikpOwotICAgICAgICB0bWQudXBkYXRlTm9ybWFsVG9rZW4obmV3IEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuQnl0ZXNUb2tlbih0azIpLCBJbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlOYW1lKCIxMjcuMC4wLjIiKSk7Ci0gICAgICAgIC8vIHdyaXRlIHNvbWUgYm9ndXMgdG8gYSBsb2NhbHBhcnRpdGlvbmVyIHRhYmxlCi0gICAgICAgIEJhdGNoIGJvZ3VzID0gQmF0Y2guY3JlYXRlTG9jYWwobmV4dFRpbWVVVUlEKCksIDAsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLSAgICAgICAgQmF0Y2hsb2dNYW5hZ2VyLnN0b3JlKGJvZ3VzKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gS2V5c3BhY2Uub3Blbigic3lzdGVtIikuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoImJhdGNoZXMiKTsKLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGNmcy5nZXRMaXZlU1NUYWJsZXMoKSkKLSAgICAgICAgewotCi0gICAgICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgZmFsc2UsIFZlcmlmaWVyLm9wdGlvbnMoKS5jaGVja093bnNUb2tlbnModHJ1ZSkuYnVpbGQoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0ZpbHRlckZpbGUoKQotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKEJGX0FMV0FZU19QUkVTRU5UKTsKLSAgICAgICAgZmlsbENGKGNmcywgMTAwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMCwgY2ZzLm1ldGFkYXRhKCkucGFyYW1zLmJsb29tRmlsdGVyRnBDaGFuY2UsIDAuMCk7Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogY2ZzLmdldExpdmVTU1RhYmxlcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkZJTFRFUikpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZi5leGlzdHMoKSk7Ci0gICAgICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgZmFsc2UsIFZlcmlmaWVyLm9wdGlvbnMoKS5idWlsZCgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0KLSAgICBwcml2YXRlIERlY29yYXRlZEtleSBkayhsb25nIGwpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlckRlY29yYXRlZEtleSh0KGwpLCBCeXRlQnVmZmVyVXRpbC5FTVBUWV9CWVRFX0JVRkZFUik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSYW5nZTxUb2tlbj4gcihsb25nIHMsIGxvbmcgZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgUmFuZ2U8Pih0KHMpLCB0KGUpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRva2VuIHQobG9uZyB0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNdXJtdXIzUGFydGl0aW9uZXIuTG9uZ1Rva2VuKHQpOwotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlsbENGKENvbHVtbkZhbWlseVN0b3JlIGNmcywgaW50IHBhcnRpdGlvbnNQZXJTU1RhYmxlKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aXRpb25zUGVyU1NUYWJsZTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBVcGRhdGVCdWlsZGVyLmNyZWF0ZShjZnMubWV0YWRhdGEoKSwgU3RyaW5nLnZhbHVlT2YoaSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLm5ld1JvdygiYzEiKS5hZGQoInZhbCIsICIxIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAubmV3Um93KCJjMiIpLmFkZCgidmFsIiwgIjIiKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBseSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGZpbGxDb3VudGVyQ0YoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBpbnQgcGFydGl0aW9uc1BlclNTVGFibGUpIHRocm93cyBXcml0ZVRpbWVvdXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydGl0aW9uc1BlclNTVGFibGU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVXBkYXRlQnVpbGRlci5jcmVhdGUoY2ZzLm1ldGFkYXRhKCksIFN0cmluZy52YWx1ZU9mKGkpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXdSb3coImMxIikuYWRkKCJ2YWwiLCAxMDBMKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBseSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBsb25nIHNpbXBsZUZ1bGxDaGVja3N1bShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW1QbHVzIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbVBsdXMoZmlsZW5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBDUkMzMiBjaGVja3N1bSA9IG5ldyBDUkMzMigpOwotICAgICAgICAgICAgQ2hlY2tlZElucHV0U3RyZWFtIGNpblN0cmVhbSA9IG5ldyBDaGVja2VkSW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0sIGNoZWNrc3VtKTsKLSAgICAgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbMTI4XTsKLSAgICAgICAgICAgIHdoaWxlIChjaW5TdHJlYW0ucmVhZChiKSA+PSAwKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2luU3RyZWFtLmdldENoZWNrc3VtKCkuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUNoZWNrc3VtKGxvbmcgY2hlY2tzdW0sIFN0cmluZyBmaWxlUGF0aCkKLSAgICB7Ci0gICAgICAgIEZpbGUgb3V0RmlsZSA9IG5ldyBGaWxlKGZpbGVQYXRoKTsKLSAgICAgICAgQnVmZmVyZWRXcml0ZXIgb3V0ID0gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG91dCA9IEZpbGVzLm5ld0J1ZmZlcmVkV3JpdGVyKG91dEZpbGUudG9QYXRoKCksIENoYXJzZXRzLlVURl84KTsKLSAgICAgICAgICAgIG91dC53cml0ZShTdHJpbmcudmFsdWVPZihjaGVja3N1bSkpOwotICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZTV3JpdGVFcnJvcihlLCBvdXRGaWxlKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZVF1aWV0bHkob3V0KTsKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvYWdncmVnYXRpb24vR3JvdXBNYWtlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9hZ2dyZWdhdGlvbi9Hcm91cE1ha2VyVGVzdC5qYXZhCmluZGV4IDEzZmIwZGYuLjQzNjNkODEgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9hZ2dyZWdhdGlvbi9Hcm91cE1ha2VyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9hZ2dyZWdhdGlvbi9Hcm91cE1ha2VyVGVzdC5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpAQCAtMzI3LDYgKzMyOCw2IEBACiAgICAgICAgIFNlbGVjdG9yLkZhY3RvcnkgZmFjdG9yeSA9IHNlbGVjdGFibGUubmV3U2VsZWN0b3JGYWN0b3J5KHRhYmxlLCBudWxsLCBuZXcgQXJyYXlMaXN0PD4oKSwgVmFyaWFibGVTcGVjaWZpY2F0aW9ucy5lbXB0eSgpKTsKICAgICAgICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBmYWN0b3J5Lm5ld0luc3RhbmNlKFF1ZXJ5T3B0aW9ucy5ERUZBVUxUKTsKIAotICAgICAgICByZXR1cm4gR3JvdXBNYWtlci5uZXdTZWxlY3Rvckdyb3VwTWFrZXIodGFibGUuY29tcGFyYXRvciwgcmV2ZXJzZWQubGVuZ3RoLCBzZWxlY3Rvcik7CisgICAgICAgIHJldHVybiBHcm91cE1ha2VyLm5ld1NlbGVjdG9yR3JvdXBNYWtlcih0YWJsZS5jb21wYXJhdG9yLCByZXZlcnNlZC5sZW5ndGgsIHNlbGVjdG9yLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGNvbHVtbikpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb2x1bW5pdGVyYXRvci9TU1RhYmxlUmV2ZXJzZUl0ZXJhdG9yVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbHVtbml0ZXJhdG9yL1NTVGFibGVSZXZlcnNlSXRlcmF0b3JUZXN0LmphdmEKaW5kZXggOWY5YjdiYi4uMTY5MzE4ZCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbHVtbml0ZXJhdG9yL1NTVGFibGVSZXZlcnNlSXRlcmF0b3JUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbHVtbml0ZXJhdG9yL1NTVGFibGVSZXZlcnNlSXRlcmF0b3JUZXN0LmphdmEKQEAgLTM0LDkgKzM0LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd0luZGV4RW50cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnQzMlR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLlJvd0luZGV4RW50cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOwogCiBwdWJsaWMgY2xhc3MgU1NUYWJsZVJldmVyc2VJdGVyYXRvclRlc3QKQEAgLTg1LDkgKzg2LDEyIEBACiAgICAgICAgIFV0aWwuZmx1c2godGJsKTsKICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gSXRlcmFibGVzLmdldE9ubHlFbGVtZW50KHRibC5nZXRMaXZlU1NUYWJsZXMoKSk7CiAgICAgICAgIERlY29yYXRlZEtleSBkayA9IHRibC5nZXRQYXJ0aXRpb25lcigpLmRlY29yYXRlS2V5KEludDMyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2Uoa2V5KSk7Ci0gICAgICAgIFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSA9IHNzdGFibGUuZ2V0UG9zaXRpb24oZGssIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShpbmRleEVudHJ5LmlzSW5kZXhlZCgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoaW5kZXhFbnRyeS5jb2x1bW5zSW5kZXhDb3VudCgpID4gMik7CisgICAgICAgIGlmIChzc3RhYmxlIGluc3RhbmNlb2YgQmlnVGFibGVSZWFkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSA9ICgoQmlnVGFibGVSZWFkZXIpIHNzdGFibGUpLmdldFJvd0luZGV4RW50cnkoZGssIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoaW5kZXhFbnRyeS5pc0luZGV4ZWQoKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShpbmRleEVudHJ5LmJsb2NrQ291bnQoKSA+IDIpOworICAgICAgICB9CiAKICAgICAgICAgLy8gZHJvcCB2MSBzbyB0aGUgZmlyc3QgMiBpbmRleCBibG9ja3Mgb25seSBjb250YWluIGVtcHR5IHVuZmlsdGVyZWRzCiAgICAgICAgIFF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVJbnRlcm5hbChTdHJpbmcuZm9ybWF0KCJBTFRFUiBUQUJMRSAlcy4lcyBEUk9QIHYxIiwgS0VZU1BBQ0UsIHRhYmxlKSk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0NvbW1pdExvZ0ZhaWx1cmVQb2xpY3lUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0NvbW1pdExvZ0ZhaWx1cmVQb2xpY3lUZXN0LmphdmEKaW5kZXggYWFkZDJmZC4uM2RjNGU1ZiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2dGYWlsdXJlUG9saWN5VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21taXRsb2cvQ29tbWl0TG9nRmFpbHVyZVBvbGljeVRlc3QuamF2YQpAQCAtMzIsMTMgKzMyLDE1IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSlZNU3RhYmlsaXR5SW5zcGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLktpbGxlckZvclRlc3RzOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09NTUlUTE9HX1NUT1BfT05fRVJST1JTOworCiBwdWJsaWMgY2xhc3MgQ29tbWl0TG9nRmFpbHVyZVBvbGljeVRlc3QKIHsKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KICAgICB7CiAgICAgICAgIFNjaGVtYUxvYWRlci5wcmVwYXJlU2VydmVyKCk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmNvbW1pdGxvZy5zdG9wX29uX2Vycm9ycyIsICJ0cnVlIik7CisgICAgICAgIENPTU1JVExPR19TVE9QX09OX0VSUk9SUy5zZXRCb29sZWFuKHRydWUpOwogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0NvbW1pdExvZ1NlZ21lbnRNYW5hZ2VyQ0RDVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2dTZWdtZW50TWFuYWdlckNEQ1Rlc3QuamF2YQppbmRleCAzNzg5YjUxLi41ZjZmMjM1IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0NvbW1pdExvZ1NlZ21lbnRNYW5hZ2VyQ0RDVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21taXRsb2cvQ29tbWl0TG9nU2VnbWVudE1hbmFnZXJDRENUZXN0LmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIAogaW1wb3J0IGNvbS5nb29nbGUubW9uaXRvcmluZy5ydW50aW1lLmluc3RydW1lbnRhdGlvbi5jb21tb24udXRpbC5jb25jdXJyZW50LlVuaW50ZXJydXB0aWJsZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2VydmVyVGVzdFV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVSZWFkZXI7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKQEAgLTUxLDYgKzUyLDggQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCiAgICAgeworICAgICAgICBTZXJ2ZXJUZXN0VXRpbHMuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q0RDRW5hYmxlZCh0cnVlKTsKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENEQ1RvdGFsU3BhY2VJbk1pQigxMDI0KTsKICAgICAgICAgQ1FMVGVzdGVyLnNldFVwQ2xhc3MoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21taXRsb2cvQ29tbWl0TG9nVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2dUZXN0LmphdmEKaW5kZXggMTdiYmVjZS4uZDUzYzFkNCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2dUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2dUZXN0LmphdmEKQEAgLTEsMjMgKzEsMjUgQEAKIC8qCi0qIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0qIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0qIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoKLSogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0qIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0qIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZzsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwpAQCAtNDEsNiArNDMsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkZpbGVzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlT3V0cHV0U3RyZWFtUGx1czsKKwogaW1wb3J0IG9yZy5qdW5pdC4qOwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOwpAQCAtNTQsNiArNTcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5NZW10YWJsZVBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hVGVzdFV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlSWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKQEAgLTg1LDYgKzg5LDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnZpbnQuVkludENvZGluZzsKIAoraW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DT01NSVRMT0dfSUdOT1JFX1JFUExBWV9FUlJPUlM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09NTUlUX0xPR19SRVBMQVlfTElTVDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZ1NlZ21lbnQuRU5UUllfT1ZFUkhFQURfU0laRTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWwuYnl0ZXM7CiAKQEAgLTEwNyw2ICsxMTQsMTEgQEAKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFOREFSRDEgPSAiU3RhbmRhcmQxIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBTkRBUkQyID0gIlN0YW5kYXJkMiI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTTEgPSAiQ3VzdG9tMSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFMV9SRVBMQVkgPSAiQ29tbWl0TG9nVGVzdFJlcGxheTEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTUEFDRTFfUkVQTEFZX1RBQkxFMSA9ICJDb21taXRMb2dUZXN0UmVwbGF5MVRhYmxlMSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFMV9SRVBMQVlfVEFCTEUyID0gIkNvbW1pdExvZ1Rlc3RSZXBsYXkxVGFibGUyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0UyX1JFUExBWSA9ICJDb21taXRMb2dUZXN0UmVwbGF5MiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFMl9SRVBMQVlfVEFCTEUyID0gIkNvbW1pdExvZ1Rlc3RSZXBsYXkyVGFibGUyIjsKIAogICAgIHByaXZhdGUgc3RhdGljIEpWTVN0YWJpbGl0eUluc3BlY3Rvci5LaWxsZXIgb2xkS2lsbGVyOwogICAgIHByaXZhdGUgc3RhdGljIEtpbGxlckZvclRlc3RzIHRlc3RLaWxsZXI7CkBAIC0xMjEsMTQgKzEzMywxNCBAQAogICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gZ2VuZXJhdGVEYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW10KLSAgICAgICAgewotICAgICAgICAgICAgeyBudWxsLCBFbmNyeXB0aW9uQ29udGV4dEdlbmVyYXRvci5jcmVhdGVEaXNhYmxlZENvbnRleHQoKX0sIC8vIE5vIGNvbXByZXNzaW9uLCBubyBlbmNyeXB0aW9uCi0gICAgICAgICAgICB7IG51bGwsIG5ld0VuY3J5cHRpb25Db250ZXh0KCkgfSwgLy8gRW5jcnlwdGlvbgotICAgICAgICAgICAgeyBuZXcgUGFyYW1ldGVyaXplZENsYXNzKExaNENvbXByZXNzb3IuY2xhc3MuZ2V0TmFtZSgpLCBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKSwgRW5jcnlwdGlvbkNvbnRleHRHZW5lcmF0b3IuY3JlYXRlRGlzYWJsZWRDb250ZXh0KCkgfSwKLSAgICAgICAgICAgIHsgbmV3IFBhcmFtZXRlcml6ZWRDbGFzcyhTbmFwcHlDb21wcmVzc29yLmNsYXNzLmdldE5hbWUoKSwgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSksIEVuY3J5cHRpb25Db250ZXh0R2VuZXJhdG9yLmNyZWF0ZURpc2FibGVkQ29udGV4dCgpfSwKLSAgICAgICAgICAgIHsgbmV3IFBhcmFtZXRlcml6ZWRDbGFzcyhEZWZsYXRlQ29tcHJlc3Nvci5jbGFzcy5nZXROYW1lKCksIENvbGxlY3Rpb25zLmVtcHR5TWFwKCkpLCBFbmNyeXB0aW9uQ29udGV4dEdlbmVyYXRvci5jcmVhdGVEaXNhYmxlZENvbnRleHQoKX0sCi0gICAgICAgICAgICB7IG5ldyBQYXJhbWV0ZXJpemVkQ2xhc3MoWnN0ZENvbXByZXNzb3IuY2xhc3MuZ2V0TmFtZSgpLCBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKSwgRW5jcnlwdGlvbkNvbnRleHRHZW5lcmF0b3IuY3JlYXRlRGlzYWJsZWRDb250ZXh0KCl9Ci0gICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbnVsbCwgRW5jcnlwdGlvbkNvbnRleHRHZW5lcmF0b3IuY3JlYXRlRGlzYWJsZWRDb250ZXh0KCkgfSwgLy8gTm8gY29tcHJlc3Npb24sIG5vIGVuY3J5cHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBudWxsLCBuZXdFbmNyeXB0aW9uQ29udGV4dCgpIH0sIC8vIEVuY3J5cHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBuZXcgUGFyYW1ldGVyaXplZENsYXNzKExaNENvbXByZXNzb3IuY2xhc3MuZ2V0TmFtZSgpLCBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKSwgRW5jcnlwdGlvbkNvbnRleHRHZW5lcmF0b3IuY3JlYXRlRGlzYWJsZWRDb250ZXh0KCkgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBuZXcgUGFyYW1ldGVyaXplZENsYXNzKFNuYXBweUNvbXByZXNzb3IuY2xhc3MuZ2V0TmFtZSgpLCBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKSwgRW5jcnlwdGlvbkNvbnRleHRHZW5lcmF0b3IuY3JlYXRlRGlzYWJsZWRDb250ZXh0KCkgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBuZXcgUGFyYW1ldGVyaXplZENsYXNzKERlZmxhdGVDb21wcmVzc29yLmNsYXNzLmdldE5hbWUoKSwgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSksIEVuY3J5cHRpb25Db250ZXh0R2VuZXJhdG9yLmNyZWF0ZURpc2FibGVkQ29udGV4dCgpIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbmV3IFBhcmFtZXRlcml6ZWRDbGFzcyhac3RkQ29tcHJlc3Nvci5jbGFzcy5nZXROYW1lKCksIENvbGxlY3Rpb25zLmVtcHR5TWFwKCkpLCBFbmNyeXB0aW9uQ29udGV4dEdlbmVyYXRvci5jcmVhdGVEaXNhYmxlZENvbnRleHQoKSB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIEVuY3J5cHRpb25Db250ZXh0IG5ld0VuY3J5cHRpb25Db250ZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbgpAQCAtMTUyLDEyICsxNjQsMTIgQEAKICAgICAgICAgTWVtdGFibGVQYXJhbXMgc2tpcExpc3RNZW10YWJsZSA9IE1lbXRhYmxlUGFyYW1zLmdldCgic2tpcGxpc3QiKTsKIAogICAgICAgICBUYWJsZU1ldGFkYXRhLkJ1aWxkZXIgY3VzdG9tID0KLSAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEuYnVpbGRlcihLRVlTUEFDRTEsIENVU1RPTTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFBhcnRpdGlvbktleUNvbHVtbigiayIsIEludGVnZXJUeXBlLmluc3RhbmNlKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbHVzdGVyaW5nQ29sdW1uKCJjMSIsIE1hcFR5cGUuZ2V0SW5zdGFuY2UoVVRGOFR5cGUuaW5zdGFuY2UsIFVURjhUeXBlLmluc3RhbmNlLCBmYWxzZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsdXN0ZXJpbmdDb2x1bW4oImMyIiwgU2V0VHlwZS5nZXRJbnN0YW5jZShVVEY4VHlwZS5pbnN0YW5jZSwgZmFsc2UpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRTdGF0aWNDb2x1bW4oInMiLCBJbnRlZ2VyVHlwZS5pbnN0YW5jZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAubWVtdGFibGUoc2tpcExpc3RNZW10YWJsZSk7CisgICAgICAgIFRhYmxlTWV0YWRhdGEuYnVpbGRlcihLRVlTUEFDRTEsIENVU1RPTTEpCisgICAgICAgICAgICAgICAgICAgICAuYWRkUGFydGl0aW9uS2V5Q29sdW1uKCJrIiwgSW50ZWdlclR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAuYWRkQ2x1c3RlcmluZ0NvbHVtbigiYzEiLCBNYXBUeXBlLmdldEluc3RhbmNlKFVURjhUeXBlLmluc3RhbmNlLCBVVEY4VHlwZS5pbnN0YW5jZSwgZmFsc2UpKQorICAgICAgICAgICAgICAgICAgICAgLmFkZENsdXN0ZXJpbmdDb2x1bW4oImMyIiwgU2V0VHlwZS5nZXRJbnN0YW5jZShVVEY4VHlwZS5pbnN0YW5jZSwgZmFsc2UpKQorICAgICAgICAgICAgICAgICAgICAgLmFkZFN0YXRpY0NvbHVtbigicyIsIEludGVnZXJUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgLm1lbXRhYmxlKHNraXBMaXN0TWVtdGFibGUpOwogCiAgICAgICAgIFNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZShLRVlTUEFDRTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCkBAIC0xNjgsNiArMTgwLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGVUcmFuc2llbnQoMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMiwgU1RBTkRBUkQxLCAwLCBBc2NpaVR5cGUuaW5zdGFuY2UsIEJ5dGVzVHlwZS5pbnN0YW5jZSkubWVtdGFibGUoc2tpcExpc3RNZW10YWJsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMiwgU1RBTkRBUkQyLCAwLCBBc2NpaVR5cGUuaW5zdGFuY2UsIEJ5dGVzVHlwZS5pbnN0YW5jZSkubWVtdGFibGUoc2tpcExpc3RNZW10YWJsZSkpOworICAgICAgICBTY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2UoS0VZU1BBQ0UxX1JFUExBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxX1JFUExBWSwgS0VZU1BBQ0UxX1JFUExBWV9UQUJMRTEsIDAsIEFzY2lpVHlwZS5pbnN0YW5jZSwgQnl0ZXNUeXBlLmluc3RhbmNlKS5tZW10YWJsZShza2lwTGlzdE1lbXRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxX1JFUExBWSwgS0VZU1BBQ0UxX1JFUExBWV9UQUJMRTIsIDAsIEFzY2lpVHlwZS5pbnN0YW5jZSwgQnl0ZXNUeXBlLmluc3RhbmNlKS5tZW10YWJsZShza2lwTGlzdE1lbXRhYmxlKSk7CisgICAgICAgIFNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZShLRVlTUEFDRTJfUkVQTEFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5c3BhY2VQYXJhbXMuc2ltcGxlKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTJfUkVQTEFZLCBLRVlTUEFDRTJfUkVQTEFZX1RBQkxFMiwgMCwgQXNjaWlUeXBlLmluc3RhbmNlLCBCeXRlc1R5cGUuaW5zdGFuY2UpLm1lbXRhYmxlKHNraXBMaXN0TWVtdGFibGUpKTsKKwogICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKIAogICAgICAgICB0ZXN0S2lsbGVyID0gbmV3IEtpbGxlckZvclRlc3RzKCk7CkBAIC0xODEsNiArMjAxLDEwIEBACiAgICAgQEFmdGVyQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWZ0ZXJDbGFzcygpCiAgICAgeworICAgICAgICBTY2hlbWFUZXN0VXRpbC5kcm9wS2V5c3BhY2VJZkV4aXN0KEtFWVNQQUNFMSwgdHJ1ZSk7CisgICAgICAgIFNjaGVtYVRlc3RVdGlsLmRyb3BLZXlzcGFjZUlmRXhpc3QoS0VZU1BBQ0UyLCB0cnVlKTsKKyAgICAgICAgU2NoZW1hVGVzdFV0aWwuZHJvcEtleXNwYWNlSWZFeGlzdChLRVlTUEFDRTFfUkVQTEFZLCB0cnVlKTsKKyAgICAgICAgU2NoZW1hVGVzdFV0aWwuZHJvcEtleXNwYWNlSWZFeGlzdChLRVlTUEFDRTJfUkVQTEFZLCB0cnVlKTsKICAgICAgICAgSlZNU3RhYmlsaXR5SW5zcGVjdG9yLnJlcGxhY2VLaWxsZXIob2xkS2lsbGVyKTsKICAgICB9CiAKQEAgLTE5NCw3ICsyMTgsNyBAQAogICAgIHB1YmxpYyB2b2lkIGFmdGVyVGVzdCgpCiAgICAgewogICAgICAgICBDb21taXRMb2dTZWdtZW50UmVhZGVyLnNldEFsbG93U2tpcFN5bmNNYXJrZXJDcmMoZmFsc2UpOwotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiY2Fzc2FuZHJhLnJlcGxheUxpc3QiKTsKKyAgICAgICAgQ09NTUlUX0xPR19SRVBMQVlfTElTVC5jbGVhclZhbHVlKCk7IC8vIGNoZWNrc3R5bGU6IHN1cHByZXNzIG5lYXJieSAnY2xlYXJWYWx1ZVN5c3RlbVByb3BlcnR5VXNhZ2UnCiAgICAgICAgIHRlc3RLaWxsZXIucmVzZXQoKTsKICAgICB9CiAKQEAgLTMxNSwxMSArMzM5LDkgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNvdmVyeVdpdGhHYXJiYWdlTG9nX2lnbm9yZWRCeVByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShDb21taXRMb2dSZXBsYXllci5JR05PUkVfUkVQTEFZX0VSUk9SU19QUk9QRVJUWSwgInRydWUiKTsKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KENPTU1JVExPR19JR05PUkVfUkVQTEFZX0VSUk9SUywgInRydWUiKSkKKyAgICAgICAgewogICAgICAgICAgICAgdGVzdFJlY292ZXJ5V2l0aEdhcmJhZ2VMb2coKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KENvbW1pdExvZ1JlcGxheWVyLklHTk9SRV9SRVBMQVlfRVJST1JTX1BST1BFUlRZKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzgyLDEwICs0MDQsMTAgQEAKICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzMiA9IGtzLmdldENvbHVtbkZhbWlseVN0b3JlKFNUQU5EQVJEMik7CiAKICAgICAgICAgLy8gUm91Z2hseSAzMiBNaUIgbXV0YXRpb24KLSAgICAgICAgIE11dGF0aW9uIHJtID0gbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoY2ZzMS5tZXRhZGF0YSgpLCAwLCAiayIpCi0gICAgICAgICAgICAgICAgICAuY2x1c3RlcmluZygiYnl0ZXMiKQotICAgICAgICAgICAgICAgICAgLmFkZCgidmFsIiwgQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgoRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbW1pdExvZ1NlZ21lbnRTaXplKCkvNCkgLSAxKSkKLSAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBNdXRhdGlvbiBybSA9IG5ldyBSb3dVcGRhdGVCdWlsZGVyKGNmczEubWV0YWRhdGEoKSwgMCwgImsiKQorICAgICAgICAgICAgICAgICAgICAgIC5jbHVzdGVyaW5nKCJieXRlcyIpCisgICAgICAgICAgICAgICAgICAgICAgLmFkZCgidmFsIiwgQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgoRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbW1pdExvZ1NlZ21lbnRTaXplKCkgLyA0KSAtIDEpKQorICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwogCiAgICAgICAgIC8vIEFkZGluZyBpdCB0d2ljZSAod29uJ3QgY2hhbmdlIHNlZ21lbnQpCiAgICAgICAgIENvbW1pdExvZy5pbnN0YW5jZS5hZGQocm0pOwpAQCAtNDEyLDcgKzQzNCw3IEBACiAKICAgICAgICAgQ29sbGVjdGlvbjxDb21taXRMb2dTZWdtZW50PiBzZWdtZW50cyA9IENvbW1pdExvZy5pbnN0YW5jZS5zZWdtZW50TWFuYWdlci5nZXRBY3RpdmVTZWdtZW50cygpOwogCi0gICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJFeHBlY3RlZCAzIHNlZ21lbnRzIGJ1dCBnb3QgJWQgKCVzKSIsIHNlZ21lbnRzLnNpemUoKSwgZ2V0RGlydHlDRklkcyhzZWdtZW50cykpLAorICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybWF0KCJFeHBlY3RlZCAzIHNlZ21lbnRzIGJ1dCBnb3QgJWQgKCVzKSIsIHNlZ21lbnRzLnNpemUoKSwgZ2V0RGlydHlDRklkcyhzZWdtZW50cykpLAogICAgICAgICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRzLnNpemUoKSk7CiAKQEAgLTQyNSw3ICs0NDcsNyBAQAogICAgICAgICBzZWdtZW50cyA9IENvbW1pdExvZy5pbnN0YW5jZS5zZWdtZW50TWFuYWdlci5nZXRBY3RpdmVTZWdtZW50cygpOwogCiAgICAgICAgIC8vIEFzc2VydCB3ZSBzdGlsbCBoYXZlIGJvdGggb3VyIHNlZ21lbnQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkV4cGVjdGVkIDEgc2VnbWVudCBidXQgZ290ICVkICglcykiLCBzZWdtZW50cy5zaXplKCksIGdldERpcnR5Q0ZJZHMoc2VnbWVudHMpKSwKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvcm1hdCgiRXhwZWN0ZWQgMSBzZWdtZW50IGJ1dCBnb3QgJWQgKCVzKSIsIHNlZ21lbnRzLnNpemUoKSwgZ2V0RGlydHlDRklkcyhzZWdtZW50cykpLAogICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRzLnNpemUoKSk7CiAgICAgfQpAQCAtNTAzLDYgKzUyNSw3IEBACiAgICAgICAgIH0KICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJtdXRhdGlvbiBsYXJnZXIgdGhhbiBsaW1pdCB3YXMgYWNjZXB0ZWQiKTsKICAgICB9CisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlZWRSZWNvcmRMaW1pdFdpdGhNdWx0aXBsZVBhcnRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewpAQCAtNTM2LDEyICs1NTksMTIgQEAKICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gZXhjZXB0aW9uLmdldE1lc3NhZ2UoKTsKIAogICAgICAgICAgICAgbG9uZyBtdXRhdGlvblNpemUgPSBtdXRhdGlvbi5zZXJpYWxpemVkU2l6ZShNZXNzYWdpbmdTZXJ2aWNlLmN1cnJlbnRfdmVyc2lvbikgKyBFTlRSWV9PVkVSSEVBRF9TSVpFOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkTWVzc2FnZVByZWZpeCA9IFN0cmluZy5mb3JtYXQoIlJlamVjdGVkIGFuIG92ZXJzaXplZCBtdXRhdGlvbiAoJWQvJWQpIGZvciBrZXlzcGFjZTogJXMuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0aW9uU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5nZXRNYXhNdXRhdGlvblNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWVNQQUNFMSk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRNZXNzYWdlUHJlZml4ID0gZm9ybWF0KCJSZWplY3RlZCBhbiBvdmVyc2l6ZWQgbXV0YXRpb24gKCVkLyVkKSBmb3Iga2V5c3BhY2U6ICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0aW9uU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldE1heE11dGF0aW9uU2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlTUEFDRTEpOwogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLnN0YXJ0c1dpdGgoZXhwZWN0ZWRNZXNzYWdlUHJlZml4KSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY29udGFpbnMoU3RyaW5nLmZvcm1hdCgiJXMuJXMgYW5kIDEgbW9yZS4iLCBTVEFOREFSRDEsIGtleSkpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucyhmb3JtYXQoIiVzLiVzIGFuZCAxIG1vcmUuIiwgU1RBTkRBUkQxLCBrZXkpKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTcxMyw3ICs3MzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKCJ2YWwiLCBCeXRlQnVmZmVyLmFsbG9jYXRlKERhdGFiYXNlRGVzY3JpcHRvci5nZXRDb21taXRMb2dTZWdtZW50U2l6ZSgpIC8gNCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwogCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCA1IDsgaSsrKQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspCiAgICAgICAgICAgICAgICAgQ29tbWl0TG9nLmluc3RhbmNlLmFkZChtMik7CiAKICAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBDb21taXRMb2cuaW5zdGFuY2Uuc2VnbWVudE1hbmFnZXIuZ2V0QWN0aXZlU2VnbWVudHMoKS5zaXplKCkpOwpAQCAtNzkxLDYgKzgxNCwxMjQgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYXlMaXN0UHJvcGVydHkoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICAvLyBvbmx5IGtleXNwYWNlCisgICAgICAgIGFzc2VydFJlcGxheSgyLCBDT01NSVRfTE9HX1JFUExBWV9MSVNULCBLRVlTUEFDRTFfUkVQTEFZKTsKKworICAgICAgICAvLyBvbmx5IGtleXNwYWNlcworICAgICAgICBhc3NlcnRSZXBsYXkoMywgQ09NTUlUX0xPR19SRVBMQVlfTElTVCwgZm9ybWF0KCIlcywlcyIsIEtFWVNQQUNFMV9SRVBMQVksIEtFWVNQQUNFMl9SRVBMQVkpKTsKKworICAgICAgICAvLyBvbmx5IHRhYmxlIHdpdGgga2V5c3BhY2UKKyAgICAgICAgYXNzZXJ0UmVwbGF5KDEsIENPTU1JVF9MT0dfUkVQTEFZX0xJU1QsIGZvcm1hdCgiJXMuJXMiLCBLRVlTUEFDRTFfUkVQTEFZLCBLRVlTUEFDRTFfUkVQTEFZX1RBQkxFMSkpOworCisgICAgICAgIC8vIG1peCBvZiBrZXlzcGFjZSBhbmQgdGFibGVzIHdpdGgga2V5c3BhY2VzCisgICAgICAgIGFzc2VydFJlcGxheSgyLCBDT01NSVRfTE9HX1JFUExBWV9MSVNULCBmb3JtYXQoIiVzLiVzLCVzIiwgS0VZU1BBQ0UxX1JFUExBWSwgS0VZU1BBQ0UxX1JFUExBWV9UQUJMRTEsIEtFWVNQQUNFMl9SRVBMQVkpKTsKKworICAgICAgICAvLyBvbmx5IHRhYmxlcyB3aXRoIGtleXNwYWNlcworICAgICAgICBhc3NlcnRSZXBsYXkoMiwgQ09NTUlUX0xPR19SRVBMQVlfTElTVCwgZm9ybWF0KCIlcy4lcywlcy4lcyIsIEtFWVNQQUNFMV9SRVBMQVksIEtFWVNQQUNFMV9SRVBMQVlfVEFCTEUxLCBLRVlTUEFDRTJfUkVQTEFZLCBLRVlTUEFDRTJfUkVQTEFZX1RBQkxFMikpOworCisgICAgICAgIC8vIG1peCBvZiBrZXlzcGFjZSBhbmQgdGFibGVzIHdpdGgga2V5c3BhY2VzIHdpdGhpbiBzYW1lIGtleXNwYWNlLgorICAgICAgICBhc3NlcnRSZXBsYXkoMiwgQ09NTUlUX0xPR19SRVBMQVlfTElTVCwgZm9ybWF0KCIlcy4lcywlcyIsIEtFWVNQQUNFMV9SRVBMQVksIEtFWVNQQUNFMV9SRVBMQVlfVEFCTEUxLCBLRVlTUEFDRTFfUkVQTEFZKSk7CisKKyAgICAgICAgLy8gdGVzdCBmb3Igd3JvbmcgZm9ybWF0cworCisgICAgICAgIFN0cmluZyBpbnZhbGlkRm9ybWF0ID0gZm9ybWF0KCIlcy4lcy4lcyIsIEtFWVNQQUNFMV9SRVBMQVksIEtFWVNQQUNFMV9SRVBMQVlfVEFCTEUxLCBLRVlTUEFDRTFfUkVQTEFZKTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0UmVwbGF5KDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUlUX0xPR19SRVBMQVlfTElTVCwgaW52YWxpZEZvcm1hdCk7CisgICAgICAgICAgICBmYWlsKGZvcm1hdCgicmVwbGF5IHNob3VsZCBmYWlsIG9uIC1EJXM9JXMgYXMgaXQgaXMgaW4gaW52YWxpZCBmb3JtYXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUlUX0xPR19SRVBMQVlfTElTVC5nZXRLZXkoKSwgaW52YWxpZEZvcm1hdCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmb3JtYXQoIiVzIHByb3BlcnR5IGNvbnRhaW5zIGFuIGl0ZW0gd2hpY2ggaXMgbm90ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gZm9ybWF0ICdrZXlzcGFjZScgb3IgJ2tleXNwYWNlLnRhYmxlJyBidXQgaXQgaXMgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1JVF9MT0dfUkVQTEFZX0xJU1QuZ2V0S2V5KCksIGludmFsaWRGb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGV4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgaW52YWxpZEZvcm1hdDIgPSBmb3JtYXQoIiVzLiVzLCVzLiIsIEtFWVNQQUNFMV9SRVBMQVksIEtFWVNQQUNFMV9SRVBMQVlfVEFCTEUxLCBLRVlTUEFDRTFfUkVQTEFZKTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0UmVwbGF5KDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUlUX0xPR19SRVBMQVlfTElTVCwgaW52YWxpZEZvcm1hdDIpOworICAgICAgICAgICAgZmFpbChmb3JtYXQoInJlcGxheSBzaG91bGQgZmFpbCBvbiAtRCVzPSVzIGFzIGl0IGlzIGluIGludmFsaWQgZm9ybWF0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTU1JVF9MT0dfUkVQTEFZX0xJU1QuZ2V0S2V5KCksIGludmFsaWRGb3JtYXQyKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZvcm1hdCgiSW52YWxpZCBwYWlyOiAnJXMuJyIsIEtFWVNQQUNFMV9SRVBMQVkpLCBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVwbGF5TGlzdFByb3BlcnR5UmVwbGF5ZXIgZXh0ZW5kcyBDb21taXRMb2dSZXBsYXllcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZXBsYXlGaWx0ZXIgcmVwbGF5RmlsdGVyOworCisgICAgICAgIFJlcGxheUxpc3RQcm9wZXJ0eVJlcGxheWVyKENvbW1pdExvZyBjb21taXRMb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1pdExvZ1Bvc2l0aW9uIGdsb2JhbFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8VGFibGVJZCwgSW50ZXJ2YWxTZXQ8Q29tbWl0TG9nUG9zaXRpb24+PiBjZlBlcnNpc3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwbGF5RmlsdGVyIHJlcGxheUZpbHRlcikKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoY29tbWl0TG9nLCBnbG9iYWxQb3NpdGlvbiwgY2ZQZXJzaXN0ZWQsIHJlcGxheUZpbHRlcik7CisgICAgICAgICAgICB0aGlzLnJlcGxheUZpbHRlciA9IHJlcGxheUZpbHRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgY291bnQgPSAwOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNdXRhdGlvbihNdXRhdGlvbiBtLCBpbnQgc2l6ZSwgaW50IGVudHJ5TG9jYXRpb24sIENvbW1pdExvZ0Rlc2NyaXB0b3IgZGVzYykKKyAgICAgICAgeworICAgICAgICAgICAgY291bnQgKz0gSXRlcmFibGVzLnNpemUocmVwbGF5RmlsdGVyLmZpbHRlcihtKSk7CisgICAgICAgICAgICBzdXBlci5oYW5kbGVNdXRhdGlvbihtLCBzaXplLCBlbnRyeUxvY2F0aW9uLCBkZXNjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRSZXBsYXkoaW50IGV4cGVjdGVkUmVwbGF5ZWRNdXRhdGlvbnMsIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyBwcm9wZXJ0eSwgU3RyaW5nIHByb3BlcnR5VmFsdWUpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChwcm9wZXJ0eSwgcHJvcGVydHlWYWx1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbW1pdExvZy5pbnN0YW5jZS5yZXNldFVuc2FmZSh0cnVlKTsKKworICAgICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUga3MxdGIxID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRTFfUkVQTEFZKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShLRVlTUEFDRTFfUkVQTEFZX1RBQkxFMSk7CisgICAgICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBrczF0YjIgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMV9SRVBMQVkpLmdldENvbHVtbkZhbWlseVN0b3JlKEtFWVNQQUNFMV9SRVBMQVlfVEFCTEUyKTsKKyAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGtzMnRiMiA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UyX1JFUExBWSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoS0VZU1BBQ0UyX1JFUExBWV9UQUJMRTIpOworCisgICAgICAgICAgICBNdXRhdGlvbiBtdXRhdGlvbjEgPSBuZXcgUm93VXBkYXRlQnVpbGRlcihrczF0YjEubWV0YWRhdGEoKSwgMCwgImtleTEiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNsdXN0ZXJpbmcoImMxIikuYWRkKCJ2YWwiLCBCeXRlQnVmZmVyLmFsbG9jYXRlKDEwMCkpLmJ1aWxkKCk7CisKKyAgICAgICAgICAgIE11dGF0aW9uIG11dGF0aW9uMiA9IG5ldyBSb3dVcGRhdGVCdWlsZGVyKGtzMXRiMi5tZXRhZGF0YSgpLCAwLCAia2V5MiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2x1c3RlcmluZygiYzIiKS5hZGQoInZhbCIsIEJ5dGVCdWZmZXIuYWxsb2NhdGUoMTAwKSkuYnVpbGQoKTsKKworICAgICAgICAgICAgTXV0YXRpb24gbXV0YXRpb24zID0gbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoa3MydGIyLm1ldGFkYXRhKCksIDAsICJrZXkzIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jbHVzdGVyaW5nKCJjMyIpLmFkZCgidmFsIiwgQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxMDApKS5idWlsZCgpOworCisgICAgICAgICAgICBDb21taXRMb2cuaW5zdGFuY2UuYWRkKG11dGF0aW9uMSk7CisgICAgICAgICAgICBDb21taXRMb2cuaW5zdGFuY2UuYWRkKG11dGF0aW9uMik7CisgICAgICAgICAgICBDb21taXRMb2cuaW5zdGFuY2UuYWRkKG11dGF0aW9uMyk7CisgICAgICAgICAgICBDb21taXRMb2cuaW5zdGFuY2Uuc3luYyh0cnVlKTsKKworICAgICAgICAgICAgTWFwPFRhYmxlSWQsIEludGVydmFsU2V0PENvbW1pdExvZ1Bvc2l0aW9uPj4gY2ZQZXJzaXN0ZWQgPSBuZXcgSGFzaE1hcDxUYWJsZUlkLCBJbnRlcnZhbFNldDxDb21taXRMb2dQb3NpdGlvbj4+KCkKKyAgICAgICAgICAgIHt7CisgICAgICAgICAgICAgICAgcHV0KGtzMXRiMS5tZXRhZGF0YSgpLmlkLCBJbnRlcnZhbFNldC5lbXB0eSgpKTsKKyAgICAgICAgICAgICAgICBwdXQoa3MxdGIyLm1ldGFkYXRhKCkuaWQsIEludGVydmFsU2V0LmVtcHR5KCkpOworICAgICAgICAgICAgICAgIHB1dChrczJ0YjIubWV0YWRhdGEoKS5pZCwgSW50ZXJ2YWxTZXQuZW1wdHkoKSk7CisgICAgICAgICAgICB9fTsKKworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGFjdGl2ZVNlZ21lbnRzID0gQ29tbWl0TG9nLmluc3RhbmNlLmdldEFjdGl2ZVNlZ21lbnROYW1lcygpOworICAgICAgICAgICAgRmlsZVtdIGZpbGVzID0gbmV3IEZpbGUoQ29tbWl0TG9nLmluc3RhbmNlLnNlZ21lbnRNYW5hZ2VyLnN0b3JhZ2VEaXJlY3RvcnkpLnRyeUxpc3QoKGZpbGUsIG5hbWUpIC0+IGFjdGl2ZVNlZ21lbnRzLmNvbnRhaW5zKG5hbWUpKTsKKyAgICAgICAgICAgIFJlcGxheUxpc3RQcm9wZXJ0eVJlcGxheWVyIHJlcGxheWVyID0gbmV3IFJlcGxheUxpc3RQcm9wZXJ0eVJlcGxheWVyKENvbW1pdExvZy5pbnN0YW5jZSwgQ29tbWl0TG9nUG9zaXRpb24uTk9ORSwgY2ZQZXJzaXN0ZWQsIENvbW1pdExvZ1JlcGxheWVyLlJlcGxheUZpbHRlci5jcmVhdGUoKSk7CisgICAgICAgICAgICByZXBsYXllci5yZXBsYXlGaWxlcyhmaWxlcyk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJlcGxheWVkTXV0YXRpb25zLCByZXBsYXllci5jb3VudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHJlcGxheVdpdGhCYWRTeW5jTWFya2VyQ1JDKCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoU1RBTkRBUkQxKTsKQEAgLTg2Myw3ICsxMDA0LDcgQEAKICAgICB7CiAgICAgICAgIGludCBjZWxsQ291bnQgPSAwOwogICAgICAgICBpbnQgbWF4ID0gMTAyNDsKLSAgICAgICAgaW50IGRpc2NhcmRQb3NpdGlvbiA9IChpbnQpKG1heCAqIC44KTsgLy8gYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBlbnRyaWVzIHRoYXQgd2UnbGwgc2tpcCBvbiB0aGUgcmVwbGF5CisgICAgICAgIGludCBkaXNjYXJkUG9zaXRpb24gPSAoaW50KSAobWF4ICogLjgpOyAvLyBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGVudHJpZXMgdGhhdCB3ZSdsbCBza2lwIG9uIHRoZSByZXBsYXkKICAgICAgICAgQ29tbWl0TG9nUG9zaXRpb24gY29tbWl0TG9nUG9zaXRpb24gPSBudWxsOwogICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoU1RBTkRBUkQxKTsKIApAQCAtOTQ4LDEyICsxMDg5LDEyIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXREaXNrRmFpbHVyZVBvbGljeShEaXNrRmFpbHVyZVBvbGljeS5pZ25vcmUpOwogCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCA1IDsgaSsrKQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoY2ZzLm1ldGFkYXRhKCksIDAsICJrIikKLSAgICAgICAgICAgICAgICAgICAgLmNsdXN0ZXJpbmcoImMiICsgaSkuYWRkKCJ2YWwiLCBCeXRlQnVmZmVyLmFsbG9jYXRlKDEwMCkpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBseSgpOworICAgICAgICAgICAgICAgIC5jbHVzdGVyaW5nKCJjIiArIGkpLmFkZCgidmFsIiwgQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxMDApKQorICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICAgICAgICAgLmFwcGx5KCk7CiAKICAgICAgICAgICAgICAgICBpZiAoaSA9PSAyKQogICAgICAgICAgICAgICAgIHsKQEAgLTk3OCwyNiArMTExOSwyNyBAQAogICAgICAgICB9CiAKICAgICAgICAgQ29tbWl0TG9nLmluc3RhbmNlLnN5bmModHJ1ZSk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnJlcGxheUxpc3QiLCBLRVlTUEFDRTEgKyAiLiIgKyBTVEFOREFSRDEpOwotICAgICAgICAvLyBDdXJyZW50bHkgd2UgZG9uJ3QgYXR0ZW1wdCB0byByZS1mbHVzaCBhIG1lbXRhYmxlIHRoYXQgZmFpbGVkLCB0aHVzIG1ha2Ugc3VyZSBkYXRhIGlzIHJlcGxheWVkIGJ5IGNvbW1pdGxvZy4KLSAgICAgICAgLy8gSWYgcmV0cmllcyB3b3JrIHN1YnNlcXVlbnQgZmx1c2hlcyBzaG91bGQgY2xlYXIgdXAgZXJyb3IgYW5kIHRoaXMgc2hvdWxkIGNoYW5nZSB0byBleHBlY3QgMC4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENvbW1pdExvZy5pbnN0YW5jZS5yZXNldFVuc2FmZShmYWxzZSkpOwotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiY2Fzc2FuZHJhLnJlcGxheUxpc3QiKTsKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KENPTU1JVF9MT0dfUkVQTEFZX0xJU1QsIEtFWVNQQUNFMSArICcuJyArIFNUQU5EQVJEMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEN1cnJlbnRseSB3ZSBkb24ndCBhdHRlbXB0IHRvIHJlLWZsdXNoIGEgbWVtdGFibGUgdGhhdCBmYWlsZWQsIHRodXMgbWFrZSBzdXJlIGRhdGEgaXMgcmVwbGF5ZWQgYnkgY29tbWl0bG9nLgorICAgICAgICAgICAgLy8gSWYgcmV0cmllcyB3b3JrIHN1YnNlcXVlbnQgZmx1c2hlcyBzaG91bGQgY2xlYXIgdXAgZXJyb3IgYW5kIHRoaXMgc2hvdWxkIGNoYW5nZSB0byBleHBlY3QgMC4KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBDb21taXRMb2cuaW5zdGFuY2UucmVzZXRVbnNhZmUoZmFsc2UpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RPdXRPZk9yZGVyRmx1c2hSZWNvdmVyeShCaUNvbnN1bWVyPENvbHVtbkZhbWlseVN0b3JlLCBNZW10YWJsZT4gZmx1c2hBY3Rpb24sIGJvb2xlYW4gcGVyZm9ybUNvbXBhY3Rpb24pCi0gICAgICAgICAgICB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKyAgICB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIENvbW1pdExvZy5pbnN0YW5jZS5yZXNldFVuc2FmZSh0cnVlKTsKIAogICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoU1RBTkRBUkQxKTsKIAotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCA1IDsgaSsrKQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykKICAgICAgICAgewogICAgICAgICAgICAgbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoY2ZzLm1ldGFkYXRhKCksIDAsICJrIikKLSAgICAgICAgICAgICAgICAuY2x1c3RlcmluZygiYyIgKyBpKS5hZGQoInZhbCIsIEJ5dGVCdWZmZXIuYWxsb2NhdGUoMTAwKSkKLSAgICAgICAgICAgICAgICAuYnVpbGQoKQotICAgICAgICAgICAgICAgIC5hcHBseSgpOworICAgICAgICAgICAgLmNsdXN0ZXJpbmcoImMiICsgaSkuYWRkKCJ2YWwiLCBCeXRlQnVmZmVyLmFsbG9jYXRlKDEwMCkpCisgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICAgICAgLmFwcGx5KCk7CiAKICAgICAgICAgICAgIE1lbXRhYmxlIGN1cnJlbnQgPSBjZnMuZ2V0VHJhY2tlcigpLmdldFZpZXcoKS5nZXRDdXJyZW50TWVtdGFibGUoKTsKICAgICAgICAgICAgIGlmIChpID09IDIpCkBAIC0xMDEyLDcgKzExNTQsNyBAQAogICAgICAgICAgICAgcmVhZGVyLnJlbG9hZFNTVGFibGVNZXRhZGF0YSgpOwogCiAgICAgICAgIENvbW1pdExvZy5pbnN0YW5jZS5zeW5jKHRydWUpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5yZXBsYXlMaXN0IiwgS0VZU1BBQ0UxICsgIi4iICsgU1RBTkRBUkQxKTsKKyAgICAgICAgQ09NTUlUX0xPR19SRVBMQVlfTElTVC5zZXRTdHJpbmcoS0VZU1BBQ0UxICsgJy4nICsgU1RBTkRBUkQxKTsKICAgICAgICAgLy8gSW4gdGhlIGFic2VuY2Ugb2YgZXJyb3IsIHRoaXMgc2hvdWxkIGJlIDAgYmVjYXVzZSBmb3JjZUJsb2NraW5nRmx1c2gvZm9yY2VSZWN5Y2xlQWxsU2VnbWVudHMgd291bGQgaGF2ZQogICAgICAgICAvLyBwZXJzaXN0ZWQgYWxsIGRhdGEgaW4gdGhlIGNvbW1pdCBsb2cuIEJlY2F1c2Ugd2Uga25vdyB0aGVyZSB3YXMgYW4gZXJyb3IsIHRoZXJlIG11c3QgYmUgc29tZXRoaW5nIGxlZnQgdG8KICAgICAgICAgLy8gcmVwbGF5LgpAQCAtMTA4OSwxNiArMTIzMSwxMSBAQAogCiAgICAgICAgIGludCByZXBsYXllZCA9IDA7CiAKLSAgICAgICAgdHJ5CisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChDT01NSVRMT0dfSUdOT1JFX1JFUExBWV9FUlJPUlMsIHRydWUpKQogICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoQ29tbWl0TG9nUmVwbGF5ZXIuSUdOT1JFX1JFUExBWV9FUlJPUlNfUFJPUEVSVFksICJ0cnVlIik7CiAgICAgICAgICAgICByZXBsYXllZCA9IENvbW1pdExvZy5pbnN0YW5jZS5yZXNldFVuc2FmZShmYWxzZSk7CiAgICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eShDb21taXRMb2dSZXBsYXllci5JR05PUkVfUkVQTEFZX0VSUk9SU19QUk9QRVJUWSk7Ci0gICAgICAgIH0KLQorICAgICAgICAKICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlcGxheWVkLCAxKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9BYnN0cmFjdENvbXBhY3Rpb25TdHJhdGVneVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0Fic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5VGVzdC5qYXZhCmluZGV4IGJkNGIyOGYuLjFmYzQzYmQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0Fic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0Fic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5VGVzdC5qYXZhCkBAIC0xOSw4ICsxOSw2IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb247CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CkBAIC00NCwxNSArNDIsMTEgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0UxID0gIktleXNwYWNlMSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExDU19UQUJMRSA9ICJMQ1NfVEFCTEUiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVENTX1RBQkxFID0gIlNUQ1NfVEFCTEUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEVENTX1RBQkxFID0gIkRUQ1NfVEFCTEUiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUV0NTX1RBQkxFID0gIlRXQ1NfVEFCTEUiOwogCiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGxvYWREYXRhKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gc3Rjc09wdGlvbnMgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIHN0Y3NPcHRpb25zLnB1dCgidG9tYnN0b25lX2NvbXBhY3Rpb25faW50ZXJ2YWwiLCAiMSIpOwotCiAgICAgICAgIFNjaGVtYUxvYWRlci5wcmVwYXJlU2VydmVyKCk7CiAgICAgICAgIFNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZShLRVlTUEFDRTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCkBAIC02MCwxMyArNTQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb21wYWN0aW9uKENvbXBhY3Rpb25QYXJhbXMubGNzKENvbGxlY3Rpb25zLmVtcHR5TWFwKCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBTVENTX1RBQkxFKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhY3Rpb24oQ29tcGFjdGlvblBhcmFtcy5zdGNzKENvbGxlY3Rpb25zLmVtcHR5TWFwKCkpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBEVENTX1RBQkxFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhY3Rpb24oQ29tcGFjdGlvblBhcmFtcy5jcmVhdGUoRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneS5jbGFzcywgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIFRXQ1NfVEFCTEUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29tcGFjdGlvbihDb21wYWN0aW9uUGFyYW1zLmNyZWF0ZShUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzLCBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKSkpOwogICAgICAgICBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoTENTX1RBQkxFKS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKICAgICAgICAgS2V5c3BhY2Uub3BlbihLRVlTUEFDRTEpLmdldENvbHVtbkZhbWlseVN0b3JlKFNUQ1NfVEFCTEUpLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwotICAgICAgICBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoRFRDU19UQUJMRSkuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CiAgICAgICAgIEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UxKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShUV0NTX1RBQkxFKS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKICAgICB9CiAKQEAgLTc2LDcgKzY3LDYgQEAKIAogICAgICAgICBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoTENTX1RBQkxFKS50cnVuY2F0ZUJsb2NraW5nKCk7CiAgICAgICAgIEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UxKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShTVENTX1RBQkxFKS50cnVuY2F0ZUJsb2NraW5nKCk7Ci0gICAgICAgIEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UxKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShEVENTX1RBQkxFKS50cnVuY2F0ZUJsb2NraW5nKCk7CiAgICAgICAgIEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UxKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShUV0NTX1RBQkxFKS50cnVuY2F0ZUJsb2NraW5nKCk7CiAgICAgfQogCkBAIC05MywxMiArODMsNiBAQAogICAgIH0KIAogICAgIEBUZXN0KHRpbWVvdXQ9MzAwMDApCi0gICAgcHVibGljIHZvaWQgdGVzdEdldE5leHRCYWNrZ3JvdW5kVGFza0RvZXNOb3RCbG9ja0RUQ1MoKQotICAgIHsKLSAgICAgICAgdGVzdEdldE5leHRCYWNrZ3JvdW5kVGFza0RvZXNOb3RCbG9jayhEVENTX1RBQkxFKTsKLSAgICB9Ci0KLSAgICBAVGVzdCh0aW1lb3V0PTMwMDAwKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROZXh0QmFja2dyb3VuZFRhc2tEb2VzTm90QmxvY2tUV0NTKCkKICAgICB7CiAgICAgICAgIHRlc3RHZXROZXh0QmFja2dyb3VuZFRhc2tEb2VzTm90QmxvY2soVFdDU19UQUJMRSk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9BY3RpdmVDb21wYWN0aW9uc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0FjdGl2ZUNvbXBhY3Rpb25zVGVzdC5qYXZhCmluZGV4IDU2ZDZjNDAuLjc4NDk3OTYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0FjdGl2ZUNvbXBhY3Rpb25zVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0FjdGl2ZUNvbXBhY3Rpb25zVGVzdC5qYXZhCkBAIC00Niw4ICs0NiwxMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5JbmRleDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5TZWNvbmRhcnlJbmRleEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklTY3J1YmJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklWZXJpZmllcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuaW5kZXhzdW1tYXJ5LkluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2FjaGVTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwpAQCAtMTQzLDcgKzE0NSwxNSBAQAogICAgICAgICAgICAgTWFwPFRhYmxlSWQsIExpZmVjeWNsZVRyYW5zYWN0aW9uPiB0cmFuc2FjdGlvbnMgPSBJbW11dGFibGVNYXAuPFRhYmxlSWQsIExpZmVjeWNsZVRyYW5zYWN0aW9uPmJ1aWxkZXIoKS5wdXQoZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkubWV0YWRhdGEoKS5pZCwgdHhuKS5idWlsZCgpOwogICAgICAgICAgICAgSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24gaXNyID0gbmV3IEluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uKHRyYW5zYWN0aW9ucywgMCwgMTAwMCk7CiAgICAgICAgICAgICBNb2NrQWN0aXZlQ29tcGFjdGlvbnMgbW9ja0FjdGl2ZUNvbXBhY3Rpb25zID0gbmV3IE1vY2tBY3RpdmVDb21wYWN0aW9ucygpOwotICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UucnVuSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24oaXNyLCBtb2NrQWN0aXZlQ29tcGFjdGlvbnMpOworICAgICAgICAgICAgbW9ja0FjdGl2ZUNvbXBhY3Rpb25zLmJlZ2luQ29tcGFjdGlvbihpc3IpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaXNyLnJlZGlzdHJpYnV0ZVN1bW1hcmllcygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1vY2tBY3RpdmVDb21wYWN0aW9ucy5maW5pc2hDb21wYWN0aW9uKGlzcik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBhc3NlcnRUcnVlKG1vY2tBY3RpdmVDb21wYWN0aW9ucy5maW5pc2hlZCk7CiAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1vY2tBY3RpdmVDb21wYWN0aW9ucy5ob2xkZXIpOwogICAgICAgICAgICAgLy8gaW5kZXggcmVkaXN0cmlidXRpb24gb3BlcmF0ZXMgb3ZlciBhbGwga2V5c3BhY2VzL3RhYmxlcywgd2UgYWx3YXlzIGNhbmNlbCB0aGVtCkBAIC0xOTEsNyArMjAxLDcgQEAKICAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KHNzdGFibGUsIE9wZXJhdGlvblR5cGUuU0NSVUIpKQogICAgICAgICB7CiAgICAgICAgICAgICBNb2NrQWN0aXZlQ29tcGFjdGlvbnMgbW9ja0FjdGl2ZUNvbXBhY3Rpb25zID0gbmV3IE1vY2tBY3RpdmVDb21wYWN0aW9ucygpOwotICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2Uuc2NydWJPbmUoZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCksIHR4biwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBtb2NrQWN0aXZlQ29tcGFjdGlvbnMpOworICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2Uuc2NydWJPbmUoZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCksIHR4biwgSVNjcnViYmVyLm9wdGlvbnMoKS5za2lwQ29ycnVwdGVkKCkuYnVpbGQoKSwgbW9ja0FjdGl2ZUNvbXBhY3Rpb25zKTsKIAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtb2NrQWN0aXZlQ29tcGFjdGlvbnMuZmluaXNoZWQpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1vY2tBY3RpdmVDb21wYWN0aW9ucy5ob2xkZXIuZ2V0Q29tcGFjdGlvbkluZm8oKS5nZXRTU1RhYmxlcygpLCBTZXRzLm5ld0hhc2hTZXQoc3N0YWJsZSkpOwpAQCAtMjE0LDcgKzIyNCw3IEBACiAKICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gSXRlcmFibGVzLmdldEZpcnN0KGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLmdldExpdmVTU1RhYmxlcygpLCBudWxsKTsKICAgICAgICAgTW9ja0FjdGl2ZUNvbXBhY3Rpb25zIG1vY2tBY3RpdmVDb21wYWN0aW9ucyA9IG5ldyBNb2NrQWN0aXZlQ29tcGFjdGlvbnMoKTsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UudmVyaWZ5T25lKGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLCBzc3RhYmxlLCBuZXcgVmVyaWZpZXIuT3B0aW9ucy5CdWlsZGVyKCkuYnVpbGQoKSwgbW9ja0FjdGl2ZUNvbXBhY3Rpb25zKTsKKyAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UudmVyaWZ5T25lKGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLCBzc3RhYmxlLCBJVmVyaWZpZXIub3B0aW9ucygpLmJ1aWxkKCksIG1vY2tBY3RpdmVDb21wYWN0aW9ucyk7CiAgICAgICAgIGFzc2VydFRydWUobW9ja0FjdGl2ZUNvbXBhY3Rpb25zLmZpbmlzaGVkKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG1vY2tBY3RpdmVDb21wYWN0aW9ucy5ob2xkZXIuZ2V0Q29tcGFjdGlvbkluZm8oKS5nZXRTU1RhYmxlcygpLCBTZXRzLm5ld0hhc2hTZXQoc3N0YWJsZSkpOwogICAgICAgICBhc3NlcnRGYWxzZShtb2NrQWN0aXZlQ29tcGFjdGlvbnMuaG9sZGVyLmdldENvbXBhY3Rpb25JbmZvKCkuc2hvdWxkU3RvcCgocykgLT4gZmFsc2UpKTsKQEAgLTI0NSw0ICsyNTUsNCBAQAogICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NhbmNlbENvbXBhY3Rpb25zVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ2FuY2VsQ29tcGFjdGlvbnNUZXN0LmphdmEKaW5kZXggNjc0MjFiYS4uNTFkYTBjNCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ2FuY2VsQ29tcGFjdGlvbnNUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ2FuY2VsQ29tcGFjdGlvbnNUZXN0LmphdmEKQEAgLTg2LDE0ICs4NiwxNiBAQAogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFjdGl2ZUNvbXBhY3Rpb25zLnNpemUoKSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWN0aXZlQ29tcGFjdGlvbnMuZ2V0KDApLmdldENvbXBhY3Rpb25JbmZvKCkuZ2V0U1NUYWJsZXMoKSwgdG9NYXJrQ29tcGFjdGluZyk7CiAgICAgICAgICAgICAvLyBwcmVkaWNhdGUgcmVxdWlyZXMgdGhlIG5vbi1jb21wYWN0aW5nIHNzdGFibGVzLCBzaG91bGQgbm90IGNhbmNlbCB0aGUgb25lIGN1cnJlbnRseSBjb21wYWN0aW5nOgotICAgICAgICAgICAgY2ZzLnJ1bldpdGhDb21wYWN0aW9uc0Rpc2FibGVkKCgpIC0+IG51bGwsIChzc3RhYmxlKSAtPiAhdG9NYXJrQ29tcGFjdGluZy5jb250YWlucyhzc3RhYmxlKSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAgIGNmcy5ydW5XaXRoQ29tcGFjdGlvbnNEaXNhYmxlZCgoKSAtPiBudWxsLCAoc3N0YWJsZSkgLT4gIXRvTWFya0NvbXBhY3RpbmcuY29udGFpbnMoc3N0YWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uVHlwZS5QMCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhY3RpdmVDb21wYWN0aW9ucy5zaXplKCkpOwogICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYWN0aXZlQ29tcGFjdGlvbnMuZ2V0KDApLmlzU3RvcFJlcXVlc3RlZCgpKTsKIAogICAgICAgICAgICAgLy8gcHJlZGljYXRlIHJlcXVpcmVzIHRoZSBjb21wYWN0aW5nIG9uZXMgLSBtYWtlIHN1cmUgc3RvcCBpcyByZXF1ZXN0ZWQgYW5kIHRoYXQgd2hlbiB3ZSBhYm9ydCB0aGF0CiAgICAgICAgICAgICAvLyBjb21wYWN0aW9uIHdlIGFjdHVhbGx5IHJ1biB0aGUgY2FsbGFibGUgKGNvdW50ZG93biB0aGUgbGF0Y2gpCiAgICAgICAgICAgICBDb3VudERvd25MYXRjaCBjZGwgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7Ci0gICAgICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKCkgLT4gY2ZzLnJ1bldpdGhDb21wYWN0aW9uc0Rpc2FibGVkKCgpIC0+IHsgY2RsLmNvdW50RG93bigpOyByZXR1cm4gbnVsbDsgfSwgdG9NYXJrQ29tcGFjdGluZzo6Y29udGFpbnMsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOworICAgICAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCgpIC0+IGNmcy5ydW5XaXRoQ29tcGFjdGlvbnNEaXNhYmxlZCgoKSAtPiB7IGNkbC5jb3VudERvd24oKTsgcmV0dXJuIG51bGw7IH0sIHRvTWFya0NvbXBhY3Rpbmc6OmNvbnRhaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25UeXBlLlAwLCBmYWxzZSwgZmFsc2UsIHRydWUpKTsKICAgICAgICAgICAgIHQuc3RhcnQoKTsKICAgICAgICAgICAgIHdoaWxlICghYWN0aXZlQ29tcGFjdGlvbnMuZ2V0KDApLmlzU3RvcFJlcXVlc3RlZCgpKQogICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOwpAQCAtMTM5LDEzICsxNDEsMTYgQEAKICAgICAgICAgICAgIGV4cGVjdGVkU1NUYWJsZXMuYWRkKG5ldyBIYXNoU2V0PD4oc3N0YWJsZXMuc3ViTGlzdCg2LCA5KSkpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbXBhY3RpbmdTU1RhYmxlcywgZXhwZWN0ZWRTU1RhYmxlcyk7CiAKLSAgICAgICAgICAgIGNmcy5ydW5XaXRoQ29tcGFjdGlvbnNEaXNhYmxlZCgoKSAtPiBudWxsLCAoc3N0YWJsZSkgLT4gZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICBjZnMucnVuV2l0aENvbXBhY3Rpb25zRGlzYWJsZWQoKCkgLT4gbnVsbCwgKHNzdGFibGUpIC0+IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvblR5cGUuUDAsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgYWN0aXZlQ29tcGFjdGlvbnMuc2l6ZSgpKTsKICAgICAgICAgICAgIGFzc2VydFRydWUoYWN0aXZlQ29tcGFjdGlvbnMuc3RyZWFtKCkubm9uZU1hdGNoKENvbXBhY3Rpb25JbmZvLkhvbGRlcjo6aXNTdG9wUmVxdWVzdGVkKSk7CiAKICAgICAgICAgICAgIENvdW50RG93bkxhdGNoIGNkbCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKICAgICAgICAgICAgIC8vIHN0YXJ0IGEgY29tcGFjdGlvbiB3aGljaCBvbmx5IG5lZWRzIHRoZSBzc3RhYmxlcyB3aGVyZSBmaXJzdCB0b2tlbiBpcyA+IDUwIC0gdGhlc2UgYXJlIHRoZSBzc3RhYmxlcyBjb21wYWN0ZWQgYnkgdGN0cy5nZXQoMSkKLSAgICAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCgoKSAtPiBjZnMucnVuV2l0aENvbXBhY3Rpb25zRGlzYWJsZWQoKCkgLT4geyBjZGwuY291bnREb3duKCk7IHJldHVybiBudWxsOyB9LCAoc3N0YWJsZSkgLT4gZmlyc3Qoc3N0YWJsZSkgPiA1MCwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7CisgICAgICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKCkgLT4gY2ZzLnJ1bldpdGhDb21wYWN0aW9uc0Rpc2FibGVkKCgpIC0+IHsgY2RsLmNvdW50RG93bigpOyByZXR1cm4gbnVsbDsgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNzdGFibGUpIC0+IGZpcnN0KHNzdGFibGUpID4gNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvblR5cGUuUDAsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwogICAgICAgICAgICAgdC5zdGFydCgpOwogICAgICAgICAgICAgYWN0aXZlQ29tcGFjdGlvbnMgPSBnZXRBY3RpdmVDb21wYWN0aW9uc0ZvclRhYmxlKGNmcyk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgYWN0aXZlQ29tcGFjdGlvbnMuc2l6ZSgpKTsKQEAgLTMzMyw3ICszMzgsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGFzc2VydFRydWUoZm91bmRDb21wYWN0aW9uKTsKLSAgICAgICAgY2ZzLnJ1bldpdGhDb21wYWN0aW9uc0Rpc2FibGVkKCgpIC0+IHtjb21wYWN0aW9uc1N0b3BwZWQuY291bnREb3duKCk7IHJldHVybiBudWxsO30sIChzc3RhYmxlKSAtPiB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICAgICAgICBjZnMucnVuV2l0aENvbXBhY3Rpb25zRGlzYWJsZWQoKCkgLT4geyBjb21wYWN0aW9uc1N0b3BwZWQuY291bnREb3duKCk7IHJldHVybiBudWxsOyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNzdGFibGUpIC0+IHRydWUsIE9wZXJhdGlvblR5cGUuUDAsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBydW5XaXRoQ29tcGFjdGlvbnNEaXNhYmxlZCBjYWxsYWJsZQogICAgICAgICBjb21wYWN0aW9uc1N0b3BwZWQuYXdhaXQoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGdldEFjdGl2ZUNvbXBhY3Rpb25zRm9yVGFibGUoY2ZzKS5zaXplKCkpOwpAQCAtNDMwLDcgKzQzNiw4IEBACiAgICAgICAgIFNldDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBpZHguZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShpZHguZ2V0TGl2ZVNTVGFibGVzKCksIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTikpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLnJ1bldpdGhDb21wYWN0aW9uc0Rpc2FibGVkKCgpIC0+IHRydWUsIChzc3RhYmxlKSAtPiB7IHNzdGFibGVzLmFkZChzc3RhYmxlKTsgcmV0dXJuIHRydWU7fSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5ydW5XaXRoQ29tcGFjdGlvbnNEaXNhYmxlZCgoKSAtPiB0cnVlLCAoc3N0YWJsZSkgLT4geyBzc3RhYmxlcy5hZGQoc3N0YWJsZSk7IHJldHVybiB0cnVlO30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25UeXBlLlAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICAvLyB0aGUgcHJlZGljYXRlIG9ubHkgZ2V0cyBjb21wYWN0aW5nIHNzdGFibGVzLCBhbmQgd2UgYXJlIG9ubHkgY29tcGFjdGluZyB0aGUgMmkgc3N0YWJsZXMgLSB3aXRoIGludGVycnVwdEluZGV4ZXMgPSBmYWxzZSB3ZSBzaG91bGQgc2VlIG5vIHNzdGFibGVzIGhlcmUKICAgICAgICAgYXNzZXJ0VHJ1ZShzc3RhYmxlcy5pc0VtcHR5KCkpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbkNvbnRyb2xsZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uQ29udHJvbGxlclRlc3QuamF2YQppbmRleCA5ZDgxYjYxLi5jZTliMjhhIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uQ29udHJvbGxlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uQ29udHJvbGxlclRlc3QuamF2YQpAQCAtMjA0LDQgKzIwNCwzNyBAQAogICAgICAgICBhc3NlcnRGYWxzZShldmFsdWF0b3IudGVzdChib3VuZGFyeSkpOwogICAgICAgICBhc3NlcnRUcnVlKGV2YWx1YXRvci50ZXN0KGJvdW5kYXJ5IC0gMSkpOwogICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVOZXZlclB1cmdlVG9tYnN0b25lcygpCisgICAgeworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDRjIpOworICAgICAgICBjZnMudHJ1bmNhdGVCbG9ja2luZygpOworCisgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBVdGlsLmRrKCJrMSIpOworICAgICAgICBsb25nIHRpbWVzdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBhcHBseU11dGF0aW9uKGNmcy5tZXRhZGF0YSgpLCBrZXksIHRpbWVzdGFtcCk7CisgICAgICAgIGNmcy5mb3JjZUJsb2NraW5nRmx1c2goQ29sdW1uRmFtaWx5U3RvcmUuRmx1c2hSZWFzb24uVU5JVF9URVNUUyk7CisgICAgICAgIFNldDxTU1RhYmxlUmVhZGVyPiB0b0NvbXBhY3QgPSBTZXRzLm5ld0hhc2hTZXQoY2ZzLmdldExpdmVTU1RhYmxlcygpKTsKKyAgICAgICAgY2ZzLnNldE5ldmVyUHVyZ2VUb21ic3RvbmVzKHRydWUpOworICAgICAgICBhcHBseU11dGF0aW9uKGNmcy5tZXRhZGF0YSgpLCBrZXksIHRpbWVzdGFtcCArIDEpOworCisgICAgICAgIHRyeSAoQ29tcGFjdGlvbkNvbnRyb2xsZXIgY2MgPSBuZXcgQ29tcGFjdGlvbkNvbnRyb2xsZXIoY2ZzLCB0b0NvbXBhY3QsIChpbnQpKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLzEwMDApKSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoY2MuZ2V0UHVyZ2VFdmFsdWF0b3Ioa2V5KS50ZXN0KHRpbWVzdGFtcCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoY2MuZ2V0UHVyZ2VFdmFsdWF0b3Ioa2V5KS50ZXN0KHRpbWVzdGFtcCArIDEpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY2MuZ2V0RnVsbHlFeHBpcmVkU1NUYWJsZXMoKS5pc0VtcHR5KCkpOworCisgICAgICAgICAgICBjZnMuc2V0TmV2ZXJQdXJnZVRvbWJzdG9uZXMoZmFsc2UpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoY2MuZ2V0UHVyZ2VFdmFsdWF0b3Ioa2V5KS50ZXN0KHRpbWVzdGFtcCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoY2MuZ2V0UHVyZ2VFdmFsdWF0b3Ioa2V5KS50ZXN0KHRpbWVzdGFtcCArIDEpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY2MuZ2V0RnVsbHlFeHBpcmVkU1NUYWJsZXMoKS5pc0VtcHR5KCkpOworCisgICAgICAgICAgICBjYy5tYXliZVJlZnJlc2hPdmVybGFwcygpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjYy5nZXRQdXJnZUV2YWx1YXRvcihrZXkpLnRlc3QodGltZXN0YW1wKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShjYy5nZXRQdXJnZUV2YWx1YXRvcihrZXkpLnRlc3QodGltZXN0YW1wICsgMSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjYy5nZXRGdWxseUV4cGlyZWRTU1RhYmxlcygpLmlzRW1wdHkoKSk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uSXRlcmF0b3JUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uSXRlcmF0b3JUZXN0LmphdmEKaW5kZXggZmYzZjIxMC4uMzMwZTFjNSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbkl0ZXJhdG9yVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25JdGVyYXRvclRlc3QuamF2YQpAQCAtMTcsOSArMTcsMTAgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRElBR05PU1RJQ19TTkFQU0hPVF9JTlRFUlZBTF9OQU5PUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJhbnNmb3JtLkR1cGxpY2F0ZVJvd0NoZWNrZXJUZXN0LmFzc2VydENvbW1hbmRJc3N1ZWQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyYW5zZm9ybS5EdXBsaWNhdGVSb3dDaGVja2VyVGVzdC5tYWtlUm93OwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmFuc2Zvcm0uRHVwbGljYXRlUm93Q2hlY2tlclRlc3Qucm93czsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJhbnNmb3JtLkR1cGxpY2F0ZVJvd0NoZWNrZXJUZXN0LnBhcnRpdGlvbjsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwogCiBpbXBvcnQgamF2YS51dGlsLio7CkBAIC00NjAsNyArNDYxLDcgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIGR1cGxpY2F0ZVJvd3NUZXN0KCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuZGlhZ25vc3RpY19zbmFwc2hvdF9pbnRlcnZhbF9uYW5vcyIsICIwIik7CisgICAgICAgIERJQUdOT1NUSUNfU05BUFNIT1RfSU5URVJWQUxfTkFOT1Muc2V0TG9uZygwKTsKICAgICAgICAgLy8gQ3JlYXRlIGEgdGFibGUgYW5kIGluc2VydCBzb21lIGRhdGEuIFRoZSBhY3R1YWwgcm93cyByZWFkIGluIHRoZSB0ZXN0IHdpbGwgYmUgc3ludGhldGljCiAgICAgICAgIC8vIGJ1dCB0aGlzIGNyZWF0ZXMgYW4gc3N0YWJsZSBvbiBkaXNrIHRvIGJlIHNuYXBzaG90dGVkLgogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayB0ZXh0LCBjazEgaW50LCBjazIgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjazEsIGNrMikpIik7CkBAIC00OTQsNyArNDk1LDcgQEAKICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCk7CiAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBjZnMuZ2V0UGFydGl0aW9uZXIoKS5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5ieXRlcygia2V5IikpOwogICAgICAgICB0cnkgKENvbXBhY3Rpb25Db250cm9sbGVyIGNvbnRyb2xsZXIgPSBuZXcgQ29tcGFjdGlvbkNvbnRyb2xsZXIoY2ZzLCBJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0gICAgICAgICAgICAgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHJvd3MgPSByb3dzKGNmcy5tZXRhZGF0YSgpLCBrZXksIGZhbHNlLCB1bmZpbHRlcmVkcyk7CisgICAgICAgICAgICAgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHJvd3MgPSBwYXJ0aXRpb24oY2ZzLm1ldGFkYXRhKCksIGtleSwgZmFsc2UsIHVuZmlsdGVyZWRzKTsKICAgICAgICAgICAgICBJU1NUYWJsZVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBTY2FubmVyKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qocm93cykpOwogICAgICAgICAgICAgIENvbXBhY3Rpb25JdGVyYXRvciBpdGVyID0gbmV3IENvbXBhY3Rpb25JdGVyYXRvcihPcGVyYXRpb25UeXBlLkNPTVBBQ1RJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qoc2Nhbm5lciksCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyQm91bmRhcnlSZWxvYWRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyQm91bmRhcnlSZWxvYWRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzYjBkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXJCb3VuZGFyeVJlbG9hZFRlc3QuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb247CisKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlza0JvdW5kYXJpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5Ub2tlbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyQm91bmRhcnlSZWxvYWRUZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCit7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9SZWxvYWQoKQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoImNyZWF0ZSB0YWJsZSAlcyAoaWQgaW50IHByaW1hcnkga2V5KSIpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKTsKKyAgICAgICAgTGlzdDxMaXN0PEFic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5Pj4gc3RyYXRlZ2llcyA9IGNmcy5nZXRDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyKCkuZ2V0U3RyYXRlZ2llcygpOworICAgICAgICBEaXNrQm91bmRhcmllcyBkYiA9IGNmcy5nZXREaXNrQm91bmRhcmllcygpOworICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5nZXRUb2tlbk1ldGFkYXRhKCkuaW52YWxpZGF0ZUNhY2hlZFJpbmdzKCk7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgc3RyYXRlZ3kgaW5zdGFuY2VzIGFyZSB0aGUgc2FtZSAobm8gcmVsb2FkKQorICAgICAgICBhc3NlcnRUcnVlKGlzU2FtZShzdHJhdGVnaWVzLCBjZnMuZ2V0Q29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlcigpLmdldFN0cmF0ZWdpZXMoKSkpOworICAgICAgICAvLyBidXQgZGlzayBib3VuZGFyaWVzIGFyZSBub3QgLmVxdWFsIChyaW5nIHZlcnNpb24gY2hhbmdlZCkKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKGRiLCBjZnMuZ2V0RGlza0JvdW5kYXJpZXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoZGIuaXNFcXVpdmFsZW50VG8oY2ZzLmdldERpc2tCb3VuZGFyaWVzKCkpKTsKKworICAgICAgICBkYiA9IGNmcy5nZXREaXNrQm91bmRhcmllcygpOworICAgICAgICBhbHRlclRhYmxlKCJhbHRlciB0YWJsZSAlcyB3aXRoIGNvbW1lbnQgPSAnYWJjZCciKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpc1NhbWUoc3RyYXRlZ2llcywgY2ZzLmdldENvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIoKS5nZXRTdHJhdGVnaWVzKCkpKTsKKyAgICAgICAgLy8gZGlzayBib3VuZGFyaWVzIGRvbid0IGNoYW5nZSBiZWNhdXNlIG9mIGFsdGVyCisgICAgICAgIGFzc2VydEVxdWFscyhkYiwgY2ZzLmdldERpc2tCb3VuZGFyaWVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlbG9hZCgpIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoImNyZWF0ZSB0YWJsZSAlcyAoaWQgaW50IHByaW1hcnkga2V5KSIpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKTsKKyAgICAgICAgTGlzdDxMaXN0PEFic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5Pj4gc3RyYXRlZ2llcyA9IGNmcy5nZXRDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyKCkuZ2V0U3RyYXRlZ2llcygpOworICAgICAgICBEaXNrQm91bmRhcmllcyBkYiA9IGNmcy5nZXREaXNrQm91bmRhcmllcygpOworICAgICAgICBUb2tlbk1ldGFkYXRhIHRtZCA9IFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmdldFRva2VuTWV0YWRhdGEoKTsKKyAgICAgICAgdG1kLnVwZGF0ZU5vcm1hbFRva2VuKHRtZC5wYXJ0aXRpb25lci5nZXRNaW5pbXVtVG9rZW4oKSwgSW5ldEFkZHJlc3NBbmRQb3J0LmdldEJ5TmFtZSgiMTI3LjAuMC4xIikpOworICAgICAgICB0bWQudXBkYXRlTm9ybWFsVG9rZW4odG1kLnBhcnRpdGlvbmVyLmdldE1heGltdW1Ub2tlbigpLCBJbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlOYW1lKCIxMjcuMC4wLjIiKSk7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgc3RyYXRlZ3kgaW5zdGFuY2VzIGhhdmUgYmVlbiByZWxvYWRlZAorICAgICAgICBhc3NlcnRGYWxzZShpc1NhbWUoc3RyYXRlZ2llcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmcy5nZXRDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyKCkuZ2V0U3RyYXRlZ2llcygpKSk7CisgICAgICAgIGFzc2VydE5vdEVxdWFscyhkYiwgY2ZzLmdldERpc2tCb3VuZGFyaWVzKCkpOworICAgICAgICBkYiA9IGNmcy5nZXREaXNrQm91bmRhcmllcygpOworCisgICAgICAgIHN0cmF0ZWdpZXMgPSBjZnMuZ2V0Q29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlcigpLmdldFN0cmF0ZWdpZXMoKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiYWx0ZXIgdGFibGUgJXMgd2l0aCBjb21wYWN0aW9uID0geydjbGFzcyc6ICdTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5JywgJ2VuYWJsZWQnOiBmYWxzZX0iKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaXNTYW1lKHN0cmF0ZWdpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMuZ2V0Q29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlcigpLmdldFN0cmF0ZWdpZXMoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGIsIGNmcy5nZXREaXNrQm91bmRhcmllcygpKTsKKworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1NhbWUoTGlzdDxMaXN0PEFic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5Pj4gYSwgTGlzdDxMaXN0PEFic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5Pj4gYikKKyAgICB7CisgICAgICAgIGlmIChhLnNpemUoKSAhPSBiLnNpemUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLnNpemUoKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYS5nZXQoaSkuc2l6ZSgpICE9IGIuZ2V0KGkpLnNpemUoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGEuZ2V0KGkpLnNpemUoKTsgaisrKQorICAgICAgICAgICAgICAgIGlmIChhLmdldChpKS5nZXQoaikgIT0gYi5nZXQoaSkuZ2V0KGopKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXJUZXN0LmphdmEKaW5kZXggOTk2MGU4ZS4uOGE5ZjJmYiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyVGVzdC5qYXZhCkBAIC0yOCwxMSArMjgsMTQgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uRmlsZXM7CiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTM5NSw2ICszOTgsNDEgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvdW50c0J5QnVja2V0cygpCisgICAgeworICAgICAgICBBc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHMoCisgICAgICAgICAgICBuZXcgaW50W10gezIsIDIsIDR9LAorICAgICAgICAgICAgQ29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlci5zdW1Db3VudHNCeUJ1Y2tldChJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgICAgIEltbXV0YWJsZU1hcC5vZig2MDAwMEwsIDEsIDBMLCAyLCAxODAwMDBMLCAxKSwKKyAgICAgICAgICAgICAgICBJbW11dGFibGVNYXAub2YoNjAwMDBMLCAxLCAwTCwgMiwgMTgwMDAwTCwgMSkpLCBDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyLlRXQ1NfQlVDS0VUX0NPVU5UX01BWCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHMoCisgICAgICAgICAgICBuZXcgaW50W10gezEsIDEsIDN9LAorICAgICAgICAgICAgQ29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlci5zdW1Db3VudHNCeUJ1Y2tldChJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgICAgIEltbXV0YWJsZU1hcC5vZig2MDAwMEwsIDEsIDBMLCAxKSwKKyAgICAgICAgICAgICAgICBJbW11dGFibGVNYXAub2YoMEwsIDIsIDE4MDAwMEwsIDEpKSwgQ29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlci5UV0NTX0JVQ0tFVF9DT1VOVF9NQVgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzKAorICAgICAgICAgICAgbmV3IGludFtdIHsxLCAxfSwKKyAgICAgICAgICAgIENvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIuc3VtQ291bnRzQnlCdWNrZXQoSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgICAgICBJbW11dGFibGVNYXAub2YoNjAwMDBMLCAxLCAwTCwgMSksCisgICAgICAgICAgICAgICAgSW1tdXRhYmxlTWFwLm9mKCkpLCBDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyLlRXQ1NfQlVDS0VUX0NPVU5UX01BWCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHMoCisgICAgICAgICAgICBuZXcgaW50W10gezgsIDR9LAorICAgICAgICAgICAgQ29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlci5zdW1Db3VudHNCeUJ1Y2tldChJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgICAgIEltbXV0YWJsZU1hcC5vZig2MDAwMEwsIDIsIDBMLCAxLCAxODAwMDBMLCA0KSwKKyAgICAgICAgICAgICAgICBJbW11dGFibGVNYXAub2YoNjAwMDBMLCAyLCAwTCwgMSwgMTgwMDAwTCwgNCkpLCAyKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRBcnJheUVxdWFscygKKyAgICAgICAgICAgIG5ldyBpbnRbXSB7MSwgMSwgMn0sCisgICAgICAgICAgICBDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyLnN1bUNvdW50c0J5QnVja2V0KEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSwKKyAgICAgICAgICAgICAgICBJbW11dGFibGVNYXAub2YoNjAwMDBMLCAxLCAwTCwgMiwgMTgwMDAwTCwgMSkpLCBDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyLlRXQ1NfQlVDS0VUX0NPVU5UX01BWCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHMoCisgICAgICAgICAgICBuZXcgaW50W10ge30sCisgICAgICAgICAgICBDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyLnN1bUNvdW50c0J5QnVja2V0KEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSwKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKSwgQ29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlci5UV0NTX0JVQ0tFVF9DT1VOVF9NQVgpKTsKKyAgICB9CisKICAgICBwcml2YXRlIE1vY2tDRlMgY3JlYXRlSkJPRE1vY2tDRlMoaW50IGRpc2tzKQogICAgIHsKICAgICAgICAgLy8gQ3JlYXRlICNkaXNrcyBkYXRhIGRpcmVjdG9yaWVzIHRvIHNpbXVsYXRlIEpCT0QKQEAgLTQ2NCw4ICs1MDIsNiBAQAogICAgICAgICByZXR1cm4gaW5kZXg7CiAgICAgfQogCi0KLQogICAgIGNsYXNzIE1vY2tCb3VuZGFyeU1hbmFnZXIKICAgICB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvblRhc2tUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uVGFza1Rlc3QuamF2YQppbmRleCAyNGIwYzNkLi5jYTc1NDUzIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uVGFza1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uVGFza1Rlc3QuamF2YQpAQCAtMTkxLDQgKzE5MSwxMiBAQAogICAgICAgICAgICAgY2ZzLmdldFRyYWNrZXIoKS5yZW1vdmVVbnNhZmUoc3N0YWJsZXMpOwogICAgICAgICB9CiAgICAgfQorICAgIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1ham9yQ29tcGFjdFRhc2soKQorICAgIHsKKyAgICAgICAgLy9tYWpvciBjb21wYWN0IHdpdGhvdXQgcmFuZ2UvcGsgc3BlY2lmaWVkIAorICAgICAgICBDb21wYWN0aW9uVGFza3MgY29tcGFjdGlvblRhc2tzID0gY2ZzLmdldENvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIoKS5nZXRNYXhpbWFsVGFza3MoSW50ZWdlci5NQVhfVkFMVUUsIGZhbHNlLCBPcGVyYXRpb25UeXBlLk1BSk9SX0NPTVBBQ1RJT04pOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjb21wYWN0aW9uVGFza3Muc3RyZWFtKCkuYWxsTWF0Y2godGFzayAtPiB0YXNrLmNvbXBhY3Rpb25UeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLk1BSk9SX0NPTVBBQ1RJT04pKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbnNCeXRlbWFuVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbnNCeXRlbWFuVGVzdC5qYXZhCmluZGV4IDQ2MmQ0MDYuLjk4N2NlMTggMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25zQnl0ZW1hblRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uc0J5dGVtYW5UZXN0LmphdmEKQEAgLTU1LDcgKzU1LDcgQEAKICAgICBAVGVzdAogICAgIEBCTVJ1bGVzKHJ1bGVzID0geyBAQk1SdWxlKG5hbWUgPSAiT25lIFNTVGFibGUgdG9vIGJpZyBmb3IgcmVtYWluaW5nIGRpc2sgc3BhY2UgdGVzdCIsCiAgICAgdGFyZ2V0Q2xhc3MgPSAiRGlyZWN0b3JpZXMiLAotICAgIHRhcmdldE1ldGhvZCA9ICJoYXNBdmFpbGFibGVEaXNrU3BhY2UiLAorICAgIHRhcmdldE1ldGhvZCA9ICJoYXNEaXNrU3BhY2VGb3JDb21wYWN0aW9uc0FuZFN0cmVhbXMiLAogICAgIGNvbmRpdGlvbiA9ICJub3QgZmxhZ2dlZChcImRvbmVcIikiLAogICAgIGFjdGlvbiA9ICJmbGFnKFwiZG9uZVwiKTsgcmV0dXJuIGZhbHNlOyIpIH0gKQogICAgIHB1YmxpYyB2b2lkIHRlc3RTU1RhYmxlTm90RW5vdWdoRGlza1NwYWNlRm9yQ29tcGFjdGlvbkdldHNEcm9wcGVkKCkgdGhyb3dzIFRocm93YWJsZQpAQCAtODAsNyArODAsNyBAQAogICAgIEBUZXN0CiAgICAgQEJNUnVsZXMocnVsZXMgPSB7IEBCTVJ1bGUobmFtZSA9ICJObyBkaXNrIHNwYWNlIHdpdGggZXhwaXJlZCBTU1RhYmxlcyB0ZXN0IiwKICAgICB0YXJnZXRDbGFzcyA9ICJEaXJlY3RvcmllcyIsCi0gICAgdGFyZ2V0TWV0aG9kID0gImhhc0F2YWlsYWJsZURpc2tTcGFjZSIsCisgICAgdGFyZ2V0TWV0aG9kID0gImhhc0Rpc2tTcGFjZUZvckNvbXBhY3Rpb25zQW5kU3RyZWFtcyIsCiAgICAgYWN0aW9uID0gInJldHVybiBmYWxzZTsiKSB9ICkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwaXJlZFNTVGFibGVzU3RpbGxHZXREcm9wcGVkV2l0aE5vRGlza1NwYWNlKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKQEAgLTEwMyw3ICsxMDMsNyBAQAogICAgIEBUZXN0KGV4cGVjdGVkID0gUnVudGltZUV4Y2VwdGlvbi5jbGFzcykKICAgICBAQk1SdWxlcyhydWxlcyA9IHsgQEJNUnVsZShuYW1lID0gIk5vIGRpc2sgc3BhY2Ugd2l0aCBleHBpcmVkIFNTVGFibGVzIHRlc3QiLAogICAgIHRhcmdldENsYXNzID0gIkRpcmVjdG9yaWVzIiwKLSAgICB0YXJnZXRNZXRob2QgPSAiaGFzQXZhaWxhYmxlRGlza1NwYWNlIiwKKyAgICB0YXJnZXRNZXRob2QgPSAiaGFzRGlza1NwYWNlRm9yQ29tcGFjdGlvbnNBbmRTdHJlYW1zIiwKICAgICBhY3Rpb24gPSAicmV0dXJuIGZhbHNlOyIpIH0gKQogICAgIHB1YmxpYyB2b2lkIHRlc3RSdW50aW1lRXhjZXB0aW9uV2hlbk5vRGlza1NwYWNlRm9yQ29tcGFjdGlvbigpIHRocm93cyBUaHJvd2FibGUKICAgICB7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uc0NRTFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25zQ1FMVGVzdC5qYXZhCmluZGV4IDY1ZWVhNmEuLjVhZWYxNDQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25zQ1FMVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25zQ1FMVGVzdC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlU3RvcmU7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC01NSw5ICs1NiwxMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29ycnVwdFNTVGFibGVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU1NUYWJsZVNjYW5uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5QYXRoVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29tcGFjdGlvblBhcmFtczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwpAQCAtMTA4LDE5ICsxMTIsNiBAQAogICAgICAgICB3YWl0Rm9yTWlub3IoS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCBTTEVFUF9USU1FLCB0cnVlKTsKICAgICB9CiAKLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFRyaWdnZXJNaW5vckNvbXBhY3Rpb25EVENTKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoaWQgdGV4dCBQUklNQVJZIEtFWSkgV0lUSCBjb21wYWN0aW9uID0geydjbGFzcyc6J0RhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3knLCAnbWluX3RocmVzaG9sZCc6Mn07Iik7Ci0gICAgICAgIGFzc2VydFRydWUoZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkuZ2V0Q29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlcigpLmlzRW5hYmxlZCgpKTsKLSAgICAgICAgZXhlY3V0ZSgiaW5zZXJ0IGludG8gJXMgKGlkKSB2YWx1ZXMgKCcxJykgdXNpbmcgdGltZXN0YW1wIDEwMDAiKTsgLy8gc2FtZSB0aW1lc3RhbXAgPSBzYW1lIHdpbmRvdyA9IG1pbm9yIGNvbXBhY3Rpb24gdHJpZ2dlcmVkCi0gICAgICAgIGZsdXNoKCk7Ci0gICAgICAgIGV4ZWN1dGUoImluc2VydCBpbnRvICVzIChpZCkgdmFsdWVzICgnMScpIHVzaW5nIHRpbWVzdGFtcCAxMDAwIik7Ci0gICAgICAgIGZsdXNoKCk7Ci0gICAgICAgIHdhaXRGb3JNaW5vcihLRVlTUEFDRSwgY3VycmVudFRhYmxlKCksIFNMRUVQX1RJTUUsIHRydWUpOwotICAgIH0KLQogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFRyaWdnZXJNaW5vckNvbXBhY3Rpb25UV0NTKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKQEAgLTIxMywyMSArMjA0LDIxIEBACiAgICAgewogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChpZCB0ZXh0IFBSSU1BUlkgS0VZKSIpOwogICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGxvY2FsT3B0aW9ucyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgbG9jYWxPcHRpb25zLnB1dCgiY2xhc3MiLCAiRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSIpOworICAgICAgICBsb2NhbE9wdGlvbnMucHV0KCJjbGFzcyIsICJTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5Iik7CiAgICAgICAgIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLnNldENvbXBhY3Rpb25QYXJhbWV0ZXJzKGxvY2FsT3B0aW9ucyk7Ci0gICAgICAgIGFzc2VydFRydWUodmVyaWZ5U3RyYXRlZ2llcyhnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5nZXRDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyKCksIERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh2ZXJpZnlTdHJhdGVnaWVzKGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLmdldENvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIoKSwgU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneS5jbGFzcykpOwogICAgICAgICAvLyBJbnZhbGlkYXRlIGRpc2sgYm91bmRhcmllcyB0byBlbnN1cmUgdGhhdCBib3VuZGFyeSBpbnZhbGlkYXRpb24gd2lsbCBub3QgY2F1c2UgdGhlIG9sZCBzdHJhdGVneSB0byBiZSByZWxvYWRlZAogICAgICAgICBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5pbnZhbGlkYXRlTG9jYWxSYW5nZXMoKTsKICAgICAgICAgLy8gYWx0ZXJpbmcgc29tZXRoaW5nIG5vbi1jb21wYWN0aW9uIHJlbGF0ZWQKICAgICAgICAgZXhlY3V0ZSgiQUxURVIgVEFCTEUgJXMgV0lUSCBnY19ncmFjZV9zZWNvbmRzID0gMTAwMCIpOwogICAgICAgICAvLyBzaG91bGQga2VlcCB0aGUgbG9jYWwgY29tcGFjdGlvbiBzdHJhdAotICAgICAgICBhc3NlcnRUcnVlKHZlcmlmeVN0cmF0ZWdpZXMoZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkuZ2V0Q29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlcigpLCBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUodmVyaWZ5U3RyYXRlZ2llcyhnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5nZXRDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyKCksIFNpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kuY2xhc3MpKTsKICAgICAgICAgLy8gQWx0ZXIga2V5c3BhY2UgcmVwbGljYXRpb24gc2V0dGluZ3MgdG8gZm9yY2UgY29tcGFjdGlvbiBzdHJhdGVneSByZWxvYWQKICAgICAgICAgZXhlY3V0ZSgiYWx0ZXIga2V5c3BhY2UgIitrZXlzcGFjZSgpKyIgd2l0aCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InIDogMyB9Iik7CiAgICAgICAgIC8vIHNob3VsZCBrZWVwIHRoZSBsb2NhbCBjb21wYWN0aW9uIHN0cmF0Ci0gICAgICAgIGFzc2VydFRydWUodmVyaWZ5U3RyYXRlZ2llcyhnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5nZXRDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyKCksIERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh2ZXJpZnlTdHJhdGVnaWVzKGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLmdldENvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIoKSwgU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneS5jbGFzcykpOwogICAgICAgICAvLyBhbHRlcmluZyBhIGNvbXBhY3Rpb24gb3B0aW9uCi0gICAgICAgIGV4ZWN1dGUoIkFMVEVSIFRBQkxFICVzIFdJVEggY29tcGFjdGlvbiA9IHsnY2xhc3MnOidTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5JywgJ21pbl90aHJlc2hvbGQnOjN9Iik7CisgICAgICAgIGV4ZWN1dGUoIkFMVEVSIFRBQkxFICVzIFdJVEggY29tcGFjdGlvbiA9IHsnY2xhc3MnOidTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5JywgJ21pbl90aHJlc2hvbGQnOiAzfSIpOwogICAgICAgICAvLyB3aWxsIHVzZSB0aGUgbmV3IG9wdGlvbgogICAgICAgICBhc3NlcnRUcnVlKHZlcmlmeVN0cmF0ZWdpZXMoZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkuZ2V0Q29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlcigpLCBTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzKSk7CiAgICAgfQpAQCAtMjM3LDI0ICsyMjgsMjMgQEAKICAgICB7CiAgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGlkIHRleHQgUFJJTUFSWSBLRVkpIik7CiAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbG9jYWxPcHRpb25zID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBsb2NhbE9wdGlvbnMucHV0KCJjbGFzcyIsICJEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5Iik7CisgICAgICAgIGxvY2FsT3B0aW9ucy5wdXQoImNsYXNzIiwgIlNpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kiKTsKICAgICAgICAgbG9jYWxPcHRpb25zLnB1dCgiZW5hYmxlZCIsICJmYWxzZSIpOwogICAgICAgICBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5zZXRDb21wYWN0aW9uUGFyYW1ldGVycyhsb2NhbE9wdGlvbnMpOwogICAgICAgICBhc3NlcnRGYWxzZShnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5nZXRDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyKCkuaXNFbmFibGVkKCkpOwogICAgICAgICBsb2NhbE9wdGlvbnMuY2xlYXIoKTsKLSAgICAgICAgbG9jYWxPcHRpb25zLnB1dCgiY2xhc3MiLCAiRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSIpOworICAgICAgICBsb2NhbE9wdGlvbnMucHV0KCJjbGFzcyIsICJTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5Iik7CiAgICAgICAgIC8vIGxvY2FsT3B0aW9ucy5wdXQoImVuYWJsZWQiLCAidHJ1ZSIpOyAtIHRoaXMgaXMgZGVmYXVsdCEKICAgICAgICAgZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkuc2V0Q29tcGFjdGlvblBhcmFtZXRlcnMobG9jYWxPcHRpb25zKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5nZXRDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyKCkuaXNFbmFibGVkKCkpOwogICAgIH0KIAotCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TG9jYWxDb21wYWN0aW9uU3RyYXRlZ3lFbmFibGUoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChpZCB0ZXh0IFBSSU1BUlkgS0VZKSIpOwogICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGxvY2FsT3B0aW9ucyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgbG9jYWxPcHRpb25zLnB1dCgiY2xhc3MiLCAiRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSIpOworICAgICAgICBsb2NhbE9wdGlvbnMucHV0KCJjbGFzcyIsICJMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5Iik7CiAKICAgICAgICAgZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CiAgICAgICAgIGFzc2VydEZhbHNlKGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLmdldENvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIoKS5pc0VuYWJsZWQoKSk7CkBAIC0yNjMsOCArMjUzLDYgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5nZXRDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyKCkuaXNFbmFibGVkKCkpOwogICAgIH0KIAotCi0KICAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkTG9jYWxDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zKCkKICAgICB7CkBAIC0zNTgsMTMgKzM0NiwxMyBAQAogICAgICAgICAvLyB3cml0ZSBlbm91Z2ggZGF0YSB0byBtYWtlIHN1cmUgd2UgdXNlIGFuIEluZGV4ZWRSZWFkZXIgd2hlbiBkb2luZyBhIHJlYWQsIGFuZCBtYWtlIHN1cmUgaXQgZmFpbHMgd2hlbiByZWFkaW5nIGEgY29ycnVwdCByb3cgZGVsZXRpb24KICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvcnJ1cHRlZFRvbWJzdG9uZVN0cmF0ZWd5KENvbmZpZy5Db3JydXB0ZWRUb21ic3RvbmVTdHJhdGVneS5leGNlcHRpb24pOwogICAgICAgICBpbnQgbWF4U2l6ZVByZSA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRDb2x1bW5JbmRleFNpemVJbktpQigpOwotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhTaXplKDEwMjQpOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoMTAyNCk7CiAgICAgICAgIHByZXBhcmVXaWRlKCk7CiAgICAgICAgIFJvd1VwZGF0ZUJ1aWxkZXIuZGVsZXRlUm93QXQoZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkubWV0YWRhdGEoKSwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKiAxMDAwLCAtMSwgMjIsIDMzKS5hcHBseSgpOwogICAgICAgICBmbHVzaCgpOwogICAgICAgICByZWFkQW5kVmFsaWRhdGUodHJ1ZSk7CiAgICAgICAgIHJlYWRBbmRWYWxpZGF0ZShmYWxzZSk7Ci0gICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleFNpemUobWF4U2l6ZVByZSk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleFNpemVJbktpQihtYXhTaXplUHJlKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMzczLDE0ICszNjEsMTQgQEAKICAgICAgICAgLy8gd3JpdGUgZW5vdWdoIGRhdGEgdG8gbWFrZSBzdXJlIHdlIHVzZSBhbiBJbmRleGVkUmVhZGVyIHdoZW4gZG9pbmcgYSByZWFkLCBhbmQgbWFrZSBzdXJlIGl0IGZhaWxzIHdoZW4gcmVhZGluZyBhIGNvcnJ1cHQgc3RhbmRhcmQgdG9tYnN0b25lCiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb3JydXB0ZWRUb21ic3RvbmVTdHJhdGVneShDb25maWcuQ29ycnVwdGVkVG9tYnN0b25lU3RyYXRlZ3kuZXhjZXB0aW9uKTsKICAgICAgICAgaW50IG1heFNpemVQcmUgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoKTsKLSAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4U2l6ZSgxMDI0KTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4U2l6ZUluS2lCKDEwMjQpOwogICAgICAgICBwcmVwYXJlV2lkZSgpOwogICAgICAgICBSb3dVcGRhdGVCdWlsZGVyIHJ1YiA9IG5ldyBSb3dVcGRhdGVCdWlsZGVyKGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLm1ldGFkYXRhKCksIC0xLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAqIDEwMDAsIDIyKS5jbHVzdGVyaW5nKDMzKS5kZWxldGUoImIiKTsKICAgICAgICAgcnViLmJ1aWxkKCkuYXBwbHkoKTsKICAgICAgICAgZmx1c2goKTsKICAgICAgICAgcmVhZEFuZFZhbGlkYXRlKHRydWUpOwogICAgICAgICByZWFkQW5kVmFsaWRhdGUoZmFsc2UpOwotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhTaXplKG1heFNpemVQcmUpOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhTaXplSW5LaUIobWF4U2l6ZVByZSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTM4OSw3ICszNzcsNyBAQAogICAgICAgICAvLyB3cml0ZSBlbm91Z2ggZGF0YSB0byBtYWtlIHN1cmUgd2UgdXNlIGFuIEluZGV4ZWRSZWFkZXIgd2hlbiBkb2luZyBhIHJlYWQsIGFuZCBtYWtlIHN1cmUgaXQgZmFpbHMgd2hlbiByZWFkaW5nIGEgY29ycnVwdCByYW5nZSB0b21ic3RvbmUKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvcnJ1cHRlZFRvbWJzdG9uZVN0cmF0ZWd5KENvbmZpZy5Db3JydXB0ZWRUb21ic3RvbmVTdHJhdGVneS5leGNlcHRpb24pOwogICAgICAgICBmaW5hbCBpbnQgbWF4U2l6ZVByZUtpQiA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRDb2x1bW5JbmRleFNpemVJbktpQigpOwotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhTaXplKDEwMjQpOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoMTAyNCk7CiAgICAgICAgIHByZXBhcmVXaWRlKCk7CiAgICAgICAgIFJhbmdlVG9tYnN0b25lIHJ0ID0gbmV3IFJhbmdlVG9tYnN0b25lKFNsaWNlLkFMTCwgbmV3IERlbGV0aW9uVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwgLTEpKTsKICAgICAgICAgUm93VXBkYXRlQnVpbGRlciBydWIgPSBuZXcgUm93VXBkYXRlQnVpbGRlcihnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5tZXRhZGF0YSgpLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAqIDEwMDAsIDIyKS5jbHVzdGVyaW5nKDMzKS5hZGRSYW5nZVRvbWJzdG9uZShydCk7CkBAIC0zOTcsNyArMzg1LDcgQEAKICAgICAgICAgZmx1c2goKTsKICAgICAgICAgcmVhZEFuZFZhbGlkYXRlKHRydWUpOwogICAgICAgICByZWFkQW5kVmFsaWRhdGUoZmFsc2UpOwotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhTaXplKG1heFNpemVQcmVLaUIpOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhTaXplSW5LaUIobWF4U2l6ZVByZUtpQik7CiAgICAgfQogCiAKQEAgLTc3MCw0ICs3NTgsNjggQEAKICAgICAgICAgaWYgKHNob3VsZEZpbmQpCiAgICAgICAgICAgICBmYWlsKCJObyBtaW5vciBjb21wYWN0aW9uIHRyaWdnZXJlZCBpbiAiK21heFdhaXRUaW1lKyJtcyIpOwogICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vRGlza3NwYWNlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoImNyZWF0ZSB0YWJsZSAlcyAoaWQgaW50IHByaW1hcnkga2V5LCBpIGludCkgd2l0aCBjb21wYWN0aW9uPXsnY2xhc3MnOidTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5J30iKTsKKyAgICAgICAgZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZXhlY3V0ZSgiaW5zZXJ0IGludG8gJXMgKGlkLCBpKSB2YWx1ZXMgKD8sPykiLCBpLCBpKTsKKyAgICAgICAgICAgIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLmZvcmNlQmxvY2tpbmdGbHVzaChDb2x1bW5GYW1pbHlTdG9yZS5GbHVzaFJlYXNvbi5VTklUX1RFU1RTKTsKKyAgICAgICAgfQorICAgICAgICBDb21wYWN0aW9uSW5mby5Ib2xkZXIgaG9sZGVyID0gaG9sZGVyKE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTik7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmFjdGl2ZS5iZWdpbkNvbXBhY3Rpb24oaG9sZGVyKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLmZvcmNlTWFqb3JDb21wYWN0aW9uKCk7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuZmluaXNoQ29tcGFjdGlvbihob2xkZXIpOworICAgICAgICB9CisgICAgICAgIC8vIGRvbid0IGJsb2NrIGNvbXBhY3Rpb25zIGlmIHRoZXJlIGlzIGEgaHVnZSB2YWxpZGF0aW9uCisgICAgICAgIGhvbGRlciA9IGhvbGRlcihPcGVyYXRpb25UeXBlLlZBTElEQVRJT04pOworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuYmVnaW5Db21wYWN0aW9uKGhvbGRlcik7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5mb3JjZU1ham9yQ29tcGFjdGlvbigpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmZpbmlzaENvbXBhY3Rpb24oaG9sZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQ29tcGFjdGlvbkluZm8uSG9sZGVyIGhvbGRlcihPcGVyYXRpb25UeXBlIG9wVHlwZSkKKyAgICB7CisgICAgICAgIENvbXBhY3Rpb25JbmZvLkhvbGRlciBob2xkZXIgPSBuZXcgQ29tcGFjdGlvbkluZm8uSG9sZGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIENvbXBhY3Rpb25JbmZvIGdldENvbXBhY3Rpb25JbmZvKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIGF2YWlsYWJsZVNwYWNlID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKEZpbGUgZiA6IGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLmdldERpcmVjdG9yaWVzKCkuZ2V0Q0ZEaXJlY3RvcmllcygpKQorICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVTcGFjZSArPSBQYXRoVXRpbHMudHJ5R2V0U3BhY2UoZi50b1BhdGgoKSwgRmlsZVN0b3JlOjpnZXRVc2FibGVTcGFjZSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25JbmZvKGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLm1ldGFkYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICthdmFpbGFibGVTcGFjZSAqIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0VGltZVVVSUQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLmdldExpdmVTU1RhYmxlcygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgcmV0dXJuIGhvbGRlcjsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25zVGVzdC5qYXZhCmluZGV4IGZjZjVjNTEuLjNjMDIxNTQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25zVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25zVGVzdC5qYXZhCkBAIC0zMSw2ICszMSw3IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ29sdW1uSWRlbnRpZmllcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwpAQCAtNjEsMTMgKzYyLDEyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU1NUYWJsZVNjYW5uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlSWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlSWRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuU3RhdHNNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbXBhY3Rpb25QYXJhbXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFUZXN0VXRpbDsKQEAgLTk1LDcgKzk1LDcgQEAKICAgICAgICAgY29tcGFjdGlvbk9wdGlvbnMucHV0KCJ0b21ic3RvbmVfY29tcGFjdGlvbl9pbnRlcnZhbCIsICIxIik7CiAKICAgICAgICAgLy8gRGlzYWJsZSB0b21ic3RvbmUgaGlzdG9ncmFtIHJvdW5kaW5nIGZvciB0ZXN0cwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5zdHJlYW1pbmdoaXN0b2dyYW0ucm91bmRzZWNvbmRzIiwgIjEiKTsKKyAgICAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlNUUkVBTUlOR19ISVNUT0dSQU1fUk9VTkRfU0VDT05EUy5zZXRJbnQoMSk7CiAKICAgICAgICAgU2NoZW1hTG9hZGVyLnByZXBhcmVTZXJ2ZXIoKTsKIApAQCAtMTEwLDExICsxMTAsMTYgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBwb3B1bGF0ZShTdHJpbmcga3MsIFN0cmluZyBjZiwgaW50IHN0YXJ0Um93S2V5LCBpbnQgZW5kUm93S2V5LCBpbnQgdHRsKQogICAgIHsKKyAgICAgICAgcmV0dXJuIHBvcHVsYXRlKGtzLCBjZiwgc3RhcnRSb3dLZXksIGVuZFJvd0tleSwgIiIsIHR0bCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBsb25nIHBvcHVsYXRlKFN0cmluZyBrcywgU3RyaW5nIGNmLCBpbnQgc3RhcnRSb3dLZXksIGludCBlbmRSb3dLZXksIFN0cmluZyBzdWZmaXgsIGludCB0dGwpCisgICAgewogICAgICAgICBsb25nIHRpbWVzdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICBUYWJsZU1ldGFkYXRhIGNmbSA9IEtleXNwYWNlLm9wZW4oa3MpLmdldENvbHVtbkZhbWlseVN0b3JlKGNmKS5tZXRhZGF0YSgpOwogICAgICAgICBmb3IgKGludCBpID0gc3RhcnRSb3dLZXk7IGkgPD0gZW5kUm93S2V5OyBpKyspCiAgICAgICAgIHsKLSAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBVdGlsLmRrKEludGVnZXIudG9TdHJpbmcoaSkpOworICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IFV0aWwuZGsoSW50ZWdlci50b1N0cmluZyhpKSArIHN1ZmZpeCk7CiAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoY2ZtLCB0aW1lc3RhbXAsIGogPiAwID8gdHRsIDogMCwga2V5LmdldEtleSgpKQpAQCAtMTgxLDEyICsxODYsMTIgQEAKICAgICAgICAgLy8gZGlzYWJsZSBjb21wYWN0aW9uIHdoaWxlIGZsdXNoaW5nCiAgICAgICAgIHN0b3JlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwogCi0gICAgICAgIC8vUG9wdWxhdGUgc3N0YWJsZTEgd2l0aCB3aXRoIGtleXMgWzAuLjldCi0gICAgICAgIHBvcHVsYXRlKEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkQxLCAwLCA5LCAzKTsgLy90dGw9M3MKKyAgICAgICAgLy9Qb3B1bGF0ZSBzc3RhYmxlMSB3aXRoIHdpdGgga2V5cyBbMGEuLjI5YV0KKyAgICAgICAgcG9wdWxhdGUoS0VZU1BBQ0UxLCBDRl9TVEFOREFSRDEsIDAsIDI5LCAiYSIsMyk7IC8vdHRsPTNzCiAgICAgICAgIFV0aWwuZmx1c2goc3RvcmUpOwogCi0gICAgICAgIC8vUG9wdWxhdGUgc3N0YWJsZTIgd2l0aCB3aXRoIGtleXMgWzEwLi4xOV0gKGtleXMgZG8gbm90IG92ZXJsYXAgd2l0aCBTU1RhYmxlMSkKLSAgICAgICAgbG9uZyB0aW1lc3RhbXAyID0gcG9wdWxhdGUoS0VZU1BBQ0UxLCBDRl9TVEFOREFSRDEsIDEwLCAxOSwgMyk7IC8vdHRsPTNzCisgICAgICAgIC8vUG9wdWxhdGUgc3N0YWJsZTIgd2l0aCB3aXRoIGtleXMgWzBiLi4yOWJdIChrZXlzIGRvIG5vdCBvdmVybGFwIHdpdGggU1NUYWJsZTEsIGJ1dCB0aGUgcmFuZ2UgaXMgYWxtb3N0IGZ1bGx5IGNvdmVyZWQpCisgICAgICAgIGxvbmcgdGltZXN0YW1wMiA9IHBvcHVsYXRlKEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkQxLCAwLCAyOSwgImIiLCAzKTsgLy90dGw9M3MKICAgICAgICAgVXRpbC5mbHVzaChzdG9yZSk7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHN0b3JlLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CkBAIC0yNzQsNyArMjc5LDcgQEAKICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gc3N0YWJsZXMuaXRlcmF0b3IoKS5uZXh0KCk7CiAKICAgICAgICAgU1NUYWJsZUlkIHByZXZHZW5lcmF0aW9uID0gc3N0YWJsZS5kZXNjcmlwdG9yLmlkOwotICAgICAgICBTdHJpbmcgZmlsZSA9IG5ldyBGaWxlKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpLmFic29sdXRlUGF0aCgpOworICAgICAgICBTdHJpbmcgZmlsZSA9IHNzdGFibGUuZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuREFUQSkuYWJzb2x1dGVQYXRoKCk7CiAgICAgICAgIC8vIHN1Ym1pdCB1c2VyIGRlZmluZWQgY29tcGFjdGlvbiBvbiBmbHVzaGVkIHNzdGFibGUKICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZm9yY2VVc2VyRGVmaW5lZENvbXBhY3Rpb24oZmlsZSk7CiAgICAgICAgIC8vIHdhaXQgdW50aWwgdXNlciBkZWZpbmVkIGNvbXBhY3Rpb24gZmluaXNoZXMKQEAgLTM2Myw4ICszNjgsOCBAQAogICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGNmcy5nZXRMaXZlU1NUYWJsZXMoKSkKICAgICAgICAgewogICAgICAgICAgICAgU3RhdHNNZXRhZGF0YSBzdGF0cyA9IHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjAiKSwgc3RhdHMubWluQ2x1c3RlcmluZ1ZhbHVlcy5nZXQoMCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCJiIiksIHN0YXRzLm1heENsdXN0ZXJpbmdWYWx1ZXMuZ2V0KDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyVXRpbC5ieXRlcygiMCIpLCBzdGF0cy5jb3ZlcmVkQ2x1c3RlcmluZy5zdGFydCgpLmJ1ZmZlckF0KDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyVXRpbC5ieXRlcygiYiIpLCBzdGF0cy5jb3ZlcmVkQ2x1c3RlcmluZy5lbmQoKS5idWZmZXJBdCgwKSk7CiAgICAgICAgIH0KIAogICAgICAgICBhc3NlcnRFcXVhbHMoa2V5cywgayk7CkBAIC01NjUsNCArNTcwLDQgQEAKICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2Uuc2V0Q29uY3VycmVudENvbXBhY3RvcnMoMSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5nZXRDb3JlQ29tcGFjdG9yVGhyZWFkcygpKTsKICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0RhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZjIxMGEuLjAwMDAwMDAKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uOwotCi1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93VXBkYXRlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuU1NUYWJsZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkRhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kuZ2V0QnVja2V0czsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5EYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5Lm5ld2VzdEJ1Y2tldDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5EYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5LmZpbHRlck9sZFNTVGFibGVzOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkRhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kudmFsaWRhdGVPcHRpb25zOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKLQotcHVibGljIGNsYXNzIERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lUZXN0IGV4dGVuZHMgU2NoZW1hTG9hZGVyCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0UxID0gIkRhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lUZXN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfU1RBTkRBUkQxID0gIlN0YW5kYXJkMSI7Ci0gICAgQEJlZm9yZUNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVNjaGVtYSgpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBEaXNhYmxlIHRvbWJzdG9uZSBoaXN0b2dyYW0gcm91bmRpbmcgZm9yIHRlc3RzCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnN0cmVhbWluZ2hpc3RvZ3JhbS5yb3VuZHNlY29uZHMiLCAiMSIpOwotCi0gICAgICAgIFNjaGVtYUxvYWRlci5wcmVwYXJlU2VydmVyKCk7Ci0KLSAgICAgICAgU2NoZW1hTG9hZGVyLmNyZWF0ZUtleXNwYWNlKEtFWVNQQUNFMSwKLSAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCi0gICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENGX1NUQU5EQVJEMSkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE9wdGlvbnNWYWxpZGF0aW9uKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgb3B0aW9ucy5wdXQoRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuQkFTRV9USU1FX0tFWSwgIjMwIik7Ci0gICAgICAgIG9wdGlvbnMucHV0KERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLk1BWF9TU1RBQkxFX0FHRV9LRVksICIxODI1Iik7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdW52YWxpZGF0ZWQgPSB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIGFzc2VydFRydWUodW52YWxpZGF0ZWQuaXNFbXB0eSgpKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgb3B0aW9ucy5wdXQoRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuQkFTRV9USU1FX0tFWSwgIjAiKTsKLSAgICAgICAgICAgIHZhbGlkYXRlT3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgPT0gMCBzaG91bGQgYmUgcmVqZWN0ZWQiLCBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5CQVNFX1RJTUVfS0VZKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkge30KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgb3B0aW9ucy5wdXQoRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuQkFTRV9USU1FX0tFWSwgIi0xMzM3Iik7Ci0gICAgICAgICAgICB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIk5lZ2F0aXZlICVzIHNob3VsZCBiZSByZWplY3RlZCIsIERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLkJBU0VfVElNRV9LRVkpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBvcHRpb25zLnB1dChEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5CQVNFX1RJTUVfS0VZLCAiMSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG9wdGlvbnMucHV0KERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLk1BWF9TU1RBQkxFX0FHRV9LRVksICItMTMzNyIpOwotICAgICAgICAgICAgdmFsaWRhdGVPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJOZWdhdGl2ZSAlcyBzaG91bGQgYmUgcmVqZWN0ZWQiLCBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5NQVhfU1NUQUJMRV9BR0VfS0VZKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgb3B0aW9ucy5wdXQoRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuTUFYX1NTVEFCTEVfQUdFX0tFWSwgIjAiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBvcHRpb25zLnB1dChEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5NQVhfV0lORE9XX1NJWkVfS0VZLCAiLTEiKTsKLSAgICAgICAgICAgIHZhbGlkYXRlT3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiTmVnYXRpdmUgJXMgc2hvdWxkIGJlIHJlamVjdGVkIiwgRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuTUFYX1dJTkRPV19TSVpFX0tFWSkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9wdGlvbnMucHV0KERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLk1BWF9XSU5ET1dfU0laRV9LRVksICIwIik7Ci0gICAgICAgIH0KLQotICAgICAgICBvcHRpb25zLnB1dCgiYmFkX29wdGlvbiIsICIxLjAiKTsKLSAgICAgICAgdW52YWxpZGF0ZWQgPSB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIGFzc2VydFRydWUodW52YWxpZGF0ZWQuY29udGFpbnNLZXkoImJhZF9vcHRpb24iKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZUNvbnZlcnNpb25zKCkKLSAgICB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgb3B0aW9ucy5wdXQoRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuQkFTRV9USU1FX0tFWSwgIjMwIik7Ci0gICAgICAgIG9wdGlvbnMucHV0KERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLlRJTUVTVEFNUF9SRVNPTFVUSU9OX0tFWSwgIlNFQ09ORFMiKTsKLQotICAgICAgICBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucyBvcHRzID0gbmV3IERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3B0cy5tYXhTU1RhYmxlQWdlLCBUaW1lVW5pdC5TRUNPTkRTLmNvbnZlcnQoMzY1KjEwMDAsIFRpbWVVbml0LkRBWVMpKTsKLQotICAgICAgICBvcHRpb25zLnB1dChEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5USU1FU1RBTVBfUkVTT0xVVElPTl9LRVksICJNSUxMSVNFQ09ORFMiKTsKLSAgICAgICAgb3B0cyA9IG5ldyBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wdHMubWF4U1NUYWJsZUFnZSwgVGltZVVuaXQuTUlMTElTRUNPTkRTLmNvbnZlcnQoMzY1KjEwMDAsIFRpbWVVbml0LkRBWVMpKTsKLQotICAgICAgICBvcHRpb25zLnB1dChEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5USU1FU1RBTVBfUkVTT0xVVElPTl9LRVksICJNSUNST1NFQ09ORFMiKTsKLSAgICAgICAgb3B0aW9ucy5wdXQoRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuTUFYX1NTVEFCTEVfQUdFX0tFWSwgIjEwIik7Ci0gICAgICAgIG9wdHMgPSBuZXcgRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcHRzLm1heFNTVGFibGVBZ2UsIFRpbWVVbml0Lk1JQ1JPU0VDT05EUy5jb252ZXJ0KDEwLCBUaW1lVW5pdC5EQVlTKSk7Ci0KLSAgICAgICAgb3B0aW9ucy5wdXQoRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuTUFYX1NTVEFCTEVfQUdFX0tFWSwgIjAuNSIpOwotICAgICAgICBvcHRzID0gbmV3IERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3B0cy5tYXhTU1RhYmxlQWdlLCBUaW1lVW5pdC5NSUNST1NFQ09ORFMuY29udmVydCgxLCBUaW1lVW5pdC5EQVlTKSAvIDIpOwotCi0gICAgICAgIG9wdGlvbnMucHV0KERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLlRJTUVTVEFNUF9SRVNPTFVUSU9OX0tFWSwgIkhPVVJTIik7Ci0gICAgICAgIG9wdGlvbnMucHV0KERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLk1BWF9TU1RBQkxFX0FHRV9LRVksICIwLjUiKTsKLSAgICAgICAgb3B0cyA9IG5ldyBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wdHMubWF4U1NUYWJsZUFnZSwgMTIpOwotCi0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QnVja2V0cygpCi0gICAgewotICAgICAgICBMaXN0PFBhaXI8U3RyaW5nLCBMb25nPj4gcGFpcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoCi0gICAgICAgICAgICAgICAgUGFpci5jcmVhdGUoImEiLCAxOTlMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiYiIsIDI5OUwpLAotICAgICAgICAgICAgICAgIFBhaXIuY3JlYXRlKCJhIiwgMUwpLAotICAgICAgICAgICAgICAgIFBhaXIuY3JlYXRlKCJiIiwgMjAxTCkKLSAgICAgICAgKTsKLSAgICAgICAgTGlzdDxMaXN0PFN0cmluZz4+IGJ1Y2tldHMgPSBnZXRCdWNrZXRzKHBhaXJzLCAxMDBMLCAyLCAyMDBMLCBMb25nLk1BWF9WQUxVRSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBidWNrZXRzLnNpemUoKSk7Ci0KLSAgICAgICAgZm9yIChMaXN0PFN0cmluZz4gYnVja2V0IDogYnVja2V0cykKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGJ1Y2tldC5zaXplKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1Y2tldC5nZXQoMCksIGJ1Y2tldC5nZXQoMSkpOwotICAgICAgICB9Ci0KLQotICAgICAgICBwYWlycyA9IExpc3RzLm5ld0FycmF5TGlzdCgKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiYSIsIDIwMDBMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiYiIsIDM2MDBMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiYSIsIDIwMEwpLAotICAgICAgICAgICAgICAgIFBhaXIuY3JlYXRlKCJjIiwgMzk1MEwpLAotICAgICAgICAgICAgICAgIFBhaXIuY3JlYXRlKCJ0b28gbmV3IiwgNDEyNUwpLAotICAgICAgICAgICAgICAgIFBhaXIuY3JlYXRlKCJiIiwgMzg5OUwpLAotICAgICAgICAgICAgICAgIFBhaXIuY3JlYXRlKCJjIiwgMzkwMEwpCi0gICAgICAgICk7Ci0gICAgICAgIGJ1Y2tldHMgPSBnZXRCdWNrZXRzKHBhaXJzLCAxMDBMLCAzLCA0MDUwTCwgTG9uZy5NQVhfVkFMVUUpOwotICAgICAgICAvLyB0YXJnZXRzIChkaXZQb3NpdGlvbiwgc2l6ZSk6ICg0MCwgMTAwKSwgKDM5LCAxMDApLCAoMTIsIDMwMCksICgzLCA5MDApLCAoMCwgMjcwMCkKLSAgICAgICAgLy8gaW4gb3RoZXIgd29yZHM6IDAgLSAyNjk5LCAyNzAwIC0gMzU5OSwgMzYwMCAtIDM4OTksIDM5MDAgLSAzOTk5LCA0MDAwIC0gNDA5OQotICAgICAgICBhc3NlcnRFcXVhbHMoMywgYnVja2V0cy5zaXplKCkpOwotCi0gICAgICAgIGZvciAoTGlzdDxTdHJpbmc+IGJ1Y2tldCA6IGJ1Y2tldHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBidWNrZXQuc2l6ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhidWNrZXQuZ2V0KDApLCBidWNrZXQuZ2V0KDEpKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8gVGVzdCBiYXNlIDEuCi0gICAgICAgIHBhaXJzID0gTGlzdHMubmV3QXJyYXlMaXN0KAotICAgICAgICAgICAgICAgIFBhaXIuY3JlYXRlKCJhIiwgMjAwTCksCi0gICAgICAgICAgICAgICAgUGFpci5jcmVhdGUoImEiLCAyOTlMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiYiIsIDIwMDBMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiYiIsIDIwMTRMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiYyIsIDM2MTBMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiYyIsIDM2OTBMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiZCIsIDM4OThMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiZCIsIDM4OTlMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiZSIsIDM5MDBMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiZSIsIDM5NTBMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgidG9vIG5ldyIsIDQxMjVMKQotICAgICAgICApOwotICAgICAgICBidWNrZXRzID0gZ2V0QnVja2V0cyhwYWlycywgMTAwTCwgMSwgNDA1MEwsIExvbmcuTUFYX1ZBTFVFKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoNSwgYnVja2V0cy5zaXplKCkpOwotCi0gICAgICAgIGZvciAoTGlzdDxTdHJpbmc+IGJ1Y2tldCA6IGJ1Y2tldHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBidWNrZXQuc2l6ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhidWNrZXQuZ2V0KDApLCBidWNrZXQuZ2V0KDEpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFByZXBCdWNrZXQoKQotICAgIHsKLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGX1NUQU5EQVJEMSk7Ci0gICAgICAgIGNmcy5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLQotICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlWzEwMF0pOwotCi0gICAgICAgIC8vIGNyZWF0ZSAzIHNzdGFibGVzCi0gICAgICAgIGludCBudW1TU1RhYmxlcyA9IDM7Ci0gICAgICAgIGZvciAoaW50IHIgPSAwOyByIDwgbnVtU1NUYWJsZXM7IHIrKykKLSAgICAgICAgewotICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IFV0aWwuZGsoU3RyaW5nLnZhbHVlT2YocikpOwotICAgICAgICAgICAgbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoY2ZzLm1ldGFkYXRhKCksIHIsIGtleS5nZXRLZXkoKSkKLSAgICAgICAgICAgICAgICAuY2x1c3RlcmluZygiY29sdW1uIikKLSAgICAgICAgICAgICAgICAuYWRkKCJ2YWwiLCB2YWx1ZSkuYnVpbGQoKS5hcHBseVVuc2FmZSgpOwotCi0gICAgICAgICAgICBVdGlsLmZsdXNoKGNmcyk7Ci0gICAgICAgIH0KLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotCi0gICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gc3N0cnMgPSBuZXcgQXJyYXlMaXN0PD4oY2ZzLmdldExpdmVTU1RhYmxlcygpKTsKLQotICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IG5ld0J1Y2tldCA9IG5ld2VzdEJ1Y2tldChDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHNzdHJzLnN1Ykxpc3QoMCwgMikpLCA0LCAzMiwgOSwgMTAsIExvbmcuTUFYX1ZBTFVFLCBuZXcgU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoImluY29taW5nIGJ1Y2tldCBzaG91bGQgbm90IGJlIGFjY2VwdGVkIHdoZW4gaXQgaGFzIGJlbG93IHRoZSBtaW4gdGhyZXNob2xkIFNTVGFibGVzIiwgbmV3QnVja2V0LmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgbmV3QnVja2V0ID0gbmV3ZXN0QnVja2V0KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qoc3N0cnMuc3ViTGlzdCgwLCAyKSksIDQsIDMyLCAxMCwgMTAsIExvbmcuTUFYX1ZBTFVFLCBuZXcgU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJub24taW5jb21pbmcgYnVja2V0IHNob3VsZCBiZSBhY2NlcHRlZCB3aGVuIGl0IGhhcyBhdCBsZWFzdCAyIFNTVGFibGVzIiwgbmV3QnVja2V0LmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhbiBzc3RhYmxlIHdpdGggYSBzaW5nbGUgdmFsdWUgc2hvdWxkIGhhdmUgZXF1YWwgbWluL21heCB0aW1lc3RhbXBzIiwgc3N0cnMuZ2V0KDApLmdldE1pblRpbWVzdGFtcCgpLCBzc3Rycy5nZXQoMCkuZ2V0TWF4VGltZXN0YW1wKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFuIHNzdGFibGUgd2l0aCBhIHNpbmdsZSB2YWx1ZSBzaG91bGQgaGF2ZSBlcXVhbCBtaW4vbWF4IHRpbWVzdGFtcHMiLCBzc3Rycy5nZXQoMSkuZ2V0TWluVGltZXN0YW1wKCksIHNzdHJzLmdldCgxKS5nZXRNYXhUaW1lc3RhbXAoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYW4gc3N0YWJsZSB3aXRoIGEgc2luZ2xlIHZhbHVlIHNob3VsZCBoYXZlIGVxdWFsIG1pbi9tYXggdGltZXN0YW1wcyIsIHNzdHJzLmdldCgyKS5nZXRNaW5UaW1lc3RhbXAoKSwgc3N0cnMuZ2V0KDIpLmdldE1heFRpbWVzdGFtcCgpKTsKLSAgICAgICAgY2ZzLnRydW5jYXRlQmxvY2tpbmcoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJPbGRTU1RhYmxlcygpCi0gICAgewotICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UxKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0ZfU1RBTkRBUkQxKTsKLSAgICAgICAgY2ZzLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwotCi0gICAgICAgIEJ5dGVCdWZmZXIgdmFsdWUgPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbMTAwXSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIDMgc3N0YWJsZXMKLSAgICAgICAgaW50IG51bVNTVGFibGVzID0gMzsKLSAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCBudW1TU1RhYmxlczsgcisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gVXRpbC5kayhTdHJpbmcudmFsdWVPZihyKSk7Ci0gICAgICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgciwga2V5LmdldEtleSgpKQotICAgICAgICAgICAgICAgIC5jbHVzdGVyaW5nKCJjb2x1bW4iKQotICAgICAgICAgICAgICAgIC5hZGQoInZhbCIsIHZhbHVlKS5idWlsZCgpLmFwcGx5VW5zYWZlKCk7Ci0KLSAgICAgICAgICAgIFV0aWwuZmx1c2goY2ZzKTsKLSAgICAgICAgfQotICAgICAgICBVdGlsLmZsdXNoKGNmcyk7Ci0KLSAgICAgICAgSXRlcmFibGU8U1NUYWJsZVJlYWRlcj4gZmlsdGVyZWQ7Ci0gICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gc3N0cnMgPSBuZXcgQXJyYXlMaXN0PD4oY2ZzLmdldExpdmVTU1RhYmxlcygpKTsKLQotICAgICAgICBmaWx0ZXJlZCA9IGZpbHRlck9sZFNTVGFibGVzKHNzdHJzLCAwLCAyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3aGVuIG1heFNTVGFibGVBZ2UgaXMgemVybywgbm8gc3N0YWJsZXMgc2hvdWxkIGJlIGZpbHRlcmVkIiwgc3N0cnMuc2l6ZSgpLCBJdGVyYWJsZXMuc2l6ZShmaWx0ZXJlZCkpOwotCi0gICAgICAgIGZpbHRlcmVkID0gZmlsdGVyT2xkU1NUYWJsZXMoc3N0cnMsIDEsIDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm9ubHkgdGhlIG5ld2VzdCAyIHNzdGFibGVzIHNob3VsZCByZW1haW4iLCAyLCBJdGVyYWJsZXMuc2l6ZShmaWx0ZXJlZCkpOwotCi0gICAgICAgIGZpbHRlcmVkID0gZmlsdGVyT2xkU1NUYWJsZXMoc3N0cnMsIDEsIDMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm9ubHkgdGhlIG5ld2VzdCBzc3RhYmxlIHNob3VsZCByZW1haW4iLCAxLCBJdGVyYWJsZXMuc2l6ZShmaWx0ZXJlZCkpOwotCi0gICAgICAgIGZpbHRlcmVkID0gZmlsdGVyT2xkU1NUYWJsZXMoc3N0cnMsIDEsIDQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm5vIHNzdGFibGVzIHNob3VsZCByZW1haW4gd2hlbiBhbGwgYXJlIHRvbyBvbGQiLCAwLCBJdGVyYWJsZXMuc2l6ZShmaWx0ZXJlZCkpOwotICAgICAgICBjZnMudHJ1bmNhdGVCbG9ja2luZygpOwotICAgIH0KLQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RHJvcEV4cGlyZWRTU1RhYmxlcygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGX1NUQU5EQVJEMSk7Ci0gICAgICAgIGNmcy5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLQotICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlWzEwMF0pOwotCi0gICAgICAgIC8vIGNyZWF0ZSAyIHNzdGFibGVzCi0gICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBVdGlsLmRrKFN0cmluZy52YWx1ZU9mKCJleHBpcmVkIikpOwotICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksIDEsIGtleS5nZXRLZXkoKSkKLSAgICAgICAgICAgIC5jbHVzdGVyaW5nKCJjb2x1bW4iKQotICAgICAgICAgICAgLmFkZCgidmFsIiwgdmFsdWUpLmJ1aWxkKCkuYXBwbHlVbnNhZmUoKTsKLQotICAgICAgICBVdGlsLmZsdXNoKGNmcyk7Ci0gICAgICAgIFNTVGFibGVSZWFkZXIgZXhwaXJlZFNTVGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIFRocmVhZC5zbGVlcCgxMCk7Ci0KLSAgICAgICAga2V5ID0gVXRpbC5kayhTdHJpbmcudmFsdWVPZigibm9uZXhwaXJlZCIpKTsKLSAgICAgICAgbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoY2ZzLm1ldGFkYXRhKCksIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLCBrZXkuZ2V0S2V5KCkpCi0gICAgICAgICAgICAuY2x1c3RlcmluZygiY29sdW1uIikKLSAgICAgICAgICAgIC5hZGQoInZhbCIsIHZhbHVlKS5idWlsZCgpLmFwcGx5VW5zYWZlKCk7Ci0KLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSwgMik7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zID0gbmV3IEhhc2hNYXA8PigpOwotCi0gICAgICAgIG9wdGlvbnMucHV0KERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLkJBU0VfVElNRV9LRVksICIzMCIpOwotICAgICAgICBvcHRpb25zLnB1dChEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5USU1FU1RBTVBfUkVTT0xVVElPTl9LRVksICJNSUxMSVNFQ09ORFMiKTsKLSAgICAgICAgb3B0aW9ucy5wdXQoRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuTUFYX1NTVEFCTEVfQUdFX0tFWSwgRG91YmxlLnRvU3RyaW5nKCgxZCAvICgyNCAqIDYwICogNjApKSkpOwotICAgICAgICBvcHRpb25zLnB1dChEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5FWFBJUkVEX1NTVEFCTEVfQ0hFQ0tfRlJFUVVFTkNZX1NFQ09ORFNfS0VZLCAiMCIpOwotICAgICAgICBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5IGR0Y3MgPSBuZXcgRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneShjZnMsIG9wdGlvbnMpOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGNmcy5nZXRMaXZlU1NUYWJsZXMoKSkKLSAgICAgICAgICAgIGR0Y3MuYWRkU1NUYWJsZShzc3RhYmxlKTsKLSAgICAgICAgZHRjcy5zdGFydHVwKCk7Ci0gICAgICAgIGFzc2VydE51bGwoZHRjcy5nZXROZXh0QmFja2dyb3VuZFRhc2soKGludCkgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC8gMTAwMCkpKTsKLSAgICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOwotICAgICAgICBBYnN0cmFjdENvbXBhY3Rpb25UYXNrIHQgPSBkdGNzLmdldE5leHRCYWNrZ3JvdW5kVGFzaygoaW50KSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkvMTAwMCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgSXRlcmFibGVzLnNpemUodC50cmFuc2FjdGlvbi5vcmlnaW5hbHMoKSkpOwotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSB0LnRyYW5zYWN0aW9uLm9yaWdpbmFscygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc3N0YWJsZSwgZXhwaXJlZFNTVGFibGUpOwotICAgICAgICB0LnRyYW5zYWN0aW9uLmFib3J0KCk7Ci0gICAgICAgIGNmcy50cnVuY2F0ZUJsb2NraW5nKCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U1RDU0JpZ1dpbmRvdygpCi0gICAgewotICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UxKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0ZfU1RBTkRBUkQxKTsKLSAgICAgICAgY2ZzLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwotICAgICAgICBCeXRlQnVmZmVyIGJpZ1ZhbHVlID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlWzEwMDAwXSk7Ci0gICAgICAgIEJ5dGVCdWZmZXIgdmFsdWUgPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbMTAwXSk7Ci0gICAgICAgIGludCBudW1TU1RhYmxlcyA9IDQwOwotICAgICAgICAvLyBjcmVhdGUgYmlnIHNzdGFiZWxzIG91dCBvZiBoYWxmOgotICAgICAgICBsb25nIHRpbWVzdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBmb3IgKGludCByID0gMDsgciA8IG51bVNTVGFibGVzIC8gMjsgcisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IFV0aWwuZGsoU3RyaW5nLnZhbHVlT2YocikpOwotICAgICAgICAgICAgICAgIG5ldyBSb3dVcGRhdGVCdWlsZGVyKGNmcy5tZXRhZGF0YSgpLCB0aW1lc3RhbXAsIGtleS5nZXRLZXkoKSkKLSAgICAgICAgICAgICAgICAgICAgLmNsdXN0ZXJpbmcoImNvbHVtbiIpCi0gICAgICAgICAgICAgICAgICAgIC5hZGQoInZhbCIsIGJpZ1ZhbHVlKS5idWlsZCgpLmFwcGx5VW5zYWZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBVdGlsLmZsdXNoKGNmcyk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gYW5kIHNtYWxsIG9uZXM6Ci0gICAgICAgIGZvciAoaW50IHIgPSAwOyByIDwgbnVtU1NUYWJsZXMgLyAyOyByKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBVdGlsLmRrKFN0cmluZy52YWx1ZU9mKHIpKTsKLSAgICAgICAgICAgIG5ldyBSb3dVcGRhdGVCdWlsZGVyKGNmcy5tZXRhZGF0YSgpLCB0aW1lc3RhbXAsIGtleS5nZXRLZXkoKSkKLSAgICAgICAgICAgICAgICAuY2x1c3RlcmluZygiY29sdW1uIikKLSAgICAgICAgICAgICAgICAuYWRkKCJ2YWwiLCB2YWx1ZSkuYnVpbGQoKS5hcHBseVVuc2FmZSgpOwotICAgICAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotICAgICAgICB9Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgb3B0aW9ucy5wdXQoU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuTUlOX1NTVEFCTEVfU0laRV9LRVksICIxIik7Ci0gICAgICAgIERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kgZHRjcyA9IG5ldyBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5KGNmcywgb3B0aW9ucyk7Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogY2ZzLmdldFNTVGFibGVzKFNTVGFibGVTZXQuQ0FOT05JQ0FMKSkKLSAgICAgICAgICAgIGR0Y3MuYWRkU1NUYWJsZShzc3RhYmxlKTsKLSAgICAgICAgQWJzdHJhY3RDb21wYWN0aW9uVGFzayB0YXNrID0gZHRjcy5nZXROZXh0QmFja2dyb3VuZFRhc2soMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyMCwgdGFzay50cmFuc2FjdGlvbi5vcmlnaW5hbHMoKS5zaXplKCkpOwotICAgICAgICB0YXNrLnRyYW5zYWN0aW9uLmFib3J0KCk7Ci0gICAgICAgIGNmcy50cnVuY2F0ZUJsb2NraW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0xldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3lUZXN0LmphdmEKaW5kZXggMDdhNDVlNy4uNDlmMjU3YiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9MZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5VGVzdC5qYXZhCkBAIC00NSw2ICs0NSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlVwZGF0ZUJ1aWxkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKQEAgLTU2LDIzICs1NywyMyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5TU1RhYmxlQWRkZWROb3RpZmljYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5TU1RhYmxlUmVwYWlyU3RhdHVzQ2hhbmdlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5yZXBhaXIuVmFsaWRhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEucmVwYWlyLnN0YXRlLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuTW9ja1NjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuUHJldmlld0tpbmQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEucmVwYWlyLlJlcGFpckpvYkRlc2M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEucmVwYWlyLlZhbGlkYXRpb25NYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnJlcGFpci5WYWxpZGF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEucmVwYWlyLnN0YXRlLlZhbGlkYXRpb25TdGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29tcGFjdGlvblBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLk1vY2tTY2hlbWE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5BY3RpdmVSZXBhaXJTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5QcmV2aWV3S2luZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogaW1wb3J0IG9yZy5hd2FpdGlsaXR5LkF3YWl0aWxpdHk7CiAKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbGxlY3Rpb25zLnNpbmdsZXRvbjsKLWltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEOworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CkBAIC05Miw3ICs5Myw3IEBACiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVNjaGVtYSgpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCiAgICAgewogICAgICAgICAvLyBEaXNhYmxlIHRvbWJzdG9uZSBoaXN0b2dyYW0gcm91bmRpbmcgZm9yIHRlc3RzCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnN0cmVhbWluZ2hpc3RvZ3JhbS5yb3VuZHNlY29uZHMiLCAiMSIpOworICAgICAgICBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU1RSRUFNSU5HX0hJU1RPR1JBTV9ST1VORF9TRUNPTkRTLnNldEludCgxKTsKIAogICAgICAgICBTY2hlbWFMb2FkZXIucHJlcGFyZVNlcnZlcigpOwogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9OZXZlclB1cmdlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vTmV2ZXJQdXJnZVRlc3QuamF2YQppbmRleCA0MjUzNzMxLi4zZjVlNGI2IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9OZXZlclB1cmdlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL05ldmVyUHVyZ2VUZXN0LmphdmEKQEAgLTM0LDYgKzM0LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklTU1RhYmxlU2Nhbm5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTkVWRVJfUFVSR0VfVE9NQlNUT05FUzsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIHB1YmxpYyBjbGFzcyBOZXZlclB1cmdlVGVzdCBleHRlbmRzIENRTFRlc3RlcgpAQCAtNDEsNyArNDIsNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcENsYXNzKCkgLy8gbWV0aG9kIG5hbWUgbXVzdCBtYXRjaCB0aGUgQEJlZm9yZUNsYXNzIGFubm90YXRlZCBtZXRob2QgaW4gQ1FMVGVzdGVyCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5uZXZlcl9wdXJnZV90b21ic3RvbmVzIiwgInRydWUiKTsKKyAgICAgICAgTkVWRVJfUFVSR0VfVE9NQlNUT05FUy5zZXRCb29sZWFuKHRydWUpOwogICAgICAgICBDUUxUZXN0ZXIuc2V0VXBDbGFzcygpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vUGFydGlhbENvbXBhY3Rpb25zVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vUGFydGlhbENvbXBhY3Rpb25zVGVzdC5qYXZhCmluZGV4IGI5MjJjYTgwLi41ZTBlZDY2IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9QYXJ0aWFsQ29tcGFjdGlvbnNUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vUGFydGlhbENvbXBhY3Rpb25zVGVzdC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb247CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpAQCAtMjYsMTIgKzI3LDE1IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpcmVjdG9yaWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpcmVjdG9yaWVzVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dVcGRhdGVCdWlsZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvc2VhYmxlSXRlcmF0b3I7CkBAIC0yMDEsNyArMjA1LDI5IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgd3JhcHBlZFtpXSA9IG5ldyBMaW1pdGFibGVEYXRhRGlyZWN0b3J5KG9yaWdpbmFsW2ldKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgRGlyZWN0b3JpZXMoY2ZzLm1ldGFkYXRhKCksIHdyYXBwZWQpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBEaXJlY3RvcmllcyhjZnMubWV0YWRhdGEoKSwgd3JhcHBlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNEaXNrU3BhY2VGb3JDb21wYWN0aW9uc0FuZFN0cmVhbXMoTWFwPEZpbGUsIExvbmc+IGV4cGVjdGVkTmV3V3JpdGVTaXplcywgTWFwPEZpbGUsIExvbmc+IHRvdGFsQ29tcGFjdGlvbldyaXRlUmVtYWluaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhc0Rpc2tTcGFjZUZvckNvbXBhY3Rpb25zQW5kU3RyZWFtcyhleHBlY3RlZE5ld1dyaXRlU2l6ZXMsIHRvdGFsQ29tcGFjdGlvbldyaXRlUmVtYWluaW5nLCBmaWxlIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRGF0YURpcmVjdG9yeSBsb2NhdGlvbiA6IGdldFdyaXRlYWJsZUxvY2F0aW9ucygpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLnRvUGF0aCgpLnN0YXJ0c1dpdGgobG9jYXRpb24ubG9jYXRpb24udG9QYXRoKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbWl0YWJsZURhdGFEaXJlY3RvcnkgZGlyZWN0b3J5ID0gKExpbWl0YWJsZURhdGFEaXJlY3RvcnkpIGxvY2F0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0b3J5LmF2YWlsYWJsZVNwYWNlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdG9yaWVzVGVzdC5GYWtlRmlsZVN0b3JlIHN0b3JlID0gbmV3IERpcmVjdG9yaWVzVGVzdC5GYWtlRmlsZVN0b3JlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXZlcnNlIHRoZSBjb21wdXRhdGlvbiBpbiBEaXJlY3Rvcmllcy5nZXRBdmFpbGFibGVTcGFjZUZvckNvbXBhY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS51c2FibGVTcGFjZSA9IE1hdGgucm91bmQoZGlyZWN0b3J5LmF2YWlsYWJsZVNwYWNlIC8gRGF0YWJhc2VEZXNjcmlwdG9yLmdldE1heFNwYWNlRm9yQ29tcGFjdGlvbnNQZXJEcml2ZSgpKSArIERhdGFiYXNlRGVzY3JpcHRvci5nZXRNaW5GcmVlU3BhY2VQZXJEcml2ZUluQnl0ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEaXJlY3Rvcmllcy5nZXRGaWxlU3RvcmUoZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9TaW5nbGVTU1RhYmxlTENTVGFza1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1NpbmdsZVNTVGFibGVMQ1NUYXNrVGVzdC5qYXZhCmluZGV4IGJiMWQxZjAuLjllMDNlYzMgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1NpbmdsZVNTVGFibGVMQ1NUYXNrVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1NpbmdsZVNTVGFibGVMQ1NUYXNrVGVzdC5qYXZhCkBAIC0yOSw5ICsyOSw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKQEAgLTEyOSw4ICsxMjgsNyBAQAogICAgICAgICBVdGlsLmZsdXNoKGNmcyk7CiAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKIAotICAgICAgICBTdHJpbmcgZmlsZW5hbWVUb0NvcnJ1cHQgPSBzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlNUQVRTKTsKLSAgICAgICAgdHJ5KEZpbGVDaGFubmVsIGZjID0gbmV3IEZpbGUoZmlsZW5hbWVUb0NvcnJ1cHQpLm5ld1JlYWRXcml0ZUNoYW5uZWwoKSkKKyAgICAgICAgdHJ5KEZpbGVDaGFubmVsIGZjID0gc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5TVEFUUykubmV3UmVhZFdyaXRlQ2hhbm5lbCgpKQogICAgICAgICB7CiAgICAgICAgICAgICBmYy5wb3NpdGlvbigwKTsKICAgICAgICAgICAgIGZjLndyaXRlKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKFN0cmluZ1V0aWxzLnJlcGVhdCgneicsIDIpKSk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9TaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneVRlc3QuamF2YQppbmRleCBmYzk4YTljLi5kYWMzMzFlIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9TaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1NpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lUZXN0LmphdmEKQEAgLTI5LDYgKzI5LDcgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93VXBkYXRlQnVpbGRlcjsKQEAgLTU1LDcgKzU2LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KICAgICB7CiAgICAgICAgIC8vIERpc2FibGUgdG9tYnN0b25lIGhpc3RvZ3JhbSByb3VuZGluZyBmb3IgdGVzdHMKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuc3RyZWFtaW5naGlzdG9ncmFtLnJvdW5kc2Vjb25kcyIsICIxIik7CisgICAgICAgIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TVFJFQU1JTkdfSElTVE9HUkFNX1JPVU5EX1NFQ09ORFMuc2V0SW50KDEpOwogCiAgICAgICAgIFNjaGVtYUxvYWRlci5wcmVwYXJlU2VydmVyKCk7CiAKQEAgLTkzLDExICs5NCwxMSBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEdldEJ1Y2tldHMoKQogICAgIHsKLSAgICAgICAgTGlzdDxQYWlyPFN0cmluZywgTG9uZz4+IHBhaXJzID0gbmV3IEFycmF5TGlzdDxQYWlyPFN0cmluZywgTG9uZz4+KCk7CisgICAgICAgIExpc3Q8UGFpcjxTdHJpbmcsIExvbmc+PiBwYWlycyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBTdHJpbmdbXSBzdHJpbmdzID0geyAiYSIsICJiYmJiIiwgImNjY2NjY2NjIiwgImNjY2NjY2NjIiwgImJiYmIiLCAiYSIgfTsKICAgICAgICAgZm9yIChTdHJpbmcgc3QgOiBzdHJpbmdzKQogICAgICAgICB7Ci0gICAgICAgICAgICBQYWlyPFN0cmluZywgTG9uZz4gcGFpciA9IFBhaXIuY3JlYXRlKHN0LCBuZXcgTG9uZyhzdC5sZW5ndGgoKSkpOworICAgICAgICAgICAgUGFpcjxTdHJpbmcsIExvbmc+IHBhaXIgPSBQYWlyLmNyZWF0ZShzdCwgKGxvbmcpIHN0Lmxlbmd0aCgpKTsKICAgICAgICAgICAgIHBhaXJzLmFkZChwYWlyKTsKICAgICAgICAgfQogCkBAIC0xMTcsNyArMTE4LDcgQEAKICAgICAgICAgU3RyaW5nW10gc3RyaW5nczIgPSB7ICJhYWEiLCAiYmJiYmJiYmIiLCAiYWFhIiwgImJiYmJiYmJiIiwgImJiYmJiYmJiIiwgImFhYSIgfTsKICAgICAgICAgZm9yIChTdHJpbmcgc3QgOiBzdHJpbmdzMikKICAgICAgICAgewotICAgICAgICAgICAgUGFpcjxTdHJpbmcsIExvbmc+IHBhaXIgPSBQYWlyLmNyZWF0ZShzdCwgbmV3IExvbmcoc3QubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBMb25nPiBwYWlyID0gUGFpci5jcmVhdGUoc3QsIChsb25nKSBzdC5sZW5ndGgoKSk7CiAgICAgICAgICAgICBwYWlycy5hZGQocGFpcik7CiAgICAgICAgIH0KIApAQCAtMTM4LDcgKzEzOSw3IEBACiAgICAgICAgIFN0cmluZ1tdIHN0cmluZ3MzID0geyAiYWFhIiwgImJiYmJiYmJiIiwgImFhYSIsICJiYmJiYmJiYiIsICJiYmJiYmJiYiIsICJhYWEiIH07CiAgICAgICAgIGZvciAoU3RyaW5nIHN0IDogc3RyaW5nczMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBMb25nPiBwYWlyID0gUGFpci5jcmVhdGUoc3QsIG5ldyBMb25nKHN0Lmxlbmd0aCgpKSk7CisgICAgICAgICAgICBQYWlyPFN0cmluZywgTG9uZz4gcGFpciA9IFBhaXIuY3JlYXRlKHN0LCAobG9uZykgc3QubGVuZ3RoKCkpOwogICAgICAgICAgICAgcGFpcnMuYWRkKHBhaXIpOwogICAgICAgICB9CiAKQEAgLTE0Niw4ICsxNDcsOSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYnVja2V0cy5zaXplKCkpOwogICAgIH0KIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJVbm5lY2Vzc2FyeUxvY2FsVmFyaWFibGUiKQogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFByZXBCdWNrZXQoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgcHVibGljIHZvaWQgdGVzdFByZXBCdWNrZXQoKQogICAgIHsKICAgICAgICAgU3RyaW5nIGtzbmFtZSA9IEtFWVNQQUNFMTsKICAgICAgICAgU3RyaW5nIGNmbmFtZSA9ICJTdGFuZGFyZDEiOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vVFRMRXhwaXJ5VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vVFRMRXhwaXJ5VGVzdC5qYXZhCmluZGV4IDBlM2ZiNzYuLjdjN2NkYjYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1RUTEV4cGlyeVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9UVExFeHBpcnlUZXN0LmphdmEKQEAgLTI5LDE4ICsyOSwyMyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5VbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYVRlc3RVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EYXRhUmFuZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93VXBkYXRlQnVpbGRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5TU1RhYmxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQXNjaWlUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTWFwVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hVGVzdFV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuU1NUYWJsZUV4cGlyZWRCbG9ja2VyczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIApAQCAtNTYsNyArNjEsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVTY2hlbWEoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgLy8gRGlzYWJsZSB0b21ic3RvbmUgaGlzdG9ncmFtIHJvdW5kaW5nIGZvciB0ZXN0cwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5zdHJlYW1pbmdoaXN0b2dyYW0ucm91bmRzZWNvbmRzIiwgIjEiKTsKKyAgICAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlNUUkVBTUlOR19ISVNUT0dSQU1fUk9VTkRfU0VDT05EUy5zZXRJbnQoMSk7CiAKICAgICAgICAgU2NoZW1hTG9hZGVyLnByZXBhcmVTZXJ2ZXIoKTsKIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1RpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3lUZXN0LmphdmEKaW5kZXggZGU2MDI4Ni4uNDFhNGM0NyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9UaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5VGVzdC5qYXZhCkBAIC0yOCwxOCArMjgsMTIgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkhhc2hNdWx0aW1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKLQogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwpAQCAtNTAsMTAgKzQ0LDE3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLk1vY2tTY2hlbWE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkFMTE9XX1VOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5UaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5LmdldFdpbmRvd0JvdW5kc0luTWlsbGlzOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLlRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kubmV3ZXN0QnVja2V0OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLlRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kudmFsaWRhdGVPcHRpb25zOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllcy5ub3dJblNlY29uZHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIHB1YmxpYyBjbGFzcyBUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5VGVzdCBleHRlbmRzIFNjaGVtYUxvYWRlcgogewpAQCAtNjUsOCArNjYsOSBAQAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVTY2hlbWEoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgLy8gRGlzYWJsZSB0b21ic3RvbmUgaGlzdG9ncmFtIHJvdW5kaW5nIGZvciB0ZXN0cwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5zdHJlYW1pbmdoaXN0b2dyYW0ucm91bmRzZWNvbmRzIiwgIjEiKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLlVOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTl9QUk9QRVJUWSwgInRydWUiKTsKKyAgICAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlNUUkVBTUlOR19ISVNUT0dSQU1fUk9VTkRfU0VDT05EUy5zZXRJbnQoMSk7CisgICAgICAgIEFMTE9XX1VOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTi5zZXRCb29sZWFuKHRydWUpOworCiAKICAgICAgICAgU2NoZW1hTG9hZGVyLnByZXBhcmVTZXJ2ZXIoKTsKIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vd3JpdGVycy9Db21wYWN0aW9uQXdhcmVXcml0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi93cml0ZXJzL0NvbXBhY3Rpb25Bd2FyZVdyaXRlclRlc3QuamF2YQppbmRleCBhNjQxYmUxLi5jNGY3MmRlIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi93cml0ZXJzL0NvbXBhY3Rpb25Bd2FyZVdyaXRlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi93cml0ZXJzL0NvbXBhY3Rpb25Bd2FyZVdyaXRlclRlc3QuamF2YQpAQCAtMTgsMTUgKzE4LDI2IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24ud3JpdGVyczsKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5Mb25nczsKLWltcG9ydCBvcmcuanVuaXQuKjsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5BYnN0cmFjdENvbXBhY3Rpb25TdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25Db250cm9sbGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkl0ZXJhdG9yOwpAQCAtNjcsNiArNzgsMTMgQEAKICAgICAgICAgcmV0dXJuIEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldENvbHVtbkZhbWlseVN0b3JlKFRBQkxFKTsKICAgICB9CiAKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCBhZnRlclRlc3QoKSB7CisgICAgICAgIEtleXNwYWNlIGtzID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtzLmdldENvbHVtbkZhbWlseVN0b3JlKFRBQkxFKTsKKyAgICAgICAgY2ZzLnRydW5jYXRlQmxvY2tpbmcoKTsKKyAgICB9CisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0Q29tcGFjdGlvbldyaXRlcigpIHRocm93cyBUaHJvd2FibGUKICAgICB7CkBAIC0yNjAsNCArMjc4LDQgQEAKICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgaywgdCBGUk9NICVzLiVzIFdIRVJFIGsgPSA6aSIsIEtFWVNQQUNFLCBUQUJMRSksIGkpLCBleHBlY3RlZCk7CiAgICAgICAgIH0KICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2ZpbHRlci9TbGljZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9maWx0ZXIvU2xpY2VUZXN0LmphdmEKaW5kZXggYzgzODgwYy4uMTgyMzNmMCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2ZpbHRlci9TbGljZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZmlsdGVyL1NsaWNlVGVzdC5qYXZhCkBAIC0xOCwxOSArMTgsMzAgQEAKICAqICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlcjsKIAotCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkJ1ZmZlckNsdXN0ZXJpbmdCb3VuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdCb3VuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nQ29tcGFyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nUHJlZml4OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNsaWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNsaWNlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nUHJlZml4LktpbmQuKjsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nUHJlZml4LktpbmQuRVhDTF9FTkRfQk9VTkQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdQcmVmaXguS2luZC5FWENMX1NUQVJUX0JPVU5EOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nUHJlZml4LktpbmQuSU5DTF9FTkRfQk9VTkQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdQcmVmaXguS2luZC5JTkNMX1NUQVJUX0JPVU5EOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiBwdWJsaWMgY2xhc3MgU2xpY2VUZXN0CiB7CkBAIC00OCwyMjEgKzU5LDIyMSBAQAogCiAgICAgICAgIC8vIGZpbHRlciBmYWxscyBlbnRpcmVseSBiZWZvcmUgc3N0YWJsZQogICAgICAgICBTbGljZSBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAwLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAxLCAwLCAwKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDIsIDAsIDApLCBjb2x1bW5OYW1lcygzLCAwLCAwKSkpOworICAgICAgICBhc3NlcnRTbGljZXNEb05vdEludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAyLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAzLCAwLCAwKSkpOwogCiAgICAgICAgIC8vIHNhbWUgY2FzZSwgYnV0IHdpdGggZW1wdHkgc3RhcnQKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzayksIG1ha2VCb3VuZChlaywgMSwgMCwgMCkpOwotICAgICAgICBhc3NlcnRGYWxzZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygyLCAwLCAwKSwgY29sdW1uTmFtZXMoMywgMCwgMCkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzRG9Ob3RJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMiwgMCwgMCksIG1ha2VCb3VuZChlaywgMywgMCwgMCkpKTsKIAogICAgICAgICAvLyBzYW1lIGNhc2UsIGJ1dCB3aXRoIG1pc3NpbmcgY29tcG9uZW50cyBmb3Igc3RhcnQKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMCksIG1ha2VCb3VuZChlaywgMSwgMCwgMCkpOwotICAgICAgICBhc3NlcnRGYWxzZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygyLCAwLCAwKSwgY29sdW1uTmFtZXMoMywgMCwgMCkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzRG9Ob3RJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMiwgMCwgMCksIG1ha2VCb3VuZChlaywgMywgMCwgMCkpKTsKIAogICAgICAgICAvLyBzYW1lIGNhc2UsIGJ1dCB3aXRoIG1pc3NpbmcgY29tcG9uZW50cyBmb3Igc3RhcnQgYW5kIGVuZAogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAwKSwgbWFrZUJvdW5kKGVrLCAxLCAwKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDIsIDAsIDApLCBjb2x1bW5OYW1lcygzLCAwLCAwKSkpOworICAgICAgICBhc3NlcnRTbGljZXNEb05vdEludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAyLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAzLCAwLCAwKSkpOwogCiAKICAgICAgICAgLy8gZW5kIG9mIHNsaWNlIG1hdGNoZXMgc3RhcnQgb2Ygc3N0YWJsZSBmb3IgdGhlIGZpcnN0IGNvbXBvbmVudCwgYnV0IG5vdCB0aGUgc2Vjb25kIGNvbXBvbmVudAogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAwLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAxLCAwLCAwKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDEsIDEsIDApLCBjb2x1bW5OYW1lcygzLCAwLCAwKSkpOworICAgICAgICBhc3NlcnRTbGljZXNEb05vdEludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAxLCAwKSwgbWFrZUJvdW5kKGVrLCAzLCAwLCAwKSkpOwogCiAgICAgICAgIC8vIHNhbWUgY2FzZSwgYnV0IHdpdGggbWlzc2luZyBjb21wb25lbnRzIGZvciBzdGFydAogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAwKSwgbWFrZUJvdW5kKGVrLCAxLCAwLCAwKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDEsIDEsIDApLCBjb2x1bW5OYW1lcygzLCAwLCAwKSkpOworICAgICAgICBhc3NlcnRTbGljZXNEb05vdEludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAxLCAwKSwgbWFrZUJvdW5kKGVrLCAzLCAwLCAwKSkpOwogCiAgICAgICAgIC8vIHNhbWUgY2FzZSwgYnV0IHdpdGggbWlzc2luZyBjb21wb25lbnRzIGZvciBzdGFydCBhbmQgZW5kCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDApLCBtYWtlQm91bmQoZWssIDEsIDApKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSwgMSwgMCksIGNvbHVtbk5hbWVzKDMsIDAsIDApKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0RvTm90SW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDEsIDApLCBtYWtlQm91bmQoZWssIDMsIDAsIDApKSk7CiAKICAgICAgICAgLy8gZmlyc3QgdHdvIGNvbXBvbmVudHMgbWF0Y2gsIGJ1dCBub3QgdGhlIGxhc3QKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMCwgMCwgMCksIG1ha2VCb3VuZChlaywgMSwgMSwgMCkpOwotICAgICAgICBhc3NlcnRGYWxzZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAxLCAxKSwgY29sdW1uTmFtZXMoMywgMSwgMSkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzRG9Ob3RJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMSwgMSksIG1ha2VCb3VuZChlaywgMywgMSwgMSkpKTsKIAogICAgICAgICAvLyBhbGwgdGhyZWUgY29tcG9uZW50cyBpbiBzbGljZSBlbmQgbWF0Y2ggdGhlIHN0YXJ0IG9mIHRoZSBzc3RhYmxlCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDAsIDAsIDApLCBtYWtlQm91bmQoZWssIDEsIDEsIDEpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAxLCAxKSwgY29sdW1uTmFtZXMoMywgMSwgMSkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDEsIDEpLCBtYWtlQm91bmQoZWssIDMsIDEsIDEpKSk7CiAKIAogICAgICAgICAvLyBmaWx0ZXIgZmFsbHMgZW50aXJlbHkgYWZ0ZXIgc3N0YWJsZQogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCA0LCAwLCAwKSwgbWFrZUJvdW5kKGVrLCA0LCAwLCAwKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDIsIDAsIDApLCBjb2x1bW5OYW1lcygzLCAwLCAwKSkpOworICAgICAgICBhc3NlcnRTbGljZXNEb05vdEludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAyLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAzLCAwLCAwKSkpOwogCiAgICAgICAgIC8vIHNhbWUgY2FzZSwgYnV0IHdpdGggZW1wdHkgZW5kCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDQsIDAsIDApLCBtYWtlQm91bmQoZWspKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMiwgMCwgMCksIGNvbHVtbk5hbWVzKDMsIDAsIDApKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0RvTm90SW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDIsIDAsIDApLCBtYWtlQm91bmQoZWssIDMsIDAsIDApKSk7CiAKICAgICAgICAgLy8gc2FtZSBjYXNlLCBidXQgd2l0aCBtaXNzaW5nIGNvbXBvbmVudHMgZm9yIGVuZAogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCA0LCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAxKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDIsIDAsIDApLCBjb2x1bW5OYW1lcygzLCAwLCAwKSkpOworICAgICAgICBhc3NlcnRTbGljZXNEb05vdEludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAyLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAzLCAwLCAwKSkpOwogCiAgICAgICAgIC8vIHNhbWUgY2FzZSwgYnV0IHdpdGggbWlzc2luZyBjb21wb25lbnRzIGZvciBzdGFydCBhbmQgZW5kCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDQsIDApLCBtYWtlQm91bmQoZWssIDEpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMiwgMCwgMCksIGNvbHVtbk5hbWVzKDMsIDAsIDApKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0RvTm90SW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDIsIDAsIDApLCBtYWtlQm91bmQoZWssIDMsIDAsIDApKSk7CiAKIAogICAgICAgICAvLyBzdGFydCBvZiBzbGljZSBtYXRjaGVzIGVuZCBvZiBzc3RhYmxlIGZvciB0aGUgZmlyc3QgY29tcG9uZW50LCBidXQgbm90IHRoZSBzZWNvbmQgY29tcG9uZW50CiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDEsIDEpLCBtYWtlQm91bmQoZWssIDIsIDAsIDApKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMCwgMCwgMCksIGNvbHVtbk5hbWVzKDEsIDAsIDApKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0RvTm90SW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDAsIDAsIDApLCBtYWtlQm91bmQoZWssIDEsIDAsIDApKSk7CiAKICAgICAgICAgLy8gc3RhcnQgb2Ygc2xpY2UgbWF0Y2hlcyBlbmQgb2Ygc3N0YWJsZSBmb3IgdGhlIGZpcnN0IHR3byBjb21wb25lbnRzLCBidXQgbm90IHRoZSBsYXN0IGNvbXBvbmVudAogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAxLCAxKSwgbWFrZUJvdW5kKGVrLCAyLCAwLCAwKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDAsIDAsIDApLCBjb2x1bW5OYW1lcygxLCAxLCAwKSkpOworICAgICAgICBhc3NlcnRTbGljZXNEb05vdEludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAwLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAxLCAxLCAwKSkpOwogCiAgICAgICAgIC8vIGFsbCB0aHJlZSBjb21wb25lbnRzIGluIHRoZSBzbGljZSBzdGFydCBtYXRjaCB0aGUgZW5kIG9mIHRoZSBzc3RhYmxlCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDEsIDEpLCBtYWtlQm91bmQoZWssIDIsIDAsIDApKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygwLCAwLCAwKSwgY29sdW1uTmFtZXMoMSwgMSwgMSkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDAsIDAsIDApLCBtYWtlQm91bmQoZWssIDEsIDEsIDEpKSk7CiAKIAogICAgICAgICAvLyBzbGljZSBjb3ZlcnMgZW50aXJlIHNzdGFibGUgKHdpdGggbm8gbWF0Y2hpbmcgZWRnZXMpCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDAsIDAsIDApLCBtYWtlQm91bmQoZWssIDIsIDAsIDApKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAwLCAwKSwgY29sdW1uTmFtZXMoMSwgMSwgMSkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDEsIDEsIDEpKSk7CiAKICAgICAgICAgLy8gc2FtZSBjYXNlLCBidXQgd2l0aCBlbXB0eSBlbmRzCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2spLCBtYWtlQm91bmQoZWspKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAwLCAwKSwgY29sdW1uTmFtZXMoMSwgMSwgMSkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDEsIDEsIDEpKSk7CiAKICAgICAgICAgLy8gc2FtZSBjYXNlLCBidXQgd2l0aCBtaXNzaW5nIGNvbXBvbmVudHMKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMCksIG1ha2VCb3VuZChlaywgMiwgMCkpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDEsIDAsIDApLCBjb2x1bW5OYW1lcygxLCAxLCAxKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMCwgMCksIG1ha2VCb3VuZChlaywgMSwgMSwgMSkpKTsKIAogICAgICAgICAvLyBzbGljZSBjb3ZlcnMgZW50aXJlIHNzdGFibGUgKHdpdGggbWF0Y2hpbmcgc3RhcnQpCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDIsIDAsIDApKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAwLCAwKSwgY29sdW1uTmFtZXMoMSwgMSwgMSkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDEsIDEsIDEpKSk7CiAKICAgICAgICAgLy8gc2xpY2UgY292ZXJzIGVudGlyZSBzc3RhYmxlICh3aXRoIG1hdGNoaW5nIGVuZCkKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMCwgMCwgMCksIG1ha2VCb3VuZChlaywgMSwgMSwgMSkpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDEsIDAsIDApLCBjb2x1bW5OYW1lcygxLCAxLCAxKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMCwgMCksIG1ha2VCb3VuZChlaywgMSwgMSwgMSkpKTsKIAogICAgICAgICAvLyBzbGljZSBjb3ZlcnMgZW50aXJlIHNzdGFibGUgKHdpdGggbWF0Y2hpbmcgc3RhcnQgYW5kIGVuZCkKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMCwgMCksIG1ha2VCb3VuZChlaywgMSwgMSwgMSkpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDEsIDAsIDApLCBjb2x1bW5OYW1lcygxLCAxLCAxKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMCwgMCksIG1ha2VCb3VuZChlaywgMSwgMSwgMSkpKTsKIAogCiAgICAgICAgIC8vIHNsaWNlIGZhbGxzIGVudGlyZWx5IHdpdGhpbiBzc3RhYmxlICh3aXRoIG1hdGNoaW5nIHN0YXJ0KQogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAxLCAxLCAwKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSwgMCwgMCksIGNvbHVtbk5hbWVzKDEsIDEsIDEpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAxLCAxLCAxKSkpOwogCiAgICAgICAgIC8vIHNhbWUgY2FzZSwgYnV0IHdpdGggYSBtaXNzaW5nIGVuZCBjb21wb25lbnQKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMCwgMCksIG1ha2VCb3VuZChlaywgMSwgMSkpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDEsIDAsIDApLCBjb2x1bW5OYW1lcygxLCAxLCAxKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMCwgMCksIG1ha2VCb3VuZChlaywgMSwgMSwgMSkpKTsKIAogICAgICAgICAvLyBzbGljZSBmYWxscyBlbnRpcmVseSB3aXRoaW4gc3N0YWJsZSAod2l0aCBtYXRjaGluZyBlbmQpCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDEsIDApLCBtYWtlQm91bmQoZWssIDEsIDEsIDEpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAwLCAwKSwgY29sdW1uTmFtZXMoMSwgMSwgMSkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDEsIDEsIDEpKSk7CiAKICAgICAgICAgLy8gc2FtZSBjYXNlLCBidXQgd2l0aCBhIG1pc3Npbmcgc3RhcnQgY29tcG9uZW50CiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDEpLCBtYWtlQm91bmQoZWssIDEsIDEsIDEpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAwLCAwKSwgY29sdW1uTmFtZXMoMSwgMSwgMSkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDEsIDEsIDEpKSk7CiAKIAogICAgICAgICAvLyBzbGljZSBmYWxscyBlbnRpcmVseSB3aXRoaW4gc3N0YWJsZQogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAxLCAwKSwgbWFrZUJvdW5kKGVrLCAxLCAxLCAxKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSwgMCwgMCksIGNvbHVtbk5hbWVzKDIsIDIsIDIpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAyLCAyLCAyKSkpOwogCiAgICAgICAgIC8vIHNhbWUgY2FzZSwgYnV0IHdpdGggYSBtaXNzaW5nIHN0YXJ0IGNvbXBvbmVudAogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAxKSwgbWFrZUJvdW5kKGVrLCAxLCAxLCAxKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSwgMCwgMCksIGNvbHVtbk5hbWVzKDIsIDIsIDIpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAyLCAyLCAyKSkpOwogCiAgICAgICAgIC8vIHNhbWUgY2FzZSwgYnV0IHdpdGggYSBtaXNzaW5nIHN0YXJ0IGFuZCBlbmQgY29tcG9uZW50cwogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxKSwgbWFrZUJvdW5kKGVrLCAxLCAyKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSwgMCwgMCksIGNvbHVtbk5hbWVzKDIsIDIsIDIpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAyLCAyLCAyKSkpOwogCiAgICAgICAgIC8vIHNhbWUgY2FzZSwgYnV0IHdpdGggYW4gZXF1YWwgZmlyc3QgY29tcG9uZW50IGFuZCBtaXNzaW5nIHN0YXJ0IGFuZCBlbmQgY29tcG9uZW50cwogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxKSwgbWFrZUJvdW5kKGVrLCAxKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSwgMCwgMCksIGNvbHVtbk5hbWVzKDIsIDIsIDIpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAyLCAyLCAyKSkpOwogCiAgICAgICAgIC8vIHNsaWNlIGZhbGxzIGVudGlyZWx5IHdpdGhpbiBzc3RhYmxlIChzbGljZSBzdGFydCBhbmQgZW5kIGFyZSB0aGUgc2FtZSkKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMSwgMSksIG1ha2VCb3VuZChlaywgMSwgMSwgMSkpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDEsIDAsIDApLCBjb2x1bW5OYW1lcygyLCAyLCAyKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMCwgMCksIG1ha2VCb3VuZChlaywgMiwgMiwgMikpKTsKIAogCiAgICAgICAgIC8vIHNsaWNlIHN0YXJ0cyB3aXRoaW4gc3N0YWJsZSwgZW1wdHkgZW5kCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDEsIDEpLCBtYWtlQm91bmQoZWspKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAwLCAwKSwgY29sdW1uTmFtZXMoMiwgMCwgMCkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDIsIDAsIDApKSk7CiAKICAgICAgICAgLy8gc2FtZSBjYXNlLCBidXQgd2l0aCBtaXNzaW5nIGVuZCBjb21wb25lbnRzCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDEsIDEpLCBtYWtlQm91bmQoZWssIDMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAwLCAwKSwgY29sdW1uTmFtZXMoMiwgMCwgMCkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDIsIDAsIDApKSk7CiAKICAgICAgICAgLy8gc2xpY2Ugc3RhcnRzIHdpdGhpbiBzc3RhYmxlIChtYXRjaGluZyBzc3RhYmxlIHN0YXJ0KSwgZW1wdHkgZW5kCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWspKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAwLCAwKSwgY29sdW1uTmFtZXMoMiwgMCwgMCkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDIsIDAsIDApKSk7CiAKICAgICAgICAgLy8gc2FtZSBjYXNlLCBidXQgd2l0aCBtaXNzaW5nIGVuZCBjb21wb25lbnRzCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAwLCAwKSwgY29sdW1uTmFtZXMoMiwgMCwgMCkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDIsIDAsIDApKSk7CiAKICAgICAgICAgLy8gc2xpY2Ugc3RhcnRzIHdpdGhpbiBzc3RhYmxlIChtYXRjaGluZyBzc3RhYmxlIGVuZCksIGVtcHR5IGVuZAogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAyLCAwLCAwKSwgbWFrZUJvdW5kKGVrKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSwgMCwgMCksIGNvbHVtbk5hbWVzKDIsIDAsIDApKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAyLCAwLCAwKSkpOwogCiAgICAgICAgIC8vIHNhbWUgY2FzZSwgYnV0IHdpdGggbWlzc2luZyBlbmQgY29tcG9uZW50cwogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAyLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAzKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSwgMCwgMCksIGNvbHVtbk5hbWVzKDIsIDAsIDApKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAyLCAwLCAwKSkpOwogCiAKICAgICAgICAgLy8gc2xpY2UgZW5kcyB3aXRoaW4gc3N0YWJsZSwgZW1wdHkgZW5kCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2spLCBtYWtlQm91bmQoZWssIDEsIDEsIDEpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAwLCAwKSwgY29sdW1uTmFtZXMoMiwgMCwgMCkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDIsIDAsIDApKSk7CiAKICAgICAgICAgLy8gc2FtZSBjYXNlLCBidXQgd2l0aCBtaXNzaW5nIHN0YXJ0IGNvbXBvbmVudHMKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMCksIG1ha2VCb3VuZChlaywgMSwgMSwgMSkpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDEsIDAsIDApLCBjb2x1bW5OYW1lcygyLCAwLCAwKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMCwgMCksIG1ha2VCb3VuZChlaywgMiwgMCwgMCkpKTsKIAogICAgICAgICAvLyBzbGljZSBlbmRzIHdpdGhpbiBzc3RhYmxlIChtYXRjaGluZyBzc3RhYmxlIHN0YXJ0KSwgZW1wdHkgc3RhcnQKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzayksIG1ha2VCb3VuZChlaywgMSwgMCwgMCkpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDEsIDAsIDApLCBjb2x1bW5OYW1lcygyLCAwLCAwKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMCwgMCksIG1ha2VCb3VuZChlaywgMiwgMCwgMCkpKTsKIAogICAgICAgICAvLyBzYW1lIGNhc2UsIGJ1dCB3aXRoIG1pc3Npbmcgc3RhcnQgY29tcG9uZW50cwogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAwKSwgbWFrZUJvdW5kKGVrLCAxLCAwLCAwKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSwgMCwgMCksIGNvbHVtbk5hbWVzKDIsIDAsIDApKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAyLCAwLCAwKSkpOwogCiAgICAgICAgIC8vIHNsaWNlIGVuZHMgd2l0aGluIHNzdGFibGUgKG1hdGNoaW5nIHNzdGFibGUgZW5kKSwgZW1wdHkgc3RhcnQKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzayksIG1ha2VCb3VuZChlaywgMiwgMCwgMCkpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDEsIDAsIDApLCBjb2x1bW5OYW1lcygyLCAwLCAwKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMCwgMCksIG1ha2VCb3VuZChlaywgMiwgMCwgMCkpKTsKIAogICAgICAgICAvLyBzYW1lIGNhc2UsIGJ1dCB3aXRoIG1pc3Npbmcgc3RhcnQgY29tcG9uZW50cwogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAwKSwgbWFrZUJvdW5kKGVrLCAyLCAwLCAwKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSwgMCwgMCksIGNvbHVtbk5hbWVzKDIsIDAsIDApKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAyLCAwLCAwKSkpOwogCiAgICAgICAgIC8vIGVtcHR5IG1pbi9tYXggY29sdW1uIG5hbWVzCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2spLCBtYWtlQm91bmQoZWspKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygpLCBjb2x1bW5OYW1lcygpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrKSwgbWFrZUJvdW5kKGVrKSkpOwogCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEpLCBtYWtlQm91bmQoZWspKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygpLCBjb2x1bW5OYW1lcygpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrKSwgbWFrZUJvdW5kKGVrKSkpOwogCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2spLCBtYWtlQm91bmQoZWssIDEpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygpLCBjb2x1bW5OYW1lcygpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrKSwgbWFrZUJvdW5kKGVrKSkpOwogCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEpLCBtYWtlQm91bmQoZWssIDEpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygpLCBjb2x1bW5OYW1lcygpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrKSwgbWFrZUJvdW5kKGVrKSkpOwogCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2spLCBtYWtlQm91bmQoZWspKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygpLCBjb2x1bW5OYW1lcygxKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzayksIG1ha2VCb3VuZChlaywgMSkpKTsKIAogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrKSwgbWFrZUJvdW5kKGVrLCAxKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoKSwgY29sdW1uTmFtZXMoMSkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2spLCBtYWtlQm91bmQoZWssIDEpKSk7CiAKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzayksIG1ha2VCb3VuZChlaywgMSkpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKCksIGNvbHVtbk5hbWVzKDIpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrKSwgbWFrZUJvdW5kKGVrLCAyKSkpOwogCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2spLCBtYWtlQm91bmQoZWssIDIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygpLCBjb2x1bW5OYW1lcygxKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzayksIG1ha2VCb3VuZChlaywgMSkpKTsKIAogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAyKSwgbWFrZUJvdW5kKGVrLCAzKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKCksIGNvbHVtbk5hbWVzKDEpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0RvTm90SW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2spLCBtYWtlQm91bmQoZWssIDEpKSk7CiAKICAgICAgICAgLy8gYmFzaWMgY2hlY2sgb24gcmV2ZXJzZWQgc2xpY2VzCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDAsIDAsIDApKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMiwgMCwgMCksIGNvbHVtbk5hbWVzKDMsIDAsIDApKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0RvTm90SW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDIsIDAsIDApLCBtYWtlQm91bmQoZWssIDMsIDAsIDApKSk7CiAKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMCwgMCksIG1ha2VCb3VuZChlaywgMCwgMCwgMCkpOwotICAgICAgICBhc3NlcnRGYWxzZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAxLCAwKSwgY29sdW1uTmFtZXMoMywgMCwgMCkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzRG9Ob3RJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMSwgMCksIG1ha2VCb3VuZChlaywgMywgMCwgMCkpKTsKIAogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAxLCAxKSwgbWFrZUJvdW5kKGVrLCAxLCAxLCAwKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSwgMCwgMCksIGNvbHVtbk5hbWVzKDIsIDIsIDIpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0RvTm90SW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDIsIDIsIDIpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTI3OSwzMiArMjkwLDMyIEBACiAKICAgICAgICAgLy8gc2xpY2UgZG9lcyBpbnRlcnNlY3QKICAgICAgICAgU2xpY2Ugc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzayksIG1ha2VCb3VuZChlaykpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKCksIGNvbHVtbk5hbWVzKDEpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrKSwgbWFrZUJvdW5kKGVrLCAxKSkpOwogCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2spLCBtYWtlQm91bmQoZWspKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxKSwgY29sdW1uTmFtZXMoMSwgMikpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEpLCBtYWtlQm91bmQoZWssIDEsIDIpKSk7CiAKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzayksIG1ha2VCb3VuZChlaywgMSkpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKCksIGNvbHVtbk5hbWVzKDEpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrKSwgbWFrZUJvdW5kKGVrLCAxKSkpOwogCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEpLCBtYWtlQm91bmQoZWspKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygpLCBjb2x1bW5OYW1lcygxKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzayksIG1ha2VCb3VuZChlaywgMSkpKTsKIAogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxKSwgbWFrZUJvdW5kKGVrLCAxKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoKSwgY29sdW1uTmFtZXMoMSkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2spLCBtYWtlQm91bmQoZWssIDEpKSk7CiAKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMCksIG1ha2VCb3VuZChlaywgMSwgMiwgMykpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKCksIGNvbHVtbk5hbWVzKDEpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrKSwgbWFrZUJvdW5kKGVrLCAxKSkpOwogCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDIsIDMpLCBtYWtlQm91bmQoZWssIDIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygpLCBjb2x1bW5OYW1lcygxKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzayksIG1ha2VCb3VuZChlaywgMSkpKTsKIAogICAgICAgICAvLyBzbGljZSBkb2VzIG5vdCBpbnRlcnNlY3QKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMiksIG1ha2VCb3VuZChlaywgMywgNCwgNSkpOwotICAgICAgICBhc3NlcnRGYWxzZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygpLCBjb2x1bW5OYW1lcygxKSkpOworICAgICAgICBhc3NlcnRTbGljZXNEb05vdEludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrKSwgbWFrZUJvdW5kKGVrLCAxKSkpOwogCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDApLCBtYWtlQm91bmQoZWssIDAsIDEsIDIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSksIGNvbHVtbk5hbWVzKDEsIDIpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0RvTm90SW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEpLCBtYWtlQm91bmQoZWssIDEsIDIpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTM1MywxNCArMzY0LDYgQEAKICAgICAgICAgcmV0dXJuIEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZC5jcmVhdGUoa2luZCwgdmFsdWVzKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEJ5dGVCdWZmZXI+IGNvbHVtbk5hbWVzKEludGVnZXIgLi4uIGNvbXBvbmVudHMpCi0gICAgewotICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IG5hbWVzID0gbmV3IEFycmF5TGlzdDw+KGNvbXBvbmVudHMubGVuZ3RoKTsKLSAgICAgICAgZm9yIChpbnQgY29tcG9uZW50IDogY29tcG9uZW50cykKLSAgICAgICAgICAgIG5hbWVzLmFkZChCeXRlQnVmZmVyVXRpbC5ieXRlcyhjb21wb25lbnQpKTsKLSAgICAgICAgcmV0dXJuIG5hbWVzOwotICAgIH0KLQogICAgIHByaXZhdGUgc3RhdGljIFNsaWNlIHMoaW50IHN0YXJ0LCBpbnQgZmluaXNoKQogICAgIHsKICAgICAgICAgcmV0dXJuIFNsaWNlLm1ha2UobWFrZUJvdW5kKElOQ0xfU1RBUlRfQk9VTkQsIHN0YXJ0KSwKQEAgLTM4Miw0ICszODUsMjUgQEAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFtpXSwgc2xpY2VzLmdldChpKSk7CiAgICAgfQotfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFNsaWNlc0ludGVyc2VjdChDbHVzdGVyaW5nQ29tcGFyYXRvciBjYywgU2xpY2UgczEsIFNsaWNlIHMyKQorICAgIHsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0SW50ZXJuYWwoY2MsIHMxLCBzMik7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdEludGVybmFsKGNjLCBTbGljZS5BTEwsIHMxKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0SW50ZXJuYWwoY2MsIFNsaWNlLkFMTCwgczIpOworICAgICAgICBhc3NlcnRTbGljZXNEb05vdEludGVyc2VjdChjYywgU2xpY2UubWFrZShDbHVzdGVyaW5nQm91bmQuZXhjbHVzaXZlU3RhcnRPZihDbHVzdGVyaW5nLkVNUFRZKSwgQ2x1c3RlcmluZ0JvdW5kLmV4Y2x1c2l2ZUVuZE9mKENsdXN0ZXJpbmcuRU1QVFkpKSwgczEpOworICAgICAgICBhc3NlcnRTbGljZXNEb05vdEludGVyc2VjdChjYywgU2xpY2UubWFrZShDbHVzdGVyaW5nQm91bmQuZXhjbHVzaXZlU3RhcnRPZihDbHVzdGVyaW5nLkVNUFRZKSwgQ2x1c3RlcmluZ0JvdW5kLmV4Y2x1c2l2ZUVuZE9mKENsdXN0ZXJpbmcuRU1QVFkpKSwgczIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRTbGljZXNJbnRlcnNlY3RJbnRlcm5hbChDbHVzdGVyaW5nQ29tcGFyYXRvciBjYywgU2xpY2UgczEsIFNsaWNlIHMyKQorICAgIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJTbGljZSAlcyBzaG91bGQgaW50ZXJzZWN0IHdpdGggc2xpY2UgJXMiLCBzMS50b1N0cmluZyhjYyksIHMyLnRvU3RyaW5nKGNjKSksIHMxLmludGVyc2VjdHMoY2MsIHMyKSk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiU2xpY2UgJXMgc2hvdWxkIGludGVyc2VjdCB3aXRoIHNsaWNlICVzIiwgczIudG9TdHJpbmcoY2MpLCBzMS50b1N0cmluZyhjYykpLCBzMi5pbnRlcnNlY3RzKGNjLCBzMSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRTbGljZXNEb05vdEludGVyc2VjdChDbHVzdGVyaW5nQ29tcGFyYXRvciBjYywgU2xpY2UgczEsIFNsaWNlIHMyKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UoU3RyaW5nLmZvcm1hdCgiU2xpY2UgJXMgc2hvdWxkIG5vdCBpbnRlcnNlY3Qgd2l0aCBzbGljZSAlcyIsIHMxLnRvU3RyaW5nKGNjKSwgczIudG9TdHJpbmcoY2MpKSwgczEuaW50ZXJzZWN0cyhjYywgczIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoU3RyaW5nLmZvcm1hdCgiU2xpY2UgJXMgc2hvdWxkIG5vdCBpbnRlcnNlY3Qgd2l0aCBzbGljZSAlcyIsIHMyLnRvU3RyaW5nKGNjKSwgczEudG9TdHJpbmcoY2MpKSwgczIuaW50ZXJzZWN0cyhjYywgczEpKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsQWxsb3dGaWx0ZXJpbmdUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxBbGxvd0ZpbHRlcmluZ1Rlc3QuamF2YQppbmRleCBjNDY0OThjLi41ZWNhODM5IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxBbGxvd0ZpbHRlcmluZ1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxBbGxvd0ZpbHRlcmluZ1Rlc3QuamF2YQpAQCAtMjIsOCArMjIsMTEgQEAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5yZXN0cmljdGlvbnMuU3RhdGVtZW50UmVzdHJpY3Rpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hS2V5c3BhY2VUYWJsZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DbGllbnRTdGF0ZTsKIAogcHVibGljIGNsYXNzIEd1YXJkcmFpbEFsbG93RmlsdGVyaW5nVGVzdCBleHRlbmRzIEd1YXJkcmFpbFRlc3RlcgogewpAQCAtMzMsNyArMzYsNyBAQAogICAgIHB1YmxpYyB2b2lkIHNldHVwVGVzdCgpCiAgICAgewogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgYSBpbnQsIGIgaW50KSIpOwotICAgICAgICBlbmFibGVTdGF0ZSA9IGdldEd1YXJkcmlhbCgpOworICAgICAgICBlbmFibGVTdGF0ZSA9IGdldEd1YXJkcmFpbCgpOwogICAgIH0KIAogICAgIEBBZnRlcgpAQCAtNDcsNyArNTAsNyBAQAogICAgICAgICBndWFyZHJhaWxzKCkuc2V0QWxsb3dGaWx0ZXJpbmdFbmFibGVkKGFsbG93RmlsdGVyaW5nRW5hYmxlZCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGdldEd1YXJkcmlhbCgpCisgICAgcHJpdmF0ZSBib29sZWFuIGdldEd1YXJkcmFpbCgpCiAgICAgewogICAgICAgICByZXR1cm4gZ3VhcmRyYWlscygpLmdldEFsbG93RmlsdGVyaW5nRW5hYmxlZCgpOwogICAgIH0KQEAgLTkxLDQgKzk0LDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hS2V5c3BhY2VUYWJsZXMuVEFCTEVTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYWJsZSgpKSk7CiAgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRBbGxvd0ZpbHRlcmluZygpCisgICAgeworICAgICAgICBzZXRHdWFyZHJhaWwodHJ1ZSk7CisgICAgICAgIGFzc2VydFJlcXVpcmVkQWxsb3dGaWx0ZXJpbmdUaHJvd3Moc3lzdGVtQ2xpZW50U3RhdGUsIFN0YXRlbWVudFJlc3RyaWN0aW9ucy5SRVFVSVJFU19BTExPV19GSUxURVJJTkdfTUVTU0FHRSk7CisgICAgICAgIGFzc2VydFJlcXVpcmVkQWxsb3dGaWx0ZXJpbmdUaHJvd3Moc3VwZXJDbGllbnRTdGF0ZSwgU3RhdGVtZW50UmVzdHJpY3Rpb25zLlJFUVVJUkVTX0FMTE9XX0ZJTFRFUklOR19NRVNTQUdFKTsKKyAgICAgICAgYXNzZXJ0UmVxdWlyZWRBbGxvd0ZpbHRlcmluZ1Rocm93cyh1c2VyQ2xpZW50U3RhdGUsIFN0YXRlbWVudFJlc3RyaWN0aW9ucy5SRVFVSVJFU19BTExPV19GSUxURVJJTkdfTUVTU0FHRSk7CisKKyAgICAgICAgc2V0R3VhcmRyYWlsKGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0UmVxdWlyZWRBbGxvd0ZpbHRlcmluZ1Rocm93cyhzeXN0ZW1DbGllbnRTdGF0ZSwgU3RhdGVtZW50UmVzdHJpY3Rpb25zLlJFUVVJUkVTX0FMTE9XX0ZJTFRFUklOR19NRVNTQUdFKTsKKyAgICAgICAgYXNzZXJ0UmVxdWlyZWRBbGxvd0ZpbHRlcmluZ1Rocm93cyhzdXBlckNsaWVudFN0YXRlLCBTdGF0ZW1lbnRSZXN0cmljdGlvbnMuUkVRVUlSRVNfQUxMT1dfRklMVEVSSU5HX01FU1NBR0UpOworICAgICAgICBhc3NlcnRSZXF1aXJlZEFsbG93RmlsdGVyaW5nVGhyb3dzKHVzZXJDbGllbnRTdGF0ZSwgU3RhdGVtZW50UmVzdHJpY3Rpb25zLkNBTk5PVF9VU0VfQUxMT1dfRklMVEVSSU5HX01FU1NBR0UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRSZXF1aXJlZEFsbG93RmlsdGVyaW5nVGhyb3dzKENsaWVudFN0YXRlIHN0YXRlLCBTdHJpbmcgbWVzc2FnZSkKKyAgICB7CisgICAgICAgIFN0cmluZyBxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGEgPSA1IjsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKCgpIC0+IGV4ZWN1dGUoc3RhdGUsIHF1ZXJ5KSwgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsIG1lc3NhZ2UpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbEFsdGVyVGFibGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxBbHRlclRhYmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYTcwOTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxBbHRlclRhYmxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHM7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworCisvKioKKyAqIFRlc3RzIHRoZSBndWFyZHJhaWwgZm9yIGRpc2FibGluZyB1c2VyIGFjY2VzcyB0byB0aGUgQUxURVIgVEFCTEUgc3RhdGVtZW50LCB7QGxpbmsgR3VhcmRyYWlscyNhbHRlclRhYmxlRW5hYmxlZH0uCisgKgorICogTk9URTogVGhpcyB0ZXN0IGNsYXNzIGRlcGVuZHMgb24ge0BsaW5rICNjdXJyZW50VGFibGUoKX0gbWV0aG9kIGZvciBzZXR1cCwgY2xlYW51cCwgYW5kIGV4ZWN1dGlvbiBvZiB0ZXN0cy4gWW91J2xsCisgKiBuZWVkIHRvIHJlZmFjdG9yIHRoaXMgaWYgeW91IGFkZCB0ZXN0cyB0aGF0IG1ha2UgY2hhbmdlcyB0byB0aGUgY3VycmVudCB0YWJsZSBhcyB0aGUgdGVzdCB0ZWFyZG93biB3aWxsIG5vIGxvbmdlciBtYXRjaAorICogc2V0dXAuCisgKi8KK3B1YmxpYyBjbGFzcyBHdWFyZHJhaWxBbHRlclRhYmxlVGVzdCBleHRlbmRzIEd1YXJkcmFpbFRlc3RlcgoreworICAgIHB1YmxpYyBHdWFyZHJhaWxBbHRlclRhYmxlVGVzdCgpCisgICAgeworICAgICAgICBzdXBlcihHdWFyZHJhaWxzLmFsdGVyVGFibGVFbmFibGVkKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXBUZXN0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICVzIChrIElOVCwgYyBJTlQsIHYgVEVYVCwgUFJJTUFSWSBLRVkoaywgYykpIik7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgYWZ0ZXJUZXN0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgZHJvcFRhYmxlKCJEUk9QIFRBQkxFICVzIik7CisgICAgICAgIHNldEd1YXJkcmFpbCh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0R3VhcmRyYWlsKGJvb2xlYW4gYWx0ZXJUYWJsZUVuYWJsZWQpCisgICAgeworICAgICAgICBndWFyZHJhaWxzKCkuc2V0QWx0ZXJUYWJsZUVuYWJsZWQoYWx0ZXJUYWJsZUVuYWJsZWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmZpcm0gdGhhdCBBTFRFUiBUQUJMRSBxdWVyaWVzIGVpdGhlciB3b3JrIChndWFyZHJhaWwgZW5hYmxlZCkgb3IgZmFpbCAoZ3VhcmRyYWlsIGRpc2FibGVkKSBhcHByb3ByaWF0ZWx5CisgICAgICogQHRocm93cyBUaHJvd2FibGUKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHdWFyZHJhaWxFbmFibGVkQW5kRGlzYWJsZWQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBzZXRHdWFyZHJhaWwoZmFsc2UpOworICAgICAgICBhc3NlcnRGYWlscygiQUxURVIgVEFCTEUgJXMgQUREIHRlc3Rfb25lIHRleHQ7IiwgImNoYW5naW5nIGNvbHVtbnMiKTsKKworICAgICAgICBzZXRHdWFyZHJhaWwodHJ1ZSk7CisgICAgICAgIGFzc2VydFZhbGlkKCJBTFRFUiBUQUJMRSAlcyBBREQgdGVzdF90d28gdGV4dDsiKTsKKworICAgICAgICBzZXRHdWFyZHJhaWwoZmFsc2UpOworICAgICAgICBhc3NlcnRGYWlscygiQUxURVIgVEFCTEUgJXMgQUREIHRlc3RfdGhyZWUgdGV4dDsiLCAiY2hhbmdpbmcgY29sdW1ucyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmZpcm0gdGhlIGd1YXJkcmFpbCBhcHByb3ByaWF0ZWx5IGNhdGNoZXMgdGhlIEFMVEVSIERST1AgY2FzZSBvbiBhIGNvbHVtbgorICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbGllc1RvQWx0ZXJEcm9wQ29sdW1uKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgc2V0R3VhcmRyYWlsKHRydWUpOworICAgICAgICBhc3NlcnRWYWxpZCgiQUxURVIgVEFCTEUgJXMgQUREIHRlc3Rfb25lIHRleHQ7Iik7CisKKyAgICAgICAgc2V0R3VhcmRyYWlsKGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkFMVEVSIFRBQkxFICVzIERST1AgdGVzdF9vbmUiLCAiY2hhbmdpbmcgY29sdW1ucyIpOworCisgICAgICAgIHNldEd1YXJkcmFpbCh0cnVlKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIkFMVEVSIFRBQkxFICVzIERST1AgdGVzdF9vbmUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25maXJtIHRoZSBndWFyZHJhaWwgYXBwcm9wcmlhdGVseSBjYXRjaGVzIHRoZSBBTFRFUiBSRU5BTUUgY2FzZSBvbiBhIGNvbHVtbgorICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbGllc1RvQWx0ZXJSZW5hbWVDb2x1bW4oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBzZXRHdWFyZHJhaWwoZmFsc2UpOworICAgICAgICBhc3NlcnRGYWlscygiQUxURVIgVEFCTEUgJXMgUkVOQU1FIGMgVE8gcmVuYW1lZF9jIiwgImNoYW5naW5nIGNvbHVtbnMiKTsKKworICAgICAgICBzZXRHdWFyZHJhaWwodHJ1ZSk7CisgICAgICAgIGFzc2VydFZhbGlkKCJBTFRFUiBUQUJMRSAlcyBSRU5BTUUgYyBUTyByZW5hbWVkX2MiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25maXJtIHdlIGNhbiBhbHdheXMgYWx0ZXIgcHJvcGVydGllcyB2aWEgdGhlIG9wdGlvbnMgbWFwIHJlZ2FyZGxlc3Mgb2YgZ3VhcmRyYWlsIHN0YXRlCisgICAgICogQHRocm93cyBUaHJvd2FibGUKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbHRlclZpYU1hcEFsd2F5c1dvcmtzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgc2V0R3VhcmRyYWlsKGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIkFMVEVSIFRBQkxFICVzIFdJVEggY29tcHJlc3Npb24gPSB7ICdjbGFzcycgOiAnU25hcHB5Q29tcHJlc3NvcicsICdjaHVua19sZW5ndGhfaW5fa2InIDogMzIgfTsiKTsKKworICAgICAgICBzZXRHdWFyZHJhaWwodHJ1ZSk7CisgICAgICAgIGFzc2VydFZhbGlkKCJBTFRFUiBUQUJMRSAlcyBXSVRIIGNvbXByZXNzaW9uID0geyAnY2xhc3MnIDogJ1NuYXBweUNvbXByZXNzb3InLCAnY2h1bmtfbGVuZ3RoX2luX2tiJyA6IDMyIH07Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlybSB0aGUgb3RoZXIgZm9ybSBvZiBBTFRFUiBUQUJMRSBwcm9wZXJ0eSBtYXAgY2hhbmdpbmcgYWx3YXlzIHdvcmtzIHJlZ2FyZGxlc3Mgb2YgZ3VhcmRyYWlsIHN0YXRlCisgICAgICogQHRocm93cyBUaHJvd2FibGUKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbHRlck9wdGlvbnNBbHdheXNXb3JrcygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHNldEd1YXJkcmFpbCh0cnVlKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIkFMVEVSIFRBQkxFICVzIFdJVEggR0NfR1JBQ0VfU0VDT05EUyA9IDQ1NjsgIik7CisKKyAgICAgICAgc2V0R3VhcmRyYWlsKGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIkFMVEVSIFRBQkxFICVzIFdJVEggR0NfR1JBQ0VfU0VDT05EUyA9IDEyMzsgIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsQ29sbGVjdGlvblNpemVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxDb2xsZWN0aW9uU2l6ZVRlc3QuamF2YQppbmRleCAxNDgzZTgxLi5iMTVmODVhIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxDb2xsZWN0aW9uU2l6ZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxDb2xsZWN0aW9uU2l6ZVRlc3QuamF2YQpAQCAtMjgsMTIgKzI4LDE0IEBACiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFTdG9yYWdlU3BlYzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVzVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkxpc3RUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTWFwVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlNldFR5cGU7CiAKIGltcG9ydCBzdGF0aWMgamF2YS5uaW8uQnl0ZUJ1ZmZlci5hbGxvY2F0ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFTdG9yYWdlU3BlYy5EYXRhU3RvcmFnZVVuaXQuQllURVM7CiAKIC8qKgogICogVGVzdHMgdGhlIGd1YXJkcmFpbCBmb3IgdGhlIHNpemUgb2YgY29sbGVjdGlvbnMsIHtAbGluayBHdWFyZHJhaWxzI2NvbGxlY3Rpb25TaXplfS4KQEAgLTUzLDcgKzU1LDkgQEAKICAgICAgICAgICAgICAgR3VhcmRyYWlscy5jb2xsZWN0aW9uU2l6ZSwKICAgICAgICAgICAgICAgR3VhcmRyYWlsczo6c2V0Q29sbGVjdGlvblNpemVUaHJlc2hvbGQsCiAgICAgICAgICAgICAgIEd1YXJkcmFpbHM6OmdldENvbGxlY3Rpb25TaXplV2FyblRocmVzaG9sZCwKLSAgICAgICAgICAgICAgR3VhcmRyYWlsczo6Z2V0Q29sbGVjdGlvblNpemVGYWlsVGhyZXNob2xkKTsKKyAgICAgICAgICAgICAgR3VhcmRyYWlsczo6Z2V0Q29sbGVjdGlvblNpemVGYWlsVGhyZXNob2xkLAorICAgICAgICAgICAgICBieXRlcyAtPiBuZXcgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kKGJ5dGVzLCBCWVRFUykudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgc2l6ZSAtPiBuZXcgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kKHNpemUpLnRvQnl0ZXMoKSk7CiAgICAgfQogCiAgICAgQEFmdGVyCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxDb2x1bW5WYWx1ZVNpemVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxDb2x1bW5WYWx1ZVNpemVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA1MTNkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbENvbHVtblZhbHVlU2l6ZVRlc3QuamF2YQpAQCAtMCwwICsxLDY1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFTdG9yYWdlU3BlYzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVzVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkxpc3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTWFwVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlNldFR5cGU7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CitpbXBvcnQgc3RhdGljIGphdmEubmlvLkJ5dGVCdWZmZXIuYWxsb2NhdGU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhU3RvcmFnZVNwZWMuRGF0YVN0b3JhZ2VVbml0LkJZVEVTOworCisvKioKKyAqIFRlc3RzIHRoZSBndWFyZHJhaWwgZm9yIHRoZSBzaXplIG9mIGNvbHVtbiB2YWx1ZXMsIHtAbGluayBHdWFyZHJhaWxzI2NvbHVtblZhbHVlU2l6ZX0uCisgKi8KK3B1YmxpYyBjbGFzcyBHdWFyZHJhaWxDb2x1bW5WYWx1ZVNpemVUZXN0IGV4dGVuZHMgVGhyZXNob2xkVGVzdGVyCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBUk5fVEhSRVNIT0xEID0gMTAyNDsgLy8gYnl0ZXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkFJTF9USFJFU0hPTEQgPSBXQVJOX1RIUkVTSE9MRCAqIDQ7IC8vIGJ5dGVzCisKKyAgICBwdWJsaWMgR3VhcmRyYWlsQ29sdW1uVmFsdWVTaXplVGVzdCgpCisgICAgeworICAgICAgICBzdXBlcihXQVJOX1RIUkVTSE9MRCArICJCIiwKKyAgICAgICAgICAgICAgRkFJTF9USFJFU0hPTEQgKyAiQiIsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHMuY29sdW1uVmFsdWVTaXplLAorICAgICAgICAgICAgICBHdWFyZHJhaWxzOjpzZXRDb2x1bW5WYWx1ZVNpemVUaHJlc2hvbGQsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHM6OmdldENvbHVtblZhbHVlU2l6ZVdhcm5UaHJlc2hvbGQsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHM6OmdldENvbHVtblZhbHVlU2l6ZUZhaWxUaHJlc2hvbGQsCisgICAgICAgICAgICAgIGJ5dGVzIC0+IG5ldyBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQoYnl0ZXMsIEJZVEVTKS50b1N0cmluZygpLAorICAgICAgICAgICAgICBzaXplIC0+IG5ldyBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQoc2l6ZSkudG9CeXRlcygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVQYXJ0aXRpb25LZXkoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIHRleHQgUFJJTUFSWSBLRVksIHYgaW50KSIpOworCisgICAgICAgIC8vIHRoZSBzaXplIG9mIHByaW1hcnkga2V5IGNvbHVtbnMgaXMgbm90IGd1YXJkZWQgYmVjYXVzZSB0aGV5IGFscmVhZHkgaGF2ZSBhIGZpeGVkIGxpbWl0IG9mIDY1NTM1QgorCisgICAgICAgIHRlc3ROb1RocmVzaG9sZCgiSU5TRVJUIElOVE8gJXMgKGssIHYpIFZBTFVFUyAoPywgMCkiKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJVUERBVEUgJXMgU0VUIHYgPSAxIFdIRVJFIGsgPSA/Iik7CisgICAgICAgIHRlc3ROb1RocmVzaG9sZCgiREVMRVRFIHYgRlJPTSAlcyBXSEVSRSBrID0gPyIpOworICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQoIkRFTEVURSBGUk9NICVzIFdIRVJFIGsgPSA/Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcG9zaXRlUGFydGl0aW9uS2V5KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoazEgdGV4dCwgazIgdGV4dCwgdiBpbnQsIFBSSU1BUlkgS0VZKChrMSwgazIpKSkiKTsKKworICAgICAgICAvLyB0aGUgc2l6ZSBvZiBwcmltYXJ5IGtleSBjb2x1bW5zIGlzIG5vdCBndWFyZGVkIGJlY2F1c2UgdGhleSBhbHJlYWR5IGhhdmUgYSBmaXhlZCBsaW1pdCBvZiA2NTUzNUIKKworICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQyKCJJTlNFUlQgSU5UTyAlcyAoazEsIGsyLCB2KSBWQUxVRVMgKD8sID8sIDApIik7CisgICAgICAgIHRlc3ROb1RocmVzaG9sZDIoIlVQREFURSAlcyBTRVQgdiA9IDEgV0hFUkUgazEgPSA/IEFORCBrMiA9ID8iKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkMigiREVMRVRFIHYgRlJPTSAlcyBXSEVSRSBrMSA9ID8gQU5EIGsyID0gPyIpOworICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQyKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrMSA9ID8gQU5EIGsyID0gPyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZUNsdXN0ZXJpbmcoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCwgYyB0ZXh0LCB2IGludCwgUFJJTUFSWSBLRVkoaywgYykpIik7CisKKyAgICAgICAgLy8gdGhlIHNpemUgb2YgcHJpbWFyeSBrZXkgY29sdW1ucyBpcyBub3QgZ3VhcmRlZCBiZWNhdXNlIHRoZXkgYWxyZWFkeSBoYXZlIGEgZml4ZWQgbGltaXQgb2YgNjU1MzVCCisKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJJTlNFUlQgSU5UTyAlcyAoaywgYywgdikgVkFMVUVTICgwLCA/LCAwKSIpOworICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQoIlVQREFURSAlcyBTRVQgdiA9IDEgV0hFUkUgayA9IDAgQU5EIGMgPSA/Iik7CisgICAgICAgIHRlc3ROb1RocmVzaG9sZCgiREVMRVRFIHYgRlJPTSAlcyBXSEVSRSBrID0gMCBBTkQgYyA9ID8iKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrID0gMCBBTkQgYyA9ID8iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wb3NpdGVDbHVzdGVyaW5nKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQsIGMxIHRleHQsIGMyIHRleHQsIHYgaW50LCBQUklNQVJZIEtFWShrLCBjMSwgYzIpKSIpOworCisgICAgICAgIC8vIHRoZSBzaXplIG9mIHByaW1hcnkga2V5IGNvbHVtbnMgaXMgbm90IGd1YXJkZWQgYmVjYXVzZSB0aGV5IGFscmVhZHkgaGF2ZSBhIGZpeGVkIGxpbWl0IG9mIDY1NTM1QgorCisgICAgICAgIHRlc3ROb1RocmVzaG9sZCgiREVMRVRFIEZST00gJXMgV0hFUkUgayA9IDAgQU5EIGMxID0gPyIpOworICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQoIkRFTEVURSBGUk9NICVzIFdIRVJFIGsgPSAwIEFORCBjMSA+ID8iKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrID0gMCBBTkQgYzEgPCA/Iik7CisgICAgICAgIHRlc3ROb1RocmVzaG9sZCgiREVMRVRFIEZST00gJXMgV0hFUkUgayA9IDAgQU5EIGMxID49ID8iKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrID0gMCBBTkQgYzEgPD0gPyIpOworCisgICAgICAgIHRlc3ROb1RocmVzaG9sZDIoIklOU0VSVCBJTlRPICVzIChrLCBjMSwgYzIsIHYpIFZBTFVFUyAoMCwgPywgPywgMCkiKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkMigiVVBEQVRFICVzIFNFVCB2ID0gMSBXSEVSRSBrID0gMCBBTkQgYzEgPSA/IEFORCBjMiA9ID8iKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkMigiREVMRVRFIHYgRlJPTSAlcyBXSEVSRSBrID0gMCBBTkQgYzEgPSA/IEFORCBjMiA9ID8iKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkMigiREVMRVRFIEZST00gJXMgV0hFUkUgayA9IDAgQU5EIGMxID0gPyBBTkQgYzIgPSA/Iik7CisgICAgICAgIHRlc3ROb1RocmVzaG9sZDIoIkRFTEVURSBGUk9NICVzIFdIRVJFIGsgPSAwIEFORCBjMSA9ID8gQU5EIGMyID4gPyIpOworICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQyKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrID0gMCBBTkQgYzEgPSA/IEFORCBjMiA8ID8iKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkMigiREVMRVRFIEZST00gJXMgV0hFUkUgayA9IDAgQU5EIGMxID0gPyBBTkQgYzIgPj0gPyIpOworICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQyKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrID0gMCBBTkQgYzEgPSA/IEFORCBjMiA8PSA/Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVndWxhckNvbHVtbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB2IHRleHQpIik7CisKKyAgICAgICAgdGVzdFRocmVzaG9sZCgidiIsICJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgwLCA/KSIpOworICAgICAgICB0ZXN0VGhyZXNob2xkKCJ2IiwgIlVQREFURSAlcyBTRVQgdiA9ID8gV0hFUkUgayA9IDAiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0aWNDb2x1bW4oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCwgYyBpbnQsIHMgdGV4dCBTVEFUSUMsIHIgaW50LCBQUklNQVJZIEtFWShrLCBjKSkiKTsKKworICAgICAgICB0ZXN0VGhyZXNob2xkKCJzIiwgIklOU0VSVCBJTlRPICVzIChrLCBzKSBWQUxVRVMgKDAsID8pIik7CisgICAgICAgIHRlc3RUaHJlc2hvbGQoInMiLCAiSU5TRVJUIElOVE8gJXMgKGssIGMsIHMsIHIpIFZBTFVFUyAoMCwgMCwgPywgMCkiKTsKKyAgICAgICAgdGVzdFRocmVzaG9sZCgicyIsICJVUERBVEUgJXMgU0VUIHMgPSA/IFdIRVJFIGsgPSAwIik7CisgICAgICAgIHRlc3RUaHJlc2hvbGQoInMiLCAiVVBEQVRFICVzIFNFVCBzID0gPywgciA9IDAgV0hFUkUgayA9IDAgQU5EIGMgPSAwIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHVwbGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdCB0dXBsZTx0ZXh0LCB0ZXh0PikiKTsKKworICAgICAgICB0ZXN0VGhyZXNob2xkMigidCIsICJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICgwLCAoPywgPykpIiwgOCk7CisgICAgICAgIHRlc3RUaHJlc2hvbGQyKCJ0IiwgIlVQREFURSAlcyBTRVQgdCA9ICg/LCA/KSBXSEVSRSBrID0gMCIsIDgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVEVCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFN0cmluZyB1ZHQgPSBjcmVhdGVUeXBlKCJDUkVBVEUgVFlQRSAlcyAoYSB0ZXh0LCBiIHRleHQpIik7CisgICAgICAgIGNyZWF0ZVRhYmxlKGZvcm1hdCgiQ1JFQVRFIFRBQkxFICUlcyAoayBpbnQgUFJJTUFSWSBLRVksIHUgJXMpIiwgdWR0KSk7CisKKyAgICAgICAgdGVzdFRocmVzaG9sZCgidSIsICJJTlNFUlQgSU5UTyAlcyAoaywgdSkgVkFMVUVTICgwLCB7YTogP30pIik7CisgICAgICAgIHRlc3RUaHJlc2hvbGQoInUiLCAiSU5TRVJUIElOVE8gJXMgKGssIHUpIFZBTFVFUyAoMCwge2I6ID99KSIpOworICAgICAgICB0ZXN0VGhyZXNob2xkKCJ1IiwgIlVQREFURSAlcyBTRVQgdSA9IHthOiA/fSBXSEVSRSBrID0gMCIpOworICAgICAgICB0ZXN0VGhyZXNob2xkKCJ1IiwgIlVQREFURSAlcyBTRVQgdSA9IHtiOiA/fSBXSEVSRSBrID0gMCIpOworICAgICAgICB0ZXN0VGhyZXNob2xkKCJ1IiwgIlVQREFURSAlcyBTRVQgdS5hID0gPyBXSEVSRSBrID0gMCIpOworICAgICAgICB0ZXN0VGhyZXNob2xkKCJ1IiwgIlVQREFURSAlcyBTRVQgdS5iID0gPyBXSEVSRSBrID0gMCIpOworICAgICAgICB0ZXN0VGhyZXNob2xkMigidSIsICJJTlNFUlQgSU5UTyAlcyAoaywgdSkgVkFMVUVTICgwLCB7YTogPywgYjogP30pIik7CisgICAgICAgIHRlc3RUaHJlc2hvbGQyKCJ1IiwgIlVQREFURSAlcyBTRVQgdS5hID0gPywgdS5iID0gPyBXSEVSRSBrID0gMCIpOworICAgICAgICB0ZXN0VGhyZXNob2xkMigidSIsICJVUERBVEUgJXMgU0VUIHUgPSB7YTogPywgYjogP30gV0hFUkUgayA9IDAiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGcm96ZW5VRFQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBTdHJpbmcgdWR0ID0gY3JlYXRlVHlwZSgiQ1JFQVRFIFRZUEUgJXMgKGEgdGV4dCwgYiB0ZXh0KSIpOworICAgICAgICBjcmVhdGVUYWJsZShmb3JtYXQoIkNSRUFURSBUQUJMRSAlJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB2IGZyb3plbjwlcz4pIiwgdWR0KSk7CisKKyAgICAgICAgdGVzdFRocmVzaG9sZCgidiIsICJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgwLCB7YTogP30pIiwgOCk7CisgICAgICAgIHRlc3RUaHJlc2hvbGQoInYiLCAiSU5TRVJUIElOVE8gJXMgKGssIHYpIFZBTFVFUyAoMCwge2I6ID99KSIsIDgpOworICAgICAgICB0ZXN0VGhyZXNob2xkKCJ2IiwgIlVQREFURSAlcyBTRVQgdiA9IHthOiA/fSBXSEVSRSBrID0gMCIsIDgpOworICAgICAgICB0ZXN0VGhyZXNob2xkKCJ2IiwgIlVQREFURSAlcyBTRVQgdiA9IHtiOiA/fSBXSEVSRSBrID0gMCIsIDgpOworICAgICAgICB0ZXN0VGhyZXNob2xkMigidiIsICJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgwLCB7YTogPywgYjogP30pIiwgOCk7CisgICAgICAgIHRlc3RUaHJlc2hvbGQyKCJ2IiwgIlVQREFURSAlcyBTRVQgdiA9IHthOiA/LCBiOiA/fSBXSEVSRSBrID0gMCIsIDgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZFVEVCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFN0cmluZyBpbm5lciA9IGNyZWF0ZVR5cGUoIkNSRUFURSBUWVBFICVzIChjIHRleHQsIGQgdGV4dCkiKTsKKyAgICAgICAgU3RyaW5nIG91dGVyID0gY3JlYXRlVHlwZShmb3JtYXQoIkNSRUFURSBUWVBFICUlcyAoYSB0ZXh0LCBiIGZyb3plbjwlcz4pIiwgaW5uZXIpKTsKKyAgICAgICAgY3JlYXRlVGFibGUoZm9ybWF0KCJDUkVBVEUgVEFCTEUgJSVzIChrIGludCBQUklNQVJZIEtFWSwgdiAlcykiLCBvdXRlcikpOworCisgICAgICAgIGZvciAoU3RyaW5nIHF1ZXJ5IDogQXJyYXlzLmFzTGlzdCgiSU5TRVJUIElOVE8gJXMgKGssIHYpIFZBTFVFUyAoMCwge2E6ID8sIGI6IHtjOiA/LCBkOiA/fX0pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVUERBVEUgJXMgU0VUIHYgPSB7YTogPywgYjoge2M6ID8sIGQ6ID99fSBXSEVSRSBrID0gMCIpKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUoMCksIGFsbG9jYXRlKDApLCBhbGxvY2F0ZSgwKSk7CisgICAgICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgLSA4KSwgYWxsb2NhdGUoMCksIGFsbG9jYXRlKDApKTsKKyAgICAgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBhbGxvY2F0ZSgwKSwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgLSA4KSwgYWxsb2NhdGUoMCkpOworICAgICAgICAgICAgYXNzZXJ0VmFsaWQocXVlcnksIGFsbG9jYXRlKDApLCBhbGxvY2F0ZSgwKSwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgLSA4KSk7CisKKyAgICAgICAgICAgIGFzc2VydFdhcm5zKCJ2IiwgcXVlcnksIGFsbG9jYXRlKFdBUk5fVEhSRVNIT0xEICsgMSksIGFsbG9jYXRlKDApLCBhbGxvY2F0ZSgwKSk7CisgICAgICAgICAgICBhc3NlcnRXYXJucygidiIsIHF1ZXJ5LCBhbGxvY2F0ZSgwKSwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgLSA3KSwgYWxsb2NhdGUoMCkpOworICAgICAgICAgICAgYXNzZXJ0V2FybnMoInYiLCBxdWVyeSwgYWxsb2NhdGUoMCksIGFsbG9jYXRlKDApLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCAtIDcpKTsKKworICAgICAgICAgICAgYXNzZXJ0RmFpbHMoInYiLCBxdWVyeSwgYWxsb2NhdGUoRkFJTF9USFJFU0hPTEQgKyAxKSwgYWxsb2NhdGUoMCksIGFsbG9jYXRlKDApKTsKKyAgICAgICAgICAgIGFzc2VydEZhaWxzKCJ2IiwgcXVlcnksIGFsbG9jYXRlKDApLCBhbGxvY2F0ZShGQUlMX1RIUkVTSE9MRCAtIDcpLCBhbGxvY2F0ZSgwKSk7CisgICAgICAgICAgICBhc3NlcnRGYWlscygidiIsIHF1ZXJ5LCBhbGxvY2F0ZSgwKSwgYWxsb2NhdGUoMCksIGFsbG9jYXRlKEZBSUxfVEhSRVNIT0xEIC0gNykpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCBsIGxpc3Q8dGV4dD4pIik7CisKKyAgICAgICAgZm9yIChTdHJpbmcgcXVlcnkgOiBBcnJheXMuYXNMaXN0KCJJTlNFUlQgSU5UTyAlcyAoaywgbCkgVkFMVUVTICgwLCA/KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVBEQVRFICVzIFNFVCBsID0gPyBXSEVSRSBrID0gMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVBEQVRFICVzIFNFVCBsID0gbCArID8gV0hFUkUgayA9IDAiKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGVzdENvbGxlY3Rpb24oImwiLCBxdWVyeSwgdGhpczo6bGlzdCk7CisgICAgICAgIH0KKworICAgICAgICB0ZXN0VGhyZXNob2xkKCJsIiwgIlVQREFURSAlcyBTRVQgbFswXSA9ID8gV0hFUkUgayA9IDAiKTsKKworICAgICAgICBTdHJpbmcgcXVlcnkgPSAiVVBEQVRFICVzIFNFVCBsID0gbCAtID8gV0hFUkUgayA9IDAiOworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgdGhpczo6bGlzdCwgYWxsb2NhdGUoMSkpOworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgdGhpczo6bGlzdCwgYWxsb2NhdGUoRkFJTF9USFJFU0hPTEQpKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQocXVlcnksIHRoaXM6Omxpc3QsIGFsbG9jYXRlKEZBSUxfVEhSRVNIT0xEICsgMSkpOyAvLyBEb2Vzbid0IHdyaXRlIGFueXRoaW5nIGJlY2F1c2Ugd2UgY291bGRuJ3Qgd3JpdGUKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGcm96ZW5MaXN0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIGZsIGZyb3plbjxsaXN0PHRleHQ+PikiKTsKKworICAgICAgICAvLyB0aGUgc2VyaWFsaXplZCBzaXplIG9mIGEgZnJvemVuIGxpc3QgaXMgdGhlIHNpemUgb2YgaXRzIHNlcmlhbGl6ZWQgZWxlbWVudHMsIHBsdXMgYSAzMi1iaXQgaW50ZWdlciBwcmVmaXggZm9yCisgICAgICAgIC8vIHRoZSBudW1iZXIgb2YgZWxlbWVudHMsIGFuZCBhbm90aGVyIDMyLWJpdCBpbnRlZ2VyIGZvciB0aGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQKKworICAgICAgICBmb3IgKFN0cmluZyBxdWVyeSA6IEFycmF5cy5hc0xpc3QoIklOU0VSVCBJTlRPICVzIChrLCBmbCkgVkFMVUVTICgwLCA/KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVBEQVRFICVzIFNFVCBmbCA9ID8gV0hFUkUgayA9IDAiKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGVzdEZyb3plbkNvbGxlY3Rpb24oImZsIiwgcXVlcnksIHRoaXM6Omxpc3QpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIHMgc2V0PHRleHQ+KSIpOworCisgICAgICAgIGZvciAoU3RyaW5nIHF1ZXJ5IDogQXJyYXlzLmFzTGlzdCgiSU5TRVJUIElOVE8gJXMgKGssIHMpIFZBTFVFUyAoMCwgPykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVQREFURSAlcyBTRVQgcyA9ID8gV0hFUkUgayA9IDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVQREFURSAlcyBTRVQgcyA9IHMgKyA/IFdIRVJFIGsgPSAwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVUERBVEUgJXMgU0VUIHMgPSBzIC0gPyBXSEVSRSBrID0gMCIpKQorICAgICAgICB7CisgICAgICAgICAgICB0ZXN0Q29sbGVjdGlvbigicyIsIHF1ZXJ5LCB0aGlzOjpzZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0V2l0aENsdXN0ZXJpbmcoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCwgYzEgaW50LCBjMiBpbnQsIHMgc2V0PHRleHQ+LCBQUklNQVJZIEtFWShrLCBjMSwgYzIpKSIpOworCisgICAgICAgIGZvciAoU3RyaW5nIHF1ZXJ5IDogQXJyYXlzLmFzTGlzdCgiSU5TRVJUIElOVE8gJXMgKGssIGMxLCBjMiwgcykgVkFMVUVTICgwLCAwLCAwLCA/KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVBEQVRFICVzIFNFVCBzID0gPyBXSEVSRSBrID0gMCBBTkQgYzEgPSAwIEFORCBjMiA9IDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVQREFURSAlcyBTRVQgcyA9IHMgKyA/IFdIRVJFIGsgPSAwIEFORCBjMSA9IDAgQU5EIGMyID0gMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVBEQVRFICVzIFNFVCBzID0gcyAtID8gV0hFUkUgayA9IDAgQU5EIGMxID0gMCBBTkQgYzIgPSAwIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlc3RDb2xsZWN0aW9uKCJzIiwgcXVlcnksIHRoaXM6OnNldCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGcm96ZW5TZXQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgZnMgZnJvemVuPHNldDx0ZXh0Pj4pIik7CisKKyAgICAgICAgLy8gdGhlIHNlcmlhbGl6ZWQgc2l6ZSBvZiBhIGZyb3plbiBzZXQgaXMgdGhlIHNpemUgb2YgaXRzIHNlcmlhbGl6ZWQgZWxlbWVudHMsIHBsdXMgYSAzMi1iaXQgaW50ZWdlciBwcmVmaXggZm9yCisgICAgICAgIC8vIHRoZSBudW1iZXIgb2YgZWxlbWVudHMsIGFuZCBhbm90aGVyIDMyLWJpdCBpbnRlZ2VyIGZvciB0aGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQKKworICAgICAgICBmb3IgKFN0cmluZyBxdWVyeSA6IEFycmF5cy5hc0xpc3QoIklOU0VSVCBJTlRPICVzIChrLCBmcykgVkFMVUVTICgwLCA/KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVBEQVRFICVzIFNFVCBmcyA9ID8gV0hFUkUgayA9IDAiKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGVzdEZyb3plbkNvbGxlY3Rpb24oImZzIiwgcXVlcnksIHRoaXM6OnNldCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXAoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgbSBtYXA8dGV4dCwgdGV4dD4pIik7CisKKyAgICAgICAgZm9yIChTdHJpbmcgcXVlcnkgOiBBcnJheXMuYXNMaXN0KCJJTlNFUlQgSU5UTyAlcyAoaywgbSkgVkFMVUVTICgwLCA/KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVBEQVRFICVzIFNFVCBtID0gPyBXSEVSRSBrID0gMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVBEQVRFICVzIFNFVCBtID0gbSArID8gV0hFUkUgayA9IDAiKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGVzdE1hcCgibSIsIHF1ZXJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIHRlc3RUaHJlc2hvbGQyKCJtIiwgIlVQREFURSAlcyBTRVQgbVs/XSA9ID8gV0hFUkUgayA9IDAiKTsKKyAgICAgICAgdGVzdENvbGxlY3Rpb24oIm0iLCAiVVBEQVRFICVzIFNFVCBtID0gbSAtID8gV0hFUkUgayA9IDAiLCB0aGlzOjpzZXQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hcFdpdGhDbHVzdGVyaW5nKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQsIGMxIGludCwgYzIgaW50LCBtYyBtYXA8dGV4dCwgdGV4dD4sIFBSSU1BUlkgS0VZKGssIGMxLCBjMikpIik7CisgICAgICAgIHRlc3RNYXAoIm1jIiwgIklOU0VSVCBJTlRPICVzIChrLCBjMSwgYzIsIG1jKSBWQUxVRVMgKDAsIDAsIDAsID8pIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RnJvemVuTWFwKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksZm0gZnJvemVuPG1hcDx0ZXh0LCB0ZXh0Pj4pIik7CisKKyAgICAgICAgLy8gdGhlIHNlcmlhbGl6ZWQgc2l6ZSBvZiBhIGZyb3plbiBtYXAgaXMgdGhlIHNpemUgb2YgdGhlIHNlcmlhbGl6ZWQgdmFsdWVzIHBsdXMgYSAzMi1iaXQgaW50ZWdlciBwcmVmaXggZm9yIHRoZQorICAgICAgICAvLyBudW1iZXIgb2Yga2V5LXZhbHVlIHBhaXJzLCBhbmQgYW5vdGhlciAzMi1iaXQgaW50ZWdlciBmb3IgdGhlIHNpemUgb2YgZWFjaCB2YWx1ZQorCisgICAgICAgIGZvciAoU3RyaW5nIHF1ZXJ5IDogQXJyYXlzLmFzTGlzdCgiSU5TRVJUIElOVE8gJXMgKGssIGZtKSBWQUxVRVMgKDAsID8pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVUERBVEUgJXMgU0VUIGZtID0gPyBXSEVSRSBrID0gMCIpKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgdGhpczo6bWFwLCBhbGxvY2F0ZSgxKSwgYWxsb2NhdGUoMSkpOworICAgICAgICAgICAgYXNzZXJ0VmFsaWQocXVlcnksIHRoaXM6Om1hcCwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgLSAxMyksIGFsbG9jYXRlKDEpKTsKKyAgICAgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCB0aGlzOjptYXAsIGFsbG9jYXRlKDEpLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCAtIDEzKSk7CisKKyAgICAgICAgICAgIGFzc2VydFdhcm5zKCJmbSIsIHF1ZXJ5LCB0aGlzOjptYXAsIGFsbG9jYXRlKFdBUk5fVEhSRVNIT0xEIC0gMTIpLCBhbGxvY2F0ZSgxKSk7CisgICAgICAgICAgICBhc3NlcnRXYXJucygiZm0iLCBxdWVyeSwgdGhpczo6bWFwLCBhbGxvY2F0ZSgxKSwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgLSAxMikpOworCisgICAgICAgICAgICBhc3NlcnRGYWlscygiZm0iLCBxdWVyeSwgdGhpczo6bWFwLCBhbGxvY2F0ZShGQUlMX1RIUkVTSE9MRCAtIDEyKSwgYWxsb2NhdGUoMSkpOworICAgICAgICAgICAgYXNzZXJ0RmFpbHMoImZtIiwgcXVlcnksIHRoaXM6Om1hcCwgYWxsb2NhdGUoMSksIGFsbG9jYXRlKEZBSUxfVEhSRVNIT0xEIC0gMTIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhdGNoKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayB0ZXh0LCBjIHRleHQsIHIgdGV4dCwgcyB0ZXh0IFNUQVRJQywgUFJJTUFSWSBLRVkoaywgYykpIik7CisKKyAgICAgICAgLy8gcGFydGl0aW9uIGtleQorICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQoIkJFR0lOIEJBVENIIElOU0VSVCBJTlRPICVzIChrLCBjLCByKSBWQUxVRVMgKD8sICcwJywgJzAnKTsgQVBQTFkgQkFUQ0g7Iik7CisgICAgICAgIHRlc3ROb1RocmVzaG9sZCgiQkVHSU4gQkFUQ0ggVVBEQVRFICVzIFNFVCByID0gJzAnIFdIRVJFIGsgPSA/IEFORCBjID0gJzAnOyBBUFBMWSBCQVRDSDsiKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJCRUdJTiBCQVRDSCBERUxFVEUgciBGUk9NICVzIFdIRVJFIGsgPSA/IEFORCBjID0gJzAnOyBBUFBMWSBCQVRDSDsiKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJCRUdJTiBCQVRDSCBERUxFVEUgRlJPTSAlcyBXSEVSRSBrID0gPzsgQVBQTFkgQkFUQ0g7Iik7CisKKyAgICAgICAgLy8gc3RhdGljIGNvbHVtbgorICAgICAgICB0ZXN0VGhyZXNob2xkKCJzIiwgIkJFR0lOIEJBVENIIElOU0VSVCBJTlRPICVzIChrLCBzKSBWQUxVRVMgKCcwJywgPyk7IEFQUExZIEJBVENIOyIpOworICAgICAgICB0ZXN0VGhyZXNob2xkKCJzIiwgIkJFR0lOIEJBVENIIElOU0VSVCBJTlRPICVzIChrLCBzLCBjLCByKSBWQUxVRVMgKCcwJywgPywgJzAnLCAnMCcpOyBBUFBMWSBCQVRDSDsiKTsKKyAgICAgICAgdGVzdFRocmVzaG9sZCgicyIsICJCRUdJTiBCQVRDSCBVUERBVEUgJXMgU0VUIHMgPSA/IFdIRVJFIGsgPSAnMCc7IEFQUExZIEJBVENIOyIpOworICAgICAgICB0ZXN0VGhyZXNob2xkKCJzIiwgIkJFR0lOIEJBVENIIFVQREFURSAlcyBTRVQgcyA9ID8sIHIgPSAnMCcgV0hFUkUgayA9ICcwJyBBTkQgYyA9ICcwJzsgQVBQTFkgQkFUQ0g7Iik7CisKKyAgICAgICAgLy8gY2x1c3RlcmluZyBrZXkKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJCRUdJTiBCQVRDSCBJTlNFUlQgSU5UTyAlcyAoaywgYywgcikgVkFMVUVTICgnMCcsID8sICcwJyk7IEFQUExZIEJBVENIOyIpOworICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQoIkJFR0lOIEJBVENIIFVQREFURSAlcyBTRVQgciA9ICcwJyBXSEVSRSBrID0gJzAnIEFORCBjID0gPzsgQVBQTFkgQkFUQ0g7Iik7CisgICAgICAgIHRlc3ROb1RocmVzaG9sZCgiQkVHSU4gQkFUQ0ggREVMRVRFIHIgRlJPTSAlcyBXSEVSRSBrID0gJzAnIEFORCBjID0gPzsgQVBQTFkgQkFUQ0g7Iik7CisgICAgICAgIHRlc3ROb1RocmVzaG9sZCgiQkVHSU4gQkFUQ0ggREVMRVRFIEZST00gJXMgV0hFUkUgayA9ICcwJyBBTkQgYyA9ID87IEFQUExZIEJBVENIOyIpOworCisgICAgICAgIC8vIHJlZ3VsYXIgY29sdW1uCisgICAgICAgIHRlc3RUaHJlc2hvbGQoInIiLCAiQkVHSU4gQkFUQ0ggSU5TRVJUIElOVE8gJXMgKGssIGMsIHIpIFZBTFVFUyAoJzAnLCAnMCcsID8pOyBBUFBMWSBCQVRDSDsiKTsKKyAgICAgICAgdGVzdFRocmVzaG9sZCgiciIsICJCRUdJTiBCQVRDSCBVUERBVEUgJXMgU0VUIHIgPSA/IFdIRVJFIGsgPSAnMCcgQU5EIGMgPSAnMCc7IEFQUExZIEJBVENIOyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENBU1dpdGhJZk5vdEV4aXN0c0NvbmRpdGlvbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgdGV4dCwgYyB0ZXh0LCB2IHRleHQsIHMgdGV4dCBTVEFUSUMsIFBSSU1BUlkgS0VZKGssIGMpKSIpOworCisgICAgICAgIC8vIHBhcnRpdGlvbiBrZXkKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJJTlNFUlQgSU5UTyAlcyAoaywgYywgdikgVkFMVUVTICg/LCAnMCcsICcwJykgSUYgTk9UIEVYSVNUUyIpOworCisgICAgICAgIC8vIGNsdXN0ZXJpbmcga2V5CisgICAgICAgIHRlc3ROb1RocmVzaG9sZCgiSU5TRVJUIElOVE8gJXMgKGssIGMsIHYpIFZBTFVFUyAoJzAnLCA/LCAnMCcpIElGIE5PVCBFWElTVFMiKTsKKworICAgICAgICAvLyBzdGF0aWMgY29sdW1uCisgICAgICAgIGFzc2VydFZhbGlkKCJJTlNFUlQgSU5UTyAlcyAoaywgcykgVkFMVUVTICgnMScsID8pIElGIE5PVCBFWElTVFMiLCBhbGxvY2F0ZSgxKSk7CisgICAgICAgIGFzc2VydFZhbGlkKCJJTlNFUlQgSU5UTyAlcyAoaywgcykgVkFMVUVTICgnMicsID8pIElGIE5PVCBFWElTVFMiLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCkpOworICAgICAgICBhc3NlcnRWYWxpZCgiSU5TRVJUIElOVE8gJXMgKGssIHMpIFZBTFVFUyAoJzInLCA/KSBJRiBOT1QgRVhJU1RTIiwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgKyAxKSk7IC8vIG5vdCBhcHBsaWVkCisgICAgICAgIGFzc2VydFdhcm5zKCJzIiwgIklOU0VSVCBJTlRPICVzIChrLCBzKSBWQUxVRVMgKCczJywgPykgSUYgTk9UIEVYSVNUUyIsIGFsbG9jYXRlKFdBUk5fVEhSRVNIT0xEICsgMSkpOworCisgICAgICAgIC8vIHJlZ3VsYXIgY29sdW1uCisgICAgICAgIGFzc2VydFZhbGlkKCJJTlNFUlQgSU5UTyAlcyAoaywgYywgdikgVkFMVUVTICgnNCcsICcwJywgPykgSUYgTk9UIEVYSVNUUyIsIGFsbG9jYXRlKDEpKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKCc1JywgJzAnLCA/KSBJRiBOT1QgRVhJU1RTIiwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQpKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKCc1JywgJzAnLCA/KSBJRiBOT1QgRVhJU1RTIiwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgKyAxKSk7IC8vIG5vdCBhcHBsaWVkCisgICAgICAgIGFzc2VydFdhcm5zKCJ2IiwgIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKCc2JywgJzAnLCA/KSBJRiBOT1QgRVhJU1RTIiwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgKyAxKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q0FTV2l0aElmRXhpc3RzQ29uZGl0aW9uKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayB0ZXh0LCBjIHRleHQsIHYgdGV4dCwgcyB0ZXh0IFNUQVRJQywgUFJJTUFSWSBLRVkoaywgYykpIik7CisKKyAgICAgICAgLy8gcGFydGl0aW9uIGtleSwgdGhlIENBUyB1cGRhdGVzIHdpdGggdmFsdWVzIGJleW9uZCB0aGUgdGhyZXNob2xkIGFyZSBub3QgYXBwbGllZCBzbyB0aGV5IGRvbid0IGNvbWUgdG8gZmFpbAorICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQoIlVQREFURSAlcyBTRVQgdiA9ICcwJyBXSEVSRSBrID0gPyBBTkQgYyA9ICcwJyBJRiBFWElTVFMiKTsKKworICAgICAgICAvLyBjbHVzdGVyaW5nIGtleSwgdGhlIENBUyB1cGRhdGVzIHdpdGggdmFsdWVzIGJleW9uZCB0aGUgdGhyZXNob2xkIGFyZSBub3QgYXBwbGllZCBzbyB0aGV5IGRvbid0IGNvbWUgdG8gZmFpbAorICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQoIlVQREFURSAlcyBTRVQgdiA9ICcwJyBXSEVSRSBrID0gJzAnIEFORCBjID0gPyBJRiBFWElTVFMiKTsKKworICAgICAgICAvLyBzdGF0aWMgY29sdW1uLCBvbmx5IHRoZSBhcHBsaWVkIENBUyB1cGRhdGVzIGNhbiBmaXJlIHRoZSBndWFyZHJhaWwKKyAgICAgICAgYXNzZXJ0VmFsaWQoIklOU0VSVCBJTlRPICVzIChrLCBzKSBWQUxVRVMgKCcwJywgJzAnKSIpOworICAgICAgICB0ZXN0VGhyZXNob2xkKCJzIiwgIlVQREFURSAlcyBTRVQgcyA9ID8gV0hFUkUgayA9ICcwJyBJRiBFWElTVFMiKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIkRFTEVURSBGUk9NICVzIFdIRVJFIGsgPSAnMCciKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJVUERBVEUgJXMgU0VUIHMgPSA/IFdIRVJFIGsgPSAnMCcgSUYgRVhJU1RTIik7CisKKyAgICAgICAgLy8gcmVndWxhciBjb2x1bW4sIG9ubHkgdGhlIGFwcGxpZWQgQ0FTIHVwZGF0ZXMgY2FuIGZpcmUgdGhlIGd1YXJkcmFpbAorICAgICAgICBhc3NlcnRWYWxpZCgiSU5TRVJUIElOVE8gJXMgKGssIGMpIFZBTFVFUyAoJzAnLCAnMCcpIik7CisgICAgICAgIHRlc3RUaHJlc2hvbGQoInYiLCAiVVBEQVRFICVzIFNFVCB2ID0gPyBXSEVSRSBrID0gJzAnIEFORCBjID0gJzAnIElGIEVYSVNUUyIpOworICAgICAgICBhc3NlcnRWYWxpZCgiREVMRVRFIEZST00gJXMgV0hFUkUgayA9ICcwJyBBTkQgYyA9ICcwJyIpOworICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQoIlVQREFURSAlcyBTRVQgdiA9ID8gV0hFUkUgayA9ICcwJyBBTkQgYyA9ICcwJyBJRiBFWElTVFMiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDQVNXaXRoQ29sdW1uc0NvbmRpdGlvbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB2IHRleHQpIik7CisKKyAgICAgICAgLy8gdXBkYXRlcyBhcmUgYWx3YXlzIGFjY2VwdGVkIGZvciB2YWx1ZXMgbGVzc2VyIHRoYW4gdGhlIHRocmVzaG9sZCwgaW5kZXBlbmRlbnRseSBvZiB3aGV0aGVyIHRoZXkgYXJlIGFwcGxpZWQKKyAgICAgICAgYXNzZXJ0VmFsaWQoIkRFTEVURSBGUk9NICVzIFdIRVJFIGsgPSAwIik7CisgICAgICAgIGFzc2VydFZhbGlkKCJVUERBVEUgJXMgU0VUIHYgPSA/IFdIRVJFIGsgPSAwIElGIHYgPSAnMCciLCBhbGxvY2F0ZSgxKSk7CisgICAgICAgIGFzc2VydFZhbGlkKCJVUERBVEUgJXMgU0VUIHYgPSAnMCcgV0hFUkUgayA9IDAiKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIlVQREFURSAlcyBTRVQgdiA9ID8gV0hFUkUgayA9IDAgSUYgdiA9ICcwJyIsIGFsbG9jYXRlKDEpKTsKKworICAgICAgICAvLyB1cGRhdGVzIGFyZSBhbHdheXMgYWNjZXB0ZWQgZm9yIHZhbHVlcyBlcXVhbHMgdG8gdGhlIHRocmVzaG9sZCwgaW5kZXBlbmRlbnRseSBvZiB3aGV0aGVyIHRoZXkgYXJlIGFwcGxpZWQKKyAgICAgICAgYXNzZXJ0VmFsaWQoIkRFTEVURSBGUk9NICVzIFdIRVJFIGsgPSAwIik7CisgICAgICAgIGFzc2VydFZhbGlkKCJVUERBVEUgJXMgU0VUIHYgPSA/IFdIRVJFIGsgPSAwIElGIHYgPSAnMCciLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCkpOworICAgICAgICBhc3NlcnRWYWxpZCgiVVBEQVRFICVzIFNFVCB2ID0gJzAnIFdIRVJFIGsgPSAwIik7CisgICAgICAgIGFzc2VydFZhbGlkKCJVUERBVEUgJXMgU0VUIHYgPSA/IFdIRVJFIGsgPSAwIElGIHYgPSAnMCciLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCkpOworCisgICAgICAgIC8vIHVwZGF0ZXMgYmV5b25kIHRoZSB0aHJlc2hvbGQgZmFpbCBvbmx5IGlmIHRoZSB1cGRhdGUgaXMgYXBwbGllZAorICAgICAgICBhc3NlcnRWYWxpZCgiREVMRVRFIEZST00gJXMgV0hFUkUgayA9IDAiKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIlVQREFURSAlcyBTRVQgdiA9ID8gV0hFUkUgayA9IDAgSUYgdiA9ICcwJyIsIGFsbG9jYXRlKFdBUk5fVEhSRVNIT0xEICsgMSkpOworICAgICAgICBhc3NlcnRWYWxpZCgiVVBEQVRFICVzIFNFVCB2ID0gJzAnIFdIRVJFIGsgPSAwIik7CisgICAgICAgIGFzc2VydFdhcm5zKCJ2IiwgIlVQREFURSAlcyBTRVQgdiA9ID8gV0hFUkUgayA9IDAgSUYgdiA9ICcwJyIsIGFsbG9jYXRlKFdBUk5fVEhSRVNIT0xEICsgMSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgdGV4dCwgYyB0ZXh0LCByIHRleHQsIHMgdGV4dCBTVEFUSUMsIFBSSU1BUlkgS0VZKGssIGMpKSIpOworCisgICAgICAgIC8vIHRoZSBndWFyZGFpbCBpcyBvbmx5IGNoZWNrZWQgZm9yIHdyaXRlczsgcmVhZHMgYXJlIGV4Y2x1ZGVkCisKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPSA/Iik7CisgICAgICAgIHRlc3ROb1RocmVzaG9sZCgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gJzAnIEFORCBjID0gPyIpOworICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYyA9ID8gQUxMT1cgRklMVEVSSU5HIik7CisgICAgICAgIHRlc3ROb1RocmVzaG9sZCgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBzID0gPyBBTExPVyBGSUxURVJJTkciKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHIgPSA/IEFMTE9XIEZJTFRFUklORyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgdGhlIG1heCBjb2x1bW4gc2l6ZSBndWFyZHJhaWwgdGhyZXNob2xkIGlzIG5vdCBhcHBsaWVkIGZvciB0aGUgc3BlY2lmaWVkIDEtcGxhY2Vob2xkZXIgQ1FMIHF1ZXJ5LgorICAgICAqCisgICAgICogQHBhcmFtIHF1ZXJ5IGEgQ1FMIG1vZGlmaWNhdGlvbiBzdGF0ZW1lbnQgd2l0aCBleGFjdGx5IG9uZSBwbGFjZWhvbGRlcgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0ZXN0Tm9UaHJlc2hvbGQoU3RyaW5nIHF1ZXJ5KSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUoMSkpOworCisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCkpOworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgKyAxKSk7CisKKyAgICAgICAgYXNzZXJ0VmFsaWQocXVlcnksIGFsbG9jYXRlKEZBSUxfVEhSRVNIT0xEKSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBhbGxvY2F0ZShGQUlMX1RIUkVTSE9MRCArIDEpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IHRoZSBtYXggY29sdW1uIHNpemUgZ3VhcmRyYWlsIHRocmVzaG9sZCBpcyBub3QgYXBwbGllZCBmb3IgdGhlIHNwZWNpZmllZCAyLXBsYWNlaG9sZGVyIENRTCBxdWVyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBxdWVyeSBhIENRTCBtb2RpZmljYXRpb24gc3RhdGVtZW50IHdpdGggZXhhY3RseSB0d28gcGxhY2Vob2xkZXJzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHRlc3ROb1RocmVzaG9sZDIoU3RyaW5nIHF1ZXJ5KSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUoMSksIGFsbG9jYXRlKDEpKTsKKworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQpLCBhbGxvY2F0ZSgxKSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBhbGxvY2F0ZSgxKSwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQpKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQocXVlcnksIGFsbG9jYXRlKChXQVJOX1RIUkVTSE9MRCkpLCBhbGxvY2F0ZSgoV0FSTl9USFJFU0hPTEQpKSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCArIDEpLCBhbGxvY2F0ZSgxKSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBhbGxvY2F0ZSgxKSwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgKyAxKSk7CisKKyAgICAgICAgYXNzZXJ0VmFsaWQocXVlcnksIGFsbG9jYXRlKEZBSUxfVEhSRVNIT0xEKSwgYWxsb2NhdGUoMSkpOworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUoMSksIGFsbG9jYXRlKEZBSUxfVEhSRVNIT0xEKSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBhbGxvY2F0ZSgoRkFJTF9USFJFU0hPTEQpKSwgYWxsb2NhdGUoKEZBSUxfVEhSRVNIT0xEKSkpOworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUoRkFJTF9USFJFU0hPTEQgKyAxKSwgYWxsb2NhdGUoMSkpOworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUoMSksIGFsbG9jYXRlKEZBSUxfVEhSRVNIT0xEICsgMSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgdGhlIG1heCBjb2x1bW4gc2l6ZSBndWFyZHJhaWwgdGhyZXNob2xkIGlzIGFwcGxpZWQgZm9yIHRoZSBzcGVjaWZpZWQgMS1wbGFjZWhvbGRlciBDUUwgcXVlcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29sdW1uIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gcmVmZXJlbmNlZCBieSB0aGUgcXVlcnkgcGxhY2Vob2xkZXIKKyAgICAgKiBAcGFyYW0gcXVlcnkgIGEgQ1FMIHF1ZXJ5IHdpdGggZXhhY3RseSBvbmUgcGxhY2Vob2xkZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdGVzdFRocmVzaG9sZChTdHJpbmcgY29sdW1uLCBTdHJpbmcgcXVlcnkpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRlc3RUaHJlc2hvbGQoY29sdW1uLCBxdWVyeSwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCB0aGUgbWF4IGNvbHVtbiBzaXplIGd1YXJkcmFpbCB0aHJlc2hvbGQgaXMgYXBwbGllZCBmb3IgdGhlIHNwZWNpZmllZCAxLXBsYWNlaG9sZGVyIENRTCBxdWVyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2x1bW4gICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiByZWZlcmVuY2VkIGJ5IHRoZSBxdWVyeSBwbGFjZWhvbGRlcgorICAgICAqIEBwYXJhbSBxdWVyeSAgICAgICAgICAgICAgYSBDUUwgcXVlcnkgd2l0aCBleGFjdGx5IG9uZSBwbGFjZWhvbGRlcgorICAgICAqIEBwYXJhbSBzZXJpYWxpemF0aW9uQnl0ZXMgdGhlIGV4dHJhIGJ5dGVzIGFkZGVkIHRvIHRoZSBwbGFjZWhvbGRlciB2YWx1ZSBieSBpdHMgd3JhcHBpbmcgY29sdW1uIHR5cGUgc2VyaWFsaXplcgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0ZXN0VGhyZXNob2xkKFN0cmluZyBjb2x1bW4sIFN0cmluZyBxdWVyeSwgaW50IHNlcmlhbGl6YXRpb25CeXRlcykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgaW50IHdhcm4gPSBXQVJOX1RIUkVTSE9MRCAtIHNlcmlhbGl6YXRpb25CeXRlczsKKyAgICAgICAgaW50IGZhaWwgPSBGQUlMX1RIUkVTSE9MRCAtIHNlcmlhbGl6YXRpb25CeXRlczsKKworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUoMCkpOworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUod2FybikpOworICAgICAgICBhc3NlcnRXYXJucyhjb2x1bW4sIHF1ZXJ5LCBhbGxvY2F0ZSh3YXJuICsgMSkpOworICAgICAgICBhc3NlcnRGYWlscyhjb2x1bW4sIHF1ZXJ5LCBhbGxvY2F0ZShmYWlsICsgMSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgdGhlIG1heCBjb2x1bW4gc2l6ZSBndWFyZHJhaWwgdGhyZXNob2xkIGlzIGFwcGxpZWQgZm9yIHRoZSBzcGVjaWZpZWQgMi1wbGFjZWhvbGRlciBDUUwgcXVlcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29sdW1uIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gcmVmZXJlbmNlZCBieSB0aGUgcGxhY2Vob2xkZXJzCisgICAgICogQHBhcmFtIHF1ZXJ5ICBhIENRTCBxdWVyeSB3aXRoIGV4YWN0bHkgdHdvIHBsYWNlaG9sZGVycworICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0ZXN0VGhyZXNob2xkMihTdHJpbmcgY29sdW1uLCBTdHJpbmcgcXVlcnkpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRlc3RUaHJlc2hvbGQyKGNvbHVtbiwgcXVlcnksIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgdGhlIG1heCBjb2x1bW4gc2l6ZSBndWFyZHJhaWwgdGhyZXNob2xkIGlzIGFwcGxpZWQgZm9yIHRoZSBzcGVjaWZpZWQgMi1wbGFjZWhvbGRlciBxdWVyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2x1bW4gICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiByZWZlcmVuY2VkIGJ5IHRoZSBwbGFjZWhvbGRlcnMKKyAgICAgKiBAcGFyYW0gcXVlcnkgICAgICAgICAgICAgIGEgQ1FMIHF1ZXJ5IHdpdGggZXhhY3RseSB0d28gcGxhY2Vob2xkZXJzCisgICAgICogQHBhcmFtIHNlcmlhbGl6YXRpb25CeXRlcyB0aGUgZXh0cmEgYnl0ZXMgYWRkZWQgdG8gdGhlIHNpemUgb2YgdGhlIHBsYWNlaG9sZGVyIHZhbHVlIGJ5IHRoZWlyIHdyYXBwaW5nIHNlcmlhbGl6ZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdGVzdFRocmVzaG9sZDIoU3RyaW5nIGNvbHVtbiwgU3RyaW5nIHF1ZXJ5LCBpbnQgc2VyaWFsaXphdGlvbkJ5dGVzKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBpbnQgd2FybiA9IFdBUk5fVEhSRVNIT0xEIC0gc2VyaWFsaXphdGlvbkJ5dGVzOworICAgICAgICBpbnQgZmFpbCA9IEZBSUxfVEhSRVNIT0xEIC0gc2VyaWFsaXphdGlvbkJ5dGVzOworCisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBhbGxvY2F0ZSgwKSwgYWxsb2NhdGUoMCkpOworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUod2FybiksIGFsbG9jYXRlKDApKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQocXVlcnksIGFsbG9jYXRlKDApLCBhbGxvY2F0ZSh3YXJuKSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBhbGxvY2F0ZSh3YXJuIC8gMiksIGFsbG9jYXRlKHdhcm4gLyAyKSk7CisKKyAgICAgICAgYXNzZXJ0V2FybnMoY29sdW1uLCBxdWVyeSwgYWxsb2NhdGUod2FybiArIDEpLCBhbGxvY2F0ZSgwKSk7CisgICAgICAgIGFzc2VydFdhcm5zKGNvbHVtbiwgcXVlcnksIGFsbG9jYXRlKDApLCBhbGxvY2F0ZSh3YXJuICsgMSkpOworCisgICAgICAgIGFzc2VydEZhaWxzKGNvbHVtbiwgcXVlcnksIGFsbG9jYXRlKGZhaWwgKyAxKSwgYWxsb2NhdGUoMCkpOworICAgICAgICBhc3NlcnRGYWlscyhjb2x1bW4sIHF1ZXJ5LCBhbGxvY2F0ZSgwKSwgYWxsb2NhdGUoZmFpbCArIDEpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdENvbGxlY3Rpb24oU3RyaW5nIGNvbHVtbiwgU3RyaW5nIHF1ZXJ5LCBGdW5jdGlvbjxCeXRlQnVmZmVyW10sIEJ5dGVCdWZmZXI+IGNvbGxlY3Rpb25CdWlsZGVyKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgY29sbGVjdGlvbkJ1aWxkZXIsIGFsbG9jYXRlKDEpKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQocXVlcnksIGNvbGxlY3Rpb25CdWlsZGVyLCBhbGxvY2F0ZSgxKSwgYWxsb2NhdGUoMSkpOworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgY29sbGVjdGlvbkJ1aWxkZXIsIGFsbG9jYXRlKFdBUk5fVEhSRVNIT0xEKSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBjb2xsZWN0aW9uQnVpbGRlciwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQpLCBhbGxvY2F0ZSgxKSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBjb2xsZWN0aW9uQnVpbGRlciwgYWxsb2NhdGUoMSksIGFsbG9jYXRlKFdBUk5fVEhSRVNIT0xEKSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBjb2xsZWN0aW9uQnVpbGRlciwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQpLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCkpOworCisgICAgICAgIGFzc2VydFdhcm5zKGNvbHVtbiwgcXVlcnksIGNvbGxlY3Rpb25CdWlsZGVyLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCArIDEpKTsKKyAgICAgICAgYXNzZXJ0V2FybnMoY29sdW1uLCBxdWVyeSwgY29sbGVjdGlvbkJ1aWxkZXIsIGFsbG9jYXRlKFdBUk5fVEhSRVNIT0xEICsgMSksIGFsbG9jYXRlKDEpKTsKKyAgICAgICAgYXNzZXJ0V2FybnMoY29sdW1uLCBxdWVyeSwgY29sbGVjdGlvbkJ1aWxkZXIsIGFsbG9jYXRlKDEpLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCArIDEpKTsKKworICAgICAgICBhc3NlcnRGYWlscyhjb2x1bW4sIHF1ZXJ5LCBjb2xsZWN0aW9uQnVpbGRlciwgYWxsb2NhdGUoRkFJTF9USFJFU0hPTEQgKyAxKSk7CisgICAgICAgIGFzc2VydEZhaWxzKGNvbHVtbiwgcXVlcnksIGNvbGxlY3Rpb25CdWlsZGVyLCBhbGxvY2F0ZShGQUlMX1RIUkVTSE9MRCArIDEpLCBhbGxvY2F0ZSgxKSk7CisgICAgICAgIGFzc2VydEZhaWxzKGNvbHVtbiwgcXVlcnksIGNvbGxlY3Rpb25CdWlsZGVyLCBhbGxvY2F0ZSgxKSwgYWxsb2NhdGUoRkFJTF9USFJFU0hPTEQgKyAxKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RGcm96ZW5Db2xsZWN0aW9uKFN0cmluZyBjb2x1bW4sIFN0cmluZyBxdWVyeSwgRnVuY3Rpb248Qnl0ZUJ1ZmZlcltdLCBCeXRlQnVmZmVyPiBjb2xsZWN0aW9uQnVpbGRlcikgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0VmFsaWQocXVlcnksIGNvbGxlY3Rpb25CdWlsZGVyLCBhbGxvY2F0ZSgxKSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBjb2xsZWN0aW9uQnVpbGRlciwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgLSA4KSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBjb2xsZWN0aW9uQnVpbGRlciwgYWxsb2NhdGUoKFdBUk5fVEhSRVNIT0xEIC0gMTIpIC8gMiksIGFsbG9jYXRlKChXQVJOX1RIUkVTSE9MRCAtIDEyKSAvIDIpKTsKKworICAgICAgICBhc3NlcnRXYXJucyhjb2x1bW4sIHF1ZXJ5LCBjb2xsZWN0aW9uQnVpbGRlciwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgLSA3KSk7CisgICAgICAgIGFzc2VydFdhcm5zKGNvbHVtbiwgcXVlcnksIGNvbGxlY3Rpb25CdWlsZGVyLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCAtIDEyKSwgYWxsb2NhdGUoMSkpOworCisgICAgICAgIGFzc2VydEZhaWxzKGNvbHVtbiwgcXVlcnksIGNvbGxlY3Rpb25CdWlsZGVyLCBhbGxvY2F0ZShGQUlMX1RIUkVTSE9MRCAtIDcpKTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoY29sdW1uLCBxdWVyeSwgY29sbGVjdGlvbkJ1aWxkZXIsIGFsbG9jYXRlKEZBSUxfVEhSRVNIT0xEIC0gMTIpLCBhbGxvY2F0ZSgxKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RNYXAoU3RyaW5nIGNvbHVtbiwgU3RyaW5nIHF1ZXJ5KSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgdGhpczo6bWFwLCBhbGxvY2F0ZSgxKSwgYWxsb2NhdGUoMSkpOworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgdGhpczo6bWFwLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCksIGFsbG9jYXRlKDEpKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQocXVlcnksIHRoaXM6Om1hcCwgYWxsb2NhdGUoMSksIGFsbG9jYXRlKFdBUk5fVEhSRVNIT0xEKSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCB0aGlzOjptYXAsIGFsbG9jYXRlKFdBUk5fVEhSRVNIT0xEKSwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQpKTsKKworICAgICAgICBhc3NlcnRXYXJucyhjb2x1bW4sIHF1ZXJ5LCB0aGlzOjptYXAsIGFsbG9jYXRlKDEpLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCArIDEpKTsKKyAgICAgICAgYXNzZXJ0V2FybnMoY29sdW1uLCBxdWVyeSwgdGhpczo6bWFwLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCArIDEpLCBhbGxvY2F0ZSgxKSk7CisKKyAgICAgICAgYXNzZXJ0RmFpbHMoY29sdW1uLCBxdWVyeSwgdGhpczo6bWFwLCBhbGxvY2F0ZShGQUlMX1RIUkVTSE9MRCArIDEpLCBhbGxvY2F0ZSgxKSk7CisgICAgICAgIGFzc2VydEZhaWxzKGNvbHVtbiwgcXVlcnksIHRoaXM6Om1hcCwgYWxsb2NhdGUoMSksIGFsbG9jYXRlKEZBSUxfVEhSRVNIT0xEICsgMSkpOworICAgICAgICBhc3NlcnRGYWlscyhjb2x1bW4sIHF1ZXJ5LCB0aGlzOjptYXAsIGFsbG9jYXRlKEZBSUxfVEhSRVNIT0xEICsgMSksIGFsbG9jYXRlKEZBSUxfVEhSRVNIT0xEICsgMSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRWYWxpZChTdHJpbmcgcXVlcnksIEJ5dGVCdWZmZXIuLi4gdmFsdWVzKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRWYWxpZCgoKSAtPiBleGVjdXRlKHF1ZXJ5LCB2YWx1ZXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0VmFsaWQoU3RyaW5nIHF1ZXJ5LCBGdW5jdGlvbjxCeXRlQnVmZmVyW10sIEJ5dGVCdWZmZXI+IGNvbGxlY3Rpb25CdWlsZGVyLCBCeXRlQnVmZmVyLi4uIHZhbHVlcykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0VmFsaWQoKCkgLT4gZXhlY3V0ZShxdWVyeSwgY29sbGVjdGlvbkJ1aWxkZXIuYXBwbHkodmFsdWVzKSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRXYXJucyhTdHJpbmcgY29sdW1uLCBTdHJpbmcgcXVlcnksIEZ1bmN0aW9uPEJ5dGVCdWZmZXJbXSwgQnl0ZUJ1ZmZlcj4gY29sbGVjdGlvbkJ1aWxkZXIsIEJ5dGVCdWZmZXIuLi4gdmFsdWVzKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRXYXJucyhjb2x1bW4sIHF1ZXJ5LCBjb2xsZWN0aW9uQnVpbGRlci5hcHBseSh2YWx1ZXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0V2FybnMoU3RyaW5nIGNvbHVtbiwgU3RyaW5nIHF1ZXJ5LCBCeXRlQnVmZmVyLi4uIHZhbHVlcykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IGZvcm1hdCgiVmFsdWUgb2YgY29sdW1uICVzIGhhcyBzaXplICVzLCB0aGlzIGV4Y2VlZHMgdGhlIHdhcm5pbmcgdGhyZXNob2xkIG9mICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLCBXQVJOX1RIUkVTSE9MRCArIDEsIFdBUk5fVEhSRVNIT0xEKTsKKyAgICAgICAgYXNzZXJ0V2FybnMoKCkgLT4gZXhlY3V0ZShxdWVyeSwgdmFsdWVzKSwgZXJyb3JNZXNzYWdlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RmFpbHMoU3RyaW5nIGNvbHVtbiwgU3RyaW5nIHF1ZXJ5LCBGdW5jdGlvbjxCeXRlQnVmZmVyW10sIEJ5dGVCdWZmZXI+IGNvbGxlY3Rpb25CdWlsZGVyLCBCeXRlQnVmZmVyLi4uIHZhbHVlcykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0RmFpbHMoY29sdW1uLCBxdWVyeSwgY29sbGVjdGlvbkJ1aWxkZXIuYXBwbHkodmFsdWVzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEZhaWxzKFN0cmluZyBjb2x1bW4sIFN0cmluZyBxdWVyeSwgQnl0ZUJ1ZmZlci4uLiB2YWx1ZXMpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBmb3JtYXQoIlZhbHVlIG9mIGNvbHVtbiAlcyBoYXMgc2l6ZSAlcywgdGhpcyBleGNlZWRzIHRoZSBmYWlsdXJlIHRocmVzaG9sZCBvZiAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwgRkFJTF9USFJFU0hPTEQgKyAxLCBGQUlMX1RIUkVTSE9MRCk7CisgICAgICAgIGFzc2VydEZhaWxzKCgpIC0+IGV4ZWN1dGUocXVlcnksIHZhbHVlcyksIGVycm9yTWVzc2FnZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGUoU3RyaW5nIHF1ZXJ5LCBCeXRlQnVmZmVyLi4uIHZhbHVlcykKKyAgICB7CisgICAgICAgIGV4ZWN1dGUodXNlckNsaWVudFN0YXRlLCBxdWVyeSwgQXJyYXlzLmFzTGlzdCh2YWx1ZXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEJ5dGVCdWZmZXIgc2V0KEJ5dGVCdWZmZXIuLi4gdmFsdWVzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFNldFR5cGUuZ2V0SW5zdGFuY2UoQnl0ZXNUeXBlLmluc3RhbmNlLCB0cnVlKS5kZWNvbXBvc2UoSW1tdXRhYmxlU2V0LmNvcHlPZih2YWx1ZXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEJ5dGVCdWZmZXIgbGlzdChCeXRlQnVmZmVyLi4uIHZhbHVlcykKKyAgICB7CisgICAgICAgIHJldHVybiBMaXN0VHlwZS5nZXRJbnN0YW5jZShCeXRlc1R5cGUuaW5zdGFuY2UsIHRydWUpLmRlY29tcG9zZShJbW11dGFibGVMaXN0LmNvcHlPZih2YWx1ZXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEJ5dGVCdWZmZXIgbWFwKEJ5dGVCdWZmZXIuLi4gdmFsdWVzKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHZhbHVlcy5sZW5ndGggJSAyID09IDA7CisKKyAgICAgICAgaW50IHNpemUgPSB2YWx1ZXMubGVuZ3RoIC8gMjsKKyAgICAgICAgTWFwPEJ5dGVCdWZmZXIsIEJ5dGVCdWZmZXI+IG0gPSBuZXcgTGlua2VkSGFzaE1hcDw+KHNpemUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgIG0ucHV0KHZhbHVlc1syICogaV0sIHZhbHVlc1soMiAqIGkpICsgMV0pOworCisgICAgICAgIHJldHVybiBNYXBUeXBlLmdldEluc3RhbmNlKEJ5dGVzVHlwZS5pbnN0YW5jZSwgQnl0ZXNUeXBlLmluc3RhbmNlLCB0cnVlKS5kZWNvbXBvc2UobSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsRHJvcEtleXNwYWNlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsRHJvcEtleXNwYWNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNDQ3MjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxEcm9wS2V5c3BhY2VUZXN0LmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgR3VhcmRyYWlsRHJvcEtleXNwYWNlVGVzdCBleHRlbmRzIEd1YXJkcmFpbFRlc3RlcgoreworICAgIHByaXZhdGUgU3RyaW5nIGtleXNwYWNlUXVlcnkgPSAiQ1JFQVRFIEtFWVNQQUNFIGRrZHQgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJyA6IDF9IjsKKworICAgIHByaXZhdGUgdm9pZCBzZXRHdWFyZHJhaWwoYm9vbGVhbiBlbmFibGVkKQorICAgIHsKKyAgICAgICAgR3VhcmRyYWlscy5pbnN0YW5jZS5zZXREcm9wS2V5c3BhY2VFbmFibGVkKGVuYWJsZWQpOworICAgIH0KKworICAgIHB1YmxpYyBHdWFyZHJhaWxEcm9wS2V5c3BhY2VUZXN0KCkKKyAgICB7CisgICAgICAgIHN1cGVyKEd1YXJkcmFpbHMuZHJvcEtleXNwYWNlRW5hYmxlZCk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgYWZ0ZXJUZXN0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgc2V0R3VhcmRyYWlsKHRydWUpOworICAgICAgICBleGVjdXRlKCJEUk9QIEtFWVNQQUNFIElGIEVYSVNUUyBka2R0Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuRHJvcFdoaWxlRmVhdHVyZUVuYWJsZWQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBzZXRHdWFyZHJhaWwodHJ1ZSk7CisgICAgICAgIGNyZWF0ZUtleXNwYWNlKGtleXNwYWNlUXVlcnkpOworICAgICAgICBleGVjdXRlKCJEUk9QIEtFWVNQQUNFIGRrZHQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5ub3REcm9wV2hpbGVGZWF0dXJlRGlzYWJsZWQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBzZXRHdWFyZHJhaWwoZmFsc2UpOworICAgICAgICBjcmVhdGVLZXlzcGFjZShrZXlzcGFjZVF1ZXJ5KTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkRST1AgS0VZU1BBQ0UgZGtkdCIsICJEUk9QIEtFWVNQQUNFIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGFsbG93ZWQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJZkV4aXN0c0RvZXNOb3RCeXBhc3NDaGVjaygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHNldEd1YXJkcmFpbChmYWxzZSk7CisgICAgICAgIGNyZWF0ZUtleXNwYWNlKGtleXNwYWNlUXVlcnkpOworICAgICAgICBhc3NlcnRGYWlscygiRFJPUCBLRVlTUEFDRSBJRiBFWElTVFMgZGtkdCIsICJEUk9QIEtFWVNQQUNFIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGFsbG93ZWQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUb2dnbGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBzZXRHdWFyZHJhaWwoZmFsc2UpOworICAgICAgICBjcmVhdGVLZXlzcGFjZShrZXlzcGFjZVF1ZXJ5KTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkRST1AgS0VZU1BBQ0UgSUYgRVhJU1RTIGRrZHQiLCAiRFJPUCBLRVlTUEFDRSBmdW5jdGlvbmFsaXR5IGlzIG5vdCBhbGxvd2VkIik7CisKKyAgICAgICAgc2V0R3VhcmRyYWlsKHRydWUpOworICAgICAgICBleGVjdXRlKCJEUk9QIEtFWVNQQUNFIGRrZHQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxNYXhpbXVtUmVwbGljYXRpb25GYWN0b3JUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxNYXhpbXVtUmVwbGljYXRpb25GYWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY1YWMyMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbE1heGltdW1SZXBsaWNhdGlvbkZhY3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDI1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2VydmVyVGVzdFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5BYnN0cmFjdEVuZHBvaW50U25pdGNoOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSUVuZHBvaW50U25pdGNoOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmVwbGljYTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNsaWVudFdhcm47CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKK2ltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworCitwdWJsaWMgY2xhc3MgR3VhcmRyYWlsTWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yVGVzdCBleHRlbmRzIFRocmVzaG9sZFRlc3RlcgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhJTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWElNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQUJMRURfR1VBUkRSQUlMID0gLTE7CisKKyAgICBwdWJsaWMgR3VhcmRyYWlsTWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yVGVzdCgpCisgICAgeworICAgICAgICBzdXBlcihNQVhJTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCwKKyAgICAgICAgICAgICAgTUFYSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfRkFJTF9USFJFU0hPTEQsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHMubWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yLAorICAgICAgICAgICAgICBHdWFyZHJhaWxzOjpzZXRNYXhpbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHM6OmdldE1heGltdW1SZXBsaWNhdGlvbkZhY3Rvcldhcm5UaHJlc2hvbGQsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHM6OmdldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvckZhaWxUaHJlc2hvbGQpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIGNsZWFudXBUZXN0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgZXhlY3V0ZSgiRFJPUCBLRVlTUEFDRSBJRiBFWElTVFMga3MiKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldERlZmF1bHRLZXlzcGFjZVJGKDEpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBsb25nIGN1cnJlbnRWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gTG9uZy5wYXJzZUxvbmcoKEtleXNwYWNlLm9wZW4oImtzIikuZ2V0UmVwbGljYXRpb25TdHJhdGVneSgpKS5jb25maWdPcHRpb25zLmdldCgiZGF0YWNlbnRlcjEiKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBnZXRXYXJuaW5ncygpCisgICAgeworICAgICAgICBMaXN0PFN0cmluZz4gd2FybmluZ3MgPSBDbGllbnRXYXJuLmluc3RhbmNlLmdldFdhcm5pbmdzKCk7CisKKyAgICAgICAgLy8gZmlsdGVyaW5nIG91dCBub24tZ3VhcmRyYWlscyBwcm9kdWNlZCB3YXJuaW5ncworICAgICAgICByZXR1cm4gd2FybmluZ3MgPT0gbnVsbAorICAgICAgICAgICAgICAgPyBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKQorICAgICAgICAgICAgICAgOiB3YXJuaW5ncy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIodyAtPiAhdy5jb250YWlucygia2V5c3BhY2Uga3MgaXMgaGlnaGVyIHRoYW4gdGhlIG51bWJlciBvZiBub2RlcyAxIGZvciBkYXRhY2VudGVyMSIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF3LmNvbnRhaW5zKCJXaGVuIGluY3JlYXNpbmcgcmVwbGljYXRpb24gZmFjdG9yIHlvdSBuZWVkIHRvIHJ1biBhIGZ1bGwgKC1mdWxsKSByZXBhaXIgdG8gZGlzdHJpYnV0ZSB0aGUgZGF0YSIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF3LmNvbnRhaW5zKCJrZXlzcGFjZSBrcyBpcyBoaWdoZXIgdGhhbiB0aGUgbnVtYmVyIG9mIG5vZGVzIikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXcuY29udGFpbnMoIllvdXIgcmVwbGljYXRpb24gZmFjdG9yIDMgZm9yIGtleXNwYWNlIGtzIGlzIGhpZ2hlciB0aGFuIHRoZSBudW1iZXIgb2Ygbm9kZXMgMiBmb3IgZGF0YWNlbnRlciBkYXRhY2VudGVyMiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1heEtleXNwYWNlUkZEaXNhYmxlZCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNYXhpbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoRElTQUJMRURfR1VBUkRSQUlMLCBESVNBQkxFRF9HVUFSRFJBSUwpOworICAgICAgICBhc3NlcnRNYXhUaHJlc2hvbGRWYWxpZCgiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDZ9Iik7CisgICAgICAgIGFzc2VydE1heFRocmVzaG9sZFZhbGlkKCJBTFRFUiBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnIDogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogMTB9Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlU3RyYXRlZ3lDcmVhdGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBndWFyZHJhaWxzKCkuc2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yVGhyZXNob2xkKE1BWElNVU1fUkVQTElDQVRJT05fRkFDVE9SX1dBUk5fVEhSRVNIT0xELCBNQVhJTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9GQUlMX1RIUkVTSE9MRCk7CisgICAgICAgIGFzc2VydFdhcm5zKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3Rvcic6IDN9IiwgMyk7CisgICAgICAgIGV4ZWN1dGUoIkRST1AgS0VZU1BBQ0UgSUYgRVhJU1RTIGtzIik7CisgICAgICAgIGFzc2VydEZhaWxzKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3Rvcic6IDV9IiwgNSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlU3RyYXRlZ3lBbHRlcigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNYXhpbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoTUFYSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfV0FSTl9USFJFU0hPTEQsIE1BWElNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKTsKKyAgICAgICAgZXhlY3V0ZSgiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InOiAyfSIpOworICAgICAgICBhc3NlcnRXYXJucygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3Rvcic6IDN9IiwgMyk7CisgICAgICAgIGFzc2VydEZhaWxzKCJBTFRFUiBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJzogNX0iLCA1KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZURhdGFjZW50ZXIoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBJRW5kcG9pbnRTbml0Y2ggc25pdGNoID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldEVuZHBvaW50U25pdGNoKCk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRFbmRwb2ludFNuaXRjaChuZXcgQWJzdHJhY3RFbmRwb2ludFNuaXRjaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJBQ0sxID0gU2VydmVyVGVzdFV0aWxzLlJBQ0sxOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmFjayhJbmV0QWRkcmVzc0FuZFBvcnQgZW5kcG9pbnQpIHsgcmV0dXJuIFJBQ0sxOyB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXREYXRhY2VudGVyKEluZXRBZGRyZXNzQW5kUG9ydCBlbmRwb2ludCkgeyByZXR1cm4gImRhdGFjZW50ZXIyIjsgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZUVuZHBvaW50cyhJbmV0QWRkcmVzc0FuZFBvcnQgdGFyZ2V0LCBSZXBsaWNhIGExLCBSZXBsaWNhIGEyKSB7IHJldHVybiAwOyB9CisgICAgICAgIH0pOworCisgICAgICAgIExpc3Q8U3RyaW5nPiB0d29XYXJuaW5ncyA9IEFycmF5cy5hc0xpc3QoZm9ybWF0KCJUaGUga2V5c3BhY2Uga3MgaGFzIGEgcmVwbGljYXRpb24gZmFjdG9yIG9mIDMsIGFib3ZlIHRoZSB3YXJuaW5nIHRocmVzaG9sZCBvZiAlcy4iLCBNQVhJTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJUaGUga2V5c3BhY2Uga3MgaGFzIGEgcmVwbGljYXRpb24gZmFjdG9yIG9mIDMsIGFib3ZlIHRoZSB3YXJuaW5nIHRocmVzaG9sZCBvZiAlcy4iLCBNQVhJTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCkpOworCisgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmdldFRva2VuTWV0YWRhdGEoKS51cGRhdGVIb3N0SWQoVVVJRC5yYW5kb21VVUlEKCksIEluZXRBZGRyZXNzQW5kUG9ydC5nZXRCeU5hbWUoIjEyNy4wLjAuMjU1IikpOworICAgICAgICBndWFyZHJhaWxzKCkuc2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yVGhyZXNob2xkKE1BWElNVU1fUkVQTElDQVRJT05fRkFDVE9SX1dBUk5fVEhSRVNIT0xELCBNQVhJTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9GQUlMX1RIUkVTSE9MRCk7CisgICAgICAgIGFzc2VydFZhbGlkKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDIsICdkYXRhY2VudGVyMicgOiAyfSIpOworICAgICAgICBleGVjdXRlKCJEUk9QIEtFWVNQQUNFIElGIEVYSVNUUyBrcyIpOworICAgICAgICBhc3NlcnRXYXJucygiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDIsICdkYXRhY2VudGVyMicgOiAzfSIsIDMpOworICAgICAgICBleGVjdXRlKCJEUk9QIEtFWVNQQUNFIElGIEVYSVNUUyBrcyIpOworICAgICAgICBhc3NlcnRXYXJucygiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcycgOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAzLCAnZGF0YWNlbnRlcjInIDogM30iLCB0d29XYXJuaW5ncyk7CisgICAgICAgIGV4ZWN1dGUoIkRST1AgS0VZU1BBQ0UgSUYgRVhJU1RTIGtzIik7CisgICAgICAgIGFzc2VydEZhaWxzKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDIsICdkYXRhY2VudGVyMicgOiA1fSIsIDUpOworICAgICAgICBleGVjdXRlKCJEUk9QIEtFWVNQQUNFIElGIEVYSVNUUyBrcyIpOworICAgICAgICBhc3NlcnRGYWlscygiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcycgOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiA1LCAnZGF0YWNlbnRlcjInIDogNX0iLCA1KTsKKyAgICAgICAgZXhlY3V0ZSgiRFJPUCBLRVlTUEFDRSBJRiBFWElTVFMga3MiKTsKKworICAgICAgICBleGVjdXRlKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDEsICdkYXRhY2VudGVyMicgOiAxfSIpOworICAgICAgICBhc3NlcnRWYWxpZCgiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDIsICdkYXRhY2VudGVyMicgOiAyfSIpOworICAgICAgICBhc3NlcnRXYXJucygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDIsICdkYXRhY2VudGVyMicgOiAzfSIsIDMpOworICAgICAgICBhc3NlcnRXYXJucygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDMsICdkYXRhY2VudGVyMicgOiAzfSIsIHR3b1dhcm5pbmdzKTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkFMVEVSIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcycgOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAyLCAnZGF0YWNlbnRlcjInIDogNX0iLCA1KTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkFMVEVSIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcycgOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiA1LCAnZGF0YWNlbnRlcjInIDogNX0iLCA1KTsKKworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0RW5kcG9pbnRTbml0Y2goc25pdGNoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXhLZXlzcGFjZVJGT25seVdhcm5CZWxvdygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNYXhpbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoTUFYSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfV0FSTl9USFJFU0hPTEQsIERJU0FCTEVEX0dVQVJEUkFJTCk7CisgICAgICAgIGFzc2VydE1heFRocmVzaG9sZFZhbGlkKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogMn0iKTsKKyAgICAgICAgYXNzZXJ0TWF4VGhyZXNob2xkVmFsaWQoIkFMVEVSIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDF9Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF4S2V5c3BhY2VSRk9ubHlXYXJuQWJvdmUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBndWFyZHJhaWxzKCkuc2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yVGhyZXNob2xkKE1BWElNVU1fUkVQTElDQVRJT05fRkFDVE9SX1dBUk5fVEhSRVNIT0xELCBESVNBQkxFRF9HVUFSRFJBSUwpOworICAgICAgICBhc3NlcnRXYXJucygiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDN9IiwgMyk7CisgICAgICAgIGFzc2VydFdhcm5zKCJBTFRFUiBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiA0fSIsIDQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1heEtleXNwYWNlUkZPbmx5RmFpbEJlbG93KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgZ3VhcmRyYWlscygpLnNldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvclRocmVzaG9sZChESVNBQkxFRF9HVUFSRFJBSUwsIE1BWElNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKTsKKyAgICAgICAgYXNzZXJ0TWF4VGhyZXNob2xkVmFsaWQoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAyfSIpOworICAgICAgICBhc3NlcnRNYXhUaHJlc2hvbGRWYWxpZCgiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogM30iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXhLZXlzcGFjZVJGT25seUZhaWxBYm92ZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNYXhpbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoRElTQUJMRURfR1VBUkRSQUlMLCBNQVhJTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9GQUlMX1RIUkVTSE9MRCk7CisgICAgICAgIGFzc2VydEZhaWxzKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogNX0iLCA1KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXhLZXlzcGFjZVJGT25seUZhaWxBYm92ZUFsdGVyKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgZ3VhcmRyYWlscygpLnNldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvclRocmVzaG9sZChESVNBQkxFRF9HVUFSRFJBSUwsIE1BWElNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKTsKKyAgICAgICAgZXhlY3V0ZSgiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDN9Iik7CisgICAgICAgIGFzc2VydEZhaWxzKCJBTFRFUiBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiA2fSIsIDYpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1heEtleXNwYWNlUkZXYXJuQmVsb3coKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBndWFyZHJhaWxzKCkuc2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yVGhyZXNob2xkKE1BWElNVU1fUkVQTElDQVRJT05fRkFDVE9SX1dBUk5fVEhSRVNIT0xELCBNQVhJTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9GQUlMX1RIUkVTSE9MRCk7CisgICAgICAgIGFzc2VydE1heFRocmVzaG9sZFZhbGlkKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogMX0iKTsKKyAgICAgICAgYXNzZXJ0TWF4VGhyZXNob2xkVmFsaWQoIkFMVEVSIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDJ9Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF4S2V5c3BhY2VSRldhcm5GYWlsQmV0d2VlbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNYXhpbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoTUFYSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfV0FSTl9USFJFU0hPTEQsIE1BWElNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKTsKKyAgICAgICAgYXNzZXJ0V2FybnMoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAzfSIsIDMpOworICAgICAgICBhc3NlcnRXYXJucygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogNH0iLCA0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXhLZXlzcGFjZVJGRmFpbEFib3ZlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgZ3VhcmRyYWlscygpLnNldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvclRocmVzaG9sZChNQVhJTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCwgTUFYSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfRkFJTF9USFJFU0hPTEQpOworICAgICAgICBhc3NlcnRGYWlscygiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDV9IiwgNSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF4S2V5c3BhY2VSRkZhaWxBYm92ZUFsdGVyKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgZ3VhcmRyYWlscygpLnNldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvclRocmVzaG9sZChNQVhJTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCwgTUFYSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfRkFJTF9USFJFU0hPTEQpOworICAgICAgICBleGVjdXRlKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogNH0iKTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkFMVEVSIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDV9IiwgNSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF4UkZMZXNzZXJUaGFuRGVmYXVsdFJGKCkKKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXREZWZhdWx0S2V5c3BhY2VSRigzKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gZ3VhcmRyYWlscygpLnNldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvclRocmVzaG9sZCgxLCAyKSkKKyAgICAgICAgICAgICAgICAgIC5pc0luc3RhbmNlT2YoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgICAgICAgICAgICAgICAgLmhhc01lc3NhZ2VDb250YWluaW5nKCJtYXhpbXVtX3JlcGxpY2F0aW9uX2ZhY3Rvcl9mYWlsX3RocmVzaG9sZCB0byBiZSBzZXQgKDIpIGNhbm5vdCBiZSBsZXNzZXIgdGhhbiBkZWZhdWx0X2tleXNwYWNlX3JmICgzKSIpOworCisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXREZWZhdWx0S2V5c3BhY2VSRigxKTsKKyAgICAgICAgZ3VhcmRyYWlscygpLnNldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvclRocmVzaG9sZCgxLCAyKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gRGF0YWJhc2VEZXNjcmlwdG9yLnNldERlZmF1bHRLZXlzcGFjZVJGKDMpKQorICAgICAgICAgICAgICAgICAgLmlzSW5zdGFuY2VPZihJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcoImRlZmF1bHRfa2V5c3BhY2VfcmYgdG8gYmUgc2V0ICgzKSBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIG1heGltdW1fcmVwbGljYXRpb25fZmFjdG9yX2ZhaWxfdGhyZXNob2xkICgyKSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRXYXJucyhTdHJpbmcgcXVlcnksIGludCByZikgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0V2FybnMocXVlcnksIGZvcm1hdCgiVGhlIGtleXNwYWNlIGtzIGhhcyBhIHJlcGxpY2F0aW9uIGZhY3RvciBvZiAlZCwgYWJvdmUgdGhlIHdhcm5pbmcgdGhyZXNob2xkIG9mICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmYsIE1BWElNVU1fUkVQTElDQVRJT05fRkFDVE9SX1dBUk5fVEhSRVNIT0xEKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEZhaWxzKFN0cmluZyBxdWVyeSwgaW50IHJmKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRGYWlscyhxdWVyeSwgZm9ybWF0KCJUaGUga2V5c3BhY2Uga3MgaGFzIGEgcmVwbGljYXRpb24gZmFjdG9yIG9mICVkLCBhYm92ZSB0aGUgZmFpbHVyZSB0aHJlc2hvbGQgb2YgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZiwgTUFYSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfRkFJTF9USFJFU0hPTEQpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxNYXhpbXVtVGltZXN0YW1wVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsTWF4aW11bVRpbWVzdGFtcFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWMzMWFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsTWF4aW11bVRpbWVzdGFtcFRlc3QuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRHVyYXRpb25TcGVjOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2xpZW50U3RhdGU7CisKK3B1YmxpYyBjbGFzcyBHdWFyZHJhaWxNYXhpbXVtVGltZXN0YW1wVGVzdCBleHRlbmRzIFRocmVzaG9sZFRlc3RlcgoreworICAgIHB1YmxpYyBHdWFyZHJhaWxNYXhpbXVtVGltZXN0YW1wVGVzdCgpCisgICAgeworICAgICAgICBzdXBlcihUaW1lVW5pdC5EQVlTLnRvU2Vjb25kcygxKSArICJzIiwKKyAgICAgICAgICAgICAgVGltZVVuaXQuREFZUy50b1NlY29uZHMoMikgKyAicyIsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHMubWF4aW11bUFsbG93YWJsZVRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgR3VhcmRyYWlsczo6c2V0TWF4aW11bVRpbWVzdGFtcFRocmVzaG9sZCwKKyAgICAgICAgICAgICAgR3VhcmRyYWlsczo6Z2V0TWF4aW11bVRpbWVzdGFtcFdhcm5UaHJlc2hvbGQsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHM6OmdldE1heGltdW1UaW1lc3RhbXBGYWlsVGhyZXNob2xkLAorICAgICAgICAgICAgICBtaWNyb3MgLT4gbmV3IER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQobWljcm9zLCBUaW1lVW5pdC5NSUNST1NFQ09ORFMpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgIG1pY3JvcyAtPiBuZXcgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZChtaWNyb3MpLnRvTWljcm9zZWNvbmRzKCkpOworICAgIH0KKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cFRlc3QoKQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICVzIChrIGludCBwcmltYXJ5IGtleSwgdiBpbnQpIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRBbGxvd3NBbnlUaW1lc3RhbXAoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBndWFyZHJhaWxzKCkuc2V0TWF4aW11bVRpbWVzdGFtcFRocmVzaG9sZChudWxsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDIsIDIpIFVTSU5HIFRJTUVTVEFNUCAiICsgKExvbmcuTUFYX1ZBTFVFIC0gMSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZWRGYWlsKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDIsIDIpIFVTSU5HIFRJTUVTVEFNUCAiICsgKExvbmcuTUFYX1ZBTFVFIC0gMSksICJtYXhpbXVtX3RpbWVzdGFtcCB2aW9sYXRlZCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZWRJblJhbmdlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDEsIDEpIFVTSU5HIFRJTUVTVEFNUCAiICsgQ2xpZW50U3RhdGUuZ2V0VGltZXN0YW1wKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZWRXYXJuKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0V2FybnMoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDEsIDEpIFVTSU5HIFRJTUVTVEFNUCAiICsgIChDbGllbnRTdGF0ZS5nZXRUaW1lc3RhbXAoKSArIChUaW1lVW5pdC5EQVlTLnRvTWljcm9zKDEpICsgNDAwMDApKSwKKyAgICAgICAgICAgICAgICAgICAgIm1heGltdW1fdGltZXN0YW1wIHZpb2xhdGVkIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsTWluaW11bVJlcGxpY2F0aW9uRmFjdG9yVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsTWluaW11bVJlcGxpY2F0aW9uRmFjdG9yVGVzdC5qYXZhCmluZGV4IGQzZGY5ODMuLjg4MTdmOWEgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbE1pbmltdW1SZXBsaWNhdGlvbkZhY3RvclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JUZXN0LmphdmEKQEAgLTg5LDYgKzg5LDcgQEAKICAgICB7CiAgICAgICAgIExpc3Q8U3RyaW5nPiB3YXJuaW5ncyA9IENsaWVudFdhcm4uaW5zdGFuY2UuZ2V0V2FybmluZ3MoKTsKIAorICAgICAgICAvLyBmaWx0ZXJpbmcgb3V0IG5vbi1ndWFyZHJhaWxzIHByb2R1Y2VkIHdhcm5pbmdzCiAgICAgICAgIHJldHVybiB3YXJuaW5ncyA9PSBudWxsCiAgICAgICAgICAgICAgICA/IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpCiAgICAgICAgICAgICAgICA6IHdhcm5pbmdzLnN0cmVhbSgpCkBAIC0xMzIsMTMgKzEzMywyMSBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVN0cmF0ZWd5KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVTdHJhdGVneUNyZWF0ZSgpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfV0FSTl9USFJFU0hPTEQsIE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKTsKLSAgICAgICAgYXNzZXJ0V2FybnMoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJzogM30iLAotICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIlRoZSBrZXlzcGFjZSAlcyBoYXMgYSByZXBsaWNhdGlvbiBmYWN0b3Igb2YgMywgYmVsb3cgdGhlIHdhcm5pbmcgdGhyZXNob2xkIG9mICVzLiIsIEtTLCBNSU5JTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCkpOwotICAgICAgICBhc3NlcnRGYWlscygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3Rvcic6IDF9IiwKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJUaGUga2V5c3BhY2UgJXMgaGFzIGEgcmVwbGljYXRpb24gZmFjdG9yIG9mIDEsIGJlbG93IHRoZSBmYWlsdXJlIHRocmVzaG9sZCBvZiAlcy4iLCBLUywgTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfRkFJTF9USFJFU0hPTEQpKTsKKyAgICAgICAgYXNzZXJ0V2FybnMoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJzogM30iLCAzKTsKKyAgICAgICAgZXhlY3V0ZSgiRFJPUCBLRVlTUEFDRSBJRiBFWElTVFMga3MiKTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJzogMX0iLCAxKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVTdHJhdGVneUFsdGVyKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgZ3VhcmRyYWlscygpLnNldE1pbmltdW1SZXBsaWNhdGlvbkZhY3RvclRocmVzaG9sZChNSU5JTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCwgTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfRkFJTF9USFJFU0hPTEQpOworICAgICAgICBleGVjdXRlKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3Rvcic6IDR9Iik7CisgICAgICAgIGFzc2VydFdhcm5zKCJBTFRFUiBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJzogM30iLCAzKTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkFMVEVSIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InOiAxfSIsIDEpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xNjEsMTcgKzE3MCwyNiBAQAogCiAgICAgICAgIExpc3Q8U3RyaW5nPiB0d29XYXJuaW5ncyA9IEFycmF5cy5hc0xpc3QoZm9ybWF0KCJUaGUga2V5c3BhY2UgJXMgaGFzIGEgcmVwbGljYXRpb24gZmFjdG9yIG9mIDIsIGJlbG93IHRoZSB3YXJuaW5nIHRocmVzaG9sZCBvZiAlZC4iLCBLUywgTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfV0FSTl9USFJFU0hPTEQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiVGhlIGtleXNwYWNlICVzIGhhcyBhIHJlcGxpY2F0aW9uIGZhY3RvciBvZiAyLCBiZWxvdyB0aGUgd2FybmluZyB0aHJlc2hvbGQgb2YgJWQuIiwgS1MsIE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX1dBUk5fVEhSRVNIT0xEKSk7Ci0gICAgICAgIAorCiAgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmdldFRva2VuTWV0YWRhdGEoKS51cGRhdGVIb3N0SWQoVVVJRC5yYW5kb21VVUlEKCksIEluZXRBZGRyZXNzQW5kUG9ydC5nZXRCeU5hbWUoIjEyNy4wLjAuMjU1IikpOwogICAgICAgICBndWFyZHJhaWxzKCkuc2V0TWluaW11bVJlcGxpY2F0aW9uRmFjdG9yVGhyZXNob2xkKE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX1dBUk5fVEhSRVNIT0xELCBNSU5JTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9GQUlMX1RIUkVTSE9MRCk7Ci0gICAgICAgIGFzc2VydFZhbGlkKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDQsICdkYXRhY2VudGVyMicgOiA0IH07Iik7Ci0gICAgICAgIGFzc2VydFdhcm5zKCJBTFRFUiBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnIDogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogNCwgJ2RhdGFjZW50ZXIyJyA6IDIgfTsiLAotICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIlRoZSBrZXlzcGFjZSAlcyBoYXMgYSByZXBsaWNhdGlvbiBmYWN0b3Igb2YgMiwgYmVsb3cgdGhlIHdhcm5pbmcgdGhyZXNob2xkIG9mICVkLiIsIEtTLCBNSU5JTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCkpOwotICAgICAgICBhc3NlcnRXYXJucygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDIsICdkYXRhY2VudGVyMicgOiAyIH07IiwgdHdvV2FybmluZ3MpOwotICAgICAgICBhc3NlcnRGYWlscygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDQsICdkYXRhY2VudGVyMicgOiAxIH07IiwKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJUaGUga2V5c3BhY2UgJXMgaGFzIGEgcmVwbGljYXRpb24gZmFjdG9yIG9mIDEsIGJlbG93IHRoZSBmYWlsdXJlIHRocmVzaG9sZCBvZiAlZC4iLCBLUywgTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfRkFJTF9USFJFU0hPTEQpKTsKLSAgICAgICAgYXNzZXJ0RmFpbHMoIkNSRUFURSBLRVlTUEFDRSBrczEgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDEsICdkYXRhY2VudGVyMicgOiAxIH07IiwKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJUaGUga2V5c3BhY2Uga3MxIGhhcyBhIHJlcGxpY2F0aW9uIGZhY3RvciBvZiAxLCBiZWxvdyB0aGUgZmFpbHVyZSB0aHJlc2hvbGQgb2YgJWQuIiwgTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfRkFJTF9USFJFU0hPTEQpKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnIDogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogNCwgJ2RhdGFjZW50ZXIyJyA6IDQgfSIpOworICAgICAgICBleGVjdXRlKCJEUk9QIEtFWVNQQUNFIElGIEVYSVNUUyBrcyIpOworICAgICAgICBhc3NlcnRXYXJucygiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcycgOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiA0LCAnZGF0YWNlbnRlcjInIDogMiB9IiwgMik7CisgICAgICAgIGV4ZWN1dGUoIkRST1AgS0VZU1BBQ0UgSUYgRVhJU1RTIGtzIik7CisgICAgICAgIGFzc2VydFdhcm5zKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDIsICdkYXRhY2VudGVyMicgOiAyIH0iLCB0d29XYXJuaW5ncyk7CisgICAgICAgIGV4ZWN1dGUoIkRST1AgS0VZU1BBQ0UgSUYgRVhJU1RTIGtzIik7CisgICAgICAgIGFzc2VydEZhaWxzKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDQsICdkYXRhY2VudGVyMicgOiAxIH0iLCAxKTsKKyAgICAgICAgZXhlY3V0ZSgiRFJPUCBLRVlTUEFDRSBJRiBFWElTVFMga3MiKTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnIDogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogMSwgJ2RhdGFjZW50ZXIyJyA6IDEgfSIsIDEpOworICAgICAgICBleGVjdXRlKCJEUk9QIEtFWVNQQUNFIElGIEVYSVNUUyBrcyIpOworCisgICAgICAgIGV4ZWN1dGUoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnIDogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogNSwgJ2RhdGFjZW50ZXIyJyA6IDV9Iik7CisgICAgICAgIGFzc2VydFZhbGlkKCJBTFRFUiBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnIDogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogNCwgJ2RhdGFjZW50ZXIyJyA6IDQgfSIpOworICAgICAgICBhc3NlcnRXYXJucygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDQsICdkYXRhY2VudGVyMicgOiAyIH0iLCAyKTsKKyAgICAgICAgYXNzZXJ0V2FybnMoIkFMVEVSIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcycgOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAyLCAnZGF0YWNlbnRlcjInIDogMiB9IiwgdHdvV2FybmluZ3MpOworICAgICAgICBhc3NlcnRGYWlscygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDQsICdkYXRhY2VudGVyMicgOiAxIH0iLCAxKTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkFMVEVSIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcycgOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAxLCAnZGF0YWNlbnRlcjInIDogMSB9IiwgMSk7CiAKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldEVuZHBvaW50U25pdGNoKHNuaXRjaCk7CiAgICAgICAgIGV4ZWN1dGUoIkRST1AgS0VZU1BBQ0UgSUYgRVhJU1RTIGtzMSIpOwpAQCAtMTg5LDEwICsyMDcsOCBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RNaW5LZXlzcGFjZVJGT25seVdhcm5CZWxvdygpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfV0FSTl9USFJFU0hPTEQsIERJU0FCTEVEX0dVQVJEUkFJTCk7Ci0gICAgICAgIGFzc2VydFdhcm5zKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogM30iLAotICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIlRoZSBrZXlzcGFjZSAlcyBoYXMgYSByZXBsaWNhdGlvbiBmYWN0b3Igb2YgMywgYmVsb3cgdGhlIHdhcm5pbmcgdGhyZXNob2xkIG9mICVzLiIsIEtTLCBNSU5JTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCkpOwotICAgICAgICBhc3NlcnRXYXJucygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogMn0iLAotICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIlRoZSBrZXlzcGFjZSAlcyBoYXMgYSByZXBsaWNhdGlvbiBmYWN0b3Igb2YgMiwgYmVsb3cgdGhlIHdhcm5pbmcgdGhyZXNob2xkIG9mICVzLiIsIEtTLCBNSU5JTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCkpOworICAgICAgICBhc3NlcnRXYXJucygiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDN9IiwgMyk7CisgICAgICAgIGFzc2VydFdhcm5zKCJBTFRFUiBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAyfSIsIDIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yMDcsOCArMjIzLDcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWluS2V5c3BhY2VSRk9ubHlGYWlsQmVsb3coKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBndWFyZHJhaWxzKCkuc2V0TWluaW11bVJlcGxpY2F0aW9uRmFjdG9yVGhyZXNob2xkKERJU0FCTEVEX0dVQVJEUkFJTCwgTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfRkFJTF9USFJFU0hPTEQpOwotICAgICAgICBhc3NlcnRGYWlscygiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDF9IiwKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJUaGUga2V5c3BhY2UgJXMgaGFzIGEgcmVwbGljYXRpb24gZmFjdG9yIG9mIDEsIGJlbG93IHRoZSBmYWlsdXJlIHRocmVzaG9sZCBvZiAlcy4iLCBLUywgTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfRkFJTF9USFJFU0hPTEQpKTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAxfSIsIDEpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yMTYsOCArMjMxLDcgQEAKICAgICB7CiAgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoRElTQUJMRURfR1VBUkRSQUlMLCBNSU5JTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9GQUlMX1RIUkVTSE9MRCk7CiAgICAgICAgIGV4ZWN1dGUoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAzfSIpOwotICAgICAgICBhc3NlcnRGYWlscygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogMX0iLAotICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIlRoZSBrZXlzcGFjZSAlcyBoYXMgYSByZXBsaWNhdGlvbiBmYWN0b3Igb2YgMSwgYmVsb3cgdGhlIGZhaWx1cmUgdGhyZXNob2xkIG9mICVzLiIsIEtTLCBNSU5JTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9GQUlMX1RIUkVTSE9MRCkpOworICAgICAgICBhc3NlcnRGYWlscygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogMX0iLCAxKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMjMyLDE4ICsyNDYsMTUgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWluS2V5c3BhY2VSRldhcm5GYWlsQmV0d2VlbigpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfV0FSTl9USFJFU0hPTEQsIE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKTsKLSAgICAgICAgYXNzZXJ0V2FybnMoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAzfSIsCi0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiVGhlIGtleXNwYWNlICVzIGhhcyBhIHJlcGxpY2F0aW9uIGZhY3RvciBvZiAzLCBiZWxvdyB0aGUgd2FybmluZyB0aHJlc2hvbGQgb2YgJXMuIiwgS1MsIE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX1dBUk5fVEhSRVNIT0xEKSk7Ci0gICAgICAgIGFzc2VydFdhcm5zKCJBTFRFUiBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAyfSIsCi0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiVGhlIGtleXNwYWNlICVzIGhhcyBhIHJlcGxpY2F0aW9uIGZhY3RvciBvZiAyLCBiZWxvdyB0aGUgd2FybmluZyB0aHJlc2hvbGQgb2YgJXMuIiwgS1MsIE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX1dBUk5fVEhSRVNIT0xEKSk7CisgICAgICAgIGFzc2VydFdhcm5zKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogM30iLCAzKTsKKyAgICAgICAgYXNzZXJ0V2FybnMoIkFMVEVSIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDJ9IiwgMik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWluS2V5c3BhY2VSRkZhaWxCZWxvdygpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfV0FSTl9USFJFU0hPTEQsIE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKTsKLSAgICAgICAgYXNzZXJ0RmFpbHMoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAxfSIsCi0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiVGhlIGtleXNwYWNlICVzIGhhcyBhIHJlcGxpY2F0aW9uIGZhY3RvciBvZiAxLCBiZWxvdyB0aGUgZmFpbHVyZSB0aHJlc2hvbGQgb2YgJXMuIiwgS1MsIE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKSk7CisgICAgICAgIGFzc2VydEZhaWxzKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogMX0iLCAxKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMjUxLDI2ICsyNjIsMzMgQEAKICAgICB7CiAgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfV0FSTl9USFJFU0hPTEQsIE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKTsKICAgICAgICAgZXhlY3V0ZSgiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDR9Iik7Ci0gICAgICAgIGFzc2VydEZhaWxzKCJBTFRFUiBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAxfSIsCi0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiVGhlIGtleXNwYWNlICVzIGhhcyBhIHJlcGxpY2F0aW9uIGZhY3RvciBvZiAxLCBiZWxvdyB0aGUgZmFpbHVyZSB0aHJlc2hvbGQgb2YgJXMuIiwgS1MsIE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKSk7CisgICAgICAgIGFzc2VydEZhaWxzKCJBTFRFUiBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAxfSIsIDEpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE1pblJGR3JlYXRlclRoYW5EZWZhdWx0UkYoKQogICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXREZWZhdWx0S2V5c3BhY2VSRigxKTsKLSAgICAgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfV0FSTl9USFJFU0hPTEQsIE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZE1lc3NhZ2UgPSAiIjsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldERlZmF1bHRLZXlzcGFjZVJGKDMpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXRUaHJvd25CeSgoKSAtPiBndWFyZHJhaWxzKCkuc2V0TWluaW11bVJlcGxpY2F0aW9uRmFjdG9yVGhyZXNob2xkKDUsIDQpKQorICAgICAgICAgICAgICAgICAgLmlzSW5zdGFuY2VPZihJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcoIm1pbmltdW1fcmVwbGljYXRpb25fZmFjdG9yX2ZhaWxfdGhyZXNob2xkIHRvIGJlIHNldCAoNCkgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBkZWZhdWx0X2tleXNwYWNlX3JmICgzKSIpOwogCi0gICAgICAgICAgICBpZihndWFyZHJhaWxzKCkuZ2V0TWluaW11bVJlcGxpY2F0aW9uRmFjdG9yRmFpbFRocmVzaG9sZCgpID4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldERlZmF1bHRLZXlzcGFjZVJGKCkpCi0gICAgICAgICAgICAgICAgZXhwZWN0ZWRNZXNzYWdlID0gZm9ybWF0KCIlc19mYWlsX3RocmVzaG9sZCB0byBiZSBzZXQgKCVkKSBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIGRlZmF1bHRfa2V5c3BhY2VfcmYgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIQVQsIGd1YXJkcmFpbHMoKS5nZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JGYWlsVGhyZXNob2xkKCksIERhdGFiYXNlRGVzY3JpcHRvci5nZXREZWZhdWx0S2V5c3BhY2VSRigpKTsKLSAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChlLmdldE1lc3NhZ2UoKSkuY29udGFpbnMoZXhwZWN0ZWRNZXNzYWdlKTsKLSAgICAgICAgfQorICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0RGVmYXVsdEtleXNwYWNlUkYoNik7CisgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoNSwgNCk7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IERhdGFiYXNlRGVzY3JpcHRvci5zZXREZWZhdWx0S2V5c3BhY2VSRigzKSkKKyAgICAgICAgICAgICAgICAgIC5pc0luc3RhbmNlT2YoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgICAgICAgICAgICAgICAgLmhhc01lc3NhZ2VDb250YWluaW5nKCJkZWZhdWx0X2tleXNwYWNlX3JmIHRvIGJlIHNldCAoMykgY2Fubm90IGJlIGxlc3MgdGhhbiBtaW5pbXVtX3JlcGxpY2F0aW9uX2ZhY3Rvcl9mYWlsX3RocmVzaG9sZCAoNCkiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0V2FybnMoU3RyaW5nIHF1ZXJ5LCBpbnQgcmYpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFdhcm5zKHF1ZXJ5LCBmb3JtYXQoIlRoZSBrZXlzcGFjZSBrcyBoYXMgYSByZXBsaWNhdGlvbiBmYWN0b3Igb2YgJWQsIGJlbG93IHRoZSB3YXJuaW5nIHRocmVzaG9sZCBvZiAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJmLCBNSU5JTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRGYWlscyhTdHJpbmcgcXVlcnksIGludCByZikgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0RmFpbHMocXVlcnksIGZvcm1hdCgiVGhlIGtleXNwYWNlIGtzIGhhcyBhIHJlcGxpY2F0aW9uIGZhY3RvciBvZiAlZCwgYmVsb3cgdGhlIGZhaWx1cmUgdGhyZXNob2xkIG9mICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmYsIE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsTWluaW11bVRpbWVzdGFtcFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbE1pbmltdW1UaW1lc3RhbXBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcxNjlmYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbE1pbmltdW1UaW1lc3RhbXBUZXN0LmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkR1cmF0aW9uU3BlYzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNsaWVudFN0YXRlOworCitwdWJsaWMgY2xhc3MgR3VhcmRyYWlsTWluaW11bVRpbWVzdGFtcFRlc3QgZXh0ZW5kcyBUaHJlc2hvbGRUZXN0ZXIKK3sKKyAgICBwdWJsaWMgR3VhcmRyYWlsTWluaW11bVRpbWVzdGFtcFRlc3QoKQorICAgIHsKKyAgICAgICAgc3VwZXIoVGltZVVuaXQuREFZUy50b1NlY29uZHMoMSkgKyAicyIsCisgICAgICAgICAgICAgIFRpbWVVbml0LkRBWVMudG9TZWNvbmRzKDIpICsgInMiLAorICAgICAgICAgICAgICBHdWFyZHJhaWxzLm1pbmltdW1BbGxvd2FibGVUaW1lc3RhbXAsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHM6OnNldE1pbmltdW1UaW1lc3RhbXBUaHJlc2hvbGQsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHM6OmdldE1pbmltdW1UaW1lc3RhbXBXYXJuVGhyZXNob2xkLAorICAgICAgICAgICAgICBHdWFyZHJhaWxzOjpnZXRNaW5pbXVtVGltZXN0YW1wRmFpbFRocmVzaG9sZCwKKyAgICAgICAgICAgICAgbWljcm9zIC0+IG5ldyBEdXJhdGlvblNwZWMuTG9uZ01pY3Jvc2Vjb25kc0JvdW5kKG1pY3JvcywgVGltZVVuaXQuTUlDUk9TRUNPTkRTKS50b1N0cmluZygpLAorICAgICAgICAgICAgICBtaWNyb3MgLT4gbmV3IER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQobWljcm9zKS50b01pY3Jvc2Vjb25kcygpKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXBUZXN0KCkKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAlcyAoayBpbnQgcHJpbWFyeSBrZXksIHYgaW50KSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVkKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgZ3VhcmRyYWlscygpLnNldE1pbmltdW1UaW1lc3RhbXBUaHJlc2hvbGQobnVsbCwgbnVsbCk7CisgICAgICAgIGFzc2VydFZhbGlkKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgxLCAxKSBVU0lORyBUSU1FU1RBTVAgMTIzNDUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGVkRmFpbHVyZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydEZhaWxzKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgxLCAxKSBVU0lORyBUSU1FU1RBTVAgMTIzNDUiLCAibWluaW11bV90aW1lc3RhbXAgdmlvbGF0ZWQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGVkSW5SYW5nZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFZhbGlkKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgxLCAxKSBVU0lORyBUSU1FU1RBTVAgIiArIENsaWVudFN0YXRlLmdldFRpbWVzdGFtcCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGVkV2FybigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFdhcm5zKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgxLCAxKSBVU0lORyBUSU1FU1RBTVAgIiArICAoQ2xpZW50U3RhdGUuZ2V0VGltZXN0YW1wKCkgLSAoVGltZVVuaXQuREFZUy50b01pY3JvcygxKSArIDQwMDAwKSksCisgICAgICAgICAgICAgICAgICAgICJtaW5pbXVtX3RpbWVzdGFtcCB2aW9sYXRlZCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbFBhcnRpdGlvblNpemVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxQYXJ0aXRpb25TaXplVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNDgzOTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxQYXJ0aXRpb25TaXplVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YVN0b3JhZ2VTcGVjOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOworCitpbXBvcnQgc3RhdGljIGphdmEubmlvLkJ5dGVCdWZmZXIuYWxsb2NhdGU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhU3RvcmFnZVNwZWMuRGF0YVN0b3JhZ2VVbml0LkJZVEVTOworCisvKioKKyAqIFRlc3RzIHRoZSBndWFyZHJhaWwgZm9yIHRoZSBzaXplIG9mIHBhcnRpdGlvbnMsIHtAbGluayBHdWFyZHJhaWxzI3BhcnRpdGlvblNpemV9LgorICogPHA+CisgKiBUaGUgZW1pc3Npb24gb24gdW5yZWRhY3RlZCBsb2cgbWVzc2FnZXMgaXMgdGVzdGVkIGluIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0Lmd1YXJkcmFpbHMuR3VhcmRyYWlsUGFydGl0aW9uU2l6ZVRlc3R9LgorICovCitwdWJsaWMgY2xhc3MgR3VhcmRyYWlsUGFydGl0aW9uU2l6ZVRlc3QgZXh0ZW5kcyBUaHJlc2hvbGRUZXN0ZXIKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FSTl9USFJFU0hPTEQgPSAxMDI0ICogMTAyNDsgLy8gYnl0ZXMgKDEgTWlCKQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGQUlMX1RIUkVTSE9MRCA9IFdBUk5fVEhSRVNIT0xEICogMjsgLy8gYnl0ZXMgKDIgTWlCKQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fQ0xVU1RFUklOR1MgPSAxMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVEQUNURURfTUVTU0FHRSA9ICJHdWFyZHJhaWwgcGFydGl0aW9uX3NpemUgdmlvbGF0ZWQ6IFBhcnRpdGlvbiA8cmVkYWN0ZWQ+IGhhcyBzaXplIjsKKworICAgIHB1YmxpYyBHdWFyZHJhaWxQYXJ0aXRpb25TaXplVGVzdCgpCisgICAgeworICAgICAgICBzdXBlcihXQVJOX1RIUkVTSE9MRCArICJCIiwKKyAgICAgICAgICAgICAgRkFJTF9USFJFU0hPTEQgKyAiQiIsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHMucGFydGl0aW9uU2l6ZSwKKyAgICAgICAgICAgICAgR3VhcmRyYWlsczo6c2V0UGFydGl0aW9uU2l6ZVRocmVzaG9sZCwKKyAgICAgICAgICAgICAgR3VhcmRyYWlsczo6Z2V0UGFydGl0aW9uU2l6ZVdhcm5UaHJlc2hvbGQsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHM6OmdldFBhcnRpdGlvblNpemVGYWlsVGhyZXNob2xkLAorICAgICAgICAgICAgICBieXRlcyAtPiBuZXcgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kKGJ5dGVzLCBCWVRFUykudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgc2l6ZSAtPiBuZXcgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kKHNpemUpLnRvQnl0ZXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydGl0aW9uU2l6ZUVuYWJsZWQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICAvLyBJbnNlcnQgZW5vdWdoIGRhdGEgdG8gdHJpZ2dlciB0aGUgd2FybmluZyBndWFyZHJhaWwsIGJ1dCBub3QgdGhlIGZhaWx1cmUgb25lLgorICAgICAgICBwb3B1bGF0ZVRhYmxlKFdBUk5fVEhSRVNIT0xEKTsKKworICAgICAgICBmbHVzaCgpOworICAgICAgICBsaXN0ZW5lci5hc3NlcnRXYXJuZWQoUkVEQUNURURfTUVTU0FHRSk7CisgICAgICAgIGxpc3RlbmVyLmNsZWFyKCk7CisKKyAgICAgICAgY29tcGFjdCgpOworICAgICAgICBsaXN0ZW5lci5hc3NlcnRXYXJuZWQoUkVEQUNURURfTUVTU0FHRSk7CisgICAgICAgIGxpc3RlbmVyLmNsZWFyKCk7CisKKyAgICAgICAgLy8gSW5zZXJ0IGVub3VnaCBkYXRhIHRvIHRyaWdnZXIgdGhlIGZhaWx1cmUgZ3VhcmRyYWlsLgorICAgICAgICBwb3B1bGF0ZVRhYmxlKEZBSUxfVEhSRVNIT0xEKTsKKworICAgICAgICBmbHVzaCgpOworICAgICAgICBsaXN0ZW5lci5hc3NlcnRGYWlsZWQoUkVEQUNURURfTUVTU0FHRSk7CisgICAgICAgIGxpc3RlbmVyLmNsZWFyKCk7CisKKyAgICAgICAgY29tcGFjdCgpOworICAgICAgICBsaXN0ZW5lci5hc3NlcnRGYWlsZWQoUkVEQUNURURfTUVTU0FHRSk7CisgICAgICAgIGxpc3RlbmVyLmNsZWFyKCk7CisKKyAgICAgICAgLy8gcmVtb3ZlIG1vc3Qgb2YgdGhlIGRhdGEgdG8gYmUgdW5kZXIgdGhlIHRocmVzaG9sZCBhZ2FpbgorICAgICAgICBhc3NlcnRWYWxpZCgiREVMRVRFIEZST00gJXMgV0hFUkUgayA9IDEgQU5EIGMgPiAwIik7CisKKyAgICAgICAgZmx1c2goKTsKKyAgICAgICAgbGlzdGVuZXIuYXNzZXJ0Tm90V2FybmVkKCk7CisgICAgICAgIGxpc3RlbmVyLmFzc2VydE5vdEZhaWxlZCgpOworCisgICAgICAgIGNvbXBhY3QoKTsKKyAgICAgICAgbGlzdGVuZXIuYXNzZXJ0Tm90V2FybmVkKCk7CisgICAgICAgIGxpc3RlbmVyLmFzc2VydE5vdEZhaWxlZCgpOworICAgICAgICBsaXN0ZW5lci5jbGVhcigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcnRpdGlvblNpemVEaXNhYmxlZCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRQYXJ0aXRpb25TaXplVGhyZXNob2xkKG51bGwsIG51bGwpOworCisgICAgICAgIHBvcHVsYXRlVGFibGUoRkFJTF9USFJFU0hPTEQpOworCisgICAgICAgIGZsdXNoKCk7CisgICAgICAgIGxpc3RlbmVyLmFzc2VydE5vdFdhcm5lZCgpOworICAgICAgICBsaXN0ZW5lci5hc3NlcnROb3RGYWlsZWQoKTsKKworICAgICAgICBjb21wYWN0KCk7CisgICAgICAgIGxpc3RlbmVyLmFzc2VydE5vdFdhcm5lZCgpOworICAgICAgICBsaXN0ZW5lci5hc3NlcnROb3RGYWlsZWQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcG9wdWxhdGVUYWJsZShpbnQgdGhyZXNob2xkKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJXMgKGsgaW50LCBjIGludCwgdiBibG9iLCBQUklNQVJZIEtFWShrLCBjKSkiKTsKKyAgICAgICAgZGlzYWJsZUNvbXBhY3Rpb24oKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9DTFVTVEVSSU5HUzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBpbnQgYyA9IGk7CisgICAgICAgICAgICBhc3NlcnRWYWxpZCgoKSAtPiBleGVjdXRlKHVzZXJDbGllbnRTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDEsID8sID8pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChJbnQzMlR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKGMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlKHRocmVzaG9sZCAvIE5VTV9DTFVTVEVSSU5HUykpKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxTaW1wbGVTdHJhdGVneVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbFNpbXBsZVN0cmF0ZWd5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYzZiYzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxTaW1wbGVTdHJhdGVneVRlc3QuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHM7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBHdWFyZHJhaWxTaW1wbGVTdHJhdGVneVRlc3QgZXh0ZW5kcyBHdWFyZHJhaWxUZXN0ZXIKK3sKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9NU0cgPSAiU2ltcGxlU3RyYXRlZ3kgaXMgbm90IGFsbG93ZWQiOworCisgICAgcHVibGljIEd1YXJkcmFpbFNpbXBsZVN0cmF0ZWd5VGVzdCgpCisgICAgeworICAgICAgICBzdXBlcihHdWFyZHJhaWxzLnNpbXBsZVN0cmF0ZWd5RW5hYmxlZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEd1YXJkcmFpbChib29sZWFuIGVuYWJsZWQpCisgICAgeworICAgICAgICBndWFyZHJhaWxzKCkuc2V0U2ltcGxlU3RyYXRlZ3lFbmFibGVkKGVuYWJsZWQpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIGFmdGVyVGVzdCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHNldEd1YXJkcmFpbCh0cnVlKTsKKyAgICAgICAgZXhlY3V0ZSgiRFJPUCBLRVlTUEFDRSBJRiBFWElTVFMgdGVzdF9zczsiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5DcmVhdGVXaXRoR3VhcmRyYWlsRW5hYmxlZCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFZhbGlkKCJDUkVBVEUgS0VZU1BBQ0UgdGVzdF9zcyBXSVRIIHJlcGxpY2F0aW9uID0geydjbGFzcyc6ICdTaW1wbGVTdHJhdGVneSd9OyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENhbkFsdGVyV2l0aEd1YXJkcmFpbEVuYWJsZWQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBleGVjdXRlKCJDUkVBVEUgS0VZU1BBQ0UgdGVzdF9zcyBXSVRIIHJlcGxpY2F0aW9uID0geydjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6MiwgJ2RhdGFjZW50ZXIyJzowfTsiKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIkFMVEVSIEtFWVNQQUNFIHRlc3Rfc3MgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knfTsiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHdWFyZHJhaWxCbG9ja3NDcmVhdGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBzZXRHdWFyZHJhaWwoZmFsc2UpOworICAgICAgICBhc3NlcnRGYWlscygiQ1JFQVRFIEtFWVNQQUNFIHRlc3Rfc3MgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knfTsiLCBFUlJPUl9NU0cpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEd1YXJkcmFpbEJsb2Nrc0FsdGVyKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgc2V0R3VhcmRyYWlsKGZhbHNlKTsKKyAgICAgICAgZXhlY3V0ZSgiQ1JFQVRFIEtFWVNQQUNFIHRlc3Rfc3MgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOjIsICdkYXRhY2VudGVyMic6MH07Iik7CisgICAgICAgIGFzc2VydEZhaWxzKCJBTFRFUiBLRVlTUEFDRSB0ZXN0X3NzIFdJVEggcmVwbGljYXRpb24gPSB7J2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5J307IiwgRVJST1JfTVNHKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUb2dnbGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBzZXRHdWFyZHJhaWwoZmFsc2UpOworICAgICAgICBhc3NlcnRGYWlscygiQ1JFQVRFIEtFWVNQQUNFIHRlc3Rfc3MgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knfTsiLCBFUlJPUl9NU0cpOworCisgICAgICAgIHNldEd1YXJkcmFpbCh0cnVlKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIkNSRUFURSBLRVlTUEFDRSB0ZXN0X3NzIFdJVEggcmVwbGljYXRpb24gPSB7J2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5J307Iik7CisgICAgICAgIGV4ZWN1dGUoIkFMVEVSIEtFWVNQQUNFIHRlc3Rfc3MgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOjIsICdkYXRhY2VudGVyMic6MH07Iik7CisKKyAgICAgICAgc2V0R3VhcmRyYWlsKGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkFMVEVSIEtFWVNQQUNFIHRlc3Rfc3MgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knfTsiLCBFUlJPUl9NU0cpOworCisgICAgICAgIHNldEd1YXJkcmFpbCh0cnVlKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIkFMVEVSIEtFWVNQQUNFIHRlc3Rfc3MgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knfTsiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxUZXN0ZXIuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbFRlc3Rlci5qYXZhCmluZGV4IDdjOTQ3MDIuLmYyNzQ0YWIgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbFRlc3Rlci5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbFRlc3Rlci5qYXZhCkBAIC02Nyw2ICs2NywxOCBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAorLyoqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHNwZWNpZmljIHV0aWxpdHkgbWV0aG9kcyBmb3IgdGVzdGluZyBHdWFyZHJhaWxzIHRoYXQgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgcHJvdmlkZWQKKyAqIHtAbGluayBDUUxUZXN0ZXJ9IG1ldGhvZHMuIE1hbnkgb2YgdGhlIG1ldGhvZHMgaW4gQ1FMVGVzdGVyIGRvbid0IHJlc3BlY3QgdGhlIHtAbGluayBDbGllbnRTdGF0ZX0gcHJvdmlkZWQgZm9yIGEgcXVlcnkKKyAqIGFuZCBpbnN0ZWFkIHVzZSB7QGxpbmsgQ2xpZW50U3RhdGUjZm9ySW50ZXJuYWxDYWxscygpfSB3aGljaCBmbGFncyBhcyBhbiBpbnRlcm5hbCBxdWVyeSBhbmQgdGh1cyBieXBhc3NlcyBhdXRoIGFuZAorICogZ3VhcmRyYWlsIGNoZWNrcy4KKyAqCisgKiBTb21lIEd1YXJkcmFpbFRlc3RlciBtZXRob2RzIGFuZCB0aGVpciB1c2FnZSBpcyBhcyBmb2xsb3dzOgorICogICAgICB7QGxpbmsgR3VhcmRyYWlsVGVzdGVyI2Fzc2VydFZhbGlkKFN0cmluZyl9IHRvIGNvbmZpcm0gdGhlIHF1ZXJ5IGFzIHN0cnVjdHVyZWQgaXMgdmFsaWQgZ2l2ZW4gdGhlIHN0YXRlIG9mIHRoZSBkYgorICogICAgICB7QGxpbmsgR3VhcmRyYWlsVGVzdGVyI2Fzc2VydFdhcm5zKFN0cmluZywgU3RyaW5nKX0gdG8gY29uZmlybSBhIHF1ZXJ5IHN1Y2NlZWRzIGJ1dCB3YXJucyB0aGUgdGV4dCBwcm92aWRlZAorICogICAgICB7QGxpbmsgR3VhcmRyYWlsVGVzdGVyI2Fzc2VydEZhaWxzKFN0cmluZywgU3RyaW5nKX0gdG8gY29uZmlybSBhIHF1ZXJ5IGZhaWxzIHdpdGggdGhlIG1lc3NhZ2UgcHJvdmlkZWQKKyAqICAgICAge0BsaW5rIEd1YXJkcmFpbFRlc3RlciN0ZXN0RXhjbHVkZWRVc2Vyc30gdG8gY29uZmlybSBzdXBlcnVzZXJzIGFyZSBleGNsdWRlZCBmcm9tIGFwcGxpY2F0aW9uIG9mIHRoZSBndWFyZHJhaWwKKyAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEd1YXJkcmFpbFRlc3RlciBleHRlbmRzIENRTFRlc3RlcgogewogICAgIC8vIE5hbWUgdXNlZCB3aGVuIHRlc3RpbmcgQ1JFQVRFIFRBQkxFIHRoYXQgc2hvdWxkIGJlIGFib3J0ZWQgKHdlIG5lZWQgdG8gcHJvdmlkZSBpdCBhcyBhc3NlcnRGYWlscywgd2hpY2gKQEAgLTEwNiw3ICsxMTgsMTUgQEAKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldERpYWdub3N0aWNFdmVudHNFbmFibGVkKHRydWUpOwogCiAgICAgICAgIHN5c3RlbUNsaWVudFN0YXRlID0gQ2xpZW50U3RhdGUuZm9ySW50ZXJuYWxDYWxscygpOworCiAgICAgICAgIHVzZXJDbGllbnRTdGF0ZSA9IENsaWVudFN0YXRlLmZvckV4dGVybmFsQ2FsbHMoSW5ldFNvY2tldEFkZHJlc3MuY3JlYXRlVW5yZXNvbHZlZCgiMTI3LjAuMC4xIiwgMTIzKSk7CisgICAgICAgIEF1dGhlbnRpY2F0ZWRVc2VyIHVzZXIgPSBuZXcgQXV0aGVudGljYXRlZFVzZXIoVVNFUk5BTUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gY2FuTG9naW4oKSB7IHJldHVybiB0cnVlOyB9CisgICAgICAgIH07CisgICAgICAgIHVzZXJDbGllbnRTdGF0ZS5sb2dpbih1c2VyKTsKKwogICAgICAgICBzdXBlckNsaWVudFN0YXRlID0gQ2xpZW50U3RhdGUuZm9yRXh0ZXJuYWxDYWxscyhJbmV0U29ja2V0QWRkcmVzcy5jcmVhdGVVbnJlc29sdmVkKCIxMjcuMC4wLjEiLCAzMjEpKTsKICAgICAgICAgc3VwZXJDbGllbnRTdGF0ZS5sb2dpbihuZXcgQXV0aGVudGljYXRlZFVzZXIoQ2Fzc2FuZHJhUm9sZU1hbmFnZXIuREVGQVVMVF9TVVBFUlVTRVJfTkFNRSkpOwogICAgIH0KQEAgLTMxOCw2ICszMzgsMTAgQEAKICAgICAgICAgYXNzZXJ0RmFpbHMoZnVuY3Rpb24sIHRydWUsIG1lc3NhZ2VzLCByZWRhY3RlZE1lc3NhZ2VzKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBVbmxpa2Uge0BsaW5rIENRTFRlc3RlciNhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlfSwgdGhlIGNoYWluIG9mIG1ldGhvZHMgZW5kaW5nIGhlcmUgaW4ge0BsaW5rIEd1YXJkcmFpbFRlc3Rlcn0KKyAgICAgKiByZXNwZWN0IHRoZSBpbnB1dCBDbGllbnRTdGF0ZSBzbyBndWFyZHJhaWxzIHBlcm1pc3Npb25zIHdpbGwgYmUgY29ycmVjdGx5IGNoZWNrZWQuCisgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0RmFpbHMoQ2hlY2tlZEZ1bmN0aW9uIGZ1bmN0aW9uLCBib29sZWFuIHRocm93biwgTGlzdDxTdHJpbmc+IG1lc3NhZ2VzLCBMaXN0PFN0cmluZz4gcmVkYWN0ZWRNZXNzYWdlcykgdGhyb3dzIFRocm93YWJsZQogICAgIHsKICAgICAgICAgQ2xpZW50V2Fybi5pbnN0YW5jZS5jYXB0dXJlV2FybmluZ3MoKTsKQEAgLTMzNyw5ICszNjEsMTcgQEAKIAogICAgICAgICAgICAgaWYgKGd1YXJkcmFpbCAhPSBudWxsKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBndWFyZHJhaWwuZGVjb3JhdGVNZXNzYWdlKCIiKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGZvcm1hdCgiRnVsbCBlcnJvciBtZXNzYWdlICclcycgZG9lc24ndCBzdGFydCB3aXRoIHRoZSBwcmVmaXggJyVzJyIsIGUuZ2V0TWVzc2FnZSgpLCBwcmVmaXgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkuc3RhcnRzV2l0aChwcmVmaXgpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBndWFyZHJhaWwuZGVjb3JhdGVNZXNzYWdlKCIiKS5yZXBsYWNlKCIuICIgKyBndWFyZHJhaWwucmVhc29uLCAiIik7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmb3JtYXQoIkZ1bGwgZXJyb3IgbWVzc2FnZSAnJXMnIGRvZXNuJ3Qgc3RhcnQgd2l0aCB0aGUgcHJlZml4ICclcyciLCBtZXNzYWdlLCBwcmVmaXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdGFydHNXaXRoKHByZWZpeCkpOworCisgICAgICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiA9IGd1YXJkcmFpbC5yZWFzb247CisgICAgICAgICAgICAgICAgaWYgKHJlYXNvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmb3JtYXQoIkZ1bGwgZXJyb3IgbWVzc2FnZSAnJXMnIGRvZXNuJ3QgZW5kIHdpdGggdGhlIHJlYXNvbiAnJXMnIiwgbWVzc2FnZSwgcmVhc29uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVuZHNXaXRoKHJlYXNvbikpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmb3JtYXQoIkZ1bGwgZXJyb3IgbWVzc2FnZSAnJXMnIGRvZXMgbm90IGNvbnRhaW4gZXhwZWN0ZWQgbWVzc2FnZSAnJXMnIiwgZS5nZXRNZXNzYWdlKCksIGZhaWxNZXNzYWdlKSwKQEAgLTM5Niw5ICs0MjgsMTYgQEAKICAgICAgICAgICAgIFN0cmluZyB3YXJuaW5nID0gd2FybmluZ3MuZ2V0KGkpOwogICAgICAgICAgICAgaWYgKGd1YXJkcmFpbCAhPSBudWxsKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBndWFyZHJhaWwuZGVjb3JhdGVNZXNzYWdlKCIiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gZ3VhcmRyYWlsLmRlY29yYXRlTWVzc2FnZSgiIikucmVwbGFjZSgiLiAiICsgZ3VhcmRyYWlsLnJlYXNvbiwgIiIpOwogICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZm9ybWF0KCJXYXJuaW5nIGxvZyBtZXNzYWdlICclcycgZG9lc24ndCBzdGFydCB3aXRoIHRoZSBwcmVmaXggJyVzJyIsIHdhcm5pbmcsIHByZWZpeCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nLnN0YXJ0c1dpdGgocHJlZml4KSk7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgcmVhc29uID0gZ3VhcmRyYWlsLnJlYXNvbjsKKyAgICAgICAgICAgICAgICBpZiAocmVhc29uICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGZvcm1hdCgiV2FybmluZyBsb2cgbWVzc2FnZSAnJXMnIGRvZXNuJ3QgZW5kIHdpdGggdGhlIHJlYXNvbiAnJXMnIiwgd2FybmluZywgcmVhc29uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nLmVuZHNXaXRoKHJlYXNvbikpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmb3JtYXQoIldhcm5pbmcgbG9nIG1lc3NhZ2UgJyVzJyBkb2VzIG5vdCBjb250YWluIGV4cGVjdGVkIG1lc3NhZ2UgJyVzJyIsIHdhcm5pbmcsIG1lc3NhZ2UpLApAQCAtNDc4LDYgKzUxNywxMCBAQAogICAgICAgICByZXR1cm4gZXhlY3V0ZShzdGF0ZSwgcXVlcnksIG9wdGlvbnMpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGV4ZWN1dGlvbiBvZiBxdWVyeSB1c2luZyB0aGUgaW5wdXQge0BsaW5rIENsaWVudFN0YXRlfSAoaS5lLiB1bmxpa2Uge0BsaW5rIENsaWVudFN0YXRlI2ZvckludGVybmFsQ2FsbHMoKX0KKyAgICAgKiB3aGljaCBtYXkgbm90KSB0byBlbnN1cmUgZ3VhcmRyYWlscyBhcmUgYXBwcm9wcmllYXRlbHkgYXBwbGllZCB0byB0aGUgcXVlcnkgcHJvdmlkZWQuCisgICAgICovCiAgICAgcHJvdGVjdGVkIFJlc3VsdE1lc3NhZ2UgZXhlY3V0ZShDbGllbnRTdGF0ZSBzdGF0ZSwgU3RyaW5nIHF1ZXJ5LCBRdWVyeU9wdGlvbnMgb3B0aW9ucykKICAgICB7CiAgICAgICAgIFF1ZXJ5U3RhdGUgcXVlcnlTdGF0ZSA9IG5ldyBRdWVyeVN0YXRlKHN0YXRlKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbFplcm9EZWZhdWx0VFRMT25UV0NTVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsWmVyb0RlZmF1bHRUVExPblRXQ1NUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZkMDBlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbFplcm9EZWZhdWx0VFRMT25UV0NTVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneTsKKworcHVibGljIGNsYXNzIEd1YXJkcmFpbFplcm9EZWZhdWx0VFRMT25UV0NTVGVzdCBleHRlbmRzIEd1YXJkcmFpbFRlc3RlcgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWSA9ICJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyB0YjEgKGsgaW50IFBSSU1BUlkgS0VZLCBhIGludCwgYiBpbnQpICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXSVRIIGRlZmF1bHRfdGltZV90b19saXZlID0gMCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQU5EIGNvbXBhY3Rpb24gPSB7J2NsYXNzJzogJ1RpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3knLCAnZW5hYmxlZCc6IHRydWUgfSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURfUVVFUllfMSA9ICJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyB0YjIgKGsgaW50IFBSSU1BUlkgS0VZLCBhIGludCwgYiBpbnQpICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldJVEggZGVmYXVsdF90aW1lX3RvX2xpdmUgPSAxICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFORCBjb21wYWN0aW9uID0geydjbGFzcyc6ICdUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5JywgJ2VuYWJsZWQnOiB0cnVlIH0iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEX1FVRVJZXzIgPSAiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgdGIzIChrIGludCBQUklNQVJZIEtFWSwgYSBpbnQsIGIgaW50KSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXSVRIIGRlZmF1bHRfdGltZV90b19saXZlID0gMCI7CisKKyAgICBwdWJsaWMgR3VhcmRyYWlsWmVyb0RlZmF1bHRUVExPblRXQ1NUZXN0KCkKKyAgICB7CisgICAgICAgIHN1cGVyKEd1YXJkcmFpbHMuemVyb1RUTE9uVFdDU0VuYWJsZWQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEd1YXJkcmFpbERpc2FibGVkKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgcHJlcGFyZVRlc3QoZmFsc2UsIHRydWUpOworICAgICAgICBhc3NlcnRGYWlscyhRVUVSWSwgIjAgZGVmYXVsdF90aW1lX3RvX2xpdmUgb24gYSB0YWJsZSB3aXRoICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneS5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBjb21wYWN0aW9uIHN0cmF0ZWd5IGlzIG5vdCBhbGxvd2VkIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3VhcmRyYWlsRW5hYmxlZFdhcm5FbmFibGVkKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgcHJlcGFyZVRlc3QodHJ1ZSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydFdhcm5zKFFVRVJZLCAiMCBkZWZhdWx0X3RpbWVfdG9fbGl2ZSBvbiBhIHRhYmxlIHdpdGggIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzLmdldFNpbXBsZU5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNvbXBhY3Rpb24gc3RyYXRlZ3kgaXMgbm90IHJlY29tbWVuZGVkIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3VhcmRyYWlsRW5hYmxlZFdhcm5EaXNhYmxlZCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHByZXBhcmVUZXN0KHRydWUsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoUVVFUlkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEd1YXJkcmFpbE5vdFRyaWdnZXJlZCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHByZXBhcmVUZXN0KHRydWUsIHRydWUpOworICAgICAgICBhc3NlcnRWYWxpZChWQUxJRF9RVUVSWV8xKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoVkFMSURfUVVFUllfMik7CisKKyAgICAgICAgcHJlcGFyZVRlc3QoZmFsc2UsIHRydWUpOworICAgICAgICBhc3NlcnRWYWxpZChWQUxJRF9RVUVSWV8xKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoVkFMSURfUVVFUllfMik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjbHVkZWRVc2VycygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGZvciAoYm9vbGVhbiBlbmFibGVkIDogbmV3IGJvb2xlYW5bXSB7IGZhbHNlLCB0cnVlIH0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoYm9vbGVhbiB3YXJuZWQgOiBuZXcgYm9vbGVhbltdeyBmYWxzZSwgdHJ1ZSB9KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByZXBhcmVUZXN0KGVuYWJsZWQsIHdhcm5lZCk7CisgICAgICAgICAgICAgICAgdGVzdEV4Y2x1ZGVkVXNlcnMoKCkgLT4gUVVFUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gVkFMSURfUVVFUllfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBWQUxJRF9RVUVSWV8yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmVwYXJlVGVzdChib29sZWFuIGVuYWJsZWQsIGJvb2xlYW4gd2FybmVkKQorICAgIHsKKyAgICAgICAgZ3VhcmRyYWlscygpLnNldFplcm9UVExPblRXQ1NFbmFibGVkKGVuYWJsZWQpOworICAgICAgICBndWFyZHJhaWxzKCkuc2V0WmVyb1RUTE9uVFdDU1dhcm5lZCh3YXJuZWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbHNDb25maWdQcm92aWRlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbHNDb25maWdQcm92aWRlclRlc3QuamF2YQppbmRleCBlOTliNzM2Li4zNmZiYzdjIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxzQ29uZmlnUHJvdmlkZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsc0NvbmZpZ1Byb3ZpZGVyVGVzdC5qYXZhCkBAIC0zNyw2ICszNyw3IEBACiAgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgKyAnJCcgKyBDdXN0b21Qcm92aWRlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CiAgICAgICAgIEd1YXJkcmFpbHNDb25maWdQcm92aWRlciBwcm92aWRlciA9IEd1YXJkcmFpbHNDb25maWdQcm92aWRlci5idWlsZChuYW1lKTsKICAgICAgICAgTWF4VGhyZXNob2xkIGd1YXJkID0gbmV3IE1heFRocmVzaG9sZCgidGVzdF9ndWFyZHJhaWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb21lIHJlYXNvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gcHJvdmlkZXIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldFRhYmxlc1dhcm5UaHJlc2hvbGQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBwcm92aWRlci5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0VGFibGVzRmFpbFRocmVzaG9sZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1dhcm4sIHdoYXQsIHYsIHQpIC0+IGZvcm1hdCgiJXM6IGZvciAlcywgJXMgPiAlcyIsCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsc1Rlc3QuamF2YQppbmRleCBhMGE1ODIzLi5mMTQzMTIwIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxzVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbHNUZXN0LmphdmEKQEAgLTM4LDcgKzM4LDggQEAKIHB1YmxpYyBjbGFzcyBHdWFyZHJhaWxzVGVzdCBleHRlbmRzIEd1YXJkcmFpbFRlc3RlcgogewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0FCTEVEID0gLTE7Ci0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFTT04gPSAiVGVzdGluZyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRSA9ICJGZWF0dXJlIG5hbWUiOwogCiAgICAgcHJpdmF0ZSB2b2lkIHRlc3REaXNhYmxlZFRocmVzaG9sZChUaHJlc2hvbGQgZ3VhcmQpIHRocm93cyBUaHJvd2FibGUKICAgICB7CkBAIC01OCwxNyArNTksMTggQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRNYXhUaHJlc2hvbGQoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBUaHJlc2hvbGQuRXJyb3JNZXNzYWdlUHJvdmlkZXIgZXJyb3JNZXNzYWdlUHJvdmlkZXIgPSAoaXNXYXJuLCB3aGF0LCB2LCB0KSAtPiAiU2hvdWxkIG5ldmVyIHRyaWdnZXIiOwotICAgICAgICB0ZXN0RGlzYWJsZWRUaHJlc2hvbGQobmV3IE1heFRocmVzaG9sZCgieCIsIHN0YXRlIC0+IERJU0FCTEVELCBzdGF0ZSAtPiBESVNBQkxFRCwgZXJyb3JNZXNzYWdlUHJvdmlkZXIpKTsKKyAgICAgICAgdGVzdERpc2FibGVkVGhyZXNob2xkKG5ldyBNYXhUaHJlc2hvbGQoIngiLCBSRUFTT04sIHN0YXRlIC0+IERJU0FCTEVELCBzdGF0ZSAtPiBESVNBQkxFRCwgZXJyb3JNZXNzYWdlUHJvdmlkZXIpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RNYXhUaHJlc2hvbGQoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBNYXhUaHJlc2hvbGQgZ3VhcmQgPSBuZXcgTWF4VGhyZXNob2xkKCJ4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzV2Fybiwgd2hhdCwgdiwgdCkgLT4gZm9ybWF0KCIlczogZm9yICVzLCAlcyA+ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNXYXJuID8gIldhcm5pbmciIDogIkFib3J0aW5nIiwgd2hhdCwgdiwgdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQVNPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzV2FybiwgZmVhdHVyZU5hbWUsIHYsIHQpIC0+IGZvcm1hdCgiJXM6IGZvciAlcywgJXMgPiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzV2FybiA/ICJXYXJuaW5nIiA6ICJBYm9ydGluZyIsIGZlYXR1cmVOYW1lLCB2LCB0KSk7CiAKICAgICAgICAgYXNzZXJ0VHJ1ZShndWFyZC5lbmFibGVkKHVzZXJDbGllbnRTdGF0ZSkpOwogCkBAIC05MSwxMCArOTMsMTEgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0V2Fybk9ubHlNYXhUaHJlc2hvbGQoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBNYXhUaHJlc2hvbGQgZ3VhcmQgPSBuZXcgTWF4VGhyZXNob2xkKCJ4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBESVNBQkxFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNXYXJuLCB3aGF0LCB2LCB0KSAtPiBmb3JtYXQoIiVzOiBmb3IgJXMsICVzID4gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1dhcm4gPyAiV2FybmluZyIgOiAiQWJvcnRpbmciLCB3aGF0LCB2LCB0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBU09OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IERJU0FCTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1dhcm4sIGZlYXR1cmVOYW1lLCB2LCB0KSAtPiBmb3JtYXQoIiVzOiBmb3IgJXMsICVzID4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1dhcm4gPyAiV2FybmluZyIgOiAiQWJvcnRpbmciLCBmZWF0dXJlTmFtZSwgdiwgdCkpOwogCiAgICAgICAgIGFzc2VydFRydWUoZ3VhcmQuZW5hYmxlZCh1c2VyQ2xpZW50U3RhdGUpKTsKIApAQCAtMTA5LDEwICsxMTIsMTEgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbE9ubHlNYXhUaHJlc2hvbGQoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBNYXhUaHJlc2hvbGQgZ3VhcmQgPSBuZXcgTWF4VGhyZXNob2xkKCJ4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBESVNBQkxFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNXYXJuLCB3aGF0LCB2LCB0KSAtPiBmb3JtYXQoIiVzOiBmb3IgJXMsICVzID4gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1dhcm4gPyAiV2FybmluZyIgOiAiQWJvcnRpbmciLCB3aGF0LCB2LCB0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBU09OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IERJU0FCTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1dhcm4sIGZlYXR1cmVOYW1lLCB2LCB0KSAtPiBmb3JtYXQoIiVzOiBmb3IgJXMsICVzID4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1dhcm4gPyAiV2FybmluZyIgOiAiQWJvcnRpbmciLCBmZWF0dXJlTmFtZSwgdiwgdCkpOwogCiAgICAgICAgIGFzc2VydFRydWUoZ3VhcmQuZW5hYmxlZCh1c2VyQ2xpZW50U3RhdGUpKTsKIApAQCAtMTI3LDEwICsxMzEsMTEgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWF4VGhyZXNob2xkVXNlcnMoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBNYXhUaHJlc2hvbGQgZ3VhcmQgPSBuZXcgTWF4VGhyZXNob2xkKCJ4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzV2Fybiwgd2hhdCwgdiwgdCkgLT4gZm9ybWF0KCIlczogZm9yICVzLCAlcyA+ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNXYXJuID8gIldhcm5pbmciIDogIkZhaWx1cmUiLCB3aGF0LCB2LCB0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBU09OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNXYXJuLCBmZWF0dXJlTmFtZSwgdiwgdCkgLT4gZm9ybWF0KCIlczogZm9yICVzLCAlcyA+ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNXYXJuID8gIldhcm5pbmciIDogIkZhaWx1cmUiLCBmZWF0dXJlTmFtZSwgdiwgdCkpOwogCiAgICAgICAgIC8vIHZhbHVlIHVuZGVyIGJvdGggdGhyZXNob2xkcwogICAgICAgICBhc3NlcnRWYWxpZCgoKSAtPiBndWFyZC5ndWFyZCg1LCAieCIsIGZhbHNlLCBudWxsKSk7CkBAIC0xNTYsMTMgKzE2MSwxNCBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZE1pblRocmVzaG9sZCgpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIFRocmVzaG9sZC5FcnJvck1lc3NhZ2VQcm92aWRlciBlcnJvck1lc3NhZ2VQcm92aWRlciA9IChpc1dhcm4sIHdoYXQsIHYsIHQpIC0+ICJTaG91bGQgbmV2ZXIgdHJpZ2dlciI7Ci0gICAgICAgIHRlc3REaXNhYmxlZFRocmVzaG9sZChuZXcgTWluVGhyZXNob2xkKCJ4Iiwgc3RhdGUgLT4gRElTQUJMRUQsIHN0YXRlIC0+IERJU0FCTEVELCBlcnJvck1lc3NhZ2VQcm92aWRlcikpOworICAgICAgICB0ZXN0RGlzYWJsZWRUaHJlc2hvbGQobmV3IE1pblRocmVzaG9sZCgieCIsIFJFQVNPTiwgc3RhdGUgLT4gRElTQUJMRUQsIHN0YXRlIC0+IERJU0FCTEVELCBlcnJvck1lc3NhZ2VQcm92aWRlcikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE1pblRocmVzaG9sZCgpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIE1pblRocmVzaG9sZCBndWFyZCA9IG5ldyBNaW5UaHJlc2hvbGQoIngiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQVNPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzV2Fybiwgd2hhdCwgdiwgdCkgLT4gZm9ybWF0KCIlczogZm9yICVzLCAlcyA8ICVzIiwKQEAgLTE4OSw2ICsxOTUsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RXYXJuT25seU1pblRocmVzaG9sZCgpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIE1pblRocmVzaG9sZCBndWFyZCA9IG5ldyBNaW5UaHJlc2hvbGQoIngiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQVNPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBESVNBQkxFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNXYXJuLCB3aGF0LCB2LCB0KSAtPiBmb3JtYXQoIiVzOiBmb3IgJXMsICVzIDwgJXMiLApAQCAtMjA3LDYgKzIxNCw3IEBACiAgICAgcHVibGljIHZvaWQgdGVzdEZhaWxPbmx5TWluVGhyZXNob2xkKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKICAgICAgICAgTWluVGhyZXNob2xkIGd1YXJkID0gbmV3IE1pblRocmVzaG9sZCgieCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBU09OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IERJU0FCTEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1dhcm4sIHdoYXQsIHYsIHQpIC0+IGZvcm1hdCgiJXM6IGZvciAlcywgJXMgPCAlcyIsCkBAIC0yMjUsNiArMjMzLDcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWluVGhyZXNob2xkVXNlcnMoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBNaW5UaHJlc2hvbGQgZ3VhcmQgPSBuZXcgTWluVGhyZXNob2xkKCJ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFTT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gMTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1dhcm4sIHdoYXQsIHYsIHQpIC0+IGZvcm1hdCgiJXM6IGZvciAlcywgJXMgPCAlcyIsCkBAIC0yNTEsMzUgKzI2MCw1MyBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVGbGFnKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGVGbGFnKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKLSAgICAgICAgYXNzZXJ0RmFpbHMoKCkgLT4gbmV3IERpc2FibGVGbGFnKCJ4Iiwgc3RhdGUgLT4gdHJ1ZSwgIlgiKS5lbnN1cmVFbmFibGVkKHVzZXJDbGllbnRTdGF0ZSksICJYIGlzIG5vdCBhbGxvd2VkIik7Ci0gICAgICAgIGFzc2VydFZhbGlkKCgpIC0+IG5ldyBEaXNhYmxlRmxhZygieCIsIHN0YXRlIC0+IGZhbHNlLCAiWCIpLmVuc3VyZUVuYWJsZWQodXNlckNsaWVudFN0YXRlKSk7CisgICAgICAgIGFzc2VydEZhaWxzKCgpIC0+IG5ldyBFbmFibGVGbGFnKCJ4IiwgUkVBU09OLCBzdGF0ZSAtPiBmYWxzZSwgIlgiKS5lbnN1cmVFbmFibGVkKHVzZXJDbGllbnRTdGF0ZSksICJYIGlzIG5vdCBhbGxvd2VkIik7CisgICAgICAgIGFzc2VydFZhbGlkKCgpIC0+IG5ldyBFbmFibGVGbGFnKCJ4IiwgUkVBU09OLCBzdGF0ZSAtPiB0cnVlLCAiWCIpLmVuc3VyZUVuYWJsZWQodXNlckNsaWVudFN0YXRlKSk7CiAKLSAgICAgICAgYXNzZXJ0RmFpbHMoKCkgLT4gbmV3IERpc2FibGVGbGFnKCJ4Iiwgc3RhdGUgLT4gdHJ1ZSwgIlgiKS5lbnN1cmVFbmFibGVkKCJZIiwgdXNlckNsaWVudFN0YXRlKSwgIlkgaXMgbm90IGFsbG93ZWQiKTsKLSAgICAgICAgYXNzZXJ0VmFsaWQoKCkgLT4gbmV3IERpc2FibGVGbGFnKCJ4Iiwgc3RhdGUgLT4gZmFsc2UsICJYIikuZW5zdXJlRW5hYmxlZCgiWSIsIHVzZXJDbGllbnRTdGF0ZSkpOworICAgICAgICBhc3NlcnRGYWlscygoKSAtPiBuZXcgRW5hYmxlRmxhZygieCIsIFJFQVNPTiwgc3RhdGUgLT4gZmFsc2UsICJYIikuZW5zdXJlRW5hYmxlZCgiWSIsIHVzZXJDbGllbnRTdGF0ZSksICJZIGlzIG5vdCBhbGxvd2VkIik7CisgICAgICAgIGFzc2VydFZhbGlkKCgpIC0+IG5ldyBFbmFibGVGbGFnKCJ4IiwgUkVBU09OLCBzdGF0ZSAtPiB0cnVlLCAiWCIpLmVuc3VyZUVuYWJsZWQoIlkiLCB1c2VyQ2xpZW50U3RhdGUpKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlRmxhZ1VzZXJzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGVGbGFnVXNlcnMoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewotICAgICAgICBEaXNhYmxlRmxhZyBlbmFibGVkID0gbmV3IERpc2FibGVGbGFnKCJ4Iiwgc3RhdGUgLT4gZmFsc2UsICJYIik7CisgICAgICAgIEVuYWJsZUZsYWcgZW5hYmxlZCA9IG5ldyBFbmFibGVGbGFnKCJ4IiwgUkVBU09OLCBzdGF0ZSAtPiB0cnVlLCAiWCIpOwogICAgICAgICBhc3NlcnRWYWxpZCgoKSAtPiBlbmFibGVkLmVuc3VyZUVuYWJsZWQobnVsbCkpOwogICAgICAgICBhc3NlcnRWYWxpZCgoKSAtPiBlbmFibGVkLmVuc3VyZUVuYWJsZWQodXNlckNsaWVudFN0YXRlKSk7CiAgICAgICAgIGFzc2VydFZhbGlkKCgpIC0+IGVuYWJsZWQuZW5zdXJlRW5hYmxlZChzeXN0ZW1DbGllbnRTdGF0ZSkpOwogICAgICAgICBhc3NlcnRWYWxpZCgoKSAtPiBlbmFibGVkLmVuc3VyZUVuYWJsZWQoc3VwZXJDbGllbnRTdGF0ZSkpOwogCi0gICAgICAgIERpc2FibGVGbGFnIGRpc2FibGVkID0gbmV3IERpc2FibGVGbGFnKCJ4Iiwgc3RhdGUgLT4gdHJ1ZSwgIlgiKTsKKyAgICAgICAgRW5hYmxlRmxhZyBkaXNhYmxlZCA9IG5ldyBFbmFibGVGbGFnKCJ4IiwgUkVBU09OLCBzdGF0ZSAtPiBmYWxzZSwgIlgiKTsKICAgICAgICAgYXNzZXJ0RmFpbHMoKCkgLT4gZGlzYWJsZWQuZW5zdXJlRW5hYmxlZCh1c2VyQ2xpZW50U3RhdGUpLCAiWCBpcyBub3QgYWxsb3dlZCIpOwogICAgICAgICBhc3NlcnRWYWxpZCgoKSAtPiBkaXNhYmxlZC5lbnN1cmVFbmFibGVkKHN5c3RlbUNsaWVudFN0YXRlKSk7CiAgICAgICAgIGFzc2VydFZhbGlkKCgpIC0+IGRpc2FibGVkLmVuc3VyZUVuYWJsZWQoc3VwZXJDbGllbnRTdGF0ZSkpOwogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZUZsYWdXYXJuKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgRW5hYmxlRmxhZyBkaXNhYmxlZEd1YXJkID0gbmV3IEVuYWJsZUZsYWcoIngiLCBudWxsLCBzdGF0ZSAtPiB0cnVlLCBzdGF0ZSAtPiBmYWxzZSwgRkVBVFVSRSk7CisKKyAgICAgICAgYXNzZXJ0RmFpbHMoKCkgLT4gZGlzYWJsZWRHdWFyZC5lbnN1cmVFbmFibGVkKG51bGwpLCBmYWxzZSwgRkVBVFVSRSArICIgaXMgbm90IGFsbG93ZWQiKTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoKCkgLT4gZGlzYWJsZWRHdWFyZC5lbnN1cmVFbmFibGVkKHVzZXJDbGllbnRTdGF0ZSksIEZFQVRVUkUgKyAiIGlzIG5vdCBhbGxvd2VkIik7CisgICAgICAgIGFzc2VydFZhbGlkKCgpIC0+IGRpc2FibGVkR3VhcmQuZW5zdXJlRW5hYmxlZChzeXN0ZW1DbGllbnRTdGF0ZSkpOworICAgICAgICBhc3NlcnRWYWxpZCgoKSAtPiBkaXNhYmxlZEd1YXJkLmVuc3VyZUVuYWJsZWQoc3VwZXJDbGllbnRTdGF0ZSkpOworCisgICAgICAgIEVuYWJsZUZsYWcgZW5hYmxlZEd1YXJkID0gbmV3IEVuYWJsZUZsYWcoIngiLCBudWxsLCBzdGF0ZSAtPiB0cnVlLCBzdGF0ZSAtPiB0cnVlLCBGRUFUVVJFKTsKKyAgICAgICAgYXNzZXJ0V2FybnMoKCkgLT4gZW5hYmxlZEd1YXJkLmVuc3VyZUVuYWJsZWQobnVsbCksIEZFQVRVUkUgKyAiIGlzIG5vdCByZWNvbW1lbmRlZCIpOworICAgICAgICBhc3NlcnRXYXJucygoKSAtPiBlbmFibGVkR3VhcmQuZW5zdXJlRW5hYmxlZCh1c2VyQ2xpZW50U3RhdGUpLCBGRUFUVVJFICsgIiBpcyBub3QgcmVjb21tZW5kZWQiKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoKCkgLT4gZW5hYmxlZEd1YXJkLmVuc3VyZUVuYWJsZWQoc3lzdGVtQ2xpZW50U3RhdGUpKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoKCkgLT4gZW5hYmxlZEd1YXJkLmVuc3VyZUVuYWJsZWQoc3VwZXJDbGllbnRTdGF0ZSkpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFZhbHVlc1dhcm5lZCgpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIC8vIFVzaW5nIGEgc29ydGVkIHNldCBiZWxvdyB0byBlbnN1cmUgdGhlIG9yZGVyIGluIHRoZSB3YXJuaW5nIG1lc3NhZ2UgY2hlY2tlZCBiZWxvdyBpcyBub3QgcmFuZG9tCiAgICAgICAgIFZhbHVlczxJbnRlZ2VyPiB3YXJuZWQgPSBuZXcgVmFsdWVzPD4oIngiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQVNPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBpbnNlcnRpb25PcmRlcmVkU2V0KDQsIDYsIDIwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENvbGxlY3Rpb25zLmVtcHR5U2V0KCksCkBAIC0zMDAsNiArMzI3LDcgQEAKICAgICB7CiAgICAgICAgIC8vIFVzaW5nIGEgc29ydGVkIHNldCBiZWxvdyB0byBlbnN1cmUgdGhlIG9yZGVyIGluIHRoZSBlcnJvciBtZXNzYWdlIGNoZWNrZWQgYmVsb3cgYXJlIG5vdCByYW5kb20KICAgICAgICAgVmFsdWVzPEludGVnZXI+IGlnbm9yZWQgPSBuZXcgVmFsdWVzPD4oIngiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFTT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENvbGxlY3Rpb25zLmVtcHR5U2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IGluc2VydGlvbk9yZGVyZWRTZXQoNCwgNiwgMjApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLApAQCAtMzM0LDYgKzM2Miw3IEBACiAgICAgewogICAgICAgICAvLyBVc2luZyBhIHNvcnRlZCBzZXQgYmVsb3cgdG8gZW5zdXJlIHRoZSBvcmRlciBpbiB0aGUgZXJyb3IgbWVzc2FnZSBjaGVja2VkIGJlbG93IGFyZSBub3QgcmFuZG9tCiAgICAgICAgIFZhbHVlczxJbnRlZ2VyPiBkaXNhbGxvd2VkID0gbmV3IFZhbHVlczw+KCJ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBU09OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBpbnNlcnRpb25PcmRlcmVkU2V0KDQsIDYsIDIwKSwKQEAgLTM1OSw2ICszODgsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RWYWx1ZXNVc2VycygpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIFZhbHVlczxJbnRlZ2VyPiBkaXNhbGxvd2VkID0gbmV3IFZhbHVlczw+KCJ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBU09OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDb2xsZWN0aW9ucy5zaW5nbGV0b24oMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENvbGxlY3Rpb25zLnNpbmdsZXRvbigzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKDQpLApAQCAtMzk2LDYgKzQyNiw3IEBACiAgICAgcHVibGljIHZvaWQgdGVzdFByZWRpY2F0ZXMoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBQcmVkaWNhdGVzPEludGVnZXI+IGd1YXJkID0gbmV3IFByZWRpY2F0ZXM8PigieCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQVNPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4geCAtPiB4ID4gMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IHggLT4geCA+IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzV2FybiwgdmFsdWUpIC0+IGZvcm1hdCgiJXM6ICVzIiwgaXNXYXJuID8gIldhcm5pbmciIDogIkFib3J0aW5nIiwgdmFsdWUpKTsKQEAgLTQxMiw2ICs0NDMsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVkaWNhdGVzVXNlcnMoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBQcmVkaWNhdGVzPEludGVnZXI+IGd1YXJkID0gbmV3IFByZWRpY2F0ZXM8PigieCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQVNPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4geCAtPiB4ID4gMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IHggLT4geCA+IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzV2FybiwgdmFsdWUpIC0+IGZvcm1hdCgiJXM6ICVzIiwgaXNXYXJuID8gIldhcm5pbmciIDogIkFib3J0aW5nIiwgdmFsdWUpKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL1RocmVzaG9sZFRlc3Rlci5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvVGhyZXNob2xkVGVzdGVyLmphdmEKaW5kZXggZmFlMzA1YS4uN2Y3OTA3OCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvVGhyZXNob2xkVGVzdGVyLmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvVGhyZXNob2xkVGVzdGVyLmphdmEKQEAgLTI4LDExICsyOCw5IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhU3RvcmFnZVNwZWM7CiBpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFTdG9yYWdlU3BlYy5EYXRhU3RvcmFnZVVuaXQuQllURVM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKQEAgLTg5LDE0ICs4NywxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZXNob2xkIHRocmVzaG9sZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaUNvbnN1bWVyPEd1YXJkcmFpbHMsIFN0cmluZywgU3RyaW5nPiBzZXR0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjxHdWFyZHJhaWxzLCBTdHJpbmc+IHdhcm5HZXR0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjxHdWFyZHJhaWxzLCBTdHJpbmc+IGZhaWxHZXR0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjxHdWFyZHJhaWxzLCBTdHJpbmc+IGZhaWxHZXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjxMb25nLCBTdHJpbmc+IHN0cmluZ0Zvcm1hdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvTG9uZ0Z1bmN0aW9uPFN0cmluZz4gc3RyaW5nUGFyc2VyKQogICAgIHsKICAgICAgICAgc3VwZXIodGhyZXNob2xkKTsKLSAgICAgICAgdGhpcy53YXJuVGhyZXNob2xkID0gbmV3IERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCh3YXJuVGhyZXNob2xkKS50b0J5dGVzKCk7Ci0gICAgICAgIHRoaXMuZmFpbFRocmVzaG9sZCA9IG5ldyBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQoZmFpbFRocmVzaG9sZCkudG9CeXRlcygpOwotICAgICAgICB0aGlzLnNldHRlciA9IChnLCB3LCBhKSAtPiBzZXR0ZXIuYWNjZXB0KGcsIHcgPT0gbnVsbCA/IG51bGwgOiBuZXcgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kKHcsIEJZVEVTKS50b1N0cmluZygpLCBhID09IG51bGwgPyBudWxsIDogbmV3IERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZChhLCBCWVRFUykudG9TdHJpbmcoKSk7Ci0gICAgICAgIHRoaXMud2FybkdldHRlciA9IGcgLT4gbmV3IERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCh3YXJuR2V0dGVyLmFwcGx5KGcpKS50b0J5dGVzKCk7Ci0gICAgICAgIHRoaXMuZmFpbEdldHRlciA9IGcgLT4gbmV3IERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZChmYWlsR2V0dGVyLmFwcGx5KGcpKS50b0J5dGVzKCk7CisgICAgICAgIHRoaXMud2FyblRocmVzaG9sZCA9IHN0cmluZ1BhcnNlci5hcHBseUFzTG9uZyh3YXJuVGhyZXNob2xkKTsKKyAgICAgICAgdGhpcy5mYWlsVGhyZXNob2xkID0gc3RyaW5nUGFyc2VyLmFwcGx5QXNMb25nKGZhaWxUaHJlc2hvbGQpOworICAgICAgICB0aGlzLnNldHRlciA9IChnLCB3LCBmKSAtPiBzZXR0ZXIuYWNjZXB0KGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyA9PSBudWxsID8gbnVsbCA6IHN0cmluZ0Zvcm1hdHRlci5hcHBseSh3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID09IG51bGwgPyBudWxsIDogc3RyaW5nRm9ybWF0dGVyLmFwcGx5KGYpKTsKKyAgICAgICAgdGhpcy53YXJuR2V0dGVyID0gZyAtPiBzdHJpbmdQYXJzZXIuYXBwbHlBc0xvbmcod2FybkdldHRlci5hcHBseShnKSk7CisgICAgICAgIHRoaXMuZmFpbEdldHRlciA9IGcgLT4gc3RyaW5nUGFyc2VyLmFwcGx5QXNMb25nKGZhaWxHZXR0ZXIuYXBwbHkoZykpOwogICAgICAgICBtYXhWYWx1ZSA9IExvbmcuTUFYX1ZBTFVFIC0gMTsKICAgICAgICAgZGlzYWJsZWRWYWx1ZSA9IG51bGw7CiAgICAgfQpAQCAtMjQ3LDEwICsyNDksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgbmFtZSwgZGlzYWJsZWRWYWx1ZSk7CiAKICAgICAgICAgICAgIGlmIChleHBlY3RlZE1lc3NhZ2UgPT0gbnVsbCAmJiB2YWx1ZSA8IDApCi0gICAgICAgICAgICAgICAgZXhwZWN0ZWRNZXNzYWdlID0gZm9ybWF0KCJJbnZhbGlkIGRhdGEgc3RvcmFnZTogdmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUiKTsKKyAgICAgICAgICAgICAgICBleHBlY3RlZE1lc3NhZ2UgPSAidmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUiOwogCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybWF0KCJFeGNlcHRpb24gbWVzc2FnZSAnJXMnIGRvZXMgbm90IGNvbnRhaW4gJyVzJyIsIGUuZ2V0TWVzc2FnZSgpLCBleHBlY3RlZE1lc3NhZ2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkTWVzc2FnZSwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGUpLmhhc01lc3NhZ2VDb250YWluaW5nKGV4cGVjdGVkTWVzc2FnZSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvSGVscGVyc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvSGVscGVyc1Rlc3QuamF2YQppbmRleCAxYjEyMWMxLi4yMGFmMmEwIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL0hlbHBlcnNUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9IZWxwZXJzVGVzdC5qYXZhCkBAIC04NSw5ICs4NSw5IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpdHlNYXAoKQogICAgIHsKLSAgICAgICAgSW50ZWdlciBvbmUgPSBuZXcgSW50ZWdlcigxKTsKLSAgICAgICAgSW50ZWdlciB0d28gPSBuZXcgSW50ZWdlcigyKTsKLSAgICAgICAgSW50ZWdlciB0aHJlZSA9IG5ldyBJbnRlZ2VyKDMpOworICAgICAgICBJbnRlZ2VyIG9uZSA9IEludGVnZXIudmFsdWVPZigxKTsKKyAgICAgICAgSW50ZWdlciB0d28gPSBJbnRlZ2VyLnZhbHVlT2YoMik7CisgICAgICAgIEludGVnZXIgdGhyZWUgPSBJbnRlZ2VyLnZhbHVlT2YoMyk7CiAgICAgICAgIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBpZGVudGl0eSA9IEhlbHBlcnMuaWRlbnRpdHlNYXAoc2V0KG9uZSwgdHdvLCB0aHJlZSkpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIGlkZW50aXR5LnNpemUoKSk7CiAgICAgICAgIEFzc2VydC5hc3NlcnRTYW1lKG9uZSwgaWRlbnRpdHkuZ2V0KDEpKTsKQEAgLTEyNCw3ICsxMjQsNyBAQAogICAgICAgICBmYWlsdXJlID0gZmFsc2U7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gbm90SWRlbnRpdHkgPSBJbW11dGFibGVNYXAub2YoMSwgbmV3IEludGVnZXIoMSksIDIsIDIsIDMsIDMpOworICAgICAgICAgICAgTWFwPEludGVnZXIsIEludGVnZXI+IG5vdElkZW50aXR5ID0gSW1tdXRhYmxlTWFwLm9mKEludGVnZXIuTUlOX1ZBTFVFLCBJbnRlZ2VyLnZhbHVlT2YoSW50ZWdlci5NSU5fVkFMVUUpLCAyLCAyLCAzLCAzKTsKICAgICAgICAgICAgIEhlbHBlcnMucmVwbGFjZShub3RJZGVudGl0eSwgYSwgYik7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKEFzc2VydGlvbkVycm9yIGUpCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL0xvZ1RyYW5zYWN0aW9uVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9Mb2dUcmFuc2FjdGlvblRlc3QuamF2YQppbmRleCAyODEyMzUzLi44YWZlNzdlIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL0xvZ1RyYW5zYWN0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvTG9nVHJhbnNhY3Rpb25UZXN0LmphdmEKQEAgLTQxLDE1ICs0MSwyMiBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TZXF1ZW5jZUJhc2VkU1NUYWJsZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQuQ29tcG9uZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpLkJ0aUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5idGkuQnRpVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpLlBhcnRpdGlvbkluZGV4OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb2xsZWN0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YVR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5TdGF0c01ldGFkYXRhOwpAQCAtNTcsNyArNjQsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuTW9ja1NjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5BbHdheXNQcmVzZW50RmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZpbHRlckZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkFic3RyYWN0VHJhbnNhY3Rpb25hbFRlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5UcmFuc2FjdGlvbmFsOwpAQCAtODM5LDIyICs4NDYsMTcgQEAKICAgICAgICAgICAgIGFzc2VydE5vdE51bGwodG1wRmlsZXMpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bU5ld0ZpbGVzIC0gMSwgdG1wRmlsZXMuc2l6ZSgpKTsKIAotICAgICAgICAgICAgRmlsZSBzc1RhYmxlMkRhdGFGaWxlID0gbmV3IEZpbGUoc3N0YWJsZTIuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpOwotICAgICAgICAgICAgRmlsZSBzc1RhYmxlMkluZGV4RmlsZSA9IG5ldyBGaWxlKHNzdGFibGUyLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlBSSU1BUllfSU5ERVgpKTsKKyAgICAgICAgICAgIExpc3Q8RmlsZT4gc3N0YWJsZUZpbGVzID0gc3N0YWJsZTIuZGVzY3JpcHRvci5nZXRGb3JtYXQoKS5wcmltYXJ5Q29tcG9uZW50cygpLnN0cmVhbSgpLm1hcChzc3RhYmxlMi5kZXNjcmlwdG9yOjpmaWxlRm9yKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOwogCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHRtcEZpbGVzLmNvbnRhaW5zKHNzVGFibGUyRGF0YUZpbGUpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUodG1wRmlsZXMuY29udGFpbnMoc3NUYWJsZTJJbmRleEZpbGUpKTsKKyAgICAgICAgICAgIGZvciAoRmlsZSBmIDogdG1wRmlsZXMpIGFzc2VydFRydWUodG1wRmlsZXMuY29udGFpbnMoZikpOwogCiAgICAgICAgICAgICBMaXN0PEZpbGU+IGZpbGVzID0gZGlyZWN0b3JpZXMuc3N0YWJsZUxpc3RlcihEaXJlY3Rvcmllcy5PblR4bkVyci5USFJPVykubGlzdEZpbGVzKCk7CiAgICAgICAgICAgICBMaXN0PEZpbGU+IGZpbGVzTm9UbXAgPSBkaXJlY3Rvcmllcy5zc3RhYmxlTGlzdGVyKERpcmVjdG9yaWVzLk9uVHhuRXJyLlRIUk9XKS5za2lwVGVtcG9yYXJ5KHRydWUpLmxpc3RGaWxlcygpOwogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChmaWxlcyk7CiAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGZpbGVzTm9UbXApOwogCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZpbGVzLmNvbnRhaW5zKHNzVGFibGUyRGF0YUZpbGUpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZmlsZXMuY29udGFpbnMoc3NUYWJsZTJJbmRleEZpbGUpKTsKLQotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZmlsZXNOb1RtcC5jb250YWlucyhzc1RhYmxlMkRhdGFGaWxlKSk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShmaWxlc05vVG1wLmNvbnRhaW5zKHNzVGFibGUySW5kZXhGaWxlKSk7CisgICAgICAgICAgICBmb3IgKEZpbGUgZiA6IHRtcEZpbGVzKSBhc3NlcnRUcnVlKGZpbGVzLmNvbnRhaW5zKGYpKTsKKyAgICAgICAgICAgIGZvciAoRmlsZSBmIDogdG1wRmlsZXMpIGFzc2VydEZhbHNlKGZpbGVzTm9UbXAuY29udGFpbnMoZikpOwogCiAgICAgICAgICAgICBsb2cuZmluaXNoKCk7CiAKQEAgLTg2NSw4ICs4NjcsOCBAQAogCiAgICAgICAgICAgICBmaWxlc05vVG1wID0gZGlyZWN0b3JpZXMuc3N0YWJsZUxpc3RlcihEaXJlY3Rvcmllcy5PblR4bkVyci5USFJPVykuc2tpcFRlbXBvcmFyeSh0cnVlKS5saXN0RmlsZXMoKTsKICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZmlsZXNOb1RtcCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGZpbGVzTm9UbXAuY29udGFpbnMoc3NUYWJsZTJEYXRhRmlsZSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlc05vVG1wLmNvbnRhaW5zKHNzVGFibGUySW5kZXhGaWxlKSk7CisKKyAgICAgICAgICAgIGZvciAoRmlsZSBmIDogdG1wRmlsZXMpIGFzc2VydFRydWUoZmlsZXNOb1RtcC5jb250YWlucyhmKSk7CiAKICAgICAgICAgICAgIHNzdGFibGUxLnNlbGZSZWYoKS5yZWxlYXNlKCk7CiAgICAgICAgICAgICBzc3RhYmxlMi5zZWxmUmVmKCkucmVsZWFzZSgpOwpAQCAtMTI2MSwzNyArMTI2Myw4MiBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgU1NUYWJsZVJlYWRlciBzc3RhYmxlKEZpbGUgZGF0YUZvbGRlciwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBpbnQgZ2VuZXJhdGlvbiwgaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IERlc2NyaXB0b3IoZGF0YUZvbGRlciwgY2ZzLmtleXNwYWNlLmdldE5hbWUoKSwgY2ZzLmdldFRhYmxlTmFtZSgpLCBuZXcgU2VxdWVuY2VCYXNlZFNTVGFibGVJZChnZW5lcmF0aW9uKSwgU1NUYWJsZUZvcm1hdC5UeXBlLkJJRyk7Ci0gICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBJbW11dGFibGVTZXQub2YoQ29tcG9uZW50LkRBVEEsIENvbXBvbmVudC5QUklNQVJZX0lOREVYLCBDb21wb25lbnQuRklMVEVSLCBDb21wb25lbnQuVE9DKTsKLSAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogY29tcG9uZW50cykKKyAgICAgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IERlc2NyaXB0b3IoZGF0YUZvbGRlciwgY2ZzLmtleXNwYWNlLmdldE5hbWUoKSwgY2ZzLmdldFRhYmxlTmFtZSgpLCBuZXcgU2VxdWVuY2VCYXNlZFNTVGFibGVJZChnZW5lcmF0aW9uKSwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpKTsKKyAgICAgICAgaWYgKEJpZ0Zvcm1hdC5pc1NlbGVjdGVkKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoY29tcG9uZW50KSk7Ci0gICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlLmNyZWF0ZUZpbGVJZk5vdEV4aXN0cygpKTsKKyAgICAgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBJbW11dGFibGVTZXQub2YoQ29tcG9uZW50cy5EQVRBLCBDb21wb25lbnRzLlBSSU1BUllfSU5ERVgsIENvbXBvbmVudHMuRklMVEVSLCBDb21wb25lbnRzLlRPQyk7CisgICAgICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBjb21wb25lbnRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IGRlc2NyaXB0b3IuZmlsZUZvcihjb21wb25lbnQpOworICAgICAgICAgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlLmNyZWF0ZUZpbGVJZk5vdEV4aXN0cygpKTsKIAotICAgICAgICAgICAgVXRpbC5zZXRGaWxlTGVuZ3RoKGZpbGUsIHNpemUpOworICAgICAgICAgICAgICAgIFV0aWwuc2V0RmlsZUxlbmd0aChmaWxlLCBzaXplKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRmlsZUhhbmRsZSBkRmlsZSA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuREFUQSkpLmNvbXBsZXRlKCk7CisgICAgICAgICAgICBGaWxlSGFuZGxlIGlGaWxlID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5QUklNQVJZX0lOREVYKSkuY29tcGxldGUoKTsKKworICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IE1vY2tTY2hlbWEucmVhZGVyQm91bmRzKGdlbmVyYXRpb24pOworICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIgPSBTZXJpYWxpemF0aW9uSGVhZGVyLm1ha2UoY2ZzLm1ldGFkYXRhKCksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKKyAgICAgICAgICAgIFN0YXRzTWV0YWRhdGEgbWV0YWRhdGEgPSAoU3RhdHNNZXRhZGF0YSkgbmV3IE1ldGFkYXRhQ29sbGVjdG9yKGNmcy5tZXRhZGF0YSgpLmNvbXBhcmF0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5hbGl6ZU1ldGFkYXRhKGNmcy5tZXRhZGF0YSgpLnBhcnRpdGlvbmVyLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpLCAwLjAxZiwgLTEsIG51bGwsIGZhbHNlLCBoZWFkZXIsIGtleS5nZXRLZXkoKS5zbGljZSgpLCBrZXkuZ2V0S2V5KCkuc2xpY2UoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChNZXRhZGF0YVR5cGUuU1RBVFMpOworICAgICAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXIgPSBuZXcgQmlnVGFibGVSZWFkZXIuQnVpbGRlcihkZXNjcmlwdG9yKS5zZXRDb21wb25lbnRzKGNvbXBvbmVudHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRhYmxlTWV0YWRhdGFSZWYoY2ZzLm1ldGFkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREYXRhRmlsZShkRmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5kZXhGaWxlKGlGaWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbmRleFN1bW1hcnkoTW9ja1NjaGVtYS5pbmRleFN1bW1hcnkuc2hhcmVkQ29weSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWx0ZXIoRmlsdGVyRmFjdG9yeS5BbHdheXNQcmVzZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNYXhEYXRhQWdlKDFMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTdGF0c01ldGFkYXRhKG1ldGFkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRPcGVuUmVhc29uKFNTVGFibGVSZWFkZXIuT3BlblJlYXNvbi5OT1JNQUwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNlcmlhbGl6YXRpb25IZWFkZXIoaGVhZGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaXJzdChrZXkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhc3Qoa2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZChjZnMsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gcmVhZGVyOwogICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEJ0aUZvcm1hdC5pc1NlbGVjdGVkKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBJbW11dGFibGVTZXQub2YoQ29tcG9uZW50cy5EQVRBLCBCdGlGb3JtYXQuQ29tcG9uZW50cy5QQVJUSVRJT05fSU5ERVgsIEJ0aUZvcm1hdC5Db21wb25lbnRzLlJPV19JTkRFWCwgQ29tcG9uZW50cy5GSUxURVIsIENvbXBvbmVudHMuVE9DKTsKKyAgICAgICAgICAgIGZvciAoQ29tcG9uZW50IGNvbXBvbmVudCA6IGNvbXBvbmVudHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gZGVzY3JpcHRvci5maWxlRm9yKGNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKQorICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGZpbGUuY3JlYXRlRmlsZUlmTm90RXhpc3RzKCkpOwogCi0gICAgICAgIEZpbGVIYW5kbGUgZEZpbGUgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpKS5jb21wbGV0ZSgpOwotICAgICAgICBGaWxlSGFuZGxlIGlGaWxlID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5QUklNQVJZX0lOREVYKSkuY29tcGxldGUoKTsKKyAgICAgICAgICAgICAgICBVdGlsLnNldEZpbGVMZW5ndGgoZmlsZSwgc2l6ZSk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIgPSBTZXJpYWxpemF0aW9uSGVhZGVyLm1ha2UoY2ZzLm1ldGFkYXRhKCksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLSAgICAgICAgU3RhdHNNZXRhZGF0YSBtZXRhZGF0YSA9IChTdGF0c01ldGFkYXRhKSBuZXcgTWV0YWRhdGFDb2xsZWN0b3IoY2ZzLm1ldGFkYXRhKCkuY29tcGFyYXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluYWxpemVNZXRhZGF0YShjZnMubWV0YWRhdGEoKS5wYXJ0aXRpb25lci5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSwgMC4wMWYsIC0xLCBudWxsLCBmYWxzZSwgaGVhZGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoTWV0YWRhdGFUeXBlLlNUQVRTKTsKLSAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXIgPSBTU1RhYmxlUmVhZGVyLmludGVybmFsT3BlbihkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLm1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vY2tTY2hlbWEuaW5kZXhTdW1tYXJ5LnNoYXJlZENvcHkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWx3YXlzUHJlc2VudEZpbHRlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIuT3BlblJlYXNvbi5OT1JNQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyKTsKLSAgICAgICAgcmVhZGVyLmZpcnN0ID0gcmVhZGVyLmxhc3QgPSBNb2NrU2NoZW1hLnJlYWRlckJvdW5kcyhnZW5lcmF0aW9uKTsKLSAgICAgICAgcmV0dXJuIHJlYWRlcjsKKyAgICAgICAgICAgIEZpbGVIYW5kbGUgZEZpbGUgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpKS5jb21wbGV0ZSgpOworICAgICAgICAgICAgRmlsZUhhbmRsZSBpRmlsZSA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZGVzY3JpcHRvci5maWxlRm9yKEJ0aUZvcm1hdC5Db21wb25lbnRzLlBBUlRJVElPTl9JTkRFWCkpLmNvbXBsZXRlKCk7CisgICAgICAgICAgICBGaWxlSGFuZGxlIHJGaWxlID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihkZXNjcmlwdG9yLmZpbGVGb3IoQnRpRm9ybWF0LkNvbXBvbmVudHMuUk9XX0lOREVYKSkuY29tcGxldGUoKTsKKworICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IE1vY2tTY2hlbWEucmVhZGVyQm91bmRzKGdlbmVyYXRpb24pOworICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIgPSBTZXJpYWxpemF0aW9uSGVhZGVyLm1ha2UoY2ZzLm1ldGFkYXRhKCksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKKyAgICAgICAgICAgIFN0YXRzTWV0YWRhdGEgbWV0YWRhdGEgPSAoU3RhdHNNZXRhZGF0YSkgbmV3IE1ldGFkYXRhQ29sbGVjdG9yKGNmcy5tZXRhZGF0YSgpLmNvbXBhcmF0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5hbGl6ZU1ldGFkYXRhKGNmcy5tZXRhZGF0YSgpLnBhcnRpdGlvbmVyLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpLCAwLjAxZiwgLTEsIG51bGwsIGZhbHNlLCBoZWFkZXIsIGtleS5nZXRLZXkoKS5zbGljZSgpLCBrZXkuZ2V0S2V5KCkuc2xpY2UoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChNZXRhZGF0YVR5cGUuU1RBVFMpOworICAgICAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXIgPSBuZXcgQnRpVGFibGVSZWFkZXIuQnVpbGRlcihkZXNjcmlwdG9yKS5zZXRDb21wb25lbnRzKGNvbXBvbmVudHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRhYmxlTWV0YWRhdGFSZWYoY2ZzLm1ldGFkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREYXRhRmlsZShkRmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UGFydGl0aW9uSW5kZXgobmV3IFBhcnRpdGlvbkluZGV4KGlGaWxlLCAwLCAwLCBNb2NrU2NoZW1hLnJlYWRlckJvdW5kcyhnZW5lcmF0aW9uKSwgTW9ja1NjaGVtYS5yZWFkZXJCb3VuZHMoZ2VuZXJhdGlvbikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRSb3dJbmRleEZpbGUockZpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpbHRlcihGaWx0ZXJGYWN0b3J5LkFsd2F5c1ByZXNlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1heERhdGFBZ2UoMUwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFN0YXRzTWV0YWRhdGEobWV0YWRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE9wZW5SZWFzb24oU1NUYWJsZVJlYWRlci5PcGVuUmVhc29uLk5PUk1BTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2VyaWFsaXphdGlvbkhlYWRlcihoZWFkZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpcnN0KGtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGFzdChrZXkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKGNmcywgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiByZWFkZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBVdGlsLnRlc3RNdXN0QmVJbXBsZW1lbnRlZEZvclNTVGFibGVGb3JtYXQoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RmlsZXMoU3RyaW5nIGRpclBhdGgsIFNldDxTdHJpbmc+IGV4cGVjdGVkRmlsZXMpIHRocm93cyBJT0V4Y2VwdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9SZWFsVHJhbnNhY3Rpb25zVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9SZWFsVHJhbnNhY3Rpb25zVGVzdC5qYXZhCmluZGV4IDA0MjA5NTcuLjg1YzhhZTAgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvUmVhbFRyYW5zYWN0aW9uc1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL1JlYWxUcmFuc2FjdGlvbnNUZXN0LmphdmEKQEAgLTI0LDE0ICsyNCwxMSBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLWltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7CkBAIC00Myw4ICs0MCwxMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZXdyaXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbGxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLm5hbm9UaW1lOwpAQCAtMTYwLDE4ICsxNjAsMTYgQEAKICAgICAgICAgICAgICAgICBGaWxlIGRpcmVjdG9yeSA9IHR4bi5vcmlnaW5hbHMoKS5pdGVyYXRvcigpLm5leHQoKS5kZXNjcmlwdG9yLmRpcmVjdG9yeTsKICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBjZnMubmV3U1NUYWJsZURlc2NyaXB0b3IoZGlyZWN0b3J5KTsKICAgICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhID0gU2NoZW1hLmluc3RhbmNlLmdldFRhYmxlTWV0YWRhdGFSZWYoZGVzYyk7Ci0gICAgICAgICAgICAgICAgcmV3cml0ZXIuc3dpdGNoV3JpdGVyKFNTVGFibGVXcml0ZXIuY3JlYXRlKG1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlci5tYWtlKGNmcy5tZXRhZGF0YSgpLCB0eG4ub3JpZ2luYWxzKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMuaW5kZXhNYW5hZ2VyLmxpc3RJbmRleGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4bikpOworICAgICAgICAgICAgICAgIHJld3JpdGVyLnN3aXRjaFdyaXRlcihkZXNjLmdldEZvcm1hdCgpLmdldFdyaXRlckZhY3RvcnkoKS5idWlsZGVyKGRlc2MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGFibGVNZXRhZGF0YVJlZihtZXRhZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTZXJpYWxpemF0aW9uSGVhZGVyKFNlcmlhbGl6YXRpb25IZWFkZXIubWFrZShjZnMubWV0YWRhdGEoKSwgdHhuLm9yaWdpbmFscygpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRGbHVzaE9ic2VydmVyc0ZvclNlY29uZGFyeUluZGV4ZXMoY2ZzLmluZGV4TWFuYWdlci5saXN0SW5kZXhlcygpLCB0eG4ub3BUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWV0YWRhdGFDb2xsZWN0b3IobmV3IE1ldGFkYXRhQ29sbGVjdG9yKGNmcy5tZXRhZGF0YSgpLmNvbXBhcmF0b3IpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZERlZmF1bHRDb21wb25lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCh0eG4sIGNmcykpOwogICAgICAgICAgICAgICAgIHdoaWxlIChjaS5oYXNOZXh0KCkpCiAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaS5zZXRUYXJnZXREaXJlY3RvcnkocmV3cml0ZXIuY3VycmVudFdyaXRlcigpLmdldEZpbGVuYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICByZXdyaXRlci5hcHBlbmQoY2kubmV4dCgpKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAobmFub1RpbWUoKSAtIGxhc3RDaGVja09ic29sZXRpb24gPiBUaW1lVW5pdC5NSU5VVEVTLnRvTmFub3MoMUwpKQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9UcmFja2VyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9UcmFja2VyVGVzdC5qYXZhCmluZGV4IGUzOWY3MWYuLmQ2ZTM3NDIgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvVHJhY2tlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL1RyYWNrZXJUZXN0LmphdmEKQEAgLTQxLDcgKzQxLDE4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLk1lbXRhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUua2V5Y2FjaGUuS2V5Q2FjaGVTdXBwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5vdGlmaWNhdGlvbnMuSU5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLklOb3RpZmljYXRpb25Db25zdW1lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLkluaXRpYWxTU1RhYmxlQWRkZWROb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5NZW10YWJsZURpc2NhcmRlZE5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLk1lbXRhYmxlUmVuZXdlZE5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLk1lbXRhYmxlU3dpdGNoZWROb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5TU1RhYmxlQWRkZWROb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5TU1RhYmxlRGVsZXRpbmdOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5TU1RhYmxlTGlzdENoYW5nZWROb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5TU1RhYmxlTWV0YWRhdGFDaGFuZ2VkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5vdGlmaWNhdGlvbnMuU1NUYWJsZVJlcGFpclN0YXR1c0NoYW5nZWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNhY2hpbmdQYXJhbXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLk1vY2tTY2hlbWE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5PcE9yZGVyOwpAQCAtMTYyLDcgKzE3Myw4IEBACiAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGxpc3RlbmVyLnJlY2VpdmVkLmdldCgwKSBpbnN0YW5jZW9mIEluaXRpYWxTU1RhYmxlQWRkZWROb3RpZmljYXRpb24pOwogCiAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciByZWFkZXIgOiByZWFkZXJzKQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVhZGVyLmlzS2V5Q2FjaGVFbmFibGVkKCkpOworICAgICAgICAgICAgaWYgKHJlYWRlciBpbnN0YW5jZW9mIEtleUNhY2hlU3VwcG9ydDw/PikKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgoKEtleUNhY2hlU3VwcG9ydDw/PilyZWFkZXIpLmdldEtleUNhY2hlKCkuaXNFbmFibGVkKCkpOwogCiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTcgKyAxMjEgKyA5LCBjZnMubWV0cmljLmxpdmVEaXNrU3BhY2VVc2VkLmdldENvdW50KCkpOwogICAgIH0KQEAgLTE4NCw3ICsxOTYsMTAgQEAKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzLCB0cmFja2VyLnZpZXcuZ2V0KCkuc3N0YWJsZXMuc2l6ZSgpKTsKIAogICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgcmVhZGVyIDogcmVhZGVycykKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlYWRlci5pc0tleUNhY2hlRW5hYmxlZCgpKTsKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJlYWRlciBpbnN0YW5jZW9mIEtleUNhY2hlU3VwcG9ydDw/PikKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgoKEtleUNhY2hlU3VwcG9ydDw/PilyZWFkZXIpLmdldEtleUNhY2hlKCkuaXNFbmFibGVkKCkpOworICAgICAgICB9CiAKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxNyArIDEyMSArIDksIGNmcy5tZXRyaWMubGl2ZURpc2tTcGFjZVVzZWQuZ2V0Q291bnQoKSk7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbGlzdGVuZXIuc2VuZGVycy5zaXplKCkpOwpAQCAtMzE2LDcgKzMzMSw4IEBACiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc2luZ2xldG9uKHJlYWRlciksICgoU1NUYWJsZUFkZGVkTm90aWZpY2F0aW9uKSBsaXN0ZW5lci5yZWNlaXZlZC5nZXQoMSkpLmFkZGVkKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhPcHRpb25hbC5vZihwcmV2MiksICgoU1NUYWJsZUFkZGVkTm90aWZpY2F0aW9uKSBsaXN0ZW5lci5yZWNlaXZlZC5nZXQoMSkpLm1lbXRhYmxlKCkpOwogICAgICAgICBsaXN0ZW5lci5yZWNlaXZlZC5jbGVhcigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZWFkZXIuaXNLZXlDYWNoZUVuYWJsZWQoKSk7CisgICAgICAgIGlmIChyZWFkZXIgaW5zdGFuY2VvZiBLZXlDYWNoZVN1cHBvcnQ8Pz4pCisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgoKEtleUNhY2hlU3VwcG9ydDw/PikgcmVhZGVyKS5nZXRLZXlDYWNoZSgpLmlzRW5hYmxlZCgpKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMCwgY2ZzLm1ldHJpYy5saXZlRGlza1NwYWNlVXNlZC5nZXRDb3VudCgpKTsKIAogICAgICAgICAvLyB0ZXN0IGludmFsaWRhdGVkIENGUwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvRHluYW1pY0NvbXBvc2l0ZVR5cGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9EeW5hbWljQ29tcG9zaXRlVHlwZVRlc3QuamF2YQppbmRleCBkMjJhOGFjLi42OWMxZWI1IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9EeW5hbWljQ29tcG9zaXRlVHlwZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9EeW5hbWljQ29tcG9zaXRlVHlwZVRlc3QuamF2YQpAQCAtNDcsNyArNDcsNyBAQAogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTUEFDRTEgPSAiRHluYW1pY0NvbXBvc2l0ZVR5cGUiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9TVEFOREFSRERZTkNPTVBPU0lURSA9ICJTdGFuZGFyZER5bmFtaWNDb21wb3NpdGUiOwotICAgIHByaXZhdGUgc3RhdGljIE1hcDxCeXRlLCBBYnN0cmFjdFR5cGU8Pz4+IGFsaWFzZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgcHVibGljIHN0YXRpYyBNYXA8Qnl0ZSwgQWJzdHJhY3RUeXBlPD8+PiBhbGlhc2VzID0gbmV3IEhhc2hNYXA8PigpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRHluYW1pY0NvbXBvc2l0ZVR5cGUgY29tcGFyYXRvcjsKICAgICBzdGF0aWMKQEAgLTYwLDcgKzYwLDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVVVJRF9DT1VOVCA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVVJRFtdIHV1aWRzID0gbmV3IFVVSURbVVVJRF9DT1VOVF07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVVUlEW10gdXVpZHMgPSBuZXcgVVVJRFtVVUlEX0NPVU5UXTsKICAgICBzdGF0aWMKICAgICB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVVVJRF9DT1VOVDsgKytpKQpAQCAtMzIwLDEzICszMjAsMTIgQEAKICAgICAgICAgYXNzZXJ0ICFUeXBlUGFyc2VyLnBhcnNlKCJEeW5hbWljQ29tcG9zaXRlVHlwZShhID0+IEJ5dGVzVHlwZSkiKS5pc0NvbXBhdGlibGVXaXRoKFR5cGVQYXJzZXIucGFyc2UoIkR5bmFtaWNDb21wb3NpdGVUeXBlKGEgPT4gQnl0ZXNUeXBlLCBiID0+IEFzY2lpVHlwZSkiKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBCeXRlQnVmZmVyIGNyZWF0ZUR5bmFtaWNDb21wb3NpdGVLZXkoU3RyaW5nIHMsIFVVSUQgdXVpZCwgaW50IGksIGJvb2xlYW4gbGFzdElzT25lKQorICAgIHByaXZhdGUgc3RhdGljIEJ5dGVCdWZmZXIgY3JlYXRlRHluYW1pY0NvbXBvc2l0ZUtleShTdHJpbmcgcywgVVVJRCB1dWlkLCBpbnQgaSwgYm9vbGVhbiBsYXN0SXNPbmUpCiAgICAgewogICAgICAgICByZXR1cm4gY3JlYXRlRHluYW1pY0NvbXBvc2l0ZUtleShzLCB1dWlkLCBpLCBsYXN0SXNPbmUsIGZhbHNlKTsKICAgICB9CiAKLSAgICBwcml2YXRlIEJ5dGVCdWZmZXIgY3JlYXRlRHluYW1pY0NvbXBvc2l0ZUtleShTdHJpbmcgcywgVVVJRCB1dWlkLCBpbnQgaSwgYm9vbGVhbiBsYXN0SXNPbmUsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHJldmVyc2VkKQorICAgIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlciBjcmVhdGVEeW5hbWljQ29tcG9zaXRlS2V5KFN0cmluZyBzLCBVVUlEIHV1aWQsIGludCBpLCBib29sZWFuIGxhc3RJc09uZSwgYm9vbGVhbiByZXZlcnNlZCkKICAgICB7CiAgICAgICAgIFN0cmluZyBpbnRUeXBlID0gKHJldmVyc2VkID8gIlJldmVyc2VkVHlwZShJbnRlZ2VyVHlwZSkiIDogIkludGVnZXJUeXBlIik7CiAgICAgICAgIEJ5dGVCdWZmZXIgYnl0ZXMgPSBCeXRlQnVmZmVyVXRpbC5ieXRlcyhzKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0pzb25Db252ZXJzaW9uVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvSnNvbkNvbnZlcnNpb25UZXN0LmphdmEKaW5kZXggYmFiMDYxMS4uZTg5YTcyMiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvSnNvbkNvbnZlcnNpb25UZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvSnNvbkNvbnZlcnNpb25UZXN0LmphdmEKQEAgLTIzLDE2ICsyMywxNCBAQAogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIAotaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5RdWVyeU9wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Kc29uVXRpbHM7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogcHVibGljIGNsYXNzIEpzb25Db252ZXJzaW9uVGVzdAogewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdE1hcHBlciBKU09OX09CSkVDVF9NQVBQRVIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7Ci0KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RNYXAoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewpAQCAtMzExLDcgKzMwOSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRCeXRlYnVmZmVyUG9zaXRpb25BbmRPdXRwdXQoU3RyaW5nIGpzb24sIFN0cmluZyB0eXBlU3RyaW5nKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewogICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdHlwZSA9IFR5cGVQYXJzZXIucGFyc2UodHlwZVN0cmluZyk7Ci0gICAgICAgIE9iamVjdCBqc29uT2JqZWN0ID0gSlNPTl9PQkpFQ1RfTUFQUEVSLnJlYWRWYWx1ZShqc29uLCBPYmplY3QuY2xhc3MpOworICAgICAgICBPYmplY3QganNvbk9iamVjdCA9IEpzb25VdGlscy5KU09OX09CSkVDVF9NQVBQRVIucmVhZFZhbHVlKGpzb24sIE9iamVjdC5jbGFzcyk7CiAgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSB0eXBlLmZyb21KU09OT2JqZWN0KGpzb25PYmplY3QpLmJpbmRBbmRHZXQoUXVlcnlPcHRpb25zLkRFRkFVTFQpOwogICAgICAgICBpbnQgcG9zaXRpb24gPSBiYi5wb3NpdGlvbigpOwogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9UaW1lVHlwZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1RpbWVUeXBlVGVzdC5qYXZhCmluZGV4IGQ2MWQyYzYuLjI2YTJiMTUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1RpbWVUeXBlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1RpbWVUeXBlVGVzdC5qYXZhCkBAIC0xLDQgKzEsNCBAQAotLyoqCisvKgogICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCiAgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgpAQCAtMjksMTEgKzI5LDEyIEBACiAKIHB1YmxpYyBjbGFzcyBUaW1lVHlwZVRlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKIHsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJQb2ludGxlc3NBcml0aG1ldGljRXhwcmVzc2lvbiIsICJXcmFwcGVyVHlwZU1heUJlUHJpbWl0aXZlIiB9KQogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmlzb24oKQogICAgIHsKICAgICAgICAgTG9uZyB0MSA9IFRpbWVTZXJpYWxpemVyLnRpbWVTdHJpbmdUb0xvbmcoIjAxOjAwOjAwLjEyMzQ1Njc4OSIpOwotICAgICAgICBMb25nIHQyID0gbmV3IExvbmcoKDFMICogNjBMICogNjBMICogMTAwMEwgKiAxMDAwTCAqIDEwMDBMKSArIDEyMzQ1Njc4OSk7CisgICAgICAgIExvbmcgdDIgPSAxTCAqIDYwTCAqIDYwTCAqIDEwMDBMICogMTAwMEwgKiAxMDAwTCArIDEyMzQ1Njc4OUw7CiAgICAgICAgIEJ5dGVCdWZmZXIgYjEgPSBUaW1lU2VyaWFsaXplci5pbnN0YW5jZS5zZXJpYWxpemUodDEpOwogICAgICAgICBCeXRlQnVmZmVyIGIyID0gVGltZVNlcmlhbGl6ZXIuaW5zdGFuY2Uuc2VyaWFsaXplKHQyKTsKICAgICAgICAgYXNzZXJ0IFRpbWVUeXBlLmluc3RhbmNlLmNvbXBhcmUoYjEsIGIyKSA9PSAwIDogIkZhaWxlZCA9PSBjb21wYXJpc29uIjsKQEAgLTQxLDcgKzQyLDcgQEAKICAgICAgICAgYjIgPSBUaW1lU2VyaWFsaXplci5pbnN0YW5jZS5zZXJpYWxpemUoMTIzNDU2Nzg5TCk7CiAgICAgICAgIGFzc2VydCBUaW1lVHlwZS5pbnN0YW5jZS5jb21wYXJlKGIxLCBiMikgPiAwIDogIkZhaWxlZCA+IGNvbXBhcmlzb24iOwogCi0gICAgICAgIHQyID0gbmV3IExvbmcoMkwgKiA2MEwgKiA2MEwgKiAxMDAwTCAqIDEwMDBMICogMTAwMEwgKyAxMjM0NTY3ODkpOworICAgICAgICB0MiA9IDJMICogNjBMICogNjBMICogMTAwMEwgKiAxMDAwTCAqIDEwMDBMICsgMTIzNDU2Nzg5TDsKICAgICAgICAgYjIgPSBUaW1lU2VyaWFsaXplci5pbnN0YW5jZS5zZXJpYWxpemUodDIpOwogICAgICAgICBhc3NlcnQgVGltZVR5cGUuaW5zdGFuY2UuY29tcGFyZShiMSwgYjIpIDwgMCA6ICJGYWlsZWQgPCBjb21wYXJpc29uIjsKIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvVHlwZVZhbGlkYXRpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9UeXBlVmFsaWRhdGlvblRlc3QuamF2YQppbmRleCA0ZDI1YTFmLi40NzRiODY3IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9UeXBlVmFsaWRhdGlvblRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9UeXBlVmFsaWRhdGlvblRlc3QuamF2YQpAQCAtMjA0LDcgKzIwNCw3IEBACiAgICAgICAgIHF0KCkuZm9yQWxsKHR1cGxlV2l0aFZhbHVlR2VuKGJhc2VHZW4pKS5jaGVja0Fzc2VydChwYWlyIC0+IHsKICAgICAgICAgICAgIFR1cGxlVHlwZSB0dXBsZSA9IHBhaXIubGVmdDsKICAgICAgICAgICAgIEJ5dGVCdWZmZXIgdmFsdWUgPSBwYWlyLnJpZ2h0OwotICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KFR1cGxlVHlwZS5idWlsZFZhbHVlKHR1cGxlLnNwbGl0KHZhbHVlKSkpCisgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoVHVwbGVUeXBlLmJ1aWxkVmFsdWUodHVwbGUuc3BsaXQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCB2YWx1ZSkpKQogICAgICAgICAgICAgICAgICAgICAgIC5hcygiVHVwbGVUeXBlLmJ1aWxkVmFsdWUoc3BsaXQodmFsdWUpKSA9PSB2YWx1ZSIpCiAgICAgICAgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyh2YWx1ZSk7CiAgICAgICAgIH0pOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL01lbXRhYmxlUXVpY2tUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvTWVtdGFibGVRdWlja1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmNmYTNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL01lbXRhYmxlUXVpY2tUZXN0LmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlVudHlwZWRSZXN1bHRTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CisKK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgTWVtdGFibGVRdWlja1Rlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKK3sKKyAgICBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE1lbXRhYmxlUXVpY2tUZXN0LmNsYXNzKTsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgcGFydGl0aW9ucyA9IDUwXzAwMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IHJvd3NQZXJQYXJ0aXRpb24gPSA0OworCisgICAgc3RhdGljIGZpbmFsIGludCBkZWxldGVkUGFydGl0aW9uc1N0YXJ0ID0gMjBfMDAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgZGVsZXRlZFBhcnRpdGlvbnNFbmQgPSBkZWxldGVkUGFydGl0aW9uc1N0YXJ0ICsgMTBfMDAwOworCisgICAgc3RhdGljIGZpbmFsIGludCBkZWxldGVkUm93c1N0YXJ0ID0gNDBfMDAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgZGVsZXRlZFJvd3NFbmQgPSBkZWxldGVkUm93c1N0YXJ0ICsgNV8wMDA7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoKQorICAgIHB1YmxpYyBTdHJpbmcgbWVtdGFibGVDbGFzczsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ7MH0iKQorICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3Q+IHBhcmFtZXRlcnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEltbXV0YWJsZUxpc3Qub2YoInNraXBsaXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNraXBsaXN0X3NoYXJkZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2tpcGxpc3Rfc2hhcmRlZF9sb2NraW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyaWUiKTsKKyAgICB9CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXAoKQorICAgIHsKKyAgICAgICAgQ1FMVGVzdGVyLnNldFVwQ2xhc3MoKTsKKyAgICAgICAgQ1FMVGVzdGVyLnByZXBhcmVTZXJ2ZXIoKTsKKyAgICAgICAgQ1FMVGVzdGVyLmRpc2FibGVQcmVwYXJlZFJldXNlRm9yVGVzdCgpOworICAgICAgICBsb2dnZXIuaW5mbygic2V0dXBDbGFzcyBkb25lLiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lbXRhYmxlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKworICAgICAgICBTdHJpbmcga2V5c3BhY2UgPSBjcmVhdGVLZXlzcGFjZSgiQ1JFQVRFIEtFWVNQQUNFICVzIHdpdGggcmVwbGljYXRpb24gPSB7ICdjbGFzcycgOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJyA6IDEgfSBhbmQgZHVyYWJsZV93cml0ZXMgPSBmYWxzZSIpOworICAgICAgICBTdHJpbmcgdGFibGUgPSBjcmVhdGVUYWJsZShrZXlzcGFjZSwgIkNSRUFURSBUQUJMRSAlcyAoIHVzZXJpZCBiaWdpbnQsIHBpY2lkIGJpZ2ludCwgY29tbWVudGlkIGJpZ2ludCwgUFJJTUFSWSBLRVkodXNlcmlkLCBwaWNpZCkpIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggY29tcHJlc3Npb24gPSB7J2VuYWJsZWQnOiBmYWxzZX0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYW5kIG1lbXRhYmxlID0gJyIgKyBtZW10YWJsZUNsYXNzICsgIiciKTsKKyAgICAgICAgZXhlY3V0ZSgidXNlICIgKyBrZXlzcGFjZSArICc7Jyk7CisKKyAgICAgICAgU3RyaW5nIHdyaXRlU3RhdGVtZW50ID0gIklOU0VSVCBJTlRPICIrdGFibGUrIih1c2VyaWQscGljaWQsY29tbWVudGlkKVZBTFVFUyg/LD8sPykiOworCisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oa2V5c3BhY2UpLmdldENvbHVtbkZhbWlseVN0b3JlKHRhYmxlKTsKKyAgICAgICAgY2ZzLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICBVdGlsLmZsdXNoKGNmcyk7CisKKyAgICAgICAgbG9uZyBpOworICAgICAgICBsb25nIGxpbWl0ID0gcGFydGl0aW9uczsKKyAgICAgICAgbG9nZ2VyLmluZm8oIldyaXRpbmcge30gcGFydGl0aW9ucyBvZiB7fSByb3dzIiwgcGFydGl0aW9ucywgcm93c1BlclBhcnRpdGlvbik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW1pdDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGxvbmcgaiA9IDA7IGogPCByb3dzUGVyUGFydGl0aW9uOyArK2opCisgICAgICAgICAgICAgICAgZXhlY3V0ZSh3cml0ZVN0YXRlbWVudCwgaSwgaiwgaSArIGopOworICAgICAgICB9CisKKyAgICAgICAgbG9nZ2VyLmluZm8oIkRlbGV0aW5nIHBhcnRpdGlvbnMgYmV0d2VlbiB7fSBhbmQge30iLCBkZWxldGVkUGFydGl0aW9uc1N0YXJ0LCBkZWxldGVkUGFydGl0aW9uc0VuZCk7CisgICAgICAgIGZvciAoaSA9IGRlbGV0ZWRQYXJ0aXRpb25zU3RhcnQ7IGkgPCBkZWxldGVkUGFydGl0aW9uc0VuZDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBubyBwYXJ0aXRpb24gZXhpc3RzLCBidXQgd2Ugd2lsbCBjcmVhdGUgYSB0b21ic3RvbmUKKyAgICAgICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICIgKyB0YWJsZSArICIgV0hFUkUgdXNlcmlkID0gPyIsIGkpOworICAgICAgICB9CisKKyAgICAgICAgbG9nZ2VyLmluZm8oIkRlbGV0aW5nIHJvd3MgYmV0d2VlbiB7fSBhbmQge30iLCBkZWxldGVkUm93c1N0YXJ0LCBkZWxldGVkUm93c0VuZCk7CisgICAgICAgIGZvciAoaSA9IGRlbGV0ZWRSb3dzU3RhcnQ7IGkgPCBkZWxldGVkUm93c0VuZDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBubyByb3cgZXhpc3RzLCBidXQgd2Ugd2lsbCBjcmVhdGUgYSB0b21ic3RvbmUgKGFuZCBwYXJ0aXRpb24pCisgICAgICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAiICsgdGFibGUgKyAiIFdIRVJFIHVzZXJpZCA9ID8gQU5EIHBpY2lkID0gPyIsIGksIDBMKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvZ2dlci5pbmZvKCJSZWFkaW5nIHt9IHBhcnRpdGlvbnMiLCBwYXJ0aXRpb25zKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbWl0OyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcmVzdWx0ID0gZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAiICsgdGFibGUgKyAiIFdIRVJFIHVzZXJpZCA9ID8iLCBpKTsKKyAgICAgICAgICAgIGlmIChpID49IGRlbGV0ZWRQYXJ0aXRpb25zU3RhcnQgJiYgaSA8IGRlbGV0ZWRQYXJ0aXRpb25zRW5kKQorICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KHJlc3VsdCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoaSA+PSBkZWxldGVkUm93c1N0YXJ0ICYmIGkgPCBkZWxldGVkUm93c0VuZCkKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAxOworICAgICAgICAgICAgICAgIE9iamVjdFtdW10gcm93cyA9IG5ldyBPYmplY3Rbcm93c1BlclBhcnRpdGlvbiAtIHN0YXJ0XVtdOworICAgICAgICAgICAgICAgIGZvciAobG9uZyBqID0gc3RhcnQ7IGogPCByb3dzUGVyUGFydGl0aW9uOyArK2opCisgICAgICAgICAgICAgICAgICAgIHJvd3NbKGludCkgKGogLSBzdGFydCldID0gcm93KGksIGosIGkgKyBqKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKHJlc3VsdCwgcm93cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQgZGVsZXRlZFBhcnRpdGlvbnMgPSBkZWxldGVkUGFydGl0aW9uc0VuZCAtIGRlbGV0ZWRQYXJ0aXRpb25zU3RhcnQ7CisgICAgICAgIGludCBkZWxldGVkUm93cyA9IGRlbGV0ZWRSb3dzRW5kIC0gZGVsZXRlZFJvd3NTdGFydDsKKyAgICAgICAgbG9nZ2VyLmluZm8oIlNlbGVjdGluZyAqIik7CisgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcmVzdWx0ID0gZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAiICsgdGFibGUpOworICAgICAgICBhc3NlcnRSb3dDb3VudChyZXN1bHQsIHJvd3NQZXJQYXJ0aXRpb24gKiAocGFydGl0aW9ucyAtIGRlbGV0ZWRQYXJ0aXRpb25zKSAtIGRlbGV0ZWRSb3dzKTsKKworICAgICAgICBVdGlsLmZsdXNoKGNmcyk7CisKKyAgICAgICAgbG9nZ2VyLmluZm8oIlNlbGVjdGluZyAqIik7CisgICAgICAgIHJlc3VsdCA9IGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gIiArIHRhYmxlKTsKKyAgICAgICAgYXNzZXJ0Um93Q291bnQocmVzdWx0LCByb3dzUGVyUGFydGl0aW9uICogKHBhcnRpdGlvbnMgLSBkZWxldGVkUGFydGl0aW9ucykgLSBkZWxldGVkUm93cyk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9NZW10YWJsZVNpemVIZWFwQnVmZmVyc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9NZW10YWJsZVNpemVIZWFwQnVmZmVyc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDk3ZThjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL01lbXRhYmxlU2l6ZUhlYXBCdWZmZXJzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGU7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5Lk1lbXRhYmxlUG9vbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuU2xhYlBvb2w7CisKK3B1YmxpYyBjbGFzcyBNZW10YWJsZVNpemVIZWFwQnVmZmVyc1Rlc3QgZXh0ZW5kcyBNZW10YWJsZVNpemVUZXN0QmFzZQoreworICAgIC8vIE92ZXJyaWRlcyBDUUxUZXN0ZXIuc2V0VXBDbGFzcyB0byBydW4gYmVmb3JlIGl0CisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwQ2xhc3MoKQorICAgIHsKKyAgICAgICAgc2V0dXAoQ29uZmlnLk1lbXRhYmxlQWxsb2NhdGlvblR5cGUuaGVhcF9idWZmZXJzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIGNoZWNrTWVtdGFibGVQb29sKCkKKyAgICB7CisgICAgICAgIE1lbXRhYmxlUG9vbCBtZW1vcnlQb29sID0gQWJzdHJhY3RBbGxvY2F0b3JNZW10YWJsZS5NRU1PUllfUE9PTDsKKyAgICAgICAgbG9nZ2VyLmluZm8oIk1lbXRhYmxlIHBvb2wge30gb2ZmLWhlYXAgbGltaXQge30iLCBtZW1vcnlQb29sLCBtZW1vcnlQb29sLm9mZkhlYXAubGltaXQpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZW1vcnlQb29sIGluc3RhbmNlb2YgU2xhYlBvb2wpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lbW9yeVBvb2wub2ZmSGVhcC5saW1pdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL01lbXRhYmxlU2l6ZU9mZmhlYXBCdWZmZXJzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL01lbXRhYmxlU2l6ZU9mZmhlYXBCdWZmZXJzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMmY0ZjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvTWVtdGFibGVTaXplT2ZmaGVhcEJ1ZmZlcnNUZXN0LmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZTsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuTWVtdGFibGVQb29sOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5TbGFiUG9vbDsKKworcHVibGljIGNsYXNzIE1lbXRhYmxlU2l6ZU9mZmhlYXBCdWZmZXJzVGVzdCBleHRlbmRzIE1lbXRhYmxlU2l6ZVRlc3RCYXNlCit7CisgICAgLy8gT3ZlcnJpZGVzIENRTFRlc3Rlci5zZXRVcENsYXNzIHRvIHJ1biBiZWZvcmUgaXQKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCisgICAgeworICAgICAgICBzZXR1cChDb25maWcuTWVtdGFibGVBbGxvY2F0aW9uVHlwZS5vZmZoZWFwX2J1ZmZlcnMpOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBjaGVja01lbXRhYmxlUG9vbCgpCisgICAgeworICAgICAgICBNZW10YWJsZVBvb2wgbWVtb3J5UG9vbCA9IEFic3RyYWN0QWxsb2NhdG9yTWVtdGFibGUuTUVNT1JZX1BPT0w7CisgICAgICAgIGxvZ2dlci5pbmZvKCJNZW10YWJsZSBwb29sIHt9IG9mZi1oZWFwIGxpbWl0IHt9IiwgbWVtb3J5UG9vbCwgbWVtb3J5UG9vbC5vZmZIZWFwLmxpbWl0KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVtb3J5UG9vbCBpbnN0YW5jZW9mIFNsYWJQb29sKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVtb3J5UG9vbC5vZmZIZWFwLmxpbWl0ID4gMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL01lbXRhYmxlU2l6ZU9mZmhlYXBPYmplY3RzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL01lbXRhYmxlU2l6ZU9mZmhlYXBPYmplY3RzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OWY0NTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvTWVtdGFibGVTaXplT2ZmaGVhcE9iamVjdHNUZXN0LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZTsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuTWVtdGFibGVQb29sOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5OYXRpdmVQb29sOworCitwdWJsaWMgY2xhc3MgTWVtdGFibGVTaXplT2ZmaGVhcE9iamVjdHNUZXN0IGV4dGVuZHMgTWVtdGFibGVTaXplVGVzdEJhc2UKK3sKKyAgICAvLyBPdmVycmlkZXMgQ1FMVGVzdGVyLnNldFVwQ2xhc3MgdG8gcnVuIGJlZm9yZSBpdAorICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcENsYXNzKCkKKyAgICB7CisgICAgICAgIHNldHVwKENvbmZpZy5NZW10YWJsZUFsbG9jYXRpb25UeXBlLm9mZmhlYXBfb2JqZWN0cyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBjaGVja01lbXRhYmxlUG9vbCgpCisgICAgeworICAgICAgICBNZW10YWJsZVBvb2wgbWVtb3J5UG9vbCA9IEFic3RyYWN0QWxsb2NhdG9yTWVtdGFibGUuTUVNT1JZX1BPT0w7CisgICAgICAgIGxvZ2dlci5pbmZvKCJNZW10YWJsZSBwb29sIHt9IG9mZi1oZWFwIGxpbWl0IHt9IiwgbWVtb3J5UG9vbCwgbWVtb3J5UG9vbC5vZmZIZWFwLmxpbWl0KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVtb3J5UG9vbCBpbnN0YW5jZW9mIE5hdGl2ZVBvb2wpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9NZW10YWJsZVNpemVUZXN0QmFzZS5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL01lbXRhYmxlU2l6ZVRlc3RCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc2MDUyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9NZW10YWJsZVNpemVUZXN0QmFzZS5qYXZhCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmdpdGh1Yi5qYW1tLk1lbW9yeU1ldGVyOworCisvLyBOb3RlOiBUaGlzIHRlc3QgY2FuIGJlIHJ1biBpbiBpZGVhIHdpdGggdGhlIGFsbG9jYXRpb24gdHlwZSBjb25maWd1cmVkIGluIHRoZSB0ZXN0IHlhbWwgYW5kIG1lbXRhYmxlIHVzaW5nIHRoZQorLy8gdmFsdWUgbWVtdGFibGVDbGFzcyBpcyBpbml0aWFsaXplZCB3aXRoLgorQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZW10YWJsZVNpemVUZXN0QmFzZSBleHRlbmRzIENRTFRlc3RlcgoreworICAgIC8vIE5vdGU6IFRvIHNlZSBhIHByaW50b3V0IG9mIHRoZSB1c2FnZSBmb3IgZWFjaCBvYmplY3QsIGFkZCAuZW5hYmxlRGVidWcoKSBoZXJlIChtb3N0IHVzZWZ1bCB3aXRoIHNtYWxsZXIgbnVtYmVyIG9mCisgICAgLy8gcGFydGl0aW9ucykuCisgICAgc3RhdGljIE1lbW9yeU1ldGVyIG1ldGVyID0gbmV3IE1lbW9yeU1ldGVyKCkuaWdub3JlS25vd25TaW5nbGV0b25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoR3Vlc3NpbmcoTWVtb3J5TWV0ZXIuR3Vlc3MuRkFMTEJBQ0tfVU5TQUZFKTsKKworICAgIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTWVtdGFibGVTaXplVGVzdEJhc2UuY2xhc3MpOworCisgICAgc3RhdGljIGZpbmFsIGludCBwYXJ0aXRpb25zID0gNTBfMDAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgcm93c1BlclBhcnRpdGlvbiA9IDQ7CisKKyAgICBzdGF0aWMgZmluYWwgaW50IGRlbGV0ZWRQYXJ0aXRpb25zID0gMTBfMDAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgZGVsZXRlZFJvd3MgPSA1XzAwMDsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcigwKQorICAgIHB1YmxpYyBTdHJpbmcgbWVtdGFibGVDbGFzcyA9ICJza2lwbGlzdCI7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAiezB9IikKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0PiBwYXJhbWV0ZXJzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBJbW11dGFibGVMaXN0Lm9mKCJza2lwbGlzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJza2lwbGlzdF9zaGFyZGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyaWUiKTsKKyAgICB9CisKKyAgICAvLyBNdXN0IGJlIHdpdGhpbiAzJSBvZiB0aGUgcmVhbCB1c2FnZS4gV2UgYXJlIGFjdHVhbGx5IG1vcmUgcHJlY2lzZSB0aGFuIHRoaXMsIGJ1dCB0aGUgdGhyZXNob2xkIGlzIHNldCBoaWdoZXIgdG8KKyAgICAvLyBhdm9pZCBmbGFrZXMuIEZvciBvbi1oZWFwIGFsbG9jYXRvcnMgd2UgYWxsb3cgZm9yIGV4dHJhIG92ZXJoZWFkcyBiZWxvdy4KKyAgICBmaW5hbCBpbnQgTUFYX0RJRkZFUkVOQ0VfUEVSQ0VOVCA9IDM7CisgICAgLy8gU2xhYiBvdmVyaGVhZCwgYWRkZWQgd2hlbiB0aGUgbWVtdGFibGUgdXNlcyBoZWFwX2J1ZmZlcnMuCisgICAgZmluYWwgaW50IFNMQUJfT1ZFUkhFQUQgPSAxMDI0ICogMTAyNDsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cChDb25maWcuTWVtdGFibGVBbGxvY2F0aW9uVHlwZSBhbGxvY2F0aW9uVHlwZSkKKyAgICB7CisgICAgICAgIFNlcnZlclRlc3RVdGlscy5kYWVtb25Jbml0aWFsaXphdGlvbigpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgRmllbGQgY29uZkZpZWxkID0gRGF0YWJhc2VEZXNjcmlwdG9yLmNsYXNzLmdldERlY2xhcmVkRmllbGQoImNvbmYiKTsKKyAgICAgICAgICAgIGNvbmZGaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICAgICAgQ29uZmlnIGNvbmYgPSAoQ29uZmlnKSBjb25mRmllbGQuZ2V0KG51bGwpOworICAgICAgICAgICAgY29uZi5tZW10YWJsZV9hbGxvY2F0aW9uX3R5cGUgPSBhbGxvY2F0aW9uVHlwZTsKKyAgICAgICAgICAgIGNvbmYubWVtdGFibGVfY2xlYW51cF90aHJlc2hvbGQgPSAwLjhmOyAvLyBnaXZlIHVzIG1vcmUgc3BhY2UgdG8gZml0IHRlc3QgZGF0YSB3aXRob3V0IGZsdXNoaW5nCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIHwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorCisgICAgICAgIENRTFRlc3Rlci5zZXRVcENsYXNzKCk7CisgICAgICAgIENRTFRlc3Rlci5wcmVwYXJlU2VydmVyKCk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJzZXR1cENsYXNzIGRvbmUsIGFsbG9jYXRpb24gdHlwZSB7fSIsIGFsbG9jYXRpb25UeXBlKTsKKyAgICB9CisKKyAgICB2b2lkIGNoZWNrTWVtdGFibGVQb29sKCkKKyAgICB7CisgICAgICAgIC8vIG92ZXJyaWRkZW4gYnkgaW5zdGFuY2VzCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSBtZW10YWJsZXMgdXNlIHRoZSBjb3JyZWN0IGFsbG9jYXRpb24gdHlwZSwgaS5lLiB0aGF0IHNldHVwIGhhcyB3b3JrZWQuCisgICAgICAgIC8vIElmIHRoaXMgZmFpbHMsIG1ha2Ugc3VyZSB0aGUgdGVzdCBpcyBub3QgcmV1c2luZyBhbiBhbHJlYWR5LWluaXRpYWxpemVkIEpWTS4KKyAgICAgICAgY2hlY2tNZW10YWJsZVBvb2woKTsKKworICAgICAgICBDUUxUZXN0ZXIuZGlzYWJsZVByZXBhcmVkUmV1c2VGb3JUZXN0KCk7CisgICAgICAgIFN0cmluZyBrZXlzcGFjZSA9IGNyZWF0ZUtleXNwYWNlKCJDUkVBVEUgS0VZU1BBQ0UgJXMgd2l0aCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InIDogMSB9IGFuZCBkdXJhYmxlX3dyaXRlcyA9IGZhbHNlIik7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgdGFibGUgPSBjcmVhdGVUYWJsZShrZXlzcGFjZSwgIkNSRUFURSBUQUJMRSAlcyAoIHVzZXJpZCBiaWdpbnQsIHBpY2lkIGJpZ2ludCwgY29tbWVudGlkIGJpZ2ludCwgUFJJTUFSWSBLRVkodXNlcmlkLCBwaWNpZCkpIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aXRoIGNvbXByZXNzaW9uID0geydlbmFibGVkJzogZmFsc2V9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBhbmQgbWVtdGFibGUgPSAnIiArIG1lbXRhYmxlQ2xhc3MgKyAiJyIpOworICAgICAgICAgICAgZXhlY3V0ZSgidXNlICIgKyBrZXlzcGFjZSArICc7Jyk7CisKKyAgICAgICAgICAgIFN0cmluZyB3cml0ZVN0YXRlbWVudCA9ICJJTlNFUlQgSU5UTyAiICsgdGFibGUgKyAiKHVzZXJpZCxwaWNpZCxjb21tZW50aWQpVkFMVUVTKD8sPyw/KSI7CisgICAgICAgICAgICBmb3JjZVByZXBhcmVkVmFsdWVzKCk7CisKKyAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oa2V5c3BhY2UpLmdldENvbHVtbkZhbWlseVN0b3JlKHRhYmxlKTsKKyAgICAgICAgICAgIGNmcy5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgICAgIFV0aWwuZmx1c2goY2ZzKTsKKworICAgICAgICAgICAgTWVtdGFibGUgbWVtdGFibGUgPSBjZnMuZ2V0VHJhY2tlcigpLmdldFZpZXcoKS5nZXRDdXJyZW50TWVtdGFibGUoKTsKKyAgICAgICAgICAgIGxvbmcgZGVlcFNpemVCZWZvcmUgPSBtZXRlci5tZWFzdXJlRGVlcChtZW10YWJsZSk7CisgICAgICAgICAgICBsb2dnZXIuaW5mbygiTWVtdGFibGUgZGVlcCBzaXplIGJlZm9yZSB7fSIsIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KGRlZXBTaXplQmVmb3JlKSk7CisgICAgICAgICAgICBsb25nIGk7CisgICAgICAgICAgICBsb25nIGxpbWl0ID0gcGFydGl0aW9uczsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJXcml0aW5nIHt9IHBhcnRpdGlvbnMgb2Yge30gcm93cyIsIHBhcnRpdGlvbnMsIHJvd3NQZXJQYXJ0aXRpb24pOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbWl0OyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChsb25nIGogPSAwOyBqIDwgcm93c1BlclBhcnRpdGlvbjsgKytqKQorICAgICAgICAgICAgICAgICAgICBleGVjdXRlKHdyaXRlU3RhdGVtZW50LCBpLCBqLCBpICsgaik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJEZWxldGluZyB7fSBwYXJ0aXRpb25zIiwgZGVsZXRlZFBhcnRpdGlvbnMpOworICAgICAgICAgICAgbGltaXQgKz0gZGVsZXRlZFBhcnRpdGlvbnM7CisgICAgICAgICAgICBmb3IgKDsgaSA8IGxpbWl0OyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbm8gcGFydGl0aW9uIGV4aXN0cywgYnV0IHdlIHdpbGwgY3JlYXRlIGEgdG9tYnN0b25lCisgICAgICAgICAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gIiArIHRhYmxlICsgIiBXSEVSRSB1c2VyaWQgPSA/IiwgaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJEZWxldGluZyB7fSByb3dzIiwgZGVsZXRlZFJvd3MpOworICAgICAgICAgICAgbGltaXQgKz0gZGVsZXRlZFJvd3M7CisgICAgICAgICAgICBmb3IgKDsgaSA8IGxpbWl0OyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbm8gcm93IGV4aXN0cywgYnV0IHdlIHdpbGwgY3JlYXRlIGEgdG9tYnN0b25lIChhbmQgcGFydGl0aW9uKQorICAgICAgICAgICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICIgKyB0YWJsZSArICIgV0hFUkUgdXNlcmlkID0gPyBBTkQgcGljaWQgPSA/IiwgaSwgMEwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0U2FtZSgiTWVtdGFibGUgZmx1c2hlZCBkdXJpbmcgdGVzdC4gVGVzdCB3YXMgbm90IGNhcnJpZWQgb3V0IGNvcnJlY3RseS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMuZ2V0VHJhY2tlcigpLmdldFZpZXcoKS5nZXRDdXJyZW50TWVtdGFibGUoKSk7CisKKyAgICAgICAgICAgIE1lbXRhYmxlLk1lbW9yeVVzYWdlIHVzYWdlID0gTWVtdGFibGUuZ2V0TWVtb3J5VXNhZ2UobWVtdGFibGUpOworICAgICAgICAgICAgbG9uZyBhY3R1YWxIZWFwID0gdXNhZ2Uub3duc09uSGVhcDsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKFN0cmluZy5mb3JtYXQoIk1lbXRhYmxlIGluICVzIG1vZGU6ICVkIG9wcywgJXMgc2VyaWFsaXplZCBieXRlcywgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0TWVtdGFibGVBbGxvY2F0aW9uVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW10YWJsZS5vcGVyYXRpb25Db3VudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShtZW10YWJsZS5nZXRMaXZlRGF0YVNpemUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlKSk7CisKKyAgICAgICAgICAgIGxvbmcgZGVlcFNpemVBZnRlciA9IG1ldGVyLm1lYXN1cmVEZWVwKG1lbXRhYmxlKTsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJNZW10YWJsZSBkZWVwIHNpemUge30iLCBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShkZWVwU2l6ZUFmdGVyKSk7CisKKyAgICAgICAgICAgIGxvbmcgZXhwZWN0ZWRIZWFwID0gZGVlcFNpemVBZnRlciAtIGRlZXBTaXplQmVmb3JlOworICAgICAgICAgICAgbG9uZyBtYXhfZGlmZmVyZW5jZSA9IE1BWF9ESUZGRVJFTkNFX1BFUkNFTlQgKiBleHBlY3RlZEhlYXAgLyAxMDA7CisgICAgICAgICAgICBsb25nIHRyaWVfb3ZlcmhlYWQgPSBtZW10YWJsZSBpbnN0YW5jZW9mIFRyaWVNZW10YWJsZSA/ICgoVHJpZU1lbXRhYmxlKSBtZW10YWJsZSkudW51c2VkUmVzZXJ2ZWRNZW1vcnkoKSA6IDA7CisgICAgICAgICAgICBzd2l0Y2ggKERhdGFiYXNlRGVzY3JpcHRvci5nZXRNZW10YWJsZUFsbG9jYXRpb25UeXBlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBoZWFwX2J1ZmZlcnM6CisgICAgICAgICAgICAgICAgICAgIG1heF9kaWZmZXJlbmNlICs9IFNMQUJfT1ZFUkhFQUQ7CisgICAgICAgICAgICAgICAgICAgIGFjdHVhbEhlYXAgKz0gdHJpZV9vdmVyaGVhZDsgICAgLy8gYWRqdXN0IHRyaWUgbWVtb3J5IHdpdGggdW51c2VkIGJ1ZmZlciBzcGFjZSBpZiBvbi1oZWFwCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgdW5zbGFiYmVkX2hlYXBfYnVmZmVyczoKKyAgICAgICAgICAgICAgICAgICAgYWN0dWFsSGVhcCArPSB0cmllX292ZXJoZWFkOyAgICAvLyBhZGp1c3QgdHJpZSBtZW1vcnkgd2l0aCB1bnVzZWQgYnVmZmVyIHNwYWNlIGlmIG9uLWhlYXAKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0cmluZy5mb3JtYXQoIkV4cGVjdGVkIGhlYXAgdXNhZ2UgY2xvc2UgdG8gJXMsIGdvdCAlcywgJXMgZGlmZmVyZW5jZS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoZXhwZWN0ZWRIZWFwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShhY3R1YWxIZWFwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShleHBlY3RlZEhlYXAgLSBhY3R1YWxIZWFwKSk7CisgICAgICAgICAgICBsb2dnZXIuaW5mbyhtZXNzYWdlKTsKKyAgICAgICAgICAgIGlmIChNYXRoLmFicyhhY3R1YWxIZWFwIC0gZXhwZWN0ZWRIZWFwKSA+IG1heF9kaWZmZXJlbmNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFVuZGVyIEphdmEgMTEsIGl0IHNlZW1zIHRoZSBtZXRlciBjYW4gcmVhY2ggaW50byBwaGFudG9tIHJlZmVyZW5jZSBxdWV1ZXMgYW5kIGNvdW50IG1vcmUgc3BhY2UgdGhhbgorICAgICAgICAgICAgICAgIC8vIGlzIGFjdHVhbGx5IHJlYWNoYWJsZS4gVW5mb3J0dW5hdGVseSBpZ25vcmVOb25TdHJvbmdSZWZlcmVuY2VzKCkgZG9lcyBub3QgaGVscCAod29yc2UsIGl0IHRocm93cworICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbnMgdHJ5aW5nIHRvIGdldCBhIHBoYW50b20gcmVmZXJyZW50KS4gUmV0cnlpbmcgdGhlIG1lYXN1cmVtZW50IGFwcGVhcnMgdG8gY2xlYXIgdGhlc2UgdXAuCisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwKTsKKyAgICAgICAgICAgICAgICBsb25nIHNlY29uZFBhc3MgPSBtZXRlci5tZWFzdXJlRGVlcChtZW10YWJsZSk7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJEZWVwIHNpemUgZmlyc3QgcGFzcyB7fSBzZWNvbmQgcGFzcyB7fSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KGRlZXBTaXplQWZ0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShzZWNvbmRQYXNzKSk7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRIZWFwID0gc2Vjb25kUGFzcyAtIGRlZXBTaXplQmVmb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLCBNYXRoLmFicyhhY3R1YWxIZWFwIC0gZXhwZWN0ZWRIZWFwKSA8PSBtYXhfZGlmZmVyZW5jZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBleGVjdXRlKFN0cmluZy5mb3JtYXQoIkRST1AgS0VZU1BBQ0UgSUYgRVhJU1RTICVzIiwga2V5c3BhY2UpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9NZW10YWJsZVNpemVVbnNsYWJiZWRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvTWVtdGFibGVTaXplVW5zbGFiYmVkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OWE0NzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvTWVtdGFibGVTaXplVW5zbGFiYmVkVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGU7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5LkhlYXBQb29sOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5NZW10YWJsZVBvb2w7CisKK3B1YmxpYyBjbGFzcyBNZW10YWJsZVNpemVVbnNsYWJiZWRUZXN0IGV4dGVuZHMgTWVtdGFibGVTaXplVGVzdEJhc2UKK3sKKyAgICAvLyBPdmVycmlkZXMgQ1FMVGVzdGVyLnNldFVwQ2xhc3MgdG8gcnVuIGJlZm9yZSBpdAorICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcENsYXNzKCkKKyAgICB7CisgICAgICAgIHNldHVwKENvbmZpZy5NZW10YWJsZUFsbG9jYXRpb25UeXBlLnVuc2xhYmJlZF9oZWFwX2J1ZmZlcnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgY2hlY2tNZW10YWJsZVBvb2woKQorICAgIHsKKyAgICAgICAgTWVtdGFibGVQb29sIG1lbW9yeVBvb2wgPSBBYnN0cmFjdEFsbG9jYXRvck1lbXRhYmxlLk1FTU9SWV9QT09MOworICAgICAgICBsb2dnZXIuaW5mbygiTWVtdGFibGUgcG9vbCB7fSBvZmYtaGVhcCBsaW1pdCB7fSIsIG1lbW9yeVBvb2wsIG1lbW9yeVBvb2wub2ZmSGVhcC5saW1pdCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lbW9yeVBvb2wgaW5zdGFuY2VvZiBIZWFwUG9vbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL1NoYXJkZWRNZW10YWJsZUNvbmZpZ1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9TaGFyZGVkTWVtdGFibGVDb25maWdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1MDc5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9TaGFyZGVkTWVtdGFibGVDb25maWdUZXN0LmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lkluc3RhbmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5JbnZhbGlkQXR0cmlidXRlVmFsdWVFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUmVmbGVjdGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLkFic3RyYWN0U2hhcmRlZE1lbXRhYmxlLlNIQVJERURfTUVNVEFCTEVfQ09ORklHX09CSkVDVF9OQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIFNoYXJkZWRNZW10YWJsZUNvbmZpZ1Rlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKK3sKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBzdGFydEpNWFNlcnZlcigpOworICAgICAgICBjcmVhdGVNQmVhblNlcnZlckNvbm5lY3Rpb24oKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0U2hhcmRDb3VudFNldEJ5Sk1YKCkgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24sIFJlZmxlY3Rpb25FeGNlcHRpb24sIEF0dHJpYnV0ZU5vdEZvdW5kRXhjZXB0aW9uLCBJbnN0YW5jZU5vdEZvdW5kRXhjZXB0aW9uLCBNQmVhbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEludmFsaWRBdHRyaWJ1dGVWYWx1ZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIGNoZWNrIHRoZSBkZWZhdWx0LCBidXQgYWxzbyBtYWtlIHN1cmUgdGhlIGNsYXNzIGlzIGluaXRpYWxpemVkIGlmIHRoZSBkZWZhdWx0IG1lbXRhYmxlIGlzIG5vdCBzaGFyZGVkCisgICAgICAgIGFzc2VydEVxdWFscyhGQlV0aWxpdGllcy5nZXRBdmFpbGFibGVQcm9jZXNzb3JzKCksIEFic3RyYWN0U2hhcmRlZE1lbXRhYmxlLmdldERlZmF1bHRTaGFyZENvdW50KCkpOworICAgICAgICBqbXhDb25uZWN0aW9uLnNldEF0dHJpYnV0ZShuZXcgT2JqZWN0TmFtZShTSEFSREVEX01FTVRBQkxFX0NPTkZJR19PQkpFQ1RfTkFNRSksIG5ldyBBdHRyaWJ1dGUoIkRlZmF1bHRTaGFyZENvdW50IiwgIjciKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg3LCBBYnN0cmFjdFNoYXJkZWRNZW10YWJsZS5nZXREZWZhdWx0U2hhcmRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI3Iiwgam14Q29ubmVjdGlvbi5nZXRBdHRyaWJ1dGUobmV3IE9iamVjdE5hbWUoU0hBUkRFRF9NRU1UQUJMRV9DT05GSUdfT0JKRUNUX05BTUUpLCAiRGVmYXVsdFNoYXJkQ291bnQiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b1NoYXJkQ291bnQoKSB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiwgUmVmbGVjdGlvbkV4Y2VwdGlvbiwgQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb24sIEluc3RhbmNlTm90Rm91bmRFeGNlcHRpb24sIE1CZWFuRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgSW52YWxpZEF0dHJpYnV0ZVZhbHVlRXhjZXB0aW9uCisgICAgeworICAgICAgICBBYnN0cmFjdFNoYXJkZWRNZW10YWJsZS5nZXREZWZhdWx0U2hhcmRDb3VudCgpOyAgICAvLyBpbml0aWFsaXplIGNsYXNzCisgICAgICAgIGpteENvbm5lY3Rpb24uc2V0QXR0cmlidXRlKG5ldyBPYmplY3ROYW1lKFNIQVJERURfTUVNVEFCTEVfQ09ORklHX09CSkVDVF9OQU1FKSwgbmV3IEF0dHJpYnV0ZSgiRGVmYXVsdFNoYXJkQ291bnQiLCAiYXV0byIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZCVXRpbGl0aWVzLmdldEF2YWlsYWJsZVByb2Nlc3NvcnMoKSwgQWJzdHJhY3RTaGFyZGVkTWVtdGFibGUuZ2V0RGVmYXVsdFNoYXJkQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnRvU3RyaW5nKEZCVXRpbGl0aWVzLmdldEF2YWlsYWJsZVByb2Nlc3NvcnMoKSksCisgICAgICAgICAgICAgICAgICAgICBqbXhDb25uZWN0aW9uLmdldEF0dHJpYnV0ZShuZXcgT2JqZWN0TmFtZShTSEFSREVEX01FTVRBQkxFX0NPTkZJR19PQkpFQ1RfTkFNRSksICJEZWZhdWx0U2hhcmRDb3VudCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9BdG9taWNCVHJlZVBhcnRpdGlvbk1lbXRhYmxlQWNjb3VudGluZ1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL0F0b21pY0JUcmVlUGFydGl0aW9uTWVtdGFibGVBY2NvdW50aW5nVGVzdC5qYXZhCmluZGV4IDA0MTk2ZjYuLjhiNzU1YWYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL0F0b21pY0JUcmVlUGFydGl0aW9uTWVtdGFibGVBY2NvdW50aW5nVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL0F0b21pY0JUcmVlUGFydGl0aW9uTWVtdGFibGVBY2NvdW50aW5nVGVzdC5qYXZhCkBAIC0zMjIsNyArMzIyLDcgQEAKIAogICAgICAgICAgICAgICAgIE9wT3JkZXIuR3JvdXAgd3JpdGVPcCA9IG9wT3JkZXIuZ2V0Q3VycmVudCgpOwogICAgICAgICAgICAgICAgIENsb25lciBjbG9uZXIgPSBhbGxvY2F0b3IuY2xvbmVyKHdyaXRlT3ApOwotICAgICAgICAgICAgICAgIHBhcnRpdGlvbi5hZGRBbGxXaXRoU2l6ZURlbHRhKHVwZGF0ZSwgY2xvbmVyLCB3cml0ZU9wLCBpbmRleGVyKTsKKyAgICAgICAgICAgICAgICBwYXJ0aXRpb24uYWRkQWxsKHVwZGF0ZSwgY2xvbmVyLCB3cml0ZU9wLCBpbmRleGVyKTsKICAgICAgICAgICAgICAgICBvcE9yZGVyLm5ld0JhcnJpZXIoKS5pc3N1ZSgpOwogCiAgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChhbGxvY2F0b3Iub25IZWFwKCkub3ducygpKS5pc0dyZWF0ZXJUaGFuT3JFcXVhbFRvKDBMKTsKQEAgLTMzOCw3ICszMzgsNyBAQAogICAgICAgICAgICAgICAgIG9wT3JkZXIubmV3QmFycmllcigpLmlzc3VlKCk7CiAgICAgICAgICAgICAgICAgT3BPcmRlci5Hcm91cCB3cml0ZU9wID0gb3BPcmRlci5nZXRDdXJyZW50KCk7CiAgICAgICAgICAgICAgICAgQ2xvbmVyIGNsb25lciA9IHJlY3JlYXRlZEFsbG9jYXRvci5jbG9uZXIod3JpdGVPcCk7Ci0gICAgICAgICAgICAgICAgcmVjcmVhdGVkLmFkZEFsbFdpdGhTaXplRGVsdGEodXBkYXRlLCBjbG9uZXIsIHdyaXRlT3AsIGluZGV4ZXIpOworICAgICAgICAgICAgICAgIHJlY3JlYXRlZC5hZGRBbGwodXBkYXRlLCBjbG9uZXIsIHdyaXRlT3AsIGluZGV4ZXIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBvZmZoZWFwIGFsbG9jYXRvcnMgZG9uJ3QgcmVsZWFzZSBvbiBoZWFwIG1lbW9yeSwgc28gZXhwZWN0IHRoZSBzYW1lCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcmVwYWlyL1BlbmRpbmdBbnRpQ29tcGFjdGlvblRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yZXBhaXIvUGVuZGluZ0FudGlDb21wYWN0aW9uVGVzdC5qYXZhCmluZGV4IGE1NTk0NzguLmM5NWIyZGIgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yZXBhaXIvUGVuZGluZ0FudGlDb21wYWN0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yZXBhaXIvUGVuZGluZ0FudGlDb21wYWN0aW9uVGVzdC5qYXZhCkBAIC00MSwxNyArNDEsMTQgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuTGlzdGVuYWJsZUZ1dHVyZTsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuTW9yZUV4ZWN1dG9yczsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvclBsdXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5GdXR1cmVUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuSW1tZWRpYXRlRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5GdXR1cmU7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvclBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5GdXR1cmVUYXNrOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuSW1tZWRpYXRlRXhlY3V0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5UHJvY2Vzc29yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwpAQCAtNzgsNyArNzUsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkFjdGl2ZVJlcGFpclNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlByZXZpZXdLaW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuV3JhcHBlZFJ1bm5hYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuVHJhbnNhY3Rpb25hbDsKIApAQCAtNjY1LDE0ICs2NjUsMjMgQEAKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhcHBseShTU1RhYmxlUmVhZGVyIHNzdGFibGUpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjZGwuY291bnREb3duKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjZGwuZ2V0Q291bnQoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGVuZGluZ0FudGlDb21wYWN0aW9uLlNTVGFibGVBY3F1aXNpdGlvbkV4Y2VwdGlvbigiYmxhaCIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9OworCiAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuYmVnaW5Db21wYWN0aW9uKGhvbGRlcik7Ci0gICAgICAgICAgICBQZW5kaW5nQW50aUNvbXBhY3Rpb24uQWNxdWlzaXRpb25DYWxsYWJsZSBhY3F1aXNpdGlvbkNhbGxhYmxlID0gbmV3IFBlbmRpbmdBbnRpQ29tcGFjdGlvbi5BY3F1aXNpdGlvbkNhbGxhYmxlKGNmcywgbmV4dFRpbWVVVUlEKCksIDEwLCAxLCBhY3ApOworICAgICAgICAgICAgUGVuZGluZ0FudGlDb21wYWN0aW9uLkFjcXVpc2l0aW9uQ2FsbGFibGUgYWNxdWlzaXRpb25DYWxsYWJsZSA9IG5ldyBQZW5kaW5nQW50aUNvbXBhY3Rpb24uQWNxdWlzaXRpb25DYWxsYWJsZShjZnMsIG5leHRUaW1lVVVJRCgpLCAxMCwgMSwgYWNwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByb3RlY3RlZCBQZW5kaW5nQW50aUNvbXBhY3Rpb24uQWNxdWlyZVJlc3VsdCBhY3F1aXJlU1NUYWJsZXMoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2RsLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2RsLmdldENvdW50KCkgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBlbmRpbmdBbnRpQ29tcGFjdGlvbi5TU1RhYmxlQWNxdWlzaXRpb25FeGNlcHRpb24oImJsYWgiKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmZpbmlzaENvbXBhY3Rpb24oaG9sZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmFjcXVpcmVTU1RhYmxlcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CiAgICAgICAgICAgICBGdXR1cmUgZiA9IGVzLnN1Ym1pdChhY3F1aXNpdGlvbkNhbGxhYmxlKTsKICAgICAgICAgICAgIGNkbC5hd2FpdCgpOwogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChmLmdldCgpKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1Jvd3NNZXJnaW5nVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvUm93c01lcmdpbmdUZXN0LmphdmEKaW5kZXggODA0OWFmMy4uMDFlMzM1ZCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvUm93c01lcmdpbmdUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvUm93c01lcmdpbmdUZXN0LmphdmEKQEAgLTI2LDEyICsyNiwxNCBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Kb2luZXI7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5CVFJFRV9CUkFOQ0hfU0hJRlQ7CisKIHB1YmxpYyBjbGFzcyBSb3dzTWVyZ2luZ1Rlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKIHsKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5idHJlZS5icmFuY2hzaGlmdCIsICIyIik7CisgICAgICAgIEJUUkVFX0JSQU5DSF9TSElGVC5zZXRJbnQoMik7CiAgICAgICAgIENRTFRlc3Rlci5zZXRVcENsYXNzKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9Sb3dzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvUm93c1Rlc3QuamF2YQppbmRleCBjZmVlYmZkLi44NzQyZmQ4IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9Sb3dzVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1Jvd3NUZXN0LmphdmEKQEAgLTIwMCw2ICsyMDAsMTIgQEAKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy5oYXNMZWdhY3lDb3VudGVyU2hhcmRzIHw9IGhhc0xlZ2FjeUNvdW50ZXJTaGFyZHM7CiAgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlUGFydGl0aW9uRGVsZXRpb24oRGVsZXRpb25UaW1lIGR0KQorICAgICAgICB7CisgICAgICAgICAgICB1cGRhdGUoZHQpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBzZWNvbmRUb1RzKGludCBub3cpCkBAIC02NDgsNCArNjU0LDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVDZWxsKGIsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZUNlbGwoYSkpOwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9UaHJvdHRsZWRVbmZpbHRlcmVkSXRlcmF0b3JUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9UaHJvdHRsZWRVbmZpbHRlcmVkSXRlcmF0b3JUZXN0LmphdmEKaW5kZXggMGM0YTc5ZC4uZTNjNDJjZCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvVGhyb3R0bGVkVW5maWx0ZXJlZEl0ZXJhdG9yVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1Rocm90dGxlZFVuZmlsdGVyZWRJdGVyYXRvclRlc3QuamF2YQpAQCAtMTU5LDcgKzE1OSw3IEBACiAgICAgICAgICAgICBVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3IgPSB0aHJvdHRsZWQubmV4dCgpOwogICAgICAgICAgICAgYXNzZXJ0RmFsc2UodGhyb3R0bGVkLmhhc05leHQoKSk7CiAgICAgICAgICAgICBhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEludDMyVHlwZS5pbnN0YW5jZS5nZXRTZXJpYWxpemVyKCkuZGVzZXJpYWxpemUoaXRlcmF0b3Iuc3RhdGljUm93KCkuY2VsbHMoKS5pdGVyYXRvcigpLm5leHQoKS5idWZmZXIoKSksIG5ldyBJbnRlZ2VyKDE2MCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEludDMyVHlwZS5pbnN0YW5jZS5nZXRTZXJpYWxpemVyKCkuZGVzZXJpYWxpemUoaXRlcmF0b3Iuc3RhdGljUm93KCkuY2VsbHMoKS5pdGVyYXRvcigpLm5leHQoKS5idWZmZXIoKSksIEludGVnZXIudmFsdWVPZigxNjApKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIHRlc3Qgb3B0IG91dApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvVW5maWx0ZXJlZFJvd0l0ZXJhdG9yV2l0aExvd2VyQm91bmRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9VbmZpbHRlcmVkUm93SXRlcmF0b3JXaXRoTG93ZXJCb3VuZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmRmMWNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvVW5maWx0ZXJlZFJvd0l0ZXJhdG9yV2l0aExvd2VyQm91bmRUZXN0LmphdmEKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93czsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuUXVlcnlQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0JvdW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TaW5nbGVQYXJ0aXRpb25SZWFkQ29tbWFuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbGljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbGljZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNsdXN0ZXJpbmdJbmRleFNsaWNlRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkRhdGFMaW1pdHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLlJvd0ZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuU1NUYWJsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuVmlldzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludGVnZXJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVJlYWRzTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yV2l0aExvd2VyQm91bmRUZXN0Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFID0gImtzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEUgPSAidGJsIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0xJQ0VTX1RBQkxFID0gInRibF9zbGljZXMiOworICAgIHByaXZhdGUgc3RhdGljIFRhYmxlTWV0YWRhdGEgdGFibGVNZXRhZGF0YTsKKyAgICBwcml2YXRlIHN0YXRpYyBUYWJsZU1ldGFkYXRhIHNsaWNlc1RhYmxlTWV0YWRhdGE7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOworCisgICAgICAgIHRhYmxlTWV0YWRhdGEgPQorICAgICAgICBUYWJsZU1ldGFkYXRhLmJ1aWxkZXIoS0VZU1BBQ0UsIFRBQkxFKQorICAgICAgICAgICAgICAgICAgICAgLmFkZFBhcnRpdGlvbktleUNvbHVtbigiayIsIFVURjhUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgLmFkZFN0YXRpY0NvbHVtbigicyIsIFVURjhUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgLmFkZENsdXN0ZXJpbmdDb2x1bW4oImkiLCBJbnRlZ2VyVHlwZS5pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWd1bGFyQ29sdW1uKCJ2IiwgVVRGOFR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBzbGljZXNUYWJsZU1ldGFkYXRhID0gVGFibGVNZXRhZGF0YS5idWlsZGVyKEtFWVNQQUNFLCBTTElDRVNfVEFCTEUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFBhcnRpdGlvbktleUNvbHVtbigiayIsIFVURjhUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbHVzdGVyaW5nQ29sdW1uKCJjMSIsIEludDMyVHlwZS5pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2x1c3RlcmluZ0NvbHVtbigiYzIiLCBJbnQzMlR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZ3VsYXJDb2x1bW4oInYiLCBJbnRlZ2VyVHlwZS5pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBTY2hlbWFMb2FkZXIucHJlcGFyZVNlcnZlcigpOworICAgICAgICBTY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2UoS0VZU1BBQ0UsIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwgdGFibGVNZXRhZGF0YSwgc2xpY2VzVGFibGVNZXRhZGF0YSk7CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHRydW5jYXRlKCkKKyAgICB7CisgICAgICAgIEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldENvbHVtbkZhbWlseVN0b3JlKFRBQkxFKS50cnVuY2F0ZUJsb2NraW5nKCk7CisgICAgICAgIEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldENvbHVtbkZhbWlseVN0b3JlKFNMSUNFU19UQUJMRSkudHJ1bmNhdGVCbG9ja2luZygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvd2VyQm91bmRBcHBsaWNhYmxlU2luZ2xlQ29sdW1uQXNjKCkKKyAgICB7CisgICAgICAgIFN0cmluZyBxdWVyeSA9ICJJTlNFUlQgSU5UTyAlcy4lcyAoaywgaSkgVkFMVUVTICgnazEnLCAlcykiOworICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjcmVhdGVTU1RhYmxlKHRhYmxlTWV0YWRhdGEsIEtFWVNQQUNFLCBUQUJMRSwgcXVlcnkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU2xpY2UubWFrZShVdGlsLmNsdXN0ZXJpbmcodGFibGVNZXRhZGF0YS5jb21wYXJhdG9yLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlsLmNsdXN0ZXJpbmcodGFibGVNZXRhZGF0YS5jb21wYXJhdG9yLCBCaWdJbnRlZ2VyLnZhbHVlT2YoOSkpKSwKKyAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuY292ZXJlZENsdXN0ZXJpbmcpOworICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gdGFibGVNZXRhZGF0YS5wYXJ0aXRpb25lci5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5ieXRlcygiazEiKSk7CisKKyAgICAgICAgU2xpY2Ugc2xpY2UxID0gU2xpY2UubWFrZShVdGlsLmNsdXN0ZXJpbmcodGFibGVNZXRhZGF0YS5jb21wYXJhdG9yLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMykpLmFzU3RhcnRCb3VuZCgpLCBDbHVzdGVyaW5nQm91bmQuVE9QKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobG93ZXJCb3VuZEFwcGxpY2FibGUodGFibGVNZXRhZGF0YSwga2V5LCBzbGljZTEsIHNzdGFibGUsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydFRydWUobG93ZXJCb3VuZEFwcGxpY2FibGUodGFibGVNZXRhZGF0YSwga2V5LCBzbGljZTEsIHNzdGFibGUsIHRydWUpKTsKKworICAgICAgICBTbGljZSBzbGljZTIgPSBTbGljZS5tYWtlKENsdXN0ZXJpbmdCb3VuZC5CT1RUT00sIFV0aWwuY2x1c3RlcmluZyh0YWJsZU1ldGFkYXRhLmNvbXBhcmF0b3IsIEJpZ0ludGVnZXIudmFsdWVPZigzKSkuYXNFbmRCb3VuZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsb3dlckJvdW5kQXBwbGljYWJsZSh0YWJsZU1ldGFkYXRhLCBrZXksIHNsaWNlMiwgc3N0YWJsZSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobG93ZXJCb3VuZEFwcGxpY2FibGUodGFibGVNZXRhZGF0YSwga2V5LCBzbGljZTIsIHNzdGFibGUsIHRydWUpKTsKKworICAgICAgICAvLyBjb3JuZXIgY2FzZXMKKyAgICAgICAgU2xpY2Ugc2xpY2UzID0gU2xpY2UubWFrZShVdGlsLmNsdXN0ZXJpbmcodGFibGVNZXRhZGF0YS5jb21wYXJhdG9yLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMCkpLmFzU3RhcnRCb3VuZCgpLCBDbHVzdGVyaW5nQm91bmQuVE9QKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobG93ZXJCb3VuZEFwcGxpY2FibGUodGFibGVNZXRhZGF0YSwga2V5LCBzbGljZTMsIHNzdGFibGUsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydFRydWUobG93ZXJCb3VuZEFwcGxpY2FibGUodGFibGVNZXRhZGF0YSwga2V5LCBzbGljZTMsIHNzdGFibGUsIHRydWUpKTsKKworICAgICAgICBTbGljZSBzbGljZTQgPSBTbGljZS5tYWtlKENsdXN0ZXJpbmdCb3VuZC5CT1RUT00sIFV0aWwuY2x1c3RlcmluZyh0YWJsZU1ldGFkYXRhLmNvbXBhcmF0b3IsIEJpZ0ludGVnZXIudmFsdWVPZig5KSkuYXNFbmRCb3VuZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsb3dlckJvdW5kQXBwbGljYWJsZSh0YWJsZU1ldGFkYXRhLCBrZXksIHNsaWNlNCwgc3N0YWJsZSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobG93ZXJCb3VuZEFwcGxpY2FibGUodGFibGVNZXRhZGF0YSwga2V5LCBzbGljZTQsIHNzdGFibGUsIHRydWUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb3dlckJvdW5kQXBwbGljYWJsZVNpbmdsZUNvbHVtbkRlc2MoKQorICAgIHsKKyAgICAgICAgU3RyaW5nIFRBQkxFX1JFVkVSU0VEID0gInRibF9yZXZlcnNlZCI7CisgICAgICAgIFN0cmluZyBjcmVhdGVUYWJsZSA9IFN0cmluZy5mb3JtYXQoCisgICAgICAgICJDUkVBVEUgVEFCTEUgJXMuJXMgKGsgdGV4dCwgaSB2YXJpbnQsIHYgaW50LCBwcmltYXJ5IGtleSAoaywgaSkpIFdJVEggQ0xVU1RFUklORyBPUkRFUiBCWSAoaSBERVNDKSIsCisgICAgICAgIEtFWVNQQUNFLCBUQUJMRV9SRVZFUlNFRCk7CisgICAgICAgIFF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVPbmNlSW50ZXJuYWwoY3JlYXRlVGFibGUpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShUQUJMRV9SRVZFUlNFRCk7CisgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEgPSBjZnMubWV0YWRhdGEoKTsKKyAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gIklOU0VSVCBJTlRPICVzLiVzIChrLCBpKSBWQUxVRVMgKCdrMScsICVzKSI7CisgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNyZWF0ZVNTVGFibGUobWV0YWRhdGEsIEtFWVNQQUNFLCBUQUJMRV9SRVZFUlNFRCwgcXVlcnkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU2xpY2UubWFrZShVdGlsLmNsdXN0ZXJpbmcobWV0YWRhdGEuY29tcGFyYXRvciwgQmlnSW50ZWdlci52YWx1ZU9mKDkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbC5jbHVzdGVyaW5nKG1ldGFkYXRhLmNvbXBhcmF0b3IsIEJpZ0ludGVnZXIudmFsdWVPZigwKSkpLAorICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5jb3ZlcmVkQ2x1c3RlcmluZyk7CisgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBtZXRhZGF0YS5wYXJ0aXRpb25lci5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5ieXRlcygiazEiKSk7CisKKyAgICAgICAgU2xpY2Ugc2xpY2UxID0gU2xpY2UubWFrZShVdGlsLmNsdXN0ZXJpbmcobWV0YWRhdGEuY29tcGFyYXRvciwgQmlnSW50ZWdlci52YWx1ZU9mKDgpKS5hc1N0YXJ0Qm91bmQoKSwgQ2x1c3RlcmluZ0JvdW5kLlRPUCk7CisgICAgICAgIGFzc2VydEZhbHNlKGxvd2VyQm91bmRBcHBsaWNhYmxlKG1ldGFkYXRhLCBrZXksIHNsaWNlMSwgc3N0YWJsZSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsb3dlckJvdW5kQXBwbGljYWJsZShtZXRhZGF0YSwga2V5LCBzbGljZTEsIHNzdGFibGUsIHRydWUpKTsKKworICAgICAgICBTbGljZSBzbGljZTIgPSBTbGljZS5tYWtlKENsdXN0ZXJpbmdCb3VuZC5CT1RUT00sIFV0aWwuY2x1c3RlcmluZyhtZXRhZGF0YS5jb21wYXJhdG9yLCBCaWdJbnRlZ2VyLnZhbHVlT2YoOCkpLmFzRW5kQm91bmQoKSk7CisgICAgICAgIGFzc2VydFRydWUobG93ZXJCb3VuZEFwcGxpY2FibGUobWV0YWRhdGEsIGtleSwgc2xpY2UyLCBzc3RhYmxlLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRGYWxzZShsb3dlckJvdW5kQXBwbGljYWJsZShtZXRhZGF0YSwga2V5LCBzbGljZTIsIHNzdGFibGUsIHRydWUpKTsKKworICAgICAgICAvLyBjb3JuZXIgY2FzZXMKKyAgICAgICAgU2xpY2Ugc2xpY2UzID0gU2xpY2UubWFrZShVdGlsLmNsdXN0ZXJpbmcobWV0YWRhdGEuY29tcGFyYXRvciwgQmlnSW50ZWdlci52YWx1ZU9mKDkpKS5hc1N0YXJ0Qm91bmQoKSwgQ2x1c3RlcmluZ0JvdW5kLlRPUCk7CisgICAgICAgIGFzc2VydEZhbHNlKGxvd2VyQm91bmRBcHBsaWNhYmxlKG1ldGFkYXRhLCBrZXksIHNsaWNlMywgc3N0YWJsZSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsb3dlckJvdW5kQXBwbGljYWJsZShtZXRhZGF0YSwga2V5LCBzbGljZTMsIHNzdGFibGUsIHRydWUpKTsKKworICAgICAgICBTbGljZSBzbGljZTQgPSBTbGljZS5tYWtlKENsdXN0ZXJpbmdCb3VuZC5CT1RUT00sIFV0aWwuY2x1c3RlcmluZyhtZXRhZGF0YS5jb21wYXJhdG9yLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMCkpLmFzRW5kQm91bmQoKSk7CisgICAgICAgIGFzc2VydFRydWUobG93ZXJCb3VuZEFwcGxpY2FibGUobWV0YWRhdGEsIGtleSwgc2xpY2U0LCBzc3RhYmxlLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRGYWxzZShsb3dlckJvdW5kQXBwbGljYWJsZShtZXRhZGF0YSwga2V5LCBzbGljZTQsIHNzdGFibGUsIHRydWUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb3dlckJvdW5kQXBwbGljYWJsZU11bHRpcGxlQ29sdW1uc0FzYygpCisgICAgeworICAgICAgICBTdHJpbmcgcXVlcnkgPSAiSU5TRVJUIElOVE8gJXMuJXMgKGssIGMxLCBjMikgVkFMVUVTICgnazEnLCAwLCAlcykiOworICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjcmVhdGVTU1RhYmxlKHNsaWNlc1RhYmxlTWV0YWRhdGEsIEtFWVNQQUNFLCBTTElDRVNfVEFCTEUsIHF1ZXJ5KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNsaWNlLm1ha2UoVXRpbC5jbHVzdGVyaW5nKHNsaWNlc1RhYmxlTWV0YWRhdGEuY29tcGFyYXRvciwgMCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWwuY2x1c3RlcmluZyhzbGljZXNUYWJsZU1ldGFkYXRhLmNvbXBhcmF0b3IsIDAsIDkpKSwKKyAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuY292ZXJlZENsdXN0ZXJpbmcpOworICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gc2xpY2VzVGFibGVNZXRhZGF0YS5wYXJ0aXRpb25lci5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5ieXRlcygiazEiKSk7CisKKyAgICAgICAgU2xpY2Ugc2xpY2UxID0gU2xpY2UubWFrZShVdGlsLmNsdXN0ZXJpbmcoc2xpY2VzVGFibGVNZXRhZGF0YS5jb21wYXJhdG9yLCAwLCAzKS5hc1N0YXJ0Qm91bmQoKSwgQ2x1c3RlcmluZ0JvdW5kLlRPUCk7CisgICAgICAgIGFzc2VydEZhbHNlKGxvd2VyQm91bmRBcHBsaWNhYmxlKHNsaWNlc1RhYmxlTWV0YWRhdGEsIGtleSwgc2xpY2UxLCBzc3RhYmxlLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKGxvd2VyQm91bmRBcHBsaWNhYmxlKHNsaWNlc1RhYmxlTWV0YWRhdGEsIGtleSwgc2xpY2UxLCBzc3RhYmxlLCB0cnVlKSk7CisKKyAgICAgICAgU2xpY2Ugc2xpY2UyID0gU2xpY2UubWFrZShDbHVzdGVyaW5nQm91bmQuQk9UVE9NLCBVdGlsLmNsdXN0ZXJpbmcoc2xpY2VzVGFibGVNZXRhZGF0YS5jb21wYXJhdG9yLCAwLCAzKS5hc0VuZEJvdW5kKCkpOworICAgICAgICBhc3NlcnRUcnVlKGxvd2VyQm91bmRBcHBsaWNhYmxlKHNsaWNlc1RhYmxlTWV0YWRhdGEsIGtleSwgc2xpY2UyLCBzc3RhYmxlLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRGYWxzZShsb3dlckJvdW5kQXBwbGljYWJsZShzbGljZXNUYWJsZU1ldGFkYXRhLCBrZXksIHNsaWNlMiwgc3N0YWJsZSwgdHJ1ZSkpOworCisgICAgICAgIC8vIGNvcm5lciBjYXNlcworICAgICAgICBTbGljZSBzbGljZTMgPSBTbGljZS5tYWtlKFV0aWwuY2x1c3RlcmluZyhzbGljZXNUYWJsZU1ldGFkYXRhLmNvbXBhcmF0b3IsIDAsIDApLmFzU3RhcnRCb3VuZCgpLCBDbHVzdGVyaW5nQm91bmQuVE9QKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobG93ZXJCb3VuZEFwcGxpY2FibGUoc2xpY2VzVGFibGVNZXRhZGF0YSwga2V5LCBzbGljZTMsIHNzdGFibGUsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydFRydWUobG93ZXJCb3VuZEFwcGxpY2FibGUoc2xpY2VzVGFibGVNZXRhZGF0YSwga2V5LCBzbGljZTMsIHNzdGFibGUsIHRydWUpKTsKKworICAgICAgICBTbGljZSBzbGljZTQgPSBTbGljZS5tYWtlKENsdXN0ZXJpbmdCb3VuZC5CT1RUT00sIFV0aWwuY2x1c3RlcmluZyhzbGljZXNUYWJsZU1ldGFkYXRhLmNvbXBhcmF0b3IsIDAsIDkpLmFzRW5kQm91bmQoKSk7CisgICAgICAgIGFzc2VydFRydWUobG93ZXJCb3VuZEFwcGxpY2FibGUoc2xpY2VzVGFibGVNZXRhZGF0YSwga2V5LCBzbGljZTQsIHNzdGFibGUsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGxvd2VyQm91bmRBcHBsaWNhYmxlKHNsaWNlc1RhYmxlTWV0YWRhdGEsIGtleSwgc2xpY2U0LCBzc3RhYmxlLCB0cnVlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG93ZXJCb3VuZEFwcGxpY2FibGVNdWx0aXBsZUNvbHVtbnNEZXNjKCkKKyAgICB7CisgICAgICAgIFN0cmluZyBUQUJMRV9SRVZFUlNFRCA9ICJ0Ymxfc2xpY2VzX3JldmVyc2VkIjsKKyAgICAgICAgU3RyaW5nIGNyZWF0ZVRhYmxlID0gU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgIkNSRUFURSBUQUJMRSAlcy4lcyAoayB0ZXh0LCBjMSBpbnQsIGMyIGludCwgdiBpbnQsIHByaW1hcnkga2V5IChrLCBjMSwgYzIpKSBXSVRIIENMVVNURVJJTkcgT1JERVIgQlkgKGMxIEFTQywgYzIgREVTQykiLAorICAgICAgICBLRVlTUEFDRSwgVEFCTEVfUkVWRVJTRUQpOworICAgICAgICBRdWVyeVByb2Nlc3Nvci5leGVjdXRlT25jZUludGVybmFsKGNyZWF0ZVRhYmxlKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoVEFCTEVfUkVWRVJTRUQpOworICAgICAgICBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhID0gY2ZzLm1ldGFkYXRhKCk7CisKKyAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gIklOU0VSVCBJTlRPICVzLiVzIChrLCBjMSwgYzIpIFZBTFVFUyAoJ2sxJywgMCwgJXMpIjsKKyAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY3JlYXRlU1NUYWJsZShtZXRhZGF0YSwgS0VZU1BBQ0UsIFRBQkxFX1JFVkVSU0VELCBxdWVyeSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTbGljZS5tYWtlKFV0aWwuY2x1c3RlcmluZyhtZXRhZGF0YS5jb21wYXJhdG9yLCAwLCA5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbC5jbHVzdGVyaW5nKG1ldGFkYXRhLmNvbXBhcmF0b3IsIDAsIDApKSwKKyAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuY292ZXJlZENsdXN0ZXJpbmcpOworICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gbWV0YWRhdGEucGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoImsxIikpOworCisgICAgICAgIFNsaWNlIHNsaWNlMSA9IFNsaWNlLm1ha2UoVXRpbC5jbHVzdGVyaW5nKG1ldGFkYXRhLmNvbXBhcmF0b3IsIDAsIDgpLmFzU3RhcnRCb3VuZCgpLCBDbHVzdGVyaW5nQm91bmQuVE9QKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobG93ZXJCb3VuZEFwcGxpY2FibGUobWV0YWRhdGEsIGtleSwgc2xpY2UxLCBzc3RhYmxlLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKGxvd2VyQm91bmRBcHBsaWNhYmxlKG1ldGFkYXRhLCBrZXksIHNsaWNlMSwgc3N0YWJsZSwgdHJ1ZSkpOworCisgICAgICAgIFNsaWNlIHNsaWNlMiA9IFNsaWNlLm1ha2UoQ2x1c3RlcmluZ0JvdW5kLkJPVFRPTSwgVXRpbC5jbHVzdGVyaW5nKG1ldGFkYXRhLmNvbXBhcmF0b3IsIDAsIDgpLmFzRW5kQm91bmQoKSk7CisgICAgICAgIGFzc2VydFRydWUobG93ZXJCb3VuZEFwcGxpY2FibGUobWV0YWRhdGEsIGtleSwgc2xpY2UyLCBzc3RhYmxlLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRGYWxzZShsb3dlckJvdW5kQXBwbGljYWJsZShtZXRhZGF0YSwga2V5LCBzbGljZTIsIHNzdGFibGUsIHRydWUpKTsKKworICAgICAgICAvLyBjb3JuZXIgY2FzZXMKKyAgICAgICAgU2xpY2Ugc2xpY2UzID0gU2xpY2UubWFrZShVdGlsLmNsdXN0ZXJpbmcobWV0YWRhdGEuY29tcGFyYXRvciwgMCwgOSkuYXNTdGFydEJvdW5kKCksIENsdXN0ZXJpbmdCb3VuZC5UT1ApOworICAgICAgICBhc3NlcnRGYWxzZShsb3dlckJvdW5kQXBwbGljYWJsZShtZXRhZGF0YSwga2V5LCBzbGljZTMsIHNzdGFibGUsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydFRydWUobG93ZXJCb3VuZEFwcGxpY2FibGUobWV0YWRhdGEsIGtleSwgc2xpY2UzLCBzc3RhYmxlLCB0cnVlKSk7CisKKyAgICAgICAgU2xpY2Ugc2xpY2U0ID0gU2xpY2UubWFrZShDbHVzdGVyaW5nQm91bmQuQk9UVE9NLCBVdGlsLmNsdXN0ZXJpbmcobWV0YWRhdGEuY29tcGFyYXRvciwgMCwgMCkuYXNFbmRCb3VuZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsb3dlckJvdW5kQXBwbGljYWJsZShtZXRhZGF0YSwga2V5LCBzbGljZTQsIHNzdGFibGUsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGxvd2VyQm91bmRBcHBsaWNhYmxlKG1ldGFkYXRhLCBrZXksIHNsaWNlNCwgc3N0YWJsZSwgdHJ1ZSkpOworICAgIH0KKworICAgIHByaXZhdGUgU1NUYWJsZVJlYWRlciBjcmVhdGVTU1RhYmxlKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsIFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlLCBTdHJpbmcgcXVlcnkpCisgICAgeworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKGtleXNwYWNlKS5nZXRDb2x1bW5GYW1pbHlTdG9yZSh0YWJsZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykKKyAgICAgICAgICAgIFF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVJbnRlcm5hbChTdHJpbmcuZm9ybWF0KHF1ZXJ5LCBrZXlzcGFjZSwgdGFibGUsIGkpKTsKKyAgICAgICAgY2ZzLmZvcmNlQmxvY2tpbmdGbHVzaChDb2x1bW5GYW1pbHlTdG9yZS5GbHVzaFJlYXNvbi5VTklUX1RFU1RTKTsKKyAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IG1ldGFkYXRhLnBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCJrMSIpKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUuVmlld0ZyYWdtZW50IHZpZXcgPSBjZnMuc2VsZWN0KFZpZXcuc2VsZWN0KFNTVGFibGVTZXQuTElWRSwga2V5KSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCB2aWV3LnNzdGFibGVzLnNpemUoKSk7CisgICAgICAgIHJldHVybiB2aWV3LnNzdGFibGVzLmdldCgwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbG93ZXJCb3VuZEFwcGxpY2FibGUoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgRGVjb3JhdGVkS2V5IGtleSwgU2xpY2Ugc2xpY2UsIFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgYm9vbGVhbiBpc1JldmVyc2VkKQorICAgIHsKKyAgICAgICAgU2xpY2VzLkJ1aWxkZXIgc2xpY2VzQnVpbGRlciA9IG5ldyBTbGljZXMuQnVpbGRlcihtZXRhZGF0YS5jb21wYXJhdG9yKTsKKyAgICAgICAgc2xpY2VzQnVpbGRlci5hZGQoc2xpY2UpOworICAgICAgICBTbGljZXMgc2xpY2VzID0gc2xpY2VzQnVpbGRlci5idWlsZCgpOworICAgICAgICBDbHVzdGVyaW5nSW5kZXhTbGljZUZpbHRlciBmaWx0ZXIgPSBuZXcgQ2x1c3RlcmluZ0luZGV4U2xpY2VGaWx0ZXIoc2xpY2VzLCBpc1JldmVyc2VkKTsKKworICAgICAgICBTaW5nbGVQYXJ0aXRpb25SZWFkQ29tbWFuZCBjbWQgPSBTaW5nbGVQYXJ0aXRpb25SZWFkQ29tbWFuZC5jcmVhdGUobWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5ub3dJblNlY29uZHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbkZpbHRlci5hbGwobWV0YWRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm93RmlsdGVyLk5PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhTGltaXRzLk5PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIpOworCisgICAgICAgIHRyeSAoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yV2l0aExvd2VyQm91bmQgaXRlciA9IG5ldyBVbmZpbHRlcmVkUm93SXRlcmF0b3JXaXRoTG93ZXJCb3VuZChrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXZlcnNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbkZpbHRlci5hbGwobWV0YWRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9ja2l0by5tb2NrKFNTVGFibGVSZWFkc0xpc3RlbmVyLmNsYXNzKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVyLmxvd2VyQm91bmQoKSAhPSBudWxsOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhRW50aXJlU1NUYWJsZVN0cmVhbVdyaXRlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhRW50aXJlU1NUYWJsZVN0cmVhbVdyaXRlclRlc3QuamF2YQppbmRleCBhNjViMmVhLi44OThkYTdjIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYUVudGlyZVNTVGFibGVTdHJlYW1Xcml0ZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFFbnRpcmVTU1RhYmxlU3RyZWFtV3JpdGVyVGVzdC5qYXZhCkBAIC0yNCw4ICsyNCw2IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5RdWV1ZTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIApAQCAtMzcsMTkgKzM1LDIwIEBACiBpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5EZWZhdWx0RmlsZVJlZ2lvbjsKIGltcG9ydCBpby5uZXR0eS5jaGFubmVsLmVtYmVkZGVkLkVtYmVkZGVkQ2hhbm5lbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dVcGRhdGVCdWlsZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZU11bHRpV3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRCdWZmZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlNoYXJlZERlZmF1bHRGaWxlUmVnaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5Bc3luY1N0cmVhbWluZ091dHB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlNoYXJlZERlZmF1bHRGaWxlUmVnaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5DYWNoaW5nUGFyYW1zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuYXN5bmMuTmV0dHlTdHJlYW1pbmdDb25uZWN0aW9uRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuUHJldmlld0tpbmQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlNlc3Npb25JbmZvOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1Db29yZGluYXRvcjsKQEAgLTU4LDYgKzU3LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtUmVzdWx0RnV0dXJlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1TZXNzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1TdW1tYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5hc3luYy5OZXR0eVN0cmVhbWluZ0Nvbm5lY3Rpb25GYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5tZXNzYWdlcy5TdHJlYW1NZXNzYWdlSGVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwpAQCAtMTQ5LDcgKzE0OSw2IEBACiAKICAgICAgICAgICAgIENhc3NhbmRyYVN0cmVhbUhlYWRlciBoZWFkZXIgPQogICAgICAgICAgICAgQ2Fzc2FuZHJhU3RyZWFtSGVhZGVyLmJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTU1RhYmxlRm9ybWF0KHNzdGFibGUuZGVzY3JpcHRvci5mb3JtYXRUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTU1RhYmxlVmVyc2lvbihzc3RhYmxlLmRlc2NyaXB0b3IudmVyc2lvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU1NUYWJsZUxldmVsKDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEVzdGltYXRlZEtleXMoc3N0YWJsZS5lc3RpbWF0ZWRLZXlzKCkpCkBAIC0yMDksNyArMjA4LDcgQEAKICAgICAgICAgU3RyZWFtUmVzdWx0RnV0dXJlIGZ1dHVyZSA9IFN0cmVhbVJlc3VsdEZ1dHVyZS5jcmVhdGVJbml0aWF0b3IobmV4dFRpbWVVVUlEKCksIFN0cmVhbU9wZXJhdGlvbi5CT09UU1RSQVAsIENvbGxlY3Rpb25zLjxTdHJlYW1FdmVudEhhbmRsZXI+ZW1wdHlMaXN0KCksIHN0cmVhbUNvb3JkaW5hdG9yKTsKIAogICAgICAgICBJbmV0QWRkcmVzc0FuZFBvcnQgcGVlciA9IEZCVXRpbGl0aWVzLmdldEJyb2FkY2FzdEFkZHJlc3NBbmRQb3J0KCk7Ci0gICAgICAgIHN0cmVhbUNvb3JkaW5hdG9yLmFkZFNlc3Npb25JbmZvKG5ldyBTZXNzaW9uSW5mbyhwZWVyLCAwLCBwZWVyLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIFN0cmVhbVNlc3Npb24uU3RhdGUuSU5JVElBTElaRUQpKTsKKyAgICAgICAgc3RyZWFtQ29vcmRpbmF0b3IuYWRkU2Vzc2lvbkluZm8obmV3IFNlc3Npb25JbmZvKHBlZXIsIDAsIHBlZXIsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgU3RyZWFtU2Vzc2lvbi5TdGF0ZS5JTklUSUFMSVpFRCwgbnVsbCkpOwogCiAgICAgICAgIFN0cmVhbVNlc3Npb24gc2Vzc2lvbiA9IHN0cmVhbUNvb3JkaW5hdG9yLmdldE9yQ3JlYXRlT3V0Ym91bmRTZXNzaW9uKHBlZXIpOwogICAgICAgICBzZXNzaW9uLmluaXQoZnV0dXJlKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhT3V0Z29pbmdGaWxlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFPdXRnb2luZ0ZpbGVUZXN0LmphdmEKaW5kZXggOTNiNmU3MS4uNmFkZmRlZCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFPdXRnb2luZ0ZpbGVUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFPdXRnb2luZ0ZpbGVUZXN0LmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5zdHJlYW1pbmc7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKQEAgLTEzMiw3ICsxMzMsNyBAQAogICAgICAgICBpbnQgY291bnQgPSAwOwogICAgICAgICBEZWNvcmF0ZWRLZXkga2V5OwogCi0gICAgICAgIHRyeSAoS2V5SXRlcmF0b3IgaXRlciA9IG5ldyBLZXlJdGVyYXRvcihzc3RhYmxlLmRlc2NyaXB0b3IsIHNzdGFibGUubWV0YWRhdGEoKSkpCisgICAgICAgIHRyeSAoS2V5SXRlcmF0b3IgaXRlciA9IHNzdGFibGUua2V5SXRlcmF0b3IoKSkKICAgICAgICAgewogICAgICAgICAgICAgZG8KICAgICAgICAgICAgIHsKQEAgLTE0MCw2ICsxNDEsMTAgQEAKICAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICAgfSB3aGlsZSAoaXRlci5oYXNOZXh0KCkgJiYgY291bnQgPCBpKTsKICAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGtleTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhU3RyZWFtSGVhZGVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1IZWFkZXJUZXN0LmphdmEKaW5kZXggMGU1MTg3Yy4uYTBlNGU1MSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1IZWFkZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1IZWFkZXJUZXN0LmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLnNjaGVtYS5DcmVhdGVUYWJsZVN0YXRlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CkBAIC0zOSw5ICs0MCw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wcmVzc2lvblBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CkBAIC0xNDQsOSArMTQ0LDkgQEAKICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlci5Db21wb25lbnQgc2VyaWFsaXphdGlvbkhlYWRlciA9IFNlcmlhbGl6YXRpb25IZWFkZXIubWFrZVdpdGhvdXRTdGF0cyhtZXRhZGF0YSkudG9Db21wb25lbnQoKTsKICAgICAgICAgQ29tcG9uZW50TWFuaWZlc3QgY29tcG9uZW50TWFuaWZlc3QgPSBlbnRpcmVTU1RhYmxlID8gQ29tcG9uZW50TWFuaWZlc3QuY3JlYXRlKHNzdGFibGUuZGVzY3JpcHRvcikgOiBudWxsOwogICAgICAgICBEZWNvcmF0ZWRLZXkgZmlyc3RLZXkgPSBlbnRpcmVTU1RhYmxlID8gc3N0YWJsZS5maXJzdCA6IG51bGw7CisKICAgICAgICAgcmV0dXJuIENhc3NhbmRyYVN0cmVhbUhlYWRlci5idWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU1NUYWJsZUZvcm1hdChTU1RhYmxlRm9ybWF0LlR5cGUuQklHKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTU1RhYmxlVmVyc2lvbihCaWdGb3JtYXQubGF0ZXN0VmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU1NUYWJsZVZlcnNpb24oc3N0YWJsZS5kZXNjcmlwdG9yLnZlcnNpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNTVGFibGVMZXZlbCgwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhFc3RpbWF0ZWRLZXlzKDEwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb21wcmVzc2lvbkluZm8oY29tcHJlc3Npb25JbmZvKQpAQCAtMTY2LDggKzE2Niw3IEBACiAgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEgPSBDcmVhdGVUYWJsZVN0YXRlbWVudC5wYXJzZShkZGwsICJrcyIpLmJ1aWxkKCk7CiAgICAgICAgIENhc3NhbmRyYVN0cmVhbUhlYWRlciBoZWFkZXIgPQogICAgICAgICAgICAgQ2Fzc2FuZHJhU3RyZWFtSGVhZGVyLmJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTU1RhYmxlRm9ybWF0KFNTVGFibGVGb3JtYXQuVHlwZS5CSUcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNTVGFibGVWZXJzaW9uKEJpZ0Zvcm1hdC5sYXRlc3RWZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTU1RhYmxlVmVyc2lvbihEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkuZ2V0TGF0ZXN0VmVyc2lvbigpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTU1RhYmxlTGV2ZWwoMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoRXN0aW1hdGVkS2V5cygwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTZWN0aW9ucyhDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSkKQEAgLTE4NCwxMiArMTgzLDExIEBACiAgICAgICAgIFN0cmluZyBkZGwgPSAiQ1JFQVRFIFRBQkxFIHRibCAoayBJTlQgUFJJTUFSWSBLRVksIHYgSU5UKSI7CiAgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEgPSBDcmVhdGVUYWJsZVN0YXRlbWVudC5wYXJzZShkZGwsICJrcyIpLmJ1aWxkKCk7CiAKLSAgICAgICAgQ29tcG9uZW50TWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgQ29tcG9uZW50TWFuaWZlc3QobmV3IExpbmtlZEhhc2hNYXA8Q29tcG9uZW50LCBMb25nPigpIHt7IHB1dChDb21wb25lbnQuREFUQSwgMTAwTCk7IH19KTsKKyAgICAgICAgQ29tcG9uZW50TWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgQ29tcG9uZW50TWFuaWZlc3QobmV3IExpbmtlZEhhc2hNYXA8Q29tcG9uZW50LCBMb25nPigpIHt7IHB1dChDb21wb25lbnRzLkRBVEEsIDEwMEwpOyB9fSk7CiAKICAgICAgICAgQ2Fzc2FuZHJhU3RyZWFtSGVhZGVyIGhlYWRlciA9CiAgICAgICAgICAgICBDYXNzYW5kcmFTdHJlYW1IZWFkZXIuYnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNTVGFibGVGb3JtYXQoU1NUYWJsZUZvcm1hdC5UeXBlLkJJRykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU1NUYWJsZVZlcnNpb24oQmlnRm9ybWF0LmxhdGVzdFZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNTVGFibGVWZXJzaW9uKERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKS5nZXRMYXRlc3RWZXJzaW9uKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNTVGFibGVMZXZlbCgwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhFc3RpbWF0ZWRLZXlzKDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNlY3Rpb25zKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1NYW5hZ2VyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1NYW5hZ2VyVGVzdC5qYXZhCmluZGV4IGU3Nzk1YzguLmZhYzU3MDYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhU3RyZWFtTWFuYWdlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYVN0cmVhbU1hbmFnZXJUZXN0LmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CkBAIC01MywxMCArNTQsMTIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wYWN0aW9uUGFyYW1zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQWN0aXZlUmVwYWlyU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtU3VtbWFyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtaW5nQ2hhbm5lbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuYXN5bmMuTmV0dHlTdHJlYW1pbmdDb25uZWN0aW9uRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuT3V0Z29pbmdTdHJlYW07CkBAIC02OSw2ICs3Miw4IEBACiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQWN0aXZlUmVwYWlyU2VydmljZS5OT19QRU5ESU5HX1JFUEFJUjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5BY3RpdmVSZXBhaXJTZXJ2aWNlLlVOUkVQQUlSRURfU1NUQUJMRTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiBwdWJsaWMgY2xhc3MgQ2Fzc2FuZHJhU3RyZWFtTWFuYWdlclRlc3QKIHsKQEAgLTkwLDcgKzk1LDkgQEAKICAgICBwdWJsaWMgdm9pZCBjcmVhdGVLZXlzcGFjZSgpIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIGtleXNwYWNlID0gU3RyaW5nLmZvcm1hdCgia3NfJXMiLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0gICAgICAgIHRibSA9IENyZWF0ZVRhYmxlU3RhdGVtZW50LnBhcnNlKFN0cmluZy5mb3JtYXQoIkNSRUFURSBUQUJMRSAlcyAoayBJTlQgUFJJTUFSWSBLRVksIHYgSU5UKSIsIHRhYmxlKSwga2V5c3BhY2UpLmJ1aWxkKCk7CisgICAgICAgIHRibSA9IENyZWF0ZVRhYmxlU3RhdGVtZW50LnBhcnNlKFN0cmluZy5mb3JtYXQoIkNSRUFURSBUQUJMRSAlcyAoayBJTlQgUFJJTUFSWSBLRVksIHYgSU5UKSIsIHRhYmxlKSwga2V5c3BhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhY3Rpb24oQ29tcGFjdGlvblBhcmFtcy5zdGNzKENvbGxlY3Rpb25zLmVtcHR5TWFwKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwogICAgICAgICBTY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2Uoa2V5c3BhY2UsIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwgdGJtKTsKICAgICAgICAgY2ZzID0gU2NoZW1hLmluc3RhbmNlLmdldENvbHVtbkZhbWlseVN0b3JlSW5zdGFuY2UodGJtLmlkKTsKICAgICB9CkBAIC0yNDAsOCArMjQ3LDM0IEBACiAgICAgICAgICAgICBkb25lLnNldCh0cnVlKTsKICAgICAgICAgICAgIHQuam9pbigyMCk7CiAgICAgICAgIH0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGZhaWxlZC5nZXQoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGNoZWNrQ291bnQuZ2V0KCkgPj0gMik7CisgICAgICAgIGFzc2VydEZhbHNlKGZhaWxlZC5nZXQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY2hlY2tDb3VudC5nZXQoKSA+PSAyKTsKICAgICAgICAgY2ZzLnRydW5jYXRlQmxvY2tpbmcoKTsKICAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNoZWNrQXZhaWxhYmxlRGlza1NwYWNlQW5kQ29tcGFjdGlvbnMoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJlYW1TZXNzaW9uLmNoZWNrQXZhaWxhYmxlRGlza1NwYWNlQW5kQ29tcGFjdGlvbnMoY3JlYXRlU3VtbWFyaWVzKCksIG5leHRUaW1lVVVJRCgpLCBudWxsLCBmYWxzZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2hlY2tBdmFpbGFibGVEaXNrU3BhY2VBbmRDb21wYWN0aW9uc0ZhaWxpbmcoKQorICAgIHsKKyAgICAgICAgaW50IHRocmVzaG9sZCA9IEFjdGl2ZVJlcGFpclNlcnZpY2UuaW5zdGFuY2UuZ2V0UmVwYWlyUGVuZGluZ0NvbXBhY3Rpb25SZWplY3RUaHJlc2hvbGQoKTsKKyAgICAgICAgQWN0aXZlUmVwYWlyU2VydmljZS5pbnN0YW5jZS5zZXRSZXBhaXJQZW5kaW5nQ29tcGFjdGlvblJlamVjdFRocmVzaG9sZCgxKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoU3RyZWFtU2Vzc2lvbi5jaGVja0F2YWlsYWJsZURpc2tTcGFjZUFuZENvbXBhY3Rpb25zKGNyZWF0ZVN1bW1hcmllcygpLCBuZXh0VGltZVVVSUQoKSwgbnVsbCwgZmFsc2UpKTsKKyAgICAgICAgQWN0aXZlUmVwYWlyU2VydmljZS5pbnN0YW5jZS5zZXRSZXBhaXJQZW5kaW5nQ29tcGFjdGlvblJlamVjdFRocmVzaG9sZCh0aHJlc2hvbGQpOworICAgIH0KKworICAgIHByaXZhdGUgQ29sbGVjdGlvbjxTdHJlYW1TdW1tYXJ5PiBjcmVhdGVTdW1tYXJpZXMoKQorICAgIHsKKyAgICAgICAgQ29sbGVjdGlvbjxTdHJlYW1TdW1tYXJ5PiBzdW1tYXJpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJlYW1TdW1tYXJ5IHN1bW1hcnkgPSBuZXcgU3RyZWFtU3VtbWFyeSh0Ym0uaWQsIGksIChpICsgMSkgKiAxMCk7CisgICAgICAgICAgICBzdW1tYXJpZXMuYWRkKHN1bW1hcnkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdW1tYXJpZXM7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9Db21wb25lbnRNYW5pZmVzdFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ29tcG9uZW50TWFuaWZlc3RUZXN0LmphdmEKaW5kZXggNDkwOTI2My4uZjViZmU0ZiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9Db21wb25lbnRNYW5pZmVzdFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0NvbXBvbmVudE1hbmlmZXN0VGVzdC5qYXZhCkBAIC0xOCw0NCArMTgsNDkgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5zdHJlYW1pbmc7CiAKLWltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CiAKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0QnVmZmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dEJ1ZmZlckZpeGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLlNlcmlhbGl6YXRpb25VdGlsczsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdEVxdWFsczsKLQogcHVibGljIGNsYXNzIENvbXBvbmVudE1hbmlmZXN0VGVzdAogeworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuY2xpZW50SW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkKICAgICB7Ci0gICAgICAgIENvbXBvbmVudE1hbmlmZXN0IGV4cGVjdGVkID0gbmV3IENvbXBvbmVudE1hbmlmZXN0KG5ldyBMaW5rZWRIYXNoTWFwPENvbXBvbmVudCwgTG9uZz4oKSB7eyBwdXQoQ29tcG9uZW50LkRBVEEsIDEwMEwpOyB9fSk7Ci0gICAgICAgIFNlcmlhbGl6YXRpb25VdGlscy5hc3NlcnRTZXJpYWxpemF0aW9uQ3ljbGUoZXhwZWN0ZWQsIENvbXBvbmVudE1hbmlmZXN0LnNlcmlhbGl6ZXIpOworICAgICAgICBDb21wb25lbnRNYW5pZmVzdCBleHBlY3RlZCA9IG5ldyBDb21wb25lbnRNYW5pZmVzdChuZXcgTGlua2VkSGFzaE1hcDxDb21wb25lbnQsIExvbmc+KCkge3sgcHV0KENvbXBvbmVudHMuREFUQSwgMTAwTCk7IH19KTsKKyAgICAgICAgU2VyaWFsaXphdGlvblV0aWxzLmFzc2VydFNlcmlhbGl6YXRpb25DeWNsZShleHBlY3RlZCwgQ29tcG9uZW50TWFuaWZlc3Quc2VyaWFsaXplcnMuZ2V0KEJpZ0Zvcm1hdC5nZXRJbnN0YW5jZSgpLm5hbWUoKSkpOwogICAgIH0KIAotICAgIEBUZXN0KGV4cGVjdGVkID0gRU9GRXhjZXB0aW9uLmNsYXNzKQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uX0ZhaWxzT25CYWRCeXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDUxMik7Ci0gICAgICAgIENvbXBvbmVudE1hbmlmZXN0IGV4cGVjdGVkID0gbmV3IENvbXBvbmVudE1hbmlmZXN0KG5ldyBMaW5rZWRIYXNoTWFwPENvbXBvbmVudCwgTG9uZz4oKSB7eyBwdXQoQ29tcG9uZW50LkRBVEEsIDEwMEwpOyB9fSk7Ci0KLSAgICAgICAgRGF0YU91dHB1dEJ1ZmZlckZpeGVkIG91dCA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyRml4ZWQoYnVmKTsKLQotICAgICAgICBDb21wb25lbnRNYW5pZmVzdC5zZXJpYWxpemVyLnNlcmlhbGl6ZShleHBlY3RlZCwgb3V0LCBNZXNzYWdpbmdTZXJ2aWNlLlZFUlNJT05fNDApOwotCi0gICAgICAgIGJ1Zi5wdXRJbnQoMCwgLTEwMCk7Ci0KLSAgICAgICAgRGF0YUlucHV0QnVmZmVyIGluID0gbmV3IERhdGFJbnB1dEJ1ZmZlcihvdXQuYnVmZmVyKCksIGZhbHNlKTsKLSAgICAgICAgQ29tcG9uZW50TWFuaWZlc3QgYWN0dWFsID0gQ29tcG9uZW50TWFuaWZlc3Quc2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbiwgTWVzc2FnaW5nU2VydmljZS5WRVJTSU9OXzQwKTsKLSAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotICAgIH0KKyAgICAvLyBQcm9wb3NlIHJlbW92aW5nIHRoaXMgdGVzdCB3aGljaCBub3cgZmFpbHMgb24gVkludE91dE9mUmFuZ2UKKyAgICAvLyBXZSBkb24ndCBzYWZlbHkgY2hlY2sgaWYgdGhlIGJ5dGVzIGFyZSBiYWQgc28gSSBkb24ndCB1bmRlcnN0YW5kIHdoYXQgaXMgYmVpbmcgdGVzdGVkCisgICAgLy8gVGhlcmUgaXMgbm8gY2hlY2tzdW0KKy8vICAgIEBUZXN0KGV4cGVjdGVkID0gRU9GRXhjZXB0aW9uLmNsYXNzKQorLy8gICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25fRmFpbHNPbkJhZEJ5dGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uCisvLyAgICB7CisvLyAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDUxMik7CisvLyAgICAgICAgQ29tcG9uZW50TWFuaWZlc3QgZXhwZWN0ZWQgPSBuZXcgQ29tcG9uZW50TWFuaWZlc3QobmV3IExpbmtlZEhhc2hNYXA8Q29tcG9uZW50LCBMb25nPigpIHt7IHB1dChDb21wb25lbnRzLkRBVEEsIDEwMEwpOyB9fSk7CisvLworLy8gICAgICAgIERhdGFPdXRwdXRCdWZmZXJGaXhlZCBvdXQgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlckZpeGVkKGJ1Zik7CisvLworLy8gICAgICAgIENvbXBvbmVudE1hbmlmZXN0LnNlcmlhbGl6ZXIuc2VyaWFsaXplKGV4cGVjdGVkLCBvdXQsIE1lc3NhZ2luZ1NlcnZpY2UuVkVSU0lPTl80MCk7CisvLworLy8gICAgICAgIGJ1Zi5wdXRJbnQoMCwgLTEwMCk7CisvLworLy8gICAgICAgIERhdGFJbnB1dEJ1ZmZlciBpbiA9IG5ldyBEYXRhSW5wdXRCdWZmZXIob3V0LmJ1ZmZlcigpLCBmYWxzZSk7CisvLyAgICAgICAgQ29tcG9uZW50TWFuaWZlc3QgYWN0dWFsID0gQ29tcG9uZW50TWFuaWZlc3Quc2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbiwgTWVzc2FnaW5nU2VydmljZS5WRVJTSU9OXzQwKTsKKy8vICAgICAgICBhc3NlcnROb3RFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7CisvLyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0VudGlyZVNTVGFibGVTdHJlYW1Db25jdXJyZW50Q29tcG9uZW50TXV0YXRpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0VudGlyZVNTVGFibGVTdHJlYW1Db25jdXJyZW50Q29tcG9uZW50TXV0YXRpb25UZXN0LmphdmEKaW5kZXggOGI2M2JhNS4uODEwN2ZkOSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9FbnRpcmVTU1RhYmxlU3RyZWFtQ29uY3VycmVudENvbXBvbmVudE11dGF0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvRW50aXJlU1NUYWJsZVN0cmVhbUNvbmN1cnJlbnRDb21wb25lbnRNdXRhdGlvblRlc3QuamF2YQpAQCAtNTYsMTAgKzU2LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JbmRleFN1bW1hcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeS5JbmRleFN1bW1hcnlNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuaW5kZXhzdW1tYXJ5LkluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0QnVmZmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmFuZ2VzQXRFbmRwb2ludDsKQEAgLTcxLDcgKzcxLDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hVGVzdFV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5BY3RpdmVSZXBhaXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5hc3luYy5OZXR0eVN0cmVhbWluZ0Nvbm5lY3Rpb25GYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5PdXRnb2luZ1N0cmVhbTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuUHJldmlld0tpbmQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlNlc3Npb25JbmZvOwpAQCAtODAsNiArNzksNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1SZXN1bHRGdXR1cmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbVNlc3Npb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbVN1bW1hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLmFzeW5jLk5ldHR5U3RyZWFtaW5nQ29ubmVjdGlvbkZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLm1lc3NhZ2VzLlN0cmVhbU1lc3NhZ2VIZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CkBAIC0zMjQsNyArMzI0LDcgQEAKICAgICAgICAgU3RyZWFtUmVzdWx0RnV0dXJlIGZ1dHVyZSA9IFN0cmVhbVJlc3VsdEZ1dHVyZS5jcmVhdGVJbml0aWF0b3IobmV4dFRpbWVVVUlEKCksIFN0cmVhbU9wZXJhdGlvbi5CT09UU1RSQVAsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBzdHJlYW1Db29yZGluYXRvcik7CiAKICAgICAgICAgSW5ldEFkZHJlc3NBbmRQb3J0IHBlZXIgPSBGQlV0aWxpdGllcy5nZXRCcm9hZGNhc3RBZGRyZXNzQW5kUG9ydCgpOwotICAgICAgICBzdHJlYW1Db29yZGluYXRvci5hZGRTZXNzaW9uSW5mbyhuZXcgU2Vzc2lvbkluZm8ocGVlciwgMCwgcGVlciwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBTdHJlYW1TZXNzaW9uLlN0YXRlLklOSVRJQUxJWkVEKSk7CisgICAgICAgIHN0cmVhbUNvb3JkaW5hdG9yLmFkZFNlc3Npb25JbmZvKG5ldyBTZXNzaW9uSW5mbyhwZWVyLCAwLCBwZWVyLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIFN0cmVhbVNlc3Npb24uU3RhdGUuSU5JVElBTElaRUQsIG51bGwpKTsKIAogICAgICAgICBTdHJlYW1TZXNzaW9uIHNlc3Npb24gPSBzdHJlYW1Db29yZGluYXRvci5nZXRPckNyZWF0ZU91dGJvdW5kU2Vzc2lvbihwZWVyKTsKICAgICAgICAgc2Vzc2lvbi5pbml0KGZ1dHVyZSk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJhbnNmb3JtL0R1cGxpY2F0ZVJvd0NoZWNrZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJhbnNmb3JtL0R1cGxpY2F0ZVJvd0NoZWNrZXJUZXN0LmphdmEKaW5kZXggZTQ0Y2JjZC4uZTdmMDRiMSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyYW5zZm9ybS9EdXBsaWNhdGVSb3dDaGVja2VyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmFuc2Zvcm0vRHVwbGljYXRlUm93Q2hlY2tlclRlc3QuamF2YQpAQCAtMzgsNiArMzgsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkRpYWdub3N0aWNTbmFwc2hvdFNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ESUFHTk9TVElDX1NOQVBTSE9UX0lOVEVSVkFMX05BTk9TOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbC5ieXRlczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKQEAgLTU5LDcgKzYwLDcgQEAKICAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRTbmFwc2hvdE9uRHVwbGljYXRlUm93RGV0ZWN0aW9uKHRydWUpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5kaWFnbm9zdGljX3NuYXBzaG90X2ludGVydmFsX25hbm9zIiwgIjAiKTsKKyAgICAgICAgRElBR05PU1RJQ19TTkFQU0hPVF9JTlRFUlZBTF9OQU5PUy5zZXRMb25nKDApOwogICAgICAgICAvLyBDcmVhdGUgYSB0YWJsZSBhbmQgaW5zZXJ0IHNvbWUgZGF0YS4gVGhlIGFjdHVhbCByb3dzIHJlYWQgaW4gdGhlIHRlc3Qgd2lsbCBiZSBzeW50aGV0aWMKICAgICAgICAgLy8gYnV0IHRoaXMgY3JlYXRlcyBhbiBzc3RhYmxlIG9uIGRpc2sgdG8gYmUgc25hcHNob3R0ZWQuCiAgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIHRleHQsIGNrMSBpbnQsIGNrMiBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrMSwgY2syKSkiKTsKQEAgLTE5NiwxMCArMTk3LDEwIEBACiAgICAgICAgIHJldHVybiBCVHJlZVJvdy5ub0NlbGxMaXZlUm93KENsdXN0ZXJpbmcubWFrZShjbHVzdGVyaW5nQnl0ZUJ1ZmZlcnMpLCBMaXZlbmVzc0luZm8uY3JlYXRlKDAsIDApKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciByb3dzKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1JldmVyc2VkT3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmZpbHRlcmVkLi4uIHVuZmlsdGVyZWRzKQorICAgIHB1YmxpYyBzdGF0aWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHBhcnRpdGlvbihUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzUmV2ZXJzZWRPcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5maWx0ZXJlZC4uLiB1bmZpbHRlcmVkcykKICAgICB7CiAgICAgICAgIEl0ZXJhdG9yPFVuZmlsdGVyZWQ+IGl0ZXJhdG9yID0gSXRlcmF0b3JzLmZvckFycmF5KHVuZmlsdGVyZWRzKTsKICAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdFVuZmlsdGVyZWRSb3dJdGVyYXRvcihtZXRhZGF0YSwKQEAgLTIyNyw3ICsyMjgsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yIGl0ZXIoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgYm9vbGVhbiBpc1JldmVyc2VkT3JkZXIsIFVuZmlsdGVyZWQuLi4gdW5maWx0ZXJlZHMpCiAgICAgewogICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gbWV0YWRhdGEucGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoYnl0ZXMoImtleSIpKTsKLSAgICAgICAgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHJvd0l0ZXIgPSByb3dzKG1ldGFkYXRhLCBrZXksIGlzUmV2ZXJzZWRPcmRlciwgdW5maWx0ZXJlZHMpOworICAgICAgICBVbmZpbHRlcmVkUm93SXRlcmF0b3Igcm93SXRlciA9IHBhcnRpdGlvbihtZXRhZGF0YSwga2V5LCBpc1JldmVyc2VkT3JkZXIsIHVuZmlsdGVyZWRzKTsKICAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGV0b25VbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3Iocm93SXRlcik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0NvbGxlY3Rpb25NZXJnZVRyaWVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvQ29sbGVjdGlvbk1lcmdlVHJpZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDkwM2E3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0NvbGxlY3Rpb25NZXJnZVRyaWVUZXN0LmphdmEKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXM7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzLkluTWVtb3J5VHJpZVRlc3RCYXNlLio7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzLk1lcmdlVHJpZVRlc3QucmVtb3ZlRHVwbGljYXRlczsKKworcHVibGljIGNsYXNzIENvbGxlY3Rpb25NZXJnZVRyaWVUZXN0Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPVU5UID0gMTUwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKCk7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXJlY3QoKQorICAgIHsKKyAgICAgICAgQnl0ZUNvbXBhcmFibGVbXSBzcmMxID0gZ2VuZXJhdGVLZXlzKHJhbmQsIENPVU5UKTsKKyAgICAgICAgQnl0ZUNvbXBhcmFibGVbXSBzcmMyID0gZ2VuZXJhdGVLZXlzKHJhbmQsIENPVU5UKTsKKyAgICAgICAgU29ydGVkTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBjb250ZW50MSA9IG5ldyBUcmVlTWFwPD4oKGJ5dGVzMSwgYnl0ZXMyKSAtPiBCeXRlQ29tcGFyYWJsZS5jb21wYXJlKGJ5dGVzMSwgYnl0ZXMyLCBWRVJTSU9OKSk7CisgICAgICAgIFNvcnRlZE1hcDxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gY29udGVudDIgPSBuZXcgVHJlZU1hcDw+KChieXRlczEsIGJ5dGVzMikgLT4gQnl0ZUNvbXBhcmFibGUuY29tcGFyZShieXRlczEsIGJ5dGVzMiwgVkVSU0lPTikpOworCisgICAgICAgIEluTWVtb3J5VHJpZTxCeXRlQnVmZmVyPiB0cmllMSA9IG1ha2VJbk1lbW9yeVRyaWUoc3JjMSwgY29udGVudDEsIHRydWUpOworICAgICAgICBJbk1lbW9yeVRyaWU8Qnl0ZUJ1ZmZlcj4gdHJpZTIgPSBtYWtlSW5NZW1vcnlUcmllKHNyYzIsIGNvbnRlbnQyLCB0cnVlKTsKKworICAgICAgICBjb250ZW50MS5wdXRBbGwoY29udGVudDIpOworICAgICAgICAvLyBjb25zdHJ1Y3QgZGlyZWN0bHksIHRyaWUubWVyZ2UoKSB3aWxsIGRlZmVyIHRvIG1lcmdlV2l0aCBvbiB0d28gc291cmNlcworICAgICAgICBUcmllPEJ5dGVCdWZmZXI+IHVuaW9uID0gbmV3IENvbGxlY3Rpb25NZXJnZVRyaWU8PihJbW11dGFibGVMaXN0Lm9mKHRyaWUxLCB0cmllMiksIHggLT4geC5pdGVyYXRvcigpLm5leHQoKSk7CisKKyAgICAgICAgYXNzZXJ0U2FtZUNvbnRlbnQodW5pb24sIGNvbnRlbnQxKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoRHVwbGljYXRlcygpCisgICAgeworICAgICAgICBCeXRlQ29tcGFyYWJsZVtdIHNyYzEgPSBnZW5lcmF0ZUtleXMocmFuZCwgQ09VTlQpOworICAgICAgICBCeXRlQ29tcGFyYWJsZVtdIHNyYzIgPSBnZW5lcmF0ZUtleXMocmFuZCwgQ09VTlQpOworICAgICAgICBTb3J0ZWRNYXA8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+IGNvbnRlbnQxID0gbmV3IFRyZWVNYXA8PigoYnl0ZXMxLCBieXRlczIpIC0+IEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoYnl0ZXMxLCBieXRlczIsIFZFUlNJT04pKTsKKyAgICAgICAgU29ydGVkTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBjb250ZW50MiA9IG5ldyBUcmVlTWFwPD4oKGJ5dGVzMSwgYnl0ZXMyKSAtPiBCeXRlQ29tcGFyYWJsZS5jb21wYXJlKGJ5dGVzMSwgYnl0ZXMyLCBWRVJTSU9OKSk7CisKKyAgICAgICAgSW5NZW1vcnlUcmllPEJ5dGVCdWZmZXI+IHRyaWUxID0gbWFrZUluTWVtb3J5VHJpZShzcmMxLCBjb250ZW50MSwgdHJ1ZSk7CisgICAgICAgIEluTWVtb3J5VHJpZTxCeXRlQnVmZmVyPiB0cmllMiA9IG1ha2VJbk1lbW9yeVRyaWUoc3JjMiwgY29udGVudDIsIHRydWUpOworCisgICAgICAgIGFkZFRvSW5NZW1vcnlUcmllKGdlbmVyYXRlS2V5cyhuZXcgUmFuZG9tKDUpLCBDT1VOVCksIGNvbnRlbnQxLCB0cmllMSwgdHJ1ZSk7CisgICAgICAgIGFkZFRvSW5NZW1vcnlUcmllKGdlbmVyYXRlS2V5cyhuZXcgUmFuZG9tKDUpLCBDT1VOVCksIGNvbnRlbnQyLCB0cmllMiwgdHJ1ZSk7CisKKyAgICAgICAgY29udGVudDEucHV0QWxsKGNvbnRlbnQyKTsKKyAgICAgICAgVHJpZTxCeXRlQnVmZmVyPiB1bmlvbiA9IG5ldyBDb2xsZWN0aW9uTWVyZ2VUcmllPD4oSW1tdXRhYmxlTGlzdC5vZih0cmllMSwgdHJpZTIpLCB4IC0+IHguaXRlcmF0b3IoKS5uZXh0KCkpOworCisgICAgICAgIGFzc2VydFNhbWVDb250ZW50KHVuaW9uLCBjb250ZW50MSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzdGluY3QoKQorICAgIHsKKyAgICAgICAgQnl0ZUNvbXBhcmFibGVbXSBzcmMxID0gZ2VuZXJhdGVLZXlzKHJhbmQsIENPVU5UKTsKKyAgICAgICAgU29ydGVkTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBjb250ZW50MSA9IG5ldyBUcmVlTWFwPD4oKGJ5dGVzMSwgYnl0ZXMyKSAtPiBCeXRlQ29tcGFyYWJsZS5jb21wYXJlKGJ5dGVzMSwgYnl0ZXMyLCBWRVJTSU9OKSk7CisgICAgICAgIEluTWVtb3J5VHJpZTxCeXRlQnVmZmVyPiB0cmllMSA9IG1ha2VJbk1lbW9yeVRyaWUoc3JjMSwgY29udGVudDEsIHRydWUpOworCisgICAgICAgIEJ5dGVDb21wYXJhYmxlW10gc3JjMiA9IGdlbmVyYXRlS2V5cyhyYW5kLCBDT1VOVCk7CisgICAgICAgIHNyYzIgPSByZW1vdmVEdXBsaWNhdGVzKHNyYzIsIGNvbnRlbnQxKTsKKyAgICAgICAgU29ydGVkTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBjb250ZW50MiA9IG5ldyBUcmVlTWFwPD4oKGJ5dGVzMSwgYnl0ZXMyKSAtPiBCeXRlQ29tcGFyYWJsZS5jb21wYXJlKGJ5dGVzMSwgYnl0ZXMyLCBWRVJTSU9OKSk7CisgICAgICAgIEluTWVtb3J5VHJpZTxCeXRlQnVmZmVyPiB0cmllMiA9IG1ha2VJbk1lbW9yeVRyaWUoc3JjMiwgY29udGVudDIsIHRydWUpOworCisgICAgICAgIGNvbnRlbnQxLnB1dEFsbChjb250ZW50Mik7CisgICAgICAgIFRyaWU8Qnl0ZUJ1ZmZlcj4gdW5pb24gPSBuZXcgQ29sbGVjdGlvbk1lcmdlVHJpZS5EaXN0aW5jdDw+KEltbXV0YWJsZUxpc3Qub2YodHJpZTEsIHRyaWUyKSk7CisKKyAgICAgICAgYXNzZXJ0U2FtZUNvbnRlbnQodW5pb24sIGNvbnRlbnQxKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZSgpCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlc3RNdWx0aXBsZShyYW5kLm5leHRJbnQoMTApICsgNSwgQ09VTlQgLyAxMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZXJnZTEoKQorICAgIHsKKyAgICAgICAgdGVzdE11bHRpcGxlKDEsIENPVU5UIC8gMTApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lcmdlMigpCisgICAgeworICAgICAgICB0ZXN0TXVsdGlwbGUoMiwgQ09VTlQgLyAxMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2UzKCkKKyAgICB7CisgICAgICAgIHRlc3RNdWx0aXBsZSgzLCBDT1VOVCAvIDEwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZXJnZTUoKQorICAgIHsKKyAgICAgICAgdGVzdE11bHRpcGxlKDUsIENPVU5UIC8gMTApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lcmdlMCgpCisgICAgeworICAgICAgICB0ZXN0TXVsdGlwbGUoMCwgQ09VTlQgLyAxMCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlKGludCBtZXJnZUNvdW50LCBpbnQgY291bnQpCisgICAgeworICAgICAgICB0ZXN0TXVsdGlwbGVEaXN0aW5jdChtZXJnZUNvdW50LCBjb3VudCk7CisgICAgICAgIHRlc3RNdWx0aXBsZVdpdGhEdXBsaWNhdGVzKG1lcmdlQ291bnQsIGNvdW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVEaXN0aW5jdChpbnQgbWVyZ2VDb3VudCwgaW50IGNvdW50KQorICAgIHsKKyAgICAgICAgTGlzdDxUcmllPEJ5dGVCdWZmZXI+PiB0cmllcyA9IG5ldyBBcnJheUxpc3Q8PihtZXJnZUNvdW50KTsKKyAgICAgICAgU29ydGVkTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBjb250ZW50ID0gbmV3IFRyZWVNYXA8PigoYnl0ZXMxLCBieXRlczIpIC0+IEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoYnl0ZXMxLCBieXRlczIsIFZFUlNJT04pKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lcmdlQ291bnQ7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGVbXSBzcmMgPSByZW1vdmVEdXBsaWNhdGVzKGdlbmVyYXRlS2V5cyhyYW5kLCBjb3VudCksIGNvbnRlbnQpOworICAgICAgICAgICAgVHJpZTxCeXRlQnVmZmVyPiB0cmllID0gbWFrZUluTWVtb3J5VHJpZShzcmMsIGNvbnRlbnQsIHRydWUpOworICAgICAgICAgICAgdHJpZXMuYWRkKHRyaWUpOworICAgICAgICB9CisKKyAgICAgICAgVHJpZTxCeXRlQnVmZmVyPiB1bmlvbiA9IFRyaWUubWVyZ2VEaXN0aW5jdCh0cmllcyk7CisgICAgICAgIGFzc2VydFNhbWVDb250ZW50KHVuaW9uLCBjb250ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVXaXRoRHVwbGljYXRlcyhpbnQgbWVyZ2VDb3VudCwgaW50IGNvdW50KQorICAgIHsKKyAgICAgICAgTGlzdDxUcmllPEJ5dGVCdWZmZXI+PiB0cmllcyA9IG5ldyBBcnJheUxpc3Q8PihtZXJnZUNvdW50KTsKKyAgICAgICAgU29ydGVkTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBjb250ZW50ID0gbmV3IFRyZWVNYXA8PigoYnl0ZXMxLCBieXRlczIpIC0+IEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoYnl0ZXMxLCBieXRlczIsIFZFUlNJT04pKTsKKyAgICAgICAgQnl0ZUNvbXBhcmFibGVbXVtdIGtleXMgPSBuZXcgQnl0ZUNvbXBhcmFibGVbY291bnRdW107CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVyZ2VDb3VudDsgKytpKQorICAgICAgICAgICAga2V5c1tpXSA9IGdlbmVyYXRlS2V5cyhyYW5kLCBjb3VudCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXJnZUNvdW50OyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlW10gc3JjID0gQXJyYXlzLmNvcHlPZihrZXlzW2ldLCBjb3VudCArIGNvdW50IC8gMTApOworICAgICAgICAgICAgLy8gYWRkIGR1cGxpY2F0ZXMgZnJvbSBvdGhlciB0cmllcworICAgICAgICAgICAgaWYgKG1lcmdlQ291bnQgPiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBjb3VudDsgaiA8IHNyYy5sZW5ndGg7ICsraikKKyAgICAgICAgICAgICAgICAgICAgc3JjW2pdID0ga2V5c1tyYW5kb21CdXROb3QocmFuZCwgbWVyZ2VDb3VudCwgaSldW3JhbmQubmV4dEludChjb3VudCldOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUcmllPEJ5dGVCdWZmZXI+IHRyaWUgPSBtYWtlSW5NZW1vcnlUcmllKGtleXNbaV0sIGNvbnRlbnQsIHRydWUpOworICAgICAgICAgICAgdHJpZXMuYWRkKHRyaWUpOworICAgICAgICB9CisKKyAgICAgICAgVHJpZTxCeXRlQnVmZmVyPiB1bmlvbiA9IFRyaWUubWVyZ2UodHJpZXMsIHggLT4geC5pdGVyYXRvcigpLm5leHQoKSk7CisgICAgICAgIGFzc2VydFNhbWVDb250ZW50KHVuaW9uLCBjb250ZW50KTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgdW5pb24gPSBUcmllLm1lcmdlRGlzdGluY3QodHJpZXMpOworICAgICAgICAgICAgYXNzZXJ0U2FtZUNvbnRlbnQodW5pb24sIGNvbnRlbnQpOworICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIkV4cGVjdGVkIGFzc2VydGlvbiBlcnJvciBmb3IgZHVwbGljYXRlIGtleXMuIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEFzc2VydGlvbkVycm9yIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGNvcnJlY3QgcGF0aAorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgcmFuZG9tQnV0Tm90KFJhbmRvbSByYW5kLCBpbnQgYm91bmQsIGludCBhdm9pZCkKKyAgICB7CisgICAgICAgIGludCByOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICByID0gcmFuZC5uZXh0SW50KGJvdW5kKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAociA9PSBhdm9pZCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWVBcHBseVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWVBcHBseVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjBiN2M0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZUFwcGx5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXM7CisKK3B1YmxpYyBjbGFzcyBJbk1lbW9yeVRyaWVBcHBseVRlc3QgZXh0ZW5kcyBJbk1lbW9yeVRyaWVUZXN0QmFzZQoreworICAgIEBPdmVycmlkZQorICAgIGJvb2xlYW4gdXNlUHV0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllUHV0VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZVB1dFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWIyM2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZVB1dFRlc3QuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllczsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkJ1ZmZlclR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitwdWJsaWMgY2xhc3MgSW5NZW1vcnlUcmllUHV0VGVzdCBleHRlbmRzIEluTWVtb3J5VHJpZVRlc3RCYXNlCit7CisgICAgQE92ZXJyaWRlCisgICAgYm9vbGVhbiB1c2VQdXQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9uZ0tleV9TdGFja092ZXJmbG93KCkgdGhyb3dzIEluTWVtb3J5VHJpZS5TcGFjZUV4aGF1c3RlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgSW5NZW1vcnlUcmllPFN0cmluZz4gdHJpZSA9IG5ldyBJbk1lbW9yeVRyaWU8PihCdWZmZXJUeXBlLk9OX0hFQVApOworICAgICAgICBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oMSk7CisgICAgICAgIGJ5dGVbXSBrZXkgPSBuZXcgYnl0ZVs0MDk2MF07CisgICAgICAgIHJhbmQubmV4dEJ5dGVzKGtleSk7CisgICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gQnl0ZUJ1ZmZlci53cmFwKGtleSk7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHRyaWUucHV0UmVjdXJzaXZlKEJ5dGVDb21wYXJhYmxlLmZpeGVkTGVuZ3RoKGJ1ZiksICJ2YWx1ZSIsICh4LCB5KSAtPiB5KTsKKyAgICAgICAgICAgIEFzc2VydC5mYWlsKCJTdGFja092ZXJmbG93RXJyb3IgZXhwZWN0ZWQgd2l0aCBhIHJlY3Vyc2l2ZSBwdXQgZm9yIHZlcnkgbG9uZyBrZXlzISIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChTdGFja092ZXJmbG93RXJyb3Igc29lKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBFeHBlY3RlZC4KKyAgICAgICAgfQorICAgICAgICAvLyBVc2luZyBub24tcmVjdXJzaXZlIHB1dCBzaG91bGQgd29yay4KKyAgICAgICAgcHV0U2ltcGxlUmVzb2x2ZSh0cmllLCBCeXRlQ29tcGFyYWJsZS5maXhlZExlbmd0aChidWYpLCAidmFsdWUiLCAoeCwgeSkgLT4geSwgZmFsc2UpOworICAgIH0KKworICAgIC8vIFRoaXMgdGVzdHMgdGhhdCB0cmllIHNwYWNlIGFsbG9jYXRpb24gd29ya3MgY29ycmVjdGx5IGNsb3NlIHRvIHRoZSAyRyBsaW1pdC4gSXQgaXMgbm9ybWFsbHkgZGlzYWJsZWQgYmVjYXVzZQorICAgIC8vIHRoZSB0ZXN0IG1hY2hpbmVzIGRvbid0IHByb3ZpZGUgZW5vdWdoIGhlYXAgbWVtb3J5ICh0ZXN0IHJlcXVpcmVzIH44RyBoZWFwIHRvIGZpbmlzaCkuIFJ1biBpdCBtYW51YWxseSB3aGVuCisgICAgLy8gSW5NZW1vcnlUcmllLmFsbG9jYXRlQmxvY2sgaXMgbW9kaWZpZWQuCisgICAgQElnbm9yZQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE92ZXIxR1NpemUoKSB0aHJvd3MgSW5NZW1vcnlUcmllLlNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBJbk1lbW9yeVRyaWU8U3RyaW5nPiB0cmllID0gbmV3IEluTWVtb3J5VHJpZTw+KEJ1ZmZlclR5cGUuT05fSEVBUCk7CisgICAgICAgIHRyaWUuYWR2YW5jZUFsbG9jYXRlZFBvcygweDIwMDAwMDAwKTsKKyAgICAgICAgU3RyaW5nIHQxID0gInRlc3QxIjsKKyAgICAgICAgU3RyaW5nIHQyID0gInRlc3RpbmcyIjsKKyAgICAgICAgU3RyaW5nIHQzID0gIm9uZW1vcmV0ZXN0MyI7CisgICAgICAgIHRyaWUucHV0UmVjdXJzaXZlKEJ5dGVDb21wYXJhYmxlLm9mKHQxKSwgdDEsICh4LCB5KSAtPiB5KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0MSwgdHJpZS5nZXQoQnl0ZUNvbXBhcmFibGUub2YodDEpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnROdWxsKHRyaWUuZ2V0KEJ5dGVDb21wYXJhYmxlLm9mKHQyKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UodHJpZS5yZWFjaGVkQWxsb2NhdGVkU2l6ZVRocmVzaG9sZCgpKTsKKworICAgICAgICB0cmllLmFkdmFuY2VBbGxvY2F0ZWRQb3MoSW5NZW1vcnlUcmllLkFMTE9DQVRFRF9TSVpFX1RIUkVTSE9MRCArIDB4MTAwMCk7CisgICAgICAgIHRyaWUucHV0UmVjdXJzaXZlKEJ5dGVDb21wYXJhYmxlLm9mKHQyKSwgdDIsICh4LCB5KSAtPiB5KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0MSwgdHJpZS5nZXQoQnl0ZUNvbXBhcmFibGUub2YodDEpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModDIsIHRyaWUuZ2V0KEJ5dGVDb21wYXJhYmxlLm9mKHQyKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbCh0cmllLmdldChCeXRlQ29tcGFyYWJsZS5vZih0MykpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodHJpZS5yZWFjaGVkQWxsb2NhdGVkU2l6ZVRocmVzaG9sZCgpKTsKKworICAgICAgICB0cmllLmFkdmFuY2VBbGxvY2F0ZWRQb3MoMHg3RkZGRkVFMCk7ICAvLyBjbG9zZSB0byAyRworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHQxLCB0cmllLmdldChCeXRlQ29tcGFyYWJsZS5vZih0MSkpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0MiwgdHJpZS5nZXQoQnl0ZUNvbXBhcmFibGUub2YodDIpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnROdWxsKHRyaWUuZ2V0KEJ5dGVDb21wYXJhYmxlLm9mKHQzKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0cmllLnJlYWNoZWRBbGxvY2F0ZWRTaXplVGhyZXNob2xkKCkpOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB0cmllLnB1dFJlY3Vyc2l2ZShCeXRlQ29tcGFyYWJsZS5vZih0MyksIHQzLCAoeCwgeSkgLT4geSk7ICAvLyBzaG91bGQgcHV0IGl0IG92ZXIgdGhlIGVkZ2UKKyAgICAgICAgICAgIGZhaWwoIkluTWVtb3J5VHJpZS5TcGFjZUV4aGF1c3RlZEVycm9yIHdhcyBleHBlY3RlZCIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbk1lbW9yeVRyaWUuU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModDEsIHRyaWUuZ2V0KEJ5dGVDb21wYXJhYmxlLm9mKHQxKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHQyLCB0cmllLmdldChCeXRlQ29tcGFyYWJsZS5vZih0MikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwodHJpZS5nZXQoQnl0ZUNvbXBhcmFibGUub2YodDMpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHRyaWUucmVhY2hlZEFsbG9jYXRlZFNpemVUaHJlc2hvbGQoKSk7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHRyaWUuYWR2YW5jZUFsbG9jYXRlZFBvcyhJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgICAgICBmYWlsKCJJbk1lbW9yeVRyaWUuU3BhY2VFeGhhdXN0ZWRFcnJvciB3YXMgZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW5NZW1vcnlUcmllLlNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHQxLCB0cmllLmdldChCeXRlQ29tcGFyYWJsZS5vZih0MSkpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0MiwgdHJpZS5nZXQoQnl0ZUNvbXBhcmFibGUub2YodDIpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnROdWxsKHRyaWUuZ2V0KEJ5dGVDb21wYXJhYmxlLm9mKHQzKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0cmllLnJlYWNoZWRBbGxvY2F0ZWRTaXplVGhyZXNob2xkKCkpOworCisgICAgICAgIHRyaWUuZGlzY2FyZEJ1ZmZlcnMoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllVGVzdEJhc2UuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWVUZXN0QmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYzE3MTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllVGVzdEJhc2UuamF2YQpAQCAtMCwwICsxLDYzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllczsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5IYXNoTXVsdGlzZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aXNldDsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQnVmZmVyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PYmplY3RTaXplczsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEluTWVtb3J5VHJpZVRlc3RCYXNlCit7CisgICAgLy8gU2V0IHRoaXMgdG8gdHJ1ZSAoaW4gY29tYmluYXRpb24gd2l0aCBzbWFsbGVyIGNvdW50KSB0byBkdW1wIHRoZSB0cmllcyB3aGlsZSBkZWJ1Z2dpbmcgYSBwcm9ibGVtLgorICAgIC8vIERvIG5vdCBjb21taXQgdGhlIGNvZGUgd2l0aCBWRVJCT1NFID0gdHJ1ZS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFZFUkJPU0UgPSBmYWxzZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT1VOVCA9IDEwMDAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS0VZX0NIT0lDRSA9IDI1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fTEVOR1RIID0gMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9MRU5HVEggPSA1MDsKKworICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgpOworCisgICAgc3RhdGljIGZpbmFsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gVkVSU0lPTiA9IEluTWVtb3J5VHJpZS5CWVRFX0NPTVBBUkFCTEVfVkVSU0lPTjsKKworICAgIGFic3RyYWN0IGJvb2xlYW4gdXNlUHV0KCk7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGUoKQorICAgIHsKKyAgICAgICAgQnl0ZUNvbXBhcmFibGUgZSA9IEJ5dGVDb21wYXJhYmxlLm9mKCJ0ZXN0Iik7CisgICAgICAgIEluTWVtb3J5VHJpZTxTdHJpbmc+IHRyaWUgPSBuZXcgSW5NZW1vcnlUcmllPD4oQnVmZmVyVHlwZS5PRkZfSEVBUCk7CisgICAgICAgIHB1dFNpbXBsZVJlc29sdmUodHJpZSwgZSwgInRlc3QiLCAoeCwgeSkgLT4geSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJpZSAiICsgdHJpZS5kdW1wKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QiLCB0cmllLmdldChlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCB0cmllLmdldChCeXRlQ29tcGFyYWJsZS5vZigidGVzdGUiKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNwbGl0TXVsdGkoKQorICAgIHsKKyAgICAgICAgdGVzdEVudHJpZXMobmV3IFN0cmluZ1tdIHsgInRlc3RpbmciLCAidGVzdHMiLCAidHJpYWxzIiwgInRyaWFsIiwgImFhYWEiLCAiYWFhYWIiLCAiYWJkZGRkIiwgImFiZWVlZSIgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3BsaXRNdWx0aUJ1ZygpCisgICAgeworICAgICAgICB0ZXN0RW50cmllc0hleChuZXcgU3RyaW5nW10geyAiMGM0MTQzYWVmZiIsICIwYzQxNDNhZTY5ZmYiIH0pOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3BhcnNlMDBidWcoKQorICAgIHsKKyAgICAgICAgU3RyaW5nW10gdGVzdHMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAiNDBiZDI1NmU2ZmQyYWRhZmM0NDAzMzMwMzAwMCIsCisgICAgICAgICI0MGJkZDQ3ZWMwNDM2NDFmMmI0MDMxMzEzMjM0MDAiLAorICAgICAgICAiNDBiZDAwYmY1YWU4Y2Y5ZDFkNDAzMTMzMzIzODAwIiwKKyAgICAgICAgfTsKKyAgICAgICAgSW5NZW1vcnlUcmllPFN0cmluZz4gdHJpZSA9IG5ldyBJbk1lbW9yeVRyaWU8PihCdWZmZXJUeXBlLk9GRl9IRUFQKTsKKyAgICAgICAgZm9yIChTdHJpbmcgdGVzdCA6IHRlc3RzKQorICAgICAgICB7CisgICAgICAgICAgICBCeXRlQ29tcGFyYWJsZSBlID0gQnl0ZUNvbXBhcmFibGUuZml4ZWRMZW5ndGgoQnl0ZUJ1ZmZlclV0aWwuaGV4VG9CeXRlcyh0ZXN0KSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyAiICsgYXNTdHJpbmcoZSkgKyAiOiAiICsgdGVzdCk7CisgICAgICAgICAgICBwdXRTaW1wbGVSZXNvbHZlKHRyaWUsIGUsIHRlc3QsICh4LCB5KSAtPiB5KTsKKyAgICAgICAgfQorCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0cmllLmR1bXAoKSk7CisKKyAgICAgICAgZm9yIChTdHJpbmcgdGVzdCA6IHRlc3RzKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3QsIHRyaWUuZ2V0KEJ5dGVDb21wYXJhYmxlLmZpeGVkTGVuZ3RoKEJ5dGVCdWZmZXJVdGlsLmhleFRvQnl0ZXModGVzdCkpKSk7CisKKyAgICAgICAgQXJyYXlzLnNvcnQodGVzdHMpOworCisgICAgICAgIGludCBpZHggPSAwOworICAgICAgICBmb3IgKFN0cmluZyBzIDogdHJpZS52YWx1ZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHMgIT0gdGVzdHNbaWR4XSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIiIgKyBzICsgIiE9IiArIHRlc3RzW2lkeF0pOworICAgICAgICAgICAgKytpZHg7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RzLmxlbmd0aCwgaWR4KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDb250ZW50KCkKKyAgICB7CisgICAgICAgIFN0cmluZ1tdIHRlc3RzID0gbmV3IFN0cmluZ1tdIHsidGVzdGluZyIsICJ0ZXN0cyIsICJ0cmlhbHMiLCAidHJpYWwiLCAidGVzdGluZyIsICJ0cmlhbCIsICJ0cmlhbCJ9OworICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nW10geyJ0ZXN0aW5nIiwgInRlc3RzIiwgInRyaWFscyIsICJ0cmlhbCIsICJ0MiIsICJ4MiIsICJ5MiJ9OworICAgICAgICBJbk1lbW9yeVRyaWU8U3RyaW5nPiB0cmllID0gbmV3IEluTWVtb3J5VHJpZTw+KEJ1ZmZlclR5cGUuT0ZGX0hFQVApOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RzLmxlbmd0aDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgdGVzdCA9IHRlc3RzW2ldOworICAgICAgICAgICAgU3RyaW5nIHYgPSB2YWx1ZXNbaV07CisgICAgICAgICAgICBCeXRlQ29tcGFyYWJsZSBlID0gQnl0ZUNvbXBhcmFibGUub2YodGVzdCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyAiICsgYXNTdHJpbmcoZSkgKyAiOiAiICsgdik7CisgICAgICAgICAgICBwdXRTaW1wbGVSZXNvbHZlKHRyaWUsIGUsIHYsICh4LCB5KSAtPiAiIiArIHggKyB5KTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJpZSAiICsgdHJpZS5kdW1wKCkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0cy5sZW5ndGg7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHRlc3QgPSB0ZXN0c1tpXTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdHJlYW0uaXRlcmF0ZSgwLCB4IC0+IHggKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5saW1pdCh0ZXN0cy5sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcih4IC0+IHRlc3RzW3hdID09IHRlc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh4IC0+IHZhbHVlc1t4XSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVkdWNlKCIiLCAoeCwgeSkgLT4gIiIgKyB4ICsgeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZS5nZXQoQnl0ZUNvbXBhcmFibGUub2YodGVzdCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBTcGVjU3RhY2tFbnRyeQorICAgIHsKKyAgICAgICAgT2JqZWN0W10gY2hpbGRyZW47CisgICAgICAgIGludCBjdXJDaGlsZDsKKyAgICAgICAgT2JqZWN0IGNvbnRlbnQ7CisgICAgICAgIFNwZWNTdGFja0VudHJ5IHBhcmVudDsKKworICAgICAgICBwdWJsaWMgU3BlY1N0YWNrRW50cnkoT2JqZWN0W10gc3BlYywgT2JqZWN0IGNvbnRlbnQsIFNwZWNTdGFja0VudHJ5IHBhcmVudCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IHNwZWM7CisgICAgICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50OworICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgICAgICB0aGlzLmN1ckNoaWxkID0gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1cnNvckZyb21TcGVjIGltcGxlbWVudHMgVHJpZS5DdXJzb3I8Qnl0ZUJ1ZmZlcj4KKyAgICB7CisgICAgICAgIFNwZWNTdGFja0VudHJ5IHN0YWNrOworICAgICAgICBpbnQgZGVwdGg7CisKKyAgICAgICAgQ3Vyc29yRnJvbVNwZWMoT2JqZWN0W10gc3BlYykKKyAgICAgICAgeworICAgICAgICAgICAgc3RhY2sgPSBuZXcgU3BlY1N0YWNrRW50cnkoc3BlYywgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBkZXB0aCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkdmFuY2UoKQorICAgICAgICB7CisgICAgICAgICAgICBTcGVjU3RhY2tFbnRyeSBjdXJyZW50ID0gc3RhY2s7CisgICAgICAgICAgICB3aGlsZSAoY3VycmVudCAhPSBudWxsICYmICsrY3VycmVudC5jdXJDaGlsZCA+PSBjdXJyZW50LmNoaWxkcmVuLmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7CisgICAgICAgICAgICAgICAgLS1kZXB0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjdXJyZW50ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGRlcHRoID09IC0xOworICAgICAgICAgICAgICAgIHJldHVybiBkZXB0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgT2JqZWN0IGNoaWxkID0gY3VycmVudC5jaGlsZHJlbltjdXJyZW50LmN1ckNoaWxkXTsKKyAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIE9iamVjdFtdKQorICAgICAgICAgICAgICAgIHN0YWNrID0gbmV3IFNwZWNTdGFja0VudHJ5KChPYmplY3RbXSkgY2hpbGQsIG51bGwsIGN1cnJlbnQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0YWNrID0gbmV3IFNwZWNTdGFja0VudHJ5KG5ldyBPYmplY3RbMF0sIGNoaWxkLCBjdXJyZW50KTsKKworICAgICAgICAgICAgcmV0dXJuICsrZGVwdGg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkdmFuY2VNdWx0aXBsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgrK3N0YWNrLmN1ckNoaWxkID49IHN0YWNrLmNoaWxkcmVuLmxlbmd0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2tpcENoaWxkcmVuKCk7CisKKyAgICAgICAgICAgIE9iamVjdCBjaGlsZCA9IHN0YWNrLmNoaWxkcmVuW3N0YWNrLmN1ckNoaWxkXTsKKyAgICAgICAgICAgIHdoaWxlIChjaGlsZCBpbnN0YW5jZW9mIE9iamVjdFtdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YWNrID0gbmV3IFNwZWNTdGFja0VudHJ5KChPYmplY3RbXSkgY2hpbGQsIG51bGwsIHN0YWNrKTsKKyAgICAgICAgICAgICAgICArK2RlcHRoOworICAgICAgICAgICAgICAgIGlmIChzdGFjay5jaGlsZHJlbi5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlcHRoOworICAgICAgICAgICAgICAgIGNoaWxkID0gc3RhY2suY2hpbGRyZW5bMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGFjayA9IG5ldyBTcGVjU3RhY2tFbnRyeShuZXcgT2JqZWN0WzBdLCBjaGlsZCwgc3RhY2spOworCisKKyAgICAgICAgICAgIHJldHVybiArK2RlcHRoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBza2lwQ2hpbGRyZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAtLWRlcHRoOworICAgICAgICAgICAgc3RhY2sgPSBzdGFjay5wYXJlbnQ7CisgICAgICAgICAgICByZXR1cm4gYWR2YW5jZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBkZXB0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZXB0aDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGNvbnRlbnQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKEJ5dGVCdWZmZXIpIHN0YWNrLmNvbnRlbnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGluY29taW5nVHJhbnNpdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNwZWNTdGFja0VudHJ5IHBhcmVudCA9IHN0YWNrLnBhcmVudDsKKyAgICAgICAgICAgIHJldHVybiBwYXJlbnQgIT0gbnVsbCA/IHBhcmVudC5jdXJDaGlsZCArIDB4MzAgOiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBUcmllPEJ5dGVCdWZmZXI+IHNwZWNpZmllZFRyaWUoT2JqZWN0W10gbm9kZURlZikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVHJpZTxCeXRlQnVmZmVyPigpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIEN1cnNvcjxCeXRlQnVmZmVyPiBjdXJzb3IoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ3Vyc29yRnJvbVNwZWMobm9kZURlZik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW50cmllc051bGxDaGlsZEJ1ZygpCisgICAgeworICAgICAgICBPYmplY3RbXSB0cmllRGVmID0gbmV3IE9iamVjdFtdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyAvLyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5ieXRlcygxKSwgLy8gMDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKDIpICAvLyAwMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgcmVxdWVzdENoaWxkIHJldHVybnMgbnVsbCwgYmFkIHRoaW5ncyBjYW4gaGFwcGVuIChEQi0yOTgyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5ieXRlcygzKSwgLy8gMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7ICAvLyAzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5ieXRlcyg0KSwgLy8gMzAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsc28gdHJ5IG51bGwgb24gdGhlIFJlbWFpbmluZy5PTkUgcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvLyAzMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoNSksIC8vIDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbHNvIHRlc3QgcmVxdWVzdFVuaXF1ZURlc2NlbmRhbnQgcmV0dXJuaW5nIG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyAvLyA1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyAvLyA1MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyAvLyA1MDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8vIDUwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoNikgLy8gNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgIFNvcnRlZE1hcDxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gZXhwZWN0ZWQgPSBuZXcgVHJlZU1hcDw+KChieXRlczEsIGJ5dGVzMikgLT4gQnl0ZUNvbXBhcmFibGUuY29tcGFyZShieXRlczEsIGJ5dGVzMiwgVkVSU0lPTikpOworICAgICAgICBleHBlY3RlZC5wdXQoY29tcGFyYWJsZSgiMDAiKSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoMSkpOworICAgICAgICBleHBlY3RlZC5wdXQoY29tcGFyYWJsZSgiMDEiKSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoMikpOworICAgICAgICBleHBlY3RlZC5wdXQoY29tcGFyYWJsZSgiMiIpLCBCeXRlQnVmZmVyVXRpbC5ieXRlcygzKSk7CisgICAgICAgIGV4cGVjdGVkLnB1dChjb21wYXJhYmxlKCIzMCIpLCBCeXRlQnVmZmVyVXRpbC5ieXRlcyg0KSk7CisgICAgICAgIGV4cGVjdGVkLnB1dChjb21wYXJhYmxlKCI0IiksIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKDUpKTsKKyAgICAgICAgZXhwZWN0ZWQucHV0KGNvbXBhcmFibGUoIjYiKSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoNikpOworCisgICAgICAgIFRyaWU8Qnl0ZUJ1ZmZlcj4gdHJpZSA9IHNwZWNpZmllZFRyaWUodHJpZURlZik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0cmllLmR1bXAoKSk7CisgICAgICAgIGFzc2VydFNhbWVDb250ZW50KHRyaWUsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQnl0ZUNvbXBhcmFibGUgY29tcGFyYWJsZShTdHJpbmcgcykKKyAgICB7CisgICAgICAgIEJ5dGVCdWZmZXIgYiA9IEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKHMpOworICAgICAgICByZXR1cm4gQnl0ZUNvbXBhcmFibGUuZml4ZWRMZW5ndGgoYik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlyZWN0KCkKKyAgICB7CisgICAgICAgIEJ5dGVDb21wYXJhYmxlW10gc3JjID0gZ2VuZXJhdGVLZXlzKHJhbmQsIENPVU5UKTsKKyAgICAgICAgU29ydGVkTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBjb250ZW50ID0gbmV3IFRyZWVNYXA8PigoYnl0ZXMxLCBieXRlczIpIC0+IEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoYnl0ZXMxLCBieXRlczIsIFZFUlNJT04pKTsKKyAgICAgICAgSW5NZW1vcnlUcmllPEJ5dGVCdWZmZXI+IHRyaWUgPSBtYWtlSW5NZW1vcnlUcmllKHNyYywgY29udGVudCwgdXNlUHV0KCkpOworICAgICAgICBpbnQga2V5c2l6ZSA9IEFycmF5cy5zdHJlYW0oc3JjKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBUb0ludChzcmMxIC0+IEJ5dGVDb21wYXJhYmxlLmxlbmd0aChzcmMxLCBWRVJTSU9OKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3VtKCk7CisgICAgICAgIGxvbmcgdHMgPSBPYmplY3RTaXplcy5tZWFzdXJlRGVlcChjb250ZW50KTsKKyAgICAgICAgbG9uZyBvbmggPSBPYmplY3RTaXplcy5tZWFzdXJlRGVlcCh0cmllLmNvbnRlbnRBcnJheXMpOworICAgICAgICBTeXN0ZW0ub3V0LmZvcm1hdCgiVHJpZSBzaXplIG9uIGhlYXAgJSxkIG9mZiBoZWFwICUsZCBtZWFzdXJlZCAlLGQga2V5cyAlLGQgdHJlZW1hcCAlLGRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWUuc2l6ZU9uSGVhcCgpLCB0cmllLnNpemVPZmZIZWFwKCksIG9uaCwga2V5c2l6ZSwgdHMpOworICAgICAgICBTeXN0ZW0ub3V0LmZvcm1hdCgicGVyIGVudHJ5IG9uIGhlYXAgJS4yZiBvZmYgaGVhcCAlLjJmIG1lYXN1cmVkICUuMmYga2V5cyAlLjJmIHRyZWVtYXAgJS4yZlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZS5zaXplT25IZWFwKCkgKiAxLjAgLyBDT1VOVCwgdHJpZS5zaXplT2ZmSGVhcCgpICogMS4wIC8gQ09VTlQsIG9uaCAqIDEuMCAvIENPVU5ULCBrZXlzaXplICogMS4wIC8gQ09VTlQsIHRzICogMS4wIC8gQ09VTlQpOworICAgICAgICBpZiAoVkVSQk9TRSkKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJpZSAiICsgdHJpZS5kdW1wKEJ5dGVCdWZmZXJVdGlsOjpieXRlc1RvSGV4KSk7CisKKyAgICAgICAgYXNzZXJ0U2FtZUNvbnRlbnQodHJpZSwgY29udGVudCk7CisgICAgICAgIGNoZWNrR2V0KHRyaWUsIGNvbnRlbnQpOworCisgICAgICAgIHRyaWUuZGlzY2FyZEJ1ZmZlcnMoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVmaXhFdm9sdXRpb24oKQorICAgIHsKKyAgICAgICAgdGVzdEVudHJpZXMobmV3IFN0cmluZ1tdIHsgInRlc3RpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdGVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlc3QgY2hhbmdpbmcgdHlwZSB3aXRoIHByZWZpeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZXMxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGVzMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlczMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZXM0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGVzNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlczYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZXM3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGVzOCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlc3QgYWRkaW5nIHByZWZpeCB0byBjaGFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hhaW4xMjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hhaW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXN0IGFkZGluZyBwcmVmaXggdG8gc3BhcnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGFyc2UxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwYXJzZTIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BhcnNlMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGFyc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXN0IGFkZGluZyBwcmVmaXggdG8gc3BsaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwbGl0MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGxpdDIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BsaXQzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwbGl0NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGxpdDUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BsaXQ2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwbGl0NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGxpdDgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BsaXQiCisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByZWZpeFVuc2FmZU11bHRpKCkKKyAgICB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSBwcmVmaXhlcyBvbiBpbnNpZGUgYSBtdWx0aSBhcmVuJ3Qgb3ZlcndyaXR0ZW4gYnkgZW1iZWRkZWQgbWV0YWRhdGEgbm9kZS4KKworICAgICAgICB0ZXN0RW50cmllcyhuZXcgU3RyaW5nW10geyAidGVzdDg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3Q4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3Q4OSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0ODkwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3Q4OTAxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3Q4OTAxMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0ODkwMTIzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3Q4OTAxMjM0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RFbnRyaWVzKFN0cmluZ1tdIHRlc3RzKQorICAgIHsKKyAgICAgICAgZm9yIChGdW5jdGlvbjxTdHJpbmcsIEJ5dGVDb21wYXJhYmxlPiBtYXBwaW5nIDoKKyAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0LjxGdW5jdGlvbjxTdHJpbmcsIEJ5dGVDb21wYXJhYmxlPj5vZihCeXRlQ29tcGFyYWJsZTo6b2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyAtPiBCeXRlQ29tcGFyYWJsZS5maXhlZExlbmd0aChzLmdldEJ5dGVzKCkpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGVzdEVudHJpZXModGVzdHMsIG1hcHBpbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RFbnRyaWVzSGV4KFN0cmluZ1tdIHRlc3RzKQorICAgIHsKKyAgICAgICAgdGVzdEVudHJpZXModGVzdHMsIHMgLT4gQnl0ZUNvbXBhcmFibGUuZml4ZWRMZW5ndGgoQnl0ZUJ1ZmZlclV0aWwuaGV4VG9CeXRlcyhzKSkpOworICAgICAgICAvLyBSdW4gdGhlIG90aGVyIHRyYW5zbGF0aW9ucyBqdXN0IGluIGNhc2UuCisgICAgICAgIHRlc3RFbnRyaWVzKHRlc3RzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEVudHJpZXMoU3RyaW5nW10gdGVzdHMsIEZ1bmN0aW9uPFN0cmluZywgQnl0ZUNvbXBhcmFibGU+IG1hcHBpbmcpCisKKyAgICB7CisgICAgICAgIEluTWVtb3J5VHJpZTxTdHJpbmc+IHRyaWUgPSBuZXcgSW5NZW1vcnlUcmllPD4oQnVmZmVyVHlwZS5PRkZfSEVBUCk7CisgICAgICAgIGZvciAoU3RyaW5nIHRlc3QgOiB0ZXN0cykKKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUgZSA9IG1hcHBpbmcuYXBwbHkodGVzdCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyAiICsgYXNTdHJpbmcoZSkgKyAiOiAiICsgdGVzdCk7CisgICAgICAgICAgICBwdXRTaW1wbGVSZXNvbHZlKHRyaWUsIGUsIHRlc3QsICh4LCB5KSAtPiB5KTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJpZVxuIiArIHRyaWUuZHVtcCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoU3RyaW5nIHRlc3QgOiB0ZXN0cykKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0LCB0cmllLmdldChtYXBwaW5nLmFwcGx5KHRlc3QpKSk7CisgICAgfQorCisgICAgc3RhdGljIEluTWVtb3J5VHJpZTxCeXRlQnVmZmVyPiBtYWtlSW5NZW1vcnlUcmllKEJ5dGVDb21wYXJhYmxlW10gc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+IGNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlUHV0KQorCisgICAgeworICAgICAgICBJbk1lbW9yeVRyaWU8Qnl0ZUJ1ZmZlcj4gdHJpZSA9IG5ldyBJbk1lbW9yeVRyaWU8PihCdWZmZXJUeXBlLk9GRl9IRUFQKTsKKyAgICAgICAgYWRkVG9Jbk1lbW9yeVRyaWUoc3JjLCBjb250ZW50LCB0cmllLCB1c2VQdXQpOworICAgICAgICByZXR1cm4gdHJpZTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBhZGRUb0luTWVtb3J5VHJpZShCeXRlQ29tcGFyYWJsZVtdIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+IGNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5NZW1vcnlUcmllPEJ5dGVCdWZmZXI+IHRyaWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VQdXQpCisKKyAgICB7CisgICAgICAgIGZvciAoQnl0ZUNvbXBhcmFibGUgYiA6IHNyYykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm90ZTogQmVjYXVzZSB3ZSBkb24ndCBlbnN1cmUgb3JkZXIgd2hlbiBjYWxsaW5nIHJlc29sdmUsIGp1c3QgdXNlIGEgaGFzaCBvZiB0aGUga2V5IGFzIHBheWxvYWQKKyAgICAgICAgICAgIC8vIChzbyB0aGF0IGFsbCBzb3VyY2VzIGhhdmUgdGhlIHNhbWUgdmFsdWUpLgorICAgICAgICAgICAgaW50IHBheWxvYWQgPSBhc1N0cmluZyhiKS5oYXNoQ29kZSgpOworICAgICAgICAgICAgQnl0ZUJ1ZmZlciB2ID0gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMocGF5bG9hZCk7CisgICAgICAgICAgICBjb250ZW50LnB1dChiLCB2KTsKKyAgICAgICAgICAgIGlmIChWRVJCT1NFKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQWRkaW5nICIgKyBhc1N0cmluZyhiKSArICI6ICIgKyBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KHYpKTsKKyAgICAgICAgICAgIHB1dFNpbXBsZVJlc29sdmUodHJpZSwgYiwgdiwgKHgsIHkpIC0+IHksIHVzZVB1dCk7CisgICAgICAgICAgICBpZiAoVkVSQk9TRSkKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odHJpZS5kdW1wKEJ5dGVCdWZmZXJVdGlsOjpieXRlc1RvSGV4KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBjaGVja0dldChJbk1lbW9yeVRyaWU8Qnl0ZUJ1ZmZlcj4gdHJpZSwgTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBpdGVtcykKKyAgICB7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBlbiA6IGl0ZW1zLmVudHJ5U2V0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhlbi5nZXRWYWx1ZSgpLCB0cmllLmdldChlbi5nZXRLZXkoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgYXNzZXJ0U2FtZUNvbnRlbnQoVHJpZTxCeXRlQnVmZmVyPiB0cmllLCBTb3J0ZWRNYXA8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+IG1hcCkKKyAgICB7CisgICAgICAgIGFzc2VydE1hcEVxdWFscyh0cmllLCBtYXApOworICAgICAgICBhc3NlcnRGb3JFYWNoRW50cnlFcXVhbHModHJpZSwgbWFwKTsKKyAgICAgICAgYXNzZXJ0VmFsdWVzRXF1YWwodHJpZSwgbWFwKTsKKyAgICAgICAgYXNzZXJ0Rm9yRWFjaFZhbHVlRXF1YWxzKHRyaWUsIG1hcCk7CisgICAgICAgIGFzc2VydFVub3JkZXJlZFZhbHVlc0VxdWFsKHRyaWUsIG1hcCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRWYWx1ZXNFcXVhbChUcmllPEJ5dGVCdWZmZXI+IHRyaWUsIFNvcnRlZE1hcDxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gbWFwKQorICAgIHsKKyAgICAgICAgYXNzZXJ0SXRlcmFibGVzRXF1YWwodHJpZS52YWx1ZXMoKSwgbWFwLnZhbHVlcygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFVub3JkZXJlZFZhbHVlc0VxdWFsKFRyaWU8Qnl0ZUJ1ZmZlcj4gdHJpZSwgU29ydGVkTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBtYXApCisgICAgeworICAgICAgICBNdWx0aXNldDxCeXRlQnVmZmVyPiB1bm9yZGVyZWQgPSBIYXNoTXVsdGlzZXQuY3JlYXRlKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgZXJyb3JzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChCeXRlQnVmZmVyIGIgOiB0cmllLnZhbHVlc1Vub3JkZXJlZCgpKQorICAgICAgICAgICAgdW5vcmRlcmVkLmFkZChiKTsKKworICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgYiA6IG1hcC52YWx1ZXMoKSkKKyAgICAgICAgICAgIGlmICghdW5vcmRlcmVkLnJlbW92ZShiKSkKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJcbk1pc3NpbmcgdmFsdWUgaW4gdmFsdWVzVW5vcmRlcmVkOiAiICsgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChiKSk7CisKKyAgICAgICAgZm9yIChCeXRlQnVmZmVyIGIgOiB1bm9yZGVyZWQpCisgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJcbkV4dHJhIHZhbHVlIGluIHZhbHVlc1Vub3JkZXJlZDogIiArIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoYikpOworCisgICAgICAgIGFzc2VydEVxdWFscygiIiwgZXJyb3JzLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Rm9yRWFjaEVudHJ5RXF1YWxzKFRyaWU8Qnl0ZUJ1ZmZlcj4gdHJpZSwgU29ydGVkTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBtYXApCisgICAgeworICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+PiBpdCA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgIHRyaWUuZm9yRWFjaEVudHJ5KChrZXksIHZhbHVlKSAtPiB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiTWFwIGV4aGF1c3RlZCBmaXJzdCwga2V5ICIgKyBhc1N0cmluZyhrZXkpLCBpdC5oYXNOZXh0KCkpOworICAgICAgICAgICAgTWFwLkVudHJ5PEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBlbnRyeSA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBCeXRlQ29tcGFyYWJsZS5jb21wYXJlKGVudHJ5LmdldEtleSgpLCBrZXksIFRyaWUuQllURV9DT01QQVJBQkxFX1ZFUlNJT04pKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhlbnRyeS5nZXRWYWx1ZSgpLCB2YWx1ZSk7CisgICAgICAgIH0pOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoIlRyaWUgZXhoYXVzdGVkIGZpcnN0IiwgaXQuaGFzTmV4dCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEZvckVhY2hWYWx1ZUVxdWFscyhUcmllPEJ5dGVCdWZmZXI+IHRyaWUsIFNvcnRlZE1hcDxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gbWFwKQorICAgIHsKKyAgICAgICAgSXRlcmF0b3I8Qnl0ZUJ1ZmZlcj4gaXQgPSBtYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgdHJpZS5mb3JFYWNoVmFsdWUodmFsdWUgLT4geworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIk1hcCBleGhhdXN0ZWQgZmlyc3QsIHZhbHVlICIgKyBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KHZhbHVlKSwgaXQuaGFzTmV4dCgpKTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgZW50cnkgPSBpdC5uZXh0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZW50cnksIHZhbHVlKTsKKyAgICAgICAgfSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgiVHJpZSBleGhhdXN0ZWQgZmlyc3QiLCBpdC5oYXNOZXh0KCkpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGFzc2VydE1hcEVxdWFscyhUcmllPEJ5dGVCdWZmZXI+IHRyaWUsIFNvcnRlZE1hcDxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gbWFwKQorICAgIHsKKyAgICAgICAgYXNzZXJ0TWFwRXF1YWxzKHRyaWUuZW50cnlTZXQoKSwgbWFwLmVudHJ5U2V0KCkpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGFzc2VydE1hcEVxdWFscyhJdGVyYWJsZTxNYXAuRW50cnk8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+PiBjb250YWluZXIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYWJsZTxNYXAuRW50cnk8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+PiBjb250YWluZXIyKQorICAgIHsKKyAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPj4gaXQxID0gY29udGFpbmVyMS5pdGVyYXRvcigpOworICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+PiBpdDIgPSBjb250YWluZXIyLml0ZXJhdG9yKCk7CisgICAgICAgIExpc3Q8Qnl0ZUNvbXBhcmFibGU+IGZhaWxlZEF0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHdoaWxlIChpdDEuaGFzTmV4dCgpICYmIGl0Mi5oYXNOZXh0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1hcC5FbnRyeTxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gZW4xID0gaXQxLm5leHQoKTsKKyAgICAgICAgICAgIE1hcC5FbnRyeTxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gZW4yID0gaXQyLm5leHQoKTsKKyAgICAgICAgICAgIGIuYXBwZW5kKFN0cmluZy5mb3JtYXQoIlRyZWVTZXQgJXM6JXNcbiIsIGFzU3RyaW5nKGVuMi5nZXRLZXkoKSksIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoZW4yLmdldFZhbHVlKCkpKSk7CisgICAgICAgICAgICBiLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJUcmllICAgICVzOiVzXG4iLCBhc1N0cmluZyhlbjEuZ2V0S2V5KCkpLCBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KGVuMS5nZXRWYWx1ZSgpKSkpOworICAgICAgICAgICAgaWYgKEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoZW4xLmdldEtleSgpLCBlbjIuZ2V0S2V5KCksIFZFUlNJT04pICE9IDAgfHwgQnl0ZUJ1ZmZlclV0aWwuY29tcGFyZVVuc2lnbmVkKGVuMS5nZXRWYWx1ZSgpLCBlbjIuZ2V0VmFsdWUoKSkgIT0gMCkKKyAgICAgICAgICAgICAgICBmYWlsZWRBdC5hZGQoZW4xLmdldEtleSgpKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoaXQxLmhhc05leHQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgTWFwLkVudHJ5PEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBlbjEgPSBpdDEubmV4dCgpOworICAgICAgICAgICAgYi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiVHJpZSAgICAlczolc1xuIiwgYXNTdHJpbmcoZW4xLmdldEtleSgpKSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChlbjEuZ2V0VmFsdWUoKSkpKTsKKyAgICAgICAgICAgIGZhaWxlZEF0LmFkZChlbjEuZ2V0S2V5KCkpOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChpdDIuaGFzTmV4dCgpKQorICAgICAgICB7CisgICAgICAgICAgICBNYXAuRW50cnk8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+IGVuMiA9IGl0Mi5uZXh0KCk7CisgICAgICAgICAgICBiLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJUcmVlU2V0ICVzOiVzXG4iLCBhc1N0cmluZyhlbjIuZ2V0S2V5KCkpLCBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KGVuMi5nZXRWYWx1ZSgpKSkpOworICAgICAgICAgICAgZmFpbGVkQXQuYWRkKGVuMi5nZXRLZXkoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmYWlsZWRBdC5pc0VtcHR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkZhaWxlZCBhdCAiICsgTGlzdHMudHJhbnNmb3JtKGZhaWxlZEF0LCBJbk1lbW9yeVRyaWVUZXN0QmFzZTo6YXNTdHJpbmcpOworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGIpOworICAgICAgICAgICAgQXNzZXJ0LmZhaWwobWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPEU+PiB2b2lkIGFzc2VydEl0ZXJhYmxlc0VxdWFsKEl0ZXJhYmxlPEU+IGV4cGVjdGVkSXRlcmFibGUsIEl0ZXJhYmxlPEU+IGFjdHVhbEl0ZXJhYmxlKQorICAgIHsKKyAgICAgICAgSXRlcmF0b3I8RT4gZXhwZWN0ZWQgPSBleHBlY3RlZEl0ZXJhYmxlLml0ZXJhdG9yKCk7CisgICAgICAgIEl0ZXJhdG9yPEU+IGFjdHVhbCA9IGFjdHVhbEl0ZXJhYmxlLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChhY3R1YWwuaGFzTmV4dCgpICYmIGV4cGVjdGVkLmhhc05leHQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhY3R1YWwubmV4dCgpLCBleHBlY3RlZC5uZXh0KCkpOworICAgICAgICB9CisgICAgICAgIGlmIChleHBlY3RlZC5oYXNOZXh0KCkpCisgICAgICAgICAgICBBc3NlcnQuZmFpbCgiUmVtYWluZyB2YWx1ZXMgaW4gZXhwZWN0ZWQsIHN0YXJ0aW5nIHdpdGggIiArIGV4cGVjdGVkLm5leHQoKSk7CisgICAgICAgIGVsc2UgaWYgKGFjdHVhbC5oYXNOZXh0KCkpCisgICAgICAgICAgICBBc3NlcnQuZmFpbCgiUmVtYWluZyB2YWx1ZXMgaW4gYWN0dWFsLCBzdGFydGluZyB3aXRoICIgKyBhY3R1YWwubmV4dCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQnl0ZUNvbXBhcmFibGVbXSBnZW5lcmF0ZUtleXMoUmFuZG9tIHJhbmQsIGludCBjb3VudCkKKyAgICB7CisgICAgICAgIEJ5dGVDb21wYXJhYmxlW10gc291cmNlcyA9IG5ldyBCeXRlQ29tcGFyYWJsZVtjb3VudF07CisgICAgICAgIFRyZWVTZXQ8Qnl0ZUNvbXBhcmFibGU+IGFkZGVkID0gbmV3IFRyZWVTZXQ8PigoYnl0ZXMxLCBieXRlczIpIC0+IEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoYnl0ZXMxLCBieXRlczIsIFZFUlNJT04pKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBzb3VyY2VzW2ldID0gZ2VuZXJhdGVLZXkocmFuZCk7CisgICAgICAgICAgICBpZiAoIWFkZGVkLmFkZChzb3VyY2VzW2ldKSkKKyAgICAgICAgICAgICAgICAtLWk7CisgICAgICAgIH0KKworICAgICAgICAvLyBub3RlOiBub3Qgc29ydGVkIQorICAgICAgICByZXR1cm4gc291cmNlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQnl0ZUNvbXBhcmFibGUgZ2VuZXJhdGVLZXkoUmFuZG9tIHJhbmQpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJhdGVLZXkocmFuZCwgTUlOX0xFTkdUSCwgTUFYX0xFTkdUSCk7CisgICAgfQorCisgICAgc3RhdGljIEJ5dGVDb21wYXJhYmxlIGdlbmVyYXRlS2V5KFJhbmRvbSByYW5kLCBpbnQgbWluTGVuZ3RoLCBpbnQgbWF4TGVuZ3RoKQorICAgIHsKKyAgICAgICAgaW50IGxlbiA9IHJhbmQubmV4dEludChtYXhMZW5ndGggLSBtaW5MZW5ndGggKyAxKSArIG1pbkxlbmd0aDsKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbbGVuXTsKKyAgICAgICAgaW50IHAgPSAwOworICAgICAgICBpbnQgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoOworICAgICAgICB3aGlsZSAocCA8IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHNlZWQgPSByYW5kLm5leHRJbnQoS0VZX0NIT0lDRSk7CisgICAgICAgICAgICBSYW5kb20gcjIgPSBuZXcgUmFuZG9tKHNlZWQpOworICAgICAgICAgICAgaW50IG0gPSByMi5uZXh0SW50KDUpICsgMiArIHA7CisgICAgICAgICAgICBpZiAobSA+IGxlbmd0aCkKKyAgICAgICAgICAgICAgICBtID0gbGVuZ3RoOworICAgICAgICAgICAgd2hpbGUgKHAgPCBtKQorICAgICAgICAgICAgICAgIGJ5dGVzW3ArK10gPSAoYnl0ZSkgcjIubmV4dEludCgyNTYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBCeXRlQ29tcGFyYWJsZS5maXhlZExlbmd0aChieXRlcyk7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBhc1N0cmluZyhCeXRlQ29tcGFyYWJsZSBiYykKKyAgICB7CisgICAgICAgIHJldHVybiBiYyAhPSBudWxsID8gYmMuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhWRVJTSU9OKSA6ICJudWxsIjsKKyAgICB9CisKKyAgICA8VCwgTT4gdm9pZCBwdXRTaW1wbGVSZXNvbHZlKEluTWVtb3J5VHJpZTxUPiB0cmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWUuTWVyZ2VSZXNvbHZlcjxUPiByZXNvbHZlcikKKyAgICB7CisgICAgICAgIHB1dFNpbXBsZVJlc29sdmUodHJpZSwga2V5LCB2YWx1ZSwgcmVzb2x2ZXIsIHVzZVB1dCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgPFQsIE0+IHZvaWQgcHV0U2ltcGxlUmVzb2x2ZShJbk1lbW9yeVRyaWU8VD4gdHJpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQ29tcGFyYWJsZSBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmllLk1lcmdlUmVzb2x2ZXI8VD4gcmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VQdXQpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgdHJpZS5wdXRTaW5nbGV0b24oa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhpc3RpbmcsIHVwZGF0ZSkgLT4gZXhpc3RpbmcgIT0gbnVsbCA/IHJlc29sdmVyLnJlc29sdmUoZXhpc3RpbmcsIHVwZGF0ZSkgOiB1cGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VQdXQpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbk1lbW9yeVRyaWUuU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCBoYXBwZW4sIHRlc3Qgc3RheXMgd2VsbCBiZWxvdyBzaXplIGxpbWl0LgorICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZVRocmVhZGVkVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZVRocmVhZGVkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YjZlZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllVGhyZWFkZWRUZXN0LmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkTG9jYWxSYW5kb207CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQnVmZmVyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllcy5Jbk1lbW9yeVRyaWVUZXN0QmFzZS5WRVJTSU9OOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllcy5Jbk1lbW9yeVRyaWVUZXN0QmFzZS5nZW5lcmF0ZUtleXM7CisKK3B1YmxpYyBjbGFzcyBJbk1lbW9yeVRyaWVUaHJlYWRlZFRlc3QKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlQgPSAzMDAwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9USEVSUyA9IENPVU5UIC8gMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST0dSRVNTX1VQREFURSA9IENPVU5UIC8gMTU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQURFUlMgPSA4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQUxLRVJTID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oKTsKKworICAgIHN0YXRpYyBTdHJpbmcgdmFsdWUoQnl0ZUNvbXBhcmFibGUgYikKKyAgICB7CisgICAgICAgIHJldHVybiBiLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVkVSU0lPTik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGhyZWFkZWQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEJ5dGVDb21wYXJhYmxlW10gc3JjID0gZ2VuZXJhdGVLZXlzKHJhbmQsIENPVU5UICsgT1RIRVJTKTsKKyAgICAgICAgSW5NZW1vcnlUcmllPFN0cmluZz4gdHJpZSA9IG5ldyBJbk1lbW9yeVRyaWU8PihCdWZmZXJUeXBlLk9OX0hFQVApOworICAgICAgICBDb25jdXJyZW50TGlua2VkUXVldWU8VGhyb3dhYmxlPiBlcnJvcnMgPSBuZXcgQ29uY3VycmVudExpbmtlZFF1ZXVlPD4oKTsKKyAgICAgICAgTGlzdDxUaHJlYWQ+IHRocmVhZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgQXRvbWljQm9vbGVhbiB3cml0ZUNvbXBsZXRlZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICAgICAgQXRvbWljSW50ZWdlciB3cml0ZVByb2dyZXNzID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBXQUxLRVJTOyArK2kpCisgICAgICAgICAgICB0aHJlYWRzLmFkZChuZXcgVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICghd3JpdGVDb21wbGV0ZWQuZ2V0KCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW4gPSB3cml0ZVByb2dyZXNzLmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PEJ5dGVDb21wYXJhYmxlLCBTdHJpbmc+IGVuIDogdHJpZS5lbnRyeVNldCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2ID0gdmFsdWUoZW4uZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZW4uZ2V0S2V5KCkuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhWRVJTSU9OKSwgdiwgZW4uZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJHb3Qgb25seSAiICsgY291bnQgKyAiIHdoaWxlIHByb2dyZXNzIGlzIGF0ICIgKyBtaW4sIGNvdW50ID49IG1pbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBSRUFERVJTOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocmVhZHMuYWRkKG5ldyBUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUmFuZG9tIHIgPSBUaHJlYWRMb2NhbFJhbmRvbS5jdXJyZW50KCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICghd3JpdGVDb21wbGV0ZWQuZ2V0KCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW4gPSB3cml0ZVByb2dyZXNzLmdldCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpMSA9IDA7IGkxIDwgUFJPR1JFU1NfVVBEQVRFOyArK2kxKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IHIubmV4dEludChDT1VOVCArIE9USEVSUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUgYiA9IHNyY1tpbmRleF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHYgPSB2YWx1ZShiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdHJpZS5nZXQoYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkdvdCBub3QgYWRkZWQgIiArIGluZGV4ICsgIiB3aGVuIENPVU5UIGlzICIgKyBDT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPCBDT1VOVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkZhaWxlZCAiICsgaW5kZXgsIHYsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGluZGV4IDwgbWluKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCgiRmFpbGVkIGluZGV4ICIgKyBpbmRleCArICIgd2hpbGUgcHJvZ3Jlc3MgaXMgYXQgIiArIG1pbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSk7CisgICAgICAgIH0KKworICAgICAgICB0aHJlYWRzLmFkZChuZXcgVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ09VTlQ7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlIGIgPSBzcmNbaV07CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogQmVjYXVzZSB3ZSBkb24ndCBlbnN1cmUgb3JkZXIgd2hlbiBjYWxsaW5nIHJlc29sdmUsIGp1c3QgdXNlIGEgaGFzaCBvZiB0aGUga2V5IGFzIHBheWxvYWQKKyAgICAgICAgICAgICAgICAgICAgLy8gKHNvIHRoYXQgYWxsIHNvdXJjZXMgaGF2ZSB0aGUgc2FtZSB2YWx1ZSkuCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2ID0gdmFsdWUoYik7CisgICAgICAgICAgICAgICAgICAgIGlmIChpICUgMiA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgdHJpZS5hcHBseShUcmllLnNpbmdsZXRvbihiLCB2KSwgKHgsIHkpIC0+IHkpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB0cmllLnB1dFJlY3Vyc2l2ZShiLCB2LCAoeCwgeSkgLT4geSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgJSBQUk9HUkVTU19VUERBVEUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlUHJvZ3Jlc3Muc2V0KGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd3JpdGVDb21wbGV0ZWQuc2V0KHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9KSk7CisKKyAgICAgICAgZm9yIChUaHJlYWQgdCA6IHRocmVhZHMpCisgICAgICAgICAgICB0LnN0YXJ0KCk7CisKKyAgICAgICAgZm9yIChUaHJlYWQgdCA6IHRocmVhZHMpCisgICAgICAgICAgICB0LmpvaW4oKTsKKworICAgICAgICBpZiAoIWVycm9ycy5pc0VtcHR5KCkpCisgICAgICAgICAgICBBc3NlcnQuZmFpbCgiR290IGVycm9yczpcbiIgKyBlcnJvcnMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9NZXJnZVRyaWVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvTWVyZ2VUcmllVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMDg0MDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvTWVyZ2VUcmllVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXM7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllcy5Jbk1lbW9yeVRyaWVUZXN0QmFzZS4qOworCitwdWJsaWMgY2xhc3MgTWVyZ2VUcmllVGVzdAoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT1VOVCA9IDE1MDAwOworICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlyZWN0KCkKKyAgICB7CisgICAgICAgIEJ5dGVDb21wYXJhYmxlW10gc3JjMSA9IGdlbmVyYXRlS2V5cyhyYW5kLCBDT1VOVCk7CisgICAgICAgIEJ5dGVDb21wYXJhYmxlW10gc3JjMiA9IGdlbmVyYXRlS2V5cyhyYW5kLCBDT1VOVCk7CisgICAgICAgIFNvcnRlZE1hcDxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gY29udGVudDEgPSBuZXcgVHJlZU1hcDw+KChieXRlczEsIGJ5dGVzMikgLT4gQnl0ZUNvbXBhcmFibGUuY29tcGFyZShieXRlczEsIGJ5dGVzMiwgVkVSU0lPTikpOworICAgICAgICBTb3J0ZWRNYXA8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+IGNvbnRlbnQyID0gbmV3IFRyZWVNYXA8PigoYnl0ZXMxLCBieXRlczIpIC0+IEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoYnl0ZXMxLCBieXRlczIsIFZFUlNJT04pKTsKKworICAgICAgICBJbk1lbW9yeVRyaWU8Qnl0ZUJ1ZmZlcj4gdHJpZTEgPSBtYWtlSW5NZW1vcnlUcmllKHNyYzEsIGNvbnRlbnQxLCB0cnVlKTsKKyAgICAgICAgSW5NZW1vcnlUcmllPEJ5dGVCdWZmZXI+IHRyaWUyID0gbWFrZUluTWVtb3J5VHJpZShzcmMyLCBjb250ZW50MiwgdHJ1ZSk7CisKKyAgICAgICAgY29udGVudDEucHV0QWxsKGNvbnRlbnQyKTsKKyAgICAgICAgVHJpZTxCeXRlQnVmZmVyPiB1bmlvbiA9IHRyaWUxLm1lcmdlV2l0aCh0cmllMiwgKHgsIHkpIC0+IHgpOworCisgICAgICAgIGFzc2VydFNhbWVDb250ZW50KHVuaW9uLCBjb250ZW50MSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aER1cGxpY2F0ZXMoKQorICAgIHsKKyAgICAgICAgQnl0ZUNvbXBhcmFibGVbXSBzcmMxID0gZ2VuZXJhdGVLZXlzKHJhbmQsIENPVU5UKTsKKyAgICAgICAgQnl0ZUNvbXBhcmFibGVbXSBzcmMyID0gZ2VuZXJhdGVLZXlzKHJhbmQsIENPVU5UKTsKKyAgICAgICAgU29ydGVkTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBjb250ZW50MSA9IG5ldyBUcmVlTWFwPD4oKGJ5dGVzMSwgYnl0ZXMyKSAtPiBCeXRlQ29tcGFyYWJsZS5jb21wYXJlKGJ5dGVzMSwgYnl0ZXMyLCBWRVJTSU9OKSk7CisgICAgICAgIFNvcnRlZE1hcDxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gY29udGVudDIgPSBuZXcgVHJlZU1hcDw+KChieXRlczEsIGJ5dGVzMikgLT4gQnl0ZUNvbXBhcmFibGUuY29tcGFyZShieXRlczEsIGJ5dGVzMiwgVkVSU0lPTikpOworCisgICAgICAgIEluTWVtb3J5VHJpZTxCeXRlQnVmZmVyPiB0cmllMSA9IG1ha2VJbk1lbW9yeVRyaWUoc3JjMSwgY29udGVudDEsIHRydWUpOworICAgICAgICBJbk1lbW9yeVRyaWU8Qnl0ZUJ1ZmZlcj4gdHJpZTIgPSBtYWtlSW5NZW1vcnlUcmllKHNyYzIsIGNvbnRlbnQyLCB0cnVlKTsKKworICAgICAgICBhZGRUb0luTWVtb3J5VHJpZShnZW5lcmF0ZUtleXMobmV3IFJhbmRvbSg1KSwgQ09VTlQpLCBjb250ZW50MSwgdHJpZTEsIHRydWUpOworICAgICAgICBhZGRUb0luTWVtb3J5VHJpZShnZW5lcmF0ZUtleXMobmV3IFJhbmRvbSg1KSwgQ09VTlQpLCBjb250ZW50MiwgdHJpZTIsIHRydWUpOworCisgICAgICAgIGNvbnRlbnQxLnB1dEFsbChjb250ZW50Mik7CisgICAgICAgIFRyaWU8Qnl0ZUJ1ZmZlcj4gdW5pb24gPSB0cmllMS5tZXJnZVdpdGgodHJpZTIsICh4LCB5KSAtPiB5KTsKKworICAgICAgICBhc3NlcnRTYW1lQ29udGVudCh1bmlvbiwgY29udGVudDEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpc3RpbmN0KCkKKyAgICB7CisgICAgICAgIEJ5dGVDb21wYXJhYmxlW10gc3JjMSA9IGdlbmVyYXRlS2V5cyhyYW5kLCBDT1VOVCk7CisgICAgICAgIFNvcnRlZE1hcDxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gY29udGVudDEgPSBuZXcgVHJlZU1hcDw+KChieXRlczEsIGJ5dGVzMikgLT4gQnl0ZUNvbXBhcmFibGUuY29tcGFyZShieXRlczEsIGJ5dGVzMiwgVkVSU0lPTikpOworICAgICAgICBJbk1lbW9yeVRyaWU8Qnl0ZUJ1ZmZlcj4gdHJpZTEgPSBtYWtlSW5NZW1vcnlUcmllKHNyYzEsIGNvbnRlbnQxLCB0cnVlKTsKKworICAgICAgICBCeXRlQ29tcGFyYWJsZVtdIHNyYzIgPSBnZW5lcmF0ZUtleXMocmFuZCwgQ09VTlQpOworICAgICAgICBzcmMyID0gcmVtb3ZlRHVwbGljYXRlcyhzcmMyLCBjb250ZW50MSk7CisgICAgICAgIFNvcnRlZE1hcDxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gY29udGVudDIgPSBuZXcgVHJlZU1hcDw+KChieXRlczEsIGJ5dGVzMikgLT4gQnl0ZUNvbXBhcmFibGUuY29tcGFyZShieXRlczEsIGJ5dGVzMiwgVkVSU0lPTikpOworICAgICAgICBJbk1lbW9yeVRyaWU8Qnl0ZUJ1ZmZlcj4gdHJpZTIgPSBtYWtlSW5NZW1vcnlUcmllKHNyYzIsIGNvbnRlbnQyLCB0cnVlKTsKKworICAgICAgICBjb250ZW50MS5wdXRBbGwoY29udGVudDIpOworICAgICAgICBUcmllPEJ5dGVCdWZmZXI+IHVuaW9uID0gbmV3IE1lcmdlVHJpZS5EaXN0aW5jdDw+KHRyaWUxLCB0cmllMik7CisKKyAgICAgICAgYXNzZXJ0U2FtZUNvbnRlbnQodW5pb24sIGNvbnRlbnQxKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQnl0ZUNvbXBhcmFibGVbXSByZW1vdmVEdXBsaWNhdGVzKEJ5dGVDb21wYXJhYmxlW10ga2V5cywgU29ydGVkTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBjb250ZW50MSkKKyAgICB7CisgICAgICAgIHJldHVybiBBcnJheXMuc3RyZWFtKGtleXMpCisgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGtleSAtPiAhY29udGVudDEuY29udGFpbnNLZXkoa2V5KSkKKyAgICAgICAgICAgICAgICAgICAgIC50b0FycmF5KEJ5dGVDb21wYXJhYmxlW106Om5ldyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1NsaWNlZFRyaWVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvU2xpY2VkVHJpZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2JhZTBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1NsaWNlZFRyaWVUZXN0LmphdmEKQEAgLTAsMCArMSw1MjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXM7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk5hdmlnYWJsZU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgY29tLmdvb2dsZWNvZGUuY29uY3VycmVudHRyZWVzLmNvbW1vbi5JdGVyYWJsZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXMuSW5NZW1vcnlUcmllVGVzdEJhc2UuYXNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzLkluTWVtb3J5VHJpZVRlc3RCYXNlLmFzc2VydFNhbWVDb250ZW50OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllcy5Jbk1lbW9yeVRyaWVUZXN0QmFzZS5nZW5lcmF0ZUtleXM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzLkluTWVtb3J5VHJpZVRlc3RCYXNlLm1ha2VJbk1lbW9yeVRyaWU7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5BcnJheXMuYXNMaXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIFNsaWNlZFRyaWVUZXN0Cit7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCeXRlQ29tcGFyYWJsZVtdIEJPVU5EQVJJRVMgPSB0b0J5dGVDb21wYXJhYmxlKG5ldyBTdHJpbmdbXXsKKyAgICAidGVzdDEiLAorICAgICJ0ZXN0MTEiLAorICAgICJ0ZXN0MTIiLAorICAgICJ0ZXN0MTMiLAorICAgICJ0ZXN0MiIsCisgICAgInRlc3QyMSIsCisgICAgInRlIiwKKyAgICAicyIsCisgICAgInEiLAorICAgICJcMDAwIiwKKyAgICAiXDc3NyIsCisgICAgIlw3NzdcMDAwIiwKKyAgICAiXDAwMFw3NzciLAorICAgICJcMDAwXDAwMCIsCisgICAgIlwwMDBcMDAwXDAwMCIsCisgICAgIlwwMDBcMDAwXDc3NyIsCisgICAgIlw3NzdcNzc3IgorICAgIH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQnl0ZUNvbXBhcmFibGVbXSBLRVlTID0gdG9CeXRlQ29tcGFyYWJsZShuZXcgU3RyaW5nW117CisgICAgInRlc3QxIiwKKyAgICAidGVzdDIiLAorICAgICJ0ZXN0NTUiLAorICAgICJ0ZXN0MTIzIiwKKyAgICAidGVzdDEyNCIsCisgICAgInRlc3QxMiIsCisgICAgInRlc3QyMSIsCisgICAgInRlYXNlIiwKKyAgICAic29ydCIsCisgICAgInNvcnRpbmciLAorICAgICJzcXVhcmUiLAorICAgICJcNzc3XDAwMCIsCisgICAgIlwwMDBcNzc3IiwKKyAgICAiXDAwMFwwMDAiLAorICAgICJcMDAwXDAwMFwwMDAiLAorICAgICJcMDAwXDAwMFw3NzciLAorICAgICJcNzc3XDc3NyIKKyAgICB9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8Qnl0ZUNvbXBhcmFibGU+IEJZVEVfQ09NUEFSQUJMRV9DT01QQVJBVE9SID0gKGJ5dGVzMSwgYnl0ZXMyKSAtPiBCeXRlQ29tcGFyYWJsZS5jb21wYXJlKGJ5dGVzMSwgYnl0ZXMyLCBUcmllLkJZVEVfQ09NUEFSQUJMRV9WRVJTSU9OKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlQgPSAxNTAwMDsKKyAgICBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludGVyc2VjdFJhbmdlRGlyZWN0KCkKKyAgICB7CisgICAgICAgIHRlc3RJbnRlcnNlY3RSYW5nZShDT1VOVCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEludGVyc2VjdFJhbmdlKGludCBjb3VudCkKKyAgICB7CisgICAgICAgIEJ5dGVDb21wYXJhYmxlW10gc3JjMSA9IGdlbmVyYXRlS2V5cyhyYW5kLCBjb3VudCk7CisgICAgICAgIE5hdmlnYWJsZU1hcDxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gY29udGVudDEgPSBuZXcgVHJlZU1hcDw+KChieXRlczEsIGJ5dGVzMikgLT4gQnl0ZUNvbXBhcmFibGUuY29tcGFyZShieXRlczEsIGJ5dGVzMiwgVHJpZS5CWVRFX0NPTVBBUkFCTEVfVkVSU0lPTikpOworCisgICAgICAgIEluTWVtb3J5VHJpZTxCeXRlQnVmZmVyPiB0cmllMSA9IG1ha2VJbk1lbW9yeVRyaWUoc3JjMSwgY29udGVudDEsIHRydWUpOworCisgICAgICAgIGNoZWNrRXF1YWxSYW5nZShjb250ZW50MSwgdHJpZTEsIG51bGwsIHRydWUsIG51bGwsIHRydWUpOworICAgICAgICBjaGVja0VxdWFsUmFuZ2UoY29udGVudDEsIHRyaWUxLCBJbk1lbW9yeVRyaWVUZXN0QmFzZS5nZW5lcmF0ZUtleShyYW5kKSwgdHJ1ZSwgbnVsbCwgdHJ1ZSk7CisgICAgICAgIGNoZWNrRXF1YWxSYW5nZShjb250ZW50MSwgdHJpZTEsIG51bGwsIHRydWUsIEluTWVtb3J5VHJpZVRlc3RCYXNlLmdlbmVyYXRlS2V5KHJhbmQpLCB0cnVlKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlIGwgPSByYW5kLm5leHRCb29sZWFuKCkgPyBJbk1lbW9yeVRyaWVUZXN0QmFzZS5nZW5lcmF0ZUtleShyYW5kKSA6IHNyYzFbcmFuZC5uZXh0SW50KHNyYzEubGVuZ3RoKV07CisgICAgICAgICAgICBCeXRlQ29tcGFyYWJsZSByID0gcmFuZC5uZXh0Qm9vbGVhbigpID8gSW5NZW1vcnlUcmllVGVzdEJhc2UuZ2VuZXJhdGVLZXkocmFuZCkgOiBzcmMxW3JhbmQubmV4dEludChzcmMxLmxlbmd0aCldOworICAgICAgICAgICAgaW50IGNtcCA9IEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUobCwgciwgVHJpZS5CWVRFX0NPTVBBUkFCTEVfVkVSU0lPTik7CisgICAgICAgICAgICBpZiAoY21wID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCeXRlQ29tcGFyYWJsZSB0ID0gbDsKKyAgICAgICAgICAgICAgICBsID0gcjsKKyAgICAgICAgICAgICAgICByID0gdDsgLy8gc3dhcAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sZWFuIGluY2x1ZGVMZWZ0ID0gKGkgJiAxKSAhPSAwIHx8IGNtcCA9PSAwOworICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlUmlnaHQgPSAoaSAmIDIpICE9IDAgfHwgY21wID09IDA7CisgICAgICAgICAgICBjaGVja0VxdWFsUmFuZ2UoY29udGVudDEsIHRyaWUxLCBsLCBpbmNsdWRlTGVmdCwgciwgaW5jbHVkZVJpZ2h0KTsKKyAgICAgICAgICAgIGNoZWNrRXF1YWxSYW5nZShjb250ZW50MSwgdHJpZTEsIG51bGwsIGluY2x1ZGVMZWZ0LCByLCBpbmNsdWRlUmlnaHQpOworICAgICAgICAgICAgY2hlY2tFcXVhbFJhbmdlKGNvbnRlbnQxLCB0cmllMSwgbCwgaW5jbHVkZUxlZnQsIG51bGwsIGluY2x1ZGVSaWdodCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBCeXRlQ29tcGFyYWJsZVtdIHRvQnl0ZUNvbXBhcmFibGUoU3RyaW5nW10ga2V5cykKKyAgICB7CisgICAgICAgIHJldHVybiBBcnJheXMuc3RyZWFtKGtleXMpCisgICAgICAgICAgICAgICAgICAgICAubWFwKHggLT4gQnl0ZUNvbXBhcmFibGUuZml4ZWRMZW5ndGgoeC5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSkpCisgICAgICAgICAgICAgICAgICAgICAudG9BcnJheShCeXRlQ29tcGFyYWJsZVtdOjpuZXcpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvblN1YnRyaWUoKQorICAgIHsKKyAgICAgICAgQXJyYXlzLnNvcnQoQk9VTkRBUklFUywgKGEsIGIpIC0+IEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoYSwgYiwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5PU1M1MCkpOworICAgICAgICBmb3IgKGludCBsaSA9IC0xOyBsaSA8IEJPVU5EQVJJRVMubGVuZ3RoOyArK2xpKQorICAgICAgICB7CisgICAgICAgICAgICBCeXRlQ29tcGFyYWJsZSBsID0gbGkgPCAwID8gbnVsbCA6IEJPVU5EQVJJRVNbbGldOworICAgICAgICAgICAgZm9yIChpbnQgcmkgPSBNYXRoLm1heCgwLCBsaSk7IHJpIDw9IEJPVU5EQVJJRVMubGVuZ3RoOyArK3JpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlIHIgPSByaSA9PSBCT1VOREFSSUVTLmxlbmd0aCA/IG51bGwgOiBCT1VOREFSSUVTW3JpXTsKKworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBsaSA9PSByaSA/IDMgOiAwOyBpIDwgNDsgKytpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlTGVmdCA9IChpICYgMSkgIT0gMDsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlUmlnaHQgPSAoaSAmIDIpICE9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChCeXRlQ29tcGFyYWJsZSBrZXkgOiBLRVlTKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY21wMSA9IGwgIT0gbnVsbCA/IEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoa2V5LCBsLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwKSA6IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY21wMiA9IHIgIT0gbnVsbCA/IEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUociwga2V5LCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwKSA6IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBUcmllPEJvb2xlYW4+IGl4ID0gbmV3IFNsaWNlZFRyaWU8PihUcmllLnNpbmdsZXRvbihrZXksIHRydWUpLCBsLCBpbmNsdWRlTGVmdCwgciwgaW5jbHVkZVJpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNtcDEgPCAwIHx8IGNtcDEgPT0gMCAmJiAhaW5jbHVkZUxlZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbXAyIDwgMCB8fCBjbXAyID09IDAgJiYgIWluY2x1ZGVSaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhY3R1YWwgPSBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlcy5nZXRGaXJzdChpeC52YWx1ZXMoKSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkICE9IGFjdHVhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkludGVyc2VjdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihpeC5kdW1wKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKFN0cmluZy5mb3JtYXQoIkZhaWxlZCBvbiByYW5nZSAlcyVzLCVzJXMga2V5ICVzIGV4cGVjdGVkICVzIGdvdCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVMZWZ0ID8gIlsiIDogIigiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCAhPSBudWxsID8gbC5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKEJ5dGVDb21wYXJhYmxlLlZlcnNpb24uT1NTNTApIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgIT0gbnVsbCA/IHIuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwKSA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUmlnaHQgPyAiXSIgOiAiKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZW10YWJsZVN1YnRyaWUoKQorICAgIHsKKyAgICAgICAgQXJyYXlzLnNvcnQoQk9VTkRBUklFUywgQllURV9DT01QQVJBQkxFX0NPTVBBUkFUT1IpOworICAgICAgICBOYXZpZ2FibGVNYXA8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+IGNvbnRlbnQxID0gbmV3IFRyZWVNYXA8PihCWVRFX0NPTVBBUkFCTEVfQ09NUEFSQVRPUik7CisgICAgICAgIEluTWVtb3J5VHJpZTxCeXRlQnVmZmVyPiB0cmllMSA9IG1ha2VJbk1lbW9yeVRyaWUoS0VZUywgY29udGVudDEsIHRydWUpOworCisgICAgICAgIGZvciAoaW50IGxpID0gLTE7IGxpIDwgQk9VTkRBUklFUy5sZW5ndGg7ICsrbGkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlIGwgPSBsaSA8IDAgPyBudWxsIDogQk9VTkRBUklFU1tsaV07CisgICAgICAgICAgICBmb3IgKGludCByaSA9IE1hdGgubWF4KDAsIGxpKTsgcmkgPD0gQk9VTkRBUklFUy5sZW5ndGg7ICsrcmkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUgciA9IHJpID09IEJPVU5EQVJJRVMubGVuZ3RoID8gbnVsbCA6IEJPVU5EQVJJRVNbcmldOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlTGVmdCA9IChpICYgMSkgIT0gMDsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlUmlnaHQgPSAoaSAmIDIpICE9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmICgoIWluY2x1ZGVMZWZ0IHx8ICFpbmNsdWRlUmlnaHQpICYmIGxpID09IHJpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrRXF1YWxSYW5nZShjb250ZW50MSwgdHJpZTEsIGwsIGluY2x1ZGVMZWZ0LCByLCBpbmNsdWRlUmlnaHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lcmdlU3VidHJpZSgpCisgICAgeworICAgICAgICB0ZXN0TWVyZ2VTdWJ0cmllKDIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25NZXJnZVN1YnRyaWUzKCkKKyAgICB7CisgICAgICAgIHRlc3RNZXJnZVN1YnRyaWUoMyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbk1lcmdlU3VidHJpZTUoKQorICAgIHsKKyAgICAgICAgdGVzdE1lcmdlU3VidHJpZSg1KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VTdWJ0cmllKGludCBtZXJnZUNvdW50KQorICAgIHsKKyAgICAgICAgQXJyYXlzLnNvcnQoQk9VTkRBUklFUywgQllURV9DT01QQVJBQkxFX0NPTVBBUkFUT1IpOworICAgICAgICBOYXZpZ2FibGVNYXA8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+IGNvbnRlbnQxID0gbmV3IFRyZWVNYXA8PihCWVRFX0NPTVBBUkFCTEVfQ09NUEFSQVRPUik7CisgICAgICAgIExpc3Q8VHJpZTxCeXRlQnVmZmVyPj4gdHJpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXJnZUNvdW50OyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyaWVzLmFkZChtYWtlSW5NZW1vcnlUcmllKEFycmF5cy5jb3B5T2ZSYW5nZShLRVlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlTLmxlbmd0aCAqIGkgLyBtZXJnZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlTLmxlbmd0aCAqIChpICsgMSkgLyBtZXJnZUNvdW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKSk7CisgICAgICAgIH0KKyAgICAgICAgVHJpZTxCeXRlQnVmZmVyPiB0cmllMSA9IFRyaWUubWVyZ2VEaXN0aW5jdCh0cmllcyk7CisKKyAgICAgICAgZm9yIChpbnQgbGkgPSAtMTsgbGkgPCBCT1VOREFSSUVTLmxlbmd0aDsgKytsaSkKKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUgbCA9IGxpIDwgMCA/IG51bGwgOiBCT1VOREFSSUVTW2xpXTsKKyAgICAgICAgICAgIGZvciAoaW50IHJpID0gTWF0aC5tYXgoMCwgbGkpOyByaSA8PSBCT1VOREFSSUVTLmxlbmd0aDsgKytyaSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCeXRlQ29tcGFyYWJsZSByID0gcmkgPT0gQk9VTkRBUklFUy5sZW5ndGggPyBudWxsIDogQk9VTkRBUklFU1tyaV07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluY2x1ZGVMZWZ0ID0gKGkgJiAxKSAhPSAwOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluY2x1ZGVSaWdodCA9IChpICYgMikgIT0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCghaW5jbHVkZUxlZnQgfHwgIWluY2x1ZGVSaWdodCkgJiYgbGkgPT0gcmkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tFcXVhbFJhbmdlKGNvbnRlbnQxLCB0cmllMSwgbCwgaW5jbHVkZUxlZnQsIHIsIGluY2x1ZGVSaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2hlY2tFcXVhbFJhbmdlKE5hdmlnYWJsZU1hcDxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gY29udGVudDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWU8Qnl0ZUJ1ZmZlcj4gdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlIGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkZUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkZVJpZ2h0KQorICAgIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIkludGVyc2VjdGlvbiB3aXRoICVzJXM6JXMlcyIsIGluY2x1ZGVMZWZ0ID8gIlsiIDogIigiLCBhc1N0cmluZyhsKSwgYXNTdHJpbmcociksIGluY2x1ZGVSaWdodCA/ICJdIiA6ICIpIikpOworICAgICAgICBTb3J0ZWRNYXA8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+IGltYXAgPSBsID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyByID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbnRlbnQxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb250ZW50MS5oZWFkTWFwKHIsIGluY2x1ZGVSaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbnRlbnQxLnRhaWxNYXAobCwgaW5jbHVkZUxlZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb250ZW50MS5zdWJNYXAobCwgaW5jbHVkZUxlZnQsIHIsIGluY2x1ZGVSaWdodCk7CisKKyAgICAgICAgVHJpZTxCeXRlQnVmZmVyPiBpbnRlcnNlY3Rpb24gPSB0MS5zdWJ0cmllKGwsIGluY2x1ZGVMZWZ0LCByLCBpbmNsdWRlUmlnaHQpOworICAgICAgICBhc3NlcnRTYW1lQ29udGVudChpbnRlcnNlY3Rpb24sIGltYXApOworCisgICAgICAgIGlmIChsID09IG51bGwgfHwgciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIFRlc3QgaW50ZXJzZWN0aW5nIGludGVyc2VjdGlvbi4KKyAgICAgICAgaW50ZXJzZWN0aW9uID0gdDEuc3VidHJpZShsLCBpbmNsdWRlTGVmdCwgbnVsbCwgZmFsc2UpLnN1YnRyaWUobnVsbCwgZmFsc2UsIHIsIGluY2x1ZGVSaWdodCk7CisgICAgICAgIGFzc2VydFNhbWVDb250ZW50KGludGVyc2VjdGlvbiwgaW1hcCk7CisKKyAgICAgICAgaW50ZXJzZWN0aW9uID0gdDEuc3VidHJpZShudWxsLCBmYWxzZSwgciwgaW5jbHVkZVJpZ2h0KS5zdWJ0cmllKGwsIGluY2x1ZGVMZWZ0LCBudWxsLCBmYWxzZSk7CisgICAgICAgIGFzc2VydFNhbWVDb250ZW50KGludGVyc2VjdGlvbiwgaW1hcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmFjdCB0aGUgdmFsdWVzIG9mIHRoZSBwcm92aWRlIHRyaWUgaW50byBhIGxpc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IExpc3Q8VD4gdG9MaXN0KFRyaWU8VD4gdHJpZSkKKyAgICB7CisgICAgICAgIHJldHVybiBJdGVyYWJsZXMudG9MaXN0KHRyaWUudmFsdWVzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBzaW1wbGUgdHJpZSB3aXRoIGEgcm9vdCBoYXZpbmcgdGhlIHByb3ZpZGVkIG51bWJlciBvZiBjaGlsZHMsIHdoZXJlIGVhY2ggY2hpbGQgaXMgYSBsZWFmIHdob3NlIGNvbnRlbnQKKyAgICAgKiBpcyBzaW1wbHkgdGhlIHZhbHVlIG9mIHRoZSB0cmFuc2l0aW9uIGxlYWRpbmcgdG8gaXQuCisgICAgICoKKyAgICAgKiBJbiBvdGhlciB3b3Jkcywge0Bjb2RlIHNpbmdsZUxldmVsSW50VHJpZSg0KX0gY3JlYXRlcyB0aGUgZm9sbG93aW5nIHRyaWU6CisgICAgICogICAgICAgUm9vdAorICAgICAqIHQ9IDAgIDEgIDIgIDMKKyAgICAgKiAgICB8ICB8ICB8ICB8CisgICAgICogICAgMCAgMSAgMiAgMworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFRyaWU8SW50ZWdlcj4gc2luZ2xlTGV2ZWxJbnRUcmllKGludCBjaGlsZHMpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFRyaWU8SW50ZWdlcj4oKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBDdXJzb3I8SW50ZWdlcj4gY3Vyc29yKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHNpbmdsZUxldmVsQ3Vyc29yKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsYXNzIHNpbmdsZUxldmVsQ3Vyc29yIGltcGxlbWVudHMgQ3Vyc29yPEludGVnZXI+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGN1cnJlbnQgPSAtMTsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgYWR2YW5jZSgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICArK2N1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXB0aCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgc2tpcENoaWxkcmVuKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZHZhbmNlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCBkZXB0aCgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudCA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudCA8IGNoaWxkcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCBpbmNvbWluZ1RyYW5zaXRpb24oKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIEludGVnZXIgY29udGVudCgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqIENyZWF0ZXMgYSBzaW5nbGUgYnl0ZSB7QGxpbmsgQnl0ZUNvbXBhcmFibGV9IHdpdGggdGhlIHByb3ZpZGUgdmFsdWUgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBCeXRlQ29tcGFyYWJsZSBvZihpbnQgdmFsdWUpCisgICAgeworICAgICAgICBhc3NlcnQgdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSBCeXRlLk1BWF9WQUxVRTsKKyAgICAgICAgcmV0dXJuIEJ5dGVDb21wYXJhYmxlLmZpeGVkTGVuZ3RoKG5ldyBieXRlW117IChieXRlKXZhbHVlIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZUludGVyc2VjdGlvbklJKCkKKyAgICB7CisgICAgICAgIFRyaWU8SW50ZWdlcj4gdHJpZSA9IHNpbmdsZUxldmVsSW50VHJpZSgxMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpLCB0b0xpc3QodHJpZSkpOworCisgICAgICAgIFRyaWU8SW50ZWdlcj4gaW50ZXJzZWN0aW9uID0gdHJpZS5zdWJ0cmllKG9mKDMpLCB0cnVlLCBvZig3KSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMywgNCwgNSwgNiwgNyksIHRvTGlzdChpbnRlcnNlY3Rpb24pKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVJbnRlcnNlY3Rpb25FSSgpCisgICAgeworICAgICAgICBUcmllPEludGVnZXI+IHRyaWUgPSBzaW5nbGVMZXZlbEludFRyaWUoMTApOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5KSwgdG9MaXN0KHRyaWUpKTsKKworICAgICAgICBUcmllPEludGVnZXI+IGludGVyc2VjdGlvbiA9IHRyaWUuc3VidHJpZShvZigzKSwgZmFsc2UsIG9mKDcpLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCg0LCA1LCA2LCA3KSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZUludGVyc2VjdGlvbklFKCkKKyAgICB7CisgICAgICAgIFRyaWU8SW50ZWdlcj4gdHJpZSA9IHNpbmdsZUxldmVsSW50VHJpZSgxMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpLCB0b0xpc3QodHJpZSkpOworCisgICAgICAgIFRyaWU8SW50ZWdlcj4gaW50ZXJzZWN0aW9uID0gdHJpZS5zdWJ0cmllKG9mKDMpLCB0cnVlLCBvZig3KSwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KDMsIDQsIDUsIDYpLCB0b0xpc3QoaW50ZXJzZWN0aW9uKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlSW50ZXJzZWN0aW9uRUUoKQorICAgIHsKKyAgICAgICAgVHJpZTxJbnRlZ2VyPiB0cmllID0gc2luZ2xlTGV2ZWxJbnRUcmllKDEwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSksIHRvTGlzdCh0cmllKSk7CisKKyAgICAgICAgVHJpZTxJbnRlZ2VyPiBpbnRlcnNlY3Rpb24gPSB0cmllLnN1YnRyaWUob2YoMyksIGZhbHNlLCBvZig3KSwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KDQsIDUsIDYpLCB0b0xpc3QoaW50ZXJzZWN0aW9uKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlTGVmdEludGVyc2VjdGlvbkUoKQorICAgIHsKKyAgICAgICAgVHJpZTxJbnRlZ2VyPiB0cmllID0gc2luZ2xlTGV2ZWxJbnRUcmllKDEwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSksIHRvTGlzdCh0cmllKSk7CisKKyAgICAgICAgVHJpZTxJbnRlZ2VyPiBpbnRlcnNlY3Rpb24gPSB0cmllLnN1YnRyaWUob2YoMyksIGZhbHNlLCBudWxsLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCg0LCA1LCA2LCA3LCA4LCA5KSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZUxlZnRJbnRlcnNlY3Rpb25JKCkKKyAgICB7CisgICAgICAgIFRyaWU8SW50ZWdlcj4gdHJpZSA9IHNpbmdsZUxldmVsSW50VHJpZSgxMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpLCB0b0xpc3QodHJpZSkpOworCisgICAgICAgIFRyaWU8SW50ZWdlcj4gaW50ZXJzZWN0aW9uID0gdHJpZS5zdWJ0cmllKG9mKDMpLCB0cnVlLCBudWxsLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgzLCA0LCA1LCA2LCA3LCA4LCA5KSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVJpZ2h0SW50ZXJzZWN0aW9uRSgpCisgICAgeworICAgICAgICBUcmllPEludGVnZXI+IHRyaWUgPSBzaW5nbGVMZXZlbEludFRyaWUoMTApOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5KSwgdG9MaXN0KHRyaWUpKTsKKworICAgICAgICBUcmllPEludGVnZXI+IGludGVyc2VjdGlvbiA9IHRyaWUuc3VidHJpZShudWxsLCB0cnVlLCBvZig3KSwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2KSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVJpZ2h0SW50ZXJzZWN0aW9uSSgpCisgICAgeworICAgICAgICBUcmllPEludGVnZXI+IHRyaWUgPSBzaW5nbGVMZXZlbEludFRyaWUoMTApOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5KSwgdG9MaXN0KHRyaWUpKTsKKworICAgICAgICBUcmllPEludGVnZXI+IGludGVyc2VjdGlvbiA9IHRyaWUuc3VidHJpZShudWxsLCB0cnVlLCBvZig3KSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcpLCB0b0xpc3QoaW50ZXJzZWN0aW9uKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlTm9JbnRlcnNlY3Rpb24oKQorICAgIHsKKyAgICAgICAgVHJpZTxJbnRlZ2VyPiB0cmllID0gc2luZ2xlTGV2ZWxJbnRUcmllKDEwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSksIHRvTGlzdCh0cmllKSk7CisKKyAgICAgICAgVHJpZTxJbnRlZ2VyPiBpbnRlcnNlY3Rpb24gPSB0cmllLnN1YnRyaWUobnVsbCwgdHJ1ZSwgbnVsbCwgdHJ1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpLCB0b0xpc3QoaW50ZXJzZWN0aW9uKSk7CisKKyAgICAgICAgLy8gVGhlIHR3byBib29sZWFuIGZsYWdzIGRvbid0IGhhdmUgYSBtZWFuaW5nIHdoZW4gdGhlIGJvdW5kIGRvZXMgbm90IGV4aXN0LiBGb3IgY29tcGxldGVuZXNzLCBhbHNvIHRlc3QKKyAgICAgICAgLy8gd2l0aCB0aGVtIHNldCB0byBmYWxzZS4KKyAgICAgICAgaW50ZXJzZWN0aW9uID0gdHJpZS5zdWJ0cmllKG51bGwsIGZhbHNlLCBudWxsLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpLCB0b0xpc3QoaW50ZXJzZWN0aW9uKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlRW1wdHlJbnRlcnNlY3Rpb25MZWZ0KCkKKyAgICB7CisgICAgICAgIFRyaWU8SW50ZWdlcj4gdHJpZSA9IHNpbmdsZUxldmVsSW50VHJpZSgxMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpLCB0b0xpc3QodHJpZSkpOworCisgICAgICAgIFRyaWU8SW50ZWdlcj4gaW50ZXJzZWN0aW9uID0gdHJpZS5zdWJ0cmllKEJ5dGVDb21wYXJhYmxlLkVNUFRZLCB0cnVlLCBudWxsLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSksIHRvTGlzdChpbnRlcnNlY3Rpb24pKTsKKworICAgICAgICBpbnRlcnNlY3Rpb24gPSB0cmllLnN1YnRyaWUoQnl0ZUNvbXBhcmFibGUuRU1QVFksIGZhbHNlLCBudWxsLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5KSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworCisgICAgICAgIGludGVyc2VjdGlvbiA9IHRyaWUuc3VidHJpZShCeXRlQ29tcGFyYWJsZS5FTVBUWSwgdHJ1ZSwgb2YoNSksIHRydWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KC0xLCAwLCAxLCAyLCAzLCA0LCA1KSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworCisgICAgICAgIGludGVyc2VjdGlvbiA9IHRyaWUuc3VidHJpZShCeXRlQ29tcGFyYWJsZS5FTVBUWSwgZmFsc2UsIG9mKDUpLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgwLCAxLCAyLCAzLCA0LCA1KSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlRW1wdHlJbnRlcnNlY3Rpb25SaWdodCgpCisgICAgeworICAgICAgICBUcmllPEludGVnZXI+IHRyaWUgPSBzaW5nbGVMZXZlbEludFRyaWUoMTApOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5KSwgdG9MaXN0KHRyaWUpKTsKKworICAgICAgICBUcmllPEludGVnZXI+IGludGVyc2VjdGlvbiA9IHRyaWUuc3VidHJpZShudWxsLCB0cnVlLCBCeXRlQ29tcGFyYWJsZS5FTVBUWSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoLTEpLCB0b0xpc3QoaW50ZXJzZWN0aW9uKSk7CisKKyAgICAgICAgaW50ZXJzZWN0aW9uID0gdHJpZS5zdWJ0cmllKG51bGwsIHRydWUsIEJ5dGVDb21wYXJhYmxlLkVNUFRZLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoKSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworCisgICAgICAgIGludGVyc2VjdGlvbiA9IHRyaWUuc3VidHJpZShCeXRlQ29tcGFyYWJsZS5FTVBUWSwgdHJ1ZSwgQnl0ZUNvbXBhcmFibGUuRU1QVFksIHRydWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KC0xKSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworCisgICAgICAgIGludGVyc2VjdGlvbiA9IHRyaWUuc3VidHJpZShCeXRlQ29tcGFyYWJsZS5FTVBUWSwgZmFsc2UsIEJ5dGVDb21wYXJhYmxlLkVNUFRZLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgpLCB0b0xpc3QoaW50ZXJzZWN0aW9uKSk7CisKKyAgICAgICAgaW50ZXJzZWN0aW9uID0gdHJpZS5zdWJ0cmllKEJ5dGVDb21wYXJhYmxlLkVNUFRZLCB0cnVlLCBCeXRlQ29tcGFyYWJsZS5FTVBUWSwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KCksIHRvTGlzdChpbnRlcnNlY3Rpb24pKTsKKworICAgICAgICAvLyAoZW1wdHksIGVtcHR5KSBpcyBhbiBpbnZhbGlkIGNhbGwgYXMgdGhlICIoZW1wdHkiIGlzIGdyZWF0ZXIgdGhhbiAiZW1wdHkpIgorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1YnRyaWVPblN1YnRyaWUoKQorICAgIHsKKyAgICAgICAgVHJpZTxJbnRlZ2VyPiB0cmllID0gc2luZ2xlTGV2ZWxJbnRUcmllKDE1KTsKKworICAgICAgICAvLyBub24tb3ZlcmxhcHBpbmcKKyAgICAgICAgVHJpZTxJbnRlZ2VyPiBpbnRlcnNlY3Rpb24gPSB0cmllLnN1YnRyaWUob2YoMCksIG9mKDQpKS5zdWJ0cmllKG9mKDQpLCBvZig4KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoKSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworICAgICAgICAvLyB0b3VjaGluZworICAgICAgICBpbnRlcnNlY3Rpb24gPSB0cmllLnN1YnRyaWUob2YoMCksIHRydWUsIG9mKDMpLCB0cnVlKS5zdWJ0cmllKG9mKDMpLCBvZig4KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMyksIHRvTGlzdChpbnRlcnNlY3Rpb24pKTsKKyAgICAgICAgLy8gb3ZlcmxhcHBpbmcgMQorICAgICAgICBpbnRlcnNlY3Rpb24gPSB0cmllLnN1YnRyaWUob2YoMCksIG9mKDQpKS5zdWJ0cmllKG9mKDIpLCBvZig4KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMiwgMyksIHRvTGlzdChpbnRlcnNlY3Rpb24pKTsKKyAgICAgICAgLy8gb3ZlcmxhcHBpbmcgMgorICAgICAgICBpbnRlcnNlY3Rpb24gPSB0cmllLnN1YnRyaWUob2YoMCksIG9mKDQpKS5zdWJ0cmllKG9mKDEpLCBvZig4KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMSwgMiwgMyksIHRvTGlzdChpbnRlcnNlY3Rpb24pKTsKKyAgICAgICAgLy8gY292ZXJlZAorICAgICAgICBpbnRlcnNlY3Rpb24gPSB0cmllLnN1YnRyaWUob2YoMCksIG9mKDQpKS5zdWJ0cmllKG9mKDApLCBvZig4KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMCwgMSwgMiwgMyksIHRvTGlzdChpbnRlcnNlY3Rpb24pKTsKKyAgICAgICAgLy8gY292ZXJlZCAyCisgICAgICAgIGludGVyc2VjdGlvbiA9IHRyaWUuc3VidHJpZShvZig0KSwgdHJ1ZSwgb2YoOCksIHRydWUpLnN1YnRyaWUob2YoMCksIG9mKDgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCg0LCA1LCA2LCA3KSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworICAgICAgICAvLyBjb3ZlcmVkIDMKKyAgICAgICAgaW50ZXJzZWN0aW9uID0gdHJpZS5zdWJ0cmllKG9mKDEpLCBmYWxzZSwgb2YoNCksIHRydWUpLnN1YnRyaWUob2YoMCksIG9mKDgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgyLCAzLCA0KSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllVG9Eb3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllVG9Eb3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDQ3YzBiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWVUb0RvdC5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllczsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IG9yZy5hZ3JvbmEuRGlyZWN0QnVmZmVyOworCisvKioKKyAqIEEgY2xhc3MgZm9yIGR1bXBpbmcgdGhlIHN0cnVjdHVyZSBvZiBhIHRyaWUgdG8gYSBncmFwaHZpei9kb3QgcmVwcmVzZW50YXRpb24gZm9yIG1ha2luZyB0cmllIGdyYXBocy4KKyAqLworY2xhc3MgVHJpZVRvRG90PFQ+IGV4dGVuZHMgVHJpZVBhdGhSZWNvbnN0cnVjdG9yIGltcGxlbWVudHMgVHJpZS5XYWxrZXI8VCwgU3RyaW5nPgoreworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVpbGRlciBiOworICAgIHByaXZhdGUgZmluYWwgRnVuY3Rpb248VCwgU3RyaW5nPiBjb250ZW50VG9TdHJpbmc7CisgICAgcHJpdmF0ZSBmaW5hbCBGdW5jdGlvbjxJbnRlZ2VyLCBTdHJpbmc+IHRyYW5zaXRpb25Ub1N0cmluZzsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gdXNlTXVsdGlCeXRlOworICAgIHByaXZhdGUgaW50IHByZXZQb3M7CisgICAgcHJpdmF0ZSBpbnQgY3Vyck5vZGVUZXh0UG9zOworCisgICAgcHVibGljIFRyaWVUb0RvdChGdW5jdGlvbjxULCBTdHJpbmc+IGNvbnRlbnRUb1N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uPEludGVnZXIsIFN0cmluZz4gdHJhbnNpdGlvblRvU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VNdWx0aUJ5dGUpCisgICAgeworICAgICAgICB0aGlzLmNvbnRlbnRUb1N0cmluZyA9IGNvbnRlbnRUb1N0cmluZzsKKyAgICAgICAgdGhpcy50cmFuc2l0aW9uVG9TdHJpbmcgPSB0cmFuc2l0aW9uVG9TdHJpbmc7CisgICAgICAgIHRoaXMudXNlTXVsdGlCeXRlID0gdXNlTXVsdGlCeXRlOworICAgICAgICB0aGlzLmIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBiLmFwcGVuZCgiZGlncmFwaCBHIHtcbiIgKworICAgICAgICAgICAgICAgICAiICBzcGxpbmVzPWN1cnZlZCIpOworICAgICAgICBhZGROb2RlRGVmaW5pdGlvbihub2RlU3RyaW5nKDApKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXNldFBhdGhMZW5ndGgoaW50IG5ld0xlbmd0aCkKKyAgICB7CisgICAgICAgIHN1cGVyLnJlc2V0UGF0aExlbmd0aChuZXdMZW5ndGgpOworICAgICAgICBwcmV2UG9zID0gbmV3TGVuZ3RoOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBuZXdMaW5lQW5kSW5kZW50KCkKKyAgICB7CisgICAgICAgIGIuYXBwZW5kKCdcbicpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByZXZQb3MgKyAxOyArK2kpCisgICAgICAgICAgICBiLmFwcGVuZCgiICAiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRQYXRoQnl0ZShpbnQgbmV4dEJ5dGUpCisgICAgeworICAgICAgICBuZXdMaW5lQW5kSW5kZW50KCk7CisgICAgICAgIHN1cGVyLmFkZFBhdGhCeXRlKG5leHRCeXRlKTsKKyAgICAgICAgYi5hcHBlbmQobm9kZVN0cmluZyhwcmV2UG9zKSk7CisgICAgICAgIGIuYXBwZW5kKCIgLT4gIik7CisgICAgICAgIFN0cmluZyBuZXdOb2RlID0gbm9kZVN0cmluZyhrZXlQb3MpOworICAgICAgICBiLmFwcGVuZChuZXdOb2RlKTsKKyAgICAgICAgYi5hcHBlbmQoIiBbbGFiZWw9XCIiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IHByZXZQb3M7IGkgPCBrZXlQb3MgLSAxOyArK2kpCisgICAgICAgICAgICBiLmFwcGVuZCh0cmFuc2l0aW9uVG9TdHJpbmcuYXBwbHkoa2V5Qnl0ZXNbaV0gJiAweEZGKSk7CisgICAgICAgIGIuYXBwZW5kKHRyYW5zaXRpb25Ub1N0cmluZy5hcHBseShuZXh0Qnl0ZSkpOworICAgICAgICBiLmFwcGVuZCgiXCJdIik7CisgICAgICAgIGFkZE5vZGVEZWZpbml0aW9uKG5ld05vZGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGROb2RlRGVmaW5pdGlvbihTdHJpbmcgbmV3Tm9kZSkKKyAgICB7CisgICAgICAgIHByZXZQb3MgPSBrZXlQb3M7CisgICAgICAgIG5ld0xpbmVBbmRJbmRlbnQoKTsKKyAgICAgICAgY3Vyck5vZGVUZXh0UG9zID0gYi5sZW5ndGgoKTsKKyAgICAgICAgYi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiJXMgW3NoYXBlPWNpcmNsZSBsYWJlbD1cIlwiXSIsIG5ld05vZGUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBub2RlU3RyaW5nKGludCBrZXlQb3MpCisgICAgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBiLmFwcGVuZCgiTm9kZV8iKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlQb3M7ICsraSkKKyAgICAgICAgICAgIGIuYXBwZW5kKHRyYW5zaXRpb25Ub1N0cmluZy5hcHBseShrZXlCeXRlc1tpXSAmIDB4RkYpKTsKKyAgICAgICAgcmV0dXJuIGIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRQYXRoQnl0ZXMoRGlyZWN0QnVmZmVyIGJ1ZmZlciwgaW50IHBvcywgaW50IGNvdW50KQorICAgIHsKKyAgICAgICAgaWYgKHVzZU11bHRpQnl0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIuYWRkUGF0aEJ5dGVzKGJ1ZmZlciwgcG9zLCBjb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpCisgICAgICAgICAgICAgICAgYWRkUGF0aEJ5dGUoYnVmZmVyLmdldEJ5dGUocG9zICsgaSkgJiAweEZGKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbnRlbnQoVCBjb250ZW50KQorICAgIHsKKyAgICAgICAgYi5yZXBsYWNlKGN1cnJOb2RlVGV4dFBvcywgYi5sZW5ndGgoKSwgU3RyaW5nLmZvcm1hdCgiJXMgW3NoYXBlPWRvdWJsZWNpcmNsZSBsYWJlbD1cIiVzXCJdIiwgbm9kZVN0cmluZyhrZXlQb3MpLCBjb250ZW50VG9TdHJpbmcuYXBwbHkoY29udGVudCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGNvbXBsZXRlKCkKKyAgICB7CisgICAgICAgIGIuYXBwZW5kKCJcbn1cbiIpOworICAgICAgICByZXR1cm4gYi50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllVG9Eb3RUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvVHJpZVRvRG90VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYzY2YWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvVHJpZVRvRG90VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkJ1ZmZlclR5cGU7CisKK3B1YmxpYyBjbGFzcyBUcmllVG9Eb3RUZXN0Cit7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9Eb3RDb250ZW50KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgSW5NZW1vcnlUcmllPFN0cmluZz4gdHJpZSA9IG5ldyBJbk1lbW9yeVRyaWU8PihCdWZmZXJUeXBlLk9GRl9IRUFQKTsKKyAgICAgICAgU3RyaW5nIHMgPSAiVHJpZSBub2RlIHR5cGVzIGFuZCBtYW5pcHVsYXRpb24gbWVjaGFuaXNtcy4gVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIGlzIHRvIGFsbG93IGZvciBoYW5kbGluZyB0cmllcyBkaXJlY3RseSBhcyIgKworICAgICAgICAgICAgICAgICAgICIgdGhleSBhcmUgb24gZGlzayB3aXRob3V0IGFueSBzZXJpYWxpemF0aW9uLCBhbmQgdG8gZW5hYmxlIHRoZSBjcmVhdGlvbiBvZiBzdWNoIGZpbGVzLiI7CisgICAgICAgIHMgPSBzLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIGZvciAoU3RyaW5nIHdvcmQgOiBzLnNwbGl0KCJbXmEtel0rIikpCisgICAgICAgICAgICB0cmllLnB1dFJlY3Vyc2l2ZShJbk1lbW9yeVRyaWVUZXN0QmFzZS5jb21wYXJhYmxlKHdvcmQpLCB3b3JkLCAoeCwgeSkgLT4geSk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRyaWUucHJvY2VzcyhuZXcgVHJpZVRvRG90KE9iamVjdDo6dG9TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0+IENoYXJhY3Rlci50b1N0cmluZygoY2hhcikgKChpbnQpIHgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWVUb01lcm1haWQuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllVG9NZXJtYWlkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc1ZDMwMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllVG9NZXJtYWlkLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzOworCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgb3JnLmFncm9uYS5EaXJlY3RCdWZmZXI7CisKKy8qKgorICogQSBjbGFzcyBmb3IgZHVtcGluZyB0aGUgc3RydWN0dXJlIG9mIGEgdHJpZSB0byBhIGdyYXBodml6L2RvdCByZXByZXNlbnRhdGlvbiBmb3IgbWFraW5nIHRyaWUgZ3JhcGhzLgorICovCitjbGFzcyBUcmllVG9NZXJtYWlkPFQ+IGV4dGVuZHMgVHJpZVBhdGhSZWNvbnN0cnVjdG9yIGltcGxlbWVudHMgVHJpZS5XYWxrZXI8VCwgU3RyaW5nPgoreworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVpbGRlciBiOworICAgIHByaXZhdGUgZmluYWwgRnVuY3Rpb248VCwgU3RyaW5nPiBjb250ZW50VG9TdHJpbmc7CisgICAgcHJpdmF0ZSBmaW5hbCBGdW5jdGlvbjxJbnRlZ2VyLCBTdHJpbmc+IHRyYW5zaXRpb25Ub1N0cmluZzsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gdXNlTXVsdGlCeXRlOworICAgIHByaXZhdGUgaW50IHByZXZQb3M7CisgICAgcHJpdmF0ZSBpbnQgY3Vyck5vZGVUZXh0UG9zOworCisgICAgcHVibGljIFRyaWVUb01lcm1haWQoRnVuY3Rpb248VCwgU3RyaW5nPiBjb250ZW50VG9TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb248SW50ZWdlciwgU3RyaW5nPiB0cmFuc2l0aW9uVG9TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VNdWx0aUJ5dGUpCisgICAgeworICAgICAgICB0aGlzLmNvbnRlbnRUb1N0cmluZyA9IGNvbnRlbnRUb1N0cmluZzsKKyAgICAgICAgdGhpcy50cmFuc2l0aW9uVG9TdHJpbmcgPSB0cmFuc2l0aW9uVG9TdHJpbmc7CisgICAgICAgIHRoaXMudXNlTXVsdGlCeXRlID0gdXNlTXVsdGlCeXRlOworICAgICAgICB0aGlzLmIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBiLmFwcGVuZCgiZ3JhcGggVEQiKTsKKyAgICAgICAgbmV3TGluZUFuZEluZGVudCgpOworICAgICAgICBhZGROb2RlRGVmaW5pdGlvbihub2RlU3RyaW5nKDApKTsKKyAgICAgICAgbmV3TGluZUFuZEluZGVudCgpOworICAgICAgICBiLmFwcGVuZCgic3R5bGUgIiArIG5vZGVTdHJpbmcoMCkgKyAiIGZpbGw6ZGFya2dyZXkiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXNldFBhdGhMZW5ndGgoaW50IG5ld0xlbmd0aCkKKyAgICB7CisgICAgICAgIHN1cGVyLnJlc2V0UGF0aExlbmd0aChuZXdMZW5ndGgpOworICAgICAgICBwcmV2UG9zID0gbmV3TGVuZ3RoOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBuZXdMaW5lQW5kSW5kZW50KCkKKyAgICB7CisgICAgICAgIGIuYXBwZW5kKCdcbicpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByZXZQb3MgKyAxOyArK2kpCisgICAgICAgICAgICBiLmFwcGVuZCgiICAiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRQYXRoQnl0ZShpbnQgbmV4dEJ5dGUpCisgICAgeworICAgICAgICBuZXdMaW5lQW5kSW5kZW50KCk7CisgICAgICAgIHN1cGVyLmFkZFBhdGhCeXRlKG5leHRCeXRlKTsKKyAgICAgICAgYi5hcHBlbmQobm9kZVN0cmluZyhwcmV2UG9zKSk7CisgICAgICAgIFN0cmluZyBuZXdOb2RlID0gbm9kZVN0cmluZyhrZXlQb3MpOworICAgICAgICBiLmFwcGVuZCgiIC0tXCIiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IHByZXZQb3M7IGkgPCBrZXlQb3MgLSAxOyArK2kpCisgICAgICAgICAgICBiLmFwcGVuZCh0cmFuc2l0aW9uVG9TdHJpbmcuYXBwbHkoa2V5Qnl0ZXNbaV0gJiAweEZGKSk7CisgICAgICAgIGIuYXBwZW5kKHRyYW5zaXRpb25Ub1N0cmluZy5hcHBseShuZXh0Qnl0ZSkpOworICAgICAgICBiLmFwcGVuZCgiXCItLT4gIik7CisgICAgICAgIGFkZE5vZGVEZWZpbml0aW9uKG5ld05vZGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGROb2RlRGVmaW5pdGlvbihTdHJpbmcgbmV3Tm9kZSkKKyAgICB7CisgICAgICAgIHByZXZQb3MgPSBrZXlQb3M7CisgICAgICAgIGN1cnJOb2RlVGV4dFBvcyA9IGIubGVuZ3RoKCk7CisgICAgICAgIGIuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiVzKCggKSkiLCBuZXdOb2RlKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgbm9kZVN0cmluZyhpbnQga2V5UG9zKQorICAgIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgYi5hcHBlbmQoIk5vZGVfIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5UG9zOyArK2kpCisgICAgICAgICAgICBiLmFwcGVuZCh0cmFuc2l0aW9uVG9TdHJpbmcuYXBwbHkoa2V5Qnl0ZXNbaV0gJiAweEZGKSk7CisgICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkUGF0aEJ5dGVzKERpcmVjdEJ1ZmZlciBidWZmZXIsIGludCBwb3MsIGludCBjb3VudCkKKyAgICB7CisgICAgICAgIGlmICh1c2VNdWx0aUJ5dGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyLmFkZFBhdGhCeXRlcyhidWZmZXIsIHBvcywgY291bnQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKQorICAgICAgICAgICAgICAgIGFkZFBhdGhCeXRlKGJ1ZmZlci5nZXRCeXRlKHBvcyArIGkpICYgMHhGRik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb250ZW50KFQgY29udGVudCkKKyAgICB7CisgICAgICAgIGIucmVwbGFjZShjdXJyTm9kZVRleHRQb3MsIGIubGVuZ3RoKCksIFN0cmluZy5mb3JtYXQoIiVzKCgoJXMpKSkiLCBub2RlU3RyaW5nKGtleVBvcyksIGNvbnRlbnRUb1N0cmluZy5hcHBseShjb250ZW50KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgY29tcGxldGUoKQorICAgIHsKKyAgICAgICAgYi5hcHBlbmQoIlxuIik7CisgICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWVUb01lcm1haWRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvVHJpZVRvTWVybWFpZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDY5MWJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWVUb01lcm1haWRUZXN0LmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQnVmZmVyVHlwZTsKKworcHVibGljIGNsYXNzIFRyaWVUb01lcm1haWRUZXN0Cit7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9NZXJtYWlkQ29udGVudCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEluTWVtb3J5VHJpZTxTdHJpbmc+IHRyaWUgPSBuZXcgSW5NZW1vcnlUcmllPD4oQnVmZmVyVHlwZS5PRkZfSEVBUCk7CisgICAgICAgIC8vIFRoaXMgd2FzIHVzZWQgYXMgYSBiYXNpcyB0aGUgZ3JhcGhzIGluIEJUSUZvcm1hdC5tZAorICAgICAgICBTdHJpbmcgcyA9ICJhIGFsbG93IGFuIGFuZCBhbnkgYXJlIGFzIG5vZGUgb2Ygb24gdGhlIHRoaXMgdG8gdHJpZSB0eXBlcyB3aXRoIHdpdGhvdXQiOworICAgICAgICBzID0gcy50b0xvd2VyQ2FzZSgpOworICAgICAgICBmb3IgKFN0cmluZyB3b3JkIDogcy5zcGxpdCgiW15hLXpdKyIpKQorICAgICAgICAgICAgdHJpZS5wdXRSZWN1cnNpdmUoSW5NZW1vcnlUcmllVGVzdEJhc2UuY29tcGFyYWJsZSh3b3JkKSwgd29yZCwgKHgsIHkpIC0+IHkpOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0cmllLnByb2Nlc3MobmV3IFRyaWVUb01lcm1haWQoT2JqZWN0Ojp0b1N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLT4gQ2hhcmFjdGVyLnRvU3RyaW5nKChjaGFyKSAoKGludCkgeCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvQ2xpZW50c1RhYmxlS2V5c3BhY2VDb2xUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9DbGllbnRzVGFibGVLZXlzcGFjZUNvbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjgyY2FjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvQ2xpZW50c1RhYmxlS2V5c3BhY2VDb2xUZXN0LmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkNsdXN0ZXI7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlJvdzsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkVtYmVkZGVkQ2Fzc2FuZHJhU2VydmljZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBDbGllbnRzVGFibGVLZXlzcGFjZUNvbFRlc3QKK3sKKworICAgIHByaXZhdGUgc3RhdGljIENsdXN0ZXIgY2x1c3RlcjsKKyAgICBwcml2YXRlIHN0YXRpYyBFbWJlZGRlZENhc3NhbmRyYVNlcnZpY2UgY2Fzc2FuZHJhOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLU19OQU1FID0gInZ0cyI7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXBDbGFzcygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY2Fzc2FuZHJhID0gU2VydmVyVGVzdFV0aWxzLnN0YXJ0RW1iZWRkZWRDYXNzYW5kcmFTZXJ2aWNlKCk7CisKKyAgICAgICAgY2x1c3RlciA9IENsdXN0ZXIuYnVpbGRlcigpLmFkZENvbnRhY3RQb2ludCgiMTI3LjAuMC4xIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFBvcnQoRGF0YWJhc2VEZXNjcmlwdG9yLmdldE5hdGl2ZVRyYW5zcG9ydFBvcnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBDbGllbnRzVGFibGUgdGFibGUgPSBuZXcgQ2xpZW50c1RhYmxlKEtTX05BTUUpOworICAgICAgICBWaXJ0dWFsS2V5c3BhY2VSZWdpc3RyeS5pbnN0YW5jZS5yZWdpc3RlcihuZXcgVmlydHVhbEtleXNwYWNlKEtTX05BTUUsIEltbXV0YWJsZUxpc3Qub2YodGFibGUpKSk7CisgICAgfQorCisgICAgQEFmdGVyQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVhckRvd24oKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbHVzdGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgY2x1c3Rlci5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhc3NhbmRyYSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGNhc3NhbmRyYS5zdG9wKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRob3V0Q29ubmVjdGluZ1RvS2V5c3BhY2UoKQorICAgIHsKKyAgICAgICAgdHJ5IChTZXNzaW9uIHNlc3Npb24gPSBjbHVzdGVyLmNvbm5lY3QoKSkKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxSb3c+IHJvd3MgPSBzZXNzaW9uLmV4ZWN1dGUoIlNFTEVDVCAqIGZyb20gIiArIEtTX05BTUUgKyAiLmNsaWVudHMiKS5hbGwoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkF0IGxlYXN0IG9uZSBjbGllbnQgc2hvdWxkIGJlIHJldHVybmVkLiIsIHJvd3Muc2l6ZSgpID4gMCk7CisgICAgICAgICAgICBmb3IgKFJvdyByIDogcm93cykKKyAgICAgICAgICAgICAgICBhc3NlcnROdWxsKHIuZ2V0U3RyaW5nKCJrZXlzcGFjZV9uYW1lIikpOyAvLyBObyBrZXlzcGFjZSBpcyBzcGVjaWZlZCB3aGlsZSBjb25uZWN0aW5nLiBJdCBzaG91bGQgYmUgbnVsbC4KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENoYW5naW5nS2V5c3BhY2UoKQorICAgIHsKKyAgICAgICAgU3RyaW5nIGtleXNwYWNlMSA9ICJzeXN0ZW1fZGlzdHJpYnV0ZWQiOworICAgICAgICBTdHJpbmcga2V5c3BhY2UyID0gInN5c3RlbV9hdXRoIjsKKyAgICAgICAgdHJ5IChTZXNzaW9uIHNlc3Npb24gPSBjbHVzdGVyLmNvbm5lY3Qoa2V5c3BhY2UxKSkKKyAgICAgICAgeworCisgICAgICAgICAgICBJbmV0QWRkcmVzcyBwb29sQ29ubmVjdGlvbiA9IG51bGw7CisgICAgICAgICAgICBpbnQgcG9ydCA9IC0xOworICAgICAgICAgICAgZm9yIChSb3cgciA6IHNlc3Npb24uZXhlY3V0ZSgiU0VMRUNUICogZnJvbSAiICsgS1NfTkFNRSArICIuY2xpZW50cyIpLmFsbCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEtleXNwYWNlIGlzIHVzZWQgZm9yIHBvb2wgY29ubmVjdGlvbiBvbmx5IChjb250cm9sIGNvbm5lY3Rpb24gaXMgbm90IHVzaW5nIGtleXNwYWNlKS4KKyAgICAgICAgICAgICAgICAvLyBVc2luZyByWyJrZXlzcGFjZV9uYW1lIl0gPT0ga2V5c3BhY2UxIGFzIGEgaGludCB0byBpZGVudGlmeSBhIHBvb2wgY29ubmVjdGlvbiBhcyB3ZSBjYW4ndCBpZGVudGlmeQorICAgICAgICAgICAgICAgIC8vIGNvbnRyb2wgY29ubmVjdGlvbiBiYXNlZCBvbiBpbmZvcm1hdGlvbiBpbiB0aGlzIHRhYmxlLgorICAgICAgICAgICAgICAgIFN0cmluZyBrZXlzcGFjZSA9IHIuZ2V0U3RyaW5nKCJrZXlzcGFjZV9uYW1lIik7CisgICAgICAgICAgICAgICAgaWYgKGtleXNwYWNlMS5lcXVhbHMoa2V5c3BhY2UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG9vbENvbm5lY3Rpb24gPSByLmdldEluZXQoImFkZHJlc3MiKTsKKyAgICAgICAgICAgICAgICAgICAgcG9ydCA9IHIuZ2V0SW50KCJwb3J0Iik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKC0xLCBwb3J0KTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocG9vbENvbm5lY3Rpb24pOworCisgICAgICAgICAgICBzZXNzaW9uLmV4ZWN1dGUoIlVTRSAiICsga2V5c3BhY2UyKTsKKworICAgICAgICAgICAgU3RyaW5nIHVzZWRLZXlzcGFjZSA9IG51bGw7CisgICAgICAgICAgICBmb3IgKFJvdyByIDogc2Vzc2lvbi5leGVjdXRlKCJTRUxFQ1QgKiBmcm9tICIgKyBLU19OQU1FICsgIi5jbGllbnRzIikuYWxsKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBvb2xDb25uZWN0aW9uLmVxdWFscyhyLmdldEluZXQoImFkZHJlc3MiKSkgJiYgcG9ydCA9PSByLmdldEludCgicG9ydCIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdXNlZEtleXNwYWNlID0gci5nZXRTdHJpbmcoImtleXNwYWNlX25hbWUiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoa2V5c3BhY2UyLCB1c2VkS2V5c3BhY2UpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvQ3JlZGVudGlhbHNDYWNoZUtleXNUYWJsZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL0NyZWRlbnRpYWxzQ2FjaGVLZXlzVGFibGVUZXN0LmphdmEKaW5kZXggNDUxMzJhOS4uN2FhMWVjNCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvQ3JlZGVudGlhbHNDYWNoZUtleXNUYWJsZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9DcmVkZW50aWFsc0NhY2hlS2V5c1RhYmxlVGVzdC5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiAKIGltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuRW5kUG9pbnQ7CiBpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlBsYWluVGV4dEF1dGhQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5BdXRoVGVzdFV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguQXV0aGVudGljYXRlZFVzZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5JQXV0aGVudGljYXRvcjsKQEAgLTQ4LDYgKzQ5LDggQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCiAgICAgeworICAgICAgICBTZXJ2ZXJUZXN0VXRpbHMuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKwogICAgICAgICAvLyBoaWdoIHZhbHVlIGlzIHVzZWQgZm9yIGNvbnZlbmllbnQgZGVidWdnaW5nCiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDcmVkZW50aWFsc1ZhbGlkaXR5KDIwXzAwMCk7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL0xvZ01lc3NhZ2VzVGFibGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9Mb2dNZXNzYWdlc1RhYmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNjU1YTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9Mb2dNZXNzYWdlc1RhYmxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWw7CisKK2ltcG9ydCBqYXZhLnRpbWUuSW5zdGFudDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5MZXZlbDsKK2ltcG9ydCBjaC5xb3MubG9nYmFjay5jbGFzc2ljLnNwaS5Mb2dnaW5nRXZlbnQ7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EYXRhUmFuZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5UaW1lc3RhbXBUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWwuQWJzdHJhY3RWaXJ0dWFsVGFibGUuRGF0YVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsLkFic3RyYWN0VmlydHVhbFRhYmxlLlBhcnRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTG9jYWxQYXJ0aXRpb25lcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkxPR1NfVklSVFVBTF9UQUJMRV9NQVhfUk9XUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIExvZ01lc3NhZ2VzVGFibGVUZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCit7CisgICAgcHJpdmF0ZSBTdHJpbmcga2V5c3BhY2UgPSBjcmVhdGVLZXlzcGFjZU5hbWUoKTsKKyAgICBwcml2YXRlIExvZ01lc3NhZ2VzVGFibGUgdGFibGU7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXAoKQorICAgIHsKKyAgICAgICAgQ1FMVGVzdGVyLnNldFVwQ2xhc3MoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcnVuY2F0ZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHJlZ2lzdGVyVmlydHVhbFRhYmxlKCk7CisKKyAgICAgICAgaW50IG51bWJlck9mUm93cyA9IDEwMDsKKyAgICAgICAgTGlzdDxMb2dnaW5nRXZlbnQ+IGxvZ2dpbmdFdmVudHMgPSBnZXRMb2dnaW5nRXZlbnRzKG51bWJlck9mUm93cyk7CisgICAgICAgIGxvZ2dpbmdFdmVudHMuZm9yRWFjaCh0YWJsZTo6YWRkKTsKKworICAgICAgICBleGVjdXRlKHF1ZXJ5KCJ0cnVuY2F0ZSAlcyIpKTsKKworICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVOZXQocXVlcnkoInNlbGVjdCB0aW1lc3RhbXAgZnJvbSAlcyIpKS5hbGwoKS5pc0VtcHR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZW1wdHkoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICByZWdpc3RlclZpcnR1YWxUYWJsZSgpOworICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKHF1ZXJ5KCJzZWxlY3QgKiBmcm9tICVzIikpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnNlcnQoKQorICAgIHsKKyAgICAgICAgcmVnaXN0ZXJWaXJ0dWFsVGFibGUoKTsKKworICAgICAgICBpbnQgbnVtYmVyT2ZSb3dzID0gMTAwMDsKKyAgICAgICAgTGlzdDxMb2dnaW5nRXZlbnQ+IGxvZ2dpbmdFdmVudHMgPSBnZXRMb2dnaW5nRXZlbnRzKG51bWJlck9mUm93cyk7CisgICAgICAgIGxvZ2dpbmdFdmVudHMuZm9yRWFjaCh0YWJsZTo6YWRkKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMobnVtYmVyT2ZSb3dzLCBudW1iZXJPZlBhcnRpdGlvbnMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGltaXRlZENhcGFjaXR5KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgcmVnaXN0ZXJWaXJ0dWFsVGFibGUoMTAwKTsKKworICAgICAgICBpbnQgbnVtYmVyT2ZSb3dzID0gMTAwMDsKKyAgICAgICAgTGlzdDxMb2dnaW5nRXZlbnQ+IGxvZ2dpbmdFdmVudHMgPSBnZXRMb2dnaW5nRXZlbnRzKG51bWJlck9mUm93cyk7CisgICAgICAgIGxvZ2dpbmdFdmVudHMuZm9yRWFjaCh0YWJsZTo6YWRkKTsKKworICAgICAgICAvLyBldmVuIHdlIGluc2VydGVkIDEwMDAgcm93cywgb25seSAxMDAgYXJlIHByZXNlbnQgYXMgaXRzIGNhcGFjaXR5IGlzIGJvdW5kZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgbnVtYmVyT2ZQYXJ0aXRpb25zKCkpOworCisgICAgICAgIC8vIHRoZSBmaXJzdCByZWNvcmQgaW4gdGhlIHRhYmxlIHdpbGwgYmUgdGhlIGxhc3Qgb25lIHdoaWNoIHdlIGluc2VydGVkCisgICAgICAgIExvZ2dpbmdFdmVudCBmaXJzdEV2ZW50ID0gbG9nZ2luZ0V2ZW50cy5nZXQoOTk5KTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KHF1ZXJ5KCJzZWxlY3QgdGltZXN0YW1wIGZyb20gJXMgbGltaXQgMSIpKSwKKyAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBuZXcgRGF0ZShmaXJzdEV2ZW50LmdldFRpbWVTdGFtcCgpKSB9KTsKKworICAgICAgICAvLyB0aGUgbGFzdCByZWNvcmQgaW4gdGhlIHRhYmxlIHdpbGwgYmUgOTAwdGggd2UgaW5zZXJ0ZWQKKyAgICAgICAgTGlzdDxSb3c+IGFsbCA9IGV4ZWN1dGVOZXQocXVlcnkoInNlbGVjdCB0aW1lc3RhbXAgZnJvbSAlcyIpKS5hbGwoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgYWxsLnNpemUoKSk7CisgICAgICAgIFJvdyByb3cgPSBhbGwuZ2V0KGFsbC5zaXplKCkgLSAxKTsKKyAgICAgICAgRGF0ZSB0aW1lc3RhbXAgPSByb3cuZ2V0VGltZXN0YW1wKDApOworICAgICAgICBhc3NlcnRFcXVhbHMobG9nZ2luZ0V2ZW50cy5nZXQoOTAwKS5nZXRUaW1lU3RhbXAoKSwgdGltZXN0YW1wLmdldFRpbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVMb2dzSW5TYW1lTWlsbGlzZWNvbmQoKQorICAgIHsKKyAgICAgICAgcmVnaXN0ZXJWaXJ0dWFsVGFibGUoMTApOworICAgICAgICBMaXN0PExvZ2dpbmdFdmVudD4gbG9nZ2luZ0V2ZW50cyA9IGdldExvZ2dpbmdFdmVudHMoMTAsIEluc3RhbnQubm93KCksIDUpOworICAgICAgICBsb2dnaW5nRXZlbnRzLmZvckVhY2godGFibGU6OmFkZCk7CisKKyAgICAgICAgLy8gMiBwYXJ0aXRpb25zLCA1IHJvd3MgaW4gZWFjaAorICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbnVtYmVyT2ZQYXJ0aXRpb25zKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmluZ0J1ZmZlclNpemUoKQorICAgIHsKKyAgICAgICAgTE9HU19WSVJUVUFMX1RBQkxFX01BWF9ST1dTLnNldEludCgtMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb2dNZXNzYWdlc1RhYmxlLkxPR1NfVklSVFVBTF9UQUJMRV9ERUZBVUxUX1JPV1MsIExvZ01lc3NhZ2VzVGFibGUucmVzb2x2ZUJ1ZmZlclNpemUoKSk7CisKKyAgICAgICAgTE9HU19WSVJUVUFMX1RBQkxFX01BWF9ST1dTLnNldEludCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvZ01lc3NhZ2VzVGFibGUuTE9HU19WSVJUVUFMX1RBQkxFX0RFRkFVTFRfUk9XUywgTG9nTWVzc2FnZXNUYWJsZS5yZXNvbHZlQnVmZmVyU2l6ZSgpKTsKKworICAgICAgICBMT0dTX1ZJUlRVQUxfVEFCTEVfTUFYX1JPV1Muc2V0SW50KDEwMDAwMDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9nTWVzc2FnZXNUYWJsZS5MT0dTX1ZJUlRVQUxfVEFCTEVfREVGQVVMVF9ST1dTLCBMb2dNZXNzYWdlc1RhYmxlLnJlc29sdmVCdWZmZXJTaXplKCkpOworCisgICAgICAgIExPR1NfVklSVFVBTF9UQUJMRV9NQVhfUk9XUy5zZXRJbnQoOTk5KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvZ01lc3NhZ2VzVGFibGUuTE9HU19WSVJUVUFMX1RBQkxFX0RFRkFVTFRfUk9XUywgTG9nTWVzc2FnZXNUYWJsZS5yZXNvbHZlQnVmZmVyU2l6ZSgpKTsKKworICAgICAgICBMT0dTX1ZJUlRVQUxfVEFCTEVfTUFYX1JPV1Muc2V0SW50KDUwMDAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMDAxLCBMb2dNZXNzYWdlc1RhYmxlLnJlc29sdmVCdWZmZXJTaXplKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlclZpcnR1YWxUYWJsZSgpCisgICAgeworICAgICAgICByZWdpc3RlclZpcnR1YWxUYWJsZShMb2dNZXNzYWdlc1RhYmxlLkxPR1NfVklSVFVBTF9UQUJMRV9NSU5fUk9XUyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyVmlydHVhbFRhYmxlKGludCBzaXplKQorICAgIHsKKyAgICAgICAgdGFibGUgPSBuZXcgTG9nTWVzc2FnZXNUYWJsZShrZXlzcGFjZSwgc2l6ZSk7CisgICAgICAgIFZpcnR1YWxLZXlzcGFjZVJlZ2lzdHJ5Lmluc3RhbmNlLnJlZ2lzdGVyKG5ldyBWaXJ0dWFsS2V5c3BhY2Uoa2V5c3BhY2UsIEltbXV0YWJsZUxpc3Qub2YodGFibGUpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgbnVtYmVyT2ZQYXJ0aXRpb25zKCkKKyAgICB7CisgICAgICAgIERhdGFTZXQgZGF0YSA9IHRhYmxlLmRhdGEoKTsKKworICAgICAgICBJdGVyYXRvcjxQYXJ0aXRpb24+IHBhcnRpdGlvbnMgPSBkYXRhLmdldFBhcnRpdGlvbnMoRGF0YVJhbmdlLmFsbERhdGEobmV3IExvY2FsUGFydGl0aW9uZXIoVGltZXN0YW1wVHlwZS5pbnN0YW5jZSkpKTsKKworICAgICAgICBpbnQgbnVtYmVyT2ZQYXJ0aXRpb25zID0gMDsKKworICAgICAgICB3aGlsZSAocGFydGl0aW9ucy5oYXNOZXh0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhcnRpdGlvbnMubmV4dCgpOworICAgICAgICAgICAgbnVtYmVyT2ZQYXJ0aXRpb25zICs9IDE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVtYmVyT2ZQYXJ0aXRpb25zOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5KFN0cmluZyBxdWVyeSkKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KHF1ZXJ5LCB0YWJsZS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8TG9nZ2luZ0V2ZW50PiBnZXRMb2dnaW5nRXZlbnRzKGludCBzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldExvZ2dpbmdFdmVudHMoc2l6ZSwgSW5zdGFudC5ub3coKSwgMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PExvZ2dpbmdFdmVudD4gZ2V0TG9nZ2luZ0V2ZW50cyhpbnQgc2l6ZSwgSW5zdGFudCBmaXJzdFRpbWVzdGFtcCwgaW50IGxvZ3NJbk1pbGxpc2Vjb25kKQorICAgIHsKKyAgICAgICAgTGlzdDxMb2dnaW5nRXZlbnQ+IGxvZ3MgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGludCBwYXJ0aXRpb25zID0gc2l6ZSAvIGxvZ3NJbk1pbGxpc2Vjb25kOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydGl0aW9uczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIHRpbWVzdGFtcCA9IGZpcnN0VGltZXN0YW1wLnRvRXBvY2hNaWxsaSgpOworICAgICAgICAgICAgZmlyc3RUaW1lc3RhbXAgPSBmaXJzdFRpbWVzdGFtcC5wbHVzU2Vjb25kcygxKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsb2dzSW5NaWxsaXNlY29uZDsgaisrKQorICAgICAgICAgICAgICAgIGxvZ3MuYWRkKGdldExvZ2dpbmdFdmVudCh0aW1lc3RhbXApKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsb2dzOworICAgIH0KKworICAgIHByaXZhdGUgTG9nZ2luZ0V2ZW50IGdldExvZ2dpbmdFdmVudChsb25nIHRpbWVzdGFtcCkKKyAgICB7CisgICAgICAgIExvZ2dpbmdFdmVudCBldmVudCA9IG5ldyBMb2dnaW5nRXZlbnQoKTsKKyAgICAgICAgZXZlbnQuc2V0TGV2ZWwoTGV2ZWwuSU5GTyk7CisgICAgICAgIGV2ZW50LnNldE1lc3NhZ2UoIm1lc3NhZ2UgIiArIHRpbWVzdGFtcCk7CisgICAgICAgIGV2ZW50LnNldExvZ2dlck5hbWUoImxvZ2dlciAiICsgdGltZXN0YW1wKTsKKyAgICAgICAgZXZlbnQuc2V0VGhyZWFkTmFtZShUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgIGV2ZW50LnNldFRpbWVTdGFtcCh0aW1lc3RhbXApOworCisgICAgICAgIHJldHVybiBldmVudDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9OZXR3b3JrUGVybWlzc2lvbnNDYWNoZUtleXNUYWJsZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL05ldHdvcmtQZXJtaXNzaW9uc0NhY2hlS2V5c1RhYmxlVGVzdC5qYXZhCmluZGV4IGY5NDQ4ODQuLmU5MzViYmIgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL05ldHdvcmtQZXJtaXNzaW9uc0NhY2hlS2V5c1RhYmxlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL05ldHdvcmtQZXJtaXNzaW9uc0NhY2hlS2V5c1RhYmxlVGVzdC5qYXZhCkBAIC0yNCw2ICsyNCw3IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2VydmVyVGVzdFV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguQXV0aFRlc3RVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLkF1dGhlbnRpY2F0ZWRVc2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguRENQZXJtaXNzaW9uczsKQEAgLTQ2LDYgKzQ3LDggQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCiAgICAgeworICAgICAgICBTZXJ2ZXJUZXN0VXRpbHMuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKwogICAgICAgICAvLyBoaWdoIHZhbHVlIGlzIHVzZWQgZm9yIGNvbnZlbmllbnQgZGVidWdnaW5nCiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRQZXJtaXNzaW9uc1ZhbGlkaXR5KDIwXzAwMCk7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1Blcm1pc3Npb25zQ2FjaGVLZXlzVGFibGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9QZXJtaXNzaW9uc0NhY2hlS2V5c1RhYmxlVGVzdC5qYXZhCmluZGV4IDIxNzFiMmQuLjQyOTUxNzUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1Blcm1pc3Npb25zQ2FjaGVLZXlzVGFibGVUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvUGVybWlzc2lvbnNDYWNoZUtleXNUYWJsZVRlc3QuamF2YQpAQCAtMjgsNiArMjgsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLkF1dGhUZXN0VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5BdXRoZW50aWNhdGVkVXNlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLkRhdGFSZXNvdXJjZTsKQEAgLTUyLDYgKzUzLDcgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCiAgICAgeworICAgICAgICBTZXJ2ZXJUZXN0VXRpbHMuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKICAgICAgICAgLy8gaGlnaCB2YWx1ZSBpcyB1c2VkIGZvciBjb252ZW5pZW50IGRlYnVnZ2luZwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0UGVybWlzc2lvbnNWYWxpZGl0eSgyMF8wMDApOwogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9Sb2xlc0NhY2hlS2V5c1RhYmxlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvUm9sZXNDYWNoZUtleXNUYWJsZVRlc3QuamF2YQppbmRleCA0MGMzMDM3Li5kZTE0YWVmIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9Sb2xlc0NhY2hlS2V5c1RhYmxlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1JvbGVzQ2FjaGVLZXlzVGFibGVUZXN0LmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5BdXRoVGVzdFV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguQXV0aGVudGljYXRlZFVzZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5JUm9sZU1hbmFnZXI7CkBAIC00Niw2ICs0Nyw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwQ2xhc3MoKQogICAgIHsKKyAgICAgICAgU2VydmVyVGVzdFV0aWxzLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CiAgICAgICAgIC8vIGhpZ2ggdmFsdWUgaXMgdXNlZCBmb3IgY29udmVuaWVudCBkZWJ1Z2dpbmcKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFJvbGVzVmFsaWRpdHkoMjBfMDAwKTsKIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvU1NUYWJsZVRhc2tzVGFibGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TU1RhYmxlVGFza3NUYWJsZVRlc3QuamF2YQppbmRleCBmNjQyYTJmLi42ZThhMTM2IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TU1RhYmxlVGFza3NUYWJsZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TU1RhYmxlVGFza3NUYWJsZVRlc3QuamF2YQpAQCAtNzMsMTEgKzczLDE0IEBACiAgICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMgPSBJbnRTdHJlYW0ucmFuZ2UoMCwgMTApCiAgICAgICAgICAgICAgICAgLm1hcFRvT2JqKGkgLT4gTW9ja1NjaGVtYS5zc3RhYmxlKGksIGkgKiAxMEwsIGkgKiAxMEwgKyA5LCBjZnMpKQogICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisgICAgICAgIFN0cmluZyBkaXJlY3RvcnkgPSBTdHJpbmcuZm9ybWF0KCIvc29tZS9kYXRhZGlyLyVzLyVzLSVzIiwgY2ZzLm1ldGFkYXRhLmtleXNwYWNlLCBjZnMubWV0YWRhdGEubmFtZSwgY2ZzLm1ldGFkYXRhLmlkLmFzVVVJRCgpKTsKKwogICAgICAgICBDb21wYWN0aW9uSW5mby5Ib2xkZXIgY29tcGFjdGlvbkhvbGRlciA9IG5ldyBDb21wYWN0aW9uSW5mby5Ib2xkZXIoKQogICAgICAgICB7CiAgICAgICAgICAgICBwdWJsaWMgQ29tcGFjdGlvbkluZm8gZ2V0Q29tcGFjdGlvbkluZm8oKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbkluZm8oY2ZzLm1ldGFkYXRhKCksIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiwgYnl0ZXNDb21wYWN0ZWQsIGJ5dGVzVG90YWwsIGNvbXBhY3Rpb25JZCwgc3N0YWJsZXMpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbkluZm8oY2ZzLm1ldGFkYXRhKCksIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiwgYnl0ZXNDb21wYWN0ZWQsIGJ5dGVzVG90YWwsIGNvbXBhY3Rpb25JZCwgc3N0YWJsZXMsIGRpcmVjdG9yeSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKQEAgLTkwLDcgKzkzLDcgQEAKICAgICAgICAgVW50eXBlZFJlc3VsdFNldCByZXN1bHQgPSBleGVjdXRlKCJTRUxFQ1QgKiBGUk9NIHZ0cy5zc3RhYmxlX3Rhc2tzIik7CiAgICAgICAgIGFzc2VydFJvd3MocmVzdWx0LCByb3coQ1FMVGVzdGVyLktFWVNQQUNFLCBjdXJyZW50VGFibGUoKSwgY29tcGFjdGlvbklkLCAxLjAgKiBieXRlc0NvbXBhY3RlZCAvIGJ5dGVzVG90YWwsCiAgICAgICAgICAgICAgICAgT3BlcmF0aW9uVHlwZS5DT01QQUNUSU9OLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSwgYnl0ZXNDb21wYWN0ZWQsIHNzdGFibGVzLnNpemUoKSwKLSAgICAgICAgICAgICAgICBieXRlc1RvdGFsLCBDb21wYWN0aW9uSW5mby5Vbml0LkJZVEVTLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICBkaXJlY3RvcnksIGJ5dGVzVG90YWwsIENvbXBhY3Rpb25JbmZvLlVuaXQuQllURVMudG9TdHJpbmcoKSkpOwogCiAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmFjdGl2ZS5maW5pc2hDb21wYWN0aW9uKGNvbXBhY3Rpb25Ib2xkZXIpOwogICAgICAgICByZXN1bHQgPSBleGVjdXRlKCJTRUxFQ1QgKiBGUk9NIHZ0cy5zc3RhYmxlX3Rhc2tzIik7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TbmFwc2hvdHNUYWJsZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1NuYXBzaG90c1RhYmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ODMyMzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TbmFwc2hvdHNUYWJsZVRlc3QuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsOworCitpbXBvcnQgamF2YS50aW1lLkluc3RhbnQ7CitpbXBvcnQgamF2YS50aW1lLnRlbXBvcmFsLkNocm9ub1VuaXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkR1cmF0aW9uU3BlYzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlVudHlwZWRSZXN1bHRTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jazsKKworcHVibGljIGNsYXNzIFNuYXBzaG90c1RhYmxlVGVzdCBleHRlbmRzIENRTFRlc3RlcgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLU19OQU1FID0gInZ0cyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNOQVBTSE9UX1RUTCA9ICJzbmFwc2hvdFR0bCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNOQVBTSE9UX05PX1RUTCA9ICJzbmFwc2hvdE5vVHRsIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEdXJhdGlvblNwZWMuSW50U2Vjb25kc0JvdW5kIHR0bCA9IG5ldyBEdXJhdGlvblNwZWMuSW50U2Vjb25kc0JvdW5kKCI0aCIpOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIGJlZm9yZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFNuYXBzaG90c1RhYmxlIHZ0YWJsZSA9IG5ldyBTbmFwc2hvdHNUYWJsZShLU19OQU1FKTsKKyAgICAgICAgVmlydHVhbEtleXNwYWNlUmVnaXN0cnkuaW5zdGFuY2UucmVnaXN0ZXIobmV3IFZpcnR1YWxLZXlzcGFjZShLU19OQU1FLCBJbW11dGFibGVMaXN0Lm9mKHZ0YWJsZSkpKTsKKworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBpbnQsIGNrIGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gMTA7ICsraSkKKyAgICAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgY2spIFZBTFVFUyAoPywgPykiLCBpLCBpKTsKKworICAgICAgICBmbHVzaCgpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIGFmdGVyKCkKKyAgICB7CisgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmNsZWFyU25hcHNob3QoQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSwgU05BUFNIT1RfTk9fVFRMLCBLRVlTUEFDRSk7CisgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmNsZWFyU25hcHNob3QoQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSwgU05BUFNIT1RfVFRMLCBLRVlTUEFDRSk7CisKKyAgICAgICAgc2NoZW1hQ2hhbmdlKFN0cmluZy5mb3JtYXQoIkRST1AgVEFCTEUgJXMiLCBLRVlTUEFDRSArICIuIiArIGN1cnJlbnRUYWJsZSgpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U25hcHNob3RzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgSW5zdGFudCBub3cgPSBJbnN0YW50Lm9mRXBvY2hNaWxsaShDbG9jay5HbG9iYWwuY3VycmVudFRpbWVNaWxsaXMoKSkudHJ1bmNhdGVkVG8oQ2hyb25vVW5pdC5NSUxMSVMpOworICAgICAgICBEYXRlIGNyZWF0ZWRBdCA9IG5ldyBEYXRlKG5vdy50b0Vwb2NoTWlsbGkoKSk7CisgICAgICAgIERhdGUgZXhwaXJlc0F0ID0gbmV3IERhdGUobm93LnBsdXNTZWNvbmRzKHR0bC50b1NlY29uZHMoKSkudG9FcG9jaE1pbGxpKCkpOworCisgICAgICAgIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZShLRVlTUEFDRSkuc25hcHNob3QoU05BUFNIT1RfTk9fVFRMLCBudWxsLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG5vdyk7CisgICAgICAgIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZShLRVlTUEFDRSkuc25hcHNob3QoU05BUFNIT1RfVFRMLCBudWxsLCBmYWxzZSwgZmFsc2UsIHR0bCwgbnVsbCwgbm93KTsKKworICAgICAgICAvLyBxdWVyeSBhbGwgZnJvbSBzbmFwc2hvdHMgdmlydHVhbCB0YWJsZQorICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IHJlc3VsdCA9IGV4ZWN1dGUoIlNFTEVDVCBuYW1lLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBjcmVhdGVkX2F0LCBleHBpcmVzX2F0LCBlcGhlbWVyYWwgRlJPTSB2dHMuc25hcHNob3RzIik7CisgICAgICAgIGFzc2VydFJvd3NJZ25vcmluZ09yZGVyKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KFNOQVBTSE9UX05PX1RUTCwgS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCBjcmVhdGVkQXQsIG51bGwsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KFNOQVBTSE9UX1RUTCwgS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCBjcmVhdGVkQXQsIGV4cGlyZXNBdCwgZmFsc2UpKTsKKworICAgICAgICAvLyBxdWVyeSB3aXRoIGNvbmRpdGlvbnMKKyAgICAgICAgcmVzdWx0ID0gZXhlY3V0ZSgiU0VMRUNUIG5hbWUsIGtleXNwYWNlX25hbWUsIHRhYmxlX25hbWUsIGNyZWF0ZWRfYXQsIGV4cGlyZXNfYXQsIGVwaGVtZXJhbCBGUk9NIHZ0cy5zbmFwc2hvdHMgd2hlcmUgZXBoZW1lcmFsID0gZmFsc2UiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgcm93KFNOQVBTSE9UX05PX1RUTCwgS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCBjcmVhdGVkQXQsIG51bGwsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICByb3coU05BUFNIT1RfVFRMLCBLRVlTUEFDRSwgY3VycmVudFRhYmxlKCksIGNyZWF0ZWRBdCwgZXhwaXJlc0F0LCBmYWxzZSkpOworCisgICAgICAgIHJlc3VsdCA9IGV4ZWN1dGUoIlNFTEVDVCBuYW1lLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBjcmVhdGVkX2F0LCBleHBpcmVzX2F0LCBlcGhlbWVyYWwgRlJPTSB2dHMuc25hcHNob3RzIHdoZXJlIHNpemVfb25fZGlzayA+IDEwMDAiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgcm93KFNOQVBTSE9UX05PX1RUTCwgS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCBjcmVhdGVkQXQsIG51bGwsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICByb3coU05BUFNIT1RfVFRMLCBLRVlTUEFDRSwgY3VycmVudFRhYmxlKCksIGNyZWF0ZWRBdCwgZXhwaXJlc0F0LCBmYWxzZSkpOworCisgICAgICAgIHJlc3VsdCA9IGV4ZWN1dGUoIlNFTEVDVCBuYW1lLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBjcmVhdGVkX2F0LCBleHBpcmVzX2F0LCBlcGhlbWVyYWwgRlJPTSB2dHMuc25hcHNob3RzIHdoZXJlIG5hbWUgPSA/IiwgU05BUFNIT1RfVFRMKTsKKyAgICAgICAgYXNzZXJ0Um93cyhyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgcm93KFNOQVBTSE9UX1RUTCwgS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCBjcmVhdGVkQXQsIGV4cGlyZXNBdCwgZmFsc2UpKTsKKworICAgICAgICAvLyBjbGVhciBzb21lIHNuYXBzaG90cworICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5jbGVhclNuYXBzaG90KENvbGxlY3Rpb25zLmVtcHR5TWFwKCksIFNOQVBTSE9UX05PX1RUTCwgS0VZU1BBQ0UpOworCisgICAgICAgIHJlc3VsdCA9IGV4ZWN1dGUoIlNFTEVDVCBuYW1lLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBjcmVhdGVkX2F0LCBleHBpcmVzX2F0LCBlcGhlbWVyYWwgRlJPTSB2dHMuc25hcHNob3RzIik7CisgICAgICAgIGFzc2VydFJvd3NJZ25vcmluZ09yZGVyKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KFNOQVBTSE9UX1RUTCwgS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCBjcmVhdGVkQXQsIGV4cGlyZXNBdCwgZmFsc2UpKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvU3RyZWFtaW5nVmlydHVhbFRhYmxlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvU3RyZWFtaW5nVmlydHVhbFRhYmxlVGVzdC5qYXZhCmluZGV4IGM4ZTNkODkuLjU2ZDAxOTMgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1N0cmVhbWluZ1ZpcnR1YWxUYWJsZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TdHJlYW1pbmdWaXJ0dWFsVGFibGVUZXN0LmphdmEKQEAgLTk2LDkgKzk2LDkgQEAKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKHQoInNlbGVjdCBpZCwgZm9sbG93ZXIsIG9wZXJhdGlvbiwgcGVlcnMsIHN0YXR1cywgcHJvZ3Jlc3NfcGVyY2VudGFnZSwgbGFzdF91cGRhdGVkX2F0LCBmYWlsdXJlX2NhdXNlLCBzdWNjZXNzX21lc3NhZ2UgZnJvbSAlcyIpKSwKICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBzdGF0ZS5pZCgpLCB0cnVlLCAiUmVwYWlyIiwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksICJzdGFydCIsIDBGLCBuZXcgRGF0ZShzdGF0ZS5sYXN0VXBkYXRlZEF0TWlsbGlzKCkpLCBudWxsLCBudWxsIH0pOwogCi0gICAgICAgIHN0YXRlLmhhbmRsZVN0cmVhbUV2ZW50KG5ldyBTdHJlYW1FdmVudC5TZXNzaW9uUHJlcGFyZWRFdmVudChzdGF0ZS5pZCgpLCBuZXcgU2Vzc2lvbkluZm8oUEVFUjIsIDEsIFBFRVIxLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIFN0cmVhbVNlc3Npb24uU3RhdGUuUFJFUEFSSU5HKSwgU3RyZWFtU2Vzc2lvbi5QcmVwYXJlRGlyZWN0aW9uLkFDSykpOworICAgICAgICBzdGF0ZS5oYW5kbGVTdHJlYW1FdmVudChuZXcgU3RyZWFtRXZlbnQuU2Vzc2lvblByZXBhcmVkRXZlbnQoc3RhdGUuaWQoKSwgbmV3IFNlc3Npb25JbmZvKFBFRVIyLCAxLCBQRUVSMSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBTdHJlYW1TZXNzaW9uLlN0YXRlLlBSRVBBUklORywgbnVsbCksIFN0cmVhbVNlc3Npb24uUHJlcGFyZURpcmVjdGlvbi5BQ0spKTsKIAotICAgICAgICBzdGF0ZS5vblN1Y2Nlc3MobmV3IFN0cmVhbVN0YXRlKHN0YXRlLmlkKCksIFN0cmVhbU9wZXJhdGlvbi5SRVBBSVIsIEltbXV0YWJsZVNldC5vZihuZXcgU2Vzc2lvbkluZm8oUEVFUjIsIDEsIFBFRVIxLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIFN0cmVhbVNlc3Npb24uU3RhdGUuQ09NUExFVEUpKSkpOworICAgICAgICBzdGF0ZS5vblN1Y2Nlc3MobmV3IFN0cmVhbVN0YXRlKHN0YXRlLmlkKCksIFN0cmVhbU9wZXJhdGlvbi5SRVBBSVIsIEltbXV0YWJsZVNldC5vZihuZXcgU2Vzc2lvbkluZm8oUEVFUjIsIDEsIFBFRVIxLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIFN0cmVhbVNlc3Npb24uU3RhdGUuQ09NUExFVEUsIG51bGwpKSkpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUodCgic2VsZWN0IGlkLCBmb2xsb3dlciwgb3BlcmF0aW9uLCBwZWVycywgc3RhdHVzLCBwcm9ncmVzc19wZXJjZW50YWdlLCBsYXN0X3VwZGF0ZWRfYXQsIGZhaWx1cmVfY2F1c2UsIHN1Y2Nlc3NfbWVzc2FnZSBmcm9tICVzIikpLAogICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IHN0YXRlLmlkKCksIHRydWUsICJSZXBhaXIiLCBBcnJheXMuYXNMaXN0KGFkZHJlc3MoMTI3LCAwLCAwLCAyKS50b1N0cmluZygpKSwgInN1Y2Nlc3MiLCAxMDBGLCBuZXcgRGF0ZShzdGF0ZS5sYXN0VXBkYXRlZEF0TWlsbGlzKCkpLCBudWxsLCBudWxsIH0pOwogICAgIH0KQEAgLTEyMSw4ICsxMjEsOCBAQAogICAgICAgICBTdHJlYW1SZXN1bHRGdXR1cmUgZnV0dXJlID0gc3RhdGUuZnV0dXJlKCk7CiAgICAgICAgIHN0YXRlLnBoYXNlLnN0YXJ0KCk7CiAKLSAgICAgICAgU2Vzc2lvbkluZm8gczEgPSBuZXcgU2Vzc2lvbkluZm8oUEVFUjIsIDAsIEZCVXRpbGl0aWVzLmdldEJyb2FkY2FzdEFkZHJlc3NBbmRQb3J0KCksIEFycmF5cy5hc0xpc3Qoc3RyZWFtU3VtbWFyeSgpKSwgQXJyYXlzLmFzTGlzdChzdHJlYW1TdW1tYXJ5KCksIHN0cmVhbVN1bW1hcnkoKSksIFN0cmVhbVNlc3Npb24uU3RhdGUuUFJFUEFSSU5HKTsKLSAgICAgICAgU2Vzc2lvbkluZm8gczIgPSBuZXcgU2Vzc2lvbkluZm8oUEVFUjMsIDAsIEZCVXRpbGl0aWVzLmdldEJyb2FkY2FzdEFkZHJlc3NBbmRQb3J0KCksIEFycmF5cy5hc0xpc3Qoc3RyZWFtU3VtbWFyeSgpKSwgQXJyYXlzLmFzTGlzdChzdHJlYW1TdW1tYXJ5KCksIHN0cmVhbVN1bW1hcnkoKSksIFN0cmVhbVNlc3Npb24uU3RhdGUuUFJFUEFSSU5HKTsKKyAgICAgICAgU2Vzc2lvbkluZm8gczEgPSBuZXcgU2Vzc2lvbkluZm8oUEVFUjIsIDAsIEZCVXRpbGl0aWVzLmdldEJyb2FkY2FzdEFkZHJlc3NBbmRQb3J0KCksIEFycmF5cy5hc0xpc3Qoc3RyZWFtU3VtbWFyeSgpKSwgQXJyYXlzLmFzTGlzdChzdHJlYW1TdW1tYXJ5KCksIHN0cmVhbVN1bW1hcnkoKSksIFN0cmVhbVNlc3Npb24uU3RhdGUuUFJFUEFSSU5HLCBudWxsKTsKKyAgICAgICAgU2Vzc2lvbkluZm8gczIgPSBuZXcgU2Vzc2lvbkluZm8oUEVFUjMsIDAsIEZCVXRpbGl0aWVzLmdldEJyb2FkY2FzdEFkZHJlc3NBbmRQb3J0KCksIEFycmF5cy5hc0xpc3Qoc3RyZWFtU3VtbWFyeSgpKSwgQXJyYXlzLmFzTGlzdChzdHJlYW1TdW1tYXJ5KCksIHN0cmVhbVN1bW1hcnkoKSksIFN0cmVhbVNlc3Npb24uU3RhdGUuUFJFUEFSSU5HLCBudWxsKTsKIAogICAgICAgICAvLyB3ZSBvbmx5IHVwZGF0ZSBzdGF0cyBvbiBBQ0sKICAgICAgICAgc3RhdGUuaGFuZGxlU3RyZWFtRXZlbnQobmV3IFN0cmVhbUV2ZW50LlNlc3Npb25QcmVwYXJlZEV2ZW50KHN0YXRlLmlkKCksIHMxLCBTdHJlYW1TZXNzaW9uLlByZXBhcmVEaXJlY3Rpb24uQUNLKSk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TeXN0ZW1Qcm9wZXJ0aWVzVGFibGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TeXN0ZW1Qcm9wZXJ0aWVzVGFibGVUZXN0LmphdmEKaW5kZXggNTI0MmQ1NS4uYzhjYTliYSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvU3lzdGVtUHJvcGVydGllc1RhYmxlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1N5c3RlbVByb3BlcnRpZXNUYWJsZVRlc3QuamF2YQpAQCAtMzcsMTEgKzM3LDEzIEBACiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKIAorLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgYmVsb3cgJ2Jsb2NrU3lzdGVtUHJvcGVydHlVc2FnZScKKwogcHVibGljIGNsYXNzIFN5c3RlbVByb3BlcnRpZXNUYWJsZVRlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS1NfTkFNRSA9ICJ2dHMiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gT1JJR0lOQUxfRU5WX01BUCA9IFN5c3RlbS5nZXRlbnYoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QUk9QID0gIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWwuU3lzdGVtUHJvcGVydGllc1RhYmxlVGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUFJPUCA9ICJjYXNzYW5kcmEuU3lzdGVtUHJvcGVydGllc1RhYmxlVGVzdCI7CiAKICAgICBwcml2YXRlIFN5c3RlbVByb3BlcnRpZXNUYWJsZSB0YWJsZTsKIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RodC9LZXlDb2xsaXNpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L0tleUNvbGxpc2lvblRlc3QuamF2YQppbmRleCA1YjUzNjVkLi5jMjQ2OTBiIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L0tleUNvbGxpc2lvblRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L0tleUNvbGxpc2lvblRlc3QuamF2YQpAQCAtMjcsNiArMjcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnRlZ2VyVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwpAQCAtMzYsNiArMzcsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiAKIC8qKgpAQCAtMTI0LDUgKzEyNywxMSBAQAogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyVHlwZS5pbnN0YW5jZS5hc0NvbXBhcmFibGVCeXRlcyhJbnRlZ2VyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UodG9rZW4pLCB2ZXJzaW9uKTsKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvTGVuZ3RoUGFydGl0aW9uZXIuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvTGVuZ3RoUGFydGl0aW9uZXIuamF2YQppbmRleCBjNGU1ZGI4Li45ODU5NDg3IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L0xlbmd0aFBhcnRpdGlvbmVyLmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RodC9MZW5ndGhQYXJ0aXRpb25lci5qYXZhCkBAIC0zNCw2ICszNCw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOwogCiBwdWJsaWMgY2xhc3MgTGVuZ3RoUGFydGl0aW9uZXIgaW1wbGVtZW50cyBJUGFydGl0aW9uZXIKIHsKQEAgLTk1LDYgKzk3LDExIEBACiAgICAgICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXJUb2tlbihuZXcgQmlnSW50ZWdlcihCeXRlQnVmZmVyVXRpbC5nZXRBcnJheShieXRlcykpKTsKICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyBUb2tlbiBmcm9tQ29tcGFyYWJsZUJ5dGVzKEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmcm9tQnl0ZUFycmF5KEludGVnZXJUeXBlLmluc3RhbmNlLmZyb21Db21wYXJhYmxlQnl0ZXMoY29tcGFyYWJsZUJ5dGVzLCB2ZXJzaW9uKSk7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKFRva2VuIHRva2VuKQogICAgICAgICB7CiAgICAgICAgICAgICBCaWdJbnRlZ2VyVG9rZW4gYmlnSW50ZWdlclRva2VuID0gKEJpZ0ludGVnZXJUb2tlbikgdG9rZW47CkBAIC0xMjksMTUgKzEzNiwxNSBAQAogICAgIHB1YmxpYyBNYXA8VG9rZW4sIEZsb2F0PiBkZXNjcmliZU93bmVyc2hpcChMaXN0PFRva2VuPiBzb3J0ZWRUb2tlbnMpCiAgICAgewogICAgICAgICAvLyBhbGxUb2tlbnMgd2lsbCBjb250YWluIHRoZSBjb3VudCBhbmQgYmUgcmV0dXJuZWQsIHNvcnRlZF9yYW5nZXMgaXMgc2hvcnRoYW5kIGZvciB0b2tlbjwtPnRva2VuIG1hdGguCi0gICAgICAgIE1hcDxUb2tlbiwgRmxvYXQ+IGFsbFRva2VucyA9IG5ldyBIYXNoTWFwPFRva2VuLCBGbG9hdD4oKTsKLSAgICAgICAgTGlzdDxSYW5nZTxUb2tlbj4+IHNvcnRlZFJhbmdlcyA9IG5ldyBBcnJheUxpc3Q8UmFuZ2U8VG9rZW4+PigpOworICAgICAgICBNYXA8VG9rZW4sIEZsb2F0PiBhbGxUb2tlbnMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIExpc3Q8UmFuZ2U8VG9rZW4+PiBzb3J0ZWRSYW5nZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgICAgICAvLyB0aGlzIGluaXRpYWxpemVzIHRoZSBjb3VudHMgdG8gMCBhbmQgY2FsY3MgdGhlIHJhbmdlcyBpbiBvcmRlci4KICAgICAgICAgVG9rZW4gbGFzdFRva2VuID0gc29ydGVkVG9rZW5zLmdldChzb3J0ZWRUb2tlbnMuc2l6ZSgpIC0gMSk7CiAgICAgICAgIGZvciAoVG9rZW4gbm9kZSA6IHNvcnRlZFRva2VucykKICAgICAgICAgewotICAgICAgICAgICAgYWxsVG9rZW5zLnB1dChub2RlLCBuZXcgRmxvYXQoMC4wKSk7Ci0gICAgICAgICAgICBzb3J0ZWRSYW5nZXMuYWRkKG5ldyBSYW5nZTxUb2tlbj4obGFzdFRva2VuLCBub2RlKSk7CisgICAgICAgICAgICBhbGxUb2tlbnMucHV0KG5vZGUsIDAuMEYpOworICAgICAgICAgICAgc29ydGVkUmFuZ2VzLmFkZChuZXcgUmFuZ2U8PihsYXN0VG9rZW4sIG5vZGUpKTsKICAgICAgICAgICAgIGxhc3RUb2tlbiA9IG5vZGU7CiAgICAgICAgIH0KIApAQCAtMTU0LDcgKzE2MSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBTdW0gZXZlcnkgY291bnQgdXAgYW5kIGRpdmlkZSBjb3VudC90b3RhbCBmb3IgdGhlIGZyYWN0aW9uYWwgb3duZXJzaGlwLgotICAgICAgICBGbG9hdCB0b3RhbCA9IG5ldyBGbG9hdCgwLjApOworICAgICAgICBGbG9hdCB0b3RhbCA9IDAuMEY7CiAgICAgICAgIGZvciAoRmxvYXQgZiA6IGFsbFRva2Vucy52YWx1ZXMoKSkKICAgICAgICAgICAgIHRvdGFsICs9IGY7CiAgICAgICAgIGZvciAoTWFwLkVudHJ5PFRva2VuLCBGbG9hdD4gcm93IDogYWxsVG9rZW5zLmVudHJ5U2V0KCkpCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L3Rva2VuYWxsb2NhdG9yL09mZmxpbmVUb2tlbkFsbG9jYXRvclRlc3RVdGlscy5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RodC90b2tlbmFsbG9jYXRvci9PZmZsaW5lVG9rZW5BbGxvY2F0b3JUZXN0VXRpbHMuamF2YQppbmRleCBlNTgwNDYxLi5jMTM5NzYwIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L3Rva2VuYWxsb2NhdG9yL09mZmxpbmVUb2tlbkFsbG9jYXRvclRlc3RVdGlscy5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvdG9rZW5hbGxvY2F0b3IvT2ZmbGluZVRva2VuQWxsb2NhdG9yVGVzdFV0aWxzLmphdmEKQEAgLTkxLDEzICs5MSwxMyBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHdhcm4oU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRoKQorICAgICAgICBwdWJsaWMgdm9pZCB3YXJuKFRocm93YWJsZSB0aCwgU3RyaW5nIG1zZykKICAgICAgICAgewogICAgICAgICAgICAgLy8gV2UgY2FuIG9ubHkgZ3VhcmFudGVlIHRoYXQgb3duZXJzaGlwIHN0ZGV2IHdvbid0IGluY3JlYXNlIGFib3ZlIHRoZSB3YXJuIHRocmVzaG9sZCBmb3IgcmFja3M9PTEgb3IgcmFja3M9PXJmCiAgICAgICAgICAgICBpZiAocmFja3MgPT0gMSB8fCByYWNrcyA9PSByZikKICAgICAgICAgICAgICAgICBmYWlsKG1zZyk7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc3VwZXIud2Fybihtc2csIHRoKTsKKyAgICAgICAgICAgICAgICBzdXBlci53YXJuKHRoLCBtc2cpOwogICAgICAgICB9CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaWFnL3N0b3JlL0RpYWdub3N0aWNFdmVudE1lbW9yeVN0b3JlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RpYWcvc3RvcmUvRGlhZ25vc3RpY0V2ZW50TWVtb3J5U3RvcmVUZXN0LmphdmEKaW5kZXggNWU4OTdiNi4uOTY0NzUxOSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RpYWcvc3RvcmUvRGlhZ25vc3RpY0V2ZW50TWVtb3J5U3RvcmVUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RpYWcvc3RvcmUvRGlhZ25vc3RpY0V2ZW50TWVtb3J5U3RvcmVUZXN0LmphdmEKQEAgLTY2LDE1ICs2NiwxNSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzLnNpemUoKSk7CiAKICAgICAgICAgTWFwLkVudHJ5PExvbmcsIERpYWdub3N0aWNFdmVudD4gZW50cnkgPSByZXMucG9sbEZpcnN0RW50cnkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMb25nKDEpLCBlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLnZhbHVlT2YoMSksIGVudHJ5LmdldEtleSgpKTsKICAgICAgICAgYXNzZXJ0U2FtZShlMSwgZW50cnkuZ2V0VmFsdWUoKSk7CiAKICAgICAgICAgZW50cnkgPSByZXMucG9sbEZpcnN0RW50cnkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMb25nKDIpLCBlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLnZhbHVlT2YoMiksIGVudHJ5LmdldEtleSgpKTsKICAgICAgICAgYXNzZXJ0U2FtZShlMiwgZW50cnkuZ2V0VmFsdWUoKSk7CiAKICAgICAgICAgZW50cnkgPSByZXMucG9sbEZpcnN0RW50cnkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMb25nKDMpLCBlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLnZhbHVlT2YoMyksIGVudHJ5LmdldEtleSgpKTsKICAgICAgICAgYXNzZXJ0U2FtZShlMywgZW50cnkuZ2V0VmFsdWUoKSk7CiAgICAgfQogCkBAIC05NSwxMSArOTUsMTEgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJlcy5zaXplKCkpOwogCiAgICAgICAgIE1hcC5FbnRyeTxMb25nLCBEaWFnbm9zdGljRXZlbnQ+IGVudHJ5ID0gcmVzLnBvbGxGaXJzdEVudHJ5KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuZXcgTG9uZygxKSwgZW50cnkuZ2V0S2V5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9uZy52YWx1ZU9mKDEpLCBlbnRyeS5nZXRLZXkoKSk7CiAgICAgICAgIGFzc2VydFNhbWUoZTEsIGVudHJ5LmdldFZhbHVlKCkpOwogCiAgICAgICAgIGVudHJ5ID0gcmVzLnBvbGxMYXN0RW50cnkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMb25nKDIpLCBlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLnZhbHVlT2YoMiksIGVudHJ5LmdldEtleSgpKTsKICAgICAgICAgYXNzZXJ0U2FtZShlMiwgZW50cnkuZ2V0VmFsdWUoKSk7CiAgICAgfQogCkBAIC0xMjIsMTEgKzEyMiwxMSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcmVzLnNpemUoKSk7CiAKICAgICAgICAgTWFwLkVudHJ5PExvbmcsIERpYWdub3N0aWNFdmVudD4gZW50cnkgPSByZXMucG9sbEZpcnN0RW50cnkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMb25nKDIpLCBlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLnZhbHVlT2YoMiksIGVudHJ5LmdldEtleSgpKTsKICAgICAgICAgYXNzZXJ0U2FtZShlMiwgZW50cnkuZ2V0VmFsdWUoKSk7CiAKICAgICAgICAgZW50cnkgPSByZXMucG9sbExhc3RFbnRyeSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExvbmcoMyksIGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvbmcudmFsdWVPZigzKSwgZW50cnkuZ2V0S2V5KCkpOwogICAgICAgICBhc3NlcnRTYW1lKGUzLCBlbnRyeS5nZXRWYWx1ZSgpKTsKICAgICB9CiAKQEAgLTE1MSwxMSArMTUxLDExIEBACiAgICAgICAgIGFzc2VydEVxdWFscygyLCByZXMuc2l6ZSgpKTsKIAogICAgICAgICBNYXAuRW50cnk8TG9uZywgRGlhZ25vc3RpY0V2ZW50PiBlbnRyeSA9IHJlcy5wb2xsRmlyc3RFbnRyeSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExvbmcoNCksIGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvbmcudmFsdWVPZig0KSwgZW50cnkuZ2V0S2V5KCkpOwogICAgICAgICBhc3NlcnRTYW1lKGUyLCBlbnRyeS5nZXRWYWx1ZSgpKTsKIAogICAgICAgICBlbnRyeSA9IHJlcy5wb2xsRmlyc3RFbnRyeSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExvbmcoNSksIGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvbmcudmFsdWVPZig1KSwgZW50cnkuZ2V0S2V5KCkpOwogICAgICAgICBhc3NlcnRTYW1lKGUzLCBlbnRyeS5nZXRWYWx1ZSgpKTsKIAogICAgICAgICBzdG9yZS5zdG9yZShuZXcgVGVzdEV2ZW50MSgpKTsgLy8gNwpAQCAtMTY0LDcgKzE2NCw3IEBACiAKICAgICAgICAgcmVzID0gc3RvcmUuc2Nhbig0TCwgMik7CiAgICAgICAgIGFzc2VydEVxdWFscygyLCByZXMuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMb25nKDcpLCByZXMucG9sbEZpcnN0RW50cnkoKS5nZXRLZXkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuZXcgTG9uZyg4KSwgcmVzLnBvbGxMYXN0RW50cnkoKS5nZXRLZXkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLnZhbHVlT2YoNyksIHJlcy5wb2xsRmlyc3RFbnRyeSgpLmdldEtleSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvbmcudmFsdWVPZig4KSwgcmVzLnBvbGxMYXN0RW50cnkoKS5nZXRLZXkoKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9GYWlsdXJlRGV0ZWN0b3JUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL0ZhaWx1cmVEZXRlY3RvclRlc3QuamF2YQppbmRleCA3N2ZhYmVmLi44ZWMzZGFlIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL0ZhaWx1cmVEZXRlY3RvclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL0ZhaWx1cmVEZXRlY3RvclRlc3QuamF2YQpAQCAtMzcsNiArMzcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuVG9rZW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTUFYX0xPQ0FMX1BBVVNFX0lOX01TOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogCiBwdWJsaWMgY2xhc3MgRmFpbHVyZURldGVjdG9yVGVzdApAQCAtNDUsNyArNDYsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpCiAgICAgewogICAgICAgICAvLyBzbG93IHVuaXQgdGVzdHMgY2FuIGNhdXNlIHByb2JsZW1zIHdpdGggRmFpbHVyZURldGVjdG9yJ3MgR0MgcGF1c2UgaGFuZGxpbmcKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEubWF4X2xvY2FsX3BhdXNlX2luX21zIiwgIjIwMDAwIik7CisgICAgICAgIE1BWF9MT0NBTF9QQVVTRV9JTl9NUy5zZXRMb25nKDIwMDAwKTsKIAogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKICAgICAgICAgQ29tbWl0TG9nLmluc3RhbmNlLnN0YXJ0KCk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL0dvc3NpcGVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9Hb3NzaXBlclRlc3QuamF2YQppbmRleCA2ODg0MWVhLi40NjE0ODM2IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL0dvc3NpcGVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9nbXMvR29zc2lwZXJUZXN0LmphdmEKQEAgLTIyLDEyICsyMiwxNSBAQAogaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlVVSUQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLm5ldC5JbmV0QWRkcmVzc2VzOwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKQEAgLTQ2LDIwICs0OSwyNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuU2VlZFByb3ZpZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuVG9rZW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNhc3NhbmRyYUdlbmVyYXRvcnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2Fzc2FuZHJhVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKK2ltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOworaW1wb3J0IG9yZy5xdWlja3RoZW9yaWVzLmNvcmUuR2VuOworaW1wb3J0IG9yZy5xdWlja3RoZW9yaWVzLmltcGwuQ29uc3RyYWludDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkdPU1NJUF9ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLnF1aWNrdGhlb3JpZXMuUXVpY2tUaGVvcnkucXQ7CiAKIHB1YmxpYyBjbGFzcyBHb3NzaXBlclRlc3QKIHsKICAgICBzdGF0aWMKICAgICB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShHb3NzaXBlci5Qcm9wcy5ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OLCAidHJ1ZSIpOworICAgICAgICBHT1NTSVBfRElTQUJMRV9USFJFQURfVkFMSURBVElPTi5zZXRCb29sZWFuKHRydWUpOwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKICAgICAgICAgQ29tbWl0TG9nLmluc3RhbmNlLnN0YXJ0KCk7CiAgICAgfQpAQCAtNDE5LDYgKzQyOCw4OSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBvcmRlcmluZ0NvbXBhcmF0b3IoKQorICAgIHsKKyAgICAgICAgcXQoKS5mb3JBbGwoZXBTdGF0ZU1hcEdlbigpKS5jaGVja0Fzc2VydChtYXAgLT4geworICAgICAgICAgICAgQ29tcGFyYXRvcjxNYXAuRW50cnk8SW5ldEFkZHJlc3NBbmRQb3J0LCBFbmRwb2ludFN0YXRlPj4gY29tcCA9IEdvc3NpcGVyLnN0YXRlT3JkZXJNYXAoKTsKKyAgICAgICAgICAgIExpc3Q8TWFwLkVudHJ5PEluZXRBZGRyZXNzQW5kUG9ydCwgRW5kcG9pbnRTdGF0ZT4+IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDw+KG1hcC5lbnRyeVNldCgpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBlbGVtZW50cy5zaXplKCk7IGorKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxJbmV0QWRkcmVzc0FuZFBvcnQsIEVuZHBvaW50U3RhdGU+IGUxID0gZWxlbWVudHMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGUxQm9vdHN0cmFwcGluZyA9IFZlcnNpb25lZFZhbHVlLkJPT1RTVFJBUFBJTkdfU1RBVFVTLmNvbnRhaW5zKEdvc3NpcGVyLmdldEdvc3NpcFN0YXR1cyhlMS5nZXRWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxJbmV0QWRkcmVzc0FuZFBvcnQsIEVuZHBvaW50U3RhdGU+IGUyID0gZWxlbWVudHMuZ2V0KGopOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGUyQm9vdHN0cmFwcGluZyA9IFZlcnNpb25lZFZhbHVlLkJPT1RTVFJBUFBJTkdfU1RBVFVTLmNvbnRhaW5zKEdvc3NpcGVyLmdldEdvc3NpcFN0YXR1cyhlMi5nZXRWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIE9yZGVyaW5nIG9yZGVyaW5nID0gT3JkZXJpbmcuY29tcGFyZShjb21wLCBlMSwgZTIpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChlMUJvb3RzdHJhcHBpbmcgPT0gZTJCb290c3RyYXBwaW5nKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBnZW5lcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBPcmRlcmluZyBzdWIgPSBPcmRlcmluZy5jb21wYXJlKGUxLmdldFZhbHVlKCkuZ2V0SGVhcnRCZWF0U3RhdGUoKS5nZXRHZW5lcmF0aW9uKCksIGUyLmdldFZhbHVlKCkuZ2V0SGVhcnRCZWF0U3RhdGUoKS5nZXRHZW5lcmF0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YiA9PSBPcmRlcmluZy5FUSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBhZGRyZXNzV1BvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBPcmRlcmluZy5jb21wYXJlKGUxLmdldEtleSgpLCBlMi5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQob3JkZXJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlZEFzKCJCb3RoIGVsZW1lbnRzIGJvb3RzdHJhcCBjaGVjayB3ZXJlIGVxdWFsOiAlcyA9PSAlcyIsIGUxQm9vdHN0cmFwcGluZywgZTJCb290c3RyYXBwaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oc3ViKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlMUJvb3RzdHJhcHBpbmcpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChvcmRlcmluZykuaXNFcXVhbFRvKE9yZGVyaW5nLkdUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChvcmRlcmluZykuaXNFcXVhbFRvKE9yZGVyaW5nLkxUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgZW51bSBPcmRlcmluZworICAgIHsKKyAgICAgICAgTFQsIEVRLCBHVDsKKworICAgICAgICBzdGF0aWMgPFQ+IE9yZGVyaW5nIGNvbXBhcmUoQ29tcGFyYXRvcjxUPiBjb21wYXJhdG9yLCBUIGEsIFQgYikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHJjID0gY29tcGFyYXRvci5jb21wYXJlKGEsIGIpOworICAgICAgICAgICAgaWYgKHJjIDwgMCkgcmV0dXJuIExUOworICAgICAgICAgICAgaWYgKHJjID09IDApIHJldHVybiBFUTsKKyAgICAgICAgICAgIHJldHVybiBHVDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyA8VCBleHRlbmRzIENvbXBhcmFibGU8VD4+IE9yZGVyaW5nIGNvbXBhcmUoVCBhLCBUIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wYXJlKENvbXBhcmF0b3IubmF0dXJhbE9yZGVyKCksIGEsIGIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgR2VuPE1hcDxJbmV0QWRkcmVzc0FuZFBvcnQsIEVuZHBvaW50U3RhdGU+PiBlcFN0YXRlTWFwR2VuKCkKKyAgICB7CisgICAgICAgIEdlbjxJbmV0QWRkcmVzc0FuZFBvcnQ+IGFkZHJlc3NBbmRQb3J0cyA9IENhc3NhbmRyYUdlbmVyYXRvcnMuSU5FVF9BRERSRVNTX0FORF9QT1JUX0dFTjsKKyAgICAgICAgR2VuPEVuZHBvaW50U3RhdGU+IHN0YXRlcyA9IENhc3NhbmRyYUdlbmVyYXRvcnMuZW5kcG9pbnRTdGF0ZXMoKTsKKyAgICAgICAgQ29uc3RyYWludCBzaXplR2VuID0gQ29uc3RyYWludC5iZXR3ZWVuKDIsIDEwKTsKKyAgICAgICAgR2VuPE1hcDxJbmV0QWRkcmVzc0FuZFBvcnQsIEVuZHBvaW50U3RhdGU+PiBtYXBHZW4gPSBycyAtPiB7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IE1hdGgudG9JbnRFeGFjdChycy5uZXh0KHNpemVHZW4pKTsKKyAgICAgICAgICAgIE1hcDxJbmV0QWRkcmVzc0FuZFBvcnQsIEVuZHBvaW50U3RhdGU+IG1hcCA9IE1hcHMubmV3SGFzaE1hcFdpdGhFeHBlY3RlZFNpemUoc2l6ZSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzQW5kUG9ydCBhZGRyZXNzID0gYWRkcmVzc0FuZFBvcnRzLmdlbmVyYXRlKHJzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC5jb250YWluc0tleShhZGRyZXNzKSkgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoYWRkcmVzcywgc3RhdGVzLmdlbmVyYXRlKHJzKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtYXA7CisgICAgICAgIH07CisgICAgICAgIHJldHVybiBtYXBHZW47CisgICAgfQorCiAgICAgc3RhdGljIGNsYXNzIFNpbXBsZVN0YXRlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJRW5kcG9pbnRTdGF0ZUNoYW5nZVN1YnNjcmliZXIKICAgICB7CiAgICAgICAgIHN0YXRpYyBjbGFzcyBPbkNoYW5nZVBhcmFtcwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9QZW5kaW5nUmFuZ2VDYWxjdWxhdG9yU2VydmljZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9nbXMvUGVuZGluZ1JhbmdlQ2FsY3VsYXRvclNlcnZpY2VUZXN0LmphdmEKaW5kZXggMGQ2ZDE5OS4uMWY3NTg3NiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9QZW5kaW5nUmFuZ2VDYWxjdWxhdG9yU2VydmljZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL1BlbmRpbmdSYW5nZUNhbGN1bGF0b3JTZXJ2aWNlVGVzdC5qYXZhCkBAIC0zOSw2ICszOSw3IEBACiBpbXBvcnQgb3JnLmpib3NzLmJ5dGVtYW4uY29udHJpYi5ibXVuaXQuQk1SdWxlOwogaW1wb3J0IG9yZy5qYm9zcy5ieXRlbWFuLmNvbnRyaWIuYm11bml0LkJNVW5pdFJ1bm5lcjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkdPU1NJUF9ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIApAQCAtNTQsNyArNTUsNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcCgpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoR29zc2lwZXIuUHJvcHMuRElTQUJMRV9USFJFQURfVkFMSURBVElPTiwgInRydWUiKTsKKyAgICAgICAgR09TU0lQX0RJU0FCTEVfVEhSRUFEX1ZBTElEQVRJT04uc2V0Qm9vbGVhbih0cnVlKTsKICAgICAgICAgU2NoZW1hTG9hZGVyLnByZXBhcmVTZXJ2ZXIoKTsKICAgICAgICAgU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuaW5pdFNlcnZlcigpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9nbXMvU2hhZG93Um91bmRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL1NoYWRvd1JvdW5kVGVzdC5qYXZhCmluZGV4IDM4MWVkYjguLjMzZDlhMTIgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9nbXMvU2hhZG93Um91bmRUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9TaGFkb3dSb3VuZFRlc3QuamF2YQpAQCAtMzMsMTEgKzMzLDExIEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TeXN0ZW1LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5XaXRoUHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JRW5kcG9pbnRTbml0Y2g7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CkBAIC00OSw2ICs0OSw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkFVVE9fQk9PVFNUUkFQOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9DT05GSUc7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5Nb2NrTWVzc2FnaW5nU2VydmljZS52ZXJiOwogaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwpAQCAtNjEsNyArNjMsNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcCgpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5jb25maWciLCAiY2Fzc2FuZHJhLXNlZWRzLnlhbWwiKTsKKyAgICAgICAgQ0FTU0FORFJBX0NPTkZJRy5zZXRTdHJpbmcoImNhc3NhbmRyYS1zZWVkcy55YW1sIik7CiAKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CiAgICAgICAgIENvbW1pdExvZy5pbnN0YW5jZS5zdGFydCgpOwpAQCAtMTcxLDggKzE3Myw3IEBACiAgICAgICAgICAgICAgICAgfSwgMSk7CiAKIAotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJhdXRvX2Jvb3RzdHJhcCIsICJmYWxzZSIpOwotICAgICAgICB0cnkKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KEFVVE9fQk9PVFNUUkFQLCBmYWxzZSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmNoZWNrRm9yRW5kcG9pbnRDb2xsaXNpb24oU3lzdGVtS2V5c3BhY2UuZ2V0T3JJbml0aWFsaXplTG9jYWxIb3N0SWQoKSwgU3lzdGVtS2V5c3BhY2UubG9hZEhvc3RJZHMoKS5rZXlTZXQoKSk7CiAgICAgICAgIH0KQEAgLTE4MCw3ICsxODEsNiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlVuYWJsZSB0byBnb3NzaXAgd2l0aCBhbnkgcGVlcnMiLCBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgIH0KLSAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJhdXRvX2Jvb3RzdHJhcCIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yMDksOSArMjA5LDEwIEBACiAgICAgICAgICAgICAgICAgfSwgMSk7CiAKIAotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJhdXRvX2Jvb3RzdHJhcCIsICJmYWxzZSIpOwotICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5jaGVja0ZvckVuZHBvaW50Q29sbGlzaW9uKFN5c3RlbUtleXNwYWNlLmdldE9ySW5pdGlhbGl6ZUxvY2FsSG9zdElkKCksIFN5c3RlbUtleXNwYWNlLmxvYWRIb3N0SWRzKCkua2V5U2V0KCkpOwotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eShDb25maWcuUFJPUEVSVFlfUFJFRklYICsgImF1dG9fYm9vdHN0cmFwIik7CisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChBVVRPX0JPT1RTVFJBUCwgZmFsc2UpKQorICAgICAgICB7CisgICAgICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5jaGVja0ZvckVuZHBvaW50Q29sbGlzaW9uKFN5c3RlbUtleXNwYWNlLmdldE9ySW5pdGlhbGl6ZUxvY2FsSG9zdElkKCksIFN5c3RlbUtleXNwYWNlLmxvYWRIb3N0SWRzKCkua2V5U2V0KCkpOworICAgICAgICB9CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvQ2hlY2tzdW1tZWREYXRhSW5wdXRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvQ2hlY2tzdW1tZWREYXRhSW5wdXRUZXN0LmphdmEKaW5kZXggY2MyOTE2My4uZGE5ZjdkZCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0NoZWNrc3VtbWVkRGF0YUlucHV0VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9DaGVja3N1bW1lZERhdGFJbnB1dFRlc3QuamF2YQpAQCAtMTcsMjcgKzE3LDE5IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGludHM7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRCdWZmZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SYW5kb21BY2Nlc3NSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKIAogcHVibGljIGNsYXNzIENoZWNrc3VtbWVkRGF0YUlucHV0VGVzdAogewpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0RUZXN0U2VyaWFsaXplci5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0RUZXN0U2VyaWFsaXplci5qYXZhCmluZGV4IDYxYmQ3N2MuLjAyMjFjNTIgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9EVGVzdFNlcmlhbGl6ZXIuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvRFRlc3RTZXJpYWxpemVyLmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIFVVSURTZXJpYWxpemVyLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG1lc3NhZ2UuaG9zdElkLCBvdXQsIHZlcnNpb24pOwotICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoMCk7CisgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKDApOwogICAgICAgICBtZXNzYWdlLnVua25vd25UYWJsZUlELnNlcmlhbGl6ZShvdXQpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0hpbnRXcml0ZVRUTFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9IaW50V3JpdGVUVExUZXN0LmphdmEKaW5kZXggZTI0ZmY3Ni4uZjgxNDI0NSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0hpbnRXcml0ZVRUTFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvSGludFdyaXRlVFRMVGVzdC5qYXZhCkBAIC00NCw2ICs0NCw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfTUFYX0hJTlRfVFRMOworCiBwdWJsaWMgY2xhc3MgSGludFdyaXRlVFRMVGVzdAogewogICAgIHByaXZhdGUgc3RhdGljIGludCBUVEwgPSA1MDA7CkBAIC04NCw3ICs4Niw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5tYXhIaW50VFRMIiwgSW50ZWdlci50b1N0cmluZyhUVEwpKTsKKyAgICAgICAgQ0FTU0FORFJBX01BWF9ISU5UX1RUTC5zZXRJbnQoVFRMKTsKICAgICAgICAgU2NoZW1hTG9hZGVyLnByZXBhcmVTZXJ2ZXIoKTsKICAgICAgICAgVGFibGVNZXRhZGF0YSB0Ym0gPSBDcmVhdGVUYWJsZVN0YXRlbWVudC5wYXJzZSgiQ1JFQVRFIFRBQkxFIHRibCAoayBJTlQgUFJJTUFSWSBLRVksIHYgSU5UKSIsICJrcyIpLmdjR3JhY2VTZWNvbmRzKEdDX0dSQUNFKS5idWlsZCgpOwogICAgICAgICBTY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2UoImtzIiwgS2V5c3BhY2VQYXJhbXMuc2ltcGxlKDEpLCB0Ym0pOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L3Nhc2kvU0FTSUluZGV4VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L3Nhc2kvU0FTSUluZGV4VGVzdC5qYXZhCmluZGV4IDQ0MWQ3YjAuLjNjMzMzMjcgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL1NBU0lJbmRleFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9TQVNJSW5kZXhUZXN0LmphdmEKQEAgLTI0LDEwICsyNCwyMSBAQAogaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVN5c3RlbXM7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKIGltcG9ydCBqYXZhLm5pby5maWxlLlN0YW5kYXJkT3Blbk9wdGlvbjsKIGltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5CYXNpY0ZpbGVBdHRyaWJ1dGVzOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IGphdmEudXRpbC5VVUlEOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkTG9jYWxSYW5kb207CkBAIC0zNiwzNSArNDcsNTggQEAKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlVuaW50ZXJydXB0aWJsZXM7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5PcGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVW50eXBlZFJlc3VsdFNldDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguSW5kZXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5UZXJtOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVW50eXBlZFJlc3VsdFNldDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkluZGV4VGFyZ2V0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRhdGFSYW5nZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuTXV0YXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUGFydGl0aW9uUmFuZ2VSZWFkQ29tbWFuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWFkQ29tbWFuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWFkRXhlY3V0aW9uQ29udHJvbGxlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5EYXRhTGltaXRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Sb3dGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5TU1RhYmxlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFzY2lpVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkxpc3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5WYWx1ZUFjY2Vzc29yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uVXBkYXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkJUcmVlUm93OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQnVmZmVyQ2VsbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTXVybXVyM1BhcnRpdGlvbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5JbmRleDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpLmFuYWx5emVyLkFic3RyYWN0QW5hbHl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguc2FzaS5hbmFseXplci5EZWxpbWl0ZXJBbmFseXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpLmFuYWx5emVyLk5vT3BBbmFseXplcjsKQEAgLTgwLDExICsxMTQsMTYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpLnV0aWxzLlJhbmdlSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSW5kZXhTdW1tYXJ5TWFuYWdlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5pbmRleHN1bW1hcnkuSW5kZXhTdW1tYXJ5TWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5JbmRleE1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLk1hcnNoYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuVHlwZVNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5zbmFwc2hvdC5TbmFwc2hvdE1hbmlmZXN0OwpAQCAtOTQsMTMgKzEzMyw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKIGltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5VbmludGVycnVwdGlibGVzOwotCi1pbXBvcnQgb3JnLmp1bml0Lio7Ci0KIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlMTElTRUNPTkRTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9DT05GSUc7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlVGVzdC5nZXRTbmFwc2hvdE1hbmlmZXN0QW5kU2NoZW1hRmlsZVNpemVzOwogCiBwdWJsaWMgY2xhc3MgU0FTSUluZGV4VGVzdApAQCAtMTA4LDcgKzE0Miw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVBhcnRpdGlvbmVyIFBBUlRJVElPTkVSOwogCiAgICAgc3RhdGljIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuY29uZmlnIiwgImNhc3NhbmRyYS1tdXJtdXIueWFtbCIpOworICAgICAgICBDQVNTQU5EUkFfQ09ORklHLnNldFN0cmluZygiY2Fzc2FuZHJhLW11cm11ci55YW1sIik7CiAgICAgICAgIFBBUlRJVElPTkVSID0gTXVybXVyM1BhcnRpdGlvbmVyLmluc3RhbmNlOwogICAgIH0KIApAQCAtMTkyLDcgKzIyNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmdldEtleXNwYWNlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5nZXRDb2x1bW5GYW1pbHlOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmRlc2NyaXB0b3IuaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmRlc2NyaXB0b3IuZm9ybWF0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmRlc2NyaXB0b3IudmVyc2lvbi5mb3JtYXQpOwogCiAgICAgICAgICAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IHNuYXBzaG90U1NUYWJsZXMuZ2V0KHNuYXBzaG90U1NUYWJsZSk7CiAKQEAgLTIwMSw4ICsyMzUsOCBAQAogCiAgICAgICAgICAgICAgICAgZm9yIChDb21wb25lbnQgYyA6IGNvbXBvbmVudHMpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb25nIGNvbXBvbmVudFNpemUgPSBGaWxlcy5zaXplKFBhdGhzLmdldChzbmFwc2hvdFNTVGFibGUuZmlsZW5hbWVGb3IoYykpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKENvbXBvbmVudC5UeXBlLmZyb21SZXByZXNlbnRhdGlvbihjLm5hbWUpID09IENvbXBvbmVudC5UeXBlLlNFQ09OREFSWV9JTkRFWCkKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBjb21wb25lbnRTaXplID0gc25hcHNob3RTU1RhYmxlLmZpbGVGb3IoYykubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChDb21wb25lbnQuVHlwZS5mcm9tUmVwcmVzZW50YXRpb24oYy5uYW1lLCBzc3RhYmxlLmRlc2NyaXB0b3IudmVyc2lvbi5mb3JtYXQpID09IENvbXBvbmVudHMuVHlwZXMuU0VDT05EQVJZX0lOREVYKQogICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhTaXplICs9IGNvbXBvbmVudFNpemU7CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlU2l6ZSArPSBjb21wb25lbnRTaXplOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L3Nhc2kvZGlzay9QZXJTU1RhYmxlSW5kZXhXcml0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9kaXNrL1BlclNTVGFibGVJbmRleFdyaXRlclRlc3QuamF2YQppbmRleCBhZDBjYWZmLi42NzA3YWE1IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9kaXNrL1BlclNTVGFibGVJbmRleFdyaXRlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9kaXNrL1BlclNTVGFibGVJbmRleFdyaXRlclRlc3QuamF2YQpAQCAtMTgsMjUgKzE4LDM4IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kuZGlzazsKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRMb2NhbFJhbmRvbTsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5GdXR1cmVzOworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkxvbmdUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5CVHJlZVJvdzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkJ1ZmZlckNlbGw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kuU0FTSUluZGV4OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kudXRpbHMuUmFuZ2VJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVURjhUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU0Vycm9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CkBAIC00OSwxMSArNjIsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRnV0dXJlczsKLQotaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9DT05GSUc7CiAKIHB1YmxpYyBjbGFzcyBQZXJTU1RhYmxlSW5kZXhXcml0ZXJUZXN0IGV4dGVuZHMgU2NoZW1hTG9hZGVyCiB7CkBAIC02Myw3ICs3Miw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGxvYWRTY2hlbWEoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuY29uZmlnIiwgImNhc3NhbmRyYS1tdXJtdXIueWFtbCIpOworICAgICAgICBDQVNTQU5EUkFfQ09ORklHLnNldFN0cmluZygiY2Fzc2FuZHJhLW11cm11ci55YW1sIik7CiAgICAgICAgIFNjaGVtYUxvYWRlci5sb2FkU2NoZW1hKCk7CiAgICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlTmV3S2V5c3BhY2UoS2V5c3BhY2VNZXRhZGF0YS5jcmVhdGUoS1NfTkFNRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGVUcmFuc2llbnQoMSksCkBAIC0xMTIsNyArMTIxLDkgQEAKIAogICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxEZWNvcmF0ZWRLZXksIFJvdz4ga2V5ID0ga2V5SXRlcmF0b3IubmV4dCgpOwogCi0gICAgICAgICAgICAgICAgaW5kZXhXcml0ZXIuc3RhcnRQYXJ0aXRpb24oa2V5LmdldEtleSgpLCBwb3NpdGlvbisrKTsKKworICAgICAgICAgICAgICAgIGluZGV4V3JpdGVyLnN0YXJ0UGFydGl0aW9uKGtleS5nZXRLZXkoKSwgcG9zaXRpb24sIHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBwb3NpdGlvbisrOwogICAgICAgICAgICAgICAgIGluZGV4V3JpdGVyLm5leHRVbmZpbHRlcmVkQ2x1c3RlcihrZXkuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICB9CiAKQEAgLTEyNiw3ICsxMzcsNyBAQAogICAgICAgICBmb3IgKFN0cmluZyBzZWdtZW50IDogc2VnbWVudHMpCiAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShuZXcgRmlsZShzZWdtZW50KS5leGlzdHMoKSk7CiAKLSAgICAgICAgU3RyaW5nIGluZGV4RmlsZSA9IGluZGV4V3JpdGVyLmluZGV4ZXMuZ2V0KGNvbHVtbikuZmlsZW5hbWUodHJ1ZSk7CisgICAgICAgIEZpbGUgaW5kZXhGaWxlID0gaW5kZXhXcml0ZXIuaW5kZXhlcy5nZXQoY29sdW1uKS5maWxlKHRydWUpOwogCiAgICAgICAgIC8vIGZpbmFsIGZsdXNoCiAgICAgICAgIGluZGV4V3JpdGVyLmNvbXBsZXRlKCk7CkBAIC0xMzQsNyArMTQ1LDcgQEAKICAgICAgICAgZm9yIChTdHJpbmcgc2VnbWVudCA6IHNlZ21lbnRzKQogICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG5ldyBGaWxlKHNlZ21lbnQpLmV4aXN0cygpKTsKIAotICAgICAgICBPbkRpc2tJbmRleCBpbmRleCA9IG5ldyBPbkRpc2tJbmRleChuZXcgRmlsZShpbmRleEZpbGUpLCBJbnQzMlR5cGUuaW5zdGFuY2UsIGtleVBvc2l0aW9uIC0+IHsKKyAgICAgICAgT25EaXNrSW5kZXggaW5kZXggPSBuZXcgT25EaXNrSW5kZXgoaW5kZXhGaWxlLCBJbnQzMlR5cGUuaW5zdGFuY2UsIGtleVBvc2l0aW9uIC0+IHsKICAgICAgICAgICAgIEJ5dGVCdWZmZXIga2V5ID0gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoU3RyaW5nLmZvcm1hdChrZXlGb3JtYXQsIGtleVBvc2l0aW9uKSk7CiAgICAgICAgICAgICByZXR1cm4gY2ZzLm1ldGFkYXRhKCkucGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoa2V5KTsKICAgICAgICAgfSk7CkBAIC0yMzMsNyArMjQ0LDcgQEAKICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShuZXcgRmlsZShzZWdtZW50KS5leGlzdHMoKSk7CiAKICAgICAgICAgLy8gYW5kIGNvbWJpbmVkIGluZGV4IGRvZXNuJ3QgZXhpc3QgZWl0aGVyCi0gICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShuZXcgRmlsZShpbmRleC5vdXRwdXRGaWxlKS5leGlzdHMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShpbmRleC5vdXRwdXRGaWxlLmV4aXN0cygpKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlU2VnbWVudChUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBQZXJTU1RhYmxlSW5kZXhXcml0ZXIuSW5kZXggaW5kZXgsIE1hcDxMb25nLCBTZXQ8SW50ZWdlcj4+IGRhdGEpCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9wbGFuL09wZXJhdGlvblRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL3BsYW4vT3BlcmF0aW9uVGVzdC5qYXZhCmluZGV4IDg2MjBmNWMuLjVmZmViY2MgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL3BsYW4vT3BlcmF0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL3BsYW4vT3BlcmF0aW9uVGVzdC5qYXZhCkBAIC00Myw2ICs0Myw4IEBACiAKIGltcG9ydCBvcmcuanVuaXQuKjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9DT05GSUc7CisKIHB1YmxpYyBjbGFzcyBPcGVyYXRpb25UZXN0IGV4dGVuZHMgU2NoZW1hTG9hZGVyCiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtTX05BTUUgPSAic2FzaSI7CkBAIC01Nyw3ICs1OSw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGxvYWRTY2hlbWEoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuY29uZmlnIiwgImNhc3NhbmRyYS1tdXJtdXIueWFtbCIpOworICAgICAgICBDQVNTQU5EUkFfQ09ORklHLnNldFN0cmluZygiY2Fzc2FuZHJhLW11cm11ci55YW1sIik7CiAgICAgICAgIFNjaGVtYUxvYWRlci5sb2FkU2NoZW1hKCk7CiAgICAgICAgIFNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZShLU19OQU1FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5c3BhY2VQYXJhbXMuc2ltcGxlVHJhbnNpZW50KDEpLApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L3Nhc2kvdXRpbHMvTWFwcGVkQnVmZmVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L3Nhc2kvdXRpbHMvTWFwcGVkQnVmZmVyVGVzdC5qYXZhCmluZGV4IGRjZDc5YjkuLjMzMjkwNmIgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL3V0aWxzL01hcHBlZEJ1ZmZlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS91dGlscy9NYXBwZWRCdWZmZXJUZXN0LmphdmEKQEAgLTE3LDIwICsxNywyMSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kudXRpbHM7CiAKLWltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZExvY2FsUmFuZG9tOwogCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTG9uZ1R5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5DaGFubmVsUHJveHk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwogCi1pbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQogcHVibGljIGNsYXNzIE1hcHBlZEJ1ZmZlclRlc3QKIHsKICAgICBAVGVzdApAQCAtNDYxLDcgKzQ2Miw3IEBACiAKICAgICAgICAgZmlsZS5nZXRGRCgpLnN5bmMoKTsKIAotICAgICAgICB0cnkgKE1hcHBlZEJ1ZmZlciBidWZmZXIgPSBuZXcgTWFwcGVkQnVmZmVyKG5ldyBDaGFubmVsUHJveHkodG1wLmFic29sdXRlUGF0aCgpLCBmaWxlLmdldENoYW5uZWwoKSkpKQorICAgICAgICB0cnkgKE1hcHBlZEJ1ZmZlciBidWZmZXIgPSBuZXcgTWFwcGVkQnVmZmVyKG5ldyBDaGFubmVsUHJveHkodG1wLCBmaWxlLmdldENoYW5uZWwoKSkpKQogICAgICAgICB7CiAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG51bVZhbHVlcyAqIDgsIGJ1ZmZlci5saW1pdCgpKTsKICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobnVtVmFsdWVzICogOCwgYnVmZmVyLmNhcGFjaXR5KCkpOwpAQCAtNTMwLDcgKzUzMSw3IEBACiAKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWFwcGVkQnVmZmVyKG5ldyBDaGFubmVsUHJveHkodGVzdEZpbGUuYWJzb2x1dGVQYXRoKCksIGZpbGUuZ2V0Q2hhbm5lbCgpKSwgbnVtUGFnZUJpdHMpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXBwZWRCdWZmZXIobmV3IENoYW5uZWxQcm94eSh0ZXN0RmlsZSwgZmlsZS5nZXRDaGFubmVsKCkpLCBudW1QYWdlQml0cyk7CiAgICAgICAgIH0KICAgICAgICAgZmluYWxseQogICAgICAgICB7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vQmxvb21GaWx0ZXJUcmFja2VyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL0Jsb29tRmlsdGVyVHJhY2tlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjZjJhNS4uMDAwMDAwMAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vQmxvb21GaWx0ZXJUcmFja2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbzsKLS8qCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotCi1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkJsb29tRmlsdGVyVHJhY2tlcjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLQotcHVibGljIGNsYXNzIEJsb29tRmlsdGVyVHJhY2tlclRlc3QKLXsKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRpbmdGYWxzZVBvc2l0aXZlcygpCi0gICAgewotICAgICAgICBCbG9vbUZpbHRlclRyYWNrZXIgYmZ0ID0gbmV3IEJsb29tRmlsdGVyVHJhY2tlcigpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMEwsIGJmdC5nZXRGYWxzZVBvc2l0aXZlQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwTCwgYmZ0LmdldFJlY2VudEZhbHNlUG9zaXRpdmVDb3VudCgpKTsKLSAgICAgICAgYmZ0LmFkZEZhbHNlUG9zaXRpdmUoKTsKLSAgICAgICAgYmZ0LmFkZEZhbHNlUG9zaXRpdmUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDJMLCBiZnQuZ2V0RmFsc2VQb3NpdGl2ZUNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMkwsIGJmdC5nZXRSZWNlbnRGYWxzZVBvc2l0aXZlQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwTCwgYmZ0LmdldFJlY2VudEZhbHNlUG9zaXRpdmVDb3VudCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDJMLCBiZnQuZ2V0RmFsc2VQb3NpdGl2ZUNvdW50KCkpOyAvLyBzYW5pdHkgY2hlY2sKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRpbmdUcnVlUG9zaXRpdmVzKCkKLSAgICB7Ci0gICAgICAgIEJsb29tRmlsdGVyVHJhY2tlciBiZnQgPSBuZXcgQmxvb21GaWx0ZXJUcmFja2VyKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwTCwgYmZ0LmdldFRydWVQb3NpdGl2ZUNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMEwsIGJmdC5nZXRSZWNlbnRUcnVlUG9zaXRpdmVDb3VudCgpKTsKLSAgICAgICAgYmZ0LmFkZFRydWVQb3NpdGl2ZSgpOwotICAgICAgICBiZnQuYWRkVHJ1ZVBvc2l0aXZlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyTCwgYmZ0LmdldFRydWVQb3NpdGl2ZUNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMkwsIGJmdC5nZXRSZWNlbnRUcnVlUG9zaXRpdmVDb3VudCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDBMLCBiZnQuZ2V0UmVjZW50VHJ1ZVBvc2l0aXZlQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyTCwgYmZ0LmdldFRydWVQb3NpdGl2ZUNvdW50KCkpOyAvLyBzYW5pdHkgY2hlY2sKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRpbmdUb09uZUxlYXZlc1RoZU90aGVyQWxvbmUoKQotICAgIHsKLSAgICAgICAgQmxvb21GaWx0ZXJUcmFja2VyIGJmdCA9IG5ldyBCbG9vbUZpbHRlclRyYWNrZXIoKTsKLSAgICAgICAgYmZ0LmFkZEZhbHNlUG9zaXRpdmUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDBMLCBiZnQuZ2V0VHJ1ZVBvc2l0aXZlQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwTCwgYmZ0LmdldFJlY2VudFRydWVQb3NpdGl2ZUNvdW50KCkpOwotICAgICAgICBiZnQuYWRkVHJ1ZVBvc2l0aXZlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxTCwgYmZ0LmdldEZhbHNlUG9zaXRpdmVDb3VudCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDFMLCBiZnQuZ2V0UmVjZW50RmFsc2VQb3NpdGl2ZUNvdW50KCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9EaXNrU3BhY2VNZXRyaWNzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL0Rpc2tTcGFjZU1ldHJpY3NUZXN0LmphdmEKaW5kZXggYmU4YjE2Mi4uNWVjYmE0NyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL0Rpc2tTcGFjZU1ldHJpY3NUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL0Rpc2tTcGFjZU1ldHJpY3NUZXN0LmphdmEKQEAgLTIxLDI2ICsyMSwzNCBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuU1NUYWJsZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkluZGV4U3VtbWFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuaW5kZXhzdW1tYXJ5LkluZGV4U3VtbWFyeU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5pbmRleHN1bW1hcnkuSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5pbmRleHN1bW1hcnkuSW5kZXhTdW1tYXJ5U3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlN0b3JhZ2VNZXRyaWNzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKIHB1YmxpYyBjbGFzcyBEaXNrU3BhY2VNZXRyaWNzVGVzdCBleHRlbmRzIENRTFRlc3RlcgogewogICAgIC8qKgpAQCAtNjcsNiArNzUsNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgc3VtbWFyeVJlZGlzdHJpYnV0aW9uKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoSW5kZXhTdW1tYXJ5U3VwcG9ydC5pc1N1cHBvcnRlZEJ5KERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSkpOwogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBiaWdpbnQsIFBSSU1BUlkgS0VZIChwaykpIFdJVEggbWluX2luZGV4X2ludGVydmFsPTEiKTsKICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCk7CiAKQEAgLTEwMiwxOCArMTExLDM2IEBACiAKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RGlza1NwYWNlRXF1YWwoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKQogICAgIHsKKyAgICAgICAgU2V0PFNTVGFibGVSZWFkZXI+IGxpdmVTU1RhYmxlcyA9IGNmcy5nZXRUcmFja2VyKCkuZ2V0VmlldygpLmxpdmVTU1RhYmxlcygpOwogICAgICAgICBsb25nIGxpdmVEaXNrU3BhY2VVc2VkID0gY2ZzLm1ldHJpYy5saXZlRGlza1NwYWNlVXNlZC5nZXRDb3VudCgpOwotICAgICAgICBsb25nIGFjdHVhbCA9IDA7Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogY2ZzLmdldFRyYWNrZXIoKS5nZXRWaWV3KCkubGl2ZVNTVGFibGVzKCkpCi0gICAgICAgICAgICBhY3R1YWwgKz0gc3N0YWJsZS5ieXRlc09uRGlzaygpOworICAgICAgICBsb25nIGFjdHVhbCA9IGxpdmVTU1RhYmxlcy5zdHJlYW0oKS5tYXBUb0xvbmcoU1NUYWJsZVJlYWRlcjo6Ynl0ZXNPbkRpc2spLnN1bSgpOworICAgICAgICBsb25nIHVuY29tcHJlc3NlZExpdmVEaXNrU3BhY2VVc2VkID0gY2ZzLm1ldHJpYy51bmNvbXByZXNzZWRMaXZlRGlza1NwYWNlVXNlZC5nZXRDb3VudCgpOworICAgICAgICBsb25nIGFjdHVhbFVuY29tcHJlc3NlZCA9IGxpdmVTU1RhYmxlcy5zdHJlYW0oKS5tYXBUb0xvbmcoU1NUYWJsZVJlYWRlcjo6bG9naWNhbEJ5dGVzT25EaXNrKS5zdW0oKTsKIAotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJieXRlcyBvbiBkaXNrIGRvZXMgbm90IG1hdGNoIGN1cnJlbnQgbWV0cmljIGxpdmVEaXNrU3BhY2VVc2VkIiwgYWN0dWFsLCBsaXZlRGlza1NwYWNlVXNlZCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYnl0ZXMgb24gZGlzayBkb2VzIG5vdCBtYXRjaCBjdXJyZW50IG1ldHJpYyBMaXZlRGlza1NwYWNlVXNlZCIsIGFjdHVhbCwgbGl2ZURpc2tTcGFjZVVzZWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJ5dGVzIG9uIGRpc2sgZG9lcyBub3QgbWF0Y2ggY3VycmVudCBtZXRyaWMgVW5jb21wcmVzc2VkTGl2ZURpc2tTcGFjZVVzZWQiLCBhY3R1YWxVbmNvbXByZXNzZWQsIHVuY29tcHJlc3NlZExpdmVEaXNrU3BhY2VVc2VkKTsKKworICAgICAgICAvLyBLZXlzcGFjZS1sZXZlbCBtZXRyaWNzIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHRhYmxlLWxldmVsIG1ldHJpY3MsIGFzIHRoZXJlIGlzIG9ubHkgb25lIHRhYmxlLgorICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLmtleXNwYWNlLm1ldHJpYy5saXZlRGlza1NwYWNlVXNlZC5nZXRWYWx1ZSgpLmxvbmdWYWx1ZSgpLCBsaXZlRGlza1NwYWNlVXNlZCk7CisgICAgICAgIGFzc2VydEVxdWFscyhjZnMua2V5c3BhY2UubWV0cmljLnVuY29tcHJlc3NlZExpdmVEaXNrU3BhY2VVc2VkLmdldFZhbHVlKCkubG9uZ1ZhbHVlKCksIHVuY29tcHJlc3NlZExpdmVEaXNrU3BhY2VVc2VkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNmcy5rZXlzcGFjZS5tZXRyaWMudW5yZXBsaWNhdGVkTGl2ZURpc2tTcGFjZVVzZWQuZ2V0VmFsdWUoKS5sb25nVmFsdWUoKSwgbGl2ZURpc2tTcGFjZVVzZWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLmtleXNwYWNlLm1ldHJpYy51bnJlcGxpY2F0ZWRVbmNvbXByZXNzZWRMaXZlRGlza1NwYWNlVXNlZC5nZXRWYWx1ZSgpLmxvbmdWYWx1ZSgpLCB1bmNvbXByZXNzZWRMaXZlRGlza1NwYWNlVXNlZCk7CisKKyAgICAgICAgLy8gR2xvYmFsIGxvYWQgbWV0cmljcyBzaG91bGQgYmUgaW50ZXJuYWxseSBjb25zaXN0ZW50LCBnaXZlbiB0aGVyZSBpcyBubyByZXBsaWNhdGlvbiwgYnV0IHNsaWdodGx5IGdyZWF0ZXIKKyAgICAgICAgLy8gdGhhbiB0YWJsZSBhbmQga2V5c3BhY2UtbGV2ZWwgbWV0cmljcywgZ2l2ZW4gdGhlIGdsb2JhbCB2ZXJzaW9ucyBhY2NvdW50IGZvciBub24tdXNlciB0YWJsZXMuCisgICAgICAgIGxvbmcgZ2xvYmFsTG9hZCA9IFN0b3JhZ2VNZXRyaWNzLmxvYWQuZ2V0Q291bnQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdsb2JhbExvYWQsIFN0b3JhZ2VNZXRyaWNzLnVucmVwbGljYXRlZExvYWQuZ2V0VmFsdWUoKS5sb25nVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZ2xvYmFsTG9hZCkuaXNHcmVhdGVyVGhhbihsaXZlRGlza1NwYWNlVXNlZCk7CisKKyAgICAgICAgbG9uZyBnbG9iYWxVbmNvbXByZXNzZWRMb2FkID0gU3RvcmFnZU1ldHJpY3MudW5jb21wcmVzc2VkTG9hZC5nZXRDb3VudCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2xvYmFsVW5jb21wcmVzc2VkTG9hZCwgU3RvcmFnZU1ldHJpY3MudW5yZXBsaWNhdGVkVW5jb21wcmVzc2VkTG9hZC5nZXRWYWx1ZSgpLmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChnbG9iYWxVbmNvbXByZXNzZWRMb2FkKS5pc0dyZWF0ZXJUaGFuKHVuY29tcHJlc3NlZExpdmVEaXNrU3BhY2VVc2VkKTsKIAogICAgICAgICAvLyB0b3RhbERpc2tTcGFjZVVzZWQgaXMgYmFzZWQgb2ZmIFNTdGFibGUgZGVsZXRlLCB3aGljaCBpcyBhc3luYzogTG9nVHJhbnNhY3Rpb24ncyB0aWR5IGVucXVldWVzIGluIFNjaGVkdWxlZEV4ZWN1dG9ycy5ub25QZXJpb2RpY1Rhc2tzCiAgICAgICAgIC8vIHdhaXQgZm9yIHRoZXJlIHRvIGJlIG5vIG1vcmUgcGVuZGluZyBzc3RhYmxlIHJlbGVhc2VzCiAgICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uLndhaXRGb3JEZWxldGlvbnMoKTsKICAgICAgICAgbG9uZyB0b3RhbERpc2tTcGFjZVVzZWQgPSBjZnMubWV0cmljLnRvdGFsRGlza1NwYWNlVXNlZC5nZXRDb3VudCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJieXRlcyBvbiBkaXNrIGRvZXMgbm90IG1hdGNoIGN1cnJlbnQgbWV0cmljIHRvdGFsRGlza1NwYWNlVXNlZCIsIGFjdHVhbCwgdG90YWxEaXNrU3BhY2VVc2VkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJieXRlcyBvbiBkaXNrIGRvZXMgbm90IG1hdGNoIGN1cnJlbnQgbWV0cmljIHRvdGFsRGlza1NwYWNlVXNlZCIsIGFjdHVhbCwgdG90YWxEaXNrU3BhY2VVc2VkKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluZGV4RG93bnNhbXBsZUNhbmNlbExhc3RTU1RhYmxlKENvbHVtbkZhbWlseVN0b3JlIGNmcykKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9jb21wcmVzcy9Db21wcmVzc2VkUmFuZG9tQWNjZXNzUmVhZGVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2NvbXByZXNzL0NvbXByZXNzZWRSYW5kb21BY2Nlc3NSZWFkZXJUZXN0LmphdmEKaW5kZXggYzM5OGFjNC4uMmJmMTI3ZiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2NvbXByZXNzL0NvbXByZXNzZWRSYW5kb21BY2Nlc3NSZWFkZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2NvbXByZXNzL0NvbXByZXNzZWRSYW5kb21BY2Nlc3NSZWFkZXJUZXN0LmphdmEKQEAgLTIwLDExICsyMCwxMCBAQAogCiBpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7IC8vY2hlY2tzdHlsZTogcGVybWl0IHRoaXMgaW1wb3J0CitpbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKIAotaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCkBAIC0zNCw5ICszMywxNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YVBvc2l0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SYW5kb21BY2Nlc3NSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlck9wdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29tcHJlc3Npb25QYXJhbXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU3luY1V0aWw7CitpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwpAQCAtOTgsNyArMTA0LDcgQEAKICAgICAgICAgRmlsZSBmID0gRmlsZVV0aWxzLmNyZWF0ZVRlbXBGaWxlKCJjb21wcmVzc2VkNjc5MV8iLCAiMyIpOwogICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBmLmFic29sdXRlUGF0aCgpOwogICAgICAgICBNZXRhZGF0YUNvbGxlY3RvciBzc3RhYmxlTWV0YWRhdGFDb2xsZWN0b3IgPSBuZXcgTWV0YWRhdGFDb2xsZWN0b3IobmV3IENsdXN0ZXJpbmdDb21wYXJhdG9yKEJ5dGVzVHlwZS5pbnN0YW5jZSkpOwotICAgICAgICB0cnkoQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyID0gbmV3IENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyKGYsIGZpbGVuYW1lICsgIi5tZXRhZGF0YSIsCisgICAgICAgIHRyeShDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlciB3cml0ZXIgPSBuZXcgQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIoZiwgbmV3IEZpbGUoZmlsZW5hbWUgKyAiLm1ldGFkYXRhIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU2VxdWVudGlhbFdyaXRlck9wdGlvbi5ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uUGFyYW1zLnNuYXBweSgzMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZU1ldGFkYXRhQ29sbGVjdG9yKSkKQEAgLTExOSw5ICsxMjUsOCBAQAogICAgICAgICAgICAgd3JpdGVyLmZpbmlzaCgpOwogICAgICAgICB9CiAKLSAgICAgICAgdHJ5IChGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZmlsZW5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29tcHJlc3Npb25NZXRhZGF0YShuZXcgQ29tcHJlc3Npb25NZXRhZGF0YShmaWxlbmFtZSArICIubWV0YWRhdGEiLCBmLmxlbmd0aCgpLCB0cnVlKSk7Ci0gICAgICAgICAgICAgRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgdHJ5IChDb21wcmVzc2lvbk1ldGFkYXRhIGNvbXByZXNzaW9uTWV0YWRhdGEgPSBDb21wcmVzc2lvbk1ldGFkYXRhLm9wZW4obmV3IEZpbGUoZmlsZW5hbWUgKyAiLm1ldGFkYXRhIiksIGYubGVuZ3RoKCksIHRydWUpOworICAgICAgICAgICAgIEZpbGVIYW5kbGUgZmggPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKGYpLndpdGhDb21wcmVzc2lvbk1ldGFkYXRhKGNvbXByZXNzaW9uTWV0YWRhdGEpLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHJlYWRlciA9IGZoLmNyZWF0ZVJlYWRlcigpKQogICAgICAgICB7CiAgICAgICAgICAgICBTdHJpbmcgcmVzID0gcmVhZGVyLnJlYWRMaW5lKCk7CkBAIC0xNTEsNyArMTU2LDcgQEAKICAgICAgICAgdHJ5CiAgICAgICAgIHsKICAgICAgICAgICAgIHdyaXRlU1NUYWJsZShmaWxlLCBDb21wcmVzc2lvblBhcmFtcy5zbmFwcHkoY2h1bmtMZW5ndGgpLCAxMCk7Ci0gICAgICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhIG1ldGFkYXRhID0gbmV3IENvbXByZXNzaW9uTWV0YWRhdGEoZmlsZW5hbWUgKyAiLm1ldGFkYXRhIiwgZmlsZS5sZW5ndGgoKSwgdHJ1ZSk7CisgICAgICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhIG1ldGFkYXRhID0gQ29tcHJlc3Npb25NZXRhZGF0YS5vcGVuKG5ldyBGaWxlKGZpbGVuYW1lICsgIi5tZXRhZGF0YSIpLCBmaWxlLmxlbmd0aCgpLCB0cnVlKTsKIAogICAgICAgICAgICAgbG9uZyBjaHVua3MgPSAyNzYxNjI4NTIwTDsKICAgICAgICAgICAgIGxvbmcgbWlkUG9zaXRpb24gPSAoY2h1bmtzIC8gMkwpICogY2h1bmtMZW5ndGg7CkBAIC0xNzcsOSArMTgyLDggQEAKICAgICAgICAgZmluYWwgU3RyaW5nIGZpbGVuYW1lID0gZi5hYnNvbHV0ZVBhdGgoKTsKICAgICAgICAgd3JpdGVTU1RhYmxlKGYsIGNvbXByZXNzZWQgPyBDb21wcmVzc2lvblBhcmFtcy5zbmFwcHkoKSA6IG51bGwsIGp1bmtTaXplKTsKIAotICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhIGNvbXByZXNzaW9uTWV0YWRhdGEgPSBjb21wcmVzc2VkID8gbmV3IENvbXByZXNzaW9uTWV0YWRhdGEoZmlsZW5hbWUgKyAiLm1ldGFkYXRhIiwgZi5sZW5ndGgoKSwgdHJ1ZSkgOiBudWxsOwotICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmaWxlbmFtZSkubW1hcHBlZCh1c2VtbWFwKS53aXRoQ29tcHJlc3Npb25NZXRhZGF0YShjb21wcmVzc2lvbk1ldGFkYXRhKTsKLSAgICAgICAgICAgICBGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICB0cnkgKENvbXByZXNzaW9uTWV0YWRhdGEgY29tcHJlc3Npb25NZXRhZGF0YSA9IGNvbXByZXNzZWQgPyBDb21wcmVzc2lvbk1ldGFkYXRhLm9wZW4obmV3IEZpbGUoZmlsZW5hbWUgKyAiLm1ldGFkYXRhIiksIGYubGVuZ3RoKCksIHRydWUpIDogbnVsbDsKKyAgICAgICAgICAgICBGaWxlSGFuZGxlIGZoID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmKS5tbWFwcGVkKHVzZW1tYXApLndpdGhDb21wcmVzc2lvbk1ldGFkYXRhKGNvbXByZXNzaW9uTWV0YWRhdGEpLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHJlYWRlciA9IGZoLmNyZWF0ZVJlYWRlcigpKQogICAgICAgICB7CiAgICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZyI7CkBAIC0yMDMsNyArMjA3LDcgQEAKICAgICAgICAgZmluYWwgU3RyaW5nIGZpbGVuYW1lID0gZi5hYnNvbHV0ZVBhdGgoKTsKICAgICAgICAgTWV0YWRhdGFDb2xsZWN0b3Igc3N0YWJsZU1ldGFkYXRhQ29sbGVjdG9yID0gbmV3IE1ldGFkYXRhQ29sbGVjdG9yKG5ldyBDbHVzdGVyaW5nQ29tcGFyYXRvcihCeXRlc1R5cGUuaW5zdGFuY2UpKTsKICAgICAgICAgdHJ5KFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyID0gcGFyYW1zICE9IG51bGwKLSAgICAgICAgICAgICAgICA/IG5ldyBDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlcihmLCBmaWxlbmFtZSArICIubWV0YWRhdGEiLAorICAgICAgICAgICAgICAgID8gbmV3IENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyKGYsIG5ldyBGaWxlKGZpbGVuYW1lICsgIi5tZXRhZGF0YSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFNlcXVlbnRpYWxXcml0ZXJPcHRpb24uREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHNzdGFibGVNZXRhZGF0YUNvbGxlY3RvcikKICAgICAgICAgICAgICAgICA6IG5ldyBTZXF1ZW50aWFsV3JpdGVyKGYpKQpAQCAtMjQzLDcgKzI0Nyw3IEBACiAgICAgICAgIGFzc2VydFRydWUobWV0YWRhdGEuY3JlYXRlRmlsZUlmTm90RXhpc3RzKCkpOwogCiAgICAgICAgIE1ldGFkYXRhQ29sbGVjdG9yIHNzdGFibGVNZXRhZGF0YUNvbGxlY3RvciA9IG5ldyBNZXRhZGF0YUNvbGxlY3RvcihuZXcgQ2x1c3RlcmluZ0NvbXBhcmF0b3IoQnl0ZXNUeXBlLmluc3RhbmNlKSk7Ci0gICAgICAgIHRyeSAoU2VxdWVudGlhbFdyaXRlciB3cml0ZXIgPSBuZXcgQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIoZmlsZSwgbWV0YWRhdGEucGF0aCgpLAorICAgICAgICB0cnkgKFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyID0gbmV3IENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyKGZpbGUsIG1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFNlcXVlbnRpYWxXcml0ZXJPcHRpb24uREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvblBhcmFtcy5zbmFwcHkoKSwgc3N0YWJsZU1ldGFkYXRhQ29sbGVjdG9yKSkKICAgICAgICAgewpAQCAtMjUyLDE2ICsyNTYsMTQgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIG9wZW4gY29tcHJlc3Npb24gbWV0YWRhdGEgYW5kIGdldCBjaHVuayBpbmZvcm1hdGlvbgotICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhIG1ldGEgPSBuZXcgQ29tcHJlc3Npb25NZXRhZGF0YShtZXRhZGF0YS5wYXRoKCksIGZpbGUubGVuZ3RoKCksIHRydWUpOwotICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhLkNodW5rIGNodW5rID0gbWV0YS5jaHVua0ZvcigwKTsKLQotICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmaWxlLnBhdGgoKSkud2l0aENvbXByZXNzaW9uTWV0YWRhdGEobWV0YSk7Ci0gICAgICAgICAgICAgRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgdHJ5IChDb21wcmVzc2lvbk1ldGFkYXRhIG1ldGEgPSBDb21wcmVzc2lvbk1ldGFkYXRhLm9wZW4obWV0YWRhdGEsIGZpbGUubGVuZ3RoKCksIHRydWUpOworICAgICAgICAgICAgIEZpbGVIYW5kbGUgZmggPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKGZpbGUpLndpdGhDb21wcmVzc2lvbk1ldGFkYXRhKG1ldGEpLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHJlYWRlciA9IGZoLmNyZWF0ZVJlYWRlcigpKQogICAgICAgICB7Ly8gcmVhZCBhbmQgdmVyaWZ5IGNvbXByZXNzZWQgZGF0YQogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENPTlRFTlQsIHJlYWRlci5yZWFkTGluZSgpKTsKICAgICAgICAgICAgIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7Ci0gICAgICAgICAgICB0cnkoUmFuZG9tQWNjZXNzRmlsZSBjaGVja3N1bU1vZGlmaWVyID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoZmlsZS50b0phdmFJT0ZpbGUoKSwgInJ3IikpCisgICAgICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhLkNodW5rIGNodW5rID0gbWV0YS5jaHVua0ZvcigwKTsKKyAgICAgICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzRmlsZSBjaGVja3N1bU1vZGlmaWVyID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoZmlsZS50b0phdmFJT0ZpbGUoKSwgInJ3IikpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYnl0ZVtdIGNoZWNrc3VtID0gbmV3IGJ5dGVbNF07CiAKQEAgLTMxMiw0ICszMTQsNCBAQAogICAgICAgICBmaWxlLndyaXRlKGNoZWNrc3VtKTsKICAgICAgICAgU3luY1V0aWwuc3luYyhmaWxlLmdldEZEKCkpOwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vY29tcHJlc3MvQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vY29tcHJlc3MvQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXJUZXN0LmphdmEKaW5kZXggMmI1MDYzMy4uYWZhNDY5YyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2NvbXByZXNzL0NvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9jb21wcmVzcy9Db21wcmVzc2VkU2VxdWVudGlhbFdyaXRlclRlc3QuamF2YQpAQCAtMjEsMjkgKzIxLDM5IEBACiBpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wcmVzc2lvblBhcmFtcy5ERUZBVUxUX0NIVU5LX0xFTkdUSDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlscy5yZWFkRmlsZVRvQnl0ZUFycmF5OwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkZpbGVzOwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAotaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7Ci0KIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdDb21wYXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZXNUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbGxlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhUG9zaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNlcXVlbnRpYWxXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlclRlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbXByZXNzaW9uUGFyYW1zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wcmVzc2lvblBhcmFtcy5ERUZBVUxUX0NIVU5LX0xFTkdUSDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlscy5yZWFkRmlsZVRvQnl0ZUFycmF5OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCiBwdWJsaWMgY2xhc3MgQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXJUZXN0IGV4dGVuZHMgU2VxdWVudGlhbFdyaXRlclRlc3QKIHsKICAgICBwcml2YXRlIENvbXByZXNzaW9uUGFyYW1zIGNvbXByZXNzaW9uUGFyYW1ldGVyczsKQEAgLTExNyw3ICsxMjcsNyBAQAogCiAgICAgICAgIGJ5dGVbXSBkYXRhUHJlID0gbmV3IGJ5dGVbYnl0ZXNUb1Rlc3RdOwogICAgICAgICBieXRlW10gcmF3UG9zdCA9IG5ldyBieXRlW2J5dGVzVG9UZXN0XTsKLSAgICAgICAgdHJ5IChDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlciB3cml0ZXIgPSBuZXcgQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIoZiwgZmlsZW5hbWUgKyAiLm1ldGFkYXRhIiwKKyAgICAgICAgdHJ5IChDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlciB3cml0ZXIgPSBuZXcgQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIoZiwgbmV3IEZpbGUoZmlsZW5hbWUgKyAiLm1ldGFkYXRhIiksCiAgICAgICAgICAgICAgICAgbnVsbCwgU2VxdWVudGlhbFdyaXRlck9wdGlvbi5ERUZBVUxULAogICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uUGFyYW1ldGVycywKICAgICAgICAgICAgICAgICBzc3RhYmxlTWV0YWRhdGFDb2xsZWN0b3IpKQpAQCAtMTUwLDggKzE2MCw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBhc3NlcnQgZi5leGlzdHMoKTsKLSAgICAgICAgdHJ5IChGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZmlsZW5hbWUpLndpdGhDb21wcmVzc2lvbk1ldGFkYXRhKG5ldyBDb21wcmVzc2lvbk1ldGFkYXRhKGZpbGVuYW1lICsgIi5tZXRhZGF0YSIsIGYubGVuZ3RoKCksIHRydWUpKTsKLSAgICAgICAgICAgICBGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICB0cnkgKENvbXByZXNzaW9uTWV0YWRhdGEgY29tcHJlc3Npb25NZXRhZGF0YSA9IENvbXByZXNzaW9uTWV0YWRhdGEub3BlbihuZXcgRmlsZShmaWxlbmFtZSArICIubWV0YWRhdGEiKSwgZi5sZW5ndGgoKSwgdHJ1ZSk7CisgICAgICAgICAgICAgRmlsZUhhbmRsZSBmaCA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZikud2l0aENvbXByZXNzaW9uTWV0YWRhdGEoY29tcHJlc3Npb25NZXRhZGF0YSkuY29tcGxldGUoKTsKICAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgcmVhZGVyID0gZmguY3JlYXRlUmVhZGVyKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhkYXRhUHJlLmxlbmd0aCArIHJhd1Bvc3QubGVuZ3RoLCByZWFkZXIubGVuZ3RoKCkpOwpAQCAtMjE3LDcgKzIyNyw3IEBACiAgICAgICAgIGNvbXByZXNzaW9uUGFyYW1ldGVycyA9IG5ldyBDb21wcmVzc2lvblBhcmFtcyhNb2NrQ29tcHJlc3Nvci5jbGFzcy5nZXRUeXBlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9ja0NvbXByZXNzb3IucGFyYW1zRm9yKHJhdGlvLCBleHRyYSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0NIVU5LX0xFTkdUSCwgcmF0aW8pOwotICAgICAgICB0cnkgKENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyIHdyaXRlciA9IG5ldyBDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlcihmLCBmLnBhdGgoKSArICIubWV0YWRhdGEiLAorICAgICAgICB0cnkgKENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyIHdyaXRlciA9IG5ldyBDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlcihmLCBuZXcgRmlsZShmLnBhdGgoKSArICIubWV0YWRhdGEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU2VxdWVudGlhbFdyaXRlck9wdGlvbi5ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvblBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGVNZXRhZGF0YUNvbGxlY3RvcikpCkBAIC0yMjgsOCArMjM4LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIGFzc2VydCBmLmV4aXN0cygpOwotICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmaWxlbmFtZSkud2l0aENvbXByZXNzaW9uTWV0YWRhdGEobmV3IENvbXByZXNzaW9uTWV0YWRhdGEoZmlsZW5hbWUgKyAiLm1ldGFkYXRhIiwgZi5sZW5ndGgoKSwgdHJ1ZSkpOwotICAgICAgICAgICAgIEZpbGVIYW5kbGUgZmggPSBidWlsZGVyLmNvbXBsZXRlKCk7CisgICAgICAgIHRyeSAoQ29tcHJlc3Npb25NZXRhZGF0YSBjb21wcmVzc2lvbk1ldGFkYXRhID0gQ29tcHJlc3Npb25NZXRhZGF0YS5vcGVuKG5ldyBGaWxlKGZpbGVuYW1lICsgIi5tZXRhZGF0YSIpLCBmLmxlbmd0aCgpLCB0cnVlKTsKKyAgICAgICAgICAgICBGaWxlSGFuZGxlIGZoID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmKS53aXRoQ29tcHJlc3Npb25NZXRhZGF0YShjb21wcmVzc2lvbk1ldGFkYXRhKS5jb21wbGV0ZSgpOwogICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciByZWFkZXIgPSBmaC5jcmVhdGVSZWFkZXIoKSkKICAgICAgICAgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNpemUsIHJlYWRlci5sZW5ndGgoKSk7CkBAIC0yNzYsNyArMjg2LDcgQEAKICAgICAgICAgZmluYWwgaW50IGJ1ZmZlclNpemUgPSA0ODsKICAgICAgICAgZmluYWwgaW50IHdyaXRlU2l6ZSA9IDY0OwogICAgICAgICBieXRlW10gdG9Xcml0ZSA9IG5ldyBieXRlW3dyaXRlU2l6ZV07Ci0gICAgICAgIHRyeSAoU2VxdWVudGlhbFdyaXRlciB3cml0ZXIgPSBuZXcgQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIodGVtcEZpbGUsIG9mZnNldHNGaWxlLnBhdGgoKSwKKyAgICAgICAgdHJ5IChTZXF1ZW50aWFsV3JpdGVyIHdyaXRlciA9IG5ldyBDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlcih0ZW1wRmlsZSwgb2Zmc2V0c0ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU2VxdWVudGlhbFdyaXRlck9wdGlvbi5ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uUGFyYW1zLmx6NChidWZmZXJTaXplKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWV0YWRhdGFDb2xsZWN0b3IobmV3IENsdXN0ZXJpbmdDb21wYXJhdG9yKFVURjhUeXBlLmluc3RhbmNlKSkpKQpAQCAtMzMwLDcgKzM0MCw3IEBACiAKICAgICAgICAgcHJpdmF0ZSBUZXN0YWJsZUNTVyhGaWxlIGZpbGUsIEZpbGUgb2Zmc2V0c0ZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzKGZpbGUsIG9mZnNldHNGaWxlLCBuZXcgQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIoZmlsZSwgb2Zmc2V0c0ZpbGUucGF0aCgpLAorICAgICAgICAgICAgdGhpcyhmaWxlLCBvZmZzZXRzRmlsZSwgbmV3IENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyKGZpbGUsIG9mZnNldHNGaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFNlcXVlbnRpYWxXcml0ZXJPcHRpb24uREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvblBhcmFtcy5sejQoQlVGRkVSX1NJWkUsIE1BWF9DT01QUkVTU0VEKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWV0YWRhdGFDb2xsZWN0b3IobmV3IENsdXN0ZXJpbmdDb21wYXJhdG9yKFVURjhUeXBlLmluc3RhbmNlKSkpKTsKQEAgLTM4NSw0ICszOTUsNCBAQAogICAgICAgICB9CiAgICAgfQogCi19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2NvbXByZXNzL0NvbXByZXNzaW9uTWV0YWRhdGFUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vY29tcHJlc3MvQ29tcHJlc3Npb25NZXRhZGF0YVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjFmZTU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2NvbXByZXNzL0NvbXByZXNzaW9uTWV0YWRhdGFUZXN0LmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzczsKKworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5NZW1vcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbXByZXNzaW9uUGFyYW1zOworCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0RXhjZXB0aW9uT2ZUeXBlOworCitwdWJsaWMgY2xhc3MgQ29tcHJlc3Npb25NZXRhZGF0YVRlc3QKK3sKKyAgICBGaWxlIGNodW5rc0luZGV4RmlsZSA9IG5ldyBGaWxlKCIvcGF0aC90by9tZXRhZGF0YSIpOworICAgIENvbXByZXNzaW9uUGFyYW1zIHBhcmFtcyA9IENvbXByZXNzaW9uUGFyYW1zLnpzdGQoKTsKKyAgICBsb25nIGRhdGFMZW5ndGggPSAxMDAwOworICAgIGxvbmcgY29tcHJlc3NlZEZpbGVMZW5ndGggPSAxMDA7CisKKyAgICBwcml2YXRlIENvbXByZXNzaW9uTWV0YWRhdGEgbmV3Q29tcHJlc3Npb25NZXRhZGF0YShNZW1vcnkgbWVtb3J5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb21wcmVzc2lvbk1ldGFkYXRhKGNodW5rc0luZGV4RmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeS5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NlZEZpbGVMZW5ndGgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lbW9yeUlzRnJlZWQoKQorICAgIHsKKyAgICAgICAgTWVtb3J5IG1lbW9yeSA9IE1lbW9yeS5hbGxvY2F0ZSgxMCk7CisgICAgICAgIENvbXByZXNzaW9uTWV0YWRhdGEgY20gPSBuZXdDb21wcmVzc2lvbk1ldGFkYXRhKG1lbW9yeSk7CisKKyAgICAgICAgY20uY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbS5pc0NsZWFuZWRVcCgpKS5pc1RydWUoKTsKKyAgICAgICAgYXNzZXJ0VGhhdEV4Y2VwdGlvbk9mVHlwZShBc3NlcnRpb25FcnJvci5jbGFzcykuaXNUaHJvd25CeShtZW1vcnk6OnNpemUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lbW9yeUlzU2hhcmVkKCkKKyAgICB7CisgICAgICAgIE1lbW9yeSBtZW1vcnkgPSBNZW1vcnkuYWxsb2NhdGUoMTApOworICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhIGNtID0gbmV3Q29tcHJlc3Npb25NZXRhZGF0YShtZW1vcnkpOworCisgICAgICAgIENvbXByZXNzaW9uTWV0YWRhdGEgY29weSA9IGNtLnNoYXJlZENvcHkoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb3B5KS5pc05vdFNhbWVBcyhjbSk7CisKKyAgICAgICAgY20uY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbS5pc0NsZWFuZWRVcCgpKS5pc0ZhbHNlKCk7CisgICAgICAgIGFzc2VydFRoYXQoY29weS5pc0NsZWFuZWRVcCgpKS5pc0ZhbHNlKCk7CisgICAgICAgIGFzc2VydFRoYXQobWVtb3J5LnNpemUoKSkuaXNFcXVhbFRvKDEwKTsgLy8gZXhwZWN0ZWQgdGhhdCBubyBleHBlY3Rpb24gaXMgdGhyb3duIHNpbmNlIG1lbW9yeSBzaG91bGQgbm90IGJlIHJlbGVhc2VkIHlldAorCisgICAgICAgIGNvcHkuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbS5pc0NsZWFuZWRVcCgpKS5pc1RydWUoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb3B5LmlzQ2xlYW5lZFVwKCkpLmlzVHJ1ZSgpOworICAgICAgICBhc3NlcnRUaGF0RXhjZXB0aW9uT2ZUeXBlKEFzc2VydGlvbkVycm9yLmNsYXNzKS5pc1Rocm93bkJ5KG1lbW9yeTo6c2l6ZSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9maWxlc3lzdGVtL0ZvcndhcmRpbmdGaWxlQ2hhbm5lbC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2ZpbGVzeXN0ZW0vRm9yd2FyZGluZ0ZpbGVDaGFubmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlY2QyNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9maWxlc3lzdGVtL0ZvcndhcmRpbmdGaWxlQ2hhbm5lbC5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmZpbGVzeXN0ZW07CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uTWFwcGVkQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlTG9jazsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5SZWFkYWJsZUJ5dGVDaGFubmVsOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLldyaXRhYmxlQnl0ZUNoYW5uZWw7CisKK3B1YmxpYyBjbGFzcyBGb3J3YXJkaW5nRmlsZUNoYW5uZWwgZXh0ZW5kcyBGaWxlQ2hhbm5lbAoreworICAgIHByb3RlY3RlZCBmaW5hbCBGaWxlQ2hhbm5lbCBkZWxlZ2F0ZTsKKworICAgIHB1YmxpYyBGb3J3YXJkaW5nRmlsZUNoYW5uZWwoRmlsZUNoYW5uZWwgZGVsZWdhdGUpCisgICAgeworICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEZpbGVDaGFubmVsIGRlbGVnYXRlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHJlYWQoQnl0ZUJ1ZmZlciBkc3QpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkucmVhZChkc3QpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIHJlYWQoQnl0ZUJ1ZmZlcltdIGRzdHMsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkucmVhZChkc3RzLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCB3cml0ZShCeXRlQnVmZmVyIHNyYykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS53cml0ZShzcmMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIHdyaXRlKEJ5dGVCdWZmZXJbXSBzcmNzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLndyaXRlKHNyY3MsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBwb3NpdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkucG9zaXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRmlsZUNoYW5uZWwgcG9zaXRpb24obG9uZyBuZXdQb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5wb3NpdGlvbihuZXdQb3NpdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgc2l6ZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkuc2l6ZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGaWxlQ2hhbm5lbCB0cnVuY2F0ZShsb25nIHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkudHJ1bmNhdGUoc2l6ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZm9yY2UoYm9vbGVhbiBtZXRhRGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBkZWxlZ2F0ZSgpLmZvcmNlKG1ldGFEYXRhKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyB0cmFuc2ZlclRvKGxvbmcgcG9zaXRpb24sIGxvbmcgY291bnQsIFdyaXRhYmxlQnl0ZUNoYW5uZWwgdGFyZ2V0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLnRyYW5zZmVyVG8ocG9zaXRpb24sIGNvdW50LCB0YXJnZXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIHRyYW5zZmVyRnJvbShSZWFkYWJsZUJ5dGVDaGFubmVsIHNyYywgbG9uZyBwb3NpdGlvbiwgbG9uZyBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS50cmFuc2ZlckZyb20oc3JjLCBwb3NpdGlvbiwgY291bnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgcmVhZChCeXRlQnVmZmVyIGRzdCwgbG9uZyBwb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5yZWFkKGRzdCwgcG9zaXRpb24pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgd3JpdGUoQnl0ZUJ1ZmZlciBzcmMsIGxvbmcgcG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkud3JpdGUoc3JjLCBwb3NpdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1hcHBlZEJ5dGVCdWZmZXIgbWFwKE1hcE1vZGUgbW9kZSwgbG9uZyBwb3NpdGlvbiwgbG9uZyBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLm1hcChtb2RlLCBwb3NpdGlvbiwgc2l6ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZpbGVMb2NrIGxvY2sobG9uZyBwb3NpdGlvbiwgbG9uZyBzaXplLCBib29sZWFuIHNoYXJlZCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5sb2NrKHBvc2l0aW9uLCBzaXplLCBzaGFyZWQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGaWxlTG9jayB0cnlMb2NrKGxvbmcgcG9zaXRpb24sIGxvbmcgc2l6ZSwgYm9vbGVhbiBzaGFyZWQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkudHJ5TG9jayhwb3NpdGlvbiwgc2l6ZSwgc2hhcmVkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbXBsQ2xvc2VDaGFubmVsKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyAuY2xvc2UoKSwgYW5kIC5pc09wZW4oKSBhcmUgImZpbmFsIiwgc28gbmVlZCB0byBsZXZlcmFnZSBpbXBsQ2xvc2VDaGFubmVsCisgICAgICAgIC8vIHRvIGNsb3NlIHRoZSB1bmRlcmxpbmUgY2hhbm5lbAorICAgICAgICBkZWxlZ2F0ZSgpLmNsb3NlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2ZpbGVzeXN0ZW0vRm9yd2FyZGluZ0ZpbGVTeXN0ZW0uamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9maWxlc3lzdGVtL0ZvcndhcmRpbmdGaWxlU3lzdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljNjgyYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9maWxlc3lzdGVtL0ZvcndhcmRpbmdGaWxlU3lzdGVtLmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uZmlsZXN5c3RlbTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlU3RvcmU7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlU3lzdGVtOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhNYXRjaGVyOworaW1wb3J0IGphdmEubmlvLmZpbGUuV2F0Y2hTZXJ2aWNlOworaW1wb3J0IGphdmEubmlvLmZpbGUuYXR0cmlidXRlLlVzZXJQcmluY2lwYWxMb29rdXBTZXJ2aWNlOworaW1wb3J0IGphdmEubmlvLmZpbGUuc3BpLkZpbGVTeXN0ZW1Qcm92aWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CisKK3B1YmxpYyBjbGFzcyBGb3J3YXJkaW5nRmlsZVN5c3RlbSBleHRlbmRzIEZpbGVTeXN0ZW0KK3sKKyAgICBwcm90ZWN0ZWQgZmluYWwgRmlsZVN5c3RlbSBkZWxlZ2F0ZTsKKworICAgIHB1YmxpYyBGb3J3YXJkaW5nRmlsZVN5c3RlbShGaWxlU3lzdGVtIGRlbGVnYXRlKQorICAgIHsKKyAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOworICAgIH0KKworICAgIHByb3RlY3RlZCBGaWxlU3lzdGVtIGRlbGVnYXRlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUGF0aCB3cmFwKFBhdGggcCkKKyAgICB7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAgIHByb3RlY3RlZCBQYXRoIHVud3JhcChQYXRoIHApCisgICAgeworICAgICAgICByZXR1cm4gcDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRmlsZVN5c3RlbVByb3ZpZGVyIHByb3ZpZGVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLnByb3ZpZGVyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRlbGVnYXRlKCkuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkuaXNPcGVuKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5pc1JlYWRPbmx5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRTZXBhcmF0b3IoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkuZ2V0U2VwYXJhdG9yKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEl0ZXJhYmxlPFBhdGg+IGdldFJvb3REaXJlY3RvcmllcygpCisgICAgeworICAgICAgICByZXR1cm4gSXRlcmFibGVzLnRyYW5zZm9ybShkZWxlZ2F0ZSgpLmdldFJvb3REaXJlY3RvcmllcygpLCB0aGlzOjp3cmFwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSXRlcmFibGU8RmlsZVN0b3JlPiBnZXRGaWxlU3RvcmVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLmdldEZpbGVTdG9yZXMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gc3VwcG9ydGVkRmlsZUF0dHJpYnV0ZVZpZXdzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLnN1cHBvcnRlZEZpbGVBdHRyaWJ1dGVWaWV3cygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXRoIGdldFBhdGgoU3RyaW5nIGZpcnN0LCBTdHJpbmcuLi4gbW9yZSkKKyAgICB7CisgICAgICAgIHJldHVybiB3cmFwKGRlbGVnYXRlKCkuZ2V0UGF0aChmaXJzdCwgbW9yZSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXRoTWF0Y2hlciBnZXRQYXRoTWF0Y2hlcihTdHJpbmcgc3ludGF4QW5kUGF0dGVybikKKyAgICB7CisgICAgICAgIFBhdGhNYXRjaGVyIG1hdGNoZXIgPSBkZWxlZ2F0ZSgpLmdldFBhdGhNYXRjaGVyKHN5bnRheEFuZFBhdHRlcm4pOworICAgICAgICByZXR1cm4gcGF0aCAtPiBtYXRjaGVyLm1hdGNoZXModW53cmFwKHBhdGgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVXNlclByaW5jaXBhbExvb2t1cFNlcnZpY2UgZ2V0VXNlclByaW5jaXBhbExvb2t1cFNlcnZpY2UoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkuZ2V0VXNlclByaW5jaXBhbExvb2t1cFNlcnZpY2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgV2F0Y2hTZXJ2aWNlIG5ld1dhdGNoU2VydmljZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkubmV3V2F0Y2hTZXJ2aWNlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2ZpbGVzeXN0ZW0vRm9yd2FyZGluZ0ZpbGVTeXN0ZW1Qcm92aWRlci5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2ZpbGVzeXN0ZW0vRm9yd2FyZGluZ0ZpbGVTeXN0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMWY2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vZmlsZXN5c3RlbS9Gb3J3YXJkaW5nRmlsZVN5c3RlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uZmlsZXN5c3RlbTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQXN5bmNocm9ub3VzRmlsZUNoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2Vla2FibGVCeXRlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkFjY2Vzc01vZGU7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5Db3B5T3B0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRGlyZWN0b3J5U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVN0b3JlOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVN5c3RlbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkxpbmtPcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5PcGVuT3B0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5CYXNpY0ZpbGVBdHRyaWJ1dGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuYXR0cmlidXRlLkZpbGVBdHRyaWJ1dGU7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5hdHRyaWJ1dGUuRmlsZUF0dHJpYnV0ZVZpZXc7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5zcGkuRmlsZVN5c3RlbVByb3ZpZGVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYXRvcnM7CisKK3B1YmxpYyBjbGFzcyBGb3J3YXJkaW5nRmlsZVN5c3RlbVByb3ZpZGVyIGV4dGVuZHMgRmlsZVN5c3RlbVByb3ZpZGVyCit7CisgICAgcHJvdGVjdGVkIGZpbmFsIEZpbGVTeXN0ZW1Qcm92aWRlciBkZWxlZ2F0ZTsKKworICAgIHB1YmxpYyBGb3J3YXJkaW5nRmlsZVN5c3RlbVByb3ZpZGVyKEZpbGVTeXN0ZW1Qcm92aWRlciBkZWxlZ2F0ZSkKKyAgICB7CisgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRmlsZVN5c3RlbVByb3ZpZGVyIGRlbGVnYXRlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUGF0aCB3cmFwKFBhdGggcCkKKyAgICB7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAgIHByb3RlY3RlZCBQYXRoIHVud3JhcChQYXRoIHApCisgICAgeworICAgICAgICByZXR1cm4gcDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtZSgpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5nZXRTY2hlbWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRmlsZVN5c3RlbSBuZXdGaWxlU3lzdGVtKFVSSSB1cmksIE1hcDxTdHJpbmcsID8+IGVudikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5uZXdGaWxlU3lzdGVtKHVyaSwgZW52KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRmlsZVN5c3RlbSBnZXRGaWxlU3lzdGVtKFVSSSB1cmkpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5nZXRGaWxlU3lzdGVtKHVyaSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFBhdGggZ2V0UGF0aChVUkkgdXJpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHdyYXAoZGVsZWdhdGUoKS5nZXRQYXRoKHVyaSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZWVrYWJsZUJ5dGVDaGFubmVsIG5ld0J5dGVDaGFubmVsKFBhdGggcGF0aCwgU2V0PD8gZXh0ZW5kcyBPcGVuT3B0aW9uPiBvcHRpb25zLCBGaWxlQXR0cmlidXRlPD8+Li4uIGF0dHJzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLm5ld0J5dGVDaGFubmVsKHVud3JhcChwYXRoKSwgb3B0aW9ucywgYXR0cnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEaXJlY3RvcnlTdHJlYW08UGF0aD4gbmV3RGlyZWN0b3J5U3RyZWFtKFBhdGggZGlyLCBEaXJlY3RvcnlTdHJlYW0uRmlsdGVyPD8gc3VwZXIgUGF0aD4gZmlsdGVyKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIERpcmVjdG9yeVN0cmVhbTxQYXRoPiBzdHJlYW0gPSBkZWxlZ2F0ZSgpLm5ld0RpcmVjdG9yeVN0cmVhbSh1bndyYXAoZGlyKSwgZmlsdGVyKTsKKyAgICAgICAgcmV0dXJuIG5ldyBEaXJlY3RvcnlTdHJlYW08UGF0aD4oKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxQYXRoPiBpdGVyYXRvcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEl0ZXJhdG9ycy50cmFuc2Zvcm0oc3RyZWFtLml0ZXJhdG9yKCksIEZvcndhcmRpbmdGaWxlU3lzdGVtUHJvdmlkZXIudGhpczo6d3JhcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjcmVhdGVEaXJlY3RvcnkoUGF0aCBkaXIsIEZpbGVBdHRyaWJ1dGU8Pz4uLi4gYXR0cnMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZGVsZWdhdGUoKS5jcmVhdGVEaXJlY3RvcnkodW53cmFwKGRpciksIGF0dHJzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZWxldGUoUGF0aCBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRlbGVnYXRlKCkuZGVsZXRlKHVud3JhcChwYXRoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29weShQYXRoIHNvdXJjZSwgUGF0aCB0YXJnZXQsIENvcHlPcHRpb24uLi4gb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBkZWxlZ2F0ZSgpLmNvcHkodW53cmFwKHNvdXJjZSksIHVud3JhcCh0YXJnZXQpLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBtb3ZlKFBhdGggc291cmNlLCBQYXRoIHRhcmdldCwgQ29weU9wdGlvbi4uLiBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRlbGVnYXRlKCkubW92ZSh1bndyYXAoc291cmNlKSwgdW53cmFwKHRhcmdldCksIG9wdGlvbnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzU2FtZUZpbGUoUGF0aCBwYXRoLCBQYXRoIHBhdGgyKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLmlzU2FtZUZpbGUodW53cmFwKHBhdGgpLCB1bndyYXAocGF0aDIpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0hpZGRlbihQYXRoIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkuaXNIaWRkZW4odW53cmFwKHBhdGgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRmlsZVN0b3JlIGdldEZpbGVTdG9yZShQYXRoIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkuZ2V0RmlsZVN0b3JlKHVud3JhcChwYXRoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2hlY2tBY2Nlc3MoUGF0aCBwYXRoLCBBY2Nlc3NNb2RlLi4uIG1vZGVzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRlbGVnYXRlKCkuY2hlY2tBY2Nlc3ModW53cmFwKHBhdGgpLCBtb2Rlcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWIGV4dGVuZHMgRmlsZUF0dHJpYnV0ZVZpZXc+IFYgZ2V0RmlsZUF0dHJpYnV0ZVZpZXcoUGF0aCBwYXRoLCBDbGFzczxWPiB0eXBlLCBMaW5rT3B0aW9uLi4uIG9wdGlvbnMpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5nZXRGaWxlQXR0cmlidXRlVmlldyh1bndyYXAocGF0aCksIHR5cGUsIG9wdGlvbnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QSBleHRlbmRzIEJhc2ljRmlsZUF0dHJpYnV0ZXM+IEEgcmVhZEF0dHJpYnV0ZXMoUGF0aCBwYXRoLCBDbGFzczxBPiB0eXBlLCBMaW5rT3B0aW9uLi4uIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkucmVhZEF0dHJpYnV0ZXModW53cmFwKHBhdGgpLCB0eXBlLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiByZWFkQXR0cmlidXRlcyhQYXRoIHBhdGgsIFN0cmluZyBhdHRyaWJ1dGVzLCBMaW5rT3B0aW9uLi4uIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkucmVhZEF0dHJpYnV0ZXModW53cmFwKHBhdGgpLCBhdHRyaWJ1dGVzLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoUGF0aCBwYXRoLCBTdHJpbmcgYXR0cmlidXRlLCBPYmplY3QgdmFsdWUsIExpbmtPcHRpb24uLi4gb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBkZWxlZ2F0ZSgpLnNldEF0dHJpYnV0ZSh1bndyYXAocGF0aCksIGF0dHJpYnV0ZSwgdmFsdWUsIG9wdGlvbnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGaWxlU3lzdGVtIG5ld0ZpbGVTeXN0ZW0oUGF0aCBwYXRoLCBNYXA8U3RyaW5nLCA/PiBlbnYpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkubmV3RmlsZVN5c3RlbSh1bndyYXAocGF0aCksIGVudik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElucHV0U3RyZWFtIG5ld0lucHV0U3RyZWFtKFBhdGggcGF0aCwgT3Blbk9wdGlvbi4uLiBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLm5ld0lucHV0U3RyZWFtKHVud3JhcChwYXRoKSwgb3B0aW9ucyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE91dHB1dFN0cmVhbSBuZXdPdXRwdXRTdHJlYW0oUGF0aCBwYXRoLCBPcGVuT3B0aW9uLi4uIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkubmV3T3V0cHV0U3RyZWFtKHVud3JhcChwYXRoKSwgb3B0aW9ucyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZpbGVDaGFubmVsIG5ld0ZpbGVDaGFubmVsKFBhdGggcGF0aCwgU2V0PD8gZXh0ZW5kcyBPcGVuT3B0aW9uPiBvcHRpb25zLCBGaWxlQXR0cmlidXRlPD8+Li4uIGF0dHJzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLm5ld0ZpbGVDaGFubmVsKHVud3JhcChwYXRoKSwgb3B0aW9ucywgYXR0cnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBc3luY2hyb25vdXNGaWxlQ2hhbm5lbCBuZXdBc3luY2hyb25vdXNGaWxlQ2hhbm5lbChQYXRoIHBhdGgsIFNldDw/IGV4dGVuZHMgT3Blbk9wdGlvbj4gb3B0aW9ucywgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yLCBGaWxlQXR0cmlidXRlPD8+Li4uIGF0dHJzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLm5ld0FzeW5jaHJvbm91c0ZpbGVDaGFubmVsKHVud3JhcChwYXRoKSwgb3B0aW9ucywgZXhlY3V0b3IsIGF0dHJzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjcmVhdGVTeW1ib2xpY0xpbmsoUGF0aCBsaW5rLCBQYXRoIHRhcmdldCwgRmlsZUF0dHJpYnV0ZTw/Pi4uLiBhdHRycykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBkZWxlZ2F0ZSgpLmNyZWF0ZVN5bWJvbGljTGluayh1bndyYXAobGluayksIHRhcmdldCwgYXR0cnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUxpbmsoUGF0aCBsaW5rLCBQYXRoIGV4aXN0aW5nKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRlbGVnYXRlKCkuY3JlYXRlTGluayh1bndyYXAobGluayksIHVud3JhcChleGlzdGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZUlmRXhpc3RzKFBhdGggcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5kZWxldGVJZkV4aXN0cyh1bndyYXAocGF0aCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXRoIHJlYWRTeW1ib2xpY0xpbmsoUGF0aCBsaW5rKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiB3cmFwKGRlbGVnYXRlKCkucmVhZFN5bWJvbGljTGluayh1bndyYXAobGluaykpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vZmlsZXN5c3RlbS9Gb3J3YXJkaW5nUGF0aC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2ZpbGVzeXN0ZW0vRm9yd2FyZGluZ1BhdGguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGQwMDM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2ZpbGVzeXN0ZW0vRm9yd2FyZGluZ1BhdGguamF2YQpAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5maWxlc3lzdGVtOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVN5c3RlbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkxpbmtPcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuV2F0Y2hFdmVudDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLldhdGNoS2V5OworaW1wb3J0IGphdmEubmlvLmZpbGUuV2F0Y2hTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmF0b3JzOworCitwdWJsaWMgY2xhc3MgRm9yd2FyZGluZ1BhdGggaW1wbGVtZW50cyBQYXRoCit7CisgICAgcHJvdGVjdGVkIGZpbmFsIFBhdGggZGVsZWdhdGU7CisKKyAgICBwdWJsaWMgRm9yd2FyZGluZ1BhdGgoUGF0aCBkZWxlZ2F0ZSkKKyAgICB7CisgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUGF0aCBkZWxlZ2F0ZSgpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFBhdGggd3JhcChQYXRoIGEpCisgICAgeworICAgICAgICByZXR1cm4gYTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUGF0aCB1bndyYXAoUGF0aCBwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZpbGVTeXN0ZW0gZ2V0RmlsZVN5c3RlbSgpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5nZXRGaWxlU3lzdGVtKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNBYnNvbHV0ZSgpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5pc0Fic29sdXRlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFBhdGggZ2V0Um9vdCgpCisgICAgeworICAgICAgICByZXR1cm4gd3JhcChkZWxlZ2F0ZSgpLmdldFJvb3QoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFBhdGggZ2V0RmlsZU5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHdyYXAoZGVsZWdhdGUoKS5nZXRGaWxlTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUGF0aCBnZXRQYXJlbnQoKQorICAgIHsKKyAgICAgICAgUGF0aCBwYXJlbnQgPSBkZWxlZ2F0ZSgpLmdldFBhcmVudCgpOworICAgICAgICBpZiAocGFyZW50ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIHdyYXAocGFyZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldE5hbWVDb3VudCgpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5nZXROYW1lQ291bnQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUGF0aCBnZXROYW1lKGludCBpbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiB3cmFwKGRlbGVnYXRlKCkuZ2V0TmFtZShpbmRleCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXRoIHN1YnBhdGgoaW50IGJlZ2luSW5kZXgsIGludCBlbmRJbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiB3cmFwKGRlbGVnYXRlKCkuc3VicGF0aChiZWdpbkluZGV4LCBlbmRJbmRleCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0c1dpdGgoUGF0aCBvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLnN0YXJ0c1dpdGgodW53cmFwKG90aGVyKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc3RhcnRzV2l0aChTdHJpbmcgb3RoZXIpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5zdGFydHNXaXRoKG90aGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlbmRzV2l0aChQYXRoIG90aGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkuZW5kc1dpdGgodW53cmFwKG90aGVyKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZW5kc1dpdGgoU3RyaW5nIG90aGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkuZW5kc1dpdGgob3RoZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXRoIG5vcm1hbGl6ZSgpCisgICAgeworICAgICAgICByZXR1cm4gd3JhcChkZWxlZ2F0ZSgpLm5vcm1hbGl6ZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUGF0aCByZXNvbHZlKFBhdGggb3RoZXIpCisgICAgeworICAgICAgICByZXR1cm4gd3JhcChkZWxlZ2F0ZSgpLnJlc29sdmUodW53cmFwKG90aGVyKSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXRoIHJlc29sdmUoU3RyaW5nIG90aGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHdyYXAoZGVsZWdhdGUoKS5yZXNvbHZlKG90aGVyKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFBhdGggcmVzb2x2ZVNpYmxpbmcoUGF0aCBvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiB3cmFwKGRlbGVnYXRlKCkucmVzb2x2ZVNpYmxpbmcodW53cmFwKG90aGVyKSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXRoIHJlc29sdmVTaWJsaW5nKFN0cmluZyBvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiB3cmFwKGRlbGVnYXRlKCkucmVzb2x2ZVNpYmxpbmcob3RoZXIpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUGF0aCByZWxhdGl2aXplKFBhdGggb3RoZXIpCisgICAgeworICAgICAgICByZXR1cm4gd3JhcChkZWxlZ2F0ZSgpLnJlbGF0aXZpemUodW53cmFwKG90aGVyKSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVUkkgdG9VcmkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkudG9VcmkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUGF0aCB0b0Fic29sdXRlUGF0aCgpCisgICAgeworICAgICAgICByZXR1cm4gd3JhcChkZWxlZ2F0ZSgpLnRvQWJzb2x1dGVQYXRoKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXRoIHRvUmVhbFBhdGgoTGlua09wdGlvbi4uLiBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiB3cmFwKGRlbGVnYXRlKCkudG9SZWFsUGF0aChvcHRpb25zKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZpbGUgdG9GaWxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLnRvRmlsZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBXYXRjaEtleSByZWdpc3RlcihXYXRjaFNlcnZpY2Ugd2F0Y2hlciwgV2F0Y2hFdmVudC5LaW5kPD8+W10gZXZlbnRzLCBXYXRjaEV2ZW50Lk1vZGlmaWVyLi4uIG1vZGlmaWVycykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5yZWdpc3Rlcih3YXRjaGVyLCBldmVudHMsIG1vZGlmaWVycyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFdhdGNoS2V5IHJlZ2lzdGVyKFdhdGNoU2VydmljZSB3YXRjaGVyLCBXYXRjaEV2ZW50LktpbmQ8Pz4uLi4gZXZlbnRzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLnJlZ2lzdGVyKHdhdGNoZXIsIGV2ZW50cyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEl0ZXJhdG9yPFBhdGg+IGl0ZXJhdG9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBJdGVyYXRvcnMudHJhbnNmb3JtKGRlbGVnYXRlKCkuaXRlcmF0b3IoKSwgdGhpczo6d3JhcCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBjb21wYXJlVG8oUGF0aCBvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLmNvbXBhcmVUbyh1bndyYXAob3RoZXIpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLmVxdWFscyhvYmogaW5zdGFuY2VvZiBQYXRoID8gdW53cmFwKChQYXRoKSBvYmopIDogb2JqKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9maWxlc3lzdGVtL0xpc3RlbmFibGVGaWxlU3lzdGVtLmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vZmlsZXN5c3RlbS9MaXN0ZW5hYmxlRmlsZVN5c3RlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OWQzNGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vZmlsZXN5c3RlbS9MaXN0ZW5hYmxlRmlsZVN5c3RlbS5qYXZhCkBAIC0wLDAgKzEsODU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmZpbGVzeXN0ZW07CisKK2ltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uVW5jaGVja2VkSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uTWFwcGVkQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Bc3luY2hyb25vdXNGaWxlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DaGFubmVsczsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5SZWFkYWJsZUJ5dGVDaGFubmVsOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlZWthYmxlQnl0ZUNoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuV3JpdGFibGVCeXRlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVTeXN0ZW07CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlU3lzdGVtczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLk9wZW5PcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuU3RhbmRhcmRPcGVuT3B0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuYXR0cmlidXRlLkZpbGVBdHRyaWJ1dGU7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5zcGkuRmlsZVN5c3RlbVByb3ZpZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuTWVtb3J5VXRpbDsKKworcHVibGljIGNsYXNzIExpc3RlbmFibGVGaWxlU3lzdGVtIGV4dGVuZHMgRm9yd2FyZGluZ0ZpbGVTeXN0ZW0KK3sKKyAgICBARnVuY3Rpb25hbEludGVyZmFjZQorICAgIHB1YmxpYyBpbnRlcmZhY2UgUGF0aEZpbHRlcgorICAgIHsKKyAgICAgICAgYm9vbGVhbiBhY2NlcHQoUGF0aCBlbnRyeSkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgTGlzdGVuZXIKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBPblByZU9wZW4gZXh0ZW5kcyBMaXN0ZW5lcgorICAgIHsKKyAgICAgICAgdm9pZCBwcmVPcGVuKFBhdGggcGF0aCwgU2V0PD8gZXh0ZW5kcyBPcGVuT3B0aW9uPiBvcHRpb25zLCBGaWxlQXR0cmlidXRlPD8+W10gYXR0cnMpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uUG9zdE9wZW4gZXh0ZW5kcyBMaXN0ZW5lcgorICAgIHsKKyAgICAgICAgdm9pZCBwb3N0T3BlbihQYXRoIHBhdGgsIFNldDw/IGV4dGVuZHMgT3Blbk9wdGlvbj4gb3B0aW9ucywgRmlsZUF0dHJpYnV0ZTw/PltdIGF0dHJzLCBGaWxlQ2hhbm5lbCBjaGFubmVsKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBPblByZVJlYWQgZXh0ZW5kcyBMaXN0ZW5lcgorICAgIHsKKyAgICAgICAgdm9pZCBwcmVSZWFkKFBhdGggcGF0aCwgRmlsZUNoYW5uZWwgY2hhbm5lbCwgbG9uZyBwb3NpdGlvbiwgQnl0ZUJ1ZmZlciBkc3QpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uUG9zdFJlYWQgZXh0ZW5kcyBMaXN0ZW5lcgorICAgIHsKKyAgICAgICAgdm9pZCBwb3N0UmVhZChQYXRoIHBhdGgsIEZpbGVDaGFubmVsIGNoYW5uZWwsIGxvbmcgcG9zaXRpb24sIEJ5dGVCdWZmZXIgZHN0LCBpbnQgcmVhZCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25QcmVUcmFuc2ZlclRvIGV4dGVuZHMgTGlzdGVuZXIKKyAgICB7CisgICAgICAgIHZvaWQgcHJlVHJhbnNmZXJUbyhQYXRoIHBhdGgsIEZpbGVDaGFubmVsIGNoYW5uZWwsIGxvbmcgcG9zaXRpb24sIGxvbmcgY291bnQsIFdyaXRhYmxlQnl0ZUNoYW5uZWwgdGFyZ2V0KSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBPblBvc3RUcmFuc2ZlclRvIGV4dGVuZHMgTGlzdGVuZXIKKyAgICB7CisgICAgICAgIHZvaWQgcG9zdFRyYW5zZmVyVG8oUGF0aCBwYXRoLCBGaWxlQ2hhbm5lbCBjaGFubmVsLCBsb25nIHBvc2l0aW9uLCBsb25nIGNvdW50LCBXcml0YWJsZUJ5dGVDaGFubmVsIHRhcmdldCwgbG9uZyB0cmFuc2ZlcmVkKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBPblByZVRyYW5zZmVyRnJvbSBleHRlbmRzIExpc3RlbmVyCisgICAgeworICAgICAgICB2b2lkIHByZVRyYW5zZmVyRnJvbShQYXRoIHBhdGgsIEZpbGVDaGFubmVsIGNoYW5uZWwsIFJlYWRhYmxlQnl0ZUNoYW5uZWwgc3JjLCBsb25nIHBvc2l0aW9uLCBsb25nIGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBPblBvc3RUcmFuc2ZlckZyb20gZXh0ZW5kcyBMaXN0ZW5lcgorICAgIHsKKyAgICAgICAgdm9pZCBwb3N0VHJhbnNmZXJGcm9tKFBhdGggcGF0aCwgRmlsZUNoYW5uZWwgY2hhbm5lbCwgUmVhZGFibGVCeXRlQ2hhbm5lbCBzcmMsIGxvbmcgcG9zaXRpb24sIGxvbmcgY291bnQsIGxvbmcgdHJhbnNmZXJlZCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25QcmVXcml0ZSBleHRlbmRzIExpc3RlbmVyCisgICAgeworICAgICAgICB2b2lkIHByZVdyaXRlKFBhdGggcGF0aCwgRmlsZUNoYW5uZWwgY2hhbm5lbCwgbG9uZyBwb3NpdGlvbiwgQnl0ZUJ1ZmZlciBzcmMpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uUG9zdFdyaXRlIGV4dGVuZHMgTGlzdGVuZXIKKyAgICB7CisgICAgICAgIHZvaWQgcG9zdFdyaXRlKFBhdGggcGF0aCwgRmlsZUNoYW5uZWwgY2hhbm5lbCwgbG9uZyBwb3NpdGlvbiwgQnl0ZUJ1ZmZlciBzcmMsIGludCB3cm90ZSkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25QcmVQb3NpdGlvbiBleHRlbmRzIExpc3RlbmVyCisgICAgeworICAgICAgICB2b2lkIHByZVBvc2l0aW9uKFBhdGggcGF0aCwgRmlsZUNoYW5uZWwgY2hhbm5lbCwgbG9uZyBwb3NpdGlvbiwgbG9uZyBuZXdQb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25Qb3N0UG9zaXRpb24gZXh0ZW5kcyBMaXN0ZW5lcgorICAgIHsKKyAgICAgICAgdm9pZCBwb3N0UG9zaXRpb24oUGF0aCBwYXRoLCBGaWxlQ2hhbm5lbCBjaGFubmVsLCBsb25nIHBvc2l0aW9uLCBsb25nIG5ld1Bvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBPblByZVRydW5jYXRlIGV4dGVuZHMgTGlzdGVuZXIKKyAgICB7CisgICAgICAgIHZvaWQgcHJlVHJ1bmNhdGUoUGF0aCBwYXRoLCBGaWxlQ2hhbm5lbCBjaGFubmVsLCBsb25nIHNpemUsIGxvbmcgdGFyZ2V0U2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25Qb3N0VHJ1bmNhdGUgZXh0ZW5kcyBMaXN0ZW5lcgorICAgIHsKKyAgICAgICAgdm9pZCBwb3N0VHJ1bmNhdGUoUGF0aCBwYXRoLCBGaWxlQ2hhbm5lbCBjaGFubmVsLCBsb25nIHNpemUsIGxvbmcgdGFyZ2V0U2l6ZSwgbG9uZyBuZXdTaXplKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBPblByZUZvcmNlIGV4dGVuZHMgTGlzdGVuZXIKKyAgICB7CisgICAgICAgIHZvaWQgcHJlRm9yY2UoUGF0aCBwYXRoLCBGaWxlQ2hhbm5lbCBjaGFubmVsLCBib29sZWFuIG1ldGFEYXRhKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBPblBvc3RGb3JjZSBleHRlbmRzIExpc3RlbmVyCisgICAgeworICAgICAgICB2b2lkIHBvc3RGb3JjZShQYXRoIHBhdGgsIEZpbGVDaGFubmVsIGNoYW5uZWwsIGJvb2xlYW4gbWV0YURhdGEpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFVuc3Vic2NyaWJhYmxlIGV4dGVuZHMgQXV0b0Nsb3NlYWJsZQorICAgIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgY2xvc2UoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8T25QcmVPcGVuPiBvblByZU9wZW4gPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxPblBvc3RPcGVuPiBvblBvc3RPcGVuID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8T25QcmVUcmFuc2ZlclRvPiBvblByZVRyYW5zZmVyVG8gPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxPblBvc3RUcmFuc2ZlclRvPiBvblBvc3RUcmFuc2ZlclRvID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8T25QcmVSZWFkPiBvblByZVJlYWQgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxPblBvc3RSZWFkPiBvblBvc3RSZWFkID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8T25QcmVXcml0ZT4gb25QcmVXcml0ZSA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE9uUG9zdFdyaXRlPiBvblBvc3RXcml0ZSA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE9uUHJlVHJhbnNmZXJGcm9tPiBvblByZVRyYW5zZmVyRnJvbSA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE9uUG9zdFRyYW5zZmVyRnJvbT4gb25Qb3N0VHJhbnNmZXJGcm9tID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PD4oKTsKKworICAgIHByaXZhdGUgZmluYWwgTGlzdDxPblByZUZvcmNlPiBvblByZUZvcmNlID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8T25Qb3N0Rm9yY2U+IG9uUG9zdEZvcmNlID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8T25QcmVUcnVuY2F0ZT4gb25QcmVUcnVuY2F0ZSA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE9uUG9zdFRydW5jYXRlPiBvblBvc3RUcnVuY2F0ZSA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE9uUHJlUG9zaXRpb24+IG9uUHJlUG9zaXRpb24gPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxPblBvc3RQb3NpdGlvbj4gb25Qb3N0UG9zaXRpb24gPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxMaXN0PD8gZXh0ZW5kcyBMaXN0ZW5lcj4+IGxpc3RzID0gQXJyYXlzLmFzTGlzdChvblByZU9wZW4sIG9uUG9zdE9wZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uUHJlUmVhZCwgb25Qb3N0UmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25QcmVUcmFuc2ZlclRvLCBvblBvc3RUcmFuc2ZlclRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblByZVdyaXRlLCBvblBvc3RXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25QcmVUcmFuc2ZlckZyb20sIG9uUG9zdFRyYW5zZmVyRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25QcmVGb3JjZSwgb25Qb3N0Rm9yY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uUHJlVHJ1bmNhdGUsIG9uUG9zdFRydW5jYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblByZVBvc2l0aW9uLCBvblBvc3RQb3NpdGlvbik7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0ZW5hYmxlRmlsZVN5c3RlbVByb3ZpZGVyIHByb3ZpZGVyOworCisgICAgcHVibGljIExpc3RlbmFibGVGaWxlU3lzdGVtKEZpbGVTeXN0ZW0gZGVsZWdhdGUpCisgICAgeworICAgICAgICBzdXBlcihkZWxlZ2F0ZSk7CisgICAgICAgIHRoaXMucHJvdmlkZXIgPSBuZXcgTGlzdGVuYWJsZUZpbGVTeXN0ZW1Qcm92aWRlcihzdXBlci5wcm92aWRlcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgbGlzdGVuKExpc3RlbmVyIGxpc3RlbmVyKQorICAgIHsKKyAgICAgICAgTGlzdDxMaXN0PD8gZXh0ZW5kcyBMaXN0ZW5lcj4+IG1hdGNoZXMgPSBuZXcgQXJyYXlMaXN0PD4oMSk7CisgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIE9uUHJlT3BlbikKKyAgICAgICAgeworICAgICAgICAgICAgb25QcmVPcGVuLmFkZCgoT25QcmVPcGVuKSBsaXN0ZW5lcik7CisgICAgICAgICAgICBtYXRjaGVzLmFkZChvblByZU9wZW4pOworICAgICAgICB9CisgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIE9uUG9zdE9wZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIG9uUG9zdE9wZW4uYWRkKChPblBvc3RPcGVuKSBsaXN0ZW5lcik7CisgICAgICAgICAgICBtYXRjaGVzLmFkZChvblBvc3RPcGVuKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBPblByZVJlYWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG9uUHJlUmVhZC5hZGQoKE9uUHJlUmVhZCkgbGlzdGVuZXIpOworICAgICAgICAgICAgbWF0Y2hlcy5hZGQob25QcmVSZWFkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBPblBvc3RSZWFkKQorICAgICAgICB7CisgICAgICAgICAgICBvblBvc3RSZWFkLmFkZCgoT25Qb3N0UmVhZCkgbGlzdGVuZXIpOworICAgICAgICAgICAgbWF0Y2hlcy5hZGQob25Qb3N0UmVhZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgT25QcmVUcmFuc2ZlclRvKQorICAgICAgICB7CisgICAgICAgICAgICBvblByZVRyYW5zZmVyVG8uYWRkKChPblByZVRyYW5zZmVyVG8pIGxpc3RlbmVyKTsKKyAgICAgICAgICAgIG1hdGNoZXMuYWRkKG9uUHJlVHJhbnNmZXJUbyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgT25Qb3N0VHJhbnNmZXJUbykKKyAgICAgICAgeworICAgICAgICAgICAgb25Qb3N0VHJhbnNmZXJUby5hZGQoKE9uUG9zdFRyYW5zZmVyVG8pIGxpc3RlbmVyKTsKKyAgICAgICAgICAgIG1hdGNoZXMuYWRkKG9uUG9zdFRyYW5zZmVyVG8pOworICAgICAgICB9CisgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIE9uUHJlV3JpdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIG9uUHJlV3JpdGUuYWRkKChPblByZVdyaXRlKSBsaXN0ZW5lcik7CisgICAgICAgICAgICBtYXRjaGVzLmFkZChvblByZVdyaXRlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBPblBvc3RXcml0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgb25Qb3N0V3JpdGUuYWRkKChPblBvc3RXcml0ZSkgbGlzdGVuZXIpOworICAgICAgICAgICAgbWF0Y2hlcy5hZGQob25Qb3N0V3JpdGUpOworICAgICAgICB9CisgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIE9uUHJlVHJhbnNmZXJGcm9tKQorICAgICAgICB7CisgICAgICAgICAgICBvblByZVRyYW5zZmVyRnJvbS5hZGQoKE9uUHJlVHJhbnNmZXJGcm9tKSBsaXN0ZW5lcik7CisgICAgICAgICAgICBtYXRjaGVzLmFkZChvblByZVRyYW5zZmVyRnJvbSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgT25Qb3N0VHJhbnNmZXJGcm9tKQorICAgICAgICB7CisgICAgICAgICAgICBvblBvc3RUcmFuc2ZlckZyb20uYWRkKChPblBvc3RUcmFuc2ZlckZyb20pIGxpc3RlbmVyKTsKKyAgICAgICAgICAgIG1hdGNoZXMuYWRkKG9uUG9zdFRyYW5zZmVyRnJvbSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgT25QcmVGb3JjZSkKKyAgICAgICAgeworICAgICAgICAgICAgb25QcmVGb3JjZS5hZGQoKE9uUHJlRm9yY2UpIGxpc3RlbmVyKTsKKyAgICAgICAgICAgIG1hdGNoZXMuYWRkKG9uUHJlRm9yY2UpOworICAgICAgICB9CisgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIE9uUG9zdEZvcmNlKQorICAgICAgICB7CisgICAgICAgICAgICBvblBvc3RGb3JjZS5hZGQoKE9uUG9zdEZvcmNlKSBsaXN0ZW5lcik7CisgICAgICAgICAgICBtYXRjaGVzLmFkZChvblBvc3RGb3JjZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgT25QcmVUcnVuY2F0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgb25QcmVUcnVuY2F0ZS5hZGQoKE9uUHJlVHJ1bmNhdGUpIGxpc3RlbmVyKTsKKyAgICAgICAgICAgIG1hdGNoZXMuYWRkKG9uUHJlVHJ1bmNhdGUpOworICAgICAgICB9CisgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIE9uUG9zdFRydW5jYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBvblBvc3RUcnVuY2F0ZS5hZGQoKE9uUG9zdFRydW5jYXRlKSBsaXN0ZW5lcik7CisgICAgICAgICAgICBtYXRjaGVzLmFkZChvblBvc3RUcnVuY2F0ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgT25QcmVQb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgb25QcmVQb3NpdGlvbi5hZGQoKE9uUHJlUG9zaXRpb24pIGxpc3RlbmVyKTsKKyAgICAgICAgICAgIG1hdGNoZXMuYWRkKG9uUHJlUG9zaXRpb24pOworICAgICAgICB9CisgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIE9uUG9zdFBvc2l0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBvblBvc3RQb3NpdGlvbi5hZGQoKE9uUG9zdFBvc2l0aW9uKSBsaXN0ZW5lcik7CisgICAgICAgICAgICBtYXRjaGVzLmFkZChvblBvc3RQb3NpdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hdGNoZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5hYmxlIHRvIGZpbmQgYSBsaXN0ZW5hYmxlIHR5cGUgZm9yICIgKyBsaXN0ZW5lci5nZXRDbGFzcygpKTsKKyAgICAgICAgcmV0dXJuICgpIC0+IHJlbW92ZShtYXRjaGVzLCBsaXN0ZW5lcik7CisgICAgfQorCisgICAgcHVibGljIFVuc3Vic2NyaWJhYmxlIG9uUHJlT3BlbihPblByZU9wZW4gY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gbGlzdGVuKGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgb25QcmVPcGVuKFBhdGhGaWx0ZXIgZmlsdGVyLCBPblByZU9wZW4gY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gb25QcmVPcGVuKChwYXRoLCBvcHRpb25zLCBhdHRycykgLT4geworICAgICAgICAgICAgaWYgKGZpbHRlci5hY2NlcHQocGF0aCkpCisgICAgICAgICAgICAgICAgY2FsbGJhY2sucHJlT3BlbihwYXRoLCBvcHRpb25zLCBhdHRycyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblBvc3RPcGVuKE9uUG9zdE9wZW4gY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gbGlzdGVuKGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgb25Qb3N0T3BlbihQYXRoRmlsdGVyIGZpbHRlciwgT25Qb3N0T3BlbiBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHJldHVybiBvblBvc3RPcGVuKChwYXRoLCBvcHRpb25zLCBhdHRycywgY2hhbm5lbCkgLT4geworICAgICAgICAgICAgaWYgKGZpbHRlci5hY2NlcHQocGF0aCkpCisgICAgICAgICAgICAgICAgY2FsbGJhY2sucG9zdE9wZW4ocGF0aCwgb3B0aW9ucywgYXR0cnMsIGNoYW5uZWwpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgb25QcmVSZWFkKE9uUHJlUmVhZCBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHJldHVybiBsaXN0ZW4oY2FsbGJhY2spOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblByZVJlYWQoUGF0aEZpbHRlciBmaWx0ZXIsIE9uUHJlUmVhZCBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHJldHVybiBvblByZVJlYWQoKHBhdGgsIGNoYW5uZWwsIHBvc2l0aW9uLCBkc3QpIC0+IHsKKyAgICAgICAgICAgIGlmIChmaWx0ZXIuYWNjZXB0KHBhdGgpKQorICAgICAgICAgICAgICAgIGNhbGxiYWNrLnByZVJlYWQocGF0aCwgY2hhbm5lbCwgcG9zaXRpb24sIGRzdCk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblBvc3RSZWFkKE9uUG9zdFJlYWQgY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gbGlzdGVuKGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgb25Qb3N0UmVhZChQYXRoRmlsdGVyIGZpbHRlciwgT25Qb3N0UmVhZCBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHJldHVybiBvblBvc3RSZWFkKChwYXRoLCBjaGFubmVsLCBwb3NpdGlvbiwgZHN0LCByZWFkKSAtPiB7CisgICAgICAgICAgICBpZiAoZmlsdGVyLmFjY2VwdChwYXRoKSkKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5wb3N0UmVhZChwYXRoLCBjaGFubmVsLCBwb3NpdGlvbiwgZHN0LCByZWFkKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIFVuc3Vic2NyaWJhYmxlIG9uUHJlVHJhbnNmZXJUbyhPblByZVRyYW5zZmVyVG8gY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gbGlzdGVuKGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgb25QcmVUcmFuc2ZlclRvKFBhdGhGaWx0ZXIgZmlsdGVyLCBPblByZVRyYW5zZmVyVG8gY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gb25QcmVUcmFuc2ZlclRvKChwYXRoLCBjaGFubmVsLCBwb3NpdGlvbiwgY291bnQsIHRhcmdldCkgLT4geworICAgICAgICAgICAgaWYgKGZpbHRlci5hY2NlcHQocGF0aCkpCisgICAgICAgICAgICAgICAgY2FsbGJhY2sucHJlVHJhbnNmZXJUbyhwYXRoLCBjaGFubmVsLCBwb3NpdGlvbiwgY291bnQsIHRhcmdldCk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblBvc3RUcmFuc2ZlclRvKE9uUG9zdFRyYW5zZmVyVG8gY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gbGlzdGVuKGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgb25Qb3N0VHJhbnNmZXJUbyhQYXRoRmlsdGVyIGZpbHRlciwgT25Qb3N0VHJhbnNmZXJUbyBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHJldHVybiBvblBvc3RUcmFuc2ZlclRvKChwYXRoLCBjaGFubmVsLCBwb3NpdGlvbiwgY291bnQsIHRhcmdldCwgdHJhbnNmZXJlZCkgLT4geworICAgICAgICAgICAgaWYgKGZpbHRlci5hY2NlcHQocGF0aCkpCisgICAgICAgICAgICAgICAgY2FsbGJhY2sucG9zdFRyYW5zZmVyVG8ocGF0aCwgY2hhbm5lbCwgcG9zaXRpb24sIGNvdW50LCB0YXJnZXQsIHRyYW5zZmVyZWQpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgb25QcmVUcmFuc2ZlckZyb20oT25QcmVUcmFuc2ZlckZyb20gY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gbGlzdGVuKGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgb25QcmVUcmFuc2ZlckZyb20oUGF0aEZpbHRlciBmaWx0ZXIsIE9uUHJlVHJhbnNmZXJGcm9tIGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG9uUHJlVHJhbnNmZXJGcm9tKChwYXRoLCBjaGFubmVsLCBzcmMsIHBvc2l0aW9uLCBjb3VudCkgLT4geworICAgICAgICAgICAgaWYgKGZpbHRlci5hY2NlcHQocGF0aCkpCisgICAgICAgICAgICAgICAgY2FsbGJhY2sucHJlVHJhbnNmZXJGcm9tKHBhdGgsIGNoYW5uZWwsIHNyYywgcG9zaXRpb24sIGNvdW50KTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIFVuc3Vic2NyaWJhYmxlIG9uUG9zdFRyYW5zZmVyRnJvbShPblBvc3RUcmFuc2ZlckZyb20gY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gbGlzdGVuKGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgb25Qb3N0VHJhbnNmZXJGcm9tKFBhdGhGaWx0ZXIgZmlsdGVyLCBPblBvc3RUcmFuc2ZlckZyb20gY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gb25Qb3N0VHJhbnNmZXJGcm9tKChwYXRoLCBjaGFubmVsLCBzcmMsIHBvc2l0aW9uLCBjb3VudCwgdHJhbnNmZXJlZCkgLT4geworICAgICAgICAgICAgaWYgKGZpbHRlci5hY2NlcHQocGF0aCkpCisgICAgICAgICAgICAgICAgY2FsbGJhY2sucG9zdFRyYW5zZmVyRnJvbShwYXRoLCBjaGFubmVsLCBzcmMsIHBvc2l0aW9uLCBjb3VudCwgdHJhbnNmZXJlZCk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblByZVdyaXRlKE9uUHJlV3JpdGUgY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gbGlzdGVuKGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgb25QcmVXcml0ZShQYXRoRmlsdGVyIGZpbHRlciwgT25QcmVXcml0ZSBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHJldHVybiBvblByZVdyaXRlKChwYXRoLCBjaGFubmVsLCBwb3NpdGlvbiwgc3JjKSAtPiB7CisgICAgICAgICAgICBpZiAoZmlsdGVyLmFjY2VwdChwYXRoKSkKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5wcmVXcml0ZShwYXRoLCBjaGFubmVsLCBwb3NpdGlvbiwgc3JjKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIFVuc3Vic2NyaWJhYmxlIG9uUG9zdFdyaXRlKE9uUG9zdFdyaXRlIGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGxpc3RlbihjYWxsYmFjayk7CisgICAgfQorCisgICAgcHVibGljIFVuc3Vic2NyaWJhYmxlIG9uUG9zdFdyaXRlKFBhdGhGaWx0ZXIgZmlsdGVyLCBPblBvc3RXcml0ZSBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHJldHVybiBvblBvc3RXcml0ZSgocGF0aCwgY2hhbm5lbCwgcG9zaXRpb24sIHNyYywgd3JvdGUpIC0+IHsKKyAgICAgICAgICAgIGlmIChmaWx0ZXIuYWNjZXB0KHBhdGgpKQorICAgICAgICAgICAgICAgIGNhbGxiYWNrLnBvc3RXcml0ZShwYXRoLCBjaGFubmVsLCBwb3NpdGlvbiwgc3JjLCB3cm90ZSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblByZVBvc2l0aW9uKE9uUHJlUG9zaXRpb24gY2FsbGJhY2trKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGxpc3RlbihjYWxsYmFja2spOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblByZVBvc2l0aW9uKFBhdGhGaWx0ZXIgZmlsdGVyLCBPblByZVBvc2l0aW9uIGNhbGxiYWNraykKKyAgICB7CisgICAgICAgIHJldHVybiBvblByZVBvc2l0aW9uKChwYXRoLCBjaGFubmVsLCBwb3NpdGlvbiwgbmV3UG9zaXRpb24pIC0+IHsKKyAgICAgICAgICAgaWYgKGZpbHRlci5hY2NlcHQocGF0aCkpCisgICAgICAgICAgICAgICBjYWxsYmFja2sucHJlUG9zaXRpb24ocGF0aCwgY2hhbm5lbCwgcG9zaXRpb24sIG5ld1Bvc2l0aW9uKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIFVuc3Vic2NyaWJhYmxlIG9uUG9zdFBvc2l0aW9uKE9uUG9zdFBvc2l0aW9uIGNhbGxiYWNraykKKyAgICB7CisgICAgICAgIHJldHVybiBsaXN0ZW4oY2FsbGJhY2trKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgb25Qb3N0UG9zaXRpb24oUGF0aEZpbHRlciBmaWx0ZXIsIE9uUG9zdFBvc2l0aW9uIGNhbGxiYWNraykKKyAgICB7CisgICAgICAgIHJldHVybiBvblBvc3RQb3NpdGlvbigocGF0aCwgY2hhbm5lbCwgcG9zaXRpb24sIG5ld1Bvc2l0aW9uKSAtPiB7CisgICAgICAgICAgICBpZiAoZmlsdGVyLmFjY2VwdChwYXRoKSkKKyAgICAgICAgICAgICAgICBjYWxsYmFja2sucG9zdFBvc2l0aW9uKHBhdGgsIGNoYW5uZWwsIHBvc2l0aW9uLCBuZXdQb3NpdGlvbik7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblByZVRydW5jYXRlKE9uUHJlVHJ1bmNhdGUgY2FsbGJhY2trKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGxpc3RlbihjYWxsYmFja2spOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblByZVRydW5jYXRlKFBhdGhGaWx0ZXIgZmlsdGVyLCBPblByZVRydW5jYXRlIGNhbGxiYWNraykKKyAgICB7CisgICAgICAgIHJldHVybiBvblByZVRydW5jYXRlKChwYXRoLCBjaGFubmVsLCBzaXplLCB0YXJnZXRTaXplKSAtPiB7CisgICAgICAgICAgICBpZiAoZmlsdGVyLmFjY2VwdChwYXRoKSkKKyAgICAgICAgICAgICAgICBjYWxsYmFja2sucHJlVHJ1bmNhdGUocGF0aCwgY2hhbm5lbCwgc2l6ZSwgdGFyZ2V0U2l6ZSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblBvc3RUcnVuY2F0ZShPblBvc3RUcnVuY2F0ZSBjYWxsYmFja2spCisgICAgeworICAgICAgICByZXR1cm4gbGlzdGVuKGNhbGxiYWNrayk7CisgICAgfQorCisgICAgcHVibGljIFVuc3Vic2NyaWJhYmxlIG9uUG9zdFRydW5jYXRlKFBhdGhGaWx0ZXIgZmlsdGVyLCBPblBvc3RUcnVuY2F0ZSBjYWxsYmFja2spCisgICAgeworICAgICAgICByZXR1cm4gb25Qb3N0VHJ1bmNhdGUoKHBhdGgsIGNoYW5uZWwsIHNpemUsIHRhcmdldFNpemUsIG5ld1NpemUpIC0+IHsKKyAgICAgICAgICAgIGlmIChmaWx0ZXIuYWNjZXB0KHBhdGgpKQorICAgICAgICAgICAgICAgIGNhbGxiYWNray5wb3N0VHJ1bmNhdGUocGF0aCwgY2hhbm5lbCwgc2l6ZSwgdGFyZ2V0U2l6ZSwgbmV3U2l6ZSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblByZUZvcmNlKE9uUHJlRm9yY2UgY2FsbGJhY2trKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGxpc3RlbihjYWxsYmFja2spOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblByZUZvcmNlKFBhdGhGaWx0ZXIgZmlsdGVyLCBPblByZUZvcmNlIGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG9uUHJlRm9yY2UoKHBhdGgsIGNoYW5uZWwsIG1ldGFkYXRhKSAtPiB7CisgICAgICAgICAgICBpZiAoZmlsdGVyLmFjY2VwdChwYXRoKSkKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5wcmVGb3JjZShwYXRoLCBjaGFubmVsLCBtZXRhZGF0YSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblBvc3RGb3JjZShPblBvc3RGb3JjZSBjYWxsYmFja2spCisgICAgeworICAgICAgICByZXR1cm4gbGlzdGVuKGNhbGxiYWNrayk7CisgICAgfQorCisgICAgcHVibGljIFVuc3Vic2NyaWJhYmxlIG9uUG9zdEZvcmNlKFBhdGhGaWx0ZXIgZmlsdGVyLCBPblBvc3RGb3JjZSBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHJldHVybiBvblBvc3RGb3JjZSgocGF0aCwgY2hhbm5lbCwgbWV0YWRhdGEpIC0+IHsKKyAgICAgICAgICAgIGlmIChmaWx0ZXIuYWNjZXB0KHBhdGgpKQorICAgICAgICAgICAgICAgIGNhbGxiYWNrLnBvc3RGb3JjZShwYXRoLCBjaGFubmVsLCBtZXRhZGF0YSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZShMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICB7CisgICAgICAgIHJlbW92ZShsaXN0cywgbGlzdGVuZXIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlKExpc3Q8TGlzdDw/IGV4dGVuZHMgTGlzdGVuZXI+PiBsaXN0cywgTGlzdGVuZXIgbGlzdGVuZXIpCisgICAgeworICAgICAgICBsaXN0cy5mb3JFYWNoKGwgLT4gbC5yZW1vdmUobGlzdGVuZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhckxpc3RlbmVycygpCisgICAgeworICAgICAgICBsaXN0cy5mb3JFYWNoKExpc3Q6OmNsZWFyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludGVyZmFjZSBMaXN0ZW5lckFjdGlvbjxUPgorICAgIHsKKyAgICAgICAgdm9pZCBhY2NlcHQoVCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIH0KKworICAgIHByaXZhdGUgPFQ+IHZvaWQgbm90aWZ5TGlzdGVuZXJzKExpc3Q8VD4gbGlzdGVuZXJzLCBMaXN0ZW5lckFjdGlvbjxUPiBmbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBmb3IgKFQgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpCisgICAgICAgICAgICBmbi5hY2NlcHQobGlzdGVuZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBQYXRoIHdyYXAoUGF0aCBwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHAgaW5zdGFuY2VvZiBMaXN0ZW5hYmxlUGF0aCA/IHAgOiBuZXcgTGlzdGVuYWJsZVBhdGgocCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFBhdGggdW53cmFwKFBhdGggcCkKKyAgICB7CisgICAgICAgIHJldHVybiBwIGluc3RhbmNlb2YgTGlzdGVuYWJsZVBhdGggPyAoKExpc3RlbmFibGVQYXRoKSBwKS5kZWxlZ2F0ZSA6IHA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3RlbmFibGVGaWxlU3lzdGVtUHJvdmlkZXIgcHJvdmlkZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHByb3ZpZGVyOworICAgIH0KKworCisgICAgcHJpdmF0ZSBjbGFzcyBMaXN0ZW5hYmxlRmlsZVN5c3RlbVByb3ZpZGVyIGV4dGVuZHMgRm9yd2FyZGluZ0ZpbGVTeXN0ZW1Qcm92aWRlcgorICAgIHsKKyAgICAgICAgTGlzdGVuYWJsZUZpbGVTeXN0ZW1Qcm92aWRlcihGaWxlU3lzdGVtUHJvdmlkZXIgZGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGRlbGVnYXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgUGF0aCB3cmFwKFBhdGggYSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIExpc3RlbmFibGVGaWxlU3lzdGVtLnRoaXMud3JhcChhKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgUGF0aCB1bndyYXAoUGF0aCBwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTGlzdGVuYWJsZUZpbGVTeXN0ZW0udGhpcy51bndyYXAocCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSBuZXdPdXRwdXRTdHJlYW0oUGF0aCBwYXRoLCBPcGVuT3B0aW9uLi4uIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbGVuID0gb3B0aW9ucy5sZW5ndGg7CisgICAgICAgICAgICBTZXQ8T3Blbk9wdGlvbj4gb3B0cyA9IG5ldyBIYXNoU2V0PD4obGVuICsgMyk7CisgICAgICAgICAgICBpZiAobGVuID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3B0cy5hZGQoU3RhbmRhcmRPcGVuT3B0aW9uLkNSRUFURSk7CisgICAgICAgICAgICAgICAgb3B0cy5hZGQoU3RhbmRhcmRPcGVuT3B0aW9uLlRSVU5DQVRFX0VYSVNUSU5HKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKE9wZW5PcHRpb24gb3B0IDogb3B0aW9ucykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvcHQgPT0gU3RhbmRhcmRPcGVuT3B0aW9uLlJFQUQpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSRUFEIG5vdCBhbGxvd2VkIik7CisgICAgICAgICAgICAgICAgICAgIG9wdHMuYWRkKG9wdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3B0cy5hZGQoU3RhbmRhcmRPcGVuT3B0aW9uLldSSVRFKTsKKyAgICAgICAgICAgIHJldHVybiBDaGFubmVscy5uZXdPdXRwdXRTdHJlYW0obmV3RmlsZUNoYW5uZWwocGF0aCwgb3B0cykpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBuZXdJbnB1dFN0cmVhbShQYXRoIHBhdGgsIE9wZW5PcHRpb24uLi4gb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoT3Blbk9wdGlvbiBvcHQgOiBvcHRpb25zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEFsbCBPcGVuT3B0aW9uIHZhbHVlcyBleGNlcHQgZm9yIEFQUEVORCBhbmQgV1JJVEUgYXJlIGFsbG93ZWQKKyAgICAgICAgICAgICAgICBpZiAob3B0ID09IFN0YW5kYXJkT3Blbk9wdGlvbi5BUFBFTkQgfHwKKyAgICAgICAgICAgICAgICAgICAgb3B0ID09IFN0YW5kYXJkT3Blbk9wdGlvbi5XUklURSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCInIiArIG9wdCArICInIG5vdCBhbGxvd2VkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTZXQ8T3Blbk9wdGlvbj4gb3B0cyA9IG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdChvcHRpb25zKSk7CisgICAgICAgICAgICByZXR1cm4gQ2hhbm5lbHMubmV3SW5wdXRTdHJlYW0obmV3RmlsZUNoYW5uZWwocGF0aCwgb3B0cykpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTZWVrYWJsZUJ5dGVDaGFubmVsIG5ld0J5dGVDaGFubmVsKFBhdGggcGF0aCwgU2V0PD8gZXh0ZW5kcyBPcGVuT3B0aW9uPiBvcHRpb25zLCBGaWxlQXR0cmlidXRlPD8+Li4uIGF0dHJzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ld0ZpbGVDaGFubmVsKHBhdGgsIG9wdGlvbnMsIGF0dHJzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRmlsZUNoYW5uZWwgbmV3RmlsZUNoYW5uZWwoUGF0aCBwYXRoLCBTZXQ8PyBleHRlbmRzIE9wZW5PcHRpb24+IG9wdGlvbnMsIEZpbGVBdHRyaWJ1dGU8Pz4uLi4gYXR0cnMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMob25QcmVPcGVuLCBsIC0+IGwucHJlT3BlbihwYXRoLCBvcHRpb25zLCBhdHRycykpOworICAgICAgICAgICAgTGlzdGVuYWJsZUZpbGVDaGFubmVsIGNoYW5uZWwgPSBuZXcgTGlzdGVuYWJsZUZpbGVDaGFubmVsKHBhdGgsIGRlbGVnYXRlKCkubmV3RmlsZUNoYW5uZWwodW53cmFwKHBhdGgpLCBvcHRpb25zLCBhdHRycykpOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKG9uUG9zdE9wZW4sIGwgLT4gbC5wb3N0T3BlbihwYXRoLCBvcHRpb25zLCBhdHRycywgY2hhbm5lbCkpOworICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFzeW5jaHJvbm91c0ZpbGVDaGFubmVsIG5ld0FzeW5jaHJvbm91c0ZpbGVDaGFubmVsKFBhdGggcGF0aCwgU2V0PD8gZXh0ZW5kcyBPcGVuT3B0aW9uPiBvcHRpb25zLCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IsIEZpbGVBdHRyaWJ1dGU8Pz4uLi4gYXR0cnMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRPRE8iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGJsb2NrIHRoZSBBUElzIHRoYXQgdHJ5IHRvIHN3aXRjaCBGaWxlU3lzdGVtIGJhc2VkIG9mZiBzY2hlbWEKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBGaWxlU3lzdGVtIG5ld0ZpbGVTeXN0ZW0oVVJJIHVyaSwgTWFwPFN0cmluZywgPz4gZW52KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEZpbGVTeXN0ZW0gbmV3RmlsZVN5c3RlbShQYXRoIHBhdGgsIE1hcDxTdHJpbmcsID8+IGVudikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEZpbGVTeXN0ZW0gZ2V0RmlsZVN5c3RlbShVUkkgdXJpKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTGlzdGVuYWJsZVBhdGggZXh0ZW5kcyBGb3J3YXJkaW5nUGF0aAorICAgIHsKKyAgICAgICAgcHVibGljIExpc3RlbmFibGVQYXRoKFBhdGggZGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGRlbGVnYXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgUGF0aCB3cmFwKFBhdGggYSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIExpc3RlbmFibGVGaWxlU3lzdGVtLnRoaXMud3JhcChhKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgUGF0aCB1bndyYXAoUGF0aCBwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTGlzdGVuYWJsZUZpbGVTeXN0ZW0udGhpcy51bndyYXAocCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEZpbGVTeXN0ZW0gZ2V0RmlsZVN5c3RlbSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBMaXN0ZW5hYmxlRmlsZVN5c3RlbS50aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBGaWxlIHRvRmlsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkZWxlZ2F0ZSgpLmdldEZpbGVTeXN0ZW0oKSA9PSBGaWxlU3lzdGVtcy5nZXREZWZhdWx0KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkudG9GaWxlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTGlzdGVuYWJsZUZpbGVDaGFubmVsIGV4dGVuZHMgRm9yd2FyZGluZ0ZpbGVDaGFubmVsCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxNYXBwZWQ+IG11dGFibGUgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYXRoIHBhdGg7CisKKyAgICAgICAgTGlzdGVuYWJsZUZpbGVDaGFubmVsKFBhdGggcGF0aCwgRmlsZUNoYW5uZWwgZGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGRlbGVnYXRlKTsKKyAgICAgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCByZWFkKEJ5dGVCdWZmZXIgZHN0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBwb3NpdGlvbiA9IHBvc2l0aW9uKCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMob25QcmVSZWFkLCBsIC0+IGwucHJlUmVhZChwYXRoLCB0aGlzLCBwb3NpdGlvbiwgZHN0KSk7CisgICAgICAgICAgICBpbnQgcmVhZCA9IHN1cGVyLnJlYWQoZHN0KTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyhvblBvc3RSZWFkLCBsIC0+IGwucG9zdFJlYWQocGF0aCwgdGhpcywgcG9zaXRpb24sIGRzdCwgcmVhZCkpOworICAgICAgICAgICAgcmV0dXJuIHJlYWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCByZWFkKEJ5dGVCdWZmZXIgZHN0LCBsb25nIHBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKG9uUHJlUmVhZCwgbCAtPiBsLnByZVJlYWQocGF0aCwgdGhpcywgcG9zaXRpb24sIGRzdCkpOworICAgICAgICAgICAgaW50IHJlYWQgPSBzdXBlci5yZWFkKGRzdCwgcG9zaXRpb24pOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKG9uUG9zdFJlYWQsIGwgLT4gbC5wb3N0UmVhZChwYXRoLCB0aGlzLCBwb3NpdGlvbiwgZHN0LCByZWFkKSk7CisgICAgICAgICAgICByZXR1cm4gcmVhZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHdyaXRlKEJ5dGVCdWZmZXIgc3JjKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBwb3NpdGlvbiA9IHBvc2l0aW9uKCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMob25QcmVXcml0ZSwgbCAtPiBsLnByZVdyaXRlKHBhdGgsIHRoaXMsIHBvc2l0aW9uLCBzcmMpKTsKKyAgICAgICAgICAgIGludCB3cml0ZSA9IHN1cGVyLndyaXRlKHNyYyk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMob25Qb3N0V3JpdGUsIGwgLT4gbC5wb3N0V3JpdGUocGF0aCwgdGhpcywgcG9zaXRpb24sIHNyYywgd3JpdGUpKTsKKyAgICAgICAgICAgIHJldHVybiB3cml0ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHdyaXRlKEJ5dGVCdWZmZXIgc3JjLCBsb25nIHBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKG9uUHJlV3JpdGUsIGwgLT4gbC5wcmVXcml0ZShwYXRoLCB0aGlzLCBwb3NpdGlvbiwgc3JjKSk7CisgICAgICAgICAgICBpbnQgd3JpdGUgPSBzdXBlci53cml0ZShzcmMsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyhvblBvc3RXcml0ZSwgbCAtPiBsLnBvc3RXcml0ZShwYXRoLCB0aGlzLCBwb3NpdGlvbiwgc3JjLCB3cml0ZSkpOworICAgICAgICAgICAgcmV0dXJuIHdyaXRlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBGaWxlQ2hhbm5lbCBwb3NpdGlvbihsb25nIG5ld1Bvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBwb3NpdGlvbiA9IHBvc2l0aW9uKCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMob25QcmVQb3NpdGlvbiwgbCAtPiBsLnByZVBvc2l0aW9uKHBhdGgsIHRoaXMsIHBvc2l0aW9uLCBuZXdQb3NpdGlvbikpOworICAgICAgICAgICAgc3VwZXIucG9zaXRpb24obmV3UG9zaXRpb24pOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKG9uUG9zdFBvc2l0aW9uLCBsIC0+IGwucG9zdFBvc2l0aW9uKHBhdGgsIHRoaXMsIHBvc2l0aW9uLCBuZXdQb3NpdGlvbikpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEZpbGVDaGFubmVsIHRydW5jYXRlKGxvbmcgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgY3VycmVudFNpemUgPSB0aGlzLnNpemUoKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyhvblByZVRydW5jYXRlLCBsIC0+IGwucHJlVHJ1bmNhdGUocGF0aCwgdGhpcywgY3VycmVudFNpemUsIHNpemUpKTsKKyAgICAgICAgICAgIHN1cGVyLnRydW5jYXRlKHNpemUpOworICAgICAgICAgICAgbG9uZyBsYXRlc3RTaXplID0gdGhpcy5zaXplKCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMob25Qb3N0VHJ1bmNhdGUsIGwgLT4gbC5wb3N0VHJ1bmNhdGUocGF0aCwgdGhpcywgY3VycmVudFNpemUsIHNpemUsIGxhdGVzdFNpemUpKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZvcmNlKGJvb2xlYW4gbWV0YURhdGEpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMob25QcmVGb3JjZSwgbCAtPiBsLnByZUZvcmNlKHBhdGgsIHRoaXMsIG1ldGFEYXRhKSk7CisgICAgICAgICAgICBzdXBlci5mb3JjZShtZXRhRGF0YSk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMob25Qb3N0Rm9yY2UsIGwgLT4gbC5wb3N0Rm9yY2UocGF0aCwgdGhpcywgbWV0YURhdGEpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyB0cmFuc2ZlclRvKGxvbmcgcG9zaXRpb24sIGxvbmcgY291bnQsIFdyaXRhYmxlQnl0ZUNoYW5uZWwgdGFyZ2V0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKG9uUHJlVHJhbnNmZXJUbywgbCAtPiBsLnByZVRyYW5zZmVyVG8ocGF0aCwgdGhpcywgcG9zaXRpb24sIGNvdW50LCB0YXJnZXQpKTsKKyAgICAgICAgICAgIGxvbmcgdHJhbnNmZXJlZCA9IHN1cGVyLnRyYW5zZmVyVG8ocG9zaXRpb24sIGNvdW50LCB0YXJnZXQpOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKG9uUG9zdFRyYW5zZmVyVG8sIGwgLT4gbC5wb3N0VHJhbnNmZXJUbyhwYXRoLCB0aGlzLCBwb3NpdGlvbiwgY291bnQsIHRhcmdldCwgdHJhbnNmZXJlZCkpOworICAgICAgICAgICAgcmV0dXJuIHRyYW5zZmVyZWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgdHJhbnNmZXJGcm9tKFJlYWRhYmxlQnl0ZUNoYW5uZWwgc3JjLCBsb25nIHBvc2l0aW9uLCBsb25nIGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKG9uUHJlVHJhbnNmZXJGcm9tLCBsIC0+IGwucHJlVHJhbnNmZXJGcm9tKHBhdGgsIHRoaXMsIHNyYywgcG9zaXRpb24sIGNvdW50KSk7CisgICAgICAgICAgICBsb25nIHRyYW5zZmVyZWQgPSBzdXBlci50cmFuc2ZlckZyb20oc3JjLCBwb3NpdGlvbiwgY291bnQpOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKG9uUG9zdFRyYW5zZmVyRnJvbSwgbCAtPiBsLnBvc3RUcmFuc2ZlckZyb20ocGF0aCwgdGhpcywgc3JjLCBwb3NpdGlvbiwgY291bnQsIHRyYW5zZmVyZWQpKTsKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2ZlcmVkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNYXBwZWRCeXRlQnVmZmVyIG1hcChNYXBNb2RlIG1vZGUsIGxvbmcgcG9zaXRpb24sIGxvbmcgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRoaXMgYmVoYXZpb3IgaXNuJ3QgMTAwJSBjb3JyZWN0Li4uIGlmIHlvdSBtaXggYWNjZXNzIHdpdGggRmlsZUNoYW5lbCBhbmQgQnl0ZUJ1ZmZlciB5b3Ugd2lsbCBnZXQgZGlmZmVyZW50CisgICAgICAgICAgICAvLyByZXN1bHRzIHRoYW4gd2l0aCBhIHJlYWwgbW1hcCBzb2x1dGlvbi4uLiBUaGlzIGxpbWl0YXRpb24gaXMgZHVlIHRvIEJ5dGVCdWZmZXIgYmVpbmcgcHJpdmF0ZSwgc28gbm90IGFibGUKKyAgICAgICAgICAgIC8vIHRvIGNyZWF0ZSBjdXN0b20gQkJzIHRvIG1pbWMgdGhpcyBhY2Nlc3MuLi4KKyAgICAgICAgICAgIGlmIChtb2RlID09IE1hcE1vZGUuUkVBRF9XUklURSAmJiBtdXRhYmxlLmdldCgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJtYXAgY2FsbGVkIHR3aWNlIHdpdGggbW9kZSBSRUFEX1dSSVRFOyBmaXJzdCB3YXMgIiArIG11dGFibGUuZ2V0KCkgKyAiLCBub3cgIiArIG5ldyBNYXBwZWQobW9kZSwgbnVsbCwgcG9zaXRpb24sIE1hdGgudG9JbnRFeGFjdChzaXplKSkpOworCisgICAgICAgICAgICBpbnQgaXNpemUgPSBNYXRoLnRvSW50RXhhY3Qoc2l6ZSk7CisgICAgICAgICAgICBNYXBwZWRCeXRlQnVmZmVyIGJiID0gKE1hcHBlZEJ5dGVCdWZmZXIpIEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoaXNpemUpOworCisgICAgICAgICAgICBNYXBwZWQgbWFwcGVkID0gbmV3IE1hcHBlZChtb2RlLCBiYiwgcG9zaXRpb24sIGlzaXplKTsKKyAgICAgICAgICAgIGlmIChtb2RlID09IE1hcE1vZGUuUkVBRF9PTkxZKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLnJlYWRGdWxseSh0aGlzLCBtYXBwZWQuYmIsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBtYXBwZWQuYmIuZmxpcCgpOworCisgICAgICAgICAgICAgICAgUnVubmFibGUgZm9yY2VyID0gKCkgLT4geworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgTWVtb3J5VXRpbC5zZXRBdHRhY2htZW50KGJiLCBmb3JjZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobW9kZSA9PSBNYXBNb2RlLlJFQURfV1JJVEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRlbGVnYXRlKCkuc2l6ZSgpIC0gcG9zaXRpb24gPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwucmVhZEZ1bGx5KHRoaXMsIG1hcHBlZC5iYiwgcG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBtYXBwZWQuYmIuZmxpcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyB3aXRoIHJlYWwgZmlsZXMgdGhlIEZEIGdldHMgY29waWVkIHNvIHRoZSBjbG9zZSBvZiB0aGUgY2hhbm5lbCBkb2VzIG5vdCBibG9jayB0aGUgQkIgbXV0YXRpb24KKyAgICAgICAgICAgICAgICAvLyBmcm9tIGZsdXNoaW5nLi4uICBpdCdzIHBvc3NpYmxlIHRvIHN1cHBvcnQgdGhpcyB1c2UgY2FzZSwgYnV0IGtlcHQgdGhpbmdzIHNpbXBsaWVyIGZvciBub3cgYnkKKyAgICAgICAgICAgICAgICAvLyBmYWlsaW5nIGlmIHRoZSBiYWNraW5nIGNoYW5uZWwgd2FzIGNsb3NlZC4KKyAgICAgICAgICAgICAgICBSdW5uYWJsZSBmb3JjZXIgPSAoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgbG9jYWwgPSBiYi5kdXBsaWNhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWwucG9zaXRpb24oMCk7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgcG9zID0gcG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobG9jYWwuaGFzUmVtYWluaW5nKCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdyb3RlID0gd3JpdGUobG9jYWwsIHBvcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyb3RlID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IHdyb3RlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5jaGVja2VkSU9FeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIE1lbW9yeVV0aWwuc2V0QXR0YWNobWVudChiYiwgZm9yY2VyKTsKKyAgICAgICAgICAgICAgICBpZiAoIW11dGFibGUuY29tcGFyZUFuZFNldChudWxsLCBtYXBwZWQpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIm1hcCBjYWxsZWQgdHdpY2UiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVuc3VwcG9ydGVkIG1vZGU6ICIgKyBtb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtYXBwZWQuYmI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgaW1wbENsb3NlQ2hhbm5lbCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBzdXBlci5pbXBsQ2xvc2VDaGFubmVsKCk7CisgICAgICAgICAgICBtdXRhYmxlLnNldChudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1hcHBlZAorICAgIHsKKyAgICAgICAgZmluYWwgRmlsZUNoYW5uZWwuTWFwTW9kZSBtb2RlOworICAgICAgICBmaW5hbCBNYXBwZWRCeXRlQnVmZmVyIGJiOworICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uOworICAgICAgICBmaW5hbCBpbnQgc2l6ZTsKKworICAgICAgICBwcml2YXRlIE1hcHBlZChGaWxlQ2hhbm5lbC5NYXBNb2RlIG1vZGUsIE1hcHBlZEJ5dGVCdWZmZXIgYmIsIGxvbmcgcG9zaXRpb24sIGludCBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm1vZGUgPSBtb2RlOworICAgICAgICAgICAgdGhpcy5iYiA9IGJiOworICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAgICAgICAgdGhpcy5zaXplID0gc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICJNYXBwZWR7IiArCisgICAgICAgICAgICAgICAgICAgIm1vZGU9IiArIG1vZGUgKworICAgICAgICAgICAgICAgICAgICIsIHBvc2l0aW9uPSIgKyBwb3NpdGlvbiArCisgICAgICAgICAgICAgICAgICAgIiwgc2l6ZT0iICsgc2l6ZSArCisgICAgICAgICAgICAgICAgICAgJ30nOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvQmlnVGFibGVXcml0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9CaWdUYWJsZVdyaXRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRkM2M1ZS4uMDAwMDAwMAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9CaWdUYWJsZVdyaXRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0qIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0qIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotKiB1bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKLQotaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlVwZGF0ZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5FbmNvZGluZ1N0YXRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkFic3RyYWN0VHJhbnNhY3Rpb25hbFRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBCaWdUYWJsZVdyaXRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRyYW5zYWN0aW9uYWxUZXN0Ci17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0UxID0gIkJpZ1RhYmxlV3JpdGVyVGVzdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfU1RBTkRBUkQgPSAiU3RhbmRhcmQxIjsKLQotICAgIHByaXZhdGUgc3RhdGljIENvbHVtbkZhbWlseVN0b3JlIGNmczsKLQotICAgIEBCZWZvcmVDbGFzcwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTY2hlbWFMb2FkZXIucHJlcGFyZVNlcnZlcigpOwotICAgICAgICBTY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2UoS0VZU1BBQ0UxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5c3BhY2VQYXJhbXMuc2ltcGxlKDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENGX1NUQU5EQVJELCAwLCBJbnQzMlR5cGUuaW5zdGFuY2UsIEFzY2lpVHlwZS5pbnN0YW5jZSwgSW50MzJUeXBlLmluc3RhbmNlKSk7Ci0gICAgICAgIGNmcyA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UxKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDRl9TVEFOREFSRCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFRlc3RhYmxlVHJhbnNhY3Rpb24gbmV3VGVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0YWJsZUJUVygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RhYmxlQlRXIGV4dGVuZHMgVGVzdGFibGVUcmFuc2FjdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgRmlsZSBmaWxlOwotICAgICAgICBmaW5hbCBEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0gICAgICAgIGZpbmFsIFNTVGFibGVUeG5Xcml0ZXIgd3JpdGVyOwotCi0gICAgICAgIHByaXZhdGUgVGVzdGFibGVCVFcoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzKGNmcy5uZXdTU1RhYmxlRGVzY3JpcHRvcihjZnMuZ2V0RGlyZWN0b3JpZXMoKS5nZXREaXJlY3RvcnlGb3JOZXdTU1RhYmxlcygpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFRlc3RhYmxlQlRXKERlc2NyaXB0b3IgZGVzYykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcyhkZXNjLCBTU1RhYmxlVHhuV3JpdGVyLmNyZWF0ZShjZnMsIGRlc2MsIDAsIDAsIG51bGwsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2VyaWFsaXphdGlvbkhlYWRlcih0cnVlLCBjZnMubWV0YWRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLm1ldGFkYXRhKCkucmVndWxhckFuZFN0YXRpY0NvbHVtbnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jb2RpbmdTdGF0cy5OT19TVEFUUykpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgVGVzdGFibGVCVFcoRGVzY3JpcHRvciBkZXNjLCBTU1RhYmxlVHhuV3JpdGVyIHN3KQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihzdyk7Ci0gICAgICAgICAgICB0aGlzLmZpbGUgPSBuZXcgRmlsZShkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSk7Ci0gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjOwotICAgICAgICAgICAgdGhpcy53cml0ZXIgPSBzdzsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBVcGRhdGVCdWlsZGVyIHVwZGF0ZSA9IFVwZGF0ZUJ1aWxkZXIuY3JlYXRlKGNmcy5tZXRhZGF0YSgpLCBpKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspCi0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZS5uZXdSb3coaikuYWRkKCJ2YWwiLCBTU1RhYmxlUmV3cml0ZXJUZXN0LnJhbmRvbSgwLCAxMDAwKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCh1cGRhdGUuYnVpbGQoKS51bmZpbHRlcmVkSXRlcmF0b3IoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRJblByb2dyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnRFeGlzdHMoQ29tcG9uZW50LkRBVEEsIENvbXBvbmVudC5QUklNQVJZX0lOREVYKTsKLSAgICAgICAgICAgIGFzc2VydE5vdEV4aXN0cyhDb21wb25lbnQuRklMVEVSLCBDb21wb25lbnQuU1VNTUFSWSk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShmaWxlLmxlbmd0aCgpID4gMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRQcmVwYXJlZCgpIHRocm93cyBFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0RXhpc3RzKENvbXBvbmVudC5EQVRBLCBDb21wb25lbnQuUFJJTUFSWV9JTkRFWCwgQ29tcG9uZW50LkZJTFRFUiwgQ29tcG9uZW50LlNVTU1BUlkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0QWJvcnRlZCgpIHRocm93cyBFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0Tm90RXhpc3RzKENvbXBvbmVudC5EQVRBLCBDb21wb25lbnQuUFJJTUFSWV9JTkRFWCwgQ29tcG9uZW50LkZJTFRFUiwgQ29tcG9uZW50LlNVTU1BUlkpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGZpbGUuZXhpc3RzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Q29tbWl0dGVkKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnRQcmVwYXJlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGNvbW1pdENhblRocm93KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RXhpc3RzKENvbXBvbmVudCAuLi4gY29tcG9uZW50cykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogY29tcG9uZW50cykKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShuZXcgRmlsZShkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKGNvbXBvbmVudCkpLmV4aXN0cygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBhc3NlcnROb3RFeGlzdHMoQ29tcG9uZW50IC4uLiBjb21wb25lbnRzKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBjb21wb25lbnRzKQotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShjb21wb25lbnQudG9TdHJpbmcoKSwgbmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihjb21wb25lbnQpKS5leGlzdHMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0NRTFNTVGFibGVXcml0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9DUUxTU1RhYmxlV3JpdGVyVGVzdC5qYXZhCmluZGV4IDE4NTEzMTQuLjVkODFkNmMgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0NRTFNTVGFibGVXcml0ZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvQ1FMU1NUYWJsZVdyaXRlclRlc3QuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLio7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaVByZWRpY2F0ZTsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CkBAIC01NSw2ICs1Niw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy4qOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKQEAgLTg1Miw3ICs4NTQsNyBAQAogICAgICAgICBDUUxTU1RhYmxlV3JpdGVyIHdyaXRlciA9IENRTFNTVGFibGVXcml0ZXIuYnVpbGRlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbkRpcmVjdG9yeShkYXRhRGlyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9yVGFibGUoc2NoZW1hKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudXNpbmcoIklOU0VSVCBJTlRPICIgKyBxdWFsaWZpZWRUYWJsZSArICIgKGssIGMxLCBjMiwgdikgVkFMVUVTICg/LCA/LCA/LCB0ZXh0QXNCbG9iKD8pKSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51c2luZygiSU5TRVJUIElOVE8gIiArIHF1YWxpZmllZFRhYmxlICsgIiAoaywgYzEsIGMyLCB2KSBWQUxVRVMgKD8sID8sID8sIHRleHRfYXNfYmxvYig/KSkiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKIAogICAgICAgICB3cml0ZXIuYWRkUm93KDEsIDIsIDMsICJhYmMiKTsKQEAgLTExMTYsNiArMTExOCwxMjIgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGZpbHRlcmVkLnNpemUoKSk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVXaXRoVGltZXN0YW1wcygpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGxvbmcgbm93ID0gY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgbG9uZyB0aGVuID0gbm93IC0gMTAwMDsKKyAgICAgICAgZmluYWwgU3RyaW5nIHNjaGVtYSA9ICJDUkVBVEUgVEFCTEUgIiArIHF1YWxpZmllZFRhYmxlICsgIiAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICBrIGludCwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgIHYxIGludCwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgIHYyIGludCwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgIHYzIHRleHQsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICBQUklNQVJZIEtFWSAoaykiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpIjsKKworICAgICAgICBDUUxTU1RhYmxlV3JpdGVyIHdyaXRlciA9IENRTFNTVGFibGVXcml0ZXIuYnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbkRpcmVjdG9yeShkYXRhRGlyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9yVGFibGUoc2NoZW1hKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudXNpbmcoIklOU0VSVCBJTlRPICIgKyBxdWFsaWZpZWRUYWJsZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIChrLCB2MSwgdjIsIHYzKSBWQUxVRVMgKD8sPyw/LD8pIHVzaW5nIHRpbWVzdGFtcCA/IiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIC8vIE5vdGUgdGhhdCwgYWxsIG90aGVyIHRoaW5ncyBiZWluZyBlcXVhbCwgQ2Fzc2FuZHJhIHdpbGwgc29ydCB0aGVzZSByb3dzIGxleGljb2dyYXBoaWNhbGx5LCBzbyB3ZSB1c2UgImhpZ2hlciIgdmFsdWVzIGluIHRoZQorICAgICAgICAvLyByb3cgd2UgZXhwZWN0IHRvICJ3aW4iIHNvIHRoYXQgd2UncmUgc3VyZSB0aGF0IGl0IGlzbid0IGp1c3QgYWNjaWRlbnRhbGx5IHBpY2tlZCBkdWUgdG8gdGhlIHJvdyBzb3J0aW5nLgorICAgICAgICB3cml0ZXIuYWRkUm93KCAxLCA0LCA1LCAiYiIsIG5vdyk7IC8vIFRoaXMgd3JpdGUgc2hvdWxkIGJlIHRoZSBvbmUgZm91bmQgYXQgdGhlIGVuZCBiZWNhdXNlIGl0IGhhcyBhIGhpZ2hlciB0aW1lc3RhbXAKKyAgICAgICAgd3JpdGVyLmFkZFJvdyggMSwgMiwgMywgImEiLCB0aGVuKTsKKyAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgIGxvYWRTU1RhYmxlcyhkYXRhRGlyLCBrZXlzcGFjZSk7CisKKyAgICAgICAgVW50eXBlZFJlc3VsdFNldCByZXN1bHRTZXQgPSBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoIlNFTEVDVCAqIEZST00gIiArIHF1YWxpZmllZFRhYmxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdFNldC5zaXplKCkpOworCisgICAgICAgIEl0ZXJhdG9yPFVudHlwZWRSZXN1bHRTZXQuUm93PiBpdGVyID0gcmVzdWx0U2V0Lml0ZXJhdG9yKCk7CisgICAgICAgIFVudHlwZWRSZXN1bHRTZXQuUm93IHIxID0gaXRlci5uZXh0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCByMS5nZXRJbnQoImsiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCByMS5nZXRJbnQoInYxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgcjEuZ2V0SW50KCJ2MiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgcjEuZ2V0U3RyaW5nKCJ2MyIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaXRlci5oYXNOZXh0KCkpOworICAgIH0KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZVdpdGhUdGwoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBmaW5hbCBTdHJpbmcgc2NoZW1hID0gIkNSRUFURSBUQUJMRSAiICsgcXVhbGlmaWVkVGFibGUgKyAiICgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgIGsgaW50LCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgdjEgaW50LCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgdjIgaW50LCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgdjMgdGV4dCwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgIFBSSU1BUlkgS0VZIChrKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikiOworCisgICAgICAgIENRTFNTVGFibGVXcml0ZXIuQnVpbGRlciBidWlsZGVyID0gQ1FMU1NUYWJsZVdyaXRlci5idWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbkRpcmVjdG9yeShkYXRhRGlyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvclRhYmxlKHNjaGVtYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51c2luZygiSU5TRVJUIElOVE8gIiArIHF1YWxpZmllZFRhYmxlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIChrLCB2MSwgdjIsIHYzKSBWQUxVRVMgKD8sPyw/LD8pIHVzaW5nIFRUTCA/Iik7CisgICAgICAgIENRTFNTVGFibGVXcml0ZXIgd3JpdGVyID0gYnVpbGRlci5idWlsZCgpOworICAgICAgICAvLyBhZGQgYSByb3cgdGhhdCBfc2hvdWxkXyBzaG93IHVwIC0gMSBob3VyIFRUTAorICAgICAgICB3cml0ZXIuYWRkUm93KCAxLCAyLCAzLCAiYSIsIDM2MDApOworICAgICAgICAvLyBJbnNlcnQgYSByb3cgd2l0aCBhIFRUTCBvZiAxIHNlY29uZCAtIHNob3VsZCBub3QgYXBwZWFyIGluIHJlc3VsdHMgb25jZSB3ZSBzbGVlcAorICAgICAgICB3cml0ZXIuYWRkUm93KCAyLCA0LCA1LCAiYiIsIDEpOworICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDEyMDApOyAvLyBTbGlnaHRseSBvdmVyIDEgc2Vjb25kLCBqdXN0IHRvIG1ha2Ugc3VyZQorICAgICAgICBsb2FkU1NUYWJsZXMoZGF0YURpciwga2V5c3BhY2UpOworCisgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcmVzdWx0U2V0ID0gUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsKCJTRUxFQ1QgKiBGUk9NICIgKyBxdWFsaWZpZWRUYWJsZSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCByZXN1bHRTZXQuc2l6ZSgpKTsKKworICAgICAgICBJdGVyYXRvcjxVbnR5cGVkUmVzdWx0U2V0LlJvdz4gaXRlciA9IHJlc3VsdFNldC5pdGVyYXRvcigpOworICAgICAgICBVbnR5cGVkUmVzdWx0U2V0LlJvdyByMSA9IGl0ZXIubmV4dCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcjEuZ2V0SW50KCJrIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcjEuZ2V0SW50KCJ2MSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHIxLmdldEludCgidjIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHIxLmdldFN0cmluZygidjMiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGl0ZXIuaGFzTmV4dCgpKTsKKyAgICB9CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVXaXRoVGltZXN0YW1wc0FuZFR0bCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGZpbmFsIFN0cmluZyBzY2hlbWEgPSAiQ1JFQVRFIFRBQkxFICIgKyBxdWFsaWZpZWRUYWJsZSArICIgKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgayBpbnQsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICB2MSBpbnQsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICB2MiBpbnQsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICB2MyB0ZXh0LCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgUFJJTUFSWSBLRVkgKGspIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSI7CisKKyAgICAgICAgQ1FMU1NUYWJsZVdyaXRlciB3cml0ZXIgPSBDUUxTU1RhYmxlV3JpdGVyLmJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5EaXJlY3RvcnkoZGF0YURpcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvclRhYmxlKHNjaGVtYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVzaW5nKCJJTlNFUlQgSU5UTyAiICsgcXVhbGlmaWVkVGFibGUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoaywgdjEsIHYyLCB2MykgVkFMVUVTICg/LD8sPyw/KSB1c2luZyB0aW1lc3RhbXAgPyBBTkQgVFRMID8iICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIC8vIE5PVEU6IEl0IHdvdWxkIGJlIGVhc2llciB0byBtYWtlIHRoaXMgYSB0aW1lc3RhbXAgaW4gdGhlIHBhc3QsIGJ1dCBDYXNzYW5kcmEgYWxzbyBoYXMgYSBfbG9jYWxfIGRlbGV0aW9uIHRpbWUKKyAgICAgICAgLy8gd2hpY2ggaXMgYmFzZWQgb24gdGhlIHNlcnZlcidzIHRpbWVzdGFtcCwgc28gc2ltcGx5IHNldHRpbmcgdGhlIHRpbWVzdGFtcCB0byBzb21lIHRpbWUgaW4gdGhlIHBhc3QKKyAgICAgICAgLy8gZG9lc24ndCBhY3R1YWxseSBkbyB3aGF0IHlvdSdkIHRoaW5rIGl0IHdvdWxkIGRvLgorICAgICAgICBsb25nIG9uZVNlY29uZEZyb21Ob3cgPSBUaW1lVW5pdC5NSUxMSVNFQ09ORFMudG9NaWNyb3MoY3VycmVudFRpbWVNaWxsaXMoKSArIDEwMDApOworICAgICAgICAvLyBJbnNlcnQgc29tZSByb3dzIHdpdGggYSB0aW1lc3RhbXAgb2YgMSBzZWNvbmQgZnJvbSBub3csIGFuZCBkaWZmZXJlbnQgVFRMcworICAgICAgICAvLyBhZGQgYSByb3cgdGhhdCBfc2hvdWxkXyBzaG93IHVwIC0gMSBob3VyIFRUTAorICAgICAgICB3cml0ZXIuYWRkUm93KCAxLCAyLCAzLCAiYSIsIG9uZVNlY29uZEZyb21Ob3csIDM2MDApOworICAgICAgICAvLyBJbnNlcnQgYSByb3cgInR3byBzZWNvbmRzIGFnbyIgd2l0aCBhIFRUTCBvZiAxIHNlY29uZCAtIHNob3VsZCBub3QgYXBwZWFyIGluIHJlc3VsdHMKKyAgICAgICAgd3JpdGVyLmFkZFJvdyggMiwgNCwgNSwgImIiLCBvbmVTZWNvbmRGcm9tTm93LCAxKTsKKyAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgIGxvYWRTU1RhYmxlcyhkYXRhRGlyLCBrZXlzcGFjZSk7CisgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcmVzdWx0U2V0ID0gUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsKCJTRUxFQ1QgKiBGUk9NICIgKyBxdWFsaWZpZWRUYWJsZSk7CisgICAgICAgIFRocmVhZC5zbGVlcCgxMjAwKTsKKyAgICAgICAgcmVzdWx0U2V0ID0gUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsKCJTRUxFQ1QgKiBGUk9NICIgKyBxdWFsaWZpZWRUYWJsZSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCByZXN1bHRTZXQuc2l6ZSgpKTsKKworICAgICAgICBJdGVyYXRvcjxVbnR5cGVkUmVzdWx0U2V0LlJvdz4gaXRlciA9IHJlc3VsdFNldC5pdGVyYXRvcigpOworICAgICAgICBVbnR5cGVkUmVzdWx0U2V0LlJvdyByMSA9IGl0ZXIubmV4dCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcjEuZ2V0SW50KCJrIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcjEuZ2V0SW50KCJ2MSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHIxLmdldEludCgidjIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHIxLmdldFN0cmluZygidjMiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGl0ZXIuaGFzTmV4dCgpKTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvYWRTU1RhYmxlcyhGaWxlIGRhdGFEaXIsIFN0cmluZyBrcykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KICAgICB7CiAgICAgICAgIFNTVGFibGVMb2FkZXIgbG9hZGVyID0gbmV3IFNTVGFibGVMb2FkZXIoZGF0YURpciwgbmV3IFNTVGFibGVMb2FkZXIuQ2xpZW50KCkKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0NvbXBvbmVudFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0NvbXBvbmVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWI3NjMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvQ29tcG9uZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQuVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVGb3JtYXRUZXN0LkZvcm1hdDE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlRm9ybWF0VGVzdC5Gb3JtYXQyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0OworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlRm9ybWF0VGVzdC5mYWN0b3J5OworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdEV4Y2VwdGlvbk9mVHlwZTsKKworcHVibGljIGNsYXNzIENvbXBvbmVudFRlc3QKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDT05EID0gInNlY29uZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJUlNUID0gImZpcnN0IjsKKworICAgIHN0YXRpYworICAgIHsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmRhZW1vbkluaXRpYWxpemF0aW9uKCgpIC0+IHsKKyAgICAgICAgICAgIENvbmZpZyBjb25maWcgPSBEYXRhYmFzZURlc2NyaXB0b3IubG9hZENvbmZpZygpOworICAgICAgICAgICAgU1NUYWJsZUZvcm1hdFRlc3QuY29uZmlndXJlKG5ldyBDb25maWcuU1NUYWJsZUNvbmZpZygpLCBuZXcgQmlnRm9ybWF0LkJpZ0Zvcm1hdEZhY3RvcnkoKSwgZmFjdG9yeSgiZmlyc3QiLCBGb3JtYXQxLmNsYXNzKSwgZmFjdG9yeSgic2Vjb25kIiwgRm9ybWF0Mi5jbGFzcykpOworICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZXMoKQorICAgIHsKKyAgICAgICAgRnVuY3Rpb248VHlwZSwgQ29tcG9uZW50PiBjb21wb25lbnRGYWN0b3J5ID0gTW9ja2l0by5tb2NrKEZ1bmN0aW9uLmNsYXNzKTsKKworICAgICAgICAvLyBkbyBub3QgYWxsb3cgdG8gZGVmaW5lIGEgdHlwZSB3aXRoIHRoZSBzYW1lIG5hbWUgb3IgcmVwciBhcyB0aGUgZXhpc3RpbmcgdHlwZSBmb3IgdGhpcyBvciBwYXJlbnQgZm9ybWF0CisgICAgICAgIGFzc2VydFRoYXRFeGNlcHRpb25PZlR5cGUoQXNzZXJ0aW9uRXJyb3IuY2xhc3MpLmlzVGhyb3duQnkoKCkgLT4gVHlwZS5jcmVhdGVTaW5nbGV0b24oQ29tcG9uZW50cy5UeXBlcy5UT0MubmFtZSwgQ29tcG9uZW50cy5UeXBlcy5UT0MucmVwciArICJ4IiwgRm9ybWF0MS5jbGFzcykpOworICAgICAgICBhc3NlcnRUaGF0RXhjZXB0aW9uT2ZUeXBlKEFzc2VydGlvbkVycm9yLmNsYXNzKS5pc1Rocm93bkJ5KCgpIC0+IFR5cGUuY3JlYXRlU2luZ2xldG9uKENvbXBvbmVudHMuVHlwZXMuVE9DLm5hbWUgKyAieCIsIENvbXBvbmVudHMuVHlwZXMuVE9DLnJlcHIsIEZvcm1hdDIuY2xhc3MpKTsKKworICAgICAgICAvLyBhbGxvdyB0byBkZWZpbmUgYSBmb3JtYXQgd2l0aCBvdGhlciBuYW1lIGFuZCByZXByCisgICAgICAgIFR5cGUgdDEgPSBUeXBlLmNyZWF0ZVNpbmdsZXRvbigiT05FIiwgIk9uZS5kYiIsIEZvcm1hdDEuY2xhc3MpOworCisgICAgICAgIC8vIGFsbG93IHRvIGRlZmluZSBhIGZvcm1hdCB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHJlcHIgZm9yIHR3byBkaWZmZXJlbnQgZm9ybWF0cworICAgICAgICBUeXBlIHQyZjEgPSBUeXBlLmNyZWF0ZVNpbmdsZXRvbigiVFdPIiwgIlR3by5kYiIsIEZvcm1hdDEuY2xhc3MpOworICAgICAgICBUeXBlIHQyZjIgPSBUeXBlLmNyZWF0ZVNpbmdsZXRvbigiVFdPIiwgIlR3by5kYiIsIEZvcm1hdDIuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHQyZjEpLmlzTm90RXF1YWxUbyh0MmYyKTsKKworICAgICAgICBhc3NlcnRUaGF0RXhjZXB0aW9uT2ZUeXBlKE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzKS5pc1Rocm93bkJ5KCgpIC0+IFR5cGUuY3JlYXRlU2luZ2xldG9uKG51bGwsICItVGhyZWUuZGIiLCBGb3JtYXQxLmNsYXNzKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChUeXBlLmZyb21SZXByZXNlbnRhdGlvbigic2hvdWxkIGJlIGN1c3RvbSIsIEJpZ0Zvcm1hdC5nZXRJbnN0YW5jZSgpKSkuaXNTYW1lQXMoQ29tcG9uZW50cy5UeXBlcy5DVVNUT00pOworICAgICAgICBhc3NlcnRUaGF0KFR5cGUuZnJvbVJlcHJlc2VudGF0aW9uKENvbXBvbmVudHMuVHlwZXMuVE9DLnJlcHIsIEJpZ0Zvcm1hdC5nZXRJbnN0YW5jZSgpKSkuaXNTYW1lQXMoQ29tcG9uZW50cy5UeXBlcy5UT0MpOworICAgICAgICBhc3NlcnRUaGF0KFR5cGUuZnJvbVJlcHJlc2VudGF0aW9uKHQxLnJlcHIsIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU1RhYmxlRm9ybWF0cygpLmdldChGSVJTVCkpKS5pc1NhbWVBcyh0MSk7CisgICAgICAgIGFzc2VydFRoYXQoVHlwZS5mcm9tUmVwcmVzZW50YXRpb24odDJmMS5yZXByLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U1NUYWJsZUZvcm1hdHMoKS5nZXQoRklSU1QpKSkuaXNTYW1lQXModDJmMSk7CisgICAgICAgIGFzc2VydFRoYXQoVHlwZS5mcm9tUmVwcmVzZW50YXRpb24odDJmMi5yZXByLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U1NUYWJsZUZvcm1hdHMoKS5nZXQoU0VDT05EKSkpLmlzU2FtZUFzKHQyZjIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbXBvbmVudHMoKQorICAgIHsKKyAgICAgICAgVHlwZSB0M2YxID0gVHlwZS5jcmVhdGVTaW5nbGV0b24oIlRIUkVFIiwgIlRocmVlLmRiIiwgRm9ybWF0MS5jbGFzcyk7CisgICAgICAgIFR5cGUgdDNmMiA9IFR5cGUuY3JlYXRlU2luZ2xldG9uKCJUSFJFRSIsICJUaHJlZS5kYiIsIEZvcm1hdDIuY2xhc3MpOworICAgICAgICBUeXBlIHQ0ZjEgPSBUeXBlLmNyZWF0ZSgiRk9VUiIsICIuKi1Gb3VyLmRiIiwgRm9ybWF0MS5jbGFzcyk7CisgICAgICAgIFR5cGUgdDRmMiA9IFR5cGUuY3JlYXRlKCJGT1VSIiwgIi4qLUZvdXIuZGIiLCBGb3JtYXQyLmNsYXNzKTsKKworICAgICAgICBDb21wb25lbnQgYzEgPSB0M2YxLmdldFNpbmdsZXRvbigpOworICAgICAgICBDb21wb25lbnQgYzIgPSB0M2YyLmdldFNpbmdsZXRvbigpOworCisgICAgICAgIGFzc2VydFRoYXRFeGNlcHRpb25PZlR5cGUoUnVudGltZUV4Y2VwdGlvbi5jbGFzcykuaXNUaHJvd25CeSgoKSAtPiB0M2YxLmNyZWF0ZUNvbXBvbmVudCh0M2YxLnJlcHIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdEV4Y2VwdGlvbk9mVHlwZShSdW50aW1lRXhjZXB0aW9uLmNsYXNzKS5pc1Rocm93bkJ5KCgpIC0+IHQzZjIuY3JlYXRlQ29tcG9uZW50KHQzZjIucmVwcikpOworICAgICAgICBhc3NlcnRUaGF0RXhjZXB0aW9uT2ZUeXBlKFJ1bnRpbWVFeGNlcHRpb24uY2xhc3MpLmlzVGhyb3duQnkoKCkgLT4gdDRmMS5nZXRTaW5nbGV0b24oKSk7CisgICAgICAgIGFzc2VydFRoYXRFeGNlcHRpb25PZlR5cGUoUnVudGltZUV4Y2VwdGlvbi5jbGFzcykuaXNUaHJvd25CeSgoKSAtPiB0NGYyLmdldFNpbmdsZXRvbigpKTsKKworICAgICAgICBhc3NlcnRUaGF0KENvbXBvbmVudC5wYXJzZSh0M2YxLnJlcHIsIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU1RhYmxlRm9ybWF0cygpLmdldChGSVJTVCkpKS5pc1NhbWVBcyhjMSk7CisgICAgICAgIGFzc2VydFRoYXQoQ29tcG9uZW50LnBhcnNlKHQzZjIucmVwciwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNTVGFibGVGb3JtYXRzKCkuZ2V0KCJzZWNvbmQiKSkpLmlzU2FtZUFzKGMyKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjMSkuaXNOb3RFcXVhbFRvKGMyKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjMS50eXBlKS5pc1NhbWVBcyh0M2YxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjMi50eXBlKS5pc1NhbWVBcyh0M2YyKTsKKworICAgICAgICBDb21wb25lbnQgYzMgPSBDb21wb25lbnQucGFyc2UoImFiYy1Gb3VyLmRiIiwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNTVGFibGVGb3JtYXRzKCkuZ2V0KEZJUlNUKSk7CisgICAgICAgIENvbXBvbmVudCBjNCA9IENvbXBvbmVudC5wYXJzZSgiYWJjLUZvdXIuZGIiLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U1NUYWJsZUZvcm1hdHMoKS5nZXQoInNlY29uZCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjMy50eXBlKS5pc1NhbWVBcyh0NGYxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjNC50eXBlKS5pc1NhbWVBcyh0NGYyKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjMy5uYW1lKS5pc0VxdWFsVG8oImFiYy1Gb3VyLmRiIik7CisgICAgICAgIGFzc2VydFRoYXQoYzQubmFtZSkuaXNFcXVhbFRvKCJhYmMtRm91ci5kYiIpOworICAgICAgICBhc3NlcnRUaGF0KGMzKS5pc05vdEVxdWFsVG8oYzQpOworICAgICAgICBhc3NlcnRUaGF0KGMzKS5pc05vdEVxdWFsVG8oYzEpOworICAgICAgICBhc3NlcnRUaGF0KGM0KS5pc05vdEVxdWFsVG8oYzIpOworCisgICAgICAgIENvbXBvbmVudCBjNSA9IENvbXBvbmVudC5wYXJzZSgiYWJjLUZpdmUuZGIiLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U1NUYWJsZUZvcm1hdHMoKS5nZXQoRklSU1QpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjNS50eXBlKS5pc1NhbWVBcyhDb21wb25lbnRzLlR5cGVzLkNVU1RPTSk7CisgICAgICAgIGFzc2VydFRoYXQoYzUubmFtZSkuaXNFcXVhbFRvKCJhYmMtRml2ZS5kYiIpOworCisgICAgICAgIENvbXBvbmVudCBjNiA9IENvbXBvbmVudC5wYXJzZSgiRGF0YS5kYiIsIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU1RhYmxlRm9ybWF0cygpLmdldCgic2Vjb25kIikpOworICAgICAgICBhc3NlcnRUaGF0KGM2LnR5cGUpLmlzU2FtZUFzKENvbXBvbmVudHMuVHlwZXMuREFUQSk7CisgICAgICAgIGFzc2VydFRoYXQoYzYpLmlzU2FtZUFzKENvbXBvbmVudHMuREFUQSk7CisKKyAgICAgICAgSGFzaFNldDxDb21wb25lbnQ+IHMxID0gU2V0cy5uZXdIYXNoU2V0KENvbXBvbmVudC5nZXRTaW5nbGV0b25zRm9yKEZvcm1hdDEuY2xhc3MpKTsKKyAgICAgICAgSGFzaFNldDxDb21wb25lbnQ+IHMyID0gU2V0cy5uZXdIYXNoU2V0KENvbXBvbmVudC5nZXRTaW5nbGV0b25zRm9yKEZvcm1hdDIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzMSkuY29udGFpbnMoYzEsIENvbXBvbmVudHMuREFUQSwgQ29tcG9uZW50cy5TVEFUUywgQ29tcG9uZW50cy5DT01QUkVTU0lPTl9JTkZPKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzMikuY29udGFpbnMoYzIsIENvbXBvbmVudHMuREFUQSwgQ29tcG9uZW50cy5TVEFUUywgQ29tcG9uZW50cy5DT01QUkVTU0lPTl9JTkZPKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzMSkuZG9lc05vdENvbnRhaW4oYzIpOworICAgICAgICBhc3NlcnRUaGF0KHMyKS5kb2VzTm90Q29udGFpbihjMSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChTZXRzLm5ld0hhc2hTZXQoQ29tcG9uZW50LmdldFNpbmdsZXRvbnNGb3IoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNTVGFibGVGb3JtYXRzKCkuZ2V0KEZJUlNUKSkpKS5pc0VxdWFsVG8oczEpOworICAgICAgICBhc3NlcnRUaGF0KFNldHMubmV3SGFzaFNldChDb21wb25lbnQuZ2V0U2luZ2xldG9uc0ZvcihEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U1NUYWJsZUZvcm1hdHMoKS5nZXQoInNlY29uZCIpKSkpLmlzRXF1YWxUbyhzMik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvRGVzY3JpcHRvclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0Rlc2NyaXB0b3JUZXN0LmphdmEKaW5kZXggNDA1ZjNkYS4uMTcyMGVhMCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvRGVzY3JpcHRvclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9EZXNjcmlwdG9yVGVzdC5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHM7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CkBAIC0yOSwxMSArMjgsMTUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpcmVjdG9yaWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogCiBwdWJsaWMgY2xhc3MgRGVzY3JpcHRvclRlc3QKIHsKQEAgLTg0LDE5ICs4NywxOSBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHRlc3RGcm9tRmlsZW5hbWVGb3IoRmlsZSBkaXIpCiAgICAgewotICAgICAgICBjaGVja0Zyb21GaWxlbmFtZShuZXcgRGVzY3JpcHRvcihkaXIsIGtzbmFtZSwgY2ZuYW1lLCBuZXcgU2VxdWVuY2VCYXNlZFNTVGFibGVJZCgxKSwgU1NUYWJsZUZvcm1hdC5UeXBlLkJJRykpOworICAgICAgICBjaGVja0Zyb21GaWxlbmFtZShuZXcgRGVzY3JpcHRvcihkaXIsIGtzbmFtZSwgY2ZuYW1lLCBuZXcgU2VxdWVuY2VCYXNlZFNTVGFibGVJZCgxKSwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpKSk7CiAKICAgICAgICAgLy8gc2Vjb25kYXJ5IGluZGV4CiAgICAgICAgIFN0cmluZyBpZHhOYW1lID0gIm15aWR4IjsKICAgICAgICAgRmlsZSBpZHhEaXIgPSBuZXcgRmlsZShkaXIuYWJzb2x1dGVQYXRoKCkgKyBGaWxlLnBhdGhTZXBhcmF0b3IoKSArIERpcmVjdG9yaWVzLlNFQ09OREFSWV9JTkRFWF9OQU1FX1NFUEFSQVRPUiArIGlkeE5hbWUpOwotICAgICAgICBjaGVja0Zyb21GaWxlbmFtZShuZXcgRGVzY3JpcHRvcihpZHhEaXIsIGtzbmFtZSwgY2ZuYW1lICsgRGlyZWN0b3JpZXMuU0VDT05EQVJZX0lOREVYX05BTUVfU0VQQVJBVE9SICsgaWR4TmFtZSwgbmV3IFNlcXVlbmNlQmFzZWRTU1RhYmxlSWQoNCksIFNTVGFibGVGb3JtYXQuVHlwZS5CSUcpKTsKKyAgICAgICAgY2hlY2tGcm9tRmlsZW5hbWUobmV3IERlc2NyaXB0b3IoaWR4RGlyLCBrc25hbWUsIGNmbmFtZSArIERpcmVjdG9yaWVzLlNFQ09OREFSWV9JTkRFWF9OQU1FX1NFUEFSQVRPUiArIGlkeE5hbWUsIG5ldyBTZXF1ZW5jZUJhc2VkU1NUYWJsZUlkKDQpLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkpKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2hlY2tGcm9tRmlsZW5hbWUoRGVzY3JpcHRvciBvcmlnaW5hbCkKICAgICB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKG9yaWdpbmFsLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSk7CisgICAgICAgIEZpbGUgZmlsZSA9IG9yaWdpbmFsLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKTsKIAotICAgICAgICBQYWlyPERlc2NyaXB0b3IsIENvbXBvbmVudD4gcGFpciA9IERlc2NyaXB0b3IuZnJvbUZpbGVuYW1lV2l0aENvbXBvbmVudChmaWxlKTsKKyAgICAgICAgUGFpcjxEZXNjcmlwdG9yLCBDb21wb25lbnQ+IHBhaXIgPSBEZXNjcmlwdG9yLmZyb21GaWxlV2l0aENvbXBvbmVudChmaWxlKTsKICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gcGFpci5sZWZ0OwogCiAgICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbC5kaXJlY3RvcnksIGRlc2MuZGlyZWN0b3J5KTsKQEAgLTEwNCw3ICsxMDcsNyBAQAogICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWwuY2ZuYW1lLCBkZXNjLmNmbmFtZSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbC52ZXJzaW9uLCBkZXNjLnZlcnNpb24pOwogICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWwuaWQsIGRlc2MuaWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQ29tcG9uZW50LkRBVEEsIHBhaXIucmlnaHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ29tcG9uZW50cy5EQVRBLCBwYWlyLnJpZ2h0KTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTEyLDggKzExNSw4IEBACiAgICAgewogICAgICAgICAvLyBEZXNjcmlwdG9yIHNob3VsZCBiZSBlcXVhbCB3aGVuIHBhcmVudCBkaXJlY3RvcnkgcG9pbnRzIHRvIHRoZSBzYW1lIGRpcmVjdG9yeQogICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKCIuIik7Ci0gICAgICAgIERlc2NyaXB0b3IgZGVzYzEgPSBuZXcgRGVzY3JpcHRvcihkaXIsICJrcyIsICJjZiIsIG5ldyBTZXF1ZW5jZUJhc2VkU1NUYWJsZUlkKDEpLCBTU1RhYmxlRm9ybWF0LlR5cGUuQklHKTsKLSAgICAgICAgRGVzY3JpcHRvciBkZXNjMiA9IG5ldyBEZXNjcmlwdG9yKGRpci50b0Fic29sdXRlKCksICJrcyIsICJjZiIsIG5ldyBTZXF1ZW5jZUJhc2VkU1NUYWJsZUlkKDEpLCBTU1RhYmxlRm9ybWF0LlR5cGUuQklHKTsKKyAgICAgICAgRGVzY3JpcHRvciBkZXNjMSA9IG5ldyBEZXNjcmlwdG9yKGRpciwgImtzIiwgImNmIiwgbmV3IFNlcXVlbmNlQmFzZWRTU1RhYmxlSWQoMSksIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSk7CisgICAgICAgIERlc2NyaXB0b3IgZGVzYzIgPSBuZXcgRGVzY3JpcHRvcihkaXIudG9BYnNvbHV0ZSgpLCAia3MiLCAiY2YiLCBuZXcgU2VxdWVuY2VCYXNlZFNTVGFibGVJZCgxKSwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGRlc2MxLCBkZXNjMik7CiAgICAgICAgIGFzc2VydEVxdWFscyhkZXNjMS5oYXNoQ29kZSgpLCBkZXNjMi5oYXNoQ29kZSgpKTsKICAgICB9CkBAIC0xMjEsMTYgKzEyNCwxNiBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVOYW1lcygpCiAgICAgewotICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IHsKLSAgICAgICAgICAgICAibWEtMS1iaWctRGF0YS5kYiIsCi0gICAgICAgICAgICAgLy8gMm5kYXJ5IGluZGV4Ci0gICAgICAgICAgICAgIi5pZHgxIiArIEZpbGUucGF0aFNlcGFyYXRvcigpICsgIm1hLTEtYmlnLURhdGEuZGIiLAotICAgICAgICB9OworICAgICAgICBmaW5hbCBTU1RhYmxlRm9ybWF0PD8sID8+IHNzVGFibGVGb3JtYXQgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCk7CisgICAgICAgIFN0cmluZyBuYW1lID0gc3NUYWJsZUZvcm1hdC5uYW1lKCk7CisgICAgICAgIGZpbmFsIFZlcnNpb24gdmVyc2lvbiA9IHNzVGFibGVGb3JtYXQuZ2V0TGF0ZXN0VmVyc2lvbigpOworICAgICAgICBTdHJpbmdbXSBmaWxlTmFtZXMgPSB7IHZlcnNpb24gKyAiLTEtIiArIG5hbWUgKyAiLURhdGEuZGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDJuZGFyeSBpbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuaWR4MSIgKyBGaWxlLnBhdGhTZXBhcmF0b3IoKSArIHZlcnNpb24gKyAiLTEtIiArIG5hbWUgKyAiLURhdGEuZGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAKLSAgICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IG5hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKERlc2NyaXB0b3IuZnJvbUZpbGVuYW1lKG5hbWUpKTsKLSAgICAgICAgfQorICAgICAgICBmb3IgKFN0cmluZyBmaWxlTmFtZSA6IGZpbGVOYW1lcykKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoRGVzY3JpcHRvci5mcm9tRmlsZVdpdGhDb21wb25lbnQobmV3IEZpbGUoZmlsZU5hbWUpLCBmYWxzZSkubGVmdCk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTE0Niw3ICsxNDksNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIGQgPSBEZXNjcmlwdG9yLmZyb21GaWxlbmFtZShuYW1lKTsKKyAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIGQgPSBEZXNjcmlwdG9yLmZyb21GaWxlKG5ldyBGaWxlKG5hbWUpKTsKICAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbChuYW1lKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CiAgICAgICAgICAgICAgICAgLy9nb29kCkBAIC0xNjAsMTIgKzE2MywxMyBAQAogICAgICAgICAvLyBmcm9tIENhc3NhbmRyYSBkaXJzCiAKICAgICAgICAgU3RyaW5nW10gZmlsZVBhdGhzID0gbmV3IFN0cmluZ1tdewotICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYva3MxL3RhYjEtMzQyNDIzNDIzNDMyNC9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9rczEvdGFiMS0zNDI0MjM0MjM0MzI0L3NuYXBzaG90cy9zbmFwc2hvdC9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9rczEvdGFiMS0zNDI0MjM0MjM0MzI0L2JhY2t1cHMvbmEtMS1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYva3MxL3RhYjEtMzQyNDIzNDIzNDMyNC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9rczEvdGFiMS0zNDI0MjM0MjM0MzI0L3NuYXBzaG90cy9zbmFwc2hvdC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9rczEvdGFiMS0zNDI0MjM0MjM0MzI0L2JhY2t1cHMvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYva3MxL3RhYjEtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYva3MxL3RhYjEtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvbmItMS1iaWctVE9DLnR4dCIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9rczEvdGFiMS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC9zbmFwc2hvdHMvc25hcHNob3QvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYva3MxL3RhYjEtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvYmFja3Vwcy9uYS0xLWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9rczEvdGFiMS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9rczEvdGFiMS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC9zbmFwc2hvdHMvc25hcHNob3QvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYva3MxL3RhYjEtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvYmFja3Vwcy9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCiAgICAgICAgIH07CiAKICAgICAgICAgdGVzdEtleXNwYWNlVGFibGVQYXJzaW5nKGZpbGVQYXRocywgImtzMSIsICJ0YWIxIik7CkBAIC0xNzMsMTIgKzE3NywxMiBAQAogICAgICAgICAvLyBpbmRleGVzCiAKICAgICAgICAgU3RyaW5nW10gZmlsZVBhdGhzSW5kZXhlcyA9IG5ldyBTdHJpbmdbXXsKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2tzMS90YWIxLTM0MjQyMzQyMzQzMjQvLmluZGV4L25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2tzMS90YWIxLTM0MjQyMzQyMzQzMjQvc25hcHNob3RzL3NuYXBzaG90Ly5pbmRleC9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9rczEvdGFiMS0zNDI0MjM0MjM0MzI0L2JhY2t1cHMvLmluZGV4L25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2tzMS90YWIxLTM0MjQyMzQyMzQzMjQvLmluZGV4L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2tzMS90YWIxLTM0MjQyMzQyMzQzMjQvc25hcHNob3RzL3NuYXBzaG90Ly5pbmRleC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9rczEvdGFiMS0zNDI0MjM0MjM0MzI0L2JhY2t1cHMvLmluZGV4L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2tzMS90YWIxLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0Ly5pbmRleC9uYS0xLWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9rczEvdGFiMS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC9zbmFwc2hvdHMvc25hcHNob3QvLmluZGV4L25hLTEtYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2tzMS90YWIxLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0L2JhY2t1cHMvLmluZGV4L25hLTEtYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2tzMS90YWIxLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0Ly5pbmRleC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9rczEvdGFiMS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC9zbmFwc2hvdHMvc25hcHNob3QvLmluZGV4L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2tzMS90YWIxLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0L2JhY2t1cHMvLmluZGV4L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKICAgICAgICAgfTsKIAogICAgICAgICB0ZXN0S2V5c3BhY2VUYWJsZVBhcnNpbmcoZmlsZVBhdGhzSW5kZXhlcywgImtzMSIsICJ0YWIxLmluZGV4Iik7CkBAIC0xODYsMjMgKzE5MCwyMyBAQAogICAgICAgICAvLyB3aGF0IGlmIGV2ZW4gYSBzbmFwc2hvdCBvZiBhIGtleXNwYWNlIGFuZCB0YWJsZSBjYWxsZWQgc25hcHNob3RzIGlzIGNhbGxlZCBzbmFwc2hvdHM/CiAKICAgICAgICAgU3RyaW5nW10gZmlsZVBhdGhzV2l0aFNuYXBzaG90S2V5c3BhY2VBbmRUYWJsZSA9IG5ldyBTdHJpbmdbXXsKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L3NuYXBzaG90cy9zbmFwc2hvdHMtNzQyNzM4NDI3Mzg5NDc4L25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L3NuYXBzaG90cy9zbmFwc2hvdHMtNzQyNzM4NDI3Mzg5NDc4L3NuYXBzaG90cy9zbmFwc2hvdHMvbmEtMS1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvc25hcHNob3RzL3NuYXBzaG90cy03NDI3Mzg0MjczODk0NzgvYmFja3Vwcy9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9zbmFwc2hvdHMvc25hcHNob3RzLTc0MjczODQyNzM4OTQ3OC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9zbmFwc2hvdHMvc25hcHNob3RzLTc0MjczODQyNzM4OTQ3OC9zbmFwc2hvdHMvc25hcHNob3RzL25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L3NuYXBzaG90cy9zbmFwc2hvdHMtNzQyNzM4NDI3Mzg5NDc4L2JhY2t1cHMvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvc25hcHNob3RzL3NuYXBzaG90cy03NDI3Mzg0MjczODk0Nzg3NDI3Mzg0MjczODk0Nzg3OC9uYS0xLWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9zbmFwc2hvdHMvc25hcHNob3RzLTc0MjczODQyNzM4OTQ3ODc0MjczODQyNzM4OTQ3ODc4L3NuYXBzaG90cy9zbmFwc2hvdHMvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvc25hcHNob3RzL3NuYXBzaG90cy03NDI3Mzg0MjczODk0Nzg3NDI3Mzg0MjczODk0Nzg3OC9iYWNrdXBzL25hLTEtYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L3NuYXBzaG90cy9zbmFwc2hvdHMtNzQyNzM4NDI3Mzg5NDc4NzQyNzM4NDI3Mzg5NDc4NzgvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvc25hcHNob3RzL3NuYXBzaG90cy03NDI3Mzg0MjczODk0Nzg3NDI3Mzg0MjczODk0Nzg3OC9zbmFwc2hvdHMvc25hcHNob3RzL25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L3NuYXBzaG90cy9zbmFwc2hvdHMtNzQyNzM4NDI3Mzg5NDc4NzQyNzM4NDI3Mzg5NDc4NzgvYmFja3Vwcy9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCiAgICAgICAgIH07CiAKICAgICAgICAgdGVzdEtleXNwYWNlVGFibGVQYXJzaW5nKGZpbGVQYXRoc1dpdGhTbmFwc2hvdEtleXNwYWNlQW5kVGFibGUsICJzbmFwc2hvdHMiLCAic25hcHNob3RzIik7CiAKICAgICAgICAgU3RyaW5nW10gZmlsZVBhdGhzV2l0aFNuYXBzaG90S2V5c3BhY2VBbmRUYWJsZVdpdGhJbmRpY2VzID0gbmV3IFN0cmluZ1tdewotICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvc25hcHNob3RzL3NuYXBzaG90cy03NDI3Mzg0MjczODk0NzgvLmluZGV4L25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L3NuYXBzaG90cy9zbmFwc2hvdHMtNzQyNzM4NDI3Mzg5NDc4L3NuYXBzaG90cy9zbmFwc2hvdHMvLmluZGV4L25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L3NuYXBzaG90cy9zbmFwc2hvdHMtNzQyNzM4NDI3Mzg5NDc4L2JhY2t1cHMvLmluZGV4L25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L3NuYXBzaG90cy9zbmFwc2hvdHMtNzQyNzM4NDI3Mzg5NDc4Ly5pbmRleC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9zbmFwc2hvdHMvc25hcHNob3RzLTc0MjczODQyNzM4OTQ3OC9zbmFwc2hvdHMvc25hcHNob3RzLy5pbmRleC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9zbmFwc2hvdHMvc25hcHNob3RzLTc0MjczODQyNzM4OTQ3OC9iYWNrdXBzLy5pbmRleC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9zbmFwc2hvdHMvc25hcHNob3RzLTc0MjczODQyNzM4OTQ3ODc0MjczODQyNzM4OTQ3ODc4Ly5pbmRleC9uYS0xLWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9zbmFwc2hvdHMvc25hcHNob3RzLTc0MjczODQyNzM4OTQ3ODc0MjczODQyNzM4OTQ3ODc4L3NuYXBzaG90cy9zbmFwc2hvdHMvLmluZGV4L25hLTEtYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L3NuYXBzaG90cy9zbmFwc2hvdHMtNzQyNzM4NDI3Mzg5NDc4NzQyNzM4NDI3Mzg5NDc4NzgvYmFja3Vwcy8uaW5kZXgvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvc25hcHNob3RzL3NuYXBzaG90cy03NDI3Mzg0MjczODk0Nzg3NDI3Mzg0MjczODk0Nzg3OC8uaW5kZXgvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvc25hcHNob3RzL3NuYXBzaG90cy03NDI3Mzg0MjczODk0Nzg3NDI3Mzg0MjczODk0Nzg3OC9zbmFwc2hvdHMvc25hcHNob3RzLy5pbmRleC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9zbmFwc2hvdHMvc25hcHNob3RzLTc0MjczODQyNzM4OTQ3ODc0MjczODQyNzM4OTQ3ODc4L2JhY2t1cHMvLmluZGV4L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKICAgICAgICAgfTsKIAogICAgICAgICB0ZXN0S2V5c3BhY2VUYWJsZVBhcnNpbmcoZmlsZVBhdGhzV2l0aFNuYXBzaG90S2V5c3BhY2VBbmRUYWJsZVdpdGhJbmRpY2VzLCAic25hcHNob3RzIiwgInNuYXBzaG90cy5pbmRleCIpOwpAQCAtMjEwLDEyICsyMTQsMTIgQEAKICAgICAgICAgLy8gd2hhdCBpZiBrZXlzcGFjZSBhbmQgdGFibGUgaXMgY2FsbGVkIGJhY2t1cHM/CiAKICAgICAgICAgU3RyaW5nW10gZmlsZVBhdGhzV2l0aEJhY2t1cHNLZXlzcGFjZUFuZFRhYmxlID0gbmV3IFN0cmluZ1tdewotICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzLTc0MjczODQyNzM4OTQ3OC9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9iYWNrdXBzL2JhY2t1cHMtNzQyNzM4NDI3Mzg5NDc4L3NuYXBzaG90cy9zbmFwc2hvdHMvbmEtMS1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzLTc0MjczODQyNzM4OTQ3OC9iYWNrdXBzL25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy03NDI3Mzg0MjczODk0NzgvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzLTc0MjczODQyNzM4OTQ3OC9zbmFwc2hvdHMvc25hcHNob3RzL25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy03NDI3Mzg0MjczODk0NzgvYmFja3Vwcy9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9iYWNrdXBzL2JhY2t1cHMtNzQyNzM4NDI3Mzg5NDc4NzQyNzM4NDI3Mzg5NDc4NzgvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzLTc0MjczODQyNzM4OTQ3ODc0MjczODQyNzM4OTQ3ODc4L3NuYXBzaG90cy9zbmFwc2hvdHMvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzLTc0MjczODQyNzM4OTQ3ODc0MjczODQyNzM4OTQ3ODc4L2JhY2t1cHMvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzLTc0MjczODQyNzM4OTQ3ODc0MjczODQyNzM4OTQ3ODc4L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy03NDI3Mzg0MjczODk0Nzg3NDI3Mzg0MjczODk0Nzg3OC9zbmFwc2hvdHMvc25hcHNob3RzL25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy03NDI3Mzg0MjczODk0Nzg3NDI3Mzg0MjczODk0Nzg3OC9iYWNrdXBzL25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKICAgICAgICAgfTsKIAogICAgICAgICB0ZXN0S2V5c3BhY2VUYWJsZVBhcnNpbmcoZmlsZVBhdGhzV2l0aEJhY2t1cHNLZXlzcGFjZUFuZFRhYmxlLCAiYmFja3VwcyIsICJiYWNrdXBzIik7CkBAIC0yMjQsMTEgKzIyOCwxMiBAQAogCiAgICAgICAgIFN0cmluZ1tdIGxlZ2FjeUZpbGVQYXRoc1dpdGhCYWNrdXBzS2V5c3BhY2VBbmRUYWJsZSA9IG5ldyBTdHJpbmdbXXsKICAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy9uYS0xLWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9iYWNrdXBzL2JhY2t1cHMvbmItMS1iaWctVE9DLnR4dCIsCiAgICAgICAgIC8vIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy9zbmFwc2hvdHMvc25hcHNob3RzL25hLTEtYmlnLUluZGV4LmRiIiwgI25vdCBzdXBwb3J0ZWQgKENBU1NBTkRSQS0xNDAxMykKICAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy9iYWNrdXBzL25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy9uYi0yMi1iaWctSW5kZXguZGIiLAotICAgICAgICAvLyIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9iYWNrdXBzL2JhY2t1cHMvc25hcHNob3RzL3NuYXBzaG90cy9uYi0yMi1iaWctSW5kZXguZGIiLCAjbm90IHN1cHBvcnRlZCAoQ0FTU0FORFJBLTE0MDEzKQotICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzL2JhY2t1cHMvbmItMjItYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCisgICAgICAgIC8vIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy9zbmFwc2hvdHMvc25hcHNob3RzL25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwgI25vdCBzdXBwb3J0ZWQgKENBU1NBTkRSQS0xNDAxMykKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy9iYWNrdXBzL25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKICAgICAgICAgfTsKIAogICAgICAgICB0ZXN0S2V5c3BhY2VUYWJsZVBhcnNpbmcobGVnYWN5RmlsZVBhdGhzV2l0aEJhY2t1cHNLZXlzcGFjZUFuZFRhYmxlLCAiYmFja3VwcyIsICJiYWNrdXBzIik7CkBAIC0yMzYsNTMgKzI0MSw1MyBAQAogICAgICAgICAvLyB3aGF0IGlmIGV2ZW4gYSBzbmFwc2hvdCBvZiBhIGtleXNwYWNlIGFuZCB0YWJsZSBjYWxsZWQgYmFja3VwcyBpcyBjYWxsZWQgc25hcHNob3RzPwogCiAgICAgICAgIFN0cmluZ1tdIGZpbGVQYXRoc1dpdGhCYWNrdXBzS2V5c3BhY2VBbmRUYWJsZVdpdGhJbmRpY2VzID0gbmV3IFN0cmluZ1tdewotICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzLTc0MjczODQyNzM4OTQ3OC8uaW5kZXgvbmEtMS1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzLTc0MjczODQyNzM4OTQ3OC9zbmFwc2hvdHMvc25hcHNob3RzLy5pbmRleC9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9iYWNrdXBzL2JhY2t1cHMtNzQyNzM4NDI3Mzg5NDc4L2JhY2t1cHMvLmluZGV4L25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy03NDI3Mzg0MjczODk0NzgvLmluZGV4L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy03NDI3Mzg0MjczODk0Nzgvc25hcHNob3RzL3NuYXBzaG90cy8uaW5kZXgvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzLTc0MjczODQyNzM4OTQ3OC9iYWNrdXBzLy5pbmRleC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9iYWNrdXBzL2JhY2t1cHMtNzQyNzM4NDI3Mzg5NDc4NzQyNzM4NDI3Mzg5NDc4NzgvLmluZGV4L25hLTEtYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy03NDI3Mzg0MjczODk0Nzg3NDI3Mzg0MjczODk0Nzg3OC9zbmFwc2hvdHMvc25hcHNob3RzLy5pbmRleC9uYS0xLWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9iYWNrdXBzL2JhY2t1cHMtNzQyNzM4NDI3Mzg5NDc4NzQyNzM4NDI3Mzg5NDc4NzgvYmFja3Vwcy8uaW5kZXgvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzLTc0MjczODQyNzM4OTQ3ODc0MjczODQyNzM4OTQ3ODc4Ly5pbmRleC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9iYWNrdXBzL2JhY2t1cHMtNzQyNzM4NDI3Mzg5NDc4NzQyNzM4NDI3Mzg5NDc4Nzgvc25hcHNob3RzL3NuYXBzaG90cy8uaW5kZXgvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzLTc0MjczODQyNzM4OTQ3ODc0MjczODQyNzM4OTQ3ODc4L2JhY2t1cHMvLmluZGV4L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKICAgICAgICAgfTsKIAogICAgICAgICB0ZXN0S2V5c3BhY2VUYWJsZVBhcnNpbmcoZmlsZVBhdGhzV2l0aEJhY2t1cHNLZXlzcGFjZUFuZFRhYmxlV2l0aEluZGljZXMsICJiYWNrdXBzIiwgImJhY2t1cHMuaW5kZXgiKTsKIAogICAgICAgICBTdHJpbmdbXSBvdXRzaWRlT2ZDYXNzYW5kcmEgPSBuZXcgU3RyaW5nW117Ci0gICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9rZXlzcGFjZS90YWJsZS0zNDI0MjM0MjM0MjM0L25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi90bXAvc29tZS9wYXRoL3Rlc3RzL2tleXNwYWNlL3RhYmxlLTM0MjQyMzQyMzQyMzQvc25hcHNob3RzL3NuYXBzaG90cy9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9rZXlzcGFjZS90YWJsZS0zNDI0MjM0MjM0MjM0L2JhY2t1cHMvbmEtMS1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3RtcC90ZXN0cy9rZXlzcGFjZS90YWJsZS0zNDI0MjM0MjM0MjM0L25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9rZXlzcGFjZS90YWJsZS0zNDI0MjM0MjM0MjM0L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi90bXAvc29tZS9wYXRoL3Rlc3RzL2tleXNwYWNlL3RhYmxlLTM0MjQyMzQyMzQyMzQvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMva2V5c3BhY2UvdGFibGUtMzQyNDIzNDIzNDIzNC9zbmFwc2hvdHMvc25hcHNob3RzL25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi90bXAvc29tZS9wYXRoL3Rlc3RzL2tleXNwYWNlL3RhYmxlLTM0MjQyMzQyMzQyMzQvYmFja3Vwcy9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvdG1wL3Rlc3RzL2tleXNwYWNlL3RhYmxlLTM0MjQyMzQyMzQyMzQvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAotICAgICAgICAiL2tleXNwYWNlL3RhYmxlLTM0MjQyMzQyMzQyMzQvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiCisgICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9rZXlzcGFjZS90YWJsZS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC9uYS0xLWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9rZXlzcGFjZS90YWJsZS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC9zbmFwc2hvdHMvc25hcHNob3RzL25hLTEtYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi90bXAvc29tZS9wYXRoL3Rlc3RzL2tleXNwYWNlL3RhYmxlLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0L2JhY2t1cHMvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3RtcC90ZXN0cy9rZXlzcGFjZS90YWJsZS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC9uYS0xLWJpZy1JbmRleC5kYiIsCisgICAgICAgICIva2V5c3BhY2UvdGFibGUtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMva2V5c3BhY2UvdGFibGUtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMva2V5c3BhY2UvdGFibGUtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvc25hcHNob3RzL3NuYXBzaG90cy9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9rZXlzcGFjZS90YWJsZS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC9iYWNrdXBzL25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi90bXAvdGVzdHMva2V5c3BhY2UvdGFibGUtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAorICAgICAgICAiL2tleXNwYWNlL3RhYmxlLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIgogICAgICAgICB9OwogCiAgICAgICAgIHRlc3RLZXlzcGFjZVRhYmxlUGFyc2luZyhvdXRzaWRlT2ZDYXNzYW5kcmEsICJrZXlzcGFjZSIsICJ0YWJsZSIpOwogCiAgICAgICAgIFN0cmluZ1tdIG91dHNpZGVPZkNhc3NhbmRyYVVwcGVyY2FzZUtleXNwYWNlQW5kVGFibGUgPSBuZXcgU3RyaW5nW117Ci0gICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9LZXlzcGFjZS9UYWJsZS0yMzQyNDMyNDIzNDIzNC9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9LZXlzcGFjZS9UYWJsZS0yMzQyNDMyNDIzNDIzNC9zbmFwc2hvdHMvc25hcHNob3RzL25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi90bXAvc29tZS9wYXRoL3Rlc3RzL0tleXNwYWNlL1RhYmxlLTIzNDI0MzI0MjM0MjM0L2JhY2t1cHMvbmEtMS1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3RtcC90ZXN0cy9LZXlzcGFjZS9UYWJsZS0yMzQyNDMyNDIzNDIzNC9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvS2V5c3BhY2UvVGFibGUtMjM0MjQzMjQyMzQyMzQvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMvS2V5c3BhY2UvVGFibGUtMjM0MjQzMjQyMzQyMzQvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMvS2V5c3BhY2UvVGFibGUtMjM0MjQzMjQyMzQyMzQvc25hcHNob3RzL3NuYXBzaG90cy9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9LZXlzcGFjZS9UYWJsZS0yMzQyNDMyNDIzNDIzNC9iYWNrdXBzL25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi90bXAvdGVzdHMvS2V5c3BhY2UvVGFibGUtMjM0MjQzMjQyMzQyMzQvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAotICAgICAgICAiL0tleXNwYWNlL1RhYmxlLTIzNDI0MzI0MjM0MjM0L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIgorICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMvS2V5c3BhY2UvVGFibGUtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMvS2V5c3BhY2UvVGFibGUtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvc25hcHNob3RzL3NuYXBzaG90cy9uYS0xLWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9LZXlzcGFjZS9UYWJsZS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC9iYWNrdXBzL25hLTEtYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi90bXAvdGVzdHMvS2V5c3BhY2UvVGFibGUtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL0tleXNwYWNlL1RhYmxlLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi90bXAvc29tZS9wYXRoL3Rlc3RzL0tleXNwYWNlL1RhYmxlLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi90bXAvc29tZS9wYXRoL3Rlc3RzL0tleXNwYWNlL1RhYmxlLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0L3NuYXBzaG90cy9zbmFwc2hvdHMvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMvS2V5c3BhY2UvVGFibGUtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvYmFja3Vwcy9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvdG1wL3Rlc3RzL0tleXNwYWNlL1RhYmxlLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9LZXlzcGFjZS9UYWJsZS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIKICAgICAgICAgfTsKIAogICAgICAgICB0ZXN0S2V5c3BhY2VUYWJsZVBhcnNpbmcob3V0c2lkZU9mQ2Fzc2FuZHJhVXBwZXJjYXNlS2V5c3BhY2VBbmRUYWJsZSwgIktleXNwYWNlIiwgIlRhYmxlIik7CiAKICAgICAgICAgU3RyaW5nW10gb3V0c2lkZU9mQ2Fzc2FuZHJhSW5kZXhlcyA9IG5ldyBTdHJpbmdbXXsKLSAgICAgICAgIi90bXAvc29tZS9wYXRoL3Rlc3RzL2tleXNwYWNlL3RhYmxlLTMyNDIzNDIzNDIzNDIzLy5pbmRleC9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9rZXlzcGFjZS90YWJsZS0zMjQyMzQyMzQyMzQyMy9zbmFwc2hvdHMvc25hcHNob3RzLy5pbmRleC9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9rZXlzcGFjZS90YWJsZS0zMjQyMzQyMzQyMzQyMy9iYWNrdXBzLy5pbmRleC9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9rZXlzcGFjZS90YWJsZS0zMjQyMzQyMzQyMzQyMy8uaW5kZXgvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMva2V5c3BhY2UvdGFibGUtMzI0MjM0MjM0MjM0MjMvc25hcHNob3RzL3NuYXBzaG90cy8uaW5kZXgvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMva2V5c3BhY2UvdGFibGUtMzI0MjM0MjM0MjM0MjMvYmFja3Vwcy8uaW5kZXgvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiCisgICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9rZXlzcGFjZS90YWJsZS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC8uaW5kZXgvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMva2V5c3BhY2UvdGFibGUtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvc25hcHNob3RzL3NuYXBzaG90cy8uaW5kZXgvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMva2V5c3BhY2UvdGFibGUtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvYmFja3Vwcy8uaW5kZXgvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMva2V5c3BhY2UvdGFibGUtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvLmluZGV4L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi90bXAvc29tZS9wYXRoL3Rlc3RzL2tleXNwYWNlL3RhYmxlLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0L3NuYXBzaG90cy9zbmFwc2hvdHMvLmluZGV4L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi90bXAvc29tZS9wYXRoL3Rlc3RzL2tleXNwYWNlL3RhYmxlLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0L2JhY2t1cHMvLmluZGV4L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIgogICAgICAgICB9OwogCiAgICAgICAgIHRlc3RLZXlzcGFjZVRhYmxlUGFyc2luZyhvdXRzaWRlT2ZDYXNzYW5kcmFJbmRleGVzLCAia2V5c3BhY2UiLCAidGFibGUuaW5kZXgiKTsKQEAgLTI5OSwxMCArMzA0LDEwIEBACiAgICAgewogICAgICAgICBmb3IgKFN0cmluZyBmaWxlUGF0aCA6IGZpbGVQYXRocykKICAgICAgICAgewotICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gRGVzY3JpcHRvci5mcm9tRmlsZW5hbWUoZmlsZVBhdGgpOworICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gRGVzY3JpcHRvci5mcm9tRmlsZShuZXcgRmlsZShmaWxlUGF0aCkpOwogICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkS2V5c3BhY2UsIGRlc2NyaXB0b3Iua3NuYW1lKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXhwZWN0ZWRUYWJsZSwgZGVzY3JpcHRvci5jZm5hbWUpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJFeHBlY3RlZCBrZXlzcGFjZSBub3QgZm91bmQgZm9yICVzIiwgZmlsZVBhdGgpLCBleHBlY3RlZEtleXNwYWNlLCBkZXNjcmlwdG9yLmtzbmFtZSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkV4cGVjdGVkIHRhYmxlIG5vdCBmb3VuZCBmb3IgJXMiLCBmaWxlUGF0aCksIGV4cGVjdGVkVGFibGUsIGRlc2NyaXB0b3IuY2ZuYW1lKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0luZGV4U3VtbWFyeU1hbmFnZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JbmRleFN1bW1hcnlNYW5hZ2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDk0ZTNjLi4wMDAwMDAwCi0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0luZGV4U3VtbWFyeU1hbmFnZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ODggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC4qOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Kb2luZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5OYW1lZFRocmVhZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dVcGRhdGVCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlJlc3RvcmFibGVNZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ2FjaGluZ1BhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYVRlc3RVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwotCi1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwLm9mOwotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbC5hc3NlcnRPbkRpc2tTdGF0ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Eb3duc2FtcGxpbmcuQkFTRV9TQU1QTElOR19MRVZFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvbi5ET1dOU0FNUExFX1RIRVNIT0xEOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uLlVQU0FNUExFX1RIUkVTSE9MRDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJRDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQotcHVibGljIGNsYXNzIEluZGV4U3VtbWFyeU1hbmFnZXJUZXN0Ci17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEluZGV4U3VtbWFyeU1hbmFnZXJUZXN0LmNsYXNzKTsKLQotICAgIGludCBvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWw7Ci0gICAgaW50IG9yaWdpbmFsTWF4SW5kZXhJbnRlcnZhbDsKLSAgICBsb25nIG9yaWdpbmFsQ2FwYWNpdHk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0UxID0gIkluZGV4U3VtbWFyeU1hbmFnZXJUZXN0IjsKLSAgICAvLyBpbmRleCBpbnRlcnZhbCBvZiA4LCBubyBrZXkgY2FjaGluZwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9TVEFOREFSRExPV2lJTlRFUlZBTCA9ICJTdGFuZGFyZExvd0luZGV4SW50ZXJ2YWwiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9TVEFOREFSRFJBQ0UgPSAiU3RhbmRhcmRSYWNlIjsKLQotICAgIEBCZWZvcmVDbGFzcwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVTY2hlbWEoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU2NoZW1hTG9hZGVyLnByZXBhcmVTZXJ2ZXIoKTsKLSAgICAgICAgU2NoZW1hTG9hZGVyLmNyZWF0ZUtleXNwYWNlKEtFWVNQQUNFMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBDRl9TVEFOREFSRExPV2lJTlRFUlZBTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5taW5JbmRleEludGVydmFsKDgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4SW5kZXhJbnRlcnZhbCgyNTYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2FjaGluZyhDYWNoaW5nUGFyYW1zLkNBQ0hFX05PVEhJTkcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENGX1NUQU5EQVJEUkFDRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5taW5JbmRleEludGVydmFsKDgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4SW5kZXhJbnRlcnZhbCgyNTYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2FjaGluZyhDYWNoaW5nUGFyYW1zLkNBQ0hFX05PVEhJTkcpKTsKLSAgICB9Ci0KLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgYmVmb3JlVGVzdCgpCi0gICAgewotICAgICAgICBTdHJpbmcga3NuYW1lID0gS0VZU1BBQ0UxOwotICAgICAgICBTdHJpbmcgY2ZuYW1lID0gQ0ZfU1RBTkRBUkRMT1dpSU5URVJWQUw7IC8vIGluZGV4IGludGVydmFsIG9mIDgsIG5vIGtleSBjYWNoaW5nCi0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc25hbWUpOwotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZm5hbWUpOwotICAgICAgICBvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwgPSBjZnMubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbDsKLSAgICAgICAgb3JpZ2luYWxNYXhJbmRleEludGVydmFsID0gY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1heEluZGV4SW50ZXJ2YWw7Ci0gICAgICAgIG9yaWdpbmFsQ2FwYWNpdHkgPSBJbmRleFN1bW1hcnlNYW5hZ2VyLmluc3RhbmNlLmdldE1lbW9yeVBvb2xDYXBhY2l0eUluTUIoKTsKLSAgICB9Ci0KLSAgICBAQWZ0ZXIKLSAgICBwdWJsaWMgdm9pZCBhZnRlclRlc3QoKQotICAgIHsKLSAgICAgICAgZm9yIChDb21wYWN0aW9uSW5mby5Ib2xkZXIgaG9sZGVyIDogQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmdldENvbXBhY3Rpb25zKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGhvbGRlci5zdG9wKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcga3NuYW1lID0gS0VZU1BBQ0UxOwotICAgICAgICBTdHJpbmcgY2ZuYW1lID0gQ0ZfU1RBTkRBUkRMT1dpSU5URVJWQUw7IC8vIGluZGV4IGludGVydmFsIG9mIDgsIG5vIGtleSBjYWNoaW5nCi0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc25hbWUpOwotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZm5hbWUpOwotCi0gICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlVGFibGVVcGRhdGUoY2ZzLm1ldGFkYXRhKCkudW5idWlsZCgpLm1pbkluZGV4SW50ZXJ2YWwob3JpZ2luYWxNaW5JbmRleEludGVydmFsKS5idWlsZCgpKTsKLSAgICAgICAgU2NoZW1hVGVzdFV0aWwuYW5ub3VuY2VUYWJsZVVwZGF0ZShjZnMubWV0YWRhdGEoKS51bmJ1aWxkKCkubWF4SW5kZXhJbnRlcnZhbChvcmlnaW5hbE1heEluZGV4SW50ZXJ2YWwpLmJ1aWxkKCkpOwotCi0gICAgICAgIEluZGV4U3VtbWFyeU1hbmFnZXIuaW5zdGFuY2Uuc2V0TWVtb3J5UG9vbENhcGFjaXR5SW5NQihvcmlnaW5hbENhcGFjaXR5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIHRvdGFsT2ZmSGVhcFNpemUoTGlzdDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcykKLSAgICB7Ci0gICAgICAgIGxvbmcgdG90YWwgPSAwOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzKQotICAgICAgICAgICAgdG90YWwgKz0gc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlPZmZIZWFwU2l6ZSgpOwotICAgICAgICByZXR1cm4gdG90YWw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTU1RhYmxlUmVhZGVyPiByZXNldFN1bW1hcmllcyhDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIExpc3Q8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMsIGxvbmcgb3JpZ2luYWxPZmZIZWFwU2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzKQotICAgICAgICAgICAgc3N0YWJsZS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKDEwMC4wLCAxMDAuMCkpOwotCi0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzdGFibGVzID0gcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgb3JpZ2luYWxPZmZIZWFwU2l6ZSAqIHNzdGFibGVzLnNpemUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcykKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeVNhbXBsaW5nTGV2ZWwoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHNzdGFibGVzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZURhdGEoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBpbnQgbnVtUGFydGl0aW9uKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1QYXJ0aXRpb247IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgUm93IHJvdyA9IFV0aWwuZ2V0T25seVJvd1VuZmlsdGVyZWQoVXRpbC5jbWQoY2ZzLCBTdHJpbmcuZm9ybWF0KCIlM2QiLCBpKSkuYnVpbGQoKSk7Ci0gICAgICAgICAgICBDZWxsPD8+IGNlbGwgPSByb3cuZ2V0Q2VsbChjZnMubWV0YWRhdGEoKS5nZXRDb2x1bW4oQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoInZhbCIpKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGNlbGwpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgY2VsbC5idWZmZXIoKS5hcnJheSgpLmxlbmd0aCk7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQ29tcGFyYXRvcjxTU1RhYmxlUmVhZGVyPiBob3RuZXNzQ29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yPFNTVGFibGVSZWFkZXI+KCkKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShTU1RhYmxlUmVhZGVyIG8xLCBTU1RhYmxlUmVhZGVyIG8yKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gRG91YmxlLmNvbXBhcmUobzEuZ2V0UmVhZE1ldGVyKCkuZmlmdGVlbk1pbnV0ZVJhdGUoKSwgbzIuZ2V0UmVhZE1ldGVyKCkuZmlmdGVlbk1pbnV0ZVJhdGUoKSk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNTVGFibGVzKFN0cmluZyBrc25hbWUsIFN0cmluZyBjZm5hbWUsIGludCBudW1TU1RhYmxlcywgaW50IG51bVBhcnRpdGlvbikKLSAgICB7Ci0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc25hbWUpOwotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZm5hbWUpOwotICAgICAgICBjZnMudHJ1bmNhdGVCbG9ja2luZygpOwotICAgICAgICBjZnMuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0KLSAgICAgICAgQXJyYXlMaXN0PEZ1dHVyZT4gZnV0dXJlcyA9IG5ldyBBcnJheUxpc3Q8PihudW1TU1RhYmxlcyk7Ci0gICAgICAgIEJ5dGVCdWZmZXIgdmFsdWUgPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbMTAwXSk7Ci0gICAgICAgIGZvciAoaW50IHNzdGFibGUgPSAwOyBzc3RhYmxlIDwgbnVtU1NUYWJsZXM7IHNzdGFibGUrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgcCA9IDA7IHAgPCBudW1QYXJ0aXRpb247IHArKykKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBTdHJpbmcuZm9ybWF0KCIlM2QiLCBwKTsKLSAgICAgICAgICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgMCwga2V5KQotICAgICAgICAgICAgICAgICAgICAuY2x1c3RlcmluZygiY29sdW1uIikKLSAgICAgICAgICAgICAgICAgICAgLmFkZCgidmFsIiwgdmFsdWUpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBseVVuc2FmZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnV0dXJlcy5hZGQoY2ZzLmZvcmNlRmx1c2goQ29sdW1uRmFtaWx5U3RvcmUuRmx1c2hSZWFzb24uVU5JVF9URVNUUykpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoRnV0dXJlIGZ1dHVyZSA6IGZ1dHVyZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZ1dHVyZS5nZXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB8IEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhudW1TU1RhYmxlcywgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7Ci0gICAgICAgIHZhbGlkYXRlRGF0YShjZnMsIG51bVBhcnRpdGlvbik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlTWluSW5kZXhJbnRlcnZhbCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIGtzbmFtZSA9IEtFWVNQQUNFMTsKLSAgICAgICAgU3RyaW5nIGNmbmFtZSA9IENGX1NUQU5EQVJETE9XaUlOVEVSVkFMOyAvLyBpbmRleCBpbnRlcnZhbCBvZiA4LCBubyBrZXkgY2FjaGluZwotICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NuYW1lKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2ZuYW1lKTsKLSAgICAgICAgaW50IG51bVNTVGFibGVzID0gMTsKLSAgICAgICAgaW50IG51bVJvd3MgPSAyNTY7Ci0gICAgICAgIGNyZWF0ZVNTVGFibGVzKGtzbmFtZSwgY2ZuYW1lLCBudW1TU1RhYmxlcywgbnVtUm93cyk7Ci0KLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PihjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzKQotICAgICAgICAgICAgc3N0YWJsZS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKDEwMC4wLCAxMDAuMCkpOwotCi0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbCgpLCAwLjAwMSk7Ci0KLSAgICAgICAgLy8gZG91YmxlIHRoZSBtaW5faW5kZXhfaW50ZXJ2YWwKLSAgICAgICAgU2NoZW1hVGVzdFV0aWwuYW5ub3VuY2VUYWJsZVVwZGF0ZShjZnMubWV0YWRhdGEoKS51bmJ1aWxkKCkubWluSW5kZXhJbnRlcnZhbChvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwgKiAyKS5idWlsZCgpKTsKLSAgICAgICAgSW5kZXhTdW1tYXJ5TWFuYWdlci5pbnN0YW5jZS5yZWRpc3RyaWJ1dGVTdW1tYXJpZXMoKTsKLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjZnMubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbCwgc3N0YWJsZS5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCksIDAuMDAxKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1Sb3dzIC8gY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5U2l6ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJldHVybiBtaW5faW5kZXhfaW50ZXJ2YWwgdG8gaXRzIG9yaWdpbmFsIHZhbHVlCi0gICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlVGFibGVVcGRhdGUoY2ZzLm1ldGFkYXRhKCkudW5idWlsZCgpLm1pbkluZGV4SW50ZXJ2YWwob3JpZ2luYWxNaW5JbmRleEludGVydmFsKS5idWlsZCgpKTsKLSAgICAgICAgSW5kZXhTdW1tYXJ5TWFuYWdlci5pbnN0YW5jZS5yZWRpc3RyaWJ1dGVTdW1tYXJpZXMoKTsKLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjZnMubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbCwgc3N0YWJsZS5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCksIDAuMDAxKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1Sb3dzIC8gY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5U2l6ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGhhbHZlIHRoZSBtaW5faW5kZXhfaW50ZXJ2YWwsIGJ1dCBjb25zdHJhaW4gdGhlIGF2YWlsYWJsZSBzcGFjZSB0byBleGFjdGx5IHdoYXQgd2UgaGF2ZSBub3c7IGFzIGEgcmVzdWx0LAotICAgICAgICAvLyB0aGUgc3VtbWFyeSBzaG91bGRuJ3QgY2hhbmdlCi0gICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlVGFibGVVcGRhdGUoY2ZzLm1ldGFkYXRhKCkudW5idWlsZCgpLm1pbkluZGV4SW50ZXJ2YWwob3JpZ2luYWxNaW5JbmRleEludGVydmFsIC8gMikuYnVpbGQoKSk7Ci0gICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgbG9uZyBzdW1tYXJ5U3BhY2UgPSBzc3RhYmxlLmdldEluZGV4U3VtbWFyeU9mZkhlYXBTaXplKCk7Ci0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoYXNMaXN0KHNzdGFibGUpLCBPcGVyYXRpb25UeXBlLlVOS05PV04pKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCBzdW1tYXJ5U3BhY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsTWluSW5kZXhJbnRlcnZhbCwgc3N0YWJsZS5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCksIDAuMDAxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bVJvd3MgLyBvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5U2l6ZSgpKTsKLQotICAgICAgICAvLyBrZWVwIHRoZSBtaW5faW5kZXhfaW50ZXJ2YWwgdGhlIHNhbWUsIGJ1dCBub3cgZ2l2ZSB0aGUgc3VtbWFyeSBlbm91Z2ggc3BhY2UgdG8gZ3JvdyBieSA1MCUKLSAgICAgICAgZG91YmxlIHByZXZpb3VzSW50ZXJ2YWwgPSBzc3RhYmxlLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKTsKLSAgICAgICAgaW50IHByZXZpb3VzU2l6ZSA9IHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5U2l6ZSgpOwotICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KGFzTGlzdChzc3RhYmxlKSwgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgKGxvbmcpIE1hdGguY2VpbChzdW1tYXJ5U3BhY2UgKiAxLjUpKTsKLSAgICAgICAgfQotICAgICAgICBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocHJldmlvdXNTaXplICogMS41LCAoZG91YmxlKSBzc3RhYmxlLmdldEluZGV4U3VtbWFyeVNpemUoKSwgMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwcmV2aW91c0ludGVydmFsICogKDEuMCAvIDEuNSksIHNzdGFibGUuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbCgpLCAwLjAwMSk7Ci0KLSAgICAgICAgLy8gcmV0dXJuIG1pbl9pbmRleF9pbnRlcnZhbCB0byBpdCdzIG9yaWdpbmFsIHZhbHVlIChkb3VibGUgaXQpLCBidXQgb25seSBnaXZlIHRoZSBzdW1tYXJ5IGVub3VnaCBzcGFjZQotICAgICAgICAvLyB0byBoYXZlIGFuIGVmZmVjdGl2ZSBpbmRleCBpbnRlcnZhbCBvZiB0d2ljZSB0aGUgbmV3IG1pbgotICAgICAgICBTY2hlbWFUZXN0VXRpbC5hbm5vdW5jZVRhYmxlVXBkYXRlKGNmcy5tZXRhZGF0YSgpLnVuYnVpbGQoKS5taW5JbmRleEludGVydmFsKG9yaWdpbmFsTWluSW5kZXhJbnRlcnZhbCkuYnVpbGQoKSk7Ci0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoYXNMaXN0KHNzdGFibGUpLCBPcGVyYXRpb25UeXBlLlVOS05PV04pKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAobG9uZykgTWF0aC5jZWlsKHN1bW1hcnlTcGFjZSAvIDIuMCkpOwotICAgICAgICB9Ci0gICAgICAgIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwgKiAyLCBzc3RhYmxlLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKSwgMC4wMDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMobnVtUm93cyAvIChvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwgKiAyKSwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTaXplKCkpOwotCi0gICAgICAgIC8vIHJhaXNlIHRoZSBtaW5faW5kZXhfaW50ZXJ2YWwgYWJvdmUgb3VyIGN1cnJlbnQgZWZmZWN0aXZlIGludGVydmFsLCBidXQgc2V0IHRoZSBtYXhfaW5kZXhfaW50ZXJ2YWwgbG93ZXIKLSAgICAgICAgLy8gdGhhbiB3aGF0IHdlIGFjdHVhbGx5IGhhdmUgc3BhY2UgZm9yIChtZWFuaW5nIHRoZSBpbmRleCBzdW1tYXJ5IHdvdWxkIGlkZWFsbHkgYmUgc21hbGxlciwgYnV0IHRoaXMgd291bGQKLSAgICAgICAgLy8gcmVzdWx0IGluIGFuIGVmZmVjdGl2ZSBpbnRlcnZhbCBhYm92ZSB0aGUgbmV3IG1heCkKLSAgICAgICAgU2NoZW1hVGVzdFV0aWwuYW5ub3VuY2VUYWJsZVVwZGF0ZShjZnMubWV0YWRhdGEoKS51bmJ1aWxkKCkubWluSW5kZXhJbnRlcnZhbChvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwgKiA0KS5idWlsZCgpKTsKLSAgICAgICAgU2NoZW1hVGVzdFV0aWwuYW5ub3VuY2VUYWJsZVVwZGF0ZShjZnMubWV0YWRhdGEoKS51bmJ1aWxkKCkubWF4SW5kZXhJbnRlcnZhbChvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwgKiA0KS5idWlsZCgpKTsKLSAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShhc0xpc3Qoc3N0YWJsZSksIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBvZihjZnMubWV0YWRhdGEuaWQsIHR4biksIDEwKTsKLSAgICAgICAgfQotICAgICAgICBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbCgpLCAwLjAwMSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlTWF4SW5kZXhJbnRlcnZhbCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIGtzbmFtZSA9IEtFWVNQQUNFMTsKLSAgICAgICAgU3RyaW5nIGNmbmFtZSA9IENGX1NUQU5EQVJETE9XaUlOVEVSVkFMOyAvLyBpbmRleCBpbnRlcnZhbCBvZiA4LCBubyBrZXkgY2FjaGluZwotICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NuYW1lKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2ZuYW1lKTsKLSAgICAgICAgaW50IG51bVNTVGFibGVzID0gMTsKLSAgICAgICAgaW50IG51bVJvd3MgPSAyNTY7Ci0gICAgICAgIGNyZWF0ZVNTVGFibGVzKGtzbmFtZSwgY2ZuYW1lLCBudW1TU1RhYmxlcywgbnVtUm93cyk7Ci0KLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PihjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzKQotICAgICAgICAgICAgc3N0YWJsZS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKDEwMC4wLCAxMDAuMCkpOwotCi0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBvZihjZnMubWV0YWRhdGEuaWQsIHR4biksIDEwKTsKLSAgICAgICAgfQotICAgICAgICBzc3RhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PihjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzKQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsLCBzc3RhYmxlLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKSwgMC4wMSk7Ci0KLSAgICAgICAgLy8gaGFsdmUgdGhlIG1heF9pbmRleF9pbnRlcnZhbAotICAgICAgICBTY2hlbWFUZXN0VXRpbC5hbm5vdW5jZVRhYmxlVXBkYXRlKGNmcy5tZXRhZGF0YSgpLnVuYnVpbGQoKS5tYXhJbmRleEludGVydmFsKGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsIC8gMikuYnVpbGQoKSk7Ci0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBvZihjZnMubWV0YWRhdGEuaWQsIHR4biksIDEpOwotICAgICAgICB9Ci0gICAgICAgIHNzdGFibGVzID0gbmV3IEFycmF5TGlzdDw+KGNmcy5nZXRMaXZlU1NUYWJsZXMoKSk7Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjZnMubWV0YWRhdGEoKS5wYXJhbXMubWF4SW5kZXhJbnRlcnZhbCwgc3N0YWJsZS5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCksIDAuMDEpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bVJvd3MgLyBjZnMubWV0YWRhdGEoKS5wYXJhbXMubWF4SW5kZXhJbnRlcnZhbCwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTaXplKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmV0dXJuIG1heF9pbmRleF9pbnRlcnZhbCB0byBpdHMgb3JpZ2luYWwgdmFsdWUKLSAgICAgICAgU2NoZW1hVGVzdFV0aWwuYW5ub3VuY2VUYWJsZVVwZGF0ZShjZnMubWV0YWRhdGEoKS51bmJ1aWxkKCkubWF4SW5kZXhJbnRlcnZhbChjZnMubWV0YWRhdGEoKS5wYXJhbXMubWF4SW5kZXhJbnRlcnZhbCAqIDIpLmJ1aWxkKCkpOwotICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KHNzdGFibGVzLCBPcGVyYXRpb25UeXBlLlVOS05PV04pKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAxKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGNmcy5nZXRMaXZlU1NUYWJsZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsLCBzc3RhYmxlLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKSwgMC4wMSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVtUm93cyAvIGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeVNpemUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdCh0aW1lb3V0ID0gMTAwMDApCi0gICAgcHVibGljIHZvaWQgdGVzdFJlZGlzdHJpYnV0ZVN1bW1hcmllcygpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIGtzbmFtZSA9IEtFWVNQQUNFMTsKLSAgICAgICAgU3RyaW5nIGNmbmFtZSA9IENGX1NUQU5EQVJETE9XaUlOVEVSVkFMOyAvLyBpbmRleCBpbnRlcnZhbCBvZiA4LCBubyBrZXkgY2FjaGluZwotICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NuYW1lKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2ZuYW1lKTsKLSAgICAgICAgaW50IG51bVNTVGFibGVzID0gNDsKLSAgICAgICAgaW50IG51bVJvd3MgPSAyNTY7Ci0gICAgICAgIGNyZWF0ZVNTVGFibGVzKGtzbmFtZSwgY2ZuYW1lLCBudW1TU1RhYmxlcywgbnVtUm93cyk7Ci0KLSAgICAgICAgaW50IG1pblNhbXBsaW5nTGV2ZWwgPSAoQkFTRV9TQU1QTElOR19MRVZFTCAqIGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsKSAvIGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsOwotCi0gICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oY2ZzLmdldExpdmVTU1RhYmxlcygpKTsKLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcykKLSAgICAgICAgICAgIHNzdGFibGUub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcigxMDAuMCwgMTAwLjApKTsKLQotICAgICAgICBsb25nIHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgPSBzc3RhYmxlcy5nZXQoMCkuZ2V0SW5kZXhTdW1tYXJ5T2ZmSGVhcFNpemUoKTsKLQotICAgICAgICAvLyB0aGVyZSBzaG91bGQgYmUgZW5vdWdoIHNwYWNlIHRvIG5vdCBkb3duc2FtcGxlIGFueXRoaW5nCi0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzdGFibGVzID0gcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgKHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgKiBudW1TU1RhYmxlcykpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSAqIG51bVNTVGFibGVzLCB0b3RhbE9mZkhlYXBTaXplKHNzdGFibGVzKSk7Ci0gICAgICAgIHZhbGlkYXRlRGF0YShjZnMsIG51bVJvd3MpOwotCi0gICAgICAgIC8vIGV2ZXJ5dGhpbmcgc2hvdWxkIGdldCBjdXQgaW4gaGFsZgotICAgICAgICBhc3NlcnQgc3N0YWJsZXMuc2l6ZSgpID09IDQ7Ci0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzdGFibGVzID0gcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgKHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgKiAobnVtU1NUYWJsZXMgLyAyKSkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCAvIDIsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5U2FtcGxpbmdMZXZlbCgpKTsKLSAgICAgICAgdmFsaWRhdGVEYXRhKGNmcywgbnVtUm93cyk7Ci0KLSAgICAgICAgLy8gZXZlcnl0aGluZyBzaG91bGQgZ2V0IGN1dCB0byBhIHF1YXJ0ZXIKLSAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlcywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3N0YWJsZXMgPSByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAoc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSAqIChudW1TU1RhYmxlcyAvIDQpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcykKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMIC8gNCwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkpOwotICAgICAgICB2YWxpZGF0ZURhdGEoY2ZzLCBudW1Sb3dzKTsKLQotICAgICAgICAvLyB1cHNhbXBsZSBiYWNrIHVwIHRvIGhhbGYKLSAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlcywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3N0YWJsZXMgPSByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAoc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSAqIChudW1TU1RhYmxlcyAvIDIpICsgNCkpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydCBzc3RhYmxlcy5zaXplKCkgPT0gNDsKLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcykKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMIC8gMiwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkpOwotICAgICAgICB2YWxpZGF0ZURhdGEoY2ZzLCBudW1Sb3dzKTsKLQotICAgICAgICAvLyB1cHNhbXBsZSBiYWNrIHVwIHRvIHRoZSBvcmlnaW5hbCBpbmRleCBzdW1tYXJ5Ci0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzdGFibGVzID0gcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgKHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgKiBudW1TU1RhYmxlcykpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkpOwotICAgICAgICB2YWxpZGF0ZURhdGEoY2ZzLCBudW1Sb3dzKTsKLQotICAgICAgICAvLyBtYWtlIHR3byBvZiB0aGUgZm91ciBzc3RhYmxlcyBjb2xkLCBvbmx5IGxlYXZlIGVub3VnaCBzcGFjZSBmb3IgdGhyZWUgZnVsbCBpbmRleCBzdW1tYXJpZXMsCi0gICAgICAgIC8vIHNvIHRoZSB0d28gY29sZCBzc3RhYmxlcyBzaG91bGQgZ2V0IGRvd25zYW1wbGVkIHRvIGJlIGhhbGYgb2YgdGhlaXIgb3JpZ2luYWwgc2l6ZQotICAgICAgICBzc3RhYmxlcy5nZXQoMCkub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcig1MC4wLCA1MC4wKSk7Ci0gICAgICAgIHNzdGFibGVzLmdldCgxKS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKDUwLjAsIDUwLjApKTsKLSAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlcywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3N0YWJsZXMgPSByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAoc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSAqIDMpKTsKLSAgICAgICAgfQotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHNzdGFibGVzLCBob3RuZXNzQ29tcGFyYXRvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMIC8gMiwgc3N0YWJsZXMuZ2V0KDApLmdldEluZGV4U3VtbWFyeVNhbXBsaW5nTGV2ZWwoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMIC8gMiwgc3N0YWJsZXMuZ2V0KDEpLmdldEluZGV4U3VtbWFyeVNhbXBsaW5nTGV2ZWwoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMLCBzc3RhYmxlcy5nZXQoMikuZ2V0SW5kZXhTdW1tYXJ5U2FtcGxpbmdMZXZlbCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwsIHNzdGFibGVzLmdldCgzKS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkpOwotICAgICAgICB2YWxpZGF0ZURhdGEoY2ZzLCBudW1Sb3dzKTsKLQotICAgICAgICAvLyBzbWFsbCBpbmNyZWFzZXMgb3IgZGVjcmVhc2VzIGluIHRoZSByZWFkIHJhdGUgZG9uJ3QgcmVzdWx0IGluIGRvd25zYW1wbGluZyBvciB1cHNhbXBsaW5nCi0gICAgICAgIGRvdWJsZSBsb3dlclJhdGUgPSA1MC4wICogKERPV05TQU1QTEVfVEhFU0hPTEQgKyAoRE9XTlNBTVBMRV9USEVTSE9MRCAqIDAuMTApKTsKLSAgICAgICAgZG91YmxlIGhpZ2hlclJhdGUgPSA1MC4wICogKFVQU0FNUExFX1RIUkVTSE9MRCAtIChVUFNBTVBMRV9USFJFU0hPTEQgKiAwLjEwKSk7Ci0gICAgICAgIHNzdGFibGVzLmdldCgwKS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKGxvd2VyUmF0ZSwgbG93ZXJSYXRlKSk7Ci0gICAgICAgIHNzdGFibGVzLmdldCgxKS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKGhpZ2hlclJhdGUsIGhpZ2hlclJhdGUpKTsKLSAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlcywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3N0YWJsZXMgPSByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAoc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSAqIDMpKTsKLSAgICAgICAgfQotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHNzdGFibGVzLCBob3RuZXNzQ29tcGFyYXRvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMIC8gMiwgc3N0YWJsZXMuZ2V0KDApLmdldEluZGV4U3VtbWFyeVNhbXBsaW5nTGV2ZWwoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMIC8gMiwgc3N0YWJsZXMuZ2V0KDEpLmdldEluZGV4U3VtbWFyeVNhbXBsaW5nTGV2ZWwoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMLCBzc3RhYmxlcy5nZXQoMikuZ2V0SW5kZXhTdW1tYXJ5U2FtcGxpbmdMZXZlbCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwsIHNzdGFibGVzLmdldCgzKS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkpOwotICAgICAgICB2YWxpZGF0ZURhdGEoY2ZzLCBudW1Sb3dzKTsKLQotICAgICAgICAvLyByZXNldCwgYW5kIHRoZW4gdGhpcyB0aW1lLCBsZWF2ZSBlbm91Z2ggc3BhY2UgZm9yIG9uZSBvZiB0aGUgY29sZCBzc3RhYmxlcyB0byBub3QgZ2V0IGRvd25zYW1wbGVkCi0gICAgICAgIHNzdGFibGVzID0gcmVzZXRTdW1tYXJpZXMoY2ZzLCBzc3RhYmxlcywgc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSk7Ci0gICAgICAgIHNzdGFibGVzLmdldCgwKS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKDEuMCwgMS4wKSk7Ci0gICAgICAgIHNzdGFibGVzLmdldCgxKS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKDIuMCwgMi4wKSk7Ci0gICAgICAgIHNzdGFibGVzLmdldCgyKS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKDEwMDAuMCwgMTAwMC4wKSk7Ci0gICAgICAgIHNzdGFibGVzLmdldCgzKS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKDEwMDAuMCwgMTAwMC4wKSk7Ci0KLSAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlcywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3N0YWJsZXMgPSByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAoc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSAqIDMpICsgNTApOwotICAgICAgICB9Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoc3N0YWJsZXMsIGhvdG5lc3NDb21wYXJhdG9yKTsKLQotICAgICAgICBpZiAoc3N0YWJsZXMuZ2V0KDApLmdldEluZGV4U3VtbWFyeVNhbXBsaW5nTGV2ZWwoKSA9PSBtaW5TYW1wbGluZ0xldmVsKQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwsIHNzdGFibGVzLmdldCgxKS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCwgc3N0YWJsZXMuZ2V0KDApLmdldEluZGV4U3VtbWFyeVNhbXBsaW5nTGV2ZWwoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwsIHNzdGFibGVzLmdldCgyKS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCwgc3N0YWJsZXMuZ2V0KDMpLmdldEluZGV4U3VtbWFyeVNhbXBsaW5nTGV2ZWwoKSk7Ci0gICAgICAgIHZhbGlkYXRlRGF0YShjZnMsIG51bVJvd3MpOwotCi0KLSAgICAgICAgLy8gQ2F1c2UgYSBtaXggb2YgdXBzYW1wbGluZyBhbmQgZG93bnNhbXBsaW5nLiBXZSdsbCBsZWF2ZSBlbm91Z2ggc3BhY2UgZm9yIHR3byBmdWxsIGluZGV4IHN1bW1hcmllcy4gVGhlIHR3bwotICAgICAgICAvLyBjb2xkZXN0IHNzdGFibGVzIHdpbGwgZ2V0IGRvd25zYW1wbGVkIHRvIDQvMTI4IG9mIHRoZWlyIHNpemUsIGxlYXZpbmcgdXMgd2l0aCAxIGFuZCA5Mi8xMjh0aCBpbmRleAotICAgICAgICAvLyBzdW1tYXJpZXMgd29ydGggb2Ygc3BhY2UuICBUaGUgaG90dGVzdCBzc3RhYmxlIHNob3VsZCBnZXQgYSBmdWxsIGluZGV4IHN1bW1hcnksIGFuZCB0aGUgb25lIGluIHRoZSBtaWRkbGUKLSAgICAgICAgLy8gc2hvdWxkIGdldCB0aGUgcmVtYWluZGVyLgotICAgICAgICBzc3RhYmxlcy5nZXQoMCkub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcigwLjAsIDAuMCkpOwotICAgICAgICBzc3RhYmxlcy5nZXQoMSkub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcigwLjAsIDAuMCkpOwotICAgICAgICBzc3RhYmxlcy5nZXQoMikub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcig5MiwgOTIpKTsKLSAgICAgICAgc3N0YWJsZXMuZ2V0KDMpLm92ZXJyaWRlUmVhZE1ldGVyKG5ldyBSZXN0b3JhYmxlTWV0ZXIoMTI4LjAsIDEyOC4wKSk7Ci0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzdGFibGVzID0gcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgKGxvbmcpIChzaW5nbGVTdW1tYXJ5T2ZmSGVhcFNwYWNlICsgKHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgKiAoOTIuMCAvIEJBU0VfU0FNUExJTkdfTEVWRUwpKSkpOwotICAgICAgICB9Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoc3N0YWJsZXMsIGhvdG5lc3NDb21wYXJhdG9yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNzdGFibGVzLmdldCgwKS5nZXRJbmRleFN1bW1hcnlTaXplKCkpOyAgLy8gYXQgdGhlIG1pbiBzYW1wbGluZyBsZXZlbAotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZXMuZ2V0KDApLmdldEluZGV4U3VtbWFyeVNpemUoKSk7ICAvLyBhdCB0aGUgbWluIHNhbXBsaW5nIGxldmVsCi0gICAgICAgIGFzc2VydFRydWUoc3N0YWJsZXMuZ2V0KDIpLmdldEluZGV4U3VtbWFyeVNhbXBsaW5nTGV2ZWwoKSA+IG1pblNhbXBsaW5nTGV2ZWwpOwotICAgICAgICBhc3NlcnRUcnVlKHNzdGFibGVzLmdldCgyKS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkgPCBCQVNFX1NBTVBMSU5HX0xFVkVMKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwsIHNzdGFibGVzLmdldCgzKS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkpOwotICAgICAgICB2YWxpZGF0ZURhdGEoY2ZzLCBudW1Sb3dzKTsKLQotICAgICAgICAvLyBEb24ndCBsZWF2ZSBlbm91Z2ggc3BhY2UgZm9yIGV2ZW4gdGhlIG1pbmltYWwgaW5kZXggc3VtbWFyaWVzCi0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzdGFibGVzID0gcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgMTApOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTaXplKCkpOyAgLy8gYXQgdGhlIG1pbiBzYW1wbGluZyBsZXZlbAotICAgICAgICB2YWxpZGF0ZURhdGEoY2ZzLCBudW1Sb3dzKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWJ1aWxkQXRTYW1wbGluZ0xldmVsKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcga3NuYW1lID0gS0VZU1BBQ0UxOwotICAgICAgICBTdHJpbmcgY2ZuYW1lID0gQ0ZfU1RBTkRBUkRMT1dpSU5URVJWQUw7Ci0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc25hbWUpOwotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZm5hbWUpOwotICAgICAgICBjZnMudHJ1bmNhdGVCbG9ja2luZygpOwotICAgICAgICBjZnMuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0KLSAgICAgICAgQnl0ZUJ1ZmZlciB2YWx1ZSA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVsxMDBdKTsKLQotICAgICAgICBpbnQgbnVtUm93cyA9IDI1NjsKLSAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbnVtUm93czsgcm93KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBTdHJpbmcuZm9ybWF0KCIlM2QiLCByb3cpOwotICAgICAgICAgICAgbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoY2ZzLm1ldGFkYXRhKCksIDAsIGtleSkKLSAgICAgICAgICAgIC5jbHVzdGVyaW5nKCJjb2x1bW4iKQotICAgICAgICAgICAgLmFkZCgidmFsIiwgdmFsdWUpCi0gICAgICAgICAgICAuYnVpbGQoKQotICAgICAgICAgICAgLmFwcGx5VW5zYWZlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBVdGlsLmZsdXNoKGNmcyk7Ci0KLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PihjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZXMuc2l6ZSgpKTsKLSAgICAgICAgU1NUYWJsZVJlYWRlciBvcmlnaW5hbCA9IHNzdGFibGVzLmdldCgwKTsKLQotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBvcmlnaW5hbDsKLSAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShhc0xpc3Qoc3N0YWJsZSksIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IHNhbXBsaW5nTGV2ZWwgPSAxOyBzYW1wbGluZ0xldmVsIDwgQkFTRV9TQU1QTElOR19MRVZFTDsgc2FtcGxpbmdMZXZlbCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNzdGFibGUgPSBzc3RhYmxlLmNsb25lV2l0aE5ld1N1bW1hcnlTYW1wbGluZ0xldmVsKGNmcywgc2FtcGxpbmdMZXZlbCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNhbXBsaW5nTGV2ZWwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5U2FtcGxpbmdMZXZlbCgpKTsKLSAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRTaXplID0gKG51bVJvd3MgKiBzYW1wbGluZ0xldmVsKSAvIChjZnMubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbCAqIEJBU0VfU0FNUExJTkdfTEVWRUwpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFNpemUsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5U2l6ZSgpLCAxKTsKLSAgICAgICAgICAgICAgICB0eG4udXBkYXRlKHNzdGFibGUsIHRydWUpOwotICAgICAgICAgICAgICAgIHR4bi5jaGVja3BvaW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0eG4uZmluaXNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RKTVhGdW5jdGlvbnMoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEluZGV4U3VtbWFyeU1hbmFnZXIgbWFuYWdlciA9IEluZGV4U3VtbWFyeU1hbmFnZXIuaW5zdGFuY2U7Ci0KLSAgICAgICAgLy8gcmVzaXplIGludGVydmFsCi0gICAgICAgIG1hbmFnZXIuc2V0UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoLTEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIERhdGFiYXNlRGVzY3JpcHRvci5nZXRJbmRleFN1bW1hcnlSZXNpemVJbnRlcnZhbEluTWludXRlcygpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChtYW5hZ2VyLmdldFRpbWVUb05leHRSZXNpemUoVGltZVVuaXQuTUlOVVRFUykpOwotCi0gICAgICAgIG1hbmFnZXIuc2V0UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoMTApOwotICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIG1hbmFnZXIuZ2V0UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxMCwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldEluZGV4U3VtbWFyeVJlc2l6ZUludGVydmFsSW5NaW51dGVzKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIG1hbmFnZXIuZ2V0VGltZVRvTmV4dFJlc2l6ZShUaW1lVW5pdC5NSU5VVEVTKSwgMSk7Ci0gICAgICAgIG1hbmFnZXIuc2V0UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoMTUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMTUsIG1hbmFnZXIuZ2V0UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxNSwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldEluZGV4U3VtbWFyeVJlc2l6ZUludGVydmFsSW5NaW51dGVzKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMTUsIG1hbmFnZXIuZ2V0VGltZVRvTmV4dFJlc2l6ZShUaW1lVW5pdC5NSU5VVEVTKSwgMik7Ci0KLSAgICAgICAgLy8gbWVtb3J5IHBvb2wgY2FwYWNpdHkKLSAgICAgICAgYXNzZXJ0VHJ1ZShtYW5hZ2VyLmdldE1lbW9yeVBvb2xDYXBhY2l0eUluTUIoKSA+PSAwKTsKLSAgICAgICAgbWFuYWdlci5zZXRNZW1vcnlQb29sQ2FwYWNpdHlJbk1CKDEwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBtYW5hZ2VyLmdldE1lbW9yeVBvb2xDYXBhY2l0eUluTUIoKSk7Ci0KLSAgICAgICAgU3RyaW5nIGtzbmFtZSA9IEtFWVNQQUNFMTsKLSAgICAgICAgU3RyaW5nIGNmbmFtZSA9IENGX1NUQU5EQVJETE9XaUlOVEVSVkFMOyAvLyBpbmRleCBpbnRlcnZhbCBvZiA4LCBubyBrZXkgY2FjaGluZwotICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NuYW1lKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2ZuYW1lKTsKLSAgICAgICAgY2ZzLnRydW5jYXRlQmxvY2tpbmcoKTsKLSAgICAgICAgY2ZzLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwotCi0gICAgICAgIEJ5dGVCdWZmZXIgdmFsdWUgPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbMTAwXSk7Ci0KLSAgICAgICAgaW50IG51bVNTVGFibGVzID0gMjsKLSAgICAgICAgaW50IG51bVJvd3MgPSAxMDsKLSAgICAgICAgZm9yIChpbnQgc3N0YWJsZSA9IDA7IHNzdGFibGUgPCBudW1TU1RhYmxlczsgc3N0YWJsZSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBudW1Sb3dzOyByb3crKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gU3RyaW5nLmZvcm1hdCgiJTNkIiwgcm93KTsKLSAgICAgICAgICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgMCwga2V5KQotICAgICAgICAgICAgICAgIC5jbHVzdGVyaW5nKCJjb2x1bW4iKQotICAgICAgICAgICAgICAgIC5hZGQoInZhbCIsIHZhbHVlKQotICAgICAgICAgICAgICAgIC5idWlsZCgpCi0gICAgICAgICAgICAgICAgLmFwcGx5VW5zYWZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBVdGlsLmZsdXNoKGNmcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKG1hbmFnZXIuZ2V0QXZlcmFnZUluZGV4SW50ZXJ2YWwoKSA+PSBjZnMubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IGludGVydmFscyA9IG1hbmFnZXIuZ2V0SW5kZXhJbnRlcnZhbHMoKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBJbnRlZ2VyPiBlbnRyeSA6IGludGVydmFscy5lbnRyeVNldCgpKQotICAgICAgICAgICAgaWYgKGVudHJ5LmdldEtleSgpLmNvbnRhaW5zKENGX1NUQU5EQVJETE9XaUlOVEVSVkFMKSkKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsIGVudHJ5LmdldFZhbHVlKCksIDAuMDAxKTsKLQotICAgICAgICBtYW5hZ2VyLnNldE1lbW9yeVBvb2xDYXBhY2l0eUluTUIoMCk7Ci0gICAgICAgIG1hbmFnZXIucmVkaXN0cmlidXRlU3VtbWFyaWVzKCk7Ci0gICAgICAgIGFzc2VydFRydWUobWFuYWdlci5nZXRBdmVyYWdlSW5kZXhJbnRlcnZhbCgpID4gY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwpOwotICAgICAgICBpbnRlcnZhbHMgPSBtYW5hZ2VyLmdldEluZGV4SW50ZXJ2YWxzKCk7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgSW50ZWdlcj4gZW50cnkgOiBpbnRlcnZhbHMuZW50cnlTZXQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGVudHJ5LmdldEtleSgpLmNvbnRhaW5zKENGX1NUQU5EQVJETE9XaUlOVEVSVkFMKSkKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGVudHJ5LmdldFZhbHVlKCkgPj0gY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuY2VsSW5kZXgoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0ZXN0Q2FuY2VsSW5kZXhIZWxwZXIoKGNmcykgLT4gQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2Uuc3RvcENvbXBhY3Rpb24oIklOREVYX1NVTU1BUlkiKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuY2VsSW5kZXhJbnRlcnJ1cHQoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0ZXN0Q2FuY2VsSW5kZXhIZWxwZXIoKGNmcykgLT4gQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuaW50ZXJydXB0Q29tcGFjdGlvbkZvcihDb2xsZWN0aW9ucy5zaW5nbGV0b24oY2ZzLm1ldGFkYXRhKCkpLCAoc3N0YWJsZSkgLT4gdHJ1ZSwgZmFsc2UpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuY2VsSW5kZXhIZWxwZXIoQ29uc3VtZXI8Q29sdW1uRmFtaWx5U3RvcmU+IGNhbmNlbEZ1bmN0aW9uKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcga3NuYW1lID0gS0VZU1BBQ0UxOwotICAgICAgICBTdHJpbmcgY2ZuYW1lID0gQ0ZfU1RBTkRBUkRMT1dpSU5URVJWQUw7IC8vIGluZGV4IGludGVydmFsIG9mIDgsIG5vIGtleSBjYWNoaW5nCi0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc25hbWUpOwotICAgICAgICBmaW5hbCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZm5hbWUpOwotICAgICAgICBjZnMuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIGZpbmFsIGludCBudW1TU1RhYmxlcyA9IDg7Ci0gICAgICAgIGludCBudW1Sb3dzID0gMjU2OwotICAgICAgICBjcmVhdGVTU1RhYmxlcyhrc25hbWUsIGNmbmFtZSwgbnVtU1NUYWJsZXMsIG51bVJvd3MpOwotCi0gICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gYWxsU1NUYWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oY2ZzLmdldExpdmVTU1RhYmxlcygpKTsKLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IGFsbFNTVGFibGVzLnN1Ykxpc3QoMCwgNCk7Ci0gICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gY29tcGFjdGluZyA9IGFsbFNTVGFibGVzLnN1Ykxpc3QoNCwgOCk7Ci0KLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcykKLSAgICAgICAgICAgIHNzdGFibGUub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcigxMDAuMCwgMTAwLjApKTsKLQotICAgICAgICBmaW5hbCBsb25nIHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgPSBzc3RhYmxlcy5nZXQoMCkuZ2V0SW5kZXhTdW1tYXJ5T2ZmSGVhcFNpemUoKTsKLQotICAgICAgICAvLyBldmVyeXRoaW5nIHNob3VsZCBnZXQgY3V0IGluIGhhbGYKLSAgICAgICAgZmluYWwgQXRvbWljUmVmZXJlbmNlPENvbXBhY3Rpb25JbnRlcnJ1cHRlZEV4Y2VwdGlvbj4gZXhjZXB0aW9uID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7Ci0gICAgICAgIC8vIGJhcnJpZXIgdG8gY29udHJvbCB3aGVuIHJlZGlzdHJpYnV0aW9uIHJ1bnMKLSAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggYmFycmllciA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKLSAgICAgICAgQ29tcGFjdGlvbkluZm8uSG9sZGVyIG9uZ29pbmdDb21wYWN0aW9uID0gbmV3IENvbXBhY3Rpb25JbmZvLkhvbGRlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBDb21wYWN0aW9uSW5mbyBnZXRDb21wYWN0aW9uSW5mbygpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wYWN0aW9uSW5mbyhjZnMubWV0YWRhdGEoKSwgT3BlcmF0aW9uVHlwZS5VTktOT1dOLCAwLCAwLCBuZXh0VGltZVVVSUQoKSwgY29tcGFjdGluZyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gaWdub3JlZCA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KGNvbXBhY3RpbmcsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmFjdGl2ZS5iZWdpbkNvbXBhY3Rpb24ob25nb2luZ0NvbXBhY3Rpb24pOwotCi0gICAgICAgICAgICBUaHJlYWQgdCA9IE5hbWVkVGhyZWFkRmFjdG9yeS5jcmVhdGVBbm9ueW1vdXNUaHJlYWQobmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGxlYXZlIGVub3VnaCBzcGFjZSBmb3IgZXZlbiB0aGUgbWluaW1hbCBpbmRleCBzdW1tYXJpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhTdW1tYXJ5TWFuYWdlci5yZWRpc3RyaWJ1dGVTdW1tYXJpZXMobmV3IE9ic2VydmFibGVSZWRpc3RyaWJ1dGlvbihvZihjZnMubWV0YWRhdGEuaWQsIHR4biksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcnJpZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoQ29tcGFjdGlvbkludGVycnVwdGVkRXhjZXB0aW9uIGV4KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24uc2V0KGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIHQuc3RhcnQoKTsKLSAgICAgICAgICAgIHdoaWxlIChDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5nZXRBY3RpdmVDb21wYWN0aW9ucygpIDwgMiAmJiB0LmlzQWxpdmUoKSkKLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMSk7Ci0gICAgICAgICAgICAvLyB0byBlbnN1cmUgdGhhdCB0aGUgc3RvcCBjb25kaXRpb24gY2hlY2sgaW4gSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb246OnJlZGlzdHJpYnV0ZVN1bW1hcmllcwotICAgICAgICAgICAgLy8gaXMgbWFkZSAqYWZ0ZXIqIHRoZSBoYWx0IHJlcXVlc3QgaXMgbWFkZSB0byB0aGUgQ29tcGFjdGlvbk1hbmFnZXIsIGRvbid0IGFsbG93IHRoZSByZWRpc3RyaWJ1dGlvbgotICAgICAgICAgICAgLy8gdG8gcHJvY2VlZCB1bnRpbCBzdG9wQ29tcGFjdGlvbiBoYXMgYmVlbiBjYWxsZWQuCi0gICAgICAgICAgICBjYW5jZWxGdW5jdGlvbi5hY2NlcHQoY2ZzKTsKLSAgICAgICAgICAgIC8vIGFsbG93cyB0aGUgcmVkaXN0cmlidXRpb24gdG8gcHJvY2VlZAotICAgICAgICAgICAgYmFycmllci5jb3VudERvd24oKTsKLSAgICAgICAgICAgIHQuam9pbigpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmZpbmlzaENvbXBhY3Rpb24ob25nb2luZ0NvbXBhY3Rpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRXhwZWN0ZWQgY29tcGFjdGlvbiBpbnRlcnJ1cHRlZCBleGNlcHRpb24iLCBleGNlcHRpb24uZ2V0KCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBubyBhY3RpdmUgY29tcGFjdGlvbnMiLCBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuZ2V0Q29tcGFjdGlvbnMoKS5pc0VtcHR5KCkpOwotCi0gICAgICAgIFNldDxTU1RhYmxlUmVhZGVyPiBiZWZvcmVSZWRpc3RyaWJ1dGlvblNTVGFibGVzID0gbmV3IEhhc2hTZXQ8PihhbGxTU1RhYmxlcyk7Ci0gICAgICAgIFNldDxTU1RhYmxlUmVhZGVyPiBhZnRlckNhbmNlbFNTVGFibGVzID0gbmV3IEhhc2hTZXQ8PihjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpOwotICAgICAgICBTZXQ8U1NUYWJsZVJlYWRlcj4gZGlzam9pbnQgPSBTZXRzLnN5bW1ldHJpY0RpZmZlcmVuY2UoYmVmb3JlUmVkaXN0cmlidXRpb25TU1RhYmxlcywgYWZ0ZXJDYW5jZWxTU1RhYmxlcyk7Ci0gICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiTWlzbWF0Y2hlZCBmaWxlcyBiZWZvcmUgYW5kIGFmdGVyIGNhbmNlbGxpbmcgcmVkaXN0cmlidXRpb246ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaW5lci5vbigiLCIpLmpvaW4oZGlzam9pbnQpKSwKLSAgICAgICAgICAgICAgICAgICBkaXNqb2ludC5pc0VtcHR5KCkpOwotICAgICAgICBhc3NlcnRPbkRpc2tTdGF0ZShjZnMsIDgpOwotICAgICAgICB2YWxpZGF0ZURhdGEoY2ZzLCBudW1Sb3dzKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXVzZUluZGV4U3VtbWFyeU1hbmFnZXIoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcga3NuYW1lID0gS0VZU1BBQ0UxOwotICAgICAgICBTdHJpbmcgY2ZuYW1lID0gQ0ZfU1RBTkRBUkRMT1dpSU5URVJWQUw7IC8vIGluZGV4IGludGVydmFsIG9mIDgsIG5vIGtleSBjYWNoaW5nCi0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc25hbWUpOwotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZm5hbWUpOwotICAgICAgICBpbnQgbnVtU1NUYWJsZXMgPSA0OwotICAgICAgICBpbnQgbnVtUm93cyA9IDI1NjsKLSAgICAgICAgY3JlYXRlU1NUYWJsZXMoa3NuYW1lLCBjZm5hbWUsIG51bVNTVGFibGVzLCBudW1Sb3dzKTsKLQotICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IHNzdGFibGVzID0gbmV3IEFycmF5TGlzdDw+KGNmcy5nZXRMaXZlU1NUYWJsZXMoKSk7Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCi0gICAgICAgICAgICBzc3RhYmxlLm92ZXJyaWRlUmVhZE1ldGVyKG5ldyBSZXN0b3JhYmxlTWV0ZXIoMTAwLjAsIDEwMC4wKSk7Ci0KLSAgICAgICAgbG9uZyBzaW5nbGVTdW1tYXJ5T2ZmSGVhcFNwYWNlID0gc3N0YWJsZXMuZ2V0KDApLmdldEluZGV4U3VtbWFyeU9mZkhlYXBTaXplKCk7Ci0KLSAgICAgICAgLy8gZXZlcnl0aGluZyBzaG91bGQgZ2V0IGN1dCBpbiBoYWxmCi0gICAgICAgIGFzc2VydCBzc3RhYmxlcy5zaXplKCkgPT0gbnVtU1NUYWJsZXM7Ci0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeSAoQXV0b0Nsb3NlYWJsZSB0b3Jlc3VtZSA9IENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLnBhdXNlR2xvYmFsQ29tcGFjdGlvbigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNzdGFibGVzID0gcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBvZihjZnMubWV0YWRhdGEoKS5pZCwgdHhuKSwgKHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgKiAobnVtU1NUYWJsZXMgLyAyKSkpOwotICAgICAgICAgICAgICAgIGZhaWwoIlRoZSByZWRpc3RyaWJ1dGlvbiBzaG91bGQgZmFpbCAtIHdlIGdvdCBwYXVzZWQgYmVmb3JlIGFkZGluZyB0byBhY3RpdmUgY29tcGFjdGlvbnMsIGJ1dCBhZnRlciBtYXJraW5nIGNvbXBhY3RpbmciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ29tcGFjdGlvbkludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICAgIH0KLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcykKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeVNhbXBsaW5nTGV2ZWwoKSk7Ci0gICAgICAgIHZhbGlkYXRlRGF0YShjZnMsIG51bVJvd3MpOwotICAgICAgICBhc3NlcnRPbkRpc2tTdGF0ZShjZnMsIG51bVNTVGFibGVzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFNTVGFibGVSZWFkZXI+IHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhMaXN0PFNTVGFibGVSZWFkZXI+IGNvbXBhY3RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFRhYmxlSWQsIExpZmVjeWNsZVRyYW5zYWN0aW9uPiB0cmFuc2FjdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBtZW1vcnlQb29sQnl0ZXMpCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBsb25nIG5vblJlZGlzdHJpYnV0aW5nT2ZmSGVhcFNpemUgPSBjb21wYWN0aW5nLnN0cmVhbSgpLm1hcFRvTG9uZyhTU1RhYmxlUmVhZGVyOjpnZXRJbmRleFN1bW1hcnlPZmZIZWFwU2l6ZSkuc3VtKCk7Ci0gICAgICAgIHJldHVybiBJbmRleFN1bW1hcnlNYW5hZ2VyLnJlZGlzdHJpYnV0ZVN1bW1hcmllcyhuZXcgSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24odHJhbnNhY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vblJlZGlzdHJpYnV0aW5nT2ZmSGVhcFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5UG9vbEJ5dGVzKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgT2JzZXJ2YWJsZVJlZGlzdHJpYnV0aW9uIGV4dGVuZHMgSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24KLSAgICB7Ci0gICAgICAgIENvdW50RG93bkxhdGNoIGJhcnJpZXI7Ci0KLSAgICAgICAgT2JzZXJ2YWJsZVJlZGlzdHJpYnV0aW9uKE1hcDxUYWJsZUlkLCBMaWZlY3ljbGVUcmFuc2FjdGlvbj4gdHJhbnNhY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBub25SZWRpc3RyaWJ1dGluZ09mZkhlYXBTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBtZW1vcnlQb29sQnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudERvd25MYXRjaCBiYXJyaWVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcih0cmFuc2FjdGlvbnMsIG5vblJlZGlzdHJpYnV0aW5nT2ZmSGVhcFNpemUsIG1lbW9yeVBvb2xCeXRlcyk7Ci0gICAgICAgICAgICB0aGlzLmJhcnJpZXIgPSBiYXJyaWVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIExpc3Q8U1NUYWJsZVJlYWRlcj4gcmVkaXN0cmlidXRlU3VtbWFyaWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJhcnJpZXIuYXdhaXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcnJ1cHRlZCB3YWl0aW5nIG9uIHRlc3QgYmFycmllciIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlZGlzdHJpYnV0ZVN1bW1hcmllcygpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdlNGQ0ZS4uMDAwMDAwMAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwotCi1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd1VwZGF0ZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5SZXN0b3JhYmxlTWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5TdG9yYWdlTWV0cmljczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ2FjaGluZ1BhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYVRlc3RVdGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotCi1wdWJsaWMgY2xhc3MgSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb25UZXN0Ci17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFMSA9ICJJbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvblRlc3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9TVEFOREFSRCA9ICJTdGFuZGFyZCI7Ci0KLSAgICBAQmVmb3JlQ2xhc3MKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFNjaGVtYUxvYWRlci5wcmVwYXJlU2VydmVyKCk7Ci0gICAgICAgIFNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZShLRVlTUEFDRTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWluSW5kZXhJbnRlcnZhbCg4KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heEluZGV4SW50ZXJ2YWwoMjU2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhY2hpbmcoQ2FjaGluZ1BhcmFtcy5DQUNIRV9OT1RISU5HKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0cmljc0xvYWRBZnRlclJlZGlzdHJpYnV0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcga3NuYW1lID0gS0VZU1BBQ0UxOwotICAgICAgICBTdHJpbmcgY2ZuYW1lID0gQ0ZfU1RBTkRBUkQ7Ci0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc25hbWUpOwotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZm5hbWUpOwotICAgICAgICBpbnQgbnVtU1NUYWJsZXMgPSAxOwotICAgICAgICBpbnQgbnVtUm93cyA9IDEwMjQgKiAxMDsKLSAgICAgICAgbG9uZyBsb2FkID0gU3RvcmFnZU1ldHJpY3MubG9hZC5nZXRDb3VudCgpOwotICAgICAgICBTdG9yYWdlTWV0cmljcy5sb2FkLmRlYyhsb2FkKTsgLy8gcmVzZXQgdGhlIGxvYWQgbWV0cmljCi0gICAgICAgIGNyZWF0ZVNTVGFibGVzKGtzbmFtZSwgY2ZuYW1lLCBudW1TU1RhYmxlcywgbnVtUm93cyk7Ci0KLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PihjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzKQotICAgICAgICAgICAgc3N0YWJsZS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKDEwMC4wLCAxMDAuMCkpOwotCi0gICAgICAgIGxvbmcgb2xkU2l6ZSA9IDA7Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjZnMubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbCwgc3N0YWJsZS5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCksIDAuMDAxKTsKLSAgICAgICAgICAgIG9sZFNpemUgKz0gc3N0YWJsZS5ieXRlc09uRGlzaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9hZCA9IFN0b3JhZ2VNZXRyaWNzLmxvYWQuZ2V0Q291bnQoKTsKLSAgICAgICAgbG9uZyBvdGhlcnMgPSBsb2FkIC0gb2xkU2l6ZTsgLy8gT3RoZXIgU1NUYWJsZXMgc2l6ZSwgZS5nLiBzY2hlbWEgYW5kIG90aGVyIHN5c3RlbSBTU1RhYmxlcwotCi0gICAgICAgIGludCBvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwgPSBjZnMubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbDsKLSAgICAgICAgLy8gZG91YmxlIHRoZSBtaW5faW5kZXhfaW50ZXJ2YWwKLSAgICAgICAgU2NoZW1hVGVzdFV0aWwuYW5ub3VuY2VUYWJsZVVwZGF0ZShjZnMubWV0YWRhdGEoKS51bmJ1aWxkKCkubWluSW5kZXhJbnRlcnZhbChvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwgKiAyKS5idWlsZCgpKTsKLSAgICAgICAgSW5kZXhTdW1tYXJ5TWFuYWdlci5pbnN0YW5jZS5yZWRpc3RyaWJ1dGVTdW1tYXJpZXMoKTsKLQotICAgICAgICBsb25nIG5ld1NpemUgPSAwOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGNmcy5nZXRMaXZlU1NUYWJsZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsLCBzc3RhYmxlLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKSwgMC4wMDEpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bVJvd3MgLyBjZnMubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbCwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTaXplKCkpOwotICAgICAgICAgICAgbmV3U2l6ZSArPSBzc3RhYmxlLmJ5dGVzT25EaXNrKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbmV3U2l6ZSArPSBvdGhlcnM7Ci0gICAgICAgIGxvYWQgPSBTdG9yYWdlTWV0cmljcy5sb2FkLmdldENvdW50KCk7Ci0KLSAgICAgICAgLy8gbmV3IHNpemUgd2UgY2FsY3VsYXRlIHNob3VsZCBiZSBhbG1vc3QgdGhlIHNhbWUgYXMgdGhlIGxvYWQgaW4gbWV0cmljcwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3U2l6ZSwgbG9hZCwgbmV3U2l6ZSAvIDEwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlU1NUYWJsZXMoU3RyaW5nIGtzbmFtZSwgU3RyaW5nIGNmbmFtZSwgaW50IG51bVNTVGFibGVzLCBpbnQgbnVtUm93cykKLSAgICB7Ci0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc25hbWUpOwotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZm5hbWUpOwotICAgICAgICBjZnMudHJ1bmNhdGVCbG9ja2luZygpOwotICAgICAgICBjZnMuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0KLSAgICAgICAgQXJyYXlMaXN0PEZ1dHVyZT4gZnV0dXJlcyA9IG5ldyBBcnJheUxpc3Q8PihudW1TU1RhYmxlcyk7Ci0gICAgICAgIEJ5dGVCdWZmZXIgdmFsdWUgPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbMTAwXSk7Ci0gICAgICAgIGZvciAoaW50IHNzdGFibGUgPSAwOyBzc3RhYmxlIDwgbnVtU1NUYWJsZXM7IHNzdGFibGUrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbnVtUm93czsgcm93KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IFN0cmluZy5mb3JtYXQoIiUzZCIsIHJvdyk7Ci0gICAgICAgICAgICAgICAgbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoY2ZzLm1ldGFkYXRhKCksIDAsIGtleSkKLSAgICAgICAgICAgICAgICAuY2x1c3RlcmluZygiY29sdW1uIikKLSAgICAgICAgICAgICAgICAuYWRkKCJ2YWwiLCB2YWx1ZSkKLSAgICAgICAgICAgICAgICAuYnVpbGQoKQotICAgICAgICAgICAgICAgIC5hcHBseVVuc2FmZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnV0dXJlcy5hZGQoY2ZzLmZvcmNlRmx1c2goQ29sdW1uRmFtaWx5U3RvcmUuRmx1c2hSZWFzb24uVU5JVF9URVNUUykpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoRnV0dXJlIGZ1dHVyZSA6IGZ1dHVyZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZ1dHVyZS5nZXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB8IEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhudW1TU1RhYmxlcywgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSW5kZXhTdW1tYXJ5VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSW5kZXhTdW1tYXJ5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDY4MGY4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0luZGV4U3VtbWFyeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQuQXNzdW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZG9tUGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRCdWZmZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkluZGV4U3VtbWFyeUJ1aWxkZXIuZG93bnNhbXBsZTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JbmRleFN1bW1hcnlCdWlsZGVyLmVudHJpZXNBdFNhbXBsaW5nTGV2ZWw7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRG93bnNhbXBsaW5nLkJBU0VfU0FNUExJTkdfTEVWRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotCi1wdWJsaWMgY2xhc3MgSW5kZXhTdW1tYXJ5VGVzdAotewotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7Ci0KLSAgICBAQmVmb3JlQ2xhc3MKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdEREKCkKLSAgICB7Ci0gICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOwotCi0gICAgICAgIGZpbmFsIGxvbmcgc2VlZCA9IG5hbm9UaW1lKCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgc2VlZDogIiArIHNlZWQpOwotICAgICAgICByYW5kb20uc2V0U2VlZChzZWVkKTsKLSAgICB9Ci0KLSAgICBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSBVdGlsLnRlc3RQYXJ0aXRpb25lcigpOwotCi0gICAgQEJlZm9yZUNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIGxvbmcgc2VlZCA9IG5hbm9UaW1lKCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgc2VlZDogIiArIHNlZWQpOwotICAgICAgICByYW5kb20uc2V0U2VlZChzZWVkKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRleFN1bW1hcnlLZXlTaXplcygpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gT24gQ2lyY2xlIENJIHdlIG5vcm1hbGx5IGRvbid0IGhhdmUgZW5vdWdoIG9mZi1oZWFwIG1lbW9yeSBmb3IgdGhpcyB0ZXN0IHNvIGlnbm9yZSBpdAotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShTeXN0ZW0uZ2V0ZW52KCJDSVJDTEVDSSIpID09IG51bGwpOwotCi0gICAgICAgIHRlc3RJbmRleFN1bW1hcnlQcm9wZXJ0aWVzKDMyLCAxMDApOwotICAgICAgICB0ZXN0SW5kZXhTdW1tYXJ5UHJvcGVydGllcyg2NCwgMTAwKTsKLSAgICAgICAgdGVzdEluZGV4U3VtbWFyeVByb3BlcnRpZXMoMTAwLCAxMDApOwotICAgICAgICB0ZXN0SW5kZXhTdW1tYXJ5UHJvcGVydGllcygxMDAwLCAxMDApOwotICAgICAgICB0ZXN0SW5kZXhTdW1tYXJ5UHJvcGVydGllcygxMDAwMCwgMTAwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEluZGV4U3VtbWFyeVByb3BlcnRpZXMoaW50IGtleVNpemUsIGludCBudW1LZXlzKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIGludCBtaW5JbmRleEludGVydmFsID0gMTsKLSAgICAgICAgZmluYWwgTGlzdDxEZWNvcmF0ZWRLZXk+IGtleXMgPSBuZXcgQXJyYXlMaXN0PD4obnVtS2V5cyk7Ci0KLSAgICAgICAgdHJ5IChJbmRleFN1bW1hcnlCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSW5kZXhTdW1tYXJ5QnVpbGRlcihudW1LZXlzLCBtaW5JbmRleEludGVydmFsLCBCQVNFX1NBTVBMSU5HX0xFVkVMKSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1LZXlzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIHJhbmRvbUJ5dGVzID0gbmV3IGJ5dGVba2V5U2l6ZV07Ci0gICAgICAgICAgICAgICAgcmFuZG9tLm5leHRCeXRlcyhyYW5kb21CeXRlcyk7Ci0gICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IHBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXIud3JhcChyYW5kb21CeXRlcykpOwotICAgICAgICAgICAgICAgIGtleXMuYWRkKGtleSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5tYXliZUFkZEVudHJ5KGtleSwgaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeShJbmRleFN1bW1hcnkgaW5kZXhTdW1tYXJ5ID0gYnVpbGRlci5idWlsZChwYXJ0aXRpb25lcikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bUtleXMsIGtleXMuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobWluSW5kZXhJbnRlcnZhbCwgaW5kZXhTdW1tYXJ5LmdldE1pbkluZGV4SW50ZXJ2YWwoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bUtleXMsIGluZGV4U3VtbWFyeS5nZXRNYXhOdW1iZXJPZkVudHJpZXMoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bUtleXMgKyAxLCBpbmRleFN1bW1hcnkuZ2V0RXN0aW1hdGVkS2V5Q291bnQoKSk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUtleXM7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGtleXMuZ2V0KGkpLmdldEtleSgpLCBCeXRlQnVmZmVyLndyYXAoaW5kZXhTdW1tYXJ5LmdldEtleShpKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBhbiBpbmRleCBzdW1tYXJ5IHdob3NlIHRvdGFsIHNpemUgaXMgYmlnZ2VyIHRoYW4gMkdpQiwKLSAgICAgKiB0aGUgaW5kZXggc3VtbWFyeSBidWlsZGVyIHNob3VsZCBsb2cgYW4gZXJyb3IgYnV0IGl0IHNob3VsZCBzdGlsbAotICAgICAqIGNyZWF0ZSBhbiBpbmRleCBzdW1tYXJ5LCBhbGJlaXQgb25lIHRoYXQgZG9lcyBub3QgY292ZXIgdGhlIGVudGlyZSBzc3RhYmxlLgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdExhcmdlSW5kZXhTdW1tYXJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBPbiBDaXJjbGUgQ0kgd2Ugbm9ybWFsbHkgZG9uJ3QgaGF2ZSBlbm91Z2ggb2ZmLWhlYXAgbWVtb3J5IGZvciB0aGlzIHRlc3Qgc28gaWdub3JlIGl0Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKFN5c3RlbS5nZXRlbnYoIkNJUkNMRUNJIikgPT0gbnVsbCk7Ci0KLSAgICAgICAgZmluYWwgaW50IG51bUtleXMgPSAxMDAwMDAwOwotICAgICAgICBmaW5hbCBpbnQga2V5U2l6ZSA9IDMwMDA7Ci0gICAgICAgIGZpbmFsIGludCBtaW5JbmRleEludGVydmFsID0gMTsKLQotICAgICAgICB0cnkgKEluZGV4U3VtbWFyeUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBJbmRleFN1bW1hcnlCdWlsZGVyKG51bUtleXMsIG1pbkluZGV4SW50ZXJ2YWwsIEJBU0VfU0FNUExJTkdfTEVWRUwpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUtleXM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBieXRlW10gcmFuZG9tQnl0ZXMgPSBuZXcgYnl0ZVtrZXlTaXplXTsKLSAgICAgICAgICAgICAgICByYW5kb20ubmV4dEJ5dGVzKHJhbmRvbUJ5dGVzKTsKLSAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlci53cmFwKHJhbmRvbUJ5dGVzKSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5tYXliZUFkZEVudHJ5KGtleSwgaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSAoSW5kZXhTdW1tYXJ5IGluZGV4U3VtbWFyeSA9IGJ1aWxkZXIuYnVpbGQocGFydGl0aW9uZXIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaW5kZXhTdW1tYXJ5KTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVtS2V5cywgaW5kZXhTdW1tYXJ5LmdldE1heE51bWJlck9mRW50cmllcygpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVtS2V5cyArIDEsIGluZGV4U3VtbWFyeS5nZXRFc3RpbWF0ZWRLZXlDb3VudCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgYW4gaW5kZXggc3VtbWFyeSB3aG9zZSB0b3RhbCBzaXplIGlzIGJpZ2dlciB0aGFuIDJHaUIsCi0gICAgICogaGF2aW5nIHVwZGF0ZWQgSW5kZXhTdW1tYXJ5QnVpbGRlci5kZWZhdWx0RXhwZWN0ZWRLZXlTaXplIHRvIG1hdGNoIHRoZSBzaXplLAotICAgICAqIHRoZSBpbmRleCBzdW1tYXJ5IHNob3VsZCBiZSBkb3duc2FtcGxlZCBhdXRvbWF0aWNhbGx5LgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdExhcmdlSW5kZXhTdW1tYXJ5V2l0aEV4cGVjdGVkU2l6ZU1hdGNoaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBPbiBDaXJjbGUgQ0kgd2Ugbm9ybWFsbHkgZG9uJ3QgaGF2ZSBlbm91Z2ggb2ZmLWhlYXAgbWVtb3J5IGZvciB0aGlzIHRlc3Qgc28gaWdub3JlIGl0Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKFN5c3RlbS5nZXRlbnYoIkNJUkNMRUNJIikgPT0gbnVsbCk7Ci0KLSAgICAgICAgZmluYWwgaW50IG51bUtleXMgPSAxMDAwMDAwOwotICAgICAgICBmaW5hbCBpbnQga2V5U2l6ZSA9IDMwMDA7Ci0gICAgICAgIGZpbmFsIGludCBtaW5JbmRleEludGVydmFsID0gMTsKLQotICAgICAgICBsb25nIG9sZEV4cGVjdGVkS2V5U2l6ZSA9IEluZGV4U3VtbWFyeUJ1aWxkZXIuZGVmYXVsdEV4cGVjdGVkS2V5U2l6ZTsKLSAgICAgICAgSW5kZXhTdW1tYXJ5QnVpbGRlci5kZWZhdWx0RXhwZWN0ZWRLZXlTaXplID0gMzAwMDsKLQotICAgICAgICB0cnkgKEluZGV4U3VtbWFyeUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBJbmRleFN1bW1hcnlCdWlsZGVyKG51bUtleXMsIG1pbkluZGV4SW50ZXJ2YWwsIEJBU0VfU0FNUExJTkdfTEVWRUwpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUtleXM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBieXRlW10gcmFuZG9tQnl0ZXMgPSBuZXcgYnl0ZVtrZXlTaXplXTsKLSAgICAgICAgICAgICAgICByYW5kb20ubmV4dEJ5dGVzKHJhbmRvbUJ5dGVzKTsKLSAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlci53cmFwKHJhbmRvbUJ5dGVzKSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5tYXliZUFkZEVudHJ5KGtleSwgaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSAoSW5kZXhTdW1tYXJ5IGluZGV4U3VtbWFyeSA9IGJ1aWxkZXIuYnVpbGQocGFydGl0aW9uZXIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaW5kZXhTdW1tYXJ5KTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobWluSW5kZXhJbnRlcnZhbCAqIDIsIGluZGV4U3VtbWFyeS5nZXRNaW5JbmRleEludGVydmFsKCkpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1LZXlzIC8gMiwgaW5kZXhTdW1tYXJ5LmdldE1heE51bWJlck9mRW50cmllcygpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVtS2V5cyArIDIsIGluZGV4U3VtbWFyeS5nZXRFc3RpbWF0ZWRLZXlDb3VudCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEluZGV4U3VtbWFyeUJ1aWxkZXIuZGVmYXVsdEV4cGVjdGVkS2V5U2l6ZSA9IG9sZEV4cGVjdGVkS2V5U2l6ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldEtleSgpCi0gICAgewotICAgICAgICBQYWlyPExpc3Q8RGVjb3JhdGVkS2V5PiwgSW5kZXhTdW1tYXJ5PiByYW5kb20gPSBnZW5lcmF0ZVJhbmRvbUluZGV4KDEwMCwgMSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmFuZG9tLmxlZnQuZ2V0KGkpLmdldEtleSgpLCBCeXRlQnVmZmVyLndyYXAocmFuZG9tLnJpZ2h0LmdldEtleShpKSkpOwotICAgICAgICByYW5kb20ucmlnaHQuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RCaW5hcnlTZWFyY2goKQotICAgIHsKLSAgICAgICAgUGFpcjxMaXN0PERlY29yYXRlZEtleT4sIEluZGV4U3VtbWFyeT4gcmFuZG9tID0gZ2VuZXJhdGVSYW5kb21JbmRleCgxMDAsIDEpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIHJhbmRvbS5yaWdodC5iaW5hcnlTZWFyY2gocmFuZG9tLmxlZnQuZ2V0KGkpKSk7Ci0gICAgICAgIHJhbmRvbS5yaWdodC5jbG9zZSgpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldFBvc2l0aW9uKCkKLSAgICB7Ci0gICAgICAgIFBhaXI8TGlzdDxEZWNvcmF0ZWRLZXk+LCBJbmRleFN1bW1hcnk+IHJhbmRvbSA9IGdlbmVyYXRlUmFuZG9tSW5kZXgoMTAwLCAyKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDsgaSsrKQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGkqMiwgcmFuZG9tLnJpZ2h0LmdldFBvc2l0aW9uKGkpKTsKLSAgICAgICAgcmFuZG9tLnJpZ2h0LmNsb3NlKCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUGFpcjxMaXN0PERlY29yYXRlZEtleT4sIEluZGV4U3VtbWFyeT4gcmFuZG9tID0gZ2VuZXJhdGVSYW5kb21JbmRleCgxMDAsIDEpOwotICAgICAgICBEYXRhT3V0cHV0QnVmZmVyIGRvcyA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKCk7Ci0gICAgICAgIEluZGV4U3VtbWFyeS5zZXJpYWxpemVyLnNlcmlhbGl6ZShyYW5kb20ucmlnaHQsIGRvcyk7Ci0gICAgICAgIC8vIHdyaXRlIGp1bmsKLSAgICAgICAgZG9zLndyaXRlVVRGKCJKVU5LIik7Ci0gICAgICAgIGRvcy53cml0ZVVURigiSlVOSyIpOwotICAgICAgICBGaWxlVXRpbHMuY2xvc2VRdWlldGx5KGRvcyk7Ci0gICAgICAgIERhdGFJbnB1dFN0cmVhbSBkaXMgPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkb3MudG9CeXRlQXJyYXkoKSkpOwotICAgICAgICBJbmRleFN1bW1hcnkgaXMgPSBJbmRleFN1bW1hcnkuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkaXMsIHBhcnRpdGlvbmVyLCAxLCAxKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCBpcy5iaW5hcnlTZWFyY2gocmFuZG9tLmxlZnQuZ2V0KGkpKSk7Ci0gICAgICAgIC8vIHJlYWQgdGhlIGp1bmsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGRpcy5yZWFkVVRGKCksICJKVU5LIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhkaXMucmVhZFVURigpLCAiSlVOSyIpOwotICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICBGaWxlVXRpbHMuY2xvc2VRdWlldGx5KGRpcyk7Ci0gICAgICAgIHJhbmRvbS5yaWdodC5jbG9zZSgpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEFkZEVtcHR5S2V5KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgSVBhcnRpdGlvbmVyIHAgPSBuZXcgUmFuZG9tUGFydGl0aW9uZXIoKTsKLSAgICAgICAgdHJ5IChJbmRleFN1bW1hcnlCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSW5kZXhTdW1tYXJ5QnVpbGRlcigxLCAxLCBCQVNFX1NBTVBMSU5HX0xFVkVMKSkKLSAgICAgICAgewotICAgICAgICAgICAgYnVpbGRlci5tYXliZUFkZEVudHJ5KHAuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwuRU1QVFlfQllURV9CVUZGRVIpLCAwKTsKLSAgICAgICAgICAgIEluZGV4U3VtbWFyeSBzdW1tYXJ5ID0gYnVpbGRlci5idWlsZChwKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBzdW1tYXJ5LnNpemUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3VtbWFyeS5nZXRQb3NpdGlvbigwKSk7Ci0gICAgICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhuZXcgYnl0ZVswXSwgc3VtbWFyeS5nZXRLZXkoMCkpOwotCi0gICAgICAgICAgICBEYXRhT3V0cHV0QnVmZmVyIGRvcyA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKCk7Ci0gICAgICAgICAgICBJbmRleFN1bW1hcnkuc2VyaWFsaXplci5zZXJpYWxpemUoc3VtbWFyeSwgZG9zKTsKLSAgICAgICAgICAgIERhdGFJbnB1dFN0cmVhbSBkaXMgPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkb3MudG9CeXRlQXJyYXkoKSkpOwotICAgICAgICAgICAgSW5kZXhTdW1tYXJ5IGxvYWRlZCA9IEluZGV4U3VtbWFyeS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGRpcywgcCwgMSwgMSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBsb2FkZWQuc2l6ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzdW1tYXJ5LmdldFBvc2l0aW9uKDApLCBsb2FkZWQuZ2V0UG9zaXRpb24oMCkpOwotICAgICAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoc3VtbWFyeS5nZXRLZXkoMCksIHN1bW1hcnkuZ2V0S2V5KDApKTsKLSAgICAgICAgICAgIHN1bW1hcnkuY2xvc2UoKTsKLSAgICAgICAgICAgIGxvYWRlZC5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQYWlyPExpc3Q8RGVjb3JhdGVkS2V5PiwgSW5kZXhTdW1tYXJ5PiBnZW5lcmF0ZVJhbmRvbUluZGV4KGludCBzaXplLCBpbnQgaW50ZXJ2YWwpCi0gICAgewotICAgICAgICBMaXN0PERlY29yYXRlZEtleT4gbGlzdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOwotICAgICAgICB0cnkgKEluZGV4U3VtbWFyeUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBJbmRleFN1bW1hcnlCdWlsZGVyKGxpc3Quc2l6ZSgpLCBpbnRlcnZhbCwgQkFTRV9TQU1QTElOR19MRVZFTCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFVVSUQgdXVpZCA9IFVVSUQucmFuZG9tVVVJRCgpOwotICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBwYXJ0aXRpb25lci5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5ieXRlcyh1dWlkKSk7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoa2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobGlzdCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgICAgICAgICBidWlsZGVyLm1heWJlQWRkRW50cnkobGlzdC5nZXQoaSksIGkpOwotICAgICAgICAgICAgSW5kZXhTdW1tYXJ5IHN1bW1hcnkgPSBidWlsZGVyLmJ1aWxkKHBhcnRpdGlvbmVyKTsKLSAgICAgICAgICAgIHJldHVybiBQYWlyLmNyZWF0ZShsaXN0LCBzdW1tYXJ5KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REb3duc2FtcGxlUGF0dGVybnMoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoMCksIERvd25zYW1wbGluZy5nZXRTYW1wbGluZ1BhdHRlcm4oMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgwKSwgRG93bnNhbXBsaW5nLmdldFNhbXBsaW5nUGF0dGVybigxKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoMSwgMCksIERvd25zYW1wbGluZy5nZXRTYW1wbGluZ1BhdHRlcm4oMikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgzLCAxLCAyLCAwKSwgRG93bnNhbXBsaW5nLmdldFNhbXBsaW5nUGF0dGVybig0KSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KDcsIDMsIDUsIDEsIDYsIDIsIDQsIDApLCBEb3duc2FtcGxpbmcuZ2V0U2FtcGxpbmdQYXR0ZXJuKDgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoMTUsIDcsIDExLCAzLCAxMywgNSwgOSwgMSwgMTQsIDYsIDEwLCAyLCAxMiwgNCwgOCwgMCksIERvd25zYW1wbGluZy5nZXRTYW1wbGluZ1BhdHRlcm4oMTYpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNob3VsZFNraXAoaW50IGluZGV4LCBMaXN0PEludGVnZXI+IHN0YXJ0UG9pbnRzKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgc3RhcnQgOiBzdGFydFBvaW50cykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChpbmRleCAtIHN0YXJ0KSAlIEJBU0VfU0FNUExJTkdfTEVWRUwgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG93bnNhbXBsZSgpCi0gICAgewotICAgICAgICBmaW5hbCBpbnQgTlVNX0tFWVMgPSA0MDk2OwotICAgICAgICBmaW5hbCBpbnQgSU5ERVhfSU5URVJWQUwgPSAxMjg7Ci0gICAgICAgIGZpbmFsIGludCBPUklHSU5BTF9OVU1fRU5UUklFUyA9IE5VTV9LRVlTIC8gSU5ERVhfSU5URVJWQUw7Ci0KLQotICAgICAgICBQYWlyPExpc3Q8RGVjb3JhdGVkS2V5PiwgSW5kZXhTdW1tYXJ5PiByYW5kb20gPSBnZW5lcmF0ZVJhbmRvbUluZGV4KE5VTV9LRVlTLCBJTkRFWF9JTlRFUlZBTCk7Ci0gICAgICAgIExpc3Q8RGVjb3JhdGVkS2V5PiBrZXlzID0gcmFuZG9tLmxlZnQ7Ci0gICAgICAgIEluZGV4U3VtbWFyeSBvcmlnaW5hbCA9IHJhbmRvbS5yaWdodDsKLQotICAgICAgICAvLyBzYW5pdHkgY2hlY2sgb24gdGhlIG9yaWdpbmFsIGluZGV4IHN1bW1hcnkKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBPUklHSU5BTF9OVU1fRU5UUklFUzsgaSsrKQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGtleXMuZ2V0KGkgKiBJTkRFWF9JTlRFUlZBTCkuZ2V0S2V5KCksIEJ5dGVCdWZmZXIud3JhcChvcmlnaW5hbC5nZXRLZXkoaSkpKTsKLQotICAgICAgICBMaXN0PEludGVnZXI+IHNhbXBsZVBhdHRlcm4gPSBEb3duc2FtcGxpbmcuZ2V0U2FtcGxpbmdQYXR0ZXJuKEJBU0VfU0FNUExJTkdfTEVWRUwpOwotCi0gICAgICAgIC8vIGRvd25zYW1wbGUgYnkgb25lIGxldmVsLCB0aGVuIHR3byBsZXZlbHMsIHRoZW4gdGhyZWUgbGV2ZWxzLi4uCi0gICAgICAgIGludCBkb3duc2FtcGxpbmdSb3VuZCA9IDE7Ci0gICAgICAgIGZvciAoaW50IHNhbXBsaW5nTGV2ZWwgPSBCQVNFX1NBTVBMSU5HX0xFVkVMIC0gMTsgc2FtcGxpbmdMZXZlbCA+PSAxOyBzYW1wbGluZ0xldmVsLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeSAoSW5kZXhTdW1tYXJ5IGRvd25zYW1wbGVkID0gZG93bnNhbXBsZShvcmlnaW5hbCwgc2FtcGxpbmdMZXZlbCwgMTI4LCBwYXJ0aXRpb25lcik7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhlbnRyaWVzQXRTYW1wbGluZ0xldmVsKHNhbXBsaW5nTGV2ZWwsIG9yaWdpbmFsLmdldE1heE51bWJlck9mRW50cmllcygpKSwgZG93bnNhbXBsZWQuc2l6ZSgpKTsKLQotICAgICAgICAgICAgICAgIGludCBzYW1wbGVkQ291bnQgPSAwOwotICAgICAgICAgICAgICAgIExpc3Q8SW50ZWdlcj4gc2tpcFN0YXJ0UG9pbnRzID0gc2FtcGxlUGF0dGVybi5zdWJMaXN0KDAsIGRvd25zYW1wbGluZ1JvdW5kKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE9SSUdJTkFMX05VTV9FTlRSSUVTOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3VsZFNraXAoaSwgc2tpcFN0YXJ0UG9pbnRzKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGtleXMuZ2V0KGkgKiBJTkRFWF9JTlRFUlZBTCkuZ2V0S2V5KCksIEJ5dGVCdWZmZXIud3JhcChkb3duc2FtcGxlZC5nZXRLZXkoc2FtcGxlZENvdW50KSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlZENvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0ZXN0UG9zaXRpb24ob3JpZ2luYWwsIGRvd25zYW1wbGVkLCBrZXlzKTsKLSAgICAgICAgICAgICAgICBkb3duc2FtcGxpbmdSb3VuZCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZG93bnNhbXBsZSBvbmUgbGV2ZWwgZWFjaCB0aW1lCi0gICAgICAgIEluZGV4U3VtbWFyeSBwcmV2aW91cyA9IG9yaWdpbmFsOwotICAgICAgICBkb3duc2FtcGxpbmdSb3VuZCA9IDE7Ci0gICAgICAgIGZvciAoaW50IGRvd25zYW1wbGVMZXZlbCA9IEJBU0VfU0FNUExJTkdfTEVWRUwgLSAxOyBkb3duc2FtcGxlTGV2ZWwgPj0gMTsgZG93bnNhbXBsZUxldmVsLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIEluZGV4U3VtbWFyeSBkb3duc2FtcGxlZCA9IGRvd25zYW1wbGUocHJldmlvdXMsIGRvd25zYW1wbGVMZXZlbCwgMTI4LCBwYXJ0aXRpb25lcik7Ci0gICAgICAgICAgICBpZiAocHJldmlvdXMgIT0gb3JpZ2luYWwpCi0gICAgICAgICAgICAgICAgcHJldmlvdXMuY2xvc2UoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhlbnRyaWVzQXRTYW1wbGluZ0xldmVsKGRvd25zYW1wbGVMZXZlbCwgb3JpZ2luYWwuZ2V0TWF4TnVtYmVyT2ZFbnRyaWVzKCkpLCBkb3duc2FtcGxlZC5zaXplKCkpOwotCi0gICAgICAgICAgICBpbnQgc2FtcGxlZENvdW50ID0gMDsKLSAgICAgICAgICAgIExpc3Q8SW50ZWdlcj4gc2tpcFN0YXJ0UG9pbnRzID0gc2FtcGxlUGF0dGVybi5zdWJMaXN0KDAsIGRvd25zYW1wbGluZ1JvdW5kKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgT1JJR0lOQUxfTlVNX0VOVFJJRVM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIXNob3VsZFNraXAoaSwgc2tpcFN0YXJ0UG9pbnRzKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhrZXlzLmdldChpICogSU5ERVhfSU5URVJWQUwpLmdldEtleSgpLCBCeXRlQnVmZmVyLndyYXAoZG93bnNhbXBsZWQuZ2V0S2V5KHNhbXBsZWRDb3VudCkpKTsKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlZENvdW50Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0ZXN0UG9zaXRpb24ob3JpZ2luYWwsIGRvd25zYW1wbGVkLCBrZXlzKTsKLSAgICAgICAgICAgIHByZXZpb3VzID0gZG93bnNhbXBsZWQ7Ci0gICAgICAgICAgICBkb3duc2FtcGxpbmdSb3VuZCsrOwotICAgICAgICB9Ci0gICAgICAgIHByZXZpb3VzLmNsb3NlKCk7Ci0gICAgICAgIG9yaWdpbmFsLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQb3NpdGlvbihJbmRleFN1bW1hcnkgb3JpZ2luYWwsIEluZGV4U3VtbWFyeSBkb3duc2FtcGxlZCwgTGlzdDxEZWNvcmF0ZWRLZXk+IGtleXMpCi0gICAgewotICAgICAgICBmb3IgKERlY29yYXRlZEtleSBrZXkgOiBrZXlzKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nIG9yaWcgPSBTU1RhYmxlUmVhZGVyLmdldEluZGV4U2NhblBvc2l0aW9uRnJvbUJpbmFyeVNlYXJjaFJlc3VsdChvcmlnaW5hbC5iaW5hcnlTZWFyY2goa2V5KSwgb3JpZ2luYWwpOwotICAgICAgICAgICAgaW50IGJpbmFyeVNlYXJjaCA9IGRvd25zYW1wbGVkLmJpbmFyeVNlYXJjaChrZXkpOwotICAgICAgICAgICAgaW50IGluZGV4ID0gU1NUYWJsZVJlYWRlci5nZXRJbmRleFN1bW1hcnlJbmRleEZyb21CaW5hcnlTZWFyY2hSZXN1bHQoYmluYXJ5U2VhcmNoKTsKLSAgICAgICAgICAgIGludCBzY2FuRnJvbSA9IChpbnQpIFNTVGFibGVSZWFkZXIuZ2V0SW5kZXhTY2FuUG9zaXRpb25Gcm9tQmluYXJ5U2VhcmNoUmVzdWx0KGluZGV4LCBkb3duc2FtcGxlZCk7Ci0gICAgICAgICAgICBhc3NlcnQgc2NhbkZyb20gPD0gb3JpZzsKLSAgICAgICAgICAgIGludCBlZmZlY3RpdmVJbnRlcnZhbCA9IGRvd25zYW1wbGVkLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWxBZnRlckluZGV4KGluZGV4KTsKLSAgICAgICAgICAgIERlY29yYXRlZEtleSBrID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgayAhPSBrZXkgJiYgaSA8IGVmZmVjdGl2ZUludGVydmFsICYmIHNjYW5Gcm9tIDwga2V5cy5zaXplKCkgOyBpKyssIHNjYW5Gcm9tICsrKQotICAgICAgICAgICAgICAgIGsgPSBrZXlzLmdldChzY2FuRnJvbSk7Ci0gICAgICAgICAgICBhc3NlcnQgayA9PSBrZXk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RPcmlnaW5hbEluZGV4TG9va3VwKCkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSBCQVNFX1NBTVBMSU5HX0xFVkVMOyBpID49IDE7IGktLSkKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCBEb3duc2FtcGxpbmcuZ2V0T3JpZ2luYWxJbmRleGVzKGkpLnNpemUoKSk7Ci0KLSAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IGZ1bGwgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCQVNFX1NBTVBMSU5HX0xFVkVMOyBpKyspCi0gICAgICAgICAgICBmdWxsLmFkZChpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoZnVsbCwgRG93bnNhbXBsaW5nLmdldE9yaWdpbmFsSW5kZXhlcyhCQVNFX1NBTVBMSU5HX0xFVkVMKSk7Ci0gICAgICAgIC8vIHRoZSBlbnRyeSBhdCBpbmRleCAxMjcgaXMgdGhlIGZpcnN0IHRvIGdvCi0gICAgICAgIGFzc2VydEVxdWFscyhmdWxsLnN1Ykxpc3QoMCwgZnVsbC5zaXplKCkgLSAxKSwgRG93bnNhbXBsaW5nLmdldE9yaWdpbmFsSW5kZXhlcyhCQVNFX1NBTVBMSU5HX0xFVkVMIC0gMSkpOwotCi0gICAgICAgIC8vIHNwb3QgY2hlY2sgYSBmZXcgdmFsdWVzICh0aGVzZSBkZXBlbmQgb24gQkFTRV9TQU1QTElOR19MRVZFTCBiZWluZyAxMjgpCi0gICAgICAgIGFzc2VydEVxdWFscygxMjgsIEJBU0VfU0FNUExJTkdfTEVWRUwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgwLCAzMiwgNjQsIDk2KSwgRG93bnNhbXBsaW5nLmdldE9yaWdpbmFsSW5kZXhlcyg0KSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KDAsIDY0KSwgRG93bnNhbXBsaW5nLmdldE9yaWdpbmFsSW5kZXhlcygyKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KDApLCBEb3duc2FtcGxpbmcuZ2V0T3JpZ2luYWxJbmRleGVzKDEpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROdW1iZXJPZlNraXBwZWRFbnRyaWVzQWZ0ZXJJbmRleCgpCi0gICAgewotICAgICAgICBpbnQgaW5kZXhJbnRlcnZhbCA9IDEyODsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCQVNFX1NBTVBMSU5HX0xFVkVMOyBpKyspCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoaW5kZXhJbnRlcnZhbCwgRG93bnNhbXBsaW5nLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWxBZnRlckluZGV4KGksIEJBU0VfU0FNUExJTkdfTEVWRUwsIGluZGV4SW50ZXJ2YWwpKTsKLQotICAgICAgICAvLyB3aXRoIG9uZSByb3VuZCBvZiBkb3duc2FtcGxpbmcsIG9ubHkgdGhlIGxhc3Qgc3VtbWFyeSBlbnRyeSBoYXMgYmVlbiByZW1vdmVkLCBzbyBvbmx5IHRoZSBsYXN0IGluZGV4IHdpbGwgaGF2ZQotICAgICAgICAvLyBkb3VibGUgdGhlIGdhcCB1bnRpbCB0aGUgbmV4dCBzYW1wbGUKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCQVNFX1NBTVBMSU5HX0xFVkVMIC0gMjsgaSsrKQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGluZGV4SW50ZXJ2YWwsIERvd25zYW1wbGluZy5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsQWZ0ZXJJbmRleChpLCBCQVNFX1NBTVBMSU5HX0xFVkVMIC0gMSwgaW5kZXhJbnRlcnZhbCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoaW5kZXhJbnRlcnZhbCAqIDIsIERvd25zYW1wbGluZy5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsQWZ0ZXJJbmRleChCQVNFX1NBTVBMSU5HX0xFVkVMIC0gMiwgQkFTRV9TQU1QTElOR19MRVZFTCAtIDEsIGluZGV4SW50ZXJ2YWwpKTsKLQotICAgICAgICAvLyBhdCBzYW1wbGluZ0xldmVsPTIsIHRoZSByZXRhaW5lZCBzdW1tYXJ5IHBvaW50cyBhcmUgWzAsIDY0XSAoYXNzdW1lcyBCQVNFX1NBTVBMSU5HX0xFVkVMIGlzIDEyOCkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEyOCwgQkFTRV9TQU1QTElOR19MRVZFTCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg2NCAqIGluZGV4SW50ZXJ2YWwsIERvd25zYW1wbGluZy5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsQWZ0ZXJJbmRleCgwLCAyLCBpbmRleEludGVydmFsKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg2NCAqIGluZGV4SW50ZXJ2YWwsIERvd25zYW1wbGluZy5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsQWZ0ZXJJbmRleCgxLCAyLCBpbmRleEludGVydmFsKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvTGVnYWN5U1NUYWJsZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0xlZ2FjeVNTVGFibGVUZXN0LmphdmEKaW5kZXggMDYzYWZlNS4uNDMyZTRiMCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvTGVnYWN5U1NUYWJsZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9MZWdhY3lTU1RhYmxlVGVzdC5qYXZhCkBAIC0xOSwyNCArMTksMTkgQEAKIAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwotaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUlucHV0U3RyZWFtUGx1czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVPdXRwdXRTdHJlYW1QbHVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCkBAIC00NiwzMSArNDEsMzYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlVudHlwZWRSZXN1bHRTZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2luZ2xlUGFydGl0aW9uU2xpY2VDb21tYW5kVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkFic3RyYWN0Q29tcGFjdGlvblRhc2s7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uTWFuYWdlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yZXBhaXIuUGVuZGluZ0FudGlDb21wYWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnN0cmVhbWluZy5DYXNzYW5kcmFPdXRnb2luZ0ZpbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2luZ2xlUGFydGl0aW9uU2xpY2VDb21tYW5kVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLlZlcmlmaWVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUmFuZ2VUb21ic3RvbmVNYXJrZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnN0cmVhbWluZy5DYXNzYW5kcmFPdXRnb2luZ0ZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUua2V5Y2FjaGUuS2V5Q2FjaGVTdXBwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVJbnB1dFN0cmVhbVBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlT3V0cHV0U3RyZWFtUGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNhY2hlU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5PdXRnb2luZ1N0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtUGxhbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtT3BlcmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1QbGFuOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk91dHB1dEhhbmRsZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiAKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbGxlY3Rpb25zLnNpbmdsZXRvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0xFR0FDWV9TU1RBQkxFX1JPT1Q7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQWN0aXZlUmVwYWlyU2VydmljZS5OT19QRU5ESU5HX1JFUEFJUjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5BY3RpdmVSZXBhaXJTZXJ2aWNlLlVOUkVQQUlSRURfU1NUQUJMRTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJRDsKQEAgLTg1LDggKzg1LDYgQEAKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTGVnYWN5U1NUYWJsZVRlc3QuY2xhc3MpOwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX1NTVEFCTEVfUFJPUCA9ICJsZWdhY3ktc3N0YWJsZS1yb290IjsKLQogICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBMRUdBQ1lfU1NUQUJMRV9ST09UOwogCiAgICAgLyoqCkBAIC05NCw3ICs5Miw3IEBACiAgICAgICogU2VlIHtAbGluayAjdGVzdEdlbmVyYXRlU3N0YWJsZXMoKX0gdG8gZ2VuZXJhdGUgc3N0YWJsZXMuCiAgICAgICogVGFrZSBjYXJlIG9uIGNvbW1pdCBhcyB5b3UgbmVlZCB0byBhZGQgdGhlIHNzdGFibGUgZmlsZXMgdXNpbmcge0Bjb2RlIGdpdCBhZGQgLWZ9CiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBsZWdhY3lWZXJzaW9ucyA9IHsibmIiLCAibmEiLCAibWUiLCAibWQiLCAibWMiLCAibWIiLCAibWEifTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGxlZ2FjeVZlcnNpb25zID0geyJkYSIsICJuYyIsICJuYiIsICJuYSIsICJtZSIsICJtZCIsICJtYyIsICJtYiIsICJtYSJ9OwogCiAgICAgLy8gMTIwMCBjaGFycwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgbG9uZ1N0cmluZyA9ICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IiArCkBAIC0xMTMsOCArMTExLDggQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIFN0cmluZyBzY3AgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoTEVHQUNZX1NTVEFCTEVfUFJPUCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJTeXN0ZW0gcHJvcGVydHkgIiArIExFR0FDWV9TU1RBQkxFX1BST1AgKyAiIG5vdCBzZXQiLCBzY3ApOworICAgICAgICBTdHJpbmcgc2NwID0gVEVTVF9MRUdBQ1lfU1NUQUJMRV9ST09ULmdldFN0cmluZygpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiU3lzdGVtIHByb3BlcnR5ICIgKyBURVNUX0xFR0FDWV9TU1RBQkxFX1JPT1QuZ2V0S2V5KCkgKyAiIG5vdCBzZXQiLCBzY3ApOwogCiAgICAgICAgIExFR0FDWV9TU1RBQkxFX1JPT1QgPSBuZXcgRmlsZShzY3ApLnRvQWJzb2x1dGUoKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlN5c3RlbSBwcm9wZXJ0eSAiICsgTEVHQUNZX1NTVEFCTEVfUk9PVCArICIgZG9lcyBub3Qgc3BlY2lmeSBhIGRpcmVjdG9yeSIsIExFR0FDWV9TU1RBQkxFX1JPT1QuaXNEaXJlY3RvcnkoKSk7CkBAIC0xNDQsOCArMTQyLDkgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKFN0cmluZyBsZWdhY3lWZXJzaW9uLCBTdHJpbmcgdGFibGUpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgUGF0aCBmaWxlID0gRmlsZXMubGlzdChnZXRUYWJsZURpcihsZWdhY3lWZXJzaW9uLCB0YWJsZSkudG9QYXRoKCkpLmZpbmRGaXJzdCgpLm9yRWxzZVRocm93KCgpIC0+IG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIk5vIGZpbGVzIGZvciB2ZXJzaW9uPSVzIGFuZCB0YWJsZT0lcyIsIGxlZ2FjeVZlcnNpb24sIHRhYmxlKSkpOwotICAgICAgICByZXR1cm4gRGVzY3JpcHRvci5mcm9tRmlsZW5hbWUobmV3IEZpbGUoZmlsZSkpOworICAgICAgICBGaWxlW10gZmlsZXMgPSBnZXRUYWJsZURpcihsZWdhY3lWZXJzaW9uLCB0YWJsZSkubGlzdCgpOworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQoZmlsZXMubGVuZ3RoID4gMCwgIk5vIGZpbGVzIGZvciB2ZXJzaW9uPSVzIGFuZCB0YWJsZT0lcyIsIGxlZ2FjeVZlcnNpb24sIHRhYmxlKTsKKyAgICAgICAgcmV0dXJuIERlc2NyaXB0b3IuZnJvbUZpbGVXaXRoQ29tcG9uZW50KGZpbGVzWzBdKS5sZWZ0OwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0zMzIsNyArMzMxLDcgQEAKIAogICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5IChWZXJpZmllciB2ZXJpZmllciA9IG5ldyBWZXJpZmllcihjZnMsIHNzdGFibGUsIGZhbHNlLCBWZXJpZmllci5vcHRpb25zKCkuY2hlY2tWZXJzaW9uKHRydWUpLmJ1aWxkKCkpKQorICAgICAgICAgICAgICAgIHRyeSAoSVZlcmlmaWVyIHZlcmlmaWVyID0gc3N0YWJsZS5nZXRWZXJpZmllcihjZnMsIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBmYWxzZSwgSVZlcmlmaWVyLm9wdGlvbnMoKS5jaGVja1ZlcnNpb24odHJ1ZSkuYnVpbGQoKSkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFzc3RhYmxlLmRlc2NyaXB0b3IudmVyc2lvbi5pc0xhdGVzdFZlcnNpb24oKSkKQEAgLTM0NCw3ICszNDMsNyBAQAogICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGRvbid0IHRocm93IGFueSBleGNlcHRpb24gaWYgbm90IGNoZWNraW5nIHZlcnNpb246CiAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGNmcy5nZXRMaXZlU1NUYWJsZXMoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgZmFsc2UsIFZlcmlmaWVyLm9wdGlvbnMoKS5jaGVja1ZlcnNpb24oZmFsc2UpLmJ1aWxkKCkpKQorICAgICAgICAgICAgICAgIHRyeSAoSVZlcmlmaWVyIHZlcmlmaWVyID0gc3N0YWJsZS5nZXRWZXJpZmllcihjZnMsIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBmYWxzZSwgSVZlcmlmaWVyLm9wdGlvbnMoKS5jaGVja1ZlcnNpb24oZmFsc2UpLmJ1aWxkKCkpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDIwLDcgKzQxOSw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIHN0cmVhbUxlZ2FjeVRhYmxlKFN0cmluZyB0YWJsZVBhdHRlcm4sIFN0cmluZyBsZWdhY3lWZXJzaW9uKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewogICAgICAgICBTdHJpbmcgdGFibGUgPSBTdHJpbmcuZm9ybWF0KHRhYmxlUGF0dGVybiwgbGVnYWN5VmVyc2lvbik7Ci0gICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IFNTVGFibGVSZWFkZXIub3BlbihnZXREZXNjcmlwdG9yKGxlZ2FjeVZlcnNpb24sIHRhYmxlKSk7CisgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IFNTVGFibGVSZWFkZXIub3BlbihudWxsLCBnZXREZXNjcmlwdG9yKGxlZ2FjeVZlcnNpb24sIHRhYmxlKSk7CiAgICAgICAgIElQYXJ0aXRpb25lciBwID0gc3N0YWJsZS5nZXRQYXJ0aXRpb25lcigpOwogICAgICAgICBMaXN0PFJhbmdlPFRva2VuPj4gcmFuZ2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIHJhbmdlcy5hZGQobmV3IFJhbmdlPD4ocC5nZXRNaW5pbXVtVG9rZW4oKSwgcC5nZXRUb2tlbihCeXRlQnVmZmVyVXRpbC5ieXRlcygiMTAwIikpKSk7CkBAIC00NjIsNiArNDYxLDExIEBACiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeUNhY2hlKFN0cmluZyBsZWdhY3lWZXJzaW9uLCBsb25nIHN0YXJ0Q291bnQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uCiAgICAgeworICAgICAgICAvLyBPbmx5IHBlcmZvcm0gdGVzdCBpZiBmb3JtYXQgdXNlcyBjYWNoZS4KKyAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gSXRlcmFibGVzLmdldEZpcnN0KEtleXNwYWNlLm9wZW4oImxlZ2FjeV90YWJsZXMiKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShTdHJpbmcuZm9ybWF0KCJsZWdhY3lfJXNfc2ltcGxlIiwgbGVnYWN5VmVyc2lvbikpLmdldExpdmVTU1RhYmxlcygpLCBudWxsKTsKKyAgICAgICAgaWYgKCEoc3N0YWJsZSBpbnN0YW5jZW9mIEtleUNhY2hlU3VwcG9ydCkpCisgICAgICAgICAgICByZXR1cm47CisKICAgICAgICAgLy9Gb3IgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMTA3NzgKICAgICAgICAgLy9WYWxpZGF0ZSB3aGV0aGVyIHRoZSBrZXkgY2FjaGUgc3VjY2Vzc2Z1bGx5IHNhdmVzIGluIHRoZSBwcmVzZW5jZSBvZiBvbGQga2V5cyBhcwogICAgICAgICAvL3dlbGwgYXMgbG9hZHMgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGtleXMKQEAgLTU5NCw3ICs1OTgsNyBAQAogICAgIC8qKgogICAgICAqIEdlbmVyYXRlcyBzc3RhYmxlcyBmb3IgOCBDUUwgdGFibGVzIChzZWUge0BsaW5rICNjcmVhdGVUYWJsZXMoU3RyaW5nKX0pIGluIDxpPmN1cnJlbnQ8L2k+CiAgICAgICogc3N0YWJsZSBmb3JtYXQgKHZlcnNpb24pIGludG8ge0Bjb2RlIHRlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvVkVSU0lPTn0sIHdoZXJlCi0gICAgICoge0Bjb2RlIFZFUlNJT059IG1hdGNoZXMge0BsaW5rIFZlcnNpb24jZ2V0VmVyc2lvbigpIEJpZ0Zvcm1hdC5sYXRlc3RWZXJzaW9uLmdldFZlcnNpb24oKX0uCisgICAgICoge0Bjb2RlIFZFUlNJT059IG1hdGNoZXMge0BsaW5rIFZlcnNpb24jdmVyc2lvbiBCaWdGb3JtYXQubGF0ZXN0VmVyc2lvbi5nZXRWZXJzaW9uKCl9LgogICAgICAqIDxwPgogICAgICAqIFJ1biB0aGlzIHRlc3QgYWxvbmUgKGUuZy4gZnJvbSB5b3VyIElERSkgd2hlbiBhIG5ldyB2ZXJzaW9uIGlzIGludHJvZHVjZWQgb3IgZm9ybWF0IGNoYW5nZWQKICAgICAgKiBkdXJpbmcgZGV2ZWxvcG1lbnQuIEkuZS4gcmVtb3ZlIHRoZSB7QGNvZGUgQElnbm9yZX0gYW5ub3RhdGlvbiB0ZW1wb3JhcmlseS4KQEAgLTYwNCw2ICs2MDgsNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlU3N0YWJsZXMoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgeworICAgICAgICBTU1RhYmxlRm9ybWF0PD8sID8+IGZvcm1hdCA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKTsKICAgICAgICAgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKCk7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEyODsgaSsrKQpAQCAtNjE2LDMxICs2MjEsMzEgQEAKICAgICAgICAgewogICAgICAgICAgICAgU3RyaW5nIHZhbFBrID0gSW50ZWdlci50b1N0cmluZyhwayk7CiAgICAgICAgICAgICBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gbGVnYWN5X3RhYmxlcy5sZWdhY3lfJXNfc2ltcGxlIChwaywgdmFsKSBWQUxVRVMgKCclcycsICclcycpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0Zvcm1hdC5sYXRlc3RWZXJzaW9uLCB2YWxQaywgImZvbyBiYXIgYmF6IikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LmdldExhdGVzdFZlcnNpb24oKSwgdmFsUGssICJmb28gYmFyIGJheiIpKTsKIAogICAgICAgICAgICAgUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsKFN0cmluZy5mb3JtYXQoIlVQREFURSBsZWdhY3lfdGFibGVzLmxlZ2FjeV8lc19zaW1wbGVfY291bnRlciBTRVQgdmFsID0gdmFsICsgMSBXSEVSRSBwayA9ICclcyciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnRm9ybWF0LmxhdGVzdFZlcnNpb24sIHZhbFBrKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQuZ2V0TGF0ZXN0VmVyc2lvbigpLCB2YWxQaykpOwogCiAgICAgICAgICAgICBmb3IgKGludCBjayA9IDA7IGNrIDwgNTA7IGNrKyspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbENrID0gSW50ZWdlci50b1N0cmluZyhjayk7CiAKICAgICAgICAgICAgICAgICBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gbGVnYWN5X3RhYmxlcy5sZWdhY3lfJXNfY2x1c3QgKHBrLCBjaywgdmFsKSBWQUxVRVMgKCclcycsICclcycsICclcycpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdGb3JtYXQubGF0ZXN0VmVyc2lvbiwgdmFsUGssIHZhbENrICsgbG9uZ1N0cmluZywgcmFuZG9tU3RyaW5nKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LmdldExhdGVzdFZlcnNpb24oKSwgdmFsUGssIHZhbENrICsgbG9uZ1N0cmluZywgcmFuZG9tU3RyaW5nKSk7CiAKICAgICAgICAgICAgICAgICBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiVVBEQVRFIGxlZ2FjeV90YWJsZXMubGVnYWN5XyVzX2NsdXN0X2NvdW50ZXIgU0VUIHZhbCA9IHZhbCArIDEgV0hFUkUgcGsgPSAnJXMnIEFORCBjaz0nJXMnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdGb3JtYXQubGF0ZXN0VmVyc2lvbiwgdmFsUGssIHZhbENrICsgbG9uZ1N0cmluZykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdC5nZXRMYXRlc3RWZXJzaW9uKCksIHZhbFBrLCB2YWxDayArIGxvbmdTdHJpbmcpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmZvcmNlS2V5c3BhY2VGbHVzaCgibGVnYWN5X3RhYmxlcyIsIENvbHVtbkZhbWlseVN0b3JlLkZsdXNoUmVhc29uLlVOSVRfVEVTVFMpOwogCi0gICAgICAgIEZpbGUga3NEaXIgPSBuZXcgRmlsZShMRUdBQ1lfU1NUQUJMRV9ST09ULCBTdHJpbmcuZm9ybWF0KCIlcy9sZWdhY3lfdGFibGVzIiwgQmlnRm9ybWF0LmxhdGVzdFZlcnNpb24pKTsKKyAgICAgICAgRmlsZSBrc0RpciA9IG5ldyBGaWxlKExFR0FDWV9TU1RBQkxFX1JPT1QsIFN0cmluZy5mb3JtYXQoIiVzL2xlZ2FjeV90YWJsZXMiLCBmb3JtYXQuZ2V0TGF0ZXN0VmVyc2lvbigpKSk7CiAgICAgICAgIGtzRGlyLnRyeUNyZWF0ZURpcmVjdG9yaWVzKCk7Ci0gICAgICAgIGNvcHlTc3RhYmxlc0Zyb21UZXN0RGF0YShTdHJpbmcuZm9ybWF0KCJsZWdhY3lfJXNfc2ltcGxlIiwgQmlnRm9ybWF0LmxhdGVzdFZlcnNpb24pLCBrc0Rpcik7Ci0gICAgICAgIGNvcHlTc3RhYmxlc0Zyb21UZXN0RGF0YShTdHJpbmcuZm9ybWF0KCJsZWdhY3lfJXNfc2ltcGxlX2NvdW50ZXIiLCBCaWdGb3JtYXQubGF0ZXN0VmVyc2lvbiksIGtzRGlyKTsKLSAgICAgICAgY29weVNzdGFibGVzRnJvbVRlc3REYXRhKFN0cmluZy5mb3JtYXQoImxlZ2FjeV8lc19jbHVzdCIsIEJpZ0Zvcm1hdC5sYXRlc3RWZXJzaW9uKSwga3NEaXIpOwotICAgICAgICBjb3B5U3N0YWJsZXNGcm9tVGVzdERhdGEoU3RyaW5nLmZvcm1hdCgibGVnYWN5XyVzX2NsdXN0X2NvdW50ZXIiLCBCaWdGb3JtYXQubGF0ZXN0VmVyc2lvbiksIGtzRGlyKTsKKyAgICAgICAgY29weVNzdGFibGVzRnJvbVRlc3REYXRhKFN0cmluZy5mb3JtYXQoImxlZ2FjeV8lc19zaW1wbGUiLCBmb3JtYXQuZ2V0TGF0ZXN0VmVyc2lvbigpKSwga3NEaXIpOworICAgICAgICBjb3B5U3N0YWJsZXNGcm9tVGVzdERhdGEoU3RyaW5nLmZvcm1hdCgibGVnYWN5XyVzX3NpbXBsZV9jb3VudGVyIiwgZm9ybWF0LmdldExhdGVzdFZlcnNpb24oKSksIGtzRGlyKTsKKyAgICAgICAgY29weVNzdGFibGVzRnJvbVRlc3REYXRhKFN0cmluZy5mb3JtYXQoImxlZ2FjeV8lc19jbHVzdCIsIGZvcm1hdC5nZXRMYXRlc3RWZXJzaW9uKCkpLCBrc0Rpcik7CisgICAgICAgIGNvcHlTc3RhYmxlc0Zyb21UZXN0RGF0YShTdHJpbmcuZm9ybWF0KCJsZWdhY3lfJXNfY2x1c3RfY291bnRlciIsIGZvcm1hdC5nZXRMYXRlc3RWZXJzaW9uKCkpLCBrc0Rpcik7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlTc3RhYmxlc0Zyb21UZXN0RGF0YShTdHJpbmcgdGFibGUsIEZpbGUga3NEaXIpIHRocm93cyBJT0V4Y2VwdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9SYW5nZUF3YXJlU1NUYWJsZVdyaXRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjI1OGJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5NdXJtdXIzUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBSYW5nZUF3YXJlU1NUYWJsZVdyaXRlclRlc3QKK3sKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTUEFDRTEgPSAiS2V5c3BhY2UxIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9TVEFOREFSRCA9ICJTdGFuZGFyZDEiOworCisgICAgcHVibGljIHN0YXRpYyBDb2x1bW5GYW1pbHlTdG9yZSBjZnM7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRQYXJ0aXRpb25lclVuc2FmZShNdXJtdXIzUGFydGl0aW9uZXIuaW5zdGFuY2UpOworICAgICAgICBTY2hlbWFMb2FkZXIuY2xlYW51cEFuZExlYXZlRGlycygpOworICAgICAgICBLZXlzcGFjZS5zZXRJbml0aWFsaXplZCgpOworICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5pbml0U2VydmVyKCk7CisKKyAgICAgICAgU2NoZW1hTG9hZGVyLmNyZWF0ZUtleXNwYWNlKEtFWVNQQUNFMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBDRl9TVEFOREFSRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYXJ0aXRpb25lcihNdXJtdXIzUGFydGl0aW9uZXIuaW5zdGFuY2UpKTsKKworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UxKTsKKyAgICAgICAgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0ZfU1RBTkRBUkQpOworICAgICAgICBjZnMuY2xlYXJVbnNhZmUoKTsKKyAgICAgICAgY2ZzLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc1dyaXRlckJlZm9yZUFwcGVuZCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKworICAgICAgICBTY2hlbWFMb2FkZXIuaW5zZXJ0RGF0YShLRVlTUEFDRTEsIENGX1NUQU5EQVJELCAwLCAxKTsKKyAgICAgICAgVXRpbC5mbHVzaChjZnMpOworCisgICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IExpZmVjeWNsZVRyYW5zYWN0aW9uLm9mZmxpbmUoT3BlcmF0aW9uVHlwZS5TVFJFQU0pOworCisgICAgICAgIFJhbmdlQXdhcmVTU1RhYmxlV3JpdGVyIHdyaXRlciA9IG5ldyBSYW5nZUF3YXJlU1NUYWJsZVdyaXRlcihjZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlci5tYWtlKGNmcy5tZXRhZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmcy5nZXRMaXZlU1NUYWJsZXMoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLm1ldGFkYXRhLmlkLCB3cml0ZXIuZ2V0VGFibGVJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDBMLCB3cml0ZXIuZ2V0RmlsZVBvaW50ZXIoKSk7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlQ29ycnVwdGlvbkRldGVjdGlvblRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVDb3JydXB0aW9uRGV0ZWN0aW9uVGVzdC5qYXZhCmluZGV4IGVjMDE4NjUuLjIxYWM1MWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVDb3JydXB0aW9uRGV0ZWN0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVDb3JydXB0aW9uRGV0ZWN0aW9uVGVzdC5qYXZhCkBAIC0yMSwzMCArMjEsNDAgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLio7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CiAKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlVwZGF0ZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5DaHVua0NhY2hlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2xpY2VzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQXNjaWlUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZXNUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkc0xpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29tcHJlc3Npb25QYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlRmx1c2hPYnNlcnZlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVGbHVzaE9ic2VydmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4Y2EwNWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlRmx1c2hPYnNlcnZlclRlc3QuamF2YQpAQCAtMCwwICsxLDIzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkFycmF5TGlzdE11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTXVsdGltYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVRyaXBsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuVHJpcGxlOworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnQzMlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Mb25nVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVURjhUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQWJzdHJhY3RVbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5CVHJlZVJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkJ1ZmZlckNlbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuRW5jb2RpbmdTdGF0czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNXcml0ZUVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb2xsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKKworcHVibGljIGNsYXNzIFNTVGFibGVGbHVzaE9ic2VydmVyVGVzdAoreworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0REQoKQorICAgIHsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CisgICAgICAgIENvbW1pdExvZy5pbnN0YW5jZS5zdGFydCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLU19OQU1FID0gInRlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9OQU1FID0gImZsdXNoX29ic2VydmVyIjsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZsdXNoT2JzZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBUYWJsZU1ldGFkYXRhIGNmbSA9CisgICAgICAgIFRhYmxlTWV0YWRhdGEuYnVpbGRlcihLU19OQU1FLCBDRl9OQU1FKQorICAgICAgICAgICAgICAgICAgICAgLmFkZFBhcnRpdGlvbktleUNvbHVtbigiaWQiLCBVVEY4VHlwZS5pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWd1bGFyQ29sdW1uKCJmaXJzdF9uYW1lIiwgVVRGOFR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAuYWRkUmVndWxhckNvbHVtbigiYWdlIiwgSW50MzJUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZ3VsYXJDb2x1bW4oImhlaWdodCIsIExvbmdUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24gPSBMaWZlY3ljbGVUcmFuc2FjdGlvbi5vZmZsaW5lKE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTik7CisgICAgICAgIEZsdXNoT2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBuZXcgRmx1c2hPYnNlcnZlcigpOworCisgICAgICAgIFN0cmluZyBzc3RhYmxlRGlyZWN0b3J5ID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldEFsbERhdGFGaWxlTG9jYXRpb25zKClbMF07CisgICAgICAgIEZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUoc3N0YWJsZURpcmVjdG9yeSArIEZpbGUucGF0aFNlcGFyYXRvcigpICsgS1NfTkFNRSArIEZpbGUucGF0aFNlcGFyYXRvcigpICsgQ0ZfTkFNRSk7CisgICAgICAgIGRpcmVjdG9yeS5kZWxldGVPbkV4aXQoKTsKKworICAgICAgICBpZiAoIWRpcmVjdG9yeS5leGlzdHMoKSAmJiAhZGlyZWN0b3J5LnRyeUNyZWF0ZURpcmVjdG9yaWVzKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgRlNXcml0ZUVycm9yKG5ldyBJT0V4Y2VwdGlvbigiZmFpbGVkIHRvIGNyZWF0ZSB0bXAgZGlyZWN0b3J5IiksIGRpcmVjdG9yeS5hYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgICAgU1NUYWJsZUZvcm1hdDw/LCA/PiBzc3RhYmxlRm9ybWF0ID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpOworICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvcihzc3RhYmxlRm9ybWF0LmdldExhdGVzdFZlcnNpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZm0ua2V5c3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmbS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2VxdWVuY2VCYXNlZFNTVGFibGVJZCgwKSk7CisKKyAgICAgICAgU1NUYWJsZVdyaXRlciB3cml0ZXIgPSBkZXNjcmlwdG9yLmdldEZvcm1hdCgpLmdldFdyaXRlckZhY3RvcnkoKS5idWlsZGVyKGRlc2NyaXB0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRLZXlDb3VudCgxMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRhYmxlTWV0YWRhdGFSZWYoVGFibGVNZXRhZGF0YVJlZi5mb3JPZmZsaW5lVG9vbHMoY2ZtKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1ldGFkYXRhQ29sbGVjdG9yKG5ldyBNZXRhZGF0YUNvbGxlY3RvcihjZm0uY29tcGFyYXRvcikuc3N0YWJsZUxldmVsKDApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2VyaWFsaXphdGlvbkhlYWRlcihuZXcgU2VyaWFsaXphdGlvbkhlYWRlcih0cnVlLCBjZm0sIGNmbS5yZWd1bGFyQW5kU3RhdGljQ29sdW1ucygpLCBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZsdXNoT2JzZXJ2ZXJzKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qob2JzZXJ2ZXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRGVmYXVsdENvbXBvbmVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQodHJhbnNhY3Rpb24sIG51bGwpOworCisgICAgICAgIFNTVGFibGVSZWFkZXIgcmVhZGVyID0gbnVsbDsKKyAgICAgICAgTXVsdGltYXA8Qnl0ZUJ1ZmZlciwgQ2VsbDw/Pj4gZXhwZWN0ZWQgPSBBcnJheUxpc3RNdWx0aW1hcC5jcmVhdGUoKTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBrZXkgPSBVVEY4VHlwZS5pbnN0YW5jZS5mcm9tU3RyaW5nKCJrZXkxIik7CisgICAgICAgICAgICBleHBlY3RlZC5wdXRBbGwoa2V5LCBBcnJheXMuYXNMaXN0KEJ1ZmZlckNlbGwubGl2ZShnZXRDb2x1bW4oY2ZtLCAiYWdlIiksIG5vdywgSW50MzJUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgyNykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJDZWxsLmxpdmUoZ2V0Q29sdW1uKGNmbSwgImZpcnN0X25hbWUiKSwgbm93LCBVVEY4VHlwZS5pbnN0YW5jZS5mcm9tU3RyaW5nKCJqYWNrIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJDZWxsLmxpdmUoZ2V0Q29sdW1uKGNmbSwgImhlaWdodCIpLCBub3csIExvbmdUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgxODNMKSkpKTsKKworICAgICAgICAgICAgd3JpdGVyLmFwcGVuZChuZXcgUm93SXRlcmF0b3IoY2ZtLCBrZXkuZHVwbGljYXRlKCksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoYnVpbGRSb3coZXhwZWN0ZWQuZ2V0KGtleSkpKSkpOworCisgICAgICAgICAgICBrZXkgPSBVVEY4VHlwZS5pbnN0YW5jZS5mcm9tU3RyaW5nKCJrZXkyIik7CisgICAgICAgICAgICBleHBlY3RlZC5wdXRBbGwoa2V5LCBBcnJheXMuYXNMaXN0KEJ1ZmZlckNlbGwubGl2ZShnZXRDb2x1bW4oY2ZtLCAiYWdlIiksIG5vdywgSW50MzJUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgzMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJDZWxsLmxpdmUoZ2V0Q29sdW1uKGNmbSwgImZpcnN0X25hbWUiKSwgbm93LCBVVEY4VHlwZS5pbnN0YW5jZS5mcm9tU3RyaW5nKCJqaW0iKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckNlbGwubGl2ZShnZXRDb2x1bW4oY2ZtLCAiaGVpZ2h0IiksIG5vdywgTG9uZ1R5cGUuaW5zdGFuY2UuZGVjb21wb3NlKDE4MEwpKSkpOworCisgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKG5ldyBSb3dJdGVyYXRvcihjZm0sIGtleSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChidWlsZFJvdyhleHBlY3RlZC5nZXQoa2V5KSkpKSk7CisKKyAgICAgICAgICAgIGtleSA9IFVURjhUeXBlLmluc3RhbmNlLmZyb21TdHJpbmcoImtleTMiKTsKKyAgICAgICAgICAgIGV4cGVjdGVkLnB1dEFsbChrZXksIEFycmF5cy5hc0xpc3QoQnVmZmVyQ2VsbC5saXZlKGdldENvbHVtbihjZm0sICJhZ2UiKSwgbm93LCBJbnQzMlR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKDMwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckNlbGwubGl2ZShnZXRDb2x1bW4oY2ZtLCAiZmlyc3RfbmFtZSIpLCBub3csIFVURjhUeXBlLmluc3RhbmNlLmZyb21TdHJpbmcoImtlbiIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyQ2VsbC5saXZlKGdldENvbHVtbihjZm0sICJoZWlnaHQiKSwgbm93LCBMb25nVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoMTc4TCkpKSk7CisKKyAgICAgICAgICAgIHdyaXRlci5hcHBlbmQobmV3IFJvd0l0ZXJhdG9yKGNmbSwga2V5LCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGJ1aWxkUm93KGV4cGVjdGVkLmdldChrZXkpKSkpKTsKKworICAgICAgICAgICAgcmVhZGVyID0gd3JpdGVyLmZpbmlzaCh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZVF1aWV0bHkod3JpdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG9ic2VydmVyLmlzQ29tcGxldGUpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLnNpemUoKSwgb2JzZXJ2ZXIucm93cy5zaXplKCkpOworCisgICAgICAgIGZvciAoVHJpcGxlPEJ5dGVCdWZmZXIsIExvbmcsIExvbmc+IGUgOiBvYnNlcnZlci5yb3dzLmtleVNldCgpKQorICAgICAgICB7CisgICAgICAgICAgICBCeXRlQnVmZmVyIGtleSA9IGUuZ2V0TGVmdCgpOworICAgICAgICAgICAgbG9uZyBkYXRhUG9zaXRpb24gPSBlLmdldE1pZGRsZSgpOworICAgICAgICAgICAgbG9uZyBpbmRleFBvc2l0aW9uID0gZS5nZXRSaWdodCgpOworCisgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgaW5kZXhLZXkgPSByZWFkZXIua2V5QXRQb3NpdGlvbkZyb21TZWNvbmRhcnlJbmRleChpbmRleFBvc2l0aW9uKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgVVRGOFR5cGUuaW5zdGFuY2UuY29tcGFyZShrZXksIGluZGV4S2V5LmdldEtleSgpKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldChrZXkpLCBvYnNlcnZlci5yb3dzLmdldChlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSb3dJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0VW5maWx0ZXJlZFJvd0l0ZXJhdG9yCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPFVuZmlsdGVyZWQ+IHJvd3M7CisKKyAgICAgICAgcHVibGljIFJvd0l0ZXJhdG9yKFRhYmxlTWV0YWRhdGEgY2ZtLCBCeXRlQnVmZmVyIGtleSwgQ29sbGVjdGlvbjxVbmZpbHRlcmVkPiBjb250ZW50KQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihjZm0sCisgICAgICAgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0UGFydGl0aW9uZXIoKS5kZWNvcmF0ZUtleShrZXkpLAorICAgICAgICAgICAgICAgICAgRGVsZXRpb25UaW1lLkxJVkUsCisgICAgICAgICAgICAgICAgICBjZm0ucmVndWxhckFuZFN0YXRpY0NvbHVtbnMoKSwKKyAgICAgICAgICAgICAgICAgIEJUcmVlUm93LmVtcHR5Um93KENsdXN0ZXJpbmcuU1RBVElDX0NMVVNURVJJTkcpLAorICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTKTsKKworICAgICAgICAgICAgcm93cyA9IGNvbnRlbnQuaXRlcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZCBjb21wdXRlTmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByb3dzLmhhc05leHQoKSA/IHJvd3MubmV4dCgpIDogZW5kT2ZEYXRhKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGbHVzaE9ic2VydmVyIGltcGxlbWVudHMgU1NUYWJsZUZsdXNoT2JzZXJ2ZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTXVsdGltYXA8VHJpcGxlPEJ5dGVCdWZmZXIsIExvbmcsIExvbmc+LCBDZWxsPD8+PiByb3dzID0gQXJyYXlMaXN0TXVsdGltYXAuY3JlYXRlKCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgTXVsdGltYXA8VHJpcGxlPEJ5dGVCdWZmZXIsIExvbmcsIExvbmc+LCBDZWxsPD8+PiBzdGF0aWNSb3dzID0gQXJyYXlMaXN0TXVsdGltYXAuY3JlYXRlKCk7CisKKyAgICAgICAgcHJpdmF0ZSBUcmlwbGU8Qnl0ZUJ1ZmZlciwgTG9uZywgTG9uZz4gY3VycmVudEtleTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcGxldGU7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGJlZ2luKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0UGFydGl0aW9uKERlY29yYXRlZEtleSBrZXksIGxvbmcgZGF0YVBvc2l0aW9uLCBsb25nIGluZGV4UG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJlbnRLZXkgPSBJbW11dGFibGVUcmlwbGUub2Yoa2V5LmdldEtleSgpLCBkYXRhUG9zaXRpb24sIGluZGV4UG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG5leHRVbmZpbHRlcmVkQ2x1c3RlcihVbmZpbHRlcmVkIHJvdykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJvdy5pc1JvdygpKQorICAgICAgICAgICAgICAgICgoUm93KSByb3cpLmZvckVhY2goKGMpIC0+IHJvd3MucHV0KGN1cnJlbnRLZXksIChDZWxsPD8+KSBjKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY29tcGxldGUoKQorICAgICAgICB7CisgICAgICAgICAgICBpc0NvbXBsZXRlID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzdGF0aWNSb3coUm93IHN0YXRpY1JvdykKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGljUm93LmZvckVhY2goKGMpIC0+IHN0YXRpY1Jvd3MucHV0KGN1cnJlbnRLZXksIChDZWxsPD8+KSBjKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBSb3cgYnVpbGRSb3coQ29sbGVjdGlvbjxDZWxsPD8+PiBjZWxscykKKyAgICB7CisgICAgICAgIFJvdy5CdWlsZGVyIHJvd0J1aWxkZXIgPSBCVHJlZVJvdy5zb3J0ZWRCdWlsZGVyKCk7CisgICAgICAgIHJvd0J1aWxkZXIubmV3Um93KENsdXN0ZXJpbmcuRU1QVFkpOworICAgICAgICBjZWxscy5mb3JFYWNoKHJvd0J1aWxkZXI6OmFkZENlbGwpOworICAgICAgICByZXR1cm4gcm93QnVpbGRlci5idWlsZCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENvbHVtbk1ldGFkYXRhIGdldENvbHVtbihUYWJsZU1ldGFkYXRhIGNmbSwgU3RyaW5nIG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gY2ZtLmdldENvbHVtbihVVEY4VHlwZS5pbnN0YW5jZS5mcm9tU3RyaW5nKG5hbWUpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlRm9ybWF0VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZUZvcm1hdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGE2OGRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZUZvcm1hdFRlc3QuamF2YQpAQCAtMCwwICsxLDI3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaUZ1bmN0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWcuU1NUYWJsZUNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5ZYW1sQ29uZmlndXJhdGlvbkxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlT3V0cHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0RXhjZXB0aW9uT2ZUeXBlOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKK3B1YmxpYyBjbGFzcyBTU1RhYmxlRm9ybWF0VGVzdAoreworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RGb3JtYXQgaW1wbGVtZW50cyBTU1RhYmxlRm9ybWF0PFNTVGFibGVSZWFkZXIsIFNTVGFibGVXcml0ZXI+CisgICAgeworICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zOworICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgbGF0ZXN0VmVyc2lvbjsKKworICAgICAgICBwdWJsaWMgQWJzdHJhY3RGb3JtYXQoU3RyaW5nIGxhdGVzdFZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubGF0ZXN0VmVyc2lvbiA9IGxhdGVzdFZlcnNpb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZlcnNpb24gZ2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgVmVyc2lvbiB2ID0gTW9ja2l0by5tb2NrKFZlcnNpb24uY2xhc3MpOworICAgICAgICAgICAgd2hlbih2LnRvU3RyaW5nKCkpLnRoZW5SZXR1cm4odmVyc2lvbik7CisgICAgICAgICAgICB3aGVuKHYuaXNDb21wYXRpYmxlKCkpLnRoZW5SZXR1cm4odmVyc2lvbi5jaGFyQXQoMCkgPT0gbGF0ZXN0VmVyc2lvbi5jaGFyQXQoMCkpOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZlcnNpb24gZ2V0TGF0ZXN0VmVyc2lvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRWZXJzaW9uKGxhdGVzdFZlcnNpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBTU1RhYmxlRm9ybWF0LkZhY3RvcnkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFN0cmluZyBuYW1lOworICAgICAgICAgICAgcHVibGljIEJpRnVuY3Rpb248TWFwPFN0cmluZywgU3RyaW5nPiwgU3RyaW5nLCBTU1RhYmxlRm9ybWF0PD8sID8+PiBwcm92aWRlcjsKKworICAgICAgICAgICAgcHVibGljIEZhY3RvcnkoU3RyaW5nIG5hbWUsIEJpRnVuY3Rpb248TWFwPFN0cmluZywgU3RyaW5nPiwgU3RyaW5nLCBTU1RhYmxlRm9ybWF0PD8sID8+PiBwcm92aWRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICAgICAgICAgIHRoaXMucHJvdmlkZXIgPSBwcm92aWRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTU1RhYmxlRm9ybWF0PD8sID8+IGdldEluc3RhbmNlKE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuYXBwbHkob3B0aW9ucywgbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEFic3RyYWN0Rm9ybWF0LkZhY3RvcnkgZmFjdG9yeShTdHJpbmcgbmFtZSwgQ2xhc3M8PyBleHRlbmRzIEFic3RyYWN0Rm9ybWF0PiBjbGF6eikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RGb3JtYXQuRmFjdG9yeShuYW1lLCAob3B0aW9ucywgdmVyc2lvbikgLT4geworICAgICAgICAgICAgQWJzdHJhY3RGb3JtYXQgZm9ybWF0ID0gTW9ja2l0by5zcHkoY2xhenopOworICAgICAgICAgICAgZm9ybWF0Lm5hbWUgPSBuYW1lOworICAgICAgICAgICAgZm9ybWF0Lm9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICAgICAgcmV0dXJuIGZvcm1hdDsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBGb3JtYXQxIGV4dGVuZHMgQWJzdHJhY3RGb3JtYXQKKyAgICB7CisgICAgICAgIHB1YmxpYyBGb3JtYXQxKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoInh4Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEZvcm1hdDIgZXh0ZW5kcyBBYnN0cmFjdEZvcm1hdAorICAgIHsKKyAgICAgICAgcHVibGljIEZvcm1hdDIoKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcigieXkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRm9ybWF0MyBleHRlbmRzIEFic3RyYWN0Rm9ybWF0CisgICAgeworICAgICAgICBwdWJsaWMgRm9ybWF0MygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKCJ6eiIpOworICAgICAgICB9CisgICAgfQorCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZUNsYXNzKCkKKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5jbGllbnRJbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB5YW1sQ29udGVudDAgPSAiIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTU1RhYmxlQ29uZmlnIGV4cGVjdGVkMCA9IG5ldyBDb25maWcuU1NUYWJsZUNvbmZpZygpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHlhbWxDb250ZW50MSA9ICJzc3RhYmxlOlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICBzZWxlY3RlZF9mb3JtYXQ6IGFhYVxuIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTU1RhYmxlQ29uZmlnIGV4cGVjdGVkMSA9IG5ldyBDb25maWcuU1NUYWJsZUNvbmZpZygpCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICBzZWxlY3RlZF9mb3JtYXQgPSAiYWFhIjsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgeWFtbENvbnRlbnQyID0gInNzdGFibGU6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgIHNlbGVjdGVkX2Zvcm1hdDogYWFhXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgIGZvcm1hdDpcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgIGFhYTpcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICBwYXJhbTE6IHZhbHVlMVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgIHBhcmFtMjogdmFsdWUyXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICBiYmI6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgcGFyYW0zOiB2YWx1ZTNcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICBwYXJhbTQ6IHZhbHVlNFxuIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbmZpZy5TU1RhYmxlQ29uZmlnIGV4cGVjdGVkMiA9IG5ldyBTU1RhYmxlQ29uZmlnKCkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbGVjdGVkX2Zvcm1hdCA9ICJhYWEiOworICAgICAgICAgICAgZm9ybWF0ID0gSW1tdXRhYmxlTWFwLm9mKCJhYWEiLCBJbW11dGFibGVNYXAub2YoInBhcmFtMSIsICJ2YWx1ZTEiLCAicGFyYW0yIiwgInZhbHVlMiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmIiLCBJbW11dGFibGVNYXAub2YoInBhcmFtMyIsICJ2YWx1ZTMiLCAicGFyYW00IiwgInZhbHVlNCIpKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTU1RhYmxlQ29uZmlnIHVuZXhwZWN0ZWQgPSBuZXcgQ29uZmlnLlNTVGFibGVDb25maWcoKQorICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgc2VsZWN0ZWRfZm9ybWF0ID0gImFhYSI7CisgICAgICAgIH0KKyAgICB9OworCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzaW5nWWFtbENvbmZpZygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgWWFtbENvbmZpZ3VyYXRpb25Mb2FkZXIgbG9hZGVyID0gbmV3IFlhbWxDb25maWd1cmF0aW9uTG9hZGVyKCk7CisgICAgICAgIEZpbGUgZiA9IEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZSgic3N0YWJsZV9mb3JtYXRfdGVzdF9jb25maWciLCAiLnlhbWwiKTsKKyAgICAgICAgVVJMIHVybCA9IGYudG9QYXRoKCkudG9VcmkoKS50b1VSTCgpOworCisgICAgICAgIEltbXV0YWJsZU1hcC5vZih5YW1sQ29udGVudDAsIGV4cGVjdGVkMCwgeWFtbENvbnRlbnQxLCBleHBlY3RlZDEsIHlhbWxDb250ZW50MiwgZXhwZWN0ZWQyKS5mb3JFYWNoKCh5YW1sQ29udGVudCwgZXhwZWN0ZWQpIC0+IHsKKyAgICAgICAgICAgIHRyeSAoRmlsZU91dHB1dFN0cmVhbVBsdXMgb3V0ID0gZi5uZXdPdXRwdXRTdHJlYW0oRmlsZS5Xcml0ZU1vZGUuT1ZFUldSSVRFKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoeWFtbENvbnRlbnQuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbmZpZyBjb25maWcgPSBsb2FkZXIubG9hZENvbmZpZyh1cmwpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChjb25maWcuc3N0YWJsZSkuZGVzY3JpYmVkQXMoIllhbWw6IFxuJXNcbiIsIHlhbWxDb250ZW50KS5pc0VxdWFsVG9Db21wYXJpbmdGaWVsZEJ5RmllbGQoZXhwZWN0ZWQpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgYmVmb3JlKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZShTU1RhYmxlQ29uZmlnIGNvbmZpZywgU1NUYWJsZUZvcm1hdC5GYWN0b3J5Li4uIGZhY3RvcmllcykKKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5yZXNldFNTVGFibGVGb3JtYXRzKEFycmF5cy5hc0xpc3QoZmFjdG9yaWVzKSwgY29uZmlnKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Rm9ybWF0KFN0cmluZyBuYW1lLCBNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnMpCisgICAgeworICAgICAgICBBYnN0cmFjdEZvcm1hdCBmb3JtYXQgPSAoQWJzdHJhY3RGb3JtYXQpIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU1RhYmxlRm9ybWF0cygpLmdldChuYW1lKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmb3JtYXQubmFtZSkuaXNFcXVhbFRvKG5hbWUpOworICAgICAgICBhc3NlcnRUaGF0KGZvcm1hdC5vcHRpb25zKS5pc0VxdWFsVG8ob3B0aW9ucyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVNlbGVjdGVkRm9ybWF0KFN0cmluZyBuYW1lKQorICAgIHsKKyAgICAgICAgYXNzZXJ0VGhhdChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkubmFtZSgpKS5pc0VxdWFsVG8obmFtZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRDb25maWcoKQorICAgIHsKKyAgICAgICAgY29uZmlndXJlKGV4cGVjdGVkMSwgZmFjdG9yeSgiYWFhIiwgRm9ybWF0MS5jbGFzcykpOworICAgICAgICBhc3NlcnRUaGF0KERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU1RhYmxlRm9ybWF0cygpKS5oYXNTaXplKDEpOworICAgICAgICB2ZXJpZnlGb3JtYXQoImFhYSIsIEltbXV0YWJsZU1hcC5vZigpKTsKKyAgICAgICAgdmVyaWZ5U2VsZWN0ZWRGb3JtYXQoImFhYSIpOworCisgICAgICAgIGNvbmZpZ3VyZShleHBlY3RlZDIsIGZhY3RvcnkoImFhYSIsIEZvcm1hdDEuY2xhc3MpLCBmYWN0b3J5KCJiYmIiLCBGb3JtYXQyLmNsYXNzKSwgZmFjdG9yeSgiY2NjIiwgRm9ybWF0My5jbGFzcykpOworICAgICAgICBhc3NlcnRUaGF0KERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU1RhYmxlRm9ybWF0cygpKS5oYXNTaXplKDMpOworICAgICAgICB2ZXJpZnlGb3JtYXQoImFhYSIsIEltbXV0YWJsZU1hcC5vZigicGFyYW0xIiwgInZhbHVlMSIsICJwYXJhbTIiLCAidmFsdWUyIikpOworICAgICAgICB2ZXJpZnlGb3JtYXQoImJiYiIsIEltbXV0YWJsZU1hcC5vZigicGFyYW0zIiwgInZhbHVlMyIsICJwYXJhbTQiLCAidmFsdWU0IikpOworICAgICAgICB2ZXJpZnlGb3JtYXQoImNjYyIsIEltbXV0YWJsZU1hcC5vZigpKTsKKyAgICAgICAgdmVyaWZ5U2VsZWN0ZWRGb3JtYXQoImFhYSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ1ZhbGlkYXRpb24oKQorICAgIHsKKyAgICAgICAgLy8gaW52YWxpZCBuYW1lCisgICAgICAgIGFzc2VydFRoYXRFeGNlcHRpb25PZlR5cGUoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykuaXNUaHJvd25CeSgoKSAtPiBjb25maWd1cmUoZXhwZWN0ZWQxLCBmYWN0b3J5KCJBYSIsIEZvcm1hdDEuY2xhc3MpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoTWVzc2FnZUNvbnRhaW5pbmdBbGwoIlNTVGFibGUgZm9ybWF0IG5hbWUiLCAibXVzdCBiZSBub24tZW1wdHksIGxvd2VyLWNhc2UgbGV0dGVycyBvbmx5IHN0cmluZyIpOworICAgICAgICBhc3NlcnRUaGF0RXhjZXB0aW9uT2ZUeXBlKENvbmZpZ3VyYXRpb25FeGNlcHRpb24uY2xhc3MpLmlzVGhyb3duQnkoKCkgLT4gY29uZmlndXJlKGV4cGVjdGVkMSwgZmFjdG9yeSgiYS1hIiwgRm9ybWF0MS5jbGFzcykpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhNZXNzYWdlQ29udGFpbmluZ0FsbCgiU1NUYWJsZSBmb3JtYXQgbmFtZSIsICJtdXN0IGJlIG5vbi1lbXB0eSwgbG93ZXItY2FzZSBsZXR0ZXJzIG9ubHkgc3RyaW5nIik7CisgICAgICAgIGFzc2VydFRoYXRFeGNlcHRpb25PZlR5cGUoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykuaXNUaHJvd25CeSgoKSAtPiBjb25maWd1cmUoZXhwZWN0ZWQxLCBmYWN0b3J5KCJhMSIsIEZvcm1hdDEuY2xhc3MpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoTWVzc2FnZUNvbnRhaW5pbmdBbGwoIlNTVGFibGUgZm9ybWF0IG5hbWUiLCAibXVzdCBiZSBub24tZW1wdHksIGxvd2VyLWNhc2UgbGV0dGVycyBvbmx5IHN0cmluZyIpOworICAgICAgICBhc3NlcnRUaGF0RXhjZXB0aW9uT2ZUeXBlKENvbmZpZ3VyYXRpb25FeGNlcHRpb24uY2xhc3MpLmlzVGhyb3duQnkoKCkgLT4gY29uZmlndXJlKGV4cGVjdGVkMSwgZmFjdG9yeSgiIiwgRm9ybWF0MS5jbGFzcykpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhNZXNzYWdlQ29udGFpbmluZ0FsbCgiU1NUYWJsZSBmb3JtYXQgbmFtZSIsICJtdXN0IGJlIG5vbi1lbXB0eSwgbG93ZXItY2FzZSBsZXR0ZXJzIG9ubHkgc3RyaW5nIik7CisKKyAgICAgICAgLy8gZHVwbGljYXRlIG5hbWUKKyAgICAgICAgYXNzZXJ0VGhhdEV4Y2VwdGlvbk9mVHlwZShDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzKS5pc1Rocm93bkJ5KCgpIC0+IGNvbmZpZ3VyZShleHBlY3RlZDEsIGZhY3RvcnkoImFhYSIsIEZvcm1hdDEuY2xhc3MpLCBmYWN0b3J5KCJhYWEiLCBGb3JtYXQyLmNsYXNzKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aE1lc3NhZ2VDb250YWluaW5nQWxsKCJNdWx0aXBsZSBzc3RhYmxlIGZvcm1hdCBpbXBsZW1lbnRhdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIiwgImFhYSIpOworCisgICAgICAgIC8vIG1pc3NpbmcgbmFtZQorICAgICAgICBhc3NlcnRUaGF0RXhjZXB0aW9uT2ZUeXBlKENvbmZpZ3VyYXRpb25FeGNlcHRpb24uY2xhc3MpLmlzVGhyb3duQnkoKCkgLT4gY29uZmlndXJlKGV4cGVjdGVkMSwgZmFjdG9yeShudWxsLCBGb3JtYXQxLmNsYXNzKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aE1lc3NhZ2VDb250YWluaW5nQWxsKCJTU1RhYmxlIGZvcm1hdCBuYW1lIiwgImNhbm5vdCBiZSBudWxsIik7CisKKyAgICAgICAgLy8gQ29uZmlndXJhdGlvbiBjb250YWlucyBvcHRpb25zIG9mIHVua25vd24gc3N0YWJsZSBmb3JtYXRzCisgICAgICAgIGFzc2VydFRoYXRFeGNlcHRpb25PZlR5cGUoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykuaXNUaHJvd25CeSgoKSAtPiBjb25maWd1cmUoZXhwZWN0ZWQyLCBmYWN0b3J5KCJhYWEiLCBGb3JtYXQxLmNsYXNzKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aE1lc3NhZ2VDb250YWluaW5nQWxsKCJDb25maWd1cmF0aW9uIGNvbnRhaW5zIG9wdGlvbnMgb2YgdW5rbm93biBzc3RhYmxlIGZvcm1hdHMiLCAiYmJiIik7CisKKyAgICAgICAgLy8gU2VsZWN0ZWQgc3N0YWJsZSBmb3JtYXQgJyVzJyBpcyBub3QgYXZhaWxhYmxlCisgICAgICAgIGFzc2VydFRoYXRFeGNlcHRpb25PZlR5cGUoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykuaXNUaHJvd25CeSgoKSAtPiBjb25maWd1cmUoZXhwZWN0ZWQxLCBmYWN0b3J5KCJiYmIiLCBGb3JtYXQxLmNsYXNzKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aE1lc3NhZ2VDb250YWluaW5nQWxsKCJTZWxlY3RlZCBzc3RhYmxlIGZvcm1hdCIsICJhYWEiLCAiaXMgbm90IGF2YWlsYWJsZSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVIZWFkZXJGaXhUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlSGVhZGVyRml4VGVzdC5qYXZhCmluZGV4IDQ1NzJlNWMuLjUyNzNkYWYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVIZWFkZXJGaXhUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZUhlYWRlckZpeFRlc3QuamF2YQpAQCAtMzMsMTAgKzMzLDExIEBACiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5JbnRTdHJlYW07CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CkBAIC02MCwxNiArNjEsMTcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVURjhUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVXNlclR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5FbmNvZGluZ1N0YXRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQuQ29tcG9uZW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuSW5kZXhNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuTW9ja1NjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuSW5kZXhNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIApAQCAtMTAxLDYgKzEwMywxMiBAQAogICAgICAgICByZXR1cm4gTW9ja1NjaGVtYS5zc3RhYmxlSWRHZW5lcmF0b3JzKCk7CiAgICAgfQogCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZUNsYXNzKCkKKyAgICB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKEJpZ0Zvcm1hdC5pc1NlbGVjdGVkKCkpOworICAgIH0KKwogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXR1cCgpCiAgICAgewpAQCAtMTc4LDcgKzE4Niw3IEBACiAgICAgICAgIHJldHVybiBuZXcgVHVwbGVUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoVVRGOFR5cGUuaW5zdGFuY2UpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBWZXJzaW9uIHZlcnNpb24gPSBCaWdGb3JtYXQuaW5zdGFuY2UuZ2V0VmVyc2lvbigibWMiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBWZXJzaW9uIHZlcnNpb24gPSBCaWdGb3JtYXQuZ2V0SW5zdGFuY2UoKS5nZXRWZXJzaW9uKCJtYyIpOwogCiAgICAgcHJpdmF0ZSBUYWJsZU1ldGFkYXRhIHRhYmxlTWV0YWRhdGE7CiAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiB1cGRhdGVkQ29sdW1ucyA9IG5ldyBIYXNoU2V0PD4oKTsKQEAgLTM4Niw3ICszOTQsNyBAQAogICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEgY2QgPSBnZXRDb2xEZWYoY29sKTsKICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiBkcm9wVHlwZSA9IGNkLnR5cGUuZXhwYW5kVXNlclR5cGVzKCk7CiAgICAgICAgICAgICBjb2xzLnJlbW92ZVJlZ3VsYXJPclN0YXRpY0NvbHVtbihjaSkKLSAgICAgICAgICAgICAgICAucmVjb3JkQ29sdW1uRHJvcChuZXcgQ29sdW1uTWV0YWRhdGEoY2Qua3NOYW1lLCBjZC5jZk5hbWUsIGNkLm5hbWUsIGRyb3BUeXBlLCBjZC5wb3NpdGlvbigpLCBjZC5raW5kKSwgRkJVdGlsaXRpZXMudGltZXN0YW1wTWljcm9zKCkpOworICAgICAgICAgICAgICAgIC5yZWNvcmRDb2x1bW5Ecm9wKG5ldyBDb2x1bW5NZXRhZGF0YShjZC5rc05hbWUsIGNkLmNmTmFtZSwgY2QubmFtZSwgZHJvcFR5cGUsIGNkLnBvc2l0aW9uKCksIGNkLmtpbmQsIGNkLmdldE1hc2soKSksIEZCVXRpbGl0aWVzLnRpbWVzdGFtcE1pY3JvcygpKTsKICAgICAgICAgfQogICAgICAgICB0YWJsZU1ldGFkYXRhID0gY29scy5idWlsZCgpOwogCkBAIC04MjIsMTEgKzgzMCwxMSBAQAogICAgICAgICB0cnkKICAgICAgICAgewogCi0gICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBuZXcgRGVzY3JpcHRvcih2ZXJzaW9uLCBkaXIsICJrcyIsICJjZiIsIE1vY2tTY2hlbWEuc3N0YWJsZUlkKGdlbmVyYXRpb24pLCBTU1RhYmxlRm9ybWF0LlR5cGUuQklHKTsKKyAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzYyA9IG5ldyBEZXNjcmlwdG9yKHZlcnNpb24sIGRpciwgImtzIiwgImNmIiwgTW9ja1NjaGVtYS5zc3RhYmxlSWQoZ2VuZXJhdGlvbikpOwogCiAgICAgICAgICAgICAvLyBKdXN0IGNyZWF0ZSB0aGUgY29tcG9uZW50IGZpbGVzIC0gd2UgZG9uJ3QgcmVhbGx5IG5lZWQgdGhvc2UuCiAgICAgICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiByZXF1aXJlZENvbXBvbmVudHMpCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRmlsZShkZXNjLmZpbGVuYW1lRm9yKGNvbXBvbmVudCkpLmNyZWF0ZUZpbGVJZk5vdEV4aXN0cygpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGRlc2MuZmlsZUZvcihjb21wb25lbnQpLmNyZWF0ZUZpbGVJZk5vdEV4aXN0cygpKTsKIAogICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHBhcnRpdGlvbktleSA9IGhlYWRlck1ldGFkYXRhLnBhcnRpdGlvbktleVR5cGU7CiAgICAgICAgICAgICBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gY2x1c3RlcmluZ0tleSA9IGhlYWRlck1ldGFkYXRhLmNsdXN0ZXJpbmdDb2x1bW5zKCkKQEAgLTg0Miw3ICs4NTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoY2QgLT4gY2Qua2luZCA9PSBDb2x1bW5NZXRhZGF0YS5LaW5kLlJFR1VMQVIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChjZCAtPiBjZC5uYW1lLmJ5dGVzLCBjZCAtPiBjZC50eXBlLCAoYSwgYikgLT4gYSkpOwogCi0gICAgICAgICAgICBGaWxlIHN0YXRzRmlsZSA9IG5ldyBGaWxlKGRlc2MuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlNUQVRTKSk7CisgICAgICAgICAgICBGaWxlIHN0YXRzRmlsZSA9IGRlc2MuZmlsZUZvcihDb21wb25lbnRzLlNUQVRTKTsKICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIuQ29tcG9uZW50IGhlYWRlciA9IFNlcmlhbGl6YXRpb25IZWFkZXIuQ29tcG9uZW50LmJ1aWxkQ29tcG9uZW50Rm9yVG9vbHMocGFydGl0aW9uS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyaW5nS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDb2x1bW5zLApAQCAtODU1LDcgKzg2Myw3IEBACiAgICAgICAgICAgICAgICAgb3V0LmZpbmlzaCgpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUoZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpOworICAgICAgICAgICAgcmV0dXJuIGRlc2MuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKICAgICAgICAgewpAQCAtOTg4LDkgKzk5Niw5IEBACiAKICAgICBwcml2YXRlIFNlcmlhbGl6YXRpb25IZWFkZXIuQ29tcG9uZW50IHJlYWRIZWFkZXIoRmlsZSBzc3RhYmxlKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewotICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBEZXNjcmlwdG9yLmZyb21GaWxlbmFtZShzc3RhYmxlKTsKKyAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gRGVzY3JpcHRvci5mcm9tRmlsZVdpdGhDb21wb25lbnQoc3N0YWJsZSwgZmFsc2UpLmxlZnQ7CiAgICAgICAgIHJldHVybiAoU2VyaWFsaXphdGlvbkhlYWRlci5Db21wb25lbnQpIGRlc2MuZ2V0TWV0YWRhdGFTZXJpYWxpemVyKCkuZGVzZXJpYWxpemUoZGVzYywgTWV0YWRhdGFUeXBlLkhFQURFUik7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcG9uZW50W10gcmVxdWlyZWRDb21wb25lbnRzID0gbmV3IENvbXBvbmVudFtdeyBDb21wb25lbnQuREFUQSwgQ29tcG9uZW50LkZJTFRFUiwgQ29tcG9uZW50LlBSSU1BUllfSU5ERVgsIENvbXBvbmVudC5UT0MgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wb25lbnRbXSByZXF1aXJlZENvbXBvbmVudHMgPSBuZXcgQ29tcG9uZW50W117IENvbXBvbmVudHMuREFUQSwgQ29tcG9uZW50cy5GSUxURVIsIENvbXBvbmVudHMuUFJJTUFSWV9JTkRFWCwgQ29tcG9uZW50cy5UT0MgfTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVMb2FkZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlTG9hZGVyVGVzdC5qYXZhCmluZGV4IGMyNDAzZGQuLmQyMTA4ODggMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVMb2FkZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZUxvYWRlclRlc3QuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uRmlsZXM7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvdzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CkBAIC0zMyw2ICszNCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SZXBsaWNhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhUmVmOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7CkBAIC00MCw3ICs0Miw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQXNjaWlUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTV3JpdGVFcnJvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtRXZlbnQ7CkBAIC05NSwxNiArOTYsMzMgQEAKICAgICBAQWZ0ZXIKICAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkKICAgICB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuZGVsZXRlUmVjdXJzaXZlKHRtcGRpcik7Ci0gICAgICAgIH0gY2F0Y2ggKEZTV3JpdGVFcnJvciBlKSB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB0bXBkaXIuZGVsZXRlUmVjdXJzaXZlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEZTV3JpdGVFcnJvciBlKQorICAgICAgICB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICBXZSBmb3JjZSBhIEdDIGhlcmUgdG8gZm9yY2UgYnVmZmVyIGRlYWxsb2NhdGlvbiwgYW5kIHRoZW4gdHJ5IGRlbGV0aW5nIHRoZSBkaXJlY3RvcnkgYWdhaW4uCiAgICAgICAgICAgICAgIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWU6IGh0dHA6Ly9idWdzLmphdmEuY29tL2J1Z2RhdGFiYXNlL3ZpZXdfYnVnLmRvP2J1Z19pZD00NzE1MTU0CiAgICAgICAgICAgICAgIElmIHRoaXMgaXMgbm90IHRoZSBwcm9ibGVtLCB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgcmV0aHJvd24gYW55d2F5LgogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBTeXN0ZW0uZ2MoKTsKLSAgICAgICAgICAgIEZpbGVVdGlscy5kZWxldGVSZWN1cnNpdmUodG1wZGlyKTsKKyAgICAgICAgICAgIHRtcGRpci5kZWxldGVSZWN1cnNpdmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKFN0cmluZ1tdIGtleXNwYWNlVGFibGUgOiBuZXcgU3RyaW5nW11bXSB7IHtLRVlTUEFDRTEsIENGX1NUQU5EQVJEMX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtLRVlTUEFDRTEsIENGX1NUQU5EQVJEMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtLRVlTUEFDRTEsIENGX0JBQ0tVUFN9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7S0VZU1BBQ0UyLCBDRl9TVEFOREFSRDF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7S0VZU1BBQ0UyLCBDRl9TVEFOREFSRDJ9fSkKKyAgICAgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLnRydW5jYXRlKGtleXNwYWNlVGFibGVbMF0sIGtleXNwYWNlVGFibGVbMV0pOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmFibGUgdG8gdHJ1bmNhdGUgdGFibGUhIiwgZXgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNTIsOSArMTcwLDExIEBACiAgICAgICAgIGFzc2VydEVxdWFscygxLCBwYXJ0aXRpb25zLnNpemUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygia2V5MSIsIEFzY2lpVHlwZS5pbnN0YW5jZS5nZXRTdHJpbmcocGFydGl0aW9ucy5nZXQoMCkucGFydGl0aW9uS2V5KCkuZ2V0S2V5KCkpKTsKICAgICAgICAgYXNzZXJ0IG1ldGFkYXRhICE9IG51bGw7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyVXRpbC5ieXRlcygiMTAwIiksIHBhcnRpdGlvbnMuZ2V0KDApLmdldFJvdyhDbHVzdGVyaW5nLm1ha2UoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoImNvbDEiKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2VsbChtZXRhZGF0YS5nZXRDb2x1bW4oQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoInZhbCIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWZmZXIoKSk7CisKKyAgICAgICAgUm93IHJvdyA9IHBhcnRpdGlvbnMuZ2V0KDApLmdldFJvdyhDbHVzdGVyaW5nLm1ha2UoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoImNvbDEiKSkpOworICAgICAgICBhc3NlcnQgcm93ICE9IG51bGw7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCIxMDAiKSwgcm93LmdldENlbGwobWV0YWRhdGEuZ2V0Q29sdW1uKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCJ2YWwiKSkpLmJ1ZmZlcigpKTsKIAogICAgICAgICAvLyBUaGUgc3RyZWFtIGZ1dHVyZSBpcyBzaWduYWxsZWQgd2hlbiB0aGUgd29yayBpcyBjb21wbGV0ZSBidXQgYmVmb3JlIHJlbGVhc2luZyByZWZlcmVuY2VzLiBXYWl0IGZvciByZWxlYXNlCiAgICAgICAgIC8vIGJlZm9yZSBjbGVhbnVwIChDQVNTQU5EUkEtMTAxMTgpLgpAQCAtMTcwLDcgKzE5MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbkRpcmVjdG9yeShkYXRhRGlyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9yVGFibGUoU3RyaW5nLmZvcm1hdChzY2hlbWEsIEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkQyKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVzaW5nKFN0cmluZy5mb3JtYXQocXVlcnksIEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkQyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhCdWZmZXJTaXplSW5NQigxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEJ1ZmZlclNpemVJbk1pQigxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKIAogICAgICAgICBpbnQgTkJfUEFSVElUSU9OUyA9IDUwMDA7IC8vIEVub3VnaCB0byB3cml0ZSA+MU1pQiBhbmQgZ2V0IGF0IGxlYXN0IG9uZSBjb21wbGV0ZWQgc3N0YWJsZSBiZWZvcmUgd2UndmUgY2xvc2VkIHRoZSB3cml0ZXIKQEAgLTIxMSwxMCArMjMxLDkgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkaW5nU1NUYWJsZVRvRGlmZmVyZW50S2V5c3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgcHVibGljIHZvaWQgdGVzdExvYWRpbmdTU1RhYmxlVG9EaWZmZXJlbnRLZXlzcGFjZUFuZFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgRmlsZSBkYXRhRGlyID0gbmV3IEZpbGUodG1wZGlyLmFic29sdXRlUGF0aCgpICsgRmlsZS5wYXRoU2VwYXJhdG9yKCkgKyBLRVlTUEFDRTEgKyBGaWxlLnBhdGhTZXBhcmF0b3IoKSArIENGX1NUQU5EQVJEMSk7Ci0gICAgICAgIGFzc2VydCBkYXRhRGlyLnRyeUNyZWF0ZURpcmVjdG9yaWVzKCk7CisgICAgICAgIEZpbGUgZGF0YURpciA9IGRhdGFEaXIoQ0ZfU1RBTkRBUkQxKTsKICAgICAgICAgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSA9IFNjaGVtYS5pbnN0YW5jZS5nZXRUYWJsZU1ldGFkYXRhKEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkQxKTsKIAogICAgICAgICBTdHJpbmcgc2NoZW1hID0gIkNSRUFURSBUQUJMRSAlcy4lcyAoa2V5IGFzY2lpLCBuYW1lIGFzY2lpLCB2YWwgYXNjaWksIHZhbDEgYXNjaWksIFBSSU1BUlkgS0VZIChrZXksIG5hbWUpKSI7CkBAIC0yMzIsNDIgKzI1MSw2MCBAQAogICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0ZfU1RBTkRBUkQxKTsKICAgICAgICAgVXRpbC5mbHVzaChjZnMpOyAvLyB3YWl0IGZvciBzc3RhYmxlcyB0byBiZSBvbiBkaXNrIGVsc2Ugd2Ugd29uJ3QgYmUgYWJsZSB0byBzdHJlYW0gdGhlbQogCi0gICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwotICAgICAgICBTU1RhYmxlTG9hZGVyIGxvYWRlciA9IG5ldyBTU1RhYmxlTG9hZGVyKGRhdGFEaXIsIG5ldyBUZXN0Q2xpZW50KCksIG5ldyBPdXRwdXRIYW5kbGVyLlN5c3RlbU91dHB1dChmYWxzZSwgZmFsc2UpLCAxLCBLRVlTUEFDRTIpOwotICAgICAgICBsb2FkZXIuc3RyZWFtKENvbGxlY3Rpb25zLmVtcHR5U2V0KCksIGNvbXBsZXRpb25TdHJlYW1MaXN0ZW5lcihsYXRjaCkpLmdldCgpOworICAgICAgICBmb3IgKFN0cmluZyB0YWJsZSA6IG5ldyBTdHJpbmdbXSB7IENGX1NUQU5EQVJEMiwgbnVsbCB9KQorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgICAgIFNTVGFibGVMb2FkZXIgbG9hZGVyID0gbmV3IFNTVGFibGVMb2FkZXIoZGF0YURpciwgbmV3IFRlc3RDbGllbnQoKSwgbmV3IE91dHB1dEhhbmRsZXIuU3lzdGVtT3V0cHV0KGZhbHNlLCBmYWxzZSksIDEsIEtFWVNQQUNFMiwgdGFibGUpOworICAgICAgICAgICAgbG9hZGVyLnN0cmVhbShDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCBjb21wbGV0aW9uU3RyZWFtTGlzdGVuZXIobGF0Y2gpKS5nZXQoKTsKIAotICAgICAgICBjZnMgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMikuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0ZfU1RBTkRBUkQxKTsKLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOworICAgICAgICAgICAgU3RyaW5nIHRhcmdldFRhYmxlID0gdGFibGUgPT0gbnVsbCA/IENGX1NUQU5EQVJEMSA6IHRhYmxlOworICAgICAgICAgICAgY2ZzID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRTIpLmdldENvbHVtbkZhbWlseVN0b3JlKHRhcmdldFRhYmxlKTsKKyAgICAgICAgICAgIFV0aWwuZmx1c2goY2ZzKTsKIAotICAgICAgICBMaXN0PEZpbHRlcmVkUGFydGl0aW9uPiBwYXJ0aXRpb25zID0gVXRpbC5nZXRBbGwoVXRpbC5jbWQoY2ZzKS5idWlsZCgpKTsKKyAgICAgICAgICAgIExpc3Q8RmlsdGVyZWRQYXJ0aXRpb24+IHBhcnRpdGlvbnMgPSBVdGlsLmdldEFsbChVdGlsLmNtZChjZnMpLmJ1aWxkKCkpOwogCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBwYXJ0aXRpb25zLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygia2V5MSIsIEFzY2lpVHlwZS5pbnN0YW5jZS5nZXRTdHJpbmcocGFydGl0aW9ucy5nZXQoMCkucGFydGl0aW9uS2V5KCkuZ2V0S2V5KCkpKTsKLSAgICAgICAgYXNzZXJ0IG1ldGFkYXRhICE9IG51bGw7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyVXRpbC5ieXRlcygiMTAwIiksIHBhcnRpdGlvbnMuZ2V0KDApLmdldFJvdyhDbHVzdGVyaW5nLm1ha2UoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoImNvbDEiKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2VsbChtZXRhZGF0YS5nZXRDb2x1bW4oQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoInZhbCIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWZmZXIoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcGFydGl0aW9ucy5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJrZXkxIiwgQXNjaWlUeXBlLmluc3RhbmNlLmdldFN0cmluZyhwYXJ0aXRpb25zLmdldCgwKS5wYXJ0aXRpb25LZXkoKS5nZXRLZXkoKSkpOworICAgICAgICAgICAgYXNzZXJ0IG1ldGFkYXRhICE9IG51bGw7CiAKLSAgICAgICAgLy8gVGhlIHN0cmVhbSBmdXR1cmUgaXMgc2lnbmFsbGVkIHdoZW4gdGhlIHdvcmsgaXMgY29tcGxldGUgYnV0IGJlZm9yZSByZWxlYXNpbmcgcmVmZXJlbmNlcy4gV2FpdCBmb3IgcmVsZWFzZQotICAgICAgICAvLyBiZWZvcmUgY2xlYW51cCAoQ0FTU0FORFJBLTEwMTE4KS4KLSAgICAgICAgbGF0Y2guYXdhaXQoKTsKKyAgICAgICAgICAgIFJvdyByb3cgPSBwYXJ0aXRpb25zLmdldCgwKS5nZXRSb3coQ2x1c3RlcmluZy5tYWtlKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCJjb2wxIikpKTsKKyAgICAgICAgICAgIGFzc2VydCByb3cgIT0gbnVsbDsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCIxMDAiKSwgcm93LmdldENlbGwobWV0YWRhdGEuZ2V0Q29sdW1uKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCJ2YWwiKSkpLmJ1ZmZlcigpKTsKKworICAgICAgICAgICAgLy8gVGhlIHN0cmVhbSBmdXR1cmUgaXMgc2lnbmFsbGVkIHdoZW4gdGhlIHdvcmsgaXMgY29tcGxldGUgYnV0IGJlZm9yZSByZWxlYXNpbmcgcmVmZXJlbmNlcy4gV2FpdCBmb3IgcmVsZWFzZQorICAgICAgICAgICAgLy8gYmVmb3JlIGNsZWFudXAgKENBU1NBTkRSQS0xMDExOCkuCisgICAgICAgICAgICBsYXRjaC5hd2FpdCgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZGluZ0JhY2t1cHNUYWJsZSgpIHRocm93cyBFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIHRlc3RMb2FkaW5nVGFibGUoQ0ZfQkFDS1VQUyk7CisgICAgICAgIHRlc3RMb2FkaW5nVGFibGUoQ0ZfQkFDS1VQUywgZmFsc2UpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdExvYWRpbmdTbmFwc2hvdHNUYWJsZSgpIHRocm93cyBFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIHRlc3RMb2FkaW5nVGFibGUoQ0ZfU05BUFNIT1RTKTsKKyAgICAgICAgdGVzdExvYWRpbmdUYWJsZShDRl9TTkFQU0hPVFMsIGZhbHNlKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgdGVzdExvYWRpbmdUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZGluZ0xlZ2FjeUJhY2t1cHNUYWJsZSgpIHRocm93cyBFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIEZpbGUgZGF0YURpciA9IGRhdGFEaXIodGFibGVOYW1lKTsKKyAgICAgICAgdGVzdExvYWRpbmdUYWJsZShDRl9CQUNLVVBTLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkaW5nTGVnYWN5U25hcHNob3RzVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICB0ZXN0TG9hZGluZ1RhYmxlKENGX1NOQVBTSE9UUywgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RMb2FkaW5nVGFibGUoU3RyaW5nIHRhYmxlTmFtZSwgYm9vbGVhbiBpc0xlZ2FjeVRhYmxlKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBGaWxlIGRhdGFEaXIgPSBkYXRhRGlyKHRhYmxlTmFtZSwgaXNMZWdhY3lUYWJsZSk7CiAgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEgPSBTY2hlbWEuaW5zdGFuY2UuZ2V0VGFibGVNZXRhZGF0YShLRVlTUEFDRTEsIHRhYmxlTmFtZSk7CiAKICAgICAgICAgdHJ5IChDUUxTU1RhYmxlV3JpdGVyIHdyaXRlciA9IENRTFNTVGFibGVXcml0ZXIuYnVpbGRlcigpCkBAIC0yOTEsOSArMzI4LDExIEBACiAgICAgICAgIGFzc2VydEVxdWFscygxLCBwYXJ0aXRpb25zLnNpemUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygia2V5IiwgQXNjaWlUeXBlLmluc3RhbmNlLmdldFN0cmluZyhwYXJ0aXRpb25zLmdldCgwKS5wYXJ0aXRpb25LZXkoKS5nZXRLZXkoKSkpOwogICAgICAgICBhc3NlcnQgbWV0YWRhdGEgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCIxMDAiKSwgcGFydGl0aW9ucy5nZXQoMCkuZ2V0Um93KENsdXN0ZXJpbmcubWFrZShCeXRlQnVmZmVyVXRpbC5ieXRlcygiY29sMSIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDZWxsKG1ldGFkYXRhLmdldENvbHVtbihCeXRlQnVmZmVyVXRpbC5ieXRlcygidmFsIikpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1ZmZlcigpKTsKKworICAgICAgICBSb3cgcm93ID0gcGFydGl0aW9ucy5nZXQoMCkuZ2V0Um93KENsdXN0ZXJpbmcubWFrZShCeXRlQnVmZmVyVXRpbC5ieXRlcygiY29sMSIpKSk7CisgICAgICAgIGFzc2VydCByb3cgIT0gbnVsbDsKKworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjEwMCIpLCByb3cuZ2V0Q2VsbChtZXRhZGF0YS5nZXRDb2x1bW4oQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoInZhbCIpKSkuYnVmZmVyKCkpOwogCiAgICAgICAgIC8vIFRoZSBzdHJlYW0gZnV0dXJlIGlzIHNpZ25hbGxlZCB3aGVuIHRoZSB3b3JrIGlzIGNvbXBsZXRlIGJ1dCBiZWZvcmUgcmVsZWFzaW5nIHJlZmVyZW5jZXMuIFdhaXQgZm9yIHJlbGVhc2UKICAgICAgICAgLy8gYmVmb3JlIGNsZWFudXAgKENBU1NBTkRSQS0xMDExOCkuCkBAIC0zMDIsNyArMzQxLDE0IEBACiAKICAgICBwcml2YXRlIEZpbGUgZGF0YURpcihTdHJpbmcgY2YpCiAgICAgewotICAgICAgICBGaWxlIGRhdGFEaXIgPSBuZXcgRmlsZSh0bXBkaXIuYWJzb2x1dGVQYXRoKCkgKyBGaWxlLnBhdGhTZXBhcmF0b3IoKSArIFNTVGFibGVMb2FkZXJUZXN0LktFWVNQQUNFMSArIEZpbGUucGF0aFNlcGFyYXRvcigpICsgY2YpOworICAgICAgICByZXR1cm4gZGF0YURpcihjZiwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgRmlsZSBkYXRhRGlyKFN0cmluZyBjZiwgYm9vbGVhbiBpc0xlZ2FjeVRhYmxlKQorICAgIHsKKyAgICAgICAgLy8gQWRkIC17dGFibGVVdWlkfSBzdWZmaXggdG8gdGFibGUgZGlyIGlmIG5vdCBhIGxlZ2FjeSB0YWJsZQorICAgICAgICBGaWxlIGRhdGFEaXIgPSBuZXcgRmlsZSh0bXBkaXIuYWJzb2x1dGVQYXRoKCkgKyBGaWxlLnBhdGhTZXBhcmF0b3IoKSArIFNTVGFibGVMb2FkZXJUZXN0LktFWVNQQUNFMSArIEZpbGUucGF0aFNlcGFyYXRvcigpICsgY2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoaXNMZWdhY3lUYWJsZSA/ICIiIDogU3RyaW5nLmZvcm1hdCgiLSVzIixUYWJsZUlkLmdlbmVyYXRlKCkudG9IZXhTdHJpbmcoKSkpKTsKICAgICAgICAgYXNzZXJ0IGRhdGFEaXIudHJ5Q3JlYXRlRGlyZWN0b3JpZXMoKTsKICAgICAgICAgLy9tYWtlIHN1cmUgd2UgaGF2ZSBubyB0YWJsZXMuLi4KICAgICAgICAgYXNzZXJ0RXF1YWxzKE9iamVjdHMucmVxdWlyZU5vbk51bGwoZGF0YURpci50cnlMaXN0KCkpLmxlbmd0aCwgMCk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlTWV0YWRhdGFUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlTWV0YWRhdGFUZXN0LmphdmEKaW5kZXggMmU1YTE3YS4uMjE1ZjAyZSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZU1ldGFkYXRhVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVNZXRhZGF0YVRlc3QuamF2YQpAQCAtMTcsOCArMTcsMTAgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOwogCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CkBAIC0yNiw3ICsyOCw2IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dVcGRhdGVCdWlsZGVyOwpAQCAtMzQsOSArMzUsMTEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludGVnZXJUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIHB1YmxpYyBjbGFzcyBTU1RhYmxlTWV0YWRhdGFUZXN0CkBAIC0yMTYsMTEgKzIxOSwxMSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3RvcmUuZ2V0TGl2ZVNTVGFibGVzKCkuc2l6ZSgpKTsKICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzdG9yZS5nZXRMaXZlU1NUYWJsZXMoKSkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXJVdGlsLnN0cmluZyhzc3RhYmxlLmdldFNTVGFibGVNZXRhZGF0YSgpLm1pbkNsdXN0ZXJpbmdWYWx1ZXMuZ2V0KDApKSwgIjBjb2wxMDAiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyVXRpbC5zdHJpbmcoc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5tYXhDbHVzdGVyaW5nVmFsdWVzLmdldCgwKSksICI3Y29sMTQ5Iik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlclV0aWwuc3RyaW5nKHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuY292ZXJlZENsdXN0ZXJpbmcuc3RhcnQoKS5idWZmZXJBdCgwKSksICIwY29sMTAwIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlclV0aWwuc3RyaW5nKHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuY292ZXJlZENsdXN0ZXJpbmcuZW5kKCkuYnVmZmVyQXQoMCkpLCAiN2NvbDE0OSIpOwogICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBjbHVzdGVyaW5nIHZhbHVlcyBhcmUgbWluaW1pc2VkCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkubWluQ2x1c3RlcmluZ1ZhbHVlcy5nZXQoMCkuY2FwYWNpdHkoKSA8IDUwKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5tYXhDbHVzdGVyaW5nVmFsdWVzLmdldCgwKS5jYXBhY2l0eSgpIDwgNTApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzc3RhYmxlLmdldFNTVGFibGVNZXRhZGF0YSgpLmNvdmVyZWRDbHVzdGVyaW5nLnN0YXJ0KCkuYnVmZmVyQXQoMCkuY2FwYWNpdHkoKSA8IDUwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5jb3ZlcmVkQ2x1c3RlcmluZy5lbmQoKS5idWZmZXJBdCgwKS5jYXBhY2l0eSgpIDwgNTApOwogICAgICAgICB9CiAgICAgICAgIFN0cmluZyBrZXkgPSAicm93MiI7CiAKQEAgLTIzOCw2MiArMjQxLDQyIEBACiAgICAgICAgIGFzc2VydEVxdWFscygxLCBzdG9yZS5nZXRMaXZlU1NUYWJsZXMoKS5zaXplKCkpOwogICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHN0b3JlLmdldExpdmVTU1RhYmxlcygpKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlclV0aWwuc3RyaW5nKHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkubWluQ2x1c3RlcmluZ1ZhbHVlcy5nZXQoMCkpLCAiMGNvbDEwMCIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXJVdGlsLnN0cmluZyhzc3RhYmxlLmdldFNTVGFibGVNZXRhZGF0YSgpLm1heENsdXN0ZXJpbmdWYWx1ZXMuZ2V0KDApKSwgIjljb2wyOTgiKTsKLSAgICAgICAgICAgIC8vIGFuZCBtYWtlIHN1cmUgdGhlIGNsdXN0ZXJpbmcgdmFsdWVzIGFyZSBzdGlsbCBtaW5pbWlzZWQgYWZ0ZXIgY29tcGFjdGlvbgotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzc3RhYmxlLmdldFNTVGFibGVNZXRhZGF0YSgpLm1pbkNsdXN0ZXJpbmdWYWx1ZXMuZ2V0KDApLmNhcGFjaXR5KCkgPCA1MCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkubWF4Q2x1c3RlcmluZ1ZhbHVlcy5nZXQoMCkuY2FwYWNpdHkoKSA8IDUwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyVXRpbC5zdHJpbmcoc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5jb3ZlcmVkQ2x1c3RlcmluZy5zdGFydCgpLmJ1ZmZlckF0KDApKSwgIjBjb2wxMDAiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyVXRpbC5zdHJpbmcoc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5jb3ZlcmVkQ2x1c3RlcmluZy5lbmQoKS5idWZmZXJBdCgwKSksICI5Y29sMjk4Iik7CisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgc3RhdHMgZG9uJ3QgcmVmZXJlbmNlIG5hdGl2ZSBvciBvZmYtaGVhcCBkYXRhCisgICAgICAgICAgICBhc3NlcnRCdWZmZXJzQXJlUmV0YWluYWJsZShBcnJheXMuYXNMaXN0KHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuY292ZXJlZENsdXN0ZXJpbmcuc3RhcnQoKS5nZXRCdWZmZXJBcnJheSgpKSk7CisgICAgICAgICAgICBhc3NlcnRCdWZmZXJzQXJlUmV0YWluYWJsZShBcnJheXMuYXNMaXN0KHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuY292ZXJlZENsdXN0ZXJpbmcuZW5kKCkuZ2V0QnVmZmVyQXJyYXkoKSkpOworICAgICAgICB9CisKKyAgICAgICAga2V5ID0gInJvdzMiOworICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihzdG9yZS5tZXRhZGF0YSgpLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwga2V5KQorICAgICAgICAgICAgLmFkZFJhbmdlVG9tYnN0b25lKCIwIiwgIjciKQorICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgICAgIC5hcHBseSgpOworCisgICAgICAgIHN0b3JlLmZvcmNlQmxvY2tpbmdGbHVzaChDb2x1bW5GYW1pbHlTdG9yZS5GbHVzaFJlYXNvbi5VTklUX1RFU1RTKTsKKyAgICAgICAgc3RvcmUuZm9yY2VNYWpvckNvbXBhY3Rpb24oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN0b3JlLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CisgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3RvcmUuZ2V0TGl2ZVNTVGFibGVzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyVXRpbC5zdHJpbmcoc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5jb3ZlcmVkQ2x1c3RlcmluZy5zdGFydCgpLmJ1ZmZlckF0KDApKSwgIjAiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyVXRpbC5zdHJpbmcoc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5jb3ZlcmVkQ2x1c3RlcmluZy5lbmQoKS5idWZmZXJBdCgwKSksICI5Y29sMjk4Iik7CisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgc3RhdHMgZG9uJ3QgcmVmZXJlbmNlIG5hdGl2ZSBvciBvZmYtaGVhcCBkYXRhCisgICAgICAgICAgICBhc3NlcnRCdWZmZXJzQXJlUmV0YWluYWJsZShBcnJheXMuYXNMaXN0KHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuY292ZXJlZENsdXN0ZXJpbmcuc3RhcnQoKS5nZXRCdWZmZXJBcnJheSgpKSk7CisgICAgICAgICAgICBhc3NlcnRCdWZmZXJzQXJlUmV0YWluYWJsZShBcnJheXMuYXNMaXN0KHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuY292ZXJlZENsdXN0ZXJpbmcuZW5kKCkuZ2V0QnVmZmVyQXJyYXkoKSkpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLypAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RMZWdhY3lDb3VudGVyU2hhcmRUcmFja2luZygpCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEJ1ZmZlcnNBcmVSZXRhaW5hYmxlKExpc3Q8Qnl0ZUJ1ZmZlcj4gYnVmZmVycykKICAgICB7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UxKS5nZXRDb2x1bW5GYW1pbHlTdG9yZSgiQ291bnRlcjEiKTsKKyAgICAgICAgZm9yIChCeXRlQnVmZmVyIGIgOiBidWZmZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShiLmlzRGlyZWN0KCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiLmhhc0FycmF5KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGIuY2FwYWNpdHkoKSwgYi5yZW1haW5pbmcoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYi5hcnJheU9mZnNldCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhiLmNhcGFjaXR5KCksIGIuYXJyYXkoKS5sZW5ndGgpOworICAgICAgICB9CisgICAgfQogCi0gICAgICAgIC8vIEEgY2VsbCB3aXRoIGFsbCBzaGFyZHMKLSAgICAgICAgQ291bnRlckNvbnRleHQuQ29udGV4dFN0YXRlIHN0YXRlID0gQ291bnRlckNvbnRleHQuQ29udGV4dFN0YXRlLmFsbG9jYXRlKDEsIDEsIDEpOwotICAgICAgICBzdGF0ZS53cml0ZUdsb2JhbChDb3VudGVySWQuZnJvbUludCgxKSwgMUwsIDFMKTsKLSAgICAgICAgc3RhdGUud3JpdGVMb2NhbChDb3VudGVySWQuZnJvbUludCgyKSwgMUwsIDFMKTsKLSAgICAgICAgc3RhdGUud3JpdGVSZW1vdGUoQ291bnRlcklkLmZyb21JbnQoMyksIDFMLCAxTCk7Ci0KLSAgICAgICAgQ29sdW1uRmFtaWx5IGNlbGxzID0gQXJyYXlCYWNrZWRTb3J0ZWRDb2x1bW5zLmZhY3RvcnkuY3JlYXRlKGNmcy5tZXRhZGF0YSk7Ci0gICAgICAgIGNlbGxzLmFkZENvbHVtbihuZXcgQnVmZmVyQ291bnRlckNlbGwoY2VsbG5hbWUoImNvbCIpLCBzdGF0ZS5jb250ZXh0LCAxTCwgTG9uZy5NSU5fVkFMVUUpKTsKLSAgICAgICAgbmV3IE11dGF0aW9uKFV0aWwuZGsoImsiKS5nZXRLZXkoKSwgY2VsbHMpLmFwcGx5VW5zYWZlKCk7Ci0gICAgICAgIFV0aWwuZmx1c2goY2ZzKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuaGFzTGVnYWN5Q291bnRlclNoYXJkcyk7Ci0gICAgICAgIGNmcy50cnVuY2F0ZUJsb2NraW5nKCk7Ci0KLSAgICAgICAgLy8gQSBjZWxsIHdpdGggZ2xvYmFsIGFuZCByZW1vdGUgc2hhcmRzCi0gICAgICAgIHN0YXRlID0gQ291bnRlckNvbnRleHQuQ29udGV4dFN0YXRlLmFsbG9jYXRlKDAsIDEsIDEpOwotICAgICAgICBzdGF0ZS53cml0ZUxvY2FsKENvdW50ZXJJZC5mcm9tSW50KDIpLCAxTCwgMUwpOwotICAgICAgICBzdGF0ZS53cml0ZVJlbW90ZShDb3VudGVySWQuZnJvbUludCgzKSwgMUwsIDFMKTsKLSAgICAgICAgY2VsbHMgPSBBcnJheUJhY2tlZFNvcnRlZENvbHVtbnMuZmFjdG9yeS5jcmVhdGUoY2ZzLm1ldGFkYXRhKTsKLSAgICAgICAgY2VsbHMuYWRkQ29sdW1uKG5ldyBCdWZmZXJDb3VudGVyQ2VsbChjZWxsbmFtZSgiY29sIiksIHN0YXRlLmNvbnRleHQsIDFMLCBMb25nLk1JTl9WQUxVRSkpOwotICAgICAgICBuZXcgTXV0YXRpb24oVXRpbC5kaygiayIpLmdldEtleSgpLCBjZWxscykuYXBwbHlVbnNhZmUoKTsKLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotICAgICAgICBhc3NlcnRUcnVlKGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5oYXNMZWdhY3lDb3VudGVyU2hhcmRzKTsKLSAgICAgICAgY2ZzLnRydW5jYXRlQmxvY2tpbmcoKTsKLQotICAgICAgICAvLyBBIGNlbGwgd2l0aCBnbG9iYWwgYW5kIGxvY2FsIHNoYXJkcwotICAgICAgICBzdGF0ZSA9IENvdW50ZXJDb250ZXh0LkNvbnRleHRTdGF0ZS5hbGxvY2F0ZSgxLCAxLCAwKTsKLSAgICAgICAgc3RhdGUud3JpdGVHbG9iYWwoQ291bnRlcklkLmZyb21JbnQoMSksIDFMLCAxTCk7Ci0gICAgICAgIHN0YXRlLndyaXRlTG9jYWwoQ291bnRlcklkLmZyb21JbnQoMiksIDFMLCAxTCk7Ci0gICAgICAgIGNlbGxzID0gQXJyYXlCYWNrZWRTb3J0ZWRDb2x1bW5zLmZhY3RvcnkuY3JlYXRlKGNmcy5tZXRhZGF0YSk7Ci0gICAgICAgIGNlbGxzLmFkZENvbHVtbihuZXcgQnVmZmVyQ291bnRlckNlbGwoY2VsbG5hbWUoImNvbCIpLCBzdGF0ZS5jb250ZXh0LCAxTCwgTG9uZy5NSU5fVkFMVUUpKTsKLSAgICAgICAgbmV3IE11dGF0aW9uKFV0aWwuZGsoImsiKS5nZXRLZXkoKSwgY2VsbHMpLmFwcGx5VW5zYWZlKCk7Ci0gICAgICAgIFV0aWwuZmx1c2goY2ZzKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuaGFzTGVnYWN5Q291bnRlclNoYXJkcyk7Ci0gICAgICAgIGNmcy50cnVuY2F0ZUJsb2NraW5nKCk7Ci0KLSAgICAgICAgLy8gQSBjZWxsIHdpdGggZ2xvYmFsIG9ubHkKLSAgICAgICAgc3RhdGUgPSBDb3VudGVyQ29udGV4dC5Db250ZXh0U3RhdGUuYWxsb2NhdGUoMSwgMCwgMCk7Ci0gICAgICAgIHN0YXRlLndyaXRlR2xvYmFsKENvdW50ZXJJZC5mcm9tSW50KDEpLCAxTCwgMUwpOwotICAgICAgICBjZWxscyA9IEFycmF5QmFja2VkU29ydGVkQ29sdW1ucy5mYWN0b3J5LmNyZWF0ZShjZnMubWV0YWRhdGEpOwotICAgICAgICBjZWxscy5hZGRDb2x1bW4obmV3IEJ1ZmZlckNvdW50ZXJDZWxsKGNlbGxuYW1lKCJjb2wiKSwgc3RhdGUuY29udGV4dCwgMUwsIExvbmcuTUlOX1ZBTFVFKSk7Ci0gICAgICAgIG5ldyBNdXRhdGlvbihVdGlsLmRrKCJrIikuZ2V0S2V5KCksIGNlbGxzKS5hcHBseVVuc2FmZSgpOwotICAgICAgICBVdGlsLmZsdXNoKGNmcyk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5oYXNMZWdhY3lDb3VudGVyU2hhcmRzKTsKLSAgICAgICAgY2ZzLnRydW5jYXRlQmxvY2tpbmcoKTsKLSAgICB9ICovCi19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVJlYWRlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVSZWFkZXJUZXN0LmphdmEKaW5kZXggZjA2NGYxOS4uNWE4MmJjMyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVJlYWRlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlUmVhZGVyVGVzdC5qYXZhCkBAIC0yMCwyMiArMjAsMzggQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKLWltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5PcGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVW50eXBlZFJlc3VsdFNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVhZENvbW1hbmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVhZEV4ZWN1dGlvbkNvbnRyb2xsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93VXBkYXRlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TeXN0ZW1LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CkBAIC00OSwyMSArNjUsMzUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguSW5kZXg7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNSZWFkRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuQ29tcHJlc3Npb25JbmZvQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0LkNvbXBvbmVudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5JbmRleFN1bW1hcnlDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpLkJ0aUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeS5JbmRleFN1bW1hcnlTdXBwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUua2V5Y2FjaGUuS2V5Q2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5rZXljYWNoZS5LZXlDYWNoZVN1cHBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZURhdGFJbnB1dDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLk1tYXBwZWRSZWdpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUGFnZUF3YXJlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5DYWNoaW5nUGFyYW1zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wcmVzc2lvblBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DYWNoZVNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRmlsdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOwogCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVJbnRlcm5hbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CiAKIHB1YmxpYyBjbGFzcyBTU1RhYmxlUmVhZGVyVGVzdAogewpAQCAtODEsNyArMTExLDcgQEAKIAogICAgIFRva2VuIHQoaW50IGkpCiAgICAgewotICAgICAgICByZXR1cm4gcGFydGl0aW9uZXIuZ2V0VG9rZW4oQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoU3RyaW5nLnZhbHVlT2YoaSkpKTsKKyAgICAgICAgcmV0dXJuIHBhcnRpdGlvbmVyLmdldFRva2VuKGtleUZvcihpKSk7CiAgICAgfQogCiAgICAgQEJlZm9yZUNsYXNzCkBAIC0xNTIsNyArMTgyLDcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3Bhbm5lZEluZGV4UG9zaXRpb25zKCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBpbnQgb3JpZ2luYWxNYXhTZWdtZW50U2l6ZSA9IE1tYXBwZWRSZWdpb25zLk1BWF9TRUdNRU5UX1NJWkU7Ci0gICAgICAgIE1tYXBwZWRSZWdpb25zLk1BWF9TRUdNRU5UX1NJWkUgPSA0MDsgLy8gZWFjaCBpbmRleCBlbnRyeSBpcyB+MTEgYnl0ZXMsIHNvIHRoaXMgd2lsbCBnZW5lcmF0ZSBsb3RzIG9mIHNlZ21lbnRzCisgICAgICAgIE1tYXBwZWRSZWdpb25zLk1BWF9TRUdNRU5UX1NJWkUgPSBQYWdlQXdhcmUuUEFHRV9TSVpFOwogCiAgICAgICAgIHRyeQogICAgICAgICB7CkBAIC0xNjAsNyArMTkwLDcgQEAKICAgICAgICAgICAgIHBhcnRpdGlvbmVyID0gc3RvcmUuZ2V0UGFydGl0aW9uZXIoKTsKIAogICAgICAgICAgICAgLy8gaW5zZXJ0IGEgYnVuY2ggb2YgZGF0YSBhbmQgY29tcGFjdCB0byBhIHNpbmdsZSBzc3RhYmxlCi0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwMDsgaiArPSAyKQorICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMDAwMDsgaiArPSAyKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG5ldyBSb3dVcGRhdGVCdWlsZGVyKHN0b3JlLm1ldGFkYXRhKCksIGosIFN0cmluZy52YWx1ZU9mKGopKQogICAgICAgICAgICAgICAgIC5jbHVzdGVyaW5nKCIwIikKQEAgLTE3MywxOSArMjAzLDE5IEBACiAKICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgYWxsIG91ciBrZXlzIGFyZSBmb3VuZCBjb3JyZWN0bHkKICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IHN0b3JlLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMDA7IGogKz0gMikKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTAwMDA7IGogKz0gMikKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgZGsgPSBVdGlsLmRrKFN0cmluZy52YWx1ZU9mKGopKTsKLSAgICAgICAgICAgICAgICBGaWxlRGF0YUlucHV0IGZpbGUgPSBzc3RhYmxlLmdldEZpbGVEYXRhSW5wdXQoc3N0YWJsZS5nZXRQb3NpdGlvbihkaywgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSkucG9zaXRpb24pOworICAgICAgICAgICAgICAgIEZpbGVEYXRhSW5wdXQgZmlsZSA9IHNzdGFibGUuZ2V0RmlsZURhdGFJbnB1dChzc3RhYmxlLmdldFBvc2l0aW9uKGRrLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKSk7CiAgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleUluRGlzayA9IHNzdGFibGUuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChmaWxlKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGtleUluRGlzay5lcXVhbHMoZGspIDogU3RyaW5nLmZvcm1hdCgiJXMgIT0gJXMgaW4gJXMiLCBrZXlJbkRpc2ssIGRrLCBmaWxlLmdldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGtleUluRGlzay5lcXVhbHMoZGspIDogZm9ybWF0KCIlcyAhPSAlcyBpbiAlcyIsIGtleUluRGlzaywgZGssIGZpbGUuZ2V0UGF0aCgpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gY2hlY2sgbm8gZmFsc2UgcG9zaXRpdmVzCi0gICAgICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8IDExMDsgaiArPSAyKQorICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCAxMTAwMDsgaiArPSAyKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBkayA9IFV0aWwuZGsoU3RyaW5nLnZhbHVlT2YoaikpOwotICAgICAgICAgICAgICAgIGFzc2VydCBzc3RhYmxlLmdldFBvc2l0aW9uKGRrLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKSA9PSBudWxsOworICAgICAgICAgICAgICAgIGFzc2VydCBzc3RhYmxlLmdldFBvc2l0aW9uKGRrLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKSA8IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZmluYWxseQpAQCAtMjM4LDE1ICsyNjgsNDEgQEAKIAogICAgICAgICBVdGlsLmZsdXNoKHN0b3JlKTsKIAotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBzdG9yZS5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHNzdGFibGUuZ2V0UmVhZE1ldGVyKCkuY291bnQoKSk7CisgICAgICAgIGJvb2xlYW4gc3RhcnRTdGF0ZSA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU3RhYmxlUmVhZFJhdGVQZXJzaXN0ZW5jZUVuYWJsZWQoKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRTU3RhYmxlUmVhZFJhdGVQZXJzaXN0ZW5jZUVuYWJsZWQodHJ1ZSk7CiAKLSAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IHNzdGFibGUuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjQiKSk7Ci0gICAgICAgIFV0aWwuZ2V0QWxsKFV0aWwuY21kKHN0b3JlLCBrZXkpLmJ1aWxkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZS5nZXRSZWFkTWV0ZXIoKS5jb3VudCgpKTsKKyAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IHN0b3JlLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHNzdGFibGUuZ2V0UmVhZE1ldGVyKCkuY291bnQoKSk7CiAKLSAgICAgICAgVXRpbC5nZXRBbGwoVXRpbC5jbWQoc3RvcmUsIGtleSkuaW5jbHVkZVJvdygiMCIpLmJ1aWxkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc3N0YWJsZS5nZXRSZWFkTWV0ZXIoKS5jb3VudCgpKTsKKyAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBzc3RhYmxlLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCI0IikpOworICAgICAgICAgICAgVXRpbC5nZXRBbGwoVXRpbC5jbWQoc3RvcmUsIGtleSkuYnVpbGQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZS5nZXRSZWFkTWV0ZXIoKS5jb3VudCgpKTsKKworICAgICAgICAgICAgVXRpbC5nZXRBbGwoVXRpbC5jbWQoc3RvcmUsIGtleSkuaW5jbHVkZVJvdygiMCIpLmJ1aWxkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHNzdGFibGUuZ2V0UmVhZE1ldGVyKCkuY291bnQoKSk7CisKKyAgICAgICAgICAgIC8vIFdpdGggcGVyc2lzdGVuY2UgZW5hYmxlZCwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gcmV0cmlldmUgdGhlIHN0YXRlIG9mIHRoZSBtZXRlci4KKyAgICAgICAgICAgIHNzdGFibGUubWF5YmVQZXJzaXN0U1NUYWJsZVJlYWRNZXRlcigpOworCisgICAgICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IG1ldGVyID0gU3lzdGVtS2V5c3BhY2UucmVhZFNTVGFibGVBY3Rpdml0eShzdG9yZS5rZXlzcGFjZS5nZXROYW1lKCksIHN0b3JlLm5hbWUsIHNzdGFibGUuZGVzY3JpcHRvci5pZCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShtZXRlci5pc0VtcHR5KCkpOworCisgICAgICAgICAgICBVdGlsLmdldEFsbChVdGlsLmNtZChzdG9yZSwga2V5KS5pbmNsdWRlUm93KCIwIikuYnVpbGQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgc3N0YWJsZS5nZXRSZWFkTWV0ZXIoKS5jb3VudCgpKTsKKworICAgICAgICAgICAgLy8gQWZ0ZXIgY2xlYW5pbmcgZXhpc3Rpbmcgc3RhdGUgYW5kIGRpc2FibGluZyBwZXJzaXN0ZW5jZSwgdGhlcmUgc2hvdWxkIGJlIG5vIG1ldGVyIHN0YXRlIHRvIHJlYWQuCisgICAgICAgICAgICBTeXN0ZW1LZXlzcGFjZS5jbGVhclNTVGFibGVSZWFkTWV0ZXIoc3RvcmUua2V5c3BhY2UuZ2V0TmFtZSgpLCBzdG9yZS5uYW1lLCBzc3RhYmxlLmRlc2NyaXB0b3IuaWQpOworICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFNTdGFibGVSZWFkUmF0ZVBlcnNpc3RlbmNlRW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICBzc3RhYmxlLm1heWJlUGVyc2lzdFNTVGFibGVSZWFkTWV0ZXIoKTsKKyAgICAgICAgICAgIG1ldGVyID0gU3lzdGVtS2V5c3BhY2UucmVhZFNTVGFibGVBY3Rpdml0eShzdG9yZS5rZXlzcGFjZS5nZXROYW1lKCksIHN0b3JlLm5hbWUsIHNzdGFibGUuZGVzY3JpcHRvci5pZCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1ldGVyLmlzRW1wdHkoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0U1N0YWJsZVJlYWRSYXRlUGVyc2lzdGVuY2VFbmFibGVkKHN0YXJ0U3RhdGUpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTI3MSwxMCArMzI3LDEwIEBACiAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLnBlcmZvcm1NYXhpbWFsKHN0b3JlLCBmYWxzZSk7CiAKICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gc3RvcmUuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIGxvbmcgcDIgPSBzc3RhYmxlLmdldFBvc2l0aW9uKGsoMiksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpLnBvc2l0aW9uOwotICAgICAgICBsb25nIHAzID0gc3N0YWJsZS5nZXRQb3NpdGlvbihrKDMpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKS5wb3NpdGlvbjsKLSAgICAgICAgbG9uZyBwNiA9IHNzdGFibGUuZ2V0UG9zaXRpb24oayg2KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSkucG9zaXRpb247Ci0gICAgICAgIGxvbmcgcDcgPSBzc3RhYmxlLmdldFBvc2l0aW9uKGsoNyksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpLnBvc2l0aW9uOworICAgICAgICBsb25nIHAyID0gc3N0YWJsZS5nZXRQb3NpdGlvbihkaygyKSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgIGxvbmcgcDMgPSBzc3RhYmxlLmdldFBvc2l0aW9uKGRrKDMpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKTsKKyAgICAgICAgbG9uZyBwNiA9IHNzdGFibGUuZ2V0UG9zaXRpb24oZGsoNiksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOworICAgICAgICBsb25nIHA3ID0gc3N0YWJsZS5nZXRQb3NpdGlvbihkayg3KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CiAKICAgICAgICAgU1NUYWJsZVJlYWRlci5QYXJ0aXRpb25Qb3NpdGlvbkJvdW5kcyBwID0gc3N0YWJsZS5nZXRQb3NpdGlvbnNGb3JSYW5nZXMobWFrZVJhbmdlcyh0KDIpLCB0KDYpKSkuZ2V0KDApOwogCkBAIC0zMDcsNiArMzYzLDcgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQb3NpdGlvbnNLZXlDYWNoZVN0YXRzKCkKICAgICB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKEtleUNhY2hlU3VwcG9ydC5pc1N1cHBvcnRlZEJ5KERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSkpOwogICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBzdG9yZSA9IGRpc2NhcmRTU1RhYmxlcyhLRVlTUEFDRTEsIENGX1NUQU5EQVJEMik7CiAgICAgICAgIHBhcnRpdGlvbmVyID0gc3RvcmUuZ2V0UGFydGl0aW9uZXIoKTsKICAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLnNldENhcGFjaXR5KDEwMDApOwpAQCAtMzI0LDc0ICszODEsMjA4IEBACiAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLnBlcmZvcm1NYXhpbWFsKHN0b3JlLCBmYWxzZSk7CiAKICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gc3RvcmUuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIEtleUNhY2hlIGtleUNhY2hlID0gKChLZXlDYWNoZVN1cHBvcnQ8Pz4pIHNzdGFibGUpLmdldEtleUNhY2hlKCk7CisgICAgICAgIGFzc3VtZVRydWUoa2V5Q2FjaGUuaXNFbmFibGVkKCkpOwogICAgICAgICAvLyBleGlzdGluZywgbm9uLWNhY2hlZCBrZXkKLSAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihrKDIpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNzdGFibGUuZ2V0S2V5Q2FjaGVSZXF1ZXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3N0YWJsZS5nZXRLZXlDYWNoZUhpdCgpKTsKKyAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihkaygyKSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBrZXlDYWNoZS5nZXRSZXF1ZXN0cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGtleUNhY2hlLmdldEhpdHMoKSk7CiAgICAgICAgIC8vIGV4aXN0aW5nLCBjYWNoZWQga2V5Ci0gICAgICAgIHNzdGFibGUuZ2V0UG9zaXRpb24oaygyKSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBzc3RhYmxlLmdldEtleUNhY2hlUmVxdWVzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNzdGFibGUuZ2V0S2V5Q2FjaGVIaXQoKSk7CisgICAgICAgIHNzdGFibGUuZ2V0UG9zaXRpb24oZGsoMiksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwga2V5Q2FjaGUuZ2V0UmVxdWVzdHMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBrZXlDYWNoZS5nZXRIaXRzKCkpOwogICAgICAgICAvLyBub24tZXhpc3Rpbmcga2V5IChpdCBpcyBzcGVjaWZpY2FsbHkgY2hvc2VuIHRvIG5vdCBiZSByZWplY3RlZCBieSBCbG9vbSBGaWx0ZXIgY2hlY2spCi0gICAgICAgIHNzdGFibGUuZ2V0UG9zaXRpb24oaygxNCksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgc3N0YWJsZS5nZXRLZXlDYWNoZVJlcXVlc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBzc3RhYmxlLmdldEtleUNhY2hlSGl0KCkpOworICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGRrKDE0KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBrZXlDYWNoZS5nZXRSZXF1ZXN0cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGtleUNhY2hlLmdldEhpdHMoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UG9zaXRpb25zQmxvb21GaWx0ZXJTdGF0cygpCiAgICAgeworICAgICAgICBTU1RhYmxlUmVhZGVyV2l0aEZpbHRlciBzc3RhYmxlID0gcHJlcGFyZUdldFBvc2l0aW9ucygpOworCisgICAgICAgIC8vIHRoZSBrZXlzIGFyZSBzcGVjaWZpY2FsbHkgY2hvc2VuIHRvIGNvdmVyIGNlcnRhaW4gdXNlIGNhc2VzCisgICAgICAgIC8vIGV4aXN0aW5nIGtleSBpcyByZWFkIGZyb20gaW5kZXgKKyAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihkayg3KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRUcnVlUG9zaXRpdmVDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHNzdGFibGUuZ2V0RmlsdGVyVHJhY2tlcigpLmdldFRydWVOZWdhdGl2ZUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3N0YWJsZS5nZXRGaWx0ZXJUcmFja2VyKCkuZ2V0RmFsc2VQb3NpdGl2ZUNvdW50KCkpOworCisgICAgICAgIC8vIGV4aXN0aW5nIGtleSBpcyByZWFkIGZyb20gQ2FjaGUgS2V5IChpZiB1c2VkKQorICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGRrKDcpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHNzdGFibGUuZ2V0RmlsdGVyVHJhY2tlcigpLmdldFRydWVQb3NpdGl2ZUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3N0YWJsZS5nZXRGaWx0ZXJUcmFja2VyKCkuZ2V0VHJ1ZU5lZ2F0aXZlQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRGYWxzZVBvc2l0aXZlQ291bnQoKSk7CisKKyAgICAgICAgLy8gbm9uLWV4aXN0aW5nIGtleSBpcyByZWplY3RlZCBieSBCbG9vbSBGaWx0ZXIgY2hlY2sKKyAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihkayg0NSksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOyAgICAvLyBub3RlOiA0NSBmYWxscyBiZXR3ZWVuIDQgYW5kIDUKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHNzdGFibGUuZ2V0RmlsdGVyVHJhY2tlcigpLmdldFRydWVQb3NpdGl2ZUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZS5nZXRGaWx0ZXJUcmFja2VyKCkuZ2V0VHJ1ZU5lZ2F0aXZlQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRGYWxzZVBvc2l0aXZlQ291bnQoKSk7CisKKyAgICAgICAgLy8gR1Qgc2hvdWxkIG5vdCBhZmZlY3QgYmxvb20gZmlsdGVyIGNvdW50cworICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGRrKDU2KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5HRSk7ICAgIC8vIG5vdGU6IDU2IGZhbGxzIGJldHdlZW4gNSBhbmQgNgorICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc3N0YWJsZS5nZXRGaWx0ZXJUcmFja2VyKCkuZ2V0VHJ1ZVBvc2l0aXZlQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRUcnVlTmVnYXRpdmVDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHNzdGFibGUuZ2V0RmlsdGVyVHJhY2tlcigpLmdldEZhbHNlUG9zaXRpdmVDb3VudCgpKTsKKyAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihkayg1NyksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuR1QpOyAgICAvLyBub3RlOiA1NyBmYWxscyBiZXR3ZWVuIDUgYW5kIDYKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHNzdGFibGUuZ2V0RmlsdGVyVHJhY2tlcigpLmdldFRydWVQb3NpdGl2ZUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZS5nZXRGaWx0ZXJUcmFja2VyKCkuZ2V0VHJ1ZU5lZ2F0aXZlQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRGYWxzZVBvc2l0aXZlQ291bnQoKSk7CisKKyAgICAgICAgLy8gbm9uLWV4aXN0aW5nIGtleSBpcyByZWplY3RlZCBieSBzc3RhYmxlIGtleXMgcmFuZ2UgY2hlY2ssIGlmIHBlcmZvcm1lZCwgb3RoZXJ3aXNlIGl0J3MgYSBmYWxzZSBwb3NpdGl2ZQorICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGNvbGxpc2lvbkZvcig5KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRUcnVlUG9zaXRpdmVDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNzdGFibGUuZ2V0RmlsdGVyVHJhY2tlcigpLmdldFRydWVOZWdhdGl2ZUNvdW50KCkpOworICAgICAgICBsb25nIGZwQ291bnQgPSBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRGYWxzZVBvc2l0aXZlQ291bnQoKTsKKworICAgICAgICAvLyBleGlzdGluZyBrZXkgZmlsdGVyZWQgb3V0IGJ5IHNzdGFibGUga2V5cyByYW5nZSBjaGVjaywgcGVyZm9ybWVkIGJlY2F1c2Ugb2YgbW92ZWQgc3RhcnQKKyAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihkaygxKSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRUcnVlUG9zaXRpdmVDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNzdGFibGUuZ2V0RmlsdGVyVHJhY2tlcigpLmdldFRydWVOZWdhdGl2ZUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZnBDb3VudCwgc3N0YWJsZS5nZXRGaWx0ZXJUcmFja2VyKCkuZ2V0RmFsc2VQb3NpdGl2ZUNvdW50KCkpOworICAgICAgICBmcENvdW50ID0gc3N0YWJsZS5nZXRGaWx0ZXJUcmFja2VyKCkuZ2V0RmFsc2VQb3NpdGl2ZUNvdW50KCk7CisKKyAgICAgICAgLy8gbm9uLWV4aXN0aW5nIGtleSBpcyByZWplY3RlZCBieSBpbmRleCBpbnRlcnZhbCBjaGVjaworICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGNvbGxpc2lvbkZvcig1KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRUcnVlUG9zaXRpdmVDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNzdGFibGUuZ2V0RmlsdGVyVHJhY2tlcigpLmdldFRydWVOZWdhdGl2ZUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZnBDb3VudCArIDEsIHNzdGFibGUuZ2V0RmlsdGVyVHJhY2tlcigpLmdldEZhbHNlUG9zaXRpdmVDb3VudCgpKTsKKworICAgICAgICAvLyBub24tZXhpc3Rpbmcga2V5IGlzIHJlamVjdGVkIGJ5IGluZGV4IGxvb2t1cCBjaGVjaworICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGRrKDgwNyksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc3N0YWJsZS5nZXRGaWx0ZXJUcmFja2VyKCkuZ2V0VHJ1ZVBvc2l0aXZlQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRUcnVlTmVnYXRpdmVDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZwQ291bnQgKyAyLCBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRGYWxzZVBvc2l0aXZlQ291bnQoKSk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQb3NpdGlvbnNMaXN0ZW5lckNhbGxzKCkKKyAgICB7CisgICAgICAgIFNTVGFibGVSZWFkZXJXaXRoRmlsdGVyIHNzdGFibGUgPSBwcmVwYXJlR2V0UG9zaXRpb25zKCk7CisKKyAgICAgICAgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXIgPSBNb2NraXRvLm1vY2soU1NUYWJsZVJlYWRzTGlzdGVuZXIuY2xhc3MpOworICAgICAgICAvLyB0aGUga2V5cyBhcmUgc3BlY2lmaWNhbGx5IGNob3NlbiB0byBjb3ZlciBjZXJ0YWluIHVzZSBjYXNlcworICAgICAgICAvLyBleGlzdGluZyBrZXkgaXMgcmVhZCBmcm9tIGluZGV4CisgICAgICAgIHNzdGFibGUuZ2V0UG9zaXRpb24oZGsoNyksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEsIGxpc3RlbmVyKTsKKyAgICAgICAgTW9ja2l0by52ZXJpZnkobGlzdGVuZXIpLm9uU1NUYWJsZVNlbGVjdGVkKHNzdGFibGUsIFNTVGFibGVSZWFkc0xpc3RlbmVyLlNlbGVjdGlvblJlYXNvbi5JTkRFWF9FTlRSWV9GT1VORCk7CisgICAgICAgIE1vY2tpdG8ucmVzZXQobGlzdGVuZXIpOworCisgICAgICAgIC8vIGV4aXN0aW5nIGtleSBpcyByZWFkIGZyb20gQ2FjaGUgS2V5IChpZiB1c2VkKQorICAgICAgICAvLyBOb3RlOiBrZXkgY2FjaGUgbWF5IGZhaWwgdG8gY2FjaGUgdGhlIHBhcnRpdGlvbiBpZiBpdCBpcyB3aWRlLgorICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGRrKDcpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRLCBsaXN0ZW5lcik7CisgICAgICAgIGlmIChzc3RhYmxlIGluc3RhbmNlb2YgQmlnVGFibGVSZWFkZXIpCisgICAgICAgICAgICBNb2NraXRvLnZlcmlmeShsaXN0ZW5lcikub25TU1RhYmxlU2VsZWN0ZWQoc3N0YWJsZSwgU1NUYWJsZVJlYWRzTGlzdGVuZXIuU2VsZWN0aW9uUmVhc29uLktFWV9DQUNIRV9ISVQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBNb2NraXRvLnZlcmlmeShsaXN0ZW5lcikub25TU1RhYmxlU2VsZWN0ZWQoc3N0YWJsZSwgU1NUYWJsZVJlYWRzTGlzdGVuZXIuU2VsZWN0aW9uUmVhc29uLklOREVYX0VOVFJZX0ZPVU5EKTsKKyAgICAgICAgTW9ja2l0by5yZXNldChsaXN0ZW5lcik7CisKKyAgICAgICAgLy8gQXMgYWJvdmUgd2l0aCBvdGhlciBvcHMKKyAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihkayg3KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5HVCwgbGlzdGVuZXIpOyAgICAvLyBHVCBkb2VzIG5vdCBlbmdhZ2Uga2V5IGNhY2hlCisgICAgICAgIE1vY2tpdG8udmVyaWZ5KGxpc3RlbmVyKS5vblNTVGFibGVTZWxlY3RlZChzc3RhYmxlLCBTU1RhYmxlUmVhZHNMaXN0ZW5lci5TZWxlY3Rpb25SZWFzb24uSU5ERVhfRU5UUllfRk9VTkQpOworICAgICAgICBNb2NraXRvLnJlc2V0KGxpc3RlbmVyKTsKKworICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGRrKDcpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkdFLCBsaXN0ZW5lcik7ICAgIC8vIEdFIGRvZXMKKyAgICAgICAgaWYgKHNzdGFibGUgaW5zdGFuY2VvZiBCaWdUYWJsZVJlYWRlcikKKyAgICAgICAgICAgIE1vY2tpdG8udmVyaWZ5KGxpc3RlbmVyKS5vblNTVGFibGVTZWxlY3RlZChzc3RhYmxlLCBTU1RhYmxlUmVhZHNMaXN0ZW5lci5TZWxlY3Rpb25SZWFzb24uS0VZX0NBQ0hFX0hJVCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE1vY2tpdG8udmVyaWZ5KGxpc3RlbmVyKS5vblNTVGFibGVTZWxlY3RlZChzc3RhYmxlLCBTU1RhYmxlUmVhZHNMaXN0ZW5lci5TZWxlY3Rpb25SZWFzb24uSU5ERVhfRU5UUllfRk9VTkQpOworICAgICAgICBNb2NraXRvLnJlc2V0KGxpc3RlbmVyKTsKKworICAgICAgICAvLyBub24tZXhpc3Rpbmcga2V5IGlzIHJlamVjdGVkIGJ5IEJsb29tIEZpbHRlciBjaGVjaworICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGRrKDQ1KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSwgbGlzdGVuZXIpOyAgICAvLyBub3RlOiA0NSBmYWxscyBiZXR3ZWVuIDQgYW5kIDUKKyAgICAgICAgTW9ja2l0by52ZXJpZnkobGlzdGVuZXIpLm9uU1NUYWJsZVNraXBwZWQoc3N0YWJsZSwgU1NUYWJsZVJlYWRzTGlzdGVuZXIuU2tpcHBpbmdSZWFzb24uQkxPT01fRklMVEVSKTsKKyAgICAgICAgTW9ja2l0by5yZXNldChsaXN0ZW5lcik7CisKKyAgICAgICAgLy8gbm9uLWV4aXN0aW5nIGtleSBpcyByZWplY3RlZCBieSBzc3RhYmxlIGtleXMgcmFuZ2UgY2hlY2ssIGlmIHBlcmZvcm1lZCwgb3RoZXJ3aXNlIGl0J3MgYSBmYWxzZSBwb3NpdGl2ZQorICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGNvbGxpc2lvbkZvcig5KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSwgbGlzdGVuZXIpOworICAgICAgICBpZiAoc3N0YWJsZSBpbnN0YW5jZW9mIEJpZ1RhYmxlUmVhZGVyKQorICAgICAgICAgICAgTW9ja2l0by52ZXJpZnkobGlzdGVuZXIpLm9uU1NUYWJsZVNraXBwZWQoc3N0YWJsZSwgU1NUYWJsZVJlYWRzTGlzdGVuZXIuU2tpcHBpbmdSZWFzb24uTUlOX01BWF9LRVlTKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTW9ja2l0by52ZXJpZnkobGlzdGVuZXIpLm9uU1NUYWJsZVNraXBwZWQoc3N0YWJsZSwgU1NUYWJsZVJlYWRzTGlzdGVuZXIuU2tpcHBpbmdSZWFzb24uSU5ERVhfRU5UUllfTk9UX0ZPVU5EKTsKKyAgICAgICAgTW9ja2l0by5yZXNldChsaXN0ZW5lcik7CisKKyAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihjb2xsaXNpb25Gb3IoOSksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuR0UsIGxpc3RlbmVyKTsKKyAgICAgICAgaWYgKHNzdGFibGUgaW5zdGFuY2VvZiBCaWdUYWJsZVJlYWRlcikKKyAgICAgICAgICAgIE1vY2tpdG8udmVyaWZ5KGxpc3RlbmVyKS5vblNTVGFibGVTa2lwcGVkKHNzdGFibGUsIFNTVGFibGVSZWFkc0xpc3RlbmVyLlNraXBwaW5nUmVhc29uLk1JTl9NQVhfS0VZUyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE1vY2tpdG8udmVyaWZ5KGxpc3RlbmVyKS5vblNTVGFibGVTa2lwcGVkKHNzdGFibGUsIFNTVGFibGVSZWFkc0xpc3RlbmVyLlNraXBwaW5nUmVhc29uLklOREVYX0VOVFJZX05PVF9GT1VORCk7CisgICAgICAgIE1vY2tpdG8ucmVzZXQobGlzdGVuZXIpOworCisgICAgICAgIHNzdGFibGUuZ2V0UG9zaXRpb24oZGsoOSksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuR1QsIGxpc3RlbmVyKTsKKyAgICAgICAgaWYgKHNzdGFibGUgaW5zdGFuY2VvZiBCaWdUYWJsZVJlYWRlcikKKyAgICAgICAgICAgIE1vY2tpdG8udmVyaWZ5KGxpc3RlbmVyKS5vblNTVGFibGVTa2lwcGVkKHNzdGFibGUsIFNTVGFibGVSZWFkc0xpc3RlbmVyLlNraXBwaW5nUmVhc29uLk1JTl9NQVhfS0VZUyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE1vY2tpdG8udmVyaWZ5KGxpc3RlbmVyKS5vblNTVGFibGVTa2lwcGVkKHNzdGFibGUsIFNTVGFibGVSZWFkc0xpc3RlbmVyLlNraXBwaW5nUmVhc29uLklOREVYX0VOVFJZX05PVF9GT1VORCk7CisgICAgICAgIE1vY2tpdG8ucmVzZXQobGlzdGVuZXIpOworCisgICAgICAgIC8vIGV4aXN0aW5nIGtleSBmaWx0ZXJlZCBvdXQgYnkgc3N0YWJsZSBrZXlzIHJhbmdlIGNoZWNrLCBwZXJmb3JtZWQgYmVjYXVzZSBvZiBtb3ZlZCBzdGFydAorICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGRrKDEpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRLCBsaXN0ZW5lcik7CisgICAgICAgIE1vY2tpdG8udmVyaWZ5KGxpc3RlbmVyKS5vblNTVGFibGVTa2lwcGVkKHNzdGFibGUsIFNTVGFibGVSZWFkc0xpc3RlbmVyLlNraXBwaW5nUmVhc29uLk1JTl9NQVhfS0VZUyk7CisgICAgICAgIE1vY2tpdG8ucmVzZXQobGlzdGVuZXIpOworICAgICAgICBsb25nIHBvcyA9IHNzdGFibGUuZ2V0UG9zaXRpb24oZGsoMSksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuR1QsIGxpc3RlbmVyKTsKKyAgICAgICAgTW9ja2l0by52ZXJpZnkobGlzdGVuZXIpLm9uU1NUYWJsZVNlbGVjdGVkKHNzdGFibGUsIFNTVGFibGVSZWFkc0xpc3RlbmVyLlNlbGVjdGlvblJlYXNvbi5JTkRFWF9FTlRSWV9GT1VORCk7CisgICAgICAgIGFzc2VydEVxdWFscyhzc3RhYmxlLmdldFBvc2l0aW9uKGRrKDMpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKSwgcG9zKTsKKyAgICAgICAgTW9ja2l0by5yZXNldChsaXN0ZW5lcik7CisKKyAgICAgICAgLy8gbm9uLWV4aXN0aW5nIGtleSBpcyByZWplY3RlZCBieSBpbmRleCBpbnRlcnZhbCBjaGVjaworICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGNvbGxpc2lvbkZvcig1KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSwgbGlzdGVuZXIpOworICAgICAgICBpZiAoc3N0YWJsZSBpbnN0YW5jZW9mIEJpZ1RhYmxlUmVhZGVyKQorICAgICAgICAgICAgTW9ja2l0by52ZXJpZnkobGlzdGVuZXIpLm9uU1NUYWJsZVNraXBwZWQoc3N0YWJsZSwgU1NUYWJsZVJlYWRzTGlzdGVuZXIuU2tpcHBpbmdSZWFzb24uUEFSVElUSU9OX0lOREVYX0xPT0tVUCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE1vY2tpdG8udmVyaWZ5KGxpc3RlbmVyKS5vblNTVGFibGVTa2lwcGVkKHNzdGFibGUsIFNTVGFibGVSZWFkc0xpc3RlbmVyLlNraXBwaW5nUmVhc29uLklOREVYX0VOVFJZX05PVF9GT1VORCk7CisgICAgICAgIE1vY2tpdG8ucmVzZXQobGlzdGVuZXIpOworCisgICAgICAgIC8vIG5vbi1leGlzdGluZyBrZXkgaXMgcmVqZWN0ZWQgYnkgaW5kZXggbG9va3VwCisgICAgICAgIHNzdGFibGUuZ2V0UG9zaXRpb24oZGsoODA3KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSwgbGlzdGVuZXIpOworICAgICAgICBNb2NraXRvLnZlcmlmeShsaXN0ZW5lcikub25TU1RhYmxlU2tpcHBlZChzc3RhYmxlLCBTU1RhYmxlUmVhZHNMaXN0ZW5lci5Ta2lwcGluZ1JlYXNvbi5QQVJUSVRJT05fSU5ERVhfTE9PS1VQKTsKKyAgICAgICAgTW9ja2l0by5yZXNldChsaXN0ZW5lcik7CisKKyAgICAgICAgLy8gVmFyaWF0aW9ucyBvZiBub24tZXF1YWwgbWF0Y2gKKyAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihkaygzMSksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuR0UsIGxpc3RlbmVyKTsKKyAgICAgICAgTW9ja2l0by52ZXJpZnkobGlzdGVuZXIpLm9uU1NUYWJsZVNlbGVjdGVkKHNzdGFibGUsIFNTVGFibGVSZWFkc0xpc3RlbmVyLlNlbGVjdGlvblJlYXNvbi5JTkRFWF9FTlRSWV9GT1VORCk7CisgICAgICAgIE1vY2tpdG8ucmVzZXQobGlzdGVuZXIpOworCisgICAgICAgIHNzdGFibGUuZ2V0UG9zaXRpb24oZGsoODEpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkdFLCBsaXN0ZW5lcik7CisgICAgICAgIE1vY2tpdG8udmVyaWZ5KGxpc3RlbmVyKS5vblNTVGFibGVTZWxlY3RlZChzc3RhYmxlLCBTU1RhYmxlUmVhZHNMaXN0ZW5lci5TZWxlY3Rpb25SZWFzb24uSU5ERVhfRU5UUllfRk9VTkQpOworICAgICAgICBNb2NraXRvLnJlc2V0KGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFNTVGFibGVSZWFkZXJXaXRoRmlsdGVyIHByZXBhcmVHZXRQb3NpdGlvbnMoKQorICAgIHsKICAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSk7CiAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0ZfU1RBTkRBUkRfU01BTExfQkxPT01fRklMVEVSKTsKKyAgICAgICAgc3RvcmUudHJ1bmNhdGVCbG9ja2luZygpOwogICAgICAgICBwYXJ0aXRpb25lciA9IHN0b3JlLmdldFBhcnRpdGlvbmVyKCk7CiAgICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5zZXRDYXBhY2l0eSgxMDAwKTsKIAogICAgICAgICAvLyBpbnNlcnQgZGF0YSBhbmQgY29tcGFjdCB0byBhIHNpbmdsZSBzc3RhYmxlCiAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTA7IGorKykKICAgICAgICAgewotICAgICAgICAgICAgbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoc3RvcmUubWV0YWRhdGEoKSwgaiwgU3RyaW5nLnZhbHVlT2YoaikpCi0gICAgICAgICAgICAgICAgICAgIC5jbHVzdGVyaW5nKCIwIikKLSAgICAgICAgICAgICAgICAgICAgLmFkZCgidmFsIiwgQnl0ZUJ1ZmZlclV0aWwuRU1QVFlfQllURV9CVUZGRVIpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBseVVuc2FmZSgpOworICAgICAgICAgICAgaWYgKGogPT0gOCkgLy8gbGVhdmUgYSBtaXNzaW5nIHByZWZpeAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpbnQgcm93Q291bnQgPSBqIDwgNSA/IDIwMDAgOiAxOyAgICAvLyBtYWtlIHNvbWUgb2YgdGhlIHBhcnRpdGlvbnMgd2lkZQorICAgICAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCByb3dDb3VudDsgKytyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ldyBSb3dVcGRhdGVCdWlsZGVyKHN0b3JlLm1ldGFkYXRhKCksIGosIFN0cmluZy52YWx1ZU9mKGopKQorICAgICAgICAgICAgICAgIC5jbHVzdGVyaW5nKEludGVnZXIudG9TdHJpbmcocikpCisgICAgICAgICAgICAgICAgLmFkZCgidmFsIiwgQnl0ZUJ1ZmZlclV0aWwuRU1QVFlfQllURV9CVUZGRVIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgICAgICAgICAuYXBwbHlVbnNhZmUoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBVdGlsLmZsdXNoKHN0b3JlKTsKICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UucGVyZm9ybU1heGltYWwoc3RvcmUsIGZhbHNlKTsKIAotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBzdG9yZS5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgLy8gdGhlIGtleXMgYXJlIHNwZWNpZmljYWxseSBjaG9zZW4gdG8gY292ZXIgY2VydGFpbiB1c2UgY2FzZXMKLSAgICAgICAgLy8gZXhpc3Rpbmcga2V5IGlzIHJlYWQgZnJvbSBpbmRleAotICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGsoMiksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZS5nZXRCbG9vbUZpbHRlclRydWVQb3NpdGl2ZUNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3N0YWJsZS5nZXRCbG9vbUZpbHRlclRydWVOZWdhdGl2ZUNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3N0YWJsZS5nZXRCbG9vbUZpbHRlckZhbHNlUG9zaXRpdmVDb3VudCgpKTsKLSAgICAgICAgLy8gZXhpc3Rpbmcga2V5IGlzIHJlYWQgZnJvbSBDYWNoZSBLZXkKLSAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihrKDIpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHNzdGFibGUuZ2V0Qmxvb21GaWx0ZXJUcnVlUG9zaXRpdmVDb3VudCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHNzdGFibGUuZ2V0Qmxvb21GaWx0ZXJUcnVlTmVnYXRpdmVDb3VudCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHNzdGFibGUuZ2V0Qmxvb21GaWx0ZXJGYWxzZVBvc2l0aXZlQ291bnQoKSk7Ci0gICAgICAgIC8vIG5vbi1leGlzdGluZyBrZXkgaXMgcmVqZWN0ZWQgYnkgQmxvb20gRmlsdGVyIGNoZWNrCi0gICAgICAgIHNzdGFibGUuZ2V0UG9zaXRpb24oaygxMCksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc3N0YWJsZS5nZXRCbG9vbUZpbHRlclRydWVQb3NpdGl2ZUNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZS5nZXRCbG9vbUZpbHRlclRydWVOZWdhdGl2ZUNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3N0YWJsZS5nZXRCbG9vbUZpbHRlckZhbHNlUG9zaXRpdmVDb3VudCgpKTsKLSAgICAgICAgLy8gbm9uLWV4aXN0aW5nIGtleSBpcyByZWplY3RlZCBieSBzc3RhYmxlIGtleXMgcmFuZ2UgY2hlY2sKLSAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihrKDk5KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBzc3RhYmxlLmdldEJsb29tRmlsdGVyVHJ1ZVBvc2l0aXZlQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBzc3RhYmxlLmdldEJsb29tRmlsdGVyVHJ1ZU5lZ2F0aXZlQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBzc3RhYmxlLmdldEJsb29tRmlsdGVyRmFsc2VQb3NpdGl2ZUNvdW50KCkpOwotICAgICAgICAvLyBub24tZXhpc3Rpbmcga2V5IGlzIHJlamVjdGVkIGJ5IGluZGV4IGludGVydmFsIGNoZWNrCi0gICAgICAgIHNzdGFibGUuZ2V0UG9zaXRpb24oaygxNCksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc3N0YWJsZS5nZXRCbG9vbUZpbHRlclRydWVQb3NpdGl2ZUNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZS5nZXRCbG9vbUZpbHRlclRydWVOZWdhdGl2ZUNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc3N0YWJsZS5nZXRCbG9vbUZpbHRlckZhbHNlUG9zaXRpdmVDb3VudCgpKTsKLSAgICAgICAgLy8gbm9uLWV4aXN0aW5nIGtleSBpcyByZWplY3RlZCBieSBpbmRleCBsb29rdXAgY2hlY2sKLSAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihrKDgwNyksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc3N0YWJsZS5nZXRCbG9vbUZpbHRlclRydWVQb3NpdGl2ZUNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZS5nZXRCbG9vbUZpbHRlclRydWVOZWdhdGl2ZUNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgc3N0YWJsZS5nZXRCbG9vbUZpbHRlckZhbHNlUG9zaXRpdmVDb3VudCgpKTsKKyAgICAgICAgU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIgc3N0YWJsZSA9IChTU1RhYmxlUmVhZGVyV2l0aEZpbHRlcikgc3RvcmUuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIHNzdGFibGUgPSAoU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIpIHNzdGFibGUuY2xvbmVXaXRoTmV3U3RhcnQoZGsoMykpOworICAgICAgICByZXR1cm4gc3N0YWJsZTsKICAgICB9CiAKKwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE9wZW5pbmdTU1RhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKQEAgLTQyOCw5MiArNjE5LDIyMyBAQAogICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBzc3RhYmxlLmRlc2NyaXB0b3I7CiAKICAgICAgICAgLy8gdGVzdCB0byBzZWUgaWYgc3N0YWJsZSBjYW4gYmUgb3BlbmVkIGFzIGV4cGVjdGVkCi0gICAgICAgIFNTVGFibGVSZWFkZXIgdGFyZ2V0ID0gU1NUYWJsZVJlYWRlci5vcGVuKGRlc2MpOwotICAgICAgICBhc3NlcnQgdGFyZ2V0LmZpcnN0LmVxdWFscyhmaXJzdEtleSk7Ci0gICAgICAgIGFzc2VydCB0YXJnZXQubGFzdC5lcXVhbHMobGFzdEtleSk7CisgICAgICAgIFNTVGFibGVSZWFkZXIgdGFyZ2V0ID0gU1NUYWJsZVJlYWRlci5vcGVuKHN0b3JlLCBkZXNjKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCB0YXJnZXQuZmlyc3QuZXF1YWxzKGZpcnN0S2V5KTsKKyAgICAgICAgICAgIGFzc2VydCB0YXJnZXQubGFzdC5lcXVhbHMobGFzdEtleSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICB0YXJnZXQuc2VsZlJlZigpLmNsb3NlKCk7CisgICAgICAgIH0KIAotICAgICAgICBleGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiQUxURVIgVEFCTEUgXCIlc1wiLlwiJXNcIiBXSVRIIGJsb29tX2ZpbHRlcl9mcF9jaGFuY2UgPSAwLjMiLCBrcywgY2YpKTsKKyAgICAgICAgaWYgKEJpZ0Zvcm1hdC5pc1NlbGVjdGVkKCkpCisgICAgICAgICAgICBjaGVja09wZW5lZEJpZ1RhYmxlKGtzLCBjZiwgc3RvcmUsIGRlc2MpOworICAgICAgICBlbHNlIGlmIChCdGlGb3JtYXQuaXNTZWxlY3RlZCgpKQorICAgICAgICAgICAgY2hlY2tPcGVuZWRCdGlUYWJsZShrcywgY2YsIHN0b3JlLCBkZXNjKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgVXRpbC50ZXN0TXVzdEJlSW1wbGVtZW50ZWRGb3JTU1RhYmxlRm9ybWF0KCk7CisgICAgfQogCi0gICAgICAgIEZpbGUgc3VtbWFyeUZpbGUgPSBuZXcgRmlsZShkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5TVU1NQVJZKSk7Ci0gICAgICAgIFBhdGggYmxvb21QYXRoID0gbmV3IEZpbGUoZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuRklMVEVSKSkudG9QYXRoKCk7Ci0gICAgICAgIFBhdGggc3VtbWFyeVBhdGggPSBzdW1tYXJ5RmlsZS50b1BhdGgoKTsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrT3BlbmVkQmlnVGFibGUoU3RyaW5nIGtzLCBTdHJpbmcgY2YsIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlLCBEZXNjcmlwdG9yIGRlc2MpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGV4ZWN1dGVJbnRlcm5hbChmb3JtYXQoIkFMVEVSIFRBQkxFIFwiJXNcIi5cIiVzXCIgV0lUSCBibG9vbV9maWx0ZXJfZnBfY2hhbmNlID0gMC4zIiwga3MsIGNmKSk7CiAKLSAgICAgICAgbG9uZyBibG9vbU1vZGlmaWVkID0gRmlsZXMuZ2V0TGFzdE1vZGlmaWVkVGltZShibG9vbVBhdGgpLnRvTWlsbGlzKCk7Ci0gICAgICAgIGxvbmcgc3VtbWFyeU1vZGlmaWVkID0gRmlsZXMuZ2V0TGFzdE1vZGlmaWVkVGltZShzdW1tYXJ5UGF0aCkudG9NaWxsaXMoKTsKKyAgICAgICAgRmlsZSBibG9vbUZpbGUgPSBkZXNjLmZpbGVGb3IoQ29tcG9uZW50cy5GSUxURVIpOworICAgICAgICBsb25nIGJsb29tTW9kaWZpZWQgPSBibG9vbUZpbGUubGFzdE1vZGlmaWVkKCk7CisKKyAgICAgICAgRmlsZSBzdW1tYXJ5RmlsZSA9IGRlc2MuZmlsZUZvcihDb21wb25lbnRzLlNVTU1BUlkpOworICAgICAgICBsb25nIHN1bW1hcnlNb2RpZmllZCA9IHN1bW1hcnlGaWxlLmxhc3RNb2RpZmllZCgpOwogCiAgICAgICAgIFRpbWVVbml0Lk1JTExJU0VDT05EUy5zbGVlcCgxMDAwKTsgLy8gc2xlZXAgdG8gZW5zdXJlIG1vZGlmaWVkIHRpbWUgd2lsbCBiZSBkaWZmZXJlbnQKIAogICAgICAgICAvLyBPZmZsaW5lIHRlc3RzCiAgICAgICAgIC8vIGNoZWNrIHRoYXQgYmxvb21maWx0ZXIvc3VtbWFyeSBBUkUgTk9UIHJlZ2VuZXJhdGVkCi0gICAgICAgIHRhcmdldCA9IFNTVGFibGVSZWFkZXIub3Blbk5vVmFsaWRhdGlvbihkZXNjLCBzdG9yZS5tZXRhZGF0YSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGJsb29tTW9kaWZpZWQsIEZpbGVzLmdldExhc3RNb2RpZmllZFRpbWUoYmxvb21QYXRoKS50b01pbGxpcygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHN1bW1hcnlNb2RpZmllZCwgRmlsZXMuZ2V0TGFzdE1vZGlmaWVkVGltZShzdW1tYXJ5UGF0aCkudG9NaWxsaXMoKSk7Ci0KLSAgICAgICAgdGFyZ2V0LnNlbGZSZWYoKS5yZWxlYXNlKCk7CisgICAgICAgIFNTVGFibGVSZWFkZXIgdGFyZ2V0ID0gU1NUYWJsZVJlYWRlci5vcGVuTm9WYWxpZGF0aW9uKHN0b3JlLCBkZXNjLCBzdG9yZS5tZXRhZGF0YSk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYmxvb21Nb2RpZmllZCwgYmxvb21GaWxlLmxhc3RNb2RpZmllZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhzdW1tYXJ5TW9kaWZpZWQsIHN1bW1hcnlGaWxlLmxhc3RNb2RpZmllZCgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIHRhcmdldC5zZWxmUmVmKCkuY2xvc2UoKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIGNoZWNrIHRoYXQgYmxvb21maWx0ZXIvc3VtbWFyeSBBUkUgTk9UIHJlZ2VuZXJhdGVkIGFuZCBCRj1BbHdheXNQcmVzZW50IHdoZW4gZmlsdGVyIGNvbXBvbmVudCBpcyBtaXNzaW5nCi0gICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBTU1RhYmxlLmRpc2NvdmVyQ29tcG9uZW50c0ZvcihkZXNjKTsKLSAgICAgICAgY29tcG9uZW50cy5yZW1vdmUoQ29tcG9uZW50LkZJTFRFUik7CisgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBkZXNjLmRpc2NvdmVyQ29tcG9uZW50cygpOworICAgICAgICBjb21wb25lbnRzLnJlbW92ZShDb21wb25lbnRzLkZJTFRFUik7CiAgICAgICAgIHRhcmdldCA9IFNTVGFibGVSZWFkZXIub3Blbk5vVmFsaWRhdGlvbihkZXNjLCBjb21wb25lbnRzLCBzdG9yZSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGJsb29tTW9kaWZpZWQsIEZpbGVzLmdldExhc3RNb2RpZmllZFRpbWUoYmxvb21QYXRoKS50b01pbGxpcygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHN1bW1hcnlNb2RpZmllZCwgRmlsZXMuZ2V0TGFzdE1vZGlmaWVkVGltZShzdW1tYXJ5UGF0aCkudG9NaWxsaXMoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhGaWx0ZXJGYWN0b3J5LkFsd2F5c1ByZXNlbnQsIHRhcmdldC5nZXRCbG9vbUZpbHRlcigpKTsKLQotICAgICAgICB0YXJnZXQuc2VsZlJlZigpLnJlbGVhc2UoKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhibG9vbU1vZGlmaWVkLCBibG9vbUZpbGUubGFzdE1vZGlmaWVkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHN1bW1hcnlNb2RpZmllZCwgc3VtbWFyeUZpbGUubGFzdE1vZGlmaWVkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsICgoU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIpIHRhcmdldCkuZ2V0RmlsdGVyT2ZmSGVhcFNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICB0YXJnZXQuc2VsZlJlZigpLmNsb3NlKCk7CisgICAgICAgIH0KIAogICAgICAgICAvLyAjIyMjIG9ubGluZSB0ZXN0cyAjIyMjCiAgICAgICAgIC8vIGNoZWNrIHRoYXQgc3VtbWFyeSAmIGJsb29tZmlsdGVyIGFyZSBub3QgcmVnZW5lcmF0ZWQgd2hlbiBTU1RhYmxlIGlzIG9wZW5lZCBhbmQgQkZGUCBoYXMgYmVlbiBjaGFuZ2VkCi0gICAgICAgIHRhcmdldCA9IFNTVGFibGVSZWFkZXIub3BlbihkZXNjLCBzdG9yZS5tZXRhZGF0YSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGJsb29tTW9kaWZpZWQsIEZpbGVzLmdldExhc3RNb2RpZmllZFRpbWUoYmxvb21QYXRoKS50b01pbGxpcygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHN1bW1hcnlNb2RpZmllZCwgRmlsZXMuZ2V0TGFzdE1vZGlmaWVkVGltZShzdW1tYXJ5UGF0aCkudG9NaWxsaXMoKSk7Ci0KLSAgICAgICAgdGFyZ2V0LnNlbGZSZWYoKS5yZWxlYXNlKCk7CisgICAgICAgIHRhcmdldCA9IFNTVGFibGVSZWFkZXIub3BlbihzdG9yZSwgZGVzYywgc3RvcmUubWV0YWRhdGEpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJsb29tTW9kaWZpZWQsIGJsb29tRmlsZS5sYXN0TW9kaWZpZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc3VtbWFyeU1vZGlmaWVkLCBzdW1tYXJ5RmlsZS5sYXN0TW9kaWZpZWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICB0YXJnZXQuc2VsZlJlZigpLmNsb3NlKCk7CisgICAgICAgIH0KIAogICAgICAgICAvLyBjaGVjayB0aGF0IGJsb29tZmlsdGVyIGlzIHJlY3JlYXRlZCB3aGVuIGl0IGRvZXNuJ3QgZXhpc3QgYW5kIHRoaXMgY2F1c2VzIHRoZSBzdW1tYXJ5IHRvIGJlIHJlY3JlYXRlZAotICAgICAgICBjb21wb25lbnRzID0gU1NUYWJsZS5kaXNjb3ZlckNvbXBvbmVudHNGb3IoZGVzYyk7Ci0gICAgICAgIGNvbXBvbmVudHMucmVtb3ZlKENvbXBvbmVudC5GSUxURVIpOworICAgICAgICBjb21wb25lbnRzID0gZGVzYy5kaXNjb3ZlckNvbXBvbmVudHMoKTsKKyAgICAgICAgY29tcG9uZW50cy5yZW1vdmUoQ29tcG9uZW50cy5GSUxURVIpOworICAgICAgICBjb21wb25lbnRzLnJlbW92ZShDb21wb25lbnRzLlNVTU1BUlkpOwogCi0gICAgICAgIHRhcmdldCA9IFNTVGFibGVSZWFkZXIub3BlbihkZXNjLCBjb21wb25lbnRzLCBzdG9yZS5tZXRhZGF0YSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQmxvb21maWx0ZXIgd2FzIG5vdCByZWNyZWF0ZWQiLCBibG9vbU1vZGlmaWVkIDwgRmlsZXMuZ2V0TGFzdE1vZGlmaWVkVGltZShibG9vbVBhdGgpLnRvTWlsbGlzKCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJTdW1tYXJ5IHdhcyBub3QgcmVjcmVhdGVkIiwgc3VtbWFyeU1vZGlmaWVkIDwgRmlsZXMuZ2V0TGFzdE1vZGlmaWVkVGltZShzdW1tYXJ5UGF0aCkudG9NaWxsaXMoKSk7Ci0KLSAgICAgICAgdGFyZ2V0LnNlbGZSZWYoKS5yZWxlYXNlKCk7CisgICAgICAgIHRhcmdldCA9IFNTVGFibGVSZWFkZXIub3BlbihzdG9yZSwgZGVzYywgY29tcG9uZW50cywgc3RvcmUubWV0YWRhdGEpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQmxvb21maWx0ZXIgd2FzIG5vdCByZWNyZWF0ZWQiLCBibG9vbU1vZGlmaWVkIDwgYmxvb21GaWxlLmxhc3RNb2RpZmllZCgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlN1bW1hcnkgd2FzIG5vdCByZWNyZWF0ZWQiLCBzdW1tYXJ5TW9kaWZpZWQgPCBzdW1tYXJ5RmlsZS5sYXN0TW9kaWZpZWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICB0YXJnZXQuc2VsZlJlZigpLmNsb3NlKCk7CisgICAgICAgIH0KIAogICAgICAgICAvLyBjaGVjayB0aGF0IG9ubHkgdGhlIHN1bW1hcnkgaXMgcmVnZW5lcmF0ZWQgd2hlbiBpdCBpcyBkZWxldGVkCi0gICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudC5GSUxURVIpOwotICAgICAgICBzdW1tYXJ5TW9kaWZpZWQgPSBGaWxlcy5nZXRMYXN0TW9kaWZpZWRUaW1lKHN1bW1hcnlQYXRoKS50b01pbGxpcygpOworICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnRzLkZJTFRFUik7CisgICAgICAgIHN1bW1hcnlNb2RpZmllZCA9IHN1bW1hcnlGaWxlLmxhc3RNb2RpZmllZCgpOwogICAgICAgICBzdW1tYXJ5RmlsZS50cnlEZWxldGUoKTsKIAogICAgICAgICBUaW1lVW5pdC5NSUxMSVNFQ09ORFMuc2xlZXAoMTAwMCk7IC8vIHNsZWVwIHRvIGVuc3VyZSBtb2RpZmllZCB0aW1lIHdpbGwgYmUgZGlmZmVyZW50Ci0gICAgICAgIGJsb29tTW9kaWZpZWQgPSBGaWxlcy5nZXRMYXN0TW9kaWZpZWRUaW1lKGJsb29tUGF0aCkudG9NaWxsaXMoKTsKKyAgICAgICAgYmxvb21Nb2RpZmllZCA9IGJsb29tRmlsZS5sYXN0TW9kaWZpZWQoKTsKIAotICAgICAgICB0YXJnZXQgPSBTU1RhYmxlUmVhZGVyLm9wZW4oZGVzYywgY29tcG9uZW50cywgc3RvcmUubWV0YWRhdGEpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhibG9vbU1vZGlmaWVkLCBGaWxlcy5nZXRMYXN0TW9kaWZpZWRUaW1lKGJsb29tUGF0aCkudG9NaWxsaXMoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlN1bW1hcnkgd2FzIG5vdCByZWNyZWF0ZWQiLCBzdW1tYXJ5TW9kaWZpZWQgPCBGaWxlcy5nZXRMYXN0TW9kaWZpZWRUaW1lKHN1bW1hcnlQYXRoKS50b01pbGxpcygpKTsKLQotICAgICAgICB0YXJnZXQuc2VsZlJlZigpLnJlbGVhc2UoKTsKKyAgICAgICAgdGFyZ2V0ID0gU1NUYWJsZVJlYWRlci5vcGVuKHN0b3JlLCBkZXNjLCBjb21wb25lbnRzLCBzdG9yZS5tZXRhZGF0YSk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYmxvb21Nb2RpZmllZCwgYmxvb21GaWxlLmxhc3RNb2RpZmllZCgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlN1bW1hcnkgd2FzIG5vdCByZWNyZWF0ZWQiLCBzdW1tYXJ5TW9kaWZpZWQgPCBzdW1tYXJ5RmlsZS5sYXN0TW9kaWZpZWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICB0YXJnZXQuc2VsZlJlZigpLmNsb3NlKCk7CisgICAgICAgIH0KIAogICAgICAgICAvLyBjaGVjayB0aGF0IHN1bW1hcnkgYW5kIGJsb29tZmlsdGVyIGlzIG5vdCByZWNyZWF0ZWQgd2hlbiB0aGUgSU5ERVggaXMgbWlzc2luZwotICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnQuU1VNTUFSWSk7Ci0gICAgICAgIGNvbXBvbmVudHMucmVtb3ZlKENvbXBvbmVudC5QUklNQVJZX0lOREVYKTsKKyAgICAgICAgY29tcG9uZW50cy5hZGQoQ29tcG9uZW50cy5TVU1NQVJZKTsKKyAgICAgICAgY29tcG9uZW50cy5yZW1vdmUoQ29tcG9uZW50cy5QUklNQVJZX0lOREVYKTsKIAotICAgICAgICBzdW1tYXJ5TW9kaWZpZWQgPSBGaWxlcy5nZXRMYXN0TW9kaWZpZWRUaW1lKHN1bW1hcnlQYXRoKS50b01pbGxpcygpOwotICAgICAgICB0YXJnZXQgPSBTU1RhYmxlUmVhZGVyLm9wZW4oZGVzYywgY29tcG9uZW50cywgc3RvcmUubWV0YWRhdGEsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHN1bW1hcnlNb2RpZmllZCA9IHN1bW1hcnlGaWxlLmxhc3RNb2RpZmllZCgpOworICAgICAgICB0YXJnZXQgPSBTU1RhYmxlUmVhZGVyLm9wZW4oc3RvcmUsIGRlc2MsIGNvbXBvbmVudHMsIHN0b3JlLm1ldGFkYXRhLCBmYWxzZSwgZmFsc2UpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTLnNsZWVwKDEwMDApOyAvLyBzbGVlcCB0byBlbnN1cmUgbW9kaWZpZWQgdGltZSB3aWxsIGJlIGRpZmZlcmVudAorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJsb29tTW9kaWZpZWQsIGJsb29tRmlsZS5sYXN0TW9kaWZpZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc3VtbWFyeU1vZGlmaWVkLCBzdW1tYXJ5RmlsZS5sYXN0TW9kaWZpZWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICB0YXJnZXQuc2VsZlJlZigpLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrT3BlbmVkQnRpVGFibGUoU3RyaW5nIGtzLCBTdHJpbmcgY2YsIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlLCBEZXNjcmlwdG9yIGRlc2MpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGV4ZWN1dGVJbnRlcm5hbChmb3JtYXQoIkFMVEVSIFRBQkxFIFwiJXNcIi5cIiVzXCIgV0lUSCBibG9vbV9maWx0ZXJfZnBfY2hhbmNlID0gMC4zIiwga3MsIGNmKSk7CisKKyAgICAgICAgRmlsZSBibG9vbUZpbGUgPSBkZXNjLmZpbGVGb3IoQ29tcG9uZW50cy5GSUxURVIpOworICAgICAgICBsb25nIGJsb29tTW9kaWZpZWQgPSBibG9vbUZpbGUubGFzdE1vZGlmaWVkKCk7CiAKICAgICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTLnNsZWVwKDEwMDApOyAvLyBzbGVlcCB0byBlbnN1cmUgbW9kaWZpZWQgdGltZSB3aWxsIGJlIGRpZmZlcmVudAotICAgICAgICBhc3NlcnRFcXVhbHMoYmxvb21Nb2RpZmllZCwgRmlsZXMuZ2V0TGFzdE1vZGlmaWVkVGltZShibG9vbVBhdGgpLnRvTWlsbGlzKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc3VtbWFyeU1vZGlmaWVkLCBGaWxlcy5nZXRMYXN0TW9kaWZpZWRUaW1lKHN1bW1hcnlQYXRoKS50b01pbGxpcygpKTsKIAotICAgICAgICB0YXJnZXQuc2VsZlJlZigpLnJlbGVhc2UoKTsKKyAgICAgICAgLy8gT2ZmbGluZSB0ZXN0cworICAgICAgICAvLyBjaGVjayB0aGF0IGJsb29tZmlsdGVyIGlzIG5vdCByZWdlbmVyYXRlZAorICAgICAgICBTU1RhYmxlUmVhZGVyIHRhcmdldCA9IFNTVGFibGVSZWFkZXIub3Blbk5vVmFsaWRhdGlvbihzdG9yZSwgZGVzYywgc3RvcmUubWV0YWRhdGEpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJsb29tTW9kaWZpZWQsIGJsb29tRmlsZS5sYXN0TW9kaWZpZWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICB0YXJnZXQuc2VsZlJlZigpLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayB0aGF0IGJsb29tZmlsdGVyIGlzIG5vdCByZWdlbmVyYXRlZCBhbmQgQkY9QWx3YXlzUHJlc2VudCB3aGVuIGZpbHRlciBjb21wb25lbnQgaXMgbWlzc2luZworICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gZGVzYy5kaXNjb3ZlckNvbXBvbmVudHMoKTsKKyAgICAgICAgY29tcG9uZW50cy5yZW1vdmUoQ29tcG9uZW50cy5GSUxURVIpOworICAgICAgICB0YXJnZXQgPSBTU1RhYmxlUmVhZGVyLm9wZW5Ob1ZhbGlkYXRpb24oZGVzYywgY29tcG9uZW50cywgc3RvcmUpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJsb29tTW9kaWZpZWQsIGJsb29tRmlsZS5sYXN0TW9kaWZpZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgKChTU1RhYmxlUmVhZGVyV2l0aEZpbHRlcikgdGFyZ2V0KS5nZXRGaWx0ZXJPZmZIZWFwU2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIHRhcmdldC5zZWxmUmVmKCkuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vICMjIyMgb25saW5lIHRlc3RzICMjIyMKKyAgICAgICAgLy8gY2hlY2sgdGhhdCBibG9vbWZpbHRlciBpcyBub3QgcmVnZW5lcmF0ZWQgd2hlbiBTU1RhYmxlIGlzIG9wZW5lZCBhbmQgQkZGUCBoYXMgYmVlbiBjaGFuZ2VkCisgICAgICAgIFRpbWVVbml0Lk1JTExJU0VDT05EUy5zbGVlcCgxMDAwKTsgLy8gc2xlZXAgdG8gZW5zdXJlIG1vZGlmaWVkIHRpbWUgd2lsbCBiZSBkaWZmZXJlbnQKKyAgICAgICAgdGFyZ2V0ID0gU1NUYWJsZVJlYWRlci5vcGVuKHN0b3JlLCBkZXNjLCBzdG9yZS5tZXRhZGF0YSk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYmxvb21Nb2RpZmllZCwgYmxvb21GaWxlLmxhc3RNb2RpZmllZCgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIHRhcmdldC5zZWxmUmVmKCkuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIHRoYXQgYmxvb21maWx0ZXIgaXMgcmVjcmVhdGVkIHdoZW4gaXQgZG9lc24ndCBleGlzdAorICAgICAgICBjb21wb25lbnRzID0gZGVzYy5kaXNjb3ZlckNvbXBvbmVudHMoKTsKKyAgICAgICAgY29tcG9uZW50cy5yZW1vdmUoQ29tcG9uZW50cy5GSUxURVIpOworCisgICAgICAgIHRhcmdldCA9IFNTVGFibGVSZWFkZXIub3BlbihzdG9yZSwgZGVzYywgY29tcG9uZW50cywgc3RvcmUubWV0YWRhdGEpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQmxvb21maWx0ZXIgd2FzIG5vdCByZWNyZWF0ZWQiLCBibG9vbU1vZGlmaWVkIDwgYmxvb21GaWxlLmxhc3RNb2RpZmllZCgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIHRhcmdldC5zZWxmUmVmKCkuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIGJsb29tTW9kaWZpZWQgPSBibG9vbUZpbGUubGFzdE1vZGlmaWVkKCk7CisgICAgICAgIFRpbWVVbml0Lk1JTExJU0VDT05EUy5zbGVlcCgxMDAwKTsgLy8gc2xlZXAgdG8gZW5zdXJlIG1vZGlmaWVkIHRpbWUgd2lsbCBiZSBkaWZmZXJlbnQKKworICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnRzLkZJTFRFUik7CisgICAgICAgIHRhcmdldCA9IFNTVGFibGVSZWFkZXIub3BlbihzdG9yZSwgZGVzYywgY29tcG9uZW50cywgc3RvcmUubWV0YWRhdGEpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJsb29tTW9kaWZpZWQsIGJsb29tRmlsZS5sYXN0TW9kaWZpZWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICB0YXJnZXQuc2VsZlJlZigpLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayB0aGF0IGJsb29tZmlsdGVyIGlzIG5vdCByZWNyZWF0ZWQgd2hlbiB0aGUgSU5ERVggaXMgbWlzc2luZworICAgICAgICBjb21wb25lbnRzLnJlbW92ZShCdGlGb3JtYXQuQ29tcG9uZW50cy5QQVJUSVRJT05fSU5ERVgpOworCisgICAgICAgIHRhcmdldCA9IFNTVGFibGVSZWFkZXIub3BlbihzdG9yZSwgZGVzYywgY29tcG9uZW50cywgc3RvcmUubWV0YWRhdGEsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBUaW1lVW5pdC5NSUxMSVNFQ09ORFMuc2xlZXAoMTAwMCk7IC8vIHNsZWVwIHRvIGVuc3VyZSBtb2RpZmllZCB0aW1lIHdpbGwgYmUgZGlmZmVyZW50CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYmxvb21Nb2RpZmllZCwgYmxvb21GaWxlLmxhc3RNb2RpZmllZCgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIHRhcmdldC5zZWxmUmVmKCkuY2xvc2UoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdExvYWRpbmdTdW1tYXJ5VXNlc0NvcnJlY3RQYXJ0aXRpb25lcigpCisgICAgcHVibGljIHZvaWQgdGVzdExvYWRpbmdTdW1tYXJ5VXNlc0NvcnJlY3RQYXJ0aXRpb25lcigpIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlID0gZGlzY2FyZFNTVGFibGVzKEtFWVNQQUNFMSwgQ0ZfSU5ERVhFRCk7CiAKQEAgLTUyNSwyMCArODQ3LDI1IEBACiAKICAgICAgICAgVXRpbC5mbHVzaChzdG9yZSk7CiAKLSAgICAgICAgZm9yKENvbHVtbkZhbWlseVN0b3JlIGluZGV4Q2ZzIDogc3RvcmUuaW5kZXhNYW5hZ2VyLmdldEFsbEluZGV4Q29sdW1uRmFtaWx5U3RvcmVzKCkpCisgICAgICAgIGZvciAoQ29sdW1uRmFtaWx5U3RvcmUgaW5kZXhDZnMgOiBzdG9yZS5pbmRleE1hbmFnZXIuZ2V0QWxsSW5kZXhDb2x1bW5GYW1pbHlTdG9yZXMoKSkKICAgICAgICAgewogICAgICAgICAgICAgYXNzZXJ0IGluZGV4Q2ZzLmlzSW5kZXgoKTsKICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGluZGV4Q2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwogICAgICAgICAgICAgYXNzZXJ0IHNzdGFibGUuZmlyc3QuZ2V0VG9rZW4oKSBpbnN0YW5jZW9mIExvY2FsVG9rZW47CiAKLSAgICAgICAgICAgIFNTVGFibGVSZWFkZXIuc2F2ZVN1bW1hcnkoc3N0YWJsZS5kZXNjcmlwdG9yLCBzc3RhYmxlLmZpcnN0LCBzc3RhYmxlLmxhc3QsIHNzdGFibGUuaW5kZXhTdW1tYXJ5KTsKLSAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgcmVvcGVuZWQgPSBTU1RhYmxlUmVhZGVyLm9wZW4oc3N0YWJsZS5kZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIGFzc2VydCByZW9wZW5lZC5maXJzdC5nZXRUb2tlbigpIGluc3RhbmNlb2YgTG9jYWxUb2tlbjsKLSAgICAgICAgICAgIHJlb3BlbmVkLnNlbGZSZWYoKS5yZWxlYXNlKCk7CisgICAgICAgICAgICBpZiAoc3N0YWJsZSBpbnN0YW5jZW9mIEluZGV4U3VtbWFyeVN1cHBvcnQ8Pz4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IEluZGV4U3VtbWFyeUNvbXBvbmVudCgoKEluZGV4U3VtbWFyeVN1cHBvcnQ8Pz4pIHNzdGFibGUpLmdldEluZGV4U3VtbWFyeSgpLCBzc3RhYmxlLmZpcnN0LCBzc3RhYmxlLmxhc3QpLnNhdmUoc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5TVU1NQVJZKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciByZW9wZW5lZCA9IFNTVGFibGVSZWFkZXIub3BlbihzdG9yZSwgc3N0YWJsZS5kZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQgcmVvcGVuZWQuZmlyc3QuZ2V0VG9rZW4oKSBpbnN0YW5jZW9mIExvY2FsVG9rZW47CisgICAgICAgICAgICAgICAgcmVvcGVuZWQuc2VsZlJlZigpLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKiBzZWUgQ0FTU0FORFJBLTU0MDcgKi8KKyAgICAvKioKKyAgICAgKiBzZWUgQ0FTU0FORFJBLTU0MDcKKyAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTY2FubmVyRm9yTm9JbnRlcnNlY3RpbmdSYW5nZXMoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewpAQCAtNTUzLDExICs4ODAsMTYgQEAKIAogICAgICAgICBVdGlsLmZsdXNoKHN0b3JlKTsKICAgICAgICAgYm9vbGVhbiBmb3VuZFNjYW5uZXIgPSBmYWxzZTsKLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHMgOiBzdG9yZS5nZXRMaXZlU1NUYWJsZXMoKSkKKworICAgICAgICBTZXQ8U1NUYWJsZVJlYWRlcj4gbGl2ZVNTVGFibGVzID0gc3RvcmUuZ2V0TGl2ZVNTVGFibGVzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHRhYmxlIHNob3VsZCBoYXZlIG9ubHkgb25lIHNzdGFibGUiLCAxLCBsaXZlU1NUYWJsZXMuc2l6ZSgpKTsKKworICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgcyA6IGxpdmVTU1RhYmxlcykKICAgICAgICAgewotICAgICAgICAgICAgdHJ5IChJU1NUYWJsZVNjYW5uZXIgc2Nhbm5lciA9IHMuZ2V0U2Nhbm5lcihuZXcgUmFuZ2U8VG9rZW4+KHQoMCksIHQoMSkpKSkKKyAgICAgICAgICAgIHRyeSAoSVNTVGFibGVTY2FubmVyIHNjYW5uZXIgPSBzLmdldFNjYW5uZXIobmV3IFJhbmdlPD4odCgwKSwgdCgxKSkpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNjYW5uZXIubmV4dCgpOyAvLyB0aHJvd3MgZXhjZXB0aW9uIHByZSA1NDA3CisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIG5vIGRhdGEgaXMgcmV0dXJuZWQgYW5kIG5vdGhpbmcgZmFpbHMgZm9yIG5vbi1pbnRlcnNlY3RpbmcgcmFuZ2UuCisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc2Nhbm5lci5oYXNOZXh0KCkpOwogICAgICAgICAgICAgICAgIGZvdW5kU2Nhbm5lciA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTU5MywxMyArOTI1LDEzIEBACiAKICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gc3RvcmUuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CiAgICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlci5QYXJ0aXRpb25Qb3NpdGlvbkJvdW5kcz4gc2VjdGlvbnMgPSBzc3RhYmxlLmdldFBvc2l0aW9uc0ZvclJhbmdlcyhyYW5nZXMpOwotICAgICAgICBhc3NlcnQgc2VjdGlvbnMuc2l6ZSgpID09IDEgOiAiRXhwZWN0ZWQgdG8gZmluZCByYW5nZSBpbiBzc3RhYmxlIiA7CisgICAgICAgIGFzc2VydCBzZWN0aW9ucy5zaXplKCkgPT0gMSA6ICJFeHBlY3RlZCB0byBmaW5kIHJhbmdlIGluIHNzdGFibGUiOwogCiAgICAgICAgIC8vIHJlLW9wZW4gdGhlIHNhbWUgc3N0YWJsZSBhcyBpdCB3b3VsZCBiZSBkdXJpbmcgYnVsayBsb2FkaW5nCi0gICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBTZXRzLm5ld0hhc2hTZXQoQ29tcG9uZW50LkRBVEEsIENvbXBvbmVudC5QUklNQVJZX0lOREVYKTsKLSAgICAgICAgaWYgKHNzdGFibGUuY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnQuQ09NUFJFU1NJT05fSU5GTykpCi0gICAgICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnQuQ09NUFJFU1NJT05fSU5GTyk7Ci0gICAgICAgIFNTVGFibGVSZWFkZXIgYnVsa0xvYWRlZCA9IFNTVGFibGVSZWFkZXIub3BlbkZvckJhdGNoKHNzdGFibGUuZGVzY3JpcHRvciwgY29tcG9uZW50cywgc3RvcmUubWV0YWRhdGEpOworICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gU2V0cy5uZXdIYXNoU2V0KHNzdGFibGUuZGVzY3JpcHRvci5nZXRGb3JtYXQoKS5wcmltYXJ5Q29tcG9uZW50cygpKTsKKyAgICAgICAgaWYgKHNzdGFibGUuY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnRzLkNPTVBSRVNTSU9OX0lORk8pKQorICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoQ29tcG9uZW50cy5DT01QUkVTU0lPTl9JTkZPKTsKKyAgICAgICAgU1NUYWJsZVJlYWRlciBidWxrTG9hZGVkID0gU1NUYWJsZVJlYWRlci5vcGVuRm9yQmF0Y2goc3RvcmUsIHNzdGFibGUuZGVzY3JpcHRvciwgY29tcG9uZW50cywgc3RvcmUubWV0YWRhdGEpOwogICAgICAgICBzZWN0aW9ucyA9IGJ1bGtMb2FkZWQuZ2V0UG9zaXRpb25zRm9yUmFuZ2VzKHJhbmdlcyk7CiAgICAgICAgIGFzc2VydCBzZWN0aW9ucy5zaXplKCkgPT0gMSA6ICJFeHBlY3RlZCB0byBmaW5kIHJhbmdlIGluIHNzdGFibGUgb3BlbmVkIGZvciBidWxrIGxvYWRpbmciOwogICAgICAgICBidWxrTG9hZGVkLnNlbGZSZWYoKS5yZWxlYXNlKCk7CkBAIC02MDgsMTcgKzk0MCwxNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEluZGV4U3VtbWFyeVJlcGxhY2VtZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCiAgICAgeworICAgICAgICBhc3N1bWVUcnVlKEluZGV4U3VtbWFyeVN1cHBvcnQuaXNTdXBwb3J0ZWRCeShEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkpKTsKICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgc3RvcmUgPSBkaXNjYXJkU1NUYWJsZXMoS0VZU1BBQ0UxLCBDRl9TVEFOREFSRF9MT1dfSU5ERVhfSU5URVJWQUwpOyAvLyBpbmRleCBpbnRlcnZhbCBvZiA4LCBubyBrZXkgY2FjaGluZwogCiAgICAgICAgIGZpbmFsIGludCBOVU1fUEFSVElUSU9OUyA9IDUxMjsKICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOVU1fUEFSVElUSU9OUzsgaisrKQogICAgICAgICB7Ci0gICAgICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihzdG9yZS5tZXRhZGF0YSgpLCBqLCBTdHJpbmcuZm9ybWF0KCIlM2QiLCBqKSkKKyAgICAgICAgICAgIG5ldyBSb3dVcGRhdGVCdWlsZGVyKHN0b3JlLm1ldGFkYXRhKCksIGosIGZvcm1hdCgiJTNkIiwgaikpCiAgICAgICAgICAgICAuY2x1c3RlcmluZygiMCIpCi0gICAgICAgICAgICAuYWRkKCJ2YWwiLCBTdHJpbmcuZm9ybWF0KCIlM2QiLCBqKSkKKyAgICAgICAgICAgIC5hZGQoInZhbCIsIGZvcm1hdCgiJTNkIiwgaikpCiAgICAgICAgICAgICAuYnVpbGQoKQogICAgICAgICAgICAgLmFwcGx5VW5zYWZlKCk7Ci0KICAgICAgICAgfQogICAgICAgICBVdGlsLmZsdXNoKHN0b3JlKTsKICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UucGVyZm9ybU1heGltYWwoc3RvcmUsIGZhbHNlKTsKQEAgLTYzMSw3ICs5NjMsNyBAQAogICAgICAgICBMaXN0PEZ1dHVyZTw/Pj4gZnV0dXJlcyA9IG5ldyBBcnJheUxpc3Q8PihOVU1fUEFSVElUSU9OUyAqIDIpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9QQVJUSVRJT05TOyBpKyspCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEJ5dGVCdWZmZXIga2V5ID0gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoU3RyaW5nLmZvcm1hdCgiJTNkIiwgaSkpOworICAgICAgICAgICAgZmluYWwgQnl0ZUJ1ZmZlciBrZXkgPSBCeXRlQnVmZmVyVXRpbC5ieXRlcyhmb3JtYXQoIiUzZCIsIGkpKTsKICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGk7CiAKICAgICAgICAgICAgIGZ1dHVyZXMuYWRkKGV4ZWN1dG9yLnN1Ym1pdChuZXcgUnVubmFibGUoKQpAQCAtNjM5LDcgKzk3MSw3IEBACiAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIFJvdyByb3cgPSBVdGlsLmdldE9ubHlSb3dVbmZpbHRlcmVkKFV0aWwuY21kKHN0b3JlLCBrZXkpLmJ1aWxkKCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgQnl0ZUJ1ZmZlclV0aWwuY29tcGFyZShTdHJpbmcuZm9ybWF0KCIlM2QiLCBpbmRleCkuZ2V0Qnl0ZXMoKSwgcm93LmNlbGxzKCkuaXRlcmF0b3IoKS5uZXh0KCkuYnVmZmVyKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIEJ5dGVCdWZmZXJVdGlsLmNvbXBhcmUoZm9ybWF0KCIlM2QiLCBpbmRleCkuZ2V0Qnl0ZXMoKSwgcm93LmNlbGxzKCkuaXRlcmF0b3IoKS5uZXh0KCkuYnVmZmVyKCkpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9KSk7CiAKQEAgLTY0OCw3ICs5ODAsNyBAQAogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBJdGVyYWJsZTxEZWNvcmF0ZWRLZXk+IHJlc3VsdHMgPSBzdG9yZS5rZXlTYW1wbGVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSYW5nZTw+KHNzdGFibGUuZ2V0UGFydGl0aW9uZXIoKS5nZXRNaW5pbXVtVG9rZW4oKSwgc3N0YWJsZS5nZXRQYXJ0aXRpb25lcigpLmdldFRva2VuKGtleSkpKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IFJhbmdlPD4oc3N0YWJsZS5nZXRQYXJ0aXRpb25lcigpLmdldE1pbmltdW1Ub2tlbigpLCBzc3RhYmxlLmdldFBhcnRpdGlvbmVyKCkuZ2V0VG9rZW4oa2V5KSkpOwogICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdHMuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pKTsKQEAgLTY1Nyw3ICs5ODksNyBAQAogICAgICAgICBTU1RhYmxlUmVhZGVyIHJlcGxhY2VtZW50OwogICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IHN0b3JlLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChzc3RhYmxlKSwgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKICAgICAgICAgewotICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSBzc3RhYmxlLmNsb25lV2l0aE5ld1N1bW1hcnlTYW1wbGluZ0xldmVsKHN0b3JlLCAxKTsKKyAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gKChJbmRleFN1bW1hcnlTdXBwb3J0PD8+KSBzc3RhYmxlKS5jbG9uZVdpdGhOZXdTdW1tYXJ5U2FtcGxpbmdMZXZlbChzdG9yZSwgMSk7CiAgICAgICAgICAgICB0eG4udXBkYXRlKHJlcGxhY2VtZW50LCB0cnVlKTsKICAgICAgICAgICAgIHR4bi5maW5pc2goKTsKICAgICAgICAgfQpAQCAtNjcwLDYgKzEwMDIsNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEluZGV4U3VtbWFyeVVwc2FtcGxlQW5kUmVsb2FkKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShJbmRleFN1bW1hcnlTdXBwb3J0LmlzU3VwcG9ydGVkQnkoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpKSk7CiAgICAgICAgIGludCBvcmlnaW5hbE1heFNlZ21lbnRTaXplID0gTW1hcHBlZFJlZ2lvbnMuTUFYX1NFR01FTlRfU0laRTsKICAgICAgICAgTW1hcHBlZFJlZ2lvbnMuTUFYX1NFR01FTlRfU0laRSA9IDQwOyAvLyBlYWNoIGluZGV4IGVudHJ5IGlzIH4xMSBieXRlcywgc28gdGhpcyB3aWxsIGdlbmVyYXRlIGxvdHMgb2Ygc2VnbWVudHMKIApAQCAtNjgzLDM1ICsxMDE2LDM0IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgdGVzdEluZGV4U3VtbWFyeVVwc2FtcGxlQW5kUmVsb2FkMCgpIHRocm93cyBFeGNlcHRpb24KKyAgICBwcml2YXRlIDxSIGV4dGVuZHMgU1NUYWJsZVJlYWRlciAmIEluZGV4U3VtbWFyeVN1cHBvcnQ8Uj4+IHZvaWQgdGVzdEluZGV4U3VtbWFyeVVwc2FtcGxlQW5kUmVsb2FkMCgpIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlID0gZGlzY2FyZFNTVGFibGVzKEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkRfTE9XX0lOREVYX0lOVEVSVkFMKTsgLy8gaW5kZXggaW50ZXJ2YWwgb2YgOCwgbm8ga2V5IGNhY2hpbmcKIAogICAgICAgICBmaW5hbCBpbnQgTlVNX1BBUlRJVElPTlMgPSA1MTI7CiAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgTlVNX1BBUlRJVElPTlM7IGorKykKICAgICAgICAgewotICAgICAgICAgICAgbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoc3RvcmUubWV0YWRhdGEoKSwgaiwgU3RyaW5nLmZvcm1hdCgiJTNkIiwgaikpCisgICAgICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihzdG9yZS5tZXRhZGF0YSgpLCBqLCBmb3JtYXQoIiUzZCIsIGopKQogICAgICAgICAgICAgLmNsdXN0ZXJpbmcoIjAiKQotICAgICAgICAgICAgLmFkZCgidmFsIiwgU3RyaW5nLmZvcm1hdCgiJTNkIiwgaikpCisgICAgICAgICAgICAuYWRkKCJ2YWwiLCBmb3JtYXQoIiUzZCIsIGopKQogICAgICAgICAgICAgLmJ1aWxkKCkKICAgICAgICAgICAgIC5hcHBseVVuc2FmZSgpOwotCiAgICAgICAgIH0KICAgICAgICAgVXRpbC5mbHVzaChzdG9yZSk7CiAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLnBlcmZvcm1NYXhpbWFsKHN0b3JlLCBmYWxzZSk7CiAKLSAgICAgICAgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IHN0b3JlLmdldExpdmVTU1RhYmxlcygpOworICAgICAgICBDb2xsZWN0aW9uPFI+IHNzdGFibGVzID0gU2VydmVyVGVzdFV0aWxzLjxSPmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhzdG9yZSk7CiAgICAgICAgIGFzc2VydCBzc3RhYmxlcy5zaXplKCkgPT0gMTsKLSAgICAgICAgZmluYWwgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gc3N0YWJsZXMuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIGZpbmFsIFIgc3N0YWJsZSA9IHNzdGFibGVzLml0ZXJhdG9yKCkubmV4dCgpOwogCiAgICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gc3RvcmUuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHNzdGFibGUpLCBPcGVyYXRpb25UeXBlLlVOS05PV04pKQogICAgICAgICB7Ci0gICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHJlcGxhY2VtZW50ID0gc3N0YWJsZS5jbG9uZVdpdGhOZXdTdW1tYXJ5U2FtcGxpbmdMZXZlbChzdG9yZSwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkgKyAxKTsKKyAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgcmVwbGFjZW1lbnQgPSBzc3RhYmxlLmNsb25lV2l0aE5ld1N1bW1hcnlTYW1wbGluZ0xldmVsKHN0b3JlLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldFNhbXBsaW5nTGV2ZWwoKSArIDEpOwogICAgICAgICAgICAgdHhuLnVwZGF0ZShyZXBsYWNlbWVudCwgdHJ1ZSk7CiAgICAgICAgICAgICB0eG4uZmluaXNoKCk7CiAgICAgICAgIH0KLSAgICAgICAgU1NUYWJsZVJlYWRlciByZW9wZW4gPSBTU1RhYmxlUmVhZGVyLm9wZW4oc3N0YWJsZS5kZXNjcmlwdG9yKTsKLSAgICAgICAgYXNzZXJ0IHJlb3Blbi5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkgPT0gc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkgKyAxOworICAgICAgICBSIHJlb3BlbiA9IChSKSBTU1RhYmxlUmVhZGVyLm9wZW4oc3RvcmUsIHNzdGFibGUuZGVzY3JpcHRvcik7CisgICAgICAgIGFzc2VydCByZW9wZW4uZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpID09IHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpICsgMTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0SW5kZXhRdWVyeVdvcmtzKENvbHVtbkZhbWlseVN0b3JlIGluZGV4ZWRDRlMpCkBAIC03NDEsOSArMTA3MywxOSBAQAogICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChuZXcgUmFuZ2U8PihsZWZ0LCByaWdodCkpOwogICAgIH0KIAotICAgIHByaXZhdGUgRGVjb3JhdGVkS2V5IGsoaW50IGkpCisgICAgcHJpdmF0ZSBEZWNvcmF0ZWRLZXkgZGsoaW50IGkpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlckRlY29yYXRlZEtleSh0KGkpLCBCeXRlQnVmZmVyVXRpbC5ieXRlcyhTdHJpbmcudmFsdWVPZihpKSkpOworICAgICAgICByZXR1cm4gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoa2V5Rm9yKGkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBCeXRlQnVmZmVyIGtleUZvcihpbnQgaSkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcyhTdHJpbmcudmFsdWVPZihpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBEZWNvcmF0ZWRLZXkgY29sbGlzaW9uRm9yKGludCBpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KFV0aWwuZ2VuZXJhdGVNdXJtdXJDb2xsaXNpb24oQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoU3RyaW5nLnZhbHVlT2YoaSkpKSk7CiAgICAgfQogCiAgICAgQFRlc3QoZXhwZWN0ZWQgPSBSdW50aW1lRXhjZXB0aW9uLmNsYXNzKQpAQCAtNzgxLDE5ICsxMTIzLDE5IEBACiAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgbmV3IGRpcmVjdG9yeSBpcyBlbXB0eSBhbmQgdGhhdCB0aGUgb2xkIGZpbGVzIGV4aXN0OgogICAgICAgICBmb3IgKENvbXBvbmVudCBjIDogc3N0YWJsZS5jb21wb25lbnRzKQogICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShub3RMaXZlRGVzYy5maWxlbmFtZUZvcihjKSk7CisgICAgICAgICAgICBGaWxlIGYgPSBub3RMaXZlRGVzYy5maWxlRm9yKGMpOwogICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZi5leGlzdHMoKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG5ldyBGaWxlKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihjKSkuZXhpc3RzKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZUZvcihjKS5leGlzdHMoKSk7CiAgICAgICAgIH0KICAgICAgICAgU1NUYWJsZVJlYWRlci5tb3ZlQW5kT3BlblNTVGFibGUoY2ZzLCBzc3RhYmxlLmRlc2NyaXB0b3IsIG5vdExpdmVEZXNjLCBzc3RhYmxlLmNvbXBvbmVudHMsIGZhbHNlKTsKICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBmaWxlcyB3ZXJlIG1vdmVkOgogICAgICAgICBmb3IgKENvbXBvbmVudCBjIDogc3N0YWJsZS5jb21wb25lbnRzKQogICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShub3RMaXZlRGVzYy5maWxlbmFtZUZvcihjKSk7CisgICAgICAgICAgICBGaWxlIGYgPSBub3RMaXZlRGVzYy5maWxlRm9yKGMpOwogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmLmV4aXN0cygpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZi50b1N0cmluZygpLmNvbnRhaW5zKFN0cmluZy5mb3JtYXQoIi0lcy0iLCBpZCkpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZi50b1N0cmluZygpLmNvbnRhaW5zKGZvcm1hdCgiLSVzLSIsIGlkKSkpOwogICAgICAgICAgICAgZi5kZWxldGVPbkV4aXQoKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKG5ldyBGaWxlKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihjKSkuZXhpc3RzKCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVGb3IoYykuZXhpc3RzKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC04MzcsNDAgKzExNzksNDAgQEAKICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gc2V0VXBGb3JUZXN0VmVyZml5Q29tcHJlc3Npb25JbmZvRXhpc3RlbmNlKCk7CiAKICAgICAgICAgLy8gZGVsZXRlIHRoZSBjb21wcmVzc2lvbiBpbmZvLCBzbyBpdCBpcyBjb3JydXB0ZWQuCi0gICAgICAgIEZpbGUgY29tcHJlc3Npb25JbmZvRmlsZSA9IG5ldyBGaWxlKGRlc2MuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkNPTVBSRVNTSU9OX0lORk8pKTsKKyAgICAgICAgRmlsZSBjb21wcmVzc2lvbkluZm9GaWxlID0gZGVzYy5maWxlRm9yKENvbXBvbmVudHMuQ09NUFJFU1NJT05fSU5GTyk7CiAgICAgICAgIGNvbXByZXNzaW9uSW5mb0ZpbGUudHJ5RGVsZXRlKCk7CiAgICAgICAgIGFzc2VydEZhbHNlKCJDb21wcmVzc2lvbkluZm8gZmlsZSBzaG91bGQgbm90IGV4aXN0IiwgY29tcHJlc3Npb25JbmZvRmlsZS5leGlzdHMoKSk7CiAKICAgICAgICAgLy8gZGlzY292ZXJ0IHRoZSBjb21wb25lbnRzIG9uIGRpc2sgYWZ0ZXIgZGVsZXRpb24KLSAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IFNTVGFibGUuZGlzY292ZXJDb21wb25lbnRzRm9yKGRlc2MpOworICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gZGVzYy5kaXNjb3ZlckNvbXBvbmVudHMoKTsKIAogICAgICAgICBleHBlY3RlZEV4Y2VwdGlvbi5leHBlY3QoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24uY2xhc3MpOwogICAgICAgICBleHBlY3RlZEV4Y2VwdGlvbi5leHBlY3RNZXNzYWdlKCJDb21wcmVzc2lvbkluZm8uZGIiKTsKLSAgICAgICAgU1NUYWJsZVJlYWRlci52ZXJpZnlDb21wcmVzc2lvbkluZm9FeGlzdGVuY2VJZkFwcGxpY2FibGUoZGVzYywgY29tcG9uZW50cyk7CisgICAgICAgIENvbXByZXNzaW9uSW5mb0NvbXBvbmVudC52ZXJpZnlDb21wcmVzc2lvbkluZm9FeGlzdGVuY2VJZkFwcGxpY2FibGUoZGVzYywgY29tcG9uZW50cyk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5Q29tcHJlc3Npb25JbmZvRXhpc3RlbmNlV2hlblRPQ1VuYWJsZVRvT3BlbigpCiAgICAgewogICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBzZXRVcEZvclRlc3RWZXJmaXlDb21wcmVzc2lvbkluZm9FeGlzdGVuY2UoKTsKLSAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IFNTVGFibGUuZGlzY292ZXJDb21wb25lbnRzRm9yKGRlc2MpOwotICAgICAgICBTU1RhYmxlUmVhZGVyLnZlcmlmeUNvbXByZXNzaW9uSW5mb0V4aXN0ZW5jZUlmQXBwbGljYWJsZShkZXNjLCBjb21wb25lbnRzKTsKKyAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IGRlc2MuZGlzY292ZXJDb21wb25lbnRzKCk7CisgICAgICAgIENvbXByZXNzaW9uSW5mb0NvbXBvbmVudC52ZXJpZnlDb21wcmVzc2lvbkluZm9FeGlzdGVuY2VJZkFwcGxpY2FibGUoZGVzYywgY29tcG9uZW50cyk7CiAKICAgICAgICAgLy8gbWFyayB0aGUgdG9jIGZpbGUgbm90IHJlYWRhYmxlIGluIG9yZGVyIHRvIHRyaWdnZXIgdGhlIEZTUmVhZEVycm9yCi0gICAgICAgIEZpbGUgdG9jRmlsZSA9IG5ldyBGaWxlKGRlc2MuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlRPQykpOworICAgICAgICBGaWxlIHRvY0ZpbGUgPSBkZXNjLmZpbGVGb3IoQ29tcG9uZW50cy5UT0MpOwogICAgICAgICB0b2NGaWxlLnRyeVNldFJlYWRhYmxlKGZhbHNlKTsKIAogICAgICAgICBleHBlY3RlZEV4Y2VwdGlvbi5leHBlY3QoRlNSZWFkRXJyb3IuY2xhc3MpOwogICAgICAgICBleHBlY3RlZEV4Y2VwdGlvbi5leHBlY3RNZXNzYWdlKCJUT0MudHh0Iik7Ci0gICAgICAgIFNTVGFibGVSZWFkZXIudmVyaWZ5Q29tcHJlc3Npb25JbmZvRXhpc3RlbmNlSWZBcHBsaWNhYmxlKGRlc2MsIGNvbXBvbmVudHMpOworICAgICAgICBDb21wcmVzc2lvbkluZm9Db21wb25lbnQudmVyaWZ5Q29tcHJlc3Npb25JbmZvRXhpc3RlbmNlSWZBcHBsaWNhYmxlKGRlc2MsIGNvbXBvbmVudHMpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeUNvbXByZXNzaW9uSW5mb0V4aXN0ZW5jZVBhc3NlcygpCiAgICAgewogICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBzZXRVcEZvclRlc3RWZXJmaXlDb21wcmVzc2lvbkluZm9FeGlzdGVuY2UoKTsKLSAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IFNTVGFibGUuZGlzY292ZXJDb21wb25lbnRzRm9yKGRlc2MpOwotICAgICAgICBTU1RhYmxlUmVhZGVyLnZlcmlmeUNvbXByZXNzaW9uSW5mb0V4aXN0ZW5jZUlmQXBwbGljYWJsZShkZXNjLCBjb21wb25lbnRzKTsKKyAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IGRlc2MuZGlzY292ZXJDb21wb25lbnRzKCk7CisgICAgICAgIENvbXByZXNzaW9uSW5mb0NvbXBvbmVudC52ZXJpZnlDb21wcmVzc2lvbkluZm9FeGlzdGVuY2VJZkFwcGxpY2FibGUoZGVzYywgY29tcG9uZW50cyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBEZXNjcmlwdG9yIHNldFVwRm9yVGVzdFZlcmZpeUNvbXByZXNzaW9uSW5mb0V4aXN0ZW5jZSgpCkBAIC04ODEsOCArMTIyMyw4IEBACiAgICAgICAgIGNmcy5jbGVhclVuc2FmZSgpOwogICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBzc3RhYmxlLmRlc2NyaXB0b3I7CiAKLSAgICAgICAgRmlsZSBjb21wcmVzc2lvbkluZm9GaWxlID0gbmV3IEZpbGUoZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuQ09NUFJFU1NJT05fSU5GTykpOwotICAgICAgICBGaWxlIHRvY0ZpbGUgPSBuZXcgRmlsZShkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5UT0MpKTsKKyAgICAgICAgRmlsZSBjb21wcmVzc2lvbkluZm9GaWxlID0gZGVzYy5maWxlRm9yKENvbXBvbmVudHMuQ09NUFJFU1NJT05fSU5GTyk7CisgICAgICAgIEZpbGUgdG9jRmlsZSA9IGRlc2MuZmlsZUZvcihDb21wb25lbnRzLlRPQyk7CiAgICAgICAgIGFzc2VydFRydWUoIkNvbXByZXNzaW9uSW5mbyBmaWxlIHNob3VsZCBleGlzdCIsIGNvbXByZXNzaW9uSW5mb0ZpbGUuZXhpc3RzKCkpOwogICAgICAgICBhc3NlcnRUcnVlKCJUT0MgZmlsZSBzaG91bGQgZXhpc3QiLCB0b2NGaWxlLmV4aXN0cygpKTsKICAgICAgICAgcmV0dXJuIGRlc2M7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlUmV3cml0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlUmV3cml0ZXJUZXN0LmphdmEKaW5kZXggYzg4ZTBiMC4uZmUzZmYyNyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVJld3JpdGVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVSZXdyaXRlclRlc3QuamF2YQpAQCAtMTksNyArMTksMTIgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKIApAQCAtMjcsOCArMzIsOCBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXBkYXRlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuTmFtZWRUaHJlYWRGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKQEAgLTM2LDI0ICs0MSwyNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd1VwZGF0ZUJ1aWxkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuVmlldzsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkVuY29kaW5nU3RhdHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5BYnN0cmFjdENvbXBhY3Rpb25TdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25Db250cm9sbGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLlNTVGFibGVTcGxpdHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLlNTVGFibGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLlZpZXc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5JbW11dGFibGVCVHJlZVBhcnRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkVuY29kaW5nU3RhdHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuU1NUYWJsZVNldDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVXcml0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlN0b3JhZ2VNZXRyaWNzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwpAQCAtNjIsNyArNjcsMTAgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlLkNPTVBBQ1RJT047CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzLm5vd0luU2Vjb25kczsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJRDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOwogCkBAIC0yMDUsNyArMjEzLDkgQEAKICAgICAgICAgU1NUYWJsZVJlYWRlciBzID0gd3JpdGVGaWxlKGNmcywgMTAwMCk7CiAgICAgICAgIGNmcy5hZGRTU1RhYmxlKHMpOwogICAgICAgICBsb25nIHN0YXJ0U3RvcmFnZU1ldHJpY3NMb2FkID0gU3RvcmFnZU1ldHJpY3MubG9hZC5nZXRDb3VudCgpOworICAgICAgICBsb25nIHN0YXJ0VW5jb21wcmVzc2VkTG9hZCA9IFN0b3JhZ2VNZXRyaWNzLnVuY29tcHJlc3NlZExvYWQuZ2V0Q291bnQoKTsKICAgICAgICAgbG9uZyBzQnl0ZXNPbkRpc2sgPSBzLmJ5dGVzT25EaXNrKCk7CisgICAgICAgIGxvbmcgc0J5dGVzT25EaXNrVW5jb21wcmVzc2VkID0gcy5sb2dpY2FsQnl0ZXNPbkRpc2soKTsKICAgICAgICAgU2V0PFNTVGFibGVSZWFkZXI+IGNvbXBhY3RpbmcgPSBTZXRzLm5ld0hhc2hTZXQocyk7CiAKICAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlczsKQEAgLTIzNiwxMSArMjQ2LDE1IEBACiAKICAgICAgICAgTGlmZWN5Y2xlVHJhbnNhY3Rpb24ud2FpdEZvckRlbGV0aW9ucygpOwogCi0gICAgICAgIGxvbmcgc3VtID0gMDsKLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHggOiBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpCi0gICAgICAgICAgICBzdW0gKz0geC5ieXRlc09uRGlzaygpOworICAgICAgICBsb25nIHN1bSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5zdHJlYW0oKS5tYXBUb0xvbmcoU1NUYWJsZVJlYWRlcjo6Ynl0ZXNPbkRpc2spLnN1bSgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoc3VtLCBjZnMubWV0cmljLmxpdmVEaXNrU3BhY2VVc2VkLmdldENvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc3RhcnRTdG9yYWdlTWV0cmljc0xvYWQgLSBzQnl0ZXNPbkRpc2sgKyBzdW0sIFN0b3JhZ2VNZXRyaWNzLmxvYWQuZ2V0Q291bnQoKSk7CisgICAgICAgIGxvbmcgZW5kTG9hZCA9IFN0b3JhZ2VNZXRyaWNzLmxvYWQuZ2V0Q291bnQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN0YXJ0U3RvcmFnZU1ldHJpY3NMb2FkIC0gc0J5dGVzT25EaXNrICsgc3VtLCBlbmRMb2FkKTsKKworICAgICAgICBsb25nIHVuY29tcHJlc3NlZFN1bSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5zdHJlYW0oKS5tYXBUb0xvbmcodCAtPiB0LmxvZ2ljYWxCeXRlc09uRGlzaygpKS5zdW0oKTsKKyAgICAgICAgbG9uZyBlbmRVbmNvbXByZXNzZWRMb2FkID0gU3RvcmFnZU1ldHJpY3MudW5jb21wcmVzc2VkTG9hZC5nZXRDb3VudCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3RhcnRVbmNvbXByZXNzZWRMb2FkIC0gc0J5dGVzT25EaXNrVW5jb21wcmVzc2VkICsgdW5jb21wcmVzc2VkU3VtLCBlbmRVbmNvbXByZXNzZWRMb2FkKTsKKwogICAgICAgICBhc3NlcnRFcXVhbHMoZmlsZXMsIHNzdGFibGVzLnNpemUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhmaWxlcywgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CiAgICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uLndhaXRGb3JEZWxldGlvbnMoKTsKQEAgLTg3OCwzOSArODkyLDE4IEBACiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBVbmZpbHRlcmVkUm93SXRlcmF0b3IgdXJpID0gbW9jayhVbmZpbHRlcmVkUm93SXRlcmF0b3IuY2xhc3MpOwotICAgICAgICAgICAgICAgIHdoZW4odXJpLnBhcnRpdGlvbkxldmVsRGVsZXRpb24oKSkudGhlblJldHVybihuZXcgRGVsZXRpb25UaW1lKDAsMCkpOworICAgICAgICAgICAgICAgIHdoZW4odXJpLnBhcnRpdGlvbkxldmVsRGVsZXRpb24oKSkudGhlblJldHVybihuZXcgRGVsZXRpb25UaW1lKDAsIDApKTsKICAgICAgICAgICAgICAgICB3aGVuKHVyaS5wYXJ0aXRpb25LZXkoKSkudGhlblJldHVybihib3BLZXlGcm9tSW50KDApKTsKICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IGJlIGFibGUgdG8gYXBwZW5kIGFmdGVyIGJ1ZmZlciByZWxlYXNlIG9uIHN3aXRjaAogICAgICAgICAgICAgICAgIGZpcnN0V3JpdGVyLmFwcGVuZCh1cmkpOwogICAgICAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIEFzc2VydGlvbkVycm9yIHdhcyBub3QgdGhyb3duLiIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goQXNzZXJ0aW9uRXJyb3IgYWUpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWFlLmdldE1lc3NhZ2UoKS5jb250YWlucygidXBkYXRlIGlzIGJlaW5nIGNhbGxlZCBhZnRlciByZWxlYXNlQnVmZmVycyIpKQorICAgICAgICAgICAgY2F0Y2ggKEFzc2VydGlvbkVycm9yIGFlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYWUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJ1cGRhdGUgaXMgYmVpbmcgY2FsbGVkIGFmdGVyIHJlbGVhc2VCdWZmZXJzIikgJiYgIWFlLmdldE1lc3NhZ2UoKS5jb250YWlucygiQXR0ZW1wdCB0byB1c2UgYSBjbG9zZWQgZGF0YSBvdXRwdXQiKSkKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgYWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICAvLyBDYW4gdXBkYXRlIGEgd3JpdGVyIHRoYXQgaXMgbm90IGVhZ2VybHkgY2xlYXJlZCBvbiBzd2l0Y2gKLSAgICAgICAgZWFnZXJXcml0ZXJNZXRhUmVsZWFzZSA9IGZhbHNlOwotICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KG5ldyBIYXNoU2V0PD4oKSwgT3BlcmF0aW9uVHlwZS5VTktOT1dOKTsKLSAgICAgICAgICAgICBTU1RhYmxlUmV3cml0ZXIgcmV3cml0ZXIgPSBuZXcgU1NUYWJsZVJld3JpdGVyKHR4biwgMTAwMCwgMTAwMDAwMCwgZmFsc2UsIGVhZ2VyV3JpdGVyTWV0YVJlbGVhc2UpCi0gICAgICAgICkKLSAgICAgICAgewotICAgICAgICAgICAgU1NUYWJsZVdyaXRlciBmaXJzdFdyaXRlciA9IGdldFdyaXRlcihjZnMsIGRpciwgdHhuKTsKLSAgICAgICAgICAgIHJld3JpdGVyLnN3aXRjaFdyaXRlcihmaXJzdFdyaXRlcik7Ci0KLSAgICAgICAgICAgIC8vIEF0IGxlYXN0IG9uZSB3cml0ZSBzbyBpdCdzIG5vdCBhYm9ydGVkIHdoZW4gc3dpdGNoZWQgb3V0LgotICAgICAgICAgICAgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHVyaSA9IG1vY2soVW5maWx0ZXJlZFJvd0l0ZXJhdG9yLmNsYXNzKTsKLSAgICAgICAgICAgIHdoZW4odXJpLnBhcnRpdGlvbkxldmVsRGVsZXRpb24oKSkudGhlblJldHVybihuZXcgRGVsZXRpb25UaW1lKDAsMCkpOwotICAgICAgICAgICAgd2hlbih1cmkucGFydGl0aW9uS2V5KCkpLnRoZW5SZXR1cm4oYm9wS2V5RnJvbUludCgwKSk7Ci0gICAgICAgICAgICByZXdyaXRlci5hcHBlbmQodXJpKTsKLQotICAgICAgICAgICAgcmV3cml0ZXIuc3dpdGNoV3JpdGVyKGdldFdyaXRlcihjZnMsIGRpciwgdHhuKSk7Ci0KLSAgICAgICAgICAgIC8vIHNob3VsZCBiZSBhYmxlIHRvIGFwcGVuZCBhZnRlciBzd2l0Y2gsIGFuZCBhc3NlcnQgaXMgbm90IHRyaXBwZWQKLSAgICAgICAgICAgIHdoZW4odXJpLnBhcnRpdGlvbktleSgpKS50aGVuUmV0dXJuKGJvcEtleUZyb21JbnQoMSkpOwotICAgICAgICAgICAgZmlyc3RXcml0ZXIuYXBwZW5kKHVyaSk7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICBzdGF0aWMgRGVjb3JhdGVkS2V5IGJvcEtleUZyb21JbnQoaW50IGkpCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlU2Nhbm5lclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVTY2FubmVyVGVzdC5qYXZhCmluZGV4IDkyMjIwMGEuLjE3YjhhNmMgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVTY2FubmVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVTY2FubmVyVGVzdC5qYXZhCkBAIC0yMiwxNiArMjIsMTQgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwotCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5VbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGF0YVJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKQEAgLTQxLDE5ICszOSwyMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNsaWNlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ2x1c3RlcmluZ0luZGV4U2xpY2VGaWx0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQWJzdHJhY3RCb3VuZHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkc0xpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQWJzdHJhY3RCb3VuZHMuaXNFbXB0eTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiBwdWJsaWMgY2xhc3MgU1NUYWJsZVNjYW5uZXJUZXN0CiB7CkBAIC0yMzksNyArMjQwLDcgQEAKICAgICAgICAgLy8gZW5kIG9mIHJhbmdlIGVkZ2UgY29uZGl0aW9ucwogICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCAxLCA4LCAyLCA4KTsKICAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgMSwgOSwgMiwgOSk7Ci0gICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDEsIDksIDIsIDkpOworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCAxLCA5OSwgMiwgOSk7CiAKICAgICAgICAgLy8gc2luZ2xlIGl0ZW0gcmFuZ2VzCiAgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDIsIDIsIDIsIDIpOwpAQCAtMjkwLDYgKzI5MSw5MyBAQAogICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCAxLCAwLCAyLCA5KTsKICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVEYXRhUmFuZ2VXaXRoTW92ZWRTdGFydCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgc3RvcmUgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShUQUJMRSk7CisgICAgICAgIHN0b3JlLmNsZWFyVW5zYWZlKCk7CisKKyAgICAgICAgLy8gZGlzYWJsZSBjb21wYWN0aW9uIHdoaWxlIGZsdXNoaW5nCisgICAgICAgIHN0b3JlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAyOyBpIDwgMTA7IGkrKykKKyAgICAgICAgICAgIGluc2VydFJvd1dpdGhLZXkoc3RvcmUubWV0YWRhdGEoKSwgaSk7CisgICAgICAgIFV0aWwuZmx1c2goc3RvcmUpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBzdG9yZS5nZXRMaXZlU1NUYWJsZXMoKS5zaXplKCkpOworICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBzdG9yZS5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgc3N0YWJsZSA9IHNzdGFibGUuY2xvbmVXaXRoTmV3U3RhcnQoZGsoNCkpOworCisgICAgICAgIC8vIGZ1bGwgcmFuZ2Ugc2NhbgorICAgICAgICBJU1NUYWJsZVNjYW5uZXIgc2Nhbm5lciA9IHNzdGFibGUuZ2V0U2Nhbm5lcigpOworICAgICAgICBmb3IgKGludCBpID0gNDsgaSA8IDEwOyBpKyspCisgICAgICAgICAgICBhc3NlcnRFcXVhbHModG9LZXkoaSksIG5ldyBTdHJpbmcoc2Nhbm5lci5uZXh0KCkucGFydGl0aW9uS2V5KCkuZ2V0S2V5KCkuYXJyYXkoKSkpOworCisgICAgICAgIHNjYW5uZXIuY2xvc2UoKTsKKworICAgICAgICAvLyBhIHNpbXBsZSByZWFkIG9mIGEgY2h1bmsgaW4gdGhlIG1pZGRsZQorICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCAzLCA2LCA0LCA2KTsKKworICAgICAgICAvLyBzdGFydCBvZiByYW5nZSBlZGdlIGNvbmRpdGlvbnMKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgMywgOSwgNCwgOSk7CisgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDQsIDksIDQsIDkpOworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCA1LCA5LCA0LCA5KTsKKworICAgICAgICAvLyBlbmQgb2YgcmFuZ2UgZWRnZSBjb25kaXRpb25zCisgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDEsIDgsIDQsIDgpOworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCAxLCA5LCA0LCA5KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgMSwgOTksIDQsIDkpOworCisgICAgICAgIC8vIHNpbmdsZSBpdGVtIHJhbmdlcworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCA0LCA0LCA0LCA0KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgNSwgNSwgNSwgNSk7CisgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDksIDksIDksIDkpOworCisgICAgICAgIC8vIGVtcHR5IHJhbmdlcworICAgICAgICBhc3NlcnRTY2FuRW1wdHkoc3N0YWJsZSwgMiwgMyk7CisgICAgICAgIGFzc2VydFNjYW5FbXB0eShzc3RhYmxlLCAxMCwgMTEpOworCisgICAgICAgIC8vIHdyYXBwaW5nLCBzdGFydHMgaW4gbWlkZGxlCisgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDcsIDUsIDQsIDUsIDcsIDkpOworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCA1LCA0LCA0LCA0LCA1LCA5KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgNSwgMywgNSwgOSk7CisgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDUsIEludGVnZXIuTUlOX1ZBTFVFLCA1LCA5KTsKKyAgICAgICAgLy8gd3JhcHBpbmcsIHN0YXJ0cyBhdCBlbmQKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgOSwgOCwgNCwgOCwgOSwgOSk7CisgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDksIDUsIDQsIDUsIDksIDkpOworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCA5LCA0LCA0LCA0LCA5LCA5KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgOSwgMywgOSwgOSk7CisgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDksIEludGVnZXIuTUlOX1ZBTFVFLCA5LCA5KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgOCwgNSwgNCwgNSwgOCwgOSk7CisgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDgsIDQsIDQsIDQsIDgsIDkpOworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCA4LCAzLCA4LCA5KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgOCwgSW50ZWdlci5NSU5fVkFMVUUsIDgsIDkpOworICAgICAgICAvLyB3cmFwcGluZywgc3RhcnRzIHBhc3QgZW5kCisgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDEwLCA5LCA0LCA5KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgMTAsIDUsIDQsIDUpOworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCAxMCwgNCwgNCwgNCk7CisgICAgICAgIGFzc2VydFNjYW5FbXB0eShzc3RhYmxlLCAxMCwgMyk7CisgICAgICAgIGFzc2VydFNjYW5FbXB0eShzc3RhYmxlLCAxMCwgSW50ZWdlci5NSU5fVkFMVUUpOworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCAxMSwgMTAsIDQsIDkpOworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCAxMSwgOSwgNCwgOSk7CisgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDExLCA1LCA0LCA1KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgMTEsIDQsIDQsIDQpOworICAgICAgICBhc3NlcnRTY2FuRW1wdHkoc3N0YWJsZSwgMTEsIDMpOworICAgICAgICBhc3NlcnRTY2FuRW1wdHkoc3N0YWJsZSwgMTEsIEludGVnZXIuTUlOX1ZBTFVFKTsKKyAgICAgICAgLy8gd3JhcHBpbmcsIHN0YXJ0cyBhdCBzdGFydAorICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCA1LCAxLCA1LCA5KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgNSwgSW50ZWdlci5NSU5fVkFMVUUsIDUsIDkpOworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCA0LCAxLCA0LCA5KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgNCwgSW50ZWdlci5NSU5fVkFMVUUsIDQsIDkpOworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCAxLCAwLCA0LCA5KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgMSwgSW50ZWdlci5NSU5fVkFMVUUsIDQsIDkpOworICAgICAgICAvLyB3cmFwcGluZywgc3RhcnRzIGJlZm9yZQorICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCAzLCAtMSwgNCwgOSk7CisgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDMsIEludGVnZXIuTUlOX1ZBTFVFLCA0LCA5KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgMywgMCwgNCwgOSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRTY2FuQ29udGFpbnNSYW5nZXMoSVNTVGFibGVTY2FubmVyIHNjYW5uZXIsIGludCAuLi4gcmFuZ2VQYWlycykgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBhc3NlcnQgcmFuZ2VQYWlycy5sZW5ndGggJSAyID09IDA7CkBAIC00NTgsNCArNTQ2LDQ5IEBACiAgICAgICAgIC8vIHRoaXMgd2lsbCBjdXJyZW50bHkgZmFpbAogICAgICAgICBhc3NlcnRTY2FuQ29udGFpbnNSYW5nZXMoc2Nhbm5lciwgMjA1LCAyMDUpOwogICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdFJlcXVlc3ROZXh0Um93SXRlcmF0b3JXaXRob3V0Q29uc3VtaW5nUHJldmlvdXMoQ29uc3VtZXI8SVNTVGFibGVTY2FubmVyPiBjb25zdW1lcikKKyAgICB7CisgICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoVEFCTEUpOworICAgICAgICBzdG9yZS5jbGVhclVuc2FmZSgpOworCisgICAgICAgIC8vIGRpc2FibGUgY29tcGFjdGlvbiB3aGlsZSBmbHVzaGluZworICAgICAgICBzdG9yZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKworICAgICAgICBpbnNlcnRSb3dXaXRoS2V5KHN0b3JlLm1ldGFkYXRhKCksIDApOworICAgICAgICBzdG9yZS5mb3JjZUJsb2NraW5nRmx1c2goQ29sdW1uRmFtaWx5U3RvcmUuRmx1c2hSZWFzb24uVU5JVF9URVNUUyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN0b3JlLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CisgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IHN0b3JlLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOworCisgICAgICAgIHRyeSAoSVNTVGFibGVTY2FubmVyIHNjYW5uZXIgPSBzc3RhYmxlLmdldFNjYW5uZXIoKTsKKyAgICAgICAgICAgICBVbmZpbHRlcmVkUm93SXRlcmF0b3IgY3VycmVudFJvd0l0ZXJhdG9yID0gc2Nhbm5lci5uZXh0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY3VycmVudFJvd0l0ZXJhdG9yLmhhc05leHQoKSk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdW1lci5hY2NlcHQoc2Nhbm5lcik7CisgICAgICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhlIFVuZmlsdGVyZWRSb3dJdGVyYXRvciByZXR1cm5lZCBieSB0aGUgbGFzdCBjYWxsIHRvIG5leHQoKSB3YXMgaW5pdGlhbGl6ZWQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXQgbXVzdCBiZSBjbG9zZWQgYmVmb3JlIGNhbGxpbmcgaGFzTmV4dCgpIG9yIG5leHQoKSBhZ2Fpbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0Um93SXRlcmF0b3JXaXRob3V0Q29uc3VtaW5nUHJldmlvdXMoKQorICAgIHsKKyAgICAgICAgdGVzdFJlcXVlc3ROZXh0Um93SXRlcmF0b3JXaXRob3V0Q29uc3VtaW5nUHJldmlvdXMoSVNTVGFibGVTY2FubmVyOjpoYXNOZXh0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXh0Um93SXRlcmF0b3JXaXRob3V0Q29uc3VtaW5nUHJldmlvdXMoKQorICAgIHsKKyAgICAgICAgdGVzdFJlcXVlc3ROZXh0Um93SXRlcmF0b3JXaXRob3V0Q29uc3VtaW5nUHJldmlvdXMoSVNTVGFibGVTY2FubmVyOjpuZXh0KTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlVXRpbHMuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVVdGlscy5qYXZhCmluZGV4IGNkZDNlZTAuLjA1OTY0YTggMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVVdGlscy5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVVdGlscy5qYXZhCkBAIC0xOSwyMyArMTksMzYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVndWxhckFuZFN0YXRpY0NvbHVtbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93VXBkYXRlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uVXBkYXRlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuRW5jb2RpbmdTdGF0czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIAotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkFjdGl2ZVJlcGFpclNlcnZpY2UuKjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5BY3RpdmVSZXBhaXJTZXJ2aWNlLk5PX1BFTkRJTkdfUkVQQUlSOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkFjdGl2ZVJlcGFpclNlcnZpY2UuVU5SRVBBSVJFRF9TU1RBQkxFOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogcHVibGljIGNsYXNzIFNTVGFibGVVdGlscwpAQCAtODAsNyArOTMsNyBAQAogICAgICAgICBGaWxlIGNmRGlyID0gbmV3IEZpbGUodGVtcGRpciwga2V5c3BhY2VOYW1lICsgRmlsZS5wYXRoU2VwYXJhdG9yKCkgKyBjZm5hbWUpOwogICAgICAgICBjZkRpci50cnlDcmVhdGVEaXJlY3RvcmllcygpOwogICAgICAgICBjZkRpci5kZWxldGVPbkV4aXQoKTsKLSAgICAgICAgRmlsZSBkYXRhZmlsZSA9IG5ldyBGaWxlKG5ldyBEZXNjcmlwdG9yKGNmRGlyLCBrZXlzcGFjZU5hbWUsIGNmbmFtZSwgaWQsIFNTVGFibGVGb3JtYXQuVHlwZS5CSUcpLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSk7CisgICAgICAgIEZpbGUgZGF0YWZpbGUgPSBuZXcgRGVzY3JpcHRvcihjZkRpciwga2V5c3BhY2VOYW1lLCBjZm5hbWUsIGlkLCBCaWdGb3JtYXQuZ2V0SW5zdGFuY2UoKSkuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpOwogICAgICAgICBpZiAoIWRhdGFmaWxlLmNyZWF0ZUZpbGVJZk5vdEV4aXN0cygpKQogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJ1bmFibGUgdG8gY3JlYXRlIGZpbGUgIiArIGRhdGFmaWxlKTsKICAgICAgICAgZGF0YWZpbGUuZGVsZXRlT25FeGl0KCk7CkBAIC0yMTYsMTEgKzIyOSwxMSBAQAogCiAgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IHdyaXRlKGludCBleHBlY3RlZFNpemUsIEFwcGVuZGVyIGFwcGVuZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewotICAgICAgICAgICAgRmlsZSBkYXRhZmlsZSA9IChkZXN0ID09IG51bGwpID8gdGVtcFNTVGFibGVGaWxlKGtzbmFtZSwgY2ZuYW1lLCBpZCkgOiBuZXcgRmlsZShkZXN0LmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSk7CisgICAgICAgICAgICBGaWxlIGRhdGFmaWxlID0gKGRlc3QgPT0gbnVsbCkgPyB0ZW1wU1NUYWJsZUZpbGUoa3NuYW1lLCBjZm5hbWUsIGlkKSA6IGRlc3QuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpOwogICAgICAgICAgICAgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSA9IFNjaGVtYS5pbnN0YW5jZS5nZXRUYWJsZU1ldGFkYXRhKGtzbmFtZSwgY2ZuYW1lKTsKICAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IFNjaGVtYS5pbnN0YW5jZS5nZXRDb2x1bW5GYW1pbHlTdG9yZUluc3RhbmNlKG1ldGFkYXRhLmlkKTsKICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyID0gYXBwZW5kZXIuaGVhZGVyKCk7Ci0gICAgICAgICAgICBTU1RhYmxlVHhuV3JpdGVyIHdyaXRlciA9IFNTVGFibGVUeG5Xcml0ZXIuY3JlYXRlKGNmcywgRGVzY3JpcHRvci5mcm9tRmlsZW5hbWUoZGF0YWZpbGUuYWJzb2x1dGVQYXRoKCkpLCBleHBlY3RlZFNpemUsIFVOUkVQQUlSRURfU1NUQUJMRSwgTk9fUEVORElOR19SRVBBSVIsIGZhbHNlLCAwLCBoZWFkZXIpOworICAgICAgICAgICAgU1NUYWJsZVR4bldyaXRlciB3cml0ZXIgPSBTU1RhYmxlVHhuV3JpdGVyLmNyZWF0ZShjZnMsIERlc2NyaXB0b3IuZnJvbUZpbGVXaXRoQ29tcG9uZW50KGRhdGFmaWxlLCBmYWxzZSkubGVmdCwgZXhwZWN0ZWRTaXplLCBVTlJFUEFJUkVEX1NTVEFCTEUsIE5PX1BFTkRJTkdfUkVQQUlSLCBmYWxzZSwgMCwgaGVhZGVyKTsKICAgICAgICAgICAgIHdoaWxlIChhcHBlbmRlci5hcHBlbmQod3JpdGVyKSkgeyAvKiBwYXNzICovIH0KICAgICAgICAgICAgIENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gcmVhZGVycyA9IHdyaXRlci5maW5pc2godHJ1ZSk7CiAKQEAgLTIyOCw3ICsyNDEsNyBAQAogICAgICAgICAgICAgaWYgKGNsZWFudXApCiAgICAgICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHJlYWRlcjogcmVhZGVycykKICAgICAgICAgICAgICAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogcmVhZGVyLmNvbXBvbmVudHMpCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShyZWFkZXIuZGVzY3JpcHRvci5maWxlbmFtZUZvcihjb21wb25lbnQpKS5kZWxldGVPbkV4aXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5kZXNjcmlwdG9yLmZpbGVGb3IoY29tcG9uZW50KS5kZWxldGVPbkV4aXQoKTsKICAgICAgICAgICAgIHJldHVybiByZWFkZXJzOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVdyaXRlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVXcml0ZXJUZXN0LmphdmEKaW5kZXggNWQyMDM2Ny4uYWQ2YmQ2MSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVdyaXRlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlV3JpdGVyVGVzdC5qYXZhCkBAIC0yMCwyNyArMjAsMjkgQEAKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXBkYXRlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbGljZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkc0xpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkFjdGl2ZVJlcGFpclNlcnZpY2UuTk9fUEVORElOR19SRVBBSVI7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQWN0aXZlUmVwYWlyU2VydmljZS5VTlJFUEFJUkVEX1NTVEFCTEU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlELkdlbmVyYXRvci5uZXh0VGltZVVVSUQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAogcHVibGljIGNsYXNzIFNTVGFibGVXcml0ZXJUZXN0IGV4dGVuZHMgU1NUYWJsZVdyaXRlclRlc3RCYXNlCiB7CkBAIC02MywzNCArNjUsMzggQEAKICAgICAgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKGJ1aWxkZXIuYnVpbGQoKS51bmZpbHRlcmVkSXRlcmF0b3IoKSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgcyA9IHdyaXRlci5zZXRNYXhEYXRhQWdlKDEwMDApLm9wZW5FYXJseSgpOwotICAgICAgICAgICAgYXNzZXJ0IHMgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydEZpbGVDb3VudHMoZGlyLnRyeUxpc3ROYW1lcygpKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxMDAwMDsgaSA8IDIwMDAwOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVXBkYXRlQnVpbGRlciBidWlsZGVyID0gVXBkYXRlQnVpbGRlci5jcmVhdGUoY2ZzLm1ldGFkYXRhKCksIHJhbmRvbShpLCAxMCkpLndpdGhUaW1lc3RhbXAoMSk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMDA7IGorKykKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5uZXdSb3coIiIgKyBqKS5hZGQoInZhbCIsIEJ5dGVCdWZmZXIuYWxsb2NhdGUoMTAwMCkpOwotICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoYnVpbGRlci5idWlsZCgpLnVuZmlsdGVyZWRJdGVyYXRvcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgczIgPSB3cml0ZXIuc2V0TWF4RGF0YUFnZSgxMDAwKS5vcGVuRWFybHkoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocy5sYXN0LmNvbXBhcmVUbyhzMi5sYXN0KSA8IDApOwotICAgICAgICAgICAgYXNzZXJ0RmlsZUNvdW50cyhkaXIudHJ5TGlzdE5hbWVzKCkpOwotICAgICAgICAgICAgcy5zZWxmUmVmKCkucmVsZWFzZSgpOwotICAgICAgICAgICAgczIuc2VsZlJlZigpLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHdyaXRlci5zZXRNYXhEYXRhQWdlKDEwMDApOworICAgICAgICAgICAgd3JpdGVyLm9wZW5FYXJseShzIC0+IHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgcyAhPSBudWxsOworICAgICAgICAgICAgICAgIGFzc2VydEZpbGVDb3VudHMoZGlyLnRyeUxpc3ROYW1lcygpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTAwMDA7IGkgPCAyMDAwMDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVXBkYXRlQnVpbGRlciBidWlsZGVyID0gVXBkYXRlQnVpbGRlci5jcmVhdGUoY2ZzLm1ldGFkYXRhKCksIHJhbmRvbShpLCAxMCkpLndpdGhUaW1lc3RhbXAoMSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTAwOyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLm5ld1JvdygiIiArIGopLmFkZCgidmFsIiwgQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxMDAwKSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoYnVpbGRlci5idWlsZCgpLnVuZmlsdGVyZWRJdGVyYXRvcigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVyLnNldE1heERhdGFBZ2UoMTAwMCk7CisgICAgICAgICAgICAgICAgd3JpdGVyLm9wZW5FYXJseShzMiAtPiB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocy5sYXN0LmNvbXBhcmVUbyhzMi5sYXN0KSA8IDApOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRGaWxlQ291bnRzKGRpci50cnlMaXN0TmFtZXMoKSk7CisgICAgICAgICAgICAgICAgICAgIHMuc2VsZlJlZigpLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgczIuc2VsZlJlZigpLnJlbGVhc2UoKTsKIAotICAgICAgICAgICAgaW50IGRhdGFmaWxlcyA9IGFzc2VydEZpbGVDb3VudHMoZGlyLnRyeUxpc3ROYW1lcygpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhkYXRhZmlsZXMsIDEpOworICAgICAgICAgICAgICAgICAgICBpbnQgZGF0YWZpbGVzID0gYXNzZXJ0RmlsZUNvdW50cyhkaXIudHJ5TGlzdE5hbWVzKCkpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZGF0YWZpbGVzLCAxKTsKIAotICAgICAgICAgICAgTGlmZWN5Y2xlVHJhbnNhY3Rpb24ud2FpdEZvckRlbGV0aW9ucygpOwotICAgICAgICAgICAgYXNzZXJ0RmlsZUNvdW50cyhkaXIudHJ5TGlzdE5hbWVzKCkpOworICAgICAgICAgICAgICAgICAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbi53YWl0Rm9yRGVsZXRpb25zKCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEZpbGVDb3VudHMoZGlyLnRyeUxpc3ROYW1lcygpKTsKIAotICAgICAgICAgICAgd3JpdGVyLmFib3J0KCk7Ci0gICAgICAgICAgICB0eG4uYWJvcnQoKTsKLSAgICAgICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uLndhaXRGb3JEZWxldGlvbnMoKTsKLSAgICAgICAgICAgIGRhdGFmaWxlcyA9IGFzc2VydEZpbGVDb3VudHMoZGlyLnRyeUxpc3ROYW1lcygpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhkYXRhZmlsZXMsIDApOwotICAgICAgICAgICAgdmFsaWRhdGVDRlMoY2ZzKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmFib3J0KCk7CisgICAgICAgICAgICAgICAgICAgIHR4bi5hYm9ydCgpOworICAgICAgICAgICAgICAgICAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbi53YWl0Rm9yRGVsZXRpb25zKCk7CisgICAgICAgICAgICAgICAgICAgIGRhdGFmaWxlcyA9IGFzc2VydEZpbGVDb3VudHMoZGlyLnRyeUxpc3ROYW1lcygpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRhdGFmaWxlcywgMCk7CisgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlQ0ZTKGNmcyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjkzLDQgKzI5OSw0IEBACiAgICAgICAgIGFzc2VydEludmFsaWRSZXBhaXJNZXRhZGF0YSgxLCBOT19QRU5ESU5HX1JFUEFJUiwgdHJ1ZSk7CiAKICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVdyaXRlclRlc3RCYXNlLmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlV3JpdGVyVGVzdEJhc2UuamF2YQppbmRleCA4M2FkMTM2Li45MWI0NGVkIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlV3JpdGVyVGVzdEJhc2UuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlV3JpdGVyVGVzdEJhc2UuamF2YQpAQCAtMjUsNyArMjUsNiBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlVuaW50ZXJydXB0aWJsZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CkBAIC00Miw2ICs0MSw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29sbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiAKQEAgLTEzOSw3ICsxNDAsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChmLm5hbWUoKS5jb250YWlucygiRGF0YSIpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvciBkID0gRGVzY3JpcHRvci5mcm9tRmlsZW5hbWUoZi5hYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IgZCA9IERlc2NyaXB0b3IuZnJvbUZpbGVXaXRoQ29tcG9uZW50KGYsIGZhbHNlKS5sZWZ0OwogICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGQudG9TdHJpbmcoKSwgbGl2ZURlc2NyaXB0b3JzLmNvbnRhaW5zKGQuaWQpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xNTUsNyArMTU2LDE3IEBACiAgICAgcHVibGljIHN0YXRpYyBTU1RhYmxlV3JpdGVyIGdldFdyaXRlcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIEZpbGUgZGlyZWN0b3J5LCBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4sIGxvbmcgcmVwYWlyZWRBdCwgVGltZVVVSUQgcGVuZGluZ1JlcGFpciwgYm9vbGVhbiBpc1RyYW5zaWVudCkKICAgICB7CiAgICAgICAgIERlc2NyaXB0b3IgZGVzYyA9IGNmcy5uZXdTU1RhYmxlRGVzY3JpcHRvcihkaXJlY3RvcnkpOwotICAgICAgICByZXR1cm4gU1NUYWJsZVdyaXRlci5jcmVhdGUoZGVzYywgMCwgcmVwYWlyZWRBdCwgcGVuZGluZ1JlcGFpciwgaXNUcmFuc2llbnQsIG5ldyBTZXJpYWxpemF0aW9uSGVhZGVyKHRydWUsIGNmcy5tZXRhZGF0YSgpLCBjZnMubWV0YWRhdGEoKS5yZWd1bGFyQW5kU3RhdGljQ29sdW1ucygpLCBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTKSwgY2ZzLmluZGV4TWFuYWdlci5saXN0SW5kZXhlcygpLCB0eG4pOworICAgICAgICByZXR1cm4gZGVzYy5nZXRGb3JtYXQoKS5nZXRXcml0ZXJGYWN0b3J5KCkuYnVpbGRlcihkZXNjKQorICAgICAgICAgICAgICAgICAgIC5zZXRUYWJsZU1ldGFkYXRhUmVmKGNmcy5tZXRhZGF0YSkKKyAgICAgICAgICAgICAgICAgICAuc2V0S2V5Q291bnQoMCkKKyAgICAgICAgICAgICAgICAgICAuc2V0UmVwYWlyZWRBdChyZXBhaXJlZEF0KQorICAgICAgICAgICAgICAgICAgIC5zZXRQZW5kaW5nUmVwYWlyKHBlbmRpbmdSZXBhaXIpCisgICAgICAgICAgICAgICAgICAgLnNldFRyYW5zaWVudFNTVGFibGUoaXNUcmFuc2llbnQpCisgICAgICAgICAgICAgICAgICAgLnNldFNlcmlhbGl6YXRpb25IZWFkZXIobmV3IFNlcmlhbGl6YXRpb25IZWFkZXIodHJ1ZSwgY2ZzLm1ldGFkYXRhKCksIGNmcy5tZXRhZGF0YSgpLnJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zKCksIEVuY29kaW5nU3RhdHMuTk9fU1RBVFMpKQorICAgICAgICAgICAgICAgICAgIC5hZGRGbHVzaE9ic2VydmVyc0ZvclNlY29uZGFyeUluZGV4ZXMoY2ZzLmluZGV4TWFuYWdlci5saXN0SW5kZXhlcygpLCB0eG4ub3BUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgLnNldE1ldGFkYXRhQ29sbGVjdG9yKG5ldyBNZXRhZGF0YUNvbGxlY3RvcihjZnMubWV0YWRhdGEoKS5jb21wYXJhdG9yKSkKKyAgICAgICAgICAgICAgICAgICAuYWRkRGVmYXVsdENvbXBvbmVudHMoKQorICAgICAgICAgICAgICAgICAgIC5idWlsZCh0eG4sIGNmcyk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBTU1RhYmxlV3JpdGVyIGdldFdyaXRlcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIEZpbGUgZGlyZWN0b3J5LCBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4pCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlV3JpdGVyVHJhbnNhY3Rpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlV3JpdGVyVHJhbnNhY3Rpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQzOWI5YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVXcml0ZXJUcmFuc2FjdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlVwZGF0ZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFzY2lpVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkVuY29kaW5nU3RhdHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxUZXN0OworCitwdWJsaWMgY2xhc3MgU1NUYWJsZVdyaXRlclRyYW5zYWN0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0VHJhbnNhY3Rpb25hbFRlc3QKK3sKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTUEFDRTEgPSAiQmlnVGFibGVXcml0ZXJUZXN0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9TVEFOREFSRCA9ICJTdGFuZGFyZDEiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzOworCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFNjaGVtYUxvYWRlci5wcmVwYXJlU2VydmVyKCk7CisgICAgICAgIFNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZShLRVlTUEFDRTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkQsIDAsIEludDMyVHlwZS5pbnN0YW5jZSwgQXNjaWlUeXBlLmluc3RhbmNlLCBJbnQzMlR5cGUuaW5zdGFuY2UpKTsKKyAgICAgICAgY2ZzID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRTEpLmdldENvbHVtbkZhbWlseVN0b3JlKENGX1NUQU5EQVJEKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVGVzdGFibGVUcmFuc2FjdGlvbiBuZXdUZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RhYmxlQlRXKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdGFibGVCVFcgZXh0ZW5kcyBUZXN0YWJsZVRyYW5zYWN0aW9uCisgICAgeworICAgICAgICBmaW5hbCBGaWxlIGZpbGU7CisgICAgICAgIGZpbmFsIERlc2NyaXB0b3IgZGVzY3JpcHRvcjsKKyAgICAgICAgZmluYWwgU1NUYWJsZVR4bldyaXRlciB3cml0ZXI7CisKKyAgICAgICAgcHJpdmF0ZSBUZXN0YWJsZUJUVygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMoY2ZzLm5ld1NTVGFibGVEZXNjcmlwdG9yKGNmcy5nZXREaXJlY3RvcmllcygpLmdldERpcmVjdG9yeUZvck5ld1NTVGFibGVzKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgVGVzdGFibGVCVFcoRGVzY3JpcHRvciBkZXNjKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzKGRlc2MsIFNTVGFibGVUeG5Xcml0ZXIuY3JlYXRlKGNmcywgZGVzYywgMCwgMCwgbnVsbCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZXJpYWxpemF0aW9uSGVhZGVyKHRydWUsIGNmcy5tZXRhZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMubWV0YWRhdGEoKS5yZWd1bGFyQW5kU3RhdGljQ29sdW1ucygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTKSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBUZXN0YWJsZUJUVyhEZXNjcmlwdG9yIGRlc2MsIFNTVGFibGVUeG5Xcml0ZXIgc3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKHN3KTsKKyAgICAgICAgICAgIHRoaXMuZmlsZSA9IGRlc2MuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpOworICAgICAgICAgICAgdGhpcy5kZXNjcmlwdG9yID0gZGVzYzsKKyAgICAgICAgICAgIHRoaXMud3JpdGVyID0gc3c7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVXBkYXRlQnVpbGRlciB1cGRhdGUgPSBVcGRhdGVCdWlsZGVyLmNyZWF0ZShjZnMubWV0YWRhdGEoKSwgaSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMDsgaisrKQorICAgICAgICAgICAgICAgICAgICB1cGRhdGUubmV3Um93KGopLmFkZCgidmFsIiwgU1NUYWJsZVJld3JpdGVyVGVzdC5yYW5kb20oMCwgMTAwMCkpOworICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQodXBkYXRlLmJ1aWxkKCkudW5maWx0ZXJlZEl0ZXJhdG9yKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0SW5Qcm9ncmVzcygpIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0RXhpc3RzKGRlc2NyaXB0b3IudmVyc2lvbi5mb3JtYXQucHJpbWFyeUNvbXBvbmVudHMoKSk7CisgICAgICAgICAgICBhc3NlcnROb3RFeGlzdHMoZGVzY3JpcHRvci52ZXJzaW9uLmZvcm1hdC5nZW5lcmF0ZWRPbkxvYWRDb21wb25lbnRzKCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZmlsZS5sZW5ndGgoKSA+IDApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0UHJlcGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydEV4aXN0cyhkZXNjcmlwdG9yLnZlcnNpb24uZm9ybWF0LnByaW1hcnlDb21wb25lbnRzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXhpc3RzKGRlc2NyaXB0b3IudmVyc2lvbi5mb3JtYXQuZ2VuZXJhdGVkT25Mb2FkQ29tcG9uZW50cygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEFib3J0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydE5vdEV4aXN0cyhkZXNjcmlwdG9yLnZlcnNpb24uZm9ybWF0LnByaW1hcnlDb21wb25lbnRzKCkpOworICAgICAgICAgICAgYXNzZXJ0Tm90RXhpc3RzKGRlc2NyaXB0b3IudmVyc2lvbi5mb3JtYXQuZ2VuZXJhdGVkT25Mb2FkQ29tcG9uZW50cygpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydENvbW1pdHRlZCgpIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0UHJlcGFyZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb21taXRDYW5UaHJvdygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEV4aXN0cyhDb2xsZWN0aW9uPENvbXBvbmVudD4gY29tcG9uZW50cykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogY29tcG9uZW50cykKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkZXNjcmlwdG9yLmZpbGVGb3IoY29tcG9uZW50KS5leGlzdHMoKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Tm90RXhpc3RzKENvbGxlY3Rpb248Q29tcG9uZW50PiBjb21wb25lbnRzKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBjb21wb25lbnRzKQorICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShjb21wb25lbnQudG9TdHJpbmcoKSwgZGVzY3JpcHRvci5maWxlRm9yKGNvbXBvbmVudCkuZXhpc3RzKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVplcm9Db3B5V3JpdGVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVplcm9Db3B5V3JpdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYjkyYWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlWmVyb0NvcHlXcml0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKKworaW1wb3J0IGphdmEuaW8uVW5jaGVja2VkSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DbG9zZWRDaGFubmVsRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgaW8ubmV0dHkuYnVmZmVyLlVucG9vbGVkOworaW1wb3J0IGlvLm5ldHR5LmNoYW5uZWwuZW1iZWRkZWQuRW1iZWRkZWRDaGFubmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dVcGRhdGVCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNsaWNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LkFzeW5jU3RyZWFtaW5nSW5wdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5DYWNoaW5nUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhUmVmOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworCitwdWJsaWMgY2xhc3MgU1NUYWJsZVplcm9Db3B5V3JpdGVyVGVzdAoreworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFMSA9ICJCaWdUYWJsZUJsb2NrV3JpdGVyVGVzdCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfU1RBTkRBUkQgPSAiU3RhbmRhcmQxIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9TVEFOREFSRDIgPSAiU3RhbmRhcmQyIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9JTkRFWEVEID0gIkluZGV4ZWQxIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9TVEFOREFSRExPV0lOREVYSU5URVJWQUwgPSAiU3RhbmRhcmRMb3dJbmRleEludGVydmFsIjsKKworICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZVJlYWRlciBzc3RhYmxlOworICAgIHB1YmxpYyBzdGF0aWMgQ29sdW1uRmFtaWx5U3RvcmUgc3RvcmU7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGV4cGVjdGVkUm93Q291bnQ7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU2NoZW1hTG9hZGVyLnByZXBhcmVTZXJ2ZXIoKTsKKyAgICAgICAgU2NoZW1hTG9hZGVyLmNyZWF0ZUtleXNwYWNlKEtFWVNQQUNFMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBDRl9TVEFOREFSRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkQyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5jb21wb3NpdGVJbmRleENGTUQoS0VZU1BBQ0UxLCBDRl9JTkRFWEVELCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBDRl9TVEFOREFSRExPV0lOREVYSU5URVJWQUwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWluSW5kZXhJbnRlcnZhbCg4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heEluZGV4SW50ZXJ2YWwoMjU2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhY2hpbmcoQ2FjaGluZ1BhcmFtcy5DQUNIRV9OT1RISU5HKSk7CisKKyAgICAgICAgU3RyaW5nIGtzID0gS0VZU1BBQ0UxOworICAgICAgICBTdHJpbmcgY2YgPSAiU3RhbmRhcmQxIjsKKworICAgICAgICAvLyBjbGVhciBhbmQgY3JlYXRlIGp1c3Qgb25lIHNzdGFibGUgZm9yIHRoaXMgdGVzdAorICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3MpOworICAgICAgICBzdG9yZSA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKGNmKTsKKyAgICAgICAgc3RvcmUuY2xlYXJVbnNhZmUoKTsKKyAgICAgICAgc3RvcmUuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisKKyAgICAgICAgRGVjb3JhdGVkS2V5IGZpcnN0S2V5ID0gbnVsbCwgbGFzdEtleSA9IG51bGw7CisgICAgICAgIGxvbmcgdGltZXN0YW1wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RvcmUubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gVXRpbC5kayhTdHJpbmcudmFsdWVPZihpKSk7CisgICAgICAgICAgICBpZiAoZmlyc3RLZXkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmaXJzdEtleSA9IGtleTsKKyAgICAgICAgICAgIGlmIChsYXN0S2V5ID09IG51bGwpCisgICAgICAgICAgICAgICAgbGFzdEtleSA9IGtleTsKKyAgICAgICAgICAgIGlmIChzdG9yZS5tZXRhZGF0YSgpLnBhcnRpdGlvbktleVR5cGUuY29tcGFyZShsYXN0S2V5LmdldEtleSgpLCBrZXkuZ2V0S2V5KCkpIDwgMCkKKyAgICAgICAgICAgICAgICBsYXN0S2V5ID0ga2V5OworCisgICAgICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihzdG9yZS5tZXRhZGF0YSgpLCB0aW1lc3RhbXAsIGtleS5nZXRLZXkoKSkKKyAgICAgICAgICAgIC5jbHVzdGVyaW5nKCJjb2wiKQorICAgICAgICAgICAgLmFkZCgidmFsIiwgQnl0ZUJ1ZmZlclV0aWwuRU1QVFlfQllURV9CVUZGRVIpCisgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICAgICAgLmFwcGx5VW5zYWZlKCk7CisgICAgICAgICAgICBleHBlY3RlZFJvd0NvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgVXRpbC5mbHVzaChzdG9yZSk7CisKKyAgICAgICAgc3N0YWJsZSA9IHN0b3JlLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgd3JpdGVEYXRhRmlsZV9EYXRhSW5wdXRQbHVzKCkKKyAgICB7CisgICAgICAgIHdyaXRlRGF0YVRlc3RDeWNsZShidWZmZXIgLT4gbmV3IERhdGFJbnB1dEJ1ZmZlcihidWZmZXIuYXJyYXkoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgd3JpdGVEYXRhRmlsZV9SZWJ1ZmZlcmluZ0J5dGVCdWZEYXRhSW5wdXRQbHVzKCkKKyAgICB7CisgICAgICAgIHRyeSAoQXN5bmNTdHJlYW1pbmdJbnB1dFBsdXMgaW5wdXQgPSBuZXcgQXN5bmNTdHJlYW1pbmdJbnB1dFBsdXMobmV3IEVtYmVkZGVkQ2hhbm5lbCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGVEYXRhVGVzdEN5Y2xlKGJ1ZmZlciAtPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChidWZmZXIubGltaXQoKSA+IDApIHsgLy8gc2tpcCBlbXB0eSBmaWxlcyB0aGF0IHdvdWxkIGNhdXNlIHByZW1hdHVyZSBFT0YKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQuYXBwZW5kKFVucG9vbGVkLndyYXBwZWRCdWZmZXIoYnVmZmVyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dDsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBpbnB1dC5yZXF1ZXN0Q2xvc3VyZSgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVEYXRhVGVzdEN5Y2xlKEZ1bmN0aW9uPEJ5dGVCdWZmZXIsIERhdGFJbnB1dFBsdXM+IGJ1ZmZlck1hcHBlcikKKyAgICB7CisgICAgICAgIEZpbGUgZGlyID0gc3RvcmUuZ2V0RGlyZWN0b3JpZXMoKS5nZXREaXJlY3RvcnlGb3JOZXdTU1RhYmxlcygpOworICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBzdG9yZS5uZXdTU1RhYmxlRGVzY3JpcHRvcihkaXIpOworICAgICAgICBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhID0gU2NoZW1hLmluc3RhbmNlLmdldFRhYmxlTWV0YWRhdGFSZWYoZGVzYyk7CisKKyAgICAgICAgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gTGlmZWN5Y2xlVHJhbnNhY3Rpb24ub2ZmbGluZShPcGVyYXRpb25UeXBlLlNUUkVBTSk7CisgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHNUb1dyaXRlID0gbmV3IEhhc2hTZXQ8PihkZXNjLmdldEZvcm1hdCgpLnVwbG9hZENvbXBvbmVudHMoKSk7CisgICAgICAgIGlmICghbWV0YWRhdGEuZ2V0TG9jYWwoKS5wYXJhbXMuY29tcHJlc3Npb24uaXNFbmFibGVkKCkpCisgICAgICAgICAgICBjb21wb25lbnRzVG9Xcml0ZS5yZW1vdmUoQ29tcG9uZW50cy5DT01QUkVTU0lPTl9JTkZPKTsKKworICAgICAgICBTU1RhYmxlWmVyb0NvcHlXcml0ZXIgYnR6Y3cgPSBkZXNjLmdldEZvcm1hdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0V3JpdGVyRmFjdG9yeSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGRlcihkZXNjKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbXBvbmVudHMoY29tcG9uZW50c1RvV3JpdGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGFibGVNZXRhZGF0YVJlZihtZXRhZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVaZXJvQ29weVdyaXRlcih0eG4sIHN0b3JlKTsKKworICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBjb21wb25lbnRzVG9Xcml0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRlc2MuZmlsZUZvcihjb21wb25lbnQpLmV4aXN0cygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBhaXI8RGF0YUlucHV0UGx1cywgTG9uZz4gcGFpciA9IGdldFNTVGFibGVDb21wb25lbnREYXRhKHNzdGFibGUsIGNvbXBvbmVudCwgYnVmZmVyTWFwcGVyKTsKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnR6Y3cud3JpdGVDb21wb25lbnQoY29tcG9uZW50LnR5cGUsIHBhaXIubGVmdCwgcGFpci5yaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChDbG9zZWRDaGFubmVsRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5jaGVja2VkSU9FeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiByZWFkZXJzID0gYnR6Y3cuZmluaXNoKHRydWUpOworCisgICAgICAgIFNTVGFibGVSZWFkZXIgcmVhZGVyID0gcmVhZGVycy50b0FycmF5KG5ldyBTU1RhYmxlUmVhZGVyWzBdKVswXTsKKworICAgICAgICBhc3NlcnROb3RFcXVhbHMoc3N0YWJsZS5nZXRGaWxlbmFtZSgpLCByZWFkZXIuZ2V0RmlsZW5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzc3RhYmxlLmVzdGltYXRlZEtleXMoKSwgcmVhZGVyLmVzdGltYXRlZEtleXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzc3RhYmxlLmlzUGVuZGluZ1JlcGFpcigpLCByZWFkZXIuaXNQZW5kaW5nUmVwYWlyKCkpOworCisgICAgICAgIGFzc2VydFJvd0NvdW50KGV4cGVjdGVkUm93Q291bnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRSb3dDb3VudChpbnQgZXhwZWN0ZWQpCisgICAgeworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0b3JlLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWw7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGRrID0gVXRpbC5kayhTdHJpbmcudmFsdWVPZihpKSk7CisgICAgICAgICAgICBVbmZpbHRlcmVkUm93SXRlcmF0b3Igcm93SXRlciA9IHNzdGFibGUucm93SXRlcmF0b3IoZGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xpY2VzLkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5GaWx0ZXIuYWxsKHN0b3JlLm1ldGFkYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkc0xpc3RlbmVyLk5PT1BfTElTVEVORVIpOworICAgICAgICAgICAgd2hpbGUgKHJvd0l0ZXIuaGFzTmV4dCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJvd0l0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBjb3VudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBQYWlyPERhdGFJbnB1dFBsdXMsIExvbmc+IGdldFNTVGFibGVDb21wb25lbnREYXRhKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgQ29tcG9uZW50IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb248Qnl0ZUJ1ZmZlciwgRGF0YUlucHV0UGx1cz4gYnVmZmVyTWFwcGVyKQorICAgIHsKKyAgICAgICAgRmlsZUhhbmRsZSBjb21wb25lbnRGaWxlID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZUZvcihjb21wb25lbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVmZmVyU2l6ZSgxMDI0KS5jb21wbGV0ZSgpOworICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoKGludCkgY29tcG9uZW50RmlsZS5jaGFubmVsLnNpemUoKSk7CisgICAgICAgIGNvbXBvbmVudEZpbGUuY2hhbm5lbC5yZWFkKGJ1ZmZlciwgMCk7CisgICAgICAgIGJ1ZmZlci5mbGlwKCk7CisKKyAgICAgICAgRGF0YUlucHV0UGx1cyBpbnB1dFBsdXMgPSBidWZmZXJNYXBwZXIuYXBwbHkoYnVmZmVyKTsKKworICAgICAgICByZXR1cm4gUGFpci5jcmVhdGUoaW5wdXRQbHVzLCBjb21wb25lbnRGaWxlLmNoYW5uZWwuc2l6ZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TY3J1YlRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NjcnViVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NTZkOWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TY3J1YlRlc3QuamF2YQpAQCAtMCwwICsxLDkyMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKKworaW1wb3J0IGphdmEuaW8uSU9FcnJvcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5TdGFuZGFyZE9wZW5PcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlVuaW50ZXJydXB0aWJsZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLkFycmF5VXRpbHM7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IG5ldC5vcGVuaGZ0LmNocm9uaWNsZS5jb3JlLnV0aWwuVGhyb3dpbmdCaUNvbnN1bWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VcGRhdGVCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuQ2h1bmtDYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuT3BlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5RdWVyeVByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlVudHlwZWRSZXN1bHRTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29uc2lzdGVuY3lMZXZlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db3VudGVyTXV0YXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLk11dGF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlBhcnRpdGlvblBvc2l0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJlYWRDb21tYW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZU5ld1RyYWNrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVVJRFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5QYXJ0aXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5QYXJ0aXRpb25VcGRhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5FbmNvZGluZ1N0YXRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5CeXRlT3JkZXJlZFBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lk11cm11cjNQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuUmVxdWVzdEV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLldyaXRlVGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzcy5Db21wcmVzc2lvbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LkNvbXByZXNzaW9uSW5mb0NvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0LkNvbXBvbmVudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpLkJ0aUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29sbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT3V0cHV0SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOworaW1wb3J0IG9yZy5qYm9zcy5ieXRlbWFuLmNvbnRyaWIuYm11bml0LkJNUnVsZTsKK2ltcG9ydCBvcmcuamJvc3MuYnl0ZW1hbi5jb250cmliLmJtdW5pdC5CTVVuaXRSdW5uZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyLmNvdW50ZXJDRk1EOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2U7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlci5nZXRDb21wcmVzc2lvblBhcmFtZXRlcnM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlci5sb2FkU2NoZW1hOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfSU5WQUxJRF9MRUdBQ1lfU1NUQUJMRV9ST09UOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfVVRJTF9BTExPV19UT09MX1JFSU5JVF9GT1JfVEVTVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZUZhbHNlOworCitAUnVuV2l0aChCTVVuaXRSdW5uZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgU2NydWJUZXN0Cit7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNjcnViVGVzdC5jbGFzcyk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRiA9ICJTdGFuZGFyZDEiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPVU5URVJfQ0YgPSAiQ291bnRlcjEiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGX1VVSUQgPSAiVVVJREtleXMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGX0lOREVYMSA9ICJJbmRleGVkMSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfSU5ERVgyID0gIkluZGV4ZWQyIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9JTkRFWDFfQllURU9SREVSRUQgPSAiSW5kZXhlZDFfb3JkZXJlZCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfSU5ERVgyX0JZVEVPUkRFUkVEID0gIkluZGV4ZWQyX29yZGVyZWQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9JTkRFWCA9ICJiaXJ0aGRhdGUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9OT05fSU5ERVggPSAibm90YmlydGhkYXRlIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBDT01QUkVTU0lPTl9DSFVOS19MRU5HVEggPSA0MDk2OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljSW50ZWdlciBzZXEgPSBuZXcgQXRvbWljSW50ZWdlcigpOworCisgICAgc3RhdGljIFdpdGhQcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisKKyAgICBTdHJpbmcga3NOYW1lOworICAgIEtleXNwYWNlIGtleXNwYWNlOworCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVNjaGVtYSgpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldEZpbGVDYWNoZUVuYWJsZWQoZmFsc2UpOworICAgICAgICBsb2FkU2NoZW1hKCk7CisgICAgICAgIGFzc2VydE51bGwoQ2h1bmtDYWNoZS5pbnN0YW5jZSk7CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkKKyAgICB7CisgICAgICAgIGtzTmFtZSA9ICJzY3J1Yl90ZXN0XyIgKyBzZXEuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgIGNyZWF0ZUtleXNwYWNlKGtzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgS2V5c3BhY2VQYXJhbXMuc2ltcGxlKDEpLAorICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZENGTUQoa3NOYW1lLCBDRiksCisgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJDRk1EKGtzTmFtZSwgQ09VTlRFUl9DRikuY29tcHJlc3Npb24oZ2V0Q29tcHJlc3Npb25QYXJhbWV0ZXJzKENPTVBSRVNTSU9OX0NIVU5LX0xFTkdUSCkpLAorICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZENGTUQoa3NOYW1lLCBDRl9VVUlELCAwLCBVVUlEVHlwZS5pbnN0YW5jZSksCisgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5rZXlzSW5kZXhDRk1EKGtzTmFtZSwgQ0ZfSU5ERVgxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLmNvbXBvc2l0ZUluZGV4Q0ZNRChrc05hbWUsIENGX0lOREVYMiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5rZXlzSW5kZXhDRk1EKGtzTmFtZSwgQ0ZfSU5ERVgxX0JZVEVPUkRFUkVELCB0cnVlKS5wYXJ0aXRpb25lcihCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLmluc3RhbmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLmNvbXBvc2l0ZUluZGV4Q0ZNRChrc05hbWUsIENGX0lOREVYMl9CWVRFT1JERVJFRCwgdHJ1ZSkucGFydGl0aW9uZXIoQnl0ZU9yZGVyZWRQYXJ0aXRpb25lci5pbnN0YW5jZSkpOworICAgICAgICBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NOYW1lKTsKKworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChURVNUX1VUSUxfQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QsIHRydWUpOworICAgIH0KKworICAgIEBBZnRlckNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyQ2xhc3NFbnYoKQorICAgIHsKKyAgICAgICAgcHJvcGVydGllcy5jbG9zZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNjcnViT25lUGFydGl0aW9uKCkKKyAgICB7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDRik7CisKKyAgICAgICAgLy8gaW5zZXJ0IGRhdGEgYW5kIHZlcmlmeSB3ZSBnZXQgaXQgYmFjayB3LyByYW5nZSBxdWVyeQorICAgICAgICBmaWxsQ0YoY2ZzLCAxKTsKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOworCisgICAgICAgIHBlcmZvcm1TY3J1YihjZnMsIGZhbHNlLCB0cnVlLCBmYWxzZSwgMik7CisKKyAgICAgICAgLy8gY2hlY2sgZGF0YSBpcyBzdGlsbCB0aGVyZQorICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJMYXN0QnJva2VuUGFydGl0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gQ29sdW1uRmFtaWx5U3RvcmUuZ2V0SWZFeGlzdHMoa3NOYW1lLCBDRik7CisKKyAgICAgICAgLy8gaW5zZXJ0IGRhdGEgYW5kIHZlcmlmeSB3ZSBnZXQgaXQgYmFjayB3LyByYW5nZSBxdWVyeQorICAgICAgICBmaWxsQ0YoY2ZzLCAxKTsKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOworCisgICAgICAgIFNldDxTU1RhYmxlUmVhZGVyPiBsaXZlU1NUYWJsZXMgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCk7CisgICAgICAgIGFzc2VydFRoYXQobGl2ZVNTVGFibGVzKS5oYXNTaXplKDEpOworICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBsaXZlU1NUYWJsZXMuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0RmlsZW5hbWUoKTsKKyAgICAgICAgRmlsZXMud3JpdGUoUGF0aHMuZ2V0KGZpbGVOYW1lKSwgbmV3IGJ5dGVbMTBdLCBTdGFuZGFyZE9wZW5PcHRpb24uQ1JFQVRFLCBTdGFuZGFyZE9wZW5PcHRpb24uVFJVTkNBVEVfRVhJU1RJTkcpOworCisgICAgICAgIHBlcmZvcm1TY3J1YihjZnMsIHRydWUsIHRydWUsIGZhbHNlLCAyKTsKKworICAgICAgICAvLyBjaGVjayBkYXRhIGlzIHN0aWxsIHRoZXJlCisgICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTY3J1YkNvcnJ1cHRlZENvdW50ZXJQYXJ0aXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdyaXRlVGltZW91dEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gV2hlbiBjb21wcmVzc2lvbiBpcyBlbmFibGVkLCBmb3IgdGVzdGluZyBjb3JydXB0ZWQgY2h1bmtzIHdlIG5lZWQgZW5vdWdoIHBhcnRpdGlvbnMgdG8gY292ZXIKKyAgICAgICAgLy8gYXQgbGVhc3QgMyBjaHVua3Mgb2Ygc2l6ZSBDT01QUkVTU0lPTl9DSFVOS19MRU5HVEgKKyAgICAgICAgaW50IG51bVBhcnRpdGlvbnMgPSAxMDAwOworCisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDT1VOVEVSX0NGKTsKKyAgICAgICAgY2ZzLnRydW5jYXRlQmxvY2tpbmcoKTsKKyAgICAgICAgZmlsbENvdW50ZXJDRihjZnMsIG51bVBhcnRpdGlvbnMpOworCisgICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCBudW1QYXJ0aXRpb25zKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CisKKyAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOworCisgICAgICAgIC8vbWFrZSBzdXJlIHRvIG92ZXJyaWRlIGF0IG1vc3QgMSBjaHVuayB3aGVuIGNvbXByZXNzaW9uIGlzIGVuYWJsZWQKKyAgICAgICAgLy91c2UgMHgwMCBpbnN0ZWFkIG9mIHRoZSB1c3VhbCAweDdBIGJlY2F1c2UgaWYgYnkgYW55IGNoYW5jZSBpdCdzIGFibGUgdG8gaXRlcmF0ZSBvdmVyIHRoZSBjb3JydXB0CisgICAgICAgIC8vc2VjdGlvbiwgdGhlbiB3ZSBnZXQgbWFueSBvdXQtb2Ytb3JkZXIgZXJyb3JzLCB3aGljaCB3ZSBkb24ndCB3YW50CisgICAgICAgIG92ZXJyaWRlV2l0aEdhcmJhZ2Uoc3N0YWJsZSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjAiKSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjEiKSwgKGJ5dGUpIDB4MDApOworCisgICAgICAgIC8vIHdpdGggc2tpcENvcnJ1cHRlZCA9PSBmYWxzZSwgdGhlIHNjcnViIGlzIGV4cGVjdGVkIHRvIGZhaWwKKyAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHNzdGFibGUpLCBPcGVyYXRpb25UeXBlLlNDUlVCKTsKKyAgICAgICAgICAgICBJU2NydWJiZXIgc2NydWJiZXIgPSBzc3RhYmxlLmRlc2NyaXB0b3IuZ2V0Rm9ybWF0KCkuZ2V0U2NydWJiZXIoY2ZzLCB0eG4sIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBuZXcgSVNjcnViYmVyLk9wdGlvbnMuQnVpbGRlcigpLmNoZWNrRGF0YSgpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICBzY3J1YmJlci5zY3J1YigpOworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiB0byBiZSB0aHJvd24iKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FcnJvciBlcnIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRocm93YWJsZXMuYXNzZXJ0QW55Q2F1c2UoZXJyLCBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyB3aXRoIHNraXBDb3JydXB0ZWQgPT0gdHJ1ZSwgdGhlIGNvcnJ1cHQgcm93cyB3aWxsIGJlIHNraXBwZWQKKyAgICAgICAgSVNjcnViYmVyLlNjcnViUmVzdWx0IHNjcnViUmVzdWx0OworICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qoc3N0YWJsZSksIE9wZXJhdGlvblR5cGUuU0NSVUIpOworICAgICAgICAgICAgIElTY3J1YmJlciBzY3J1YmJlciA9IHNzdGFibGUuZGVzY3JpcHRvci5nZXRGb3JtYXQoKS5nZXRTY3J1YmJlcihjZnMsIHR4biwgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIG5ldyBJU2NydWJiZXIuT3B0aW9ucy5CdWlsZGVyKCkuc2tpcENvcnJ1cHRlZCgpLmNoZWNrRGF0YSgpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICBzY3J1YlJlc3VsdCA9IHNjcnViYmVyLnNjcnViV2l0aFJlc3VsdCgpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChzY3J1YlJlc3VsdCk7CisKKyAgICAgICAgYm9vbGVhbiBjb21wcmVzc2lvbiA9IHNzdGFibGUuY29tcHJlc3Npb247CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzY3J1YlJlc3VsdC5lbXB0eVBhcnRpdGlvbnMpOworICAgICAgICBpZiAoY29tcHJlc3Npb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1QYXJ0aXRpb25zLCBzY3J1YlJlc3VsdC5iYWRQYXJ0aXRpb25zICsgc2NydWJSZXN1bHQuZ29vZFBhcnRpdGlvbnMpOworICAgICAgICAgICAgLy9iZWNhdXNlIHdlIG9ubHkgY29ycnVwdGVkIDEgY2h1bmssIGFuZCB3ZSBjaG9zZSBlbm91Z2ggcGFydGl0aW9ucyB0byBjb3ZlciBhdCBsZWFzdCAzIGNodW5rcworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzY3J1YlJlc3VsdC5nb29kUGFydGl0aW9ucyA+PSBzY3J1YlJlc3VsdC5iYWRQYXJ0aXRpb25zICogMik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc2NydWJSZXN1bHQuYmFkUGFydGl0aW9ucyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVtUGFydGl0aW9ucyAtIDEsIHNjcnViUmVzdWx0Lmdvb2RQYXJ0aXRpb25zKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CisKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIHNjcnViUmVzdWx0Lmdvb2RQYXJ0aXRpb25zKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8RmlsZT4gc3N0YWJsZUluZGV4UGF0aHMoU1NUYWJsZVJlYWRlciByZWFkZXIpCisgICAgeworICAgICAgICBpZiAoQmlnRm9ybWF0LmlzKHJlYWRlci5kZXNjcmlwdG9yLmdldEZvcm1hdCgpKSkKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KHJlYWRlci5kZXNjcmlwdG9yLmZpbGVGb3IoQmlnRm9ybWF0LkNvbXBvbmVudHMuUFJJTUFSWV9JTkRFWCkpOworICAgICAgICBpZiAoQnRpRm9ybWF0LmlzKHJlYWRlci5kZXNjcmlwdG9yLmdldEZvcm1hdCgpKSkKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KHJlYWRlci5kZXNjcmlwdG9yLmZpbGVGb3IoQnRpRm9ybWF0LkNvbXBvbmVudHMuUEFSVElUSU9OX0lOREVYKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5kZXNjcmlwdG9yLmZpbGVGb3IoQnRpRm9ybWF0LkNvbXBvbmVudHMuUk9XX0lOREVYKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IFV0aWwudGVzdE11c3RCZUltcGxlbWVudGVkRm9yU1NUYWJsZUZvcm1hdCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNjcnViQ29ycnVwdGVkUm93SW5TbWFsbEZpbGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICAvLyBvdmVyd3JpdGUgb25lIHJvdyB3aXRoIGdhcmJhZ2UKKyAgICAgICAgdGVzdENvcnJ1cHRpb25JblNtYWxsRmlsZSgoc3N0YWJsZSwga2V5cykgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZVdpdGhHYXJiYWdlKHNzdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5ieXRlcyhrZXlzWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKGtleXNbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4N0EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJDb3JydXB0ZWRJbmRleCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIC8vIG92ZXJ3cml0ZSBhIHBhcnQgb2YgdGhlIGluZGV4IHdpdGggZ2FyYmFnZQorICAgICAgICB0ZXN0Q29ycnVwdGlvbkluU21hbGxGaWxlKChzc3RhYmxlLCBrZXlzKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlV2l0aEdhcmJhZ2Uoc3N0YWJsZUluZGV4UGF0aHMoc3N0YWJsZSkuZ2V0KDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHg3QSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTY3J1YkNvcnJ1cHRlZEluZGV4T25PcGVuKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgLy8gb3ZlcndyaXRlIHRoZSB3aG9sZSBpbmRleCB3aXRoIGdhcmJhZ2UKKyAgICAgICAgdGVzdENvcnJ1cHRpb25JblNtYWxsRmlsZSgoc3N0YWJsZSwga2V5cykgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZVdpdGhHYXJiYWdlKHNzdGFibGVJbmRleFBhdGhzKHNzdGFibGUpLmdldCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChieXRlKSAweDdBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNjcnViQ29ycnVwdGVkUm93Q29ycnVwdGVkSW5kZXgoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICAvLyBvdmVyd3JpdGUgb25lIHJvdywgYW5kIHRoZSBpbmRleCB3aXRoIGdhcmJhZ2UKKyAgICAgICAgdGVzdENvcnJ1cHRpb25JblNtYWxsRmlsZSgoc3N0YWJsZSwga2V5cykgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlV2l0aEdhcmJhZ2Uoc3N0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5ieXRlcyhrZXlzWzJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5ieXRlcyhrZXlzWzNdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHg3QSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlV2l0aEdhcmJhZ2Uoc3N0YWJsZUluZGV4UGF0aHMoc3N0YWJsZSkuZ2V0KDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHg3QSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsgICAvLyBjb3JydXB0IGFmdGVyIHRoZSBzZWNvbmQgcGFydGl0aW9uLCBubyB3YXkgdG8gcmVzeW5jCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvcnJ1cHRpb25JblNtYWxsRmlsZShUaHJvd2luZ0JpQ29uc3VtZXI8U1NUYWJsZVJlYWRlciwgU3RyaW5nW10sIElPRXhjZXB0aW9uPiBjb3JydXB0LCBib29sZWFuIGlzRnVsbHlSZWNvdmVyYWJsZSwgaW50IGV4cGVjdGVkUGFydGl0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uLCBXcml0ZVRpbWVvdXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDT1VOVEVSX0NGKTsKKyAgICAgICAgY2ZzLmNsZWFyVW5zYWZlKCk7CisKKyAgICAgICAgU3RyaW5nW10ga2V5cyA9IGZpbGxDb3VudGVyQ0YoY2ZzLCA1KTsKKworICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgNSk7CisKKyAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOworCisgICAgICAgIC8vIGNhbm5vdCB0ZXN0IHRoaXMgd2l0aCBjb21wcmVzc2lvbgorICAgICAgICBhc3N1bWVGYWxzZShzc3RhYmxlLm1ldGFkYXRhKCkucGFyYW1zLmNvbXByZXNzaW9uLmlzRW5hYmxlZCgpKTsKKworICAgICAgICAvLyBvdmVyd3JpdGUgb25lIHJvdyB3aXRoIGdhcmJhZ2UKKyAgICAgICAgY29ycnVwdC5hY2NlcHQoc3N0YWJsZSwga2V5cyk7CisKKyAgICAgICAgLy8gd2l0aCBza2lwQ29ycnVwdGVkID09IGZhbHNlLCB0aGUgc2NydWIgaXMgZXhwZWN0ZWQgdG8gZmFpbAorICAgICAgICBpZiAoIWlzRnVsbHlSZWNvdmVyYWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHNzdGFibGUpLCBPcGVyYXRpb25UeXBlLlNDUlVCKTsKKyAgICAgICAgICAgICAgICAgSVNjcnViYmVyIHNjcnViYmVyID0gc3N0YWJsZS5kZXNjcmlwdG9yLmdldEZvcm1hdCgpLmdldFNjcnViYmVyKGNmcywgdHhuLCBuZXcgT3V0cHV0SGFuZGxlci5Mb2dPdXRwdXQoKSwgbmV3IElTY3J1YmJlci5PcHRpb25zLkJ1aWxkZXIoKS5jaGVja0RhdGEoKS5idWlsZCgpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3aXRoIHNraXBDb3JydXB0ZWQgPT0gdHJ1ZSwgdGhlIGNvcnJ1cHQgcm93IHdpbGwgYmUgc2tpcHBlZAorICAgICAgICAgICAgICAgIHNjcnViYmVyLnNjcnViKCk7CisgICAgICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiB0byBiZSB0aHJvd24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0Vycm9yIGV4cGVjdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHNzdGFibGUpLCBPcGVyYXRpb25UeXBlLlNDUlVCKTsKKyAgICAgICAgICAgICBJU2NydWJiZXIgc2NydWJiZXIgPSBzc3RhYmxlLmRlc2NyaXB0b3IuZ2V0Rm9ybWF0KCkuZ2V0U2NydWJiZXIoY2ZzLCB0eG4sIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBuZXcgSVNjcnViYmVyLk9wdGlvbnMuQnVpbGRlcigpLmNoZWNrRGF0YSgpLnNraXBDb3JydXB0ZWQoKS5idWlsZCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gd2l0aCBza2lwQ29ycnVwdGVkID09IHRydWUsIHRoZSBjb3JydXB0IHJvdyB3aWxsIGJlIHNraXBwZWQKKyAgICAgICAgICAgIHNjcnViYmVyLnNjcnViKCk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CisgICAgICAgIC8vIHZlcmlmeSB0aGF0IHdlIGNhbiByZWFkIGFsbCB0aGUgcm93cywgYW5kIHRoZXJlIGlzIG5vdyB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIHJvd3MKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIGV4cGVjdGVkUGFydGl0aW9ucyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJPbmVSb3dXaXRoQ29ycnVwdGVkS2V5KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb25maWd1cmF0aW9uRXhjZXB0aW9uCisgICAgeworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YpOworCisgICAgICAgIC8vIGluc2VydCBkYXRhIGFuZCB2ZXJpZnkgd2UgZ2V0IGl0IGJhY2sgdy8gcmFuZ2UgcXVlcnkKKyAgICAgICAgZmlsbENGKGNmcywgNCk7CisgICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCA0KTsKKworICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIC8vIGNhbm5vdCB0ZXN0IHRoaXMgd2l0aCBjb21wcmVzc2lvbgorICAgICAgICBhc3N1bWVGYWxzZShzc3RhYmxlLm1ldGFkYXRhKCkucGFyYW1zLmNvbXByZXNzaW9uLmlzRW5hYmxlZCgpKTsKKworICAgICAgICBvdmVycmlkZVdpdGhHYXJiYWdlKHNzdGFibGUsIDAsIDIsIChieXRlKSAweDdBKTsKKworICAgICAgICBwZXJmb3JtU2NydWIoY2ZzLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIDIpOworCisgICAgICAgIC8vIGNoZWNrIGRhdGEgaXMgc3RpbGwgdGhlcmUKKyAgICAgICAgaWYgKEJpZ0Zvcm1hdC5pcyhzc3RhYmxlLmRlc2NyaXB0b3IuZ2V0Rm9ybWF0KCkpKQorICAgICAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDQpOworICAgICAgICBlbHNlIGlmIChCdGlGb3JtYXQuaXMoc3N0YWJsZS5kZXNjcmlwdG9yLmdldEZvcm1hdCgpKSkKKyAgICAgICAgICAgIC8vIEZvciBUcmllIGZvcm1hdCB3ZSB3b24ndCBiZSBhYmxlIHRvIHJlY292ZXIgdGhlIGRhbWFnZWQgcGFydGl0aW9uIGtleSAocGFydGlvbiBpbmRleCBkb2Vzbid0IHN0b3JlIHRoZSB3aG9sZSBrZXkpCisgICAgICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IFV0aWwudGVzdE11c3RCZUltcGxlbWVudGVkRm9yU1NUYWJsZUZvcm1hdCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNjcnViQ29ycnVwdGVkQ291bnRlclJvd05vRWFybHlPcGVuKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXcml0ZVRpbWVvdXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGJvb2xlYW4gb2xkRGlzYWJsZWRWYWwgPSBTU1RhYmxlUmV3cml0ZXIuZGlzYWJsZUVhcmx5T3BlbmluZ0ZvclRlc3RzOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgU1NUYWJsZVJld3JpdGVyLmRpc2FibGVFYXJseU9wZW5pbmdGb3JUZXN0cyA9IHRydWU7CisgICAgICAgICAgICB0ZXN0U2NydWJDb3JydXB0ZWRDb3VudGVyUGFydGl0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBTU1RhYmxlUmV3cml0ZXIuZGlzYWJsZUVhcmx5T3BlbmluZ0ZvclRlc3RzID0gb2xkRGlzYWJsZWRWYWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTY3J1Yk11bHRpUm93KCkKKyAgICB7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDRik7CisKKyAgICAgICAgLy8gaW5zZXJ0IGRhdGEgYW5kIHZlcmlmeSB3ZSBnZXQgaXQgYmFjayB3LyByYW5nZSBxdWVyeQorICAgICAgICBmaWxsQ0YoY2ZzLCAxMCk7CisgICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxMCk7CisKKyAgICAgICAgcGVyZm9ybVNjcnViKGNmcywgZmFsc2UsIHRydWUsIGZhbHNlLCAyKTsKKworICAgICAgICAvLyBjaGVjayBkYXRhIGlzIHN0aWxsIHRoZXJlCisgICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJOb0luZGV4KCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KKyAgICB7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDRik7CisKKyAgICAgICAgLy8gaW5zZXJ0IGRhdGEgYW5kIHZlcmlmeSB3ZSBnZXQgaXQgYmFjayB3LyByYW5nZSBxdWVyeQorICAgICAgICBmaWxsQ0YoY2ZzLCAxMCk7CisgICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxMCk7CisKKyAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpCisgICAgICAgICAgICBzc3RhYmxlSW5kZXhQYXRocyhzc3RhYmxlKS5mb3JFYWNoKEZpbGU6OnRyeURlbGV0ZSk7CisKKyAgICAgICAgcGVyZm9ybVNjcnViKGNmcywgZmFsc2UsIHRydWUsIGZhbHNlLCAyKTsKKworICAgICAgICAvLyBjaGVjayBkYXRhIGlzIHN0aWxsIHRoZXJlCisgICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQk1SdWxlKG5hbWUgPSAic2tpcCBwYXJ0aXRpb24gb3JkZXIgdmVyaWZpY2F0aW9uIiwgdGFyZ2V0Q2xhc3MgPSAiU29ydGVkVGFibGVXcml0ZXIiLCB0YXJnZXRNZXRob2QgPSAidmVyaWZ5UGFydGl0aW9uIiwgYWN0aW9uID0gInJldHVybiB0cnVlIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJPdXRPZk9yZGVyKCkKKyAgICB7CisgICAgICAgIC8vIFJ1biBvbmx5IGZvciBCaWcgVGFibGUgZm9ybWF0IGJlY2F1c2UgQmlnIFRhYmxlIEZvcm1hdCBkb2VzIG5vdCBjb21wbGFpbiBpZiBwYXJ0aXRpb25zIGFyZSBnaXZlbiBpbiBpbnZhbGlkCisgICAgICAgIC8vIG9yZGVyLiBMZWdhY3kgU1NUYWJsZXMgd2l0aCBvdXQtb2Ytb3JkZXIgcGFydGl0aW9ucyBleGlzdCBpbiBwcm9kdWN0aW9uIHN5c3RlbXMgYW5kIG11c3QgYmUgY29ycmVjdGVkCisgICAgICAgIC8vIGJ5IHNjcnViYmluZy4gVGhlIHRyaWUgaW5kZXggZm9ybWF0IGRvZXMgbm90IHBlcm1pdCBzdWNoIHBhcnRpdGlvbnMuCisKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoQmlnRm9ybWF0LmlzU2VsZWN0ZWQoKSk7CisKKyAgICAgICAgLy8gVGhpcyB0ZXN0IGFzc3VtZXMgQnl0ZU9yZGVyUGFydGl0aW9uZXIgdG8gY3JlYXRlIG91dC1vZi1vcmRlciBTU1RhYmxlCisgICAgICAgIElQYXJ0aXRpb25lciBvbGRQYXJ0aXRpb25lciA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRQYXJ0aXRpb25lcigpOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0UGFydGl0aW9uZXJVbnNhZmUobmV3IEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIoKSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIG91dC1vZi1vcmRlciBTU1RhYmxlCisgICAgICAgIEZpbGUgdGVtcERpciA9IEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZSgiU2NydWJUZXN0LnRlc3RTY3J1Yk91dE9mT3JkZXIiLCAiIikucGFyZW50KCk7CisgICAgICAgIC8vIGNyZWF0ZSBrcy9jZiBkaXJlY3RvcnkKKyAgICAgICAgRmlsZSB0ZW1wRGF0YURpciA9IG5ldyBGaWxlKHRlbXBEaXIsIFN0cmluZy5qb2luKEZpbGUucGF0aFNlcGFyYXRvcigpLCBrc05hbWUsIENGKSk7CisgICAgICAgIGFzc2VydFRydWUodGVtcERhdGFEaXIudHJ5Q3JlYXRlRGlyZWN0b3JpZXMoKSk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGKTsKKworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGtleXMgPSBBcnJheXMuYXNMaXN0KCJ0IiwgImEiLCAiYiIsICJ6IiwgImMiLCAieSIsICJkIik7CisgICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBjZnMubmV3U1NUYWJsZURlc2NyaXB0b3IodGVtcERhdGFEaXIpOworCisgICAgICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IExpZmVjeWNsZVRyYW5zYWN0aW9uLm9mZmxpbmUoT3BlcmF0aW9uVHlwZS5XUklURSk7CisgICAgICAgICAgICAgICAgIFNTVGFibGVUeG5Xcml0ZXIgd3JpdGVyID0gbmV3IFNTVGFibGVUeG5Xcml0ZXIodHhuLCBjcmVhdGVUZXN0V3JpdGVyKGRlc2MsIGtleXMuc2l6ZSgpLCBjZnMsIHR4bikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGsgOiBrZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSA9IFVwZGF0ZUJ1aWxkZXIuY3JlYXRlKGNmcy5tZXRhZGF0YSgpLCBVdGlsLmRrKGspKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXdSb3coInNvbWVOYW1lIikuYWRkKCJ2YWwiLCAic29tZVZhbHVlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICAgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKHVwZGF0ZS51bmZpbHRlcmVkSXRlcmF0b3IoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlci5maW5pc2goZmFsc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyLm9wZW4oY2ZzLCBkZXNjLCBjZnMubWV0YWRhdGEpOworICAgICAgICAgICAgICAgIGZhaWwoIlNTVFIgdmFsaWRhdGlvbiBzaG91bGQgaGF2ZSBjYXVnaHQgdGhlIG91dC1vZi1vcmRlciByb3dzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gaXNlKQorICAgICAgICAgICAgeyAvKiB0aGlzIGlzIGV4cGVjdGVkICovIH0KKworICAgICAgICAgICAgLy8gb3BlbiB3aXRob3V0IHZhbGlkYXRpb24gZm9yIHNjcnViYmluZworICAgICAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgICAgIGlmIChkZXNjLmZpbGVGb3IoQ29tcG9uZW50cy5DT01QUkVTU0lPTl9JTkZPKS5leGlzdHMoKSkKKyAgICAgICAgICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnRzLkNPTVBSRVNTSU9OX0lORk8pOworICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoQ29tcG9uZW50cy5EQVRBKTsKKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudHMuUFJJTUFSWV9JTkRFWCk7CisgICAgICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnRzLkZJTFRFUik7CisgICAgICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnRzLlNUQVRTKTsKKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudHMuU1VNTUFSWSk7CisgICAgICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnRzLlRPQyk7CisKKyAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IFNTVGFibGVSZWFkZXIub3Blbk5vVmFsaWRhdGlvbihkZXNjLCBjb21wb25lbnRzLCBjZnMpOworLy8gICAgICAgICAgICBpZiAoc3N0YWJsZS5sYXN0LmNvbXBhcmVUbyhzc3RhYmxlLmZpcnN0KSA8IDApCisvLyAgICAgICAgICAgICAgICBzc3RhYmxlLmxhc3QgPSBzc3RhYmxlLmZpcnN0OworCisgICAgICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHNjcnViVHhuID0gTGlmZWN5Y2xlVHJhbnNhY3Rpb24ub2ZmbGluZShPcGVyYXRpb25UeXBlLlNDUlVCLCBzc3RhYmxlKTsKKyAgICAgICAgICAgICAgICAgSVNjcnViYmVyIHNjcnViYmVyID0gc3N0YWJsZS5kZXNjcmlwdG9yLmdldEZvcm1hdCgpLmdldFNjcnViYmVyKGNmcywgc2NydWJUeG4sIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBuZXcgSVNjcnViYmVyLk9wdGlvbnMuQnVpbGRlcigpLmNoZWNrRGF0YSgpLmJ1aWxkKCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNjcnViYmVyLnNjcnViKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbi53YWl0Rm9yRGVsZXRpb25zKCk7CisgICAgICAgICAgICBjZnMubG9hZE5ld1NTVGFibGVzKCk7CisgICAgICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgNyk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlVXRpbHMuZGVsZXRlUmVjdXJzaXZlKHRlbXBEYXRhRGlyKTsKKyAgICAgICAgICAgIC8vIHJlc2V0IHBhcnRpdGlvbmVyCisgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0UGFydGl0aW9uZXJVbnNhZmUob2xkUGFydGl0aW9uZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG92ZXJyaWRlV2l0aEdhcmJhZ2UoU1NUYWJsZVJlYWRlciBzc3RhYmxlLCBCeXRlQnVmZmVyIGtleTEsIEJ5dGVCdWZmZXIga2V5MikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBvdmVycmlkZVdpdGhHYXJiYWdlKHNzdGFibGUsIGtleTEsIGtleTIsIChieXRlKSAneicpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBvdmVycmlkZVdpdGhHYXJiYWdlKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgQnl0ZUJ1ZmZlciBrZXkxLCBCeXRlQnVmZmVyIGtleTIsIGJ5dGUganVuaykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBib29sZWFuIGNvbXByZXNzaW9uID0gc3N0YWJsZS5tZXRhZGF0YSgpLnBhcmFtcy5jb21wcmVzc2lvbi5pc0VuYWJsZWQoKTsKKyAgICAgICAgbG9uZyBzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbjsKKworICAgICAgICBpZiAoY29tcHJlc3Npb24pCisgICAgICAgIHsgLy8gb3ZlcndyaXRlIHdpdGggZ2FyYmFnZSB0aGUgY29tcHJlc3Npb24gY2h1bmtzIGZyb20ga2V5MSB0byBrZXkyCisgICAgICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhIGNvbXBEYXRhID0gQ29tcHJlc3Npb25JbmZvQ29tcG9uZW50LmxvYWQoc3N0YWJsZS5kZXNjcmlwdG9yKTsKKworICAgICAgICAgICAgQ29tcHJlc3Npb25NZXRhZGF0YS5DaHVuayBjaHVuazEgPSBjb21wRGF0YS5jaHVua0ZvcigKKyAgICAgICAgICAgIHNzdGFibGUuZ2V0UG9zaXRpb24oUGFydGl0aW9uUG9zaXRpb24uRm9yS2V5LmdldChrZXkxLCBzc3RhYmxlLmdldFBhcnRpdGlvbmVyKCkpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKSk7CisgICAgICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhLkNodW5rIGNodW5rMiA9IGNvbXBEYXRhLmNodW5rRm9yKAorICAgICAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbi5Gb3JLZXkuZ2V0KGtleTIsIHNzdGFibGUuZ2V0UGFydGl0aW9uZXIoKSksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpKTsKKworICAgICAgICAgICAgc3RhcnRQb3NpdGlvbiA9IE1hdGgubWluKGNodW5rMS5vZmZzZXQsIGNodW5rMi5vZmZzZXQpOworICAgICAgICAgICAgZW5kUG9zaXRpb24gPSBNYXRoLm1heChjaHVuazEub2Zmc2V0ICsgY2h1bmsxLmxlbmd0aCwgY2h1bmsyLm9mZnNldCArIGNodW5rMi5sZW5ndGgpOworCisgICAgICAgICAgICBjb21wRGF0YS5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAvLyBvdmVyd3JpdGUgd2l0aCBnYXJiYWdlIGZyb20ga2V5MSB0byBrZXkyCisgICAgICAgICAgICBsb25nIHJvdzBTdGFydCA9IHNzdGFibGUuZ2V0UG9zaXRpb24oUGFydGl0aW9uUG9zaXRpb24uRm9yS2V5LmdldChrZXkxLCBzc3RhYmxlLmdldFBhcnRpdGlvbmVyKCkpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKTsKKyAgICAgICAgICAgIGxvbmcgcm93MVN0YXJ0ID0gc3N0YWJsZS5nZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbi5Gb3JLZXkuZ2V0KGtleTIsIHNzdGFibGUuZ2V0UGFydGl0aW9uZXIoKSksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOworICAgICAgICAgICAgc3RhcnRQb3NpdGlvbiA9IE1hdGgubWluKHJvdzBTdGFydCwgcm93MVN0YXJ0KTsKKyAgICAgICAgICAgIGVuZFBvc2l0aW9uID0gTWF0aC5tYXgocm93MFN0YXJ0LCByb3cxU3RhcnQpOworICAgICAgICB9CisKKyAgICAgICAgb3ZlcnJpZGVXaXRoR2FyYmFnZShzc3RhYmxlLCBzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbiwganVuayk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBvdmVycmlkZVdpdGhHYXJiYWdlKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgbG9uZyBzdGFydFBvc2l0aW9uLCBsb25nIGVuZFBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIG92ZXJyaWRlV2l0aEdhcmJhZ2Uoc3N0YWJsZSwgc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24sIChieXRlKSAneicpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgb3ZlcnJpZGVXaXRoR2FyYmFnZShTU1RhYmxlUmVhZGVyIHNzdGFibGUsIGxvbmcgc3RhcnRQb3NpdGlvbiwgbG9uZyBlbmRQb3NpdGlvbiwgYnl0ZSBqdW5rKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIG92ZXJyaWRlV2l0aEdhcmJhZ2Uoc3N0YWJsZS5nZXREYXRhQ2hhbm5lbCgpLmZpbGUoKSwgc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24sIGp1bmspOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgb3ZlcnJpZGVXaXRoR2FyYmFnZShGaWxlIHBhdGgsIGxvbmcgc3RhcnRQb3NpdGlvbiwgbG9uZyBlbmRQb3NpdGlvbiwgYnl0ZSBqdW5rKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzRmlsZSBmaWxlID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUocGF0aC50b0phdmFJT0ZpbGUoKSwgInJ3IikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbGUuc2VlayhzdGFydFBvc2l0aW9uKTsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAoaW50KSAoZW5kUG9zaXRpb24gLSBzdGFydFBvc2l0aW9uKTsKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgICAgIEFycmF5cy5maWxsKGJ1ZmYsIGp1bmspOworICAgICAgICAgICAgZmlsZS53cml0ZShidWZmLCAwLCBsZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGlmIChDaHVua0NhY2hlLmluc3RhbmNlICE9IG51bGwpCisgICAgICAgICAgICBDaHVua0NhY2hlLmluc3RhbmNlLmludmFsaWRhdGVGaWxlKHBhdGgudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydE9yZGVyZWRBbGwoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBpbnQgZXhwZWN0ZWRTaXplKQorICAgIHsKKyAgICAgICAgYXNzZXJ0T3JkZXJlZChVdGlsLmNtZChjZnMpLmJ1aWxkKCksIGV4cGVjdGVkU2l6ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRPcmRlcmVkKFJlYWRDb21tYW5kIGNtZCwgaW50IGV4cGVjdGVkU2l6ZSkKKyAgICB7CisgICAgICAgIGludCBzaXplID0gMDsKKyAgICAgICAgRGVjb3JhdGVkS2V5IHByZXYgPSBudWxsOworICAgICAgICBsb2dnZXIuaW5mbygiUmVhZGluZyBkYXRhIGZyb20gIiArIGNtZCk7CisgICAgICAgIGZvciAoUGFydGl0aW9uIHBhcnRpdGlvbiA6IFV0aWwuZ2V0QWxsVW5maWx0ZXJlZChjbWQpKQorICAgICAgICB7CisgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgY3VycmVudCA9IHBhcnRpdGlvbi5wYXJ0aXRpb25LZXkoKTsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJSZWFkICIgKyBjdXJyZW50LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgaWYgKCEocHJldiA9PSBudWxsIHx8IHByZXYuY29tcGFyZVRvKGN1cnJlbnQpIDwgMCkpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJrZXkgIiArIGN1cnJlbnQgKyAiIGRvZXMgbm90IHNvcnQgYWZ0ZXIgcHJldmlvdXMga2V5ICIgKyBwcmV2KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImtleSAiICsgY3VycmVudCArICIgZG9lcyBub3Qgc29ydCBhZnRlciBwcmV2aW91cyBrZXkgIiArIHByZXYsIHByZXYgPT0gbnVsbCB8fCBwcmV2LmNvbXBhcmVUbyhjdXJyZW50KSA8IDApOworICAgICAgICAgICAgcHJldiA9IGN1cnJlbnQ7CisgICAgICAgICAgICArK3NpemU7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU2l6ZSwgc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbGxDRihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIGludCBwYXJ0aXRpb25zUGVyU1NUYWJsZSkKKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydGl0aW9uc1BlclNTVGFibGU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSA9IFVwZGF0ZUJ1aWxkZXIuY3JlYXRlKGNmcy5tZXRhZGF0YSgpLCBTdHJpbmcudmFsdWVPZihpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5ld1JvdygicjEiKS5hZGQoInZhbCIsICIxIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5ld1JvdygicjEiKS5hZGQoInZhbCIsICIxIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgICAgIG5ldyBNdXRhdGlvbih1cGRhdGUpLmFwcGx5VW5zYWZlKCk7CisgICAgICAgIH0KKworICAgICAgICBVdGlsLmZsdXNoKGNmcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbGxJbmRleENGKENvbHVtbkZhbWlseVN0b3JlIGNmcywgYm9vbGVhbiBjb21wb3NpdGUsIGxvbmcuLi4gdmFsdWVzKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHZhbHVlcy5sZW5ndGggJSAyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpICs9IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFVwZGF0ZUJ1aWxkZXIgYnVpbGRlciA9IFVwZGF0ZUJ1aWxkZXIuY3JlYXRlKGNmcy5tZXRhZGF0YSgpLCBTdHJpbmcudmFsdWVPZihpKSk7CisgICAgICAgICAgICBpZiAoY29tcG9zaXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIubmV3Um93KCJjIiArIGkpCisgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoQ09MX0lOREVYLCB2YWx1ZXNbaV0pCisgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoQ09MX05PTl9JTkRFWCwgdmFsdWVzW2kgKyAxXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5uZXdSb3coKQorICAgICAgICAgICAgICAgICAgICAgICAuYWRkKENPTF9JTkRFWCwgdmFsdWVzW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAuYWRkKENPTF9OT05fSU5ERVgsIHZhbHVlc1tpICsgMV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3IE11dGF0aW9uKGJ1aWxkZXIuYnVpbGQoKSkuYXBwbHlVbnNhZmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIFV0aWwuZmx1c2goY2ZzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGZpbGxDb3VudGVyQ0YoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBpbnQgcGFydGl0aW9uc1BlclNTVGFibGUpIHRocm93cyBXcml0ZVRpbWVvdXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFNvcnRlZFNldDxTdHJpbmc+IHRva2VuU29ydGVkID0gU2V0cy5uZXdUcmVlU2V0KENvbXBhcmF0b3IuY29tcGFyaW5nKGEgLT4gY2ZzLmdldFBhcnRpdGlvbmVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoYSkpKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydGl0aW9uc1BlclNTVGFibGU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGkgPCAxMCkKKyAgICAgICAgICAgICAgICBVbmludGVycnVwdGlibGVzLnNsZWVwVW5pbnRlcnJ1cHRpYmx5KDEwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSA9IFVwZGF0ZUJ1aWxkZXIuY3JlYXRlKGNmcy5tZXRhZGF0YSgpLCBTdHJpbmcudmFsdWVPZihpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5ld1JvdygicjEiKS5hZGQoInZhbCIsIDEwMEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICAgICAgdG9rZW5Tb3J0ZWQuYWRkKFN0cmluZy52YWx1ZU9mKGkpKTsKKyAgICAgICAgICAgIG5ldyBDb3VudGVyTXV0YXRpb24obmV3IE11dGF0aW9uKHVwZGF0ZSksIENvbnNpc3RlbmN5TGV2ZWwuT05FKS5hcHBseSgpOworICAgICAgICB9CisKKyAgICAgICAgVXRpbC5mbHVzaChjZnMpOworCisgICAgICAgIHJldHVybiB0b2tlblNvcnRlZC50b0FycmF5KEFycmF5VXRpbHMuRU1QVFlfU1RSSU5HX0FSUkFZKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTY3J1YkNvbHVtblZhbGlkYXRpb24oKSB0aHJvd3MgUmVxdWVzdEV4ZWN1dGlvbkV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUXVlcnlQcm9jZXNzb3IucHJvY2VzcyhTdHJpbmcuZm9ybWF0KCJDUkVBVEUgVEFCTEUgXCIlc1wiLnRlc3RfY29tcGFjdF9zdGF0aWNfY29sdW1ucyAoYSBiaWdpbnQsIGIgdGltZXV1aWQsIGMgYm9vbGVhbiBzdGF0aWMsIGQgdGV4dCwgUFJJTUFSWSBLRVkgKGEsIGIpKSIsIGtzTmFtZSksIENvbnNpc3RlbmN5TGV2ZWwuT05FKTsKKworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZSgidGVzdF9jb21wYWN0X3N0YXRpY19jb2x1bW5zIik7CisKKyAgICAgICAgUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsKFN0cmluZy5mb3JtYXQoIklOU0VSVCBJTlRPIFwiJXNcIi50ZXN0X2NvbXBhY3Rfc3RhdGljX2NvbHVtbnMgKGEsIGIsIGMsIGQpIFZBTFVFUyAoMTIzLCBjM2RiMDdlOC1iNjAyLTExZTMtYmM2Yi1lMGI5YTU0YTZkOTMsIHRydWUsICdmb29iYXInKSIsIGtzTmFtZSkpOworICAgICAgICBVdGlsLmZsdXNoKGNmcyk7CisgICAgICAgIHBlcmZvcm1TY3J1YihjZnMsIGZhbHNlLCB0cnVlLCBmYWxzZSwgMik7CisKKyAgICAgICAgUXVlcnlQcm9jZXNzb3IucHJvY2VzcyhTdHJpbmcuZm9ybWF0KCJDUkVBVEUgVEFCTEUgXCIlc1wiLnRlc3Rfc2NydWJfdmFsaWRhdGlvbiAoYSB0ZXh0IHByaW1hcnkga2V5LCBiIGludCkiLCBrc05hbWUpLCBDb25zaXN0ZW5jeUxldmVsLk9ORSk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmczIgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZSgidGVzdF9zY3J1Yl92YWxpZGF0aW9uIik7CisKKyAgICAgICAgbmV3IE11dGF0aW9uKFVwZGF0ZUJ1aWxkZXIuY3JlYXRlKGNmczIubWV0YWRhdGEoKSwgImtleSIpLm5ld1JvdygpLmFkZCgiYiIsIEludDMyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoMSkpLmJ1aWxkKCkpLmFwcGx5KCk7CisgICAgICAgIFV0aWwuZmx1c2goY2ZzMik7CisKKyAgICAgICAgcGVyZm9ybVNjcnViKGNmczIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvciBDQVNTQU5EUkEtNjg5MiB0b28sIGNoZWNrIHRoYXQgZm9yIGEgY29tcGFjdCB0YWJsZSB3aXRoIG9uZSBjbHVzdGVyIGNvbHVtbiwgd2UgY2FuIGluc2VydCB3aGF0ZXZlcgorICAgICAqIHdlIHdhbnQgYXMgdmFsdWUgZm9yIHRoZSBjbHVzdGVyaW5nIGNvbHVtbiwgaW5jbHVkaW5nIHNvbWV0aGluZyB0aGF0IHdvdWxkIGNvbmZsaWN0IHdpdGggYSBDUUwgY29sdW1uIGRlZmluaXRpb24uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvbkNvbXBhY3RTdG9yYWdlKCkKKyAgICB7CisgICAgICAgIFF1ZXJ5UHJvY2Vzc29yLnByb2Nlc3MoU3RyaW5nLmZvcm1hdCgiQ1JFQVRFIFRBQkxFIFwiJXNcIi50ZXN0X2NvbXBhY3RfZHluYW1pY19jb2x1bW5zIChhIGludCwgYiB0ZXh0LCBjIHRleHQsIFBSSU1BUlkgS0VZIChhLCBiKSkgV0lUSCBDT01QQUNUIFNUT1JBR0UiLCBrc05hbWUpLCBDb25zaXN0ZW5jeUxldmVsLk9ORSk7CisKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoInRlc3RfY29tcGFjdF9keW5hbWljX2NvbHVtbnMiKTsKKworICAgICAgICBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gXCIlc1wiLnRlc3RfY29tcGFjdF9keW5hbWljX2NvbHVtbnMgKGEsIGIsIGMpIFZBTFVFUyAoMCwgJ2EnLCAnZm9vJykiLCBrc05hbWUpKTsKKyAgICAgICAgUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsKFN0cmluZy5mb3JtYXQoIklOU0VSVCBJTlRPIFwiJXNcIi50ZXN0X2NvbXBhY3RfZHluYW1pY19jb2x1bW5zIChhLCBiLCBjKSBWQUxVRVMgKDAsICdiJywgJ2JhcicpIiwga3NOYW1lKSk7CisgICAgICAgIFF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVJbnRlcm5hbChTdHJpbmcuZm9ybWF0KCJJTlNFUlQgSU5UTyBcIiVzXCIudGVzdF9jb21wYWN0X2R5bmFtaWNfY29sdW1ucyAoYSwgYiwgYykgVkFMVUVTICgwLCAnYycsICdib28nKSIsIGtzTmFtZSkpOworICAgICAgICBVdGlsLmZsdXNoKGNmcyk7CisgICAgICAgIHBlcmZvcm1TY3J1YihjZnMsIHRydWUsIHRydWUsIGZhbHNlLCAyKTsKKworICAgICAgICAvLyBTY3J1YiBpcyBzaWxlbnQsIGJ1dCBpdCB3aWxsIHJlbW92ZSBicm9rZW4gcmVjb3Jkcy4gU28gcmVhZGluZyBldmVyeXRoaW5nIGJhY2sgdG8gbWFrZSBzdXJlIG5vdGhpbmcgdG8gInNjcnViYmVkIGF3YXkiCisgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcnMgPSBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiU0VMRUNUICogRlJPTSBcIiVzXCIudGVzdF9jb21wYWN0X2R5bmFtaWNfY29sdW1ucyIsIGtzTmFtZSkpOworICAgICAgICBhc3NlcnROb3ROdWxsKHJzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJzLnNpemUoKSk7CisKKyAgICAgICAgSXRlcmF0b3I8VW50eXBlZFJlc3VsdFNldC5Sb3c+IGl0ZXIgPSBycy5pdGVyYXRvcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIGl0ZXIubmV4dCgpLmdldFN0cmluZygiYyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCBpdGVyLm5leHQoKS5nZXRTdHJpbmcoImMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYm9vIiwgaXRlci5uZXh0KCkuZ2V0U3RyaW5nKCJjIikpOworICAgIH0KKworICAgIEBUZXN0IC8qIENBU1NBTkRSQS01MTc0ICovCisgICAgcHVibGljIHZvaWQgdGVzdFNjcnViS2V5c0luZGV4X3ByZXNlcnZlT3JkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vSWYgdGhlIHBhcnRpdGlvbmVyIHByZXNlcnZlcyB0aGUgb3JkZXIgdGhlbiBTZWNvbmRhcnlJbmRleCB1c2VzIEJ5dGVzVHlwZSBjb21wYXJhdG9yLAorICAgICAgICAvLyBvdGhlcndpc2UgaXQgdXNlcyBMb2NhbEJ5UGFydGl0aW9uZXJUeXBlCisgICAgICAgIHRlc3RTY3J1YkluZGV4KENGX0lOREVYMV9CWVRFT1JERVJFRCwgQ09MX0lOREVYLCBmYWxzZSwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QgLyogQ0FTU0FORFJBLTUxNzQgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJDb21wb3NpdGVJbmRleF9wcmVzZXJ2ZU9yZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICB0ZXN0U2NydWJJbmRleChDRl9JTkRFWDJfQllURU9SREVSRUQsIENPTF9JTkRFWCwgdHJ1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QgLyogQ0FTU0FORFJBLTUxNzQgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJLZXlzSW5kZXgoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRlc3RTY3J1YkluZGV4KENGX0lOREVYMSwgQ09MX0lOREVYLCBmYWxzZSwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QgLyogQ0FTU0FORFJBLTUxNzQgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJDb21wb3NpdGVJbmRleCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGVzdFNjcnViSW5kZXgoQ0ZfSU5ERVgyLCBDT0xfSU5ERVgsIHRydWUsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0IC8qIENBU1NBTkRSQS01MTc0ICovCisgICAgcHVibGljIHZvaWQgdGVzdEZhaWxTY3J1YktleXNJbmRleCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGVzdFNjcnViSW5kZXgoQ0ZfSU5ERVgxLCBDT0xfSU5ERVgsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QgLyogQ0FTU0FORFJBLTUxNzQgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbFNjcnViQ29tcG9zaXRlSW5kZXgoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRlc3RTY3J1YkluZGV4KENGX0lOREVYMiwgQ09MX0lOREVYLCB0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QgLyogQ0FTU0FORFJBLTUxNzQgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJUd2ljZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGVzdFNjcnViSW5kZXgoQ0ZfSU5ERVgyLCBDT0xfSU5ERVgsIHRydWUsIHRydWUsIHRydWUpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJTYW1lUGFyYW1ldGVyVmFsdWUiKQorICAgIHByaXZhdGUgdm9pZCB0ZXN0U2NydWJJbmRleChTdHJpbmcgY2ZOYW1lLCBTdHJpbmcgY29sTmFtZSwgYm9vbGVhbiBjb21wb3NpdGUsIGJvb2xlYW4uLi4gc2NydWJzKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKGNmTmFtZSk7CisKKyAgICAgICAgaW50IG51bVJvd3MgPSAxMDAwOworICAgICAgICBsb25nW10gY29sVmFsdWVzID0gbmV3IGxvbmdbbnVtUm93cyAqIDJdOyAvLyBlYWNoIHJvdyBoYXMgdHdvIGNvbHVtbnMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xWYWx1ZXMubGVuZ3RoOyBpICs9IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbFZhbHVlc1tpXSA9IChpICUgNCA9PSAwID8gMUwgOiAyTCk7IC8vIGluZGV4IGNvbHVtbgorICAgICAgICAgICAgY29sVmFsdWVzW2kgKyAxXSA9IDNMOyAvL290aGVyIGNvbHVtbgorICAgICAgICB9CisgICAgICAgIGZpbGxJbmRleENGKGNmcywgY29tcG9zaXRlLCBjb2xWYWx1ZXMpOworCisgICAgICAgIC8vIGNoZWNrIGluZGV4CisKKyAgICAgICAgYXNzZXJ0T3JkZXJlZChVdGlsLmNtZChjZnMpLmZpbHRlck9uKGNvbE5hbWUsIE9wZXJhdG9yLkVRLCAxTCkuYnVpbGQoKSwgbnVtUm93cyAvIDIpOworCisgICAgICAgIC8vIHNjcnViIGluZGV4CisgICAgICAgIFNldDxDb2x1bW5GYW1pbHlTdG9yZT4gaW5kZXhDZnNzID0gY2ZzLmluZGV4TWFuYWdlci5nZXRBbGxJbmRleENvbHVtbkZhbWlseVN0b3JlcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaW5kZXhDZnNzLnNpemUoKSk7CisgICAgICAgIGZvciAoQ29sdW1uRmFtaWx5U3RvcmUgaW5kZXhDZnMgOiBpbmRleENmc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NydWJzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gZmFpbHVyZSA9ICFzY3J1YnNbaV07CisgICAgICAgICAgICAgICAgaWYgKGZhaWx1cmUpCisgICAgICAgICAgICAgICAgeyAvL21ha2Ugc3VyZSB0aGUgbmV4dCBzY3J1YiBmYWlscworICAgICAgICAgICAgICAgICAgICBvdmVycmlkZVdpdGhHYXJiYWdlKGluZGV4Q2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpLCBCeXRlQnVmZmVyVXRpbC5ieXRlcygxTCksIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKDJMKSwgKGJ5dGUpIDB4N0EpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMgcmVzdWx0ID0gaW5kZXhDZnMuc2NydWIoZmFsc2UsIHRydWUsIElTY3J1YmJlci5vcHRpb25zKCkuYnVpbGQoKSwgMCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZhaWx1cmUgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMuQUJPUlRFRCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cy5TVUNDRVNTRlVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLyBjaGVjayBpbmRleCBpcyBzdGlsbCB3b3JraW5nCisgICAgICAgIGFzc2VydE9yZGVyZWQoVXRpbC5jbWQoY2ZzKS5maWx0ZXJPbihjb2xOYW1lLCBPcGVyYXRvci5FUSwgMUwpLmJ1aWxkKCksIG51bVJvd3MgLyAyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTU1RhYmxlTXVsdGlXcml0ZXIgY3JlYXRlVGVzdFdyaXRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGxvbmcga2V5Q291bnQsIENvbHVtbkZhbWlseVN0b3JlIGNmcywgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuKQorICAgIHsKKyAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIgPSBuZXcgU2VyaWFsaXphdGlvbkhlYWRlcih0cnVlLCBjZnMubWV0YWRhdGEoKSwgY2ZzLm1ldGFkYXRhKCkucmVndWxhckFuZFN0YXRpY0NvbHVtbnMoKSwgRW5jb2RpbmdTdGF0cy5OT19TVEFUUyk7CisgICAgICAgIE1ldGFkYXRhQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBNZXRhZGF0YUNvbGxlY3RvcihjZnMubWV0YWRhdGEoKS5jb21wYXJhdG9yKS5zc3RhYmxlTGV2ZWwoMCk7CisgICAgICAgIFNTVGFibGVXcml0ZXIgd3JpdGVyID0gZGVzY3JpcHRvci5nZXRGb3JtYXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0V3JpdGVyRmFjdG9yeSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZGVyKGRlc2NyaXB0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRLZXlDb3VudChrZXlDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFJlcGFpcmVkQXQoMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBlbmRpbmdSZXBhaXIobnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRyYW5zaWVudFNTVGFibGUoZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUYWJsZU1ldGFkYXRhUmVmKGNmcy5tZXRhZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1ldGFkYXRhQ29sbGVjdG9yKGNvbGxlY3RvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNlcmlhbGl6YXRpb25IZWFkZXIoaGVhZGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Rmx1c2hPYnNlcnZlcnMoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGREZWZhdWx0Q29tcG9uZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCh0eG4sIGNmcyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0TXVsdGlXcml0ZXIod3JpdGVyLCB0eG4pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RNdWx0aVdyaXRlciBleHRlbmRzIFNpbXBsZVNTVGFibGVNdWx0aVdyaXRlcgorICAgIHsKKyAgICAgICAgVGVzdE11bHRpV3JpdGVyKFNTVGFibGVXcml0ZXIgd3JpdGVyLCBMaWZlY3ljbGVOZXdUcmFja2VyIGxpZmVjeWNsZU5ld1RyYWNrZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKHdyaXRlciwgbGlmZWN5Y2xlTmV3VHJhY2tlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB3aXRoIGludmFsaWQgc3N0YWJsZXMgKGNvbnRhaW5pbmcgZHVwbGljYXRlIGVudHJpZXMgaW4gMi4wIGFuZCAzLjAgc3RvcmFnZSBmb3JtYXQpLAorICAgICAqIHRoYXQgd2VyZSBjYXVzZWQgYnkgdXBncmFkaW5nIGZyb20gMi54IHdpdGggZHVwbGljYXRlIHJhbmdlIHRvbWJzdG9uZXMuCisgICAgICogPHA+CisgICAgICogU2VlIENBU1NBTkRSQS0xMjE0NCBmb3IgZGV0YWlscy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJPdXREdXBsaWNhdGVzKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoQmlnRm9ybWF0LmlzU2VsZWN0ZWQoKSk7CisKKyAgICAgICAgSVBhcnRpdGlvbmVyIG9sZFBhcnQgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0UGFydGl0aW9uZXIoKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRQYXJ0aXRpb25lclVuc2FmZShNdXJtdXIzUGFydGl0aW9uZXIuaW5zdGFuY2UpOworICAgICAgICAgICAgUXVlcnlQcm9jZXNzb3IucHJvY2VzcyhTdHJpbmcuZm9ybWF0KCJDUkVBVEUgVEFCTEUgXCIlc1wiLmNmX3dpdGhfZHVwbGljYXRlc18zXzAgKGEgaW50LCBiIGludCwgYyBpbnQsIFBSSU1BUlkgS0VZIChhLCBiKSkiLCBrc05hbWUpLCBDb25zaXN0ZW5jeUxldmVsLk9ORSk7CisKKyAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKCJjZl93aXRoX2R1cGxpY2F0ZXNfM18wIik7CisKKyAgICAgICAgICAgIFBhdGggbGVnYWN5U1NUYWJsZVJvb3QgPSBQYXRocy5nZXQoVEVTVF9JTlZBTElEX0xFR0FDWV9TU1RBQkxFX1JPT1QuZ2V0U3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLZXlzcGFjZTEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Zfd2l0aF9kdXBsaWNhdGVzXzNfMCIpOworCisgICAgICAgICAgICBmb3IgKFN0cmluZyBmaWxlbmFtZSA6IG5ldyBTdHJpbmdbXXsgIm1iLTMtYmlnLUNvbXByZXNzaW9uSW5mby5kYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1iLTMtYmlnLURpZ2VzdC5jcmMzMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1iLTMtYmlnLUluZGV4LmRiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWItMy1iaWctU3VtbWFyeS5kYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1iLTMtYmlnLURhdGEuZGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYi0zLWJpZy1GaWx0ZXIuZGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYi0zLWJpZy1TdGF0aXN0aWNzLmRiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWItMy1iaWctVE9DLnR4dCIgfSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxlcy5jb3B5KFBhdGhzLmdldChsZWdhY3lTU1RhYmxlUm9vdC50b1N0cmluZygpLCBmaWxlbmFtZSksIGNmcy5nZXREaXJlY3RvcmllcygpLmdldERpcmVjdG9yeUZvck5ld1NTVGFibGVzKCkudG9QYXRoKCkucmVzb2x2ZShmaWxlbmFtZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjZnMubG9hZE5ld1NTVGFibGVzKCk7CisKKyAgICAgICAgICAgIGNmcy5zY3J1Yih0cnVlLCBmYWxzZSwgSVNjcnViYmVyLm9wdGlvbnMoKS5za2lwQ29ycnVwdGVkKCkuYnVpbGQoKSwgMSk7CisKKyAgICAgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcnMgPSBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiU0VMRUNUICogRlJPTSBcIiVzXCIuY2Zfd2l0aF9kdXBsaWNhdGVzXzNfMCIsIGtzTmFtZSkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChycyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcnMuc2l6ZSgpKTsKKworICAgICAgICAgICAgUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsKFN0cmluZy5mb3JtYXQoIkRFTEVURSBGUk9NIFwiJXNcIi5jZl93aXRoX2R1cGxpY2F0ZXNfM18wIFdIRVJFIGE9MSBBTkQgYiA9MiIsIGtzTmFtZSkpOworICAgICAgICAgICAgcnMgPSBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiU0VMRUNUICogRlJPTSBcIiVzXCIuY2Zfd2l0aF9kdXBsaWNhdGVzXzNfMCIsIGtzTmFtZSkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChycyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcnMuc2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRQYXJ0aXRpb25lclVuc2FmZShvbGRQYXJ0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cyBwZXJmb3JtU2NydWIoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBib29sZWFuIHNraXBDb3JydXB0ZWQsIGJvb2xlYW4gY2hlY2tEYXRhLCBib29sZWFuIHJlaW5zZXJ0T3ZlcmZsb3dlZFRUTCwgaW50IGpvYnMpCisgICAgeworICAgICAgICBJU2NydWJiZXIuT3B0aW9ucyBvcHRpb25zID0gSVNjcnViYmVyLm9wdGlvbnMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNraXBDb3JydXB0ZWQoc2tpcENvcnJ1cHRlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGVja0RhdGEoY2hlY2tEYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlaW5zZXJ0T3ZlcmZsb3dlZFRUTFJvd3MocmVpbnNlcnRPdmVyZmxvd2VkVFRMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIHJldHVybiBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5wZXJmb3JtU2NydWIoY2ZzLCBvcHRpb25zLCBqb2JzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9WZXJpZnlUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9WZXJpZnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBiYmUwOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1ZlcmlmeVRlc3QuamF2YQpAQCAtMCwwICsxLDg0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7CitpbXBvcnQgamF2YS51dGlsLnppcC5DaGVja2VkSW5wdXRTdHJlYW07CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJzZXRzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXBkYXRlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmJhdGNobG9nLkJhdGNoOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmJhdGNobG9nLkJhdGNobG9nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5DaHVua0NhY2hlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQnVmZmVyRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5QYXJ0aXRpb25Qb3NpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVVJRFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lk11cm11cjNQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLldyaXRlVGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU1dyaXRlRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyV2l0aEZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5Tb3J0ZWRUYWJsZVZlcmlmaWVyLlJhbmdlT3duSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aS5CdGlGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUlucHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLlRva2VuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbXByZXNzaW9uUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk91dHB1dEhhbmRsZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyLmNvdW50ZXJDRk1EOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2U7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlci5sb2FkU2NoZW1hOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogVGVzdCBmb3Ige0BsaW5rIElWZXJpZmllcn0uCisgKiA8cD4KKyAqIE5vdGU6IHRoZSBjb21wbGV0ZSBjb3ZlcmFnZSBpcyBjb21wb3NlZCBvZjoKKyAqIC0ge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlN0YW5kYWxvbmVWZXJpZmllck9uU1NUYWJsZXNUZXN0fQorICogLSB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuU3RhbmRhbG9uZVZlcmlmaWVyVGVzdH0KKyAqIC0ge0BsaW5rIFZlcmlmeVRlc3R9CisgKi8KK3B1YmxpYyBjbGFzcyBWZXJpZnlUZXN0Cit7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFZlcmlmeVRlc3QuY2xhc3MpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0UgPSAiS2V5c3BhY2UxIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRiA9ICJTdGFuZGFyZDEiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGMiA9ICJTdGFuZGFyZDIiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGMyA9ICJTdGFuZGFyZDMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGNCA9ICJTdGFuZGFyZDQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPVU5URVJfQ0YgPSAiQ291bnRlcjEiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPVU5URVJfQ0YyID0gIkNvdW50ZXIyIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1VOVEVSX0NGMyA9ICJDb3VudGVyMyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09VTlRFUl9DRjQgPSAiQ291bnRlcjQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUlJVUFRfQ0YgPSAiQ29ycnVwdDEiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUlJVUFRfQ0YyID0gIkNvcnJ1cHQyIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1JSVVBUQ09VTlRFUl9DRiA9ICJDb3VudGVyQ29ycnVwdDEiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUlJVUFRDT1VOVEVSX0NGMiA9ICJDb3VudGVyQ29ycnVwdDIiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfVVVJRCA9ICJVVUlES2V5cyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkZfQUxXQVlTX1BSRVNFTlQgPSAiQmZBbHdheXNQcmVzZW50IjsKKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVTY2hlbWEoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQ29tcHJlc3Npb25QYXJhbXMgY29tcHJlc3Npb25QYXJhbWV0ZXJzID0gQ29tcHJlc3Npb25QYXJhbXMuc25hcHB5KDMyNzY4KTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleFNpemVJbktpQigwKTsKKworICAgICAgICBsb2FkU2NoZW1hKCk7CisgICAgICAgIGNyZWF0ZUtleXNwYWNlKEtFWVNQQUNFLAorICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCisgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkQ0ZNRChLRVlTUEFDRSwgQ0YpLmNvbXByZXNzaW9uKGNvbXByZXNzaW9uUGFyYW1ldGVycyksCisgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkQ0ZNRChLRVlTUEFDRSwgQ0YyKS5jb21wcmVzc2lvbihjb21wcmVzc2lvblBhcmFtZXRlcnMpLAorICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZENGTUQoS0VZU1BBQ0UsIENGMyksCisgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkQ0ZNRChLRVlTUEFDRSwgQ0Y0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRDRk1EKEtFWVNQQUNFLCBDT1JSVVBUX0NGKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRDRk1EKEtFWVNQQUNFLCBDT1JSVVBUX0NGMiksCisgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJDRk1EKEtFWVNQQUNFLCBDT1VOVEVSX0NGKS5jb21wcmVzc2lvbihjb21wcmVzc2lvblBhcmFtZXRlcnMpLAorICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQ0ZNRChLRVlTUEFDRSwgQ09VTlRFUl9DRjIpLmNvbXByZXNzaW9uKGNvbXByZXNzaW9uUGFyYW1ldGVycyksCisgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJDRk1EKEtFWVNQQUNFLCBDT1VOVEVSX0NGMyksCisgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJDRk1EKEtFWVNQQUNFLCBDT1VOVEVSX0NGNCksCisgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJDRk1EKEtFWVNQQUNFLCBDT1JSVVBUQ09VTlRFUl9DRiksCisgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJDRk1EKEtFWVNQQUNFLCBDT1JSVVBUQ09VTlRFUl9DRjIpLAorICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZENGTUQoS0VZU1BBQ0UsIENGX1VVSUQsIDAsIFVVSURUeXBlLmluc3RhbmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRDRk1EKEtFWVNQQUNFLCBCRl9BTFdBWVNfUFJFU0VOVCkuYmxvb21GaWx0ZXJGcENoYW5jZSgxLjApKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeUNvcnJlY3QoKQorICAgIHsKKyAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisgICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGKTsKKworICAgICAgICBmaWxsQ0YoY2ZzLCAyKTsKKworICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisKKyAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlDb3VudGVyQ29ycmVjdCgpCisgICAgeworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09VTlRFUl9DRik7CisKKyAgICAgICAgZmlsbENvdW50ZXJDRihjZnMsIDIpOworCisgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbmRlZFZlcmlmeUNvcnJlY3QoKQorICAgIHsKKyAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisgICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGMik7CisKKyAgICAgICAgZmlsbENGKGNmcywgMik7CisKKyAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICB0cnkgKElWZXJpZmllciB2ZXJpZmllciA9IHNzdGFibGUuZ2V0VmVyaWZpZXIoY2ZzLCBuZXcgT3V0cHV0SGFuZGxlci5Mb2dPdXRwdXQoKSwgZmFsc2UsIElWZXJpZmllci5vcHRpb25zKCkuaW52b2tlRGlza0ZhaWx1cmVQb2xpY3kodHJ1ZSkuYnVpbGQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBlcnIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4dGVuZGVkVmVyaWZ5Q291bnRlckNvcnJlY3QoKQorICAgIHsKKyAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisgICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENPVU5URVJfQ0YyKTsKKworICAgICAgICBmaWxsQ291bnRlckNGKGNmcywgMik7CisKKyAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOworCisgICAgICAgIHRyeSAoSVZlcmlmaWVyIHZlcmlmaWVyID0gc3N0YWJsZS5nZXRWZXJpZmllcihjZnMsIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBmYWxzZSwgSVZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5leHRlbmRlZFZlcmlmaWNhdGlvbih0cnVlKS5idWlsZCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGVycikKKyAgICAgICAgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5Q29ycmVjdFVuY29tcHJlc3NlZCgpCisgICAgeworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YzKTsKKworICAgICAgICBmaWxsQ0YoY2ZzLCAyKTsKKworICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisKKyAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlDb3VudGVyQ29ycmVjdFVuY29tcHJlc3NlZCgpCisgICAgeworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09VTlRFUl9DRjMpOworCisgICAgICAgIGZpbGxDb3VudGVyQ0YoY2ZzLCAyKTsKKworICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisKKyAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbmRlZFZlcmlmeUNvcnJlY3RVbmNvbXByZXNzZWQoKQorICAgIHsKKyAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisgICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGNCk7CisKKyAgICAgICAgZmlsbENGKGNmcywgMik7CisKKyAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOworCisgICAgICAgIHRyeSAoSVZlcmlmaWVyIHZlcmlmaWVyID0gc3N0YWJsZS5nZXRWZXJpZmllcihjZnMsIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBmYWxzZSwgSVZlcmlmaWVyLm9wdGlvbnMoKS5leHRlbmRlZFZlcmlmaWNhdGlvbih0cnVlKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5idWlsZCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGVycikKKyAgICAgICAgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5kZWRWZXJpZnlDb3VudGVyQ29ycmVjdFVuY29tcHJlc3NlZCgpCisgICAgeworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09VTlRFUl9DRjQpOworCisgICAgICAgIGZpbGxDb3VudGVyQ0YoY2ZzLCAyKTsKKworICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisKKyAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmV4dGVuZGVkVmVyaWZpY2F0aW9uKHRydWUpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeUluY29ycmVjdERpZ2VzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3JpdGVUaW1lb3V0RXhjZXB0aW9uCisgICAgeworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09SUlVQVF9DRik7CisKKyAgICAgICAgZmlsbENGKGNmcywgMik7CisKKyAgICAgICAgVXRpbC5nZXRBbGwoVXRpbC5jbWQoY2ZzKS5idWlsZCgpKTsKKworICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisKKworICAgICAgICB0cnkgKFJhbmRvbUFjY2Vzc1JlYWRlciBmaWxlID0gUmFuZG9tQWNjZXNzUmVhZGVyLm9wZW4oc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5ESUdFU1QpKSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBjb3JyZWN0Q2hlY2tzdW0gPSBmaWxlLnJlYWRMb25nKCk7CisKKyAgICAgICAgICAgIHdyaXRlQ2hlY2tzdW0oKytjb3JyZWN0Q2hlY2tzdW0sIHNzdGFibGUuZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuRElHRVNUKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgKElWZXJpZmllciB2ZXJpZmllciA9IHNzdGFibGUuZ2V0VmVyaWZpZXIoY2ZzLCBuZXcgT3V0cHV0SGFuZGxlci5Mb2dPdXRwdXQoKSwgZmFsc2UsIElWZXJpZmllci5vcHRpb25zKCkuaW52b2tlRGlza0ZhaWx1cmVQb2xpY3kodHJ1ZSkuYnVpbGQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiB0byBiZSB0aHJvd24iKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXhwZWN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSAoSVZlcmlmaWVyIHZlcmlmaWVyID0gc3N0YWJsZS5nZXRWZXJpZmllcihjZnMsIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBmYWxzZSwgSVZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeShmYWxzZSkuYnVpbGQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBSdW50aW1lRXhjZXB0aW9uIHRvIGJlIHRocm93biIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4cGVjdGVkKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeUNvcnJ1cHRSb3dDb3JyZWN0RGlnZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXcml0ZVRpbWVvdXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDT1JSVVBUX0NGMik7CisKKyAgICAgICAgZmlsbENGKGNmcywgMik7CisKKyAgICAgICAgVXRpbC5nZXRBbGwoVXRpbC5jbWQoY2ZzKS5idWlsZCgpKTsKKworICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisKKyAgICAgICAgLy8gb3ZlcndyaXRlIG9uZSByb3cgd2l0aCBnYXJiYWdlCisgICAgICAgIGxvbmcgcm93MFN0YXJ0ID0gc3N0YWJsZS5nZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbi5Gb3JLZXkuZ2V0KEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCIwIiksIGNmcy5nZXRQYXJ0aXRpb25lcigpKSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgIGxvbmcgcm93MVN0YXJ0ID0gc3N0YWJsZS5nZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbi5Gb3JLZXkuZ2V0KEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCIxIiksIGNmcy5nZXRQYXJ0aXRpb25lcigpKSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgIGxvbmcgc3RhcnRQb3NpdGlvbiA9IE1hdGgubWluKHJvdzBTdGFydCwgcm93MVN0YXJ0KTsKKyAgICAgICAgbG9uZyBlbmRQb3NpdGlvbiA9IE1hdGgubWF4KHJvdzBTdGFydCwgcm93MVN0YXJ0KTsKKworICAgICAgICB0cnkgKEZpbGVDaGFubmVsIGZpbGUgPSBuZXcgRmlsZShzc3RhYmxlLmdldEZpbGVuYW1lKCkpLm5ld1JlYWRXcml0ZUNoYW5uZWwoKSkgeworICAgICAgICAgICAgZmlsZS5wb3NpdGlvbihzdGFydFBvc2l0aW9uKTsKKyAgICAgICAgICAgIGZpbGUud3JpdGUoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoU3RyaW5nVXRpbHMucmVwZWF0KCd6JywgMikpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2h1bmtDYWNoZS5pbnN0YW5jZSAhPSBudWxsKQorICAgICAgICAgICAgQ2h1bmtDYWNoZS5pbnN0YW5jZS5pbnZhbGlkYXRlRmlsZShzc3RhYmxlLmdldEZpbGVuYW1lKCkpOworCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgRGlnZXN0IHRvIGhhdmUgdGhlIHJpZ2h0IENoZWNrc3VtCisgICAgICAgIHdyaXRlQ2hlY2tzdW0oc2ltcGxlRnVsbENoZWNrc3VtKHNzdGFibGUuZ2V0RmlsZW5hbWUoKSksIHNzdGFibGUuZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuRElHRVNUKSk7CisKKyAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBGaXJzdCBhIHNpbXBsZSB2ZXJpZnkgY2hlY2tpbmcgZGlnZXN0LCB3aGljaCBzaG91bGQgc3VjY2VlZAorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlcnIpOworICAgICAgICAgICAgICAgIGZhaWwoIlNpbXBsZSB2ZXJpZnkgc2hvdWxkIGhhdmUgc3VjY2VlZGVkIGFzIGRpZ2VzdCBtYXRjaGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmV4dGVuZGVkVmVyaWZpY2F0aW9uKHRydWUpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBOb3cgdHJ5IGV4dGVuZGVkIHZlcmlmeQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGEgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gdG8gYmUgdGhyb3duIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlCcm9rZW5TU1RhYmxlTWV0YWRhdGEoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdyaXRlVGltZW91dEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisgICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENPUlJVUFRfQ0YyKTsKKyAgICAgICAgY2ZzLnRydW5jYXRlQmxvY2tpbmcoKTsKKyAgICAgICAgZmlsbENGKGNmcywgMik7CisKKyAgICAgICAgVXRpbC5nZXRBbGwoVXRpbC5jbWQoY2ZzKS5idWlsZCgpKTsKKworICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisKKyAgICAgICAgRmlsZUNoYW5uZWwgZmlsZSA9IHNzdGFibGUuZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuU1RBVFMpLm5ld1JlYWRXcml0ZUNoYW5uZWwoKTsKKyAgICAgICAgZmlsZS5wb3NpdGlvbigwKTsKKyAgICAgICAgZmlsZS53cml0ZShCeXRlQnVmZmVyVXRpbC5ieXRlcyhTdHJpbmdVdGlscy5yZXBlYXQoJ3onLCAyKSkpOworICAgICAgICBmaWxlLmNsb3NlKCk7CisgICAgICAgIHRyeSAoSVZlcmlmaWVyIHZlcmlmaWVyID0gc3N0YWJsZS5nZXRWZXJpZmllcihjZnMsIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBmYWxzZSwgSVZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5idWlsZCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIHRvIGJlIHRocm93biIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBleHBlY3RlZCkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIHRyeSAoSVZlcmlmaWVyIHZlcmlmaWVyID0gc3N0YWJsZS5nZXRWZXJpZmllcihjZnMsIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBmYWxzZSwgSVZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeShmYWxzZSkuYnVpbGQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBSdW50aW1lRXhjZXB0aW9uIHRvIGJlIHRocm93biIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiB1bmV4cGVjdGVkKQorICAgICAgICB7CisgICAgICAgICAgICBmYWlsKCJ3cm9uZyBleGNlcHRpb24gdGhyb3duIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXhwZWN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeU11dGF0ZVJlcGFpclN0YXR1cygpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3JpdGVUaW1lb3V0RXhjZXB0aW9uCisgICAgeworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09SUlVQVF9DRjIpOworICAgICAgICBjZnMudHJ1bmNhdGVCbG9ja2luZygpOworICAgICAgICBmaWxsQ0YoY2ZzLCAyKTsKKworICAgICAgICBVdGlsLmdldEFsbChVdGlsLmNtZChjZnMpLmJ1aWxkKCkpOworCisgICAgICAgIC8vIG1ha2UgdGhlIHNzdGFibGUgcmVwYWlyZWQ6CisgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgc3N0YWJsZS5kZXNjcmlwdG9yLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLm11dGF0ZVJlcGFpck1ldGFkYXRhKHNzdGFibGUuZGVzY3JpcHRvciwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksIHNzdGFibGUuZ2V0UGVuZGluZ1JlcGFpcigpLCBzc3RhYmxlLmlzVHJhbnNpZW50KCkpOworICAgICAgICBzc3RhYmxlLnJlbG9hZFNTVGFibGVNZXRhZGF0YSgpOworCisgICAgICAgIC8vIGJyZWFrIHRoZSBzc3RhYmxlOgorICAgICAgICBsb25nIGNvcnJlY3RDaGVja3N1bTsKKyAgICAgICAgdHJ5IChSYW5kb21BY2Nlc3NSZWFkZXIgZmlsZSA9IFJhbmRvbUFjY2Vzc1JlYWRlci5vcGVuKHNzdGFibGUuZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuRElHRVNUKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvcnJlY3RDaGVja3N1bSA9IGZpbGUucmVhZExvbmcoKTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZUNoZWNrc3VtKCsrY29ycmVjdENoZWNrc3VtLCBzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRJR0VTVCkpOworICAgICAgICB0cnkgKElWZXJpZmllciB2ZXJpZmllciA9IHNzdGFibGUuZ2V0VmVyaWZpZXIoY2ZzLCBuZXcgT3V0cHV0SGFuZGxlci5Mb2dPdXRwdXQoKSwgZmFsc2UsIElWZXJpZmllci5vcHRpb25zKCkubXV0YXRlUmVwYWlyU3RhdHVzKGZhbHNlKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5idWlsZCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIHRvIGJlIHRocm93biIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBleHBlY3RlZCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShzc3RhYmxlLmlzUmVwYWlyZWQoKSk7CisKKyAgICAgICAgLy8gbm93IHRoZSByZXBhaXIgc3RhdHVzIHNob3VsZCBiZSBjaGFuZ2VkOgorICAgICAgICB0cnkgKElWZXJpZmllciB2ZXJpZmllciA9IHNzdGFibGUuZ2V0VmVyaWZpZXIoY2ZzLCBuZXcgT3V0cHV0SGFuZGxlci5Mb2dPdXRwdXQoKSwgZmFsc2UsIElWZXJpZmllci5vcHRpb25zKCkubXV0YXRlUmVwYWlyU3RhdHVzKHRydWUpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGEgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gdG8gYmUgdGhyb3duIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGV4cGVjdGVkKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RmFsc2Uoc3N0YWJsZS5pc1JlcGFpcmVkKCkpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gUnVudGltZUV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3V0T2ZSYW5nZVRva2VucygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YpOworICAgICAgICBmaWxsQ0YoY2ZzLCAxMDApOworICAgICAgICBUb2tlbk1ldGFkYXRhIHRtZCA9IFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmdldFRva2VuTWV0YWRhdGEoKTsKKyAgICAgICAgYnl0ZVtdIHRrMSA9IG5ldyBieXRlWzFdLCB0azIgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgdGsxWzBdID0gMjsKKyAgICAgICAgdGsyWzBdID0gMTsKKyAgICAgICAgdG1kLnVwZGF0ZU5vcm1hbFRva2VuKG5ldyBCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLkJ5dGVzVG9rZW4odGsxKSwgSW5ldEFkZHJlc3NBbmRQb3J0LmdldEJ5TmFtZSgiMTI3LjAuMC4xIikpOworICAgICAgICB0bWQudXBkYXRlTm9ybWFsVG9rZW4obmV3IEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuQnl0ZXNUb2tlbih0azIpLCBJbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlOYW1lKCIxMjcuMC4wLjIiKSk7CisKKyAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICB0cnkgKElWZXJpZmllciB2ZXJpZmllciA9IHNzdGFibGUuZ2V0VmVyaWZpZXIoY2ZzLCBuZXcgT3V0cHV0SGFuZGxlci5Mb2dPdXRwdXQoKSwgZmFsc2UsIElWZXJpZmllci5vcHRpb25zKCkuY2hlY2tPd25zVG9rZW5zKHRydWUpLmV4dGVuZGVkVmVyaWZpY2F0aW9uKHRydWUpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmdldFRva2VuTWV0YWRhdGEoKS5jbGVhclVuc2FmZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXV0YXRlUmVwYWlyKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09SUlVQVF9DRjIpOworCisgICAgICAgIGZpbGxDRihjZnMsIDIpOworCisgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgc3N0YWJsZS5kZXNjcmlwdG9yLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLm11dGF0ZVJlcGFpck1ldGFkYXRhKHNzdGFibGUuZGVzY3JpcHRvciwgMSwgc3N0YWJsZS5nZXRQZW5kaW5nUmVwYWlyKCksIHNzdGFibGUuaXNUcmFuc2llbnQoKSk7CisgICAgICAgIHNzdGFibGUucmVsb2FkU1NUYWJsZU1ldGFkYXRhKCk7CisgICAgICAgIGNmcy5nZXRUcmFja2VyKCkubm90aWZ5U1NUYWJsZVJlcGFpcmVkU3RhdHVzQ2hhbmdlZChDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3N0YWJsZSkpOworICAgICAgICBhc3NlcnRUcnVlKHNzdGFibGUuaXNSZXBhaXJlZCgpKTsKKyAgICAgICAgY2ZzLmZvcmNlTWFqb3JDb21wYWN0aW9uKCk7CisKKyAgICAgICAgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgbG9uZyBjb3JyZWN0Q2hlY2tzdW07CisgICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzUmVhZGVyIGZpbGUgPSBSYW5kb21BY2Nlc3NSZWFkZXIub3Blbihzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRJR0VTVCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjb3JyZWN0Q2hlY2tzdW0gPSBmaWxlLnJlYWRMb25nKCk7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVDaGVja3N1bSgrK2NvcnJlY3RDaGVja3N1bSwgc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5ESUdFU1QpKTsKKyAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLm11dGF0ZVJlcGFpclN0YXR1cyh0cnVlKS5idWlsZCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgYmUgY29ycnVwdCIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBleHBlY3RlZCkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIGFzc2VydEZhbHNlKHNzdGFibGUuaXNSZXBhaXJlZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlJbmRleCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKEJpZ0Zvcm1hdC5pc1NlbGVjdGVkKCkpCisgICAgICAgICAgICB0ZXN0QnJva2VuQ29tcG9uZW50SGVscGVyKEJpZ0Zvcm1hdC5Db21wb25lbnRzLlBSSU1BUllfSU5ERVgpOworICAgICAgICBlbHNlIGlmIChCdGlGb3JtYXQuaXNTZWxlY3RlZCgpKQorICAgICAgICAgICAgdGVzdEJyb2tlbkNvbXBvbmVudEhlbHBlcihCdGlGb3JtYXQuQ29tcG9uZW50cy5QQVJUSVRJT05fSU5ERVgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBVdGlsLnRlc3RNdXN0QmVJbXBsZW1lbnRlZEZvclNTVGFibGVGb3JtYXQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlCZigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkuZ2V0UmVhZGVyRmFjdG9yeSgpLmdldFJlYWRlckNsYXNzKCkpKTsKKyAgICAgICAgdGVzdEJyb2tlbkNvbXBvbmVudEhlbHBlcihDb21wb25lbnRzLkZJTFRFUik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5SW5kZXhTdW1tYXJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShCaWdGb3JtYXQuaXNTZWxlY3RlZCgpKTsKKyAgICAgICAgdGVzdEJyb2tlbkNvbXBvbmVudEhlbHBlcihDb21wb25lbnRzLlNVTU1BUlkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0QnJva2VuQ29tcG9uZW50SGVscGVyKENvbXBvbmVudCBjb21wb25lbnRUb0JyZWFrKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDT1JSVVBUX0NGMik7CisKKyAgICAgICAgZmlsbENGKGNmcywgMik7CisKKyAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICB0cnkgKElWZXJpZmllciB2ZXJpZmllciA9IHNzdGFibGUuZ2V0VmVyaWZpZXIoY2ZzLCBuZXcgT3V0cHV0SGFuZGxlci5Mb2dPdXRwdXQoKSwgZmFsc2UsIElWZXJpZmllci5vcHRpb25zKCkuYnVpbGQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOyAvL3N0aWxsIG5vdCBjb3JydXB0LCBzaG91bGQgcGFzcworICAgICAgICB9CisgICAgICAgIHRyeSAoRmlsZUNoYW5uZWwgZmlsZUNoYW5uZWwgPSBzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZUZvcihjb21wb25lbnRUb0JyZWFrKS5uZXdSZWFkV3JpdGVDaGFubmVsKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbGVDaGFubmVsLnRydW5jYXRlKDMpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBleGNlcHRpb24iKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVpY2soKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDT1JSVVBUX0NGKTsKKworICAgICAgICBmaWxsQ0YoY2ZzLCAyKTsKKworICAgICAgICBVdGlsLmdldEFsbChVdGlsLmNtZChjZnMpLmJ1aWxkKCkpOworCisgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKKworCisgICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzUmVhZGVyIGZpbGUgPSBSYW5kb21BY2Nlc3NSZWFkZXIub3Blbihzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRJR0VTVCkpKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGNvcnJlY3RDaGVja3N1bSA9IGZpbGUucmVhZExvbmcoKTsKKworICAgICAgICAgICAgd3JpdGVDaGVja3N1bSgrK2NvcnJlY3RDaGVja3N1bSwgc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5ESUdFU1QpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSAoSVZlcmlmaWVyIHZlcmlmaWVyID0gc3N0YWJsZS5nZXRWZXJpZmllcihjZnMsIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBmYWxzZSwgSVZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5idWlsZCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIHRvIGJlIHRocm93biIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBleHBlY3RlZCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLnF1aWNrKHRydWUpLmJ1aWxkKCkpKSAvLyB3aXRoIHF1aWNrID0gdHJ1ZSB3ZSBkb24ndCB2ZXJpZnkgdGhlIGRpZ2VzdAorICAgICAgICB7CisgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSAoSVZlcmlmaWVyIHZlcmlmaWVyID0gc3N0YWJsZS5nZXRWZXJpZmllcihjZnMsIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBmYWxzZSwgSVZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5idWlsZCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIFJ1bnRpbWVFeGNlcHRpb24gdG8gYmUgdGhyb3duIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGV4cGVjdGVkKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSYW5nZU93bkhlbHBlcigpCisgICAgeworICAgICAgICBMaXN0PFJhbmdlPFRva2VuPj4gbm9ybWFsaXplZCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBub3JtYWxpemVkLmFkZChyKExvbmcuTUlOX1ZBTFVFLCBMb25nLk1JTl9WQUxVRSArIDEpKTsKKyAgICAgICAgbm9ybWFsaXplZC5hZGQocihMb25nLk1JTl9WQUxVRSArIDUsIExvbmcuTUlOX1ZBTFVFICsgNikpOworICAgICAgICBub3JtYWxpemVkLmFkZChyKExvbmcuTUlOX1ZBTFVFICsgMTAsIExvbmcuTUlOX1ZBTFVFICsgMTEpKTsKKyAgICAgICAgbm9ybWFsaXplZC5hZGQocigwLCAxMCkpOworICAgICAgICBub3JtYWxpemVkLmFkZChyKDEwLCAxMSkpOworICAgICAgICBub3JtYWxpemVkLmFkZChyKDIwLCAyNSkpOworICAgICAgICBub3JtYWxpemVkLmFkZChyKDI2LCAyMDApKTsKKworICAgICAgICBSYW5nZU93bkhlbHBlciByb2ggPSBuZXcgUmFuZ2VPd25IZWxwZXIobm9ybWFsaXplZCk7CisKKyAgICAgICAgcm9oLnZhbGlkYXRlKGRrKDEpKTsKKyAgICAgICAgcm9oLnZhbGlkYXRlKGRrKDEwKSk7CisgICAgICAgIHJvaC52YWxpZGF0ZShkaygxMSkpOworICAgICAgICByb2gudmFsaWRhdGUoZGsoMjEpKTsKKyAgICAgICAgcm9oLnZhbGlkYXRlKGRrKDI1KSk7CisgICAgICAgIGJvb2xlYW4gZ290RXhjZXB0aW9uID0gZmFsc2U7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByb2gudmFsaWRhdGUoZGsoMjYpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdEV4Y2VwdGlvbiA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShnb3RFeGNlcHRpb24pOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gQXNzZXJ0aW9uRXJyb3IuY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdFJhbmdlT3duSGVscGVyQmFkVG9rZW4oKQorICAgIHsKKyAgICAgICAgTGlzdDxSYW5nZTxUb2tlbj4+IG5vcm1hbGl6ZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgbm9ybWFsaXplZC5hZGQocigwLCAxMCkpOworICAgICAgICBSYW5nZU93bkhlbHBlciByb2ggPSBuZXcgUmFuZ2VPd25IZWxwZXIobm9ybWFsaXplZCk7CisgICAgICAgIHJvaC52YWxpZGF0ZShkaygxKSk7CisgICAgICAgIC8vIGNhbGwgd2l0aCBzbWFsbGVyIHRva2VuIHRvIGdldCBleGNlcHRpb24KKyAgICAgICAgcm9oLnZhbGlkYXRlKGRrKDApKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJhbmdlT3duSGVscGVyTm9ybWFsaXplKCkKKyAgICB7CisgICAgICAgIExpc3Q8UmFuZ2U8VG9rZW4+PiBub3JtYWxpemVkID0gUmFuZ2Uubm9ybWFsaXplKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocigwLCAwKSkpOworICAgICAgICBSYW5nZU93bkhlbHBlciByb2ggPSBuZXcgUmFuZ2VPd25IZWxwZXIobm9ybWFsaXplZCk7CisgICAgICAgIHJvaC52YWxpZGF0ZShkayhMb25nLk1JTl9WQUxVRSkpOworICAgICAgICByb2gudmFsaWRhdGUoZGsoMCkpOworICAgICAgICByb2gudmFsaWRhdGUoZGsoTG9uZy5NQVhfVkFMVUUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSYW5nZU93bkhlbHBlck5vcm1hbGl6ZVdyYXAoKQorICAgIHsKKyAgICAgICAgTGlzdDxSYW5nZTxUb2tlbj4+IG5vcm1hbGl6ZWQgPSBSYW5nZS5ub3JtYWxpemUoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChyKExvbmcuTUFYX1ZBTFVFIC0gMTAwMCwgTG9uZy5NSU5fVkFMVUUgKyAxMDAwKSkpOworICAgICAgICBSYW5nZU93bkhlbHBlciByb2ggPSBuZXcgUmFuZ2VPd25IZWxwZXIobm9ybWFsaXplZCk7CisgICAgICAgIHJvaC52YWxpZGF0ZShkayhMb25nLk1JTl9WQUxVRSkpOworICAgICAgICByb2gudmFsaWRhdGUoZGsoTG9uZy5NQVhfVkFMVUUpKTsKKyAgICAgICAgYm9vbGVhbiBnb3RFeGNlcHRpb24gPSBmYWxzZTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJvaC52YWxpZGF0ZShkaygyNikpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKKyAgICAgICAgeworICAgICAgICAgICAgZ290RXhjZXB0aW9uID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKGdvdEV4Y2VwdGlvbik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlSYW5nZXMoKQorICAgIHsKKyAgICAgICAgbmV3IFJhbmdlT3duSGVscGVyKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKS52YWxpZGF0ZShkaygxKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5TG9jYWxQYXJ0aXRpb25lcigpIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgVG9rZW5NZXRhZGF0YSB0bWQgPSBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5nZXRUb2tlbk1ldGFkYXRhKCk7CisgICAgICAgIGJ5dGVbXSB0azEgPSBuZXcgYnl0ZVsxXSwgdGsyID0gbmV3IGJ5dGVbMV07CisgICAgICAgIHRrMVswXSA9IDI7CisgICAgICAgIHRrMlswXSA9IDE7CisgICAgICAgIHRtZC51cGRhdGVOb3JtYWxUb2tlbihuZXcgQnl0ZU9yZGVyZWRQYXJ0aXRpb25lci5CeXRlc1Rva2VuKHRrMSksIEluZXRBZGRyZXNzQW5kUG9ydC5nZXRCeU5hbWUoIjEyNy4wLjAuMSIpKTsKKyAgICAgICAgdG1kLnVwZGF0ZU5vcm1hbFRva2VuKG5ldyBCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLkJ5dGVzVG9rZW4odGsyKSwgSW5ldEFkZHJlc3NBbmRQb3J0LmdldEJ5TmFtZSgiMTI3LjAuMC4yIikpOworICAgICAgICAvLyB3cml0ZSBzb21lIGJvZ3VzIHRvIGEgbG9jYWxwYXJ0aXRpb25lciB0YWJsZQorICAgICAgICBCYXRjaCBib2d1cyA9IEJhdGNoLmNyZWF0ZUxvY2FsKG5leHRUaW1lVVVJRCgpLCAwLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7CisgICAgICAgIEJhdGNobG9nTWFuYWdlci5zdG9yZShib2d1cyk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oInN5c3RlbSIpLmdldENvbHVtbkZhbWlseVN0b3JlKCJiYXRjaGVzIik7CisgICAgICAgIFV0aWwuZmx1c2goY2ZzKTsKKyAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpCisgICAgICAgIHsKKworICAgICAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmNoZWNrT3duc1Rva2Vucyh0cnVlKS5idWlsZCgpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vRmlsdGVyRmlsZSgpCisgICAgeworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQkZfQUxXQVlTX1BSRVNFTlQpOworICAgICAgICBmaWxsQ0YoY2ZzLCAxMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4wLCBjZnMubWV0YWRhdGEoKS5wYXJhbXMuYmxvb21GaWx0ZXJGcENoYW5jZSwgMC4wKTsKKyAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGUgZiA9IHNzdGFibGUuZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuRklMVEVSKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGYuZXhpc3RzKCkpOworICAgICAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmJ1aWxkKCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBwcml2YXRlIERlY29yYXRlZEtleSBkayhsb25nIGwpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlckRlY29yYXRlZEtleSh0KGwpLCBCeXRlQnVmZmVyVXRpbC5FTVBUWV9CWVRFX0JVRkZFUik7CisgICAgfQorCisgICAgcHJpdmF0ZSBSYW5nZTxUb2tlbj4gcihsb25nIHMsIGxvbmcgZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgUmFuZ2U8Pih0KHMpLCB0KGUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFRva2VuIHQobG9uZyB0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNdXJtdXIzUGFydGl0aW9uZXIuTG9uZ1Rva2VuKHQpOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIHZvaWQgZmlsbENGKENvbHVtbkZhbWlseVN0b3JlIGNmcywgaW50IHBhcnRpdGlvbnNQZXJTU1RhYmxlKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aXRpb25zUGVyU1NUYWJsZTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBVcGRhdGVCdWlsZGVyLmNyZWF0ZShjZnMubWV0YWRhdGEoKSwgU3RyaW5nLnZhbHVlT2YoaSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLm5ld1JvdygiYzEiKS5hZGQoInZhbCIsICIxIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAubmV3Um93KCJjMiIpLmFkZCgidmFsIiwgIjIiKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBseSgpOworICAgICAgICB9CisKKyAgICAgICAgVXRpbC5mbHVzaChjZnMpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGZpbGxDb3VudGVyQ0YoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBpbnQgcGFydGl0aW9uc1BlclNTVGFibGUpIHRocm93cyBXcml0ZVRpbWVvdXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydGl0aW9uc1BlclNTVGFibGU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgVXBkYXRlQnVpbGRlci5jcmVhdGUoY2ZzLm1ldGFkYXRhKCksIFN0cmluZy52YWx1ZU9mKGkpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXdSb3coImMxIikuYWRkKCJ2YWwiLCAxMDBMKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBseSgpOworICAgICAgICB9CisKKyAgICAgICAgVXRpbC5mbHVzaChjZnMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBsb25nIHNpbXBsZUZ1bGxDaGVja3N1bShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW1QbHVzIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbVBsdXMoZmlsZW5hbWUpOworICAgICAgICAgICAgIENoZWNrZWRJbnB1dFN0cmVhbSBjaW5TdHJlYW0gPSBuZXcgQ2hlY2tlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBuZXcgQ1JDMzIoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbMTI4XTsKKyAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIFN0YXRlbWVudFdpdGhFbXB0eUJvZHkKKyAgICAgICAgICAgIHdoaWxlIChjaW5TdHJlYW0ucmVhZChiKSA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNpblN0cmVhbS5nZXRDaGVja3N1bSgpLmdldFZhbHVlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVDaGVja3N1bShsb25nIGNoZWNrc3VtLCBGaWxlIGZpbGUpCisgICAgeworICAgICAgICBCdWZmZXJlZFdyaXRlciBvdXQgPSBudWxsOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0ID0gRmlsZXMubmV3QnVmZmVyZWRXcml0ZXIoZmlsZS50b1BhdGgoKSwgQ2hhcnNldHMuVVRGXzgpOworICAgICAgICAgICAgb3V0LndyaXRlKFN0cmluZy52YWx1ZU9mKGNoZWNrc3VtKSk7CisgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRlNXcml0ZUVycm9yKGUsIGZpbGUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlUXVpZXRseShvdXQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZmlsdGVyL0Jsb29tRmlsdGVyVHJhY2tlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2ZpbHRlci9CbG9vbUZpbHRlclRyYWNrZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M5NTQ1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2ZpbHRlci9CbG9vbUZpbHRlclRyYWNrZXJUZXN0LmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZpbHRlcjsKKworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBCbG9vbUZpbHRlclRyYWNrZXJUZXN0Cit7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkaW5nRmFsc2VQb3NpdGl2ZXMoKQorICAgIHsKKyAgICAgICAgQmxvb21GaWx0ZXJUcmFja2VyIGJmdCA9IG5ldyBCbG9vbUZpbHRlclRyYWNrZXIoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDBMLCBiZnQuZ2V0RmFsc2VQb3NpdGl2ZUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMEwsIGJmdC5nZXRSZWNlbnRGYWxzZVBvc2l0aXZlQ291bnQoKSk7CisgICAgICAgIGJmdC5hZGRGYWxzZVBvc2l0aXZlKCk7CisgICAgICAgIGJmdC5hZGRGYWxzZVBvc2l0aXZlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyTCwgYmZ0LmdldEZhbHNlUG9zaXRpdmVDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDJMLCBiZnQuZ2V0UmVjZW50RmFsc2VQb3NpdGl2ZUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMEwsIGJmdC5nZXRSZWNlbnRGYWxzZVBvc2l0aXZlQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyTCwgYmZ0LmdldEZhbHNlUG9zaXRpdmVDb3VudCgpKTsgLy8gc2FuaXR5IGNoZWNrCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkaW5nVHJ1ZVBvc2l0aXZlcygpCisgICAgeworICAgICAgICBCbG9vbUZpbHRlclRyYWNrZXIgYmZ0ID0gbmV3IEJsb29tRmlsdGVyVHJhY2tlcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoMEwsIGJmdC5nZXRUcnVlUG9zaXRpdmVDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDBMLCBiZnQuZ2V0UmVjZW50VHJ1ZVBvc2l0aXZlQ291bnQoKSk7CisgICAgICAgIGJmdC5hZGRUcnVlUG9zaXRpdmUoKTsKKyAgICAgICAgYmZ0LmFkZFRydWVQb3NpdGl2ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMkwsIGJmdC5nZXRUcnVlUG9zaXRpdmVDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDJMLCBiZnQuZ2V0UmVjZW50VHJ1ZVBvc2l0aXZlQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwTCwgYmZ0LmdldFJlY2VudFRydWVQb3NpdGl2ZUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMkwsIGJmdC5nZXRUcnVlUG9zaXRpdmVDb3VudCgpKTsgLy8gc2FuaXR5IGNoZWNrCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkaW5nVG9PbmVMZWF2ZXNUaGVPdGhlckFsb25lKCkKKyAgICB7CisgICAgICAgIEJsb29tRmlsdGVyVHJhY2tlciBiZnQgPSBuZXcgQmxvb21GaWx0ZXJUcmFja2VyKCk7CisgICAgICAgIGJmdC5hZGRGYWxzZVBvc2l0aXZlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwTCwgYmZ0LmdldFRydWVQb3NpdGl2ZUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMEwsIGJmdC5nZXRSZWNlbnRUcnVlUG9zaXRpdmVDb3VudCgpKTsKKyAgICAgICAgYmZ0LmFkZFRydWVQb3NpdGl2ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMUwsIGJmdC5nZXRGYWxzZVBvc2l0aXZlQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxTCwgYmZ0LmdldFJlY2VudEZhbHNlUG9zaXRpdmVDb3VudCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvQWJzdHJhY3RUZXN0VmVyc2lvblN1cHBvcnRlZEZlYXR1cmVzLmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvQWJzdHJhY3RUZXN0VmVyc2lvblN1cHBvcnRlZEZlYXR1cmVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjNGMwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9BYnN0cmFjdFRlc3RWZXJzaW9uU3VwcG9ydGVkRmVhdHVyZXMuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5JbnRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRlc3RWZXJzaW9uU3VwcG9ydGVkRmVhdHVyZXMKK3sKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBBTExfVkVSU0lPTlMgPSBJbnRTdHJlYW0ucmFuZ2VDbG9zZWQoJ2EnLCAneicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcFRvT2JqKGkgLT4gU3RyaW5nLnZhbHVlT2YoKGNoYXIpIGkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mbGF0TWFwKGZpcnN0IC0+IEludFN0cmVhbS5yYW5nZUNsb3NlZCgnYScsICd6JykubWFwVG9PYmooc2Vjb25kIC0+IGZpcnN0ICsgKGNoYXIpIHNlY29uZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVmVyc2lvbiBnZXRWZXJzaW9uKFN0cmluZyB2KTsKKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJlYW08U3RyaW5nPiBnZXRQZW5kaW5nUmVwYWlyU3VwcG9ydGVkVmVyc2lvbnMoKTsKKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJlYW08U3RyaW5nPiBnZXRQYXJ0aXRpb25MZXZlbERlbGV0aW9uUHJlc2VuY2VNYXJrZXJTdXBwb3J0ZWRWZXJzaW9ucygpOworCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmVhbTxTdHJpbmc+IGdldExlZ2FjeU1pbk1heFN1cHBvcnRlZFZlcnNpb25zKCk7CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyZWFtPFN0cmluZz4gZ2V0SW1wcm92ZWRNaW5NYXhTdXBwb3J0ZWRWZXJzaW9ucygpOworCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmVhbTxTdHJpbmc+IGdldEtleVJhbmdlU3VwcG9ydGVkVmVyc2lvbnMoKTsKKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJlYW08U3RyaW5nPiBnZXRPcmlnaW5hdGluZ0hvc3RJZFN1cHBvcnRlZFZlcnNpb25zKCk7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdEREKCkKKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbXBhdGliaWxpdHkoKQorICAgIHsKKyAgICAgICAgY2hlY2tQcmVkaWNhdGVBZ2FpbnN0VmVyc2lvbnMoVmVyc2lvbjo6aGFzUGVuZGluZ1JlcGFpciwgZ2V0UGVuZGluZ1JlcGFpclN1cHBvcnRlZFZlcnNpb25zKCkpOworICAgICAgICBjaGVja1ByZWRpY2F0ZUFnYWluc3RWZXJzaW9ucyhWZXJzaW9uOjpoYXNJbXByb3ZlZE1pbk1heCwgZ2V0SW1wcm92ZWRNaW5NYXhTdXBwb3J0ZWRWZXJzaW9ucygpKTsKKyAgICAgICAgY2hlY2tQcmVkaWNhdGVBZ2FpbnN0VmVyc2lvbnMoVmVyc2lvbjo6aGFzTGVnYWN5TWluTWF4LCBnZXRMZWdhY3lNaW5NYXhTdXBwb3J0ZWRWZXJzaW9ucygpKTsKKyAgICAgICAgY2hlY2tQcmVkaWNhdGVBZ2FpbnN0VmVyc2lvbnMoVmVyc2lvbjo6aGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnNQcmVzZW5jZU1hcmtlciwgZ2V0UGFydGl0aW9uTGV2ZWxEZWxldGlvblByZXNlbmNlTWFya2VyU3VwcG9ydGVkVmVyc2lvbnMoKSk7CisgICAgICAgIGNoZWNrUHJlZGljYXRlQWdhaW5zdFZlcnNpb25zKFZlcnNpb246Omhhc0tleVJhbmdlLCBnZXRLZXlSYW5nZVN1cHBvcnRlZFZlcnNpb25zKCkpOworICAgICAgICBjaGVja1ByZWRpY2F0ZUFnYWluc3RWZXJzaW9ucyhWZXJzaW9uOjpoYXNPcmlnaW5hdGluZ0hvc3RJZCwgZ2V0T3JpZ2luYXRpbmdIb3N0SWRTdXBwb3J0ZWRWZXJzaW9ucygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmVhbTxTdHJpbmc+IHJhbmdlKFN0cmluZyBmcm9tSW5jbCwgU3RyaW5nIHRvSW5jbCkKKyAgICB7CisgICAgICAgIGludCBmcm9tSWR4ID0gQUxMX1ZFUlNJT05TLmluZGV4T2YoZnJvbUluY2wpOworICAgICAgICBpbnQgdG9JZHggPSBBTExfVkVSU0lPTlMuaW5kZXhPZih0b0luY2wpOworICAgICAgICBhc3NlcnQgZnJvbUlkeCA+PSAwICYmIHRvSWR4ID49IDA7CisgICAgICAgIHJldHVybiBBTExfVkVSU0lPTlMuc3ViTGlzdChmcm9tSWR4LCB0b0lkeCArIDEpLnN0cmVhbSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSB2ZXJzaW9uIHByZWRpY2F0ZSBhZ2FpbnN0IHRoZSBwcm92aWRlZCB2ZXJzaW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgICAgIHByZWRpY2F0ZSB0byBjaGVjayBhZ2FpbnN0IHZlcnNpb24KKyAgICAgKiBAcGFyYW0gdmVyc2lvbkJvdW5kcyBhIHN0cmVhbSBvZiB2ZXJzaW9ucyBmb3Igd2hpY2ggdGhlIHByZWRpY2F0ZSBzaG91bGQgcmV0dXJuIHRydWUKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tQcmVkaWNhdGVBZ2FpbnN0VmVyc2lvbnMoUHJlZGljYXRlPFZlcnNpb24+IHByZWRpY2F0ZSwgU3RyZWFtPFN0cmluZz4gdmVyc2lvbkJvdW5kcykKKyAgICB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IHZlcnNpb25Cb3VuZHMuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGFjdHVhbCA9IEFMTF9WRVJTSU9OUy5zdHJlYW0oKS5maWx0ZXIodiAtPiBwcmVkaWNhdGUudGVzdChnZXRWZXJzaW9uKHYpKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGFjdHVhbCkuaXNFcXVhbFRvKGV4cGVjdGVkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YjQ4YjcuLjAwMDAwMDAKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1JhbmdlQXdhcmVTU1RhYmxlV3JpdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTXVybXVyM1BhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotCi1wdWJsaWMgY2xhc3MgUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXJUZXN0Ci17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0UxID0gIktleXNwYWNlMSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfU1RBTkRBUkQgPSAiU3RhbmRhcmQxIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzOwotCi0gICAgQEJlZm9yZUNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOwotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0UGFydGl0aW9uZXJVbnNhZmUoTXVybXVyM1BhcnRpdGlvbmVyLmluc3RhbmNlKTsKLSAgICAgICAgU2NoZW1hTG9hZGVyLmNsZWFudXBBbmRMZWF2ZURpcnMoKTsKLSAgICAgICAgS2V5c3BhY2Uuc2V0SW5pdGlhbGl6ZWQoKTsKLSAgICAgICAgU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuaW5pdFNlcnZlcigpOwotCi0gICAgICAgIFNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZShLRVlTUEFDRTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGFydGl0aW9uZXIoTXVybXVyM1BhcnRpdGlvbmVyLmluc3RhbmNlKSk7Ci0KLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSk7Ci0gICAgICAgIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGX1NUQU5EQVJEKTsKLSAgICAgICAgY2ZzLmNsZWFyVW5zYWZlKCk7Ci0gICAgICAgIGNmcy5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NXcml0ZXJCZWZvcmVBcHBlbmQoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0KLSAgICAgICAgU2NoZW1hTG9hZGVyLmluc2VydERhdGEoS0VZU1BBQ0UxLCBDRl9TVEFOREFSRCwgMCwgMSk7Ci0gICAgICAgIFV0aWwuZmx1c2goY2ZzKTsKLQotICAgICAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBMaWZlY3ljbGVUcmFuc2FjdGlvbi5vZmZsaW5lKE9wZXJhdGlvblR5cGUuU1RSRUFNKTsKLQotICAgICAgICBSYW5nZUF3YXJlU1NUYWJsZVdyaXRlciB3cml0ZXIgPSBuZXcgUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXIoY2ZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlRm9ybWF0LlR5cGUuQklHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eG4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyLm1ha2UoY2ZzLm1ldGFkYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLmdldExpdmVTU1RhYmxlcygpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjZnMubWV0YWRhdGEuaWQsIHdyaXRlci5nZXRUYWJsZUlkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMEwsIHdyaXRlci5nZXRGaWxlUG9pbnRlcigpKTsKLQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU1NUYWJsZUZsdXNoT2JzZXJ2ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU1NUYWJsZUZsdXNoT2JzZXJ2ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YWFmOGUuLjAwMDAwMDAKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NTVGFibGVGbHVzaE9ic2VydmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZy5Db21taXRMb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TZXF1ZW5jZUJhc2VkU1NUYWJsZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTG9uZ1R5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNSZWFkRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNXcml0ZUVycm9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnVGFibGVXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbGxlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVEYXRhSW5wdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuQXJyYXlMaXN0TXVsdGltYXA7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aW1hcDsKLQotaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBTU1RhYmxlRmx1c2hPYnNlcnZlclRlc3QKLXsKLSAgICBAQmVmb3JlQ2xhc3MKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdEREKCkKLSAgICB7Ci0gICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOwotICAgICAgICBDb21taXRMb2cuaW5zdGFuY2Uuc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS1NfTkFNRSA9ICJ0ZXN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfTkFNRSA9ICJmbHVzaF9vYnNlcnZlciI7Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RGbHVzaE9ic2VydmVyKCkKLSAgICB7Ci0gICAgICAgIFRhYmxlTWV0YWRhdGEgY2ZtID0KLSAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEuYnVpbGRlcihLU19OQU1FLCBDRl9OQU1FKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRQYXJ0aXRpb25LZXlDb2x1bW4oImlkIiwgVVRGOFR5cGUuaW5zdGFuY2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZ3VsYXJDb2x1bW4oImZpcnN0X25hbWUiLCBVVEY4VHlwZS5pbnN0YW5jZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVndWxhckNvbHVtbigiYWdlIiwgSW50MzJUeXBlLmluc3RhbmNlKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWd1bGFyQ29sdW1uKCJoZWlnaHQiLCBMb25nVHlwZS5pbnN0YW5jZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLQotICAgICAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiA9IExpZmVjeWNsZVRyYW5zYWN0aW9uLm9mZmxpbmUoT3BlcmF0aW9uVHlwZS5DT01QQUNUSU9OKTsKLSAgICAgICAgRmx1c2hPYnNlcnZlciBvYnNlcnZlciA9IG5ldyBGbHVzaE9ic2VydmVyKCk7Ci0KLSAgICAgICAgU3RyaW5nIHNzdGFibGVEaXJlY3RvcnkgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0QWxsRGF0YUZpbGVMb2NhdGlvbnMoKVswXTsKLSAgICAgICAgRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZShzc3RhYmxlRGlyZWN0b3J5ICsgRmlsZS5wYXRoU2VwYXJhdG9yKCkgKyBLU19OQU1FICsgRmlsZS5wYXRoU2VwYXJhdG9yKCkgKyBDRl9OQU1FKTsKLSAgICAgICAgZGlyZWN0b3J5LmRlbGV0ZU9uRXhpdCgpOwotCi0gICAgICAgIGlmICghZGlyZWN0b3J5LmV4aXN0cygpICYmICFkaXJlY3RvcnkudHJ5Q3JlYXRlRGlyZWN0b3JpZXMoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBGU1dyaXRlRXJyb3IobmV3IElPRXhjZXB0aW9uKCJmYWlsZWQgdG8gY3JlYXRlIHRtcCBkaXJlY3RvcnkiKSwgZGlyZWN0b3J5LmFic29sdXRlUGF0aCgpKTsKLQotICAgICAgICBTU1RhYmxlRm9ybWF0LlR5cGUgc3N0YWJsZUZvcm1hdCA9IFNTVGFibGVGb3JtYXQuVHlwZS5jdXJyZW50KCk7Ci0gICAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBEZXNjcmlwdG9yKHNzdGFibGVGb3JtYXQuaW5mby5nZXRMYXRlc3RWZXJzaW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZtLmtleXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZm0ubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlcXVlbmNlQmFzZWRTU1RhYmxlSWQoMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGVGb3JtYXQpOwotCi0gICAgICAgIEJpZ1RhYmxlV3JpdGVyIHdyaXRlciA9IG5ldyBCaWdUYWJsZVdyaXRlcihkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTBMLCAwTCwgbnVsbCwgZmFsc2UsIFRhYmxlTWV0YWRhdGFSZWYuZm9yT2ZmbGluZVRvb2xzKGNmbSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWV0YWRhdGFDb2xsZWN0b3IoY2ZtLmNvbXBhcmF0b3IpLnNzdGFibGVMZXZlbCgwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZXJpYWxpemF0aW9uSGVhZGVyKHRydWUsIGNmbSwgY2ZtLnJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zKCksIEVuY29kaW5nU3RhdHMuTk9fU1RBVFMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChvYnNlcnZlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbik7Ci0KLSAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXIgPSBudWxsOwotICAgICAgICBNdWx0aW1hcDxCeXRlQnVmZmVyLCBDZWxsPD8+PiBleHBlY3RlZCA9IEFycmF5TGlzdE11bHRpbWFwLmNyZWF0ZSgpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0gICAgICAgICAgICBCeXRlQnVmZmVyIGtleSA9IFVURjhUeXBlLmluc3RhbmNlLmZyb21TdHJpbmcoImtleTEiKTsKLSAgICAgICAgICAgIGV4cGVjdGVkLnB1dEFsbChrZXksIEFycmF5cy5hc0xpc3QoQnVmZmVyQ2VsbC5saXZlKGdldENvbHVtbihjZm0sICJhZ2UiKSwgbm93LCBJbnQzMlR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKDI3KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckNlbGwubGl2ZShnZXRDb2x1bW4oY2ZtLCAiZmlyc3RfbmFtZSIpLCBub3csVVRGOFR5cGUuaW5zdGFuY2UuZnJvbVN0cmluZygiamFjayIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyQ2VsbC5saXZlKGdldENvbHVtbihjZm0sICJoZWlnaHQiKSwgbm93LCBMb25nVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoMTgzTCkpKSk7Ci0KLSAgICAgICAgICAgIHdyaXRlci5hcHBlbmQobmV3IFJvd0l0ZXJhdG9yKGNmbSwga2V5LmR1cGxpY2F0ZSgpLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGJ1aWxkUm93KGV4cGVjdGVkLmdldChrZXkpKSkpKTsKLQotICAgICAgICAgICAga2V5ID0gVVRGOFR5cGUuaW5zdGFuY2UuZnJvbVN0cmluZygia2V5MiIpOwotICAgICAgICAgICAgZXhwZWN0ZWQucHV0QWxsKGtleSwgQXJyYXlzLmFzTGlzdChCdWZmZXJDZWxsLmxpdmUoZ2V0Q29sdW1uKGNmbSwgImFnZSIpLCBub3csIEludDMyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoMzApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyQ2VsbC5saXZlKGdldENvbHVtbihjZm0sICJmaXJzdF9uYW1lIiksIG5vdyxVVEY4VHlwZS5pbnN0YW5jZS5mcm9tU3RyaW5nKCJqaW0iKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckNlbGwubGl2ZShnZXRDb2x1bW4oY2ZtLCAiaGVpZ2h0IiksIG5vdywgTG9uZ1R5cGUuaW5zdGFuY2UuZGVjb21wb3NlKDE4MEwpKSkpOwotCi0gICAgICAgICAgICB3cml0ZXIuYXBwZW5kKG5ldyBSb3dJdGVyYXRvcihjZm0sIGtleSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChidWlsZFJvdyhleHBlY3RlZC5nZXQoa2V5KSkpKSk7Ci0KLSAgICAgICAgICAgIGtleSA9IFVURjhUeXBlLmluc3RhbmNlLmZyb21TdHJpbmcoImtleTMiKTsKLSAgICAgICAgICAgIGV4cGVjdGVkLnB1dEFsbChrZXksIEFycmF5cy5hc0xpc3QoQnVmZmVyQ2VsbC5saXZlKGdldENvbHVtbihjZm0sICJhZ2UiKSwgbm93LCBJbnQzMlR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKDMwKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckNlbGwubGl2ZShnZXRDb2x1bW4oY2ZtLCAiZmlyc3RfbmFtZSIpLCBub3csVVRGOFR5cGUuaW5zdGFuY2UuZnJvbVN0cmluZygia2VuIikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJDZWxsLmxpdmUoZ2V0Q29sdW1uKGNmbSwgImhlaWdodCIpLCBub3csIExvbmdUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgxNzhMKSkpKTsKLQotICAgICAgICAgICAgd3JpdGVyLmFwcGVuZChuZXcgUm93SXRlcmF0b3IoY2ZtLCBrZXksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoYnVpbGRSb3coZXhwZWN0ZWQuZ2V0KGtleSkpKSkpOwotCi0gICAgICAgICAgICByZWFkZXIgPSB3cml0ZXIuZmluaXNoKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlUXVpZXRseSh3cml0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUob2JzZXJ2ZXIuaXNDb21wbGV0ZSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXhwZWN0ZWQuc2l6ZSgpLCBvYnNlcnZlci5yb3dzLnNpemUoKSk7Ci0KLSAgICAgICAgZm9yIChQYWlyPEJ5dGVCdWZmZXIsIExvbmc+IGUgOiBvYnNlcnZlci5yb3dzLmtleVNldCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBCeXRlQnVmZmVyIGtleSA9IGUubGVmdDsKLSAgICAgICAgICAgIExvbmcgaW5kZXhQb3NpdGlvbiA9IGUucmlnaHQ7Ci0KLSAgICAgICAgICAgIHRyeSAoRmlsZURhdGFJbnB1dCBpbmRleCA9IHJlYWRlci5pZmlsZS5jcmVhdGVSZWFkZXIoaW5kZXhQb3NpdGlvbikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBpbmRleEtleSA9IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoaW5kZXgpOwotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgVVRGOFR5cGUuaW5zdGFuY2UuY29tcGFyZShrZXksIGluZGV4S2V5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZTUmVhZEVycm9yKGV4LCByZWFkZXIuZ2V0SW5kZXhGaWxlbmFtZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhleHBlY3RlZC5nZXQoa2V5KSwgb2JzZXJ2ZXIucm93cy5nZXQoZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUm93SXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFVuZmlsdGVyZWRSb3dJdGVyYXRvcgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjxVbmZpbHRlcmVkPiByb3dzOwotCi0gICAgICAgIHB1YmxpYyBSb3dJdGVyYXRvcihUYWJsZU1ldGFkYXRhIGNmbSwgQnl0ZUJ1ZmZlciBrZXksIENvbGxlY3Rpb248VW5maWx0ZXJlZD4gY29udGVudCkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoY2ZtLAotICAgICAgICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldFBhcnRpdGlvbmVyKCkuZGVjb3JhdGVLZXkoa2V5KSwKLSAgICAgICAgICAgICAgICAgIERlbGV0aW9uVGltZS5MSVZFLAotICAgICAgICAgICAgICAgICAgY2ZtLnJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zKCksCi0gICAgICAgICAgICAgICAgICBCVHJlZVJvdy5lbXB0eVJvdyhDbHVzdGVyaW5nLlNUQVRJQ19DTFVTVEVSSU5HKSwKLSAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgRW5jb2RpbmdTdGF0cy5OT19TVEFUUyk7Ci0KLSAgICAgICAgICAgIHJvd3MgPSBjb250ZW50Lml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIFVuZmlsdGVyZWQgY29tcHV0ZU5leHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93cy5oYXNOZXh0KCkgPyByb3dzLm5leHQoKSA6IGVuZE9mRGF0YSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmx1c2hPYnNlcnZlciBpbXBsZW1lbnRzIFNTVGFibGVGbHVzaE9ic2VydmVyCi0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIE11bHRpbWFwPFBhaXI8Qnl0ZUJ1ZmZlciwgTG9uZz4sIENlbGw8Pz4+IHJvd3MgPSBBcnJheUxpc3RNdWx0aW1hcC5jcmVhdGUoKTsKLSAgICAgICAgcHJpdmF0ZSBQYWlyPEJ5dGVCdWZmZXIsIExvbmc+IGN1cnJlbnRLZXk7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbXBsZXRlOwotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBiZWdpbigpCi0gICAgICAgIHt9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0UGFydGl0aW9uKERlY29yYXRlZEtleSBrZXksIGxvbmcgaW5kZXhQb3NpdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudEtleSA9IFBhaXIuY3JlYXRlKGtleS5nZXRLZXkoKSwgaW5kZXhQb3NpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbmV4dFVuZmlsdGVyZWRDbHVzdGVyKFVuZmlsdGVyZWQgcm93KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocm93LmlzUm93KCkpCi0gICAgICAgICAgICAgICAgKChSb3cpIHJvdykuZm9yRWFjaCgoYykgLT4gcm93cy5wdXQoY3VycmVudEtleSwgKENlbGw8Pz4pIGMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlzQ29tcGxldGUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUm93IGJ1aWxkUm93KENvbGxlY3Rpb248Q2VsbDw/Pj4gY2VsbHMpCi0gICAgewotICAgICAgICBSb3cuQnVpbGRlciByb3dCdWlsZGVyID0gQlRyZWVSb3cuc29ydGVkQnVpbGRlcigpOwotICAgICAgICByb3dCdWlsZGVyLm5ld1JvdyhDbHVzdGVyaW5nLkVNUFRZKTsKLSAgICAgICAgY2VsbHMuZm9yRWFjaChyb3dCdWlsZGVyOjphZGRDZWxsKTsKLSAgICAgICAgcmV0dXJuIHJvd0J1aWxkZXIuYnVpbGQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDb2x1bW5NZXRhZGF0YSBnZXRDb2x1bW4oVGFibGVNZXRhZGF0YSBjZm0sIFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNmbS5nZXRDb2x1bW4oVVRGOFR5cGUuaW5zdGFuY2UuZnJvbVN0cmluZyhuYW1lKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1ZlcnNpb25BbmRUeXBlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1ZlcnNpb25BbmRUeXBlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTYyYjljLi4wMDAwMDAwCi0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9WZXJzaW9uQW5kVHlwZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnk7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotCi1wdWJsaWMgY2xhc3MgVmVyc2lvbkFuZFR5cGVUZXN0Ci17Ci0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRJbnB1dCgpCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoVmVyc2lvbkFuZFR5cGUuZnJvbVN0cmluZygiYmlnLWJjIikudG9TdHJpbmcoKSwgImJpZy1iYyIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRJbnB1dHMoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IFZlcnNpb25BbmRUeXBlLmZyb21TdHJpbmcoIiAiKSkuaXNJbnN0YW5jZU9mKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcoInNob3VsZCBiZSBvZiB0aGUgZm9ybSAnYmlnLWJjJyIpOwotICAgICAgICBhc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gVmVyc2lvbkFuZFR5cGUuZnJvbVN0cmluZygibWNjLSIpKS5pc0luc3RhbmNlT2YoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNNZXNzYWdlQ29udGFpbmluZygic2hvdWxkIGJlIG9mIHRoZSBmb3JtICdiaWctYmMnIik7Ci0gICAgICAgIGFzc2VydFRoYXRUaHJvd25CeSgoKSAtPiBWZXJzaW9uQW5kVHlwZS5mcm9tU3RyaW5nKCJtY2MtZCIpKS5pc0luc3RhbmNlT2YoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcoIk5vIFR5cGUgY29uc3RhbnQgbWNjIik7Ci0gICAgICAgIGFzc2VydFRoYXRUaHJvd25CeSgoKSAtPiBWZXJzaW9uQW5kVHlwZS5mcm9tU3RyaW5nKCJtY2MtZC0iKSkuaXNJbnN0YW5jZU9mKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNNZXNzYWdlQ29udGFpbmluZygiTm8gVHlwZSBjb25zdGFudCBtY2MiKTsKLSAgICAgICAgYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IFZlcnNpb25BbmRUeXBlLmZyb21TdHJpbmcoIm1jYyIpKS5pc0luc3RhbmNlT2YoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc01lc3NhZ2VDb250YWluaW5nKCJzaG91bGQgYmUgb2YgdGhlIGZvcm0gJ2JpZy1iYyciKTsKLSAgICAgICAgYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IFZlcnNpb25BbmRUeXBlLmZyb21TdHJpbmcoIi0iKSkuaXNJbnN0YW5jZU9mKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcoInNob3VsZCBiZSBvZiB0aGUgZm9ybSAnYmlnLWJjJyIpOwotICAgICAgICBhc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gVmVyc2lvbkFuZFR5cGUuZnJvbVN0cmluZygiLS0iKSkuaXNJbnN0YW5jZU9mKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc01lc3NhZ2VDb250YWluaW5nKCJzaG91bGQgYmUgb2YgdGhlIGZvcm0gJ2JpZy1iYyciKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ1RhYmxlWmVyb0NvcHlXcml0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ1RhYmxlWmVyb0NvcHlXcml0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZDIwMjAuLjAwMDAwMDAKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9CaWdUYWJsZVplcm9Db3B5V3JpdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuY2hlY2tlZElPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwotaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgaW8ubmV0dHkuYnVmZmVyLlVucG9vbGVkOwotaW1wb3J0IGlvLm5ldHR5LmNoYW5uZWwuZW1iZWRkZWQuRW1iZWRkZWRDaGFubmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dVcGRhdGVCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNsaWNlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRzTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuQXN5bmNTdHJlYW1pbmdJbnB1dFBsdXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNhY2hpbmdQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXMuRGF0YUlucHV0U3RyZWFtUGx1czsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOwotCi1wdWJsaWMgY2xhc3MgQmlnVGFibGVaZXJvQ29weVdyaXRlclRlc3QKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTUEFDRTEgPSAiQmlnVGFibGVCbG9ja1dyaXRlclRlc3QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGX1NUQU5EQVJEID0gIlN0YW5kYXJkMSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfU1RBTkRBUkQyID0gIlN0YW5kYXJkMiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfSU5ERVhFRCA9ICJJbmRleGVkMSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfU1RBTkRBUkRMT1dJTkRFWElOVEVSVkFMID0gIlN0YW5kYXJkTG93SW5kZXhJbnRlcnZhbCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVSZWFkZXIgc3N0YWJsZTsKLSAgICBwdWJsaWMgc3RhdGljIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlOwotICAgIHByaXZhdGUgc3RhdGljIGludCBleHBlY3RlZFJvd0NvdW50OwotCi0gICAgQEJlZm9yZUNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFNjaGVtYUxvYWRlci5wcmVwYXJlU2VydmVyKCk7Ci0gICAgICAgIFNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZShLRVlTUEFDRTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENGX1NUQU5EQVJEMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuY29tcG9zaXRlSW5kZXhDRk1EKEtFWVNQQUNFMSwgQ0ZfSU5ERVhFRCwgdHJ1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkRMT1dJTkRFWElOVEVSVkFMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1pbkluZGV4SW50ZXJ2YWwoOCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhJbmRleEludGVydmFsKDI1NikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWNoaW5nKENhY2hpbmdQYXJhbXMuQ0FDSEVfTk9USElORykpOwotCi0gICAgICAgIFN0cmluZyBrcyA9IEtFWVNQQUNFMTsKLSAgICAgICAgU3RyaW5nIGNmID0gIlN0YW5kYXJkMSI7Ci0KLSAgICAgICAgLy8gY2xlYXIgYW5kIGNyZWF0ZSBqdXN0IG9uZSBzc3RhYmxlIGZvciB0aGlzIHRlc3QKLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKGtzKTsKLSAgICAgICAgc3RvcmUgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZik7Ci0gICAgICAgIHN0b3JlLmNsZWFyVW5zYWZlKCk7Ci0gICAgICAgIHN0b3JlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwotCi0gICAgICAgIERlY29yYXRlZEtleSBmaXJzdEtleSA9IG51bGwsIGxhc3RLZXkgPSBudWxsOwotICAgICAgICBsb25nIHRpbWVzdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0b3JlLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWw7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IFV0aWwuZGsoU3RyaW5nLnZhbHVlT2YoaSkpOwotICAgICAgICAgICAgaWYgKGZpcnN0S2V5ID09IG51bGwpCi0gICAgICAgICAgICAgICAgZmlyc3RLZXkgPSBrZXk7Ci0gICAgICAgICAgICBpZiAobGFzdEtleSA9PSBudWxsKQotICAgICAgICAgICAgICAgIGxhc3RLZXkgPSBrZXk7Ci0gICAgICAgICAgICBpZiAoc3RvcmUubWV0YWRhdGEoKS5wYXJ0aXRpb25LZXlUeXBlLmNvbXBhcmUobGFzdEtleS5nZXRLZXkoKSwga2V5LmdldEtleSgpKSA8IDApCi0gICAgICAgICAgICAgICAgbGFzdEtleSA9IGtleTsKLQotICAgICAgICAgICAgbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoc3RvcmUubWV0YWRhdGEoKSwgdGltZXN0YW1wLCBrZXkuZ2V0S2V5KCkpCi0gICAgICAgICAgICAuY2x1c3RlcmluZygiY29sIikKLSAgICAgICAgICAgIC5hZGQoInZhbCIsIEJ5dGVCdWZmZXJVdGlsLkVNUFRZX0JZVEVfQlVGRkVSKQotICAgICAgICAgICAgLmJ1aWxkKCkKLSAgICAgICAgICAgIC5hcHBseVVuc2FmZSgpOwotICAgICAgICAgICAgZXhwZWN0ZWRSb3dDb3VudCsrOwotICAgICAgICB9Ci0gICAgICAgIFV0aWwuZmx1c2goc3RvcmUpOwotCi0gICAgICAgIHNzdGFibGUgPSBzdG9yZS5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHdyaXRlRGF0YUZpbGVfRGF0YUlucHV0UGx1cygpCi0gICAgewotICAgICAgICB3cml0ZURhdGFUZXN0Q3ljbGUoYnVmZmVyIC0+IG5ldyBEYXRhSW5wdXRTdHJlYW1QbHVzKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZmZXIuYXJyYXkoKSkpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHdyaXRlRGF0YUZpbGVfUmVidWZmZXJpbmdCeXRlQnVmRGF0YUlucHV0UGx1cygpCi0gICAgewotICAgICAgICB0cnkgKEFzeW5jU3RyZWFtaW5nSW5wdXRQbHVzIGlucHV0ID0gbmV3IEFzeW5jU3RyZWFtaW5nSW5wdXRQbHVzKG5ldyBFbWJlZGRlZENoYW5uZWwoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlRGF0YVRlc3RDeWNsZShidWZmZXIgLT4KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnB1dC5hcHBlbmQoVW5wb29sZWQud3JhcHBlZEJ1ZmZlcihidWZmZXIpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgaW5wdXQucmVxdWVzdENsb3N1cmUoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlRGF0YVRlc3RDeWNsZShGdW5jdGlvbjxCeXRlQnVmZmVyLCBEYXRhSW5wdXRQbHVzPiBidWZmZXJNYXBwZXIpCi0gICAgewotICAgICAgICBGaWxlIGRpciA9IHN0b3JlLmdldERpcmVjdG9yaWVzKCkuZ2V0RGlyZWN0b3J5Rm9yTmV3U1NUYWJsZXMoKTsKLSAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gc3RvcmUubmV3U1NUYWJsZURlc2NyaXB0b3IoZGlyKTsKLSAgICAgICAgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YSA9IFNjaGVtYS5pbnN0YW5jZS5nZXRUYWJsZU1ldGFkYXRhUmVmKGRlc2MpOwotCi0gICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IExpZmVjeWNsZVRyYW5zYWN0aW9uLm9mZmxpbmUoT3BlcmF0aW9uVHlwZS5TVFJFQU0pOwotICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzVG9Xcml0ZSA9IEltbXV0YWJsZVNldC5vZihDb21wb25lbnQuREFUQSwgQ29tcG9uZW50LlBSSU1BUllfSU5ERVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudC5TVEFUUyk7Ci0KLSAgICAgICAgQmlnVGFibGVaZXJvQ29weVdyaXRlciBidHpjdyA9IG5ldyBCaWdUYWJsZVplcm9Db3B5V3JpdGVyKGRlc2MsIG1ldGFkYXRhLCB0eG4sIGNvbXBvbmVudHNUb1dyaXRlKTsKLQotICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBjb21wb25lbnRzVG9Xcml0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKEZpbGVzLmV4aXN0cyhQYXRocy5nZXQoZGVzYy5maWxlbmFtZUZvcihjb21wb25lbnQpKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFpcjxEYXRhSW5wdXRQbHVzLCBMb25nPiBwYWlyID0gZ2V0U1NUYWJsZUNvbXBvbmVudERhdGEoc3N0YWJsZSwgY29tcG9uZW50LCBidWZmZXJNYXBwZXIpOwotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBidHpjdy53cml0ZUNvbXBvbmVudChjb21wb25lbnQudHlwZSwgcGFpci5sZWZ0LCBwYWlyLnJpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKENsb3NlZENoYW5uZWxFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmNoZWNrZWRJT0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IHJlYWRlcnMgPSBidHpjdy5maW5pc2godHJ1ZSk7Ci0KLSAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXIgPSByZWFkZXJzLnRvQXJyYXkobmV3IFNTVGFibGVSZWFkZXJbMF0pWzBdOwotCi0gICAgICAgIGFzc2VydE5vdEVxdWFscyhzc3RhYmxlLmdldEZpbGVuYW1lKCksIHJlYWRlci5nZXRGaWxlbmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNzdGFibGUuZXN0aW1hdGVkS2V5cygpLCByZWFkZXIuZXN0aW1hdGVkS2V5cygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNzdGFibGUuaXNQZW5kaW5nUmVwYWlyKCksIHJlYWRlci5pc1BlbmRpbmdSZXBhaXIoKSk7Ci0KLSAgICAgICAgYXNzZXJ0Um93Q291bnQoZXhwZWN0ZWRSb3dDb3VudCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFJvd0NvdW50KGludCBleHBlY3RlZCkKLSAgICB7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RvcmUubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBEZWNvcmF0ZWRLZXkgZGsgPSBVdGlsLmRrKFN0cmluZy52YWx1ZU9mKGkpKTsKLSAgICAgICAgICAgIFVuZmlsdGVyZWRSb3dJdGVyYXRvciByb3dJdGVyID0gc3N0YWJsZS5yb3dJdGVyYXRvcihkaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbGljZXMuQUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbkZpbHRlci5hbGwoc3RvcmUubWV0YWRhdGEoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRzTGlzdGVuZXIuTk9PUF9MSVNURU5FUik7Ci0gICAgICAgICAgICB3aGlsZSAocm93SXRlci5oYXNOZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcm93SXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGNvdW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFBhaXI8RGF0YUlucHV0UGx1cywgTG9uZz4gZ2V0U1NUYWJsZUNvbXBvbmVudERhdGEoU1NUYWJsZVJlYWRlciBzc3RhYmxlLCBDb21wb25lbnQgY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjxCeXRlQnVmZmVyLCBEYXRhSW5wdXRQbHVzPiBidWZmZXJNYXBwZXIpCi0gICAgewotICAgICAgICBGaWxlSGFuZGxlIGNvbXBvbmVudEZpbGUgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihjb21wb25lbnQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVmZmVyU2l6ZSgxMDI0KS5jb21wbGV0ZSgpOwotICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoKGludCkgY29tcG9uZW50RmlsZS5jaGFubmVsLnNpemUoKSk7Ci0gICAgICAgIGNvbXBvbmVudEZpbGUuY2hhbm5lbC5yZWFkKGJ1ZmZlciwgMCk7Ci0gICAgICAgIGJ1ZmZlci5mbGlwKCk7Ci0KLSAgICAgICAgRGF0YUlucHV0UGx1cyBpbnB1dFBsdXMgPSBidWZmZXJNYXBwZXIuYXBwbHkoYnVmZmVyKTsKLQotICAgICAgICByZXR1cm4gUGFpci5jcmVhdGUoaW5wdXRQbHVzLCBjb21wb25lbnRGaWxlLmNoYW5uZWwuc2l6ZSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL1Jvd0luZGV4RW50cnlUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL1Jvd0luZGV4RW50cnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyYTRjNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvUm93SW5kZXhFbnRyeVRlc3QuamF2YQpAQCAtMCwwICsxLDg1OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5JbnRzOworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLklNZWFzdXJhYmxlTWVtb3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLnNjaGVtYS5DcmVhdGVUYWJsZVN0YXRlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5CdWZmZXJEZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nQ29tcGFyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nUHJlZml4OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuTGl2ZW5lc3NJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTG9uZ1R5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5JbW11dGFibGVCVHJlZVBhcnRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkFic3RyYWN0VW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQlRyZWVSb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5CdWZmZXJDZWxsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ29sdW1uRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkVuY29kaW5nU3RhdHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5SYW5nZVRvbWJzdG9uZU1hcmtlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlNlcmlhbGl6YXRpb25IZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lk11cm11cjNQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JbmRleEluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlRmx1c2hPYnNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNlcXVlbnRpYWxXcml0ZXJPcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTG9uZ1NlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT2JqZWN0U2l6ZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnRyZWUuQlRyZWU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIFJvd0luZGV4RW50cnlUZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGNsdXN0ZXJUeXBlcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoTG9uZ1R5cGUuaW5zdGFuY2UpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXAgPSBuZXcgQ2x1c3RlcmluZ0NvbXBhcmF0b3IoY2x1c3RlclR5cGVzKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBkdW1teV8xMDBrID0gbmV3IGJ5dGVbMTAwMDAwXTsKKworICAgIHByaXZhdGUgc3RhdGljIENsdXN0ZXJpbmc8Pz4gY24obG9uZyBsKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFV0aWwuY2x1c3RlcmluZyhjb21wLCBsKTsKKyAgICB9CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKQorICAgIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoQmlnRm9ybWF0LmlzU2VsZWN0ZWQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QzExMjA2QWdhaW5zdFByZXZpb3VzQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhDYWNoZVNpemUoOTk5OTkpOworICAgICAgICB0ZXN0QzExMjA2QWdhaW5zdFByZXZpb3VzKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QzExMjA2QWdhaW5zdFByZXZpb3VzU2hhbGxvdygpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleENhY2hlU2l6ZSgwKTsKKyAgICAgICAgdGVzdEMxMTIwNkFnYWluc3RQcmV2aW91cygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdEMxMTIwNkFnYWluc3RQcmV2aW91cygpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIHBhcnRpdGlvbiB3aXRob3V0IEluZGV4SW5mbworICAgICAgICB0cnkgKERvdWJsZVNlcmlhbGl6ZXIgZG91YmxlU2VyaWFsaXplciA9IG5ldyBEb3VibGVTZXJpYWxpemVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZVNlcmlhbGl6ZXIuYnVpbGQobnVsbCwgcGFydGl0aW9uS2V5KDQyTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY24oNDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMEwpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRvdWJsZVNlcmlhbGl6ZXIucmllT2xkU2VyaWFsaXplZCwgZG91YmxlU2VyaWFsaXplci5yaWVOZXdTZXJpYWxpemVkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBhcnRpdGlvbiB3aXRoIG11bHRpcGxlIEluZGV4SW5mbworICAgICAgICB0cnkgKERvdWJsZVNlcmlhbGl6ZXIgZG91YmxlU2VyaWFsaXplciA9IG5ldyBEb3VibGVTZXJpYWxpemVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZVNlcmlhbGl6ZXIuYnVpbGQobnVsbCwgcGFydGl0aW9uS2V5KDQyTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoY24oNDIpLCBjbig0MyksIGNuKDQ0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBMKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkb3VibGVTZXJpYWxpemVyLnJpZU9sZFNlcmlhbGl6ZWQsIGRvdWJsZVNlcmlhbGl6ZXIucmllTmV3U2VyaWFsaXplZCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwYXJ0aXRpb24gd2l0aCBtdWx0aXBsZSBJbmRleEluZm8KKyAgICAgICAgdHJ5IChEb3VibGVTZXJpYWxpemVyIGRvdWJsZVNlcmlhbGl6ZXIgPSBuZXcgRG91YmxlU2VyaWFsaXplcigpKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGVTZXJpYWxpemVyLmJ1aWxkKG51bGwsIHBhcnRpdGlvbktleSg0MkwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KGNuKDQyKSwgY24oNDMpLCBjbig0NCksIGNuKDQ1KSwgY24oNDYpLCBjbig0NyksIGNuKDQ4KSwgY24oNDkpLCBjbig1MCksIGNuKDUxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBMKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkb3VibGVTZXJpYWxpemVyLnJpZU9sZFNlcmlhbGl6ZWQsIGRvdWJsZVNlcmlhbGl6ZXIucmllTmV3U2VyaWFsaXplZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5KGxvbmcgbCkKKyAgICB7CisgICAgICAgIEJ5dGVCdWZmZXIga2V5ID0gTG9uZ1NlcmlhbGl6ZXIuaW5zdGFuY2Uuc2VyaWFsaXplKGwpOworICAgICAgICBUb2tlbiB0b2tlbiA9IE11cm11cjNQYXJ0aXRpb25lci5pbnN0YW5jZS5nZXRUb2tlbihrZXkpOworICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlckRlY29yYXRlZEtleSh0b2tlbiwga2V5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEb3VibGVTZXJpYWxpemVyIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZQorICAgIHsKKyAgICAgICAgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSA9CisgICAgICAgICAgICBDcmVhdGVUYWJsZVN0YXRlbWVudC5wYXJzZSgiQ1JFQVRFIFRBQkxFIHBpcGUuZGV2X251bGwgKHBrIGJpZ2ludCwgY2sgYmlnaW50LCB2YWwgdGV4dCwgUFJJTUFSWSBLRVkocGssIGNrKSkiLCAiZm9vIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgVmVyc2lvbiB2ZXJzaW9uID0gQmlnRm9ybWF0LmdldEluc3RhbmNlKCkuZ2V0TGF0ZXN0VmVyc2lvbigpOworCisgICAgICAgIERlbGV0aW9uVGltZSBkZWxldGlvbkluZm8gPSBuZXcgRGVsZXRpb25UaW1lKEZCVXRpbGl0aWVzLnRpbWVzdGFtcE1pY3JvcygpLCBGQlV0aWxpdGllcy5ub3dJblNlY29uZHMoKSk7CisgICAgICAgIExpdmVuZXNzSW5mbyBwcmltYXJ5S2V5TGl2ZW5lc3NJbmZvID0gTGl2ZW5lc3NJbmZvLkVNUFRZOworICAgICAgICBSb3cuRGVsZXRpb24gZGVsZXRpb24gPSBSb3cuRGVsZXRpb24uTElWRTsKKworICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciA9IG5ldyBTZXJpYWxpemF0aW9uSGVhZGVyKHRydWUsIG1ldGFkYXRhLCBtZXRhZGF0YS5yZWd1bGFyQW5kU3RhdGljQ29sdW1ucygpLCBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTKTsKKworICAgICAgICAvLyBjcmVhdGUgQy0xMTIwNiArIG9sZCBzZXJpYWxpemVyIGluc3RhbmNlcworICAgICAgICBSb3dJbmRleEVudHJ5LkluZGV4U2VyaWFsaXplciByaWVTZXJpYWxpemVyID0gbmV3IFJvd0luZGV4RW50cnkuU2VyaWFsaXplcih2ZXJzaW9uLCBoZWFkZXIsIG51bGwpOworICAgICAgICBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5LlNlcmlhbGl6ZXIgb2xkU2VyaWFsaXplciA9IG5ldyBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5LlNlcmlhbGl6ZXIobWV0YWRhdGEsIHZlcnNpb24sIGhlYWRlcik7CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmVzb3VyY2UiLCAiSU9SZXNvdXJjZU9wZW5lZEJ1dE5vdFNhZmVseUNsb3NlZCIgfSkKKyAgICAgICAgZmluYWwgRGF0YU91dHB1dEJ1ZmZlciByaWVPdXRwdXQgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlcigxMDI0KTsKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmVzb3VyY2UiLCAiSU9SZXNvdXJjZU9wZW5lZEJ1dE5vdFNhZmVseUNsb3NlZCIgfSkKKyAgICAgICAgZmluYWwgRGF0YU91dHB1dEJ1ZmZlciBvbGRPdXRwdXQgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlcigxMDI0KTsKKworICAgICAgICBmaW5hbCBTZXF1ZW50aWFsV3JpdGVyIGRhdGFXcml0ZXJOZXc7CisgICAgICAgIGZpbmFsIFNlcXVlbnRpYWxXcml0ZXIgZGF0YVdyaXRlck9sZDsKKyAgICAgICAgZmluYWwgQmlnRm9ybWF0UGFydGl0aW9uV3JpdGVyIHBhcnRpdGlvbldyaXRlcjsKKworICAgICAgICBSb3dJbmRleEVudHJ5IHJpZU5ldzsKKyAgICAgICAgQnl0ZUJ1ZmZlciByaWVOZXdTZXJpYWxpemVkOworICAgICAgICBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5IHJpZU9sZDsKKyAgICAgICAgQnl0ZUJ1ZmZlciByaWVPbGRTZXJpYWxpemVkOworCisgICAgICAgIERvdWJsZVNlcmlhbGl6ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgU2VxdWVudGlhbFdyaXRlck9wdGlvbiBvcHRpb24gPSBTZXF1ZW50aWFsV3JpdGVyT3B0aW9uLm5ld0J1aWxkZXIoKS5idWZmZXJTaXplKDEwMjQpLmJ1aWxkKCk7CisgICAgICAgICAgICBGaWxlIGYgPSBGaWxlVXRpbHMuY3JlYXRlVGVtcEZpbGUoIlJvd0luZGV4RW50cnlUZXN0LSIsICJkYiIpOworICAgICAgICAgICAgZGF0YVdyaXRlck5ldyA9IG5ldyBTZXF1ZW50aWFsV3JpdGVyKGYsIG9wdGlvbik7CisgICAgICAgICAgICBwYXJ0aXRpb25Xcml0ZXIgPSBuZXcgQmlnRm9ybWF0UGFydGl0aW9uV3JpdGVyKGhlYWRlciwgZGF0YVdyaXRlck5ldywgdmVyc2lvbiwgcmllU2VyaWFsaXplci5pbmRleEluZm9TZXJpYWxpemVyKCkpOworCisgICAgICAgICAgICBmID0gRmlsZVV0aWxzLmNyZWF0ZVRlbXBGaWxlKCJSb3dJbmRleEVudHJ5VGVzdC0iLCAiZGIiKTsKKyAgICAgICAgICAgIGRhdGFXcml0ZXJPbGQgPSBuZXcgU2VxdWVudGlhbFdyaXRlcihmLCBvcHRpb24pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGFXcml0ZXJOZXcuY2xvc2UoKTsKKyAgICAgICAgICAgIGRhdGFXcml0ZXJPbGQuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYnVpbGQoUm93IHN0YXRpY1JvdywgRGVjb3JhdGVkS2V5IHBhcnRpdGlvbktleSwKKyAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPENsdXN0ZXJpbmc8Pz4+IGNsdXN0ZXJpbmdzLCBsb25nIHN0YXJ0UG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisKKyAgICAgICAgICAgIEl0ZXJhdG9yPENsdXN0ZXJpbmc8Pz4+IGNsdXN0ZXJpbmdJdGVyID0gY2x1c3RlcmluZ3MuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHBhcnRpdGlvbldyaXRlci5zdGFydChwYXJ0aXRpb25LZXksIERlbGV0aW9uVGltZS5MSVZFKTsKKyAgICAgICAgICAgIGlmIChzdGF0aWNSb3cgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwYXJ0aXRpb25Xcml0ZXIuYWRkU3RhdGljUm93KHN0YXRpY1Jvdyk7CisgICAgICAgICAgICBBYnN0cmFjdFVuZmlsdGVyZWRSb3dJdGVyYXRvciByb3dJdGVyID0gbWFrZVJvd0l0ZXIoc3RhdGljUm93LCBwYXJ0aXRpb25LZXksIGNsdXN0ZXJpbmdJdGVyLCBkYXRhV3JpdGVyTmV3KTsKKyAgICAgICAgICAgIHdoaWxlIChyb3dJdGVyLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICBwYXJ0aXRpb25Xcml0ZXIuYWRkVW5maWx0ZXJlZChyb3dJdGVyLm5leHQoKSk7CisgICAgICAgICAgICBwYXJ0aXRpb25Xcml0ZXIuZmluaXNoKCk7CisKKyAgICAgICAgICAgIHJpZU5ldyA9IFJvd0luZGV4RW50cnkuY3JlYXRlKHN0YXJ0UG9zaXRpb24sIDBMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRpb25JbmZvLCBwYXJ0aXRpb25Xcml0ZXIuZ2V0SGVhZGVyTGVuZ3RoKCksIHBhcnRpdGlvbldyaXRlci5nZXRDb2x1bW5JbmRleENvdW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25Xcml0ZXIuaW5kZXhJbmZvU2VyaWFsaXplZFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbldyaXRlci5pbmRleFNhbXBsZXMoKSwgcGFydGl0aW9uV3JpdGVyLm9mZnNldHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZVNlcmlhbGl6ZXIuaW5kZXhJbmZvU2VyaWFsaXplcigpKTsKKyAgICAgICAgICAgIHJpZVNlcmlhbGl6ZXIuc2VyaWFsaXplKHJpZU5ldywgcmllT3V0cHV0LCBwYXJ0aXRpb25Xcml0ZXIuYnVmZmVyKCkpOworICAgICAgICAgICAgcmllTmV3U2VyaWFsaXplZCA9IHJpZU91dHB1dC5idWZmZXIoKS5kdXBsaWNhdGUoKTsKKworICAgICAgICAgICAgSXRlcmF0b3I8Q2x1c3RlcmluZzw/Pj4gY2x1c3RlcmluZ0l0ZXIyID0gY2x1c3RlcmluZ3MuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIENvbHVtbkluZGV4IGNvbHVtbkluZGV4ID0gUm93SW5kZXhFbnRyeVRlc3QuQ29sdW1uSW5kZXgud3JpdGVBbmRCdWlsZEluZGV4KG1ha2VSb3dJdGVyKHN0YXRpY1JvdywgcGFydGl0aW9uS2V5LCBjbHVzdGVyaW5nSXRlcjIsIGRhdGFXcml0ZXJPbGQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVdyaXRlck9sZCwgaGVhZGVyLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCBCaWdGb3JtYXQuZ2V0SW5zdGFuY2UoKS5nZXRMYXRlc3RWZXJzaW9uKCkpOworICAgICAgICAgICAgcmllT2xkID0gUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeS5jcmVhdGUoc3RhcnRQb3NpdGlvbiwgZGVsZXRpb25JbmZvLCBjb2x1bW5JbmRleCk7CisgICAgICAgICAgICBvbGRTZXJpYWxpemVyLnNlcmlhbGl6ZShyaWVPbGQsIG9sZE91dHB1dCk7CisgICAgICAgICAgICByaWVPbGRTZXJpYWxpemVkID0gb2xkT3V0cHV0LmJ1ZmZlcigpLmR1cGxpY2F0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBBYnN0cmFjdFVuZmlsdGVyZWRSb3dJdGVyYXRvciBtYWtlUm93SXRlcihSb3cgc3RhdGljUm93LCBEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPENsdXN0ZXJpbmc8Pz4+IGNsdXN0ZXJpbmdJdGVyLCBTZXF1ZW50aWFsV3JpdGVyIGRhdGFXcml0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RVbmZpbHRlcmVkUm93SXRlcmF0b3IobWV0YWRhdGEsIHBhcnRpdGlvbktleSwgZGVsZXRpb25JbmZvLCBtZXRhZGF0YS5yZWd1bGFyQW5kU3RhdGljQ29sdW1ucygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNSb3csIGZhbHNlLCBuZXcgRW5jb2RpbmdTdGF0cygwLCAwLCAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZCBjb21wdXRlTmV4dCgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWNsdXN0ZXJpbmdJdGVyLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmRPZkRhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHNvbWUgZmFrZSBieXRlcyB0byB0aGUgZGF0YSBmaWxlIHRvIGZvcmNlIHdyaXRpbmcgdGhlIEluZGV4SW5mbyBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFXcml0ZXIud3JpdGUoZHVtbXlfMTAwayk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZFJvdyhjbHVzdGVyaW5nSXRlci5uZXh0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFVuZmlsdGVyZWQgYnVpbGRSb3coQ2x1c3RlcmluZzw/PiBjbHVzdGVyaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBCVHJlZS5CdWlsZGVyPENvbHVtbkRhdGE+IGJ1aWxkZXIgPSBCVHJlZS5idWlsZGVyKENvbHVtbkRhdGEuY29tcGFyYXRvcik7CisgICAgICAgICAgICBidWlsZGVyLmFkZChCdWZmZXJDZWxsLmxpdmUobWV0YWRhdGEucmVndWxhckFuZFN0YXRpY0NvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyLmFsbG9jYXRlKDApKSk7CisgICAgICAgICAgICByZXR1cm4gQlRyZWVSb3cuY3JlYXRlKGNsdXN0ZXJpbmcsIHByaW1hcnlLZXlMaXZlbmVzc0luZm8sIGRlbGV0aW9uLCBidWlsZGVyLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlIEMtMTEyMDYgY29kZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgQ29sdW1uSW5kZXgKKyAgICB7CisgICAgICAgIGZpbmFsIGxvbmcgcGFydGl0aW9uSGVhZGVyTGVuZ3RoOworICAgICAgICBmaW5hbCBMaXN0PEluZGV4SW5mbz4gY29sdW1uc0luZGV4OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbHVtbkluZGV4IEVNUFRZID0gbmV3IENvbHVtbkluZGV4KC0xLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7CisKKyAgICAgICAgcHJpdmF0ZSBDb2x1bW5JbmRleChsb25nIHBhcnRpdGlvbkhlYWRlckxlbmd0aCwgTGlzdDxJbmRleEluZm8+IGNvbHVtbnNJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IGNvbHVtbnNJbmRleCAhPSBudWxsOworCisgICAgICAgICAgICB0aGlzLnBhcnRpdGlvbkhlYWRlckxlbmd0aCA9IHBhcnRpdGlvbkhlYWRlckxlbmd0aDsKKyAgICAgICAgICAgIHRoaXMuY29sdW1uc0luZGV4ID0gY29sdW1uc0luZGV4OworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIENvbHVtbkluZGV4IHdyaXRlQW5kQnVpbGRJbmRleChVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVudGlhbFdyaXRlciBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxTU1RhYmxlRmx1c2hPYnNlcnZlcj4gb2JzZXJ2ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCAhaXRlcmF0b3IuaXNFbXB0eSgpOworCisgICAgICAgICAgICBCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQnVpbGRlcihpdGVyYXRvciwgb3V0cHV0LCBoZWFkZXIsIG9ic2VydmVycywgdmVyc2lvbi5jb3JyZXNwb25kaW5nTWVzc2FnaW5nVmVyc2lvbigpKTsKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIENvbHVtbkluZGV4IG5vdGhpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRU1QVFk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSGVscCB0byBjcmVhdGUgYW4gaW5kZXggZm9yIGEgY29sdW1uIGZhbWlseSBiYXNlZCBvbiBzaXplIG9mIGNvbHVtbnMsCisgICAgICAgICAqIGFuZCB3cml0ZSBzYWlkIGNvbHVtbnMgdG8gZGlzay4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEJ1aWxkZXIKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyOworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXJpYWxpemF0aW9uSGVscGVyIGhlbHBlcjsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXI7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIGludCB2ZXJzaW9uOworCisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8SW5kZXhJbmZvPiBjb2x1bW5zSW5kZXggPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgbG9uZyBpbml0aWFsUG9zaXRpb247CisgICAgICAgICAgICBwcml2YXRlIGxvbmcgaGVhZGVyTGVuZ3RoID0gLTE7CisKKyAgICAgICAgICAgIHByaXZhdGUgbG9uZyBzdGFydFBvc2l0aW9uID0gLTE7CisKKyAgICAgICAgICAgIHByaXZhdGUgaW50IHdyaXR0ZW47CisgICAgICAgICAgICBwcml2YXRlIGxvbmcgcHJldmlvdXNSb3dTdGFydDsKKworICAgICAgICAgICAgcHJpdmF0ZSBDbHVzdGVyaW5nUHJlZml4PD8+IGZpcnN0Q2x1c3RlcmluZzsKKyAgICAgICAgICAgIHByaXZhdGUgQ2x1c3RlcmluZ1ByZWZpeDw/PiBsYXN0Q2x1c3RlcmluZzsKKworICAgICAgICAgICAgcHJpdmF0ZSBEZWxldGlvblRpbWUgb3Blbk1hcmtlcjsKKworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFNTVGFibGVGbHVzaE9ic2VydmVyPiBvYnNlcnZlcnM7CisKKyAgICAgICAgICAgIEJ1aWxkZXIoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVudGlhbFdyaXRlciB3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248U1NUYWJsZUZsdXNoT2JzZXJ2ZXI+IG9ic2VydmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2ZXJzaW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKKyAgICAgICAgICAgICAgICB0aGlzLndyaXRlciA9IHdyaXRlcjsKKyAgICAgICAgICAgICAgICB0aGlzLmhlbHBlciA9IG5ldyBTZXJpYWxpemF0aW9uSGVscGVyKGhlYWRlcik7CisgICAgICAgICAgICAgICAgdGhpcy5oZWFkZXIgPSBoZWFkZXI7CisgICAgICAgICAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmVycyA9IG9ic2VydmVycyA9PSBudWxsID8gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkgOiBvYnNlcnZlcnM7CisgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsUG9zaXRpb24gPSB3cml0ZXIucG9zaXRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUGFydGl0aW9uSGVhZGVyKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvcikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVXaXRoU2hvcnRMZW5ndGgoaXRlcmF0b3IucGFydGl0aW9uS2V5KCkuZ2V0S2V5KCksIHdyaXRlcik7CisgICAgICAgICAgICAgICAgRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGl0ZXJhdG9yLnBhcnRpdGlvbkxldmVsRGVsZXRpb24oKSwgd3JpdGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoaGVhZGVyLmhhc1N0YXRpYygpKQorICAgICAgICAgICAgICAgICAgICBVbmZpbHRlcmVkU2VyaWFsaXplci5zZXJpYWxpemVyLnNlcmlhbGl6ZVN0YXRpY1JvdyhpdGVyYXRvci5zdGF0aWNSb3coKSwgaGVscGVyLCB3cml0ZXIsIHZlcnNpb24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgQ29sdW1uSW5kZXggYnVpbGQoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cml0ZVBhcnRpdGlvbkhlYWRlcihpdGVyYXRvcik7CisgICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJMZW5ndGggPSB3cml0ZXIucG9zaXRpb24oKSAtIGluaXRpYWxQb3NpdGlvbjsKKworICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIGFkZChpdGVyYXRvci5uZXh0KCkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGNsb3NlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgbG9uZyBjdXJyZW50UG9zaXRpb24oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB3cml0ZXIucG9zaXRpb24oKSAtIGluaXRpYWxQb3NpdGlvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZEluZGV4QmxvY2soKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluZGV4SW5mbyBjSW5kZXhJbmZvID0gbmV3IEluZGV4SW5mbyhmaXJzdENsdXN0ZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDbHVzdGVyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb24oKSAtIHN0YXJ0UG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5NYXJrZXIpOworICAgICAgICAgICAgICAgIGNvbHVtbnNJbmRleC5hZGQoY0luZGV4SW5mbyk7CisgICAgICAgICAgICAgICAgZmlyc3RDbHVzdGVyaW5nID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZChVbmZpbHRlcmVkIHVuZmlsdGVyZWQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvbmcgcG9zID0gY3VycmVudFBvc2l0aW9uKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RDbHVzdGVyaW5nID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBCZWdpbm5pbmcgb2YgYW4gaW5kZXggYmxvY2suIFJlbWVtYmVyIHRoZSBzdGFydCBhbmQgcG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgZmlyc3RDbHVzdGVyaW5nID0gdW5maWx0ZXJlZC5jbHVzdGVyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zaXRpb24gPSBwb3M7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgVW5maWx0ZXJlZFNlcmlhbGl6ZXIuc2VyaWFsaXplci5zZXJpYWxpemUodW5maWx0ZXJlZCwgaGVscGVyLCB3cml0ZXIsIHBvcyAtIHByZXZpb3VzUm93U3RhcnQsIHZlcnNpb24pOworCisgICAgICAgICAgICAgICAgLy8gbm90aWZ5IG9ic2VydmVycyBhYm91dCBlYWNoIG5ldyByb3cKKyAgICAgICAgICAgICAgICBpZiAoIW9ic2VydmVycy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgIG9ic2VydmVycy5mb3JFYWNoKChvKSAtPiBvLm5leHRVbmZpbHRlcmVkQ2x1c3Rlcih1bmZpbHRlcmVkKSk7CisKKyAgICAgICAgICAgICAgICBsYXN0Q2x1c3RlcmluZyA9IHVuZmlsdGVyZWQuY2x1c3RlcmluZygpOworICAgICAgICAgICAgICAgIHByZXZpb3VzUm93U3RhcnQgPSBwb3M7CisgICAgICAgICAgICAgICAgKyt3cml0dGVuOworCisgICAgICAgICAgICAgICAgaWYgKHVuZmlsdGVyZWQua2luZCgpID09IFVuZmlsdGVyZWQuS2luZC5SQU5HRV9UT01CU1RPTkVfTUFSS0VSKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUmFuZ2VUb21ic3RvbmVNYXJrZXIgbWFya2VyID0gKFJhbmdlVG9tYnN0b25lTWFya2VyKXVuZmlsdGVyZWQ7CisgICAgICAgICAgICAgICAgICAgIG9wZW5NYXJrZXIgPSBtYXJrZXIuaXNPcGVuKGZhbHNlKSA/IG1hcmtlci5vcGVuRGVsZXRpb25UaW1lKGZhbHNlKSA6IG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGl0IHRoZSBjb2x1bW4gaW5kZXggc2l6ZSB0aGF0IHdlIGhhdmUgdG8gaW5kZXggYWZ0ZXIsIGdvIGFoZWFkIGFuZCBpbmRleCBpdC4KKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudFBvc2l0aW9uKCkgLSBzdGFydFBvc2l0aW9uID49IERhdGFiYXNlRGVzY3JpcHRvci5nZXRDb2x1bW5JbmRleFNpemUoQmlnRm9ybWF0UGFydGl0aW9uV3JpdGVyLkRFRkFVTFRfR1JBTlVMQVJJVFkpKQorICAgICAgICAgICAgICAgICAgICBhZGRJbmRleEJsb2NrKCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBDb2x1bW5JbmRleCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVuZmlsdGVyZWRTZXJpYWxpemVyLnNlcmlhbGl6ZXIud3JpdGVFbmRPZlBhcnRpdGlvbih3cml0ZXIpOworCisgICAgICAgICAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB3ZSBhZGQgbm8gcm93cywganVzdCBhIHRvcCBsZXZlbCBkZWxldGlvbgorICAgICAgICAgICAgICAgIGlmICh3cml0dGVuID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSb3dJbmRleEVudHJ5VGVzdC5Db2x1bW5JbmRleC5FTVBUWTsKKworICAgICAgICAgICAgICAgIC8vIHRoZSBsYXN0IGNvbHVtbiBtYXkgaGF2ZSBmYWxsZW4gb24gYW4gaW5kZXggYm91bmRhcnkgYWxyZWFkeS4gIGlmIG5vdCwgaW5kZXggaXQgZXhwbGljaXRseS4KKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RDbHVzdGVyaW5nICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGFkZEluZGV4QmxvY2soKTsKKworICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBhbHdheXMgaGF2ZSBhdCBsZWFzdCBvbmUgY29tcHV0ZWQgaW5kZXggYmxvY2ssIGJ1dCB3ZSBvbmx5IHdyaXRlIGl0IG91dCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gdGhhdC4KKyAgICAgICAgICAgICAgICBhc3NlcnQgIWNvbHVtbnNJbmRleC5pc0VtcHR5KCkgJiYgaGVhZGVyTGVuZ3RoID49IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5JbmRleChoZWFkZXJMZW5ndGgsIGNvbHVtbnNJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVkU2l6ZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFN0cmluZyB0YWJsZU5hbWUgPSBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChhIGludCwgYiB0ZXh0LCBjIGludCwgUFJJTUFSWSBLRVkoYSwgYikpIik7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldENvbHVtbkZhbWlseVN0b3JlKHRhYmxlTmFtZSk7CisKKyAgICAgICAgUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeSBzaW1wbGUgPSBuZXcgUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeSgxMjMpOworCisgICAgICAgIERhdGFPdXRwdXRCdWZmZXIgYnVmZmVyID0gbmV3IERhdGFPdXRwdXRCdWZmZXIoKTsKKyAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIgPSBuZXcgU2VyaWFsaXphdGlvbkhlYWRlcih0cnVlLCBjZnMubWV0YWRhdGEoKSwgY2ZzLm1ldGFkYXRhKCkucmVndWxhckFuZFN0YXRpY0NvbHVtbnMoKSwgRW5jb2RpbmdTdGF0cy5OT19TVEFUUyk7CisgICAgICAgIFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkuU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkuU2VyaWFsaXplcihjZnMubWV0YWRhdGEoKSwgQmlnRm9ybWF0LmdldEluc3RhbmNlKCkuZ2V0TGF0ZXN0VmVyc2lvbigpLCBoZWFkZXIpOworCisgICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKHNpbXBsZSwgYnVmZmVyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoYnVmZmVyLmdldExlbmd0aCgpLCBzZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKHNpbXBsZSkpOworCisgICAgICAgIC8vIHdyaXRlIGVub3VnaCByb3dzIHRvIGVuc3VyZSB3ZSBnZXQgYSBmZXcgY29sdW1uIGluZGV4IGVudHJpZXMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbHVtbkluZGV4U2l6ZShCaWdGb3JtYXRQYXJ0aXRpb25Xcml0ZXIuREVGQVVMVF9HUkFOVUxBUklUWSkgLyA0OyBpKyspCisgICAgICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYiwgYykgVkFMVUVTICg/LCA/LCA/KSIsIDAsIFN0cmluZy52YWx1ZU9mKGkpLCBpKTsKKworICAgICAgICBJbW11dGFibGVCVHJlZVBhcnRpdGlvbiBwYXJ0aXRpb24gPSBVdGlsLmdldE9ubHlQYXJ0aXRpb25VbmZpbHRlcmVkKFV0aWwuY21kKGNmcykuYnVpbGQoKSk7CisKKyAgICAgICAgRmlsZSB0ZW1wRmlsZSA9IEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZSgicm93X2luZGV4X2VudHJ5X3Rlc3QiLCBudWxsKTsKKyAgICAgICAgdGVtcEZpbGUuZGVsZXRlT25FeGl0KCk7CisgICAgICAgIFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyID0gbmV3IFNlcXVlbnRpYWxXcml0ZXIodGVtcEZpbGUpOworICAgICAgICBDb2x1bW5JbmRleCBjb2x1bW5JbmRleCA9IFJvd0luZGV4RW50cnlUZXN0LkNvbHVtbkluZGV4LndyaXRlQW5kQnVpbGRJbmRleChwYXJ0aXRpb24udW5maWx0ZXJlZEl0ZXJhdG9yKCksIHdyaXRlciwgaGVhZGVyLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCBCaWdGb3JtYXQuZ2V0SW5zdGFuY2UoKS5nZXRMYXRlc3RWZXJzaW9uKCkpOworICAgICAgICBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5IHdpdGhJbmRleCA9IFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkuY3JlYXRlKDB4ZGVhZGJlZWYsIERlbGV0aW9uVGltZS5MSVZFLCBjb2x1bW5JbmRleCk7CisgICAgICAgIEluZGV4SW5mby5TZXJpYWxpemVyIGluZGV4U2VyaWFsaXplciA9IEluZGV4SW5mby5zZXJpYWxpemVyKEJpZ0Zvcm1hdC5nZXRJbnN0YW5jZSgpLmdldExhdGVzdFZlcnNpb24oKSwgaGVhZGVyKTsKKworICAgICAgICAvLyBzYW5pdHkgY2hlY2sKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb2x1bW5JbmRleC5jb2x1bW5zSW5kZXguc2l6ZSgpID49IDMpOworCisgICAgICAgIGJ1ZmZlciA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKCk7CisgICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKHdpdGhJbmRleCwgYnVmZmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1ZmZlci5nZXRMZW5ndGgoKSwgc2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZSh3aXRoSW5kZXgpKTsKKworICAgICAgICAvLyBzZXJpYWxpemF0aW9uIGNoZWNrCisKKyAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IGJ1ZmZlci5idWZmZXIoKTsKKyAgICAgICAgRGF0YUlucHV0QnVmZmVyIGlucHV0ID0gbmV3IERhdGFJbnB1dEJ1ZmZlcihiYiwgZmFsc2UpOworICAgICAgICBzZXJpYWxpemF0aW9uQ2hlY2sod2l0aEluZGV4LCBpbmRleFNlcmlhbGl6ZXIsIGJiLCBpbnB1dCk7CisKKyAgICAgICAgLy8gdGVzdCB3aXRoIGFuIG91dHB1dCBzdHJlYW0gdGhhdCBkb2Vzbid0IHN1cHBvcnQgYSBmaWxlLXBvaW50ZXIKKyAgICAgICAgYnVmZmVyID0gbmV3IERhdGFPdXRwdXRCdWZmZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNQb3NpdGlvbigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgbG9uZyBwb3NpdGlvbigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKHdpdGhJbmRleCwgYnVmZmVyKTsKKyAgICAgICAgYmIgPSBidWZmZXIuYnVmZmVyKCk7CisgICAgICAgIGlucHV0ID0gbmV3IERhdGFJbnB1dEJ1ZmZlcihiYiwgZmFsc2UpOworICAgICAgICBzZXJpYWxpemF0aW9uQ2hlY2sod2l0aEluZGV4LCBpbmRleFNlcmlhbGl6ZXIsIGJiLCBpbnB1dCk7CisKKyAgICAgICAgLy8KKworICAgICAgICBiYiA9IGJ1ZmZlci5idWZmZXIoKTsKKyAgICAgICAgaW5wdXQgPSBuZXcgRGF0YUlucHV0QnVmZmVyKGJiLCBmYWxzZSk7CisgICAgICAgIFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkuU2VyaWFsaXplci5za2lwKGlucHV0LCBCaWdGb3JtYXQuZ2V0SW5zdGFuY2UoKS5nZXRMYXRlc3RWZXJzaW9uKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIGJiLnJlbWFpbmluZygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNlcmlhbGl6YXRpb25DaGVjayhQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5IHdpdGhJbmRleCwgSW5kZXhJbmZvLlNlcmlhbGl6ZXIgaW5kZXhTZXJpYWxpemVyLCBCeXRlQnVmZmVyIGJiLCBEYXRhSW5wdXRCdWZmZXIgaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygweGRlYWRiZWVmLCBpbnB1dC5yZWFkVW5zaWduZWRWSW50KCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHdpdGhJbmRleC5wcm9tb3RlZFNpemUoaW5kZXhTZXJpYWxpemVyKSwgaW5wdXQucmVhZFVuc2lnbmVkVkludCgpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHdpdGhJbmRleC5oZWFkZXJMZW5ndGgoKSwgaW5wdXQucmVhZFVuc2lnbmVkVkludCgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh3aXRoSW5kZXguZGVsZXRpb25UaW1lKCksIERlbGV0aW9uVGltZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGlucHV0KSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMod2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLnNpemUoKSwgaW5wdXQucmVhZFVuc2lnbmVkVkludCgpKTsKKworICAgICAgICBpbnQgb2Zmc2V0ID0gYmIucG9zaXRpb24oKTsKKyAgICAgICAgaW50W10gb2Zmc2V0cyA9IG5ldyBpbnRbd2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLnNpemUoKV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLnNpemUoKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcG9zID0gYmIucG9zaXRpb24oKTsKKyAgICAgICAgICAgIG9mZnNldHNbaV0gPSBwb3MgLSBvZmZzZXQ7CisgICAgICAgICAgICBJbmRleEluZm8gaW5mbyA9IGluZGV4U2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbnB1dCk7CisgICAgICAgICAgICBpbnQgZW5kID0gYmIucG9zaXRpb24oKTsKKworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhpbmRleFNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoaW5mbyksIGVuZCAtIHBvcyk7CisKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMod2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLmdldChpKS5vZmZzZXQsIGluZm8ub2Zmc2V0KTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMod2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLmdldChpKS53aWR0aCwgaW5mby53aWR0aCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHdpdGhJbmRleC5jb2x1bW5zSW5kZXgoKS5nZXQoaSkuZW5kT3Blbk1hcmtlciwgaW5mby5lbmRPcGVuTWFya2VyKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMod2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLmdldChpKS5maXJzdE5hbWUsIGluZm8uZmlyc3ROYW1lKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMod2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLmdldChpKS5sYXN0TmFtZSwgaW5mby5sYXN0TmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpdGhJbmRleC5jb2x1bW5zSW5kZXgoKS5zaXplKCk7IGkrKykKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMob2Zmc2V0c1tpXSwgaW5wdXQucmVhZEludCgpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIGJiLnJlbWFpbmluZygpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeSBpbXBsZW1lbnRzIElNZWFzdXJhYmxlTWVtb3J5CisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEVNUFRZX1NJWkUgPSBPYmplY3RTaXplcy5tZWFzdXJlKG5ldyBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5KDApKTsKKworICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyBwb3NpdGlvbjsKKworICAgICAgICBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5KGxvbmcgcG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnQgcHJvbW90ZWRTaXplKEluZGV4SW5mby5TZXJpYWxpemVyIGlkeFNlcmlhbGl6ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5IGNyZWF0ZShsb25nIHBvc2l0aW9uLCBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lLCBDb2x1bW5JbmRleCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IGluZGV4ICE9IG51bGw7CisgICAgICAgICAgICBhc3NlcnQgZGVsZXRpb25UaW1lICE9IG51bGw7CisKKyAgICAgICAgICAgIC8vIHdlIG9ubHkgY29uc2lkZXIgdGhlIGNvbHVtbnMgc3VtbWFyeSB3aGVuIGRldGVybWluaW5nIHdoZXRoZXIgdG8gY3JlYXRlIGFuIEluZGV4ZWRFbnRyeSwKKyAgICAgICAgICAgIC8vIHNpbmNlIGlmIHRoZXJlIGFyZSBpbnN1ZmZpY2llbnQgY29sdW1ucyB0byBiZSB3b3J0aCBpbmRleGluZyB3ZSdyZSBnb2luZyB0byBzZWVrIHRvCisgICAgICAgICAgICAvLyB0aGUgYmVnaW5uaW5nIG9mIHRoZSByb3cgYW55d2F5LCBzbyB3ZSBtaWdodCBhcyB3ZWxsIHJlYWQgdGhlIHRvbWJzdG9uZSB0aGVyZSBhcyB3ZWxsLgorICAgICAgICAgICAgaWYgKGluZGV4LmNvbHVtbnNJbmRleC5zaXplKCkgPiAxKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeS5JbmRleGVkRW50cnkocG9zaXRpb24sIGRlbGV0aW9uVGltZSwgaW5kZXgucGFydGl0aW9uSGVhZGVyTGVuZ3RoLCBpbmRleC5jb2x1bW5zSW5kZXgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeShwb3NpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgaW5kZXggZW50cnkgY29udGFpbnMgdGhlIHJvdy1sZXZlbCB0b21ic3RvbmUgYW5kIGNvbHVtbiBzdW1tYXJ5LiAgT3RoZXJ3aXNlLAorICAgICAgICAgKiBjYWxsZXIgc2hvdWxkIGZldGNoIHRoZXNlIGZyb20gdGhlIHJvdyBoZWFkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0luZGV4ZWQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gIWNvbHVtbnNJbmRleCgpLmlzRW1wdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGxlbmd0aCBvZiB0aGUgcm93IGhlYWRlciAocGFydGl0aW9uIGtleSwgcGFydGl0aW9uIGRlbGV0aW9uIGFuZCBzdGF0aWMgcm93KS4KKyAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBvbmx5IHByb3ZpZGVkIGZvciBpbmRleGVkIGVudHJpZXMgYW5kIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cKKyAgICAgICAgICoge0Bjb2RlIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufSBpZiB7QGNvZGUgIWlzSW5kZXhlZCgpfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBsb25nIGhlYWRlckxlbmd0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3Q8SW5kZXhJbmZvPiBjb2x1bW5zSW5kZXgoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyB1bnNoYXJlZEhlYXBTaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEVNUFRZX1NJWkU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNlcmlhbGl6ZXIKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbmRleEluZm8uU2VyaWFsaXplciBpZHhTZXJpYWxpemVyOworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBWZXJzaW9uIHZlcnNpb247CisKKyAgICAgICAgICAgIFNlcmlhbGl6ZXIoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgVmVyc2lvbiB2ZXJzaW9uLCBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLmlkeFNlcmlhbGl6ZXIgPSBJbmRleEluZm8uc2VyaWFsaXplcih2ZXJzaW9uLCBoZWFkZXIpOworICAgICAgICAgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5IHJpZSwgRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQocmllLnBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihyaWUucHJvbW90ZWRTaXplKGlkeFNlcmlhbGl6ZXIpKTsKKworICAgICAgICAgICAgICAgIGlmIChyaWUuaXNJbmRleGVkKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQocmllLmhlYWRlckxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuc2VyaWFsaXplKHJpZS5kZWxldGlvblRpbWUoKSwgb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIocmllLmNvbHVtbnNJbmRleCgpLnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGFuZCB3cml0ZSB0aGUgb2Zmc2V0cyB0byB0aGUgSW5kZXhJbmZvIG9iamVjdHMuCisKKyAgICAgICAgICAgICAgICAgICAgaW50W10gb2Zmc2V0cyA9IG5ldyBpbnRbcmllLmNvbHVtbnNJbmRleCgpLnNpemUoKV07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dC5oYXNQb3NpdGlvbigpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdXQgaXMgdXN1YWxseSBhIFNlcXVlbnRpYWxXcml0ZXIsIHNvIHVzaW5nIHRoZSBmaWxlLXBvaW50ZXIgaXMgZmluZSB0byBnZW5lcmF0ZSB0aGUgb2Zmc2V0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgRGF0YU91dHB1dEJ1ZmZlciBhbHNvIHdvcmtzLgorICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBzdGFydCA9IG91dC5wb3NpdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJbmRleEluZm8gaW5mbyA6IHJpZS5jb2x1bW5zSW5kZXgoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzW2ldID0gaSA9PSAwID8gMCA6IChpbnQpKG91dC5wb3NpdGlvbigpIC0gc3RhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHhTZXJpYWxpemVyLnNlcmlhbGl6ZShpbmZvLCBvdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IHN1cmUgdGhpcyBicmFuY2ggd2lsbCBldmVyIGJlIG5lZWRlZCwgYnV0IGlmIGl0IGlzIGNhbGxlZCwgaXQgaGFzIHRvIGNhbGN1bGF0ZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcmlhbGl6ZWQgc2l6ZXMgaW5zdGVhZCBvZiBzaW1wbHkgdXNpbmcgdGhlIGZpbGUtcG9pbnRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJbmRleEluZm8gaW5mbyA6IHJpZS5jb2x1bW5zSW5kZXgoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzW2krK10gPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4U2VyaWFsaXplci5zZXJpYWxpemUoaW5mbywgb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gaWR4U2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShpbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG9mZiA6IG9mZnNldHMpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVJbnQob2ZmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5IGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvbmcgcG9zaXRpb24gPSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOworICAgICAgICAgICAgICAgIGlmIChzaXplID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgaGVhZGVyTGVuZ3RoID0gaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgICAgICAgICBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lID0gRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4pOworICAgICAgICAgICAgICAgICAgICBpbnQgZW50cmllcyA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOworICAgICAgICAgICAgICAgICAgICBMaXN0PEluZGV4SW5mbz4gY29sdW1uc0luZGV4ID0gbmV3IEFycmF5TGlzdDw+KGVudHJpZXMpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNJbmRleC5hZGQoaWR4U2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbikpOworCisgICAgICAgICAgICAgICAgICAgIGluLnNraXBCeXRlc0Z1bGx5KGVudHJpZXMgKiBUeXBlU2l6ZXMuc2l6ZW9mKDApKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkuSW5kZXhlZEVudHJ5KHBvc2l0aW9uLCBkZWxldGlvblRpbWUsIGhlYWRlckxlbmd0aCwgY29sdW1uc0luZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5KHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlYWRzIG9ubHkgdGhlIGRhdGEgJ3Bvc2l0aW9uJyBvZiB0aGUgaW5kZXggZW50cnkgYW5kIHJldHVybnMgaXQuIE5vdGUgdGhhdCB0aGlzIGxlZnQgJ2luJyBpbiB0aGUgbWlkZGxlCisgICAgICAgICAgICAvLyBvZiByZWFkaW5nIGFuIGVudHJ5LCBzbyB0aGlzIGlzIG9ubHkgdXNlZnVsIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyBhbmQgaW4gbW9zdCBjYXNlICdkZXNlcmlhbGl6ZScKKyAgICAgICAgICAgIC8vIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCisgICAgICAgICAgICBzdGF0aWMgbG9uZyByZWFkUG9zaXRpb24oRGF0YUlucHV0UGx1cyBpbiwgVmVyc2lvbiB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2tpcChEYXRhSW5wdXRQbHVzIGluLCBWZXJzaW9uIHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlYWRQb3NpdGlvbihpbiwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgc2tpcFByb21vdGVkSW5kZXgoaW4sIHZlcnNpb24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNraXBQcm9tb3RlZEluZGV4KERhdGFJbnB1dFBsdXMgaW4sIFZlcnNpb24gdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHNpemUgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICBpbi5za2lwQnl0ZXNGdWxseShzaXplKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludCBzZXJpYWxpemVkU2l6ZShQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5IHJpZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXhlZFNpemUgPSAwOworICAgICAgICAgICAgICAgIGlmIChyaWUuaXNJbmRleGVkKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMaXN0PEluZGV4SW5mbz4gaW5kZXggPSByaWUuY29sdW1uc0luZGV4KCk7CisKKyAgICAgICAgICAgICAgICAgICAgaW5kZXhlZFNpemUgKz0gVHlwZVNpemVzLnNpemVvZlVuc2lnbmVkVkludChyaWUuaGVhZGVyTGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICBpbmRleGVkU2l6ZSArPSBEZWxldGlvblRpbWUuc2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShyaWUuZGVsZXRpb25UaW1lKCkpOworICAgICAgICAgICAgICAgICAgICBpbmRleGVkU2l6ZSArPSBUeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50KGluZGV4LnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChJbmRleEluZm8gaW5mbyA6IGluZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhlZFNpemUgKz0gaWR4U2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShpbmZvKTsKKworICAgICAgICAgICAgICAgICAgICBpbmRleGVkU2l6ZSArPSBpbmRleC5zaXplKCkgKiBUeXBlU2l6ZXMuc2l6ZW9mKDApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBUeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50KHJpZS5wb3NpdGlvbikgKyBUeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50KGluZGV4ZWRTaXplKSArIGluZGV4ZWRTaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIGVudHJ5IGluIHRoZSByb3cgaW5kZXggZm9yIGEgcm93IHdob3NlIGNvbHVtbnMgYXJlIGluZGV4ZWQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBJbmRleGVkRW50cnkgZXh0ZW5kcyBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgRGVsZXRpb25UaW1lIGRlbGV0aW9uVGltZTsKKworICAgICAgICAgICAgLy8gVGhlIG9mZnNldCBpbiB0aGUgZmlsZSB3aGVuIHRoZSBpbmRleCBlbnRyeSBlbmQKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgbG9uZyBoZWFkZXJMZW5ndGg7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8SW5kZXhJbmZvPiBjb2x1bW5zSW5kZXg7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEJBU0VfU0laRSA9CisgICAgICAgICAgICBPYmplY3RTaXplcy5tZWFzdXJlKG5ldyBJbmRleGVkRW50cnkoMCwgRGVsZXRpb25UaW1lLkxJVkUsIDAsIEFycmF5cy5hc0xpc3QobnVsbCwgbnVsbCkpKQorICAgICAgICAgICAgKyBPYmplY3RTaXplcy5tZWFzdXJlKG5ldyBBcnJheUxpc3Q8PigxKSk7CisKKyAgICAgICAgICAgIHByaXZhdGUgSW5kZXhlZEVudHJ5KGxvbmcgcG9zaXRpb24sIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUsIGxvbmcgaGVhZGVyTGVuZ3RoLCBMaXN0PEluZGV4SW5mbz4gY29sdW1uc0luZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN1cGVyKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQgZGVsZXRpb25UaW1lICE9IG51bGw7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGNvbHVtbnNJbmRleCAhPSBudWxsICYmIGNvbHVtbnNJbmRleC5zaXplKCkgPiAxOworICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRpb25UaW1lID0gZGVsZXRpb25UaW1lOworICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyTGVuZ3RoID0gaGVhZGVyTGVuZ3RoOworICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uc0luZGV4ID0gY29sdW1uc0luZGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVsZXRpb25UaW1lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIGhlYWRlckxlbmd0aCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhlYWRlckxlbmd0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgTGlzdDxJbmRleEluZm8+IGNvbHVtbnNJbmRleCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbnNJbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgaW50IHByb21vdGVkU2l6ZShJbmRleEluZm8uU2VyaWFsaXplciBpZHhTZXJpYWxpemVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvbmcgc2l6ZSA9IFR5cGVTaXplcy5zaXplb2ZVbnNpZ25lZFZJbnQoaGVhZGVyTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoZGVsZXRpb25UaW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgVHlwZVNpemVzLnNpemVvZlVuc2lnbmVkVkludChjb2x1bW5zSW5kZXguc2l6ZSgpKTsgLy8gbnVtYmVyIG9mIGVudHJpZXMKKyAgICAgICAgICAgICAgICBmb3IgKEluZGV4SW5mbyBpbmZvIDogY29sdW1uc0luZGV4KQorICAgICAgICAgICAgICAgICAgICBzaXplICs9IGlkeFNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoaW5mbyk7CisKKyAgICAgICAgICAgICAgICBzaXplICs9IGNvbHVtbnNJbmRleC5zaXplKCkgKiBUeXBlU2l6ZXMuc2l6ZW9mKDApOworCisgICAgICAgICAgICAgICAgcmV0dXJuIEludHMuY2hlY2tlZENhc3Qoc2l6ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGxvbmcgdW5zaGFyZWRIZWFwU2l6ZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9uZyBlbnRyeVNpemUgPSAwOworICAgICAgICAgICAgICAgIGZvciAoSW5kZXhJbmZvIGlkeCA6IGNvbHVtbnNJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgZW50cnlTaXplICs9IGlkeC51bnNoYXJlZEhlYXBTaXplKCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFTRV9TSVpFCisgICAgICAgICAgICAgICAgICAgICAgICsgZW50cnlTaXplCisgICAgICAgICAgICAgICAgICAgICAgICsgZGVsZXRpb25UaW1lLnVuc2hhcmVkSGVhcFNpemUoKQorICAgICAgICAgICAgICAgICAgICAgICArIE9iamVjdFNpemVzLnNpemVPZlJlZmVyZW5jZUFycmF5KGNvbHVtbnNJbmRleC5zaXplKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5kZXhGb3IoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIERlbGV0aW9uVGltZSBkZWxldGlvbkluZm8gPSBuZXcgRGVsZXRpb25UaW1lKEZCVXRpbGl0aWVzLnRpbWVzdGFtcE1pY3JvcygpLCBGQlV0aWxpdGllcy5ub3dJblNlY29uZHMoKSk7CisKKyAgICAgICAgTGlzdDxJbmRleEluZm8+IGluZGV4ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgaW5kZXhlcy5hZGQobmV3IEluZGV4SW5mbyhjbigwTCksIGNuKDVMKSwgMCwgMCwgZGVsZXRpb25JbmZvKSk7CisgICAgICAgIGluZGV4ZXMuYWRkKG5ldyBJbmRleEluZm8oY24oMTBMKSwgY24oMTVMKSwgMCwgMCwgZGVsZXRpb25JbmZvKSk7CisgICAgICAgIGluZGV4ZXMuYWRkKG5ldyBJbmRleEluZm8oY24oMjBMKSwgY24oMjVMKSwgMCwgMCwgZGVsZXRpb25JbmZvKSk7CisKKyAgICAgICAgUm93SW5kZXhFbnRyeSByaWUgPSBuZXcgUm93SW5kZXhFbnRyeSgwTCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIEluZGV4SW5mb1JldHJpZXZlciBvcGVuV2l0aEluZGV4KEZpbGVIYW5kbGUgaW5kZXhGaWxlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhJbmZvUmV0cmlldmVyKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJbmRleEluZm8gY29sdW1uc0luZGV4KGludCBpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ZXMuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludCBibG9ja0NvdW50KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhlcy5zaXplKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIAorICAgICAgICBJbmRleFN0YXRlIGluZGV4U3RhdGUgPSBuZXcgSW5kZXhTdGF0ZSgKKyAgICAgICAgICAgIG51bGwsIGNvbXAsIHJpZSwgZmFsc2UsIG51bGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICk7CisgICAgICAgIAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigtMUwpLCAtMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaW5kZXhTdGF0ZS5pbmRleEZvcihjbig1TCksIC0xKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDEyTCksIC0xKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDE3TCksIC0xKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDEwMEwpLCAtMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigxMDBMKSwgMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigxMDBMKSwgMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigxMDBMKSwgMikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigxMDBMKSwgMykpOworCisgICAgICAgIGluZGV4U3RhdGUgPSBuZXcgSW5kZXhTdGF0ZSgKKyAgICAgICAgICAgIG51bGwsIGNvbXAsIHJpZSwgdHJ1ZSwgbnVsbAorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygtMSwgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigtMUwpLCAtMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaW5kZXhTdGF0ZS5pbmRleEZvcihjbig1TCksIDMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGluZGV4U3RhdGUuaW5kZXhGb3IoY24oNUwpLCAyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDE3TCksIDMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGluZGV4U3RhdGUuaW5kZXhGb3IoY24oMTAwTCksIDMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGluZGV4U3RhdGUuaW5kZXhGb3IoY24oMTAwTCksIDQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGluZGV4U3RhdGUuaW5kZXhGb3IoY24oMTJMKSwgMykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigxMkwpLCAyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDEwMEwpLCAxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDEwMEwpLCAyKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9WZXJzaW9uU3VwcG9ydGVkRmVhdHVyZXNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL1ZlcnNpb25TdXBwb3J0ZWRGZWF0dXJlc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzRiOTllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9WZXJzaW9uU3VwcG9ydGVkRmVhdHVyZXNUZXN0LmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LkFic3RyYWN0VGVzdFZlcnNpb25TdXBwb3J0ZWRGZWF0dXJlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uOworCitwdWJsaWMgY2xhc3MgVmVyc2lvblN1cHBvcnRlZEZlYXR1cmVzVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdFZlcnNpb25TdXBwb3J0ZWRGZWF0dXJlcworeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBWZXJzaW9uIGdldFZlcnNpb24oU3RyaW5nIHYpCisgICAgeworICAgICAgICByZXR1cm4gQmlnRm9ybWF0LmdldEluc3RhbmNlKCkuZ2V0VmVyc2lvbih2KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyZWFtPFN0cmluZz4gZ2V0UGVuZGluZ1JlcGFpclN1cHBvcnRlZFZlcnNpb25zKCkKKyAgICB7CisgICAgICAgIHJldHVybiByYW5nZSgibmEiLCAienoiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyZWFtPFN0cmluZz4gZ2V0UGFydGl0aW9uTGV2ZWxEZWxldGlvblByZXNlbmNlTWFya2VyU3VwcG9ydGVkVmVyc2lvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJhbmdlKCJuYyIsICJ6eiIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJlYW08U3RyaW5nPiBnZXRMZWdhY3lNaW5NYXhTdXBwb3J0ZWRWZXJzaW9ucygpCisgICAgeworICAgICAgICByZXR1cm4gcmFuZ2UoIm1hIiwgIm56Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmVhbTxTdHJpbmc+IGdldEltcHJvdmVkTWluTWF4U3VwcG9ydGVkVmVyc2lvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJhbmdlKCJuYyIsICJ6eiIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJlYW08U3RyaW5nPiBnZXRLZXlSYW5nZVN1cHBvcnRlZFZlcnNpb25zKCkKKyAgICB7CisgICAgICAgIHJldHVybiByYW5nZSgibmMiLCAienoiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyZWFtPFN0cmluZz4gZ2V0T3JpZ2luYXRpbmdIb3N0SWRTdXBwb3J0ZWRWZXJzaW9ucygpCisgICAgeworICAgICAgICByZXR1cm4gU3RyZWFtLmNvbmNhdChyYW5nZSgibWUiLCAibXoiKSwgcmFuZ2UoIm5iIiwgInp6IikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvUGFydGl0aW9uSW5kZXhUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1BhcnRpdGlvbkluZGV4VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMjRjZWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1BhcnRpdGlvbkluZGV4VGVzdC5qYXZhCkBAIC0wLDAgKzEsODg4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5idGk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5TdGFuZGFyZE9wZW5PcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0YWJsZUZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRMb2NhbFJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkhhc2hNdWx0aXNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTXVsdGlzZXQ7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuQ2h1bmtDYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5CeXRlT3JkZXJlZFBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmRvbVBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzLlRyaWVOb2RlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzLldhbGtlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUGFnZUF3YXJlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmVidWZmZXJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNlcXVlbnRpYWxXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuV3JhcHBpbmdSZWJ1ZmZlcmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uc0ZvckNsYXNzVHlwZXMuYXNzZXJ0VGhhdFRocm93bkJ5OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgUGFydGl0aW9uSW5kZXhUZXN0Cit7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFBhcnRpdGlvbkluZGV4VGVzdC5jbGFzcyk7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIFNFRUQgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbShTRUVEKTsKKworICAgIHN0YXRpYyBmaW5hbCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIFZFUlNJT04gPSBXYWxrZXIuQllURV9DT01QQVJBQkxFX1ZFUlNJT047CisKKyAgICBzdGF0aWMKKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSBVdGlsLnRlc3RQYXJ0aXRpb25lcigpOworICAgIC8vTG93ZXIgdGhlIHNpemUgb2YgdGhlIGluZGV4ZXMgd2hlbiBydW5uaW5nIHdpdGhvdXQgdGhlIGNodW5rIGNhY2hlLCBvdGhlcndpc2UgdGhlIHRlc3QgdGltZXMgb3V0IG9uIEplbmtpbnMKKyAgICBzdGF0aWMgZmluYWwgaW50IENPVU5UID0gQ2h1bmtDYWNoZS5pbnN0YW5jZSAhPSBudWxsID8gMjQ1MjU2IDogMjQ1MjU7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKCkKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IGdlbmVyYXRlRGF0YSgpCisgICAgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W117IENvbmZpZy5EaXNrQWNjZXNzTW9kZS5zdGFuZGFyZCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IENvbmZpZy5EaXNrQWNjZXNzTW9kZS5tbWFwIH0pOworICAgIH0KKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcih2YWx1ZSA9IDApCisgICAgcHVibGljIHN0YXRpYyBDb25maWcuRGlza0FjY2Vzc01vZGUgYWNjZXNzTW9kZSA9IENvbmZpZy5EaXNrQWNjZXNzTW9kZS5zdGFuZGFyZDsKKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpCisgICAgeworICAgICAgICBsb2dnZXIuaW5mbygiVXNpbmcgcmFuZG9tIHNlZWQ6IHt9IiwgU0VFRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgbGFzdC1ub2Rlcy1zaXppbmcgZmFpbHVyZSB1bmNvdmVyZWQgZHVyaW5nIGNvZGUgcmV2aWV3LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpemluZ0J1ZygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBDT1VOVDsgaSAqPSAxMCkKKyAgICAgICAgeworICAgICAgICAgICAgdGVzdEdldEVxKGdlbmVyYXRlUmFuZG9tSW5kZXgoaSkpOworICAgICAgICAgICAgdGVzdEdldEVxKGdlbmVyYXRlU2VxdWVudGlhbEluZGV4KGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEVxKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0ZXN0R2V0RXEoZ2VuZXJhdGVSYW5kb21JbmRleChDT1VOVCkpOworICAgICAgICB0ZXN0R2V0RXEoZ2VuZXJhdGVTZXF1ZW50aWFsSW5kZXgoQ09VTlQpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCcm9rZW5GaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBwdXQgc29tZSBnYXJiYWdlIGluIHRoZSBmaWxlCisgICAgICAgIGZpbmFsIFBhaXI8TGlzdDxEZWNvcmF0ZWRLZXk+LCBQYXJ0aXRpb25JbmRleD4gZGF0YSA9IGdlbmVyYXRlUmFuZG9tSW5kZXgoQ09VTlQpOworICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShkYXRhLnJpZ2h0LmdldEZpbGVIYW5kbGUoKS5wYXRoKCkpOworICAgICAgICB0cnkgKEZpbGVDaGFubmVsIGNoID0gRmlsZUNoYW5uZWwub3BlbihmLnRvUGF0aCgpLCBTdGFuZGFyZE9wZW5PcHRpb24uV1JJVEUpKQorICAgICAgICB7CisgICAgICAgICAgICBjaC53cml0ZShnZW5lcmF0ZVJhbmRvbUtleSgpLmdldEtleSgpLCBmLmxlbmd0aCgpICogMiAvIDMpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IHRlc3RHZXRFcShkYXRhKSkuaXNJbnN0YW5jZU9mQW55KEFzc2VydGlvbkVycm9yLmNsYXNzLCBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLmNsYXNzLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvbmdLZXlzKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0ZXN0R2V0RXEoZ2VuZXJhdGVMb25nS2V5c0luZGV4KENPVU5UIC8gMTApKTsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RHZXRFcShQYWlyPExpc3Q8RGVjb3JhdGVkS2V5PiwgUGFydGl0aW9uSW5kZXg+IGRhdGEpCisgICAgeworICAgICAgICBMaXN0PERlY29yYXRlZEtleT4ga2V5cyA9IGRhdGEubGVmdDsKKyAgICAgICAgdHJ5IChQYXJ0aXRpb25JbmRleCBzdW1tYXJ5ID0gZGF0YS5yaWdodDsKKyAgICAgICAgICAgICBQYXJ0aXRpb25JbmRleC5SZWFkZXIgcmVhZGVyID0gc3VtbWFyeS5vcGVuUmVhZGVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZWZ0LnNpemUoKTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCByZWFkZXIuZXhhY3RDYW5kaWRhdGUoa2V5cy5nZXQoaSkpKTsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gZ2VuZXJhdGVSYW5kb21LZXkoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXEoa2V5cywga2V5KSwgZXEoa2V5cywga2V5LCByZWFkZXIuZXhhY3RDYW5kaWRhdGUoa2V5KSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0R3QoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRlc3RHZXRHdChnZW5lcmF0ZVJhbmRvbUluZGV4KENPVU5UKSk7CisgICAgICAgIHRlc3RHZXRHdChnZW5lcmF0ZVNlcXVlbnRpYWxJbmRleChDT1VOVCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0R2V0R3QoUGFpcjxMaXN0PERlY29yYXRlZEtleT4sIFBhcnRpdGlvbkluZGV4PiBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIExpc3Q8RGVjb3JhdGVkS2V5PiBrZXlzID0gZGF0YS5sZWZ0OworICAgICAgICB0cnkgKFBhcnRpdGlvbkluZGV4IHN1bW1hcnkgPSBkYXRhLnJpZ2h0OworICAgICAgICAgICAgIFBhcnRpdGlvbkluZGV4LlJlYWRlciByZWFkZXIgPSBzdW1tYXJ5Lm9wZW5SZWFkZXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlZnQuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGkgPCBkYXRhLmxlZnQuc2l6ZSgpIC0gMSA/IGkgKyAxIDogLTEsIGd0KGtleXMsIGtleXMuZ2V0KGkpLCByZWFkZXIpKTsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gZ2VuZXJhdGVSYW5kb21LZXkoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZ3Qoa2V5cywga2V5KSwgZ3Qoa2V5cywga2V5LCByZWFkZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEdlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0ZXN0R2V0R2UoZ2VuZXJhdGVSYW5kb21JbmRleChDT1VOVCkpOworICAgICAgICB0ZXN0R2V0R2UoZ2VuZXJhdGVTZXF1ZW50aWFsSW5kZXgoQ09VTlQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0R2UoUGFpcjxMaXN0PERlY29yYXRlZEtleT4sIFBhcnRpdGlvbkluZGV4PiBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIExpc3Q8RGVjb3JhdGVkS2V5PiBrZXlzID0gZGF0YS5sZWZ0OworICAgICAgICB0cnkgKFBhcnRpdGlvbkluZGV4IHN1bW1hcnkgPSBkYXRhLnJpZ2h0OworICAgICAgICAgICAgIFBhcnRpdGlvbkluZGV4LlJlYWRlciByZWFkZXIgPSBzdW1tYXJ5Lm9wZW5SZWFkZXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlZnQuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIGdlKGtleXMsIGtleXMuZ2V0KGkpLCByZWFkZXIpKTsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gZ2VuZXJhdGVSYW5kb21LZXkoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZ2Uoa2V5cywga2V5KSwgZ2Uoa2V5cywga2V5LCByZWFkZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0THQoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRlc3RHZXRMdChnZW5lcmF0ZVJhbmRvbUluZGV4KENPVU5UKSk7CisgICAgICAgIHRlc3RHZXRMdChnZW5lcmF0ZVNlcXVlbnRpYWxJbmRleChDT1VOVCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMdChQYWlyPExpc3Q8RGVjb3JhdGVkS2V5PiwgUGFydGl0aW9uSW5kZXg+IGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgTGlzdDxEZWNvcmF0ZWRLZXk+IGtleXMgPSBkYXRhLmxlZnQ7CisgICAgICAgIHRyeSAoUGFydGl0aW9uSW5kZXggc3VtbWFyeSA9IGRhdGEucmlnaHQ7CisgICAgICAgICAgICAgUGFydGl0aW9uSW5kZXguUmVhZGVyIHJlYWRlciA9IHN1bW1hcnkub3BlblJlYWRlcigpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVmdC5zaXplKCk7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSAtIDEsIGx0KGtleXMsIGtleXMuZ2V0KGkpLCByZWFkZXIpKTsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gZ2VuZXJhdGVSYW5kb21LZXkoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobHQoa2V5cywga2V5KSwgbHQoa2V5cywga2V5LCByZWFkZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgbG9uZyBndChMaXN0PERlY29yYXRlZEtleT4ga2V5cywgRGVjb3JhdGVkS2V5IGtleSwgUGFydGl0aW9uSW5kZXguUmVhZGVyIHN1bW1hcnkpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoc3VtbWFyeS5jZWlsaW5nKGtleSwgKHBvcywgYXNzdW1lTm9NYXRjaCwgc2spIC0+IChhc3N1bWVOb01hdGNoIHx8IGtleXMuZ2V0KChpbnQpIHBvcykuY29tcGFyZVRvKHNrKSA+IDApID8gcG9zIDogbnVsbCkpLm9yRWxzZSgtMUwpOworICAgIH0KKworICAgIHByaXZhdGUgbG9uZyBnZShMaXN0PERlY29yYXRlZEtleT4ga2V5cywgRGVjb3JhdGVkS2V5IGtleSwgUGFydGl0aW9uSW5kZXguUmVhZGVyIHN1bW1hcnkpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoc3VtbWFyeS5jZWlsaW5nKGtleSwgKHBvcywgYXNzdW1lTm9NYXRjaCwgc2spIC0+IChhc3N1bWVOb01hdGNoIHx8IGtleXMuZ2V0KChpbnQpIHBvcykuY29tcGFyZVRvKHNrKSA+PSAwKSA/IHBvcyA6IG51bGwpKS5vckVsc2UoLTFMKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgbG9uZyBsdChMaXN0PERlY29yYXRlZEtleT4ga2V5cywgRGVjb3JhdGVkS2V5IGtleSwgUGFydGl0aW9uSW5kZXguUmVhZGVyIHN1bW1hcnkpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoc3VtbWFyeS5mbG9vcihrZXksIChwb3MsIGFzc3VtZU5vTWF0Y2gsIHNrKSAtPiAoYXNzdW1lTm9NYXRjaCB8fCBrZXlzLmdldCgoaW50KSBwb3MpLmNvbXBhcmVUbyhzaykgPCAwKSA/IHBvcyA6IG51bGwpKS5vckVsc2UoLTFMKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgZXEoTGlzdDxEZWNvcmF0ZWRLZXk+IGtleXMsIERlY29yYXRlZEtleSBrZXksIGxvbmcgZXhhY3RDYW5kaWRhdGUpCisgICAgeworICAgICAgICBpbnQgaWR4ID0gKGludCkgZXhhY3RDYW5kaWRhdGU7CisgICAgICAgIGlmIChleGFjdENhbmRpZGF0ZSA9PSBQYXJ0aXRpb25JbmRleC5OT1RfRk9VTkQpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiAoa2V5cy5nZXQoaWR4KS5lcXVhbHMoa2V5KSkgPyBpZHggOiAtMTsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgZ3QoTGlzdDxEZWNvcmF0ZWRLZXk+IGtleXMsIERlY29yYXRlZEtleSBrZXkpCisgICAgeworICAgICAgICBpbnQgaW5kZXggPSBDb2xsZWN0aW9ucy5iaW5hcnlTZWFyY2goa2V5cywga2V5KTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgIGluZGV4ID0gLTEgLSBpbmRleDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKytpbmRleDsKKyAgICAgICAgcmV0dXJuIGluZGV4IDwga2V5cy5zaXplKCkgPyBpbmRleCA6IC0xOworICAgIH0KKworICAgIHByaXZhdGUgbG9uZyBsdChMaXN0PERlY29yYXRlZEtleT4ga2V5cywgRGVjb3JhdGVkS2V5IGtleSkKKyAgICB7CisgICAgICAgIGludCBpbmRleCA9IENvbGxlY3Rpb25zLmJpbmFyeVNlYXJjaChrZXlzLCBrZXkpOworCisgICAgICAgIGlmIChpbmRleCA8IDApCisgICAgICAgICAgICBpbmRleCA9IC1pbmRleCAtIDI7CisKKyAgICAgICAgcmV0dXJuIGluZGV4ID49IDAgPyBpbmRleCA6IC0xOworICAgIH0KKworICAgIHByaXZhdGUgbG9uZyBnZShMaXN0PERlY29yYXRlZEtleT4ga2V5cywgRGVjb3JhdGVkS2V5IGtleSkKKyAgICB7CisgICAgICAgIGludCBpbmRleCA9IENvbGxlY3Rpb25zLmJpbmFyeVNlYXJjaChrZXlzLCBrZXkpOworICAgICAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICAgICAgaW5kZXggPSAtMSAtIGluZGV4OworICAgICAgICByZXR1cm4gaW5kZXggPCBrZXlzLnNpemUoKSA/IGluZGV4IDogLTE7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGVxKExpc3Q8RGVjb3JhdGVkS2V5PiBrZXlzLCBEZWNvcmF0ZWRLZXkga2V5KQorICAgIHsKKyAgICAgICAgaW50IGluZGV4ID0gQ29sbGVjdGlvbnMuYmluYXJ5U2VhcmNoKGtleXMsIGtleSk7CisgICAgICAgIHJldHVybiBpbmRleCA+PSAwID8gaW5kZXggOiAtMTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRFbXB0eUtleSgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIElQYXJ0aXRpb25lciBwID0gbmV3IFJhbmRvbVBhcnRpdGlvbmVyKCk7CisgICAgICAgIEZpbGUgZmlsZSA9IEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZSgiQ29sdW1uVHJpZVJlYWRlclRlc3QiLCAiIik7CisKKyAgICAgICAgRmlsZUhhbmRsZS5CdWlsZGVyIGZoQnVpbGRlciA9IG1ha2VIYW5kbGUoZmlsZSk7CisgICAgICAgIHRyeSAoU2VxdWVudGlhbFdyaXRlciB3cml0ZXIgPSBtYWtlV3JpdGVyKGZpbGUpOworICAgICAgICAgICAgIFBhcnRpdGlvbkluZGV4QnVpbGRlciBidWlsZGVyID0gbmV3IFBhcnRpdGlvbkluZGV4QnVpbGRlcih3cml0ZXIsIGZoQnVpbGRlcikKKyAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gcC5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5FTVBUWV9CWVRFX0JVRkZFUik7CisgICAgICAgICAgICBidWlsZGVyLmFkZEVudHJ5KGtleSwgNDIpOworICAgICAgICAgICAgYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICAgICAgdHJ5IChQYXJ0aXRpb25JbmRleCBzdW1tYXJ5ID0gbG9hZFBhcnRpdGlvbkluZGV4KGZoQnVpbGRlciwgd3JpdGVyKTsKKyAgICAgICAgICAgICAgICAgUGFydGl0aW9uSW5kZXguUmVhZGVyIHJlYWRlciA9IHN1bW1hcnkub3BlblJlYWRlcigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBzdW1tYXJ5LnNpemUoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQyLCByZWFkZXIuZ2V0TGFzdEluZGV4UG9zaXRpb24oKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQyLCByZWFkZXIuZXhhY3RDYW5kaWRhdGUoa2V5KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJdGVyYXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFBhaXI8TGlzdDxEZWNvcmF0ZWRLZXk+LCBQYXJ0aXRpb25JbmRleD4gcmFuZG9tID0gZ2VuZXJhdGVSYW5kb21JbmRleChDT1VOVCk7CisgICAgICAgIGNoZWNrSXRlcmF0aW9uKHJhbmRvbS5sZWZ0LnNpemUoKSwgcmFuZG9tLnJpZ2h0KTsKKyAgICAgICAgcmFuZG9tLnJpZ2h0LmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2hlY2tJdGVyYXRpb24oaW50IGtleXNTaXplLCBQYXJ0aXRpb25JbmRleCBpbmRleCkKKyAgICB7CisgICAgICAgIHRyeSAoUGFydGl0aW9uSW5kZXggZW5mb3JjZUluZGV4Q2xvc2luZyA9IGluZGV4OworICAgICAgICAgICAgIFBhcnRpdGlvbkluZGV4LkluZGV4UG9zSXRlcmF0b3IgaXRlciA9IGluZGV4LmFsbEtleXNJdGVyYXRvcigpKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIHBvcyA9IGl0ZXIubmV4dEluZGV4UG9zKCk7CisgICAgICAgICAgICAgICAgaWYgKHBvcyA9PSBQYXJ0aXRpb25JbmRleC5OT1RfRk9VTkQpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCBwb3MpOworICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhrZXlzU2l6ZSwgaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJhaW5lZEl0ZXJhdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUGFpcjxMaXN0PERlY29yYXRlZEtleT4sIFBhcnRpdGlvbkluZGV4PiByYW5kb20gPSBnZW5lcmF0ZVJhbmRvbUluZGV4KENPVU5UKTsKKyAgICAgICAgdHJ5IChQYXJ0aXRpb25JbmRleCBzdW1tYXJ5ID0gcmFuZG9tLnJpZ2h0KQorICAgICAgICB7CisgICAgICAgICAgICBMaXN0PERlY29yYXRlZEtleT4ga2V5cyA9IHJhbmRvbS5sZWZ0OworICAgICAgICAgICAgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhhY3RMZWZ0ID0gcmFuZC5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhhY3RSaWdodCA9IHJhbmQubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgbGVmdCA9IGV4YWN0TGVmdCA/IGtleXMuZ2V0KHJhbmQubmV4dEludChrZXlzLnNpemUoKSkpIDogZ2VuZXJhdGVSYW5kb21LZXkoKTsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgcmlnaHQgPSBleGFjdFJpZ2h0ID8ga2V5cy5nZXQocmFuZC5uZXh0SW50KGtleXMuc2l6ZSgpKSkgOiBnZW5lcmF0ZVJhbmRvbUtleSgpOworICAgICAgICAgICAgICAgIGlmIChyaWdodC5jb21wYXJlVG8obGVmdCkgPCAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IHQgPSBsZWZ0OworICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gcmlnaHQ7CisgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gdDsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBiID0gZXhhY3RMZWZ0OworICAgICAgICAgICAgICAgICAgICBleGFjdExlZnQgPSBleGFjdFJpZ2h0OworICAgICAgICAgICAgICAgICAgICBleGFjdFJpZ2h0ID0gYjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0cnkgKFBhcnRpdGlvbkluZGV4LkluZGV4UG9zSXRlcmF0b3IgaXRlciA9IG5ldyBQYXJ0aXRpb25JbmRleC5JbmRleFBvc0l0ZXJhdG9yKHN1bW1hcnksIGxlZnQsIHJpZ2h0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgcCA9IGl0ZXIubmV4dEluZGV4UG9zKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwID09IFBhcnRpdGlvbkluZGV4Lk5PVF9GT1VORCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IChpbnQpIGdlKGtleXMsIGxlZnQpOyAvLyBmaXJzdCBncmVhdGVyIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUobGVmdCArICIgPD0gIiArIGtleXMuZ2V0KGlkeCkgKyAiIDw9ICIgKyByaWdodCArICIgYnV0ICIgKyBpZHggKyAiIHdhc24ndCBpdGVyYXRlZC4iLCByaWdodC5jb21wYXJlVG8oa2V5cy5nZXQoaWR4KSkgPCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IChpbnQpIHA7CisgICAgICAgICAgICAgICAgICAgIGlmIChwID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUobGVmdC5jb21wYXJlVG8oa2V5cy5nZXQoaWR4IC0gMSkpID4gMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwIDwga2V5cy5zaXplKCkgLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsZWZ0LmNvbXBhcmVUbyhrZXlzLmdldChpZHggKyAxKSkgPCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4YWN0TGVmdCkgICAgICAvLyBtdXN0IGJlIHByZWNpc2Ugb24gZXhhY3QsIG90aGVyd2lzZSBjb3VsZCBiZSBpbiBhbnkgcmVsYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFNhbWUobGVmdCwga2V5cy5nZXQoaWR4KSk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICArK2lkeDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcG9zID0gaXRlci5uZXh0SW5kZXhQb3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPT0gUGFydGl0aW9uSW5kZXguTk9UX0ZPVU5EKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGlkeCwgcG9zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAtLWlkeDsgLy8gc2VlayBhdCBsYXN0IHJldHVybmVkCisgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPCBrZXlzLnNpemUoKSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJpZ2h0LmNvbXBhcmVUbyhrZXlzLmdldChpZHggKyAxKSkgPCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJpZ2h0LmNvbXBhcmVUbyhrZXlzLmdldChpZHggLSAxKSkgPiAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4YWN0UmlnaHQpICAgICAgLy8gbXVzdCBiZSBwcmVjaXNlIG9uIGV4YWN0LCBvdGhlcndpc2UgY291bGQgYmUgaW4gYW55IHJlbGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRTYW1lKHJpZ2h0LCBrZXlzLmdldChpZHgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEFzc2VydGlvbkVycm9yIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiTGVmdCAlcyVzIFJpZ2h0ICVzJXMlbiIsIGxlZnQuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhWRVJTSU9OKSwgZXhhY3RMZWZ0ID8gIiMiIDogIiIsIHJpZ2h0LmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVkVSU0lPTiksIGV4YWN0UmlnaHQgPyAiIyIgOiAiIikpOworICAgICAgICAgICAgICAgICAgICB0cnkgKFBhcnRpdGlvbkluZGV4LkluZGV4UG9zSXRlcmF0b3IgaXRlcjIgPSBuZXcgUGFydGl0aW9uSW5kZXguSW5kZXhQb3NJdGVyYXRvcihzdW1tYXJ5LCBsZWZ0LCByaWdodCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcG9zOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChwb3MgPSBpdGVyMi5uZXh0SW5kZXhQb3MoKSkgIT0gUGFydGl0aW9uSW5kZXguTk9UX0ZPVU5EKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoa2V5cy5nZXQoKGludCkgcG9zKS5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKFZFUlNJT04pKS5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKFN0cmluZy5mb3JtYXQoIkxlZnQgJXMlcyBSaWdodCAlcyVzJW4iLCBsZWZ0LmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVkVSU0lPTiksIGV4YWN0TGVmdCA/ICIjIiA6ICIiLCByaWdodC5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKFZFUlNJT04pLCBleGFjdFJpZ2h0ID8gIiMiIDogIiIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYnVmLnRvU3RyaW5nKCksIGUpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcnRpYWxJbmRleCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZm9yIChpbnQgcmVwcyA9IDA7IHJlcHMgPCAxMDsgKytyZXBzKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBGaWxlVXRpbHMuY3JlYXRlVGVtcEZpbGUoIkNvbHVtblRyaWVSZWFkZXJUZXN0IiwgIiIpOworICAgICAgICAgICAgTGlzdDxEZWNvcmF0ZWRLZXk+IGxpc3QgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGludCBwYXJ0cyA9IDE1OworICAgICAgICAgICAgRmlsZUhhbmRsZS5CdWlsZGVyIGZoQnVpbGRlciA9IG1ha2VIYW5kbGUoZmlsZSk7CisgICAgICAgICAgICB0cnkgKFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyID0gbWFrZVdyaXRlcihmaWxlKTsKKyAgICAgICAgICAgICAgICAgUGFydGl0aW9uSW5kZXhCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUGFydGl0aW9uSW5kZXhCdWlsZGVyKHdyaXRlciwgZmhCdWlsZGVyKQorICAgICAgICAgICAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlci5zZXRQb3N0Rmx1c2hMaXN0ZW5lcigoKSAtPiBidWlsZGVyLm1hcmtQYXJ0aXRpb25JbmRleFN5bmNlZCh3cml0ZXIuZ2V0TGFzdEZsdXNoT2Zmc2V0KCkpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IENPVU5UOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gZ2VuZXJhdGVSYW5kb21MZW5ndGhLZXkoKTsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoa2V5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0KTsKKyAgICAgICAgICAgICAgICBBdG9taWNJbnRlZ2VyIGNhbGxDb3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisKKyAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgcGFydCA9IDE7IHBhcnQgPD0gcGFydHM7ICsrcGFydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgQ09VTlQgKiBwYXJ0IC8gcGFydHM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkRW50cnkobGlzdC5nZXQoaSksIGkpOworCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgYWRkZWRTaXplID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5idWlsZFBhcnRpYWwoaW5kZXggLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4U2l6ZSA9IENvbGxlY3Rpb25zLmJpbmFyeVNlYXJjaChsaXN0LCBpbmRleC5sYXN0S2V5KCkpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBpbmRleFNpemUgPj0gYWRkZWRTaXplIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrSXRlcmF0aW9uKGluZGV4U2l6ZSwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbENvdW50LmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAwLCBpICogMTAyNEwpOworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLm1hcmtEYXRhU3luY2VkKGkgKiAxMDI0TCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHZlcmlmaWVyIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHNlcXVlbnRpYWxXcml0ZXIgZmluaXNoZXMgYSBjaHVuaworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgQ09VTlQ7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGRFbnRyeShsaXN0LmdldChpKSwgaSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICAgICAgICAgIHRyeSAoUGFydGl0aW9uSW5kZXggaW5kZXggPSBsb2FkUGFydGl0aW9uSW5kZXgoZmhCdWlsZGVyLCB3cml0ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tJdGVyYXRpb24obGlzdC5zaXplKCksIGluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKENPVU5UIC8gcGFydHMgPiAxNjAwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiRXhwZWN0ZWQgJWQgb3IgJWQgY2FsbHMsIGdvdCAlZCIsIHBhcnRzLCBwYXJ0cyAtIDEsIGNhbGxDb3VudC5nZXQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbENvdW50LmdldCgpID09IHBhcnRzIC0gMSB8fCBjYWxsQ291bnQuZ2V0KCkgPT0gcGFydHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlZXBSZWN1cnNpb24oKQorICAgIHsKKyAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gZnV0dXJlID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPD4oKTsKKyAgICAgICAgLy8gQ2hlY2sgdGhhdCBsb25nIHJlcGVhdGVkIHN0cmluZ3MgZG9uJ3QgY2F1c2Ugc3RhY2sgb3ZlcmZsb3cKKyAgICAgICAgLy8gVGVzdCBib3RoIG5vcm1hbCBjb21wbGV0aW9uIGFuZCBwYXJ0aWFsIGNvbnN0cnVjdGlvbi4KKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG51bGwsICgpIC0+CisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZSgiQ29sdW1uVHJpZVJlYWRlclRlc3QiLCAiIik7CisgICAgICAgICAgICAgICAgU2VxdWVudGlhbFdyaXRlciB3cml0ZXIgPSBuZXcgU2VxdWVudGlhbFdyaXRlcihmaWxlLCBTZXF1ZW50aWFsV3JpdGVyT3B0aW9uLm5ld0J1aWxkZXIoKS5maW5pc2hPbkNsb3NlKHRydWUpLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgIExpc3Q8RGVjb3JhdGVkS2V5PiBsaXN0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxvbmdTdHJpbmcgPSAiIjsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFBhZ2VBd2FyZS5QQUdFX1NJWkUgKyA5OTsgKytpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9uZ1N0cmluZyArPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSBCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLmluc3RhbmNlOworICAgICAgICAgICAgICAgIGxpc3QuYWRkKHBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKGxvbmdTdHJpbmcgKyAiQSIpKSk7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQocGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMobG9uZ1N0cmluZyArICJCIikpKTsKKyAgICAgICAgICAgICAgICBsaXN0LmFkZChwYXJ0aXRpb25lci5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5ieXRlcyhsb25nU3RyaW5nICsgIkMiKSkpOworICAgICAgICAgICAgICAgIGxpc3QuYWRkKHBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKGxvbmdTdHJpbmcgKyAiRCIpKSk7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQocGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMobG9uZ1N0cmluZyArICJFIikpKTsKKworICAgICAgICAgICAgICAgIEZpbGVIYW5kbGUuQnVpbGRlciBmaEJ1aWxkZXIgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKGZpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWZmZXJTaXplKFBhZ2VBd2FyZS5QQUdFX1NJWkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ2h1bmtDYWNoZShDaHVua0NhY2hlLmluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICB0cnkgKFBhcnRpdGlvbkluZGV4QnVpbGRlciBidWlsZGVyID0gbmV3IFBhcnRpdGlvbkluZGV4QnVpbGRlcih3cml0ZXIsIGZoQnVpbGRlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpCisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZEVudHJ5KGxpc3QuZ2V0KGkpLCBpKTsKKworICAgICAgICAgICAgICAgICAgICB3cml0ZXIuc2V0UG9zdEZsdXNoTGlzdGVuZXIoKCkgLT4gYnVpbGRlci5tYXJrUGFydGl0aW9uSW5kZXhTeW5jZWQod3JpdGVyLmdldExhc3RGbHVzaE9mZnNldCgpKSk7CisgICAgICAgICAgICAgICAgICAgIEF0b21pY0ludGVnZXIgY2FsbENvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYWRkZWRTaXplID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5idWlsZFBhcnRpYWwoaW5kZXggLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4U2l6ZSA9IENvbGxlY3Rpb25zLmJpbmFyeVNlYXJjaChsaXN0LCBpbmRleC5sYXN0S2V5KCkpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBpbmRleFNpemUgPj0gYWRkZWRTaXplIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrSXRlcmF0aW9uKGluZGV4U2l6ZSwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXguY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxDb3VudC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMCwgaSAqIDEwMjRMKTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IGxpc3Quc2l6ZSgpOyArK2kpCisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZEVudHJ5KGxpc3QuZ2V0KGkpLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5jb21wbGV0ZSgpOworCisgICAgICAgICAgICAgICAgICAgIHRyeSAoUGFydGl0aW9uSW5kZXggaW5kZXggPSBQYXJ0aXRpb25JbmRleC5sb2FkKGZoQnVpbGRlciwgcGFydGl0aW9uZXIsIHRydWUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0l0ZXJhdGlvbihsaXN0LnNpemUoKSwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZ1dHVyZS5jb21wbGV0ZShudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZXJyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZ1dHVyZS5jb21wbGV0ZUV4Y2VwdGlvbmFsbHkoZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgInRlc3RUaHJlYWQiLCAzMiAqIDEwMjQpOworCisgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgZnV0dXJlLmpvaW4oKTsKKyAgICB9CisKKyAgICBjbGFzcyBKdW1waW5nRmlsZSBleHRlbmRzIFNlcXVlbnRpYWxXcml0ZXIKKyAgICB7CisgICAgICAgIGxvbmdbXSBjdXRvZmZzOworICAgICAgICBsb25nW10gb2Zmc2V0czsKKworICAgICAgICBKdW1waW5nRmlsZShGaWxlIGZpbGUsIFNlcXVlbnRpYWxXcml0ZXJPcHRpb24gb3B0aW9uLCBsb25nLi4uIGN1dG9mZnNBbmRPZmZzZXRzKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihmaWxlLCBvcHRpb24pOworICAgICAgICAgICAgYXNzZXJ0IChjdXRvZmZzQW5kT2Zmc2V0cy5sZW5ndGggJiAxKSA9PSAwOworICAgICAgICAgICAgY3V0b2ZmcyA9IG5ldyBsb25nW2N1dG9mZnNBbmRPZmZzZXRzLmxlbmd0aCAvIDJdOworICAgICAgICAgICAgb2Zmc2V0cyA9IG5ldyBsb25nW2N1dG9mZnMubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3V0b2Zmcy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXRvZmZzW2ldID0gY3V0b2Zmc0FuZE9mZnNldHNbaSAqIDJdOworICAgICAgICAgICAgICAgIG9mZnNldHNbaV0gPSBjdXRvZmZzQW5kT2Zmc2V0c1tpICogMiArIDFdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIHBvc2l0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGp1bXBlZChzdXBlci5wb3NpdGlvbigpLCBjdXRvZmZzLCBvZmZzZXRzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIEp1bXBpbmdSZWJ1ZmZlcmVyIGV4dGVuZHMgV3JhcHBpbmdSZWJ1ZmZlcmVyCisgICAgeworICAgICAgICBsb25nW10gY3V0b2ZmczsKKyAgICAgICAgbG9uZ1tdIG9mZnNldHM7CisKKyAgICAgICAgSnVtcGluZ1JlYnVmZmVyZXIoUmVidWZmZXJlciBzb3VyY2UsIGxvbmcuLi4gY3V0b2Zmc0FuZE9mZnNldHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKHNvdXJjZSk7CisgICAgICAgICAgICBhc3NlcnQgKGN1dG9mZnNBbmRPZmZzZXRzLmxlbmd0aCAmIDEpID09IDA7CisgICAgICAgICAgICBjdXRvZmZzID0gbmV3IGxvbmdbY3V0b2Zmc0FuZE9mZnNldHMubGVuZ3RoIC8gMl07CisgICAgICAgICAgICBvZmZzZXRzID0gbmV3IGxvbmdbY3V0b2Zmcy5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjdXRvZmZzLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1dG9mZnNbaV0gPSBjdXRvZmZzQW5kT2Zmc2V0c1tpICogMl07CisgICAgICAgICAgICAgICAgb2Zmc2V0c1tpXSA9IGN1dG9mZnNBbmRPZmZzZXRzW2kgKiAyICsgMV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1ZmZlckhvbGRlciByZWJ1ZmZlcihsb25nIHBvc2l0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIHBvczsKKworICAgICAgICAgICAgaW50IGlkeCA9IEFycmF5cy5iaW5hcnlTZWFyY2gob2Zmc2V0cywgcG9zaXRpb24pOworICAgICAgICAgICAgaWYgKGlkeCA8IDApCisgICAgICAgICAgICAgICAgaWR4ID0gLTIgLSBpZHg7CisgICAgICAgICAgICBwb3MgPSBwb3NpdGlvbjsKKyAgICAgICAgICAgIGlmIChpZHggPj0gMCkKKyAgICAgICAgICAgICAgICBwb3MgPSBwb3MgLSBvZmZzZXRzW2lkeF0gKyBjdXRvZmZzW2lkeF07CisKKyAgICAgICAgICAgIHN1cGVyLnJlYnVmZmVyKHBvcyk7CisKKyAgICAgICAgICAgIGlmIChpZHggPCBjdXRvZmZzLmxlbmd0aCAtIDEgJiYgYnVmZmVyLmxpbWl0KCkgKyBvZmZzZXQgPiBjdXRvZmZzW2lkeCArIDFdKQorICAgICAgICAgICAgICAgIGJ1ZmZlci5saW1pdCgoaW50KSAoY3V0b2Zmc1tpZHggKyAxXSAtIG9mZnNldCkpOworICAgICAgICAgICAgaWYgKGlkeCA+PSAwKQorICAgICAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldCAtIGN1dG9mZnNbaWR4XSArIG9mZnNldHNbaWR4XTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZmlsZUxlbmd0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBqdW1wZWQod3JhcHBlZC5maWxlTGVuZ3RoKCksIGN1dG9mZnMsIG9mZnNldHMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQXJyYXlzLnRvU3RyaW5nKGN1dG9mZnMpICsgQXJyYXlzLnRvU3RyaW5nKG9mZnNldHMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFBhcnRpdGlvbkluZGV4SnVtcGluZyBleHRlbmRzIFBhcnRpdGlvbkluZGV4CisgICAgeworICAgICAgICBmaW5hbCBsb25nW10gY3V0b2Zmc0FuZE9mZnNldHM7CisKKyAgICAgICAgcHVibGljIFBhcnRpdGlvbkluZGV4SnVtcGluZyhGaWxlSGFuZGxlIGZoLCBsb25nIHRyaWVSb290LCBsb25nIGtleUNvdW50LCBEZWNvcmF0ZWRLZXkgZmlyc3QsIERlY29yYXRlZEtleSBsYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcuLi4gY3V0b2Zmc0FuZE9mZnNldHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGZoLCB0cmllUm9vdCwga2V5Q291bnQsIGZpcnN0LCBsYXN0KTsKKyAgICAgICAgICAgIHRoaXMuY3V0b2Zmc0FuZE9mZnNldHMgPSBjdXRvZmZzQW5kT2Zmc2V0czsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgUmVidWZmZXJlciBpbnN0YW50aWF0ZVJlYnVmZmVyZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEp1bXBpbmdSZWJ1ZmZlcmVyKHN1cGVyLmluc3RhbnRpYXRlUmVidWZmZXJlcigpLCBjdXRvZmZzQW5kT2Zmc2V0cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsb25nIGp1bXBlZChsb25nIHBvcywgbG9uZ1tdIGN1dG9mZnMsIGxvbmdbXSBvZmZzZXRzKQorICAgIHsKKyAgICAgICAgaW50IGlkeCA9IEFycmF5cy5iaW5hcnlTZWFyY2goY3V0b2ZmcywgcG9zKTsKKyAgICAgICAgaWYgKGlkeCA8IDApCisgICAgICAgICAgICBpZHggPSAtMiAtIGlkeDsKKyAgICAgICAgaWYgKGlkeCA8IDApCisgICAgICAgICAgICByZXR1cm4gcG9zOworICAgICAgICByZXR1cm4gcG9zIC0gY3V0b2Zmc1tpZHhdICsgb2Zmc2V0c1tpZHhdOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvaW50ZXJHcm93dGgoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGZvciAoaW50IHJlcHMgPSAwOyByZXBzIDwgMTA7ICsrcmVwcykKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZSBmaWxlID0gRmlsZVV0aWxzLmNyZWF0ZVRlbXBGaWxlKCJDb2x1bW5UcmllUmVhZGVyVGVzdCIsICIiKTsKKyAgICAgICAgICAgIGxvbmdbXSBjdXRvZmZzQW5kT2Zmc2V0cyA9IG5ldyBsb25nW117CisgICAgICAgICAgICAyICogNDA5NiwgMUwgPDwgMTYsCisgICAgICAgICAgICA0ICogNDA5NiwgMUwgPDwgMjQsCisgICAgICAgICAgICA2ICogNDA5NiwgMUwgPDwgMzEsCisgICAgICAgICAgICA4ICogNDA5NiwgMUwgPDwgMzIsCisgICAgICAgICAgICAxMCAqIDQwOTYsIDFMIDw8IDMzLAorICAgICAgICAgICAgMTIgKiA0MDk2LCAxTCA8PCAzNCwKKyAgICAgICAgICAgIDE0ICogNDA5NiwgMUwgPDwgNDAsCisgICAgICAgICAgICAxNiAqIDQwOTYsIDFMIDw8IDQyCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBMaXN0PERlY29yYXRlZEtleT4gbGlzdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgICAgICAgRmlsZUhhbmRsZS5CdWlsZGVyIGZoQnVpbGRlciA9IG1ha2VIYW5kbGUoZmlsZSk7CisgICAgICAgICAgICB0cnkgKFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyID0gbWFrZUp1bXBpbmdXcml0ZXIoZmlsZSwgY3V0b2Zmc0FuZE9mZnNldHMpOworICAgICAgICAgICAgICAgICBQYXJ0aXRpb25JbmRleEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQYXJ0aXRpb25JbmRleEJ1aWxkZXIod3JpdGVyLCBmaEJ1aWxkZXIpCisgICAgICAgICAgICApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnNldFBvc3RGbHVzaExpc3RlbmVyKCgpIC0+IGJ1aWxkZXIubWFya1BhcnRpdGlvbkluZGV4U3luY2VkKHdyaXRlci5nZXRMYXN0Rmx1c2hPZmZzZXQoKSkpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ09VTlQ7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBnZW5lcmF0ZVJhbmRvbUtleSgpOworICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChrZXkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QpOworCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBDT1VOVDsgKytpKQorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZEVudHJ5KGxpc3QuZ2V0KGkpLCBpKTsKKyAgICAgICAgICAgICAgICBsb25nIHJvb3QgPSBidWlsZGVyLmNvbXBsZXRlKCk7CisKKyAgICAgICAgICAgICAgICB0cnkgKEZpbGVIYW5kbGUgZmggPSBmaEJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgICAgICAgICAgICAgIFBhcnRpdGlvbkluZGV4IGluZGV4ID0gbmV3IFBhcnRpdGlvbkluZGV4SnVtcGluZyhmaCwgcm9vdCwgQ09VTlQsIG51bGwsIG51bGwsIGN1dG9mZnNBbmRPZmZzZXRzKTsKKyAgICAgICAgICAgICAgICAgICAgIEFuYWx5emVyIGFuYWx5emVyID0gbmV3IEFuYWx5emVyKGluZGV4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrSXRlcmF0aW9uKGxpc3Quc2l6ZSgpLCBpbmRleCk7CisKKyAgICAgICAgICAgICAgICAgICAgYW5hbHl6ZXIucnVuKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbmFseXplci5jb3VudFBlclR5cGUuZWxlbWVudFNldCgpLnNpemUoKSA8IDcpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKCJFeHBlY3RpbmcgYXQgbGVhc3QgNyBkaWZmZXJlbnQgbm9kZSB0eXBlcywgZ290ICIgKyBhbmFseXplci5jb3VudFBlclR5cGUuZWxlbWVudFNldCgpLnNpemUoKSArICJcbiIgKyBhbmFseXplci5jb3VudFBlclR5cGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHVtcFRyaWVUb0ZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIEZpbGUgZmlsZSA9IEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZSgidGVzdER1bXBUcmllVG9GaWxlIiwgImluZGV4Iik7CisKKyAgICAgICAgQXJyYXlMaXN0PERlY29yYXRlZEtleT4gbGlzdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgICBGaWxlSGFuZGxlLkJ1aWxkZXIgZmhCdWlsZGVyID0gbWFrZUhhbmRsZShmaWxlKTsKKyAgICAgICAgdHJ5IChTZXF1ZW50aWFsV3JpdGVyIHdyaXRlciA9IG5ldyBTZXF1ZW50aWFsV3JpdGVyKGZpbGUsIFNlcXVlbnRpYWxXcml0ZXJPcHRpb24uREVGQVVMVCk7CisgICAgICAgICAgICAgUGFydGl0aW9uSW5kZXhCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUGFydGl0aW9uSW5kZXhCdWlsZGVyKHdyaXRlciwgZmhCdWlsZGVyKQorICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlci5zZXRQb3N0Rmx1c2hMaXN0ZW5lcigoKSAtPiBidWlsZGVyLm1hcmtQYXJ0aXRpb25JbmRleFN5bmNlZCh3cml0ZXIuZ2V0TGFzdEZsdXNoT2Zmc2V0KCkpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBnZW5lcmF0ZVJhbmRvbUtleSgpOworICAgICAgICAgICAgICAgIGxpc3QuYWRkKGtleSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7ICsraSkKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFkZEVudHJ5KGxpc3QuZ2V0KGkpLCBpKTsKKyAgICAgICAgICAgIGxvbmcgcm9vdCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKworICAgICAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gZmhCdWlsZGVyLmNvbXBsZXRlKCk7CisgICAgICAgICAgICAgICAgIFBhcnRpdGlvbkluZGV4IGluZGV4ID0gbmV3IFBhcnRpdGlvbkluZGV4KGZoLCByb290LCAxMDAwLCBudWxsLCBudWxsKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxlIGR1bXAgPSBGaWxlVXRpbHMuY3JlYXRlVGVtcEZpbGUoInRlc3REdW1wVHJpZVRvRmlsZSIsICJkdW1wZWRUcmllIik7CisgICAgICAgICAgICAgICAgaW5kZXguZHVtcFRyaWUoZHVtcC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZHVtcENvbnRlbnQgPSBTdHJpbmcuam9pbigiXG4iLCBGaWxlcy5yZWFkQWxsTGluZXMoZHVtcC50b1BhdGgoKSkpOworICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJEdW1wZWQgdHJpZTogXG57fSIsIGR1bXBDb250ZW50KTsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShkdW1wQ29udGVudC5pc0VtcHR5KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbmFseXplciBleHRlbmRzIFBhcnRpdGlvbkluZGV4LlJlYWRlcgorICAgIHsKKyAgICAgICAgTXVsdGlzZXQ8VHJpZU5vZGU+IGNvdW50UGVyVHlwZSA9IEhhc2hNdWx0aXNldC5jcmVhdGUoKTsKKworICAgICAgICBwdWJsaWMgQW5hbHl6ZXIoUGFydGl0aW9uSW5kZXggaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJ1bihyb290KTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcnVuKGxvbmcgbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgZ28obm9kZSk7CisKKyAgICAgICAgICAgIGNvdW50UGVyVHlwZS5hZGQobm9kZVR5cGUpOworCisgICAgICAgICAgICBpbnQgdHIgPSB0cmFuc2l0aW9uUmFuZ2UoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHI7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIGNoaWxkID0gdHJhbnNpdGlvbihpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGQgPT0gTk9ORSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgcnVuKGNoaWxkKTsKKyAgICAgICAgICAgICAgICBnbyhub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBQYWlyPExpc3Q8RGVjb3JhdGVkS2V5PiwgUGFydGl0aW9uSW5kZXg+IGdlbmVyYXRlUmFuZG9tSW5kZXgoaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRlSW5kZXgoc2l6ZSwgdGhpczo6Z2VuZXJhdGVSYW5kb21LZXkpOworICAgIH0KKworICAgIFBhaXI8TGlzdDxEZWNvcmF0ZWRLZXk+LCBQYXJ0aXRpb25JbmRleD4gZ2VuZXJhdGVMb25nS2V5c0luZGV4KGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmF0ZUluZGV4KHNpemUsIHRoaXM6OmdlbmVyYXRlTG9uZ0tleSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBQYWlyPExpc3Q8RGVjb3JhdGVkS2V5PiwgUGFydGl0aW9uSW5kZXg+IGdlbmVyYXRlU2VxdWVudGlhbEluZGV4KGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmF0ZUluZGV4KHNpemUsIG5ldyBTdXBwbGllcjxEZWNvcmF0ZWRLZXk+KCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBpID0gMDsKKworICAgICAgICAgICAgcHVibGljIERlY29yYXRlZEtleSBnZXQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzZXF1ZW50aWFsS2V5KGkrKyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIFBhaXI8TGlzdDxEZWNvcmF0ZWRLZXk+LCBQYXJ0aXRpb25JbmRleD4gZ2VuZXJhdGVJbmRleChpbnQgc2l6ZSwgU3VwcGxpZXI8RGVjb3JhdGVkS2V5PiBrZXlHZW5lcmF0b3IpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRmlsZSBmaWxlID0gRmlsZVV0aWxzLmNyZWF0ZVRlbXBGaWxlKCJDb2x1bW5UcmllUmVhZGVyVGVzdCIsICIiKTsKKyAgICAgICAgTGlzdDxEZWNvcmF0ZWRLZXk+IGxpc3QgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgRmlsZUhhbmRsZS5CdWlsZGVyIGZoQnVpbGRlciA9IG1ha2VIYW5kbGUoZmlsZSk7CisgICAgICAgIHRyeSAoU2VxdWVudGlhbFdyaXRlciB3cml0ZXIgPSBtYWtlV3JpdGVyKGZpbGUpOworICAgICAgICAgICAgIFBhcnRpdGlvbkluZGV4QnVpbGRlciBidWlsZGVyID0gbmV3IFBhcnRpdGlvbkluZGV4QnVpbGRlcih3cml0ZXIsIGZoQnVpbGRlcikKKyAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0ga2V5R2VuZXJhdG9yLmdldCgpOworICAgICAgICAgICAgICAgIGxpc3QuYWRkKGtleSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFkZEVudHJ5KGxpc3QuZ2V0KGkpLCBpKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuY29tcGxldGUoKTsKKworICAgICAgICAgICAgUGFydGl0aW9uSW5kZXggc3VtbWFyeSA9IGxvYWRQYXJ0aXRpb25JbmRleChmaEJ1aWxkZXIsIHdyaXRlcik7CisKKyAgICAgICAgICAgIHJldHVybiBQYWlyLmNyZWF0ZShsaXN0LCBzdW1tYXJ5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIERlY29yYXRlZEtleSBnZW5lcmF0ZVJhbmRvbUtleSgpCisgICAgeworICAgICAgICBVVUlEIHV1aWQgPSBuZXcgVVVJRChyYW5kb20ubmV4dExvbmcoKSwgcmFuZG9tLm5leHRMb25nKCkpOworICAgICAgICByZXR1cm4gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXModXVpZCkpOworICAgIH0KKworICAgIERlY29yYXRlZEtleSBnZW5lcmF0ZVJhbmRvbUxlbmd0aEtleSgpCisgICAgeworICAgICAgICBSYW5kb20gcmFuZCA9IFRocmVhZExvY2FsUmFuZG9tLmN1cnJlbnQoKTsKKyAgICAgICAgaW50IGxlbmd0aCA9IG5leHRQb3dlclJhbmRvbShyYW5kLCAxMDAsIDEwLCAyKTsgICAgIC8vIGZhdm9yIGxvbmcgc3RyaW5ncworICAgICAgICBTdHJpbmdCdWlsZGVyIHMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKQorICAgICAgICAgICAgcy5hcHBlbmQoYWxwaGFiZXQuY2hhckF0KG5leHRQb3dlclJhbmRvbShyYW5kLCAwLCBhbHBoYWJldC5sZW5ndGgoKSwgMikpKTsgLy8gZmF2b3IgY2xhc2hlcyBhdCBhCisKKyAgICAgICAgcmV0dXJuIHBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKHMudG9TdHJpbmcoKSkpOworICAgIH0KKworICAgIERlY29yYXRlZEtleSBnZW5lcmF0ZUxvbmdLZXkoKQorICAgIHsKKyAgICAgICAgUmFuZG9tIHJhbmQgPSBUaHJlYWRMb2NhbFJhbmRvbS5jdXJyZW50KCk7CisgICAgICAgIGludCBsZW5ndGggPSBuZXh0UG93ZXJSYW5kb20ocmFuZCwgMTAwMDAsIDIwMDAsIDIpOyAgICAgLy8gZmF2b3IgbG9uZyBzdHJpbmdzCisgICAgICAgIFN0cmluZ0J1aWxkZXIgcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpCisgICAgICAgICAgICBzLmFwcGVuZChhbHBoYWJldC5jaGFyQXQobmV4dFBvd2VyUmFuZG9tKHJhbmQsIDAsIGFscGhhYmV0Lmxlbmd0aCgpLCAyKSkpOyAvLyBmYXZvciBjbGFzaGVzIGF0IGEKKworICAgICAgICByZXR1cm4gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMocy50b1N0cmluZygpKSk7CisgICAgfQorCisgICAgaW50IG5leHRQb3dlclJhbmRvbShSYW5kb20gcmFuZCwgaW50IHgwLCBpbnQgeDEsIGRvdWJsZSBwb3dlcikKKyAgICB7CisgICAgICAgIGRvdWJsZSByID0gTWF0aC5wb3cocmFuZC5uZXh0RG91YmxlKCksIHBvd2VyKTsKKyAgICAgICAgcmV0dXJuIHgwICsgKGludCkgKCh4MSAtIHgwKSAqIHIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBhbHBoYWJldCA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjsKKworICAgIERlY29yYXRlZEtleSBzZXF1ZW50aWFsS2V5KGxvbmcgaSkKKyAgICB7CisgICAgICAgIFN0cmluZyBzID0gIiI7CisgICAgICAgIGZvciAoaW50IGogPSA1MDsgaiA+PSAwOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBwID0gKGludCkgTWF0aC5wb3coMTAsIGopOworICAgICAgICAgICAgaW50IGlkeCA9IChpbnQpICgoaiArIGkpIC8gcCk7CisgICAgICAgICAgICBzICs9IGFscGhhYmV0LmNoYXJBdChpZHggJSBhbHBoYWJldC5sZW5ndGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKHMpKTsKKyAgICB9CisKKworICAgIHByb3RlY3RlZCBTZXF1ZW50aWFsV3JpdGVyIG1ha2VXcml0ZXIoRmlsZSBmaWxlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTZXF1ZW50aWFsV3JpdGVyKGZpbGUsIFNlcXVlbnRpYWxXcml0ZXJPcHRpb24ubmV3QnVpbGRlcigpLmZpbmlzaE9uQ2xvc2UoZmFsc2UpLmJ1aWxkKCkpOworICAgIH0KKworICAgIHB1YmxpYyBTZXF1ZW50aWFsV3JpdGVyIG1ha2VKdW1waW5nV3JpdGVyKEZpbGUgZmlsZSwgbG9uZ1tdIGN1dG9mZnNBbmRPZmZzZXRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKdW1waW5nRmlsZShmaWxlLCBTZXF1ZW50aWFsV3JpdGVyT3B0aW9uLm5ld0J1aWxkZXIoKS5maW5pc2hPbkNsb3NlKHRydWUpLmJ1aWxkKCksIGN1dG9mZnNBbmRPZmZzZXRzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRmlsZUhhbmRsZS5CdWlsZGVyIG1ha2VIYW5kbGUoRmlsZSBmaWxlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZmlsZSkKKyAgICAgICAgICAgICAgIC5idWZmZXJTaXplKFBhZ2VBd2FyZS5QQUdFX1NJWkUpCisgICAgICAgICAgICAgICAubW1hcHBlZChhY2Nlc3NNb2RlID09IENvbmZpZy5EaXNrQWNjZXNzTW9kZS5tbWFwKQorICAgICAgICAgICAgICAgLndpdGhDaHVua0NhY2hlKENodW5rQ2FjaGUuaW5zdGFuY2UpOworICAgIH0KKworICAgIHByb3RlY3RlZCBQYXJ0aXRpb25JbmRleCBsb2FkUGFydGl0aW9uSW5kZXgoRmlsZUhhbmRsZS5CdWlsZGVyIGZoQnVpbGRlciwgU2VxdWVudGlhbFdyaXRlciB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIFBhcnRpdGlvbkluZGV4LmxvYWQoZmhCdWlsZGVyLCBwYXJ0aXRpb25lciwgZmFsc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvUm93SW5kZXhUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1Jvd0luZGV4VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1OWY2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1Jvd0luZGV4VGVzdC5qYXZhCkBAIC0wLDAgKzEsNTE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5idGk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0JvdW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdDb21wYXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdQcmVmaXg7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25UaW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVVJRFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpLlJvd0luZGV4UmVhZGVyLkluZGV4SW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby50cmllcy5XYWxrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmFuZG9tQWNjZXNzUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNlcXVlbnRpYWxXcml0ZXJPcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIFJvd0luZGV4VGVzdAoreworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihSb3dJbmRleFRlc3QuY2xhc3MpOworCisgICAgc3RhdGljIGZpbmFsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gVkVSU0lPTiA9IFdhbGtlci5CWVRFX0NPTVBBUkFCTEVfVkVSU0lPTjsKKworICAgIHN0YXRpYyBmaW5hbCBSYW5kb20gUkFORE9NOworCisgICAgc3RhdGljCisgICAgeworICAgICAgICBsb25nIHNlZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oInNlZWQgPSAiICsgc2VlZCk7CisgICAgICAgIFJBTkRPTSA9IG5ldyBSYW5kb20oc2VlZCk7CisKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBuZXcgQ2x1c3RlcmluZ0NvbXBhcmF0b3IoVVVJRFR5cGUuaW5zdGFuY2UpOworICAgIHN0YXRpYyBmaW5hbCBsb25nIEVORF9NQVJLRVIgPSAxTCA8PCA0MDsKKyAgICBzdGF0aWMgZmluYWwgaW50IENPVU5UID0gODE5MjsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMoKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gZ2VuZXJhdGVEYXRhKCkKKyAgICB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXXsgQ29uZmlnLkRpc2tBY2Nlc3NNb2RlLnN0YW5kYXJkIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgQ29uZmlnLkRpc2tBY2Nlc3NNb2RlLm1tYXAgfSk7CisgICAgfQorCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyKHZhbHVlID0gMCkKKyAgICBwdWJsaWMgc3RhdGljIENvbmZpZy5EaXNrQWNjZXNzTW9kZSBhY2Nlc3NNb2RlID0gQ29uZmlnLkRpc2tBY2Nlc3NNb2RlLnN0YW5kYXJkOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9ucygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUGFpcjxMaXN0PENsdXN0ZXJpbmdQcmVmaXg8Pz4+LCBSb3dJbmRleFJlYWRlcj4gcmFuZG9tID0gZ2VuZXJhdGVSYW5kb21JbmRleFNpbmdsZXRvbnMoQ09VTlQpOworICAgICAgICBSb3dJbmRleFJlYWRlciBzdW1tYXJ5ID0gcmFuZG9tLnJpZ2h0OworICAgICAgICBMaXN0PENsdXN0ZXJpbmdQcmVmaXg8Pz4+IGtleXMgPSByYW5kb20ubGVmdDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBDT1VOVDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSwgc3VtbWFyeS5zZXBhcmF0b3JGbG9vcihjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUoa2V5cy5nZXQoaSkpKS5vZmZzZXQpOworICAgICAgICB9CisgICAgICAgIHN1bW1hcnkuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTcGFucygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUGFpcjxMaXN0PENsdXN0ZXJpbmdQcmVmaXg8Pz4+LCBSb3dJbmRleFJlYWRlcj4gcmFuZG9tID0gZ2VuZXJhdGVSYW5kb21JbmRleFF1YWRzKENPVU5UKTsKKyAgICAgICAgUm93SW5kZXhSZWFkZXIgc3VtbWFyeSA9IHJhbmRvbS5yaWdodDsKKyAgICAgICAgTGlzdDxDbHVzdGVyaW5nUHJlZml4PD8+PiBrZXlzID0gcmFuZG9tLmxlZnQ7CisgICAgICAgIGludCBtaXNzQ291bnQgPSAwOworICAgICAgICBJbmRleEluZm8gaWk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ09VTlQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhlc2UgbmVlZCB0byBhbGwgYmUgd2l0aGluIHRoZSBzcGFuCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSwgKGlpID0gc3VtbWFyeS5zZXBhcmF0b3JGbG9vcihjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUoa2V5cy5nZXQoNCAqIGkgKyAxKSkpKS5vZmZzZXQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIHN1bW1hcnkuc2VwYXJhdG9yRmxvb3IoY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKGtleXMuZ2V0KDQgKiBpICsgMikpKS5vZmZzZXQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIHN1bW1hcnkuc2VwYXJhdG9yRmxvb3IoY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKGtleXMuZ2V0KDQgKiBpICsgMykpKS5vZmZzZXQpOworCisgICAgICAgICAgICAvLyBjaGVjayBvdGhlciBkYXRhCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArIDIsIGlpLm9wZW5EZWxldGlvbi5tYXJrZWRGb3JEZWxldGVBdCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpIC0gMywgaWkub3BlbkRlbGV0aW9uLmxvY2FsRGVsZXRpb25UaW1lKCkpOworCisgICAgICAgICAgICAvLyBiZWZvcmUgZW50cnkuIGhvcGVmdWxseSBoZXJlLCBidXQgY291bGQgZW5kIHVwIGluIHByZXYgaWYgbWF0Y2hlcyBwcmV2TWF4IHRvbyB3ZWxsCisgICAgICAgICAgICBpaSA9IHN1bW1hcnkuc2VwYXJhdG9yRmxvb3IoY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKGtleXMuZ2V0KDQgKiBpKSkpOworICAgICAgICAgICAgaWYgKGlpLm9mZnNldCAhPSBpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrbWlzc0NvdW50OworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpIC0gMSwgaWkub2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpaSA9IHN1bW1hcnkuc2VwYXJhdG9yRmxvb3IoY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKGtleXMuZ2V0KDQgKiBDT1VOVCkpKTsKKyAgICAgICAgaWYgKGlpLm9mZnNldCAhPSBFTkRfTUFSS0VSKQorICAgICAgICB7CisgICAgICAgICAgICArK21pc3NDb3VudDsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhDT1VOVCAtIDEsIGlpLm9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgaWkgPSBzdW1tYXJ5LnNlcGFyYXRvckZsb29yKGNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShDbHVzdGVyaW5nQm91bmQuQk9UVE9NKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBpaS5vZmZzZXQpOworCisgICAgICAgIGlpID0gc3VtbWFyeS5zZXBhcmF0b3JGbG9vcihjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUoQ2x1c3RlcmluZ0JvdW5kLlRPUCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRU5EX01BUktFUiwgaWkub2Zmc2V0KTsKKworICAgICAgICBzdW1tYXJ5LmNsb3NlKCk7CisgICAgICAgIGlmIChtaXNzQ291bnQgPiBDT1VOVCAvIDUpCisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlVuZXhwZWN0ZWRseSBoaWdoIG1pc3MgY291bnQ6IHt9L3t9IiwgbWlzc0NvdW50LCBDT1VOVCk7CisgICAgfQorCisgICAgRmlsZSBmaWxlOworICAgIERhdGFPdXRwdXRTdHJlYW1QbHVzIGRvczsKKyAgICBSb3dJbmRleFdyaXRlciB3cml0ZXI7CisgICAgRmlsZUhhbmRsZSBmaDsKKyAgICBsb25nIHJvb3Q7CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCBjbGVhblVwKCkKKyAgICB7CisgICAgICAgIEZpbGVVdGlscy5jbG9zZVF1aWV0bHkoZG9zKTsKKyAgICAgICAgRmlsZVV0aWxzLmNsb3NlUXVpZXRseSh3cml0ZXIpOworICAgICAgICBGaWxlVXRpbHMuY2xvc2VRdWlldGx5KGZoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUm93SW5kZXhUZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0aGlzKEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZSgiQ29sdW1uVHJpZVJlYWRlclRlc3QiLCAiIikpOworICAgIH0KKworICAgIFJvd0luZGV4VGVzdChGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGhpcyhmaWxlLCBuZXcgU2VxdWVudGlhbFdyaXRlcihmaWxlLCBTZXF1ZW50aWFsV3JpdGVyT3B0aW9uLm5ld0J1aWxkZXIoKS5maW5pc2hPbkNsb3NlKHRydWUpLmJ1aWxkKCkpKTsKKyAgICB9CisKKyAgICBSb3dJbmRleFRlc3QoRmlsZSBmaWxlLCBEYXRhT3V0cHV0U3RyZWFtUGx1cyBkb3MpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICAgICAgdGhpcy5kb3MgPSBkb3M7CisKKyAgICAgICAgLy8gd3JpdGUgc29tZSBqdW5rCisgICAgICAgIGRvcy53cml0ZVVURigiSlVOSyIpOworICAgICAgICBkb3Mud3JpdGVVVEYoIkpVTksiKTsKKworICAgICAgICB3cml0ZXIgPSBuZXcgUm93SW5kZXhXcml0ZXIoY29tcGFyYXRvciwgZG9zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcm9vdCA9IHdyaXRlci5jb21wbGV0ZShFTkRfTUFSS0VSKTsKKyAgICAgICAgZG9zLndyaXRlVVRGKCJKVU5LIik7CisgICAgICAgIGRvcy53cml0ZVVURigiSlVOSyIpOworICAgICAgICBkb3MuY2xvc2UoKTsKKyAgICAgICAgZG9zID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgUm93SW5kZXhSZWFkZXIgY29tcGxldGVBbmRSZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBjb21wbGV0ZSgpOworCisgICAgICAgIEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmaWxlKS5tbWFwcGVkKGFjY2Vzc01vZGUgPT0gQ29uZmlnLkRpc2tBY2Nlc3NNb2RlLm1tYXApOworICAgICAgICBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgdHJ5IChSYW5kb21BY2Nlc3NSZWFkZXIgcmRyID0gZmguY3JlYXRlUmVhZGVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSlVOSyIsIHJkci5yZWFkVVRGKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJKVU5LIiwgcmRyLnJlYWRVVEYoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBSb3dJbmRleFJlYWRlcihmaCwgcm9vdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkRW1wdHlLZXkoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBDbHVzdGVyaW5nUHJlZml4PD8+IGtleSA9IENsdXN0ZXJpbmcuRU1QVFk7CisgICAgICAgIHdyaXRlci5hZGQoa2V5LCBrZXksIG5ldyBJbmRleEluZm8oNDIsIERlbGV0aW9uVGltZS5MSVZFKSk7CisgICAgICAgIHRyeSAoUm93SW5kZXhSZWFkZXIgc3VtbWFyeSA9IGNvbXBsZXRlQW5kUmVhZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBJbmRleEluZm8gaSA9IHN1bW1hcnkubWluKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNDIsIGkub2Zmc2V0KTsKKworICAgICAgICAgICAgaSA9IHN1bW1hcnkuc2VwYXJhdG9yRmxvb3IoY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKENsdXN0ZXJpbmdCb3VuZC5CT1RUT00pKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg0MiwgaS5vZmZzZXQpOworCisgICAgICAgICAgICBpID0gc3VtbWFyeS5zZXBhcmF0b3JGbG9vcihjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUoQ2x1c3RlcmluZ0JvdW5kLlRPUCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEVORF9NQVJLRVIsIGkub2Zmc2V0KTsKKworICAgICAgICAgICAgaSA9IHN1bW1hcnkuc2VwYXJhdG9yRmxvb3IoY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKGtleSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQyLCBpLm9mZnNldCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGREdXBsaWNhdGVFbXB0eVRocm93KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQ2x1c3RlcmluZ1ByZWZpeDw/PiBrZXkgPSBDbHVzdGVyaW5nLkVNUFRZOworICAgICAgICBUaHJvd2FibGUgdCA9IG51bGw7CisgICAgICAgIHdyaXRlci5hZGQoa2V5LCBrZXksIG5ldyBJbmRleEluZm8oNDIsIERlbGV0aW9uVGltZS5MSVZFKSk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZXIuYWRkKGtleSwga2V5LCBuZXcgSW5kZXhJbmZvKDQzLCBEZWxldGlvblRpbWUuTElWRSkpOworICAgICAgICAgICAgdHJ5IChSb3dJbmRleFJlYWRlciBzdW1tYXJ5ID0gY29tcGxldGVBbmRSZWFkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gZmFpbGluZyBwYXRoCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEFzc2VydGlvbkVycm9yIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGNvcnJlY3QgcGF0aAorICAgICAgICAgICAgdCA9IGU7CisgICAgICAgICAgICBsb2dnZXIuaW5mbygiR290ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoIlNob3VsZCB0aHJvdyBhbiBhc3NlcnRpb24gZXJyb3IuIiwgdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkRHVwbGljYXRlVGhyb3coKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBDbHVzdGVyaW5nUHJlZml4PD8+IGtleSA9IGdlbmVyYXRlUmFuZG9tS2V5KCk7CisgICAgICAgIFRocm93YWJsZSB0ID0gbnVsbDsKKyAgICAgICAgd3JpdGVyLmFkZChrZXksIGtleSwgbmV3IEluZGV4SW5mbyg0MiwgRGVsZXRpb25UaW1lLkxJVkUpKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlci5hZGQoa2V5LCBrZXksIG5ldyBJbmRleEluZm8oNDMsIERlbGV0aW9uVGltZS5MSVZFKSk7CisgICAgICAgICAgICB0cnkgKFJvd0luZGV4UmVhZGVyIHN1bW1hcnkgPSBjb21wbGV0ZUFuZFJlYWQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBmYWlsaW5nIHBhdGgKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY29ycmVjdCBwYXRoCisgICAgICAgICAgICB0ID0gZTsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJHb3QgIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiU2hvdWxkIHRocm93IGFuIGFzc2VydGlvbiBlcnJvci4iLCB0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRPdXRPZk9yZGVyVGhyb3coKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBDbHVzdGVyaW5nUHJlZml4PD8+IGtleTEgPSBnZW5lcmF0ZVJhbmRvbUtleSgpOworICAgICAgICBDbHVzdGVyaW5nUHJlZml4PD8+IGtleTIgPSBnZW5lcmF0ZVJhbmRvbUtleSgpOworICAgICAgICB3aGlsZSAoY29tcGFyYXRvci5jb21wYXJlKGtleTEsIGtleTIpIDw9IDApIC8vIG1ha2Uga2V5MiBzbWFsbGVyIHRoYW4gMQorICAgICAgICAgICAga2V5MiA9IGdlbmVyYXRlUmFuZG9tS2V5KCk7CisKKyAgICAgICAgVGhyb3dhYmxlIHQgPSBudWxsOworICAgICAgICB3cml0ZXIuYWRkKGtleTEsIGtleTEsIG5ldyBJbmRleEluZm8oNDIsIERlbGV0aW9uVGltZS5MSVZFKSk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZXIuYWRkKGtleTIsIGtleTIsIG5ldyBJbmRleEluZm8oNDMsIERlbGV0aW9uVGltZS5MSVZFKSk7CisgICAgICAgICAgICB0cnkgKFJvd0luZGV4UmVhZGVyIHN1bW1hcnkgPSBjb21wbGV0ZUFuZFJlYWQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBmYWlsaW5nIHBhdGgKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY29ycmVjdCBwYXRoCisgICAgICAgICAgICB0ID0gZTsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJHb3QgIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiU2hvdWxkIHRocm93IGFuIGFzc2VydGlvbiBlcnJvci4iLCB0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJhaW5lZEl0ZXJhdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gVGhpcyBpcyBub3QgdG9vIHJlbGV2YW50OiBkdWUgdG8gdGhlIHdheSB3ZSBjb25zdHJ1Y3Qgc2VwYXJhdG9ycyB3ZSBjYW4ndCBiZSBnb29kIGVub3VnaCBvbiB0aGUgbGVmdCBzaWRlLgorICAgICAgICBQYWlyPExpc3Q8Q2x1c3RlcmluZ1ByZWZpeDw/Pj4sIFJvd0luZGV4UmVhZGVyPiByYW5kb20gPSBnZW5lcmF0ZVJhbmRvbUluZGV4U2luZ2xldG9ucyhDT1VOVCk7CisgICAgICAgIExpc3Q8Q2x1c3RlcmluZ1ByZWZpeDw/Pj4ga2V5cyA9IHJhbmRvbS5sZWZ0OworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTAwOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZXhhY3RMZWZ0ID0gUkFORE9NLm5leHRCb29sZWFuKCk7CisgICAgICAgICAgICBib29sZWFuIGV4YWN0UmlnaHQgPSBSQU5ET00ubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Pz4gbGVmdCA9IGV4YWN0TGVmdCA/IGtleXMuZ2V0KFJBTkRPTS5uZXh0SW50KGtleXMuc2l6ZSgpKSkgOiBnZW5lcmF0ZVJhbmRvbUtleSgpOworICAgICAgICAgICAgQ2x1c3RlcmluZ1ByZWZpeDw/PiByaWdodCA9IGV4YWN0UmlnaHQgPyBrZXlzLmdldChSQU5ET00ubmV4dEludChrZXlzLnNpemUoKSkpIDogZ2VuZXJhdGVSYW5kb21LZXkoKTsKKyAgICAgICAgICAgIGlmIChjb21wYXJhdG9yLmNvbXBhcmUocmlnaHQsIGxlZnQpIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbHVzdGVyaW5nUHJlZml4PD8+IHQgPSBsZWZ0OworICAgICAgICAgICAgICAgIGxlZnQgPSByaWdodDsKKyAgICAgICAgICAgICAgICByaWdodCA9IHQ7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBiID0gZXhhY3RMZWZ0OworICAgICAgICAgICAgICAgIGV4YWN0TGVmdCA9IGV4YWN0UmlnaHQ7CisgICAgICAgICAgICAgICAgZXhhY3RSaWdodCA9IGI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSAoUm93SW5kZXhSZXZlcnNlSXRlcmF0b3IgaXRlciA9IG5ldyBSb3dJbmRleFJldmVyc2VJdGVyYXRvcihmaCwgcm9vdCwgY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKGxlZnQpLCBjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUocmlnaHQpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbmRleEluZm8gaW5kZXhJbmZvID0gaXRlci5uZXh0SW5kZXhJbmZvKCk7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4SW5mbyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IENvbGxlY3Rpb25zLmJpbmFyeVNlYXJjaChrZXlzLCByaWdodCwgY29tcGFyYXRvcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gLTIgLSBpZHg7IC8vIGxlc3MgdGhhbiBvciBlcXVhbAorICAgICAgICAgICAgICAgICAgICBpZiAoaWR4IDw9IDApCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUobGVmdCkgKyAiIDw9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShrZXlzLmdldChpZHgpKSArICIgPD0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKHJpZ2h0KSArICIgYnV0ICIgKyBpZHggKyAiIHdhc24ndCBpdGVyYXRlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmF0b3IuY29tcGFyZShsZWZ0LCBrZXlzLmdldChpZHggLSAxKSkgPiAwKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IGlkeCA9IChpbnQpIGluZGV4SW5mby5vZmZzZXQ7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4SW5mby5vZmZzZXQgPT0gRU5EX01BUktFUikKKyAgICAgICAgICAgICAgICAgICAgaWR4ID0ga2V5cy5zaXplKCk7CisgICAgICAgICAgICAgICAgaWYgKGlkeCA+IDApCisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyYXRvci5jb21wYXJlKHJpZ2h0LCBrZXlzLmdldChpZHggLSAxKSkgPiAwKTsKKyAgICAgICAgICAgICAgICBpZiAoaWR4IDwga2V5cy5zaXplKCkgLSAxKQorICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmF0b3IuY29tcGFyZShyaWdodCwga2V5cy5nZXQoaWR4ICsgMSkpIDwgMCk7CisgICAgICAgICAgICAgICAgaWYgKGV4YWN0UmlnaHQpICAgICAgLy8gbXVzdCBiZSBwcmVjaXNlIG9uIGV4YWN0LCBvdGhlcndpc2UgY291bGQgYmUgaW4gYW55IHJlbGF0aW9uCisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyaWdodCwga2V5cy5nZXQoaWR4KSk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAtLWlkeDsKKyAgICAgICAgICAgICAgICAgICAgSW5kZXhJbmZvIGlpID0gaXRlci5uZXh0SW5kZXhJbmZvKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpaSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpZHgsIChpbnQpIGlpLm9mZnNldCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICsraWR4OyAvLyBzZWVrIGF0IGxhc3QgcmV0dXJuZWQKKyAgICAgICAgICAgICAgICBpZiAoaWR4IDwga2V5cy5zaXplKCkgLSAxKQorICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmF0b3IuY29tcGFyZShsZWZ0LCBrZXlzLmdldChpZHggKyAxKSkgPCAwKTsKKyAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIG9mIHRoZSB3YXkgd2UgYnVpbGQgdGhlIGluZGV4ICh1c2luZyBub24tcHJlZml4IHNlcGFyYXRvcikgd2UgYXJlIHVzdWFsbHkgZ29pbmcgdG8gbWlzcyB0aGUgbGFzdCBpdGVtLgorICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMikKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJhdG9yLmNvbXBhcmUobGVmdCwga2V5cy5nZXQoaWR4IC0gMikpID4gMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Pz4gbGwgPSBsZWZ0OworICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Pz4gcnIgPSByaWdodDsKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhrZXlzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoeCAtPiBjb21wYXJhdG9yLmNvbXBhcmUobGwsIHgpIDw9IDAgJiYgY29tcGFyYXRvci5jb21wYXJlKHgsIHJyKSA8PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGNsdXN0ZXJpbmcgLT4gY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKGNsdXN0ZXJpbmcpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGJjIC0+IGJjLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVkVSU0lPTikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiKSkpOworICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJMZWZ0IHt9e30gUmlnaHQge317fSIsIGNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShsZWZ0KSwgZXhhY3RMZWZ0ID8gIiMiIDogIiIsIGNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShyaWdodCksIGV4YWN0UmlnaHQgPyAiIyIgOiAiIik7CisgICAgICAgICAgICAgICAgdHJ5IChSb3dJbmRleFJldmVyc2VJdGVyYXRvciBpdGVyMiA9IG5ldyBSb3dJbmRleFJldmVyc2VJdGVyYXRvcihmaCwgcm9vdCwgY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKGxlZnQpLCBjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUocmlnaHQpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEluZGV4SW5mbyBpaTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChpaSA9IGl0ZXIyLm5leHRJbmRleEluZm8oKSkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKGtleXMuZ2V0KChpbnQpIGlpLm9mZnNldCkpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJMZWZ0IHt9e30gUmlnaHQge317fSIsIGNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShsZWZ0KSwgZXhhY3RMZWZ0ID8gIiMiIDogIiIsIGNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShyaWdodCksIGV4YWN0UmlnaHQgPyAiIyIgOiAiIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlSXRlcmF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBQYWlyPExpc3Q8Q2x1c3RlcmluZ1ByZWZpeDw/Pj4sIFJvd0luZGV4UmVhZGVyPiByYW5kb20gPSBnZW5lcmF0ZVJhbmRvbUluZGV4U2luZ2xldG9ucyhDT1VOVCk7CisgICAgICAgIExpc3Q8Q2x1c3RlcmluZ1ByZWZpeDw/Pj4ga2V5cyA9IHJhbmRvbS5sZWZ0OworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBib29sZWFuIGV4YWN0UmlnaHQgPSBSQU5ET00ubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Pz4gcmlnaHQgPSBleGFjdFJpZ2h0ID8ga2V5cy5nZXQoUkFORE9NLm5leHRJbnQoa2V5cy5zaXplKCkpKSA6IGdlbmVyYXRlUmFuZG9tS2V5KCk7CisKKyAgICAgICAgICAgIGludCBpZHggPSAwOworICAgICAgICAgICAgdHJ5IChSb3dJbmRleFJldmVyc2VJdGVyYXRvciBpdGVyID0gbmV3IFJvd0luZGV4UmV2ZXJzZUl0ZXJhdG9yKGZoLCByb290LCBCeXRlQ29tcGFyYWJsZS5FTVBUWSwgY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKHJpZ2h0KSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5kZXhJbmZvIGluZGV4SW5mbyA9IGl0ZXIubmV4dEluZGV4SW5mbygpOworICAgICAgICAgICAgICAgIGlmIChpbmRleEluZm8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlkeCA9IENvbGxlY3Rpb25zLmJpbmFyeVNlYXJjaChrZXlzLCByaWdodCwgY29tcGFyYXRvcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gLTIgLSBpZHg7IC8vIGxlc3MgdGhhbiBvciBlcXVhbAorICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShrZXlzLmdldChpZHgpKSArICIgPD0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKHJpZ2h0KSArICIgYnV0ICIgKyBpZHggKyAiIHdhc24ndCBpdGVyYXRlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA8IDApOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZHggPSAoaW50KSBpbmRleEluZm8ub2Zmc2V0OworICAgICAgICAgICAgICAgIGlmIChpbmRleEluZm8ub2Zmc2V0ID09IEVORF9NQVJLRVIpCisgICAgICAgICAgICAgICAgICAgIGlkeCA9IGtleXMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGlmIChpZHggPiAwKQorICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmF0b3IuY29tcGFyZShyaWdodCwga2V5cy5nZXQoaWR4IC0gMSkpID4gMCk7CisgICAgICAgICAgICAgICAgaWYgKGlkeCA8IGtleXMuc2l6ZSgpIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJhdG9yLmNvbXBhcmUocmlnaHQsIGtleXMuZ2V0KGlkeCArIDEpKSA8IDApOworICAgICAgICAgICAgICAgIGlmIChleGFjdFJpZ2h0KSAgICAgIC8vIG11c3QgYmUgcHJlY2lzZSBvbiBleGFjdCwgb3RoZXJ3aXNlIGNvdWxkIGJlIGluIGFueSByZWxhdGlvbgorICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmlnaHQsIGtleXMuZ2V0KGlkeCkpOworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLS1pZHg7CisgICAgICAgICAgICAgICAgICAgIEluZGV4SW5mbyBpaSA9IGl0ZXIubmV4dEluZGV4SW5mbygpOworICAgICAgICAgICAgICAgICAgICBpZiAoaWkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaWR4LCAoaW50KSBpaS5vZmZzZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGlkeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Pz4gcnIgPSByaWdodDsKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhrZXlzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoeCAtPiBjb21wYXJhdG9yLmNvbXBhcmUoeCwgcnIpIDw9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoY29tcGFyYXRvcjo6YXNCeXRlQ29tcGFyYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChiYyAtPiBiYy5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKFZFUlNJT04pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwgIikpKTsKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiUmlnaHQge317fSIsIGNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShyaWdodCksIGV4YWN0UmlnaHQgPyAiIyIgOiAiIik7CisgICAgICAgICAgICAgICAgdHJ5IChSb3dJbmRleFJldmVyc2VJdGVyYXRvciBpdGVyMiA9IG5ldyBSb3dJbmRleFJldmVyc2VJdGVyYXRvcihmaCwgcm9vdCwgQnl0ZUNvbXBhcmFibGUuRU1QVFksIGNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShyaWdodCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSW5kZXhJbmZvIGlpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGlpID0gaXRlcjIubmV4dEluZGV4SW5mbygpKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUoa2V5cy5nZXQoKGludCkgaWkub2Zmc2V0KSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlJpZ2h0IHt9e30iLCBjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUocmlnaHQpLCBleGFjdFJpZ2h0ID8gIiMiIDogIiIpOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFBhaXI8TGlzdDxDbHVzdGVyaW5nUHJlZml4PD8+PiwgUm93SW5kZXhSZWFkZXI+IGdlbmVyYXRlUmFuZG9tSW5kZXhTaW5nbGV0b25zKGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIExpc3Q8Q2x1c3RlcmluZ1ByZWZpeDw/Pj4gbGlzdCA9IGdlbmVyYXRlTGlzdChzaXplKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBpID09IDAgfHwgY29tcGFyYXRvci5jb21wYXJlKGxpc3QuZ2V0KGkgLSAxKSwgbGlzdC5nZXQoaSkpIDwgMDsKKyAgICAgICAgICAgIGFzc2VydCBpID09IDAgfHwgQnl0ZUNvbXBhcmFibGUuY29tcGFyZShjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUobGlzdC5nZXQoaSAtIDEpKSwgY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKGxpc3QuZ2V0KGkpKSwgVkVSU0lPTikgPCAwIDoKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIiVzIGJzICVzIHZlcnN1cyAlcyBicyAlcyIsIGxpc3QuZ2V0KGkgLSAxKS5jbHVzdGVyaW5nKCkuY2x1c3RlcmluZ1N0cmluZyhjb21wYXJhdG9yLnN1YnR5cGVzKCkpLCBjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUobGlzdC5nZXQoaSAtIDEpKSwgbGlzdC5nZXQoaSkuY2x1c3RlcmluZygpLmNsdXN0ZXJpbmdTdHJpbmcoY29tcGFyYXRvci5zdWJ0eXBlcygpKSwgY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKGxpc3QuZ2V0KGkpKSk7CisgICAgICAgICAgICB3cml0ZXIuYWRkKGxpc3QuZ2V0KGkpLCBsaXN0LmdldChpKSwgbmV3IEluZGV4SW5mbyhpLCBEZWxldGlvblRpbWUuTElWRSkpOworICAgICAgICB9CisKKyAgICAgICAgUm93SW5kZXhSZWFkZXIgc3VtbWFyeSA9IGNvbXBsZXRlQW5kUmVhZCgpOworICAgICAgICByZXR1cm4gUGFpci5jcmVhdGUobGlzdCwgc3VtbWFyeSk7CisgICAgfQorCisgICAgTGlzdDxDbHVzdGVyaW5nUHJlZml4PD8+PiBnZW5lcmF0ZUxpc3QoaW50IHNpemUpCisgICAgeworICAgICAgICBMaXN0PENsdXN0ZXJpbmdQcmVmaXg8Pz4+IGxpc3QgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgICAgICBTZXQ8Q2x1c3RlcmluZ1ByZWZpeDw/Pj4gc2V0ID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBDbHVzdGVyaW5nUHJlZml4PD8+IGtleSA9IGdlbmVyYXRlUmFuZG9tS2V5KCk7IC8vIGtleXMgbXVzdCBiZSB1bmlxdWUKKyAgICAgICAgICAgIHdoaWxlICghc2V0LmFkZChrZXkpKQorICAgICAgICAgICAgICAgIGtleSA9IGdlbmVyYXRlUmFuZG9tS2V5KCk7CisgICAgICAgICAgICBsaXN0LmFkZChrZXkpOworICAgICAgICB9CisgICAgICAgIGxpc3Quc29ydChjb21wYXJhdG9yKTsKKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSBQYWlyPExpc3Q8Q2x1c3RlcmluZ1ByZWZpeDw/Pj4sIFJvd0luZGV4UmVhZGVyPiBnZW5lcmF0ZVJhbmRvbUluZGV4UXVhZHMoaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgTGlzdDxDbHVzdGVyaW5nUHJlZml4PD8+PiBsaXN0ID0gZ2VuZXJhdGVMaXN0KDQgKiBzaXplICsgMSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICAgICAgd3JpdGVyLmFkZChsaXN0LmdldChpICogNCArIDEpLCBsaXN0LmdldChpICogNCArIDMpLCBuZXcgSW5kZXhJbmZvKGksIG5ldyBEZWxldGlvblRpbWUoaSArIDIsIGkgLSAzKSkpOworCisgICAgICAgIFJvd0luZGV4UmVhZGVyIHN1bW1hcnkgPSBjb21wbGV0ZUFuZFJlYWQoKTsKKyAgICAgICAgcmV0dXJuIFBhaXIuY3JlYXRlKGxpc3QsIHN1bW1hcnkpOworICAgIH0KKworICAgIENsdXN0ZXJpbmdQcmVmaXg8Pz4gZ2VuZXJhdGVSYW5kb21LZXkoKQorICAgIHsKKyAgICAgICAgVVVJRCB1dWlkID0gcmFuZG9tU2VlZGVkVVVJRCgpOworICAgICAgICBDbHVzdGVyaW5nUHJlZml4PD8+IGtleSA9IGNvbXBhcmF0b3IubWFrZSh1dWlkKTsKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBVVUlEIHJhbmRvbVNlZWRlZFVVSUQoKQorICAgIHsKKyAgICAgICAgYnl0ZVtdIHJhbmRvbUJ5dGVzID0gbmV3IGJ5dGVbMTZdOworICAgICAgICBSQU5ET00ubmV4dEJ5dGVzKHJhbmRvbUJ5dGVzKTsKKyAgICAgICAgcmV0dXJuIFVVSUQubmFtZVVVSURGcm9tQnl0ZXMocmFuZG9tQnl0ZXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvVmVyc2lvblN1cHBvcnRlZEZlYXR1cmVzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9WZXJzaW9uU3VwcG9ydGVkRmVhdHVyZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y0MDhjOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvVmVyc2lvblN1cHBvcnRlZEZlYXR1cmVzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpOworCitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LkFic3RyYWN0VGVzdFZlcnNpb25TdXBwb3J0ZWRGZWF0dXJlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uOworCitwdWJsaWMgY2xhc3MgVmVyc2lvblN1cHBvcnRlZEZlYXR1cmVzVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdFZlcnNpb25TdXBwb3J0ZWRGZWF0dXJlcworeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBWZXJzaW9uIGdldFZlcnNpb24oU3RyaW5nIHYpCisgICAgeworICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNTVGFibGVGb3JtYXRzKCkuZ2V0KEJ0aUZvcm1hdC5OQU1FKS5nZXRWZXJzaW9uKHYpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJlYW08U3RyaW5nPiBnZXRQZW5kaW5nUmVwYWlyU3VwcG9ydGVkVmVyc2lvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFMTF9WRVJTSU9OUy5zdHJlYW0oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyZWFtPFN0cmluZz4gZ2V0UGFydGl0aW9uTGV2ZWxEZWxldGlvblByZXNlbmNlTWFya2VyU3VwcG9ydGVkVmVyc2lvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFMTF9WRVJTSU9OUy5zdHJlYW0oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyZWFtPFN0cmluZz4gZ2V0TGVnYWN5TWluTWF4U3VwcG9ydGVkVmVyc2lvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmVhbS5lbXB0eSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJlYW08U3RyaW5nPiBnZXRJbXByb3ZlZE1pbk1heFN1cHBvcnRlZFZlcnNpb25zKCkKKyAgICB7CisgICAgICAgIHJldHVybiBBTExfVkVSU0lPTlMuc3RyZWFtKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmVhbTxTdHJpbmc+IGdldEtleVJhbmdlU3VwcG9ydGVkVmVyc2lvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFMTF9WRVJTSU9OUy5zdHJlYW0oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyZWFtPFN0cmluZz4gZ2V0T3JpZ2luYXRpbmdIb3N0SWRTdXBwb3J0ZWRWZXJzaW9ucygpCisgICAgeworICAgICAgICByZXR1cm4gQUxMX1ZFUlNJT05TLnN0cmVhbSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2luZGV4c3VtbWFyeS9JbmRleFN1bW1hcnlNYW5hZ2VyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvaW5kZXhzdW1tYXJ5L0luZGV4U3VtbWFyeU1hbmFnZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBkMDRhNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2luZGV4c3VtbWFyeS9JbmRleFN1bW1hcnlNYW5hZ2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuSm9pbmVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuTmFtZWRUaHJlYWRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93VXBkYXRlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkludGVycnVwdGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5SZXN0b3JhYmxlTWV0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNhY2hpbmdQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFUZXN0VXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcC5vZjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbC5hc3NlcnRPbkRpc2tTdGF0ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Eb3duc2FtcGxpbmcuQkFTRV9TQU1QTElOR19MRVZFTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5pbmRleHN1bW1hcnkuSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24uRE9XTlNBTVBMRV9USEVTSE9MRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5pbmRleHN1bW1hcnkuSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24uVVBTQU1QTEVfVEhSRVNIT0xEOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitwdWJsaWMgY2xhc3MgSW5kZXhTdW1tYXJ5TWFuYWdlclRlc3Q8UiBleHRlbmRzIFNTVGFibGVSZWFkZXIgJiBJbmRleFN1bW1hcnlTdXBwb3J0PFI+PgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihJbmRleFN1bW1hcnlNYW5hZ2VyVGVzdC5jbGFzcyk7CisKKyAgICBpbnQgb3JpZ2luYWxNaW5JbmRleEludGVydmFsOworICAgIGludCBvcmlnaW5hbE1heEluZGV4SW50ZXJ2YWw7CisgICAgbG9uZyBvcmlnaW5hbENhcGFjaXR5OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFMSA9ICJJbmRleFN1bW1hcnlNYW5hZ2VyVGVzdCI7CisgICAgLy8gaW5kZXggaW50ZXJ2YWwgb2YgOCwgbm8ga2V5IGNhY2hpbmcKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfU1RBTkRBUkRMT1dpSU5URVJWQUwgPSAiU3RhbmRhcmRMb3dJbmRleEludGVydmFsIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfU1RBTkRBUkRSQUNFID0gIlN0YW5kYXJkUmFjZSI7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOworICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZSgiVGhpcyB0ZXN0IG1ha2Ugc2Vuc2Ugb25seSBpZiB0aGUgZGVmYXVsdCBTU1RhYmxlIGZvcm1hdCBzdXBwb3J0IGluZGV4IHN1bW1hcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleFN1bW1hcnlTdXBwb3J0LmlzU3VwcG9ydGVkQnkoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpKSk7CisKKyAgICAgICAgU2NoZW1hTG9hZGVyLnByZXBhcmVTZXJ2ZXIoKTsKKyAgICAgICAgU2NoZW1hTG9hZGVyLmNyZWF0ZUtleXNwYWNlKEtFWVNQQUNFMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBDRl9TVEFOREFSRExPV2lJTlRFUlZBTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5taW5JbmRleEludGVydmFsKDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4SW5kZXhJbnRlcnZhbCgyNTYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2FjaGluZyhDYWNoaW5nUGFyYW1zLkNBQ0hFX05PVEhJTkcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENGX1NUQU5EQVJEUkFDRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5taW5JbmRleEludGVydmFsKDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4SW5kZXhJbnRlcnZhbCgyNTYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2FjaGluZyhDYWNoaW5nUGFyYW1zLkNBQ0hFX05PVEhJTkcpKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgYmVmb3JlVGVzdCgpCisgICAgeworICAgICAgICBTdHJpbmcga3NuYW1lID0gS0VZU1BBQ0UxOworICAgICAgICBTdHJpbmcgY2ZuYW1lID0gQ0ZfU1RBTkRBUkRMT1dpSU5URVJWQUw7IC8vIGluZGV4IGludGVydmFsIG9mIDgsIG5vIGtleSBjYWNoaW5nCisgICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc25hbWUpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZm5hbWUpOworICAgICAgICBvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwgPSBjZnMubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbDsKKyAgICAgICAgb3JpZ2luYWxNYXhJbmRleEludGVydmFsID0gY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1heEluZGV4SW50ZXJ2YWw7CisgICAgICAgIG9yaWdpbmFsQ2FwYWNpdHkgPSBJbmRleFN1bW1hcnlNYW5hZ2VyLmluc3RhbmNlLmdldE1lbW9yeVBvb2xDYXBhY2l0eUluTUIoKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCBhZnRlclRlc3QoKQorICAgIHsKKyAgICAgICAgZm9yIChDb21wYWN0aW9uSW5mby5Ib2xkZXIgaG9sZGVyIDogQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmdldENvbXBhY3Rpb25zKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhvbGRlci5zdG9wKCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcga3NuYW1lID0gS0VZU1BBQ0UxOworICAgICAgICBTdHJpbmcgY2ZuYW1lID0gQ0ZfU1RBTkRBUkRMT1dpSU5URVJWQUw7IC8vIGluZGV4IGludGVydmFsIG9mIDgsIG5vIGtleSBjYWNoaW5nCisgICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc25hbWUpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZm5hbWUpOworCisgICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlVGFibGVVcGRhdGUoY2ZzLm1ldGFkYXRhKCkudW5idWlsZCgpLm1pbkluZGV4SW50ZXJ2YWwob3JpZ2luYWxNaW5JbmRleEludGVydmFsKS5idWlsZCgpKTsKKyAgICAgICAgU2NoZW1hVGVzdFV0aWwuYW5ub3VuY2VUYWJsZVVwZGF0ZShjZnMubWV0YWRhdGEoKS51bmJ1aWxkKCkubWF4SW5kZXhJbnRlcnZhbChvcmlnaW5hbE1heEluZGV4SW50ZXJ2YWwpLmJ1aWxkKCkpOworCisgICAgICAgIEluZGV4U3VtbWFyeU1hbmFnZXIuaW5zdGFuY2Uuc2V0TWVtb3J5UG9vbENhcGFjaXR5SW5NQihvcmlnaW5hbENhcGFjaXR5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgdG90YWxPZmZIZWFwU2l6ZShMaXN0PFI+IHNzdGFibGVzKQorICAgIHsKKyAgICAgICAgbG9uZyB0b3RhbCA9IDA7CisgICAgICAgIGZvciAoUiBzc3RhYmxlIDogc3N0YWJsZXMpCisgICAgICAgICAgICB0b3RhbCArPSBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldE9mZkhlYXBTaXplKCk7CisgICAgICAgIHJldHVybiB0b3RhbDsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8Uj4gcmVzZXRTdW1tYXJpZXMoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBMaXN0PFI+IHNzdGFibGVzLCBsb25nIG9yaWdpbmFsT2ZmSGVhcFNpemUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZm9yIChSIHNzdGFibGUgOiBzc3RhYmxlcykKKyAgICAgICAgICAgIHNzdGFibGUub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcigxMDAuMCwgMTAwLjApKTsKKworICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KHNzdGFibGVzLCBPcGVyYXRpb25UeXBlLlVOS05PV04pKQorICAgICAgICB7CisgICAgICAgICAgICBzc3RhYmxlcyA9IHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCBvcmlnaW5hbE9mZkhlYXBTaXplICogc3N0YWJsZXMuc2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFIgc3N0YWJsZSA6IHNzdGFibGVzKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpKTsKKworICAgICAgICByZXR1cm4gc3N0YWJsZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRGF0YShDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIGludCBudW1QYXJ0aXRpb24pCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVBhcnRpdGlvbjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBSb3cgcm93ID0gVXRpbC5nZXRPbmx5Um93VW5maWx0ZXJlZChVdGlsLmNtZChjZnMsIFN0cmluZy5mb3JtYXQoIiUzZCIsIGkpKS5idWlsZCgpKTsKKyAgICAgICAgICAgIENlbGw8Pz4gY2VsbCA9IHJvdy5nZXRDZWxsKGNmcy5tZXRhZGF0YSgpLmdldENvbHVtbihCeXRlQnVmZmVyVXRpbC5ieXRlcygidmFsIikpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoY2VsbCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCBjZWxsLmJ1ZmZlcigpLmFycmF5KCkubGVuZ3RoKTsKKworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBDb21wYXJhdG9yPFNTVGFibGVSZWFkZXI+IGhvdG5lc3NDb21wYXJhdG9yID0gQ29tcGFyYXRvci5jb21wYXJpbmdEb3VibGUobyAtPiBvLmdldFJlYWRNZXRlcigpLmZpZnRlZW5NaW51dGVSYXRlKCkpOworCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNTVGFibGVzKFN0cmluZyBrc25hbWUsIFN0cmluZyBjZm5hbWUsIGludCBudW1TU1RhYmxlcywgaW50IG51bVBhcnRpdGlvbikKKyAgICB7CisgICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc25hbWUpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZm5hbWUpOworICAgICAgICBjZnMudHJ1bmNhdGVCbG9ja2luZygpOworICAgICAgICBjZnMuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisKKyAgICAgICAgQXJyYXlMaXN0PEZ1dHVyZT4gZnV0dXJlcyA9IG5ldyBBcnJheUxpc3Q8PihudW1TU1RhYmxlcyk7CisgICAgICAgIEJ5dGVCdWZmZXIgdmFsdWUgPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbMTAwXSk7CisgICAgICAgIGZvciAoaW50IHNzdGFibGUgPSAwOyBzc3RhYmxlIDwgbnVtU1NUYWJsZXM7IHNzdGFibGUrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgcCA9IDA7IHAgPCBudW1QYXJ0aXRpb247IHArKykKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBTdHJpbmcuZm9ybWF0KCIlM2QiLCBwKTsKKyAgICAgICAgICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgMCwga2V5KQorICAgICAgICAgICAgICAgICAgICAuY2x1c3RlcmluZygiY29sdW1uIikKKyAgICAgICAgICAgICAgICAgICAgLmFkZCgidmFsIiwgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICAgICAgICAgICAgIC5hcHBseVVuc2FmZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnV0dXJlcy5hZGQoY2ZzLmZvcmNlRmx1c2goQ29sdW1uRmFtaWx5U3RvcmUuRmx1c2hSZWFzb24uVU5JVF9URVNUUykpOworICAgICAgICB9CisgICAgICAgIGZvciAoRnV0dXJlIGZ1dHVyZSA6IGZ1dHVyZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZ1dHVyZS5nZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB8IEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhudW1TU1RhYmxlcywgU2VydmVyVGVzdFV0aWxzLmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhjZnMpLnNpemUoKSk7CisgICAgICAgIHZhbGlkYXRlRGF0YShjZnMsIG51bVBhcnRpdGlvbik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgPFIgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyICYgSW5kZXhTdW1tYXJ5U3VwcG9ydDxSPj4gdm9pZCB0ZXN0Q2hhbmdlTWluSW5kZXhJbnRlcnZhbCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIGtzbmFtZSA9IEtFWVNQQUNFMTsKKyAgICAgICAgU3RyaW5nIGNmbmFtZSA9IENGX1NUQU5EQVJETE9XaUlOVEVSVkFMOyAvLyBpbmRleCBpbnRlcnZhbCBvZiA4LCBubyBrZXkgY2FjaGluZworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NuYW1lKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2ZuYW1lKTsKKyAgICAgICAgaW50IG51bVNTVGFibGVzID0gMTsKKyAgICAgICAgaW50IG51bVJvd3MgPSAyNTY7CisgICAgICAgIGNyZWF0ZVNTVGFibGVzKGtzbmFtZSwgY2ZuYW1lLCBudW1TU1RhYmxlcywgbnVtUm93cyk7CisKKyAgICAgICAgTGlzdDxSPiBzc3RhYmxlcyA9IFNlcnZlclRlc3RVdGlscy5nZXRMaXZlSW5kZXhTdW1tYXJ5U3VwcG9ydGluZ1JlYWRlcnMoY2ZzKTsKKyAgICAgICAgZm9yIChSIHNzdGFibGUgOiBzc3RhYmxlcykKKyAgICAgICAgICAgIHNzdGFibGUub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcigxMDAuMCwgMTAwLjApKTsKKworICAgICAgICBmb3IgKFIgc3N0YWJsZSA6IHNzdGFibGVzKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKSwgMC4wMDEpOworCisgICAgICAgIC8vIGRvdWJsZSB0aGUgbWluX2luZGV4X2ludGVydmFsCisgICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlVGFibGVVcGRhdGUoY2ZzLm1ldGFkYXRhKCkudW5idWlsZCgpLm1pbkluZGV4SW50ZXJ2YWwob3JpZ2luYWxNaW5JbmRleEludGVydmFsICogMikuYnVpbGQoKSk7CisgICAgICAgIEluZGV4U3VtbWFyeU1hbmFnZXIuaW5zdGFuY2UucmVkaXN0cmlidXRlU3VtbWFyaWVzKCk7CisgICAgICAgIGZvciAoUiBzc3RhYmxlIDogU2VydmVyVGVzdFV0aWxzLjxSPmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhjZnMpKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbCgpLCAwLjAwMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVtUm93cyAvIGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLnNpemUoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyByZXR1cm4gbWluX2luZGV4X2ludGVydmFsIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZQorICAgICAgICBTY2hlbWFUZXN0VXRpbC5hbm5vdW5jZVRhYmxlVXBkYXRlKGNmcy5tZXRhZGF0YSgpLnVuYnVpbGQoKS5taW5JbmRleEludGVydmFsKG9yaWdpbmFsTWluSW5kZXhJbnRlcnZhbCkuYnVpbGQoKSk7CisgICAgICAgIEluZGV4U3VtbWFyeU1hbmFnZXIuaW5zdGFuY2UucmVkaXN0cmlidXRlU3VtbWFyaWVzKCk7CisgICAgICAgIGZvciAoUiBzc3RhYmxlIDogU2VydmVyVGVzdFV0aWxzLjxSPmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhjZnMpKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbCgpLCAwLjAwMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVtUm93cyAvIGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLnNpemUoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBoYWx2ZSB0aGUgbWluX2luZGV4X2ludGVydmFsLCBidXQgY29uc3RyYWluIHRoZSBhdmFpbGFibGUgc3BhY2UgdG8gZXhhY3RseSB3aGF0IHdlIGhhdmUgbm93OyBhcyBhIHJlc3VsdCwKKyAgICAgICAgLy8gdGhlIHN1bW1hcnkgc2hvdWxkbid0IGNoYW5nZQorICAgICAgICBTY2hlbWFUZXN0VXRpbC5hbm5vdW5jZVRhYmxlVXBkYXRlKGNmcy5tZXRhZGF0YSgpLnVuYnVpbGQoKS5taW5JbmRleEludGVydmFsKG9yaWdpbmFsTWluSW5kZXhJbnRlcnZhbCAvIDIpLmJ1aWxkKCkpOworICAgICAgICBSIHNzdGFibGUgPSBTZXJ2ZXJUZXN0VXRpbHMuPFI+Z2V0TGl2ZUluZGV4U3VtbWFyeVN1cHBvcnRpbmdSZWFkZXJzKGNmcykuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIGxvbmcgc3VtbWFyeVNwYWNlID0gc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5nZXRPZmZIZWFwU2l6ZSgpOworICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KHNzdGFibGUsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCBzdW1tYXJ5U3BhY2UpOworICAgICAgICB9CisKKyAgICAgICAgc3N0YWJsZSA9IFNlcnZlclRlc3RVdGlscy48Uj5nZXRMaXZlSW5kZXhTdW1tYXJ5U3VwcG9ydGluZ1JlYWRlcnMoY2ZzKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsTWluSW5kZXhJbnRlcnZhbCwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCksIDAuMDAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG51bVJvd3MgLyBvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuc2l6ZSgpKTsKKworICAgICAgICAvLyBrZWVwIHRoZSBtaW5faW5kZXhfaW50ZXJ2YWwgdGhlIHNhbWUsIGJ1dCBub3cgZ2l2ZSB0aGUgc3VtbWFyeSBlbm91Z2ggc3BhY2UgdG8gZ3JvdyBieSA1MCUKKyAgICAgICAgZG91YmxlIHByZXZpb3VzSW50ZXJ2YWwgPSBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKTsKKyAgICAgICAgaW50IHByZXZpb3VzU2l6ZSA9IHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuc2l6ZSgpOworICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KHNzdGFibGUsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAobG9uZykgTWF0aC5jZWlsKHN1bW1hcnlTcGFjZSAqIDEuNSkpOworICAgICAgICB9CisgICAgICAgIHNzdGFibGUgPSBTZXJ2ZXJUZXN0VXRpbHMuPFI+Z2V0TGl2ZUluZGV4U3VtbWFyeVN1cHBvcnRpbmdSZWFkZXJzKGNmcykuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhwcmV2aW91c1NpemUgKiAxLjUsIChkb3VibGUpIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuc2l6ZSgpLCAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHByZXZpb3VzSW50ZXJ2YWwgKiAoMS4wIC8gMS41KSwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCksIDAuMDAxKTsKKworICAgICAgICAvLyByZXR1cm4gbWluX2luZGV4X2ludGVydmFsIHRvIGl0J3Mgb3JpZ2luYWwgdmFsdWUgKGRvdWJsZSBpdCksIGJ1dCBvbmx5IGdpdmUgdGhlIHN1bW1hcnkgZW5vdWdoIHNwYWNlCisgICAgICAgIC8vIHRvIGhhdmUgYW4gZWZmZWN0aXZlIGluZGV4IGludGVydmFsIG9mIHR3aWNlIHRoZSBuZXcgbWluCisgICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlVGFibGVVcGRhdGUoY2ZzLm1ldGFkYXRhKCkudW5idWlsZCgpLm1pbkluZGV4SW50ZXJ2YWwob3JpZ2luYWxNaW5JbmRleEludGVydmFsKS5idWlsZCgpKTsKKyAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlLCBPcGVyYXRpb25UeXBlLlVOS05PV04pKQorICAgICAgICB7CisgICAgICAgICAgICByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgKGxvbmcpIE1hdGguY2VpbChzdW1tYXJ5U3BhY2UgLyAyLjApKTsKKyAgICAgICAgfQorICAgICAgICBzc3RhYmxlID0gU2VydmVyVGVzdFV0aWxzLjxSPmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhjZnMpLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWxNaW5JbmRleEludGVydmFsICogMiwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCksIDAuMDAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG51bVJvd3MgLyAob3JpZ2luYWxNaW5JbmRleEludGVydmFsICogMiksIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuc2l6ZSgpKTsKKworICAgICAgICAvLyByYWlzZSB0aGUgbWluX2luZGV4X2ludGVydmFsIGFib3ZlIG91ciBjdXJyZW50IGVmZmVjdGl2ZSBpbnRlcnZhbCwgYnV0IHNldCB0aGUgbWF4X2luZGV4X2ludGVydmFsIGxvd2VyCisgICAgICAgIC8vIHRoYW4gd2hhdCB3ZSBhY3R1YWxseSBoYXZlIHNwYWNlIGZvciAobWVhbmluZyB0aGUgaW5kZXggc3VtbWFyeSB3b3VsZCBpZGVhbGx5IGJlIHNtYWxsZXIsIGJ1dCB0aGlzIHdvdWxkCisgICAgICAgIC8vIHJlc3VsdCBpbiBhbiBlZmZlY3RpdmUgaW50ZXJ2YWwgYWJvdmUgdGhlIG5ldyBtYXgpCisgICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlVGFibGVVcGRhdGUoY2ZzLm1ldGFkYXRhKCkudW5idWlsZCgpLm1pbkluZGV4SW50ZXJ2YWwob3JpZ2luYWxNaW5JbmRleEludGVydmFsICogNCkuYnVpbGQoKSk7CisgICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlVGFibGVVcGRhdGUoY2ZzLm1ldGFkYXRhKCkudW5idWlsZCgpLm1heEluZGV4SW50ZXJ2YWwob3JpZ2luYWxNaW5JbmRleEludGVydmFsICogNCkuYnVpbGQoKSk7CisgICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZSwgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBvZihjZnMubWV0YWRhdGEuaWQsIHR4biksIDEwKTsKKyAgICAgICAgfQorICAgICAgICBzc3RhYmxlID0gU2VydmVyVGVzdFV0aWxzLjxSPmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhjZnMpLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbCgpLCAwLjAwMSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlTWF4SW5kZXhJbnRlcnZhbCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIGtzbmFtZSA9IEtFWVNQQUNFMTsKKyAgICAgICAgU3RyaW5nIGNmbmFtZSA9IENGX1NUQU5EQVJETE9XaUlOVEVSVkFMOyAvLyBpbmRleCBpbnRlcnZhbCBvZiA4LCBubyBrZXkgY2FjaGluZworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NuYW1lKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2ZuYW1lKTsKKyAgICAgICAgaW50IG51bVNTVGFibGVzID0gMTsKKyAgICAgICAgaW50IG51bVJvd3MgPSAyNTY7CisgICAgICAgIGNyZWF0ZVNTVGFibGVzKGtzbmFtZSwgY2ZuYW1lLCBudW1TU1RhYmxlcywgbnVtUm93cyk7CisKKyAgICAgICAgTGlzdDxSPiBzc3RhYmxlcyA9IFNlcnZlclRlc3RVdGlscy5nZXRMaXZlSW5kZXhTdW1tYXJ5U3VwcG9ydGluZ1JlYWRlcnMoY2ZzKTsKKyAgICAgICAgZm9yIChSIHNzdGFibGUgOiBzc3RhYmxlcykKKyAgICAgICAgICAgIHNzdGFibGUub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcigxMDAuMCwgMTAwLjApKTsKKworICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KHNzdGFibGVzLCBPcGVyYXRpb25UeXBlLlVOS05PV04pKQorICAgICAgICB7CisgICAgICAgICAgICByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgMTApOworICAgICAgICB9CisgICAgICAgIHNzdGFibGVzID0gU2VydmVyVGVzdFV0aWxzLmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhjZnMpOworICAgICAgICBmb3IgKFIgc3N0YWJsZSA6IHNzdGFibGVzKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKSwgMC4wMSk7CisKKyAgICAgICAgLy8gaGFsdmUgdGhlIG1heF9pbmRleF9pbnRlcnZhbAorICAgICAgICBTY2hlbWFUZXN0VXRpbC5hbm5vdW5jZVRhYmxlVXBkYXRlKGNmcy5tZXRhZGF0YSgpLnVuYnVpbGQoKS5tYXhJbmRleEludGVydmFsKGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsIC8gMikuYnVpbGQoKSk7CisgICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAxKTsKKyAgICAgICAgfQorICAgICAgICBzc3RhYmxlcyA9IFNlcnZlclRlc3RVdGlscy5nZXRMaXZlSW5kZXhTdW1tYXJ5U3VwcG9ydGluZ1JlYWRlcnMoY2ZzKTsKKyAgICAgICAgZm9yIChSIHNzdGFibGUgOiBzc3RhYmxlcykKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKSwgMC4wMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVtUm93cyAvIGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLnNpemUoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyByZXR1cm4gbWF4X2luZGV4X2ludGVydmFsIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZQorICAgICAgICBTY2hlbWFUZXN0VXRpbC5hbm5vdW5jZVRhYmxlVXBkYXRlKGNmcy5tZXRhZGF0YSgpLnVuYnVpbGQoKS5tYXhJbmRleEludGVydmFsKGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsICogMikuYnVpbGQoKSk7CisgICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAxKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFIgc3N0YWJsZSA6IFNlcnZlclRlc3RVdGlscy48Uj5nZXRMaXZlSW5kZXhTdW1tYXJ5U3VwcG9ydGluZ1JlYWRlcnMoY2ZzKSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKSwgMC4wMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVtUm93cyAvIGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdCh0aW1lb3V0ID0gMTAwMDApCisgICAgcHVibGljIHZvaWQgdGVzdFJlZGlzdHJpYnV0ZVN1bW1hcmllcygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIGtzbmFtZSA9IEtFWVNQQUNFMTsKKyAgICAgICAgU3RyaW5nIGNmbmFtZSA9IENGX1NUQU5EQVJETE9XaUlOVEVSVkFMOyAvLyBpbmRleCBpbnRlcnZhbCBvZiA4LCBubyBrZXkgY2FjaGluZworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NuYW1lKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2ZuYW1lKTsKKyAgICAgICAgaW50IG51bVNTVGFibGVzID0gNDsKKyAgICAgICAgaW50IG51bVJvd3MgPSAyNTY7CisgICAgICAgIGNyZWF0ZVNTVGFibGVzKGtzbmFtZSwgY2ZuYW1lLCBudW1TU1RhYmxlcywgbnVtUm93cyk7CisKKyAgICAgICAgaW50IG1pblNhbXBsaW5nTGV2ZWwgPSAoQkFTRV9TQU1QTElOR19MRVZFTCAqIGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsKSAvIGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsOworCisgICAgICAgIExpc3Q8Uj4gc3N0YWJsZXMgPSBTZXJ2ZXJUZXN0VXRpbHMuZ2V0TGl2ZUluZGV4U3VtbWFyeVN1cHBvcnRpbmdSZWFkZXJzKGNmcyk7CisgICAgICAgIGZvciAoUiBzc3RhYmxlIDogc3N0YWJsZXMpCisgICAgICAgICAgICBzc3RhYmxlLm92ZXJyaWRlUmVhZE1ldGVyKG5ldyBSZXN0b3JhYmxlTWV0ZXIoMTAwLjAsIDEwMC4wKSk7CisKKyAgICAgICAgbG9uZyBzaW5nbGVTdW1tYXJ5T2ZmSGVhcFNwYWNlID0gc3N0YWJsZXMuZ2V0KDApLmdldEluZGV4U3VtbWFyeSgpLmdldE9mZkhlYXBTaXplKCk7CisKKyAgICAgICAgLy8gdGhlcmUgc2hvdWxkIGJlIGVub3VnaCBzcGFjZSB0byBub3QgZG93bnNhbXBsZSBhbnl0aGluZworICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KHNzdGFibGVzLCBPcGVyYXRpb25UeXBlLlVOS05PV04pKQorICAgICAgICB7CisgICAgICAgICAgICBzc3RhYmxlcyA9IHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAoc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSAqIG51bVNTVGFibGVzKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChSIHNzdGFibGUgOiBzc3RhYmxlcykKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldFNhbXBsaW5nTGV2ZWwoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzaW5nbGVTdW1tYXJ5T2ZmSGVhcFNwYWNlICogbnVtU1NUYWJsZXMsIHRvdGFsT2ZmSGVhcFNpemUoc3N0YWJsZXMpKTsKKyAgICAgICAgdmFsaWRhdGVEYXRhKGNmcywgbnVtUm93cyk7CisKKyAgICAgICAgLy8gZXZlcnl0aGluZyBzaG91bGQgZ2V0IGN1dCBpbiBoYWxmCisgICAgICAgIGFzc2VydCBzc3RhYmxlcy5zaXplKCkgPT0gNDsKKyAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlcywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3N0YWJsZXMgPSByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgKHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgKiAobnVtU1NUYWJsZXMgLyAyKSkpOworICAgICAgICB9CisgICAgICAgIGZvciAoUiBzc3RhYmxlIDogc3N0YWJsZXMpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCAvIDIsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpKTsKKyAgICAgICAgdmFsaWRhdGVEYXRhKGNmcywgbnVtUm93cyk7CisKKyAgICAgICAgLy8gZXZlcnl0aGluZyBzaG91bGQgZ2V0IGN1dCB0byBhIHF1YXJ0ZXIKKyAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlcywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3N0YWJsZXMgPSByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgKHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgKiAobnVtU1NUYWJsZXMgLyA0KSkpOworICAgICAgICB9CisgICAgICAgIGZvciAoUiBzc3RhYmxlIDogc3N0YWJsZXMpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCAvIDQsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpKTsKKyAgICAgICAgdmFsaWRhdGVEYXRhKGNmcywgbnVtUm93cyk7CisKKyAgICAgICAgLy8gdXBzYW1wbGUgYmFjayB1cCB0byBoYWxmCisgICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNzdGFibGVzID0gcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBvZihjZnMubWV0YWRhdGEuaWQsIHR4biksIChzaW5nbGVTdW1tYXJ5T2ZmSGVhcFNwYWNlICogKG51bVNTVGFibGVzIC8gMikgKyA0KSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IHNzdGFibGVzLnNpemUoKSA9PSA0OworICAgICAgICBmb3IgKFIgc3N0YWJsZSA6IHNzdGFibGVzKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwgLyAyLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldFNhbXBsaW5nTGV2ZWwoKSk7CisgICAgICAgIHZhbGlkYXRlRGF0YShjZnMsIG51bVJvd3MpOworCisgICAgICAgIC8vIHVwc2FtcGxlIGJhY2sgdXAgdG8gdGhlIG9yaWdpbmFsIGluZGV4IHN1bW1hcnkKKyAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlcywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3N0YWJsZXMgPSByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgKHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgKiBudW1TU1RhYmxlcykpOworICAgICAgICB9CisgICAgICAgIGZvciAoUiBzc3RhYmxlIDogc3N0YWJsZXMpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5nZXRTYW1wbGluZ0xldmVsKCkpOworICAgICAgICB2YWxpZGF0ZURhdGEoY2ZzLCBudW1Sb3dzKTsKKworICAgICAgICAvLyBtYWtlIHR3byBvZiB0aGUgZm91ciBzc3RhYmxlcyBjb2xkLCBvbmx5IGxlYXZlIGVub3VnaCBzcGFjZSBmb3IgdGhyZWUgZnVsbCBpbmRleCBzdW1tYXJpZXMsCisgICAgICAgIC8vIHNvIHRoZSB0d28gY29sZCBzc3RhYmxlcyBzaG91bGQgZ2V0IGRvd25zYW1wbGVkIHRvIGJlIGhhbGYgb2YgdGhlaXIgb3JpZ2luYWwgc2l6ZQorICAgICAgICBzc3RhYmxlcy5nZXQoMCkub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcig1MC4wLCA1MC4wKSk7CisgICAgICAgIHNzdGFibGVzLmdldCgxKS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKDUwLjAsIDUwLjApKTsKKyAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlcywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3N0YWJsZXMgPSByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgKHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgKiAzKSk7CisgICAgICAgIH0KKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChzc3RhYmxlcywgaG90bmVzc0NvbXBhcmF0b3IpOworICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCAvIDIsIHNzdGFibGVzLmdldCgwKS5nZXRJbmRleFN1bW1hcnkoKS5nZXRTYW1wbGluZ0xldmVsKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCAvIDIsIHNzdGFibGVzLmdldCgxKS5nZXRJbmRleFN1bW1hcnkoKS5nZXRTYW1wbGluZ0xldmVsKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCwgc3N0YWJsZXMuZ2V0KDIpLmdldEluZGV4U3VtbWFyeSgpLmdldFNhbXBsaW5nTGV2ZWwoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMLCBzc3RhYmxlcy5nZXQoMykuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpKTsKKyAgICAgICAgdmFsaWRhdGVEYXRhKGNmcywgbnVtUm93cyk7CisKKyAgICAgICAgLy8gc21hbGwgaW5jcmVhc2VzIG9yIGRlY3JlYXNlcyBpbiB0aGUgcmVhZCByYXRlIGRvbid0IHJlc3VsdCBpbiBkb3duc2FtcGxpbmcgb3IgdXBzYW1wbGluZworICAgICAgICBkb3VibGUgbG93ZXJSYXRlID0gNTAuMCAqIChET1dOU0FNUExFX1RIRVNIT0xEICsgKERPV05TQU1QTEVfVEhFU0hPTEQgKiAwLjEwKSk7CisgICAgICAgIGRvdWJsZSBoaWdoZXJSYXRlID0gNTAuMCAqIChVUFNBTVBMRV9USFJFU0hPTEQgLSAoVVBTQU1QTEVfVEhSRVNIT0xEICogMC4xMCkpOworICAgICAgICBzc3RhYmxlcy5nZXQoMCkub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcihsb3dlclJhdGUsIGxvd2VyUmF0ZSkpOworICAgICAgICBzc3RhYmxlcy5nZXQoMSkub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcihoaWdoZXJSYXRlLCBoaWdoZXJSYXRlKSk7CisgICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNzdGFibGVzID0gcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBvZihjZnMubWV0YWRhdGEuaWQsIHR4biksIChzaW5nbGVTdW1tYXJ5T2ZmSGVhcFNwYWNlICogMykpOworICAgICAgICB9CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoc3N0YWJsZXMsIGhvdG5lc3NDb21wYXJhdG9yKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwgLyAyLCBzc3RhYmxlcy5nZXQoMCkuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwgLyAyLCBzc3RhYmxlcy5nZXQoMSkuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwsIHNzdGFibGVzLmdldCgyKS5nZXRJbmRleFN1bW1hcnkoKS5nZXRTYW1wbGluZ0xldmVsKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCwgc3N0YWJsZXMuZ2V0KDMpLmdldEluZGV4U3VtbWFyeSgpLmdldFNhbXBsaW5nTGV2ZWwoKSk7CisgICAgICAgIHZhbGlkYXRlRGF0YShjZnMsIG51bVJvd3MpOworCisgICAgICAgIC8vIHJlc2V0LCBhbmQgdGhlbiB0aGlzIHRpbWUsIGxlYXZlIGVub3VnaCBzcGFjZSBmb3Igb25lIG9mIHRoZSBjb2xkIHNzdGFibGVzIHRvIG5vdCBnZXQgZG93bnNhbXBsZWQKKyAgICAgICAgc3N0YWJsZXMgPSByZXNldFN1bW1hcmllcyhjZnMsIHNzdGFibGVzLCBzaW5nbGVTdW1tYXJ5T2ZmSGVhcFNwYWNlKTsKKyAgICAgICAgc3N0YWJsZXMuZ2V0KDApLm92ZXJyaWRlUmVhZE1ldGVyKG5ldyBSZXN0b3JhYmxlTWV0ZXIoMS4wLCAxLjApKTsKKyAgICAgICAgc3N0YWJsZXMuZ2V0KDEpLm92ZXJyaWRlUmVhZE1ldGVyKG5ldyBSZXN0b3JhYmxlTWV0ZXIoMi4wLCAyLjApKTsKKyAgICAgICAgc3N0YWJsZXMuZ2V0KDIpLm92ZXJyaWRlUmVhZE1ldGVyKG5ldyBSZXN0b3JhYmxlTWV0ZXIoMTAwMC4wLCAxMDAwLjApKTsKKyAgICAgICAgc3N0YWJsZXMuZ2V0KDMpLm92ZXJyaWRlUmVhZE1ldGVyKG5ldyBSZXN0b3JhYmxlTWV0ZXIoMTAwMC4wLCAxMDAwLjApKTsKKworICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KHNzdGFibGVzLCBPcGVyYXRpb25UeXBlLlVOS05PV04pKQorICAgICAgICB7CisgICAgICAgICAgICBzc3RhYmxlcyA9IHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAoc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSAqIDMpICsgNTApOworICAgICAgICB9CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoc3N0YWJsZXMsIGhvdG5lc3NDb21wYXJhdG9yKTsKKworICAgICAgICBpZiAoc3N0YWJsZXMuZ2V0KDApLmdldEluZGV4U3VtbWFyeSgpLmdldFNhbXBsaW5nTGV2ZWwoKSA9PSBtaW5TYW1wbGluZ0xldmVsKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwsIHNzdGFibGVzLmdldCgxKS5nZXRJbmRleFN1bW1hcnkoKS5nZXRTYW1wbGluZ0xldmVsKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCwgc3N0YWJsZXMuZ2V0KDApLmdldEluZGV4U3VtbWFyeSgpLmdldFNhbXBsaW5nTGV2ZWwoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwsIHNzdGFibGVzLmdldCgyKS5nZXRJbmRleFN1bW1hcnkoKS5nZXRTYW1wbGluZ0xldmVsKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCwgc3N0YWJsZXMuZ2V0KDMpLmdldEluZGV4U3VtbWFyeSgpLmdldFNhbXBsaW5nTGV2ZWwoKSk7CisgICAgICAgIHZhbGlkYXRlRGF0YShjZnMsIG51bVJvd3MpOworCisKKyAgICAgICAgLy8gQ2F1c2UgYSBtaXggb2YgdXBzYW1wbGluZyBhbmQgZG93bnNhbXBsaW5nLiBXZSdsbCBsZWF2ZSBlbm91Z2ggc3BhY2UgZm9yIHR3byBmdWxsIGluZGV4IHN1bW1hcmllcy4gVGhlIHR3bworICAgICAgICAvLyBjb2xkZXN0IHNzdGFibGVzIHdpbGwgZ2V0IGRvd25zYW1wbGVkIHRvIDQvMTI4IG9mIHRoZWlyIHNpemUsIGxlYXZpbmcgdXMgd2l0aCAxIGFuZCA5Mi8xMjh0aCBpbmRleAorICAgICAgICAvLyBzdW1tYXJpZXMgd29ydGggb2Ygc3BhY2UuICBUaGUgaG90dGVzdCBzc3RhYmxlIHNob3VsZCBnZXQgYSBmdWxsIGluZGV4IHN1bW1hcnksIGFuZCB0aGUgb25lIGluIHRoZSBtaWRkbGUKKyAgICAgICAgLy8gc2hvdWxkIGdldCB0aGUgcmVtYWluZGVyLgorICAgICAgICBzc3RhYmxlcy5nZXQoMCkub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcigwLjAsIDAuMCkpOworICAgICAgICBzc3RhYmxlcy5nZXQoMSkub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcigwLjAsIDAuMCkpOworICAgICAgICBzc3RhYmxlcy5nZXQoMikub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcig5MiwgOTIpKTsKKyAgICAgICAgc3N0YWJsZXMuZ2V0KDMpLm92ZXJyaWRlUmVhZE1ldGVyKG5ldyBSZXN0b3JhYmxlTWV0ZXIoMTI4LjAsIDEyOC4wKSk7CisgICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNzdGFibGVzID0gcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBvZihjZnMubWV0YWRhdGEuaWQsIHR4biksIChsb25nKSAoc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSArIChzaW5nbGVTdW1tYXJ5T2ZmSGVhcFNwYWNlICogKDkyLjAgLyBCQVNFX1NBTVBMSU5HX0xFVkVMKSkpKTsKKyAgICAgICAgfQorICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHNzdGFibGVzLCBob3RuZXNzQ29tcGFyYXRvcik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzc3RhYmxlcy5nZXQoMCkuZ2V0SW5kZXhTdW1tYXJ5KCkuc2l6ZSgpKTsgIC8vIGF0IHRoZSBtaW4gc2FtcGxpbmcgbGV2ZWwKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNzdGFibGVzLmdldCgwKS5nZXRJbmRleFN1bW1hcnkoKS5zaXplKCkpOyAgLy8gYXQgdGhlIG1pbiBzYW1wbGluZyBsZXZlbAorICAgICAgICBhc3NlcnRUcnVlKHNzdGFibGVzLmdldCgyKS5nZXRJbmRleFN1bW1hcnkoKS5nZXRTYW1wbGluZ0xldmVsKCkgPiBtaW5TYW1wbGluZ0xldmVsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzc3RhYmxlcy5nZXQoMikuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpIDwgQkFTRV9TQU1QTElOR19MRVZFTCk7CisgICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMLCBzc3RhYmxlcy5nZXQoMykuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpKTsKKyAgICAgICAgdmFsaWRhdGVEYXRhKGNmcywgbnVtUm93cyk7CisKKyAgICAgICAgLy8gRG9uJ3QgbGVhdmUgZW5vdWdoIHNwYWNlIGZvciBldmVuIHRoZSBtaW5pbWFsIGluZGV4IHN1bW1hcmllcworICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KHNzdGFibGVzLCBPcGVyYXRpb25UeXBlLlVOS05PV04pKQorICAgICAgICB7CisgICAgICAgICAgICBzc3RhYmxlcyA9IHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAxMCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChSIHNzdGFibGUgOiBzc3RhYmxlcykKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLnNpemUoKSk7ICAvLyBhdCB0aGUgbWluIHNhbXBsaW5nIGxldmVsCisgICAgICAgIHZhbGlkYXRlRGF0YShjZnMsIG51bVJvd3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYnVpbGRBdFNhbXBsaW5nTGV2ZWwoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0cmluZyBrc25hbWUgPSBLRVlTUEFDRTE7CisgICAgICAgIFN0cmluZyBjZm5hbWUgPSBDRl9TVEFOREFSRExPV2lJTlRFUlZBTDsKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKGtzbmFtZSk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKGNmbmFtZSk7CisgICAgICAgIGNmcy50cnVuY2F0ZUJsb2NraW5nKCk7CisgICAgICAgIGNmcy5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKworICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlWzEwMF0pOworCisgICAgICAgIGludCBudW1Sb3dzID0gMjU2OworICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBudW1Sb3dzOyByb3crKykKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIGtleSA9IFN0cmluZy5mb3JtYXQoIiUzZCIsIHJvdyk7CisgICAgICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgMCwga2V5KQorICAgICAgICAgICAgLmNsdXN0ZXJpbmcoImNvbHVtbiIpCisgICAgICAgICAgICAuYWRkKCJ2YWwiLCB2YWx1ZSkKKyAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICAgICAuYXBwbHlVbnNhZmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIFV0aWwuZmx1c2goY2ZzKTsKKworICAgICAgICBMaXN0PFI+IHNzdGFibGVzID0gU2VydmVyVGVzdFV0aWxzLmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhjZnMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZXMuc2l6ZSgpKTsKKyAgICAgICAgUiBvcmlnaW5hbCA9IHNzdGFibGVzLmdldCgwKTsKKworICAgICAgICBSIHNzdGFibGUgPSBvcmlnaW5hbDsKKyAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlLCBPcGVyYXRpb25UeXBlLlVOS05PV04pKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBzYW1wbGluZ0xldmVsID0gMTsgc2FtcGxpbmdMZXZlbCA8IEJBU0VfU0FNUExJTkdfTEVWRUw7IHNhbXBsaW5nTGV2ZWwrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzc3RhYmxlID0gc3N0YWJsZS5jbG9uZVdpdGhOZXdTdW1tYXJ5U2FtcGxpbmdMZXZlbChjZnMsIHNhbXBsaW5nTGV2ZWwpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhzYW1wbGluZ0xldmVsLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldFNhbXBsaW5nTGV2ZWwoKSk7CisgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkU2l6ZSA9IChudW1Sb3dzICogc2FtcGxpbmdMZXZlbCkgLyAoY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwgKiBCQVNFX1NBTVBMSU5HX0xFVkVMKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTaXplLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLnNpemUoKSwgMSk7CisgICAgICAgICAgICAgICAgdHhuLnVwZGF0ZShzc3RhYmxlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB0eG4uY2hlY2twb2ludCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHhuLmZpbmlzaCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Sk1YRnVuY3Rpb25zKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBJbmRleFN1bW1hcnlNYW5hZ2VyIG1hbmFnZXIgPSBJbmRleFN1bW1hcnlNYW5hZ2VyLmluc3RhbmNlOworCisgICAgICAgIC8vIHJlc2l6ZSBpbnRlcnZhbAorICAgICAgICBtYW5hZ2VyLnNldFJlc2l6ZUludGVydmFsSW5NaW51dGVzKC0xKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0SW5kZXhTdW1tYXJ5UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoKSk7CisgICAgICAgIGFzc2VydE51bGwobWFuYWdlci5nZXRUaW1lVG9OZXh0UmVzaXplKFRpbWVVbml0Lk1JTlVURVMpKTsKKworICAgICAgICBtYW5hZ2VyLnNldFJlc2l6ZUludGVydmFsSW5NaW51dGVzKDEwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBtYW5hZ2VyLmdldFJlc2l6ZUludGVydmFsSW5NaW51dGVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIERhdGFiYXNlRGVzY3JpcHRvci5nZXRJbmRleFN1bW1hcnlSZXNpemVJbnRlcnZhbEluTWludXRlcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBtYW5hZ2VyLmdldFRpbWVUb05leHRSZXNpemUoVGltZVVuaXQuTUlOVVRFUyksIDEpOworICAgICAgICBtYW5hZ2VyLnNldFJlc2l6ZUludGVydmFsSW5NaW51dGVzKDE1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE1LCBtYW5hZ2VyLmdldFJlc2l6ZUludGVydmFsSW5NaW51dGVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTUsIERhdGFiYXNlRGVzY3JpcHRvci5nZXRJbmRleFN1bW1hcnlSZXNpemVJbnRlcnZhbEluTWludXRlcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE1LCBtYW5hZ2VyLmdldFRpbWVUb05leHRSZXNpemUoVGltZVVuaXQuTUlOVVRFUyksIDIpOworCisgICAgICAgIC8vIG1lbW9yeSBwb29sIGNhcGFjaXR5CisgICAgICAgIGFzc2VydFRydWUobWFuYWdlci5nZXRNZW1vcnlQb29sQ2FwYWNpdHlJbk1CKCkgPj0gMCk7CisgICAgICAgIG1hbmFnZXIuc2V0TWVtb3J5UG9vbENhcGFjaXR5SW5NQigxMCk7CisgICAgICAgIGFzc2VydEVxdWFscygxMCwgbWFuYWdlci5nZXRNZW1vcnlQb29sQ2FwYWNpdHlJbk1CKCkpOworCisgICAgICAgIFN0cmluZyBrc25hbWUgPSBLRVlTUEFDRTE7CisgICAgICAgIFN0cmluZyBjZm5hbWUgPSBDRl9TVEFOREFSRExPV2lJTlRFUlZBTDsgLy8gaW5kZXggaW50ZXJ2YWwgb2YgOCwgbm8ga2V5IGNhY2hpbmcKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKGtzbmFtZSk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKGNmbmFtZSk7CisgICAgICAgIGNmcy50cnVuY2F0ZUJsb2NraW5nKCk7CisgICAgICAgIGNmcy5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKworICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlWzEwMF0pOworCisgICAgICAgIGludCBudW1TU1RhYmxlcyA9IDI7CisgICAgICAgIGludCBudW1Sb3dzID0gMTA7CisgICAgICAgIGZvciAoaW50IHNzdGFibGUgPSAwOyBzc3RhYmxlIDwgbnVtU1NUYWJsZXM7IHNzdGFibGUrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbnVtUm93czsgcm93KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IFN0cmluZy5mb3JtYXQoIiUzZCIsIHJvdyk7CisgICAgICAgICAgICAgICAgbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoY2ZzLm1ldGFkYXRhKCksIDAsIGtleSkKKyAgICAgICAgICAgICAgICAuY2x1c3RlcmluZygiY29sdW1uIikKKyAgICAgICAgICAgICAgICAuYWRkKCJ2YWwiLCB2YWx1ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICAgICAgICAgIC5hcHBseVVuc2FmZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVXRpbC5mbHVzaChjZnMpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYW5hZ2VyLmdldEF2ZXJhZ2VJbmRleEludGVydmFsKCkgPj0gY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwpOworICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBpbnRlcnZhbHMgPSBtYW5hZ2VyLmdldEluZGV4SW50ZXJ2YWxzKCk7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgSW50ZWdlcj4gZW50cnkgOiBpbnRlcnZhbHMuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIGlmIChlbnRyeS5nZXRLZXkoKS5jb250YWlucyhDRl9TVEFOREFSRExPV2lJTlRFUlZBTCkpCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsLCBlbnRyeS5nZXRWYWx1ZSgpLCAwLjAwMSk7CisKKyAgICAgICAgbWFuYWdlci5zZXRNZW1vcnlQb29sQ2FwYWNpdHlJbk1CKDApOworICAgICAgICBtYW5hZ2VyLnJlZGlzdHJpYnV0ZVN1bW1hcmllcygpOworICAgICAgICBhc3NlcnRUcnVlKG1hbmFnZXIuZ2V0QXZlcmFnZUluZGV4SW50ZXJ2YWwoKSA+IGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsKTsKKyAgICAgICAgaW50ZXJ2YWxzID0gbWFuYWdlci5nZXRJbmRleEludGVydmFscygpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEludGVnZXI+IGVudHJ5IDogaW50ZXJ2YWxzLmVudHJ5U2V0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlbnRyeS5nZXRLZXkoKS5jb250YWlucyhDRl9TVEFOREFSRExPV2lJTlRFUlZBTCkpCisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlbnRyeS5nZXRWYWx1ZSgpID49IGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENhbmNlbEluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGVzdENhbmNlbEluZGV4SGVscGVyKChjZnMpIC0+IENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLnN0b3BDb21wYWN0aW9uKCJJTkRFWF9TVU1NQVJZIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENhbmNlbEluZGV4SW50ZXJydXB0KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGVzdENhbmNlbEluZGV4SGVscGVyKChjZnMpIC0+IENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmludGVycnVwdENvbXBhY3Rpb25Gb3IoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGNmcy5tZXRhZGF0YSgpKSwgKHNzdGFibGUpIC0+IHRydWUsIGZhbHNlKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENhbmNlbEluZGV4SGVscGVyKENvbnN1bWVyPENvbHVtbkZhbWlseVN0b3JlPiBjYW5jZWxGdW5jdGlvbikgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIGtzbmFtZSA9IEtFWVNQQUNFMTsKKyAgICAgICAgU3RyaW5nIGNmbmFtZSA9IENGX1NUQU5EQVJETE9XaUlOVEVSVkFMOyAvLyBpbmRleCBpbnRlcnZhbCBvZiA4LCBubyBrZXkgY2FjaGluZworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NuYW1lKTsKKyAgICAgICAgZmluYWwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2ZuYW1lKTsKKyAgICAgICAgY2ZzLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICBmaW5hbCBpbnQgbnVtU1NUYWJsZXMgPSA4OworICAgICAgICBpbnQgbnVtUm93cyA9IDI1NjsKKyAgICAgICAgY3JlYXRlU1NUYWJsZXMoa3NuYW1lLCBjZm5hbWUsIG51bVNTVGFibGVzLCBudW1Sb3dzKTsKKworICAgICAgICBMaXN0PFI+IGFsbFNTVGFibGVzID0gU2VydmVyVGVzdFV0aWxzLmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhjZnMpOworICAgICAgICBMaXN0PFI+IHNzdGFibGVzID0gYWxsU1NUYWJsZXMuc3ViTGlzdCgwLCA0KTsKKyAgICAgICAgTGlzdDxSPiBjb21wYWN0aW5nID0gYWxsU1NUYWJsZXMuc3ViTGlzdCg0LCA4KTsKKworICAgICAgICBmb3IgKFIgc3N0YWJsZSA6IHNzdGFibGVzKQorICAgICAgICAgICAgc3N0YWJsZS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKDEwMC4wLCAxMDAuMCkpOworCisgICAgICAgIGZpbmFsIGxvbmcgc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSA9IHNzdGFibGVzLmdldCgwKS5nZXRJbmRleFN1bW1hcnkoKS5nZXRPZmZIZWFwU2l6ZSgpOworCisgICAgICAgIC8vIGV2ZXJ5dGhpbmcgc2hvdWxkIGdldCBjdXQgaW4gaGFsZgorICAgICAgICBmaW5hbCBBdG9taWNSZWZlcmVuY2U8Q29tcGFjdGlvbkludGVycnVwdGVkRXhjZXB0aW9uPiBleGNlcHRpb24gPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKyAgICAgICAgLy8gYmFycmllciB0byBjb250cm9sIHdoZW4gcmVkaXN0cmlidXRpb24gcnVucworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBiYXJyaWVyID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBDb21wYWN0aW9uSW5mby5Ib2xkZXIgb25nb2luZ0NvbXBhY3Rpb24gPSBuZXcgQ29tcGFjdGlvbkluZm8uSG9sZGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIENvbXBhY3Rpb25JbmZvIGdldENvbXBhY3Rpb25JbmZvKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25JbmZvKGNmcy5tZXRhZGF0YSgpLCBPcGVyYXRpb25UeXBlLlVOS05PV04sIDAsIDAsIG5leHRUaW1lVVVJRCgpLCBjb21wYWN0aW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiBpZ25vcmVkID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoY29tcGFjdGluZywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmJlZ2luQ29tcGFjdGlvbihvbmdvaW5nQ29tcGFjdGlvbik7CisKKyAgICAgICAgICAgIFRocmVhZCB0ID0gTmFtZWRUaHJlYWRGYWN0b3J5LmNyZWF0ZUFub255bW91c1RocmVhZChuZXcgUnVubmFibGUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgbGVhdmUgZW5vdWdoIHNwYWNlIGZvciBldmVuIHRoZSBtaW5pbWFsIGluZGV4IHN1bW1hcmllcworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlcywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleFN1bW1hcnlNYW5hZ2VyLnJlZGlzdHJpYnV0ZVN1bW1hcmllcyhuZXcgT2JzZXJ2YWJsZVJlZGlzdHJpYnV0aW9uKG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVTdW1tYXJ5T2ZmSGVhcFNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFycmllcikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChDb21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5zZXQoZXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgd2hpbGUgKENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmdldEFjdGl2ZUNvbXBhY3Rpb25zKCkgPCAyICYmIHQuaXNBbGl2ZSgpKQorICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxKTsKKyAgICAgICAgICAgIC8vIHRvIGVuc3VyZSB0aGF0IHRoZSBzdG9wIGNvbmRpdGlvbiBjaGVjayBpbiBJbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvbjo6cmVkaXN0cmlidXRlU3VtbWFyaWVzCisgICAgICAgICAgICAvLyBpcyBtYWRlICphZnRlciogdGhlIGhhbHQgcmVxdWVzdCBpcyBtYWRlIHRvIHRoZSBDb21wYWN0aW9uTWFuYWdlciwgZG9uJ3QgYWxsb3cgdGhlIHJlZGlzdHJpYnV0aW9uCisgICAgICAgICAgICAvLyB0byBwcm9jZWVkIHVudGlsIHN0b3BDb21wYWN0aW9uIGhhcyBiZWVuIGNhbGxlZC4KKyAgICAgICAgICAgIGNhbmNlbEZ1bmN0aW9uLmFjY2VwdChjZnMpOworICAgICAgICAgICAgLy8gYWxsb3dzIHRoZSByZWRpc3RyaWJ1dGlvbiB0byBwcm9jZWVkCisgICAgICAgICAgICBiYXJyaWVyLmNvdW50RG93bigpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuZmluaXNoQ29tcGFjdGlvbihvbmdvaW5nQ29tcGFjdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnROb3ROdWxsKCJFeHBlY3RlZCBjb21wYWN0aW9uIGludGVycnVwdGVkIGV4Y2VwdGlvbiIsIGV4Y2VwdGlvbi5nZXQoKSk7CisgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIG5vIGFjdGl2ZSBjb21wYWN0aW9ucyIsIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmFjdGl2ZS5nZXRDb21wYWN0aW9ucygpLmlzRW1wdHkoKSk7CisKKyAgICAgICAgU2V0PFI+IGJlZm9yZVJlZGlzdHJpYnV0aW9uU1NUYWJsZXMgPSBuZXcgSGFzaFNldDw+KGFsbFNTVGFibGVzKTsKKyAgICAgICAgU2V0PFI+IGFmdGVyQ2FuY2VsU1NUYWJsZXMgPSBTZXRzLm5ld0hhc2hTZXQoU2VydmVyVGVzdFV0aWxzLmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhjZnMpKTsKKyAgICAgICAgU2V0PFI+IGRpc2pvaW50ID0gU2V0cy5zeW1tZXRyaWNEaWZmZXJlbmNlKGJlZm9yZVJlZGlzdHJpYnV0aW9uU1NUYWJsZXMsIGFmdGVyQ2FuY2VsU1NUYWJsZXMpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoIk1pc21hdGNoZWQgZmlsZXMgYmVmb3JlIGFuZCBhZnRlciBjYW5jZWxsaW5nIHJlZGlzdHJpYnV0aW9uOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb2luZXIub24oIiwiKS5qb2luKGRpc2pvaW50KSksCisgICAgICAgICAgICAgICAgICAgZGlzam9pbnQuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0T25EaXNrU3RhdGUoY2ZzLCA4KTsKKyAgICAgICAgdmFsaWRhdGVEYXRhKGNmcywgbnVtUm93cyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF1c2VJbmRleFN1bW1hcnlNYW5hZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIGtzbmFtZSA9IEtFWVNQQUNFMTsKKyAgICAgICAgU3RyaW5nIGNmbmFtZSA9IENGX1NUQU5EQVJETE9XaUlOVEVSVkFMOyAvLyBpbmRleCBpbnRlcnZhbCBvZiA4LCBubyBrZXkgY2FjaGluZworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NuYW1lKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2ZuYW1lKTsKKyAgICAgICAgaW50IG51bVNTVGFibGVzID0gNDsKKyAgICAgICAgaW50IG51bVJvd3MgPSAyNTY7CisgICAgICAgIGNyZWF0ZVNTVGFibGVzKGtzbmFtZSwgY2ZuYW1lLCBudW1TU1RhYmxlcywgbnVtUm93cyk7CisKKyAgICAgICAgTGlzdDxSPiBzc3RhYmxlcyA9IFNlcnZlclRlc3RVdGlscy5nZXRMaXZlSW5kZXhTdW1tYXJ5U3VwcG9ydGluZ1JlYWRlcnMoY2ZzKTsKKyAgICAgICAgZm9yIChSIHNzdGFibGUgOiBzc3RhYmxlcykKKyAgICAgICAgICAgIHNzdGFibGUub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcigxMDAuMCwgMTAwLjApKTsKKworICAgICAgICBsb25nIHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgPSBzc3RhYmxlcy5nZXQoMCkuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0T2ZmSGVhcFNpemUoKTsKKworICAgICAgICAvLyBldmVyeXRoaW5nIHNob3VsZCBnZXQgY3V0IGluIGhhbGYKKyAgICAgICAgYXNzZXJ0IHNzdGFibGVzLnNpemUoKSA9PSBudW1TU1RhYmxlczsKKyAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlcywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5IChBdXRvQ2xvc2VhYmxlIHRvcmVzdW1lID0gQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UucGF1c2VHbG9iYWxDb21wYWN0aW9uKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3N0YWJsZXMgPSByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIG9mKGNmcy5tZXRhZGF0YSgpLmlkLCB0eG4pLCAoc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSAqIChudW1TU1RhYmxlcyAvIDIpKSk7CisgICAgICAgICAgICAgICAgZmFpbCgiVGhlIHJlZGlzdHJpYnV0aW9uIHNob3VsZCBmYWlsIC0gd2UgZ290IHBhdXNlZCBiZWZvcmUgYWRkaW5nIHRvIGFjdGl2ZSBjb21wYWN0aW9ucywgYnV0IGFmdGVyIG1hcmtpbmcgY29tcGFjdGluZyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICBmb3IgKFIgc3N0YWJsZSA6IHNzdGFibGVzKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpKTsKKyAgICAgICAgdmFsaWRhdGVEYXRhKGNmcywgbnVtUm93cyk7CisgICAgICAgIGFzc2VydE9uRGlza1N0YXRlKGNmcywgbnVtU1NUYWJsZXMpOworICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxSPiByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoTGlzdDxSPiBjb21wYWN0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFRhYmxlSWQsIExpZmVjeWNsZVRyYW5zYWN0aW9uPiB0cmFuc2FjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIG1lbW9yeVBvb2xCeXRlcykKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGxvbmcgbm9uUmVkaXN0cmlidXRpbmdPZmZIZWFwU2l6ZSA9IGNvbXBhY3Rpbmcuc3RyZWFtKCkubWFwVG9Mb25nKHQgLT4gdC5nZXRJbmRleFN1bW1hcnkoKS5nZXRPZmZIZWFwU2l6ZSgpKS5zdW0oKTsKKyAgICAgICAgcmV0dXJuIEluZGV4U3VtbWFyeU1hbmFnZXIucmVkaXN0cmlidXRlU3VtbWFyaWVzKG5ldyBJbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvbih0cmFuc2FjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uUmVkaXN0cmlidXRpbmdPZmZIZWFwU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlQb29sQnl0ZXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBPYnNlcnZhYmxlUmVkaXN0cmlidXRpb24gZXh0ZW5kcyBJbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgICAgQ291bnREb3duTGF0Y2ggYmFycmllcjsKKworICAgICAgICBPYnNlcnZhYmxlUmVkaXN0cmlidXRpb24oTWFwPFRhYmxlSWQsIExpZmVjeWNsZVRyYW5zYWN0aW9uPiB0cmFuc2FjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIG5vblJlZGlzdHJpYnV0aW5nT2ZmSGVhcFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIG1lbW9yeVBvb2xCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50RG93bkxhdGNoIGJhcnJpZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKHRyYW5zYWN0aW9ucywgbm9uUmVkaXN0cmlidXRpbmdPZmZIZWFwU2l6ZSwgbWVtb3J5UG9vbEJ5dGVzKTsKKyAgICAgICAgICAgIHRoaXMuYmFycmllciA9IGJhcnJpZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgPFIgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyICYgSW5kZXhTdW1tYXJ5U3VwcG9ydDxSPj4gTGlzdDxSPiByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmFycmllci5hd2FpdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVycnVwdGVkIHdhaXRpbmcgb24gdGVzdCBiYXJyaWVyIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3VwZXIucmVkaXN0cmlidXRlU3VtbWFyaWVzKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9pbmRleHN1bW1hcnkvSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9pbmRleHN1bW1hcnkvSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMxMDNhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2luZGV4c3VtbWFyeS9JbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dVcGRhdGVCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZy5Db21taXRMb2dQb3NpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlJlc3RvcmFibGVNZXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlN0b3JhZ2VNZXRyaWNzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5DYWNoaW5nUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hVGVzdFV0aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBJbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvblRlc3Q8UiBleHRlbmRzIFNTVGFibGVSZWFkZXIgJiBJbmRleFN1bW1hcnlTdXBwb3J0PFI+PgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTUEFDRTEgPSAiSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb25UZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfU1RBTkRBUkQgPSAiU3RhbmRhcmQiOworCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVNjaGVtYSgpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoIlRoaXMgdGVzdCBtYWtlIHNlbnNlIG9ubHkgaWYgdGhlIGRlZmF1bHQgU1NUYWJsZSBmb3JtYXQgc3VwcG9ydCBpbmRleCBzdW1tYXJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhTdW1tYXJ5U3VwcG9ydC5pc1N1cHBvcnRlZEJ5KERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSkpOworICAgICAgICBTY2hlbWFMb2FkZXIucHJlcGFyZVNlcnZlcigpOworICAgICAgICBTY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2UoS0VZU1BBQ0UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5c3BhY2VQYXJhbXMuc2ltcGxlKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENGX1NUQU5EQVJEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1pbkluZGV4SW50ZXJ2YWwoOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhJbmRleEludGVydmFsKDI1NikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWNoaW5nKENhY2hpbmdQYXJhbXMuQ0FDSEVfTk9USElORykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1ldHJpY3NMb2FkQWZ0ZXJSZWRpc3RyaWJ1dGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIGtzbmFtZSA9IEtFWVNQQUNFMTsKKyAgICAgICAgU3RyaW5nIGNmbmFtZSA9IENGX1NUQU5EQVJEOworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NuYW1lKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2ZuYW1lKTsKKyAgICAgICAgaW50IG51bVNTVGFibGVzID0gMTsKKyAgICAgICAgaW50IG51bVJvd3MgPSAxMDI0ICogMTA7CisKKyAgICAgICAgbG9uZyBsb2FkID0gU3RvcmFnZU1ldHJpY3MubG9hZC5nZXRDb3VudCgpOworICAgICAgICBTdG9yYWdlTWV0cmljcy5sb2FkLmRlYyhsb2FkKTsgLy8gcmVzZXQgdGhlIGxvYWQgbWV0cmljCisgICAgICAgIGxvbmcgdW5jb21wcmVzc2VkTG9hZCA9IFN0b3JhZ2VNZXRyaWNzLnVuY29tcHJlc3NlZExvYWQuZ2V0Q291bnQoKTsKKyAgICAgICAgU3RvcmFnZU1ldHJpY3MudW5jb21wcmVzc2VkTG9hZC5kZWModW5jb21wcmVzc2VkTG9hZCk7IC8vIHJlc2V0IHRoZSB1bmNvbXByZXNzZWQgbG9hZCBtZXRyaWMKKworICAgICAgICBjcmVhdGVTU1RhYmxlcyhrc25hbWUsIGNmbmFtZSwgbnVtU1NUYWJsZXMsIG51bVJvd3MpOworCisgICAgICAgIExpc3Q8Uj4gc3N0YWJsZXMgPSBTZXJ2ZXJUZXN0VXRpbHMuZ2V0TGl2ZUluZGV4U3VtbWFyeVN1cHBvcnRpbmdSZWFkZXJzKGNmcyk7CisgICAgICAgIGZvciAoUiBzc3RhYmxlIDogc3N0YWJsZXMpCisgICAgICAgICAgICBzc3RhYmxlLm92ZXJyaWRlUmVhZE1ldGVyKG5ldyBSZXN0b3JhYmxlTWV0ZXIoMTAwLjAsIDEwMC4wKSk7CisKKyAgICAgICAgbG9uZyBvbGRTaXplID0gMDsKKyAgICAgICAgbG9uZyBvbGRTaXplVW5jb21wcmVzc2VkID0gMDsKKworICAgICAgICBmb3IgKFIgc3N0YWJsZSA6IHNzdGFibGVzKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbCgpLCAwLjAwMSk7CisgICAgICAgICAgICBvbGRTaXplICs9IHNzdGFibGUuYnl0ZXNPbkRpc2soKTsKKyAgICAgICAgICAgIG9sZFNpemVVbmNvbXByZXNzZWQgKz0gc3N0YWJsZS5sb2dpY2FsQnl0ZXNPbkRpc2soKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvYWQgPSBTdG9yYWdlTWV0cmljcy5sb2FkLmdldENvdW50KCk7CisgICAgICAgIGxvbmcgb3RoZXJzID0gbG9hZCAtIG9sZFNpemU7IC8vIE90aGVyIFNTVGFibGVzIHNpemUsIGUuZy4gc2NoZW1hIGFuZCBvdGhlciBzeXN0ZW0gU1NUYWJsZXMKKworICAgICAgICB1bmNvbXByZXNzZWRMb2FkID0gU3RvcmFnZU1ldHJpY3MudW5jb21wcmVzc2VkTG9hZC5nZXRDb3VudCgpOworICAgICAgICBsb25nIG90aGVyc1VuY29tcHJlc3NlZCA9IHVuY29tcHJlc3NlZExvYWQgLSBvbGRTaXplVW5jb21wcmVzc2VkOworCisgICAgICAgIGludCBvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwgPSBjZnMubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbDsKKyAgICAgICAgLy8gZG91YmxlIHRoZSBtaW5faW5kZXhfaW50ZXJ2YWwKKyAgICAgICAgU2NoZW1hVGVzdFV0aWwuYW5ub3VuY2VUYWJsZVVwZGF0ZShjZnMubWV0YWRhdGEoKS51bmJ1aWxkKCkubWluSW5kZXhJbnRlcnZhbChvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwgKiAyKS5idWlsZCgpKTsKKyAgICAgICAgSW5kZXhTdW1tYXJ5TWFuYWdlci5pbnN0YW5jZS5yZWRpc3RyaWJ1dGVTdW1tYXJpZXMoKTsKKworICAgICAgICBsb25nIG5ld1NpemUgPSAwOworICAgICAgICBsb25nIG5ld1NpemVVbmNvbXByZXNzZWQgPSAwOworCisgICAgICAgIGZvciAoUiBzc3RhYmxlIDogU2VydmVyVGVzdFV0aWxzLjxSPmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhjZnMpKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbCgpLCAwLjAwMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVtUm93cyAvIGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLnNpemUoKSk7CisgICAgICAgICAgICBuZXdTaXplICs9IHNzdGFibGUuYnl0ZXNPbkRpc2soKTsKKyAgICAgICAgICAgIG5ld1NpemVVbmNvbXByZXNzZWQgKz0gc3N0YWJsZS5sb2dpY2FsQnl0ZXNPbkRpc2soKTsKKyAgICAgICAgfQorCisgICAgICAgIG5ld1NpemUgKz0gb3RoZXJzOworICAgICAgICBsb2FkID0gU3RvcmFnZU1ldHJpY3MubG9hZC5nZXRDb3VudCgpOworICAgICAgICAvLyBuZXcgc2l6ZSB3ZSBjYWxjdWxhdGUgc2hvdWxkIGJlIGFsbW9zdCB0aGUgc2FtZSBhcyB0aGUgbG9hZCBpbiBtZXRyaWNzCisgICAgICAgIGFzc2VydEVxdWFscyhuZXdTaXplLCBsb2FkLCBuZXdTaXplIC8gMTAuMCk7CisKKyAgICAgICAgbmV3U2l6ZVVuY29tcHJlc3NlZCArPSBvdGhlcnNVbmNvbXByZXNzZWQ7CisgICAgICAgIHVuY29tcHJlc3NlZExvYWQgPSBTdG9yYWdlTWV0cmljcy51bmNvbXByZXNzZWRMb2FkLmdldENvdW50KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXdTaXplVW5jb21wcmVzc2VkLCB1bmNvbXByZXNzZWRMb2FkLCBuZXdTaXplVW5jb21wcmVzc2VkIC8gMTAuMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNTVGFibGVzKFN0cmluZyBrc25hbWUsIFN0cmluZyBjZm5hbWUsIGludCBudW1TU1RhYmxlcywgaW50IG51bVJvd3MpCisgICAgeworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NuYW1lKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2ZuYW1lKTsKKyAgICAgICAgY2ZzLnRydW5jYXRlQmxvY2tpbmcoKTsKKyAgICAgICAgY2ZzLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworCisgICAgICAgIEFycmF5TGlzdDxGdXR1cmU8Q29tbWl0TG9nUG9zaXRpb24+PiBmdXR1cmVzID0gbmV3IEFycmF5TGlzdDw+KG51bVNTVGFibGVzKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciB2YWx1ZSA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVsxMDBdKTsKKyAgICAgICAgZm9yIChpbnQgc3N0YWJsZSA9IDA7IHNzdGFibGUgPCBudW1TU1RhYmxlczsgc3N0YWJsZSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBudW1Sb3dzOyByb3crKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gU3RyaW5nLmZvcm1hdCgiJTNkIiwgcm93KTsKKyAgICAgICAgICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgMCwga2V5KQorICAgICAgICAgICAgICAgIC5jbHVzdGVyaW5nKCJjb2x1bW4iKQorICAgICAgICAgICAgICAgIC5hZGQoInZhbCIsIHZhbHVlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICAgICAgICAgLmFwcGx5VW5zYWZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmdXR1cmVzLmFkZChjZnMuZm9yY2VGbHVzaChDb2x1bW5GYW1pbHlTdG9yZS5GbHVzaFJlYXNvbi5VTklUX1RFU1RTKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChGdXR1cmU8Q29tbWl0TG9nUG9zaXRpb24+IGZ1dHVyZSA6IGZ1dHVyZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZ1dHVyZS5nZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB8IEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhudW1TU1RhYmxlcywgU2VydmVyVGVzdFV0aWxzLmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhjZnMpLnNpemUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvaW5kZXhzdW1tYXJ5L0luZGV4U3VtbWFyeVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2luZGV4c3VtbWFyeS9JbmRleFN1bW1hcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVhMTY2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2luZGV4c3VtbWFyeS9JbmRleFN1bW1hcnlUZXN0LmphdmEKQEAgLTAsMCArMSw0NDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuaW5kZXhzdW1tYXJ5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZG9tUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Eb3duc2FtcGxpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzLkRhdGFJbnB1dFN0cmVhbVBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50RW52LkNJUkNMRUNJOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRvd25zYW1wbGluZy5CQVNFX1NBTVBMSU5HX0xFVkVMOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeS5JbmRleFN1bW1hcnlCdWlsZGVyLmRvd25zYW1wbGU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuaW5kZXhzdW1tYXJ5LkluZGV4U3VtbWFyeUJ1aWxkZXIuZW50cmllc0F0U2FtcGxpbmdMZXZlbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLm5hbm9UaW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCitwdWJsaWMgY2xhc3MgSW5kZXhTdW1tYXJ5VGVzdAoreworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdEREKCkKKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOworCisgICAgICAgIGZpbmFsIGxvbmcgc2VlZCA9IG5hbm9UaW1lKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgc2VlZDogIiArIHNlZWQpOworICAgICAgICByYW5kb20uc2V0U2VlZChzZWVkKTsKKyAgICB9CisKKyAgICBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSBVdGlsLnRlc3RQYXJ0aXRpb25lcigpOworCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkKKyAgICB7CisgICAgICAgIGZpbmFsIGxvbmcgc2VlZCA9IG5hbm9UaW1lKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgc2VlZDogIiArIHNlZWQpOworICAgICAgICByYW5kb20uc2V0U2VlZChzZWVkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRleFN1bW1hcnlLZXlTaXplcygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gT24gQ2lyY2xlIENJIHdlIG5vcm1hbGx5IGRvbid0IGhhdmUgZW5vdWdoIG9mZi1oZWFwIG1lbW9yeSBmb3IgdGhpcyB0ZXN0IHNvIGlnbm9yZSBpdAorICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShDSVJDTEVDSS5nZXRTdHJpbmcoKSA9PSBudWxsKTsKKworICAgICAgICB0ZXN0SW5kZXhTdW1tYXJ5UHJvcGVydGllcygzMiwgMTAwKTsKKyAgICAgICAgdGVzdEluZGV4U3VtbWFyeVByb3BlcnRpZXMoNjQsIDEwMCk7CisgICAgICAgIHRlc3RJbmRleFN1bW1hcnlQcm9wZXJ0aWVzKDEwMCwgMTAwKTsKKyAgICAgICAgdGVzdEluZGV4U3VtbWFyeVByb3BlcnRpZXMoMTAwMCwgMTAwKTsKKyAgICAgICAgdGVzdEluZGV4U3VtbWFyeVByb3BlcnRpZXMoMTAwMDAsIDEwMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RJbmRleFN1bW1hcnlQcm9wZXJ0aWVzKGludCBrZXlTaXplLCBpbnQgbnVtS2V5cykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBmaW5hbCBpbnQgbWluSW5kZXhJbnRlcnZhbCA9IDE7CisgICAgICAgIGZpbmFsIExpc3Q8RGVjb3JhdGVkS2V5PiBrZXlzID0gbmV3IEFycmF5TGlzdDw+KG51bUtleXMpOworCisgICAgICAgIHRyeSAoSW5kZXhTdW1tYXJ5QnVpbGRlciBidWlsZGVyID0gbmV3IEluZGV4U3VtbWFyeUJ1aWxkZXIobnVtS2V5cywgbWluSW5kZXhJbnRlcnZhbCwgQkFTRV9TQU1QTElOR19MRVZFTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtS2V5czsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGVbXSByYW5kb21CeXRlcyA9IG5ldyBieXRlW2tleVNpemVdOworICAgICAgICAgICAgICAgIHJhbmRvbS5uZXh0Qnl0ZXMocmFuZG9tQnl0ZXMpOworICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBwYXJ0aXRpb25lci5kZWNvcmF0ZUtleShCeXRlQnVmZmVyLndyYXAocmFuZG9tQnl0ZXMpKTsKKyAgICAgICAgICAgICAgICBrZXlzLmFkZChrZXkpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIubWF5YmVBZGRFbnRyeShrZXksIGkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkoSW5kZXhTdW1tYXJ5IGluZGV4U3VtbWFyeSA9IGJ1aWxkZXIuYnVpbGQocGFydGl0aW9uZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1LZXlzLCBrZXlzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1pbkluZGV4SW50ZXJ2YWwsIGluZGV4U3VtbWFyeS5nZXRNaW5JbmRleEludGVydmFsKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1LZXlzLCBpbmRleFN1bW1hcnkuZ2V0TWF4TnVtYmVyT2ZFbnRyaWVzKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1LZXlzICsgMSwgaW5kZXhTdW1tYXJ5LmdldEVzdGltYXRlZEtleUNvdW50KCkpOworCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1LZXlzOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhrZXlzLmdldChpKS5nZXRLZXkoKSwgQnl0ZUJ1ZmZlci53cmFwKGluZGV4U3VtbWFyeS5nZXRLZXkoaSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgYW4gaW5kZXggc3VtbWFyeSB3aG9zZSB0b3RhbCBzaXplIGlzIGJpZ2dlciB0aGFuIDJHaUIsCisgICAgICogdGhlIGluZGV4IHN1bW1hcnkgYnVpbGRlciBzaG91bGQgbG9nIGFuIGVycm9yIGJ1dCBpdCBzaG91bGQgc3RpbGwKKyAgICAgKiBjcmVhdGUgYW4gaW5kZXggc3VtbWFyeSwgYWxiZWl0IG9uZSB0aGF0IGRvZXMgbm90IGNvdmVyIHRoZSBlbnRpcmUgc3N0YWJsZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMYXJnZUluZGV4U3VtbWFyeSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gT24gQ2lyY2xlIENJIHdlIG5vcm1hbGx5IGRvbid0IGhhdmUgZW5vdWdoIG9mZi1oZWFwIG1lbW9yeSBmb3IgdGhpcyB0ZXN0IHNvIGlnbm9yZSBpdAorICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShDSVJDTEVDSS5nZXRTdHJpbmcoKSA9PSBudWxsKTsKKworICAgICAgICBmaW5hbCBpbnQgbnVtS2V5cyA9IDEwMDAwMDA7CisgICAgICAgIGZpbmFsIGludCBrZXlTaXplID0gMzAwMDsKKyAgICAgICAgZmluYWwgaW50IG1pbkluZGV4SW50ZXJ2YWwgPSAxOworCisgICAgICAgIHRyeSAoSW5kZXhTdW1tYXJ5QnVpbGRlciBidWlsZGVyID0gbmV3IEluZGV4U3VtbWFyeUJ1aWxkZXIobnVtS2V5cywgbWluSW5kZXhJbnRlcnZhbCwgQkFTRV9TQU1QTElOR19MRVZFTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtS2V5czsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGVbXSByYW5kb21CeXRlcyA9IG5ldyBieXRlW2tleVNpemVdOworICAgICAgICAgICAgICAgIHJhbmRvbS5uZXh0Qnl0ZXMocmFuZG9tQnl0ZXMpOworICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBwYXJ0aXRpb25lci5kZWNvcmF0ZUtleShCeXRlQnVmZmVyLndyYXAocmFuZG9tQnl0ZXMpKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLm1heWJlQWRkRW50cnkoa2V5LCBpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IChJbmRleFN1bW1hcnkgaW5kZXhTdW1tYXJ5ID0gYnVpbGRlci5idWlsZChwYXJ0aXRpb25lcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChpbmRleFN1bW1hcnkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1LZXlzLCBpbmRleFN1bW1hcnkuZ2V0TWF4TnVtYmVyT2ZFbnRyaWVzKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1LZXlzICsgMSwgaW5kZXhTdW1tYXJ5LmdldEVzdGltYXRlZEtleUNvdW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBhbiBpbmRleCBzdW1tYXJ5IHdob3NlIHRvdGFsIHNpemUgaXMgYmlnZ2VyIHRoYW4gMkdpQiwKKyAgICAgKiBoYXZpbmcgdXBkYXRlZCBJbmRleFN1bW1hcnlCdWlsZGVyLmRlZmF1bHRFeHBlY3RlZEtleVNpemUgdG8gbWF0Y2ggdGhlIHNpemUsCisgICAgICogdGhlIGluZGV4IHN1bW1hcnkgc2hvdWxkIGJlIGRvd25zYW1wbGVkIGF1dG9tYXRpY2FsbHkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGFyZ2VJbmRleFN1bW1hcnlXaXRoRXhwZWN0ZWRTaXplTWF0Y2hpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIE9uIENpcmNsZSBDSSB3ZSBub3JtYWxseSBkb24ndCBoYXZlIGVub3VnaCBvZmYtaGVhcCBtZW1vcnkgZm9yIHRoaXMgdGVzdCBzbyBpZ25vcmUgaXQKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoQ0lSQ0xFQ0kuZ2V0U3RyaW5nKCkgPT0gbnVsbCk7CisKKyAgICAgICAgZmluYWwgaW50IG51bUtleXMgPSAxMDAwMDAwOworICAgICAgICBmaW5hbCBpbnQga2V5U2l6ZSA9IDMwMDA7CisgICAgICAgIGZpbmFsIGludCBtaW5JbmRleEludGVydmFsID0gMTsKKworICAgICAgICBsb25nIG9sZEV4cGVjdGVkS2V5U2l6ZSA9IEluZGV4U3VtbWFyeUJ1aWxkZXIuZGVmYXVsdEV4cGVjdGVkS2V5U2l6ZTsKKyAgICAgICAgSW5kZXhTdW1tYXJ5QnVpbGRlci5kZWZhdWx0RXhwZWN0ZWRLZXlTaXplID0gMzAwMDsKKworICAgICAgICB0cnkgKEluZGV4U3VtbWFyeUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBJbmRleFN1bW1hcnlCdWlsZGVyKG51bUtleXMsIG1pbkluZGV4SW50ZXJ2YWwsIEJBU0VfU0FNUExJTkdfTEVWRUwpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUtleXM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlW10gcmFuZG9tQnl0ZXMgPSBuZXcgYnl0ZVtrZXlTaXplXTsKKyAgICAgICAgICAgICAgICByYW5kb20ubmV4dEJ5dGVzKHJhbmRvbUJ5dGVzKTsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlci53cmFwKHJhbmRvbUJ5dGVzKSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5tYXliZUFkZEVudHJ5KGtleSwgaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSAoSW5kZXhTdW1tYXJ5IGluZGV4U3VtbWFyeSA9IGJ1aWxkZXIuYnVpbGQocGFydGl0aW9uZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaW5kZXhTdW1tYXJ5KTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobWluSW5kZXhJbnRlcnZhbCAqIDIsIGluZGV4U3VtbWFyeS5nZXRNaW5JbmRleEludGVydmFsKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1LZXlzIC8gMiwgaW5kZXhTdW1tYXJ5LmdldE1heE51bWJlck9mRW50cmllcygpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVtS2V5cyArIDIsIGluZGV4U3VtbWFyeS5nZXRFc3RpbWF0ZWRLZXlDb3VudCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIEluZGV4U3VtbWFyeUJ1aWxkZXIuZGVmYXVsdEV4cGVjdGVkS2V5U2l6ZSA9IG9sZEV4cGVjdGVkS2V5U2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEtleSgpCisgICAgeworICAgICAgICBQYWlyPExpc3Q8RGVjb3JhdGVkS2V5PiwgSW5kZXhTdW1tYXJ5PiByYW5kb20gPSBnZW5lcmF0ZVJhbmRvbUluZGV4KDEwMCwgMSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmFuZG9tLmxlZnQuZ2V0KGkpLmdldEtleSgpLCBCeXRlQnVmZmVyLndyYXAocmFuZG9tLnJpZ2h0LmdldEtleShpKSkpOworICAgICAgICByYW5kb20ucmlnaHQuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCaW5hcnlTZWFyY2goKQorICAgIHsKKyAgICAgICAgUGFpcjxMaXN0PERlY29yYXRlZEtleT4sIEluZGV4U3VtbWFyeT4gcmFuZG9tID0gZ2VuZXJhdGVSYW5kb21JbmRleCgxMDAsIDEpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIHJhbmRvbS5yaWdodC5iaW5hcnlTZWFyY2gocmFuZG9tLmxlZnQuZ2V0KGkpKSk7CisgICAgICAgIHJhbmRvbS5yaWdodC5jbG9zZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFBvc2l0aW9uKCkKKyAgICB7CisgICAgICAgIFBhaXI8TGlzdDxEZWNvcmF0ZWRLZXk+LCBJbmRleFN1bW1hcnk+IHJhbmRvbSA9IGdlbmVyYXRlUmFuZG9tSW5kZXgoMTAwLCAyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDsgaSsrKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGkqMiwgcmFuZG9tLnJpZ2h0LmdldFBvc2l0aW9uKGkpKTsKKyAgICAgICAgcmFuZG9tLnJpZ2h0LmNsb3NlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUGFpcjxMaXN0PERlY29yYXRlZEtleT4sIEluZGV4U3VtbWFyeT4gcmFuZG9tID0gZ2VuZXJhdGVSYW5kb21JbmRleCgxMDAsIDEpOworICAgICAgICBEYXRhT3V0cHV0QnVmZmVyIGRvcyA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKCk7CisgICAgICAgIEluZGV4U3VtbWFyeS5zZXJpYWxpemVyLnNlcmlhbGl6ZShyYW5kb20ucmlnaHQsIGRvcyk7CisgICAgICAgIC8vIHdyaXRlIGp1bmsKKyAgICAgICAgZG9zLndyaXRlVVRGKCJKVU5LIik7CisgICAgICAgIGRvcy53cml0ZVVURigiSlVOSyIpOworICAgICAgICBGaWxlVXRpbHMuY2xvc2VRdWlldGx5KGRvcyk7CisgICAgICAgIERhdGFJbnB1dFN0cmVhbVBsdXMgZGlzID0gbmV3IERhdGFJbnB1dEJ1ZmZlcihkb3MudG9CeXRlQXJyYXkoKSk7CisgICAgICAgIEluZGV4U3VtbWFyeSBpcyA9IEluZGV4U3VtbWFyeS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGRpcywgcGFydGl0aW9uZXIsIDEsIDEpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIGlzLmJpbmFyeVNlYXJjaChyYW5kb20ubGVmdC5nZXQoaSkpKTsKKyAgICAgICAgLy8gcmVhZCB0aGUganVuaworICAgICAgICBhc3NlcnRFcXVhbHMoZGlzLnJlYWRVVEYoKSwgIkpVTksiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRpcy5yZWFkVVRGKCksICJKVU5LIik7CisgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgIEZpbGVVdGlscy5jbG9zZVF1aWV0bHkoZGlzKTsKKyAgICAgICAgcmFuZG9tLnJpZ2h0LmNsb3NlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkRW1wdHlLZXkoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBJUGFydGl0aW9uZXIgcCA9IG5ldyBSYW5kb21QYXJ0aXRpb25lcigpOworICAgICAgICB0cnkgKEluZGV4U3VtbWFyeUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBJbmRleFN1bW1hcnlCdWlsZGVyKDEsIDEsIEJBU0VfU0FNUExJTkdfTEVWRUwpKQorICAgICAgICB7CisgICAgICAgICAgICBidWlsZGVyLm1heWJlQWRkRW50cnkocC5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5FTVBUWV9CWVRFX0JVRkZFUiksIDApOworICAgICAgICAgICAgSW5kZXhTdW1tYXJ5IHN1bW1hcnkgPSBidWlsZGVyLmJ1aWxkKHApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN1bW1hcnkuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBzdW1tYXJ5LmdldFBvc2l0aW9uKDApKTsKKyAgICAgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBieXRlWzBdLCBzdW1tYXJ5LmdldEtleSgwKSk7CisKKyAgICAgICAgICAgIERhdGFPdXRwdXRCdWZmZXIgZG9zID0gbmV3IERhdGFPdXRwdXRCdWZmZXIoKTsKKyAgICAgICAgICAgIEluZGV4U3VtbWFyeS5zZXJpYWxpemVyLnNlcmlhbGl6ZShzdW1tYXJ5LCBkb3MpOworICAgICAgICAgICAgRGF0YUlucHV0U3RyZWFtUGx1cyBkaXMgPSBuZXcgRGF0YUlucHV0QnVmZmVyKGRvcy50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIEluZGV4U3VtbWFyeSBsb2FkZWQgPSBJbmRleFN1bW1hcnkuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkaXMsIHAsIDEsIDEpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbG9hZGVkLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc3VtbWFyeS5nZXRQb3NpdGlvbigwKSwgbG9hZGVkLmdldFBvc2l0aW9uKDApKTsKKyAgICAgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKHN1bW1hcnkuZ2V0S2V5KDApLCBzdW1tYXJ5LmdldEtleSgwKSk7CisgICAgICAgICAgICBzdW1tYXJ5LmNsb3NlKCk7CisgICAgICAgICAgICBsb2FkZWQuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgUGFpcjxMaXN0PERlY29yYXRlZEtleT4sIEluZGV4U3VtbWFyeT4gZ2VuZXJhdGVSYW5kb21JbmRleChpbnQgc2l6ZSwgaW50IGludGVydmFsKQorICAgIHsKKyAgICAgICAgTGlzdDxEZWNvcmF0ZWRLZXk+IGxpc3QgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgdHJ5IChJbmRleFN1bW1hcnlCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSW5kZXhTdW1tYXJ5QnVpbGRlcihsaXN0LnNpemUoKSwgaW50ZXJ2YWwsIEJBU0VfU0FNUExJTkdfTEVWRUwpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVVUlEIHV1aWQgPSBVVUlELnJhbmRvbVVVSUQoKTsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXModXVpZCkpOworICAgICAgICAgICAgICAgIGxpc3QuYWRkKGtleSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgICAgICAgICAgYnVpbGRlci5tYXliZUFkZEVudHJ5KGxpc3QuZ2V0KGkpLCBpKTsKKyAgICAgICAgICAgIEluZGV4U3VtbWFyeSBzdW1tYXJ5ID0gYnVpbGRlci5idWlsZChwYXJ0aXRpb25lcik7CisgICAgICAgICAgICByZXR1cm4gUGFpci5jcmVhdGUobGlzdCwgc3VtbWFyeSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG93bnNhbXBsZVBhdHRlcm5zKCkKKyAgICB7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgwKSwgRG93bnNhbXBsaW5nLmdldFNhbXBsaW5nUGF0dGVybigwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KDApLCBEb3duc2FtcGxpbmcuZ2V0U2FtcGxpbmdQYXR0ZXJuKDEpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgxLCAwKSwgRG93bnNhbXBsaW5nLmdldFNhbXBsaW5nUGF0dGVybigyKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KDMsIDEsIDIsIDApLCBEb3duc2FtcGxpbmcuZ2V0U2FtcGxpbmdQYXR0ZXJuKDQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoNywgMywgNSwgMSwgNiwgMiwgNCwgMCksIERvd25zYW1wbGluZy5nZXRTYW1wbGluZ1BhdHRlcm4oOCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgxNSwgNywgMTEsIDMsIDEzLCA1LCA5LCAxLCAxNCwgNiwgMTAsIDIsIDEyLCA0LCA4LCAwKSwgRG93bnNhbXBsaW5nLmdldFNhbXBsaW5nUGF0dGVybigxNikpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2hvdWxkU2tpcChpbnQgaW5kZXgsIExpc3Q8SW50ZWdlcj4gc3RhcnRQb2ludHMpCisgICAgeworICAgICAgICBmb3IgKGludCBzdGFydCA6IHN0YXJ0UG9pbnRzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGluZGV4IC0gc3RhcnQpICUgQkFTRV9TQU1QTElOR19MRVZFTCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REb3duc2FtcGxlKCkKKyAgICB7CisgICAgICAgIGZpbmFsIGludCBOVU1fS0VZUyA9IDQwOTY7CisgICAgICAgIGZpbmFsIGludCBJTkRFWF9JTlRFUlZBTCA9IDEyODsKKyAgICAgICAgZmluYWwgaW50IE9SSUdJTkFMX05VTV9FTlRSSUVTID0gTlVNX0tFWVMgLyBJTkRFWF9JTlRFUlZBTDsKKworCisgICAgICAgIFBhaXI8TGlzdDxEZWNvcmF0ZWRLZXk+LCBJbmRleFN1bW1hcnk+IHJhbmRvbSA9IGdlbmVyYXRlUmFuZG9tSW5kZXgoTlVNX0tFWVMsIElOREVYX0lOVEVSVkFMKTsKKyAgICAgICAgTGlzdDxEZWNvcmF0ZWRLZXk+IGtleXMgPSByYW5kb20ubGVmdDsKKyAgICAgICAgSW5kZXhTdW1tYXJ5IG9yaWdpbmFsID0gcmFuZG9tLnJpZ2h0OworCisgICAgICAgIC8vIHNhbml0eSBjaGVjayBvbiB0aGUgb3JpZ2luYWwgaW5kZXggc3VtbWFyeQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE9SSUdJTkFMX05VTV9FTlRSSUVTOyBpKyspCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoa2V5cy5nZXQoaSAqIElOREVYX0lOVEVSVkFMKS5nZXRLZXkoKSwgQnl0ZUJ1ZmZlci53cmFwKG9yaWdpbmFsLmdldEtleShpKSkpOworCisgICAgICAgIExpc3Q8SW50ZWdlcj4gc2FtcGxlUGF0dGVybiA9IERvd25zYW1wbGluZy5nZXRTYW1wbGluZ1BhdHRlcm4oQkFTRV9TQU1QTElOR19MRVZFTCk7CisKKyAgICAgICAgLy8gZG93bnNhbXBsZSBieSBvbmUgbGV2ZWwsIHRoZW4gdHdvIGxldmVscywgdGhlbiB0aHJlZSBsZXZlbHMuLi4KKyAgICAgICAgaW50IGRvd25zYW1wbGluZ1JvdW5kID0gMTsKKyAgICAgICAgZm9yIChpbnQgc2FtcGxpbmdMZXZlbCA9IEJBU0VfU0FNUExJTkdfTEVWRUwgLSAxOyBzYW1wbGluZ0xldmVsID49IDE7IHNhbXBsaW5nTGV2ZWwtLSkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5IChJbmRleFN1bW1hcnkgZG93bnNhbXBsZWQgPSBkb3duc2FtcGxlKG9yaWdpbmFsLCBzYW1wbGluZ0xldmVsLCAxMjgsIHBhcnRpdGlvbmVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZW50cmllc0F0U2FtcGxpbmdMZXZlbChzYW1wbGluZ0xldmVsLCBvcmlnaW5hbC5nZXRNYXhOdW1iZXJPZkVudHJpZXMoKSksIGRvd25zYW1wbGVkLnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICBpbnQgc2FtcGxlZENvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBMaXN0PEludGVnZXI+IHNraXBTdGFydFBvaW50cyA9IHNhbXBsZVBhdHRlcm4uc3ViTGlzdCgwLCBkb3duc2FtcGxpbmdSb3VuZCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBPUklHSU5BTF9OVU1fRU5UUklFUzsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG91bGRTa2lwKGksIHNraXBTdGFydFBvaW50cykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhrZXlzLmdldChpICogSU5ERVhfSU5URVJWQUwpLmdldEtleSgpLCBCeXRlQnVmZmVyLndyYXAoZG93bnNhbXBsZWQuZ2V0S2V5KHNhbXBsZWRDb3VudCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZWRDb3VudCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGVzdFBvc2l0aW9uKG9yaWdpbmFsLCBkb3duc2FtcGxlZCwga2V5cyk7CisgICAgICAgICAgICAgICAgZG93bnNhbXBsaW5nUm91bmQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGRvd25zYW1wbGUgb25lIGxldmVsIGVhY2ggdGltZQorICAgICAgICBJbmRleFN1bW1hcnkgcHJldmlvdXMgPSBvcmlnaW5hbDsKKyAgICAgICAgZG93bnNhbXBsaW5nUm91bmQgPSAxOworICAgICAgICBmb3IgKGludCBkb3duc2FtcGxlTGV2ZWwgPSBCQVNFX1NBTVBMSU5HX0xFVkVMIC0gMTsgZG93bnNhbXBsZUxldmVsID49IDE7IGRvd25zYW1wbGVMZXZlbC0tKQorICAgICAgICB7CisgICAgICAgICAgICBJbmRleFN1bW1hcnkgZG93bnNhbXBsZWQgPSBkb3duc2FtcGxlKHByZXZpb3VzLCBkb3duc2FtcGxlTGV2ZWwsIDEyOCwgcGFydGl0aW9uZXIpOworICAgICAgICAgICAgaWYgKHByZXZpb3VzICE9IG9yaWdpbmFsKQorICAgICAgICAgICAgICAgIHByZXZpb3VzLmNsb3NlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZW50cmllc0F0U2FtcGxpbmdMZXZlbChkb3duc2FtcGxlTGV2ZWwsIG9yaWdpbmFsLmdldE1heE51bWJlck9mRW50cmllcygpKSwgZG93bnNhbXBsZWQuc2l6ZSgpKTsKKworICAgICAgICAgICAgaW50IHNhbXBsZWRDb3VudCA9IDA7CisgICAgICAgICAgICBMaXN0PEludGVnZXI+IHNraXBTdGFydFBvaW50cyA9IHNhbXBsZVBhdHRlcm4uc3ViTGlzdCgwLCBkb3duc2FtcGxpbmdSb3VuZCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE9SSUdJTkFMX05VTV9FTlRSSUVTOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFzaG91bGRTa2lwKGksIHNraXBTdGFydFBvaW50cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoa2V5cy5nZXQoaSAqIElOREVYX0lOVEVSVkFMKS5nZXRLZXkoKSwgQnl0ZUJ1ZmZlci53cmFwKGRvd25zYW1wbGVkLmdldEtleShzYW1wbGVkQ291bnQpKSk7CisgICAgICAgICAgICAgICAgICAgIHNhbXBsZWRDb3VudCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGVzdFBvc2l0aW9uKG9yaWdpbmFsLCBkb3duc2FtcGxlZCwga2V5cyk7CisgICAgICAgICAgICBwcmV2aW91cyA9IGRvd25zYW1wbGVkOworICAgICAgICAgICAgZG93bnNhbXBsaW5nUm91bmQrKzsKKyAgICAgICAgfQorICAgICAgICBwcmV2aW91cy5jbG9zZSgpOworICAgICAgICBvcmlnaW5hbC5jbG9zZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0UG9zaXRpb24oSW5kZXhTdW1tYXJ5IG9yaWdpbmFsLCBJbmRleFN1bW1hcnkgZG93bnNhbXBsZWQsIExpc3Q8RGVjb3JhdGVkS2V5PiBrZXlzKQorICAgIHsKKyAgICAgICAgZm9yIChEZWNvcmF0ZWRLZXkga2V5IDoga2V5cykKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBvcmlnID0gb3JpZ2luYWwuZ2V0U2NhblBvc2l0aW9uKGtleSk7CisgICAgICAgICAgICBpbnQgYmluYXJ5U2VhcmNoID0gZG93bnNhbXBsZWQuYmluYXJ5U2VhcmNoKGtleSk7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBJbmRleFN1bW1hcnkuZ2V0SW5kZXhGcm9tQmluYXJ5U2VhcmNoUmVzdWx0KGJpbmFyeVNlYXJjaCk7CisgICAgICAgICAgICBpbnQgc2NhbkZyb20gPSAoaW50KSBkb3duc2FtcGxlZC5nZXRTY2FuUG9zaXRpb25Gcm9tQmluYXJ5U2VhcmNoUmVzdWx0KGluZGV4KTsKKyAgICAgICAgICAgIGFzc2VydCBzY2FuRnJvbSA8PSBvcmlnOworICAgICAgICAgICAgaW50IGVmZmVjdGl2ZUludGVydmFsID0gZG93bnNhbXBsZWQuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbEFmdGVySW5kZXgoaW5kZXgpOworICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGsgPSBudWxsOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBrICE9IGtleSAmJiBpIDwgZWZmZWN0aXZlSW50ZXJ2YWwgJiYgc2NhbkZyb20gPCBrZXlzLnNpemUoKSA7IGkrKywgc2NhbkZyb20gKyspCisgICAgICAgICAgICAgICAgayA9IGtleXMuZ2V0KHNjYW5Gcm9tKTsKKyAgICAgICAgICAgIGFzc2VydCBrID09IGtleTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9yaWdpbmFsSW5kZXhMb29rdXAoKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IEJBU0VfU0FNUExJTkdfTEVWRUw7IGkgPj0gMTsgaS0tKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIERvd25zYW1wbGluZy5nZXRPcmlnaW5hbEluZGV4ZXMoaSkuc2l6ZSgpKTsKKworICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gZnVsbCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEJBU0VfU0FNUExJTkdfTEVWRUw7IGkrKykKKyAgICAgICAgICAgIGZ1bGwuYWRkKGkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhmdWxsLCBEb3duc2FtcGxpbmcuZ2V0T3JpZ2luYWxJbmRleGVzKEJBU0VfU0FNUExJTkdfTEVWRUwpKTsKKyAgICAgICAgLy8gdGhlIGVudHJ5IGF0IGluZGV4IDEyNyBpcyB0aGUgZmlyc3QgdG8gZ28KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZ1bGwuc3ViTGlzdCgwLCBmdWxsLnNpemUoKSAtIDEpLCBEb3duc2FtcGxpbmcuZ2V0T3JpZ2luYWxJbmRleGVzKEJBU0VfU0FNUExJTkdfTEVWRUwgLSAxKSk7CisKKyAgICAgICAgLy8gc3BvdCBjaGVjayBhIGZldyB2YWx1ZXMgKHRoZXNlIGRlcGVuZCBvbiBCQVNFX1NBTVBMSU5HX0xFVkVMIGJlaW5nIDEyOCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEyOCwgQkFTRV9TQU1QTElOR19MRVZFTCk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KDAsIDMyLCA2NCwgOTYpLCBEb3duc2FtcGxpbmcuZ2V0T3JpZ2luYWxJbmRleGVzKDQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoMCwgNjQpLCBEb3duc2FtcGxpbmcuZ2V0T3JpZ2luYWxJbmRleGVzKDIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoMCksIERvd25zYW1wbGluZy5nZXRPcmlnaW5hbEluZGV4ZXMoMSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldE51bWJlck9mU2tpcHBlZEVudHJpZXNBZnRlckluZGV4KCkKKyAgICB7CisgICAgICAgIGludCBpbmRleEludGVydmFsID0gMTI4OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEJBU0VfU0FNUExJTkdfTEVWRUw7IGkrKykKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpbmRleEludGVydmFsLCBEb3duc2FtcGxpbmcuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbEFmdGVySW5kZXgoaSwgQkFTRV9TQU1QTElOR19MRVZFTCwgaW5kZXhJbnRlcnZhbCkpOworCisgICAgICAgIC8vIHdpdGggb25lIHJvdW5kIG9mIGRvd25zYW1wbGluZywgb25seSB0aGUgbGFzdCBzdW1tYXJ5IGVudHJ5IGhhcyBiZWVuIHJlbW92ZWQsIHNvIG9ubHkgdGhlIGxhc3QgaW5kZXggd2lsbCBoYXZlCisgICAgICAgIC8vIGRvdWJsZSB0aGUgZ2FwIHVudGlsIHRoZSBuZXh0IHNhbXBsZQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEJBU0VfU0FNUExJTkdfTEVWRUwgLSAyOyBpKyspCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaW5kZXhJbnRlcnZhbCwgRG93bnNhbXBsaW5nLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWxBZnRlckluZGV4KGksIEJBU0VfU0FNUExJTkdfTEVWRUwgLSAxLCBpbmRleEludGVydmFsKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbmRleEludGVydmFsICogMiwgRG93bnNhbXBsaW5nLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWxBZnRlckluZGV4KEJBU0VfU0FNUExJTkdfTEVWRUwgLSAyLCBCQVNFX1NBTVBMSU5HX0xFVkVMIC0gMSwgaW5kZXhJbnRlcnZhbCkpOworCisgICAgICAgIC8vIGF0IHNhbXBsaW5nTGV2ZWw9MiwgdGhlIHJldGFpbmVkIHN1bW1hcnkgcG9pbnRzIGFyZSBbMCwgNjRdIChhc3N1bWVzIEJBU0VfU0FNUExJTkdfTEVWRUwgaXMgMTI4KQorICAgICAgICBhc3NlcnRFcXVhbHMoMTI4LCBCQVNFX1NBTVBMSU5HX0xFVkVMKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDY0ICogaW5kZXhJbnRlcnZhbCwgRG93bnNhbXBsaW5nLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWxBZnRlckluZGV4KDAsIDIsIGluZGV4SW50ZXJ2YWwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDY0ICogaW5kZXhJbnRlcnZhbCwgRG93bnNhbXBsaW5nLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWxBZnRlckluZGV4KDEsIDIsIGluZGV4SW50ZXJ2YWwpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9rZXljYWNoZS9LZXlDYWNoZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2tleWNhY2hlL0tleUNhY2hlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZjcwYzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9rZXljYWNoZS9LZXlDYWNoZVRlc3QuamF2YQpAQCAtMCwwICsxLDQ5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5rZXljYWNoZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuQXV0b1NhdmluZ0NhY2hlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLklDYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5LZXlDYWNoZUtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLk11dGF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd1VwZGF0ZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0Um93SW5kZXhFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuUm93SW5kZXhFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2FjaGVTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWZzOworaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CitpbXBvcnQgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CitpbXBvcnQgb3JnLm1vY2tpdG8uaW50ZXJuYWwuc3R1YmJpbmcuYW5zd2Vycy5BbnN3ZXJzV2l0aERlbGF5OworaW1wb3J0IG9yZy5tb2NraXRvLmludm9jYXRpb24uSW52b2NhdGlvbk9uTW9jazsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uZG9BbnN3ZXI7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKKworcHVibGljIGNsYXNzIEtleUNhY2hlVGVzdAoreworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3N0YWJsZUltcGxDYWNoZXNLZXlzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFMSA9ICJLZXlDYWNoZVRlc3QxIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0UyID0gIktleUNhY2hlVGVzdDIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fRkFNSUxZMSA9ICJTdGFuZGFyZDEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fRkFNSUxZMiA9ICJTdGFuZGFyZDIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fRkFNSUxZMyA9ICJTdGFuZGFyZDMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fRkFNSUxZNCA9ICJTdGFuZGFyZDQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fRkFNSUxZNSA9ICJTdGFuZGFyZDUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fRkFNSUxZNiA9ICJTdGFuZGFyZDYiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fRkFNSUxZNyA9ICJTdGFuZGFyZDciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fRkFNSUxZOCA9ICJTdGFuZGFyZDgiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fRkFNSUxZOSA9ICJTdGFuZGFyZDkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fRkFNSUxZMTAgPSAiU3RhbmRhcmQxMCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0ZBTUlMWV9LMl8xID0gIlN0YW5kYXJkMSI7CisKKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVTY2hlbWEoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CisgICAgICAgIHNzdGFibGVJbXBsQ2FjaGVzS2V5cyA9IEtleUNhY2hlU3VwcG9ydC5pc1N1cHBvcnRlZEJ5KERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSk7CisgICAgICAgIFNjaGVtYUxvYWRlci5wcmVwYXJlU2VydmVyKCk7CisgICAgICAgIFNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZShLRVlTUEFDRTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ09MVU1OX0ZBTUlMWTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENPTFVNTl9GQU1JTFkyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBDT0xVTU5fRkFNSUxZMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ09MVU1OX0ZBTUlMWTQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENPTFVNTl9GQU1JTFk1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBDT0xVTU5fRkFNSUxZNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ09MVU1OX0ZBTUlMWTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENPTFVNTl9GQU1JTFk4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBDT0xVTU5fRkFNSUxZOSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ09MVU1OX0ZBTUlMWTEwKSk7CisKKyAgICAgICAgU2NoZW1hTG9hZGVyLmNyZWF0ZUtleXNwYWNlKEtFWVNQQUNFMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UyLCBDT0xVTU5fRkFNSUxZX0syXzEpKTsKKworICAgIH0KKworICAgIEBBZnRlckNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFudXAoKQorICAgIHsKKyAgICAgICAgU2NoZW1hTG9hZGVyLmNsZWFudXBTYXZlZENhY2hlcygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEtleUNhY2hlTG9hZFNoYWxsb3dJbmRleEVudHJ5KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4Q2FjaGVTaXplKDApOworICAgICAgICB0ZXN0S2V5Q2FjaGVMb2FkKENPTFVNTl9GQU1JTFkyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlDYWNoZUxvYWRJbmRleEluZm9PbkhlYXAoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhDYWNoZVNpemUoOCk7CisgICAgICAgIHRlc3RLZXlDYWNoZUxvYWQoQ09MVU1OX0ZBTUlMWTUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0S2V5Q2FjaGVMb2FkKFN0cmluZyBjZikgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgc3RvcmUgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2YpOworCisgICAgICAgIC8vIGVtcHR5IHRoZSBjYWNoZQorICAgICAgICBDYWNoZVNlcnZpY2UuaW5zdGFuY2UuaW52YWxpZGF0ZUtleUNhY2hlKCk7CisgICAgICAgIGFzc2VydEtleUNhY2hlU2l6ZSgwLCBLRVlTUEFDRTEsIGNmKTsKKworICAgICAgICAvLyBpbnNlcnQgZGF0YSBhbmQgZm9yY2UgdG8gZGlzaworICAgICAgICBTY2hlbWFMb2FkZXIuaW5zZXJ0RGF0YShLRVlTUEFDRTEsIGNmLCAwLCAxMDApOworICAgICAgICBVdGlsLmZsdXNoKHN0b3JlKTsKKworICAgICAgICAvLyBwb3B1bGF0ZSB0aGUgY2FjaGUKKyAgICAgICAgcmVhZERhdGEoS0VZU1BBQ0UxLCBjZiwgMCwgMTAwKTsKKyAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKDEwMCwgS0VZU1BBQ0UxLCBjZik7CisKKyAgICAgICAgLy8gcmVhbGx5PyBvdXIgY2FjaGVzIGRvbid0IGltcGxlbWVudCB0aGUgbWFwIGludGVyZmFjZT8gKGhlbmNlIG5vIC5hZGRBbGwpCisgICAgICAgIE1hcDxLZXlDYWNoZUtleSwgQWJzdHJhY3RSb3dJbmRleEVudHJ5PiBzYXZlZE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgTWFwPEtleUNhY2hlS2V5LCBSb3dJbmRleEVudHJ5LkluZGV4SW5mb1JldHJpZXZlcj4gc2F2ZWRJbmZvTWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBmb3IgKEl0ZXJhdG9yPEtleUNhY2hlS2V5PiBpdGVyID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmtleUl0ZXJhdG9yKCk7CisgICAgICAgICAgICAgaXRlci5oYXNOZXh0KCk7KQorICAgICAgICB7CisgICAgICAgICAgICBLZXlDYWNoZUtleSBrID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoay5kZXNjLmtzbmFtZS5lcXVhbHMoS0VZU1BBQ0UxKSAmJiBrLmRlc2MuY2ZuYW1lLmVxdWFscyhjZikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWJzdHJhY3RSb3dJbmRleEVudHJ5IHJpZSA9IENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5nZXQoayk7CisgICAgICAgICAgICAgICAgc2F2ZWRNYXAucHV0KGssIHJpZSk7CisgICAgICAgICAgICAgICAgaWYgKHJpZSBpbnN0YW5jZW9mIFJvd0luZGV4RW50cnkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCaWdUYWJsZVJlYWRlciBzc3RyID0gKEJpZ1RhYmxlUmVhZGVyKSByZWFkZXJGb3JLZXkoayk7CisgICAgICAgICAgICAgICAgICAgIHNhdmVkSW5mb01hcC5wdXQoaywgKChSb3dJbmRleEVudHJ5KSByaWUpLm9wZW5XaXRoSW5kZXgoc3N0ci5nZXRJbmRleEZpbGUoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGZvcmNlIHRoZSBjYWNoZSB0byBkaXNrCisgICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5zdWJtaXRXcml0ZShJbnRlZ2VyLk1BWF9WQUxVRSkuZ2V0KCk7CisKKyAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmludmFsaWRhdGVLZXlDYWNoZSgpOworICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoMCwgS0VZU1BBQ0UxLCBjZik7CisKKyAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmxvYWRTYXZlZCgpOworICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoc2F2ZWRNYXAuc2l6ZSgpLCBLRVlTUEFDRTEsIGNmKTsKKworICAgICAgICAvLyBwcm9iYWJseSBpdCdzIGJldHRlciB0byBhZGQgZXF1YWxzL2hhc2hDb2RlIHRvIFJvd0luZGV4RW50cnkuLi4KKyAgICAgICAgZm9yIChNYXAuRW50cnk8S2V5Q2FjaGVLZXksIEFic3RyYWN0Um93SW5kZXhFbnRyeT4gZW50cnkgOiBzYXZlZE1hcC5lbnRyeVNldCgpKQorICAgICAgICB7CisgICAgICAgICAgICBBYnN0cmFjdFJvd0luZGV4RW50cnkgZXhwZWN0ZWQgPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgQWJzdHJhY3RSb3dJbmRleEVudHJ5IGFjdHVhbCA9IENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5nZXQoZW50cnkuZ2V0S2V5KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLnBvc2l0aW9uLCBhY3R1YWwucG9zaXRpb24pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmJsb2NrQ291bnQoKSwgYWN0dWFsLmJsb2NrQ291bnQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0U1NUYWJsZUZvcm1hdCgpLCBhY3R1YWwuZ2V0U1NUYWJsZUZvcm1hdCgpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQuYmxvY2tDb3VudCgpOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciBhY3R1YWxTc3RyID0gcmVhZGVyRm9yS2V5KGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoYWN0dWFsU3N0ci5kZXNjcmlwdG9yLnZlcnNpb24uZm9ybWF0KS5pc0VxdWFsVG8oZXhwZWN0ZWQuZ2V0U1NUYWJsZUZvcm1hdCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoYWN0dWFsIGluc3RhbmNlb2YgUm93SW5kZXhFbnRyeSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeSAoUm93SW5kZXhFbnRyeS5JbmRleEluZm9SZXRyaWV2ZXIgYWN0dWFsSWlyID0gKChSb3dJbmRleEVudHJ5KSBhY3R1YWwpLm9wZW5XaXRoSW5kZXgoKChCaWdUYWJsZVJlYWRlcikgYWN0dWFsU3N0cikuZ2V0SW5kZXhGaWxlKCkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBSb3dJbmRleEVudHJ5LkluZGV4SW5mb1JldHJpZXZlciBleHBlY3RlZElpciA9IHNhdmVkSW5mb01hcC5nZXQoZW50cnkuZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkSWlyLmNvbHVtbnNJbmRleChpKSwgYWN0dWFsSWlyLmNvbHVtbnNJbmRleChpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXhwZWN0ZWQuaXNJbmRleGVkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmRlbGV0aW9uVGltZSgpLCBhY3R1YWwuZGVsZXRpb25UaW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2F2ZWRJbmZvTWFwLnZhbHVlcygpLmZvckVhY2goaWlyIC0+IHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpaXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgaWlyLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU1NUYWJsZVJlYWRlciByZWFkZXJGb3JLZXkoS2V5Q2FjaGVLZXkgaykKKyAgICB7CisgICAgICAgIHJldHVybiBDb2x1bW5GYW1pbHlTdG9yZS5nZXRJZkV4aXN0cyhrLmRlc2Mua3NuYW1lLCBrLmRlc2MuY2ZuYW1lKS5nZXRMaXZlU1NUYWJsZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihzc3RyZWFkZXIgLT4gc3N0cmVhZGVyLmRlc2NyaXB0b3IuaWQgPT0gay5kZXNjLmlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZEZpcnN0KCkuZ2V0KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5Q2FjaGVMb2FkV2l0aExvc3RUYWJsZVNoYWxsb3dJbmRleEVudHJ5KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4Q2FjaGVTaXplKDApOworICAgICAgICB0ZXN0S2V5Q2FjaGVMb2FkV2l0aExvc3RUYWJsZShDT0xVTU5fRkFNSUxZMyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5Q2FjaGVMb2FkV2l0aExvc3RUYWJsZUluZGV4SW5mb09uSGVhcCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleENhY2hlU2l6ZSg4KTsKKyAgICAgICAgdGVzdEtleUNhY2hlTG9hZFdpdGhMb3N0VGFibGUoQ09MVU1OX0ZBTUlMWTYpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0S2V5Q2FjaGVMb2FkV2l0aExvc3RUYWJsZShTdHJpbmcgY2YpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworCisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRTEpLmdldENvbHVtbkZhbWlseVN0b3JlKGNmKTsKKworICAgICAgICAvLyBlbXB0eSB0aGUgY2FjaGUKKyAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmludmFsaWRhdGVLZXlDYWNoZSgpOworICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoMCwgS0VZU1BBQ0UxLCBjZik7CisKKyAgICAgICAgLy8gaW5zZXJ0IGRhdGEgYW5kIGZvcmNlIHRvIGRpc2sKKyAgICAgICAgU2NoZW1hTG9hZGVyLmluc2VydERhdGEoS0VZU1BBQ0UxLCBjZiwgMCwgMTAwKTsKKyAgICAgICAgVXRpbC5mbHVzaChzdG9yZSk7CisKKyAgICAgICAgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBmaXJzdEZsdXNoVGFibGVzID0gSW1tdXRhYmxlTGlzdC5jb3B5T2Yoc3RvcmUuZ2V0TGl2ZVNTVGFibGVzKCkpOworCisgICAgICAgIC8vIHBvcHVsYXRlIHRoZSBjYWNoZQorICAgICAgICByZWFkRGF0YShLRVlTUEFDRTEsIGNmLCAwLCAxMDApOworICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoMTAwLCBLRVlTUEFDRTEsIGNmKTsKKworICAgICAgICAvLyBpbnNlcnQgc29tZSBuZXcgZGF0YSBhbmQgZm9yY2UgdG8gZGlzaworICAgICAgICBTY2hlbWFMb2FkZXIuaW5zZXJ0RGF0YShLRVlTUEFDRTEsIGNmLCAxMDAsIDUwKTsKKyAgICAgICAgVXRpbC5mbHVzaChzdG9yZSk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCBpdCdzIGZpbmUKKyAgICAgICAgcmVhZERhdGEoS0VZU1BBQ0UxLCBjZiwgMTAwLCA1MCk7CisgICAgICAgIGFzc2VydEtleUNhY2hlU2l6ZSgxNTAsIEtFWVNQQUNFMSwgY2YpOworCisgICAgICAgIC8vIGZvcmNlIHRoZSBjYWNoZSB0byBkaXNrCisgICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5zdWJtaXRXcml0ZShJbnRlZ2VyLk1BWF9WQUxVRSkuZ2V0KCk7CisKKyAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmludmFsaWRhdGVLZXlDYWNoZSgpOworICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoMCwgS0VZU1BBQ0UxLCBjZik7CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgY29udGVudCBpcyB3cml0dGVuIGNvcnJlY3RseQorICAgICAgICBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGUubG9hZFNhdmVkKCk7CisgICAgICAgIGFzc2VydEtleUNhY2hlU2l6ZSgxNTAsIEtFWVNQQUNFMSwgY2YpOworCisgICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5pbnZhbGlkYXRlS2V5Q2FjaGUoKTsKKyAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKDAsIEtFWVNQQUNFMSwgY2YpOworCisgICAgICAgIC8vIG5vdyByZW1vdmUgdGhlIGZpcnN0IHNzdGFibGUgZnJvbSB0aGUgc3RvcmUgdG8gc2ltdWxhdGUgbG9zaW5nIHRoZSBmaWxlCisgICAgICAgIHN0b3JlLm1hcmtPYnNvbGV0ZShmaXJzdEZsdXNoVGFibGVzLCBPcGVyYXRpb25UeXBlLlVOS05PV04pOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgcmVhZGluZyBub3cgY29ycmVjdGx5IHNraXBzIG92ZXIgbG9zdCB0YWJsZSBhbmQgcmVhZHMgdGhlIHJlc3QgKENBU1NBTkRSQS0xMDIxOSkKKyAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmxvYWRTYXZlZCgpOworICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoNTAsIEtFWVNQQUNFMSwgY2YpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEtleUNhY2hlU2hhbGxvd0luZGV4RW50cnkoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4Q2FjaGVTaXplKDApOworICAgICAgICB0ZXN0S2V5Q2FjaGUoQ09MVU1OX0ZBTUlMWTEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEtleUNhY2hlSW5kZXhJbmZvT25IZWFwKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleENhY2hlU2l6ZSg4KTsKKyAgICAgICAgdGVzdEtleUNhY2hlKENPTFVNTl9GQU1JTFk0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEtleUNhY2hlKFN0cmluZyBjZikgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworCisgICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRTEpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZik7CisKKyAgICAgICAgLy8ganVzdCB0byBtYWtlIHN1cmUgdGhhdCBldmVyeXRoaW5nIGlzIGNsZWFuCisgICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5pbnZhbGlkYXRlS2V5Q2FjaGUoKTsKKworICAgICAgICAvLyBLZXlDYWNoZSBzaG91bGQgc3RhcnQgYXQgc2l6ZSAwIGlmIHdlJ3JlIGNhY2hpbmcgWCUgb2YgemVybyBkYXRhLgorICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoMCwgS0VZU1BBQ0UxLCBjZik7CisKKyAgICAgICAgTXV0YXRpb24gcm07CisKKyAgICAgICAgLy8gaW5zZXJ0cworICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgMCwgImtleTEiKS5jbHVzdGVyaW5nKCIxIikuYnVpbGQoKS5hcHBseVVuc2FmZSgpOworICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgMCwgImtleTIiKS5jbHVzdGVyaW5nKCIyIikuYnVpbGQoKS5hcHBseVVuc2FmZSgpOworCisgICAgICAgIC8vIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIFNTVGFibGUKKyAgICAgICAgVXRpbC5mbHVzaChjZnMpOworCisgICAgICAgIC8vIHJlYWRzIHRvIGNhY2hlIGtleSBwb3NpdGlvbgorICAgICAgICBVdGlsLmdldEFsbChVdGlsLmNtZChjZnMsICJrZXkxIikuYnVpbGQoKSk7CisgICAgICAgIFV0aWwuZ2V0QWxsKFV0aWwuY21kKGNmcywgImtleTIiKS5idWlsZCgpKTsKKworICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoMiwgS0VZU1BBQ0UxLCBjZik7CisKKyAgICAgICAgU2V0PFNTVGFibGVSZWFkZXI+IHJlYWRlcnMgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCk7CisgICAgICAgIFJlZnM8U1NUYWJsZVJlYWRlcj4gcmVmcyA9IFJlZnMudHJ5UmVmKHJlYWRlcnMpOworICAgICAgICBpZiAocmVmcyA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworCisgICAgICAgIFV0aWwuY29tcGFjdEFsbChjZnMsIEludGVnZXIuTUFYX1ZBTFVFKS5nZXQoKTsKKyAgICAgICAgYm9vbGVhbiBub0Vhcmx5T3BlbiA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU1RhYmxlUHJlZW1wdGl2ZU9wZW5JbnRlcnZhbEluTWlCKCkgPCAwOworCisgICAgICAgIC8vIGFmdGVyIGNvbXBhY3Rpb24gY2FjaGUgc2hvdWxkIGhhdmUgZW50cmllcyBmb3IgbmV3IFNTVGFibGVzLAorICAgICAgICAvLyBidXQgc2luY2Ugd2UgaGF2ZSBrZXB0IGEgcmVmZXJlbmNlIHRvIHRoZSBvbGQgc3N0YWJsZXMsCisgICAgICAgIC8vIGlmIHdlIGhhZCAyIGtleXMgaW4gY2FjaGUgcHJldmlvdXNseSBpdCBzaG91bGQgYmVjb21lIDQKKyAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKG5vRWFybHlPcGVuID8gMiA6IDQsIEtFWVNQQUNFMSwgY2YpOworCisgICAgICAgIHJlZnMucmVsZWFzZSgpOworCisgICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uLndhaXRGb3JEZWxldGlvbnMoKTsKKworICAgICAgICAvLyBhZnRlciByZWxlYXNpbmcgdGhlIHJlZmVyZW5jZSB0aGlzIHNob3VsZCBkcm9wIHRvIDIKKyAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKDIsIEtFWVNQQUNFMSwgY2YpOworCisgICAgICAgIC8vIHJlLXJlYWQgc2FtZSBrZXlzIHRvIHZlcmlmeSB0aGF0IGtleSBjYWNoZSBkaWRuJ3QgZ3JvdyBmdXJ0aGVyCisgICAgICAgIFV0aWwuZ2V0QWxsKFV0aWwuY21kKGNmcywgImtleTEiKS5idWlsZCgpKTsKKyAgICAgICAgVXRpbC5nZXRBbGwoVXRpbC5jbWQoY2ZzLCAia2V5MiIpLmJ1aWxkKCkpOworCisgICAgICAgIGFzc2VydEtleUNhY2hlU2l6ZShub0Vhcmx5T3BlbiA/IDQgOiAyLCBLRVlTUEFDRTEsIGNmKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlDYWNoZUxvYWRaZXJvQ2FjaGVMb2FkVGltZSgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDYWNoZUxvYWRUaW1lb3V0KDApOworICAgICAgICBTdHJpbmcgY2YgPSBDT0xVTU5fRkFNSUxZNzsKKworICAgICAgICBjcmVhdGVBbmRJbnZhbGlkYXRlQ2FjaGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChQYWlyLmNyZWF0ZShLRVlTUEFDRTEsIGNmKSksIDEwMCk7CisKKyAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmxvYWRTYXZlZCgpOworCisgICAgICAgIC8vIEhlcmUgbWF4IHRpbWUgdG8gbG9hZCBjYWNoZSBpcyB6ZXJvIHdoaWNoIG1lYW5zIG5vIHRpbWUgbGVmdCB0byBsb2FkIGNhY2hlLiBTbyB0aGUga2V5Q2FjaGUgc2l6ZSBzaG91bGQKKyAgICAgICAgLy8gYmUgemVybyBhZnRlciBsb2FkU2F2ZWQoKS4KKyAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKDAsIEtFWVNQQUNFMSwgY2YpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEtleUNhY2hlTG9hZFR3b1RhYmxlc1RpbWUoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q2FjaGVMb2FkVGltZW91dCg2MCk7CisgICAgICAgIFN0cmluZyBjb2x1bW5GYW1pbHkxID0gQ09MVU1OX0ZBTUlMWTg7CisgICAgICAgIFN0cmluZyBjb2x1bW5GYW1pbHkyID0gQ09MVU1OX0ZBTUlMWV9LMl8xOworICAgICAgICBpbnQgbnVtYmVyT2ZSb3dzID0gMTAwOworICAgICAgICBMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiB0YWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oMik7CisgICAgICAgIHRhYmxlcy5hZGQoUGFpci5jcmVhdGUoS0VZU1BBQ0UxLCBjb2x1bW5GYW1pbHkxKSk7CisgICAgICAgIHRhYmxlcy5hZGQoUGFpci5jcmVhdGUoS0VZU1BBQ0UyLCBjb2x1bW5GYW1pbHkyKSk7CisKKyAgICAgICAgY3JlYXRlQW5kSW52YWxpZGF0ZUNhY2hlKHRhYmxlcywgbnVtYmVyT2ZSb3dzKTsKKworICAgICAgICBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGUubG9hZFNhdmVkKCk7CisKKyAgICAgICAgLy8gSGVyZSBtYXggdGltZSB0byBsb2FkIGNhY2hlIGlzIG5lZ2F0aXZlIHdoaWNoIG1lYW5zIG5vIHRpbWUgbGVmdCB0byBsb2FkIGNhY2hlLiBTbyB0aGUga2V5Q2FjaGUgc2l6ZSBzaG91bGQKKyAgICAgICAgLy8gYmUgemVybyBhZnRlciBsb2FkLgorICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUobnVtYmVyT2ZSb3dzLCBLRVlTUEFDRTEsIGNvbHVtbkZhbWlseTEpOworICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUobnVtYmVyT2ZSb3dzLCBLRVlTUEFDRTIsIGNvbHVtbkZhbWlseTIpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJyYXd0eXBlcyIgfSkKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlDYWNoZUxvYWRDYWNoZUxvYWRUaW1lRXhjZWVkaW5nTGltaXQoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q2FjaGVMb2FkVGltZW91dCgyKTsKKyAgICAgICAgaW50IGRlbGF5TWlsbGlzID0gMTAwMDsKKyAgICAgICAgaW50IG51bWJlck9mUm93cyA9IDEwMDsKKworICAgICAgICBTdHJpbmcgY2YgPSBDT0xVTU5fRkFNSUxZOTsKKworICAgICAgICBjcmVhdGVBbmRJbnZhbGlkYXRlQ2FjaGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChQYWlyLmNyZWF0ZShLRVlTUEFDRTEsIGNmKSksIG51bWJlck9mUm93cyk7CisKKyAgICAgICAgLy8gVGVzdGluZyBjYWNoZSBsb2FkLiBIZXJlIHVzaW5nIGN1c3RvbSBidWlsdCBBdXRvU2F2aW5nQ2FjaGUgaW5zdGFuY2UgYXMgc2ltdWxhdGluZyBkZWxheSBpcyBub3QgcG9zc2libGUgd2l0aAorICAgICAgICAvLyAnQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlJy4gJ0F1dG9TYXZpbmdDYWNoZS5sb2FkU2F2ZWQoKScgaXMgcmV0dXJuaW5nIG5vLm9mIGVudHJpZXMgbG9hZGVkIHNvIHdlIGRvbid0IG5lZWQKKyAgICAgICAgLy8gdG8gaW5zdGFudGlhdGUgSUNhY2hlLmNsYXNzLgorICAgICAgICBDYWNoZVNlcnZpY2UuS2V5Q2FjaGVTZXJpYWxpemVyIGtleUNhY2hlU2VyaWFsaXplciA9IG5ldyBDYWNoZVNlcnZpY2UuS2V5Q2FjaGVTZXJpYWxpemVyKCk7CisgICAgICAgIENhY2hlU2VydmljZS5LZXlDYWNoZVNlcmlhbGl6ZXIga2V5Q2FjaGVTZXJpYWxpemVyU3B5ID0gTW9ja2l0by5zcHkoa2V5Q2FjaGVTZXJpYWxpemVyKTsKKyAgICAgICAgQXV0b1NhdmluZ0NhY2hlIGF1dG9TYXZpbmdDYWNoZSA9IG5ldyBBdXRvU2F2aW5nQ2FjaGUobW9jayhJQ2FjaGUuY2xhc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVNlcnZpY2UuQ2FjaGVUeXBlLktFWV9DQUNIRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5Q2FjaGVTZXJpYWxpemVyU3B5KTsKKworICAgICAgICBkb0Fuc3dlcihuZXcgQW5zd2Vyc1dpdGhEZWxheShkZWxheU1pbGxpcywgSW52b2NhdGlvbk9uTW9jazo6Y2FsbFJlYWxNZXRob2QpKS53aGVuKGtleUNhY2hlU2VyaWFsaXplclNweSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGVzZXJpYWxpemUoYW55KERhdGFJbnB1dFBsdXMuY2xhc3MpKTsKKworICAgICAgICBsb25nIG1heEV4cGVjdGVkS2V5Q2FjaGUgPSBNYXRoLm1pbihudW1iZXJPZlJvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKyBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKERhdGFiYXNlRGVzY3JpcHRvci5nZXRDYWNoZUxvYWRUaW1lb3V0KCkpIC8gZGVsYXlNaWxsaXMpOworCisgICAgICAgIGxvbmcga2V5c0xvYWRlZCA9IGF1dG9TYXZpbmdDYWNoZS5sb2FkU2F2ZWQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChrZXlzTG9hZGVkLCBNYXRjaGVycy5sZXNzVGhhbk9yRXF1YWxUbyhtYXhFeHBlY3RlZEtleUNhY2hlKSk7CisgICAgICAgIGlmIChzc3RhYmxlSW1wbENhY2hlc0tleXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydE5vdEVxdWFscygwLCBrZXlzTG9hZGVkKTsKKyAgICAgICAgICAgIE1vY2tpdG8udmVyaWZ5KGtleUNhY2hlU2VyaWFsaXplclNweSwgTW9ja2l0by50aW1lcygxKSkuY2xlYW51cEFmdGVyRGVzZXJpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBrZXlzTG9hZGVkKTsKKyAgICAgICAgICAgIE1vY2tpdG8udmVyaWZ5KGtleUNhY2hlU2VyaWFsaXplclNweSwgTW9ja2l0by5uZXZlcigpKS5jbGVhbnVwQWZ0ZXJEZXNlcmlhbGl6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUFuZEludmFsaWRhdGVDYWNoZShMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiB0YWJsZXMsIGludCBudW1iZXJPZlJvd3MpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKworICAgICAgICAvLyBlbXB0eSB0aGUgY2FjaGUKKyAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmludmFsaWRhdGVLZXlDYWNoZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLnNpemUoKSk7CisKKyAgICAgICAgZm9yKFBhaXI8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogdGFibGVzKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcga2V5c3BhY2UgPSBlbnRyeS5sZWZ0KCk7CisgICAgICAgICAgICBTdHJpbmcgY2YgPSBlbnRyeS5yaWdodCgpOworICAgICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgc3RvcmUgPSBLZXlzcGFjZS5vcGVuKGtleXNwYWNlKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZik7CisKKyAgICAgICAgICAgIC8vIGluc2VydCBkYXRhIGFuZCBmb3JjZSB0byBkaXNrCisgICAgICAgICAgICBTY2hlbWFMb2FkZXIuaW5zZXJ0RGF0YShrZXlzcGFjZSwgY2YsIDAsIG51bWJlck9mUm93cyk7CisgICAgICAgICAgICBVdGlsLmZsdXNoKHN0b3JlKTsKKyAgICAgICAgfQorICAgICAgICBmb3IoUGFpcjxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiB0YWJsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBrZXlzcGFjZSA9IGVudHJ5LmxlZnQoKTsKKyAgICAgICAgICAgIFN0cmluZyBjZiA9IGVudHJ5LnJpZ2h0KCk7CisgICAgICAgICAgICAvLyBwb3B1bGF0ZSB0aGUgY2FjaGUKKyAgICAgICAgICAgIHJlYWREYXRhKGtleXNwYWNlLCBjZiwgMCwgbnVtYmVyT2ZSb3dzKTsKKyAgICAgICAgICAgIGFzc2VydEtleUNhY2hlU2l6ZShudW1iZXJPZlJvd3MsIGtleXNwYWNlLCBjZik7CisgICAgICAgIH0KKworICAgICAgICAvLyBmb3JjZSB0aGUgY2FjaGUgdG8gZGlzaworICAgICAgICBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGUuc3VibWl0V3JpdGUoQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLnNpemUoKSkuZ2V0KCk7CisKKyAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmludmFsaWRhdGVLZXlDYWNoZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLnNpemUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWFkRGF0YShTdHJpbmcga2V5c3BhY2UsIFN0cmluZyBjb2x1bW5GYW1pbHksIGludCBzdGFydFJvdywgaW50IG51bWJlck9mUm93cykKKyAgICB7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlID0gS2V5c3BhY2Uub3BlbihrZXlzcGFjZSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY29sdW1uRmFtaWx5KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZlJvd3M7IGkrKykKKyAgICAgICAgICAgIFV0aWwuZ2V0QWxsKFV0aWwuY21kKHN0b3JlLCAia2V5IiArIChpICsgc3RhcnRSb3cpKS5pbmNsdWRlUm93KCJjb2wiICsgKGkgKyBzdGFydFJvdykpLmJ1aWxkKCkpOworICAgIH0KKworCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEtleUNhY2hlU2l6ZShpbnQgZXhwZWN0ZWQsIFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIGNvbHVtbkZhbWlseSkKKyAgICB7CisgICAgICAgIGludCBzaXplID0gMDsKKyAgICAgICAgZm9yIChJdGVyYXRvcjxLZXlDYWNoZUtleT4gaXRlciA9IENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5rZXlJdGVyYXRvcigpOworICAgICAgICAgICAgIGl0ZXIuaGFzTmV4dCgpOykKKyAgICAgICAgeworICAgICAgICAgICAgS2V5Q2FjaGVLZXkgayA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKGsuZGVzYy5rc25hbWUuZXF1YWxzKGtleXNwYWNlKSAmJiBrLmRlc2MuY2ZuYW1lLmVxdWFscyhjb2x1bW5GYW1pbHkpKQorICAgICAgICAgICAgICAgIHNpemUrKzsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoc3N0YWJsZUltcGxDYWNoZXNLZXlzID8gZXhwZWN0ZWQgOiAwLCBzaXplKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9tZXRhZGF0YS9NZXRhZGF0YVNlcmlhbGl6ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9tZXRhZGF0YS9NZXRhZGF0YVNlcmlhbGl6ZXJUZXN0LmphdmEKaW5kZXggOWI1ZmY2Mi4uMDU2NmViOCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvbWV0YWRhdGEvTWV0YWRhdGFTZXJpYWxpemVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL21ldGFkYXRhL01ldGFkYXRhU2VyaWFsaXplclRlc3QuamF2YQpAQCAtMTcsMjkgKzE3LDQwIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2VxdWVuY2VCYXNlZFNTVGFibGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLio7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZy5Db21taXRMb2dQb3NpdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuSW50ZXJ2YWxTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Bc2NpaVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnQzMlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZG9tUGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2VxdWVuY2VCYXNlZFNTVGFibGVJZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlT3V0cHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwpAQCAtNDgsMjEgKzU5LDI2IEBACiAKIHB1YmxpYyBjbGFzcyBNZXRhZGF0YVNlcmlhbGl6ZXJUZXN0CiB7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE1ldGFkYXRhU2VyaWFsaXplclRlc3QuY2xhc3MpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXQ7CisKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdEREKCkKICAgICB7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOworICAgICAgICBmb3JtYXQgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgTWFwPE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFDb21wb25lbnQ+IG9yaWdpbmFsTWV0YWRhdGEgPSBjb25zdHJ1Y3RNZXRhZGF0YSgpOworICAgICAgICBNYXA8TWV0YWRhdGFUeXBlLCBNZXRhZGF0YUNvbXBvbmVudD4gb3JpZ2luYWxNZXRhZGF0YSA9IGNvbnN0cnVjdE1ldGFkYXRhKGZhbHNlKTsKIAogICAgICAgICBNZXRhZGF0YVNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBNZXRhZGF0YVNlcmlhbGl6ZXIoKTsKLSAgICAgICAgRmlsZSBzdGF0c0ZpbGUgPSBzZXJpYWxpemUob3JpZ2luYWxNZXRhZGF0YSwgc2VyaWFsaXplciwgQmlnRm9ybWF0LmxhdGVzdFZlcnNpb24pOworICAgICAgICBGaWxlIHN0YXRzRmlsZSA9IHNlcmlhbGl6ZShvcmlnaW5hbE1ldGFkYXRhLCBzZXJpYWxpemVyLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkuZ2V0TGF0ZXN0VmVyc2lvbigpKTsKIAotICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBuZXcgRGVzY3JpcHRvcihzdGF0c0ZpbGUucGFyZW50KCksICIiLCAiIiwgbmV3IFNlcXVlbmNlQmFzZWRTU1RhYmxlSWQoMCksIFNTVGFibGVGb3JtYXQuVHlwZS5CSUcpOworICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBuZXcgRGVzY3JpcHRvcihzdGF0c0ZpbGUucGFyZW50KCksICIiLCAiIiwgbmV3IFNlcXVlbmNlQmFzZWRTU1RhYmxlSWQoMCksIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSk7CiAgICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzUmVhZGVyIGluID0gUmFuZG9tQWNjZXNzUmVhZGVyLm9wZW4oc3RhdHNGaWxlKSkKICAgICAgICAgewogICAgICAgICAgICAgTWFwPE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFDb21wb25lbnQ+IGRlc2VyaWFsaXplZCA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGVzYywgaW4sIEVudW1TZXQuYWxsT2YoTWV0YWRhdGFUeXBlLmNsYXNzKSk7CkBAIC03Nyw3ICs5Myw3IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGlzdG9ncmFtU3RlcmlsaXphdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgTWFwPE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFDb21wb25lbnQ+IG9yaWdpbmFsTWV0YWRhdGEgPSBjb25zdHJ1Y3RNZXRhZGF0YSgpOworICAgICAgICBNYXA8TWV0YWRhdGFUeXBlLCBNZXRhZGF0YUNvbXBvbmVudD4gb3JpZ2luYWxNZXRhZGF0YSA9IGNvbnN0cnVjdE1ldGFkYXRhKGZhbHNlKTsKIAogICAgICAgICAvLyBNb2RpZnkgdGhlIGhpc3RvZ3JhbXMgdG8gb3ZlcmZsb3c6CiAgICAgICAgIFN0YXRzTWV0YWRhdGEgb3JpZ2luYWxTdGF0cyA9IChTdGF0c01ldGFkYXRhKSBvcmlnaW5hbE1ldGFkYXRhLmdldChNZXRhZGF0YVR5cGUuU1RBVFMpOwpAQCAtODgsOCArMTA0LDggQEAKIAogICAgICAgICAvLyBTZXJpYWxpemUgdy8gb3ZlcmZsb3dlZCBoaXN0b2dyYW1zOgogICAgICAgICBNZXRhZGF0YVNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBNZXRhZGF0YVNlcmlhbGl6ZXIoKTsKLSAgICAgICAgRmlsZSBzdGF0c0ZpbGUgPSBzZXJpYWxpemUob3JpZ2luYWxNZXRhZGF0YSwgc2VyaWFsaXplciwgQmlnRm9ybWF0LmxhdGVzdFZlcnNpb24pOwotICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBuZXcgRGVzY3JpcHRvcihzdGF0c0ZpbGUucGFyZW50KCksICIiLCAiIiwgbmV3IFNlcXVlbmNlQmFzZWRTU1RhYmxlSWQoMCksIFNTVGFibGVGb3JtYXQuVHlwZS5CSUcpOworICAgICAgICBGaWxlIHN0YXRzRmlsZSA9IHNlcmlhbGl6ZShvcmlnaW5hbE1ldGFkYXRhLCBzZXJpYWxpemVyLCBmb3JtYXQuZ2V0TGF0ZXN0VmVyc2lvbigpKTsKKyAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gbmV3IERlc2NyaXB0b3Ioc3RhdHNGaWxlLnBhcmVudCgpLCAiIiwgIiIsIG5ldyBTZXF1ZW5jZUJhc2VkU1NUYWJsZUlkKDApLCBmb3JtYXQpOwogCiAgICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzUmVhZGVyIGluID0gUmFuZG9tQWNjZXNzUmVhZGVyLm9wZW4oc3RhdHNGaWxlKSkKICAgICAgICAgewpAQCAtMTA1LDcgKzEyMSw3IEBACiAgICAgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICAvLyBTZXJpYWxpemUgdG8gdG1wIGZpbGUKLSAgICAgICAgRmlsZSBzdGF0c0ZpbGUgPSBGaWxlVXRpbHMuY3JlYXRlVGVtcEZpbGUoQ29tcG9uZW50LlNUQVRTLm5hbWUsIG51bGwpOworICAgICAgICBGaWxlIHN0YXRzRmlsZSA9IEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZShDb21wb25lbnRzLlNUQVRTLm5hbWUsIG51bGwpOwogICAgICAgICB0cnkgKERhdGFPdXRwdXRTdHJlYW1QbHVzIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtUGx1cyhzdGF0c0ZpbGUpKQogICAgICAgICB7CiAgICAgICAgICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShtZXRhZGF0YSwgb3V0LCB2ZXJzaW9uKTsKQEAgLTExMywzNCArMTI5LDQ0IEBACiAgICAgICAgIHJldHVybiBzdGF0c0ZpbGU7CiAgICAgfQogCi0gICAgcHVibGljIE1hcDxNZXRhZGF0YVR5cGUsIE1ldGFkYXRhQ29tcG9uZW50PiBjb25zdHJ1Y3RNZXRhZGF0YSgpCisgICAgcHVibGljIE1hcDxNZXRhZGF0YVR5cGUsIE1ldGFkYXRhQ29tcG9uZW50PiBjb25zdHJ1Y3RNZXRhZGF0YShib29sZWFuIHdpdGhOdWxscykKICAgICB7CiAgICAgICAgIENvbW1pdExvZ1Bvc2l0aW9uIGNsdWIgPSBuZXcgQ29tbWl0TG9nUG9zaXRpb24oMTFMLCAxMik7CiAgICAgICAgIENvbW1pdExvZ1Bvc2l0aW9uIGNsbGIgPSBuZXcgQ29tbWl0TG9nUG9zaXRpb24oOUwsIDEyKTsKIAotICAgICAgICBUYWJsZU1ldGFkYXRhIGNmbSA9IFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoImtzMSIsICJjZjEiKS5idWlsZCgpOworICAgICAgICBUYWJsZU1ldGFkYXRhIGNmbSA9IFRhYmxlTWV0YWRhdGEuYnVpbGRlcigia3MxIiwgImNmMSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRQYXJ0aXRpb25LZXlDb2x1bW4oImsiLCBBc2NpaVR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbHVzdGVyaW5nQ29sdW1uKCJjMSIsIFVURjhUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2x1c3RlcmluZ0NvbHVtbigiYzIiLCBJbnQzMlR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWd1bGFyQ29sdW1uKCJ2IiwgSW50MzJUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKICAgICAgICAgTWV0YWRhdGFDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IE1ldGFkYXRhQ29sbGVjdG9yKGNmbS5jb21wYXJhdG9yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29tbWl0TG9nSW50ZXJ2YWxzKG5ldyBJbnRlcnZhbFNldDw+KGNsbGIsIGNsdWIpKTsKIAogICAgICAgICBTdHJpbmcgcGFydGl0aW9uZXIgPSBSYW5kb21QYXJ0aXRpb25lci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCk7CiAgICAgICAgIGRvdWJsZSBiZkZwQ2hhbmNlID0gMC4xOwotICAgICAgICByZXR1cm4gY29sbGVjdG9yLmZpbmFsaXplTWV0YWRhdGEocGFydGl0aW9uZXIsIGJmRnBDaGFuY2UsIDAsIG51bGwsIGZhbHNlLCBTZXJpYWxpemF0aW9uSGVhZGVyLm1ha2UoY2ZtLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSkpOworICAgICAgICBjb2xsZWN0b3IudXBkYXRlQ2x1c3RlcmluZ1ZhbHVlcyhDbHVzdGVyaW5nLm1ha2UoVVRGOFR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKCJhYmMiKSwgSW50MzJUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgxMjMpKSk7CisgICAgICAgIGNvbGxlY3Rvci51cGRhdGVDbHVzdGVyaW5nVmFsdWVzKENsdXN0ZXJpbmcubWFrZShVVEY4VHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoImNiYSIpLCB3aXRoTnVsbHMgPyBudWxsIDogSW50MzJUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgyMzQpKSk7CisgICAgICAgIEJ5dGVCdWZmZXIgZmlyc3QgPSBBc2NpaVR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKCJhIik7CisgICAgICAgIEJ5dGVCdWZmZXIgbGFzdCA9IEFzY2lpVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoImIiKTsKKyAgICAgICAgcmV0dXJuIGNvbGxlY3Rvci5maW5hbGl6ZU1ldGFkYXRhKHBhcnRpdGlvbmVyLCBiZkZwQ2hhbmNlLCAwLCBudWxsLCBmYWxzZSwgU2VyaWFsaXphdGlvbkhlYWRlci5tYWtlKGNmbSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpLCBmaXJzdCwgbGFzdCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RWZXJzaW9ucyhTdHJpbmcuLi4gdmVyc2lvbnMpIHRocm93cyBUaHJvd2FibGUKKyAgICBwcml2YXRlIHZvaWQgdGVzdFZlcnNpb25zKExpc3Q8U3RyaW5nPiB2ZXJzaW9ucykgdGhyb3dzIFRocm93YWJsZQogICAgIHsKKyAgICAgICAgbG9nZ2VyLmluZm8oIlRlc3RpbmcgbWlub3IgdmVyc2lvbnMge30gY29tcGF0aWJpbGl0eSBmb3Igc3N0YWJsZSBmb3JtYXQge30iLCB2ZXJzaW9ucywgZm9ybWF0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKICAgICAgICAgVGhyb3dhYmxlIHQgPSBudWxsOwotICAgICAgICBmb3IgKGludCBvbGRJZHggPSAwOyBvbGRJZHggPCB2ZXJzaW9ucy5sZW5ndGg7IG9sZElkeCsrKQorICAgICAgICBmb3IgKGludCBvbGRJZHggPSAwOyBvbGRJZHggPCB2ZXJzaW9ucy5zaXplKCk7IG9sZElkeCsrKQogICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBuZXdJZHggPSBvbGRJZHg7IG5ld0lkeCA8IHZlcnNpb25zLmxlbmd0aDsgbmV3SWR4KyspCisgICAgICAgICAgICBmb3IgKGludCBuZXdJZHggPSBvbGRJZHg7IG5ld0lkeCA8IHZlcnNpb25zLnNpemUoKTsgbmV3SWR4KyspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0ZXN0T2xkUmVhZHNOZXcodmVyc2lvbnNbb2xkSWR4XSwgdmVyc2lvbnNbbmV3SWR4XSk7CisgICAgICAgICAgICAgICAgICAgIHRlc3RPbGRSZWFkc05ldyh2ZXJzaW9ucy5nZXQob2xkSWR4KSwgdmVyc2lvbnMuZ2V0KG5ld0lkeCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHwgQXNzZXJ0aW9uRXJyb3IgZSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHQgPSBUaHJvd2FibGVzLm1lcmdlKHQsIG5ldyBBc3NlcnRpb25FcnJvcigiRmFpbGVkIHRvIHRlc3QgIiArIHZlcnNpb25zW29sZElkeF0gKyAiIC0+ICIgKyB2ZXJzaW9uc1tuZXdJZHhdLCBlKSk7CisgICAgICAgICAgICAgICAgICAgIHQgPSBUaHJvd2FibGVzLm1lcmdlKHQsIG5ldyBBc3NlcnRpb25FcnJvcigiRmFpbGVkIHRvIHRlc3QgIiArIHZlcnNpb25zLmdldChvbGRJZHgpICsgIiAtPiAiICsgdmVyc2lvbnMuZ2V0KG5ld0lkeCksIGUpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE1MSwyOCArMTc3LDMyIEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TVZlcnNpb25zKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHB1YmxpYyB2b2lkIHRlc3RNaW5vclZlcnNpb25zQ29tcGF0aWJpbHR5KCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKLSAgICAgICAgdGVzdFZlcnNpb25zKCJtYSIsICJtYiIsICJtYyIsICJtZCIsICJtZSIpOwotICAgIH0KKyAgICAgICAgTWFwPENoYXJhY3RlciwgTGlzdDxTdHJpbmc+PiBzdXBwb3J0ZWRWZXJzaW9ucyA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKIAotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5WZXJzaW9ucygpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIHRlc3RWZXJzaW9ucygibmEiLCAibmIiKTsKKyAgICAgICAgZm9yIChjaGFyIG1ham9yID0gJ2EnOyBtYWpvciA8PSAneic7IG1ham9yKyspeworICAgICAgICAgICAgZm9yIChjaGFyIG1pbm9yID0gJ2EnOyBtaW5vciA8PSAneic7IG1pbm9yKyspeworICAgICAgICAgICAgICAgIFZlcnNpb24gdmVyc2lvbiA9IGZvcm1hdC5nZXRWZXJzaW9uKFN0cmluZy5mb3JtYXQoIiVzJXMiLCBtYWpvciwgbWlub3IpKTsKKyAgICAgICAgICAgICAgICBpZiAodmVyc2lvbi5pc0NvbXBhdGlibGUoKSkKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkVmVyc2lvbnMuY29tcHV0ZUlmQWJzZW50KG1ham9yLCBpZ25vcmVkIC0+IG5ldyBBcnJheUxpc3Q8PigpKS5hZGQodmVyc2lvbi52ZXJzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoTGlzdDxTdHJpbmc+IG1pbm9yVmVyc2lvbnMgOiBzdXBwb3J0ZWRWZXJzaW9ucy52YWx1ZXMoKSkKKyAgICAgICAgICAgIHRlc3RWZXJzaW9ucyhtaW5vclZlcnNpb25zKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0T2xkUmVhZHNOZXcoU3RyaW5nIG9sZFYsIFN0cmluZyBuZXdWKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIE1hcDxNZXRhZGF0YVR5cGUsIE1ldGFkYXRhQ29tcG9uZW50PiBvcmlnaW5hbE1ldGFkYXRhID0gY29uc3RydWN0TWV0YWRhdGEoKTsKKyAgICAgICAgTWFwPE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFDb21wb25lbnQ+IG9yaWdpbmFsTWV0YWRhdGEgPSBjb25zdHJ1Y3RNZXRhZGF0YSh0cnVlKTsKIAogICAgICAgICBNZXRhZGF0YVNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBNZXRhZGF0YVNlcmlhbGl6ZXIoKTsKICAgICAgICAgLy8gV3JpdGUgbWV0YWRhdGEgaW4gdHdvIG1pbm9yIGZvcm1hdHMuCi0gICAgICAgIEZpbGUgc3RhdHNGaWxlTGIgPSBzZXJpYWxpemUob3JpZ2luYWxNZXRhZGF0YSwgc2VyaWFsaXplciwgQmlnRm9ybWF0Lmluc3RhbmNlLmdldFZlcnNpb24obmV3VikpOwotICAgICAgICBGaWxlIHN0YXRzRmlsZUxhID0gc2VyaWFsaXplKG9yaWdpbmFsTWV0YWRhdGEsIHNlcmlhbGl6ZXIsIEJpZ0Zvcm1hdC5pbnN0YW5jZS5nZXRWZXJzaW9uKG9sZFYpKTsKKyAgICAgICAgRmlsZSBzdGF0c0ZpbGVMYiA9IHNlcmlhbGl6ZShvcmlnaW5hbE1ldGFkYXRhLCBzZXJpYWxpemVyLCBmb3JtYXQuZ2V0VmVyc2lvbihuZXdWKSk7CisgICAgICAgIEZpbGUgc3RhdHNGaWxlTGEgPSBzZXJpYWxpemUob3JpZ2luYWxNZXRhZGF0YSwgc2VyaWFsaXplciwgZm9ybWF0LmdldFZlcnNpb24ob2xkVikpOwogICAgICAgICAvLyBSZWFkaW5nIGJvdGggYXMgZWFybGllciB2ZXJzaW9uIHNob3VsZCB5aWVsZCBpZGVudGljYWwgcmVzdWx0cy4KLSAgICAgICAgU1NUYWJsZUZvcm1hdC5UeXBlIHN0eXBlID0gU1NUYWJsZUZvcm1hdC5UeXBlLmN1cnJlbnQoKTsKLSAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gbmV3IERlc2NyaXB0b3Ioc3R5cGUuaW5mby5nZXRWZXJzaW9uKG9sZFYpLCBzdGF0c0ZpbGVMYi5wYXJlbnQoKSwgIiIsICIiLCBuZXcgU2VxdWVuY2VCYXNlZFNTVGFibGVJZCgwKSwgc3R5cGUpOworICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBuZXcgRGVzY3JpcHRvcihmb3JtYXQuZ2V0VmVyc2lvbihvbGRWKSwgc3RhdHNGaWxlTGIucGFyZW50KCksICIiLCAiIiwgbmV3IFNlcXVlbmNlQmFzZWRTU1RhYmxlSWQoMCkpOwogICAgICAgICB0cnkgKFJhbmRvbUFjY2Vzc1JlYWRlciBpbkxiID0gUmFuZG9tQWNjZXNzUmVhZGVyLm9wZW4oc3RhdHNGaWxlTGIpOwogICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciBpbkxhID0gUmFuZG9tQWNjZXNzUmVhZGVyLm9wZW4oc3RhdHNGaWxlTGEpKQogICAgICAgICB7CkBAIC0xODksMTcgKzIxOSw0IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHBlbmRpbmdSZXBhaXJDb21wYXRpYmlsaXR5KCkKLSAgICB7Ci0gICAgICAgIEFycmF5cy5hc0xpc3QoIm1hIiwgIm1iIiwgIm1jIiwgIm1kIiwgIm1lIikuZm9yRWFjaCh2IC0+IGFzc2VydEZhbHNlKEJpZ0Zvcm1hdC5pbnN0YW5jZS5nZXRWZXJzaW9uKHYpLmhhc1BlbmRpbmdSZXBhaXIoKSkpOwotICAgICAgICBBcnJheXMuYXNMaXN0KCJuYSIsICJuYiIpLmZvckVhY2godiAtPiBhc3NlcnRUcnVlKEJpZ0Zvcm1hdC5pbnN0YW5jZS5nZXRWZXJzaW9uKHYpLmhhc1BlbmRpbmdSZXBhaXIoKSkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgb3JpZ2luYXRpbmdIb3N0Q29tcGF0aWJpbGl0eSgpCi0gICAgewotICAgICAgICBBcnJheXMuYXNMaXN0KCJtYSIsICJtYiIsICJtYyIsICJtZCIsICJuYSIpLmZvckVhY2godiAtPiBhc3NlcnRGYWxzZShCaWdGb3JtYXQuaW5zdGFuY2UuZ2V0VmVyc2lvbih2KS5oYXNPcmlnaW5hdGluZ0hvc3RJZCgpKSk7Ci0gICAgICAgIEFycmF5cy5hc0xpc3QoIm1lIiwgIm5iIikuZm9yRWFjaCh2IC0+IGFzc2VydFRydWUoQmlnRm9ybWF0Lmluc3RhbmNlLmdldFZlcnNpb24odikuaGFzT3JpZ2luYXRpbmdIb3N0SWQoKSkpOwotICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9BYnN0cmFjdFRyaWVUZXN0QmFzZS5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL0Fic3RyYWN0VHJpZVRlc3RCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVhZTIwYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9BYnN0cmFjdFRyaWVUZXN0QmFzZS5qYXZhCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpRnVuY3Rpb247CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkNoYW5uZWxQcm94eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlBhZ2VBd2FyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJlYnVmZmVyZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CisKK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWJzdHJhY3RUcmllVGVzdEJhc2UKK3sKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoMCkKKyAgICBwdWJsaWMgVGVzdENsYXNzIHdyaXRlckNsYXNzOworCisgICAgZW51bSBUZXN0Q2xhc3MKKyAgICB7CisgICAgICAgIFNJTVBMRShJbmNyZW1lbnRhbFRyaWVXcml0ZXJTaW1wbGU6Om5ldyksCisgICAgICAgIFBBR0VfQVdBUkUoSW5jcmVtZW50YWxUcmllV3JpdGVyUGFnZUF3YXJlOjpuZXcpLAorICAgICAgICBQQUdFX0FXQVJFX0RFRVBfT05fU1RBQ0soKHNlcmlhbGl6ZXIsIGRlc3QpIC0+IG5ldyBJbmNyZW1lbnRhbERlZXBUcmllV3JpdGVyUGFnZUF3YXJlPD4oc2VyaWFsaXplciwgZGVzdCwgMjU2KSksCisgICAgICAgIFBBR0VfQVdBUkVfREVFUF9PTl9IRUFQKChzZXJpYWxpemVyLCBkZXN0KSAtPiBuZXcgSW5jcmVtZW50YWxEZWVwVHJpZVdyaXRlclBhZ2VBd2FyZTw+KHNlcmlhbGl6ZXIsIGRlc3QsIDApKSwKKyAgICAgICAgUEFHRV9BV0FSRV9ERUVQX01JWEVEKChzZXJpYWxpemVyLCBkZXN0KSAtPiBuZXcgSW5jcmVtZW50YWxEZWVwVHJpZVdyaXRlclBhZ2VBd2FyZTw+KHNlcmlhbGl6ZXIsIGRlc3QsIDIpKTsKKworICAgICAgICBmaW5hbCBCaUZ1bmN0aW9uPFRyaWVTZXJpYWxpemVyPEludGVnZXIsIERhdGFPdXRwdXRQbHVzPiwgRGF0YU91dHB1dFBsdXMsIEluY3JlbWVudGFsVHJpZVdyaXRlcjxJbnRlZ2VyPj4gY29uc3RydWN0b3I7CisgICAgICAgIFRlc3RDbGFzcyhCaUZ1bmN0aW9uPFRyaWVTZXJpYWxpemVyPEludGVnZXIsIERhdGFPdXRwdXRQbHVzPiwgRGF0YU91dHB1dFBsdXMsIEluY3JlbWVudGFsVHJpZVdyaXRlcjxJbnRlZ2VyPj4gY29uc3RydWN0b3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ7aW5kZXh9OiB0cmllIHdyaXRlciBjbGFzcz17MH0iKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gZGF0YSgpCisgICAgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W117IFRlc3RDbGFzcy5TSU1QTEUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBUZXN0Q2xhc3MuUEFHRV9BV0FSRSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IFRlc3RDbGFzcy5QQUdFX0FXQVJFX0RFRVBfT05fU1RBQ0sgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBUZXN0Q2xhc3MuUEFHRV9BV0FSRV9ERUVQX09OX0hFQVAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBUZXN0Q2xhc3MuUEFHRV9BV0FSRV9ERUVQX01JWEVEIH0pOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRyaWVCdWlsZGVyVGVzdC5jbGFzcyk7CisgICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgQkFTRSA9IDgwOworCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZHVtcCA9IGZhbHNlOworICAgIHByb3RlY3RlZCBpbnQgcGF5bG9hZFNpemUgPSAwOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIGJlZm9yZVRlc3QoKQorICAgIHsKKyAgICAgICAgZHVtcCA9IGZhbHNlOworICAgICAgICBwYXlsb2FkU2l6ZSA9IDA7CisgICAgfQorCisgICAgSW5jcmVtZW50YWxUcmllV3JpdGVyPEludGVnZXI+IG5ld1RyaWVXcml0ZXIoVHJpZVNlcmlhbGl6ZXI8SW50ZWdlciwgRGF0YU91dHB1dFBsdXM+IHNlcmlhbGl6ZXIsIERhdGFPdXRwdXRQbHVzIG91dCkKKyAgICB7CisgICAgICAgIHJldHVybiB3cml0ZXJDbGFzcy5jb25zdHJ1Y3Rvci5hcHBseShzZXJpYWxpemVyLCBvdXQpOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBUcmllU2VyaWFsaXplcjxJbnRlZ2VyLCBEYXRhT3V0cHV0UGx1cz4gc2VyaWFsaXplciA9IG5ldyBUcmllU2VyaWFsaXplcjxJbnRlZ2VyLCBEYXRhT3V0cHV0UGx1cz4oKQorICAgIHsKKyAgICAgICAgcHVibGljIGludCBzaXplb2ZOb2RlKFNlcmlhbGl6YXRpb25Ob2RlPEludGVnZXI+IG5vZGUsIGxvbmcgbm9kZVBvc2l0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVHJpZU5vZGUudHlwZUZvcihub2RlLCBub2RlUG9zaXRpb24pLnNpemVvZk5vZGUobm9kZSkgKyBwYXlsb2FkU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKERhdGFPdXRwdXRQbHVzIGRhdGFPdXRwdXQsIFNlcmlhbGl6YXRpb25Ob2RlPEludGVnZXI+IG5vZGUsIGxvbmcgbm9kZVBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGR1bXApCisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIldyaXRpbmcgYXQge30gdHlwZSB7fSBzaXplIHt9OiB7fSIsIExvbmcudG9IZXhTdHJpbmcobm9kZVBvc2l0aW9uKSwgVHJpZU5vZGUudHlwZUZvcihub2RlLCBub2RlUG9zaXRpb24pLCBUcmllTm9kZS50eXBlRm9yKG5vZGUsIG5vZGVQb3NpdGlvbikuc2l6ZW9mTm9kZShub2RlKSwgbm9kZSk7CisgICAgICAgICAgICAvLyBPdXIgcGF5bG9hZCB2YWx1ZSBpcyBhbiBpbnRlZ2VyIG9mIGZvdXIgYml0cy4KKyAgICAgICAgICAgIC8vIFdlIHVzZSB0aGUgcGF5bG9hZCBiaXRzIGluIHRoZSB0cmllIG5vZGUgaGVhZGVyIHRvIGZ1bGx5IHN0b3JlIGl0LgorICAgICAgICAgICAgVHJpZU5vZGUudHlwZUZvcihub2RlLCBub2RlUG9zaXRpb24pLnNlcmlhbGl6ZShkYXRhT3V0cHV0LCBub2RlLCBub2RlLnBheWxvYWQoKSAhPSBudWxsID8gbm9kZS5wYXlsb2FkKCkgOiAwLCBub2RlUG9zaXRpb24pOworICAgICAgICAgICAgLy8gYW5kIHdlIGFsc28gYWRkIHNvbWUgcGFkZGluZyBpZiBhIHRlc3QgbmVlZHMgaXQKKyAgICAgICAgICAgIGRhdGFPdXRwdXQud3JpdGUobmV3IGJ5dGVbcGF5bG9hZFNpemVdKTsKKyAgICAgICAgfQorICAgIH07CisKKworICAgIHByb3RlY3RlZCBpbnQgdmFsdWVGb3IobG9uZyBmb3VuZCkKKyAgICB7CisgICAgICAgIHJldHVybiBMb25nLmJpdENvdW50KGZvdW5kICsgMSkgJiAweEY7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEJ5dGVDb21wYXJhYmxlIHNvdXJjZShTdHJpbmcgcykKKyAgICB7CisgICAgICAgIGlmIChzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKHMubGVuZ3RoKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7ICsraSkKKyAgICAgICAgICAgIGJ1Zi5wdXQoKGJ5dGUpIHMuY2hhckF0KGkpKTsKKyAgICAgICAgYnVmLnJld2luZCgpOworICAgICAgICByZXR1cm4gQnl0ZUNvbXBhcmFibGUuZml4ZWRMZW5ndGgoYnVmKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRvQmFzZShsb25nIHYpCisgICAgeworICAgICAgICByZXR1cm4gQmlnSW50ZWdlci52YWx1ZU9mKHYpLnRvU3RyaW5nKEJBU0UpOworICAgIH0KKworICAgIC8vIEluLW1lbW9yeSBidWZmZXIgd2l0aCBhZGRlZCBwYWdpbmcgcGFyYW1ldGVycywgdG8gbWFrZSBzdXJlIHRoZSBjb2RlIGJlbG93IGRvZXMgdGhlIHByb3BlciBsYXlvdXQKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIERhdGFPdXRwdXRCdWZmZXJQYWdlZCBleHRlbmRzIERhdGFPdXRwdXRCdWZmZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBpbnQgbWF4Qnl0ZXNJblBhZ2UoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUGFnZUF3YXJlLlBBR0VfU0laRTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHBhZFRvUGFnZUJvdW5kYXJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIFBhZ2VBd2FyZS5wYWQodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGJ5dGVzTGVmdEluUGFnZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgcG9zaXRpb24gPSBwb3NpdGlvbigpOworICAgICAgICAgICAgbG9uZyBieXRlc0xlZnQgPSBQYWdlQXdhcmUucGFnZUxpbWl0KHBvc2l0aW9uKSAtIHBvc2l0aW9uOworICAgICAgICAgICAgcmV0dXJuIChpbnQpIGJ5dGVzTGVmdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIHBhZGRlZFBvc2l0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFBhZ2VBd2FyZS5wYWRkZWQocG9zaXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEJ5dGVCdWZSZWJ1ZmZlcmVyIGltcGxlbWVudHMgUmVidWZmZXJlciwgUmVidWZmZXJlci5CdWZmZXJIb2xkZXIKKyAgICB7CisgICAgICAgIGZpbmFsIEJ5dGVCdWZmZXIgYnVmZmVyOworCisgICAgICAgIEJ5dGVCdWZSZWJ1ZmZlcmVyKEJ5dGVCdWZmZXIgYnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2hhbm5lbFByb3h5IGNoYW5uZWwoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBidWZmZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYnVmZmVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGZpbGVMZW5ndGgoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYnVmZmVyLnJlbWFpbmluZygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0Q3JjQ2hlY2tDaGFuY2UoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVmZmVySG9sZGVyIHJlYnVmZmVyKGxvbmcgcG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIG9mZnNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBub3RoaW5nCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBub3RoaW5nCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2VSZWFkZXIoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBub3RoaW5nCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvVHJpZUJ1aWxkZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvVHJpZUJ1aWxkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ4NDAzMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9UcmllQnVpbGRlclRlc3QuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udHJpZXM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SZWJ1ZmZlcmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuVGFpbE92ZXJyaWRpbmdSZWJ1ZmZlcmVyOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgVHJpZUJ1aWxkZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RUcmllVGVzdEJhc2UKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJ0aWFsQnVpbGRSZWNhbGN1bGF0aW9uQnVnKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhT3V0cHV0QnVmZmVyIGJ1ZiA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyUGFnZWQoKTsKKyAgICAgICAgSW5jcmVtZW50YWxUcmllV3JpdGVyPEludGVnZXI+IGJ1aWxkZXIgPSBuZXdUcmllV3JpdGVyKHNlcmlhbGl6ZXIsIGJ1Zik7CisgICAgICAgIGxvbmcgY291bnQgPSAwOworCisgICAgICAgIGNvdW50ICs9IGFkZFVudGlsQnl0ZXNXcml0dGVuKGJ1ZiwgYnVpbGRlciwgImEiLCAxKTsgICAgICAgICAgICAvLyBNYWtlIGEgbm9kZSB3aG9zZSBjaGlsZHJlbiBhcmUgd3JpdHRlbgorICAgICAgICBsb25nIHJlc2V0ID0gY291bnQ7CisgICAgICAgIGNvdW50ICs9IGFkZFVudGlsQnl0ZXNXcml0dGVuKGJ1ZiwgYnVpbGRlciwgImMiLCA2NCAqIDEwMjQpOyAgICAvLyBGaW5hbGl6ZSBpdCBhbmQgd3JpdGUgbG9uZyBlbm91Z2ggdG8gZ3JvdyBpdHMgcG9pbnRlciBzaXplCisKKyAgICAgICAgZHVtcCA9IHRydWU7CisgICAgICAgIEluY3JlbWVudGFsVHJpZVdyaXRlci5QYXJ0aWFsVGFpbCB0YWlsID0gYnVpbGRlci5tYWtlUGFydGlhbFJvb3QoKTsKKyAgICAgICAgLy8gVGhlIGxpbmUgYWJvdmUgaGl0IGFuIGFzc2VydGlvbiBhcyB0aGF0IG5vZGUncyBwYXJlbnQgaGFkIGEgcHJlLWNhbGN1bGF0ZWQgYnJhbmNoIHNpemUgd2hpY2ggd2FzIG5vIGxvbmdlcgorICAgICAgICAvLyBjb3JyZWN0LCBhbmQgd2UgZGlkbid0IGJvdGhlciB0byByZXNldCBpdC4KKyAgICAgICAgZHVtcCA9IGZhbHNlOworCisgICAgICAgIC8vIENoZWNrIHRoYXQgcGFydGlhbCByZXByZXNlbnRhdGlvbiBoYXMgdGhlIHJpZ2h0IGNvbnRlbnQuCisgICAgICAgIFJlYnVmZmVyZXIgc291cmNlID0gbmV3IEJ5dGVCdWZSZWJ1ZmZlcmVyKGJ1Zi5hc05ld0J1ZmZlcigpKTsKKyAgICAgICAgc291cmNlID0gbmV3IFRhaWxPdmVycmlkaW5nUmVidWZmZXJlcihzb3VyY2UsIHRhaWwuY3V0b2ZmKCksIHRhaWwudGFpbCgpKTsKKyAgICAgICAgdmVyaWZ5Q29udGVudChjb3VudCwgc291cmNlLCB0YWlsLnJvb3QoKSwgcmVzZXQpOworCisgICAgICAgIGxvbmcgcmVzZXQyID0gY291bnQ7CisKKyAgICAgICAgLy8gQWxzbyBjaGVjayB0aGUgY29tcGxldGVkIHRyaWUuCisgICAgICAgIGNvdW50ICs9IGFkZFVudGlsQnl0ZXNXcml0dGVuKGJ1ZiwgYnVpbGRlciwgImUiLCAxNiAqIDEwMjQpOworICAgICAgICBkdW1wID0gdHJ1ZTsKKyAgICAgICAgbG9uZyByb290ID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICAvLyBUaGUgbGluZSBhYm92ZSBoaXQgYW5vdGhlciBzaXplIGFzc2VydGlvbiBhcyB0aGUgc2l6ZSBvZiBhIG5vZGUncyBicmFuY2ggZ3Jvd2luZyBjYXVzZWQgaXQgdG8gbmVlZCB0byBzd2l0Y2gKKyAgICAgICAgLy8gZm9ybWF0LCBidXQgd2UgZGlkbid0IGJvdGhlciB0byByZWNhbGN1bGF0ZSBpdHMgc2l6ZS4KKyAgICAgICAgZHVtcCA9IGZhbHNlOworCisgICAgICAgIHNvdXJjZSA9IG5ldyBCeXRlQnVmUmVidWZmZXJlcihidWYuYXNOZXdCdWZmZXIoKSk7CisgICAgICAgIHZlcmlmeUNvbnRlbnQoY291bnQsIHNvdXJjZSwgcm9vdCwgcmVzZXQsIHJlc2V0Mik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmVyaWZ5Q29udGVudChsb25nIGNvdW50LCBSZWJ1ZmZlcmVyIHNvdXJjZSwgbG9uZyByb290LCBsb25nLi4uIHJlc2V0cykKKyAgICB7CisgICAgICAgIFZhbHVlSXRlcmF0b3I8Pz4gaXRlciA9IG5ldyBWYWx1ZUl0ZXJhdG9yPD4oc291cmNlLCByb290KTsKKyAgICAgICAgbG9uZyBmb3VuZCA9IDA7CisgICAgICAgIGxvbmcgb2ZzID0gMDsKKyAgICAgICAgaW50IHJwb3MgPSAwOworICAgICAgICBsb25nIHBvczsKKyAgICAgICAgd2hpbGUgKChwb3MgPSBpdGVyLm5leHRQYXlsb2FkZWROb2RlKCkpICE9IC0xKQorICAgICAgICB7CisgICAgICAgICAgICBpdGVyLmdvKHBvcyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVGb3IoZm91bmQgLSBvZnMpLCBpdGVyLnBheWxvYWRGbGFncygpKTsKKyAgICAgICAgICAgICsrZm91bmQ7CisgICAgICAgICAgICBpZiAocnBvcyA8IHJlc2V0cy5sZW5ndGggJiYgZm91bmQgPj0gcmVzZXRzW3Jwb3NdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9mcyA9IHJlc2V0c1tycG9zXTsKKyAgICAgICAgICAgICAgICArK3Jwb3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50LCBmb3VuZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGFkZFVudGlsQnl0ZXNXcml0dGVuKERhdGFPdXRwdXRCdWZmZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmNyZW1lbnRhbFRyaWVXcml0ZXI8SW50ZWdlcj4gYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBob3dNYW55KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGxvbmcgcG9zID0gYnVmLnBvc2l0aW9uKCk7CisgICAgICAgIGxvbmcgaWR4ID0gMDsKKyAgICAgICAgd2hpbGUgKHBvcyArIGhvd01hbnkgPiBidWYucG9zaXRpb24oKSkKKyAgICAgICAgeworICAgICAgICAgICAgYnVpbGRlci5hZGQoc291cmNlKFN0cmluZy5mb3JtYXQoIiVzJThzIiwgcHJlZml4LCB0b0Jhc2UoaWR4KSkpLCB2YWx1ZUZvcihpZHgpKTsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJBZGRpbmcge30gOiB7fSIsIFN0cmluZy5mb3JtYXQoIiVzJThzIiwgcHJlZml4LCB0b0Jhc2UoaWR4KSksIHZhbHVlRm9yKGlkeCkpOworICAgICAgICAgICAgKytpZHg7CisgICAgICAgIH0KKyAgICAgICAgbG9nZ2VyLmluZm8oU3RyaW5nLmZvcm1hdCgiJXMlOHMiLCBwcmVmaXgsIHRvQmFzZShpZHggLSAxKSkpOworICAgICAgICByZXR1cm4gaWR4OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9UcmllTm9kZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9UcmllTm9kZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGFkMWY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL1RyaWVOb2RlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0QnVmZmVyOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CitpbXBvcnQgb3JnLnF1aWNrdGhlb3JpZXMuYXBpLlBhaXI7CitpbXBvcnQgb3JnLnF1aWNrdGhlb3JpZXMuZ2VuZXJhdG9ycy5HZW5lcmF0ZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnJlc2V0OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CitpbXBvcnQgc3RhdGljIG9yZy5xdWlja3RoZW9yaWVzLlF1aWNrVGhlb3J5LnF0OworaW1wb3J0IHN0YXRpYyBvcmcucXVpY2t0aGVvcmllcy5nZW5lcmF0b3JzLlNvdXJjZURTTC5sb25nczsKKworQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCitwdWJsaWMgY2xhc3MgVHJpZU5vZGVUZXN0Cit7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXJpYWxpemF0aW9uTm9kZTxJbnRlZ2VyPiBzbiA9IE1vY2tpdG8ubW9jayhTZXJpYWxpemF0aW9uTm9kZS5jbGFzcyk7CisgICAgcHJpdmF0ZSBmaW5hbCBEYXRhT3V0cHV0QnVmZmVyIG91dCA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKCk7CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCBhZnRlcigpCisgICAgeworICAgICAgICByZXNldChzbik7CisgICAgICAgIG91dC5jbGVhcigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFR5cGVGb3IwQ2hpbGRyZW4oKQorICAgIHsKKyAgICAgICAgd2hlbihzbi5jaGlsZENvdW50KCkpLnRoZW5SZXR1cm4oMCk7CisgICAgICAgIGFzc2VydFNhbWUoVHJpZU5vZGUuVHlwZXMuUEFZTE9BRF9PTkxZLCBUcmllTm9kZS50eXBlRm9yKHNuLCAwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZUZvcjFDaGlsZE5vUGF5bG9hZCgpCisgICAgeworICAgICAgICB3aGVuKHNuLmNoaWxkQ291bnQoKSkudGhlblJldHVybigxKTsKKyAgICAgICAgd2hlbihzbi5wYXlsb2FkKCkpLnRoZW5SZXR1cm4obnVsbCk7CisKKyAgICAgICAgcXQoKS5mb3JBbGwoR2VuZXJhdGUucGljayhBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgIFBhaXIub2YoUmFuZ2VzLkJJVFNfNCwgVHJpZU5vZGUuVHlwZXMuU0lOR0xFX05PUEFZTE9BRF80KSwKKyAgICAgICAgICAgICAgICBQYWlyLm9mKFJhbmdlcy5CSVRTXzgsIFRyaWVOb2RlLlR5cGVzLlNJTkdMRV84KSwKKyAgICAgICAgICAgICAgICBQYWlyLm9mKFJhbmdlcy5CSVRTXzEyLCBUcmllTm9kZS5UeXBlcy5TSU5HTEVfTk9QQVlMT0FEXzEyKSwKKyAgICAgICAgICAgICAgICBQYWlyLm9mKFJhbmdlcy5CSVRTXzE2LCBUcmllTm9kZS5UeXBlcy5TSU5HTEVfMTYpLAorICAgICAgICAgICAgICAgIFBhaXIub2YoUmFuZ2VzLkJJVFNfMjQsIFRyaWVOb2RlLlR5cGVzLkRFTlNFXzI0KSwKKyAgICAgICAgICAgICAgICBQYWlyLm9mKFJhbmdlcy5CSVRTXzMyLCBUcmllTm9kZS5UeXBlcy5ERU5TRV8zMiksCisgICAgICAgICAgICAgICAgUGFpci5vZihSYW5nZXMuQklUU180MCwgVHJpZU5vZGUuVHlwZXMuREVOU0VfNDApLAorICAgICAgICAgICAgICAgIFBhaXIub2YoUmFuZ2VzLkJJVFNfR1Q0MCwgVHJpZU5vZGUuVHlwZXMuTE9OR19ERU5TRSkKKyAgICAgICAgKSkuZmxhdE1hcChwIC0+IGxvbmdzKCkuYmV0d2VlbihwLl8xLm1pbiwgcC5fMS5tYXgpLm1hcCh2IC0+IFBhaXIub2YodiwgcC5fMikpKSkuY2hlY2socCAtPiB7CisgICAgICAgICAgICB3aGVuKHNuLm1heFBvc2l0aW9uRGVsdGEoMCkpLnRoZW5SZXR1cm4oLXAuXzEpOworICAgICAgICAgICAgcmV0dXJuIHAuXzIgPT0gVHJpZU5vZGUudHlwZUZvcihzbiwgMCk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFR5cGVGb3IxQ2hpbGRBbmRQYXlsb2FkKCkKKyAgICB7CisgICAgICAgIHdoZW4oc24uY2hpbGRDb3VudCgpKS50aGVuUmV0dXJuKDEpOworICAgICAgICB3aGVuKHNuLnBheWxvYWQoKSkudGhlblJldHVybigxKTsKKworICAgICAgICBxdCgpLmZvckFsbChHZW5lcmF0ZS5waWNrKEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgUGFpci5vZihSYW5nZXMuQklUU180LCBUcmllTm9kZS5UeXBlcy5TSU5HTEVfOCksCisgICAgICAgICAgICAgICAgUGFpci5vZihSYW5nZXMuQklUU184LCBUcmllTm9kZS5UeXBlcy5TSU5HTEVfOCksCisgICAgICAgICAgICAgICAgUGFpci5vZihSYW5nZXMuQklUU18xMiwgVHJpZU5vZGUuVHlwZXMuU0lOR0xFXzE2KSwKKyAgICAgICAgICAgICAgICBQYWlyLm9mKFJhbmdlcy5CSVRTXzE2LCBUcmllTm9kZS5UeXBlcy5TSU5HTEVfMTYpLAorICAgICAgICAgICAgICAgIFBhaXIub2YoUmFuZ2VzLkJJVFNfMjQsIFRyaWVOb2RlLlR5cGVzLkRFTlNFXzI0KSwKKyAgICAgICAgICAgICAgICBQYWlyLm9mKFJhbmdlcy5CSVRTXzMyLCBUcmllTm9kZS5UeXBlcy5ERU5TRV8zMiksCisgICAgICAgICAgICAgICAgUGFpci5vZihSYW5nZXMuQklUU180MCwgVHJpZU5vZGUuVHlwZXMuREVOU0VfNDApLAorICAgICAgICAgICAgICAgIFBhaXIub2YoUmFuZ2VzLkJJVFNfR1Q0MCwgVHJpZU5vZGUuVHlwZXMuTE9OR19ERU5TRSkKKyAgICAgICAgKSkuZmxhdE1hcChwIC0+IGxvbmdzKCkuYmV0d2VlbihwLl8xLm1pbiwgcC5fMS5tYXgpLm1hcCh2IC0+IFBhaXIub2YodiwgcC5fMikpKSkuY2hlY2socCAtPiB7CisgICAgICAgICAgICB3aGVuKHNuLm1heFBvc2l0aW9uRGVsdGEoMCkpLnRoZW5SZXR1cm4oLXAuXzEpOworICAgICAgICAgICAgcmV0dXJuIHAuXzIgPT0gVHJpZU5vZGUudHlwZUZvcihzbiwgMCk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFR5cGVGb3JNb3JlQ2hpbGRyZW5BbmROb1BheWxvYWQoKQorICAgIHsKKyAgICAgICAgd2hlbihzbi5jaGlsZENvdW50KCkpLnRoZW5SZXR1cm4oMik7CisgICAgICAgIHdoZW4oc24ucGF5bG9hZCgpKS50aGVuUmV0dXJuKG51bGwpOworCisgICAgICAgIHF0KCkuZm9yQWxsKEdlbmVyYXRlLnBpY2soQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICBQYWlyLm9mKFJhbmdlcy5CSVRTXzQsIFRyaWVOb2RlLlR5cGVzLkRFTlNFXzEyKSwKKyAgICAgICAgICAgICAgICBQYWlyLm9mKFJhbmdlcy5CSVRTXzgsIFRyaWVOb2RlLlR5cGVzLkRFTlNFXzEyKSwKKyAgICAgICAgICAgICAgICBQYWlyLm9mKFJhbmdlcy5CSVRTXzEyLCBUcmllTm9kZS5UeXBlcy5ERU5TRV8xMiksCisgICAgICAgICAgICAgICAgUGFpci5vZihSYW5nZXMuQklUU18xNiwgVHJpZU5vZGUuVHlwZXMuREVOU0VfMTYpLAorICAgICAgICAgICAgICAgIFBhaXIub2YoUmFuZ2VzLkJJVFNfMjQsIFRyaWVOb2RlLlR5cGVzLkRFTlNFXzI0KSwKKyAgICAgICAgICAgICAgICBQYWlyLm9mKFJhbmdlcy5CSVRTXzMyLCBUcmllTm9kZS5UeXBlcy5ERU5TRV8zMiksCisgICAgICAgICAgICAgICAgUGFpci5vZihSYW5nZXMuQklUU180MCwgVHJpZU5vZGUuVHlwZXMuREVOU0VfNDApLAorICAgICAgICAgICAgICAgIFBhaXIub2YoUmFuZ2VzLkJJVFNfR1Q0MCwgVHJpZU5vZGUuVHlwZXMuTE9OR19ERU5TRSkKKyAgICAgICAgKSkuZmxhdE1hcChwIC0+IGxvbmdzKCkuYmV0d2VlbihwLl8xLm1pbiwgcC5fMS5tYXgpLm1hcCh2IC0+IFBhaXIub2YodiwgcC5fMikpKSkuY2hlY2socCAtPiB7CisgICAgICAgICAgICB3aGVuKHNuLm1heFBvc2l0aW9uRGVsdGEoMCkpLnRoZW5SZXR1cm4oLXAuXzEpOworICAgICAgICAgICAgcmV0dXJuIHAuXzIgPT0gVHJpZU5vZGUudHlwZUZvcihzbiwgMCk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBheWxvYWRPbmx5Tm9kZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgVHJpZU5vZGUuVHlwZXMuUEFZTE9BRF9PTkxZLnNlcmlhbGl6ZShvdXQsIG51bGwsIDEgfCA0LCAwKTsKKyAgICAgICAgb3V0LmZsdXNoKCk7CisKKyAgICAgICAgVHJpZU5vZGUgbm9kZSA9IFRyaWVOb2RlLmF0KG91dC5hc05ld0J1ZmZlcigpLCAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRyaWVOb2RlLlR5cGVzLlBBWUxPQURfT05MWSwgbm9kZSk7CisgICAgICAgIGFzc2VydEVxdWFscygxIHwgNCwgbm9kZS5wYXlsb2FkRmxhZ3Mob3V0LmFzTmV3QnVmZmVyKCksIDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vZGUucGF5bG9hZFBvc2l0aW9uKG91dC5hc05ld0J1ZmZlcigpLCAwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBub2RlLnNpemVvZk5vZGUobnVsbCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG5vZGUuc2VhcmNoKG51bGwsIDAsIDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuTUFYX1ZBTFVFLCBub2RlLnRyYW5zaXRpb25CeXRlKG51bGwsIDAsIDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEyMywgbm9kZS5sZXNzZXJUcmFuc2l0aW9uKG51bGwsIDAsIDAsIDAsIDEyMykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTIzLCBub2RlLmdyZWF0ZXJUcmFuc2l0aW9uKG51bGwsIDAsIDAsIDAsIDEyMykpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG5vZGUubGFzdFRyYW5zaXRpb24obnVsbCwgMCwgMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG5vZGUudHJhbnNpdGlvbihudWxsLCAwLCAwLCAwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBub2RlLnRyYW5zaXRpb25SYW5nZShudWxsLCAwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBub2RlLnRyYW5zaXRpb25EZWx0YShudWxsLCAwLCAwKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVTaW5nbGVOb2RlKGxvbmcgZGVsdGEpCisgICAgeworICAgICAgICB3aGVuKHNuLmNoaWxkQ291bnQoKSkudGhlblJldHVybigxKTsKKyAgICAgICAgd2hlbihzbi50cmFuc2l0aW9uKDApKS50aGVuUmV0dXJuKDEyMyk7CisgICAgICAgIHdoZW4oc24uc2VyaWFsaXplZFBvc2l0aW9uRGVsdGEoMCwgMCkpLnRoZW5SZXR1cm4oZGVsdGEpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzaW5nbGVOb2RlQXNzZXJ0aW9ucyhUcmllTm9kZSBub2RlLCBpbnQgcGF5bG9hZEZsYWdzLCBpbnQgc2l6ZSwgbG9uZyBwb3MpCisgICAgeworICAgICAgICBhc3NlcnRFcXVhbHMocGF5bG9hZEZsYWdzLCBub2RlLnBheWxvYWRGbGFncyhvdXQuYXNOZXdCdWZmZXIoKSwgMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2l6ZSwgbm9kZS5zaXplb2ZOb2RlKG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGUuc2VhcmNoKG91dC5hc05ld0J1ZmZlcigpLCAwLCAxMjMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBub2RlLnNlYXJjaChvdXQuYXNOZXdCdWZmZXIoKSwgMCwgMTIyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMiwgbm9kZS5zZWFyY2gob3V0LmFzTmV3QnVmZmVyKCksIDAsIDEyNCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTIzLCBub2RlLnRyYW5zaXRpb25CeXRlKG91dC5hc05ld0J1ZmZlcigpLCAwLCAwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLk1BWF9WQUxVRSwgbm9kZS50cmFuc2l0aW9uQnl0ZShvdXQuYXNOZXdCdWZmZXIoKSwgMCwgMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCBub2RlLmxlc3NlclRyYW5zaXRpb24ob3V0LmFzTmV3QnVmZmVyKCksIDAsIDEwMCAtIHBvcywgLTIsIDEyMykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjM0LCBub2RlLmdyZWF0ZXJUcmFuc2l0aW9uKG51bGwsIDAsIDAsIDAsIDIzNCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjM0LCBub2RlLmdyZWF0ZXJUcmFuc2l0aW9uKG91dC5hc05ld0J1ZmZlcigpLCAwLCAxMDAgLSBwb3MsIC0yLCAyMzQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgbm9kZS5ncmVhdGVyVHJhbnNpdGlvbihvdXQuYXNOZXdCdWZmZXIoKSwgMCwgMTAwIC0gcG9zLCAtMSwgMjM0KSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMzQsIG5vZGUuZ3JlYXRlclRyYW5zaXRpb24ob3V0LmFzTmV3QnVmZmVyKCksIDAsIDEwMCAtIHBvcywgMCwgMjM0KSk7CisgICAgICAgIGFzc2VydEVxdWFscygxMDAsIG5vZGUubGFzdFRyYW5zaXRpb24ob3V0LmFzTmV3QnVmZmVyKCksIDAsIDEwMCAtIHBvcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCBub2RlLnRyYW5zaXRpb24ob3V0LmFzTmV3QnVmZmVyKCksIDAsIDEwMCAtIHBvcywgMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbm9kZS50cmFuc2l0aW9uUmFuZ2Uob3V0LmFzTmV3QnVmZmVyKCksIDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBvcywgbm9kZS50cmFuc2l0aW9uRGVsdGEob3V0LmFzTmV3QnVmZmVyKCksIDAsIDApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGUxNk5vZGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHByZXBhcmVTaW5nbGVOb2RlKC00MzIxMEwpOworICAgICAgICBUcmllTm9kZS5UeXBlcy5TSU5HTEVfMTYuc2VyaWFsaXplKG91dCwgc24sIDEgfCA0LCAwKTsKKyAgICAgICAgVHJpZU5vZGUgbm9kZSA9IFRyaWVOb2RlLmF0KG91dC5hc05ld0J1ZmZlcigpLCAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRyaWVOb2RlLlR5cGVzLlNJTkdMRV8xNiwgbm9kZSk7CisgICAgICAgIHNpbmdsZU5vZGVBc3NlcnRpb25zKG5vZGUsIDEgfCA0LCA0LCAtNDMyMTApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZU5vUGF5bG9hZDROb2RlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBwcmVwYXJlU2luZ2xlTm9kZSgtN0wpOworICAgICAgICBUcmllTm9kZS5UeXBlcy5TSU5HTEVfTk9QQVlMT0FEXzQuc2VyaWFsaXplKG91dCwgc24sIDAsIDApOworICAgICAgICBUcmllTm9kZSBub2RlID0gVHJpZU5vZGUuYXQob3V0LmFzTmV3QnVmZmVyKCksIDApOworICAgICAgICBhc3NlcnRFcXVhbHMoVHJpZU5vZGUuVHlwZXMuU0lOR0xFX05PUEFZTE9BRF80LCBub2RlKTsKKyAgICAgICAgc2luZ2xlTm9kZUFzc2VydGlvbnMobm9kZSwgMCwgMiwgLTcpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZU5vUGF5bG9hZDEyTm9kZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHJlcGFyZVNpbmdsZU5vZGUoLTEyMzRMKTsKKyAgICAgICAgVHJpZU5vZGUuVHlwZXMuU0lOR0xFX05PUEFZTE9BRF8xMi5zZXJpYWxpemUob3V0LCBzbiwgMCwgMCk7CisgICAgICAgIFRyaWVOb2RlIG5vZGUgPSBUcmllTm9kZS5hdChvdXQuYXNOZXdCdWZmZXIoKSwgMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhUcmllTm9kZS5UeXBlcy5TSU5HTEVfTk9QQVlMT0FEXzEyLCBub2RlKTsKKyAgICAgICAgc2luZ2xlTm9kZUFzc2VydGlvbnMobm9kZSwgMCwgMywgLTEyMzRMKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJlcGFyZVNwYXJzZU5vZGUobG9uZyBkZWx0YSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBvdXQud3JpdGUobmV3IGJ5dGVbNl0pOworICAgICAgICB3aGVuKHNuLmNoaWxkQ291bnQoKSkudGhlblJldHVybigzKTsKKyAgICAgICAgd2hlbihzbi50cmFuc2l0aW9uKDApKS50aGVuUmV0dXJuKDEwKTsKKyAgICAgICAgd2hlbihzbi50cmFuc2l0aW9uKDEpKS50aGVuUmV0dXJuKDIwKTsKKyAgICAgICAgd2hlbihzbi50cmFuc2l0aW9uKDIpKS50aGVuUmV0dXJuKDMwKTsKKyAgICAgICAgd2hlbihzbi5zZXJpYWxpemVkUG9zaXRpb25EZWx0YSgwLCA2KSkudGhlblJldHVybihkZWx0YSk7CisgICAgICAgIHdoZW4oc24uc2VyaWFsaXplZFBvc2l0aW9uRGVsdGEoMSwgNikpLnRoZW5SZXR1cm4oZGVsdGEgKyAyKTsKKyAgICAgICAgd2hlbihzbi5zZXJpYWxpemVkUG9zaXRpb25EZWx0YSgyLCA2KSkudGhlblJldHVybihkZWx0YSArIDQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzcGFyc2VPckRlbnNlTm9kZUFzc2VydGlvbnMoVHJpZU5vZGUgbm9kZSwgaW50IHBheWxvYWRGbGFncywgaW50IHNpemUsIGxvbmcgcG9zKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNpemUsIG5vZGUuc2l6ZW9mTm9kZShzbikpOworICAgICAgICBhc3NlcnRFcXVhbHMocGF5bG9hZEZsYWdzLCBub2RlLnBheWxvYWRGbGFncyhvdXQuYXNOZXdCdWZmZXIoKSwgNikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgbm9kZS50cmFuc2l0aW9uUmFuZ2Uob3V0LmFzTmV3QnVmZmVyKCksIDYpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDYgKyBzaXplLCBub2RlLnBheWxvYWRQb3NpdGlvbihvdXQuYXNOZXdCdWZmZXIoKSwgNikpOworCisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLk1BWF9WQUxVRSwgbm9kZS50cmFuc2l0aW9uQnl0ZShvdXQuYXNOZXdCdWZmZXIoKSwgNiwgMykpOworCisgICAgICAgIGFzc2VydEVxdWFscygxMCwgbm9kZS5sZXNzZXJUcmFuc2l0aW9uKG91dC5hc05ld0J1ZmZlcigpLCA2LCAxMCAtIHBvcywgMSwgMTIzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxNCwgbm9kZS5sZXNzZXJUcmFuc2l0aW9uKG91dC5hc05ld0J1ZmZlcigpLCA2LCAxMCAtIHBvcywgLTQsIDEyMykpOworCisgICAgICAgIGFzc2VydEVxdWFscygxNCwgbm9kZS5ncmVhdGVyVHJhbnNpdGlvbihvdXQuYXNOZXdCdWZmZXIoKSwgNiwgMTAgLSBwb3MsIDEsIDIzNCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjM0LCBub2RlLmdyZWF0ZXJUcmFuc2l0aW9uKG91dC5hc05ld0J1ZmZlcigpLCA2LCAxMCAtIHBvcywgMiwgMjM0KSk7CisgICAgICAgIGFzc2VydEVxdWFscygxMCwgbm9kZS5ncmVhdGVyVHJhbnNpdGlvbihvdXQuYXNOZXdCdWZmZXIoKSwgNiwgMTAgLSBwb3MsIC0xLCAyMzQpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMTQsIG5vZGUubGFzdFRyYW5zaXRpb24ob3V0LmFzTmV3QnVmZmVyKCksIDYsIDEwIC0gcG9zKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBvcywgbm9kZS50cmFuc2l0aW9uRGVsdGEob3V0LmFzTmV3QnVmZmVyKCksIDYsIDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBvcyArIDIsIG5vZGUudHJhbnNpdGlvbkRlbHRhKG91dC5hc05ld0J1ZmZlcigpLCA2LCAxKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhwb3MgKyA0LCBub2RlLnRyYW5zaXRpb25EZWx0YShvdXQuYXNOZXdCdWZmZXIoKSwgNiwgMikpOworCisgICAgICAgIGFzc2VydEVxdWFscygxMCwgbm9kZS50cmFuc2l0aW9uKG91dC5hc05ld0J1ZmZlcigpLCA2LCAxMCAtIHBvcywgMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTIsIG5vZGUudHJhbnNpdGlvbihvdXQuYXNOZXdCdWZmZXIoKSwgNiwgMTAgLSBwb3MsIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE0LCBub2RlLnRyYW5zaXRpb24ob3V0LmFzTmV3QnVmZmVyKCksIDYsIDEwIC0gcG9zLCAyKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNwYXJzZU5vZGVBc3NlcnRpb25zKFRyaWVOb2RlIG5vZGUsIGludCBwYXlsb2FkRmxhZ3MsIGludCBzaXplLCBsb25nIHBvcykKKyAgICB7CisgICAgICAgIHNwYXJzZU9yRGVuc2VOb2RlQXNzZXJ0aW9ucyhub2RlLCBwYXlsb2FkRmxhZ3MsIHNpemUsIHBvcyk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgbm9kZS5zZWFyY2gob3V0LmFzTmV3QnVmZmVyKCksIDYsIDUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGUuc2VhcmNoKG91dC5hc05ld0J1ZmZlcigpLCA2LCAxMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTIsIG5vZGUuc2VhcmNoKG91dC5hc05ld0J1ZmZlcigpLCA2LCAxNSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTQsIG5vZGUuc2VhcmNoKG91dC5hc05ld0J1ZmZlcigpLCA2LCAzNSkpOworCisgICAgICAgIGFzc2VydEVxdWFscygxMCwgbm9kZS50cmFuc2l0aW9uQnl0ZShvdXQuYXNOZXdCdWZmZXIoKSwgNiwgMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAsIG5vZGUudHJhbnNpdGlvbkJ5dGUob3V0LmFzTmV3QnVmZmVyKCksIDYsIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMwLCBub2RlLnRyYW5zaXRpb25CeXRlKG91dC5hc05ld0J1ZmZlcigpLCA2LCAyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3BhcnNlMTZOb2RlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBwcmVwYXJlU3BhcnNlTm9kZSgtNDMyMTBMKTsKKyAgICAgICAgVHJpZU5vZGUuVHlwZXMuU1BBUlNFXzE2LnNlcmlhbGl6ZShvdXQsIHNuLCAxIHwgNCwgNik7CisgICAgICAgIFRyaWVOb2RlIG5vZGUgPSBUcmllTm9kZS5hdChvdXQuYXNOZXdCdWZmZXIoKSwgNik7CisgICAgICAgIGFzc2VydEVxdWFscyhUcmllTm9kZS5UeXBlcy5TUEFSU0VfMTYsIG5vZGUpOworICAgICAgICBzcGFyc2VOb2RlQXNzZXJ0aW9ucyhub2RlLCAxIHwgNCwgMTEsIC00MzIxMEwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNwYXJzZTEyTm9kZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHJlcGFyZVNwYXJzZU5vZGUoLTEyMzRMKTsKKyAgICAgICAgVHJpZU5vZGUuVHlwZXMuU1BBUlNFXzEyLnNlcmlhbGl6ZShvdXQsIHNuLCAxIHwgNCwgNik7CisgICAgICAgIFRyaWVOb2RlIG5vZGUgPSBUcmllTm9kZS5hdChvdXQuYXNOZXdCdWZmZXIoKSwgNik7CisgICAgICAgIGFzc2VydEVxdWFscyhUcmllTm9kZS5UeXBlcy5TUEFSU0VfMTIsIG5vZGUpOworICAgICAgICBzcGFyc2VOb2RlQXNzZXJ0aW9ucyhub2RlLCAxIHwgNCwgMTAsIC0xMjM0TCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVEZW5zZU5vZGUobG9uZyBkZWx0YSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBvdXQud3JpdGUobmV3IGJ5dGVbNl0pOworICAgICAgICB3aGVuKHNuLmNoaWxkQ291bnQoKSkudGhlblJldHVybigzKTsKKyAgICAgICAgd2hlbihzbi50cmFuc2l0aW9uKDApKS50aGVuUmV0dXJuKDExKTsKKyAgICAgICAgd2hlbihzbi50cmFuc2l0aW9uKDEpKS50aGVuUmV0dXJuKDEyKTsKKyAgICAgICAgd2hlbihzbi50cmFuc2l0aW9uKDIpKS50aGVuUmV0dXJuKDEzKTsKKyAgICAgICAgd2hlbihzbi5zZXJpYWxpemVkUG9zaXRpb25EZWx0YSgwLCA2KSkudGhlblJldHVybihkZWx0YSk7CisgICAgICAgIHdoZW4oc24uc2VyaWFsaXplZFBvc2l0aW9uRGVsdGEoMSwgNikpLnRoZW5SZXR1cm4oZGVsdGEgKyAyKTsKKyAgICAgICAgd2hlbihzbi5zZXJpYWxpemVkUG9zaXRpb25EZWx0YSgyLCA2KSkudGhlblJldHVybihkZWx0YSArIDQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZW5zZU5vZGVBc3NlcnRpb25zKFRyaWVOb2RlIG5vZGUsIGludCBwYXlsb2FkLCBpbnQgc2l6ZSwgbG9uZyBwb3MpCisgICAgeworICAgICAgICBzcGFyc2VPckRlbnNlTm9kZUFzc2VydGlvbnMobm9kZSwgcGF5bG9hZCwgc2l6ZSwgcG9zKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBub2RlLnNlYXJjaChvdXQuYXNOZXdCdWZmZXIoKSwgNiwgMTApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGUuc2VhcmNoKG91dC5hc05ld0J1ZmZlcigpLCA2LCAxMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTQsIG5vZGUuc2VhcmNoKG91dC5hc05ld0J1ZmZlcigpLCA2LCAxNCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygxMSwgbm9kZS50cmFuc2l0aW9uQnl0ZShvdXQuYXNOZXdCdWZmZXIoKSwgNiwgMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTIsIG5vZGUudHJhbnNpdGlvbkJ5dGUob3V0LmFzTmV3QnVmZmVyKCksIDYsIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEzLCBub2RlLnRyYW5zaXRpb25CeXRlKG91dC5hc05ld0J1ZmZlcigpLCA2LCAyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVuc2UxNk5vZGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHByZXBhcmVEZW5zZU5vZGUoLTQzMjEwTCk7CisgICAgICAgIFRyaWVOb2RlLlR5cGVzLkRFTlNFXzE2LnNlcmlhbGl6ZShvdXQsIHNuLCAxIHwgNCwgNik7CisgICAgICAgIFRyaWVOb2RlIG5vZGUgPSBUcmllTm9kZS5hdChvdXQuYXNOZXdCdWZmZXIoKSwgNik7CisgICAgICAgIGFzc2VydEVxdWFscyhUcmllTm9kZS5UeXBlcy5ERU5TRV8xNiwgbm9kZSk7CisgICAgICAgIGRlbnNlTm9kZUFzc2VydGlvbnMobm9kZSwgMSB8IDQsIDksIC00MzIxMEwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlbnNlMTJOb2RlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBwcmVwYXJlRGVuc2VOb2RlKC0xMjM0TCk7CisgICAgICAgIFRyaWVOb2RlLlR5cGVzLkRFTlNFXzEyLnNlcmlhbGl6ZShvdXQsIHNuLCAxIHwgNCwgNik7CisgICAgICAgIFRyaWVOb2RlIG5vZGUgPSBUcmllTm9kZS5hdChvdXQuYXNOZXdCdWZmZXIoKSwgNik7CisgICAgICAgIGFzc2VydEVxdWFscyhUcmllTm9kZS5UeXBlcy5ERU5TRV8xMiwgbm9kZSk7CisgICAgICAgIGRlbnNlTm9kZUFzc2VydGlvbnMobm9kZSwgMSB8IDQsIDgsIC0xMjM0TCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9uZ0RlbnNlTm9kZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHJlcGFyZURlbnNlTm9kZSgtMHg3ZmZmZmZmZmZmZmZmZmZMKTsKKyAgICAgICAgVHJpZU5vZGUuVHlwZXMuTE9OR19ERU5TRS5zZXJpYWxpemUob3V0LCBzbiwgMSB8IDQsIDYpOworICAgICAgICBUcmllTm9kZSBub2RlID0gVHJpZU5vZGUuYXQob3V0LmFzTmV3QnVmZmVyKCksIDYpOworICAgICAgICBhc3NlcnRFcXVhbHMoVHJpZU5vZGUuVHlwZXMuTE9OR19ERU5TRSwgbm9kZSk7CisgICAgICAgIGRlbnNlTm9kZUFzc2VydGlvbnMobm9kZSwgMSB8IDQsIDI3LCAtMHg3ZmZmZmZmZmZmZmZmZmZMKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGVudW0gUmFuZ2VzCisgICAgeworICAgICAgICBCSVRTXzQoMHgxTCwgMHhmTCksCisgICAgICAgIEJJVFNfOCgweDEwTCwgMHhmZkwpLAorICAgICAgICBCSVRTXzEyKDB4MTAwTCwgMHhmZmZMKSwKKyAgICAgICAgQklUU18xNigweDEwMDBMLCAweGZmZmZMKSwKKyAgICAgICAgQklUU18yNCgweDEwMDAwMEwsIDB4ZmZmZmZmTCksCisgICAgICAgIEJJVFNfMzIoMHgxMDAwMDAwMEwsIDB4ZmZmZmZmZmZMKSwKKyAgICAgICAgQklUU180MCgweDEwMDAwMDAwMDBMLCAweGZmZmZmZmZmZmZMKSwKKyAgICAgICAgQklUU19HVDQwKDB4MTAwMDAwMDAwMDAwTCwgMHg3ZmZmZmZmZmZmZmZmZmZmTCk7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1pbiwgbWF4OworCisgICAgICAgIFJhbmdlcyhsb25nIG1pbiwgbG9uZyBtYXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubWluID0gbWluOworICAgICAgICAgICAgdGhpcy5tYXggPSBtYXg7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL1dhbGtlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9XYWxrZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkNmMyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9XYWxrZXJUZXN0LmphdmEKQEAgLTAsMCArMSwzMTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udHJpZXM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Mb25nU3VwcGxpZXI7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkxvbmdUb0ludEZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uSW50U3RyZWFtOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFncm9uYS5jb2xsZWN0aW9ucy5JbnRBcnJheUxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmVidWZmZXJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlRhaWxPdmVycmlkaW5nUmVidWZmZXJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKKworQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCitwdWJsaWMgY2xhc3MgV2Fsa2VyVGVzdCBleHRlbmRzIEFic3RyYWN0VHJpZVRlc3RCYXNlCit7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2Fsa2VyKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhT3V0cHV0QnVmZmVyIGJ1ZiA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyUGFnZWQoKTsKKyAgICAgICAgSW5jcmVtZW50YWxUcmllV3JpdGVyPEludGVnZXI+IGJ1aWxkZXIgPSBtYWtlVHJpZShidWYpOworICAgICAgICBsb25nIHJvb3RQb3MgPSBidWlsZGVyLmNvbXBsZXRlKCk7CisKKyAgICAgICAgUmVidWZmZXJlciBzb3VyY2UgPSBuZXcgQnl0ZUJ1ZlJlYnVmZmVyZXIoYnVmLmFzTmV3QnVmZmVyKCkpOworCisgICAgICAgIFdhbGtlcjw/PiBpdCA9IG5ldyBXYWxrZXI8Pihzb3VyY2UsIHJvb3RQb3MpOworCisgICAgICAgIERhdGFPdXRwdXRCdWZmZXIgZHVtcEJ1ZiA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKCk7CisgICAgICAgIGl0LmR1bXBUcmllKG5ldyBQcmludFN0cmVhbShkdW1wQnVmKSwgKGJ1ZjEsIHBheWxvYWRQb3MsIHBheWxvYWRGbGFncykgLT4gU3RyaW5nLmZvcm1hdCgiJWQvJWQiLCBwYXlsb2FkUG9zLCBwYXlsb2FkRmxhZ3MpKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oIlRyaWUgZHVtcDogXG57fSIsIG5ldyBTdHJpbmcoZHVtcEJ1Zi5nZXREYXRhKCkpKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oIlRyaWUgdG9TdHJpbmc6IHt9IiwgaXQpOworCisgICAgICAgIGl0LmdvTWF4KHJvb3RQb3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTIsIGl0LnBheWxvYWRGbGFncygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRyaWVOb2RlLlR5cGVzLlBBWUxPQURfT05MWS5vcmRpbmFsLCBpdC5ub2RlVHlwZU9yZGluYWwoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpdC5ub2RlU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaXQuaGFzQ2hpbGRyZW4oKSk7CisKKyAgICAgICAgaXQuZ29NaW4ocm9vdFBvcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpdC5wYXlsb2FkRmxhZ3MoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhUcmllTm9kZS5UeXBlcy5QQVlMT0FEX09OTFkub3JkaW5hbCwgaXQubm9kZVR5cGVPcmRpbmFsKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaXQubm9kZVNpemUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGl0Lmhhc0NoaWxkcmVuKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygtMSwgaXQuZm9sbG93KHNvdXJjZSgiMTUxIikpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGl0LnBheWxvYWRGbGFncygpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoJzMnLCBpdC5mb2xsb3coc291cmNlKCIxMzUiKSkpOworCisgICAgICAgIGFzc2VydEVxdWFscygnMycsIGl0LmZvbGxvd1dpdGhHcmVhdGVyKHNvdXJjZSgiMTM1IikpKTsKKyAgICAgICAgaXQuZ29NaW4oaXQuZ3JlYXRlckJyYW5jaCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBpdC5wYXlsb2FkRmxhZ3MoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCczJywgaXQuZm9sbG93V2l0aExlc3Nlcihzb3VyY2UoIjEzNSIpKSk7CisgICAgICAgIGl0LmdvTWF4KGl0Lmxlc3NlckJyYW5jaCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpdC5wYXlsb2FkRmxhZ3MoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIChPYmplY3QpIGl0LnByZWZpeChzb3VyY2UoIjE1NSIpLCAod2Fsa2VyLCBwYXlsb2FkUG9zaXRpb24sIHBheWxvYWRGbGFncykgLT4gcGF5bG9hZEZsYWdzKSk7CisgICAgICAgIGFzc2VydE51bGwoaXQucHJlZml4KHNvdXJjZSgiNTE2IiksICh3YWxrZXIsIHBheWxvYWRQb3NpdGlvbiwgcGF5bG9hZEZsYWdzKSAtPiBwYXlsb2FkRmxhZ3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIChPYmplY3QpIGl0LnByZWZpeChzb3VyY2UoIjUxNTEiKSwgKHdhbGtlciwgcGF5bG9hZFBvc2l0aW9uLCBwYXlsb2FkRmxhZ3MpIC0+IHBheWxvYWRGbGFncykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgKE9iamVjdCkgaXQucHJlZml4KHNvdXJjZSgiMTE1MSIpLCAod2Fsa2VyLCBwYXlsb2FkUG9zaXRpb24sIHBheWxvYWRGbGFncykgLT4gcGF5bG9hZEZsYWdzKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIChPYmplY3QpIGl0LnByZWZpeEFuZE5laWdoYm91cnMoc291cmNlKCIxNTUiKSwgKHdhbGtlciwgcGF5bG9hZFBvc2l0aW9uLCBwYXlsb2FkRmxhZ3MpIC0+IHBheWxvYWRGbGFncykpOworICAgICAgICBhc3NlcnROdWxsKGl0LnByZWZpeEFuZE5laWdoYm91cnMoc291cmNlKCI1MTYiKSwgKHdhbGtlciwgcGF5bG9hZFBvc2l0aW9uLCBwYXlsb2FkRmxhZ3MpIC0+IHBheWxvYWRGbGFncykpOworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgKE9iamVjdCkgaXQucHJlZml4QW5kTmVpZ2hib3Vycyhzb3VyY2UoIjUxNTEiKSwgKHdhbGtlciwgcGF5bG9hZFBvc2l0aW9uLCBwYXlsb2FkRmxhZ3MpIC0+IHBheWxvYWRGbGFncykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgKE9iamVjdCkgaXQucHJlZml4QW5kTmVpZ2hib3Vycyhzb3VyY2UoIjExNTEiKSwgKHdhbGtlciwgcGF5bG9hZFBvc2l0aW9uLCBwYXlsb2FkRmxhZ3MpIC0+IHBheWxvYWRGbGFncykpOworCisgICAgICAgIGFzc2VydEVxdWFscygzLCAoT2JqZWN0KSBpdC5wcmVmaXhBbmROZWlnaGJvdXJzKHNvdXJjZSgiMTU1NSIpLCAod2Fsa2VyLCBwYXlsb2FkUG9zaXRpb24sIHBheWxvYWRGbGFncykgLT4gcGF5bG9hZEZsYWdzKSk7CisgICAgICAgIGl0LmdvTWF4KGl0Lmxlc3NlckJyYW5jaCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBpdC5wYXlsb2FkRmxhZ3MoKSk7CisgICAgICAgIGl0LmdvTWluKGl0LmdyZWF0ZXJCcmFuY2gpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgaXQucGF5bG9hZEZsYWdzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yV2l0aG91dEJvdW5kcygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRGF0YU91dHB1dEJ1ZmZlciBidWYgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlclBhZ2VkKCk7CisgICAgICAgIEluY3JlbWVudGFsVHJpZVdyaXRlcjxJbnRlZ2VyPiBidWlsZGVyID0gbWFrZVRyaWUoYnVmKTsKKyAgICAgICAgbG9uZyByb290UG9zID0gYnVpbGRlci5jb21wbGV0ZSgpOworCisgICAgICAgIGludFtdIGV4cGVjdGVkID0gSW50U3RyZWFtLnJhbmdlKDEsIDEzKS50b0FycmF5KCk7CisgICAgICAgIGNoZWNrSXRlcmF0ZXMoYnVmLmFzTmV3QnVmZmVyKCksIHJvb3RQb3MsIGV4cGVjdGVkKTsKKworICAgICAgICBjaGVja0l0ZXJhdGVzKGJ1Zi5hc05ld0J1ZmZlcigpLCByb290UG9zLCBudWxsLCBudWxsLCBmYWxzZSwgZXhwZWN0ZWQpOworICAgICAgICBjaGVja0l0ZXJhdGVzKGJ1Zi5hc05ld0J1ZmZlcigpLCByb290UG9zLCBudWxsLCBudWxsLCB0cnVlLCBleHBlY3RlZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3JXaXRoQm91bmRzKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhT3V0cHV0QnVmZmVyIGJ1ZiA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyUGFnZWQoKTsKKyAgICAgICAgSW5jcmVtZW50YWxUcmllV3JpdGVyPEludGVnZXI+IGJ1aWxkZXIgPSBtYWtlVHJpZShidWYpOworICAgICAgICBsb25nIHJvb3RQb3MgPSBidWlsZGVyLmNvbXBsZXRlKCk7CisKKyAgICAgICAgY2hlY2tJdGVyYXRlcyhidWYuYXNOZXdCdWZmZXIoKSwgcm9vdFBvcywgIjE1MSIsICI1MTUiLCBmYWxzZSwgMywgNCwgNSk7CisgICAgICAgIGNoZWNrSXRlcmF0ZXMoYnVmLmFzTmV3QnVmZmVyKCksIHJvb3RQb3MsICIxNTE1MSIsICI1MTUxNSIsIGZhbHNlLCAzLCA0LCA1KTsKKyAgICAgICAgY2hlY2tJdGVyYXRlcyhidWYuYXNOZXdCdWZmZXIoKSwgcm9vdFBvcywgIjcwNSIsICI3MyIsIGZhbHNlLCA5LCAxMCwgMTEpOworICAgICAgICBjaGVja0l0ZXJhdGVzKGJ1Zi5hc05ld0J1ZmZlcigpLCByb290UG9zLCAiNzA1MSIsICI3MzUiLCBmYWxzZSwgMTAsIDExKTsKKyAgICAgICAgY2hlY2tJdGVyYXRlcyhidWYuYXNOZXdCdWZmZXIoKSwgcm9vdFBvcywgIjcwIiwgIjczNyIsIGZhbHNlLCA5LCAxMCwgMTEsIDEyKTsKKyAgICAgICAgY2hlY2tJdGVyYXRlcyhidWYuYXNOZXdCdWZmZXIoKSwgcm9vdFBvcywgIjcwNTQiLCAiNzM1IiwgZmFsc2UsIDEwLCAxMSk7CisKKyAgICAgICAgY2hlY2tJdGVyYXRlcyhidWYuYXNOZXdCdWZmZXIoKSwgcm9vdFBvcywgbnVsbCwgIjUxNSIsIGZhbHNlLCAxLCAyLCAzLCA0LCA1KTsKKyAgICAgICAgY2hlY2tJdGVyYXRlcyhidWYuYXNOZXdCdWZmZXIoKSwgcm9vdFBvcywgbnVsbCwgIjUxNTE1IiwgZmFsc2UsIDEsIDIsIDMsIDQsIDUpOworICAgICAgICBjaGVja0l0ZXJhdGVzKGJ1Zi5hc05ld0J1ZmZlcigpLCByb290UG9zLCAiMTUxIiwgbnVsbCwgZmFsc2UsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIpOworICAgICAgICBjaGVja0l0ZXJhdGVzKGJ1Zi5hc05ld0J1ZmZlcigpLCByb290UG9zLCAiMTUxNTEiLCBudWxsLCBmYWxzZSwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3JXaXRoQm91bmRzQW5kQWRtaXRQcmVmaXgoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIERhdGFPdXRwdXRCdWZmZXIgYnVmID0gbmV3IERhdGFPdXRwdXRCdWZmZXJQYWdlZCgpOworICAgICAgICBJbmNyZW1lbnRhbFRyaWVXcml0ZXI8SW50ZWdlcj4gYnVpbGRlciA9IG1ha2VUcmllKGJ1Zik7CisgICAgICAgIGxvbmcgcm9vdFBvcyA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKworICAgICAgICBjaGVja0l0ZXJhdGVzKGJ1Zi5hc05ld0J1ZmZlcigpLCByb290UG9zLCAiMTUxIiwgIjUxNSIsIHRydWUsIDIsIDMsIDQsIDUpOworICAgICAgICBjaGVja0l0ZXJhdGVzKGJ1Zi5hc05ld0J1ZmZlcigpLCByb290UG9zLCAiMTUxNTEiLCAiNTE1MTUiLCB0cnVlLCAyLCAzLCA0LCA1KTsKKyAgICAgICAgY2hlY2tJdGVyYXRlcyhidWYuYXNOZXdCdWZmZXIoKSwgcm9vdFBvcywgIjcwNSIsICI3MyIsIHRydWUsIDgsIDksIDEwLCAxMSk7CisgICAgICAgIGNoZWNrSXRlcmF0ZXMoYnVmLmFzTmV3QnVmZmVyKCksIHJvb3RQb3MsICI3MDUxIiwgIjczNSIsIHRydWUsIDksIDEwLCAxMSk7CisgICAgICAgIGNoZWNrSXRlcmF0ZXMoYnVmLmFzTmV3QnVmZmVyKCksIHJvb3RQb3MsICI3MCIsICI3MzciLCB0cnVlLCA4LCA5LCAxMCwgMTEsIDEyKTsKKyAgICAgICAgLy8gTm90ZTogNzA1NCBoYXMgNzAgYXMgcHJlZml4LCBidXQgd2UgZG9uJ3QgaW5jbHVkZSA3MCBiZWNhdXNlIGEgY2xlYXJseSBzbWFsbGVyIG5vbi1wcmVmaXggZW50cnkgNzA1MQorICAgICAgICAvLyBleGlzdHMgYmV0d2VlbiB0aGUgYm91bmQgYW5kIHRoZSBwcmVmaXgKKyAgICAgICAgY2hlY2tJdGVyYXRlcyhidWYuYXNOZXdCdWZmZXIoKSwgcm9vdFBvcywgIjcwNTQiLCAiNzM1IiwgdHJ1ZSwgMTAsIDExKTsKKworCisgICAgICAgIGNoZWNrSXRlcmF0ZXMoYnVmLmFzTmV3QnVmZmVyKCksIHJvb3RQb3MsIG51bGwsICI1MTUiLCB0cnVlLCAxLCAyLCAzLCA0LCA1KTsKKyAgICAgICAgY2hlY2tJdGVyYXRlcyhidWYuYXNOZXdCdWZmZXIoKSwgcm9vdFBvcywgbnVsbCwgIjUxNTE1IiwgdHJ1ZSwgMSwgMiwgMywgNCwgNSk7CisgICAgICAgIGNoZWNrSXRlcmF0ZXMoYnVmLmFzTmV3QnVmZmVyKCksIHJvb3RQb3MsICIxNTEiLCBudWxsLCB0cnVlLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyKTsKKyAgICAgICAgY2hlY2tJdGVyYXRlcyhidWYuYXNOZXdCdWZmZXIoKSwgcm9vdFBvcywgIjE1MTUxIiwgbnVsbCwgdHJ1ZSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMik7CisgICAgICAgIGNoZWNrSXRlcmF0ZXMoYnVmLmFzTmV3QnVmZmVyKCksIHJvb3RQb3MsICI3MDU0IiwgbnVsbCwgdHJ1ZSwgMTAsIDExLCAxMik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrSXRlcmF0ZXMoQnl0ZUJ1ZmZlciBidWZmZXIsIGxvbmcgcm9vdFBvcywgU3RyaW5nIGZyb20sIFN0cmluZyB0bywgYm9vbGVhbiBhZG1pdFByZWZpeCwgaW50Li4uIGV4cGVjdGVkKQorICAgIHsKKyAgICAgICAgUmVidWZmZXJlciBzb3VyY2UgPSBuZXcgQnl0ZUJ1ZlJlYnVmZmVyZXIoYnVmZmVyKTsKKyAgICAgICAgVmFsdWVJdGVyYXRvcjw/PiBpdCA9IG5ldyBWYWx1ZUl0ZXJhdG9yPD4oc291cmNlLCByb290UG9zLCBzb3VyY2UoZnJvbSksIHNvdXJjZSh0byksIGFkbWl0UHJlZml4KTsKKyAgICAgICAgY2hlY2tSZXR1cm5zKGZyb20gKyAiLS0+IiArIHRvLCBpdDo6bmV4dFBheWxvYWRlZE5vZGUsIHBvcyAtPiBnZXRQYXlsb2FkRmxhZ3MoYnVmZmVyLCAoaW50KSBwb3MpLCBleHBlY3RlZCk7CisKKyAgICAgICAgUmV2ZXJzZVZhbHVlSXRlcmF0b3I8Pz4gcml0ID0gbmV3IFJldmVyc2VWYWx1ZUl0ZXJhdG9yPD4oc291cmNlLCByb290UG9zLCBzb3VyY2UoZnJvbSksIHNvdXJjZSh0byksIGFkbWl0UHJlZml4KTsKKyAgICAgICAgcmV2ZXJzZShleHBlY3RlZCk7CisgICAgICAgIGNoZWNrUmV0dXJucyhmcm9tICsgIjwtLSIgKyB0bywgcml0OjpuZXh0UGF5bG9hZGVkTm9kZSwgcG9zIC0+IGdldFBheWxvYWRGbGFncyhidWZmZXIsIChpbnQpIHBvcyksIGV4cGVjdGVkKTsKKyAgICAgICAgcmV2ZXJzZShleHBlY3RlZCk7ICAvLyByZXR1cm4gYXJyYXkgaW4gaXRzIG9yaWdpbmFsIGZvcm0gaWYgcmV1c2VkCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrSXRlcmF0ZXMoQnl0ZUJ1ZmZlciBidWZmZXIsIGxvbmcgcm9vdFBvcywgaW50Li4uIGV4cGVjdGVkKQorICAgIHsKKyAgICAgICAgUmVidWZmZXJlciBzb3VyY2UgPSBuZXcgQnl0ZUJ1ZlJlYnVmZmVyZXIoYnVmZmVyKTsKKyAgICAgICAgVmFsdWVJdGVyYXRvcjw/PiBpdCA9IG5ldyBWYWx1ZUl0ZXJhdG9yPD4oc291cmNlLCByb290UG9zKTsKKyAgICAgICAgY2hlY2tSZXR1cm5zKCJGb3J3YXJkIiwgaXQ6Om5leHRQYXlsb2FkZWROb2RlLCBwb3MgLT4gZ2V0UGF5bG9hZEZsYWdzKGJ1ZmZlciwgKGludCkgcG9zKSwgZXhwZWN0ZWQpOworCisgICAgICAgIFJldmVyc2VWYWx1ZUl0ZXJhdG9yPD8+IHJpdCA9IG5ldyBSZXZlcnNlVmFsdWVJdGVyYXRvcjw+KHNvdXJjZSwgcm9vdFBvcyk7CisgICAgICAgIHJldmVyc2UoZXhwZWN0ZWQpOworICAgICAgICBjaGVja1JldHVybnMoIlJldmVyc2UiLCByaXQ6Om5leHRQYXlsb2FkZWROb2RlLCBwb3MgLT4gZ2V0UGF5bG9hZEZsYWdzKGJ1ZmZlciwgKGludCkgcG9zKSwgZXhwZWN0ZWQpOworICAgICAgICByZXZlcnNlKGV4cGVjdGVkKTsgIC8vIHJldHVybiBhcnJheSBpbiBpdHMgb3JpZ2luYWwgZm9ybSBpZiByZXVzZWQKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmV2ZXJzZShpbnRbXSBleHBlY3RlZCkKKyAgICB7CisgICAgICAgIGZpbmFsIGludCBzaXplID0gZXhwZWN0ZWQubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemUgLyAyOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB0ID0gZXhwZWN0ZWRbaV07CisgICAgICAgICAgICBleHBlY3RlZFtpXSA9IGV4cGVjdGVkW3NpemUgLSAxIC0gaV07CisgICAgICAgICAgICBleHBlY3RlZFtzaXplIC0gaSAtIDFdID0gdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldFBheWxvYWRGbGFncyhCeXRlQnVmZmVyIGJ1ZmZlciwgaW50IHBvcykKKyAgICB7CisgICAgICAgIHJldHVybiBUcmllTm9kZS5hdChidWZmZXIsIHBvcykucGF5bG9hZEZsYWdzKGJ1ZmZlciwgcG9zKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tSZXR1cm5zKFN0cmluZyB0ZXN0Q2FzZSwgTG9uZ1N1cHBsaWVyIHN1cHBsaWVyLCBMb25nVG9JbnRGdW5jdGlvbiBtYXBwZXIsIGludC4uLiBleHBlY3RlZCkKKyAgICB7CisgICAgICAgIEludEFycmF5TGlzdCBsaXN0ID0gbmV3IEludEFycmF5TGlzdCgpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBwb3MgPSBzdXBwbGllci5nZXRBc0xvbmcoKTsKKyAgICAgICAgICAgIGlmIChwb3MgPT0gV2Fsa2VyLk5PTkUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBsaXN0LmFkZChtYXBwZXIuYXBwbHlBc0ludChwb3MpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRBcnJheUVxdWFscyh0ZXN0Q2FzZSArICI6ICIgKyBsaXN0ICsgIiAhPSAiICsgQXJyYXlzLnRvU3RyaW5nKGV4cGVjdGVkKSwgZXhwZWN0ZWQsIGxpc3QudG9JbnRBcnJheSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJ0aWFsVGFpbCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRGF0YU91dHB1dEJ1ZmZlciBidWYgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlclBhZ2VkKCk7CisgICAgICAgIEluY3JlbWVudGFsVHJpZVdyaXRlcjxJbnRlZ2VyPiBidWlsZGVyID0gbWFrZVRyaWUoYnVmKTsKKyAgICAgICAgSW5jcmVtZW50YWxUcmllV3JpdGVyLlBhcnRpYWxUYWlsIHB0YWlsID0gYnVpbGRlci5tYWtlUGFydGlhbFJvb3QoKTsKKyAgICAgICAgbG9uZyByb290UG9zID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICB0cnkgKFJlYnVmZmVyZXIgc291cmNlID0gbmV3IEJ5dGVCdWZSZWJ1ZmZlcmVyKGJ1Zi5hc05ld0J1ZmZlcigpKTsKKyAgICAgICAgICAgICBSZWJ1ZmZlcmVyIHBhcnRpYWxTb3VyY2UgPSBuZXcgVGFpbE92ZXJyaWRpbmdSZWJ1ZmZlcmVyKG5ldyBCeXRlQnVmUmVidWZmZXJlcihidWYuYXNOZXdCdWZmZXIoKSksIHB0YWlsLmN1dG9mZigpLCBwdGFpbC50YWlsKCkpOworICAgICAgICAgICAgIFZhbHVlSXRlcmF0b3I8Pz4gaXQgPSBuZXcgVmFsdWVJdGVyYXRvcjw+KG5ldyBCeXRlQnVmUmVidWZmZXJlcihidWYuYXNOZXdCdWZmZXIoKSksIHJvb3RQb3MsIHNvdXJjZSgiMTUxIiksIHNvdXJjZSgiNTE1IiksIHRydWUpOworICAgICAgICAgICAgIFZhbHVlSXRlcmF0b3I8Pz4gdGFpbEl0ID0gbmV3IFZhbHVlSXRlcmF0b3I8PihuZXcgVGFpbE92ZXJyaWRpbmdSZWJ1ZmZlcmVyKG5ldyBCeXRlQnVmUmVidWZmZXJlcihidWYuYXNOZXdCdWZmZXIoKSksIHB0YWlsLmN1dG9mZigpLCBwdGFpbC50YWlsKCkpLCBwdGFpbC5yb290KCksIHNvdXJjZSgiMTUxIiksIHNvdXJjZSgiNTE1IiksIHRydWUpKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIGkxID0gaXQubmV4dFBheWxvYWRlZE5vZGUoKTsKKyAgICAgICAgICAgICAgICBsb25nIGkyID0gdGFpbEl0Lm5leHRQYXlsb2FkZWROb2RlKCk7CisgICAgICAgICAgICAgICAgaWYgKGkxID09IC0xIHx8IGkyID09IC0xKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIFJlYnVmZmVyZXIuQnVmZmVySG9sZGVyIGJoMSA9IHNvdXJjZS5yZWJ1ZmZlcihpMSk7CisgICAgICAgICAgICAgICAgUmVidWZmZXJlci5CdWZmZXJIb2xkZXIgYmgyID0gcGFydGlhbFNvdXJjZS5yZWJ1ZmZlcihpMik7CisKKyAgICAgICAgICAgICAgICBpbnQgZjEgPSBUcmllTm9kZS5hdChiaDEuYnVmZmVyKCksIChpbnQpIChpMSAtIGJoMS5vZmZzZXQoKSkpLnBheWxvYWRGbGFncyhiaDEuYnVmZmVyKCksIChpbnQpIChpMSAtIGJoMS5vZmZzZXQoKSkpOworICAgICAgICAgICAgICAgIGludCBmMiA9IFRyaWVOb2RlLmF0KGJoMi5idWZmZXIoKSwgKGludCkgKGkyIC0gYmgyLm9mZnNldCgpKSkucGF5bG9hZEZsYWdzKGJoMi5idWZmZXIoKSwgKGludCkgKGkyIC0gYmgyLm9mZnNldCgpKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGYxLCBmMik7CisKKyAgICAgICAgICAgICAgICBiaDIucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIGJoMS5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCaWdUcmllKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhT3V0cHV0QnVmZmVyIGJ1ZiA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyUGFnZWQoKTsKKyAgICAgICAgSW5jcmVtZW50YWxUcmllV3JpdGVyPEludGVnZXI+IGJ1aWxkZXIgPSBuZXdUcmllV3JpdGVyKHNlcmlhbGl6ZXIsIGJ1Zik7CisgICAgICAgIHBheWxvYWRTaXplID0gMDsKKyAgICAgICAgbWFrZUJpZ1RyaWUoYnVpbGRlcik7CisgICAgICAgIGJ1aWxkZXIucmVzZXQoKTsKKyAgICAgICAgcGF5bG9hZFNpemUgPSAyMDA7CisgICAgICAgIG1ha2VCaWdUcmllKGJ1aWxkZXIpOworCisgICAgICAgIGxvbmcgcm9vdFBvcyA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgUmVidWZmZXJlciBzb3VyY2UgPSBuZXcgQnl0ZUJ1ZlJlYnVmZmVyZXIoYnVmLmFzTmV3QnVmZmVyKCkpOworICAgICAgICBWYWx1ZUl0ZXJhdG9yPD8+IGl0ID0gbmV3IFZhbHVlSXRlcmF0b3I8Pihzb3VyY2UsIHJvb3RQb3MpOworCisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGkxID0gaXQubmV4dFBheWxvYWRlZE5vZGUoKTsKKyAgICAgICAgICAgIGlmIChpMSA9PSAtMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgVHJpZU5vZGUgbm9kZSA9IFRyaWVOb2RlLmF0KGJ1Zi5hc05ld0J1ZmZlcigpLCAoaW50KSBpMSk7CisgICAgICAgICAgICBhc3NlcnROb3RFcXVhbHMoMCwgbm9kZS5wYXlsb2FkRmxhZ3MoYnVmLmFzTmV3QnVmZmVyKCksIChpbnQpIGkxKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByaXZhdGUgSW5jcmVtZW50YWxUcmllV3JpdGVyPEludGVnZXI+IG1ha2VUcmllKERhdGFPdXRwdXRCdWZmZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIEluY3JlbWVudGFsVHJpZVdyaXRlcjxJbnRlZ2VyPiBidWlsZGVyID0gbmV3VHJpZVdyaXRlcihzZXJpYWxpemVyLCBvdXQpOworICAgICAgICBkdW1wID0gdHJ1ZTsKKyAgICAgICAgYnVpbGRlci5hZGQoc291cmNlKCIxMTUiKSwgMSk7CisgICAgICAgIGJ1aWxkZXIuYWRkKHNvdXJjZSgiMTUxIiksIDIpOworICAgICAgICBidWlsZGVyLmFkZChzb3VyY2UoIjE1NSIpLCAzKTsKKyAgICAgICAgYnVpbGRlci5hZGQoc291cmNlKCI1MTEiKSwgNCk7CisgICAgICAgIGJ1aWxkZXIuYWRkKHNvdXJjZSgiNTE1IiksIDUpOworICAgICAgICBidWlsZGVyLmFkZChzb3VyY2UoIjU1MSIpLCA2KTsKKyAgICAgICAgYnVpbGRlci5hZGQoc291cmNlKCI1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUiKSwgNyk7CisKKyAgICAgICAgYnVpbGRlci5hZGQoc291cmNlKCI3MCIpLCA4KTsKKyAgICAgICAgYnVpbGRlci5hZGQoc291cmNlKCI3MDUxIiksIDkpOworICAgICAgICBidWlsZGVyLmFkZChzb3VyY2UoIjcxNyIpLCAxMCk7CisgICAgICAgIGJ1aWxkZXIuYWRkKHNvdXJjZSgiNzMiKSwgMTEpOworICAgICAgICBidWlsZGVyLmFkZChzb3VyY2UoIjczNyIpLCAxMik7CisgICAgICAgIHJldHVybiBidWlsZGVyOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBtYWtlQmlnVHJpZShJbmNyZW1lbnRhbFRyaWVXcml0ZXI8SW50ZWdlcj4gYnVpbGRlcikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBkdW1wID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IHNoaWZ0ID0gMDsgc2hpZnQgPCA4OyBzaGlmdCsrKQorICAgICAgICAgICAgZm9yIChsb25nIGkgPSAxOyBpIDwgODA7IGkrKykKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFkZChsb25nU291cmNlKGksIHNoaWZ0ICogOCwgMTAwKSwgKGludCkgKGkgJSA3KSArIDEpOworICAgIH0KKworICAgIHByaXZhdGUgQnl0ZUNvbXBhcmFibGUgbG9uZ1NvdXJjZShsb25nIGwsIGludCBzaGlmdCwgaW50IHNpemUpCisgICAgeworICAgICAgICBTdHJpbmcgcyA9IFN0cmluZ1V0aWxzLmxlZnRQYWQodG9CYXNlKGwpLCA4LCAnMCcpOworICAgICAgICBzID0gU3RyaW5nVXRpbHMucmlnaHRQYWQocywgOCArIHNoaWZ0LCAnMCcpOworICAgICAgICBzID0gU3RyaW5nVXRpbHMubGVmdFBhZChzLCBzaXplLCAnMCcpOworICAgICAgICByZXR1cm4gc291cmNlKHMpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvQnVmZmVyZWREYXRhT3V0cHV0U3RyZWFtVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvQnVmZmVyZWREYXRhT3V0cHV0U3RyZWFtVGVzdC5qYXZhCmluZGV4IDA0MGEwODAuLmVlOGJiMzggMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0J1ZmZlcmVkRGF0YU91dHB1dFN0cmVhbVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9CdWZmZXJlZERhdGFPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTIwLDE1ICsyMCwxNCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWw7CiAKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0OwotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dDsKLWltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVURkRhdGFGb3JtYXRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5VbnNpZ25lZEJ5dGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuVW5zaWduZWRJbnRlZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuVW5zaWduZWRMb25nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnZpbnQuVkludENvZGluZzsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uKjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKIGltcG9ydCBqYXZhLm5pby5CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwpAQCAtMzcsMTQgKzM2LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy52aW50LlZJbnRDb2Rpbmc7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLlVuc2lnbmVkQnl0ZXM7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5VbnNpZ25lZEludGVnZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5VbnNpZ25lZExvbmc7Ci0KIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLm5hbm9UaW1lOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllcy5wcmV2ZW50SWxsZWdhbEFjY2Vzc1dhcm5pbmdzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CkBAIC02MjgsNyArNjE5LDcgQEAKICAgICAgICAgICAgIGludCBzaXplID0gci5uZXh0SW50KDkpOwogICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXModmFsKS5hcnJheSgpOwogICAgICAgICAgICAgY2Fub25pY2FsLndyaXRlKGJ5dGVzLCAwLCBzaXplKTsKLSAgICAgICAgICAgIGRvc3Aud3JpdGVCeXRlcyh2YWwsIHNpemUpOworICAgICAgICAgICAgZG9zcC53cml0ZU1vc3RTaWduaWZpY2FudEJ5dGVzKHZhbCwgc2l6ZSk7CiAgICAgICAgIH0KICAgICAgICAgZG9zcC5mbHVzaCgpOwogICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhjYW5vbmljYWwudG9CeXRlQXJyYXkoKSwgZ2VuZXJhdGVkLnRvQnl0ZUFycmF5KCkpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvQnVmZmVyZWRSYW5kb21BY2Nlc3NGaWxlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvQnVmZmVyZWRSYW5kb21BY2Nlc3NGaWxlVGVzdC5qYXZhCmluZGV4IGJiNTRmMjUuLjlmOThmYjAgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0J1ZmZlcmVkUmFuZG9tQWNjZXNzRmlsZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9CdWZmZXJlZFJhbmRvbUFjY2Vzc0ZpbGVUZXN0LmphdmEKQEAgLTE5LDkgKzE5LDYgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKLQogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwpAQCAtMjksNiArMjYsOSBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CisKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbC5leHBlY3RFT0Y7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWwuZXhwZWN0RXhjZXB0aW9uOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKQEAgLTU2LDg0ICs1Niw4MiBAQAogICAgICAgICB3LnN5bmMoKTsKIAogICAgICAgICAvLyByZWFkaW5nIHNtYWxsIGFtb3VudCBvZiBkYXRhIGZyb20gZmlsZSwgdGhpcyBpcyBoYW5kbGVkIGJ5IGluaXRpYWwgYnVmZmVyCi0gICAgICAgIHRyeSAoRmlsZUhhbmRsZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKHcuZ2V0UGF0aCgpKSkKKyAgICAgICAgRmlsZUhhbmRsZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKHcuZ2V0RmlsZSgpKTsKKyAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciByID0gZmguY3JlYXRlUmVhZGVyKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKLSAgICAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHIgPSBmaC5jcmVhdGVSZWFkZXIoKSkKLSAgICAgICAgICAgIHsKIAotICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCByLnJlYWQoYnVmZmVyKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGJ1ZmZlciwgZGF0YSkpOyAvLyB3ZSByZWFkIGV4YWN0bHkgd2hhdCB3ZSB3cm90ZQotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyLnJlYWQoKSwgLTEpOyAvLyBub3RoaW5nIG1vcmUgdG8gcmVhZCBFT0YKLSAgICAgICAgICAgICAgICBhc3NlcnQgci5ieXRlc1JlbWFpbmluZygpID09IDAgJiYgci5pc0VPRigpOworICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCwgci5yZWFkKGJ1ZmZlcikpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGJ1ZmZlciwgZGF0YSkpOyAvLyB3ZSByZWFkIGV4YWN0bHkgd2hhdCB3ZSB3cm90ZQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHIucmVhZCgpLCAtMSk7IC8vIG5vdGhpbmcgbW9yZSB0byByZWFkIEVPRgorICAgICAgICAgICAgYXNzZXJ0IHIuYnl0ZXNSZW1haW5pbmcoKSA9PSAwICYmIHIuaXNFT0YoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdyaXRpbmcgYnVmZmVyIGJpZ2dlciB0aGFuIHBhZ2Ugc2l6ZSwgd2hpY2ggd2lsbCB0cmlnZ2VyIHJlQnVmZmVyKCkKKyAgICAgICAgYnl0ZVtdIGJpZ0RhdGEgPSBuZXcgYnl0ZVtSYW5kb21BY2Nlc3NSZWFkZXIuREVGQVVMVF9CVUZGRVJfU0laRSArIDEwXTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJpZ0RhdGEubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBiaWdEYXRhW2ldID0gJ2QnOworCisgICAgICAgIGxvbmcgaW5pdGlhbFBvc2l0aW9uID0gdy5wb3NpdGlvbigpOworICAgICAgICB3LndyaXRlKGJpZ0RhdGEpOyAvLyB3cml0aW5nIGRhdGEKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHcucG9zaXRpb24oKSwgaW5pdGlhbFBvc2l0aW9uICsgYmlnRGF0YS5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMody5sZW5ndGgoKSwgaW5pdGlhbFBvc2l0aW9uICsgYmlnRGF0YS5sZW5ndGgpOyAvLyBmaWxlIHNpemUgc2hvdWxkIGVxdWFscyB0byBsYXN0IHBvc2l0aW9uCisKKyAgICAgICAgdy5zeW5jKCk7CisKKyAgICAgICAgLy8gcmUtb3BlbmluZyBmaWxlIGluIHJlYWQtb25seSBtb2RlCisgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgciA9IGZoLmNyZWF0ZVJlYWRlcigpKQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8vIHJlYWRpbmcgd3JpdHRlbiBidWZmZXIKKyAgICAgICAgICAgIHIuc2Vlayhpbml0aWFsUG9zaXRpb24pOyAvLyBiYWNrIHRvIGluaXRpYWwgKGJlZm9yZSB3cml0ZSkgcG9zaXRpb24KKyAgICAgICAgICAgIGRhdGEgPSBuZXcgYnl0ZVtiaWdEYXRhLmxlbmd0aF07CisgICAgICAgICAgICBsb25nIHNpemVSZWFkID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkYXRhW2ldID0gKGJ5dGUpIHIucmVhZCgpOworICAgICAgICAgICAgICAgIHNpemVSZWFkKys7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIHdyaXRpbmcgYnVmZmVyIGJpZ2dlciB0aGFuIHBhZ2Ugc2l6ZSwgd2hpY2ggd2lsbCB0cmlnZ2VyIHJlQnVmZmVyKCkKLSAgICAgICAgICAgIGJ5dGVbXSBiaWdEYXRhID0gbmV3IGJ5dGVbUmFuZG9tQWNjZXNzUmVhZGVyLkRFRkFVTFRfQlVGRkVSX1NJWkUgKyAxMF07CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc2l6ZVJlYWQsIGRhdGEubGVuZ3RoKTsgLy8gcmVhZCBleGFjdGx5IGRhdGEubGVuZ3RoIGJ5dGVzCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoci5nZXRGaWxlUG9pbnRlcigpLCBpbml0aWFsUG9zaXRpb24gKyBkYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoci5sZW5ndGgoKSwgaW5pdGlhbFBvc2l0aW9uICsgYmlnRGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGJpZ0RhdGEsIGRhdGEpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoci5ieXRlc1JlbWFpbmluZygpID09IDAgJiYgci5pc0VPRigpKTsgLy8gd2UgYXJlIGF0IHRoZSBvZiB0aGUgZmlsZQogCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJpZ0RhdGEubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgYmlnRGF0YVtpXSA9ICdkJzsKKyAgICAgICAgICAgIC8vIHRlc3QgcmVhZEJ5dGVzKGludCkgbWV0aG9kCisgICAgICAgICAgICByLnNlZWsoMCk7CisgICAgICAgICAgICBCeXRlQnVmZmVyIGZpbGVDb250ZW50ID0gQnl0ZUJ1ZmZlclV0aWwucmVhZChyLCAoaW50KSB3Lmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmaWxlQ29udGVudC5saW1pdCgpLCB3Lmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydCBCeXRlQnVmZmVyVXRpbC5zdHJpbmcoZmlsZUNvbnRlbnQpLmVxdWFscygiSGVsbG8iICsgbmV3IFN0cmluZyhiaWdEYXRhKSk7CiAKLSAgICAgICAgICAgIGxvbmcgaW5pdGlhbFBvc2l0aW9uID0gdy5wb3NpdGlvbigpOwotICAgICAgICAgICAgdy53cml0ZShiaWdEYXRhKTsgLy8gd3JpdGluZyBkYXRhCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMody5wb3NpdGlvbigpLCBpbml0aWFsUG9zaXRpb24gKyBiaWdEYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMody5sZW5ndGgoKSwgaW5pdGlhbFBvc2l0aW9uICsgYmlnRGF0YS5sZW5ndGgpOyAvLyBmaWxlIHNpemUgc2hvdWxkIGVxdWFscyB0byBsYXN0IHBvc2l0aW9uCisgICAgICAgICAgICAvLyByZWFkIHRoZSBzYW1lIGJ1ZmZlciBidXQgdXNpbmcgcmVhZEZ1bGx5KGludCkKKyAgICAgICAgICAgIGRhdGEgPSBuZXcgYnl0ZVtiaWdEYXRhLmxlbmd0aF07CisgICAgICAgICAgICByLnNlZWsoaW5pdGlhbFBvc2l0aW9uKTsKKyAgICAgICAgICAgIHIucmVhZEZ1bGx5KGRhdGEpOworICAgICAgICAgICAgYXNzZXJ0IHIuYnl0ZXNSZW1haW5pbmcoKSA9PSAwICYmIHIuaXNFT0YoKTsgLy8gd2Ugc2hvdWxkIGJlIGF0IEVPRgorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGJpZ0RhdGEsIGRhdGEpKTsKIAotICAgICAgICAgICAgdy5zeW5jKCk7CisgICAgICAgICAgICAvLyB0cnkgdG8gcmVhZCBwYXN0IG1hcmsgKGFsbCBtZXRob2RzIHNob3VsZCByZXR1cm4gLTEpCisgICAgICAgICAgICBkYXRhID0gbmV3IGJ5dGVbMTBdOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHIucmVhZCgpLCAtMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoci5yZWFkKGRhdGEpLCAtMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoci5yZWFkKGRhdGEsIDAsIGRhdGEubGVuZ3RoKSwgLTEpOwogCi0gICAgICAgICAgICAvLyByZS1vcGVuaW5nIGZpbGUgaW4gcmVhZC1vbmx5IG1vZGUKLSAgICAgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKLSAgICAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHIgPSBmaC5jcmVhdGVSZWFkZXIoKSkKKyAgICAgICAgICAgIC8vIHRlc3QgcmVhZChieXRlW10sIGludCwgaW50KQorICAgICAgICAgICAgci5zZWVrKDApOworICAgICAgICAgICAgZGF0YSA9IG5ldyBieXRlWzIwXTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxNSwgci5yZWFkKGRhdGEsIDAsIDE1KSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG5ldyBTdHJpbmcoZGF0YSkuY29udGFpbnMoIkhlbGxvZGRkZGRkZGRkZCIpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxNjsgaSA8IGRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAvLyByZWFkaW5nIHdyaXR0ZW4gYnVmZmVyCi0gICAgICAgICAgICAgICAgci5zZWVrKGluaXRpYWxQb3NpdGlvbik7IC8vIGJhY2sgdG8gaW5pdGlhbCAoYmVmb3JlIHdyaXRlKSBwb3NpdGlvbgotICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgYnl0ZVtiaWdEYXRhLmxlbmd0aF07Ci0gICAgICAgICAgICAgICAgbG9uZyBzaXplUmVhZCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVtpXSA9IChieXRlKSByLnJlYWQoKTsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZVJlYWQrKzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc2l6ZVJlYWQsIGRhdGEubGVuZ3RoKTsgLy8gcmVhZCBleGFjdGx5IGRhdGEubGVuZ3RoIGJ5dGVzCi0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHIuZ2V0RmlsZVBvaW50ZXIoKSwgaW5pdGlhbFBvc2l0aW9uICsgZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyLmxlbmd0aCgpLCBpbml0aWFsUG9zaXRpb24gKyBiaWdEYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGJpZ0RhdGEsIGRhdGEpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHIuYnl0ZXNSZW1haW5pbmcoKSA9PSAwICYmIHIuaXNFT0YoKSk7IC8vIHdlIGFyZSBhdCB0aGUgb2YgdGhlIGZpbGUKLQotICAgICAgICAgICAgICAgIC8vIHRlc3QgcmVhZEJ5dGVzKGludCkgbWV0aG9kCi0gICAgICAgICAgICAgICAgci5zZWVrKDApOwotICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgZmlsZUNvbnRlbnQgPSBCeXRlQnVmZmVyVXRpbC5yZWFkKHIsIChpbnQpIHcubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhmaWxlQ29udGVudC5saW1pdCgpLCB3Lmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQgQnl0ZUJ1ZmZlclV0aWwuc3RyaW5nKGZpbGVDb250ZW50KS5lcXVhbHMoIkhlbGxvIiArIG5ldyBTdHJpbmcoYmlnRGF0YSkpOwotCi0gICAgICAgICAgICAgICAgLy8gcmVhZCB0aGUgc2FtZSBidWZmZXIgYnV0IHVzaW5nIHJlYWRGdWxseShpbnQpCi0gICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBieXRlW2JpZ0RhdGEubGVuZ3RoXTsKLSAgICAgICAgICAgICAgICByLnNlZWsoaW5pdGlhbFBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICByLnJlYWRGdWxseShkYXRhKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQgci5ieXRlc1JlbWFpbmluZygpID09IDAgJiYgci5pc0VPRigpOyAvLyB3ZSBzaG91bGQgYmUgYXQgRU9GCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGJpZ0RhdGEsIGRhdGEpKTsKLQotICAgICAgICAgICAgICAgIC8vIHRyeSB0byByZWFkIHBhc3QgbWFyayAoYWxsIG1ldGhvZHMgc2hvdWxkIHJldHVybiAtMSkKLSAgICAgICAgICAgICAgICBkYXRhID0gbmV3IGJ5dGVbMTBdOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyLnJlYWQoKSwgLTEpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyLnJlYWQoZGF0YSksIC0xKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoci5yZWFkKGRhdGEsIDAsIGRhdGEubGVuZ3RoKSwgLTEpOwotCi0gICAgICAgICAgICAgICAgLy8gdGVzdCByZWFkKGJ5dGVbXSwgaW50LCBpbnQpCi0gICAgICAgICAgICAgICAgci5zZWVrKDApOwotICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgYnl0ZVsyMF07Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDE1LCByLnJlYWQoZGF0YSwgMCwgMTUpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG5ldyBTdHJpbmcoZGF0YSkuY29udGFpbnMoIkhlbGxvZGRkZGRkZGRkZCIpKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTY7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGRhdGFbaV0gPT0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB3LmZpbmlzaCgpOworICAgICAgICAgICAgICAgIGFzc2VydCBkYXRhW2ldID09IDA7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHcuZmluaXNoKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE0Nyw4ICsxNDUsNyBAQAogICAgICAgICAgICAgYnl0ZVtdIGluID0gZ2VuZXJhdGVCeXRlQXJyYXkoUmFuZG9tQWNjZXNzUmVhZGVyLkRFRkFVTFRfQlVGRkVSX1NJWkUpOwogICAgICAgICAgICAgdy53cml0ZShpbik7CiAgICAgCi0gICAgICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcih3LmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgIEZpbGVIYW5kbGUgZmggPSBidWlsZGVyLmNvbXBsZXRlKCk7CisgICAgICAgICAgICB0cnkgKEZpbGVIYW5kbGUgZmggPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKHcuZ2V0RmlsZSgpKS5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgciA9IGZoLmNyZWF0ZVJlYWRlcigpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8vIFJlYWQgaXQgaW50byBhIHNhbWUgc2l6ZSBhcnJheS4KQEAgLTE5MCw4ICsxODcsNyBAQAogICAgICAgICAgICAgdy5maW5pc2goKTsKICAgICAKICAgICAgICAgICAgIC8vIHdpbGwgdXNlIGNhY2hlZGxlbmd0aAotICAgICAgICAgICAgdHJ5IChGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIodG1wRmlsZS5wYXRoKCkpOwotICAgICAgICAgICAgICAgICBGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcih0bXBGaWxlKS5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgciA9IGZoLmNyZWF0ZVJlYWRlcigpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhsZXNzVGhlbkJ1ZmZlci5sZW5ndGggKyBiaWdnZXJUaGVuQnVmZmVyLmxlbmd0aCwgci5sZW5ndGgoKSk7CkBAIC0yMTQsOCArMjEwLDcgQEAKICAgICAgICAgdy53cml0ZShkYXRhKTsKICAgICAgICAgdy5zeW5jKCk7CiAKLSAgICAgICAgdHJ5IChGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIody5nZXRQYXRoKCkpOwotICAgICAgICAgICAgIEZpbGVIYW5kbGUgZmggPSBidWlsZGVyLmNvbXBsZXRlKCk7CisgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIody5nZXRGaWxlKCkpLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHIgPSBmaC5jcmVhdGVSZWFkZXIoKSkKICAgICAgICAgewogCkBAIC0yNDUsOCArMjQwLDcgQEAKICAgICAgICAgdy53cml0ZShkYXRhKTsKICAgICAgICAgdy5maW5pc2goKTsKIAotICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcih3LmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcih3LmdldEZpbGUoKSkuY29tcGxldGUoKTsKICAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgZmlsZSA9IGZoLmNyZWF0ZVJlYWRlcigpKQogICAgICAgICB7CiAgICAgICAgICAgICBmaWxlLnNlZWsoMCk7CkBAIC0yNzcsOCArMjcxLDcgQEAKICAgICAgICAgdy53cml0ZShnZW5lcmF0ZUJ5dGVBcnJheShSYW5kb21BY2Nlc3NSZWFkZXIuREVGQVVMVF9CVUZGRVJfU0laRSAqIDIpKTsKICAgICAgICAgdy5maW5pc2goKTsKIAotICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcih3LmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcih3LmdldEZpbGUoKSkuY29tcGxldGUoKTsKICAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgZmlsZSA9IGZoLmNyZWF0ZVJlYWRlcigpKQogICAgICAgICB7CiAKQEAgLTMxMyw4ICszMDYsNyBAQAogCiAgICAgICAgIHcuc3luYygpOwogCi0gICAgICAgIHRyeSAoRmlsZUhhbmRsZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKHcuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICBGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICB0cnkgKEZpbGVIYW5kbGUgZmggPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKHcuZ2V0RmlsZSgpKS5jb21wbGV0ZSgpOwogICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciByID0gZmguY3JlYXRlUmVhZGVyKCkpCiAgICAgICAgIHsKIApAQCAtMzUxLDggKzM0Myw3IEBACiAgICAgICAgICAgICBmb3IgKGZpbmFsIGludCBvZmZzZXQgOiBBcnJheXMuYXNMaXN0KDAsIDgpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIEZpbGUgZmlsZTEgPSB3cml0ZVRlbXBvcmFyeUZpbGUobmV3IGJ5dGVbMTZdKTsKLSAgICAgICAgICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmaWxlMS5wYXRoKCkpLmJ1ZmZlclNpemUoYnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICBGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICAgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZmlsZTEpLmJ1ZmZlclNpemUoYnVmZmVyU2l6ZSkuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciBmaWxlID0gZmguY3JlYXRlUmVhZGVyKCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBleHBlY3RFT0YoKCkgLT4geyBmaWxlLnJlYWRGdWxseSh0YXJnZXQsIG9mZnNldCwgMTcpOyByZXR1cm4gbnVsbDsgfSk7CkBAIC0zNjMsOCArMzU0LDcgQEAKICAgICAgICAgICAgIGZvciAoZmluYWwgaW50IG4gOiBBcnJheXMuYXNMaXN0KDEsIDIsIDQsIDgpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIEZpbGUgZmlsZTEgPSB3cml0ZVRlbXBvcmFyeUZpbGUobmV3IGJ5dGVbMTZdKTsKLSAgICAgICAgICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmaWxlMS5wYXRoKCkpLmJ1ZmZlclNpemUoYnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICBGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICAgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZmlsZTEpLmJ1ZmZlclNpemUoYnVmZmVyU2l6ZSkuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciBmaWxlID0gZmguY3JlYXRlUmVhZGVyKCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBleHBlY3RFT0YoKCkgLT4gewpAQCAtMzk2LDggKzM4Niw3IEBACiAKICAgICAgICAgdy5zeW5jKCk7CiAKLSAgICAgICAgdHJ5IChGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIody5nZXRQYXRoKCkpOwotICAgICAgICAgICAgIEZpbGVIYW5kbGUgZmggPSBidWlsZGVyLmNvbXBsZXRlKCk7CisgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIody5nZXRGaWxlKCkpLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHIgPSBmaC5jcmVhdGVSZWFkZXIoKSkKICAgICAgICAgewogCkBAIC00MjQsOCArNDEzLDcgQEAKICAgICAgICAgdG1wRmlsZS5kZWxldGVPbkV4aXQoKTsKIAogICAgICAgICAvLyBDcmVhdGUgdGhlIEJSQUYgYnkgZmlsZW5hbWUgaW5zdGVhZCBvZiBieSBmaWxlLgotICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcih0bXBGaWxlLnBhdGgoKSk7Ci0gICAgICAgICAgICAgRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcih0bXBGaWxlKS5jb21wbGV0ZSgpOwogICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciByID0gZmguY3JlYXRlUmVhZGVyKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGFzc2VydCB0bXBGaWxlLnBhdGgoKS5lcXVhbHMoci5nZXRQYXRoKCkpOwpAQCAtNDU5LDcgKzQ0Nyw3IEBACiAgICAgICAgIC8vV3JpdGluZyB0byBhIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIHRoYXQgaXMgY2xvc2VkIGdlbmVyYXRlcyBubyBlcnJvcgogICAgICAgICAvL0dvaW5nIHRvIGFsbG93IHRoZSBOUEUgdG8gdGhyb3cgdG8gY2F0Y2ggYXMgYSBidWcgYW55IHVzZSBhZnRlciBjbG9zZS4gTm90YWJseSBpdCB3b24ndCB0aHJvdyBOUEUgZm9yIGEKICAgICAgICAgLy93cml0ZSBvZiBhIDAgbGVuZ3RoLCBidXQgdGhhdCBpcyBraW5kIG9mIGEgY29ybmVyIGNhc2UKLSAgICAgICAgZXhwZWN0RXhjZXB0aW9uKCgpIC0+IHsgdy53cml0ZShnZW5lcmF0ZUJ5dGVBcnJheSgxKSk7IHJldHVybiBudWxsOyB9LCBOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGV4cGVjdEV4Y2VwdGlvbigoKSAtPiB7IHcud3JpdGUoZ2VuZXJhdGVCeXRlQXJyYXkoMSkpOyByZXR1cm4gbnVsbDsgfSwgQXNzZXJ0aW9uRXJyb3IuY2xhc3MpOwogCiAgICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzUmVhZGVyIGNvcHkgPSBSYW5kb21BY2Nlc3NSZWFkZXIub3BlbihuZXcgRmlsZShyLmdldFBhdGgoKSkpKQogICAgICAgICB7CkBAIC00NzgsOCArNDY2LDcgQEAKIAogICAgICAgICB3LmZpbmlzaCgpOwogCi0gICAgICAgIHRyeSAoRmlsZUhhbmRsZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKHcuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICBGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICB0cnkgKEZpbGVIYW5kbGUgZmggPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKHcuZ2V0RmlsZSgpKS5jb21wbGV0ZSgpOwogICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciBmaWxlID0gZmguY3JlYXRlUmVhZGVyKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGZpbGUuc2VlaygxMCk7CkBAIC01MTQsOCArNTAxLDcgQEAKICAgICAgICAgICAgIHcud3JpdGUobmV3IGJ5dGVbMzBdKTsKICAgICAgICAgICAgIHcuZmx1c2goKTsKIAotICAgICAgICAgICAgdHJ5IChGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIody5nZXRQYXRoKCkpOwotICAgICAgICAgICAgICAgICBGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcih3LmdldEZpbGUoKSkuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHIgPSBmaC5jcmVhdGVSZWFkZXIoKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByLnNlZWsoMTApOwpAQCAtNjIwLDQgKzYwNiw0IEBACiAKICAgICAgICAgcmV0dXJuIGFycjsKICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRGF0YU91dHB1dFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0RhdGFPdXRwdXRUZXN0LmphdmEKaW5kZXggNDE2MzFhZi4uODNlMmNiZCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRGF0YU91dHB1dFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9EYXRhT3V0cHV0VGVzdC5qYXZhCkBAIC00NjksNyArNDY5LDcgQEAKICAgICAgICAgICAgIC8vIGtlZXAgb25seSBmaXJzdCBpIHJhbmRvbSBieXRlcwogICAgICAgICAgICAgQXJyYXlzLmZpbGwocm5kQnl0ZXMsICBpLCBybmRCeXRlcy5sZW5ndGgsIChieXRlKSAwKTsKICAgICAgICAgICAgIGxvbmcgdmFsID0gQnl0ZUJ1ZmZlclV0aWwudG9Mb25nKEJ5dGVCdWZmZXIud3JhcChybmRCeXRlcykpOwotICAgICAgICAgICAgdGVzdC53cml0ZUJ5dGVzKHZhbCwgaSk7CisgICAgICAgICAgICB0ZXN0LndyaXRlTW9zdFNpZ25pZmljYW50Qnl0ZXModmFsLCBpKTsKICAgICAgICAgICAgIGJ5dGVbXSBhcnIgPSBuZXcgYnl0ZVtpXTsKICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocm5kQnl0ZXMsIDAsIGFyciwgMCwgaSk7CiAgICAgICAgICAgICBjYW5vbi53cml0ZShhcnIpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRmlsZVN5c3RlbXMuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0ZpbGVTeXN0ZW1zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNkNWRiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0ZpbGVTeXN0ZW1zLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVTeXN0ZW07CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0YW5kYXJkU3lzdGVtUHJvcGVydHk7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uamltZnMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5qaW1mcy5KaW1mczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmZpbGVzeXN0ZW0uRm9yd2FyZGluZ0ZpbGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uZmlsZXN5c3RlbS5MaXN0ZW5hYmxlRmlsZVN5c3RlbTsKKworcHVibGljIGNsYXNzIEZpbGVTeXN0ZW1zCit7CisgICAgcHVibGljIHN0YXRpYyBMaXN0ZW5hYmxlRmlsZVN5c3RlbSBuZXdHbG9iYWxJbk1lbW9yeUZpbGVTeXN0ZW0oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdsb2JhbChqaW1mcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3RlbmFibGVGaWxlU3lzdGVtIGdsb2JhbCgpCisgICAgeworICAgICAgICByZXR1cm4gZ2xvYmFsKEZpbGUudW5zYWZlR2V0RmlsZXN5c3RlbSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3RlbmFibGVGaWxlU3lzdGVtIGdsb2JhbChGaWxlU3lzdGVtIHJlYWwpCisgICAgeworICAgICAgICBGaWxlU3lzdGVtIGN1cnJlbnQgPSBGaWxlLnVuc2FmZUdldEZpbGVzeXN0ZW0oKTsKKyAgICAgICAgTGlzdGVuYWJsZUZpbGVTeXN0ZW0gZnMgPSBuZXcgTGlzdGVuYWJsZUZpbGVTeXN0ZW0obmV3IEZvcndhcmRpbmdGaWxlU3lzdGVtKHJlYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUudW5zYWZlU2V0RmlsZXN5c3RlbShjdXJyZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBGaWxlLnVuc2FmZVNldEZpbGVzeXN0ZW0oZnMpOworICAgICAgICByZXR1cm4gZnM7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBGaWxlU3lzdGVtIGppbWZzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBKaW1mcy5uZXdGaWxlU3lzdGVtKGppbWZzQ29uZmlnKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRmlsZVN5c3RlbSBqaW1mcyhTdHJpbmcgbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBKaW1mcy5uZXdGaWxlU3lzdGVtKG5hbWUsIGppbWZzQ29uZmlnKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENvbmZpZ3VyYXRpb24gamltZnNDb25maWcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIENvbmZpZ3VyYXRpb24udW5peCgpLnRvQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1heFNpemUoNEwgPDwgMzApLnNldEJsb2NrU2l6ZSg1MTIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBGaWxlIG1heWJlQ3JlYXRlVG1wKCkKKyAgICB7CisgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoU3RhbmRhcmRTeXN0ZW1Qcm9wZXJ0eS5KQVZBX0lPX1RNUERJUi52YWx1ZSgpKTsKKyAgICAgICAgaWYgKCFkaXIuZXhpc3RzKCkpCisgICAgICAgICAgICBkaXIudHJ5Q3JlYXRlRGlyZWN0b3JpZXMoKTsKKyAgICAgICAgcmV0dXJuIGRpcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9NbWFwcGVkUmVnaW9uc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL01tYXBwZWRSZWdpb25zVGVzdC5qYXZhCmluZGV4IDcxOTRkMzAuLmU2YjVkZDAgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL01tYXBwZWRSZWdpb25zVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL01tYXBwZWRSZWdpb25zVGVzdC5qYXZhCkBAIC0yMCwxMiArMjAsMTMgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLkludHM7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKQEAgLTM0LDI3ICszNSwzNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZXNUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkNvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkNvbXByZXNzaW9uTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQ29tcHJlc3Npb25NZXRhZGF0YS5DaHVuazsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29sbGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wcmVzc2lvblBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwubmFub1RpbWU7Ci0KIHB1YmxpYyBjbGFzcyBNbWFwcGVkUmVnaW9uc1Rlc3QKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTW1hcHBlZFJlZ2lvbnNUZXN0LmNsYXNzKTsKIAorICAgIHByaXZhdGUgZmluYWwgaW50IE9MRF9NQVhfU0VHTUVOVF9TSVpFID0gTW1hcHBlZFJlZ2lvbnMuTUFYX1NFR01FTlRfU0laRTsKKwogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cEREKCkKICAgICB7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOwogICAgIH0KIAorICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHJlc2V0TWF4U2VnbWVudFNpemUoKQorICAgIHsKKyAgICAgICAgTW1hcHBlZFJlZ2lvbnMuTUFYX1NFR01FTlRfU0laRSA9IE9MRF9NQVhfU0VHTUVOVF9TSVpFOworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIEJ5dGVCdWZmZXIgYWxsb2NhdGVCdWZmZXIoaW50IHNpemUpCiAgICAgewogICAgICAgICBCeXRlQnVmZmVyIHJldCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoSW50cy5jaGVja2VkQ2FzdChzaXplKSk7CkBAIC02Myw2ICs3NCwxMSBAQAogICAgICAgICBsb2dnZXIuaW5mbygiU2VlZCB7fSIsIHNlZWQpOwogCiAgICAgICAgIG5ldyBSYW5kb20oc2VlZCkubmV4dEJ5dGVzKHJldC5hcnJheSgpKTsKKyAgICAgICAgYnl0ZVtdIGFyciA9IHJldC5hcnJheSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgYXJyW2ldID0gKGJ5dGUpIChhcnJbaV0gJiAweGYpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCkBAIC04MCwxNSArOTYsMTQgQEAKICAgICAgICAgYXNzZXJ0IHJldC5leGlzdHMoKTsKICAgICAgICAgYXNzZXJ0IHJldC5sZW5ndGgoKSA+PSBidWZmZXIuY2FwYWNpdHkoKTsKICAgICAgICAgcmV0dXJuIHJldDsKLQogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBhbGxvY2F0ZUJ1ZmZlcigxMDI0KTsKLSAgICAgICAgdHJ5KENoYW5uZWxQcm94eSBjaGFubmVsID0gbmV3IENoYW5uZWxQcm94eSh3cml0ZUZpbGUoInRlc3RFbXB0eSIsIGJ1ZmZlcikpOwotICAgICAgICAgICAgTW1hcHBlZFJlZ2lvbnMgcmVnaW9ucyA9IE1tYXBwZWRSZWdpb25zLmVtcHR5KGNoYW5uZWwpKQorICAgICAgICB0cnkgKENoYW5uZWxQcm94eSBjaGFubmVsID0gbmV3IENoYW5uZWxQcm94eSh3cml0ZUZpbGUoInRlc3RFbXB0eSIsIGJ1ZmZlcikpOworICAgICAgICAgICAgIE1tYXBwZWRSZWdpb25zIHJlZ2lvbnMgPSBNbWFwcGVkUmVnaW9ucy5lbXB0eShjaGFubmVsKSkKICAgICAgICAgewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZWdpb25zLmlzRW1wdHkoKSk7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlZ2lvbnMuaXNWYWxpZChjaGFubmVsKSk7CkBAIC05OSw4ICsxMTQsOCBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RUd29TZWdtZW50cygpIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gYWxsb2NhdGVCdWZmZXIoMjA0OCk7Ci0gICAgICAgIHRyeShDaGFubmVsUHJveHkgY2hhbm5lbCA9IG5ldyBDaGFubmVsUHJveHkod3JpdGVGaWxlKCJ0ZXN0VHdvU2VnbWVudHMiLCBidWZmZXIpKTsKLSAgICAgICAgICAgIE1tYXBwZWRSZWdpb25zIHJlZ2lvbnMgPSBNbWFwcGVkUmVnaW9ucy5lbXB0eShjaGFubmVsKSkKKyAgICAgICAgdHJ5IChDaGFubmVsUHJveHkgY2hhbm5lbCA9IG5ldyBDaGFubmVsUHJveHkod3JpdGVGaWxlKCJ0ZXN0VHdvU2VnbWVudHMiLCBidWZmZXIpKTsKKyAgICAgICAgICAgICBNbWFwcGVkUmVnaW9ucyByZWdpb25zID0gTW1hcHBlZFJlZ2lvbnMuZW1wdHkoY2hhbm5lbCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJlZ2lvbnMuZXh0ZW5kKDEwMjQpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0OyBpKyspCkBAIC0xMzMsMTIgKzE0OCwxMSBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNtYWxsU2VnbWVudFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewotICAgICAgICBpbnQgT0xEX01BWF9TRUdNRU5UX1NJWkUgPSBNbWFwcGVkUmVnaW9ucy5NQVhfU0VHTUVOVF9TSVpFOwogICAgICAgICBNbWFwcGVkUmVnaW9ucy5NQVhfU0VHTUVOVF9TSVpFID0gMTAyNDsKIAogICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IGFsbG9jYXRlQnVmZmVyKDQwOTYpOwotICAgICAgICB0cnkoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KHdyaXRlRmlsZSgidGVzdFNtYWxsU2VnbWVudFNpemUiLCBidWZmZXIpKTsKLSAgICAgICAgICAgIE1tYXBwZWRSZWdpb25zIHJlZ2lvbnMgPSBNbWFwcGVkUmVnaW9ucy5lbXB0eShjaGFubmVsKSkKKyAgICAgICAgdHJ5IChDaGFubmVsUHJveHkgY2hhbm5lbCA9IG5ldyBDaGFubmVsUHJveHkod3JpdGVGaWxlKCJ0ZXN0U21hbGxTZWdtZW50U2l6ZSIsIGJ1ZmZlcikpOworICAgICAgICAgICAgIE1tYXBwZWRSZWdpb25zIHJlZ2lvbnMgPSBNbWFwcGVkUmVnaW9ucy5lbXB0eShjaGFubmVsKSkKICAgICAgICAgewogICAgICAgICAgICAgcmVnaW9ucy5leHRlbmQoMTAyNCk7CiAgICAgICAgICAgICByZWdpb25zLmV4dGVuZCgyMDQ4KTsKQEAgLTE1MywyMiArMTY3LDE3IEBACiAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNJWkUgKyAoU0laRSAqIChpIC8gU0laRSkpLCByZWdpb24uZW5kKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgTW1hcHBlZFJlZ2lvbnMuTUFYX1NFR01FTlRfU0laRSA9IE9MRF9NQVhfU0VHTUVOVF9TSVpFOwotICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsb2NSZWdpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgaW50IE9MRF9NQVhfU0VHTUVOVF9TSVpFID0gTW1hcHBlZFJlZ2lvbnMuTUFYX1NFR01FTlRfU0laRTsKICAgICAgICAgTW1hcHBlZFJlZ2lvbnMuTUFYX1NFR01FTlRfU0laRSA9IDEwMjQ7CiAKICAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBhbGxvY2F0ZUJ1ZmZlcihNbWFwcGVkUmVnaW9ucy5NQVhfU0VHTUVOVF9TSVpFICogTW1hcHBlZFJlZ2lvbnMuUkVHSU9OX0FMTE9DX1NJWkUgKiAzKTsKIAotICAgICAgICB0cnkoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KHdyaXRlRmlsZSgidGVzdEFsbG9jUmVnaW9ucyIsIGJ1ZmZlcikpOwotICAgICAgICAgICAgTW1hcHBlZFJlZ2lvbnMgcmVnaW9ucyA9IE1tYXBwZWRSZWdpb25zLmVtcHR5KGNoYW5uZWwpKQorICAgICAgICB0cnkgKENoYW5uZWxQcm94eSBjaGFubmVsID0gbmV3IENoYW5uZWxQcm94eSh3cml0ZUZpbGUoInRlc3RBbGxvY1JlZ2lvbnMiLCBidWZmZXIpKTsKKyAgICAgICAgICAgICBNbWFwcGVkUmVnaW9ucyByZWdpb25zID0gTW1hcHBlZFJlZ2lvbnMuZW1wdHkoY2hhbm5lbCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJlZ2lvbnMuZXh0ZW5kKGJ1ZmZlci5jYXBhY2l0eSgpKTsKIApAQCAtMTgxLDEwICsxOTAsNiBAQAogICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhTSVpFICsgKFNJWkUgKiAoaSAvIFNJWkUpKSwgcmVnaW9uLmVuZCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE1tYXBwZWRSZWdpb25zLk1BWF9TRUdNRU5UX1NJWkUgPSBPTERfTUFYX1NFR01FTlRfU0laRTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xOTUsOCArMjAwLDggQEAKICAgICAgICAgTW1hcHBlZFJlZ2lvbnMgc25hcHNob3Q7CiAgICAgICAgIENoYW5uZWxQcm94eSBjaGFubmVsQ29weTsKIAotICAgICAgICB0cnkoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KHdyaXRlRmlsZSgidGVzdFNuYXBzaG90IiwgYnVmZmVyKSk7Ci0gICAgICAgICAgICBNbWFwcGVkUmVnaW9ucyByZWdpb25zID0gTW1hcHBlZFJlZ2lvbnMubWFwKGNoYW5uZWwsIGJ1ZmZlci5jYXBhY2l0eSgpIC8gNCkpCisgICAgICAgIHRyeSAoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KHdyaXRlRmlsZSgidGVzdFNuYXBzaG90IiwgYnVmZmVyKSk7CisgICAgICAgICAgICAgTW1hcHBlZFJlZ2lvbnMgcmVnaW9ucyA9IE1tYXBwZWRSZWdpb25zLm1hcChjaGFubmVsLCBidWZmZXIuY2FwYWNpdHkoKSAvIDQpKQogICAgICAgICB7CiAgICAgICAgICAgICAvLyBjcmVhdGUgMyBtb3JlIHNlZ21lbnRzLCBvbmUgcGVyIHF1YXRlciBjYXBhY2l0eQogICAgICAgICAgICAgcmVnaW9ucy5leHRlbmQoYnVmZmVyLmNhcGFjaXR5KCkgLyAyKTsKQEAgLTIzNyw4ICsyNDIsOCBAQAogICAgICAgICBNbWFwcGVkUmVnaW9ucyBzbmFwc2hvdDsKICAgICAgICAgQ2hhbm5lbFByb3h5IGNoYW5uZWxDb3B5OwogCi0gICAgICAgIHRyeShDaGFubmVsUHJveHkgY2hhbm5lbCA9IG5ldyBDaGFubmVsUHJveHkod3JpdGVGaWxlKCJ0ZXN0U25hcHNob3RDYW5ub3RFeHRlbmQiLCBidWZmZXIpKTsKLSAgICAgICAgICAgIE1tYXBwZWRSZWdpb25zIHJlZ2lvbnMgPSBNbWFwcGVkUmVnaW9ucy5lbXB0eShjaGFubmVsKSkKKyAgICAgICAgdHJ5IChDaGFubmVsUHJveHkgY2hhbm5lbCA9IG5ldyBDaGFubmVsUHJveHkod3JpdGVGaWxlKCJ0ZXN0U25hcHNob3RDYW5ub3RFeHRlbmQiLCBidWZmZXIpKTsKKyAgICAgICAgICAgICBNbWFwcGVkUmVnaW9ucyByZWdpb25zID0gTW1hcHBlZFJlZ2lvbnMuZW1wdHkoY2hhbm5lbCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJlZ2lvbnMuZXh0ZW5kKGJ1ZmZlci5jYXBhY2l0eSgpIC8gMik7CiAKQEAgLTI2NCw4ICsyNjksOCBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbmRPdXRPZk9yZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBhbGxvY2F0ZUJ1ZmZlcig0MDk2KTsKLSAgICAgICAgdHJ5KENoYW5uZWxQcm94eSBjaGFubmVsID0gbmV3IENoYW5uZWxQcm94eSh3cml0ZUZpbGUoInRlc3RFeHRlbmRPdXRPZk9yZGVyIiwgYnVmZmVyKSk7Ci0gICAgICAgICAgICBNbWFwcGVkUmVnaW9ucyByZWdpb25zID0gTW1hcHBlZFJlZ2lvbnMuZW1wdHkoY2hhbm5lbCkpCisgICAgICAgIHRyeSAoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KHdyaXRlRmlsZSgidGVzdEV4dGVuZE91dE9mT3JkZXIiLCBidWZmZXIpKTsKKyAgICAgICAgICAgICBNbWFwcGVkUmVnaW9ucyByZWdpb25zID0gTW1hcHBlZFJlZ2lvbnMuZW1wdHkoY2hhbm5lbCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJlZ2lvbnMuZXh0ZW5kKDQwOTYpOwogICAgICAgICAgICAgcmVnaW9ucy5leHRlbmQoMTAyNCk7CkBAIC0yODUsOCArMjkwLDggQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmVnYXRpdmVFeHRlbmQoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewogICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IGFsbG9jYXRlQnVmZmVyKDEwMjQpOwotICAgICAgICB0cnkoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KHdyaXRlRmlsZSgidGVzdE5lZ2F0aXZlRXh0ZW5kIiwgYnVmZmVyKSk7Ci0gICAgICAgICAgICBNbWFwcGVkUmVnaW9ucyByZWdpb25zID0gTW1hcHBlZFJlZ2lvbnMuZW1wdHkoY2hhbm5lbCkpCisgICAgICAgIHRyeSAoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KHdyaXRlRmlsZSgidGVzdE5lZ2F0aXZlRXh0ZW5kIiwgYnVmZmVyKSk7CisgICAgICAgICAgICAgTW1hcHBlZFJlZ2lvbnMgcmVnaW9ucyA9IE1tYXBwZWRSZWdpb25zLmVtcHR5KGNoYW5uZWwpKQogICAgICAgICB7CiAgICAgICAgICAgICByZWdpb25zLmV4dGVuZCgtMSk7CiAgICAgICAgIH0KQEAgLTI5NSw3ICszMDAsNiBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE1hcEZvckNvbXByZXNzaW9uTWV0YWRhdGEoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewotICAgICAgICBpbnQgT0xEX01BWF9TRUdNRU5UX1NJWkUgPSBNbWFwcGVkUmVnaW9ucy5NQVhfU0VHTUVOVF9TSVpFOwogICAgICAgICBNbWFwcGVkUmVnaW9ucy5NQVhfU0VHTUVOVF9TSVpFID0gMTAyNDsKIAogICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IGFsbG9jYXRlQnVmZmVyKDEyOCAqIDEwMjQpOwpAQCAtMzA2LDQxICszMTAsMjkgQEAKICAgICAgICAgY2YuZGVsZXRlT25FeGl0KCk7CiAKICAgICAgICAgTWV0YWRhdGFDb2xsZWN0b3Igc3N0YWJsZU1ldGFkYXRhQ29sbGVjdG9yID0gbmV3IE1ldGFkYXRhQ29sbGVjdG9yKG5ldyBDbHVzdGVyaW5nQ29tcGFyYXRvcihCeXRlc1R5cGUuaW5zdGFuY2UpKTsKLSAgICAgICAgdHJ5KFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyID0gbmV3IENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyKGYsIGNmLmFic29sdXRlUGF0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU2VxdWVudGlhbFdyaXRlck9wdGlvbi5ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb25QYXJhbXMuc25hcHB5KCksIHNzdGFibGVNZXRhZGF0YUNvbGxlY3RvcikpCisgICAgICAgIHRyeSAoU2VxdWVudGlhbFdyaXRlciB3cml0ZXIgPSBuZXcgQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIoZiwgY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU2VxdWVudGlhbFdyaXRlck9wdGlvbi5ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uUGFyYW1zLnNuYXBweSgpLCBzc3RhYmxlTWV0YWRhdGFDb2xsZWN0b3IpKQogICAgICAgICB7CiAgICAgICAgICAgICB3cml0ZXIud3JpdGUoYnVmZmVyKTsKICAgICAgICAgICAgIHdyaXRlci5maW5pc2goKTsKICAgICAgICAgfQogCi0gICAgICAgIENvbXByZXNzaW9uTWV0YWRhdGEgbWV0YWRhdGEgPSBuZXcgQ29tcHJlc3Npb25NZXRhZGF0YShjZi5hYnNvbHV0ZVBhdGgoKSwgZi5sZW5ndGgoKSwgdHJ1ZSk7Ci0gICAgICAgIHRyeShDaGFubmVsUHJveHkgY2hhbm5lbCA9IG5ldyBDaGFubmVsUHJveHkoZik7Ci0gICAgICAgICAgICBNbWFwcGVkUmVnaW9ucyByZWdpb25zID0gTW1hcHBlZFJlZ2lvbnMubWFwKGNoYW5uZWwsIG1ldGFkYXRhKSkKKyAgICAgICAgQ29tcHJlc3Npb25NZXRhZGF0YSBtZXRhZGF0YSA9IENvbXByZXNzaW9uTWV0YWRhdGEub3BlbihjZiwgZi5sZW5ndGgoKSwgdHJ1ZSk7CisgICAgICAgIHRyeSAoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KGYpOworICAgICAgICAgICAgIE1tYXBwZWRSZWdpb25zIHJlZ2lvbnMgPSBNbWFwcGVkUmVnaW9ucy5tYXAoY2hhbm5lbCwgbWV0YWRhdGEpKQogICAgICAgICB7CiAKICAgICAgICAgICAgIGFzc2VydEZhbHNlKHJlZ2lvbnMuaXNFbXB0eSgpKTsKLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIHdoaWxlKGkgPCBidWZmZXIuY2FwYWNpdHkoKSkKKyAgICAgICAgICAgIGludCBkYXRhT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChkYXRhT2Zmc2V0IDwgYnVmZmVyLmNhcGFjaXR5KCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29tcHJlc3Npb25NZXRhZGF0YS5DaHVuayBjaHVuayA9IG1ldGFkYXRhLmNodW5rRm9yKGkpOwotCi0gICAgICAgICAgICAgICAgTW1hcHBlZFJlZ2lvbnMuUmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZmxvb3IoY2h1bmsub2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlZ2lvbik7Ci0KLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGNvbXByZXNzZWRDaHVuayA9IHJlZ2lvbi5idWZmZXIuZHVwbGljYXRlKCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjb21wcmVzc2VkQ2h1bmspOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjaHVuay5sZW5ndGggKyA0LCBjb21wcmVzc2VkQ2h1bmsuY2FwYWNpdHkoKSk7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2h1bmsub2Zmc2V0LCByZWdpb24ub2Zmc2V0KCkpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjaHVuay5vZmZzZXQgKyBjaHVuay5sZW5ndGggKyA0LCByZWdpb24uZW5kKCkpOwotCi0gICAgICAgICAgICAgICAgaSArPSBtZXRhZGF0YS5jaHVua0xlbmd0aCgpOworICAgICAgICAgICAgICAgIHZlcmlmeUNodW5rcyhmLCBtZXRhZGF0YSwgZGF0YU9mZnNldCwgcmVnaW9ucyk7CisgICAgICAgICAgICAgICAgZGF0YU9mZnNldCArPSBtZXRhZGF0YS5jaHVua0xlbmd0aCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGZpbmFsbHkKICAgICAgICAgewotICAgICAgICAgICAgTW1hcHBlZFJlZ2lvbnMuTUFYX1NFR01FTlRfU0laRSA9IE9MRF9NQVhfU0VHTUVOVF9TSVpFOwogICAgICAgICAgICAgbWV0YWRhdGEuY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KQEAgLTM0OSw4ICszNDEsOCBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsQXJnRm9yTWFwMSgpIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gYWxsb2NhdGVCdWZmZXIoMTAyNCk7Ci0gICAgICAgIHRyeShDaGFubmVsUHJveHkgY2hhbm5lbCA9IG5ldyBDaGFubmVsUHJveHkod3JpdGVGaWxlKCJ0ZXN0SWxsZWdhbEFyZ0Zvck1hcDEiLCBidWZmZXIpKTsKLSAgICAgICAgICAgIE1tYXBwZWRSZWdpb25zIHJlZ2lvbnMgPSBNbWFwcGVkUmVnaW9ucy5tYXAoY2hhbm5lbCwgMCkpCisgICAgICAgIHRyeSAoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KHdyaXRlRmlsZSgidGVzdElsbGVnYWxBcmdGb3JNYXAxIiwgYnVmZmVyKSk7CisgICAgICAgICAgICAgTW1hcHBlZFJlZ2lvbnMgcmVnaW9ucyA9IE1tYXBwZWRSZWdpb25zLm1hcChjaGFubmVsLCAwKSkKICAgICAgICAgewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZWdpb25zLmlzRW1wdHkoKSk7CiAgICAgICAgIH0KQEAgLTM2MCw4ICszNTIsOCBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsQXJnRm9yTWFwMigpIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gYWxsb2NhdGVCdWZmZXIoMTAyNCk7Ci0gICAgICAgIHRyeShDaGFubmVsUHJveHkgY2hhbm5lbCA9IG5ldyBDaGFubmVsUHJveHkod3JpdGVGaWxlKCJ0ZXN0SWxsZWdhbEFyZ0Zvck1hcDIiLCBidWZmZXIpKTsKLSAgICAgICAgICAgIE1tYXBwZWRSZWdpb25zIHJlZ2lvbnMgPSBNbWFwcGVkUmVnaW9ucy5tYXAoY2hhbm5lbCwgLTFMKSkKKyAgICAgICAgdHJ5IChDaGFubmVsUHJveHkgY2hhbm5lbCA9IG5ldyBDaGFubmVsUHJveHkod3JpdGVGaWxlKCJ0ZXN0SWxsZWdhbEFyZ0Zvck1hcDIiLCBidWZmZXIpKTsKKyAgICAgICAgICAgICBNbWFwcGVkUmVnaW9ucyByZWdpb25zID0gTW1hcHBlZFJlZ2lvbnMubWFwKGNoYW5uZWwsIC0xTCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGFzc2VydFRydWUocmVnaW9ucy5pc0VtcHR5KCkpOwogICAgICAgICB9CkBAIC0zNzEsMTEgKzM2MywxMzEgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbEFyZ0Zvck1hcDMoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewogICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IGFsbG9jYXRlQnVmZmVyKDEwMjQpOwotICAgICAgICB0cnkoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KHdyaXRlRmlsZSgidGVzdElsbGVnYWxBcmdGb3JNYXAzIiwgYnVmZmVyKSk7Ci0gICAgICAgICAgICBNbWFwcGVkUmVnaW9ucyByZWdpb25zID0gTW1hcHBlZFJlZ2lvbnMubWFwKGNoYW5uZWwsIG51bGwpKQorICAgICAgICB0cnkgKENoYW5uZWxQcm94eSBjaGFubmVsID0gbmV3IENoYW5uZWxQcm94eSh3cml0ZUZpbGUoInRlc3RJbGxlZ2FsQXJnRm9yTWFwMyIsIGJ1ZmZlcikpOworICAgICAgICAgICAgIE1tYXBwZWRSZWdpb25zIHJlZ2lvbnMgPSBNbWFwcGVkUmVnaW9ucy5tYXAoY2hhbm5lbCwgbnVsbCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGFzc2VydFRydWUocmVnaW9ucy5pc0VtcHR5KCkpOwogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5kRm9yQ29tcHJlc3Npb25NZXRhZGF0YSgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRlc3RFeHRlbmRGb3JDb21wcmVzc2lvbk1ldGFkYXRhKDgsIDQsIDQsIDgsIDEyKTsKKyAgICAgICAgdGVzdEV4dGVuZEZvckNvbXByZXNzaW9uTWV0YWRhdGEoNCwgNCwgNCwgOCwgMTIpOworICAgICAgICB0ZXN0RXh0ZW5kRm9yQ29tcHJlc3Npb25NZXRhZGF0YSgyLCA0LCA0LCA4LCAxMik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEV4dGVuZEZvckNvbXByZXNzaW9uTWV0YWRhdGEoaW50IG1heFNlZ21lbnRTaXplLCBpbnQgY2h1bmtTaXplLCBpbnQuLi4gd3JpdGVTaXplcykgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgTW1hcHBlZFJlZ2lvbnMuTUFYX1NFR01FTlRfU0laRSA9IG1heFNlZ21lbnRTaXplIDw8IDEwOworICAgICAgICBpbnQgc2l6ZSA9IEFycmF5cy5zdHJlYW0od3JpdGVTaXplcykuc3VtKCkgPDwgMTA7CisKKyAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBhbGxvY2F0ZUJ1ZmZlcihzaXplKTsKKyAgICAgICAgRmlsZSBmID0gRmlsZVV0aWxzLmNyZWF0ZVRlbXBGaWxlKCJ0ZXN0TWFwRm9yQ29tcHJlc3Npb25NZXRhZGF0YSIsICIxIik7CisgICAgICAgIGYuZGVsZXRlT25FeGl0KCk7CisKKyAgICAgICAgRmlsZSBjZiA9IEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZShmLm5hbWUoKSArICIubWV0YWRhdGEiLCAiMSIpOworICAgICAgICBjZi5kZWxldGVPbkV4aXQoKTsKKworICAgICAgICBNZXRhZGF0YUNvbGxlY3RvciBzc3RhYmxlTWV0YWRhdGFDb2xsZWN0b3IgPSBuZXcgTWV0YWRhdGFDb2xsZWN0b3IobmV3IENsdXN0ZXJpbmdDb21wYXJhdG9yKEJ5dGVzVHlwZS5pbnN0YW5jZSkpOworICAgICAgICB0cnkgKENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyIHdyaXRlciA9IG5ldyBDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlcihmLCBjZiwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVudGlhbFdyaXRlck9wdGlvbi5ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvblBhcmFtcy5kZWZsYXRlKGNodW5rU2l6ZSA8PCAxMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGVNZXRhZGF0YUNvbGxlY3RvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgc2xpY2UgPSBidWZmZXIuc2xpY2UoKTsKKyAgICAgICAgICAgIHNsaWNlLmxpbWl0KHdyaXRlU2l6ZXNbMF0gPDwgMTApOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKHNsaWNlKTsKKyAgICAgICAgICAgIHdyaXRlci5zeW5jKCk7CisKKyAgICAgICAgICAgIHRyeSAoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KGYpOworICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhIG1ldGFkYXRhID0gd3JpdGVyLm9wZW4od3JpdGVyLmdldExhc3RGbHVzaE9mZnNldCgpKTsKKyAgICAgICAgICAgICAgICAgTW1hcHBlZFJlZ2lvbnMgcmVnaW9ucyA9IE1tYXBwZWRSZWdpb25zLm1hcChjaGFubmVsLCBtZXRhZGF0YSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UocmVnaW9ucy5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgIGludCBkYXRhT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoZGF0YU9mZnNldCA8IG1ldGFkYXRhLmRhdGFMZW5ndGgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2ZXJpZnlDaHVua3MoZiwgbWV0YWRhdGEsIGRhdGFPZmZzZXQsIHJlZ2lvbnMpOworICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0ICs9IG1ldGFkYXRhLmNodW5rTGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IGlkeCA9IDE7CisgICAgICAgICAgICAgICAgaW50IHBvcyA9IHdyaXRlU2l6ZXNbMF0gPDwgMTA7CisgICAgICAgICAgICAgICAgd2hpbGUgKGlkeCA8IHdyaXRlU2l6ZXMubGVuZ3RoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2xpY2UgPSBidWZmZXIuc2xpY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgc2xpY2UucG9zaXRpb24ocG9zKS5saW1pdChwb3MgKyAod3JpdGVTaXplc1tpZHhdIDw8IDEwKSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShzbGljZSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5zeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IHRoYXQgY2FsbGluZyBleHRlbmQgZm9yIHRoZSBzYW1lIChmaXJzdCBpdGVyYXRpb24pIG9yIHNvbWUgcHJldmlvdXMgbWV0YWRhdGEgKGZ1cnRoZXIgaXRlcmF0aW9ucykgaGFzIG5vIGVmZmVjdAorICAgICAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShyZWdpb25zLmV4dGVuZChtZXRhZGF0YSkpOworCisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJDaGVja2luZyBleHRlbmQgb24gY29tcHJlc3NlZCBjaHVuayBmb3IgcmFuZ2U9e30ge30uLnt9IC8ge30iLCBpZHgsIHBvcywgcG9zICsgKHdyaXRlU2l6ZXNbaWR4XSA8PCAxMCksIHNpemUpOworICAgICAgICAgICAgICAgICAgICBjaGVja0V4dGVuZE9uQ29tcHJlc3NlZENodW5rcyhmLCB3cml0ZXIsIHJlZ2lvbnMpOworICAgICAgICAgICAgICAgICAgICBwb3MgKz0gd3JpdGVTaXplc1tpZHhdIDw8IDEwOworICAgICAgICAgICAgICAgICAgICBpZHgrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tFeHRlbmRPbkNvbXByZXNzZWRDaHVua3MoRmlsZSBmLCBDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlciB3cml0ZXIsIE1tYXBwZWRSZWdpb25zIHJlZ2lvbnMpCisgICAgeworICAgICAgICBpbnQgZGF0YU9mZnNldDsKKyAgICAgICAgdHJ5IChDb21wcmVzc2lvbk1ldGFkYXRhIG1ldGFkYXRhID0gd3JpdGVyLm9wZW4od3JpdGVyLmdldExhc3RGbHVzaE9mZnNldCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaW9ucy5leHRlbmQobWV0YWRhdGEpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UocmVnaW9ucy5pc0VtcHR5KCkpOworICAgICAgICAgICAgZGF0YU9mZnNldCA9IDA7CisgICAgICAgICAgICB3aGlsZSAoZGF0YU9mZnNldCA8IG1ldGFkYXRhLmRhdGFMZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkNoZWNraW5nIGNodW5rIHt9Li57fSIsIGRhdGFPZmZzZXQsIGRhdGFPZmZzZXQgKyBtZXRhZGF0YS5jaHVua0xlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICB2ZXJpZnlDaHVua3MoZiwgbWV0YWRhdGEsIGRhdGFPZmZzZXQsIHJlZ2lvbnMpOworICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQgKz0gbWV0YWRhdGEuY2h1bmtMZW5ndGgoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBmcm9tUmVnaW9ucyhNbWFwcGVkUmVnaW9ucyByZWdpb25zLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkKKyAgICB7CisgICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShzaXplKTsKKworICAgICAgICB3aGlsZSAoYnVmLnJlbWFpbmluZygpID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgTW1hcHBlZFJlZ2lvbnMuUmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZmxvb3Iob2Zmc2V0KTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgcmVnQnVmID0gcmVnaW9uLmJ1ZmZlci5zbGljZSgpOworICAgICAgICAgICAgaW50IHJlZ0J1Zk9mZnNldCA9IChpbnQpIChvZmZzZXQgLSByZWdpb24ub2Zmc2V0KTsKKyAgICAgICAgICAgIHJlZ0J1Zi5wb3NpdGlvbihyZWdCdWZPZmZzZXQpOworICAgICAgICAgICAgcmVnQnVmLmxpbWl0KHJlZ0J1Zk9mZnNldCArIE1hdGgubWluKGJ1Zi5yZW1haW5pbmcoKSwgcmVnQnVmLnJlbWFpbmluZygpKSk7CisgICAgICAgICAgICBvZmZzZXQgKz0gcmVnQnVmLnJlbWFpbmluZygpOworICAgICAgICAgICAgYnVmLnB1dChyZWdCdWYpOworICAgICAgICB9CisKKyAgICAgICAgYnVmLmZsaXAoKTsKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKKyAgICBwcml2YXRlIENodW5rIHZlcmlmeUNodW5rcyhGaWxlIGYsIENvbXByZXNzaW9uTWV0YWRhdGEgbWV0YWRhdGEsIGxvbmcgZGF0YU9mZnNldCwgTW1hcHBlZFJlZ2lvbnMgcmVnaW9ucykKKyAgICB7CisgICAgICAgIENodW5rIGNodW5rID0gbWV0YWRhdGEuY2h1bmtGb3IoZGF0YU9mZnNldCk7CisKKyAgICAgICAgQnl0ZUJ1ZmZlciBjb21wcmVzc2VkQ2h1bmsgPSBmcm9tUmVnaW9ucyhyZWdpb25zLCAoaW50KSBjaHVuay5vZmZzZXQsIGNodW5rLmxlbmd0aCArIDQpOworICAgICAgICBhc3NlcnRUaGF0KGNvbXByZXNzZWRDaHVuay5jYXBhY2l0eSgpKS5pc0VxdWFsVG8oY2h1bmsubGVuZ3RoICsgNCk7CisKKyAgICAgICAgdHJ5IChDaGFubmVsUHJveHkgY2hhbm5lbCA9IG5ldyBDaGFubmVsUHJveHkoZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShjb21wcmVzc2VkQ2h1bmsucmVtYWluaW5nKCkpOworICAgICAgICAgICAgbG9uZyBsZW4gPSBjaGFubmVsLnJlYWQoYnVmLCBjaHVuay5vZmZzZXQpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChsZW4pLmlzRXF1YWxUbyhjaHVuay5sZW5ndGggKyA0KTsKKyAgICAgICAgICAgIGJ1Zi5mbGlwKCk7CisgICAgICAgICAgICBTdHJpbmcgbW1hcHBlZEhleCA9IEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoY29tcHJlc3NlZENodW5rKTsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlSGV4ID0gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChidWYpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChmaWxlSGV4KS5pc0VxdWFsVG8obW1hcHBlZEhleCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2h1bms7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvTklPRGF0YUlucHV0U3RyZWFtVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvTklPRGF0YUlucHV0U3RyZWFtVGVzdC5qYXZhCmluZGV4IDMxZmE1M2MuLjNmMjhjZDQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL05JT0RhdGFJbnB1dFN0cmVhbVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9OSU9EYXRhSW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTIwLDEyICsyMCwxMyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWw7CiAKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5VbnNpZ25lZEJ5dGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuVW5zaWduZWRJbnRlZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuVW5zaWduZWRMb25nOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby4qOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuUmVhZGFibGVCeXRlQ2hhbm5lbDsKQEAgLTMzLDEzICszNCw2IEBACiBpbXBvcnQgamF2YS51dGlsLlF1ZXVlOwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CiAKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5VbnNpZ25lZEJ5dGVzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuVW5zaWduZWRJbnRlZ2VyOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuVW5zaWduZWRMb25nOwotCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9QYWdlQXdhcmVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9QYWdlQXdhcmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJiMGY4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1BhZ2VBd2FyZVRlc3QuamF2YQpAQCAtMCwwICsxLDE4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlBhZ2VBd2FyZS5QQUdFX1NJWkU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgUGFnZUF3YXJlVGVzdAoreworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFnZUxpbWl0KCkKKyAgICB7CisgICAgICAgIGFzc2VydEVxdWFscyhQQUdFX1NJWkUsIFBhZ2VBd2FyZS5wYWdlTGltaXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiAqIFBBR0VfU0laRSwgUGFnZUF3YXJlLnBhZ2VMaW1pdChQQUdFX1NJWkUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMgKiBQQUdFX1NJWkUsIFBhZ2VBd2FyZS5wYWdlTGltaXQoMiAqIFBBR0VfU0laRSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhQQUdFX1NJWkUsIFBhZ2VBd2FyZS5wYWdlTGltaXQoUEFHRV9TSVpFIC8gMykpOworICAgICAgICBhc3NlcnRFcXVhbHMoUEFHRV9TSVpFLCBQYWdlQXdhcmUucGFnZUxpbWl0KFBBR0VfU0laRSAtIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBBR0VfU0laRSwgUGFnZUF3YXJlLnBhZ2VMaW1pdCgxKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIgKiBQQUdFX1NJWkUsIFBhZ2VBd2FyZS5wYWdlTGltaXQoUEFHRV9TSVpFICsgUEFHRV9TSVpFIC8gMykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiAqIFBBR0VfU0laRSwgUGFnZUF3YXJlLnBhZ2VMaW1pdChQQUdFX1NJWkUgKyBQQUdFX1NJWkUgLSAxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyICogUEFHRV9TSVpFLCBQYWdlQXdhcmUucGFnZUxpbWl0KFBBR0VfU0laRSArIDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGJ5dGVzTGVmdEluUGFnZSgpCisgICAgeworICAgICAgICBhc3NlcnRFcXVhbHMoUEFHRV9TSVpFLCBQYWdlQXdhcmUuYnl0ZXNMZWZ0SW5QYWdlKDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBBR0VfU0laRSwgUGFnZUF3YXJlLmJ5dGVzTGVmdEluUGFnZShQQUdFX1NJWkUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBBR0VfU0laRSwgUGFnZUF3YXJlLmJ5dGVzTGVmdEluUGFnZSgyICogUEFHRV9TSVpFKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBBR0VfU0laRSAtIChQQUdFX1NJWkUgLyAzKSwgUGFnZUF3YXJlLmJ5dGVzTGVmdEluUGFnZShQQUdFX1NJWkUgLyAzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBQYWdlQXdhcmUuYnl0ZXNMZWZ0SW5QYWdlKFBBR0VfU0laRSAtIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBBR0VfU0laRSAtIDEsIFBhZ2VBd2FyZS5ieXRlc0xlZnRJblBhZ2UoMSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhQQUdFX1NJWkUgLSAoUEFHRV9TSVpFIC8gMyksIFBhZ2VBd2FyZS5ieXRlc0xlZnRJblBhZ2UoUEFHRV9TSVpFICsgUEFHRV9TSVpFIC8gMykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgUGFnZUF3YXJlLmJ5dGVzTGVmdEluUGFnZShQQUdFX1NJWkUgKyBQQUdFX1NJWkUgLSAxKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhQQUdFX1NJWkUgLSAxLCBQYWdlQXdhcmUuYnl0ZXNMZWZ0SW5QYWdlKFBBR0VfU0laRSArIDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhZ2VTdGFydCgpCisgICAgeworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgUGFnZUF3YXJlLnBhZ2VTdGFydCgwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhQQUdFX1NJWkUsIFBhZ2VBd2FyZS5wYWdlU3RhcnQoUEFHRV9TSVpFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyICogUEFHRV9TSVpFLCBQYWdlQXdhcmUucGFnZVN0YXJ0KDIgKiBQQUdFX1NJWkUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgUGFnZUF3YXJlLnBhZ2VTdGFydChQQUdFX1NJWkUgLyAzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBQYWdlQXdhcmUucGFnZVN0YXJ0KFBBR0VfU0laRSAtIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIFBhZ2VBd2FyZS5wYWdlU3RhcnQoMSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhQQUdFX1NJWkUsIFBhZ2VBd2FyZS5wYWdlU3RhcnQoUEFHRV9TSVpFICsgUEFHRV9TSVpFIC8gMykpOworICAgICAgICBhc3NlcnRFcXVhbHMoUEFHRV9TSVpFLCBQYWdlQXdhcmUucGFnZVN0YXJ0KFBBR0VfU0laRSArIFBBR0VfU0laRSAtIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBBR0VfU0laRSwgUGFnZUF3YXJlLnBhZ2VTdGFydChQQUdFX1NJWkUgKyAxKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYWRkZWQoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIFBhZ2VBd2FyZS5wYWRkZWQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUEFHRV9TSVpFLCBQYWdlQXdhcmUucGFkZGVkKFBBR0VfU0laRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiAqIFBBR0VfU0laRSwgUGFnZUF3YXJlLnBhZGRlZCgyICogUEFHRV9TSVpFKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBBR0VfU0laRSwgUGFnZUF3YXJlLnBhZGRlZChQQUdFX1NJWkUgLyAzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhQQUdFX1NJWkUsIFBhZ2VBd2FyZS5wYWRkZWQoUEFHRV9TSVpFIC0gMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUEFHRV9TSVpFLCBQYWdlQXdhcmUucGFkZGVkKDEpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMiAqIFBBR0VfU0laRSwgUGFnZUF3YXJlLnBhZGRlZChQQUdFX1NJWkUgKyBQQUdFX1NJWkUgLyAzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyICogUEFHRV9TSVpFLCBQYWdlQXdhcmUucGFkZGVkKFBBR0VfU0laRSArIFBBR0VfU0laRSAtIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIgKiBQQUdFX1NJWkUsIFBhZ2VBd2FyZS5wYWRkZWQoUEFHRV9TSVpFICsgMSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbnVtUGFnZXMoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIFBhZ2VBd2FyZS5udW1QYWdlcygwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBQYWdlQXdhcmUubnVtUGFnZXMoUEFHRV9TSVpFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBQYWdlQXdhcmUubnVtUGFnZXMoMiAqIFBBR0VfU0laRSkpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBQYWdlQXdhcmUubnVtUGFnZXMoUEFHRV9TSVpFIC8gMykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgUGFnZUF3YXJlLm51bVBhZ2VzKFBBR0VfU0laRSAtIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFBhZ2VBd2FyZS5udW1QYWdlcygxKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIFBhZ2VBd2FyZS5udW1QYWdlcyhQQUdFX1NJWkUgKyBQQUdFX1NJWkUgLyAzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBQYWdlQXdhcmUubnVtUGFnZXMoUEFHRV9TSVpFICsgUEFHRV9TSVpFIC0gMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgUGFnZUF3YXJlLm51bVBhZ2VzKFBBR0VfU0laRSArIDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhZ2VOdW0oKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIFBhZ2VBd2FyZS5wYWdlTnVtKDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFBhZ2VBd2FyZS5wYWdlTnVtKFBBR0VfU0laRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgUGFnZUF3YXJlLnBhZ2VOdW0oMiAqIFBBR0VfU0laRSkpOworCisgICAgICAgIGFzc2VydEVxdWFscygwLCBQYWdlQXdhcmUucGFnZU51bShQQUdFX1NJWkUgLyAzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBQYWdlQXdhcmUucGFnZU51bShQQUdFX1NJWkUgLSAxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBQYWdlQXdhcmUucGFnZU51bSgxKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFBhZ2VBd2FyZS5wYWdlTnVtKFBBR0VfU0laRSArIFBBR0VfU0laRSAvIDMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFBhZ2VBd2FyZS5wYWdlTnVtKFBBR0VfU0laRSArIFBBR0VfU0laRSAtIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFBhZ2VBd2FyZS5wYWdlTnVtKFBBR0VfU0laRSArIDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhZCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGVzdFBhZCgwLCAwKTsKKyAgICAgICAgdGVzdFBhZChQQUdFX1NJWkUsIFBBR0VfU0laRSk7CisgICAgICAgIHRlc3RQYWQoMiAqIFBBR0VfU0laRSwgMiAqIFBBR0VfU0laRSk7CisKKyAgICAgICAgdGVzdFBhZChQQUdFX1NJWkUsIFBBR0VfU0laRSAvIDMpOworICAgICAgICB0ZXN0UGFkKFBBR0VfU0laRSwgUEFHRV9TSVpFIC0gMSk7CisgICAgICAgIHRlc3RQYWQoUEFHRV9TSVpFLCAxKTsKKworICAgICAgICB0ZXN0UGFkKDIgKiBQQUdFX1NJWkUsIFBBR0VfU0laRSArIFBBR0VfU0laRSAvIDMpOworICAgICAgICB0ZXN0UGFkKDIgKiBQQUdFX1NJWkUsIFBBR0VfU0laRSArIFBBR0VfU0laRSAtIDEpOworICAgICAgICB0ZXN0UGFkKDIgKiBQQUdFX1NJWkUsIFBBR0VfU0laRSArIDEpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0UGFkKGludCBleHBlY3RlZFNpemUsIGludCBjdXJyZW50U2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBCeXRlQnVmZmVyIGV4cGVjdGVkQnVmID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShleHBlY3RlZFNpemUpOworICAgICAgICB0cnkgKERhdGFPdXRwdXRCdWZmZXIgb3V0ID0gbmV3IERhdGFPdXRwdXRCdWZmZXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50U2l6ZTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGV4cGVjdGVkQnVmLnB1dCgoYnl0ZSkgMSk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IGN1cnJlbnRTaXplOyBpIDwgZXhwZWN0ZWRTaXplOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRCdWYucHV0KChieXRlKSAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUGFnZUF3YXJlLnBhZChvdXQpOworICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEJ1Zi5yZXdpbmQoKSwgb3V0LmFzTmV3QnVmZmVyKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByYW5kb21pemVkVGVzdCgpCisgICAgeworICAgICAgICBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDA7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBwb3MgPSByYW5kLm5leHRMb25nKCkgJiAoKDFMIDw8IHJhbmQubmV4dEludCg2NCkpIC0gMSk7ICAgIC8vIHBvc2l0aXZlIGxvbmcgd2l0aCByYW5kb20gbGVuZ3RoCisgICAgICAgICAgICBsb25nIHBhZ2VTdGFydCA9IChwb3MgLyBQQUdFX1NJWkUpICogUEFHRV9TSVpFOworICAgICAgICAgICAgbG9uZyBwYWdlTGltaXQgPSBwYWdlU3RhcnQgKyBQQUdFX1NJWkU7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocGFnZUxpbWl0LCBQYWdlQXdhcmUucGFnZUxpbWl0KHBvcykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHBhZ2VTdGFydCwgUGFnZUF3YXJlLnBhZ2VTdGFydChwb3MpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwYWdlTGltaXQgLSBwb3MsIFBhZ2VBd2FyZS5ieXRlc0xlZnRJblBhZ2UocG9zKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocG9zID09IHBhZ2VTdGFydCA/IHBhZ2VTdGFydCA6IHBhZ2VMaW1pdCwgUGFnZUF3YXJlLnBhZGRlZChwb3MpKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9SYW5kb21BY2Nlc3NSZWFkZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9SYW5kb21BY2Nlc3NSZWFkZXJUZXN0LmphdmEKaW5kZXggZjkzM2NmMS4uODUzNTY0NiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvUmFuZG9tQWNjZXNzUmVhZGVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1JhbmRvbUFjY2Vzc1JlYWRlclRlc3QuamF2YQpAQCAtMzgsMTcgKzM4LDE5IEBACiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzcy5CdWZmZXJUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCiBwdWJsaWMgY2xhc3MgUmFuZG9tQWNjZXNzUmVhZGVyVGVzdAogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihSYW5kb21BY2Nlc3NSZWFkZXJUZXN0LmNsYXNzKTsKQEAgLTE0MiwxNyArMTQ0LDE2IEBACiAgICAgICAgIFBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFBhcmFtZXRlcnMoU0laRSwgMSA8PCAyMCk7IC8vIDFNaUIKIAogCi0gICAgICAgIHRyeSAoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KCJhYmMiLCBuZXcgRmFrZUZpbGVDaGFubmVsKFNJWkUpKTsKLSAgICAgICAgICAgICBGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoY2hhbm5lbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1ZmZlclR5cGUocGFyYW1zLmJ1ZmZlclR5cGUpLmJ1ZmZlclNpemUocGFyYW1zLmJ1ZmZlclNpemUpOwotICAgICAgICAgICAgIEZpbGVIYW5kbGUgZmggPSBidWlsZGVyLmNvbXBsZXRlKCk7CisgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIobmV3IEZpbGUoImFiYyIpKS5idWZmZXJUeXBlKHBhcmFtcy5idWZmZXJUeXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVmZmVyU2l6ZShwYXJhbXMuYnVmZmVyU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBsZXRlKGYgLT4gbmV3IENoYW5uZWxQcm94eShmLCBuZXcgRmFrZUZpbGVDaGFubmVsKFNJWkUpKSk7CiAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHJlYWRlciA9IGZoLmNyZWF0ZVJlYWRlcigpKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2hhbm5lbC5zaXplKCksIHJlYWRlci5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2hhbm5lbC5zaXplKCksIHJlYWRlci5ieXRlc1JlbWFpbmluZygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmaC5jaGFubmVsLnNpemUoKSwgcmVhZGVyLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmaC5jaGFubmVsLnNpemUoKSwgcmVhZGVyLmJ5dGVzUmVtYWluaW5nKCkpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuTUFYX1ZBTFVFLCByZWFkZXIuYXZhaWxhYmxlKCkpOwogCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2hhbm5lbC5zaXplKCksIHJlYWRlci5za2lwKGNoYW5uZWwuc2l6ZSgpKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZmguY2hhbm5lbC5zaXplKCksIHJlYWRlci5za2lwKGZoLmNoYW5uZWwuc2l6ZSgpKSk7CiAKICAgICAgICAgICAgIGFzc2VydFRydWUocmVhZGVyLmlzRU9GKCkpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlYWRlci5ieXRlc1JlbWFpbmluZygpKTsKQEAgLTI5MCwzMCArMjkxLDI4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0UmVhZEZ1bGx5KFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIGZpbmFsIEZpbGUgZiA9IHdyaXRlRmlsZShwYXJhbXMpOwotICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmLnBhdGgoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1ZmZlclR5cGUocGFyYW1zLmJ1ZmZlclR5cGUpLmJ1ZmZlclNpemUocGFyYW1zLmJ1ZmZlclNpemUpKQorICAgICAgICBGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZikuYnVmZmVyVHlwZShwYXJhbXMuYnVmZmVyVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1ZmZlclNpemUocGFyYW1zLmJ1ZmZlclNpemUpOworICAgICAgICBidWlsZGVyLm1tYXBwZWQocGFyYW1zLm1tYXBwZWRSZWdpb25zKTsKKyAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciByZWFkZXIgPSBmaC5jcmVhdGVSZWFkZXIoKSkKICAgICAgICAgewotICAgICAgICAgICAgYnVpbGRlci5tbWFwcGVkKHBhcmFtcy5tbWFwcGVkUmVnaW9ucyk7Ci0gICAgICAgICAgICB0cnkgKEZpbGVIYW5kbGUgZmggPSBidWlsZGVyLmNvbXBsZXRlKCk7Ci0gICAgICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciByZWFkZXIgPSBmaC5jcmVhdGVSZWFkZXIoKSkKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmLmFic29sdXRlUGF0aCgpLCByZWFkZXIuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmLmxlbmd0aCgpLCByZWFkZXIubGVuZ3RoKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGYubGVuZ3RoKCksIHJlYWRlci5ieXRlc1JlbWFpbmluZygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhNYXRoLm1pbihJbnRlZ2VyLk1BWF9WQUxVRSwgZi5sZW5ndGgoKSksIHJlYWRlci5hdmFpbGFibGUoKSk7CisKKyAgICAgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbcGFyYW1zLmV4cGVjdGVkLmxlbmd0aF07CisgICAgICAgICAgICBsb25nIG51bVJlYWQgPSAwOworICAgICAgICAgICAgd2hpbGUgKG51bVJlYWQgPCBwYXJhbXMuZmlsZUxlbmd0aCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZi5hYnNvbHV0ZVBhdGgoKSwgcmVhZGVyLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGYubGVuZ3RoKCksIHJlYWRlci5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGYubGVuZ3RoKCksIHJlYWRlci5ieXRlc1JlbWFpbmluZygpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoTWF0aC5taW4oSW50ZWdlci5NQVhfVkFMVUUsIGYubGVuZ3RoKCkpLCByZWFkZXIuYXZhaWxhYmxlKCkpOwotCi0gICAgICAgICAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVtwYXJhbXMuZXhwZWN0ZWQubGVuZ3RoXTsKLSAgICAgICAgICAgICAgICBsb25nIG51bVJlYWQgPSAwOwotICAgICAgICAgICAgICAgIHdoaWxlIChudW1SZWFkIDwgcGFyYW1zLmZpbGVMZW5ndGgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZWFkZXIucmVhZEZ1bGx5KGIpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocGFyYW1zLmV4cGVjdGVkLCBiKSk7Ci0gICAgICAgICAgICAgICAgICAgIG51bVJlYWQgKz0gYi5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZWFkZXIuaXNFT0YoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlYWRlci5ieXRlc1JlbWFpbmluZygpKTsKKyAgICAgICAgICAgICAgICByZWFkZXIucmVhZEZ1bGx5KGIpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhwYXJhbXMuZXhwZWN0ZWQsIGIpKTsKKyAgICAgICAgICAgICAgICBudW1SZWFkICs9IGIubGVuZ3RoOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnRUcnVlKHJlYWRlci5pc0VPRigpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCByZWFkZXIuYnl0ZXNSZW1haW5pbmcoKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMzMSw4ICszMzAsNyBAQAogCiAgICAgICAgIGFzc2VydCBmLmV4aXN0cygpOwogCi0gICAgICAgIHRyeSAoRmlsZUhhbmRsZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKGYucGF0aCgpKTsKLSAgICAgICAgICAgICBGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICB0cnkgKEZpbGVIYW5kbGUgZmggPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKGYpLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHJlYWRlciA9IGZoLmNyZWF0ZVJlYWRlcigpKQogICAgICAgICB7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZi5hYnNvbHV0ZVBhdGgoKSwgcmVhZGVyLmdldFBhdGgoKSk7CkBAIC0zNjIsOCArMzYwLDcgQEAKIAogICAgICAgICBhc3NlcnQgZi5leGlzdHMoKTsKIAotICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmLnBhdGgoKSk7Ci0gICAgICAgICAgICAgRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmKS5jb21wbGV0ZSgpOwogICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciByZWFkZXIgPSBmaC5jcmVhdGVSZWFkZXIoKSkKICAgICAgICAgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCgpICogbnVtSXRlcmF0aW9ucywgcmVhZGVyLmxlbmd0aCgpKTsKQEAgLTQ0Miw2MSArNDM5LDU5IEBACiAKICAgICAgICAgYXNzZXJ0IGYuZXhpc3RzKCk7CiAKLSAgICAgICAgdHJ5IChGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZi5wYXRoKCkpKQorICAgICAgICBGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZik7CisgICAgICAgIGZpbmFsIFJ1bm5hYmxlIHdvcmtlciA9ICgpIC0+CiAgICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFJ1bm5hYmxlIHdvcmtlciA9ICgpIC0+CisgICAgICAgICAgICB0cnkgKEZpbGVIYW5kbGUgZmggPSBidWlsZGVyLmNvbXBsZXRlKCk7CisgICAgICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciByZWFkZXIgPSBmaC5jcmVhdGVSZWFkZXIoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkgKEZpbGVIYW5kbGUgZmggPSBidWlsZGVyLmNvbXBsZXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgcmVhZGVyID0gZmguY3JlYXRlUmVhZGVyKCkpCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgcmVhZGVyLmxlbmd0aCgpKTsKKworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYiA9IEJ5dGVCdWZmZXJVdGlsLnJlYWQocmVhZGVyLCBleHBlY3RlZC5sZW5ndGgpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYi5hcnJheSgpKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZWFkZXIuaXNFT0YoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlYWRlci5ieXRlc1JlbWFpbmluZygpKTsKKworICAgICAgICAgICAgICAgIHJlYWRlci5zZWVrKDApOworICAgICAgICAgICAgICAgIGIgPSBCeXRlQnVmZmVyVXRpbC5yZWFkKHJlYWRlciwgZXhwZWN0ZWQubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGIuYXJyYXkoKSkpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVhZGVyLmlzRU9GKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCByZWFkZXIuYnl0ZXNSZW1haW5pbmcoKSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCByZWFkZXIubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICBpbnQgcG9zID0gci5uZXh0SW50KGV4cGVjdGVkLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIHJlYWRlci5zZWVrKHBvcyk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhwb3MsIHJlYWRlci5nZXRQb3NpdGlvbigpKTsKIAotICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGIgPSBCeXRlQnVmZmVyVXRpbC5yZWFkKHJlYWRlciwgZXhwZWN0ZWQubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBiLmFycmF5KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZWFkZXIuaXNFT0YoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCByZWFkZXIuYnl0ZXNSZW1haW5pbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gQnl0ZUJ1ZmZlci53cmFwKGV4cGVjdGVkLCBwb3MsIGV4cGVjdGVkLmxlbmd0aCAtIHBvcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9yZGVyKEJ5dGVPcmRlci5CSUdfRU5ESUFOKTsKIAotICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2VlaygwKTsKLSAgICAgICAgICAgICAgICAgICAgYiA9IEJ5dGVCdWZmZXJVdGlsLnJlYWQocmVhZGVyLCBleHBlY3RlZC5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGIuYXJyYXkoKSkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlYWRlci5pc0VPRigpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlYWRlci5ieXRlc1JlbWFpbmluZygpKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3MgPSByLm5leHRJbnQoZXhwZWN0ZWQubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5zZWVrKHBvcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocG9zLCByZWFkZXIuZ2V0UG9zaXRpb24oKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gQnl0ZUJ1ZmZlci53cmFwKGV4cGVjdGVkLCBwb3MsIGV4cGVjdGVkLmxlbmd0aCAtIHBvcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vcmRlcihCeXRlT3JkZXIuQklHX0VORElBTik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIuYnl0ZXNSZW1haW5pbmcoKSA+IDQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1Zi5nZXRJbnQoKSwgcmVhZGVyLnJlYWRJbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5ieXRlc1JlbWFpbmluZygpID4gNCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhidWYuZ2V0SW50KCksIHJlYWRlci5yZWFkSW50KCkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwogCi0gICAgICAgICAgICBpZiAobnVtVGhyZWFkcyA9PSAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdvcmtlci5ydW4oKTsKKyAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbChudW1UaHJlYWRzKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVRocmVhZHM7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3Iuc3VibWl0KHdvcmtlcik7CisgICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgZmFpbChleC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9OwogCi0gICAgICAgICAgICAgICAgZXhlY3V0b3Iuc2h1dGRvd24oKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShleGVjdXRvci5hd2FpdFRlcm1pbmF0aW9uKDEsIFRpbWVVbml0Lk1JTlVURVMpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKG51bVRocmVhZHMgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgd29ya2VyLnJ1bigpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbChudW1UaHJlYWRzKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVGhyZWFkczsgaSsrKQorICAgICAgICAgICAgICAgIGV4ZWN1dG9yLnN1Ym1pdCh3b3JrZXIpOworCisgICAgICAgICAgICBleGVjdXRvci5zaHV0ZG93bigpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZXhlY3V0b3IuYXdhaXRUZXJtaW5hdGlvbigxLCBUaW1lVW5pdC5NSU5VVEVTKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTUxOSwxNiArNTE0LDE0IEBACiAgICAgewogICAgICAgICBQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBQYXJhbWV0ZXJzKDgxOTIsIDQwOTYpOwogICAgICAgICBmaW5hbCBGaWxlIGYgPSB3cml0ZUZpbGUocGFyYW1zKTsKLSAgICAgICAgdHJ5IChGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZi5wYXRoKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWZmZXJUeXBlKHBhcmFtcy5idWZmZXJUeXBlKS5idWZmZXJTaXplKHBhcmFtcy5idWZmZXJTaXplKSkKKyAgICAgICAgRmlsZUhhbmRsZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKGYpLmJ1ZmZlclR5cGUocGFyYW1zLmJ1ZmZlclR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVmZmVyU2l6ZShwYXJhbXMuYnVmZmVyU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tbWFwcGVkKHBhcmFtcy5tbWFwcGVkUmVnaW9ucyk7CisgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgcmVhZGVyID0gZmguY3JlYXRlUmVhZGVyKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGJ1aWxkZXIubW1hcHBlZChwYXJhbXMubW1hcHBlZFJlZ2lvbnMpOwotICAgICAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOwotICAgICAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgcmVhZGVyID0gZmguY3JlYXRlUmVhZGVyKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlYWRlci5za2lwQnl0ZXMoMCkpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCByZWFkZXIuc2tpcEJ5dGVzKC0xKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVhZGVyLnNraXBCeXRlcygwKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVhZGVyLnNraXBCeXRlcygtMSkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC01MzcsNDIgKzUzMCwzOCBAQAogICAgIHsKICAgICAgICAgUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgUGFyYW1ldGVycyg4MTkyLCA0MDk2KTsKICAgICAgICAgZmluYWwgRmlsZSBmID0gd3JpdGVGaWxlKHBhcmFtcyk7Ci0gICAgICAgIHRyeSAoRmlsZUhhbmRsZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKGYucGF0aCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVmZmVyVHlwZShwYXJhbXMuYnVmZmVyVHlwZSkuYnVmZmVyU2l6ZShwYXJhbXMuYnVmZmVyU2l6ZSkpCisgICAgICAgIEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmKS5idWZmZXJUeXBlKHBhcmFtcy5idWZmZXJUeXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVmZmVyU2l6ZShwYXJhbXMuYnVmZmVyU2l6ZSk7CisgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgcmVhZGVyID0gZmguY3JlYXRlUmVhZGVyKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKLSAgICAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHJlYWRlciA9IGZoLmNyZWF0ZVJlYWRlcigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIHJlYWRlci5za2lwQnl0ZXMoMzE0MTUpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICByZWFkZXIuc2tpcEJ5dGVzKDMxNDE1KTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdFNraXBCeXRlcyhQYXJhbWV0ZXJzIHBhcmFtcywgaW50IGV4cGVjdGF0aW9uTXVsdGlwbGVzKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIGZpbmFsIEZpbGUgZiA9IHdyaXRlRmlsZShwYXJhbXMpOwotICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmLnBhdGgoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1ZmZlclR5cGUocGFyYW1zLmJ1ZmZlclR5cGUpLmJ1ZmZlclNpemUocGFyYW1zLmJ1ZmZlclNpemUpKQorICAgICAgICBGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZikuYnVmZmVyVHlwZShwYXJhbXMuYnVmZmVyVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1ZmZlclNpemUocGFyYW1zLmJ1ZmZlclNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tbWFwcGVkKHBhcmFtcy5tbWFwcGVkUmVnaW9ucyk7CisgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgcmVhZGVyID0gZmguY3JlYXRlUmVhZGVyKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGJ1aWxkZXIubW1hcHBlZChwYXJhbXMubW1hcHBlZFJlZ2lvbnMpOwotICAgICAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOwotICAgICAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgcmVhZGVyID0gZmguY3JlYXRlUmVhZGVyKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHRvU2tpcCA9IGV4cGVjdGF0aW9uTXVsdGlwbGVzICogcGFyYW1zLmV4cGVjdGVkLmxlbmd0aDsKLSAgICAgICAgICAgICAgICBieXRlW10gYiA9IG5ldyBieXRlW3BhcmFtcy5leHBlY3RlZC5sZW5ndGhdOwotICAgICAgICAgICAgICAgIGxvbmcgbnVtUmVhZCA9IDA7CisgICAgICAgICAgICBpbnQgdG9Ta2lwID0gZXhwZWN0YXRpb25NdWx0aXBsZXMgKiBwYXJhbXMuZXhwZWN0ZWQubGVuZ3RoOworICAgICAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVtwYXJhbXMuZXhwZWN0ZWQubGVuZ3RoXTsKKyAgICAgICAgICAgIGxvbmcgbnVtUmVhZCA9IDA7CiAKLSAgICAgICAgICAgICAgICB3aGlsZSAobnVtUmVhZCA8IHBhcmFtcy5maWxlTGVuZ3RoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRGdWxseShiKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHBhcmFtcy5leHBlY3RlZCwgYikpOwotICAgICAgICAgICAgICAgICAgICBudW1SZWFkICs9IGIubGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICBpbnQgc2tpcHBlZCA9IHJlYWRlci5za2lwQnl0ZXModG9Ta2lwKTsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyBleHBlY3RlZFNraXBwZWQgPSBNYXRoLm1heChNYXRoLm1pbih0b1NraXAsIHBhcmFtcy5maWxlTGVuZ3RoIC0gbnVtUmVhZCksIDApOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTa2lwcGVkLCBza2lwcGVkKTsKLSAgICAgICAgICAgICAgICAgICAgbnVtUmVhZCArPSBza2lwcGVkOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChudW1SZWFkIDwgcGFyYW1zLmZpbGVMZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRGdWxseShiKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocGFyYW1zLmV4cGVjdGVkLCBiKSk7CisgICAgICAgICAgICAgICAgbnVtUmVhZCArPSBiLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBpbnQgc2tpcHBlZCA9IHJlYWRlci5za2lwQnl0ZXModG9Ta2lwKTsKKyAgICAgICAgICAgICAgICBsb25nIGV4cGVjdGVkU2tpcHBlZCA9IE1hdGgubWF4KE1hdGgubWluKHRvU2tpcCwgcGFyYW1zLmZpbGVMZW5ndGggLSBudW1SZWFkKSwgMCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU2tpcHBlZCwgc2tpcHBlZCk7CisgICAgICAgICAgICAgICAgbnVtUmVhZCArPSBza2lwcGVkOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvU2l6ZWRJbnRzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvU2l6ZWRJbnRzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhM2E5NTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9TaXplZEludHNUZXN0LmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRW5kaWFuVXRpbHM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQXJyYXlVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkdlbmVyYXRvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnF1aWNrdGhlb3JpZXMuUXVpY2tUaGVvcnkucXQ7CitpbXBvcnQgc3RhdGljIG9yZy5xdWlja3RoZW9yaWVzLmdlbmVyYXRvcnMuU291cmNlRFNMLmxvbmdzOworCitwdWJsaWMgY2xhc3MgU2l6ZWRJbnRzVGVzdAoreworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBub25aZXJvU2l6ZSgpCisgICAgeworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgU2l6ZWRJbnRzLm5vblplcm9TaXplKDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFNpemVkSW50cy5ub25aZXJvU2l6ZSgxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBTaXplZEludHMubm9uWmVyb1NpemUoMTI3KSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBTaXplZEludHMubm9uWmVyb1NpemUoLTEyNykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgU2l6ZWRJbnRzLm5vblplcm9TaXplKDEyOCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgU2l6ZWRJbnRzLm5vblplcm9TaXplKC0xMjgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIFNpemVkSW50cy5ub25aZXJvU2l6ZSgtMTI5KSk7CisgICAgICAgIGFzc2VydEVxdWFscyg4LCBTaXplZEludHMubm9uWmVyb1NpemUoMHg3ZmZmZmZmZmZmZmZmZmZmTCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoOCwgU2l6ZWRJbnRzLm5vblplcm9TaXplKDB4N2ZmZmZmZmZmZmZmZmZmTCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNywgU2l6ZWRJbnRzLm5vblplcm9TaXplKDB4N2ZmZmZmZmZmZmZmZmZMKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg3LCBTaXplZEludHMubm9uWmVyb1NpemUoMHg3ZmZmZmZmZmZmZmZmTCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNiwgU2l6ZWRJbnRzLm5vblplcm9TaXplKDB4N2ZmZmZmZmZmZmZmTCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNiwgU2l6ZWRJbnRzLm5vblplcm9TaXplKDB4N2ZmZmZmZmZmZmZMKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg1LCBTaXplZEludHMubm9uWmVyb1NpemUoMHg3ZmZmZmZmZmZmTCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgU2l6ZWRJbnRzLm5vblplcm9TaXplKDB4N2ZmZmZmZmZmTCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgU2l6ZWRJbnRzLm5vblplcm9TaXplKDB4N2ZmZmZmZmZMKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBTaXplZEludHMubm9uWmVyb1NpemUoMHg3ZmZmZmZmTCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgU2l6ZWRJbnRzLm5vblplcm9TaXplKDB4N2ZmZmZmTCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgU2l6ZWRJbnRzLm5vblplcm9TaXplKDB4N2ZmZmZMKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBTaXplZEludHMubm9uWmVyb1NpemUoMHg3ZmZmTCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgU2l6ZWRJbnRzLm5vblplcm9TaXplKDB4N2ZmTCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgU2l6ZWRJbnRzLm5vblplcm9TaXplKDB4N2ZMKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBTaXplZEludHMubm9uWmVyb1NpemUoMHg3TCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2l6ZUFsbG93aW5nWmVybygpCisgICAgeworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgU2l6ZWRJbnRzLnNpemVBbGxvd2luZ1plcm8oMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgU2l6ZWRJbnRzLnNpemVBbGxvd2luZ1plcm8oMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgU2l6ZWRJbnRzLnNpemVBbGxvd2luZ1plcm8oMTI3KSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBTaXplZEludHMuc2l6ZUFsbG93aW5nWmVybygtMTI3KSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBTaXplZEludHMuc2l6ZUFsbG93aW5nWmVybygxMjgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFNpemVkSW50cy5zaXplQWxsb3dpbmdaZXJvKC0xMjgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIFNpemVkSW50cy5zaXplQWxsb3dpbmdaZXJvKC0xMjkpKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVhZFdyaXRlKCkKKyAgICB7CisgICAgICAgIHRyeSAoRGF0YU91dHB1dEJ1ZmZlciBvdXQgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlcig4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcXQoKS5mb3JBbGwoR2VuZXJhdG9ycy5ieXRlcygxLCA4KS5tYXAoYmIgLT4gbmV3IEJpZ0ludGVnZXIoQnl0ZUJ1ZmZlclV0aWwuZ2V0QXJyYXkoYmIpKS5sb25nVmFsdWUoKSkubWl4KGxvbmdzKCkuYWxsKCkpKS5jaGVjayh2IC0+IHsKKyAgICAgICAgICAgICAgICBvdXQuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNpemVkSW50cy53cml0ZShvdXQsIHYsIFNpemVkSW50cy5zaXplQWxsb3dpbmdaZXJvKHYpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgciA9IFNpemVkSW50cy5yZWFkKG91dC5hc05ld0J1ZmZlcigpLCAwLCBTaXplZEludHMuc2l6ZUFsbG93aW5nWmVybyh2KSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2ID09IHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5jbGVhbmVkKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZWFkV3JpdGVVbnNpZ25lZCgpCisgICAgeworICAgICAgICB0cnkgKERhdGFPdXRwdXRCdWZmZXIgb3V0ID0gbmV3IERhdGFPdXRwdXRCdWZmZXIoOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBidWYxID0gbmV3IGJ5dGVbOF07CisgICAgICAgICAgICBieXRlW10gYnVmMiA9IG5ldyBieXRlWzhdOworICAgICAgICAgICAgcXQoKS5mb3JBbGwoR2VuZXJhdG9ycy5ieXRlcygxLCA4KS5tYXAoYmIgLT4gbmV3IEJpZ0ludGVnZXIoQnl0ZUJ1ZmZlclV0aWwuZ2V0QXJyYXkoYmIpKS5sb25nVmFsdWUoKSkubWl4KGxvbmdzKCkuYWxsKCkpKS5jaGVjayh2IC0+IHsKKyAgICAgICAgICAgICAgICBvdXQuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gU2l6ZWRJbnRzLnNpemVBbGxvd2luZ1plcm8odik7CisgICAgICAgICAgICAgICAgICAgIEVuZGlhblV0aWxzLndyaXRlU3dhcHBlZExvbmcoYnVmMSwgMCwgdik7CisgICAgICAgICAgICAgICAgICAgIFNpemVkSW50cy53cml0ZShvdXQsIHYsIHNpemUpOworICAgICAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyByID0gU2l6ZWRJbnRzLnJlYWRVbnNpZ25lZChvdXQuYXNOZXdCdWZmZXIoKSwgMCwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIEVuZGlhblV0aWxzLndyaXRlU3dhcHBlZExvbmcoYnVmMiwgMCwgcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCeXRlQXJyYXlVdGlsLmNvbXBhcmVVbnNpZ25lZChidWYxLCAwLCBidWYyLCAwLCBzaXplKSA9PSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMuY2xlYW5lZChlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9UYWlsT3ZlcnJpZGluZ1JlYnVmZmVyZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9UYWlsT3ZlcnJpZGluZ1JlYnVmZmVyZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JiNjVhMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1RhaWxPdmVycmlkaW5nUmVidWZmZXJlclRlc3QuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55TG9uZzsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5yZXNldDsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworCitwdWJsaWMgY2xhc3MgVGFpbE92ZXJyaWRpbmdSZWJ1ZmZlcmVyVGVzdAoreworICAgIEJ5dGVCdWZmZXIgaGVhZCA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdeyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4IH0pOworICAgIEJ5dGVCdWZmZXIgdGFpbCA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdeyA5LCAxMCB9KTsKKworICAgIFJlYnVmZmVyZXIgciA9IE1vY2tpdG8ubW9jayhSZWJ1ZmZlcmVyLmNsYXNzKTsKKyAgICBSZWJ1ZmZlcmVyLkJ1ZmZlckhvbGRlciBiaCA9IE1vY2tpdG8ubW9jayhSZWJ1ZmZlcmVyLkJ1ZmZlckhvbGRlci5jbGFzcyk7CisKKyAgICBwdWJsaWMgdm9pZCBiZWZvcmUoKQorICAgIHsKKyAgICAgICAgcmVzZXQociwgYmgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc0xlZnRUb1RhaWxGdWxseSgpCisgICAgeworICAgICAgICB3aGVuKHIucmVidWZmZXIoYW55TG9uZygpKSkudGhlblJldHVybihiaCk7CisgICAgICAgIHdoZW4oYmguYnVmZmVyKCkpLnRoZW5SZXR1cm4oaGVhZC5kdXBsaWNhdGUoKSk7CisgICAgICAgIHdoZW4oYmgub2Zmc2V0KCkpLnRoZW5SZXR1cm4oMEwpOworICAgICAgICBSZWJ1ZmZlcmVyIHRvciA9IG5ldyBUYWlsT3ZlcnJpZGluZ1JlYnVmZmVyZXIociwgOCwgdGFpbC5kdXBsaWNhdGUoKSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlYnVmZmVyZXIuQnVmZmVySG9sZGVyIGJoID0gdG9yLnJlYnVmZmVyKGkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGhlYWQsIGJoLmJ1ZmZlcigpKTsKKyAgICAgICAgICAgIGJoLnJlbGVhc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscygxMCwgdG9yLmZpbGVMZW5ndGgoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzTGVmdFRvVGFpbFBhcnRpYWwoKQorICAgIHsKKyAgICAgICAgd2hlbihyLnJlYnVmZmVyKGFueUxvbmcoKSkpLnRoZW5SZXR1cm4oYmgpOworICAgICAgICB3aGVuKGJoLmJ1ZmZlcigpKS50aGVuUmV0dXJuKGhlYWQuZHVwbGljYXRlKCkpOworICAgICAgICB3aGVuKGJoLm9mZnNldCgpKS50aGVuUmV0dXJuKDJMKTsKKyAgICAgICAgUmVidWZmZXJlciB0b3IgPSBuZXcgVGFpbE92ZXJyaWRpbmdSZWJ1ZmZlcmVyKHIsIDgsIHRhaWwuZHVwbGljYXRlKCkpOworCisgICAgICAgIGZvciAoaW50IGkgPSAyOyBpIDwgODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBSZWJ1ZmZlcmVyLkJ1ZmZlckhvbGRlciBiaCA9IHRvci5yZWJ1ZmZlcihpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhoZWFkLmxpbWl0KDYpLCBiaC5idWZmZXIoKSk7CisgICAgICAgICAgICBiaC5yZWxlYXNlKCk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIHRvci5maWxlTGVuZ3RoKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc1JpZ2h0VG9UYWlsKCkKKyAgICB7CisgICAgICAgIHdoZW4oci5yZWJ1ZmZlcihhbnlMb25nKCkpKS50aGVuUmV0dXJuKGJoKTsKKyAgICAgICAgd2hlbihiaC5idWZmZXIoKSkudGhlblJldHVybihoZWFkLmR1cGxpY2F0ZSgpKTsKKyAgICAgICAgd2hlbihiaC5vZmZzZXQoKSkudGhlblJldHVybigwTCk7CisgICAgICAgIFJlYnVmZmVyZXIgdG9yID0gbmV3IFRhaWxPdmVycmlkaW5nUmVidWZmZXJlcihyLCA4LCB0YWlsLmR1cGxpY2F0ZSgpKTsKKworICAgICAgICBmb3IgKGludCBpID0gODsgaSA8IDEwOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlYnVmZmVyZXIuQnVmZmVySG9sZGVyIGJoID0gdG9yLnJlYnVmZmVyKGkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRhaWwsIGJoLmJ1ZmZlcigpKTsKKyAgICAgICAgICAgIGJoLnJlbGVhc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscygxMCwgdG9yLmZpbGVMZW5ndGgoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3RoZXJNZXRob2RzKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBSZWJ1ZmZlcmVyIHRvciA9IG5ldyBUYWlsT3ZlcnJpZGluZ1JlYnVmZmVyZXIociwgOCwgdGFpbC5kdXBsaWNhdGUoKSk7CisKKyAgICAgICAgRmlsZSB0bXAgPSBGaWxlVXRpbHMuY3JlYXRlVGVtcEZpbGUoImZha2VDaGFubmVsUHJveHkiLCAiIik7CisgICAgICAgIHRyeSAoQ2hhbm5lbFByb3h5IGNoYW5uZWxQcm94eSA9IG5ldyBDaGFubmVsUHJveHkodG1wKSkKKyAgICAgICAgeworICAgICAgICAgICAgd2hlbihyLmNoYW5uZWwoKSkudGhlblJldHVybihjaGFubmVsUHJveHkpOworICAgICAgICAgICAgYXNzZXJ0U2FtZShjaGFubmVsUHJveHksIHRvci5jaGFubmVsKCkpOworICAgICAgICAgICAgdmVyaWZ5KHIpLmNoYW5uZWwoKTsKKyAgICAgICAgICAgIHJlc2V0KHIpOworICAgICAgICB9CisKKyAgICAgICAgdG9yLmNsb3NlUmVhZGVyKCk7CisgICAgICAgIHZlcmlmeShyKS5jbG9zZVJlYWRlcigpOworICAgICAgICByZXNldChyKTsKKworICAgICAgICB0b3IuY2xvc2UoKTsKKyAgICAgICAgdmVyaWZ5KHIpLmNsb3NlKCk7CisgICAgICAgIHJlc2V0KHIpOworCisgICAgICAgIHdoZW4oci5nZXRDcmNDaGVja0NoYW5jZSgpKS50aGVuUmV0dXJuKDAuMTIzZCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLjEyM2QsIHRvci5nZXRDcmNDaGVja0NoYW5jZSgpLCAwKTsKKyAgICAgICAgdmVyaWZ5KHIpLmdldENyY0NoZWNrQ2hhbmNlKCk7CisgICAgICAgIHJlc2V0KHIpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9XcmFwcGluZ1JlYnVmZmVyZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9XcmFwcGluZ1JlYnVmZmVyZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ0NDhjZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1dyYXBwaW5nUmVidWZmZXJlclRlc3QuamF2YQpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdEV4Y2VwdGlvbk9mVHlwZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgV3JhcHBpbmdSZWJ1ZmZlcmVyVGVzdAoreworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYnVmZmVyUmVsZWFzZSgpCisgICAgeworICAgICAgICBUZXN0UmVidWZmZXJlciBtb2NrID0gbmV3IFRlc3RSZWJ1ZmZlcmVyKCk7CisgICAgICAgIHRyeSAoV3JhcHBpbmdSZWJ1ZmZlcmVyIHJlYnVmZmVyZXIgPSBuZXcgV3JhcHBpbmdSZWJ1ZmZlcmVyKG1vY2spCisgICAgICAgIHsKKyAgICAgICAgfSkKKyAgICAgICAgeworICAgICAgICAgICAgUmVidWZmZXJlci5CdWZmZXJIb2xkZXIgcmV0ID0gcmVidWZmZXJlci5yZWJ1ZmZlcigwKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmV0KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhtb2NrLmJ1ZmZlcigpLCByZXQuYnVmZmVyKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1vY2sub2Zmc2V0KCksIHJldC5vZmZzZXQoKSk7CisKKyAgICAgICAgICAgIHJldC5yZWxlYXNlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1vY2sucmVsZWFzZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVidWZmZXJSZWxlYXNlRmFpbGluZ0NvbnRyYWN0KCkKKyAgICB7CisgICAgICAgIFRlc3RSZWJ1ZmZlcmVyIG1vY2sgPSBuZXcgVGVzdFJlYnVmZmVyZXIoKTsKKyAgICAgICAgdHJ5IChXcmFwcGluZ1JlYnVmZmVyZXIgcmVidWZmZXJlciA9IG5ldyBXcmFwcGluZ1JlYnVmZmVyZXIobW9jaykKKyAgICAgICAgeworICAgICAgICB9KQorICAgICAgICB7CisgICAgICAgICAgICBSZWJ1ZmZlcmVyLkJ1ZmZlckhvbGRlciByZXQxID0gcmVidWZmZXJlci5yZWJ1ZmZlcigwKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmV0MSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobW9jay5idWZmZXIoKSwgcmV0MS5idWZmZXIoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobW9jay5vZmZzZXQoKSwgcmV0MS5vZmZzZXQoKSk7CisKKyAgICAgICAgICAgIGFzc2VydFRoYXRFeGNlcHRpb25PZlR5cGUoQXNzZXJ0aW9uRXJyb3IuY2xhc3MpLmlzVGhyb3duQnkoKCkgLT4gcmVidWZmZXJlci5yZWJ1ZmZlcigxKSk7CisgICAgICAgICAgICByZXQxLnJlbGVhc2UoKTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtb2NrLnJlbGVhc2VkKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXRFeGNlcHRpb25PZlR5cGUoQXNzZXJ0aW9uRXJyb3IuY2xhc3MpLmlzVGhyb3duQnkocmV0MTo6YnVmZmVyKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXRFeGNlcHRpb25PZlR5cGUoQXNzZXJ0aW9uRXJyb3IuY2xhc3MpLmlzVGhyb3duQnkocmV0MTo6b2Zmc2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYnVmZmVyUmVsZWFzZUZhaWxpbmdDb250cmFjdFdoZW5DbG9zaW5nKCkKKyAgICB7CisgICAgICAgIGFzc2VydFRoYXRFeGNlcHRpb25PZlR5cGUoQXNzZXJ0aW9uRXJyb3IuY2xhc3MpLmlzVGhyb3duQnkoKCkgLT4geworICAgICAgICAgICAgVGVzdFJlYnVmZmVyZXIgbW9jayA9IG5ldyBUZXN0UmVidWZmZXJlcigpOworICAgICAgICAgICAgdHJ5IChXcmFwcGluZ1JlYnVmZmVyZXIgcmVidWZmZXJlciA9IG5ldyBXcmFwcGluZ1JlYnVmZmVyZXIobW9jaykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmVidWZmZXJlci5CdWZmZXJIb2xkZXIgcmV0MSA9IHJlYnVmZmVyZXIucmVidWZmZXIoMCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXQxKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobW9jay5idWZmZXIoKSwgcmV0MS5idWZmZXIoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1vY2sub2Zmc2V0KCksIHJldDEub2Zmc2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RSZWJ1ZmZlcmVyIGltcGxlbWVudHMgUmVidWZmZXJlciwgUmVidWZmZXJlci5CdWZmZXJIb2xkZXIKKyAgICB7CisgICAgICAgIGZpbmFsIEJ5dGVCdWZmZXIgYnVmZmVyOworICAgICAgICBib29sZWFuIHJlbGVhc2VkOworICAgICAgICBsb25nIG9mZnNldDsKKworICAgICAgICBUZXN0UmVidWZmZXJlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgwKTsKKyAgICAgICAgICAgIHRoaXMucmVsZWFzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2hhbm5lbFByb3h5IGNoYW5uZWwoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBidWZmZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYnVmZmVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgZmlsZUxlbmd0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBidWZmZXIucmVtYWluaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZG91YmxlIGdldENyY0NoZWNrQ2hhbmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVmZmVySG9sZGVyIHJlYnVmZmVyKGxvbmcgcG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIG9mZnNldCA9IHBvc2l0aW9uOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBvZmZzZXQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlbGVhc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGFkanVzdEV4dGVybmFsKGxvbmcgcG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGFkanVzdEludGVybmFsKGxvbmcgcG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90aGluZworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2VSZWFkZXIoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBub3RoaW5nCisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvQWxpYmFiYUNsb3VkU25pdGNoVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvQWxpYmFiYUNsb3VkU25pdGNoVGVzdC5qYXZhCmluZGV4IDA0NTQwY2YuLjgyMTA4ZjIgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL0FsaWJhYmFDbG91ZFNuaXRjaFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9BbGliYWJhQ2xvdWRTbml0Y2hUZXN0LmphdmEKQEAgLTM2LDYgKzM2LDcgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHMuY2xlYW51cDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2VydmVyVGVzdFV0aWxzLm1rZGlyczsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5HT1NTSVBfRElTQUJMRV9USFJFQURfVkFMSURBVElPTjsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIHB1YmxpYyBjbGFzcyBBbGliYWJhQ2xvdWRTbml0Y2hUZXN0IApAQCAtNDUsNyArNDYsNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpIHRocm93cyBFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShHb3NzaXBlci5Qcm9wcy5ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OLCAidHJ1ZSIpOworICAgICAgICBHT1NTSVBfRElTQUJMRV9USFJFQURfVkFMSURBVElPTi5zZXRCb29sZWFuKHRydWUpOwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKICAgICAgICAgQ29tbWl0TG9nLmluc3RhbmNlLnN0YXJ0KCk7CiAgICAgICAgIENvbW1pdExvZy5pbnN0YW5jZS5zZWdtZW50TWFuYWdlci5hd2FpdE1hbmFnZW1lbnRUYXNrc0NvbXBsZXRpb24oKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL0Nsb3Vkc3RhY2tTbml0Y2hUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9DbG91ZHN0YWNrU25pdGNoVGVzdC5qYXZhCmluZGV4IDUxZTgzNzEuLmUxNjdlOTkgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL0Nsb3Vkc3RhY2tTbml0Y2hUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvQ2xvdWRzdGFja1NuaXRjaFRlc3QuamF2YQpAQCAtMzcsNiArMzcsNyBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlscy5jbGVhbnVwOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHMubWtkaXJzOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkdPU1NJUF9ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogcHVibGljIGNsYXNzIENsb3Vkc3RhY2tTbml0Y2hUZXN0CkBAIC00Niw3ICs0Nyw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KEdvc3NpcGVyLlByb3BzLkRJU0FCTEVfVEhSRUFEX1ZBTElEQVRJT04sICJ0cnVlIik7CisgICAgICAgIEdPU1NJUF9ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OLnNldEJvb2xlYW4odHJ1ZSk7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOwogICAgICAgICBDb21taXRMb2cuaW5zdGFuY2Uuc3RhcnQoKTsKICAgICAgICAgQ29tbWl0TG9nLmluc3RhbmNlLnNlZ21lbnRNYW5hZ2VyLmF3YWl0TWFuYWdlbWVudFRhc2tzQ29tcGxldGlvbigpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvRUMyU25pdGNoVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvRUMyU25pdGNoVGVzdC5qYXZhCmluZGV4IDY5YzEyODcuLjc4YzVkNDAgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL0VDMlNuaXRjaFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9FQzJTbml0Y2hUZXN0LmphdmEKQEAgLTQyLDYgKzQyLDcgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHMuY2xlYW51cDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2VydmVyVGVzdFV0aWxzLm1rZGlyczsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5HT1NTSVBfRElTQUJMRV9USFJFQURfVkFMSURBVElPTjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5FYzJTbml0Y2guRUMyX05BTUlOR19MRUdBQ1k7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCkBAIC02MCw3ICs2MSw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KEdvc3NpcGVyLlByb3BzLkRJU0FCTEVfVEhSRUFEX1ZBTElEQVRJT04sICJ0cnVlIik7CisgICAgICAgIEdPU1NJUF9ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OLnNldEJvb2xlYW4odHJ1ZSk7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOwogICAgICAgICBDb21taXRMb2cuaW5zdGFuY2Uuc3RhcnQoKTsKICAgICAgICAgQ29tbWl0TG9nLmluc3RhbmNlLnNlZ21lbnRNYW5hZ2VyLmF3YWl0TWFuYWdlbWVudFRhc2tzQ29tcGxldGlvbigpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvR29vZ2xlQ2xvdWRTbml0Y2hUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9Hb29nbGVDbG91ZFNuaXRjaFRlc3QuamF2YQppbmRleCA2NzE5MmJkLi4xZmRmZDFjIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9Hb29nbGVDbG91ZFNuaXRjaFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9Hb29nbGVDbG91ZFNuaXRjaFRlc3QuamF2YQpAQCAtMzgsNiArMzgsNyBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlscy5jbGVhbnVwOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHMubWtkaXJzOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkdPU1NJUF9ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogcHVibGljIGNsYXNzIEdvb2dsZUNsb3VkU25pdGNoVGVzdApAQCAtNDcsNyArNDgsNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpIHRocm93cyBFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShHb3NzaXBlci5Qcm9wcy5ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OLCAidHJ1ZSIpOworICAgICAgICBHT1NTSVBfRElTQUJMRV9USFJFQURfVkFMSURBVElPTi5zZXRCb29sZWFuKHRydWUpOwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKICAgICAgICAgQ29tbWl0TG9nLmluc3RhbmNlLnN0YXJ0KCk7CiAgICAgICAgIENvbW1pdExvZy5pbnN0YW5jZS5zZWdtZW50TWFuYWdlci5hd2FpdE1hbmFnZW1lbnRUYXNrc0NvbXBsZXRpb24oKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL1Byb3BlcnR5RmlsZVNuaXRjaFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL1Byb3BlcnR5RmlsZVNuaXRjaFRlc3QuamF2YQppbmRleCAyM2JjZjFiLi5hZjllOTcwIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9Qcm9wZXJ0eUZpbGVTbml0Y2hUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvUHJvcGVydHlGaWxlU25pdGNoVGVzdC5qYXZhCkBAIC00OSw2ICs0OSw3IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuR09TU0lQX0RJU0FCTEVfVEhSRUFEX1ZBTElEQVRJT047CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKIAogLyoqCkBAIC03MSw3ICs3Miw3IEBACiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoR29zc2lwZXIuUHJvcHMuRElTQUJMRV9USFJFQURfVkFMSURBVElPTiwgInRydWUiKTsKKyAgICAgICAgR09TU0lQX0RJU0FCTEVfVEhSRUFEX1ZBTElEQVRJT04uc2V0Qm9vbGVhbih0cnVlKTsKICAgICAgICAgU3RyaW5nIGNvbmZGaWxlID0gRkJVdGlsaXRpZXMucmVzb3VyY2VUb0ZpbGUoUHJvcGVydHlGaWxlU25pdGNoLlNOSVRDSF9QUk9QRVJUSUVTX0ZJTEVOQU1FKTsKICAgICAgICAgZWZmZWN0aXZlRmlsZSA9IFBhdGhzLmdldChjb25mRmlsZSk7CiAgICAgICAgIGJhY2t1cEZpbGUgPSBQYXRocy5nZXQoY29uZkZpbGUgKyAiLmJhayIpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvU2ltcGxlU2VlZFByb3ZpZGVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvU2ltcGxlU2VlZFByb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYTIxNmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9TaW1wbGVTZWVkUHJvdmlkZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvcjsKKworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuUGFyYW1ldGVyaXplZENsYXNzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tlZFN0YXRpYzsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLkFycmF5cy5hc0xpc3Q7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5Db2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLlNpbXBsZVNlZWRQcm92aWRlci5SRVNPTFZFX01VTFRJUExFX0lQX0FERFJFU1NFU19QRVJfRE5TX1JFQ09SRF9LRVk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuU2ltcGxlU2VlZFByb3ZpZGVyLlNFRURTX0tFWTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrU3RhdGljOworCitwdWJsaWMgY2xhc3MgU2ltcGxlU2VlZFByb3ZpZGVyVGVzdAoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkbnNOYW1lMSA9ICJkbnMtbmFtZS0xIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZG5zTmFtZTIgPSAiZG5zLW5hbWUtMiI7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWVkc1Jlc29sdXRpb24oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBNb2NrZWRTdGF0aWM8SW5ldEFkZHJlc3NBbmRQb3J0PiBpbmV0QWRkcmVzc0FuZFBvcnRNb2NrID0gbnVsbDsKKyAgICAgICAgTW9ja2VkU3RhdGljPERhdGFiYXNlRGVzY3JpcHRvcj4gZGVzY3JpcHRvck1vY2sgPSBudWxsOworICAgICAgICBNb2NrZWRTdGF0aWM8RkJVdGlsaXRpZXM+IGZiVXRpbGl0aWVzTW9jayA9IG51bGw7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBhZGRyZXNzQnl0ZXMxID0gbmV3IGJ5dGVbXXsgMTI3LCAwLCAwLCAxIH07CisgICAgICAgICAgICBieXRlW10gYWRkcmVzc0J5dGVzMiA9IG5ldyBieXRlW117IDEyNywgMCwgMCwgMiB9OworICAgICAgICAgICAgYnl0ZVtdIGFkZHJlc3NCeXRlczMgPSBuZXcgYnl0ZVtdeyAxMjcsIDAsIDAsIDMgfTsKKyAgICAgICAgICAgIEluZXRBZGRyZXNzQW5kUG9ydCBhZGRyZXNzMSA9IG5ldyBJbmV0QWRkcmVzc0FuZFBvcnQoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGFkZHJlc3NCeXRlczEpLCBhZGRyZXNzQnl0ZXMxLCA3MDAwKTsKKyAgICAgICAgICAgIEluZXRBZGRyZXNzQW5kUG9ydCBhZGRyZXNzMiA9IG5ldyBJbmV0QWRkcmVzc0FuZFBvcnQoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGFkZHJlc3NCeXRlczIpLCBhZGRyZXNzQnl0ZXMyLCA3MDAwKTsKKyAgICAgICAgICAgIEluZXRBZGRyZXNzQW5kUG9ydCBhZGRyZXNzMyA9IG5ldyBJbmV0QWRkcmVzc0FuZFBvcnQoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGFkZHJlc3NCeXRlczMpLCBhZGRyZXNzQnl0ZXMzLCA3MDAwKTsKKworICAgICAgICAgICAgaW5ldEFkZHJlc3NBbmRQb3J0TW9jayA9IG1vY2tTdGF0aWMoSW5ldEFkZHJlc3NBbmRQb3J0LmNsYXNzKTsKKyAgICAgICAgICAgIGluZXRBZGRyZXNzQW5kUG9ydE1vY2sud2hlbigoKSAtPiBJbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlOYW1lKGRuc05hbWUxKSkudGhlblJldHVybihhZGRyZXNzMSk7CisgICAgICAgICAgICBpbmV0QWRkcmVzc0FuZFBvcnRNb2NrLndoZW4oKCkgLT4gSW5ldEFkZHJlc3NBbmRQb3J0LmdldEFsbEJ5TmFtZShkbnNOYW1lMSkpLnRoZW5SZXR1cm4oc2luZ2xldG9uTGlzdChhZGRyZXNzMSkpOworICAgICAgICAgICAgaW5ldEFkZHJlc3NBbmRQb3J0TW9jay53aGVuKCgpIC0+IEluZXRBZGRyZXNzQW5kUG9ydC5nZXRBbGxCeU5hbWUoZG5zTmFtZTIpKS50aGVuUmV0dXJuKGFzTGlzdChhZGRyZXNzMiwgYWRkcmVzczMpKTsKKyAgICAgICAgICAgIGluZXRBZGRyZXNzQW5kUG9ydE1vY2sud2hlbigoKSAtPiBJbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlOYW1lKGRuc05hbWUyKSkudGhlblJldHVybihhZGRyZXNzMik7CisKKyAgICAgICAgICAgIGZiVXRpbGl0aWVzTW9jayA9IG1vY2tTdGF0aWMoRkJVdGlsaXRpZXMuY2xhc3MpOworICAgICAgICAgICAgZmJVdGlsaXRpZXNNb2NrLndoZW4oRkJVdGlsaXRpZXM6OmdldExvY2FsQWRkcmVzc0FuZFBvcnQpLnRoZW5SZXR1cm4oYWRkcmVzczEpOworCisgICAgICAgICAgICBkZXNjcmlwdG9yTW9jayA9IG1vY2tTdGF0aWMoRGF0YWJhc2VEZXNjcmlwdG9yLmNsYXNzKTsKKworICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBzZWVkUHJvdmlkZXJBcmdzID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gZG5zIDEgd2l0aG91dCBtdWx0aXBsZSBpcHMgcGVyIHJlY29yZAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHNlZWRQcm92aWRlckFyZ3MucHV0KFNFRURTX0tFWSwgZG5zTmFtZTEpOworICAgICAgICAgICAgLy8gcmVzb2x2ZV9tdWx0aXBsZV9pcF9hZGRyZXNzZXNfcGVyX2Ruc19yZWNvcmQgaXMgaW1wbGljaXRseSBmYWxzZSBoZXJlCisKKyAgICAgICAgICAgIGRlc2NyaXB0b3JNb2NrLndoZW4oRGF0YWJhc2VEZXNjcmlwdG9yOjpsb2FkQ29uZmlnKS50aGVuUmV0dXJuKGdldENvbmZpZyhzZWVkUHJvdmlkZXJBcmdzKSk7CisgICAgICAgICAgICBTaW1wbGVTZWVkUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgU2ltcGxlU2VlZFByb3ZpZGVyKG51bGwpOworICAgICAgICAgICAgTGlzdDxJbmV0QWRkcmVzc0FuZFBvcnQ+IHNlZWRzID0gcHJvdmlkZXIuZ2V0U2VlZHMoKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlZWRzLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWRkcmVzczEsIHNlZWRzLmdldCgwKSk7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBkbnMgMiB3aXRob3V0IG11bHRpcGxlIGlwcyBwZXIgcmVjb3JkCisgICAgICAgICAgICAvLworICAgICAgICAgICAgc2VlZFByb3ZpZGVyQXJncy5wdXQoU0VFRFNfS0VZLCBkbnNOYW1lMik7CisgICAgICAgICAgICAvLyByZXNvbHZlX211bHRpcGxlX2lwX2FkZHJlc3Nlc19wZXJfZG5zX3JlY29yZCBpcyBpbXBsaWNpdGx5IGZhbHNlIGhlcmUKKworICAgICAgICAgICAgZGVzY3JpcHRvck1vY2sud2hlbihEYXRhYmFzZURlc2NyaXB0b3I6OmxvYWRDb25maWcpLnRoZW5SZXR1cm4oZ2V0Q29uZmlnKHNlZWRQcm92aWRlckFyZ3MpKTsKKyAgICAgICAgICAgIHByb3ZpZGVyID0gbmV3IFNpbXBsZVNlZWRQcm92aWRlcihudWxsKTsKKyAgICAgICAgICAgIHNlZWRzID0gcHJvdmlkZXIuZ2V0U2VlZHMoKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlZWRzLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHNlZWRzLmNvbnRhaW5zKGFkZHJlc3MyKSk7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBkbnMgMSB3aXRoIG11bHRpcGxlIGlwcyBwZXIgcmVjb3JkCisgICAgICAgICAgICAvLworICAgICAgICAgICAgc2VlZFByb3ZpZGVyQXJncy5wdXQoU0VFRFNfS0VZLCBkbnNOYW1lMSk7CisgICAgICAgICAgICBzZWVkUHJvdmlkZXJBcmdzLnB1dChSRVNPTFZFX01VTFRJUExFX0lQX0FERFJFU1NFU19QRVJfRE5TX1JFQ09SRF9LRVksICJ0cnVlIik7CisKKyAgICAgICAgICAgIGRlc2NyaXB0b3JNb2NrLndoZW4oRGF0YWJhc2VEZXNjcmlwdG9yOjpsb2FkQ29uZmlnKS50aGVuUmV0dXJuKGdldENvbmZpZyhzZWVkUHJvdmlkZXJBcmdzKSk7CisgICAgICAgICAgICBwcm92aWRlciA9IG5ldyBTaW1wbGVTZWVkUHJvdmlkZXIobnVsbCk7CisgICAgICAgICAgICBzZWVkcyA9IHByb3ZpZGVyLmdldFNlZWRzKCk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBzZWVkcy5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFkZHJlc3MxLCBzZWVkcy5nZXQoMCkpOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gZG5zIDIgd2l0aCBtdWx0aXBsZSBpcHMgcGVyIHJlY29yZAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHNlZWRQcm92aWRlckFyZ3MucHV0KFNFRURTX0tFWSwgZG5zTmFtZTIpOworICAgICAgICAgICAgc2VlZFByb3ZpZGVyQXJncy5wdXQoUkVTT0xWRV9NVUxUSVBMRV9JUF9BRERSRVNTRVNfUEVSX0ROU19SRUNPUkRfS0VZLCAidHJ1ZSIpOworCisgICAgICAgICAgICBkZXNjcmlwdG9yTW9jay53aGVuKERhdGFiYXNlRGVzY3JpcHRvcjo6bG9hZENvbmZpZykudGhlblJldHVybihnZXRDb25maWcoc2VlZFByb3ZpZGVyQXJncykpOworICAgICAgICAgICAgcHJvdmlkZXIgPSBuZXcgU2ltcGxlU2VlZFByb3ZpZGVyKG51bGwpOworICAgICAgICAgICAgc2VlZHMgPSBwcm92aWRlci5nZXRTZWVkcygpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc2VlZHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc2VlZHMuY29udGFpbnNBbGwoYXNMaXN0KGFkZHJlc3MyLCBhZGRyZXNzMykpKTsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIGRucyAxIGFuZCBkbnMgMiB3aXRob3V0IG11bHRpcGxlIGlwcyBwZXIgcmVjb3JkCisgICAgICAgICAgICAvLworICAgICAgICAgICAgc2VlZFByb3ZpZGVyQXJncy5wdXQoU0VFRFNfS0VZLCBmb3JtYXQoIiVzLCVzIiwgZG5zTmFtZTEsIGRuc05hbWUyKSk7CisgICAgICAgICAgICBzZWVkUHJvdmlkZXJBcmdzLnB1dChSRVNPTFZFX01VTFRJUExFX0lQX0FERFJFU1NFU19QRVJfRE5TX1JFQ09SRF9LRVksICJmYWxzZSIpOworCisgICAgICAgICAgICBkZXNjcmlwdG9yTW9jay53aGVuKERhdGFiYXNlRGVzY3JpcHRvcjo6bG9hZENvbmZpZykudGhlblJldHVybihnZXRDb25maWcoc2VlZFByb3ZpZGVyQXJncykpOworICAgICAgICAgICAgcHJvdmlkZXIgPSBuZXcgU2ltcGxlU2VlZFByb3ZpZGVyKG51bGwpOworICAgICAgICAgICAgc2VlZHMgPSBwcm92aWRlci5nZXRTZWVkcygpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc2VlZHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc2VlZHMuY29udGFpbnNBbGwoYXNMaXN0KGFkZHJlc3MxLCBhZGRyZXNzMikpKTsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIGRucyAxIGFuZCBkbnMgMiB3aXRoIG11bHRpcGxlIGlwcyBwZXIgcmVjb3JkCisgICAgICAgICAgICAvLworICAgICAgICAgICAgc2VlZFByb3ZpZGVyQXJncy5wdXQoU0VFRFNfS0VZLCBmb3JtYXQoIiVzLCVzIiwgZG5zTmFtZTEsIGRuc05hbWUyKSk7CisgICAgICAgICAgICBzZWVkUHJvdmlkZXJBcmdzLnB1dChSRVNPTFZFX01VTFRJUExFX0lQX0FERFJFU1NFU19QRVJfRE5TX1JFQ09SRF9LRVksICJ0cnVlIik7CisKKyAgICAgICAgICAgIGRlc2NyaXB0b3JNb2NrLndoZW4oRGF0YWJhc2VEZXNjcmlwdG9yOjpsb2FkQ29uZmlnKS50aGVuUmV0dXJuKGdldENvbmZpZyhzZWVkUHJvdmlkZXJBcmdzKSk7CisgICAgICAgICAgICBwcm92aWRlciA9IG5ldyBTaW1wbGVTZWVkUHJvdmlkZXIobnVsbCk7CisgICAgICAgICAgICBzZWVkcyA9IHByb3ZpZGVyLmdldFNlZWRzKCk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCBzZWVkcy5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzZWVkcy5jb250YWluc0FsbChhc0xpc3QoYWRkcmVzczEsIGFkZHJlc3MyLCBhZGRyZXNzMykpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbmV0QWRkcmVzc0FuZFBvcnRNb2NrICE9IG51bGwpCisgICAgICAgICAgICAgICAgaW5ldEFkZHJlc3NBbmRQb3J0TW9jay5jbG9zZSgpOworCisgICAgICAgICAgICBpZiAoZGVzY3JpcHRvck1vY2sgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yTW9jay5jbG9zZSgpOworCisgICAgICAgICAgICBpZiAoZmJVdGlsaXRpZXNNb2NrICE9IG51bGwpCisgICAgICAgICAgICAgICAgZmJVdGlsaXRpZXNNb2NrLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBDb25maWcgZ2V0Q29uZmlnKE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykKKyAgICB7CisgICAgICAgIENvbmZpZyBjb25maWcgPSBuZXcgQ29uZmlnKCk7CisgICAgICAgIGNvbmZpZy5zZWVkX3Byb3ZpZGVyID0gbmV3IFBhcmFtZXRlcml6ZWRDbGFzcygpOworICAgICAgICBjb25maWcuc2VlZF9wcm92aWRlci5jbGFzc19uYW1lID0gU2ltcGxlU2VlZFByb3ZpZGVyLmNsYXNzLmdldE5hbWUoKTsKKyAgICAgICAgY29uZmlnLnNlZWRfcHJvdmlkZXIucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CisgICAgICAgIHJldHVybiBjb25maWc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvQ2xpZW50UmVxdWVzdFJvd0FuZENvbHVtbk1ldHJpY3NUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9DbGllbnRSZXF1ZXN0Um93QW5kQ29sdW1uTWV0cmljc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjRiMzg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvQ2xpZW50UmVxdWVzdFJvd0FuZENvbHVtbk1ldHJpY3NUZXN0LmphdmEKQEAgLTAsMCArMSw2MjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5T3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuQmF0Y2hTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29uc2lzdGVuY3lMZXZlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VQcm94eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLlBheG9zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5TaW1wbGVDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0Lm1lc3NhZ2VzLkJhdGNoTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQubWVzc2FnZXMuUXVlcnlNZXNzYWdlOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb24uQ1VSUkVOVDsKKworcHVibGljIGNsYXNzIENsaWVudFJlcXVlc3RSb3dBbmRDb2x1bW5NZXRyaWNzVGVzdCBleHRlbmRzIENRTFRlc3RlcgoreworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpCisgICAgeworICAgICAgICByZXF1aXJlTmV0d29yaygpOworICAgIH0KKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBjbGVhck1ldHJpY3MoKQorICAgIHsKKyAgICAgICAgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsUm93c1JlYWQuZGVjKENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NSZWFkLmdldENvdW50KCkpOworICAgICAgICBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zUmVhZC5kZWMoQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1JlYWQuZ2V0Q291bnQoKSk7CisgICAgICAgIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NXcml0dGVuLmRlYyhDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzV3JpdHRlbi5nZXRDb3VudCgpKTsKKyAgICAgICAgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1dyaXR0ZW4uZGVjKENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNXcml0dGVuLmdldENvdW50KCkpOworCisgICAgICAgIFN0b3JhZ2VQcm94eS5pbnN0YW5jZS5zZXRDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3NFbmFibGVkKHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkUmVhZE1ldHJpY3NGb3JNdWx0aVJvd1BhcnRpdGlvblNlbGVjdGlvbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAxLCAxKSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2KSBWQUxVRVMgKDEsIDIsIDIpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSAxIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NSZWFkLmdldENvdW50KCkpOworICAgICAgICAvLyBUaGUgcGFydGl0aW9uIGtleSBpcyBwcm92aWRlZCBieSB0aGUgY2xpZW50IGluIHRoZSByZXF1ZXN0LCBzbyB3ZSBkb24ndCBjb25zaWRlciB0aG9zZSBjb2x1bW5zIGFzIHJlYWQuCisgICAgICAgIGFzc2VydEVxdWFscyg0LCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zUmVhZC5nZXRDb3VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlY29yZFJlYWRNZXRyaWNzV2l0aE9ubHlQYXJ0aXRpb25LZXlJblNlbGVjdCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAxLCAxKSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2KSBWQUxVRVMgKDEsIDIsIDIpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHBrID0gMSIpOworCisgICAgICAgIGFzc2VydEVxdWFscygyLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzUmVhZC5nZXRDb3VudCgpKTsKKyAgICAgICAgLy8gVGhlIHBhcnRpdGlvbiBrZXkgaXMgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpbiB0aGUgcmVxdWVzdCwgc28gd2UgZG9uJ3QgY29uc2lkZXIgdGhhdCBjb2x1bW4gcmVhZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNSZWFkLmdldENvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkUmVhZE1ldHJpY3NXaXRoT25seUNsdXN0ZXJpbmdLZXlJblNlbGVjdCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAxLCAxKSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2KSBWQUxVRVMgKDEsIDIsIDIpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIlNFTEVDVCBjayBGUk9NICVzIFdIRVJFIHBrID0gMSIpOworCisgICAgICAgIGFzc2VydEVxdWFscygyLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzUmVhZC5nZXRDb3VudCgpKTsKKyAgICAgICAgLy8gVGhlIHBhcnRpdGlvbiBrZXkgaXMgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpbiB0aGUgcmVxdWVzdCwgc28gd2UgZG9uJ3QgY29uc2lkZXIgdGhhdCBjb2x1bW4gcmVhZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNSZWFkLmdldENvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkTm90UmVjb3JkUmVhZE1ldHJpY3NXaGVuRGlzYWJsZWQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBTdG9yYWdlUHJveHkuaW5zdGFuY2Uuc2V0Q2xpZW50UmVxdWVzdFNpemVNZXRyaWNzRW5hYmxlZChmYWxzZSk7CisKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjayBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkiKTsKKworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2KSBWQUxVRVMgKDEsIDEsIDEpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIklOU0VSVCBJTlRPICVzIChwaywgY2ssIHYpIFZBTFVFUyAoMSwgMiwgMikiKTsKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IDEiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsUm93c1JlYWQuZ2V0Q291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zUmVhZC5nZXRDb3VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlY29yZFJlYWRNZXRyaWNzV2l0aFNpbmdsZVJvd1NlbGVjdGlvbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAxLCAxKSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgY2sgPSAxIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NSZWFkLmdldENvdW50KCkpOworICAgICAgICAvLyBCb3RoIHRoZSBwYXJ0aXRpb24ga2V5IGFuZCBjbHVzdGVyaW5nIGtleSBhcmUgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpbiB0aGUgcmVxdWVzdC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNSZWFkLmdldENvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkUmVhZE1ldHJpY3NXaXRoU2xpY2VSZXN0cmljdGlvbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAxLCAxKSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgY2sgPiAwIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NSZWFkLmdldENvdW50KCkpOworICAgICAgICAvLyBUaGUgcGFydGl0aW9uIGtleSBpcyBzZWxlY3RlZCwgYnV0IHRoZSByZXN0cmljdGlvbiBvdmVyIHRoZSBjbHVzdGVyaW5nIGtleSBpcyBhIHNsaWNlLgorICAgICAgICBhc3NlcnRFcXVhbHMoMiwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1JlYWQuZ2V0Q291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRSZWNvcmRSZWFkTWV0cmljc1dpdGhJTlJlc3RyaWN0aW9uU2luZ2xlUGFydGl0aW9uKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjayBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkiKTsKKworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2KSBWQUxVRVMgKDEsIDEsIDEpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSAxIEFORCBjayBJTiAoMCwgMSkiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsUm93c1JlYWQuZ2V0Q291bnQoKSk7CisgICAgICAgIC8vIFRoZSBwYXJ0aXRpb24ga2V5IGFuZCBjbHVzdGVyaW5nIGtleSBhcmUgYm90aCBzZWxlY3RlZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNSZWFkLmdldENvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkUmVhZE1ldHJpY3NXaXRoSU5SZXN0cmljdGlvbk11bHRpcGxlUGFydGl0aW9ucygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAyLCAzKSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2KSBWQUxVRVMgKDQsIDUsIDYpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgSU4gKDEsIDQpIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NSZWFkLmdldENvdW50KCkpOworICAgICAgICAvLyBUaGUgcGFydGl0aW9uIGtleSBpcyBzZWxlY3RlZCwgYnV0IHRoZXJlIGlzIG5vIGNsdXN0ZXJpbmcgcmVzdHJpY3Rpb24uCisgICAgICAgIGFzc2VydEVxdWFscyg0LCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zUmVhZC5nZXRDb3VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlY29yZFJlYWRNZXRyaWNzRm9yTXVsdGlDb2x1bW5DbHVzdGVyaW5nUmVzdHJpY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBpbnQsIGNrMSBpbnQsIGNrMiBpbnQsIGNrMyBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrMSwgY2syLCBjazMpKSIpOworCisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIklOU0VSVCBJTlRPICVzIChwaywgY2sxLCBjazIsIGNrMywgdikgVkFMVUVTICgxLCAyLCAzLCA0LCA2KSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgY2sxID0gMiBBTkQgKGNrMiwgY2szKSA9ICgzLCA0KSIpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzUmVhZC5nZXRDb3VudCgpKTsKKyAgICAgICAgLy8gVGhlIGVudGlyZSBwcmltYXJ5IGtleSBpcyBzZWxlY3RlZCwgc28gb25seSBvbmUgdmFsdWUgaXMgYWN0dWFsbHkgcmVhZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNSZWFkLmdldENvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkUmVhZE1ldHJpY3NGb3JDbHVzdGVyaW5nU2xpY2UoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBpbnQsIGNrMSBpbnQsIGNrMiBpbnQsIGNrMyBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrMSwgY2syLCBjazMpKSIpOworCisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIklOU0VSVCBJTlRPICVzIChwaywgY2sxLCBjazIsIGNrMywgdikgVkFMVUVTICgxLCAyLCAzLCA0LCA2KSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgY2sxID0gMiBBTkQgY2syID0gMyBBTkQgY2szID49IDQiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsUm93c1JlYWQuZ2V0Q291bnQoKSk7CisgICAgICAgIC8vIFRoZSBsYXN0IGNsdXN0ZXJpbmcga2V5IGVsZW1lbnQgaXNuJ3QgYm91bmQsIHNvIGNvdW50IGl0IGFzIGJlaW5nIHJlYWQuCisgICAgICAgIGFzc2VydEVxdWFscygyLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zUmVhZC5nZXRDb3VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlY29yZFJlYWRNZXRyaWNzRm9yVG9rZW5BbmRDbHVzdGVyaW5nU2xpY2UoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBpbnQsIGNrMSBpbnQsIGNrMiBpbnQsIGNrMyBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrMSwgY2syLCBjazMpKSIpOworCisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIklOU0VSVCBJTlRPICVzIChwaywgY2sxLCBjazIsIGNrMywgdikgVkFMVUVTICgxLCAyLCAzLCA0LCA2KSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA9IHRva2VuKDEpIEFORCBjazEgPSAyIEFORCBjazIgPSAzIEFORCBjazMgPj0gNCBBTExPVyBGSUxURVJJTkciKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsUm93c1JlYWQuZ2V0Q291bnQoKSk7CisgICAgICAgIC8vIExhc3QgY2x1c3RlcmluZyBpcyBhIHNsaWNlLCBhbmQgdGhlIHBhcnRpdGlvbiBrZXkgaXMgcmVzdHJpY3RlZCBvbiB0b2tlbiwgc28gY291bnQgdGhlbSBhcyByZWFkLgorICAgICAgICBhc3NlcnRFcXVhbHMoMywgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1JlYWQuZ2V0Q291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRSZWNvcmRXcml0ZU1ldHJpY3NGb3JTaW5nbGVWYWx1ZVJvdygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAxLCAxKSIpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzV3JpdHRlbi5nZXRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNXcml0dGVuLmdldENvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkTm90UmVjb3JkV3JpdGVNZXRyaWNzV2hlbkRpc2FibGVkKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgU3RvcmFnZVByb3h5Lmluc3RhbmNlLnNldENsaWVudFJlcXVlc3RTaXplTWV0cmljc0VuYWJsZWQoZmFsc2UpOworCisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAxLCAxKSIpOworCisgICAgICAgIGFzc2VydEVxdWFscygwLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzV3JpdHRlbi5nZXRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNXcml0dGVuLmdldENvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkV3JpdGVNZXRyaWNzRm9yTXVsdGlWYWx1ZVJvdygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCBQUklNQVJZIEtFWSwgdjEgaW50LCB2MiBpbnQsIHYzIGludCkiKTsKKworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIHYxLCB2MiwgdjMpIFZBTFVFUyAoMSwgMiwgMywgNCkiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsUm93c1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zV3JpdHRlbi5nZXRDb3VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlY29yZFdyaXRlTWV0cmljc0ZvckJhdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50IFBSSU1BUlkgS0VZLCB2MSBpbnQsIHYyIGludCkiKTsKKworICAgICAgICB0cnkgKFNpbXBsZUNsaWVudCBjbGllbnQgPSBuZXcgU2ltcGxlQ2xpZW50KG5hdGl2ZUFkZHIuZ2V0SG9zdEFkZHJlc3MoKSwgbmF0aXZlUG9ydCwgQ1VSUkVOVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaWVudC5jb25uZWN0KGZhbHNlKTsKKworICAgICAgICAgICAgU3RyaW5nIGZpcnN0ID0gU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gJXMuJXMgKHBrLCB2MSwgdjIpIFZBTFVFUyAoMSwgMTAsIDEwMCkiLCBLRVlTUEFDRSwgY3VycmVudFRhYmxlKCkpOworICAgICAgICAgICAgU3RyaW5nIHNlY29uZCA9IFN0cmluZy5mb3JtYXQoIklOU0VSVCBJTlRPICVzLiVzIChwaywgdjEsIHYyKSBWQUxVRVMgKDIsIDIwLCAyMDApIiwgS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpKTsKKworICAgICAgICAgICAgTGlzdDxMaXN0PEJ5dGVCdWZmZXI+PiB2YWx1ZXMgPSBJbW11dGFibGVMaXN0Lm9mKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7CisgICAgICAgICAgICBCYXRjaE1lc3NhZ2UgYmF0Y2ggPSBuZXcgQmF0Y2hNZXNzYWdlKEJhdGNoU3RhdGVtZW50LlR5cGUuTE9HR0VELCBJbW11dGFibGVMaXN0Lm9mKGZpcnN0LCBzZWNvbmQpLCB2YWx1ZXMsIFF1ZXJ5T3B0aW9ucy5ERUZBVUxUKTsKKyAgICAgICAgICAgIGNsaWVudC5leGVjdXRlKGJhdGNoKTsKKworICAgICAgICAgICAgLy8gVGhlIG1ldHJpY3Mgc2hvdWxkIHJlZmxlY3QgdGhlIGJhdGNoIGFzIGEgc2luZ2xlIHdyaXRlIG9wZXJhdGlvbiB3aXRoIG11bHRpcGxlIHJvd3MgYW5kIGNvbHVtbnMuCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsUm93c1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNCwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlY29yZFdyaXRlTWV0cmljc0ZvckNlbGxEZWxldGVzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50IFBSSU1BUlkgS0VZLCB2MSBpbnQsIHYyIGludCwgdjMgaW50KSIpOworCisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIkRFTEVURSB2MSwgdjIsIHYzIEZST00gJXMgV0hFUkUgcGsgPSAxIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NXcml0dGVuLmdldENvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRSZWNvcmRXcml0ZU1ldHJpY3NGb3JDZWxsTnVsbHMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBpbnQgUFJJTUFSWSBLRVksIHYxIGludCwgdjIgaW50LCB2MyBpbnQpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCB2MSwgdjIsIHYzKSBWQUxVRVMgKDEsIG51bGwsIG51bGwsIG51bGwpIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NXcml0dGVuLmdldENvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRSZWNvcmRXcml0ZU1ldHJpY3NGb3JTaW5nbGVTdGF0aWNJbnNlcnQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBpbnQsIGNrIGludCwgdjAgaW50IHN0YXRpYywgdjEgaW50LCB2MiBpbnQsIFBSSU1BUlkgS0VZIChwaywgY2spKSIpOworCisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIklOU0VSVCBJTlRPICVzIChwaywgY2ssIHYwLCB2MSwgdjIpIFZBTFVFUyAoMCwgMSwgMiwgMywgNCkiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsUm93c1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zV3JpdHRlbi5nZXRDb3VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlY29yZFdyaXRlTWV0cmljc0ZvckJhdGNoZWRTdGF0aWNJbnNlcnRzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjayBpbnQsIHYwIGludCBzdGF0aWMsIHYxIGludCwgdjIgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkiKTsKKworICAgICAgICB0cnkgKFNpbXBsZUNsaWVudCBjbGllbnQgPSBuZXcgU2ltcGxlQ2xpZW50KG5hdGl2ZUFkZHIuZ2V0SG9zdEFkZHJlc3MoKSwgbmF0aXZlUG9ydCwgQ1VSUkVOVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaWVudC5jb25uZWN0KGZhbHNlKTsKKworICAgICAgICAgICAgU3RyaW5nIGZpcnN0ID0gU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gJXMuJXMgKHBrLCBjaywgdjAsIHYxLCB2MikgVkFMVUVTICgwLCAxLCAyLCAzLCA0KSIsIEtFWVNQQUNFLCBjdXJyZW50VGFibGUoKSk7CisgICAgICAgICAgICBTdHJpbmcgc2Vjb25kID0gU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gJXMuJXMgKHBrLCBjaywgdjAsIHYxLCB2MikgVkFMVUVTICgwLCAyLCAzLCA1LCA2KSIsIEtFWVNQQUNFLCBjdXJyZW50VGFibGUoKSk7CisKKyAgICAgICAgICAgIExpc3Q8TGlzdDxCeXRlQnVmZmVyPj4gdmFsdWVzID0gSW1tdXRhYmxlTGlzdC5vZihDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworICAgICAgICAgICAgQmF0Y2hNZXNzYWdlIGJhdGNoID0gbmV3IEJhdGNoTWVzc2FnZShCYXRjaFN0YXRlbWVudC5UeXBlLkxPR0dFRCwgSW1tdXRhYmxlTGlzdC5vZihmaXJzdCwgc2Vjb25kKSwgdmFsdWVzLCBRdWVyeU9wdGlvbnMuREVGQVVMVCk7CisgICAgICAgICAgICBjbGllbnQuZXhlY3V0ZShiYXRjaCk7CisKKyAgICAgICAgICAgIC8vIFR3byBub3JtYWwgcm93cyBhbmQgdGhlIHNpbmdsZSBzdGF0aWMgcm93OgorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NXcml0dGVuLmdldENvdW50KCkpOworICAgICAgICAgICAgLy8gVHdvIG5vcm1hbCBjb2x1bW5zIHBlciBpbnNlcnQsIGFuZCB0aGVuIG9uZSBjb2x1bW5zIGZvciB0aGUgc3RhdGljIHJvdzoKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg1LCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zV3JpdHRlbi5nZXRDb3VudCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkV3JpdGVNZXRyaWNzRm9yUm93RGVsZXRlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjayBpbnQsIHYwIGludCBzdGF0aWMsIHYxIGludCwgdjIgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkiKTsKKworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJERUxFVEUgRlJPTSAlcyBXSEVSRSBwayA9IDEgQU5EIGNrID0gMSIpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzV3JpdHRlbi5nZXRDb3VudCgpKTsKKyAgICAgICAgLy8gVGhlIGNvbHVtbnMgbWV0cmljIHNob3VsZCBhY2NvdW50IGZvciBhbGwgcmVndWxhciBjb2x1bW5zLgorICAgICAgICBhc3NlcnRFcXVhbHMoMiwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRSZWNvcmRXcml0ZU1ldHJpY3NGb3JSYW5nZURlbGV0ZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2MCBpbnQgc3RhdGljLCB2MSBpbnQsIHYyIGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSAxIEFORCBjayA+IDEiKTsKKworICAgICAgICAvLyBUaGUgcmFuZ2UgZGVsZXRlIGlzIGludGVuZGVkIHRvIGRlbGV0ZSBhdCBsZWFzdCBvbmUgcm93LCBidXQgdGhhdCBpcyBvbmx5IGEgbG93ZXIgYm91bmQuCisgICAgICAgIGFzc2VydEVxdWFscygxLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzV3JpdHRlbi5nZXRDb3VudCgpKTsKKyAgICAgICAgLy8gVGhlIGNvbHVtbnMgbWV0cmljIHNob3VsZCBhY2NvdW50IGZvciBhbGwgcmVndWxhciBjb2x1bW5zLgorICAgICAgICBhc3NlcnRFcXVhbHMoMiwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRSZWNvcmRXcml0ZU1ldHJpY3NGb3JQYXJ0aXRpb25EZWxldGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBpbnQsIGNrIGludCwgdjAgaW50IHN0YXRpYywgdjEgaW50LCB2MiBpbnQsIFBSSU1BUlkgS0VZIChwaywgY2spKSIpOworCisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIkRFTEVURSBGUk9NICVzIFdIRVJFIHBrID0gMSIpOworCisgICAgICAgIC8vIEEgcGFydGl0aW9uIGRlbGV0aW9uIGludGVuZHMgdG8gZGVsZXRlIGF0IGxlYXN0IG9uZSByb3cuCisgICAgICAgIGFzc2VydEVxdWFscygxLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzV3JpdHRlbi5nZXRDb3VudCgpKTsKKyAgICAgICAgLy8gSWYgd2UgZGVsZXRlIG9uZSByb3csIHdlIGludGVuZGVkIHRvIGRlbGV0ZSBhbGwgaXRzIHJlZ3VsYXIgYW5kIHN0YXRpYyBjb2x1bW5zLgorICAgICAgICBhc3NlcnRFcXVhbHMoMywgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRSZWNvcmRXcml0ZU1ldHJpY3NGb3JJbnRyYVJvd0JhdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjayBpbnQsIHYxIGludCwgdjIgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkiKTsKKworICAgICAgICB0cnkgKFNpbXBsZUNsaWVudCBjbGllbnQgPSBuZXcgU2ltcGxlQ2xpZW50KG5hdGl2ZUFkZHIuZ2V0SG9zdEFkZHJlc3MoKSwgbmF0aXZlUG9ydCwgQ1VSUkVOVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaWVudC5jb25uZWN0KGZhbHNlKTsKKworICAgICAgICAgICAgU3RyaW5nIGZpcnN0ID0gU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gJXMuJXMgKHBrLCBjaywgdjEsIHYyKSBWQUxVRVMgKDEsIDIsIDMsIDQpIiwgS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpKTsKKyAgICAgICAgICAgIFN0cmluZyBzZWNvbmQgPSBTdHJpbmcuZm9ybWF0KCJERUxFVEUgRlJPTSAlcy4lcyBXSEVSRSBwayA9IDEgQU5EIGNrID4gMSIsIEtFWVNQQUNFLCBjdXJyZW50VGFibGUoKSk7CisKKyAgICAgICAgICAgIExpc3Q8TGlzdDxCeXRlQnVmZmVyPj4gdmFsdWVzID0gSW1tdXRhYmxlTGlzdC5vZihDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworICAgICAgICAgICAgQmF0Y2hNZXNzYWdlIGJhdGNoID0gbmV3IEJhdGNoTWVzc2FnZShCYXRjaFN0YXRlbWVudC5UeXBlLkxPR0dFRCwgSW1tdXRhYmxlTGlzdC5vZihmaXJzdCwgc2Vjb25kKSwgdmFsdWVzLCBRdWVyeU9wdGlvbnMuREVGQVVMVCk7CisgICAgICAgICAgICBjbGllbnQuZXhlY3V0ZShiYXRjaCk7CisKKyAgICAgICAgICAgIC8vIEJvdGggb3BlcmF0aW9ucyBhZmZlY3QgdGhlIHNhbWUgcm93LCBidXQgd3JpdGVzIGFuZCBkZWxldGVzIGFyZSBkaXN0aW5jdC4KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzV3JpdHRlbi5nZXRDb3VudCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg0LCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zV3JpdHRlbi5nZXRDb3VudCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkV3JpdGVNZXRyaWNzRm9ySWZOb3RFeGlzdHNWMSgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFBheG9zLnNldFBheG9zVmFyaWFudChDb25maWcuUGF4b3NWYXJpYW50LnYxKTsKKyAgICAgICAgc2hvdWxkUmVjb3JkV3JpdGVNZXRyaWNzRm9ySWZOb3RFeGlzdHMoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlY29yZFdyaXRlTWV0cmljc0ZvcklmTm90RXhpc3RzVjIoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBQYXhvcy5zZXRQYXhvc1ZhcmlhbnQoQ29uZmlnLlBheG9zVmFyaWFudC52Mik7CisgICAgICAgIHNob3VsZFJlY29yZFdyaXRlTWV0cmljc0ZvcklmTm90RXhpc3RzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkV3JpdGVNZXRyaWNzRm9ySWZOb3RFeGlzdHMoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBpbnQgUFJJTUFSWSBLRVksIHYxIGludCwgdjIgaW50LCB2MyBpbnQpIik7CisKKyAgICAgICAgdHJ5IChTaW1wbGVDbGllbnQgY2xpZW50ID0gbmV3IFNpbXBsZUNsaWVudChuYXRpdmVBZGRyLmdldEhvc3RBZGRyZXNzKCksIG5hdGl2ZVBvcnQsIENVUlJFTlQpKQorICAgICAgICB7CisgICAgICAgICAgICBjbGllbnQuY29ubmVjdChmYWxzZSk7CisgICAgICAgICAgICBjbGllbnQuZXhlY3V0ZShuZXcgUXVlcnlNZXNzYWdlKFN0cmluZy5mb3JtYXQoIklOU0VSVCBJTlRPICVzLiVzIChwaywgdjEsIHYyLCB2MykgVkFMVUVTICgxLCAyLCAzLCA0KSBJRiBOT1QgRVhJU1RTIiwgS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpKSwgUXVlcnlPcHRpb25zLkRFRkFVTFQpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NXcml0dGVuLmdldENvdW50KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNXcml0dGVuLmdldENvdW50KCkpOworCisgICAgICAgICAgICAvLyBXZSByZWFkIGludGVybmFsbHksIGJ1dCBkb24ndCByZWZsZWN0IHRoYXQgaW4gb3VyIHJlYWQgbWV0cmljcy4KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzUmVhZC5nZXRDb3VudCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zUmVhZC5nZXRDb3VudCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkV3JpdGVNZXRyaWNzRm9yQ0FTVjEoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBQYXhvcy5zZXRQYXhvc1ZhcmlhbnQoQ29uZmlnLlBheG9zVmFyaWFudC52MSk7CisgICAgICAgIHNob3VsZFJlY29yZFdyaXRlTWV0cmljc0ZvckNBUygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkV3JpdGVNZXRyaWNzRm9yQ0FTVjIoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBQYXhvcy5zZXRQYXhvc1ZhcmlhbnQoQ29uZmlnLlBheG9zVmFyaWFudC52Mik7CisgICAgICAgIHNob3VsZFJlY29yZFdyaXRlTWV0cmljc0ZvckNBUygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlY29yZFdyaXRlTWV0cmljc0ZvckNBUygpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCBQUklNQVJZIEtFWSwgdjEgaW50LCB2MiBpbnQpIik7CisKKyAgICAgICAgdHJ5IChTaW1wbGVDbGllbnQgY2xpZW50ID0gbmV3IFNpbXBsZUNsaWVudChuYXRpdmVBZGRyLmdldEhvc3RBZGRyZXNzKCksIG5hdGl2ZVBvcnQsIENVUlJFTlQpKQorICAgICAgICB7CisgICAgICAgICAgICBjbGllbnQuY29ubmVjdChmYWxzZSk7CisgICAgICAgICAgICBjbGllbnQuZXhlY3V0ZShuZXcgUXVlcnlNZXNzYWdlKFN0cmluZy5mb3JtYXQoIklOU0VSVCBJTlRPICVzLiVzIChwaywgdjEsIHYyKSBWQUxVRVMgKDEsIDIsIDMpIiwgS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpKSwgUXVlcnlPcHRpb25zLkRFRkFVTFQpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NXcml0dGVuLmdldENvdW50KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNXcml0dGVuLmdldENvdW50KCkpOworCisgICAgICAgICAgICBjbGllbnQuZXhlY3V0ZShuZXcgUXVlcnlNZXNzYWdlKFN0cmluZy5mb3JtYXQoIlVQREFURSAlcy4lcyBTRVQgdjIgPSA0IFdIRVJFIHBrID0gMSBJRiB2MSA9IDIiLCBLRVlTUEFDRSwgY3VycmVudFRhYmxlKCkpLCBRdWVyeU9wdGlvbnMuREVGQVVMVCkpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisKKyAgICAgICAgICAgIC8vIFdlIHJlYWQgaW50ZXJuYWxseSwgYnV0IGRvbid0IHJlZmxlY3QgdGhhdCBpbiBvdXIgcmVhZCBtZXRyaWNzLgorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NSZWFkLmdldENvdW50KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNSZWFkLmdldENvdW50KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGROb3RSZWNvcmRXcml0ZU1ldHJpY3NGb3JGYWlsZWRDQVNWMSgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFBheG9zLnNldFBheG9zVmFyaWFudChDb25maWcuUGF4b3NWYXJpYW50LnYxKTsKKyAgICAgICAgc2hvdWxkTm90UmVjb3JkV3JpdGVNZXRyaWNzRm9yRmFpbGVkQ0FTKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGROb3RSZWNvcmRXcml0ZU1ldHJpY3NGb3JGYWlsZWRDQVNWMigpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFBheG9zLnNldFBheG9zVmFyaWFudChDb25maWcuUGF4b3NWYXJpYW50LnYyKTsKKyAgICAgICAgc2hvdWxkTm90UmVjb3JkV3JpdGVNZXRyaWNzRm9yRmFpbGVkQ0FTKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2hvdWxkTm90UmVjb3JkV3JpdGVNZXRyaWNzRm9yRmFpbGVkQ0FTKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50IFBSSU1BUlkgS0VZLCB2MSBpbnQsIHYyIGludCkiKTsKKworICAgICAgICB0cnkgKFNpbXBsZUNsaWVudCBjbGllbnQgPSBuZXcgU2ltcGxlQ2xpZW50KG5hdGl2ZUFkZHIuZ2V0SG9zdEFkZHJlc3MoKSwgbmF0aXZlUG9ydCwgQ1VSUkVOVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaWVudC5jb25uZWN0KGZhbHNlKTsKKyAgICAgICAgICAgIGNsaWVudC5leGVjdXRlKG5ldyBRdWVyeU1lc3NhZ2UoU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gJXMuJXMgKHBrLCB2MSwgdjIpIFZBTFVFUyAoMSwgMiwgMykiLCBLRVlTUEFDRSwgY3VycmVudFRhYmxlKCkpLCBRdWVyeU9wdGlvbnMuREVGQVVMVCkpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsUm93c1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisKKyAgICAgICAgICAgIGNsaWVudC5leGVjdXRlKG5ldyBRdWVyeU1lc3NhZ2UoU3RyaW5nLmZvcm1hdCgiVVBEQVRFICVzLiVzIFNFVCB2MiA9IDQgV0hFUkUgcGsgPSAxIElGIHYxID0gNCIsIEtFWVNQQUNFLCBjdXJyZW50VGFibGUoKSksIFF1ZXJ5T3B0aW9ucy5ERUZBVUxUKSk7CisKKyAgICAgICAgICAgIC8vIFdlIGRpZG4ndCBhY3R1YWxseSB3cml0ZSBhbnl0aGluZywgc28gZG9uJ3QgcmVmbGVjdCBhIHdyaXRlIGFnYWluc3QgdGhlIG1ldHJpY3MuCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisKKyAgICAgICAgICAgIC8vIERvbid0IHJlZmxlY3QgaW4gb3VyIHJlYWQgbWV0cmljcyB0aGUgcmVzdWx0IHJldHVybmVkIHRvIHRoZSBjbGllbnQgYnkgdGhlIGZhaWxlZCBDQVMgd3JpdGUuIAorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NSZWFkLmdldENvdW50KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNSZWFkLmdldENvdW50KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRSZWNvcmRSZWFkTWV0cmljc09uU2VyaWFsUmVhZFYxKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUGF4b3Muc2V0UGF4b3NWYXJpYW50KENvbmZpZy5QYXhvc1ZhcmlhbnQudjEpOworICAgICAgICBzaG91bGRSZWNvcmRSZWFkTWV0cmljc09uU2VyaWFsUmVhZCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkUmVhZE1ldHJpY3NPblNlcmlhbFJlYWRWMigpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFBheG9zLnNldFBheG9zVmFyaWFudChDb25maWcuUGF4b3NWYXJpYW50LnYyKTsKKyAgICAgICAgc2hvdWxkUmVjb3JkUmVhZE1ldHJpY3NPblNlcmlhbFJlYWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRSZWNvcmRSZWFkTWV0cmljc09uU2VyaWFsUmVhZCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgdHJ5IChTaW1wbGVDbGllbnQgY2xpZW50ID0gbmV3IFNpbXBsZUNsaWVudChuYXRpdmVBZGRyLmdldEhvc3RBZGRyZXNzKCksIG5hdGl2ZVBvcnQsIENVUlJFTlQpKQorICAgICAgICB7CisgICAgICAgICAgICBjbGllbnQuY29ubmVjdChmYWxzZSk7CisgICAgICAgICAgICBjbGllbnQuZXhlY3V0ZShuZXcgUXVlcnlNZXNzYWdlKFN0cmluZy5mb3JtYXQoIklOU0VSVCBJTlRPICVzLiVzIChwaywgY2ssIHYpIFZBTFVFUyAoMSwgMSwgMSkiLCBLRVlTUEFDRSwgY3VycmVudFRhYmxlKCkpLCBRdWVyeU9wdGlvbnMuREVGQVVMVCkpOworCisgICAgICAgICAgICBRdWVyeU1lc3NhZ2UgcXVlcnkgPSBuZXcgUXVlcnlNZXNzYWdlKFN0cmluZy5mb3JtYXQoIlNFTEVDVCAqIEZST00gJXMuJXMgV0hFUkUgcGsgPSAxIEFORCBjayA9IDEiLCBLRVlTUEFDRSwgY3VycmVudFRhYmxlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWVyeU9wdGlvbnMuZm9ySW50ZXJuYWxDYWxscyhDb25zaXN0ZW5jeUxldmVsLlNFUklBTCwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpKTsKKyAgICAgICAgICAgIGNsaWVudC5leGVjdXRlKHF1ZXJ5KTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NSZWFkLmdldENvdW50KCkpOworCisgICAgICAgICAgICAvLyBCb3RoIHRoZSBwYXJ0aXRpb24ga2V5IGFuZCBjbHVzdGVyaW5nIGtleSBhcmUgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpbiB0aGUgcmVxdWVzdC4KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zUmVhZC5nZXRDb3VudCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkUmVhZE1ldHJpY3NGb3JHbG9iYWxJbmRleFF1ZXJ5KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjayBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkiKTsKKyAgICAgICAgY3JlYXRlSW5kZXgoIkNSRUFURSBJTkRFWCBvbiAlcyAodikiKTsKKworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2KSBWQUxVRVMgKDEsIDEsIDEpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIklOU0VSVCBJTlRPICVzIChwaywgY2ssIHYpIFZBTFVFUyAoMiwgMiwgMikiKTsKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB2ID0gMSIpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzUmVhZC5nZXRDb3VudCgpKTsKKyAgICAgICAgLy8gVGhlIGluZGV4IHNlYXJjaCB0ZXJtIGlzIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgaW4gdGhlIHJlcXVlc3QsIHNvIHdlIGRvbid0IGNvbnNpZGVyIHRoYXQgY29sdW1uIHJlYWQuCisgICAgICAgIGFzc2VydEVxdWFscygyLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zUmVhZC5nZXRDb3VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlY29yZFJlYWRNZXRyaWNzRm9yUGFydGl0aW9uUmVzdHJpY3RlZEluZGV4UXVlcnkoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBpbnQsIGNrIGludCwgdiBpbnQsIFBSSU1BUlkgS0VZIChwaywgY2spKSIpOworICAgICAgICBjcmVhdGVJbmRleCgiQ1JFQVRFIElOREVYIG9uICVzICh2KSIpOworCisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIklOU0VSVCBJTlRPICVzIChwaywgY2ssIHYpIFZBTFVFUyAoMSwgMSwgMSkiKTsKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAyLCAyKSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgdiA9IDEiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsUm93c1JlYWQuZ2V0Q291bnQoKSk7CisgICAgICAgIC8vIFRoZSBwYXJ0aXRpb24ga2V5IGFuZCBpbmRleCBzZWFyY2ggdGVybSBhcmUgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgc28gd2UgZG9uJ3QgY29uc2lkZXIgdGhvc2UgY29sdW1ucyByZWFkLgorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1JlYWQuZ2V0Q291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRSZWNvcmRSZWFkTWV0cmljc0ZvckNsdXN0ZXJpbmdLZXlJbmRleFF1ZXJ5KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjayBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkiKTsKKyAgICAgICAgY3JlYXRlSW5kZXgoIkNSRUFURSBJTkRFWCBvbiAlcyAoY2spIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAxLCAxKSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2KSBWQUxVRVMgKDEsIDIsIDIpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgY2sgPSAyIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NSZWFkLmdldENvdW50KCkpOworICAgICAgICAvLyBUaGUgaW5kZXggc2VhcmNoIHRlcm0gaXMgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpbiB0aGUgcmVxdWVzdCwgc28gd2UgZG9uJ3QgY29uc2lkZXIgdGhhdCBjb2x1bW4gcmVhZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNSZWFkLmdldENvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkUmVhZE1ldHJpY3NGb3JGaWx0ZXJpbmdRdWVyeSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAxLCAxKSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2KSBWQUxVRVMgKDIsIDIsIDIpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdiA9IDEgQUxMT1cgRklMVEVSSU5HIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NSZWFkLmdldENvdW50KCkpOworICAgICAgICAvLyBUaGUgZmlsdGVyaW5nIHRlcm0gaXMgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpbiB0aGUgcmVxdWVzdCwgc28gd2UgZG9uJ3QgY29uc2lkZXIgdGhhdCBjb2x1bW4gcmVhZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNSZWFkLmdldENvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkUmVhZE1ldHJpY3NGb3JSYW5nZUZpbHRlcmluZ1F1ZXJ5KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjayBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkiKTsKKworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2KSBWQUxVRVMgKDEsIDEsIDEpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIklOU0VSVCBJTlRPICVzIChwaywgY2ssIHYpIFZBTFVFUyAoMiwgMiwgMikiKTsKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB2ID4gMSBBTExPVyBGSUxURVJJTkciKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsUm93c1JlYWQuZ2V0Q291bnQoKSk7CisgICAgICAgIC8vIFRoZSB2YWx1ZSBjb2x1bW4gaXMgcmVzdHJpY3RlZCBvdmVyIGEgcmFuZ2UsIG5vdCBib3VuZCB0byBhIHBhcnRpY3VsYXIgdmFsdWUuCisgICAgICAgIGFzc2VydEVxdWFscygzLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zUmVhZC5nZXRDb3VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlY29yZFJlYWRNZXRyaWNzRm9ySU5GaWx0ZXJpbmdRdWVyeSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAxLCAxKSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2KSBWQUxVRVMgKDIsIDIsIDIpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdiBJTiAoMSkgQUxMT1cgRklMVEVSSU5HIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NSZWFkLmdldENvdW50KCkpOworICAgICAgICAvLyBUaGUgZmlsdGVyaW5nIHRlcm0gaXMgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpbiB0aGUgcmVxdWVzdCwgc28gd2UgZG9uJ3QgY29uc2lkZXIgdGhhdCBjb2x1bW4gcmVhZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNSZWFkLmdldENvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkUmVhZE1ldHJpY3NGb3JDb250YWluc1F1ZXJ5KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjayBpbnQsIHYgc2V0PGludD4sIFBSSU1BUlkgS0VZIChwaywgY2spKSIpOworCisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIklOU0VSVCBJTlRPICVzIChwaywgY2ssIHYpIFZBTFVFUyAoMSwgMSwgezEsIDIsIDN9ICkiKTsKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgyLCAyLCB7NCwgNSwgNn0pIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdiBDT05UQUlOUyAxIEFMTE9XIEZJTFRFUklORyIpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzUmVhZC5nZXRDb3VudCgpKTsKKyAgICAgICAgLy8gVGhlIGZpbHRlcmluZyB0ZXJtIGlzIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgaW4gdGhlIHJlcXVlc3QsIHNvIHdlIGRvbid0IGNvbnNpZGVyIHRoYXQgY29sdW1uIHJlYWQuCisgICAgICAgIGFzc2VydEVxdWFscygyLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zUmVhZC5nZXRDb3VudCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9TYW1wbGVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvU2FtcGxlclRlc3QuamF2YQppbmRleCBkYmExOWEzLi44NjJhYmJiIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9TYW1wbGVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL1NhbXBsZXJUZXN0LmphdmEKQEAgLTc5LDcgKzc5LDEyIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGJlZ2luU2FtcGxpbmcoaW50IGNhcGFjaXR5LCBpbnQgZHVyYXRpb25NaWxsaXMpCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGJlZ2luU2FtcGxpbmcoaW50IGNhcGFjaXR5LCBsb25nIGR1cmF0aW9uTWlsbGlzKQogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9UYWJsZU1ldHJpY3NUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9UYWJsZU1ldHJpY3NUZXN0LmphdmEKaW5kZXggNGM5ZGU3Ny4uYmJjY2VkNCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvVGFibGVNZXRyaWNzVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL1RhYmxlTWV0cmljc1Rlc3QuamF2YQpAQCAtMTksMTAgKzE5LDEyIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuVW5pbnRlcnJ1cHRpYmxlczsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CkBAIC0zNiw2ICszOCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuRW1iZWRkZWRDYXNzYW5kcmFTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKQEAgLTQ3LDYgKzUwLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0UgPSAianVuaXQiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRSA9ICJ0YWJsZW1ldHJpY3N0ZXN0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09VTlRFUl9UQUJMRSA9ICJ0YWJsZW1ldHJpY3Njb3VudGVydGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRXQ1NfVEFCTEUgPSAidGFibGVtZXRyaWNzdGVzdHR3Y3MiOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgRW1iZWRkZWRDYXNzYW5kcmFTZXJ2aWNlIGNhc3NhbmRyYTsKICAgICBwcml2YXRlIHN0YXRpYyBDbHVzdGVyIGNsdXN0ZXI7CkBAIC02OCw2ICs3MiwxNSBAQAogICAgICAgICByZXR1cm4gcmVjcmVhdGVUYWJsZShUQUJMRSk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBDb2x1bW5GYW1pbHlTdG9yZSByZWNyZWF0ZVRXQ1NUYWJsZSgpCisgICAgeworICAgICAgICBzZXNzaW9uLmV4ZWN1dGUoU3RyaW5nLmZvcm1hdCgiRFJPUCBUQUJMRSBJRiBFWElTVFMgJXMuJXMiLCBLRVlTUEFDRSwgVFdDU19UQUJMRSkpOworICAgICAgICBzZXNzaW9uLmV4ZWN1dGUoU3RyaW5nLmZvcm1hdCgiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJXMuJXMgKGlkIGludCwgdmFsMSB0ZXh0LCB2YWwyIHRleHQsIFBSSU1BUlkgS0VZKGlkLCB2YWwxKSkgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgV0lUSCBjb21wYWN0aW9uID0geydjbGFzcyc6ICdUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5JywgJ2NvbXBhY3Rpb25fd2luZG93X3VuaXQnOiAnTUlOVVRFUycsICdjb21wYWN0aW9uX3dpbmRvd19zaXplJzogMX07IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZU1BBQ0UsIFRXQ1NfVEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIENvbHVtbkZhbWlseVN0b3JlLmdldElmRXhpc3RzKEtFWVNQQUNFLCBUV0NTX1RBQkxFKTsKKyAgICB9CisKICAgICBwcml2YXRlIENvbHVtbkZhbWlseVN0b3JlIHJlY3JlYXRlVGFibGUoU3RyaW5nIHRhYmxlKQogICAgIHsKICAgICAgICAgc2Vzc2lvbi5leGVjdXRlKFN0cmluZy5mb3JtYXQoIkRST1AgVEFCTEUgSUYgRVhJU1RTICVzLiVzIiwgS0VZU1BBQ0UsIHRhYmxlKSk7CkBAIC0xMzAsNiArMTQzLDM3IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF4U1NUYWJsZVNpemUoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSByZWNyZWF0ZVRhYmxlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBjZnMubWV0cmljLm1heFNTVGFibGVTaXplLmdldFZhbHVlKCkubG9uZ1ZhbHVlKCkpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBzZXNzaW9uLmV4ZWN1dGUoU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gJXMuJXMgKGlkLCB2YWwxLCB2YWwyKSBWQUxVRVMgKCVkLCAnJXMnLCAnJXMnKSIsIEtFWVNQQUNFLCBUQUJMRSwgaSwgInZhbCIgKyBpLCAidmFsIiArIGkpKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmZvcmNlS2V5c3BhY2VGbHVzaChLRVlTUEFDRSk7CisKKyAgICAgICAgYXNzZXJ0R3JlYXRlclRoYW4oY2ZzLm1ldHJpYy5tYXhTU1RhYmxlU2l6ZS5nZXRWYWx1ZSgpLmRvdWJsZVZhbHVlKCksIDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1heFNTVGFibGVEdXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IHJlY3JlYXRlVFdDU1RhYmxlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBjZnMubWV0cmljLm1heFNTVGFibGVEdXJhdGlvbi5nZXRWYWx1ZSgpLmxvbmdWYWx1ZSgpKTsKKworICAgICAgICBzZXNzaW9uLmV4ZWN1dGUoU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gJXMuJXMgKGlkLCB2YWwxLCB2YWwyKSBWQUxVRVMgKCVkLCAnJXMnLCAnJXMnKSIsIEtFWVNQQUNFLCBUV0NTX1RBQkxFLCAxLCAidmFsMSIsICJ2YWwxIikpOworICAgICAgICBVbmludGVycnVwdGlibGVzLnNsZWVwVW5pbnRlcnJ1cHRpYmx5KDEwLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgc2Vzc2lvbi5leGVjdXRlKFN0cmluZy5mb3JtYXQoIklOU0VSVCBJTlRPICVzLiVzIChpZCwgdmFsMSwgdmFsMikgVkFMVUVTICglZCwgJyVzJywgJyVzJykiLCBLRVlTUEFDRSwgVFdDU19UQUJMRSwgMiwgInZhbDIiLCAidmFsMiIpKTsKKworICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5mb3JjZUtleXNwYWNlRmx1c2goS0VZU1BBQ0UpOworCisgICAgICAgIGFzc2VydEdyZWF0ZXJUaGFuKGNmcy5tZXRyaWMubWF4U1NUYWJsZUR1cmF0aW9uLmdldFZhbHVlKCkuZG91YmxlVmFsdWUoKSwgMCk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlcGFyZWRTdGF0ZW1lbnRzRXhlY3V0ZWQoKQogICAgIHsKICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gcmVjcmVhdGVUYWJsZSgpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvVHJpZU1lbXRhYmxlTWV0cmljc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL1RyaWVNZW10YWJsZU1ldHJpY3NUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJkOGY3YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL1RyaWVNZW10YWJsZU1ldHJpY3NUZXN0LmphdmEKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkNsdXN0ZXI7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLk92ZXJyaWRlQ29uZmlndXJhdGlvbkxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5FbWJlZGRlZENhc3NhbmRyYVNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKK2ltcG9ydCBvcmcuamJvc3MuYnl0ZW1hbi5jb250cmliLmJtdW5pdC5CTVJ1bGU7CitpbXBvcnQgb3JnLmpib3NzLmJ5dGVtYW4uY29udHJpYi5ibXVuaXQuQk1SdWxlczsKK2ltcG9ydCBvcmcuamJvc3MuYnl0ZW1hbi5jb250cmliLmJtdW5pdC5CTVVuaXRSdW5uZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5NRU1UQUJMRV9TSEFSRF9DT1VOVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLio7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworQFJ1bldpdGgoQk1Vbml0UnVubmVyLmNsYXNzKQorcHVibGljIGNsYXNzIFRyaWVNZW10YWJsZU1ldHJpY3NUZXN0IGV4dGVuZHMgU2NoZW1hTG9hZGVyCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9TSEFSRFMgPSAxMzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUcmllTWVtdGFibGVNZXRyaWNzVGVzdC5jbGFzcyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgU2Vzc2lvbiBzZXNzaW9uOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFID0gInRyaWVtZW10YWJsZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFID0gIm1ldHJpY3N0ZXN0IjsKKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIHNoYWRvdyBzdXBlcmNsYXNzIG1ldGhvZDsgd2UnbGwgY2FsbCBpdCBkaXJlY3RseQorICAgICAgICAvLyBhZnRlciB0aW5rZXJpbmcgd2l0aCB0aGUgQ29uZmlnCisgICAgfQorCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBPdmVycmlkZUNvbmZpZ3VyYXRpb25Mb2FkZXIub3ZlcnJpZGUoKGNvbmZpZykgLT4geworICAgICAgICAgICAgY29uZmlnLnBhcnRpdGlvbmVyID0gIk11cm11cjNQYXJ0aXRpb25lciI7CisgICAgICAgIH0pOworICAgICAgICBNRU1UQUJMRV9TSEFSRF9DT1VOVC5zZXRJbnQoTlVNX1NIQVJEUyk7CisKKyAgICAgICAgU2NoZW1hTG9hZGVyLmxvYWRTY2hlbWEoKTsKKworICAgICAgICBFbWJlZGRlZENhc3NhbmRyYVNlcnZpY2UgY2Fzc2FuZHJhID0gbmV3IEVtYmVkZGVkQ2Fzc2FuZHJhU2VydmljZSgpOworICAgICAgICBjYXNzYW5kcmEuc3RhcnQoKTsKKworICAgICAgICBDbHVzdGVyIGNsdXN0ZXIgPSBDbHVzdGVyLmJ1aWxkZXIoKS5hZGRDb250YWN0UG9pbnQoIjEyNy4wLjAuMSIpLndpdGhQb3J0KERhdGFiYXNlRGVzY3JpcHRvci5nZXROYXRpdmVUcmFuc3BvcnRQb3J0KCkpLmJ1aWxkKCk7CisgICAgICAgIHNlc3Npb24gPSBjbHVzdGVyLmNvbm5lY3QoKTsKKworICAgICAgICBzZXNzaW9uLmV4ZWN1dGUoU3RyaW5nLmZvcm1hdCgiQ1JFQVRFIEtFWVNQQUNFIElGIE5PVCBFWElTVFMgJXMgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InIDogMSB9OyIsIEtFWVNQQUNFKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb2x1bW5GYW1pbHlTdG9yZSByZWNyZWF0ZVRhYmxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiByZWNyZWF0ZVRhYmxlKFRBQkxFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbHVtbkZhbWlseVN0b3JlIHJlY3JlYXRlVGFibGUoU3RyaW5nIHRhYmxlKQorICAgIHsKKyAgICAgICAgc2Vzc2lvbi5leGVjdXRlKFN0cmluZy5mb3JtYXQoIkRST1AgVEFCTEUgSUYgRVhJU1RTICVzLiVzIiwgS0VZU1BBQ0UsIHRhYmxlKSk7CisgICAgICAgIHNlc3Npb24uZXhlY3V0ZShTdHJpbmcuZm9ybWF0KCJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAlcy4lcyAoaWQgaW50LCB2YWwxIHRleHQsIHZhbDIgdGV4dCwgUFJJTUFSWSBLRVkoaWQsIHZhbDEpKSBXSVRIIE1FTVRBQkxFID0gJ3Rlc3RfbWVtdGFibGVfbWV0cmljcyc7IiwgS0VZU1BBQ0UsIHRhYmxlKSk7CisgICAgICAgIHJldHVybiBDb2x1bW5GYW1pbHlTdG9yZS5nZXRJZkV4aXN0cyhLRVlTUEFDRSwgdGFibGUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlZ3VsYXJTdGF0ZW1lbnRzQXJlQ291bnRlZCgpCisgICAgeworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSByZWNyZWF0ZVRhYmxlKCk7CisgICAgICAgIFRyaWVNZW10YWJsZU1ldHJpY3NWaWV3IG1ldHJpY3MgPSBnZXRNZW10YWJsZU1ldHJpY3MoY2ZzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1ldHJpY3MuY29udGVuZGVkUHV0cy5nZXRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1ldHJpY3MudW5jb250ZW5kZWRQdXRzLmdldENvdW50KCkpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgc2Vzc2lvbi5leGVjdXRlKFN0cmluZy5mb3JtYXQoIklOU0VSVCBJTlRPICVzLiVzIChpZCwgdmFsMSwgdmFsMikgVkFMVUVTICglZCwgJyVzJywgJyVzJykiLCBLRVlTUEFDRSwgVEFCTEUsIGksICJ2YWwiICsgaSwgInZhbCIgKyBpKSk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIGFsbFB1dHMgPSBtZXRyaWNzLmNvbnRlbmRlZFB1dHMuZ2V0Q291bnQoKSArIG1ldHJpY3MudW5jb250ZW5kZWRQdXRzLmdldENvdW50KCk7CisgICAgICAgIGFzc2VydEVxdWFscygxMCwgYWxsUHV0cyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rmx1c2hSZWxhdGVkTWV0cmljcygpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gcmVjcmVhdGVUYWJsZSgpOworICAgICAgICBUcmllTWVtdGFibGVNZXRyaWNzVmlldyBtZXRyaWNzID0gZ2V0TWVtdGFibGVNZXRyaWNzKGNmcyk7CisKKyAgICAgICAgU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuZm9yY2VLZXlzcGFjZUZsdXNoKEtFWVNQQUNFLCBUQUJMRSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtZXRyaWNzLmNvbnRlbmRlZFB1dHMuZ2V0Q291bnQoKSArIG1ldHJpY3MudW5jb250ZW5kZWRQdXRzLmdldENvdW50KCkpOworCisgICAgICAgIHdyaXRlQW5kRmx1c2goMTApOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIG1ldHJpY3MuY29udGVuZGVkUHV0cy5nZXRDb3VudCgpICsgbWV0cmljcy51bmNvbnRlbmRlZFB1dHMuZ2V0Q291bnQoKSk7CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoYXQgbWV0cmljcyBzdXJ2aXZlIGZsdXNoIC8gbWVtdGFibGUgc3dpdGNoaW5nCisgICAgICAgIHdyaXRlQW5kRmx1c2goMTApOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAsIG1ldHJpY3MuY29udGVuZGVkUHV0cy5nZXRDb3VudCgpICsgbWV0cmljcy51bmNvbnRlbmRlZFB1dHMuZ2V0Q291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtZXRyaWNzLmxhc3RGbHVzaFNoYXJkRGF0YVNpemVzLnRvU3RyaW5nKCksIE5VTV9TSEFSRFMsIG1ldHJpY3MubGFzdEZsdXNoU2hhcmREYXRhU2l6ZXMubnVtU2FtcGxlc0dhdWdlLmdldFZhbHVlKCkuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQk1SdWxlcyhydWxlcyA9IHsgQEJNUnVsZShuYW1lID0gIkRlbGF5IG1lbXRhYmxlIHVwZGF0ZSIsCisgICAgdGFyZ2V0Q2xhc3MgPSAiSW5NZW1vcnlUcmllIiwKKyAgICB0YXJnZXRNZXRob2QgPSAicHV0U2luZ2xldG9uIiwKKyAgICBhY3Rpb24gPSAiamF2YS5sYW5nLlRocmVhZC5zbGVlcCgxMCkiKX0pCisgICAgcHVibGljIHZvaWQgdGVzdENvbnRlbnRpb25NZXRyaWNzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSByZWNyZWF0ZVRhYmxlKCk7CisgICAgICAgIFRyaWVNZW10YWJsZU1ldHJpY3NWaWV3IG1ldHJpY3MgPSBnZXRNZW10YWJsZU1ldHJpY3MoY2ZzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIChpbnQpIG1ldHJpY3MubGFzdEZsdXNoU2hhcmREYXRhU2l6ZXMubnVtU2FtcGxlc0dhdWdlLmdldFZhbHVlKCkpOworCisgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmZvcmNlS2V5c3BhY2VGbHVzaChLRVlTUEFDRSwgVEFCTEUpOworCisgICAgICAgIHdyaXRlQW5kRmx1c2goMTAwKTsKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBtZXRyaWNzLmNvbnRlbnRpb25UaW1lLmxhdGVuY3kuZ2V0U25hcHNob3QoKS5kdW1wKHN0cmVhbSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgbWV0cmljcy5jb250ZW5kZWRQdXRzLmdldENvdW50KCkgKyBtZXRyaWNzLnVuY29udGVuZGVkUHV0cy5nZXRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtZXRyaWNzLmNvbnRlbmRlZFB1dHMuZ2V0Q291bnQoKSwgZ3JlYXRlclRoYW4oMEwpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtZXRyaWNzLmNvbnRlbnRpb25UaW1lLnRvdGFsTGF0ZW5jeS5nZXRDb3VudCgpLCBncmVhdGVyVGhhbigwTCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1ldHJpY3NDbGVhbnVwT25Ecm9wKCkKKyAgICB7CisgICAgICAgIFN0cmluZyB0YWJsZU5hbWUgPSBUQUJMRSArICJfbWV0cmljc19jbGVhbnVwIjsKKyAgICAgICAgQ2Fzc2FuZHJhTWV0cmljc1JlZ2lzdHJ5IHJlZ2lzdHJ5ID0gQ2Fzc2FuZHJhTWV0cmljc1JlZ2lzdHJ5Lk1ldHJpY3M7CisgICAgICAgIFN1cHBsaWVyPFN0cmVhbTxTdHJpbmc+PiBtZXRyaWNzID0gKCkgLT4gcmVnaXN0cnkuZ2V0TmFtZXMoKS5zdHJlYW0oKS5maWx0ZXIobSAtPiBtLmNvbnRhaW5zKHRhYmxlTmFtZSkpOworCisgICAgICAgIC8vIG5vIG1ldHJpY3MgYmVmb3JlIGNyZWF0aW5nCisgICAgICAgIGFzc2VydEVxdWFscygwLCBtZXRyaWNzLmdldCgpLmNvdW50KCkpOworCisgICAgICAgIHJlY3JlYXRlVGFibGUodGFibGVOYW1lKTsKKyAgICAgICAgLy8gc29tZSBtZXRyaWNzCisgICAgICAgIGFzc2VydFRydWUobWV0cmljcy5nZXQoKS5jb3VudCgpID4gMCk7CisKKyAgICAgICAgc2Vzc2lvbi5leGVjdXRlKFN0cmluZy5mb3JtYXQoIkRST1AgVEFCTEUgSUYgRVhJU1RTICVzLiVzIiwgS0VZU1BBQ0UsIHRhYmxlTmFtZSkpOworICAgICAgICAvLyBubyBtZXRyaWNzIGFmdGVyIGRyb3AKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1ldHJpY3MuZ2V0KCkuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwiKSksIDAsIG1ldHJpY3MuZ2V0KCkuY291bnQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBUcmllTWVtdGFibGVNZXRyaWNzVmlldyBnZXRNZW10YWJsZU1ldHJpY3MoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUcmllTWVtdGFibGVNZXRyaWNzVmlldyhjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLCBjZnMubmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQW5kRmx1c2goaW50IHJvd3MpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbG9nZ2VyLmluZm8oIndyaXRpbmcge30gcm93cyIsIHJvd3MpOworICAgICAgICBGdXR1cmVbXSBmdXR1cmVzID0gbmV3IEZ1dHVyZVtyb3dzXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJ3cml0aW5nIHt9IHJvdyIsIGkpOworICAgICAgICAgICAgZnV0dXJlc1tpXSA9IHNlc3Npb24uZXhlY3V0ZUFzeW5jKFN0cmluZy5mb3JtYXQoIklOU0VSVCBJTlRPICVzLiVzIChpZCwgdmFsMSwgdmFsMikgVkFMVUVTICglZCwgJyVzJywgJyVzJykiLCBLRVlTUEFDRSwgVEFCTEUsIGksICJ2YWwiICsgaSwgInZhbCIgKyBpKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZ1dHVyZXNbaV0uZ2V0KCk7CisgICAgICAgICAgICBsb2dnZXIuaW5mbygid3JpdGluZyB7fSByb3cgY29tcGxldGVkIiwgaSk7CisgICAgICAgIH0KKyAgICAgICAgbG9nZ2VyLmluZm8oImZvcmNpbmcgZmx1c2giKTsKKyAgICAgICAgU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuZm9yY2VLZXlzcGFjZUZsdXNoKEtFWVNQQUNFLCBUQUJMRSk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJ0YWJsZSBmbHVzaGVkIik7CisgICAgfQorCisgICAgQEFmdGVyQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVhcmRvd24oKQorICAgIHsKKyAgICAgICAgc2Vzc2lvbi5jbG9zZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvQ29ubmVjdGlvblRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvQ29ubmVjdGlvblRlc3QuamF2YQppbmRleCBlYzQ0N2FhLi41M2JjN2M1IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0Nvbm5lY3Rpb25UZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9Db25uZWN0aW9uVGVzdC5qYXZhCkBAIC01NSwxMCArNTUsMTAgQEAKIGltcG9ydCBpby5uZXR0eS5jaGFubmVsLkNoYW5uZWxIYW5kbGVyQ29udGV4dDsKIGltcG9ydCBpby5uZXR0eS5jaGFubmVsLkNoYW5uZWxPdXRib3VuZEhhbmRsZXJBZGFwdGVyOwogaW1wb3J0IGlvLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbFByb21pc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5FbmNyeXB0aW9uT3B0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5XaXRoUHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlJlcXVlc3RGYWlsdXJlUmVhc29uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuVW5rbm93bkNvbHVtbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5JVmVyc2lvbmVkQXN5bW1ldHJpY1NlcmlhbGl6ZXI7CkBAIC03MSw2ICs3MSw3IEBACiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTExJU0VDT05EUzsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlOVVRFUzsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TU0xfU1RPUkFHRV9QT1JUOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZS5WRVJTSU9OXzMwOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZS5WRVJTSU9OXzMwMTQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlLlZFUlNJT05fNDA7CkBAIC01NzMsOSArNTc0LDcgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RQZW5kaW5nT3V0Ym91bmRDb25uZWN0aW9uVXBkYXRlc01lc3NhZ2VWZXJzaW9uT25SZWNvbm5lY3RBdHRlbXB0KCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHN0b3JhZ2VQb3J0UHJvcGVydHkgPSBDb25maWcuUFJPUEVSVFlfUFJFRklYICsgInNzbF9zdG9yYWdlX3BvcnQiOwotICAgICAgICBmaW5hbCBTdHJpbmcgb3JpZ2luYWxTdG9yYWdlUG9ydCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShzdG9yYWdlUG9ydFByb3BlcnR5KTsKLSAgICAgICAgdHJ5CisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChTU0xfU1RPUkFHRV9QT1JULCA3MDExKSkKICAgICAgICAgewogICAgICAgICAgICAgLy8gU2V0IHVwIGFuIGluYm91bmQgY29ubmVjdGlvbiBsaXN0ZW5pbmcgKm9ubHkqIG9uIHRoZSBTU0wgc3RvcmFnZSBwb3J0IHRvCiAgICAgICAgICAgICAvLyByZXBsaWNhdGUgYSAzLnggbm9kZS4gIEZvcmNlIHRoZSBtZXNzYWdpbmcgdmVyc2lvbiB0byBiZSBpbmNvcnJlY3RseSBzZXQgdG8gNC4wCkBAIC01ODYsNyArNTg1LDYgQEAKICAgICAgICAgICAgIE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS52ZXJzaW9ucy5zZXQoRkJVdGlsaXRpZXMuZ2V0QnJvYWRjYXN0QWRkcmVzc0FuZFBvcnQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnaW5nU2VydmljZS5WRVJTSU9OXzQwKTsKIAotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KHN0b3JhZ2VQb3J0UHJvcGVydHksICI3MDExIik7CiAgICAgICAgICAgICBmaW5hbCBJbmV0QWRkcmVzc0FuZFBvcnQgbGVnYWN5U1NMQWRkcnNBbmRQb3J0ID0gZW5kcG9pbnQud2l0aFBvcnQoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNTTFN0b3JhZ2VQb3J0KCkpOwogICAgICAgICAgICAgSW5ib3VuZENvbm5lY3Rpb25TZXR0aW5ncyBpbmJvdW5kU2V0dGluZ3MgPSBzZXR0aW5ncy5pbmJvdW5kLmFwcGx5KG5ldyBJbmJvdW5kQ29ubmVjdGlvblNldHRpbmdzKCkud2l0aEVuY3J5cHRpb24oZW5jcnlwdGlvbk9wdGlvbnMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhCaW5kQWRkcmVzcyhsZWdhY3lTU0xBZGRyc0FuZFBvcnQpCkBAIC02NTMsMTAgKzY1MSw2IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS52ZXJzaW9ucy5zZXQoRkJVdGlsaXRpZXMuZ2V0QnJvYWRjYXN0QWRkcmVzc0FuZFBvcnQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF92ZXJzaW9uKTsKLSAgICAgICAgICAgIGlmIChvcmlnaW5hbFN0b3JhZ2VQb3J0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KHN0b3JhZ2VQb3J0UHJvcGVydHksIG9yaWdpbmFsU3RvcmFnZVBvcnQpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KHN0b3JhZ2VQb3J0UHJvcGVydHkpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0ZyYW1pbmdUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0ZyYW1pbmdUZXN0LmphdmEKaW5kZXggODFmOTVmMy4uMThlMzE3OSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9GcmFtaW5nVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvRnJhbWluZ1Rlc3QuamF2YQpAQCAtNzEsMTMgKzcxLDEzIEBACiAKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShieXRlW10gdCwgRGF0YU91dHB1dFBsdXMgb3V0LCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHQubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMih0Lmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgb3V0LndyaXRlKHQpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBwdWJsaWMgYnl0ZVtdIGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4sIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBieXRlW10gciA9IG5ldyBieXRlWyhpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKV07CisgICAgICAgICAgICAgICAgYnl0ZVtdIHIgPSBuZXcgYnl0ZVtpbi5yZWFkVW5zaWduZWRWSW50MzIoKV07CiAgICAgICAgICAgICAgICAgaW4ucmVhZEZ1bGx5KHIpOwogICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9IYW5kc2hha2VUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0hhbmRzaGFrZVRlc3QuamF2YQppbmRleCA3NWFlMTAzLi4zNjQzOWY1IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0hhbmRzaGFrZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0hhbmRzaGFrZVRlc3QuamF2YQpAQCAtMTksMTAgKzE5LDIwIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldDsKIAogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZENoYW5uZWxFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5uZXQuSW5ldEFkZHJlc3NlczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5FbmNyeXB0aW9uT3B0aW9ucy5TZXJ2ZXJFbmNyeXB0aW9uT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuUGFyYW1ldGVyaXplZENsYXNzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtcy5Hb3NzaXBEaWdlc3RTeW47CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VjdXJpdHkuRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuQXN5bmNQcm9taXNlOwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CkBAIC00MiwxMSArNTIsMTUgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2luZ1NlcnZpY2UubWluaW11bV92ZXJzaW9uOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuQ29ubmVjdGlvblR5cGUuU01BTExfTUVTU0FHRVM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5PdXRib3VuZENvbm5lY3Rpb25Jbml0aWF0b3IuKjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiAvLyBUT0RPOiB0ZXN0IGZhaWx1cmUgZHVlIHRvIGV4Y2VwdGlvbiwgdGltZW91dCwgZXRjCiBwdWJsaWMgY2xhc3MgSGFuZHNoYWtlVGVzdAogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNvY2tldEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBTb2NrZXRGYWN0b3J5KCk7CisgICAgc3RhdGljIGZpbmFsIEluZXRBZGRyZXNzQW5kUG9ydCBUT19BRERSID0gSW5ldEFkZHJlc3NBbmRQb3J0LmdldEJ5QWRkcmVzc092ZXJyaWRlRGVmYXVsdHMoSW5ldEFkZHJlc3Nlcy5mb3JTdHJpbmcoIjEyNy4wLjAuMiIpLCA3MDEyKTsKKyAgICBzdGF0aWMgZmluYWwgSW5ldEFkZHJlc3NBbmRQb3J0IEZST01fQUREUiA9IEluZXRBZGRyZXNzQW5kUG9ydC5nZXRCeUFkZHJlc3NPdmVycmlkZURlZmF1bHRzKEluZXRBZGRyZXNzZXMuZm9yU3RyaW5nKCIxMjcuMC4wLjEiKSwgNzAxMik7CiAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnR1cCgpCkBAIC04MCw2ICs5NCw3IEBACiAgICAgICAgICAgICBGdXR1cmU8UmVzdWx0PE1lc3NhZ2luZ1N1Y2Nlc3M+PiBmdXR1cmUgPQogICAgICAgICAgICAgaW5pdGlhdGVNZXNzYWdpbmcoZXZlbnRMb29wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01BTExfTUVTU0FHRVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlLlNFUlZFUl9DT05GSUcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT3V0Ym91bmRDb25uZWN0aW9uU2V0dGluZ3MoZW5kcG9pbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhBY2NlcHRWZXJzaW9ucyhhY2NlcHRPdXRib3VuZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aERlZmF1bHRzKENvbm5lY3Rpb25DYXRlZ29yeS5NRVNTQUdJTkcpLApAQCAtOTIsNiArMTA3LDcgQEAKICAgICAgICAgfQogICAgIH0KIAorCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Qm90aEN1cnJlbnRWZXJzaW9uKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24KICAgICB7CkBAIC0xNzIsNyArMTg4LDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIENsb3NlZENoYW5uZWxFeGNlcHRpb24pOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBDbG9zZWRDaGFubmVsRXhjZXB0aW9uKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTg2LDcgKzIwMiw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBDbG9zZWRDaGFubmVsRXhjZXB0aW9uKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIwNyw3ICsyMjMsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIENsb3NlZENoYW5uZWxFeGNlcHRpb24pOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMTgsNCArMjM0LDE2NSBAQAogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFJlc3VsdC5PdXRjb21lLlNVQ0NFU1MsIHJlc3VsdC5vdXRjb21lKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhWRVJTSU9OXzMwLCByZXN1bHQuc3VjY2VzcygpLm1lc3NhZ2luZ1ZlcnNpb24pOwogICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE91dGJvdW5kQ29ubmVjdGlvbmZGYWxsYmFja0R1cmluZ1VwZ3JhZGVzKCkgdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBVcGdyYWRlIGZyb20gTm9uLVNTTCAtPiBPcHRpb25hbCBTU0wKKyAgICAgICAgLy8gT3V0Ym91bmQgY29ubmVjdGlvbiBmcm9tIE9wdGlvbmFsIFNTTChuZXcgbm9kZSkgLT4gTm9uLVNTTCAob2xkIG5vZGUpCisgICAgICAgIHRlc3RPdXRib3VuZEZhbGxiYWNrT25TU0xIYW5kc2hha2VGYWlsdXJlKFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUuU1NMLCB0cnVlLCBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlLk5PX1NTTCwgZmFsc2UpOworCisgICAgICAgIC8vIFVwZ3JhZGUgZnJvbSBPcHRpb25hbCBTU0wgLT4gU3RyaWN0IFNTTAorICAgICAgICAvLyBPdXRib3VuZCBjb25uZWN0aW9uIGZyb20gU3RyaWN0IFNTTChuZXcgbm9kZSkgLT4gT3B0aW9uYWwgU1NMIChvbGQgbm9kZSkKKyAgICAgICAgdGVzdE91dGJvdW5kRmFsbGJhY2tPblNTTEhhbmRzaGFrZUZhaWx1cmUoU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS5TU0wsIGZhbHNlLCBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlLlNTTCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gVXBncmFkZSBmcm9tIE9wdGlvbmFsIFNTTCAtPiBTdHJpY3QgTVRMUworICAgICAgICAvLyBPdXRib3VuZCBjb25uZWN0aW9uIGZyb20gU3RyaWN0IE1UTFMobmV3IG5vZGUpIC0+IE9wdGlvbmFsIFNTTCAob2xkIG5vZGUpCisgICAgICAgIHRlc3RPdXRib3VuZEZhbGxiYWNrT25TU0xIYW5kc2hha2VGYWlsdXJlKFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUuTVRMUywgZmFsc2UsIFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUuU1NMLCB0cnVlKTsKKworICAgICAgICAvLyBVcGdyYWRlIGZyb20gU3RyaWN0IFNTTCAtPiBPcHRpb25hbCBNVExTCisgICAgICAgIC8vIE91dGJvdW5kIGNvbm5lY3Rpb24gZnJvbSBPcHRpb25hbCBNVExTKG5ldyBub2RlKSAtPiBTdHJpY3QgU1NMIChvbGQgbm9kZSkKKyAgICAgICAgdGVzdE91dGJvdW5kRmFsbGJhY2tPblNTTEhhbmRzaGFrZUZhaWx1cmUoU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS5NVExTLCB0cnVlLCBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlLlNTTCwgZmFsc2UpOworCisgICAgICAgIC8vIFVwZ3JhZGUgZnJvbSBTdHJpY3QgT3B0aW9uYWwgTVRMUyAtPiBTdHJpY3QgTVRMUworICAgICAgICAvLyBPdXRib3VuZCBjb25uZWN0aW9uIGZyb20gU3RyaWN0IFRMUyhuZXcgbm9kZSkgLT4gT3B0aW9uYWwgVExTIChvbGQgbm9kZSkKKyAgICAgICAgdGVzdE91dGJvdW5kRmFsbGJhY2tPblNTTEhhbmRzaGFrZUZhaWx1cmUoU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS5NVExTLCBmYWxzZSwgU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS5NVExTLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPdXRib3VuZENvbm5lY3Rpb25mRmFsbGJhY2tEdXJpbmdEb3duZ3JhZGVzKCkgdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBGcm9tIFN0cmljdCBNVExTIC0+IE9wdGlvbmFsIE1UTFMKKyAgICAgICAgLy8gT3V0Ym91bmQgY29ubmVjdGlvbiBmcm9tIE9wdGlvbmFsIFRMUyhuZXcgbm9kZSkgLT4gU3RyaWN0IE1UTFMgKG9sZCBub2RlKQorICAgICAgICB0ZXN0T3V0Ym91bmRGYWxsYmFja09uU1NMSGFuZHNoYWtlRmFpbHVyZShTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlLk1UTFMsIHRydWUsIFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUuTVRMUywgZmFsc2UpOworCisgICAgICAgIC8vIEZyb20gT3B0aW9uYWwgTVRMUyAtPiBTdHJpY3QgU1NMCisgICAgICAgIC8vIE91dGJvdW5kIGNvbm5lY3Rpb24gZnJvbSBTdHJpY3QgU1NMKG5ldyBub2RlKSAtPiBPcHRpb25hbCBNVExTIChvbGQgbm9kZSkKKyAgICAgICAgdGVzdE91dGJvdW5kRmFsbGJhY2tPblNTTEhhbmRzaGFrZUZhaWx1cmUoU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS5TU0wsIGZhbHNlLCBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlLk1UTFMsIHRydWUpOworCisgICAgICAgIC8vIEZyb20gU3RyaWN0IE1UTFMgLT4gT3B0aW9uYWwgU1NMCisgICAgICAgIC8vIE91dGJvdW5kIGNvbm5lY3Rpb24gZnJvbSBPcHRpb25hbCBTU0wobmV3IG5vZGUpIC0+IFN0cmljdCBNVExTIChvbGQgbm9kZSkKKyAgICAgICAgdGVzdE91dGJvdW5kRmFsbGJhY2tPblNTTEhhbmRzaGFrZUZhaWx1cmUoU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS5TU0wsIHRydWUsIFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUuTVRMUywgZmFsc2UpOworCisgICAgICAgIC8vIEZyb20gU3RyaWN0IFNTTCAtPiBPcHRpb25hbCBTU0wKKyAgICAgICAgLy8gT3V0Ym91bmQgY29ubmVjdGlvbiBmcm9tIE9wdGlvbmFsIFNTTChuZXcgbm9kZSkgLT4gU3RyaWN0IFNTTCAob2xkIG5vZGUpCisgICAgICAgIHRlc3RPdXRib3VuZEZhbGxiYWNrT25TU0xIYW5kc2hha2VGYWlsdXJlKFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUuU1NMLCB0cnVlLCBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlLlNTTCwgZmFsc2UpOworCisgICAgICAgIC8vIEZyb20gT3B0aW9uYWwgU1NMIC0+IE5vbi1TU0wKKyAgICAgICAgLy8gT3V0Ym91bmQgY29ubmVjdGlvbiBmcm9tIE5vbi1TU0wobmV3IG5vZGUpIC0+IE9wdGlvbmFsIFNTTCAob2xkIG5vZGUpCisgICAgICAgIHRlc3RPdXRib3VuZEZhbGxiYWNrT25TU0xIYW5kc2hha2VGYWlsdXJlKFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUuTk9fU1NMLCBmYWxzZSwgU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS5TU0wsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE91dGJvdW5kQ29ubmVjdGlvbkRvZXNudEZhbGxiYWNrV2hlbkVycm9ySXNOb3RTU0xSZWxhdGVkKCkgdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBDb25maWd1cmluZyBub2RlcyBpbiBPcHRpb25hbCBTU0wgbW9kZQorICAgICAgICAvLyB3aGVuIG9wdGlvbmFsIG1vZGUgaXMgZW5hYmxlZCwgaWYgdGhlIGNvbm5lY3Rpb24gZXJyb3IgaXMgU1NMIHJlbGF0ZWQsIGZhbGxiYWNrIHRvIGFub3RoZXIgU1NMIHN0cmF0ZWd5IHNob3VsZCBoYXBwZW4sCisgICAgICAgIC8vIG90aGVyd2lzZSBpdCBzaG91bGQgdXNlIHNhbWUgU1NMIHN0cmF0ZWd5IGFuZCByZXRyeQorICAgICAgICBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyBzZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyA9IGdldFNlcnZlckVuY3J5cHRpb25PcHRpb25zKFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUuU1NMLCB0cnVlKTsKKyAgICAgICAgSW5ib3VuZFNvY2tldHMgaW5ib3VuZCA9IGdldEluYm91bmRTb2NrZXQoc2VydmVyRW5jcnlwdGlvbk9wdGlvbnMpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgSW5ldEFkZHJlc3NBbmRQb3J0IGVuZHBvaW50ID0gaW5ib3VuZC5zb2NrZXRzKCkuc3RyZWFtKCkubWFwKHMgLT4gcy5zZXR0aW5ncy5iaW5kQWRkcmVzcykuZmluZEZpcnN0KCkuZ2V0KCk7CisKKyAgICAgICAgICAgIC8vIE9wZW4gb3V0Ym91bmQgY29ubmVjdGlvbnMgYmVmb3JlIHNlcnZlciBzdGFydHMgbGlzdGVuaW5nCisgICAgICAgICAgICAvLyBUaGUgY29ubmVjdGlvbiBzaG91bGQgYmUgYWNjZXB0ZWQgYWZ0ZXIgb3BlbmluZyBpbmJvdW5kIGNvbm5lY3Rpb25zLCB3aXRoIHRoZSBzYW1lIFNTTCBjb250ZXh0IHdpdGhvdXQgZmFsbGJhY2sKKyAgICAgICAgICAgIE91dGJvdW5kQ29ubmVjdGlvbiBvdXRib3VuZENvbm5lY3Rpb24gPSBpbml0aWF0ZU91dGJvdW5kKGVuZHBvaW50LCBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlLlNTTCwgdHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIExldCB0aGUgb3V0Ym91bmQgY29ubmVjdGlvbiBiZSB0cmllZCBmb3IgNCB0aW1lcyBhdGxlYXN0CisgICAgICAgICAgICB3aGlsZSAob3V0Ym91bmRDb25uZWN0aW9uLmNvbm5lY3Rpb25BdHRlbXB0cygpIDwgU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS52YWx1ZXMoKS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0RmFsc2Uob3V0Ym91bmRDb25uZWN0aW9uLmlzQ29ubmVjdGVkKCkpOworICAgICAgICAgICAgaW5ib3VuZC5vcGVuKCk7CisgICAgICAgICAgICAvLyBBcyBzb29uIGFzIHRoZSBub2RlIGFjY2VwdHMgaW5ib3VuZCBjb25uZWN0aW9ucywgdGhlIGNvbm5lY3Rpb24gbXVzdCBiZSBlc3RhYmxpc2hlZCB3aXRoIHJpZ2h0IFNTTCBjb250ZXh0CisgICAgICAgICAgICB3YWl0Rm9yQ29ubmVjdGlvbihvdXRib3VuZENvbm5lY3Rpb24pOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShvdXRib3VuZENvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBpbmJvdW5kLmNsb3NlKCkuYXdhaXQoMTBMLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgZ2V0U2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZSBzc2xDb25uZWN0aW9uVHlwZSwgYm9vbGVhbiBvcHRpb25hbCkKKyAgICB7CisgICAgICAgIFNlcnZlckVuY3J5cHRpb25PcHRpb25zIHNlcnZlckVuY3J5cHRpb25PcHRpb25zID0gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKCkud2l0aE9wdGlvbmFsKG9wdGlvbmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhLZXlTdG9yZSgidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdC5rZXlzdG9yZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEtleVN0b3JlUGFzc3dvcmQoImNhc3NhbmRyYSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aE91dGJvdW5kS2V5c3RvcmUoInRlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3Rfb3V0Ym91bmQua2V5c3RvcmUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhPdXRib3VuZEtleXN0b3JlUGFzc3dvcmQoImNhc3NhbmRyYSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFRydXN0U3RvcmUoInRlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3QudHJ1c3RzdG9yZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFRydXN0U3RvcmVQYXNzd29yZCgiY2Fzc2FuZHJhIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU3NsQ29udGV4dEZhY3RvcnkoKG5ldyBQYXJhbWV0ZXJpemVkQ2xhc3MoRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8PigpKSkpOworICAgICAgICBpZiAoc3NsQ29ubmVjdGlvblR5cGUgPT0gU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS5NVExTKQorICAgICAgICB7CisgICAgICAgICAgICBzZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyA9IHNlcnZlckVuY3J5cHRpb25PcHRpb25zLndpdGhJbnRlcm5vZGVFbmNyeXB0aW9uKFNlcnZlckVuY3J5cHRpb25PcHRpb25zLkludGVybm9kZUVuY3J5cHRpb24uYWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoUmVxdWlyZUNsaWVudEF1dGgodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3NsQ29ubmVjdGlvblR5cGUgPT0gU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS5TU0wpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlcnZlckVuY3J5cHRpb25PcHRpb25zID0gc2VydmVyRW5jcnlwdGlvbk9wdGlvbnMud2l0aEludGVybm9kZUVuY3J5cHRpb24oU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMuSW50ZXJub2RlRW5jcnlwdGlvbi5hbGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhSZXF1aXJlQ2xpZW50QXV0aChmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlcnZlckVuY3J5cHRpb25PcHRpb25zOworICAgIH0KKworICAgIHByaXZhdGUgSW5ib3VuZFNvY2tldHMgZ2V0SW5ib3VuZFNvY2tldChTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyBzZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucykKKyAgICB7CisgICAgICAgIEluYm91bmRDb25uZWN0aW9uU2V0dGluZ3Mgc2V0dGluZ3MgPSBuZXcgSW5ib3VuZENvbm5lY3Rpb25TZXR0aW5ncygpLndpdGhBY2NlcHRNZXNzYWdpbmcobmV3IEFjY2VwdFZlcnNpb25zKG1pbmltdW1fdmVyc2lvbiwgY3VycmVudF92ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEVuY3J5cHRpb24oc2VydmVyRW5jcnlwdGlvbk9wdGlvbnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhCaW5kQWRkcmVzcyhUT19BRERSKTsKKyAgICAgICAgTGlzdDxJbmJvdW5kQ29ubmVjdGlvblNldHRpbmdzPiBzZXR0aW5nc0xpc3QgPSAgbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHNldHRpbmdzTGlzdC5hZGQoc2V0dGluZ3MpOworICAgICAgICByZXR1cm4gbmV3IEluYm91bmRTb2NrZXRzKHNldHRpbmdzTGlzdCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBPdXRib3VuZENvbm5lY3Rpb24gaW5pdGlhdGVPdXRib3VuZChJbmV0QWRkcmVzc0FuZFBvcnQgZW5kcG9pbnQsIFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUgY29ubmVjdGlvblR5cGUsIGJvb2xlYW4gb3B0aW9uYWwpIHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCisgICAgeworICAgICAgICBmaW5hbCBPdXRib3VuZENvbm5lY3Rpb25TZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBPdXRib3VuZENvbm5lY3Rpb25TZXR0aW5ncyhlbmRwb2ludCkKKyAgICAgICAgLndpdGhBY2NlcHRWZXJzaW9ucyhuZXcgQWNjZXB0VmVyc2lvbnMobWluaW11bV92ZXJzaW9uLCBjdXJyZW50X3ZlcnNpb24pKQorICAgICAgICAud2l0aERlZmF1bHRzKENvbm5lY3Rpb25DYXRlZ29yeS5NRVNTQUdJTkcpCisgICAgICAgIC53aXRoRW5jcnlwdGlvbihnZXRTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhjb25uZWN0aW9uVHlwZSwgb3B0aW9uYWwpKQorICAgICAgICAud2l0aEZyb20oRlJPTV9BRERSKTsKKyAgICAgICAgT3V0Ym91bmRDb25uZWN0aW9ucyBvdXRib3VuZENvbm5lY3Rpb25zID0gT3V0Ym91bmRDb25uZWN0aW9ucy50cnlSZWdpc3RlcihuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpLCBUT19BRERSLCBzZXR0aW5ncyk7CisgICAgICAgIEdvc3NpcERpZ2VzdFN5biBzeW4gPSBuZXcgR29zc2lwRGlnZXN0U3luKCJjbHVzdGVyIiwgInBhcnRpdGlvbmVyIiwgbmV3IEFycmF5TGlzdDw+KDApKTsKKyAgICAgICAgTWVzc2FnZTxHb3NzaXBEaWdlc3RTeW4+IG1lc3NhZ2UgPSBNZXNzYWdlLm91dChWZXJiLkdPU1NJUF9ESUdFU1RfU1lOLCBzeW4pOworICAgICAgICBPdXRib3VuZENvbm5lY3Rpb24gb3V0Ym91bmRDb25uZWN0aW9uID0gb3V0Ym91bmRDb25uZWN0aW9ucy5jb25uZWN0aW9uRm9yKG1lc3NhZ2UpOworICAgICAgICBvdXRib3VuZENvbm5lY3Rpb24uZW5xdWV1ZShtZXNzYWdlKTsKKyAgICAgICAgb3V0Ym91bmRDb25uZWN0aW9uLmluaXRpYXRlKCk7CisgICAgICAgIHJldHVybiBvdXRib3VuZENvbm5lY3Rpb247CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RPdXRib3VuZEZhbGxiYWNrT25TU0xIYW5kc2hha2VGYWlsdXJlKFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUgZnJvbUNvbm5lY3Rpb25UeXBlLCBib29sZWFuIGZyb21PcHRpb25hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZSB0b0Nvbm5lY3Rpb25UeXBlLCBib29sZWFuIHRvT3B0aW9uYWwpIHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gQ29uZmlndXJlcyBpbmJvdW5kIGNvbm5lY3Rpb25zIHRvIGJlIG9wdGlvbmFsIG1UTFMKKyAgICAgICAgSW5ib3VuZFNvY2tldHMgaW5ib3VuZCA9IGdldEluYm91bmRTb2NrZXQoZ2V0U2VydmVyRW5jcnlwdGlvbk9wdGlvbnModG9Db25uZWN0aW9uVHlwZSwgdG9PcHRpb25hbCkpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgSW5ldEFkZHJlc3NBbmRQb3J0IGVuZHBvaW50ID0gaW5ib3VuZC5zb2NrZXRzKCkuc3RyZWFtKCkubWFwKHMgLT4gcy5zZXR0aW5ncy5iaW5kQWRkcmVzcykuZmluZEZpcnN0KCkuZ2V0KCk7CisgICAgICAgICAgICBpbmJvdW5kLm9wZW4oKTsKKworICAgICAgICAgICAgLy8gT3BlbiBvdXRib3VuZCBjb25uZWN0aW9ucywgYW5kIHdhaXQgdW50aWwgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZAorICAgICAgICAgICAgT3V0Ym91bmRDb25uZWN0aW9uIG91dGJvdW5kQ29ubmVjdGlvbiA9IGluaXRpYXRlT3V0Ym91bmQoZW5kcG9pbnQsIGZyb21Db25uZWN0aW9uVHlwZSwgZnJvbU9wdGlvbmFsKTsKKyAgICAgICAgICAgIHdhaXRGb3JDb25uZWN0aW9uKG91dGJvdW5kQ29ubmVjdGlvbik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG91dGJvdW5kQ29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGluYm91bmQuY2xvc2UoKS5hd2FpdCgxMEwsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JDb25uZWN0aW9uKE91dGJvdW5kQ29ubmVjdGlvbiBvdXRib3VuZENvbm5lY3Rpb24pIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgd2hpbGUgKCFvdXRib3VuZENvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKSAmJiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZSA8IDYwMDAwKQorICAgICAgICB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L01lc3NhZ2VTZXJpYWxpemF0aW9uUHJvcGVydHlUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L01lc3NhZ2VTZXJpYWxpemF0aW9uUHJvcGVydHlUZXN0LmphdmEKaW5kZXggNWE3M2NiZC4uNDM5MWQyNCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9NZXNzYWdlU2VyaWFsaXphdGlvblByb3BlcnR5VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvTWVzc2FnZVNlcmlhbGl6YXRpb25Qcm9wZXJ0eVRlc3QuamF2YQpAQCAtNDAsNiArNDAsOSBAQAogaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNMT0NLX01PTk9UT05JQ19BUFBST1g7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0xPQ0tfTU9OT1RPTklDX1BSRUNJU0U7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuT1JHX0FQQUNIRV9DQVNTQU5EUkFfRElTQUJMRV9NQkVBTl9SRUdJU1RSQVRJT047CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdlLnNlcmlhbGl6ZXI7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNhc3NhbmRyYUdlbmVyYXRvcnMuTUVTU0FHRV9HRU47CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZhaWxpbmdDb25zdW1lci5vckZhaWw7CkBAIC01MCwxMCArNTMsMTAgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKQogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXNhYmxlX21iZWFuX3JlZ2lzdHJhdGlvbiIsICJ0cnVlIik7CisgICAgICAgIE9SR19BUEFDSEVfQ0FTU0FORFJBX0RJU0FCTEVfTUJFQU5fUkVHSVNUUkFUSU9OLnNldEJvb2xlYW4odHJ1ZSk7CiAgICAgICAgIC8vIG1lc3NhZ2Ugc2VyaWFsaXphdGlvbiB1c2VzIHRoZSBNb25vdG9uaWNDbG9jayBjbGFzcyBmb3IgcHJlY2lzZSBhbmQgYXBwcm94IHRpbWVzdGFtcHMsIHNvIG1vY2sgaXQgb3V0Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLm1vbm90b25pY19jbG9jay5wcmVjaXNlIiwgRml4ZWRNb25vdG9uaWNDbG9jay5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5tb25vdG9uaWNfY2xvY2suYXBwcm94IiwgRml4ZWRNb25vdG9uaWNDbG9jay5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBDTE9DS19NT05PVE9OSUNfUFJFQ0lTRS5zZXRTdHJpbmcoRml4ZWRNb25vdG9uaWNDbG9jay5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBDTE9DS19NT05PVE9OSUNfQVBQUk9YLnNldFN0cmluZyhGaXhlZE1vbm90b25pY0Nsb2NrLmNsYXNzLmdldE5hbWUoKSk7CiAKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9NZXNzYWdpbmdTZXJ2aWNlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9NZXNzYWdpbmdTZXJ2aWNlVGVzdC5qYXZhCmluZGV4IDM0OWQ4NjUuLjMyZDUwNTAgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvTWVzc2FnaW5nU2VydmljZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L01lc3NhZ2luZ1NlcnZpY2VUZXN0LmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Bc3luY2hyb25vdXNTb2NrZXRDaGFubmVsOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CkBAIC0zNSwzMSArMzYsMzUgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lio7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5uZXQuSW5ldEFkZHJlc3NlczsKLQotaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLlRpbWVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5JSW50ZXJub2RlQXV0aGVudGljYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5FbmNyeXB0aW9uT3B0aW9ucy5TZXJ2ZXJFbmNyeXB0aW9uT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuTWVzc2FnaW5nTWV0cmljczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmF3YWl0aWxpdHkuQXdhaXRpbGl0eTsKLWltcG9ydCBvcmcuY2FmZmluaXRhcy5vaGMuaGlzdG8uRXN0aW1hdGVkSGlzdG9ncmFtOwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuVGltZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5JSW50ZXJub2RlQXV0aGVudGljYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5FbmNyeXB0aW9uT3B0aW9ucy5TZXJ2ZXJFbmNyeXB0aW9uT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLk1lc3NhZ2luZ01ldHJpY3M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmF3YWl0aWxpdHkuQXdhaXRpbGl0eTsKK2ltcG9ydCBvcmcuY2FmZmluaXRhcy5vaGMuaGlzdG8uRXN0aW1hdGVkSGlzdG9ncmFtOworCiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTExJU0VDT05EUzsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIHB1YmxpYyBjbGFzcyBNZXNzYWdpbmdTZXJ2aWNlVGVzdAogewpAQCAtNjcsNyArNzIsOCBAQAogICAgIHB1YmxpYyBzdGF0aWMgQXRvbWljSW50ZWdlciByZWplY3RlZENvbm5lY3Rpb25zID0gbmV3IEF0b21pY0ludGVnZXIoKTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElJbnRlcm5vZGVBdXRoZW50aWNhdG9yIEFMTE9XX05PVEhJTkdfQVVUSEVOVElDQVRPUiA9IG5ldyBJSW50ZXJub2RlQXV0aGVudGljYXRvcigpCiAgICAgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhdXRoZW50aWNhdGUoSW5ldEFkZHJlc3MgcmVtb3RlQWRkcmVzcywgaW50IHJlbW90ZVBvcnQpCisgICAgICAgIHB1YmxpYyBib29sZWFuIGF1dGhlbnRpY2F0ZShJbmV0QWRkcmVzcyByZW1vdGVBZGRyZXNzLCBpbnQgcmVtb3RlUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlW10gY2VydGlmaWNhdGVzLCBJbnRlcm5vZGVDb25uZWN0aW9uRGlyZWN0aW9uIGNvbm5lY3Rpb25UeXBlKQogICAgICAgICB7CiAgICAgICAgICAgICByZWplY3RlZENvbm5lY3Rpb25zLmluY3JlbWVudEFuZEdldCgpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNzgsNiArODQsMjUgQEAKIAogICAgICAgICB9CiAgICAgfTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSUludGVybm9kZUF1dGhlbnRpY2F0b3IgUkVKRUNUX09VVEJPVU5EX0FVVEhFTlRJQ0FUT1IgPSBuZXcgSUludGVybm9kZUF1dGhlbnRpY2F0b3IoKQorICAgIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYXV0aGVudGljYXRlKEluZXRBZGRyZXNzIHJlbW90ZUFkZHJlc3MsIGludCByZW1vdGVQb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMsIEludGVybm9kZUNvbm5lY3Rpb25EaXJlY3Rpb24gY29ubmVjdGlvblR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjb25uZWN0aW9uVHlwZSA9PSBJbnRlcm5vZGVDb25uZWN0aW9uRGlyZWN0aW9uLk9VVEJPVU5EKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlamVjdGVkQ29ubmVjdGlvbnMuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUNvbmZpZ3VyYXRpb24oKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgorICAgICAgICB7CisKKyAgICAgICAgfQorICAgIH07CiAgICAgcHJpdmF0ZSBzdGF0aWMgSUludGVybm9kZUF1dGhlbnRpY2F0b3Igb3JpZ2luYWxBdXRoZW50aWNhdG9yOwogICAgIHByaXZhdGUgc3RhdGljIFNlcnZlckVuY3J5cHRpb25PcHRpb25zIG9yaWdpbmFsU2VydmVyRW5jcnlwdGlvbk9wdGlvbnM7CiAgICAgcHJpdmF0ZSBzdGF0aWMgSW5ldEFkZHJlc3NBbmRQb3J0IG9yaWdpbmFsTGlzdGVuQWRkcmVzczsKQEAgLTIyOCwxOSArMjUzLDM4IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbGVkT3V0Ym91bmRJbnRlcm5vZGVBdXRoKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgTWVzc2FnaW5nU2VydmljZSBtcyA9IE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKTsKLSAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldEludGVybm9kZUF1dGhlbnRpY2F0b3IoQUxMT1dfTk9USElOR19BVVRIRU5USUNBVE9SKTsKLSAgICAgICAgSW5ldEFkZHJlc3NBbmRQb3J0IGFkZHJlc3MgPSBJbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlOYW1lKCIxMjcuMC4wLjI1MCIpOworICAgICAgICAvLyBMaXN0ZW4gb24gc2VydmVyc2lkZSBmb3IgY29ubmVjdGlvbnMKKyAgICAgICAgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgc2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgPSBuZXcgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoKQorICAgICAgICAud2l0aEludGVybm9kZUVuY3J5cHRpb24oU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMuSW50ZXJub2RlRW5jcnlwdGlvbi5ub25lKTsKIAotICAgICAgICAvL1Nob3VsZCByZXR1cm4gbnVsbAotICAgICAgICBpbnQgcmVqZWN0ZWRCZWZvcmUgPSByZWplY3RlZENvbm5lY3Rpb25zLmdldCgpOwotICAgICAgICBNZXNzYWdlPD8+IG1lc3NhZ2VPdXQgPSBNZXNzYWdlLm91dChWZXJiLkVDSE9fUkVRLCBOb1BheWxvYWQubm9QYXlsb2FkKTsKLSAgICAgICAgbXMuc2VuZChtZXNzYWdlT3V0LCBhZGRyZXNzKTsKLSAgICAgICAgQXdhaXRpbGl0eS5hd2FpdCgpLmF0TW9zdCgxMCwgVGltZVVuaXQuU0VDT05EUykudW50aWwoKCkgLT4gcmVqZWN0ZWRDb25uZWN0aW9ucy5nZXQoKSA+IHJlamVjdGVkQmVmb3JlKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldEludGVybm9kZUF1dGhlbnRpY2F0b3IoUkVKRUNUX09VVEJPVU5EX0FVVEhFTlRJQ0FUT1IpOworICAgICAgICBJbmV0QWRkcmVzcyBsaXN0ZW5BZGRyZXNzID0gRkJVdGlsaXRpZXMuZ2V0SnVzdExvY2FsQWRkcmVzcygpOwogCi0gICAgICAgIC8vU2hvdWxkIHRvbGVyYXRlIG51bGwKLSAgICAgICAgbXMuY2xvc2VPdXRib3VuZChhZGRyZXNzKTsKLSAgICAgICAgbXMuc2VuZChtZXNzYWdlT3V0LCBhZGRyZXNzKTsKKyAgICAgICAgSW5ib3VuZENvbm5lY3Rpb25TZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBJbmJvdW5kQ29ubmVjdGlvblNldHRpbmdzKCkud2l0aEVuY3J5cHRpb24oc2VydmVyRW5jcnlwdGlvbk9wdGlvbnMpOworICAgICAgICBJbmJvdW5kU29ja2V0cyBjb25uZWN0aW9ucyA9IG5ldyBJbmJvdW5kU29ja2V0cyhzZXR0aW5ncyk7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbm5lY3Rpb25zLm9wZW4oKS5hd2FpdCgpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY29ubmVjdGlvbnMuaXNMaXN0ZW5pbmcoKSk7CisKKyAgICAgICAgICAgIE1lc3NhZ2luZ1NlcnZpY2UgbXMgPSBNZXNzYWdpbmdTZXJ2aWNlLmluc3RhbmNlKCk7CisgICAgICAgICAgICAvL1Nob3VsZCByZXR1cm4gbnVsbAorICAgICAgICAgICAgaW50IHJlamVjdGVkQmVmb3JlID0gcmVqZWN0ZWRDb25uZWN0aW9ucy5nZXQoKTsKKyAgICAgICAgICAgIE1lc3NhZ2U8Pz4gbWVzc2FnZU91dCA9IE1lc3NhZ2Uub3V0KFZlcmIuRUNIT19SRVEsIE5vUGF5bG9hZC5ub1BheWxvYWQpOworICAgICAgICAgICAgSW5ldEFkZHJlc3NBbmRQb3J0IGFkZHJlc3MgPSBJbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlBZGRyZXNzKGxpc3RlbkFkZHJlc3MpOworICAgICAgICAgICAgbXMuc2VuZChtZXNzYWdlT3V0LCBhZGRyZXNzKTsKKyAgICAgICAgICAgIEF3YWl0aWxpdHkuYXdhaXQoKS5hdE1vc3QoMTAsIFRpbWVVbml0LlNFQ09ORFMpLnVudGlsKCgpIC0+IHJlamVjdGVkQ29ubmVjdGlvbnMuZ2V0KCkgPiByZWplY3RlZEJlZm9yZSk7CisKKyAgICAgICAgICAgIC8vU2hvdWxkIHRvbGVyYXRlIG51bGwKKyAgICAgICAgICAgIG1zLmNsb3NlT3V0Ym91bmQoYWRkcmVzcyk7CisgICAgICAgICAgICBtcy5zZW5kKG1lc3NhZ2VPdXQsIGFkZHJlc3MpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgY29ubmVjdGlvbnMuY2xvc2UoKS5hd2FpdCgpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGNvbm5lY3Rpb25zLmlzTGlzdGVuaW5nKCkpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTI2Miw2ICszMDYsMTEgQEAKIAogICAgICAgICAgICAgaW50IHJlamVjdGVkQmVmb3JlID0gcmVqZWN0ZWRDb25uZWN0aW9ucy5nZXQoKTsKICAgICAgICAgICAgIEZ1dHVyZTxWb2lkPiBjb25uZWN0RnV0dXJlID0gdGVzdENoYW5uZWwuY29ubmVjdChuZXcgSW5ldFNvY2tldEFkZHJlc3MobGlzdGVuQWRkcmVzcywgRGF0YWJhc2VEZXNjcmlwdG9yLmdldFN0b3JhZ2VQb3J0KCkpKTsKKyAgICAgICAgICAgIEF3YWl0aWxpdHkuYXdhaXQoKS5hdE1vc3QoMTAsIFRpbWVVbml0LlNFQ09ORFMpLnVudGlsKGNvbm5lY3RGdXR1cmU6OmlzRG9uZSk7CisKKyAgICAgICAgICAgIC8vIFNpbmNlIGF1dGhlbnRpY2F0aW9uIGRvZXNuJ3QgaGFwcGVuIGR1cmluZyBjb25uZWN0LCB0cnkgd3JpdGluZyBhIGR1bW15IHN0cmluZyB3aGljaCB0cmlnZ2VycworICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gaGFuZGxlci4KKyAgICAgICAgICAgIHRlc3RDaGFubmVsLndyaXRlKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCJkdW1teSBzdHJpbmciKSk7CiAgICAgICAgICAgICBBd2FpdGlsaXR5LmF3YWl0KCkuYXRNb3N0KDEwLCBUaW1lVW5pdC5TRUNPTkRTKS51bnRpbCgoKSAtPiByZWplY3RlZENvbm5lY3Rpb25zLmdldCgpID4gcmVqZWN0ZWRCZWZvcmUpOwogCiAgICAgICAgICAgICBjb25uZWN0RnV0dXJlLmNhbmNlbCh0cnVlKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvU29ja2V0VXRpbHMuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvU29ja2V0VXRpbHMuamF2YQppbmRleCA3OGE0OWJkLi4yM2QxY2M1IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L1NvY2tldFV0aWxzLmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9Tb2NrZXRVdGlscy5qYXZhCkBAIC0yMSw4ICsyMSw2IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7Ci0KIHB1YmxpYyBjbGFzcyBTb2NrZXRVdGlscwogewogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIGludCBmaW5kQXZhaWxhYmxlUG9ydCgpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uCkBAIC0zNyw3ICszNSw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICAgICAgZmluYWxseQogICAgICAgICB7CkBAIC00OSw3ICs0Nyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlcy5wcm9wYWdhdGUoZSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9Mb2NhbFN5bmNUYXNrVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9Mb2NhbFN5bmNUYXNrVGVzdC5qYXZhCmluZGV4IDQ3ZDUwYTIuLjQ0MDliM2MgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvTG9jYWxTeW5jVGFza1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL0xvY2FsU3luY1Rhc2tUZXN0LmphdmEKQEAgLTk4LDcgKzk4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9fUEVORElOR19SRVBBSVIsIHRydWUsIHRydWUsIFByZXZpZXdLaW5kLk5PTkUpOwogICAgICAgICB0YXNrLnJ1bigpOwogCi0gICAgICAgIGFzc2VydEVxdWFscygwLCB0YXNrLmdldCgpLm51bWJlck9mRGlmZmVyZW5jZXMpOworICAgICAgICBhc3NlcnRUcnVlKHRhc2suc3RhdC5kaWZmZXJlbmNlcy5pc0VtcHR5KCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xNDUsNyArMTQ1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2VkIHJhbmdlIHdhcyByZWNvcmRlZAotICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGRpZmZlcmluZyByYW5nZXMiLCBpbnRlcmVzdGluZy5zaXplKCksIHRhc2suc3RhdC5udW1iZXJPZkRpZmZlcmVuY2VzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBkaWZmZXJpbmcgcmFuZ2VzIiwgaW50ZXJlc3Rpbmcuc2l6ZSgpLCB0YXNrLnN0YXQuZGlmZmVyZW5jZXMuc2l6ZSgpKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9SZXBhaXJKb2JUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL1JlcGFpckpvYlRlc3QuamF2YQppbmRleCBjN2M2OGM0Li4wM2FjMmVkIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL1JlcGFpckpvYlRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL1JlcGFpckpvYlRlc3QuamF2YQpAQCAtMzA1LDggKzMwNSw4IEBACiAKICAgICAgICAgYXNzZXJ0VGhhdChyZXN1bHRzKQogICAgICAgICAgICAgLmhhc1NpemUoMikKLSAgICAgICAgICAgIC5leHRyYWN0aW5nKHMgLT4gcy5udW1iZXJPZkRpZmZlcmVuY2VzKQotICAgICAgICAgICAgLmNvbnRhaW5zT25seSgxTCk7CisgICAgICAgICAgICAuZXh0cmFjdGluZyhzIC0+IHMuZGlmZmVyZW5jZXMuc2l6ZSgpKQorICAgICAgICAgICAgLmNvbnRhaW5zT25seSgxKTsKIAogICAgICAgICBhc3NlcnRUaGF0KG1lc3NhZ2VzKQogICAgICAgICAgICAgLmhhc1NpemUoMikKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvbWVzc2FnZXMvUmVwYWlyT3B0aW9uVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9tZXNzYWdlcy9SZXBhaXJPcHRpb25UZXN0LmphdmEKaW5kZXggYTZjYTA4NC4uMDQ4M2ZjZiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9tZXNzYWdlcy9SZXBhaXJPcHRpb25UZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9tZXNzYWdlcy9SZXBhaXJPcHRpb25UZXN0LmphdmEKQEAgLTIzLDcgKzIzLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKLWltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKQEAgLTMyLDYgKzMxLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnJlcGFpci5SZXBhaXJQYXJhbGxlbGlzbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuUHJldmlld0tpbmQ7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CkBAIC0xNDksMTcgKzE0OSw3NiBAQAogCiAgICAgICAgIC8vIGRlZmF1bHQgdmFsdWUKICAgICAgICAgb3B0aW9uID0gUmVwYWlyT3B0aW9uLnBhcnNlKG9wdGlvbnMsIE11cm11cjNQYXJ0aXRpb25lci5pbnN0YW5jZSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShvcHRpb24uaXNGb3JjZWRSZXBhaXIoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG9wdGlvbi5pc0ZvcmNlZFJlcGFpcigpKTsKIAogICAgICAgICAvLyBleHBsaWNpdCB0cnVlCiAgICAgICAgIG9wdGlvbnMucHV0KFJlcGFpck9wdGlvbi5GT1JDRV9SRVBBSVJfS0VZLCAidHJ1ZSIpOwogICAgICAgICBvcHRpb24gPSBSZXBhaXJPcHRpb24ucGFyc2Uob3B0aW9ucywgTXVybXVyM1BhcnRpdGlvbmVyLmluc3RhbmNlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUob3B0aW9uLmlzRm9yY2VkUmVwYWlyKCkpOworICAgICAgICBhc3NlcnRUcnVlKG9wdGlvbi5pc0ZvcmNlZFJlcGFpcigpKTsKIAogICAgICAgICAvLyBleHBsaWNpdCBmYWxzZQogICAgICAgICBvcHRpb25zLnB1dChSZXBhaXJPcHRpb24uRk9SQ0VfUkVQQUlSX0tFWSwgImZhbHNlIik7CiAgICAgICAgIG9wdGlvbiA9IFJlcGFpck9wdGlvbi5wYXJzZShvcHRpb25zLCBNdXJtdXIzUGFydGl0aW9uZXIuaW5zdGFuY2UpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2Uob3B0aW9uLmlzRm9yY2VkUmVwYWlyKCkpOworICAgICAgICBhc3NlcnRGYWxzZShvcHRpb24uaXNGb3JjZWRSZXBhaXIoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3B0aW1pc2VTdHJlYW1zKCkKKyAgICB7CisgICAgICAgIGJvb2xlYW4gb3B0RnVsbCA9IERhdGFiYXNlRGVzY3JpcHRvci5hdXRvT3B0aW1pc2VGdWxsUmVwYWlyU3RyZWFtcygpOworICAgICAgICBib29sZWFuIG9wdEluYyA9IERhdGFiYXNlRGVzY3JpcHRvci5hdXRvT3B0aW1pc2VJbmNSZXBhaXJTdHJlYW1zKCk7CisgICAgICAgIGJvb2xlYW4gb3B0UHJldmlldyA9IERhdGFiYXNlRGVzY3JpcHRvci5hdXRvT3B0aW1pc2VQcmV2aWV3UmVwYWlyU3RyZWFtcygpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChQcmV2aWV3S2luZCBwcmV2aWV3S2luZCA6IFByZXZpZXdLaW5kLnZhbHVlcygpKQorICAgICAgICAgICAgICAgIGZvciAoYm9vbGVhbiBpbmMgOiBuZXcgYm9vbGVhbltdIHt0cnVlLCBmYWxzZX0pCisgICAgICAgICAgICAgICAgICAgIGFzc2VydE9wdGltaXNlKHByZXZpZXdLaW5kLCBpbmMpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgc2V0T3B0aW1pc2Uob3B0RnVsbCwgb3B0SW5jLCBvcHRQcmV2aWV3KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRIZWxwZXIoTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zLCBib29sZWFuIGZ1bGwsIGJvb2xlYW4gaW5jLCBib29sZWFuIHByZXZpZXcsIGJvb2xlYW4gZXhwZWN0ZWQpCisgICAgeworICAgICAgICBzZXRPcHRpbWlzZShmdWxsLCBpbmMsIHByZXZpZXcpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIFJlcGFpck9wdGlvbi5wYXJzZShvcHRpb25zLCBNdXJtdXIzUGFydGl0aW9uZXIuaW5zdGFuY2UpLm9wdGltaXNlU3RyZWFtcygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0T3B0aW1pc2UoYm9vbGVhbiBmdWxsLCBib29sZWFuIGluYywgYm9vbGVhbiBwcmV2aWV3KQorICAgIHsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldEF1dG9PcHRpbWlzZUZ1bGxSZXBhaXJTdHJlYW1zKGZ1bGwpOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0QXV0b09wdGltaXNlSW5jUmVwYWlyU3RyZWFtcyhpbmMpOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0QXV0b09wdGltaXNlUHJldmlld1JlcGFpclN0cmVhbXMocHJldmlldyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydE9wdGltaXNlKFByZXZpZXdLaW5kIHByZXZpZXdLaW5kLCBib29sZWFuIGluY3JlbWVudGFsKQorICAgIHsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBvcHRpb25zLnB1dChSZXBhaXJPcHRpb24uUFJFVklFVywgcHJldmlld0tpbmQudG9TdHJpbmcoKSk7CisgICAgICAgIG9wdGlvbnMucHV0KFJlcGFpck9wdGlvbi5JTkNSRU1FTlRBTF9LRVksIEJvb2xlYW4udG9TdHJpbmcoaW5jcmVtZW50YWwpKTsKKyAgICAgICAgZm9yIChib29sZWFuIGEgOiBuZXcgYm9vbGVhbltdeyB0cnVlLCBmYWxzZSB9KQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGJvb2xlYW4gYiA6IG5ldyBib29sZWFuW117IHRydWUsIGZhbHNlIH0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHByZXZpZXdLaW5kLmlzUHJldmlldygpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SGVscGVyKG9wdGlvbnMsIGEsIGIsIHRydWUsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRIZWxwZXIob3B0aW9ucywgYSwgYiwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5jcmVtZW50YWwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRIZWxwZXIob3B0aW9ucywgYSwgdHJ1ZSwgYiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEhlbHBlcihvcHRpb25zLCBhLCBmYWxzZSwgYiwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRIZWxwZXIob3B0aW9ucywgdHJ1ZSwgYSwgYiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEhlbHBlcihvcHRpb25zLCBmYWxzZSwgYSwgYiwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQYXJzZVRocm93c0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbldpdGhNZXNzYWdlKE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9uc1RvUGFyc2UsIFN0cmluZyBleHBlY3RlZEVycm9yTWVzc2FnZSkKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvTWlncmF0aW9uTWFuYWdlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvTWlncmF0aW9uTWFuYWdlclRlc3QuamF2YQppbmRleCBlMTU1NmI3Li4xNmVmNzgyIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL01pZ3JhdGlvbk1hbmFnZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9NaWdyYXRpb25NYW5hZ2VyVGVzdC5qYXZhCkBAIC0yNCw3ICsyNCw2IEBACiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTQzLDggKzQyLDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVzVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVURjhUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLk5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogCkBAIC00NzMsNyArNDczLDcgQEAKICAgICAgICAgLy8gY2hlY2sKICAgICAgICAgYXNzZXJ0VHJ1ZShjZnMuaW5kZXhNYW5hZ2VyLmxpc3RJbmRleGVzKCkuaXNFbXB0eSgpKTsKICAgICAgICAgTGlmZWN5Y2xlVHJhbnNhY3Rpb24ud2FpdEZvckRlbGV0aW9ucygpOwotICAgICAgICBhc3NlcnRGYWxzZShuZXcgRmlsZShkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSkuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRGYWxzZShkZXNjLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKS5leGlzdHMoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvTW9ja1NjaGVtYS5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9Nb2NrU2NoZW1hLmphdmEKaW5kZXggZjVjOTk4Ni4uMjMwNjEyMCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9Nb2NrU2NoZW1hLmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9Nb2NrU2NoZW1hLmphdmEKQEAgLTMzLDI3ICszMyw0MSBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQnVmZmVyRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlbGV0aW9uVGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuTWVtdGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuU2tpcExpc3RNZW10YWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTXVybXVyM1BhcnRpdGlvbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkluZGV4U3VtbWFyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVJZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0LkNvbXBvbmVudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aS5CdGlGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpLkJ0aVRhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aS5QYXJ0aXRpb25JbmRleDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeS5JbmRleFN1bW1hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5rZXljYWNoZS5LZXlDYWNoZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29sbGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuU3RhdHNNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkNoYW5uZWxQcm94eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRTdHJlYW1QbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5NZW1vcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQWx3YXlzUHJlc2VudEZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNhY2hlU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GaWx0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRocm93YWJsZXM7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5BY3RpdmVSZXBhaXJTZXJ2aWNlLlVOUkVQQUlSRURfU1NUQUJMRTsKIApAQCAtNzQsMTkgKzg4LDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgVXRpbC5uZXdVVUlER2VuKCkgfSk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZSB0ZW1wRmlsZSA9IHRlbXAoIm1vY2tzZWdtZW50ZWRmaWxlIik7CisKICAgICBzdGF0aWMKICAgICB7CiAgICAgICAgIE1lbW9yeSBvZmZzZXRzID0gTWVtb3J5LmFsbG9jYXRlKDQpOwogICAgICAgICBvZmZzZXRzLnNldEludCgwLCAwKTsKICAgICAgICAgaW5kZXhTdW1tYXJ5ID0gbmV3IEluZGV4U3VtbWFyeShNdXJtdXIzUGFydGl0aW9uZXIuaW5zdGFuY2UsIG9mZnNldHMsIDAsIE1lbW9yeS5hbGxvY2F0ZSg0KSwgMCwgMCwgMCwgMSk7CisKKyAgICAgICAgdHJ5IChEYXRhT3V0cHV0U3RyZWFtUGx1cyBvdXQgPSB0ZW1wRmlsZS5uZXdPdXRwdXRTdHJlYW0oRmlsZS5Xcml0ZU1vZGUuT1ZFUldSSVRFKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0LndyaXRlKG5ldyBieXRlWzEwXSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnRocm93QXNVbmNoZWNrZWRFeGNlcHRpb24oZXgpOworICAgICAgICB9CiAgICAgfQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgaWQgPSBuZXcgQXRvbWljSW50ZWdlcigpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgS2V5c3BhY2Uga3MgPSBLZXlzcGFjZS5tb2NrS1MoS2V5c3BhY2VNZXRhZGF0YS5jcmVhdGUoIm1vY2trcyIsIEtleXNwYWNlUGFyYW1zLnNpbXBsZVRyYW5zaWVudCgxKSkpOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbmRleFN1bW1hcnkgaW5kZXhTdW1tYXJ5OwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZSB0ZW1wRmlsZSA9IHRlbXAoIm1vY2tzZWdtZW50ZWRmaWxlIik7Ci0KICAgICBwdWJsaWMgc3RhdGljIE1lbXRhYmxlIG1lbXRhYmxlKENvbHVtbkZhbWlseVN0b3JlIGNmcykKICAgICB7CiAgICAgICAgIHJldHVybiBTa2lwTGlzdE1lbXRhYmxlLkZBQ1RPUlkuY3JlYXRlKG51bGwsIGNmcy5tZXRhZGF0YSwgY2ZzKTsKQEAgLTEwMiw2ICsxMjUsMTEgQEAKICAgICAgICAgcmV0dXJuIHNzdGFibGUoZ2VuZXJhdGlvbiwgMCwgZmFsc2UsIGZpcnN0LCBsYXN0LCBjZnMpOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZVJlYWRlciBzc3RhYmxlKGludCBnZW5lcmF0aW9uLCBsb25nIGZpcnN0LCBsb25nIGxhc3QsIGludCBtaW5Mb2NhbERlbGV0aW9uVGltZSwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNzdGFibGUoZ2VuZXJhdGlvbiwgMCwgZmFsc2UsIGZpcnN0LCBsYXN0LCAwLCBjZnMsIG1pbkxvY2FsRGVsZXRpb25UaW1lKTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVSZWFkZXIgc3N0YWJsZShpbnQgZ2VuZXJhdGlvbiwgYm9vbGVhbiBrZWVwUmVmLCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMpCiAgICAgewogICAgICAgICByZXR1cm4gc3N0YWJsZShnZW5lcmF0aW9uLCAwLCBrZWVwUmVmLCBjZnMpOwpAQCAtMTExLDYgKzEzOSw3IEBACiAgICAgewogICAgICAgICByZXR1cm4gc3N0YWJsZShnZW5lcmF0aW9uLCBzaXplLCBmYWxzZSwgY2ZzKTsKICAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVSZWFkZXIgc3N0YWJsZShpbnQgZ2VuZXJhdGlvbiwgaW50IHNpemUsIGJvb2xlYW4ga2VlcFJlZiwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKQogICAgIHsKICAgICAgICAgcmV0dXJuIHNzdGFibGUoZ2VuZXJhdGlvbiwgc2l6ZSwga2VlcFJlZiwgZ2VuZXJhdGlvbiwgZ2VuZXJhdGlvbiwgY2ZzKTsKQEAgLTEyOCw3ICsxNTcsMTIgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZVJlYWRlciBzc3RhYmxlV2l0aFRpbWVzdGFtcChpbnQgZ2VuZXJhdGlvbiwgbG9uZyB0aW1lc3RhbXAsIENvbHVtbkZhbWlseVN0b3JlIGNmcykKICAgICB7Ci0gICAgICAgIHJldHVybiBzc3RhYmxlKGdlbmVyYXRpb24sIDAsIGZhbHNlLCAwLCAxMDAwLCAwLCBJbnRlZ2VyLk1BWF9WQUxVRSwgdGltZXN0YW1wLCBjZnMpOworICAgICAgICByZXR1cm4gc3N0YWJsZShnZW5lcmF0aW9uLCAwLCBmYWxzZSwgMCwgMTAwMCwgMCwgY2ZzLCBJbnRlZ2VyLk1BWF9WQUxVRSwgdGltZXN0YW1wKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVSZWFkZXIgc3N0YWJsZShpbnQgZ2VuZXJhdGlvbiwgaW50IHNpemUsIGJvb2xlYW4ga2VlcFJlZiwgbG9uZyBmaXJzdFRva2VuLCBsb25nIGxhc3RUb2tlbiwgaW50IGxldmVsLCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMpCisgICAgeworICAgICAgICByZXR1cm4gc3N0YWJsZShnZW5lcmF0aW9uLCBzaXplLCBrZWVwUmVmLCBmaXJzdFRva2VuLCBsYXN0VG9rZW4sIGxldmVsLCBjZnMsIEludGVnZXIuTUFYX1ZBTFVFKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVSZWFkZXIgc3N0YWJsZShpbnQgZ2VuZXJhdGlvbiwgaW50IHNpemUsIGJvb2xlYW4ga2VlcFJlZiwgbG9uZyBmaXJzdFRva2VuLCBsb25nIGxhc3RUb2tlbiwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKQpAQCAtMTM2LDU1ICsxNzAsMTE3IEBACiAgICAgICAgIHJldHVybiBzc3RhYmxlKGdlbmVyYXRpb24sIHNpemUsIGtlZXBSZWYsIGZpcnN0VG9rZW4sIGxhc3RUb2tlbiwgMCwgY2ZzKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVSZWFkZXIgc3N0YWJsZShpbnQgZ2VuZXJhdGlvbiwgaW50IHNpemUsIGJvb2xlYW4ga2VlcFJlZiwgbG9uZyBmaXJzdFRva2VuLCBsb25nIGxhc3RUb2tlbiwgaW50IGxldmVsLCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMpCisgICAgcHVibGljIHN0YXRpYyBTU1RhYmxlUmVhZGVyIHNzdGFibGUoaW50IGdlbmVyYXRpb24sIGludCBzaXplLCBib29sZWFuIGtlZXBSZWYsIGxvbmcgZmlyc3RUb2tlbiwgbG9uZyBsYXN0VG9rZW4sIGludCBsZXZlbCwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBpbnQgbWluTG9jYWxEZWxldGlvblRpbWUpCiAgICAgewotICAgICAgICByZXR1cm4gc3N0YWJsZShnZW5lcmF0aW9uLCBzaXplLCBrZWVwUmVmLCBmaXJzdFRva2VuLCBsYXN0VG9rZW4sIGxldmVsLCBJbnRlZ2VyLk1BWF9WQUxVRSwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKiAxMDAwLCBjZnMpOworICAgICAgICByZXR1cm4gc3N0YWJsZShnZW5lcmF0aW9uLCBzaXplLCBrZWVwUmVmLCBmaXJzdFRva2VuLCBsYXN0VG9rZW4sIGxldmVsLCBjZnMsIG1pbkxvY2FsRGVsZXRpb25UaW1lLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAqIDEwMDApOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZVJlYWRlciBzc3RhYmxlKGludCBnZW5lcmF0aW9uLCBpbnQgc2l6ZSwgYm9vbGVhbiBrZWVwUmVmLCBsb25nIGZpcnN0VG9rZW4sIGxvbmcgbGFzdFRva2VuLCBpbnQgbGV2ZWwsIGludCBtaW5Mb2NhbERlbGV0aW9uVGltZSwgbG9uZyB0aW1lc3RhbXAsIENvbHVtbkZhbWlseVN0b3JlIGNmcykKKyAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVSZWFkZXIgc3N0YWJsZShpbnQgZ2VuZXJhdGlvbiwgaW50IHNpemUsIGJvb2xlYW4ga2VlcFJlZiwgbG9uZyBmaXJzdFRva2VuLCBsb25nIGxhc3RUb2tlbiwgaW50IGxldmVsLCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIGludCBtaW5Mb2NhbERlbGV0aW9uVGltZSwgbG9uZyB0aW1lc3RhbXApCiAgICAgeworICAgICAgICBTU1RhYmxlRm9ybWF0PD8sID8+IGZvcm1hdCA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKTsKICAgICAgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IERlc2NyaXB0b3IoY2ZzLmdldERpcmVjdG9yaWVzKCkuZ2V0RGlyZWN0b3J5Rm9yTmV3U1NUYWJsZXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLmtleXNwYWNlLmdldE5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLmdldFRhYmxlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlSWQoZ2VuZXJhdGlvbiksIFNTVGFibGVGb3JtYXQuVHlwZS5CSUcpOwotICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gSW1tdXRhYmxlU2V0Lm9mKENvbXBvbmVudC5EQVRBLCBDb21wb25lbnQuUFJJTUFSWV9JTkRFWCwgQ29tcG9uZW50LkZJTFRFUiwgQ29tcG9uZW50LlRPQyk7Ci0gICAgICAgIGZvciAoQ29tcG9uZW50IGNvbXBvbmVudCA6IGNvbXBvbmVudHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoY29tcG9uZW50KSk7Ci0gICAgICAgICAgICBmaWxlLmNyZWF0ZUZpbGVJZk5vdEV4aXN0cygpOwotICAgICAgICB9Ci0gICAgICAgIC8vIC5jb21wbGV0ZSgpIHdpdGggc2l6ZSB0byBtYWtlIHNzdGFibGUub25EaXNrTGVuZ3RoIHdvcmsKLSAgICAgICAgdHJ5IChGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIobmV3IENoYW5uZWxQcm94eSh0ZW1wRmlsZSkpLmJ1ZmZlclNpemUoc2l6ZSk7Ci0gICAgICAgICAgICAgRmlsZUhhbmRsZSBmaWxlSGFuZGxlID0gYnVpbGRlci5jb21wbGV0ZShzaXplKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNpemUgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpOwotICAgICAgICAgICAgICAgICAgICBVdGlsLnNldEZpbGVMZW5ndGgoZmlsZSwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIgPSBTZXJpYWxpemF0aW9uSGVhZGVyLm1ha2UoY2ZzLm1ldGFkYXRhKCksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLSAgICAgICAgICAgIE1ldGFkYXRhQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBNZXRhZGF0YUNvbGxlY3RvcihjZnMubWV0YWRhdGEoKS5jb21wYXJhdG9yKTsKLSAgICAgICAgICAgIGNvbGxlY3Rvci51cGRhdGUobmV3IERlbGV0aW9uVGltZSh0aW1lc3RhbXAsIG1pbkxvY2FsRGVsZXRpb25UaW1lKSk7Ci0gICAgICAgICAgICBTdGF0c01ldGFkYXRhIG1ldGFkYXRhID0gKFN0YXRzTWV0YWRhdGEpIGNvbGxlY3Rvci5zc3RhYmxlTGV2ZWwobGV2ZWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5hbGl6ZU1ldGFkYXRhKGNmcy5tZXRhZGF0YSgpLnBhcnRpdGlvbmVyLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpLCAwLjAxZiwgVU5SRVBBSVJFRF9TU1RBQkxFLCBudWxsLCBmYWxzZSwgaGVhZGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KE1ldGFkYXRhVHlwZS5TVEFUUyk7Ci0gICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHJlYWRlciA9IFNTVGFibGVSZWFkZXIuaW50ZXJuYWxPcGVuKGRlc2NyaXB0b3IsIGNvbXBvbmVudHMsIGNmcy5tZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUhhbmRsZS5zaGFyZWRDb3B5KCksIGZpbGVIYW5kbGUuc2hhcmVkQ29weSgpLCBpbmRleFN1bW1hcnkuc2hhcmVkQ29weSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWx3YXlzUHJlc2VudEZpbHRlcigpLCAxTCwgbWV0YWRhdGEsIFNTVGFibGVSZWFkZXIuT3BlblJlYXNvbi5OT1JNQUwsIGhlYWRlcik7Ci0gICAgICAgICAgICByZWFkZXIuZmlyc3QgPSByZWFkZXJCb3VuZHMoZmlyc3RUb2tlbik7Ci0gICAgICAgICAgICByZWFkZXIubGFzdCA9IHJlYWRlckJvdW5kcyhsYXN0VG9rZW4pOwotICAgICAgICAgICAgaWYgKCFrZWVwUmVmKQotICAgICAgICAgICAgICAgIHJlYWRlci5zZWxmUmVmKCkucmVsZWFzZSgpOwotICAgICAgICAgICAgcmV0dXJuIHJlYWRlcjsKLSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlSWQoZ2VuZXJhdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCk7CiAKKyAgICAgICAgaWYgKEJpZ0Zvcm1hdC5pcyhmb3JtYXQpKQorICAgICAgICB7CisgICAgICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gSW1tdXRhYmxlU2V0Lm9mKENvbXBvbmVudHMuREFUQSwgQ29tcG9uZW50cy5QUklNQVJZX0lOREVYLCBDb21wb25lbnRzLkZJTFRFUiwgQ29tcG9uZW50cy5UT0MpOworICAgICAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogY29tcG9uZW50cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBkZXNjcmlwdG9yLmZpbGVGb3IoY29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICBmaWxlLmNyZWF0ZUZpbGVJZk5vdEV4aXN0cygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLmNvbXBsZXRlKCkgd2l0aCBzaXplIHRvIG1ha2Ugc3N0YWJsZS5vbkRpc2tMZW5ndGggd29yaworICAgICAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZpbGVIYW5kbGUgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKHRlbXBGaWxlKS5idWZmZXJTaXplKHNpemUpLndpdGhMZW5ndGhPdmVycmlkZShzaXplKS5jb21wbGV0ZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1heWJlU2V0RGF0YUxlbmd0aChkZXNjcmlwdG9yLCBzaXplKTsKKyAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciA9IFNlcmlhbGl6YXRpb25IZWFkZXIubWFrZShjZnMubWV0YWRhdGEoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworICAgICAgICAgICAgICAgIE1ldGFkYXRhQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBNZXRhZGF0YUNvbGxlY3RvcihjZnMubWV0YWRhdGEoKS5jb21wYXJhdG9yKTsKKyAgICAgICAgICAgICAgICBjb2xsZWN0b3IudXBkYXRlKG5ldyBEZWxldGlvblRpbWUodGltZXN0YW1wLCBtaW5Mb2NhbERlbGV0aW9uVGltZSkpOworICAgICAgICAgICAgICAgIEJ1ZmZlckRlY29yYXRlZEtleSBmaXJzdCA9IHJlYWRlckJvdW5kcyhmaXJzdFRva2VuKTsKKyAgICAgICAgICAgICAgICBCdWZmZXJEZWNvcmF0ZWRLZXkgbGFzdCA9IHJlYWRlckJvdW5kcyhsYXN0VG9rZW4pOworICAgICAgICAgICAgICAgIFN0YXRzTWV0YWRhdGEgbWV0YWRhdGEgPSAoU3RhdHNNZXRhZGF0YSkgY29sbGVjdG9yLnNzdGFibGVMZXZlbChsZXZlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5hbGl6ZU1ldGFkYXRhKGNmcy5tZXRhZGF0YSgpLnBhcnRpdGlvbmVyLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpLCAwLjAxZiwgVU5SRVBBSVJFRF9TU1RBQkxFLCBudWxsLCBmYWxzZSwgaGVhZGVyLCBmaXJzdC5yZXRhaW5hYmxlKCkuZ2V0S2V5KCkuc2xpY2UoKSwgbGFzdC5yZXRhaW5hYmxlKCkuZ2V0S2V5KCkuc2xpY2UoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoTWV0YWRhdGFUeXBlLlNUQVRTKTsKKyAgICAgICAgICAgICAgICBCaWdUYWJsZVJlYWRlciByZWFkZXIgPSBuZXcgQmlnVGFibGVSZWFkZXIuQnVpbGRlcihkZXNjcmlwdG9yKS5zZXRDb21wb25lbnRzKGNvbXBvbmVudHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGFibGVNZXRhZGF0YVJlZihjZnMubWV0YWRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RGF0YUZpbGUoZmlsZUhhbmRsZS5zaGFyZWRDb3B5KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5kZXhGaWxlKGZpbGVIYW5kbGUuc2hhcmVkQ29weSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluZGV4U3VtbWFyeShpbmRleFN1bW1hcnkuc2hhcmVkQ29weSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpbHRlcihGaWx0ZXJGYWN0b3J5LkFsd2F5c1ByZXNlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWF4RGF0YUFnZSgxTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTdGF0c01ldGFkYXRhKG1ldGFkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE9wZW5SZWFzb24oU1NUYWJsZVJlYWRlci5PcGVuUmVhc29uLk5PUk1BTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTZXJpYWxpemF0aW9uSGVhZGVyKGhlYWRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaXJzdChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXN0KGxhc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0S2V5Q2FjaGUoY2ZzLm1ldGFkYXRhKCkucGFyYW1zLmNhY2hpbmcuY2FjaGVLZXlzID8gbmV3IEtleUNhY2hlKENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZSkgOiBLZXlDYWNoZS5OT19DQUNIRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZChjZnMsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKCFrZWVwUmVmKQorICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2VsZlJlZigpLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEJ0aUZvcm1hdC5pcyhmb3JtYXQpKQorICAgICAgICB7CisgICAgICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gSW1tdXRhYmxlU2V0Lm9mKENvbXBvbmVudHMuREFUQSwgQnRpRm9ybWF0LkNvbXBvbmVudHMuUEFSVElUSU9OX0lOREVYLCBCdGlGb3JtYXQuQ29tcG9uZW50cy5ST1dfSU5ERVgsIENvbXBvbmVudHMuRklMVEVSLCBDb21wb25lbnRzLlRPQyk7CisgICAgICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBjb21wb25lbnRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IGRlc2NyaXB0b3IuZmlsZUZvcihjb21wb25lbnQpOworICAgICAgICAgICAgICAgIGZpbGUuY3JlYXRlRmlsZUlmTm90RXhpc3RzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuY29tcGxldGUoKSB3aXRoIHNpemUgdG8gbWFrZSBzc3RhYmxlLm9uRGlza0xlbmd0aCB3b3JrCisgICAgICAgICAgICB0cnkgKEZpbGVIYW5kbGUgZmlsZUhhbmRsZSA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIodGVtcEZpbGUpLmJ1ZmZlclNpemUoc2l6ZSkud2l0aExlbmd0aE92ZXJyaWRlKHNpemUpLmNvbXBsZXRlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWF5YmVTZXREYXRhTGVuZ3RoKGRlc2NyaXB0b3IsIHNpemUpOworICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyID0gU2VyaWFsaXphdGlvbkhlYWRlci5tYWtlKGNmcy5tZXRhZGF0YSgpLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7CisgICAgICAgICAgICAgICAgTWV0YWRhdGFDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IE1ldGFkYXRhQ29sbGVjdG9yKGNmcy5tZXRhZGF0YSgpLmNvbXBhcmF0b3IpOworICAgICAgICAgICAgICAgIGNvbGxlY3Rvci51cGRhdGUobmV3IERlbGV0aW9uVGltZSh0aW1lc3RhbXAsIG1pbkxvY2FsRGVsZXRpb25UaW1lKSk7CisgICAgICAgICAgICAgICAgQnVmZmVyRGVjb3JhdGVkS2V5IGZpcnN0ID0gcmVhZGVyQm91bmRzKGZpcnN0VG9rZW4pOworICAgICAgICAgICAgICAgIEJ1ZmZlckRlY29yYXRlZEtleSBsYXN0ID0gcmVhZGVyQm91bmRzKGxhc3RUb2tlbik7CisgICAgICAgICAgICAgICAgU3RhdHNNZXRhZGF0YSBtZXRhZGF0YSA9IChTdGF0c01ldGFkYXRhKSBjb2xsZWN0b3Iuc3N0YWJsZUxldmVsKGxldmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmFsaXplTWV0YWRhdGEoY2ZzLm1ldGFkYXRhKCkucGFydGl0aW9uZXIuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCksIDAuMDFmLCBVTlJFUEFJUkVEX1NTVEFCTEUsIG51bGwsIGZhbHNlLCBoZWFkZXIsIGZpcnN0LnJldGFpbmFibGUoKS5nZXRLZXkoKSwgbGFzdC5yZXRhaW5hYmxlKCkuZ2V0S2V5KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KE1ldGFkYXRhVHlwZS5TVEFUUyk7CisgICAgICAgICAgICAgICAgQnRpVGFibGVSZWFkZXIgcmVhZGVyID0gbmV3IEJ0aVRhYmxlUmVhZGVyLkJ1aWxkZXIoZGVzY3JpcHRvcikuc2V0Q29tcG9uZW50cyhjb21wb25lbnRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRhYmxlTWV0YWRhdGFSZWYoY2ZzLm1ldGFkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldERhdGFGaWxlKGZpbGVIYW5kbGUuc2hhcmVkQ29weSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBhcnRpdGlvbkluZGV4KG5ldyBQYXJ0aXRpb25JbmRleChmaWxlSGFuZGxlLnNoYXJlZENvcHkoKSwgMCwgMCwgcmVhZGVyQm91bmRzKGZpcnN0VG9rZW4pLCByZWFkZXJCb3VuZHMobGFzdFRva2VuKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Um93SW5kZXhGaWxlKGZpbGVIYW5kbGUuc2hhcmVkQ29weSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpbHRlcihGaWx0ZXJGYWN0b3J5LkFsd2F5c1ByZXNlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWF4RGF0YUFnZSgxTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTdGF0c01ldGFkYXRhKG1ldGFkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE9wZW5SZWFzb24oU1NUYWJsZVJlYWRlci5PcGVuUmVhc29uLk5PUk1BTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTZXJpYWxpemF0aW9uSGVhZGVyKGhlYWRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaXJzdChyZWFkZXJCb3VuZHMoZmlyc3RUb2tlbikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGFzdChyZWFkZXJCb3VuZHMobGFzdFRva2VuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZChjZnMsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKCFrZWVwUmVmKQorICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2VsZlJlZigpLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgVXRpbC50ZXN0TXVzdEJlSW1wbGVtZW50ZWRGb3JTU1RhYmxlRm9ybWF0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIG1heWJlU2V0RGF0YUxlbmd0aChEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGxvbmcgc2l6ZSkKKyAgICB7CisgICAgICAgIGlmIChzaXplID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuREFUQSk7CisgICAgICAgICAgICAgICAgVXRpbC5zZXRGaWxlTGVuZ3RoKGZpbGUsIHNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIENvbHVtbkZhbWlseVN0b3JlIG5ld0NGUygpCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1JlbW92ZVdpdGhvdXREcm9wcGluZ1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvUmVtb3ZlV2l0aG91dERyb3BwaW5nVGVzdC5qYXZhCmluZGV4IDljMzI3MWIuLjY4M2U1MmYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvUmVtb3ZlV2l0aG91dERyb3BwaW5nVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvUmVtb3ZlV2l0aG91dERyb3BwaW5nVGVzdC5qYXZhCkBAIC0yOCwxMiArMjgsMTQgQEAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFUcmFuc2Zvcm1hdGlvbi5TY2hlbWFUcmFuc2Zvcm1hdGlvblJlc3VsdDsKIGltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU0NIRU1BX1VQREFURV9IQU5ETEVSX0ZBQ1RPUllfQ0xBU1M7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsOwogaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CiAKQEAgLTQ2LDcgKzQ4LDkgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKQogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFNjaGVtYVVwZGF0ZUhhbmRsZXJGYWN0b3J5UHJvdmlkZXIuU1VIX0ZBQ1RPUllfQ0xBU1NfUFJPUEVSVFksIFRlc3RTY2hlbWFVcGRhdGVIYW5kbGVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBTZXJ2ZXJUZXN0VXRpbHMuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKworICAgICAgICBTQ0hFTUFfVVBEQVRFX0hBTkRMRVJfRkFDVE9SWV9DTEFTUy5zZXRTdHJpbmcoVGVzdFNjaGVtYVVwZGF0ZUhhbmRsZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CiAgICAgICAgIENRTFRlc3Rlci5wcmVwYXJlU2VydmVyKCk7CiAgICAgICAgIFNjaGVtYS5pbnN0YW5jZS5yZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYUtleXNwYWNlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9TY2hlbWFLZXlzcGFjZVRlc3QuamF2YQppbmRleCBlODA3NzMwLi4wODkwNzdmIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYUtleXNwYWNlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvU2NoZW1hS2V5c3BhY2VUZXN0LmphdmEKQEAgLTMzLDExICszMywxMyBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOwogCiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5UHJvY2Vzc29yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVW50eXBlZFJlc3VsdFNldDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkNyZWF0ZVRhYmxlU3RhdGVtZW50OwpAQCAtNjEsNiArNjMsNyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVPbmNlSW50ZXJuYWw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiAKIEBSdW5XaXRoKEJNVW5pdFJ1bm5lci5jbGFzcykKIHB1YmxpYyBjbGFzcyBTY2hlbWFLZXlzcGFjZVRlc3QKQEAgLTE4MSw2ICsxODQsNDIgQEAKIAogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9TbmFwc2hvdEVuYWJsZWRPblRhYmxlKCkKKyAgICB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKERhdGFiYXNlRGVzY3JpcHRvci5pc0F1dG9TbmFwc2hvdCgpKTsKKyAgICAgICAgU3RyaW5nIGtleXNwYWNlTmFtZSA9ICJBdXRvU25hcHNob3QiOworICAgICAgICBTdHJpbmcgdGFibGVOYW1lID0gInRhYmxlMSI7CisKKyAgICAgICAgY3JlYXRlVGFibGUoa2V5c3BhY2VOYW1lLCAiQ1JFQVRFIFRBQkxFICIgKyB0YWJsZU5hbWUgKyAiIChhIHRleHQgcHJpbWFyeSBrZXksIGIgaW50KSBXSVRIIGFsbG93X2F1dG9fc25hcHNob3QgPSB0cnVlIik7CisKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gS2V5c3BhY2Uub3BlbihrZXlzcGFjZU5hbWUpLmdldENvbHVtbkZhbWlseVN0b3JlKHRhYmxlTmFtZSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShjZnMuaXNBdXRvU25hcHNob3RFbmFibGVkKCkpOworCisgICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlVGFibGVEcm9wKGtleXNwYWNlTmFtZSwgdGFibGVOYW1lKTsKKworICAgICAgICBhc3NlcnRGYWxzZShjZnMubGlzdFNuYXBzaG90cygpLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b1NuYXBzaG90RGlzYWJsZWRPblRhYmxlKCkKKyAgICB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKERhdGFiYXNlRGVzY3JpcHRvci5pc0F1dG9TbmFwc2hvdCgpKTsKKyAgICAgICAgU3RyaW5nIGtleXNwYWNlTmFtZSA9ICJBdXRvU25hcHNob3QiOworICAgICAgICBTdHJpbmcgdGFibGVOYW1lID0gInRhYmxlMiI7CisKKyAgICAgICAgY3JlYXRlVGFibGUoa2V5c3BhY2VOYW1lLCAiQ1JFQVRFIFRBQkxFICIgKyB0YWJsZU5hbWUgKyAiIChhIHRleHQgcHJpbWFyeSBrZXksIGIgaW50KSBXSVRIIGFsbG93X2F1dG9fc25hcHNob3QgPSBmYWxzZSIpOworCisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oa2V5c3BhY2VOYW1lKS5nZXRDb2x1bW5GYW1pbHlTdG9yZSh0YWJsZU5hbWUpOworCisgICAgICAgIGFzc2VydEZhbHNlKGNmcy5pc0F1dG9TbmFwc2hvdEVuYWJsZWQoKSk7CisKKyAgICAgICAgU2NoZW1hVGVzdFV0aWwuYW5ub3VuY2VUYWJsZURyb3Aoa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUpOworCisgICAgICAgIGFzc2VydFRydWUoY2ZzLmxpc3RTbmFwc2hvdHMoKS5pc0VtcHR5KCkpOworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlVGFibGUoU3RyaW5nIGtleXNwYWNlLCBUYWJsZU1ldGFkYXRhIG9sZFRhYmxlLCBUYWJsZU1ldGFkYXRhIG5ld1RhYmxlKQogICAgIHsKICAgICAgICAgS2V5c3BhY2VNZXRhZGF0YSBrc20gPSBTY2hlbWEuaW5zdGFuY2UuZ2V0S2V5c3BhY2VJbnN0YW5jZShrZXlzcGFjZSkuZ2V0TWV0YWRhdGEoKTsKQEAgLTIxNSw3ICsyNTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuZmlsdGVyZWRSb3dJdGVyYXRvcnMuZmlsdGVyKHNlcmlhbGl6ZWRDRC51bmZpbHRlcmVkSXRlcmF0b3IoKSwgRkJVdGlsaXRpZXMubm93SW5TZWNvbmRzKCkpKTsKICAgICAgICAgU2V0PENvbHVtbk1ldGFkYXRhPiBjb2x1bW5zID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICBmb3IgKFVudHlwZWRSZXN1bHRTZXQuUm93IHJvdyA6IGNvbHVtbnNSb3dzKQotICAgICAgICAgICAgY29sdW1ucy5hZGQoU2NoZW1hS2V5c3BhY2UuY3JlYXRlQ29sdW1uRnJvbVJvdyhyb3csIFR5cGVzLm5vbmUoKSkpOworICAgICAgICAgICAgY29sdW1ucy5hZGQoU2NoZW1hS2V5c3BhY2UuY3JlYXRlQ29sdW1uRnJvbVJvdyhyb3csIFR5cGVzLm5vbmUoKSwgVXNlckZ1bmN0aW9ucy5ub25lKCkpKTsKIAogICAgICAgICBhc3NlcnRFcXVhbHMobWV0YWRhdGEucGFyYW1zLCBwYXJhbXMpOwogICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEhhc2hTZXQ8PihtZXRhZGF0YS5jb2x1bW5zKCkpLCBjb2x1bW5zKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9DdXN0b21Tc2xDb250ZXh0RmFjdG9yeUNvbmZpZ1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9DdXN0b21Tc2xDb250ZXh0RmFjdG9yeUNvbmZpZ1Rlc3QuamF2YQppbmRleCBjMWFiNGE0Li5kYWEwZjE2IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvQ3VzdG9tU3NsQ29udGV4dEZhY3RvcnlDb25maWdUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0N1c3RvbVNzbENvbnRleHRGYWN0b3J5Q29uZmlnVGVzdC5qYXZhCkBAIC0yNSwxOSArMjUsMjQgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX0NPTkZJRzsKKwogcHVibGljIGNsYXNzIEN1c3RvbVNzbENvbnRleHRGYWN0b3J5Q29uZmlnVGVzdAogeworICAgIHN0YXRpYyBXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzOworCiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwRGF0YWJhc2VEZXNjcmlwdG9yKCkKICAgICB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmNvbmZpZyIsICJjYXNzYW5kcmEtc3NsY29udGV4dGZhY3RvcnkueWFtbCIpOworICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KENBU1NBTkRSQV9DT05GSUcsICJjYXNzYW5kcmEtc3NsY29udGV4dGZhY3RvcnkueWFtbCIpOwogICAgIH0KIAogICAgIEBBZnRlckNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlYXJEb3duRGF0YWJhc2VEZXNjcmlwdG9yKCkgewotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiY2Fzc2FuZHJhLmNvbmZpZyIpOworICAgICAgICBwcm9wZXJ0aWVzLmNsb3NlKCk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9DdXN0b21Tc2xDb250ZXh0RmFjdG9yeUludmFsaWRDb25maWdUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvQ3VzdG9tU3NsQ29udGV4dEZhY3RvcnlJbnZhbGlkQ29uZmlnVGVzdC5qYXZhCmluZGV4IDc5ZTdkNTIuLmRmYWRlYTcgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9DdXN0b21Tc2xDb250ZXh0RmFjdG9yeUludmFsaWRDb25maWdUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0N1c3RvbVNzbENvbnRleHRGYWN0b3J5SW52YWxpZENvbmZpZ1Rlc3QuamF2YQpAQCAtMjQsMTggKzI0LDIyIEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX0NPTkZJRzsKIAogcHVibGljIGNsYXNzIEN1c3RvbVNzbENvbnRleHRGYWN0b3J5SW52YWxpZENvbmZpZ1Rlc3QKIHsKKyAgICBzdGF0aWMgV2l0aFByb3BlcnRpZXMgcHJvcGVydGllczsKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXBEYXRhYmFzZURlc2NyaXB0b3IoKQogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuY29uZmlnIiwgImNhc3NhbmRyYS1zc2xjb250ZXh0ZmFjdG9yeS1pbnZhbGlkY29uZmlndXJhdGlvbi55YW1sIik7CisgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgV2l0aFByb3BlcnRpZXMoKS5zZXQoQ0FTU0FORFJBX0NPTkZJRywgImNhc3NhbmRyYS1zc2xjb250ZXh0ZmFjdG9yeS1pbnZhbGlkY29uZmlndXJhdGlvbi55YW1sIik7CiAgICAgfQogCiAgICAgQEFmdGVyQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVhckRvd25EYXRhYmFzZURlc2NyaXB0b3IoKSB7Ci0gICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KCJjYXNzYW5kcmEuY29uZmlnIik7CisgICAgICAgIHByb3BlcnRpZXMuY2xvc2UoKTsKICAgICB9CiAKICAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9EZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5VGVzdC5qYXZhCmluZGV4IDA2NTdlYjYuLmJjZDEzZWYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9EZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0RlZmF1bHRTc2xDb250ZXh0RmFjdG9yeVRlc3QuamF2YQpAQCAtMzMsNiArMzMsOSBAQAogaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuc3NsLlNzbENvbnRleHQ7CiBpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5zc2wuU3NsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5XaXRoUHJvcGVydGllczsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkRJU0FCTEVfVENBQ1RJVkVfT1BFTlNTTDsKIAogcHVibGljIGNsYXNzIERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeVRlc3QKIHsKQEAgLTUzLDE1ICs1NiwyMyBAQAogICAgICAgICBjb25maWcucHV0KCJrZXlzdG9yZV9wYXNzd29yZCIsICJjYXNzYW5kcmEiKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgYWRkT3V0Ym91bmRLZXlzdG9yZU9wdGlvbnMoTWFwPFN0cmluZywgT2JqZWN0PiBjb25maWcpCisgICAgeworICAgICAgICBjb25maWcucHV0KCJvdXRib3VuZF9rZXlzdG9yZSIsICJ0ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0X291dGJvdW5kLmtleXN0b3JlIik7CisgICAgICAgIGNvbmZpZy5wdXQoIm91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkIiwgImNhc3NhbmRyYSIpOworICAgIH0KKwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgZ2V0U3NsQ29udGV4dE9wZW5TU0woKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIEVuY3J5cHRpb25PcHRpb25zIG9wdGlvbnMgPSBuZXcgRW5jcnlwdGlvbk9wdGlvbnMoKS53aXRoVHJ1c3RTdG9yZSgidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdC50cnVzdHN0b3JlIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhUcnVzdFN0b3JlUGFzc3dvcmQoImNhc3NhbmRyYSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoS2V5U3RvcmUoInRlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3Qua2V5c3RvcmUiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEtleVN0b3JlUGFzc3dvcmQoImNhc3NhbmRyYSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoUmVxdWlyZUNsaWVudEF1dGgoZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ2lwaGVyU3VpdGVzKCJUTFNfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBIik7CisgICAgICAgIEVuY3J5cHRpb25PcHRpb25zLlNlcnZlckVuY3J5cHRpb25PcHRpb25zIG9wdGlvbnMgPSBuZXcgRW5jcnlwdGlvbk9wdGlvbnMuU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoKS53aXRoVHJ1c3RTdG9yZSgidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdC50cnVzdHN0b3JlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhUcnVzdFN0b3JlUGFzc3dvcmQoImNhc3NhbmRyYSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoS2V5U3RvcmUoInRlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3Qua2V5c3RvcmUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEtleVN0b3JlUGFzc3dvcmQoImNhc3NhbmRyYSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoT3V0Ym91bmRLZXlzdG9yZSgidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdF9vdXRib3VuZC5rZXlzdG9yZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoT3V0Ym91bmRLZXlzdG9yZVBhc3N3b3JkKCJjYXNzYW5kcmEiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFJlcXVpcmVDbGllbnRBdXRoKGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENpcGhlclN1aXRlcygiVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSIpOwogICAgICAgICBTc2xDb250ZXh0IHNzbENvbnRleHQgPSBTU0xGYWN0b3J5LmdldE9yQ3JlYXRlU3NsQ29udGV4dChvcHRpb25zLCB0cnVlLCBJU3NsQ29udGV4dEZhY3RvcnkuU29ja2V0VHlwZS5DTElFTlQpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChzc2xDb250ZXh0KTsKICAgICAgICAgaWYgKE9wZW5Tc2wuaXNBdmFpbGFibGUoKSkKQEAgLTc4LDcgKzg5LDcgQEAKICAgICAgICAgY29uZmlnLnB1dCgidHJ1c3RzdG9yZSIsICIvdGhpcy9pcy9wcm9iYWJseS9ub3QvYS9maWxlL29uL3lvdXIvdGVzdC9tYWNoaW5lIik7CiAKICAgICAgICAgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5IGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwgPSBuZXcgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5KGNvbmZpZyk7Ci0gICAgICAgIGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOworICAgICAgICBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsLmtleXN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5ID0gZmFsc2U7CiAgICAgICAgIGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwuYnVpbGRUcnVzdE1hbmFnZXJGYWN0b3J5KCk7CiAgICAgfQogCkBAIC05MCw3ICsxMDEsNyBAQAogICAgICAgICBjb25maWcucHV0KCJ0cnVzdHN0b3JlX3Bhc3N3b3JkIiwgIkhvbWVPZkJhZFBhc3N3b3JkcyIpOwogCiAgICAgICAgIERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeSBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsID0gbmV3IERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeShjb25maWcpOwotICAgICAgICBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsLmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKKyAgICAgICAgZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbC5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOwogICAgICAgICBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsLmJ1aWxkVHJ1c3RNYW5hZ2VyRmFjdG9yeSgpOwogICAgIH0KIApAQCAtMTAxLDcgKzExMiw3IEBACiAgICAgICAgIGNvbmZpZy5wdXRBbGwoY29tbW9uQ29uZmlnKTsKIAogICAgICAgICBEZWZhdWx0U3NsQ29udGV4dEZhY3RvcnkgZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbCA9IG5ldyBEZWZhdWx0U3NsQ29udGV4dEZhY3RvcnkoY29uZmlnKTsKLSAgICAgICAgZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbC5jaGVja2VkRXhwaXJ5ID0gZmFsc2U7CisgICAgICAgIGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwua2V5c3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKICAgICAgICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeSB0cnVzdE1hbmFnZXJGYWN0b3J5ID0gZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbC5idWlsZFRydXN0TWFuYWdlckZhY3RvcnkoKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwodHJ1c3RNYW5hZ2VyRmFjdG9yeSk7CiAgICAgfQpAQCAtMTEyLDEwICsxMjMsMTAgQEAKICAgICAgICAgTWFwPFN0cmluZyxPYmplY3Q+IGNvbmZpZyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgY29uZmlnLnB1dEFsbChjb21tb25Db25maWcpOwogICAgICAgICBjb25maWcucHV0KCJrZXlzdG9yZSIsICIvdGhpcy9pcy9wcm9iYWJseS9ub3QvYS9maWxlL29uL3lvdXIvdGVzdC9tYWNoaW5lIik7Ci0gICAgICAgIGNvbmZpZy5wdXQoImtleXN0b3JlX3Bhc3N3b3JkIiwiVGhpc1dvbnRNYXR0ZXIiKTsKKyAgICAgICAgY29uZmlnLnB1dCgia2V5c3RvcmVfcGFzc3dvcmQiLCAiVGhpc1dvbnRNYXR0ZXIiKTsKIAogICAgICAgICBEZWZhdWx0U3NsQ29udGV4dEZhY3RvcnkgZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbCA9IG5ldyBEZWZhdWx0U3NsQ29udGV4dEZhY3RvcnkoY29uZmlnKTsKLSAgICAgICAgZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbC5jaGVja2VkRXhwaXJ5ID0gZmFsc2U7CisgICAgICAgIGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwua2V5c3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKICAgICAgICAgZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbC5idWlsZEtleU1hbmFnZXJGYWN0b3J5KCk7CiAgICAgfQogCkBAIC0xMzksMzIgKzE1MCw4NCBAQAogCiAgICAgICAgIERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeSBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsID0gbmV3IERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeShjb25maWcpOwogICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGV4aXJ5IGNoZWNrIGRpZG4ndCBoYXBwZW4gc28gZmFyIGZvciB0aGUgcHJpdmF0ZSBrZXkKLSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwuY2hlY2tlZEV4cGlyeSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsLmtleXN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5KTsKIAogICAgICAgICBhZGRLZXlzdG9yZU9wdGlvbnMoY29uZmlnKTsKICAgICAgICAgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5IGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwyID0gbmV3IERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeShjb25maWcpOwogICAgICAgICAvLyBUcmlnZ2VyIHRoZSBwcml2YXRlIGtleSBsb2FkaW5nLiBUaGF0IHdpbGwgYWxzbyBjaGVjayBmb3IgZXhwaXJlZCBwcml2YXRlIGtleQogICAgICAgICBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsMi5idWlsZEtleU1hbmFnZXJGYWN0b3J5KCk7CiAgICAgICAgIC8vIE5vdyB3ZSBzaG91bGQgaGF2ZSBjaGVja2VkIHRoZSBwcml2YXRlIGtleSdzIGV4cGlyeQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsMi5jaGVja2VkRXhwaXJ5KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbDIua2V5c3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkpOwogCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IG5ldyBmYWN0b3J5IG9iamVjdCBwcmVmb3JtcyB0aGUgZnJlc2ggcHJpdmF0ZSBrZXkgZXhwaXJ5IGNoZWNrCiAgICAgICAgIERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeSBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsMyA9IG5ldyBEZWZhdWx0U3NsQ29udGV4dEZhY3RvcnkoY29uZmlnKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwzLmNoZWNrZWRFeHBpcnkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbDMua2V5c3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkpOwogICAgICAgICBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsMy5idWlsZEtleU1hbmFnZXJGYWN0b3J5KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwzLmNoZWNrZWRFeHBpcnkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsMy5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJT0V4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCBidWlsZE91dGJvdW5kS2V5TWFuYWdlckZhY3RvcnlXaXRoSW52YWxpZEtleXN0b3JlRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjb25maWcgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGNvbmZpZy5wdXRBbGwoY29tbW9uQ29uZmlnKTsKKyAgICAgICAgY29uZmlnLnB1dCgib3V0Ym91bmRfa2V5c3RvcmUiLCAiL3RoaXMvaXMvcHJvYmFibHkvbm90L2EvZmlsZS9vbi95b3VyL3Rlc3QvbWFjaGluZSIpOworICAgICAgICBjb25maWcucHV0KCJvdXRib3VuZF9rZXlzdG9yZV9wYXNzd29yZCIsICJUaGlzV29udE1hdHRlciIpOworCisgICAgICAgIERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeSBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsID0gbmV3IERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeShjb25maWcpOworICAgICAgICBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsLm91dGJvdW5kS2V5c3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKKyAgICAgICAgZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbC5idWlsZE91dGJvdW5kS2V5TWFuYWdlckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IElPRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIGJ1aWxkT3V0Ym91bmRLZXlNYW5hZ2VyRmFjdG9yeVdpdGhCYWRQYXNzd29yZCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjb25maWcgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGNvbmZpZy5wdXRBbGwoY29tbW9uQ29uZmlnKTsKKyAgICAgICAgYWRkT3V0Ym91bmRLZXlzdG9yZU9wdGlvbnMoY29uZmlnKTsKKyAgICAgICAgY29uZmlnLnB1dCgib3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQiLCAiSG9tZU9mQmFkUGFzc3dvcmRzIik7CisKKyAgICAgICAgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5IGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwgPSBuZXcgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5KGNvbmZpZyk7CisgICAgICAgIGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwuYnVpbGRPdXRib3VuZEtleU1hbmFnZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBidWlsZE91dGJvdW5kS2V5TWFuYWdlckZhY3RvcnlIYXBweVBhdGgoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY29uZmlnID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBjb25maWcucHV0QWxsKGNvbW1vbkNvbmZpZyk7CisKKyAgICAgICAgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5IGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwgPSBuZXcgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5KGNvbmZpZyk7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZXhpcnkgY2hlY2sgZGlkbid0IGhhcHBlbiBzbyBmYXIgZm9yIHRoZSBwcml2YXRlIGtleQorICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbC5vdXRib3VuZEtleXN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5KTsKKworICAgICAgICBhZGRPdXRib3VuZEtleXN0b3JlT3B0aW9ucyhjb25maWcpOworICAgICAgICBEZWZhdWx0U3NsQ29udGV4dEZhY3RvcnkgZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbDIgPSBuZXcgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5KGNvbmZpZyk7CisgICAgICAgIC8vIFRyaWdnZXIgdGhlIHByaXZhdGUga2V5IGxvYWRpbmcuIFRoYXQgd2lsbCBhbHNvIGNoZWNrIGZvciBleHBpcmVkIHByaXZhdGUga2V5CisgICAgICAgIGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwyLmJ1aWxkT3V0Ym91bmRLZXlNYW5hZ2VyRmFjdG9yeSgpOworICAgICAgICAvLyBOb3cgd2Ugc2hvdWxkIGhhdmUgY2hlY2tlZCB0aGUgcHJpdmF0ZSBrZXkncyBleHBpcnkKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbDIub3V0Ym91bmRLZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsMi5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgbmV3IGZhY3Rvcnkgb2JqZWN0IHByZWZvcm1zIHRoZSBmcmVzaCBwcml2YXRlIGtleSBleHBpcnkgY2hlY2sKKyAgICAgICAgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5IGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwzID0gbmV3IERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeShjb25maWcpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbDMub3V0Ym91bmRLZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSk7CisgICAgICAgIGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwzLmJ1aWxkT3V0Ym91bmRLZXlNYW5hZ2VyRmFjdG9yeSgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsMy5vdXRib3VuZEtleXN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwyLmtleXN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5KTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlT3BlblNzbEZvckluSnZtRHRlc3RzKCkgewogICAgICAgICAvLyBUaGUgY29uZmlndXJhdGlvbiBuYW1lIGJlbG93IGlzIGhhcmQtY29kZWQgaW50ZW50aW9uYWxseSB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgYnJlYWsgdGhlIGNvbnRyYWN0IHdpdGhvdXQKICAgICAgICAgLy8gY2hhbmdpbmcgdGhlIGRvY3VtZW50YXRpb24gYXBwcm9wcmlhdGVseQotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5kaXNhYmxlX3RjYWN0aXZlX29wZW5zc2wiLCJ0cnVlIik7Ci0gICAgICAgIE1hcDxTdHJpbmcsT2JqZWN0PiBjb25maWcgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIGNvbmZpZy5wdXRBbGwoY29tbW9uQ29uZmlnKTsKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KERJU0FCTEVfVENBQ1RJVkVfT1BFTlNTTCwgdHJ1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsT2JqZWN0PiBjb25maWcgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICBjb25maWcucHV0QWxsKGNvbW1vbkNvbmZpZyk7CiAKLSAgICAgICAgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5IGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwgPSBuZXcgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5KGNvbmZpZyk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoU3NsUHJvdmlkZXIuSkRLLCBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsLmdldFNzbFByb3ZpZGVyKCkpOwotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiY2Fzc2FuZHJhLmRpc2FibGVfdGNhY3RpdmVfb3BlbnNzbCIpOworICAgICAgICAgICAgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5IGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwgPSBuZXcgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5KGNvbmZpZyk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFNzbFByb3ZpZGVyLkpESywgZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbC5nZXRTc2xQcm92aWRlcigpKTsKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9GaWxlQmFzZWRTc2xDb250ZXh0RmFjdG9yeVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9GaWxlQmFzZWRTc2xDb250ZXh0RmFjdG9yeVRlc3QuamF2YQppbmRleCBiZTQ5ZDE2Li5mYzg0YjNhIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvRmlsZUJhc2VkU3NsQ29udGV4dEZhY3RvcnlUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0ZpbGVCYXNlZFNzbENvbnRleHRGYWN0b3J5VGVzdC5qYXZhCkBAIC0zMiw2ICszMiw5IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRW5jcnlwdGlvbk9wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLlBhcmFtZXRlcml6ZWRDbGFzczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfQ09ORklHOwogCiBwdWJsaWMgY2xhc3MgRmlsZUJhc2VkU3NsQ29udGV4dEZhY3RvcnlUZXN0CiB7CkBAIC0zOSwxNiArNDIsMTkgQEAKIAogICAgIHByaXZhdGUgRW5jcnlwdGlvbk9wdGlvbnMuU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgZW5jcnlwdGlvbk9wdGlvbnM7CiAKKyAgICBzdGF0aWMgV2l0aFByb3BlcnRpZXMgcHJvcGVydGllczsKKwogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cERhdGFiYXNlRGVzY3JpcHRvcigpCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5jb25maWciLCAiY2Fzc2FuZHJhLnlhbWwiKTsKKyAgICAgICAgQ0FTU0FORFJBX0NPTkZJRy5yZXNldCgpOworICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCk7CiAgICAgfQogCiAgICAgQEFmdGVyQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVhckRvd25EYXRhYmFzZURlc2NyaXB0b3IoKQogICAgIHsKLSAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoImNhc3NhbmRyYS5jb25maWciKTsKKyAgICAgICAgcHJvcGVydGllcy5jbG9zZSgpOwogICAgIH0KIAogICAgIEBCZWZvcmUKQEAgLTYyLDcgKzY4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFJlcXVpcmVDbGllbnRBdXRoKGZhbHNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ2lwaGVyU3VpdGVzKCJUTFNfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEtleVN0b3JlKCJ0ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0LmtleXN0b3JlIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEtleVN0b3JlUGFzc3dvcmQoImNhc3NhbmRyYSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoS2V5U3RvcmVQYXNzd29yZCgiY2Fzc2FuZHJhIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aE91dGJvdW5kS2V5c3RvcmUoInRlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3Rfb3V0Ym91bmQua2V5c3RvcmUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoT3V0Ym91bmRLZXlzdG9yZVBhc3N3b3JkKCJjYXNzYW5kcmEiKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtNzMsNiArODEsNyBAQAogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZWN1cml0eS5GaWxlQmFzZWRTc2xDb250ZXh0RmFjdG9yeVRlc3QkVGVzdEZpbGVCYXNlZFNTTENvbnRleHRGYWN0b3J5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbEVuY3J5cHRpb25PcHRpb25zLnNzbF9jb250ZXh0X2ZhY3RvcnkuY2xhc3NfbmFtZSk7CiAgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJrZXlzdG9yZV9wYXNzd29yZCBtdXN0IG5vdCBiZSBudWxsIiwgbG9jYWxFbmNyeXB0aW9uT3B0aW9ucy5rZXlzdG9yZV9wYXNzd29yZCk7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJvdXRib3VuZF9rZXlzdG9yZV9wYXNzd29yZCBtdXN0IG5vdCBiZSBudWxsIiwgbG9jYWxFbmNyeXB0aW9uT3B0aW9ucy5vdXRib3VuZF9rZXlzdG9yZV9wYXNzd29yZCk7CiAKICAgICAgICAgVGVzdEZpbGVCYXNlZFNTTENvbnRleHRGYWN0b3J5IHNzbENvbnRleHRGYWN0b3J5ID0KICAgICAgICAgKFRlc3RGaWxlQmFzZWRTU0xDb250ZXh0RmFjdG9yeSkgbG9jYWxFbmNyeXB0aW9uT3B0aW9ucy5zc2xDb250ZXh0RmFjdG9yeUluc3RhbmNlOwpAQCAtODYsMTEgKzk1LDEyIEBACiAgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5S2V5c3RvcmVQYXNzd29yZHMoKSB0aHJvd3MgU1NMRXhjZXB0aW9uCiAgICAgewotICAgICAgICBFbmNyeXB0aW9uT3B0aW9ucy5TZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyBsb2NhbEVuY3J5cHRpb25PcHRpb25zID0gZW5jcnlwdGlvbk9wdGlvbnMud2l0aEtleVN0b3JlUGFzc3dvcmQobnVsbCk7CisgICAgICAgIEVuY3J5cHRpb25PcHRpb25zLlNlcnZlckVuY3J5cHRpb25PcHRpb25zIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMgPSBlbmNyeXB0aW9uT3B0aW9ucy53aXRoS2V5U3RvcmVQYXNzd29yZChudWxsKS53aXRoT3V0Ym91bmRLZXlzdG9yZVBhc3N3b3JkKG51bGwpOwogCiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5LkZpbGVCYXNlZFNzbENvbnRleHRGYWN0b3J5VGVzdCRUZXN0RmlsZUJhc2VkU1NMQ29udGV4dEZhY3RvcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMuc3NsX2NvbnRleHRfZmFjdG9yeS5jbGFzc19uYW1lKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwoImtleXN0b3JlX3Bhc3N3b3JkIG11c3QgYmUgbnVsbCIsIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMua2V5c3RvcmVfcGFzc3dvcmQpOworICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbCgib3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQgbXVzdCBiZSBudWxsIiwgbG9jYWxFbmNyeXB0aW9uT3B0aW9ucy5vdXRib3VuZF9rZXlzdG9yZV9wYXNzd29yZCk7CiAKICAgICAgICAgVGVzdEZpbGVCYXNlZFNTTENvbnRleHRGYWN0b3J5IHNzbENvbnRleHRGYWN0b3J5ID0KICAgICAgICAgKFRlc3RGaWxlQmFzZWRTU0xDb250ZXh0RmFjdG9yeSkgbG9jYWxFbmNyeXB0aW9uT3B0aW9ucy5zc2xDb250ZXh0RmFjdG9yeUluc3RhbmNlOwpAQCAtMTE3LDYgKzEyNyw3IEBACiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5LkZpbGVCYXNlZFNzbENvbnRleHRGYWN0b3J5VGVzdCRUZXN0RmlsZUJhc2VkU1NMQ29udGV4dEZhY3RvcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMuc3NsX2NvbnRleHRfZmFjdG9yeS5jbGFzc19uYW1lKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwoImtleXN0b3JlX3Bhc3N3b3JkIG11c3QgYmUgbnVsbCIsIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMua2V5c3RvcmVfcGFzc3dvcmQpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgib3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQgbXVzdCBub3QgYmUgbnVsbCIsIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMub3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQpOwogCiAgICAgICAgIFRlc3RGaWxlQmFzZWRTU0xDb250ZXh0RmFjdG9yeSBzc2xDb250ZXh0RmFjdG9yeSA9CiAgICAgICAgIChUZXN0RmlsZUJhc2VkU1NMQ29udGV4dEZhY3RvcnkpIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMuc3NsQ29udGV4dEZhY3RvcnlJbnN0YW5jZTsKQEAgLTEzMiw2ICsxNDMsMjYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRlc3RzIGZvciB0aGUgZW1wdHkgcGFzc3dvcmQgZm9yIHRoZSB7QGNvZGUgb3V0Ym91bmRfa2V5c3RvcmV9LiBTaW5jZSB0aGUge0Bjb2RlIG91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkfSBkZWZhdWx0cworICAgICAqIHRvIHRoZSB7QGNvZGUga2V5c3RvcmVfcGFzc3dvcmR9LCB0aGlzIHRlc3Qgc2hvdWxkIHBhc3Mgd2l0aG91dCBleGNlcHRpb25zLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9ubHlFbXB0eU91dGJvdW5kS2V5c3RvcmVQYXNzd29yZCgpIHRocm93cyBTU0xFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEVuY3J5cHRpb25PcHRpb25zLlNlcnZlckVuY3J5cHRpb25PcHRpb25zIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMgPSBlbmNyeXB0aW9uT3B0aW9ucy53aXRoT3V0Ym91bmRLZXlzdG9yZVBhc3N3b3JkKG51bGwpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5LkZpbGVCYXNlZFNzbENvbnRleHRGYWN0b3J5VGVzdCRUZXN0RmlsZUJhc2VkU1NMQ29udGV4dEZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMuc3NsX2NvbnRleHRfZmFjdG9yeS5jbGFzc19uYW1lKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoImtleXN0b3JlX3Bhc3N3b3JkIG11c3Qgbm90IGJlIG51bGwiLCBsb2NhbEVuY3J5cHRpb25PcHRpb25zLmtleXN0b3JlX3Bhc3N3b3JkKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwoIm91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkIG11c3QgYmUgbnVsbCIsIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMub3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQpOworCisgICAgICAgIFRlc3RGaWxlQmFzZWRTU0xDb250ZXh0RmFjdG9yeSBzc2xDb250ZXh0RmFjdG9yeSA9CisgICAgICAgIChUZXN0RmlsZUJhc2VkU1NMQ29udGV4dEZhY3RvcnkpIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMuc3NsQ29udGV4dEZhY3RvcnlJbnN0YW5jZTsKKyAgICAgICAgc3NsQ29udGV4dEZhY3RvcnkuYnVpbGRLZXlNYW5hZ2VyRmFjdG9yeSgpOworICAgICAgICBzc2xDb250ZXh0RmFjdG9yeS5idWlsZFRydXN0TWFuYWdlckZhY3RvcnkoKTsKKyAgICB9CisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVRydXN0c3RvcmVQYXNzd29yZCgpIHRocm93cyBTU0xFeGNlcHRpb24KICAgICB7CkBAIC0xMzksNiArMTcwLDcgQEAKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygib3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VjdXJpdHkuRmlsZUJhc2VkU3NsQ29udGV4dEZhY3RvcnlUZXN0JFRlc3RGaWxlQmFzZWRTU0xDb250ZXh0RmFjdG9yeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxFbmNyeXB0aW9uT3B0aW9ucy5zc2xfY29udGV4dF9mYWN0b3J5LmNsYXNzX25hbWUpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgia2V5c3RvcmVfcGFzc3dvcmQgbXVzdCBub3QgYmUgbnVsbCIsIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMua2V5c3RvcmVfcGFzc3dvcmQpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgib3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQgbXVzdCBub3QgYmUgbnVsbCIsIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMub3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbCgidHJ1c3RzdG9yZV9wYXNzd29yZCBtdXN0IGJlIG51bGwiLCBsb2NhbEVuY3J5cHRpb25PcHRpb25zLnRydXN0c3RvcmVfcGFzc3dvcmQpOwogCiAgICAgICAgIFRlc3RGaWxlQmFzZWRTU0xDb250ZXh0RmFjdG9yeSBzc2xDb250ZXh0RmFjdG9yeSA9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeUNvbmZpZ1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9QRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5Q29uZmlnVGVzdC5qYXZhCmluZGV4IGFiNmIwMGEuLmUyN2JlNGUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9QRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5Q29uZmlnVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9QRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5Q29uZmlnVGVzdC5qYXZhCkBAIC0yNywxOSArMjcsMjQgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfQ09ORklHOwogCiBwdWJsaWMgY2xhc3MgUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeUNvbmZpZ1Rlc3QKIHsKKyAgICBzdGF0aWMgV2l0aFByb3BlcnRpZXMgcHJvcGVydGllczsKKwogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cERhdGFiYXNlRGVzY3JpcHRvcigpCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5jb25maWciLCAiY2Fzc2FuZHJhLXBlbS1zc2xjb250ZXh0ZmFjdG9yeS55YW1sIik7CisgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgV2l0aFByb3BlcnRpZXMoKS5zZXQoQ0FTU0FORFJBX0NPTkZJRywgImNhc3NhbmRyYS1wZW0tc3NsY29udGV4dGZhY3RvcnkueWFtbCIpOwogICAgIH0KIAogICAgIEBBZnRlckNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlYXJEb3duRGF0YWJhc2VEZXNjcmlwdG9yKCkKICAgICB7Ci0gICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KCJjYXNzYW5kcmEuY29uZmlnIik7CisgICAgICAgIHByb3BlcnRpZXMuY2xvc2UoKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1BFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnlDb25maWdXaXRoTWlzbWF0Y2hpbmdQYXNzd29yZHNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeUNvbmZpZ1dpdGhNaXNtYXRjaGluZ1Bhc3N3b3Jkc1Rlc3QuamF2YQppbmRleCBjMWUyZGJlLi42OThlN2E3IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeUNvbmZpZ1dpdGhNaXNtYXRjaGluZ1Bhc3N3b3Jkc1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeUNvbmZpZ1dpdGhNaXNtYXRjaGluZ1Bhc3N3b3Jkc1Rlc3QuamF2YQpAQCAtMjcsMjAgKzI3LDI1IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9DT05GSUc7CisKIHB1YmxpYyBjbGFzcyBQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5Q29uZmlnV2l0aE1pc21hdGNoaW5nUGFzc3dvcmRzVGVzdAogeworICAgIHN0YXRpYyBXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzOworCiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwRGF0YWJhc2VEZXNjcmlwdG9yKCkKICAgICB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmNvbmZpZyIsICJjYXNzYW5kcmEtcGVtLXNzbGNvbnRleHRmYWN0b3J5LW1pc21hdGNoaW5nLXBhc3N3b3Jkcy55YW1sIik7CisgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgV2l0aFByb3BlcnRpZXMoKS5zZXQoQ0FTU0FORFJBX0NPTkZJRywgImNhc3NhbmRyYS1wZW0tc3NsY29udGV4dGZhY3RvcnktbWlzbWF0Y2hpbmctcGFzc3dvcmRzLnlhbWwiKTsKICAgICB9CiAKICAgICBAQWZ0ZXJDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyRG93bkRhdGFiYXNlRGVzY3JpcHRvcigpCiAgICAgewotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiY2Fzc2FuZHJhLmNvbmZpZyIpOworICAgICAgICBwcm9wZXJ0aWVzLmNsb3NlKCk7CiAgICAgfQogCiAgICAgQFRlc3QoZXhwZWN0ZWQgPSBDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzKQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1BFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnlDb25maWdXaXRoVW5lbmNyeXB0ZWRLZXlzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1BFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnlDb25maWdXaXRoVW5lbmNyeXB0ZWRLZXlzVGVzdC5qYXZhCmluZGV4IDA2NmRlOGYuLjJiNjNkMDUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9QRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5Q29uZmlnV2l0aFVuZW5jcnlwdGVkS2V5c1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeUNvbmZpZ1dpdGhVbmVuY3J5cHRlZEtleXNUZXN0LmphdmEKQEAgLTI3LDIwICsyNywyNyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5XaXRoUHJvcGVydGllczsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9DT05GSUc7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRElTQUJMRV9UQ0FDVElWRV9PUEVOU1NMOwogCiBwdWJsaWMgY2xhc3MgUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeUNvbmZpZ1dpdGhVbmVuY3J5cHRlZEtleXNUZXN0CiB7CisgICAgc3RhdGljIFdpdGhQcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXBEYXRhYmFzZURlc2NyaXB0b3IoKQogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuY29uZmlnIiwgImNhc3NhbmRyYS1wZW0tc3NsY29udGV4dGZhY3RvcnktdW5lbmNyeXB0ZWRrZXlzLnlhbWwiKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuZGlzYWJsZV90Y2FjdGl2ZV9vcGVuc3NsIiwgInRydWUiKTsKKyAgICAgICAgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpCisgICAgICAgICAgICAgICAgICAgICAuc2V0KENBU1NBTkRSQV9DT05GSUcsICJjYXNzYW5kcmEtcGVtLXNzbGNvbnRleHRmYWN0b3J5LXVuZW5jcnlwdGVka2V5cy55YW1sIikKKyAgICAgICAgICAgICAgICAgICAgIC5zZXQoRElTQUJMRV9UQ0FDVElWRV9PUEVOU1NMLCB0cnVlKTsKICAgICB9CiAKICAgICBAQWZ0ZXJDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyRG93bkRhdGFiYXNlRGVzY3JpcHRvcigpCiAgICAgewotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiY2Fzc2FuZHJhLmNvbmZpZyIpOworICAgICAgICBwcm9wZXJ0aWVzLmNsb3NlKCk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9QRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5SW52YWxpZENvbmZpZ1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9QRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5SW52YWxpZENvbmZpZ1Rlc3QuamF2YQppbmRleCAyMjgxMTM3Li5iYjE1N2JiIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeUludmFsaWRDb25maWdUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1BFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnlJbnZhbGlkQ29uZmlnVGVzdC5qYXZhCkBAIC0yNywyMCArMjcsMjUgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX0NPTkZJRzsKKwogcHVibGljIGNsYXNzIFBFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnlJbnZhbGlkQ29uZmlnVGVzdAogeworICAgIHN0YXRpYyBXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzOworCiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwRGF0YWJhc2VEZXNjcmlwdG9yKCkKICAgICB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmNvbmZpZyIsICJjYXNzYW5kcmEtcGVtLXNzbGNvbnRleHRmYWN0b3J5LWludmFsaWRjb25maWd1cmF0aW9uLnlhbWwiKTsKKyAgICAgICAgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChDQVNTQU5EUkFfQ09ORklHLCAiY2Fzc2FuZHJhLXBlbS1zc2xjb250ZXh0ZmFjdG9yeS1pbnZhbGlkY29uZmlndXJhdGlvbi55YW1sIik7CiAgICAgfQogCiAgICAgQEFmdGVyQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVhckRvd25EYXRhYmFzZURlc2NyaXB0b3IoKQogICAgIHsKLSAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoImNhc3NhbmRyYS5jb25maWciKTsKKyAgICAgICAgcHJvcGVydGllcy5jbG9zZSgpOwogICAgIH0KIAogICAgIEBUZXN0KGV4cGVjdGVkID0gQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9QRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1BFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnlUZXN0LmphdmEKaW5kZXggMjQzZDMwMC4uZWU5YzYxMCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1BFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnlUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1BFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnlUZXN0LmphdmEKQEAgLTM1LDcgKzM1LDkgQEAKIGltcG9ydCBpby5uZXR0eS5oYW5kbGVyLnNzbC5Tc2xQcm92aWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRW5jcnlwdGlvbk9wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLlBhcmFtZXRlcml6ZWRDbGFzczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ESVNBQkxFX1RDQUNUSVZFX09QRU5TU0w7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5LlBFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnkuQ29uZmlnS2V5LkVOQ09ERURfQ0VSVElGSUNBVEVTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZWN1cml0eS5QRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5LkNvbmZpZ0tleS5FTkNPREVEX0tFWTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VjdXJpdHkuUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeS5Db25maWdLZXkuS0VZX1BBU1NXT1JEOwpAQCAtMjE2LDYgKzIxOCwyNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFJlcXVpcmVDbGllbnRBdXRoKGZhbHNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENpcGhlclN1aXRlcygiVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU3NsQ29udGV4dEZhY3Rvcnkoc3NsQ29udGV4dEZhY3RvcnkpOworICAgICAgICBTc2xDb250ZXh0IHNzbENvbnRleHQgPSBTU0xGYWN0b3J5LmdldE9yQ3JlYXRlU3NsQ29udGV4dChvcHRpb25zLCB0cnVlLCBJU3NsQ29udGV4dEZhY3RvcnkuU29ja2V0VHlwZS5TRVJWRVIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChzc2xDb250ZXh0KTsKKyAgICAgICAgaWYgKE9wZW5Tc2wuaXNBdmFpbGFibGUoKSkKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHNzbENvbnRleHQgaW5zdGFuY2VvZiBPcGVuU3NsQ29udGV4dCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHNzbENvbnRleHQgaW5zdGFuY2VvZiBTc2xDb250ZXh0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdldFNzbENvbnRleHRPcGVuU1NMT3V0Ym91bmRLZXlzdG9yZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUGFyYW1ldGVyaXplZENsYXNzIHNzbENvbnRleHRGYWN0b3J5ID0gbmV3IFBhcmFtZXRlcml6ZWRDbGFzcyhQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5LmNsYXNzLmdldFNpbXBsZU5hbWUoKQorICAgICAgICAsIG5ldyBIYXNoTWFwPD4oKSk7CisgICAgICAgIEVuY3J5cHRpb25PcHRpb25zLlNlcnZlckVuY3J5cHRpb25PcHRpb25zIG9wdGlvbnMgPSBuZXcgRW5jcnlwdGlvbk9wdGlvbnMuU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoKS53aXRoVHJ1c3RTdG9yZSgidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdC50cnVzdHN0b3JlLnBlbSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoS2V5U3RvcmUoInRlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3Qua2V5c3RvcmUucGVtIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhLZXlTdG9yZVBhc3N3b3JkKCJjYXNzYW5kcmEiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aE91dGJvdW5kS2V5c3RvcmUoInRlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3Qua2V5c3RvcmUucGVtIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhPdXRib3VuZEtleXN0b3JlUGFzc3dvcmQoImNhc3NhbmRyYSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoUmVxdWlyZUNsaWVudEF1dGgoZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ2lwaGVyU3VpdGVzKCJUTFNfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTc2xDb250ZXh0RmFjdG9yeShzc2xDb250ZXh0RmFjdG9yeSk7CiAgICAgICAgIFNzbENvbnRleHQgc3NsQ29udGV4dCA9IFNTTEZhY3RvcnkuZ2V0T3JDcmVhdGVTc2xDb250ZXh0KG9wdGlvbnMsIHRydWUsIElTc2xDb250ZXh0RmFjdG9yeS5Tb2NrZXRUeXBlLkNMSUVOVCk7CiAgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHNzbENvbnRleHQpOwogICAgICAgICBpZiAoT3BlblNzbC5pc0F2YWlsYWJsZSgpKQpAQCAtMjMzLDcgKzI1Niw3IEBACiAgICAgICAgIGNvbmZpZy5wdXQoInRydXN0c3RvcmUiLCAiL3RoaXMvaXMvcHJvYmFibHkvbm90L2EvZmlsZS9vbi95b3VyL3Rlc3QvbWFjaGluZSIpOwogCiAgICAgICAgIERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeSBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsID0gbmV3IERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeShjb25maWcpOwotICAgICAgICBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsLmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKKyAgICAgICAgZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbC5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOwogICAgICAgICBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsLmJ1aWxkVHJ1c3RNYW5hZ2VyRmFjdG9yeSgpOwogICAgIH0KIApAQCAtMjQ0LDcgKzI2Nyw3IEBACiAgICAgICAgIGNvbmZpZy5wdXRBbGwoY29tbW9uQ29uZmlnKTsKIAogICAgICAgICBQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5IHNzbENvbnRleHRGYWN0b3J5ID0gbmV3IFBFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnkoY29uZmlnKTsKLSAgICAgICAgc3NsQ29udGV4dEZhY3RvcnkuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOworICAgICAgICBzc2xDb250ZXh0RmFjdG9yeS5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOwogICAgICAgICBUcnVzdE1hbmFnZXJGYWN0b3J5IHRydXN0TWFuYWdlckZhY3RvcnkgPSBzc2xDb250ZXh0RmFjdG9yeS5idWlsZFRydXN0TWFuYWdlckZhY3RvcnkoKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwodHJ1c3RNYW5hZ2VyRmFjdG9yeSk7CiAgICAgfQpAQCAtMjU4LDcgKzI4MSw3IEBACiAgICAgICAgIGFkZEZpbGVCYXNlVHJ1c3RTdG9yZU9wdGlvbnMoY29uZmlnKTsKIAogICAgICAgICBQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5IHNzbENvbnRleHRGYWN0b3J5ID0gbmV3IFBFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnkoY29uZmlnKTsKLSAgICAgICAgc3NsQ29udGV4dEZhY3RvcnkuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOworICAgICAgICBzc2xDb250ZXh0RmFjdG9yeS5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOwogICAgICAgICBUcnVzdE1hbmFnZXJGYWN0b3J5IHRydXN0TWFuYWdlckZhY3RvcnkgPSBzc2xDb250ZXh0RmFjdG9yeS5idWlsZFRydXN0TWFuYWdlckZhY3RvcnkoKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwodHJ1c3RNYW5hZ2VyRmFjdG9yeSk7CiAgICAgfQpAQCAtMjcxLDcgKzI5NCw3IEBACiAgICAgICAgIGNvbmZpZy5wdXQoImtleXN0b3JlIiwgIi90aGlzL2lzL3Byb2JhYmx5L25vdC9hL2ZpbGUvb24veW91ci90ZXN0L21hY2hpbmUiKTsKIAogICAgICAgICBQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5IHNzbENvbnRleHRGYWN0b3J5ID0gbmV3IFBFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnkoY29uZmlnKTsKLSAgICAgICAgc3NsQ29udGV4dEZhY3RvcnkuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOworICAgICAgICBzc2xDb250ZXh0RmFjdG9yeS5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOwogICAgICAgICBzc2xDb250ZXh0RmFjdG9yeS5idWlsZEtleU1hbmFnZXJGYWN0b3J5KCk7CiAgICAgfQogCkBAIC0yOTUsMjAgKzMxOCwyMCBAQAogCiAgICAgICAgIFBFTUJhc2VkU3NsQ29udGV4dEZhY3Rvcnkgc3NsQ29udGV4dEZhY3RvcnkxID0gbmV3IFBFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnkoY29uZmlnKTsKICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBleGlyeSBjaGVjayBkaWRuJ3QgaGFwcGVuIHNvIGZhciBmb3IgdGhlIHByaXZhdGUga2V5Ci0gICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShzc2xDb250ZXh0RmFjdG9yeTEuY2hlY2tlZEV4cGlyeSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShzc2xDb250ZXh0RmFjdG9yeTEua2V5c3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkpOwogCiAgICAgICAgIGFkZEtleVN0b3JlT3B0aW9ucyhjb25maWcpOwogICAgICAgICBQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5IHNzbENvbnRleHRGYWN0b3J5MiA9IG5ldyBQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5KGNvbmZpZyk7CiAgICAgICAgIC8vIFRyaWdnZXIgdGhlIHByaXZhdGUga2V5IGxvYWRpbmcuIFRoYXQgd2lsbCBhbHNvIGNoZWNrIGZvciBleHBpcmVkIHByaXZhdGUga2V5CiAgICAgICAgIHNzbENvbnRleHRGYWN0b3J5Mi5idWlsZEtleU1hbmFnZXJGYWN0b3J5KCk7CiAgICAgICAgIC8vIE5vdyB3ZSBzaG91bGQgaGF2ZSBjaGVja2VkIHRoZSBwcml2YXRlIGtleSdzIGV4cGlyeQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShzc2xDb250ZXh0RmFjdG9yeTIuY2hlY2tlZEV4cGlyeSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHNzbENvbnRleHRGYWN0b3J5Mi5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSk7CiAKICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgbmV3IGZhY3Rvcnkgb2JqZWN0IHByZWZvcm1zIHRoZSBmcmVzaCBwcml2YXRlIGtleSBleHBpcnkgY2hlY2sKICAgICAgICAgUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeSBzc2xDb250ZXh0RmFjdG9yeTMgPSBuZXcgUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeShjb25maWcpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2Uoc3NsQ29udGV4dEZhY3RvcnkzLmNoZWNrZWRFeHBpcnkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2Uoc3NsQ29udGV4dEZhY3RvcnkzLmtleXN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5KTsKICAgICAgICAgc3NsQ29udGV4dEZhY3RvcnkzLmJ1aWxkS2V5TWFuYWdlckZhY3RvcnkoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoc3NsQ29udGV4dEZhY3RvcnkzLmNoZWNrZWRFeHBpcnkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShzc2xDb250ZXh0RmFjdG9yeTMua2V5c3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkpOwogICAgIH0KIAogICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQpAQCAtMzQzLDIwICszNjYsMjAgQEAKIAogICAgICAgICBQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5IHNzbENvbnRleHRGYWN0b3J5MSA9IG5ldyBQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5KGNvbmZpZyk7CiAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZXhwaXJ5IGNoZWNrIGRpZG4ndCBoYXBwZW4gc28gZmFyIGZvciB0aGUgcHJpdmF0ZSBrZXkKLSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKHNzbENvbnRleHRGYWN0b3J5MS5jaGVja2VkRXhwaXJ5KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKHNzbENvbnRleHRGYWN0b3J5MS5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSk7CiAKICAgICAgICAgYWRkRmlsZUJhc2VLZXlTdG9yZU9wdGlvbnMoY29uZmlnKTsKICAgICAgICAgUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeSBzc2xDb250ZXh0RmFjdG9yeTIgPSBuZXcgUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeShjb25maWcpOwogICAgICAgICAvLyBUcmlnZ2VyIHRoZSBwcml2YXRlIGtleSBsb2FkaW5nLiBUaGF0IHdpbGwgYWxzbyBjaGVjayBmb3IgZXhwaXJlZCBwcml2YXRlIGtleQogICAgICAgICBzc2xDb250ZXh0RmFjdG9yeTIuYnVpbGRLZXlNYW5hZ2VyRmFjdG9yeSgpOwogICAgICAgICAvLyBOb3cgd2Ugc2hvdWxkIGhhdmUgY2hlY2tlZCB0aGUgcHJpdmF0ZSBrZXkncyBleHBpcnkKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoc3NsQ29udGV4dEZhY3RvcnkyLmNoZWNrZWRFeHBpcnkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShzc2xDb250ZXh0RmFjdG9yeTIua2V5c3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkpOwogCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IG5ldyBmYWN0b3J5IG9iamVjdCBwcmVmb3JtcyB0aGUgZnJlc2ggcHJpdmF0ZSBrZXkgZXhwaXJ5IGNoZWNrCiAgICAgICAgIFBFTUJhc2VkU3NsQ29udGV4dEZhY3Rvcnkgc3NsQ29udGV4dEZhY3RvcnkzID0gbmV3IFBFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnkoY29uZmlnKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKHNzbENvbnRleHRGYWN0b3J5My5jaGVja2VkRXhwaXJ5KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKHNzbENvbnRleHRGYWN0b3J5My5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSk7CiAgICAgICAgIHNzbENvbnRleHRGYWN0b3J5My5idWlsZEtleU1hbmFnZXJGYWN0b3J5KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHNzbENvbnRleHRGYWN0b3J5My5jaGVja2VkRXhwaXJ5KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoc3NsQ29udGV4dEZhY3RvcnkzLmtleXN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5KTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMzkyLDEzICs0MTUsMTQgQEAKICAgICB7CiAgICAgICAgIC8vIFRoZSBjb25maWd1cmF0aW9uIG5hbWUgYmVsb3cgaXMgaGFyZC1jb2RlZCBpbnRlbnRpb25hbGx5IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBicmVhayB0aGUgY29udHJhY3Qgd2l0aG91dAogICAgICAgICAvLyBjaGFuZ2luZyB0aGUgZG9jdW1lbnRhdGlvbiBhcHByb3ByaWF0ZWx5Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmRpc2FibGVfdGNhY3RpdmVfb3BlbnNzbCIsICJ0cnVlIik7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY29uZmlnID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBjb25maWcucHV0QWxsKGNvbW1vbkNvbmZpZyk7CisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChESVNBQkxFX1RDQUNUSVZFX09QRU5TU0wsIHRydWUpKQorICAgICAgICB7CisgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbmZpZyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgIGNvbmZpZy5wdXRBbGwoY29tbW9uQ29uZmlnKTsKIAotICAgICAgICBQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5IHNzbENvbnRleHRGYWN0b3J5ID0gbmV3IFBFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnkoY29uZmlnKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTc2xQcm92aWRlci5KREssIHNzbENvbnRleHRGYWN0b3J5LmdldFNzbFByb3ZpZGVyKCkpOwotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiY2Fzc2FuZHJhLmRpc2FibGVfdGNhY3RpdmVfb3BlbnNzbCIpOworICAgICAgICAgICAgUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeSBzc2xDb250ZXh0RmFjdG9yeSA9IG5ldyBQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5KGNvbmZpZyk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFNzbFByb3ZpZGVyLkpESywgc3NsQ29udGV4dEZhY3RvcnkuZ2V0U3NsUHJvdmlkZXIoKSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9QRU1KS1NTc2xDb250ZXh0RmFjdG9yeUNvbmZpZ1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9QRU1KS1NTc2xDb250ZXh0RmFjdG9yeUNvbmZpZ1Rlc3QuamF2YQppbmRleCA4ZWZkM2U0Li5mMTg3ZTJjIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvUEVNSktTU3NsQ29udGV4dEZhY3RvcnlDb25maWdUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1BFTUpLU1NzbENvbnRleHRGYWN0b3J5Q29uZmlnVGVzdC5qYXZhCkBAIC0yNywxOCArMjcsMjMgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfQ09ORklHOwogCiBwdWJsaWMgY2xhc3MgUEVNSktTU3NsQ29udGV4dEZhY3RvcnlDb25maWdUZXN0CiB7CisgICAgc3RhdGljIFdpdGhQcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXBEYXRhYmFzZURlc2NyaXB0b3IoKQogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuY29uZmlnIiwgImNhc3NhbmRyYS1wZW0tamtzLXNzbGNvbnRleHRmYWN0b3J5LnlhbWwiKTsKKyAgICAgICAgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChDQVNTQU5EUkFfQ09ORklHLCAiY2Fzc2FuZHJhLXBlbS1qa3Mtc3NsY29udGV4dGZhY3RvcnkueWFtbCIpOwogICAgIH0KIAogICAgIEBBZnRlckNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlYXJEb3duRGF0YWJhc2VEZXNjcmlwdG9yKCkgewotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiY2Fzc2FuZHJhLmNvbmZpZyIpOworICAgICAgICBwcm9wZXJ0aWVzLmNsb3NlKCk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9TU0xGYWN0b3J5VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1NTTEZhY3RvcnlUZXN0LmphdmEKaW5kZXggZTVhYTRiMS4uZmYzYmFiOSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1NTTEZhY3RvcnlUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1NTTEZhY3RvcnlUZXN0LmphdmEKQEAgLTE4LDExICsxOCwxOSBAQAogKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VjdXJpdHk7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmVFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuWDUwOUtleU1hbmFnZXI7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CkBAIC0zMSwxMiArMzksMTkgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5zc2wuT3BlblNzbENsaWVudENvbnRleHQ7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5zc2wuT3BlblNzbFNlcnZlckNvbnRleHQ7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5zc2wuT3BlblNzbFNlc3Npb25Db250ZXh0OwogaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuc3NsLlNzbENvbnRleHQ7CiBpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5zc2wudXRpbC5TZWxmU2lnbmVkQ2VydGlmaWNhdGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRW5jcnlwdGlvbk9wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zLlNlcnZlckVuY3J5cHRpb25PcHRpb25zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5QYXJhbWV0ZXJpemVkQ2xhc3M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiAKIHB1YmxpYyBjbGFzcyBTU0xGYWN0b3J5VGVzdAogewpAQCAtNjUsMTMgKzgwLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhUcnVzdFN0b3JlKCJ0ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0LnRydXN0c3RvcmUiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoVHJ1c3RTdG9yZVBhc3N3b3JkKCJjYXNzYW5kcmEiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoUmVxdWlyZUNsaWVudEF1dGgoZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDaXBoZXJTdWl0ZXMoIlRMU19SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENpcGhlclN1aXRlcygiVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTc2xDb250ZXh0RmFjdG9yeShuZXcgUGFyYW1ldGVyaXplZENsYXNzKFRlc3RGaWxlQmFzZWRTU0xDb250ZXh0RmFjdG9yeS5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPD4oKSkpOwogICAgIH0KIAogICAgIHByaXZhdGUgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgYWRkS2V5c3RvcmVPcHRpb25zKFNlcnZlckVuY3J5cHRpb25PcHRpb25zIG9wdGlvbnMpCiAgICAgewogICAgICAgICByZXR1cm4gb3B0aW9ucy53aXRoS2V5U3RvcmUoInRlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3Qua2V5c3RvcmUiKQotICAgICAgICAgICAgICAgICAgICAgIC53aXRoS2V5U3RvcmVQYXNzd29yZCgiY2Fzc2FuZHJhIik7CisgICAgICAgICAgICAgICAgICAgICAgLndpdGhLZXlTdG9yZVBhc3N3b3JkKCJjYXNzYW5kcmEiKQorICAgICAgICAgICAgICAgICAgICAgIC53aXRoT3V0Ym91bmRLZXlzdG9yZSgidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdF9vdXRib3VuZC5rZXlzdG9yZSIpCisgICAgICAgICAgICAgICAgICAgICAgLndpdGhPdXRib3VuZEtleXN0b3JlUGFzc3dvcmQoImNhc3NhbmRyYSIpOwogICAgIH0KIAogICAgIHByaXZhdGUgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgYWRkUEVNS2V5c3RvcmVPcHRpb25zKFNlcnZlckVuY3J5cHRpb25PcHRpb25zIG9wdGlvbnMpCkBAIC04MSw2ICsxMDAsOCBAQAogICAgICAgICByZXR1cm4gb3B0aW9ucy53aXRoU3NsQ29udGV4dEZhY3Rvcnkoc3NsQ29udGV4dEZhY3RvcnlDbGFzcykKICAgICAgICAgICAgICAgICAgICAgICAud2l0aEtleVN0b3JlKCJ0ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0LmtleXN0b3JlLnBlbSIpCiAgICAgICAgICAgICAgICAgICAgICAgLndpdGhLZXlTdG9yZVBhc3N3b3JkKCJjYXNzYW5kcmEiKQorICAgICAgICAgICAgICAgICAgICAgIC53aXRoT3V0Ym91bmRLZXlzdG9yZSgidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdC5rZXlzdG9yZS5wZW0iKQorICAgICAgICAgICAgICAgICAgICAgIC53aXRoT3V0Ym91bmRLZXlzdG9yZVBhc3N3b3JkKCJjYXNzYW5kcmEiKQogICAgICAgICAgICAgICAgICAgICAgIC53aXRoVHJ1c3RTdG9yZSgidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdC50cnVzdHN0b3JlLnBlbSIpOwogICAgIH0KIApAQCAtMTE3LDcgKzEzOCw0MSBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFBFTVNzbENvbnRleHRSZWxvYWRfSGFwcHlQYXRoKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2ZXJTb2NrZXRTaG91bGRVc2VLZXlzdG9yZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2VydGlmaWNhdGVFeGNlcHRpb24sIEtleVN0b3JlRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIE5vU3VjaEZpZWxkRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFNlcnZlckVuY3J5cHRpb25PcHRpb25zIG9wdGlvbnMgPSBhZGRLZXlzdG9yZU9wdGlvbnMoZW5jcnlwdGlvbk9wdGlvbnMpCisgICAgICAgIC53aXRoT3V0Ym91bmRLZXlzdG9yZSgiZHVtbXlLZXlzdG9yZSIpCisgICAgICAgIC53aXRoT3V0Ym91bmRLZXlzdG9yZVBhc3N3b3JkKCJkdW1teVBhc3N3b3JkIik7CisKKyAgICAgICAgLy8gU2VydmVyIHNvY2tldCB0eXBlIHNob3VsZCBjcmVhdGUgYSBrZXlzdG9yZSB3aXRoIGtleXN0b3JlICYga2V5c3RvcmUgcGFzc3dvcmQKKyAgICAgICAgZmluYWwgT3BlblNzbFNlcnZlckNvbnRleHQgY29udGV4dCA9IChPcGVuU3NsU2VydmVyQ29udGV4dCkgU1NMRmFjdG9yeS5jcmVhdGVOZXR0eVNzbENvbnRleHQob3B0aW9ucywgdHJ1ZSwgSVNzbENvbnRleHRGYWN0b3J5LlNvY2tldFR5cGUuU0VSVkVSKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb250ZXh0KTsKKworICAgICAgICAvLyBWZXJpZnkgaWYgcmlnaHQgY2VydGlmaWNhdGUgaXMgbG9hZGVkIGludG8gU3NsQ29udGV4dAorICAgICAgICBmaW5hbCBDZXJ0aWZpY2F0ZSBsb2FkZWRDZXJ0aWZpY2F0ZSA9IGdldENlcnRpZmljYXRlTG9hZGVkSW5Tc2xDb250ZXh0KGNvbnRleHQuc2Vzc2lvbkNvbnRleHQoKSk7CisgICAgICAgIGZpbmFsIENlcnRpZmljYXRlIGNlcnRpZmljYXRlID0gZ2V0Q2VydGlmaWNhdGVzKCJ0ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0LmtleXN0b3JlIiwgImNhc3NhbmRyYSIpOworICAgICAgICBhc3NlcnRFcXVhbHMobG9hZGVkQ2VydGlmaWNhdGUsIGNlcnRpZmljYXRlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGllbnRTb2NrZXRTaG91bGRVc2VPdXRib3VuZEtleXN0b3JlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwgS2V5U3RvcmVFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgTm9TdWNoRmllbGRFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgb3B0aW9ucyA9IGFkZEtleXN0b3JlT3B0aW9ucyhlbmNyeXB0aW9uT3B0aW9ucykKKyAgICAgICAgLndpdGhLZXlTdG9yZSgiZHVtbXlLZXlzdG9yZSIpCisgICAgICAgIC53aXRoS2V5U3RvcmVQYXNzd29yZCgiZHVtbXlQYXNzd29yZCIpOworCisgICAgICAgIC8vIENsaWVudCBzb2NrZXQgdHlwZSBzaG91bGQgY3JlYXRlIGEga2V5c3RvcmUgd2l0aCBvdXRib3VuZCBLZXlzdG9yZSAmIG91dGJvdW5kIHBhc3N3b3JkCisgICAgICAgIGZpbmFsIE9wZW5Tc2xDbGllbnRDb250ZXh0IGNvbnRleHQgPSAoT3BlblNzbENsaWVudENvbnRleHQpIFNTTEZhY3RvcnkuY3JlYXRlTmV0dHlTc2xDb250ZXh0KG9wdGlvbnMsIHRydWUsIElTc2xDb250ZXh0RmFjdG9yeS5Tb2NrZXRUeXBlLkNMSUVOVCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udGV4dCk7CisKKyAgICAgICAgLy8gVmVyaWZ5IGlmIHJpZ2h0IGNlcnRpZmljYXRlIGlzIGxvYWRlZCBpbnRvIFNzbENvbnRleHQKKyAgICAgICAgZmluYWwgQ2VydGlmaWNhdGUgbG9hZGVkQ2VydGlmaWNhdGUgPSBnZXRDZXJ0aWZpY2F0ZUxvYWRlZEluU3NsQ29udGV4dChjb250ZXh0LnNlc3Npb25Db250ZXh0KCkpOworICAgICAgICBmaW5hbCBDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSA9IGdldENlcnRpZmljYXRlcygidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdF9vdXRib3VuZC5rZXlzdG9yZSIsICJjYXNzYW5kcmEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxvYWRlZENlcnRpZmljYXRlLCBjZXJ0aWZpY2F0ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UEVNU3NsQ29udGV4dFJlbG9hZF9IYXBweVBhdGgoKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIHRyeQogICAgICAgICB7CkBAIC0yMjMsOCArMjc4LDcgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIGdldFNzbENvbnRleHRfUGFyYW1DaGFuZ2VzKCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBFbmNyeXB0aW9uT3B0aW9ucyBvcHRpb25zID0gYWRkS2V5c3RvcmVPcHRpb25zKGVuY3J5cHRpb25PcHRpb25zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhFbmFibGVkKHRydWUpCisgICAgICAgIFNlcnZlckVuY3J5cHRpb25PcHRpb25zIG9wdGlvbnMgPSBhZGRLZXlzdG9yZU9wdGlvbnMoZW5jcnlwdGlvbk9wdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENpcGhlclN1aXRlcygiVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2Iik7CiAKICAgICAgICAgU3NsQ29udGV4dCBjdHgxID0gU1NMRmFjdG9yeS5nZXRPckNyZWF0ZVNzbENvbnRleHQob3B0aW9ucywgdHJ1ZSwKQEAgLTMwMSw0ICszNTUsMzYgQEAKIAogICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90RXF1YWxzKGNhY2hlS2V5MSwgY2FjaGVLZXkyKTsKICAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RGaWxlQmFzZWRTU0xDb250ZXh0RmFjdG9yeSBleHRlbmRzIEZpbGVCYXNlZFNzbENvbnRleHRGYWN0b3J5IHsKKyAgICAgICAgcHVibGljIFRlc3RGaWxlQmFzZWRTU0xDb250ZXh0RmFjdG9yeShNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtZXRlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2VydGlmaWNhdGUgZ2V0Q2VydGlmaWNhdGVzKGZpbmFsIFN0cmluZyBmaWxlbmFtZSwgZmluYWwgU3RyaW5nIHBhc3N3b3JkKSB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgeworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVuYW1lKTsKKyAgICAgICAgS2V5U3RvcmUga2V5c3RvcmUgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShLZXlTdG9yZS5nZXREZWZhdWx0VHlwZSgpKTsKKyAgICAgICAgY2hhcltdIHBhc3N3ZCA9IHBhc3N3b3JkLnRvQ2hhckFycmF5KCk7CisgICAgICAgIGtleXN0b3JlLmxvYWQoaXMsIHBhc3N3ZCk7CisgICAgICAgIHJldHVybiBrZXlzdG9yZS5nZXRDZXJ0aWZpY2F0ZSgiY2Fzc2FuZHJhX3NzbF90ZXN0Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2VydGlmaWNhdGUgZ2V0Q2VydGlmaWNhdGVMb2FkZWRJblNzbENvbnRleHQoZmluYWwgT3BlblNzbFNlc3Npb25Db250ZXh0IHNlc3Npb24pCisgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgTm9TdWNoRmllbGRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEZpZWxkIHByb3ZpZGVyRmllbGQgPSBPcGVuU3NsU2Vzc2lvbkNvbnRleHQuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgicHJvdmlkZXIiKTsKKyAgICAgICAgcHJvdmlkZXJGaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOworCisgICAgICAgIENsYXNzPD8+IGtleU1hdGVyaWFsUHJvdmlkZXIgPSBDbGFzcy5mb3JOYW1lKCJpby5uZXR0eS5oYW5kbGVyLnNzbC5PcGVuU3NsS2V5TWF0ZXJpYWxQcm92aWRlciIpOworICAgICAgICBPYmplY3QgcHJvdmlkZXIgPSBrZXlNYXRlcmlhbFByb3ZpZGVyLmNhc3QocHJvdmlkZXJGaWVsZC5nZXQoc2Vzc2lvbikpOworCisgICAgICAgIE1ldGhvZCBrZXlNYW5hZ2VyID0gcHJvdmlkZXIuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZCgia2V5TWFuYWdlciIpOworICAgICAgICBrZXlNYW5hZ2VyLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgIFg1MDlLZXlNYW5hZ2VyIGtleU1hbmFnZXIxID0gKFg1MDlLZXlNYW5hZ2VyKSBrZXlNYW5hZ2VyLmludm9rZShwcm92aWRlcik7CisgICAgICAgIGZpbmFsIENlcnRpZmljYXRlW10gY2VydGlmaWNhdGVzID0ga2V5TWFuYWdlcjEuZ2V0Q2VydGlmaWNhdGVDaGFpbigiY2Fzc2FuZHJhX3NzbF90ZXN0Iik7CisgICAgICAgIHJldHVybiBjZXJ0aWZpY2F0ZXNbMF07CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL01hcFNlcmlhbGl6ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VyaWFsaXplcnMvTWFwU2VyaWFsaXplclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDEyMTIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL01hcFNlcmlhbGl6ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnM7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlJhbmdlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnQzMlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5NYXBUeXBlOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsLlVOU0VUX0JZVEVfQlVGRkVSOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIE1hcFNlcmlhbGl6ZXJUZXN0Cit7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5kZXhGcm9tU2VyaWFsaXplZCgpCisgICAgeworICAgICAgICB0ZXN0R2V0SW5kZXhGcm9tU2VyaWFsaXplZCh0cnVlKTsKKyAgICAgICAgdGVzdEdldEluZGV4RnJvbVNlcmlhbGl6ZWQoZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdEdldEluZGV4RnJvbVNlcmlhbGl6ZWQoYm9vbGVhbiBpc011bHRpQ2VsbCkKKyAgICB7CisgICAgICAgIE1hcFR5cGU8SW50ZWdlciwgSW50ZWdlcj4gdHlwZSA9IE1hcFR5cGUuZ2V0SW5zdGFuY2UoSW50MzJUeXBlLmluc3RhbmNlLCBJbnQzMlR5cGUuaW5zdGFuY2UsIGlzTXVsdGlDZWxsKTsKKyAgICAgICAgQWJzdHJhY3RUeXBlPEludGVnZXI+IG5hbWVUeXBlID0gdHlwZS5uYW1lQ29tcGFyYXRvcigpOworICAgICAgICBNYXBTZXJpYWxpemVyPEludGVnZXIsIEludGVnZXI+IHNlcmlhbGl6ZXIgPSB0eXBlLmdldFNlcmlhbGl6ZXIoKTsKKworICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwID0gbmV3IEhhc2hNYXA8Pig0KTsKKyAgICAgICAgbWFwLnB1dCgxLCAxMCk7CisgICAgICAgIG1hcC5wdXQoMywgMzApOworICAgICAgICBtYXAucHV0KDQsIDQwKTsKKyAgICAgICAgbWFwLnB1dCg2LCA2MCk7CisgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSB0eXBlLmRlY29tcG9zZShtYXApOworCisgICAgICAgIGFzc2VydEVxdWFscygtMSwgc2VyaWFsaXplci5nZXRJbmRleEZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMCksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzZXJpYWxpemVyLmdldEluZGV4RnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgxKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBzZXJpYWxpemVyLmdldEluZGV4RnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlcmlhbGl6ZXIuZ2V0SW5kZXhGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDMpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc2VyaWFsaXplci5nZXRJbmRleEZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoNCksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgc2VyaWFsaXplci5nZXRJbmRleEZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoNSksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBzZXJpYWxpemVyLmdldEluZGV4RnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSg2KSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBzZXJpYWxpemVyLmdldEluZGV4RnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSg3KSwgbmFtZVR5cGUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkKDAsIEludGVnZXIuTUFYX1ZBTFVFKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgVU5TRVRfQllURV9CVUZGRVIsIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDQpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMCksIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCA0KSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMSwgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgVU5TRVRfQllURV9CVUZGRVIsIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDEsIDQpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMyksIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigyLCA0KSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDQpLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMywgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSg1KSwgVU5TRVRfQllURV9CVUZGRVIsIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDMsIDQpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoNiksIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAwKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDcpLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAwKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgVU5TRVRfQllURV9CVUZGRVIsIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMSksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZS5kZWNvbXBvc2UoMSksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDEpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUuZGVjb21wb3NlKDIpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAyKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgVU5TRVRfQllURV9CVUZGRVIsIG5hbWVUeXBlLmRlY29tcG9zZSgzKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMyksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZS5kZWNvbXBvc2UoNCksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDMpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUuZGVjb21wb3NlKDUpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCA0KSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgVU5TRVRfQllURV9CVUZGRVIsIG5hbWVUeXBlLmRlY29tcG9zZSg2KSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZS5kZWNvbXBvc2UoNyksIG5hbWVUeXBlKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAxKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBuYW1lVHlwZS5kZWNvbXBvc2UoMSksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDEpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMCksIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMiksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUuZGVjb21wb3NlKDMpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAzKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBuYW1lVHlwZS5kZWNvbXBvc2UoNCksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDMpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMCksIG5hbWVUeXBlLmRlY29tcG9zZSg1KSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUuZGVjb21wb3NlKDYpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCA0KSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBuYW1lVHlwZS5kZWNvbXBvc2UoNyksIG5hbWVUeXBlKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgxKSwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAxKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBuYW1lVHlwZS5kZWNvbXBvc2UoMSksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDEpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMSksIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMiksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgxKSwgbmFtZVR5cGUuZGVjb21wb3NlKDMpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAzKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBuYW1lVHlwZS5kZWNvbXBvc2UoNCksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDMpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMSksIG5hbWVUeXBlLmRlY29tcG9zZSg1KSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgxKSwgbmFtZVR5cGUuZGVjb21wb3NlKDYpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCA0KSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBuYW1lVHlwZS5kZWNvbXBvc2UoNyksIG5hbWVUeXBlKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMSwgMSksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigxLCAxKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDIpLCBuYW1lVHlwZS5kZWNvbXBvc2UoMSksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDEsIDEpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMSwgMiksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUuZGVjb21wb3NlKDMpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigxLCAzKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDIpLCBuYW1lVHlwZS5kZWNvbXBvc2UoNCksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDEsIDMpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIG5hbWVUeXBlLmRlY29tcG9zZSg1KSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMSwgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUuZGVjb21wb3NlKDYpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigxLCA0KSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDIpLCBuYW1lVHlwZS5kZWNvbXBvc2UoNyksIG5hbWVUeXBlKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAxKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBuYW1lVHlwZS5kZWNvbXBvc2UoMSksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDEsIDEpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMSwgMiksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgzKSwgbmFtZVR5cGUuZGVjb21wb3NlKDMpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigyLCAzKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDQpLCBuYW1lVHlwZS5kZWNvbXBvc2UoNCksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDMsIDMpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoNSksIG5hbWVUeXBlLmRlY29tcG9zZSg1KSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMywgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSg2KSwgbmFtZVR5cGUuZGVjb21wb3NlKDYpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAwKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDcpLCBuYW1lVHlwZS5kZWNvbXBvc2UoNyksIG5hbWVUeXBlKSk7CisKKyAgICAgICAgLy8gaW50ZXJ2YWwgd2l0aCBsb3dlciBib3VuZCBncmVhdGVyIHRoYW4gdXBwZXIgYm91bmQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSg3KSwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBuYW1lVHlwZSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJpYWxpemVycy9TZXRTZXJpYWxpemVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL1NldFNlcmlhbGl6ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc1MjJlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJpYWxpemVycy9TZXRTZXJpYWxpemVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlJhbmdlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnQzMlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5TZXRUeXBlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWwuVU5TRVRfQllURV9CVUZGRVI7CisKK3B1YmxpYyBjbGFzcyBTZXRTZXJpYWxpemVyVGVzdAoreworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEluZGV4RnJvbVNlcmlhbGl6ZWQoKQorICAgIHsKKyAgICAgICAgdGVzdEdldEluZGV4RnJvbVNlcmlhbGl6ZWQodHJ1ZSk7CisgICAgICAgIHRlc3RHZXRJbmRleEZyb21TZXJpYWxpemVkKGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3RHZXRJbmRleEZyb21TZXJpYWxpemVkKGJvb2xlYW4gaXNNdWx0aUNlbGwpCisgICAgeworICAgICAgICBTZXRUeXBlPEludGVnZXI+IHR5cGUgPSBTZXRUeXBlLmdldEluc3RhbmNlKEludDMyVHlwZS5pbnN0YW5jZSwgaXNNdWx0aUNlbGwpOworICAgICAgICBBYnN0cmFjdFR5cGU8SW50ZWdlcj4gbmFtZVR5cGUgPSB0eXBlLm5hbWVDb21wYXJhdG9yKCk7CisgICAgICAgIFNldFNlcmlhbGl6ZXI8SW50ZWdlcj4gc2VyaWFsaXplciA9IHR5cGUuZ2V0U2VyaWFsaXplcigpOworCisgICAgICAgIFNldDxJbnRlZ2VyPiBzZXQgPSBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoMSwgMywgNCwgNikpOworICAgICAgICBCeXRlQnVmZmVyIGJiID0gdHlwZS5kZWNvbXBvc2Uoc2V0KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIHNlcmlhbGl6ZXIuZ2V0SW5kZXhGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc2VyaWFsaXplci5nZXRJbmRleEZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMSksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgc2VyaWFsaXplci5nZXRJbmRleEZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzZXJpYWxpemVyLmdldEluZGV4RnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgzKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHNlcmlhbGl6ZXIuZ2V0SW5kZXhGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDQpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIHNlcmlhbGl6ZXIuZ2V0SW5kZXhGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDUpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgc2VyaWFsaXplci5nZXRJbmRleEZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoNiksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgc2VyaWFsaXplci5nZXRJbmRleEZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoNyksIG5hbWVUeXBlKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZCgwLCBJbnRlZ2VyLk1BWF9WQUxVRSksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIFVOU0VUX0JZVEVfQlVGRkVSLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCA0KSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgxKSwgVU5TRVRfQllURV9CVUZGRVIsIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDEsIDQpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigxLCA0KSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDMpLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMiwgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSg0KSwgVU5TRVRfQllURV9CVUZGRVIsIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDMsIDQpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoNSksIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigzLCA0KSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDYpLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSg3KSwgVU5TRVRfQllURV9CVUZGRVIsIG5hbWVUeXBlKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZS5kZWNvbXBvc2UoMCksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDEpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAxKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgVU5TRVRfQllURV9CVUZGRVIsIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMiksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZS5kZWNvbXBvc2UoMyksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDMpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUuZGVjb21wb3NlKDQpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAzKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgVU5TRVRfQllURV9CVUZGRVIsIG5hbWVUeXBlLmRlY29tcG9zZSg1KSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZS5kZWNvbXBvc2UoNiksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDQpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUuZGVjb21wb3NlKDcpLCBuYW1lVHlwZSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDApLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMCksIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMSksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAxKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDIpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMCksIG5hbWVUeXBlLmRlY29tcG9zZSgzKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMyksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUuZGVjb21wb3NlKDQpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAzKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBuYW1lVHlwZS5kZWNvbXBvc2UoNSksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDQpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMCksIG5hbWVUeXBlLmRlY29tcG9zZSg2KSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUuZGVjb21wb3NlKDcpLCBuYW1lVHlwZSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDApLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMSksIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMSksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgxKSwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAxKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDIpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMSksIG5hbWVUeXBlLmRlY29tcG9zZSgzKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMyksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgxKSwgbmFtZVR5cGUuZGVjb21wb3NlKDQpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAzKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBuYW1lVHlwZS5kZWNvbXBvc2UoNSksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDQpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMSksIG5hbWVUeXBlLmRlY29tcG9zZSg2KSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgxKSwgbmFtZVR5cGUuZGVjb21wb3NlKDcpLCBuYW1lVHlwZSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDEsIDEpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMSwgMSksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigxLCAxKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDIpLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDEsIDIpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIG5hbWVUeXBlLmRlY29tcG9zZSgzKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMSwgMyksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUuZGVjb21wb3NlKDQpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigxLCAzKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDIpLCBuYW1lVHlwZS5kZWNvbXBvc2UoNSksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDEsIDQpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIG5hbWVUeXBlLmRlY29tcG9zZSg2KSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMSwgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUuZGVjb21wb3NlKDcpLCBuYW1lVHlwZSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDApLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMCksIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMSksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgxKSwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigxLCAxKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDIpLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDEsIDIpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMyksIG5hbWVUeXBlLmRlY29tcG9zZSgzKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMiwgMyksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSg0KSwgbmFtZVR5cGUuZGVjb21wb3NlKDQpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigzLCAzKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDUpLCBuYW1lVHlwZS5kZWNvbXBvc2UoNSksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDMsIDQpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoNiksIG5hbWVUeXBlLmRlY29tcG9zZSg2KSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSg3KSwgbmFtZVR5cGUuZGVjb21wb3NlKDcpLCBuYW1lVHlwZSkpOworCisgICAgICAgIC8vIGludGVydmFsIHdpdGggbG93ZXIgYm91bmQgZ3JlYXRlciB0aGFuIHVwcGVyIGJvdW5kCisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDApLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoNyksIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9BYnN0cmFjdEZpbGVzeXN0ZW1Pd25lcnNoaXBDaGVja1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0Fic3RyYWN0RmlsZXN5c3RlbU93bmVyc2hpcENoZWNrVGVzdC5qYXZhCmluZGV4IDBmYzg1NTkuLmNhZTdkZTAgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0Fic3RyYWN0RmlsZXN5c3RlbU93bmVyc2hpcENoZWNrVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0Fic3RyYWN0RmlsZXN5c3RlbU93bmVyc2hpcENoZWNrVGVzdC5qYXZhCkBAIC0zNiw2ICszNiw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5TdGFydHVwQ2hlY2tzT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5TdGFydHVwRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIApAQCAtNjYsMTEgKzY3LDE0IEBACiAKICAgICBwcm90ZWN0ZWQgU3RhcnR1cENoZWNrc09wdGlvbnMgb3B0aW9ucyA9IG5ldyBTdGFydHVwQ2hlY2tzT3B0aW9ucygpOwogCisgICAgc3RhdGljIFdpdGhQcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cCgpCiAgICAgewogICAgICAgICBjbGVhblRlbXBEaXIoKTsKICAgICAgICAgdGVtcERpciA9IG5ldyBGaWxlKGNvbS5nb29nbGUuY29tbW9uLmlvLkZpbGVzLmNyZWF0ZVRlbXBEaXIoKSk7CiAgICAgICAgIHRva2VuID0gbWFrZVJhbmRvbVN0cmluZygxMCk7CisgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgV2l0aFByb3BlcnRpZXMoKTsKICAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkZJTEVfU1lTVEVNX0NIRUNLX09XTkVSU0hJUF9GSUxFTkFNRS5nZXRLZXkoKSk7CiAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5GSUxFX1NZU1RFTV9DSEVDS19PV05FUlNISVBfVE9LRU4uZ2V0S2V5KCkpOwogICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eShDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRklMRV9TWVNURU1fQ0hFQ0tfRU5BQkxFLmdldEtleSgpKTsKQEAgLTE4OCw2ICsxOTIsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlYXJkb3duKCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBjbGVhblRlbXBEaXIoKTsKKyAgICAgICAgcHJvcGVydGllcy5jbG9zZSgpOwogICAgIH0KIAogICAgIC8vIHRlc3RzIGZvciBlbmFibGluZy9kaXNhYmxpbmcvY29uZmlndXJpbmcgdGhlIGNoZWNrCkBAIC0yMDUsMTQgKzIxMCwxNCBAQAogICAgIHsKICAgICAgICAgLy8gbm8gZXhjZXB0aW9ucyB0aHJvd24gZnJvbSB0aGUgc3VwcGxpZXIgYmVjYXVzZSB0aGUgY2hlY2sgaXMgc2tpcHBlZAogICAgICAgICBvcHRpb25zLmVuYWJsZShjaGVja19maWxlc3lzdGVtX293bmVyc2hpcCk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRklMRV9TWVNURU1fQ0hFQ0tfRU5BQkxFLmdldEtleSgpLCAiZmFsc2UiKTsKKyAgICAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkZJTEVfU1lTVEVNX0NIRUNLX0VOQUJMRS5zZXRCb29sZWFuKGZhbHNlKTsKICAgICAgICAgQWJzdHJhY3RGaWxlc3lzdGVtT3duZXJzaGlwQ2hlY2tUZXN0LmNoZWNrZXIoKCkgLT4geyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRkFJTCIpOyB9KS5leGVjdXRlKG9wdGlvbnMpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgY2hlY2tFbmFibGVkQnV0Q2x1c3RlclByb3BlcnR5SXNFbXB0eSgpCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkZJTEVfU1lTVEVNX0NIRUNLX09XTkVSU0hJUF9UT0tFTi5nZXRLZXkoKSwgIiIpOworICAgICAgICBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRklMRV9TWVNURU1fQ0hFQ0tfT1dORVJTSElQX1RPS0VOLnNldFN0cmluZygiIik7CiAgICAgICAgIEFic3RyYWN0RmlsZXN5c3RlbU93bmVyc2hpcENoZWNrVGVzdC5leGVjdXRlQW5kRmFpbChBYnN0cmFjdEZpbGVzeXN0ZW1Pd25lcnNoaXBDaGVja1Rlc3QuY2hlY2tlcih0ZW1wRGlyKSwgb3B0aW9ucywgTUlTU0lOR19QUk9QRVJUWSwgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkZJTEVfU1lTVEVNX0NIRUNLX09XTkVSU0hJUF9UT0tFTi5nZXRLZXkoKSk7CiAgICAgfQogCkBAIC0yMjAsNyArMjI1LDcgQEAKICAgICBwdWJsaWMgdm9pZCBjaGVja0VuYWJsZWRCdXRDbHVzdGVyUHJvcGVydHlJc1Vuc2V0KCkKICAgICB7CiAgICAgICAgIEFzc3VtZS5hc3N1bWVGYWxzZShvcHRpb25zLmdldENvbmZpZyhjaGVja19maWxlc3lzdGVtX293bmVyc2hpcCkuY29udGFpbnNLZXkoIm93bmVyc2hpcF90b2tlbiIpKTsKLSAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkZJTEVfU1lTVEVNX0NIRUNLX09XTkVSU0hJUF9UT0tFTi5nZXRLZXkoKSk7CisgICAgICAgIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5GSUxFX1NZU1RFTV9DSEVDS19PV05FUlNISVBfVE9LRU4uY2xlYXJWYWx1ZSgpOyAvLyBjaGVja3N0eWxlOiBzdXBwcmVzcyBuZWFyYnkgJ2NsZWFyVmFsdWVTeXN0ZW1Qcm9wZXJ0eVVzYWdlJwogICAgICAgICBBYnN0cmFjdEZpbGVzeXN0ZW1Pd25lcnNoaXBDaGVja1Rlc3QuZXhlY3V0ZUFuZEZhaWwoQWJzdHJhY3RGaWxlc3lzdGVtT3duZXJzaGlwQ2hlY2tUZXN0LmNoZWNrZXIodGVtcERpciksIG9wdGlvbnMsIE1JU1NJTkdfUFJPUEVSVFksIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5GSUxFX1NZU1RFTV9DSEVDS19PV05FUlNISVBfVE9LRU4uZ2V0S2V5KCkpOwogICAgIH0KIApAQCAtMzU2LDcgKzM2MSw3IEBACiAgICAgICAgIEZpbGUgbGVhZkRpciA9IEFic3RyYWN0RmlsZXN5c3RlbU93bmVyc2hpcENoZWNrVGVzdC5ta2RpcnModGVtcERpciwgImNhc3NhbmRyYS9kYXRhIik7CiAgICAgICAgIHdyaXRlRmlsZShsZWFmRGlyLnBhcmVudCgpLCAib3RoZXJfZmlsZSIsIEFic3RyYWN0RmlsZXN5c3RlbU93bmVyc2hpcENoZWNrVGVzdC5tYWtlUHJvcGVydGllcygxLCAxLCB0b2tlbikpOwogICAgICAgICBBYnN0cmFjdEZpbGVzeXN0ZW1Pd25lcnNoaXBDaGVja1Rlc3QuZXhlY3V0ZUFuZEZhaWwoQWJzdHJhY3RGaWxlc3lzdGVtT3duZXJzaGlwQ2hlY2tUZXN0LmNoZWNrZXIobGVhZkRpciksIG9wdGlvbnMsIE5PX09XTkVSU0hJUF9GSUxFLCBxdW90ZShsZWFmRGlyLmFic29sdXRlUGF0aCgpKSk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRklMRV9TWVNURU1fQ0hFQ0tfT1dORVJTSElQX0ZJTEVOQU1FLmdldEtleSgpLCAib3RoZXJfZmlsZSIpOworICAgICAgICBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRklMRV9TWVNURU1fQ0hFQ0tfT1dORVJTSElQX0ZJTEVOQU1FLnNldFN0cmluZygib3RoZXJfZmlsZSIpOwogICAgICAgICBBYnN0cmFjdEZpbGVzeXN0ZW1Pd25lcnNoaXBDaGVja1Rlc3QuY2hlY2tlcihsZWFmRGlyKS5leGVjdXRlKG9wdGlvbnMpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQWN0aXZlUmVwYWlyU2VydmljZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0FjdGl2ZVJlcGFpclNlcnZpY2VUZXN0LmphdmEKaW5kZXggOWMxNjYwYS4uOTNmZDlmMiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQWN0aXZlUmVwYWlyU2VydmljZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9BY3RpdmVSZXBhaXJTZXJ2aWNlVGVzdC5qYXZhCkBAIC03OSw2ICs3OSw3IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiBwdWJsaWMgY2xhc3MgQWN0aXZlUmVwYWlyU2VydmljZVRlc3QKIHsKQEAgLTQ2OSw2ICs0NzAsMzkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGFpclNlc3Npb25TcGFjZUluTWlCKCkKKyAgICB7CisgICAgICAgIEFjdGl2ZVJlcGFpclNlcnZpY2UgYWN0aXZlUmVwYWlyU2VydmljZSA9IEFjdGl2ZVJlcGFpclNlcnZpY2UuaW5zdGFuY2U7CisgICAgICAgIGludCBwcmV2aW91c1NpemUgPSBhY3RpdmVSZXBhaXJTZXJ2aWNlLmdldFJlcGFpclNlc3Npb25TcGFjZUluTWlCKCk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKChSdW50aW1lLmdldFJ1bnRpbWUoKS5tYXhNZW1vcnkoKSAvICgxMDI0ICogMTAyNCkgLyAxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVJlcGFpclNlcnZpY2UuZ2V0UmVwYWlyU2Vzc2lvblNwYWNlSW5NaUIoKSk7CisKKyAgICAgICAgICAgIGludCB0YXJnZXRTaXplID0gKGludCkgKFJ1bnRpbWUuZ2V0UnVudGltZSgpLm1heE1lbW9yeSgpIC8gKDEwMjQgKiAxMDI0KSAvIDQpICsgMTsKKworICAgICAgICAgICAgYWN0aXZlUmVwYWlyU2VydmljZS5zZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1pQih0YXJnZXRTaXplKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGFyZ2V0U2l6ZSwgYWN0aXZlUmVwYWlyU2VydmljZS5nZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1pQigpKTsKKworICAgICAgICAgICAgYWN0aXZlUmVwYWlyU2VydmljZS5zZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1pQigxMCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwLCBhY3RpdmVSZXBhaXJTZXJ2aWNlLmdldFJlcGFpclNlc3Npb25TcGFjZUluTWlCKCkpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhY3RpdmVSZXBhaXJTZXJ2aWNlLnNldFJlcGFpclNlc3Npb25TcGFjZUluTWlCKDApOworICAgICAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHJlY2VpdmVkIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBmb3IgZGVwdGggb2YgMCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZ25vcmVkKSB7IH0KKworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMCwgYWN0aXZlUmVwYWlyU2VydmljZS5nZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1pQigpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGFjdGl2ZVJlcGFpclNlcnZpY2Uuc2V0UmVwYWlyU2Vzc2lvblNwYWNlSW5NaUIocHJldmlvdXNTaXplKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRhc2sgaW1wbGVtZW50cyBSdW5uYWJsZQogICAgIHsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb25kaXRpb24gYmxvY2tlZDsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0NsaWVudFN0YXRlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQ2xpZW50U3RhdGVUZXN0LmphdmEKaW5kZXggNTZkMDg5My4uMDRiZGRiNCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQ2xpZW50U3RhdGVUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQ2xpZW50U3RhdGVUZXN0LmphdmEKQEAgLTM2LDE5ICszNiwyMyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguUGVybWlzc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLlJvbGVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuT1JHX0FQQUNIRV9DQVNTQU5EUkFfRElTQUJMRV9NQkVBTl9SRUdJU1RSQVRJT047CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIHB1YmxpYyBjbGFzcyBDbGllbnRTdGF0ZVRlc3QKIHsKKyAgICBzdGF0aWMgV2l0aFByb3BlcnRpZXMgcHJvcGVydGllczsKKwogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc2FibGVfbWJlYW5fcmVnaXN0cmF0aW9uIiwgInRydWUiKTsKKyAgICAgICAgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChPUkdfQVBBQ0hFX0NBU1NBTkRSQV9ESVNBQkxFX01CRUFOX1JFR0lTVFJBVElPTiwgdHJ1ZSk7CiAgICAgICAgIFNjaGVtYUxvYWRlci5wcmVwYXJlU2VydmVyKCk7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRBdXRoRnJvbVJvb3QodHJ1ZSk7CiAgICAgICAgIC8vIGNyZWF0ZSB0aGUgc3lzdGVtX2F1dGgga2V5c3BhY2Ugc28gdGhlIElSb2xlTWFuYWdlciBjYW4gZnVuY3Rpb24gYXMgbm9ybWFsCkBAIC02Miw3ICs2Niw3IEBACiAgICAgQEFmdGVyQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWZ0ZXJDbGFzcygpCiAgICAgewotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzYWJsZV9tYmVhbl9yZWdpc3RyYXRpb24iKTsKKyAgICAgICAgcHJvcGVydGllcy5jbG9zZSgpOwogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9QYXJ0aXRpb25EZW55bGlzdFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1BhcnRpdGlvbkRlbnlsaXN0VGVzdC5qYXZhCmluZGV4IGVkNTE1MTguLjRhOTNjNjcgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1BhcnRpdGlvbkRlbnlsaXN0VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1BhcnRpdGlvbkRlbnlsaXN0VGVzdC5qYXZhCkBAIC0yMyw2ICsyMyw3IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2VydmVyVGVzdFV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5VbnR5cGVkUmVzdWx0U2V0OwpAQCAtNDQsNiArNDUsOCBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCkKICAgICB7CisgICAgICAgIFNlcnZlclRlc3RVdGlscy5kYWVtb25Jbml0aWFsaXphdGlvbigpOworCiAgICAgICAgIENRTFRlc3Rlci5wcmVwYXJlU2VydmVyKCk7CiAKICAgICAgICAgS2V5c3BhY2VNZXRhZGF0YSBzY2hlbWEgPSBLZXlzcGFjZU1ldGFkYXRhLmNyZWF0ZShrc19jcWwsCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TU1RhYmxlc0dsb2JhbFRyYWNrZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TU1RhYmxlc0dsb2JhbFRyYWNrZXJUZXN0LmphdmEKaW5kZXggNTU0NWQ5My4uNmJkNWZkMiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU1NUYWJsZXNHbG9iYWxUcmFja2VyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1NTVGFibGVzR2xvYmFsVHJhY2tlclRlc3QuamF2YQpAQCAtMjUsMTIgKzI1LDE1IEBACiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBjb20uZ29vZ2xlY29kZS5jb25jdXJyZW50dHJlZXMuY29tbW9uLkl0ZXJhYmxlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNlcXVlbmNlQmFzZWRTU1RhYmxlSWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uQW5kVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLnV0aWwuRmlsZXM7CiBpbXBvcnQgb3JnLnF1aWNrdGhlb3JpZXMuY29yZS5HZW47CkBAIC00Nyw2ICs1MCwxMiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfVkVSU0lPTl9MSVNUX1NJWkUgPSAxMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1VQREFURVNfUEVSX0dFTiA9IDEwMDsKIAorICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuY2xpZW50SW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBFbnN1cmVzIHRoYXQgdGhlIHRyYWNrZXIgcHJvcGVybHkgbWFpbnRhaW5zIHRoZSBzZXQgb2YgdmVyc2lvbnMgaW4gdXNlLgogICAgICAqCkBAIC01OSwxNSArNjgsMTUgQEAKICAgICB7CiAgICAgICAgIHF0KCkuZm9yQWxsKGxpc3RzKCkub2YodXBkYXRlcygpKS5vZlNpemVCZXR3ZWVuKDAsIE1BWF9VUERBVEVTX1BFUl9HRU4pLAogICAgICAgICAgICAgICAgICAgICBzc3RhYmxlRm9ybWF0VHlwZXMoKSkKLSAgICAgICAgICAgIC5jaGVja0Fzc2VydCgodXBkYXRlcywgZm9ybWF0VHlwZSkgLT4gewotICAgICAgICAgICAgICAgIFNTVGFibGVzR2xvYmFsVHJhY2tlciB0cmFja2VyID0gbmV3IFNTVGFibGVzR2xvYmFsVHJhY2tlcihmb3JtYXRUeXBlKTsKKyAgICAgICAgICAgIC5jaGVja0Fzc2VydCgodXBkYXRlcywgZm9ybWF0KSAtPiB7CisgICAgICAgICAgICAgICAgU1NUYWJsZXNHbG9iYWxUcmFja2VyIHRyYWNrZXIgPSBuZXcgU1NUYWJsZXNHbG9iYWxUcmFja2VyKGZvcm1hdCk7CiAgICAgICAgICAgICAgICAgU2V0PERlc2NyaXB0b3I+IGFsbCA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgICAgICAgICBTZXQ8VmVyc2lvbkFuZFR5cGU+IHByZXZpb3VzID0gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICAgICAgICAgICAgICBTZXQ8VmVyc2lvbj4gcHJldmlvdXMgPSBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwogICAgICAgICAgICAgICAgIGZvciAoVXBkYXRlIHVwZGF0ZSA6IHVwZGF0ZXMpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICB1cGRhdGUuYXBwbHlUbyhhbGwpOwogICAgICAgICAgICAgICAgICAgICBib29sZWFuIHRyaWdnZXJVcGRhdGUgPSB0cmFja2VyLmhhbmRsZVNTVGFibGVzQ2hhbmdlKHVwZGF0ZS5yZW1vdmVkLCB1cGRhdGUuYWRkZWQpOwotICAgICAgICAgICAgICAgICAgICBTZXQ8VmVyc2lvbkFuZFR5cGU+IGV4cGVjdGVkSW5Vc2UgPSB2ZXJzaW9uQW5kVHlwZXMoYWxsKTsKKyAgICAgICAgICAgICAgICAgICAgU2V0PFZlcnNpb24+IGV4cGVjdGVkSW5Vc2UgPSB2ZXJzaW9uQW5kVHlwZXMoYWxsKTsKICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkSW5Vc2UsIHRyYWNrZXIudmVyc2lvbnNJblVzZSgpKTsKICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCFleHBlY3RlZEluVXNlLmVxdWFscyhwcmV2aW91cyksIHRyaWdnZXJVcGRhdGUpOwogICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGV4cGVjdGVkSW5Vc2U7CkBAIC03NSw5ICs4NCw5IEBACiAgICAgICAgICAgICB9KTsKICAgICB9CiAKLSAgICBwcml2YXRlIFNldDxWZXJzaW9uQW5kVHlwZT4gdmVyc2lvbkFuZFR5cGVzKFNldDxEZXNjcmlwdG9yPiBkZXNjcmlwdG9ycykKKyAgICBwcml2YXRlIFNldDxWZXJzaW9uPiB2ZXJzaW9uQW5kVHlwZXMoU2V0PERlc2NyaXB0b3I+IGRlc2NyaXB0b3JzKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3JzLnN0cmVhbSgpLm1hcChTU1RhYmxlc0dsb2JhbFRyYWNrZXI6OnZlcnNpb24pLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKyAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3JzLnN0cmVhbSgpLm1hcChkIC0+IGQudmVyc2lvbikuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOwogICAgIH0KIAogICAgIHByaXZhdGUgR2VuPFN0cmluZz4ga2V5c3BhY2VzKCkKQEAgLTEwOSwxNiArMTE4LDE2IEBACiAgICAgICAgIHJldHVybiBsaXN0cygpLm9mKGRlc2NyaXB0b3JzKCkpLm9mU2l6ZUJldHdlZW4obWluU2l6ZSwgTUFYX1ZFUlNJT05fTElTVF9TSVpFKTsKICAgICB9CiAKLSAgICBwcml2YXRlIEdlbjxTU1RhYmxlRm9ybWF0LlR5cGU+IHNzdGFibGVGb3JtYXRUeXBlcygpCisgICAgcHJpdmF0ZSBHZW48U1NUYWJsZUZvcm1hdDw/LCA/Pj4gc3N0YWJsZUZvcm1hdFR5cGVzKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBHZW5lcmF0ZS5lbnVtVmFsdWVzKFNTVGFibGVGb3JtYXQuVHlwZS5jbGFzcyk7CisgICAgICAgIHJldHVybiBHZW5lcmF0ZS5waWNrKEl0ZXJhYmxlcy50b0xpc3QoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNTVGFibGVGb3JtYXRzKCkudmFsdWVzKCkpKTsKICAgICB9CiAKICAgICBwcml2YXRlIEdlbjxTdHJpbmc+IHNzdGFibGVWZXJzaW9uU3RyaW5nKCkKICAgICB7CiAgICAgICAgIC8vIFdlIHdhbnQgdG8gc29tZXdoYXQgZmF2b3IgdGhlIGN1cnJlbnQgdmVyc2lvbiwgYXMgdGhhdCBpcyB0ZWNobmljYWxseSBtb3JlIHJlYWxpc3RpYyBzbyB3ZSBnZW5lcmF0ZSBpdCA1MCUKICAgICAgICAgLy8gb2YgdGhlIHRpbWUsIGFuZCBnZW5lcmF0ZSBzb21ldGhpbmcgcmFuZG9tIDUwJSBvZiB0aGUgdGltZS4KLSAgICAgICAgcmV0dXJuIEdlbmVyYXRlLmNvbnN0YW50KFNTVGFibGVGb3JtYXQuVHlwZS5jdXJyZW50KCkuaW5mby5nZXRMYXRlc3RWZXJzaW9uKCkuZ2V0VmVyc2lvbigpKQorICAgICAgICByZXR1cm4gR2VuZXJhdGUuY29uc3RhbnQoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpLmdldExhdGVzdFZlcnNpb24oKS52ZXJzaW9uKQogICAgICAgICAgICAgICAgICAgICAgICAubWl4KHN0cmluZ3MoKS5iZXR3ZWVuQ29kZVBvaW50cygnYScsICd6Jykub2ZMZW5ndGgoMikpOwogICAgIH0KIApAQCAtMTU3LDQgKzE2Niw0IEBACiAgICAgICAgICAgICAgICAgICAgJ30nOwogICAgICAgICB9CiAgICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0YXJ0dXBDaGVja3NUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdGFydHVwQ2hlY2tzVGVzdC5qYXZhCmluZGV4IDcyZjg4MDQuLjY1MDJlN2QgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0YXJ0dXBDaGVja3NUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RhcnR1cENoZWNrc1Rlc3QuamF2YQpAQCAtMzcsNiArMzcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrOwogCiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5Db2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfSU5WQUxJRF9MRUdBQ1lfU1NUQUJMRV9ST09UOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5EYXRhUmVzdXJyZWN0aW9uQ2hlY2suSEVBUlRCRUFUX0ZJTEVfQ09ORklHX1BST1BFUlRZOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0YXJ0dXBDaGVja3MuU3RhcnR1cENoZWNrVHlwZS5jaGVja19kYXRhX3Jlc3VycmVjdGlvbjsKQEAgLTQ2LDcgKzQ3LDYgQEAKIAogcHVibGljIGNsYXNzIFN0YXJ0dXBDaGVja3NUZXN0CiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9MRUdBQ1lfU1NUQUJMRV9ST09UX1BST1AgPSAiaW52YWxpZC1sZWdhY3ktc3N0YWJsZS1yb290IjsKICAgICBTdGFydHVwQ2hlY2tzIHN0YXJ0dXBDaGVja3M7CiAgICAgUGF0aCBzc3RhYmxlRGlyOwogICAgIHN0YXRpYyBGaWxlIGhlYXJ0YmVhdEZpbGU7CkBAIC0xMTIsNiArMTEyLDE0IEBACiAgICAgICAgIEZpbGVzLmNyZWF0ZURpcmVjdG9yaWVzKGJhY2t1cERpcik7CiAgICAgICAgIGNvcHlJbnZhbGlkTGVnYWN5U1NUYWJsZXMoYmFja3VwRGlyKTsKICAgICAgICAgc3RhcnR1cENoZWNrcy52ZXJpZnkob3B0aW9ucyk7CisKKyAgICAgICAgLy8gYW5kIGluIHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGFzIG9mIENBU1NBTkRSQS0xNzc3NworICAgICAgICBuZXcgRmlsZShiYWNrdXBEaXIpLmRlbGV0ZVJlY3Vyc2l2ZSgpOworICAgICAgICBGaWxlIGRhdGFEaXIgPSBuZXcgRmlsZShEYXRhYmFzZURlc2NyaXB0b3IuZ2V0QWxsRGF0YUZpbGVMb2NhdGlvbnMoKVswXSk7CisgICAgICAgIFBhdGggc3lzdGVtRGlyID0gUGF0aHMuZ2V0KGRhdGFEaXIuYWJzb2x1dGVQYXRoKCksICJzeXN0ZW0iLCAiSW52YWxpZFN5c3RlbURpcmVjdG9yeSIpOworICAgICAgICBGaWxlcy5jcmVhdGVEaXJlY3RvcmllcyhzeXN0ZW1EaXIpOworICAgICAgICBjb3B5SW52YWxpZExlZ2FjeVNTVGFibGVzKHN5c3RlbURpcik7CisgICAgICAgIHN0YXJ0dXBDaGVja3MudmVyaWZ5KG9wdGlvbnMpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xNjAsOSArMTY4LDkgQEAKICAgICBwcml2YXRlIHZvaWQgY29weUxlZ2FjeU5vblNTVGFibGVGaWxlcyhQYXRoIHRhcmdldERpcikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogCi0gICAgICAgIFBhdGggbGVnYWN5U1NUYWJsZVJvb3QgPSBQYXRocy5nZXQoU3lzdGVtLmdldFByb3BlcnR5KElOVkFMSURfTEVHQUNZX1NTVEFCTEVfUk9PVF9QUk9QKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLZXlzcGFjZTEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YW5kYXJkMSIpOworICAgICAgICBQYXRoIGxlZ2FjeVNTVGFibGVSb290ID0gUGF0aHMuZ2V0KFRFU1RfSU5WQUxJRF9MRUdBQ1lfU1NUQUJMRV9ST09ULmdldFN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLZXlzcGFjZTEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGFuZGFyZDEiKTsKICAgICAgICAgZm9yIChTdHJpbmcgZmlsZW5hbWUgOiBuZXcgU3RyaW5nW117IktleXNwYWNlMS1TdGFuZGFyZDEtaWMtMC1UT0MudHh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktleXNwYWNlMS1TdGFuZGFyZDEtaWMtMC1EaWdlc3Quc2hhMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsZWdhY3lsZXZlbGVkLmpzb24ifSkKQEAgLTE5OCw5ICsyMDYsOSBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIGNvcHlJbnZhbGlkTGVnYWN5U1NUYWJsZXMoUGF0aCB0YXJnZXREaXIpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgRmlsZSBsZWdhY3lTU1RhYmxlUm9vdCA9IG5ldyBGaWxlKFBhdGhzLmdldChTeXN0ZW0uZ2V0UHJvcGVydHkoSU5WQUxJRF9MRUdBQ1lfU1NUQUJMRV9ST09UX1BST1ApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLZXlzcGFjZTEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGFuZGFyZDEiKSk7CisgICAgICAgIEZpbGUgbGVnYWN5U1NUYWJsZVJvb3QgPSBuZXcgRmlsZShQYXRocy5nZXQoVEVTVF9JTlZBTElEX0xFR0FDWV9TU1RBQkxFX1JPT1QuZ2V0U3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktleXNwYWNlMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YW5kYXJkMSIpKTsKICAgICAgICAgZm9yIChGaWxlIGYgOiBsZWdhY3lTU1RhYmxlUm9vdC50cnlMaXN0KCkpCiAgICAgICAgICAgICBGaWxlcy5jb3B5KGYudG9QYXRoKCksIHRhcmdldERpci5yZXNvbHZlKGYubmFtZSgpKSk7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VTZXJ2aWNlRHJhaW5UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdG9yYWdlU2VydmljZURyYWluVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZGEwOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdG9yYWdlU2VydmljZURyYWluVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2U7CisKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93VXBkYXRlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuQnl0ZXNUb2tlbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnk7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIFN0b3JhZ2VTZXJ2aWNlRHJhaW5UZXN0Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFID0gImtleXNwYWNlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEUgPSAidGFibGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU4gPSAiY29sdW1uIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUk9XUyA9IDEwMDA7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgYmVmb3JlKCkgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFRyYW5zaWVudFJlcGxpY2F0aW9uRW5hYmxlZFVuc2FmZSh0cnVlKTsKKworICAgICAgICBDb21taXRMb2cuaW5zdGFuY2Uuc3RhcnQoKTsKKworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKworICAgICAgICBTY2hlbWFMb2FkZXIucHJlcGFyZVNlcnZlcigpOworICAgICAgICBTY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2UoS0VZU1BBQ0UsIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRSwgVEFCTEUpKTsKKworICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZQorICAgICAgICAgICAgICAgIC5nZXRUb2tlbk1ldGFkYXRhKCkKKyAgICAgICAgICAgICAgICAudXBkYXRlTm9ybWFsVG9rZW4obmV3IEJ5dGVzVG9rZW4oKG5ldyBieXRlW117NTB9KSksIEluZXRBZGRyZXNzQW5kUG9ydC5nZXRCeU5hbWUoIjEyNy4wLjAuMSIpKTsKKworICAgICAgICBmaW5hbCBDb2x1bW5GYW1pbHlTdG9yZSB0YWJsZSA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldENvbHVtbkZhbWlseVN0b3JlKFRBQkxFKTsKKyAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgUk9XUzsgcm93KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIEJ5dGVCdWZmZXIgdmFsdWUgPSBCeXRlQnVmZmVyVXRpbC5ieXRlcyhTdHJpbmcudmFsdWVPZihyb3cpKTsKKyAgICAgICAgICAgIG5ldyBSb3dVcGRhdGVCdWlsZGVyKHRhYmxlLm1ldGFkYXRhKCksIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLCB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgLmNsdXN0ZXJpbmcoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoQ09MVU1OKSkKKyAgICAgICAgICAgICAgICAgICAgLmFkZCgidmFsIiwgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICAgICAgICAgICAgIC5hcHBseVVuc2FmZSgpOworICAgICAgICB9CisgICAgICAgIFV0aWwuZmx1c2godGFibGUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNTVGFibGVzSW1wb3J0QWJvcnQoKQorICAgIHsKKyAgICAgICAgZmluYWwgQ29sdW1uRmFtaWx5U3RvcmUgdGFibGUgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShUQUJMRSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0YWJsZQorICAgICAgICAgICAgICAgIC5pbXBvcnROZXdTU1RhYmxlcyhDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAuaXNFbXB0eSgpKTsKKworICAgICAgICBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmRyYWluKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgICB9fSk7CisKKyAgICAgICAgd2hpbGUgKCFTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5pc0RyYWluaW5nKCkpCisgICAgICAgICAgICBUaHJlYWQueWllbGQoKTsKKworICAgICAgICBhc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gdGFibGUKKyAgICAgICAgICAgICAgICAuaW1wb3J0TmV3U1NUYWJsZXMoQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKQorICAgICAgICAgICAgICAgIC5pc0luc3RhbmNlT2YoUnVudGltZUV4Y2VwdGlvbi5jbGFzcykKKyAgICAgICAgICAgICAgICAuaGFzQ2F1c2VJbnN0YW5jZU9mKEludGVycnVwdGVkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdG9yYWdlU2VydmljZVNlcnZlck0zUFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VTZXJ2aWNlU2VydmVyTTNQVGVzdC5qYXZhCmluZGV4IGJiNzhjODMuLjhjNGFiOWIgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VTZXJ2aWNlU2VydmVyTTNQVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VTZXJ2aWNlU2VydmVyTTNQVGVzdC5qYXZhCkBAIC0yNiwxMyArMjYsMTMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5nbXMuR29zc2lwZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSUVuZHBvaW50U25pdGNoOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUHJvcGVydHlGaWxlU25pdGNoOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlscy5jbGVhbnVwOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHMubWtkaXJzOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkdPU1NJUF9ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIHB1YmxpYyBjbGFzcyBTdG9yYWdlU2VydmljZVNlcnZlck0zUFRlc3QKQEAgLTQwLDcgKzQwLDcgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KEdvc3NpcGVyLlByb3BzLkRJU0FCTEVfVEhSRUFEX1ZBTElEQVRJT04sICJ0cnVlIik7CisgICAgICAgIEdPU1NJUF9ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OLnNldEJvb2xlYW4odHJ1ZSk7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOwogICAgICAgICBDb21taXRMb2cuaW5zdGFuY2Uuc3RhcnQoKTsKICAgICAgICAgSUVuZHBvaW50U25pdGNoIHNuaXRjaCA9IG5ldyBQcm9wZXJ0eUZpbGVTbml0Y2goKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VTZXJ2aWNlU2VydmVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RvcmFnZVNlcnZpY2VTZXJ2ZXJUZXN0LmphdmEKaW5kZXggMTE5YjgxMC4uZDRjZjQ1MCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RvcmFnZVNlcnZpY2VTZXJ2ZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RvcmFnZVNlcnZpY2VTZXJ2ZXJUZXN0LmphdmEKQEAgLTQxLDYgKzQxLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuT3JkZXJQcmVzZXJ2aW5nUGFydGl0aW9uZXIuU3RyaW5nVG9rZW47CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtcy5BcHBsaWNhdGlvblN0YXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtcy5Hb3NzaXBlcjsKQEAgLTU1LDYgKzU2LDggQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHMuY2xlYW51cDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2VydmVyVGVzdFV0aWxzLm1rZGlyczsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5HT1NTSVBfRElTQUJMRV9USFJFQURfVkFMSURBVElPTjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5SRVBMQUNFX0FERFJFU1M7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKQEAgLTYzLDcgKzY2LDcgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KEdvc3NpcGVyLlByb3BzLkRJU0FCTEVfVEhSRUFEX1ZBTElEQVRJT04sICJ0cnVlIik7CisgICAgICAgIEdPU1NJUF9ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OLnNldEJvb2xlYW4odHJ1ZSk7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOwogICAgICAgICBDb21taXRMb2cuaW5zdGFuY2Uuc3RhcnQoKTsKICAgICAgICAgSUVuZHBvaW50U25pdGNoIHNuaXRjaCA9IG5ldyBQcm9wZXJ0eUZpbGVTbml0Y2goKTsKQEAgLTYzMyw3ICs2MzYsNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgaXNSZXBsYWNpbmdTYW1lSG9zdEFkZHJlc3NBbmRIb3N0SWRUZXN0KCkgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uCiAgICAgewotICAgICAgICB0cnkKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIFVVSUQgZGlmZmVyZW50SG9zdElkID0gVVVJRC5yYW5kb21VVUlEKCk7CiAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuaXNSZXBsYWNpbmdTYW1lSG9zdEFkZHJlc3NBbmRIb3N0SWQoZGlmZmVyZW50SG9zdElkKSk7CkBAIC02NDMsMjAgKzY0NiwxNiBAQAogICAgICAgICAgICAgR29zc2lwZXIuaW5zdGFuY2UuaW5pdGlhbGl6ZU5vZGVVbnNhZmUoRkJVdGlsaXRpZXMuZ2V0QnJvYWRjYXN0QWRkcmVzc0FuZFBvcnQoKSwgbG9jYWxIb3N0SWQsIDEpOwogCiAgICAgICAgICAgICAvLyBDaGVjayBkZXRlY3RzIHJlcGxhY2luZyB0aGUgc2FtZSBob3N0IGFkZHJlc3Mgd2l0aCB0aGUgc2FtZSBob3N0aWQKLSAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnJlcGxhY2VfYWRkcmVzcyIsIGhvc3RBZGRyZXNzKTsKKyAgICAgICAgICAgIFJFUExBQ0VfQUREUkVTUy5zZXRTdHJpbmcoaG9zdEFkZHJlc3MpOwogICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuaXNSZXBsYWNpbmdTYW1lSG9zdEFkZHJlc3NBbmRIb3N0SWQobG9jYWxIb3N0SWQpKTsKIAogICAgICAgICAgICAgLy8gQ2hlY2sgZGV0ZWN0cyByZXBsYWNpbmcgdGhlIHNhbWUgaG9zdCBhZGRyZXNzIHdpdGggYSBkaWZmZXJlbnQgaG9zdCBpZAotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEucmVwbGFjZV9hZGRyZXNzIiwgaG9zdEFkZHJlc3MpOworICAgICAgICAgICAgUkVQTEFDRV9BRERSRVNTLnNldFN0cmluZyhob3N0QWRkcmVzcyk7CiAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuaXNSZXBsYWNpbmdTYW1lSG9zdEFkZHJlc3NBbmRIb3N0SWQoZGlmZmVyZW50SG9zdElkKSk7CiAKICAgICAgICAgICAgIC8vIENoZWNrIHRvbGVyYXRlcyB0aGUgRE5TIGVudHJ5IGdvaW5nIGF3YXkgZm9yIHRoZSByZXBsYWNlX2FkZHJlc3MKLSAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnJlcGxhY2VfYWRkcmVzcyIsICJ1bnJlc29sdmFibGUuaG9zdC5sb2NhbC4iKTsKKyAgICAgICAgICAgIFJFUExBQ0VfQUREUkVTUy5zZXRTdHJpbmcoInVucmVzb2x2YWJsZS5ob3N0LmxvY2FsLiIpOwogICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmlzUmVwbGFjaW5nU2FtZUhvc3RBZGRyZXNzQW5kSG9zdElkKGRpZmZlcmVudEhvc3RJZCkpOwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoImNhc3NhbmRyYS5yZXBsYWNlX2FkZHJlc3MiKTsKLSAgICAgICAgfQogICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdG9yYWdlU2VydmljZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VTZXJ2aWNlVGVzdC5qYXZhCmluZGV4IGU0NTg5ZDYuLmUwNzAwOTUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VTZXJ2aWNlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VTZXJ2aWNlVGVzdC5qYXZhCkBAIC0yMDQsMTMgKzIwNCwxMzUgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBhaXJTZXNzaW9uTWF4aW11bVRyZWVEZXB0aCgpCisgICAgeworICAgICAgICBTdG9yYWdlU2VydmljZSBzdG9yYWdlU2VydmljZSA9IFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlOworICAgICAgICBpbnQgcHJldmlvdXNEZXB0aCA9IHN0b3JhZ2VTZXJ2aWNlLmdldFJlcGFpclNlc3Npb25NYXhpbXVtVHJlZURlcHRoKCk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwLCBzdG9yYWdlU2VydmljZS5nZXRSZXBhaXJTZXNzaW9uTWF4aW11bVRyZWVEZXB0aCgpKTsKKyAgICAgICAgICAgIHN0b3JhZ2VTZXJ2aWNlLnNldFJlcGFpclNlc3Npb25NYXhpbXVtVHJlZURlcHRoKDEwKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAsIHN0b3JhZ2VTZXJ2aWNlLmdldFJlcGFpclNlc3Npb25NYXhpbXVtVHJlZURlcHRoKCkpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdG9yYWdlU2VydmljZS5zZXRSZXBhaXJTZXNzaW9uTWF4aW11bVRyZWVEZXB0aCg5KTsKKyAgICAgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSByZWNlaXZlZCBhIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBmb3IgZGVwdGggb2YgOSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZ25vcmVkKSB7IH0KKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAsIHN0b3JhZ2VTZXJ2aWNlLmdldFJlcGFpclNlc3Npb25NYXhpbXVtVHJlZURlcHRoKCkpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdG9yYWdlU2VydmljZS5zZXRSZXBhaXJTZXNzaW9uTWF4aW11bVRyZWVEZXB0aCgtMjApOworICAgICAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHJlY2VpdmVkIGEgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGZvciBkZXB0aCBvZiAtMjAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWdub3JlZCkgeyB9CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwLCBzdG9yYWdlU2VydmljZS5nZXRSZXBhaXJTZXNzaW9uTWF4aW11bVRyZWVEZXB0aCgpKTsKKworICAgICAgICAgICAgc3RvcmFnZVNlcnZpY2Uuc2V0UmVwYWlyU2Vzc2lvbk1heGltdW1UcmVlRGVwdGgoMjIpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMiwgc3RvcmFnZVNlcnZpY2UuZ2V0UmVwYWlyU2Vzc2lvbk1heGltdW1UcmVlRGVwdGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBzdG9yYWdlU2VydmljZS5zZXRSZXBhaXJTZXNzaW9uTWF4aW11bVRyZWVEZXB0aChwcmV2aW91c0RlcHRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbHVtbkluZGV4U2l6ZUluS2lCKCkKKyAgICB7CisgICAgICAgIFN0b3JhZ2VTZXJ2aWNlIHN0b3JhZ2VTZXJ2aWNlID0gU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2U7CisgICAgICAgIGludCBwcmV2aW91c0NvbHVtbkluZGV4U2l6ZSA9IHN0b3JhZ2VTZXJ2aWNlLmdldENvbHVtbkluZGV4U2l6ZUluS2lCKCk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBzdG9yYWdlU2VydmljZS5zZXRDb2x1bW5JbmRleFNpemVJbktpQigxMDI0KTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAyNCwgc3RvcmFnZVNlcnZpY2UuZ2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoKSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0b3JhZ2VTZXJ2aWNlLnNldENvbHVtbkluZGV4U2l6ZUluS2lCKDIgKiAxMDI0ICogMTAyNCk7CisgICAgICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgcmVjZWl2ZWQgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGNvbHVtbl9pbmRleF9zaXplID0gMkdpQiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZ25vcmVkKSB7IH0KKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAyNCwgc3RvcmFnZVNlcnZpY2UuZ2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBzdG9yYWdlU2VydmljZS5zZXRDb2x1bW5JbmRleFNpemVJbktpQihwcmV2aW91c0NvbHVtbkluZGV4U2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb2x1bW5JbmRleENhY2hlU2l6ZUluS2lCKCkKKyAgICB7CisgICAgICAgIFN0b3JhZ2VTZXJ2aWNlIHN0b3JhZ2VTZXJ2aWNlID0gU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2U7CisgICAgICAgIGludCBwcmV2aW91c0NvbHVtbkluZGV4Q2FjaGVTaXplID0gc3RvcmFnZVNlcnZpY2UuZ2V0Q29sdW1uSW5kZXhDYWNoZVNpemVJbktpQigpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgc3RvcmFnZVNlcnZpY2Uuc2V0Q29sdW1uSW5kZXhDYWNoZVNpemVJbktpQigxMDI0KTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAyNCwgc3RvcmFnZVNlcnZpY2UuZ2V0Q29sdW1uSW5kZXhDYWNoZVNpemVJbktpQigpKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RvcmFnZVNlcnZpY2Uuc2V0Q29sdW1uSW5kZXhDYWNoZVNpemVJbktpQigyICogMTAyNCAqIDEwMjQpOworICAgICAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHJlY2VpdmVkIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBjb2x1bW5faW5kZXhfY2FjaGVfc2l6ZT0gMkdpQiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZ25vcmVkKSB7IH0KKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAyNCwgc3RvcmFnZVNlcnZpY2UuZ2V0Q29sdW1uSW5kZXhDYWNoZVNpemVJbktpQigpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0b3JhZ2VTZXJ2aWNlLnNldENvbHVtbkluZGV4Q2FjaGVTaXplSW5LaUIocHJldmlvdXNDb2x1bW5JbmRleENhY2hlU2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXRjaFNpemVXYXJuVGhyZXNob2xkSW5LaUIoKQorICAgIHsKKyAgICAgICAgU3RvcmFnZVNlcnZpY2Ugc3RvcmFnZVNlcnZpY2UgPSBTdG9yYWdlU2VydmljZS5pbnN0YW5jZTsKKyAgICAgICAgaW50IHByZXZpb3VzQmF0Y2hTaXplV2FyblRocmVzaG9sZCA9IHN0b3JhZ2VTZXJ2aWNlLmdldEJhdGNoU2l6ZVdhcm5UaHJlc2hvbGRJbktpQigpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgc3RvcmFnZVNlcnZpY2Uuc2V0QmF0Y2hTaXplV2FyblRocmVzaG9sZEluS2lCKDEwMjQpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDI0LCBzdG9yYWdlU2VydmljZS5nZXRCYXRjaFNpemVXYXJuVGhyZXNob2xkSW5LaUIoKSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0b3JhZ2VTZXJ2aWNlLnNldEJhdGNoU2l6ZVdhcm5UaHJlc2hvbGRJbktpQigyICogMTAyNCAqIDEwMjQpOworICAgICAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHJlY2VpdmVkIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBiYXRjaF9zaXplX3dhcm5fdGhyZXNob2xkID0gMkdpQiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZ25vcmVkKSB7IH0KKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAyNCwgc3RvcmFnZVNlcnZpY2UuZ2V0QmF0Y2hTaXplV2FyblRocmVzaG9sZEluS2lCKCkpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgc3RvcmFnZVNlcnZpY2Uuc2V0QmF0Y2hTaXplV2FyblRocmVzaG9sZEluS2lCKHByZXZpb3VzQmF0Y2hTaXplV2FyblRocmVzaG9sZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbERhdGFjZW50ZXJOb2Rlc0V4Y2x1ZGVkRHVyaW5nUmVidWlsZCgpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0U3RvcmFnZVNlcnZpY2UoKS5yZWJ1aWxkKERhdGFiYXNlRGVzY3JpcHRvci5nZXRMb2NhbERhdGFDZW50ZXIoKSwgIlN0b3JhZ2VTZXJ2aWNlVGVzdCIsIG51bGwsIG51bGwsIHRydWUpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiQ2Fubm90IHNldCBzb3VyY2UgZGF0YSBjZW50ZXIgdG8gYmUgbG9jYWwgZGF0YSBjZW50ZXIsIHdoZW4gZXhjbHVkZUxvY2FsRGF0YUNlbnRlciBmbGFnIGlzIHNldCIsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJlYnVpbGRGYWlsT25Ob25FeGlzdGluZ0RhdGFjZW50ZXIoKQogICAgIHsKICAgICAgICAgU3RyaW5nIG5vbkV4aXN0ZW50REMgPSAiTk9OX0VYSVNURU5UX0RDIjsKIAogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgZ2V0U3RvcmFnZVNlcnZpY2UoKS5yZWJ1aWxkKG5vbkV4aXN0ZW50REMsICJTdG9yYWdlU2VydmljZVRlc3QiLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGdldFN0b3JhZ2VTZXJ2aWNlKCkucmVidWlsZChub25FeGlzdGVudERDLCAiU3RvcmFnZVNlcnZpY2VUZXN0IiwgbnVsbCwgbnVsbCwgdHJ1ZSk7CiAgICAgICAgICAgICBmYWlsKCk7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N5c3RlbVByb3BlcnRpZXNCYXNlZEZpbGVTeXN0ZW1Pd25lcnNoaXBDaGVja1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N5c3RlbVByb3BlcnRpZXNCYXNlZEZpbGVTeXN0ZW1Pd25lcnNoaXBDaGVja1Rlc3QuamF2YQppbmRleCBjYjU0ZjgxLi41NTdiMjZkIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TeXN0ZW1Qcm9wZXJ0aWVzQmFzZWRGaWxlU3lzdGVtT3duZXJzaGlwQ2hlY2tUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3lzdGVtUHJvcGVydGllc0Jhc2VkRmlsZVN5c3RlbU93bmVyc2hpcENoZWNrVGVzdC5qYXZhCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOwogCiBwdWJsaWMgY2xhc3MgU3lzdGVtUHJvcGVydGllc0Jhc2VkRmlsZVN5c3RlbU93bmVyc2hpcENoZWNrVGVzdCBleHRlbmRzIEFic3RyYWN0RmlsZXN5c3RlbU93bmVyc2hpcENoZWNrVGVzdAogewpAQCAtMjgsNyArMjksNyBAQAogICAgIHB1YmxpYyB2b2lkIHNldHVwKCkKICAgICB7CiAgICAgICAgIHN1cGVyLnNldHVwKCk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRklMRV9TWVNURU1fQ0hFQ0tfT1dORVJTSElQX1RPS0VOLmdldEtleSgpLCB0b2tlbik7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRklMRV9TWVNURU1fQ0hFQ0tfRU5BQkxFLmdldEtleSgpLCAidHJ1ZSIpOworICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5GSUxFX1NZU1RFTV9DSEVDS19PV05FUlNISVBfVE9LRU4sIHRva2VuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5GSUxFX1NZU1RFTV9DSEVDS19FTkFCTEUsIHRydWUpOwogICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc1JlcGFpckhpc3RvcnlUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc1JlcGFpckhpc3RvcnlUZXN0LmphdmEKaW5kZXggMzg3ZWM2NS4uYmNkOTcxNCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvUGF4b3NSZXBhaXJIaXN0b3J5VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL1BheG9zUmVwYWlySGlzdG9yeVRlc3QuamF2YQpAQCAtNDgsNiArNDgsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5QQVJUSVRJT05FUjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlLmRlb3ZlcmxhcDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy5CYWxsb3QuRmxhZy5OT05FOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLkJhbGxvdC5ub25lOwpAQCAtNjIsNyArNjMsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgdGFibGVOdW0gPSBuZXcgQXRvbWljSW50ZWdlcigpOwogICAgIHN0YXRpYwogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEucGFydGl0aW9uZXIiLCBNdXJtdXIzUGFydGl0aW9uZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgUEFSVElUSU9ORVIuc2V0U3RyaW5nKE11cm11cjNQYXJ0aXRpb25lci5jbGFzcy5nZXROYW1lKCkpOwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKICAgICAgICAgYXNzZXJ0IERhdGFiYXNlRGVzY3JpcHRvci5nZXRQYXJ0aXRpb25lcigpIGluc3RhbmNlb2YgTXVybXVyM1BhcnRpdGlvbmVyOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL3VuY29tbWl0dGVkL1BheG9zU3RhdGVUcmFja2VyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvdW5jb21taXR0ZWQvUGF4b3NTdGF0ZVRyYWNrZXJUZXN0LmphdmEKaW5kZXggZWUwODc4Yy4uMmU4NjY4ZCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvdW5jb21taXR0ZWQvUGF4b3NTdGF0ZVRyYWNrZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvdW5jb21taXR0ZWQvUGF4b3NTdGF0ZVRyYWNrZXJUZXN0LmphdmEKQEAgLTQyLDYgKzQyLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CkBAIC01Miw2ICs1Myw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy5QYXhvc1JlcGFpckhpc3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5GT1JDRV9QQVhPU19TVEFURV9SRUJVSUxEOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLnVuY29tbWl0dGVkLlBheG9zU3RhdGVUcmFja2VyLnN0YXRlRGlyZWN0b3J5OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLnVuY29tbWl0dGVkLlBheG9zVW5jb21taXR0ZWRUZXN0cy4qOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLnVuY29tbWl0dGVkLlVuY29tbWl0dGVkVGFibGVEYXRhVGVzdC5hc3NlcnRJdGVyYXRvckNvbnRlbnRzOwpAQCAtOTQsMzggKzk2LDYgQEAKICAgICAgICAgZGlyZWN0b3JpZXMgPSBuZXcgRmlsZVtde2RpcmVjdG9yeTEsIGRpcmVjdG9yeTJ9OwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN5c3RlbVByb3AgaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlCi0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwcm9wOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwcmV2OwotCi0gICAgICAgIHB1YmxpYyBTeXN0ZW1Qcm9wKFN0cmluZyBwcm9wLCBTdHJpbmcgcHJldikKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5wcm9wID0gcHJvcDsKLSAgICAgICAgICAgIHRoaXMucHJldiA9IHByZXY7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwcmV2ID09IG51bGwpCi0gICAgICAgICAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkocHJvcCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KHByb3AsIHByZXYpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBTeXN0ZW1Qcm9wIHNldChTdHJpbmcgcHJvcCwgU3RyaW5nIHZhbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHByZXYgPSBTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcCk7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkocHJvcCwgdmFsKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3lzdGVtUHJvcChwcm9wLCBwcmV2KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3lzdGVtUHJvcCBzZXQoU3RyaW5nIHByb3AsIGJvb2xlYW4gdmFsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc2V0KHByb3AsIEJvb2xlYW4udG9TdHJpbmcodmFsKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIHN0YXRpYyBQYXJ0aXRpb25VcGRhdGUgdXBkYXRlKFRhYmxlTWV0YWRhdGEgY2ZtLCBpbnQgaywgQmFsbG90IGJhbGxvdCkKICAgICB7CiAgICAgICAgIENvbHVtbk1ldGFkYXRhIGNvbCA9IGNmbS5nZXRDb2x1bW4obmV3IENvbHVtbklkZW50aWZpZXIoInYiLCBmYWxzZSkpOwpAQCAtMjA2LDcgKzE3Niw3IEBACiAgICAgICAgIFN5c3RlbUtleXNwYWNlLnNhdmVQYXhvc1dyaXRlUHJvbWlzZShkaygwKSwgY2ZtMSwgYmFsbG90c1syXSk7CiAgICAgICAgIFN5c3RlbUtleXNwYWNlLnNhdmVQYXhvc1Byb3Bvc2FsKGNvbW1pdChjZm0xLCAyLCBiYWxsb3RzWzNdKSk7CiAKLSAgICAgICAgdHJ5IChTeXN0ZW1Qcm9wIGZvcmNlUmVidWlsZCA9IFN5c3RlbVByb3Auc2V0KFBheG9zU3RhdGVUcmFja2VyLkZPUkNFX1JFQlVJTERfUFJPUCwgdHJ1ZSkpCisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgd2l0aCA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChGT1JDRV9QQVhPU19TVEFURV9SRUJVSUxELCB0cnVlKSkKICAgICAgICAgewogICAgICAgICAgICAgUGF4b3NTdGF0ZVRyYWNrZXIgdHJhY2tlciA9IFBheG9zU3RhdGVUcmFja2VyLmNyZWF0ZShkaXJlY3Rvcmllcyk7CiAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0cmFja2VyLmlzUmVidWlsZE5lZWRlZCgpKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3JlYWRzL3JhbmdlL1JhbmdlQ29tbWFuZHNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9yZWFkcy9yYW5nZS9SYW5nZUNvbW1hbmRzVGVzdC5qYXZhCmluZGV4IDI1OWE2NWYuLjMyZWJlZmYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3JlYWRzL3JhbmdlL1JhbmdlQ29tbWFuZHNUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcmVhZHMvcmFuZ2UvUmFuZ2VDb21tYW5kc1Rlc3QuamF2YQpAQCAtMzQsMTAgKzM0LDEyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUGFydGl0aW9uUmFuZ2VSZWFkQ29tbWFuZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuRGF0YUxpbWl0czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLkNhY2hlZFBhcnRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LlN0dWJJbmRleDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuSW5kZXhNZXRhZGF0YTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk1BWF9DT05DVVJSRU5UX1JBTkdFX1JFUVVFU1RTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db25zaXN0ZW5jeUxldmVsLk9ORTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLm5hbm9UaW1lOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKQEAgLTQ3LDE4ICs0OSwyMCBAQAogICovCiBwdWJsaWMgY2xhc3MgUmFuZ2VDb21tYW5kc1Rlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKIHsKKworICAgIHN0YXRpYyBXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQ09OQ1VSUkVOQ1lfRkFDVE9SID0gNDsKIAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVTY2hlbWEoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEubWF4X2NvbmN1cnJlbnRfcmFuZ2VfcmVxdWVzdHMiLCBTdHJpbmcudmFsdWVPZihNQVhfQ09OQ1VSUkVOQ1lfRkFDVE9SKSk7CisgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgV2l0aFByb3BlcnRpZXMoKS5zZXQoTUFYX0NPTkNVUlJFTlRfUkFOR0VfUkVRVUVTVFMsIE1BWF9DT05DVVJSRU5DWV9GQUNUT1IpOwogICAgIH0KIAogICAgIEBBZnRlckNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFudXAoKQogICAgIHsKLSAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoImNhc3NhbmRyYS5tYXhfY29uY3VycmVudF9yYW5nZV9yZXF1ZXN0cyIpOworICAgICAgICBwcm9wZXJ0aWVzLmNsb3NlKCk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1NuYXBzaG90TG9hZGVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvU25hcHNob3RMb2FkZXJUZXN0LmphdmEKaW5kZXggZDAzYTJkZC4uOWMyMzAzZiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvU25hcHNob3RMb2FkZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvU25hcHNob3RMb2FkZXJUZXN0LmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRMb2NhbFJhbmRvbTsKIAoraW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CiBpbXBvcnQgb3JnLmp1bml0LkNsYXNzUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVtcG9yYXJ5Rm9sZGVyOwpAQCAtMTIzLDkgKzEyNCw1NyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRocy5nZXQoYmFzZURpci50b1N0cmluZygpLCBEQVRBX0RJUl8zKSkpOwogICAgICAgICBTZXQ8VGFibGVTbmFwc2hvdD4gc25hcHNob3RzID0gbG9hZGVyLmxvYWRTbmFwc2hvdHMoKTsKICAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMpLmhhc1NpemUoMyk7Ci0gICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzKS5jb250YWlucyhuZXcgVGFibGVTbmFwc2hvdChLRVlTUEFDRV8xLCBUQUJMRTFfTkFNRSwgVEFCTEUxX0lELCBUQUcxLCBudWxsLCBudWxsLCB0YWcxRmlsZXMpKTsKLSAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMpLmNvbnRhaW5zKG5ldyBUYWJsZVNuYXBzaG90KEtFWVNQQUNFXzEsIFRBQkxFMl9OQU1FLCBUQUJMRTJfSUQsICBUQUcyLCBudWxsLCBudWxsLCB0YWcyRmlsZXMpKTsKLSAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMpLmNvbnRhaW5zKG5ldyBUYWJsZVNuYXBzaG90KEtFWVNQQUNFXzIsIFRBQkxFM19OQU1FLCBUQUJMRTNfSUQsICBUQUczLCBudWxsLCBudWxsLCB0YWczRmlsZXMpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMpLmNvbnRhaW5zKG5ldyBUYWJsZVNuYXBzaG90KEtFWVNQQUNFXzEsIFRBQkxFMV9OQU1FLCBUQUJMRTFfSUQsIFRBRzEsIG51bGwsIG51bGwsIHRhZzFGaWxlcywgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMpLmNvbnRhaW5zKG5ldyBUYWJsZVNuYXBzaG90KEtFWVNQQUNFXzEsIFRBQkxFMl9OQU1FLCBUQUJMRTJfSUQsICBUQUcyLCBudWxsLCBudWxsLCB0YWcyRmlsZXMsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzKS5jb250YWlucyhuZXcgVGFibGVTbmFwc2hvdChLRVlTUEFDRV8yLCBUQUJMRTNfTkFNRSwgVEFCTEUzX0lELCAgVEFHMywgbnVsbCwgbnVsbCwgdGFnM0ZpbGVzLCBmYWxzZSkpOworCisgICAgICAgIC8vIFZlcmlmeSBzbmFwc2hvdCBsb2FkaW5nIGZvciBhIHNwZWNpZmljIGtleXNwYWNlCisgICAgICAgIGxvYWRlciA9IG5ldyBTbmFwc2hvdExvYWRlcihBcnJheXMuYXNMaXN0KFBhdGhzLmdldChiYXNlRGlyLnRvU3RyaW5nKCksIERBVEFfRElSXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRocy5nZXQoYmFzZURpci50b1N0cmluZygpLCBEQVRBX0RJUl8yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aHMuZ2V0KGJhc2VEaXIudG9TdHJpbmcoKSwgREFUQV9ESVJfMykpKTsKKworICAgICAgICBzbmFwc2hvdHMgPSBsb2FkZXIubG9hZFNuYXBzaG90cyhLRVlTUEFDRV8xKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMpLmhhc1NpemUoMik7CisgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzKS5jb250YWlucyhuZXcgVGFibGVTbmFwc2hvdChLRVlTUEFDRV8xLCBUQUJMRTFfTkFNRSwgVEFCTEUxX0lELCBUQUcxLCBudWxsLCBudWxsLCB0YWcxRmlsZXMsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzKS5jb250YWlucyhuZXcgVGFibGVTbmFwc2hvdChLRVlTUEFDRV8xLCBUQUJMRTJfTkFNRSwgVEFCTEUyX0lELCAgVEFHMiwgbnVsbCwgbnVsbCwgdGFnMkZpbGVzLCBmYWxzZSkpOworCisgICAgICAgIGxvYWRlciA9IG5ldyBTbmFwc2hvdExvYWRlcihBcnJheXMuYXNMaXN0KFBhdGhzLmdldChiYXNlRGlyLnRvU3RyaW5nKCksIERBVEFfRElSXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRocy5nZXQoYmFzZURpci50b1N0cmluZygpLCBEQVRBX0RJUl8yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aHMuZ2V0KGJhc2VEaXIudG9TdHJpbmcoKSwgREFUQV9ESVJfMykpKTsKKyAgICAgICAgc25hcHNob3RzID0gbG9hZGVyLmxvYWRTbmFwc2hvdHMoS0VZU1BBQ0VfMik7CisgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzKS5oYXNTaXplKDEpOworICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90cykuY29udGFpbnMobmV3IFRhYmxlU25hcHNob3QoS0VZU1BBQ0VfMiwgVEFCTEUzX05BTUUsIFRBQkxFM19JRCwgIFRBRzMsIG51bGwsIG51bGwsIHRhZzNGaWxlcywgZmFsc2UpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFcGhlbWVyYWxTbmFwc2hvdFdpdGhvdXRNYW5pZmVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU2V0PEZpbGU+IHRhZzFGaWxlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKworICAgICAgICAvLyBDcmVhdGUgb25lIHNuYXBzaG90IHBlciB0YWJsZSAtIHdpdGhvdXQgbWFuaWZlc3RzOgorICAgICAgICAvLyAtIGtzMS50MSA6IHRhZzEKKyAgICAgICAgRmlsZSBiYXNlRGlyICA9IG5ldyBGaWxlKHRtcERpci5uZXdGb2xkZXIoKSk7CisgICAgICAgIGJvb2xlYW4gZXBoZW1lcmFsRmlsZUNyZWF0ZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChTdHJpbmcgZGF0YURpciA6IERBVEFfRElSUykKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZSBkaXIgPSBjcmVhdGVEaXIoYmFzZURpciwgZGF0YURpciwgS0VZU1BBQ0VfMSwgdGFibGVEaXJOYW1lKFRBQkxFMV9OQU1FLCBUQUJMRTFfSUQpLCBEaXJlY3Rvcmllcy5TTkFQU0hPVF9TVUJESVIsIFRBRzEpOworICAgICAgICAgICAgdGFnMUZpbGVzLmFkZChkaXIpOworICAgICAgICAgICAgaWYgKCFlcGhlbWVyYWxGaWxlQ3JlYXRlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjcmVhdGVFcGhlbWVyYWxNYXJrZXJGaWxlKGRpcik7CisgICAgICAgICAgICAgICAgZXBoZW1lcmFsRmlsZUNyZWF0ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVmVyaWZ5IHNuYXBzaG90IGlzIGZvdW5kIGNvcnJlY3RseSBmcm9tIGRhdGEgZGlyZWN0b3JpZXMKKyAgICAgICAgU25hcHNob3RMb2FkZXIgbG9hZGVyID0gbmV3IFNuYXBzaG90TG9hZGVyKEFycmF5cy5hc0xpc3QoUGF0aHMuZ2V0KGJhc2VEaXIudG9TdHJpbmcoKSwgREFUQV9ESVJfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhzLmdldChiYXNlRGlyLnRvU3RyaW5nKCksIERBVEFfRElSXzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRocy5nZXQoYmFzZURpci50b1N0cmluZygpLCBEQVRBX0RJUl8zKSkpOworCisgICAgICAgIFNldDxUYWJsZVNuYXBzaG90PiBzbmFwc2hvdHMgPSBsb2FkZXIubG9hZFNuYXBzaG90cygpOworICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90cykuaGFzU2l6ZSgxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMpLmNvbnRhaW5zKG5ldyBUYWJsZVNuYXBzaG90KEtFWVNQQUNFXzEsIFRBQkxFMV9OQU1FLCBUQUJMRTFfSUQsIFRBRzEsIG51bGwsIG51bGwsIHRhZzFGaWxlcywgdHJ1ZSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShzbmFwc2hvdHMuc3RyZWFtKCkuZmluZEZpcnN0KCkuZ2V0KCkuaXNFcGhlbWVyYWwoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTE2OSw5ICsyMTgsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aHMuZ2V0KGJhc2VEaXIudG9TdHJpbmcoKSwgREFUQV9ESVJfMykpKTsKICAgICAgICAgU2V0PFRhYmxlU25hcHNob3Q+IHNuYXBzaG90cyA9IGxvYWRlci5sb2FkU25hcHNob3RzKCk7CiAgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzKS5oYXNTaXplKDMpOwotICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90cykuY29udGFpbnMobmV3IFRhYmxlU25hcHNob3QoS0VZU1BBQ0VfMSwgVEFCTEUxX05BTUUsIFRBQkxFMV9JRCwgVEFHMSwgdGFnMVRzLCBudWxsLCB0YWcxRmlsZXMpKTsKLSAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMpLmNvbnRhaW5zKG5ldyBUYWJsZVNuYXBzaG90KEtFWVNQQUNFXzEsIFRBQkxFMl9OQU1FLCBUQUJMRTJfSUQsICBUQUcyLCB0YWcyVHMsIHRhZzJUcy5wbHVzU2Vjb25kcyh0YWcyVHRsLnRvU2Vjb25kcygpKSwgdGFnMkZpbGVzKSk7Ci0gICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzKS5jb250YWlucyhuZXcgVGFibGVTbmFwc2hvdChLRVlTUEFDRV8yLCBUQUJMRTNfTkFNRSwgVEFCTEUzX0lELCAgVEFHMywgdGFnM1RzLCBudWxsLCB0YWczRmlsZXMpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMpLmNvbnRhaW5zKG5ldyBUYWJsZVNuYXBzaG90KEtFWVNQQUNFXzEsIFRBQkxFMV9OQU1FLCBUQUJMRTFfSUQsIFRBRzEsIHRhZzFUcywgbnVsbCwgdGFnMUZpbGVzLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90cykuY29udGFpbnMobmV3IFRhYmxlU25hcHNob3QoS0VZU1BBQ0VfMSwgVEFCTEUyX05BTUUsIFRBQkxFMl9JRCwgIFRBRzIsIHRhZzJUcywgdGFnMlRzLnBsdXNTZWNvbmRzKHRhZzJUdGwudG9TZWNvbmRzKCkpLCB0YWcyRmlsZXMsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzKS5jb250YWlucyhuZXcgVGFibGVTbmFwc2hvdChLRVlTUEFDRV8yLCBUQUJMRTNfTkFNRSwgVEFCTEUzX0lELCAgVEFHMywgdGFnM1RzLCBudWxsLCB0YWczRmlsZXMsIGZhbHNlKSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHNuYXBzaG90IGxvYWRpbmcgZm9yIGEgc3BlY2lmaWMga2V5c3BhY2UKKyAgICAgICAgbG9hZGVyID0gbmV3IFNuYXBzaG90TG9hZGVyKEFycmF5cy5hc0xpc3QoUGF0aHMuZ2V0KGJhc2VEaXIudG9TdHJpbmcoKSwgREFUQV9ESVJfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhzLmdldChiYXNlRGlyLnRvU3RyaW5nKCksIERBVEFfRElSXzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRocy5nZXQoYmFzZURpci50b1N0cmluZygpLCBEQVRBX0RJUl8zKSkpOworCisgICAgICAgIHNuYXBzaG90cyA9IGxvYWRlci5sb2FkU25hcHNob3RzKEtFWVNQQUNFXzEpOworICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90cykuaGFzU2l6ZSgyKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMpLmNvbnRhaW5zKG5ldyBUYWJsZVNuYXBzaG90KEtFWVNQQUNFXzEsIFRBQkxFMV9OQU1FLCBUQUJMRTFfSUQsIFRBRzEsIHRhZzFUcywgbnVsbCwgdGFnMUZpbGVzLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90cykuY29udGFpbnMobmV3IFRhYmxlU25hcHNob3QoS0VZU1BBQ0VfMSwgVEFCTEUyX05BTUUsIFRBQkxFMl9JRCwgIFRBRzIsIHRhZzJUcywgdGFnMlRzLnBsdXNTZWNvbmRzKHRhZzJUdGwudG9TZWNvbmRzKCkpLCB0YWcyRmlsZXMsIGZhbHNlKSk7CisKKyAgICAgICAgbG9hZGVyID0gbmV3IFNuYXBzaG90TG9hZGVyKEFycmF5cy5hc0xpc3QoUGF0aHMuZ2V0KGJhc2VEaXIudG9TdHJpbmcoKSwgREFUQV9ESVJfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhzLmdldChiYXNlRGlyLnRvU3RyaW5nKCksIERBVEFfRElSXzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRocy5nZXQoYmFzZURpci50b1N0cmluZygpLCBEQVRBX0RJUl8zKSkpOworICAgICAgICBzbmFwc2hvdHMgPSBsb2FkZXIubG9hZFNuYXBzaG90cyhLRVlTUEFDRV8yKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMpLmhhc1NpemUoMSk7CisgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzKS5jb250YWlucyhuZXcgVGFibGVTbmFwc2hvdChLRVlTUEFDRV8yLCBUQUJMRTNfTkFNRSwgVEFCTEUzX0lELCAgVEFHMywgdGFnM1RzLCBudWxsLCB0YWczRmlsZXMsIGZhbHNlKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTIwOCw3ICsyNzQsNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlTWFuaWZlc3QoRmlsZSBzbmFwc2hvdERpciwgSW5zdGFudCBjcmVhdGlvblRpbWUsIER1cmF0aW9uU3BlYy5JbnRTZWNvbmRzQm91bmQgdHRsKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIFNuYXBzaG90TWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgU25hcHNob3RNYW5pZmVzdChMaXN0cy5uZXdBcnJheUxpc3QoImYxIiwgImYyIiwgImYzIiksIHR0bCwgY3JlYXRpb25UaW1lKTsKKyAgICAgICAgU25hcHNob3RNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBTbmFwc2hvdE1hbmlmZXN0KExpc3RzLm5ld0FycmF5TGlzdCgiZjEiLCAiZjIiLCAiZjMiKSwgdHRsLCBjcmVhdGlvblRpbWUsIGZhbHNlKTsKICAgICAgICAgbWFuaWZlc3Quc2VyaWFsaXplVG9Kc29uRmlsZShnZXRNYW5pZmVzdEZpbGUoc25hcHNob3REaXIpKTsKICAgICB9CiAKQEAgLTIxOSw2ICsyODUsMTEgQEAKICAgICAgICAgcmV0dXJuIGZpbGU7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjcmVhdGVFcGhlbWVyYWxNYXJrZXJGaWxlKEZpbGUgZGlyKQorICAgIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobmV3IEZpbGUoZGlyLCAiZXBoZW1lcmFsLnNuYXBzaG90IikuY3JlYXRlRmlsZUlmTm90RXhpc3RzKCkpOworICAgIH0KKwogICAgIHN0YXRpYyBTdHJpbmcgdGFibGVEaXJOYW1lKFN0cmluZyB0YWJsZU5hbWUsIFVVSUQgdGFibGVJZCkKICAgICB7CiAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlcy0lcyIsIHRhYmxlTmFtZSwgcmVtb3ZlRGFzaGVzKHRhYmxlSWQpKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1NuYXBzaG90TWFuYWdlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1NuYXBzaG90TWFuYWdlclRlc3QuamF2YQppbmRleCBlZGJmZmYyLi5mOTIzM2JiIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9zbmFwc2hvdC9TbmFwc2hvdE1hbmFnZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvU25hcHNob3RNYW5hZ2VyVGVzdC5qYXZhCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgQENsYXNzUnVsZQogICAgIHB1YmxpYyBzdGF0aWMgVGVtcG9yYXJ5Rm9sZGVyIHRlbXBvcmFyeUZvbGRlciA9IG5ldyBUZW1wb3JhcnlGb2xkZXIoKTsKIAotICAgIHByaXZhdGUgVGFibGVTbmFwc2hvdCBnZW5lcmF0ZVNuYXBzaG90RGV0YWlscyhTdHJpbmcgdGFnLCBJbnN0YW50IGV4cGlyYXRpb24pCisgICAgcHJpdmF0ZSBUYWJsZVNuYXBzaG90IGdlbmVyYXRlU25hcHNob3REZXRhaWxzKFN0cmluZyB0YWcsIEluc3RhbnQgZXhwaXJhdGlvbiwgYm9vbGVhbiBlcGhlbWVyYWwpCiAgICAgewogICAgICAgICB0cnkKICAgICAgICAgewpAQCAtNjcsNyArNjcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0YW50LkVQT0NILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRm9sZGVycyh0ZW1wb3JhcnlGb2xkZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVGb2xkZXJzKHRlbXBvcmFyeUZvbGRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBoZW1lcmFsKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgICB7CkBAIC03NSwxMyArNzYsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZFNuYXBzaG90cygpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFRhYmxlU25hcHNob3QgZXhwaXJlZCA9IGdlbmVyYXRlU25hcHNob3REZXRhaWxzKCJleHBpcmVkIiwgSW5zdGFudC5FUE9DSCk7Ci0gICAgICAgIFRhYmxlU25hcHNob3Qgbm9uRXhwaXJlZCA9IGdlbmVyYXRlU25hcHNob3REZXRhaWxzKCJub24tZXhwaXJlZCIsIG5vdygpLnBsdXNTZWNvbmRzKE9ORV9EQVlfU0VDUykpOwotICAgICAgICBUYWJsZVNuYXBzaG90IG5vbkV4cGlyaW5nID0gZ2VuZXJhdGVTbmFwc2hvdERldGFpbHMoIm5vbi1leHBpcmluZyIsIG51bGwpOworICAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkU25hcHNob3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFRhYmxlU25hcHNob3QgZXhwaXJlZCA9IGdlbmVyYXRlU25hcHNob3REZXRhaWxzKCJleHBpcmVkIiwgSW5zdGFudC5FUE9DSCwgZmFsc2UpOworICAgICAgICBUYWJsZVNuYXBzaG90IG5vbkV4cGlyZWQgPSBnZW5lcmF0ZVNuYXBzaG90RGV0YWlscygibm9uLWV4cGlyZWQiLCBub3coKS5wbHVzU2Vjb25kcyhPTkVfREFZX1NFQ1MpLCBmYWxzZSk7CisgICAgICAgIFRhYmxlU25hcHNob3Qgbm9uRXhwaXJpbmcgPSBnZW5lcmF0ZVNuYXBzaG90RGV0YWlscygibm9uLWV4cGlyaW5nIiwgbnVsbCwgZmFsc2UpOwogICAgICAgICBMaXN0PFRhYmxlU25hcHNob3Q+IHNuYXBzaG90cyA9IEFycmF5cy5hc0xpc3QoZXhwaXJlZCwgbm9uRXhwaXJlZCwgbm9uRXhwaXJpbmcpOwogCiAgICAgICAgIC8vIENyZWF0ZSBTbmFwc2hvdE1hbmFnZXIgd2l0aCAzIHNuYXBzaG90czogZXhwaXJlZCwgbm9uLWV4cGlyZWQgYW5kIG5vbi1leHBpcmluZwpAQCAtOTUsMTQgKzk0LDEzIEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJFeHBpcmVkU25hcHNob3RzKCkKLSAgICB7CisgICAgcHVibGljIHZvaWQgdGVzdENsZWFyRXhwaXJlZFNuYXBzaG90cygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTbmFwc2hvdE1hbmFnZXIgbWFuYWdlciA9IG5ldyBTbmFwc2hvdE1hbmFnZXIoMywgMyk7CiAKICAgICAgICAgLy8gQWRkIDMgc25hcHNob3RzOiBleHBpcmVkLCBub24tZXhwaXJlZCBhbmQgbm9uLWV4cGlyaW5nCi0gICAgICAgIFRhYmxlU25hcHNob3QgZXhwaXJlZCA9IGdlbmVyYXRlU25hcHNob3REZXRhaWxzKCJleHBpcmVkIiwgSW5zdGFudC5FUE9DSCk7Ci0gICAgICAgIFRhYmxlU25hcHNob3Qgbm9uRXhwaXJlZCA9IGdlbmVyYXRlU25hcHNob3REZXRhaWxzKCJub24tZXhwaXJlZCIsIG5vdygpLnBsdXNNaWxsaXMoT05FX0RBWV9TRUNTKSk7Ci0gICAgICAgIFRhYmxlU25hcHNob3Qgbm9uRXhwaXJpbmcgPSBnZW5lcmF0ZVNuYXBzaG90RGV0YWlscygibm9uLWV4cGlyaW5nIiwgbnVsbCk7CisgICAgICAgIFRhYmxlU25hcHNob3QgZXhwaXJlZCA9IGdlbmVyYXRlU25hcHNob3REZXRhaWxzKCJleHBpcmVkIiwgSW5zdGFudC5FUE9DSCwgZmFsc2UpOworICAgICAgICBUYWJsZVNuYXBzaG90IG5vbkV4cGlyZWQgPSBnZW5lcmF0ZVNuYXBzaG90RGV0YWlscygibm9uLWV4cGlyZWQiLCBub3coKS5wbHVzTWlsbGlzKE9ORV9EQVlfU0VDUyksIGZhbHNlKTsKKyAgICAgICAgVGFibGVTbmFwc2hvdCBub25FeHBpcmluZyA9IGdlbmVyYXRlU25hcHNob3REZXRhaWxzKCJub24tZXhwaXJpbmciLCBudWxsLCBmYWxzZSk7CiAgICAgICAgIG1hbmFnZXIuYWRkU25hcHNob3QoZXhwaXJlZCk7CiAgICAgICAgIG1hbmFnZXIuYWRkU25hcHNob3Qobm9uRXhwaXJlZCk7CiAgICAgICAgIG1hbmFnZXIuYWRkU25hcHNob3Qobm9uRXhwaXJpbmcpOwpAQCAtMTI1LDggKzEyMyw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NoZWR1bGVkQ2xlYW51cCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7CisgICAgcHVibGljIHZvaWQgdGVzdFNjaGVkdWxlZENsZWFudXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU25hcHNob3RNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgU25hcHNob3RNYW5hZ2VyKDAsIDEpOwogICAgICAgICB0cnkKICAgICAgICAgewpAQCAtMTM0LDggKzEzMSw5IEBACiAgICAgICAgICAgICBtYW5hZ2VyLnN0YXJ0KCk7CiAKICAgICAgICAgICAgIC8vIEFkZCAyIGV4cGlyaW5nIHNuYXBzaG90czogb25lIHRvIGV4cGlyZSBpbiAyIHNlY29uZHMsIGFub3RoZXIgaW4gMSBkYXkKLSAgICAgICAgICAgIFRhYmxlU25hcHNob3QgdG9FeHBpcmUgPSBnZW5lcmF0ZVNuYXBzaG90RGV0YWlscygidG8tZXhwaXJlIiwgbm93KCkucGx1c1NlY29uZHMoMikpOwotICAgICAgICAgICAgVGFibGVTbmFwc2hvdCBub25FeHBpcmVkID0gZ2VuZXJhdGVTbmFwc2hvdERldGFpbHMoIm5vbi1leHBpcmVkIiwgbm93KCkucGx1c01pbGxpcyhPTkVfREFZX1NFQ1MpKTsKKyAgICAgICAgICAgIGludCBUVExfU0VDUyA9IDI7CisgICAgICAgICAgICBUYWJsZVNuYXBzaG90IHRvRXhwaXJlID0gZ2VuZXJhdGVTbmFwc2hvdERldGFpbHMoInRvLWV4cGlyZSIsIG5vdygpLnBsdXNTZWNvbmRzKFRUTF9TRUNTKSwgZmFsc2UpOworICAgICAgICAgICAgVGFibGVTbmFwc2hvdCBub25FeHBpcmVkID0gZ2VuZXJhdGVTbmFwc2hvdERldGFpbHMoIm5vbi1leHBpcmVkIiwgbm93KCkucGx1c01pbGxpcyhPTkVfREFZX1NFQ1MpLCBmYWxzZSk7CiAgICAgICAgICAgICBtYW5hZ2VyLmFkZFNuYXBzaG90KHRvRXhwaXJlKTsKICAgICAgICAgICAgIG1hbmFnZXIuYWRkU25hcHNob3Qobm9uRXhwaXJlZCk7CiAKQEAgLTE0NiwxMCArMTQ0LDExIEBACiAgICAgICAgICAgICBhc3NlcnRUaGF0KG1hbmFnZXIuZ2V0RXhwaXJpbmdTbmFwc2hvdHMoKSkuY29udGFpbnModG9FeHBpcmUpOwogICAgICAgICAgICAgYXNzZXJ0VGhhdChtYW5hZ2VyLmdldEV4cGlyaW5nU25hcHNob3RzKCkpLmNvbnRhaW5zKG5vbkV4cGlyZWQpOwogCi0gICAgICAgICAgICBhd2FpdCgpLnBvbGxJbnRlcnZhbCgyLCBTRUNPTkRTKQotICAgICAgICAgICAgICAgICAgIC50aW1lb3V0KDEwLCBTRUNPTkRTKQotICAgICAgICAgICAgICAgICAgIC51bnRpbCgoKSAtPiBtYW5hZ2VyLmdldEV4cGlyaW5nU25hcHNob3RzKCkuc2l6ZSgpID09IDEpOworICAgICAgICAgICAgLy8gU2xlZXAgNCBzZWNvbmRzCisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoKFRUTF9TRUNTICsgMikgKiAxMDAwTCk7CiAKKyAgICAgICAgICAgIC8vIFNuYXBzaG90IHdpdGggdHRsPTJzIHNob3VsZCBiZSBnb25lLCB3aGlsZSBvdGhlciBzaG91bGQgcmVtYWluCisgICAgICAgICAgICBhc3NlcnRUaGF0KG1hbmFnZXIuZ2V0RXhwaXJpbmdTbmFwc2hvdHMoKSkuaGFzU2l6ZSgxKTsKICAgICAgICAgICAgIGFzc2VydFRoYXQobWFuYWdlci5nZXRFeHBpcmluZ1NuYXBzaG90cygpKS5jb250YWlucyhub25FeHBpcmVkKTsKICAgICAgICAgICAgIGFzc2VydFRoYXQodG9FeHBpcmUuZXhpc3RzKCkpLmlzRmFsc2UoKTsKICAgICAgICAgICAgIGFzc2VydFRoYXQobm9uRXhwaXJlZC5leGlzdHMoKSkuaXNUcnVlKCk7CkBAIC0xNjAsNiArMTU5LDI0IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhclNuYXBzaG90KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gR2l2ZW4KKyAgICAgICAgU25hcHNob3RNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgU25hcHNob3RNYW5hZ2VyKDEsIDMpOworICAgICAgICBUYWJsZVNuYXBzaG90IGV4cGlyaW5nU25hcHNob3QgPSBnZW5lcmF0ZVNuYXBzaG90RGV0YWlscygic25hcHNob3QiLCBub3coKS5wbHVzTWlsbGlzKDUwMDAwKSwgZmFsc2UpOworICAgICAgICBtYW5hZ2VyLmFkZFNuYXBzaG90KGV4cGlyaW5nU25hcHNob3QpOworICAgICAgICBhc3NlcnRUaGF0KG1hbmFnZXIuZ2V0RXhwaXJpbmdTbmFwc2hvdHMoKSkuY29udGFpbnMoZXhwaXJpbmdTbmFwc2hvdCk7CisgICAgICAgIGFzc2VydFRoYXQoZXhwaXJpbmdTbmFwc2hvdC5leGlzdHMoKSkuaXNUcnVlKCk7CisKKyAgICAgICAgLy8gV2hlbgorICAgICAgICBtYW5hZ2VyLmNsZWFyU25hcHNob3QoZXhwaXJpbmdTbmFwc2hvdCk7CisKKyAgICAgICAgLy8gVGhlbgorICAgICAgICBhc3NlcnRUaGF0KG1hbmFnZXIuZ2V0RXhwaXJpbmdTbmFwc2hvdHMoKSkuZG9lc05vdENvbnRhaW4oZXhwaXJpbmdTbmFwc2hvdCk7CisgICAgICAgIGFzc2VydFRoYXQoZXhwaXJpbmdTbmFwc2hvdC5leGlzdHMoKSkuaXNGYWxzZSgpOworICAgIH0KKwogICAgIEBUZXN0IC8vIHNlZSBDQVNTQU5EUkEtMTgyMTEKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uY3VycmVudENsZWFyaW5nT2ZTbmFwc2hvdHMoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewpAQCAtMTg1LDEyICsyMDIsMTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKIAotICAgICAgICBUYWJsZVNuYXBzaG90IGV4cGlyaW5nU25hcHNob3QgPSBnZW5lcmF0ZVNuYXBzaG90RGV0YWlscygibXlzbmFwc2hvdCIsIEluc3RhbnQubm93KCkucGx1c1NlY29uZHMoMTUpKTsKKyAgICAgICAgVGFibGVTbmFwc2hvdCBleHBpcmluZ1NuYXBzaG90ID0gZ2VuZXJhdGVTbmFwc2hvdERldGFpbHMoIm15c25hcHNob3QiLCBJbnN0YW50Lm5vdygpLnBsdXNTZWNvbmRzKDE1KSwgZmFsc2UpOwogICAgICAgICBtYW5hZ2VyLmFkZFNuYXBzaG90KGV4cGlyaW5nU25hcHNob3QpOwogCiAgICAgICAgIG1hbmFnZXIucmVzdW1lU25hcHNob3RDbGVhbnVwKCk7CiAKLSAgICAgICAgVGhyZWFkIG5vbkV4cGlyaW5nU25hcHNob3RDbGVhbnVwVGhyZWQgPSBuZXcgVGhyZWFkKCgpIC0+IG1hbmFnZXIuY2xlYXJTbmFwc2hvdChnZW5lcmF0ZVNuYXBzaG90RGV0YWlscygibXlzbmFwc2hvdDIiLCBudWxsKSkpOworICAgICAgICBUaHJlYWQgbm9uRXhwaXJpbmdTbmFwc2hvdENsZWFudXBUaHJlZCA9IG5ldyBUaHJlYWQoKCkgLT4gbWFuYWdlci5jbGVhclNuYXBzaG90KGdlbmVyYXRlU25hcHNob3REZXRhaWxzKCJteXNuYXBzaG90MiIsIG51bGwsIGZhbHNlKSkpOwogCiAgICAgICAgIC8vIHdhaXQgdW50aWwgdGhlIGZpcnN0IHNuYXBzaG90IGV4cGlyZXMKICAgICAgICAgYXdhaXQoKS5wb2xsSW50ZXJ2YWwoMSwgU0VDT05EUykKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1NuYXBzaG90TWFuaWZlc3RUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9zbmFwc2hvdC9TbmFwc2hvdE1hbmlmZXN0VGVzdC5qYXZhCmluZGV4IGQzYjExYzAuLjVjMTIzNTkgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1NuYXBzaG90TWFuaWZlc3RUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvU25hcHNob3RNYW5pZmVzdFRlc3QuamF2YQpAQCAtMzcsNiArMzcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EdXJhdGlvblNwZWM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZU91dHB1dFN0cmVhbVBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSnNvblV0aWxzOwogCiBwdWJsaWMgY2xhc3MgU25hcHNob3RNYW5pZmVzdFRlc3QKIHsKQEAgLTcwLDcgKzcxLDcgQEAKICAgICAgICAgbWFwLnB1dCgiZXhwaXJlc19hdCIsIGV4cGlyZXNBdCk7CiAgICAgICAgIG1hcC5wdXQoImZpbGVzIiwgQXJyYXlzLmFzTGlzdCgiZGIxIiwgImRiMiIsICJkYjMiKSk7CiAKLSAgICAgICAgT2JqZWN0TWFwcGVyIG1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIoKTsKKyAgICAgICAgT2JqZWN0TWFwcGVyIG1hcHBlciA9IEpzb25VdGlscy5KU09OX09CSkVDVF9NQVBQRVI7CiAgICAgICAgIEZpbGUgbWFuaWZlc3RGaWxlID0gbmV3IEZpbGUodGVtcEZvbGRlci5uZXdGaWxlKCJtYW5pZmVzdC5qc29uIikpOwogICAgICAgICBtYXBwZXIud3JpdGVWYWx1ZSgoT3V0cHV0U3RyZWFtKSBuZXcgRmlsZU91dHB1dFN0cmVhbVBsdXMobWFuaWZlc3RGaWxlKSwgbWFwKTsKICAgICAgICAgU25hcHNob3RNYW5pZmVzdCBtYW5pZmVzdCA9IFNuYXBzaG90TWFuaWZlc3QuZGVzZXJpYWxpemVGcm9tSnNvbkZpbGUobWFuaWZlc3RGaWxlKTsKQEAgLTg0LDcgKzg1LDcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0T3B0aW9uYWxGaWVsZHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgbWFwLnB1dCgiZmlsZXMiLCBBcnJheXMuYXNMaXN0KCJkYjEiLCAiZGIyIiwgImRiMyIpKTsKLSAgICAgICAgT2JqZWN0TWFwcGVyIG1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIoKTsKKyAgICAgICAgT2JqZWN0TWFwcGVyIG1hcHBlciA9IEpzb25VdGlscy5KU09OX09CSkVDVF9NQVBQRVI7CiAgICAgICAgIEZpbGUgbWFuaWZlc3RGaWxlID0gbmV3IEZpbGUodGVtcEZvbGRlci5uZXdGaWxlKCJtYW5pZmVzdC5qc29uIikpOwogICAgICAgICBtYXBwZXIud3JpdGVWYWx1ZSgoT3V0cHV0U3RyZWFtKSBuZXcgRmlsZU91dHB1dFN0cmVhbVBsdXMobWFuaWZlc3RGaWxlKSwgbWFwKTsKICAgICAgICAgU25hcHNob3RNYW5pZmVzdCBtYW5pZmVzdCA9IFNuYXBzaG90TWFuaWZlc3QuZGVzZXJpYWxpemVGcm9tSnNvbkZpbGUobWFuaWZlc3RGaWxlKTsKQEAgLTk5LDcgKzEwMCw3IEBACiAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICBtYXAucHV0KCJmaWxlcyIsIEFycmF5cy5hc0xpc3QoImRiMSIsICJkYjIiLCAiZGIzIikpOwogICAgICAgICBtYXAucHV0KCJkdW1teSIsICJkdW1teSIpOwotICAgICAgICBPYmplY3RNYXBwZXIgbWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpOworICAgICAgICBPYmplY3RNYXBwZXIgbWFwcGVyID0gSnNvblV0aWxzLkpTT05fT0JKRUNUX01BUFBFUjsKICAgICAgICAgRmlsZSBtYW5pZmVzdEZpbGUgPSBuZXcgRmlsZSh0ZW1wRm9sZGVyLm5ld0ZpbGUoIm1hbmlmZXN0Lmpzb24iKSk7CiAgICAgICAgIG1hcHBlci53cml0ZVZhbHVlKChPdXRwdXRTdHJlYW0pIG5ldyBGaWxlT3V0cHV0U3RyZWFtUGx1cyhtYW5pZmVzdEZpbGUpLCBtYXApOwogICAgICAgICBTbmFwc2hvdE1hbmlmZXN0IG1hbmlmZXN0ID0gU25hcHNob3RNYW5pZmVzdC5kZXNlcmlhbGl6ZUZyb21Kc29uRmlsZShtYW5pZmVzdEZpbGUpOwpAQCAtMTA4LDcgKzEwOSw3IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVBbmREZXNlcmlhbGl6ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTbmFwc2hvdE1hbmlmZXN0IG1hbmlmZXN0ID0gbmV3IFNuYXBzaG90TWFuaWZlc3QoQXJyYXlzLmFzTGlzdCgiZGIxIiwgImRiMiIsICJkYjMiKSwgbmV3IER1cmF0aW9uU3BlYy5JbnRTZWNvbmRzQm91bmQoIjJtIiksIEluc3RhbnQub2ZFcG9jaE1pbGxpKGN1cnJlbnRUaW1lTWlsbGlzKCkpKTsKKyAgICAgICAgU25hcHNob3RNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBTbmFwc2hvdE1hbmlmZXN0KEFycmF5cy5hc0xpc3QoImRiMSIsICJkYjIiLCAiZGIzIiksIG5ldyBEdXJhdGlvblNwZWMuSW50U2Vjb25kc0JvdW5kKCIybSIpLCBJbnN0YW50Lm9mRXBvY2hNaWxsaShjdXJyZW50VGltZU1pbGxpcygpKSwgZmFsc2UpOwogICAgICAgICBGaWxlIG1hbmlmZXN0RmlsZSA9IG5ldyBGaWxlKHRlbXBGb2xkZXIubmV3RmlsZSgibWFuaWZlc3QuanNvbiIpKTsKIAogICAgICAgICBtYW5pZmVzdC5zZXJpYWxpemVUb0pzb25GaWxlKG1hbmlmZXN0RmlsZSk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9zbmFwc2hvdC9UYWJsZVNuYXBzaG90VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvVGFibGVTbmFwc2hvdFRlc3QuamF2YQppbmRleCA0YmIxNzU2Li5kNTkyZGQ5IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9zbmFwc2hvdC9UYWJsZVNuYXBzaG90VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1RhYmxlU25hcHNob3RUZXN0LmphdmEKQEAgLTIxLDggKzIxLDEwIEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOwogaW1wb3J0IGphdmEudGltZS5JbnN0YW50OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5VVUlEOwogCkBAIC0zNSw5ICszNywxMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVPdXRwdXRTdHJlYW1QbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXMubm93OwogaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogcHVibGljIGNsYXNzIFRhYmxlU25hcHNob3RUZXN0CiB7CkBAIC01MCwxNSArNTQsMTggQEAKICAgICBAQ2xhc3NSdWxlCiAgICAgcHVibGljIHN0YXRpYyBUZW1wb3JhcnlGb2xkZXIgdGVtcEZvbGRlciA9IG5ldyBUZW1wb3JhcnlGb2xkZXIoKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgU2V0PEZpbGU+IGNyZWF0ZUZvbGRlcnMoVGVtcG9yYXJ5Rm9sZGVyIHRlbXApIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHN0YXRpYyBTZXQ8RmlsZT4gY3JlYXRlRm9sZGVycyhUZW1wb3JhcnlGb2xkZXIgdGVtcCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgewogICAgICAgICBGaWxlIGZvbGRlciA9IG5ldyBGaWxlKHRlbXAubmV3Rm9sZGVyKCkpOwogICAgICAgICBTZXQ8RmlsZT4gZm9sZGVycyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgZm9yIChTdHJpbmcgZm9sZGVyTmFtZSA6IEFycmF5cy5hc0xpc3QoImZvbyIsICJiYXIiLCAiYnV6eiIpKSB7CisgICAgICAgIGZvciAoU3RyaW5nIGZvbGRlck5hbWUgOiBBcnJheXMuYXNMaXN0KCJmb28iLCAiYmFyIiwgImJ1enoiKSkKKyAgICAgICAgewogICAgICAgICAgICAgRmlsZSBzdWJmb2xkZXIgPSBuZXcgRmlsZShmb2xkZXIsIGZvbGRlck5hbWUpOwogICAgICAgICAgICAgc3ViZm9sZGVyLnRyeUNyZWF0ZURpcmVjdG9yaWVzKCk7CiAgICAgICAgICAgICBhc3NlcnRUaGF0KHN1YmZvbGRlci5leGlzdHMoKSk7CiAgICAgICAgICAgICBmb2xkZXJzLmFkZChzdWJmb2xkZXIpOwotICAgICAgICB9OworICAgICAgICB9CisgICAgICAgIDsKICAgICAgICAgcmV0dXJuIGZvbGRlcnM7CiAgICAgfQogCkBAIC03NCw3ICs4MSw5IEBACiAgICAgICAgICJzb21lIiwKICAgICAgICAgbnVsbCwKICAgICAgICAgbnVsbCwKLSAgICAgICAgZm9sZGVycyk7CisgICAgICAgIGZvbGRlcnMsCisgICAgICAgIGZhbHNlCisgICAgICAgICk7CiAKICAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdC5leGlzdHMoKSkuaXNUcnVlKCk7CiAKQEAgLTk1LDcgKzEwNCw5IEBACiAgICAgICAgICJzb21lIiwKICAgICAgICAgbnVsbCwKICAgICAgICAgbnVsbCwKLSAgICAgICAgZm9sZGVycyk7CisgICAgICAgIGZvbGRlcnMsCisgICAgICAgIGZhbHNlCisgICAgICAgICk7CiAKICAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdC5pc0V4cGlyaW5nKCkpLmlzRmFsc2UoKTsKICAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdC5pc0V4cGlyZWQobm93KCkpKS5pc0ZhbHNlKCk7CkBAIC0xMDcsNyArMTE4LDkgQEAKICAgICAgICAgInNvbWUiLAogICAgICAgICBub3coKSwKICAgICAgICAgbnVsbCwKLSAgICAgICAgZm9sZGVycyk7CisgICAgICAgIGZvbGRlcnMsCisgICAgICAgIGZhbHNlCisgICAgICAgICk7CiAKICAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdC5pc0V4cGlyaW5nKCkpLmlzRmFsc2UoKTsKICAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdC5pc0V4cGlyZWQobm93KCkpKS5pc0ZhbHNlKCk7CkBAIC0xMTksNyArMTMyLDkgQEAKICAgICAgICAgInNvbWUiLAogICAgICAgICBub3coKSwKICAgICAgICAgbm93KCkucGx1c1NlY29uZHMoMTAwMCksCi0gICAgICAgIGZvbGRlcnMpOworICAgICAgICBmb2xkZXJzLAorICAgICAgICBmYWxzZQorICAgICAgICApOwogCiAgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3QuaXNFeHBpcmluZygpKS5pc1RydWUoKTsKICAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdC5pc0V4cGlyZWQobm93KCkpKS5pc0ZhbHNlKCk7CkBAIC0xMzEsNyArMTQ2LDggQEAKICAgICAgICAgInNvbWUiLAogICAgICAgICBub3coKSwKICAgICAgICAgbm93KCkubWludXNTZWNvbmRzKDEwMDApLAotICAgICAgICBmb2xkZXJzKTsKKyAgICAgICAgZm9sZGVycywKKyAgICAgICAgZmFsc2UpOwogCiAgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3QuaXNFeHBpcmluZygpKS5pc1RydWUoKTsKICAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdC5pc0V4cGlyZWQobm93KCkpKS5pc1RydWUoKTsKQEAgLTE1OSw3ICsxNzUsOCBAQAogICAgICAgICAic29tZSIsCiAgICAgICAgIG51bGwsCiAgICAgICAgIG51bGwsCi0gICAgICAgIGZvbGRlcnMpOworICAgICAgICBmb2xkZXJzLAorICAgICAgICBmYWxzZSk7CiAKICAgICAgICAgTG9uZyByZXMgPSAwTDsKIApAQCAtMTg1LDcgKzIwMiw5IEBACiAgICAgICAgICJzb21lIiwKICAgICAgICAgbnVsbCwKICAgICAgICAgbnVsbCwKLSAgICAgICAgZm9sZGVycyk7CisgICAgICAgIGZvbGRlcnMsCisgICAgICAgIGZhbHNlCisgICAgICAgICk7CiAKICAgICAgICAgTG9uZyByZXMgPSAwTDsKIApAQCAtMjE0LDcgKzIzMywxMCBAQAogICAgICAgICAic29tZTEiLAogICAgICAgICBjcmVhdGVkQXQsCiAgICAgICAgIG51bGwsCi0gICAgICAgIGZvbGRlcnMpOworICAgICAgICBmb2xkZXJzLAorICAgICAgICBmYWxzZQorICAgICAgICApOworCiAgICAgICAgIGFzc2VydFRoYXQod2l0aENyZWF0ZWRBdC5nZXRDcmVhdGVkQXQoKSkuaXNFcXVhbFRvKGNyZWF0ZWRBdCk7CiAKICAgICAgICAgLy8gV2hlbiBjcmVhdGVkQXQgaXMgIG51bGwsIGl0IHNob3VsZCByZXR1cm4gdGhlIHNuYXBzaG90IGZvbGRlciBtaW5pbXVtIHVwZGF0ZSB0aW1lCkBAIC0yMjUsMTEgKzI0Nyw4MiBAQAogICAgICAgICAic29tZTEiLAogICAgICAgICBudWxsLAogICAgICAgICBudWxsLAotICAgICAgICBmb2xkZXJzKTsKKyAgICAgICAgZm9sZGVycywKKyAgICAgICAgZmFsc2UKKyAgICAgICAgKTsKKwogICAgICAgICBhc3NlcnRUaGF0KHdpdGhvdXRDcmVhdGVkQXQuZ2V0Q3JlYXRlZEF0KCkpLmlzRXF1YWxUbyhJbnN0YW50Lm9mRXBvY2hNaWxsaShmb2xkZXJzLnN0cmVhbSgpLm1hcFRvTG9uZyhmIC0+IGYubGFzdE1vZGlmaWVkKCkpLm1pbigpLmdldEFzTG9uZygpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkQ2xlYXJTbmFwc2hvdCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIFRhYmxlU25hcHNob3QgdmFyaWFibGVzIC0+IGVwaGVtZXJhbCAvIHRydWUgLyBmYWxzZSwgY3JlYXRlZEF0IC0+IG51bGwgLyBub3RudWxsCisKKyAgICAgICAgSW5zdGFudCBub3cgPSBJbnN0YW50Lm5vdygpOworCisgICAgICAgIFN0cmluZyBrZXlzcGFjZSA9ICJrcyI7CisgICAgICAgIFN0cmluZyB0YWJsZSA9ICJ0YmwiOworICAgICAgICBVVUlEIGlkID0gVVVJRC5yYW5kb21VVUlEKCk7CisgICAgICAgIFN0cmluZyB0YWcgPSAic29tZVRhZyI7CisgICAgICAgIEluc3RhbnQgc25hcHNob3RDcmVhdGlvbiA9IG5vdy5taW51c1NlY29uZHMoNjApOworICAgICAgICBTZXQ8RmlsZT4gZm9sZGVycyA9IGNyZWF0ZUZvbGRlcnModGVtcEZvbGRlcik7CisKKyAgICAgICAgTGlzdDxUYWJsZVNuYXBzaG90PiBzbmFwc2hvdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICBmb3IgKGJvb2xlYW4gZXBoZW1lcmFsIDogbmV3IGJvb2xlYW5bXXsgdHJ1ZSwgZmFsc2UgfSkKKyAgICAgICAgICAgIGZvciAoSW5zdGFudCBjcmVhdGVkQXQgOiBuZXcgSW5zdGFudFtdeyBzbmFwc2hvdENyZWF0aW9uLCBudWxsIH0pCisgICAgICAgICAgICAgICAgc25hcHNob3RzLmFkZChuZXcgVGFibGVTbmFwc2hvdChrZXlzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkQXQsIC8vIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwaGVtZXJhbCkpOyAvLyB2YXJpYWJsZQorCisgICAgICAgIExpc3Q8UGFpcjxTdHJpbmcsIExvbmc+PiB0ZXN0aW5nTWV0aG9kSW5wdXRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgZm9yIChTdHJpbmcgdGVzdGluZ1RhZyA6IG5ldyBTdHJpbmdbXSB7bnVsbCwgIiIsIHRhZywgInNvbWVvdGhlcnRhZyJ9KQorICAgICAgICAgICAgLy8gMCB0byBkZWFjdGl2ZSBieVRpbWVzdGFtcCBsb2dpYywgbm93LnRvRXBvY2hNaWxsaSBhcyB0cnVlLCBzbmFwc2hvdCBtaW51cyA2MHMgYXMgZmFsc2UKKyAgICAgICAgICAgIGZvciAobG9uZyBvbGRlclRoYW5UaW1lc3RhbXAgOiBuZXcgbG9uZ1tdIHswLCBub3cudG9FcG9jaE1pbGxpKCksIHNuYXBzaG90Q3JlYXRpb24ubWludXNTZWNvbmRzKDYwKS50b0Vwb2NoTWlsbGkoKX0pCisgICAgICAgICAgICAgICAgdGVzdGluZ01ldGhvZElucHV0cy5hZGQoUGFpci5jcmVhdGUodGVzdGluZ1RhZywgb2xkZXJUaGFuVGltZXN0YW1wKSk7CisKKyAgICAgICAgZm9yIChQYWlyPFN0cmluZywgTG9uZz4gbWV0aG9kSW5wdXQgOiB0ZXN0aW5nTWV0aG9kSW5wdXRzKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgdGVzdGluZ1RhZyA9IG1ldGhvZElucHV0LmxlZnQoKTsKKyAgICAgICAgICAgIExvbmcgb2xkZXJUaGFuVGltZXN0YW1wID0gbWV0aG9kSW5wdXQucmlnaHQ7CisgICAgICAgICAgICBmb3IgKFRhYmxlU25hcHNob3Qgc25hcHNob3QgOiBzbmFwc2hvdHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaWYgc2hvdWxkQ2xlYXIgbWV0aG9kIHJldHVybnMgdHJ1ZSwgaXQgaXMgb25seSBpbiBjYXNlCisgICAgICAgICAgICAgICAgLy8gMS4gc25hcHNob3QgdG8gY2xlYXIgaXMgbm90IGVwaGVtZXJhbAorICAgICAgICAgICAgICAgIC8vIDIuIHRhZyB0byBjbGVhciBpcyBudWxsLCBlbXB0eSwgb3IgaXQgaXMgZXF1YWwgdG8gc25hcHNob3QgdGFnCisgICAgICAgICAgICAgICAgLy8gMy4gYnlUaW1lc3RhbXAgaXMgdHJ1ZQorICAgICAgICAgICAgICAgIGlmIChUYWJsZVNuYXBzaG90LnNob3VsZENsZWFyU25hcHNob3QodGVzdGluZ1RhZywgb2xkZXJUaGFuVGltZXN0YW1wKS50ZXN0KHNuYXBzaG90KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZENsZWFyVGFnID0gdHJ1ZQorICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNob3VsZENsZWFyVGFnID0gKHRlc3RpbmdUYWcgPT0gbnVsbCB8fCB0ZXN0aW5nVGFnLmlzRW1wdHkoKSkgfHwgc25hcHNob3QuZ2V0VGFnKCkuZXF1YWxzKHRlc3RpbmdUYWcpOworICAgICAgICAgICAgICAgICAgICAvLyBub3RFcGhlbWVyYWwKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBub3RFcGhlbWVyYWwgPSAhc25hcHNob3QuaXNFcGhlbWVyYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gYnlUaW1lc3RhbXAKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBieVRpbWVzdGFtcCA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9sZGVyVGhhblRpbWVzdGFtcCA+IDBMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBJbnN0YW50IGNyZWF0ZWRBdCA9IHNuYXBzaG90LmdldENyZWF0ZWRBdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZWRBdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5VGltZXN0YW1wID0gY3JlYXRlZEF0LmlzQmVmb3JlKEluc3RhbnQub2ZFcG9jaE1pbGxpKG9sZGVyVGhhblRpbWVzdGFtcCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShub3RFcGhlbWVyYWwpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHNob3VsZENsZWFyVGFnKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShieVRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGl2ZUZpbGVGcm9tU25hcHNob3RGaWxlKCkKICAgICB7CiAgICAgICAgIHRlc3RHZXRMaXZlRmlsZUZyb21TbmFwc2hvdEZpbGUoIn4vLmNjbS90ZXN0L25vZGUxL2RhdGEwL3Rlc3Rfa3MvdGJsLWUwM2ZhY2EwODEzMjExZWNhMTAwYzcwNWVhMDliNWVmL3NuYXBzaG90cy8xNjQzNDgxNzM3ODUwL21lLTEtYmlnLURhdGEuZGIiLApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9FbnRpcmVTU1RhYmxlU3RyZWFtaW5nQ29ycmVjdEZpbGVzQ291bnRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL0VudGlyZVNTVGFibGVTdHJlYW1pbmdDb3JyZWN0RmlsZXNDb3VudFRlc3QuamF2YQppbmRleCAzNGNlMDljLi41YThmNGE1IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL0VudGlyZVNTVGFibGVTdHJlYW1pbmdDb3JyZWN0RmlsZXNDb3VudFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL0VudGlyZVNTVGFibGVTdHJlYW1pbmdDb3JyZWN0RmlsZXNDb3VudFRlc3QuamF2YQpAQCAtMjEyLDcgKzIxMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVNlc3Npb24uU3RhdGUuSU5JVElBTElaRUQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVNlc3Npb24uU3RhdGUuSU5JVElBTElaRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKSk7CiAKICAgICAgICAgU3RyZWFtU2Vzc2lvbiBzZXNzaW9uID0gc3RyZWFtQ29vcmRpbmF0b3IuZ2V0T3JDcmVhdGVPdXRib3VuZFNlc3Npb24ocGVlcik7CiAgICAgICAgIHNlc3Npb24uaW5pdChmdXR1cmUpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TZXNzaW9uSW5mb1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU2Vzc2lvbkluZm9UZXN0LmphdmEKaW5kZXggNDUxNzJmZS4uNzc4YjZiMiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TZXNzaW9uSW5mb1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1Nlc3Npb25JbmZvVGVzdC5qYXZhCkBAIC00Niw3ICs0Niw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBTdHJlYW1TdW1tYXJ5IHNlbmRpbmcgPSBuZXcgU3RyZWFtU3VtbWFyeSh0YWJsZUlkLCAxMCwgMTAwKTsKLSAgICAgICAgU2Vzc2lvbkluZm8gaW5mbyA9IG5ldyBTZXNzaW9uSW5mbyhsb2NhbCwgMCwgbG9jYWwsIHN1bW1hcmllcywgQ29sbGVjdGlvbnMuc2luZ2xldG9uKHNlbmRpbmcpLCBTdHJlYW1TZXNzaW9uLlN0YXRlLlBSRVBBUklORyk7CisgICAgICAgIFNlc3Npb25JbmZvIGluZm8gPSBuZXcgU2Vzc2lvbkluZm8obG9jYWwsIDAsIGxvY2FsLCBzdW1tYXJpZXMsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihzZW5kaW5nKSwgU3RyZWFtU2Vzc2lvbi5TdGF0ZS5QUkVQQVJJTkcsIG51bGwpOwogCiAgICAgICAgIGFzc2VydCBpbmZvLmdldFRvdGFsRmlsZXNUb1JlY2VpdmUoKSA9PSA0NTsKICAgICAgICAgYXNzZXJ0IGluZm8uZ2V0VG90YWxGaWxlc1RvU2VuZCgpID09IDEwOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TdHJlYW1TZXNzaW9uVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TdHJlYW1TZXNzaW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZjNmZjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbVNlc3Npb25UZXN0LmphdmEKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVTdG9yZTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5GaWxlQXR0cmlidXRlVmlldzsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5GaWxlU3RvcmVBdHRyaWJ1dGVWaWV3OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG5ldC5ieXRlYnVkZHkuQnl0ZUJ1ZGR5OworaW1wb3J0IG5ldC5ieXRlYnVkZHkuYWdlbnQuQnl0ZUJ1ZGR5QWdlbnQ7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5keW5hbWljLmxvYWRpbmcuQ2xhc3NSZWxvYWRpbmdTdHJhdGVneTsKK2ltcG9ydCBuZXQuYnl0ZWJ1ZGR5LmltcGxlbWVudGF0aW9uLk1ldGhvZERlbGVnYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CisKK2ltcG9ydCBzdGF0aWMgbmV0LmJ5dGVidWRkeS5tYXRjaGVyLkVsZW1lbnRNYXRjaGVycy5uYW1lZDsKK2ltcG9ydCBzdGF0aWMgbmV0LmJ5dGVidWRkeS5tYXRjaGVyLkVsZW1lbnRNYXRjaGVycy50YWtlc0FyZ3VtZW50czsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgU3RyZWFtU2Vzc2lvblRlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBEaXJlY3RvcmllcyBkaXJzOworICAgIHByaXZhdGUgc3RhdGljIERpcmVjdG9yaWVzIGRpcnMyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxGaWxlPiBmaWxlczsKKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PERpcmVjdG9yaWVzLkRhdGFEaXJlY3Rvcnk+IGRhdGFkaXJzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzOworICAgIHByaXZhdGUgc3RhdGljIENvbHVtbkZhbWlseVN0b3JlIGNmczI7CisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxGYWtlRmlsZVN0b3JlPiBmaWxlc3RvcmVzID0gTGlzdHMubmV3QXJyYXlMaXN0KG5ldyBGYWtlRmlsZVN0b3JlKCksIG5ldyBGYWtlRmlsZVN0b3JlKCksIG5ldyBGYWtlRmlsZVN0b3JlKCkpOworCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZSgpCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKyAgICAgICAgQnl0ZUJ1ZGR5QWdlbnQuaW5zdGFsbCgpOworICAgICAgICBuZXcgQnl0ZUJ1ZGR5KCkucmVkZWZpbmUoQ29sdW1uRmFtaWx5U3RvcmUuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgIC5tZXRob2QobmFtZWQoImdldElmRXhpc3RzIikuYW5kKHRha2VzQXJndW1lbnRzKDEpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgLmludGVyY2VwdChNZXRob2REZWxlZ2F0aW9uLnRvKEJCS2V5c3BhY2VIZWxwZXIuY2xhc3MpKQorICAgICAgICAgICAgICAgICAgICAgICAubWFrZSgpCisgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKENvbHVtbkZhbWlseVN0b3JlLmNsYXNzLmdldENsYXNzTG9hZGVyKCksIENsYXNzUmVsb2FkaW5nU3RyYXRlZ3kuZnJvbUluc3RhbGxlZEFnZW50KCkpOworICAgICAgICBmaWxlcyA9IExpc3RzLm5ld0FycmF5TGlzdChuZXcgRmlsZSgiL3RtcC8xIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKCIvdG1wLzIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoIi90bXAvMyIpKTsKKyAgICAgICAgZGF0YWRpcnMgPSBmaWxlcy5zdHJlYW0oKS5tYXAoRGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeTo6bmV3KS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0TWluRnJlZVNwYWNlUGVyRHJpdmVJbk1lYmlieXRlcygwKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldE1heFNwYWNlRm9yQ29tcGFjdGlvbnNQZXJEcml2ZSgxLjApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYmFzaWNEaXNrU3BhY2VUZXN0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiY3JlYXRlIHRhYmxlICVzIChrIGludCBwcmltYXJ5IGtleSwgaSBpbnQpIik7CisgICAgICAgIGRpcnMgPSBuZXcgRGlyZWN0b3JpZXMoZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkubWV0YWRhdGEoKSwgZGF0YWRpcnMpOworICAgICAgICBjZnMgPSBuZXcgTW9ja0NGUyhnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKSwgZGlycyk7CisKKyAgICAgICAgTWFwPFRhYmxlSWQsIExvbmc+IHBlclRhYmxlSWRJbmNvbWluZ0J5dGVzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBwZXJUYWJsZUlkSW5jb21pbmdCeXRlcy5wdXQoY2ZzLm1ldGFkYXRhLmlkLCA5OTlMKTsKKworICAgICAgICBmaWxlc3RvcmVzLmdldCgwKS51c2FibGVTcGFjZSA9IDMzNDsKKyAgICAgICAgZmlsZXN0b3Jlcy5nZXQoMSkudXNhYmxlU3BhY2UgPSAzMzQ7CisgICAgICAgIGZpbGVzdG9yZXMuZ2V0KDIpLnVzYWJsZVNwYWNlID0gMzM0OworCisgICAgICAgIEtleXNwYWNlLmFsbCgpLmZvckVhY2goa3MgLT4ga3MuZ2V0Q29sdW1uRmFtaWx5U3RvcmVzKCkuZm9yRWFjaChDb2x1bW5GYW1pbHlTdG9yZTo6ZGlzYWJsZUF1dG9Db21wYWN0aW9uKSk7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOworICAgICAgICB9IHdoaWxlICghQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmdldENvbXBhY3Rpb25zKCkuaXNFbXB0eSgpKTsKKworICAgICAgICBhc3NlcnRUcnVlKFN0cmVhbVNlc3Npb24uY2hlY2tEaXNrU3BhY2UocGVyVGFibGVJZEluY29taW5nQnl0ZXMsIG5leHRUaW1lVVVJRCgpLCBmaWxlc3RvcmVNYXBwZXIpKTsKKworICAgICAgICBmaWxlc3RvcmVzLmdldCgwKS51c2FibGVTcGFjZSA9IDMzMjsKKyAgICAgICAgYXNzZXJ0RmFsc2UoU3RyZWFtU2Vzc2lvbi5jaGVja0Rpc2tTcGFjZShwZXJUYWJsZUlkSW5jb21pbmdCeXRlcywgbmV4dFRpbWVVVUlEKCksIGZpbGVzdG9yZU1hcHBlcikpOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBtdWx0aVRhYmxlRGlza1NwYWNlVGVzdCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoImNyZWF0ZSB0YWJsZSAlcyAoayBpbnQgcHJpbWFyeSBrZXksIGkgaW50KSIpOworICAgICAgICBkaXJzID0gbmV3IERpcmVjdG9yaWVzKGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLm1ldGFkYXRhKCksIGRhdGFkaXJzLnN1Ykxpc3QoMCwyKSk7CisgICAgICAgIGNmcyA9IG5ldyBNb2NrQ0ZTKGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLCBkaXJzKTsKKyAgICAgICAgY3JlYXRlVGFibGUoImNyZWF0ZSB0YWJsZSAlcyAoayBpbnQgcHJpbWFyeSBrZXksIGkgaW50KSIpOworICAgICAgICBkaXJzMiA9IG5ldyBEaXJlY3RvcmllcyhnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5tZXRhZGF0YSgpLCBkYXRhZGlycy5zdWJMaXN0KDEsMykpOworICAgICAgICBjZnMyID0gbmV3IE1vY2tDRlMoZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCksIGRpcnMyKTsKKworICAgICAgICBNYXA8VGFibGVJZCwgTG9uZz4gcGVyVGFibGVJZEluY29taW5nQnl0ZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIC8vIGNmcyBoYXMgZGF0YWRpcnMgMCwgMQorICAgICAgICAvLyBjZnMyIGhhcyBkYXRhZGlycyAxLCAyCisgICAgICAgIC8vIHRoaXMgbWVhbnMgdGhhdCB0aGUgZGF0YWRpciAxIHdpbGwgZ2V0IDEwMDAgYnl0ZXMgc3RyZWFtZWQsIGFuZCB0aGUgb3RoZXIgZGRpcnMgNTAwYnl0ZXM6CisgICAgICAgIHBlclRhYmxlSWRJbmNvbWluZ0J5dGVzLnB1dChjZnMubWV0YWRhdGEuaWQsIDEwMDBMKTsKKyAgICAgICAgcGVyVGFibGVJZEluY29taW5nQnl0ZXMucHV0KGNmczIubWV0YWRhdGEuaWQsIDEwMDBMKTsKKworICAgICAgICBmaWxlc3RvcmVzLmdldCgwKS51c2FibGVTcGFjZSA9IDUwMTsKKyAgICAgICAgZmlsZXN0b3Jlcy5nZXQoMSkudXNhYmxlU3BhY2UgPSAxMDAxOworICAgICAgICBmaWxlc3RvcmVzLmdldCgyKS51c2FibGVTcGFjZSA9IDUwMTsKKworICAgICAgICBLZXlzcGFjZS5hbGwoKS5mb3JFYWNoKGtzIC0+IGtzLmdldENvbHVtbkZhbWlseVN0b3JlcygpLmZvckVhY2goQ29sdW1uRmFtaWx5U3RvcmU6OmRpc2FibGVBdXRvQ29tcGFjdGlvbikpOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKKyAgICAgICAgfSB3aGlsZSAoIUNvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmFjdGl2ZS5nZXRDb21wYWN0aW9ucygpLmlzRW1wdHkoKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJlYW1TZXNzaW9uLmNoZWNrRGlza1NwYWNlKHBlclRhYmxlSWRJbmNvbWluZ0J5dGVzLCBuZXh0VGltZVVVSUQoKSwgZmlsZXN0b3JlTWFwcGVyKSk7CisKKyAgICAgICAgZmlsZXN0b3Jlcy5nZXQoMSkudXNhYmxlU3BhY2UgPSA5OTk7CisgICAgICAgIGFzc2VydEZhbHNlKFN0cmVhbVNlc3Npb24uY2hlY2tEaXNrU3BhY2UocGVyVGFibGVJZEluY29taW5nQnl0ZXMsIG5leHRUaW1lVVVJRCgpLCBmaWxlc3RvcmVNYXBwZXIpKTsKKworICAgIH0KKworICAgIHN0YXRpYyBGdW5jdGlvbjxGaWxlLCBGaWxlU3RvcmU+IGZpbGVzdG9yZU1hcHBlciA9IChmKSAtPiB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmLnRvUGF0aCgpLnN0YXJ0c1dpdGgoZmlsZXMuZ2V0KGkpLnRvUGF0aCgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmlsZXN0b3Jlcy5nZXQoaSk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkJhZCBmaWxlOiAiK2YpOworICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNb2NrQ0ZTIGV4dGVuZHMgQ29sdW1uRmFtaWx5U3RvcmUKKyAgICB7CisgICAgICAgIE1vY2tDRlMoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBEaXJlY3RvcmllcyBkaXJzKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihjZnMua2V5c3BhY2UsIGNmcy5nZXRUYWJsZU5hbWUoKSwgVXRpbC5uZXdTZXFHZW4oKSwgY2ZzLm1ldGFkYXRhLCBkaXJzLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gcmV0dXJuIG91ciBtb2NrZWQgdGFibGVzOgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQkJLZXlzcGFjZUhlbHBlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBDb2x1bW5GYW1pbHlTdG9yZSBnZXRJZkV4aXN0cyhUYWJsZUlkIGlkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaWQgPT0gY2ZzLm1ldGFkYXRhLmlkKQorICAgICAgICAgICAgICAgIHJldHVybiBjZnM7CisgICAgICAgICAgICByZXR1cm4gY2ZzMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFrZUZpbGVTdG9yZSBleHRlbmRzIEZpbGVTdG9yZQorICAgIHsKKyAgICAgICAgcHVibGljIGxvbmcgdXNhYmxlU3BhY2U7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFVzYWJsZVNwYWNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHVzYWJsZVNwYWNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpIHtyZXR1cm4gbnVsbDt9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHR5cGUoKSB7cmV0dXJuIG51bGw7fQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHtyZXR1cm4gZmFsc2U7fQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0VG90YWxTcGFjZSgpIHtyZXR1cm4gMDt9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRVbmFsbG9jYXRlZFNwYWNlKCkge3JldHVybiAwO30KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzRmlsZUF0dHJpYnV0ZVZpZXcoQ2xhc3M8PyBleHRlbmRzIEZpbGVBdHRyaWJ1dGVWaWV3PiB0eXBlKSB7cmV0dXJuIGZhbHNlO30KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzRmlsZUF0dHJpYnV0ZVZpZXcoU3RyaW5nIG5hbWUpIHtyZXR1cm4gZmFsc2U7fQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxWIGV4dGVuZHMgRmlsZVN0b3JlQXR0cmlidXRlVmlldz4gViBnZXRGaWxlU3RvcmVBdHRyaWJ1dGVWaWV3KENsYXNzPFY+IHR5cGUpIHtyZXR1cm4gbnVsbDt9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlKSB0aHJvd3MgSU9FeGNlcHRpb24ge3JldHVybiBudWxsO30KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbWluZ1RyYW5zZmVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TdHJlYW1pbmdUcmFuc2ZlclRlc3QuamF2YQppbmRleCBjZmZkM2IyLi4wNTI3NjQ4IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbWluZ1RyYW5zZmVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtaW5nVHJhbnNmZXJUZXN0LmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRnV0dXJlczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuTW9yZUV4ZWN1dG9yczsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXRQYXJ0aXRpb25Xcml0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SYW5nZXNBdEVuZHBvaW50OwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTM0MSwxMyArMzQyLDEzIEBACiAKICAgICAgICAgLy8gYWRkIGNvbHVtbnMgb2Ygc2l6ZSBzbGlnaHRseSBsZXNzIHRoYW4gY29sdW1uX2luZGV4X3NpemUgdG8gZm9yY2UgaW5zZXJ0IGNvbHVtbiBpbmRleAogICAgICAgICB1cGRhdGVzLmNsdXN0ZXJpbmcoMSkKLSAgICAgICAgICAgICAgICAuYWRkKCJ2YWwiLCBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbHVtbkluZGV4U2l6ZSgpIC0gNjRdKSkKKyAgICAgICAgICAgICAgICAuYWRkKCJ2YWwiLCBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbHVtbkluZGV4U2l6ZShCaWdGb3JtYXRQYXJ0aXRpb25Xcml0ZXIuREVGQVVMVF9HUkFOVUxBUklUWSkgLSA2NF0pKQogICAgICAgICAgICAgICAgIC5idWlsZCgpCiAgICAgICAgICAgICAgICAgLmFwcGx5KCk7CiAKICAgICAgICAgdXBkYXRlcyA9IG5ldyBSb3dVcGRhdGVCdWlsZGVyKGNmcy5tZXRhZGF0YSgpLCBGQlV0aWxpdGllcy50aW1lc3RhbXBNaWNyb3MoKSwga2V5KTsKICAgICAgICAgdXBkYXRlcy5jbHVzdGVyaW5nKDYpCi0gICAgICAgICAgICAgICAgLmFkZCgidmFsIiwgQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW0RhdGFiYXNlRGVzY3JpcHRvci5nZXRDb2x1bW5JbmRleFNpemUoKV0pKQorICAgICAgICAgICAgICAgIC5hZGQoInZhbCIsIEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29sdW1uSW5kZXhTaXplKEJpZ0Zvcm1hdFBhcnRpdGlvbldyaXRlci5ERUZBVUxUX0dSQU5VTEFSSVRZKV0pKQogICAgICAgICAgICAgICAgIC5idWlsZCgpCiAgICAgICAgICAgICAgICAgLmFwcGx5KCk7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvY29tcHJlc3Npb24vQ29tcHJlc3NlZElucHV0U3RyZWFtVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9jb21wcmVzc2lvbi9Db21wcmVzc2VkSW5wdXRTdHJlYW1UZXN0LmphdmEKaW5kZXggNjE5ZTBkOS4uMzkxZDU4OSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9jb21wcmVzc2lvbi9Db21wcmVzc2VkSW5wdXRTdHJlYW1UZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9jb21wcmVzc2lvbi9Db21wcmVzc2VkSW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTE3LDE0ICsxNywxNCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5jb21wcmVzc2lvbjsKIAotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNlcXVlbmNlQmFzZWRTU1RhYmxlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTMzLDE4ICszMywyMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0NvbXBhcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlc1R5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuc3RyZWFtaW5nLkNvbXByZXNzZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5zdHJlYW1pbmcuQ29tcHJlc3Npb25JbmZvOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkNvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkNvbXByZXNzaW9uTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2VxdWVuY2VCYXNlZFNTVGFibGVJZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5Db21wcmVzc2lvbkluZm9Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzLkRhdGFJbnB1dFN0cmVhbVBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbGxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SYW5kb21BY2Nlc3NSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyT3B0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wcmVzc2lvblBhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbGxlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5zdHJlYW1pbmcuQ29tcHJlc3NlZElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnN0cmVhbWluZy5Db21wcmVzc2lvbkluZm87CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2hlY2tzdW1UeXBlOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwpAQCAtMTIxLDEyICsxMjQsMTIgQEAKICAgICAgICAgLy8gd3JpdGUgY29tcHJlc3NlZCBkYXRhIGZpbGUgb2YgbG9uZ3MKICAgICAgICAgRmlsZSBwYXJlbnREaXIgPSBuZXcgRmlsZSh0ZW1wRm9sZGVyLm5ld0ZvbGRlcigpKTsKICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gbmV3IERlc2NyaXB0b3IocGFyZW50RGlyLCAia3MiLCAiY2YiLCBuZXcgU2VxdWVuY2VCYXNlZFNTVGFibGVJZCgxKSk7Ci0gICAgICAgIEZpbGUgdG1wID0gbmV3IEZpbGUoZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpOworICAgICAgICBGaWxlIHRtcCA9IGRlc2MuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpOwogICAgICAgICBNZXRhZGF0YUNvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgTWV0YWRhdGFDb2xsZWN0b3IobmV3IENsdXN0ZXJpbmdDb21wYXJhdG9yKEJ5dGVzVHlwZS5pbnN0YW5jZSkpOwogICAgICAgICBDb21wcmVzc2lvblBhcmFtcyBwYXJhbSA9IENvbXByZXNzaW9uUGFyYW1zLnNuYXBweSgzMiwgbWluQ29tcHJlc3NSYXRpbyk7CiAgICAgICAgIE1hcDxMb25nLCBMb25nPiBpbmRleCA9IG5ldyBIYXNoTWFwPExvbmcsIExvbmc+KCk7CiAgICAgICAgIHRyeSAoQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyID0gbmV3IENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyKHRtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuQ09NUFJFU1NJT05fSU5GTyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MuZmlsZUZvcihDb21wb25lbnRzLkNPTVBSRVNTSU9OX0lORk8pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW50aWFsV3JpdGVyT3B0aW9uLkRFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLCBjb2xsZWN0b3IpKQpAQCAtMTM5LDcgKzE0Miw3IEBACiAgICAgICAgICAgICB3cml0ZXIuZmluaXNoKCk7CiAgICAgICAgIH0KIAotICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhIGNvbXAgPSBDb21wcmVzc2lvbk1ldGFkYXRhLmNyZWF0ZSh0bXAuYWJzb2x1dGVQYXRoKCkpOworICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhIGNvbXAgPSBDb21wcmVzc2lvbkluZm9Db21wb25lbnQubG9hZChkZXNjKTsKICAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyLlBhcnRpdGlvblBvc2l0aW9uQm91bmRzPiBzZWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBmb3IgKGxvbmcgbCA6IHZhbHVlc1RvQ2hlY2spCiAgICAgICAgIHsKQEAgLTE4NCw3ICsxODcsNyBAQAogICAgICAgICAgICAgdGVzdEV4Y2VwdGlvbihzZWN0aW9ucywgaW5mbyk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgQ29tcHJlc3NlZElucHV0U3RyZWFtIGlucHV0ID0gbmV3IENvbXByZXNzZWRJbnB1dFN0cmVhbShuZXcgRGF0YUlucHV0U3RyZWFtUGx1cyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odG9SZWFkKSksIGluZm8sIENoZWNrc3VtVHlwZS5DUkMzMiwgKCkgLT4gMS4wKTsKKyAgICAgICAgQ29tcHJlc3NlZElucHV0U3RyZWFtIGlucHV0ID0gbmV3IENvbXByZXNzZWRJbnB1dFN0cmVhbShuZXcgRGF0YUlucHV0QnVmZmVyKHRvUmVhZCksIGluZm8sIENoZWNrc3VtVHlwZS5DUkMzMiwgKCkgLT4gMS4wKTsKIAogICAgICAgICB0cnkgKERhdGFJbnB1dFN0cmVhbSBpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oaW5wdXQpKQogICAgICAgICB7CkBAIC0xOTksNyArMjAyLDcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdEV4Y2VwdGlvbihMaXN0PFNTVGFibGVSZWFkZXIuUGFydGl0aW9uUG9zaXRpb25Cb3VuZHM+IHNlY3Rpb25zLCBDb21wcmVzc2lvbkluZm8gaW5mbykgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBDb21wcmVzc2VkSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgQ29tcHJlc3NlZElucHV0U3RyZWFtKG5ldyBEYXRhSW5wdXRTdHJlYW1QbHVzKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSkpLCBpbmZvLCBDaGVja3N1bVR5cGUuQ1JDMzIsICgpIC0+IDEuMCk7CisgICAgICAgIENvbXByZXNzZWRJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBDb21wcmVzc2VkSW5wdXRTdHJlYW0obmV3IERhdGFJbnB1dEJ1ZmZlcihuZXcgYnl0ZVswXSksIGluZm8sIENoZWNrc3VtVHlwZS5DUkMzMiwgKCkgLT4gMS4wKTsKIAogICAgICAgICB0cnkgKERhdGFJbnB1dFN0cmVhbSBpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oaW5wdXQpKQogICAgICAgICB7CkBAIC0yMTgsNCArMjIxLDMgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL0J1bGtMb2FkZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvQnVsa0xvYWRlclRlc3QuamF2YQppbmRleCA1MDdhYTUzLi5mYjA4OTcxIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvQnVsa0xvYWRlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvQnVsa0xvYWRlclRlc3QuamF2YQpAQCAtMzksNyArMzksOCBAQAogICAgICAgICAKICAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQobmV3IFN0cmluZ1tdIHsgIk9iamVjdENsZWFuZXJUaHJlYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2h1dGRvd24tY2hlY2tlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbHVzdGVyWzAtOV0tY29ubmVjdGlvbi1yZWFwZXItWzAtOV0iIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2x1c3RlclswLTldLWNvbm5lY3Rpb24tcmVhcGVyLVswLTldIiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CiAgICAgICAgIGFzc2VydFNjaGVtYU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRDTFNNTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydFN5c3RlbUtTTm90TG9hZGVkKCk7CkBAIC02NSw3ICs2NiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2xvYmFsRXZlbnRFeGVjdXRvci1bMS05XS1bMS05XSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnbG9iYWxFdmVudEV4ZWN1dG9yLVsxLTldLVsxLTldIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNodXRkb3duLWNoZWNrZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2x1c3RlclswLTldLWNvbm5lY3Rpb24tcmVhcGVyLVswLTldIiB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsdXN0ZXJbMC05XS1jb25uZWN0aW9uLXJlYXBlci1bMC05XSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRhY2ggTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvY2VzcyByZWFwZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSk5BIENsZWFuZXIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgICAgICBhc3NlcnRTY2hlbWFOb3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0Q0xTTU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRTeXN0ZW1LU05vdExvYWRlZCgpOwpAQCAtOTMsMTEgKzk4LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnbG9iYWxFdmVudEV4ZWN1dG9yLVsxLTldLVsxLTldIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdsb2JhbEV2ZW50RXhlY3V0b3ItWzEtOV0tWzEtOV0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2h1dGRvd24tY2hlY2tlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbHVzdGVyWzAtOV0tY29ubmVjdGlvbi1yZWFwZXItWzAtOV0iIH0pOwotICAgICAgICBhc3NlcnRTY2hlbWFOb3RMb2FkZWQoKTsKLSAgICAgICAgYXNzZXJ0Q0xTTU5vdExvYWRlZCgpOwotICAgICAgICBhc3NlcnRTeXN0ZW1LU05vdExvYWRlZCgpOwotICAgICAgICBhc3NlcnRLZXlzcGFjZU5vdExvYWRlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2x1c3RlclswLTldLWNvbm5lY3Rpb24tcmVhcGVyLVswLTldIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF0dGFjaCBMaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzIHJlYXBlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKTkEgQ2xlYW5lciJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgYXNzZXJ0U2NoZW1hTm90TG9hZGVkKCk7CisgICAgYXNzZXJ0Q0xTTU5vdExvYWRlZCgpOworICAgIGFzc2VydFN5c3RlbUtTTm90TG9hZGVkKCk7CisgICAgYXNzZXJ0S2V5c3BhY2VOb3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0U2VydmVyTm90TG9hZGVkKCk7CiAgICAgfQogCkBAIC0xMjEsMTAgKzEzMCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2xvYmFsRXZlbnRFeGVjdXRvci1bMS05XS1bMS05XSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnbG9iYWxFdmVudEV4ZWN1dG9yLVsxLTldLVsxLTldIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNodXRkb3duLWNoZWNrZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2x1c3RlclswLTldLWNvbm5lY3Rpb24tcmVhcGVyLVswLTldIiB9KTsKLSAgICAgICAgYXNzZXJ0U2NoZW1hTm90TG9hZGVkKCk7Ci0gICAgICAgIGFzc2VydENMU01Ob3RMb2FkZWQoKTsKLSAgICAgICAgYXNzZXJ0U3lzdGVtS1NOb3RMb2FkZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsdXN0ZXJbMC05XS1jb25uZWN0aW9uLXJlYXBlci1bMC05XSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRhY2ggTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvY2VzcyByZWFwZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSk5BIENsZWFuZXIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIGFzc2VydFNjaGVtYU5vdExvYWRlZCgpOworICAgIGFzc2VydENMU01Ob3RMb2FkZWQoKTsKKyAgICBhc3NlcnRTeXN0ZW1LU05vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRLZXlzcGFjZU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRTZXJ2ZXJOb3RMb2FkZWQoKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvR2V0VmVyc2lvblRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9HZXRWZXJzaW9uVGVzdC5qYXZhCmluZGV4IDllYWY1N2YuLmIzZGRiNTggMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9HZXRWZXJzaW9uVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9HZXRWZXJzaW9uVGVzdC5qYXZhCkBAIC0yOSw3ICsyOSw3IEBACiAgICAgewogICAgICAgICBUb29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZUNsYXNzKEdldFZlcnNpb24uY2xhc3MpOwogICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7Ci0gICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKG51bGwpOworICAgICAgICBhc3NlcnROb1VuZXhwZWN0ZWRUaHJlYWRzU3RhcnRlZChudWxsLCBmYWxzZSk7CiAgICAgICAgIGFzc2VydFNjaGVtYU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRDTFNNTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydFN5c3RlbUtTTm90TG9hZGVkKCk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvSk1YQ29tcGF0YWJpbGl0eVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9KTVhDb21wYXRhYmlsaXR5VGVzdC5qYXZhCmluZGV4IGVkZTNkNmMuLjU5NDg1ZGUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9KTVhDb21wYXRhYmlsaXR5VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9KTVhDb21wYXRhYmlsaXR5VGVzdC5qYXZhCkBAIC0xOCwzMyArMTgsMzUgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29sczsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuQ2xhc3NSdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZW1wb3JhcnlGb2xkZXI7CiAKIGltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuU2ltcGxlU3RhdGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpLkJ0aUZvcm1hdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNhc3NhbmRyYURhZW1vbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkdDSW5zcGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlRvb2xSdW5uZXIuVG9vbFJlc3VsdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CiAKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0cy5uZXdBcnJheUxpc3Q7CisKIC8qKgogICogVGhpcyBjbGFzcyBpcyB0byBtb25pdG9yIHRoZSBKTVggY29tcGF0YWJpbGl0eSBjcm9zcyBkaWZmZXJlbnQgdmVyc2lvbnMsIGFuZCByZWxpZXMgb24gYSBnb2xkIHNldCBvZiBtZXRyaWNzIHdoaWNoCiAgKiB3ZXJlIGdlbmVyYXRlZCBmb2xsb3dpbmcgdGhlIGluc3RydWN0aW9ucyBiZWxvdy4gIFRoZXNlIHRlc3RzIG9ubHkgY2hlY2sgZm9yIGJyZWFraW5nIGNoYW5nZXMsIHNvIHdpbGwgaWdub3JlIGFueQogICogbmV3IG1ldHJpY3MgYWRkZWQgaW4gYSByZWxlYXNlLiAgSWYgdGhlIGxhdGVzdCByZWxlYXNlIGlzIG5vdCBmaW5hbGl6ZWQgeWV0IHRoZW4gdGhlIGxhdGVzdCB2ZXJzaW9uIG1pZ2h0IGZhaWwKICAqIGlmIGEgdW5yZWxlc2VkIG1ldHJpYyBnZXRzIHJlbmFtZWQsIGlmIHRoaXMgaGFwcGVucyB0aGVuIHRoZSBnb2xkIHNldCBzaG91bGQgYmUgdXBkYXRlZCBmb3IgdGhlIGxhdGVzdCB2ZXJzaW9uLgotICoKKyAqIDxwPgogICogSWYgYSB0ZXN0IGZhaWxzIGZvciBhIHByZXZpb3VzIHZlcnNpb24sIHRoZW4gdGhpcyBtZWFucyB3ZSBoYXZlIGEgSk1YIGNvbXBhdGFiaWxpdHkgcmVncmVzc2lvbiwgaWYgdGhlIG1ldHJpYyBoYXMKICAqIGdvbmUgdGhyb3VnaCBwcm9wZXIgZGVwcmVjYXRpb24gdGhlbiB0aGUgbWV0cmljIGNhbiBiZSBleGNsdWRlZCB1c2luZyB0aGUgcGF0dGVybnMgdXNlZCBpbiBvdGhlciB0ZXN0cywgaWYgdGhlIG1ldHJpYwogICogaGFzIG5vdCBnb25lIHRocm91Z2ggcHJvcGVyIGRlcHJlY2F0aW9uIHRoZW4gdGhlIGNoYW5nZSBzaG91bGQgYmUgbG9va2VkIGF0IG1vcmUgY2FyZnVseSB0byBhdm9pZCBicmVha2luZyB1c2Vycy4KLSAqCisgKiA8cD4KICAqIEluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBkdW1wIGZvciBhbm90aGVyIHZlcnNpb24sIGxhdW5jaCBhIGNsdXN0ZXIgdGhlbiBydW4gdGhlIGZvbGxvd2luZwogICoge0Bjb2RlCiAgKiBjcmVhdGUga2V5c3BhY2UgY3FsX3Rlc3Rfa2V5c3BhY2UgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJzogJzEnfTsKQEAgLTY0LDYgKzY2LDkgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4U2l6ZUluS2lCKDApOyAvLyBtYWtlIHN1cmUgdGhlIGNvbHVtbiBpbmRleCBpcyBjcmVhdGVkCisKICAgICAgICAgc3RhcnRKTVhTZXJ2ZXIoKTsKICAgICB9CiAKQEAgLTkwLDcyICs5NSw4OSBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgZGlmZjMwKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVPYmplY3RzID0gQXJyYXlzLmFzTGlzdCgib3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPVRocmVhZFBvb2xzLioiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbnRlcm5hbDouKiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1Ecm9wcGVkTWVzc2FnZS4qIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUNsaWVudFJlcXVlc3Qsc2NvcGU9Q0FTUmVhZCxuYW1lPUNvbmRpdGlvbk5vdE1ldCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1DbGllbnQsbmFtZT1jb25uZWN0ZWRUaHJpZnRDbGllbnRzIiwgLy8gcmVtb3ZlZCBpbiBDQVNTQU5EUkEtMTExMTUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEucmVxdWVzdDp0eXBlPVJlYWRSZXBhaXJTdGFnZSIsIC8vIHJlbW92ZWQgaW4gQ0FTU0FORFJBLTEzOTEwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiOnR5cGU9SGludGVkSGFuZG9mZk1hbmFnZXIiLCAvLyByZW1vdmVkIGluIENBU1NBTkRSQS0xNTkzOQorICAgICAgICBMaXN0PFN0cmluZz4gZXhjbHVkZU9iamVjdHMgPSBuZXdBcnJheUxpc3QoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1UaHJlYWRQb29scy4qIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbnRlcm5hbDouKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPURyb3BwZWRNZXNzYWdlLioiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1DbGllbnRSZXF1ZXN0LHNjb3BlPUNBU1JlYWQsbmFtZT1Db25kaXRpb25Ob3RNZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1DbGllbnQsbmFtZT1jb25uZWN0ZWRUaHJpZnRDbGllbnRzIiwgLy8gcmVtb3ZlZCBpbiBDQVNTQU5EUkEtMTExMTUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5yZXF1ZXN0OnR5cGU9UmVhZFJlcGFpclN0YWdlIiwgLy8gcmVtb3ZlZCBpbiBDQVNTQU5EUkEtMTM5MTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjp0eXBlPUhpbnRlZEhhbmRvZmZNYW5hZ2VyIiwgLy8gcmVtb3ZlZCBpbiBDQVNTQU5EUkEtMTU5MzkKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyb3BwZWQgdGFibGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1UYWJsZSxrZXlzcGFjZT1zeXN0ZW0sc2NvcGU9KHNjaGVtYV9hZ2dyZWdhdGVzfHNjaGVtYV9jb2x1bW5mYW1pbGllc3xzY2hlbWFfY29sdW1uc3xzY2hlbWFfZnVuY3Rpb25zfHNjaGVtYV9rZXlzcGFjZXN8c2NoZW1hX3RyaWdnZXJzfHNjaGVtYV91c2VydHlwZXMpLG5hbWU9LioiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuKmtleXNwYWNlPXN5c3RlbSwoc2NvcGV8dGFibGV8Y29sdW1uZmFtaWx5KT12aWV3c19idWlsZHNfaW5fcHJvZ3Jlc3MuKiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4qa2V5c3BhY2U9c3lzdGVtLChzY29wZXx0YWJsZXxjb2x1bW5mYW1pbHkpPXJhbmdlX3hmZXJzLioiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuKmtleXNwYWNlPXN5c3RlbSwoc2NvcGV8dGFibGV8Y29sdW1uZmFtaWx5KT1oaW50cy4qIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiprZXlzcGFjZT1zeXN0ZW0sKHNjb3BlfHRhYmxlfGNvbHVtbmZhbWlseSk9YmF0Y2hsb2cuKiIpOwotICAgICAgICBMaXN0PFN0cmluZz4gZXhjbHVkZUF0dHJpYnV0ZXMgPSBBcnJheXMuYXNMaXN0KCJSUENTZXJ2ZXJSdW5uaW5nIiwgLy8gcmVtb3ZlZCBpbiBDQVNTQU5EUkEtMTExMTUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF4TmF0aXZlUHJvdG9jb2xWZXJzaW9uIik7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBleGNsdWRlT3BlcmF0aW9ucyA9IEFycmF5cy5hc0xpc3QoInN0YXJ0UlBDU2VydmVyIiwgInN0b3BSUENTZXJ2ZXIiLCAvLyByZW1vdmVkIGluIENBU1NBTkRSQS0xMTExNQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vZGV0b29sIGFwaXMgdGhhdCB3ZXJlIGNoYW5nZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlY29tbWlzc2lvbiIsIC8vIC0+IGRlY29tbWlzc2lvbihib29sZWFuKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3JjZVJlcGFpckFzeW5jIiwgLy8gLT4gcmVwYWlyQXN5bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yY2VSZXBhaXJSYW5nZUFzeW5jIiwgLy8gLT4gcmVwYWlyQXN5bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVnaW5Mb2NhbFNhbXBsaW5nIiwgLy8gLT4gYmVnaW5Mb2NhbFNhbXBsaW5nKHAxOiBqYXZhLmxhbmcuU3RyaW5nLCBwMjogaW50LCBwMzogaW50KTogdm9pZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaW5pc2hMb2NhbFNhbXBsaW5nIiAvLyAtPiBmaW5pc2hMb2NhbFNhbXBsaW5nKHAxOiBqYXZhLmxhbmcuU3RyaW5nLCBwMjogaW50KTogamF2YS51dGlsLkxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyb3BwZWQgdGFibGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPVRhYmxlLGtleXNwYWNlPXN5c3RlbSxzY29wZT0oc2NoZW1hX2FnZ3JlZ2F0ZXN8c2NoZW1hX2NvbHVtbmZhbWlsaWVzfHNjaGVtYV9jb2x1bW5zfHNjaGVtYV9mdW5jdGlvbnN8c2NoZW1hX2tleXNwYWNlc3xzY2hlbWFfdHJpZ2dlcnN8c2NoZW1hX3VzZXJ0eXBlcyksbmFtZT0uKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiprZXlzcGFjZT1zeXN0ZW0sKHNjb3BlfHRhYmxlfGNvbHVtbmZhbWlseSk9dmlld3NfYnVpbGRzX2luX3Byb2dyZXNzLioiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4qa2V5c3BhY2U9c3lzdGVtLChzY29wZXx0YWJsZXxjb2x1bW5mYW1pbHkpPXJhbmdlX3hmZXJzLioiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4qa2V5c3BhY2U9c3lzdGVtLChzY29wZXx0YWJsZXxjb2x1bW5mYW1pbHkpPWhpbnRzLioiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4qa2V5c3BhY2U9c3lzdGVtLChzY29wZXx0YWJsZXxjb2x1bW5mYW1pbHkpPWJhdGNobG9nLioiKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVBdHRyaWJ1dGVzID0gbmV3QXJyYXlMaXN0KCJSUENTZXJ2ZXJSdW5uaW5nIiwgLy8gcmVtb3ZlZCBpbiBDQVNTQU5EUkEtMTExMTUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXhOYXRpdmVQcm90b2NvbFZlcnNpb24iKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVPcGVyYXRpb25zID0gbmV3QXJyYXlMaXN0KCJzdGFydFJQQ1NlcnZlciIsICJzdG9wUlBDU2VydmVyIiwgLy8gcmVtb3ZlZCBpbiBDQVNTQU5EUkEtMTExMTUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vZGV0b29sIGFwaXMgdGhhdCB3ZXJlIGNoYW5nZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVjb21taXNzaW9uIiwgLy8gLT4gZGVjb21taXNzaW9uKGJvb2xlYW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yY2VSZXBhaXJBc3luYyIsIC8vIC0+IHJlcGFpckFzeW5jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yY2VSZXBhaXJSYW5nZUFzeW5jIiwgLy8gLT4gcmVwYWlyQXN5bmMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWdpbkxvY2FsU2FtcGxpbmciLCAvLyAtPiBiZWdpbkxvY2FsU2FtcGxpbmcocDE6IGphdmEubGFuZy5TdHJpbmcsIHAyOiBpbnQsIHAzOiBpbnQpOiB2b2lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmluaXNoTG9jYWxTYW1wbGluZyIgLy8gLT4gZmluaXNoTG9jYWxTYW1wbGluZyhwMTogamF2YS5sYW5nLlN0cmluZywgcDI6IGludCk6IGphdmEudXRpbC5MaXN0CiAgICAgICAgICk7CiAKKyAgICAgICAgaWYgKEJ0aUZvcm1hdC5pc1NlbGVjdGVkKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4Y2x1ZGVPYmplY3RzLmFkZCgib3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPShDb2x1bW5GYW1pbHl8S2V5c3BhY2V8VGFibGUpLiosbmFtZT1JbmRleFN1bW1hcnkuKiIpOyAvLyAtPiB3aGVuIEJUSSBmb3JtYXQgaXMgdXNlZCwgaW5kZXggc3VtbWFyeSBpcyBub3QgdXNlZCAoQ0FTU0FORFJBLTE3MDU2KQorICAgICAgICB9CisKICAgICAgICAgZGlmZihleGNsdWRlT2JqZWN0cywgZXhjbHVkZUF0dHJpYnV0ZXMsIGV4Y2x1ZGVPcGVyYXRpb25zLCAidGVzdC9kYXRhL2pteGR1bXAvY2Fzc2FuZHJhLTMuMC1qbXgueWFtbCIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgZGlmZjMxMSgpIHRocm93cyBUaHJvd2FibGUKICAgICB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBleGNsdWRlT2JqZWN0cyA9IEFycmF5cy5hc0xpc3QoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1UaHJlYWRQb29scy4qIiwgLy9sYXp5IGluaXRpYWxpemF0aW9uIGluIDQuMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbnRlcm5hbDouKiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1Ecm9wcGVkTWVzc2FnZSxzY29wZT1QQUdFRF9SQU5HRS4qIiwgLy9pdCB3YXMgZGVwcmVjYXRlZCBpbiB0aGUgcHJldmlvdXMgbWFqb3IgdmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9Q2xpZW50LG5hbWU9Y29ubmVjdGVkVGhyaWZ0Q2xpZW50cyIsIC8vIHJlbW92ZWQgaW4gQ0FTU0FORFJBLTExMTE1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnJlcXVlc3Q6dHlwZT1SZWFkUmVwYWlyU3RhZ2UiLCAvLyByZW1vdmVkIGluIENBU1NBTkRSQS0xMzkxMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjp0eXBlPUhpbnRlZEhhbmRvZmZNYW5hZ2VyIiwgLy8gcmVtb3ZlZCBpbiBDQVNTQU5EUkEtMTU5MzkKKyAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVPYmplY3RzID0gbmV3QXJyYXlMaXN0KCJvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9VGhyZWFkUG9vbHMuKiIsIC8vbGF6eSBpbml0aWFsaXphdGlvbiBpbiA0LjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbnRlcm5hbDouKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPURyb3BwZWRNZXNzYWdlLHNjb3BlPVBBR0VEX1JBTkdFLioiLCAvL2l0IHdhcyBkZXByZWNhdGVkIGluIHRoZSBwcmV2aW91cyBtYWpvciB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUNsaWVudCxuYW1lPWNvbm5lY3RlZFRocmlmdENsaWVudHMiLCAvLyByZW1vdmVkIGluIENBU1NBTkRSQS0xMTExNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnJlcXVlc3Q6dHlwZT1SZWFkUmVwYWlyU3RhZ2UiLCAvLyByZW1vdmVkIGluIENBU1NBTkRSQS0xMzkxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiOnR5cGU9SGludGVkSGFuZG9mZk1hbmFnZXIiLCAvLyByZW1vdmVkIGluIENBU1NBTkRSQS0xNTkzOQogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJvcHBlZCB0YWJsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPVRhYmxlLGtleXNwYWNlPXN5c3RlbSxzY29wZT0oc2NoZW1hX2FnZ3JlZ2F0ZXN8c2NoZW1hX2NvbHVtbmZhbWlsaWVzfHNjaGVtYV9jb2x1bW5zfHNjaGVtYV9mdW5jdGlvbnN8c2NoZW1hX2tleXNwYWNlc3xzY2hlbWFfdHJpZ2dlcnN8c2NoZW1hX3VzZXJ0eXBlcyksbmFtZT0uKiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4qa2V5c3BhY2U9c3lzdGVtLChzY29wZXx0YWJsZXxjb2x1bW5mYW1pbHkpPXZpZXdzX2J1aWxkc19pbl9wcm9ncmVzcy4qIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiprZXlzcGFjZT1zeXN0ZW0sKHNjb3BlfHRhYmxlfGNvbHVtbmZhbWlseSk9cmFuZ2VfeGZlcnMuKiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4qa2V5c3BhY2U9c3lzdGVtLChzY29wZXx0YWJsZXxjb2x1bW5mYW1pbHkpPWhpbnRzLioiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuKmtleXNwYWNlPXN5c3RlbSwoc2NvcGV8dGFibGV8Y29sdW1uZmFtaWx5KT1iYXRjaGxvZy4qIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJvcHBlZCB0YWJsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9VGFibGUsa2V5c3BhY2U9c3lzdGVtLHNjb3BlPShzY2hlbWFfYWdncmVnYXRlc3xzY2hlbWFfY29sdW1uZmFtaWxpZXN8c2NoZW1hX2NvbHVtbnN8c2NoZW1hX2Z1bmN0aW9uc3xzY2hlbWFfa2V5c3BhY2VzfHNjaGVtYV90cmlnZ2Vyc3xzY2hlbWFfdXNlcnR5cGVzKSxuYW1lPS4qIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuKmtleXNwYWNlPXN5c3RlbSwoc2NvcGV8dGFibGV8Y29sdW1uZmFtaWx5KT12aWV3c19idWlsZHNfaW5fcHJvZ3Jlc3MuKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiprZXlzcGFjZT1zeXN0ZW0sKHNjb3BlfHRhYmxlfGNvbHVtbmZhbWlseSk9cmFuZ2VfeGZlcnMuKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiprZXlzcGFjZT1zeXN0ZW0sKHNjb3BlfHRhYmxlfGNvbHVtbmZhbWlseSk9aGludHMuKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiprZXlzcGFjZT1zeXN0ZW0sKHNjb3BlfHRhYmxlfGNvbHVtbmZhbWlseSk9YmF0Y2hsb2cuKiIKICAgICAgICAgKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVBdHRyaWJ1dGVzID0gQXJyYXlzLmFzTGlzdCgiUlBDU2VydmVyUnVubmluZyIsIC8vIHJlbW92ZWQgaW4gQ0FTU0FORFJBLTExMTE1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1heE5hdGl2ZVByb3RvY29sVmVyc2lvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0cmVhbWluZ1NvY2tldFRpbWVvdXQiKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVPcGVyYXRpb25zID0gQXJyYXlzLmFzTGlzdCgic3RhcnRSUENTZXJ2ZXIiLCAic3RvcFJQQ1NlcnZlciIsIC8vIHJlbW92ZWQgaW4gQ0FTU0FORFJBLTExMTE1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9kZXRvb2wgYXBpcyB0aGF0IHdlcmUgY2hhbmdlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVjb21taXNzaW9uIiwgLy8gLT4gZGVjb21taXNzaW9uKGJvb2xlYW4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvcmNlUmVwYWlyQXN5bmMiLCAvLyAtPiByZXBhaXJBc3luYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3JjZVJlcGFpclJhbmdlQXN5bmMiLCAvLyAtPiByZXBhaXJBc3luYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWdpbkxvY2FsU2FtcGxpbmciLCAvLyAtPiBiZWdpbkxvY2FsU2FtcGxpbmcocDE6IGphdmEubGFuZy5TdHJpbmcsIHAyOiBpbnQsIHAzOiBpbnQpOiB2b2lkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbmlzaExvY2FsU2FtcGxpbmciIC8vIC0+IGZpbmlzaExvY2FsU2FtcGxpbmcocDE6IGphdmEubGFuZy5TdHJpbmcsIHAyOiBpbnQpOiBqYXZhLnV0aWwuTGlzdAorICAgICAgICBMaXN0PFN0cmluZz4gZXhjbHVkZUF0dHJpYnV0ZXMgPSBuZXdBcnJheUxpc3QoIlJQQ1NlcnZlclJ1bm5pbmciLCAvLyByZW1vdmVkIGluIENBU1NBTkRSQS0xMTExNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1heE5hdGl2ZVByb3RvY29sVmVyc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RyZWFtaW5nU29ja2V0VGltZW91dCIpOworICAgICAgICBMaXN0PFN0cmluZz4gZXhjbHVkZU9wZXJhdGlvbnMgPSBuZXdBcnJheUxpc3QoInN0YXJ0UlBDU2VydmVyIiwgInN0b3BSUENTZXJ2ZXIiLCAvLyByZW1vdmVkIGluIENBU1NBTkRSQS0xMTExNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9kZXRvb2wgYXBpcyB0aGF0IHdlcmUgY2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWNvbW1pc3Npb24iLCAvLyAtPiBkZWNvbW1pc3Npb24oYm9vbGVhbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3JjZVJlcGFpckFzeW5jIiwgLy8gLT4gcmVwYWlyQXN5bmMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3JjZVJlcGFpclJhbmdlQXN5bmMiLCAvLyAtPiByZXBhaXJBc3luYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlZ2luTG9jYWxTYW1wbGluZyIsIC8vIC0+IGJlZ2luTG9jYWxTYW1wbGluZyhwMTogamF2YS5sYW5nLlN0cmluZywgcDI6IGludCwgcDM6IGludCk6IHZvaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaW5pc2hMb2NhbFNhbXBsaW5nIiAvLyAtPiBmaW5pc2hMb2NhbFNhbXBsaW5nKHAxOiBqYXZhLmxhbmcuU3RyaW5nLCBwMjogaW50KTogamF2YS51dGlsLkxpc3QKICAgICAgICAgKTsKIAorICAgICAgICBpZiAoQnRpRm9ybWF0LmlzU2VsZWN0ZWQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgZXhjbHVkZU9iamVjdHMuYWRkKCJvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9KENvbHVtbkZhbWlseXxLZXlzcGFjZXxUYWJsZSkuKixuYW1lPUluZGV4U3VtbWFyeS4qIik7IC8vIC0+IHdoZW4gQlRJIGZvcm1hdCBpcyB1c2VkLCBpbmRleCBzdW1tYXJ5IGlzIG5vdCB1c2VkIChDQVNTQU5EUkEtMTcwNTYpCisgICAgICAgICAgICBleGNsdWRlT2JqZWN0cy5hZGQoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1JbmRleCxzY29wZT1Sb3dJbmRleEVudHJ5LioiKTsKKyAgICAgICAgfQorCiAgICAgICAgIGRpZmYoZXhjbHVkZU9iamVjdHMsIGV4Y2x1ZGVBdHRyaWJ1dGVzLCBleGNsdWRlT3BlcmF0aW9ucywgInRlc3QvZGF0YS9qbXhkdW1wL2Nhc3NhbmRyYS0zLjExLWpteC55YW1sIik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBkaWZmNDAoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewotICAgICAgICBMaXN0PFN0cmluZz4gZXhjbHVkZU9iamVjdHMgPSBBcnJheXMuYXNMaXN0KCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBleGNsdWRlQXR0cmlidXRlcyA9IEFycmF5cy5hc0xpc3QoKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVPcGVyYXRpb25zID0gQXJyYXlzLmFzTGlzdCgpOworICAgICAgICBMaXN0PFN0cmluZz4gZXhjbHVkZU9iamVjdHMgPSBuZXdBcnJheUxpc3QoKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVBdHRyaWJ1dGVzID0gbmV3QXJyYXlMaXN0KCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBleGNsdWRlT3BlcmF0aW9ucyA9IG5ld0FycmF5TGlzdCgpOworCisgICAgICAgIGlmIChCdGlGb3JtYXQuaXNTZWxlY3RlZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBleGNsdWRlT2JqZWN0cy5hZGQoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT0oQ29sdW1uRmFtaWx5fEtleXNwYWNlfFRhYmxlKS4qLG5hbWU9SW5kZXhTdW1tYXJ5LioiKTsgLy8gLT4gd2hlbiBCVEkgZm9ybWF0IGlzIHVzZWQsIGluZGV4IHN1bW1hcnkgaXMgbm90IHVzZWQgKENBU1NBTkRSQS0xNzA1NikKKyAgICAgICAgICAgIGV4Y2x1ZGVPYmplY3RzLmFkZCgib3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUluZGV4LHNjb3BlPVJvd0luZGV4RW50cnkuKiIpOworICAgICAgICB9CiAKICAgICAgICAgZGlmZihleGNsdWRlT2JqZWN0cywgZXhjbHVkZUF0dHJpYnV0ZXMsIGV4Y2x1ZGVPcGVyYXRpb25zLCAidGVzdC9kYXRhL2pteGR1bXAvY2Fzc2FuZHJhLTQuMC1qbXgueWFtbCIpOwogICAgIH0KQEAgLTE2Myw5ICsxODUsMTUgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIGRpZmY0MSgpIHRocm93cyBUaHJvd2FibGUKICAgICB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBleGNsdWRlT2JqZWN0cyA9IEFycmF5cy5hc0xpc3QoKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVBdHRyaWJ1dGVzID0gQXJyYXlzLmFzTGlzdCgpOwotICAgICAgICBMaXN0PFN0cmluZz4gZXhjbHVkZU9wZXJhdGlvbnMgPSBBcnJheXMuYXNMaXN0KCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBleGNsdWRlT2JqZWN0cyA9IG5ld0FycmF5TGlzdCgpOworICAgICAgICBMaXN0PFN0cmluZz4gZXhjbHVkZUF0dHJpYnV0ZXMgPSBuZXdBcnJheUxpc3QoKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVPcGVyYXRpb25zID0gbmV3QXJyYXlMaXN0KCk7CisKKyAgICAgICAgaWYgKEJ0aUZvcm1hdC5pc1NlbGVjdGVkKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4Y2x1ZGVPYmplY3RzLmFkZCgib3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPShDb2x1bW5GYW1pbHl8S2V5c3BhY2V8VGFibGUpLiosbmFtZT1JbmRleFN1bW1hcnkuKiIpOyAvLyAtPiB3aGVuIEJUSSBmb3JtYXQgaXMgdXNlZCwgaW5kZXggc3VtbWFyeSBpcyBub3QgdXNlZCAoQ0FTU0FORFJBLTE3MDU2KQorICAgICAgICAgICAgZXhjbHVkZU9iamVjdHMuYWRkKCJvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9SW5kZXgsc2NvcGU9Um93SW5kZXhFbnRyeS4qIik7CisgICAgICAgIH0KIAogICAgICAgICBkaWZmKGV4Y2x1ZGVPYmplY3RzLCBleGNsdWRlQXR0cmlidXRlcywgZXhjbHVkZU9wZXJhdGlvbnMsICJ0ZXN0L2RhdGEvam14ZHVtcC9jYXNzYW5kcmEtNC4xLWpteC55YW1sIik7CiAgICAgfQpAQCAtMTc0LDEwICsyMDIsMTAgQEAKICAgICB7CiAgICAgICAgIHNldHVwU3RhbmRhcmRUYWJsZXMoKTsKIAotICAgICAgICBMaXN0PFN0cmluZz4gYXJncyA9IExpc3RzLm5ld0FycmF5TGlzdCgidG9vbHMvYmluL2pteHRvb2wiLCAiZGlmZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItZiIsICJ5YW1sIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0taWdub3JlLW1pc3Npbmctb24tbGVmdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsLCBUTVAuZ2V0Um9vdCgpLmdldEFic29sdXRlUGF0aCgpICsgIi9vdXQueWFtbCIpOworICAgICAgICBMaXN0PFN0cmluZz4gYXJncyA9IG5ld0FycmF5TGlzdCgidG9vbHMvYmluL2pteHRvb2wiLCAiZGlmZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItZiIsICJ5YW1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0taWdub3JlLW1pc3Npbmctb24tbGVmdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsLCBUTVAuZ2V0Um9vdCgpLmdldEFic29sdXRlUGF0aCgpICsgIi9vdXQueWFtbCIpOwogICAgICAgICBleGNsdWRlT2JqZWN0cy5mb3JFYWNoKGEgLT4gewogICAgICAgICAgICAgYXJncy5hZGQoIi0tZXhjbHVkZS1vYmplY3QiKTsKICAgICAgICAgICAgIGFyZ3MuYWRkKGEpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL05vZGVQcm9iZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9Ob2RlUHJvYmVUZXN0LmphdmEKaW5kZXggMjI1NTRlNi4uMjk0N2EyNiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL05vZGVQcm9iZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvTm9kZVByb2JlVGVzdC5qYXZhCkBAIC0zNyw2ICszNyw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKKyAgICAgICAgcmVxdWlyZU5ldHdvcmsoKTsKICAgICAgICAgc3RhcnRKTVhTZXJ2ZXIoKTsKICAgICAgICAgcHJvYmUgPSBuZXcgTm9kZVByb2JlKGpteEhvc3QsIGpteFBvcnQpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9PZmZsaW5lVG9vbFV0aWxzLmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvT2ZmbGluZVRvb2xVdGlscy5qYXZhCmluZGV4IDNiYjI4MjUuLjlhNWFlOGUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9PZmZsaW5lVG9vbFV0aWxzLmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL09mZmxpbmVUb29sVXRpbHMuamF2YQpAQCAtMzAsNyArMzAsMTIgQEAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbVN1cHBvcnQ7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CkBAIC03Miw5ICs3NywxNSBAQAogICAgICJwcm9jZXNzIHJlYXBlciIsICAvLyBzcGF3bmVkIGJ5IHRoZSBqdm0gd2hlbiBleGVjdXRpbmcgZXh0ZXJuYWwgcHJvY2Vzc2VzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBtYXkgc3RpbGwgYmUgYWN0aXZlIHdoZW4gd2UgY2hlY2sKICAgICAiQXR0YWNoIExpc3RlbmVyIiwgLy8gc3Bhd25lZCBpbiBpbnRlbGxpaiBJREVBCisgICAgIkpOQSBDbGVhbmVyIiwgICAgIC8vIHNwYXduZWQgYnkgSk5BCiAgICAgfTsKIAotICAgIHB1YmxpYyB2b2lkIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKFN0cmluZ1tdIG9wdGlvbmFsVGhyZWFkTmFtZXMpCisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE5PTl9ERUZBVUxUX01FTVRBQkxFX1RIUkVBRFMgPQorICAgIHsKKyAgICAiKChOYXRpdmV8U2xhYnxIZWFwKVBvb2x8TG9nZ2VkKUNsZWFuZXIiCisgICAgfTsKKworICAgIHB1YmxpYyB2b2lkIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKFN0cmluZ1tdIG9wdGlvbmFsVGhyZWFkTmFtZXMsIGJvb2xlYW4gYWxsb3dOb25EZWZhdWx0TWVtdGFibGVUaHJlYWRzKQogICAgIHsKICAgICAgICAgVGhyZWFkTVhCZWFuIHRocmVhZHMgPSBNYW5hZ2VtZW50RmFjdG9yeS5nZXRUaHJlYWRNWEJlYW4oKTsKIApAQCAtODcsMTAgKzk4LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKE9iamVjdHM6Om5vbk51bGwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKFRocmVhZEluZm86OmdldFRocmVhZE5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworICAgICAgICBJdGVyYWJsZTxTdHJpbmc+IG9wdGlvbmFsTmFtZXMgPSBvcHRpb25hbFRocmVhZE5hbWVzICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBcnJheXMuYXNMaXN0KG9wdGlvbmFsVGhyZWFkTmFtZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIGlmIChhbGxvd05vbkRlZmF1bHRNZW10YWJsZVRocmVhZHMgJiYgRGF0YWJhc2VEZXNjcmlwdG9yLmdldE1lbXRhYmxlQ29uZmlndXJhdGlvbnMoKS5jb250YWluc0tleSgiZGVmYXVsdCIpKQorICAgICAgICAgICAgb3B0aW9uYWxOYW1lcyA9IEl0ZXJhYmxlcy5jb25jYXQob3B0aW9uYWxOYW1lcywgQXJyYXlzLmFzTGlzdChOT05fREVGQVVMVF9NRU1UQUJMRV9USFJFQURTKSk7CiAKLSAgICAgICAgTGlzdDxQYXR0ZXJuPiBvcHRpb25hbCA9IG9wdGlvbmFsVGhyZWFkTmFtZXMgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBcnJheXMuc3RyZWFtKG9wdGlvbmFsVGhyZWFkTmFtZXMpLm1hcChQYXR0ZXJuOjpjb21waWxlKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICBMaXN0PFBhdHRlcm4+IG9wdGlvbmFsID0gU3RyZWFtU3VwcG9ydC5zdHJlYW0ob3B0aW9uYWxOYW1lcy5zcGxpdGVyYXRvcigpLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKFBhdHRlcm46OmNvbXBpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CiAKICAgICAgICAgY3VycmVudC5yZW1vdmVBbGwoaW5pdGlhbCk7CiAKQEAgLTE4MCw3ICsxOTYsNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cFRlc3RlcigpCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5wYXJ0aXRpb25lciIsICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTXVybXVyM1BhcnRpdGlvbmVyIik7CisgICAgICAgIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5QQVJUSVRJT05FUi5zZXRTdHJpbmcoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5NdXJtdXIzUGFydGl0aW9uZXIiKTsKIAogICAgICAgICAvLyBtYXkgc3RhcnQgYW4gYXN5bmMgYXBwZW5kZXIKICAgICAgICAgTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoT2ZmbGluZVRvb2xVdGlscy5jbGFzcyk7CkBAIC0yMTksNyArMjM1LDcgQEAKICAgICAKICAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRDb3JyZWN0RW52UG9zdFRlc3QoKQogICAgIHsKLSAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQoT1BUSU9OQUxfVEhSRUFEU19XSVRIX1NDSEVNQSk7CisgICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKE9QVElPTkFMX1RIUkVBRFNfV0lUSF9TQ0hFTUEsIHRydWUpOwogICAgICAgICBhc3NlcnRTY2hlbWFMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0U2VydmVyTm90TG9hZGVkKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVFeHBpcmVkQmxvY2tlcnNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZUV4cGlyZWRCbG9ja2Vyc1Rlc3QuamF2YQppbmRleCBlNzY3NjllLi4xMGIzZjVkIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZUV4cGlyZWRCbG9ja2Vyc1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZUV4cGlyZWRCbG9ja2Vyc1Rlc3QuamF2YQpAQCAtMzcsNyArMzcsNyBAQAogICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmlzRW1wdHkoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRvb2wuZ2V0RXhpdENvZGUoKSk7CiAKLSAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQobnVsbCk7CisgICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKG51bGwsIGZhbHNlKTsKICAgICAgICAgYXNzZXJ0U2NoZW1hTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydENMU01Ob3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0U3lzdGVtS1NOb3RMb2FkZWQoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlRXhwb3J0U2NoZW1hTG9hZGluZ1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlRXhwb3J0U2NoZW1hTG9hZGluZ1Rlc3QuamF2YQppbmRleCAxNTMwYTJlLi5iNzEzMTQ0IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZUV4cG9ydFNjaGVtYUxvYWRpbmdUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVFeHBvcnRTY2hlbWFMb2FkaW5nVGVzdC5qYXZhCkBAIC0yOCw2ICsyOCw3IEBACiBpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmUudHlwZS5UeXBlUmVmZXJlbmNlOwogaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CiBpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLmV4Yy5NaXNtYXRjaGVkSW5wdXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSnNvblV0aWxzOwogaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5zdGFydHNXaXRoOwpAQCAtNDQsNyArNDUsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgU1NUYWJsZUV4cG9ydFNjaGVtYUxvYWRpbmdUZXN0IGV4dGVuZHMgT2ZmbGluZVRvb2xVdGlscwogewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0TWFwcGVyIG1hcHBlciA9IEpzb25VdGlscy5KU09OX09CSkVDVF9NQVBQRVI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHlwZVJlZmVyZW5jZTxMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+PiBqYWNrc29uTGlzdE9mTWFwc1R5cGUgPSBuZXcgVHlwZVJlZmVyZW5jZTxMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+PigpIHt9OwogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzc3RhYmxlOwogCkBAIC0xODIsNyArMTgzLDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UG9zdFRlc3RFbnYoKQogICAgIHsKLSAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQoT1BUSU9OQUxfVEhSRUFEU19XSVRIX1NDSEVNQSk7CisgICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKE9QVElPTkFMX1RIUkVBRFNfV0lUSF9TQ0hFTUEsIHRydWUpOwogICAgICAgICBhc3NlcnRDTFNNTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydFN5c3RlbUtTTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydEtleXNwYWNlTm90TG9hZGVkKCk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZUV4cG9ydFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlRXhwb3J0VGVzdC5qYXZhCmluZGV4IGE1YjcwYTIuLjNhNGVhZDQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlRXhwb3J0VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlRXhwb3J0VGVzdC5qYXZhCkBAIC0xMDgsNyArMTA4LDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UG9zdFRlc3RFbnYoKQogICAgIHsKLSAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQoT1BUSU9OQUxfVEhSRUFEU19XSVRIX1NDSEVNQSk7CisgICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKE9QVElPTkFMX1RIUkVBRFNfV0lUSF9TQ0hFTUEsIGZhbHNlKTsKICAgICAgICAgYXNzZXJ0U2NoZW1hTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydENMU01Ob3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0U3lzdGVtS1NOb3RMb2FkZWQoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlTGV2ZWxSZXNldHRlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlTGV2ZWxSZXNldHRlclRlc3QuamF2YQppbmRleCBlNmQ3YWRjLi4wZDYwOWQzIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZUxldmVsUmVzZXR0ZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVMZXZlbFJlc2V0dGVyVGVzdC5qYXZhCkBAIC0zNiw3ICszNiw3IEBACiAgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSwgQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nSWdub3JpbmdDYXNlKCJ1c2FnZToiKSk7CiAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldENsZWFuZWRTdGRlcnIoKSkuaXNFbXB0eSgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdG9vbC5nZXRFeGl0Q29kZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQobnVsbCk7CisgICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKG51bGwsIGZhbHNlKTsKICAgICAgICAgYXNzZXJ0U2NoZW1hTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydENMU01Ob3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0U3lzdGVtS1NOb3RMb2FkZWQoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlTWV0YWRhdGFWaWV3ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZU1ldGFkYXRhVmlld2VyVGVzdC5qYXZhCmluZGV4IDQ5OThiNmUuLjY3MjhmZGYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlTWV0YWRhdGFWaWV3ZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVNZXRhZGF0YVZpZXdlclRlc3QuamF2YQpAQCAtNTUsNyArNTUsNyBAQAogICAgICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldENsZWFuZWRTdGRlcnIoKSwgQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nSWdub3JpbmdDYXNlKCJPcHRpb25zOiIpKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCB0b29sLmdldEV4aXRDb2RlKCkpOwogICAgICAgICB9Ci0gICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKG51bGwpOworICAgICAgICBhc3NlcnROb1VuZXhwZWN0ZWRUaHJlYWRzU3RhcnRlZChudWxsLCBmYWxzZSk7CiAgICAgICAgIGFzc2VydFNjaGVtYU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRDTFNNTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydFN5c3RlbUtTTm90TG9hZGVkKCk7CkBAIC0xMDgsNyArMTA4LDcgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZSh0b29sLmdldFN0ZG91dCgpLCBDaGFyTWF0Y2hlci5hc2NpaSgpLm1hdGNoZXNBbGxPZih0b29sLmdldFN0ZG91dCgpKSk7CiAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5kb2VzTm90Q29udGFpbigiV2lkZXN0IFBhcnRpdGlvbnMiKTsKICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKHNzdGFibGUucmVwbGFjZUFsbCgiLURhdGFcXC5kYiQiLCAiIikpOwotICAgICAgICBhc3NlcnRUcnVlKHRvb2wuZ2V0U3RkZXJyKCksIHRvb2wuZ2V0U3RkZXJyKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0b29sLmdldENsZWFuZWRTdGRlcnIoKSwgdG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkuaXNFbXB0eSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHRvb2wuZ2V0RXhpdENvZGUoKSk7CiAgICAgICAgIGFzc2VydEdvb2RFbnZQb3N0VGVzdCgpOwogICAgIH0KQEAgLTEyMyw3ICsxMjMsNyBAQAogICAgICAgICAgICAgICAgICAgVG9vbFJlc3VsdCB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VDbGFzcyhTU1RhYmxlTWV0YWRhdGFWaWV3ZXIuY2xhc3MsIGFyZywgc3N0YWJsZSk7CiAgICAgICAgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoVXRpbC5CTFVFKTsKICAgICAgICAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucyhzc3RhYmxlLnJlcGxhY2VBbGwoIi1EYXRhXFwuZGIkIiwgIiIpKTsKLSAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkFyZzogWyIgKyBhcmcgKyAiXVxuIiArIHRvb2wuZ2V0U3RkZXJyKCksIHRvb2wuZ2V0U3RkZXJyKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkFyZzogWyIgKyBhcmcgKyAiXVxuIiArIHRvb2wuZ2V0Q2xlYW5lZFN0ZGVycigpLCB0b29sLmdldENsZWFuZWRTdGRlcnIoKS5pc0VtcHR5KCkpOwogICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHRvb2wuZ2V0RXhpdENvZGUoKSk7CiAgICAgICAgICAgICAgICAgICBhc3NlcnRHb29kRW52UG9zdFRlc3QoKTsKICAgICAgICAgICAgICAgfSk7CkBAIC0xMzksNyArMTM5LDcgQEAKICAgICAgICAgICAgICAgICAgIFRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlQ2xhc3MoU1NUYWJsZU1ldGFkYXRhVmlld2VyLmNsYXNzLCBhcmcsIHNzdGFibGUpOwogICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0b29sLmdldFN0ZG91dCgpLCAhQ2hhck1hdGNoZXIuYXNjaWkoKS5tYXRjaGVzQWxsT2YodG9vbC5nZXRTdGRvdXQoKSkpOwogICAgICAgICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKHNzdGFibGUucmVwbGFjZUFsbCgiLURhdGFcXC5kYiQiLCAiIikpOwotICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQXJnOiBbIiArIGFyZyArICJdXG4iICsgdG9vbC5nZXRTdGRlcnIoKSwgdG9vbC5nZXRTdGRlcnIoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQXJnOiBbIiArIGFyZyArICJdXG4iICsgdG9vbC5nZXRDbGVhbmVkU3RkZXJyKCksIHRvb2wuZ2V0Q2xlYW5lZFN0ZGVycigpLmlzRW1wdHkoKSk7CiAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdG9vbC5nZXRFeGl0Q29kZSgpKTsKICAgICAgICAgICAgICAgICAgIGFzc2VydEdvb2RFbnZQb3N0VGVzdCgpOwogICAgICAgICAgICAgICB9KTsKQEAgLTIxMSwxNCArMjExLDE0IEBACiAgICAgICAgICAgICAgICAgICBUb29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZUNsYXNzKFNTVGFibGVNZXRhZGF0YVZpZXdlci5jbGFzcywgYXJnLCBzc3RhYmxlKTsKICAgICAgICAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiV2lkZXN0IFBhcnRpdGlvbnMiKTsKICAgICAgICAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucyhzc3RhYmxlLnJlcGxhY2VBbGwoIi1EYXRhXFwuZGIkIiwgIiIpKTsKLSAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkFyZzogWyIgKyBhcmcgKyAiXVxuIiArIHRvb2wuZ2V0U3RkZXJyKCksIHRvb2wuZ2V0U3RkZXJyKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkFyZzogWyIgKyBhcmcgKyAiXVxuIiArIHRvb2wuZ2V0Q2xlYW5lZFN0ZGVycigpLCB0b29sLmdldENsZWFuZWRTdGRlcnIoKS5pc0VtcHR5KCkpOwogICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHRvb2wuZ2V0RXhpdENvZGUoKSk7CiAgICAgICAgICAgICAgIH0pOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRHb29kRW52UG9zdFRlc3QoKQogICAgIHsKLSAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQoT1BUSU9OQUxfVEhSRUFEU19XSVRIX1NDSEVNQSk7CisgICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKE9QVElPTkFMX1RIUkVBRFNfV0lUSF9TQ0hFTUEsIGZhbHNlKTsKICAgICAgICAgYXNzZXJ0U2NoZW1hTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydENMU01Ob3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0U3lzdGVtS1NOb3RMb2FkZWQoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlT2ZmbGluZVJlbGV2ZWxUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZU9mZmxpbmVSZWxldmVsVGVzdC5qYXZhCmluZGV4IDNmNDMxNGMuLjE1ZjYyOTcgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlT2ZmbGluZVJlbGV2ZWxUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVPZmZsaW5lUmVsZXZlbFRlc3QuamF2YQpAQCAtMzYsNyArMzYsNyBAQAogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCksIENvcmVNYXRjaGVycy5jb250YWluc1N0cmluZ0lnbm9yaW5nQ2FzZSgidXNhZ2U6IikpOwogICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmlzRW1wdHkoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRvb2wuZ2V0RXhpdENvZGUoKSk7Ci0gICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKG51bGwpOworICAgICAgICBhc3NlcnROb1VuZXhwZWN0ZWRUaHJlYWRzU3RhcnRlZChudWxsLCBmYWxzZSk7CiAgICAgICAgIGFzc2VydFNjaGVtYU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRDTFNNTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydFN5c3RlbUtTTm90TG9hZGVkKCk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZVBhcnRpdGlvbnNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZVBhcnRpdGlvbnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ3ZmE4YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlUGFydGl0aW9uc1Rlc3QuamF2YQpAQCAtMCwwICsxLDY1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29sczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlRvb2xSdW5uZXIuVG9vbFJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKK2ltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5BYnN0cmFjdFN0cmluZ0Fzc2VydDsKK2ltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworCisvKioKKyAqIFRlc3RzIGZvciB7QGxpbmsgU1NUYWJsZVBhcnRpdGlvbnN9LgorICovCitwdWJsaWMgY2xhc3MgU1NUYWJsZVBhcnRpdGlvbnNUZXN0IGV4dGVuZHMgT2ZmbGluZVRvb2xVdGlscworeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTU1RBQkxFXzEgPSBzc3RhYmxlKCJsZWdhY3lfbWFfc2ltcGxlIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNTVEFCTEVfMiA9IHNzdGFibGUoImxlZ2FjeV9tYV9jbHVzdCIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfMSA9ICJcblByb2Nlc3NpbmcgICMxIChiaWctbWEpICgwLjE2OSBLaUIgdW5jb21wcmVzc2VkLCAwLjA4NiBLaUIgb24gZGlzaylcbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl8yID0gIlxuUHJvY2Vzc2luZyAgIzEgKGJpZy1tYSkgKDMyOC4xNDUgS2lCIHVuY29tcHJlc3NlZCwgNS4wOTYgS2lCIG9uIGRpc2spXG4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQUNLVVBTX0hFQURFUl8xID0gIlxuUHJvY2Vzc2luZyBCYWNrdXA6YmFja3VwcyAgIzEgKGJpZy1tYSkgKDAuMTY5IEtpQiB1bmNvbXByZXNzZWQsIDAuMDg2IEtpQiBvbiBkaXNrKVxuIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS1VQU19IRUFERVJfMiA9ICJcblByb2Nlc3NpbmcgQmFja3VwOmJhY2t1cHMgICMxIChiaWctbWEpICgzMjguMTQ1IEtpQiB1bmNvbXByZXNzZWQsIDUuMDk2IEtpQiBvbiBkaXNrKVxuIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU05BUFNIT1RTX0hFQURFUl8xID0gIlxuUHJvY2Vzc2luZyBTbmFwc2hvdDpzbmFwc2hvdC0xICAjMSAoYmlnLW1hKSAoMC4xNjkgS2lCIHVuY29tcHJlc3NlZCwgMC4wODYgS2lCIG9uIGRpc2spXG4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTkFQU0hPVFNfSEVBREVSXzIgPSAiXG5Qcm9jZXNzaW5nIFNuYXBzaG90OnNuYXBzaG90LTEgICMxIChiaWctbWEpICgzMjguMTQ1IEtpQiB1bmNvbXByZXNzZWQsIDUuMDk2IEtpQiBvbiBkaXNrKVxuIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VNTUFSWV8xID0gIiAgICAgICAgICAgICAgIFBhcnRpdGlvbiBzaXplICAgICAgICAgICAgUm93IGNvdW50ICAgICAgICAgICBDZWxsIGNvdW50ICAgICAgVG9tYnN0b25lIGNvdW50XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfnA1MCAgICAgICAgICAgICAgMC4wMzQgS2lCICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAwXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfnA3NSAgICAgICAgICAgICAgMC4wMzQgS2lCICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAwXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfnA5MCAgICAgICAgICAgICAgMC4wMzQgS2lCICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAwXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfnA5NSAgICAgICAgICAgICAgMC4wMzQgS2lCICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAwXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfnA5OSAgICAgICAgICAgICAgMC4wMzQgS2lCICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAwXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfnA5OTkgICAgICAgICAgICAgMC4wMzQgS2lCICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAwXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgbWluICAgICAgICAgICAgICAgMC4wMzIgS2lCICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAwXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgbWF4ICAgICAgICAgICAgICAgMC4wMzQgS2lCICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAwXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgY291bnQgICAgICAgICAgICAgICAgICAgICA1XG4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVU1NQVJZXzIgPSAiICAgICAgICAgICAgICAgUGFydGl0aW9uIHNpemUgICAgICAgICAgICBSb3cgY291bnQgICAgICAgICAgIENlbGwgY291bnQgICAgICBUb21ic3RvbmUgY291bnRcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB+cDUwICAgICAgICAgICAgIDcxLjczNSBLaUIgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgIDBcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB+cDc1ICAgICAgICAgICAgIDcxLjczNSBLaUIgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgIDBcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB+cDkwICAgICAgICAgICAgIDcxLjczNSBLaUIgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgIDBcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB+cDk1ICAgICAgICAgICAgIDcxLjczNSBLaUIgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgIDBcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB+cDk5ICAgICAgICAgICAgIDcxLjczNSBLaUIgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgIDBcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB+cDk5OSAgICAgICAgICAgIDcxLjczNSBLaUIgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgIDBcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBtaW4gICAgICAgICAgICAgIDY1LjYyNSBLaUIgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgIDBcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBtYXggICAgICAgICAgICAgIDY1LjYzMCBLaUIgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgIDBcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBjb3VudCAgICAgICAgICAgICAgICAgICAgIDVcbiI7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJlcGFyZURpcmVjdG9yaWVzKCkKKyAgICB7CisgICAgICAgIGNyZWF0ZUJhY2t1cHNBbmRTbmFwc2hvdHMoU1NUQUJMRV8xKTsKKyAgICAgICAgY3JlYXRlQmFja3Vwc0FuZFNuYXBzaG90cyhTU1RBQkxFXzIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY3JlYXRlQmFja3Vwc0FuZFNuYXBzaG90cyhTdHJpbmcgc3N0YWJsZSkKKyAgICB7CisgICAgICAgIEZpbGUgcGFyZW50RGlyID0gbmV3IEZpbGUoc3N0YWJsZSkucGFyZW50KCk7CisKKyAgICAgICAgRmlsZSBiYWNrdXBzRGlyID0gbmV3IEZpbGUocGFyZW50RGlyLCBEaXJlY3Rvcmllcy5CQUNLVVBTX1NVQkRJUik7CisgICAgICAgIGJhY2t1cHNEaXIudHJ5Q3JlYXRlRGlyZWN0b3J5KCk7CisKKyAgICAgICAgRmlsZSBzbmFwc2hvdHNEaXIgPSBuZXcgRmlsZShwYXJlbnREaXIsIERpcmVjdG9yaWVzLlNOQVBTSE9UX1NVQkRJUik7CisgICAgICAgIHNuYXBzaG90c0Rpci50cnlDcmVhdGVEaXJlY3RvcnkoKTsKKworICAgICAgICBGaWxlIHNuYXBzaG90RGlyID0gbmV3IEZpbGUoc25hcHNob3RzRGlyLCAic25hcHNob3QtMSIpOworICAgICAgICBzbmFwc2hvdERpci50cnlDcmVhdGVEaXJlY3RvcnkoKTsKKworICAgICAgICBmb3IgKEZpbGUgZiA6IHBhcmVudERpci50cnlMaXN0KEZpbGU6OmlzRmlsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5V2l0aE91dENvbmZpcm0oZiwgbmV3IEZpbGUoYmFja3Vwc0RpciwgZi5uYW1lKCkpKTsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5V2l0aE91dENvbmZpcm0oZiwgbmV3IEZpbGUoc25hcHNob3REaXIsIGYubmFtZSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW5zIHBvc3QtdGVzdCBhc3NlcnRpb25zIGFib3V0IGxvYWRlZCBjbGFzc2VkIGFuZCBzdGFydGVkIHRocmVhZHMuCisgICAgICovCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgYXNzZXJ0UG9zdFRlc3RFbnYoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQoT1BUSU9OQUxfVEhSRUFEU19XSVRIX1NDSEVNQSwgZmFsc2UpOworICAgICAgICBhc3NlcnRDTFNNTm90TG9hZGVkKCk7CisgICAgICAgIGFzc2VydFN5c3RlbUtTTm90TG9hZGVkKCk7CisgICAgICAgIGFzc2VydEtleXNwYWNlTm90TG9hZGVkKCk7CisgICAgICAgIGFzc2VydFNlcnZlck5vdExvYWRlZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmeSB0aGF0IHRoZSB0b29sIHByaW50cyBoZWxwIHdoZW4gbm8gYXJndW1lbnRzIGFyZSBwcm92aWRlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb0FyZ3NQcmludHNIZWxwKCkKKyAgICB7CisgICAgICAgIFRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlQ2xhc3MoU1NUYWJsZVBhcnRpdGlvbnMuY2xhc3MpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRFeGl0Q29kZSgpKS5pc09uZSgpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmNvbnRhaW5zKCJZb3UgbXVzdCBzdXBwbHkgYXQgbGVhc3Qgb25lIHNzdGFibGUgb3IgZGlyZWN0b3J5Iik7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygidXNhZ2UiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZnkgdGhhdCB0aGUgdG9vbCBwcmludHMgdGhlIHJpZ2h0IGhlbHAgY29udGVudHMuCisgICAgICogSWYgeW91IGFkZGVkLCBtb2RpZmllZCBvcHRpb25zIG9yIGhlbHAsIHBsZWFzZSB1cGRhdGUgZG9jcyBpZiBuZWNlc3NhcnkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF5YmVDaGFuZ2VEb2NzKCkKKyAgICB7CisgICAgICAgIFRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlQ2xhc3MoU1NUYWJsZVBhcnRpdGlvbnMuY2xhc3MpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkKKyAgICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oInVzYWdlOiBzc3RhYmxlcGFydGl0aW9ucyA8b3B0aW9ucz4gPHNzdGFibGUgZmlsZXMgb3IgZGlyZWN0b3JpZXM+XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbnQgcGFydGl0aW9uIHN0YXRpc3RpY3Mgb2Ygb25lIG9yIG1vcmUgc3N0YWJsZXMuXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAtYiwtLWJhY2t1cHMgICAgICAgICAgICAgICAgICAgaW5jbHVkZSBiYWNrdXBzIHByZXNlbnQgaW4gZGF0YVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzIChyZWN1cnNpdmUgc2NhbnMpXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAtYywtLW1pbi1jZWxscyA8YXJnPiAgICAgICAgICAgcGFydGl0aW9uIGNlbGwgY291bnQgdGhyZXNob2xkXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAtaywtLWtleSA8YXJnPiAgICAgICAgICAgICAgICAgUGFydGl0aW9uIGtleXMgdG8gaW5jbHVkZVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgLW0sLS1jc3YgICAgICAgICAgICAgICAgICAgICAgIENTViBvdXRwdXQgKG1hY2hpbmUgcmVhZGFibGUpXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAtbywtLW1pbi10b21ic3RvbmVzIDxhcmc+ICAgICAgcGFydGl0aW9uIHRvbWJzdG9uZSBjb3VudCB0aHJlc2hvbGRcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIC1yLC0tcmVjdXJzaXZlICAgICAgICAgICAgICAgICBzY2FuIGZvciBzc3RhYmxlcyByZWN1cnNpdmVseVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgLXMsLS1zbmFwc2hvdHMgICAgICAgICAgICAgICAgIGluY2x1ZGUgc25hcHNob3RzIHByZXNlbnQgaW4gZGF0YVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzIChyZWN1cnNpdmUgc2NhbnMpXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAtdCwtLW1pbi1zaXplIDxhcmc+ICAgICAgICAgICAgcGFydGl0aW9uIHNpemUgdGhyZXNob2xkLCBleHByZXNzZWQgYXNcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlaXRoZXIgdGhlIG51bWJlciBvZiBieXRlcyBvciBhIHNpemUgd2l0aCB1bml0IG9mIHRoZSBmb3JtIDEwS2lCLCAyME1pQixcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMEdpQiwgZXRjLlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgLXUsLS1jdXJyZW50LXRpbWVzdGFtcCA8YXJnPiAgIHRpbWVzdGFtcCAoc2Vjb25kcyBzaW5jZSBlcG9jaCwgdW5pdCB0aW1lKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBUVEwgZXhwaXJlZCBjYWxjdWxhdGlvblxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgLXcsLS1taW4tcm93cyA8YXJnPiAgICAgICAgICAgIHBhcnRpdGlvbiByb3cgY291bnQgdGhyZXNob2xkXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAteCwtLWV4Y2x1ZGUta2V5IDxhcmc+ICAgICAgICAgRXhjbHVkZWQgcGFydGl0aW9uIGtleShzKSBmcm9tIHBhcnRpdGlvblxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbGVkIHJvdy9jZWxsL3RvbWJzdG9uZSBpbmZvcm1hdGlvbiAoaXJyZWxldmFudCwgaWYgLS1wYXJ0aXRpb25zLW9ubHlcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBnaXZlbilcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIC15LC0tcGFydGl0aW9ucy1vbmx5ICAgICAgICAgICBEbyBub3QgcHJvY2VzcyBwZXItcGFydGl0aW9uIGRldGFpbGVkXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93L2NlbGwvdG9tYnN0b25lIGluZm9ybWF0aW9uLCBvbmx5IGJyaWVmIGluZm9ybWF0aW9uXG4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZnkgdGhhdCB0aGUgdG9vbCBjYW4gc2VsZWN0IHNpbmdsZSBzc3RhYmxlIGZpbGUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlU1NUYWJsZSgpCisgICAgeworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMoU1NUQUJMRV8xKS5pc0VxdWFsVG8oSEVBREVSXzEgKyBTVU1NQVJZXzEpOworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMoU1NUQUJMRV8yKS5pc0VxdWFsVG8oSEVBREVSXzIgKyBTVU1NQVJZXzIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmeSB0aGF0IHRoZSB0b29sIGNhbiBzZWxlY3QgbXVsdGlwbGUgc3N0YWJsZSBmaWxlcy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVNTVGFibGVzKCkKKyAgICB7CisgICAgICAgIGFzc2VydFRoYXRUb29sU3VjY2VkcyhTU1RBQkxFXzEsIFNTVEFCTEVfMikKKyAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKEhFQURFUl8yICsgU1VNTUFSWV8yICsgSEVBREVSXzEgKyBTVU1NQVJZXzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmeSB0aGF0IHRoZSB0b29sIGNhbiBzZWxlY3QgYWxsIHRoZSBzc3RhYmxlIGZpbGVzIGluIGEgZGlyZWN0b3J5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpcmVjdG9yeSgpCisgICAgeworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMobmV3IEZpbGUoU1NUQUJMRV8xKS5wYXJlbnRQYXRoKCkpCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhIRUFERVJfMSArIFNVTU1BUllfMSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdFRvb2xTdWNjZWRzKCItciIsIG5ldyBGaWxlKFNTVEFCTEVfMSkucGFyZW50KCkucGFyZW50UGF0aCgpKQorICAgICAgICAgICAgICAgIC5jb250YWlucyhIRUFERVJfMSArIFNVTU1BUllfMSkKKyAgICAgICAgICAgICAgICAuY29udGFpbnMoSEVBREVSXzIgKyBTVU1NQVJZXzIpOworCisgICAgICAgIGFzc2VydFRoYXRUb29sU3VjY2VkcygiLS1yZWN1cnNpdmUiLCBuZXcgRmlsZShTU1RBQkxFXzIpLnBhcmVudCgpLnBhcmVudFBhdGgoKSkKKyAgICAgICAgICAgICAgICAuY29udGFpbnMoSEVBREVSXzEgKyBTVU1NQVJZXzEpCisgICAgICAgICAgICAgICAgLmNvbnRhaW5zKEhFQURFUl8yICsgU1VNTUFSWV8yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoZSBmbGFnIGZvciBjb2xsZWN0aW5nIGFuZCBwcmludGluZyBzc3RhYmxlIHBhcnRpdGlvbiBzaXplcyBvbmx5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcnRpdGlvbnNPbmx5KCkKKyAgICB7CisgICAgICAgIHRlc3RQYXJ0aXRpb25zT25seSgiLXkiKTsKKyAgICAgICAgdGVzdFBhcnRpdGlvbnNPbmx5KCItLXBhcnRpdGlvbnMtb25seSIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdFBhcnRpdGlvbnNPbmx5KFN0cmluZyBvcHRpb24pCisgICAgeworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMoU1NUQUJMRV8xLCBvcHRpb24pCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhIRUFERVJfMSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgUGFydGl0aW9uIHNpemVcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfnA1MCAgICAgICAgICAgICAgMC4wMzQgS2lCXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIH5wNzUgICAgICAgICAgICAgIDAuMDM0IEtpQlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB+cDkwICAgICAgICAgICAgICAwLjAzNCBLaUJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfnA5NSAgICAgICAgICAgICAgMC4wMzQgS2lCXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIH5wOTkgICAgICAgICAgICAgIDAuMDM0IEtpQlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB+cDk5OSAgICAgICAgICAgICAwLjAzNCBLaUJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgbWluICAgICAgICAgICAgICAgMC4wMzIgS2lCXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIG1heCAgICAgICAgICAgICAgIDAuMDM0IEtpQlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBjb3VudCAgICAgICAgICAgICAgICAgICAgIDVcbiIpOworCisgICAgICAgIGFzc2VydFRoYXRUb29sU3VjY2VkcyhTU1RBQkxFXzIsICItLXBhcnRpdGlvbnMtb25seSIpCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhIRUFERVJfMiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgUGFydGl0aW9uIHNpemVcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfnA1MCAgICAgICAgICAgICA3MS43MzUgS2lCXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIH5wNzUgICAgICAgICAgICAgNzEuNzM1IEtpQlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB+cDkwICAgICAgICAgICAgIDcxLjczNSBLaUJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfnA5NSAgICAgICAgICAgICA3MS43MzUgS2lCXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIH5wOTkgICAgICAgICAgICAgNzEuNzM1IEtpQlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB+cDk5OSAgICAgICAgICAgIDcxLjczNSBLaUJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgbWluICAgICAgICAgICAgICA2NS42MjUgS2lCXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIG1heCAgICAgICAgICAgICAgNjUuNjMwIEtpQlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBjb3VudCAgICAgICAgICAgICAgICAgICAgIDVcbiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhlIGZsYWcgZm9yIGRldGVjdGluZyBwYXJ0aXRpb25zIG92ZXIgYSBjZXJ0YWluIHNpemUgdGhyZXNob2xkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1pblNpemUoKQorICAgIHsKKyAgICAgICAgdGVzdE1pblNpemUoIi10Iik7CisgICAgICAgIHRlc3RNaW5TaXplKCItLW1pbi1zaXplIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0TWluU2l6ZShTdHJpbmcgb3B0aW9uKQorICAgIHsKKyAgICAgICAgYXNzZXJ0VGhhdFRvb2xTdWNjZWRzKFNTVEFCTEVfMSwgU1NUQUJMRV8yLCBvcHRpb24sICIzNSIpCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhIRUFERVJfMiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcwJyAoMzApIGxpdmUsIHNpemU6IDY1LjYyNSBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzEnICgzMSkgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMicgKDMyKSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICczJyAoMzMpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzQnICgzNCkgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1bW1hcnkgb2YgICMxIChiaWctbWEpOlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBGaWxlOiAiICsgU1NUQUJMRV8yICsgIlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICA1IHBhcnRpdGlvbnMgbWF0Y2hcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgS2V5czogMCAxIDIgMyA0XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVTU1BUllfMiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIRUFERVJfMSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcxJyAoMzEpIGxpdmUsIHNpemU6IDAuMDM0IEtpQiwgcm93czogMSwgY2VsbHM6IDEsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzInICgzMikgbGl2ZSwgc2l6ZTogMC4wMzQgS2lCLCByb3dzOiAxLCBjZWxsczogMSwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMycgKDMzKSBsaXZlLCBzaXplOiAwLjAzNCBLaUIsIHJvd3M6IDEsIGNlbGxzOiAxLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICc0JyAoMzQpIGxpdmUsIHNpemU6IDAuMDM0IEtpQiwgcm93czogMSwgY2VsbHM6IDEsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdW1tYXJ5IG9mICAjMSAoYmlnLW1hKTpcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgRmlsZTogIiArIFNTVEFCTEVfMSArICJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgNCBwYXJ0aXRpb25zIG1hdGNoXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEtleXM6IDEgMiAzIDRcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUFSWV8xKTsKKworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMoU1NUQUJMRV8xLCBTU1RBQkxFXzIsICItLW1pbi1zaXplIiwgIjM2IikKKyAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKEhFQURFUl8yICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzAnICgzMCkgbGl2ZSwgc2l6ZTogNjUuNjI1IEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMScgKDMxKSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcyJyAoMzIpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzMnICgzMykgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnNCcgKDM0KSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VtbWFyeSBvZiAgIzEgKGJpZy1tYSk6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEZpbGU6ICIgKyBTU1RBQkxFXzIgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIDUgcGFydGl0aW9ucyBtYXRjaFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBLZXlzOiAwIDEgMiAzIDRcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUFSWV8yICsgSEVBREVSXzEgKyBTVU1NQVJZXzEpOworCisgICAgICAgIGFzc2VydFRoYXRUb29sU3VjY2VkcyhTU1RBQkxFXzEsIFNTVEFCTEVfMiwgIi0tbWluLXNpemUiLCAiNjcyMDEiKQorICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oSEVBREVSXzIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMScgKDMxKSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcyJyAoMzIpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzMnICgzMykgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnNCcgKDM0KSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VtbWFyeSBvZiAgIzEgKGJpZy1tYSk6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEZpbGU6ICIgKyBTU1RBQkxFXzIgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIDQgcGFydGl0aW9ucyBtYXRjaFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBLZXlzOiAxIDIgMyA0XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVTU1BUllfMiArIEhFQURFUl8xICsgU1VNTUFSWV8xKTsKKworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMoU1NUQUJMRV8xLCBTU1RBQkxFXzIsICItLW1pbi1zaXplIiwgIjY3MjAxQiIpCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhIRUFERVJfMiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcxJyAoMzEpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzInICgzMikgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMycgKDMzKSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICc0JyAoMzQpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdW1tYXJ5IG9mICAjMSAoYmlnLW1hKTpcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgRmlsZTogIiArIFNTVEFCTEVfMiArICJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgNCBwYXJ0aXRpb25zIG1hdGNoXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEtleXM6IDEgMiAzIDRcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUFSWV8yICsgSEVBREVSXzEgKyBTVU1NQVJZXzEpOworCisgICAgICAgIGFzc2VydFRoYXRUb29sU3VjY2VkcyhTU1RBQkxFXzEsIFNTVEFCTEVfMiwgIi0tbWluLXNpemUiLCAiNjVLaUIiKQorICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oSEVBREVSXzIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMCcgKDMwKSBsaXZlLCBzaXplOiA2NS42MjUgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcxJyAoMzEpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzInICgzMikgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMycgKDMzKSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICc0JyAoMzQpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdW1tYXJ5IG9mICAjMSAoYmlnLW1hKTpcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgRmlsZTogIiArIFNTVEFCTEVfMiArICJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgNSBwYXJ0aXRpb25zIG1hdGNoXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEtleXM6IDAgMSAyIDMgNFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTVU1NQVJZXzIgKyBIRUFERVJfMSArIFNVTU1BUllfMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgZmxhZyBmb3IgZGV0ZWN0aW5nIHBhcnRpdGlvbnMgd2l0aCBtb3JlIGNlbGxzIHRoYW4gYSBjZXJ0YWluIHRocmVzaG9sZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaW5DZWxscygpCisgICAgeworICAgICAgICB0ZXN0TWluQ2VsbHMoIi1jIik7CisgICAgICAgIHRlc3RNaW5DZWxscygiLS1taW4tY2VsbHMiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3RNaW5DZWxscyhTdHJpbmcgb3B0aW9uKQorICAgIHsKKyAgICAgICAgYXNzZXJ0VGhhdFRvb2xTdWNjZWRzKFNTVEFCTEVfMSwgU1NUQUJMRV8yLCBvcHRpb24sICIwIikKKyAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKEhFQURFUl8yICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzAnICgzMCkgbGl2ZSwgc2l6ZTogNjUuNjI1IEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMScgKDMxKSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcyJyAoMzIpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzMnICgzMykgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnNCcgKDM0KSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VtbWFyeSBvZiAgIzEgKGJpZy1tYSk6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEZpbGU6ICIgKyBTU1RBQkxFXzIgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIDUgcGFydGl0aW9ucyBtYXRjaFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBLZXlzOiAwIDEgMiAzIDRcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUFSWV8yICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFQURFUl8xICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzAnICgzMCkgbGl2ZSwgc2l6ZTogMC4wMzIgS2lCLCByb3dzOiAxLCBjZWxsczogMSwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMScgKDMxKSBsaXZlLCBzaXplOiAwLjAzNCBLaUIsIHJvd3M6IDEsIGNlbGxzOiAxLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcyJyAoMzIpIGxpdmUsIHNpemU6IDAuMDM0IEtpQiwgcm93czogMSwgY2VsbHM6IDEsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzMnICgzMykgbGl2ZSwgc2l6ZTogMC4wMzQgS2lCLCByb3dzOiAxLCBjZWxsczogMSwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnNCcgKDM0KSBsaXZlLCBzaXplOiAwLjAzNCBLaUIsIHJvd3M6IDEsIGNlbGxzOiAxLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VtbWFyeSBvZiAgIzEgKGJpZy1tYSk6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEZpbGU6ICIgKyBTU1RBQkxFXzEgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIDUgcGFydGl0aW9ucyBtYXRjaFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBLZXlzOiAwIDEgMiAzIDRcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUFSWV8xKTsKKworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMoU1NUQUJMRV8xLCBTU1RBQkxFXzIsIG9wdGlvbiwgIjIiKQorICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oSEVBREVSXzIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMCcgKDMwKSBsaXZlLCBzaXplOiA2NS42MjUgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcxJyAoMzEpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzInICgzMikgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMycgKDMzKSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICc0JyAoMzQpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdW1tYXJ5IG9mICAjMSAoYmlnLW1hKTpcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgRmlsZTogIiArIFNTVEFCTEVfMiArICJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgNSBwYXJ0aXRpb25zIG1hdGNoXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEtleXM6IDAgMSAyIDMgNFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTVU1NQVJZXzIgKyBIRUFERVJfMSArIFNVTU1BUllfMSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdFRvb2xTdWNjZWRzKFNTVEFCTEVfMSwgU1NUQUJMRV8yLCBvcHRpb24sICI1MSIpCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhIRUFERVJfMiArIFNVTU1BUllfMiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIRUFERVJfMSArIFNVTU1BUllfMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgZmxhZyBmb3IgZGV0ZWN0aW5nIHBhcnRpdGlvbnMgd2l0aCBtb3JlIHJvd3MgdGhhbiBhIGNlcnRhaW4gdGhyZXNob2xkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1pblJvd3MoKQorICAgIHsKKyAgICAgICAgdGVzdE1pblJvd3MoIi13Iik7CisgICAgICAgIHRlc3RNaW5Sb3dzKCItLW1pbi1yb3dzIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0TWluUm93cyhTdHJpbmcgb3B0aW9uKQorICAgIHsKKyAgICAgICAgYXNzZXJ0VGhhdFRvb2xTdWNjZWRzKFNTVEFCTEVfMSwgU1NUQUJMRV8yLCBvcHRpb24sICIwIikKKyAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKEhFQURFUl8yICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzAnICgzMCkgbGl2ZSwgc2l6ZTogNjUuNjI1IEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMScgKDMxKSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcyJyAoMzIpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzMnICgzMykgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnNCcgKDM0KSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VtbWFyeSBvZiAgIzEgKGJpZy1tYSk6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEZpbGU6ICIgKyBTU1RBQkxFXzIgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIDUgcGFydGl0aW9ucyBtYXRjaFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBLZXlzOiAwIDEgMiAzIDRcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUFSWV8yICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFQURFUl8xICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzAnICgzMCkgbGl2ZSwgc2l6ZTogMC4wMzIgS2lCLCByb3dzOiAxLCBjZWxsczogMSwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMScgKDMxKSBsaXZlLCBzaXplOiAwLjAzNCBLaUIsIHJvd3M6IDEsIGNlbGxzOiAxLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcyJyAoMzIpIGxpdmUsIHNpemU6IDAuMDM0IEtpQiwgcm93czogMSwgY2VsbHM6IDEsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzMnICgzMykgbGl2ZSwgc2l6ZTogMC4wMzQgS2lCLCByb3dzOiAxLCBjZWxsczogMSwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnNCcgKDM0KSBsaXZlLCBzaXplOiAwLjAzNCBLaUIsIHJvd3M6IDEsIGNlbGxzOiAxLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VtbWFyeSBvZiAgIzEgKGJpZy1tYSk6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEZpbGU6ICIgKyBTU1RBQkxFXzEgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIDUgcGFydGl0aW9ucyBtYXRjaFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBLZXlzOiAwIDEgMiAzIDRcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUFSWV8xKTsKKworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMoU1NUQUJMRV8xLCBTU1RBQkxFXzIsIG9wdGlvbiwgIjUwIikKKyAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKEhFQURFUl8yICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzAnICgzMCkgbGl2ZSwgc2l6ZTogNjUuNjI1IEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMScgKDMxKSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcyJyAoMzIpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzMnICgzMykgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnNCcgKDM0KSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VtbWFyeSBvZiAgIzEgKGJpZy1tYSk6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEZpbGU6ICIgKyBTU1RBQkxFXzIgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIDUgcGFydGl0aW9ucyBtYXRjaFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBLZXlzOiAwIDEgMiAzIDRcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUFSWV8yICsgSEVBREVSXzEgKyBTVU1NQVJZXzEpOworCisgICAgICAgIGFzc2VydFRoYXRUb29sU3VjY2VkcyhTU1RBQkxFXzEsIFNTVEFCTEVfMiwgb3B0aW9uLCAiNTEiKQorICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oSEVBREVSXzIgKyBTVU1NQVJZXzIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVBREVSXzEgKyBTVU1NQVJZXzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhlIGZsYWcgZm9yIGRldGVjdGluZyBwYXJ0aXRpb25zIHdpdGggbW9yZSB0b21ic3RvbmVzIHRoYW4gYSBjZXJ0YWluIHRocmVzaG9sZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaW5Ub21ic3RvbmVzKCkKKyAgICB7CisgICAgICAgIHRlc3RNaW5Ub21ic3RvbmVzKCItbyIpOworICAgICAgICB0ZXN0TWluVG9tYnN0b25lcygiLS1taW4tdG9tYnN0b25lcyIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdE1pblRvbWJzdG9uZXMoU3RyaW5nIG9wdGlvbikKKyAgICB7CisgICAgICAgIGFzc2VydFRoYXRUb29sU3VjY2VkcyhTU1RBQkxFXzEsIFNTVEFCTEVfMiwgb3B0aW9uLCAiMCIpCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhIRUFERVJfMiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcwJyAoMzApIGxpdmUsIHNpemU6IDY1LjYyNSBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzEnICgzMSkgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMicgKDMyKSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICczJyAoMzMpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzQnICgzNCkgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1bW1hcnkgb2YgICMxIChiaWctbWEpOlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBGaWxlOiAiICsgU1NUQUJMRV8yICsgIlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICA1IHBhcnRpdGlvbnMgbWF0Y2hcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgS2V5czogMCAxIDIgMyA0XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVTU1BUllfMiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIRUFERVJfMSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcwJyAoMzApIGxpdmUsIHNpemU6IDAuMDMyIEtpQiwgcm93czogMSwgY2VsbHM6IDEsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzEnICgzMSkgbGl2ZSwgc2l6ZTogMC4wMzQgS2lCLCByb3dzOiAxLCBjZWxsczogMSwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMicgKDMyKSBsaXZlLCBzaXplOiAwLjAzNCBLaUIsIHJvd3M6IDEsIGNlbGxzOiAxLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICczJyAoMzMpIGxpdmUsIHNpemU6IDAuMDM0IEtpQiwgcm93czogMSwgY2VsbHM6IDEsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzQnICgzNCkgbGl2ZSwgc2l6ZTogMC4wMzQgS2lCLCByb3dzOiAxLCBjZWxsczogMSwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1bW1hcnkgb2YgICMxIChiaWctbWEpOlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBGaWxlOiAiICsgU1NUQUJMRV8xICsgIlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICA1IHBhcnRpdGlvbnMgbWF0Y2hcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgS2V5czogMCAxIDIgMyA0XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVTU1BUllfMSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdFRvb2xTdWNjZWRzKFNTVEFCTEVfMSwgU1NUQUJMRV8yLCAiLS1taW4tdG9tYnN0b25lcyIsICIxIikKKyAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKEhFQURFUl8yICsgU1VNTUFSWV8yICsgSEVBREVSXzEgKyBTVU1NQVJZXzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhlIGZsYWcgZm9yIHByb3ZpZGluZyBhIGN1cnJlbnQgdGltZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXJyZW50VGltZXN0YW1wKCkKKyAgICB7CisgICAgICAgIHRlc3RDdXJyZW50VGltZXN0YW1wKCItdSIpOworICAgICAgICB0ZXN0Q3VycmVudFRpbWVzdGFtcCgiLS1jdXJyZW50LXRpbWVzdGFtcCIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdEN1cnJlbnRUaW1lc3RhbXAoU3RyaW5nIG9wdGlvbikKKyAgICB7CisgICAgICAgIFN0cmluZyBub3cgPSBTdHJpbmcudmFsdWVPZihGQlV0aWxpdGllcy5ub3dJblNlY29uZHMoKSk7CisgICAgICAgIGFzc2VydFRoYXRUb29sU3VjY2VkcyhTU1RBQkxFXzEsIG9wdGlvbiwgbm93KS5pc0VxdWFsVG8oSEVBREVSXzEgKyBTVU1NQVJZXzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhlIGZsYWcgZm9yIGluY2x1ZGluZyBiYWNrdXAgc3N0YWJsZXMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFja3VwcygpCisgICAgeworICAgICAgICB0ZXN0QmFja3VwcygiLWIiKTsKKyAgICAgICAgdGVzdEJhY2t1cHMoIi0tYmFja3VwcyIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdEJhY2t1cHMoU3RyaW5nIG9wdGlvbikKKyAgICB7CisgICAgICAgIGFzc2VydFRoYXRUb29sU3VjY2VkcyhuZXcgRmlsZShTU1RBQkxFXzEpLnBhcmVudFBhdGgoKSwgIi1yIiwgb3B0aW9uKQorICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oSEVBREVSXzEgKyBTVU1NQVJZXzEgKyBCQUNLVVBTX0hFQURFUl8xICsgU1VNTUFSWV8xKTsKKworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMobmV3IEZpbGUoU1NUQUJMRV8yKS5wYXJlbnRQYXRoKCksICItciIsIG9wdGlvbikKKyAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKEhFQURFUl8yICsgU1VNTUFSWV8yICsgQkFDS1VQU19IRUFERVJfMiArIFNVTU1BUllfMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgZmxhZyBmb3IgaW5jbHVkaW5nIHNuYXBzaG90IHNzdGFibGVzLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNuYXBzaG90cygpCisgICAgeworICAgICAgICB0ZXN0U25hcHNob3RzKCItcyIpOworICAgICAgICB0ZXN0U25hcHNob3RzKCItLXNuYXBzaG90cyIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdFNuYXBzaG90cyhTdHJpbmcgb3B0aW9uKQorICAgIHsKKyAgICAgICAgYXNzZXJ0VGhhdFRvb2xTdWNjZWRzKG5ldyBGaWxlKFNTVEFCTEVfMSkucGFyZW50UGF0aCgpLCAiLXIiLCBvcHRpb24pCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhIRUFERVJfMSArIFNVTU1BUllfMSArIFNOQVBTSE9UU19IRUFERVJfMSArIFNVTU1BUllfMSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdFRvb2xTdWNjZWRzKG5ldyBGaWxlKFNTVEFCTEVfMikucGFyZW50UGF0aCgpLCAiLXIiLCBvcHRpb24pCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhIRUFERVJfMiArIFNVTU1BUllfMiArIFNOQVBTSE9UU19IRUFERVJfMiArIFNVTU1BUllfMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgZmxhZyBmb3Igc3BlY2lmeWluZyBwYXJ0aXRvbiBrZXlzIHRvIGJlIGNvbnNpZGVyZWQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5jbHVkZWRLZXlzKCkKKyAgICB7CisgICAgICAgIHRlc3RJbmNsdWRlZEtleXMoIi1rIik7CisgICAgICAgIHRlc3RJbmNsdWRlZEtleXMoIi0ta2V5Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0SW5jbHVkZWRLZXlzKFN0cmluZyBvcHRpb24pCisgICAgeworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMoU1NUQUJMRV8xLCAiLS1taW4tc2l6ZSIsICIwIiwgb3B0aW9uLCAiMSIsIG9wdGlvbiwgIjMiKQorICAgICAgICAgICAgICAgIC5jb250YWlucyhIRUFERVJfMSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcxJyAoMzEpIGxpdmUsIHNpemU6IDAuMDM0IEtpQiwgcm93czogMSwgY2VsbHM6IDEsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzMnICgzMykgbGl2ZSwgc2l6ZTogMC4wMzQgS2lCLCByb3dzOiAxLCBjZWxsczogMSwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1bW1hcnkgb2YgICMxIChiaWctbWEpOlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBGaWxlOiAiICsgU1NUQUJMRV8xICsgIlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAyIHBhcnRpdGlvbnMgbWF0Y2hcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgS2V5czogMSAzXG4iKQorICAgICAgICAgICAgICAgIC5jb250YWlucygiY291bnQgICAgICAgICAgICAgICAgICAgICAyXG4iKTsKKworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMoU1NUQUJMRV8xLCAiLS1taW4tc2l6ZSIsICIwIiwgb3B0aW9uLCAiMCIsIG9wdGlvbiwgIjIiLCBvcHRpb24sICI0IikKKyAgICAgICAgICAgICAgICAuY29udGFpbnMoSEVBREVSXzEgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcwJyAoMzApIGxpdmUsIHNpemU6IDAuMDMyIEtpQiwgcm93czogMSwgY2VsbHM6IDEsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMicgKDMyKSBsaXZlLCBzaXplOiAwLjAzNCBLaUIsIHJvd3M6IDEsIGNlbGxzOiAxLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzQnICgzNCkgbGl2ZSwgc2l6ZTogMC4wMzQgS2lCLCByb3dzOiAxLCBjZWxsczogMSwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VtbWFyeSBvZiAgIzEgKGJpZy1tYSk6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgRmlsZTogIiArIFNTVEFCTEVfMSArICJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiICAzIHBhcnRpdGlvbnMgbWF0Y2hcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiICBLZXlzOiAwIDIgNFxuIikKKyAgICAgICAgICAgICAgICAuY29udGFpbnMoImNvdW50ICAgICAgICAgICAgICAgICAgICAgM1xuIik7CisKKyAgICAgICAgYXNzZXJ0VGhhdFRvb2xTdWNjZWRzKFNTVEFCTEVfMSwgIi15IiwiLS1taW4tc2l6ZSIsICIwIiwgb3B0aW9uLCAiMCIsIG9wdGlvbiwgIjIiLCBvcHRpb24sICI0IikKKyAgICAgICAgICAgICAgICAuY29udGFpbnMoSEVBREVSXzEgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcwJyAoMzApIGxpdmUsIHNpemU6IDAuMDMyIEtpQlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzInICgzMikgbGl2ZSwgc2l6ZTogMC4wMzQgS2lCXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnNCcgKDM0KSBsaXZlLCBzaXplOiAwLjAzNCBLaUJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VtbWFyeSBvZiAgIzEgKGJpZy1tYSk6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgRmlsZTogIiArIFNTVEFCTEVfMSArICJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiICAzIHBhcnRpdGlvbnMgbWF0Y2hcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiICBLZXlzOiAwIDIgNFxuIikKKyAgICAgICAgICAgICAgICAuY29udGFpbnMoImNvdW50ICAgICAgICAgICAgICAgICAgICAgM1xuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgZmxhZyBmb3Igc3BlY2lmeWluZyBwYXJ0aXRvbiBrZXlzIHRvIGJlIGV4Y2x1ZGVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2x1ZGVkS2V5cygpCisgICAgeworICAgICAgICB0ZXN0RXhjbHVkZWRLZXlzKCIteCIpOworICAgICAgICB0ZXN0RXhjbHVkZWRLZXlzKCItLWV4Y2x1ZGUta2V5Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0RXhjbHVkZWRLZXlzKFN0cmluZyBvcHRpb24pCisgICAgeworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMoU1NUQUJMRV8xLCAiLS1taW4tc2l6ZSIsICIwIiwgb3B0aW9uLCAiMSIsIG9wdGlvbiwgIjMiKQorICAgICAgICAgICAgICAgIC5jb250YWlucyhIRUFERVJfMSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcwJyAoMzApIGxpdmUsIHNpemU6IDAuMDMyIEtpQiwgcm93czogMSwgY2VsbHM6IDEsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzInICgzMikgbGl2ZSwgc2l6ZTogMC4wMzQgS2lCLCByb3dzOiAxLCBjZWxsczogMSwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnNCcgKDM0KSBsaXZlLCBzaXplOiAwLjAzNCBLaUIsIHJvd3M6IDEsIGNlbGxzOiAxLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VtbWFyeSBvZiAgIzEgKGJpZy1tYSk6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEZpbGU6ICIgKyBTU1RBQkxFXzEgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIDMgcGFydGl0aW9ucyBtYXRjaFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBLZXlzOiAwIDIgNFxuIikKKyAgICAgICAgICAgICAgICAuY29udGFpbnMoImNvdW50ICAgICAgICAgICAgICAgICAgICAgM1xuIik7CisKKyAgICAgICAgYXNzZXJ0VGhhdFRvb2xTdWNjZWRzKFNTVEFCTEVfMSwgIi0tbWluLXNpemUiLCAiMCIsIG9wdGlvbiwgIjAiLCBvcHRpb24sICIyIiwgb3B0aW9uLCAiNCIpCisgICAgICAgICAgICAgICAgLmNvbnRhaW5zKEhFQURFUl8xICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzEnICgzMSkgbGl2ZSwgc2l6ZTogMC4wMzQgS2lCLCByb3dzOiAxLCBjZWxsczogMSwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMycgKDMzKSBsaXZlLCBzaXplOiAwLjAzNCBLaUIsIHJvd3M6IDEsIGNlbGxzOiAxLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VtbWFyeSBvZiAgIzEgKGJpZy1tYSk6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEZpbGU6ICIgKyBTU1RBQkxFXzEgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIDIgcGFydGl0aW9ucyBtYXRjaFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBLZXlzOiAxIDNcbiIpCisgICAgICAgICAgICAgICAgLmNvbnRhaW5zKCJjb3VudCAgICAgICAgICAgICAgICAgICAgIDJcbiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhlIGZsYWcgZm9yIHByb2R1Y2luZyBtYWNoaW5lLXJlYWRhYmxlIENTViBvdXRwdXQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q1NWKCkKKyAgICB7CisgICAgICAgIHRlc3RDU1YoIi1tIik7CisgICAgICAgIHRlc3RDU1YoIi0tY3N2Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0Q1NWKFN0cmluZyBvcHRpb24pCisgICAgeworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMob3B0aW9uLCAiLS1taW4tc2l6ZSIsICIzNSIsIFNTVEFCTEVfMSwgU1NUQUJMRV8yKQorICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oZm9ybWF0KCJrZXksa2V5QmluYXJ5LGxpdmUsb2Zmc2V0LHNpemUscm93Q291bnQsY2VsbENvdW50LHRvbWJzdG9uZUNvdW50LCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyb3dUb21ic3RvbmVDb3VudCxyYW5nZVRvbWJzdG9uZUNvdW50LGNvbXBsZXhUb21ic3RvbmVDb3VudCxjZWxsVG9tYnN0b25lQ291bnQsIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJvd1R0bEV4cGlyZWQsY2VsbFR0bEV4cGlyZWQsZGlyZWN0b3J5LGtleXNwYWNlLHRhYmxlLGluZGV4LHNuYXBzaG90LGJhY2t1cCwiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGlvbixmb3JtYXQsdmVyc2lvblxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiMFwiLDMwLHRydWUsMCw2NzIwMCw1MCw1MCwwLDAsMCwwLDAsMCwwLCVzLCwsLCwsMSxiaWcsbWFcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIjFcIiwzMSx0cnVlLDY3MjAwLDY3MjA1LDUwLDUwLDAsMCwwLDAsMCwwLDAsJTxzLCwsLCwsMSxiaWcsbWFcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIjJcIiwzMix0cnVlLDEzNDQwNSw2NzIwNSw1MCw1MCwwLDAsMCwwLDAsMCwwLCU8cywsLCwsLDEsYmlnLG1hXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIzXCIsMzMsdHJ1ZSwyMDE2MTAsNjcyMDUsNTAsNTAsMCwwLDAsMCwwLDAsMCwlPHMsLCwsLCwxLGJpZyxtYVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiNFwiLDM0LHRydWUsMjY4ODE1LDY3MjA1LDUwLDUwLDAsMCwwLDAsMCwwLDAsJTxzLCwsLCwsMSxiaWcsbWFcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIjFcIiwzMSx0cnVlLDMzLDM1LDEsMSwwLDAsMCwwLDAsMCwwLCVzLCwsLCwsMSxiaWcsbWFcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIjJcIiwzMix0cnVlLDY4LDM1LDEsMSwwLDAsMCwwLDAsMCwwLCU8cywsLCwsLDEsYmlnLG1hXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIzXCIsMzMsdHJ1ZSwxMDMsMzUsMSwxLDAsMCwwLDAsMCwwLDAsJTxzLCwsLCwsMSxiaWcsbWFcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIjRcIiwzNCx0cnVlLDEzOCwzNSwxLDEsMCwwLDAsMCwwLDAsMCwlPHMsLCwsLCwxLGJpZyxtYVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RBQkxFXzIsIFNTVEFCTEVfMSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEFic3RyYWN0U3RyaW5nQXNzZXJ0PD8+IGFzc2VydFRoYXRUb29sU3VjY2VkcyhTdHJpbmcuLi4gYXJncykKKyAgICB7CisgICAgICAgIFRvb2xSZXN1bHQgdG9vbCA9IGludm9rZVRvb2woYXJncyk7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldEV4aXRDb2RlKCkpLmlzWmVybygpOworICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7CisgICAgICAgIHJldHVybiBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNzdGFibGUoU3RyaW5nIHRhYmxlKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmaW5kT25lU1NUYWJsZSgibGVnYWN5X3NzdGFibGVzIiwgdGFibGUpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFRvb2xSZXN1bHQgaW52b2tlVG9vbChTdHJpbmcuLi4gYXJncykKKyAgICB7CisgICAgICAgIHJldHVybiBUb29sUnVubmVyLmludm9rZUNsYXNzKFNTVGFibGVQYXJ0aXRpb25zLmNsYXNzLCBhcmdzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZVJlcGFpcmVkQXRTZXR0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZVJlcGFpcmVkQXRTZXR0ZXJUZXN0LmphdmEKaW5kZXggMzUzMTA3NS4uOWQzYTYwOSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVSZXBhaXJlZEF0U2V0dGVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlUmVwYWlyZWRBdFNldHRlclRlc3QuamF2YQpAQCAtNDEsNyArNDEsNyBAQAogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCksIENvcmVNYXRjaGVycy5jb250YWluc1N0cmluZ0lnbm9yaW5nQ2FzZSgidXNhZ2U6IikpOwogICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmlzRW1wdHkoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRvb2wuZ2V0RXhpdENvZGUoKSk7Ci0gICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKG51bGwpOworICAgICAgICBhc3NlcnROb1VuZXhwZWN0ZWRUaHJlYWRzU3RhcnRlZChudWxsLCBmYWxzZSk7CiAgICAgICAgIGFzc2VydFNjaGVtYU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRDTFNNTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydFN5c3RlbUtTTm90TG9hZGVkKCk7CkBAIC03OSw3ICs3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0taXMtcmVwYWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRPbmVTU1RhYmxlKCJsZWdhY3lfc3N0YWJsZXMiLCAibGVnYWN5X21hX3NpbXBsZSIpKTsKICAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwotICAgICAgICBhc3NlcnROb1VuZXhwZWN0ZWRUaHJlYWRzU3RhcnRlZChPUFRJT05BTF9USFJFQURTX1dJVEhfU0NIRU1BKTsKKyAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQoT1BUSU9OQUxfVEhSRUFEU19XSVRIX1NDSEVNQSwgZmFsc2UpOwogICAgICAgICBhc3NlcnRTY2hlbWFOb3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0Q0xTTU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRTeXN0ZW1LU05vdExvYWRlZCgpOwpAQCAtOTUsNyArOTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLWlzLXVucmVwYWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRPbmVTU1RhYmxlKCJsZWdhY3lfc3N0YWJsZXMiLCAibGVnYWN5X21hX3NpbXBsZSIpKTsKICAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwotICAgICAgICBhc3NlcnROb1VuZXhwZWN0ZWRUaHJlYWRzU3RhcnRlZChPUFRJT05BTF9USFJFQURTX1dJVEhfU0NIRU1BKTsKKyAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQoT1BUSU9OQUxfVEhSRUFEU19XSVRIX1NDSEVNQSwgZmFsc2UpOwogICAgICAgICBhc3NlcnRTY2hlbWFOb3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0Q0xTTU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRTeXN0ZW1LU05vdExvYWRlZCgpOwpAQCAtMTEzLDcgKzExMyw3IEBACiAgICAgICAgIFN0cmluZyBmaWxlID0gdG1wRmlsZS5hYnNvbHV0ZVBhdGgoKTsKICAgICAgICAgVG9vbFJlc3VsdCB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VDbGFzcyhTU1RhYmxlUmVwYWlyZWRBdFNldHRlci5jbGFzcywgIi0tcmVhbGx5LXNldCIsICItLWlzLXJlcGFpcmVkIiwgIi1mIiwgZmlsZSk7CiAgICAgICAgIHRvb2wuYXNzZXJ0T25DbGVhbkV4aXQoKTsKLSAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQoT1BUSU9OQUxfVEhSRUFEU19XSVRIX1NDSEVNQSk7CisgICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKE9QVElPTkFMX1RIUkVBRFNfV0lUSF9TQ0hFTUEsIGZhbHNlKTsKICAgICAgICAgYXNzZXJ0U2NoZW1hTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydENMU01Ob3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0U3lzdGVtS1NOb3RMb2FkZWQoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TdGFuZGFsb25lU3BsaXR0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVNwbGl0dGVyVGVzdC5qYXZhCmluZGV4IGQyODU1OGYuLjA1ZTdiMzQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TdGFuZGFsb25lU3BsaXR0ZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1N0YW5kYWxvbmVTcGxpdHRlclRlc3QuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuVG9vbFJ1bm5lci5Ub29sUmVzdWx0OwogaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CiBpbXBvcnQgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVyczsKQEAgLTQyLDcgKzQzLDcgQEAKICAgICAgICAgLy8gdGhlIGxlZ2FjeSB0YWJsZXMgdXNlIGEgZGlmZmVyZW50IHBhcnRpdGlvbmVyIDooCiAgICAgICAgIC8vIChEb24ndCB1c2UgQnl0ZU9yZGVyZWRQYXJ0aXRpb25lci5jbGFzcy5nZXROYW1lKCkgYXMgdGhhdCB3b3VsZCBpbml0aWFsaXplIHRoZSBjbGFzcyBhbmQgd29yawogICAgICAgICAvLyBhZ2FpbnN0IHRoZSBnb2FsIG9mIHRoaXMgdGVzdCB0byBjaGVjayBjbGFzc2VzIGFuZCB0aHJlYWRzIGluaXRpYWxpemVkIGJ5IHRoZSB0b29sLikKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEucGFydGl0aW9uZXIiLCAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXIiKTsKKyAgICAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlBBUlRJVElPTkVSLnNldFN0cmluZygib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXIiKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1N0YW5kYWxvbmVTcGxpdHRlcldpdGhDUUxUZXN0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVNwbGl0dGVyV2l0aENRTFRlc3RlclRlc3QuamF2YQppbmRleCA5NDRiOGRlLi40MGYwNzVhIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVNwbGl0dGVyV2l0aENRTFRlc3RlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVNwbGl0dGVyV2l0aENRTFRlc3RlclRlc3QuamF2YQpAQCAtMzUsNiArMzUsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlRvb2xSdW5uZXIuVG9vbFJlc3VsdDsKIGltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9VVElMX0FMTE9XX1RPT0xfUkVJTklUX0ZPUl9URVNUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCkBAIC0xMjQsNiArMTI1LDYgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZSgiR2VuZXJhdGVkIHNzdGFibGUgbXVzdCBiZSBhdCBsZWFzdCAxTWlCIiwgKG5ldyBGaWxlKHNzdGFibGVGaWxlTmFtZSkpLmxlbmd0aCgpID4gMTAyNCoxMDI0KTsKICAgICAgICAgc3N0YWJsZXNEaXIgPSBuZXcgRmlsZShzc3RhYmxlRmlsZU5hbWUpLnBhcmVudCgpOwogICAgICAgICBvcmlnU3N0YWJsZXMgPSBBcnJheXMuYXNMaXN0KHNzdGFibGVzRGlyLnRyeUxpc3QoKSk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShVdGlsLkFMTE9XX1RPT0xfUkVJTklUX0ZPUl9URVNULCAidHJ1ZSIpOyAvLyBOZWNlc3NhcnkgZm9yIHRlc3RpbmcKKyAgICAgICAgVEVTVF9VVElMX0FMTE9XX1RPT0xfUkVJTklUX0ZPUl9URVNULnNldEJvb2xlYW4odHJ1ZSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1N0YW5kYWxvbmVVcGdyYWRlck9uU1N0YWJsZXNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVVwZ3JhZGVyT25TU3RhYmxlc1Rlc3QuamF2YQppbmRleCBlOWQyMDcwLi4xMzcwNWY5IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVVwZ3JhZGVyT25TU3RhYmxlc1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVVwZ3JhZGVyT25TU3RhYmxlc1Rlc3QuamF2YQpAQCAtMTgsNTEgKzE4LDUyIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHM7CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuU3RhcnR1cEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkxlZ2FjeVNTVGFibGVUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ub29sUnVubmVyLlRvb2xSZXN1bHQ7CiBpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKLWltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLnV0aWwuTGlzdHM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX1VUSUxfQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1Q7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCiAvKgogICogU1N0YWJsZVVwZGF0ZXIgc2hvdWxkIGJlIHJ1biB3aXRoIHRoZSBzZXJ2ZXIgc2h1dGRvd24sIGJ1dCB3ZSBuZWVkIHRvIHNldCB1cCBhIGNlcnRhaW4gZW52IHRvIGJlIGFibGUgdG8KICAqIGxvYWQvc3dhcC9kcm9wIHNzdGFibGUgZmlsZXMgdW5kZXIgdGhlIHRlc3QncyBmZWV0LiBIZW5jZSB3aHkgd2UgbmVlZCBhIHNlcGFyYXRlIGZpbGUgdnMgU3RhbmRhbG9uZVVwZ3JhZGVyVGVzdC4KLSAqIAorICoKICAqIENhdXRpb246IGhlYXZ5IGhhY2tpbmcgYWhlYWQuCiAgKi8KIHB1YmxpYyBjbGFzcyBTdGFuZGFsb25lVXBncmFkZXJPblNTdGFibGVzVGVzdAogeworICAgIHN0YXRpYyBXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzOworCiAgICAgU3RyaW5nIGxlZ2FjeUlkID0gTGVnYWN5U1NUYWJsZVRlc3QubGVnYWN5VmVyc2lvbnNbTGVnYWN5U1NUYWJsZVRlc3QubGVnYWN5VmVyc2lvbnMubGVuZ3RoIC0gMV07CiAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KICAgICB7CiAgICAgICAgIExlZ2FjeVNTVGFibGVUZXN0LmRlZmluZVNjaGVtYSgpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoVXRpbC5BTExPV19UT09MX1JFSU5JVF9GT1JfVEVTVCwgInRydWUiKTsgLy8gTmVjZXNzYXJ5IGZvciB0ZXN0aW5nCisgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgV2l0aFByb3BlcnRpZXMoKS5zZXQoVEVTVF9VVElMX0FMTE9XX1RPT0xfUkVJTklUX0ZPUl9URVNULCB0cnVlKTsKICAgICB9CiAKICAgICBAQWZ0ZXJDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhckNsYXNzRW52KCkKICAgICB7Ci0gICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KFV0aWwuQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QpOworICAgICAgICBwcm9wZXJ0aWVzLmNsb3NlKCk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTc2LDkgKzc3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLWsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsZWdhY3lfdGFibGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGVnYWN5XyIgKyBsZWdhY3lJZCArICJfc2ltcGxlIik7Ci0gICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiRm91bmQgMSBzc3RhYmxlcyB0aGF0IG5lZWQgdXBncmFkaW5nLiIpOwotICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoImxlZ2FjeV90YWJsZXMvbGVnYWN5XyIgKyBsZWdhY3lJZCArICJfc2ltcGxlIik7Ci0gICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiLURhdGEuZGIiKTsKKyAgICAgICAgY2hlY2tVcGdyYWRlVG9vbE91dHB1dCh0b29sLCBvcmlnRmlsZXMpOwogICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7CiAKICAgICAgICAgTGlzdDxTdHJpbmc+IG5ld0ZpbGVzID0gZ2V0U1N0YWJsZUZpbGVzKCJsZWdhY3lfdGFibGVzIiwgImxlZ2FjeV8iICsgbGVnYWN5SWQgKyAiX3NpbXBsZSIpOwpAQCAtMTA1LDEzICsxMDQsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JvbmdzbmFwc2hvdCIpOwogICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIkZvdW5kIDAgc3N0YWJsZXMgdGhhdCBuZWVkIHVwZ3JhZGluZy4iKTsKIAorICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBDb2x1bW5GYW1pbHlTdG9yZS5nZXRJZkV4aXN0cygibGVnYWN5X3RhYmxlcyIsICJsZWdhY3lfIiArIGxlZ2FjeUlkICsgIl9zaW1wbGUiKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IG5hbWVzID0gY2ZzLmdldERpcmVjdG9yaWVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNzdGFibGVMaXN0ZXIoRGlyZWN0b3JpZXMuT25UeG5FcnIuSUdOT1JFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc25hcHNob3RzKCJ0ZXN0c25hcHNob3QiKS5saXN0KCkua2V5U2V0KCkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChkZXNjcmlwdG9yIC0+IGRlc2NyaXB0b3IuYmFzZUZpbGUoKS50b1N0cmluZygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwogICAgICAgICB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VDbGFzcyhTdGFuZGFsb25lVXBncmFkZXIuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsZWdhY3lfdGFibGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxlZ2FjeV8iICsgbGVnYWN5SWQgKyAiX3NpbXBsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0c25hcHNob3QiKTsKLSAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJGb3VuZCAxIHNzdGFibGVzIHRoYXQgbmVlZCB1cGdyYWRpbmcuIik7Ci0gICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygibGVnYWN5X3RhYmxlcy9sZWdhY3lfIiArIGxlZ2FjeUlkICsgIl9zaW1wbGUiKTsKLSAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCItRGF0YS5kYiIpOworICAgICAgICBjaGVja1VwZ3JhZGVUb29sT3V0cHV0KHRvb2wsIG5hbWVzKTsKKwogICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7CiAgICAgfQogCkBAIC0xMjUsOSArMTMwLDggQEAKICAgICAgICAgVG9vbFJlc3VsdCB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VDbGFzcyhTdGFuZGFsb25lVXBncmFkZXIuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxlZ2FjeV90YWJsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsZWdhY3lfIiArIGxlZ2FjeUlkICsgIl9zaW1wbGUiKTsKLSAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJGb3VuZCAxIHNzdGFibGVzIHRoYXQgbmVlZCB1cGdyYWRpbmcuIik7Ci0gICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygibGVnYWN5X3RhYmxlcy9sZWdhY3lfIiArIGxlZ2FjeUlkICsgIl9zaW1wbGUiKTsKLSAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCItRGF0YS5kYiIpOworCisgICAgICAgIGNoZWNrVXBncmFkZVRvb2xPdXRwdXQodG9vbCwgb3JpZ0ZpbGVzKTsKICAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwogCiAgICAgICAgIExpc3Q8U3RyaW5nPiBuZXdGaWxlcyA9IGdldFNTdGFibGVGaWxlcygibGVnYWN5X3RhYmxlcyIsICJsZWdhY3lfIiArIGxlZ2FjeUlkICsgIl9zaW1wbGUiKTsKQEAgLTEzOCwyMiArMTQyLDI1IEBACiAgICAgICAgIEtleXNwYWNlLm9wZW4oImxlZ2FjeV90YWJsZXMiKS5nZXRDb2x1bW5GYW1pbHlTdG9yZSgibGVnYWN5XyIgKyBsZWdhY3lJZCArICJfc2ltcGxlIikubG9hZE5ld1NTVGFibGVzKCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1VwZ3JhZGVUb29sT3V0cHV0KFRvb2xSZXN1bHQgdG9vbCwgTGlzdDxTdHJpbmc+IG5hbWVzKQorICAgIHsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJGb3VuZCAiICsgbmFtZXMuc2l6ZSgpICsgIiBzc3RhYmxlcyB0aGF0IG5lZWQgdXBncmFkaW5nLiIpOworICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogbmFtZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5tYXRjaGVzKCIoP3MpLipVcGdyYWRpbmcuKiIgKyBQYXR0ZXJuLnF1b3RlKG5hbWUpICsgIi4qIik7CisgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkubWF0Y2hlcygiKD9zKS4qVXBncmFkZSBvZi4qIiArIFBhdHRlcm4ucXVvdGUobmFtZSkgKyAiLipjb21wbGV0ZS4qIik7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBnZXRTU3RhYmxlRmlsZXMoU3RyaW5nIGtzLCBTdHJpbmcgdGFibGUpIHRocm93cyBTdGFydHVwRXhjZXB0aW9uCiAgICAgewogICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKGtzKS5nZXRDb2x1bW5GYW1pbHlTdG9yZSh0YWJsZSk7CiAgICAgICAgIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWwuZmx1c2goY2ZzKTsKICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUuc2NydWJEYXRhRGlyZWN0b3JpZXMoY2ZzLm1ldGFkYXRhKCkpOwogCi0gICAgICAgIFNldDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKTsKLSAgICAgICAgaWYgKHNzdGFibGVzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBMaXN0cy5lbXB0eUxpc3QoKTsKLQotICAgICAgICBTdHJpbmcgc3N0YWJsZUZpbGVOYW1lID0gc3N0YWJsZXMuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0RmlsZW5hbWUoKTsKLSAgICAgICAgRmlsZSBzc3RhYmxlc0RpciA9IG5ldyBGaWxlKHNzdGFibGVGaWxlTmFtZSkucGFyZW50KCk7Ci0gICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KHNzdGFibGVzRGlyLnRyeUxpc3QoKSkKLSAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQotICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmIC0+IGYuaXNGaWxlKCkpCi0gICAgICAgICAgICAgICAgICAgICAubWFwKGZpbGUgLT4gZmlsZS50b1N0cmluZygpKQotICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIHJldHVybiBjZnMuZ2V0RGlyZWN0b3JpZXMoKQorICAgICAgICAgICAgICAgICAgLnNzdGFibGVMaXN0ZXIoRGlyZWN0b3JpZXMuT25UeG5FcnIuSUdOT1JFKS5saXN0KCkua2V5U2V0KCkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgIC5tYXAoZGVzY3JpcHRvciAtPiBkZXNjcmlwdG9yLmJhc2VGaWxlKCkudG9TdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TdGFuZGFsb25lVmVyaWZpZXJPblNTVGFibGVzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1N0YW5kYWxvbmVWZXJpZmllck9uU1NUYWJsZXNUZXN0LmphdmEKaW5kZXggNjVkZDEyNS4uYjFlYjEzOSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1N0YW5kYWxvbmVWZXJpZmllck9uU1NUYWJsZXNUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1N0YW5kYWxvbmVWZXJpZmllck9uU1NUYWJsZXNUZXN0LmphdmEKQEAgLTI5LDEyICsyOSwxNiBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlVwZGF0ZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5QYXJ0aXRpb25Qb3NpdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5XaXRoUHJvcGVydGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlZlcmlmeVRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ1RhYmxlVmVyaWZpZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuVG9vbFJ1bm5lci5Ub29sUmVzdWx0OwpAQCAtNDIsMjggKzQ2LDMxIEBACiBpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfVVRJTF9BTExPV19UT09MX1JFSU5JVF9GT1JfVEVTVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIC8qKgogICogQ2xhc3MgdGhhdCB0ZXN0cyB0YWJsZXMgZm9yIHtAbGluayBTdGFuZGFsb25lVmVyaWZpZXJ9IGJ5IHVwZGF0aW5nIHVzaW5nIHtAbGluayBTY2hlbWFMb2FkZXJ9CiAgKiBTaW1pbGFyIGluIHZlaW4gdG8gb3RoZXIge0BsaW5rIFNjaGVtYUxvYWRlcn0gdHlwZSB0ZXN0cywgYXMgd2VsbCBhcyB7QGxpbmsgU3RhbmRhbG9uZVVwZ3JhZGVyT25TU3RhYmxlc1Rlc3R9LgotICogU2luY2UgdGhlIHRvb2wgbWFpbmx5IGV4ZXJjaXNlcyB0aGUge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uVmVyaWZpZXJ9LCB3ZSBlbGVjdCB0bwotICogbm90IHJ1biBldmVyeSBjb25jZWl2YWJsZSBvcHRpb24gYXMgbWFueSB0ZXN0cyBhcmUgYWxyZWFkeSBjb3ZlcmVkIGJ5IHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5WZXJpZnlUZXN0fS4KKyAqIFNpbmNlIHRoZSB0b29sIG1haW5seSBleGVyY2lzZXMgdGhlIHtAbGluayBCaWdUYWJsZVZlcmlmaWVyfSwgd2UgZWxlY3QgdG8KKyAqIG5vdCBydW4gZXZlcnkgY29uY2VpdmFibGUgb3B0aW9uIGFzIG1hbnkgdGVzdHMgYXJlIGFscmVhZHkgY292ZXJlZCBieSB7QGxpbmsgVmVyaWZ5VGVzdH0uCiAgKiAKICAqIE5vdGU6IHRoZSBjb21wbGV0ZSBjb3ZlcmFnZSBpcyBjb21wb3NlZCBvZjoKICAqIC0ge0BsaW5rIFN0YW5kYWxvbmVWZXJpZmllck9uU1NUYWJsZXNUZXN0fQogICogLSB7QGxpbmsgU3RhbmRhbG9uZVZlcmlmaWVyVGVzdH0KLSAqIC0ge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlZlcmlmeVRlc3R9CisgKiAtIHtAbGluayBWZXJpZnlUZXN0fQogICovCiBwdWJsaWMgY2xhc3MgU3RhbmRhbG9uZVZlcmlmaWVyT25TU1RhYmxlc1Rlc3QgZXh0ZW5kcyBPZmZsaW5lVG9vbFV0aWxzCiB7CisgICAgc3RhdGljIFdpdGhQcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXAoKQogICAgIHsKICAgICAgICAgLy8gc2luY2UgbGVnYWN5IHRhYmxlcyB0ZXN0IGRhdGEgdXNlcyBCeXRlT3JkZXJlZFBhcnRpdGlvbmVyIHRoYXQncyB3aGF0IHdlIG5lZWQKICAgICAgICAgLy8gZm9yIHRoZSBjaGVjayB2ZXJzaW9uIHRvIHdvcmsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEucGFydGl0aW9uZXIiLCAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXIiKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFV0aWwuQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QsICJ0cnVlIik7IC8vIE5lY2Vzc2FyeSBmb3IgdGVzdGluZ2AKKyAgICAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlBBUlRJVElPTkVSLnNldFN0cmluZygib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXIiKTsKKyAgICAgICAgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChURVNUX1VUSUxfQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QsIHRydWUpOwogICAgICAgICBTY2hlbWFMb2FkZXIubG9hZFNjaGVtYSgpOwogICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5pbml0U2VydmVyKCk7CiAgICAgfQpAQCAtNzIsNyArNzksNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyZG93bigpIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIFNjaGVtYUxvYWRlci5jbGVhbnVwQW5kTGVhdmVEaXJzKCk7Ci0gICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KFV0aWwuQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QpOworICAgICAgICBwcm9wZXJ0aWVzLmNsb3NlKCk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTEyOSw3ICsxMzYsNyBAQAogICAgICAgICBTdHJpbmcgY29ycnVwdFN0YXRzVGFibGUgPSAiY29ycnVwdFN0YXRzVGFibGUiOwogICAgICAgICBjcmVhdGVBbmRQb3B1bGF0ZVRhYmxlKGtleXNwYWNlTmFtZSwgY29ycnVwdFN0YXRzVGFibGUsIGNmcyAtPiB7CiAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgICAgICB0cnkgKFJhbmRvbUFjY2Vzc0ZpbGUgZmlsZSA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuU1RBVFMpLCAicnciKSkKKyAgICAgICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzRmlsZSBmaWxlID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5TVEFUUykudG9KYXZhSU9GaWxlKCksICJydyIpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZpbGUuc2VlaygwKTsKICAgICAgICAgICAgICAgICBmaWxlLndyaXRlQnl0ZXMoU3RyaW5nVXRpbHMucmVwZWF0KCd6JywgMikpOwpAQCAtMTUwLDggKzE1Nyw4IEBACiAKICAgICAgICAgY3JlYXRlQW5kUG9wdWxhdGVUYWJsZShrZXlzcGFjZU5hbWUsIGNvcnJ1cHREYXRhVGFibGUsIGNmcyAtPiB7CiAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgICAgICBsb25nIHJvdzBTdGFydCA9IHNzdGFibGUuZ2V0UG9zaXRpb24oUGFydGl0aW9uUG9zaXRpb24uRm9yS2V5LmdldChCeXRlQnVmZmVyVXRpbC5ieXRlcygiMCIpLCBjZnMuZ2V0UGFydGl0aW9uZXIoKSksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpLnBvc2l0aW9uOwotICAgICAgICAgICAgbG9uZyByb3cxU3RhcnQgPSBzc3RhYmxlLmdldFBvc2l0aW9uKFBhcnRpdGlvblBvc2l0aW9uLkZvcktleS5nZXQoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjEiKSwgY2ZzLmdldFBhcnRpdGlvbmVyKCkpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKS5wb3NpdGlvbjsKKyAgICAgICAgICAgIGxvbmcgcm93MFN0YXJ0ID0gc3N0YWJsZS5nZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbi5Gb3JLZXkuZ2V0KEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCIwIiksIGNmcy5nZXRQYXJ0aXRpb25lcigpKSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgICAgICBsb25nIHJvdzFTdGFydCA9IHNzdGFibGUuZ2V0UG9zaXRpb24oUGFydGl0aW9uUG9zaXRpb24uRm9yS2V5LmdldChCeXRlQnVmZmVyVXRpbC5ieXRlcygiMSIpLCBjZnMuZ2V0UGFydGl0aW9uZXIoKSksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOwogICAgICAgICAgICAgbG9uZyBzdGFydFBvc2l0aW9uID0gTWF0aC5taW4ocm93MFN0YXJ0LCByb3cxU3RhcnQpOwogCiAgICAgICAgICAgICB0cnkgKFJhbmRvbUFjY2Vzc0ZpbGUgZmlsZSA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKHNzdGFibGUuZ2V0RmlsZW5hbWUoKSwgInJ3IikpCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVZlcmlmaWVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1N0YW5kYWxvbmVWZXJpZmllclRlc3QuamF2YQppbmRleCA5ZDhmNzk3Li5mOTRhNWQ2IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVZlcmlmaWVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TdGFuZGFsb25lVmVyaWZpZXJUZXN0LmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5WZXJpZnlUZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlRvb2xSdW5uZXIuVG9vbFJlc3VsdDsKIGltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOwogaW1wb3J0IG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnM7CkBAIC0zMyw3ICszNCw3IEBACiAgKiBOb3RlOiB0aGUgY29tcGxldGUgY292ZXJhZ2UgaXMgY29tcG9zZWQgb2Y6CiAgKiAtIHtAbGluayBTdGFuZGFsb25lVmVyaWZpZXJPblNTVGFibGVzVGVzdH0KICAqIC0ge0BsaW5rIFN0YW5kYWxvbmVWZXJpZmllclRlc3R9Ci0gKiAtIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5WZXJpZnlUZXN0fQorICogLSB7QGxpbmsgVmVyaWZ5VGVzdH0KICovCiBwdWJsaWMgY2xhc3MgU3RhbmRhbG9uZVZlcmlmaWVyVGVzdCBleHRlbmRzIE9mZmxpbmVUb29sVXRpbHMKIHsKQEAgLTIxOSw0ICsyMjAsNCBAQAogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRvb2wuZ2V0RXhpdENvZGUoKSk7CiAgICAgICAgIH0pOwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvVG9vbFJ1bm5lci5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1Rvb2xSdW5uZXIuamF2YQppbmRleCBlM2I5NTk1Li5kM2I5ZjEwIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvVG9vbFJ1bm5lci5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9Ub29sUnVubmVyLmphdmEKQEAgLTQwMiw3ICs0MDIsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBTdHJpbmcgcmF3ID0gZ2V0U3RkZXJyKCk7CiAgICAgICAgICAgICBTdHJpbmcgY2xlYW5lZCA9IGdldENsZWFuZWRTdGRlcnIoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byBjbGVhbiBzdGRlcnIgY29tcGxldGVseS5cblJhdyAobGVuZ3RoPSIgKyByYXcubGVuZ3RoKCkgKyAiKTpcbiIgKyByYXcgKyAKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byBjbGVhbiBzdGRlcnIgY29tcGxldGVseS5cblJhdyAobGVuZ3RoPSIgKyByYXcubGVuZ3RoKCkgKyAiKTpcbiIgKyByYXcgKwogICAgICAgICAgICAgICAgICAgICAgICAiXG5DbGVhbmVkIChsZW5ndGg9IiArIGNsZWFuZWQubGVuZ3RoKCkgKyAiKTpcbiIgKyBjbGVhbmVkLAogICAgICAgICAgICAgICAgICAgICAgICBjbGVhbmVkLnRyaW0oKS5pc0VtcHR5KCkpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvVG9vbHNTY2hlbWFMb2FkaW5nVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1Rvb2xzU2NoZW1hTG9hZGluZ1Rlc3QuamF2YQppbmRleCAxYTk5NjQzLi5kMjM4MzI3IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvVG9vbHNTY2hlbWFMb2FkaW5nVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9Ub29sc1NjaGVtYUxvYWRpbmdUZXN0LmphdmEKQEAgLTM0LDcgKzM0LDcgQEAKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpLCBDb3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmdJZ25vcmluZ0Nhc2UoInVzYWdlOiIpKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldENsZWFuZWRTdGRlcnIoKSwgQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nSWdub3JpbmdDYXNlKCJNaXNzaW5nIGFyZ3VtZW50cyIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRvb2wuZ2V0RXhpdENvZGUoKSk7Ci0gICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKG51bGwpOworICAgICAgICBhc3NlcnROb1VuZXhwZWN0ZWRUaHJlYWRzU3RhcnRlZChudWxsLCBmYWxzZSk7CiAgICAgICAgIGFzc2VydFNjaGVtYU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRDTFNNTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydFN5c3RlbUtTTm90TG9hZGVkKCk7CkBAIC00OSw3ICs0OSw3IEBACiAgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSwgQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nSWdub3JpbmdDYXNlKCJ1c2FnZToiKSk7CiAgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCksIENvcmVNYXRjaGVycy5jb250YWluc1N0cmluZ0lnbm9yaW5nQ2FzZSgiTWlzc2luZyBhcmd1bWVudHMiKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCB0b29sLmdldEV4aXRDb2RlKCkpOwotICAgICAgICBhc3NlcnROb1VuZXhwZWN0ZWRUaHJlYWRzU3RhcnRlZChudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQobnVsbCwgZmFsc2UpOwogICAgICAgICBhc3NlcnRTY2hlbWFOb3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0Q0xTTU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRTeXN0ZW1LU05vdExvYWRlZCgpOwpAQCAtNjQsNyArNjQsNyBAQAogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCksIENvcmVNYXRjaGVycy5jb250YWluc1N0cmluZ0lnbm9yaW5nQ2FzZSgidXNhZ2U6IikpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0Q2xlYW5lZFN0ZGVycigpLCBDb3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmdJZ25vcmluZ0Nhc2UoIk5vIHNzdGFibGVzIHRvIHNwbGl0IikpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdG9vbC5nZXRFeGl0Q29kZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQobnVsbCk7CisgICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKG51bGwsIGZhbHNlKTsKICAgICAgICAgYXNzZXJ0U2NoZW1hTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydENMU01Ob3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0U3lzdGVtS1NOb3RMb2FkZWQoKTsKQEAgLTc5LDcgKzc5LDcgQEAKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpLCBDb3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmdJZ25vcmluZ0Nhc2UoInVzYWdlOiIpKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldENsZWFuZWRTdGRlcnIoKSwgQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nSWdub3JpbmdDYXNlKCJNaXNzaW5nIGFyZ3VtZW50cyIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRvb2wuZ2V0RXhpdENvZGUoKSk7Ci0gICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKG51bGwpOworICAgICAgICBhc3NlcnROb1VuZXhwZWN0ZWRUaHJlYWRzU3RhcnRlZChudWxsLCBmYWxzZSk7CiAgICAgICAgIGFzc2VydFNjaGVtYU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRDTFNNTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydFN5c3RlbUtTTm90TG9hZGVkKCk7CkBAIC05NCw3ICs5NCw3IEBACiAgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSwgQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nSWdub3JpbmdDYXNlKCJ1c2FnZToiKSk7CiAgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCksIENvcmVNYXRjaGVycy5jb250YWluc1N0cmluZ0lnbm9yaW5nQ2FzZSgiTWlzc2luZyBhcmd1bWVudHMiKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCB0b29sLmdldEV4aXRDb2RlKCkpOwotICAgICAgICBhc3NlcnROb1VuZXhwZWN0ZWRUaHJlYWRzU3RhcnRlZChudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQobnVsbCwgZmFsc2UpOwogICAgICAgICBhc3NlcnRTY2hlbWFOb3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0Q0xTTU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRTeXN0ZW1LU05vdExvYWRlZCgpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1RvcFBhcnRpdGlvbnNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvVG9wUGFydGl0aW9uc1Rlc3QuamF2YQppbmRleCA5NzVhZDE1Li5kOWNmZGVlIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvVG9wUGFydGl0aW9uc1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvVG9wUGFydGl0aW9uc1Rlc3QuamF2YQpAQCAtMTgsMTYgKzE4LDIwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHM7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5Db21wb3NpdGVEYXRhOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuVW5pbnRlcnJ1cHRpYmxlczsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTM2LDE4ICs0MCwzMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlN5c3RlbUtleXNwYWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlNhbXBsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiAKIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCisvKioKKyAqIEluY2x1ZGVzIHRlc3QgY2FzZXMgZm9yIGJvdGggdGhlICd0b3BwYXJ0aXRpb25zJyBjb21tYW5kIGFuZCBpdHMgc3VjY2Vzc29yICdwcm9maWxlbG9hZCcKKyAqLwogcHVibGljIGNsYXNzIFRvcFBhcnRpdGlvbnNUZXN0CiB7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZU1BBQ0UgPSBUb3BQYXJ0aXRpb25zVGVzdC5jbGFzcy5nZXRTaW1wbGVOYW1lKCkudG9Mb3dlckNhc2UoKTsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBUQUJMRSA9ICJ0ZXN0IjsKKwogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KICAgICB7CiAgICAgICAgIFNjaGVtYUxvYWRlci5wcmVwYXJlU2VydmVyKCk7CisgICAgICAgIFNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZShLRVlTUEFDRSwgS2V5c3BhY2VQYXJhbXMuc2ltcGxlKDEpKTsKKyAgICAgICAgZXhlY3V0ZUludGVybmFsKGZvcm1hdCgiQ1JFQVRFIFRBQkxFICVzLiVzIChrIHRleHQsIGMgdGV4dCwgdiB0ZXh0LCBQUklNQVJZIEtFWSAoaywgYykpIiwgS0VZU1BBQ0UsIFRBQkxFKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTU5LDcgKzc1LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcS5wdXQoU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2Uuc2FtcGxlUGFydGl0aW9ucygxMDAwLCAxMDAsIDEwLCBMaXN0cy5uZXdBcnJheUxpc3QoIlJFQURTIiwgIldSSVRFUyIpKSk7CisgICAgICAgICAgICAgICAgcS5wdXQoU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2Uuc2FtcGxlUGFydGl0aW9ucyhudWxsLCAxMDAwLCAxMDAsIDEwLCBMaXN0cy5uZXdBcnJheUxpc3QoIlJFQURTIiwgIldSSVRFUyIpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCiAgICAgICAgICAgICB7CkBAIC04Miw0ICs5OCwxMzIgQEAKICAgICAgICAgTGlzdDxDb21wb3NpdGVEYXRhPiByZXN1bHQgPSBDb2x1bW5GYW1pbHlTdG9yZS5nZXRJZkV4aXN0cygic3lzdGVtIiwgImxvY2FsIikuZmluaXNoTG9jYWxTYW1wbGluZygiUkVBRFMiLCA1KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJZiB0aGlzIGZhaWxlZCB5b3UgcHJvYmFibHkgaGF2ZSB0byByYWlzZSB0aGUgYmVnaW5Mb2NhbFNhbXBsaW5nIGR1cmF0aW9uIiwgMSwgcmVzdWx0LnNpemUoKSk7CiAgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9wUGFydGl0aW9uc1Jvd1RvbWJzdG9uZUFuZFNTVGFibGVDb3VudCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGludCBjb3VudCA9IDEwOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBDb2x1bW5GYW1pbHlTdG9yZS5nZXRJZkV4aXN0cyhLRVlTUEFDRSwgVEFCTEUpOworICAgICAgICBjZnMuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisKKyAgICAgICAgZXhlY3V0ZUludGVybmFsKGZvcm1hdCgiSU5TRVJUIElOVE8gJXMuJXMoayxjLHYpIFZBTFVFUyAoJ2EnLCAnYScsICdhJykiLCBLRVlTUEFDRSwgVEFCTEUpKTsKKyAgICAgICAgZXhlY3V0ZUludGVybmFsKGZvcm1hdCgiSU5TRVJUIElOVE8gJXMuJXMoayxjLHYpIFZBTFVFUyAoJ2EnLCAnYicsICdhJykiLCBLRVlTUEFDRSwgVEFCTEUpKTsKKyAgICAgICAgY2ZzLmZvcmNlQmxvY2tpbmdGbHVzaChDb2x1bW5GYW1pbHlTdG9yZS5GbHVzaFJlYXNvbi5VTklUX1RFU1RTKTsKKworICAgICAgICBleGVjdXRlSW50ZXJuYWwoZm9ybWF0KCJJTlNFUlQgSU5UTyAlcy4lcyhrLGMsdikgVkFMVUVTICgnYScsICdjJywgJ2EnKSIsIEtFWVNQQUNFLCBUQUJMRSkpOworICAgICAgICBleGVjdXRlSW50ZXJuYWwoZm9ybWF0KCJJTlNFUlQgSU5UTyAlcy4lcyhrLGMsdikgVkFMVUVTICgnYicsICdiJywgJ2InKSIsIEtFWVNQQUNFLCBUQUJMRSkpOworICAgICAgICBleGVjdXRlSW50ZXJuYWwoZm9ybWF0KCJJTlNFUlQgSU5UTyAlcy4lcyhrLGMsdikgVkFMVUVTICgnYycsICdjJywgJ2MnKSIsIEtFWVNQQUNFLCBUQUJMRSkpOworICAgICAgICBleGVjdXRlSW50ZXJuYWwoZm9ybWF0KCJJTlNFUlQgSU5UTyAlcy4lcyhrLGMsdikgVkFMVUVTICgnYycsICdkJywgJ2EnKSIsIEtFWVNQQUNFLCBUQUJMRSkpOworICAgICAgICBleGVjdXRlSW50ZXJuYWwoZm9ybWF0KCJJTlNFUlQgSU5UTyAlcy4lcyhrLGMsdikgVkFMVUVTICgnYycsICdlJywgJ2EnKSIsIEtFWVNQQUNFLCBUQUJMRSkpOworICAgICAgICBleGVjdXRlSW50ZXJuYWwoZm9ybWF0KCJERUxFVEUgRlJPTSAlcy4lcyBXSEVSRSBrPSdhJyBBTkQgYz0nYSciLCBLRVlTUEFDRSwgVEFCTEUpKTsKKyAgICAgICAgY2ZzLmZvcmNlQmxvY2tpbmdGbHVzaChDb2x1bW5GYW1pbHlTdG9yZS5GbHVzaFJlYXNvbi5VTklUX1RFU1RTKTsKKworICAgICAgICAvLyB0ZXN0IG11bHRpLXBhcnRpdGlvbiByZWFkCisgICAgICAgIGNmcy5iZWdpbkxvY2FsU2FtcGxpbmcoIlJFQURfUk9XX0NPVU5UIiwgY291bnQsIDI0MDAwMCk7CisgICAgICAgIGNmcy5iZWdpbkxvY2FsU2FtcGxpbmcoIlJFQURfVE9NQlNUT05FX0NPVU5UIiwgY291bnQsIDI0MDAwMCk7CisgICAgICAgIGNmcy5iZWdpbkxvY2FsU2FtcGxpbmcoIlJFQURfU1NUQUJMRV9DT1VOVCIsIGNvdW50LCAyNDAwMDApOworCisgICAgICAgIGV4ZWN1dGVJbnRlcm5hbChmb3JtYXQoIlNFTEVDVCAqIEZST00gJXMuJXMiLCBLRVlTUEFDRSwgVEFCTEUpKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOyAvLyBzaW11bGF0ZSB3YWl0aW5nIGJlZm9yZSBmaW5pc2hpbmcgc2FtcGxpbmcKKworICAgICAgICBMaXN0PENvbXBvc2l0ZURhdGE+IHJvd0NvdW50cyA9IGNmcy5maW5pc2hMb2NhbFNhbXBsaW5nKCJSRUFEX1JPV19DT1VOVCIsIGNvdW50KTsKKyAgICAgICAgTGlzdDxDb21wb3NpdGVEYXRhPiB0c0NvdW50cyA9IGNmcy5maW5pc2hMb2NhbFNhbXBsaW5nKCJSRUFEX1RPTUJTVE9ORV9DT1VOVCIsIGNvdW50KTsKKyAgICAgICAgTGlzdDxDb21wb3NpdGVEYXRhPiBzc3RDb3VudHMgPSBjZnMuZmluaXNoTG9jYWxTYW1wbGluZygiUkVBRF9TU1RBQkxFX0NPVU5UIiwgY291bnQpOworCisgICAgICAgIGFzc2VydEVxdWFscygwLCBzc3RDb3VudHMuc2l6ZSgpKTsgLy8gbm90IHRyYWNrZWQgb24gcmFuZ2UgcmVhZHMKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJvd0NvdW50cy5zaXplKCkpOyAvLyAzIHBhcnRpdGlvbnMgcmVhZCAoYSwgYiwgYykKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRzQ291bnRzLnNpemUoKSk7IC8vIDEgcGFydGl0aW9uIHcgdG9tYnN0b25lcyAoYSkKKworICAgICAgICBmb3IgKENvbXBvc2l0ZURhdGEgZGF0YSA6IHJvd0NvdW50cykKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHBhcnRpdGlvbktleSA9IChTdHJpbmcpIGRhdGEuZ2V0KCJ2YWx1ZSIpOworICAgICAgICAgICAgbG9uZyBudW1Sb3dzID0gKGxvbmcpIGRhdGEuZ2V0KCJjb3VudCIpOworICAgICAgICAgICAgaWYgKHBhcnRpdGlvbktleS5lcXVhbHNJZ25vcmVDYXNlKCJhIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG51bVJvd3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFydGl0aW9uS2V5LmVxdWFsc0lnbm9yZUNhc2UoImIiKSkKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbnVtUm93cyk7CisgICAgICAgICAgICBlbHNlIGlmIChwYXJ0aXRpb25LZXkuZXF1YWxzSWdub3JlQ2FzZSgiYyIpKQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCBudW1Sb3dzKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHRzQ291bnRzLmdldCgwKS5nZXQoInZhbHVlIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgKGxvbmcpIHRzQ291bnRzLmdldCgwKS5nZXQoImNvdW50IikpOworCisgICAgICAgIC8vIHRlc3Qgc2luZ2xlIHBhcnRpdGlvbiByZWFkCisgICAgICAgIGNmcy5iZWdpbkxvY2FsU2FtcGxpbmcoIlJFQURfUk9XX0NPVU5UIiwgY291bnQsIDI0MDAwMCk7CisgICAgICAgIGNmcy5iZWdpbkxvY2FsU2FtcGxpbmcoIlJFQURfVE9NQlNUT05FX0NPVU5UIiwgY291bnQsIDI0MDAwMCk7CisgICAgICAgIGNmcy5iZWdpbkxvY2FsU2FtcGxpbmcoIlJFQURfU1NUQUJMRV9DT1VOVCIsIGNvdW50LCAyNDAwMDApOworCisgICAgICAgIGV4ZWN1dGVJbnRlcm5hbChmb3JtYXQoIlNFTEVDVCAqIEZST00gJXMuJXMgV0hFUkUgaz0nYSciLCBLRVlTUEFDRSwgVEFCTEUpKTsKKyAgICAgICAgZXhlY3V0ZUludGVybmFsKGZvcm1hdCgiU0VMRUNUICogRlJPTSAlcy4lcyBXSEVSRSBrPSdiJyIsIEtFWVNQQUNFLCBUQUJMRSkpOworICAgICAgICBleGVjdXRlSW50ZXJuYWwoZm9ybWF0KCJTRUxFQ1QgKiBGUk9NICVzLiVzIFdIRVJFIGs9J2MnIiwgS0VZU1BBQ0UsIFRBQkxFKSk7CisgICAgICAgIFRocmVhZC5zbGVlcCgyMDAwKTsgLy8gc2ltdWxhdGUgd2FpdGluZyBiZWZvcmUgZmluaXNoaW5nIHNhbXBsaW5nCisKKyAgICAgICAgcm93Q291bnRzID0gY2ZzLmZpbmlzaExvY2FsU2FtcGxpbmcoIlJFQURfUk9XX0NPVU5UIiwgY291bnQpOworICAgICAgICB0c0NvdW50cyA9IGNmcy5maW5pc2hMb2NhbFNhbXBsaW5nKCJSRUFEX1RPTUJTVE9ORV9DT1VOVCIsIGNvdW50KTsKKyAgICAgICAgc3N0Q291bnRzID0gY2ZzLmZpbmlzaExvY2FsU2FtcGxpbmcoIlJFQURfU1NUQUJMRV9DT1VOVCIsIGNvdW50KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMywgc3N0Q291bnRzLnNpemUoKSk7IC8vIDMgcGFydGl0aW9ucyByZWFkCisgICAgICAgIGFzc2VydEVxdWFscygzLCByb3dDb3VudHMuc2l6ZSgpKTsgLy8gMyBwYXJ0aXRpb25zIHJlYWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRzQ291bnRzLnNpemUoKSk7ICAvLyAzIHBhcnRpdGlvbnMgcmVhZCBvbmx5IG9uZSBjb250YWluaW5nIHRvbWJzdG9uZXMKKworICAgICAgICBmb3IgKENvbXBvc2l0ZURhdGEgZGF0YSA6IHNzdENvdW50cykKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHBhcnRpdGlvbktleSA9IChTdHJpbmcpIGRhdGEuZ2V0KCJ2YWx1ZSIpOworICAgICAgICAgICAgbG9uZyBudW1Sb3dzID0gKGxvbmcpIGRhdGEuZ2V0KCJjb3VudCIpOworICAgICAgICAgICAgaWYgKHBhcnRpdGlvbktleS5lcXVhbHNJZ25vcmVDYXNlKCJhIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG51bVJvd3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFydGl0aW9uS2V5LmVxdWFsc0lnbm9yZUNhc2UoImIiKSkKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbnVtUm93cyk7CisgICAgICAgICAgICBlbHNlIGlmIChwYXJ0aXRpb25LZXkuZXF1YWxzSWdub3JlQ2FzZSgiYyIpKQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBudW1Sb3dzKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoQ29tcG9zaXRlRGF0YSBkYXRhIDogcm93Q291bnRzKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgcGFydGl0aW9uS2V5ID0gKFN0cmluZykgZGF0YS5nZXQoInZhbHVlIik7CisgICAgICAgICAgICBsb25nIG51bVJvd3MgPSAobG9uZykgZGF0YS5nZXQoImNvdW50Iik7CisgICAgICAgICAgICBpZiAocGFydGl0aW9uS2V5LmVxdWFsc0lnbm9yZUNhc2UoImEiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbnVtUm93cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJ0aXRpb25LZXkuZXF1YWxzSWdub3JlQ2FzZSgiYiIpKQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBudW1Sb3dzKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcnRpdGlvbktleS5lcXVhbHNJZ25vcmVDYXNlKCJjIikpCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG51bVJvd3MpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgdHNDb3VudHMuZ2V0KDApLmdldCgidmFsdWUiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCAobG9uZykgdHNDb3VudHMuZ2V0KDApLmdldCgiY291bnQiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRBbmRTdG9wU2NoZWR1bGVkU2FtcGxpbmcoKQorICAgIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGFsbFNhbXBsZXJzID0gQXJyYXlzLnN0cmVhbShTYW1wbGVyLlNhbXBsZXJUeXBlLnZhbHVlcygpKS5tYXAoRW51bTo6dG9TdHJpbmcpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIFN0b3JhZ2VTZXJ2aWNlIHNzID0gU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2U7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU2NoZWR1bGluZyBuZXcgc2FtcGxlZCB0YXNrcyBzaG91bGQgYmUgYWxsb3dlZCIsCisgICAgICAgICAgICAgICAgICAgc3Muc3RhcnRTYW1wbGluZ1BhcnRpdGlvbnMobnVsbCwgbnVsbCwgMTAsIDEwLCAxMDAsIDEwLCBhbGxTYW1wbGVycykpOworCisgICAgICAgIGFzc2VydEVxdWFscyhDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCIqLioiKSwgc3MuZ2V0U2FtcGxlVGFza3MoKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlNhbXBsaW5nIHdpdGggZHVwbGljYXRlIGtleXMgc2hvdWxkIGJlIGRpc2FsbG93ZWQiLAorICAgICAgICAgICAgICAgICAgICBzcy5zdGFydFNhbXBsaW5nUGFydGl0aW9ucyhudWxsLCBudWxsLCAyMCwgMjAsIDEwMCwgMTAsIGFsbFNhbXBsZXJzKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhpc3Rpbmcgc2NoZWR1bGVkIHNhbXBsaW5nIHRhc2tzIHNob3VsZCBiZSBjYW5jZWxsYWJsZSIsIHNzLnN0b3BTYW1wbGluZ1BhcnRpdGlvbnMobnVsbCwgbnVsbCkpOworCisgICAgICAgIGludCB0aW1lb3V0ID0gMTA7CisgICAgICAgIHdoaWxlICh0aW1lb3V0LS0gPiAwICYmIHNzLmdldFNhbXBsZVRhc2tzKCkuc2l6ZSgpID4gMCkKKyAgICAgICAgICAgIFVuaW50ZXJydXB0aWJsZXMuc2xlZXBVbmludGVycnVwdGlibHkoMTAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTY2hlZHVsZWQgc2FtcGxlZCB0YXNrcyBzaG91bGQgYmUgcmVtb3ZlZCIsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBzcy5nZXRTYW1wbGVUYXNrcygpKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJXaGVuIG5vdGhpbmcgaXMgc2NoZWR1bGVkLCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gc3RvcCBhbGwgc2NoZWR1bGVkIHNhbXBsaW5nIHRhc2tzIiwKKyAgICAgICAgICAgICAgICAgICBzcy5zdG9wU2FtcGxpbmdQYXJ0aXRpb25zKG51bGwsIG51bGwpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvQ2xlYXJTbmFwc2hvdFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9DbGVhclNuYXBzaG90VGVzdC5qYXZhCmluZGV4IDBlMTcyZjMuLjM3OWQwMmEgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9DbGVhclNuYXBzaG90VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9DbGVhclNuYXBzaG90VGVzdC5qYXZhCkBAIC0xOSw3ICsxOSwxNCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5ub2RldG9vbDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLnRpbWUuSW5zdGFudDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIGltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5UYWJ1bGFyRGF0YTsKIAogaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOwpAQCAtMjcsMTkgKzM0LDM0IEBACiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5zbmFwc2hvdC5TbmFwc2hvdE1hbmlmZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLk5vZGVQcm9iZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ub29sUnVubmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlRvb2xSdW5uZXIuVG9vbFJlc3VsdDsKIAoraW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgamF2YS50aW1lLnRlbXBvcmFsLkNocm9ub1VuaXQuSE9VUlM7CitpbXBvcnQgc3RhdGljIGphdmEudGltZS50ZW1wb3JhbC5DaHJvbm9Vbml0LlNFQ09ORFM7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eU1hcDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvci5nZXRBbGxEYXRhRmlsZUxvY2F0aW9uczsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLmN1cnJlbnRUaW1lTWlsbGlzOwogaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5hd2FpdGlsaXR5LkF3YWl0aWxpdHkuYXdhaXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogcHVibGljIGNsYXNzIENsZWFyU25hcHNob3RUZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBEQVNIX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIi0iKTsKICAgICBwcml2YXRlIHN0YXRpYyBOb2RlUHJvYmUgcHJvYmU7CiAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewogICAgICAgICBzdGFydEpNWFNlcnZlcigpOworICAgICAgICByZXF1aXJlTmV0d29yaygpOwogICAgICAgICBwcm9iZSA9IG5ldyBOb2RlUHJvYmUoam14SG9zdCwgam14UG9ydCk7CiAgICAgfQogCkBAIC01MCw2MiArNzIsMjU0IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJTbmFwc2hvdF9Ob0FyZ3MoKQotICAgIHsKLSAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJjbGVhcnNuYXBzaG90Iik7Ci0gICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRFeGl0Q29kZSgpKS5pc0VxdWFsVG8oMik7Ci0gICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmNvbnRhaW5zKCJTcGVjaWZ5IHNuYXBzaG90IG5hbWUgb3IgLS1hbGwiKTsKLSAgICAgICAgCi0gICAgICAgIHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJjbGVhcnNuYXBzaG90IiwgIi0tYWxsIik7Ci0gICAgICAgIHRvb2wuYXNzZXJ0T25DbGVhbkV4aXQoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhclNuYXBzaG90X0FsbEFuZE5hbWUoKQotICAgIHsKLSAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJjbGVhcnNuYXBzaG90IiwgIi10IiwgInNvbWUtbmFtZSIsICItLWFsbCIpOwotICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0RXhpdENvZGUoKSkuaXNFcXVhbFRvKDIpOwotICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0Q2xlYW5lZFN0ZGVycigpKS5jb250YWlucygiU3BlY2lmeSBvbmx5IG9uZSBvZiBzbmFwc2hvdCBuYW1lIG9yIC0tYWxsIik7Ci0gICAgfQotCi0gICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJTbmFwc2hvdF9SZW1vdmVCeU5hbWUoKQogICAgIHsKLSAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJzbmFwc2hvdCIsIi10Iiwic29tZS1uYW1lIik7CisgICAgICAgIFRvb2xSZXN1bHQgdG9vbCA9IGludm9rZU5vZGV0b29sKCJzbmFwc2hvdCIsICItdCIsICJzb21lLW5hbWUiKTsKICAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmlzTm90RW1wdHkoKTsKLSAgICAgICAgCi0gICAgICAgIE1hcDxTdHJpbmcsIFRhYnVsYXJEYXRhPiBzbmFwc2hvdHNfYmVmb3JlID0gcHJvYmUuZ2V0U25hcHNob3REZXRhaWxzKCk7CisKKyAgICAgICAgTWFwPFN0cmluZywgVGFidWxhckRhdGE+IHNuYXBzaG90c19iZWZvcmUgPSBwcm9iZS5nZXRTbmFwc2hvdERldGFpbHMoZW1wdHlNYXAoKSk7CiAgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzX2JlZm9yZSkuY29udGFpbnNLZXkoInNvbWUtbmFtZSIpOwogCi0gICAgICAgIHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJjbGVhcnNuYXBzaG90IiwiLXQiLCJzb21lLW5hbWUiKTsKKyAgICAgICAgdG9vbCA9IGludm9rZU5vZGV0b29sKCJjbGVhcnNuYXBzaG90IiwgIi10IiwgInNvbWUtbmFtZSIpOwogICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7CiAgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuaXNOb3RFbXB0eSgpOwotICAgICAgICAKLSAgICAgICAgTWFwPFN0cmluZywgVGFidWxhckRhdGE+IHNuYXBzaG90c19hZnRlciA9IHByb2JlLmdldFNuYXBzaG90RGV0YWlscygpOworCisgICAgICAgIE1hcDxTdHJpbmcsIFRhYnVsYXJEYXRhPiBzbmFwc2hvdHNfYWZ0ZXIgPSBwcm9iZS5nZXRTbmFwc2hvdERldGFpbHMoZW1wdHlNYXAoKSk7CiAgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzX2FmdGVyKS5kb2VzTm90Q29udGFpbktleSgic29tZS1uYW1lIik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJTbmFwc2hvdF9SZW1vdmVNdWx0aXBsZSgpCiAgICAgewotICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woInNuYXBzaG90IiwiLXQiLCJzb21lLW5hbWUiKTsKKyAgICAgICAgVG9vbFJlc3VsdCB0b29sID0gaW52b2tlTm9kZXRvb2woInNuYXBzaG90IiwgIi10IiwgInNvbWUtbmFtZSIpOwogICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7CiAgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuaXNOb3RFbXB0eSgpOwogCi0gICAgICAgIHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJzbmFwc2hvdCIsIi10Iiwic29tZS1vdGhlci1uYW1lIik7CisgICAgICAgIHRvb2wgPSBpbnZva2VOb2RldG9vbCgic25hcHNob3QiLCAiLXQiLCAic29tZS1vdGhlci1uYW1lIik7CiAgICAgICAgIHRvb2wuYXNzZXJ0T25DbGVhbkV4aXQoKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5pc05vdEVtcHR5KCk7CiAKLSAgICAgICAgTWFwPFN0cmluZywgVGFidWxhckRhdGE+IHNuYXBzaG90c19iZWZvcmUgPSBwcm9iZS5nZXRTbmFwc2hvdERldGFpbHMoKTsKKyAgICAgICAgTWFwPFN0cmluZywgVGFidWxhckRhdGE+IHNuYXBzaG90c19iZWZvcmUgPSBwcm9iZS5nZXRTbmFwc2hvdERldGFpbHMoZW1wdHlNYXAoKSk7CiAgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzX2JlZm9yZSkuaGFzU2l6ZSgyKTsKIAotICAgICAgICB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbCgiY2xlYXJzbmFwc2hvdCIsIi0tYWxsIik7CisgICAgICAgIHRvb2wgPSBpbnZva2VOb2RldG9vbCgiY2xlYXJzbmFwc2hvdCIsICItLWFsbCIpOwogICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7CiAgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuaXNOb3RFbXB0eSgpOwotICAgICAgICAKLSAgICAgICAgTWFwPFN0cmluZywgVGFidWxhckRhdGE+IHNuYXBzaG90c19hZnRlciA9IHByb2JlLmdldFNuYXBzaG90RGV0YWlscygpOworCisgICAgICAgIE1hcDxTdHJpbmcsIFRhYnVsYXJEYXRhPiBzbmFwc2hvdHNfYWZ0ZXIgPSBwcm9iZS5nZXRTbmFwc2hvdERldGFpbHMoZW1wdHlNYXAoKSk7CiAgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzX2FmdGVyKS5pc0VtcHR5KCk7CiAgICAgfQotICAgIAorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJTbmFwc2hvdFdpdGhPbGRlclRoYW5GbGFnKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgSW5zdGFudCBzdGFydCA9IEluc3RhbnQub2ZFcG9jaE1pbGxpKGN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICBwcmVwYXJlRGF0YShzdGFydCk7CisKKyAgICAgICAgLy8gd2FpdCAxMCBzZWNvbmRzIGZvciB0aGUgc2FrZSBvZiB0aGUgdGVzdAorICAgICAgICBhd2FpdCgpLnRpbWVvdXQoMTUsIFRpbWVVbml0LlNFQ09ORFMpLnVudGlsKCgpIC0+IEluc3RhbnQubm93KCkuaXNBZnRlcihzdGFydC5wbHVzU2Vjb25kcygxMCkpKTsKKworICAgICAgICAvLyBjbGVhciBhbGwgc25hcHNob3RzIGZvciBzcGVjaWZpYyBrZXlzcGFjZSBvbGRlciB0aGFuIDMgaG91cnMgZm9yIGEgc3BlY2lmaWMga2V5c3BhY2UKKyAgICAgICAgaW52b2tlTm9kZXRvb2woImNsZWFyc25hcHNob3QiLCAiLS1vbGRlci10aGFuIiwgIjNoIiwgIi0tYWxsIiwgIi0tIiwgS0VZU1BBQ0UpLmFzc2VydE9uQ2xlYW5FeGl0KCk7CisKKyAgICAgICAgYXdhaXQoKS51bnRpbCgoKSAtPiB7CisgICAgICAgICAgICBTdHJpbmcgb3V0cHV0ID0gaW52b2tlTm9kZXRvb2woImxpc3RzbmFwc2hvdHMiKS5nZXRTdGRvdXQoKTsKKyAgICAgICAgICAgIHJldHVybiAhb3V0cHV0LmNvbnRhaW5zKCJzbmFwc2hvdC10by1jbGVhci1rczEtdGIxIikgJiYKKyAgICAgICAgICAgICAgICAgICBvdXRwdXQuY29udGFpbnMoInNvbWUtb3RoZXItc25hcHNob3Qta3MxLXRiMSIpICYmCisgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNvbnRhaW5zKCJsYXN0LXNuYXBzaG90LWtzMS10YjEiKSAmJgorICAgICAgICAgICAgICAgICAgIG91dHB1dC5jb250YWlucygic25hcHNob3QtdG8tY2xlYXIta3MyLXRiMiIpICYmCisgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNvbnRhaW5zKCJzb21lLW90aGVyLXNuYXBzaG90LWtzMi10YjIiKSAmJgorICAgICAgICAgICAgICAgICAgIG91dHB1dC5jb250YWlucygibGFzdC1zbmFwc2hvdC1rczItdGIyIik7CisgICAgICAgIH0pOworCisgICAgICAgIC8vIGNsZWFyIGFsbCBzbmFwc2hvdHMgb2xkZXIgdGhhbiAyIGhvdXJzIGZvciBhbGwga2V5c3BhY2VzCisgICAgICAgIGludm9rZU5vZGV0b29sKCJjbGVhcnNuYXBzaG90IiwgIi0tb2xkZXItdGhhbiIsICIyaCIsICItLWFsbCIpLmFzc2VydE9uQ2xlYW5FeGl0KCk7CisKKyAgICAgICAgYXdhaXQoKS51bnRpbCgoKSAtPiB7CisgICAgICAgICAgICBTdHJpbmcgb3V0cHV0ID0gaW52b2tlTm9kZXRvb2woImxpc3RzbmFwc2hvdHMiKS5nZXRTdGRvdXQoKTsKKworICAgICAgICAgICAgcmV0dXJuICFvdXRwdXQuY29udGFpbnMoInNvbWUtb3RoZXItc25hcHNob3Qta3MxLXRiMSIpICYmCisgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNvbnRhaW5zKCJsYXN0LXNuYXBzaG90LWtzMS10YjEiKSAmJgorICAgICAgICAgICAgICAgICAgICFvdXRwdXQuY29udGFpbnMoInNuYXBzaG90LXRvLWNsZWFyLWtzMi10YjIiKSAmJgorICAgICAgICAgICAgICAgICAgICFvdXRwdXQuY29udGFpbnMoInNvbWUtb3RoZXItc25hcHNob3Qta3MyLXRiMiIpICYmCisgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNvbnRhaW5zKCJsYXN0LXNuYXBzaG90LWtzMi10YjIiKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgLy8gY2xlYXIgYWxsIHNuYXBzaG9zdHMgb2xkZXIgdGhhbiAxIHNlY29uZAorICAgICAgICBpbnZva2VOb2RldG9vbCgiY2xlYXJzbmFwc2hvdCIsICItLW9sZGVyLXRoYW4iLCAiMXMiLCAiLS1hbGwiLCAiLS0iLCBjdXJyZW50S2V5c3BhY2UoKSkuYXNzZXJ0T25DbGVhbkV4aXQoKTsKKworICAgICAgICBhd2FpdCgpLnVudGlsKCgpIC0+IHsKKyAgICAgICAgICAgIFN0cmluZyBvdXRwdXQgPSBpbnZva2VOb2RldG9vbCgibGlzdHNuYXBzaG90cyIpLmdldFN0ZG91dCgpOworICAgICAgICAgICAgcmV0dXJuIG91dHB1dC5jb250YWlucygibGFzdC1zbmFwc2hvdC1rczEtdGIxIikgJiYKKyAgICAgICAgICAgICAgICAgICAhb3V0cHV0LmNvbnRhaW5zKCJsYXN0LXNuYXBzaG90LWtzMi10YjIiKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgaW52b2tlTm9kZXRvb2woImNsZWFyc25hcHNob3QiLCAiLS1vbGRlci10aGFuIiwgIjFzIiwgIi0tYWxsIikuYXNzZXJ0T25DbGVhbkV4aXQoKTsKKyAgICAgICAgYXdhaXQoKS51bnRpbCgoKSAtPiAhaW52b2tlTm9kZXRvb2woImxpc3RzbmFwc2hvdHMiKS5nZXRTdGRvdXQoKS5jb250YWlucygibGFzdC1zbmFwc2hvdC1rczEtdGIxIikpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJTbmFwc2hvdFdpdGhPbGRlclRoYW5UaW1lc3RhbXBGbGFnKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgSW5zdGFudCBzdGFydCA9IEluc3RhbnQub2ZFcG9jaE1pbGxpKGN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICBwcmVwYXJlRGF0YShzdGFydCk7CisKKyAgICAgICAgLy8gd2FpdCAxMCBzZWNvbmRzIGZvciB0aGUgc2FrZSBvZiB0aGUgdGVzdAorICAgICAgICBhd2FpdCgpLnRpbWVvdXQoMTUsIFRpbWVVbml0LlNFQ09ORFMpLnVudGlsKCgpIC0+IEluc3RhbnQubm93KCkuaXNBZnRlcihzdGFydC5wbHVzU2Vjb25kcygxMCkpKTsKKworICAgICAgICAvLyBjbGVhciBhbGwgc25hcHNob3RzIGZvciBzcGVjaWZpYyBrZXlzcGFjZSBvbGRlciB0aGFuIDMgaG91cnMgZm9yIGEgc3BlY2lmaWMga2V5c3BhY2UKKyAgICAgICAgaW52b2tlTm9kZXRvb2woImNsZWFyc25hcHNob3QiLCAiLS1vbGRlci10aGFuLXRpbWVzdGFtcCIsCisgICAgICAgICAgICAgICAgICAgICAgIEluc3RhbnQubm93KCkubWludXMoMywgSE9VUlMpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICItLWFsbCIsICItLSIsIEtFWVNQQUNFKS5hc3NlcnRPbkNsZWFuRXhpdCgpOworCisgICAgICAgIGF3YWl0KCkudW50aWwoKCkgLT4geworICAgICAgICAgICAgU3RyaW5nIG91dHB1dCA9IGludm9rZU5vZGV0b29sKCJsaXN0c25hcHNob3RzIikuZ2V0U3Rkb3V0KCk7CisgICAgICAgICAgICByZXR1cm4gIW91dHB1dC5jb250YWlucygic25hcHNob3QtdG8tY2xlYXIta3MxLXRiMSIpICYmCisgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNvbnRhaW5zKCJzb21lLW90aGVyLXNuYXBzaG90LWtzMS10YjEiKSAmJgorICAgICAgICAgICAgICAgICAgIG91dHB1dC5jb250YWlucygibGFzdC1zbmFwc2hvdC1rczEtdGIxIikgJiYKKyAgICAgICAgICAgICAgICAgICBvdXRwdXQuY29udGFpbnMoInNuYXBzaG90LXRvLWNsZWFyLWtzMi10YjIiKSAmJgorICAgICAgICAgICAgICAgICAgIG91dHB1dC5jb250YWlucygic29tZS1vdGhlci1zbmFwc2hvdC1rczItdGIyIikgJiYKKyAgICAgICAgICAgICAgICAgICBvdXRwdXQuY29udGFpbnMoImxhc3Qtc25hcHNob3Qta3MyLXRiMiIpOworICAgICAgICB9KTsKKworICAgICAgICAvLyBjbGVhciBhbGwgc25hcHNob3RzIG9sZGVyIHRoYW4gMiBob3VycyBmb3IgYWxsIGtleXNwYWNlcworICAgICAgICBpbnZva2VOb2RldG9vbCgiY2xlYXJzbmFwc2hvdCIsICItLW9sZGVyLXRoYW4tdGltZXN0YW1wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgSW5zdGFudC5ub3coKS5taW51cygyLCBIT1VSUykudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIi0tYWxsIikuYXNzZXJ0T25DbGVhbkV4aXQoKTsKKworICAgICAgICBhd2FpdCgpLnVudGlsKCgpIC0+IHsKKyAgICAgICAgICAgIFN0cmluZyBvdXRwdXQgPSBpbnZva2VOb2RldG9vbCgibGlzdHNuYXBzaG90cyIpLmdldFN0ZG91dCgpOworCisgICAgICAgICAgICByZXR1cm4gIW91dHB1dC5jb250YWlucygic29tZS1vdGhlci1zbmFwc2hvdC1rczEtdGIxIikgJiYKKyAgICAgICAgICAgICAgICAgICBvdXRwdXQuY29udGFpbnMoImxhc3Qtc25hcHNob3Qta3MxLXRiMSIpICYmCisgICAgICAgICAgICAgICAgICAgIW91dHB1dC5jb250YWlucygic25hcHNob3QtdG8tY2xlYXIta3MyLXRiMiIpICYmCisgICAgICAgICAgICAgICAgICAgIW91dHB1dC5jb250YWlucygic29tZS1vdGhlci1zbmFwc2hvdC1rczItdGIyIikgJiYKKyAgICAgICAgICAgICAgICAgICBvdXRwdXQuY29udGFpbnMoImxhc3Qtc25hcHNob3Qta3MyLXRiMiIpOworICAgICAgICB9KTsKKworICAgICAgICAvLyBjbGVhciBhbGwgc25hcHNob3RzIG9sZGVyIHRoYW4gbm93IGZvciBhbGwga2V5c3BhY2VzCisgICAgICAgIGludm9rZU5vZGV0b29sKCJjbGVhcnNuYXBzaG90IiwgIi0tb2xkZXItdGhhbi10aW1lc3RhbXAiLAorICAgICAgICAgICAgICAgICAgICAgICBJbnN0YW50Lm5vdygpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICItLWFsbCIpLmFzc2VydE9uQ2xlYW5FeGl0KCk7CisKKyAgICAgICAgYXdhaXQoKS51bnRpbCgoKSAtPiB7CisgICAgICAgICAgICBTdHJpbmcgb3V0cHV0ID0gaW52b2tlTm9kZXRvb2woImxpc3RzbmFwc2hvdHMiKS5nZXRTdGRvdXQoKTsKKyAgICAgICAgICAgIHJldHVybiAhb3V0cHV0LmNvbnRhaW5zKCJsYXN0LXNuYXBzaG90LWtzMS10YjEiKSAmJgorICAgICAgICAgICAgICAgICAgICFvdXRwdXQuY29udGFpbnMoImxhc3Qtc25hcHNob3Qta3MyLXRiMiIpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmNvbXBhdGlibGVGbGFncygpCisgICAgeworICAgICAgICBUb29sUmVzdWx0IGludmFsaWRDb21tYW5kMSA9IGludm9rZU5vZGV0b29sKCJjbGVhcnNuYXBzaG90IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1vbGRlci10aGFuLXRpbWVzdGFtcCIsIEluc3RhbnQubm93KCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1vbGRlci10aGFuIiwgIjNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1hbGwiKTsKKyAgICAgICAgaW52YWxpZENvbW1hbmQxLmFzc2VydHMoKS5mYWlsdXJlKCk7CisgICAgICAgIGFzc2VydFRydWUoaW52YWxpZENvbW1hbmQxLmdldFN0ZG91dCgpLmNvbnRhaW5zKCJTcGVjaWZ5IG9ubHkgb25lIG9mIC0tb2xkZXItdGhhbiBvciAtLW9sZGVyLXRoYW4tdGltZXN0YW1wIikpOworCisgICAgICAgIFRvb2xSZXN1bHQgaW52YWxpZENvbW1hbmQyID0gaW52b2tlTm9kZXRvb2woImNsZWFyc25hcHNob3QiLCAiLXQiLCAic29tZS1zbmFwc2hvdC10YWciLCAiLS1hbGwiKTsKKyAgICAgICAgaW52YWxpZENvbW1hbmQyLmFzc2VydHMoKS5mYWlsdXJlKCk7CisgICAgICAgIGFzc2VydFRydWUoaW52YWxpZENvbW1hbmQyLmdldFN0ZG91dCgpLmNvbnRhaW5zKCJTcGVjaWZ5IG9ubHkgb25lIG9mIHNuYXBzaG90IG5hbWUgb3IgLS1hbGwiKSk7CisKKyAgICAgICAgVG9vbFJlc3VsdCBpbnZhbGlkQ29tbWFuZDMgPSBpbnZva2VOb2RldG9vbCgiY2xlYXJzbmFwc2hvdCIsICItLSIsICJrZXlzcGFjZSIpOworICAgICAgICBpbnZhbGlkQ29tbWFuZDMuYXNzZXJ0cygpLmZhaWx1cmUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpbnZhbGlkQ29tbWFuZDMuZ2V0U3Rkb3V0KCkuY29udGFpbnMoIlNwZWNpZnkgc25hcHNob3QgbmFtZSBvciAtLWFsbCIpKTsKKworICAgICAgICBUb29sUmVzdWx0IGludmFsaWRDb21tYW5kNCA9IGludm9rZU5vZGV0b29sKCJjbGVhcnNuYXBzaG90IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1vbGRlci10aGFuLXRpbWVzdGFtcCIsIEluc3RhbnQubm93KCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLXQiLCAic29tZS1zbmFwc2hvdC10YWciKTsKKyAgICAgICAgaW52YWxpZENvbW1hbmQ0LmFzc2VydHMoKS5mYWlsdXJlKCk7CisgICAgICAgIGFzc2VydFRydWUoaW52YWxpZENvbW1hbmQ0LmdldFN0ZG91dCgpLmNvbnRhaW5zKCJTcGVjaWZ5aW5nIHNuYXBzaG90IG5hbWUgdG9nZXRoZXIgd2l0aCAtLW9sZGVyLXRoYW4tdGltZXN0YW1wIGZsYWcgaXMgbm90IGFsbG93ZWQiKSk7CisKKyAgICAgICAgVG9vbFJlc3VsdCBpbnZhbGlkQ29tbWFuZDUgPSBpbnZva2VOb2RldG9vbCgiY2xlYXJzbmFwc2hvdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tb2xkZXItdGhhbiIsICIzaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi10IiwgInNvbWUtc25hcHNob3QtdGFnIik7CisgICAgICAgIGludmFsaWRDb21tYW5kNS5hc3NlcnRzKCkuZmFpbHVyZSgpOworICAgICAgICBhc3NlcnRUcnVlKGludmFsaWRDb21tYW5kNS5nZXRTdGRvdXQoKS5jb250YWlucygiU3BlY2lmeWluZyBzbmFwc2hvdCBuYW1lIHRvZ2V0aGVyIHdpdGggLS1vbGRlci10aGFuIGZsYWcgaXMgbm90IGFsbG93ZWQiKSk7CisKKyAgICAgICAgVG9vbFJlc3VsdCBpbnZhbGlkQ29tbWFuZDYgPSBpbnZva2VOb2RldG9vbCgiY2xlYXJzbmFwc2hvdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tb2xkZXItdGhhbi10aW1lc3RhbXAiLCAiMTIzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1hbGwiLCAiLS0iLCAic29tZWtleXNwYWNlIik7CisgICAgICAgIGludmFsaWRDb21tYW5kNi5hc3NlcnRzKCkuZmFpbHVyZSgpOworICAgICAgICBhc3NlcnRUcnVlKGludmFsaWRDb21tYW5kNi5nZXRTdGRvdXQoKS5jb250YWlucygiUGFyYW1ldGVyIC0tb2xkZXItdGhhbi10aW1lc3RhbXAgaGFzIHRvIGJlIGEgdmFsaWQgaW5zdGFudCBpbiBJU08gZm9ybWF0LiIpKTsKKworICAgICAgICBUb29sUmVzdWx0IGludmFsaWRDb21tYW5kNyA9IGludm9rZU5vZGV0b29sKCJjbGVhcnNuYXBzaG90IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1vbGRlci10aGFuIiwgIjNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1hbGwiLCAiLS0iLCAic29tZWtleXNwYWNlIik7CisgICAgICAgIGludmFsaWRDb21tYW5kNy5hc3NlcnRzKCkuZmFpbHVyZSgpOworICAgICAgICBhc3NlcnRUcnVlKGludmFsaWRDb21tYW5kNy5nZXRTdGRvdXQoKS5jb250YWlucygiSW52YWxpZCBkdXJhdGlvbjogM2siKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJld3JpdGVNYW5pZmVzdChTdHJpbmcgdGFibGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGRhdGFEaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhYmxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzbmFwc2hvdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0YW50IGNyZWF0ZWRBdCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUGF0aCBtYW5pZmVzdFBhdGggPSBmaW5kTWFuaWZlc3QoZGF0YURpcnMsIGtleXNwYWNlLCB0YWJsZUlkLCB0YWJsZU5hbWUsIHNuYXBzaG90TmFtZSk7CisgICAgICAgIFNuYXBzaG90TWFuaWZlc3QgbWFuaWZlc3QgPSBTbmFwc2hvdE1hbmlmZXN0LmRlc2VyaWFsaXplRnJvbUpzb25GaWxlKG5ldyBGaWxlKG1hbmlmZXN0UGF0aCkpOworICAgICAgICBTbmFwc2hvdE1hbmlmZXN0IG1hbmlmZXN0V2l0aEVwaGVtZXJhbEZsYWcgPSBuZXcgU25hcHNob3RNYW5pZmVzdChtYW5pZmVzdC5maWxlcywgbnVsbCwgY3JlYXRlZEF0LCBmYWxzZSk7CisgICAgICAgIG1hbmlmZXN0V2l0aEVwaGVtZXJhbEZsYWcuc2VyaWFsaXplVG9Kc29uRmlsZShuZXcgRmlsZShtYW5pZmVzdFBhdGgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFBhdGggZmluZE1hbmlmZXN0KFN0cmluZ1tdIGRhdGFEaXJzLCBTdHJpbmcga2V5c3BhY2UsIFN0cmluZyB0YWJsZUlkLCBTdHJpbmcgdGFibGVOYW1lLCBTdHJpbmcgc25hcHNob3ROYW1lKQorICAgIHsKKyAgICAgICAgZm9yIChTdHJpbmcgZGF0YURpciA6IGRhdGFEaXJzKQorICAgICAgICB7CisgICAgICAgICAgICBQYXRoIG1hbmlmZXN0ID0gUGF0aHMuZ2V0KGRhdGFEaXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVzb2x2ZShrZXlzcGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNvbHZlKGZvcm1hdCgiJXMtJXMiLCB0YWJsZU5hbWUsIHRhYmxlSWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc29sdmUoInNuYXBzaG90cyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVzb2x2ZShzbmFwc2hvdE5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVzb2x2ZSgibWFuaWZlc3QuanNvbiIpOworCisgICAgICAgICAgICBpZiAoRmlsZXMuZXhpc3RzKG1hbmlmZXN0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFuaWZlc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmFibGUgdG8gZmluZCBtYW5pZmVzdCEiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJlcGFyZURhdGEoSW5zdGFudCBzdGFydCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgU3RyaW5nIHRhYmxlTmFtZSA9IGNyZWF0ZVRhYmxlKEtFWVNQQUNFLCAiQ1JFQVRFIFRBQkxFICVzIChpZCBpbnQgcHJpbWFyeSBrZXkpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChpZCkgVkFMVUVTICg/KSIsIDEpOworICAgICAgICBmbHVzaChLRVlTUEFDRSk7CisKKyAgICAgICAgU3RyaW5nIGtleXNwYWNlMiA9IGNyZWF0ZUtleXNwYWNlKCJDUkVBVEUgS0VZU1BBQ0UgJXMgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJzogMX0iKTsKKyAgICAgICAgU3RyaW5nIHRhYmxlTmFtZTIgPSBjcmVhdGVUYWJsZShrZXlzcGFjZTIsICJDUkVBVEUgVEFCTEUgJXMgKGlkIGludCBwcmltYXJ5IGtleSkiKTsKKyAgICAgICAgZXhlY3V0ZShmb3JtYXRRdWVyeShrZXlzcGFjZTIsICJJTlNFUlQgSU5UTyAlcyAoaWQpIFZBTFVFUyAoPykiKSwgMSk7CisgICAgICAgIGZsdXNoKGtleXNwYWNlMik7CisKKyAgICAgICAgaW52b2tlTm9kZXRvb2woInNuYXBzaG90IiwgIi10IiwgInNuYXBzaG90LXRvLWNsZWFyLWtzMS10YjEiLCAiLWNmIiwgdGFibGVOYW1lLCAiLS0iLCBLRVlTUEFDRSkuYXNzZXJ0T25DbGVhbkV4aXQoKTsKKyAgICAgICAgaW52b2tlTm9kZXRvb2woInNuYXBzaG90IiwgIi10IiwgInNvbWUtb3RoZXItc25hcHNob3Qta3MxLXRiMSIsICItY2YiLCB0YWJsZU5hbWUsICItLSIsIEtFWVNQQUNFKS5hc3NlcnRPbkNsZWFuRXhpdCgpOworICAgICAgICBpbnZva2VOb2RldG9vbCgic25hcHNob3QiLCAiLXQiLCAibGFzdC1zbmFwc2hvdC1rczEtdGIxIiwgIi1jZiIsIHRhYmxlTmFtZSwgIi0tIiwgS0VZU1BBQ0UpLmFzc2VydE9uQ2xlYW5FeGl0KCk7CisKKyAgICAgICAgaW52b2tlTm9kZXRvb2woInNuYXBzaG90IiwgIi10IiwgInNuYXBzaG90LXRvLWNsZWFyLWtzMi10YjIiLCAiLWNmIiwgdGFibGVOYW1lMiwgIi0tIiwga2V5c3BhY2UyKS5hc3NlcnRPbkNsZWFuRXhpdCgpOworICAgICAgICBpbnZva2VOb2RldG9vbCgic25hcHNob3QiLCAiLXQiLCAic29tZS1vdGhlci1zbmFwc2hvdC1rczItdGIyIiwgIi1jZiIsIHRhYmxlTmFtZTIsICItLSIsIGtleXNwYWNlMikuYXNzZXJ0T25DbGVhbkV4aXQoKTsKKyAgICAgICAgaW52b2tlTm9kZXRvb2woInNuYXBzaG90IiwgIi10IiwgImxhc3Qtc25hcHNob3Qta3MyLXRiMiIsICItY2YiLCB0YWJsZU5hbWUyLCAiLS0iLCBrZXlzcGFjZTIpLmFzc2VydE9uQ2xlYW5FeGl0KCk7CisKKyAgICAgICAgT3B0aW9uYWw8VGFibGVNZXRhZGF0YT4gdGFibGVNZXRhZGF0YSA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldE1ldGFkYXRhKCkudGFibGVzLmdldCh0YWJsZU5hbWUpOworICAgICAgICBPcHRpb25hbDxUYWJsZU1ldGFkYXRhPiB0YWJsZU1ldGFkYXRhMiA9IEtleXNwYWNlLm9wZW4oa2V5c3BhY2UyKS5nZXRNZXRhZGF0YSgpLnRhYmxlcy5nZXQodGFibGVOYW1lMik7CisKKyAgICAgICAgU3RyaW5nIHRhYmxlSWQgPSBEQVNIX1BBVFRFUk4ubWF0Y2hlcih0YWJsZU1ldGFkYXRhLm9yRWxzZVRocm93KCgpIC0+IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZm9ybWF0KCJubyBtZXRhZGF0YSBmb3VuZCBmb3IgJXMuJXMiLCBLRVlTUEFDRSwgdGFibGVOYW1lKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlkLmFzVVVJRCgpLnRvU3RyaW5nKCkpLnJlcGxhY2VBbGwoIiIpOworCisgICAgICAgIFN0cmluZyB0YWJsZUlkMiA9IERBU0hfUEFUVEVSTi5tYXRjaGVyKHRhYmxlTWV0YWRhdGEyLm9yRWxzZVRocm93KCgpIC0+IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZm9ybWF0KCJubyBtZXRhZGF0YSBmb3VuZCBmb3IgJXMuJXMiLCBrZXlzcGFjZTIsIHRhYmxlTmFtZTIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlkLmFzVVVJRCgpLnRvU3RyaW5nKCkpLnJlcGxhY2VBbGwoIiIpOworCisgICAgICAgIHJld3JpdGVNYW5pZmVzdCh0YWJsZUlkLCBnZXRBbGxEYXRhRmlsZUxvY2F0aW9ucygpLCBLRVlTUEFDRSwgdGFibGVOYW1lLCAic25hcHNob3QtdG8tY2xlYXIta3MxLXRiMSIsIHN0YXJ0Lm1pbnVzKDUsIEhPVVJTKSk7CisgICAgICAgIHJld3JpdGVNYW5pZmVzdCh0YWJsZUlkLCBnZXRBbGxEYXRhRmlsZUxvY2F0aW9ucygpLCBLRVlTUEFDRSwgdGFibGVOYW1lLCAic29tZS1vdGhlci1zbmFwc2hvdC1rczEtdGIxIiwgc3RhcnQubWludXMoMiwgSE9VUlMpKTsKKyAgICAgICAgcmV3cml0ZU1hbmlmZXN0KHRhYmxlSWQsIGdldEFsbERhdGFGaWxlTG9jYXRpb25zKCksIEtFWVNQQUNFLCB0YWJsZU5hbWUsICJsYXN0LXNuYXBzaG90LWtzMS10YjEiLCBzdGFydC5taW51cygxLCBTRUNPTkRTKSk7CisgICAgICAgIHJld3JpdGVNYW5pZmVzdCh0YWJsZUlkMiwgZ2V0QWxsRGF0YUZpbGVMb2NhdGlvbnMoKSwga2V5c3BhY2UyLCB0YWJsZU5hbWUyLCAic25hcHNob3QtdG8tY2xlYXIta3MyLXRiMiIsIHN0YXJ0Lm1pbnVzKDUsIEhPVVJTKSk7CisgICAgICAgIHJld3JpdGVNYW5pZmVzdCh0YWJsZUlkMiwgZ2V0QWxsRGF0YUZpbGVMb2NhdGlvbnMoKSwga2V5c3BhY2UyLCB0YWJsZU5hbWUyLCAic29tZS1vdGhlci1zbmFwc2hvdC1rczItdGIyIiwgc3RhcnQubWludXMoMiwgSE9VUlMpKTsKKyAgICAgICAgcmV3cml0ZU1hbmlmZXN0KHRhYmxlSWQyLCBnZXRBbGxEYXRhRmlsZUxvY2F0aW9ucygpLCBrZXlzcGFjZTIsIHRhYmxlTmFtZTIsICJsYXN0LXNuYXBzaG90LWtzMi10YjIiLCBzdGFydC5taW51cygxLCBTRUNPTkRTKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0NsaWVudFN0YXRzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0NsaWVudFN0YXRzVGVzdC5qYXZhCmluZGV4IDU5NzVmNjYuLmQzOWZjNjMgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9DbGllbnRTdGF0c1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvQ2xpZW50U3RhdHNUZXN0LmphdmEKQEAgLTQyLDYgKzQyLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ub29sUnVubmVyOwogaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuZ3JvdXBzLlR1cGxlOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX0pNWF9MT0NBTF9QT1JUOwogaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CiAKIHB1YmxpYyBjbGFzcyBDbGllbnRTdGF0c1Rlc3QKQEAgLTU2LDcgKzU3LDcgQEAKICAgICB7CiAgICAgICAgIC8vIFNpbmNlIHdlIHJ1biBFbWJlZGRlZENhc3NhbmRyYVNlcnZlciwgd2UgbmVlZCB0byBtYW51YWxseSBhc3NvY2lhdGUgSk1YIGFkZHJlc3M7IG90aGVyd2lzZSBpdCB3b24ndCBzdGFydAogICAgICAgICBpbnQgam14UG9ydCA9IENRTFRlc3Rlci5nZXRBdXRvbWF0aWNhbGx5QWxsb2NhdGVkUG9ydChJbmV0QWRkcmVzcy5nZXRMb29wYmFja0FkZHJlc3MoKSk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmpteC5sb2NhbC5wb3J0IiwgU3RyaW5nLnZhbHVlT2Yoam14UG9ydCkpOworICAgICAgICBDQVNTQU5EUkFfSk1YX0xPQ0FMX1BPUlQuc2V0SW50KGpteFBvcnQpOwogCiAgICAgICAgIGNhc3NhbmRyYSA9IFNlcnZlclRlc3RVdGlscy5zdGFydEVtYmVkZGVkQ2Fzc2FuZHJhU2VydmljZSgpOwogICAgICAgICBjbHVzdGVyID0gQ2x1c3Rlci5idWlsZGVyKCkuYWRkQ29udGFjdFBvaW50KCIxMjcuMC4wLjEiKS53aXRoUG9ydChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0TmF0aXZlVHJhbnNwb3J0UG9ydCgpKS5idWlsZCgpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0NvbXBhY3RUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvQ29tcGFjdFRlc3QuamF2YQppbmRleCAzNDA1OWFhLi45MjhmODg1IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvQ29tcGFjdFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvQ29tcGFjdFRlc3QuamF2YQpAQCAtMzUsNiArMzUsNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpIHRocm93cyBUaHJvd2FibGUKICAgICB7CisgICAgICAgIHJlcXVpcmVOZXR3b3JrKCk7CiAgICAgICAgIHN0YXJ0Sk1YU2VydmVyKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvQ29tcGFjdGlvbkhpc3RvcnlUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvQ29tcGFjdGlvbkhpc3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA0Yjc1YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9Db21wYWN0aW9uSGlzdG9yeVRlc3QuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5ub2RldG9vbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlN5c3RlbUtleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ub29sUnVubmVyLlRvb2xSZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSGlzdG9yeVRhYnVsYXJEYXRhLkNPTVBBQ1RJT05fVFlQRV9QUk9QRVJUWTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ29tcGFjdGlvbkhpc3RvcnlUZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCit7CisgICAgQFBhcmFtZXRlcgorICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gY21kOworCisgICAgQFBhcmFtZXRlcigxKQorICAgIHB1YmxpYyBTdHJpbmcgY29tcGFjdGlvblR5cGU7CisKKyAgICBAUGFyYW1ldGVyKDIpCisgICAgcHVibGljIGludCBzeXN0ZW1UYWJsZVJlY29yZDsKKworICAgIEBQYXJhbWV0ZXJzKG5hbWUgPSAie2luZGV4fTogY21kPXswfSBjb21wYWN0aW9uVHlwZT17MX0gc3lzdGVtVGFibGVSZWNvcmQ9ezJ9IikKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IGRhdGEoKQorICAgIHsKKyAgICAgICAgTGlzdDxPYmplY3RbXT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHJlc3VsdC5hZGQobmV3IE9iamVjdFtdeyBMaXN0cy5uZXdBcnJheUxpc3QoImNvbXBhY3QiKSwgT3BlcmF0aW9uVHlwZS5NQUpPUl9DT01QQUNUSU9OLnR5cGUsIDEgfSk7CisgICAgICAgIHJlc3VsdC5hZGQobmV3IE9iamVjdFtdeyBMaXN0cy5uZXdBcnJheUxpc3QoImdhcmJhZ2Vjb2xsZWN0IiksIE9wZXJhdGlvblR5cGUuR0FSQkFHRV9DT0xMRUNULnR5cGUsIDEwIH0pOworICAgICAgICByZXN1bHQuYWRkKG5ldyBPYmplY3RbXXsgTGlzdHMubmV3QXJyYXlMaXN0KCJ1cGdyYWRlc3N0YWJsZXMiLCAiLWEiKSwgT3BlcmF0aW9uVHlwZS5VUEdSQURFX1NTVEFCTEVTLnR5cGUsIDEwIH0pOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJlcXVpcmVOZXR3b3JrKCk7CisgICAgICAgIHN0YXJ0Sk1YU2VydmVyKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFjdGlvblByb3BlcnRpZXMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChpZCB0ZXh0LCB2YWx1ZSB0ZXh0LCBQUklNQVJZIEtFWSAoKGlkKSkpIik7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oa2V5c3BhY2UoKSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY3VycmVudFRhYmxlKCkpOworICAgICAgICBjZnMuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisgICAgICAgIC8vIHdyaXRlIFNTVGFibGVzIGZvciB0aGUgc3BlY2lmaWMga2V5CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGlkLCB2YWx1ZSkgVkFMVUVTICg/LCA/KSIsICJrZXkiICsgaSwgInZhbHVlIiArIGkpOworICAgICAgICAgICAgZmx1c2goa2V5c3BhY2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZXhwZWN0ZWRTU1RhYmxlc0NvdW50ID0gMTA7CisgICAgICAgIGFzc2VydFRoYXQoY2ZzLmdldFRyYWNrZXIoKS5nZXRWaWV3KCkubGl2ZVNTVGFibGVzKCkpLmhhc1NpemUoZXhwZWN0ZWRTU1RhYmxlc0NvdW50KTsKKworICAgICAgICBJbW11dGFibGVMaXN0LkJ1aWxkZXI8U3RyaW5nPiBidWlsZGVyID0gSW1tdXRhYmxlTGlzdC5idWlsZGVyKCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBjbWRzID0gYnVpbGRlci5hZGRBbGwoY21kKS5hZGQoa2V5c3BhY2UoKSkuYWRkKGN1cnJlbnRUYWJsZSgpKS5idWlsZCgpOworICAgICAgICBjb21wYWN0aW9uSGlzdG9yeVJlc3VsdFZlcmlmeShrZXlzcGFjZSgpLCBjdXJyZW50VGFibGUoKSwgSW1tdXRhYmxlTWFwLm9mKENPTVBBQ1RJT05fVFlQRV9QUk9QRVJUWSwgY29tcGFjdGlvblR5cGUpLCBjbWRzKTsKKworICAgICAgICBTdHJpbmcgY3FsID0gInNlbGVjdCBrZXlzcGFjZV9uYW1lLGNvbHVtbmZhbWlseV9uYW1lLGNvbXBhY3Rpb25fcHJvcGVydGllcyAgZnJvbSBzeXN0ZW0uIiArIFN5c3RlbUtleXNwYWNlLkNPTVBBQ1RJT05fSElTVE9SWSArCisgICAgICAgICAgICAgICAgICAgICAiIHdoZXJlIGtleXNwYWNlX25hbWUgPSAnIiArIGtleXNwYWNlKCkgKyAiJyBBTkQgY29sdW1uZmFtaWx5X25hbWUgPSAnIiArIGN1cnJlbnRUYWJsZSgpICsgIicgQUxMT1cgRklMVEVSSU5HIjsKKyAgICAgICAgT2JqZWN0W11bXSBvYmplY3RzID0gbmV3IE9iamVjdFtzeXN0ZW1UYWJsZVJlY29yZF1bXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gc3lzdGVtVGFibGVSZWNvcmQ7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0c1tpXSA9IHJvdyhrZXlzcGFjZSgpLCBjdXJyZW50VGFibGUoKSwgSW1tdXRhYmxlTWFwLm9mKENPTVBBQ1RJT05fVFlQRV9QUk9QRVJUWSwgY29tcGFjdGlvblR5cGUpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoY3FsKSwgb2JqZWN0cyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbXBhY3Rpb25IaXN0b3J5UmVzdWx0VmVyaWZ5KFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMsIExpc3Q8U3RyaW5nPiBjbWRzKQorICAgIHsKKyAgICAgICAgVG9vbFJlc3VsdCB0b29sQ29tcGFjdCA9IGludm9rZU5vZGV0b29sKGNtZHMpOworICAgICAgICB0b29sQ29tcGFjdC5hc3NlcnRPbkNsZWFuRXhpdCgpOworCisgICAgICAgIFRvb2xSZXN1bHQgdG9vbEhpc3RvcnkgPSBpbnZva2VOb2RldG9vbCgiY29tcGFjdGlvbmhpc3RvcnkiKTsKKyAgICAgICAgdG9vbEhpc3RvcnkuYXNzZXJ0T25DbGVhbkV4aXQoKTsKKyAgICAgICAgYXNzZXJ0Q29tcGFjdGlvbkhpc3RvcnlPdXRQdXQodG9vbEhpc3RvcnksIGtleXNwYWNlLCB0YWJsZSwgcHJvcGVydGllcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydENvbXBhY3Rpb25IaXN0b3J5T3V0UHV0KFRvb2xSZXN1bHQgdG9vbEhpc3RvcnksIFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMpCisgICAgeworICAgICAgICBTdHJpbmcgc3Rkb3V0ID0gdG9vbEhpc3RvcnkuZ2V0U3Rkb3V0KCk7CisgICAgICAgIFN0cmluZ1tdIHJlc3VsdEFycmF5ID0gc3Rkb3V0LnNwbGl0KFN5c3RlbS5saW5lU2VwYXJhdG9yKCkpOworICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5zdHJlYW0ocmVzdWx0QXJyYXkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmFueU1hdGNoKHJlc3VsdCAtPiByZXN1bHQuY29udGFpbnMoJ3snICsgRkJVdGlsaXRpZXMudG9TdHJpbmcocHJvcGVydGllcykgKyAnfScpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiByZXN1bHQuY29udGFpbnMoa2V5c3BhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiByZXN1bHQuY29udGFpbnModGFibGUpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0NvbXBhY3Rpb25TdGF0c1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9Db21wYWN0aW9uU3RhdHNUZXN0LmphdmEKaW5kZXggYjQyYTE2Ni4uYTYyNmRhZSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0NvbXBhY3Rpb25TdGF0c1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvQ29tcGFjdGlvblN0YXRzVGVzdC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLm5vZGV0b29sOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5JbnRTdHJlYW07CiAKQEAgLTM1LDYgKzM2LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ub29sUnVubmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CitpbXBvcnQgb3JnLmF3YWl0aWxpdHkuQXdhaXRpbGl0eTsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEOwogaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CkBAIC0xMDUsOCArMTA3LDggQEAKICAgICAgICAgbG9uZyBieXRlc1RvdGFsID0gMTIzNDU2OwogICAgICAgICBUaW1lVVVJRCBjb21wYWN0aW9uSWQgPSBuZXh0VGltZVVVSUQoKTsKICAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IEludFN0cmVhbS5yYW5nZSgwLCAxMCkKLSAgICAgICAgICAgICAgICAubWFwVG9PYmooaSAtPiBNb2NrU2NoZW1hLnNzdGFibGUoaSwgaSAqIDEwTCwgaSAqIDEwTCArIDksIGNmcykpCi0gICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwVG9PYmooaSAtPiBNb2NrU2NoZW1hLnNzdGFibGUoaSwgaSAqIDEwTCwgaSAqIDEwTCArIDksIGNmcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKICAgICAgICAgQ29tcGFjdGlvbkluZm8uSG9sZGVyIGNvbXBhY3Rpb25Ib2xkZXIgPSBuZXcgQ29tcGFjdGlvbkluZm8uSG9sZGVyKCkKICAgICAgICAgewogICAgICAgICAgICAgcHVibGljIENvbXBhY3Rpb25JbmZvIGdldENvbXBhY3Rpb25JbmZvKCkKQEAgLTEyMSwyMSArMTIzLDE1IEBACiAgICAgICAgIH07CiAKICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmJlZ2luQ29tcGFjdGlvbihjb21wYWN0aW9uSG9sZGVyKTsKLSAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJjb21wYWN0aW9uc3RhdHMiKTsKLSAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwotICAgICAgICBTdHJpbmcgc3Rkb3V0ID0gdG9vbC5nZXRTdGRvdXQoKTsKLSAgICAgICAgYXNzZXJ0VGhhdChzdGRvdXQpLmNvbnRhaW5zKCJwZW5kaW5nIHRhc2tzOiAxIik7CisgICAgICAgIFN0cmluZyBzdGRvdXQgPSB3YWl0Rm9yTnVtYmVyT2ZQZW5kaW5nVGFza3MoMSwgImNvbXBhY3Rpb25zdGF0cyIpOwogICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoc3Rkb3V0KS5jb250YWluc1BhdHRlcm4oImlkXFxzK2NvbXBhY3Rpb24gdHlwZVxccytrZXlzcGFjZVxccyt0YWJsZVxccytjb21wbGV0ZWRcXHMrdG90YWxcXHMrdW5pdFxccytwcm9ncmVzcyIpOwogICAgICAgICBTdHJpbmcgZXhwZWN0ZWRTdGF0c1BhdHRlcm4gPSBTdHJpbmcuZm9ybWF0KCIlc1xccyslc1xccyslc1xccyslc1xccyslc1xccyslc1xccyslc1xccyslLjJmJSUiLAotICAgICAgICAgICAgY29tcGFjdGlvbklkLCBPcGVyYXRpb25UeXBlLkNPTVBBQ1RJT04sIENRTFRlc3Rlci5LRVlTUEFDRSwgY3VycmVudFRhYmxlKCksIGJ5dGVzQ29tcGFjdGVkLCBieXRlc1RvdGFsLAotICAgICAgICAgICAgQ29tcGFjdGlvbkluZm8uVW5pdC5CWVRFUywgKGRvdWJsZSkgYnl0ZXNDb21wYWN0ZWQgLyBieXRlc1RvdGFsICogMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYWN0aW9uSWQsIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiwgQ1FMVGVzdGVyLktFWVNQQUNFLCBjdXJyZW50VGFibGUoKSwgYnl0ZXNDb21wYWN0ZWQsIGJ5dGVzVG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFjdGlvbkluZm8uVW5pdC5CWVRFUywgKGRvdWJsZSkgYnl0ZXNDb21wYWN0ZWQgLyBieXRlc1RvdGFsICogMTAwKTsKICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHN0ZG91dCkuY29udGFpbnNQYXR0ZXJuKGV4cGVjdGVkU3RhdHNQYXR0ZXJuKTsKIAogICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuZmluaXNoQ29tcGFjdGlvbihjb21wYWN0aW9uSG9sZGVyKTsKLSAgICAgICAgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woImNvbXBhY3Rpb25zdGF0cyIpOwotICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7Ci0gICAgICAgIHN0ZG91dCA9IHRvb2wuZ2V0U3Rkb3V0KCk7Ci0gICAgICAgIGFzc2VydFRoYXQoc3Rkb3V0KS5jb250YWlucygicGVuZGluZyB0YXNrczogMCIpOworICAgICAgICB3YWl0Rm9yTnVtYmVyT2ZQZW5kaW5nVGFza3MoMCwgImNvbXBhY3Rpb25zdGF0cyIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xNDgsMTMgKzE0NCwyNyBAQAogICAgICAgICBsb25nIGJ5dGVzVG90YWwgPSAxMjM0NTY7CiAgICAgICAgIFRpbWVVVUlEIGNvbXBhY3Rpb25JZCA9IG5leHRUaW1lVVVJRCgpOwogICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IHNzdGFibGVzID0gSW50U3RyZWFtLnJhbmdlKDAsIDEwKQotICAgICAgICAgICAgLm1hcFRvT2JqKGkgLT4gTW9ja1NjaGVtYS5zc3RhYmxlKGksIGkgKiAxMEwsIGkgKiAxMEwgKyA5LCBjZnMpKQotICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwVG9PYmooaSAtPiBNb2NrU2NoZW1hLnNzdGFibGUoaSwgaSAqIDEwTCwgaSAqIDEwTCArIDksIGNmcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgU3RyaW5nIHRhcmdldERpcmVjdG9yeSA9ICIvc29tZS9kaXIvIiArIGNmcy5tZXRhZGF0YS5rZXlzcGFjZSArICcvJyArIGNmcy5tZXRhZGF0YS5uYW1lICsgJy0nICsgY2ZzLm1ldGFkYXRhLmlkLmFzVVVJRCgpOwogICAgICAgICBDb21wYWN0aW9uSW5mby5Ib2xkZXIgY29tcGFjdGlvbkhvbGRlciA9IG5ldyBDb21wYWN0aW9uSW5mby5Ib2xkZXIoKQogICAgICAgICB7CiAgICAgICAgICAgICBwdWJsaWMgQ29tcGFjdGlvbkluZm8gZ2V0Q29tcGFjdGlvbkluZm8oKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbkluZm8oY2ZzLm1ldGFkYXRhKCksIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiwgYnl0ZXNDb21wYWN0ZWQsIGJ5dGVzVG90YWwsIGNvbXBhY3Rpb25JZCwgc3N0YWJsZXMpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbkluZm8oY2ZzLm1ldGFkYXRhKCksIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiwgYnl0ZXNDb21wYWN0ZWQsIGJ5dGVzVG90YWwsIGNvbXBhY3Rpb25JZCwgc3N0YWJsZXMsIHRhcmdldERpcmVjdG9yeSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgQ29tcGFjdGlvbkluZm8uSG9sZGVyIG5vbkNvbXBhY3Rpb25Ib2xkZXIgPSBuZXcgQ29tcGFjdGlvbkluZm8uSG9sZGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIENvbXBhY3Rpb25JbmZvIGdldENvbXBhY3Rpb25JbmZvKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25JbmZvKGNmcy5tZXRhZGF0YSgpLCBPcGVyYXRpb25UeXBlLkNMRUFOVVAsIGJ5dGVzQ29tcGFjdGVkLCBieXRlc1RvdGFsLCBjb21wYWN0aW9uSWQsIHNzdGFibGVzKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKQpAQCAtMTY0LDIxICsxNzQsMjMgQEAKICAgICAgICAgfTsKIAogICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuYmVnaW5Db21wYWN0aW9uKGNvbXBhY3Rpb25Ib2xkZXIpOwotICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woImNvbXBhY3Rpb25zdGF0cyIsICItViIpOwotICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7Ci0gICAgICAgIFN0cmluZyBzdGRvdXQgPSB0b29sLmdldFN0ZG91dCgpOwotICAgICAgICBhc3NlcnRUaGF0KHN0ZG91dCkuY29udGFpbnMoInBlbmRpbmcgdGFza3M6IDEiKTsKLSAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHN0ZG91dCkuY29udGFpbnNQYXR0ZXJuKCJrZXlzcGFjZVxccyt0YWJsZVxccyt0YXNrIGlkXFxzK2NvbXBsZXRpb24gcmF0aW9cXHMra2luZFxccytwcm9ncmVzc1xccytzc3RhYmxlc1xccyt0b3RhbFxccyt1bml0Iik7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZFN0YXRzUGF0dGVybiA9IFN0cmluZy5mb3JtYXQoIiVzXFxzKyVzXFxzKyVzXFxzKyUuMmYlJVxccyslc1xccyslc1xccyslc1xccyslc1xccyslcyIsCi0gICAgICAgICAgICBDUUxUZXN0ZXIuS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCBjb21wYWN0aW9uSWQsIChkb3VibGUpIGJ5dGVzQ29tcGFjdGVkIC8gYnl0ZXNUb3RhbCAqIDEwMCwKLSAgICAgICAgICAgIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiwgYnl0ZXNDb21wYWN0ZWQsIHNzdGFibGVzLnNpemUoKSwgYnl0ZXNUb3RhbCwgQ29tcGFjdGlvbkluZm8uVW5pdC5CWVRFUyk7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmFjdGl2ZS5iZWdpbkNvbXBhY3Rpb24obm9uQ29tcGFjdGlvbkhvbGRlcik7CisgICAgICAgIFN0cmluZyBzdGRvdXQgPSB3YWl0Rm9yTnVtYmVyT2ZQZW5kaW5nVGFza3MoMiwgImNvbXBhY3Rpb25zdGF0cyIsICItViIpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoc3Rkb3V0KS5jb250YWluc1BhdHRlcm4oImtleXNwYWNlXFxzK3RhYmxlXFxzK3Rhc2sgaWRcXHMrY29tcGxldGlvbiByYXRpb1xccytraW5kXFxzK3Byb2dyZXNzXFxzK3NzdGFibGVzXFxzK3RvdGFsXFxzK3VuaXRcXHMrdGFyZ2V0IGRpcmVjdG9yeSIpOworICAgICAgICBTdHJpbmcgZXhwZWN0ZWRTdGF0c1BhdHRlcm4gPSBTdHJpbmcuZm9ybWF0KCIlc1xccyslc1xccyslc1xccyslLjJmJSVcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENRTFRlc3Rlci5LRVlTUEFDRSwgY3VycmVudFRhYmxlKCksIGNvbXBhY3Rpb25JZCwgKGRvdWJsZSkgYnl0ZXNDb21wYWN0ZWQgLyBieXRlc1RvdGFsICogMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiwgYnl0ZXNDb21wYWN0ZWQsIHNzdGFibGVzLnNpemUoKSwgYnl0ZXNUb3RhbCwgQ29tcGFjdGlvbkluZm8uVW5pdC5CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXREaXJlY3RvcnkpOwogICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoc3Rkb3V0KS5jb250YWluc1BhdHRlcm4oZXhwZWN0ZWRTdGF0c1BhdHRlcm4pOwogCisgICAgICAgIFN0cmluZyBleHBlY3RlZFN0YXRzUGF0dGVybkZvck5vbkNvbXBhY3Rpb24gPSBTdHJpbmcuZm9ybWF0KCIlc1xccyslc1xccyslc1xccyslLjJmJSVcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUUxUZXN0ZXIuS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCBjb21wYWN0aW9uSWQsIChkb3VibGUpIGJ5dGVzQ29tcGFjdGVkIC8gYnl0ZXNUb3RhbCAqIDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uVHlwZS5DT01QQUNUSU9OLCBieXRlc0NvbXBhY3RlZCwgc3N0YWJsZXMuc2l6ZSgpLCBieXRlc1RvdGFsLCBDb21wYWN0aW9uSW5mby5Vbml0LkJZVEVTKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHN0ZG91dCkuY29udGFpbnNQYXR0ZXJuKGV4cGVjdGVkU3RhdHNQYXR0ZXJuRm9yTm9uQ29tcGFjdGlvbik7CisKICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmZpbmlzaENvbXBhY3Rpb24oY29tcGFjdGlvbkhvbGRlcik7Ci0gICAgICAgIHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJjb21wYWN0aW9uc3RhdHMiLCAiLVYiKTsKLSAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwotICAgICAgICBzdGRvdXQgPSB0b29sLmdldFN0ZG91dCgpOwotICAgICAgICBhc3NlcnRUaGF0KHN0ZG91dCkuY29udGFpbnMoInBlbmRpbmcgdGFza3M6IDAiKTsKKyAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmZpbmlzaENvbXBhY3Rpb24obm9uQ29tcGFjdGlvbkhvbGRlcik7CisgICAgICAgIHdhaXRGb3JOdW1iZXJPZlBlbmRpbmdUYXNrcygwLCAiY29tcGFjdGlvbnN0YXRzIiwgIi1WIik7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTE5MSw4ICsyMDMsOCBAQAogICAgICAgICBsb25nIGJ5dGVzVG90YWwgPSAxMjM0NTY7CiAgICAgICAgIFRpbWVVVUlEIGNvbXBhY3Rpb25JZCA9IG5leHRUaW1lVVVJRCgpOwogICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IHNzdGFibGVzID0gSW50U3RyZWFtLnJhbmdlKDAsIDEwKQotICAgICAgICAgICAgLm1hcFRvT2JqKGkgLT4gTW9ja1NjaGVtYS5zc3RhYmxlKGksIGkgKiAxMEwsIGkgKiAxMEwgKyA5LCBjZnMpKQotICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwVG9PYmooaSAtPiBNb2NrU2NoZW1hLnNzdGFibGUoaSwgaSAqIDEwTCwgaSAqIDEwTCArIDksIGNmcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKICAgICAgICAgQ29tcGFjdGlvbkluZm8uSG9sZGVyIGNvbXBhY3Rpb25Ib2xkZXIgPSBuZXcgQ29tcGFjdGlvbkluZm8uSG9sZGVyKCkKICAgICAgICAgewogICAgICAgICAgICAgcHVibGljIENvbXBhY3Rpb25JbmZvIGdldENvbXBhY3Rpb25JbmZvKCkKQEAgLTIwNywyMSArMjE5LDE1IEBACiAgICAgICAgIH07CiAKICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmJlZ2luQ29tcGFjdGlvbihjb21wYWN0aW9uSG9sZGVyKTsKLSAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJjb21wYWN0aW9uc3RhdHMiLCAiLS1odW1hbi1yZWFkYWJsZSIpOwotICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7Ci0gICAgICAgIFN0cmluZyBzdGRvdXQgPSB0b29sLmdldFN0ZG91dCgpOwotICAgICAgICBhc3NlcnRUaGF0KHN0ZG91dCkuY29udGFpbnMoInBlbmRpbmcgdGFza3M6IDEiKTsKKyAgICAgICAgU3RyaW5nIHN0ZG91dCA9IHdhaXRGb3JOdW1iZXJPZlBlbmRpbmdUYXNrcygxLCAiY29tcGFjdGlvbnN0YXRzIiwgIi0taHVtYW4tcmVhZGFibGUiKTsKICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHN0ZG91dCkuY29udGFpbnNQYXR0ZXJuKCJpZFxccytjb21wYWN0aW9uIHR5cGVcXHMra2V5c3BhY2VcXHMrdGFibGVcXHMrY29tcGxldGVkXFxzK3RvdGFsXFxzK3VuaXRcXHMrcHJvZ3Jlc3MiKTsKICAgICAgICAgU3RyaW5nIGV4cGVjdGVkU3RhdHNQYXR0ZXJuID0gU3RyaW5nLmZvcm1hdCgiJXNcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJS4yZiUlIiwKLSAgICAgICAgICAgIGNvbXBhY3Rpb25JZCwgT3BlcmF0aW9uVHlwZS5DT01QQUNUSU9OLCBDUUxUZXN0ZXIuS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCAiMTIzIGJ5dGVzIiwgIjEyMC41NiBLaUIiLAotICAgICAgICAgICAgQ29tcGFjdGlvbkluZm8uVW5pdC5CWVRFUywgKGRvdWJsZSkgYnl0ZXNDb21wYWN0ZWQgLyBieXRlc1RvdGFsICogMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYWN0aW9uSWQsIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiwgQ1FMVGVzdGVyLktFWVNQQUNFLCBjdXJyZW50VGFibGUoKSwgIjEyMyBieXRlcyIsICIxMjAuNTYgS2lCIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wYWN0aW9uSW5mby5Vbml0LkJZVEVTLCAoZG91YmxlKSBieXRlc0NvbXBhY3RlZCAvIGJ5dGVzVG90YWwgKiAxMDApOwogICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoc3Rkb3V0KS5jb250YWluc1BhdHRlcm4oZXhwZWN0ZWRTdGF0c1BhdHRlcm4pOwogCiAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmFjdGl2ZS5maW5pc2hDb21wYWN0aW9uKGNvbXBhY3Rpb25Ib2xkZXIpOwotICAgICAgICB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbCgiY29tcGFjdGlvbnN0YXRzIiwgIi0taHVtYW4tcmVhZGFibGUiKTsKLSAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwotICAgICAgICBzdGRvdXQgPSB0b29sLmdldFN0ZG91dCgpOwotICAgICAgICBhc3NlcnRUaGF0KHN0ZG91dCkuY29udGFpbnMoInBlbmRpbmcgdGFza3M6IDAiKTsKKyAgICAgICAgd2FpdEZvck51bWJlck9mUGVuZGluZ1Rhc2tzKDAsICJjb21wYWN0aW9uc3RhdHMiLCAiLS1odW1hbi1yZWFkYWJsZSIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yMzQsMTMgKzI0MCwyNyBAQAogICAgICAgICBsb25nIGJ5dGVzVG90YWwgPSAxMjM0NTY7CiAgICAgICAgIFRpbWVVVUlEIGNvbXBhY3Rpb25JZCA9IG5leHRUaW1lVVVJRCgpOwogICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IHNzdGFibGVzID0gSW50U3RyZWFtLnJhbmdlKDAsIDEwKQotICAgICAgICAgICAgLm1hcFRvT2JqKGkgLT4gTW9ja1NjaGVtYS5zc3RhYmxlKGksIGkgKiAxMEwsIGkgKiAxMEwgKyA5LCBjZnMpKQotICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwVG9PYmooaSAtPiBNb2NrU2NoZW1hLnNzdGFibGUoaSwgaSAqIDEwTCwgaSAqIDEwTCArIDksIGNmcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgU3RyaW5nIHRhcmdldERpcmVjdG9yeSA9ICIvc29tZS9kaXIvIiArIGNmcy5tZXRhZGF0YS5rZXlzcGFjZSArICcvJyArIGNmcy5tZXRhZGF0YS5uYW1lICsgJy0nICsgY2ZzLm1ldGFkYXRhLmlkLmFzVVVJRCgpOwogICAgICAgICBDb21wYWN0aW9uSW5mby5Ib2xkZXIgY29tcGFjdGlvbkhvbGRlciA9IG5ldyBDb21wYWN0aW9uSW5mby5Ib2xkZXIoKQogICAgICAgICB7CiAgICAgICAgICAgICBwdWJsaWMgQ29tcGFjdGlvbkluZm8gZ2V0Q29tcGFjdGlvbkluZm8oKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbkluZm8oY2ZzLm1ldGFkYXRhKCksIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiwgYnl0ZXNDb21wYWN0ZWQsIGJ5dGVzVG90YWwsIGNvbXBhY3Rpb25JZCwgc3N0YWJsZXMpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbkluZm8oY2ZzLm1ldGFkYXRhKCksIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiwgYnl0ZXNDb21wYWN0ZWQsIGJ5dGVzVG90YWwsIGNvbXBhY3Rpb25JZCwgc3N0YWJsZXMsIHRhcmdldERpcmVjdG9yeSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgQ29tcGFjdGlvbkluZm8uSG9sZGVyIG5vbkNvbXBhY3Rpb25Ib2xkZXIgPSBuZXcgQ29tcGFjdGlvbkluZm8uSG9sZGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIENvbXBhY3Rpb25JbmZvIGdldENvbXBhY3Rpb25JbmZvKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25JbmZvKGNmcy5tZXRhZGF0YSgpLCBPcGVyYXRpb25UeXBlLkNMRUFOVVAsIGJ5dGVzQ29tcGFjdGVkLCBieXRlc1RvdGFsLCBjb21wYWN0aW9uSWQsIHNzdGFibGVzKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKQpAQCAtMjUwLDIwICsyNzAsMzUgQEAKICAgICAgICAgfTsKIAogICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuYmVnaW5Db21wYWN0aW9uKGNvbXBhY3Rpb25Ib2xkZXIpOwotICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woImNvbXBhY3Rpb25zdGF0cyIsICItLXZ0YWJsZSIsICItLWh1bWFuLXJlYWRhYmxlIik7Ci0gICAgICAgIHRvb2wuYXNzZXJ0T25DbGVhbkV4aXQoKTsKLSAgICAgICAgU3RyaW5nIHN0ZG91dCA9IHRvb2wuZ2V0U3Rkb3V0KCk7Ci0gICAgICAgIGFzc2VydFRoYXQoc3Rkb3V0KS5jb250YWlucygicGVuZGluZyB0YXNrczogMSIpOwotICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoc3Rkb3V0KS5jb250YWluc1BhdHRlcm4oImtleXNwYWNlXFxzK3RhYmxlXFxzK3Rhc2sgaWRcXHMrY29tcGxldGlvbiByYXRpb1xccytraW5kXFxzK3Byb2dyZXNzXFxzK3NzdGFibGVzXFxzK3RvdGFsXFxzK3VuaXQiKTsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkU3RhdHNQYXR0ZXJuID0gU3RyaW5nLmZvcm1hdCgiJXNcXHMrJXNcXHMrJXNcXHMrJS4yZiUlXFxzKyVzXFxzKyVzXFxzKyVzXFxzKyVzXFxzKyVzIiwKLSAgICAgICAgICAgIENRTFRlc3Rlci5LRVlTUEFDRSwgY3VycmVudFRhYmxlKCksIGNvbXBhY3Rpb25JZCwgKGRvdWJsZSkgYnl0ZXNDb21wYWN0ZWQgLyBieXRlc1RvdGFsICogMTAwLAotICAgICAgICAgICAgT3BlcmF0aW9uVHlwZS5DT01QQUNUSU9OLCAiMTIzIGJ5dGVzIiwgc3N0YWJsZXMuc2l6ZSgpLCAiMTIwLjU2IEtpQiIsIENvbXBhY3Rpb25JbmZvLlVuaXQuQllURVMpOworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuYmVnaW5Db21wYWN0aW9uKG5vbkNvbXBhY3Rpb25Ib2xkZXIpOworICAgICAgICBTdHJpbmcgc3Rkb3V0ID0gd2FpdEZvck51bWJlck9mUGVuZGluZ1Rhc2tzKDIsICJjb21wYWN0aW9uc3RhdHMiLCAiLS12dGFibGUiLCAiLS1odW1hbi1yZWFkYWJsZSIpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoc3Rkb3V0KS5jb250YWluc1BhdHRlcm4oImtleXNwYWNlXFxzK3RhYmxlXFxzK3Rhc2sgaWRcXHMrY29tcGxldGlvbiByYXRpb1xccytraW5kXFxzK3Byb2dyZXNzXFxzK3NzdGFibGVzXFxzK3RvdGFsXFxzK3VuaXRcXHMrdGFyZ2V0IGRpcmVjdG9yeSIpOworICAgICAgICBTdHJpbmcgZXhwZWN0ZWRTdGF0c1BhdHRlcm4gPSBTdHJpbmcuZm9ybWF0KCIlc1xccyslc1xccyslc1xccyslLjJmJSVcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENRTFRlc3Rlci5LRVlTUEFDRSwgY3VycmVudFRhYmxlKCksIGNvbXBhY3Rpb25JZCwgKGRvdWJsZSkgYnl0ZXNDb21wYWN0ZWQgLyBieXRlc1RvdGFsICogMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiwgIjEyMyBieXRlcyIsIHNzdGFibGVzLnNpemUoKSwgIjEyMC41NiBLaUIiLCBDb21wYWN0aW9uSW5mby5Vbml0LkJZVEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldERpcmVjdG9yeSk7CiAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChzdGRvdXQpLmNvbnRhaW5zUGF0dGVybihleHBlY3RlZFN0YXRzUGF0dGVybik7CisgICAgICAgIFN0cmluZyBleHBlY3RlZFN0YXRzUGF0dGVybkZvck5vbkNvbXBhY3Rpb24gPSBTdHJpbmcuZm9ybWF0KCIlc1xccyslc1xccyslc1xccyslLjJmJSVcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUUxUZXN0ZXIuS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCBjb21wYWN0aW9uSWQsIChkb3VibGUpIGJ5dGVzQ29tcGFjdGVkIC8gYnl0ZXNUb3RhbCAqIDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uVHlwZS5DTEVBTlVQLCAiMTIzIGJ5dGVzIiwgc3N0YWJsZXMuc2l6ZSgpLCAiMTIwLjU2IEtpQiIsIENvbXBhY3Rpb25JbmZvLlVuaXQuQllURVMpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoc3Rkb3V0KS5jb250YWluc1BhdHRlcm4oZXhwZWN0ZWRTdGF0c1BhdHRlcm5Gb3JOb25Db21wYWN0aW9uKTsKIAogICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuZmluaXNoQ29tcGFjdGlvbihjb21wYWN0aW9uSG9sZGVyKTsKLSAgICAgICAgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woImNvbXBhY3Rpb25zdGF0cyIsICItLXZ0YWJsZSIsICItLWh1bWFuLXJlYWRhYmxlIik7Ci0gICAgICAgIHRvb2wuYXNzZXJ0T25DbGVhbkV4aXQoKTsKLSAgICAgICAgc3Rkb3V0ID0gdG9vbC5nZXRTdGRvdXQoKTsKLSAgICAgICAgYXNzZXJ0VGhhdChzdGRvdXQpLmNvbnRhaW5zKCJwZW5kaW5nIHRhc2tzOiAwIik7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmFjdGl2ZS5maW5pc2hDb21wYWN0aW9uKG5vbkNvbXBhY3Rpb25Ib2xkZXIpOworICAgICAgICB3YWl0Rm9yTnVtYmVyT2ZQZW5kaW5nVGFza3MoMCwgImNvbXBhY3Rpb25zdGF0cyIsICItLXZ0YWJsZSIsICItLWh1bWFuLXJlYWRhYmxlIik7CiAgICAgfQotfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgd2FpdEZvck51bWJlck9mUGVuZGluZ1Rhc2tzKGludCBwZW5kaW5nVGFza3NUb1dhaXRGb3IsIFN0cmluZy4uLiBhcmdzKQorICAgIHsKKyAgICAgICAgQXRvbWljUmVmZXJlbmNlPFN0cmluZz4gc3Rkb3V0ID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7CisgICAgICAgIEF3YWl0aWxpdHkuYXdhaXQoKS51bnRpbCgoKSAtPiB7CisgICAgICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woYXJncyk7CisgICAgICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7CisgICAgICAgICAgICBTdHJpbmcgb3V0cHV0ID0gdG9vbC5nZXRTdGRvdXQoKTsKKyAgICAgICAgICAgIHN0ZG91dC5zZXQob3V0cHV0KTsKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXQuY29udGFpbnMoInBlbmRpbmcgdGFza3M6ICIgKyBwZW5kaW5nVGFza3NUb1dhaXRGb3IpOworICAgICAgICB9KTsKKworICAgICAgICByZXR1cm4gc3Rkb3V0LmdldCgpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvRm9yY2VDb21wYWN0aW9uVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0ZvcmNlQ29tcGFjdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGQzNjllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0ZvcmNlQ29tcGFjdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDI4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5ub2RldG9vbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklTU1RhYmxlU2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworCitwdWJsaWMgY2xhc3MgRm9yY2VDb21wYWN0aW9uVGVzdCBleHRlbmRzIENRTFRlc3RlcgoreworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBOVU1fUEFSVElUSU9OUyA9IDEwOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBOVU1fUk9XUyA9IDEwMDsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGtleSB0ZXh0LCBjMSB0ZXh0LCBjMiB0ZXh0LCBjMyB0ZXh0LCBQUklNQVJZIEtFWSAoa2V5LCBjMSkpIik7CisKKyAgICAgICAgZm9yIChpbnQgcGFydGl0aW9uQ291bnQgPSAwOyBwYXJ0aXRpb25Db3VudCA8IE5VTV9QQVJUSVRJT05TOyBwYXJ0aXRpb25Db3VudCsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCByb3dDb3VudCA9IDA7IHJvd0NvdW50IDwgTlVNX1JPV1M7IHJvd0NvdW50KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGtleSwgYzEsIGMyLCBjMykgVkFMVUVTICg/LCA/LCA/LCA/KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiayIgKyBwYXJ0aXRpb25Db3VudCwgImMxXyIgKyByb3dDb3VudCwgImMyXyIgKyByb3dDb3VudCwgImMzXyIgKyByb3dDb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEaXNhYmxlIGF1dG8gY29tcGFjdGlvbgorICAgICAgICAvLyBOT1RFOiBXZSBjYW4gb25seSBkaXNhYmxlIHRoZSBhdXRvIGNvbXBhY3Rpb24gb25jZSB0aGUgdGFibGUgaXMgY3JlYXRlZCBiZWNhdXNlIHRoZSBzZXR0aW5nIGlzIG9uCisgICAgICAgIC8vIHRoZSB0YWJsZSBsZXZlbC4gQW5kIHdlIGRvbid0IG5lZWQgdG8gcmUtZW5hYmxlIGl0IGJhY2sgYmVjYXVzZSB0aGUgdGFibGUgd2lsbCBiZSBkcm9wcGVkIGFmdGVyIHRoZSB0ZXN0LgorICAgICAgICBkaXNhYmxlQ29tcGFjdGlvbigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZm9yY2VDb21wYWN0UGFydGl0aW9uVG9tYnN0b25lVGVzdCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFN0cmluZyBrZXlUb1B1cmdlID0gImswIjsKKworICAgICAgICB0ZXN0SGVscGVyKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrZXkgPSA/Iiwga2V5VG9QdXJnZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBmb3JjZUNvbXBhY3RNdWx0aXBsZVBhcnRpdGlvbnNUb21ic3RvbmVUZXN0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGtleXNUb1B1cmdlID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgpOworCisgICAgICAgIGludCBudW1QYXJ0aXRpb25zVG9QdXJnZSA9IDEgKyByYW5kLm5leHRJbnQoTlVNX1BBUlRJVElPTlMpOworICAgICAgICBmb3IgKGludCBjb3VudCA9IDA7IGNvdW50IDwgbnVtUGFydGl0aW9uc1RvUHVyZ2U7IGNvdW50KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSAiayIgKyByYW5kLm5leHRJbnQoTlVNX1BBUlRJVElPTlMpOworCisgICAgICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrZXkgPSA/Iiwga2V5KTsKKyAgICAgICAgICAgIGtleXNUb1B1cmdlLmFkZChrZXkpOworICAgICAgICB9CisKKyAgICAgICAgZmx1c2goKTsKKworICAgICAgICBTdHJpbmdbXSBrZXlzID0gbmV3IFN0cmluZ1trZXlzVG9QdXJnZS5zaXplKCldOworICAgICAgICBrZXlzID0ga2V5c1RvUHVyZ2UudG9BcnJheShrZXlzKTsKKyAgICAgICAgZm9yY2VDb21wYWN0KGtleXMpOworCisgICAgICAgIHZlcmlmeU5vdENvbnRhaW5zVG9tYnN0b25lcygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZm9yY2VDb21wYWN0Um93VG9tYnN0b25lVGVzdCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFN0cmluZyBrZXlUb1B1cmdlID0gImswIjsKKworICAgICAgICB0ZXN0SGVscGVyKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrZXkgPSA/IEFORCBjMSA9ICdjMV8wJyIsIGtleVRvUHVyZ2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZm9yY2VDb21wYWN0TXVsdGlwbGVSb3dzVG9tYnN0b25lVGVzdCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBrZXlzVG9QdXJnZSA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIFJhbmRvbSByYW5kUGFydGl0aW9uID0gbmV3IFJhbmRvbSgpOworICAgICAgICBSYW5kb20gcmFuZFJvdyA9IG5ldyBSYW5kb20oKTsKKworICAgICAgICBmb3IgKGludCBjb3VudCA9IDA7IGNvdW50IDwgMTA7IGNvdW50KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXJ0aXRpb25LZXkgPSAiayIgKyByYW5kUGFydGl0aW9uLm5leHRJbnQoTlVNX1BBUlRJVElPTlMpOworICAgICAgICAgICAgU3RyaW5nIGNsdXN0ZXJpbmdLZXkgPSAiYzFfIiArIHJhbmRSb3cubmV4dEludChOVU1fUk9XUyk7CisKKyAgICAgICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICVzIFdIRVJFIGtleSA9ID8gQU5EIGMxID0gPyIsIHBhcnRpdGlvbktleSwgY2x1c3RlcmluZ0tleSk7CisgICAgICAgICAgICBrZXlzVG9QdXJnZS5hZGQocGFydGl0aW9uS2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIGZsdXNoKCk7CisKKyAgICAgICAgU3RyaW5nW10ga2V5cyA9IG5ldyBTdHJpbmdba2V5c1RvUHVyZ2Uuc2l6ZSgpXTsKKyAgICAgICAga2V5cyA9IGtleXNUb1B1cmdlLnRvQXJyYXkoa2V5cyk7CisgICAgICAgIGZvcmNlQ29tcGFjdChrZXlzKTsKKworICAgICAgICB2ZXJpZnlOb3RDb250YWluc1RvbWJzdG9uZXMoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGZvcmNlQ29tcGFjdENlbGxUb21ic3RvbmVUZXN0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgU3RyaW5nIGtleVRvUHVyZ2UgPSAiazAiOworICAgICAgICB0ZXN0SGVscGVyKCJERUxFVEUgYzIgRlJPTSAlcyBXSEVSRSBrZXkgPSA/IEFORCBjMSA9ICdjMV8wJyIsIGtleVRvUHVyZ2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZm9yY2VDb21wYWN0TXVsdGlwbGVDZWxsc1RvbWJzdG9uZVRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBMaXN0PFN0cmluZz4ga2V5c1RvUHVyZ2UgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICBSYW5kb20gcmFuZFBhcnRpdGlvbiA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgUmFuZG9tIHJhbmRSb3cgPSBuZXcgUmFuZG9tKCk7CisKKyAgICAgICAgZm9yIChpbnQgY291bnQgPSAwOyBjb3VudCA8IDEwOyBjb3VudCsrKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgcGFydGl0aW9uS2V5ID0gImsiICsgcmFuZFBhcnRpdGlvbi5uZXh0SW50KE5VTV9QQVJUSVRJT05TKTsKKyAgICAgICAgICAgIFN0cmluZyBjbHVzdGVyaW5nS2V5ID0gImMxXyIgKyByYW5kUm93Lm5leHRJbnQoTlVNX1JPV1MpOworCisgICAgICAgICAgICBleGVjdXRlKCJERUxFVEUgYzIsIGMzIEZST00gJXMgV0hFUkUga2V5ID0gPyBBTkQgYzEgPSA/IiwgcGFydGl0aW9uS2V5LCBjbHVzdGVyaW5nS2V5KTsKKyAgICAgICAgICAgIGtleXNUb1B1cmdlLmFkZChwYXJ0aXRpb25LZXkpOworICAgICAgICB9CisKKyAgICAgICAgZmx1c2goKTsKKworICAgICAgICBTdHJpbmdbXSBrZXlzID0gbmV3IFN0cmluZ1trZXlzVG9QdXJnZS5zaXplKCldOworICAgICAgICBrZXlzID0ga2V5c1RvUHVyZ2UudG9BcnJheShrZXlzKTsKKyAgICAgICAgZm9yY2VDb21wYWN0KGtleXMpOworCisgICAgICAgIHZlcmlmeU5vdENvbnRhaW5zVG9tYnN0b25lcygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZm9yY2VDb21wYWN0VXBkYXRlQ2VsbFRvbWJzdG9uZVRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBTdHJpbmcga2V5VG9QdXJnZSA9ICJrMCI7CisgICAgICAgIHRlc3RIZWxwZXIoIlVQREFURSAlcyBTRVQgYzIgPSBudWxsIFdIRVJFIGtleSA9ID8gQU5EIGMxID0gJ2MxXzAnIiwga2V5VG9QdXJnZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBmb3JjZUNvbXBhY3RUVExFeHBpcnlUZXN0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgaW50IHR0bFNlYyA9IDI7CisgICAgICAgIFN0cmluZyBrZXlUb1B1cmdlID0gImswIjsKKworICAgICAgICBleGVjdXRlKCJVUERBVEUgJXMgVVNJTkcgVFRMID8gU0VUIGMyID0gJ2JiYicgV0hFUkUga2V5ID0gPyBBTkQgYzEgPSAnYzFfMCciLCB0dGxTZWMsIGtleVRvUHVyZ2UpOworCisgICAgICAgIGZsdXNoKCk7CisKKyAgICAgICAgLy8gV2FpdCB1bnRpbCB0aGUgVFRMIGhhcyBiZWVuIGV4cGlyZWQKKyAgICAgICAgLy8gTk9URTogd2UgZG91YmxlIHRoZSB3YWl0IHRpbWUgb2YgdGhlIHR0bCB0byBiZSBvbiB0aGUgc2FmZXIgc2lkZSBhbmQgYXZvaWQgdGhlIGZsYWtpbmVzcyBvZiB0aGUgdGVzdAorICAgICAgICBUaHJlYWQuc2xlZXAodHRsU2VjICogMTAwMCAqIDIpOworCisgICAgICAgIFN0cmluZ1tdIGtleXNUb1B1cmdlID0gbmV3IFN0cmluZ1tde2tleVRvUHVyZ2V9OworICAgICAgICBmb3JjZUNvbXBhY3Qoa2V5c1RvUHVyZ2UpOworCisgICAgICAgIHZlcmlmeU5vdENvbnRhaW5zVG9tYnN0b25lcygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZm9yY2VDb21wYWN0Q29tcG9zaXRlUGFydGl0aW9uS2V5c1Rlc3QoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrZXkxIHRleHQsIGtleTIgdGV4dCwgYzEgdGV4dCwgYzIgdGV4dCwgUFJJTUFSWSBLRVkgKChrZXkxLCBrZXkyKSwgYzEpKSIpOworCisgICAgICAgIGZvciAoaW50IHBhcnRpdGlvbkNvdW50ID0gMDsgcGFydGl0aW9uQ291bnQgPCBOVU1fUEFSVElUSU9OUzsgcGFydGl0aW9uQ291bnQrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgcm93Q291bnQgPSAwOyByb3dDb3VudCA8IE5VTV9ST1dTOyByb3dDb3VudCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrZXkxLCBrZXkyLCBjMSwgYzIpIFZBTFVFUyAoPywgPywgPywgPykiLAorICAgICAgICAgICAgICAgICAgICAgICAgImsxXyIgKyBwYXJ0aXRpb25Db3VudCwgImsyXyIgKyBwYXJ0aXRpb25Db3VudCwgImMxXyIgKyByb3dDb3VudCwgImMyXyIgKyByb3dDb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEaXNhYmxlIGF1dG8gY29tcGFjdGlvbgorICAgICAgICAvLyBOT1RFOiBXZSBjYW4gb25seSBkaXNhYmxlIHRoZSBhdXRvIGNvbXBhY3Rpb24gb25jZSB0aGUgdGFibGUgaXMgY3JlYXRlZCBiZWNhdXNlIHRoZSBzZXR0aW5nIGlzIG9uCisgICAgICAgIC8vIHRoZSB0YWJsZSBsZXZlbC4gQW5kIHdlIGRvbid0IG5lZWQgdG8gcmUtZW5hYmxlIGl0IGJhY2sgYmVjYXVzZSB0aGUgdGFibGUgd2lsbCBiZSBkcm9wcGVkIGFmdGVyIHRoZSB0ZXN0LgorICAgICAgICBkaXNhYmxlQ29tcGFjdGlvbigpOworCisgICAgICAgIFN0cmluZyBrZXlUb1B1cmdlID0gImsxXzA6azJfMCI7CisKKyAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUga2V5MSA9ICdrMV8wJyBhbmQga2V5MiA9ICdrMl8wJyIpOworCisgICAgICAgIGZsdXNoKCk7CisKKyAgICAgICAgU3RyaW5nW10ga2V5c1RvUHVyZ2UgPSBuZXcgU3RyaW5nW117a2V5VG9QdXJnZX07CisgICAgICAgIGZvcmNlQ29tcGFjdChrZXlzVG9QdXJnZSk7CisKKyAgICAgICAgdmVyaWZ5Tm90Q29udGFpbnNUb21ic3RvbmVzKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RIZWxwZXIoU3RyaW5nIGNxbFN0YXRlbWVudCwgU3RyaW5nIGtleVRvUHVyZ2UpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGV4ZWN1dGUoY3FsU3RhdGVtZW50LCBrZXlUb1B1cmdlKTsKKworICAgICAgICBmbHVzaCgpOworCisgICAgICAgIFN0cmluZ1tdIGtleXNUb1B1cmdlID0gbmV3IFN0cmluZ1tde2tleVRvUHVyZ2V9OworICAgICAgICBmb3JjZUNvbXBhY3Qoa2V5c1RvUHVyZ2UpOworCisgICAgICAgIHZlcmlmeU5vdENvbnRhaW5zVG9tYnN0b25lcygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmb3JjZUNvbXBhY3QoU3RyaW5nW10gcGFydGl0aW9uS2V5c0lnbm9yZUdjR3JhY2UpCisgICAgeworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKTsKKyAgICAgICAgaWYgKGNmcyAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBjZnMuZm9yY2VDb21wYWN0aW9uS2V5c0lnbm9yaW5nR2NHcmFjZShwYXJ0aXRpb25LZXlzSWdub3JlR2NHcmFjZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Tm90Q29udGFpbnNUb21ic3RvbmVzKCkKKyAgICB7CisgICAgICAgIC8vIEdldCBzc3RhYmxlcworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKGtleXNwYWNlKCkpLmdldENvbHVtbkZhbWlseVN0b3JlKGN1cnJlbnRUYWJsZSgpKTsKKyAgICAgICAgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKTsKKworICAgICAgICAvLyBhbHdheXMgcnVuIGEgbWFqb3IgY29tcGFjdGlvbiBiZWZvcmUgY2FsbGluZyB0aGlzCisgICAgICAgIGFzc2VydFRydWUoc3N0YWJsZXMuc2l6ZSgpID09IDEpOworCisgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IHNzdGFibGVzLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICBpbnQgYWN0dWFsUHVyZ2VkVG9tYnN0b25lQ291bnQgPSAwOworICAgICAgICB0cnkgKElTU1RhYmxlU2Nhbm5lciBzY2FubmVyID0gc3N0YWJsZS5nZXRTY2FubmVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlIChzY2FubmVyLmhhc05leHQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkgKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyID0gc2Nhbm5lci5uZXh0KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBQYXJ0aXRpb24gc2hvdWxkIGJlIGFsbCBhbGl2ZQorICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGl0ZXIucGFydGl0aW9uTGV2ZWxEZWxldGlvbigpLmlzTGl2ZSgpKTsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVuZmlsdGVyZWQgYXRvbSA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0b20uaXNSb3coKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3cgciA9IChSb3cpYXRvbTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJvdyBzaG91bGQgYmUgYWxsIGFsaXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyLmRlbGV0aW9uKCkuaXNMaXZlKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2VsbCBzaG91bGQgYmUgYWxpdmUgYXMgd2VsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQ2VsbCBjIDogci5jZWxscygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYy5pc1RvbWJzdG9uZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0dldEF1ZGl0TG9nVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0dldEF1ZGl0TG9nVGVzdC5qYXZhCmluZGV4IDA2OTcxMGIuLmI5NjE4N2YgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9HZXRBdWRpdExvZ1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvR2V0QXVkaXRMb2dUZXN0LmphdmEKQEAgLTMyLDYgKzMyLDcgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgeworICAgICAgICByZXF1aXJlTmV0d29yaygpOwogICAgICAgICBzdGFydEpNWFNlcnZlcigpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0dldEF1dGhDYWNoZUNvbmZpZ1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9HZXRBdXRoQ2FjaGVDb25maWdUZXN0LmphdmEKaW5kZXggNmFmYzE3OS4uOTA0ODRlMyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0dldEF1dGhDYWNoZUNvbmZpZ1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvR2V0QXV0aENhY2hlQ29uZmlnVGVzdC5qYXZhCkBAIC00Miw2ICs0Miw3IEBACiAgICAgewogICAgICAgICBDUUxUZXN0ZXIuc2V0VXBDbGFzcygpOwogICAgICAgICBDUUxUZXN0ZXIucmVxdWlyZUF1dGhlbnRpY2F0aW9uKCk7CisgICAgICAgIHJlcXVpcmVOZXR3b3JrKCk7CiAgICAgICAgIHN0YXJ0Sk1YU2VydmVyKCk7CiAgICAgfQogCkBAIC05NSwxNyArOTYsMTcgQEAKICAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJnZXRhdXRoY2FjaGVjb25maWciKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldEV4aXRDb2RlKCkpLmlzRXF1YWxUbygxKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5pc0VxdWFsVG8od3JhcEJ5RGVmYXVsdE5vZGV0b29sTWVzc2FnZSgiUmVxdWlyZWQgb3B0aW9uICctLWNhY2hlLW5hbWUnIGlzIG1pc3NpbmciKSk7Ci0gICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRlcnIoKSkuaXNFbXB0eSgpOworICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0Q2xlYW5lZFN0ZGVycigpKS5pc0VtcHR5KCk7CiAKICAgICAgICAgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woImdldGF1dGhjYWNoZWNvbmZpZyIsICItLWNhY2hlLW5hbWUiKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldEV4aXRDb2RlKCkpLmlzRXF1YWxUbygxKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5pc0VxdWFsVG8od3JhcEJ5RGVmYXVsdE5vZGV0b29sTWVzc2FnZSgiUmVxdWlyZWQgdmFsdWVzIGZvciBvcHRpb24gJ2NhY2hlLW5hbWUnIG5vdCBwcm92aWRlZCIpKTsKLSAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZGVycigpKS5pc0VtcHR5KCk7CisgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmlzRW1wdHkoKTsKIAogICAgICAgICB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbCgiZ2V0YXV0aGNhY2hlY29uZmlnIiwgIi0tY2FjaGUtbmFtZSIsICJ3cm9uZyIpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0RXhpdENvZGUoKSkuaXNFcXVhbFRvKDEpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmlzRXF1YWxUbyh3cmFwQnlEZWZhdWx0Tm9kZXRvb2xNZXNzYWdlKCJVbmtub3duIGNhY2hlIG5hbWU6IHdyb25nIikpOwotICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3RkZXJyKCkpLmlzRW1wdHkoKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldENsZWFuZWRTdGRlcnIoKSkuaXNFbXB0eSgpOwogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvR2V0RnVsbFF1ZXJ5TG9nVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0dldEZ1bGxRdWVyeUxvZ1Rlc3QuamF2YQppbmRleCA2MWQzNGVjLi5kZmMxMDk5IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvR2V0RnVsbFF1ZXJ5TG9nVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9HZXRGdWxsUXVlcnlMb2dUZXN0LmphdmEKQEAgLTM4LDYgKzM4LDcgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgeworICAgICAgICByZXF1aXJlTmV0d29yaygpOwogICAgICAgICBzdGFydEpNWFNlcnZlcigpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0ludmFsaWRhdGVDcmVkZW50aWFsc0NhY2hlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0ludmFsaWRhdGVDcmVkZW50aWFsc0NhY2hlVGVzdC5qYXZhCmluZGV4IDQwZDdmZmIuLmQ4M2M4NDYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9JbnZhbGlkYXRlQ3JlZGVudGlhbHNDYWNoZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvSW52YWxpZGF0ZUNyZWRlbnRpYWxzQ2FjaGVUZXN0LmphdmEKQEAgLTYyLDYgKzYyLDcgQEAKICAgICAgICAgICAgICAgICAubmV3QXV0aGVudGljYXRvcigoRW5kUG9pbnQpIG51bGwsIG51bGwpCiAgICAgICAgICAgICAgICAgLmluaXRpYWxSZXNwb25zZSgpKTsKIAorICAgICAgICByZXF1aXJlTmV0d29yaygpOwogICAgICAgICBzdGFydEpNWFNlcnZlcigpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0ludmFsaWRhdGVKbXhQZXJtaXNzaW9uc0NhY2hlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0ludmFsaWRhdGVKbXhQZXJtaXNzaW9uc0NhY2hlVGVzdC5qYXZhCmluZGV4IGY0NGEyNzQuLjU0ZjJkZTcgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9JbnZhbGlkYXRlSm14UGVybWlzc2lvbnNDYWNoZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvSW52YWxpZGF0ZUpteFBlcm1pc3Npb25zQ2FjaGVUZXN0LmphdmEKQEAgLTY1LDYgKzY1LDcgQEAKIAogICAgICAgICBBdXRoQ2FjaGVTZXJ2aWNlLmluaXRpYWxpemVBbmRSZWdpc3RlckNhY2hlcygpOwogCisgICAgICAgIHJlcXVpcmVOZXR3b3JrKCk7CiAgICAgICAgIHN0YXJ0Sk1YU2VydmVyKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvSW52YWxpZGF0ZU5ldHdvcmtQZXJtaXNzaW9uc0NhY2hlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0ludmFsaWRhdGVOZXR3b3JrUGVybWlzc2lvbnNDYWNoZVRlc3QuamF2YQppbmRleCBjNTRlNTI2Li40MTIyMDY2IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvSW52YWxpZGF0ZU5ldHdvcmtQZXJtaXNzaW9uc0NhY2hlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9JbnZhbGlkYXRlTmV0d29ya1Blcm1pc3Npb25zQ2FjaGVUZXN0LmphdmEKQEAgLTQ3LDYgKzQ3LDcgQEAKICAgICAgICAgcm9sZU1hbmFnZXIuY3JlYXRlUm9sZShBdXRoZW50aWNhdGVkVXNlci5TWVNURU1fVVNFUiwgUk9MRV9CLCBBdXRoVGVzdFV0aWxzLmdldExvZ2luUm9sZU9wdGlvbnMoKSk7CiAgICAgICAgIEF1dGhDYWNoZVNlcnZpY2UuaW5pdGlhbGl6ZUFuZFJlZ2lzdGVyQ2FjaGVzKCk7CiAKKyAgICAgICAgcmVxdWlyZU5ldHdvcmsoKTsKICAgICAgICAgc3RhcnRKTVhTZXJ2ZXIoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9JbnZhbGlkYXRlUGVybWlzc2lvbnNDYWNoZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9JbnZhbGlkYXRlUGVybWlzc2lvbnNDYWNoZVRlc3QuamF2YQppbmRleCBlNmQyYmExLi5jOGFmZmIyIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvSW52YWxpZGF0ZVBlcm1pc3Npb25zQ2FjaGVUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0ludmFsaWRhdGVQZXJtaXNzaW9uc0NhY2hlVGVzdC5qYXZhCkBAIC04NSw2ICs4NSw3IEBACiAgICAgICAgICAgICBhdXRob3JpemVyLmdyYW50KEF1dGhlbnRpY2F0ZWRVc2VyLlNZU1RFTV9VU0VSLCBwZXJtaXNzaW9ucywgcmVzb3VyY2UsIFJPTEVfQik7CiAgICAgICAgIH0KIAorICAgICAgICByZXF1aXJlTmV0d29yaygpOwogICAgICAgICBzdGFydEpNWFNlcnZlcigpOwogICAgIH0KIApAQCAtMTg1LDQ0ICsxODYsNDQgQEAKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldEV4aXRDb2RlKCkpLmlzRXF1YWxUbygxKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKQogICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8od3JhcEJ5RGVmYXVsdE5vZGV0b29sTWVzc2FnZSgiTm8gcmVzb3VyY2Ugb3B0aW9ucyBhbGxvd2VkIHdpdGhvdXQgYSA8cm9sZT4gYmVpbmcgc3BlY2lmaWVkIikpOwotICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3RkZXJyKCkpLmlzRW1wdHkoKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldENsZWFuZWRTdGRlcnIoKSkuaXNFbXB0eSgpOwogCiAgICAgICAgIHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJpbnZhbGlkYXRlcGVybWlzc2lvbnNjYWNoZSIsICJyb2xlMSIpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0RXhpdENvZGUoKSkuaXNFcXVhbFRvKDEpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpCiAgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyh3cmFwQnlEZWZhdWx0Tm9kZXRvb2xNZXNzYWdlKCJObyByZXNvdXJjZSBvcHRpb25zIHNwZWNpZmllZCIpKTsKLSAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZGVycigpKS5pc0VtcHR5KCk7CisgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmlzRW1wdHkoKTsKIAogICAgICAgICB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbCgiaW52YWxpZGF0ZXBlcm1pc3Npb25zY2FjaGUiLCAicm9sZTEiLCAiLS1pbnZhbGlkLW9wdGlvbiIpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0RXhpdENvZGUoKSkuaXNFcXVhbFRvKDEpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpCiAgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyh3cmFwQnlEZWZhdWx0Tm9kZXRvb2xNZXNzYWdlKCJBIHNpbmdsZSA8cm9sZT4gaXMgb25seSBzdXBwb3J0ZWQgLyB5b3UgaGF2ZSBhIHR5cG8gaW4gdGhlIHJlc291cmNlIG9wdGlvbnMgc3BlbGxpbmciKSk7Ci0gICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRlcnIoKSkuaXNFbXB0eSgpOworICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0Q2xlYW5lZFN0ZGVycigpKS5pc0VtcHR5KCk7CiAKICAgICAgICAgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woImludmFsaWRhdGVwZXJtaXNzaW9uc2NhY2hlIiwgInJvbGUxIiwgIi0tYWxsLXRhYmxlcyIpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0RXhpdENvZGUoKSkuaXNFcXVhbFRvKDEpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpCiAgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyh3cmFwQnlEZWZhdWx0Tm9kZXRvb2xNZXNzYWdlKCItLWFsbC10YWJsZXMgb3B0aW9uIHNob3VsZCBiZSBwYXNzZWQgYWxvbmcgd2l0aCAtLWtleXNwYWNlIG9wdGlvbiIpKTsKLSAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZGVycigpKS5pc0VtcHR5KCk7CisgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmlzRW1wdHkoKTsKIAogICAgICAgICB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbCgiaW52YWxpZGF0ZXBlcm1pc3Npb25zY2FjaGUiLCAicm9sZTEiLCAiLS10YWJsZSIsICJ0MSIpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0RXhpdENvZGUoKSkuaXNFcXVhbFRvKDEpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpCiAgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyh3cmFwQnlEZWZhdWx0Tm9kZXRvb2xNZXNzYWdlKCItLXRhYmxlIG9wdGlvbiBzaG91bGQgYmUgcGFzc2VkIGFsb25nIHdpdGggLS1rZXlzcGFjZSBvcHRpb24iKSk7Ci0gICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRlcnIoKSkuaXNFbXB0eSgpOworICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0Q2xlYW5lZFN0ZGVycigpKS5pc0VtcHR5KCk7CiAKICAgICAgICAgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woImludmFsaWRhdGVwZXJtaXNzaW9uc2NhY2hlIiwgInJvbGUxIiwgIi0tZnVuY3Rpb24iLCAiZltJbnQzMlR5cGVdIik7CiAgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRFeGl0Q29kZSgpKS5pc0VxdWFsVG8oMSk7CiAgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkKICAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKHdyYXBCeURlZmF1bHROb2RldG9vbE1lc3NhZ2UoIi0tZnVuY3Rpb24gb3B0aW9uIHNob3VsZCBiZSBwYXNzZWQgYWxvbmcgd2l0aCAtLWZ1bmN0aW9ucy1pbi1rZXlzcGFjZSBvcHRpb24iKSk7Ci0gICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRlcnIoKSkuaXNFbXB0eSgpOworICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0Q2xlYW5lZFN0ZGVycigpKS5pc0VtcHR5KCk7CiAKICAgICAgICAgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woImludmFsaWRhdGVwZXJtaXNzaW9uc2NhY2hlIiwgInJvbGUxIiwgIi0tZnVuY3Rpb25zLWluLWtleXNwYWNlIiwKICAgICAgICAgICAgICAgICBLRVlTUEFDRSwgIi0tZnVuY3Rpb24iLCAiZlt4XSIpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0RXhpdENvZGUoKSkuaXNFcXVhbFRvKDEpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpCiAgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyh3cmFwQnlEZWZhdWx0Tm9kZXRvb2xNZXNzYWdlKCJBbiBlcnJvciB3YXMgZW5jb3VudGVyZWQgd2hlbiBsb29raW5nIHVwIGZ1bmN0aW9uIGRlZmluaXRpb246IFVuYWJsZSB0byBmaW5kIGFic3RyYWN0LXR5cGUgY2xhc3MgJ29yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwueCciKSk7Ci0gICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRlcnIoKSkuaXNFbXB0eSgpOworICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0Q2xlYW5lZFN0ZGVycigpKS5pc0VtcHR5KCk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9JbnZhbGlkYXRlUm9sZXNDYWNoZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9JbnZhbGlkYXRlUm9sZXNDYWNoZVRlc3QuamF2YQppbmRleCBiYjhmYjkyLi4wOGJhNjc2IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvSW52YWxpZGF0ZVJvbGVzQ2FjaGVUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0ludmFsaWRhdGVSb2xlc0NhY2hlVGVzdC5qYXZhCkBAIC00Nyw2ICs0Nyw3IEBACiAgICAgICAgIHJvbGVNYW5hZ2VyLmNyZWF0ZVJvbGUoQXV0aGVudGljYXRlZFVzZXIuU1lTVEVNX1VTRVIsIFJPTEVfQiwgQXV0aFRlc3RVdGlscy5nZXRMb2dpblJvbGVPcHRpb25zKCkpOwogICAgICAgICBBdXRoQ2FjaGVTZXJ2aWNlLmluaXRpYWxpemVBbmRSZWdpc3RlckNhY2hlcygpOwogCisgICAgICAgIHJlcXVpcmVOZXR3b3JrKCk7CiAgICAgICAgIHN0YXJ0Sk1YU2VydmVyKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvTmV0U3RhdHNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvTmV0U3RhdHNUZXN0LmphdmEKaW5kZXggZjhiZDUzMC4uN2JkZGM5YiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL05ldFN0YXRzVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9OZXRTdGF0c1Rlc3QuamF2YQpAQCAtMTE3LDcgKzExNyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3NBbmRQb3J0LmdldExvY2FsSG9zdCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVN1bW1hcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TdW1tYXJpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUuQ09NUExFVEUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlLkNPTVBMRVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwogCiAgICAgICAgIHRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7IFByaW50U3RyZWFtIG91dCA9IG5ldyBQcmludFN0cmVhbShiYW9zKSkKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1JpbmdUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvUmluZ1Rlc3QuamF2YQppbmRleCAwMGM4YmJhLi4yOGZmZmQ5IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvUmluZ1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvUmluZ1Rlc3QuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIAoraW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCkBAIC0xNTUsNyArMTU2LDcgQEAKICAgICB7CiAgICAgICAgIC8vIEJhZCBLUwogICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woInJpbmciLCAibW9ja2tzIik7Ci0gICAgICAgIHRvb2wuYXNzZXJ0T25DbGVhbkV4aXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCB0b29sLmdldEV4aXRDb2RlKCkpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJUaGUga2V5c3BhY2UgbW9ja2tzLCBkb2VzIG5vdCBleGlzdCIpOwogCiAgICAgICAgIC8vIEdvb2QgS1MKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TY3J1YlRvb2xUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU2NydWJUb29sVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMDdjZTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU2NydWJUb29sVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLm5vZGV0b29sOworCitpbXBvcnQgamF2YS5pby5JT0Vycm9yOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVVJRFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuV3JpdGVUaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29ycnVwdFNTVGFibGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TY3J1YlRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuU3RhbmRhbG9uZVNjcnViYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlRvb2xSdW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKK2ltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlci5jb3VudGVyQ0ZNRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyLmNyZWF0ZUtleXNwYWNlOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIuZ2V0Q29tcHJlc3Npb25QYXJhbWV0ZXJzOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIubG9hZFNjaGVtYTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX1VUSUxfQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1Q7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2NydWJUZXN0LkNGX0lOREVYMTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TY3J1YlRlc3QuQ0ZfSU5ERVgxX0JZVEVPUkRFUkVEOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNjcnViVGVzdC5DRl9JTkRFWDI7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2NydWJUZXN0LkNGX0lOREVYMl9CWVRFT1JERVJFRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TY3J1YlRlc3QuQ0ZfVVVJRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TY3J1YlRlc3QuQ09NUFJFU1NJT05fQ0hVTktfTEVOR1RIOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNjcnViVGVzdC5DT1VOVEVSX0NGOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNjcnViVGVzdC5hc3NlcnRPcmRlcmVkQWxsOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNjcnViVGVzdC5maWxsQ0Y7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2NydWJUZXN0LmZpbGxDb3VudGVyQ0Y7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2NydWJUZXN0Lm92ZXJyaWRlV2l0aEdhcmJhZ2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK3B1YmxpYyBjbGFzcyBTY3J1YlRvb2xUZXN0Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENGID0gInNjcnViX3Rvb2xfdGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljSW50ZWdlciBzZXEgPSBuZXcgQXRvbWljSW50ZWdlcigpOworCisgICAgU3RyaW5nIGtzTmFtZTsKKyAgICBLZXlzcGFjZSBrZXlzcGFjZTsKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGxvYWRTY2hlbWEoKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKQorICAgIHsKKyAgICAgICAga3NOYW1lID0gInNjcnViX3Rlc3RfIiArIHNlcS5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgY3JlYXRlS2V5c3BhY2Uoa3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCisgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkQ0ZNRChrc05hbWUsIENGKSwKKyAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckNGTUQoa3NOYW1lLCBDT1VOVEVSX0NGKS5jb21wcmVzc2lvbihnZXRDb21wcmVzc2lvblBhcmFtZXRlcnMoQ09NUFJFU1NJT05fQ0hVTktfTEVOR1RIKSksCisgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkQ0ZNRChrc05hbWUsIENGX1VVSUQsIDAsIFVVSURUeXBlLmluc3RhbmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLmtleXNJbmRleENGTUQoa3NOYW1lLCBDRl9JTkRFWDEsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuY29tcG9zaXRlSW5kZXhDRk1EKGtzTmFtZSwgQ0ZfSU5ERVgyLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLmtleXNJbmRleENGTUQoa3NOYW1lLCBDRl9JTkRFWDFfQllURU9SREVSRUQsIHRydWUpLnBhcnRpdGlvbmVyKEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuaW5zdGFuY2UpLAorICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuY29tcG9zaXRlSW5kZXhDRk1EKGtzTmFtZSwgQ0ZfSU5ERVgyX0JZVEVPUkRFUkVELCB0cnVlKS5wYXJ0aXRpb25lcihCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLmluc3RhbmNlKSk7CisgICAgICAgIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc05hbWUpOworCisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICBURVNUX1VUSUxfQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1Quc2V0Qm9vbGVhbih0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTY3J1Yk9uZVBhcnRpdGlvbldpdGhUb29sKCkKKyAgICB7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGKTsKKworICAgICAgICAvLyBpbnNlcnQgZGF0YSBhbmQgdmVyaWZ5IHdlIGdldCBpdCBiYWNrIHcvIHJhbmdlIHF1ZXJ5CisgICAgICAgIGZpbGxDRihjZnMsIDEpOworICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMSk7CisKKyAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZUNsYXNzKFN0YW5kYWxvbmVTY3J1YmJlci5jbGFzcywga3NOYW1lLCBDRik7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiUHJlLXNjcnViIHNzdGFibGVzIHNuYXBzaG90dGVkIGludG8iKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCIxIHBhcnRpdGlvbnMgaW4gbmV3IHNzdGFibGUgYW5kIDAgZW1wdHkiKTsKKyAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOworCisgICAgICAgIC8vIGNoZWNrIGRhdGEgaXMgc3RpbGwgdGhlcmUKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNraXBTY3J1YkNvcnJ1cHRlZENvdW50ZXJQYXJ0aXRpb25XaXRoVG9vbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3JpdGVUaW1lb3V0RXhjZXB0aW9uCisgICAgeworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDT1VOVEVSX0NGKTsKKyAgICAgICAgaW50IG51bVBhcnRpdGlvbnMgPSAxMDAwOworCisgICAgICAgIGZpbGxDb3VudGVyQ0YoY2ZzLCBudW1QYXJ0aXRpb25zKTsKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIG51bVBhcnRpdGlvbnMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CisgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKKworICAgICAgICBTY3J1YlRlc3Qub3ZlcnJpZGVXaXRoR2FyYmFnZShzc3RhYmxlLCBCeXRlQnVmZmVyVXRpbC5ieXRlcygiMCIpLCBCeXRlQnVmZmVyVXRpbC5ieXRlcygiMSIpLCAoYnl0ZSkgMHg3QSk7CisKKyAgICAgICAgLy8gd2l0aCBza2lwQ29ycnVwdGVkID09IHRydWUsIHRoZSBjb3JydXB0IHJvd3Mgd2lsbCBiZSBza2lwcGVkCisgICAgICAgIFRvb2xSdW5uZXIuVG9vbFJlc3VsdCB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VDbGFzcyhTdGFuZGFsb25lU2NydWJiZXIuY2xhc3MsICItcyIsIGtzTmFtZSwgQ09VTlRFUl9DRik7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiMCBlbXB0eSIpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoInBhcnRpdGlvbnMgdGhhdCB3ZXJlIHNraXBwZWQiKTsKKyAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb1NraXBTY3J1YkNvcnJ1cHRlZENvdW50ZXJQYXJ0aXRpb25XaXRoVG9vbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3JpdGVUaW1lb3V0RXhjZXB0aW9uCisgICAgeworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDT1VOVEVSX0NGKTsKKyAgICAgICAgaW50IG51bVBhcnRpdGlvbnMgPSAxMDAwOworCisgICAgICAgIGZpbGxDb3VudGVyQ0YoY2ZzLCBudW1QYXJ0aXRpb25zKTsKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIG51bVBhcnRpdGlvbnMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CisgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKKworICAgICAgICAvL3VzZSAweDAwIGluc3RlYWQgb2YgdGhlIHVzdWFsIDB4N0EgYmVjYXVzZSBpZiBieSBhbnkgY2hhbmNlIGl0J3MgYWJsZSB0byBpdGVyYXRlIG92ZXIgdGhlIGNvcnJ1cHQKKyAgICAgICAgLy9zZWN0aW9uLCB0aGVuIHdlIGdldCBtYW55IG91dC1vZi1vcmRlciBlcnJvcnMsIHdoaWNoIHdlIGRvbid0IHdhbnQKKyAgICAgICAgb3ZlcnJpZGVXaXRoR2FyYmFnZShzc3RhYmxlLCBCeXRlQnVmZmVyVXRpbC5ieXRlcygiMCIpLCBCeXRlQnVmZmVyVXRpbC5ieXRlcygiMSIpLCAoYnl0ZSkgMHgwKTsKKworICAgICAgICAvLyB3aXRoIHNraXBDb3JydXB0ZWQgPT0gZmFsc2UsIHRoZSBzY3J1YiBpcyBleHBlY3RlZCB0byBmYWlsCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBUb29sUnVubmVyLmludm9rZUNsYXNzKFN0YW5kYWxvbmVTY3J1YmJlci5jbGFzcywga3NOYW1lLCBDT1VOVEVSX0NGKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGEgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gdG8gYmUgdGhyb3duIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXJyb3IgZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBUaHJvd2FibGVzLmFzc2VydEFueUNhdXNlKGVyciwgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9DaGVja1NjcnViTXVsdGlQYXJ0aXRpb25XaXRoVG9vbCgpCisgICAgeworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDRik7CisKKyAgICAgICAgLy8gaW5zZXJ0IGRhdGEgYW5kIHZlcmlmeSB3ZSBnZXQgaXQgYmFjayB3LyByYW5nZSBxdWVyeQorICAgICAgICBmaWxsQ0YoY2ZzLCAxMCk7CisgICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxMCk7CisKKyAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZUNsYXNzKFN0YW5kYWxvbmVTY3J1YmJlci5jbGFzcywgIi1uIiwga3NOYW1lLCBDRik7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiUHJlLXNjcnViIHNzdGFibGVzIHNuYXBzaG90dGVkIGludG8iKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCIxMCBwYXJ0aXRpb25zIGluIG5ldyBzc3RhYmxlIGFuZCAwIGVtcHR5Iik7CisgICAgICAgIHRvb2wuYXNzZXJ0T25DbGVhbkV4aXQoKTsKKworICAgICAgICAvLyBjaGVjayBkYXRhIGlzIHN0aWxsIHRoZXJlCisgICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyRml4VmFsaWRhdGVPbmx5V2l0aFRvb2woKQorICAgIHsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YpOworCisgICAgICAgIGZpbGxDRihjZnMsIDEpOworICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMSk7CisKKyAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZUNsYXNzKFN0YW5kYWxvbmVTY3J1YmJlci5jbGFzcywgIi1lIiwgInZhbGlkYXRlX29ubHkiLCBrc05hbWUsIENGKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJOb3QgY29udGludWluZyB3aXRoIHNjcnViLCBzaW5jZSAnLS1oZWFkZXItZml4IHZhbGlkYXRlLW9ubHknIHdhcyBzcGVjaWZpZWQuIik7CisgICAgICAgIHRvb2wuYXNzZXJ0T25DbGVhbkV4aXQoKTsKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlYWRlckZpeFZhbGlkYXRlV2l0aFRvb2woKQorICAgIHsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YpOworCisgICAgICAgIGZpbGxDRihjZnMsIDEpOworICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMSk7CisKKyAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZUNsYXNzKFN0YW5kYWxvbmVTY3J1YmJlci5jbGFzcywgIi1lIiwgInZhbGlkYXRlIiwga3NOYW1lLCBDRik7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiUHJlLXNjcnViIHNzdGFibGVzIHNuYXBzaG90dGVkIGludG8iKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCIxIHBhcnRpdGlvbnMgaW4gbmV3IHNzdGFibGUgYW5kIDAgZW1wdHkiKTsKKyAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOworICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyRml4Rml4T25seVdpdGhUb29sKCkKKyAgICB7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGKTsKKworICAgICAgICBmaWxsQ0YoY2ZzLCAxKTsKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOworCisgICAgICAgIFRvb2xSdW5uZXIuVG9vbFJlc3VsdCB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VDbGFzcyhTdGFuZGFsb25lU2NydWJiZXIuY2xhc3MsICItZSIsICJmaXgtb25seSIsIGtzTmFtZSwgQ0YpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIk5vdCBjb250aW51aW5nIHdpdGggc2NydWIsIHNpbmNlICctLWhlYWRlci1maXggZml4LW9ubHknIHdhcyBzcGVjaWZpZWQuIik7CisgICAgICAgIHRvb2wuYXNzZXJ0T25DbGVhbkV4aXQoKTsKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlYWRlckZpeFdpdGhUb29sKCkKKyAgICB7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGKTsKKworICAgICAgICBmaWxsQ0YoY2ZzLCAxKTsKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOworCisgICAgICAgIFRvb2xSdW5uZXIuVG9vbFJlc3VsdCB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VDbGFzcyhTdGFuZGFsb25lU2NydWJiZXIuY2xhc3MsICItZSIsICJmaXgiLCBrc05hbWUsIENGKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJQcmUtc2NydWIgc3N0YWJsZXMgc25hcHNob3R0ZWQgaW50byIpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIjEgcGFydGl0aW9ucyBpbiBuZXcgc3N0YWJsZSBhbmQgMCBlbXB0eSIpOworICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7CisgICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkZXJGaXhOb0NoZWNrc1dpdGhUb29sKCkKKyAgICB7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGKTsKKworICAgICAgICBmaWxsQ0YoY2ZzLCAxKTsKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOworCisgICAgICAgIFRvb2xSdW5uZXIuVG9vbFJlc3VsdCB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VDbGFzcyhTdGFuZGFsb25lU2NydWJiZXIuY2xhc3MsICItZSIsICJvZmYiLCBrc05hbWUsIENGKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJQcmUtc2NydWIgc3N0YWJsZXMgc25hcHNob3R0ZWQgaW50byIpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIjEgcGFydGl0aW9ucyBpbiBuZXcgc3N0YWJsZSBhbmQgMCBlbXB0eSIpOworICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7CisgICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1NldEF1dGhDYWNoZUNvbmZpZ1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TZXRBdXRoQ2FjaGVDb25maWdUZXN0LmphdmEKaW5kZXggMmM5MDQ4Ni4uNzkzMjljNiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1NldEF1dGhDYWNoZUNvbmZpZ1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU2V0QXV0aENhY2hlQ29uZmlnVGVzdC5qYXZhCkBAIC00Miw2ICs0Miw3IEBACiAgICAgewogICAgICAgICBDUUxUZXN0ZXIuc2V0VXBDbGFzcygpOwogICAgICAgICBDUUxUZXN0ZXIucmVxdWlyZUF1dGhlbnRpY2F0aW9uKCk7CisgICAgICAgIHJlcXVpcmVOZXR3b3JrKCk7CiAgICAgICAgIHN0YXJ0Sk1YU2VydmVyKCk7CiAgICAgfQogCkBAIC0xMTMsMTcgKzExNCwxNyBAQAogICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woInNldGF1dGhjYWNoZWNvbmZpZyIpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0RXhpdENvZGUoKSkuaXNFcXVhbFRvKDEpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmlzRXF1YWxUbyh3cmFwQnlEZWZhdWx0Tm9kZXRvb2xNZXNzYWdlKCJSZXF1aXJlZCBvcHRpb24gJy0tY2FjaGUtbmFtZScgaXMgbWlzc2luZyIpKTsKLSAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZGVycigpKS5pc0VtcHR5KCk7CisgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmlzRW1wdHkoKTsKIAogICAgICAgICB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbCgic2V0YXV0aGNhY2hlY29uZmlnIiwgIi0tY2FjaGUtbmFtZSIpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0RXhpdENvZGUoKSkuaXNFcXVhbFRvKDEpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmlzRXF1YWxUbyh3cmFwQnlEZWZhdWx0Tm9kZXRvb2xNZXNzYWdlKCJSZXF1aXJlZCB2YWx1ZXMgZm9yIG9wdGlvbiAnY2FjaGUtbmFtZScgbm90IHByb3ZpZGVkIikpOwotICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3RkZXJyKCkpLmlzRW1wdHkoKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldENsZWFuZWRTdGRlcnIoKSkuaXNFbXB0eSgpOwogCiAgICAgICAgIHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJzZXRhdXRoY2FjaGVjb25maWciLCAiLS1jYWNoZS1uYW1lIiwgIndyb25nIiwgIi0tdmFsaWRpdHktcGVyaW9kIiwgIjEiKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldEV4aXRDb2RlKCkpLmlzRXF1YWxUbygxKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5pc0VxdWFsVG8od3JhcEJ5RGVmYXVsdE5vZGV0b29sTWVzc2FnZSgiVW5rbm93biBjYWNoZSBuYW1lOiB3cm9uZyIpKTsKLSAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZGVycigpKS5pc0VtcHR5KCk7CisgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmlzRW1wdHkoKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTMyLDcgKzEzMyw3IEBACiAgICAgICAgIFRvb2xSdW5uZXIuVG9vbFJlc3VsdCB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbCgic2V0YXV0aGNhY2hlY29uZmlnIiwgIi0tY2FjaGUtbmFtZSIsICJQZXJtaXNzaW9uQ2FjaGUiKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldEV4aXRDb2RlKCkpLmlzRXF1YWxUbygxKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5pc0VxdWFsVG8od3JhcEJ5RGVmYXVsdE5vZGV0b29sTWVzc2FnZSgiQXQgbGVhc3Qgb25lIG9wdGlvbmFsIHBhcmFtZXRlciBuZWVkIHRvIGJlIHBhc3NlZCIpKTsKLSAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZGVycigpKS5pc0VtcHR5KCk7CisgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmlzRW1wdHkoKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTQ0LDcgKzE0NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1kaXNhYmxlLWFjdGl2ZS11cGRhdGUiKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldEV4aXRDb2RlKCkpLmlzRXF1YWxUbygxKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5pc0VxdWFsVG8od3JhcEJ5RGVmYXVsdE5vZGV0b29sTWVzc2FnZSgiZW5hYmxlLWFjdGl2ZS11cGRhdGUgYW5kIGRpc2FibGUtYWN0aXZlLXVwZGF0ZSBjYW5ub3QgYmUgdXNlZCB0b2dldGhlciIpKTsKLSAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZGVycigpKS5pc0VtcHR5KCk7CisgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmlzRW1wdHkoKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1NldEdldENvbHVtbkluZGV4U2l6ZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TZXRHZXRDb2x1bW5JbmRleFNpemVUZXN0LmphdmEKaW5kZXggNDBmODJiMC4uMWExOWYwOSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1NldEdldENvbHVtbkluZGV4U2l6ZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU2V0R2V0Q29sdW1uSW5kZXhTaXplVGVzdC5qYXZhCkBAIC0zNiw2ICszNiw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKKyAgICAgICAgcmVxdWlyZU5ldHdvcmsoKTsKICAgICAgICAgc3RhcnRKTVhTZXJ2ZXIoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TZXRHZXRDb21wYWN0aW9uVGhyb3VnaHB1dFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TZXRHZXRDb21wYWN0aW9uVGhyb3VnaHB1dFRlc3QuamF2YQppbmRleCBkMTVjYzBjLi4yNGVlOWU1IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU2V0R2V0Q29tcGFjdGlvblRocm91Z2hwdXRUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1NldEdldENvbXBhY3Rpb25UaHJvdWdocHV0VGVzdC5qYXZhCkBAIC0zOCw2ICszOCw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKKyAgICAgICAgcmVxdWlyZU5ldHdvcmsoKTsKICAgICAgICAgc3RhcnRKTVhTZXJ2ZXIoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TZXRHZXRFbnRpcmVTU1RhYmxlSW50ZXJEQ1N0cmVhbVRocm91Z2hwdXRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU2V0R2V0RW50aXJlU1NUYWJsZUludGVyRENTdHJlYW1UaHJvdWdocHV0VGVzdC5qYXZhCmluZGV4IDRhZWEwMTMuLmQ2ZDMyNTMgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TZXRHZXRFbnRpcmVTU1RhYmxlSW50ZXJEQ1N0cmVhbVRocm91Z2hwdXRUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1NldEdldEVudGlyZVNTVGFibGVJbnRlckRDU3RyZWFtVGhyb3VnaHB1dFRlc3QuamF2YQpAQCAtMzksNiArMzksNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpIHRocm93cyBFeGNlcHRpb24KICAgICB7CisgICAgICAgIHJlcXVpcmVOZXR3b3JrKCk7CiAgICAgICAgIHN0YXJ0Sk1YU2VydmVyKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU2V0R2V0RW50aXJlU1NUYWJsZVN0cmVhbVRocm91Z2hwdXRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU2V0R2V0RW50aXJlU1NUYWJsZVN0cmVhbVRocm91Z2hwdXRUZXN0LmphdmEKaW5kZXggMDI4ZjMyZS4uZjI1MDY5OSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1NldEdldEVudGlyZVNTVGFibGVTdHJlYW1UaHJvdWdocHV0VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TZXRHZXRFbnRpcmVTU1RhYmxlU3RyZWFtVGhyb3VnaHB1dFRlc3QuamF2YQpAQCAtMzksNiArMzksNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpIHRocm93cyBFeGNlcHRpb24KICAgICB7CisgICAgICAgIHJlcXVpcmVOZXR3b3JrKCk7CiAgICAgICAgIHN0YXJ0Sk1YU2VydmVyKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU2V0R2V0SW50ZXJEQ1N0cmVhbVRocm91Z2hwdXRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU2V0R2V0SW50ZXJEQ1N0cmVhbVRocm91Z2hwdXRUZXN0LmphdmEKaW5kZXggMGVmNmIyYy4uNmNiYjk0OCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1NldEdldEludGVyRENTdHJlYW1UaHJvdWdocHV0VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TZXRHZXRJbnRlckRDU3RyZWFtVGhyb3VnaHB1dFRlc3QuamF2YQpAQCAtNDYsNiArNDYsNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpIHRocm93cyBFeGNlcHRpb24KICAgICB7CisgICAgICAgIHJlcXVpcmVOZXR3b3JrKCk7CiAgICAgICAgIHN0YXJ0Sk1YU2VydmVyKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU2V0R2V0U3RyZWFtVGhyb3VnaHB1dFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TZXRHZXRTdHJlYW1UaHJvdWdocHV0VGVzdC5qYXZhCmluZGV4IDkxMWUwZGMuLmNmNjg4ZDYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TZXRHZXRTdHJlYW1UaHJvdWdocHV0VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TZXRHZXRTdHJlYW1UaHJvdWdocHV0VGVzdC5qYXZhCkBAIC00Nyw2ICs0Nyw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKKyAgICAgICAgcmVxdWlyZU5ldHdvcmsoKTsKICAgICAgICAgc3RhcnRKTVhTZXJ2ZXIoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TbmFwc2hvdFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TbmFwc2hvdFRlc3QuamF2YQppbmRleCAyZmJhZjk1Li45NzQyOTcyIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU25hcHNob3RUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1NuYXBzaG90VGVzdC5qYXZhCkBAIC0zNiw2ICszNiw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKKyAgICAgICAgcmVxdWlyZU5ldHdvcmsoKTsKICAgICAgICAgc3RhcnRKTVhTZXJ2ZXIoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9UYWJsZVN0YXRzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1RhYmxlU3RhdHNUZXN0LmphdmEKaW5kZXggNTc4YmQ4OC4uNmJhMjE1MSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1RhYmxlU3RhdHNUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1RhYmxlU3RhdHNUZXN0LmphdmEKQEAgLTI4LDkgKzI4LDkgQEAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLWltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuT2JqZWN0TWFwcGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlRvb2xSdW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSnNvblV0aWxzOwogaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5ZYW1sOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKQEAgLTExMSw3ICsxMTEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIG9mZl9oZWFwX21lbW9yeV91c2VkX3RvdGFsLCBwZW5kaW5nX2ZsdXNoZXMsIHBlcmNlbnRfcmVwYWlyZWQsXG4iICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgcmVhZF9sYXRlbmN5LCByZWFkcywgc3BhY2VfdXNlZF9ieV9zbmFwc2hvdHNfdG90YWwsIHNwYWNlX3VzZWRfbGl2ZSxcbiIgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICBzcGFjZV91c2VkX3RvdGFsLCBzc3RhYmxlX2NvbXByZXNzaW9uX3JhdGlvLCBzc3RhYmxlX2NvdW50LFxuIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIHRhYmxlX25hbWUsIHdyaXRlX2xhdGVuY3ksIHdyaXRlcylcbiIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICB0YWJsZV9uYW1lLCB3cml0ZV9sYXRlbmN5LCB3cml0ZXMsIG1heF9zc3RhYmxlX3NpemUsXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICBsb2NhbF9yZWFkX3dyaXRlX3JhdGlvLCB0d2NzX21heF9kdXJhdGlvbilcbiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgIlxuIiArIAogICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgLXQgPHRvcD4sIC0tdG9wIDx0b3A+XG4iICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgU2hvdyBvbmx5IHRoZSB0b3AgSyB0YWJsZXMgZm9yIHRoZSBzb3J0IGtleSAoc3BlY2lmeSB0aGUgbnVtYmVyIEsgb2ZcbiIgKyAKQEAgLTEzNywxMiArMTM4LDEyIEBACiAgICAgewogICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woInRhYmxlc3RhdHMiKTsKICAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwotICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJLZXlzcGFjZSA6IHN5c3RlbV9zY2hlbWEiKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiS2V5c3BhY2U6IHN5c3RlbV9zY2hlbWEiKTsKICAgICAgICAgYXNzZXJ0VGhhdChTdHJpbmdVdGlscy5jb3VudE1hdGNoZXModG9vbC5nZXRTdGRvdXQoKSwgIlRhYmxlOiIpKS5pc0dyZWF0ZXJUaGFuKDEpOwogCiAgICAgICAgIHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJ0YWJsZXN0YXRzIiwgInN5c3RlbV9kaXN0cmlidXRlZCIpOwogICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7Ci0gICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIktleXNwYWNlIDogc3lzdGVtX2Rpc3RyaWJ1dGVkIik7CisgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIktleXNwYWNlOiBzeXN0ZW1fZGlzdHJpYnV0ZWQiKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5kb2VzTm90Q29udGFpbigiS2V5c3BhY2UgOiBzeXN0ZW1fc2NoZW1hIik7CiAgICAgICAgIGFzc2VydFRoYXQoU3RyaW5nVXRpbHMuY291bnRNYXRjaGVzKHRvb2wuZ2V0U3Rkb3V0KCksICJUYWJsZToiKSkuaXNHcmVhdGVyVGhhbigxKTsKICAgICB9CkBAIC0xNTIsNyArMTUzLDcgQEAKICAgICB7CiAgICAgICAgIFRvb2xSdW5uZXIuVG9vbFJlc3VsdCB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbCgidGFibGVzdGF0cyIsICItaSIsICJzeXN0ZW1fc2NoZW1hLmFnZ3JlZ2F0ZXMiKTsKICAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwotICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJLZXlzcGFjZSA6IHN5c3RlbV9zY2hlbWEiKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiS2V5c3BhY2U6IHN5c3RlbV9zY2hlbWEiKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5kb2VzTm90Q29udGFpbigiVGFibGU6IHN5c3RlbV9zY2hlbWEuYWdncmVnYXRlcyIpOwogICAgICAgICBhc3NlcnRUaGF0KFN0cmluZ1V0aWxzLmNvdW50TWF0Y2hlcyh0b29sLmdldFN0ZG91dCgpLCAiVGFibGU6IikpLmlzR3JlYXRlclRoYW4oMSk7CiAgICAgfQpAQCAtMjM0LDcgKzIzNSw3IEBACiAgICAgICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woInRhYmxlc3RhdHMiLCBhcmcsICJqc29uIik7CiAgICAgICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7CiAgICAgICAgICAgICBTdHJpbmcganNvbiA9IHRvb2wuZ2V0U3Rkb3V0KCk7Ci0gICAgICAgICAgICBhc3NlcnRUaGF0Q29kZSgoKSAtPiBuZXcgT2JqZWN0TWFwcGVyKCkucmVhZFRyZWUoanNvbikpLmRvZXNOb3RUaHJvd0FueUV4Y2VwdGlvbigpOworICAgICAgICAgICAgYXNzZXJ0VGhhdENvZGUoKCkgLT4gSnNvblV0aWxzLkpTT05fT0JKRUNUX01BUFBFUi5yZWFkVHJlZShqc29uKSkuZG9lc05vdFRocm93QW55RXhjZXB0aW9uKCk7CiAgICAgICAgICAgICBhc3NlcnRUaGF0KGpzb24pLmNvbnRhaW5zUGF0dGVybigiXCJzc3RhYmxlX2NvdW50XCJcXHMqOlxccypbMC05XSsiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWluc1BhdHRlcm4oIlwib2xkX3NzdGFibGVfY291bnRcIlxccyo6XFxzKlswLTldKyIpOwogICAgICAgICB9KTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9UcFN0YXRzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1RwU3RhdHNUZXN0LmphdmEKaW5kZXggMTI0ZjI5Ny4uZTk1NDhmYiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1RwU3RhdHNUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1RwU3RhdHNUZXN0LmphdmEKQEAgLTI5LDEzICsyOSwxMyBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAotaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2luZ1NlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk5vUGF5bG9hZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ub29sUnVubmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpzb25VdGlsczsKIGltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuWWFtbDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuVmVyYi5FQ0hPX1JFUTsKQEAgLTE2Myw4ICsxNjMsNyBAQAogICAgIHsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7Ci0gICAgICAgICAgICBtYXBwZXIucmVhZFRyZWUoc3RyKTsKKyAgICAgICAgICAgIEpzb25VdGlscy5KU09OX09CSkVDVF9NQVBQRVIucmVhZFRyZWUoc3RyKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoKElPRXhjZXB0aW9uIGUpCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvVW5pbml0aWFsaXplZFNlcnZlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9VbmluaXRpYWxpemVkU2VydmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZGQyNzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvVW5pbml0aWFsaXplZFNlcnZlclRlc3QuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLm5vZGV0b29sOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuVG9vbFJ1bm5lcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CisKK3B1YmxpYyBjbGFzcyBVbmluaXRpYWxpemVkU2VydmVyVGVzdCBleHRlbmRzIENRTFRlc3RlcgoreworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHN0YXJ0Sk1YU2VydmVyKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pbnRpYWxpemVkU2VydmVyKCkKKyAgICB7CisgICAgICAgIC8vIENBU1NBTkRSQS0xMTUzNworICAgICAgICAvLyBmYWlscywgbm90IGZpbmlzaGVkIGluaXRpYWxpemluZyBub2RlIGJlY2F1c2UgdGVzdCBuZXZlciBjYWxscyByZXF1aXJlTmV0d29yaygpCisgICAgICAgIFRvb2xSdW5uZXIuVG9vbFJlc3VsdCB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbCgic3RhdHVzIik7CisgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbik7CisgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRlcnIoKS5jb250YWlucygiU2VydmVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQsIGNhbm5vdCBydW4gbm9kZXRvb2wuIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9TdGF0c1RhYmxlQ29tcGFyYXRvclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9TdGF0c1RhYmxlQ29tcGFyYXRvclRlc3QuamF2YQppbmRleCBlYTQ5ODk5Li4xNzEwMzk1IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvc3RhdHMvU3RhdHNUYWJsZUNvbXBhcmF0b3JUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1N0YXRzVGFibGVDb21wYXJhdG9yVGVzdC5qYXZhCkBAIC0yMTIsNiArMjEyLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICJ0YWJsZTEgPiB0YWJsZTMgPiB0YWJsZTUgPiB0YWJsZTIgPiB0YWJsZTQgPiB0YWJsZTYiLAogICAgICAgICAgICAgICAgICAgICAgICBodW1hblJlYWRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICBhc2NlbmRpbmcpOworICAgICAgICBydW5Db21wYXJlVGVzdCh0ZXN0VGFibGVzLAorICAgICAgICAgICAgICAgICAgICAgICAidHdjc19tYXhfZHVyYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAidGFibGUyID4gdGFibGU0ID4gdGFibGUxID4gdGFibGUzID4gdGFibGU2ID4gdGFibGU1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgaHVtYW5SZWFkYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYXNjZW5kaW5nKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1RhYmxlU3RhdHNQcmludGVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1RhYmxlU3RhdHNQcmludGVyVGVzdC5qYXZhCmluZGV4IDgxNjg3YmEuLjBkZGVmOWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9UYWJsZVN0YXRzUHJpbnRlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvc3RhdHMvVGFibGVTdGF0c1ByaW50ZXJUZXN0LmphdmEKQEAgLTIyLDEzICsyMiwxNiBAQAogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Kc29uVXRpbHM7CiBpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogCiBwdWJsaWMgY2xhc3MgVGFibGVTdGF0c1ByaW50ZXJUZXN0IGV4dGVuZHMgVGFibGVTdGF0c1Rlc3RCYXNlCiB7CkBAIC0zNiwxMCArMzksMTEgQEAKICAgICAgICAgIlx0VGFibGU6ICVzXG4iICsKICAgICAgICAgIlx0U1NUYWJsZSBjb3VudDogNjAwMDBcbiIgKwogICAgICAgICAiXHRPbGQgU1NUYWJsZSBjb3VudDogMFxuIiArCisgICAgICAgICJcdE1heCBTU1RhYmxlIHNpemU6IDAuMDAwS2lCXG4iICsKICAgICAgICAgIlx0U3BhY2UgdXNlZCAobGl2ZSk6IDBcbiIgKwogICAgICAgICAiXHRTcGFjZSB1c2VkICh0b3RhbCk6IDkwMDFcbiIgKwogICAgICAgICAiXHRTcGFjZSB1c2VkIGJ5IHNuYXBzaG90cyAodG90YWwpOiAxMTExXG4iICsKLSAgICAgICAgIlx0U1NUYWJsZSBDb21wcmVzc2lvbiBSYXRpbzogMC42OFxuIiArCisgICAgICAgICJcdFNTVGFibGUgQ29tcHJlc3Npb24gUmF0aW86IDAuNjgwMDBcbiIgKwogICAgICAgICAiXHROdW1iZXIgb2YgcGFydGl0aW9ucyAoZXN0aW1hdGUpOiAxMTExMTFcbiIgKwogICAgICAgICAiXHRNZW10YWJsZSBjZWxsIGNvdW50OiAxMTFcbiIgKwogICAgICAgICAiXHRNZW10YWJsZSBkYXRhIHNpemU6IDBcbiIgKwpAQCAtNDgsNiArNTIsNyBAQAogICAgICAgICAiXHRMb2NhbCByZWFkIGxhdGVuY3k6IDIuMDAwIG1zXG4iICsKICAgICAgICAgIlx0TG9jYWwgd3JpdGUgY291bnQ6IDVcbiIgKwogICAgICAgICAiXHRMb2NhbCB3cml0ZSBsYXRlbmN5OiAwLjA1MCBtc1xuIiArCisgICAgICAgICJcdExvY2FsIHJlYWQvd3JpdGUgcmF0aW86IDAuMDAwMDBcbiIgKwogICAgICAgICAiXHRQZW5kaW5nIGZsdXNoZXM6IDExMTExXG4iICsKICAgICAgICAgIlx0UGVyY2VudCByZXBhaXJlZDogMTAwLjBcbiIgKwogICAgICAgICAiXHRCeXRlcyByZXBhaXJlZDogMC4wMDBLaUJcbiIgKwpAQCAtNzEsMTEgKzc2LDEyIEBACiAgICAgICAgICJcdFRhYmxlOiAlc1xuIiArCiAgICAgICAgICJcdFNTVGFibGUgY291bnQ6IDMwMDBcbiIgKwogICAgICAgICAiXHRPbGQgU1NUYWJsZSBjb3VudDogMFxuIiArCisgICAgICAgICJcdE1heCBTU1RhYmxlIHNpemU6IDAuMDAwS2lCXG4iICsKICAgICAgICAgIlx0U3BhY2UgdXNlZCAobGl2ZSk6IDIyXG4iICsKICAgICAgICAgIlx0U3BhY2UgdXNlZCAodG90YWwpOiAxMDI0XG4iICsKICAgICAgICAgIlx0U3BhY2UgdXNlZCBieSBzbmFwc2hvdHMgKHRvdGFsKTogMjIyXG4iICsKICAgICAgICAgIlx0T2ZmIGhlYXAgbWVtb3J5IHVzZWQgKHRvdGFsKTogMzE0MTU5MzY3XG4iICsKLSAgICAgICAgIlx0U1NUYWJsZSBDb21wcmVzc2lvbiBSYXRpbzogMC42OFxuIiArCisgICAgICAgICJcdFNTVGFibGUgQ29tcHJlc3Npb24gUmF0aW86IDAuNjgwMDBcbiIgKwogICAgICAgICAiXHROdW1iZXIgb2YgcGFydGl0aW9ucyAoZXN0aW1hdGUpOiAyMjIyMlxuIiArCiAgICAgICAgICJcdE1lbXRhYmxlIGNlbGwgY291bnQ6IDIyXG4iICsKICAgICAgICAgIlx0TWVtdGFibGUgZGF0YSBzaXplOiA5MDBcbiIgKwpAQCAtODUsNiArOTEsNyBAQAogICAgICAgICAiXHRMb2NhbCByZWFkIGxhdGVuY3k6IDMuMDAwIG1zXG4iICsKICAgICAgICAgIlx0TG9jYWwgd3JpdGUgY291bnQ6IDRcbiIgKwogICAgICAgICAiXHRMb2NhbCB3cml0ZSBsYXRlbmN5OiAwLjAwMCBtc1xuIiArCisgICAgICAgICJcdExvY2FsIHJlYWQvd3JpdGUgcmF0aW86IDAuMDAwMDBcbiIgKwogICAgICAgICAiXHRQZW5kaW5nIGZsdXNoZXM6IDIyMjIyMlxuIiArCiAgICAgICAgICJcdFBlcmNlbnQgcmVwYWlyZWQ6IDk5LjlcbiIgKwogICAgICAgICAiXHRCeXRlcyByZXBhaXJlZDogMC4wMDBLaUJcbiIgKwpAQCAtMTExLDEwICsxMTgsMTEgQEAKICAgICAgICAgIlx0VGFibGU6ICVzXG4iICsKICAgICAgICAgIlx0U1NUYWJsZSBjb3VudDogNTAwMDBcbiIgKwogICAgICAgICAiXHRPbGQgU1NUYWJsZSBjb3VudDogMFxuIiArCisgICAgICAgICJcdE1heCBTU1RhYmxlIHNpemU6IDAuMDAwS2lCXG4iICsKICAgICAgICAgIlx0U3BhY2UgdXNlZCAobGl2ZSk6IDBcbiIgKwogICAgICAgICAiXHRTcGFjZSB1c2VkICh0b3RhbCk6IDUxMlxuIiArCiAgICAgICAgICJcdFNwYWNlIHVzZWQgYnkgc25hcHNob3RzICh0b3RhbCk6IDBcbiIgKwotICAgICAgICAiXHRTU1RhYmxlIENvbXByZXNzaW9uIFJhdGlvOiAwLjMyXG4iICsKKyAgICAgICAgIlx0U1NUYWJsZSBDb21wcmVzc2lvbiBSYXRpbzogMC4zMjAwMFxuIiArCiAgICAgICAgICJcdE51bWJlciBvZiBwYXJ0aXRpb25zIChlc3RpbWF0ZSk6IDMzMzNcbiIgKwogICAgICAgICAiXHRNZW10YWJsZSBjZWxsIGNvdW50OiAzMzMzMzNcbiIgKwogICAgICAgICAiXHRNZW10YWJsZSBkYXRhIHNpemU6IDE5OTlcbiIgKwpAQCAtMTIzLDYgKzEzMSw3IEBACiAgICAgICAgICJcdExvY2FsIHJlYWQgbGF0ZW5jeTogNC4wMDAgbXNcbiIgKwogICAgICAgICAiXHRMb2NhbCB3cml0ZSBjb3VudDogM1xuIiArCiAgICAgICAgICJcdExvY2FsIHdyaXRlIGxhdGVuY3k6IE5hTiBtc1xuIiArCisgICAgICAgICJcdExvY2FsIHJlYWQvd3JpdGUgcmF0aW86IDAuMDAwMDBcbiIgKwogICAgICAgICAiXHRQZW5kaW5nIGZsdXNoZXM6IDMzM1xuIiArCiAgICAgICAgICJcdFBlcmNlbnQgcmVwYWlyZWQ6IDk5LjhcbiIgKwogICAgICAgICAiXHRCeXRlcyByZXBhaXJlZDogMC4wMDBLaUJcbiIgKwpAQCAtMTQ2LDExICsxNTUsMTIgQEAKICAgICAgICAgIlx0VGFibGU6ICVzXG4iICsKICAgICAgICAgIlx0U1NUYWJsZSBjb3VudDogMjAwMFxuIiArCiAgICAgICAgICJcdE9sZCBTU1RhYmxlIGNvdW50OiAwXG4iICsKKyAgICAgICAgIlx0TWF4IFNTVGFibGUgc2l6ZTogMC4wMDBLaUJcbiIgKwogICAgICAgICAiXHRTcGFjZSB1c2VkIChsaXZlKTogNDQ0NFxuIiArCiAgICAgICAgICJcdFNwYWNlIHVzZWQgKHRvdGFsKTogMjU2XG4iICsKICAgICAgICAgIlx0U3BhY2UgdXNlZCBieSBzbmFwc2hvdHMgKHRvdGFsKTogNDRcbiIgKwogICAgICAgICAiXHRPZmYgaGVhcCBtZW1vcnkgdXNlZCAodG90YWwpOiA0NDEyMTM4MThcbiIgKwotICAgICAgICAiXHRTU1RhYmxlIENvbXByZXNzaW9uIFJhdGlvOiAwLjk1XG4iICsKKyAgICAgICAgIlx0U1NUYWJsZSBDb21wcmVzc2lvbiBSYXRpbzogMC45NTAwMFxuIiArCiAgICAgICAgICJcdE51bWJlciBvZiBwYXJ0aXRpb25zIChlc3RpbWF0ZSk6IDQ0NFxuIiArCiAgICAgICAgICJcdE1lbXRhYmxlIGNlbGwgY291bnQ6IDRcbiIgKwogICAgICAgICAiXHRNZW10YWJsZSBkYXRhIHNpemU6IDMwMDBcbiIgKwpAQCAtMTYwLDYgKzE3MCw3IEBACiAgICAgICAgICJcdExvY2FsIHJlYWQgbGF0ZW5jeTogTmFOIG1zXG4iICsKICAgICAgICAgIlx0TG9jYWwgd3JpdGUgY291bnQ6IDJcbiIgKwogICAgICAgICAiXHRMb2NhbCB3cml0ZSBsYXRlbmN5OiAyLjAwMCBtc1xuIiArCisgICAgICAgICJcdExvY2FsIHJlYWQvd3JpdGUgcmF0aW86IDAuMDAwMDBcbiIgKwogICAgICAgICAiXHRQZW5kaW5nIGZsdXNoZXM6IDQ0NDRcbiIgKwogICAgICAgICAiXHRQZXJjZW50IHJlcGFpcmVkOiA1MC4wXG4iICsKICAgICAgICAgIlx0Qnl0ZXMgcmVwYWlyZWQ6IDAuMDAwS2lCXG4iICsKQEAgLTE4NiwxMCArMTk3LDExIEBACiAgICAgICAgICJcdFRhYmxlOiAlc1xuIiArCiAgICAgICAgICJcdFNTVGFibGUgY291bnQ6IDQwMDAwXG4iICsKICAgICAgICAgIlx0T2xkIFNTVGFibGUgY291bnQ6IDBcbiIgKworICAgICAgICAiXHRNYXggU1NUYWJsZSBzaXplOiAwLjAwMEtpQlxuIiArCiAgICAgICAgICJcdFNwYWNlIHVzZWQgKGxpdmUpOiA1NTU1NVxuIiArCiAgICAgICAgICJcdFNwYWNlIHVzZWQgKHRvdGFsKTogNjRcbiIgKwogICAgICAgICAiXHRTcGFjZSB1c2VkIGJ5IHNuYXBzaG90cyAodG90YWwpOiA1NTU1NVxuIiArCi0gICAgICAgICJcdFNTVGFibGUgQ29tcHJlc3Npb24gUmF0aW86IDAuOTlcbiIgKworICAgICAgICAiXHRTU1RhYmxlIENvbXByZXNzaW9uIFJhdGlvOiAwLjk5MDAwXG4iICsKICAgICAgICAgIlx0TnVtYmVyIG9mIHBhcnRpdGlvbnMgKGVzdGltYXRlKTogNTVcbiIgKwogICAgICAgICAiXHRNZW10YWJsZSBjZWxsIGNvdW50OiA1NTU1NVxuIiArCiAgICAgICAgICJcdE1lbXRhYmxlIGRhdGEgc2l6ZTogMjAwMDBcbiIgKwpAQCAtMTk4LDYgKzIxMCw3IEBACiAgICAgICAgICJcdExvY2FsIHJlYWQgbGF0ZW5jeTogMC4wMDAgbXNcbiIgKwogICAgICAgICAiXHRMb2NhbCB3cml0ZSBjb3VudDogMVxuIiArCiAgICAgICAgICJcdExvY2FsIHdyaXRlIGxhdGVuY3k6IDEuMDAwIG1zXG4iICsKKyAgICAgICAgIlx0TG9jYWwgcmVhZC93cml0ZSByYXRpbzogMC4wMDAwMFxuIiArCiAgICAgICAgICJcdFBlbmRpbmcgZmx1c2hlczogNVxuIiArCiAgICAgICAgICJcdFBlcmNlbnQgcmVwYWlyZWQ6IDkzLjBcbiIgKwogICAgICAgICAiXHRCeXRlcyByZXBhaXJlZDogMC4wMDBLaUJcbiIgKwpAQCAtMjIxLDExICsyMzQsMTIgQEAKICAgICAgICAgIlx0VGFibGU6ICVzXG4iICsKICAgICAgICAgIlx0U1NUYWJsZSBjb3VudDogMTAwMFxuIiArCiAgICAgICAgICJcdE9sZCBTU1RhYmxlIGNvdW50OiAwXG4iICsKKyAgICAgICAgIlx0TWF4IFNTVGFibGUgc2l6ZTogMC4wMDBLaUJcbiIgKwogICAgICAgICAiXHRTcGFjZSB1c2VkIChsaXZlKTogNjY2NjY2XG4iICsKICAgICAgICAgIlx0U3BhY2UgdXNlZCAodG90YWwpOiAwXG4iICsKICAgICAgICAgIlx0U3BhY2UgdXNlZCBieSBzbmFwc2hvdHMgKHRvdGFsKTogMFxuIiArCiAgICAgICAgICJcdE9mZiBoZWFwIG1lbW9yeSB1c2VkICh0b3RhbCk6IDE2MjQ3MDgxMFxuIiArCi0gICAgICAgICJcdFNTVGFibGUgQ29tcHJlc3Npb24gUmF0aW86IDAuNjhcbiIgKworICAgICAgICAiXHRTU1RhYmxlIENvbXByZXNzaW9uIFJhdGlvOiAwLjY4MDAwXG4iICsKICAgICAgICAgIlx0TnVtYmVyIG9mIHBhcnRpdGlvbnMgKGVzdGltYXRlKTogNlxuIiArCiAgICAgICAgICJcdE1lbXRhYmxlIGNlbGwgY291bnQ6IDY2NjZcbiIgKwogICAgICAgICAiXHRNZW10YWJsZSBkYXRhIHNpemU6IDEwMDAwMDBcbiIgKwpAQCAtMjM1LDYgKzI0OSw3IEBACiAgICAgICAgICJcdExvY2FsIHJlYWQgbGF0ZW5jeTogMS4wMDAgbXNcbiIgKwogICAgICAgICAiXHRMb2NhbCB3cml0ZSBjb3VudDogMFxuIiArCiAgICAgICAgICJcdExvY2FsIHdyaXRlIGxhdGVuY3k6IDAuNTAwIG1zXG4iICsKKyAgICAgICAgIlx0TG9jYWwgcmVhZC93cml0ZSByYXRpbzogMC4wMDAwMFxuIiArCiAgICAgICAgICJcdFBlbmRpbmcgZmx1c2hlczogNjZcbiIgKwogICAgICAgICAiXHRQZXJjZW50IHJlcGFpcmVkOiAwLjBcbiIgKwogICAgICAgICAiXHRCeXRlcyByZXBhaXJlZDogMC4wMDBLaUJcbiIgKwpAQCAtMjYzLDkgKzI3OCw5IEBACiAgICAgICogd2l0aG91dCBsZWFraW5nIHRlc3QgaW1wbGVtZW50YXRpb24gaW50byB0aGUgVGFibGVTdGF0c0hvbGRlciBpbXBsZW1lbnRhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBleHBlY3RlZERlZmF1bHRQcmludGVyT3V0cHV0ID0KLSAgICAgICAgIlRvdGFsIG51bWJlciBvZiB0YWJsZXM6IDBcbiIgKworICAgICAgICAiVG90YWwgbnVtYmVyIG9mIHRhYmxlczogNlxuIiArCiAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tXG4iICsKLSAgICAgICAgIktleXNwYWNlIDoga2V5c3BhY2UxXG4iICsKKyAgICAgICAgIktleXNwYWNlOiBrZXlzcGFjZTFcbiIgKwogICAgICAgICAiXHRSZWFkIENvdW50OiAzXG4iICsKICAgICAgICAgIlx0UmVhZCBMYXRlbmN5OiAwLjAgbXNcbiIgKwogICAgICAgICAiXHRXcml0ZSBDb3VudDogMTJcbiIgKwpAQCAtMjc1LDcgKzI5MCw3IEBACiAgICAgICAgIFN0cmluZy5mb3JtYXQoZHVwbGljYXRlVGFicyhleHBlY3RlZERlZmF1bHRUYWJsZTJPdXRwdXQpLCAidGFibGUyIikgKwogICAgICAgICBTdHJpbmcuZm9ybWF0KGR1cGxpY2F0ZVRhYnMoZXhwZWN0ZWREZWZhdWx0VGFibGUzT3V0cHV0KSwgInRhYmxlMyIpICsKICAgICAgICAgIi0tLS0tLS0tLS0tLS0tLS1cbiIgKwotICAgICAgICAiS2V5c3BhY2UgOiBrZXlzcGFjZTJcbiIgKworICAgICAgICAiS2V5c3BhY2U6IGtleXNwYWNlMlxuIiArCiAgICAgICAgICJcdFJlYWQgQ291bnQ6IDdcbiIgKwogICAgICAgICAiXHRSZWFkIExhdGVuY3k6IDAuMCBtc1xuIiArCiAgICAgICAgICJcdFdyaXRlIENvdW50OiAzXG4iICsKQEAgLTI4NCw3ICsyOTksNyBAQAogICAgICAgICBTdHJpbmcuZm9ybWF0KGR1cGxpY2F0ZVRhYnMoZXhwZWN0ZWREZWZhdWx0VGFibGU0T3V0cHV0KSwgInRhYmxlNCIpICsKICAgICAgICAgU3RyaW5nLmZvcm1hdChkdXBsaWNhdGVUYWJzKGV4cGVjdGVkRGVmYXVsdFRhYmxlNU91dHB1dCksICJ0YWJsZTUiKSArCiAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tXG4iICsKLSAgICAgICAgIktleXNwYWNlIDoga2V5c3BhY2UzXG4iICsKKyAgICAgICAgIktleXNwYWNlOiBrZXlzcGFjZTNcbiIgKwogICAgICAgICAiXHRSZWFkIENvdW50OiA1XG4iICsKICAgICAgICAgIlx0UmVhZCBMYXRlbmN5OiAwLjAgbXNcbiIgKwogICAgICAgICAiXHRXcml0ZSBDb3VudDogMFxuIiArCkBAIC0zNDEsNyArMzU2LDggQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0UHJpbnRlcigpIHRocm93cyBFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIFN0YXRzSG9sZGVyIGhvbGRlciA9IG5ldyBUZXN0VGFibGVTdGF0c0hvbGRlcih0ZXN0S2V5c3BhY2VzLCAiIiwgMCk7CisgICAgICAgIFRlc3RUYWJsZVN0YXRzSG9sZGVyIGhvbGRlciA9IG5ldyBUZXN0VGFibGVTdGF0c0hvbGRlcih0ZXN0S2V5c3BhY2VzLCAiIiwgMCk7CisgICAgICAgIGhvbGRlci5udW1iZXJPZlRhYmxlcyA9IHRlc3RLZXlzcGFjZXMuc3RyZWFtKCkubWFwKGtzIC0+IGtzLnRhYmxlcy5zaXplKCkpLm1hcFRvSW50KEludGVnZXI6OmludFZhbHVlKS5zdW0oKTsKICAgICAgICAgU3RhdHNQcmludGVyPFN0YXRzSG9sZGVyPiBwcmludGVyID0gVGFibGVTdGF0c1ByaW50ZXIuZnJvbSgiIiwgZmFsc2UpOwogICAgICAgICB0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlU3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKQogICAgICAgICB7CkBAIC0zOTMsMTIgKzQwOSwxMyBAQAogICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGJ5dGVTdHJlYW0udG9TdHJpbmcoKSkKICAgICAgICAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKCJ7XG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFwia2V5c3BhY2UzXCIgOiB7XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgXCJ3cml0ZV9sYXRlbmN5X21zXCIgOiBcIk5hTlwiLFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIFwid3JpdGVfbGF0ZW5jeV9tc1wiIDogbnVsbCxcbiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBcInRhYmxlc1wiIDoge1xuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgXCJ0YWJsZTZcIiA6IHtcbiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgXCJhdmVyYWdlX3RvbWJzdG9uZXNfcGVyX3NsaWNlX2xhc3RfZml2ZV9taW51dGVzXCIgOiA2LjAsXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIFwidG9wX3RvbWJzdG9uZV9wYXJ0aXRpb25zXCIgOiBudWxsLFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBcImJsb29tX2ZpbHRlcl9vZmZfaGVhcF9tZW1vcnlfdXNlZFwiIDogXCI2Njc0MDhcIixcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgXCJ0d2NzXCIgOiBudWxsLFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBcImJ5dGVzX3BlbmRpbmdfcmVwYWlyXCIgOiAwLFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBcIm1lbXRhYmxlX3N3aXRjaF9jb3VudFwiIDogNixcbiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgXCJtYXhpbXVtX3RvbWJzdG9uZXNfcGVyX3NsaWNlX2xhc3RfZml2ZV9taW51dGVzXCIgOiA2LFxuIiArCkBAIC00MTIsNiArNDI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIFwiY29tcGFjdGVkX3BhcnRpdGlvbl9taW5pbXVtX2J5dGVzXCIgOiA2LFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBcImxvY2FsX3JlYWRfY291bnRcIiA6IDUsXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIFwic3N0YWJsZV9jb21wcmVzc2lvbl9yYXRpb1wiIDogMC42OCxcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgXCJtYXhfc3N0YWJsZV9zaXplXCIgOiAwLFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBcImRyb3BwZWRfbXV0YXRpb25zXCIgOiBcIjY2NjY2NlwiLFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBcInRvcF9zaXplX3BhcnRpdGlvbnNcIiA6IG51bGwsXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIFwiYmxvb21fZmlsdGVyX2ZhbHNlX3Bvc2l0aXZlc1wiIDogNDAwLFxuIiArCkBAIC00MjYsNiArNDQ0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIFwibG9jYWxfd3JpdGVfY291bnRcIiA6IDAsXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIFwiZHJvcHBhYmxlX3RvbWJzdG9uZV9yYXRpb1wiIDogXCIwLjY2NjY3XCIsXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIFwiY29tcHJlc3Npb25fbWV0YWRhdGFfb2ZmX2hlYXBfbWVtb3J5X3VzZWRcIiA6IFwiMVwiLFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBcImxvY2FsX3JlYWRfd3JpdGVfcmF0aW9cIiA6IFwiMC4wMDAwMFwiLFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBcIm51bWJlcl9vZl9wYXJ0aXRpb25zX2VzdGltYXRlXCIgOiA2LFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBcImJ5dGVzX3JlcGFpcmVkXCIgOiAwLFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBcIm1heGltdW1fbGl2ZV9jZWxsc19wZXJfc2xpY2VfbGFzdF9maXZlX21pbnV0ZXNcIiA6IDIsXG4iICsKQEAgLTQ2NSw2ICs0ODQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIGF2ZXJhZ2VfdG9tYnN0b25lc19wZXJfc2xpY2VfbGFzdF9maXZlX21pbnV0ZXM6IDYuMFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgdG9wX3RvbWJzdG9uZV9wYXJ0aXRpb25zOiBudWxsXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBibG9vbV9maWx0ZXJfb2ZmX2hlYXBfbWVtb3J5X3VzZWQ6ICc2Njc0MDgnXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICB0d2NzOiBudWxsXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBieXRlc19wZW5kaW5nX3JlcGFpcjogMFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgbWVtdGFibGVfc3dpdGNoX2NvdW50OiA2XG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBtYXhpbXVtX3RvbWJzdG9uZXNfcGVyX3NsaWNlX2xhc3RfZml2ZV9taW51dGVzOiA2XG4iICsKQEAgLTQ3OCw2ICs0OTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIGNvbXBhY3RlZF9wYXJ0aXRpb25fbWluaW11bV9ieXRlczogNlxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgbG9jYWxfcmVhZF9jb3VudDogNVxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgc3N0YWJsZV9jb21wcmVzc2lvbl9yYXRpbzogMC42OFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgbWF4X3NzdGFibGVfc2l6ZTogMFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgZHJvcHBlZF9tdXRhdGlvbnM6ICc2NjY2NjYnXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICB0b3Bfc2l6ZV9wYXJ0aXRpb25zOiBudWxsXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBibG9vbV9maWx0ZXJfZmFsc2VfcG9zaXRpdmVzOiA0MDBcbiIgKwpAQCAtNDkyLDYgKzUxMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgbG9jYWxfd3JpdGVfY291bnQ6IDBcbiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIGRyb3BwYWJsZV90b21ic3RvbmVfcmF0aW86ICcwLjY2NjY3J1xuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgY29tcHJlc3Npb25fbWV0YWRhdGFfb2ZmX2hlYXBfbWVtb3J5X3VzZWQ6ICcxJ1xuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgbG9jYWxfcmVhZF93cml0ZV9yYXRpbzogJzAuMDAwMDAnXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBudW1iZXJfb2ZfcGFydGl0aW9uc19lc3RpbWF0ZTogNlxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgYnl0ZXNfcmVwYWlyZWQ6IDBcbiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIG1heGltdW1fbGl2ZV9jZWxsc19wZXJfc2xpY2VfbGFzdF9maXZlX21pbnV0ZXM6IDJcbiIgKwpAQCAtNTEyLDYgKzUzNCw2MSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvblByaW50ZXIyKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZmluYWwgU3RhdHNQcmludGVyPFN0YXRzSG9sZGVyPiBwcmludGVyID0gVGFibGVTdGF0c1ByaW50ZXIuZnJvbSgianNvbiIsIGZhbHNlKTsKKyAgICAgICAgU3RhdHNIb2xkZXIgaG9sZGVyID0gbmV3IFRlc3RUYWJsZVN0YXRzSG9sZGVyKHRlc3RLZXlzcGFjZXMsICJyZWFkcyIsIDApOworICAgICAgICB0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlU3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KGhvbGRlciwgbmV3IFByaW50U3RyZWFtKGJ5dGVTdHJlYW0pKTsKKyAgICAgICAgICAgIGJ5dGVbXSBqc29uID0gYnl0ZVN0cmVhbS50b0J5dGVBcnJheSgpOworICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQgPSBKc29uVXRpbHMuZnJvbUpzb25NYXAoanNvbik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzdWx0LnJlbW92ZSgidG90YWxfbnVtYmVyX29mX3RhYmxlcyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg2LCByZXN1bHQuc2l6ZSgpKTsKKworICAgICAgICAgICAgLy8gT25lIHJlbGF0aXZlbHkgZWFzeSB3YXkgdG8gdmVyaWZ5IHNlcmlhbGl6YXRpb24gaXMgdG8gY2hlY2sgY29udmVydGVkLXRvLU1hcAorICAgICAgICAgICAgLy8gaW50ZXJtZWRpYXRlIGZvcm0gYW5kIHJvdW5kLXRyaXAgKHNlcmlhbGl6ZS1kZXNlcmlhbGl6ZSkgZm9yIGVxdWl2YWxlbmNlLgorICAgICAgICAgICAgLy8gQnV0IHRoZXJlIGFyZSBjb3VwbGUgb2YgbWlub3IgZ290Y2hhcyB0byBjb25zaWRlcgorCisgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGV4cGVjdGVkRGF0YSA9IGhvbGRlci5jb252ZXJ0Mk1hcCgpOworICAgICAgICAgICAgZXhwZWN0ZWREYXRhLnJlbW92ZSgidG90YWxfbnVtYmVyX29mX3RhYmxlcyIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIGV4cGVjdGVkRGF0YS5zaXplKCkpOworCisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiByZXN1bHQuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGV4cFRhYmxlID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGV4cGVjdGVkRGF0YS5nZXQoZW50cnkuZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gYWN0dWFsVGFibGUgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgZW50cnkuZ2V0VmFsdWUoKTsKKworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBUYWJsZS5zaXplKCksIGFjdHVhbFRhYmxlLnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gdGFibGVFbnRyeSA6IGFjdHVhbFRhYmxlLmVudHJ5U2V0KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPYmplY3QgZXhwVmFsdWUgPSBleHBUYWJsZS5nZXQodGFibGVFbnRyeS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhY3R1YWxWYWx1ZSA9IHRhYmxlRW50cnkuZ2V0VmFsdWUoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBTb21lIGRpZmZlcmVuY2VzIHRvIGV4cGVjdDogTG9uZyB0aGF0IGZpdHMgaW4gSW50ZWdlciBtYXkgZ2V0IGRlc2VyaWFsaXplZCBhcyBsYXR0ZXI6CisgICAgICAgICAgICAgICAgICAgIGlmIChleHBWYWx1ZSBpbnN0YW5jZW9mIExvbmcgJiYgYWN0dWFsVmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxWYWx1ZSA9ICgoTnVtYmVyKSBhY3R1YWxWYWx1ZSkubG9uZ1ZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBBbmQgdGhlbiBhIGJpdCBtb3JlIGV4b3RpYyBjYXNlOiBOb3QtYS1OdW1iZXJzIHNob3VsZCBiZSBjb2VyY2VkIGludG8gbnVsbHMKKyAgICAgICAgICAgICAgICAgICAgLy8gKGV4aXN0aW5nIGJlaGF2aW9yIGFzIG9mIDQuMC4wKQorICAgICAgICAgICAgICAgICAgICBpZiAoZXhwVmFsdWUgaW5zdGFuY2VvZiBEb3VibGUgJiYgIURvdWJsZS5pc0Zpbml0ZSgoRG91YmxlKSBleHBWYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydE51bGwoIkVudHJ5ICciICsgdGFibGVFbnRyeS5nZXRLZXkoKSArICInIG9mIHRhYmxlICciICsgZW50cnkuZ2V0S2V5KCkgKyAiJyBzaG91bGQgYmUgY29lcmNlZCBmcm9tIE5hTiB0byBudWxsOiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiRW50cnkgJyIgKyB0YWJsZUVudHJ5LmdldEtleSgpICsgIicgb2YgdGFibGUgJyIgKyBlbnRyeS5nZXRLZXkoKSArICInIGRvZXMgbm90IG1hdGNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cFZhbHVlLCBhY3R1YWxWYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKICAgICAvKioKICAgICAgKiBBIHRlc3QgdmVyc2lvbiBvZiBUYWJsZVN0YXRzSG9sZGVyIHRvIGhvbGQgYSB0ZXN0IHZlY3RvciBpbnN0ZWFkIG9mIGdhdGhlcmluZyBzdGF0cyBmcm9tIGEgbGl2ZSBjbHVzdGVyLgogICAgICAqLwpAQCAtNTMxLDUgKzYwOCw0IEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1RhYmxlU3RhdHNUZXN0QmFzZS5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1RhYmxlU3RhdHNUZXN0QmFzZS5qYXZhCmluZGV4IDhlZjBlYTMuLmFiNDljNmYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9UYWJsZVN0YXRzVGVzdEJhc2UuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvc3RhdHMvVGFibGVTdGF0c1Rlc3RCYXNlLmphdmEKQEAgLTcxLDYgKzcxLDcgQEAKICAgICAgICAgdGVtcGxhdGUub2xkU1NUYWJsZUNvdW50ID0gMEw7CiAgICAgICAgIHRlbXBsYXRlLnNwYWNlVXNlZExpdmUgPSAiMCI7CiAgICAgICAgIHRlbXBsYXRlLnNwYWNlVXNlZFRvdGFsID0gIjAiOworICAgICAgICB0ZW1wbGF0ZS5tYXhTU1RhYmxlU2l6ZSA9IDBMOwogICAgICAgICB0ZW1wbGF0ZS5zcGFjZVVzZWRCeVNuYXBzaG90c1RvdGFsID0gIjAiOwogICAgICAgICB0ZW1wbGF0ZS5wZXJjZW50UmVwYWlyZWQgPSAxLjBEOwogICAgICAgICB0ZW1wbGF0ZS5ieXRlc1JlcGFpcmVkID0gMEw7CkBAIC05OSw2ICsxMDAsOCBAQAogICAgICAgICB0ZW1wbGF0ZS5hdmVyYWdlVG9tYnN0b25lc1BlclNsaWNlTGFzdEZpdmVNaW51dGVzID0gRG91YmxlLk5hTjsKICAgICAgICAgdGVtcGxhdGUubWF4aW11bVRvbWJzdG9uZXNQZXJTbGljZUxhc3RGaXZlTWludXRlcyA9IDBMOwogICAgICAgICB0ZW1wbGF0ZS5kcm9wcGVkTXV0YXRpb25zID0gIjAiOworICAgICAgICB0ZW1wbGF0ZS50d2NzID0gbnVsbDsKKyAgICAgICAgdGVtcGxhdGUudHdjc0R1cmF0aW9uSW5NaWxsaXMgPSAwTDsKICAgICAgICAgcmV0dXJuIHRlbXBsYXRlOwogICAgIH0KIApAQCAtMzM3LDYgKzM0MCwxMCBAQAogICAgICAgICB0YWJsZTIubWVtdGFibGVPZmZIZWFwTWVtb3J5VXNlZCA9ICIzMTQxNTkyNjUiOwogICAgICAgICB0YWJsZTQubWVtdGFibGVPZmZIZWFwTWVtb3J5VXNlZCA9ICIxNDE0MjEzNTYiOwogICAgICAgICB0YWJsZTYubWVtdGFibGVPZmZIZWFwTWVtb3J5VXNlZCA9ICIxNjE4MDMzOTgiOworICAgICAgICAvLyB0d2NzIG1heCBkdXJhdGlvbjogMiA+IDQgPiAxID0gMyA9IDYgPSA1CisgICAgICAgIHRhYmxlMi50d2NzRHVyYXRpb25Jbk1pbGxpcyA9IDIwMDBMOworICAgICAgICB0YWJsZTQudHdjc0R1cmF0aW9uSW5NaWxsaXMgPSAxMDAwTDsKKyAgICAgICAgdGFibGU1LnR3Y3NEdXJhdGlvbkluTWlsbGlzID0gbnVsbDsKICAgICAgICAgLy8gY3JlYXRlIHRlc3Qga2V5c3BhY2VzIGZyb20gdGVtcGxhdGVzCiAgICAgICAgIHRlc3RLZXlzcGFjZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgU3RhdHNLZXlzcGFjZSBrZXlzcGFjZTEgPSBjcmVhdGVTdGF0c0tleXNwYWNlVGVtcGxhdGUoImtleXNwYWNlMSIpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9DUUxVc2VyQXVkaXRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L0NRTFVzZXJBdWRpdFRlc3QuamF2YQppbmRleCAxMjBkZTJhLi44YmM5ZjI4IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L0NRTFVzZXJBdWRpdFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L0NRTFVzZXJBdWRpdFRlc3QuamF2YQpAQCAtNDksNiArNDksNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuRW1iZWRkZWRDYXNzYW5kcmFTZXJ2aWNlOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU1VQRVJVU0VSX1NFVFVQX0RFTEFZX01TOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkJsb2NraW5nUXVldWVzLm5ld0Jsb2NraW5nUXVldWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CkBAIC03MCw3ICs3MSw3IEBACiAgICAgICAgICAgICBjb25maWcuYXVkaXRfbG9nZ2luZ19vcHRpb25zLmxvZ2dlciA9IG5ldyBQYXJhbWV0ZXJpemVkQ2xhc3MoIkRpYWdub3N0aWNFdmVudEF1ZGl0TG9nZ2VyIiwgbnVsbCk7CiAgICAgICAgIH0pOwogCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnN1cGVydXNlcl9zZXR1cF9kZWxheV9tcyIsICIwIik7CisgICAgICAgIFNVUEVSVVNFUl9TRVRVUF9ERUxBWV9NUy5zZXRMb25nKDApOwogCiAgICAgICAgIGVtYmVkZGVkID0gU2VydmVyVGVzdFV0aWxzLnN0YXJ0RW1iZWRkZWRDYXNzYW5kcmFTZXJ2aWNlKCk7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvTWVzc2FnZURpc3BhdGNoZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L01lc3NhZ2VEaXNwYXRjaGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNzAzMTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L01lc3NhZ2VEaXNwYXRjaGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5VbmludGVycnVwdGlibGVzOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DbGllbnRNZXRyaWNzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuUXVlcnlTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQubWVzc2FnZXMuQXV0aFJlc3BvbnNlOworCitwdWJsaWMgY2xhc3MgTWVzc2FnZURpc3BhdGNoZXJUZXN0Cit7CisgICAgc3RhdGljIGZpbmFsIE1lc3NhZ2UuUmVxdWVzdCBBVVRIX1JFU1BPTlNFX1JFUVVFU1QgPSBuZXcgQXV0aFJlc3BvbnNlKG5ldyBieXRlWzBdKQorICAgIHsKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGV4ZWN1dGUoUXVlcnlTdGF0ZSBxdWVyeVN0YXRlLCBsb25nIHF1ZXJ5U3RhcnROYW5vVGltZSwgYm9vbGVhbiB0cmFjZVJlcXVlc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIEF1dGhUZXN0RGlzcGF0Y2hlciBkaXNwYXRjaDsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbWF4QXV0aFRocmVhZHNCZWZvcmVUZXN0czsKKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CisgICAgICAgIENsaWVudE1ldHJpY3MuaW5zdGFuY2UuaW5pdChDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7CisgICAgICAgIG1heEF1dGhUaHJlYWRzQmVmb3JlVGVzdHMgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0TmF0aXZlVHJhbnNwb3J0TWF4QXV0aFRocmVhZHMoKTsKKyAgICAgICAgZGlzcGF0Y2ggPSBuZXcgQXV0aFRlc3REaXNwYXRjaGVyKCk7CisgICAgfQorCisgICAgQEFmdGVyQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzdG9yZUF1dGhTaXplKCkKKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXROYXRpdmVUcmFuc3BvcnRNYXhBdXRoVGhyZWFkcyhtYXhBdXRoVGhyZWFkc0JlZm9yZVRlc3RzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRoUmF0ZUxpbWl0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBsb25nIHN0YXJ0UmVxdWVzdHMgPSBjb21wbGV0ZWRSZXF1ZXN0cygpOworCisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXROYXRpdmVUcmFuc3BvcnRNYXhBdXRoVGhyZWFkcygxKTsKKyAgICAgICAgbG9uZyBhdXRocyA9IHRyeUF1dGgodGhpczo6Y29tcGxldGVkQXV0aCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYXV0aHMsIDEpOworCisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXROYXRpdmVUcmFuc3BvcnRNYXhBdXRoVGhyZWFkcygxMDApOworICAgICAgICBhdXRocyA9IHRyeUF1dGgodGhpczo6Y29tcGxldGVkQXV0aCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYXV0aHMsIDEpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSBubyB0YXNrcyBleGVjdXRlZCBvbiB0aGUgcmVndWxhciBwb29sCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc3RhcnRSZXF1ZXN0cywgY29tcGxldGVkUmVxdWVzdHMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0aFJhdGVMaW1pdGVyTm90VXNlZCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXROYXRpdmVUcmFuc3BvcnRNYXhBdXRoVGhyZWFkcygxKTsKKyAgICAgICAgZm9yIChNZXNzYWdlLlR5cGUgdHlwZSA6IE1lc3NhZ2UuVHlwZS52YWx1ZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0gTWVzc2FnZS5UeXBlLkFVVEhfUkVTUE9OU0UgfHwgdHlwZSA9PSBNZXNzYWdlLlR5cGUuQ1JFREVOVElBTFMgfHwgdHlwZS5kaXJlY3Rpb24gIT0gTWVzc2FnZS5EaXJlY3Rpb24uUkVRVUVTVCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgbG9uZyBhdXRocyA9IGNvbXBsZXRlZEF1dGgoKTsKKyAgICAgICAgICAgIGxvbmcgcmVxdWVzdHMgPSB0cnlBdXRoKHRoaXM6OmNvbXBsZXRlZFJlcXVlc3RzLCBuZXcgTWVzc2FnZS5SZXF1ZXN0KHR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHVibGljIFJlc3BvbnNlIGV4ZWN1dGUoUXVlcnlTdGF0ZSBxdWVyeVN0YXRlLCBsb25nIHF1ZXJ5U3RhcnROYW5vVGltZSwgYm9vbGVhbiB0cmFjZVJlcXVlc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVxdWVzdHMsIDEpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhjb21wbGV0ZWRBdXRoKCkgLSBhdXRocywgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRoUmF0ZUxpbWl0ZXJEaXNhYmxlZCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGxvbmcgc3RhcnRBdXRoUmVxdWVzdHMgPSBjb21wbGV0ZWRBdXRoKCk7CisKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldE5hdGl2ZVRyYW5zcG9ydE1heEF1dGhUaHJlYWRzKDApOworICAgICAgICBsb25nIHJlcXVlc3RzID0gdHJ5QXV0aCh0aGlzOjpjb21wbGV0ZWRSZXF1ZXN0cyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVxdWVzdHMsIDEpOworCisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXROYXRpdmVUcmFuc3BvcnRNYXhBdXRoVGhyZWFkcygtMSk7CisgICAgICAgIHJlcXVlc3RzID0gdHJ5QXV0aCh0aGlzOjpjb21wbGV0ZWRSZXF1ZXN0cyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVxdWVzdHMsIDEpOworCisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXROYXRpdmVUcmFuc3BvcnRNYXhBdXRoVGhyZWFkcygtMTAwMCk7CisgICAgICAgIHJlcXVlc3RzID0gdHJ5QXV0aCh0aGlzOjpjb21wbGV0ZWRSZXF1ZXN0cyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVxdWVzdHMsIDEpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSBubyB0YXNrcyBleGVjdXRlZCBvbiB0aGUgYXV0aCBwb29sCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc3RhcnRBdXRoUmVxdWVzdHMsIGNvbXBsZXRlZEF1dGgoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGNvbXBsZXRlZFJlcXVlc3RzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBEaXNwYXRjaGVyLnJlcXVlc3RFeGVjdXRvci5nZXRDb21wbGV0ZWRUYXNrQ291bnQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgY29tcGxldGVkQXV0aCgpCisgICAgeworICAgICAgICByZXR1cm4gRGlzcGF0Y2hlci5hdXRoRXhlY3V0b3IuZ2V0Q29tcGxldGVkVGFza0NvdW50KCk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgdHJ5QXV0aChDYWxsYWJsZTxMb25nPiBjaGVjaykgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIHRyeUF1dGgoY2hlY2ssIEFVVEhfUkVTUE9OU0VfUkVRVUVTVCk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlVuc3RhYmxlQXBpVXNhZ2UiKQorICAgIHB1YmxpYyBsb25nIHRyeUF1dGgoQ2FsbGFibGU8TG9uZz4gY2hlY2ssIE1lc3NhZ2UuUmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBsb25nIHN0YXJ0ID0gY2hlY2suY2FsbCgpOworICAgICAgICBkaXNwYXRjaC5kaXNwYXRjaChudWxsLCByZXF1ZXN0LCAoY2hhbm5lbCxyZXEscmVzcG9uc2UpIC0+IG51bGwsIENsaWVudFJlc291cmNlTGltaXRzLk92ZXJsb2FkLk5PTkUpOworCisgICAgICAgIC8vIFdoaWxlIHRoaXMgaXMgdGltZW91dCBiYXNlZCwgd2Ugc2hvdWxkIGJlICp3ZWxsIGJlbG93KiBhIGZ1bGwgc2Vjb25kIG9uIGFueSBvZiB0aGlzIHByb2Nlc3NpbmcgaW4gYW55IHNhbmUgZW52aXJvbm1lbnQuCisgICAgICAgIGxvbmcgdGltZW91dCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB3aGlsZShzdGFydCA9PSBjaGVjay5jYWxsKCkgJiYgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lb3V0IDwgMTAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgVW5pbnRlcnJ1cHRpYmxlcy5zbGVlcFVuaW50ZXJydXB0aWJseSgxMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2hlY2suY2FsbCgpIC0gc3RhcnQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBdXRoVGVzdERpc3BhdGNoZXIgZXh0ZW5kcyBEaXNwYXRjaGVyCisgICAgeworICAgICAgICBwdWJsaWMgQXV0aFRlc3REaXNwYXRjaGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgcHJvY2Vzc1JlcXVlc3QoQ2hhbm5lbCBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UuUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsdXNoSXRlbUNvbnZlcnRlciBmb3JGbHVzaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudFJlc291cmNlTGltaXRzLk92ZXJsb2FkIGJhY2twcmVzc3VyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGFwcHJveFN0YXJ0VGltZU5hbm9zKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBub29wCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L01lc3NhZ2VQYXlsb2FkVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9NZXNzYWdlUGF5bG9hZFRlc3QuamF2YQppbmRleCBmMGI0NWMzLi4xYmQxYThmIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L01lc3NhZ2VQYXlsb2FkVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvTWVzc2FnZVBheWxvYWRUZXN0LmphdmEKQEAgLTQ3LDYgKzQ3LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQubWVzc2FnZXMuUXVlcnlNZXNzYWdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5tZXNzYWdlcy5SZXN1bHRNZXNzYWdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk1ENURpZ2VzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5SZWZsZWN0aW9uVXRpbHM7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWwuYnl0ZXM7CiAKQEAgLTY2LDcgKzY3LDcgQEAKICAgICAgICAgICAgIGNxbFF1ZXJ5SGFuZGxlckZpZWxkID0gQ2xpZW50U3RhdGUuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgiY3FsUXVlcnlIYW5kbGVyIik7CiAgICAgICAgICAgICBjcWxRdWVyeUhhbmRsZXJGaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwogCi0gICAgICAgICAgICBGaWVsZCBtb2RpZmllcnNGaWVsZCA9IEZpZWxkLmNsYXNzLmdldERlY2xhcmVkRmllbGQoIm1vZGlmaWVycyIpOworICAgICAgICAgICAgRmllbGQgbW9kaWZpZXJzRmllbGQgPSBSZWZsZWN0aW9uVXRpbHMuZ2V0TW9kaWZpZXJzRmllbGQoKTsKICAgICAgICAgICAgIG1vZGlmaWVyc0FjY2Vzc2libGUgPSBtb2RpZmllcnNGaWVsZC5pc0FjY2Vzc2libGUoKTsKICAgICAgICAgICAgIG1vZGlmaWVyc0ZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CiAgICAgICAgICAgICBtb2RpZmllcnNGaWVsZC5zZXRJbnQoY3FsUXVlcnlIYW5kbGVyRmllbGQsIGNxbFF1ZXJ5SGFuZGxlckZpZWxkLmdldE1vZGlmaWVycygpICYgfk1vZGlmaWVyLkZJTkFMKTsKQEAgLTg0LDcgKzg1LDcgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIEZpZWxkIG1vZGlmaWVyc0ZpZWxkID0gRmllbGQuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgibW9kaWZpZXJzIik7CisgICAgICAgICAgICBGaWVsZCBtb2RpZmllcnNGaWVsZCA9IFJlZmxlY3Rpb25VdGlscy5nZXRNb2RpZmllcnNGaWVsZCgpOwogICAgICAgICAgICAgbW9kaWZpZXJzRmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKICAgICAgICAgICAgIG1vZGlmaWVyc0ZpZWxkLnNldEludChjcWxRdWVyeUhhbmRsZXJGaWVsZCwgY3FsUXVlcnlIYW5kbGVyRmllbGQuZ2V0TW9kaWZpZXJzKCkgfCBNb2RpZmllci5GSU5BTCk7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvU2VyRGVzZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L1NlckRlc2VyVGVzdC5qYXZhCmluZGV4IDYwMzMyMDMuLjExYjc0ODkgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvU2VyRGVzZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9TZXJEZXNlclRlc3QuamF2YQpAQCAtMTgsMjEgKzE4LDQ2IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydDsKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuUmFuZG9tU3RyaW5nVXRpbHM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBpby5uZXR0eS5idWZmZXIuVW5wb29sZWQ7CiBpbXBvcnQgaW8ubmV0dHkuYnVmZmVyLkJ5dGVCdWY7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuUmFuZG9tU3RyaW5nVXRpbHM7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNvbHVtbklkZW50aWZpZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Db2x1bW5TcGVjaWZpY2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuRmllbGRJZGVudGlmaWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuTGlzdHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5NYXBzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuUXVlcnlPcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuUmVzdWx0U2V0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuU2V0czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlRlcm07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Vc2VyVHlwZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29uc2lzdGVuY3lMZXZlbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlQnVmZmVyQWNjZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnQzMlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5MaXN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkxvbmdUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTWFwVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlNldFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVzZXJUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLkNvbGxlY3Rpb25TZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLk1hcnNoYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DbGllbnRTdGF0ZTsKQEAgLTQ0LDE2ICs2OSwxNSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsLmJ5dGVzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWwuYnl0ZXM7CiAKIC8qKgogICogU2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gdGVzdHMgZm9yIHByb3RvY29sIG9iamVjdHMgYW5kIG1lc3NhZ2VzLgogICovCiBwdWJsaWMgY2xhc3MgU2VyRGVzZXJUZXN0CiB7Ci0KICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXBERCgpCiAgICAgewpAQCAtNjQsMTIgKzg4LDYgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIGNvbGxlY3Rpb25TZXJEZXNlclRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewotICAgICAgICBmb3IgKFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uIDogUHJvdG9jb2xWZXJzaW9uLlNVUFBPUlRFRCkKLSAgICAgICAgICAgIGNvbGxlY3Rpb25TZXJEZXNlclRlc3QodmVyc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29sbGVjdGlvblNlckRlc2VyVGVzdChQcm90b2NvbFZlcnNpb24gdmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKICAgICAgICAgLy8gTGlzdHMKICAgICAgICAgTGlzdFR5cGU8Pz4gbHQgPSBMaXN0VHlwZS5nZXRJbnN0YW5jZShJbnQzMlR5cGUuaW5zdGFuY2UsIHRydWUpOwogICAgICAgICBMaXN0PEludGVnZXI+IGwgPSBBcnJheXMuYXNMaXN0KDIsIDYsIDEsIDkpOwpAQCAtNzgsMTggKzk2LDE3IEBACiAgICAgICAgIGZvciAoSW50ZWdlciBpIDogbCkKICAgICAgICAgICAgIGxiLmFkZChJbnQzMlR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKGkpKTsKIAotICAgICAgICBhc3NlcnRFcXVhbHMobCwgbHQuZ2V0U2VyaWFsaXplcigpLmRlc2VyaWFsaXplRm9yTmF0aXZlUHJvdG9jb2woQ29sbGVjdGlvblNlcmlhbGl6ZXIucGFjayhsYiwgbGIuc2l6ZSgpLCB2ZXJzaW9uKSwgdmVyc2lvbikpOworICAgICAgICBhc3NlcnRFcXVhbHMobCwgbHQuZ2V0U2VyaWFsaXplcigpLmRlc2VyaWFsaXplKENvbGxlY3Rpb25TZXJpYWxpemVyLnBhY2sobGIsIGxiLnNpemUoKSkpKTsKIAogICAgICAgICAvLyBTZXRzCiAgICAgICAgIFNldFR5cGU8Pz4gc3QgPSBTZXRUeXBlLmdldEluc3RhbmNlKFVURjhUeXBlLmluc3RhbmNlLCB0cnVlKTsKLSAgICAgICAgU2V0PFN0cmluZz4gcyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKLSAgICAgICAgcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCgiYmFyIiwgImZvbyIsICJ6ZWUiKSk7CisgICAgICAgIFNldDxTdHJpbmc+IHMgPSBuZXcgTGlua2VkSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoImJhciIsICJmb28iLCAiemVlIikpOwogCiAgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gc2IgPSBuZXcgQXJyYXlMaXN0PD4ocy5zaXplKCkpOwogICAgICAgICBmb3IgKFN0cmluZyB0IDogcykKICAgICAgICAgICAgIHNiLmFkZChVVEY4VHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UodCkpOwogCi0gICAgICAgIGFzc2VydEVxdWFscyhzLCBzdC5nZXRTZXJpYWxpemVyKCkuZGVzZXJpYWxpemVGb3JOYXRpdmVQcm90b2NvbChDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKHNiLCBzYi5zaXplKCksIHZlcnNpb24pLCB2ZXJzaW9uKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzLCBzdC5nZXRTZXJpYWxpemVyKCkuZGVzZXJpYWxpemUoQ29sbGVjdGlvblNlcmlhbGl6ZXIucGFjayhzYiwgc2Iuc2l6ZSgpKSkpOwogCiAgICAgICAgIC8vIE1hcHMKICAgICAgICAgTWFwVHlwZTw/LCA/PiBtdCA9IE1hcFR5cGUuZ2V0SW5zdGFuY2UoVVRGOFR5cGUuaW5zdGFuY2UsIExvbmdUeXBlLmluc3RhbmNlLCB0cnVlKTsKQEAgLTEwNSw1MiArMTIyLDQ5IEBACiAgICAgICAgICAgICBtYi5hZGQoTG9uZ1R5cGUuaW5zdGFuY2UuZGVjb21wb3NlKGVudHJ5LmdldFZhbHVlKCkpKTsKICAgICAgICAgfQogCi0gICAgICAgIGFzc2VydEVxdWFscyhtLCBtdC5nZXRTZXJpYWxpemVyKCkuZGVzZXJpYWxpemVGb3JOYXRpdmVQcm90b2NvbChDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKG1iLCBtLnNpemUoKSwgdmVyc2lvbiksIHZlcnNpb24pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG0sIG10LmdldFNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZShDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKG1iLCBtLnNpemUoKSkpKTsKICAgICB9CiAKICAgICBAVGVzdChleHBlY3RlZCA9IE1hcnNoYWxFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgc2V0c01heU5vdENvbnRhaW5OdWxsc1Rlc3QoKQogICAgIHsKLSAgICAgICAgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24gPSBQcm90b2NvbFZlcnNpb24uTUlOX1NVUFBPUlRFRF9WRVJTSU9OOwogICAgICAgICBTZXRUeXBlPD8+IHN0ID0gU2V0VHlwZS5nZXRJbnN0YW5jZShVVEY4VHlwZS5pbnN0YW5jZSwgdHJ1ZSk7CiAgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gc2IgPSBuZXcgQXJyYXlMaXN0PD4oMSk7CiAgICAgICAgIHNiLmFkZChudWxsKTsKIAotICAgICAgICBzdC5nZXRTZXJpYWxpemVyKCkuZGVzZXJpYWxpemVGb3JOYXRpdmVQcm90b2NvbChDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKHNiLCBzYi5zaXplKCksIHZlcnNpb24pLCB2ZXJzaW9uKTsKKyAgICAgICAgc3QuZ2V0U2VyaWFsaXplcigpLmRlc2VyaWFsaXplKENvbGxlY3Rpb25TZXJpYWxpemVyLnBhY2soc2IsIHNiLnNpemUoKSkpOwogICAgIH0KIAogICAgIEBUZXN0KGV4cGVjdGVkID0gTWFyc2hhbEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCBtYXBLZXlzTWF5Tm90Q29udGFpbk51bGxzVGVzdCgpCiAgICAgewotICAgICAgICBQcm90b2NvbFZlcnNpb24gdmVyc2lvbiA9IFByb3RvY29sVmVyc2lvbi5NSU5fU1VQUE9SVEVEX1ZFUlNJT047CiAgICAgICAgIE1hcFR5cGU8PywgPz4gbXQgPSBNYXBUeXBlLmdldEluc3RhbmNlKFVURjhUeXBlLmluc3RhbmNlLCBMb25nVHlwZS5pbnN0YW5jZSwgdHJ1ZSk7CiAgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gbWIgPSBuZXcgQXJyYXlMaXN0PD4oMik7CiAgICAgICAgIG1iLmFkZChudWxsKTsKICAgICAgICAgbWIuYWRkKExvbmdUeXBlLmluc3RhbmNlLmRlY29tcG9zZSg5OTlMKSk7CiAKLSAgICAgICAgbXQuZ2V0U2VyaWFsaXplcigpLmRlc2VyaWFsaXplRm9yTmF0aXZlUHJvdG9jb2woQ29sbGVjdGlvblNlcmlhbGl6ZXIucGFjayhtYiwgbWIuc2l6ZSgpLCB2ZXJzaW9uKSwgdmVyc2lvbik7CisgICAgICAgIG10LmdldFNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZShDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKG1iLCBtYi5zaXplKCkpKTsKICAgICB9CiAKICAgICBAVGVzdChleHBlY3RlZCA9IE1hcnNoYWxFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgbWFwVmFsdWVNYXlOb3RDb250YWluTnVsbHNUZXN0KCkKICAgICB7Ci0gICAgICAgIFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uID0gUHJvdG9jb2xWZXJzaW9uLk1JTl9TVVBQT1JURURfVkVSU0lPTjsKICAgICAgICAgTWFwVHlwZTw/LCA/PiBtdCA9IE1hcFR5cGUuZ2V0SW5zdGFuY2UoVVRGOFR5cGUuaW5zdGFuY2UsIExvbmdUeXBlLmluc3RhbmNlLCB0cnVlKTsKICAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBtYiA9IG5ldyBBcnJheUxpc3Q8PigyKTsKICAgICAgICAgbWIuYWRkKFVURjhUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgiZGFuZ2VyIikpOwogICAgICAgICBtYi5hZGQobnVsbCk7CiAKLSAgICAgICAgbXQuZ2V0U2VyaWFsaXplcigpLmRlc2VyaWFsaXplRm9yTmF0aXZlUHJvdG9jb2woQ29sbGVjdGlvblNlcmlhbGl6ZXIucGFjayhtYiwgbWIuc2l6ZSgpLCB2ZXJzaW9uKSwgdmVyc2lvbik7CisgICAgICAgIG10LmdldFNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZShDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKG1iLCBtYi5zaXplKCkpKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGV2ZW50U2VyRGVzZXJUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHB1YmxpYyB2b2lkIGV2ZW50U2VyRGVzZXJUZXN0KCkKICAgICB7CiAgICAgICAgIGZvciAoUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24gOiBQcm90b2NvbFZlcnNpb24uU1VQUE9SVEVEKQogICAgICAgICAgICAgZXZlbnRTZXJEZXNlclRlc3QodmVyc2lvbik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgZXZlbnRTZXJEZXNlclRlc3QoUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pIHRocm93cyBFeGNlcHRpb24KKyAgICBwdWJsaWMgdm9pZCBldmVudFNlckRlc2VyVGVzdChQcm90b2NvbFZlcnNpb24gdmVyc2lvbikKICAgICB7CiAgICAgICAgIExpc3Q8RXZlbnQ+IGV2ZW50cyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCkBAIC0yMjgsMTQgKzI0MiwxNCBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdWR0U2VyRGVzZXJUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHB1YmxpYyB2b2lkIHVkdFNlckRlc2VyVGVzdCgpCiAgICAgewogICAgICAgICBmb3IgKFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uIDogUHJvdG9jb2xWZXJzaW9uLlNVUFBPUlRFRCkKICAgICAgICAgICAgIHVkdFNlckRlc2VyVGVzdCh2ZXJzaW9uKTsKICAgICB9CiAKIAotICAgIHB1YmxpYyB2b2lkIHVkdFNlckRlc2VyVGVzdChQcm90b2NvbFZlcnNpb24gdmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHB1YmxpYyB2b2lkIHVkdFNlckRlc2VyVGVzdChQcm90b2NvbFZlcnNpb24gdmVyc2lvbikKICAgICB7CiAgICAgICAgIExpc3RUeXBlPD8+IGx0ID0gTGlzdFR5cGUuZ2V0SW5zdGFuY2UoSW50MzJUeXBlLmluc3RhbmNlLCB0cnVlKTsKICAgICAgICAgU2V0VHlwZTw/PiBzdCA9IFNldFR5cGUuZ2V0SW5zdGFuY2UoVVRGOFR5cGUuaW5zdGFuY2UsIHRydWUpOwpAQCAtMjc0LDcgKzI4OCw3IEBACiAKICAgICAgICAgQnl0ZUJ1ZmZlciBzZXJpYWxpemVkID0gdC5iaW5kQW5kR2V0KG9wdGlvbnMpOwogCi0gICAgICAgIEJ5dGVCdWZmZXJbXSBmaWVsZHMgPSB1ZHQuc3BsaXQoc2VyaWFsaXplZCk7CisgICAgICAgIEJ5dGVCdWZmZXJbXSBmaWVsZHMgPSB1ZHQuc3BsaXQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBzZXJpYWxpemVkKTsKIAogICAgICAgICBhc3NlcnRFcXVhbHMoNCwgZmllbGRzLmxlbmd0aCk7CiAKQEAgLTI4NCwxNiArMjk4LDE1IEBACiAgICAgICAgIC8vIGEgVURUIHNob3VsZCBhbHdheSBiZSBzZXJpYWxpemVkIHdpdGggdmVyc2lvbiAzIG9mIHRoZSBwcm90b2NvbC4gV2hpY2ggaXMgd2h5IHdlIGRvbid0IHVzZSAndmVyc2lvbicKICAgICAgICAgLy8gb24gcHVycG9zZSBiZWxvdy4KIAotICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgzLCAxKSwgbHQuZ2V0U2VyaWFsaXplcigpLmRlc2VyaWFsaXplRm9yTmF0aXZlUHJvdG9jb2woZmllbGRzWzFdLCBQcm90b2NvbFZlcnNpb24uVjMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoMywgMSksIGx0LmdldFNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZShmaWVsZHNbMV0pKTsKIAotICAgICAgICBMaW5rZWRIYXNoU2V0PFN0cmluZz4gcyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKLSAgICAgICAgcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCgiYmFyIiwgImZvbyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHMsIHN0LmdldFNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZUZvck5hdGl2ZVByb3RvY29sKGZpZWxkc1syXSwgUHJvdG9jb2xWZXJzaW9uLlYzKSk7CisgICAgICAgIExpbmtlZEhhc2hTZXQ8U3RyaW5nPiBzID0gbmV3IExpbmtlZEhhc2hTZXQ8PihBcnJheXMuYXNMaXN0KCJiYXIiLCAiZm9vIikpOworICAgICAgICBhc3NlcnRFcXVhbHMocywgc3QuZ2V0U2VyaWFsaXplcigpLmRlc2VyaWFsaXplKGZpZWxkc1syXSkpOwogCiAgICAgICAgIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBMb25nPiBtID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOwogICAgICAgICBtLnB1dCgiYmFyIiwgMTJMKTsKICAgICAgICAgbS5wdXQoImZvbyIsIDI0TCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtLCBtdC5nZXRTZXJpYWxpemVyKCkuZGVzZXJpYWxpemVGb3JOYXRpdmVQcm90b2NvbChmaWVsZHNbM10sIFByb3RvY29sVmVyc2lvbi5WMykpOworICAgICAgICBhc3NlcnRFcXVhbHMobSwgbXQuZ2V0U2VyaWFsaXplcigpLmRlc2VyaWFsaXplKGZpZWxkc1szXSkpOwogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L1dyaXRlQnl0ZXNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L1dyaXRlQnl0ZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRkMWM3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvV3JpdGVCeXRlc1Rlc3QuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgaW8ubmV0dHkuYnVmZmVyLkJ5dGVCdWY7CitpbXBvcnQgaW8ubmV0dHkuYnVmZmVyLlVucG9vbGVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkdlbmVyYXRvcnM7CitpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKKworaW1wb3J0IHN0YXRpYyBvcmcucXVpY2t0aGVvcmllcy5RdWlja1RoZW9yeS5xdDsKKworCitwdWJsaWMgY2xhc3MgV3JpdGVCeXRlc1Rlc3QKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3QoKQorICAgIHsKKyAgICAgICAgaW50IG1heEJ5dGVzID0gMTBfMDAwOworICAgICAgICBCeXRlQnVmIGJ1ZiA9IFVucG9vbGVkLmJ1ZmZlcihtYXhCeXRlcyk7CisgICAgICAgIHF0KCkuZm9yQWxsKEdlbmVyYXRvcnMuYnl0ZXNBbnlUeXBlKDAsIG1heEJ5dGVzKSkuY2hlY2tBc3NlcnQoYmIgLT4geworICAgICAgICAgICAgYnVmLmNsZWFyKCk7CisKKyAgICAgICAgICAgIGludCBzaXplID0gYmIucmVtYWluaW5nKCk7CisgICAgICAgICAgICBpbnQgcG9zID0gYmIucG9zaXRpb24oKTsKKworICAgICAgICAgICAgQ0JVdGlsLmFkZEJ5dGVzKGJiLCBidWYpOworCisgICAgICAgICAgICAvLyB0ZXN0IGZvciBjb25zdW1wdGlvbgorICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGJiLnJlbWFpbmluZygpKS5pc0VxdWFsVG8oc2l6ZSk7CisgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoYmIucG9zaXRpb24oKSkuaXNFcXVhbFRvKHBvcyk7CisKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChidWYud3JpdGVySW5kZXgoKSkuaXNFcXVhbFRvKHNpemUpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGJ1Zi5nZXRCeXRlKGJ1Zi5yZWFkZXJJbmRleCgpICsgaSkpLmRlc2NyaWJlZEFzKCJieXRlIG1pc21hdGNoIGF0IGluZGV4ICVkIiwgaSkuaXNFcXVhbFRvKGJiLmdldChiYi5wb3NpdGlvbigpICsgaSkpOworICAgICAgICAgICAgRmlsZVV0aWxzLmNsZWFuKGJiKTsKKyAgICAgICAgfSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvQmxvb21GaWx0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvQmxvb21GaWx0ZXJUZXN0LmphdmEKaW5kZXggOTY0NjRjOS4uN2YwOGQ2YyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0Jsb29tRmlsdGVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9CbG9vbUZpbHRlclRlc3QuamF2YQpAQCAtMTgsMTAgKzE4LDcgQEAKICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC4qOwotCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CkBAIC0yOSwxMCArMjYsMjAgQEAKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKLWltcG9ydCBvcmcuanVuaXQuKjsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lk11cm11cjNQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUlucHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVPdXRwdXRTdHJlYW1QbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLklGaWx0ZXIuRmlsdGVyS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLktleUdlbmVyYXRvci5SYW5kb21TdHJpbmdHZW5lcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMub2JzLklCaXRTZXQ7CkBAIC01NSwxMSArNjIsMTEgQEAKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIEJsb29tRmlsdGVyU2VyaWFsaXplci5zZXJpYWxpemUoKEJsb29tRmlsdGVyKSBmLCBvdXQpOworICAgICAgICAgICAgQmxvb21GaWx0ZXJTZXJpYWxpemVyLmZvclZlcnNpb24oZmFsc2UpLnNlcmlhbGl6ZSgoQmxvb21GaWx0ZXIpIGYsIG91dCk7CiAgICAgICAgIH0KIAogICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQuZ2V0RGF0YSgpLCAwLCBvdXQuZ2V0TGVuZ3RoKCkpOwotICAgICAgICBJRmlsdGVyIGYyID0gQmxvb21GaWx0ZXJTZXJpYWxpemVyLmRlc2VyaWFsaXplKG5ldyBEYXRhSW5wdXRTdHJlYW0oaW4pLCBvbGRCZkZvcm1hdCk7CisgICAgICAgIElGaWx0ZXIgZjIgPSBCbG9vbUZpbHRlclNlcmlhbGl6ZXIuZm9yVmVyc2lvbihvbGRCZkZvcm1hdCkuZGVzZXJpYWxpemUoVXRpbC5EYXRhSW5wdXRTdHJlYW1QbHVzSW1wbC53cmFwKGluKSk7CiAKICAgICAgICAgYXNzZXJ0IGYyLmlzUHJlc2VudChGaWx0ZXJUZXN0SGVscGVyLmJ5dGVzKCJhIikpOwogICAgICAgICBhc3NlcnQgIWYyLmlzUHJlc2VudChGaWx0ZXJUZXN0SGVscGVyLmJ5dGVzKCJiIikpOwpAQCAtMjEwLDEzICsyMTcsMTQgQEAKICAgICAgICAgRmlsZSBmaWxlID0gRmlsZVV0aWxzLmNyZWF0ZURlbGV0YWJsZVRlbXBGaWxlKCJibG9vbUZpbHRlclRlc3QtIiwgIi5kYXQiKTsKICAgICAgICAgQmxvb21GaWx0ZXIgZmlsdGVyID0gKEJsb29tRmlsdGVyKSBGaWx0ZXJGYWN0b3J5LmdldEZpbHRlcigoKGxvbmcpIEludGVnZXIuTUFYX1ZBTFVFIC8gOCkgKyAxLCAwLjAxZCk7CiAgICAgICAgIGZpbHRlci5hZGQoRmlsdGVyVGVzdEhlbHBlci53cmFwKHRlc3QpKTsKLSAgICAgICAgRGF0YU91dHB1dFN0cmVhbVBsdXMgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW1QbHVzKGZpbGUpOwotICAgICAgICBCbG9vbUZpbHRlclNlcmlhbGl6ZXIuc2VyaWFsaXplKGZpbHRlciwgb3V0KTsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbVBsdXMgb3V0ID0gZmlsZS5uZXdPdXRwdXRTdHJlYW0oRmlsZS5Xcml0ZU1vZGUuT1ZFUldSSVRFKTsKKyAgICAgICAgQmxvb21GaWx0ZXJTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBCbG9vbUZpbHRlclNlcmlhbGl6ZXIuZm9yVmVyc2lvbihmYWxzZSk7CisgICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKGZpbHRlciwgb3V0KTsKICAgICAgICAgb3V0LmNsb3NlKCk7CiAgICAgICAgIGZpbHRlci5jbG9zZSgpOwogCi0gICAgICAgIERhdGFJbnB1dFN0cmVhbSBpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbVBsdXMoZmlsZSkpOwotICAgICAgICBCbG9vbUZpbHRlciBmaWx0ZXIyID0gQmxvb21GaWx0ZXJTZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCBmYWxzZSk7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbVBsdXMgaW4gPSBmaWxlLm5ld0lucHV0U3RyZWFtKCk7CisgICAgICAgIEJsb29tRmlsdGVyIGZpbHRlcjIgPSBCbG9vbUZpbHRlclNlcmlhbGl6ZXIuZm9yVmVyc2lvbihmYWxzZSkuZGVzZXJpYWxpemUoaW4pOwogICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShmaWx0ZXIyLmlzUHJlc2VudChGaWx0ZXJUZXN0SGVscGVyLndyYXAodGVzdCkpKTsKICAgICAgICAgRmlsZVV0aWxzLmNsb3NlUXVpZXRseShpbik7CiAgICAgICAgIGZpbHRlcjIuY2xvc2UoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9CeXRlQnVmZmVyVXRpbFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9CeXRlQnVmZmVyVXRpbFRlc3QuamF2YQppbmRleCA0YWU4NjI2Li4yYjgzMWI5IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvQnl0ZUJ1ZmZlclV0aWxUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0J5dGVCdWZmZXJVdGlsVGVzdC5qYXZhCkBAIC0zNTYsNCArMzU2LDM3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzV2l0aFNob3J0TGVuZ3RoKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBCeXRlQnVmZmVyIGJiID0gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMocyk7CisgICAgICAgIGNoZWNrRXF1YWxzKGJiKTsKKworICAgICAgICBiYiA9IGZyb21TdHJpbmdXaXRoUG9zaXRpb24ocywgMTAsIGZhbHNlKTsKKyAgICAgICAgY2hlY2tFcXVhbHMoYmIpOworCisgICAgICAgIGJiID0gZnJvbVN0cmluZ1dpdGhQb3NpdGlvbihzLCAxMCwgdHJ1ZSk7CisgICAgICAgIGNoZWNrRXF1YWxzKGJiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tFcXVhbHMoQnl0ZUJ1ZmZlciBiYikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhT3V0cHV0QnVmZmVyIG91dCA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKCk7CisgICAgICAgIEJ5dGVCdWZmZXJVdGlsLndyaXRlV2l0aFNob3J0TGVuZ3RoKGJiLCBvdXQpOworCisgICAgICAgIERhdGFJbnB1dFN0cmVhbSBpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dC50b0J5dGVBcnJheSgpKSk7CisgICAgICAgIGFzc2VydCBCeXRlQnVmZmVyVXRpbC5lcXVhbHNXaXRoU2hvcnRMZW5ndGgoaW4sIGJiKTsKKworICAgICAgICBpbnQgaW5kZXggPSBUaHJlYWRMb2NhbFJhbmRvbS5jdXJyZW50KCkubmV4dEludChiYi5yZW1haW5pbmcoKSk7CisKKyAgICAgICAgaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSkpOworICAgICAgICBiYi5wdXQoYmIucG9zaXRpb24oKSArIGluZGV4LCAoYnl0ZSkgKGJiLmdldChpbmRleCkgXiAweDU1KSk7CisgICAgICAgIGFzc2VydCAhQnl0ZUJ1ZmZlclV0aWwuZXF1YWxzV2l0aFNob3J0TGVuZ3RoKGluLCBiYik7CisgICAgICAgIGJiLnB1dChiYi5wb3NpdGlvbigpICsgaW5kZXgsIChieXRlKSAoYmIuZ2V0KGluZGV4KSBeIDB4NTUpKTsgICAvLyByZXZlcnQgY2hhbmdlCisKKyAgICAgICAgaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSkpOworICAgICAgICBiYi5saW1pdChiYi5wb3NpdGlvbigpICsgaW5kZXgpOworICAgICAgICBhc3NlcnQgIUJ5dGVCdWZmZXJVdGlsLmVxdWFsc1dpdGhTaG9ydExlbmd0aChpbiwgYmIpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9CeXRlc1JlYWRUcmFja2VyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0J5dGVzUmVhZFRyYWNrZXJUZXN0LmphdmEKaW5kZXggNzY5M2I0NS4uZjQwMDQ2MSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0J5dGVzUmVhZFRyYWNrZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0J5dGVzUmVhZFRyYWNrZXJUZXN0LmphdmEKQEAgLTE4LDEwICsxOCw2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHM7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKQEAgLTI5LDExICsyNSwxOCBAQAogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuQnl0ZXNSZWFkVHJhY2tlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dEJ1ZmZlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzLkRhdGFJbnB1dFN0cmVhbVBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5UcmFja2VkRGF0YUlucHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlRyYWNrZWRJbnB1dFN0cmVhbTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKIHB1YmxpYyBjbGFzcyBCeXRlc1JlYWRUcmFja2VyVGVzdAogewogCkBAIC05OSw5ICsxMDIsOSBAQAogICAgICAgICAgICAgb3V0LmNsb3NlKCk7CiAgICAgICAgIH0KIAotICAgICAgICBEYXRhSW5wdXRQbHVzLkRhdGFJbnB1dFN0cmVhbVBsdXMgaW4gPSBuZXcgRGF0YUlucHV0UGx1cy5EYXRhSW5wdXRTdHJlYW1QbHVzKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh0ZXN0RGF0YSkpOwotICAgICAgICBCeXRlc1JlYWRUcmFja2VyIHRyYWNrZXIgPSBpbnB1dFN0cmVhbT8gbmV3IFRyYWNrZWRJbnB1dFN0cmVhbShpbikgOiBuZXcgVHJhY2tlZERhdGFJbnB1dFBsdXMoaW4pOwotICAgICAgICBEYXRhSW5wdXRQbHVzIHJlYWRlciA9IGlucHV0U3RyZWFtPyBuZXcgRGF0YUlucHV0UGx1cy5EYXRhSW5wdXRTdHJlYW1QbHVzKChUcmFja2VkSW5wdXRTdHJlYW0pdHJhY2tlcikgOiAoRGF0YUlucHV0UGx1cykgdHJhY2tlcjsKKyAgICAgICAgRGF0YUlucHV0U3RyZWFtUGx1cyBpbiA9IG5ldyBEYXRhSW5wdXRCdWZmZXIodGVzdERhdGEpOworICAgICAgICBCeXRlc1JlYWRUcmFja2VyIHRyYWNrZXIgPSBpbnB1dFN0cmVhbSA/IG5ldyBUcmFja2VkSW5wdXRTdHJlYW0oaW4pIDogbmV3IFRyYWNrZWREYXRhSW5wdXRQbHVzKGluKTsKKyAgICAgICAgRGF0YUlucHV0UGx1cyByZWFkZXIgPSBpbnB1dFN0cmVhbSA/IFV0aWwuRGF0YUlucHV0U3RyZWFtUGx1c0ltcGwud3JhcCgoVHJhY2tlZElucHV0U3RyZWFtKSB0cmFja2VyKSA6IChEYXRhSW5wdXRQbHVzKSB0cmFja2VyOwogCiAgICAgICAgIHRyeQogICAgICAgICB7CkBAIC0xNzIsOSArMTc1LDkgQEAKICAgICAgICAgICAgIG91dC5jbG9zZSgpOwogICAgICAgICB9CiAKLSAgICAgICAgRGF0YUlucHV0UGx1cy5EYXRhSW5wdXRTdHJlYW1QbHVzIGluID0gbmV3IERhdGFJbnB1dFBsdXMuRGF0YUlucHV0U3RyZWFtUGx1cyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGVzdERhdGEpKTsKLSAgICAgICAgQnl0ZXNSZWFkVHJhY2tlciB0cmFja2VyID0gaW5wdXRTdHJlYW0/IG5ldyBUcmFja2VkSW5wdXRTdHJlYW0oaW4pIDogbmV3IFRyYWNrZWREYXRhSW5wdXRQbHVzKGluKTsKLSAgICAgICAgRGF0YUlucHV0UGx1cyByZWFkZXIgPSBpbnB1dFN0cmVhbT8gbmV3IERhdGFJbnB1dFBsdXMuRGF0YUlucHV0U3RyZWFtUGx1cygoVHJhY2tlZElucHV0U3RyZWFtKXRyYWNrZXIpIDogKERhdGFJbnB1dFBsdXMpIHRyYWNrZXI7CisgICAgICAgIERhdGFJbnB1dFN0cmVhbVBsdXMgaW4gPSBuZXcgRGF0YUlucHV0QnVmZmVyKHRlc3REYXRhKTsKKyAgICAgICAgQnl0ZXNSZWFkVHJhY2tlciB0cmFja2VyID0gaW5wdXRTdHJlYW0gPyBuZXcgVHJhY2tlZElucHV0U3RyZWFtKGluKSA6IG5ldyBUcmFja2VkRGF0YUlucHV0UGx1cyhpbik7CisgICAgICAgIERhdGFJbnB1dFBsdXMgcmVhZGVyID0gaW5wdXRTdHJlYW0gPyBVdGlsLkRhdGFJbnB1dFN0cmVhbVBsdXNJbXBsLndyYXAoKFRyYWNrZWRJbnB1dFN0cmVhbSkgdHJhY2tlcikgOiAoRGF0YUlucHV0UGx1cykgdHJhY2tlcjsKIAogICAgICAgICB0cnkKICAgICAgICAgewpAQCAtMjAwLDkgKzIwMyw5IEBACiAgICAgICAgIFN0cmluZyB0ZXN0U3RyID0gIjEyMzQ1Njc4OTAiOwogICAgICAgICBieXRlW10gdGVzdERhdGEgPSB0ZXN0U3RyLmdldEJ5dGVzKCk7CiAKLSAgICAgICAgRGF0YUlucHV0UGx1cy5EYXRhSW5wdXRTdHJlYW1QbHVzIGluID0gbmV3IERhdGFJbnB1dFBsdXMuRGF0YUlucHV0U3RyZWFtUGx1cyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGVzdERhdGEpKTsKLSAgICAgICAgQnl0ZXNSZWFkVHJhY2tlciB0cmFja2VyID0gaW5wdXRTdHJlYW0/IG5ldyBUcmFja2VkSW5wdXRTdHJlYW0oaW4pIDogbmV3IFRyYWNrZWREYXRhSW5wdXRQbHVzKGluKTsKLSAgICAgICAgRGF0YUlucHV0UGx1cyByZWFkZXIgPSBpbnB1dFN0cmVhbT8gbmV3IERhdGFJbnB1dFBsdXMuRGF0YUlucHV0U3RyZWFtUGx1cygoVHJhY2tlZElucHV0U3RyZWFtKXRyYWNrZXIpIDogKERhdGFJbnB1dFBsdXMpIHRyYWNrZXI7CisgICAgICAgIERhdGFJbnB1dFN0cmVhbVBsdXMgaW4gPSBuZXcgRGF0YUlucHV0QnVmZmVyKHRlc3REYXRhKTsKKyAgICAgICAgQnl0ZXNSZWFkVHJhY2tlciB0cmFja2VyID0gaW5wdXRTdHJlYW0gPyBuZXcgVHJhY2tlZElucHV0U3RyZWFtKGluKSA6IG5ldyBUcmFja2VkRGF0YUlucHV0UGx1cyhpbik7CisgICAgICAgIERhdGFJbnB1dFBsdXMgcmVhZGVyID0gaW5wdXRTdHJlYW0gPyBVdGlsLkRhdGFJbnB1dFN0cmVhbVBsdXNJbXBsLndyYXAoKFRyYWNrZWRJbnB1dFN0cmVhbSkgdHJhY2tlcikgOiAoRGF0YUlucHV0UGx1cykgdHJhY2tlcjsKIAogICAgICAgICB0cnkKICAgICAgICAgewpAQCAtMjMzLDggKzIzNiw4IEBACiAgICAgcHVibGljIHZvaWQgaW50ZXJuYWxUZXN0UmVhZExpbmUoYm9vbGVhbiBpbnB1dFN0cmVhbSkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgRGF0YUlucHV0U3RyZWFtIGluID0gbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oIjEiLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgQnl0ZXNSZWFkVHJhY2tlciB0cmFja2VyID0gaW5wdXRTdHJlYW0/IG5ldyBUcmFja2VkSW5wdXRTdHJlYW0oaW4pIDogbmV3IFRyYWNrZWREYXRhSW5wdXRQbHVzKGluKTsKLSAgICAgICAgRGF0YUlucHV0UGx1cyByZWFkZXIgPSBpbnB1dFN0cmVhbT8gbmV3IERhdGFJbnB1dFBsdXMuRGF0YUlucHV0U3RyZWFtUGx1cygoVHJhY2tlZElucHV0U3RyZWFtKXRyYWNrZXIpIDogKERhdGFJbnB1dFBsdXMpIHRyYWNrZXI7CisgICAgICAgIEJ5dGVzUmVhZFRyYWNrZXIgdHJhY2tlciA9IGlucHV0U3RyZWFtID8gbmV3IFRyYWNrZWRJbnB1dFN0cmVhbShpbikgOiBuZXcgVHJhY2tlZERhdGFJbnB1dFBsdXMoaW4pOworICAgICAgICBEYXRhSW5wdXRQbHVzIHJlYWRlciA9IGlucHV0U3RyZWFtID8gVXRpbC5EYXRhSW5wdXRTdHJlYW1QbHVzSW1wbC53cmFwKChUcmFja2VkSW5wdXRTdHJlYW0pIHRyYWNrZXIpIDogKERhdGFJbnB1dFBsdXMpIHRyYWNrZXI7CiAKICAgICAgICAgdHJ5CiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9DYXNzYW5kcmFHZW5lcmF0b3JzLmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvQ2Fzc2FuZHJhR2VuZXJhdG9ycy5qYXZhCmluZGV4IGFkOWNiNmIuLjM0NTQ3ZGMgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9DYXNzYW5kcmFHZW5lcmF0b3JzLmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0Nhc3NhbmRyYUdlbmVyYXRvcnMuamF2YQpAQCAtMTgsMjAgKzE4LDI2IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiBpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5NdWx0aWxpbmVSZWN1cnNpdmVUb1N0cmluZ1N0eWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlJlZmxlY3Rpb25Ub1N0cmluZ0J1aWxkZXI7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ29sdW1uSWRlbnRpZmllcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkZpZWxkSWRlbnRpZmllcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWFkQ29tbWFuZDsKQEAgLTUwLDYgKzU2LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lk9yZGVyUHJlc2VydmluZ1BhcnRpdGlvbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5kb21QYXJ0aXRpb25lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZ21zLkFwcGxpY2F0aW9uU3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZ21zLkVuZHBvaW50U3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZ21zLkhlYXJ0QmVhdFN0YXRlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtcy5WZXJzaW9uZWRWYWx1ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuQ29ubmVjdGlvblR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2U7CkBAIC0yMDIsNyArMjEyLDcgQEAKICAgICAgICAgfQogICAgICAgICBDb2x1bW5JZGVudGlmaWVyIG5hbWUgPSBuZXcgQ29sdW1uSWRlbnRpZmllcihzdHIsIHRydWUpOwogICAgICAgICBpbnQgcG9zaXRpb24gPSAha2luZC5pc1ByaW1hcnlLZXlLaW5kKCkgPyAtMSA6IChpbnQpIHJuZC5uZXh0KENvbnN0cmFpbnQuYmV0d2VlbigwLCAzMCkpOwotICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKGtzLCB0YWJsZSwgbmFtZSwgdHlwZUdlbi5nZW5lcmF0ZShybmQpLCBwb3NpdGlvbiwga2luZCk7CisgICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoa3MsIHRhYmxlLCBuYW1lLCB0eXBlR2VuLmdlbmVyYXRlKHJuZCksIHBvc2l0aW9uLCBraW5kLCBudWxsKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIEdlbjxCeXRlQnVmZmVyPiBwYXJ0aXRpb25LZXlEYXRhR2VuKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEpCkBAIC0zMTYsNCArMzI2LDE2NiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9LCB0cnVlKTsKICAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEdlbjxUb2tlbj4gbXVybXVyVG9rZW4oKQorICAgIHsKKyAgICAgICAgQ29uc3RyYWludCB0b2tlbiA9IENvbnN0cmFpbnQuYmV0d2VlbihMb25nLk1JTl9WQUxVRSwgTG9uZy5NQVhfVkFMVUUpOworICAgICAgICByZXR1cm4gcnMgLT4gbmV3IE11cm11cjNQYXJ0aXRpb25lci5Mb25nVG9rZW4ocnMubmV4dCh0b2tlbikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgR2VuPFRva2VuPiBieXRlT3JkZXJUb2tlbigpCisgICAgeworICAgICAgICBDb25zdHJhaW50IHNpemUgPSBDb25zdHJhaW50LmJldHdlZW4oMCwgMTApOworICAgICAgICBDb25zdHJhaW50IGJ5dGVSYW5nZSA9IENvbnN0cmFpbnQuYmV0d2VlbihCeXRlLk1JTl9WQUxVRSwgQnl0ZS5NQVhfVkFMVUUpOworICAgICAgICByZXR1cm4gcnMgLT4geworICAgICAgICAgICAgYnl0ZVtdIHRva2VuID0gbmV3IGJ5dGVbTWF0aC50b0ludEV4YWN0KHJzLm5leHQoc2l6ZSkpXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW4ubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgdG9rZW5baV0gPSAoYnl0ZSkgcnMubmV4dChieXRlUmFuZ2UpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLkJ5dGVzVG9rZW4odG9rZW4pOworICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgR2VuPFRva2VuPiByYW5kb21QYXJ0aXRpb25lclRva2VuKCkKKyAgICB7CisgICAgICAgIENvbnN0cmFpbnQgZG9tYWluID0gQ29uc3RyYWludC5ub25lKCk7CisgICAgICAgIHJldHVybiBycyAtPiBuZXcgUmFuZG9tUGFydGl0aW9uZXIuQmlnSW50ZWdlclRva2VuKEJpZ0ludGVnZXIudmFsdWVPZihycy5uZXh0KGRvbWFpbikpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEdlbjxUb2tlbj4gbG9jYWxQYXJ0aXRpb25lclRva2VuKExvY2FsUGFydGl0aW9uZXIgcGFydGl0aW9uZXIpCisgICAgeworICAgICAgICBHZW48Qnl0ZUJ1ZmZlcj4gYnl0ZXMgPSBBYnN0cmFjdFR5cGVHZW5lcmF0b3JzLmdldFR5cGVTdXBwb3J0KHBhcnRpdGlvbmVyLmdldFRva2VuVmFsaWRhdG9yKCkpLmJ5dGVzR2VuKCk7CisgICAgICAgIHJldHVybiBycyAtPiBwYXJ0aXRpb25lci5nZXRUb2tlbihieXRlcy5nZW5lcmF0ZShycykpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgR2VuPFRva2VuPiBvcmRlclByZXNlcnZpbmdUb2tlbigpCisgICAgeworICAgICAgICBHZW48U3RyaW5nPiBzdHJpbmcgPSBHZW5lcmF0b3JzLnV0ZjgoMCwgMTApOworICAgICAgICByZXR1cm4gcnMgLT4gbmV3IE9yZGVyUHJlc2VydmluZ1BhcnRpdGlvbmVyLlN0cmluZ1Rva2VuKHN0cmluZy5nZW5lcmF0ZShycykpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgR2VuPFRva2VuPiB0b2tlbihJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIpCisgICAgeworICAgICAgICBpZiAocGFydGl0aW9uZXIgaW5zdGFuY2VvZiBNdXJtdXIzUGFydGl0aW9uZXIpIHJldHVybiBtdXJtdXJUb2tlbigpOworICAgICAgICBpZiAocGFydGl0aW9uZXIgaW5zdGFuY2VvZiBCeXRlT3JkZXJlZFBhcnRpdGlvbmVyKSByZXR1cm4gYnl0ZU9yZGVyVG9rZW4oKTsKKyAgICAgICAgaWYgKHBhcnRpdGlvbmVyIGluc3RhbmNlb2YgUmFuZG9tUGFydGl0aW9uZXIpIHJldHVybiByYW5kb21QYXJ0aXRpb25lclRva2VuKCk7CisgICAgICAgIGlmIChwYXJ0aXRpb25lciBpbnN0YW5jZW9mIExvY2FsUGFydGl0aW9uZXIpIHJldHVybiBsb2NhbFBhcnRpdGlvbmVyVG9rZW4oKExvY2FsUGFydGl0aW9uZXIpIHBhcnRpdGlvbmVyKTsKKyAgICAgICAgaWYgKHBhcnRpdGlvbmVyIGluc3RhbmNlb2YgT3JkZXJQcmVzZXJ2aW5nUGFydGl0aW9uZXIpIHJldHVybiBvcmRlclByZXNlcnZpbmdUb2tlbigpOworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVuc3VwcG9ydGVkIHBhcnRpdGlvbmVyOiAiICsgcGFydGl0aW9uZXIuZ2V0Q2xhc3MoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBHZW48PyBleHRlbmRzIENvbGxlY3Rpb248VG9rZW4+PiB0b2tlbnMoSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyKQorICAgIHsKKyAgICAgICAgR2VuPFRva2VuPiB0b2tlbkdlbiA9IHRva2VuKHBhcnRpdGlvbmVyKTsKKyAgICAgICAgcmV0dXJuIFNvdXJjZURTTC5saXN0cygpLm9mKHRva2VuR2VuKS5vZlNpemVCZXR3ZWVuKDEsIDE2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEdlbjxIZWFydEJlYXRTdGF0ZT4gaGVhcnRCZWF0U3RhdGVzKCkKKyAgICB7CisgICAgICAgIENvbnN0cmFpbnQgZ2VuZXJhdGlvbkRvbWFpbiA9IENvbnN0cmFpbnQuYmV0d2VlbigwLCBJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgIENvbnN0cmFpbnQgdmVyc2lvbkRvbWFpbiA9IENvbnN0cmFpbnQuYmV0d2VlbigtMSwgSW50ZWdlci5NQVhfVkFMVUUpOworICAgICAgICByZXR1cm4gcnMgLT4gbmV3IEhlYXJ0QmVhdFN0YXRlKE1hdGgudG9JbnRFeGFjdChycy5uZXh0KGdlbmVyYXRpb25Eb21haW4pKSwgTWF0aC50b0ludEV4YWN0KHJzLm5leHQodmVyc2lvbkRvbWFpbikpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBHZW48TWFwPEFwcGxpY2F0aW9uU3RhdGUsIFZlcnNpb25lZFZhbHVlPj4gZ29zc2lwQXBwbGljYXRpb25TdGF0ZXMoKQorICAgIHsKKyAgICAgICAgLy9UT0RPIHN1cHBvcnQgYWxsIGFwcGxpY2F0aW9uIHN0YXRlcy4uLgorICAgICAgICAvLyBhdG0gb25seSB1c2VkIGJ5IGEgc2luZ2xlIHRlc3QsIHdoaWNoIG9ubHkgbG9va3MgYXQgc3RhdHVzCisgICAgICAgIEdlbjxCb29sZWFuPiBzdGF0dXNXaXRoUG9ydCA9IFNvdXJjZURTTC5ib29sZWFucygpLmFsbCgpOworICAgICAgICBHZW48VmVyc2lvbmVkVmFsdWU+IHN0YXR1c0dlbiA9IGdvc3NpcFN0YXR1c1ZhbHVlKCk7CisKKyAgICAgICAgcmV0dXJuIHJzIC0+IHsKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uU3RhdGUgc3RhdHVzU3RhdGUgPSBzdGF0dXNXaXRoUG9ydC5nZW5lcmF0ZShycykgPyBBcHBsaWNhdGlvblN0YXRlLlNUQVRVU19XSVRIX1BPUlQgOiBBcHBsaWNhdGlvblN0YXRlLlNUQVRVUzsKKyAgICAgICAgICAgIFZlcnNpb25lZFZhbHVlIHZ2ID0gc3RhdHVzR2VuLmdlbmVyYXRlKHJzKTsKKyAgICAgICAgICAgIGlmICh2diA9PSBudWxsKSByZXR1cm4gSW1tdXRhYmxlTWFwLm9mKCk7CisgICAgICAgICAgICByZXR1cm4gSW1tdXRhYmxlTWFwLm9mKHN0YXR1c1N0YXRlLCB2dik7CisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgR2VuPFN0cmluZz4gZ29zc2lwU3RhdHVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBTb3VyY2VEU0wuYXJiaXRyYXJ5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5waWNrKFZlcnNpb25lZFZhbHVlLlNUQVRVU19OT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uZWRWYWx1ZS5TVEFUVVNfQk9PVFNUUkFQUElOR19SRVBMQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbmVkVmFsdWUuU1RBVFVTX0JPT1RTVFJBUFBJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uZWRWYWx1ZS5TVEFUVVNfTU9WSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbmVkVmFsdWUuU1RBVFVTX0xFQVZJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uZWRWYWx1ZS5TVEFUVVNfTEVGVCwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIHdvdWxkIGJlIGdvb2QgdG8gcHJlZml4IHdpdGggU1RBVFVTXyBsaWtlIG90aGVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbmVkVmFsdWUuUkVNT1ZJTkdfVE9LRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uZWRWYWx1ZS5SRU1PVkVEX1RPS0VOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbmVkVmFsdWUuSElCRVJOQVRFICsgVmVyc2lvbmVkVmFsdWUuREVMSU1JVEVSICsgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb25lZFZhbHVlLkhJQkVSTkFURSArIFZlcnNpb25lZFZhbHVlLkRFTElNSVRFUiArIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbmVkVmFsdWUuU0hVVERPV04gKyBWZXJzaW9uZWRWYWx1ZS5ERUxJTUlURVIgKyB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbmVkVmFsdWUuU0hVVERPV04gKyBWZXJzaW9uZWRWYWx1ZS5ERUxJTUlURVIgKyBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEdlbjxWZXJzaW9uZWRWYWx1ZT4gZ29zc2lwU3RhdHVzVmFsdWUoKQorICAgIHsKKyAgICAgICAgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFBhcnRpdGlvbmVyKCk7CisgICAgICAgIEdlbjxTdHJpbmc+IHN0YXR1c0dlbiA9IGdvc3NpcFN0YXR1cygpOworICAgICAgICBHZW48VG9rZW4+IHRva2VuR2VuID0gdG9rZW4ocGFydGl0aW9uZXIpOworICAgICAgICBHZW48PyBleHRlbmRzIENvbGxlY3Rpb248VG9rZW4+PiB0b2tlbnNHZW4gPSB0b2tlbnMocGFydGl0aW9uZXIpOworICAgICAgICBHZW48SW5ldEFkZHJlc3M+IGFkZHJlc3NHZW4gPSBHZW5lcmF0b3JzLklORVRfQUREUkVTU19HRU47CisgICAgICAgIEdlbjxJbmV0QWRkcmVzc0FuZFBvcnQ+IGFkZHJlc3NBbmRHZW5HZW4gPSBJTkVUX0FERFJFU1NfQU5EX1BPUlRfR0VOOworICAgICAgICBHZW48Qm9vbGVhbj4gYm9vbCA9IFNvdXJjZURTTC5ib29sZWFucygpLmFsbCgpOworICAgICAgICBDb25zdHJhaW50IG1pbGxpcyA9IENvbnN0cmFpbnQuYmV0d2VlbigwLCBMb25nLk1BWF9WQUxVRSk7CisgICAgICAgIENvbnN0cmFpbnQgdmVyc2lvbiA9IENvbnN0cmFpbnQuYmV0d2VlbigwLCBJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgIEdlbjxVVUlEPiBob3N0SWQgPSBHZW5lcmF0b3JzLlVVSURfUkFORE9NX0dFTjsKKyAgICAgICAgVmVyc2lvbmVkVmFsdWUuVmVyc2lvbmVkVmFsdWVGYWN0b3J5IGZhY3RvcnkgPSBuZXcgVmVyc2lvbmVkVmFsdWUuVmVyc2lvbmVkVmFsdWVGYWN0b3J5KHBhcnRpdGlvbmVyKTsKKyAgICAgICAgcmV0dXJuIHJzIC0+IHsKKyAgICAgICAgICAgIFN0cmluZyBzdGF0dXMgPSBzdGF0dXNHZW4uZ2VuZXJhdGUocnMpOworICAgICAgICAgICAgc3dpdGNoIChzdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAiIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgY2FzZSBWZXJzaW9uZWRWYWx1ZS5TVEFUVVNfTk9STUFMOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5ub3JtYWwodG9rZW5zR2VuLmdlbmVyYXRlKHJzKSkud2l0aFZlcnNpb24oTWF0aC50b0ludEV4YWN0KHJzLm5leHQodmVyc2lvbikpKTsKKyAgICAgICAgICAgICAgICBjYXNlIFZlcnNpb25lZFZhbHVlLlNUQVRVU19CT09UU1RSQVBQSU5HOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5ib290c3RyYXBwaW5nKHRva2Vuc0dlbi5nZW5lcmF0ZShycykpLndpdGhWZXJzaW9uKE1hdGgudG9JbnRFeGFjdChycy5uZXh0KHZlcnNpb24pKSk7CisgICAgICAgICAgICAgICAgY2FzZSBWZXJzaW9uZWRWYWx1ZS5TVEFUVVNfQk9PVFNUUkFQUElOR19SRVBMQUNFOgorICAgICAgICAgICAgICAgICAgICBpZiAoYm9vbC5nZW5lcmF0ZShycykpIHJldHVybiBmYWN0b3J5LmJvb3RSZXBsYWNpbmdXaXRoUG9ydChhZGRyZXNzQW5kR2VuR2VuLmdlbmVyYXRlKHJzKSkud2l0aFZlcnNpb24oTWF0aC50b0ludEV4YWN0KHJzLm5leHQodmVyc2lvbikpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gZmFjdG9yeS5ib290UmVwbGFjaW5nKGFkZHJlc3NHZW4uZ2VuZXJhdGUocnMpKS53aXRoVmVyc2lvbihNYXRoLnRvSW50RXhhY3QocnMubmV4dCh2ZXJzaW9uKSkpOworICAgICAgICAgICAgICAgIGNhc2UgVmVyc2lvbmVkVmFsdWUuU1RBVFVTX01PVklORzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkubW92aW5nKHRva2VuR2VuLmdlbmVyYXRlKHJzKSkud2l0aFZlcnNpb24oTWF0aC50b0ludEV4YWN0KHJzLm5leHQodmVyc2lvbikpKTsKKyAgICAgICAgICAgICAgICBjYXNlIFZlcnNpb25lZFZhbHVlLlNUQVRVU19MRUFWSU5HOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5sZWF2aW5nKHRva2Vuc0dlbi5nZW5lcmF0ZShycykpLndpdGhWZXJzaW9uKE1hdGgudG9JbnRFeGFjdChycy5uZXh0KHZlcnNpb24pKSk7CisgICAgICAgICAgICAgICAgY2FzZSBWZXJzaW9uZWRWYWx1ZS5TVEFUVVNfTEVGVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkubGVmdCh0b2tlbnNHZW4uZ2VuZXJhdGUocnMpLCBycy5uZXh0KG1pbGxpcykpLndpdGhWZXJzaW9uKE1hdGgudG9JbnRFeGFjdChycy5uZXh0KHZlcnNpb24pKSk7CisgICAgICAgICAgICAgICAgY2FzZSBWZXJzaW9uZWRWYWx1ZS5SRU1PVklOR19UT0tFTjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkucmVtb3ZpbmdOb25sb2NhbChob3N0SWQuZ2VuZXJhdGUocnMpKS53aXRoVmVyc2lvbihNYXRoLnRvSW50RXhhY3QocnMubmV4dCh2ZXJzaW9uKSkpOworICAgICAgICAgICAgICAgIGNhc2UgVmVyc2lvbmVkVmFsdWUuUkVNT1ZFRF9UT0tFTjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkucmVtb3ZlZE5vbmxvY2FsKGhvc3RJZC5nZW5lcmF0ZShycyksIHJzLm5leHQobWlsbGlzKSkud2l0aFZlcnNpb24oTWF0aC50b0ludEV4YWN0KHJzLm5leHQodmVyc2lvbikpKTsKKyAgICAgICAgICAgICAgICBjYXNlIFZlcnNpb25lZFZhbHVlLkhJQkVSTkFURSArIFZlcnNpb25lZFZhbHVlLkRFTElNSVRFUiArIHRydWU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmhpYmVybmF0ZSh0cnVlKS53aXRoVmVyc2lvbihNYXRoLnRvSW50RXhhY3QocnMubmV4dCh2ZXJzaW9uKSkpOworICAgICAgICAgICAgICAgIGNhc2UgVmVyc2lvbmVkVmFsdWUuSElCRVJOQVRFICsgVmVyc2lvbmVkVmFsdWUuREVMSU1JVEVSICsgZmFsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmhpYmVybmF0ZShmYWxzZSkud2l0aFZlcnNpb24oTWF0aC50b0ludEV4YWN0KHJzLm5leHQodmVyc2lvbikpKTsKKyAgICAgICAgICAgICAgICBjYXNlIFZlcnNpb25lZFZhbHVlLlNIVVRET1dOICsgVmVyc2lvbmVkVmFsdWUuREVMSU1JVEVSICsgdHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnkuc2h1dGRvd24odHJ1ZSkud2l0aFZlcnNpb24oTWF0aC50b0ludEV4YWN0KHJzLm5leHQodmVyc2lvbikpKTsKKyAgICAgICAgICAgICAgICBjYXNlIFZlcnNpb25lZFZhbHVlLlNIVVRET1dOICsgVmVyc2lvbmVkVmFsdWUuREVMSU1JVEVSICsgZmFsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LnNodXRkb3duKGZhbHNlKS53aXRoVmVyc2lvbihNYXRoLnRvSW50RXhhY3QocnMubmV4dCh2ZXJzaW9uKSkpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVW5leHBlY3RlZCBzdGF0dXM6ICIgKyBzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgR2VuPEVuZHBvaW50U3RhdGU+IGVuZHBvaW50U3RhdGVzKCkKKyAgICB7CisgICAgICAgIEdlbjxIZWFydEJlYXRTdGF0ZT4gaGJHZW4gPSBoZWFydEJlYXRTdGF0ZXMoKTsKKyAgICAgICAgR2VuPE1hcDxBcHBsaWNhdGlvblN0YXRlLCBWZXJzaW9uZWRWYWx1ZT4+IGFwcFN0YXRlcyA9IGdvc3NpcEFwcGxpY2F0aW9uU3RhdGVzKCk7CisgICAgICAgIEdlbjxCb29sZWFuPiBhbGl2ZSA9IFNvdXJjZURTTC5ib29sZWFucygpLmFsbCgpOworICAgICAgICBDb25zdHJhaW50IHVwZGF0ZVRpbWVzdGFtcCA9IENvbnN0cmFpbnQuYmV0d2VlbigwLCBMb25nLk1BWF9WQUxVRSk7CisgICAgICAgIHJldHVybiBycyAtPiB7CisgICAgICAgICAgICBFbmRwb2ludFN0YXRlIHN0YXRlID0gbmV3IEVuZHBvaW50U3RhdGUoaGJHZW4uZ2VuZXJhdGUocnMpKTsKKyAgICAgICAgICAgIE1hcDxBcHBsaWNhdGlvblN0YXRlLCBWZXJzaW9uZWRWYWx1ZT4gbWFwID0gYXBwU3RhdGVzLmdlbmVyYXRlKHJzKTsKKyAgICAgICAgICAgIGlmICghbWFwLmlzRW1wdHkoKSkgc3RhdGUuYWRkQXBwbGljYXRpb25TdGF0ZXMobWFwKTsKKyAgICAgICAgICAgIGlmIChhbGl2ZS5nZW5lcmF0ZShycykpIHN0YXRlLm1hcmtBbGl2ZSgpOworICAgICAgICAgICAgZWxzZSBzdGF0ZS5tYXJrRGVhZCgpOworICAgICAgICAgICAgc3RhdGUudW5zYWZlU2V0VXBkYXRlVGltZXN0YW1wKHJzLm5leHQodXBkYXRlVGltZXN0YW1wKSk7CisgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgIH07CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0dlbmVyYXRvcnMuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9HZW5lcmF0b3JzLmphdmEKaW5kZXggMTc5YzBmNC4uMWJhYTE2ZSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0dlbmVyYXRvcnMuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvR2VuZXJhdG9ycy5qYXZhCkBAIC0zOSw2ICszOSw4IEBACiBpbXBvcnQgb3JnLnF1aWNrdGhlb3JpZXMuZ2VuZXJhdG9ycy5Tb3VyY2VEU0w7CiBpbXBvcnQgb3JnLnF1aWNrdGhlb3JpZXMuaW1wbC5Db25zdHJhaW50OwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9CTE9CX1NIQVJFRF9TRUVEOworCiBwdWJsaWMgZmluYWwgY2xhc3MgR2VuZXJhdG9ycwogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihHZW5lcmF0b3JzLmNsYXNzKTsKQEAgLTMwMCw2ICszMDIsMTYgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgR2VuPEJ5dGVCdWZmZXI+IGJ5dGVzKGludCBtaW4sIGludCBtYXgpCiAgICAgeworICAgICAgICByZXR1cm4gYnl0ZXMobWluLCBtYXgsIFNvdXJjZURTTC5hcmJpdHJhcnkoKS5jb25zdGFudChCQkNhc2VzLkhFQVApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEdlbjxCeXRlQnVmZmVyPiBieXRlc0FueVR5cGUoaW50IG1pbiwgaW50IG1heCkKKyAgICB7CisgICAgICAgIHJldHVybiBieXRlcyhtaW4sIG1heCwgU291cmNlRFNMLmFyYml0cmFyeSgpLmVudW1WYWx1ZXMoQkJDYXNlcy5jbGFzcykpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEdlbjxCeXRlQnVmZmVyPiBieXRlcyhpbnQgbWluLCBpbnQgbWF4LCBHZW48QkJDYXNlcz4gY2FzZXMpCisgICAgewogICAgICAgICBpZiAobWluIDwgMCkKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFza2VkIGZvciBuZWdhdGl2ZSBieXRlczsgZ2l2ZW4gIiArIG1pbik7CiAgICAgICAgIGlmIChtYXggPiBNQVhfQkxPQl9MRU5HVEgpCkBAIC0zMTQsMTEgKzMyNiwzMSBAQAogICAgICAgICAgICAgLy8gdG8gYWRkIG1vcmUgcmFuZG9tbmVzcywgYWxzbyBzaGlmdCBvZmZzZXQgaW4gdGhlIGFycmF5IHNvIHRoZSBzYW1lIHNpemUgZG9lc24ndCB5aWVsZCB0aGUgc2FtZSBieXRlcwogICAgICAgICAgICAgaW50IG9mZnNldCA9IChpbnQpIHJuZC5uZXh0KENvbnN0cmFpbnQuYmV0d2VlbigwLCBNQVhfQkxPQl9MRU5HVEggLSBzaXplKSk7CiAKLSAgICAgICAgICAgIHJldHVybiBCeXRlQnVmZmVyLndyYXAoTGF6eVNoYXJlZEJsb2IuU0hBUkVEX0JZVEVTLCBvZmZzZXQsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUNhc2VzKGNhc2VzLCBybmQsIG9mZnNldCwgc2l6ZSk7CiAgICAgICAgIH07CisgICAgfTsKKworICAgIHByaXZhdGUgZW51bSBCQkNhc2VzIHsgSEVBUCwgUkVBRF9PTkxZX0hFQVAsIERJUkVDVCwgUkVBRF9PTkxZX0RJUkVDVCB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBCeXRlQnVmZmVyIGhhbmRsZUNhc2VzKEdlbjxCQkNhc2VzPiBjYXNlcywgUmFuZG9tbmVzc1NvdXJjZSBybmQsIGludCBvZmZzZXQsIGludCBzaXplKSB7CisgICAgICAgIHN3aXRjaCAoY2FzZXMuZ2VuZXJhdGUocm5kKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBIRUFQOiByZXR1cm4gQnl0ZUJ1ZmZlci53cmFwKExhenlTaGFyZWRCbG9iLlNIQVJFRF9CWVRFUywgb2Zmc2V0LCBzaXplKTsKKyAgICAgICAgICAgIGNhc2UgUkVBRF9PTkxZX0hFQVA6IHJldHVybiBCeXRlQnVmZmVyLndyYXAoTGF6eVNoYXJlZEJsb2IuU0hBUkVEX0JZVEVTLCBvZmZzZXQsIHNpemUpLmFzUmVhZE9ubHlCdWZmZXIoKTsKKyAgICAgICAgICAgIGNhc2UgRElSRUNUOiByZXR1cm4gZGlyZWN0QnVmZmVyRnJvbVNoYXJlZEJsb2Iob2Zmc2V0LCBzaXplKTsKKyAgICAgICAgICAgIGNhc2UgUkVBRF9PTkxZX0RJUkVDVDogcmV0dXJuIGRpcmVjdEJ1ZmZlckZyb21TaGFyZWRCbG9iKG9mZnNldCwgc2l6ZSkuYXNSZWFkT25seUJ1ZmZlcigpOworICAgICAgICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJjYW4ndCB3YWl0IGZvciBqZGsgMTchIik7CisgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKKyAgICBwcml2YXRlIHN0YXRpYyBCeXRlQnVmZmVyIGRpcmVjdEJ1ZmZlckZyb21TaGFyZWRCbG9iKGludCBvZmZzZXQsIGludCBzaXplKSB7CisgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KHNpemUpOworICAgICAgICBiYi5wdXQoTGF6eVNoYXJlZEJsb2IuU0hBUkVEX0JZVEVTLCBvZmZzZXQsIHNpemUpOworICAgICAgICBiYi5mbGlwKCk7CisgICAgICAgIHJldHVybiBiYjsKKyAgICB9CisKKyAgICAgLyoqCiAgICAgICogSW1wbGVtZW50cyBhIHZhbGlkIHV0Zi04IGdlbmVyYXRvci4KICAgICAgKgogICAgICAqIEltcGxlbWVudGF0aW9uIG5vdGUsIGN1cnJlbnRseSByZWxpZXMgb24gZ2V0Qnl0ZXMgdG8gc3RyaXAgb3V0IG5vbi12YWxpZCB1dGYtOCBjaGFycywgc28gaXMgc2xvdwpAQCAtMzQ5LDcgKzM4MSw3IEBACiAKICAgICAgICAgc3RhdGljCiAgICAgICAgIHsKLSAgICAgICAgICAgIGxvbmcgYmxvYlNlZWQgPSBMb25nLnBhcnNlTG9uZyhTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS50ZXN0LmJsb2Iuc2hhcmVkLnNlZWQiLCBMb25nLnRvU3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSkpOworICAgICAgICAgICAgbG9uZyBibG9iU2VlZCA9IFRFU1RfQkxPQl9TSEFSRURfU0VFRC5nZXRMb25nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJTaGFyZWQgYmxvYiBHZW4gdXNlZCBzZWVkIHt9IiwgYmxvYlNlZWQpOwogCiAgICAgICAgICAgICBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbShibG9iU2VlZCk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvU2VyaWFsaXphdGlvbnNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvU2VyaWFsaXphdGlvbnNUZXN0LmphdmEKaW5kZXggYmUyMzVlNi4uZTIzYmIzOCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1NlcmlhbGl6YXRpb25zVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9TZXJpYWxpemF0aW9uc1Rlc3QuamF2YQpAQCAtMTgsMTAgKzE4LDggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlsczsKIAotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVJbnB1dFN0cmVhbVBsdXM7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CkBAIC0zMSwxMiArMjksMTIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTXVybXVyM1BhcnRpdGlvbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0U3RyZWFtUGx1czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTXVybXVyM1BhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm9icy5PZmZIZWFwQml0U2V0OwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUlucHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5vYnMuT2ZmSGVhcEJpdFNldDsKIAogcHVibGljIGNsYXNzIFNlcmlhbGl6YXRpb25zVGVzdCBleHRlbmRzIEFic3RyYWN0U2VyaWFsaXphdGlvbnNUZXN0ZXIKIHsKQEAgLTY1LDcgKzYzLDcgQEAKICAgICAgICAgICAgICAgICBpZiAob2xkQmZGb3JtYXQpCiAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZU9sZEJmRm9ybWF0KChCbG9vbUZpbHRlcikgYmYsIG91dCk7CiAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBCbG9vbUZpbHRlclNlcmlhbGl6ZXIuc2VyaWFsaXplKChCbG9vbUZpbHRlcikgYmYsIG91dCk7CisgICAgICAgICAgICAgICAgICAgIEJsb29tRmlsdGVyU2VyaWFsaXplci5mb3JWZXJzaW9uKGZhbHNlKS5zZXJpYWxpemUoKEJsb29tRmlsdGVyKSBiZiwgb3V0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTgwLDcgKzc4LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHRyeSAoRmlsZUlucHV0U3RyZWFtUGx1cyBpbiA9IGdldElucHV0KCI0LjAiLCAidXRpbHMuQmxvb21GaWx0ZXIxMDAwLmJpbiIpOwotICAgICAgICAgICAgIElGaWx0ZXIgZmlsdGVyID0gQmxvb21GaWx0ZXJTZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCBmYWxzZSkpCisgICAgICAgICAgICAgSUZpbHRlciBmaWx0ZXIgPSBCbG9vbUZpbHRlclNlcmlhbGl6ZXIuZm9yVmVyc2lvbihmYWxzZSkuZGVzZXJpYWxpemUoaW4pKQogICAgICAgICB7CiAgICAgICAgICAgICBib29sZWFuIHByZXNlbnQ7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCAxMDAwIDsgaSsrKQpAQCAtOTYsNyArOTQsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW1QbHVzIGluID0gZ2V0SW5wdXQoIjMuMCIsICJ1dGlscy5CbG9vbUZpbHRlcjEwMDAuYmluIik7Ci0gICAgICAgICAgICAgSUZpbHRlciBmaWx0ZXIgPSBCbG9vbUZpbHRlclNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIHRydWUpKQorICAgICAgICAgICAgIElGaWx0ZXIgZmlsdGVyID0gQmxvb21GaWx0ZXJTZXJpYWxpemVyLmZvclZlcnNpb24odHJ1ZSkuZGVzZXJpYWxpemUoaW4pKQogICAgICAgICB7CiAgICAgICAgICAgICBib29sZWFuIHByZXNlbnQ7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCAxMDAwIDsgaSsrKQpAQCAtMTE4LDEyICsxMTYsMTIgQEAKICAgICAgICAgdGVzdEJsb29tRmlsdGVyVGFibGUoInRlc3QvZGF0YS9ibG9vbS1maWx0ZXIvbGEvZm9vL2xhLTEtYmlnLUZpbHRlci5kYiIsIHRydWUpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdEJsb29tRmlsdGVyVGFibGUoU3RyaW5nIGZpbGUsIGJvb2xlYW4gb2xkQmZGb3JtYXQpIHRocm93cyBFeGNlcHRpb24KKyAgICBwcml2YXRlIHZvaWQgdGVzdEJsb29tRmlsdGVyVGFibGUoU3RyaW5nIGZpbGUsIGJvb2xlYW4gb2xkQmZGb3JtYXQpIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIE11cm11cjNQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IG5ldyBNdXJtdXIzUGFydGl0aW9uZXIoKTsKIAotICAgICAgICB0cnkgKERhdGFJbnB1dFN0cmVhbSBpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbVBsdXMobmV3IEZpbGUoZmlsZSkpKTsKLSAgICAgICAgICAgICBJRmlsdGVyIGZpbHRlciA9IEJsb29tRmlsdGVyU2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbiwgb2xkQmZGb3JtYXQpKQorICAgICAgICB0cnkgKEZpbGVJbnB1dFN0cmVhbVBsdXMgaW4gPSBuZXcgRmlsZShmaWxlKS5uZXdJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgIElGaWx0ZXIgZmlsdGVyID0gQmxvb21GaWx0ZXJTZXJpYWxpemVyLmZvclZlcnNpb24ob2xkQmZGb3JtYXQpLmRlc2VyaWFsaXplKGluKSkKICAgICAgICAgewogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gMTA7IGkrKykKICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9TaW1wbGVHcmFwaC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1NpbXBsZUdyYXBoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiMWZiMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9TaW1wbGVHcmFwaC5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlsczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk5hdmlnYWJsZVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuT3JkZXJpbmc7CisKKy8qKgorICogQSBkaXJlY3RlZCBncmFwaC4gTWFpbiB1c2FnZSBpcyB0aGUge0BsaW5rICNmaW5kUGF0aHMoT2JqZWN0LCBPYmplY3QpfSBtZXRob2Qgd2hpY2ggaXMgdXNlZCB0byBmaW5kIGFsbCBwYXRocyBiZXR3ZWVuCisgKiAyIHZlcnRpY2VzLgorICovCitwdWJsaWMgY2xhc3MgU2ltcGxlR3JhcGg8Vj4KK3sKKyAgICBwcml2YXRlIGZpbmFsIEltbXV0YWJsZU1hcDxWLCBJbW11dGFibGVTZXQ8Vj4+IGVkZ2VzOworCisgICAgcHJpdmF0ZSBTaW1wbGVHcmFwaChJbW11dGFibGVNYXA8ViwgSW1tdXRhYmxlU2V0PFY+PiBlZGdlcykKKyAgICB7CisgICAgICAgIGlmIChlZGdlcyA9PSBudWxsIHx8IGVkZ2VzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiRWRnZXMgZW1wdHkiKTsKKyAgICAgICAgdGhpcy5lZGdlcyA9IGVkZ2VzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBDb21wYXJhYmxlPFQ+PiBOYXZpZ2FibGVTZXQ8VD4gc29ydGVkVmVydGljZXMoU2ltcGxlR3JhcGg8VD4gZ3JhcGgpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFRyZWVTZXQ8PihncmFwaC52ZXJ0aWNlcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgQ29tcGFyYWJsZTxUPj4gVCBtaW4oU2ltcGxlR3JhcGg8VD4gZ3JhcGgpCisgICAgeworICAgICAgICByZXR1cm4gT3JkZXJpbmcubmF0dXJhbCgpLm1pbihncmFwaC52ZXJ0aWNlcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgQ29tcGFyYWJsZTxUPj4gVCBtYXgoU2ltcGxlR3JhcGg8VD4gZ3JhcGgpCisgICAgeworICAgICAgICByZXR1cm4gT3JkZXJpbmcubmF0dXJhbCgpLm1heChncmFwaC52ZXJ0aWNlcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNFZGdlKFYgYSwgViBiKQorICAgIHsKKyAgICAgICAgSW1tdXRhYmxlU2V0PFY+IG1hdGNoZXMgPSBlZGdlcy5nZXQoYSk7CisgICAgICAgIHJldHVybiBtYXRjaGVzICE9IG51bGwgJiYgbWF0Y2hlcy5jb250YWlucyhiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW1tdXRhYmxlU2V0PFY+IHZlcnRpY2VzKCkKKyAgICB7CisgICAgICAgIEltbXV0YWJsZVNldC5CdWlsZGVyPFY+IGIgPSBJbW11dGFibGVTZXQuYnVpbGRlcigpOworICAgICAgICBiLmFkZEFsbChlZGdlcy5rZXlTZXQoKSk7CisgICAgICAgIGVkZ2VzLnZhbHVlcygpLmZvckVhY2goYjo6YWRkQWxsKTsKKyAgICAgICAgcmV0dXJuIGIuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxMaXN0PFY+PiBmaW5kUGF0aHMoViBmcm9tLCBWIHRvKQorICAgIHsKKyAgICAgICAgTGlzdDxMaXN0PFY+PiBtYXRjaGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZpbmRQYXRoczAoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChmcm9tKSwgZnJvbSwgdG8sIG1hdGNoZXM6OmFkZCk7CisgICAgICAgIHJldHVybiBtYXRjaGVzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmaW5kUGF0aHMwKExpc3Q8Vj4gYWNjdW0sIFYgZnJvbSwgViB0bywgQ29uc3VtZXI8TGlzdDxWPj4gb25NYXRjaCkKKyAgICB7CisgICAgICAgIEltbXV0YWJsZVNldDxWPiBjaGVjayA9IGVkZ2VzLmdldChmcm9tKTsKKyAgICAgICAgaWYgKGNoZWNrID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47IC8vIG5vIG1hdGNoZXMKKyAgICAgICAgZm9yIChWIG5leHQgOiBjaGVjaykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFjY3VtLmNvbnRhaW5zKG5leHQpKQorICAgICAgICAgICAgICAgIHJldHVybjsgLy8gaWdub3JlIHdhbGtpbmcgcmVjdXJzaXZlCisgICAgICAgICAgICBMaXN0PFY+IG5leHRBY2N1bSA9IG5ldyBBcnJheUxpc3Q8PihhY2N1bSk7CisgICAgICAgICAgICBuZXh0QWNjdW0uYWRkKG5leHQpOworICAgICAgICAgICAgaWYgKG5leHQuZXF1YWxzKHRvKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvbk1hdGNoLmFjY2VwdChuZXh0QWNjdW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpbmRQYXRoczAobmV4dEFjY3VtLCBuZXh0LCB0bywgb25NYXRjaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXI8Vj4KKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTWFwPFYsIFNldDxWPj4gZWRnZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXI8Vj4gYWRkRWRnZShWIGZyb20sIFYgdG8pCisgICAgICAgIHsKKyAgICAgICAgICAgIGVkZ2VzLmNvbXB1dGVJZkFic2VudChmcm9tLCBpZ25vcmUgLT4gbmV3IEhhc2hTZXQ8PigpKS5hZGQodG8pOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2ltcGxlR3JhcGg8Vj4gYnVpbGQoKQorICAgICAgICB7CisgICAgICAgICAgICBJbW11dGFibGVNYXAuQnVpbGRlcjxWLCBJbW11dGFibGVTZXQ8Vj4+IGJ1aWxkZXIgPSBJbW11dGFibGVNYXAuYnVpbGRlcigpOworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8ViwgU2V0PFY+PiBlIDogZWRnZXMuZW50cnlTZXQoKSkKKyAgICAgICAgICAgICAgICBidWlsZGVyLnB1dChlLmdldEtleSgpLCBJbW11dGFibGVTZXQuY29weU9mKGUuZ2V0VmFsdWUoKSkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVHcmFwaChidWlsZGVyLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1NpbXBsZUdyYXBoVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1NpbXBsZUdyYXBoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZGVlMzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvU2ltcGxlR3JhcGhUZXN0LmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CisKK3B1YmxpYyBjbGFzcyBTaW1wbGVHcmFwaFRlc3QKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGVtcHR5KCkKKyAgICB7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IG5ldyBTaW1wbGVHcmFwaC5CdWlsZGVyPFN0cmluZz4oKS5idWlsZCgpKQorICAgICAgICAgICAgICAgICAgLmlzSW5zdGFuY2VPZihBc3NlcnRpb25FcnJvci5jbGFzcykKKyAgICAgICAgICAgICAgICAgIC5oYXNNZXNzYWdlKCJFZGdlcyBlbXB0eSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHZlcnRpY2VzIGhhdmUgZWRnZXMgdGhhdCBmb3JtIGEgY2lyY2xlIHRoaXMgc2hvdWxkIG5vdCBjYXVzZSB7QGxpbmsgU2ltcGxlR3JhcGgjZmluZFBhdGhzKE9iamVjdCwgT2JqZWN0KX0gdG8KKyAgICAgKiBoYW5nLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVjdXJzaXZlKCkKKyAgICB7CisgICAgICAgIFNpbXBsZUdyYXBoPFN0cmluZz4gZ3JhcGggPSBvZigiQSIsICJCIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCIiwgIkMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkMiLCAiQSIpOworICAgICAgICAvLyBubyBwYXRocyB0byBpZGVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGdyYXBoLmZpbmRQYXRocygiQSIsICJBIikpLmlzRW1wdHkoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChncmFwaC5maW5kUGF0aHMoIkIiLCAiQiIpKS5pc0VtcHR5KCk7CisgICAgICAgIGFzc2VydFRoYXQoZ3JhcGguZmluZFBhdGhzKCJDIiwgIkMiKSkuaXNFbXB0eSgpOworCisgICAgICAgIGFzc2VydFRoYXQoZ3JhcGguZmluZFBhdGhzKCJDIiwgIkIiKSkuaXNFcXVhbFRvKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoQXJyYXlzLmFzTGlzdCgiQyIsICJBIiwgIkIiKSkpOworCisgICAgICAgIC8vIGFsbCBvcHRpb25zIHJldHVybiBhbmQgZG9uJ3QgaGF2ZSBkdXBsaWNhdGUga2V5cworICAgICAgICBmb3IgKFN0cmluZyBpIDogZ3JhcGgudmVydGljZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgaiA6IGdyYXBoLnZlcnRpY2VzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTGlzdDxMaXN0PFN0cmluZz4+IHBhdGhzID0gZ3JhcGguZmluZFBhdGhzKGksIGopOworICAgICAgICAgICAgICAgIGZvciAoTGlzdDxTdHJpbmc+IHBhdGggOiBwYXRocykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IGRpc3RpbmN0ID0gY291bnREaXN0aW5jdChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBJbnRlZ2VyPiBlIDogZGlzdGluY3QuZW50cnlTZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoZS5nZXRWYWx1ZSgpKS5kZXNjcmliZWRBcygiRHVwbGljYXRlIHZlcnRleCAlcyBmb3VuZDsgJXMiLCBlLmdldEtleSgpLCBwYXRoKS5pc0VxdWFsVG8oMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaW1wbGUoKQorICAgIHsKKyAgICAgICAgU2ltcGxlR3JhcGg8U3RyaW5nPiBncmFwaCA9IG9mKCJBIiwgIkIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkIiLCAiQyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQyIsICJEIik7CisKKyAgICAgICAgYXNzZXJ0VGhhdChncmFwaC5maW5kUGF0aHMoIkEiLCAiQiIpKS5pc0VxdWFsVG8oQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChBcnJheXMuYXNMaXN0KCJBIiwgIkIiKSkpOworICAgICAgICBhc3NlcnRUaGF0KGdyYXBoLmZpbmRQYXRocygiQSIsICJDIikpLmlzRXF1YWxUbyhDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KEFycmF5cy5hc0xpc3QoIkEiLCAiQiIsICJDIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChncmFwaC5maW5kUGF0aHMoIkIiLCAiRCIpKS5pc0VxdWFsVG8oQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChBcnJheXMuYXNMaXN0KCJCIiwgIkMiLCAiRCIpKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChncmFwaC5oYXNFZGdlKCJBIiwgIkIiKSkuaXNUcnVlKCk7CisgICAgICAgIGFzc2VydFRoYXQoZ3JhcGguaGFzRWRnZSgiQyIsICJEIikpLmlzVHJ1ZSgpOworICAgICAgICBhc3NlcnRUaGF0KGdyYXBoLmhhc0VkZ2UoIkIiLCAiQSIpKS5pc0ZhbHNlKCk7CisgICAgICAgIGFzc2VydFRoYXQoZ3JhcGguaGFzRWRnZSgiQyIsICJCIikpLmlzRmFsc2UoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyA8VD4gTWFwPFQsIEludGVnZXI+IGNvdW50RGlzdGluY3QoTGlzdDxUPiBsaXN0KQorICAgIHsKKyAgICAgICAgTWFwPFQsIEludGVnZXI+IG1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChUIHQgOiBsaXN0KQorICAgICAgICAgICAgbWFwLmNvbXB1dGUodCwgKGlnbm9yZSwgYWNjdW0pIC0+IGFjY3VtID09IG51bGwgPyAxIDogYWNjdW0gKyAxKTsKKyAgICAgICAgcmV0dXJuIG1hcDsKKyAgICB9CisKKyAgICBzdGF0aWMgPFQ+IFNpbXBsZUdyYXBoPFQ+IG9mKFQuLi4gdmFsdWVzKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHZhbHVlcy5sZW5ndGggJSAyID09IDA6ICJncmFwaCByZXF1aXJlcyBldmVuIG51bWJlciBvZiB2YWx1ZXMsIGJ1dCBnaXZlbiAiICsgdmFsdWVzLmxlbmd0aDsKKyAgICAgICAgU2ltcGxlR3JhcGguQnVpbGRlcjxUPiBidWlsZGVyID0gbmV3IFNpbXBsZUdyYXBoLkJ1aWxkZXI8PigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkgPSBpICsgMikKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkRWRnZSh2YWx1ZXNbaV0sIHZhbHVlc1tpICsgMV0pOworICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvVGVlRGF0YUlucHV0UGx1c1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9UZWVEYXRhSW5wdXRQbHVzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYWM5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvVGVlRGF0YUlucHV0UGx1c1Rlc3QuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlsczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlRlZURhdGFJbnB1dFBsdXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIFRlZURhdGFJbnB1dFBsdXNUZXN0Cit7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGVlQnVmZmVyKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRGF0YU91dHB1dEJ1ZmZlciBvdXQgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlcigpOworICAgICAgICBieXRlW10gdGVzdERhdGE7CisKKyAgICAgICAgLy8gYm9vbGVhbgorICAgICAgICBvdXQud3JpdGVCb29sZWFuKHRydWUpOworICAgICAgICAvLyBieXRlCisgICAgICAgIG91dC53cml0ZUJ5dGUoMHgxKTsKKyAgICAgICAgLy8gY2hhcgorICAgICAgICBvdXQud3JpdGVDaGFyKCdhJyk7CisgICAgICAgIC8vIHNob3J0CisgICAgICAgIG91dC53cml0ZVNob3J0KDEpOworICAgICAgICAvLyBpbnQKKyAgICAgICAgb3V0LndyaXRlSW50KDEpOworICAgICAgICAvLyBsb25nCisgICAgICAgIG91dC53cml0ZUxvbmcoMUwpOworICAgICAgICAvLyBmbG9hdAorICAgICAgICBvdXQud3JpdGVGbG9hdCgxLjBmKTsKKyAgICAgICAgLy8gZG91YmxlCisgICAgICAgIG91dC53cml0ZURvdWJsZSgxLjBkKTsKKyAgICAgICAgLy8gdmludAorICAgICAgICBvdXQud3JpdGVWSW50KC0xMzM3TCk7CisgICAgICAgIC8vdW5zaWduZWQgdmludAorICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoMTMzN0wpOworICAgICAgICAvLyBTdHJpbmcKKyAgICAgICAgb3V0LndyaXRlVVRGKCJhYmMiKTsKKyAgICAgICAgLy9Bbm90aGVyIHN0cmluZyB0byB0ZXN0IHNraXAKKyAgICAgICAgb3V0LndyaXRlVVRGKCJnYXJiYWdldG9za2lwYXR0aGVlbmQiKTsKKyAgICAgICAgdGVzdERhdGEgPSBvdXQudG9CeXRlQXJyYXkoKTsKKworICAgICAgICBpbnQgTElNSVRFRF9TSVpFID0gNDA7CisgICAgICAgIERhdGFJbnB1dEJ1ZmZlciByZWFkZXIgPSBuZXcgRGF0YUlucHV0QnVmZmVyKHRlc3REYXRhKTsKKyAgICAgICAgRGF0YUlucHV0QnVmZmVyIHJlYWRlcjIgPSBuZXcgRGF0YUlucHV0QnVmZmVyKHRlc3REYXRhKTsKKyAgICAgICAgRGF0YU91dHB1dEJ1ZmZlciB0ZWVPdXQgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlcigpOworICAgICAgICBEYXRhT3V0cHV0QnVmZmVyIGxpbWl0ZWRUZWVPdXQgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlcigpOworICAgICAgICBUZWVEYXRhSW5wdXRQbHVzIHRlZSA9IG5ldyBUZWVEYXRhSW5wdXRQbHVzKHJlYWRlciwgdGVlT3V0KTsKKyAgICAgICAgVGVlRGF0YUlucHV0UGx1cyBsaW1pdGVkVGVlID0gbmV3IFRlZURhdGFJbnB1dFBsdXMocmVhZGVyMiwgbGltaXRlZFRlZU91dCwgTElNSVRFRF9TSVpFKTsKKworICAgICAgICAvLyBib29sZWFuID0gMWJ5dGUKKyAgICAgICAgYm9vbGVhbiBib29sID0gdGVlLnJlYWRCb29sZWFuKCk7CisgICAgICAgIGFzc2VydFRydWUoYm9vbCk7CisgICAgICAgIGJvb2wgPSBsaW1pdGVkVGVlLnJlYWRCb29sZWFuKCk7CisgICAgICAgIGFzc2VydFRydWUoYm9vbCk7CisgICAgICAgIC8vIGJ5dGUgPSAxYnl0ZQorICAgICAgICBieXRlIGIgPSB0ZWUucmVhZEJ5dGUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGIsIDB4MSk7CisgICAgICAgIGIgPSBsaW1pdGVkVGVlLnJlYWRCeXRlKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhiLCAweDEpOworICAgICAgICAvLyBjaGFyID0gMmJ5dGUKKyAgICAgICAgY2hhciBjID0gdGVlLnJlYWRDaGFyKCk7CisgICAgICAgIGFzc2VydEVxdWFscygnYScsIGMpOworICAgICAgICBjID0gbGltaXRlZFRlZS5yZWFkQ2hhcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoJ2EnLCBjKTsKKyAgICAgICAgLy8gc2hvcnQgPSAyYnl0ZXMKKyAgICAgICAgc2hvcnQgcyA9IHRlZS5yZWFkU2hvcnQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHMpOworICAgICAgICBzID0gbGltaXRlZFRlZS5yZWFkU2hvcnQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHMpOworICAgICAgICAvLyBpbnQgPSA0Ynl0ZXMKKyAgICAgICAgaW50IGkgPSB0ZWUucmVhZEludCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaSk7CisgICAgICAgIGkgPSBsaW1pdGVkVGVlLnJlYWRJbnQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGkpOworICAgICAgICAvLyBsb25nID0gOGJ5dGVzCisgICAgICAgIGxvbmcgbCA9IHRlZS5yZWFkTG9uZygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMUwsIGwpOworICAgICAgICBsID0gbGltaXRlZFRlZS5yZWFkTG9uZygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMUwsIGwpOworICAgICAgICAvLyBmbG9hdCA9IDRieXRlcworICAgICAgICBmbG9hdCBmID0gdGVlLnJlYWRGbG9hdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4wZiwgZiwgMCk7CisgICAgICAgIGYgPSBsaW1pdGVkVGVlLnJlYWRGbG9hdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4wZiwgZiwgMCk7CisgICAgICAgIC8vIGRvdWJsZSA9IDhieXRlcworICAgICAgICBkb3VibGUgZCA9IHRlZS5yZWFkRG91YmxlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLjBkLCBkLCAwKTsKKyAgICAgICAgZCA9IGxpbWl0ZWRUZWUucmVhZERvdWJsZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4wZCwgZCwgMCk7CisgICAgICAgIGxvbmcgdmludCA9IHRlZS5yZWFkVkludCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEzMzdMLCB2aW50KTsKKyAgICAgICAgdmludCA9IGxpbWl0ZWRUZWUucmVhZFZJbnQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xMzM3TCwgdmludCk7CisgICAgICAgIGxvbmcgdXZpbnQgPSB0ZWUucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTMzN0wsIHV2aW50KTsKKyAgICAgICAgdXZpbnQgPSBsaW1pdGVkVGVlLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEzMzdMLCB1dmludCk7CisgICAgICAgIC8vIFN0cmluZygiYWJjIikgPSAyKHN0cmluZyBzaXplKSArIDMgPSA1IGJ5dGVzCisgICAgICAgIFN0cmluZyBzdHIgPSB0ZWUucmVhZFVURigpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFiYyIsIHN0cik7CisgICAgICAgIHN0ciA9IGxpbWl0ZWRUZWUucmVhZFVURigpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFiYyIsIHN0cik7CisgICAgICAgIGludCBza2lwcGVkID0gdGVlLnNraXBCeXRlcygxMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoMjMsIHNraXBwZWQpOworICAgICAgICBza2lwcGVkID0gbGltaXRlZFRlZS5za2lwQnl0ZXMoMTAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIzLCBza2lwcGVkKTsKKworICAgICAgICBieXRlW10gdGVlRGF0YSA9IHRlZU91dC50b0J5dGVBcnJheSgpOworICAgICAgICBhc3NlcnRGYWxzZSh0ZWUuaXNMaW1pdFJlYWNoZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyh0ZXN0RGF0YSwgdGVlRGF0YSkpOworCisgICAgICAgIGJ5dGVbXSBsaW1pdGVkVGVlRGF0YSA9IGxpbWl0ZWRUZWVPdXQudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaW1pdGVkVGVlLmlzTGltaXRSZWFjaGVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoQXJyYXlzLmNvcHlPZih0ZXN0RGF0YSwgTElNSVRFRF9TSVpFIC0gMSApLCBsaW1pdGVkVGVlRGF0YSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9idHJlZS9CVHJlZVJlbW92YWxUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnRyZWUvQlRyZWVSZW1vdmFsVGVzdC5qYXZhCmluZGV4IDc2ZTcwOTguLmU3NjRiM2YgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9idHJlZS9CVHJlZVJlbW92YWxUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J0cmVlL0JUcmVlUmVtb3ZhbFRlc3QuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ0cmVlOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQlRSRUVfQlJBTkNIX1NISUZUOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5idHJlZS5CVHJlZVJlbW92YWwucmVtb3ZlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKQEAgLTM3LDcgKzM4LDcgQEAKIHsKICAgICBzdGF0aWMKICAgICB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmJ0cmVlLmJyYW5jaHNoaWZ0IiwgIjMiKTsKKyAgICAgICAgQlRSRUVfQlJBTkNIX1NISUZULnNldEludCgzKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPEludGVnZXI+IENNUCA9IG5ldyBDb21wYXJhdG9yPEludGVnZXI+KCkKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9idHJlZS9CVHJlZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9idHJlZS9CVHJlZVRlc3QuamF2YQppbmRleCA3M2YwZmY3Li4wMDRkZmUwIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnRyZWUvQlRyZWVUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J0cmVlL0JUcmVlVGVzdC5qYXZhCkBAIC0yNSw2ICsyNSw3IEBACiAKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQlRSRUVfQlJBTkNIX1NISUZUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CiAKIHB1YmxpYyBjbGFzcyBCVHJlZVRlc3QKQEAgLTMyLDkgKzMzLDkgQEAKICAgICBzdGF0aWMgSW50ZWdlcltdIGludHMgPSBuZXcgSW50ZWdlclsyMF07CiAgICAgc3RhdGljCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5idHJlZS5icmFuY2hzaGlmdCIsICIyIik7CisgICAgICAgIEJUUkVFX0JSQU5DSF9TSElGVC5zZXRJbnQoMik7CiAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGludHMubGVuZ3RoIDsgaSsrKQotICAgICAgICAgICAgaW50c1tpXSA9IG5ldyBJbnRlZ2VyKGkpOworICAgICAgICAgICAgaW50c1tpXSA9IEludGVnZXIudmFsdWVPZihpKTsKICAgICB9CiAKICAgICBzdGF0aWMgZmluYWwgVXBkYXRlRnVuY3Rpb248SW50ZWdlciwgSW50ZWdlcj4gdXBkYXRlRiA9IG5ldyBVcGRhdGVGdW5jdGlvbjxJbnRlZ2VyLCBJbnRlZ2VyPigpCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvQWJzdHJhY3RUeXBlQnl0ZVNvdXJjZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9ieXRlY29tcGFyYWJsZS9BYnN0cmFjdFR5cGVCeXRlU291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YjE4N2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvQWJzdHJhY3RUeXBlQnl0ZVNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDEwMTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVGVybTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuRHVyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTGVuZ3RoUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lk11cm11cjNQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZG9tUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5TaW1wbGVEYXRlU2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5UeXBlU2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5VVUlER2VuOworCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIEFic3RyYWN0VHlwZUJ5dGVTb3VyY2VUZXN0Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFMUEhBQkVUID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoxMjM0NTY3ODkwIUAjJCVeJiooKSI7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAidmVyc2lvbj17MH0iKQorICAgIHB1YmxpYyBzdGF0aWMgSXRlcmFibGU8Qnl0ZUNvbXBhcmFibGUuVmVyc2lvbj4gdmVyc2lvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEltbXV0YWJsZUxpc3Qub2YoQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5PU1M1MCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb247CisKKyAgICBwdWJsaWMgQWJzdHJhY3RUeXBlQnl0ZVNvdXJjZVRlc3QoQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUPiB2b2lkIHRlc3RWYWx1ZXNGb3JUeXBlKEFic3RyYWN0VHlwZTxUPiB0eXBlLCBULi4uIHZhbHVlcykKKyAgICB7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKHR5cGUsIEFycmF5cy5hc0xpc3QodmFsdWVzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSA8VD4gdm9pZCB0ZXN0VmFsdWVzRm9yVHlwZShBYnN0cmFjdFR5cGU8VD4gdHlwZSwgTGlzdDxUPiB2YWx1ZXMpCisgICAgeworICAgICAgICBmb3IgKFQgaW5pdGlhbCA6IHZhbHVlcykKKyAgICAgICAgICAgIGRlY29kZUFuZEFzc2VydEVxdWFscyh0eXBlLCBpbml0aWFsKTsKKyAgICAgICAgaWYgKEludGVnZXJUeXBlLmluc3RhbmNlLmVxdWFscyh0eXBlKSkKKyAgICAgICAgICAgIC8vIEludGVnZXJUeXBlIHRlc3RzIGdvIHRocm91Z2ggQSBMT1Qgb2YgdmFsdWVzLCBzbyBzaG9ydCBvZiByYW5kb21seSBwaWNraW5nIHVwIHRvLCBsZXQncyBzYXkgMTAwMAorICAgICAgICAgICAgLy8gdmFsdWVzIHRvIGNvbWJpbmUgd2l0aCwgd2UnZCByYXRoZXIgc2tpcCB0aGUgY29tcGFyaXNvbiB0ZXN0cyBmb3IgdGhlbS4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMuc2l6ZSgpOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IHZhbHVlcy5zaXplKCk7ICsraikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGxlZnQgPSB0eXBlLmRlY29tcG9zZSh2YWx1ZXMuZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHJpZ2h0ID0gdHlwZS5kZWNvbXBvc2UodmFsdWVzLmdldChqKSk7CisgICAgICAgICAgICAgICAgaW50IGNvbXBhcmVCdWZmZXJzID0gSW50ZWdlci5zaWdudW0odHlwZS5jb21wYXJlKGxlZnQsIHJpZ2h0KSk7CisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZSBsZWZ0U291cmNlID0gdHlwZS5hc0NvbXBhcmFibGVCeXRlcyhsZWZ0LmR1cGxpY2F0ZSgpLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlIHJpZ2h0U291cmNlID0gdHlwZS5hc0NvbXBhcmFibGVCeXRlcyhyaWdodC5kdXBsaWNhdGUoKSwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgaW50IGNvbXBhcmVCeXRlcyA9IEludGVnZXIuc2lnbnVtKEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUodiAtPiBsZWZ0U291cmNlLCB2IC0+IHJpZ2h0U291cmNlLCB2ZXJzaW9uKSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhjb21wYXJlQnVmZmVycywgY29tcGFyZUJ5dGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgPFQ+IHZvaWQgdGVzdFZhbHVlc0ZvclR5cGUoQWJzdHJhY3RUeXBlPFQ+IHR5cGUsIFN0cmVhbTxUPiB2YWx1ZXMpCisgICAgeworICAgICAgICB2YWx1ZXMuZm9yRWFjaChpbml0aWFsIC0+IGRlY29kZUFuZEFzc2VydEVxdWFscyh0eXBlLCBpbml0aWFsKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSA8VD4gdm9pZCBkZWNvZGVBbmRBc3NlcnRFcXVhbHMoQWJzdHJhY3RUeXBlPFQ+IHR5cGUsIFQgaW5pdGlhbCkKKyAgICB7CisgICAgICAgIEJ5dGVCdWZmZXIgaW5pdGlhbEJ1ZmZlciA9IHR5cGUuZGVjb21wb3NlKGluaXRpYWwpOworICAgICAgICAvLyBBc3NlcnQgdGhhdCBmcm9tQ29tcGFyYWJsZUJ5dGVzIGRlY29kZXMgY29ycmVjdGx5LgorICAgICAgICBCeXRlU291cmNlLlBlZWthYmxlIHBlZWthYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKHR5cGUuYXNDb21wYXJhYmxlQnl0ZXMoaW5pdGlhbEJ1ZmZlciwgdmVyc2lvbikpOworICAgICAgICBCeXRlQnVmZmVyIGRlY29kZWRCdWZmZXIgPSB0eXBlLmZyb21Db21wYXJhYmxlQnl0ZXMocGVla2FibGVCeXRlcywgdmVyc2lvbik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkZvciAiICsgQnl0ZVNvdXJjZUNvbXBhcmlzb25UZXN0LnNhZmVTdHIoaW5pdGlhbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChpbml0aWFsQnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KGRlY29kZWRCdWZmZXIpKTsKKyAgICAgICAgLy8gQXNzZXJ0IHRoYXQgdGhlIHZhbHVlIGNvbXBvc2VkIGZyb20gZnJvbUNvbXBhcmFibGVCeXRlcyBpcyB0aGUgY29ycmVjdCBvbmUuCisgICAgICAgIHBlZWthYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKHR5cGUuYXNDb21wYXJhYmxlQnl0ZXMoaW5pdGlhbEJ1ZmZlciwgdmVyc2lvbikpOworICAgICAgICBUIGRlY29kZWQgPSB0eXBlLmNvbXBvc2UodHlwZS5mcm9tQ29tcGFyYWJsZUJ5dGVzKHBlZWthYmxlQnl0ZXMsIHZlcnNpb24pKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhpbml0aWFsLCBkZWNvZGVkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmV3UmFuZG9tQWxwaGFudW1lcmljKFJhbmRvbSBwcm5nLCBpbnQgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByYW5kb20gPSBuZXcgU3RyaW5nQnVpbGRlcihsZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKQorICAgICAgICAgICAgcmFuZG9tLmFwcGVuZChBTFBIQUJFVC5jaGFyQXQocHJuZy5uZXh0SW50KEFMUEhBQkVULmxlbmd0aCgpKSkpOworICAgICAgICByZXR1cm4gcmFuZG9tLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNjaWlUeXBlKCkKKyAgICB7CisgICAgICAgIFN0cmluZ1tdIGFzY2lpU3RyaW5ncyA9IG5ldyBTdHJpbmdbXQorICAgICAgICB7CisgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY3ODkwIiwKKyAgICAgICAgICAgICAgICAiIUAjJCVeJiooKSIsCisgICAgICAgIH07CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKEFzY2lpVHlwZS5pbnN0YW5jZSwgYXNjaWlTdHJpbmdzKTsKKworICAgICAgICBSYW5kb20gcHJuZyA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgU3RyZWFtPFN0cmluZz4gYXNjaWlTdHJlYW0gPSBTdHJlYW0uZ2VuZXJhdGUoKCkgLT4gbmV3UmFuZG9tQWxwaGFudW1lcmljKHBybmcsIDEwKSkubGltaXQoMTAwMCk7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKEFzY2lpVHlwZS5pbnN0YW5jZSwgYXNjaWlTdHJlYW0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJvb2xlYW5UeXBlKCkKKyAgICB7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKEJvb2xlYW5UeXBlLmluc3RhbmNlLCBCb29sZWFuLlRSVUUsIEJvb2xlYW4uRkFMU0UsIG51bGwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ5dGVzVHlwZSgpCisgICAgeworICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IGJ5dGVCdWZmZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIFJhbmRvbSBwcm5nID0gbmV3IFJhbmRvbSgpOworICAgICAgICBieXRlW10gYnl0ZUFycmF5OworICAgICAgICBpbnRbXSBhcnJheUxlbmd0aHMgPSBuZXcgaW50W10gezEsIDEwLCAxMDAsIDEwMDB9OworICAgICAgICBmb3IgKGludCBsZW5ndGggOiBhcnJheUxlbmd0aHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVBcnJheSA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcm5nLm5leHRCeXRlcyhieXRlQXJyYXkpOworICAgICAgICAgICAgICAgIGJ5dGVCdWZmZXJzLmFkZChCeXRlQnVmZmVyLndyYXAoYnl0ZUFycmF5KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoQnl0ZXNUeXBlLmluc3RhbmNlLCBieXRlQnVmZmVycy50b0FycmF5KG5ldyBCeXRlQnVmZmVyWzBdKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZVR5cGUoKQorICAgIHsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoQnl0ZVR5cGUuaW5zdGFuY2UsIG5ldyBCeXRlW10geyBudWxsIH0pOworCisgICAgICAgIFN0cmVhbTxCeXRlPiBhbGxCeXRlcyA9IEludFN0cmVhbS5yYW5nZShCeXRlLk1JTl9WQUxVRSwgQnl0ZS5NQVhfVkFMVUUgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwVG9PYmoodmFsdWUgLT4gKGJ5dGUpIHZhbHVlKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoQnl0ZVR5cGUuaW5zdGFuY2UsIGFsbEJ5dGVzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wb3NpdGVUeXBlKCkKKyAgICB7CisgICAgICAgIENvbXBvc2l0ZVR5cGUgY29tcFR5cGUgPSBDb21wb3NpdGVUeXBlLmdldEluc3RhbmNlKFVURjhUeXBlLmluc3RhbmNlLCBUaW1lVVVJRFR5cGUuaW5zdGFuY2UsIEludGVnZXJUeXBlLmluc3RhbmNlKTsKKyAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBieXRlQnVmZmVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBSYW5kb20gcHJuZyA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgLy8gVGVzdCB3aXRoIGNvbXBsZXRlIENvbXBvc2l0ZVR5cGUgcm93cworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHJhbmRvbVN0cmluZyA9IG5ld1JhbmRvbUFscGhhbnVtZXJpYyhwcm5nLCAxMCk7CisgICAgICAgICAgICBUaW1lVVVJRCByYW5kb21VdWlkID0gVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJRCgpOworICAgICAgICAgICAgQmlnSW50ZWdlciByYW5kb21WYXJpbnQgPSBCaWdJbnRlZ2VyLnByb2JhYmxlUHJpbWUoODAsIHBybmcpOworICAgICAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKGNvbXBUeXBlLmRlY29tcG9zZShyYW5kb21TdHJpbmcsIHJhbmRvbVV1aWQsIHJhbmRvbVZhcmludCkpOworICAgICAgICB9CisgICAgICAgIC8vIFRlc3Qgd2l0aCBpbmNvbXBsZXRlIENvbXBvc2l0ZVR5cGUgcm93cywgd2hlcmUgb25seSB0aGUgZmlyc3QgZWxlbWVudCBpcyBwcmVzZW50CisgICAgICAgIEJ5dGVCdWZmZXJbXSBpbmNvbXBsZXRlQ29tcG9zaXRlID0gbmV3IEJ5dGVCdWZmZXJbMV07CisgICAgICAgIGluY29tcGxldGVDb21wb3NpdGVbMF0gPSBVVEY4VHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UobmV3UmFuZG9tQWxwaGFudW1lcmljKHBybmcsIDEwKSk7CisgICAgICAgIGJ5dGVCdWZmZXJzLmFkZChDb21wb3NpdGVUeXBlLmJ1aWxkKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgdHJ1ZSwgaW5jb21wbGV0ZUNvbXBvc2l0ZSkpOworICAgICAgICBieXRlQnVmZmVycy5hZGQoQ29tcG9zaXRlVHlwZS5idWlsZChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIGZhbHNlLCBpbmNvbXBsZXRlQ29tcG9zaXRlKSk7CisgICAgICAgIC8vIC4uLmFuZCB0aGUgbGFzdCBlbmQtb2YtY29tcG9uZW50IGJ5dGUgaXMgbm90IDAuCisgICAgICAgIGJ5dGVCdWZmZXJzLmFkZChDb21wb3NpdGVUeXBlLmJ1aWxkKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgdHJ1ZSwgaW5jb21wbGV0ZUNvbXBvc2l0ZSwgKGJ5dGUpIDEpKTsKKyAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBmYWxzZSwgaW5jb21wbGV0ZUNvbXBvc2l0ZSwgKGJ5dGUpIDEpKTsKKyAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCB0cnVlLCBpbmNvbXBsZXRlQ29tcG9zaXRlLCAoYnl0ZSkgLTEpKTsKKyAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBmYWxzZSwgaW5jb21wbGV0ZUNvbXBvc2l0ZSwgKGJ5dGUpIC0xKSk7CisgICAgICAgIC8vIFRlc3Qgd2l0aCBpbmNvbXBsZXRlIENvbXBvc2l0ZVR5cGUgcm93cywgd2hlcmUgb25seSB0aGUgbGFzdCBlbGVtZW50IGlzIG5vdCBwcmVzZW50CisgICAgICAgIGluY29tcGxldGVDb21wb3NpdGUgPSBuZXcgQnl0ZUJ1ZmZlclsyXTsKKyAgICAgICAgaW5jb21wbGV0ZUNvbXBvc2l0ZVswXSA9IFVURjhUeXBlLmluc3RhbmNlLmRlY29tcG9zZShuZXdSYW5kb21BbHBoYW51bWVyaWMocHJuZywgMTApKTsKKyAgICAgICAgaW5jb21wbGV0ZUNvbXBvc2l0ZVsxXSA9IFRpbWVVVUlEVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJRCgpKTsKKyAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCB0cnVlLCBpbmNvbXBsZXRlQ29tcG9zaXRlKSk7CisgICAgICAgIGJ5dGVCdWZmZXJzLmFkZChDb21wb3NpdGVUeXBlLmJ1aWxkKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgZmFsc2UsIGluY29tcGxldGVDb21wb3NpdGUpKTsKKyAgICAgICAgLy8gLi4uYW5kIHRoZSBsYXN0IGVuZC1vZi1jb21wb25lbnQgYnl0ZSBpcyBub3QgMC4KKyAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCB0cnVlLCBpbmNvbXBsZXRlQ29tcG9zaXRlLCAoYnl0ZSkgMSkpOworICAgICAgICBieXRlQnVmZmVycy5hZGQoQ29tcG9zaXRlVHlwZS5idWlsZChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIGZhbHNlLCBpbmNvbXBsZXRlQ29tcG9zaXRlLCAoYnl0ZSkgMSkpOworICAgICAgICBieXRlQnVmZmVycy5hZGQoQ29tcG9zaXRlVHlwZS5idWlsZChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIHRydWUsIGluY29tcGxldGVDb21wb3NpdGUsIChieXRlKSAtMSkpOworICAgICAgICBieXRlQnVmZmVycy5hZGQoQ29tcG9zaXRlVHlwZS5idWlsZChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIGZhbHNlLCBpbmNvbXBsZXRlQ29tcG9zaXRlLCAoYnl0ZSkgLTEpKTsKKworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShjb21wVHlwZSwgYnl0ZUJ1ZmZlcnMudG9BcnJheShuZXcgQnl0ZUJ1ZmZlclswXSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERhdGVUeXBlKCkKKyAgICB7CisgICAgICAgIFN0cmVhbTxEYXRlPiBkYXRlcyA9IFN0cmVhbS5vZihudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoTG9uZy5NSU5fVkFMVUUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoTG9uZy5NQVhfVkFMVUUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoKSk7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKERhdGVUeXBlLmluc3RhbmNlLCBkYXRlcyk7CisKKyAgICAgICAgZGF0ZXMgPSBuZXcgUmFuZG9tKCkubG9uZ3MoMTAwMCkubWFwVG9PYmooRGF0ZTo6bmV3KTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoRGF0ZVR5cGUuaW5zdGFuY2UsIGRhdGVzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWNpbWFsVHlwZSgpCisgICAgeworICAgICAgICAvLyBXZSB3b24ndCBiZSB1c2luZyB0ZXN0VmFsdWVzRm9yVHlwZSBmb3IgRGVjaW1hbFR5cGUgKGkuZS4gd2Ugd29uJ3QgYWxzbyBiZSBjb21wYXJpbmcgdGhlIGluaXRpYWwgYW5kIGRlY29kZWQKKyAgICAgICAgLy8gQnl0ZUJ1ZmZlciB2YWx1ZXMpLiBUaGF0J3MgYmVjYXVzZSB0aGUgc2FtZSBCaWdEZWNpbWFsIHZhbHVlIGNhbiBiZSByZXByZXNlbnRlZCB3aXRoIGEgY291cGxlIG9mIGRpZmZlcmVudCwKKyAgICAgICAgLy8gZXZlbiBpZiBlcXVpdmFsZW50IHBhaXJzIG9mIDxtYW50aXNzYSwgc2NhbGU+IChlLmcuIDAuMSBpcyAxICogZS0xLCBhcyB3ZWxsIGFzIDEwICogZS0yLCBhcyB3ZWxsIGFzLi4uKS4KKyAgICAgICAgLy8gQW5kIGluIHByYWN0aWNlIGl0J3MgZWFzaWVyIHRvIGp1c3QgY29udmVydCB0byBCaWdEZWNpbWFscyBhbmQgdGhlbiBjb21wYXJlLCBpbnN0ZWFkIG9mIHRyeWluZyB0byBtYW51YWxseQorICAgICAgICAvLyBkZWNvZGUgYW5kIGNvbnZlcnQgdG8gY2Fub25pY2FsIHJlcHJlc2VudGF0aW9ucywgd2hpY2ggdGhlbiB0byBjb21wYXJlLiBGb3IgZXhhbXBsZSBvZiBnZW5lcmF0aW5nIGNhbm9uaWNhbAorICAgICAgICAvLyBkZWNpbWFscyBpbiB0aGUgZmlyc3QgcGxhY2UsIHNlZSB0ZXN0UmV2ZXJzZWRUeXBlKCkuCisgICAgICAgIENvbnN1bWVyPEJpZ0RlY2ltYWw+IGJpZ0RlY2ltYWxDb25zdW1lciA9IGluaXRpYWwgLT4KKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZVNvdXJjZSBieXRlU291cmNlID0gRGVjaW1hbFR5cGUuaW5zdGFuY2UuYXNDb21wYXJhYmxlQnl0ZXMoRGVjaW1hbFR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKGluaXRpYWwpLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIEJpZ0RlY2ltYWwgZGVjb2RlZCA9IERlY2ltYWxUeXBlLmluc3RhbmNlLmNvbXBvc2UoRGVjaW1hbFR5cGUuaW5zdGFuY2UuZnJvbUNvbXBhcmFibGVCeXRlcyhCeXRlU291cmNlLnBlZWthYmxlKGJ5dGVTb3VyY2UpLCB2ZXJzaW9uKSk7CisgICAgICAgICAgICBpZiAoaW5pdGlhbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnROdWxsKGRlY29kZWQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgaW5pdGlhbC5jb21wYXJlVG8oZGVjb2RlZCkpOworICAgICAgICB9OworICAgICAgICAvLyBUZXN0IHNvbWUgaW50ZXJlc3RpbmcgcHJlZGVmaW5lZCBCaWdEZWNpbWFsIHZhbHVlcy4KKyAgICAgICAgU3RyZWFtLm9mKG51bGwsCisgICAgICAgICAgICAgICAgICBCaWdEZWNpbWFsLlpFUk8sCisgICAgICAgICAgICAgICAgICBCaWdEZWNpbWFsLk9ORSwKKyAgICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwuT05FLmFkZChCaWdEZWNpbWFsLk9ORSksCisgICAgICAgICAgICAgICAgICBCaWdEZWNpbWFsLlRFTiwKKyAgICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwudmFsdWVPZigwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEpLAorICAgICAgICAgICAgICAgICAgQmlnRGVjaW1hbC52YWx1ZU9mKC0wLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEpLAorICAgICAgICAgICAgICAgICAgQmlnRGVjaW1hbC52YWx1ZU9mKDAuMDAwMDAwMDAwMDAwMDAwMTIzNDU2Nzg5MTAxMTEyMTMxNCksCisgICAgICAgICAgICAgICAgICBCaWdEZWNpbWFsLnZhbHVlT2YoLTAuMDAwMDAwMDAwMDAwMDAwMTIzNDU2Nzg5MTAxMTEyMTMxNCksCisgICAgICAgICAgICAgICAgICBCaWdEZWNpbWFsLnZhbHVlT2YoMTIzNDU2Nzg5MTAxMTEyMTMuMTQxNTE2MTcxODE5MjAyMTIyKSwKKyAgICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwudmFsdWVPZigtMTIzNDU2Nzg5MTAxMTEyMTMuMTQxNTE2MTcxODE5MjAyMTIyKSwKKyAgICAgICAgICAgICAgICAgIG5ldyBCaWdEZWNpbWFsKEJpZ0ludGVnZXIuVEVOLCBJbnRlZ2VyLk1JTl9WQUxVRSksCisgICAgICAgICAgICAgICAgICBuZXcgQmlnRGVjaW1hbChCaWdJbnRlZ2VyLlRFTi5uZWdhdGUoKSwgSW50ZWdlci5NSU5fVkFMVUUpLAorICAgICAgICAgICAgICAgICAgbmV3IEJpZ0RlY2ltYWwoQmlnSW50ZWdlci5URU4sIEludGVnZXIuTUFYX1ZBTFVFKSwKKyAgICAgICAgICAgICAgICAgIG5ldyBCaWdEZWNpbWFsKEJpZ0ludGVnZXIuVEVOLm5lZ2F0ZSgpLCBJbnRlZ2VyLk1BWF9WQUxVRSksCisgICAgICAgICAgICAgICAgICBuZXcgQmlnRGVjaW1hbChCaWdJbnRlZ2VyLlRFTi5wb3coMTAwMCksIEludGVnZXIuTUlOX1ZBTFVFKSwKKyAgICAgICAgICAgICAgICAgIG5ldyBCaWdEZWNpbWFsKEJpZ0ludGVnZXIuVEVOLnBvdygxMDAwKS5uZWdhdGUoKSwgSW50ZWdlci5NSU5fVkFMVUUpLAorICAgICAgICAgICAgICAgICAgbmV3IEJpZ0RlY2ltYWwoQmlnSW50ZWdlci5URU4ucG93KDEwMDApLCBJbnRlZ2VyLk1BWF9WQUxVRSksCisgICAgICAgICAgICAgICAgICBuZXcgQmlnRGVjaW1hbChCaWdJbnRlZ2VyLlRFTi5wb3coMTAwMCkubmVnYXRlKCksIEludGVnZXIuTUFYX1ZBTFVFKSkKKyAgICAgICAgICAgICAgLmZvckVhY2goYmlnRGVjaW1hbENvbnN1bWVyKTsKKyAgICAgICAgLy8gVGVzdCBCaWdEZWNpbWFscyBjcmVhdGVkIGZyb20gcmFuZG9tIGRvdWJsZSB2YWx1ZXMgd2l0aCBwcmVkZWZpbmVkIHJhbmdlIG1vZGlmaWVycy4KKyAgICAgICAgZG91YmxlW10gYm91bmRzID0geworICAgICAgICAgICAgICAgIERvdWJsZS5NSU5fVkFMVUUsCisgICAgICAgICAgICAgICAgLTFfMDAwXzAwMF8wMDAuMCwKKyAgICAgICAgICAgICAgICAtMTAwXzAwMC4wLAorICAgICAgICAgICAgICAgIC0xLjAsCisgICAgICAgICAgICAgICAgMS4wLAorICAgICAgICAgICAgICAgIDEwMF8wMDAuMCwKKyAgICAgICAgICAgICAgICAxXzAwMF8wMDBfMDAwLjAsCisgICAgICAgICAgICAgICAgRG91YmxlLk1BWF9WQUxVRX07CisgICAgICAgIGZvciAoZG91YmxlIGJvdW5kIDogYm91bmRzKQorICAgICAgICB7CisgICAgICAgICAgICBuZXcgUmFuZG9tKCkuZG91YmxlcygxMDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgLm1hcFRvT2JqKGluaXRpYWwgLT4gQmlnRGVjaW1hbC52YWx1ZU9mKGluaXRpYWwgKiBib3VuZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChiaWdEZWNpbWFsQ29uc3VtZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVHlwZSgpCisgICAgeworICAgICAgICBTdHJlYW08RG91YmxlPiBkb3VibGVzID0gU3RyZWFtLm9mKG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG91YmxlLk5hTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG91YmxlLk5FR0FUSVZFX0lORklOSVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvdWJsZS5NQVhfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG91YmxlLk1JTl9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArMC4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKzEuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsxMjM0NTY3ODkxMC4xMTEyMTMxNDE1MTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEyMzQ1Njc4OTEwLjExMTIxMzE0MTUxNik7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKERvdWJsZVR5cGUuaW5zdGFuY2UsIGRvdWJsZXMpOworCisgICAgICAgIGRvdWJsZXMgPSBuZXcgUmFuZG9tKCkuZG91YmxlcygxMDAwKS5ib3hlZCgpOworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShEb3VibGVUeXBlLmluc3RhbmNlLCBkb3VibGVzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REdXJhdGlvblR5cGUoKQorICAgIHsKKyAgICAgICAgUmFuZG9tIHBybmcgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgIFN0cmVhbTxEdXJhdGlvbj4gcG9zRHVyYXRpb25zID0gU3RyZWFtLmdlbmVyYXRlKCgpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb250aHMgPSBwcm5nLm5leHRJbnQoMTIpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkYXlzID0gcHJuZy5uZXh0SW50KDI4KSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIG5hbm9zID0gKE1hdGguYWJzKHBybmcubmV4dExvbmcoKSAlIDg2XzQwMF8wMDBfMDAwXzAwMEwpKSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRHVyYXRpb24ubmV3SW5zdGFuY2UobW9udGhzLCBkYXlzLCBuYW5vcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxpbWl0KDEwMDApOworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShEdXJhdGlvblR5cGUuaW5zdGFuY2UsIHBvc0R1cmF0aW9ucyk7CisgICAgICAgIFN0cmVhbTxEdXJhdGlvbj4gbmVnRHVyYXRpb25zID0gU3RyZWFtLmdlbmVyYXRlKCgpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb250aHMgPSBwcm5nLm5leHRJbnQoMTIpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkYXlzID0gcHJuZy5uZXh0SW50KDI4KSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIG5hbm9zID0gKE1hdGguYWJzKHBybmcubmV4dExvbmcoKSAlIDg2XzQwMF8wMDBfMDAwXzAwMEwpKSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRHVyYXRpb24ubmV3SW5zdGFuY2UoLW1vbnRocywgLWRheXMsIC1uYW5vcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxpbWl0KDEwMDApOworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShEdXJhdGlvblR5cGUuaW5zdGFuY2UsIG5lZ0R1cmF0aW9ucyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY0NvbXBvc2l0ZVR5cGUoKQorICAgIHsKKyAgICAgICAgRHluYW1pY0NvbXBvc2l0ZVR5cGUgZHluYW1pY0NvbXBUeXBlID0gRHluYW1pY0NvbXBvc2l0ZVR5cGUuZ2V0SW5zdGFuY2UobmV3IEhhc2hNYXA8PigpKTsKKyAgICAgICAgSW1tdXRhYmxlTGlzdDxTdHJpbmc+IGFsbFR5cGVzID0gSW1tdXRhYmxlTGlzdC5vZigib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlc1R5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlRpbWVVVUlEVHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50ZWdlclR5cGUiKTsKKyAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBhbGxWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBieXRlQnVmZmVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBSYW5kb20gcHJuZyA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgcmFuZG9tU3RyaW5nID0gbmV3UmFuZG9tQWxwaGFudW1lcmljKHBybmcsIDEwKTsKKyAgICAgICAgICAgIGFsbFZhbHVlcy5hZGQoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMocmFuZG9tU3RyaW5nKSk7CisgICAgICAgICAgICBVVUlEIHJhbmRvbVV1aWQgPSBUaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVBc1VVSUQoKTsKKyAgICAgICAgICAgIGFsbFZhbHVlcy5hZGQoQnl0ZUJ1ZmZlci53cmFwKFVVSURHZW4uZGVjb21wb3NlKHJhbmRvbVV1aWQpKSk7CisgICAgICAgICAgICBieXRlIHJhbmRvbUJ5dGUgPSAoYnl0ZSkgcHJuZy5uZXh0SW50KCk7CisgICAgICAgICAgICBhbGxWYWx1ZXMuYWRkKEJ5dGVCdWZmZXIuYWxsb2NhdGUoMSkucHV0KHJhbmRvbUJ5dGUpKTsKKworICAgICAgICAgICAgLy8gVGhyZWUtY29tcG9uZW50IGtleSB3aXRoIGFsaWFzZWQgYW5kIG5vbi1hbGlhc2VkIHR5cGVzIGFuZCBlbmQtb2YtY29tcG9uZW50IGJ5dGUgdmFyeWluZyAoMCwgMSwgLTEpLgorICAgICAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKER5bmFtaWNDb21wb3NpdGVUeXBlLmJ1aWxkKGFsbFR5cGVzLCBhbGxWYWx1ZXMpKTsKKyAgICAgICAgICAgIGJ5dGVCdWZmZXJzLmFkZChjcmVhdGVTdHJpbmdVdWlkVmFyaW50RHluYW1pY0NvbXBvc2l0ZUtleShyYW5kb21TdHJpbmcsIHJhbmRvbVV1aWQsIHJhbmRvbUJ5dGUsIChieXRlKSAxKSk7CisgICAgICAgICAgICBieXRlQnVmZmVycy5hZGQoY3JlYXRlU3RyaW5nVXVpZFZhcmludER5bmFtaWNDb21wb3NpdGVLZXkocmFuZG9tU3RyaW5nLCByYW5kb21VdWlkLCByYW5kb21CeXRlLCAoYnl0ZSkgLTEpKTsKKworICAgICAgICAgICAgLy8gVHdvLWNvbXBvbmVudCBrZXkgd2l0aCBhbGlhc2VkIGFuZCBub24tYWxpYXNlZCB0eXBlcyBhbmQgZW5kLW9mLWNvbXBvbmVudCBieXRlIHZhcnlpbmcgKDAsIDEsIC0xKS4KKyAgICAgICAgICAgIGJ5dGVCdWZmZXJzLmFkZChEeW5hbWljQ29tcG9zaXRlVHlwZS5idWlsZChhbGxUeXBlcy5zdWJMaXN0KDAsIDIpLCBhbGxWYWx1ZXMuc3ViTGlzdCgwLCAyKSkpOworICAgICAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKGNyZWF0ZVN0cmluZ1V1aWRWYXJpbnREeW5hbWljQ29tcG9zaXRlS2V5KHJhbmRvbVN0cmluZywgcmFuZG9tVXVpZCwgLTEsIChieXRlKSAxKSk7CisgICAgICAgICAgICBieXRlQnVmZmVycy5hZGQoY3JlYXRlU3RyaW5nVXVpZFZhcmludER5bmFtaWNDb21wb3NpdGVLZXkocmFuZG9tU3RyaW5nLCByYW5kb21VdWlkLCAtMSwgKGJ5dGUpIC0xKSk7CisKKyAgICAgICAgICAgIC8vIE9uZS1jb21wb25lbnQga2V5IHdpdGggYWxpYXNlZCBhbmQgbm9uLWFsaWFzZWQgdHlwZSBhbmQgZW5kLW9mLWNvbXBvbmVudCBieXRlIHZhcnlpbmcgKDAsIDEsIC0xKS4KKyAgICAgICAgICAgIGJ5dGVCdWZmZXJzLmFkZChEeW5hbWljQ29tcG9zaXRlVHlwZS5idWlsZChhbGxUeXBlcy5zdWJMaXN0KDAsIDEpLCBhbGxWYWx1ZXMuc3ViTGlzdCgwLCAxKSkpOworICAgICAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKGNyZWF0ZVN0cmluZ1V1aWRWYXJpbnREeW5hbWljQ29tcG9zaXRlS2V5KHJhbmRvbVN0cmluZywgbnVsbCwgLTEsIChieXRlKSAxKSk7CisgICAgICAgICAgICBieXRlQnVmZmVycy5hZGQoY3JlYXRlU3RyaW5nVXVpZFZhcmludER5bmFtaWNDb21wb3NpdGVLZXkocmFuZG9tU3RyaW5nLCBudWxsLCAtMSwgKGJ5dGUpIC0xKSk7CisKKyAgICAgICAgICAgIGFsbFZhbHVlcy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKGR5bmFtaWNDb21wVHlwZSwgYnl0ZUJ1ZmZlcnMudG9BcnJheShuZXcgQnl0ZUJ1ZmZlclswXSkpOworICAgIH0KKworICAgIC8vIFNpbWlsYXIgdG8gRHluYW1pY0NvbXBvc2l0ZVR5cGVUZXN0LmNyZWF0ZUR5bmFtaWNDb21wb3NpdGVLZXkoc3RyaW5nLCB1dWlkLCBpLCB0cnVlLCBmYWxzZSksIGJ1dCBub3QgdXNpbmcgYW55CisgICAgLy8gYWxpYXNlZCB0eXBlcywgaW4gb3JkZXIgdG8gZG8gYW4gZXhhY3QgY29tcGFyaXNvbiBvZiB0aGUgdW5tYXJzaGFsbGVkIER5bmFtaWNDb21wb3NpdGVUeXBlIHBheWxvYWQgd2l0aCB0aGUKKyAgICAvLyBpbnB1dCBvbmUuIElmIGFsaWFzZWQgdHlwZXMgYXJlIHVzZWQsIGR1ZSB0byBEeW5hbWljQ29tcG9zaXRlVHlwZS5idWlsZChMaXN0PFN0cmluZz4sIExpc3Q8Qnl0ZUJ1ZmZlcj4pCisgICAgLy8gYWx3YXlzIGluY2x1ZGluZyB0aGUgZnVsbCB0eXBlIGluZm8gaW4gdGhlIG5ld2x5IGNvbnN0cnVjdGVkIHBheWxvYWQsIGFuIGV4YWN0IGNvbXBhcmlzb24gd29uJ3Qgd29yay4KKyAgICBwcml2YXRlIHN0YXRpYyBCeXRlQnVmZmVyIGNyZWF0ZVN0cmluZ1V1aWRWYXJpbnREeW5hbWljQ29tcG9zaXRlS2V5KFN0cmluZyBzdHJpbmcsIFVVSUQgdXVpZCwgaW50IGksIGJ5dGUgbGFzdEVvY0J5dGUpCisgICAgeworICAgICAgICAvLyAxLiBDYWxjdWxhdGUgaG93IG1hbnkgYnl0ZXMgZG8gd2UgbmVlZCBmb3IgYSBrZXkgb2YgdGhpcyBEeW5hbWljQ29tcG9zaXRlVHlwZQorICAgICAgICBTdHJpbmcgYnl0ZXNUeXBlID0gIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZXNUeXBlIjsKKyAgICAgICAgU3RyaW5nIHRpbWVVdWlkVHlwZSA9ICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlRpbWVVVUlEVHlwZSI7CisgICAgICAgIFN0cmluZyB2YXJpbnRUeXBlID0gIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50ZWdlclR5cGUiOworICAgICAgICBCeXRlQnVmZmVyIGJ5dGVzID0gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoc3RyaW5nKTsKKyAgICAgICAgaW50IHRvdGFsU2l6ZSA9IDA7CisgICAgICAgIC8vIFRha2UgaW50byBhY2NvdW50IHRoZSBzdHJpbmcgY29tcG9uZW50IGRhdGEgKEJ5dGVzVHlwZSBpcyBhbGlhc2VkKQorICAgICAgICB0b3RhbFNpemUgKz0gMiArIGJ5dGVzVHlwZS5sZW5ndGgoKSArIDIgKyBieXRlcy5yZW1haW5pbmcoKSArIDE7CisgICAgICAgIGlmICh1dWlkICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRha2UgaW50byBhY2NvdW50IHRoZSBVVUlEIGNvbXBvbmVudCBkYXRhIChUaW1lVVVJRFR5cGUgaXMgYWxpYXNlZCkKKyAgICAgICAgICAgIHRvdGFsU2l6ZSArPSAyICsgdGltZVV1aWRUeXBlLmxlbmd0aCgpICsgMiArIDE2ICsgMTsKKyAgICAgICAgICAgIGlmIChpICE9IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFRha2UgaW50byBhY2NvdW50IHRoZSB2YXJpbnQgY29tcG9uZW50IGRhdGEgKEludGVnZXJUeXBlIGlzIF9ub3RfIGFsaWFzZWQpLgorICAgICAgICAgICAgICAgIC8vIE5vdGljZSB0aGF0IHdlIGFjY291bnQgZm9yIGEgc2luZ2xlIGJ5dGUgb2YgdmFyaW50IGRhdGEsIHNvIHdlJ2xsIGRvd25jYXN0IHRoZSBpbnQgcGF5bG9hZAorICAgICAgICAgICAgICAgIC8vIHRvIGJ5dGUgYW5kIHVzZSBvbmx5IHRoYXQgYXMgdGhlIGFjdHVhbCB2YXJpbnQgcGF5bG9hZC4KKyAgICAgICAgICAgICAgICB0b3RhbFNpemUgKz0gMiArIHZhcmludFR5cGUubGVuZ3RoKCkgKyAyICsgMSArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyAyLiBBbGxvY2F0ZSBhIGJ1ZmZlciB3aXRoIHRoYXQgbWFueSBieXRlcworICAgICAgICBCeXRlQnVmZmVyIGJiID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSh0b3RhbFNpemUpOworCisgICAgICAgIC8vIDMuIFdyaXRlIHRoZSBrZXkgZGF0YSBmb3IgZWFjaCBjb21wb25lbnQgaW4gdGhlIGFsbG9jYXRlZCBidWZmZXIKKyAgICAgICAgYmIucHV0U2hvcnQoKHNob3J0KSBieXRlc1R5cGUubGVuZ3RoKCkpOworICAgICAgICBiYi5wdXQoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoYnl0ZXNUeXBlKSk7CisgICAgICAgIGJiLnB1dFNob3J0KChzaG9ydCkgYnl0ZXMucmVtYWluaW5nKCkpOworICAgICAgICBiYi5wdXQoYnl0ZXMpOworICAgICAgICAvLyBNYWtlIHRoZSBlbmQtb2YtY29tcG9uZW50IGJ5dGUgMSBpZiByZXF1ZXN0ZWQgYW5kIHRoZSB0aW1lLVVVSUQgY29tcG9uZW50IGlzIG51bGwuCisgICAgICAgIGJiLnB1dCh1dWlkID09IG51bGwgPyBsYXN0RW9jQnl0ZSA6IChieXRlKSAwKTsKKyAgICAgICAgaWYgKHV1aWQgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgYmIucHV0U2hvcnQoKHNob3J0KSB0aW1lVXVpZFR5cGUubGVuZ3RoKCkpOworICAgICAgICAgICAgYmIucHV0KEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKHRpbWVVdWlkVHlwZSkpOworICAgICAgICAgICAgYmIucHV0U2hvcnQoKHNob3J0KSAxNik7CisgICAgICAgICAgICBiYi5wdXQoVVVJREdlbi5kZWNvbXBvc2UodXVpZCkpOworICAgICAgICAgICAgLy8gU2V0IHRoZSBlbmQtb2YtY29tcG9uZW50IGJ5dGUgaWYgcmVxdWVzdGVkIGFuZCB0aGUgdmFyaW50IGNvbXBvbmVudCBpcyBudWxsLgorICAgICAgICAgICAgYmIucHV0KGkgPT0gLTEgPyBsYXN0RW9jQnl0ZSA6IChieXRlKSAwKTsKKyAgICAgICAgICAgIGlmIChpICE9IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJiLnB1dFNob3J0KChzaG9ydCkgdmFyaW50VHlwZS5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgYmIucHV0KEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKHZhcmludFR5cGUpKTsKKyAgICAgICAgICAgICAgICBiYi5wdXRTaG9ydCgoc2hvcnQpIDEpOworICAgICAgICAgICAgICAgIGJiLnB1dCgoYnl0ZSkgaSk7CisgICAgICAgICAgICAgICAgYmIucHV0KGxhc3RFb2NCeXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBiYi5yZXdpbmQoKTsKKyAgICAgICAgcmV0dXJuIGJiOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZsb2F0VHlwZSgpCisgICAgeworICAgICAgICBTdHJlYW08RmxvYXQ+IGZsb2F0cyA9IFN0cmVhbS5vZihudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG9hdC5OYU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb2F0LlBPU0lUSVZFX0lORklOSVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG9hdC5ORUdBVElWRV9JTkZJTklUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvYXQuTUFYX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG9hdC5NSU5fVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICswLjBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKzEuMEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArMTIzNDU2Ljc4OTEwMTFGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTIzNDU2Ljc4OTEwMTFGKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoRmxvYXRUeXBlLmluc3RhbmNlLCBmbG9hdHMpOworCisgICAgICAgIGZsb2F0cyA9IG5ldyBSYW5kb20oKS5pbnRzKDEwMDApLm1hcFRvT2JqKEZsb2F0OjppbnRCaXRzVG9GbG9hdCk7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKEZsb2F0VHlwZS5pbnN0YW5jZSwgZmxvYXRzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmV0QWRkcmVzc1R5cGUoKSB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0cmVhbTxJbmV0QWRkcmVzcz4gaW5ldEFkZHJlc3NlcyA9IFN0cmVhbS5vZihudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRMb29wYmFja0FkZHJlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzLmdldEJ5TmFtZSgiMC4wLjAuMCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCIxMC4wLjAuMSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCIxNzIuMTYuMS4xIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoIjE5Mi4xNjguMi4yIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoIjIyNC4zLjMuMyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCIyNTUuMjU1LjI1NS4yNTUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzLmdldEJ5TmFtZSgiMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoImZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCJmZTgwOjE6MjM6NDU2Ojc4OTA6MToyMzo0NTYiKSk7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKEluZXRBZGRyZXNzVHlwZS5pbnN0YW5jZSwgaW5ldEFkZHJlc3Nlcyk7CisKKyAgICAgICAgUmFuZG9tIHBybmcgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgIGJ5dGVbXSBpcHY0Qnl0ZXMgPSBuZXcgYnl0ZVs0XTsKKyAgICAgICAgYnl0ZVtdIGlwdjZCeXRlcyA9IG5ldyBieXRlWzE2XTsKKyAgICAgICAgSW5ldEFkZHJlc3NbXSBhZGRyZXNzZXMgPSBuZXcgSW5ldEFkZHJlc3NbMjAwMF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRkcmVzc2VzLmxlbmd0aCAvIDI7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgcHJuZy5uZXh0Qnl0ZXMoaXB2NEJ5dGVzKTsKKyAgICAgICAgICAgIGFkZHJlc3Nlc1syICogaV0gPSBJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoaXB2NEJ5dGVzKTsKKyAgICAgICAgICAgIGFkZHJlc3Nlc1syICogaSArIDFdID0gSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGlwdjZCeXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoSW5ldEFkZHJlc3NUeXBlLmluc3RhbmNlLCBhZGRyZXNzZXMpOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50MzJUeXBlKCkKKyAgICB7CisgICAgICAgIFN0cmVhbTxJbnRlZ2VyPiBpbnRzID0gU3RyZWFtLm9mKG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIuTUlOX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLk1JTl9WQUxVRSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNTYsIC0yNTUsIC0xMjgsIC0xMjcsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAxMjcsIDEyOCwgMjU1LCAyNTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIuTUFYX1ZBTFVFIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5NQVhfVkFMVUUpOworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShJbnQzMlR5cGUuaW5zdGFuY2UsIGludHMpOworCisgICAgICAgIGludHMgPSBuZXcgUmFuZG9tKCkuaW50cygxMDAwKS5ib3hlZCgpOworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShJbnQzMlR5cGUuaW5zdGFuY2UsIGludHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludGVnZXJUeXBlKCkKKyAgICB7CisgICAgICAgIFN0cmVhbTxCaWdJbnRlZ2VyPiB2YXJpbnRzID0gSW50U3RyZWFtLnJhbmdlKC0xMDAwMDAwLCAxMDAwMDAwKS5tYXBUb09iaihCaWdJbnRlZ2VyOjp2YWx1ZU9mKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoSW50ZWdlclR5cGUuaW5zdGFuY2UsIHZhcmludHMpOworCisgICAgICAgIHZhcmludHMgPSBTdHJlYW0ub2YobnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoMTIzNDU2Nzg5MTAxMTEyMTNMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoMTIzNDU2Nzg5MTAxMTEyMTNMKS5uZWdhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoTG9uZy5NQVhfVkFMVUUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZihMb25nLk1BWF9WQUxVRSkubmVnYXRlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKExvbmcuTUFYX1ZBTFVFIC0gMSkubXVsdGlwbHkoQmlnSW50ZWdlci52YWx1ZU9mKExvbmcuTUFYX1ZBTFVFIC0gMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZihMb25nLk1BWF9WQUxVRSAtIDEpLm11bHRpcGx5KEJpZ0ludGVnZXIudmFsdWVPZihMb25nLk1BWF9WQUxVRSAtIDEpKS5uZWdhdGUoKSk7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKEludGVnZXJUeXBlLmluc3RhbmNlLCB2YXJpbnRzKTsKKworICAgICAgICBMaXN0PEJpZ0ludGVnZXI+IHZhcmludExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBCaWdJbnRlZ2VyIGluaXRpYWwgPSBCaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQoaSk7CisgICAgICAgICAgICB2YXJpbnRMaXN0LmFkZChpbml0aWFsKTsKKyAgICAgICAgICAgIEJpZ0ludGVnZXIgcGx1c09uZSA9IGluaXRpYWwuYWRkKEJpZ0ludGVnZXIuT05FKTsKKyAgICAgICAgICAgIHZhcmludExpc3QuYWRkKHBsdXNPbmUpOworICAgICAgICAgICAgdmFyaW50TGlzdC5hZGQocGx1c09uZS5uZWdhdGUoKSk7CisgICAgICAgICAgICBCaWdJbnRlZ2VyIG1pbnVzT25lID0gaW5pdGlhbC5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7CisgICAgICAgICAgICB2YXJpbnRMaXN0LmFkZChtaW51c09uZSk7CisgICAgICAgICAgICB2YXJpbnRMaXN0LmFkZChtaW51c09uZS5uZWdhdGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoSW50ZWdlclR5cGUuaW5zdGFuY2UsIHZhcmludExpc3QudG9BcnJheShuZXcgQmlnSW50ZWdlclswXSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFV1aWRUeXBlcygpCisgICAgeworICAgICAgICBSYW5kb20gcHJuZyA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgVVVJRFtdIHRlc3RVdWlkcyA9IG5ldyBVVUlEWzMwMDFdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RVdWlkcy5sZW5ndGggLyAzOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlc3RVdWlkc1szICogaV0gPSBVVUlELnJhbmRvbVVVSUQoKTsKKyAgICAgICAgICAgIHRlc3RVdWlkc1szICogaSArIDFdID0gVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lQXNVVUlEKCk7CisgICAgICAgICAgICB0ZXN0VXVpZHNbMyAqIGkgKyAyXSA9IFRpbWVVVUlELmF0VW5peE1pY3Jvc1dpdGhMc2JBc1VVSUQocHJuZy5uZXh0TG9uZygpLCBwcm5nLm5leHRMb25nKCkpOworICAgICAgICB9CisgICAgICAgIHRlc3RVdWlkc1t0ZXN0VXVpZHMubGVuZ3RoIC0gMV0gPSBudWxsOworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShVVUlEVHlwZS5pbnN0YW5jZSwgdGVzdFV1aWRzKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoTGV4aWNhbFVVSURUeXBlLmluc3RhbmNlLCB0ZXN0VXVpZHMpOworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShUaW1lVVVJRFR5cGUuaW5zdGFuY2UsIEFycmF5cy5zdHJlYW0odGVzdFV1aWRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIodSAtPiB1ID09IG51bGwgfHwgdS52ZXJzaW9uKCkgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKHUgLT4gdSAhPSBudWxsID8gVGltZVVVSUQuZnJvbVV1aWQodSkgOiBudWxsKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgPEUsIEMgZXh0ZW5kcyBDb2xsZWN0aW9uPEU+PiBMaXN0PEM+IG5ld1JhbmRvbUVsZW1lbnRDb2xsZWN0aW9ucyhTdXBwbGllcjw/IGV4dGVuZHMgQz4gY29sbGVjdGlvblByb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VwcGxpZXI8PyBleHRlbmRzIEU+IGVsZW1lbnRQcm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1Db2xsZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1FbGVtZW50c0luQ29sbGVjdGlvbikKKyAgICB7CisgICAgICAgIExpc3Q8Qz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sbGVjdGlvbnM7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgQyBjb2xsID0gY29sbGVjdGlvblByb2R1Y2VyLmdldCgpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudW1FbGVtZW50c0luQ29sbGVjdGlvbjsgKytqKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbGwuYWRkKGVsZW1lbnRQcm9kdWNlci5nZXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQuYWRkKGNvbGwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdFR5cGUoKQorICAgIHsKKyAgICAgICAgLy8gVGVzdCBsaXN0cyB3aXRoIGVsZW1lbnQgY29tcG9uZW50cyBub3QgaGF2aW5nIGtub3duL2NvbXB1dGFibGUgbGVuZ3RoIChlLmcuIHN0cmluZ3MpLgorICAgICAgICBSYW5kb20gcHJuZyA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgTGlzdDxMaXN0PFN0cmluZz4+IHN0cmluZ0xpc3RzID0gbmV3UmFuZG9tRWxlbWVudENvbGxlY3Rpb25zKEFycmF5TGlzdDo6bmV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gbmV3UmFuZG9tQWxwaGFudW1lcmljKHBybmcsIDEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCk7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKExpc3RUeXBlLmdldEluc3RhbmNlKFVURjhUeXBlLmluc3RhbmNlLCBmYWxzZSksIHN0cmluZ0xpc3RzKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoTGlzdFR5cGUuZ2V0SW5zdGFuY2UoVVRGOFR5cGUuaW5zdGFuY2UsIHRydWUpLCBzdHJpbmdMaXN0cyk7CisgICAgICAgIC8vIFRlc3QgbGlzdHMgd2l0aCBlbGVtZW50IGNvbXBvbmVudHMgd2l0aCBrbm93bi9jb21wdXRhYmxlIGxlbmd0aCAoZS5nLiAxMjgtYml0IFVVSURzKS4KKyAgICAgICAgTGlzdDxMaXN0PFVVSUQ+PiB1dWlkTGlzdHMgPSBuZXdSYW5kb21FbGVtZW50Q29sbGVjdGlvbnMoQXJyYXlMaXN0OjpuZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVVSUQ6OnJhbmRvbVVVSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoTGlzdFR5cGUuZ2V0SW5zdGFuY2UoVVVJRFR5cGUuaW5zdGFuY2UsIGZhbHNlKSwgdXVpZExpc3RzKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoTGlzdFR5cGUuZ2V0SW5zdGFuY2UoVVVJRFR5cGUuaW5zdGFuY2UsIHRydWUpLCB1dWlkTGlzdHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvbmdUeXBlKCkKKyAgICB7CisgICAgICAgIFN0cmVhbTxMb25nPiBsb25ncyA9IFN0cmVhbS5vZihudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy5NSU5fVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nLk1JTl9WQUxVRSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgSW50ZWdlci5NSU5fVkFMVUUgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTI1NkwsIC0yNTVMLCAtMTI4TCwgLTEyN0wsIC0xTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMUwsIDEyN0wsIDEyOEwsIDI1NUwsIDI1NkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgSW50ZWdlci5NQVhfVkFMVUUgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy5NQVhfVkFMVUUgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy5NQVhfVkFMVUUpOworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShMb25nVHlwZS5pbnN0YW5jZSwgbG9uZ3MpOworCisgICAgICAgIGxvbmdzID0gbmV3IFJhbmRvbSgpLmxvbmdzKDEwMDApLmJveGVkKCk7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKExvbmdUeXBlLmluc3RhbmNlLCBsb25ncyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgPEssIFY+IExpc3Q8TWFwPEssIFY+PiBuZXdSYW5kb21FbnRyeU1hcHMoU3VwcGxpZXI8PyBleHRlbmRzIEs+IGtleVByb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cHBsaWVyPD8gZXh0ZW5kcyBWPiB2YWx1ZVByb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1NYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1FbnRyaWVzKQorICAgIHsKKyAgICAgICAgTGlzdDxNYXA8SywgVj4+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bU1hcHM7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgTWFwPEssIFY+IG1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnVtRW50cmllczsgKytqKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEsga2V5ID0ga2V5UHJvZHVjZXIuZ2V0KCk7CisgICAgICAgICAgICAgICAgViB2YWx1ZSA9IHZhbHVlUHJvZHVjZXIuZ2V0KCk7CisgICAgICAgICAgICAgICAgbWFwLnB1dChrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5hZGQobWFwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hcFR5cGUoKQorICAgIHsKKyAgICAgICAgUmFuZG9tIHBybmcgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgIExpc3Q8TWFwPFN0cmluZywgVVVJRD4+IHN0cmluZ1RvVXVpZE1hcHMgPSBuZXdSYW5kb21FbnRyeU1hcHMoKCkgLT4gbmV3UmFuZG9tQWxwaGFudW1lcmljKHBybmcsIDEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVUlEOjpyYW5kb21VVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDApOworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShNYXBUeXBlLmdldEluc3RhbmNlKFVURjhUeXBlLmluc3RhbmNlLCBVVUlEVHlwZS5pbnN0YW5jZSwgZmFsc2UpLCBzdHJpbmdUb1V1aWRNYXBzKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoTWFwVHlwZS5nZXRJbnN0YW5jZShVVEY4VHlwZS5pbnN0YW5jZSwgVVVJRFR5cGUuaW5zdGFuY2UsIHRydWUpLCBzdHJpbmdUb1V1aWRNYXBzKTsKKworICAgICAgICBMaXN0PE1hcDxVVUlELCBTdHJpbmc+PiB1dWlkVG9TdHJpbmdNYXBzID0gbmV3UmFuZG9tRW50cnlNYXBzKFVVSUQ6OnJhbmRvbVVVSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gbmV3UmFuZG9tQWxwaGFudW1lcmljKHBybmcsIDEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoTWFwVHlwZS5nZXRJbnN0YW5jZShVVUlEVHlwZS5pbnN0YW5jZSwgVVRGOFR5cGUuaW5zdGFuY2UsIGZhbHNlKSwgdXVpZFRvU3RyaW5nTWFwcyk7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKE1hcFR5cGUuZ2V0SW5zdGFuY2UoVVVJRFR5cGUuaW5zdGFuY2UsIFVURjhUeXBlLmluc3RhbmNlLCB0cnVlKSwgdXVpZFRvU3RyaW5nTWFwcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydGl0aW9uZXJEZWZpbmVkT3JkZXIoKQorICAgIHsKKyAgICAgICAgUmFuZG9tIHBybmcgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gYnl0ZUJ1ZmZlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKEJ5dGVCdWZmZXJVdGlsLkVNUFRZX0JZVEVfQlVGRkVSKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyByYW5kb21TdHJpbmcgPSBuZXdSYW5kb21BbHBoYW51bWVyaWMocHJuZywgMTApOworICAgICAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKFVURjhUeXBlLmluc3RhbmNlLmRlY29tcG9zZShyYW5kb21TdHJpbmcpKTsKKyAgICAgICAgICAgIGludCByYW5kb21JbnQgPSBwcm5nLm5leHRJbnQoKTsKKyAgICAgICAgICAgIGJ5dGVCdWZmZXJzLmFkZChJbnQzMlR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKHJhbmRvbUludCkpOworICAgICAgICAgICAgZG91YmxlIHJhbmRvbURvdWJsZSA9IHBybmcubmV4dERvdWJsZSgpOworICAgICAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKERvdWJsZVR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKHJhbmRvbURvdWJsZSkpOworICAgICAgICAgICAgQmlnSW50ZWdlciByYW5kb21pc2hWYXJpbnQgPSBCaWdJbnRlZ2VyLnByb2JhYmxlUHJpbWUoMTAwLCBwcm5nKTsKKyAgICAgICAgICAgIGJ5dGVCdWZmZXJzLmFkZChJbnRlZ2VyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UocmFuZG9taXNoVmFyaW50KSk7CisgICAgICAgICAgICBCaWdEZWNpbWFsIHJhbmRvbWlzaERlY2ltYWwgPSBCaWdEZWNpbWFsLnZhbHVlT2YocHJuZy5uZXh0TG9uZygpLCBwcm5nLm5leHRJbnQoMTAwKSAtIDUwKTsKKyAgICAgICAgICAgIGJ5dGVCdWZmZXJzLmFkZChEZWNpbWFsVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UocmFuZG9taXNoRGVjaW1hbCkpOworICAgICAgICB9CisKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbMTAwXTsKKyAgICAgICAgcHJuZy5uZXh0Qnl0ZXMoYnl0ZXMpOworICAgICAgICBCeXRlQnVmZmVyIGV4aGF1c3RlZCA9IEJ5dGVCdWZmZXIud3JhcChieXRlcyk7CisgICAgICAgIEJ5dGVCdWZmZXJVdGlsLnJlYWRCeXRlcyhleGhhdXN0ZWQsIDEwMCk7CisKKyAgICAgICAgTGlzdDxJUGFydGl0aW9uZXI+IHBhcnRpdGlvbmVycyA9IEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgTXVybXVyM1BhcnRpdGlvbmVyLmluc3RhbmNlLAorICAgICAgICAgICAgICAgIFJhbmRvbVBhcnRpdGlvbmVyLmluc3RhbmNlLAorICAgICAgICAgICAgICAgIExlbmd0aFBhcnRpdGlvbmVyLmluc3RhbmNlCisgICAgICAgICAgICAgICAgLy8gTk9URSBMb2NhbFBhcnRpdGlvbmVyLCBPcmRlclByZXNlcnZpbmdQYXJ0aXRpb25lciwgYW5kIEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIgZG9uJ3QgbmVlZCBhIGRlZGljYXRlZAorICAgICAgICAgICAgICAgIC8vIFBhcnRpdGlvbmVyRGVmaW5lZE9yZGVyLgorICAgICAgICAgICAgICAgIC8vICAgMSkgTG9jYWxQYXJ0aXRpb25lciB1c2VzIGl0cyBpbm5lciBBYnN0cmFjdFR5cGUKKyAgICAgICAgICAgICAgICAvLyAgIDIpIE9yZGVyUHJlc2VydmluZ1BhcnRpdGlvbmVyIHVzZXMgVVRGOFR5cGUKKyAgICAgICAgICAgICAgICAvLyAgIDMpIEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIgdXNlcyBCeXRlc1R5cGUKKyAgICAgICAgKTsKKyAgICAgICAgZm9yIChJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIgOiBwYXJ0aXRpb25lcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiBwYXJ0aXRpb25PcmRlcmluZyA9IHBhcnRpdGlvbmVyLnBhcnRpdGlvbk9yZGVyaW5nKCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShwYXJ0aXRpb25PcmRlcmluZyBpbnN0YW5jZW9mIFBhcnRpdGlvbmVyRGVmaW5lZE9yZGVyKTsKKyAgICAgICAgICAgIGZvciAoQnl0ZUJ1ZmZlciBpbnB1dCA6IGJ5dGVCdWZmZXJzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2UgYnl0ZVNvdXJjZSA9IHBhcnRpdGlvbk9yZGVyaW5nLmFzQ29tcGFyYWJsZUJ5dGVzKGlucHV0LCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIG91dHB1dCA9IHBhcnRpdGlvbk9yZGVyaW5nLmZyb21Db21wYXJhYmxlQnl0ZXMoQnl0ZVNvdXJjZS5wZWVrYWJsZShieXRlU291cmNlKSwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiRm9yIHBhcnRpdGlvbmVyICIgKyBwYXJ0aXRpb25lci5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoaW5wdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChvdXRwdXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJ5dGVTb3VyY2UgYnl0ZVNvdXJjZSA9IHBhcnRpdGlvbk9yZGVyaW5nLmFzQ29tcGFyYWJsZUJ5dGVzKGV4aGF1c3RlZCwgdmVyc2lvbik7CisgICAgICAgICAgICBCeXRlQnVmZmVyIG91dHB1dCA9IHBhcnRpdGlvbk9yZGVyaW5nLmZyb21Db21wYXJhYmxlQnl0ZXMoQnl0ZVNvdXJjZS5wZWVrYWJsZShieXRlU291cmNlKSwgdmVyc2lvbik7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXJVdGlsLkVNUFRZX0JZVEVfQlVGRkVSLCBvdXRwdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZWRUeXBlKCkKKyAgICB7CisgICAgICAgIC8vIFRlc3QgaG93IFJldmVyc2VkVHlwZSBoYW5kbGVzIG51bGwgQnl0ZVNvdXJjZS5QZWVrYWJsZSAtIGhlcmUgdGhlIGNob2ljZSBvZiBiYXNlIHR5cGUgaXMgaW1wb3J0YW50LCBhcworICAgICAgICAvLyB0aGUgYmFzZSB0eXBlIHNob3VsZCBhbHNvIGJlIGFibGUgdG8gaGFuZGxlIG51bGwgQnl0ZVNvdXJjZS5QZWVrYWJsZS4KKyAgICAgICAgUmV2ZXJzZWRUeXBlPEJpZ0ludGVnZXI+IHJldmVyc2VkVmFyaW50VHlwZSA9IFJldmVyc2VkVHlwZS5nZXRJbnN0YW5jZShJbnRlZ2VyVHlwZS5pbnN0YW5jZSk7CisgICAgICAgIEJ5dGVCdWZmZXIgZGVjb2RlZE51bGwgPSByZXZlcnNlZFZhcmludFR5cGUuZnJvbUNvbXBhcmFibGVCeXRlcyhudWxsLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCeXRlQnVmZmVyVXRpbC5FTVBUWV9CWVRFX0JVRkZFUiwgZGVjb2RlZE51bGwpOworCisgICAgICAgIC8vIFRlc3QgaG93IFJldmVyc2VkVHlwZSBoYW5kbGVzIHJhbmRvbSBkYXRhIHdpdGggc29tZSBjb21tb24gYW5kIGltcG9ydGFudCBiYXNlIHR5cGVzLgorICAgICAgICBNYXA8QWJzdHJhY3RUeXBlPD8+LCBCaUZ1bmN0aW9uPFJhbmRvbSwgSW50ZWdlciwgQnl0ZUJ1ZmZlcj4+IGJ1ZmZlckdlbmVyYXRvckJ5VHlwZSA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgYnVmZmVyR2VuZXJhdG9yQnlUeXBlLnB1dChVVEY4VHlwZS5pbnN0YW5jZSwgKHBybmcsIGxlbmd0aCkgLT4gVVRGOFR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKG5ld1JhbmRvbUFscGhhbnVtZXJpYyhwcm5nLCBsZW5ndGgpKSk7CisgICAgICAgIGJ1ZmZlckdlbmVyYXRvckJ5VHlwZS5wdXQoQnl0ZXNUeXBlLmluc3RhbmNlLCAocHJuZywgbGVuZ3RoKSAtPgorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gcmFuZG9tQnl0ZXMgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgICAgICAgICAgcHJuZy5uZXh0Qnl0ZXMocmFuZG9tQnl0ZXMpOworICAgICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChyYW5kb21CeXRlcyk7CisgICAgICAgIH0pOworICAgICAgICBidWZmZXJHZW5lcmF0b3JCeVR5cGUucHV0KEludGVnZXJUeXBlLmluc3RhbmNlLCAocHJuZywgbGVuZ3RoKSAtPgorICAgICAgICB7CisgICAgICAgICAgICBCaWdJbnRlZ2VyIHJhbmRvbVZhcmludCA9IEJpZ0ludGVnZXIudmFsdWVPZihwcm5nLm5leHRMb25nKCkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsZW5ndGggLyA4OyArK2kpCisgICAgICAgICAgICAgICAgcmFuZG9tVmFyaW50ID0gcmFuZG9tVmFyaW50Lm11bHRpcGx5KEJpZ0ludGVnZXIudmFsdWVPZihwcm5nLm5leHRMb25nKCkpKTsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UocmFuZG9tVmFyaW50KTsKKyAgICAgICAgfSk7CisgICAgICAgIGJ1ZmZlckdlbmVyYXRvckJ5VHlwZS5wdXQoRGVjaW1hbFR5cGUuaW5zdGFuY2UsIChwcm5nLCBsZW5ndGgpIC0+CisgICAgICAgIHsKKyAgICAgICAgICAgIEJpZ0ludGVnZXIgcmFuZG9tTWFudGlzc2EgPSBCaWdJbnRlZ2VyLnZhbHVlT2YocHJuZy5uZXh0TG9uZygpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuZ3RoIC8gODsgKytpKQorICAgICAgICAgICAgICAgIHJhbmRvbU1hbnRpc3NhID0gcmFuZG9tTWFudGlzc2EubXVsdGlwbHkoQmlnSW50ZWdlci52YWx1ZU9mKHBybmcubmV4dExvbmcoKSkpOworICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCB0cmFpbGluZyB6ZXJvcyBmcm9tIHRoZSBtYW50aXNzYSBhbmQgdXNlIGFuIGV2ZW4gc2NhbGUsIGluIG9yZGVyIHRvIGhhdmUgYSAiY2Fub25pY2FsbHkKKyAgICAgICAgICAgIC8vIHJlcHJlc2VudGVkIiAoaW4gdGhlIGNvbnRleHQgb2YgRGVjaW1hbFR5cGUncyBlbmNvZGluZykgZGVjaW1hbCwgaS5lLiBvbmUgd2hpY2ggd291bGRuJ3QgYmUgcmUtc2NhbGVkIHRvCisgICAgICAgICAgICAvLyBjb25mb3JtIHdpdGggdGhlICJjb21wYWN0ZWQgbWFudGlzc2EgYmV0d2VlbiAwIGFuZCAxLCBzY2FsZSBhcyBhIHBvd2VyIG9mIDEwMCIgcnVsZS4KKyAgICAgICAgICAgIHdoaWxlIChyYW5kb21NYW50aXNzYS5yZW1haW5kZXIoQmlnSW50ZWdlci5URU4pLmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pKQorICAgICAgICAgICAgICAgIHJhbmRvbU1hbnRpc3NhID0gcmFuZG9tTWFudGlzc2EuZGl2aWRlKEJpZ0ludGVnZXIuVEVOKTsKKyAgICAgICAgICAgIGludCByYW5kb21TY2FsZSA9IHBybmcubmV4dEludCgpICYgLTI7CisgICAgICAgICAgICBCaWdEZWNpbWFsIHJhbmRvbURlY2ltYWwgPSBuZXcgQmlnRGVjaW1hbChyYW5kb21NYW50aXNzYSwgcmFuZG9tU2NhbGUpOworICAgICAgICAgICAgcmV0dXJuIERlY2ltYWxUeXBlLmluc3RhbmNlLmRlY29tcG9zZShyYW5kb21EZWNpbWFsKTsKKyAgICAgICAgfSk7CisgICAgICAgIFJhbmRvbSBwcm5nID0gbmV3IFJhbmRvbSgpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxBYnN0cmFjdFR5cGU8Pz4sIEJpRnVuY3Rpb248UmFuZG9tLCBJbnRlZ2VyLCBCeXRlQnVmZmVyPj4gZW50cnkgOiBidWZmZXJHZW5lcmF0b3JCeVR5cGUuZW50cnlTZXQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgUmV2ZXJzZWRUeXBlPD8+IHJldmVyc2VkVHlwZSA9IFJldmVyc2VkVHlwZS5nZXRJbnN0YW5jZShlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgICAgICBmb3IgKGludCBsZW5ndGggPSAzMjsgbGVuZ3RoIDw9IDUxMjsgbGVuZ3RoICo9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgaW5pdGlhbCA9IGVudHJ5LmdldFZhbHVlKCkuYXBwbHkocHJuZywgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSByZXZlcnNlZFBlZWthYmxlID0gQnl0ZVNvdXJjZS5wZWVrYWJsZShyZXZlcnNlZFR5cGUuYXNDb21wYXJhYmxlQnl0ZXMoaW5pdGlhbCwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5PU1M1MCkpOworICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGRlY29kZWQgPSByZXZlcnNlZFR5cGUuZnJvbUNvbXBhcmFibGVCeXRlcyhyZXZlcnNlZFBlZWthYmxlLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhpbml0aWFsLCBkZWNvZGVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRUeXBlKCkKKyAgICB7CisgICAgICAgIC8vIFRlc3Qgc2V0cyB3aXRoIGVsZW1lbnQgY29tcG9uZW50cyBub3QgaGF2aW5nIGtub3duL2NvbXB1dGFibGUgbGVuZ3RoIChlLmcuIHN0cmluZ3MpLgorICAgICAgICBSYW5kb20gcHJuZyA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgTGlzdDxTZXQ8U3RyaW5nPj4gc3RyaW5nU2V0cyA9IG5ld1JhbmRvbUVsZW1lbnRDb2xsZWN0aW9ucyhIYXNoU2V0OjpuZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gbmV3UmFuZG9tQWxwaGFudW1lcmljKHBybmcsIDEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoU2V0VHlwZS5nZXRJbnN0YW5jZShVVEY4VHlwZS5pbnN0YW5jZSwgZmFsc2UpLCBzdHJpbmdTZXRzKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoU2V0VHlwZS5nZXRJbnN0YW5jZShVVEY4VHlwZS5pbnN0YW5jZSwgdHJ1ZSksIHN0cmluZ1NldHMpOworICAgICAgICAvLyBUZXN0IHNldHMgd2l0aCBlbGVtZW50IGNvbXBvbmVudHMgd2l0aCBrbm93bi9jb21wdXRhYmxlIGxlbmd0aCAoZS5nLiAxMjgtYml0IFVVSURzKS4KKyAgICAgICAgTGlzdDxTZXQ8VVVJRD4+IHV1aWRTZXRzID0gbmV3UmFuZG9tRWxlbWVudENvbGxlY3Rpb25zKEhhc2hTZXQ6Om5ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVVSUQ6OnJhbmRvbVVVSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDApOworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShTZXRUeXBlLmdldEluc3RhbmNlKFVVSURUeXBlLmluc3RhbmNlLCBmYWxzZSksIHV1aWRTZXRzKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoU2V0VHlwZS5nZXRJbnN0YW5jZShVVUlEVHlwZS5pbnN0YW5jZSwgdHJ1ZSksIHV1aWRTZXRzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaG9ydFR5cGUoKQorICAgIHsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoU2hvcnRUeXBlLmluc3RhbmNlLCBuZXcgU2hvcnRbXSB7IG51bGwgfSk7CisKKyAgICAgICAgU3RyZWFtPFNob3J0PiBhbGxTaG9ydHMgPSBJbnRTdHJlYW0ucmFuZ2UoU2hvcnQuTUlOX1ZBTFVFLCBTaG9ydC5NQVhfVkFMVUUgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBUb09iaih2YWx1ZSAtPiAoc2hvcnQpIHZhbHVlKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoU2hvcnRUeXBlLmluc3RhbmNlLCBhbGxTaG9ydHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZURhdGVUeXBlKCkKKyAgICB7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKFNpbXBsZURhdGVUeXBlLmluc3RhbmNlLCBuZXcgSW50ZWdlcltdIHsgbnVsbCB9KTsKKworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShTaW1wbGVEYXRlVHlwZS5pbnN0YW5jZSwgbmV3IFJhbmRvbSgpLmludHMoMTAwMCkuYm94ZWQoKSk7CisKKyAgICAgICAgLy8gVGVzdCBieSBtYW51YWxseSBjcmVhdGluZyBhbmQgbWFudWFsbHkgaW50ZXJwcmV0aW5nIHNpbXBsZSBkYXRlcyBmcm9tIHJhbmRvbSBtaWxsaXMuCisgICAgICAgIG5ldyBSYW5kb20oKS5pbnRzKDEwMDApLmZvckVhY2goaW5pdGlhbE1pbGxpcyAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTWlsbGlzID0gTWF0aC5hYnMoaW5pdGlhbE1pbGxpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGluaXRpYWxEYXlzID0gU2ltcGxlRGF0ZVNlcmlhbGl6ZXIudGltZUluTWlsbGlzVG9EYXkoaW5pdGlhbE1pbGxpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHNpbXBsZURhdGVCdWZmZXIgPSBTaW1wbGVEYXRlVHlwZS5pbnN0YW5jZS5mcm9tVGltZUluTWlsbGlzKGluaXRpYWxNaWxsaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZSBieXRlU291cmNlID0gU2ltcGxlRGF0ZVR5cGUuaW5zdGFuY2UuYXNDb21wYXJhYmxlQnl0ZXMoc2ltcGxlRGF0ZUJ1ZmZlciwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGRlY29kZWREYXlzID0gU2ltcGxlRGF0ZVR5cGUuaW5zdGFuY2UuY29tcG9zZShTaW1wbGVEYXRlVHlwZS5pbnN0YW5jZS5mcm9tQ29tcGFyYWJsZUJ5dGVzKEJ5dGVTb3VyY2UucGVla2FibGUoYnl0ZVNvdXJjZSksIHZlcnNpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoaW5pdGlhbERheXMsIGRlY29kZWREYXlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgLy8gVGVzdCBieSBtYW51YWxseSBjcmVhdGluZyBhbmQgbWFudWFsbHkgaW50ZXJwcmV0aW5nIHNpbXBsZSBkYXRlcyBmcm9tIHN0cmluZ3MuCisgICAgICAgIFN0cmluZ1tdIHNpbXBsZURhdGVTdHJpbmdzID0gbmV3IFN0cmluZ1tdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxOTcwLTAxLTAxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjE5NzAtMDEtMDIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTk2OS0xMi0zMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItMDAwMS0wMS0wMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItNTg3NzUyMS0wMS0wMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDE0LTAxLTAxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIis1ODgxNTgwLTAxLTEwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjE5MjAtMTItMDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTU4Mi0xMC0xOSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgIGZvciAoU3RyaW5nIHNpbXBsZURhdGUgOiBzaW1wbGVEYXRlU3RyaW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBzaW1wbGVEYXRhQnVmZmVyID0gU2ltcGxlRGF0ZVR5cGUuaW5zdGFuY2UuZnJvbVN0cmluZyhzaW1wbGVEYXRlKTsKKyAgICAgICAgICAgIEJ5dGVTb3VyY2UgYnl0ZVNvdXJjZSA9IFNpbXBsZURhdGVUeXBlLmluc3RhbmNlLmFzQ29tcGFyYWJsZUJ5dGVzKHNpbXBsZURhdGFCdWZmZXIsIHZlcnNpb24pOworICAgICAgICAgICAgSW50ZWdlciBkZWNvZGVkRGF5cyA9IFNpbXBsZURhdGVUeXBlLmluc3RhbmNlLmNvbXBvc2UoU2ltcGxlRGF0ZVR5cGUuaW5zdGFuY2UuZnJvbUNvbXBhcmFibGVCeXRlcyhCeXRlU291cmNlLnBlZWthYmxlKGJ5dGVTb3VyY2UpLCB2ZXJzaW9uKSk7CisgICAgICAgICAgICBTdHJpbmcgZGVjb2RlZERhdGUgPSBTaW1wbGVEYXRlU2VyaWFsaXplci5pbnN0YW5jZS50b1N0cmluZyhkZWNvZGVkRGF5cyk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHNpbXBsZURhdGUsIGRlY29kZWREYXRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVzdGFtcFR5cGUoKQorICAgIHsKKyAgICAgICAgRGF0ZVtdIGRhdGVzID0gbmV3IERhdGVbXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoMEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoLTFMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKExvbmcuTUFYX1ZBTFVFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKExvbmcuTUlOX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKFRpbWVzdGFtcFR5cGUuaW5zdGFuY2UsIGRhdGVzKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoVGltZXN0YW1wVHlwZS5pbnN0YW5jZSwgbmV3IFJhbmRvbSgpLmxvbmdzKDEwMDApLm1hcFRvT2JqKERhdGU6Om5ldykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVUeXBlKCkKKyAgICB7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKFRpbWVUeXBlLmluc3RhbmNlLCBuZXcgTG9uZ1tdIHsgbnVsbCB9KTsKKworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShUaW1lVHlwZS5pbnN0YW5jZSwgbmV3IFJhbmRvbSgpLmxvbmdzKDEwMDApLmJveGVkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFR1cGxlVHlwZSgpCisgICAgeworICAgICAgICBUdXBsZVR5cGUgdHQgPSBuZXcgVHVwbGVUeXBlKEFycmF5cy5hc0xpc3QoVVRGOFR5cGUuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsVHlwZS5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXJUeXBlLmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZXNUeXBlLmluc3RhbmNlKSk7CisgICAgICAgIFJhbmRvbSBwcm5nID0gbmV3IFJhbmRvbSgpOworICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IHR1cGxlc0RhdGEgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgU3RyaW5nW10gdXRmOFZhbHVlcyA9IG5ldyBTdHJpbmdbXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICLCqSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmFuZG9tQWxwaGFudW1lcmljKHBybmcsIDEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdSYW5kb21BbHBoYW51bWVyaWMocHJuZywgMTAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICBCaWdEZWNpbWFsW10gZGVjaW1hbFZhbHVlcyA9IG5ldyBCaWdEZWNpbWFsW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnRGVjaW1hbC5aRVJPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdEZWNpbWFsLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnRGVjaW1hbC52YWx1ZU9mKDEyMzQ1Njc4OTEwMTExMjEzMTRMLCA1MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwudmFsdWVPZigxMjM0NTY3ODkxMDExMTIxMzE0TCwgNTApLm5lZ2F0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICBCaWdJbnRlZ2VyW10gdmFyaW50VmFsdWVzID0gbmV3IEJpZ0ludGVnZXJbXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLlpFUk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5URU4ucG93KDEwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuVEVOLnBvdygxMDAwKS5uZWdhdGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICBieXRlW10gb25lQnl0ZSA9IG5ldyBieXRlWzFdOworICAgICAgICBieXRlW10gdGVuQnl0ZXMgPSBuZXcgYnl0ZVsxMF07CisgICAgICAgIGJ5dGVbXSBodW5kcmVkQnl0ZXMgPSBuZXcgYnl0ZVsxMDBdOworICAgICAgICBieXRlW10gdGhvdXNhbmRCeXRlcyA9IG5ldyBieXRlWzEwMDBdOworICAgICAgICBwcm5nLm5leHRCeXRlcyhvbmVCeXRlKTsKKyAgICAgICAgcHJuZy5uZXh0Qnl0ZXModGVuQnl0ZXMpOworICAgICAgICBwcm5nLm5leHRCeXRlcyhodW5kcmVkQnl0ZXMpOworICAgICAgICBwcm5nLm5leHRCeXRlcyh0aG91c2FuZEJ5dGVzKTsKKyAgICAgICAgYnl0ZVtdW10gYnl0ZXNWYWx1ZXMgPSBuZXcgYnl0ZVtdW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGJ5dGVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZUJ5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodW5kcmVkQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRob3VzYW5kQnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgIGZvciAoU3RyaW5nIHV0ZjggOiB1dGY4VmFsdWVzKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKEJpZ0RlY2ltYWwgZGVjaW1hbCA6IGRlY2ltYWxWYWx1ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChCaWdJbnRlZ2VyIHZhcmludCA6IHZhcmludFZhbHVlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoYnl0ZVtdIGJ5dGVzIDogYnl0ZXNWYWx1ZXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgdHVwbGVEYXRhID0gVHVwbGVUeXBlLmJ1aWxkVmFsdWUoVVRGOFR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKHV0ZjgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsICE9IG51bGwgPyBEZWNpbWFsVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoZGVjaW1hbCkgOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpbnQgIT0gbnVsbCA/IEludGVnZXJUeXBlLmluc3RhbmNlLmRlY29tcG9zZSh2YXJpbnQpIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY291bGQgYWxzbyB1c2UgdGhlIHdyYXBwZWQgYnl0ZXMgZGlyZWN0bHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZXNUeXBlLmluc3RhbmNlLmRlY29tcG9zZShCeXRlQnVmZmVyLndyYXAoYnl0ZXMpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0dXBsZXNEYXRhLmFkZCh0dXBsZURhdGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKHR0LCB0dXBsZXNEYXRhLnRvQXJyYXkobmV3IEJ5dGVCdWZmZXJbMF0pKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVdGY4VHlwZSgpCisgICAgeworICAgICAgICBSYW5kb20gcHJuZyA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoVVRGOFR5cGUuaW5zdGFuY2UsIFN0cmVhbS5nZW5lcmF0ZSgoKSAtPiBuZXdSYW5kb21BbHBoYW51bWVyaWMocHJuZywgMTAwKSkubGltaXQoMTAwMCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFR5cGVXaXRoQnl0ZU9yZGVyZWRDb21wYXJpc29uKCkKKyAgICB7CisgICAgICAgIFJhbmRvbSBwcm5nID0gbmV3IFJhbmRvbSgpOworICAgICAgICBieXRlW10gc2luZ2xlQnl0ZSA9IG5ldyBieXRlW10geyAoYnl0ZSkgcHJuZy5uZXh0SW50KCkgfTsKKyAgICAgICAgYnl0ZVtdIHRlbkJ5dGVzID0gbmV3IGJ5dGVbMTBdOworICAgICAgICBwcm5nLm5leHRCeXRlcyh0ZW5CeXRlcyk7CisgICAgICAgIGJ5dGVbXSBodW5kcmVkQnl0ZXMgPSBuZXcgYnl0ZVsxMDBdOworICAgICAgICBwcm5nLm5leHRCeXRlcyhodW5kcmVkQnl0ZXMpOworICAgICAgICBieXRlW10gdGhvdXNhbmRCeXRlcyA9IG5ldyBieXRlWzEwMDBdOworICAgICAgICBwcm5nLm5leHRCeXRlcyh0aG91c2FuZEJ5dGVzKTsKKyAgICAgICAgLy8gTm8gbnVsbCBoZXJlLCBhcyB0aGUgZGVmYXVsdCBhc0NvbXBhcmFibGVCeXRlcyhCeXRlQnVmZmVyLCBWZXJzaW9uKSBpbXBsZW1lbnRhdGlvbiAoYW5kIG1vcmUgc3BlY2lmaWNhbGx5CisgICAgICAgIC8vIHRoZSBCeXRlU291cmNlLm9mKEJ5dGVCdWZmZXIsIFZlcnNpb24pIGVuY29kaW5nKSB3b3VsZCB0aHJvdyB0aGVuLgorICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShCeXRlT3JkZXJlZFR5cGUuaW5zdGFuY2UsIFN0cmVhbS5vZihCeXRlQnVmZmVyVXRpbC5FTVBUWV9CWVRFX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlci53cmFwKHNpbmdsZUJ5dGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyLndyYXAodGVuQnl0ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyLndyYXAoaHVuZHJlZEJ5dGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlci53cmFwKHRob3VzYW5kQnl0ZXMpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQnl0ZU9yZGVyZWRUeXBlIGV4dGVuZHMgQWJzdHJhY3RUeXBlPEJ5dGVCdWZmZXI+CisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJ5dGVPcmRlcmVkVHlwZSBpbnN0YW5jZSA9IG5ldyBCeXRlT3JkZXJlZFR5cGUoKTsKKworICAgICAgICBwcml2YXRlIEJ5dGVPcmRlcmVkVHlwZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKENvbXBhcmlzb25UeXBlLkJZVEVfT1JERVIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGZyb21TdHJpbmcoU3RyaW5nIHNvdXJjZSkgdGhyb3dzIE1hcnNoYWxFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFRlcm0gZnJvbUpTT05PYmplY3QoT2JqZWN0IHBhcnNlZCkgdGhyb3dzIE1hcnNoYWxFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFR5cGVTZXJpYWxpemVyPEJ5dGVCdWZmZXI+IGdldFNlcmlhbGl6ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQnl0ZU9yZGVyZWRTZXJpYWxpemVyLmluc3RhbmNlOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGNsYXNzIEJ5dGVPcmRlcmVkU2VyaWFsaXplciBleHRlbmRzIFR5cGVTZXJpYWxpemVyPEJ5dGVCdWZmZXI+CisgICAgICAgIHsKKworICAgICAgICAgICAgc3RhdGljIGZpbmFsIEJ5dGVPcmRlcmVkU2VyaWFsaXplciBpbnN0YW5jZSA9IG5ldyBCeXRlT3JkZXJlZFNlcmlhbGl6ZXIoKTsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBzZXJpYWxpemUoQnl0ZUJ1ZmZlciB2YWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHZhbHVlLmR1cGxpY2F0ZSgpIDogbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgPFY+IEJ5dGVCdWZmZXIgZGVzZXJpYWxpemUoViBieXRlcywgVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWNjZXNzb3IudG9CdWZmZXIoYnl0ZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyA8Vj4gdm9pZCB2YWxpZGF0ZShWIGJ5dGVzLCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yKSB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbgorICAgICAgICAgICAgeworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhCeXRlQnVmZmVyIHZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KHZhbHVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQ2xhc3M8Qnl0ZUJ1ZmZlcj4gZ2V0VHlwZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXIuY2xhc3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvQnl0ZVNvdXJjZUNvbXBhcmlzb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvQnl0ZVNvdXJjZUNvbXBhcmlzb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYzMDllOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9ieXRlY29tcGFyYWJsZS9CeXRlU291cmNlQ29tcGFyaXNvblRlc3QuamF2YQpAQCAtMCwwICsxLDExNzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkTG9jYWxSYW5kb207CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuT3JkZXJpbmc7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nQ29tcGFyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nUHJlZml4OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTG9jYWxQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTXVybXVyM1BhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5kb21QYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5NdXJtdXJIYXNoOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlLlZlcnNpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgZm9yd2FyZCBjb252ZXJzaW9uIHRvIEJ5dGVTb3VyY2UvQnl0ZUNvbXBhcmFibGUgYW5kIHRoYXQgdGhlIHJlc3VsdCBjb21wYXJlcyBjb3JyZWN0bHkuCisgKi8KK3B1YmxpYyBjbGFzcyBCeXRlU291cmNlQ29tcGFyaXNvblRlc3QgZXh0ZW5kcyBCeXRlU291cmNlVGVzdEJhc2UKK3sKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQnl0ZVNvdXJjZUNvbXBhcmlzb25UZXN0LmNsYXNzKTsKKworICAgIEBSdWxlCisgICAgcHVibGljIGZpbmFsIEV4cGVjdGVkRXhjZXB0aW9uIGV4cGVjdGVkRXhjZXB0aW9uID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nc0FzY2lpKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKEFzY2lpVHlwZS5pbnN0YW5jZSwgdGVzdFN0cmluZ3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ3NVVEY4KCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKFVURjhUeXBlLmluc3RhbmNlLCB0ZXN0U3RyaW5ncyk7CisgICAgICAgIHRlc3REaXJlY3QoeCAtPiBCeXRlU291cmNlLm9mKHgsIFZlcnNpb24uT1NTNTApLCBPcmRlcmluZy48U3RyaW5nPm5hdHVyYWwoKTo6Y29tcGFyZSwgdGVzdFN0cmluZ3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJvb2xlYW5zKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKEJvb2xlYW5UeXBlLmluc3RhbmNlLCB0ZXN0Qm9vbHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludHMoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoSW50MzJUeXBlLmluc3RhbmNlLCB0ZXN0SW50cyk7CisgICAgICAgIHRlc3REaXJlY3QoeCAtPiBCeXRlU291cmNlLm9mKHgpLCBJbnRlZ2VyOjpjb21wYXJlLCB0ZXN0SW50cyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByYW5kb21UZXN0SW50cygpCisgICAgeworICAgICAgICBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPDEwMDAwOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpMSA9IHJhbmQubmV4dEludCgpOworICAgICAgICAgICAgaW50IGkyID0gcmFuZC5uZXh0SW50KCk7CisgICAgICAgICAgICBhc3NlcnRDb21wYXJlc1NhbWUoSW50MzJUeXBlLmluc3RhbmNlLCBpMSwgaTIpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb25ncygpCisgICAgeworICAgICAgICB0ZXN0VHlwZShMb25nVHlwZS5pbnN0YW5jZSwgdGVzdExvbmdzKTsKKyAgICAgICAgdGVzdERpcmVjdCh4IC0+IEJ5dGVTb3VyY2Uub2YoeCksIExvbmc6OmNvbXBhcmUsIHRlc3RMb25ncyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvcnRzKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKFNob3J0VHlwZS5pbnN0YW5jZSwgdGVzdFNob3J0cyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZXMoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoQnl0ZVR5cGUuaW5zdGFuY2UsIHRlc3RCeXRlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlcygpCisgICAgeworICAgICAgICB0ZXN0VHlwZShEb3VibGVUeXBlLmluc3RhbmNlLCB0ZXN0RG91Ymxlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmxvYXRzKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKEZsb2F0VHlwZS5pbnN0YW5jZSwgdGVzdEZsb2F0cyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmlnSW50cygpCisgICAgeworICAgICAgICB0ZXN0VHlwZShJbnRlZ2VyVHlwZS5pbnN0YW5jZSwgdGVzdEJpZ0ludHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJpZ0RlY2ltYWxzKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKERlY2ltYWxUeXBlLmluc3RhbmNlLCB0ZXN0QmlnRGVjaW1hbHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJpZ0RlY2ltYWxJbkNvbWJpbmF0aW9uKCkKKyAgICB7CisgICAgICAgIEJpZ0RlY2ltYWwgYjEgPSBuZXcgQmlnRGVjaW1hbCgiMTIzNDU2Ljc4OTAxMjAxIik7CisgICAgICAgIEJpZ0RlY2ltYWwgYjIgPSBuZXcgQmlnRGVjaW1hbCgiMTIzNDU2Ljc4OTAxMiIpOworICAgICAgICBCb29sZWFuIGIgPSBmYWxzZTsKKworICAgICAgICBhc3NlcnRDbHVzdGVyaW5nUGFpckNvbXBhcmVzU2FtZShEZWNpbWFsVHlwZS5pbnN0YW5jZSwgQm9vbGVhblR5cGUuaW5zdGFuY2UsIGIxLCBiLCBiMiwgYik7CisgICAgICAgIGFzc2VydENsdXN0ZXJpbmdQYWlyQ29tcGFyZXNTYW1lKEJvb2xlYW5UeXBlLmluc3RhbmNlLCBEZWNpbWFsVHlwZS5pbnN0YW5jZSwgYiwgYjEsIGIsIGIyKTsKKworICAgICAgICBiMSA9IGIxLm5lZ2F0ZSgpOworICAgICAgICBiMiA9IGIyLm5lZ2F0ZSgpOworCisgICAgICAgIGFzc2VydENsdXN0ZXJpbmdQYWlyQ29tcGFyZXNTYW1lKERlY2ltYWxUeXBlLmluc3RhbmNlLCBCb29sZWFuVHlwZS5pbnN0YW5jZSwgYjEsIGIsIGIyLCBiKTsKKyAgICAgICAgYXNzZXJ0Q2x1c3RlcmluZ1BhaXJDb21wYXJlc1NhbWUoQm9vbGVhblR5cGUuaW5zdGFuY2UsIERlY2ltYWxUeXBlLmluc3RhbmNlLCBiLCBiMSwgYiwgYjIpOworCisgICAgICAgIGIxID0gbmV3IEJpZ0RlY2ltYWwoIi0xMjM0NTYuNzg5MDEyODkiKTsKKyAgICAgICAgYjIgPSBuZXcgQmlnRGVjaW1hbCgiLTEyMzQ1Ni43ODkwMTIiKTsKKworICAgICAgICBhc3NlcnRDbHVzdGVyaW5nUGFpckNvbXBhcmVzU2FtZShEZWNpbWFsVHlwZS5pbnN0YW5jZSwgQm9vbGVhblR5cGUuaW5zdGFuY2UsIGIxLCBiLCBiMiwgYik7CisgICAgICAgIGFzc2VydENsdXN0ZXJpbmdQYWlyQ29tcGFyZXNTYW1lKEJvb2xlYW5UeXBlLmluc3RhbmNlLCBEZWNpbWFsVHlwZS5pbnN0YW5jZSwgYiwgYjEsIGIsIGIyKTsKKworICAgICAgICBiMSA9IG5ldyBCaWdEZWNpbWFsKCIxIik7CisgICAgICAgIGIyID0gbmV3IEJpZ0RlY2ltYWwoIjEuMSIpOworCisgICAgICAgIGFzc2VydENsdXN0ZXJpbmdQYWlyQ29tcGFyZXNTYW1lKERlY2ltYWxUeXBlLmluc3RhbmNlLCBCb29sZWFuVHlwZS5pbnN0YW5jZSwgYjEsIGIsIGIyLCBiKTsKKyAgICAgICAgYXNzZXJ0Q2x1c3RlcmluZ1BhaXJDb21wYXJlc1NhbWUoQm9vbGVhblR5cGUuaW5zdGFuY2UsIERlY2ltYWxUeXBlLmluc3RhbmNlLCBiLCBiMSwgYiwgYjIpOworCisgICAgICAgIGIxID0gYjEubmVnYXRlKCk7CisgICAgICAgIGIyID0gYjIubmVnYXRlKCk7CisKKyAgICAgICAgYXNzZXJ0Q2x1c3RlcmluZ1BhaXJDb21wYXJlc1NhbWUoRGVjaW1hbFR5cGUuaW5zdGFuY2UsIEJvb2xlYW5UeXBlLmluc3RhbmNlLCBiMSwgYiwgYjIsIGIpOworICAgICAgICBhc3NlcnRDbHVzdGVyaW5nUGFpckNvbXBhcmVzU2FtZShCb29sZWFuVHlwZS5pbnN0YW5jZSwgRGVjaW1hbFR5cGUuaW5zdGFuY2UsIGIsIGIxLCBiLCBiMik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VVVJRHMoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoVVVJRFR5cGUuaW5zdGFuY2UsIHRlc3RVVUlEcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZVVVSURzKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKFRpbWVVVUlEVHlwZS5pbnN0YW5jZSwgQXJyYXlzLnN0cmVhbSh0ZXN0VVVJRHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcih4IC0+IHggPT0gbnVsbCB8fCB4LnZlcnNpb24oKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoeCAtPiB4ICE9IG51bGwgPyBUaW1lVVVJRC5mcm9tVXVpZCh4KSA6IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvQXJyYXkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGV4aWNhbFVVSURzKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKExleGljYWxVVUlEVHlwZS5pbnN0YW5jZSwgdGVzdFVVSURzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVEYXRlKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKFNpbXBsZURhdGVUeXBlLmluc3RhbmNlLCBBcnJheXMuc3RyZWFtKHRlc3RJbnRzKS5maWx0ZXIoeCAtPiB4ICE9IG51bGwpLnRvQXJyYXkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZVR5cGUoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoVGltZVR5cGUuaW5zdGFuY2UsIEFycmF5cy5zdHJlYW0odGVzdExvbmdzKS5maWx0ZXIoeCAtPiB4ICE9IG51bGwgJiYgeCA+PSAwICYmIHggPD0gMjRMICogNjAgKiA2MCAqIDEwMDAgKiAxMDAwICogMTAwMCkudG9BcnJheSgpKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERhdGVUeXBlKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKERhdGVUeXBlLmluc3RhbmNlLCB0ZXN0RGF0ZXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVzdGFtcFR5cGUoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoVGltZXN0YW1wVHlwZS5pbnN0YW5jZSwgdGVzdERhdGVzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCeXRlc1R5cGUoKQorICAgIHsKKyAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IHRlc3RWYWx1ZXNbaV0pCisgICAgICAgICAgICAgICAgdmFsdWVzLmFkZCh0ZXN0VHlwZXNbaV0uZGVjb21wb3NlKG8pKTsKKworICAgICAgICB0ZXN0VHlwZShCeXRlc1R5cGUuaW5zdGFuY2UsIHZhbHVlcy50b0FycmF5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluZXRBZGRyZXNzVHlwZSgpIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoSW5ldEFkZHJlc3NUeXBlLmluc3RhbmNlLCB0ZXN0SW5ldHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5VHlwZSgpCisgICAgeworICAgICAgICB0ZXN0VHlwZShFbXB0eVR5cGUuaW5zdGFuY2UsIG5ldyBWb2lkW10geyBudWxsIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhdGl0aW9uZXJEZWZpbmVkT3JkZXIoKQorICAgIHsKKyAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IHRlc3RWYWx1ZXNbaV0pCisgICAgICAgICAgICAgICAgdmFsdWVzLmFkZCh0ZXN0VHlwZXNbaV0uZGVjb21wb3NlKG8pKTsKKworICAgICAgICB0ZXN0QnVmZmVycyhuZXcgUGFydGl0aW9uZXJEZWZpbmVkT3JkZXIoTXVybXVyM1BhcnRpdGlvbmVyLmluc3RhbmNlKSwgdmFsdWVzKTsKKyAgICAgICAgdGVzdEJ1ZmZlcnMobmV3IFBhcnRpdGlvbmVyRGVmaW5lZE9yZGVyKFJhbmRvbVBhcnRpdGlvbmVyLmluc3RhbmNlKSwgdmFsdWVzKTsKKyAgICAgICAgdGVzdEJ1ZmZlcnMobmV3IFBhcnRpdGlvbmVyRGVmaW5lZE9yZGVyKEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuaW5zdGFuY2UpLCB2YWx1ZXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhdGl0aW9uZXJPcmRlcigpCisgICAgeworICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICBmb3IgKE9iamVjdCBvIDogdGVzdFZhbHVlc1tpXSkKKyAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKHRlc3RUeXBlc1tpXS5kZWNvbXBvc2UobykpOworCisgICAgICAgIHRlc3REZWNvcmF0ZWRLZXlzKE11cm11cjNQYXJ0aXRpb25lci5pbnN0YW5jZSwgdmFsdWVzKTsKKyAgICAgICAgdGVzdERlY29yYXRlZEtleXMoUmFuZG9tUGFydGl0aW9uZXIuaW5zdGFuY2UsIHZhbHVlcyk7CisgICAgICAgIHRlc3REZWNvcmF0ZWRLZXlzKEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuaW5zdGFuY2UsIHZhbHVlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxQYXRpdGlvbmVyT3JkZXIoKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBBYnN0cmFjdFR5cGUgdGVzdFR5cGUgPSB0ZXN0VHlwZXNbaV07CisgICAgICAgICAgICB0ZXN0RGVjb3JhdGVkS2V5cyhuZXcgTG9jYWxQYXJ0aXRpb25lcih0ZXN0VHlwZSksIExpc3RzLnRyYW5zZm9ybShBcnJheXMuYXNMaXN0KHRlc3RWYWx1ZXNbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2IC0+IHRlc3RUeXBlLmRlY29tcG9zZSh2KSkpOworICAgICAgICB9CisgICAgfQorCisgICAgaW50ZXJmYWNlIFBhaXJUZXN0ZXIKKyAgICB7CisgICAgICAgIHZvaWQgdGVzdChBYnN0cmFjdFR5cGUgdDEsIEFic3RyYWN0VHlwZSB0MiwgT2JqZWN0IG8xLCBPYmplY3QgbzIsIE9iamVjdCBvMywgT2JqZWN0IG80KTsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RDb21iaW5hdGlvblNhbXBsaW5nKFJhbmRvbSByYW5kLCBQYWlyVGVzdGVyIHRlc3RlcikKKyAgICB7CisgICAgICAgIGZvciAoaW50IGk9MDtpPHRlc3RUeXBlcy5sZW5ndGg7KytpKQorICAgICAgICAgICAgZm9yIChpbnQgaj0wO2o8dGVzdFR5cGVzLmxlbmd0aDsrK2opCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT2JqZWN0W10gdHYxID0gbmV3IE9iamVjdFszXTsKKyAgICAgICAgICAgICAgICBPYmplY3RbXSB0djIgPSBuZXcgT2JqZWN0WzNdOworICAgICAgICAgICAgICAgIGZvciAoaW50IHQ9MDsgdDx0djEubGVuZ3RoOyArK3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0djFbdF0gPSB0ZXN0VmFsdWVzW2ldW3JhbmQubmV4dEludCh0ZXN0VmFsdWVzW2ldLmxlbmd0aCldOworICAgICAgICAgICAgICAgICAgICB0djJbdF0gPSB0ZXN0VmFsdWVzW2pdW3JhbmQubmV4dEludCh0ZXN0VmFsdWVzW2pdLmxlbmd0aCldOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG8xIDogdHYxKQorICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBvMiA6IHR2MikKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG8zIDogdHYxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG80IDogdHYyKQorCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0ZXN0ZXIudGVzdCh0ZXN0VHlwZXNbaV0sIHRlc3RUeXBlc1tqXSwgbzEsIG8yLCBvMywgbzQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21iaW5hdGlvbnMoKQorICAgIHsKKyAgICAgICAgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKDApOworICAgICAgICB0ZXN0Q29tYmluYXRpb25TYW1wbGluZyhyYW5kLCB0aGlzOjphc3NlcnRDbHVzdGVyaW5nUGFpckNvbXBhcmVzU2FtZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbHNJbkNsdXN0ZXJpbmcoKQorICAgIHsKKyAgICAgICAgQnl0ZUJ1ZmZlcltdW10gaW5wdXRzID0gbmV3IEJ5dGVCdWZmZXJbXVtdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVCdWZmZXJbXSB7ZGVjb21wb3NlQW5kUmFuZG9tUGFkKFVURjhUeXBlLmluc3RhbmNlLCAiYSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VBbmRSYW5kb21QYWQoSW50MzJUeXBlLmluc3RhbmNlLCAwKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQnVmZmVyW10ge2RlY29tcG9zZUFuZFJhbmRvbVBhZChVVEY4VHlwZS5pbnN0YW5jZSwgImEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlQW5kUmFuZG9tUGFkKEludDMyVHlwZS5pbnN0YW5jZSwgbnVsbCl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUJ1ZmZlcltdIHtkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICJhIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGx9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUJ1ZmZlcltdIHtkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlQW5kUmFuZG9tUGFkKEludDMyVHlwZS5pbnN0YW5jZSwgMCl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUJ1ZmZlcltdIHtkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlQW5kUmFuZG9tUGFkKEludDMyVHlwZS5pbnN0YW5jZSwgbnVsbCl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUJ1ZmZlcltdIHtkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQnVmZmVyW10ge251bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zZUFuZFJhbmRvbVBhZChJbnQzMlR5cGUuaW5zdGFuY2UsIDApfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVCdWZmZXJbXSB7bnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlQW5kUmFuZG9tUGFkKEludDMyVHlwZS5pbnN0YW5jZSwgbnVsbCl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUJ1ZmZlcltdIHtudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICBmb3IgKEJ5dGVCdWZmZXJbXSBpbnB1dDEgOiBpbnB1dHMpCisgICAgICAgICAgICBmb3IgKEJ5dGVCdWZmZXJbXSBpbnB1dDIgOiBpbnB1dHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0Q2x1c3RlcmluZ1BhaXJDb21wYXJlc1NhbWUoVVRGOFR5cGUuaW5zdGFuY2UsIEludDMyVHlwZS5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDFbMF0sIGlucHV0MVsxXSwgaW5wdXQyWzBdLCBpbnB1dDJbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQsIHYpIC0+IChCeXRlQnVmZmVyKSB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0MVswXSAhPSBudWxsICYmIGlucHV0MVsxXSAhPSBudWxsICYmIGlucHV0MlswXSAhPSBudWxsICYmIGlucHV0MlsxXSAhPSBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsc0luQ2x1c3RlcmluZ0xlZ2FjeSgpCisgICAgeworICAgICAgICAvLyB2ZXJpZnkgdGhlIGxlZ2FjeSBlbmNvZGluZyB0cmVhdHMgbnVsbCBjbHVzdGVyaW5nIHRoZSBzYW1lIGFzIG51bGwgdmFsdWUKKyAgICAgICAgQ2x1c3RlcmluZ1ByZWZpeDxCeXRlQnVmZmVyPiBhTnVsbCA9IG1ha2VCb3VuZChDbHVzdGVyaW5nUHJlZml4LktpbmQuQ0xVU1RFUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICJhIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlQW5kUmFuZG9tUGFkKEludDMyVHlwZS5pbnN0YW5jZSwgbnVsbCkpOworICAgICAgICBDbHVzdGVyaW5nUHJlZml4PEJ5dGVCdWZmZXI+IGFFbXB0eSA9IG1ha2VCb3VuZChDbHVzdGVyaW5nUHJlZml4LktpbmQuQ0xVU1RFUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlQW5kUmFuZG9tUGFkKFVURjhUeXBlLmluc3RhbmNlLCAiYSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcCA9IG5ldyBDbHVzdGVyaW5nQ29tcGFyYXRvcihVVEY4VHlwZS5pbnN0YW5jZSwgSW50MzJUeXBlLmluc3RhbmNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoY29tcC5hc0J5dGVDb21wYXJhYmxlKGFOdWxsKSwgY29tcC5hc0J5dGVDb21wYXJhYmxlKGFFbXB0eSksIFZlcnNpb24uTEVHQUNZKSk7CisgICAgICAgIENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBSZXZlcnNlZCA9IG5ldyBDbHVzdGVyaW5nQ29tcGFyYXRvcihVVEY4VHlwZS5pbnN0YW5jZSwgUmV2ZXJzZWRUeXBlLmdldEluc3RhbmNlKEludDMyVHlwZS5pbnN0YW5jZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgQnl0ZUNvbXBhcmFibGUuY29tcGFyZShjb21wUmV2ZXJzZWQuYXNCeXRlQ29tcGFyYWJsZShhTnVsbCksIGNvbXBSZXZlcnNlZC5hc0J5dGVDb21wYXJhYmxlKGFFbXB0eSksIFZlcnNpb24uTEVHQUNZKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlDbHVzdGVyaW5nKCkKKyAgICB7CisgICAgICAgIGFzc2VydEVtcHR5Q29tcGFyZWRUb1N0YXRpYygxLCBDbHVzdGVyaW5nUHJlZml4LktpbmQuQ0xVU1RFUklORywgVmVyc2lvbi5PU1M1MCk7CisgICAgICAgIGFzc2VydEVtcHR5Q29tcGFyZWRUb1N0YXRpYygwLCBDbHVzdGVyaW5nUHJlZml4LktpbmQuU1RBVElDX0NMVVNURVJJTkcsIFZlcnNpb24uT1NTNTApOworICAgICAgICBhc3NlcnRFbXB0eUNvbXBhcmVkVG9TdGF0aWMoMSwgQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLklOQ0xfU1RBUlRfQk9VTkQsIFZlcnNpb24uT1NTNTApOworICAgICAgICBhc3NlcnRFbXB0eUNvbXBhcmVkVG9TdGF0aWMoMSwgQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLklOQ0xfRU5EX0JPVU5ELCBWZXJzaW9uLk9TUzUwKTsKKworICAgICAgICBhc3NlcnRFbXB0eUNvbXBhcmVkVG9TdGF0aWMoMSwgQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLkNMVVNURVJJTkcsIFZlcnNpb24uTEVHQUNZKTsKKyAgICAgICAgYXNzZXJ0RW1wdHlDb21wYXJlZFRvU3RhdGljKDAsIENsdXN0ZXJpbmdQcmVmaXguS2luZC5TVEFUSUNfQ0xVU1RFUklORywgVmVyc2lvbi5MRUdBQ1kpOworICAgICAgICBhc3NlcnRFbXB0eUNvbXBhcmVkVG9TdGF0aWMoLTEsIENsdXN0ZXJpbmdQcmVmaXguS2luZC5JTkNMX1NUQVJUX0JPVU5ELCBWZXJzaW9uLkxFR0FDWSk7CisgICAgICAgIGFzc2VydEVtcHR5Q29tcGFyZWRUb1N0YXRpYygxLCBDbHVzdGVyaW5nUHJlZml4LktpbmQuSU5DTF9FTkRfQk9VTkQsIFZlcnNpb24uTEVHQUNZKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RW1wdHlDb21wYXJlZFRvU3RhdGljKGludCBleHBlY3RlZCwgQ2x1c3RlcmluZ1ByZWZpeC5LaW5kIGtpbmQsIFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Qnl0ZUJ1ZmZlcj4gZW1wdHkgPSBtYWtlQm91bmQoa2luZCk7CisgICAgICAgIENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBFbXB0eSA9IG5ldyBDbHVzdGVyaW5nQ29tcGFyYXRvcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEludGVnZXIuc2lnbnVtKEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoY29tcEVtcHR5LmFzQnl0ZUNvbXBhcmFibGUoZW1wdHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcEVtcHR5LmFzQnl0ZUNvbXBhcmFibGUoQ2x1c3RlcmluZy5TVEFUSUNfQ0xVU1RFUklORyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uKSkpOworICAgIH0KKworICAgIHZvaWQgYXNzZXJ0Q2x1c3RlcmluZ1BhaXJDb21wYXJlc1NhbWUoQWJzdHJhY3RUeXBlPD8+IHQxLCBBYnN0cmFjdFR5cGU8Pz4gdDIsIE9iamVjdCBvMSwgT2JqZWN0IG8yLCBPYmplY3QgbzMsIE9iamVjdCBvNCkKKyAgICB7CisgICAgICAgIGFzc2VydENsdXN0ZXJpbmdQYWlyQ29tcGFyZXNTYW1lKHQxLCB0MiwgbzEsIG8yLCBvMywgbzQsIEFic3RyYWN0VHlwZTo6ZGVjb21wb3NlLCB0cnVlKTsKKyAgICB9CisKKyAgICB2b2lkIGFzc2VydENsdXN0ZXJpbmdQYWlyQ29tcGFyZXNTYW1lKEFic3RyYWN0VHlwZTw/PiB0MSwgQWJzdHJhY3RUeXBlPD8+IHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG8xLCBPYmplY3QgbzIsIE9iamVjdCBvMywgT2JqZWN0IG80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlGdW5jdGlvbjxBYnN0cmFjdFR5cGUsIE9iamVjdCwgQnl0ZUJ1ZmZlcj4gZGVjb21wb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB0ZXN0TGVnYWN5KQorICAgIHsKKyAgICAgICAgRW51bVNldDxDbHVzdGVyaW5nUHJlZml4LktpbmQ+IHNraXBwZWRLaW5kcyA9IEVudW1TZXQub2YoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLlNTVEFCTEVfTE9XRVJfQk9VTkQsIENsdXN0ZXJpbmdQcmVmaXguS2luZC5TU1RBQkxFX1VQUEVSX0JPVU5EKTsKKyAgICAgICAgZm9yIChWZXJzaW9uIHYgOiBWZXJzaW9uLnZhbHVlcygpKQorICAgICAgICAgICAgZm9yIChDbHVzdGVyaW5nUHJlZml4LktpbmQgazEgOiBFbnVtU2V0LmNvbXBsZW1lbnRPZihza2lwcGVkS2luZHMpKQorICAgICAgICAgICAgICAgIGZvciAoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kIGsyIDogRW51bVNldC5jb21wbGVtZW50T2Yoc2tpcHBlZEtpbmRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghdGVzdExlZ2FjeSAmJiB2ID09IFZlcnNpb24uTEVHQUNZKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcCA9IG5ldyBDbHVzdGVyaW5nQ29tcGFyYXRvcih0MSwgdDIpOworICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyW10gYiA9IG5ldyBCeXRlQnVmZmVyWzJdOworICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyW10gZCA9IG5ldyBCeXRlQnVmZmVyWzJdOworICAgICAgICAgICAgICAgICAgICBiWzBdID0gZGVjb21wb3NlLmFwcGx5KHQxLCBvMSk7CisgICAgICAgICAgICAgICAgICAgIGJbMV0gPSBkZWNvbXBvc2UuYXBwbHkodDIsIG8yKTsKKyAgICAgICAgICAgICAgICAgICAgZFswXSA9IGRlY29tcG9zZS5hcHBseSh0MSwgbzMpOworICAgICAgICAgICAgICAgICAgICBkWzFdID0gZGVjb21wb3NlLmFwcGx5KHQyLCBvNCk7CisgICAgICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Qnl0ZUJ1ZmZlcj4gYyA9IG1ha2VCb3VuZChrMSwgYik7CisgICAgICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Qnl0ZUJ1ZmZlcj4gZSA9IG1ha2VCb3VuZChrMiwgZCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJ5dGVDb21wYXJhYmxlIGJzYyA9IGNvbXAuYXNCeXRlQ29tcGFyYWJsZShjKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQnl0ZUNvbXBhcmFibGUgYnNlID0gY29tcC5hc0J5dGVDb21wYXJhYmxlKGUpOworICAgICAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWQgPSBJbnRlZ2VyLnNpZ251bShjb21wLmNvbXBhcmUoYywgZSkpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiRmFpbGVkIGNvbXBhcmluZyAlcyBhbmQgJXMsICVzIHZzICVzIHZlcnNpb24gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlU3RyKGMuY2x1c3RlcmluZ1N0cmluZyhjb21wLnN1YnR5cGVzKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVN0cihlLmNsdXN0ZXJpbmdTdHJpbmcoY29tcC5zdWJ0eXBlcygpKSksIGJzYywgYnNlLCB2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLCBJbnRlZ2VyLnNpZ251bShCeXRlQ29tcGFyYWJsZS5jb21wYXJlKGJzYywgYnNlLCB2KSkpOworICAgICAgICAgICAgICAgICAgICBtYXliZUNoZWNrNDFQcm9wZXJ0aWVzKGV4cGVjdGVkLCBic2MsIGJzZSwgdik7CisgICAgICAgICAgICAgICAgICAgIG1heWJlQXNzZXJ0Tm90UHJlZml4KGJzYywgYnNlLCB2KTsKKworICAgICAgICAgICAgICAgICAgICBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wUiA9IG5ldyBDbHVzdGVyaW5nQ29tcGFyYXRvcihSZXZlcnNlZFR5cGUuZ2V0SW5zdGFuY2UodDEpLCBSZXZlcnNlZFR5cGUuZ2V0SW5zdGFuY2UodDIpKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQnl0ZUNvbXBhcmFibGUgYnNyYyA9IGNvbXBSLmFzQnl0ZUNvbXBhcmFibGUoYyk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJ5dGVDb21wYXJhYmxlIGJzcmUgPSBjb21wUi5hc0J5dGVDb21wYXJhYmxlKGUpOworICAgICAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRSID0gSW50ZWdlci5zaWdudW0oY29tcFIuY29tcGFyZShjLCBlKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJGYWlsZWQgY29tcGFyaW5nIHJldmVyc2VkICVzIGFuZCAlcywgJXMgdnMgJXMgdmVyc2lvbiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVTdHIoYy5jbHVzdGVyaW5nU3RyaW5nKGNvbXAuc3VidHlwZXMoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlU3RyKGUuY2x1c3RlcmluZ1N0cmluZyhjb21wLnN1YnR5cGVzKCkpKSwgYnNyYywgYnNyZSwgdiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFIsIEludGVnZXIuc2lnbnVtKEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoYnNyYywgYnNyZSwgdikpKTsKKyAgICAgICAgICAgICAgICAgICAgbWF5YmVDaGVjazQxUHJvcGVydGllcyhleHBlY3RlZFIsIGJzcmMsIGJzcmUsIHYpOworICAgICAgICAgICAgICAgICAgICBtYXliZUFzc2VydE5vdFByZWZpeChic3JjLCBic3JlLCB2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIENsdXN0ZXJpbmdQcmVmaXg8Qnl0ZUJ1ZmZlcj4gbWFrZUJvdW5kKENsdXN0ZXJpbmdQcmVmaXguS2luZCBrMSwgQnl0ZUJ1ZmZlci4uLiBiKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1ha2VCb3VuZChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UuZmFjdG9yeSgpLCBrMSwgYik7CisgICAgfQorCisgICAgc3RhdGljIDxUPiBDbHVzdGVyaW5nUHJlZml4PFQ+IG1ha2VCb3VuZChWYWx1ZUFjY2Vzc29yLk9iamVjdEZhY3Rvcnk8VD4gZmFjdG9yeSwgQ2x1c3RlcmluZ1ByZWZpeC5LaW5kIGsxLCBUW10gYikKKyAgICB7CisgICAgICAgIHN3aXRjaCAoazEpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBJTkNMX0VORF9FWENMX1NUQVJUX0JPVU5EQVJZOgorICAgICAgICBjYXNlIEVYQ0xfRU5EX0lOQ0xfU1RBUlRfQk9VTkRBUlk6CisgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5ib3VuZGFyeShrMSwgYik7CisKKyAgICAgICAgY2FzZSBJTkNMX0VORF9CT1VORDoKKyAgICAgICAgY2FzZSBFWENMX0VORF9CT1VORDoKKyAgICAgICAgY2FzZSBJTkNMX1NUQVJUX0JPVU5EOgorICAgICAgICBjYXNlIEVYQ0xfU1RBUlRfQk9VTkQ6CisgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5ib3VuZChrMSwgYik7CisKKyAgICAgICAgY2FzZSBDTFVTVEVSSU5HOgorICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkuY2x1c3RlcmluZyhiKTsKKworICAgICAgICBjYXNlIFNUQVRJQ19DTFVTVEVSSU5HOgorICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnkuc3RhdGljQ2x1c3RlcmluZygpOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoazEpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHVwbGVUeXBlKCkKKyAgICB7CisgICAgICAgIFJhbmRvbSByYW5kID0gVGhyZWFkTG9jYWxSYW5kb20uY3VycmVudCgpOworICAgICAgICB0ZXN0Q29tYmluYXRpb25TYW1wbGluZyhyYW5kLCB0aGlzOjphc3NlcnRUdXBsZUNvbXBhcmVzU2FtZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHVwbGVUeXBlTm9uRnVsbCgpCisgICAgeworICAgICAgICBUdXBsZVR5cGUgdHQgPSBuZXcgVHVwbGVUeXBlKEltbXV0YWJsZUxpc3Qub2YoVVRGOFR5cGUuaW5zdGFuY2UsIEludDMyVHlwZS5pbnN0YW5jZSkpOworICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IHRlc3RzID0gSW1tdXRhYmxlTGlzdC5vZgorICAgICAgICAgICAgKAorICAgICAgICAgICAgVHVwbGVUeXBlLmJ1aWxkVmFsdWUoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlQW5kUmFuZG9tUGFkKFVURjhUeXBlLmluc3RhbmNlLCAiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VBbmRSYW5kb21QYWQoSW50MzJUeXBlLmluc3RhbmNlLCAwKSksCisgICAgICAgICAgICAvLyBOb3RlOiBhIGRlY29tcG9zZWQgbnVsbCAoZS5nLiBkZWNvbXBvc2VBbmRSYW5kb21QYWQoSW50MzJUeXBlLmluc3RhbmNlLCBudWxsKSkgc2hvdWxkIG5vdCByZWFjaCBhIHR1cGxlCisgICAgICAgICAgICBUdXBsZVR5cGUuYnVpbGRWYWx1ZShCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpLAorICAgICAgICAgICAgVHVwbGVUeXBlLmJ1aWxkVmFsdWUoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zZUFuZFJhbmRvbVBhZChJbnQzMlR5cGUuaW5zdGFuY2UsIDApKSwKKyAgICAgICAgICAgIFR1cGxlVHlwZS5idWlsZFZhbHVlKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zZUFuZFJhbmRvbVBhZChVVEY4VHlwZS5pbnN0YW5jZSwgIiIpKSwKKyAgICAgICAgICAgIFR1cGxlVHlwZS5idWlsZFZhbHVlKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgKEJ5dGVCdWZmZXIpIG51bGwpLAorICAgICAgICAgICAgVHVwbGVUeXBlLmJ1aWxkVmFsdWUoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlKQorICAgICAgICAgICAgKTsKKyAgICAgICAgdGVzdEJ1ZmZlcnModHQsIHRlc3RzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUdXBsZU5ld0ZpZWxkKCkKKyAgICB7CisgICAgICAgIFR1cGxlVHlwZSB0MSA9IG5ldyBUdXBsZVR5cGUoSW1tdXRhYmxlTGlzdC5vZihVVEY4VHlwZS5pbnN0YW5jZSkpOworICAgICAgICBUdXBsZVR5cGUgdDIgPSBuZXcgVHVwbGVUeXBlKEltbXV0YWJsZUxpc3Qub2YoVVRGOFR5cGUuaW5zdGFuY2UsIEludDMyVHlwZS5pbnN0YW5jZSkpOworCisgICAgICAgIEJ5dGVCdWZmZXIgdk9uZSA9IFR1cGxlVHlwZS5idWlsZFZhbHVlKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlQW5kUmFuZG9tUGFkKFVURjhUeXBlLmluc3RhbmNlLCAic3RyIikpOworICAgICAgICBCeXRlQnVmZmVyIHZPbmVBbmROdWxsID0gVHVwbGVUeXBlLmJ1aWxkVmFsdWUoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlQW5kUmFuZG9tUGFkKFVURjhUeXBlLmluc3RhbmNlLCAic3RyIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKworICAgICAgICBCeXRlQ29tcGFyYWJsZSBiT25lMSA9IHR5cGVUb0NvbXBhcmFibGUodDEsIHZPbmUpOworICAgICAgICBCeXRlQ29tcGFyYWJsZSBiT25lMiA9IHR5cGVUb0NvbXBhcmFibGUodDIsIHZPbmUpOworICAgICAgICBCeXRlQ29tcGFyYWJsZSBiT25lQW5kTnVsbDIgPSB0eXBlVG9Db21wYXJhYmxlKHQyLCB2T25lQW5kTnVsbCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgYnl0ZS1jb21wYXJhYmxlIHZlcnNpb24gb2YgYSBvbmUtZmllbGQgdHVwbGUgbXVzdCBiZSB0aGUgc2FtZSBhcyBhIHR3by1maWVsZCB0dXBsZSB3aXRoIG5vbi1wcmVzZW50IHNlY29uZCBjb21wb25lbnQuIiwKKyAgICAgICAgICAgICAgICAgICAgIGJPbmUxLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVmVyc2lvbi5PU1M1MCksCisgICAgICAgICAgICAgICAgICAgICBiT25lMi5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKFZlcnNpb24uT1NTNTApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgYnl0ZS1jb21wYXJhYmxlIHZlcnNpb24gb2YgYSBvbmUtZmllbGQgdHVwbGUgbXVzdCBiZSB0aGUgc2FtZSBhcyBhIHR3by1maWVsZCB0dXBsZSB3aXRoIG51bGwgYXMgc2Vjb25kIGNvbXBvbmVudC4iLAorICAgICAgICAgICAgICAgICAgICAgYk9uZTEuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhWZXJzaW9uLk9TUzUwKSwKKyAgICAgICAgICAgICAgICAgICAgIGJPbmVBbmROdWxsMi5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKFZlcnNpb24uT1NTNTApKTsKKyAgICB9CisKKworICAgIHZvaWQgYXNzZXJ0VHVwbGVDb21wYXJlc1NhbWUoQWJzdHJhY3RUeXBlIHQxLCBBYnN0cmFjdFR5cGUgdDIsIE9iamVjdCBvMSwgT2JqZWN0IG8yLCBPYmplY3QgbzMsIE9iamVjdCBvNCkKKyAgICB7CisgICAgICAgIFR1cGxlVHlwZSB0dCA9IG5ldyBUdXBsZVR5cGUoSW1tdXRhYmxlTGlzdC5vZih0MSwgdDIpKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiMSA9IFR1cGxlVHlwZS5idWlsZFZhbHVlKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zZUZvclR1cGxlKHQxLCBvMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VGb3JUdXBsZSh0MiwgbzIpKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiMiA9IFR1cGxlVHlwZS5idWlsZFZhbHVlKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zZUZvclR1cGxlKHQxLCBvMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VGb3JUdXBsZSh0MiwgbzQpKTsKKyAgICAgICAgYXNzZXJ0Q29tcGFyZXNTYW1lQnVmZmVycyh0dCwgYjEsIGIyKTsKKyAgICB9CisKKyAgICBzdGF0aWMgPFQ+IEJ5dGVCdWZmZXIgZGVjb21wb3NlRm9yVHVwbGUoQWJzdHJhY3RUeXBlPFQ+IHQsIFQgbykKKyAgICB7CisgICAgICAgIHJldHVybiBvICE9IG51bGwgPyB0LmRlY29tcG9zZShvKSA6IG51bGw7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcG9zaXRlVHlwZSgpCisgICAgeworICAgICAgICBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oMCk7CisgICAgICAgIHRlc3RDb21iaW5hdGlvblNhbXBsaW5nKHJhbmQsIHRoaXM6OmFzc2VydENvbXBvc2l0ZUNvbXBhcmVzU2FtZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcG9zaXRlVHlwZU5vbkZ1bGwoKQorICAgIHsKKyAgICAgICAgQ29tcG9zaXRlVHlwZSB0dCA9IENvbXBvc2l0ZVR5cGUuZ2V0SW5zdGFuY2UoVVRGOFR5cGUuaW5zdGFuY2UsIEludDMyVHlwZS5pbnN0YW5jZSk7CisgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gdGVzdHMgPSBJbW11dGFibGVMaXN0Lm9mCisgICAgICAgICAgICAoCisgICAgICAgICAgICBDb21wb3NpdGVUeXBlLmJ1aWxkKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgZGVjb21wb3NlQW5kUmFuZG9tUGFkKFVURjhUeXBlLmluc3RhbmNlLCAiIiksIGRlY29tcG9zZUFuZFJhbmRvbVBhZChJbnQzMlR5cGUuaW5zdGFuY2UsIDApKSwKKyAgICAgICAgICAgIENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICIiKSwgZGVjb21wb3NlQW5kUmFuZG9tUGFkKEludDMyVHlwZS5pbnN0YW5jZSwgbnVsbCkpLAorICAgICAgICAgICAgQ29tcG9zaXRlVHlwZS5idWlsZChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIGRlY29tcG9zZUFuZFJhbmRvbVBhZChVVEY4VHlwZS5pbnN0YW5jZSwgIiIpKSwKKyAgICAgICAgICAgIENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlKSwKKyAgICAgICAgICAgIENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCB0cnVlLCBkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICIiKSksCisgICAgICAgICAgICBDb21wb3NpdGVUeXBlLmJ1aWxkKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSx0cnVlKQorICAgICAgICAgICAgKTsKKyAgICAgICAgZm9yIChCeXRlQnVmZmVyIGIgOiB0ZXN0cykKKyAgICAgICAgICAgIHR0LnZhbGlkYXRlKGIpOworICAgICAgICB0ZXN0QnVmZmVycyh0dCwgdGVzdHMpOworICAgIH0KKworICAgIHZvaWQgYXNzZXJ0Q29tcG9zaXRlQ29tcGFyZXNTYW1lKEFic3RyYWN0VHlwZSB0MSwgQWJzdHJhY3RUeXBlIHQyLCBPYmplY3QgbzEsIE9iamVjdCBvMiwgT2JqZWN0IG8zLCBPYmplY3QgbzQpCisgICAgeworICAgICAgICBDb21wb3NpdGVUeXBlIHR0ID0gQ29tcG9zaXRlVHlwZS5nZXRJbnN0YW5jZSh0MSwgdDIpOworICAgICAgICBCeXRlQnVmZmVyIGIxID0gQ29tcG9zaXRlVHlwZS5idWlsZChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIGRlY29tcG9zZUFuZFJhbmRvbVBhZCh0MSwgbzEpLCBkZWNvbXBvc2VBbmRSYW5kb21QYWQodDIsIG8yKSk7CisgICAgICAgIEJ5dGVCdWZmZXIgYjIgPSBDb21wb3NpdGVUeXBlLmJ1aWxkKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgZGVjb21wb3NlQW5kUmFuZG9tUGFkKHQxLCBvMyksIGRlY29tcG9zZUFuZFJhbmRvbVBhZCh0MiwgbzQpKTsKKyAgICAgICAgYXNzZXJ0Q29tcGFyZXNTYW1lQnVmZmVycyh0dCwgYjEsIGIyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljQ29tcG9zaXRlKCkKKyAgICB7CisgICAgICAgIER5bmFtaWNDb21wb3NpdGVUeXBlIHR0ID0gRHluYW1pY0NvbXBvc2l0ZVR5cGUuZ2V0SW5zdGFuY2UoRHluYW1pY0NvbXBvc2l0ZVR5cGVUZXN0LmFsaWFzZXMpOworICAgICAgICBVVUlEW10gdXVpZHMgPSBEeW5hbWljQ29tcG9zaXRlVHlwZVRlc3QudXVpZHM7CisgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gdGVzdHMgPSBJbW11dGFibGVMaXN0Lm9mCisgICAgICAgICAgICAoCisgICAgICAgICAgICBEeW5hbWljQ29tcG9zaXRlVHlwZVRlc3QuY3JlYXRlRHluYW1pY0NvbXBvc2l0ZUtleSgidGVzdDEiLCBudWxsLCAtMSwgZmFsc2UsIHRydWUpLAorICAgICAgICAgICAgRHluYW1pY0NvbXBvc2l0ZVR5cGVUZXN0LmNyZWF0ZUR5bmFtaWNDb21wb3NpdGVLZXkoInRlc3QxIiwgdXVpZHNbMF0sIDI0LCBmYWxzZSwgdHJ1ZSksCisgICAgICAgICAgICBEeW5hbWljQ29tcG9zaXRlVHlwZVRlc3QuY3JlYXRlRHluYW1pY0NvbXBvc2l0ZUtleSgidGVzdDEiLCB1dWlkc1swXSwgNDIsIGZhbHNlLCB0cnVlKSwKKyAgICAgICAgICAgIER5bmFtaWNDb21wb3NpdGVUeXBlVGVzdC5jcmVhdGVEeW5hbWljQ29tcG9zaXRlS2V5KCJ0ZXN0MiIsIHV1aWRzWzBdLCAtMSwgZmFsc2UsIHRydWUpLAorICAgICAgICAgICAgRHluYW1pY0NvbXBvc2l0ZVR5cGVUZXN0LmNyZWF0ZUR5bmFtaWNDb21wb3NpdGVLZXkoInRlc3QyIiwgdXVpZHNbMV0sIDQyLCBmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgICk7CisgICAgICAgIGZvciAoQnl0ZUJ1ZmZlciBiIDogdGVzdHMpCisgICAgICAgICAgICB0dC52YWxpZGF0ZShiKTsKKyAgICAgICAgdGVzdEJ1ZmZlcnModHQsIHRlc3RzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0VHlwZVN0cmluZygpCisgICAgeworICAgICAgICB0ZXN0Q29sbGVjdGlvbihMaXN0VHlwZS5nZXRJbnN0YW5jZShVVEY4VHlwZS5pbnN0YW5jZSwgdHJ1ZSksIHRlc3RTdHJpbmdzLCAoKSAtPiBuZXcgQXJyYXlMaXN0PD4oKSwgbmV3IFJhbmRvbSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0VHlwZUxvbmcoKQorICAgIHsKKyAgICAgICAgdGVzdENvbGxlY3Rpb24oTGlzdFR5cGUuZ2V0SW5zdGFuY2UoTG9uZ1R5cGUuaW5zdGFuY2UsIHRydWUpLCB0ZXN0TG9uZ3MsICgpIC0+IG5ldyBBcnJheUxpc3Q8PigpLCBuZXcgUmFuZG9tKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldFR5cGVTdHJpbmcoKQorICAgIHsKKyAgICAgICAgdGVzdENvbGxlY3Rpb24oU2V0VHlwZS5nZXRJbnN0YW5jZShVVEY4VHlwZS5pbnN0YW5jZSwgdHJ1ZSksIHRlc3RTdHJpbmdzLCAoKSAtPiBuZXcgSGFzaFNldDw+KCksIG5ldyBSYW5kb20oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0VHlwZUxvbmcoKQorICAgIHsKKyAgICAgICAgdGVzdENvbGxlY3Rpb24oU2V0VHlwZS5nZXRJbnN0YW5jZShMb25nVHlwZS5pbnN0YW5jZSwgdHJ1ZSksIHRlc3RMb25ncywgKCkgLT4gbmV3IEhhc2hTZXQ8PigpLCBuZXcgUmFuZG9tKCkpOworICAgIH0KKworICAgIDxULCBDVCBleHRlbmRzIENvbGxlY3Rpb248VD4+IHZvaWQgdGVzdENvbGxlY3Rpb24oQ29sbGVjdGlvblR5cGU8Q1Q+IHR0LCBUW10gdmFsdWVzLCBTdXBwbGllcjxDVD4gZ2VuLCBSYW5kb20gcmFuZCkKKyAgICB7CisgICAgICAgIGludCBjbnQgPSAwOworICAgICAgICBMaXN0PENUPiB0ZXN0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB0ZXN0cy5hZGQoZ2VuLmdldCgpKTsKKyAgICAgICAgZm9yIChpbnQgYyA9IDE7IGMgPD0gMzsgKytjKQorICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1OyArK2opCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ1QgbCA9IGdlbi5nZXQoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGM7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgbC5hZGQodmFsdWVzW2NudCsrICUgdmFsdWVzLmxlbmd0aF0pOworCisgICAgICAgICAgICAgICAgdGVzdHMuYWRkKGwpOworICAgICAgICAgICAgfQorICAgICAgICB0ZXN0VHlwZSh0dCwgdGVzdHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hcFR5cGVTdHJpbmdMb25nKCkKKyAgICB7CisgICAgICAgIHRlc3RNYXAoTWFwVHlwZS5nZXRJbnN0YW5jZShVVEY4VHlwZS5pbnN0YW5jZSwgTG9uZ1R5cGUuaW5zdGFuY2UsIHRydWUpLCB0ZXN0U3RyaW5ncywgdGVzdExvbmdzLCAoKSAtPiBuZXcgSGFzaE1hcDw+KCksIG5ldyBSYW5kb20oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFwVHlwZVN0cmluZ0xvbmdUcmVlKCkKKyAgICB7CisgICAgICAgIHRlc3RNYXAoTWFwVHlwZS5nZXRJbnN0YW5jZShVVEY4VHlwZS5pbnN0YW5jZSwgTG9uZ1R5cGUuaW5zdGFuY2UsIHRydWUpLCB0ZXN0U3RyaW5ncywgdGVzdExvbmdzLCAoKSAtPiBuZXcgVHJlZU1hcDw+KCksIG5ldyBSYW5kb20oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb3JhdGVkS2V5UHJlZml4ZXNWT1NTNTAoKQorICAgIHsKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgcGFzcyB3aXRoIHRoZSBPU1MgNC4xIGVuY29kaW5nCisgICAgICAgIHRlc3REZWNvcmF0ZWRLZXlQcmVmaXhlcyhWZXJzaW9uLk9TUzUwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvcmF0ZWRLZXlQcmVmaXhlc1ZMZWdhY3koKQorICAgIHsKKyAgICAgICAgLy8gLi4uIGFuZCBmYWlsIHdpdGggdGhlIGxlZ2FjeSBlbmNvZGluZworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgdGVzdERlY29yYXRlZEtleVByZWZpeGVzKFZlcnNpb24uTEVHQUNZKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQ29ycmVjdCBwYXRoLCB0ZXN0IGZhaWxpbmcuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQXNzZXJ0LmZhaWwoIlRlc3QgZXhwZWN0ZWQgdG8gZmFpbC4iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaXhlZExlbmd0aFdpdGhPZmZzZXQoKQorICAgIHsKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbXXsgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSB9OworCisgICAgICAgIEJ5dGVTb3VyY2Ugc291cmNlID0gQnl0ZVNvdXJjZS5maXhlZExlbmd0aChieXRlcywgMCwgMSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzb3VyY2UubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSwgc291cmNlLm5leHQoKSk7CisKKyAgICAgICAgc291cmNlID0gQnl0ZVNvdXJjZS5maXhlZExlbmd0aChieXRlcywgNCwgNSk7CisgICAgICAgIGFzc2VydEVxdWFscyg1LCBzb3VyY2UubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIHNvdXJjZS5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNywgc291cmNlLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg4LCBzb3VyY2UubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDksIHNvdXJjZS5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNLCBzb3VyY2UubmV4dCgpKTsKKworICAgICAgICBCeXRlU291cmNlLmZpeGVkTGVuZ3RoKGJ5dGVzLCA5LCAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSwgc291cmNlLm5leHQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rml4ZWRMZW5ndGhOZWdhdGl2ZUxlbmd0aCgpCisgICAgeworICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtdeyAxLCAyLCAzIH07CisKKyAgICAgICAgZXhwZWN0ZWRFeGNlcHRpb24uZXhwZWN0KElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIEJ5dGVTb3VyY2UuZml4ZWRMZW5ndGgoYnl0ZXMsIDAsIC0xKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaXhlZExlbmd0aE5lZ2F0aXZlT2Zmc2V0KCkKKyAgICB7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW117IDEsIDIsIDMgfTsKKworICAgICAgICBleHBlY3RlZEV4Y2VwdGlvbi5leHBlY3QoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgQnl0ZVNvdXJjZS5maXhlZExlbmd0aChieXRlcywgLTEsIDEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpeGVkTGVuZ3RoT3V0T2ZCb3VuZHMoKQorICAgIHsKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbXXsgMSwgMiwgMyB9OworCisgICAgICAgIGV4cGVjdGVkRXhjZXB0aW9uLmV4cGVjdChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICBCeXRlU291cmNlLmZpeGVkTGVuZ3RoKGJ5dGVzLCAwLCA0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaXhlZE9mZnNldE91dE9mQm91bmRzKCkKKyAgICB7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW117IDEsIDIsIDMgfTsKKworICAgICAgICBleHBlY3RlZEV4Y2VwdGlvbi5leHBlY3QoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgQnl0ZVNvdXJjZS5maXhlZExlbmd0aChieXRlcywgNCwgMSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VwYXJhdG9yR1QoKQorICAgIHsKKyAgICAgICAgdGVzdFNlcGFyYXRvcihCeXRlQ29tcGFyYWJsZTo6c2VwYXJhdG9yR3QsIHRlc3RMb25ncywgTG9uZ1R5cGUuaW5zdGFuY2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlcGFyYXRvclByZWZpeCgpCisgICAgeworICAgICAgICB0ZXN0U2VwYXJhdG9yKEJ5dGVDb21wYXJhYmxlOjpzZXBhcmF0b3JQcmVmaXgsIHRlc3RMb25ncywgTG9uZ1R5cGUuaW5zdGFuY2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlcGFyYXRvclByZWZpeFZpYURpZmZQb2ludCgpCisgICAgeworICAgICAgICB0ZXN0U2VwYXJhdG9yKCh4LCB5KSAtPiB2ZXJzaW9uIC0+IEJ5dGVTb3VyY2UuY3V0KHkuYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUuZGlmZlBvaW50KHgsIHksIHZlcnNpb24pKSwKKyAgICAgICAgICAgICAgICAgICAgICB0ZXN0TG9uZ3MsCisgICAgICAgICAgICAgICAgICAgICAgTG9uZ1R5cGUuaW5zdGFuY2UpOworICAgIH0KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXBhcmF0b3JOZXh0KCkKKyAgICB7CisgICAgICAgIC8vIEFwcGVuZGluZyBhIDAwIGJ5dGUgYXQgdGhlIGVuZCBnaXZlcyB0aGUgaW1tZWRpYXRlIG5leHQgcG9zc2libGUgdmFsdWUgYWZ0ZXIgeC4KKyAgICAgICAgdGVzdFNlcGFyYXRvcigoeCwgeSkgLT4gdmVyc2lvbiAtPiBCeXRlU291cmNlLmN1dE9yUmlnaHRQYWQoeC5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUubGVuZ3RoKHgsIHZlcnNpb24pICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCksCisgICAgICAgICAgICAgICAgICAgICAgdGVzdExvbmdzLAorICAgICAgICAgICAgICAgICAgICAgIExvbmdUeXBlLmluc3RhbmNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUPiB2b2lkIHRlc3RTZXBhcmF0b3IoQmlGdW5jdGlvbjxCeXRlQ29tcGFyYWJsZSwgQnl0ZUNvbXBhcmFibGUsIEJ5dGVDb21wYXJhYmxlPiBzZXBhcmF0b3JNZXRob2QsIFRbXSB0ZXN0VmFsdWVzLCBBYnN0cmFjdFR5cGU8VD4gdHlwZSkKKyAgICB7CisgICAgICAgIGZvciAoVCB2MSA6IHRlc3RWYWx1ZXMpCisgICAgICAgICAgICBmb3IgKFQgdjIgOiB0ZXN0VmFsdWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2MSA9PSBudWxsIHx8IHYyID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmICh0eXBlLmNvbXBhcmUodHlwZS5kZWNvbXBvc2UodjEpLCB0eXBlLmRlY29tcG9zZSh2MikpID49IDApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlIGJjMSA9IGdldEJ5dGVDb21wYXJhYmxlKHR5cGUsIHYxKTsKKyAgICAgICAgICAgICAgICBCeXRlQ29tcGFyYWJsZSBiYzIgPSBnZXRCeXRlQ29tcGFyYWJsZSh0eXBlLCB2Mik7CisgICAgICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUgc2VwYXJhdG9yID0gc2VwYXJhdG9yTWV0aG9kLmFwcGx5KGJjMSwgYmMyKTsKKworICAgICAgICAgICAgICAgIGZvciAoVmVyc2lvbiB2ZXJzaW9uIDogVmVyc2lvbi52YWx1ZXMoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJTYW5pdHkgY2hlY2sgZmFpbGVkIiwgQnl0ZUNvbXBhcmFibGUuY29tcGFyZShiYzEsIGJjMiwgdmVyc2lvbikgPCAwKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiU2VwYXJhdG9yICVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIGxlZnQgJXMgKGZvciAlcykgKHZlcnNpb24gJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3IuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyh2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYzEuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyh2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUuY29tcGFyZShiYzEsIHNlcGFyYXRvciwgdmVyc2lvbikgPCAwKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiU2VwYXJhdG9yICVzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHJpZ2h0ICVzIChmb3IgJXMpICh2ZXJzaW9uICVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcodmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmMyLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcodmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoc2VwYXJhdG9yLCBiYzIsIHZlcnNpb24pIDw9IDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIDxUPiBCeXRlQ29tcGFyYWJsZSBnZXRCeXRlQ29tcGFyYWJsZShBYnN0cmFjdFR5cGU8VD4gdHlwZSwgVCB2MSkKKyAgICB7CisgICAgICAgIHJldHVybiB2ZXJzaW9uIC0+IHR5cGUuYXNDb21wYXJhYmxlQnl0ZXModHlwZS5kZWNvbXBvc2UodjEpLCB2ZXJzaW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb3JhdGVkS2V5UHJlZml4ZXMoVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgdGVzdERlY29yYXRlZEtleVByZWZpeGVzKCIwMTIzNDU2NzhCQ0RFXDAiLCAiIiwgdmVyc2lvbik7CisgICAgICAgIHRlc3REZWNvcmF0ZWRLZXlQcmVmaXhlcygiMDEyMzQ1Njc4QUJDREVcMCIsICJBQkMiLCB2ZXJzaW9uKTsKKyAgICAgICAgdGVzdERlY29yYXRlZEtleVByZWZpeGVzKCIwMTIzNDU2Nzg5QUJDREVcMCIsICJcMEFCIiwgdmVyc2lvbik7CisgICAgICAgIHRlc3REZWNvcmF0ZWRLZXlQcmVmaXhlcygiMDEyMzQ1Njc4OUFCQ0RFRlwwIiwgIlwwIiwgdmVyc2lvbik7CisKKyAgICAgICAgdGVzdERlY29yYXRlZEtleVByZWZpeGVzKCIwMTIzNDU2Nzg5QUJDREVGMCIsICJBQkMiLCB2ZXJzaW9uKTsKKyAgICAgICAgdGVzdERlY29yYXRlZEtleVByZWZpeGVzKCIwMTIzNDU2Nzg5QUJDREVGIiwgIiIsIHZlcnNpb24pOworICAgICAgICB0ZXN0RGVjb3JhdGVkS2V5UHJlZml4ZXMoIjAxMjM0NTY3ODlBQkNERSIsICIiLCB2ZXJzaW9uKTsKKyAgICAgICAgdGVzdERlY29yYXRlZEtleVByZWZpeGVzKCIwMTIzNDU2Nzg5QUJDRCIsICJcMEFCIiwgdmVyc2lvbik7CisgICAgICAgIHRlc3REZWNvcmF0ZWRLZXlQcmVmaXhlcygiMDEyMzQ1Njc4OUFCQyIsICJcMCIsIHZlcnNpb24pOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlY29yYXRlZEtleVByZWZpeGVzKFN0cmluZyBrZXksIFN0cmluZyBhcHBlbmQsIFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIGxvZ2dlci5pbmZvKCJUZXN0aW5nIHt9ICsge30iLCBzYWZlU3RyKGtleSksIHNhZmVTdHIoYXBwZW5kKSk7CisgICAgICAgIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IE11cm11cjNQYXJ0aXRpb25lci5pbnN0YW5jZTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBvcmlnaW5hbCA9IEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKGtleSk7CisgICAgICAgIEJ5dGVCdWZmZXIgY29sbGlzaW9uID0gVXRpbC5nZW5lcmF0ZU11cm11ckNvbGxpc2lvbihvcmlnaW5hbCwgYXBwZW5kLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKworICAgICAgICBsb25nW10gaGFzaCA9IG5ldyBsb25nWzJdOworICAgICAgICBNdXJtdXJIYXNoLmhhc2gzX3g2NF8xMjgob3JpZ2luYWwsIDAsIG9yaWdpbmFsLmxpbWl0KCksIDAsIGhhc2gpOworICAgICAgICBsb2dnZXIuaW5mbyhTdHJpbmcuZm9ybWF0KCJPcmlnaW5hbCBoYXNoICAlMDE2eCwlMDE2eCIsIGhhc2hbMF0sIGhhc2hbMV0pKTsKKyAgICAgICAgTXVybXVySGFzaC5oYXNoM194NjRfMTI4KGNvbGxpc2lvbiwgMCwgY29sbGlzaW9uLmxpbWl0KCksIDAsIGhhc2gpOworICAgICAgICBsb2dnZXIuaW5mbyhTdHJpbmcuZm9ybWF0KCJDb2xsaXNpb24gaGFzaCAlMDE2eCwlMDE2eCIsIGhhc2hbMF0sIGhhc2hbMV0pKTsKKworICAgICAgICBEZWNvcmF0ZWRLZXkga2sxID0gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkob3JpZ2luYWwpOworICAgICAgICBEZWNvcmF0ZWRLZXkga2syID0gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoY29sbGlzaW9uKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oInt9XG57fVxue31cbnt9Iiwga2sxLCBrazIsIGtrMS5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKHZlcnNpb24pLCBrazIuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyh2ZXJzaW9uKSk7CisKKyAgICAgICAgZmluYWwgQnl0ZVNvdXJjZSBzMSA9IGtrMS5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKTsKKyAgICAgICAgZmluYWwgQnl0ZVNvdXJjZSBzMiA9IGtrMi5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oInt9XG57fSIsIHMxLCBzMik7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgcmVwcmVzZW50YXRpb25zIGNvbXBhcmUgY29ycmVjdGx5CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTG9uZy5zaWdudW0oa2sxLmNvbXBhcmVUbyhrazIpKSwgQnl0ZUNvbXBhcmFibGUuY29tcGFyZShrazEsIGtrMiwgdmVyc2lvbikpOworICAgICAgICAvLyBzMSBtdXN0IG5vdCBiZSBhIHByZWZpeCBvZiBzMgorICAgICAgICBhc3NlcnROb3RQcmVmaXgoczEsIHMyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Tm90UHJlZml4KEJ5dGVTb3VyY2UgczEsIEJ5dGVTb3VyY2UgczIpCisgICAgeworICAgICAgICBpbnQgYzEsIGMyOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBjMSA9IHMxLm5leHQoKTsKKyAgICAgICAgICAgIGMyID0gczIubmV4dCgpOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChjMSA9PSBjMiAmJiBjMSAhPSBCeXRlU291cmNlLkVORF9PRl9TVFJFQU0pOworCisgICAgICAgIC8vIEVxdWFsIGlzIG9rCisgICAgICAgIGlmIChjMSA9PSBjMikKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90RXF1YWxzKCJCeXRlQ29tcGFyYWJsZSBpcyBhIHByZWZpeCBvZiBvdGhlciIsIEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSwgYzEpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90RXF1YWxzKCJCeXRlQ29tcGFyYWJsZSBpcyBhIHByZWZpeCBvZiBvdGhlciIsIEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSwgYzIpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGNvbXBhcmUoQnl0ZVNvdXJjZSBzMSwgQnl0ZVNvdXJjZSBzMikKKyAgICB7CisgICAgICAgIGludCBjMSwgYzI7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGMxID0gczEubmV4dCgpOworICAgICAgICAgICAgYzIgPSBzMi5uZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGMxID09IGMyICYmIGMxICE9IEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSk7CisKKyAgICAgICAgcmV0dXJuIEludGVnZXIuY29tcGFyZShjMSwgYzIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBtYXliZUFzc2VydE5vdFByZWZpeChCeXRlQ29tcGFyYWJsZSBzMSwgQnl0ZUNvbXBhcmFibGUgczIsIFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIGlmICh2ZXJzaW9uID09IFZlcnNpb24uT1NTNTApCisgICAgICAgICAgICBhc3NlcnROb3RQcmVmaXgoczEuYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbiksIHMyLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWF5YmVDaGVjazQxUHJvcGVydGllcyhpbnQgZXhwZWN0ZWRDb21wYXJpc29uLCBCeXRlQ29tcGFyYWJsZSBzMSwgQnl0ZUNvbXBhcmFibGUgczIsIFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIGlmICh2ZXJzaW9uICE9IFZlcnNpb24uT1NTNTApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKHMxID09IG51bGwgfHwgczIgPT0gbnVsbCB8fCAwID09IGV4cGVjdGVkQ29tcGFyaXNvbikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaW50IGIxID0gcmFuZG9tVGVybWluYXRvcigpOworICAgICAgICBpbnQgYjIgPSByYW5kb21UZXJtaW5hdG9yKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJDb21wYXJpc29uIGZhaWxlZCBmb3IgJXMoJXMgKyAlMDJ4KSBhbmQgJXMoJXMgKyAlMDJ4KSIsIHMxLCBzMS5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKHZlcnNpb24pLCBiMSwgczIsIHMyLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcodmVyc2lvbiksIGIyKSwKKyAgICAgICAgICAgICAgICBleHBlY3RlZENvbXBhcmlzb24sIEludGVnZXIuc2lnbnVtKGNvbXBhcmUoQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvcihiMSwgczEuYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbikpLCBCeXRlU291cmNlLndpdGhUZXJtaW5hdG9yKGIyLCBzMi5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSkpKSk7CisgICAgICAgIGFzc2VydE5vdFByZWZpeChCeXRlU291cmNlLndpdGhUZXJtaW5hdG9yKGIxLCBzMS5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSksIEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IoYjIsIHMyLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgcmFuZG9tVGVybWluYXRvcigpCisgICAgeworICAgICAgICBpbnQgdGVybTsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgdGVybSA9IFRocmVhZExvY2FsUmFuZG9tLmN1cnJlbnQoKS5uZXh0SW50KEJ5dGVTb3VyY2UuTUlOX1NFUEFSQVRPUiwgQnl0ZVNvdXJjZS5NQVhfU0VQQVJBVE9SICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKHRlcm0gPj0gQnl0ZVNvdXJjZS5NSU5fTkVYVF9DT01QT05FTlQgJiYgdGVybSA8PSBCeXRlU291cmNlLk1BWF9ORVhUX0NPTVBPTkVOVCk7CisgICAgICAgIHJldHVybiB0ZXJtOworICAgIH0KKworICAgIDxLLCBWLCBNIGV4dGVuZHMgTWFwPEssIFY+PiB2b2lkIHRlc3RNYXAoTWFwVHlwZTxLLCBWPiB0dCwgS1tdIGtleXMsIFZbXSB2YWx1ZXMsIFN1cHBsaWVyPE0+IGdlbiwgUmFuZG9tIHJhbmQpCisgICAgeworICAgICAgICBMaXN0PE0+IHRlc3RzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHRlc3RzLmFkZChnZW4uZ2V0KCkpOworICAgICAgICBmb3IgKGludCBjID0gMTsgYyA8PSAzOyArK2MpCisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7ICsraikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNIGwgPSBnZW4uZ2V0KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjOyArK2kpCisgICAgICAgICAgICAgICAgICAgIGwucHV0KGtleXNbcmFuZC5uZXh0SW50KGtleXMubGVuZ3RoKV0sIHZhbHVlc1tyYW5kLm5leHRJbnQodmFsdWVzLmxlbmd0aCldKTsKKworICAgICAgICAgICAgICAgIHRlc3RzLmFkZChsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgdGVzdFR5cGUodHQsIHRlc3RzKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENvbnZlcnQgdHlwZSB0byBhIGNvbXBhcmFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBCeXRlQ29tcGFyYWJsZSB0eXBlVG9Db21wYXJhYmxlKEFic3RyYWN0VHlwZTw/PiB0eXBlLCBCeXRlQnVmZmVyIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCeXRlQ29tcGFyYWJsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmVyc2lvbiB2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLmFzQ29tcGFyYWJsZUJ5dGVzKHZhbHVlLCB2KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5nZXRTdHJpbmcodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyA8VD4gdm9pZCB0ZXN0VHlwZShBYnN0cmFjdFR5cGU8VD4gdHlwZSwgT2JqZWN0W10gdmFsdWVzKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUodHlwZSwgSXRlcmFibGVzLnRyYW5zZm9ybShBcnJheXMuYXNMaXN0KHZhbHVlcyksIHggLT4gKFQpIHgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQ+IHZvaWQgdGVzdFR5cGUoQWJzdHJhY3RUeXBlPD8gc3VwZXIgVD4gdHlwZSwgSXRlcmFibGU8VD4gdmFsdWVzKQorICAgIHsKKyAgICAgICAgZm9yIChUIGkgOiB2YWx1ZXMpIHsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgYiA9IGRlY29tcG9zZUFuZFJhbmRvbVBhZCh0eXBlLCBpKTsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJWYWx1ZSB7fSAoe30pIGJ5dGVzIHt9IEJ5dGVTb3VyY2Uge30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVN0cihpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVTdHIodHlwZS5nZXRTZXJpYWxpemVyKCkudG9DUUxMaXRlcmFsKGIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVTdHIoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlVG9Db21wYXJhYmxlKHR5cGUsIGIpLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVmVyc2lvbi5PU1M1MCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoVCBpIDogdmFsdWVzKQorICAgICAgICAgICAgZm9yIChUIGogOiB2YWx1ZXMpCisgICAgICAgICAgICAgICAgYXNzZXJ0Q29tcGFyZXNTYW1lKHR5cGUsIGksIGopOworICAgICAgICBpZiAoIXR5cGUuaXNSZXZlcnNlZCgpKQorICAgICAgICAgICAgdGVzdFR5cGUoUmV2ZXJzZWRUeXBlLmdldEluc3RhbmNlKHR5cGUpLCB2YWx1ZXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCdWZmZXJzKEFic3RyYWN0VHlwZTw/PiB0eXBlLCBMaXN0PEJ5dGVCdWZmZXI+IHZhbHVlcykKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgYiA6IHZhbHVlcykgeworICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJWYWx1ZSB7fSBieXRlcyB7fSBCeXRlU291cmNlIHt9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlU3RyKHR5cGUuZ2V0U2VyaWFsaXplcigpLnRvQ1FMTGl0ZXJhbChiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVN0cihCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KGIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlVG9Db21wYXJhYmxlKHR5cGUsIGIpLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVmVyc2lvbi5PU1M1MCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDb250aW51ZSB3aXRob3V0IGxpc3RpbmcgdmFsdWVzLgorICAgICAgICB9CisKKyAgICAgICAgZm9yIChCeXRlQnVmZmVyIGkgOiB2YWx1ZXMpCisgICAgICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgaiA6IHZhbHVlcykKKyAgICAgICAgICAgICAgICBhc3NlcnRDb21wYXJlc1NhbWVCdWZmZXJzKHR5cGUsIGksIGopOworICAgIH0KKworICAgIHZvaWQgYXNzZXJ0Q29tcGFyZXNTYW1lQnVmZmVycyhBYnN0cmFjdFR5cGU8Pz4gdHlwZSwgQnl0ZUJ1ZmZlciBiMSwgQnl0ZUJ1ZmZlciBiMikKKyAgICB7CisgICAgICAgIGludCBleHBlY3RlZCA9IEludGVnZXIuc2lnbnVtKHR5cGUuY29tcGFyZShiMSwgYjIpKTsKKyAgICAgICAgZmluYWwgQnl0ZUNvbXBhcmFibGUgYnMxID0gdHlwZVRvQ29tcGFyYWJsZSh0eXBlLCBiMSk7CisgICAgICAgIGZpbmFsIEJ5dGVDb21wYXJhYmxlIGJzMiA9IHR5cGVUb0NvbXBhcmFibGUodHlwZSwgYjIpOworCisgICAgICAgIGZvciAoVmVyc2lvbiB2ZXJzaW9uIDogVmVyc2lvbi52YWx1ZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGFjdHVhbCA9IEludGVnZXIuc2lnbnVtKEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoYnMxLCBiczIsIHZlcnNpb24pKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJGYWlsZWQgY29tcGFyaW5nICVzKCVzKSBhbmQgJXMoJXMpIiwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChiMSksIGJzMS5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKHZlcnNpb24pLCBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KGIyKSwgYnMyLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcodmVyc2lvbikpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCk7CisgICAgICAgICAgICBtYXliZUNoZWNrNDFQcm9wZXJ0aWVzKGV4cGVjdGVkLCBiczEsIGJzMiwgdmVyc2lvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb3JhdGVkS2V5cyhJUGFydGl0aW9uZXIgdHlwZSwgTGlzdDxCeXRlQnVmZmVyPiB2YWx1ZXMpCisgICAgeworICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgaSA6IHZhbHVlcykKKyAgICAgICAgICAgIGZvciAoQnl0ZUJ1ZmZlciBqIDogdmFsdWVzKQorICAgICAgICAgICAgICAgIGFzc2VydENvbXBhcmVzU2FtZURlY29yYXRlZEtleXModHlwZSwgaSwgaik7CisgICAgICAgIGZvciAoQnl0ZUJ1ZmZlciBpIDogdmFsdWVzKQorICAgICAgICAgICAgYXNzZXJ0RGVjb3JhdGVkS2V5Qm91bmRzKHR5cGUsIGkpOworICAgIH0KKworICAgIHZvaWQgYXNzZXJ0Q29tcGFyZXNTYW1lRGVjb3JhdGVkS2V5cyhJUGFydGl0aW9uZXIgdHlwZSwgQnl0ZUJ1ZmZlciBiMSwgQnl0ZUJ1ZmZlciBiMikKKyAgICB7CisgICAgICAgIERlY29yYXRlZEtleSBrMSA9IHR5cGUuZGVjb3JhdGVLZXkoYjEpOworICAgICAgICBEZWNvcmF0ZWRLZXkgazIgPSB0eXBlLmRlY29yYXRlS2V5KGIyKTsKKyAgICAgICAgaW50IGV4cGVjdGVkID0gSW50ZWdlci5zaWdudW0oazEuY29tcGFyZVRvKGsyKSk7CisKKyAgICAgICAgZm9yIChWZXJzaW9uIHZlcnNpb24gOiBWZXJzaW9uLnZhbHVlcygpKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYWN0dWFsID0gSW50ZWdlci5zaWdudW0oQnl0ZUNvbXBhcmFibGUuY29tcGFyZShrMSwgazIsIHZlcnNpb24pKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJGYWlsZWQgY29tcGFyaW5nICVzWyVzXSglcykgYW5kICVzWyVzXSglcylcbnBhcnRpdGlvbmVyICVzIHZlcnNpb24gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChiMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsxLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcodmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KGIyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgazIuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyh2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwpOworICAgICAgICAgICAgbWF5YmVBc3NlcnROb3RQcmVmaXgoazEsIGsyLCB2ZXJzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgYXNzZXJ0RGVjb3JhdGVkS2V5Qm91bmRzKElQYXJ0aXRpb25lciB0eXBlLCBCeXRlQnVmZmVyIGIpCisgICAgeworICAgICAgICBWZXJzaW9uIHZlcnNpb24gPSBWZXJzaW9uLk9TUzUwOworICAgICAgICBEZWNvcmF0ZWRLZXkgayA9IHR5cGUuZGVjb3JhdGVLZXkoYik7CisgICAgICAgIGZpbmFsIEJ5dGVDb21wYXJhYmxlIGFmdGVyID0gay5hc0NvbXBhcmFibGVCb3VuZChmYWxzZSk7CisgICAgICAgIGZpbmFsIEJ5dGVDb21wYXJhYmxlIGJlZm9yZSA9IGsuYXNDb21wYXJhYmxlQm91bmQodHJ1ZSk7CisKKyAgICAgICAgaW50IGFjdHVhbCA9IEludGVnZXIuc2lnbnVtKEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoaywgYmVmb3JlLCB2ZXJzaW9uKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJGYWlsZWQgY29tcGFyaW5nIGJvdW5kIGJlZm9yZSAoJXMpIGZvciAlc1slc10oJXMpXG5wYXJ0aXRpb25lciAlcyB2ZXJzaW9uICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcodmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyh2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgYWN0dWFsKTsKKyAgICAgICAgbWF5YmVBc3NlcnROb3RQcmVmaXgoaywgYmVmb3JlLCB2ZXJzaW9uKTsKKworICAgICAgICBhY3R1YWwgPSBJbnRlZ2VyLnNpZ251bShCeXRlQ29tcGFyYWJsZS5jb21wYXJlKGssIGFmdGVyLCB2ZXJzaW9uKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJGYWlsZWQgY29tcGFyaW5nIGJvdW5kIGFmdGVyICglcykgZm9yICVzWyVzXSglcylcbnBhcnRpdGlvbmVyICVzIHZlcnNpb24gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlci5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKHZlcnNpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KGIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcodmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24pLAorICAgICAgICAgICAgICAgICAgICAgLTEsCisgICAgICAgICAgICAgICAgICAgICBhY3R1YWwpOworICAgICAgICBtYXliZUFzc2VydE5vdFByZWZpeChrLCBhZnRlciwgdmVyc2lvbik7CisKKyAgICAgICAgYWN0dWFsID0gSW50ZWdlci5zaWdudW0oQnl0ZUNvbXBhcmFibGUuY29tcGFyZShiZWZvcmUsIGFmdGVyLCB2ZXJzaW9uKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJGYWlsZWQgY29tcGFyaW5nIGJvdW5kIGJlZm9yZSAoJXMpIHRvIGFmdGVyICglcykgZm9yICVzWyVzXSglcylcbnBhcnRpdGlvbmVyICVzIHZlcnNpb24gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyh2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyh2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgay5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKHZlcnNpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgIC0xLAorICAgICAgICAgICAgICAgICAgICAgYWN0dWFsKTsKKyAgICAgICAgbWF5YmVBc3NlcnROb3RQcmVmaXgoYWZ0ZXIsIGJlZm9yZSwgdmVyc2lvbik7CisgICAgfQorCisgICAgc3RhdGljIE9iamVjdCBzYWZlU3RyKE9iamVjdCBpKQorICAgIHsKKyAgICAgICAgaWYgKGkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBTdHJpbmcgcyA9IGkudG9TdHJpbmcoKTsKKyAgICAgICAgaWYgKHMubGVuZ3RoKCkgPiAxMDApCisgICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcoMCwgMTAwKSArICIuLi4iOworICAgICAgICByZXR1cm4gcy5yZXBsYWNlQWxsKCJcMCIsICI8MD4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQ+IHZvaWQgdGVzdERpcmVjdChGdW5jdGlvbjxULCBCeXRlU291cmNlPiBjb252ZXJ0b3IsIEJpRnVuY3Rpb248VCwgVCwgSW50ZWdlcj4gY29tcGFyYXRvciwgVFtdIHZhbHVlcykKKyAgICB7CisgICAgICAgIGZvciAoVCBpIDogdmFsdWVzKSB7CisgICAgICAgICAgICBpZiAoaSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBsb2dnZXIuaW5mbygiVmFsdWUge30gQnl0ZVNvdXJjZSB7fVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVTdHIoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0b3IuYXBwbHkoaSkpOworICAgICAgICB9CisgICAgICAgIGZvciAoVCBpIDogdmFsdWVzKQorICAgICAgICAgICAgaWYgKGkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmb3IgKFQgaiA6IHZhbHVlcykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGogIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydENvbXBhcmVzU2FtZShjb252ZXJ0b3IsIGNvbXBhcmF0b3IsIGksIGopOworICAgIH0KKworICAgIDxUPiB2b2lkIGFzc2VydENvbXBhcmVzU2FtZShGdW5jdGlvbjxULCBCeXRlU291cmNlPiBjb252ZXJ0b3IsIEJpRnVuY3Rpb248VCwgVCwgSW50ZWdlcj4gY29tcGFyYXRvciwgVCB2MSwgVCB2MikKKyAgICB7CisgICAgICAgIEJ5dGVDb21wYXJhYmxlIGIxID0gdiAtPiBjb252ZXJ0b3IuYXBwbHkodjEpOworICAgICAgICBCeXRlQ29tcGFyYWJsZSBiMiA9IHYgLT4gY29udmVydG9yLmFwcGx5KHYyKTsKKyAgICAgICAgaW50IGV4cGVjdGVkID0gSW50ZWdlci5zaWdudW0oY29tcGFyYXRvci5hcHBseSh2MSwgdjIpKTsKKyAgICAgICAgaW50IGFjdHVhbCA9IEludGVnZXIuc2lnbnVtKEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoYjEsIGIyLCBudWxsKSk7ICAvLyB2ZXJzaW9uIGlnbm9yZWQgYWJvdmUKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkZhaWxlZCBjb21wYXJpbmcgJXMgYW5kICVzIiwgdjEsIHYyKSwgZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgfQorCisgICAgPFQ+IHZvaWQgYXNzZXJ0Q29tcGFyZXNTYW1lKEFic3RyYWN0VHlwZTxUPiB0eXBlLCBUIHYxLCBUIHYyKQorICAgIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiMSA9IGRlY29tcG9zZUFuZFJhbmRvbVBhZCh0eXBlLCB2MSk7CisgICAgICAgIEJ5dGVCdWZmZXIgYjIgPSBkZWNvbXBvc2VBbmRSYW5kb21QYWQodHlwZSwgdjIpOworICAgICAgICBpbnQgZXhwZWN0ZWQgPSBJbnRlZ2VyLnNpZ251bSh0eXBlLmNvbXBhcmUoYjEsIGIyKSk7CisgICAgICAgIGZpbmFsIEJ5dGVDb21wYXJhYmxlIGJjMSA9IHR5cGVUb0NvbXBhcmFibGUodHlwZSwgYjEpOworICAgICAgICBmaW5hbCBCeXRlQ29tcGFyYWJsZSBiYzIgPSB0eXBlVG9Db21wYXJhYmxlKHR5cGUsIGIyKTsKKworICAgICAgICBmb3IgKFZlcnNpb24gdmVyc2lvbiA6IFZlcnNpb24udmFsdWVzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBhY3R1YWwgPSBJbnRlZ2VyLnNpZ251bShCeXRlQ29tcGFyYWJsZS5jb21wYXJlKGJjMSwgYmMyLCB2ZXJzaW9uKSk7CisgICAgICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gYWN0dWFsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzUmV2ZXJzZWQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBmb3IgcmV2ZXJzZSBvZiBudWxscyBhbmQgcHJlZml4ZXMuIENoZWNrIHRoYXQgaXQncyBvayB3aXRoaW4gbXVsdGktY29tcG9uZW50CisgICAgICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdDb21wYXJhdG9yIGNjID0gbmV3IENsdXN0ZXJpbmdDb21wYXJhdG9yKHR5cGUpOworICAgICAgICAgICAgICAgICAgICBCeXRlQ29tcGFyYWJsZSBjMSA9IGNjLmFzQnl0ZUNvbXBhcmFibGUoQ2x1c3RlcmluZy5tYWtlKGIxKSk7CisgICAgICAgICAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlIGMyID0gY2MuYXNCeXRlQ29tcGFyYWJsZShDbHVzdGVyaW5nLm1ha2UoYjIpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFjdHVhbGNjID0gSW50ZWdlci5zaWdudW0oQnl0ZUNvbXBhcmFibGUuY29tcGFyZShjMSwgYzIsIHZlcnNpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbGNjID09IGV4cGVjdGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiRmFpbGVkIGNvbXBhcmluZyByZXZlcnNlZCAlcyglcywgJXMpIGFuZCAlcyglcywgJXMpIGRpcmVjdCAoJWQpIGFuZCBhcyBjbHVzdGVyaW5nIiwgc2FmZVN0cih2MSksIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoYjEpLCBjMSwgc2FmZVN0cih2MiksIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoYjIpLCBjMiwgYWN0dWFsKSwgZXhwZWN0ZWQsIGFjdHVhbGNjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiRmFpbGVkIGNvbXBhcmluZyAlcyglcyBCQyAlcykgYW5kICVzKCVzIEJDICVzKSB2ZXJzaW9uICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVN0cih2MSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoYjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYzEuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyh2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVN0cih2MiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoYjIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYzIuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyh2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXliZUNoZWNrNDFQcm9wZXJ0aWVzKGV4cGVjdGVkLCBiYzEsIGJjMiwgdmVyc2lvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICA8VD4gQnl0ZUJ1ZmZlciBkZWNvbXBvc2VBbmRSYW5kb21QYWQoQWJzdHJhY3RUeXBlPFQ+IHR5cGUsIFQgdikKKyAgICB7CisgICAgICAgIEJ5dGVCdWZmZXIgYiA9IHR5cGUuZGVjb21wb3NlKHYpOworICAgICAgICBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oMCk7CisgICAgICAgIGludCBwYWRCZWZvcmUgPSByYW5kLm5leHRJbnQoMTYpOworICAgICAgICBpbnQgcGFkQWZ0ZXIgPSByYW5kLm5leHRJbnQoMTYpOworICAgICAgICBpbnQgcGFkZGVkQ2FwYWNpdHkgPSBiLnJlbWFpbmluZygpICsgcGFkQmVmb3JlICsgcGFkQWZ0ZXI7CisgICAgICAgIEJ5dGVCdWZmZXIgcGFkZGVkID0gYWxsb2NhdGVCdWZmZXIocGFkZGVkQ2FwYWNpdHkpOworICAgICAgICByYW5kLmludHMocGFkQmVmb3JlKS5mb3JFYWNoKHggLT4gcGFkZGVkLnB1dCgoYnl0ZSkgeCkpOworICAgICAgICBwYWRkZWQucHV0KGIuZHVwbGljYXRlKCkpOworICAgICAgICByYW5kLmludHMocGFkQWZ0ZXIpLmZvckVhY2goeCAtPiBwYWRkZWQucHV0KChieXRlKSB4KSk7CisgICAgICAgIHBhZGRlZC5jbGVhcigpLmxpbWl0KHBhZGRlZC5jYXBhY2l0eSgpIC0gcGFkQWZ0ZXIpLnBvc2l0aW9uKHBhZEJlZm9yZSk7CisgICAgICAgIHJldHVybiBwYWRkZWQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEJ5dGVCdWZmZXIgYWxsb2NhdGVCdWZmZXIoaW50IHBhZGRlZENhcGFjaXR5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXIuYWxsb2NhdGUocGFkZGVkQ2FwYWNpdHkpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvQnl0ZVNvdXJjZUNvbnZlcnNpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvQnl0ZVNvdXJjZUNvbnZlcnNpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlYTYxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9ieXRlY29tcGFyYWJsZS9CeXRlU291cmNlQ29udmVyc2lvblRlc3QuamF2YQpAQCAtMCwwICsxLDc4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGU7CisKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRMb2NhbFJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlGdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5CdWZmZXJEZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0NvbXBhcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ1ByZWZpeDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5CeXRlT3JkZXJlZFBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkxvY2FsUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lk11cm11cjNQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZG9tUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGUuVmVyc2lvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlQ29tcGFyaXNvblRlc3QuZGVjb21wb3NlRm9yVHVwbGU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIHRoYXQgdGhlIHJlc3VsdCBvZiBmb3J3YXJkICsgYmFja3dhcmQgQnl0ZVNvdXJjZSB0cmFuc2xhdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgb3JpZ2luYWwuCisgKi8KK3B1YmxpYyBjbGFzcyBCeXRlU291cmNlQ29udmVyc2lvblRlc3QgZXh0ZW5kcyBCeXRlU291cmNlVGVzdEJhc2UKK3sKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQnl0ZVNvdXJjZUNvbnZlcnNpb25UZXN0LmNsYXNzKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZlcnNpb24gVkVSU0lPTiA9IFZlcnNpb24uT1NTNTA7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBmaW5hbCBFeHBlY3RlZEV4Y2VwdGlvbiBleHBlY3RlZEV4Y2VwdGlvbiA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ3NBc2NpaSgpCisgICAgeworICAgICAgICB0ZXN0VHlwZShBc2NpaVR5cGUuaW5zdGFuY2UsIEFycmF5cy5zdHJlYW0odGVzdFN0cmluZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihzIC0+IHMuZXF1YWxzKG5ldyBTdHJpbmcocy5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVTX0FTQ0lJKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZENoYXJzZXRzLlVTX0FTQ0lJKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvQXJyYXkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nc1VURjgoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoVVRGOFR5cGUuaW5zdGFuY2UsIHRlc3RTdHJpbmdzKTsKKyAgICAgICAgdGVzdERpcmVjdCh4IC0+IEJ5dGVTb3VyY2Uub2YoeCwgVkVSU0lPTiksIEJ5dGVTb3VyY2VJbnZlcnNlOjpnZXRTdHJpbmcsIHRlc3RTdHJpbmdzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCb29sZWFucygpCisgICAgeworICAgICAgICB0ZXN0VHlwZShCb29sZWFuVHlwZS5pbnN0YW5jZSwgdGVzdEJvb2xzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRzKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKEludDMyVHlwZS5pbnN0YW5jZSwgdGVzdEludHMpOworICAgICAgICB0ZXN0RGlyZWN0KEJ5dGVTb3VyY2U6Om9mLCBCeXRlU291cmNlSW52ZXJzZTo6Z2V0U2lnbmVkSW50LCB0ZXN0SW50cyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByYW5kb21UZXN0SW50cygpCisgICAgeworICAgICAgICBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPDEwMDAwOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpMSA9IHJhbmQubmV4dEludCgpOworICAgICAgICAgICAgYXNzZXJ0Q29udmVydHNTYW1lKEludDMyVHlwZS5pbnN0YW5jZSwgaTEpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb25ncygpCisgICAgeworICAgICAgICB0ZXN0VHlwZShMb25nVHlwZS5pbnN0YW5jZSwgdGVzdExvbmdzKTsKKyAgICAgICAgdGVzdERpcmVjdChCeXRlU291cmNlOjpvZiwgQnl0ZVNvdXJjZUludmVyc2U6OmdldFNpZ25lZExvbmcsIHRlc3RMb25ncyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvcnRzKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKFNob3J0VHlwZS5pbnN0YW5jZSwgdGVzdFNob3J0cyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZXMoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoQnl0ZVR5cGUuaW5zdGFuY2UsIHRlc3RCeXRlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlcygpCisgICAgeworICAgICAgICB0ZXN0VHlwZShEb3VibGVUeXBlLmluc3RhbmNlLCB0ZXN0RG91Ymxlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmxvYXRzKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKEZsb2F0VHlwZS5pbnN0YW5jZSwgdGVzdEZsb2F0cyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmlnSW50cygpCisgICAgeworICAgICAgICB0ZXN0VHlwZShJbnRlZ2VyVHlwZS5pbnN0YW5jZSwgdGVzdEJpZ0ludHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJpZ0RlY2ltYWxzKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlQnVmZmVycyhEZWNpbWFsVHlwZS5pbnN0YW5jZSwgdGVzdEJpZ0RlY2ltYWxzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVVUlEcygpCisgICAgeworICAgICAgICB0ZXN0VHlwZShVVUlEVHlwZS5pbnN0YW5jZSwgdGVzdFVVSURzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lVVVJRHMoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoVGltZVVVSURUeXBlLmluc3RhbmNlLCBBcnJheXMuc3RyZWFtKHRlc3RVVUlEcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHggLT4geCA9PSBudWxsIHx8IHgudmVyc2lvbigpID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh4IC0+IHggIT0gbnVsbCA/IFRpbWVVVUlELmZyb21VdWlkKHgpIDogbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9BcnJheSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMZXhpY2FsVVVJRHMoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoTGV4aWNhbFVVSURUeXBlLmluc3RhbmNlLCB0ZXN0VVVJRHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZURhdGUoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoU2ltcGxlRGF0ZVR5cGUuaW5zdGFuY2UsIEFycmF5cy5zdHJlYW0odGVzdEludHMpLmZpbHRlcih4IC0+IHggIT0gbnVsbCkudG9BcnJheSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lVHlwZSgpCisgICAgeworICAgICAgICB0ZXN0VHlwZShUaW1lVHlwZS5pbnN0YW5jZSwgQXJyYXlzLnN0cmVhbSh0ZXN0TG9uZ3MpLmZpbHRlcih4IC0+IHggIT0gbnVsbCAmJiB4ID49IDAgJiYgeCA8PSAyNEwgKiA2MCAqIDYwICogMTAwMCAqIDEwMDAgKiAxMDAwKS50b0FycmF5KCkpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0ZVR5cGUoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoRGF0ZVR5cGUuaW5zdGFuY2UsIHRlc3REYXRlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZXN0YW1wVHlwZSgpCisgICAgeworICAgICAgICB0ZXN0VHlwZShUaW1lc3RhbXBUeXBlLmluc3RhbmNlLCB0ZXN0RGF0ZXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ5dGVzVHlwZSgpCisgICAgeworICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICBmb3IgKE9iamVjdCBvIDogdGVzdFZhbHVlc1tpXSkKKyAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKHRlc3RUeXBlc1tpXS5kZWNvbXBvc2UobykpOworCisgICAgICAgIHRlc3RUeXBlKEJ5dGVzVHlwZS5pbnN0YW5jZSwgdmFsdWVzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmV0QWRkcmVzc1R5cGUoKSB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRlc3RUeXBlKEluZXRBZGRyZXNzVHlwZS5pbnN0YW5jZSwgdGVzdEluZXRzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVR5cGUoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoRW1wdHlUeXBlLmluc3RhbmNlLCBuZXcgVm9pZFtdIHsgbnVsbCB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXRpdGlvbmVyRGVmaW5lZE9yZGVyKCkKKyAgICB7CisgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gdmFsdWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgIGZvciAoT2JqZWN0IG8gOiB0ZXN0VmFsdWVzW2ldKQorICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQodGVzdFR5cGVzW2ldLmRlY29tcG9zZShvKSk7CisKKyAgICAgICAgdGVzdEJ1ZmZlcnMobmV3IFBhcnRpdGlvbmVyRGVmaW5lZE9yZGVyKE11cm11cjNQYXJ0aXRpb25lci5pbnN0YW5jZSksIHZhbHVlcyk7CisgICAgICAgIHRlc3RCdWZmZXJzKG5ldyBQYXJ0aXRpb25lckRlZmluZWRPcmRlcihSYW5kb21QYXJ0aXRpb25lci5pbnN0YW5jZSksIHZhbHVlcyk7CisgICAgICAgIHRlc3RCdWZmZXJzKG5ldyBQYXJ0aXRpb25lckRlZmluZWRPcmRlcihCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLmluc3RhbmNlKSwgdmFsdWVzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXRpdGlvbmVyT3JkZXIoKQorICAgIHsKKyAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IHRlc3RWYWx1ZXNbaV0pCisgICAgICAgICAgICAgICAgdmFsdWVzLmFkZCh0ZXN0VHlwZXNbaV0uZGVjb21wb3NlKG8pKTsKKworICAgICAgICB0ZXN0RGVjb3JhdGVkS2V5cyhNdXJtdXIzUGFydGl0aW9uZXIuaW5zdGFuY2UsIHZhbHVlcyk7CisgICAgICAgIHRlc3REZWNvcmF0ZWRLZXlzKFJhbmRvbVBhcnRpdGlvbmVyLmluc3RhbmNlLCB2YWx1ZXMpOworICAgICAgICB0ZXN0RGVjb3JhdGVkS2V5cyhCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLmluc3RhbmNlLCB2YWx1ZXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2FsUGF0aXRpb25lck9yZGVyKCkKKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgQWJzdHJhY3RUeXBlIHRlc3RUeXBlID0gdGVzdFR5cGVzW2ldOworICAgICAgICAgICAgdGVzdERlY29yYXRlZEtleXMobmV3IExvY2FsUGFydGl0aW9uZXIodGVzdFR5cGUpLCBMaXN0cy50cmFuc2Zvcm0oQXJyYXlzLmFzTGlzdCh0ZXN0VmFsdWVzW2ldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiAtPiB0ZXN0VHlwZS5kZWNvbXBvc2UodikpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludGVyZmFjZSBQYWlyVGVzdGVyCisgICAgeworICAgICAgICB2b2lkIHRlc3QoQWJzdHJhY3RUeXBlIHQxLCBBYnN0cmFjdFR5cGUgdDIsIE9iamVjdCBvMSwgT2JqZWN0IG8yKTsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RDb21iaW5hdGlvblNhbXBsaW5nKFJhbmRvbSByYW5kLCBQYWlyVGVzdGVyIHRlc3RlcikKKyAgICB7CisgICAgICAgIGZvciAoaW50IGk9MDtpPHRlc3RUeXBlcy5sZW5ndGg7KytpKQorICAgICAgICAgICAgZm9yIChpbnQgaj0wO2o8dGVzdFR5cGVzLmxlbmd0aDsrK2opCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT2JqZWN0W10gdHYxID0gbmV3IE9iamVjdFszXTsKKyAgICAgICAgICAgICAgICBPYmplY3RbXSB0djIgPSBuZXcgT2JqZWN0WzNdOworICAgICAgICAgICAgICAgIGZvciAoaW50IHQ9MDsgdDx0djEubGVuZ3RoOyArK3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0djFbdF0gPSB0ZXN0VmFsdWVzW2ldW3JhbmQubmV4dEludCh0ZXN0VmFsdWVzW2ldLmxlbmd0aCldOworICAgICAgICAgICAgICAgICAgICB0djJbdF0gPSB0ZXN0VmFsdWVzW2pdW3JhbmQubmV4dEludCh0ZXN0VmFsdWVzW2pdLmxlbmd0aCldOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG8xIDogdHYxKQorICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBvMiA6IHR2MikKKworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGVzdGVyLnRlc3QodGVzdFR5cGVzW2ldLCB0ZXN0VHlwZXNbal0sIG8xLCBvMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbWJpbmF0aW9ucygpCisgICAgeworICAgICAgICBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oMCk7CisgICAgICAgIHRlc3RDb21iaW5hdGlvblNhbXBsaW5nKHJhbmQsIHRoaXM6OmFzc2VydENsdXN0ZXJpbmdQYWlyQ29udmVydHNTYW1lKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsc0luQ2x1c3RlcmluZygpCisgICAgeworICAgICAgICBCeXRlQnVmZmVyW11bXSBpbnB1dHMgPSBuZXcgQnl0ZUJ1ZmZlcltdW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUJ1ZmZlcltdIHtkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICJhIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zZUFuZFJhbmRvbVBhZChJbnQzMlR5cGUuaW5zdGFuY2UsIDApfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVCdWZmZXJbXSB7ZGVjb21wb3NlQW5kUmFuZG9tUGFkKFVURjhUeXBlLmluc3RhbmNlLCAiYSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VBbmRSYW5kb21QYWQoSW50MzJUeXBlLmluc3RhbmNlLCBudWxsKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQnVmZmVyW10ge2RlY29tcG9zZUFuZFJhbmRvbVBhZChVVEY4VHlwZS5pbnN0YW5jZSwgImEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQnVmZmVyW10ge2RlY29tcG9zZUFuZFJhbmRvbVBhZChVVEY4VHlwZS5pbnN0YW5jZSwgIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VBbmRSYW5kb21QYWQoSW50MzJUeXBlLmluc3RhbmNlLCAwKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQnVmZmVyW10ge2RlY29tcG9zZUFuZFJhbmRvbVBhZChVVEY4VHlwZS5pbnN0YW5jZSwgIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VBbmRSYW5kb21QYWQoSW50MzJUeXBlLmluc3RhbmNlLCBudWxsKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQnVmZmVyW10ge2RlY29tcG9zZUFuZFJhbmRvbVBhZChVVEY4VHlwZS5pbnN0YW5jZSwgIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVCdWZmZXJbXSB7bnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlQW5kUmFuZG9tUGFkKEludDMyVHlwZS5pbnN0YW5jZSwgMCl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUJ1ZmZlcltdIHtudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VBbmRSYW5kb21QYWQoSW50MzJUeXBlLmluc3RhbmNlLCBudWxsKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQnVmZmVyW10ge251bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGx9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICBmb3IgKEJ5dGVCdWZmZXJbXSBpbnB1dCA6IGlucHV0cykKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0Q2x1c3RlcmluZ1BhaXJDb252ZXJ0c1NhbWUoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGOFR5cGUuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQzMlR5cGUuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQsIHYpIC0+IChCeXRlQnVmZmVyKSB2KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5Q2x1c3RlcmluZygpCisgICAgeworICAgICAgICBWYWx1ZUFjY2Vzc29yPEJ5dGVCdWZmZXI+IGFjY2Vzc29yID0gQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlOworICAgICAgICBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wID0gbmV3IENsdXN0ZXJpbmdDb21wYXJhdG9yKCk7CisgICAgICAgIEVudW1TZXQ8Q2x1c3RlcmluZ1ByZWZpeC5LaW5kPiBza2lwcGVkS2luZHMgPSBFbnVtU2V0Lm9mKENsdXN0ZXJpbmdQcmVmaXguS2luZC5TU1RBQkxFX0xPV0VSX0JPVU5ELCBDbHVzdGVyaW5nUHJlZml4LktpbmQuU1NUQUJMRV9VUFBFUl9CT1VORCk7CisgICAgICAgIGZvciAoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kIGtpbmQgOiBFbnVtU2V0LmNvbXBsZW1lbnRPZihza2lwcGVkS2luZHMpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoa2luZC5pc0JvdW5kYXJ5KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Qnl0ZUJ1ZmZlcj4gZW1wdHkgPSBCeXRlU291cmNlQ29tcGFyaXNvblRlc3QubWFrZUJvdW5kKGtpbmQpOworICAgICAgICAgICAgQ2x1c3RlcmluZ1ByZWZpeDxCeXRlQnVmZmVyPiBjb252ZXJ0ZWQgPSBnZXRDbHVzdGVyaW5nUHJlZml4KGFjY2Vzc29yLCBraW5kLCBjb21wLCBjb21wLmFzQnl0ZUNvbXBhcmFibGUoZW1wdHkpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhlbXB0eSwgY29udmVydGVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgYXNzZXJ0Q2x1c3RlcmluZ1BhaXJDb252ZXJ0c1NhbWUoQWJzdHJhY3RUeXBlIHQxLCBBYnN0cmFjdFR5cGUgdDIsIE9iamVjdCBvMSwgT2JqZWN0IG8yKQorICAgIHsKKyAgICAgICAgZm9yIChWYWx1ZUFjY2Vzc29yPD8+IGFjY2Vzc29yIDogVmFsdWVBY2Nlc3NvcnMuQUNDRVNTT1JTKQorICAgICAgICAgICAgYXNzZXJ0Q2x1c3RlcmluZ1BhaXJDb252ZXJ0c1NhbWUoYWNjZXNzb3IsIHQxLCB0MiwgbzEsIG8yLCBBYnN0cmFjdFR5cGU6OmRlY29tcG9zZSk7CisgICAgfQorCisgICAgPFY+IHZvaWQgYXNzZXJ0Q2x1c3RlcmluZ1BhaXJDb252ZXJ0c1NhbWUoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdDEsIEFic3RyYWN0VHlwZTw/PiB0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbzEsIE9iamVjdCBvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaUZ1bmN0aW9uPEFic3RyYWN0VHlwZSwgT2JqZWN0LCBCeXRlQnVmZmVyPiBkZWNvbXBvc2UpCisgICAgeworICAgICAgICBib29sZWFuIGNoZWNrRXF1YWxzID0gdDEgIT0gRGVjaW1hbFR5cGUuaW5zdGFuY2UgJiYgdDIgIT0gRGVjaW1hbFR5cGUuaW5zdGFuY2U7CisgICAgICAgIEVudW1TZXQ8Q2x1c3RlcmluZ1ByZWZpeC5LaW5kPiBza2lwcGVkS2luZHMgPSBFbnVtU2V0Lm9mKENsdXN0ZXJpbmdQcmVmaXguS2luZC5TU1RBQkxFX0xPV0VSX0JPVU5ELCBDbHVzdGVyaW5nUHJlZml4LktpbmQuU1NUQUJMRV9VUFBFUl9CT1VORCk7CisgICAgICAgIGZvciAoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kIGsxIDogRW51bVNldC5jb21wbGVtZW50T2Yoc2tpcHBlZEtpbmRzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wID0gbmV3IENsdXN0ZXJpbmdDb21wYXJhdG9yKHQxLCB0Mik7CisgICAgICAgICAgICAgICAgVltdIGIgPSBhY2Nlc3Nvci5jcmVhdGVBcnJheSgyKTsKKyAgICAgICAgICAgICAgICBiWzBdID0gYWNjZXNzb3IudmFsdWVPZihkZWNvbXBvc2UuYXBwbHkodDEsIG8xKSk7CisgICAgICAgICAgICAgICAgYlsxXSA9IGFjY2Vzc29yLnZhbHVlT2YoZGVjb21wb3NlLmFwcGx5KHQyLCBvMikpOworICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Vj4gYyA9IEJ5dGVTb3VyY2VDb21wYXJpc29uVGVzdC5tYWtlQm91bmQoYWNjZXNzb3IuZmFjdG9yeSgpLCBrMSwgYik7CisgICAgICAgICAgICAgICAgZmluYWwgQnl0ZUNvbXBhcmFibGUgYnNjID0gY29tcC5hc0J5dGVDb21wYXJhYmxlKGMpOworICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJDbHVzdGVyaW5nIHt9IGJ5dGVzb3VyY2Uge30iLCBjLmNsdXN0ZXJpbmdTdHJpbmcoY29tcC5zdWJ0eXBlcygpKSwgYnNjLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVkVSU0lPTikpOworICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Vj4gY29udmVydGVkID0gZ2V0Q2x1c3RlcmluZ1ByZWZpeChhY2Nlc3NvciwgazEsIGNvbXAsIGJzYyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkZhaWxlZCBjb21wYXJlKCVzLCBjb252ZXJ0ZWQgJXMgQnl0ZVNvdXJjZSAlcykgPT0gMFxudHlwZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVN0cihjLmNsdXN0ZXJpbmdTdHJpbmcoY29tcC5zdWJ0eXBlcygpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVN0cihjb252ZXJ0ZWQuY2x1c3RlcmluZ1N0cmluZyhjb21wLnN1YnR5cGVzKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic2MuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhWRVJTSU9OKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgY29tcC5jb21wYXJlKGMsIGNvbnZlcnRlZCkpOworICAgICAgICAgICAgICAgIGlmIChjaGVja0VxdWFscykKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkZhaWxlZCBlcXVhbHMgJXMsIGdvdCAlcyBCeXRlU291cmNlICVzXG50eXBlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVN0cihjLmNsdXN0ZXJpbmdTdHJpbmcoY29tcC5zdWJ0eXBlcygpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVTdHIoY29udmVydGVkLmNsdXN0ZXJpbmdTdHJpbmcoY29tcC5zdWJ0eXBlcygpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzYy5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKFZFUlNJT04pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsIGNvbnZlcnRlZCk7CisKKyAgICAgICAgICAgICAgICBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wUiA9IG5ldyBDbHVzdGVyaW5nQ29tcGFyYXRvcihSZXZlcnNlZFR5cGUuZ2V0SW5zdGFuY2UodDEpLCBSZXZlcnNlZFR5cGUuZ2V0SW5zdGFuY2UodDIpKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBCeXRlQ29tcGFyYWJsZSBic3JjID0gY29tcFIuYXNCeXRlQ29tcGFyYWJsZShjKTsKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBnZXRDbHVzdGVyaW5nUHJlZml4KGFjY2Vzc29yLCBrMSwgY29tcFIsIGJzcmMpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJGYWlsZWQgcmV2ZXJzZSBjb21wYXJlKCVzLCBjb252ZXJ0ZWQgJXMgQnl0ZVNvdXJjZSAlcykgPT0gMFxudHlwZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVN0cihjLmNsdXN0ZXJpbmdTdHJpbmcoY29tcFIuc3VidHlwZXMoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVTdHIoY29udmVydGVkLmNsdXN0ZXJpbmdTdHJpbmcoY29tcFIuc3VidHlwZXMoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzcmMuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhWRVJTSU9OKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wUiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGNvbXBSLmNvbXBhcmUoYywgY29udmVydGVkKSk7CisgICAgICAgICAgICAgICAgaWYgKGNoZWNrRXF1YWxzKQorICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiRmFpbGVkIHJldmVyc2UgZXF1YWxzICVzLCBnb3QgJXMgQnl0ZVNvdXJjZSAlc1xudHlwZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVTdHIoYy5jbHVzdGVyaW5nU3RyaW5nKGNvbXBSLnN1YnR5cGVzKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVN0cihjb252ZXJ0ZWQuY2x1c3RlcmluZ1N0cmluZyhjb21wUi5zdWJ0eXBlcygpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzcmMuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhWRVJTSU9OKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcFIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywgY29udmVydGVkKTsKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyA8Vj4gQ2x1c3RlcmluZ1ByZWZpeDxWPiBnZXRDbHVzdGVyaW5nUHJlZml4KFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbHVzdGVyaW5nUHJlZml4LktpbmQgazEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUgYnNjKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChrMSkKKyAgICAgICAgeworICAgICAgICBjYXNlIFNUQVRJQ19DTFVTVEVSSU5HOgorICAgICAgICBjYXNlIENMVVNURVJJTkc6CisgICAgICAgICAgICByZXR1cm4gY29tcC5jbHVzdGVyaW5nRnJvbUJ5dGVDb21wYXJhYmxlKGFjY2Vzc29yLCBic2MpOworICAgICAgICBjYXNlIEVYQ0xfRU5EX0JPVU5EOgorICAgICAgICBjYXNlIElOQ0xfRU5EX0JPVU5EOgorICAgICAgICAgICAgcmV0dXJuIGNvbXAuYm91bmRGcm9tQnl0ZUNvbXBhcmFibGUoYWNjZXNzb3IsIGJzYywgdHJ1ZSk7CisgICAgICAgIGNhc2UgSU5DTF9TVEFSVF9CT1VORDoKKyAgICAgICAgY2FzZSBFWENMX1NUQVJUX0JPVU5EOgorICAgICAgICAgICAgcmV0dXJuIGNvbXAuYm91bmRGcm9tQnl0ZUNvbXBhcmFibGUoYWNjZXNzb3IsIGJzYywgZmFsc2UpOworICAgICAgICBjYXNlIEVYQ0xfRU5EX0lOQ0xfU1RBUlRfQk9VTkRBUlk6CisgICAgICAgIGNhc2UgSU5DTF9FTkRfRVhDTF9TVEFSVF9CT1VOREFSWToKKyAgICAgICAgICAgIHJldHVybiBjb21wLmJvdW5kYXJ5RnJvbUJ5dGVDb21wYXJhYmxlKGFjY2Vzc29yLCBic2MpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBCeXRlU291cmNlLlBlZWthYmxlIHNvdXJjZShCeXRlQ29tcGFyYWJsZSBic2MpCisgICAgeworICAgICAgICBpZiAoYnNjID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2UucGVla2FibGUoYnNjLmFzQ29tcGFyYWJsZUJ5dGVzKFZFUlNJT04pKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUdXBsZVR5cGUoKQorICAgIHsKKyAgICAgICAgUmFuZG9tIHJhbmQgPSBUaHJlYWRMb2NhbFJhbmRvbS5jdXJyZW50KCk7CisgICAgICAgIHRlc3RDb21iaW5hdGlvblNhbXBsaW5nKHJhbmQsIHRoaXM6OmFzc2VydFR1cGxlQ29udmVydHNTYW1lKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUdXBsZVR5cGVOb25GdWxsKCkKKyAgICB7CisgICAgICAgIFR1cGxlVHlwZSB0dCA9IG5ldyBUdXBsZVR5cGUoSW1tdXRhYmxlTGlzdC5vZihVVEY4VHlwZS5pbnN0YW5jZSwgSW50MzJUeXBlLmluc3RhbmNlKSk7CisgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gdGVzdHMgPSBJbW11dGFibGVMaXN0Lm9mCisgICAgICAgICAgICAoCisgICAgICAgICAgICBUdXBsZVR5cGUuYnVpbGRWYWx1ZShCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zZUFuZFJhbmRvbVBhZChJbnQzMlR5cGUuaW5zdGFuY2UsIDApKSwKKyAgICAgICAgICAgIC8vIE5vdGU6IGEgZGVjb21wb3NlZCBudWxsIChlLmcuIGRlY29tcG9zZUFuZFJhbmRvbVBhZChJbnQzMlR5cGUuaW5zdGFuY2UsIG51bGwpKSBzaG91bGQgbm90IHJlYWNoIGEgdHVwbGUKKyAgICAgICAgICAgIFR1cGxlVHlwZS5idWlsZFZhbHVlKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zZUFuZFJhbmRvbVBhZChVVEY4VHlwZS5pbnN0YW5jZSwgIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCksCisgICAgICAgICAgICBUdXBsZVR5cGUuYnVpbGRWYWx1ZShCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlQW5kUmFuZG9tUGFkKEludDMyVHlwZS5pbnN0YW5jZSwgMCkpLAorICAgICAgICAgICAgVHVwbGVUeXBlLmJ1aWxkVmFsdWUoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICIiKSksCisgICAgICAgICAgICBUdXBsZVR5cGUuYnVpbGRWYWx1ZShCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIChCeXRlQnVmZmVyKSBudWxsKSwKKyAgICAgICAgICAgIFR1cGxlVHlwZS5idWlsZFZhbHVlKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSkKKyAgICAgICAgICAgICk7CisgICAgICAgIHRlc3RCdWZmZXJzKHR0LCB0ZXN0cyk7CisgICAgfQorCisgICAgdm9pZCBhc3NlcnRUdXBsZUNvbnZlcnRzU2FtZShBYnN0cmFjdFR5cGUgdDEsIEFic3RyYWN0VHlwZSB0MiwgT2JqZWN0IG8xLCBPYmplY3QgbzIpCisgICAgeworICAgICAgICBUdXBsZVR5cGUgdHQgPSBuZXcgVHVwbGVUeXBlKEltbXV0YWJsZUxpc3Qub2YodDEsIHQyKSk7CisgICAgICAgIEJ5dGVCdWZmZXIgYjEgPSBUdXBsZVR5cGUuYnVpbGRWYWx1ZShCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VGb3JUdXBsZSh0MSwgbzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlRm9yVHVwbGUodDIsIG8yKSk7CisgICAgICAgIGFzc2VydENvbnZlcnRzU2FtZUJ1ZmZlcnModHQsIGIxKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wb3NpdGVUeXBlKCkKKyAgICB7CisgICAgICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgwKTsKKyAgICAgICAgdGVzdENvbWJpbmF0aW9uU2FtcGxpbmcocmFuZCwgdGhpczo6YXNzZXJ0Q29tcG9zaXRlQ29udmVydHNTYW1lKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wb3NpdGVUeXBlTm9uRnVsbCgpCisgICAgeworICAgICAgICBDb21wb3NpdGVUeXBlIHR0ID0gQ29tcG9zaXRlVHlwZS5nZXRJbnN0YW5jZShVVEY4VHlwZS5pbnN0YW5jZSwgSW50MzJUeXBlLmluc3RhbmNlKTsKKyAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiB0ZXN0cyA9IEltbXV0YWJsZUxpc3Qub2YKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgIENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICIiKSwgZGVjb21wb3NlQW5kUmFuZG9tUGFkKEludDMyVHlwZS5pbnN0YW5jZSwgMCkpLAorICAgICAgICAgICAgQ29tcG9zaXRlVHlwZS5idWlsZChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIGRlY29tcG9zZUFuZFJhbmRvbVBhZChVVEY4VHlwZS5pbnN0YW5jZSwgIiIpLCBkZWNvbXBvc2VBbmRSYW5kb21QYWQoSW50MzJUeXBlLmluc3RhbmNlLCBudWxsKSksCisgICAgICAgICAgICBDb21wb3NpdGVUeXBlLmJ1aWxkKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgZGVjb21wb3NlQW5kUmFuZG9tUGFkKFVURjhUeXBlLmluc3RhbmNlLCAiIikpLAorICAgICAgICAgICAgQ29tcG9zaXRlVHlwZS5idWlsZChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UpLAorICAgICAgICAgICAgQ29tcG9zaXRlVHlwZS5idWlsZChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIHRydWUsIGRlY29tcG9zZUFuZFJhbmRvbVBhZChVVEY4VHlwZS5pbnN0YW5jZSwgIiIpKSwKKyAgICAgICAgICAgIENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLHRydWUpCisgICAgICAgICAgICApOworICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgYiA6IHRlc3RzKQorICAgICAgICAgICAgdHQudmFsaWRhdGUoYik7CisgICAgICAgIHRlc3RCdWZmZXJzKHR0LCB0ZXN0cyk7CisgICAgfQorCisgICAgdm9pZCBhc3NlcnRDb21wb3NpdGVDb252ZXJ0c1NhbWUoQWJzdHJhY3RUeXBlIHQxLCBBYnN0cmFjdFR5cGUgdDIsIE9iamVjdCBvMSwgT2JqZWN0IG8yKQorICAgIHsKKyAgICAgICAgQ29tcG9zaXRlVHlwZSB0dCA9IENvbXBvc2l0ZVR5cGUuZ2V0SW5zdGFuY2UodDEsIHQyKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiMSA9IENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBkZWNvbXBvc2VBbmRSYW5kb21QYWQodDEsIG8xKSwgZGVjb21wb3NlQW5kUmFuZG9tUGFkKHQyLCBvMikpOworICAgICAgICBhc3NlcnRDb252ZXJ0c1NhbWVCdWZmZXJzKHR0LCBiMSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY0NvbXBvc2l0ZSgpCisgICAgeworICAgICAgICBEeW5hbWljQ29tcG9zaXRlVHlwZSB0dCA9IER5bmFtaWNDb21wb3NpdGVUeXBlLmdldEluc3RhbmNlKER5bmFtaWNDb21wb3NpdGVUeXBlVGVzdC5hbGlhc2VzKTsKKyAgICAgICAgVVVJRFtdIHV1aWRzID0gRHluYW1pY0NvbXBvc2l0ZVR5cGVUZXN0LnV1aWRzOworICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IHRlc3RzID0gSW1tdXRhYmxlTGlzdC5vZgorICAgICAgICAgICAgKAorICAgICAgICAgICAgRHluYW1pY0NvbXBvc2l0ZVR5cGVUZXN0LmNyZWF0ZUR5bmFtaWNDb21wb3NpdGVLZXkoInRlc3QxIiwgbnVsbCwgLTEsIGZhbHNlLCB0cnVlKSwKKyAgICAgICAgICAgIER5bmFtaWNDb21wb3NpdGVUeXBlVGVzdC5jcmVhdGVEeW5hbWljQ29tcG9zaXRlS2V5KCJ0ZXN0MSIsIHV1aWRzWzBdLCAyNCwgZmFsc2UsIHRydWUpLAorICAgICAgICAgICAgRHluYW1pY0NvbXBvc2l0ZVR5cGVUZXN0LmNyZWF0ZUR5bmFtaWNDb21wb3NpdGVLZXkoInRlc3QxIiwgdXVpZHNbMF0sIDQyLCBmYWxzZSwgdHJ1ZSksCisgICAgICAgICAgICBEeW5hbWljQ29tcG9zaXRlVHlwZVRlc3QuY3JlYXRlRHluYW1pY0NvbXBvc2l0ZUtleSgidGVzdDIiLCB1dWlkc1swXSwgLTEsIGZhbHNlLCB0cnVlKSwKKyAgICAgICAgICAgIER5bmFtaWNDb21wb3NpdGVUeXBlVGVzdC5jcmVhdGVEeW5hbWljQ29tcG9zaXRlS2V5KCJ0ZXN0MiIsIHV1aWRzWzFdLCA0MiwgZmFsc2UsIHRydWUpCisgICAgICAgICAgICApOworICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgYiA6IHRlc3RzKQorICAgICAgICAgICAgdHQudmFsaWRhdGUoYik7CisgICAgICAgIHRlc3RCdWZmZXJzKHR0LCB0ZXN0cyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdFR5cGVTdHJpbmcoKQorICAgIHsKKyAgICAgICAgdGVzdENvbGxlY3Rpb24oTGlzdFR5cGUuZ2V0SW5zdGFuY2UoVVRGOFR5cGUuaW5zdGFuY2UsIHRydWUpLCB0ZXN0U3RyaW5ncywgKCkgLT4gbmV3IEFycmF5TGlzdDw+KCksIG5ldyBSYW5kb20oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdFR5cGVMb25nKCkKKyAgICB7CisgICAgICAgIHRlc3RDb2xsZWN0aW9uKExpc3RUeXBlLmdldEluc3RhbmNlKExvbmdUeXBlLmluc3RhbmNlLCB0cnVlKSwgdGVzdExvbmdzLCAoKSAtPiBuZXcgQXJyYXlMaXN0PD4oKSwgbmV3IFJhbmRvbSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRUeXBlU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHRlc3RDb2xsZWN0aW9uKFNldFR5cGUuZ2V0SW5zdGFuY2UoVVRGOFR5cGUuaW5zdGFuY2UsIHRydWUpLCB0ZXN0U3RyaW5ncywgKCkgLT4gbmV3IEhhc2hTZXQ8PigpLCBuZXcgUmFuZG9tKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldFR5cGVMb25nKCkKKyAgICB7CisgICAgICAgIHRlc3RDb2xsZWN0aW9uKFNldFR5cGUuZ2V0SW5zdGFuY2UoTG9uZ1R5cGUuaW5zdGFuY2UsIHRydWUpLCB0ZXN0TG9uZ3MsICgpIC0+IG5ldyBIYXNoU2V0PD4oKSwgbmV3IFJhbmRvbSgpKTsKKyAgICB9CisKKyAgICA8VCwgQ1QgZXh0ZW5kcyBDb2xsZWN0aW9uPFQ+PiB2b2lkIHRlc3RDb2xsZWN0aW9uKENvbGxlY3Rpb25UeXBlPENUPiB0dCwgVFtdIHZhbHVlcywgU3VwcGxpZXI8Q1Q+IGdlbiwgUmFuZG9tIHJhbmQpCisgICAgeworICAgICAgICBpbnQgY250ID0gMDsKKyAgICAgICAgTGlzdDxDVD4gdGVzdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgdGVzdHMuYWRkKGdlbi5nZXQoKSk7CisgICAgICAgIGZvciAoaW50IGMgPSAxOyBjIDw9IDM7ICsrYykKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgKytqKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENUIGwgPSBnZW4uZ2V0KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjOyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUIHZhbHVlID0gdmFsdWVzW2NudCsrICUgdmFsdWVzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgbC5hZGQodmFsdWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRlc3RzLmFkZChsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgdGVzdFR5cGUodHQsIHRlc3RzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXBUeXBlU3RyaW5nTG9uZygpCisgICAgeworICAgICAgICB0ZXN0TWFwKE1hcFR5cGUuZ2V0SW5zdGFuY2UoVVRGOFR5cGUuaW5zdGFuY2UsIExvbmdUeXBlLmluc3RhbmNlLCB0cnVlKSwgdGVzdFN0cmluZ3MsIHRlc3RMb25ncywgKCkgLT4gbmV3IEhhc2hNYXA8PigpLCBuZXcgUmFuZG9tKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hcFR5cGVTdHJpbmdMb25nVHJlZSgpCisgICAgeworICAgICAgICB0ZXN0TWFwKE1hcFR5cGUuZ2V0SW5zdGFuY2UoVVRGOFR5cGUuaW5zdGFuY2UsIExvbmdUeXBlLmluc3RhbmNlLCB0cnVlKSwgdGVzdFN0cmluZ3MsIHRlc3RMb25ncywgKCkgLT4gbmV3IFRyZWVNYXA8PigpLCBuZXcgUmFuZG9tKCkpOworICAgIH0KKworICAgIDxLLCBWLCBNIGV4dGVuZHMgTWFwPEssIFY+PiB2b2lkIHRlc3RNYXAoTWFwVHlwZTxLLCBWPiB0dCwgS1tdIGtleXMsIFZbXSB2YWx1ZXMsIFN1cHBsaWVyPE0+IGdlbiwgUmFuZG9tIHJhbmQpCisgICAgeworICAgICAgICBMaXN0PE0+IHRlc3RzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHRlc3RzLmFkZChnZW4uZ2V0KCkpOworICAgICAgICBmb3IgKGludCBjID0gMTsgYyA8PSAzOyArK2MpCisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7ICsraikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNIGwgPSBnZW4uZ2V0KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjOyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBWIHZhbHVlID0gdmFsdWVzW3JhbmQubmV4dEludCh2YWx1ZXMubGVuZ3RoKV07CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgbC5wdXQoa2V5c1tyYW5kLm5leHRJbnQoa2V5cy5sZW5ndGgpXSwgdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRlc3RzLmFkZChsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgdGVzdFR5cGUodHQsIHRlc3RzKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENvbnZlcnQgdHlwZSB0byBhIGNvbXBhcmFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBCeXRlQ29tcGFyYWJsZSB0eXBlVG9Db21wYXJhYmxlKEFic3RyYWN0VHlwZTw/PiB0eXBlLCBCeXRlQnVmZmVyIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCeXRlQ29tcGFyYWJsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmVyc2lvbiB2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLmFzQ29tcGFyYWJsZUJ5dGVzKHZhbHVlLCB2KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5nZXRTdHJpbmcodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyA8VD4gdm9pZCB0ZXN0VHlwZShBYnN0cmFjdFR5cGU8VD4gdHlwZSwgT2JqZWN0W10gdmFsdWVzKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUodHlwZSwgSXRlcmFibGVzLnRyYW5zZm9ybShBcnJheXMuYXNMaXN0KHZhbHVlcyksIHggLT4gKFQpIHgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQ+IHZvaWQgdGVzdFR5cGUoQWJzdHJhY3RUeXBlPD8gc3VwZXIgVD4gdHlwZSwgSXRlcmFibGU8VD4gdmFsdWVzKQorICAgIHsKKyAgICAgICAgZm9yIChUIGkgOiB2YWx1ZXMpIHsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgYiA9IGRlY29tcG9zZUFuZFJhbmRvbVBhZCh0eXBlLCBpKTsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJWYWx1ZSB7fSAoe30pIGJ5dGVzIHt9IEJ5dGVTb3VyY2Uge30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVN0cihpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVTdHIodHlwZS5nZXRTZXJpYWxpemVyKCkudG9DUUxMaXRlcmFsKGIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVTdHIoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlVG9Db21wYXJhYmxlKHR5cGUsIGIpLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVkVSU0lPTikpOworICAgICAgICAgICAgYXNzZXJ0Q29udmVydHNTYW1lKHR5cGUsIGkpOworICAgICAgICB9CisgICAgICAgIGlmICghdHlwZS5pc1JldmVyc2VkKCkpCisgICAgICAgICAgICB0ZXN0VHlwZShSZXZlcnNlZFR5cGUuZ2V0SW5zdGFuY2UodHlwZSksIHZhbHVlcyk7CisgICAgfQorCisgICAgcHVibGljIDxUPiB2b2lkIHRlc3RUeXBlQnVmZmVycyhBYnN0cmFjdFR5cGU8VD4gdHlwZSwgT2JqZWN0W10gdmFsdWVzKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGVCdWZmZXJzKHR5cGUsIExpc3RzLnRyYW5zZm9ybShBcnJheXMuYXNMaXN0KHZhbHVlcyksIHggLT4gKFQpIHgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQ+IHZvaWQgdGVzdFR5cGVCdWZmZXJzKEFic3RyYWN0VHlwZTxUPiB0eXBlLCBMaXN0PFQ+IHZhbHVlcykKKyAgICB7CisgICAgICAgIC8vIE1haW4gZGlmZmVyZW5jZSB3aXRoIGFib3ZlIGlzIHRoYXQgd2UgdXNlIHR5cGUuY29tcGFyZSBpbnN0ZWFkIG9mIGNoZWNraW5nIGVxdWFscworICAgICAgICB0ZXN0QnVmZmVycyh0eXBlLCBMaXN0cy50cmFuc2Zvcm0odmFsdWVzLCB2YWx1ZSAtPiBkZWNvbXBvc2VBbmRSYW5kb21QYWQodHlwZSwgdmFsdWUpKSk7CisKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdEJ1ZmZlcnMoQWJzdHJhY3RUeXBlPD8+IHR5cGUsIExpc3Q8Qnl0ZUJ1ZmZlcj4gdmFsdWVzKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoQnl0ZUJ1ZmZlciBiIDogdmFsdWVzKSB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlZhbHVlIHt9IGJ5dGVzIHt9IEJ5dGVTb3VyY2Uge30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVTdHIodHlwZS5nZXRTZXJpYWxpemVyKCkudG9DUUxMaXRlcmFsKGIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlU3RyKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoYikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUb0NvbXBhcmFibGUodHlwZSwgYikuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhWRVJTSU9OKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENvbnRpbnVlIHdpdGhvdXQgbGlzdGluZyB2YWx1ZXMuCisgICAgICAgIH0KKworICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgaSA6IHZhbHVlcykKKyAgICAgICAgICAgIGFzc2VydENvbnZlcnRzU2FtZUJ1ZmZlcnModHlwZSwgaSk7CisgICAgfQorCisgICAgdm9pZCBhc3NlcnRDb252ZXJ0c1NhbWVCdWZmZXJzKEFic3RyYWN0VHlwZTw/PiB0eXBlLCBCeXRlQnVmZmVyIGIxKQorICAgIHsKKyAgICAgICAgZmluYWwgQnl0ZUNvbXBhcmFibGUgYnMxID0gdHlwZVRvQ29tcGFyYWJsZSh0eXBlLCBiMSk7CisKKyAgICAgICAgQnl0ZUJ1ZmZlciBhY3R1YWwgPSB0eXBlLmZyb21Db21wYXJhYmxlQnl0ZXMoc291cmNlKGJzMSksIFZFUlNJT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiRmFpbGVkIGNvbXBhcmUoJXMsIGNvbnZlcnRlZCAlcyAoYnl0ZXNvdXJjZSAlcykpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChiMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoYWN0dWFsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnMxLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVkVSU0lPTikpLAorICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGUuY29tcGFyZShiMSwgYWN0dWFsKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlY29yYXRlZEtleXMoSVBhcnRpdGlvbmVyIHR5cGUsIExpc3Q8Qnl0ZUJ1ZmZlcj4gdmFsdWVzKQorICAgIHsKKyAgICAgICAgZm9yIChCeXRlQnVmZmVyIGkgOiB2YWx1ZXMpCisgICAgICAgICAgICBhc3NlcnRDb252ZXJ0c1NhbWVEZWNvcmF0ZWRLZXlzKHR5cGUsIGkpOworICAgIH0KKworICAgIHZvaWQgYXNzZXJ0Q29udmVydHNTYW1lRGVjb3JhdGVkS2V5cyhJUGFydGl0aW9uZXIgdHlwZSwgQnl0ZUJ1ZmZlciBiMSkKKyAgICB7CisgICAgICAgIERlY29yYXRlZEtleSBrMSA9IHR5cGUuZGVjb3JhdGVLZXkoYjEpOworICAgICAgICBEZWNvcmF0ZWRLZXkgYWN0dWFsID0gQnVmZmVyRGVjb3JhdGVkS2V5LmZyb21CeXRlQ29tcGFyYWJsZShrMSwgVkVSU0lPTiwgdHlwZSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkZhaWxlZCBjb21wYXJlKCVzWyVzIGJzICVzXSwgJXNbJXMgYnMgJXNdKVxucGFydGl0aW9uZXIgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChiMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsxLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVkVSU0lPTiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChhY3R1YWwuZ2V0S2V5KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhWRVJTSU9OKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgazEuY29tcGFyZVRvKGFjdHVhbCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiRmFpbGVkIGVxdWFscyglc1slcyBicyAlc10sICVzWyVzIGJzICVzXSlcbnBhcnRpdGlvbmVyICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgazEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoYjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrMS5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKFZFUlNJT04pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoYWN0dWFsLmdldEtleSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVkVSU0lPTiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgazEsCisgICAgICAgICAgICAgICAgICAgICBhY3R1YWwpOworICAgIH0KKworICAgIHN0YXRpYyBPYmplY3Qgc2FmZVN0cihPYmplY3QgaSkKKyAgICB7CisgICAgICAgIGlmIChpID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKGkgaW5zdGFuY2VvZiBCeXRlQnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IChCeXRlQnVmZmVyKSBpOworICAgICAgICAgICAgaSA9IEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoYnVmKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcyA9IGkudG9TdHJpbmcoKTsKKyAgICAgICAgaWYgKHMubGVuZ3RoKCkgPiAxMDApCisgICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcoMCwgMTAwKSArICIuLi4iOworICAgICAgICByZXR1cm4gcy5yZXBsYWNlQWxsKCJcMCIsICI8MD4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQ+IHZvaWQgdGVzdERpcmVjdChGdW5jdGlvbjxULCBCeXRlU291cmNlPiBjb252ZXJ0b3IsIEZ1bmN0aW9uPEJ5dGVTb3VyY2UuUGVla2FibGUsIFQ+IGludmVyc2UsIFRbXSB2YWx1ZXMpCisgICAgeworICAgICAgICBmb3IgKFQgaSA6IHZhbHVlcykgeworICAgICAgICAgICAgaWYgKGkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlZhbHVlIHt9IEJ5dGVTb3VyY2Uge31cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlU3RyKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydG9yLmFwcGx5KGkpKTsKKworICAgICAgICB9CisgICAgICAgIGZvciAoVCBpIDogdmFsdWVzKQorICAgICAgICAgICAgaWYgKGkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBhc3NlcnRDb252ZXJ0c1NhbWUoY29udmVydG9yLCBpbnZlcnNlLCBpKTsKKyAgICB9CisKKyAgICA8VD4gdm9pZCBhc3NlcnRDb252ZXJ0c1NhbWUoRnVuY3Rpb248VCwgQnl0ZVNvdXJjZT4gY29udmVydG9yLCBGdW5jdGlvbjxCeXRlU291cmNlLlBlZWthYmxlLCBUPiBpbnZlcnNlLCBUIHYxKQorICAgIHsKKyAgICAgICAgQnl0ZUNvbXBhcmFibGUgYjEgPSB2IC0+IGNvbnZlcnRvci5hcHBseSh2MSk7CisgICAgICAgIFQgYWN0dWFsID0gaW52ZXJzZS5hcHBseShzb3VyY2UoYjEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkJ5dGVTb3VyY2UgJXMiLCBiMS5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKFZFUlNJT04pKSwgdjEsIGFjdHVhbCk7CisgICAgfQorCisgICAgPFQ+IHZvaWQgYXNzZXJ0Q29udmVydHNTYW1lKEFic3RyYWN0VHlwZTxUPiB0eXBlLCBUIHYxKQorICAgIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiMSA9IGRlY29tcG9zZUFuZFJhbmRvbVBhZCh0eXBlLCB2MSk7CisgICAgICAgIGZpbmFsIEJ5dGVDb21wYXJhYmxlIGJjMSA9IHR5cGVUb0NvbXBhcmFibGUodHlwZSwgYjEpOworICAgICAgICBCeXRlQnVmZmVyIGNvbnZlcnRlZEJ1ZmZlciA9IHR5cGUuZnJvbUNvbXBhcmFibGVCeXRlcyhzb3VyY2UoYmMxKSwgVkVSU0lPTik7CisgICAgICAgIFQgYWN0dWFsID0gdHlwZS5jb21wb3NlKGNvbnZlcnRlZEJ1ZmZlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkZhaWxlZCBlcXVhbHMgJXMoJXMgYnMgJXMpLCBnb3QgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlU3RyKHYxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChiMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVTdHIoYmMxLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVkVSU0lPTikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlU3RyKGFjdHVhbCkpLAorICAgICAgICAgICAgICAgICAgICAgdjEsCisgICAgICAgICAgICAgICAgICAgICBhY3R1YWwpOworICAgIH0KKworICAgIDxUPiBCeXRlQnVmZmVyIGRlY29tcG9zZUFuZFJhbmRvbVBhZChBYnN0cmFjdFR5cGU8VD4gdHlwZSwgVCB2KQorICAgIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiID0gdHlwZS5kZWNvbXBvc2Uodik7CisgICAgICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgwKTsKKyAgICAgICAgaW50IHBhZEJlZm9yZSA9IHJhbmQubmV4dEludCgxNik7CisgICAgICAgIGludCBwYWRBZnRlciA9IHJhbmQubmV4dEludCgxNik7CisgICAgICAgIGludCBwYWRkZWRDYXBhY2l0eSA9IGIucmVtYWluaW5nKCkgKyBwYWRCZWZvcmUgKyBwYWRBZnRlcjsKKyAgICAgICAgQnl0ZUJ1ZmZlciBwYWRkZWQgPSBhbGxvY2F0ZUJ1ZmZlcihwYWRkZWRDYXBhY2l0eSk7CisgICAgICAgIHJhbmQuaW50cyhwYWRCZWZvcmUpLmZvckVhY2goeCAtPiBwYWRkZWQucHV0KChieXRlKSB4KSk7CisgICAgICAgIHBhZGRlZC5wdXQoYi5kdXBsaWNhdGUoKSk7CisgICAgICAgIHJhbmQuaW50cyhwYWRBZnRlcikuZm9yRWFjaCh4IC0+IHBhZGRlZC5wdXQoKGJ5dGUpIHgpKTsKKyAgICAgICAgcGFkZGVkLmNsZWFyKCkubGltaXQocGFkZGVkLmNhcGFjaXR5KCkgLSBwYWRBZnRlcikucG9zaXRpb24ocGFkQmVmb3JlKTsKKyAgICAgICAgcmV0dXJuIHBhZGRlZDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciBhbGxvY2F0ZUJ1ZmZlcihpbnQgcGFkZGVkQ2FwYWNpdHkpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShwYWRkZWRDYXBhY2l0eSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9ieXRlY29tcGFyYWJsZS9CeXRlU291cmNlSW52ZXJzZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9ieXRlY29tcGFyYWJsZS9CeXRlU291cmNlSW52ZXJzZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmQ2Y2MyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J5dGVjb21wYXJhYmxlL0J5dGVTb3VyY2VJbnZlcnNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5NZW1vcnlVdGlsOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5JbnRDb25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uTG9uZ0NvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uKjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKKworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBCeXRlU291cmNlSW52ZXJzZVRlc3QKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxQSEFCRVQgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjEyMzQ1Njc4OTAhQCMkJV4mKigpIjsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ2ZXJzaW9uPXswfSIpCisgICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxCeXRlQ29tcGFyYWJsZS5WZXJzaW9uPiB2ZXJzaW9ucygpCisgICAgeworICAgICAgICByZXR1cm4gSW1tdXRhYmxlTGlzdC5vZihCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbjsKKworICAgIHB1YmxpYyBCeXRlU291cmNlSW52ZXJzZVRlc3QoQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTaWduZWRJbnQoKQorICAgIHsKKyAgICAgICAgSW50Q29uc3VtZXIgaW50Q29uc3VtZXIgPSBpbml0aWFsIC0+CisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVTb3VyY2UgYnl0ZVNvdXJjZSA9IEJ5dGVTb3VyY2Uub2YoaW5pdGlhbCk7CisgICAgICAgICAgICBpbnQgZGVjb2RlZCA9IEJ5dGVTb3VyY2VJbnZlcnNlLmdldFNpZ25lZEludChieXRlU291cmNlKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoaW5pdGlhbCwgZGVjb2RlZCk7CisgICAgICAgIH07CisKKyAgICAgICAgSW50U3RyZWFtLm9mKEludGVnZXIuTUlOX1ZBTFVFLCBJbnRlZ2VyLk1JTl9WQUxVRSArIDEsCisgICAgICAgICAgICAgICAgICAgICAtMjU2LCAtMjU1LCAtMTI4LCAtMTI3LCAtMSwgMCwgMSwgMTI3LCAxMjgsIDI1NSwgMjU2LAorICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5NQVhfVkFMVUUgLSAxLCBJbnRlZ2VyLk1BWF9WQUxVRSkKKyAgICAgICAgICAgICAgICAgLmZvckVhY2goaW50Q29uc3VtZXIpOworICAgICAgICBuZXcgUmFuZG9tKCkuaW50cygxMDAwKQorICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChpbnRDb25zdW1lcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmV4dEludCgpCisgICAgeworICAgICAgICAvLyBUaGUgaGlnaCBhbmQgbG93IDMyIGJpdHMgb2YgdGhpcyBsb25nIGRpZmZlciBvbmx5IGluIHRoZSBmaXJzdCBhbmQgbGFzdCBiaXQgKGluIHRoZSBoaWdoIDMyIGJpdHMgdGhleSBhcmUKKyAgICAgICAgLy8gYm90aCAwcyBpbnN0ZWFkIG9mIDFzKS4gVGhlIGZpcnN0IGJpdCBkaWZmZXJlbmNlIHdpbGwgYmUgbmVnYXRlZCBieSB0aGUgYml0IGZsaXBwaW5nIHdoZW4gd3JpdGluZyBkb3duIGEKKyAgICAgICAgLy8gZml4ZWQgbGVuZ3RoIHNpZ25lZCBudW1iZXIsIHNvIHRoZSBvbmx5IHJlbWFpbmluZyBkaWZmZXJlbmNlIHdpbGwgYmUgaW4gdGhlIGxhc3QgYml0LgorICAgICAgICBpbnQgaGkgPSAwYjAwMDFfMDAxMF8wMDExXzAxMDBfMDEwMV8wMTEwXzAxMTFfMTAwMDsKKyAgICAgICAgaW50IGxvID0gaGkgfCAxIHwgMSA8PCAzMTsKKyAgICAgICAgbG9uZyBsMSA9IEludGVnZXIudG9VbnNpZ25lZExvbmcoaGkpIDw8IDMyIHwgSW50ZWdlci50b1Vuc2lnbmVkTG9uZyhsbyk7CisKKyAgICAgICAgQnl0ZVNvdXJjZSBieXRlU291cmNlID0gQnl0ZVNvdXJjZS5vZihsMSk7CisgICAgICAgIGludCBpMSA9IEJ5dGVTb3VyY2VJbnZlcnNlLmdldFNpZ25lZEludChieXRlU291cmNlKTsKKyAgICAgICAgaW50IGkyID0gQnl0ZVNvdXJjZUludmVyc2UuZ2V0U2lnbmVkSW50KGJ5dGVTb3VyY2UpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGkxICsgMSwgaTIpOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBCeXRlU291cmNlSW52ZXJzZS5nZXRTaWduZWRJbnQoYnl0ZVNvdXJjZSk7CisgICAgICAgICAgICBBc3NlcnQuZmFpbCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRXhwZWN0ZWQuCisgICAgICAgIH0KKworICAgICAgICBieXRlU291cmNlID0gQnl0ZVNvdXJjZS5vZihsMSk7CisgICAgICAgIGludCBpRmlyc3QgPSBCeXRlU291cmNlSW52ZXJzZS5nZXRTaWduZWRJbnQoYnl0ZVNvdXJjZSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoaTEsIGlGaXJzdCk7CisgICAgICAgIGludCBpTmV4dCA9IEJ5dGVTb3VyY2VJbnZlcnNlLmdldFNpZ25lZEludChieXRlU291cmNlKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhpMiwgaU5leHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFNpZ25lZExvbmcoKQorICAgIHsKKyAgICAgICAgTG9uZ0NvbnN1bWVyIGxvbmdDb25zdW1lciA9IGluaXRpYWwgLT4KKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZVNvdXJjZSBieXRlU291cmNlID0gQnl0ZVNvdXJjZS5vZihpbml0aWFsKTsKKyAgICAgICAgICAgIGxvbmcgZGVjb2RlZCA9IEJ5dGVTb3VyY2VJbnZlcnNlLmdldFNpZ25lZExvbmcoYnl0ZVNvdXJjZSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGluaXRpYWwsIGRlY29kZWQpOworICAgICAgICB9OworCisgICAgICAgIExvbmdTdHJlYW0ub2YoTG9uZy5NSU5fVkFMVUUsIExvbmcuTUlOX1ZBTFVFICsgMSwgSW50ZWdlci5NSU5fVkFMVUUgLSAxTCwKKyAgICAgICAgICAgICAgICAgICAgICAtMjU2TCwgLTI1NUwsIC0xMjhMLCAtMTI3TCwgLTFMLCAwTCwgMUwsIDEyN0wsIDEyOEwsIDI1NUwsIDI1NkwsCisgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5NQVhfVkFMVUUgKyAxTCwgTG9uZy5NQVhfVkFMVUUgLSAxLCBMb25nLk1BWF9WQUxVRSkKKyAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGxvbmdDb25zdW1lcik7CisgICAgICAgIG5ldyBSYW5kb20oKS5sb25ncygxMDAwKQorICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChsb25nQ29uc3VtZXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFNpZ25lZEJ5dGUoKQorICAgIHsKKyAgICAgICAgQ29uc3VtZXI8Qnl0ZT4gYnl0ZUNvbnN1bWVyID0gYm94ZWRCeXRlIC0+CisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGUgaW5pdGlhbCA9IGJveGVkQnl0ZTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciA9IEJ5dGVUeXBlLmluc3RhbmNlLmRlY29tcG9zZShpbml0aWFsKTsKKyAgICAgICAgICAgIEJ5dGVTb3VyY2UgYnl0ZVNvdXJjZSA9IEJ5dGVUeXBlLmluc3RhbmNlLmFzQ29tcGFyYWJsZUJ5dGVzKGJ5dGVCdWZmZXIsIHZlcnNpb24pOworICAgICAgICAgICAgYnl0ZSBkZWNvZGVkID0gQnl0ZVNvdXJjZUludmVyc2UuZ2V0U2lnbmVkQnl0ZShieXRlU291cmNlKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoaW5pdGlhbCwgZGVjb2RlZCk7CisgICAgICAgIH07CisKKyAgICAgICAgSW50U3RyZWFtLnJhbmdlKEJ5dGUuTUlOX1ZBTFVFLCBCeXRlLk1BWF9WQUxVRSArIDEpCisgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGJ5dGVJbnRlZ2VyIC0+IGJ5dGVDb25zdW1lci5hY2NlcHQoKGJ5dGUpIGJ5dGVJbnRlZ2VyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2lnbmVkU2hvcnQoKQorICAgIHsKKyAgICAgICAgQ29uc3VtZXI8U2hvcnQ+IHNob3J0Q29uc3VtZXIgPSBib3hlZFNob3J0IC0+CisgICAgICAgIHsKKyAgICAgICAgICAgIHNob3J0IGluaXRpYWwgPSBib3hlZFNob3J0OworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBzaG9ydEJ1ZmZlciA9IFNob3J0VHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoaW5pdGlhbCk7CisgICAgICAgICAgICBCeXRlU291cmNlIGJ5dGVTb3VyY2UgPSBTaG9ydFR5cGUuaW5zdGFuY2UuYXNDb21wYXJhYmxlQnl0ZXMoc2hvcnRCdWZmZXIsIHZlcnNpb24pOworICAgICAgICAgICAgc2hvcnQgZGVjb2RlZCA9IEJ5dGVTb3VyY2VJbnZlcnNlLmdldFNpZ25lZFNob3J0KGJ5dGVTb3VyY2UpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhpbml0aWFsLCBkZWNvZGVkKTsKKyAgICAgICAgfTsKKworICAgICAgICBJbnRTdHJlYW0ucmFuZ2UoU2hvcnQuTUlOX1ZBTFVFLCBTaG9ydC5NQVhfVkFMVUUgKyAxKQorICAgICAgICAgICAgICAgICAuZm9yRWFjaChzaG9ydEludGVnZXIgLT4gc2hvcnRDb25zdW1lci5hY2NlcHQoKHNob3J0KSBzaG9ydEludGVnZXIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRCeXRlU291cmNlRm9yRml4ZWRMZW5ndGhOdW1iZXJzKCkKKyAgICB7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzhdOworICAgICAgICBuZXcgUmFuZG9tKCkubmV4dEJ5dGVzKGJ5dGVzKTsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBJbnRlZ2VyPiBlbnRyaWVzIDogSW1tdXRhYmxlTWFwLm9mKCJnZXRTaWduZWRJbnQiLCA0LAorICAgICAgICAgICAgICAgICAgImdldFNpZ25lZExvbmciLCA4LAorICAgICAgICAgICAgICAgICAgImdldFNpZ25lZEJ5dGUiLCAxLAorICAgICAgICAgICAgICAgICAgImdldFNpZ25lZFNob3J0IiwgMikuZW50cnlTZXQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBlbnRyaWVzLmdldEtleSgpOworICAgICAgICAgICAgaW50IGxlbmd0aCA9IGVudHJpZXMuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1ldGhvZCBmaXhlZExlbmd0aE51bWJlck1ldGhvZCA9IEJ5dGVTb3VyY2VJbnZlcnNlLmNsYXNzLmdldE1ldGhvZChtZXRob2ROYW1lLCBCeXRlU291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBBcnJheUxpc3Q8Qnl0ZVNvdXJjZT4gc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgICAgIHNvdXJjZXMuYWRkKG51bGwpOworICAgICAgICAgICAgICAgIHNvdXJjZXMuYWRkKEJ5dGVTb3VyY2UuRU1QVFkpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZXMuYWRkKEJ5dGVTb3VyY2UuZml4ZWRMZW5ndGgoYnl0ZXMsIDAsIGkpKTsKKyAgICAgICAgICAgICAgICAvLyBOb3RlOiBub3QgdGVzdGluZyBpbnZhbGlkIGJ5dGVzIChlLmcuIHVzaW5nIHRoZSBjb25zdHJ1Y3Rpb24gYmVsb3cpIGFzIHRoZXkgc2lnbmlmeSBhIHByb2dyYW1taW5nCisgICAgICAgICAgICAgICAgLy8gZXJyb3IgKHRocm93aW5nIEFzc2VydGlvbkVycm9yKSByYXRoZXIgdGhhbiBzb21ldGhpbmcgdGhhdCBjb3VsZCBoYXBwZW4gZHVlIHRvIGUuZy4gYmFkIGZpbGVzLgorICAgICAgICAgICAgICAgIC8vICAgICAgQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvckxlZ2FjeSgyNTcsIEJ5dGVTb3VyY2UuZml4ZWRMZW5ndGgoYnl0ZXMsIDAsIGxlbmd0aCAtIDEpKTsKKyAgICAgICAgICAgICAgICBmb3IgKEJ5dGVTb3VyY2UgYmFkU291cmNlIDogc291cmNlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZExlbmd0aE51bWJlck1ldGhvZC5pbnZva2UoQnl0ZVNvdXJjZUludmVyc2UuY2xhc3MsIGJhZFNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIG1heWJlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXliZSA9IFRocm93YWJsZXMudW53cmFwcGVkKG1heWJlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIlVuZXhwZWN0ZWQgdGhyb3dhYmxlICIgKyBtYXliZSArICIgd2l0aCBjYXVzZSAiICsgbWF5YmUuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWRTb3VyY2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heWJlIGluc3RhbmNlb2YgTnVsbFBvaW50ZXJFeGNlcHRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5YmUgaW5zdGFuY2VvZiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKCJFeHBlY3RlZCBCeXRlU291cmNlSW52ZXJzZSB0byBoYXZlIG1ldGhvZCBjYWxsZWQgIiArIG1ldGhvZE5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgb2YgdHlwZSBCeXRlU291cmNlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRCeXRlU291cmNlRm9yVmFyaWFibGVMZW5ndGhOdW1iZXJzKCkKKyAgICB7CisgICAgICAgIGZvciAobG9uZyB2YWx1ZSA6IEFycmF5cy5hc0xpc3QoMEwsIDFMIDw8IDYsIDFMIDw8IDEzLCAxTCA8PCAyMCwgMUwgPDwgMjcsIDFMIDw8IDM0LCAxTCA8PCA0MSwgMUwgPDwgNDgsIDFMIDw8IDU1KSkKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh2YWx1ZSwgQnl0ZVNvdXJjZUludmVyc2UuZ2V0VmFyaWFibGVMZW5ndGhJbnRlZ2VyKEJ5dGVTb3VyY2UudmFyaWFibGVMZW5ndGhJbnRlZ2VyKHZhbHVlKSkpOworCisgICAgICAgICAgICBBcnJheUxpc3Q8Qnl0ZVNvdXJjZT4gc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgc291cmNlcy5hZGQobnVsbCk7CisgICAgICAgICAgICBzb3VyY2VzLmFkZChCeXRlU291cmNlLkVNUFRZKTsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBCeXRlQ29tcGFyYWJsZS5sZW5ndGgodmVyc2lvbiAtPiBCeXRlU291cmNlLnZhcmlhYmxlTGVuZ3RoSW50ZWdlcih2YWx1ZSksIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24uT1NTNTApOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICBzb3VyY2VzLmFkZChCeXRlU291cmNlLmN1dChCeXRlU291cmNlLnZhcmlhYmxlTGVuZ3RoSW50ZWdlcih2YWx1ZSksIGkpKTsKKworICAgICAgICAgICAgZm9yIChCeXRlU291cmNlIGJhZFNvdXJjZSA6IHNvdXJjZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCeXRlU291cmNlSW52ZXJzZS5nZXRWYXJpYWJsZUxlbmd0aEludGVnZXIoYmFkU291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgbWF5YmUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXliZSA9IFRocm93YWJsZXMudW53cmFwcGVkKG1heWJlKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiVW5leHBlY3RlZCB0aHJvd2FibGUgIiArIG1heWJlICsgIiB3aXRoIGNhdXNlICIgKyBtYXliZS5nZXRDYXVzZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoYmFkU291cmNlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5YmUgaW5zdGFuY2VvZiBOdWxsUG9pbnRlckV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXliZSBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U3RyaW5nKCkKKyAgICB7CisgICAgICAgIENvbnN1bWVyPFN0cmluZz4gc3RyaW5nQ29uc3VtZXIgPSBpbml0aWFsIC0+CisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVTb3VyY2UuUGVla2FibGUgYnl0ZVNvdXJjZSA9IGluaXRpYWwgPT0gbnVsbCA/IG51bGwgOiBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uub2YoaW5pdGlhbCwgdmVyc2lvbikpOworICAgICAgICAgICAgU3RyaW5nIGRlY29kZWQgPSBCeXRlU291cmNlSW52ZXJzZS5nZXRTdHJpbmcoYnl0ZVNvdXJjZSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGluaXRpYWwsIGRlY29kZWQpOworICAgICAgICB9OworCisgICAgICAgIFN0cmVhbS5vZihudWxsLCAiwqkgMjAxOCBEYXRhU3RheCIsICIiLCAiXG4iLCAiXDAiLCAiXDBcMCIsICJcMDAxIiwgIjAiLCAiMFwwIiwgIjAwIiwgIjEiKQorICAgICAgICAgICAgICAuZm9yRWFjaChzdHJpbmdDb25zdW1lcik7CisKKyAgICAgICAgUmFuZG9tIHBybmcgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgIGludCBzdHJpbmdMZW5ndGggPSAxMDsKKyAgICAgICAgU3RyaW5nIHJhbmRvbTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJhbmRvbSA9IG5ld1JhbmRvbUFscGhhbnVtZXJpYyhwcm5nLCBzdHJpbmdMZW5ndGgpOworICAgICAgICAgICAgc3RyaW5nQ29uc3VtZXIuYWNjZXB0KHJhbmRvbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmV3UmFuZG9tQWxwaGFudW1lcmljKFJhbmRvbSBwcm5nLCBpbnQgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByYW5kb20gPSBuZXcgU3RyaW5nQnVpbGRlcihsZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKQorICAgICAgICAgICAgcmFuZG9tLmFwcGVuZChBTFBIQUJFVC5jaGFyQXQocHJuZy5uZXh0SW50KEFMUEhBQkVULmxlbmd0aCgpKSkpOworICAgICAgICByZXR1cm4gcmFuZG9tLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Qnl0ZUJ1ZmZlcigpCisgICAgeworICAgICAgICBmb3IgKENvbnN1bWVyPGJ5dGVbXT4gYnl0ZUFycmF5Q29uc3VtZXIgOiBBcnJheXMuPENvbnN1bWVyPGJ5dGVbXT4+YXNMaXN0KGluaXRpYWxCeXRlcyAtPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2UuUGVla2FibGUgYnl0ZVNvdXJjZSA9IEJ5dGVTb3VyY2UucGVla2FibGUoQnl0ZVNvdXJjZS5vZihCeXRlQnVmZmVyLndyYXAoaW5pdGlhbEJ5dGVzKSwgdmVyc2lvbikpOworICAgICAgICAgICAgICAgIGJ5dGVbXSBkZWNvZGVkQnl0ZXMgPSBCeXRlU291cmNlSW52ZXJzZS5nZXRVbmVzY2FwZWRCeXRlcyhieXRlU291cmNlKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHMoaW5pdGlhbEJ5dGVzLCBkZWNvZGVkQnl0ZXMpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIGluaXRpYWxCeXRlcyAtPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2UuUGVla2FibGUgYnl0ZVNvdXJjZSA9IEJ5dGVTb3VyY2UucGVla2FibGUoQnl0ZVNvdXJjZS5vZihpbml0aWFsQnl0ZXMsIHZlcnNpb24pKTsKKyAgICAgICAgICAgICAgICBieXRlW10gZGVjb2RlZEJ5dGVzID0gQnl0ZVNvdXJjZUludmVyc2UuZ2V0VW5lc2NhcGVkQnl0ZXMoYnl0ZVNvdXJjZSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzKGluaXRpYWxCeXRlcywgZGVjb2RlZEJ5dGVzKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBpbml0aWFsQnl0ZXMgLT4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIGFkZHJlc3MgPSBNZW1vcnlVdGlsLmFsbG9jYXRlKGluaXRpYWxCeXRlcy5sZW5ndGgpOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTWVtb3J5VXRpbC5zZXRCeXRlcyhhZGRyZXNzLCBpbml0aWFsQnl0ZXMsIDAsIGluaXRpYWxCeXRlcy5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBCeXRlU291cmNlLlBlZWthYmxlIGJ5dGVTb3VyY2UgPSBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uub2ZNZW1vcnkoYWRkcmVzcywgaW5pdGlhbEJ5dGVzLmxlbmd0aCwgdmVyc2lvbikpOworICAgICAgICAgICAgICAgICAgICBieXRlW10gZGVjb2RlZEJ5dGVzID0gQnl0ZVNvdXJjZUludmVyc2UuZ2V0VW5lc2NhcGVkQnl0ZXMoYnl0ZVNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRBcnJheUVxdWFscyhpbml0aWFsQnl0ZXMsIGRlY29kZWRCeXRlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1lbW9yeVV0aWwuZnJlZShhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICApKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGJ5dGVbXSB0cmlja3kgOiBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgLy8gRVNDQVBFIC0gbGVhZGluZywgaW4gdGhlIG1pZGRsZSwgdHJhaWxpbmcKKyAgICAgICAgICAgIG5ldyBieXRlW117IDAsIDIsIDMsIDQsIDUgfSwgbmV3IGJ5dGVbXXsgMSwgMiwgMCwgNCwgNSB9LCBuZXcgYnl0ZVtdeyAxLCAyLCAzLCA0LCAwIH0sCisgICAgICAgICAgICAvLyBFTkRfT0ZfU1RSRUFNL0VTQ0FQRURfMF9ET05FIC0gbGVhZGluZywgaW4gdGhlIG1pZGRsZSwgdHJhaWxpbmcKKyAgICAgICAgICAgIG5ldyBieXRlW117IC0xLCAyLCAzLCA0LCA1IH0sIG5ldyBieXRlW117IDEsIDIsIC0xLCA0LCA1IH0sIG5ldyBieXRlW117IDEsIDIsIDMsIDQsIC0xIH0sCisgICAgICAgICAgICAvLyBFU0NBUEVEXzBfQ09OVCAtIGxlYWRpbmcsIGluIHRoZSBtaWRkbGUsIHRyYWlsaW5nCisgICAgICAgICAgICBuZXcgYnl0ZVtdeyAtMiwgMiwgMywgNCwgNSB9LCBuZXcgYnl0ZVtdeyAxLCAyLCAtMiwgNCwgNSB9LCBuZXcgYnl0ZVtdeyAxLCAyLCAzLCA0LCAtMiB9LAorICAgICAgICAgICAgLy8gRVNDQVBFICsgRVNDQVBFRF8wX0RPTkUgLSBsZWFkaW5nLCBpbiB0aGUgbWlkZGxlLCB0cmFpbGluZworICAgICAgICAgICAgbmV3IGJ5dGVbXXsgMCwgLTEsIDMsIDQsIDUgfSwgbmV3IGJ5dGVbXXsgMSwgMCwgLTEsIDQsIDUgfSwgbmV3IGJ5dGVbXXsgMSwgMiwgMywgMCwgLTEgfSwKKyAgICAgICAgICAgIC8vIEVTQ0FQRSArIEVTQ0FQRURfMF9DT05UICsgRVNDQVBFRF8wX0RPTkUgLSBsZWFkaW5nLCBpbiB0aGUgbWlkZGxlLCB0cmFpbGluZworICAgICAgICAgICAgbmV3IGJ5dGVbXXsgMCwgLTIsIC0xLCA0LCA1IH0sIG5ldyBieXRlW117IDEsIDAsIC0yLCAtMSwgNSB9LCBuZXcgYnl0ZVtdeyAxLCAyLCAwLCAtMiwgLTEgfSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZUFycmF5Q29uc3VtZXIuYWNjZXB0KHRyaWNreSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzEwMDBdOworICAgICAgICAgICAgUmFuZG9tIHBybmcgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcm5nLm5leHRCeXRlcyhieXRlcyk7CisgICAgICAgICAgICAgICAgYnl0ZUFycmF5Q29uc3VtZXIuYWNjZXB0KGJ5dGVzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHN0cmluZ0xlbmd0aCA9IDEwOworICAgICAgICAgICAgU3RyaW5nIHJhbmRvbTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJhbmRvbSA9IG5ld1JhbmRvbUFscGhhbnVtZXJpYyhwcm5nLCBzdHJpbmdMZW5ndGgpOworICAgICAgICAgICAgICAgIGJ5dGVBcnJheUNvbnN1bWVyLmFjY2VwdChyYW5kb20uZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEJ5dGVzKCkKKyAgICB7CisgICAgICAgIE1hcDxDbGFzczw/PiwgRnVuY3Rpb248T2JqZWN0LCBCeXRlU291cmNlPj4gZ2VuZXJhdG9yUGVyVHlwZSA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgTGlzdDxPYmplY3Q+IG9yaWdpbmFsVmFsdWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIFJhbmRvbSBwcm5nID0gbmV3IFJhbmRvbSgpOworCisgICAgICAgIGdlbmVyYXRvclBlclR5cGUucHV0KFN0cmluZy5jbGFzcywgcyAtPgorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgc3RyaW5nID0gKFN0cmluZykgczsKKyAgICAgICAgICAgIHJldHVybiBCeXRlU291cmNlLm9mKHN0cmluZywgdmVyc2lvbik7CisgICAgICAgIH0pOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKQorICAgICAgICAgICAgb3JpZ2luYWxWYWx1ZXMuYWRkKG5ld1JhbmRvbUFscGhhbnVtZXJpYyhwcm5nLCAxMCkpOworCisgICAgICAgIGdlbmVyYXRvclBlclR5cGUucHV0KEludGVnZXIuY2xhc3MsIGkgLT4KKyAgICAgICAgeworICAgICAgICAgICAgSW50ZWdlciBpbnRlZ2VyID0gKEludGVnZXIpIGk7CisgICAgICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZS5vZihpbnRlZ2VyKTsKKyAgICAgICAgfSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpCisgICAgICAgICAgICBvcmlnaW5hbFZhbHVlcy5hZGQocHJuZy5uZXh0SW50KCkpOworCisgICAgICAgIGdlbmVyYXRvclBlclR5cGUucHV0KExvbmcuY2xhc3MsIGwgLT4KKyAgICAgICAgeworICAgICAgICAgICAgTG9uZyBsb29vbmcgPSAoTG9uZykgbDsKKyAgICAgICAgICAgIHJldHVybiBCeXRlU291cmNlLm9mKGxvb29uZyk7CisgICAgICAgIH0pOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKQorICAgICAgICAgICAgb3JpZ2luYWxWYWx1ZXMuYWRkKHBybmcubmV4dExvbmcoKSk7CisKKyAgICAgICAgZ2VuZXJhdG9yUGVyVHlwZS5wdXQoVVVJRC5jbGFzcywgdSAtPgorICAgICAgICB7CisgICAgICAgICAgICBVVUlEIHV1aWQgPSAoVVVJRCkgdTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgdXVpZEJ1ZmZlciA9IFVVSURUeXBlLmluc3RhbmNlLmRlY29tcG9zZSh1dWlkKTsKKyAgICAgICAgICAgIHJldHVybiBVVUlEVHlwZS5pbnN0YW5jZS5hc0NvbXBhcmFibGVCeXRlcyh1dWlkQnVmZmVyLCB2ZXJzaW9uKTsKKyAgICAgICAgfSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpCisgICAgICAgICAgICBvcmlnaW5hbFZhbHVlcy5hZGQoVVVJRC5yYW5kb21VVUlEKCkpOworCisgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogb3JpZ2luYWxWYWx1ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIENsYXNzPD8+IHR5cGUgPSB2YWx1ZS5nZXRDbGFzcygpOworICAgICAgICAgICAgRnVuY3Rpb248T2JqZWN0LCBCeXRlU291cmNlPiBnZW5lcmF0b3IgPSBnZW5lcmF0b3JQZXJUeXBlLmdldCh0eXBlKTsKKyAgICAgICAgICAgIEJ5dGVTb3VyY2Ugb3JpZ2luYWxTb3VyY2UgPSBnZW5lcmF0b3IuYXBwbHkodmFsdWUpOworICAgICAgICAgICAgQnl0ZVNvdXJjZSBvcmlnaW5hbFNvdXJjZUNvcHkgPSBnZW5lcmF0b3IuYXBwbHkodmFsdWUpOworICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gQnl0ZVNvdXJjZUludmVyc2UucmVhZEJ5dGVzKG9yaWdpbmFsU291cmNlKTsKKyAgICAgICAgICAgIC8vIFRoZSBiZXN0IHdheSB0byB0ZXN0IHRoZSByZWFkIGJ5dGVzIHNlZW1zIHRvIGJlIHRvIGFzc2VydCB0aGF0IGp1c3QgZGlyZWN0bHkgdXNpbmcgdGhlbSBhcyBhCisgICAgICAgICAgICAvLyBCeXRlU291cmNlICh1c2luZyBCeXRlU291cmNlLmZpeGVkTGVuZ3RoKGJ5dGVbXSkpIHRoZXkgY29tcGFyZSBhcyBlcXVhbCB0byBhbm90aGVyIEJ5dGVTb3VyY2Ugb2J0YWluZWQKKyAgICAgICAgICAgIC8vIGZyb20gdGhlIHNhbWUgb3JpZ2luYWwgdmFsdWUuCisgICAgICAgICAgICBpbnQgY29tcGFyZSA9IEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUodiAtPiBvcmlnaW5hbFNvdXJjZUNvcHksIHYgLT4gQnl0ZVNvdXJjZS5maXhlZExlbmd0aChieXRlcyksIHZlcnNpb24pOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBjb21wYXJlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9ieXRlY29tcGFyYWJsZS9CeXRlU291cmNlU2VxdWVuY2VUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvQnl0ZVNvdXJjZVNlcXVlbmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMmJkMWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvQnl0ZVNvdXJjZVNlcXVlbmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZTsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5CdWZmZXJDbHVzdGVyaW5nQm91bmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQnVmZmVyRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNhY2hlZEhhc2hEZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0NvbXBhcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ1ByZWZpeDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTG9jYWxQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CisKK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQnl0ZVNvdXJjZVNlcXVlbmNlVGVzdAoreworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFMUEhBQkVUID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoxMjM0NTY3ODkwIUAjJCVeJiooKSI7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAidmVyc2lvbj17MH0iKQorICAgIHB1YmxpYyBzdGF0aWMgSXRlcmFibGU8Qnl0ZUNvbXBhcmFibGUuVmVyc2lvbj4gdmVyc2lvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEltbXV0YWJsZUxpc3Qub2YoQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5PU1M1MCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb247CisKKyAgICBwdWJsaWMgQnl0ZVNvdXJjZVNlcXVlbmNlVGVzdChCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE51bGxzU2VxdWVuY2UoKQorICAgIHsKKyAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IoCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5URVJNSU5BVE9SLAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwKKyAgICAgICAgKSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnROdWxsKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnROdWxsKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnROdWxsKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLlRFUk1JTkFUT1IsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE51bGxzQW5kVW5rbm93bkxlbmd0aHNTZXF1ZW5jZSgpCisgICAgeworICAgICAgICBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcyA9IEJ5dGVTb3VyY2UucGVla2FibGUoQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvcigKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLlRFUk1JTkFUT1IsCisgICAgICAgICAgICAgICAgbnVsbCwgQnl0ZVNvdXJjZS5vZigiYiIsIHZlcnNpb24pLCBCeXRlU291cmNlLm9mKCJjIiwgdmVyc2lvbikKKyAgICAgICAgKSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnROdWxsKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIEJ5dGVTb3VyY2VJbnZlcnNlOjpnZXRTdHJpbmcsICJiIik7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIEJ5dGVTb3VyY2VJbnZlcnNlOjpnZXRTdHJpbmcsICJjIik7CisgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLlRFUk1JTkFUT1IsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworCisgICAgICAgIGNvbXBhcmFibGVCeXRlcyA9IEJ5dGVTb3VyY2UucGVla2FibGUoQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvcigKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLlRFUk1JTkFUT1IsCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5vZigiYSIsIHZlcnNpb24pLCBudWxsLCBCeXRlU291cmNlLm9mKCJjIiwgdmVyc2lvbikKKyAgICAgICAgKSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIEJ5dGVTb3VyY2VJbnZlcnNlOjpnZXRTdHJpbmcsICJhIik7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnROdWxsKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIEJ5dGVTb3VyY2VJbnZlcnNlOjpnZXRTdHJpbmcsICJjIik7CisgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLlRFUk1JTkFUT1IsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworCisgICAgICAgIGNvbXBhcmFibGVCeXRlcyA9IEJ5dGVTb3VyY2UucGVla2FibGUoQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvcigKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLlRFUk1JTkFUT1IsCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5vZigiYSIsIHZlcnNpb24pLCBCeXRlU291cmNlLm9mKCJiIiwgdmVyc2lvbiksIG51bGwKKyAgICAgICAgKSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIEJ5dGVTb3VyY2VJbnZlcnNlOjpnZXRTdHJpbmcsICJhIik7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIEJ5dGVTb3VyY2VJbnZlcnNlOjpnZXRTdHJpbmcsICJiIik7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnROdWxsKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLlRFUk1JTkFUT1IsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworCisgICAgICAgIGNvbXBhcmFibGVCeXRlcyA9IEJ5dGVTb3VyY2UucGVla2FibGUoQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvcigKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLlRFUk1JTkFUT1IsCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5vZigiYSIsIHZlcnNpb24pLCBudWxsLCBudWxsCisgICAgICAgICkpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoY29tcGFyYWJsZUJ5dGVzLCBCeXRlU291cmNlSW52ZXJzZTo6Z2V0U3RyaW5nLCAiYSIpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50TnVsbChjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50TnVsbChjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5URVJNSU5BVE9SLCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKworICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IoCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5URVJNSU5BVE9SLAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIEJ5dGVTb3VyY2Uub2YoImMiLCB2ZXJzaW9uKQorICAgICAgICApKTsKKyAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudE51bGwoY29tcGFyYWJsZUJ5dGVzKTsKKyAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudE51bGwoY29tcGFyYWJsZUJ5dGVzKTsKKyAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKGNvbXBhcmFibGVCeXRlcywgQnl0ZVNvdXJjZUludmVyc2U6OmdldFN0cmluZywgImMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuVEVSTUlOQVRPUiwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBleHBlY3ROZXh0Q29tcG9uZW50TnVsbChCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcykKKyAgICB7CisgICAgICAgIC8vIFdlIGV4cGVjdCBudWxsLXNpZ25pZnlpbmcgc2VwYXJhdG9yLCBmb2xsb3dlZCBieSBhIG51bGwgQnl0ZVNvdXJjZSBjb21wb25lbnQKKyAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSBuZXh0ID0gQnl0ZVNvdXJjZUludmVyc2UubmV4dENvbXBvbmVudFNvdXJjZShjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICBhc3NlcnROdWxsKG5leHQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIDxUPiB2b2lkIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb248Qnl0ZVNvdXJjZS5QZWVrYWJsZSwgVD4gZGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCBleHBlY3RlZCkKKyAgICB7CisgICAgICAgIC8vIFdlIGV4cGVjdCBhIHJlZ3VsYXIgc2VwYXJhdG9yLCBmb2xsb3dlZCBieSBhIEJ5dGVTb3VyY2UgY29tcG9uZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGV4cGVjdGVkIHZhbHVlCisgICAgICAgIEJ5dGVTb3VyY2UuUGVla2FibGUgbmV4dCA9IEJ5dGVTb3VyY2VJbnZlcnNlLm5leHRDb21wb25lbnRTb3VyY2UoY29tcGFyYWJsZUJ5dGVzKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChuZXh0KTsKKyAgICAgICAgVCBkZWNvZGVkID0gZGVjb2Rlci5hcHBseShuZXh0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBkZWNvZGVkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsc0FuZEtub3duTGVuZ3Roc1NlcXVlbmNlKCkKKyAgICB7CisgICAgICAgIGludCBpbnRWYWx1ZSA9IDQyOworICAgICAgICBCaWdJbnRlZ2VyIHZhcmludFZhbHVlID0gQmlnSW50ZWdlci52YWx1ZU9mKDIwMThMKTsKKyAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IoCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5URVJNSU5BVE9SLAorICAgICAgICAgICAgICAgIG51bGwsIEJ5dGVTb3VyY2Uub2YoaW50VmFsdWUpLCB2YXJpbnRUb0J5dGVTb3VyY2UodmFyaW50VmFsdWUpCisgICAgICAgICkpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50TnVsbChjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoY29tcGFyYWJsZUJ5dGVzLCBCeXRlU291cmNlSW52ZXJzZTo6Z2V0U2lnbmVkSW50LCBpbnRWYWx1ZSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFZBUklOVCwgdmFyaW50VmFsdWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5URVJNSU5BVE9SLCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKworICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IoCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5URVJNSU5BVE9SLAorICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2Uub2YoaW50VmFsdWUpLCBudWxsLCB2YXJpbnRUb0J5dGVTb3VyY2UodmFyaW50VmFsdWUpCisgICAgICAgICkpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoY29tcGFyYWJsZUJ5dGVzLCBCeXRlU291cmNlSW52ZXJzZTo6Z2V0U2lnbmVkSW50LCBpbnRWYWx1ZSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnROdWxsKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFZBUklOVCwgdmFyaW50VmFsdWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5URVJNSU5BVE9SLCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKworICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IoCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5URVJNSU5BVE9SLAorICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2Uub2YoaW50VmFsdWUpLCB2YXJpbnRUb0J5dGVTb3VyY2UodmFyaW50VmFsdWUpLCBudWxsCisgICAgICAgICkpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoY29tcGFyYWJsZUJ5dGVzLCBCeXRlU291cmNlSW52ZXJzZTo6Z2V0U2lnbmVkSW50LCBpbnRWYWx1ZSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFZBUklOVCwgdmFyaW50VmFsdWUpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50TnVsbChjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5URVJNSU5BVE9SLCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKworICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IoCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5URVJNSU5BVE9SLAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIHZhcmludFRvQnl0ZVNvdXJjZSh2YXJpbnRWYWx1ZSkKKyAgICAgICAgKSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnROdWxsKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnROdWxsKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFZBUklOVCwgdmFyaW50VmFsdWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5URVJNSU5BVE9SLCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKworICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IoCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5URVJNSU5BVE9SLAorICAgICAgICAgICAgICAgIG51bGwsIHZhcmludFRvQnl0ZVNvdXJjZSh2YXJpbnRWYWx1ZSksIG51bGwKKyAgICAgICAgKSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnROdWxsKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFZBUklOVCwgdmFyaW50VmFsdWUpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50TnVsbChjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5URVJNSU5BVE9SLCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKworICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IoCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5URVJNSU5BVE9SLAorICAgICAgICAgICAgICAgIHZhcmludFRvQnl0ZVNvdXJjZSh2YXJpbnRWYWx1ZSksIG51bGwsIG51bGwKKyAgICAgICAgKSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFZBUklOVCwgdmFyaW50VmFsdWUpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50TnVsbChjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50TnVsbChjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5URVJNSU5BVE9SLCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKworICAgICAgICBCb29sZWFuIGJvb2xWYWx1ZSA9IG5ldyBSYW5kb20oKS5uZXh0Qm9vbGVhbigpOworICAgICAgICBCeXRlU291cmNlIGJvb2xTb3VyY2UgPSBCb29sZWFuVHlwZS5pbnN0YW5jZS5hc0NvbXBhcmFibGVCeXRlcyhCb29sZWFuVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoYm9vbFZhbHVlKSwgdmVyc2lvbik7CisgICAgICAgIGNvbXBhcmFibGVCeXRlcyA9IEJ5dGVTb3VyY2UucGVla2FibGUoQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvcigKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLlRFUk1JTkFUT1IsCisgICAgICAgICAgICAgICAgdmFyaW50VG9CeXRlU291cmNlKHZhcmludFZhbHVlKSwgYm9vbFNvdXJjZSwgbnVsbAorICAgICAgICApKTsKKyAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKGNvbXBhcmFibGVCeXRlcywgVkFSSU5ULCB2YXJpbnRWYWx1ZSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIEJvb2xlYW5UeXBlLmluc3RhbmNlLCBib29sVmFsdWUpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50TnVsbChjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5URVJNSU5BVE9SLCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKworICAgICAgICBib29sU291cmNlID0gQm9vbGVhblR5cGUuaW5zdGFuY2UuYXNDb21wYXJhYmxlQnl0ZXMoQm9vbGVhblR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKGJvb2xWYWx1ZSksIHZlcnNpb24pOworICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IoCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5URVJNSU5BVE9SLAorICAgICAgICAgICAgICAgIHZhcmludFRvQnl0ZVNvdXJjZSh2YXJpbnRWYWx1ZSksIG51bGwsIGJvb2xTb3VyY2UKKyAgICAgICAgKSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFZBUklOVCwgdmFyaW50VmFsdWUpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50TnVsbChjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoY29tcGFyYWJsZUJ5dGVzLCBCb29sZWFuVHlwZS5pbnN0YW5jZSwgYm9vbFZhbHVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuVEVSTUlOQVRPUiwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3B0aW9uYWxTaWduZWRGaXhlZExlbmd0aFR5cGVzU2VxdWVuY2UoKQorICAgIHsKKyAgICAgICAgUmFuZG9tIHBybmcgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgIFN0cmluZyByYW5kb21TdHJpbmcgPSBuZXdSYW5kb21BbHBoYW51bWVyaWMocHJuZywgMTApOworICAgICAgICBieXRlIHJhbmRvbUJ5dGUgPSAoYnl0ZSkgcHJuZy5uZXh0SW50KCk7CisgICAgICAgIHNob3J0IHJhbmRvbVNob3J0ID0gKHNob3J0KSBwcm5nLm5leHRJbnQoKTsKKyAgICAgICAgaW50IHJhbmRvbUludCA9IHBybmcubmV4dEludCgpOworICAgICAgICBsb25nIHJhbmRvbUxvbmcgPSBwcm5nLm5leHRMb25nKCk7CisgICAgICAgIEJpZ0ludGVnZXIgcmFuZG9tVmFyaW50ID0gQmlnSW50ZWdlci5wcm9iYWJsZVByaW1lKDgwLCBwcm5nKTsKKworICAgICAgICBNYXA8QWJzdHJhY3RUeXBlPD8+LCBCeXRlQnVmZmVyPiB2YWx1ZXNCeVR5cGUgPSBuZXcgSGFzaE1hcDxBYnN0cmFjdFR5cGU8Pz4sIEJ5dGVCdWZmZXI+KCkKKyAgICAgICAge3sKKyAgICAgICAgICAgIHB1dChCeXRlVHlwZS5pbnN0YW5jZSwgQnl0ZVR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKHJhbmRvbUJ5dGUpKTsKKyAgICAgICAgICAgIHB1dChTaG9ydFR5cGUuaW5zdGFuY2UsIFNob3J0VHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UocmFuZG9tU2hvcnQpKTsKKyAgICAgICAgICAgIHB1dChTaW1wbGVEYXRlVHlwZS5pbnN0YW5jZSwgU2ltcGxlRGF0ZVR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKHJhbmRvbUludCkpOworICAgICAgICAgICAgcHV0KFRpbWVUeXBlLmluc3RhbmNlLCBUaW1lVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UocmFuZG9tTG9uZykpOworICAgICAgICB9fTsKKworICAgICAgICBmb3IgKE1hcC5FbnRyeTxBYnN0cmFjdFR5cGU8Pz4sIEJ5dGVCdWZmZXI+IGVudHJ5IDogdmFsdWVzQnlUeXBlLmVudHJ5U2V0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiB0eXBlID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKKworICAgICAgICAgICAgQnl0ZVNvdXJjZSBieXRlU291cmNlID0gdHlwZS5hc0NvbXBhcmFibGVCeXRlcyh2YWx1ZSwgdmVyc2lvbik7CisgICAgICAgICAgICBCeXRlU291cmNlLlBlZWthYmxlIHNlcXVlbmNlID0gQnl0ZVNvdXJjZS5wZWVrYWJsZShCeXRlU291cmNlLndpdGhUZXJtaW5hdG9yKAorICAgICAgICAgICAgICAgICAgICBCeXRlU291cmNlLlRFUk1JTkFUT1IsCisgICAgICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2Uub2YocmFuZG9tU3RyaW5nLCB2ZXJzaW9uKSwgYnl0ZVNvdXJjZSwgdmFyaW50VG9CeXRlU291cmNlKHJhbmRvbVZhcmludCkKKyAgICAgICAgICAgICkpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKHNlcXVlbmNlLCBCeXRlU291cmNlSW52ZXJzZTo6Z2V0U3RyaW5nLCByYW5kb21TdHJpbmcpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKHNlcXVlbmNlLCB0eXBlLCB2YWx1ZSk7CisgICAgICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoc2VxdWVuY2UsIFZBUklOVCwgcmFuZG9tVmFyaW50KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLlRFUk1JTkFUT1IsIHNlcXVlbmNlLm5leHQoKSk7CisKKyAgICAgICAgICAgIGJ5dGVTb3VyY2UgPSB0eXBlLmFzQ29tcGFyYWJsZUJ5dGVzKHR5cGUuZGVjb21wb3NlKG51bGwpLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIHNlcXVlbmNlID0gQnl0ZVNvdXJjZS5wZWVrYWJsZShCeXRlU291cmNlLndpdGhUZXJtaW5hdG9yKAorICAgICAgICAgICAgICAgICAgICBCeXRlU291cmNlLlRFUk1JTkFUT1IsCisgICAgICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2Uub2YocmFuZG9tU3RyaW5nLCB2ZXJzaW9uKSwgYnl0ZVNvdXJjZSwgdmFyaW50VG9CeXRlU291cmNlKHJhbmRvbVZhcmludCkKKyAgICAgICAgICAgICkpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKHNlcXVlbmNlLCBCeXRlU291cmNlSW52ZXJzZTo6Z2V0U3RyaW5nLCByYW5kb21TdHJpbmcpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudE51bGwoc2VxdWVuY2UpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKHNlcXVlbmNlLCBWQVJJTlQsIHJhbmRvbVZhcmludCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5URVJNSU5BVE9SLCBzZXF1ZW5jZS5uZXh0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBCeXRlU291cmNlIHZhcmludFRvQnl0ZVNvdXJjZShCaWdJbnRlZ2VyIHZhbHVlKQorICAgIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciB2YWx1ZUJ5dGVCdWZmZXIgPSBWQVJJTlQuZGVjb21wb3NlKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIFZBUklOVC5hc0NvbXBhcmFibGVCeXRlcyh2YWx1ZUJ5dGVCdWZmZXIsIHZlcnNpb24pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVURjhUeXBlIFVURjggPSBVVEY4VHlwZS5pbnN0YW5jZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNpbWFsVHlwZSBERUNJTUFMID0gRGVjaW1hbFR5cGUuaW5zdGFuY2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50ZWdlclR5cGUgVkFSSU5UID0gSW50ZWdlclR5cGUuaW5zdGFuY2U7CisKKyAgICAvLyBBIHJlZ3VsYXIgY29tcGFyYXRvciB1c2luZyB0aGUgbmF0dXJhbCBvcmRlcmluZyBmb3IgYWxsIHR5cGVzLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsdXN0ZXJpbmdDb21wYXJhdG9yIENPTVAgPSBuZXcgQ2x1c3RlcmluZ0NvbXBhcmF0b3IoQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgIFVURjgsCisgICAgICAgICAgICBERUNJTUFMLAorICAgICAgICAgICAgVkFSSU5UCisgICAgKSk7CisgICAgLy8gQSBjb21wYXJhdG9yIHRoYXQgcmV2ZXJzZXMgdGhlIG9yZGVyaW5nIGZvciB0aGUgZmlyc3QgdW5rbm93biBsZW5ndGggdHlwZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsdXN0ZXJpbmdDb21wYXJhdG9yIENPTVBfUkVWRVJTRURfVU5LTk9XTl9MRU5HVEggPSBuZXcgQ2x1c3RlcmluZ0NvbXBhcmF0b3IoQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgIFJldmVyc2VkVHlwZS5nZXRJbnN0YW5jZShVVEY4KSwKKyAgICAgICAgICAgIERFQ0lNQUwsCisgICAgICAgICAgICBWQVJJTlQKKyAgICApKTsKKyAgICAvLyBBIGNvbXBhcmF0b3IgdGhhdCByZXZlcnNlcyB0aGUgb3JkZXJpbmcgZm9yIHRoZSBzZWNvbmQgdW5rbm93biBsZW5ndGggdHlwZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsdXN0ZXJpbmdDb21wYXJhdG9yIENPTVBfUkVWRVJTRURfVU5LTk9XTl9MRU5HVEhfMiA9IG5ldyBDbHVzdGVyaW5nQ29tcGFyYXRvcihBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgVVRGOCwKKyAgICAgICAgICAgIFJldmVyc2VkVHlwZS5nZXRJbnN0YW5jZShERUNJTUFMKSwKKyAgICAgICAgICAgIFZBUklOVAorICAgICkpOworICAgIC8vIEEgY29tcGFyYXRvciB0aGF0IHJldmVyc2VzIHRoZSBvcmRlcmluZyBmb3IgdGhlIHNvbGUga25vd24vY29tcHV0YWJsZSBsZW5ndGggdHlwZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsdXN0ZXJpbmdDb21wYXJhdG9yIENPTVBfUkVWRVJTRURfS05PV05fTEVOR1RIID0gbmV3IENsdXN0ZXJpbmdDb21wYXJhdG9yKEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICBVVEY4LAorICAgICAgICAgICAgREVDSU1BTCwKKyAgICAgICAgICAgIFJldmVyc2VkVHlwZS5nZXRJbnN0YW5jZShWQVJJTlQpCisgICAgKSk7CisgICAgLy8gQSBjb21wYXJhdG9yIHRoYXQgcmV2ZXJzZXMgdGhlIG9yZGVyaW5nIGZvciBhbGwgdHlwZXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbHVzdGVyaW5nQ29tcGFyYXRvciBDT01QX0FMTF9SRVZFUlNFRCA9IG5ldyBDbHVzdGVyaW5nQ29tcGFyYXRvcihBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgUmV2ZXJzZWRUeXBlLmdldEluc3RhbmNlKFVURjgpLAorICAgICAgICAgICAgUmV2ZXJzZWRUeXBlLmdldEluc3RhbmNlKERFQ0lNQUwpLAorICAgICAgICAgICAgUmV2ZXJzZWRUeXBlLmdldEluc3RhbmNlKFZBUklOVCkKKyAgICApKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsdXN0ZXJpbmdQcmVmaXhCb3VuZE5vcm1hbEFuZFJldmVyc2VkKCkKKyAgICB7CisgICAgICAgIFN0cmluZyBzdHJpbmdWYWx1ZSA9ICJMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCI7CisgICAgICAgIEJpZ0RlY2ltYWwgZGVjaW1hbFZhbHVlID0gQmlnRGVjaW1hbC52YWx1ZU9mKDEyMzQ1Njc4OSwgMjApOworICAgICAgICBCaWdJbnRlZ2VyIHZhcmludFZhbHVlID0gQmlnSW50ZWdlci52YWx1ZU9mKDIwMThMKTsKKworICAgICAgICAvLyBDcmVhdGUgc29tZSBub24tbnVsbCBjbHVzdGVyaW5nIGtleSB2YWx1ZXMgdGhhdCB3aWxsIGJlIGVuY29kZWQgYW5kIGRlY29kZWQgdG8gYnl0ZS1vcmRlcmVkIHJlcHJlc2VudGF0aW9uCisgICAgICAgIC8vIHdpdGggZGlmZmVyZW50IHR5cGVzIG9mIGNsdXN0ZXJpbmcgY29tcGFyYXRvcnMgKGFuZCBpbiBvdGhlciB0ZXN0cyB3aXRoIGRpZmZlcmVudCB0eXBlcyBvZiBwcmVmaXhlcykuCisgICAgICAgIEJ5dGVCdWZmZXJbXSBjbHVzdGVyaW5nS2V5VmFsdWVzID0gbmV3IEJ5dGVCdWZmZXJbXSB7CisgICAgICAgICAgICAgICAgVVRGOC5kZWNvbXBvc2Uoc3RyaW5nVmFsdWUpLAorICAgICAgICAgICAgICAgIERFQ0lNQUwuZGVjb21wb3NlKGRlY2ltYWxWYWx1ZSksCisgICAgICAgICAgICAgICAgVkFSSU5ULmRlY29tcG9zZSh2YXJpbnRWYWx1ZSkKKyAgICAgICAgfTsKKworICAgICAgICBmb3IgKENsdXN0ZXJpbmdQcmVmaXguS2luZCBwcmVmaXhLaW5kIDogQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLnZhbHVlcygpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocHJlZml4S2luZC5pc0JvdW5kYXJ5KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXggcHJlZml4ID0gQnVmZmVyQ2x1c3RlcmluZ0JvdW5kLmNyZWF0ZShwcmVmaXhLaW5kLCBjbHVzdGVyaW5nS2V5VmFsdWVzKTsKKyAgICAgICAgICAgIC8vIFVzZSB0aGUgcmVndWxhciBjb21wYXJhdG9yLgorICAgICAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKENPTVAuYXNCeXRlQ29tcGFyYWJsZShwcmVmaXgpLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFVURjgsIHN0cmluZ1ZhbHVlKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIERFQ0lNQUwsIGRlY2ltYWxWYWx1ZSk7CisgICAgICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoY29tcGFyYWJsZUJ5dGVzLCBWQVJJTlQsIHZhcmludFZhbHVlKTsKKworICAgICAgICAgICAgcHJlZml4ID0gQnVmZmVyQ2x1c3RlcmluZ0JvdW5kLmNyZWF0ZShwcmVmaXhLaW5kLCBjbHVzdGVyaW5nS2V5VmFsdWVzKTsKKyAgICAgICAgICAgIC8vIFVzZSB0aGUgY29tcGFyYXRvciByZXZlcnNpbmcgdGhlIG9yZGVyaW5nIGZvciB0aGUgZmlyc3QgdW5rbm93biBsZW5ndGggdHlwZS4KKyAgICAgICAgICAgIGNvbXBhcmFibGVCeXRlcyA9IEJ5dGVTb3VyY2UucGVla2FibGUoQ09NUF9SRVZFUlNFRF9VTktOT1dOX0xFTkdUSC5hc0J5dGVDb21wYXJhYmxlKHByZWZpeCkuYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbikpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKGNvbXBhcmFibGVCeXRlcywgUmV2ZXJzZWRUeXBlLmdldEluc3RhbmNlKFVURjgpLCBzdHJpbmdWYWx1ZSk7CisgICAgICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoY29tcGFyYWJsZUJ5dGVzLCBERUNJTUFMLCBkZWNpbWFsVmFsdWUpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKGNvbXBhcmFibGVCeXRlcywgVkFSSU5ULCB2YXJpbnRWYWx1ZSk7CisKKyAgICAgICAgICAgIHByZWZpeCA9IEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZC5jcmVhdGUocHJlZml4S2luZCwgY2x1c3RlcmluZ0tleVZhbHVlcyk7CisgICAgICAgICAgICAvLyBVc2UgdGhlIGNvbXBhcmF0b3IgcmV2ZXJzaW5nIHRoZSBvcmRlcmluZyBmb3IgdGhlIHNlY29uZCB1bmtub3duIGxlbmd0aCB0eXBlLgorICAgICAgICAgICAgY29tcGFyYWJsZUJ5dGVzID0gQnl0ZVNvdXJjZS5wZWVrYWJsZShDT01QX1JFVkVSU0VEX1VOS05PV05fTEVOR1RIXzIuYXNCeXRlQ29tcGFyYWJsZShwcmVmaXgpLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFVURjgsIHN0cmluZ1ZhbHVlKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFJldmVyc2VkVHlwZS5nZXRJbnN0YW5jZShERUNJTUFMKSwgZGVjaW1hbFZhbHVlKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFZBUklOVCwgdmFyaW50VmFsdWUpOworCisgICAgICAgICAgICBwcmVmaXggPSBCdWZmZXJDbHVzdGVyaW5nQm91bmQuY3JlYXRlKHByZWZpeEtpbmQsIGNsdXN0ZXJpbmdLZXlWYWx1ZXMpOworICAgICAgICAgICAgLy8gVXNlIHRoZSBjb21wYXJhdG9yIHJldmVyc2luZyB0aGUgb3JkZXJpbmcgZm9yIHRoZSBrbm93bi9jb21wdXRhYmxlIGxlbmd0aCB0eXBlLgorICAgICAgICAgICAgY29tcGFyYWJsZUJ5dGVzID0gQnl0ZVNvdXJjZS5wZWVrYWJsZShDT01QX1JFVkVSU0VEX0tOT1dOX0xFTkdUSC5hc0J5dGVDb21wYXJhYmxlKHByZWZpeCkuYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbikpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKGNvbXBhcmFibGVCeXRlcywgVVRGOCwgc3RyaW5nVmFsdWUpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKGNvbXBhcmFibGVCeXRlcywgREVDSU1BTCwgZGVjaW1hbFZhbHVlKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFJldmVyc2VkVHlwZS5nZXRJbnN0YW5jZShWQVJJTlQpLCB2YXJpbnRWYWx1ZSk7CisKKyAgICAgICAgICAgIHByZWZpeCA9IEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZC5jcmVhdGUocHJlZml4S2luZCwgY2x1c3RlcmluZ0tleVZhbHVlcyk7CisgICAgICAgICAgICAvLyBVc2UgdGhlIGFsbC1yZXZlcnNpbmcgY29tcGFyYXRvci4KKyAgICAgICAgICAgIGNvbXBhcmFibGVCeXRlcyA9IEJ5dGVTb3VyY2UucGVla2FibGUoQ09NUF9BTExfUkVWRVJTRUQuYXNCeXRlQ29tcGFyYWJsZShwcmVmaXgpLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFJldmVyc2VkVHlwZS5nZXRJbnN0YW5jZShVVEY4KSwgc3RyaW5nVmFsdWUpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKGNvbXBhcmFibGVCeXRlcywgUmV2ZXJzZWRUeXBlLmdldEluc3RhbmNlKERFQ0lNQUwpLCBkZWNpbWFsVmFsdWUpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKGNvbXBhcmFibGVCeXRlcywgUmV2ZXJzZWRUeXBlLmdldEluc3RhbmNlKFZBUklOVCksIHZhcmludFZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsdXN0ZXJpbmdQcmVmaXhCb3VuZE51bGxzKCkKKyAgICB7CisgICAgICAgIFN0cmluZyBzdHJpbmdWYWx1ZSA9ICJMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCI7CisgICAgICAgIEJpZ0RlY2ltYWwgZGVjaW1hbFZhbHVlID0gQmlnRGVjaW1hbC52YWx1ZU9mKDEyMzQ1Njc4OSwgMjApOworICAgICAgICBCaWdJbnRlZ2VyIHZhcmludFZhbHVlID0gQmlnSW50ZWdlci52YWx1ZU9mKDIwMThMKTsKKworICAgICAgICAvLyBDcmVhdGUgY2x1c3RlcmluZyBrZXkgdmFsdWVzIHdoZXJlIHRoZSBjb21wb25lbnQgZm9yIGFuIHVua25vd24gbGVuZ3RoIHR5cGUgaXMgbnVsbC4KKyAgICAgICAgQnl0ZUJ1ZmZlcltdIHVua25vd25MZW5ndGhOdWxsID0gbmV3IEJ5dGVCdWZmZXJbXSB7CisgICAgICAgICAgICAgICAgVVRGOC5kZWNvbXBvc2Uoc3RyaW5nVmFsdWUpLAorICAgICAgICAgICAgICAgIERFQ0lNQUwuZGVjb21wb3NlKG51bGwpLAorICAgICAgICAgICAgICAgIFZBUklOVC5kZWNvbXBvc2UodmFyaW50VmFsdWUpCisgICAgICAgIH07CisgICAgICAgIC8vIENyZWF0ZSBjbHVzdGVyaW5nIGtleSB2YWx1ZXMgd2hlcmUgdGhlIGNvbXBvbmVudCBmb3IgYSBrbm93bi9jb21wdXRhYmxlIGxlbmd0aCB0eXBlIGlzIG51bGwuCisgICAgICAgIEJ5dGVCdWZmZXJbXSBrbm93bkxlbmd0aE51bGwgPSBuZXcgQnl0ZUJ1ZmZlcltdIHsKKyAgICAgICAgICAgICAgICBVVEY4LmRlY29tcG9zZShzdHJpbmdWYWx1ZSksCisgICAgICAgICAgICAgICAgREVDSU1BTC5kZWNvbXBvc2UoZGVjaW1hbFZhbHVlKSwKKyAgICAgICAgICAgICAgICBWQVJJTlQuZGVjb21wb3NlKG51bGwpCisgICAgICAgIH07CisKKyAgICAgICAgZm9yIChDbHVzdGVyaW5nUHJlZml4LktpbmQgcHJlZml4S2luZCA6IENsdXN0ZXJpbmdQcmVmaXguS2luZC52YWx1ZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHByZWZpeEtpbmQuaXNCb3VuZGFyeSgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvLyBUZXN0IHRoZSBkZWNvZGluZyBvZiBhIG51bGwgY29tcG9uZW50IG9mIGEgbm9uLXJldmVyc2VkIHVua25vd24gbGVuZ3RoIHR5cGUuCisgICAgICAgICAgICBDbHVzdGVyaW5nUHJlZml4IHByZWZpeCA9IEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZC5jcmVhdGUocHJlZml4S2luZCwgdW5rbm93bkxlbmd0aE51bGwpOworICAgICAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKENPTVAuYXNCeXRlQ29tcGFyYWJsZShwcmVmaXgpLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFVURjgsIHN0cmluZ1ZhbHVlKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnROdWxsKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoY29tcGFyYWJsZUJ5dGVzLCBWQVJJTlQsIHZhcmludFZhbHVlKTsKKyAgICAgICAgICAgIC8vIFRlc3QgdGhlIGRlY29kaW5nIG9mIGEgbnVsbCBjb21wb25lbnQgb2YgYSByZXZlcnNlZCB1bmtub3duIGxlbmd0aCB0eXBlLgorICAgICAgICAgICAgcHJlZml4ID0gQnVmZmVyQ2x1c3RlcmluZ0JvdW5kLmNyZWF0ZShwcmVmaXhLaW5kLCB1bmtub3duTGVuZ3RoTnVsbCk7CisgICAgICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKENPTVBfUkVWRVJTRURfVU5LTk9XTl9MRU5HVEhfMi5hc0J5dGVDb21wYXJhYmxlKHByZWZpeCkuYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbikpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKGNvbXBhcmFibGVCeXRlcywgVVRGOCwgc3RyaW5nVmFsdWUpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudE51bGwoY29tcGFyYWJsZUJ5dGVzKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFZBUklOVCwgdmFyaW50VmFsdWUpOworCisgICAgICAgICAgICAvLyBUZXN0IHRoZSBkZWNvZGluZyBvZiBhIG51bGwgY29tcG9uZW50IG9mIGEgbm9uLXJldmVyc2VkIGtub3duL2NvbXB1dGFibGUgbGVuZ3RoIHR5cGUuCisgICAgICAgICAgICBwcmVmaXggPSBCdWZmZXJDbHVzdGVyaW5nQm91bmQuY3JlYXRlKHByZWZpeEtpbmQsIGtub3duTGVuZ3RoTnVsbCk7CisgICAgICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKENPTVAuYXNCeXRlQ29tcGFyYWJsZShwcmVmaXgpLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFVURjgsIHN0cmluZ1ZhbHVlKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIERFQ0lNQUwsIGRlY2ltYWxWYWx1ZSk7CisgICAgICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50TnVsbChjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICAgICAgLy8gVGVzdCB0aGUgZGVjb2Rpbmcgb2YgYSBudWxsIGNvbXBvbmVudCBvZiBhIHJldmVyc2VkIGtub3duL2NvbXB1dGFibGUgbGVuZ3RoIHR5cGUuCisgICAgICAgICAgICBwcmVmaXggPSBCdWZmZXJDbHVzdGVyaW5nQm91bmQuY3JlYXRlKHByZWZpeEtpbmQsIGtub3duTGVuZ3RoTnVsbCk7CisgICAgICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKENPTVBfUkVWRVJTRURfS05PV05fTEVOR1RILmFzQnl0ZUNvbXBhcmFibGUocHJlZml4KS5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSk7CisgICAgICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoY29tcGFyYWJsZUJ5dGVzLCBVVEY4LCBzdHJpbmdWYWx1ZSk7CisgICAgICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoY29tcGFyYWJsZUJ5dGVzLCBERUNJTUFMLCBkZWNpbWFsVmFsdWUpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudE51bGwoY29tcGFyYWJsZUJ5dGVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgPFQ+IHZvaWQgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTxUPiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgZXhwZWN0ZWQpCisgICAgeworICAgICAgICAvLyBXZSBleHBlY3QgYSByZWd1bGFyIHNlcGFyYXRvciwgZm9sbG93ZWQgYnkgYSBCeXRlU291cmNlIGNvbXBvbmVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBleHBlY3RlZCB2YWx1ZQorICAgICAgICBCeXRlU291cmNlLlBlZWthYmxlIG5leHQgPSBCeXRlU291cmNlSW52ZXJzZS5uZXh0Q29tcG9uZW50U291cmNlKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIFQgZGVjb2RlZCA9IHR5cGUuY29tcG9zZSh0eXBlLmZyb21Db21wYXJhYmxlQnl0ZXMobmV4dCwgdmVyc2lvbikpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGRlY29kZWQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgZXhwZWN0ZWQpCisgICAgeworICAgICAgICAvLyBXZSBleHBlY3QgYSByZWd1bGFyIHNlcGFyYXRvciwgZm9sbG93ZWQgYnkgYSBCeXRlU291cmNlIGNvbXBvbmVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBleHBlY3RlZCB2YWx1ZQorICAgICAgICBCeXRlU291cmNlLlBlZWthYmxlIG5leHQgPSBCeXRlU291cmNlSW52ZXJzZS5uZXh0Q29tcG9uZW50U291cmNlKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgdHlwZS5mcm9tQ29tcGFyYWJsZUJ5dGVzKG5leHQsIHZlcnNpb24pKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCb3VuZEZyb21QcmVmaXhUZXJtaW5hdG9yKCkKKyAgICB7CisgICAgICAgIFN0cmluZyBzdHJpbmdWYWx1ZSA9ICJMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCI7CisgICAgICAgIEJpZ0RlY2ltYWwgZGVjaW1hbFZhbHVlID0gQmlnRGVjaW1hbC52YWx1ZU9mKDEyMzQ1Njc4OSwgMjApOworICAgICAgICBCaWdJbnRlZ2VyIHZhcmludFZhbHVlID0gQmlnSW50ZWdlci52YWx1ZU9mKDIwMThMKTsKKworICAgICAgICBCeXRlQnVmZmVyW10gY2x1c3RlcmluZ0tleVZhbHVlcyA9IG5ldyBCeXRlQnVmZmVyW10geworICAgICAgICAgICAgICAgIFVURjguZGVjb21wb3NlKHN0cmluZ1ZhbHVlKSwKKyAgICAgICAgICAgICAgICBERUNJTUFMLmRlY29tcG9zZShkZWNpbWFsVmFsdWUpLAorICAgICAgICAgICAgICAgIFZBUklOVC5kZWNvbXBvc2UodmFyaW50VmFsdWUpCisgICAgICAgIH07CisgICAgICAgIEJ5dGVCdWZmZXJbXSBudWxsVmFsdWVCZWZvcmVUZXJtaW5hdG9yID0gbmV3IEJ5dGVCdWZmZXJbXSB7CisgICAgICAgICAgICAgICAgVVRGOC5kZWNvbXBvc2Uoc3RyaW5nVmFsdWUpLAorICAgICAgICAgICAgICAgIERFQ0lNQUwuZGVjb21wb3NlKGRlY2ltYWxWYWx1ZSksCisgICAgICAgICAgICAgICAgVkFSSU5ULmRlY29tcG9zZShudWxsKQorICAgICAgICB9OworCisgICAgICAgIGZvciAoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kIHByZWZpeEtpbmQgOiBDbHVzdGVyaW5nUHJlZml4LktpbmQudmFsdWVzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5PVEUgZGltaXRhci5kaW1pdHJvdiBJIGFzc3VtZSB0aGVyZSdzIGEgc2Vuc2libGUgZXhwbGFuYXRpb24gd2h5IGRvZXMgU1RBVElDX0NMVVNURVJJTkcgdXNlIGEgY3VzdG9tCisgICAgICAgICAgICAvLyB0ZXJtaW5hdG9yIHRoYXQncyBub3Qgb25lIG9mIHRoZSBjb21tb24gc2VwYXJhdG9yIHZhbHVlcywgYnV0IEkgaGF2ZW4ndCBzcGVudCBlbm91Z2ggdGltZSB0byBnZXQgaXQuCisgICAgICAgICAgICBpZiAocHJlZml4S2luZC5pc0JvdW5kYXJ5KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8vIFRlc3QgdGhhdCB0aGUgcmVhZCB0ZXJtaW5hdG9yIHZhbHVlIGlzIGV4YWN0bHkgdGhlIGVuY29kZWQgdmFsdWUgb2YgdGhpcyBwcmVmaXgnIGJvdW5kLgorICAgICAgICAgICAgQ2x1c3RlcmluZ1ByZWZpeCBwcmVmaXggPSBCdWZmZXJDbHVzdGVyaW5nQm91bmQuY3JlYXRlKHByZWZpeEtpbmQsIGNsdXN0ZXJpbmdLZXlWYWx1ZXMpOworICAgICAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKENPTVAuYXNCeXRlQ29tcGFyYWJsZShwcmVmaXgpLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLk5FWFRfQ09NUE9ORU5ULCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKyAgICAgICAgICAgIEJ5dGVTb3VyY2VJbnZlcnNlLmdldFN0cmluZyhjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICAgICAgREVDSU1BTC5mcm9tQ29tcGFyYWJsZUJ5dGVzKGNvbXBhcmFibGVCeXRlcywgdmVyc2lvbik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVCwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgICAgICBWQVJJTlQuZnJvbUNvbXBhcmFibGVCeXRlcyhjb21wYXJhYmxlQnl0ZXMsIHZlcnNpb24pOworICAgICAgICAgICAgLy8gRXhwZWN0IHRoZSBsYXN0IHNlcGFyYXRvciAoaS5lLiB0aGUgdGVybWluYXRvcikgdG8gYmUgdGhlIG9uZSBzcGVjaWZpZWQgYnkgdGhlIHByZWZpeCBraW5kLgorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHByZWZpeEtpbmQuYXNCeXRlQ29tcGFyYWJsZVZhbHVlKHZlcnNpb24pLCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKworICAgICAgICAgICAgLy8gVGVzdCB0aGF0IHRoZSByZWFkIHRlcm1pbmF0b3IgdmFsdWUgaXMgZXhhY3RseSB0aGUgZW5jb2RlZCB2YWx1ZSBvZiB0aGlzIHByZWZpeCcgYm91bmQsIHdoZW4gdGhlCisgICAgICAgICAgICAvLyB0ZXJtaW5hdG9yIGlzIHByZWNlZGVkIGJ5IGEgbnVsbCB2YWx1ZS4KKyAgICAgICAgICAgIHByZWZpeCA9IEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZC5jcmVhdGUocHJlZml4S2luZCwgbnVsbFZhbHVlQmVmb3JlVGVybWluYXRvcik7CisgICAgICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKENPTVAuYXNCeXRlQ29tcGFyYWJsZShwcmVmaXgpLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLk5FWFRfQ09NUE9ORU5ULCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKyAgICAgICAgICAgIEJ5dGVTb3VyY2VJbnZlcnNlLmdldFN0cmluZyhjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICAgICAgREVDSU1BTC5mcm9tQ29tcGFyYWJsZUJ5dGVzKGNvbXBhcmFibGVCeXRlcywgdmVyc2lvbik7CisgICAgICAgICAgICAvLyBFeHBlY3QgbnVsbC1zaWduaWZ5aW5nIHNlcGFyYXRvciBoZXJlLgorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlRfRU1QVFksIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICAgICAgLy8gTm8gdmFyaW50IHRvIHJlYWQKKyAgICAgICAgICAgIC8vIEV4cGVjdCB0aGUgbGFzdCBzZXBhcmF0b3IgKGkuZS4gdGhlIHRlcm1pbmF0b3IpIHRvIGJlIHRoZSBvbmUgc3BlY2lmaWVkIGJ5IHRoZSBwcmVmaXgga2luZC4KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcmVmaXhLaW5kLmFzQnl0ZUNvbXBhcmFibGVWYWx1ZSh2ZXJzaW9uKSwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisKKyAgICAgICAgICAgIC8vIFRlc3QgdGhhdCB0aGUgcmVhZCB0ZXJtaW5hdG9yIHZhbHVlIGlzIGV4YWN0bHkgdGhlIGVuY29kZWQgdmFsdWUgb2YgdGhpcyBwcmVmaXgnIGJvdW5kLCB3aGVuIHRoZQorICAgICAgICAgICAgLy8gdGVybWluYXRvciBpcyBwcmVjZWRlZCBieSBhIHJldmVyc2VkIG51bGwgdmFsdWUuCisgICAgICAgICAgICBwcmVmaXggPSBCdWZmZXJDbHVzdGVyaW5nQm91bmQuY3JlYXRlKHByZWZpeEtpbmQsIG51bGxWYWx1ZUJlZm9yZVRlcm1pbmF0b3IpOworICAgICAgICAgICAgLy8gVGhhdCdzIHRoZSBjb21wYXJhdG9yIHRoYXQgd2lsbCByZXZlcnNlIHRoZSBvcmRlcmluZyBvZiB0aGUgdHlwZSBvZiB0aGUgbGFzdCB2YWx1ZSBpbiB0aGUgcHJlZml4ICh0aGUKKyAgICAgICAgICAgIC8vIG9uZSBiZWZvcmUgdGhlIHRlcm1pbmF0b3IpLiBJbiBvdGhlciB0ZXN0cyB3ZSdyZSBtb3JlIGludGVyZXN0ZWQgaW4gdGhlIGZhY3QgdGhhdCB2YWx1ZXMgb2YgdGhpcyB0eXBlCisgICAgICAgICAgICAvLyBoYXZlIGtub3duL2NvbXB1dGFibGUgbGVuZ3RoLCB3aGljaCBpcyB3aHkgd2UndmUgbmFtZWQgaXQgc28uLi4KKyAgICAgICAgICAgIGNvbXBhcmFibGVCeXRlcyA9IEJ5dGVTb3VyY2UucGVla2FibGUoQ09NUF9SRVZFUlNFRF9LTk9XTl9MRU5HVEguYXNCeXRlQ29tcGFyYWJsZShwcmVmaXgpLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLk5FWFRfQ09NUE9ORU5ULCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKyAgICAgICAgICAgIEJ5dGVTb3VyY2VJbnZlcnNlLmdldFN0cmluZyhjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICAgICAgREVDSU1BTC5mcm9tQ29tcGFyYWJsZUJ5dGVzKGNvbXBhcmFibGVCeXRlcywgdmVyc2lvbik7CisgICAgICAgICAgICAvLyBFeHBlY3QgcmV2ZXJzZWQgbnVsbC1zaWduaWZ5aW5nIHNlcGFyYXRvciBoZXJlLgorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlRfRU1QVFlfUkVWRVJTRUQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICAgICAgLy8gTm8gdmFyaW50IHRvIHJlYWQKKyAgICAgICAgICAgIC8vIEV4cGVjdCB0aGUgbGFzdCBzZXBhcmF0b3IgKGkuZS4gdGhlIHRlcm1pbmF0b3IpIHRvIGJlIHRoZSBvbmUgc3BlY2lmaWVkIGJ5IHRoZSBwcmVmaXgga2luZC4KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcmVmaXhLaW5kLmFzQnl0ZUNvbXBhcmFibGVWYWx1ZSh2ZXJzaW9uKSwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlZFR5cGVzSW5DbHVzdGVyaW5nS2V5KCkKKyAgICB7CisgICAgICAgIFN0cmluZyBzdHJpbmdWYWx1ZSA9ICJMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCI7CisgICAgICAgIEJpZ0RlY2ltYWwgZGVjaW1hbFZhbHVlID0gQmlnRGVjaW1hbC52YWx1ZU9mKDEyMzQ1Njc4OSwgMjApOworCisgICAgICAgIEFic3RyYWN0VHlwZTxTdHJpbmc+IHJldmVyc2VkU3RyaW5nVHlwZSA9IFJldmVyc2VkVHlwZS5nZXRJbnN0YW5jZShVVEY4KTsKKyAgICAgICAgQWJzdHJhY3RUeXBlPEJpZ0RlY2ltYWw+IHJldmVyc2VkRGVjaW1hbFR5cGUgPSBSZXZlcnNlZFR5cGUuZ2V0SW5zdGFuY2UoREVDSU1BTCk7CisKKyAgICAgICAgZmluYWwgQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvciA9IG5ldyBDbHVzdGVyaW5nQ29tcGFyYXRvcihBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgIC8vIHVua25vd24gbGVuZ3RoIHR5cGUKKyAgICAgICAgICAgICAgICBVVEY4LAorICAgICAgICAgICAgICAgIC8vIGtub3duIGxlbmd0aCB0eXBlCisgICAgICAgICAgICAgICAgREVDSU1BTCwKKyAgICAgICAgICAgICAgICAvLyByZXZlcnNlZCB1bmtub3duIGxlbmd0aCB0eXBlCisgICAgICAgICAgICAgICAgcmV2ZXJzZWRTdHJpbmdUeXBlLAorICAgICAgICAgICAgICAgIC8vIHJldmVyc2VkIGtub3duIGxlbmd0aCB0eXBlCisgICAgICAgICAgICAgICAgcmV2ZXJzZWREZWNpbWFsVHlwZQorICAgICAgICApKTsKKyAgICAgICAgQnl0ZUJ1ZmZlcltdIGNsdXN0ZXJpbmdLZXlWYWx1ZXMgPSBuZXcgQnl0ZUJ1ZmZlcltdIHsKKyAgICAgICAgICAgICAgICBVVEY4LmRlY29tcG9zZShzdHJpbmdWYWx1ZSksCisgICAgICAgICAgICAgICAgREVDSU1BTC5kZWNvbXBvc2UoZGVjaW1hbFZhbHVlKSwKKyAgICAgICAgICAgICAgICBVVEY4LmRlY29tcG9zZShzdHJpbmdWYWx1ZSksCisgICAgICAgICAgICAgICAgREVDSU1BTC5kZWNvbXBvc2UoZGVjaW1hbFZhbHVlKQorICAgICAgICB9OworCisgICAgICAgIGZpbmFsIENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IyID0gbmV3IENsdXN0ZXJpbmdDb21wYXJhdG9yKEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgLy8ga25vd24gbGVuZ3RoIHR5cGUKKyAgICAgICAgICAgICAgICBERUNJTUFMLAorICAgICAgICAgICAgICAgIC8vIHVua25vd24gbGVuZ3RoIHR5cGUKKyAgICAgICAgICAgICAgICBVVEY4LAorICAgICAgICAgICAgICAgIC8vIHJldmVyc2VkIGtub3duIGxlbmd0aCB0eXBlCisgICAgICAgICAgICAgICAgcmV2ZXJzZWREZWNpbWFsVHlwZSwKKyAgICAgICAgICAgICAgICAvLyByZXZlcnNlZCB1bmtub3duIGxlbmd0aCB0eXBlCisgICAgICAgICAgICAgICAgcmV2ZXJzZWRTdHJpbmdUeXBlCisgICAgICAgICkpOworICAgICAgICBCeXRlQnVmZmVyW10gY2x1c3RlcmluZ0tleVZhbHVlczIgPSBuZXcgQnl0ZUJ1ZmZlcltdIHsKKyAgICAgICAgICAgICAgICBERUNJTUFMLmRlY29tcG9zZShkZWNpbWFsVmFsdWUpLAorICAgICAgICAgICAgICAgIFVURjguZGVjb21wb3NlKHN0cmluZ1ZhbHVlKSwKKyAgICAgICAgICAgICAgICBERUNJTUFMLmRlY29tcG9zZShkZWNpbWFsVmFsdWUpLAorICAgICAgICAgICAgICAgIFVURjguZGVjb21wb3NlKHN0cmluZ1ZhbHVlKQorICAgICAgICB9OworCisgICAgICAgIGZvciAoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kIHByZWZpeEtpbmQgOiBDbHVzdGVyaW5nUHJlZml4LktpbmQudmFsdWVzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwcmVmaXhLaW5kLmlzQm91bmRhcnkoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgQ2x1c3RlcmluZ1ByZWZpeCBwcmVmaXggPSBCdWZmZXJDbHVzdGVyaW5nQm91bmQuY3JlYXRlKHByZWZpeEtpbmQsIGNsdXN0ZXJpbmdLZXlWYWx1ZXMpOworICAgICAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKGNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShwcmVmaXgpLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGdldENvbXBvbmVudFZhbHVlKFVURjgsIGNvbXBhcmFibGVCeXRlcyksIHN0cmluZ1ZhbHVlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLk5FWFRfQ09NUE9ORU5ULCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZShERUNJTUFMLCBjb21wYXJhYmxlQnl0ZXMpLCBkZWNpbWFsVmFsdWUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGdldENvbXBvbmVudFZhbHVlKHJldmVyc2VkU3RyaW5nVHlwZSwgY29tcGFyYWJsZUJ5dGVzKSwgc3RyaW5nVmFsdWUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGdldENvbXBvbmVudFZhbHVlKHJldmVyc2VkRGVjaW1hbFR5cGUsIGNvbXBhcmFibGVCeXRlcyksIGRlY2ltYWxWYWx1ZSk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcmVmaXhLaW5kLmFzQnl0ZUNvbXBhcmFibGVWYWx1ZSh2ZXJzaW9uKSwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNLCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKworICAgICAgICAgICAgQ2x1c3RlcmluZ1ByZWZpeCBwcmVmaXgyID0gQnVmZmVyQ2x1c3RlcmluZ0JvdW5kLmNyZWF0ZShwcmVmaXhLaW5kLCBjbHVzdGVyaW5nS2V5VmFsdWVzMik7CisgICAgICAgICAgICBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlczIgPSBCeXRlU291cmNlLnBlZWthYmxlKGNvbXBhcmF0b3IyLmFzQnl0ZUNvbXBhcmFibGUocHJlZml4MikuYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbikpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVCwgY29tcGFyYWJsZUJ5dGVzMi5uZXh0KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGdldENvbXBvbmVudFZhbHVlKERFQ0lNQUwsIGNvbXBhcmFibGVCeXRlczIpLCBkZWNpbWFsVmFsdWUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlczIubmV4dCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZShVVEY4LCBjb21wYXJhYmxlQnl0ZXMyKSwgc3RyaW5nVmFsdWUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlczIubmV4dCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZShyZXZlcnNlZERlY2ltYWxUeXBlLCBjb21wYXJhYmxlQnl0ZXMyKSwgZGVjaW1hbFZhbHVlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLk5FWFRfQ09NUE9ORU5ULCBjb21wYXJhYmxlQnl0ZXMyLm5leHQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0Q29tcG9uZW50VmFsdWUocmV2ZXJzZWRTdHJpbmdUeXBlLCBjb21wYXJhYmxlQnl0ZXMyKSwgc3RyaW5nVmFsdWUpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJlZml4S2luZC5hc0J5dGVDb21wYXJhYmxlVmFsdWUodmVyc2lvbiksIGNvbXBhcmFibGVCeXRlczIubmV4dCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLkVORF9PRl9TVFJFQU0sIGNvbXBhcmFibGVCeXRlczIubmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgPFQgZXh0ZW5kcyBBYnN0cmFjdFR5cGU8RT4sIEU+IEUgZ2V0Q29tcG9uZW50VmFsdWUoVCB0eXBlLCBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcykKKyAgICB7CisgICAgICAgIHJldHVybiB0eXBlLmNvbXBvc2UodHlwZS5mcm9tQ29tcGFyYWJsZUJ5dGVzKGNvbXBhcmFibGVCeXRlcywgdmVyc2lvbikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRpbmdOZXN0ZWRTZXF1ZW5jZV9TaW1wbGUoKQorICAgIHsKKyAgICAgICAgU3RyaW5nIHBhZGRpbmcxID0gIkEgc3RyaW5nIjsKKyAgICAgICAgU3RyaW5nIHBhZGRpbmcyID0gIkFub3RoZXIgc3RyaW5nIjsKKworICAgICAgICBCaWdJbnRlZ2VyIHZhcmludDEgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMGIxMDAwMDAwMCk7CisgICAgICAgIEJpZ0ludGVnZXIgdmFyaW50MiA9IEJpZ0ludGVnZXIudmFsdWVPZigxID4+IDMwKTsKKyAgICAgICAgQmlnSW50ZWdlciB2YXJpbnQzID0gQmlnSW50ZWdlci52YWx1ZU9mKDB4MTAwMDAwMDBMKTsKKyAgICAgICAgQmlnSW50ZWdlciB2YXJpbnQ0ID0gQmlnSW50ZWdlci52YWx1ZU9mKExvbmcuTUFYX1ZBTFVFKTsKKworICAgICAgICBTdHJpbmcgc3RyaW5nMSA9ICJUZXN0aW5nIGJ5dGUgc291cmNlcyI7CisgICAgICAgIFN0cmluZyBzdHJpbmcyID0gImlzIG5laXRoZXIgZWFzeSBub3IgZnVuOyI7CisgICAgICAgIFN0cmluZyBzdHJpbmczID0gIkJ1dCBkbyBpdCB3ZSBtdXN0LiI7CisgICAgICAgIFN0cmluZyBzdHJpbmc0ID0gIuKAlCBEYXRhU3RheCwgMjAxOCI7CisKKyAgICAgICAgTWFwVHlwZTxCaWdJbnRlZ2VyLCBTdHJpbmc+IHZhcmludFN0cmluZ01hcFR5cGUgPSBNYXBUeXBlLmdldEluc3RhbmNlKFZBUklOVCwgVVRGOCwgZmFsc2UpOworICAgICAgICBNYXA8QmlnSW50ZWdlciwgU3RyaW5nPiB2YXJpbnRTdHJpbmdNYXAgPSBuZXcgVHJlZU1hcDw+KCk7CisgICAgICAgIHZhcmludFN0cmluZ01hcC5wdXQodmFyaW50MSwgc3RyaW5nMSk7CisgICAgICAgIHZhcmludFN0cmluZ01hcC5wdXQodmFyaW50Miwgc3RyaW5nMik7CisgICAgICAgIHZhcmludFN0cmluZ01hcC5wdXQodmFyaW50Mywgc3RyaW5nMyk7CisgICAgICAgIHZhcmludFN0cmluZ01hcC5wdXQodmFyaW50NCwgc3RyaW5nNCk7CisKKyAgICAgICAgQnl0ZVNvdXJjZSBzZXF1ZW5jZSA9IEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IoCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5URVJNSU5BVE9SLAorICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2Uub2YocGFkZGluZzEsIHZlcnNpb24pLAorICAgICAgICAgICAgICAgIHZhcmludFN0cmluZ01hcFR5cGUuYXNDb21wYXJhYmxlQnl0ZXModmFyaW50U3RyaW5nTWFwVHlwZS5kZWNvbXBvc2UodmFyaW50U3RyaW5nTWFwKSwgdmVyc2lvbiksCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5vZihwYWRkaW5nMiwgdmVyc2lvbikKKyAgICAgICAgKTsKKyAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKHNlcXVlbmNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0Q29tcG9uZW50VmFsdWUoVVRGOCwgY29tcGFyYWJsZUJ5dGVzKSwgcGFkZGluZzEpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVCwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZSh2YXJpbnRTdHJpbmdNYXBUeXBlLCBjb21wYXJhYmxlQnl0ZXMpLCB2YXJpbnRTdHJpbmdNYXApOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVCwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZShVVEY4LCBjb21wYXJhYmxlQnl0ZXMpLCBwYWRkaW5nMik7CisgICAgICAgIHNlcXVlbmNlID0gQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvcigKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLlRFUk1JTkFUT1IsCisgICAgICAgICAgICAgICAgdmFyaW50U3RyaW5nTWFwVHlwZS5hc0NvbXBhcmFibGVCeXRlcyh2YXJpbnRTdHJpbmdNYXBUeXBlLmRlY29tcG9zZSh2YXJpbnRTdHJpbmdNYXApLCB2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLm9mKHBhZGRpbmcxLCB2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLm9mKHBhZGRpbmcyLCB2ZXJzaW9uKQorICAgICAgICApOworICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKHNlcXVlbmNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0Q29tcG9uZW50VmFsdWUodmFyaW50U3RyaW5nTWFwVHlwZSwgY29tcGFyYWJsZUJ5dGVzKSwgdmFyaW50U3RyaW5nTWFwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0Q29tcG9uZW50VmFsdWUoVVRGOCwgY29tcGFyYWJsZUJ5dGVzKSwgcGFkZGluZzEpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVCwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZShVVEY4LCBjb21wYXJhYmxlQnl0ZXMpLCBwYWRkaW5nMik7CisgICAgICAgIHNlcXVlbmNlID0gQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvcigKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLlRFUk1JTkFUT1IsCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5vZihwYWRkaW5nMSwgdmVyc2lvbiksCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5vZihwYWRkaW5nMiwgdmVyc2lvbiksCisgICAgICAgICAgICAgICAgdmFyaW50U3RyaW5nTWFwVHlwZS5hc0NvbXBhcmFibGVCeXRlcyh2YXJpbnRTdHJpbmdNYXBUeXBlLmRlY29tcG9zZSh2YXJpbnRTdHJpbmdNYXApLCB2ZXJzaW9uKQorICAgICAgICApOworICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKHNlcXVlbmNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0Q29tcG9uZW50VmFsdWUoVVRGOCwgY29tcGFyYWJsZUJ5dGVzKSwgcGFkZGluZzEpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVCwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZShVVEY4LCBjb21wYXJhYmxlQnl0ZXMpLCBwYWRkaW5nMik7CisgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLk5FWFRfQ09NUE9ORU5ULCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdldENvbXBvbmVudFZhbHVlKHZhcmludFN0cmluZ01hcFR5cGUsIGNvbXBhcmFibGVCeXRlcyksIHZhcmludFN0cmluZ01hcCk7CisKKyAgICAgICAgTWFwVHlwZTxTdHJpbmcsIEJpZ0ludGVnZXI+IHN0cmluZ1ZhcmludE1hcFR5cGUgPSBNYXBUeXBlLmdldEluc3RhbmNlKFVURjgsIFZBUklOVCwgZmFsc2UpOworICAgICAgICBNYXA8U3RyaW5nLCBCaWdJbnRlZ2VyPiBzdHJpbmdWYXJpbnRNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIHN0cmluZ1ZhcmludE1hcC5wdXQoc3RyaW5nMSwgdmFyaW50MSk7CisgICAgICAgIHN0cmluZ1ZhcmludE1hcC5wdXQoc3RyaW5nMiwgdmFyaW50Mik7CisgICAgICAgIHN0cmluZ1ZhcmludE1hcC5wdXQoc3RyaW5nMywgdmFyaW50Myk7CisgICAgICAgIHN0cmluZ1ZhcmludE1hcC5wdXQoc3RyaW5nNCwgdmFyaW50NCk7CisKKyAgICAgICAgc2VxdWVuY2UgPSBCeXRlU291cmNlLndpdGhUZXJtaW5hdG9yKAorICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2UuVEVSTUlOQVRPUiwKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLm9mKHBhZGRpbmcxLCB2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICBzdHJpbmdWYXJpbnRNYXBUeXBlLmFzQ29tcGFyYWJsZUJ5dGVzKHN0cmluZ1ZhcmludE1hcFR5cGUuZGVjb21wb3NlKHN0cmluZ1ZhcmludE1hcCksIHZlcnNpb24pLAorICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2Uub2YocGFkZGluZzIsIHZlcnNpb24pCisgICAgICAgICk7CisgICAgICAgIGNvbXBhcmFibGVCeXRlcyA9IEJ5dGVTb3VyY2UucGVla2FibGUoc2VxdWVuY2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVCwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZShVVEY4LCBjb21wYXJhYmxlQnl0ZXMpLCBwYWRkaW5nMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLk5FWFRfQ09NUE9ORU5ULCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdldENvbXBvbmVudFZhbHVlKHN0cmluZ1ZhcmludE1hcFR5cGUsIGNvbXBhcmFibGVCeXRlcyksIHN0cmluZ1ZhcmludE1hcCk7CisgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLk5FWFRfQ09NUE9ORU5ULCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdldENvbXBvbmVudFZhbHVlKFVURjgsIGNvbXBhcmFibGVCeXRlcyksIHBhZGRpbmcyKTsKKworICAgICAgICBNYXBUeXBlPFN0cmluZywgU3RyaW5nPiBzdHJpbmdTdHJpbmdNYXBUeXBlID0gTWFwVHlwZS5nZXRJbnN0YW5jZShVVEY4LCBVVEY4LCBmYWxzZSk7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gc3RyaW5nU3RyaW5nTWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBzdHJpbmdTdHJpbmdNYXAucHV0KHN0cmluZzEsIHN0cmluZzQpOworICAgICAgICBzdHJpbmdTdHJpbmdNYXAucHV0KHN0cmluZzIsIHN0cmluZzMpOworICAgICAgICBzdHJpbmdTdHJpbmdNYXAucHV0KHN0cmluZzMsIHN0cmluZzIpOworICAgICAgICBzdHJpbmdTdHJpbmdNYXAucHV0KHN0cmluZzQsIHN0cmluZzEpOworCisgICAgICAgIHNlcXVlbmNlID0gQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvcigKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLlRFUk1JTkFUT1IsCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5vZihwYWRkaW5nMSwgdmVyc2lvbiksCisgICAgICAgICAgICAgICAgc3RyaW5nU3RyaW5nTWFwVHlwZS5hc0NvbXBhcmFibGVCeXRlcyhzdHJpbmdTdHJpbmdNYXBUeXBlLmRlY29tcG9zZShzdHJpbmdTdHJpbmdNYXApLCB2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLm9mKHBhZGRpbmcyLCB2ZXJzaW9uKQorICAgICAgICApOworICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKHNlcXVlbmNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0Q29tcG9uZW50VmFsdWUoVVRGOCwgY29tcGFyYWJsZUJ5dGVzKSwgcGFkZGluZzEpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVCwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZShzdHJpbmdTdHJpbmdNYXBUeXBlLCBjb21wYXJhYmxlQnl0ZXMpLCBzdHJpbmdTdHJpbmdNYXApOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVCwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZShVVEY4LCBjb21wYXJhYmxlQnl0ZXMpLCBwYWRkaW5nMik7CisKKyAgICAgICAgTWFwVHlwZTxCaWdJbnRlZ2VyLCBCaWdJbnRlZ2VyPiB2YXJpbnRWYXJpbnRNYXBUeXBlID0gTWFwVHlwZS5nZXRJbnN0YW5jZShWQVJJTlQsIFZBUklOVCwgZmFsc2UpOworICAgICAgICBNYXA8QmlnSW50ZWdlciwgQmlnSW50ZWdlcj4gdmFyaW50VmFyaW50TWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICB2YXJpbnRWYXJpbnRNYXAucHV0KHZhcmludDEsIHZhcmludDQpOworICAgICAgICB2YXJpbnRWYXJpbnRNYXAucHV0KHZhcmludDIsIHZhcmludDMpOworICAgICAgICB2YXJpbnRWYXJpbnRNYXAucHV0KHZhcmludDMsIHZhcmludDIpOworICAgICAgICB2YXJpbnRWYXJpbnRNYXAucHV0KHZhcmludDQsIHZhcmludDEpOworCisgICAgICAgIHNlcXVlbmNlID0gQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvcigKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLlRFUk1JTkFUT1IsCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5vZihwYWRkaW5nMSwgdmVyc2lvbiksCisgICAgICAgICAgICAgICAgdmFyaW50VmFyaW50TWFwVHlwZS5hc0NvbXBhcmFibGVCeXRlcyh2YXJpbnRWYXJpbnRNYXBUeXBlLmRlY29tcG9zZSh2YXJpbnRWYXJpbnRNYXApLCB2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLm9mKHBhZGRpbmcyLCB2ZXJzaW9uKQorICAgICAgICApOworICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKHNlcXVlbmNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0Q29tcG9uZW50VmFsdWUoVVRGOCwgY29tcGFyYWJsZUJ5dGVzKSwgcGFkZGluZzEpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVCwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZSh2YXJpbnRWYXJpbnRNYXBUeXBlLCBjb21wYXJhYmxlQnl0ZXMpLCB2YXJpbnRWYXJpbnRNYXApOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVCwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZShVVEY4LCBjb21wYXJhYmxlQnl0ZXMpLCBwYWRkaW5nMik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZGluZ05lc3RlZFNlcXVlbmNlX0RlY29yYXRlZEtleSgpCisgICAgeworICAgICAgICBSYW5kb20gcHJuZyA9IG5ldyBSYW5kb20oKTsKKworICAgICAgICBNYXBUeXBlPFN0cmluZywgQmlnRGVjaW1hbD4gc3RyaW5nRGVjaW1hbE1hcFR5cGUgPSBNYXBUeXBlLmdldEluc3RhbmNlKFVURjgsIERFQ0lNQUwsIGZhbHNlKTsKKyAgICAgICAgTWFwPFN0cmluZywgQmlnRGVjaW1hbD4gc3RyaW5nRGVjaW1hbE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpCisgICAgICAgICAgICBzdHJpbmdEZWNpbWFsTWFwLnB1dChuZXdSYW5kb21BbHBoYW51bWVyaWMocHJuZywgMTApLCBCaWdEZWNpbWFsLnZhbHVlT2YocHJuZy5uZXh0RG91YmxlKCkpKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBrZXkgPSBzdHJpbmdEZWNpbWFsTWFwVHlwZS5kZWNvbXBvc2Uoc3RyaW5nRGVjaW1hbE1hcCk7CisgICAgICAgIHRlc3REZWNvZGluZ0tleVdpdGhMb2NhbFBhcnRpdGlvbmVyRm9yVHlwZShrZXksIHN0cmluZ0RlY2ltYWxNYXBUeXBlKTsKKworICAgICAgICBNYXBUeXBlPEJpZ0RlY2ltYWwsIFN0cmluZz4gZGVjaW1hbFN0cmluZ01hcFR5cGUgPSBNYXBUeXBlLmdldEluc3RhbmNlKERFQ0lNQUwsIFVURjgsIGZhbHNlKTsKKyAgICAgICAgTWFwPEJpZ0RlY2ltYWwsIFN0cmluZz4gZGVjaW1hbFN0cmluZ01hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpCisgICAgICAgICAgICBkZWNpbWFsU3RyaW5nTWFwLnB1dChCaWdEZWNpbWFsLnZhbHVlT2YocHJuZy5uZXh0RG91YmxlKCkpLCBuZXdSYW5kb21BbHBoYW51bWVyaWMocHJuZywgMTApKTsKKyAgICAgICAga2V5ID0gZGVjaW1hbFN0cmluZ01hcFR5cGUuZGVjb21wb3NlKGRlY2ltYWxTdHJpbmdNYXApOworICAgICAgICB0ZXN0RGVjb2RpbmdLZXlXaXRoTG9jYWxQYXJ0aXRpb25lckZvclR5cGUoa2V5LCBkZWNpbWFsU3RyaW5nTWFwVHlwZSk7CisKKyAgICAgICAgaWYgKHZlcnNpb24gIT0gQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5MRUdBQ1kpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbXBvc2l0ZVR5cGUgc3RyaW5nRGVjaW1hbENvbXBUeXBlID0gQ29tcG9zaXRlVHlwZS5nZXRJbnN0YW5jZShVVEY4LCBERUNJTUFMKTsKKyAgICAgICAgICAgIGtleSA9IHN0cmluZ0RlY2ltYWxDb21wVHlwZS5kZWNvbXBvc2UobmV3UmFuZG9tQWxwaGFudW1lcmljKHBybmcsIDEwKSwgQmlnRGVjaW1hbC52YWx1ZU9mKHBybmcubmV4dERvdWJsZSgpKSk7CisgICAgICAgICAgICB0ZXN0RGVjb2RpbmdLZXlXaXRoTG9jYWxQYXJ0aXRpb25lckZvclR5cGUoa2V5LCBzdHJpbmdEZWNpbWFsQ29tcFR5cGUpOworCisgICAgICAgICAgICBDb21wb3NpdGVUeXBlIGRlY2ltYWxTdHJpbmdDb21wVHlwZSA9IENvbXBvc2l0ZVR5cGUuZ2V0SW5zdGFuY2UoREVDSU1BTCwgVVRGOCk7CisgICAgICAgICAgICBrZXkgPSBkZWNpbWFsU3RyaW5nQ29tcFR5cGUuZGVjb21wb3NlKEJpZ0RlY2ltYWwudmFsdWVPZihwcm5nLm5leHREb3VibGUoKSksIG5ld1JhbmRvbUFscGhhbnVtZXJpYyhwcm5nLCAxMCkpOworICAgICAgICAgICAgdGVzdERlY29kaW5nS2V5V2l0aExvY2FsUGFydGl0aW9uZXJGb3JUeXBlKGtleSwgZGVjaW1hbFN0cmluZ0NvbXBUeXBlKTsKKworICAgICAgICAgICAgRHluYW1pY0NvbXBvc2l0ZVR5cGUgZHluYW1pY0NvbXBUeXBlID0gRHluYW1pY0NvbXBvc2l0ZVR5cGUuZ2V0SW5zdGFuY2UoRHluYW1pY0NvbXBvc2l0ZVR5cGVUZXN0LmFsaWFzZXMpOworICAgICAgICAgICAga2V5ID0gRHluYW1pY0NvbXBvc2l0ZVR5cGVUZXN0LmNyZWF0ZUR5bmFtaWNDb21wb3NpdGVLZXkoCisgICAgICAgICAgICAgICAgICAgIG5ld1JhbmRvbUFscGhhbnVtZXJpYyhwcm5nLCAxMCksIFRpbWVVVUlELkdlbmVyYXRvci5uZXh0VGltZUFzVVVJRCgpLCA0MiwgdHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgdGVzdERlY29kaW5nS2V5V2l0aExvY2FsUGFydGl0aW9uZXJGb3JUeXBlKGtleSwgZHluYW1pY0NvbXBUeXBlKTsKKworICAgICAgICAgICAga2V5ID0gRHluYW1pY0NvbXBvc2l0ZVR5cGVUZXN0LmNyZWF0ZUR5bmFtaWNDb21wb3NpdGVLZXkoCisgICAgICAgICAgICBuZXdSYW5kb21BbHBoYW51bWVyaWMocHJuZywgMTApLCBUaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVBc1VVSUQoKSwgNDIsIHRydWUsIHRydWUpOworICAgICAgICAgICAgdGVzdERlY29kaW5nS2V5V2l0aExvY2FsUGFydGl0aW9uZXJGb3JUeXBlKGtleSwgZHluYW1pY0NvbXBUeXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBuZXdSYW5kb21BbHBoYW51bWVyaWMoUmFuZG9tIHBybmcsIGludCBsZW5ndGgpCisgICAgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHJhbmRvbSA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpCisgICAgICAgICAgICByYW5kb20uYXBwZW5kKEFMUEhBQkVULmNoYXJBdChwcm5nLm5leHRJbnQoQUxQSEFCRVQubGVuZ3RoKCkpKSk7CisgICAgICAgIHJldHVybiByYW5kb20udG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUPiB2b2lkIHRlc3REZWNvZGluZ0tleVdpdGhMb2NhbFBhcnRpdGlvbmVyRm9yVHlwZShCeXRlQnVmZmVyIGtleSwgQWJzdHJhY3RUeXBlPFQ+IHR5cGUpCisgICAgeworICAgICAgICBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSBuZXcgTG9jYWxQYXJ0aXRpb25lcih0eXBlKTsKKyAgICAgICAgQ2FjaGVkSGFzaERlY29yYXRlZEtleSBpbml0aWFsID0gKENhY2hlZEhhc2hEZWNvcmF0ZWRLZXkpIHBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KGtleSk7CisgICAgICAgIEJ1ZmZlckRlY29yYXRlZEtleSBiYXNlID0gQnVmZmVyRGVjb3JhdGVkS2V5LmZyb21CeXRlQ29tcGFyYWJsZShpbml0aWFsLCB2ZXJzaW9uLCBwYXJ0aXRpb25lcik7CisgICAgICAgIENhY2hlZEhhc2hEZWNvcmF0ZWRLZXkgZGVjb2RlZCA9IG5ldyBDYWNoZWRIYXNoRGVjb3JhdGVkS2V5KGJhc2UuZ2V0VG9rZW4oKSwgYmFzZS5nZXRLZXkoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoaW5pdGlhbCwgZGVjb2RlZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J5dGVjb21wYXJhYmxlL0J5dGVTb3VyY2VUZXN0QmFzZS5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J5dGVjb21wYXJhYmxlL0J5dGVTb3VyY2VUZXN0QmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MGJlYzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvQnl0ZVNvdXJjZVRlc3RCYXNlLmphdmEKQEAgLTAsMCArMSw1MTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGU7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRpbWUuSW5zdGFudDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJvb2xlYW5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuRGVjaW1hbFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Eb3VibGVUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50ZWdlclR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKKworcHVibGljIGNsYXNzIEJ5dGVTb3VyY2VUZXN0QmFzZQoreworICAgIFN0cmluZ1tdIHRlc3RTdHJpbmdzID0gbmV3IFN0cmluZ1tdeyAiIiwgIlwwIiwgIlwwXDAiLCAiXDAwMSIsICJBXDBcMEIiLCAiQVwwQlwwIiwgIjAiLCAiMFwwIiwgIjAwIiwgIjEiLCAiXDM3NyIgfTsKKyAgICBJbnRlZ2VyW10gdGVzdEludHMgPSBuZXcgSW50ZWdlcltdeyBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIuTUlOX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIuTUlOX1ZBTFVFICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjU2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEyOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTI3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLk1BWF9WQUxVRSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5NQVhfVkFMVUUgfTsKKyAgICBCeXRlW10gdGVzdEJ5dGVzID0gbmV3IEJ5dGVbXXsgLTEyOCwgLTEyNywgLTEsIDAsIDEsIDEyNyB9OworICAgIFNob3J0W10gdGVzdFNob3J0cyA9IG5ldyBTaG9ydFtdeyBTaG9ydC5NSU5fVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3J0Lk1JTl9WQUxVRSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMjcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3J0Lk1BWF9WQUxVRSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3J0Lk1BWF9WQUxVRSB9OworICAgIExvbmdbXSB0ZXN0TG9uZ3MgPSBuZXcgTG9uZ1tdeyBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nLk1JTl9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy5NSU5fVkFMVUUgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLk1JTl9WQUxVRSAtIDFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjU2TCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTI1NUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMjhMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTI3TCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTY1TCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTY0TCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYzTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIuTUFYX1ZBTFVFICsgMUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmcuTUFYX1ZBTFVFIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy5NQVhfVkFMVUUsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDEpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMikgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAzKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDQpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNSkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA2KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDcpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgOCkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA5KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDEwKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxMSkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTIpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDEyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDEzKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNCkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTUpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE2KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNykgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTgpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE5KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxOSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMCkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjEpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDIxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDIyKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMykgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjQpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI1KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyNikgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjcpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI4KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyOSkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMzApIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDMwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDMxKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAzMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAzMikgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMzMpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDMzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDM0KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAzNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAzNSkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMzUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMzYpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDM2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDM3KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAzNyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAzOCkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMzgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMzkpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDM5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDQwKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA0MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA0MSkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNDIpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDQyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDQzKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA0MyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA0NCkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNDUpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDQ1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDQ2KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA0NiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA0NykgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNDcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNDgpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDQ4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDQ5KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA0OSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA1MCkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNTApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNTEpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDUxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDUyKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA1MiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA1MykgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNTMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNTQpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDU0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDU1KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA1NSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA1NikgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNTcpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDU3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDU4KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA1OCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA1OSkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNTkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNjApIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDYwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDYxKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA2MSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA2MikgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNjIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNjMpIC0gMSwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAxKSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDIpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMykgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA0KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDUpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNikgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA3KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA3KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDgpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgOSkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgOSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAxMCkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMTApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMTEpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDExKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDEyKSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAxMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAxMykgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMTMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMTQpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDE0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDE1KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAxNSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAxNikgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMTYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMTcpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDE3KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDE4KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAxOCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAxOSkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMTkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMjApIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDIwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDIxKSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAyMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAyMikgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMjIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMjMpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDIzKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDI0KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAyNCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAyNSkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMjUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMjYpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDI2KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDI3KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAyNykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAyOCkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMjgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMjkpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDI5KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDMwKSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAzMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAzMSkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMzEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMzIpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDMyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDMzKSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAzMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAzNCkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMzQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMzUpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDM1KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDM2KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAzNikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAzNykgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMzcpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMzgpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDM4KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDM5KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAzOSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA0MCkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNDEpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDQxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDQyKSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA0MikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA0MykgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNDMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNDQpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDQ0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDQ1KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA0NSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA0NikgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNDYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNDcpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDQ3KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDQ4KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA0OCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA0OSkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNDkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNTApIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDUwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDUxKSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA1MSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA1MikgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNTIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNTMpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDUzKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDU0KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA1NCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA1NSkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNTUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNTYpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDU2KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDU3KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA1NykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA1OCkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNTgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNTkpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDU5KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDYwKSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA2MCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA2MSkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNjEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNjIpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDYyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDYzKSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgIERvdWJsZVtdIHRlc3REb3VibGVzID0gbmV3IERvdWJsZVtdeyBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1Eb3VibGUuTUFYX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMWUrMjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMWUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMWUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMWUtMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTFlLTIwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLURvdWJsZS5NSU5fVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG91YmxlLk1JTl9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMWUtMjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxZS0zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxZTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFlMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMWUrMjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3VibGUuTUFYX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvdWJsZS5OYU4gfTsKKyAgICBGbG9hdFtdIHRlc3RGbG9hdHMgPSBuZXcgRmxvYXRbXXsgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1GbG9hdC5NQVhfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xZSszMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xZTNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMWUwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTFlLTNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMWUtMzBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtRmxvYXQuTUlOX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvYXQuTUlOX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxZS0zMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFlLTNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxZTBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxZTNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxZSszMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb2F0Lk1BWF9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb2F0Lk5hTiB9OworICAgIEJvb2xlYW5bXSB0ZXN0Qm9vbHMgPSBuZXcgQm9vbGVhbltdeyBudWxsLCBmYWxzZSwgdHJ1ZSB9OworICAgIFVVSURbXSB0ZXN0VVVJRHMgPSBuZXcgVVVJRFtdeyBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVBc1VVSUQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVVJRC5yYW5kb21VVUlEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVVSUQucmFuZG9tVVVJRCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVUlELnJhbmRvbVVVSUQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVVSUQuR2VuZXJhdG9yLmF0VW5peE1pbGxpcygxMjMsIDIzNCkuYXNVVUlEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVVUlELkdlbmVyYXRvci5hdFVuaXhNaWxsaXMoMTIzLCAyMzQpLmFzVVVJRCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVVVJRC5HZW5lcmF0b3IuYXRVbml4TWlsbGlzKDEyMykuYXNVVUlEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVVSUQuZnJvbVN0cmluZygiNmJhN2I4MTEtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVVSUQuZnJvbVN0cmluZygiNmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVVSUQuZnJvbVN0cmluZygiZTkwMjg5M2EtOWQyMi0zYzdlLWE3YjgtZDZlMzEzYjcxZDlmIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVVSUQuZnJvbVN0cmluZygiNzQ3MzhmZjUtNTM2Ny01OTU4LTlhZWUtOThmZmZkY2QxODc2IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVVSUQuZnJvbVN0cmluZygiNTJkZjFiYjAtNmEyZi0xMWU2LWI2ZTQtYTZkZWE3YTAxYjY3IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVVSUQuZnJvbVN0cmluZygiNTJkZjFiYjAtNmEyZi0xMWU2LTM2MmQtYWZmMjE0MzQ5OGVhIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVVSUQuZnJvbVN0cmluZygiNTJkZjFiYjAtNmEyZi0xMWU2LWI2MmQtYWZmMjE0MzQ5OGVhIikgfTsKKyAgICAvLyBJbnN0YW50Lk1JTi9NQVggZmFpbCBEYXRlLmZyb20uCisgICAgRGF0ZVtdIHRlc3REYXRlcyA9IG5ldyBEYXRlW117IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGUuZnJvbShJbnN0YW50Lm9mRXBvY2hTZWNvbmQoSW50ZWdlci5NSU5fVkFMVUUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZS5mcm9tKEluc3RhbnQub2ZFcG9jaFNlY29uZChTaG9ydC5NSU5fVkFMVUUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZS5mcm9tKEluc3RhbnQub2ZFcG9jaE1pbGxpKC0yMDAwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGUuZnJvbShJbnN0YW50LkVQT0NIKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZS5mcm9tKEluc3RhbnQub2ZFcG9jaE1pbGxpKDIwMDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZS5mcm9tKEluc3RhbnQub2ZFcG9jaFNlY29uZChJbnRlZ2VyLk1BWF9WQUxVRSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlLmZyb20oSW5zdGFudC5ub3coKSkgfTsKKyAgICBJbmV0QWRkcmVzc1tdIHRlc3RJbmV0czsKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB0ZXN0SW5ldHMgPSBuZXcgSW5ldEFkZHJlc3NbXXsgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRMb29wYmFja0FkZHJlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoIjE5Mi4xNjguMC4xIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCJmZTgwOjo0MjhkOjVjZmY6ZmU1MzoxZGM5IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCIyMDAxOjYxMDozOjIwMGE6MTkyOjg3OjM2OjIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoIjEwLjAuMC4xIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCIwYTAwOjAwMDE6OiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzLmdldEJ5TmFtZSgiOjoxMC4wLjAuMSIpIH07CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQmlnSW50ZWdlcltdIHRlc3RCaWdJbnRzOworCisgICAgeworICAgICAgICBTZXQ8QmlnSW50ZWdlcj4gYmlncyA9IG5ldyBUcmVlU2V0PD4oKTsKKyAgICAgICAgZm9yIChMb25nIGwgOiB0ZXN0TG9uZ3MpCisgICAgICAgICAgICBpZiAobCAhPSBudWxsKQorICAgICAgICAgICAgICAgIGJpZ3MuYWRkKEJpZ0ludGVnZXIudmFsdWVPZihsKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTE7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgYmlncy5hZGQoQmlnSW50ZWdlci52YWx1ZU9mKGkpKTsKKyAgICAgICAgICAgIGJpZ3MuYWRkKEJpZ0ludGVnZXIudmFsdWVPZigtaSkpOworCisgICAgICAgICAgICBiaWdzLmFkZChCaWdJbnRlZ2VyLnZhbHVlT2YoKDFMIDw8IDQgKiBpKSAtIDEpKTsKKyAgICAgICAgICAgIGJpZ3MuYWRkKEJpZ0ludGVnZXIudmFsdWVPZigoMUwgPDwgNCAqIGkpKSk7CisgICAgICAgICAgICBiaWdzLmFkZChCaWdJbnRlZ2VyLnZhbHVlT2YoLSgxTCA8PCA0ICogaSkgLSAxKSk7CisgICAgICAgICAgICBiaWdzLmFkZChCaWdJbnRlZ2VyLnZhbHVlT2YoLSgxTCA8PCA0ICogaSkpKTsKKyAgICAgICAgICAgIFN0cmluZyBwID0gZXhwMTAoaSk7CisgICAgICAgICAgICBiaWdzLmFkZChuZXcgQmlnSW50ZWdlcihwKSk7CisgICAgICAgICAgICBiaWdzLmFkZChuZXcgQmlnSW50ZWdlcigiLSIgKyBwKSk7CisgICAgICAgICAgICBwID0gZXhwMTAoMSA8PCBpKTsKKyAgICAgICAgICAgIGJpZ3MuYWRkKG5ldyBCaWdJbnRlZ2VyKHApKTsKKyAgICAgICAgICAgIGJpZ3MuYWRkKG5ldyBCaWdJbnRlZ2VyKCItIiArIHApKTsKKworICAgICAgICAgICAgQmlnSW50ZWdlciBiYXNlID0gQmlnSW50ZWdlci5PTkUuc2hpZnRMZWZ0KDUxMiAqIGkpOworICAgICAgICAgICAgYmlncy5hZGQoYmFzZSk7CisgICAgICAgICAgICBiaWdzLmFkZChiYXNlLmFkZChCaWdJbnRlZ2VyLk9ORSkpOworICAgICAgICAgICAgYmlncy5hZGQoYmFzZS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkpOworICAgICAgICAgICAgYmFzZSA9IGJhc2UubmVnYXRlKCk7CisgICAgICAgICAgICBiaWdzLmFkZChiYXNlKTsKKyAgICAgICAgICAgIGJpZ3MuYWRkKGJhc2UuYWRkKEJpZ0ludGVnZXIuT05FKSk7CisgICAgICAgICAgICBiaWdzLmFkZChiYXNlLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSk7CisgICAgICAgIH0KKyAgICAgICAgdGVzdEJpZ0ludHMgPSBiaWdzLnRvQXJyYXkobmV3IEJpZ0ludGVnZXJbMF0pOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgZXhwMTAoaW50IHBvdykKKyAgICB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcxJyk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxwb3c7ICsraSkKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcwJyk7CisgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQmlnRGVjaW1hbFtdIHRlc3RCaWdEZWNpbWFsczsKKyAgICB7CisgICAgICAgIFN0cmluZyB2YWxzID0gIjAsIDEsIDEuMSwgMjEsIDk4LjksIDk5LCA5OS45LCAxMDAsIDEwMC4xLCAxMDEsIDMzMSwgMC40LCAwLjA3LCAwLjA3MDAsIDAuMDA1LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAiNmU0LCA3ZTIwMCwgNmUtMzAwLCA4LjFlMjAwMCwgOC4xZS0yMDAwLCA5ZTIwMDAwMDAwMDAsICIgKworICAgICAgICAgICAgICAgICAgICAgICIxMjM0NTY3ODkwMTIuMzQ1Njc4OTBlLTEwMDAwMDAwMDAsIDEyMzQ1Ni43ODkwMTIzNCwgMTIzNC41Njc4OTAxMmUyLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAiMS4wMDAwLCAwLjAxZTIsIDEwMGUtMiwgMDAsIDAuMDAwLCAwRS0xOCwgMEUrMTgiOworICAgICAgICBMaXN0PEJpZ0RlY2ltYWw+IGRlY3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChTdHJpbmcgcyA6IHZhbHMuc3BsaXQoIiwgIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlY3MuYWRkKG5ldyBCaWdEZWNpbWFsKHMpKTsKKyAgICAgICAgICAgIGRlY3MuYWRkKG5ldyBCaWdEZWNpbWFsKCItIiArIHMpKTsKKyAgICAgICAgfQorICAgICAgICB0ZXN0QmlnRGVjaW1hbHMgPSBkZWNzLnRvQXJyYXkobmV3IEJpZ0RlY2ltYWxbMF0pOworICAgIH0KKworICAgIE9iamVjdFtdW10gdGVzdFZhbHVlcyA9IG5ldyBPYmplY3RbXVtdeyB0ZXN0U3RyaW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RCb29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdERvdWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RCaWdJbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0QmlnRGVjaW1hbHMgfTsKKworICAgIEFic3RyYWN0VHlwZVtdIHRlc3RUeXBlcyA9IG5ldyBBYnN0cmFjdFR5cGVbXXsgVVRGOFR5cGUuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQzMlR5cGUuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuVHlwZS5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvdWJsZVR5cGUuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyVHlwZS5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWxUeXBlLmluc3RhbmNlIH07Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvRGVjb3JhdGVkS2V5Qnl0ZVNvdXJjZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9ieXRlY29tcGFyYWJsZS9EZWNvcmF0ZWRLZXlCeXRlU291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjM2U3MmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvRGVjb3JhdGVkS2V5Qnl0ZVNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZTsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQnVmZmVyRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQnl0ZU9yZGVyZWRQYXJ0aXRpb25lcjsKKworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBEZWNvcmF0ZWRLZXlCeXRlU291cmNlVGVzdAoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fSVRFUkFUSU9OUyA9IDEwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkFORE9NX0JZVEVTX0xFTkdUSCA9IDEwMDsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ2ZXJzaW9uPXswfSIpCisgICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxCeXRlQ29tcGFyYWJsZS5WZXJzaW9uPiB2ZXJzaW9ucygpCisgICAgeworICAgICAgICByZXR1cm4gSW1tdXRhYmxlTGlzdC5vZihCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbjsKKworICAgIHB1YmxpYyBEZWNvcmF0ZWRLZXlCeXRlU291cmNlVGVzdChCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlY29kZUJ1ZmZlckRlY29yYXRlZEtleSgpCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9JVEVSQVRJT05TOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ1ZmZlckRlY29yYXRlZEtleSBpbml0aWFsQnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgKEJ1ZmZlckRlY29yYXRlZEtleSkgQnl0ZU9yZGVyZWRQYXJ0aXRpb25lci5pbnN0YW5jZS5kZWNvcmF0ZUtleShuZXdSYW5kb21CeXRlc0J1ZmZlcigpKTsKKyAgICAgICAgICAgIEJ1ZmZlckRlY29yYXRlZEtleSBkZWNvZGVkQnVmZmVyID0gQnVmZmVyRGVjb3JhdGVkS2V5LmZyb21CeXRlQ29tcGFyYWJsZSgKKyAgICAgICAgICAgICAgICAgICAgaW5pdGlhbEJ1ZmZlciwgdmVyc2lvbiwgQnl0ZU9yZGVyZWRQYXJ0aXRpb25lci5pbnN0YW5jZSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGluaXRpYWxCdWZmZXIsIGRlY29kZWRCdWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlS2V5Qnl0ZXMoKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fSVRFUkFUSU9OUzsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBCdWZmZXJEZWNvcmF0ZWRLZXkgaW5pdGlhbEJ1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgIChCdWZmZXJEZWNvcmF0ZWRLZXkpIEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuaW5zdGFuY2UuZGVjb3JhdGVLZXkobmV3UmFuZG9tQnl0ZXNCdWZmZXIoKSk7CisgICAgICAgICAgICBCeXRlU291cmNlLlBlZWthYmxlIHNyYyA9IEJ5dGVTb3VyY2UucGVla2FibGUoaW5pdGlhbEJ1ZmZlci5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSk7CisgICAgICAgICAgICBieXRlW10ga2V5Qnl0ZXMgPSBEZWNvcmF0ZWRLZXkua2V5RnJvbUJ5dGVTb3VyY2Uoc3JjLCB2ZXJzaW9uLCBCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLmluc3RhbmNlKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNLCBzcmMubmV4dCgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRBcnJheUVxdWFscyhpbml0aWFsQnVmZmVyLmdldEtleSgpLmFycmF5KCksIGtleUJ5dGVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEJ5dGVCdWZmZXIgbmV3UmFuZG9tQnl0ZXNCdWZmZXIoKQorICAgIHsKKyAgICAgICAgYnl0ZVtdIHJhbmRvbUJ5dGVzID0gbmV3IGJ5dGVbUkFORE9NX0JZVEVTX0xFTkdUSF07CisgICAgICAgIG5ldyBSYW5kb20oKS5uZXh0Qnl0ZXMocmFuZG9tQnl0ZXMpOworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlci53cmFwKHJhbmRvbUJ5dGVzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvY29uY3VycmVudC9SZWZDb3VudGVkVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2NvbmN1cnJlbnQvUmVmQ291bnRlZFRlc3QuamF2YQppbmRleCBlOTlkMzY4Li5kNTBlNDA4IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvY29uY3VycmVudC9SZWZDb3VudGVkVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9jb25jdXJyZW50L1JlZkNvdW50ZWRUZXN0LmphdmEKQEAgLTE4LDI4ICsxOCw0MSBAQAogKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudDsKIAotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS50aW1lLkR1cmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkUXVldWU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKIAoraW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhUmVmOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk9iamVjdFNpemVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWYuVmlzaXRvcjsKK2ltcG9ydCBvcmcuYXdhaXRpbGl0eS5Bd2FpdGlsaXR5OworCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKIAogQFN1cHByZXNzV2FybmluZ3MoeyJ1bnVzZWQiLCAidW5jaGVja2VkIiwgInJhd3R5cGVzIn0pCiBwdWJsaWMgY2xhc3MgUmVmQ291bnRlZFRlc3QKQEAgLTQwNiw0ICs0MTksMTM0IEBACiAKICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodmlzaXRvci5oYXZlTG9vcHMuaXNFbXB0eSgpKTsKICAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTGFtYmRhVGVzdENsYXNzVGlkaWVyIGltcGxlbWVudHMgUmVmQ291bnRlZC5UaWR5CisgICAgeworICAgICAgICBSdW5uYWJsZSBydW5PbkNsb3NlOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB0aWR5KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBydW5PbkNsb3NlLnJ1bigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAiNDIiOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIExhbWJkYVRlc3RDbGFzcworICAgIHsKKyAgICAgICAgU3RyaW5nIGEgPSAieCI7CisgICAgICAgIFJlZjxPYmplY3Q+IHJlZjsKKworICAgICAgICBSdW5uYWJsZSBnZXRSdW5PbkNsb3NlTGFtYmRhKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICgpIC0+IFN5c3RlbS5vdXQucHJpbnRsbigiYWFhIik7CisgICAgICAgIH0KKworICAgICAgICBSdW5uYWJsZSBnZXRSdW5PbkNsb3NlSW5uZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJ1bm5hYmxlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhYWEiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgUnVubmFibGUgZ2V0UnVuT25DbG9zZUxhbWJkYVdpdGhUaGlzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICgpIC0+IFN5c3RlbS5vdXQucHJpbnRsbihhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU2V0PFJlZi5HbG9iYWxTdGF0ZT4gdGVzdEN5Y2xlcyhGdW5jdGlvbjxMYW1iZGFUZXN0Q2xhc3MsIFJ1bm5hYmxlPiBydW5PbkNsb3NlU3VwcGxpZXIpCisgICAgeworICAgICAgICBMYW1iZGFUZXN0Q2xhc3MgdGVzdCA9IG5ldyBMYW1iZGFUZXN0Q2xhc3MoKTsKKyAgICAgICAgUnVubmFibGUgd2Vha1JlZiA9IHJ1bk9uQ2xvc2VTdXBwbGllci5hcHBseSh0ZXN0KTsKKyAgICAgICAgUmVmQ291bnRlZC5UaWR5IHRpZGllciA9IG5ldyBSZWZDb3VudGVkLlRpZHkoKQorICAgICAgICB7CisgICAgICAgICAgICBSdW5uYWJsZSByZWYgPSB3ZWFrUmVmOworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0aWR5KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFN0cmluZyBuYW1lKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIjQyIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBSZWY8T2JqZWN0PiByZWYgPSBuZXcgUmVmKHRlc3QsIHRpZGllcik7CisgICAgICAgIHRlc3QucmVmID0gcmVmOworCisgICAgICAgIFZpc2l0b3IgdmlzaXRvciA9IG5ldyBWaXNpdG9yKCk7CisgICAgICAgIHZpc2l0b3IuaGF2ZUxvb3BzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICB2aXNpdG9yLnJ1bigpOworICAgICAgICByZWYuY2xvc2UoKTsKKworICAgICAgICByZXR1cm4gdmlzaXRvci5oYXZlTG9vcHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGludGVudGlvbiBvZiB0aGlzIHRlc3QgaXMgdG8gY29uZmlybSB0aGF0IGxhbWJkYSB3aXRob3V0IGEgcmVmZXJlbmNlIHRvIGB0aGlzYCwgZG9lcyBub3QgaW1wbGljaXRseQorICAgICAqIGluY2x1ZGUgYSByZWZlcmVuY2UgdG8gdGhlIGVuY2xvc2luZyBjbGFzcy4gSWYgaXQgZGlkLCB3ZSB3b3VsZCBkZXRlY3QgY3ljbGVzLCBhcyB3ZSBkbyB3aGVuIHdlIGRlYWwgd2l0aAorICAgICAqIGFub255bW91cyBpbm5lciBjbGFzc2VzIG9yIGxhbWJhIHdoaWNoIHJlZmVyZW5jZXMgYHRoaXNgIGV4cGxpY2l0bHkgKHNlZSB0aGUgc2FuaXR5IGNoZWNrcykuCisgICAgICogPHA+CisgICAgICogVGhpcyB0ZXN0IGFpbXMgdG8gY29uZmlybSB0aGF0IEpWTSB3b3JrcyBhcyB3ZSBhc3N1bWVkIGJlY2F1c2Ugd2UgY291bGRuJ3QgZmluZCB0aGF0IGluIHRoZSBzcGVjaWZpY2F0aW9uLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN5Y2xlcygpCisgICAgeworICAgICAgICBhc3NlcnRUaGF0KHRlc3RDeWNsZXMoTGFtYmRhVGVzdENsYXNzOjpnZXRSdW5PbkNsb3NlTGFtYmRhV2l0aFRoaXMpKS5pc05vdEVtcHR5KCk7IC8vIHNhbml0eSB0ZXN0CisgICAgICAgIGFzc2VydFRoYXQodGVzdEN5Y2xlcyhMYW1iZGFUZXN0Q2xhc3M6OmdldFJ1bk9uQ2xvc2VJbm5lcikpLmlzTm90RW1wdHkoKTsgLy8gc2FuaXR5IHRlc3QKKworICAgICAgICBhc3NlcnRUaGF0KHRlc3RDeWNsZXMoTGFtYmRhVGVzdENsYXNzOjpnZXRSdW5PbkNsb3NlTGFtYmRhKSkuaXNFbXB0eSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNTVGFibGVSZWFkZXJMZWFrSXNEZXRlY3RlZCgpCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuY2xpZW50SW5pdGlhbGl6YXRpb24oKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFBhcnRpdGlvbmVyVW5zYWZlKEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuaW5zdGFuY2UpOworICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLmZyb21GaWxlV2l0aENvbXBvbmVudChuZXcgRmlsZSgidGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYi9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uYl9zaW1wbGUvbmItMS1iaWctRGF0YS5kYiIpLCBmYWxzZSkubGVmdDsKKyAgICAgICAgVGFibGVNZXRhZGF0YSB0bSA9IFRhYmxlTWV0YWRhdGEuYnVpbGRlcigibGVnYWN5X3RhYmxlcyIsICJsZWdhY3lfbmJfc2ltcGxlIikuYWRkUGFydGl0aW9uS2V5Q29sdW1uKCJwayIsIFVURjhUeXBlLmluc3RhbmNlKS5hZGRSZWd1bGFyQ29sdW1uKCJ2YWwiLCBVVEY4VHlwZS5pbnN0YW5jZSkuYnVpbGQoKTsKKyAgICAgICAgQXRvbWljQm9vbGVhbiBsZWFrRGV0ZWN0ZWQgPSBuZXcgQXRvbWljQm9vbGVhbigpOworICAgICAgICBBdG9taWNCb29sZWFuIHJ1bk9uQ2xvc2VFeGVjdXRlZDEgPSBuZXcgQXRvbWljQm9vbGVhbigpOworICAgICAgICBBdG9taWNCb29sZWFuIHJ1bk9uQ2xvc2VFeGVjdXRlZDIgPSBuZXcgQXRvbWljQm9vbGVhbigpOworICAgICAgICBSZWYuT25MZWFrIHByZXZPbkxlYWsgPSBSZWYuT05fTEVBSzsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgUmVmLk9OX0xFQUsgPSBzdGF0ZSAtPiB7CisgICAgICAgICAgICAgICAgbGVha0RldGVjdGVkLnNldCh0cnVlKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXIgPSBTU1RhYmxlUmVhZGVyLm9wZW5Ob1ZhbGlkYXRpb24obnVsbCwgZGVzY3JpcHRvciwgVGFibGVNZXRhZGF0YVJlZi5mb3JPZmZsaW5lVG9vbHModG0pKTsKKyAgICAgICAgICAgICAgICByZWFkZXIucnVuT25DbG9zZSgoKSAtPiBydW5PbkNsb3NlRXhlY3V0ZWQxLnNldCh0cnVlKSk7CisgICAgICAgICAgICAgICAgcmVhZGVyLnJ1bk9uQ2xvc2UoKCkgLT4gcnVuT25DbG9zZUV4ZWN1dGVkMi5zZXQodHJ1ZSkpOyAvLyBzZWNvbmQgdGltZSB0byBhY3R1YWxseSBjcmVhdGUgbGFtYmRhIHJlZmVyZW5jaW5nIHRvIGxhbWJkYSwgc2VlIHJ1bk9uQ2xvc2UgaW1wbAorICAgICAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIFVudXNlZEFzc2lnbm1lbnQKKyAgICAgICAgICAgICAgICByZWFkZXIgPSBudWxsOyAvLyB0aGlzIGlzIHJlcXVpcmVkLCBvdGhlcndpc2UgR0Mgd2lsbCBub3QgYXR0ZW1wdCB0byBjb2xsZWN0IHRoZSBjcmVhdGVkIHJlYWRlcgorICAgICAgICAgICAgfQorICAgICAgICAgICAgQXdhaXRpbGl0eS5hd2FpdCgpLmF0TW9zdChEdXJhdGlvbi5vZlNlY29uZHMoMzApKS5wb2xsRGVsYXkoRHVyYXRpb24ub2ZTZWNvbmRzKDEpKS51bnRpbEFzc2VydGVkKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZ2MoKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZ2MoKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZ2MoKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZ2MoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KGxlYWtEZXRlY3RlZC5nZXQoKSkuaXNUcnVlKCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocnVuT25DbG9zZUV4ZWN1dGVkMS5nZXQoKSkuaXNUcnVlKCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJ1bk9uQ2xvc2VFeGVjdXRlZDIuZ2V0KCkpLmlzVHJ1ZSgpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgUmVmLk9OX0xFQUsgPSBwcmV2T25MZWFrOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL3ZpbnQvVkludENvZGluZ1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy92aW50L1ZJbnRDb2RpbmdUZXN0LmphdmEKaW5kZXggMTVmOWNkYy4uMzM5NzQyNiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL3ZpbnQvVkludENvZGluZ1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvdmludC9WSW50Q29kaW5nVGVzdC5qYXZhCkBAIC0xOCwyMSArMTgsMTkgQEAKICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnZpbnQ7CiAKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5pby5CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuVW5zaWduZWRJbnRlZ2VyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRCdWZmZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0QnVmZmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuV3JhcHBlZERhdGFPdXRwdXRTdHJlYW1QbHVzOwogCi1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwotCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIHB1YmxpYyBjbGFzcyBWSW50Q29kaW5nVGVzdApAQCAtNTEsMjEgKzQ5LDIxIEBACiAgICAgICAgICAgICBhc3NlcnRFbmNvZGVkQXRFeHBlY3RlZFNpemUoKDFMIDw8IDcgKiBzaXplKSAtIDEsIHNpemUpOwogICAgICAgICAgICAgYXNzZXJ0RW5jb2RlZEF0RXhwZWN0ZWRTaXplKDFMIDw8IDcgKiBzaXplLCBzaXplICsgMSk7CiAgICAgICAgIH0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg5LCBWSW50Q29kaW5nLmNvbXB1dGVVbnNpZ25lZFZJbnRTaXplKExvbmcuTUFYX1ZBTFVFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg5LCBWSW50Q29kaW5nLmNvbXB1dGVVbnNpZ25lZFZJbnRTaXplKExvbmcuTUFYX1ZBTFVFKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEVuY29kZWRBdEV4cGVjdGVkU2l6ZShsb25nIHZhbHVlLCBpbnQgZXhwZWN0ZWRTaXplKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU2l6ZSwgVkludENvZGluZy5jb21wdXRlVW5zaWduZWRWSW50U2l6ZSh2YWx1ZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTaXplLCBWSW50Q29kaW5nLmNvbXB1dGVVbnNpZ25lZFZJbnRTaXplKHZhbHVlKSk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICBXcmFwcGVkRGF0YU91dHB1dFN0cmVhbVBsdXMgb3V0ID0gbmV3IFdyYXBwZWREYXRhT3V0cHV0U3RyZWFtUGx1cyhiYW9zKTsKICAgICAgICAgVkludENvZGluZy53cml0ZVVuc2lnbmVkVkludCh2YWx1ZSwgb3V0KTsKICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIGV4cGVjdGVkU2l6ZSwgYmFvcy50b0J5dGVBcnJheSgpLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscyggZXhwZWN0ZWRTaXplLCBiYW9zLnRvQnl0ZUFycmF5KCkubGVuZ3RoKTsKIAogICAgICAgICBEYXRhT3V0cHV0QnVmZmVyIGRvYiA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKCk7CiAgICAgICAgIGRvYi53cml0ZVVuc2lnbmVkVkludCh2YWx1ZSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIGV4cGVjdGVkU2l6ZSwgZG9iLmJ1ZmZlcigpLnJlbWFpbmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCBleHBlY3RlZFNpemUsIGRvYi5idWZmZXIoKS5yZW1haW5pbmcoKSk7CiAgICAgICAgIGRvYi5jbG9zZSgpOwogICAgIH0KIApAQCAtNzMsNyArNzEsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkRXh0cmFCeXRlc0NvdW50KCkKICAgICB7CiAgICAgICAgIGZvciAoaW50IGkgPSAxIDsgaSA8IDggOyBpKyspCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGksIFZJbnRDb2RpbmcubnVtYmVyT2ZFeHRyYUJ5dGVzVG9SZWFkKChieXRlKSAoKDB4RkYgPDwgKDggLSBpKSkgJiAweEZGKSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIFZJbnRDb2RpbmcubnVtYmVyT2ZFeHRyYUJ5dGVzVG9SZWFkKChieXRlKSAoKDB4RkYgPDwgKDggLSBpKSkgJiAweEZGKSkpOwogICAgIH0KIAogICAgIC8qCkBAIC04NSwxMyArODMsMTMgQEAKIAogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgV3JhcHBlZERhdGFPdXRwdXRTdHJlYW1QbHVzIG91dCA9IG5ldyBXcmFwcGVkRGF0YU91dHB1dFN0cmVhbVBsdXMoYmFvcyk7Ci0gICAgICAgIFZJbnRDb2Rpbmcud3JpdGVVbnNpZ25lZFZJbnQoYmlnZ2VzdE9uZUJ5dGUsIG91dCk7CisgICAgICAgIFZJbnRDb2Rpbmcud3JpdGVVbnNpZ25lZFZJbnQzMihiaWdnZXN0T25lQnl0ZSwgb3V0KTsKICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDEsIGJhb3MudG9CeXRlQXJyYXkoKS5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIDEsIGJhb3MudG9CeXRlQXJyYXkoKS5sZW5ndGgpOwogCiAgICAgICAgIERhdGFPdXRwdXRCdWZmZXIgZG9iID0gbmV3IERhdGFPdXRwdXRCdWZmZXIoKTsKLSAgICAgICAgZG9iLndyaXRlVW5zaWduZWRWSW50KGJpZ2dlc3RPbmVCeXRlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggMSwgZG9iLmJ1ZmZlcigpLnJlbWFpbmluZygpKTsKKyAgICAgICAgZG9iLndyaXRlVW5zaWduZWRWSW50MzIoYmlnZ2VzdE9uZUJ5dGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIDEsIGRvYi5idWZmZXIoKS5yZW1haW5pbmcoKSk7CiAgICAgICAgIGRvYi5jbG9zZSgpOwogICAgIH0KIApAQCAtMTAxLDkgKzk5LDkgQEAKICAgICAgICAgaW50IGkgPSAtMTIzMTIzODY5NDsKICAgICAgICAgdHJ5IChEYXRhT3V0cHV0QnVmZmVyIG91dCA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFZJbnRDb2Rpbmcud3JpdGVVbnNpZ25lZFZJbnQoaSwgb3V0KTsKKyAgICAgICAgICAgIFZJbnRDb2Rpbmcud3JpdGVVbnNpZ25lZFZJbnQzMihpLCBvdXQpOwogICAgICAgICAgICAgbG9uZyByZXN1bHQgPSBWSW50Q29kaW5nLmdldFVuc2lnbmVkVkludChvdXQuYnVmZmVyKCksIDApOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhpLCByZXN1bHQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIHJlc3VsdCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTExMywxNSArMTExLDE0IEBACiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVkludENvZGluZy5NQVhfU0laRSAtIDE7IGkrKykKICAgICAgICAgewogICAgICAgICAgICAgbG9uZyB2YWwgPSBMT05HU1tpXTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoaSArIDEsIFZJbnRDb2RpbmcuY29tcHV0ZVVuc2lnbmVkVkludFNpemUodmFsKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArIDEsIFZJbnRDb2RpbmcuY29tcHV0ZVVuc2lnbmVkVkludFNpemUodmFsKSk7CiAgICAgICAgICAgICB0cnkgKERhdGFPdXRwdXRCdWZmZXIgb3V0ID0gbmV3IERhdGFPdXRwdXRCdWZmZXIoKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBWSW50Q29kaW5nLndyaXRlVW5zaWduZWRWSW50KHZhbCwgb3V0KTsKICAgICAgICAgICAgICAgICAvLyByZWFkIGFzIEJ5dGVCdWZmZXIKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHZhbCwgVkludENvZGluZy5nZXRVbnNpZ25lZFZJbnQob3V0LmJ1ZmZlcigpLCAwKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbCwgVkludENvZGluZy5nZXRVbnNpZ25lZFZJbnQob3V0LmJ1ZmZlcigpLCAwKSk7CiAgICAgICAgICAgICAgICAgLy8gcmVhZCBhcyBEYXRhSW5wdXQKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh2YWwsIFZJbnRDb2RpbmcucmVhZFVuc2lnbmVkVkludChuZXcgRGF0YUlucHV0UGx1cy5EYXRhSW5wdXRTdHJlYW1QbHVzKGlzKSkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWwsIFZJbnRDb2RpbmcucmVhZFVuc2lnbmVkVkludChuZXcgRGF0YUlucHV0QnVmZmVyKG91dC50b0J5dGVBcnJheSgpKSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTMyLDE4ICsxMjksMTcgQEAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBWSW50Q29kaW5nLk1BWF9TSVpFIC0gMTsgaSsrKQogICAgICAgICB7CiAgICAgICAgICAgICBsb25nIHZhbCA9IExPTkdTW2ldOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhpICsgMSwgVkludENvZGluZy5jb21wdXRlVW5zaWduZWRWSW50U2l6ZSh2YWwpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgMSwgVkludENvZGluZy5jb21wdXRlVW5zaWduZWRWSW50U2l6ZSh2YWwpKTsKICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgdHJ5IChXcmFwcGVkRGF0YU91dHB1dFN0cmVhbVBsdXMgb3V0ID0gbmV3IFdyYXBwZWREYXRhT3V0cHV0U3RyZWFtUGx1cyhiYW9zKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBWSW50Q29kaW5nLndyaXRlVW5zaWduZWRWSW50KHZhbCwgb3V0KTsKICAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCBpICsgMSwgYmFvcy50b0J5dGVBcnJheSgpLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCBpICsgMSwgYmFvcy50b0J5dGVBcnJheSgpLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgLy8gcmVhZCBhcyBCeXRlQnVmZmVyCi0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh2YWwsIFZJbnRDb2RpbmcuZ2V0VW5zaWduZWRWSW50KEJ5dGVCdWZmZXIud3JhcChiYW9zLnRvQnl0ZUFycmF5KCkpLCAwKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbCwgVkludENvZGluZy5nZXRVbnNpZ25lZFZJbnQoQnl0ZUJ1ZmZlci53cmFwKGJhb3MudG9CeXRlQXJyYXkoKSksIDApKTsKICAgICAgICAgICAgICAgICAvLyByZWFkIGFzIERhdGFJbnB1dAotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh2YWwsIFZJbnRDb2RpbmcucmVhZFVuc2lnbmVkVkludChuZXcgRGF0YUlucHV0UGx1cy5EYXRhSW5wdXRTdHJlYW1QbHVzKGlzKSkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWwsIFZJbnRDb2RpbmcucmVhZFVuc2lnbmVkVkludChuZXcgRGF0YUlucHV0QnVmZmVyKGJhb3MudG9CeXRlQXJyYXkoKSkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE1NCwxNCArMTUwLDEzIEBACiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVkludENvZGluZy5NQVhfU0laRSAtIDE7IGkrKykKICAgICAgICAgewogICAgICAgICAgICAgbG9uZyB2YWwgPSBMT05HU1tpXTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoaSArIDEsIFZJbnRDb2RpbmcuY29tcHV0ZVVuc2lnbmVkVkludFNpemUodmFsKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArIDEsIFZJbnRDb2RpbmcuY29tcHV0ZVVuc2lnbmVkVkludFNpemUodmFsKSk7CiAgICAgICAgICAgICBCeXRlQnVmZmVyIGJiID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShWSW50Q29kaW5nLk1BWF9TSVpFKTsKICAgICAgICAgICAgIFZJbnRDb2Rpbmcud3JpdGVVbnNpZ25lZFZJbnQodmFsLCBiYik7CiAgICAgICAgICAgICAvLyByZWFkIGFzIEJ5dGVCdWZmZXIKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModmFsLCBWSW50Q29kaW5nLmdldFVuc2lnbmVkVkludChiYiwgMCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbCwgVkludENvZGluZy5nZXRVbnNpZ25lZFZJbnQoYmIsIDApKTsKICAgICAgICAgICAgIC8vIHJlYWQgYXMgRGF0YUlucHV0Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYi5hcnJheSgpKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModmFsLCBWSW50Q29kaW5nLnJlYWRVbnNpZ25lZFZJbnQobmV3IERhdGFJbnB1dFBsdXMuRGF0YUlucHV0U3RyZWFtUGx1cyhpcykpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWwsIFZJbnRDb2RpbmcucmVhZFVuc2lnbmVkVkludChuZXcgRGF0YUlucHV0QnVmZmVyKGJiLmFycmF5KCkpKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE2OSwyNiArMTY0LDI1IEBACiAgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlVW5zaWduZWRWSW50QkJMZXNzVGhhbjhCeXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgbG9uZyB2YWwgPSAxMDIwMUw7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgVkludENvZGluZy5jb21wdXRlVW5zaWduZWRWSW50U2l6ZSh2YWwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIFZJbnRDb2RpbmcuY29tcHV0ZVVuc2lnbmVkVkludFNpemUodmFsKSk7CiAgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDIpOwogICAgICAgICBWSW50Q29kaW5nLndyaXRlVW5zaWduZWRWSW50KHZhbCwgYmIpOwogICAgICAgICAvLyByZWFkIGFzIEJ5dGVCdWZmZXIKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh2YWwsIFZJbnRDb2RpbmcuZ2V0VW5zaWduZWRWSW50KGJiLCAwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh2YWwsIFZJbnRDb2RpbmcuZ2V0VW5zaWduZWRWSW50KGJiLCAwKSk7CiAgICAgICAgIC8vIHJlYWQgYXMgRGF0YUlucHV0Ci0gICAgICAgIElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJiLmFycmF5KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHZhbCwgVkludENvZGluZy5yZWFkVW5zaWduZWRWSW50KG5ldyBEYXRhSW5wdXRQbHVzLkRhdGFJbnB1dFN0cmVhbVBsdXMoaXMpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh2YWwsIFZJbnRDb2RpbmcucmVhZFVuc2lnbmVkVkludChuZXcgRGF0YUlucHV0QnVmZmVyKGJiLmFycmF5KCkpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVVbnNpZ25lZFZJbnRCQkhhc0xlc3NUaGFuOEJ5dGVzTGVmdCgpCiAgICAgewogICAgICAgICBsb25nIHZhbCA9IDEwMjAxTDsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBWSW50Q29kaW5nLmNvbXB1dGVVbnNpZ25lZFZJbnRTaXplKHZhbCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgVkludENvZGluZy5jb21wdXRlVW5zaWduZWRWSW50U2l6ZSh2YWwpKTsKICAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMyk7CiAgICAgICAgIGJiLnBvc2l0aW9uKDEpOwogICAgICAgICBWSW50Q29kaW5nLndyaXRlVW5zaWduZWRWSW50KHZhbCwgYmIpOwogICAgICAgICAvLyByZWFkIGFzIEJ5dGVCdWZmZXIKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh2YWwsIFZJbnRDb2RpbmcuZ2V0VW5zaWduZWRWSW50KGJiLCAxKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh2YWwsIFZJbnRDb2RpbmcuZ2V0VW5zaWduZWRWSW50KGJiLCAxKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTIwMSw0ICsxOTUsNjYgQEAKICAgICAgICAgICAgIGZhaWwoKTsKICAgICAgICAgfSBjYXRjaCAoQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24gZSkge30KICAgICB9CisKKyAgICBzdGF0aWMgaW50W10gcm91bmR0cmlwVGVzdFZhbHVlcyA9ICBuZXcgaW50W10geworICAgICAgICAgICAgVW5zaWduZWRJbnRlZ2VyLk1BWF9WQUxVRS5pbnRWYWx1ZSgpLAorICAgICAgICAgICAgSW50ZWdlci5NQVhfVkFMVUUgKyAxLAorICAgICAgICAgICAgSW50ZWdlci5NQVhfVkFMVUUsCisgICAgICAgICAgICBJbnRlZ2VyLk1BWF9WQUxVRSAtIDEsCisgICAgICAgICAgICBJbnRlZ2VyLk1JTl9WQUxVRSwKKyAgICAgICAgICAgIEludGVnZXIuTUlOX1ZBTFVFICsgMSwKKyAgICAgICAgICAgIEludGVnZXIuTUlOX1ZBTFVFIC0gMSwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAtMSwKKyAgICAgICAgICAgIDEKKyAgICB9OworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Um91bmR0cmlwVW5zaWduZWRWSW50MzIoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBmb3IgKGludCB2YWx1ZSA6IHJvdW5kdHJpcFRlc3RWYWx1ZXMpCisgICAgICAgICAgICB0ZXN0Um91bmR0cmlwVW5zaWduZWRWSW50MzIodmFsdWUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdFJvdW5kdHJpcFVuc2lnbmVkVkludDMyKGludCB2YWx1ZSkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoOSk7CisgICAgICAgIFZJbnRDb2Rpbmcud3JpdGVVbnNpZ25lZFZJbnQzMih2YWx1ZSwgYmIpOworICAgICAgICBiYi5mbGlwKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgVkludENvZGluZy5nZXRVbnNpZ25lZFZJbnQzMihiYiwgMCkpOworCisgICAgICAgIHRyeSAoRGF0YU91dHB1dEJ1ZmZlciBkb2IgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlcigpKQorICAgICAgICB7CisgICAgICAgICAgICBkb2Iud3JpdGVVbnNpZ25lZFZJbnQzMih2YWx1ZSk7CisgICAgICAgICAgICB0cnkgKERhdGFJbnB1dEJ1ZmZlciBkaWIgPSBuZXcgRGF0YUlucHV0QnVmZmVyKGRvYi5idWZmZXIoKSwgZmFsc2UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgZGliLnJlYWRVbnNpZ25lZFZJbnQzMigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJvdW5kdHJpcFZJbnQzMigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGZvciAoaW50IHZhbHVlIDogcm91bmR0cmlwVGVzdFZhbHVlcykKKyAgICAgICAgICAgIHRlc3RSb3VuZHRyaXBWSW50MzIodmFsdWUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdFJvdW5kdHJpcFZJbnQzMihpbnQgdmFsdWUpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDkpOworCisgICAgICAgIFZJbnRDb2Rpbmcud3JpdGVWSW50MzIodmFsdWUsIGJiKTsKKyAgICAgICAgYmIuZmxpcCgpOworICAgICAgICBhc3NlcnRFcXVhbHModmFsdWUsIFZJbnRDb2RpbmcuZ2V0VkludDMyKGJiLCAwKSk7CisKKyAgICAgICAgdHJ5IChEYXRhT3V0cHV0QnVmZmVyIGRvYiA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvYi53cml0ZVZJbnQzMih2YWx1ZSk7CisgICAgICAgICAgICB0cnkgKERhdGFJbnB1dEJ1ZmZlciBkaWIgPSBuZXcgRGF0YUlucHV0QnVmZmVyKGRvYi5idWZmZXIoKSwgZmFsc2UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgZGliLnJlYWRWSW50MzIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS90b29scy9iaW4vY2Fzc2FuZHJhLmluLnNoIGIvdG9vbHMvYmluL2Nhc3NhbmRyYS5pbi5zaAppbmRleCBlMWQxZmUzLi44NjRiODdlIDEwMDY0NAotLS0gYS90b29scy9iaW4vY2Fzc2FuZHJhLmluLnNoCisrKyBiL3Rvb2xzL2Jpbi9jYXNzYW5kcmEuaW4uc2gKQEAgLTgwLDggKzgwLDkgQEAKIGphdmFfdmVyX291dHB1dD1gIiR7SkFWQTotamF2YX0iIC12ZXJzaW9uIDI+JjFgCiBqdm12ZXI9YGVjaG8gIiRqYXZhX3Zlcl9vdXRwdXQiIHwgZ3JlcCAnW29wZW5qZGt8amF2YV0gdmVyc2lvbicgfCBhd2sgLUYnIicgJ05SPT0xIHtwcmludCAkMn0nIHwgY3V0IC1kXC0gLWYxYAogSlZNX1ZFUlNJT049JHtqdm12ZXIlXyp9CitzaG9ydD0kKGVjaG8gIiR7anZtdmVyfSIgfCBjdXQgLWMxLTIpCiAKLUpBVkFfVkVSU0lPTj0xMQorSkFWQV9WRVJTSU9OPTE3CiBpZiBbICIkSlZNX1ZFUlNJT04iID0gIjEuOC4wIiBdICA7IHRoZW4KICAgICBKVk1fUEFUQ0hfVkVSU0lPTj0ke2p2bXZlciMqX30KICAgICBpZiBbICIkSlZNX1ZFUlNJT04iIFw8ICIxLjgiIF0gfHwgWyAiJEpWTV9WRVJTSU9OIiBcPiAiMS44LjIiIF0gOyB0aGVuCkBAIC05Niw2ICs5NywxMCBAQAogZWxpZiBbICIkSlZNX1ZFUlNJT04iIFw8ICIxMSIgXSA7IHRoZW4KICAgICBlY2hvICJDYXNzYW5kcmEgNC4wIHJlcXVpcmVzIGVpdGhlciBKYXZhIDggKHVwZGF0ZSAxNTEgb3IgbmV3ZXIpIG9yIEphdmEgMTEgKG9yIG5ld2VyKS4iCiAgICAgZXhpdCAxOworZWxpZiBbICIkc2hvcnQiID0gIjExIiBdIDsgdGhlbgorICAgICBKQVZBX1ZFUlNJT049MTEKK2VsaWYgWyAiJEpWTV9WRVJTSU9OIiBcPCAiMTciIF0gOyB0aGVuCisgICAgZWNobyAiQ2Fzc2FuZHJhIDUuMCByZXF1aXJlcyBKYXZhIDExIG9yIEphdmEgMTcob3IgbmV3ZXIpLiIKIGZpCiAKIGp2bT1gZWNobyAiJGphdmFfdmVyX291dHB1dCIgfCBncmVwIC1BIDEgJ1tvcGVuamRrfGphdmFdIHZlcnNpb24nIHwgYXdrICdOUj09MiB7cHJpbnQgJDF9J2AKQEAgLTExOSw3ICsxMjQsOSBAQAogCiAjIFJlYWQgdXNlci1kZWZpbmVkIEpWTSBvcHRpb25zIGZyb20ganZtLXNlcnZlci5vcHRpb25zIGZpbGUKIEpWTV9PUFRTX0ZJTEU9JENBU1NBTkRSQV9DT05GL2p2bSR7anZtb3B0aW9uc192YXJpYW50Oi0tY2xpZW50c30ub3B0aW9ucwotaWYgWyAkSkFWQV9WRVJTSU9OIC1nZSAxMSBdIDsgdGhlbgoraWYgWyAkSkFWQV9WRVJTSU9OIC1nZSAxNyBdIDsgdGhlbgorICAgIEpWTV9ERVBfT1BUU19GSUxFPSRDQVNTQU5EUkFfQ09ORi9qdm0xNyR7anZtb3B0aW9uc192YXJpYW50Oi0tY2xpZW50c30ub3B0aW9ucworZWxpZiBbICRKQVZBX1ZFUlNJT04gLWdlIDExIF0gOyB0aGVuCiAgICAgSlZNX0RFUF9PUFRTX0ZJTEU9JENBU1NBTkRSQV9DT05GL2p2bTExJHtqdm1vcHRpb25zX3ZhcmlhbnQ6LS1jbGllbnRzfS5vcHRpb25zCiBlbHNlCiAgICAgSlZNX0RFUF9PUFRTX0ZJTEU9JENBU1NBTkRSQV9DT05GL2p2bTgke2p2bW9wdGlvbnNfdmFyaWFudDotLWNsaWVudHN9Lm9wdGlvbnMKZGlmZiAtLWdpdCBhL3Rvb2xzL2Jpbi9zc3RhYmxlcGFydGl0aW9ucyBiL3Rvb2xzL2Jpbi9zc3RhYmxlcGFydGl0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNWYzMjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYmluL3NzdGFibGVwYXJ0aXRpb25zCkBAIC0wLDAgKzEsNDkgQEAKKyMhL2Jpbi9zaAorCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpZiBbICJ4JENBU1NBTkRSQV9JTkNMVURFIiA9ICJ4IiBdOyB0aGVuCisgICAgIyBMb2NhdGlvbnMgKGluIG9yZGVyKSB0byB1c2Ugd2hlbiBzZWFyY2hpbmcgZm9yIGFuIGluY2x1ZGUgZmlsZS4KKyAgICBmb3IgaW5jbHVkZSBpbiAiYGRpcm5hbWUgIiQwImAvY2Fzc2FuZHJhLmluLnNoIiBcCisgICAgICAgICAgICAgICAgICAgIiRIT01FLy5jYXNzYW5kcmEuaW4uc2giIFwKKyAgICAgICAgICAgICAgICAgICAvdXNyL3NoYXJlL2Nhc3NhbmRyYS9jYXNzYW5kcmEuaW4uc2ggXAorICAgICAgICAgICAgICAgICAgIC91c3IvbG9jYWwvc2hhcmUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS5pbi5zaCBcCisgICAgICAgICAgICAgICAgICAgL29wdC9jYXNzYW5kcmEvY2Fzc2FuZHJhLmluLnNoOyBkbworICAgICAgICBpZiBbIC1yICIkaW5jbHVkZSIgXTsgdGhlbgorICAgICAgICAgICAgLiAiJGluY2x1ZGUiCisgICAgICAgICAgICBicmVhaworICAgICAgICBmaQorICAgIGRvbmUKK2VsaWYgWyAtciAiJENBU1NBTkRSQV9JTkNMVURFIiBdOyB0aGVuCisgICAgLiAiJENBU1NBTkRSQV9JTkNMVURFIgorZmkKKworaWYgWyAteiAiJENMQVNTUEFUSCIgXTsgdGhlbgorICAgIGVjaG8gIllvdSBtdXN0IHNldCB0aGUgQ0xBU1NQQVRIIHZhciIgPiYyCisgICAgZXhpdCAxCitmaQorCitpZiBbICJ4JE1BWF9IRUFQX1NJWkUiID0gIngiIF07IHRoZW4KKyAgICBNQVhfSEVBUF9TSVpFPSIyNTZNIgorZmkKKworIiRKQVZBIiAkSkFWQV9BR0VOVCAtZWEgLWNwICIkQ0xBU1NQQVRIIiAkSlZNX09QVFMgLVhteCRNQVhfSEVBUF9TSVpFIFwKKyAgICAgICAgLURjYXNzYW5kcmEuc3RvcmFnZWRpcj0iJGNhc3NhbmRyYV9zdG9yYWdlZGlyIiBcCisgICAgICAgIC1EbG9nYmFjay5jb25maWd1cmF0aW9uRmlsZT1sb2diYWNrLXRvb2xzLnhtbCBcCisgICAgICAgIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlNTVGFibGVQYXJ0aXRpb25zICIkQCIKKworIyB2aTphaSBzdz00IHRzPTQgdHc9MCBldApkaWZmIC0tZ2l0IGEvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1N0cmVzc0NRTFNTVGFibGVXcml0ZXIuamF2YSBiL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TdHJlc3NDUUxTU1RhYmxlV3JpdGVyLmphdmEKaW5kZXggOGFhOTg2Ny4uY2RkMDVlYyAxMDA2NDQKLS0tIGEvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1N0cmVzc0NRTFNTVGFibGVXcml0ZXIuamF2YQorKysgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU3RyZXNzQ1FMU1NUYWJsZVdyaXRlci5qYXZhCkBAIC0yMSwyMiArMjEsMjIgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OworaW1wb3J0IGphdmEudXRpbC5VVUlEOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5BcnJheVV0aWxzOwogCiBpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuUmVjb2duaXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLnNjaGVtYS5DcmVhdGVUYWJsZVN0YXRlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkNyZWF0ZVR5cGVTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFUcmFuc2Zvcm1hdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxGcmFnbWVudFBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFN0YXRlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNvbHVtblNwZWNpZmljYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DcWxQYXJzZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5RdWVyeU9wdGlvbnM7CkBAIC00NCw3ICs0NCwxMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLlVESGVscGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLnR5cGVzLlR5cGVDb2RlYzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuVXBkYXRlU3RhdGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLnNjaGVtYS5DcmVhdGVUYWJsZVN0YXRlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkNyZWF0ZVR5cGVTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5NdXJtdXIzUGFydGl0aW9uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKQEAgLTUzLDYgKzU4LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hVHJhbnNmb3JtYXRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhUmVmOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UeXBlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNsaWVudFN0YXRlOwpAQCAtMzQ1LDcgKzM1NCw3IEBACiAgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxGaWxlPiBkaXJlY3RvcnlMaXN0OwogICAgICAgICBwcml2YXRlIENvbHVtbkZhbWlseVN0b3JlIGNmczsKIAotICAgICAgICBwcm90ZWN0ZWQgU1NUYWJsZUZvcm1hdC5UeXBlIGZvcm1hdFR5cGUgPSBudWxsOworICAgICAgICBwcm90ZWN0ZWQgU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXQgPSBudWxsOwogCiAgICAgICAgIHByaXZhdGUgQm9vbGVhbiBtYWtlUmFuZ2VBd2FyZSA9IGZhbHNlOwogCkBAIC01ODEsOCArNTkwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgU1NUYWJsZVNpbXBsZVdyaXRlcihjZnMuZ2V0RGlyZWN0b3JpZXMoKS5nZXREaXJlY3RvcnlGb3JOZXdTU1RhYmxlcygpLCBjZnMubWV0YWRhdGEsIHByZXBhcmVkSW5zZXJ0LnVwZGF0ZWRDb2x1bW5zKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFNTVGFibGVTaW1wbGVVbnNvcnRlZFdyaXRlcihjZnMuZ2V0RGlyZWN0b3JpZXMoKS5nZXREaXJlY3RvcnlGb3JOZXdTU1RhYmxlcygpLCBjZnMubWV0YWRhdGEsIHByZXBhcmVkSW5zZXJ0LnVwZGF0ZWRDb2x1bW5zKCksIGJ1ZmZlclNpemVJbk1pQik7CiAKLSAgICAgICAgICAgICAgICBpZiAoZm9ybWF0VHlwZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB3cml0ZXIuc2V0U1NUYWJsZUZvcm1hdFR5cGUoZm9ybWF0VHlwZSk7CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuc2V0U1NUYWJsZUZvcm1hdFR5cGUoZm9ybWF0KTsKIAogICAgICAgICAgICAgICAgIHdyaXRlci5zZXRSYW5nZUF3YXJlV3JpdGluZyhtYWtlUmFuZ2VBd2FyZSk7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL0NvbXBhY3Rpb25TdHJlc3MuamF2YSBiL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL0NvbXBhY3Rpb25TdHJlc3MuamF2YQppbmRleCAwZTdlZWM1Li45ODI5ZDU2IDEwMDY0NAotLS0gYS90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9Db21wYWN0aW9uU3RyZXNzLmphdmEKKysrIGIvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3MvQ29tcGFjdGlvblN0cmVzcy5qYXZhCkBAIC0yMSw3ICsyMSwxMiBAQAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXJyb3I7CiBpbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CkBAIC0zMSw3ICszNiwxMSBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlVuaW50ZXJydXB0aWJsZXM7CiAKLWltcG9ydCBpby5haXJsaWZ0LmFpcmxpbmUuKjsKK2ltcG9ydCBpby5haXJsaWZ0LmFpcmxpbmUuQ2xpOworaW1wb3J0IGlvLmFpcmxpZnQuYWlybGluZS5Db21tYW5kOworaW1wb3J0IGlvLmFpcmxpZnQuYWlybGluZS5IZWxwOworaW1wb3J0IGlvLmFpcmxpZnQuYWlybGluZS5IZWxwT3B0aW9uOworaW1wb3J0IGlvLmFpcmxpZnQuYWlybGluZS5PcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkNyZWF0ZVRhYmxlU3RhdGVtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwpAQCAtNDEsOSArNTAsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TdHJlc3NDUUxTU1RhYmxlV3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlN0cmVzc0NRTFNTVGFibGVXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CkBAIC0xMzEsNyArMTQxLDcgQEAKICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PERlc2NyaXB0b3IsIFNldDxDb21wb25lbnQ+PiBlbnRyeSA6IGxpc3Rlci5saXN0KCkuZW50cnlTZXQoKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50LkRBVEEpKQorICAgICAgICAgICAgICAgIGlmICghY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnRzLkRBVEEpKQogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICAgICAgICAgIHRyeQpkaWZmIC0tZ2l0IGEvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3MvU3RyZXNzR3JhcGguamF2YSBiL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL1N0cmVzc0dyYXBoLmphdmEKaW5kZXggNzZhODZkYi4uOWIzOGJiOCAxMDA2NDQKLS0tIGEvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3MvU3RyZXNzR3JhcGguamF2YQorKysgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9TdHJlc3NHcmFwaC5qYXZhCkBAIC0yOCwxOCArMjgsMTcgQEAKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5pby5CeXRlU3RyZWFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHM7CisKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQubm9kZS5BcnJheU5vZGU7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLm5vZGUuT2JqZWN0Tm9kZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3MucmVwb3J0LlN0cmVzc01ldHJpY3M7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZXNzLnNldHRpbmdzLlN0cmVzc1NldHRpbmdzOwotaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OQXJyYXk7Ci1pbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05PYmplY3Q7Ci1pbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05WYWx1ZTsKLQoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpzb25VdGlsczsKIAogcHVibGljIGNsYXNzIFN0cmVzc0dyYXBoCiB7CkBAIC02Miw3ICs2MSw3IEBACiAgICAgcHVibGljIHZvaWQgZ2VuZXJhdGVHcmFwaCgpCiAgICAgewogICAgICAgICBGaWxlIGh0bWxGaWxlID0gbmV3IEZpbGUoc3RyZXNzU2V0dGluZ3MuZ3JhcGguZmlsZSk7Ci0gICAgICAgIEpTT05PYmplY3Qgc3RhdHM7CisgICAgICAgIE9iamVjdE5vZGUgc3RhdHM7CiAgICAgICAgIGlmIChodG1sRmlsZS5pc0ZpbGUoKSkKICAgICAgICAgewogICAgICAgICAgICAgdHJ5CkBAIC04NCw3ICs4Myw3IEBACiAgICAgICAgIHRyeQogICAgICAgICB7CiAgICAgICAgICAgICBQcmludFdyaXRlciBvdXQgPSBuZXcgUHJpbnRXcml0ZXIoaHRtbEZpbGUpOwotICAgICAgICAgICAgU3RyaW5nIHN0YXRzQmxvY2sgPSAiLyogc3RhdHMgc3RhcnQgKi9cbnN0YXRzID0gIiArIHN0YXRzLnRvSlNPTlN0cmluZygpICsgIjtcbi8qIHN0YXRzIGVuZCAqL1xuIjsKKyAgICAgICAgICAgIFN0cmluZyBzdGF0c0Jsb2NrID0gIi8qIHN0YXRzIHN0YXJ0ICovXG5zdGF0cyA9ICIgKyBKc29uVXRpbHMud3JpdGVBc0pzb25TdHJpbmcoc3RhdHMpICsgIjtcbi8qIHN0YXRzIGVuZCAqL1xuIjsKICAgICAgICAgICAgIFN0cmluZyBodG1sID0gZ2V0R3JhcGhIVE1MKCkucmVwbGFjZUZpcnN0KCIvXFwqIHN0YXRzIHN0YXJ0IFxcKi9cblxuL1xcKiBzdGF0cyBlbmQgXFwqL1xuIiwgc3RhdHNCbG9jayk7CiAgICAgICAgICAgICBvdXQud3JpdGUoaHRtbCk7CiAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKQEAgLTk1LDE2ICs5NCwxOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBKU09OT2JqZWN0IHBhcnNlRXhpc3RpbmdTdGF0cyhTdHJpbmcgaHRtbCkKKyAgICBwcml2YXRlIE9iamVjdE5vZGUgcGFyc2VFeGlzdGluZ1N0YXRzKFN0cmluZyBodG1sKQogICAgIHsKLSAgICAgICAgSlNPTk9iamVjdCBzdGF0czsKLQogICAgICAgICBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIig/cykuKi9cXCogc3RhdHMgc3RhcnQgXFwqL1xcbnN0YXRzID0gKC4qKTtcXG4vXFwqIHN0YXRzIGVuZCBcXCovLioiKTsKICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKGh0bWwpOwogICAgICAgICBtYXRjaGVyLm1hdGNoZXMoKTsKLSAgICAgICAgc3RhdHMgPSAoSlNPTk9iamVjdCkgSlNPTlZhbHVlLnBhcnNlKG1hdGNoZXIuZ3JvdXAoMSkpOwotCi0gICAgICAgIHJldHVybiBzdGF0czsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT2JqZWN0Tm9kZSkgSnNvblV0aWxzLkpTT05fT0JKRUNUX01BUFBFUi5yZWFkVHJlZShtYXRjaGVyLmdyb3VwKDEpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkbid0IHBhcnNlciBzdGF0cyBqc29uOiAiK2UuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgU3RyaW5nIGdldEdyYXBoSFRNTCgpCkBAIC0xMjAsMTAgKzEyMiwxMCBAQAogICAgIH0KIAogICAgIC8qKiBQYXJzZSBsb2cgYW5kIGFwcGVuZCB0byBzdGF0cyBhcnJheSAqLwotICAgIHByaXZhdGUgSlNPTkFycmF5IHBhcnNlTG9nU3RhdHMoSW5wdXRTdHJlYW0gbG9nLCBKU09OQXJyYXkgc3RhdHMpIHsKKyAgICBwcml2YXRlIEFycmF5Tm9kZSBwYXJzZUxvZ1N0YXRzKElucHV0U3RyZWFtIGxvZywgQXJyYXlOb2RlIHN0YXRzKSB7CiAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIobG9nKSk7Ci0gICAgICAgIEpTT05PYmplY3QganNvbiA9IG5ldyBKU09OT2JqZWN0KCk7Ci0gICAgICAgIEpTT05BcnJheSBpbnRlcnZhbHMgPSBuZXcgSlNPTkFycmF5KCk7CisgICAgICAgIE9iamVjdE5vZGUganNvbiA9IEpzb25VdGlscy5KU09OX09CSkVDVF9NQVBQRVIuY3JlYXRlT2JqZWN0Tm9kZSgpOworICAgICAgICBBcnJheU5vZGUgaW50ZXJ2YWxzID0gSnNvblV0aWxzLkpTT05fT0JKRUNUX01BUFBFUi5jcmVhdGVBcnJheU5vZGUoKTsKICAgICAgICAgYm9vbGVhbiBydW5uaW5nTXVsdGlwbGVUaHJlYWRDb3VudHMgPSBmYWxzZTsKICAgICAgICAgU3RyaW5nIGN1cnJlbnRUaHJlYWRDb3VudCA9IG51bGw7CiAgICAgICAgIFBhdHRlcm4gdGhyZWFkQ291bnRNZXNzYWdlID0gUGF0dGVybi5jb21waWxlKCJSdW5uaW5nIChbQS1aXSspIHdpdGggKFswLTldKykgdGhyZWFkcyAuKiIpOwpAQCAtMTcxLDcgKzE3Myw3IEBACiAgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBsaW5lcwogICAgICAgICAgICAgICAgIGlmIChtb2RlID09IFJlYWRpbmdNb2RlLk1FVFJJQ1MpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBKU09OQXJyYXkgbWV0cmljcyA9IG5ldyBKU09OQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlOb2RlIG1ldHJpY3MgPSBKc29uVXRpbHMuSlNPTl9PQkpFQ1RfTUFQUEVSLmNyZWF0ZUFycmF5Tm9kZSgpOwogICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IGxpbmUuc3BsaXQoIiwiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPSBTdHJlc3NNZXRyaWNzLkhFQURNRVRSSUNTLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgewpAQCAtMTg1LDcgKzE4Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy5hZGQobnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy5hZGROdWxsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWxzLmFkZChtZXRyaWNzKTsKQEAgLTIwMyw3ICsyMDUsMTAgQEAKICAgICAgICAgICAgICAgICBlbHNlIGlmIChtb2RlID09IFJlYWRpbmdNb2RlLk5FWFRJVEVSQVRJT04pCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAvL1dyYXAgdXAgdGhlIHJlc3VsdHMgb2YgdGhpcyB0ZXN0IGFuZCBhcHBlbmQgdG8gdGhlIGFycmF5LgotICAgICAgICAgICAgICAgICAgICBqc29uLnB1dCgibWV0cmljcyIsIEFycmF5cy5hc0xpc3QoU3RyZXNzTWV0cmljcy5IRUFETUVUUklDUykpOworICAgICAgICAgICAgICAgICAgICBBcnJheU5vZGUgbWV0cmljcyA9IGpzb24ucHV0QXJyYXkoIm1ldHJpY3MiKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgbWV0cmljIDogU3RyZXNzTWV0cmljcy5IRUFETUVUUklDUykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy5hZGQobWV0cmljKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBqc29uLnB1dCgidGVzdCIsIHN0cmVzc1NldHRpbmdzLmdyYXBoLm9wZXJhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VGhyZWFkQ291bnQgPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24ucHV0KCJyZXZpc2lvbiIsIHN0cmVzc1NldHRpbmdzLmdyYXBoLnJldmlzaW9uKTsKQEAgLTIxMSwxMiArMjE2LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBqc29uLnB1dCgicmV2aXNpb24iLCBTdHJpbmcuZm9ybWF0KCIlcyAtICVzIHRocmVhZHMiLCBzdHJlc3NTZXR0aW5ncy5ncmFwaC5yZXZpc2lvbiwgY3VycmVudFRocmVhZENvdW50KSk7CiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb21tYW5kID0gU3RyaW5nVXRpbHMuam9pbihzdHJlc3NBcmd1bWVudHMsICIgIikucmVwbGFjZUFsbCgicGFzc3dvcmQ9Lio/ICIsICJwYXNzd29yZD0qKioqKioqICIpOwogICAgICAgICAgICAgICAgICAgICBqc29uLnB1dCgiY29tbWFuZCIsIGNvbW1hbmQpOwotICAgICAgICAgICAgICAgICAgICBqc29uLnB1dCgiaW50ZXJ2YWxzIiwgaW50ZXJ2YWxzKTsKKyAgICAgICAgICAgICAgICAgICAganNvbi5zZXQoImludGVydmFscyIsIGludGVydmFscyk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXRzLmFkZChqc29uKTsKIAogICAgICAgICAgICAgICAgICAgICAvL1N0YXJ0IGZyZXNoIGZvciBuZXh0IGl0ZXJhdGlvbjoKLSAgICAgICAgICAgICAgICAgICAganNvbiA9IG5ldyBKU09OT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGludGVydmFscyA9IG5ldyBKU09OQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAganNvbiA9IEpzb25VdGlscy5KU09OX09CSkVDVF9NQVBQRVIuY3JlYXRlT2JqZWN0Tm9kZSgpOworICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbHMgPSBKc29uVXRpbHMuSlNPTl9PQkpFQ1RfTUFQUEVSLmNyZWF0ZUFycmF5Tm9kZSgpOwogICAgICAgICAgICAgICAgICAgICBtb2RlID0gUmVhZGluZ01vZGUuU1RBUlQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjI5LDI1ICsyMzQsMjUgQEAKICAgICAgICAgcmV0dXJuIHN0YXRzOwogICAgIH0KIAotICAgIHByaXZhdGUgSlNPTk9iamVjdCBjcmVhdGVKU09OU3RhdHMoSlNPTk9iamVjdCBqc29uKQorICAgIHByaXZhdGUgT2JqZWN0Tm9kZSBjcmVhdGVKU09OU3RhdHMoT2JqZWN0Tm9kZSBqc29uKQogICAgIHsKICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBsb2dTdHJlYW0gPSBGaWxlcy5uZXdJbnB1dFN0cmVhbShzdHJlc3NTZXR0aW5ncy5ncmFwaC50ZW1wb3JhcnlMb2dGaWxlLnRvUGF0aCgpKSkKICAgICAgICAgewotICAgICAgICAgICAgSlNPTkFycmF5IHN0YXRzOworICAgICAgICAgICAgQXJyYXlOb2RlIHN0YXRzOwogICAgICAgICAgICAgaWYgKGpzb24gPT0gbnVsbCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBqc29uID0gbmV3IEpTT05PYmplY3QoKTsKLSAgICAgICAgICAgICAgICBzdGF0cyA9IG5ldyBKU09OQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBqc29uID0gSnNvblV0aWxzLkpTT05fT0JKRUNUX01BUFBFUi5jcmVhdGVPYmplY3ROb2RlKCk7CisgICAgICAgICAgICAgICAgc3RhdHMgPSBKc29uVXRpbHMuSlNPTl9PQkpFQ1RfTUFQUEVSLmNyZWF0ZUFycmF5Tm9kZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRzID0gKEpTT05BcnJheSkganNvbi5nZXQoInN0YXRzIik7CisgICAgICAgICAgICAgICAgc3RhdHMgPSAoQXJyYXlOb2RlKSBqc29uLmdldCgic3RhdHMiKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3RhdHMgPSBwYXJzZUxvZ1N0YXRzKGxvZ1N0cmVhbSwgc3RhdHMpOwogCiAgICAgICAgICAgICBqc29uLnB1dCgidGl0bGUiLCBzdHJlc3NTZXR0aW5ncy5ncmFwaC50aXRsZSk7Ci0gICAgICAgICAgICBqc29uLnB1dCgic3RhdHMiLCBzdGF0cyk7CisgICAgICAgICAgICBqc29uLnNldCgic3RhdHMiLCBzdGF0cyk7CiAgICAgICAgICAgICByZXR1cm4ganNvbjsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3JlcG9ydC9TdHJlc3NNZXRyaWNzLmphdmEgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9yZXBvcnQvU3RyZXNzTWV0cmljcy5qYXZhCmluZGV4IGI1MGRmZDIuLjg1NzliYmYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3JlcG9ydC9TdHJlc3NNZXRyaWNzLmphdmEKKysrIGIvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3MvcmVwb3J0L1N0cmVzc01ldHJpY3MuamF2YQpAQCAtODMsMTEgKzgzLDE0IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBRdWV1ZTxPcE1lYXN1cmVtZW50PiBsZWZ0b3ZlcnMgPSBuZXcgQXJyYXlEZXF1ZTw+KCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBUaW1pbmdJbnRlcnZhbCB0b3RhbEN1cnJlbnRJbnRlcnZhbDsKICAgICBwcml2YXRlIGZpbmFsIFRpbWluZ0ludGVydmFsIHRvdGFsU3VtbWFyeUludGVydmFsOworICAgIHByaXZhdGUgZmluYWwgaW50IG91dHB1dEZyZXF1ZW5jeUluU2Vjb25kczsKKyAgICBwcml2YXRlIGZpbmFsIGludCBoZWFkZXJGcmVxdWVuY3lJblNlY29uZHM7CisgICAgcHJpdmF0ZSBpbnQgb3V0cHV0TGluZXMgPSAwOwogCiAgICAgcHVibGljIFN0cmVzc01ldHJpY3MoUmVzdWx0TG9nZ2VyIG91dHB1dCwgZmluYWwgbG9uZyBsb2dJbnRlcnZhbE1pbGxpcywgU3RyZXNzU2V0dGluZ3Mgc2V0dGluZ3MpCiAgICAgewogICAgICAgICB0aGlzLm91dHB1dCA9IG91dHB1dDsKLSAgICAgICAgaWYoc2V0dGluZ3MubG9nLmhkckZpbGUgIT0gbnVsbCkKKyAgICAgICAgaWYgKHNldHRpbmdzLmxvZy5oZHJGaWxlICE9IG51bGwpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewpAQCAtMTE0LDcgKzExNyw4IEBACiAgICAgICAgIHRyeQogICAgICAgICB7CiAgICAgICAgICAgICBnY1N0YXRzQ29sbGVjdG9yID0gbmV3IEpteENvbGxlY3Rvcih0b0pteE5vZGVzKHNldHRpbmdzLm5vZGUucmVzb2x2ZUFsbFBlcm1pdHRlZChzZXR0aW5ncykpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MucG9ydC5qbXhQb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnBvcnQuam14UG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmpteCk7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQogICAgICAgICB7CkBAIC0xMzMsNiArMTM3LDggQEAKICAgICAgICAgICAgIHJlcG9ydGluZ0xvb3AobG9nSW50ZXJ2YWxNaWxsaXMpOwogICAgICAgICB9KTsKICAgICAgICAgdGhyZWFkLnNldE5hbWUoIlN0cmVzc01ldHJpY3MiKTsKKyAgICAgICAgaGVhZGVyRnJlcXVlbmN5SW5TZWNvbmRzID0gc2V0dGluZ3MucmVwb3J0aW5nLmhlYWRlckZyZXF1ZW5jeTsKKyAgICAgICAgb3V0cHV0RnJlcXVlbmN5SW5TZWNvbmRzID0gc2V0dGluZ3MucmVwb3J0aW5nLm91dHB1dEZyZXF1ZW5jeTsKICAgICB9CiAgICAgcHVibGljIHZvaWQgc3RhcnQoKQogICAgIHsKQEAgLTI2Miw3ICsyNjgsMTIgQEAKICAgICAgICAgICAgICAgICBvcEludGVydmFsLnJlc2V0KCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHByaW50Um93KCIiLCAidG90YWwiLCB0b3RhbEN1cnJlbnRJbnRlcnZhbCwgdG90YWxTdW1tYXJ5SW50ZXJ2YWwsIGdjU3RhdHMsIHJvd1JhdGVVbmNlcnRhaW50eSwgb3V0cHV0KTsKKyAgICAgICAgICAgICsrb3V0cHV0TGluZXM7CisgICAgICAgICAgICBpZiAob3V0cHV0RnJlcXVlbmN5SW5TZWNvbmRzID09IDAgfHwgb3V0cHV0TGluZXMgJSBvdXRwdXRGcmVxdWVuY3lJblNlY29uZHMgPT0gMCkKKyAgICAgICAgICAgICAgICBwcmludFJvdygiIiwgInRvdGFsIiwgdG90YWxDdXJyZW50SW50ZXJ2YWwsIHRvdGFsU3VtbWFyeUludGVydmFsLCBnY1N0YXRzLCByb3dSYXRlVW5jZXJ0YWludHksIG91dHB1dCk7CisgICAgICAgICAgICBpZiAoaGVhZGVyRnJlcXVlbmN5SW5TZWNvbmRzICE9IDAgJiYgb3V0cHV0TGluZXMgJSBoZWFkZXJGcmVxdWVuY3lJblNlY29uZHMgPT0gMCkKKyAgICAgICAgICAgICAgICBwcmludEhlYWRlcigiXG4iLCBvdXRwdXQpOworCiAgICAgICAgICAgICB0b3RhbEN1cnJlbnRJbnRlcnZhbC5yZXNldCgpOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3Mvc2V0dGluZ3MvQ2xpT3B0aW9uLmphdmEgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9DbGlPcHRpb24uamF2YQppbmRleCBlYmEyNzZlLi41NTA0NjcxIDEwMDY0NAotLS0gYS90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9DbGlPcHRpb24uamF2YQorKysgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9DbGlPcHRpb24uamF2YQpAQCAtMzcsOCArMzcsMTEgQEAKICAgICBMT0coIldoZXJlIHRvIGxvZyBwcm9ncmVzcyB0bywgYW5kIHRoZSBpbnRlcnZhbCBhdCB3aGljaCB0byBkbyBpdCIsIFNldHRpbmdzTG9nLmhlbHBQcmludGVyKCkpLAogICAgIFRSQU5TUE9SVCgiQ3VzdG9tIHRyYW5zcG9ydCBmYWN0b3JpZXMiLCBTZXR0aW5nc1RyYW5zcG9ydC5oZWxwUHJpbnRlcigpKSwKICAgICBQT1JUKCJUaGUgcG9ydCB0byBjb25uZWN0IHRvIGNhc3NhbmRyYSBub2RlcyBvbiIsIFNldHRpbmdzUG9ydC5oZWxwUHJpbnRlcigpKSwKKyAgICBKTVgoIkpNWCBjcmVkZW50aWFscyIsIFNldHRpbmdzSk1YLmhlbHBQcmludGVyKCkpLAogICAgIEdSQVBIKCItZ3JhcGgiLCAiR3JhcGggcmVjb3JkZWQgbWV0cmljcyIsIFNldHRpbmdzR3JhcGguaGVscFByaW50ZXIoKSksCi0gICAgVE9LRU5SQU5HRSgiVG9rZW4gcmFuZ2Ugc2V0dGluZ3MiLCBTZXR0aW5nc1Rva2VuUmFuZ2UuaGVscFByaW50ZXIoKSkKKyAgICBUT0tFTlJBTkdFKCJUb2tlbiByYW5nZSBzZXR0aW5ncyIsIFNldHRpbmdzVG9rZW5SYW5nZS5oZWxwUHJpbnRlcigpKSwKKyAgICBDUkVERU5USUFMU19GSUxFKCJDcmVkZW50aWFscyBmaWxlIGZvciBDUUwsIEpNWCBhbmQgdHJhbnNwb3J0IiwgU2V0dGluZ3NDcmVkZW50aWFscy5oZWxwUHJpbnRlcigpKSwKKyAgICBSRVBPUlRJTkcoIkZyZXF1ZW5jeSBvZiBwcmludGluZyBzdGF0aXN0aWNzIGFuZCBoZWFkZXIgZm9yIHN0cmVzcyBvdXRwdXQiLCBTZXR0aW5nc1JlcG9ydGluZy5oZWxwUHJpbnRlcigpKTsKICAgICA7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBDbGlPcHRpb24+IExPT0tVUDsKQEAgLTYzLDExICs2NiwxMiBAQAogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb247CiAgICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBoZWxwUHJpbnRlcjsKIAotICAgIHByaXZhdGUgQ2xpT3B0aW9uKFN0cmluZyBkZXNjcmlwdGlvbiwgUnVubmFibGUgaGVscFByaW50ZXIpCisgICAgQ2xpT3B0aW9uKFN0cmluZyBkZXNjcmlwdGlvbiwgUnVubmFibGUgaGVscFByaW50ZXIpCiAgICAgewogICAgICAgICB0aGlzKG51bGwsIGRlc2NyaXB0aW9uLCBoZWxwUHJpbnRlcik7CiAgICAgfQotICAgIHByaXZhdGUgQ2xpT3B0aW9uKFN0cmluZyBleHRyYU5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbiwgUnVubmFibGUgaGVscFByaW50ZXIpCisKKyAgICBDbGlPcHRpb24oU3RyaW5nIGV4dHJhTmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uLCBSdW5uYWJsZSBoZWxwUHJpbnRlcikKICAgICB7CiAgICAgICAgIHRoaXMuZXh0cmFOYW1lID0gZXh0cmFOYW1lOwogICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CkBAIC03OSw0ICs4Myw4IEBACiAgICAgICAgIGhlbHBQcmludGVyLnJ1bigpOwogICAgIH0KIAorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5hbWUoKS5yZXBsYWNlQWxsKCJfIiwgIi0iKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9TZXR0aW5nc0NyZWRlbnRpYWxzLmphdmEgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9TZXR0aW5nc0NyZWRlbnRpYWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1MTNiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3NldHRpbmdzL1NldHRpbmdzQ3JlZGVudGlhbHMuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3Muc2V0dGluZ3M7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3MudXRpbC5SZXN1bHRMb2dnZXI7CisKK3B1YmxpYyBjbGFzcyBTZXR0aW5nc0NyZWRlbnRpYWxzIGltcGxlbWVudHMgU2VyaWFsaXphYmxlCit7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1FMX1VTRVJOQU1FX1BST1BFUlRZX0tFWSA9ICJjcWwudXNlcm5hbWUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENRTF9QQVNTV09SRF9QUk9QRVJUWV9LRVkgPSAiY3FsLnBhc3N3b3JkIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKTVhfVVNFUk5BTUVfUFJPUEVSVFlfS0VZID0gImpteC51c2VybmFtZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk1YX1BBU1NXT1JEX1BST1BFUlRZX0tFWSA9ICJqbXgucGFzc3dvcmQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TUE9SVF9UUlVTVFNUT1JFX1BBU1NXT1JEX1BST1BFUlRZX0tFWSA9ICJ0cmFuc3BvcnQudHJ1c3RzdG9yZS5wYXNzd29yZCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNQT1JUX0tFWVNUT1JFX1BBU1NXT1JEX1BST1BFUlRZX0tFWSA9ICJ0cmFuc3BvcnQua2V5c3RvcmUucGFzc3dvcmQiOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmlsZTsKKworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY3FsVXNlcm5hbWU7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBjcWxQYXNzd29yZDsKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGpteFVzZXJuYW1lOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgam14UGFzc3dvcmQ7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyB0cmFuc3BvcnRUcnVzdHN0b3JlUGFzc3dvcmQ7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyB0cmFuc3BvcnRLZXlzdG9yZVBhc3N3b3JkOworCisgICAgcHVibGljIFNldHRpbmdzQ3JlZGVudGlhbHMoU3RyaW5nIGZpbGUpCisgICAgeworICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBjcWxVc2VybmFtZSA9IG51bGw7CisgICAgICAgICAgICBjcWxQYXNzd29yZCA9IG51bGw7CisgICAgICAgICAgICBqbXhVc2VybmFtZSA9IG51bGw7CisgICAgICAgICAgICBqbXhQYXNzd29yZCA9IG51bGw7CisgICAgICAgICAgICB0cmFuc3BvcnRUcnVzdHN0b3JlUGFzc3dvcmQgPSBudWxsOworICAgICAgICAgICAgdHJhbnNwb3J0S2V5c3RvcmVQYXNzd29yZCA9IG51bGw7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGZpbGUpLnRvSmF2YUlPRmlsZSgpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmxvYWQoaXMpOworCisgICAgICAgICAgICAgICAgY3FsVXNlcm5hbWUgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KENRTF9VU0VSTkFNRV9QUk9QRVJUWV9LRVkpOworICAgICAgICAgICAgICAgIGNxbFBhc3N3b3JkID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShDUUxfUEFTU1dPUkRfUFJPUEVSVFlfS0VZKTsKKyAgICAgICAgICAgICAgICBqbXhVc2VybmFtZSA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSk1YX1VTRVJOQU1FX1BST1BFUlRZX0tFWSk7CisgICAgICAgICAgICAgICAgam14UGFzc3dvcmQgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KEpNWF9QQVNTV09SRF9QUk9QRVJUWV9LRVkpOworICAgICAgICAgICAgICAgIHRyYW5zcG9ydFRydXN0c3RvcmVQYXNzd29yZCA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoVFJBTlNQT1JUX1RSVVNUU1RPUkVfUEFTU1dPUkRfUFJPUEVSVFlfS0VZKTsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnRLZXlzdG9yZVBhc3N3b3JkID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShUUkFOU1BPUlRfS0VZU1RPUkVfUEFTU1dPUkRfUFJPUEVSVFlfS0VZKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpb2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ0xJIFV0aWxpdHkgTWV0aG9kcworICAgIHB1YmxpYyB2b2lkIHByaW50U2V0dGluZ3MoUmVzdWx0TG9nZ2VyIG91dCkKKyAgICB7CisgICAgICAgIG91dC5wcmludGYoIiAgRmlsZTogJXMlbiIsIGZpbGUgPT0gbnVsbCA/ICIqbm90IHNldCoiIDogZmlsZSk7CisgICAgICAgIG91dC5wcmludGYoIiAgQ1FMIHVzZXJuYW1lOiAlcyVuIiwgY3FsVXNlcm5hbWUgPT0gbnVsbCA/ICIqbm90IHNldCoiIDogY3FsVXNlcm5hbWUpOworICAgICAgICBvdXQucHJpbnRmKCIgIENRTCBwYXNzd29yZDogJXMlbiIsIGNxbFBhc3N3b3JkID09IG51bGwgPyAiKm5vdCBzZXQqIiA6ICIqc3VwcHJlc3NlZCoiKTsKKyAgICAgICAgb3V0LnByaW50ZigiICBKTVggdXNlcm5hbWU6ICVzJW4iLCBqbXhVc2VybmFtZSA9PSBudWxsID8gIipub3Qgc2V0KiIgOiBqbXhVc2VybmFtZSk7CisgICAgICAgIG91dC5wcmludGYoIiAgSk1YIHBhc3N3b3JkOiAlcyVuIiwgam14UGFzc3dvcmQgPT0gbnVsbCA/ICIqbm90IHNldCoiIDogIipzdXBwcmVzc2VkKiIpOworICAgICAgICBvdXQucHJpbnRmKCIgIFRyYW5zcG9ydCB0cnVzdHN0b3JlIHBhc3N3b3JkOiAlcyVuIiwgdHJhbnNwb3J0VHJ1c3RzdG9yZVBhc3N3b3JkID09IG51bGwgPyAiKm5vdCBzZXQqIiA6ICIqc3VwcHJlc3NlZCoiKTsKKyAgICAgICAgb3V0LnByaW50ZigiICBUcmFuc3BvcnQga2V5c3RvcmUgcGFzc3dvcmQ6ICVzJW4iLCB0cmFuc3BvcnRLZXlzdG9yZVBhc3N3b3JkID09IG51bGwgPyAiKm5vdCBzZXQqIiA6ICIqc3VwcHJlc3NlZCoiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNldHRpbmdzQ3JlZGVudGlhbHMgZ2V0KE1hcDxTdHJpbmcsIFN0cmluZ1tdPiBjbEFyZ3MpCisgICAgeworICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSBjbEFyZ3MucmVtb3ZlKCItY3JlZGVudGlhbHMtZmlsZSIpOworICAgICAgICBpZiAocGFyYW1zID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbmV3IFNldHRpbmdzQ3JlZGVudGlhbHMobnVsbCk7CisKKyAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRIZWxwKCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkludmFsaWQgLWNyZWRlbnRpYWxzLWZpbGUgb3B0aW9uIHByb3ZpZGVkLCBzZWUgb3V0cHV0IGZvciB2YWxpZCBvcHRpb25zIik7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgU2V0dGluZ3NDcmVkZW50aWFscyhwYXJhbXNbMF0pOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludEhlbHAoKQorICAgIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogLWNyZWRlbnRpYWxzLWZpbGUgPGZpbGU+ICIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiRmlsZSBpcyBzdXBwb3NlZCB0byBiZSBhIHN0YW5kYXJkIHByb3BlcnR5IGZpbGUgd2l0aCAnJXMnLCAnJXMnLCAnJXMnLCAnJXMnLCAnJXMnLCBhbmQgJyVzJyBhcyBrZXlzLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSB2YWx1ZXMgZm9yIHRoZXNlIGtleXMgd2lsbCBiZSBvdmVycmlkZW4gYnkgdGhlaXIgY29tbWFuZC1saW5lIGNvdW50ZXJwYXJ0cyB3aGVuIHNwZWNpZmllZC4lbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENRTF9VU0VSTkFNRV9QUk9QRVJUWV9LRVksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENRTF9QQVNTV09SRF9QUk9QRVJUWV9LRVksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEpNWF9VU0VSTkFNRV9QUk9QRVJUWV9LRVksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEpNWF9QQVNTV09SRF9QUk9QRVJUWV9LRVksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9SVF9LRVlTVE9SRV9QQVNTV09SRF9QUk9QRVJUWV9LRVksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9SVF9UUlVTVFNUT1JFX1BBU1NXT1JEX1BST1BFUlRZX0tFWSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBSdW5uYWJsZSBoZWxwUHJpbnRlcigpCisgICAgeworICAgICAgICByZXR1cm4gU2V0dGluZ3NDcmVkZW50aWFsczo6cHJpbnRIZWxwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3NldHRpbmdzL1NldHRpbmdzSk1YLmphdmEgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9TZXR0aW5nc0pNWC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMjAyYmUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9TZXR0aW5nc0pNWC5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZXNzLnNldHRpbmdzOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZXNzLnV0aWwuUmVzdWx0TG9nZ2VyOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3Muc2V0dGluZ3MuU2V0dGluZ3NDcmVkZW50aWFscy5KTVhfUEFTU1dPUkRfUFJPUEVSVFlfS0VZOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3Muc2V0dGluZ3MuU2V0dGluZ3NDcmVkZW50aWFscy5KTVhfVVNFUk5BTUVfUFJPUEVSVFlfS0VZOworCitwdWJsaWMgY2xhc3MgU2V0dGluZ3NKTVggaW1wbGVtZW50cyBTZXJpYWxpemFibGUKK3sKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHVzZXI7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBwYXNzd29yZDsKKworICAgIHB1YmxpYyBTZXR0aW5nc0pNWChPcHRpb25zIG9wdGlvbnMsIFNldHRpbmdzQ3JlZGVudGlhbHMgY3JlZGVudGlhbHMpCisgICAgeworICAgICAgICB0aGlzLnVzZXIgPSBvcHRpb25zLnVzZXIuc2V0QnlVc2VyKCkgPyBvcHRpb25zLnVzZXIudmFsdWUoKSA6IGNyZWRlbnRpYWxzLmpteFVzZXJuYW1lOworICAgICAgICB0aGlzLnBhc3N3b3JkID0gb3B0aW9ucy5wYXNzd29yZC5zZXRCeVVzZXIoKSA/IG9wdGlvbnMucGFzc3dvcmQudmFsdWUoKSA6IGNyZWRlbnRpYWxzLmpteFBhc3N3b3JkOworICAgIH0KKworICAgIC8vIE9wdGlvbiBEZWNsYXJhdGlvbnMKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgT3B0aW9ucyBleHRlbmRzIEdyb3VwZWRPcHRpb25zCisgICAgeworICAgICAgICBmaW5hbCBPcHRpb25TaW1wbGUgdXNlciA9IG5ldyBPcHRpb25TaW1wbGUoInVzZXI9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJVc2VybmFtZSBmb3IgSk1YIGNvbm5lY3Rpb24sIHdoZW4gc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlIHRoZSB2YWx1ZSBpbiBjcmVkZW50aWFscyBmaWxlIGZvciBrZXkgJyVzJyIsIEpNWF9VU0VSTkFNRV9QUk9QRVJUWV9LRVkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworCisgICAgICAgIGZpbmFsIE9wdGlvblNpbXBsZSBwYXNzd29yZCA9IG5ldyBPcHRpb25TaW1wbGUoInBhc3N3b3JkPSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4qIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiUGFzc3dvcmQgZm9yIEpNWCBjb25uZWN0aW9uLCB3aGVuIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSB0aGUgdmFsdWUgaW4gY3JlZGVudGlhbHMgZmlsZSBmb3Iga2V5ICclcyciLCBKTVhfUEFTU1dPUkRfUFJPUEVSVFlfS0VZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PD8gZXh0ZW5kcyBPcHRpb24+IG9wdGlvbnMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCh1c2VyLCBwYXNzd29yZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDTEkgVXRpbGl0eSBNZXRob2RzCisgICAgcHVibGljIHZvaWQgcHJpbnRTZXR0aW5ncyhSZXN1bHRMb2dnZXIgb3V0KQorICAgIHsKKyAgICAgICAgb3V0LnByaW50ZigiICBVc2VybmFtZTogJXMlbiIsIHVzZXIpOworICAgICAgICBvdXQucHJpbnRmKCIgIFBhc3N3b3JkOiAlcyVuIiwgKHBhc3N3b3JkID09IG51bGwgPyAiKm5vdCBzZXQqIiA6ICIqc3VwcHJlc3NlZCoiKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTZXR0aW5nc0pNWCBnZXQoTWFwPFN0cmluZywgU3RyaW5nW10+IGNsQXJncywgU2V0dGluZ3NDcmVkZW50aWFscyBjcmVkZW50aWFscykKKyAgICB7CisgICAgICAgIFN0cmluZ1tdIHBhcmFtcyA9IGNsQXJncy5yZW1vdmUoIi1qbXgiKTsKKyAgICAgICAgaWYgKHBhcmFtcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXR0aW5nc0pNWChuZXcgU2V0dGluZ3NKTVguT3B0aW9ucygpLCBjcmVkZW50aWFscyk7CisKKyAgICAgICAgR3JvdXBlZE9wdGlvbnMgb3B0aW9ucyA9IEdyb3VwZWRPcHRpb25zLnNlbGVjdChwYXJhbXMsIG5ldyBTZXR0aW5nc0pNWC5PcHRpb25zKCkpOworICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludEhlbHAoKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZCAtam14IG9wdGlvbnMgcHJvdmlkZWQsIHNlZSBvdXRwdXQgZm9yIHZhbGlkIG9wdGlvbnMiKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgU2V0dGluZ3NKTVgoKFNldHRpbmdzSk1YLk9wdGlvbnMpIG9wdGlvbnMsIGNyZWRlbnRpYWxzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRIZWxwKCkKKyAgICB7CisgICAgICAgIEdyb3VwZWRPcHRpb25zLnByaW50T3B0aW9ucyhTeXN0ZW0ub3V0LCAiLWpteCIsIG5ldyBTZXR0aW5nc0pNWC5PcHRpb25zKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUnVubmFibGUgaGVscFByaW50ZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFNldHRpbmdzSk1YOjpwcmludEhlbHA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3Mvc2V0dGluZ3MvU2V0dGluZ3NNb2RlLmphdmEgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9TZXR0aW5nc01vZGUuamF2YQppbmRleCA3ZTUzNTQ3Li5iMDA5ZDA0IDEwMDY0NAotLS0gYS90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9TZXR0aW5nc01vZGUuamF2YQorKysgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9TZXR0aW5nc01vZGUuamF2YQpAQCAtMzIsNiArMzIsMTAgQEAKIGltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVzcy51dGlsLlJlc3VsdExvZ2dlcjsKIAoraW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZXNzLnNldHRpbmdzLlNldHRpbmdzQ3JlZGVudGlhbHMuQ1FMX1BBU1NXT1JEX1BST1BFUlRZX0tFWTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZXNzLnNldHRpbmdzLlNldHRpbmdzQ3JlZGVudGlhbHMuQ1FMX1VTRVJOQU1FX1BST1BFUlRZX0tFWTsKKwogcHVibGljIGNsYXNzIFNldHRpbmdzTW9kZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQogewogCkBAIC01MSw3ICs1NSw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29tcHJlc3Npb247CiAKIAotICAgIHB1YmxpYyBTZXR0aW5nc01vZGUoR3JvdXBlZE9wdGlvbnMgb3B0aW9ucykKKyAgICBwdWJsaWMgU2V0dGluZ3NNb2RlKEdyb3VwZWRPcHRpb25zIG9wdGlvbnMsIFNldHRpbmdzQ3JlZGVudGlhbHMgY3JlZGVudGlhbHMpCiAgICAgewogICAgICAgICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIENxbDNPcHRpb25zKQogICAgICAgICB7CkBAIC02Myw4ICs2Nyw4IEBACiAgICAgICAgICAgICBhcGkgPSBDb25uZWN0aW9uQVBJLkpBVkFfRFJJVkVSX05BVElWRTsKICAgICAgICAgICAgIHN0eWxlID0gb3B0cy51c2VVblByZXBhcmVkLnNldEJ5VXNlcigpID8gQ29ubmVjdGlvblN0eWxlLkNRTCA6ICBDb25uZWN0aW9uU3R5bGUuQ1FMX1BSRVBBUkVEOwogICAgICAgICAgICAgY29tcHJlc3Npb24gPSBQcm90b2NvbE9wdGlvbnMuQ29tcHJlc3Npb24udmFsdWVPZihvcHRzLnVzZUNvbXByZXNzaW9uLnZhbHVlKCkudG9VcHBlckNhc2UoKSkubmFtZSgpOwotICAgICAgICAgICAgdXNlcm5hbWUgPSBvcHRzLnVzZXIudmFsdWUoKTsKLSAgICAgICAgICAgIHBhc3N3b3JkID0gb3B0cy5wYXNzd29yZC52YWx1ZSgpOworICAgICAgICAgICAgdXNlcm5hbWUgPSBvcHRzLnVzZXIuc2V0QnlVc2VyKCkgPyBvcHRzLnVzZXIudmFsdWUoKSA6IGNyZWRlbnRpYWxzLmNxbFVzZXJuYW1lOworICAgICAgICAgICAgcGFzc3dvcmQgPSBvcHRzLnBhc3N3b3JkLnNldEJ5VXNlcigpID8gb3B0cy5wYXNzd29yZC52YWx1ZSgpIDogY3JlZGVudGlhbHMuY3FsUGFzc3dvcmQ7CiAgICAgICAgICAgICBtYXhQZW5kaW5nUGVyQ29ubmVjdGlvbiA9IG9wdHMubWF4UGVuZGluZ1BlckNvbm5lY3Rpb24udmFsdWUoKS5pc0VtcHR5KCkgPyBudWxsIDogSW50ZWdlci52YWx1ZU9mKG9wdHMubWF4UGVuZGluZ1BlckNvbm5lY3Rpb24udmFsdWUoKSk7CiAgICAgICAgICAgICBjb25uZWN0aW9uc1Blckhvc3QgPSBvcHRzLmNvbm5lY3Rpb25zUGVySG9zdC52YWx1ZSgpLmlzRW1wdHkoKSA/IG51bGwgOiBJbnRlZ2VyLnZhbHVlT2Yob3B0cy5jb25uZWN0aW9uc1Blckhvc3QudmFsdWUoKSk7CiAgICAgICAgICAgICBhdXRoUHJvdmlkZXJDbGFzc25hbWUgPSBvcHRzLmF1dGhQcm92aWRlci52YWx1ZSgpOwpAQCAtMTM3LDggKzE0MSwxMiBAQAogICAgICAgICBmaW5hbCBPcHRpb25TaW1wbGUgdXNlVW5QcmVwYXJlZCA9IG5ldyBPcHRpb25TaW1wbGUoInVucHJlcGFyZWQiLCAiIiwgbnVsbCwgImZvcmNlIHVzZSBvZiB1bnByZXBhcmVkIHN0YXRlbWVudHMiLCBmYWxzZSk7CiAgICAgICAgIGZpbmFsIE9wdGlvblNpbXBsZSB1c2VDb21wcmVzc2lvbiA9IG5ldyBPcHRpb25TaW1wbGUoImNvbXByZXNzaW9uPSIsICJub25lfGx6NHxzbmFwcHkiLCAibm9uZSIsICIiLCBmYWxzZSk7CiAgICAgICAgIGZpbmFsIE9wdGlvblNpbXBsZSBwb3J0ID0gbmV3IE9wdGlvblNpbXBsZSgicG9ydD0iLCAiWzAtOV0rIiwgIjkwNDYiLCAiIiwgZmFsc2UpOwotICAgICAgICBmaW5hbCBPcHRpb25TaW1wbGUgdXNlciA9IG5ldyBPcHRpb25TaW1wbGUoInVzZXI9IiwgIi4rIiwgbnVsbCwgInVzZXJuYW1lIiwgZmFsc2UpOwotICAgICAgICBmaW5hbCBPcHRpb25TaW1wbGUgcGFzc3dvcmQgPSBuZXcgT3B0aW9uU2ltcGxlKCJwYXNzd29yZD0iLCAiLisiLCBudWxsLCAicGFzc3dvcmQiLCBmYWxzZSk7CisgICAgICAgIGZpbmFsIE9wdGlvblNpbXBsZSB1c2VyID0gbmV3IE9wdGlvblNpbXBsZSgidXNlcj0iLCAiLisiLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJDUUwgdXNlciwgd2hlbiBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIHZhbHVlIGluIGNyZWRlbnRpYWxzIGZpbGUgZm9yIGtleSAnJXMnIiwgQ1FMX1VTRVJOQU1FX1BST1BFUlRZX0tFWSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgIGZpbmFsIE9wdGlvblNpbXBsZSBwYXNzd29yZCA9IG5ldyBPcHRpb25TaW1wbGUoInBhc3N3b3JkPSIsICIuKyIsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJDUUwgcGFzc3dvcmQsIHdoZW4gc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlIHRoZSB2YWx1ZSBpbiBjcmVkZW50aWFscyBmaWxlIGZvciBrZXkgJyVzJyIsIENRTF9QQVNTV09SRF9QUk9QRVJUWV9LRVkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKICAgICAgICAgZmluYWwgT3B0aW9uU2ltcGxlIGF1dGhQcm92aWRlciA9IG5ldyBPcHRpb25TaW1wbGUoImF1dGgtcHJvdmlkZXI9IiwgIi4qIiwgbnVsbCwgIkZ1bGx5IHF1YWxpZmllZCBpbXBsZW1lbnRhdGlvbiBvZiBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQXV0aFByb3ZpZGVyIiwgZmFsc2UpOwogICAgICAgICBmaW5hbCBPcHRpb25TaW1wbGUgbWF4UGVuZGluZ1BlckNvbm5lY3Rpb24gPSBuZXcgT3B0aW9uU2ltcGxlKCJtYXhQZW5kaW5nPSIsICJbMC05XSsiLCAiMTI4IiwgIk1heGltdW0gcGVuZGluZyByZXF1ZXN0cyBwZXIgY29ubmVjdGlvbiIsIGZhbHNlKTsKICAgICAgICAgZmluYWwgT3B0aW9uU2ltcGxlIGNvbm5lY3Rpb25zUGVySG9zdCA9IG5ldyBPcHRpb25TaW1wbGUoImNvbm5lY3Rpb25zUGVySG9zdD0iLCAiWzAtOV0rIiwgIjgiLCAiTnVtYmVyIG9mIGNvbm5lY3Rpb25zIHBlciBob3N0IiwgZmFsc2UpOwpAQCAtMTc5LDExICsxODcsOSBAQAogICAgICAgICBvdXQucHJpbnRmKCIgIE1heCBQZW5kaW5nIFBlciBDb25uZWN0aW9uOiAlZCVuIiwgbWF4UGVuZGluZ1BlckNvbm5lY3Rpb24pOwogICAgICAgICBvdXQucHJpbnRmKCIgIENvbm5lY3Rpb25zIFBlciBIb3N0OiAlZCVuIiwgY29ubmVjdGlvbnNQZXJIb3N0KTsKICAgICAgICAgb3V0LnByaW50ZigiICBDb21wcmVzc2lvbjogJXMlbiIsIGNvbXByZXNzaW9uKTsKLQogICAgIH0KIAotCi0gICAgcHVibGljIHN0YXRpYyBTZXR0aW5nc01vZGUgZ2V0KE1hcDxTdHJpbmcsIFN0cmluZ1tdPiBjbEFyZ3MpCisgICAgcHVibGljIHN0YXRpYyBTZXR0aW5nc01vZGUgZ2V0KE1hcDxTdHJpbmcsIFN0cmluZ1tdPiBjbEFyZ3MsIFNldHRpbmdzQ3JlZGVudGlhbHMgY3JlZGVudGlhbHMpCiAgICAgewogICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSBjbEFyZ3MucmVtb3ZlKCItbW9kZSIpOwogICAgICAgICBpZiAocGFyYW1zID09IG51bGwpCkBAIC0xOTIsNyArMTk4LDcgQEAKICAgICAgICAgICAgIG9wdHMuYWNjZXB0KCJjcWwzIik7CiAgICAgICAgICAgICBvcHRzLmFjY2VwdCgibmF0aXZlIik7CiAgICAgICAgICAgICBvcHRzLmFjY2VwdCgicHJlcGFyZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2V0dGluZ3NNb2RlKG9wdHMpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXR0aW5nc01vZGUob3B0cywgY3JlZGVudGlhbHMpOwogICAgICAgICB9CiAKICAgICAgICAgR3JvdXBlZE9wdGlvbnMgb3B0aW9ucyA9IEdyb3VwZWRPcHRpb25zLnNlbGVjdChwYXJhbXMsIG5ldyBDcWwzTmF0aXZlT3B0aW9ucygpLCBuZXcgQ3FsM1NpbXBsZU5hdGl2ZU9wdGlvbnMoKSk7CkBAIC0yMDIsNyArMjA4LDcgQEAKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZCAtbW9kZSBvcHRpb25zIHByb3ZpZGVkLCBzZWUgb3V0cHV0IGZvciB2YWxpZCBvcHRpb25zIik7CiAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFNldHRpbmdzTW9kZShvcHRpb25zKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTZXR0aW5nc01vZGUob3B0aW9ucywgY3JlZGVudGlhbHMpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludEhlbHAoKQpkaWZmIC0tZ2l0IGEvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3Mvc2V0dGluZ3MvU2V0dGluZ3NSZXBvcnRpbmcuamF2YSBiL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3NldHRpbmdzL1NldHRpbmdzUmVwb3J0aW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhMjE1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3NldHRpbmdzL1NldHRpbmdzUmVwb3J0aW5nLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZXNzLnNldHRpbmdzOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkR1cmF0aW9uU3BlYzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3MudXRpbC5SZXN1bHRMb2dnZXI7CisKK3B1YmxpYyBjbGFzcyBTZXR0aW5nc1JlcG9ydGluZyBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQoreworICAgIHB1YmxpYyBmaW5hbCBpbnQgb3V0cHV0RnJlcXVlbmN5OworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG91dHB1dEZyZXF1ZW5jeVN0cmluZzsKKyAgICBwdWJsaWMgZmluYWwgaW50IGhlYWRlckZyZXF1ZW5jeTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBoZWFkZXJGcmVxdWVuY3lTdHJpbmc7CisKKyAgICBwdWJsaWMgU2V0dGluZ3NSZXBvcnRpbmcoU2V0dGluZ3NSZXBvcnRpbmcuT3B0aW9ucyByZXBvcnRpbmcpCisgICAgeworICAgICAgICBpZiAocmVwb3J0aW5nLmhlYWRlckZyZXF1ZW5jeS5wcmVzZW50KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhlYWRlckZyZXF1ZW5jeVN0cmluZyA9IHJlcG9ydGluZy5oZWFkZXJGcmVxdWVuY3kudmFsdWUoKTsKKyAgICAgICAgICAgIGhlYWRlckZyZXF1ZW5jeSA9IG5ldyBEdXJhdGlvblNwZWMuSW50U2Vjb25kc0JvdW5kKGhlYWRlckZyZXF1ZW5jeVN0cmluZykudG9TZWNvbmRzKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBoZWFkZXJGcmVxdWVuY3kgPSAwOworICAgICAgICAgICAgaGVhZGVyRnJlcXVlbmN5U3RyaW5nID0gIipub3Qgc2V0KiI7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVwb3J0aW5nLm91dHB1dEZyZXF1ZW5jeS5wcmVzZW50KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dEZyZXF1ZW5jeVN0cmluZyA9IHJlcG9ydGluZy5vdXRwdXRGcmVxdWVuY3kudmFsdWUoKTsKKyAgICAgICAgICAgIG91dHB1dEZyZXF1ZW5jeSA9IG5ldyBEdXJhdGlvblNwZWMuSW50U2Vjb25kc0JvdW5kKG91dHB1dEZyZXF1ZW5jeVN0cmluZykudG9TZWNvbmRzKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXRwdXRGcmVxdWVuY3kgPSAwOworICAgICAgICAgICAgb3V0cHV0RnJlcXVlbmN5U3RyaW5nID0gIipub3Qgc2V0KiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBPcHRpb24gRGVjbGFyYXRpb25zCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE9wdGlvbnMgZXh0ZW5kcyBHcm91cGVkT3B0aW9ucworICAgIHsKKyAgICAgICAgZmluYWwgT3B0aW9uU2ltcGxlIG91dHB1dEZyZXF1ZW5jeSA9IG5ldyBPcHRpb25TaW1wbGUoIm91dHB1dC1mcmVxdWVuY3k9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4qIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjFzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZyZXF1ZW5jeSBlYWNoIGxpbmUgb2Ygb3V0cHV0IHdpbGwgYmUgcHJpbnRlZCBvdXQgd2hlbiBydW5uaW5nIGEgc3RyZXNzIHRlc3QsIGRlZmF1bHRzIHRvICcxcycuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworCisgICAgICAgIGZpbmFsIE9wdGlvblNpbXBsZSBoZWFkZXJGcmVxdWVuY3kgPSBuZXcgT3B0aW9uU2ltcGxlKCJoZWFkZXItZnJlcXVlbmN5PSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGcmVxdWVuY3kgdGhlIGhlYWRlciBmb3IgdGhlIHN0YXRpc3RpY3Mgd2lsbCBiZSBwcmludGVkIG91dC4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJZiBub3Qgc3BlY2lmaWVkLCB0aGUgaGVhZGVyIHdpbGwgYmUgcHJpbnRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXN0IG9ubHkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDw/IGV4dGVuZHMgT3B0aW9uPiBvcHRpb25zKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3Qob3V0cHV0RnJlcXVlbmN5LCBoZWFkZXJGcmVxdWVuY3kpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTZXR0aW5nc1JlcG9ydGluZyBnZXQoTWFwPFN0cmluZywgU3RyaW5nW10+IGNsQXJncykKKyAgICB7CisgICAgICAgIFN0cmluZ1tdIHBhcmFtcyA9IGNsQXJncy5yZW1vdmUoIi1yZXBvcnRpbmciKTsKKyAgICAgICAgaWYgKHBhcmFtcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXR0aW5nc1JlcG9ydGluZyhuZXcgU2V0dGluZ3NSZXBvcnRpbmcuT3B0aW9ucygpKTsKKworICAgICAgICBHcm91cGVkT3B0aW9ucyBvcHRpb25zID0gR3JvdXBlZE9wdGlvbnMuc2VsZWN0KHBhcmFtcywgbmV3IFNldHRpbmdzUmVwb3J0aW5nLk9wdGlvbnMoKSk7CisgICAgICAgIGlmIChvcHRpb25zID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50SGVscCgpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbnZhbGlkIC1yZXBvcnRpbmcgb3B0aW9ucyBwcm92aWRlZCwgc2VlIG91dHB1dCBmb3IgdmFsaWQgb3B0aW9ucyIpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBTZXR0aW5nc1JlcG9ydGluZygoU2V0dGluZ3NSZXBvcnRpbmcuT3B0aW9ucykgb3B0aW9ucyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRTZXR0aW5ncyhSZXN1bHRMb2dnZXIgb3V0KQorICAgIHsKKyAgICAgICAgb3V0LnByaW50ZigiICBPdXRwdXQgZnJlcXVlbmN5OiAlcyVuIiwgb3V0cHV0RnJlcXVlbmN5U3RyaW5nKTsKKyAgICAgICAgb3V0LnByaW50ZigiICBIZWFkZXIgZnJlcXVlbmN5OiAlcyVuIiwgaGVhZGVyRnJlcXVlbmN5U3RyaW5nKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRIZWxwKCkKKyAgICB7CisgICAgICAgIEdyb3VwZWRPcHRpb25zLnByaW50T3B0aW9ucyhTeXN0ZW0ub3V0LCAiLXJlcG9ydGluZyIsIG5ldyBTZXR0aW5nc1JlcG9ydGluZy5PcHRpb25zKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUnVubmFibGUgaGVscFByaW50ZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFNldHRpbmdzUmVwb3J0aW5nOjpwcmludEhlbHA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3Mvc2V0dGluZ3MvU2V0dGluZ3NUcmFuc3BvcnQuamF2YSBiL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3NldHRpbmdzL1NldHRpbmdzVHJhbnNwb3J0LmphdmEKaW5kZXggNWYyMmE3Yi4uY2Y2Mjk5OSAxMDA2NDQKLS0tIGEvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3Mvc2V0dGluZ3MvU2V0dGluZ3NUcmFuc3BvcnQuamF2YQorKysgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9TZXR0aW5nc1RyYW5zcG9ydC5qYXZhCkBAIC0yOSwxMyArMjksMTkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRW5jcnlwdGlvbk9wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZXNzLnV0aWwuUmVzdWx0TG9nZ2VyOwogCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3Muc2V0dGluZ3MuU2V0dGluZ3NDcmVkZW50aWFscy5UUkFOU1BPUlRfS0VZU1RPUkVfUEFTU1dPUkRfUFJPUEVSVFlfS0VZOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3Muc2V0dGluZ3MuU2V0dGluZ3NDcmVkZW50aWFscy5UUkFOU1BPUlRfVFJVU1RTVE9SRV9QQVNTV09SRF9QUk9QRVJUWV9LRVk7CisKIHB1YmxpYyBjbGFzcyBTZXR0aW5nc1RyYW5zcG9ydCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQogewogICAgIHByaXZhdGUgZmluYWwgVE9wdGlvbnMgb3B0aW9uczsKKyAgICBwcml2YXRlIGZpbmFsIFNldHRpbmdzQ3JlZGVudGlhbHMgY3JlZGVudGlhbHM7CiAKLSAgICBwdWJsaWMgU2V0dGluZ3NUcmFuc3BvcnQoVE9wdGlvbnMgb3B0aW9ucykKKyAgICBwdWJsaWMgU2V0dGluZ3NUcmFuc3BvcnQoVE9wdGlvbnMgb3B0aW9ucywgU2V0dGluZ3NDcmVkZW50aWFscyBjcmVkZW50aWFscykKICAgICB7CiAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgICAgIHRoaXMuY3JlZGVudGlhbHMgPSBjcmVkZW50aWFsczsKICAgICB9CiAKICAgICBwdWJsaWMgRW5jcnlwdGlvbk9wdGlvbnMgZ2V0RW5jcnlwdGlvbk9wdGlvbnMoKQpAQCAtNDYsNyArNTIsNyBAQAogICAgICAgICAgICAgZW5jT3B0aW9ucyA9IGVuY09wdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEVuYWJsZWQodHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFRydXN0U3RvcmUob3B0aW9ucy50cnVzdFN0b3JlLnZhbHVlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhUcnVzdFN0b3JlUGFzc3dvcmQob3B0aW9ucy50cnVzdFN0b3JlUHcudmFsdWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFRydXN0U3RvcmVQYXNzd29yZChvcHRpb25zLnRydXN0U3RvcmVQdy5zZXRCeVVzZXIoKSA/IG9wdGlvbnMudHJ1c3RTdG9yZVB3LnZhbHVlKCkgOiBjcmVkZW50aWFscy50cmFuc3BvcnRUcnVzdHN0b3JlUGFzc3dvcmQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhBbGdvcml0aG0ob3B0aW9ucy5hbGcudmFsdWUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFByb3RvY29sKG9wdGlvbnMucHJvdG9jb2wudmFsdWUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENpcGhlclN1aXRlcyhvcHRpb25zLmNpcGhlcnMudmFsdWUoKS5zcGxpdCgiLCIpKTsKQEAgLTU0LDE0ICs2MCwxNCBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGVuY09wdGlvbnMgPSBlbmNPcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoS2V5U3RvcmUob3B0aW9ucy5rZXlTdG9yZS52YWx1ZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEtleVN0b3JlUGFzc3dvcmQob3B0aW9ucy5rZXlTdG9yZVB3LnZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEtleVN0b3JlUGFzc3dvcmQob3B0aW9ucy5rZXlTdG9yZVB3LnNldEJ5VXNlcigpID8gb3B0aW9ucy5rZXlTdG9yZVB3LnZhbHVlKCkgOiBjcmVkZW50aWFscy50cmFuc3BvcnRLZXlzdG9yZVBhc3N3b3JkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBtYW5kYXRvcnkgZm9yIFNTTEZhY3RvcnkuY3JlYXRlU1NMQ29udGV4dCgpLCBzZWUgQ0FTU0FORFJBLTkzMjUKICAgICAgICAgICAgICAgICBlbmNPcHRpb25zID0gZW5jT3B0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEtleVN0b3JlKGVuY09wdGlvbnMudHJ1c3RzdG9yZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhLZXlTdG9yZVBhc3N3b3JkKGVuY09wdGlvbnMudHJ1c3RzdG9yZV9wYXNzd29yZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoS2V5U3RvcmVQYXNzd29yZChlbmNPcHRpb25zLnRydXN0c3RvcmVfcGFzc3dvcmQgIT0gbnVsbCA/IGVuY09wdGlvbnMudHJ1c3RzdG9yZV9wYXNzd29yZCA6IGNyZWRlbnRpYWxzLnRyYW5zcG9ydFRydXN0c3RvcmVQYXNzd29yZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGVuY09wdGlvbnM7CkBAIC03MiwxMiArNzgsMTggQEAKICAgICBzdGF0aWMgY2xhc3MgVE9wdGlvbnMgZXh0ZW5kcyBHcm91cGVkT3B0aW9ucyBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQogICAgIHsKICAgICAgICAgZmluYWwgT3B0aW9uU2ltcGxlIHRydXN0U3RvcmUgPSBuZXcgT3B0aW9uU2ltcGxlKCJ0cnVzdHN0b3JlPSIsICIuKiIsIG51bGwsICJTU0w6IGZ1bGwgcGF0aCB0byB0cnVzdHN0b3JlIiwgZmFsc2UpOwotICAgICAgICBmaW5hbCBPcHRpb25TaW1wbGUgdHJ1c3RTdG9yZVB3ID0gbmV3IE9wdGlvblNpbXBsZSgidHJ1c3RzdG9yZS1wYXNzd29yZD0iLCAiLioiLCBudWxsLCAiU1NMOiB0cnVzdHN0b3JlIHBhc3N3b3JkIiwgZmFsc2UpOworICAgICAgICBmaW5hbCBPcHRpb25TaW1wbGUgdHJ1c3RTdG9yZVB3ID0gbmV3IE9wdGlvblNpbXBsZSgidHJ1c3RzdG9yZS1wYXNzd29yZD0iLCAiLioiLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIlNTTDogdHJ1c3RzdG9yZSBwYXNzd29yZCwgd2hlbiBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIHZhbHVlIGluIGNyZWRlbnRpYWxzIGZpbGUgb2Yga2V5ICclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1JUX1RSVVNUU1RPUkVfUEFTU1dPUkRfUFJPUEVSVFlfS0VZKSwgZmFsc2UpOwogICAgICAgICBmaW5hbCBPcHRpb25TaW1wbGUga2V5U3RvcmUgPSBuZXcgT3B0aW9uU2ltcGxlKCJrZXlzdG9yZT0iLCAiLioiLCBudWxsLCAiU1NMOiBmdWxsIHBhdGggdG8ga2V5c3RvcmUiLCBmYWxzZSk7Ci0gICAgICAgIGZpbmFsIE9wdGlvblNpbXBsZSBrZXlTdG9yZVB3ID0gbmV3IE9wdGlvblNpbXBsZSgia2V5c3RvcmUtcGFzc3dvcmQ9IiwgIi4qIiwgbnVsbCwgIlNTTDoga2V5c3RvcmUgcGFzc3dvcmQiLCBmYWxzZSk7CisgICAgICAgIGZpbmFsIE9wdGlvblNpbXBsZSBrZXlTdG9yZVB3ID0gbmV3IE9wdGlvblNpbXBsZSgia2V5c3RvcmUtcGFzc3dvcmQ9IiwgIi4qIiwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiU1NMOiBrZXlzdG9yZSBwYXNzd29yZCwgd2hlbiBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIHZhbHVlIGluIGNyZWRlbnRpYWxzIGZpbGUgZm9yIGtleSAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPUlRfS0VZU1RPUkVfUEFTU1dPUkRfUFJPUEVSVFlfS0VZKSwgZmFsc2UpOwogICAgICAgICBmaW5hbCBPcHRpb25TaW1wbGUgcHJvdG9jb2wgPSBuZXcgT3B0aW9uU2ltcGxlKCJzc2wtcHJvdG9jb2w9IiwgIi4qIiwgIlRMUyIsICJTU0w6IGNvbm5lY3Rpb24gcHJvdG9jb2wgdG8gdXNlIiwgZmFsc2UpOwogICAgICAgICBmaW5hbCBPcHRpb25TaW1wbGUgYWxnID0gbmV3IE9wdGlvblNpbXBsZSgic3NsLWFsZz0iLCAiLioiLCBudWxsLCAiU1NMOiBhbGdvcml0aG0iLCBmYWxzZSk7Ci0gICAgICAgIGZpbmFsIE9wdGlvblNpbXBsZSBjaXBoZXJzID0gbmV3IE9wdGlvblNpbXBsZSgic3NsLWNpcGhlcnM9IiwgIi4qIiwgIlRMU19SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEsVExTX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSIsICJTU0w6IGNvbW1hIGRlbGltaXRlZCBsaXN0IG9mIGVuY3J5cHRpb24gc3VpdGVzIHRvIHVzZSIsIGZhbHNlKTsKKyAgICAgICAgZmluYWwgT3B0aW9uU2ltcGxlIGNpcGhlcnMgPSBuZXcgT3B0aW9uU2ltcGxlKCJzc2wtY2lwaGVycz0iLCAiLioiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRMU19SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEsVExTX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1NMOiBjb21tYSBkZWxpbWl0ZWQgbGlzdCBvZiBlbmNyeXB0aW9uIHN1aXRlcyB0byB1c2UiLCBmYWxzZSk7CiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBMaXN0PD8gZXh0ZW5kcyBPcHRpb24+IG9wdGlvbnMoKQpAQCAtODksMTQgKzEwMSwyNiBAQAogICAgIC8vIENMSSBVdGlsaXR5IE1ldGhvZHMKICAgICBwdWJsaWMgdm9pZCBwcmludFNldHRpbmdzKFJlc3VsdExvZ2dlciBvdXQpCiAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiICAiICsgb3B0aW9ucy5nZXRPcHRpb25Bc1N0cmluZygpKTsKKyAgICAgICAgU3RyaW5nIHRQYXNzd29yZCA9IG9wdGlvbnMudHJ1c3RTdG9yZVB3LnNldEJ5VXNlcigpID8gb3B0aW9ucy50cnVzdFN0b3JlUHcudmFsdWUoKSA6IGNyZWRlbnRpYWxzLnRyYW5zcG9ydFRydXN0c3RvcmVQYXNzd29yZDsKKyAgICAgICAgdFBhc3N3b3JkID0gdFBhc3N3b3JkICE9IG51bGwgPyAiKnN1cHByZXNzZWQqIiA6IHRQYXNzd29yZDsKKworICAgICAgICBTdHJpbmcga1Bhc3N3b3JkID0gb3B0aW9ucy5rZXlTdG9yZVB3LnNldEJ5VXNlcigpID8gb3B0aW9ucy5rZXlTdG9yZS52YWx1ZSgpIDogY3JlZGVudGlhbHMudHJhbnNwb3J0S2V5c3RvcmVQYXNzd29yZDsKKyAgICAgICAga1Bhc3N3b3JkID0ga1Bhc3N3b3JkICE9IG51bGwgPyAiKnN1cHByZXNzZWQqIiA6IGtQYXNzd29yZDsKKworICAgICAgICBvdXQucHJpbnRmKCIgIFRydXN0c3RvcmU6ICVzJW4iLCBvcHRpb25zLnRydXN0U3RvcmUudmFsdWUoKSk7CisgICAgICAgIG91dC5wcmludGYoIiAgVHJ1c3RzdG9yZSBQYXNzd29yZDogJXMlbiIsIHRQYXNzd29yZCk7CisgICAgICAgIG91dC5wcmludGYoIiAgS2V5c3RvcmU6ICVzJW4iLCBvcHRpb25zLmtleVN0b3JlLnZhbHVlKCkpOworICAgICAgICBvdXQucHJpbnRmKCIgIEtleXN0b3JlIFBhc3N3b3JkOiAlcyVuIiwga1Bhc3N3b3JkKTsKKyAgICAgICAgb3V0LnByaW50ZigiICBTU0wgUHJvdG9jb2w6ICVzJW4iLCBvcHRpb25zLnByb3RvY29sLnZhbHVlKCkpOworICAgICAgICBvdXQucHJpbnRmKCIgIFNTTCBBbGdvcml0aG06ICVzJW4iLCBvcHRpb25zLmFsZy52YWx1ZSgpKTsKKyAgICAgICAgb3V0LnByaW50ZigiICBTU0wgQ2lwaGVyczogJXMlbiIsIG9wdGlvbnMuY2lwaGVycy52YWx1ZSgpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIFNldHRpbmdzVHJhbnNwb3J0IGdldChNYXA8U3RyaW5nLCBTdHJpbmdbXT4gY2xBcmdzKQorICAgIHB1YmxpYyBzdGF0aWMgU2V0dGluZ3NUcmFuc3BvcnQgZ2V0KE1hcDxTdHJpbmcsIFN0cmluZ1tdPiBjbEFyZ3MsIFNldHRpbmdzQ3JlZGVudGlhbHMgY3JlZGVudGlhbHMpCiAgICAgewogICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSBjbEFyZ3MucmVtb3ZlKCItdHJhbnNwb3J0Iik7CiAgICAgICAgIGlmIChwYXJhbXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2V0dGluZ3NUcmFuc3BvcnQobmV3IFRPcHRpb25zKCkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXR0aW5nc1RyYW5zcG9ydChuZXcgVE9wdGlvbnMoKSwgY3JlZGVudGlhbHMpOwogCiAgICAgICAgIEdyb3VwZWRPcHRpb25zIG9wdGlvbnMgPSBHcm91cGVkT3B0aW9ucy5zZWxlY3QocGFyYW1zLCBuZXcgVE9wdGlvbnMoKSk7CiAgICAgICAgIGlmIChvcHRpb25zID09IG51bGwpCkBAIC0xMDUsNyArMTI5LDcgQEAKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZCAtdHJhbnNwb3J0IG9wdGlvbnMgcHJvdmlkZWQsIHNlZSBvdXRwdXQgZm9yIHZhbGlkIG9wdGlvbnMiKTsKICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgU2V0dGluZ3NUcmFuc3BvcnQoKFRPcHRpb25zKSBvcHRpb25zKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTZXR0aW5nc1RyYW5zcG9ydCgoVE9wdGlvbnMpIG9wdGlvbnMsIGNyZWRlbnRpYWxzKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRIZWxwKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3NldHRpbmdzL1N0cmVzc1NldHRpbmdzLmphdmEgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9TdHJlc3NTZXR0aW5ncy5qYXZhCmluZGV4IDJmNzZkZmIuLjEyZDczMWUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3NldHRpbmdzL1N0cmVzc1NldHRpbmdzLmphdmEKKysrIGIvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3Mvc2V0dGluZ3MvU3RyZXNzU2V0dGluZ3MuamF2YQpAQCAtMzgsMTMgKzM4LDE2IEBACiAgICAgcHVibGljIGZpbmFsIFNldHRpbmdzQ29sdW1uIGNvbHVtbnM7CiAgICAgcHVibGljIGZpbmFsIFNldHRpbmdzRXJyb3JzIGVycm9yczsKICAgICBwdWJsaWMgZmluYWwgU2V0dGluZ3NMb2cgbG9nOworICAgIHB1YmxpYyBmaW5hbCBTZXR0aW5nc0NyZWRlbnRpYWxzIGNyZWRlbnRpYWxzOwogICAgIHB1YmxpYyBmaW5hbCBTZXR0aW5nc01vZGUgbW9kZTsKICAgICBwdWJsaWMgZmluYWwgU2V0dGluZ3NOb2RlIG5vZGU7CiAgICAgcHVibGljIGZpbmFsIFNldHRpbmdzU2NoZW1hIHNjaGVtYTsKICAgICBwdWJsaWMgZmluYWwgU2V0dGluZ3NUcmFuc3BvcnQgdHJhbnNwb3J0OwogICAgIHB1YmxpYyBmaW5hbCBTZXR0aW5nc1BvcnQgcG9ydDsKKyAgICBwdWJsaWMgZmluYWwgU2V0dGluZ3NKTVggam14OwogICAgIHB1YmxpYyBmaW5hbCBTZXR0aW5nc0dyYXBoIGdyYXBoOwogICAgIHB1YmxpYyBmaW5hbCBTZXR0aW5nc1Rva2VuUmFuZ2UgdG9rZW5SYW5nZTsKKyAgICBwdWJsaWMgZmluYWwgU2V0dGluZ3NSZXBvcnRpbmcgcmVwb3J0aW5nOwogCiAgICAgcHVibGljIFN0cmVzc1NldHRpbmdzKFNldHRpbmdzQ29tbWFuZCBjb21tYW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc1JhdGUgcmF0ZSwKQEAgLTUzLDEzICs1NiwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc0NvbHVtbiBjb2x1bW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc0Vycm9ycyBlcnJvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzTG9nIGxvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3NDcmVkZW50aWFscyBjcmVkZW50aWFscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3NNb2RlIG1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzTm9kZSBub2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc1NjaGVtYSBzY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzVHJhbnNwb3J0IHRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3NQb3J0IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzSk1YIGpteCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3NHcmFwaCBncmFwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3NUb2tlblJhbmdlIHRva2VuUmFuZ2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzVG9rZW5SYW5nZSB0b2tlblJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc1JlcG9ydGluZyByZXBvcnRpbmcpCiAgICAgewogICAgICAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kOwogICAgICAgICB0aGlzLnJhdGUgPSByYXRlOwpAQCAtNjgsMTMgKzc0LDE2IEBACiAgICAgICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7CiAgICAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzOwogICAgICAgICB0aGlzLmxvZyA9IGxvZzsKKyAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGNyZWRlbnRpYWxzOwogICAgICAgICB0aGlzLm1vZGUgPSBtb2RlOwogICAgICAgICB0aGlzLm5vZGUgPSBub2RlOwogICAgICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKICAgICAgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CiAgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgICAgIHRoaXMuam14ID0gam14OwogICAgICAgICB0aGlzLmdyYXBoID0gZ3JhcGg7CiAgICAgICAgIHRoaXMudG9rZW5SYW5nZSA9IHRva2VuUmFuZ2U7CisgICAgICAgIHRoaXMucmVwb3J0aW5nID0gcmVwb3J0aW5nOwogICAgIH0KIAogICAgIHB1YmxpYyBTaW1wbGVDbGllbnQgZ2V0U2ltcGxlTmF0aXZlQ2xpZW50KCkKQEAgLTE5NCwxMSArMjAzLDE0IEBACiAgICAgICAgIFNldHRpbmdzQ29sdW1uIGNvbHVtbnMgPSBTZXR0aW5nc0NvbHVtbi5nZXQoY2xBcmdzKTsKICAgICAgICAgU2V0dGluZ3NFcnJvcnMgZXJyb3JzID0gU2V0dGluZ3NFcnJvcnMuZ2V0KGNsQXJncyk7CiAgICAgICAgIFNldHRpbmdzTG9nIGxvZyA9IFNldHRpbmdzTG9nLmdldChjbEFyZ3MpOwotICAgICAgICBTZXR0aW5nc01vZGUgbW9kZSA9IFNldHRpbmdzTW9kZS5nZXQoY2xBcmdzKTsKKyAgICAgICAgU2V0dGluZ3NDcmVkZW50aWFscyBjcmVkZW50aWFscyA9IFNldHRpbmdzQ3JlZGVudGlhbHMuZ2V0KGNsQXJncyk7CisgICAgICAgIFNldHRpbmdzTW9kZSBtb2RlID0gU2V0dGluZ3NNb2RlLmdldChjbEFyZ3MsIGNyZWRlbnRpYWxzKTsKICAgICAgICAgU2V0dGluZ3NOb2RlIG5vZGUgPSBTZXR0aW5nc05vZGUuZ2V0KGNsQXJncyk7CiAgICAgICAgIFNldHRpbmdzU2NoZW1hIHNjaGVtYSA9IFNldHRpbmdzU2NoZW1hLmdldChjbEFyZ3MsIGNvbW1hbmQpOwotICAgICAgICBTZXR0aW5nc1RyYW5zcG9ydCB0cmFuc3BvcnQgPSBTZXR0aW5nc1RyYW5zcG9ydC5nZXQoY2xBcmdzKTsKKyAgICAgICAgU2V0dGluZ3NUcmFuc3BvcnQgdHJhbnNwb3J0ID0gU2V0dGluZ3NUcmFuc3BvcnQuZ2V0KGNsQXJncywgY3JlZGVudGlhbHMpOworICAgICAgICBTZXR0aW5nc0pNWCBqbXggPSBTZXR0aW5nc0pNWC5nZXQoY2xBcmdzLCBjcmVkZW50aWFscyk7CiAgICAgICAgIFNldHRpbmdzR3JhcGggZ3JhcGggPSBTZXR0aW5nc0dyYXBoLmdldChjbEFyZ3MsIGNvbW1hbmQpOworICAgICAgICBTZXR0aW5nc1JlcG9ydGluZyByZXBvcnRpbmcgPSBTZXR0aW5nc1JlcG9ydGluZy5nZXQoY2xBcmdzKTsKICAgICAgICAgaWYgKCFjbEFyZ3MuaXNFbXB0eSgpKQogICAgICAgICB7CiAgICAgICAgICAgICBwcmludEhlbHAoKTsKQEAgLTIxNiw3ICsyMjgsNyBAQAogICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gbmV3IFN0cmVzc1NldHRpbmdzKGNvbW1hbmQsIHJhdGUsIGdlbmVyYXRlLCBpbnNlcnQsIGNvbHVtbnMsIGVycm9ycywgbG9nLCBtb2RlLCBub2RlLCBzY2hlbWEsIHRyYW5zcG9ydCwgcG9ydCwgZ3JhcGgsIHRva2VuUmFuZ2UpOworICAgICAgICByZXR1cm4gbmV3IFN0cmVzc1NldHRpbmdzKGNvbW1hbmQsIHJhdGUsIGdlbmVyYXRlLCBpbnNlcnQsIGNvbHVtbnMsIGVycm9ycywgbG9nLCBjcmVkZW50aWFscywgbW9kZSwgbm9kZSwgc2NoZW1hLCB0cmFuc3BvcnQsIHBvcnQsIGpteCwgZ3JhcGgsIHRva2VuUmFuZ2UsIHJlcG9ydGluZyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nW10+IHBhcnNlTWFwKFN0cmluZ1tdIGFyZ3MpCkBAIC0yOTAsMTAgKzMwMiwxNiBAQAogICAgICAgICB0cmFuc3BvcnQucHJpbnRTZXR0aW5ncyhvdXQpOwogICAgICAgICBvdXQucHJpbnRsbigiUG9ydDoiKTsKICAgICAgICAgcG9ydC5wcmludFNldHRpbmdzKG91dCk7CisgICAgICAgIG91dC5wcmludGxuKCJKTVg6Iik7CisgICAgICAgIGpteC5wcmludFNldHRpbmdzKG91dCk7CiAgICAgICAgIG91dC5wcmludGxuKCJHcmFwaDoiKTsKICAgICAgICAgZ3JhcGgucHJpbnRTZXR0aW5ncyhvdXQpOwogICAgICAgICBvdXQucHJpbnRsbigiVG9rZW5SYW5nZToiKTsKICAgICAgICAgdG9rZW5SYW5nZS5wcmludFNldHRpbmdzKG91dCk7CisgICAgICAgIG91dC5wcmludGxuKCJDcmVkZW50aWFscyBmaWxlOiIpOworICAgICAgICBjcmVkZW50aWFscy5wcmludFNldHRpbmdzKG91dCk7CisgICAgICAgIG91dC5wcmludGxuKCJSZXBvcnRpbmc6Iik7CisgICAgICAgIHJlcG9ydGluZy5wcmludFNldHRpbmdzKG91dCk7CiAKICAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PSBDb21tYW5kLlVTRVIpCiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3V0aWwvSm14Q29sbGVjdG9yLmphdmEgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy91dGlsL0pteENvbGxlY3Rvci5qYXZhCmluZGV4IDhjZmJlYmIuLjI0Y2I0YzcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3V0aWwvSm14Q29sbGVjdG9yLmphdmEKKysrIGIvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3MvdXRpbC9KbXhDb2xsZWN0b3IuamF2YQpAQCAtMjgsNiArMjgsNyBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuTmFtZWRUaHJlYWRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVzcy5zZXR0aW5ncy5TZXR0aW5nc0pNWDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ob2RlUHJvYmU7CiAKIHB1YmxpYyBjbGFzcyBKbXhDb2xsZWN0b3IgaW1wbGVtZW50cyBDYWxsYWJsZTxKbXhDb2xsZWN0b3IuR2NTdGF0cz4KQEAgLTc2LDIzICs3NywyNiBAQAogICAgIGZpbmFsIE5vZGVQcm9iZVtdIHByb2JlczsKIAogICAgIC8vIFRPRE86IHNob3VsZCBleHBhbmQgdG8gd2hvbGUgY2x1c3RlcgotICAgIHB1YmxpYyBKbXhDb2xsZWN0b3IoQ29sbGVjdGlvbjxTdHJpbmc+IGhvc3RzLCBpbnQgcG9ydCkKKyAgICBwdWJsaWMgSm14Q29sbGVjdG9yKENvbGxlY3Rpb248U3RyaW5nPiBob3N0cywgaW50IHBvcnQsIFNldHRpbmdzSk1YIGpteCkKICAgICB7CiAgICAgICAgIHByb2JlcyA9IG5ldyBOb2RlUHJvYmVbaG9zdHMuc2l6ZSgpXTsKICAgICAgICAgaW50IGkgPSAwOwogICAgICAgICBmb3IgKFN0cmluZyBob3N0IDogaG9zdHMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHByb2Jlc1tpXSA9IGNvbm5lY3QoaG9zdCwgcG9ydCk7CisgICAgICAgICAgICBwcm9iZXNbaV0gPSBjb25uZWN0KGhvc3QsIHBvcnQsIGpteCk7CiAgICAgICAgICAgICBwcm9iZXNbaV0uZ2V0QW5kUmVzZXRHQ1N0YXRzKCk7CiAgICAgICAgICAgICBpKys7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBOb2RlUHJvYmUgY29ubmVjdChTdHJpbmcgaG9zdCwgaW50IHBvcnQpCisgICAgcHJpdmF0ZSBzdGF0aWMgTm9kZVByb2JlIGNvbm5lY3QoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBTZXR0aW5nc0pNWCBqbXgpCiAgICAgewogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBOb2RlUHJvYmUoaG9zdCwgcG9ydCk7CisgICAgICAgICAgICBpZiAoam14LnVzZXIgIT0gbnVsbCAmJiBqbXgucGFzc3dvcmQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5vZGVQcm9iZShob3N0LCBwb3J0LCBqbXgudXNlciwgam14LnBhc3N3b3JkKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5vZGVQcm9iZShob3N0LCBwb3J0KTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvdG9vbHMvc3RyZXNzL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3Mvc2V0dGluZ3MvU2V0dGluZ3NDcmVkZW50aWFsc1Rlc3QuamF2YSBiL3Rvb2xzL3N0cmVzcy90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3NldHRpbmdzL1NldHRpbmdzQ3JlZGVudGlhbHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFhMDdjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3N0cmVzcy90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3NldHRpbmdzL1NldHRpbmdzQ3JlZGVudGlhbHNUZXN0LmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZXNzLnNldHRpbmdzOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZS5Xcml0ZU1vZGUuT1ZFUldSSVRFOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3Muc2V0dGluZ3MuU2V0dGluZ3NDcmVkZW50aWFscy5DUUxfUEFTU1dPUkRfUFJPUEVSVFlfS0VZOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3Muc2V0dGluZ3MuU2V0dGluZ3NDcmVkZW50aWFscy5DUUxfVVNFUk5BTUVfUFJPUEVSVFlfS0VZOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3Muc2V0dGluZ3MuU2V0dGluZ3NDcmVkZW50aWFscy5KTVhfUEFTU1dPUkRfUFJPUEVSVFlfS0VZOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3Muc2V0dGluZ3MuU2V0dGluZ3NDcmVkZW50aWFscy5KTVhfVVNFUk5BTUVfUFJPUEVSVFlfS0VZOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3Muc2V0dGluZ3MuU2V0dGluZ3NDcmVkZW50aWFscy5UUkFOU1BPUlRfS0VZU1RPUkVfUEFTU1dPUkRfUFJPUEVSVFlfS0VZOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3Muc2V0dGluZ3MuU2V0dGluZ3NDcmVkZW50aWFscy5UUkFOU1BPUlRfVFJVU1RTVE9SRV9QQVNTV09SRF9QUk9QRVJUWV9LRVk7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgU2V0dGluZ3NDcmVkZW50aWFsc1Rlc3QKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQ3JlZGVudGlhbHNGcm9tRmlsZU1peGVkKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShDUUxfVVNFUk5BTUVfUFJPUEVSVFlfS0VZLCAiY3FsdXNlcmZyb21maWxlIik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoQ1FMX1BBU1NXT1JEX1BST1BFUlRZX0tFWSwgImNxbHBhc3N3b3JkZnJvbWZpbGUiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShKTVhfVVNFUk5BTUVfUFJPUEVSVFlfS0VZLCAiam14dXNlcmZyb21maWxlIik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoSk1YX1BBU1NXT1JEX1BST1BFUlRZX0tFWSwgImpteHBhc3N3b3JkZnJvbWZpbGUiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShUUkFOU1BPUlRfS0VZU1RPUkVfUEFTU1dPUkRfUFJPUEVSVFlfS0VZLCAia2V5c3RvcmVzdG9yZXBhc3N3b3JkZnJvbWZpbGUiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShUUkFOU1BPUlRfVFJVU1RTVE9SRV9QQVNTV09SRF9QUk9QRVJUWV9LRVksICJ0cnVzdHN0b3JlcGFzc3dvcmRmcm9tZmlsZSIpOworCisgICAgICAgIEZpbGUgdGVtcEZpbGUgPSBGaWxlVXRpbHMuY3JlYXRlVGVtcEZpbGUoImNhc3NhbmRyYS1zdHJlc3MtY3JlZGVudGlhbHMtdGVzdCIsICJwcm9wZXJ0aWVzIik7CisKKyAgICAgICAgdHJ5IChXcml0ZXIgdyA9IHRlbXBGaWxlLm5ld1dyaXRlcihPVkVSV1JJVEUpKQorICAgICAgICB7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLnN0b3JlKHcsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nW10+IGFyZ3MgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGFyZ3MucHV0KCJ3cml0ZSIsIG5ldyBTdHJpbmdbXXt9KTsKKyAgICAgICAgYXJncy5wdXQoIi1tb2RlIiwgbmV3IFN0cmluZ1tdeyAiY3FsMyIsICJuYXRpdmUiLCAicGFzc3dvcmQ9Y3FscGFzc3dvcmRvbmNvbW1hbmRsaW5lIiB9KTsKKyAgICAgICAgYXJncy5wdXQoIi10cmFuc3BvcnQiLCBuZXcgU3RyaW5nW117ICJ0cnVzdHN0b3JlPXNvbWV0cnVzdHN0b3JlIiwgImtleXN0b3JlPXNvbWVrZXlzdG9yZSIgfSk7CisgICAgICAgIGFyZ3MucHV0KCItam14IiwgbmV3IFN0cmluZ1tdeyAicGFzc3dvcmQ9am14cGFzc3dvcmRvbmNvbW1hbmRsaW5lIiB9KTsKKyAgICAgICAgYXJncy5wdXQoIi1jcmVkZW50aWFscy1maWxlIiwgbmV3IFN0cmluZ1tdeyB0ZW1wRmlsZS5hYnNvbHV0ZVBhdGgoKSB9KTsKKyAgICAgICAgU3RyZXNzU2V0dGluZ3Mgc2V0dGluZ3MgPSBTdHJlc3NTZXR0aW5ncy5nZXQoYXJncyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjcWx1c2VyZnJvbWZpbGUiLCBzZXR0aW5ncy5jcmVkZW50aWFscy5jcWxVc2VybmFtZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY3FscGFzc3dvcmRmcm9tZmlsZSIsIHNldHRpbmdzLmNyZWRlbnRpYWxzLmNxbFBhc3N3b3JkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqbXh1c2VyZnJvbWZpbGUiLCBzZXR0aW5ncy5jcmVkZW50aWFscy5qbXhVc2VybmFtZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiam14cGFzc3dvcmRmcm9tZmlsZSIsIHNldHRpbmdzLmNyZWRlbnRpYWxzLmpteFBhc3N3b3JkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJrZXlzdG9yZXN0b3JlcGFzc3dvcmRmcm9tZmlsZSIsIHNldHRpbmdzLmNyZWRlbnRpYWxzLnRyYW5zcG9ydEtleXN0b3JlUGFzc3dvcmQpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRydXN0c3RvcmVwYXNzd29yZGZyb21maWxlIiwgc2V0dGluZ3MuY3JlZGVudGlhbHMudHJhbnNwb3J0VHJ1c3RzdG9yZVBhc3N3b3JkKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNxbHVzZXJmcm9tZmlsZSIsIHNldHRpbmdzLm1vZGUudXNlcm5hbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNxbHBhc3N3b3Jkb25jb21tYW5kbGluZSIsIHNldHRpbmdzLm1vZGUucGFzc3dvcmQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImpteHVzZXJmcm9tZmlsZSIsIHNldHRpbmdzLmpteC51c2VyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqbXhwYXNzd29yZG9uY29tbWFuZGxpbmUiLCBzZXR0aW5ncy5qbXgucGFzc3dvcmQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImtleXN0b3Jlc3RvcmVwYXNzd29yZGZyb21maWxlIiwgc2V0dGluZ3MudHJhbnNwb3J0LmdldEVuY3J5cHRpb25PcHRpb25zKCkua2V5c3RvcmVfcGFzc3dvcmQpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRydXN0c3RvcmVwYXNzd29yZGZyb21maWxlIiwgc2V0dGluZ3MudHJhbnNwb3J0LmdldEVuY3J5cHRpb25PcHRpb25zKCkudHJ1c3RzdG9yZV9wYXNzd29yZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZENyZWRlbnRpYWxzRnJvbUZpbGVPdmVycmlkZW5CeUNvbW1hbmRMaW5lKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShDUUxfVVNFUk5BTUVfUFJPUEVSVFlfS0VZLCAiY3FsdXNlcmZyb21maWxlIik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoQ1FMX1BBU1NXT1JEX1BST1BFUlRZX0tFWSwgImNxbHBhc3N3b3JkZnJvbWZpbGUiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShKTVhfVVNFUk5BTUVfUFJPUEVSVFlfS0VZLCAiam14dXNlcmZyb21maWxlIik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoSk1YX1BBU1NXT1JEX1BST1BFUlRZX0tFWSwgImpteHBhc3N3b3JkZnJvbWZpbGUiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShUUkFOU1BPUlRfS0VZU1RPUkVfUEFTU1dPUkRfUFJPUEVSVFlfS0VZLCAia2V5c3RvcmVzdG9yZXBhc3N3b3JkZnJvbWZpbGUiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShUUkFOU1BPUlRfVFJVU1RTVE9SRV9QQVNTV09SRF9QUk9QRVJUWV9LRVksICJ0cnVzdHN0b3JlcGFzc3dvcmRmcm9tZmlsZSIpOworCisgICAgICAgIEZpbGUgdGVtcEZpbGUgPSBGaWxlVXRpbHMuY3JlYXRlVGVtcEZpbGUoImNhc3NhbmRyYS1zdHJlc3MtY3JlZGVudGlhbHMtdGVzdCIsICJwcm9wZXJ0aWVzIik7CisKKyAgICAgICAgdHJ5IChXcml0ZXIgdyA9IHRlbXBGaWxlLm5ld1dyaXRlcihPVkVSV1JJVEUpKQorICAgICAgICB7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLnN0b3JlKHcsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nW10+IGFyZ3MgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGFyZ3MucHV0KCJ3cml0ZSIsIG5ldyBTdHJpbmdbXXt9KTsKKyAgICAgICAgYXJncy5wdXQoIi1tb2RlIiwgbmV3IFN0cmluZ1tdeyAiY3FsMyIsICJuYXRpdmUiLCAicGFzc3dvcmQ9Y3FscGFzc3dvcmRvbmNvbW1hbmRsaW5lIiwgInVzZXI9Y3FsdXNlcm9uY29tbWFuZGxpbmUiIH0pOworICAgICAgICBhcmdzLnB1dCgiLWpteCIsIG5ldyBTdHJpbmdbXXsgInBhc3N3b3JkPWpteHBhc3N3b3Jkb25jb21tYW5kbGluZSIsICJ1c2VyPWpteHVzZXJvbmNvbW1hbmRsaW5lIiB9KTsKKyAgICAgICAgYXJncy5wdXQoIi10cmFuc3BvcnQiLCBuZXcgU3RyaW5nW117ICJ0cnVzdHN0b3JlPXNvbWV0cnVzdHN0b3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrZXlzdG9yZT1zb21la2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRydXN0c3RvcmUtcGFzc3dvcmQ9dHJ1c3RzdG9yZXBhc3N3b3JkZnJvbWNvbW1hbmRsaW5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrZXlzdG9yZS1wYXNzd29yZD1rZXlzdG9yZXBhc3N3b3JkZnJvbWNvbW1hbmRsaW5lIiB9KTsKKyAgICAgICAgYXJncy5wdXQoIi1jcmVkZW50aWFscy1maWxlIiwgbmV3IFN0cmluZ1tdeyB0ZW1wRmlsZS5hYnNvbHV0ZVBhdGgoKSB9KTsKKyAgICAgICAgU3RyZXNzU2V0dGluZ3Mgc2V0dGluZ3MgPSBTdHJlc3NTZXR0aW5ncy5nZXQoYXJncyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjcWx1c2VyZnJvbWZpbGUiLCBzZXR0aW5ncy5jcmVkZW50aWFscy5jcWxVc2VybmFtZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY3FscGFzc3dvcmRmcm9tZmlsZSIsIHNldHRpbmdzLmNyZWRlbnRpYWxzLmNxbFBhc3N3b3JkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqbXh1c2VyZnJvbWZpbGUiLCBzZXR0aW5ncy5jcmVkZW50aWFscy5qbXhVc2VybmFtZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiam14cGFzc3dvcmRmcm9tZmlsZSIsIHNldHRpbmdzLmNyZWRlbnRpYWxzLmpteFBhc3N3b3JkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJrZXlzdG9yZXN0b3JlcGFzc3dvcmRmcm9tZmlsZSIsIHNldHRpbmdzLmNyZWRlbnRpYWxzLnRyYW5zcG9ydEtleXN0b3JlUGFzc3dvcmQpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRydXN0c3RvcmVwYXNzd29yZGZyb21maWxlIiwgc2V0dGluZ3MuY3JlZGVudGlhbHMudHJhbnNwb3J0VHJ1c3RzdG9yZVBhc3N3b3JkKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNxbHVzZXJvbmNvbW1hbmRsaW5lIiwgc2V0dGluZ3MubW9kZS51c2VybmFtZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY3FscGFzc3dvcmRvbmNvbW1hbmRsaW5lIiwgc2V0dGluZ3MubW9kZS5wYXNzd29yZCk7CisgICAgICAgIGFzc2VydEVxdWFscygiam14dXNlcm9uY29tbWFuZGxpbmUiLCBzZXR0aW5ncy5qbXgudXNlcik7CisgICAgICAgIGFzc2VydEVxdWFscygiam14cGFzc3dvcmRvbmNvbW1hbmRsaW5lIiwgc2V0dGluZ3Muam14LnBhc3N3b3JkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVzdHN0b3JlcGFzc3dvcmRmcm9tY29tbWFuZGxpbmUiLCBzZXR0aW5ncy50cmFuc3BvcnQuZ2V0RW5jcnlwdGlvbk9wdGlvbnMoKS50cnVzdHN0b3JlX3Bhc3N3b3JkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJrZXlzdG9yZXBhc3N3b3JkZnJvbWNvbW1hbmRsaW5lIiwgc2V0dGluZ3MudHJhbnNwb3J0LmdldEVuY3J5cHRpb25PcHRpb25zKCkua2V5c3RvcmVfcGFzc3dvcmQpOworICAgIH0KK30K